summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex')
-rw-r--r--Master/texmf-dist/source/latex/aalok/aalok.dtx1560
-rw-r--r--Master/texmf-dist/source/latex/aalok/aalok.ins79
-rw-r--r--Master/texmf-dist/source/latex/achemso/achemso.dtx582
-rw-r--r--Master/texmf-dist/source/latex/achemso/achemso.ins167
-rw-r--r--Master/texmf-dist/source/latex/acmart/Makefile8
-rw-r--r--Master/texmf-dist/source/latex/acmart/acmart.dtx405
-rw-r--r--Master/texmf-dist/source/latex/acronym/acronym.dtx73
-rw-r--r--Master/texmf-dist/source/latex/adjustbox/adjustbox.dtx89
-rw-r--r--Master/texmf-dist/source/latex/adjustbox/trimclip.dtx32
-rw-r--r--Master/texmf-dist/source/latex/akshar/HackNF_B.ttfbin0 -> 1789212 bytes
-rw-r--r--Master/texmf-dist/source/latex/akshar/HackNF_BI.ttfbin0 -> 1792180 bytes
-rw-r--r--Master/texmf-dist/source/latex/akshar/HackNF_I.ttfbin0 -> 1748544 bytes
-rw-r--r--Master/texmf-dist/source/latex/akshar/HackNF_R.ttfbin0 -> 1741792 bytes
-rw-r--r--Master/texmf-dist/source/latex/akshar/akshar.dtx821
-rw-r--r--Master/texmf-dist/source/latex/akshar/akshar.ins47
-rw-r--r--Master/texmf-dist/source/latex/akshar/siddhanta.ttfbin0 -> 1168564 bytes
-rw-r--r--Master/texmf-dist/source/latex/algxpar/algxpar.dtx168
-rw-r--r--Master/texmf-dist/source/latex/algxpar/algxpar.ins6
-rw-r--r--Master/texmf-dist/source/latex/amscls/amsclass.dtx35
-rw-r--r--Master/texmf-dist/source/latex/amscls/amsclass.ins9
-rw-r--r--Master/texmf-dist/source/latex/amscls/amsclass.pdfbin0 -> 340632 bytes
-rw-r--r--Master/texmf-dist/source/latex/amsmath/amsmath.dtx201
-rw-r--r--Master/texmf-dist/source/latex/amsmath/amstext.dtx2
-rw-r--r--Master/texmf-dist/source/latex/animate/animate.tex110
-rw-r--r--Master/texmf-dist/source/latex/annee-scolaire/annee-scolaire.dtx658
-rw-r--r--Master/texmf-dist/source/latex/annee-scolaire/annee-scolaire.ins34
-rw-r--r--Master/texmf-dist/source/latex/antanilipsum/antanilipsum.dtx2693
-rw-r--r--Master/texmf-dist/source/latex/aomart/Makefile69
-rw-r--r--Master/texmf-dist/source/latex/aomart/aomart.dtx83
-rw-r--r--Master/texmf-dist/source/latex/apa7/apa7.dtx796
-rw-r--r--Master/texmf-dist/source/latex/apa7/apa7.ins3
-rw-r--r--Master/texmf-dist/source/latex/apxproof/apxproof.dtx48
-rw-r--r--Master/texmf-dist/source/latex/archaeologie/archaeologie.dtx11422
-rw-r--r--Master/texmf-dist/source/latex/archaeologie/archaeologie.ins80
-rw-r--r--Master/texmf-dist/source/latex/arraycols/arraycols.dtx84
-rw-r--r--Master/texmf-dist/source/latex/arraycols/arraycols.ins4
-rw-r--r--Master/texmf-dist/source/latex/askinclude/askinclude.dtx100
-rw-r--r--Master/texmf-dist/source/latex/atenddvi/atenddvi.dtx72
-rw-r--r--Master/texmf-dist/source/latex/auto-pst-pdf/auto-pst-pdf.dtx139
-rw-r--r--Master/texmf-dist/source/latex/auto-pst-pdf/auto-pst-pdf.ins37
-rw-r--r--Master/texmf-dist/source/latex/babel/babel.dtx8194
-rw-r--r--Master/texmf-dist/source/latex/babel/babel.ins6
-rw-r--r--Master/texmf-dist/source/latex/babel/bbcompat.dtx2
-rw-r--r--Master/texmf-dist/source/latex/babel/locale.zipbin761543 -> 778055 bytes
-rw-r--r--Master/texmf-dist/source/latex/base/classes.dtx135
-rw-r--r--Master/texmf-dist/source/latex/base/doc.dtx19
-rw-r--r--Master/texmf-dist/source/latex/base/docstrip.dtx199
-rw-r--r--Master/texmf-dist/source/latex/base/fontdef.dtx34
-rw-r--r--Master/texmf-dist/source/latex/base/format.ins22
-rw-r--r--Master/texmf-dist/source/latex/base/inputenc.dtx14
-rw-r--r--Master/texmf-dist/source/latex/base/latex209.dtx8
-rw-r--r--Master/texmf-dist/source/latex/base/latexrelease.ins50
-rw-r--r--Master/texmf-dist/source/latex/base/letter.dtx100
-rw-r--r--Master/texmf-dist/source/latex/base/ltboxes.dtx47
-rw-r--r--Master/texmf-dist/source/latex/base/ltclass.dtx1007
-rw-r--r--Master/texmf-dist/source/latex/base/ltdefns.dtx833
-rw-r--r--Master/texmf-dist/source/latex/base/ltdirchk.dtx6
-rw-r--r--Master/texmf-dist/source/latex/base/ltexpl.dtx342
-rw-r--r--Master/texmf-dist/source/latex/base/ltfilehook.dtx1671
-rw-r--r--Master/texmf-dist/source/latex/base/ltfiles.dtx531
-rw-r--r--Master/texmf-dist/source/latex/base/ltfinal.dtx39
-rw-r--r--Master/texmf-dist/source/latex/base/ltfloat.dtx66
-rw-r--r--Master/texmf-dist/source/latex/base/ltfssaxes.dtx61
-rw-r--r--Master/texmf-dist/source/latex/base/ltfssbas.dtx27
-rw-r--r--Master/texmf-dist/source/latex/base/ltfssdcl.dtx65
-rw-r--r--Master/texmf-dist/source/latex/base/ltfssini.dtx1020
-rw-r--r--Master/texmf-dist/source/latex/base/ltfsstrc.dtx6
-rw-r--r--Master/texmf-dist/source/latex/base/lthooks.dtx4520
-rw-r--r--Master/texmf-dist/source/latex/base/ltlists.dtx8
-rw-r--r--Master/texmf-dist/source/latex/base/ltluatex.dtx68
-rw-r--r--Master/texmf-dist/source/latex/base/ltmath.dtx159
-rw-r--r--Master/texmf-dist/source/latex/base/ltmiscen.dtx498
-rw-r--r--Master/texmf-dist/source/latex/base/ltoutenc.dtx92
-rw-r--r--Master/texmf-dist/source/latex/base/ltoutput.dtx15
-rw-r--r--Master/texmf-dist/source/latex/base/ltpage.dtx8
-rw-r--r--Master/texmf-dist/source/latex/base/ltpictur.dtx624
-rw-r--r--Master/texmf-dist/source/latex/base/ltplain.dtx32
-rw-r--r--Master/texmf-dist/source/latex/base/ltsect.dtx29
-rw-r--r--Master/texmf-dist/source/latex/base/ltshipout.dtx1751
-rw-r--r--Master/texmf-dist/source/latex/base/ltspace.dtx200
-rw-r--r--Master/texmf-dist/source/latex/base/lttab.dtx45
-rw-r--r--Master/texmf-dist/source/latex/base/lttextcomp.dtx37
-rw-r--r--Master/texmf-dist/source/latex/base/ltvers.dtx14
-rw-r--r--Master/texmf-dist/source/latex/base/ltxdoc.dtx21
-rw-r--r--Master/texmf-dist/source/latex/base/ltxref.dtx21
-rw-r--r--Master/texmf-dist/source/latex/base/slides.dtx8
-rw-r--r--Master/texmf-dist/source/latex/base/unpack.ins1
-rw-r--r--Master/texmf-dist/source/latex/beamerappendixnote/beamerappendixnote.dtx266
-rw-r--r--Master/texmf-dist/source/latex/beamerappendixnote/beamerappendixnote.ins39
-rw-r--r--Master/texmf-dist/source/latex/beamerswitch/beamerswitch.dtx164
-rw-r--r--Master/texmf-dist/source/latex/beamerswitch/beamerswitch.ins46
-rw-r--r--Master/texmf-dist/source/latex/bearwear/bearwear.dtx81
-rw-r--r--Master/texmf-dist/source/latex/beilstein/beilstein.dtx14
-rw-r--r--Master/texmf-dist/source/latex/beilstein/beilstein.ins2
-rw-r--r--Master/texmf-dist/source/latex/bewerbung/bewerbung.dtx81
-rw-r--r--Master/texmf-dist/source/latex/bewerbung/bewerbung.ins4
-rw-r--r--Master/texmf-dist/source/latex/biblatex-oxref/Makefile8
-rw-r--r--Master/texmf-dist/source/latex/biblatex-oxref/oxref.dtx592
-rw-r--r--Master/texmf-dist/source/latex/biblatex-oxref/oxref.ins4
-rw-r--r--Master/texmf-dist/source/latex/biblatex-philosophy/biblatex-philosophy.bib862
-rw-r--r--Master/texmf-dist/source/latex/biblatex-philosophy/biblatex-philosophy.dtx2184
-rw-r--r--Master/texmf-dist/source/latex/biblatex-software/Makefile64
-rw-r--r--Master/texmf-dist/source/latex/bibleref/bibleref.dtx43
-rw-r--r--Master/texmf-dist/source/latex/bithesis/bithesis.dtx807
-rw-r--r--Master/texmf-dist/source/latex/bithesis/bithesis.ins72
-rw-r--r--Master/texmf-dist/source/latex/bookcover/bookcover.dtx2298
-rw-r--r--Master/texmf-dist/source/latex/bookcover/bookcover.ins4
-rw-r--r--Master/texmf-dist/source/latex/bookmark/bookmark-frozen.dtx1073
-rw-r--r--Master/texmf-dist/source/latex/bookmark/bookmark.dtx250
-rw-r--r--Master/texmf-dist/source/latex/bookshelf/bookshelf.dtx2524
-rw-r--r--Master/texmf-dist/source/latex/bookshelf/bookshelf.ins62
-rw-r--r--Master/texmf-dist/source/latex/boxedminipage/boxedminipage.dtx (renamed from Master/texmf-dist/source/latex/boxedminipage2e/boxedminipage2e.dtx)146
-rw-r--r--Master/texmf-dist/source/latex/boxedminipage/boxedminipage.ins (renamed from Master/texmf-dist/source/latex/boxedminipage2e/boxedminipage2e.ins)15
-rw-r--r--Master/texmf-dist/source/latex/brandeis-dissertation/brandeis-dissertation.dtx101
-rw-r--r--Master/texmf-dist/source/latex/brandeis-thesis/brandeis-thesis.dtx36
-rw-r--r--Master/texmf-dist/source/latex/breqn/breqn.dtx47
-rw-r--r--Master/texmf-dist/source/latex/breqn/breqnbundle.ins3
-rw-r--r--Master/texmf-dist/source/latex/breqn/flexisym.dtx53
-rw-r--r--Master/texmf-dist/source/latex/breqn/mathstyle.dtx114
-rw-r--r--Master/texmf-dist/source/latex/bubblesort/bubblesort.dtx448
-rw-r--r--Master/texmf-dist/source/latex/bubblesort/bubblesort.ins39
-rw-r--r--Master/texmf-dist/source/latex/bxjscls/bxjscls.dtx979
-rw-r--r--Master/texmf-dist/source/latex/bxjscls/bxjscls.ins8
-rw-r--r--Master/texmf-dist/source/latex/bytefield/bytefield.dtx961
-rw-r--r--Master/texmf-dist/source/latex/bytefield/bytefield.ins4
-rw-r--r--Master/texmf-dist/source/latex/canoniclayout/canoniclayout.dtx730
-rw-r--r--Master/texmf-dist/source/latex/caption/bicaption.dtx163
-rw-r--r--Master/texmf-dist/source/latex/caption/caption-ams-smf.dtx254
-rw-r--r--Master/texmf-dist/source/latex/caption/caption-beamer.dtx382
-rw-r--r--Master/texmf-dist/source/latex/caption/caption-deu.tex66
-rw-r--r--Master/texmf-dist/source/latex/caption/caption-elsarticle.dtx208
-rw-r--r--Master/texmf-dist/source/latex/caption/caption-eng.tex336
-rw-r--r--Master/texmf-dist/source/latex/caption/caption-koma.dtx519
-rw-r--r--Master/texmf-dist/source/latex/caption/caption-light.dtx394
-rw-r--r--Master/texmf-dist/source/latex/caption/caption-memoir.dtx317
-rw-r--r--Master/texmf-dist/source/latex/caption/caption-ntg.dtx213
-rw-r--r--Master/texmf-dist/source/latex/caption/caption-thesis.dtx219
-rw-r--r--Master/texmf-dist/source/latex/caption/caption.dtx1387
-rw-r--r--Master/texmf-dist/source/latex/caption/caption.ins27
-rw-r--r--Master/texmf-dist/source/latex/caption/caption2.dtx73
-rw-r--r--Master/texmf-dist/source/latex/caption/caption3.dtx3574
-rw-r--r--Master/texmf-dist/source/latex/caption/ltcaption.dtx29
-rw-r--r--Master/texmf-dist/source/latex/caption/subcaption.dtx206
-rw-r--r--Master/texmf-dist/source/latex/cascade/cascade.dtx506
-rw-r--r--Master/texmf-dist/source/latex/ccfonts/ccfonts.dtx43
-rw-r--r--Master/texmf-dist/source/latex/ccool/ccool.dtx2438
-rw-r--r--Master/texmf-dist/source/latex/cellprops/cellprops.dtx881
-rw-r--r--Master/texmf-dist/source/latex/cellprops/cellprops.ins2
-rw-r--r--Master/texmf-dist/source/latex/centerlastline/centerlastline.dtx114
-rw-r--r--Master/texmf-dist/source/latex/centerlastline/centerlastline.ins27
-rw-r--r--Master/texmf-dist/source/latex/changes/changes.drv29
-rw-r--r--Master/texmf-dist/source/latex/changes/changes.dtx1233
-rw-r--r--Master/texmf-dist/source/latex/changes/changes.ins195
-rw-r--r--Master/texmf-dist/source/latex/changes/example-screenshot.dtx2
-rw-r--r--Master/texmf-dist/source/latex/changes/examples.dtx24
-rw-r--r--Master/texmf-dist/source/latex/chessboard/chessboard.dtx58
-rw-r--r--Master/texmf-dist/source/latex/chhaya/chhaya.dtx224
-rw-r--r--Master/texmf-dist/source/latex/chhaya/chhaya.ins56
-rw-r--r--Master/texmf-dist/source/latex/clefval/Makefile190
-rw-r--r--Master/texmf-dist/source/latex/clefval/clefval.dtx277
-rw-r--r--Master/texmf-dist/source/latex/clefval/clefval.ins21
-rw-r--r--Master/texmf-dist/source/latex/clefval/fra-clefval.ins58
-rw-r--r--Master/texmf-dist/source/latex/color-edits/color-edits.dtx333
-rw-r--r--Master/texmf-dist/source/latex/color-edits/color-edits.ins53
-rw-r--r--Master/texmf-dist/source/latex/cquthesis/cquthesis.dtx23
-rw-r--r--Master/texmf-dist/source/latex/crop/Makefile71
-rw-r--r--Master/texmf-dist/source/latex/crop/crop.dtx114
-rw-r--r--Master/texmf-dist/source/latex/crop/crop.ins2
-rw-r--r--Master/texmf-dist/source/latex/crossword/cwpuzzle.dtx63
-rw-r--r--Master/texmf-dist/source/latex/crossword/cwpuzzle.ins6
-rw-r--r--Master/texmf-dist/source/latex/cryptocode/cryptocode.dtx9392
-rw-r--r--Master/texmf-dist/source/latex/cryptocode/cryptocode.ins32
-rw-r--r--Master/texmf-dist/source/latex/ctex/ctex-zhconv-make.lua114
-rw-r--r--Master/texmf-dist/source/latex/ctex/ctex.dtx7445
-rw-r--r--Master/texmf-dist/source/latex/ctex/ctex.ins299
-rw-r--r--Master/texmf-dist/source/latex/ctex/ctexpunct.spa20
-rw-r--r--Master/texmf-dist/source/latex/currfile/currfile.dtx23
-rw-r--r--Master/texmf-dist/source/latex/curve2e/curve2e.dtx382
-rw-r--r--Master/texmf-dist/source/latex/datax/datax.dtx220
-rw-r--r--Master/texmf-dist/source/latex/datax/datax.ins54
-rw-r--r--Master/texmf-dist/source/latex/datetime2-french/datetime2-french.dtx15
-rw-r--r--Master/texmf-dist/source/latex/datetime2-french/datetime2-french.ins4
-rw-r--r--Master/texmf-dist/source/latex/datetime2-romanian/datetime2-romanian.dtx15
-rw-r--r--Master/texmf-dist/source/latex/datetime2-romanian/datetime2-romanian.ins4
-rw-r--r--Master/texmf-dist/source/latex/dccpaper/dccpaper.dtx28
-rw-r--r--Master/texmf-dist/source/latex/dccpaper/dccpaper.ins49
-rw-r--r--Master/texmf-dist/source/latex/decision-table/decision-table.dtx474
-rw-r--r--Master/texmf-dist/source/latex/decision-table/decision-table.ins47
-rw-r--r--Master/texmf-dist/source/latex/decorule/decorule.dtx1194
-rw-r--r--Master/texmf-dist/source/latex/decorule/decorule.ins34
-rw-r--r--Master/texmf-dist/source/latex/denisbdoc/denisbdoc.dtx461
-rw-r--r--Master/texmf-dist/source/latex/denisbdoc/denisbdoc.ins41
-rw-r--r--Master/texmf-dist/source/latex/doclicense/doclicense.dtx358
-rw-r--r--Master/texmf-dist/source/latex/draftwatermark/draftwatermark.dtx674
-rw-r--r--Master/texmf-dist/source/latex/draftwatermark/draftwatermark.ins66
-rw-r--r--Master/texmf-dist/source/latex/ducksay/ducksay.dtx44
-rw-r--r--Master/texmf-dist/source/latex/easyfloats/easyfloats.dtx1897
-rw-r--r--Master/texmf-dist/source/latex/easyfloats/easyfloats.ins82
-rw-r--r--Master/texmf-dist/source/latex/ebproof/ebproof.dtx1644
-rw-r--r--Master/texmf-dist/source/latex/ebproof/ebproof.ins15
-rw-r--r--Master/texmf-dist/source/latex/ejpecp/ejpecp.dtx70
-rw-r--r--Master/texmf-dist/source/latex/ejpecp/ejpecp.ins8
-rw-r--r--Master/texmf-dist/source/latex/ellipsis/ellipsis.dtx462
-rw-r--r--Master/texmf-dist/source/latex/elsarticle/elsarticle.dtx344
-rw-r--r--Master/texmf-dist/source/latex/elsarticle/elsarticle.ins6
-rw-r--r--Master/texmf-dist/source/latex/embedfile/embedfile.dtx40
-rw-r--r--Master/texmf-dist/source/latex/emisa/emisa.dtx97
-rw-r--r--Master/texmf-dist/source/latex/emisa/emisa.ins9
-rw-r--r--Master/texmf-dist/source/latex/endnotes-hy/endnotes-hy.dtx249
-rw-r--r--Master/texmf-dist/source/latex/endnotes-hy/endnotes-hy.ins60
-rw-r--r--Master/texmf-dist/source/latex/eq-pin2corr/eq-pin2corr.dtx281
-rw-r--r--Master/texmf-dist/source/latex/eq-pin2corr/eq-pin2corr.ins60
-rw-r--r--Master/texmf-dist/source/latex/erw-l3/erw-l3.dtx2633
-rw-r--r--Master/texmf-dist/source/latex/erw-l3/erw-l3.ins68
-rw-r--r--Master/texmf-dist/source/latex/eso-pic/eso-pic.dtx188
-rw-r--r--Master/texmf-dist/source/latex/etoc/etoc.dtx56
-rw-r--r--Master/texmf-dist/source/latex/euclideangeometry/euclideangeometry.dtx290
-rw-r--r--Master/texmf-dist/source/latex/euflag/euflag.dtx597
-rw-r--r--Master/texmf-dist/source/latex/euflag/euflag.ins4
-rw-r--r--Master/texmf-dist/source/latex/everypage/everypage.dtx466
-rw-r--r--Master/texmf-dist/source/latex/everypage/everypage.ins62
-rw-r--r--Master/texmf-dist/source/latex/everysel/everysel.dtx (renamed from Master/texmf-dist/source/latex/ms/everysel.dtx)171
-rw-r--r--Master/texmf-dist/source/latex/everysel/everysel.ins49
-rw-r--r--Master/texmf-dist/source/latex/everyshi/everyshi.dtx (renamed from Master/texmf-dist/source/latex/ms/everyshi.dtx)195
-rw-r--r--Master/texmf-dist/source/latex/everyshi/everyshi.ins49
-rw-r--r--Master/texmf-dist/source/latex/exercises/exercises.dtx68
-rw-r--r--Master/texmf-dist/source/latex/exercises/exercises.ins4
-rw-r--r--Master/texmf-dist/source/latex/exesheet/exesheet.dtx1489
-rw-r--r--Master/texmf-dist/source/latex/exesheet/exesheet.ins56
-rw-r--r--Master/texmf-dist/source/latex/expkv-cs/expkv-cs.dtx1792
-rw-r--r--Master/texmf-dist/source/latex/expkv-def/expkv-def.dtx1191
-rw-r--r--Master/texmf-dist/source/latex/expkv/expkv.dtx1383
-rw-r--r--Master/texmf-dist/source/latex/factura/factura.dtx1014
-rw-r--r--Master/texmf-dist/source/latex/factura/factura.ins155
-rw-r--r--Master/texmf-dist/source/latex/fancyhdr/fancyhdr.dtx2580
-rw-r--r--Master/texmf-dist/source/latex/fancyhdr/fancyhdr.ins2
-rw-r--r--Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx438
-rw-r--r--Master/texmf-dist/source/latex/fcolumn/fcolumn.ins8
-rw-r--r--Master/texmf-dist/source/latex/fduthesis/fduthesis-doc.dtx16
-rw-r--r--Master/texmf-dist/source/latex/fduthesis/fduthesis-logo.dtx2
-rw-r--r--Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx334
-rw-r--r--Master/texmf-dist/source/latex/fduthesis/fduthesis.ins4
-rw-r--r--Master/texmf-dist/source/latex/fei/fei.dtx34
-rw-r--r--Master/texmf-dist/source/latex/fei/fei.ins71
-rw-r--r--Master/texmf-dist/source/latex/fgruler/fgruler.dtx929
-rw-r--r--Master/texmf-dist/source/latex/fgruler/fgruler.ins4
-rw-r--r--Master/texmf-dist/source/latex/filehook/filehook.dtx726
-rw-r--r--Master/texmf-dist/source/latex/filehook/filehook.ins2
-rw-r--r--Master/texmf-dist/source/latex/firstaid/firstaid.ins75
-rw-r--r--Master/texmf-dist/source/latex/firstaid/latex2e-first-aid-for-external-files.dtx411
-rw-r--r--Master/texmf-dist/source/latex/flippdf/flippdf.dtx372
-rw-r--r--Master/texmf-dist/source/latex/flippdf/flippdf.ins69
-rw-r--r--Master/texmf-dist/source/latex/fontaxes/fontaxes.dtx19
-rw-r--r--Master/texmf-dist/source/latex/fontaxes/fontaxes.ins4
-rw-r--r--Master/texmf-dist/source/latex/fontsize/fontsize.dtx1637
-rw-r--r--Master/texmf-dist/source/latex/footnotehyper/footnotehyper.dtx434
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/apparence-diapos.tex59
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/apparence.tex2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/bases-diapos.tex53
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/bases.tex4
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/bibliographie.tex12
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/boites.tex2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/colophon-diapos.tex2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/colophon.tex2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/commandes.tex4
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/couverture-arriere-diapos.tex2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/couverture-arriere.tex2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/couverture-avant-diapos.tex4
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/couverture-avant.tex4
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul-diapos.tex45
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul.bib2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul.tex27
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/images/Meerkat_stare-diapos.jpgbin452385 -> 0 bytes
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/images/Meerkat_stare.jpgbin548678 -> 0 bytes
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/images/Suricates_Namibia-2-diapos.jpegbin0 -> 719882 bytes
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/images/Suricates_Namibia-2.jpegbin0 -> 361456 bytes
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/images/formation-latex-ul.pngbin778458 -> 774685 bytes
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/introduction.tex4
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/mathematiques-diapos.tex19
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/mathematiques.tex2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/notices-diapos.tex20
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/notices.tex19
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/organisation-diapos.tex22
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/organisation.tex2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/prerequis-diapos.tex22
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/presentation-diapos.tex121
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/presentation.tex10
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/solutions.tex2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/suite-diapos.tex2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/sweave-diapos.tex63
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/tableaux+figures.tex2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/tableaux-diapos.tex2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/trucs+astuces.tex2
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/ulthese-diapos.tex57
-rw-r--r--Master/texmf-dist/source/latex/formation-latex-ul/ulthese.tex2
-rw-r--r--Master/texmf-dist/source/latex/frenchmath/frenchmath.dtx102
-rw-r--r--Master/texmf-dist/source/latex/frenchmath/frenchmath.ins4
-rw-r--r--Master/texmf-dist/source/latex/froufrou/froufrou.dtx316
-rw-r--r--Master/texmf-dist/source/latex/froufrou/froufrou.ins50
-rw-r--r--Master/texmf-dist/source/latex/gentombow/Makefile36
-rw-r--r--Master/texmf-dist/source/latex/glossaries-extra/glossaries-extra.dtx57
-rw-r--r--Master/texmf-dist/source/latex/glossaries-extra/glossaries-extra.ins2
-rw-r--r--Master/texmf-dist/source/latex/glossaries-nynorsk/glossaries-nynorsk.dtx162
-rw-r--r--Master/texmf-dist/source/latex/glossaries-nynorsk/glossaries-nynorsk.ins36
-rw-r--r--Master/texmf-dist/source/latex/gnuplottex/gnuplottex.dtx87
-rw-r--r--Master/texmf-dist/source/latex/grant/grant.dtx312
-rw-r--r--Master/texmf-dist/source/latex/grant/grant.ins22
-rw-r--r--Master/texmf-dist/source/latex/graphics/color.dtx6
-rw-r--r--Master/texmf-dist/source/latex/graphics/graphics.dtx122
-rw-r--r--Master/texmf-dist/source/latex/graphics/graphicx.dtx62
-rw-r--r--Master/texmf-dist/source/latex/graphics/lscape.dtx7
-rw-r--r--Master/texmf-dist/source/latex/graphicx-psmin/graphicx-psmin.dtx23
-rw-r--r--Master/texmf-dist/source/latex/graphpaper/graphpaper.dtx1048
-rw-r--r--Master/texmf-dist/source/latex/greek-fontenc/Makefile75
-rw-r--r--Master/texmf-dist/source/latex/guitlogo/guit.dtx16
-rw-r--r--Master/texmf-dist/source/latex/guitlogo/guit.ins6
-rw-r--r--Master/texmf-dist/source/latex/gzt/gzt.dtx504
-rw-r--r--Master/texmf-dist/source/latex/hausarbeit-jura/hausarbeit-jura.dtx36
-rw-r--r--Master/texmf-dist/source/latex/hausarbeit-jura/hausarbeit-jura.ins2
-rw-r--r--Master/texmf-dist/source/latex/hecthese/hecthese-en.ins6
-rw-r--r--Master/texmf-dist/source/latex/hecthese/hecthese-fr.ins4
-rw-r--r--Master/texmf-dist/source/latex/hecthese/hecthese.dtx1225
-rw-r--r--Master/texmf-dist/source/latex/hep-paper/hep-paper-implementation.dtx2911
-rw-r--r--Master/texmf-dist/source/latex/hep-paper/hep-paper.dtx1746
-rw-r--r--Master/texmf-dist/source/latex/hep-paper/hep-paper.ins8
-rw-r--r--Master/texmf-dist/source/latex/hitszthesis/Makefile4
-rwxr-xr-xMaster/texmf-dist/source/latex/hitszthesis/compile.bat16
-rw-r--r--Master/texmf-dist/source/latex/hitszthesis/hitszthesis.dtx301
-rw-r--r--Master/texmf-dist/source/latex/hitszthesis/hitszthesis.ins26
-rw-r--r--Master/texmf-dist/source/latex/hopatch/hopatch.dtx (renamed from Master/texmf-dist/source/latex/oberdiek/hopatch.dtx)122
-rw-r--r--Master/texmf-dist/source/latex/horoscop/horoscop.dtx514
-rw-r--r--Master/texmf-dist/source/latex/hu-berlin-bundle/hu-berlin-bundle.dtx1990
-rw-r--r--Master/texmf-dist/source/latex/hu-berlin-bundle/hu-berlin-bundle.ins79
-rw-r--r--Master/texmf-dist/source/latex/hulipsum/hulipsum.dtx87
-rw-r--r--Master/texmf-dist/source/latex/hulipsum/hulipsum.ins4
-rw-r--r--Master/texmf-dist/source/latex/hyperref/backref.dtx7
-rw-r--r--Master/texmf-dist/source/latex/hyperref/bmhydoc.sty6
-rw-r--r--Master/texmf-dist/source/latex/hyperref/doc/fdl.tex422
-rw-r--r--Master/texmf-dist/source/latex/hyperref/doc/hyperref-doc.tex (renamed from Master/texmf-dist/source/latex/hyperref/doc/manual.tex)568
-rw-r--r--Master/texmf-dist/source/latex/hyperref/hluatex.dtx62
-rw-r--r--Master/texmf-dist/source/latex/hyperref/hyperref.dtx763
-rw-r--r--Master/texmf-dist/source/latex/hyperref/hyperref.ins9
-rw-r--r--Master/texmf-dist/source/latex/hyperref/nameref.dtx9
-rw-r--r--Master/texmf-dist/source/latex/hyperxmp/einstein-xmp.tex150
-rw-r--r--Master/texmf-dist/source/latex/hyperxmp/hyperxmp-stds.tex96
-rw-r--r--Master/texmf-dist/source/latex/hyperxmp/hyperxmp.dtx2256
-rw-r--r--Master/texmf-dist/source/latex/hyperxmp/hyperxmp.ins4
-rw-r--r--Master/texmf-dist/source/latex/intopdf/intopdf.dtx94
-rw-r--r--Master/texmf-dist/source/latex/isodoc/Makefile71
-rw-r--r--Master/texmf-dist/source/latex/isodoc/isodoc.dtx32119
-rw-r--r--Master/texmf-dist/source/latex/isodoc/isodoc.ins31
-rw-r--r--Master/texmf-dist/source/latex/jlreq/Makefile87
-rw-r--r--Master/texmf-dist/source/latex/jlreq/make_variant_jfm.lua33
-rw-r--r--Master/texmf-dist/source/latex/jmlr/jmlr.dtx50
-rw-r--r--Master/texmf-dist/source/latex/jmlr/jmlr.ins2
-rw-r--r--Master/texmf-dist/source/latex/keyvaltable/keyvaltable.dtx1074
-rw-r--r--Master/texmf-dist/source/latex/knowledge/knowledge-code.dtx83
-rw-r--r--Master/texmf-dist/source/latex/koma-script/Makefile24
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/Makefile20
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/english/common-parmarkup.tex66
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/english/scrbase.tex8
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/english/scrbookreportarticle.tex45
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/english/scrlfile.tex274
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/english/tocbasic.tex52
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/english/typearea.tex8
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/ngerman/common-parmarkup.tex10
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/ngerman/scrbase.tex8
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/ngerman/scrlfile.tex327
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/ngerman/tocbasic.tex56
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/scrguide.cls34
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/scrguide.html738
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/scrguide.pdfbin3260708 -> 3262021 bytes
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/scrguien.html1825
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/scrguien.pdfbin3175474 -> 3180171 bytes
-rw-r--r--Master/texmf-dist/source/latex/koma-script/doc/scrpage2.tex2963
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrextend.dtx16
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrhack.dtx33
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx125
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrkernel-compatibility.dtx24
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrkernel-language.dtx66
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrkernel-letterclassoptions.dtx16
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrkernel-listsof.dtx24
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrkernel-miscellaneous.dtx21
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrkernel-notepaper.dtx31
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrkernel-sections.dtx197
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrkernel-tocstyle.dtx224
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrkernel-typearea.dtx146
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrkernel-version.dtx4
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrlayer-notecolumn.dtx1723
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrlayer-scrpage.dtx2365
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrlayer.dtx70
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrlfile-hook.dtx634
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrlfile-patcholdlatex.dtx1269
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrlfile.dtx1326
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrlogo.dtx58
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrmain.ins13
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrpage.dtx2261
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrwfile.dtx9
-rw-r--r--Master/texmf-dist/source/latex/koma-script/tocbasic.dtx63
-rw-r--r--Master/texmf-dist/source/latex/koma-script/tocstyle.dtx2309
-rw-r--r--Master/texmf-dist/source/latex/komacv/komacv.dtx303
-rw-r--r--Master/texmf-dist/source/latex/komacv/komacv.ins4
-rw-r--r--Master/texmf-dist/source/latex/kvmap/kvmap.dtx36
-rw-r--r--Master/texmf-dist/source/latex/kvoptions/kvoptions.dtx308
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx274
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx33
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx1230
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx406
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx66
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx26
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx286
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx717
-rw-r--r--Master/texmf-dist/source/latex/l3backend/l3backend.ins50
-rw-r--r--Master/texmf-dist/source/latex/l3build/l3build.dtx5
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx43
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.ins4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx591
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.ins (renamed from Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.ins)10
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx556
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx904
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins58
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx12
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx26
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx12
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx26
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx61
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx14
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx66
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx33
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.ins4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.ins60
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx60
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3str/l3str.ins4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx49
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.ins4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx11
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.ins4
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx59
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx17
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.ins4
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/expl3.dtx360
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3.ins27
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx195
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3basics.dtx95
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx195
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3box.dtx40
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx301
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx882
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3clist.dtx209
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx106
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx192
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3color.dtx2655
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3debug.dtx89
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx465
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3doc.dtx57
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3expan.dtx135
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3file.dtx739
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3final.dtx389
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3flag.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3format.ins163
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx14
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx77
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx14
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx14
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx36
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx79
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fp.dtx24
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx10
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3int.dtx93
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx74
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx211
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3keys.dtx873
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx6
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx348
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3msg.dtx301
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3names.dtx853
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx (renamed from Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx)215
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prg.dtx59
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3prop.dtx128
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3quark.dtx409
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3regex.dtx1316
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3seq.dtx229
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3skip.dtx56
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3sort.dtx109
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx625
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3str.dtx209
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3sys.dtx199
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx804
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx170
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3text.dtx195
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx454
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3tl.dtx1073
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3token.dtx633
-rw-r--r--Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx29
-rw-r--r--Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx12
-rw-r--r--Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.ins4
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xfp/xfp.ins4
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx8
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.ins4
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx3978
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xparse/xparse.ins8
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx60
-rw-r--r--Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.ins4
-rw-r--r--Master/texmf-dist/source/latex/langsci-affiliations/langsci-affiliations.dtx492
-rw-r--r--Master/texmf-dist/source/latex/langsci-avm/langsci-avm.dtx518
-rw-r--r--Master/texmf-dist/source/latex/langsci-avm/langsci-avm.ins20
-rw-r--r--Master/texmf-dist/source/latex/latexbug/latexbug.dtx32
-rw-r--r--Master/texmf-dist/source/latex/latexgit/latexgit.dtx23
-rw-r--r--Master/texmf-dist/source/latex/latexgit/latexgit.ins4
-rw-r--r--Master/texmf-dist/source/latex/leaflet/leaflet.dtx400
-rw-r--r--Master/texmf-dist/source/latex/leaflet/leaflet.ins16
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/fonts/README-emmentaler8
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/fonts/emmentaler-2-18-0.zipbin0 -> 144917 bytes
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/_template.ly54
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/beamednotes.ly111
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/dynamicsigns.ly62
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/fancyexamples.ly61
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/score.ily49
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/singlenotes.ly377
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crescHairpin.ly69
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchet.ly70
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDotted.ly70
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDottedDouble.ly70
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDottedDoubleDown.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDottedDown.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDown.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-decrescHairpin.ly69
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaver.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDotted.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDottedDouble.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDottedDoubleDown.ly72
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDottedDown.ly72
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDown.ly72
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-fancyExample.ly74
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNote.ly70
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDotted.ly70
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDottedDouble.ly70
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDottedDoubleDown.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDottedDown.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDown.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaver.ly70
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDotted.ly70
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDouble.ly70
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDoubleDdown.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDoubleDown.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDown.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDown.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaver.ly70
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDotted.ly70
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDottedDouble.ly70
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDottedDoubleDown.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDottedDown.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDown.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuavers.ly71
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuaversI.ly72
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuaversII.ly72
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuaversIII.ly72
-rw-r--r--Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-twoBeamedQuavers.ly70
-rw-r--r--Master/texmf-dist/source/latex/localloc/localloc.drv57
-rw-r--r--Master/texmf-dist/source/latex/localloc/localloc.dtx1026
-rw-r--r--Master/texmf-dist/source/latex/ltxcmds/ltxcmds.dtx2425
-rw-r--r--Master/texmf-dist/source/latex/marathi/marathi.dtx1140
-rw-r--r--Master/texmf-dist/source/latex/marathi/marathi.ins76
-rw-r--r--Master/texmf-dist/source/latex/marginfix/marginfix.dtx98
-rw-r--r--Master/texmf-dist/source/latex/mcmthesis/mcmthesis.dtx68
-rw-r--r--Master/texmf-dist/source/latex/media9/media9.tex4
-rw-r--r--Master/texmf-dist/source/latex/memoir/memoir.dtx524
-rw-r--r--Master/texmf-dist/source/latex/menucard/menucard.dtx323
-rw-r--r--Master/texmf-dist/source/latex/menucard/menucard.ins (renamed from Master/texmf-dist/source/latex/ellipsis/ellipsis.ins)25
-rw-r--r--Master/texmf-dist/source/latex/menukeys/menukeys.dtx417
-rw-r--r--Master/texmf-dist/source/latex/menukeys/menukeys.ins30
-rw-r--r--Master/texmf-dist/source/latex/metastr/metastr.dtx373
-rw-r--r--Master/texmf-dist/source/latex/microtype/microtype-utf.dtx7
-rw-r--r--Master/texmf-dist/source/latex/microtype/microtype.dtx922
-rw-r--r--Master/texmf-dist/source/latex/microtype/microtype.ins2
-rw-r--r--Master/texmf-dist/source/latex/mismath/mismath.dtx71
-rw-r--r--Master/texmf-dist/source/latex/mismath/mismath.ins4
-rw-r--r--Master/texmf-dist/source/latex/mlacls/mla.dtx306
-rw-r--r--Master/texmf-dist/source/latex/mluexercise/mluexercise.dtx813
-rw-r--r--Master/texmf-dist/source/latex/mluexercise/mluexercise.ins32
-rw-r--r--Master/texmf-dist/source/latex/moderntimeline/moderntimeline.dtx123
-rw-r--r--Master/texmf-dist/source/latex/moodle/makefile90
-rw-r--r--Master/texmf-dist/source/latex/moodle/moodle.dtx4394
-rw-r--r--Master/texmf-dist/source/latex/moodle/moodle.ins8
-rw-r--r--Master/texmf-dist/source/latex/ms/everysel.drv69
-rw-r--r--Master/texmf-dist/source/latex/ms/everysel.ins108
-rw-r--r--Master/texmf-dist/source/latex/ms/everyshi.drv74
-rw-r--r--Master/texmf-dist/source/latex/ms/everyshi.ins113
-rw-r--r--Master/texmf-dist/source/latex/ms/prelim2e.drv89
-rw-r--r--Master/texmf-dist/source/latex/ms/prelim2e.ins110
-rw-r--r--Master/texmf-dist/source/latex/muling/muling.dtx365
-rw-r--r--Master/texmf-dist/source/latex/muling/muling.ins48
-rw-r--r--Master/texmf-dist/source/latex/multicolrule/multicolrule.dtx42
-rw-r--r--Master/texmf-dist/source/latex/multicolrule/multicolrule.ins71
-rw-r--r--Master/texmf-dist/source/latex/multirow/multirow.dtx351
-rw-r--r--Master/texmf-dist/source/latex/multirow/multirow.ins2
-rw-r--r--Master/texmf-dist/source/latex/nameauth/Makefile72
-rw-r--r--Master/texmf-dist/source/latex/nameauth/nameauth.dtx10729
-rw-r--r--Master/texmf-dist/source/latex/nameauth/nameauth.ins72
-rw-r--r--Master/texmf-dist/source/latex/newverbs/newverbs.dtx10
-rw-r--r--Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx12480
-rw-r--r--Master/texmf-dist/source/latex/nicematrix/nicematrix.ins4
-rw-r--r--Master/texmf-dist/source/latex/nimsticks/nimsticks.dtx129
-rw-r--r--Master/texmf-dist/source/latex/nimsticks/nimsticks.ins30
-rw-r--r--Master/texmf-dist/source/latex/nnext/nnext.dtx644
-rw-r--r--Master/texmf-dist/source/latex/nnext/nnext.ins48
-rw-r--r--Master/texmf-dist/source/latex/nomencl/nomencl.drv2
-rw-r--r--Master/texmf-dist/source/latex/nomencl/nomencl.dtx24
-rw-r--r--Master/texmf-dist/source/latex/ntgclass/ntgclass.dtx6
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/README.txt29
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/hypdestopt.dtx966
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/oberdiek.ins7
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/oberdiek.tex39
-rw-r--r--Master/texmf-dist/source/latex/oops/oops.dtx789
-rw-r--r--Master/texmf-dist/source/latex/oops/oops.ins71
-rw-r--r--Master/texmf-dist/source/latex/orcidlink/orcidlink.dtx166
-rw-r--r--Master/texmf-dist/source/latex/orcidlink/orcidlink.ins57
-rw-r--r--Master/texmf-dist/source/latex/pagesel/pagesel.dtx (renamed from Master/texmf-dist/source/latex/oberdiek/pagesel.dtx)164
-rw-r--r--Master/texmf-dist/source/latex/paresse/LISEZMOI52
-rw-r--r--Master/texmf-dist/source/latex/paresse/Makefile203
-rw-r--r--Master/texmf-dist/source/latex/paresse/README54
-rw-r--r--Master/texmf-dist/source/latex/paresse/paresse-TEST.zipbin6251 -> 0 bytes
-rw-r--r--Master/texmf-dist/source/latex/paresse/paresse-doc.dtx796
-rw-r--r--Master/texmf-dist/source/latex/paresse/paresse.dtx1782
-rw-r--r--Master/texmf-dist/source/latex/paresse/paresse.ins82
-rw-r--r--Master/texmf-dist/source/latex/parskip/parskip.dtx63
-rw-r--r--Master/texmf-dist/source/latex/pbalance/pbalance.dtx1105
-rw-r--r--Master/texmf-dist/source/latex/pbalance/pbalance.ins50
-rw-r--r--Master/texmf-dist/source/latex/pdfoverlay/pdfoverlay.dtx232
-rw-r--r--Master/texmf-dist/source/latex/pdfoverlay/pdfoverlay.ins4
-rw-r--r--Master/texmf-dist/source/latex/pdfpages/pdfpages.dtx279
-rw-r--r--Master/texmf-dist/source/latex/pdfpc/pdfpc.dtx177
-rw-r--r--Master/texmf-dist/source/latex/pdfpc/pdfpc.ins38
-rw-r--r--Master/texmf-dist/source/latex/pdftexcmds/pdftexcmds.dtx2662
-rw-r--r--Master/texmf-dist/source/latex/penrose/penrose_code.dtx1588
-rw-r--r--Master/texmf-dist/source/latex/penrose/penrose_code.ins (renamed from Master/texmf-dist/source/latex/penrose/penrose.ins)30
-rw-r--r--Master/texmf-dist/source/latex/philosophersimprint/Makefile60
-rw-r--r--Master/texmf-dist/source/latex/philosophersimprint/philosophersimprint.dtx22
-rw-r--r--Master/texmf-dist/source/latex/pict2e/pict2e.dtx439
-rw-r--r--Master/texmf-dist/source/latex/picture/picture.dtx36
-rw-r--r--Master/texmf-dist/source/latex/pm-isomath/pm-isomath.dtx230
-rw-r--r--Master/texmf-dist/source/latex/poemscol/poemscol.dtx623
-rw-r--r--Master/texmf-dist/source/latex/polyglossia/polyglossia.dtx7083
-rw-r--r--Master/texmf-dist/source/latex/polytable/polytable.dtx99
-rw-r--r--Master/texmf-dist/source/latex/prelim2e/prelim2e.dtx (renamed from Master/texmf-dist/source/latex/ms/prelim2e.dtx)414
-rw-r--r--Master/texmf-dist/source/latex/prelim2e/prelim2e.ins59
-rw-r--r--Master/texmf-dist/source/latex/preview/preview.dtx6
-rw-r--r--Master/texmf-dist/source/latex/psnfss/psfonts.dtx8
-rw-r--r--Master/texmf-dist/source/latex/psnfss/psnfss2e.tex887
-rw-r--r--Master/texmf-dist/source/latex/pst-pdf/pst-pdf.dtx84
-rw-r--r--Master/texmf-dist/source/latex/pxpic/pxpic.dtx1326
-rw-r--r--Master/texmf-dist/source/latex/qrbill/qrbill.dtx1196
-rw-r--r--Master/texmf-dist/source/latex/qrbill/qrbill.ins57
-rw-r--r--Master/texmf-dist/source/latex/quotchap/quotchap.dtx10
-rw-r--r--Master/texmf-dist/source/latex/ragged2e/Makefile31
-rw-r--r--Master/texmf-dist/source/latex/ragged2e/ragged2e.drv117
-rw-r--r--Master/texmf-dist/source/latex/ragged2e/ragged2e.dtx174
-rw-r--r--Master/texmf-dist/source/latex/ragged2e/ragged2e.ins86
-rw-r--r--Master/texmf-dist/source/latex/ran_toks/ran_toks.dtx470
-rw-r--r--Master/texmf-dist/source/latex/ran_toks/ran_toks.ins1
-rw-r--r--Master/texmf-dist/source/latex/realtranspose/realtranspose.dtx52
-rw-r--r--Master/texmf-dist/source/latex/realtranspose/realtranspose.ins28
-rw-r--r--Master/texmf-dist/source/latex/regexpatch/regexpatch.dtx21
-rw-r--r--Master/texmf-dist/source/latex/regexpatch/regexpatch.ins2
-rw-r--r--Master/texmf-dist/source/latex/reledmac/reledmac.dtx1608
-rw-r--r--Master/texmf-dist/source/latex/reledmac/reledpar.dtx292
-rw-r--r--Master/texmf-dist/source/latex/repltext/repltext.dtx84
-rw-r--r--Master/texmf-dist/source/latex/repltext/repltext.ins8
-rw-r--r--Master/texmf-dist/source/latex/rest-api/rest-api.dtx225
-rw-r--r--Master/texmf-dist/source/latex/rest-api/rest-api.ins4
-rw-r--r--Master/texmf-dist/source/latex/revtex/aip4-2.dtx789
-rw-r--r--Master/texmf-dist/source/latex/revtex/ltxdocext.dtx9
-rw-r--r--Master/texmf-dist/source/latex/revtex/ltxfront.dtx11
-rw-r--r--Master/texmf-dist/source/latex/revtex/ltxgrid.dtx129
-rw-r--r--Master/texmf-dist/source/latex/revtex/ltxutil.dtx171
-rw-r--r--Master/texmf-dist/source/latex/revtex/revtex-bst.dtx3873
-rw-r--r--Master/texmf-dist/source/latex/revtex/revtex4-2.dtx19
-rw-r--r--Master/texmf-dist/source/latex/revtex4-1/aip.dtx2059
-rw-r--r--Master/texmf-dist/source/latex/revtex4-1/revtex4-1-bst.dtx3783
-rw-r--r--Master/texmf-dist/source/latex/revtex4-1/revtex4-1.dtx (renamed from Master/texmf-dist/source/latex/revtex/revtex4-1.dtx)21
-rw-r--r--Master/texmf-dist/source/latex/revtex4/ltxdocext.dtx12
-rw-r--r--Master/texmf-dist/source/latex/revtex4/ltxgrid.dtx46
-rw-r--r--Master/texmf-dist/source/latex/revtex4/ltxutil.dtx175
-rw-r--r--Master/texmf-dist/source/latex/revtex4/revtex4-bst.dtx2487
-rw-r--r--Master/texmf-dist/source/latex/revtex4/revtex4.dtx4
-rw-r--r--Master/texmf-dist/source/latex/revtex4/textcase.dtx1
-rw-r--r--Master/texmf-dist/source/latex/rmathbr/rmathbr.dtx1627
-rw-r--r--Master/texmf-dist/source/latex/rmathbr/rmathbr.ins8
-rw-r--r--Master/texmf-dist/source/latex/schooldocs/schooldocs.dtx987
-rw-r--r--Master/texmf-dist/source/latex/schooldocs/schooldocs.ins55
-rw-r--r--Master/texmf-dist/source/latex/showexpl/showexpl.dtx113
-rw-r--r--Master/texmf-dist/source/latex/showexpl/showexpl.ins2
-rw-r--r--Master/texmf-dist/source/latex/skdoc/Makefile69
-rw-r--r--Master/texmf-dist/source/latex/skdoc/skdoc.dtx15
-rw-r--r--Master/texmf-dist/source/latex/snapshot/snapshot.dtx920
-rw-r--r--Master/texmf-dist/source/latex/snapshot/snapshot.ins8
-rw-r--r--Master/texmf-dist/source/latex/soul/Makefile57
-rw-r--r--Master/texmf-dist/source/latex/soul/soul.dtx4520
-rw-r--r--Master/texmf-dist/source/latex/soul/soul.ins10
-rw-r--r--Master/texmf-dist/source/latex/spacingtricks/spacingtricks.dtx49
-rw-r--r--Master/texmf-dist/source/latex/spacingtricks/spacingtricks.ins4
-rw-r--r--Master/texmf-dist/source/latex/spath3/spath3.dtx4228
-rw-r--r--Master/texmf-dist/source/latex/spath3/spath3_code.dtx8920
-rw-r--r--Master/texmf-dist/source/latex/spath3/spath3_code.ins (renamed from Master/texmf-dist/source/latex/spath3/spath3.ins)31
-rw-r--r--Master/texmf-dist/source/latex/stix2/stix2.dtx4255
-rw-r--r--Master/texmf-dist/source/latex/stix2/stix2.fdd239
-rw-r--r--Master/texmf-dist/source/latex/stringstrings/stringstrings.dtx5
-rw-r--r--Master/texmf-dist/source/latex/stringstrings/stringstrings.ins12
-rw-r--r--Master/texmf-dist/source/latex/sttools/flushend.dtx231
-rw-r--r--Master/texmf-dist/source/latex/subfiles/subfiles.dtx657
-rw-r--r--Master/texmf-dist/source/latex/subfiles/subfiles.ins4
-rw-r--r--Master/texmf-dist/source/latex/suftesi/suftesi.dtx5055
-rw-r--r--Master/texmf-dist/source/latex/svg/svg.dtx4131
-rw-r--r--Master/texmf-dist/source/latex/swfigure/swfigure.dtx1558
-rw-r--r--Master/texmf-dist/source/latex/teubner/teubner.dtx1295
-rw-r--r--Master/texmf-dist/source/latex/texnegar/texnegar.dtx2110
-rw-r--r--Master/texmf-dist/source/latex/texnegar/texnegar.ins77
-rw-r--r--Master/texmf-dist/source/latex/textpos/textpos.drv19
-rw-r--r--Master/texmf-dist/source/latex/textpos/textpos.dtx353
-rw-r--r--Master/texmf-dist/source/latex/thesis-ekf/thesis-ekf.dtx626
-rw-r--r--Master/texmf-dist/source/latex/thmtools/aliasctr.dtx9
-rw-r--r--Master/texmf-dist/source/latex/thmtools/parseargs.dtx8
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thm-amsthm.dtx11
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thm-autoref.dtx8
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thm-beamer.dtx11
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thm-kv.dtx214
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thm-listof.dtx66
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thm-llncs.dtx13
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thm-ntheorem.dtx11
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thm-patch.dtx8
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thm-restate.dtx18
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thmdef-mdframed.dtx18
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thmdef-shaded.dtx63
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thmdef-thmbox.dtx39
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thmtools.dtx8
-rw-r--r--Master/texmf-dist/source/latex/thmtools/thmtools.ins45
-rw-r--r--Master/texmf-dist/source/latex/thmtools/unique.dtx61
-rw-r--r--Master/texmf-dist/source/latex/thucoursework/thucoursework.dtx18
-rw-r--r--Master/texmf-dist/source/latex/thuthesis/Makefile83
-rw-r--r--Master/texmf-dist/source/latex/thuthesis/thuthesis.dtx4081
-rw-r--r--Master/texmf-dist/source/latex/thuthesis/thuthesis.ins23
-rw-r--r--Master/texmf-dist/source/latex/tile-graphic/tile-graphic.dtx1010
-rw-r--r--Master/texmf-dist/source/latex/tile-graphic/tile-graphic.ins61
-rw-r--r--Master/texmf-dist/source/latex/tocdata/tocdata.dtx137
-rw-r--r--Master/texmf-dist/source/latex/todonotes/todonotes.dtx79
-rw-r--r--Master/texmf-dist/source/latex/tools/array.dtx83
-rw-r--r--Master/texmf-dist/source/latex/tools/varioref.dtx276
-rw-r--r--Master/texmf-dist/source/latex/tools/verbatim.dtx31
-rw-r--r--Master/texmf-dist/source/latex/tools/xr.dtx13
-rw-r--r--Master/texmf-dist/source/latex/toptesi/toptesi.dtx1847
-rw-r--r--Master/texmf-dist/source/latex/totalcount/totalcount.dtx (renamed from Master/texmf-dist/source/latex/caption/totalcount.dtx)4
-rw-r--r--Master/texmf-dist/source/latex/totalcount/totalcount.ins42
-rw-r--r--Master/texmf-dist/source/latex/tracklang/tracklang.dtx69
-rw-r--r--Master/texmf-dist/source/latex/tracklang/tracklang.ins4
-rw-r--r--Master/texmf-dist/source/latex/tudscr/doc/sub-tudscr.tex17
-rw-r--r--Master/texmf-dist/source/latex/tudscr/doc/tudscr.tex4
-rw-r--r--Master/texmf-dist/source/latex/tudscr/tudscr-area.dtx165
-rw-r--r--Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx17
-rw-r--r--Master/texmf-dist/source/latex/tudscr/tudscr-comp.dtx24
-rw-r--r--Master/texmf-dist/source/latex/tudscr/tudscr-fonts.dtx141
-rw-r--r--Master/texmf-dist/source/latex/tudscr/tudscr-frontmatter.dtx12
-rw-r--r--Master/texmf-dist/source/latex/tudscr/tudscr-localization.dtx364
-rw-r--r--Master/texmf-dist/source/latex/tudscr/tudscr-misc.dtx4
-rw-r--r--Master/texmf-dist/source/latex/tudscr/tudscr-pagestyle.dtx13
-rw-r--r--Master/texmf-dist/source/latex/tudscr/tudscr-version.dtx4
-rw-r--r--Master/texmf-dist/source/latex/tugboat/tugboat.dtx173
-rw-r--r--Master/texmf-dist/source/latex/ut-thesis/ut-thesis.dtx607
-rw-r--r--Master/texmf-dist/source/latex/ut-thesis/ut-thesis.ins39
-rw-r--r--Master/texmf-dist/source/latex/verifica/verifica.dtx13
-rw-r--r--Master/texmf-dist/source/latex/verifiche/verifiche.dtx1514
-rw-r--r--Master/texmf-dist/source/latex/verifiche/verifiche.ins41
-rw-r--r--Master/texmf-dist/source/latex/xcjk2uni/xCJK2uni.dtx364
-rw-r--r--Master/texmf-dist/source/latex/xcjk2uni/xCJK2uni.ins8
-rw-r--r--Master/texmf-dist/source/latex/xkeyval/xkeyval.dtx15
-rw-r--r--Master/texmf-dist/source/latex/xmuthesis/xmuthesis.dtx4722
-rw-r--r--Master/texmf-dist/source/latex/xpinyin/xpinyin.dtx118
-rw-r--r--Master/texmf-dist/source/latex/xpinyin/xpinyin.ins8
-rw-r--r--Master/texmf-dist/source/latex/yathesis/yathesis-samples-templates.dtx28
-rw-r--r--Master/texmf-dist/source/latex/yathesis/yathesis.dtx961
-rw-r--r--Master/texmf-dist/source/latex/youngtab/youngtab.dtx842
-rw-r--r--Master/texmf-dist/source/latex/youngtab/youngtab.ins36
-rw-r--r--Master/texmf-dist/source/latex/zhlipsum/zhlipsum-text.dtx2
-rw-r--r--Master/texmf-dist/source/latex/zhlipsum/zhlipsum.dtx328
-rw-r--r--Master/texmf-dist/source/latex/zhlipsum/zhlipsum.ins4
-rw-r--r--Master/texmf-dist/source/latex/zhnumber/zhnumber.dtx68
-rw-r--r--Master/texmf-dist/source/latex/zhnumber/zhnumber.ins18
-rw-r--r--Master/texmf-dist/source/latex/zref/zref.dtx123
798 files changed, 232160 insertions, 133361 deletions
diff --git a/Master/texmf-dist/source/latex/aalok/aalok.dtx b/Master/texmf-dist/source/latex/aalok/aalok.dtx
new file mode 100644
index 00000000000..81ae1b01e87
--- /dev/null
+++ b/Master/texmf-dist/source/latex/aalok/aalok.dtx
@@ -0,0 +1,1560 @@
+% \iffalse meta-comment
+%
+% File: aalok.dtx
+% ---------------------------------------------------------------------------
+% लाटेक्-वर्ग: आलोक
+% लेखक: निरंजन
+% आवृत्ती: ०.२
+% वर्णन: आलोक मराठी नियतकालिकाच्या अक्षरजुळणीकरिता लाटेक्-वर्ग.
+% संग्राहिका: https://gitlab.com/aalok/aalok-latex
+% अडचणी: https://gitlab.com/aalok/aalok-latex/-/issues
+% परवाना: आलोक नित्यमुक्त परवाना. आवृत्ती १.० किंवा त्यापुढील तसेच
+% ग्नू पब्लिक परवाना आवृत्ती ३.०+
+% ---------------------------------------------------------------------------
+% हे काम आलोक नित्यमुक्त परवाना तसेच ग्नू पब्लिक परवान्याच्या अटींचे पालन करून वितरित केले जाऊ
+% शकते तसेच सुधारले जाऊ शकते.
+%
+% ह्या परवान्यांची नवीनतम आवृत्ती पुढील दुव्यांवर पाहता येऊ शकते.
+%
+% https://gitlab.com/aalok/nityamukta-parwana
+% https://www.gnu.org/licenses/gpl-3.0.txt
+%
+% ह्या लाटेक्-वर्गाची लाटेक्-प्रकल्पाच्या नियमांनुसार देखरेख केली जात आहे.
+%
+% ह्या लाटेक्-वर्गाचा लेखक व पालक निरंजन आहे.
+%
+% ह्या कामात aalok.dtx, aalok.ins तसेच त्यांपासून निर्माण केलेली
+% aalok.cls ही धारिका समाविष्ट आहे.
+% \fi
+% \iffalse
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+Note: This README file contains information about LaTeX
+ class aalok in languages Marathi & English. As
+ this package/class is targeted more towards the
+ speakers of language Marathi the description is
+ initially given in that (those) language(s), but for
+ general readers an English description is provided at
+ the end.
+--------------------------------------------------------------------------
+लाटेक्-वर्ग: आलोक
+लेखक: निरंजन
+आवृत्ती: ०.२ (१३ फेब्रुवारी, २०२१)
+वर्णन: आलोक मराठी नियतकालिकाच्या अक्षरजुळणीकरिता लाटेक्-वर्ग.
+संग्राहिका: https://gitlab.com/aalok/aalok-latex
+अडचणी: https://gitlab.com/aalok/aalok-latex/-/issues
+परवाना: आलोक नित्यमुक्त परवाना. आवृत्ती १.० किंवा त्यापुढील.
+दुवा - https://gitlab.com/aalok/nityamukta-parwana
+ आणि
+ ग्नू पब्लिक परवाना. आवृत्ती ३.० किंवा त्यापुढील
+ दुवा - https://www.gnu.org/licenses/gpl-3.0.txt
+--------------------------------------------------------------------------
+Class: aalok
+Author: Niranjan
+Version: 0.2 (13 February, 2021)
+Description: LaTeX class for typesetting Aalok Marathi
+ Journal.
+Repository: https://gitlab.com/aalok/aalok-latex
+Bug tracker: https://gitlab.com/aalok/aalok-latex/-/issues
+License: `आलोक' copyleft license v1.0 or later.
+ https://gitlab.com/aalok/nityamukta-parwana
+ and
+ GPL v3.0+
+ https://www.gnu.org/licenses/gpl-3.0.txt
+--------------------------------------------------------------------------
+%</readme>
+%<*internal>
+\fi
+%</internal>
+%<*driver|class>
+\def\aalokName{aalok}
+\def\aalokVersion{०.२}
+\def\aalokDate{२०२१/०२/१३}
+\def\aalokDescription{आलोक लाटेक् आ. \aalokVersion}
+%</driver|class>
+%<*driver>
+\documentclass{l3doc}
+\usepackage{xcolor}
+\colorlet{आलोकपिवळा}{yellow!90!black}
+\colorlet{आलोकनिळा}{blue!60!black}
+\colorlet{आलोकशेंदरी}{orange!80!black}
+\colorlet{आलोकहिरवा}{green!50!black}
+\usepackage{fontspec}
+\setmainfont[%
+Renderer=Harfbuzz,%
+Script=Devanagari,%
+Language=Marathi,%
+]{Shobhika}
+\renewcommand{\glossaryname}{परिभाषाकोश}
+\renewcommand{\abstractname}{सारांश}
+\renewcommand{\contentsname}{अनुक्रमणिका}
+\usepackage{setspace}
+\setstretch{1.5}
+\sloppy
+\hyphenpenalty=10000
+\exhyphenpenalty=1000
+\ExplSyntaxOn
+\cs_set_protected:Npn \__codedoc_meta:n #1
+{%
+ {%
+ \color{आलोकशेंदरी}%
+ \tl_set:Nn \l__codedoc_tmpa_tl {#1}%
+ \tl_map_inline:nn
+ { { 3 } { 4 } { 7 } { 8 } { 11 } { 12 } { 13 } }%
+ {%
+ \tl_set_rescan:Nnn \l__codedoc_tmpb_tl
+ { \char_set_catcode:nn { `_ } {##1} } { _ }%
+ \tl_replace_all:Non \l__codedoc_tmpa_tl \l__codedoc_tmpb_tl
+ { \__codedoc_ensuremath_sb:n }%
+ }%
+ \exp_args:NV \__codedoc_meta_original:n \l__codedoc_tmpa_tl
+ }%
+}%
+\cs_set_protected:Npn \__codedoc_syntax_end:
+{
+\end{minipage}
+\end{tabular}
+\arrayrulecolor{आलोकशेंदरी}
+\hbox_gset_end:
+\bool_if:NF \l__codedoc_in_function_bool
+{
+ \begin{quote}
+ \mode_leave_vertical:
+ \box_use_drop:N \g__codedoc_syntax_box
+ \end{quote}
+}
+}
+\ExplSyntaxOff
+% सॅम कार्टर ह्यांचे मनःपूर्वक आभार (https://topanswers.xyz/tex?q=1517#a1767)
+\usepackage{fontawesome5}
+\usepackage{hyperref}
+\hypersetup{%
+ unicode,
+ pdftitle={।। आलोक ।। (लाटेक्-वर्ग - आवृत्ती ०.२)},
+ pdfauthor={निरंजन},
+ pdfsubject={आलोक मराठी नियतकालिकाच्या अक्षरजुळणीकरिता लाटेक्-वर्ग.},
+ pdfkeywords={आलोक मराठी नियतकालिक},
+ colorlinks,%
+ linkcolor=आलोकशेंदरी,%
+ citecolor=आलोकहिरवा,%
+ urlcolor=आलोकनिळा%
+}%
+\usepackage{expl3}
+\usepackage{l3pdf}
+\ExplSyntaxOn
+\pdf_version_gset:n{2.0}
+\ExplSyntaxOff
+\usepackage{devanagaridigits}
+\makeatletter
+\def\@arabic#1{\expandafter\devanagaridigits\expandafter{\number#1}}
+\renewcommand{\theCodelineNo}{{\scriptsize\arabic{CodelineNo}}\quad}
+\makeatother
+\setmonofont[
+Renderer=Harfbuzz,
+Script=Devanagari,
+Color=आलोकनिळा
+]{Mukta}
+\begin{document}
+\DocInput{\aalokName.dtx}
+\end{document}
+%</driver>
+% \fi
+% \title{।। आलोक ।।}
+% \author{निरंजन}
+% \date^^A
+% {^^A
+% आवृत्ती \aalokVersion\ --- \aalokDate\\[1ex]
+% {\small\textcolor{आलोकशेंदरी}{\faIcon{link}}\quad\url{https://ctan.org/pkg/aalok}}\\
+% {\small\textcolor{आलोकशेंदरी}{\faIcon{gitlab}}\quad\url{https://gitlab.com/aalok/aalok-latex}}
+% }^^A
+% \maketitle
+% \begin{abstract}
+% आलोक नियतकालिकाच्या अक्षरजुळणीकरिता हा लाटेक्-वर्ग लिहिण्यात आला आहे. आलोकची
+% सामग्री मुक्तपणे उपलब्ध करून देताना, ह्या वर्गाची आज्ञावलीदेखील मुक्त असावी ह्या हेतूने हा
+% वर्ग सीटॅन ह्या संकेतस्थळावर सादर करण्यात आला आहे.
+% \end{abstract}
+% \tableofcontents
+% \clearpage
+% \hspace{0pt}
+% \vfill
+% \section{परवाना}
+% {%
+% \setlength{\parindent}{0pt}
+% © २०२१ निरंजन.
+%
+% ह्या सामग्रीच्या वितरणाचे व प्रतिमुद्रणाचे अधिकार आलोक नित्यमुक्त परवान्यासह मुक्त करण्यात येत
+% आहेत. ह्या सामग्रीची यथामूल अथवा परिवर्तित प्रतिमुद्रणे व्यावसायिक अथवा अव्यावसायिक
+% स्वरूपात वितरित करण्यास प्रतिमुद्राधिकारधारक संमती देत आहे, परंतु असे करताना वितरकाने
+% प्रतिमुद्राधिकारांचा योग्य श्रेयनिर्देश करणे व सामग्री परिवर्तित असल्यास ती ह्याच अटींसह
+% वितरित करणे बंधनकारक आहे. ही सामग्री जशी आहे तशी पुरवण्यात येत आहे, पुरवणारा/पुरवणारी
+% हिच्याबाबत कोणतीही हमी देत नाही. ह्या (व ह्यावर आधारित) सामग्रीचे अमुक्त वितरण
+% बेकायदेशीर मानले जाईल. आलोक नित्यमुक्त परवान्याचा संपूर्ण मसुदा पुढील दुव्यावर वाचता
+% येईल.
+%
+% \url{https://gitlab.com/aalok/nityamukta-parwana}
+%
+% \rule{\linewidth}{0.5mm}
+%
+% \fontfamily{lmr}\selectfont
+% Copyright © 2021 Niranjan.
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.3
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% A copy of the license is included in the section entitled ``GNU
+% Free Documentation License''.
+%
+% \url{https://www.gnu.org/licenses/fdl}
+% }%
+%
+% \vfill
+% \begin{documentation}
+% \arrayrulecolor{आलोकशेंदरी}
+% \section{प्राचले}
+% \begin{function}{खासगीवितरण}
+% हे प्राचल वापरल्यास आलोकच्या खासगीवितरणाचे अंक घडवले जातात.
+% \end{function}
+% \begin{function}{सुटालेख}
+% हे प्राचल वापरल्यास आलोकच्या अंकातील लेख स्वतंत्ररित्या छापले जातात.
+% \end{function}
+% \begin{function}{छापील}
+% हे प्राचल वापरल्यास आलोकची छापील आवृत्ती तयार होते.
+% \end{function}
+% \begin{function}{रेगे}
+% हे प्राचल वापरल्यास २४ जानेवारी ही तारीख मूलभूत मानली जाते, तसेच प्रकाशनमाहितीच्या
+% पानावर प्रा.\ मे.\ पुं.\ रेग्यांचे नाव येते.
+% \end{function}
+% \begin{function}{राजवाडे}
+% हे प्राचल वापरल्यास २४ जून ही तारीख मूलभूत मानली जाते, तसेच प्रकाशनमाहितीच्या पानावर
+% इतिहासाचार्य वि.\ का.\ राजवाड्यांचे नाव येते.
+% \end{function}
+% \section{आज्ञा}
+% ह्या लाटेक् वर्गात पुढील आज्ञांचा समावेश होतो.
+% \begin{function}{\पुष्प}
+% \begin{syntax}
+% \cs{पुष्प}\marg{पुष्पक्रमांक}
+% \end{syntax}
+% आलोक नियतकालिकाचे हे कितवे पुष्प आहे हे ह्या आज्ञेने स्पष्ट केले जाते. मुखपृष्ठ व इतर अनेक
+% ठिकाणी ही माहिती छापली जाते.
+% \end{function}
+% \begin{function}{\आकडीपुष्प}
+% \begin{syntax}
+% \cs{आकडीपुष्प}\marg{पुष्पक्रमांक आकडी}
+% \end{syntax}
+% ह्या आज्ञेत पुष्पक्रमांक आकडी लिहावा. सामग्रीचा संदर्भ कसा द्यावा ह्याविषयीच्या
+% सूचनेकरिता ही माहिती लागते.
+% \end{function}
+% \begin{function}{\तिथी}
+% \begin{syntax}
+% \cs{तिथी}\marg{प्रकाशनाची तिथी}
+% \end{syntax}
+% आलोक नियतकालिकाचे प्रकाशनाची तिथी विविध ठिकाणी छापण्याकरिता ही आज्ञा वापरली
+% जाते.
+% \end{function}
+% \begin{function}{\आवृत्ती}
+% \begin{syntax}
+% \cs{आवृत्ती}\marg{आवृत्तिक्रमांक अक्षरांत}
+% \end{syntax}
+% आलोक नियतकालिकाच्या विशिष्ट अंकाची ही कितवी आवृत्ती आहे हे ह्या आज्ञेने स्पष्ट केले
+% जाते.
+% \end{function}
+% \begin{function}{\प्रकाशनवर्ष}
+% \begin{syntax}
+% \cs{प्रकाशनवर्ष}\marg{प्रकाशनवर्ष}
+% \end{syntax}
+% आलोक नियतकालिकाच्या प्रस्तुत अंकाचे प्रकाशनवर्ष कोणते आहे हे ह्या आज्ञेने स्पष्ट केले जाते.
+% \end{function}
+% \begin{function}{\जयंती}
+% \begin{syntax}
+% \cs{जयंती}\marg{कितवी जयंती}
+% \end{syntax}
+% आलोक नियतकालिकाचे प्रकाशन प्रा.\ मे.\ पुं.\ रेगे व इतिहासाचार्य वि.\ का.\ राजवाडे
+% ह्यांच्या जयंतीप्रीत्यर्थ होते. त्यांची कितवी जयंती आहे हे दरवेळी प्रकाशनमाहितीच्या
+% पानावरील माहिती ह्या आज्ञेमुळे स्पष्ट केली जाते.
+% \end{function}
+% \begin{function}{\दिनांक}
+% \begin{syntax}
+% \cs{दिनांक}\marg{प्रकाशनाचा दिनांक}
+% \end{syntax}
+% आलोक नियतकालिकाच्या प्रकाशनाचा दिनांक विविध ठिकाणी छापण्याकरिता ही आज्ञा
+% वापरली जाते, परंतु ही आज्ञा \verb|रेगे| अथवा \verb|राजवाडे| ही प्राचले वापरल्यास
+% आपोआपच भरली जाते, त्यामुळे हिचा प्रयोग सहसा करावा लागत नाही.
+% \end{function}
+% \begin{function}{\आकडीदिनांक}
+% \begin{syntax}
+% \cs{आकडीदिनांक}\marg{प्रकाशनाचा दिनांक (आकडी)}
+% \end{syntax}
+% सुट्या लेखांमध्ये संदर्भ कसा द्यावा ह्याविषयीच्या सूचनेकरिता आकडी दिनांकाची आवश्यकता
+% पडते. त्यासाठी ह्या आज्ञेचा प्रयोग केवळ सुट्या लेखांमध्येच आवश्यक ठरतो.
+% \end{function}
+% \begin{function}{\लेख}
+% \begin{syntax}
+% \cs{लेख}\marg{लेखाचे शीर्षक}
+% \end{syntax}
+% ह्या आज्ञेच्या कार्यघटकात लेखाचे शीर्षक लिहावे.
+% \end{function}
+% \begin{function}{\अभ्यासक}
+% \begin{syntax}
+% \cs{अभ्यासक}\marg{अभ्यासकाचे नाव}
+% \end{syntax}
+% ह्या आज्ञेच्या कार्यघटकात लेखकाचे नाव लिहावे.
+% \end{function}
+% \begin{function}{\इपत्ता}
+% \begin{syntax}
+% \cs{इपत्ता}\marg{इपत्ता}\marg{दृश्यरूपातील इपत्ता}
+% \end{syntax}
+% ज्या इपत्त्यांमध्ये लॅटिन आकडे असतात, ते दिसण्याकरिता लाटेक्-मधील गणित-क्षेत्राचा वापर
+% करावा लागतो. उदा.\ \verb|\इपत्ता{abcd123@example.com}{abcd\(123\)@gmail.com}|
+% ह्याकरिता ह्या आज्ञेस दोन कार्यघटक आहेत. ज्यांच्या इपत्त्यात आकडे नाहीत, त्यांनी दोन्ही
+% कार्यघटकांत तोच इपत्ता लिहावा. उदा.\
+% \verb|\इपत्ता{abcd@example.com}{abcd@gmail.com}|
+% \end{function}
+% \begin{function}{\orcid}
+% \begin{syntax}
+% \cs{orcid}\marg{orcid क्रमांक}
+% \end{syntax}
+% ह्या आज्ञेच्या कार्यघटकात लेखकांनी त्यांचा ORCID क्रमांक लिहिणे अभिप्रेत आहे.
+% \end{function}
+% \begin{function}{\शीर्षक}
+% \begin{syntax}
+% \cs{शीर्षक}
+% \end{syntax}
+% ही आज्ञा टाकल्यास आलोकची शीर्षकसामग्री छापली जाते.
+% \end{function}
+% \begin{function}{\अनुक्रमणिका}
+% \begin{syntax}
+% \cs{अनुक्रमणिका}
+% \end{syntax}
+% ह्या आज्ञेसह सुट्या लेखांत व अंकातील लेखांस अनुक्रमणिका पुरवली जाते.
+% \end{function}
+% \end{documentation}
+% \begin{implementation}
+% \section{लाटेक्-वर्गाची घडण}
+% \begin{macrocode}
+%<*class>
+% \end{macrocode}
+% \begin{macrocode}
+\ProvidesClass{aalok}[2021/02/13 v0.2
+\aalokDescription]
+% \end{macrocode}
+% वरील आज्ञेसह पायाभूत माहिती पुरवण्यात आली.
+% \begin{macrocode}
+\let\पुष्पसंख्या\@empty
+\def\पुष्प#1{%
+ \def\पुष्पसंख्या{#1}%
+}%
+\let\कोणतादिनांक\@empty
+\def\दिनांक#1{%
+ \def\कोणतादिनांक{#1}%
+}%
+\let\पुष्पसंख्याआकडी\@empty
+\def\आकडीपुष्प#1{%
+ \def\पुष्पसंख्याआकडी{#1}
+}%
+\let\दिनांकआकडी\@empty
+\def\आकडीदिनांक#1{%
+ \def\दिनांकआकडी{#1}
+}%
+\let\कोणतीतिथी\@empty
+\def\तिथी#1{%
+ \def\कोणतीतिथी{#1}%
+}%
+\let\कितवीआवृत्ती\@empty
+\def\आवृत्ती#1{%
+ \def\कितवीआवृत्ती{#1}%
+}%
+\let\कोणतेप्रकाशनवर्ष\@empty
+\def\प्रकाशनवर्ष#1{%
+ \def\कोणतेप्रकाशनवर्ष{#1}%
+}%
+\let\विद्वान\@empty
+\def\प्रीत्यर्थ#1{%
+ \def\विद्वान{#1}%
+}%
+\let\कितवीजयंती\@empty
+\def\जयंती#1{%
+ \def\कितवीजयंती{#1}%
+}%
+\let\आकडीमूल्यकिती\@empty
+\let\अक्षरीमूल्यकिती\@empty
+\def\मूल्य#1#2{%
+ \def\आकडीमूल्यकिती{#1}%
+ \def\अक्षरीमूल्यकिती{#2}%
+}%
+\let\लेखाचेनाव\@empty
+\def\लेख#1{%
+ \def\लेखाचेनाव{#1}%
+}%
+\let\अभ्यासकाचेनाव\@empty
+\def\अभ्यासक#1{%
+ \def\अभ्यासकाचेनाव{#1}%
+}%
+\let\अभ्यासकाचाइपत्तादुवा\@empty
+\let\अभ्यासकाचाइपत्तापाठ्य\@empty
+\def\इपत्ता#1#2{%
+ \def\अभ्यासकाचाइपत्तादुवा{#1}%
+ \def\अभ्यासकाचाइपत्तापाठ्य{#2}%
+}%
+\let\orcidno\@empty
+\def\orcid#1{%
+ \def\orcidno{#1}%
+}%
+% \end{macrocode}
+% वरील आज्ञांसह विविध ठिकाणी लागणारी माहिती पुरवण्यासाठी सोप्या आज्ञा घडवण्यात आल्या आहेत.
+% \begin{macrocode}
+\newif\ifखासगीवितरण
+\DeclareOption{खासगीवितरण}{\खासगीवितरणtrue}
+\newif\ifछापील
+\DeclareOption{छापील}{\छापीलtrue}
+\newif\ifसुटालेख
+\newif\ifस्थान
+\DeclareOption{सुटालेख}{\सुटालेखtrue\स्थानtrue}
+\DeclareOption{रेगे}{%
+ \दिनांक{२४ जानेवारी}%
+ \प्रीत्यर्थ{प्रा.\ मे.\ पुं.\ रेगे}%
+}%
+\DeclareOption{राजवाडे}{%
+ \दिनांक{२४ जानेवारी}%
+ \प्रीत्यर्थ{इतिहासाचार्य वि.\ का.\ राजवाडे}%
+}%
+\ProcessOptions
+% \end{macrocode}
+% वरील आज्ञांसह \verb|छापील|, \verb|सुटालेख| व \verb|खासगीवितरण| ही प्राचले व त्यांची
+% सोपाधिके घडवली.
+% \begin{macrocode}
+\ifसुटालेख
+\LoadClass[12pt]{article}
+\else
+\ifछापील
+\LoadClass[openright,extrafontsizes,twocolumn]{memoir}
+\else
+\LoadClass[extrafontsizes,twocolumn,oneside]{memoir}
+\fi
+\fi
+% \end{macrocode}
+% \verb|छापील| हे प्राचल वापरल्यास \verb|memoir| लाटेक्-वर्गासह छापील आवृत्तीसाठी आवश्यक
+% असणारी प्राचले वापरणे व ते न वापरल्यास डिजिटल आवृत्तीसाठीची प्राचले वापरणे वरील आज्ञांनी साधले.
+% \begin{macrocode}
+\RequirePackage{expl3}
+\RequirePackage{l3pdf}
+\ExplSyntaxOn
+\pdf_version_gset:n{2.0}
+\ExplSyntaxOff
+% \end{macrocode}
+% आलोक नित्यमुक्त परवान्यातील अटीनुसार पीडीएफ् ह्या दस्तऐवजातील प्रकाराची १.७+ आवृत्ती
+% वापरणे बंधनकारक आहे. त्यामुळे वरील आज्ञांसह लाटेक्-च्या मूलभूत १.५ ह्या आवृत्तीऐवजी २.० ही
+% नवीनतम आवृत्ती वापरण्यात आली आहे.
+% \begin{macrocode}
+\RequirePackage{expex}
+\RequirePackage{xcolor}
+\RequirePackage{marathi}
+\RequirePackage{microtype}
+\RequirePackage{fontawesome5}
+\RequirePackage{diagbox}
+\RequirePackage{fancyhdr}
+\RequirePackage{float}
+\RequirePackage{paracol}
+\RequirePackage[most]{tcolorbox}
+\RequirePackage{tikz}
+\RequirePackage{graphicx}
+\RequirePackage{mdframed}
+\RequirePackage{etoolbox}
+% \end{macrocode}
+% वरील आज्ञांसह काही आवश्यक आज्ञासंच वापरले आहेत.
+% \begin{macrocode}
+\newtoggle{स्थान}
+\newtoggle{छापील}
+\ifसुटालेख
+\toggletrue{स्थान}
+\else
+\fi
+% \end{macrocode}
+% \url{https://tex.stackexchange.com/a/5896/174620} वरील आज्ञांसह काही आवश्यक आज्ञासंच वापरले आहेत.
+% \begin{macrocode}
+\RequirePackage{xcolor}
+\colorlet{लाल}{black!50!red}
+\colorlet{निळादुवा}{blue!50!black}
+\colorlet{निळा}{blue!20!black}
+\colorlet{सोनेरी}{yellow!90!white}
+\definecolor{कागद}{HTML}{FFF8DC}
+% \end{macrocode}
+% आलोकच्या निर्मितीत लागणारे विविध रंग \verb|xcolor| ह्या आज्ञासंचासह वरील आज्ञांनी
+% घडवण्यात आले. कागदासाठी वापरण्यात आलेला रंग
+% \url{https://tex.stackexchange.com/a/219609/174620} ह्या उत्तराच्या सौजन्याने
+% वापरला.
+% \begin{macrocode}
+\RequirePackage[sort=use]{glossaries}
+\makenoidxglossaries
+% \end{macrocode}
+% वरील आज्ञांसह संज्ञासूचीकरिता \verb|glossaries| हा आज्ञासंच वापरला.
+% \begin{macrocode}
+\AtEndPreamble{%
+ \RequirePackage[%
+ unicode,%
+ colorlinks,%
+ \ifछापील
+ linkcolor={black},%
+ citecolor={black},%
+ urlcolor={black},%
+ \else
+ linkcolor={लाल},%
+ citecolor={निळादुवा},%
+ urlcolor={निळादुवा},%
+ \fi
+ \ifसुटालेख
+ pdftitle={\लेखाचेनाव},%
+ pdfauthor={\अभ्यासकाचेनाव},%
+ \else
+ pdftitle={आलोक (पुष्प \पुष्पसंख्या, \कोणतादिनांक)},%
+ pdfauthor={आलोक मराठी नियतकालिक},%
+ \fi
+ pdfsubject={शास्त्रचर्चेस वाहिलेले पहिले मुक्त मराठी नियतकालिक.},%
+ pdfkeywords={वर्णमुद्रा प्रकाशन},%
+ pdfproducer={आलोक मराठी नियतकालिक},%
+ pdfcreator={हायपर्रेफ-सह लुआलाटेक्}%
+ ]%
+ {hyperref}%
+ \renewcommand{\tableautorefname}{कोष्टक}%
+ \renewcommand{\appendixautorefname}{परिशिष्ट}%
+ \renewcommand{\figureautorefname}{आकृती}%
+}%
+% \end{macrocode}
+% लाटेक्-फलिताकरिता पायाभूत माहिती \verb|हायपर्रेफ| ह्या आज्ञासंचासह पुरवता येते, परंतु
+% त्याकरिता हा आज्ञासंच सगळ्यात शेवटी वापरणे आवश्यक आहे. म्हणून ह्या आज्ञावलीसह सर्वात शेवटचा
+% आज्ञासंच \verb|हायपर्रेफ| वापरला जाईल अशी सोय करण्यात आली आहे. ह्यामुळे वापरकर्त्यांनी
+% \verb|हायपर्रेफ| ह्या आज्ञासंचानंतर वापरण्यात येणारे आज्ञासंच (उदा.\
+% \href{https://ctan.org/pkg/cleveref}{\verb|क्लेव्हरेफ|})
+% \verb|\AtBeginDocument{\usepackage{cleveref}}| अशा प्रकारे वापरावेत. जेणेकरून
+% कोणतीही अडचण उद्भवणार नाही. तसेच ह्या आज्ञासंचासह अंतर्गत संदर्भांना दिली जाणारी काही
+% नावे वरील आज्ञांसह देण्यात आली आहेत.
+% \begin{macrocode}
+\RequirePackage[%
+style=authoryear,%
+sorting=none,%
+backend=biber,%
+]%
+{biblatex}%
+\addbibresource{सामग्री/संदर्भ.bib}
+\DeclareNumChars{०१२३४५६७८९}
+\DeclareCiteCommand{\citetitleyear}
+{%
+ \boolfalse{citetracker}%
+ \boolfalse{pagetracker}%
+}%
+{%
+ \ifciteindex
+ {%
+ \indexfield{indextitle}%
+ }%
+ {}%
+ \printfield[citetitle]{labeltitle}%
+ \setunit{\addspace}%
+ \printtext[parens]{%
+ \usebibmacro{prenote}%
+ \printfield{year}\printfield{extrayear}%
+ \usebibmacro{postnote}%
+ }%
+}%
+{\multicitedelim}%
+{}%
+% \end{macrocode}
+% वरील आज्ञांसह संदर्भांसाठी \verb|बिबलाटेक्| हा आज्ञासंच वापरला व \verb|सामग्री/संदर्भ.bib|
+% हा पत्ता कायमस्वरूपी पुरवला गेला. संदर्भ देताना पुस्तकाचे नाव व प्रकाशनवर्ष एकत्र देण्याकरिता
+% एक नवी आज्ञादेखील ह्यात घडवली आहे. त्याकरिता
+% \url{https://tex.stackexchange.com/a/284229/174620} ह्या उत्तराची मदत झाली.
+% \begin{macrocode}
+\definecolor{orcidcolor}{HTML}{a6ce39}
+\newcommand{\orcidlogo}{%
+ \ifछापील
+ \faIcon{orcid}
+ \else
+ \textcolor{orcidcolor}{\faIcon{orcid}}
+ \fi
+}%
+% \end{macrocode}
+% आलोक नियतकालिकातील लेखकांना ORCID वर नोंदणी करणे बंधनकारक आहे. आलोकच्या अंकात ORCID
+% क्रमांकांचा समावेश करण्यासाठी वरील आज्ञा समाविष्ट केल्या.
+% \begin{macrocode}
+\newfontfamily{\गोटू}[%
+Script=Devanagari,%
+Renderer=Harfbuzz,%
+Language=Marathi%
+]%
+{Gotu}
+\newfontfamily{\यशोमुद्रा}[%
+Path=सामग्री/टंक/यशोमुद्रा/,%
+Language=Marathi,%
+Script=Devanagari,%
+Renderer=Harfbuzz%
+]%
+{Yashomudra-Italic.ttf}
+\newfontfamily{\मुक्त}[%
+Path=सामग्री/टंक/मुक्त/,%
+Language=Marathi,%
+Script=Devanagari,%
+Renderer=Harfbuzz,%
+Color=लाल%
+]%
+{Mukta-Regular.ttf}
+% \end{macrocode}
+% आलोकच्या मुखपृष्ठावर वापरला गेलेला गोटू हा टंक, अनुक्रमणिकेतील तिरक्या अक्षरांसाठी लागणारा
+% यशोमुद्रा हा टंक व नित्यमुक्त परवान्याच्या संहितेत लागणारा मुक्त हा टंक वरील आज्ञांसह पुरवण्यात
+% आला आहे.
+% \begin{macrocode}
+\ifसुटालेख
+\else
+\RequirePackage{tocloft}
+\setlength\cftpartnumwidth{3em}
+\setlength\cftchapternumwidth{2em}
+\fi
+% \end{macrocode}
+% वरील आज्ञांसह अनुक्रमणिकेतील खंड, प्रकरण व त्यांचे क्रमांक ह्यांच्या अंतरात वाढ करण्यात आली आहे.
+% \begin{macrocode}
+\setlength{\columnsep}{0.5cm}
+% \end{macrocode}
+% दोन स्तंभांमधील अंतर वाढवण्यासाठी ह्या आज्ञेचा वापर करण्यात आला आहे.
+% \begin{macrocode}
+\tcbuselibrary{breakable}
+\ifछापील
+\tcbset{%
+ colframe=black,%
+ colback=white,%
+ fonttitle=\bfseries\Large,%
+ colupper=white!10!black,%
+ breakable,%
+ boxrule=0.5pt%
+}%
+\else
+\tcbset{%
+ colframe=black,%
+ colback=कागद,%
+ fonttitle=\bfseries\Large,%
+ colupper=white!10!black,%
+ breakable,%
+ boxrule=0.5pt%
+}%
+\fi
+% \end{macrocode}
+% अवांतर माहिती अथवा काही ठळक मुद्दे लिहिण्याकरिता \verb|tcolorbox| ह्या आज्ञासंचासह
+% पुढील प्राचलांचा वापर करून एक दृश्यरूप निश्चित केले गेले आहे.
+% \begin{macrocode}
+\addto\captionsmarathi{%
+ \renewcommand\glossaryname{परिभाषासूची}%
+ \renewcommand\appendixname{परिशिष्ट}%
+ \ifसुटालेख
+ \else
+ \renewcommand\chaptername{पुष्पदल}%
+ \renewcommand\appendixpagename{परिशिष्ट}%
+ \fi
+}%
+% \end{macrocode}
+% आलोकच्या अंकांना पुष्प म्हटले जाते, त्यामुळे त्यांतील लेखांना पुष्पदलाचे रूपक वापरले आहे. ते वरील
+% आज्ञेने पुरवले जाते. तसेच आणखी काही भाषांतरे वरील आज्ञांसह पुरवली आहेत.
+% \begin{macrocode}
+\RequirePackage{minitoc}
+\renewcommand{\mtctitle}{विषयसूची}
+\ifसुटालेख
+\else
+\dominitoc
+\fi
+\newcommand{\अनुक्रमणिका}{%
+ \ifसुटालेख
+ \tableofcontents
+ \else
+ \minitoc
+ \fi
+}%
+% \end{macrocode}
+% \verb|minitoc| हा आज्ञासंच प्रकरणांतर्गत अनुक्रमणिका तयार करण्यासाठी वापरला
+% जातो. त्या अनुक्रमणिकेस विषयसूची असे नाव वरील आज्ञेसह दिले आहे.
+% \begin{macrocode}
+\newcommand{\संदर्भसूची}{%
+ {\LARGE\section*{संदर्भसूची}}%
+ \printbibliography[heading=none]%
+}%
+% \end{macrocode}
+% संदर्भसूची चालू पानावरच येण्याकरिता ही आज्ञा घडवण्यात आली आहे.
+% \begin{macrocode}
+\sloppy
+\hyphenpenalty=10000
+\exhyphenpenalty=1000
+% \end{macrocode}
+% शब्द अयोग्यरित्या तुटू नयेत, म्हणून वरील आज्ञा वापरण्यात आल्या आहेत.
+% \begin{macrocode}
+\def\parsecomma#1,#2\endparsecomma{\def\page@x{#1}\def\page@y{#2}}
+\tikzdeclarecoordinatesystem{पृष्ठ}{%
+ \parsecomma#1\endparsecomma
+ \pgfpointanchor{current page}{north east}%
+ \pgf@xc=\pgf@x%
+ \pgf@yc=\pgf@y%
+ \pgfpointanchor{current page}{south west}%
+ \pgf@xb=\pgf@x%
+ \pgf@yb=\pgf@y%
+ \pgfmathparse{(\pgf@xc-\pgf@xb)/2.*\page@x+(\pgf@xc+\pgf@xb)/2.}%
+ \expandafter\pgf@x\expandafter=\pgfmathresult pt%
+ \pgfmathparse{(\pgf@yc-\pgf@yb)/2.*\page@y+(\pgf@yc+\pgf@yb)/2.}%
+ \expandafter\pgf@y\expandafter=\pgfmathresult pt%
+}%
+% \end{macrocode}
+% वरील आज्ञांसह \verb|tikzpicture| ह्या क्षेत्रासह मजकूर पानावर हवा तिथे छापता
+% येतो. हे साधण्याकरिता \url{https://tex.stackexchange.com/a/89592/174620} ह्या
+% उत्तराची मदत झाली.
+% \begin{macrocode}
+\ifसुटालेख
+\pagestyle{fancy}
+\renewcommand{\footrulewidth}{\headrulewidth}
+\lhead{\raisebox{0.2cm}{\लेखाचेनाव}}
+\rhead{\raisebox{0.2cm}{\अभ्यासकाचेनाव, \कोणतेप्रकाशनवर्ष}}
+\lfoot{{\गोटू ।। आलोक ।।}}
+\cfoot{\thepage}
+\rfoot{{\गोटू पुष्प \पुष्पसंख्या}}
+\else
+\makepagestyle{शीर्षके}
+\makeheadrule{शीर्षके}{\textwidth}{0.5pt}
+\makefootrule{शीर्षके}{\textwidth}{0.5pt}{0pt}
+\ifछापील
+\makeevenhead{शीर्षके}{\raisebox{0.2cm}{\rightmark}}
+{}
+{\raisebox{0.2cm}{\leftmark}}
+\makeoddhead{शीर्षके}{\raisebox{0.2cm}{\leftmark}}
+{}
+{\raisebox{0.2cm}{\rightmark}}%
+\makeevenfoot{शीर्षके}%
+{\raisebox{-0.2cm}{\गोटू पुष्प \पुष्पसंख्या}}%
+{\raisebox{-0.2cm}{\thepage}}%
+{\raisebox{-0.2cm}{\गोटू ।। आलोक ।।}}
+\makeoddfoot{शीर्षके}%
+{\raisebox{-0.2cm}{\गोटू ।। आलोक ।।}}%
+{\raisebox{-0.2cm}{\thepage}}%
+{\raisebox{-0.2cm}{\गोटू पुष्प \पुष्पसंख्या}}
+\else
+\makeoddhead{शीर्षके}
+{\raisebox{0.2cm}{\leftmark}}
+{}%
+{\raisebox{0.2cm}{\rightmark}}
+\makeoddfoot{शीर्षके}%
+{\raisebox{-0.2cm}{\गोटू ।। आलोक ।।}}%
+{\raisebox{-0.2cm}{\thepage}}%
+{\raisebox{-0.2cm}{\गोटू पुष्प \पुष्पसंख्या}}
+\makepsmarks{शीर्षके}{%
+ \createmark{chapter}{left}{shownumber}{\@chapapp\space}{.\ }
+ \createmark{section}{right}{shownumber}{}{.\ }
+ \createplainmark{toc}{both}{\contentsname}
+ \createplainmark{lof}{both}{\listfigurename}
+ \createplainmark{lot}{both}{\listtablename}
+ \createplainmark{bib}{both}{\bibname}
+ \createplainmark{index}{both}{\indexname}
+ \createplainmark{glossary}{both}{\glossaryname}
+}%
+\fi
+\fi
+% \end{macrocode}
+% वरील आज्ञांसह |शीर्षके| ही पृष्ठमांडणीची नवीन शैली घडवण्यात आली. ही तयार करण्याकरिता
+% सॅमकार्टर ह्यांच्या
+% \url{https://topanswers.xyz/transcript?room=1565&id=83664#c83664} ह्या
+% उत्तराची मदत झाली.
+% \begin{macrocode}
+\newcommand{\शीर्षक}
+{%
+ \frontmatter
+ \onecolumn
+ {%
+ \गोटू
+ \pagenumbering{gobble}
+ \pagecolor{निळा}
+ \begin{tikzpicture}[remember picture, overlay]
+ \node[align=center,text width=\textwidth,color=सोनेरी] at (पृष्ठ cs:0,0) {%
+ \begin{tabular}{c}
+ {\HUGE ।। आलोक ।।}\\
+ \\
+ \\
+ {\Large पुष्प \पुष्पसंख्या}
+ \\
+ \\
+ \phantom{\Large \कोणतादिनांक}\\
+ \end{tabular}
+ };%
+ \end{tikzpicture}
+
+ \clearpage
+% \end{macrocode}
+% आलोक लाटेक्-वर्गाच्या आवृत्ती ०.१मध्ये छापील आवृत्तीच्या पृष्ठांनादेखील रंग असे व त्यामुळे छापताना
+% कागदावर त्या रंगाऐवजी राखाडी रंग दिसत असे. ही त्रुटी सुशान्त देवळेकरांनी लाटेक्-वर्गाच्या
+% गिट-पृष्ठाच्या अडचणींमध्ये नोंदवली (पाहा:
+% https://gitlab.com/aalok/aalok-latex/-/issues/1) आमची ही त्रुटी आम्ही आवृत्ती
+% ०.२मध्ये पुढील काही आज्ञांसह दुरुस्त करत आहोत.
+% \begin{macrocode}
+ \ifछापील
+ \pagecolor{white}
+ \newpage\null\newpage
+ \else
+ \pagecolor{कागद}
+ \newpage
+ \fi
+ \begin{tikzpicture}[remember picture,overlay,every node/.style={anchor=center}]
+ \node[align=center,text width=\textwidth,color=black] at (पृष्ठ cs:0,0.75) {%
+ {\Large शास्त्रचर्चेस वाहिलेले पहिले मुक्त मराठी नियतकालिक}
+ };%
+ \node[align=center,text width=\textwidth,color=black] at (पृष्ठ cs:0,0) {%
+ \begin{tabular}{c}
+ {\HUGE ।। आलोक ।।}\\
+ \\
+ \\
+ {\Large पुष्प \पुष्पसंख्या}
+ \\
+ \\
+ {\Large \कोणतादिनांक, \कोणतेप्रकाशनवर्ष}\\
+ \end{tabular}
+ };%
+ \node[align=center,text width=\textwidth,color=black] at (पृष्ठ cs:0,-0.75)
+ {%
+ \ifखासगीवितरण
+ खासगी वितरणासाठी
+ \else
+ \includegraphics[width=2.5cm,height=3cm]{सामग्री/छायाचित्रे/बोधचिन्ह-काळे}
+ \fi
+ };%
+ \end{tikzpicture}
+ }%
+ \clearpage
+ \अंतरबदल{1.5}
+ \begin{paracol}{2}
+ \setlength{\parindent}{0pt}
+ \begin{tabular}{l}
+ \textbf{\underline{\Large संपादक}}\\
+ निरंजन, ऋषिकेश\\
+ \end{tabular}
+
+ \bigskip
+ \begin{tabular}{l}
+ \textbf{\underline{\Large अक्षरजुळणी}}\\
+ निरंजन, ऋषिकेश\\
+ \href{https://gitlab.com/aalok/aalok/आलोक/पुष्प/\पुष्पसंख्या}%
+ {\small\ttfamily https://gitlab.com/aalok/aalok/{\normalfont\footnotesize
+ आलोक/पुष्प/\पुष्पसंख्या}}\\
+ {\small (लाटेक् बीज)}\\
+ \end{tabular}
+
+ \bigskip
+ \begin{tabular}{l}
+ \textbf{\underline{\Large प्रकाशक}}\\
+ वर्णमुद्रा पब्लिशर्स (\url{https://varnamudra.com})\\
+ पृथक् रामकृष्ण सोसायटी,\\
+ एसबीआय कॉलनी, शेगाव.\\
+ बुलढाणा ४४४२०३\\
+ \end{tabular}
+
+ \bigskip
+ \begin{tabular}{l}
+ \textbf{\underline{\Large विशेष साहाय्य}}\\
+ ब्रिज ऑफ टेल्स (मर्यादित दायित्व भागीदारी)\\
+ (\url{https://bridgeoftales.com})\\
+ \end{tabular}
+
+ \switchcolumn
+ {%
+ \large\bfseries
+ \कितवीआवृत्ती\ आवृत्ती
+
+ \कोणतीतिथी
+
+ \कोणतादिनांक, \कोणतेप्रकाशनवर्ष
+
+ \विद्वान\ ह्यांच्या \कितवीजयंती व्या जयंतीनिमित्त.
+ }%
+
+ \medskip
+ \copyright\ \कोणतेप्रकाशनवर्ष\ आलोक मराठी नियतकालिक
+
+ \medskip
+ ह्या सामग्रीच्या वितरणाचे व प्रतिमुद्रणाचे अधिकार आलोक नित्यमुक्त परवान्यासह मुक्त करण्यात येत
+ आहेत. ह्या सामग्रीची यथामूल अथवा परिवर्तित प्रतिमुद्रणे व्यावसायिक अथवा अव्यावसायिक
+ स्वरूपात वितरित करण्यास प्रतिमुद्राधिकारधारक संमती देत आहे, परंतु असे करताना वितरकाने
+ प्रतिमुद्राधिकारांचा योग्य श्रेयनिर्देश करणे व सामग्री परिवर्तित असल्यास ती ह्याच अटींसह
+ वितरित करणे बंधनकारक आहे. ह्या (व ह्यावर आधारित) सामग्रीचे अमुक्त वितरण बेकायदेशीर मानले
+ जाईल. आलोक नित्यमुक्त परवान्याचा संपूर्ण मसुदा पुढील दुव्यावर वाचा अथवा
+ \autoref{परवाना} पाहा.
+
+ \medskip
+ \noindent\href{https://gitlab.com/aalok/nityamukta-parwana/आलोक-नित्यमुक्त-परवाना.txt}
+ {\ttfamily https://gitlab.com/aalok/nityamukta-parwana/{\normalfont\small
+ आलोक-नित्यमुक्त-परवाना}.txt}
+ \end{paracol}
+
+ \vspace{0.5in}
+
+ \begin{paracol}{2}
+ \ifखासगीवितरण
+ {%
+ \begin{tabular}{p{2.2cm}l}
+ \multicolumn{2}{l}{\large\bfseries केवळ खासगी वितरणाकरिता.}\\
+ \textbf{\large स्वागतमूल्य} & \textbf{\faIcon{rupee-sign} \large \आकडीमूल्यकिती/-}\\
+ & \अक्षरीमूल्यकिती\ रुपये फक्त.\\
+ \end{tabular}
+ }%
+ \else
+ \ifछापील
+ \begin{tabular}{p{0.75cm}l}
+ \textbf{\large मूल्य} & \textbf{\faIcon{rupee-sign} \large \आकडीमूल्यकिती/-}\\
+ & \अक्षरीमूल्यकिती\ रुपये फक्त.\\
+ \end{tabular}
+ \else
+ \begin{tabular}{lll}
+ \multicolumn{3}{l}{\large\bfseries ह्या प्रकल्पास आर्थिक साहाय्य करण्याकरिता}
+ \medskip\\
+ बँक खाते क्रमांक & - & ५०२०००४७६२७११४\\
+ आयएफएससी क्रमांक & - & HDFC\(0002817\)
+ \bigskip\\
+ \hline
+ \multicolumn{3}{l}{ह्या अंकाच्या छापील प्रतीकरिता आम्हाला पुढील पत्त्यांवर
+ इ-पत्राद्वारे संपर्क साधा.}\\
+ \multicolumn{3}{l}{\href{mailto:aalokmarathi@protonmail.com}{\faIcon[regular]{envelope}\quad
+ \ttfamily aalokmarathi@protonmail.com},
+ \href{mailto:varnamudra.editors@gmail.com}{\ttfamily
+ varnamudra.editors@gmail.com}}\\
+ \end{tabular}
+ \fi
+ \fi
+ \switchcolumn
+ \textbf{\large आमच्यापर्यंत कसे पोहोचाल?}
+
+ \medskip
+
+ \href{https://varnamudra.com/aalok/}{\faIcon{globe}\quad
+ \ttfamily https://varnamudra.com/aalok}
+
+ \medskip \href{https://www.gitlab.com/aalok}{\faIcon{gitlab}\quad
+ \ttfamily https://www.gitlab.com/aalok}
+
+ \end{paracol}
+
+ \clearpage\pagebreak
+}%
+% \end{macrocode}
+% ह्या आज्ञांसह \verb|शीर्षक| आज्ञेची सामग्री पुरवली गेली.
+% \begin{macrocode}
+\newcommand{\लेखाचेशीर्षक}{%
+ \ifसुटालेख
+ \title{\लेखाचेनाव}
+ \author{%
+ \अभ्यासकाचेनाव\\
+ \small\orcidlogo\quad\url{https://orcid.org/\orcidno}\\
+ \href{mailto:\अभ्यासकाचाइपत्तादुवा}{\small\faIcon[regular]{envelope}\quad\ttfamily\अभ्यासकाचाइपत्तापाठ्य}
+ }%
+ \date{%
+ {\small\गोटू ।। आलोक ।।}\\
+ {\small\गोटू पुष्प \पुष्पसंख्या}\\
+ {\small\गोटू \कोणतादिनांक, \कोणतेप्रकाशनवर्ष}\\
+ }%
+ \maketitle
+ \pagecolor{कागद}
+ \else
+ \cleardoublepage\onecolumn
+ \thispagestyle{empty}
+ \vspace*{\fill}
+ \noindent\makebox[\textwidth][c]{%
+ \begin{minipage}{0.6\textwidth}
+ \centering
+ \hrule
+
+ \medskip
+ {%
+ \LARGE\bfseries
+ \लेखाचेनाव
+ }\\[3ex]%
+ \अभ्यासकाचेनाव\\
+ \orcidlogo\quad\url{https://orcid.org/\orcidno}\\[1ex]
+ \href{mailto:\अभ्यासकाचाइपत्तादुवा}{\faIcon[regular]{envelope}\quad\ttfamily\अभ्यासकाचाइपत्तापाठ्य}
+ \medskip
+ \hrule
+ \end{minipage}
+ }%
+ \vfill
+ \clearpage
+ \twocolumn
+ \chapter{\लेखाचेनाव}
+ \chapterprecistoc{%
+ \hfill
+ - {\यशोमुद्रा\अभ्यासकाचेनाव}
+ }%
+ \fi
+}%
+% \end{macrocode}
+% वरील आज्ञांसह \verb|\लेखाचेेशीर्षक| ही आज्ञा घडवण्यात आली आहे.
+% \begin{macrocode}
+\ifसुटालेख
+\AtEndDocument{%
+ \clearpage
+ \pagebreak
+ \setlength{\parindent}{0pt}
+
+ \section*{ह्या सामग्रीचा संदर्भ कसा द्याल?}
+
+ \fullcite{आलोक\jobname}
+
+ \subsection*{बिबटेक् आज्ञावली}
+ {%
+ \ttfamily
+ $@$article\{{\normalfont आलोक\jobname},\\
+ author=\{{\normalfont\अभ्यासकाचेनाव}\},\\
+ title=\{{\normalfont\लेखाचेनाव}\},\\
+ journaltitle=\{{\normalfont आलोक मराठी नियतकालिक}\},\\
+ date=\{{\normalfont\कोणतेप्रकाशनवर्ष-\दिनांकआकडी}\},\\
+ series=\{{\normalfont\पुष्पसंख्याआकडी}\},\\
+ note=\{{\normalfont बुलढाणा : वर्णमुद्रा प्रकाशन}\}\\
+ \}
+ }%
+}%
+\else
+\fi
+% \end{macrocode}
+% वरील आज्ञांसह सुट्या लेखांच्या शेवटी संदर्भ कसा द्यावा ह्याविषयीची नोंद लिहिण्यात आली आहे.
+% \begin{macrocode}
+%</class>
+% \end{macrocode}
+% \end{implementation}
+% \pagebreak
+% \phantomsection
+% \addcontentsline{toc}{section}{\fontfamily{lmtt}\selectfont GNU Free Documentation License}
+% {%
+% \fontfamily{lmtt}\selectfont
+%
+% \section*{\centering\fontfamily{lmr}\selectfont GNU Free Documentation
+% License}
+% \begin{center}
+%
+% Version 1.3, 3 November 2008
+%
+%
+% Copyright \copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+%
+% \bigskip
+%
+% \texttt{<https://fsf.org/>}
+%
+% \bigskip
+%
+% Everyone is permitted to copy and distribute verbatim copies
+% of this license document, but changing it is not allowed.
+% \end{center}
+%
+%
+% \begin{center}
+% {\bf\large Preamble}
+% \end{center}
+%
+% The purpose of this License is to make a manual, textbook, or other
+% functional and useful document ``free'' in the sense of freedom: to
+% assure everyone the effective freedom to copy and redistribute it,
+% with or without modifying it, either commercially or noncommercially.
+% Secondarily, this License preserves for the author and publisher a way
+% to get credit for their work, while not being considered responsible
+% for modifications made by others.
+%
+% This License is a kind of ``copyleft'', which means that derivative
+% works of the document must themselves be free in the same sense. It
+% complements the GNU General Public License, which is a copyleft
+% license designed for free software.
+%
+% We have designed this License in order to use it for manuals for free
+% software, because free software needs free documentation: a free
+% program should come with manuals providing the same freedoms that the
+% software does. But this License is not limited to software manuals;
+% it can be used for any textual work, regardless of subject matter or
+% whether it is published as a printed book. We recommend this License
+% principally for works whose purpose is instruction or reference.
+%
+%
+% \begin{center}
+% {\Large\bf 1. APPLICABILITY AND DEFINITIONS\par}
+% \end{center}
+%
+% This License applies to any manual or other work, in any medium, that
+% contains a notice placed by the copyright holder saying it can be
+% distributed under the terms of this License. Such a notice grants a
+% world-wide, royalty-free license, unlimited in duration, to use that
+% work under the conditions stated herein. The ``\textbf{Document}'', below,
+% refers to any such manual or work. Any member of the public is a
+% licensee, and is addressed as ``\textbf{you}''. You accept the license if you
+% copy, modify or distribute the work in a way requiring permission
+% under copyright law.
+%
+% A ``\textbf{Modified Version}'' of the Document means any work containing the
+% Document or a portion of it, either copied verbatim, or with
+% modifications and/or translated into another language.
+%
+% A ``\textbf{Secondary Section}'' is a named appendix or a front-matter section of
+% the Document that deals exclusively with the relationship of the
+% publishers or authors of the Document to the Document's overall subject
+% (or to related matters) and contains nothing that could fall directly
+% within that overall subject. (Thus, if the Document is in part a
+% textbook of mathematics, a Secondary Section may not explain any
+% mathematics.) The relationship could be a matter of historical
+% connection with the subject or with related matters, or of legal,
+% commercial, philosophical, ethical or political position regarding
+% them.
+%
+% The ``\textbf{Invariant Sections}'' are certain Secondary Sections whose titles
+% are designated, as being those of Invariant Sections, in the notice
+% that says that the Document is released under this License. If a
+% section does not fit the above definition of Secondary then it is not
+% allowed to be designated as Invariant. The Document may contain zero
+% Invariant Sections. If the Document does not identify any Invariant
+% Sections then there are none.
+%
+% The ``\textbf{Cover Texts}'' are certain short passages of text that are listed,
+% as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+% the Document is released under this License. A Front-Cover Text may
+% be at most 5 words, and a Back-Cover Text may be at most 25 words.
+%
+% A ``\textbf{Transparent}'' copy of the Document means a machine-readable copy,
+% represented in a format whose specification is available to the
+% general public, that is suitable for revising the document
+% straightforwardly with generic text editors or (for images composed of
+% pixels) generic paint programs or (for drawings) some widely available
+% drawing editor, and that is suitable for input to text formatters or
+% for automatic translation to a variety of formats suitable for input
+% to text formatters. A copy made in an otherwise Transparent file
+% format whose markup, or absence of markup, has been arranged to thwart
+% or discourage subsequent modification by readers is not Transparent.
+% An image format is not Transparent if used for any substantial amount
+% of text. A copy that is not ``Transparent'' is called ``\textbf{Opaque}''.
+%
+% Examples of suitable formats for Transparent copies include plain
+% ASCII without markup, Texinfo input format, LaTeX input format, SGML
+% or XML using a publicly available DTD, and standard-conforming simple
+% HTML, PostScript or PDF designed for human modification. Examples of
+% transparent image formats include PNG, XCF and JPG. Opaque formats
+% include proprietary formats that can be read and edited only by
+% proprietary word processors, SGML or XML for which the DTD and/or
+% processing tools are not generally available, and the
+% machine-generated HTML, PostScript or PDF produced by some word
+% processors for output purposes only.
+%
+% The ``\textbf{Title Page}'' means, for a printed book, the title page itself,
+% plus such following pages as are needed to hold, legibly, the material
+% this License requires to appear in the title page. For works in
+% formats which do not have any title page as such, ``Title Page'' means
+% the text near the most prominent appearance of the work's title,
+% preceding the beginning of the body of the text.
+%
+% The ``\textbf{publisher}'' means any person or entity that distributes
+% copies of the Document to the public.
+%
+% A section ``\textbf{Entitled XYZ}'' means a named subunit of the Document whose
+% title either is precisely XYZ or contains XYZ in parentheses following
+% text that translates XYZ in another language. (Here XYZ stands for a
+% specific section name mentioned below, such as ``\textbf{Acknowledgements}'',
+% ``\textbf{Dedications}'', ``\textbf{Endorsements}'', or ``\textbf{History}''.)
+% To ``\textbf{Preserve the Title}''
+% of such a section when you modify the Document means that it remains a
+% section ``Entitled XYZ'' according to this definition.
+%
+% The Document may include Warranty Disclaimers next to the notice which
+% states that this License applies to the Document. These Warranty
+% Disclaimers are considered to be included by reference in this
+% License, but only as regards disclaiming warranties: any other
+% implication that these Warranty Disclaimers may have is void and has
+% no effect on the meaning of this License.
+%
+%
+% \begin{center}
+% {\Large\bf 2. VERBATIM COPYING\par}
+% \end{center}
+%
+% You may copy and distribute the Document in any medium, either
+% commercially or noncommercially, provided that this License, the
+% copyright notices, and the license notice saying this License applies
+% to the Document are reproduced in all copies, and that you add no other
+% conditions whatsoever to those of this License. You may not use
+% technical measures to obstruct or control the reading or further
+% copying of the copies you make or distribute. However, you may accept
+% compensation in exchange for copies. If you distribute a large enough
+% number of copies you must also follow the conditions in section~3.
+%
+% You may also lend copies, under the same conditions stated above, and
+% you may publicly display copies.
+%
+%
+% \begin{center}
+% {\Large\bf 3. COPYING IN QUANTITY\par}
+% \end{center}
+%
+%
+% If you publish printed copies (or copies in media that commonly have
+% printed covers) of the Document, numbering more than 100, and the
+% Document's license notice requires Cover Texts, you must enclose the
+% copies in covers that carry, clearly and legibly, all these Cover
+% Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+% the back cover. Both covers must also clearly and legibly identify
+% you as the publisher of these copies. The front cover must present
+% the full title with all words of the title equally prominent and
+% visible. You may add other material on the covers in addition.
+% Copying with changes limited to the covers, as long as they preserve
+% the title of the Document and satisfy these conditions, can be treated
+% as verbatim copying in other respects.
+%
+% If the required texts for either cover are too voluminous to fit
+% legibly, you should put the first ones listed (as many as fit
+% reasonably) on the actual cover, and continue the rest onto adjacent
+% pages.
+%
+% If you publish or distribute Opaque copies of the Document numbering
+% more than 100, you must either include a machine-readable Transparent
+% copy along with each Opaque copy, or state in or with each Opaque copy
+% a computer-network location from which the general network-using
+% public has access to download using public-standard network protocols
+% a complete Transparent copy of the Document, free of added material.
+% If you use the latter option, you must take reasonably prudent steps,
+% when you begin distribution of Opaque copies in quantity, to ensure
+% that this Transparent copy will remain thus accessible at the stated
+% location until at least one year after the last time you distribute an
+% Opaque copy (directly or through your agents or retailers) of that
+% edition to the public.
+%
+% It is requested, but not required, that you contact the authors of the
+% Document well before redistributing any large number of copies, to give
+% them a chance to provide you with an updated version of the Document.
+%
+%
+% \begin{center}
+% {\Large\bf 4. MODIFICATIONS\par}
+% \end{center}
+%
+% You may copy and distribute a Modified Version of the Document under
+% the conditions of sections 2 and 3 above, provided that you release
+% the Modified Version under precisely this License, with the Modified
+% Version filling the role of the Document, thus licensing distribution
+% and modification of the Modified Version to whoever possesses a copy
+% of it. In addition, you must do these things in the Modified Version:
+%
+% \begin{itemize}
+% \item[A.]
+% Use in the Title Page (and on the covers, if any) a title distinct
+% from that of the Document, and from those of previous versions
+% (which should, if there were any, be listed in the History section
+% of the Document). You may use the same title as a previous version
+% if the original publisher of that version gives permission.
+%
+% \item[B.]
+% List on the Title Page, as authors, one or more persons or entities
+% responsible for authorship of the modifications in the Modified
+% Version, together with at least five of the principal authors of the
+% Document (all of its principal authors, if it has fewer than five),
+% unless they release you from this requirement.
+%
+% \item[C.]
+% State on the Title page the name of the publisher of the
+% Modified Version, as the publisher.
+%
+% \item[D.]
+% Preserve all the copyright notices of the Document.
+%
+% \item[E.]
+% Add an appropriate copyright notice for your modifications
+% adjacent to the other copyright notices.
+%
+% \item[F.]
+% Include, immediately after the copyright notices, a license notice
+% giving the public permission to use the Modified Version under the
+% terms of this License, in the form shown in the Addendum below.
+%
+% \item[G.]
+% Preserve in that license notice the full lists of Invariant Sections
+% and required Cover Texts given in the Document's license notice.
+%
+% \item[H.]
+% Include an unaltered copy of this License.
+%
+% \item[I.]
+% Preserve the section Entitled ``History'', Preserve its Title, and add
+% to it an item stating at least the title, year, new authors, and
+% publisher of the Modified Version as given on the Title Page. If
+% there is no section Entitled ``History'' in the Document, create one
+% stating the title, year, authors, and publisher of the Document as
+% given on its Title Page, then add an item describing the Modified
+% Version as stated in the previous sentence.
+%
+% \item[J.]
+% Preserve the network location, if any, given in the Document for
+% public access to a Transparent copy of the Document, and likewise
+% the network locations given in the Document for previous versions
+% it was based on. These may be placed in the ``History'' section.
+% You may omit a network location for a work that was published at
+% least four years before the Document itself, or if the original
+% publisher of the version it refers to gives permission.
+%
+% \item[K.]
+% For any section Entitled ``Acknowledgements'' or ``Dedications'',
+% Preserve the Title of the section, and preserve in the section all
+% the substance and tone of each of the contributor acknowledgements
+% and/or dedications given therein.
+%
+% \item[L.]
+% Preserve all the Invariant Sections of the Document,
+% unaltered in their text and in their titles. Section numbers
+% or the equivalent are not considered part of the section titles.
+%
+% \item[M.]
+% Delete any section Entitled ``Endorsements''. Such a section
+% may not be included in the Modified Version.
+%
+% \item[N.]
+% Do not retitle any existing section to be Entitled ``Endorsements''
+% or to conflict in title with any Invariant Section.
+%
+% \item[O.]
+% Preserve any Warranty Disclaimers.
+% \end{itemize}
+%
+% If the Modified Version includes new front-matter sections or
+% appendices that qualify as Secondary Sections and contain no material
+% copied from the Document, you may at your option designate some or all
+% of these sections as invariant. To do this, add their titles to the
+% list of Invariant Sections in the Modified Version's license notice.
+% These titles must be distinct from any other section titles.
+%
+% You may add a section Entitled ``Endorsements'', provided it contains
+% nothing but endorsements of your Modified Version by various
+% parties---for example, statements of peer review or that the text has
+% been approved by an organization as the authoritative definition of a
+% standard.
+%
+% You may add a passage of up to five words as a Front-Cover Text, and a
+% passage of up to 25 words as a Back-Cover Text, to the end of the list
+% of Cover Texts in the Modified Version. Only one passage of
+% Front-Cover Text and one of Back-Cover Text may be added by (or
+% through arrangements made by) any one entity. If the Document already
+% includes a cover text for the same cover, previously added by you or
+% by arrangement made by the same entity you are acting on behalf of,
+% you may not add another; but you may replace the old one, on explicit
+% permission from the previous publisher that added the old one.
+%
+% The author(s) and publisher(s) of the Document do not by this License
+% give permission to use their names for publicity for or to assert or
+% imply endorsement of any Modified Version.
+%
+%
+% \begin{center}
+% {\Large\bf 5. COMBINING DOCUMENTS\par}
+% \end{center}
+%
+%
+% You may combine the Document with other documents released under this
+% License, under the terms defined in section~4 above for modified
+% versions, provided that you include in the combination all of the
+% Invariant Sections of all of the original documents, unmodified, and
+% list them all as Invariant Sections of your combined work in its
+% license notice, and that you preserve all their Warranty Disclaimers.
+%
+% The combined work need only contain one copy of this License, and
+% multiple identical Invariant Sections may be replaced with a single
+% copy. If there are multiple Invariant Sections with the same name but
+% different contents, make the title of each such section unique by
+% adding at the end of it, in parentheses, the name of the original
+% author or publisher of that section if known, or else a unique number.
+% Make the same adjustment to the section titles in the list of
+% Invariant Sections in the license notice of the combined work.
+%
+% In the combination, you must combine any sections Entitled ``History''
+% in the various original documents, forming one section Entitled
+% ``History''; likewise combine any sections Entitled ``Acknowledgements'',
+% and any sections Entitled ``Dedications''. You must delete all sections
+% Entitled ``Endorsements''.
+%
+% \begin{center}
+% {\Large\bf 6. COLLECTIONS OF DOCUMENTS\par}
+% \end{center}
+%
+% You may make a collection consisting of the Document and other documents
+% released under this License, and replace the individual copies of this
+% License in the various documents with a single copy that is included in
+% the collection, provided that you follow the rules of this License for
+% verbatim copying of each of the documents in all other respects.
+%
+% You may extract a single document from such a collection, and distribute
+% it individually under this License, provided you insert a copy of this
+% License into the extracted document, and follow this License in all
+% other respects regarding verbatim copying of that document.
+%
+%
+% \begin{center}
+% {\Large\bf 7. AGGREGATION WITH INDEPENDENT WORKS\par}
+% \end{center}
+%
+%
+% A compilation of the Document or its derivatives with other separate
+% and independent documents or works, in or on a volume of a storage or
+% distribution medium, is called an ``aggregate'' if the copyright
+% resulting from the compilation is not used to limit the legal rights
+% of the compilation's users beyond what the individual works permit.
+% When the Document is included in an aggregate, this License does not
+% apply to the other works in the aggregate which are not themselves
+% derivative works of the Document.
+%
+% If the Cover Text requirement of section~3 is applicable to these
+% copies of the Document, then if the Document is less than one half of
+% the entire aggregate, the Document's Cover Texts may be placed on
+% covers that bracket the Document within the aggregate, or the
+% electronic equivalent of covers if the Document is in electronic form.
+% Otherwise they must appear on printed covers that bracket the whole
+% aggregate.
+%
+%
+% \begin{center}
+% {\Large\bf 8. TRANSLATION\par}
+% \end{center}
+%
+%
+% Translation is considered a kind of modification, so you may
+% distribute translations of the Document under the terms of section~4.
+% Replacing Invariant Sections with translations requires special
+% permission from their copyright holders, but you may include
+% translations of some or all Invariant Sections in addition to the
+% original versions of these Invariant Sections. You may include a
+% translation of this License, and all the license notices in the
+% Document, and any Warranty Disclaimers, provided that you also include
+% the original English version of this License and the original versions
+% of those notices and disclaimers. In case of a disagreement between
+% the translation and the original version of this License or a notice
+% or disclaimer, the original version will prevail.
+%
+% If a section in the Document is Entitled ``Acknowledgements'',
+% ``Dedications'', or ``History'', the requirement (section~4) to Preserve
+% its Title (section~1) will typically require changing the actual
+% title.
+%
+%
+% \begin{center}
+% {\Large\bf 9. TERMINATION\par}
+% \end{center}
+%
+%
+% You may not copy, modify, sublicense, or distribute the Document
+% except as expressly provided under this License. Any attempt
+% otherwise to copy, modify, sublicense, or distribute it is void, and
+% will automatically terminate your rights under this License.
+%
+% However, if you cease all violation of this License, then your license
+% from a particular copyright holder is reinstated (a) provisionally,
+% unless and until the copyright holder explicitly and finally
+% terminates your license, and (b) permanently, if the copyright holder
+% fails to notify you of the violation by some reasonable means prior to
+% 60 days after the cessation.
+%
+% Moreover, your license from a particular copyright holder is
+% reinstated permanently if the copyright holder notifies you of the
+% violation by some reasonable means, this is the first time you have
+% received notice of violation of this License (for any work) from that
+% copyright holder, and you cure the violation prior to 30 days after
+% your receipt of the notice.
+%
+% Termination of your rights under this section does not terminate the
+% licenses of parties who have received copies or rights from you under
+% this License. If your rights have been terminated and not permanently
+% reinstated, receipt of a copy of some or all of the same material does
+% not give you any rights to use it.
+%
+%
+% \begin{center}
+% {\Large\bf 10. FUTURE REVISIONS OF THIS LICENSE\par}
+% \end{center}
+%
+%
+% The Free Software Foundation may publish new, revised versions
+% of the GNU Free Documentation License from time to time. Such new
+% versions will be similar in spirit to the present version, but may
+% differ in detail to address new problems or concerns. See
+% \texttt{https://www.gnu.org/licenses/}.
+%
+% Each version of the License is given a distinguishing version number.
+% If the Document specifies that a particular numbered version of this
+% License ``or any later version'' applies to it, you have the option of
+% following the terms and conditions either of that specified version or
+% of any later version that has been published (not as a draft) by the
+% Free Software Foundation. If the Document does not specify a version
+% number of this License, you may choose any version ever published (not
+% as a draft) by the Free Software Foundation. If the Document
+% specifies that a proxy can decide which future versions of this
+% License can be used, that proxy's public statement of acceptance of a
+% version permanently authorizes you to choose that version for the
+% Document.
+%
+%
+% \begin{center}
+% {\Large\bf 11. RELICENSING\par}
+% \end{center}
+%
+%
+% ``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+% World Wide Web server that publishes copyrightable works and also
+% provides prominent facilities for anybody to edit those works. A
+% public wiki that anybody can edit is an example of such a server. A
+% ``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+% site means any set of copyrightable works thus published on the MMC
+% site.
+%
+% ``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+% license published by Creative Commons Corporation, a not-for-profit
+% corporation with a principal place of business in San Francisco,
+% California, as well as future copyleft versions of that license
+% published by that same organization.
+%
+% ``Incorporate'' means to publish or republish a Document, in whole or
+% in part, as part of another Document.
+%
+% An MMC is ``eligible for relicensing'' if it is licensed under this
+% License, and if all works that were first published under this License
+% somewhere other than this MMC, and subsequently incorporated in whole
+% or in part into the MMC, (1) had no cover texts or invariant sections,
+% and (2) were thus incorporated prior to November 1, 2008.
+%
+% The operator of an MMC Site may republish an MMC contained in the site
+% under CC-BY-SA on the same site at any time before August 1, 2009,
+% provided the MMC is eligible for relicensing.
+%
+%
+% \begin{center}
+% {\Large\bf ADDENDUM: How to use this License for your documents\par}
+% \end{center}
+%
+% To use this License in a document you have written, include a copy of
+% the License in the document and put the following copyright and
+% license notices just after the title page:
+%
+% \bigskip
+% \begin{quote}
+% Copyright \copyright{} YEAR YOUR NAME.
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.3
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% A copy of the license is included in the section entitled ``GNU
+% Free Documentation License''.
+% \end{quote}
+% \bigskip
+%
+% If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+% replace the ``with \dots\ Texts.''\ line with this:
+%
+% \bigskip
+% \begin{quote}
+% with the Invariant Sections being LIST THEIR TITLES, with the
+% Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+% \end{quote}
+% \bigskip
+%
+% If you have Invariant Sections without Cover Texts, or some other
+% combination of the three, merge those two alternatives to suit the
+% situation.
+%
+% If your document contains nontrivial examples of program code, we
+% recommend releasing these examples in parallel under your choice of
+% free software license, such as the GNU General Public License,
+% to permit their use in free software.
+% }%
+% \Finale \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/aalok/aalok.ins b/Master/texmf-dist/source/latex/aalok/aalok.ins
new file mode 100644
index 00000000000..2bde4e14115
--- /dev/null
+++ b/Master/texmf-dist/source/latex/aalok/aalok.ins
@@ -0,0 +1,79 @@
+% File: aalok.ins
+\input l3docstrip.tex
+
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+--------------------------------------------------------------------------
+लाटेक्-वर्ग आलोक आवृत्ती ०.१
+© २०२१ निरंजन, आलोक मराठी नियतकालिक
+
+ह्या सामग्रीच्या वितरणाचे व प्रतिमुद्रणाचे अधिकार आलोक नित्यमुक्त परवान्यासह मुक्त करण्यात येत
+आहेत. ह्या सामग्रीची यथामूल अथवा परिवर्तित प्रतिमुद्रणे व्यावसायिक अथवा अव्यावसायिक स्वरूपात
+वितरित करण्यास प्रतिमुद्राधिकारधारक संमती देत आहे, परंतु असे करताना वितरकाने
+प्रतिमुद्राधिकारांचा योग्य श्रेयनिर्देश करणे व सामग्री परिवर्तित असल्यास ती ह्याच अटींसह वितरित
+करणे बंधनकारक आहे. ही सामग्री जशी आहे तशी पुरवण्यात येत आहे, पुरवणारा/पुरवणारी हिच्याबाबत
+कोणतीही हमी देत नाही. ह्या (व ह्यावर आधारित) सामग्रीचे अमुक्त वितरण बेकायदेशीर मानले
+जाईल. आलोक नित्यमुक्त परवान्याचा संपूर्ण मसुदा पुढील दुव्यावर वाचता येईल.
+
+https://gitlab.com/aalok/nityamukta-parwana
+--------------------------------------------------------------------------
+LaTeX Class aalok v0.1
+© 2021 Niranjan, Aalok Marathi Niyatkalik
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <https://www.gnu.org/licenses/>.
+--------------------------------------------------------------------------
+लाटेक्-वर्ग: आलोक
+लेखक: निरंजन
+आवृत्ती: ०.१
+वर्णन: आलोक मराठी नियतकालिकाच्या अक्षरजुळणीकरिता लाटेक्-वर्ग.
+दुवा: https://gitlab.com/aalok/aalok-latex
+अडचणी: https://gitlab.com/aalok/aalok-latex/-/issues
+परवाना: आलोक नित्यमुक्त परवाना. आवृत्ती १.०+
+ दुवा : https://gitlab.com/aalok/nityamukta-parwana
+ आणि
+ ग्नू पब्लिक परवाना. आवृत्ती ३.०+
+ दुवा : https://www.gnu.org/licenses/gpl
+---------------------------------------------------------------------------
+हे काम आलोक नित्यमुक्त परवान्याच्या (आवृत्ती १.० अथवा त्यापुढील) अटींचे पालन करून वितरित केले
+जाऊ शकते तसेच सुधारले जाऊ शकते.
+
+ह्या परवान्याची नवीनतम प्रत खालील गिट-संग्राहिकेवर उपलब्ध आहे.
+
+https://gitlab.com/aalok/nityamukta-parwana
+
+ह्या लाटेक्-वर्गाची लाटेक्-प्रकल्पाच्या नियमांनुसार देखरेख केली जात आहे.
+
+ह्या लाटेक्-वर्गाचा लेखक व पालक निरंजन आहे.
+
+ह्या कामात aalok.dtx, aalok.ins तसेच त्यांपासून निर्माण केलेली
+aalok.cls ही धारिका समाविष्ट आहे.
+---------------------------------------------------------------------------
+
+\endpreamble
+
+\usedir{tex/latex/\jobname}
+\generate{
+ \file{\jobname.cls}{\from{\jobname.dtx}{class}}
+}
+
+\nopreamble\nopostamble
+\usedir{doc/latex/\jobname}
+\generate{
+ \file{README.txt}{\from{\jobname.dtx}{readme}}
+}
+
+\endbatchfile \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/achemso/achemso.dtx b/Master/texmf-dist/source/latex/achemso/achemso.dtx
index 5d3453b14aa..9db285eec64 100644
--- a/Master/texmf-dist/source/latex/achemso/achemso.dtx
+++ b/Master/texmf-dist/source/latex/achemso/achemso.dtx
@@ -1,152 +1,29 @@
% \iffalse meta-comment
-%<*internal>
-\def\nameofplainTeX{plain}
-\ifx\fmtname\nameofplainTeX\else
- \expandafter\begingroup
-\fi
-%</internal>
-%<*install>
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-\preamble
-----------------------------------------------------------------
-achemso --- Support for submissions to American Chemical Society
- journals
-E-mail: joseph.wright@morningstar2.co.uk
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
-\endpreamble
-\postamble
-
-Originally developed by Mats Dahlgren
-Copyright (C) 1996-1998 by Mats Dahlgren
-Copyright (C) 2008-2019 by
- Joseph Wright <joseph.wright@morningstar2.co.uk>
-
-Part of this bundle is derived from cite.sty, to which the
-following license applies:
- Copyright (C) 1989-2009 by Donald Arseneau
- These macros may be freely transmitted, reproduced, or
- modified provided that this notice is left intact.
-
-It may be distributed and/or modified under the conditions of
-the LaTeX Project Public License (LPPL), either version 1.3c of
-this license or (at your option) any later version. The latest
-version of this license is in the file:
-
- http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
- Joseph Wright.
-
-This work consists of the files achemso.dtx,
- achemso-demo.bib and
- achemso-demo.tex,
- and the derived files achemso.cls,
- achemso.ins,
- achemso.pdf,
- achemso.sty,
- natmove.sty and
- a number of configuration files.
-
-\endpostamble
-\usedir{tex/latex/achemso}
-\generate{
- \file{\jobname.cls}{\from{\jobname.dtx}{class}}
- \file{\jobname.sty}{\from{\jobname.dtx}{package}}
- \file{natmove.sty}{\from{\jobname.dtx}{natmove}}
-}
-\usedir{tex/latex/achemso/config}
-\generate{\file{achemso-aaembp.cfg}{\from{\jobname.dtx}{aaembp}}
- \file{achemso-aaemcq.cfg}{\from{\jobname.dtx}{aaemcq}}
- \file{achemso-aamick.cfg}{\from{\jobname.dtx}{aamick}}
- \file{achemso-aanmf6.cfg}{\from{\jobname.dtx}{aanmf6}}
- \file{achemso-aapmcd.cfg}{\from{\jobname.dtx}{aapmcd}}
- \file{achemso-abseba.cfg}{\from{\jobname.dtx}{abseba}}
- \file{achemso-accacs.cfg}{\from{\jobname.dtx}{accacs}}
- \file{achemso-achre4.cfg}{\from{\jobname.dtx}{achre4}}
-}
-\generate{\file{achemso-acscii.cfg}{\from{\jobname.dtx}{acscii}}
- \file{achemso-acbcct.cfg}{\from{\jobname.dtx}{acbcct}}
- \file{achemso-acncdm.cfg}{\from{\jobname.dtx}{acncdm}}
- \file{achemso-acsccc.cfg}{\from{\jobname.dtx}{acsccc}}
- \file{achemso-aesccq.cfg}{\from{\jobname.dtx}{aesccq}}
- \file{achemso-aelccp.cfg}{\from{\jobname.dtx}{aelccp}}
- \file{achemso-ascefj.cfg}{\from{\jobname.dtx}{ascefj}}
- \file{achemso-amlccd.cfg}{\from{\jobname.dtx}{amlccd}}
-}
-\generate{\file{achemso-amlcef.cfg}{\from{\jobname.dtx}{amlcef}}
- \file{achemso-amclct.cfg}{\from{\jobname.dtx}{amclct}}
- \file{achemso-ancac3.cfg}{\from{\jobname.dtx}{ancac3}}
- \file{achemso-acsodf.cfg}{\from{\jobname.dtx}{acsodf}}
- \file{achemso-apchd5.cfg}{\from{\jobname.dtx}{apchd5}}
- \file{achemso-aidcbc.cfg}{\from{\jobname.dtx}{aidcbc}}
- \file{achemso-ascecg.cfg}{\from{\jobname.dtx}{ascecg}}
- \file{achemso-asbcd6.cfg}{\from{\jobname.dtx}{asbcd6}}
-}
-\generate{\file{achemso-ancham.cfg}{\from{\jobname.dtx}{ancham}}
- \file{achemso-bichaw.cfg}{\from{\jobname.dtx}{bichaw}}
- \file{achemso-bcches.cfg}{\from{\jobname.dtx}{bcches}}
- \file{achemso-bomaf6.cfg}{\from{\jobname.dtx}{bomaf6}}
- \file{achemso-crtoec.cfg}{\from{\jobname.dtx}{crtoec}}
- \file{achemso-chreay.cfg}{\from{\jobname.dtx}{chreay}}
- \file{achemso-cmatex.cfg}{\from{\jobname.dtx}{cmatex}}
- \file{achemso-cgdefu.cfg}{\from{\jobname.dtx}{cgdefu}}
-}
-\generate{\file{achemso-enfuem.cfg}{\from{\jobname.dtx}{enfuem}}
- \file{achemso-esthag.cfg}{\from{\jobname.dtx}{esthag}}
- \file{achemso-estlcu.cfg}{\from{\jobname.dtx}{estlcu}}
- \file{achemso-iecred.cfg}{\from{\jobname.dtx}{iecred}}
- \file{achemso-inoraj.cfg}{\from{\jobname.dtx}{inoraj}}
- \file{achemso-jafcau.cfg}{\from{\jobname.dtx}{jafcau}}
- \file{achemso-jceda8.cfg}{\from{\jobname.dtx}{jceda8}}
- \file{achemso-jceaax.cfg}{\from{\jobname.dtx}{jceaax}}
-}
-\generate{\file{achemso-jcisd8.cfg}{\from{\jobname.dtx}{jcisd8}}
- \file{achemso-jctcce.cfg}{\from{\jobname.dtx}{jctcce}}
- \file{achemso-jmcmar.cfg}{\from{\jobname.dtx}{jmcmar}}
- \file{achemso-jnprdf.cfg}{\from{\jobname.dtx}{jnprdf}}
- \file{achemso-joceah.cfg}{\from{\jobname.dtx}{joceah}}
- \file{achemso-jpcafh.cfg}{\from{\jobname.dtx}{jpcafh}}
- \file{achemso-jpcbfk.cfg}{\from{\jobname.dtx}{jpcbfk}}
- \file{achemso-jpccck.cfg}{\from{\jobname.dtx}{jpccck}}
-}
-\generate{\file{achemso-jpclcd.cfg}{\from{\jobname.dtx}{jpclcd}}
- \file{achemso-jprobs.cfg}{\from{\jobname.dtx}{jprobs}}
- \file{achemso-jacsat.cfg}{\from{\jobname.dtx}{jacsat}}
- \file{achemso-langd5.cfg}{\from{\jobname.dtx}{langd5}}
- \file{achemso-mamobx.cfg}{\from{\jobname.dtx}{mamobx}}
- \file{achemso-mpohbp.cfg}{\from{\jobname.dtx}{mpohbp}}
- \file{achemso-nalefd.cfg}{\from{\jobname.dtx}{nalefd}}
- \file{achemso-orlef7.cfg}{\from{\jobname.dtx}{orlef7}}
-}
-\generate{\file{achemso-oprdfk.cfg}{\from{\jobname.dtx}{oprdfk}}
- \file{achemso-orgnd7.cfg}{\from{\jobname.dtx}{orgnd7}}
-}
-\usedir{bibtex/bst/achemso}
-\generate{
- \file{achemso.bst}{\from{\jobname.dtx}{bst}}
- \file{biochem.bst}{\from{\jobname.dtx}{bst,bio}}
-}
-%</install>
-%<install>\endbatchfile
-%<*internal>
-\usedir{source/latex/achemso}
-\generate{
- \file{\jobname.ins}{\from{\jobname.dtx}{install}}
-}
-\ifx\fmtname\nameofplainTeX
- \expandafter\endbatchfile
-\else
- \expandafter\endgroup
-\fi
-%</internal>
-%<*package|class|natmove>
-\NeedsTeXFormat{LaTeX2e}
-%</package|class|natmove>
+%
+% File: achemso.dtx Copyright (C) 2008-2021 Joseph Wright
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+% This file is part of the "achemso bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% The released version of this bundle is available from CTAN.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/josephwright/achemso
+%
+% for those people who are interested.
+%
+% -----------------------------------------------------------------------
+%
%<*driver>
\documentclass[a4paper]{ltxdoc}
\usepackage{achemso,array,booktabs,lmodern}
@@ -300,92 +177,6 @@ This work consists of the files achemso.dtx,
%
%\maketitle
%
-% \changes{v1.0}{1998/06/01}{Initial release of package by Mats Dahlgren}
-% \changes{v2.0}{2007/01/17}{Re-write of package by Joseph Wright}
-% \changes{v3.0}{2008/07/20}{^^A
-% Second re-write, converting to a class and giving much tighter
-% integration with \textsc{acs} submission system^^A
-% }
-% \changes{v3.1}{2009/04/21}{^^A
-% Re-ordered code to reduce or remove dependency on other packages^^A
-% }
-% \changes{v3.1}{2008/11/08}{Added \cs{alsoaffiliation} macro}
-% \changes{v3.2}{2009/04/20}{^^A
-% New functions \cs{SectionsOff}, \cs{SectionsOn},
-% \cs{SectionNumbersOff} and \cs{SectionNumbersOn}
-% }
-% \changes{v3.2}{2009/04/21}{New \texttt{tocentry} section}
-% \changes{v3.2}{2009/04/20}{^^A
-% New functions \cs{AbstractOff} and \cs{AbstractOn}^^A
-% }
-% \changes{v3.2c}{2009/05/29}{Added \cs{fax} macro}
-% \changes{v3.2c}{2009/05/29}{Added \cs{phone} macro}
-% \changes{v3.2b}{2009/05/05}{New \texttt{email} option}
-% \changes{v3.2c}{2009/05/28}{Fix so that \texttt{email} option is turned
-% on by default}
-% \changes{v3.3}{2008/08/28}{\cs{altaffiliation} macro checks for
-% duplicate entries and uses only one footnote}
-% \changes{v3.3}{2009/08/28}{New \texttt{layout} option}
-% \changes{v3.3a}{2009/09/01}{New \texttt{etalmode} option}
-% \changes{v3.4}{2010/01/15}{More detail on installation}
-% \changes{v3.5}{2010/06/25}{New \BibTeX{} style file}
-% \changes{v3.5a}{2010/08/05}{Modify JACS Communication to print
-% abstract}
-% \changes{v3.5c}{2010/10/11}{Update \emph{Org.~Lett.}\ style}
-% \changes{v3.5c}{2010/10/11}{Bug fix for \cs{mciteSubRef} macro}
-% \changes{v3.4}{2010/01/15}{Require \pkg{cleveref}, dropping
-% \pkg{varioref} use}
-% \changes{v3.6}{2012/01/11}{Drop \pkg{cleverref} use}
-% \changes{v3.7}{2012/04/30}{Rename \opt{usetitle} option to
-% \opt{articletitle}}
-% \changes{v3.7}{2012/04/30}{New \opt{chaptertitle} option for bibliography}
-% \changes{v3.8}{2013/08/23}{Extend journal list to current ACS range}
-% \changes{v3.8}{2013/08/16}{Introduce \cs{latin} command to support
-% \emph{ACS Nano} requirements}
-% \changes{v3.8a}{2013/09/04}{Minor style improvements for some
-% journals}
-% \changes{v3.8b}{2013/09/15}{Improve output ordering for \emph{J.~Phys.\
-% Chem.\ Lett.}}
-% \changes{v3.8c}{2013/09/20}{Improve \emph{ACS Photonics} style}
-% \changes{v3.8d}{2013/10/04}{Fix bug in keyword printing}
-% \changes{v3.8e}{2014/01/08}{Minor style changes for \emph{J.~Med.~Chem.}
-% and \emph{ACS Appl.~Mater.}}
-% \changes{v3.8g}{2014/03/06}{Fix issue with \emph{J.~Phys.\ Chem.}\ formatting}
-% \changes{v3.8i}{2014/05/14}{Fix issue with \emph{Chem.\ Res.\ Toxicol.}\ formatting}
-% \changes{v3.8j}{2014/06/12}{Update article title requirements for all journals}
-% \changes{v3.8j}{2014/06/12}{Update keyword requirements for all journals}
-% \changes{v3.8j}{2014/06/12}{Remove \emph{Biotechnol.\ Prog.}\ configuration}
-% \changes{v3.8k}{2014/08/18}{Format date correctly for in press bibliography
-% entries}
-% \changes{v3.8l}{2014/08/23}{Fix printing of phone/fax numbers}
-% \changes{v3.9}{2015/02/01}{New \texttt{doi} option}
-% \changes{v3.9a}{2015/03/03}{Update style for \emph{ACS Central Sci.}}
-% \changes{v3.9b}{2015/03/22}{Update \emph{J. Agric. Food Chem.} style}
-% \changes{v3.10}{2015/04/07}{Update address printing to reflect new
-% ACS style}
-% \changes{v3.10}{2015/04/07}{Add starred (subs)sections to TOC}
-% \changes{v3.10a}{2015/04/21}{Add article titles for \emph{Chem.\ Mater.}
-% and \emph{Chem. Rev.}}
-% \changes{v3.10c}{2016/05/10}{Add support for \emph{ACS Omega} and
-% \emph{ACS Energy Lett.}}
-% \changes{v3.10d}{2016/06/17}{Improve handling of \textsc{doi} values}
-% \changes{v3.10e}{2016/08/31}{Tweak \emph{Macromolecules} formatting}
-% \changes{v3.10f}{2016/09/07}{Various formatting updates}
-% \changes{v3.10h}{2017/01/14}{Add style for \emph{ACS Biomater.\ Sci.\ Eng.}}
-% \changes{v3.10h}{2017/01/20}{Add style for \emph{ACS Earth Space Chem.}}
-% \changes{v3.10h}{2017/01/20}{Add style for \emph{ACS Infect.\ Dis.}}
-% \changes{v3.10h}{2017/01/20}{Add style for \emph{ACS Sensors}}
-% \changes{v3.10h}{2017/01/20}{Style update for \emph{J.~Chem.\ Theory.\
-% Comput.}}
-% \changes{v3.10h}{2017/01/20}{Update supplementary information text}
-% \changes{v3.10i}{2017/02/09}{Style update for \emph{Biochemistry}}
-% \changes{v3.10i}{2017/05/18}{Fix issue with \cs{doi} command}
-% \changes{v3.10i}{2017/05/18}{Updates for \emph{Org.\ Lett.}}
-% \changes{v3.11}{2018/01/07}{Print article titles for all journals}
-% \changes{v3.11b}{2018/07/12}{Correct handling of \texttt{and others} in
-% bibliography}
-% \changes{v3.11c}{2018/07/12}{Further work on bibliography}
-%
%\begin{abstract}
% The \pkg{achemso} bundle provides a \LaTeX\ class file and \BibTeX\
% style file in accordance with the requirements of the American
@@ -484,81 +275,12 @@ This work consists of the files achemso.dtx,
% The class supports a limited number of options, which are
% specifically-targeted at submission. The class uses the
% \pkg{keyval} system for options, in the form \opt{key=value}. The
-% most important option is \opt{journal}. This is the name of the
-% target journal for the publication. The package is designed such
-% that the choice of journal will set up the correct bibliography
-% style and so on. The journals currently recognised by the package
-% are summarised in Table~\ref{tab:journal}. If an unknown journal
-% is specified, the package will fall-back on the
+% most important option is \opt{journal}. This is an identifier
+% for the target journal: from \url{https://pubs.acs.org/}, the identifier
+% is the part of the URL after \texttt{https://pubs.acs.org/journal/},
+% \emph{e.g.}~for \emph{J.\ Org.\ Chem.}\ it would be \texttt{joceah}.
+% If an unknown journal is specified, the package will fall-back on the
% \opt{journal=jacsat} option.
-%\begin{table}
-% \centering
-% \begin{tabular}{@{}>{\itshape}l>{\ttfamily}l>{\itshape}l>{\ttfamily}l@{}}
-% \toprule
-% Journal & \rmfamily Setting & Journal & \rmfamily Setting \\
-% \midrule
-% Acc.\ Chem.\ Res. & achre4 &
-% Chem.\ Res.\ Toxicol. & crtoec \\
-% ACS Appl.\ Energy Mater. & aaemcq &
-% Chem.\ Rev. & chreay \\
-% ACS Appl.\ Electron.\ Mater. & aaembp &
-% Cryst.\ Growth Des. & cgdefu \\
-% ACS Appl.\ Mater.\ Interfaces & aamick &
-% Energy Fuels & enfuem \\
-% ACS Appl.\ Nano Mater. & aanmf6 &
-% Environ.\ Sci.\ Technol. & esthag \\
-% ACS Appl.\ Polym.\ Mater. & aapmcd &
-% Environ.\ Sci.\ Technol.\ Lett. & estlcu \\
-% ACS Biomater.\ Sci.\ Eng. & abseba &
-% Ind.\ Eng.\ Chem.\ Res. & iecred \\
-% ACS Catal. & accacs &
-% Inorg.\ Chem. & inoraj \\
-% ACS Central Sci. & acscii &
-% J.~Agric.\ Food Chem. & jafcau \\
-% ACS Chem.\ Biol. & acbcct &
-% J.~Chem.\ Ed. & jceda8 \\
-% ACS Chem.\ Neurosci. & acncdm &
-% J.~Chem.\ Eng.\ Data & jceaax \\
-% ACS Combinatorial Sci. & acsccc &
-% J.~Chem.\ Inf.\ Model. & jcisd8 \\
-% ACS Earth Space Chem. & aesccq &
-% J.~Chem.\ Theory Comput. & jctcce \\
-% ACS Energy Lett. & aelccp &
-% J.~Med.\ Chem. & jmcmar \\
-% ACS Infect.\ Dis. & ascefj &
-% J.~Nat.\ Prod. & jnprdf \\
-% ACS Macro Lett. & amlccd &
-% J.~Org.\ Chem. & joceah \\
-% ACS Mater.\ Lett. & amlcef \\
-% J.~Phys.\ Chem.~A & jpcafh \\
-% ACS Med.\ Chem.\ Lett. & amclct &
-% J.~Phys.\ Chem.~B & jpcbfk \\
-% ACS Nano & ancac3 &
-% J.~Phys.\ Chem.~C & jpccck \\
-% ACS Omega & acsodf &
-% J.~Phys.\ Chem.\ Lett. & jpclcd \\
-% ACS Photon. & apchd5 &
-% J.~Proteome Res. & jprobs \\
-% ACS Sensors & ascefj &
-% J.~Am.\ Chem.\ Soc. & jacsat \\
-% ACS Sustainable Chem.\ Eng. & ascecg &
-% Langmuir & langd5 \\
-% ACS Synth.\ Biol. & asbcd6 &
-% Macromolecules & mamobx \\
-% Anal.\ Chem. & ancham &
-% Mol.\ Pharm. & mpohbp \\
-% Biochemistry & bichaw &
-% Nano Lett. & nalefd \\
-% Bioconjugate Chem. & bcches &
-% Org.\ Lett. & orlef7 \\
-% Biomacromolecules & bomaf6 &
-% Organometallics & orgnd7 \\
-% Chem.\ Mater. & cmatex \\
-% \bottomrule
-% \end{tabular}
-% \caption{Values for \opt{journal} option}
-% \label{tab:journal}
-%\end{table}
%
%\DescribeOption{manuscript}
% The second option is the \opt{manuscript} option. This specifies
@@ -969,7 +691,7 @@ This work consists of the files achemso.dtx,
% \begin{macrocode}
%<*class>
\ProvidesClass{achemso}
- [2019-02-14 v3.12a Submission to ACS journals]
+ [2021-01-20 v3.13c Submission to ACS journals]
\LoadClass[12pt,letter]{article}
% \end{macrocode}
%
@@ -989,7 +711,7 @@ This work consists of the files achemso.dtx,
% \begin{macrocode}
%<*package>
\ProvidesPackage{achemso}
- [2019-02-14 v3.12a Support for ACS journals]
+ [2021-01-20 v3.13c Support for ACS journals]
\@ifclassloaded{achemso}{%
\PackageInfo{achemso}{%
You have already loaded the `achemso' class:\MessageBreak
@@ -2953,8 +2675,6 @@ This work consists of the files achemso.dtx,
% \begin{macro}{\acs@tocentry@print}
% \begin{macro}{\acs@tocentry@print@aux}
% \begin{macro}{\acs@tocentry@text}
-% \changes{v3.10b}{2015/06/24}{Define \cs{acs@tocentry@text} in all cases}
-% \changes{v3.11a}{2018/04/02}{Print abstract at full size}
% The same approach is taken for the graphical table of content
% printing. This is done in a box so that everything has a frame around
% it.
@@ -2985,8 +2705,8 @@ This work consists of the files achemso.dtx,
\begin{center}
\fbox
{%
- \begin{minipage}{\acs@tocentry@height}
- \vbox to \acs@tocentry@width{\acs@tocentry@text}%
+ \begin{minipage}{\acs@tocentry@width}
+ \vbox to \acs@tocentry@height{\acs@tocentry@text}%
\end{minipage}%
}%
\end{center}%
@@ -2995,8 +2715,8 @@ This work consists of the files achemso.dtx,
\newcommand*\acs@tocentry@text{TOC ENTRY REQUIRED}
\newlength{\acs@tocentry@height}
\newlength{\acs@tocentry@width}
-\setlength{\acs@tocentry@height}{9 cm}
-\setlength{\acs@tocentry@width}{3.5 cm}
+\setlength{\acs@tocentry@height}{1.75in}
+\setlength{\acs@tocentry@width}{3.25in}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -3010,7 +2730,7 @@ This work consists of the files achemso.dtx,
%\begin{macro}{\tocentryname}
% A simple name macro.
% \begin{macrocode}
-\newcommand*\tocentryname{Graphical TOC Entry}
+\newcommand*\tocentryname{TOC Graphic}
% \end{macrocode}
%\end{macro}
%\begin{macro}{\tocsize}
@@ -3210,8 +2930,6 @@ This work consists of the files achemso.dtx,
%\subsection{Late shared code}
%
%\begin{macro}{\citenumfont}
-% \changes{v3.9b}{2015/03/22}{Allow for setting \opt{super} after
-% loading}
% Changes to citations can now be made. The citation styles supplied
% here require \pkg{natbib}, which is loaded with the appropriate
% options. This part applies to the package as well as the class: it is
@@ -3518,66 +3236,132 @@ This work consists of the files achemso.dtx,
% Keeping everything separate simply helps with maintenance.
%
% \begin{macrocode}
+%<*abmcb8>
+\ProvidesFile{achemso-abmcb8.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS Bio. Med. Chem. Au]
+\def\acs@type@list{article,review,letter,perspective,suppinfo}
+\setkeys{acs}{keywords = true}
+%</abmcb8>
+%<*aeacb3>
+\ProvidesFile{achemso-aeacb3.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS Eng. Au]
+\def\acs@type@list{article,review,letter,perspective,suppinfo}
+\setkeys{acs}{keywords = true}
+%</aeacb3>
+%<*aeacc4>
+\ProvidesFile{achemso-aeacc4.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS Env. Au]
+\def\acs@type@list{article,review,letter,perspective,suppinfo}
+\setkeys{acs}{keywords = true}
+%</aeacc4>
+%<*amacgu>
+\ProvidesFile{achemso-amacgu.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS Mater. Au]
+\def\acs@type@list{article,review,letter,perspective,suppinfo}
+\setkeys{acs}{keywords = true}
+%</amacgu>
+%<*amachv>
+\ProvidesFile{achemso-amachv.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS Meas. Au]
+\def\acs@type@list{article,review,letter,perspective,suppinfo}
+\setkeys{acs}{keywords = true}
+%</amachv>
+%<*anaccx>
+\ProvidesFile{achemso-anaccx.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS Nanosci. Au]
+\def\acs@type@list{article,review,letter,perspective,suppinfo}
+\setkeys{acs}{keywords = true}
+%</anaccx>
+%<*abmcb8>
+\ProvidesFile{achemso-abmcb8.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS Bio. Med. Chem. Au]
+\def\acs@type@list{article,review,letter,perspective,suppinfo}
+\setkeys{acs}{keywords = true}
+%</abmcb8>
+%<*aoiab5>
+\ProvidesFile{achemso-aoiab5.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS Org. Inorg. Au]
+\def\acs@type@list{article,review,letter,perspective,suppinfo}
+\setkeys{acs}{keywords = true}
+%</aoiab5>
+%<*apcach>
+\ProvidesFile{achemso-apcach.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS Phys. Bio. Med. Chem. Au]
+\def\acs@type@list{article,review,letter,perspective,suppinfo}
+\setkeys{acs}{keywords = true}
+%</apcach>
+%<*appccd>
+\ProvidesFile{achemso-appccd.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS Polym. Au]
+\def\acs@type@list{article,review,letter,perspective,suppinfo}
+\setkeys{acs}{keywords = true}
+%</appccd>
%<*achre4>
\ProvidesFile{achemso-achre4.cfg}
- [2019-02-14 v3.12a achemso configuration: Acc. Chem. Res.]
+ [2021-01-20 v3.13c achemso configuration: Acc. Chem. Res.]
\setkeys{acs}{biblabel = plain}
\def\acs@type@list{article,suppinfo}
\def\abstractname{Conspectus}
%</achre4>
%<*aaembp>
\ProvidesFile{achemso-aaembp.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Appl. Electron. Mater.]
+ [2021-01-20 v3.13c achemso configuration: ACS Appl. Electron. Mater.]
\def\acs@type@list{article,letter,suppinfo}
\setkeys{acs}{keywords = true}
%</aaembp>
%<*aaemcq>
\ProvidesFile{achemso-aaemcq.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Appl. Energy Mater.]
+ [2021-01-20 v3.13c achemso configuration: ACS Appl. Energy Mater.]
\def\acs@type@list{article,letter,suppinfo}
\setkeys{acs}{keywords = true}
%</aaemcq>
%<*aamick>
\ProvidesFile{achemso-aamick.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Appl. Mater. Interfaces]
+ [2021-01-20 v3.13c achemso configuration: ACS Appl. Mater. Interfaces]
\def\acs@type@list{article,letter,suppinfo}
\setkeys{acs}{keywords = true}
%</aamick>
%<*aanmf6>
\ProvidesFile{achemso-aanmf6.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Appl. Nano Mater.]
+ [2021-01-20 v3.13c achemso configuration: ACS Appl. Nano Mater.]
\def\acs@type@list{article,letter,suppinfo}
\setkeys{acs}{keywords = true}
%</aanmf6>
%<*aapmcd>
\ProvidesFile{achemso-aapmcd.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Appl. Polym. Mater.]
+ [2021-01-20 v3.13c achemso configuration: ACS Appl. Polym. Mater.]
\def\acs@type@list{article,letter,suppinfo}
\setkeys{acs}{keywords = true}
%</aapmcd>
+%<*aastgj>
+\ProvidesFile{achemso-aastgj.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS Agri. Sci. Tech.]
+\def\acs@type@list{account,article,letter,retraction,review,viewpoint,suppinfo}
+\setkeys{acs}{keywords = true}
+%</aastgj>
%<*abseba>
\ProvidesFile{achemso-abseba.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Biomater. Sci. Eng.]
+ [2021-01-20 v3.13c achemso configuration: ACS Biomater. Sci. Eng.]
\setkeys{acs}{keywords = true}
\def\acs@type@list{article,review,suppinfo}
%</abseba>
%<*accacs>
\ProvidesFile{achemso-accacs.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Catal.]
+ [2021-01-20 v3.13c achemso configuration: ACS Catal.]
\setkeys{acs}{keywords = true}
\def\acs@type@list{article,letter,perspective,review,viewpoints,suppinfo}
\SectionNumbersOff
%</accacs>
%<*acscii>
\ProvidesFile{achemso-acscii.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Central Sci.]
+ [2021-01-20 v3.13c achemso configuration: ACS Central Sci.]
\def\acs@type@list{article,review,suppinfo}
\setkeys{acs}{doi = true}
\SectionNumbersOff
%</acscii>
%<*acbcct>
\ProvidesFile{achemso-acbcct.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Chem. Biol.]
+ [2021-01-20 v3.13c achemso configuration: ACS Chem. Biol.]
\setkeys{acs}{
biblabel = fullstop,
biochem = true,
@@ -3588,7 +3372,7 @@ This work consists of the files achemso.dtx,
%</acbcct>
%<*acncdm>
\ProvidesFile{achemso-acncdm.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Chem. Neurosci.]
+ [2021-01-20 v3.13c achemso configuration: ACS Chem. Neurosci.]
\def\acs@type@list{article,review,letter,suppinfo,viewpoint}
\setkeys{acs}{
biblabel = fullstop,
@@ -3599,56 +3383,76 @@ This work consists of the files achemso.dtx,
%</acncdm>
%<*acsccc>
\ProvidesFile{achemso-acsccc.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Combinatorial Sci.]
+ [2021-01-20 v3.13c achemso configuration: ACS Combinatorial Sci.]
\def\acs@type@list{article,letter,review,perspective,account,note,suppinfo}
\setkeys{acs}{keywords = true}
\SectionNumbersOff
%</acsccc>
%<*aesccq>
\ProvidesFile{achemso-aesccq.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Earth Space Chem.]
+ [2021-01-20 v3.13c achemso configuration: ACS Earth Space Chem.]
\def\acs@type@list{article,suppinfo}
\setkeys{acs}{keywords = true}
%</aesccq>
%<*aelccp>
\ProvidesFile{achemso-aelccp.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Energy Lett.]
+ [2021-01-20 v3.13c achemso configuration: ACS Energy Lett.]
\def\acs@type@list{letter,perspective,review,viewpoint,focus}
\SectionsOff
%</aelccp>
+%<*aeecco>
+\ProvidesFile{achemso-aeecco.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS ES&T Eng.]
+\def\acs@type@list{article,feature,perspective,review,viewpoint}
+\setkeys{acs}{keywords = true}
+%</aeecco>
+%<*aewcaa>
+\ProvidesFile{achemso-aewcaa.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS ES&T Water]
+\def\acs@type@list{article,feature,perspective,review,viewpoint}
+\setkeys{acs}{keywords = true}
+%</aewcaa>
+%<*afsthl>
+\ProvidesFile{achemso-afsthl.cfg}
+ [2021-01-20 v3.13c achemso configuration: ACS Food Sci. Tech.]
+\def\acs@type@list{account,article,perspective,retraction,review,viewpoint}
+\setkeys{acs}{keywords = true}
+%</afsthl>
%<*ascefj>
\ProvidesFile{achemso-ascefj.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Infect. Dis.]
+ [2021-01-20 v3.13c achemso configuration: ACS Infect. Dis.]
\def\acs@type@list{article,letter,perspective,review,viewpoint,suppinfo}
\setkeys{acs}{keywords = true}
\SectionsOff
%</ascefj>
%<*amlccd>
\ProvidesFile{achemso-amlccd.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Macro Lett.]
+ [2021-01-20 v3.13c achemso configuration: ACS Macro Lett.]
\def\acs@type@list{letter,suppinfo}
\SectionsOff
\setlength{\acs@tocentry@height}{8 cm}
\setlength{\acs@tocentry@width}{4 cm}
%</amlccd>
-% \changes{v3.12a}{2019-02-14}{New \texttt{amlcef} configuration}
%<*amlcef>
\ProvidesFile{achemso-amlcef.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Mater. Lett.]
+ [2021-01-20 v3.13c achemso configuration: ACS Mater. Lett.]
\def\acs@type@list{letter,perspective,review,viewpoint,focus}
\SectionsOff
%</amlcef>
%<*amclct>
\ProvidesFile{achemso-amclct.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Med. Chem. Lett.]
+ [2021-01-20 v3.13c achemso configuration: ACS Med. Chem. Lett.]
\def\acs@type@list{article,letter,perspective,suppinfo}
\SectionNumbersOff
%</amclct>
-% \changes{v3.8n}{2015/01/13}{\emph{ACS Nano} want abbreviations}
-% \changes{v3.11}{2018/04/02}{Change \emph{ACS Nano} truncation}
+%<*amrcda>
+\ProvidesFile{achemso-amrcda.cfg}
+ [2021-01-20 v3.13c achemso configuration: Acc. Mater. Res.]
+\def\acs@type@list{account,article,editorial,retraction,suppinfo}
+%</amrcda>
%<*ancac3>
\ProvidesFile{achemso-ancac3.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Nano]
+ [2021-01-20 v3.13c achemso configuration: ACS Nano]
\setkeys{acs}{
abbreviations = true,
biblabel = fullstop,
@@ -3662,12 +3466,12 @@ This work consists of the files achemso.dtx,
%</ancac3>
%<*acsodf>
\ProvidesFile{achemso-acsodf.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Omega.]
+ [2021-01-20 v3.13c achemso configuration: ACS Omega.]
\def\acs@type@list{article}
%</acsodf>
%<*apchd5>
\ProvidesFile{achemso-apchd5.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Photon.]
+ [2021-01-20 v3.13c achemso configuration: ACS Photon.]
\def\acs@type@list{article,letter,perspective,review,suppinfo}
\setkeys{acs}{keywords = true}
\ifx\acs@manuscript\acs@manuscript@letter
@@ -3676,14 +3480,14 @@ This work consists of the files achemso.dtx,
%</apchd5>
%<*aidcbc>
\ProvidesFile{achemso-aidcbc.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Sensors]
+ [2021-01-20 v3.13c achemso configuration: ACS Sensors]
\def\acs@type@list{article,letter,perspective,review,suppinfo}
\setkeys{acs}{keywords = true}
\SectionNumbersOff
%</aidcbc>
%<*ascecg>
\ProvidesFile{achemso-ascecg.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Sustainable Chem Eng.]
+ [2021-01-20 v3.13c achemso configuration: ACS Sustainable Chem Eng.]
\setkeys{acs}{
biblabel = fullstop,
keywords = true
@@ -3693,7 +3497,7 @@ This work consists of the files achemso.dtx,
%</ascecg>
%<*asbcd6>
\ProvidesFile{achemso-asbcd6.cfg}
- [2019-02-14 v3.12a achemso configuration: ACS Synth. Biol.]
+ [2021-01-20 v3.13c achemso configuration: ACS Synth. Biol.]
\setkeys{acs}{
abbreviations = true,
biblabel = fullstop,
@@ -3705,13 +3509,13 @@ This work consists of the files achemso.dtx,
%</asbcd6>
%<*ancham>
\ProvidesFile{achemso-ancham.cfg}
- [2019-02-14 v3.12a achemso configuration: Anal. Chem.]
+ [2021-01-20 v3.13c achemso configuration: Anal. Chem.]
\def\acs@type@list{article,note,suppinfo}
\SectionNumbersOff
%</ancham>
%<*bichaw>
\ProvidesFile{achemso-bichaw.cfg}
- [2019-02-14 v3.12a achemso configuration: Biochemistry]
+ [2021-01-20 v3.13c achemso configuration: Biochemistry]
\setkeys{acs}{
abbreviations = true,
biblabel = brackets,
@@ -3759,7 +3563,7 @@ This work consists of the files achemso.dtx,
%</bichaw>
%<*bcches>
\ProvidesFile{achemso-bcches.cfg}
- [2019-02-14 v3.12a achemso configuration: Bioconjugate Chem.]
+ [2021-01-20 v3.13c achemso configuration: Bioconjugate Chem.]
\setkeys{acs}{
biochem = true,
super = false
@@ -3768,14 +3572,14 @@ This work consists of the files achemso.dtx,
%</bcches>
%<*bomaf6>
\ProvidesFile{achemso-bomaf6.cfg}
- [2019-02-14 v3.12a achemso configuration: Biomacromolecules]
+ [2021-01-20 v3.13c achemso configuration: Biomacromolecules]
\def\acs@type@list{article,comment,communication,note,review,suppinfo}
\SectionNumbersOff
\AtEndOfClass{\SectionsOn}
%</bomaf6>
%<*crtoec>
\ProvidesFile{achemso-crtoec.cfg}
- [2019-02-14 v3.12a achemso configuration: Chem. Res. Toxicol.]
+ [2021-01-20 v3.13c achemso configuration: Chem. Res. Toxicol.]
\setkeys{acs}{
abbreviations = true,
biochem = true,
@@ -3792,7 +3596,7 @@ This work consists of the files achemso.dtx,
%</crtoec>
%<*chreay>
\ProvidesFile{achemso-chreay.cfg}
- [2019-02-14 v3.12a achemso configuration: Chem. Rev.]
+ [2021-01-20 v3.13c achemso configuration: Chem. Rev.]
\def\acs@type@default{review}
\def\acs@type@list{review}
% \end{macrocode}
@@ -3803,7 +3607,7 @@ This work consists of the files achemso.dtx,
%<*cmatex>
% \begin{macrocode}
\ProvidesFile{achemso-cmatex.cfg}
- [2019-02-14 v3.12a achemso configuration: Chem. Mater.]
+ [2021-01-20 v3.13c achemso configuration: Chem. Mater.]
\setkeys{acs}{keywords = true}
\SectionNumbersOff
\ifx\acs@manuscript\acs@manuscript@communication
@@ -3813,7 +3617,7 @@ This work consists of the files achemso.dtx,
%</cmatex>
%<*cgdefu>
\ProvidesFile{achemso-cgdefu.cfg}
- [2019-02-14 v3.12a achemso configuration: Cryst. Growth Des.]
+ [2021-01-20 v3.13c achemso configuration: Cryst. Growth Des.]
\def\acs@type@list{%
article,communication,perspective,suppinfo%
}
@@ -3826,32 +3630,31 @@ This work consists of the files achemso.dtx,
%</cgdefu>
%<*enfuem>
\ProvidesFile{achemso-enfuem.cfg}
- [2019-02-14 v3.12a achemso configuration: Energy Fuels]
+ [2021-01-20 v3.13c achemso configuration: Energy Fuels]
\def\acs@type@list{article,review,suppinfo}
\SectionNumbersOff
%</enfuem>
%<*esthag>
\ProvidesFile{achemso-esthag.cfg}
- [2019-02-14 v3.12a achemso configuration: Environ. Sci. Technol.]
-\def\acs@type@list{article,suppinfo}
+ [2021-01-20 v3.13c achemso configuration: Environ. Sci. Technol.]
+\def\acs@type@list{article,feature,perspective,review,suppinfo}
\SectionNumbersOff
%</esthag>
%<*estlcu>
\ProvidesFile{achemso-estlcu.cfg}
- [2019-02-14 v3.12a achemso configuration: Environ. Sci. Technol. Lett.]
-\def\acs@type@list{letter,suppinfo}
+ [2021-01-20 v3.13c achemso configuration: Environ. Sci. Technol. Lett.]
+\def\acs@type@list{letter,review,suppinfo}
\SectionNumbersOff
%</estlcu>
-% \changes{v3.8m}{2014/11/24}{Fixes for \emph{Ind.\ Eng.\ Chem.\ Res.}\ style}
%<*iecred>
\ProvidesFile{achemso-iecred.cfg}
- [2019-02-14 v3.12a achemso configuration: Ind. Eng. Chem. Res.]
+ [2021-01-20 v3.13c achemso configuration: Ind. Eng. Chem. Res.]
\setkeys{acs}{biblabel = brackets}
\SectionNumbersOff
%</iecred>
%<*inoraj>
\ProvidesFile{achemso-inoraj.cfg}
- [2019-02-14 v3.12a achemso configuration: Inorg. Chem.]
+ [2021-01-20 v3.13c achemso configuration: Inorg. Chem.]
\SectionNumbersOff
\ifx\acs@manuscript\acs@manuscript@communication
\AbstractOff
@@ -3859,16 +3662,21 @@ This work consists of the files achemso.dtx,
\fi
\setkeys{acs}{doi = true}
%</inoraj>
+%<*jaaucr>
+\ProvidesFile{achemso-jaaucr.cfg}
+ [2021-01-20 v3.13c achemso configuration: JACS Au]
+\def\acs@type@list{spotlight,account,article,communication,letter,perspective,suppinfo}
+%</jaaucr>
%<*jafcau>
\ProvidesFile{achemso-jafcau.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Agric. Food Chem.]
+ [2021-01-20 v3.13c achemso configuration: J. Agric. Food Chem.]
\setkeys{acs}{keywords = true}
\def\acs@type@list{article,suppinfo}
\SectionNumbersOff
%</jafcau>
%<*jceda8>
\ProvidesFile{achemso-jceda8.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Chem. Ed.]
+ [2021-01-20 v3.13c achemso configuration: J. Chem. Ed.]
\setkeys{acs}{keywords = true}
\SectionNumbersOff
\def\acs@type@list{article,suppinfo}
@@ -3876,26 +3684,26 @@ This work consists of the files achemso.dtx,
%</jceda8>
%<*jceaax>
\ProvidesFile{achemso-jceaax.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Chem. Eng. Data]
+ [2021-01-20 v3.13c achemso configuration: J. Chem. Eng. Data]
\def\acs@type@list{article,suppinfo}
\def\refname{Literature Cited}
\SectionNumbersOff
%</jceaax>
%<*jcisd8>
\ProvidesFile{achemso-jcisd8.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Chem. Inf. Model.]
+ [2021-01-20 v3.13c achemso configuration: J. Chem. Inf. Model.]
\def\acs@type@list{article,suppinfo}
\SectionNumbersOff
%</jcisd8>
%<*jctcce>
\ProvidesFile{achemso-jctcce.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Chem. Theory Comput.]
+ [2021-01-20 v3.13c achemso configuration: J. Chem. Theory Comput.]
\def\acs@type@list{article,suppinfo}
\setkeys{acs}{maxauthors = 0}
%</jctcce>
%<*jmcmar>
\ProvidesFile{achemso-jmcmar.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Med. Chem.]
+ [2021-01-20 v3.13c achemso configuration: J. Med. Chem.]
\def\acs@type@list{article,letter,perspective,suppinfo}
\SectionNumbersOff
\setlength{\acs@tocentry@height}{5.5cm}
@@ -3903,7 +3711,7 @@ This work consists of the files achemso.dtx,
%</jmcmar>
%<*jnprdf>
\ProvidesFile{achemso-jnprdf.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Nat. Prod.]
+ [2021-01-20 v3.13c achemso configuration: J. Nat. Prod.]
\renewcommand*{\abstractname}{ABSTRACT}
\renewcommand*{\acknowledgementname}{ACKNOWLEDGEMENT}
\renewcommand*{\suppinfoname}{ASSOCIATED CONTENT}
@@ -3925,7 +3733,7 @@ This work consists of the files achemso.dtx,
%</jnprdf>
%<*joceah>
\ProvidesFile{achemso-joceah.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Org. Chem.]
+ [2021-01-20 v3.13c achemso configuration: J. Org. Chem.]
\ifx\acs@manuscript\acs@manuscript@communication
\AbstractOff
\SectionsOff
@@ -3936,12 +3744,10 @@ This work consists of the files achemso.dtx,
\renewcommand*\acs@type@list{article,communication,note,perspective,review,suppinfo}
%</joceah>
% \end{macrocode}
-% \changes{v3.8n}{2015/01/13}{Drop use of keywords for \emph{J.~Phys.\ Chem.}\
-% A, B and C}
% \begin{macrocode}
%<*jpcafh>
\ProvidesFile{achemso-jpcafh.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Phys. Chem. A]
+ [2021-01-20 v3.13c achemso configuration: J. Phys. Chem. A]
\def\acs@type@list{article,suppinfo}
\setkeys{acs}{
etalmode = truncate,
@@ -3956,7 +3762,7 @@ This work consists of the files achemso.dtx,
%</jpcafh>
%<*jpcbfk>
\ProvidesFile{achemso-jpcbfk.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Phys. Chem. B]
+ [2021-01-20 v3.13c achemso configuration: J. Phys. Chem. B]
\def\acs@type@list{article,suppinfo}
\setkeys{acs}{
etalmode = truncate,
@@ -3968,7 +3774,7 @@ This work consists of the files achemso.dtx,
%</jpcbfk>
%<*jpccck>
\ProvidesFile{achemso-jpccck.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Phys. Chem. C]
+ [2021-01-20 v3.13c achemso configuration: J. Phys. Chem. C]
\def\acs@type@list{article,suppinfo}
\setkeys{acs}{
etalmode = truncate,
@@ -3979,12 +3785,10 @@ This work consists of the files achemso.dtx,
\g@addto@macro{\maketitle}{\newpage}
%</jpccck>
% \end{macrocode}
-% \changes{v3.8m}{2014/08/24}{\emph{J.~Phys.\ Chem.\ Lett.}\ uses a
-% non-standard size for the TOC graphic}
% \begin{macrocode}
%<*jpclcd>
\ProvidesFile{achemso-jpclcd.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Phys. Chem. Lett.]
+ [2021-01-20 v3.13c achemso configuration: J. Phys. Chem. Lett.]
\setkeys{acs}{
etalmode = truncate,
maxauthors = 10
@@ -4009,25 +3813,23 @@ This work consists of the files achemso.dtx,
%</jpclcd>
%<*jprobs>
\ProvidesFile{achemso-jprobs.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Proteome Res.]
+ [2021-01-20 v3.13c achemso configuration: J. Proteome Res.]
\setkeys{acs}{keywords = true}
\def\acs@type@list{article,review,suppinfo}
\SectionNumbersOff
%</jprobs>
% \end{macrocode}
-% \changes{v3.12a}{2019-02-14}{\emph{J.~Am.\ Chem.\ Soc.}\ now requires titles}
% The \emph{J.~Am.\ Chem.\ Soc.}~configuration is rather more
% complicated as there is the need to construct a ``galley-like''
% layout for communications.
% \begin{macrocode}
%<*jacsat>
\ProvidesFile{achemso-jacsat.cfg}
- [2019-02-14 v3.12a achemso configuration: J. Am. Chem. Soc.]
+ [2021-01-20 v3.13c achemso configuration: J. Am. Chem. Soc.]
\SectionNumbersOff
\ifx\acs@manuscript\acs@manuscript@communication\else
\expandafter\endinput
\fi
-\setkeys{acs}{articletitle = true}
% \end{macrocode}
% Everything from here onward applies only to communications. Some
% adjustments are now made using the existing tools.
@@ -4226,26 +4028,26 @@ This work consists of the files achemso.dtx,
%</jacsat>
%<*langd5>
\ProvidesFile{achemso-langd5.cfg}
- [2019-02-14 v3.12a achemso configuration: Langmuir]
+ [2021-01-20 v3.13c achemso configuration: Langmuir]
\def\acs@type@list{article,letter,suppinfo}
\SectionNumbersOff
%</langd5>
%<*mamobx>
\ProvidesFile{achemso-mamobx.cfg}
- [2019-02-14 v3.12a achemso configuration: Macromolecules]
+ [2021-01-20 v3.13c achemso configuration: Macromolecules]
\SectionNumbersOff
\setkeys{acs}{doi = true}
%</mamobx>
%<*mpohbp>
\ProvidesFile{achemso-mpohbp.cfg}
- [2019-02-14 v3.12a achemso configuration: Mol. Pharm.]
+ [2021-01-20 v3.13c achemso configuration: Mol. Pharm.]
\setkeys{acs}{keywords = true}
\def\acs@type@list{article,suppinfo}
\SectionNumbersOff
%</mpohbp>
%<*nalefd>
\ProvidesFile{achemso-nalefd.cfg}
- [2019-02-14 v3.12a achemso configuration: Nano Lett.]
+ [2021-01-20 v3.13c achemso configuration: Nano Lett.]
\setkeys{acs}{keywords = true}
\def\acs@type@default{letter}
\def\acs@type@list{letter}
@@ -4253,7 +4055,7 @@ This work consists of the files achemso.dtx,
%</nalefd>
%<*orlef7>
\ProvidesFile{achemso-orlef7.cfg}
- [2019-02-14 v3.12a achemso configuration: Org. Lett.]
+ [2021-01-20 v3.13c achemso configuration: Org. Lett.]
\def\acs@type@default{communication}
\def\acs@type@list{communication}
\SectionNumbersOff
@@ -4263,13 +4065,13 @@ This work consists of the files achemso.dtx,
%</orlef7>
%<*oprdfk>
\ProvidesFile{achemso-oprdfk.cfg}
- [2019-02-14 v3.12a achemso configuration: Org. Proc. Res. Dev.]
+ [2021-01-20 v3.13c achemso configuration: Org. Proc. Res. Dev.]
\def\acs@type@list{article,highlight,review,suppinfo}
\SectionNumbersOff
%</oprdfk>
%<*orgnd7>
\ProvidesFile{achemso-orgnd7.cfg}
- [2019-02-14 v3.12a achemso configuration: Organometallics]
+ [2021-01-20 v3.13c achemso configuration: Organometallics]
\SectionNumbersOff
%</orgnd7>
% \end{macrocode}
@@ -4934,7 +4736,7 @@ FUNCTION { count.entries } {
% Start and end of bibliography functions
FUNCTION { begin.bib } {
- "achemso 2019-02-14 v3.12a" top$
+ "achemso 2021-01-20 v3.13c" top$
preamble$ empty$
{ }
{
diff --git a/Master/texmf-dist/source/latex/achemso/achemso.ins b/Master/texmf-dist/source/latex/achemso/achemso.ins
new file mode 100644
index 00000000000..78c2afe117e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/achemso/achemso.ins
@@ -0,0 +1,167 @@
+\iffalse meta-comment
+
+File: achemso.ins Copyright (C) 2020,2021 Joseph Wright
+
+It may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version. The latest version
+of this license is in the file
+
+ https://www.latex-project.org/lppl.txt
+
+This file is part of the "achemso bundle" (The Work in LPPL)
+and all files in that bundle must be distributed together.
+
+The released version of this bundle is available from CTAN.
+
+-----------------------------------------------------------------------
+
+The development version of the bundle can be found at
+
+ https://github.com/josephwright/achemso
+
+for those people who are interested.
+
+-----------------------------------------------------------------------
+
+\fi
+
+\input docstrip.tex
+\askforoverwritefalse
+
+\postamble
+
+Originally developed by Mats Dahlgren
+Copyright (C) 1996-1998 by Mats Dahlgren
+Copyright (C) 2008-2021 by
+ Joseph Wright <joseph.wright@morningstar2.co.uk>
+
+Part of this bundle is derived from cite.sty, to which the
+following license applies:
+ Copyright (C) 1989-2009 by Donald Arseneau
+ These macros may be freely transmitted, reproduced, or
+ modified provided that this notice is left intact.
+
+It may be distributed and/or modified under the conditions of
+the LaTeX Project Public License (LPPL), either version 1.3c of
+this license or (at your option) any later version. The latest
+version of this license is in the file:
+
+ http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+ Joseph Wright.
+
+This work consists of the files achemso.dtx,
+ achemso-demo.bib and
+ achemso-demo.tex,
+ and the derived files achemso.cls,
+ achemso.ins,
+ achemso.pdf,
+ achemso.sty,
+ natmove.sty and
+ a number of configuration files.
+
+\endpostamble
+
+\keepsilent
+
+\generate{
+ \file{achemso.cls}{\from{achemso.dtx}{class}}
+ \file{achemso.sty}{\from{achemso.dtx}{package}}
+ \file{natmove.sty}{\from{achemso.dtx}{natmove}}
+}
+
+\generate{\file{achemso-aaembp.cfg}{\from{achemso.dtx}{aaembp}}
+ \file{achemso-aaemcq.cfg}{\from{achemso.dtx}{aaemcq}}
+ \file{achemso-aamick.cfg}{\from{achemso.dtx}{aamick}}
+ \file{achemso-aanmf6.cfg}{\from{achemso.dtx}{aanmf6}}
+ \file{achemso-aapmcd.cfg}{\from{achemso.dtx}{aapmcd}}
+ \file{achemso-aastgj.cfg}{\from{achemso.dtx}{aastgj}}
+ \file{achemso-abseba.cfg}{\from{achemso.dtx}{abseba}}
+ \file{achemso-accacs.cfg}{\from{achemso.dtx}{accacs}}
+}
+\generate{\file{achemso-achre4.cfg}{\from{achemso.dtx}{achre4}}
+ \file{achemso-acscii.cfg}{\from{achemso.dtx}{acscii}}
+ \file{achemso-acbcct.cfg}{\from{achemso.dtx}{acbcct}}
+ \file{achemso-acncdm.cfg}{\from{achemso.dtx}{acncdm}}
+ \file{achemso-acsccc.cfg}{\from{achemso.dtx}{acsccc}}
+ \file{achemso-aeecco.cfg}{\from{achemso.dtx}{aeecco}}
+ \file{achemso-aesccq.cfg}{\from{achemso.dtx}{aesccq}}
+ \file{achemso-aelccp.cfg}{\from{achemso.dtx}{aelccp}}
+}
+\generate{\file{achemso-aewcaa.cfg}{\from{achemso.dtx}{aewcaa}}
+ \file{achemso-afsthl.cfg}{\from{achemso.dtx}{afsthl}}
+ \file{achemso-ascefj.cfg}{\from{achemso.dtx}{ascefj}}
+ \file{achemso-amlccd.cfg}{\from{achemso.dtx}{amlccd}}
+ \file{achemso-amlcef.cfg}{\from{achemso.dtx}{amlcef}}
+ \file{achemso-amclct.cfg}{\from{achemso.dtx}{amclct}}
+ \file{achemso-amrcda.cfg}{\from{achemso.dtx}{amrcda}}
+ \file{achemso-ancac3.cfg}{\from{achemso.dtx}{ancac3}}
+}
+\generate{\file{achemso-acsodf.cfg}{\from{achemso.dtx}{acsodf}}
+ \file{achemso-apchd5.cfg}{\from{achemso.dtx}{apchd5}}
+ \file{achemso-aidcbc.cfg}{\from{achemso.dtx}{aidcbc}}
+ \file{achemso-ascecg.cfg}{\from{achemso.dtx}{ascecg}}
+ \file{achemso-asbcd6.cfg}{\from{achemso.dtx}{asbcd6}}
+ \file{achemso-ancham.cfg}{\from{achemso.dtx}{ancham}}
+ \file{achemso-bichaw.cfg}{\from{achemso.dtx}{bichaw}}
+ \file{achemso-bcches.cfg}{\from{achemso.dtx}{bcches}}
+}
+\generate{\file{achemso-bomaf6.cfg}{\from{achemso.dtx}{bomaf6}}
+ \file{achemso-crtoec.cfg}{\from{achemso.dtx}{crtoec}}
+ \file{achemso-chreay.cfg}{\from{achemso.dtx}{chreay}}
+ \file{achemso-cmatex.cfg}{\from{achemso.dtx}{cmatex}}
+ \file{achemso-cgdefu.cfg}{\from{achemso.dtx}{cgdefu}}
+ \file{achemso-enfuem.cfg}{\from{achemso.dtx}{enfuem}}
+ \file{achemso-esthag.cfg}{\from{achemso.dtx}{esthag}}
+ \file{achemso-estlcu.cfg}{\from{achemso.dtx}{estlcu}}
+}
+\generate{\file{achemso-iecred.cfg}{\from{achemso.dtx}{iecred}}
+ \file{achemso-inoraj.cfg}{\from{achemso.dtx}{inoraj}}
+ \file{achemso-jaaucr.cfg}{\from{achemso.dtx}{jaaucr}}
+ \file{achemso-jafcau.cfg}{\from{achemso.dtx}{jafcau}}
+ \file{achemso-jceda8.cfg}{\from{achemso.dtx}{jceda8}}
+ \file{achemso-jceaax.cfg}{\from{achemso.dtx}{jceaax}}
+ \file{achemso-jcisd8.cfg}{\from{achemso.dtx}{jcisd8}}
+ \file{achemso-jctcce.cfg}{\from{achemso.dtx}{jctcce}}
+}
+\generate{\file{achemso-jmcmar.cfg}{\from{achemso.dtx}{jmcmar}}
+ \file{achemso-jnprdf.cfg}{\from{achemso.dtx}{jnprdf}}
+ \file{achemso-joceah.cfg}{\from{achemso.dtx}{joceah}}
+ \file{achemso-jpcafh.cfg}{\from{achemso.dtx}{jpcafh}}
+ \file{achemso-jpcbfk.cfg}{\from{achemso.dtx}{jpcbfk}}
+ \file{achemso-jpccck.cfg}{\from{achemso.dtx}{jpccck}}
+ \file{achemso-jpclcd.cfg}{\from{achemso.dtx}{jpclcd}}
+ \file{achemso-jprobs.cfg}{\from{achemso.dtx}{jprobs}}
+}
+\generate{\file{achemso-jacsat.cfg}{\from{achemso.dtx}{jacsat}}
+ \file{achemso-langd5.cfg}{\from{achemso.dtx}{langd5}}
+ \file{achemso-mamobx.cfg}{\from{achemso.dtx}{mamobx}}
+ \file{achemso-mpohbp.cfg}{\from{achemso.dtx}{mpohbp}}
+ \file{achemso-nalefd.cfg}{\from{achemso.dtx}{nalefd}}
+ \file{achemso-orlef7.cfg}{\from{achemso.dtx}{orlef7}}
+ \file{achemso-oprdfk.cfg}{\from{achemso.dtx}{oprdfk}}
+ \file{achemso-orgnd7.cfg}{\from{achemso.dtx}{orgnd7}}
+}
+
+\generate{\file{achemso-abmcb8.cfg}{\from{achemso.dtx}{abmcb8}}
+ \file{achemso-aeacb3.cfg}{\from{achemso.dtx}{aeacb3}}
+ \file{achemso-aeacc4.cfg}{\from{achemso.dtx}{aeacc4}}
+ \file{achemso-amacgu.cfg}{\from{achemso.dtx}{amacgu}}
+ \file{achemso-amachv.cfg}{\from{achemso.dtx}{amachv}}
+ \file{achemso-anaccx.cfg}{\from{achemso.dtx}{anaccx}}
+ \file{achemso-aoiab5.cfg}{\from{achemso.dtx}{aoiab5}}
+ \file{achemso-apcach.cfg}{\from{achemso.dtx}{apcach}}
+}
+
+\generate{\file{achemso-appccd.cfg}{\from{achemso.dtx}{appccd}}
+}
+
+
+\generate{
+ \file{achemso.bst}{\from{achemso.dtx}{bst}}
+ \file{biochem.bst}{\from{achemso.dtx}{bst,bio}}
+}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/acmart/Makefile b/Master/texmf-dist/source/latex/acmart/Makefile
index 68e33d0437d..916c87c9f1d 100644
--- a/Master/texmf-dist/source/latex/acmart/Makefile
+++ b/Master/texmf-dist/source/latex/acmart/Makefile
@@ -66,6 +66,14 @@ samples/sample-xelatex.pdf: samples/sample-xelatex.tex samples/$(PACKAGE).cls
while ( grep -q '^LaTeX Warning: Label(s) may have changed' $(basename $<).log) \
do cd $(dir $@) && xelatex-dev $(notdir $<); done
+samples/sample-lualatex.pdf: samples/sample-lualatex.tex samples/$(PACKAGE).cls samples/ACM-Reference-Format.bst
+ cd $(dir $@) && lualatex-dev $(notdir $<)
+ - cd $(dir $@) && bibtex $(notdir $(basename $<))
+ cd $(dir $@) && lualatex-dev $(notdir $<)
+ cd $(dir $@) && lualatex-dev $(notdir $<)
+ while ( grep -q '^LaTeX Warning: Label(s) may have changed' $(basename $<).log) \
+ do cd $(dir $@) && lualatex-dev $(notdir $<); done
+
.PRECIOUS: $(PACKAGE).cfg $(PACKAGE).cls
diff --git a/Master/texmf-dist/source/latex/acmart/acmart.dtx b/Master/texmf-dist/source/latex/acmart/acmart.dtx
index 72e256f18cd..f8953734092 100644
--- a/Master/texmf-dist/source/latex/acmart/acmart.dtx
+++ b/Master/texmf-dist/source/latex/acmart/acmart.dtx
@@ -1,6 +1,6 @@
% \iffalse
%
-% Copyright 2016-2019, Association for Computing Machinery
+% Copyright 2016-2020, Association for Computing Machinery
% 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
@@ -19,7 +19,6 @@
% acmart.cls, the files ACM-Reference-Format.bst, and templates
% sample-acmlarge.tex, sample-acmsmall.tex, sample-acmtog.tex,
% samplebody-conf.tex, samplebody-journals.tex, sample-manuscript.tex,
-% sample-sigchi-a.tex, sample-sigchi.tex,
% sample-sigconf-authordraft.tex, sample-sigconf.tex,
% sample-sigplan.tex
%
@@ -58,7 +57,7 @@
% \ifx\currentjob\guide\OnlyDescription\fi
% \GetFileInfo{acmart.dtx}
% \title{\LaTeX{} Class for the \emph{Association for Computing
-% Machinery}\thanks{\copyright 2016--2019, Association for Computing Machinery}}
+% Machinery}\thanks{\copyright 2016--2020, Association for Computing Machinery}}
% \author{Boris Veytsman\thanks{%
% \href{mailto:borisv@lk.net}{\texttt{borisv@lk.net}},
% \href{mailto:boris@varphi.com}{\texttt{boris@varphi.com}}}}
@@ -102,8 +101,10 @@
% Leif Andersen,
% Lawrence Christopher Angrave,
% Dirk Beyer,
+% Andrew Black,
% Joachim Breitner,
% Benjamin Byholm,
+% John Collins,
% Nils Anders Danielsson,
% Michael Ekstrand,
% Matthew Fluet,
@@ -111,18 +112,22 @@
% Ben Greenman,
% Enrico Gregorio,
% Jamie Davis,
+% Jason Hemann,
% Peter Kemp,
% Luis Leiva,
% Ben Liblit,
% Rholais Lii,
% LianTze Lim,
+% Kuldeep S. Meel,
% Kai Mindermann,
% Frank Mittelbach,
% Serguei Mokhov,
% Ross Moore,
% John Owens,
% Joel Nider,
+% Scott Pakin,
% Tobias Pape,
+% Henning Pohl,
% Philip Quinn,
% Mathias Rav,
% Andreas Reichinger,
@@ -137,6 +142,7 @@
% Stephen Spencer,
% Shin Hwei Tan,
% Daniel Thomas,
+% Shari Trewin,
% Zack Weinberg,
% John Wickerson
% and many others for their invaluable help.
@@ -221,8 +227,8 @@
% \item \textsl{geometry}, \url{http://www.ctan.org/pkg/geometry}
% \item \textsl{graphics}, \url{http://www.ctan.org/pkg/graphics}
% \item \textsl{hyperref}, \url{http://www.ctan.org/pkg/hyperref}
-% \item \textsl{ifluatex}, \url{http://www.ctan.org/pkg/ifluatex}
-% \item \textsl{ifxetex}, \url{http://www.ctan.org/pkg/ifxetex}
+% \item \textsl{hyperxmp}, \url{http://www.ctan.org/pkg/hyperxmp}
+% \item \textsl{iftex}, \url{http://www.ctan.org/pkg/iftex}
% \item \textsl{inconsolata}, \url{http://www.ctan.org/pkg/inconsolata}
% \item \textsl{libertine}, \url{http://www.ctan.org/pkg/libertine}
% \item \textsl{manyfoot}, \url{http://www.ctan.org/pkg/manyfoot}
@@ -309,12 +315,16 @@
% conferences (with the exceptions listed below) and all ICPS
% volumes.\\
% sigplan & Proceedings format for SIGPLAN conferences.\\
-% sigchi & Proceedings format for SIGCHI conferences.\\
-% sigchi-a & Format for SIGCHI extended abstracts.\\
% \bottomrule
% \end{tabularx}
% \end{table}
%
+% Starting in 2020, ACM retired formats |sigchi| and |sigchi-a|.
+% SIGCHI conferences now use |sigconf| format for their publications.
+% If a file uses |sigchi| format, a warning is issued, and the format
+% is automatically switched to |sigconf|. Format |sigchi-a| can be
+% used for non-ACM documents only (see Section~\ref{sec:sigchi-a}).
+%
% There are several Boolean options that can take |true| or |false|
% values. They are listed in Table~\ref{tab:opts_bool}. The words
% |=true| can be omitted when setting a Boolean option, so instead of
@@ -326,6 +336,10 @@
% option. It provides a version suitable for reviewers and
% copy editors.
%
+% Two samples in the |samples| directory, |manuscript| and
+% |acmsmall-submission|, show manuscripts formatted for submission to
+% ACM.
+%
% The default for the option |screen| depends on the publication. At
% present it is |false| for all publications \emph{but} PACM, since
% PACM is now electronic-only. Thus PACM titles~(see
@@ -619,7 +633,12 @@
% copy, but they \emph{are} necessary since they are used by the XML
% metadata extraction programs. Do \emph{not} put commas or |\\|
% between the elements of \cs{affiliation}. They will be provided
-% automatically.
+% automatically.
+%
+% The fields \cs{institution}, \cs{city} and \cs{country} are
+% mandatory. If they are not provided, an error or a warning is
+% issued. Currently the absence of \cs{country} produces and error;
+% ACM may change this in the future.
%
%
% An example of the author block:
@@ -875,13 +894,12 @@
% \cs{acmBadgeR}\oarg{url}\marg{graphics} and
% \cs{acmBadgeL}\oarg{url}\marg{graphics}. The first command puts the
% badge to the right of the title, and the second one---to the left.
-% The exception is the |sigchi-a| mode for SIGCHI extended abstracts,
-% which puts the badges on the left margin. The arguments have the
-% following meaning: \oarg{url}, if provided, sets the link to the
-% badge authority in the screen version, while \marg{graphics} sets
-% the graphics file with the badge image. The file must be a cropped
-% square, which is scaled to a standard size in the output. For
-% example, if the badge image is |ae-logo.pdf|, the command is
+% The arguments have the following meaning: \oarg{url}, if provided,
+% sets the link to the badge authority in the screen version, while
+% \marg{graphics} sets the graphics file with the badge image. The
+% file must be a cropped square, which is scaled to a standard size in
+% the output. For example, if the badge image is |ae-logo.pdf|, the
+% command is
% \begin{verbatim}
% \acmBadgeR[http://ctuning.org/ae/ppopp2016.html]{ae-logo}
% \end{verbatim}
@@ -1154,8 +1172,6 @@
% \item[figure*, table*] in two-column formats, a special figure or
% table taking a full text width.
% \item[teaserfigure:] a special figure before \cs{maketitle}.
-% \item[sidebar, marginfigure, margintable:] in the |sigchi-a| format,
-% special sidebars, tables and figures in the margin.
% \end{description}
%
% \item Accordingly, when scaling images, one should use the
@@ -1166,9 +1182,6 @@
% use \cs{columnwidth}, which coincides with \cs{textwidth} in this
% case.
% \item For |figure| in two-column mode, use \cs{columnwidth}.
-% \item For |marginfigure|, use \cs{marginparwidth}.
-% \item For |figure*| in SIGCHI extended
-% abstracts, use \cs{fulltextwidth}.
% \end{enumerate}
%
% \end{enumerate}
@@ -1217,23 +1230,11 @@
% \end{table}
% \end{verbatim}
%
-% \DescribeEnv{sidebar}%
-% \DescribeEnv{marginfigure}%
-% \DescribeEnv{margintable}%
-% SIGCHI extended abstracts use margin space extensively. This package
-% provides three environments for this with optional captions:
-% \begin{description}
-% \item[sidebar:] textual information in the margin
-% \item[marginfigure:] a figure in the margin
-% \item[margintable:] a table in the margin
-% \end{description}
-%
%
-% Tables and figures (including margin tables and margin figures) are
-% by default centered. However, in some cases (for example, when you
-% use several subimages per figure) you may need to override this.
-% A good way to do so is to put the contents into a
-% \cs{minipage} of the width \cs{columnwidth}.
+% Tables and figures are by default centered. However, in some cases
+% (for example, when you use several subimages per figure) you may
+% need to override this. A good way to do so is to put the contents
+% into a \cs{minipage} of the width \cs{columnwidth}.
%
%
%\subsection{Descriptions of images}
@@ -1684,7 +1685,10 @@
% You should not abuse the command \cs{vspace}: this command may
% disturb the typesetting of ACM papers.
%
-%\subsection{A note for wizards: \texttt{acmart-preload-hook.tex}}
+% You should not load |amssymb| package since the package |acmart|
+% defines the corresponding symbols itself.
+%
+%\subsection{Notes for wizards}
%\label{sec:ug_preload}
%
% Sometimes you need to change the behavior of |acmart|. The
@@ -1726,6 +1730,13 @@
% \emph{do not ask for support.} If you decide to use this hook, you
% are on your own.
%
+% \DescribeMacro{\AtBeginMaketitle}%
+% Another hook is \cs{AtBeginMaketitle}. The commands in this hook
+% are executed before \cs{maketitle}, for example,
+% \begin{verbatim}
+% \AtBeginMaketitle{\acmPrice{125.00}}
+% \end{verbatim}
+%
%
%\subsection{Currently supported publications}
%\label{sec:pubs}
@@ -1819,6 +1830,48 @@
% special ``publication'' type FACMP, a forthcoming ACM publication,
% reserved for new journals which are not assigned an ISSN yet.
%
+%
+%\subsection{A note about \texttt{sigchi-a} format}
+%\label{sec:sigchi-a}
+%
+% Starting in Spring 2020 ACM retired SIGCHI Extended Abstract format
+% (|sigchi-a|). ACM will not, under any circumstances, accept
+% documents in this format for publication and will not offer
+% technical support to the authors who use this template.
+%
+% You may use this format in the |nonacm| mode only, as in
+% \begin{verbatim}
+% \documentclass[sigchi-a, nonacm]{acmart}
+% \end{verbatim}
+%
+%
+%
+% \DescribeEnv{sidebar}%
+% \DescribeEnv{marginfigure}%
+% \DescribeEnv{margintable}%
+% This format has large margin uses for special figures and
+% tables. This package provides three environments for this with
+% optional captions:
+% \begin{description}
+% \item[sidebar:] textual information in the margin,
+% \item[marginfigure:] a figure in the margin,
+% \item[margintable:] a table in the margin.
+% \end{description}
+%
+% The environments |figure| and |table| produce figures and tables
+% with the width of the text column. The environments |figure*| and
+% |table*| produce ``wide'' figures and tables, which take a large
+% part of the margin.
+%
+% The horizontal sizes of figures are:
+% \begin{enumerate}
+% \item |figure|: \cs{columnwidth},
+% \item |marginfigure|: \cs{marginparwidth},
+% \item |figure*|: \cs{fulltextwidth}.
+% \end{enumerate}
+%
+%
+%
% \StopEventually{
% \clearpage
% \bibliography{acmart}
@@ -1842,7 +1895,7 @@
\ProvidesFile{acmart.dtx}
%</gobble>
%<class>\ProvidesClass{acmart}
-[2020/02/22 v1.70 Typesetting articles for the Association for Computing Machinery]
+[2020/11/15 v1.75 Typesetting articles for the Association for Computing Machinery]
% \end{macrocode}
%
% \changes{v1.00}{2016/04/14}{First released version}
@@ -1943,6 +1996,12 @@
% papers over two pages}
% \changes{1.66}{2019/12/18}{Authors' addresses are mandatory for
% journal articles}
+% \changes{1.71}{2020/05/01}{Retired sigchi and sigchi-a}
+% \changes{1.71}{2020/05/02}{Bibliography change: volume for
+% @inproceedings is now in brackets together with series}
+% \changes{1.71}{2020/05/02}{LuaTeX now uses the OTF versions of
+% fonts}
+% \changes{1.75}{2020/10/29}{Documentation update}
%
% And the driver code:
% \begin{macrocode}
@@ -1992,6 +2051,11 @@
\RequirePackage{xstring}
% \end{macrocode}
%
+% We need |iftex| to check the engine
+% \begin{macrocode}
+\RequirePackage{iftex}
+% \end{macrocode}
+%
%
%
% \begin{macro}{format}
@@ -2276,10 +2340,30 @@
% Setting up switches
% \begin{macrocode}
\ifnum\ACM@format@nr=5\relax % siggraph
- \ClassWarning{\@classname}{The format siggraph is now obsolete.
- I am switching to sigconf.}
+\ClassWarning{\@classname}{%
+ The format siggraph is now obsolete.\MessageBreak
+ I am switching to sigconf.}
+ \setkeys{acmart.cls}{format=sigconf}
+\fi
+\ifnum\ACM@format@nr=7\relax % sigchi
+\ClassWarning{\@classname}{%
+ The format sigchi is now obsolete.\MessageBreak
+ I am switching to sigconf.}
\setkeys{acmart.cls}{format=sigconf}
\fi
+\ifnum\ACM@format@nr=8\relax % sigchi
+\ClassWarning{\@classname}{%
+ ACM SIGCHI has retired the SIGCHI-A template\MessageBreak
+ effective immediately. ACM is keeping this template\MessageBreak
+ option available to authors who are working on legacy\MessageBreak
+ documents only. ACM will not, under any circumstances,\MessageBreak
+ accept documents in this format for publication and\MessageBreak
+ will not offer technical support to the authors who use\MessageBreak
+ this template.\MessageBreak
+ ACM SIGCHI is directing Conference leaders and\MessageBreak
+ authors to publish their articles using the SIGCONF\MessageBreak
+ template call.}
+\fi
\ifnum\ACM@format@nr=0\relax
\@ACM@manuscripttrue
\else
@@ -2342,7 +2426,7 @@
\or % sigplan
\def\ACM@fontsize{10pt}%
\or % sigchi
- \def\ACM@fontsize{10pt}%
+ \def\ACM@fontsize{9pt}%
\or % sigchi-a
\def\ACM@fontsize{10pt}%
\fi
@@ -2667,9 +2751,10 @@
% \end{macro}
% \begin{macro}{\l@subsubsection}
% \changes{v1.31}{2017/03/04}{Redefined macro}
+% \changes{v1.71}{2020/04/30}{Bug fixed (thanks to Andrew Black)}
% The spacing in |amsart| is too large
% \begin{macrocode}
-\def\l@subsubsection{\@tocline{2}{0pt}{1pc}{5pc}{}}
+\def\l@subsubsection{\@tocline{3}{0pt}{1pc}{5pc}{}}
% \end{macrocode}
%
% \end{macro}
@@ -2734,12 +2819,13 @@
% \end{macro}
%
%
-% And now, |hyperref|
+% And now, |hyperref|
% \changes{v1.28}{2017/01/07}{Got rid of warnings in pdf keywords}
% \changes{v1.46}{2017/08/25}{Delayed hypersetup since journal options
% may change screen mode}
% \changes{v1.55}{2018/10/20}{Now we use purple color for links}
-% \changes{v1.58}{2019/26/01}{Suppressed \cs{addtocounter} in pdf subject}
+% \changes{v1.58}{2019/26/01}{Suppressed \cs{addtocounter} in pdf
+% subject}
% \begin{macrocode}
\let\@footnotemark@nolink\@footnotemark
\let\@footnotetext@nolink\@footnotetext
@@ -2782,6 +2868,13 @@
pdfdisplaydoctitle}}
% \end{macrocode}
%
+% And |hyperxmp|
+% \changes{v1.72}{2020/06/14}{Added hyperxmp}
+% \begin{macrocode}
+\RequirePackage{hyperxmp}
+% \end{macrocode}
+%
+%
% Bibliography mangling.
% \changes{v1.33}{2017/03/23}{Moved \cs{citename} definition for
% non-natbib bibliography, so a package may redefine it}
@@ -2847,7 +2940,7 @@
% \end{macrocode}
%
%
-% Author-draft mode
+% Author-draft mode or sigchi-a mode
% \begin{macrocode}
\if@ACM@authordraft
\RequirePackage{draftwatermark}
@@ -2856,6 +2949,17 @@
\SetWatermarkText{\parbox{12em}{\centering
Unpublished working draft.\\
Not for distribution.}}
+\else
+ \if@ACM@sigchiamode
+ \if@ACM@nonacm\else
+ \RequirePackage{draftwatermark}
+ \SetWatermarkFontSize{0.5in}
+ \SetWatermarkColor[gray]{.9}
+ \SetWatermarkText{\parbox{12em}{\centering
+ Legacy document. \\
+ Not for publication in an ACM venue}}
+ \fi
+ \fi
\fi
% \end{macrocode}
%
@@ -3077,7 +3181,6 @@
%
% The code below is by Ross Moore.
% \begin{macrocode}
-\RequirePackage{iftex}
\ifPDFTeX
\input{glyphtounicode}
\pdfglyphtounicode{f_f}{FB00}
@@ -3088,8 +3191,8 @@
\pdfglyphtounicode{f_t}{0066 0074}
\pdfglyphtounicode{T_h}{0054 0068}
\pdfgentounicode=1
-\fi
\RequirePackage{cmap}
+\fi
% \end{macrocode}
%
%
@@ -3103,7 +3206,7 @@
have the libertine package installed. Please upgrade your
TeX}\@ACM@newfontsfalse}
\IfFileExists{zi4.sty}{}{\ClassWarning{\@classname}{You do not
- have the zi4 package installed. Please upgrade your
+ have the inconsolata (zi4.sty) package installed. Please upgrade your
TeX}\@ACM@newfontsfalse}
\IfFileExists{newtxmath.sty}{}{\ClassWarning{\@classname}{You do not
have the newtxmath package installed. Please upgrade your
@@ -3120,19 +3223,31 @@
% Breitner)}
% \changes{v1.54}{2018/07/16}{XeTeX now uses T1 encoding}
% \changes{v1.56}{2018/11/11}{Looks like XeTeX requires explicit
-% monotype font delcaration}
+% monotype font declaration}
+% \changes{v1.74}{2020/10/25}{Changed the order of font loading}%
% We use Libertine throughout.
% \begin{macrocode}
\if@ACM@newfonts
\RequirePackage[T1]{fontenc}
-\ifxetex
- \RequirePackage[tt=false]{libertine}
- \setmonofont{inconsolata}
-\else
- \RequirePackage[tt=false, type1=true]{libertine}
-\fi
-\RequirePackage[varqu]{zi4}
-\RequirePackage[libertine]{newtxmath}
+ % Note that the order in which packages are loaded matters,
+ % and the correct order depends on the LaTeX engine used.
+ % See https://github.com/borisveytsman/acmart/issues/402
+ % and https://github.com/borisveytsman/acmart/issues/410
+ \ifxetex
+ \RequirePackage[libertine]{newtxmath}
+ \RequirePackage[tt=false]{libertine}
+ \setmonofont[StylisticSet=3]{inconsolata}
+ \else
+ \ifluatex
+ \RequirePackage[libertine]{newtxmath}
+ \RequirePackage[tt=false]{libertine}
+ \setmonofont[StylisticSet=3]{inconsolata}
+ \else
+ \RequirePackage[tt=false, type1=true]{libertine}
+ \RequirePackage[varqu]{zi4}
+ \RequirePackage[libertine]{newtxmath}
+ \fi
+ \fi
\fi
% \end{macrocode}
%
@@ -3199,6 +3314,8 @@
% to prevent spurious space warnings}
% \changes{v1.67}{2020/01/11}{Patching lstlisting and lstlisting*
% to prevent spurious space warnings}
+% \changes{v1.73}{2020/08/23}{Patching minted and minted*
+% to prevent spurious space warnings}
% \begin{macrocode}
\AtBeginEnvironment{figure}{\@Description@presentfalse
\let\@vspace\@vspace@orig
@@ -3224,6 +3341,14 @@
\let\@vspacer\@vspacer@orig}
\AtBeginEnvironment{lstlisting*}{\let\@vspace\@vspace@orig
\let\@vspacer\@vspacer@orig}
+\AtBeginEnvironment{minted}{\let\@vspace\@vspace@orig
+ \let\@vspacer\@vspacer@orig}
+\AtBeginEnvironment{minted*}{\let\@vspace\@vspace@orig
+ \let\@vspacer\@vspacer@orig}
+\AtBeginEnvironment{listing}{\let\@vspace\@vspace@orig
+ \let\@vspacer\@vspacer@orig}
+\AtBeginEnvironment{listing*}{\let\@vspace\@vspace@orig
+ \let\@vspacer\@vspacer@orig}
% \end{macrocode}
%
@@ -3980,10 +4105,11 @@
% \changes{v1.46}{2017/08/27}{Started counting authors}
% \changes{v1.54}{2018/06/23}{Added submission id in anonymous mode}
% \changes{v1.57}{2018/12/09}{Added warning if \cs{author} has comma}
+% \changes{v1.72}{2020/05/04}{Added \cs{detokenize} (Kuldeep S. Meel)}
% Adding an author to the list of authors and addresses
% \begin{macrocode}
\renewcommand\author[2][]{%
- \IfSubStr{#2}{,}{\ClassWarning{\@classname}{Do not put several
+ \IfSubStr{\detokenize{#2}}{,}{\ClassWarning{\@classname}{Do not put several
authors in the same \string\author\space macro!}}{}%
\global\advance\num@authors by 1\relax
\if@insideauthorgroup\else
@@ -5015,8 +5141,34 @@
%
% \end{macro}
%
+%
+%\subsection{Maketitle hook}
+%\label{sec:hook}
+%
+% The current \LaTeX\ provides a nice |lthooks| mechanism. However,
+% since it is relatively new, we will use oldfashioned approach---at
+% least for now.
+%
+% \begin{macro}{\@beginmaketitlehook}
+% \changes{v1.75}{2020/11/15}{Introduced macro}
+% The hook
+% \begin{macrocode}
+\ifx\@beginmaketitlehook\@undefined
+ \let\@beginmaketitlehook\@empty
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginMaketitle}
+% \changes{v1.75}{2020/11/15}{Introduced macro}
+% Adding to the hook
+% \begin{macrocode}
+\def\AtBeginMaketitle{\g@addto@macro\@beginmaketitlehook}
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Typesetting top matter}
-% \label{sec:makefile}
+% \label{sec:maketitle}
%
% \begin{macro}{\mktitle@bx}
% Some of our formats use a two-column design. Some use a one-column
@@ -5059,6 +5211,11 @@
% \cs{maketitle}}
% \changes{v1.64}{2019/08/17}{Added a switch setting to show that
% \cs{maketitle} is typeset}
+% \changes{v1.72}{2020/06/14}{Do not andify authors for pdf metadata
+% (Scott Pakin)}
+% \changes{v1.73}{2020/09/07}{Do not check again the presense of
+% address fields}
+% \changes{v1.75}{2020/11/15}{Added \cs{@beginmaketitlehook}}
% The (in)famous \cs{maketitle}. Note that in |sigchi-a| mode, authors
% are \emph{not} in the title box.
%
@@ -5067,7 +5224,7 @@
% and therefore belong to the copyright/permission block. By the
% way, this was the default behavior of the old ACM classes.
% \begin{macrocode}
-\def\maketitle{%
+\def\maketitle{\@beginmaketitlehook
\@ACM@maketitle@typesettrue
\if@ACM@anonymous
% Anonymize omission of \author-s
@@ -5173,15 +5330,11 @@
\fi
\noindent\@keywords}\par\egroup
\fi
- \andify\authors
- \andify\shortauthors
- \global\let\authors=\authors
- \global\let\shortauthors=\shortauthors
- \if@ACM@printacmref
- \@mkbibcitation
- \fi
+ \let\metadata@authors=\authors
+ \nxandlist{, }{, }{, }\metadata@authors
+ \def\@ACM@checkaffil{}%
\hypersetup{%
- pdfauthor={\authors},
+ pdfauthor={\metadata@authors},
pdftitle={\@title},
pdfsubject={\@concepts},
pdfkeywords={\@keywords},
@@ -5189,6 +5342,13 @@
\csname ver@acmart.cls\endcsname\space
and hyperref
\csname ver@hyperref.sty\endcsname}}%
+ \andify\authors
+ \andify\shortauthors
+ \global\let\authors=\authors
+ \global\let\shortauthors=\shortauthors
+ \if@ACM@printacmref
+ \@mkbibcitation
+ \fi
\global\@topnum\z@ % this prevents floats from falling
% at the top of page 1
\global\@botnum\z@ % we do not want them to be on the bottom either
@@ -5502,6 +5662,7 @@
% \begin{macro}{\institution}
% \changes{v1.15}{2016/07/03}{Added macro}
% \changes{v1.33}{2017/03/28}{Added obeypunctuation code}
+% \changes{v1.73}{2020/09/07}{Check the presence in affil}
% \begin{macro}{\position}
% \changes{v1.15}{2016/07/03}{Added macro}
% \changes{v1.33}{2017/03/28}{Added obeypunctuation code}
@@ -5517,6 +5678,7 @@
% \changes{v1.15}{2016/07/03}{Added macro}
% \changes{v1.33}{2017/03/28}{Added obeypunctuation code}
% \changes{v1.40}{2017/06/15}{We now do not print this even in SIG}
+% \changes{v1.73}{2020/09/07}{Check the presence in affil}
% \begin{macro}{\state}
% \changes{v1.15}{2016/07/03}{Added macro}
% \changes{v1.33}{2017/03/28}{Added obeypunctuation code}
@@ -5531,6 +5693,7 @@
% \changes{v1.40}{2017/05/27}{Fixed bugs with extra spaces}
% \changes{v1.43}{2017/07/11}{Added comma before country for journals}
% \changes{v1.46}{2017/08/30}{Corrected spacing for institution}
+% \changes{v1.73}{2020/09/07}{Check the presence in affil}
% Theoretically we can define the macros for \cs{affiliation} inside
% the \cs{@mkauthors}-style commands. However, this would lead to a
% strange error if an author uses them outside \cs{affiliation}. Of
@@ -5540,21 +5703,24 @@
\def\postcode#1{\unskip\ignorespaces}
\if@ACM@journal
\def\position#1{\unskip\ignorespaces}
- \def\institution#1{\unskip~#1\ignorespaces}
- \def\city#1{\unskip\ignorespaces}
+ \def\institution#1{\global\@ACM@instpresenttrue
+ \unskip~#1\ignorespaces}
+ \def\city#1{\global\@ACM@citypresenttrue\unskip\ignorespaces}
\def\state#1{\unskip\ignorespaces}
\newcommand\department[2][0]{\unskip\ignorespaces}
- \def\country#1{\if@ACM@affiliation@obeypunctuation\else, \fi#1\ignorespaces}
+ \def\country#1{\global\@ACM@countrypresenttrue
+ \if@ACM@affiliation@obeypunctuation\else, \fi#1\ignorespaces}
\else
\def\position#1{\if@ACM@affiliation@obeypunctuation#1\else#1\par\fi}%
- \def\institution#1{\if@ACM@affiliation@obeypunctuation#1\else#1\par\fi}%
+ \def\institution#1{\global\@ACM@instpresenttrue
+ \if@ACM@affiliation@obeypunctuation#1\else#1\par\fi}%
\newcommand\department[2][0]{\if@ACM@affiliation@obeypunctuation
#2\else#2\par\fi}%
% \def\streetaddress#1{\if@ACM@affiliation@obeypunctuation#1\else#1\par\fi}%
- \let\city\@ACM@addtoaddress
+ \def\city#1{\global\@ACM@citypresenttrue\@ACM@addtoaddress{#1}}%
\let\state\@ACM@addtoaddress
% \def\postcode#1{\if@ACM@affiliation@obeypunctuation#1\else\unskip\space#1\fi}%
- \let\country\@ACM@addtoaddress
+ \def\country#1{\global\@ACM@countrypresenttrue\@ACM@addtoaddress{#1}}%
\fi
% \end{macrocode}
%
@@ -5663,11 +5829,80 @@
%
% \end{macro}
%
+% \begin{macro}{\if@ACM@instpresent}
+% \changes{v1.73}{2020/09/07}{Added macro}
+% Whether the given affiliation has institution
+% \begin{macrocode}
+\newif\if@ACM@instpresent
+\@ACM@instpresenttrue
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+% \begin{macro}{\if@ACM@citypresent}
+% \changes{v1.73}{2020/09/07}{Added macro}
+% Whether the given affiliation has city
+% \begin{macrocode}
+\newif\if@ACM@citypresent
+\@ACM@citypresenttrue
+% \end{macrocode}
+%
+% \end{macro}
+% \begin{macro}{\if@ACM@countrypresent}
+% \changes{v1.73}{2020/09/07}{Added macro}
+% Whether the given affiliation has country
+% \begin{macrocode}
+\newif\if@ACM@countrypresent
+\@ACM@countrypresenttrue
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+% \begin{macro}{\@ACM@resetaffil}
+% \changes{v1.73}{2020/09/07}{Added macro}
+% Reset affiliation flags
+% \begin{macrocode}
+\def\@ACM@resetaffil{%
+ \global\@ACM@instpresentfalse
+ \global\@ACM@citypresentfalse
+ \global\@ACM@countrypresentfalse
+}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\@ACM@checkaffil}
+% \changes{v1.73}{2020/09/07}{Added macro}
+% \changes{v1.75}{2020/11/15}{Changed warning to error for country}
+% Check affiliation flags
+% \begin{macrocode}
+\def\@ACM@checkaffil{%
+ \if@ACM@instpresent\else
+ \ClassWarningNoLine{\@classname}{No institution present for an affiliation}%
+ \fi
+ \if@ACM@citypresent\else
+ \ClassWarningNoLine{\@classname}{No city present for an affiliation}%
+ \fi
+ \if@ACM@countrypresent\else
+ \ClassError{\@classname}{No country present for an affiliation}{ACM
+ requires each author to indicate their country using country macro.}%
+ \fi
+}
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+%
%
% \begin{macro}{\@mkauthors@i}
% \changes{v1.18}{2016/07/12}{Now we andify affiliations}
% \changes{v1.33}{2017/03/28}{Added obeypunctuation code}
% \changes{v1.40}{2017/06/04}{Switched to MakeTextUppercase}
+% \changes{v1.73}{2020/09/07}{Check the presence of required elements
+% for affiliations}
% This version is used in most journal formats. Note that \cs{and} between
% authors with the same affiliation becomes \verb*| and |:
% \begin{macrocode}
@@ -5689,11 +5924,13 @@
\gdef\@currentaffiliations{%
\setkeys{@ACM@affiliation@}{obeypunctuation=false}%
\setkeys{@ACM@affiliation@}{##1}%
- \@affiliationfont##2}%
+ \@ACM@resetaffil
+ \@affiliationfont##2\@ACM@checkaffil}%
\else
\g@addto@macro{\@currentaffiliations}{\and
\setkeys{@ACM@affiliation@}{obeypunctuation=false}%
- \setkeys{@ACM@affiliation@}{##1}##2}%
+ \setkeys{@ACM@affiliation@}{##1}\@ACM@resetaffil
+ ##2\@ACM@checkaffil}%
\fi
\fi
\global\let\and\@typeset@author@line}%
@@ -5760,6 +5997,8 @@
% \changes{v1.15}{2016/07/04}{New authors system}
% \changes{v1.33}{2017/03/28}{Added obeypunctuation code}
% \changes{v1.36}{2017/05/12}{Added authorsperrow overrride}
+% \changes{v1.73}{2020/09/07}{Check the presence of required elements
+% for affiliations}
% The |sigconf| version. Here we use a centered design with each
% author in a separate box.
% \begin{macrocode}
@@ -5811,11 +6050,13 @@
\def\affiliation##1##2{\ifx\@currentaffiliation\@empty
\gdef\@currentaffiliation{%
\setkeys{@ACM@affiliation@}{obeypunctuation=false}%
- \setkeys{@ACM@affiliation@}{##1}##2}%
+ \setkeys{@ACM@affiliation@}{##1}\@ACM@resetaffil
+ ##2\@ACM@checkaffil}%
\else
\g@addto@macro\@currentaffiliation{\par
\setkeys{@ACM@affiliation@}{obeypunctuation=false}%
- \setkeys{@ACM@affiliation@}{##1}##2}%
+ \setkeys{@ACM@affiliation@}{##1}\@ACM@resetaffil
+ ##2\@ACM@checkaffil}%
\fi
\global\let\and\@typeset@author@bx
}%
@@ -5835,6 +6076,8 @@
% \begin{macro}{\@mkauthors@iv}
% \changes{v1.33}{2017/03/28}{Added obeypunctuation code}
% \changes{v1.36}{2017/05/12}{Added authorsperrow overrride}
+% \changes{v1.73}{2020/09/07}{Check the presence of required elements
+% for affiliations}
% The |sigchi-a| version. We put authors in the main text with
% no more than 2 authors per line, unless overriden.
% \begin{macrocode}
@@ -5878,11 +6121,13 @@
\def\affiliation##1##2{\ifx\@currentaffiliation\@empty
\gdef\@currentaffiliation{%
\setkeys{@ACM@affiliation@}{obeypunctuation=false}%
- \setkeys{@ACM@affiliation@}{##1}##2}%
+ \setkeys{@ACM@affiliation@}{##1}\@ACM@resetaffil
+ ##2\@ACM@checkaffil}%
\else
\g@addto@macro\@currentaffiliation{\par
\setkeys{@ACM@affiliation@}{obeypunctuation=false}%
- \setkeys{@ACM@affiliation@}{##1}##2}%
+ \setkeys{@ACM@affiliation@}{##1}\@ACM@resetaffil
+ ##2\@ACM@checkaffil}%
\fi
\global\let\and\@typeset@author@bx}%
%
diff --git a/Master/texmf-dist/source/latex/acronym/acronym.dtx b/Master/texmf-dist/source/latex/acronym/acronym.dtx
index 31211759a80..f7d8e8eabd2 100644
--- a/Master/texmf-dist/source/latex/acronym/acronym.dtx
+++ b/Master/texmf-dist/source/latex/acronym/acronym.dtx
@@ -35,7 +35,7 @@
%</driver>
% \fi
%
-% \CheckSum{1522}
+% \CheckSum{1526}
%
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -82,6 +82,7 @@
% \DoNotIndex{\textbf, \textsf, \textsmaller, \textsuperscript, \the}
% \DoNotIndex{\usepackage}
%
+% \changes{v1.47}{2020/04/10}{Tobi Oetiker and Marcus Meeßen \cmd{hskip} Fixed several bugs in macros that use capitalisation, a bug were the output depends on the position of the list of acronyms, and a bug were nested hyperlinks could cause errors.}
% \changes{v1.46}{2020/03/13}{Tobi Oetiker \cmd{hskip} Fixed miss merge}
% \changes{v1.45}{2020/03/13}{Marcus Meeßen \cmd{hskip} Fixed hyperref and "missing aux" regressions.}
% \changes{v1.44}{2020/02/07}{Marcus Meeßen \cmd{hskip} Added the |printonlyreused| option, which allows to automatically exclude acronyms from the list of acronyms if they are used only once}
@@ -636,7 +637,8 @@ neutrinoless double beta decay.
\subsection{Some testing fundamentals}
When testing \acp{IC}, one typically wants to identify functional
blocks to be tested separately. The latter are commonly indicated as
-\acp{BUT}. To test a \ac{BUT} requires defining a testing strategy\dots
+\acp{BUT}. To test a \ac{BUT} requires defining a testing strategy\dots{}
+\Iac{IC} popped up unexpectedly.
\section{Acronyms}
\begin{acronym}[TDMA]
@@ -655,6 +657,7 @@ blocks to be tested separately. The latter are commonly indicated as
\acro{IC}{Integrated Circuit}%
\acro{BUT}{Block Under Test}%
\acrodefplural{BUT}{Blocks Under Test}%
+ \acroindefinite{IC}{an}{an}
\end{acronym}
\end{document}
@@ -679,8 +682,8 @@ blocks to be tested separately. The latter are commonly indicated as
% First we test that we got the right format and name the package.
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-\ProvidesPackage{acronym}[2020/03/13
- v1.46
+\ProvidesPackage{acronym}[2020/04/17
+ v1.47
Support for acronyms (Tobias Oetiker)]
\RequirePackage{suffix,xstring}
% \end{macrocode}
@@ -1039,7 +1042,6 @@ blocks to be tested separately. The latter are commonly indicated as
% acronyms is in the front matter of the document.
% \begin{macrocode}
\newcommand*{\AC@logged}[1]{%
- \acronymused{#1}% mark it as used in the current run too
\@bsphack
\protected@write\@auxout{}{\string\acronymused{#1}}%
\@esphack}
@@ -1080,9 +1082,8 @@ blocks to be tested separately. The latter are commonly indicated as
% Internal commands for making a first letter upper case.
% \begin{macrocode}
\newcommand{\@firstupper}[1]{%
- \StrLeft{#1}{1}[\firstletter]%
- \StrGobbleLeft{#1}{1}[\remainder]%
- \MakeUppercase\firstletter\remainder%
+ \StrSplit{#1}{1}{\head}{\tail}%
+ \MakeUppercase\head\tail%
}
% \end{macrocode}
% \end{macro}
@@ -1340,7 +1341,7 @@ blocks to be tested separately. The latter are commonly indicated as
\newcommand\AC@acroindefinite[3]{
\@bsphack
\protected@write\@auxout{}%
- {\string\newacroindefinite{#1}{\string\AC@hyperlink{#1}{#2}}{#3}}%
+ {\string\newacroindefinite{#1}{#2}{#3}}%
\@esphack
}
% \end{macrocode}
@@ -1438,7 +1439,9 @@ blocks to be tested separately. The latter are commonly indicated as
\fi
}
\newcommand*\AC@Aclp[1]{%
- \@firstupper\expandafter{\AC@aclp{#1}}%
+ \AC@uppertrue%
+ \AC@aclp{#1}%
+ \AC@upperfalse%
}
\newcommand*\AC@acsp[1]{%
\ifcsname fn@#1@PS\endcsname
@@ -1465,6 +1468,16 @@ blocks to be tested separately. The latter are commonly indicated as
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\ifAC@upper}
+% If an acronym needs to be capitalized, this flag is used to indicate
+% this at an appropriate point in the code. In that case, the firstupper
+% command will be called at a time when the acronym is expandable, otherwise
+% the xstring command will not work properly.
+% \begin{macrocode}
+\newif\ifAC@upper
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\AC@get}
% If the acronym is undefined, the internal macro \cmd{\AC@get}
% warns the user by printing the name in bold with an exclamation
@@ -1475,12 +1488,17 @@ blocks to be tested separately. The latter are commonly indicated as
% saved in \fnacro.
% \begin{macrocode}
\newcommand*\AC@get[3]{%
- \ifx#1\relax
- \PackageWarning{acronym}{Acronym `#3' is not defined}%
- \textbf{#3!}%
+ \ifx#1\relax
+ \PackageWarning{acronym}{Acronym `#3' is not defined}%
+ \textbf{#3!}%
+ \else
+ \ifAC@upper
+ \@firstupper{\expandafter#2#1}%
\else
- \expandafter#2#1%
- \fi}
+ \expandafter#2#1%
+ \fi
+ \fi
+}
% \end{macrocode}
% \end{macro}
%
@@ -1500,7 +1518,9 @@ blocks to be tested separately. The latter are commonly indicated as
% \end{macrocode}
% \begin{macrocode}
\newcommand*\AC@Acl[1]{%
- \@firstupper\expandafter{\AC@acl{#1}}%
+ \AC@uppertrue%
+ \AC@acl{#1}%
+ \AC@upperfalse%
}
% \end{macrocode}
% \end{macro}
@@ -1780,25 +1800,26 @@ blocks to be tested separately. The latter are commonly indicated as
% \end{macrocode}
% \begin{macrocode}
\newcommand*{\@iaci}[1]{%
- \ifcsname fn@#1@IL\endcsname
- \ifAC@dua
- \csname fn@#1@IL\endcsname%
- \else
- \expandafter\ifx\csname AC@\AC@prefix#1\endcsname\AC@used%
+ \ifcsname fn@#1@IL\endcsname
+ \ifAC@dua
+ \csname fn@#1@IL\endcsname%
+ \else
+ \expandafter\ifx\csname AC@\AC@prefix#1\endcsname\AC@used%
\csname fn@#1@IS\endcsname%
\else
\csname fn@#1@IL\endcsname%
\fi
- \fi
- \else
- a%
- \fi
+ \fi
+ \else
+ a%
+ \fi
}
\newcommand*{\@iac}[2][\AC@linebreakpenalty]{%
\@iaci{#2} \ifAC@starred\ac*[#1]{#2}\else\ac[#1]{#2}\fi%
}
\newcommand*{\@Iac}[2][\AC@linebreakpenalty]{%
- \@firstupper{\@iaci{#2}} \ifAC@starred\ac*[#1]{#2}\else\ac[#1]{#2}\fi%
+ \@firstupper{\@iaci{#2}}\space%
+ \ifAC@starred\ac*[#1]{#2}\else\ac[#1]{#2}\fi%
}
% \end{macrocode}
% \end{macro}
diff --git a/Master/texmf-dist/source/latex/adjustbox/adjustbox.dtx b/Master/texmf-dist/source/latex/adjustbox/adjustbox.dtx
index ebcfeb71763..e6cdb33f377 100644
--- a/Master/texmf-dist/source/latex/adjustbox/adjustbox.dtx
+++ b/Master/texmf-dist/source/latex/adjustbox/adjustbox.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%<=*COPYRIGHT>
-%% Copyright (C) 2011-2019 by Martin Scharrer <martin@scharrer-online.de>
+%% Copyright (C) 2011-2020 by Martin Scharrer <martin@scharrer-online.de>
%% ----------------------------------------------------------------------
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -26,10 +26,10 @@
%<*driver>
\ProvidesFile{adjustbox.dtx}[%
%<=*DATE>
- 2019/01/04
+ 2020/08/19
%<=/DATE>
%<=*VERSION>
- v1.2
+ v1.3
%<=/VERSION>
DTX file for the adjustbox package]
\documentclass[a4paper]{ydoc}[2011/08/11]
@@ -148,7 +148,7 @@
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ^^A Title page (((
-% \CheckSum{3447}
+% \CheckSum{3488}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -255,6 +255,15 @@
% * Added \provideadjustboxenv and \declareadjustboxenv.
% * Added \provideadjustboxcmd and \declareadjustboxcmd.
% }
+% \changes{v1.3}{2020/08/19}{%^^A
+% * Added support for (hopefully) all 'graphicx' keys.
+% * Added missing \leavevmode for framing keys.
+% * Added key "leavevmode" on request of Frank Mittelbach.
+% * Added 'process' key.
+% * Added 'clap' key on user request.
+% * Removed old graphicx key 'print'.
+% * trimclip: Added explicit luatex driver which uses the pdftex driver to avoid the fallback to PGF driver.
+% }
%
% \GetFileInfo{adjustbox.dtx}
%
@@ -262,7 +271,7 @@
%
% \author{Martin Scharrer}
% \email{martin@scharrer-online.de}
-% \repository{https://bitbucket.org/martin_scharrer/adjustbox}
+% \repository{https://helixteamhub.cloud/scharrer/projects/adjustbox/}
% \ydocpdfsettings
% \maketitle
%
@@ -1287,6 +1296,11 @@
% It does not expect a value and will ignore it if provided.
%
%
+% \DescribeKey{leavevmode}
+% This key will issue an \Macro\leavevmode for the \Macro\adjustbox to enter paragraph mode, i.e.\ it starts a paragraph.
+% This is usually done automatically by all Keys, but is provided as a failsafe in case of any bugs.
+%
+%
% \DescribeMacro\centerbox[<width>]{<content>}
% \vspace{-1.5\baselineskip}\nopagebreak
% \DescribeEnv[<content>]{centerbox}[<width>]
@@ -1442,8 +1456,10 @@
%
% \DescribeKey{rlap}
% \DescribeKey{llap}
-% This makes the content to be officially 0pt wide and lap over to the right or left, respectively, like the \LaTeX\ macros \Macro\rlap and \Macro\llap do.
-% These are shortcuts for \Key{lap}'='\AlsoMacro\width and \Key{lap}'=-'\AlsoMacro\width, respectively. The values for these keys are ignored and should not be used.
+% \DescribeKey{clap}
+% This makes the content to be officially 0pt wide and lap over to the right or left, respectively, like the \LaTeX\ macros \Macro\rlap, \Macro\llap and \Macro\clap do.
+% These are shortcuts for \Key{lap}'='\AlsoMacro\width, \Key{lap}'=-'\AlsoMacro\width and \Key{lap}'={0pt}{-0.5'\AlsoMacro\width'}', respectively.
+% The values for these keys are ignored and should not be used.
%
% \begin{examples}
% \begin{examplecode}
@@ -1452,6 +1468,9 @@
% \begin{examplecode}
% \adjustbox{llap}{Some content}
% \end{examplecode}
+% \begin{examplecode}
+% \adjustbox{clap}{Some content}
+% \end{examplecode}
% \end{examples}
%
%
@@ -1528,7 +1547,6 @@
% \DescribeKey{ocobjref}
% \DescribeKey{page}'='<page numbers>
% \DescribeKey{pagebox}
-% \DescribeKey{print}
% \DescribeKey{quiet}
% \DescribeKey{resetcolor}
% \DescribeKey{resolution}
@@ -2072,6 +2090,13 @@
%
%
% ^^A )))2
+% \clearpage\subsection{Process content} ^^A (((2
+%
+% \DescribeKey{process}
+% This key processes the keys and content encountered so far (i.e.\ all keys to its left) and sets the dimension macros to the sizes of the result.
+% It is only required for certain key combinations, mostly the ones taken from \pkg{graphicx}, which are otherwise processed together.
+%
+% ^^A )))2
% \clearpage\subsection{Experimental Keys} ^^A (((2
% The following features are experimental and may not work correctly yet.
% At the moment the \pkg{storebox} package must be loaded manually for this keys.
@@ -2207,6 +2232,16 @@
\DeclareOptionX<Adjbox>{PGF}{\PassOptionsToPackage{pgf}{trimclip}\AtEndOfPackage{\RequirePackage{pgf}\adjcalcset{pgfmath}}}
% \end{macrocode}
%
+% Pass |pkg{graphicx}| options down.
+% \begin{macrocode}
+\DeclareOptionX<Adjbox>{draft}{\PassOptionsToPackage{draft}{graphicx}}
+\DeclareOptionX<Adjbox>{final}{\PassOptionsToPackage{final}{graphicx}}
+\DeclareOptionX<Adjbox>{hiderotate}{\PassOptionsToPackage{hiderotate}{graphicx}}
+\DeclareOptionX<Adjbox>{hidescale}{\PassOptionsToPackage{hidescale}{graphicx}}
+\DeclareOptionX<Adjbox>{hiresbb}{\PassOptionsToPackage{hiresbb}{graphicx}}
+\DeclareOptionX<Adjbox>{demo}{\PassOptionsToPackage{demo}{graphicx}}
+% \end{macrocode}
+%
% Pass all driver options to \pkg{trimclip} and all unknown options to \pkg{graphicx}.
% \begin{macrocode}
\DeclareOptionX*{%
@@ -3331,7 +3366,11 @@
\adjbox@copy@key{bblly}
\adjbox@copy@key{bburx}
\adjbox@copy@key{bbury}
+\adjbox@copy@key{bb}
+\adjbox@copy@key{command}
\adjbox@copy@key{decodearray}
+\adjbox@copy@key{draft}
+\adjbox@copy@key{ext}
\adjbox@copy@key{intent}
\adjbox@copy@key{interpolate}
\adjbox@copy@key{maskarray}
@@ -3339,12 +3378,14 @@
\adjbox@copy@key{natwidth}
\adjbox@copy@key{ocobjnum}
\adjbox@copy@key{ocobjref}
-\adjbox@copy@key{page}
+\adjbox@copy@key{origin}
\adjbox@copy@key{pagebox}
-\adjbox@copy@key{print}
+\adjbox@copy@key{page}
\adjbox@copy@key{quiet}
+\adjbox@copy@key{read}
\adjbox@copy@key{resetcolor}
\adjbox@copy@key{resolution}
+\adjbox@copy@key{type}
\adjbox@copy@key{xmpfile}
% \end{macrocode}
%
@@ -3931,6 +3972,25 @@
% \end{macrocode}
% \end{key}%
%
+% \begin{key}{adjbox}{leavevmode}
+% \begin{macrocode}
+\define@key\adjbox@fam{leavevmode}[]{%
+ \leavevmode
+}
+% \end{macrocode}
+% \end{key}%
+%
+% \begin{macro}{\adjbox@fam}{process}
+% \begin{macrocode}
+\define@key\adjbox@fam{process}[]{%
+ \sbox\collectedbox{\adjbox@esetsize\the\toks@}%
+ \collectbox@setdims
+ \def\adjustbox@content{\usebox\collectedbox}%
+ \toks@{{\adjustbox@content}}
+}
+% \end{macrocode}
+% \end{macro}
+%
% ^^A )))
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Vertical alignment keys} ^^A (((
@@ -4508,6 +4568,7 @@
% \begin{macro}{\adjbox@@frame}[4]{content}{rule width}{separation}{margin}
% \begin{macrocode}
\def\adjbox@@frame#1#2#3#4{%
+ \leavevmode
\ifx\@nnil#2\@nnil\else
\adjsetlength\fboxrule{#2}%
\fi
@@ -5251,6 +5312,14 @@
% \end{key}
%
%
+% \begin{key}{adjbox}{clap}
+% \begin{macrocode}
+\define@key\adjbox@fam{clap}[]{%
+ \adjbox@Gin@Add{\lapbox[0pt]{-0.5\width}}%
+}
+% \end{macrocode}
+% \end{key}%
+%
% \begin{macro}{\lapbox}
% \begin{macrocode}
\newcommand*\lapbox[2][\width-\@tempdimb]{%
diff --git a/Master/texmf-dist/source/latex/adjustbox/trimclip.dtx b/Master/texmf-dist/source/latex/adjustbox/trimclip.dtx
index 0240ff55e25..ab371073257 100644
--- a/Master/texmf-dist/source/latex/adjustbox/trimclip.dtx
+++ b/Master/texmf-dist/source/latex/adjustbox/trimclip.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%<=*COPYRIGHT>
-%% Copyright (C) 2011-2018 by Martin Scharrer <martin@scharrer-online.de>
+%% Copyright (C) 2011-2020 by Martin Scharrer <martin@scharrer-online.de>
%% ----------------------------------------------------------------------
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -16,7 +16,7 @@
%%
%% This work consists of the files trimclip.dtx, adjustbox.ins
%% and the derived files trimclip.sty,
-%% tc-dvips.def, tc-pdftex.def, tc-pgf.def and tc-xetex.def.
+%% tc-dvips.def, tc-pdftex.def, tc-luatex.def, tc-pgf.def and tc-xetex.def.
%% Further author information are located in the .def files.
%%
%<=/COPYRIGHT>
@@ -26,10 +26,10 @@
%<*driver>
\ProvidesFile{trimclip.dtx}[%
%<=*DATE>
- 2018/04/08
+ 2020/08/19
%<=/DATE>
%<=*VERSION>
- v1.1
+ v1.2
%<=/VERSION>
DTX file for the trimclip package]
\documentclass[a4paper]{ydoc}[2011/11/16]
@@ -159,7 +159,7 @@
%</driver>
% \fi
%
-% \CheckSum{1118}
+% \CheckSum{1124}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -180,6 +180,7 @@
%
% \changes{v1.0}{2012/05/16}{First version after extraction from \pkg{adjustbox} package.}
% \changes{v1.1}{2018/04/08}{Driver support for round corner clipping.}
+% \changes{v1.2}{2020/08/19}{Added explicit LuaTeX driver.}
%
% \GetFileInfo{trimclip.dtx}
%
@@ -187,7 +188,7 @@
% \bundle{adjustbox}
% \author{Martin Scharrer}
% \email{martin@scharrer-online.de}
-% ^^A\repository{https://bitbucket.org/martin_scharrer/adjustbox}
+% ^^A\repository{https://helixteamhub.cloud/scharrer/projects/adjustbox/}
% \ydocpdfsettings
% \maketitle
%
@@ -261,8 +262,9 @@
%
% \begin{description}
% \def\Option#1{\item[{{\normalfont\opt{#1}}}]}%
-% \Option{pdftex} Use the |pdftex| driver. This driver is automatically selected for |pdflatex| and |lualatex|
-% and should not be used for any other \LaTeX\ compilers.
+% \Option{pdftex} Use the |pdftex| driver. This driver is automatically selected for |pdflatex|.
+% \Option{luatex} Use the |luatex| driver, which uses the |pdftex| driver internally.
+% This driver is automatically selected for |lualatex|.
% \Option{dvips} Use the |dvips| driver. This driver is automatically selected for |latex|.
% \Option{xetex} Use the |xetex| driver. This driver is automatically selected for |xelatex|.
% \Option{dvipdfm} Use the |xetex| driver which is also compatible with |dvipdfm|.
@@ -536,6 +538,7 @@
\def\tc@driver{tc-\Gin@driver}
\DeclareOption{pgf}{\def\tc@driver{tc-pgf.def}\AtEndOfPackage{\RequirePackage{pgf}}}
\DeclareOption{pdftex}{\def\tc@driver{tc-pdftex.def}\PassOptionsToPackage{pdftex}{graphicx}}
+\DeclareOption{luatex}{\def\tc@driver{tc-luatex.def}\PassOptionsToPackage{luatex}{graphicx}}
\DeclareOption{xetex}{\def\tc@driver{tc-xetex.def}\PassOptionsToPackage{xetex}{graphicx}}
\DeclareOption{dvips}{\def\tc@driver{tc-dvips.def}\PassOptionsToPackage{dvips}{graphicx}}
\DeclareOption{dvipdfm}{\def\tc@driver{tc-xetex.def}\PassOptionsToPackage{xetex}{graphicx}}
@@ -1194,6 +1197,19 @@
%</tc-pdftex.def>
% \fi
%
+% \subsubsection{luatex driver}
+% \iffalse
+%<*tc-luatex.def>
+% \fi
+% \begin{macrocode}
+%<!COPYRIGHT>
+\ProvidesFile{tc-luatex.def}[2020/08/16 v1.0 Clipping driver for luatex]
+\input{tc-pdftex.def}
+% \end{macrocode}
+% \iffalse
+%</tc-luatex.def>
+% \fi
+%
% \subsubsection{dvips driver}
% \iffalse
%<*tc-dvips.def>
diff --git a/Master/texmf-dist/source/latex/akshar/HackNF_B.ttf b/Master/texmf-dist/source/latex/akshar/HackNF_B.ttf
new file mode 100644
index 00000000000..290d487c979
--- /dev/null
+++ b/Master/texmf-dist/source/latex/akshar/HackNF_B.ttf
Binary files differ
diff --git a/Master/texmf-dist/source/latex/akshar/HackNF_BI.ttf b/Master/texmf-dist/source/latex/akshar/HackNF_BI.ttf
new file mode 100644
index 00000000000..8dc2d8a5d86
--- /dev/null
+++ b/Master/texmf-dist/source/latex/akshar/HackNF_BI.ttf
Binary files differ
diff --git a/Master/texmf-dist/source/latex/akshar/HackNF_I.ttf b/Master/texmf-dist/source/latex/akshar/HackNF_I.ttf
new file mode 100644
index 00000000000..d1d70676c04
--- /dev/null
+++ b/Master/texmf-dist/source/latex/akshar/HackNF_I.ttf
Binary files differ
diff --git a/Master/texmf-dist/source/latex/akshar/HackNF_R.ttf b/Master/texmf-dist/source/latex/akshar/HackNF_R.ttf
new file mode 100644
index 00000000000..d770b830ccd
--- /dev/null
+++ b/Master/texmf-dist/source/latex/akshar/HackNF_R.ttf
Binary files differ
diff --git a/Master/texmf-dist/source/latex/akshar/akshar.dtx b/Master/texmf-dist/source/latex/akshar/akshar.dtx
new file mode 100644
index 00000000000..54425516c05
--- /dev/null
+++ b/Master/texmf-dist/source/latex/akshar/akshar.dtx
@@ -0,0 +1,821 @@
+% \iffalse meta-comment
+%
+% File: akshar.dtx
+% ---------------------------------------------------------------------------
+% Package: akshar
+% Author: Vu Van Dung
+% Description: Support for syllables in the Devanagari script
+% Repository: https://github.com/joulev/akshar
+% Bug tracker: https://github.com/joulev/akshar/issues
+% License: The LaTeX Project Public License v1.3c or later
+% ---------------------------------------------------------------------------
+% 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
+%
+% http://www.latex-project.org/lppl.txt.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Vu Van Dung.
+%
+% This work consists of the files akshar.dtx
+% akshar.ins
+% and the derived file akshar.sty.
+% ---------------------------------------------------------------------------
+% The manual uses the following fonts:
+% * Siddhanta for serif font.
+% Source: https://sites.google.com/site/bayaryn
+% * Biolinum for sans font.
+% Source: Package libertine (https://ctan.org/pkg/libertine)
+% * Hack Nerd Font for monospace font.
+% Source: https://www.nerdfonts.com/font-downloads
+% ---------------------------------------------------------------------------
+% \fi
+% \iffalse
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+Package: akshar
+Author: Vu Van Dung
+Version: 0.2 (06 Sep 2020)
+Description: Support for syllables in the Devanagari script
+Repository: https://github.com/joulev/akshar
+Bug tracker: https://github.com/joulev/akshar/issues
+License: The LaTeX Project Public License v1.3c or later.
+ See the source file akshar.dtx for more information.
+%</readme>
+%<*internal>
+\fi
+%</internal>
+%<*driver|package>
+\def\aksharPackageName{akshar}
+\def\aksharPackageVersion{0.2}
+\def\aksharPackageDate{2020/09/06}
+\def\aksharPackageDescription{Support for syllables in the Devanagari script (JV)}
+%</driver|package>
+%<*driver>
+\documentclass{l3doc}
+\renewcommand\MacroLongFont{\ttfamily\small}
+\usepackage[margin=1cm,left=7cm,bottom=1.5cm]{geometry}
+\usepackage{fontspec}
+\usepackage{biolinum}
+\setmainfont{siddhanta}[Scale=0.9,
+ Script=Devanagari,
+ Extension=.ttf]
+\setmonofont{HackNF}[Scale=0.85,
+ Extension=.ttf,
+ UprightFont=*_R,
+ BoldFont=*_B,
+ ItalicFont=*_I,
+ BoldItalicFont=*_BI]
+\newfontfamily{\aksharDocFontFallback}{siddhanta}
+ [Scale=0.9,Script=Devanagari,Extension=.ttf]
+\usepackage[libertine]{newtxmath}
+\renewcommand\meta[1]{$\langle${\itshape\rmfamily#1}$\rangle$}
+\usepackage{newunicodechar}
+\ExplSyntaxOn
+\tl_map_inline:nn { ािीुूेैोौंःॢृॅँ़ॆॊॉॎॏ॓ॕॖॗॄऺऻ꣠꣡꣢꣣꣤꣥꣦꣧꣨꣩꣪꣫꣬꣭꣮꣯꣰꣱ꣿ्कनमस्कारमंळीममडळीममडमंमममडडमंळीममडममंममडडमंळीममड ॑ ॒ ॓ ॔}
+ { \newunicodechar{#1}{{\iffontchar\font`#1\else\aksharDocFontFallback\fi#1}} }
+\ExplSyntaxOff
+\usepackage{akshar}
+\usepackage[listings]{tcolorbox}
+\definecolor{myred}{HTML}{C0392B}
+\definecolor{myblue}{HTML}{2980B9}
+\definecolor{mygreen}{HTML}{27AE60}
+\newtcblisting{codeexample}[1][]{size=minimal,
+ sidebyside gap=1cm,lefthand width=6.5cm,lower separated=false,
+ fontupper=\raggedleft,colback=white,colframe=white,
+ verbatim ignore percent,grow to left by=7cm,text side listing,
+ listing options={basicstyle=\ttfamily\small,keywordstyle=\ttfamily\small,columns=fullflexible,
+ numbers=left,numberstyle=\sffamily\tiny\color{gray},stepnumber=1,numbersep=5pt},#1}
+\pgfkeys{/tcb/.cd,code only/.code={\pgfkeysalso{listing only,grow to left by=-5mm}}}
+\hypersetup{linkcolor=mygreen,urlcolor=myblue,linktoc=page}
+^^A Hacking the index a bit.
+\IndexPrologue
+ {
+ \section*{Index}
+ \markboth{Index}{Index}
+ \addcontentsline{toc}{section}{Index}
+ Underlined page numbers point to the definition,
+ all others indicate the places where it is used or described.
+ }
+\usepackage{sectsty}
+\sectionfont{\LARGE\color{myred}}
+\subsectionfont{\large\color{myblue}}
+\usepackage{fontawesome5}
+\let\bfseries\mdseries^^A For consistency
+\parindent=0pt\relax
+\IndexMin=100pt\relax
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+\DocInput{\aksharPackageName.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+%
+% \title{The \pkg{\aksharPackageName} package}
+% \author{Vu Van Dung}
+% \date^^A
+% {^^A
+% Version \aksharPackageVersion\ --- \aksharPackageDate\\[1ex]^^A
+% {\small\faIcon{link}\quad\url{https://ctan.org/pkg/akshar}}\\^^A
+% {\small\faIcon{github}\quad\url{https://github.com/joulev/akshar}}^^A
+% }
+%
+% \maketitle
+%
+% \begin{abstract}
+% This package provides tools to deal with special characters in a Devanagari
+% string.
+% \end{abstract}
+%
+% \tableofcontents
+% \parskip=1ex
+%
+% \begin{documentation}
+% \section{Introduction}
+% When dealing with processing strings in the Devanagari script, normal \LaTeX\
+% commands usually find some difficulties in distinguishing ``normal''
+% characters, like क, and ``special'' characters, for example ् or ी. Let's
+% consider this example code:
+% \begin{codeexample}[]
+%\ExplSyntaxOn
+%\tl_set:Nn \l_tmpa_tl { की }
+%\tl_count:N \l_tmpa_tl \c_space_token tokens.
+%\ExplSyntaxOff
+% \end{codeexample}
+% The output is 2, but the number of characters in it is only one! The reason
+% is quite simple: the compiler treats ी as a normal character, and it shouldn't
+% do so.
+%
+% To tackle that, this package provides \pkg{expl3} functions to ``convert'' a
+% given string, written in the Devanagari script, to a sequence of token lists.
+% each of these token lists is a ``true'' Devanagari character. You can now do
+% anything you want with this sequence; and this package does provide some
+% front-end macros for some simple actions on the input string.
+%
+% \section{User manual}
+%
+% Due to the current implementation, \emph{all} of these macros and functions
+% are \emph{not} expandable.
+%
+% \subsection{\LaTeXe\ macros}\label{latex2e-macros}
+% \begin{function}{\aksharStrLen}
+% \begin{syntax}
+% \cs{aksharStrLen} \marg{token list}
+% \end{syntax}
+% Return the number of Devanagari characters in the \meta{token list}.
+% \end{function}
+% \begin{codeexample}[]
+%There are \aksharStrLen{ नमस्कार } characters in नमस्कार.\par
+%\ExplSyntaxOn
+%\pkg{expl3}~returns~\tl_count:n { नमस्कार },~which~is~wrong.
+%\ExplSyntaxOff
+% \end{codeexample}
+% \begin{function}{\aksharStrHead}
+% \begin{syntax}
+% \cs{aksharStrHead} \marg{token list} \marg{n}
+% \end{syntax}
+% Return the first character of the token list.
+% \end{function}
+% \begin{codeexample}[]
+%\aksharStrHead { मंळीममड }
+% \end{codeexample}
+% \begin{function}{\aksharStrTail}
+% \begin{syntax}
+% \cs{aksharStrTail} \marg{token list} \marg{n}
+% \end{syntax}
+% Return the last character of the token list.
+% \end{function}
+% \begin{codeexample}[]
+%\aksharStrTail { ळीममडमं }
+% \end{codeexample}
+% \begin{function}{\aksharStrChar}
+% \begin{syntax}
+% \cs{aksharStrChar} \marg{token list} \marg{n}
+% \end{syntax}
+% Return the $n$-th character of the token list.
+% \end{function}
+% \begin{codeexample}[]
+%3rd character of नमस्कार is \aksharStrChar{ नमस्कार}{3}.\par
+%\ExplSyntaxOn
+%It~is~not~\tl_item:nn { नमस्कार } {3}.
+%\ExplSyntaxOff
+% \end{codeexample}
+% \begin{function}{\aksharStrReplace, \aksharStrReplace*}
+% \begin{syntax}
+% \cs{aksharStrReplace} \marg{tl 1} \marg{tl 2} \marg{tl 3}
+% \end{syntax}
+% Replace all occurences of \meta{tl 2} in \meta{tl 1} with \meta{tl 3}, and
+% leaves the modified \meta{tl 1} in the input stream.
+%
+% The starred variant will replace only the first occurence of \meta{tl 2},
+% all others are left intact.
+% \end{function}
+% \begin{codeexample}[]
+%\ExplSyntaxOn
+%\pkg{expl3} ~ output:\par
+%\tl_set:Nn \l_tmpa_tl { मममडडमंळीममड }
+%\tl_replace_all:Nnn \l_tmpa_tl { म } { स्का }
+%\tl_use:N \l_tmpa_tl\par
+%\ExplSyntaxOff
+%\cs{aksharStrReplace} output:\par
+%\aksharStrReplace { मममडडमंळीममड } { म } { स्का }
+% \end{codeexample}
+% \begin{codeexample}[]
+%\ExplSyntaxOn
+%\pkg{expl3} ~ output:\par
+%\tl_set:Nn \l_tmpa_tl { ममंममडडमंळीममड }
+%\tl_replace_once:Nnn \l_tmpa_tl { मम } { स्का }
+%\tl_use:N \l_tmpa_tl\par
+%\ExplSyntaxOff
+%\cs{aksharStrReplace*} output:\par
+%\aksharStrReplace* { ममंममडडमंळीममड } { मम } { स्का }
+% \end{codeexample}
+% \begin{function}{\aksharStrRemove, \aksharStrRemove*}
+% \begin{syntax}
+% \cs{aksharStrRemove} \marg{tl 1} \marg{tl 2}
+% \end{syntax}
+% Remove all occurences of \meta{tl 2} in \meta{tl 1}, and leaves the modified
+% \meta{tl 1} in the input stream.
+%
+% The starred variant will remove only the first occurence of \meta{tl 2},
+% all others are left intact.
+% \end{function}
+% \begin{codeexample}[]
+%\ExplSyntaxOn
+%\pkg{expl3} ~ output:\par
+%\tl_set:Nn \l_tmpa_tl { मममडडमंळीममड }
+%\tl_remove_all:Nn \l_tmpa_tl { म }
+%\tl_use:N \l_tmpa_tl\par
+%\ExplSyntaxOff
+%\cs{aksharStrRemove} output:\par
+%\aksharStrRemove { मममडडमंळीममड } { म }
+% \end{codeexample}
+% \begin{codeexample}[]
+%\ExplSyntaxOn
+%\pkg{expl3} ~ output:\par
+%\tl_set:Nn \l_tmpa_tl { ममंममडडमंळीममड }
+%\tl_remove_once:Nn \l_tmpa_tl { मम }
+%\tl_use:N \l_tmpa_tl\par
+%\ExplSyntaxOff
+%\cs{aksharStrRemove*} output:\par
+%\aksharStrRemove* { ममंममडडमंळीममड } { मम }
+% \end{codeexample}
+% \subsection{\pkg{expl3} functions}
+% This section assumes that you have a basic knowledge in \LaTeX3 programming.
+% All macros in \ref{latex2e-macros} directly depend on the following function,
+% so it is much more powerful than all features we have described above.
+% \begin{function}{
+% \akshar_convert:Nn, \akshar_convert:cn,
+% \akshar_convert:Nx, \akshar_convert:cx}
+% \begin{syntax}
+% \cs{akshar_convert:Nn} \meta{seq var} \marg{token list}
+% \end{syntax}
+% This function converts \meta{token list} to a sequence of characters, that
+% sequence is stored in \meta{seq var}.
+% \end{function}
+% \begin{codeexample}[]
+%\ExplSyntaxOn
+%\akshar_convert:Nn \l_tmpa_seq { नमस्कार }
+%\seq_use:Nnnn \l_tmpa_seq { ~and~ } { ,~ } { ,~and~ }
+%\ExplSyntaxOff
+% \end{codeexample}
+% \end{documentation}
+%
+% \StopEventually{\PrintIndex}
+%
+% \begin{implementation}
+% \section{Implementation}
+% \begin{macrocode}
+%<@@=akshar>
+%<*package>
+% \end{macrocode}
+% Declare the package. By loading \pkg{fontspec}, \pkg{xparse}, and in turn,
+% \pkg{expl3}, are also loaded.
+% \begin{macrocode}
+\RequirePackage{fontspec}
+\ProvidesExplPackage {\aksharPackageName}
+ {\aksharPackageDate} {\aksharPackageVersion} {\aksharPackageDescription}
+% \end{macrocode}
+% \subsection{Variable declarations}
+% \begin{variable}{\c_@@_joining_tl, \c_@@_diacritics_tl}
+% These variables store the special characters we need to take into account:
+% \begin{itemize}
+% \item \cs{c_@@_joining_tl} is the ``connecting'' character ्.
+% \item \cs{c_@@_diacritics_tl} is the list of all diacritics: ा, ि, ी, ु,
+% ू, े, ै, ो, ौ, ं, ः, ॢ, ृ, ॅ, ँ, ़, ॆ, ॊ, ॉ, ॎ, ॏ, ॑,
+% ॒, ॓, ॔, ॕ, ॖ, ॗ, ॄ, ऺ, ऻ, ꣠, ꣡, ꣢, ꣣, ꣤, ꣥, ꣦, ꣧, ꣨, ꣩,
+% ꣪, ꣫, ꣬, ꣭, ꣮, ꣯, ꣰, ꣱, ꣿ.
+% \end{itemize}
+% \begin{macrocode}
+\tl_const:Nn \c_@@_joining_tl { ्}
+\tl_const:Nn \c_@@_diacritics_tl
+ {
+ ा, ि, ी, ु, ू, े, ै, ो, ौ, ं, ः, ॢ, ृ,
+ ॅ, ँ, ़, ॆ, ॊ, ॉ, ॎ, ॏ, ॑, ॒, ॓, ॔, ॕ, ॖ, ॗ,
+ ॄ, ऺ, ऻ, ꣠, ꣡, ꣢, ꣣, ꣤, ꣥, ꣦, ꣧, ꣨, ꣩, ꣪,
+ ꣫, ꣬, ꣭, ꣮, ꣯, ꣰, ꣱, ꣿ
+ }
+% \end{macrocode}
+% \end{variable}
+% \begin{variable}{\l_@@_prev_joining_bool}
+% When we get to a normal character, we need to know whether it is joined, i.e.
+% whether the previous character is the joining character. This boolean variable
+% takes care of that.
+% \begin{macrocode}
+\bool_new:N \l_@@_prev_joining_bool
+% \end{macrocode}
+% \end{variable}
+% \begin{variable}{\l_@@_char_seq}
+% This local sequence stores the output of the converter.
+% \begin{macrocode}
+\seq_new:N \l_@@_char_seq
+% \end{macrocode}
+% \end{variable}
+% \begin{variable}{\c_@@_str_g_tl, \c_@@_str_seq_tl, \c_@@_str_comma_tl}
+% Some self-descriptive constant variables.
+% \begin{macrocode}
+\tl_const:Nx \c_@@_str_g_tl { \tl_to_str:n {g} }
+\tl_const:Nx \c_@@_str_seq_tl { \tl_to_str:n {seq} }
+\tl_const:Nx \c_@@_str_comma_tl { \tl_to_str:n {,} }
+% \end{macrocode}
+% \end{variable}
+% \begin{variable}{\l_@@_tmpa_tl, \l_@@_tmpb_tl, \l_@@_tmpa_seq, \l_@@_tmpb_seq,
+% \l_@@_tmpc_seq, \l_@@_tmpd_seq, \l_@@_tmpe_seq,
+% \l_@@_tmpa_int, \l_@@_tmpb_int}
+% Some temporary variables.
+% \begin{macrocode}
+\tl_new:N \l_@@_tmpa_tl
+\tl_new:N \l_@@_tmpb_tl
+\seq_new:N \l_@@_tmpa_seq
+\seq_new:N \l_@@_tmpb_seq
+\seq_new:N \l_@@_tmpc_seq
+\seq_new:N \l_@@_tmpd_seq
+\seq_new:N \l_@@_tmpe_seq
+\int_new:N \l_@@_tmpa_int
+\int_new:N \l_@@_tmpb_int
+% \end{macrocode}
+% \end{variable}
+% \subsection{Messages}
+% In \cs{akshar_convert:Nn} and friends, the argument needs to be a sequence
+% variable. There will be an error if it isn't.
+% ^^A I use underscore here because my editor has a good support for it.
+% \begin{macrocode}
+\msg_new:nnnn { akshar } { err_not_a_sequence_variable }
+ { #1 ~ is ~ not ~ a ~ valid ~ LaTeX3 ~ sequence ~ variable. }
+ {
+ You ~ have ~ requested ~ me ~ to ~ assign ~ some ~ value ~ to ~
+ the ~ control ~ sequence ~ #1, ~ but ~ it ~ is ~ not ~ a ~ valid ~
+ sequence ~ variable. ~ Read ~ the ~ documentation ~ of ~ expl3 ~
+ for ~ more ~ information. ~ Proceed ~ and ~ I ~ will ~ pretend ~
+ that ~ #1 ~ is ~ a ~ local ~ sequence ~ variable ~ (beware ~ that ~
+ unexpected ~ behaviours ~ may ~ occur).
+ }
+% \end{macrocode}
+% In \cs{aksharStrChar}, we need to guard against accessing an `out-of-bound'
+% character (like trying to get the 8th character in a 5-character string.)
+% \begin{macrocode}
+\msg_new:nnnn { akshar } { err_character_out_of_bound }
+ { Character ~ index ~ out ~ of ~ bound. }
+ {
+ You ~ are ~ trying ~ to ~ get ~ the ~ #2 ~ character ~ of ~ the ~
+ string ~ #1. ~ However ~ that ~ character ~ doesn't ~ exist. ~
+ Make ~ sure ~ that ~ you ~ use ~ a ~ number ~ between ~ and ~ not ~
+ including ~ 0 ~ and ~ #3, ~ so ~ that ~ I ~ can ~ return ~ a ~
+ good ~ output. ~ Proceed ~ and ~ I ~ will ~ return ~
+ \token_to_str:N \scan_stop:.
+ }
+% \end{macrocode}
+% In \cs{aksharStrHead} and \cs{aksharStrTail}, the string must not be blank.
+% \begin{macrocode}
+\msg_new:nnnn { akshar } { err_string_empty }
+ { The ~ input ~ string ~ is ~ empty. }
+ {
+ To ~ get ~ the ~ #1 ~ character ~ of ~ a ~ string, ~ that ~ string ~
+ must ~ not ~ be ~ empty, ~ but ~ the ~ input ~ string ~ is ~ empty.
+ Make ~ sure ~ the ~ string ~ contains ~ something, ~ or ~ proceed ~
+ and ~ I ~ will ~ use ~ \token_to_str:N \scan_stop:.
+ }
+% \end{macrocode}
+% \subsection{Utilities}
+% \begin{macro}[TF,internal]{\tl_if_in:No}
+% When we get to a character which is not the joining one, we need to know if
+% it is a diacritic. The current character is stored in a variable, so an
+% expanded variant is needed. We only need it to expand only \textbf{o}nce.
+% \begin{macrocode}
+\prg_generate_conditional_variant:Nnn \tl_if_in:Nn { No } { TF }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[internal]{\seq_set_split:Nxx}
+% A variant we will need in \cs{@@_var_if_global}.
+% \begin{macrocode}
+\cs_generate_variant:Nn \seq_set_split:Nnn { Nxx }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[internal]{\msg_error:nnx, \msg_error:nnnxx}
+% Some variants of \pkg{l3msg} functions that we will need when issuing error
+% messages.
+% \begin{macrocode}
+\cs_generate_variant:Nn \msg_error:nnn { nnx }
+\cs_generate_variant:Nn \msg_error:nnnnn { nnnxx }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[TF]{\@@_tl_if_in_ncomma:NN}
+% This conditional is essentially \cs{tl_if_in:Nn}, but if |#2| is a comma this
+% conditional always return false.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_tl_if_in_ncomma:NN #1 #2 { T, F, TF }
+ {
+ \tl_if_eq:NNTF \c_@@_str_comma_tl #2 { \prg_return_false: }
+ { \tl_if_in:NoTF #1 {#2} { \prg_return_true: } { \prg_return_false: } }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[TF]{\@@_var_if_global:N}
+% This conditional checks if |#1| is a global sequence variable or not. In other
+% words, it returns true iff |#1| is a control sequence in the format
+% |\g_|\meta{name}|_seq|. If it is not a sequence variable, this function will
+% (TODO) issue an error message.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_var_if_global:N #1 { T, F, TF }
+ {
+ \bool_if:nTF
+ { \exp_last_unbraced:Nf \use_iii:nnn { \cs_split_function:N #1 } }
+ {
+ \msg_error:nnx { akshar } { err_not_a_sequence_variable }
+ { \token_to_str:N #1 }
+ \prg_return_false:
+ }
+ {
+ \seq_set_split:Nxx \l_@@_tmpb_seq { \token_to_str:N _ }
+ { \exp_last_unbraced:Nf \use_i:nnn { \cs_split_function:N #1 } }
+ \seq_get_left:NN \l_@@_tmpb_seq \l_@@_tmpa_tl
+ \seq_get_right:NN \l_@@_tmpb_seq \l_@@_tmpb_tl
+ \tl_if_eq:NNTF \c_@@_str_seq_tl \l_@@_tmpb_tl
+ {
+ \tl_if_eq:NNTF \c_@@_str_g_tl \l_@@_tmpa_tl
+ { \prg_return_true: } { \prg_return_false: }
+ }
+ {
+ \msg_error:nnx { akshar } { err_not_a_sequence_variable }
+ { \token_to_str:N #1 }
+ \prg_return_false:
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_int_append_ordinal:n}
+% Append st, nd, rd or th to interger |#1|. Will be needed in error messages.
+% \begin{macrocode}
+\cs_new:Npn \@@_int_append_ordinal:n #1
+ {
+ #1
+ \int_case:nnF { #1 }
+ {
+ { 11 } { th }
+ { 12 } { th }
+ { 13 } { th }
+ { -11 } { th }
+ { -12 } { th }
+ { -13 } { th }
+ }
+ {
+ \int_compare:nNnTF { #1 } > { -1 }
+ {
+ \int_case:nnF { #1 - 10 * (#1 / 10) }
+ {
+ { 1 } { st }
+ { 2 } { nd }
+ { 3 } { rd }
+ } { th }
+ }
+ {
+ \int_case:nnF { (- #1) - 10 * ((- #1) / 10) }
+ {
+ { 1 } { st }
+ { 2 } { nd }
+ { 3 } { rd }
+ } { th }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \subsection{The \cs{akshar_convert:Nn} function and its variants}
+% \begin{macro}{\akshar_convert:Nn, \akshar_convert:cn,
+% \akshar_convert:Nx, \akshar_convert:cx}
+% This converts |#2| to a sequence of \emph{true} Devanagari characters. The
+% sequence is set to |#1|, which should be a sequence variable.
+% \begin{macrocode}
+\cs_new:Npn \akshar_convert:Nn #1 #2
+ {
+% \end{macrocode}
+% Clear anything stored in advance. We don't want different calls of the
+% function to conflict with each other.
+% \begin{macrocode}
+ \seq_clear:N \l_@@_char_seq
+ \bool_set_false:N \l_@@_prev_joining_bool
+% \end{macrocode}
+% Loop through every token of the input.
+% \begin{macrocode}
+ \tl_map_variable:NNn {#2} \l_@@_map_tl
+ {
+ \@@_tl_if_in_ncomma:NNTF
+ \c_@@_diacritics_tl \l_@@_map_tl
+ {
+% \end{macrocode}
+% It is a diacritic. We append the current diacritic to the last item of the
+% sequence instead of pushing the diacritic to a new sequence item.
+% \begin{macrocode}
+ \seq_pop_right:NN \l_@@_char_seq \l_@@_tmpa_tl
+ \seq_put_right:Nx \l_@@_char_seq
+ { \l_@@_tmpa_tl \l_@@_map_tl }
+ }
+ {
+ \tl_if_eq:NNTF \l_@@_map_tl \c_@@_joining_tl
+ {
+% \end{macrocode}
+% In this case, the character is the joining character, ्. What we do is
+% similar to the above case, but \cs{l_@@_prev_joining_bool} is set to true so
+% that the next character is also appended to this item.
+% \begin{macrocode}
+ \seq_pop_right:NN \l_@@_char_seq \l_@@_tmpa_tl
+ \seq_put_right:Nx \l_@@_char_seq
+ { \l_@@_tmpa_tl \l_@@_map_tl }
+ \bool_set_true:N \l_@@_prev_joining_bool
+ }
+ {
+% \end{macrocode}
+% Now the character is normal. We see if we can push to a new item or not. It
+% depends on the boolean variable.
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_prev_joining_bool
+ {
+ \seq_pop_right:NN \l_@@_char_seq \l_@@_tmpa_tl
+ \seq_put_right:Nx \l_@@_char_seq
+ { \l_@@_tmpa_tl \l_@@_map_tl }
+ \bool_set_false:N \l_@@_prev_joining_bool
+ }
+ {
+ \seq_put_right:Nx
+ \l_@@_char_seq { \l_@@_map_tl }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+% Set |#1| to \cs{l_@@_char_seq}. The package automatically determines whether
+% the variable is a global one or a local one.
+% \begin{macrocode}
+ \@@_var_if_global:NTF #1
+ { \seq_gset_eq:NN #1 \l_@@_char_seq }
+ { \seq_set_eq:NN #1 \l_@@_char_seq }
+ }
+% \end{macrocode}
+% Generate variants that might be helpful for some.
+% \begin{macrocode}
+\cs_generate_variant:Nn \akshar_convert:Nn { cn, Nx, cx }
+% \end{macrocode}
+% \end{macro}
+% \subsection{Other internal functions}
+% \begin{macro}{\@@_seq_push_seq:NN}
+% Append sequence |#1| to the end of sequence |#2|. A simple loop will do.
+% \begin{macrocode}
+\cs_new:Npn \@@_seq_push_seq:NN #1 #2
+ { \seq_map_inline:Nn #2 { \seq_put_right:Nn #1 { ##1 } } }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_replace:NnnnN}
+% If |#5| is \cs{c_false_bool}, this function replaces \emph{all} occurences of
+% |#3| in |#2| by |#4| and stores the output sequence to |#1|. If |#5| is
+% \cs{c_true_bool}, the replacement only happens \emph{once}.
+%
+% The algorithm used in this function: We will use \cs{l_@@_tmpa_int} to store
+% the ``current position'' in the sequence of |#3|. At first it is set to |1|.
+%
+% We will store any subsequence of |#2| that may match |#3| to a temporary
+% sequence. If it doesn't match, we push this temporary sequence to the output,
+% but if it matches, |#4| is pushed instead.
+%
+% We loop over |#2|. For each of these loops, we need to make sure the
+% \cs{l_@@_tmpa_int}-th item must indeed appear in |#3|. So we need to compare
+% that with the length of |#3|.
+% \begin{itemize}
+% \item If now \cs{l_@@_tmpa_int} is greater than the length of |#3|, the
+% whole of |#3| has been matched somewhere, so we reinitialize the integer to
+% |1| and push |#4| to the output.
+%
+% Note that it is possible that the current character might be the start of
+% another match, so we have to compare it to the first character of |#3|.
+% If they are not the same, we may now push the current mapping character to
+% the output and proceed; otherwise the current character is pushed to the
+% temporary variable.
+% \item Otherwise, we compare the current loop character of |#2| with the
+% \cs{l_@@_tmpa_int}-th character of |#3|.
+% \begin{itemize}
+% \item If they are the same, we still have a chance that it will match, so
+% we increase the ``iterator'' \cs{l_@@_tmpa_int} by |1| and push the
+% current mapping character to the temporary sequence.
+% \item If they are the same, the temporary sequence won't match. Let's push
+% that sequence to the output and set the iterator back to |1|.
+%
+% Note that now the iterator has changed. Who knows whether the current
+% character may start a match? Let's compare it to the first character of
+% |#3|, and do as in the case of \cs{l_@@_tmpa_int} is greater than the
+% length of |#3|.
+% \end{itemize}
+% \end{itemize}
+% The complexity of this algorithm is $O(m\max(n,p))$, where $m,n,p$ are the
+% lengths of the sequences created from |#2|, |#3| and |#4|. As |#3| and |#4|
+% are generally short strings, this is (almost) linear to the length of the
+% original sequence |#2|.
+% \begin{macrocode}
+\cs_new:Npn \@@_replace:NnnnN #1 #2 #3 #4 #5
+ {
+ \akshar_convert:Nn \l_@@_tmpc_seq {#2}
+ \akshar_convert:Nn \l_@@_tmpd_seq {#3}
+ \akshar_convert:Nn \l_@@_tmpe_seq {#4}
+ \seq_clear:N \l_@@_tmpa_seq
+ \seq_clear:N \l_@@_tmpb_seq
+ \int_set:Nn \l_@@_tmpa_int { 1 }
+ \int_set:Nn \l_@@_tmpb_int { 0 }
+ \seq_map_variable:NNn \l_@@_tmpc_seq \l_@@_map_tl
+ {
+ \int_compare:nNnTF { \l_@@_tmpb_int } > { 0 }
+ { \seq_put_right:NV \l_@@_tmpb_seq \l_@@_map_tl }
+ {
+ \int_compare:nNnTF
+ {\l_@@_tmpa_int} = {1 + \seq_count:N \l_@@_tmpd_seq}
+ {
+ \bool_if:NT {#5}
+ { \int_incr:N \l_@@_tmpb_int }
+ \seq_clear:N \l_@@_tmpb_seq
+ \@@_seq_push_seq:NN
+ \l_@@_tmpa_seq \l_@@_tmpe_seq
+ \int_set:Nn \l_@@_tmpa_int { 1 }
+ \tl_set:Nx \l_@@_tmpa_tl
+ { \seq_item:Nn \l_@@_tmpd_seq { 1 } }
+ \tl_if_eq:NNTF \l_@@_map_tl \l_@@_tmpa_tl
+ {
+ \int_incr:N \l_@@_tmpa_int
+ \seq_put_right:NV \l_@@_tmpb_seq \l_@@_map_tl
+ }
+ {
+ \seq_put_right:NV \l_@@_tmpa_seq \l_@@_map_tl
+ }
+ }
+ {
+ \tl_set:Nx \l_@@_tmpa_tl
+ {
+ \seq_item:Nn \l_@@_tmpd_seq { \l_@@_tmpa_int }
+ }
+ \tl_if_eq:NNTF \l_@@_map_tl \l_@@_tmpa_tl
+ {
+ \int_incr:N \l_@@_tmpa_int
+ \seq_put_right:NV \l_@@_tmpb_seq \l_@@_map_tl
+ }
+ {
+ \int_set:Nn \l_@@_tmpa_int { 1 }
+ \@@_seq_push_seq:NN
+ \l_@@_tmpa_seq \l_@@_tmpb_seq
+ \seq_clear:N \l_@@_tmpb_seq
+ \tl_set:Nx \l_@@_tmpa_tl
+ { \seq_item:Nn \l_@@_tmpd_seq { 1 } }
+ \tl_if_eq:NNTF \l_@@_map_tl \l_@@_tmpa_tl
+ {
+ \int_incr:N \l_@@_tmpa_int
+ \seq_put_right:NV
+ \l_@@_tmpb_seq \l_@@_map_tl
+ }
+ {
+ \seq_put_right:NV
+ \l_@@_tmpa_seq \l_@@_map_tl
+ }
+ }
+ }
+ }
+ }
+ \@@_seq_push_seq:NN \l_@@_tmpa_seq \l_@@_tmpb_seq
+ \@@_var_if_global:NTF #1
+ { \seq_gset_eq:NN #1 \l_@@_tmpa_seq }
+ { \seq_set_eq:NN #1 \l_@@_tmpa_seq }
+ }
+% \end{macrocode}
+% \end{macro}
+% \subsection{Front-end \LaTeXe\ macros}
+% \begin{macro}{\aksharStrLen}
+% Expands to the length of the string.
+% \begin{macrocode}
+\NewDocumentCommand \aksharStrLen {m}
+ {
+ \akshar_convert:Nn \l_@@_tmpa_seq {#1}
+ \seq_count:N \l_@@_tmpa_seq
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\aksharStrChar}
+% Returns the $n$-th character of the string.
+% \begin{macrocode}
+\NewDocumentCommand \aksharStrChar {mm}
+ {
+ \akshar_convert:Nn \l_@@_tmpa_seq {#1}
+ \bool_if:nTF
+ {
+ \int_compare_p:nNn {#2} > {0} &&
+ \int_compare_p:nNn {#2} < {1 + \seq_count:N \l_@@_tmpa_seq}
+ }
+ { \seq_item:Nn \l_@@_tmpa_seq { #2 } }
+ {
+ \msg_error:nnnxx { akshar } { err_character_out_of_bound }
+ { #1 } { \@@_int_append_ordinal:n { #2 } }
+ { \int_eval:n { 1 + \seq_count:N \l_@@_tmpa_seq } }
+ \scan_stop:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\aksharStrHead}
+% Return the first character of the string.
+% \begin{macrocode}
+\NewDocumentCommand \aksharStrHead {m}
+ {
+ \akshar_convert:Nn \l_@@_tmpa_seq {#1}
+ \int_compare:nNnTF { \seq_count:N \l_@@_tmpa_seq } = {0}
+ {
+ \msg_error:nnn { akshar } { err_character_out_of_bound }
+ { first }
+ \scan_stop:
+ }
+ { \seq_item:Nn \l_@@_tmpa_seq { 1 } }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\aksharStrTail}
+% Return the last character of the string.
+% \begin{macrocode}
+\NewDocumentCommand \aksharStrTail {m}
+ {
+ \akshar_convert:Nn \l_@@_tmpa_seq {#1}
+ \int_compare:nNnTF { \seq_count:N \l_@@_tmpa_seq } = {0}
+ {
+ \msg_error:nnn { akshar } { err_character_out_of_bound }
+ { last }
+ \scan_stop:
+ }
+ { \seq_item:Nn \l_@@_tmpa_seq {\seq_count:N \l_@@_tmpa_seq} }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\aksharStrReplace, \aksharStrReplace*}
+% Replace occurences of |#3| of a string |#2| with another string |#4|.
+% \begin{macrocode}
+\NewDocumentCommand \aksharStrReplace {smmm}
+ {
+ \IfBooleanTF {#1}
+ {
+ \@@_replace:NnnnN \l_@@_tmpa_seq
+ {#2} {#3} {#4} \c_true_bool
+ }
+ {
+ \@@_replace:NnnnN \l_@@_tmpa_seq
+ {#2} {#3} {#4} \c_false_bool
+ }
+ \seq_use:Nn \l_@@_tmpa_seq {}
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\aksharStrRemove, \aksharStrRemove*}
+% Remove occurences of |#3| in |#2|. This is just a special case of
+% \cs{aksharStrReplace}.
+% \begin{macrocode}
+\NewDocumentCommand \aksharStrRemove {smm}
+ {
+ \IfBooleanTF {#1}
+ {
+ \@@_replace:NnnnN \l_@@_tmpa_seq
+ {#2} {#3} {} \c_true_bool
+ }
+ {
+ \@@_replace:NnnnN \l_@@_tmpa_seq
+ {#2} {#3} {} \c_false_bool
+ }
+ \seq_use:Nn \l_@@_tmpa_seq {}
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+% \end{implementation}
+%
+% \Finale
diff --git a/Master/texmf-dist/source/latex/akshar/akshar.ins b/Master/texmf-dist/source/latex/akshar/akshar.ins
new file mode 100644
index 00000000000..b5c73a6d429
--- /dev/null
+++ b/Master/texmf-dist/source/latex/akshar/akshar.ins
@@ -0,0 +1,47 @@
+% File: akshar.ins
+\input l3docstrip.tex
+
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+---------------------------------------------------------------------------
+Package: akshar
+Author: Vu Van Dung
+Description: Support for syllables in the Devanagari script
+Repository: https://github.com/joulev/akshar
+Bug tracker: https://github.com/joulev/akshar/issues
+License: The LaTeX Project Public License v1.3c or later
+---------------------------------------------------------------------------
+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
+
+ http://www.latex-project.org/lppl.txt.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is Vu Van Dung.
+
+This work consists of the files akshar.dtx
+ akshar.ins
+and the derived file akshar.sty.
+---------------------------------------------------------------------------
+
+\endpreamble
+
+\usedir{tex/latex/\jobname}
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+
+\nopreamble\nopostamble
+\usedir{doc/latex/\jobname}
+\generate{
+ \file{README.txt}{\from{\jobname.dtx}{readme}}
+}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/akshar/siddhanta.ttf b/Master/texmf-dist/source/latex/akshar/siddhanta.ttf
new file mode 100644
index 00000000000..84ce187ee99
--- /dev/null
+++ b/Master/texmf-dist/source/latex/akshar/siddhanta.ttf
Binary files differ
diff --git a/Master/texmf-dist/source/latex/algxpar/algxpar.dtx b/Master/texmf-dist/source/latex/algxpar/algxpar.dtx
index bac74b7a352..d1263d7997c 100644
--- a/Master/texmf-dist/source/latex/algxpar/algxpar.dtx
+++ b/Master/texmf-dist/source/latex/algxpar/algxpar.dtx
@@ -26,7 +26,7 @@
overlay first and middle={
\coordinate (A1) at ($(interior.south east) + (-10pt,5pt)$);
\coordinate (C1) at ($(interior.south east) + (-6pt,7.5pt)$);
- \draw[fill=tcbcol@frame] (A1) -- +(0,5pt) -- (C1) -- cycle;
+ \draw[fill=tcbcolframe] (A1) -- +(0,5pt) -- (C1) -- cycle;
},
]%
\begin{Verbatim}[gobble = 2, tabsize=4, commandchars = &\[\]]%
@@ -70,7 +70,7 @@
overlay first and middle={
\coordinate (A1) at ($(interior.south east) + (-10pt,5pt)$);
\coordinate (C1) at ($(interior.south east) + (-6pt,7.5pt)$);
- \draw[fill=tcbcol@frame] (A1) -- +(0,5pt) -- (C1) -- cycle;
+ \draw[fill=tcbcolframe] (A1) -- +(0,5pt) -- (C1) -- cycle;
},
]%
\small\VerbatimInput[tabsize=4, gobble = 2]{\jobname_code.tmp}
@@ -135,7 +135,7 @@
% Right brace \} Tilde \~}
%
%
-% \changes{v0.9}{2019/10/23}{Initial version}
+% \changes{v0.9}{2019/10/24}{Initial version}
%
% \GetFileInfo{algxpar.sty}
%
@@ -287,6 +287,12 @@
% \Statep{$s \gets a + b$}
% \Statep{\Write\ $s$}\end{example}
%
+% \DescribeMacro{\Set}
+% \DescribeMacro{\Setl}
+% Besides |\gets|, the macros |\Set| and |\Setl| can be used for assignments.
+%
+% |\Set|\marg{id}\marg{value} is a shortcut to |\Id{id} \gets value|. The ``long'' version for the assigment is |\Setl|\marg{id}\marg{value}, to get the verbose ``\algorithmicset\ \Id{id} \algorithmicsetto\ \Id{value}''.
+%
% \subsection{Comments}
% Comments use the symbol \makeatletter\axp@commentleftsymbol\makeatother\ preceding the commented text and stay close to the left margin. Comment macros are intended to be used with |\State| or |\Statex|, when no multiline handling is done. Comments with multiline control are considered starting at section~\ref{sec:statements}.
%
@@ -553,7 +559,7 @@
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{algxpar}
- [2019/10/24 v0.9 Algorithms with multiline/paragraph support]
+ [2020/05/30 v0.91 Algorithms with multiline/paragraph support]
% \end{macrocode}
% \iffalse
@@ -593,16 +599,17 @@
% \begin{macro}{\False}
% \begin{macro}{\Nil}
% \begin{macro}{\Id}
+% \changes{v0.91}{2020/04/30}{Macro now can be used as super-/subscripts in math formulas, while still preventing hyphenaton in text mode.}
% \begin{macro}{\TextString}
% \begin{macro}{\VisibleSpace}
% \begin{macrocode}
-\algnewcommand\algorithmictrue{\textsc{True}}
-\algnewcommand\algorithmicfalse{\textsc{False}}
-\algnewcommand\algorithmicnil{\textsc{Nil}}
-\algnewcommand\True{\mbox{\algorithmictrue}}
-\algnewcommand\False{\mbox{\algorithmicfalse}}
-\algnewcommand\Nil{\mbox{\algorithmicnil}}
-\newcommand{\Id}[1]{\mbox{\textit{\rmfamily #1}}}
+\algnewcommand\algorithmictrue{True}
+\algnewcommand\algorithmicfalse{False}
+\algnewcommand\algorithmicnil{Nil}
+\algnewcommand\True{\ensuremath{\textsc{\rmfamily \algorithmictrue}}}
+\algnewcommand\False{\ensuremath{\textsc{\rmfamily \algorithmicfalse}}}
+\algnewcommand\Nil{\ensuremath{\textsc{\rmfamily \algorithmicnil}}}
+\newcommand{\Id}[1]{\ensuremath{\textit{\rmfamily#1}}}
\newcommand{\TextString}[1]{\textrm{\normalfont``{\ttfamily\mbox{#1}}''}}
\algnewcommand{\VisibleSpace}{\textrm{\color{black!70}\textvisiblespace}}
% \end{macrocode}
@@ -644,14 +651,24 @@
% \fi
% \begin{macro}{\Read}
% \begin{macro}{\Write}
+% \begin{macro}{\Set}
+% \changes{v0.91}{2020/06/14}{New macro for assignments, using $\gets$}
+% \begin{macro}{\Setl}
+% \changes{v0.91}{2020/06/14}{New macro for assignments (verbose)}
% \begin{macrocode}
\algnewcommand{\algorithmicread}{\textbf{read}}
\algnewcommand{\algorithmicwrite}{\textbf{write}}
+\algnewcommand\algorithmicset{Set}
+\algnewcommand\algorithmicsetto{to}
+\algnewcommand{\Set}[2]{\Id{#1} $\gets$ #2}
+\algnewcommand{\Setl}[2]{\algorithmicset\ #1 \algorithmicsetto\ #2}
\algnewcommand{\Read}{\algorithmicread}
\algnewcommand{\Write}{\algorithmicwrite}
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
% \iffalse
%% Comments
@@ -698,7 +715,7 @@
\algblockdefx{While}{EndWhile}%
[2][]{%
\settowidth{\axp@whilewidth}{\algorithmicwhile\ }%
- \algparbox[#1]{\algorithmicwhile\ #2~\algorithmicdo}{\axp@whilewidth}%
+ \algparbox[x#1]{\algorithmicwhile\ #2~\algorithmicdo}{\axp@whilewidth}%
}%
{\algorithmicend\ \algorithmicwhile}
% \end{macrocode}
@@ -913,10 +930,11 @@
% \end{macro}
% \end{environment}
+% \changes{v0.91}{2020/04/30}{Small fix in the position of the triangle in line numbers.}
% \begin{macro}{\alglinenumber}
% \begin{macrocode}
\algrenewcommand{\alglinenumber}[1]%
- {\hspace{-1em}\color{black!35}{\scriptsize#1}{\tiny$\blacktriangleright$}}
+ {\hspace{-1.5em}\color{black!35}{\scriptsize#1}\raisebox{0.2ex}{\tiny$\blacktriangleright$}}
% \end{macrocode}
% \end{macro}
@@ -998,45 +1016,95 @@
% \renewcommand{\axp@commentrightsymbol}{\texttt{*/}}
% \end{commands}
%
-% The translation to Brazilian Portugues is straight forward.
+% To handle languages, the macro |\algxparset| should be used.
%
% \begin{macrocode}
-\ifaxp@brazilian
-\RequirePackage{icomma} % comma as decimal separator
-\algrenewcommand\algorithmicdescription{\textbf{Descrição}}
-\algrenewcommand\algorithmicinput{\textbf{Entrada}}
-\algrenewcommand\algorithmicoutput{\textbf{Saída}}
-\algrenewcommand\algorithmicrequire{\textbf{Pré}}
-\algrenewcommand\algorithmicensure{\textbf{Pós}}
-\algrenewcommand{\algorithmicend}{\textbf{fim}}
-\algrenewcommand{\algorithmicif}{\textbf{se}}
-\algrenewcommand{\algorithmicthen}{\textbf{então}}
-\algrenewcommand{\algorithmicelse}{\textbf{senão}}
-\algrenewcommand{\algorithmicswitch}{\textbf{escolha}}
-\algrenewcommand{\algorithmicof}{\textbf{de}}
-\algrenewcommand{\algorithmiccase}{\textbf{caso}}
-\algrenewcommand{\algorithmicotherwise}{\textbf{caso~contrário}}
-\algrenewcommand{\algorithmicfor}{\textbf{para}}
-\algrenewcommand{\algorithmicdo}{\textbf{faça}}
-\algrenewcommand{\algorithmicwhile}{\textbf{enquanto}}
-\algrenewcommand{\algorithmicforall}{\textbf{para cada}}
-\algrenewcommand{\algorithmicrepeat}{\textbf{repita}}
-\algrenewcommand{\algorithmicuntil}{\textbf{até que}}
-\algrenewcommand{\algorithmicloop}{\textbf{repita}}
-\algrenewcommand{\algorithmicforeach}{\textbf{para~cada}}
-\algrenewcommand{\algorithmicforall}{\textbf{para~todo}}
-\algrenewcommand{\algorithmicfunction}{\textbf{função}}
-\algrenewcommand{\algorithmicprocedure}{\textbf{procedimento}}
-\algrenewcommand{\algorithmicreturn}{\textbf{retorne}}
-\algrenewcommand\algorithmictrue{\textsc{Verdadeiro}}
-\algrenewcommand\algorithmicfalse{\textsc{Falso}}
-\algrenewcommand\algorithmicnil{\textsc{Nulo}}
-\algrenewcommand{\algorithmicread}{\textbf{leia}}
-\algrenewcommand{\algorithmicwrite}{\textbf{escreva}}
-\algrenewcommand{\To}{\textbf{até}}
-\algrenewcommand{\DownTo}{\textbf{decrescente~até}}
-\algrenewcommand{\Step}{\textbf{passo}}
-\fi
+\pgfkeys{
+ algxpar/.cd,
+ brazilian/.code = {\axp@languagebrazilian},
+ english/.code = {\axp@languageenglish},
+ default/.code = {\axp@languageenglish},
+}
+\newcommand{\algxparset}[1]{
+ \pgfkeys{
+ algxpar/.cd,
+ #1
+ }
+}
+\newcommand{\axp@languagebrazilian}{
+ \algrenewcommand\algorithmicdescription{\textbf{Descrição}}
+ \algrenewcommand\algorithmicinput{\textbf{Entrada}}
+ \algrenewcommand\algorithmicoutput{\textbf{Saída}}
+ \algrenewcommand\algorithmicrequire{\textbf{Pré}}
+ \algrenewcommand\algorithmicensure{\textbf{Pós}}
+ \algrenewcommand{\algorithmicend}{\textbf{fim}}
+ \algrenewcommand{\algorithmicif}{\textbf{se}}
+ \algrenewcommand{\algorithmicthen}{\textbf{então}}
+ \algrenewcommand{\algorithmicelse}{\textbf{senão}}
+ \algrenewcommand{\algorithmicswitch}{\textbf{escolha}}
+ \algrenewcommand{\algorithmicof}{\textbf{de}}
+ \algrenewcommand{\algorithmiccase}{\textbf{caso}}
+ \algrenewcommand{\algorithmicotherwise}{\textbf{caso~contrário}}
+ \algrenewcommand{\algorithmicfor}{\textbf{para}}
+ \algrenewcommand{\algorithmicdo}{\textbf{faça}}
+ \algrenewcommand{\algorithmicwhile}{\textbf{enquanto}}
+ \algrenewcommand{\algorithmicrepeat}{\textbf{repita}}
+ \algrenewcommand{\algorithmicuntil}{\textbf{até que}}
+ \algrenewcommand{\algorithmicloop}{\textbf{repita}}
+ \algrenewcommand{\algorithmicforeach}{\textbf{para~cada}}
+ \algrenewcommand{\algorithmicforall}{\textbf{para~todo}}
+ \algrenewcommand{\algorithmicfunction}{\textbf{função}}
+ \algrenewcommand{\algorithmicprocedure}{\textbf{procedimento}}
+ \algrenewcommand{\algorithmicreturn}{\textbf{retorne}}
+ \algrenewcommand{\algorithmictrue}{Verdadeiro}
+ \algrenewcommand{\algorithmicfalse}{Falso}
+ \algrenewcommand{\algorithmicnil}{Nulo}
+ \algrenewcommand{\algorithmicread}{\textbf{leia}}
+ \algrenewcommand{\algorithmicwrite}{\textbf{escreva}}
+ \algrenewcommand{\algorithmicset}{Defina}
+ \algrenewcommand{\algorithmicsetto}{como}
+ \algrenewcommand{\To}{\textbf{até}}
+ \algrenewcommand{\DownTo}{\textbf{decrescente~até}}
+ \algrenewcommand{\Step}{\textbf{passo}}
+}
+\newcommand{\axp@languageenglish}{
+ \algrenewcommand\algorithmicdescription{\textbf{Description}}
+ \algrenewcommand\algorithmicinput{\textbf{Input}}
+ \algrenewcommand\algorithmicoutput{\textbf{Output}}
+ \algrenewcommand\algorithmicrequire{\textbf{Pre}}
+ \algrenewcommand\algorithmicensure{\textbf{Post}}
+ \algrenewcommand{\algorithmicend}{\textbf{end}}
+ \algrenewcommand{\algorithmicif}{\textbf{if}}
+ \algrenewcommand{\algorithmicthen}{\textbf{then}}
+ \algrenewcommand{\algorithmicelse}{\textbf{else}}
+ \algrenewcommand{\algorithmicswitch}{\textbf{swith}}
+ \algrenewcommand{\algorithmicof}{\textbf{of}}
+ \algrenewcommand{\algorithmiccase}{\textbf{case}}
+ \algrenewcommand{\algorithmicotherwise}{\textbf{otherwise}}
+ \algrenewcommand{\algorithmicfor}{\textbf{for}}
+ \algrenewcommand{\algorithmicdo}{\textbf{do}}
+ \algrenewcommand{\algorithmicwhile}{\textbf{while}}
+ \algrenewcommand{\algorithmicrepeat}{\textbf{repeat}}
+ \algrenewcommand{\algorithmicuntil}{\textbf{until}}
+ \algrenewcommand{\algorithmicloop}{\textbf{loop}}
+ \algrenewcommand{\algorithmicforeach}{\textbf{for~each}}
+ \algrenewcommand{\algorithmicforall}{\textbf{for~all}}
+ \algrenewcommand{\algorithmicfunction}{\textbf{function}}
+ \algrenewcommand{\algorithmicprocedure}{\textbf{procedure}}
+ \algrenewcommand{\algorithmicreturn}{\textbf{retorne}}
+ \algrenewcommand{\algorithmictrue}{True}
+ \algrenewcommand{\algorithmicfalse}{False}
+ \algrenewcommand{\algorithmicnil}{Nil}
+ \algrenewcommand{\algorithmicread}{\textbf{read}}
+ \algrenewcommand{\algorithmicwrite}{\textbf{write}}
+ \algrenewcommand{\algorithmicset}{Set}
+ \algrenewcommand{\algorithmicsetto}{to}
+ \algrenewcommand{\To}{\textbf{to}}
+ \algrenewcommand{\DownTo}{\textbf{downto}}
+ \algrenewcommand{\Step}{\textbf{step}}
+}
+\axp@languageenglish % default language
+\ifaxp@brazilian\algxparset{brazilian}\fi
% \end{macrocode}
%
% \section{To do\ldots}
diff --git a/Master/texmf-dist/source/latex/algxpar/algxpar.ins b/Master/texmf-dist/source/latex/algxpar/algxpar.ins
index 289551de474..7e7a9c0ebab 100644
--- a/Master/texmf-dist/source/latex/algxpar/algxpar.ins
+++ b/Master/texmf-dist/source/latex/algxpar/algxpar.ins
@@ -1,3 +1,4 @@
+% !TeX program = createsty.sh % | txs:///view
%%
%% Copyright (C) 2019 by Jander Moreira
%%
@@ -12,11 +13,12 @@
\preamble
-Copyright (C) 2019 by Jander Moreira (moreira.jander@gmail.com)
+Copyright (C) 2020 by Jander Moreira (moreira.jander@gmail.com)
\endpreamble
\generate{
+ \nopreamble\nopostamble
\file{algxpar.sty}{
\from{algxpar.dtx}{algxpar}
}
@@ -31,4 +33,4 @@ Copyright (C) 2019 by Jander Moreira (moreira.jander@gmail.com)
\Msg{*}
\Msg{**********************************************************}
-\endbatchfile \ No newline at end of file
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/amscls/amsclass.dtx b/Master/texmf-dist/source/latex/amscls/amsclass.dtx
index eb6abaf520f..9b8b5b468cf 100644
--- a/Master/texmf-dist/source/latex/amscls/amsclass.dtx
+++ b/Master/texmf-dist/source/latex/amscls/amsclass.dtx
@@ -1,6 +1,6 @@
% \def\filename{amsclass.dtx}
-% \def\fileversion{2.20.4}
-% \def\filedate{2017/10/31}
+% \def\fileversion{2.20.6}
+% \def\filedate{2020/05/29}
%
% \iffalse meta-comment
%
@@ -15,7 +15,7 @@
% fax: (401) 331-3842
% email: tech-support@ams.org
%
-% Copyright 1995, 1999, 2004, 2009, 2015-2017 American Mathematical Society.
+% Copyright 1995, 1999, 2004, 2009-2020 American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -29,7 +29,7 @@
%
% The Current Maintainer of this work is the American Mathematical
% Society.
-%
+%
% \fi
%
% \iffalse
@@ -82,13 +82,13 @@
\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
[1995/06/01]% LaTeX date must be June 1995 or later
%<*amsart>
-\ProvidesClass{amsart}[2017/10/31 v2.20.4]
+\ProvidesClass{amsart}[2020/05/29 v2.20.6]
%</amsart>
%<*amsproc>
-\ProvidesClass{amsproc}[2017/10/31 v2.20.4]
+\ProvidesClass{amsproc}[2020/05/29 v2.20.6]
%</amsproc>
%<*amsbook>
-\ProvidesClass{amsbook}[2017/10/31 v2.20.4]
+\ProvidesClass{amsbook}[2020/05/29 v2.20.6]
%</amsbook>
% \end{macrocode}
% For \pkg{amsthm} we need to guard against redundant loading via
@@ -105,7 +105,7 @@
\csname ver@\@currname.\@currext\endcsname
%</classes>
%<*amsthm>
-\ProvidesPackage{amsthm}[2017/10/31 v2.20.4]
+\ProvidesPackage{amsthm}[2020/05/29 v2.20.6]
%</amsthm>
% \end{macrocode}
%
@@ -1496,13 +1496,13 @@
% To allow various versions of the subject classification, accept an
% optional value to identify the version, provide text for the two
% currently in use, and give a warning if the version specified is
-% unknown. Default to 1991 version. [bnb, 1999/04/30]
+% unknown. Default to 2020 version.
% \begin{macrocode}
-\newcommand*\subjclass[2][1991]{%
+\newcommand*\subjclass[2][2020]{%
\def\@subjclass{#2}%
\@ifundefined{subjclassname@#1}{%
\ClassWarning{\@classname}{Unknown edition (#1) of Mathematics
- Subject Classification; using '1991'.}%
+ Subject Classification; using '2020'.}%
}{%
\@xp\let\@xp\subjclassname\csname subjclassname@#1\endcsname
}%
@@ -2018,23 +2018,26 @@
\newcommand{\abstractname}{Abstract}
\newcommand{\keywordsname}{Key words and phrases}
% \end{macrocode}
-% For now, support just the two most recent versions; earlier versions
+% Support the most recent versions. Earlier, unsupported versions
% were:
% \begin{itemize}
% \item \textup{1980} Mathematics Subject Classification
% \item \textup{1980} Mathematics Subject Classification
% \textup{(1985} Revision\textup{)}
% \end{itemize}
-% Default to the 1991 edition, as that's what is in production at the
-% time this change is made. [bnb, 1999/04/30]
% \begin{macrocode}
-\newcommand{\subjclassname}{%
+\@namedef{subjclassname@1991}{%
\textup{1991} Mathematics Subject Classification}
-\@xp\let\csname subjclassname@1991\endcsname \subjclassname
\@namedef{subjclassname@2000}{%
\textup{2000} Mathematics Subject Classification}
\@namedef{subjclassname@2010}{%
\textup{2010} Mathematics Subject Classification}
+\@namedef{subjclassname@2020}{%
+ \textup{2020} Mathematics Subject Classification}
+% \end{macrocode}
+% Default to the 2020 edition.
+% \begin{macrocode}
+\@xp\let\@xp\subjclassname\csname subjclassname@2020\endcsname
% \end{macrocode}
% For the date we have a special little problem: We only want to add
% the `Received by the editors' text for publication-specific
diff --git a/Master/texmf-dist/source/latex/amscls/amsclass.ins b/Master/texmf-dist/source/latex/amscls/amsclass.ins
index 5f5aa983031..7c63d7fa69a 100644
--- a/Master/texmf-dist/source/latex/amscls/amsclass.ins
+++ b/Master/texmf-dist/source/latex/amscls/amsclass.ins
@@ -1,6 +1,6 @@
%% filename: amsclass.ins
-%% version: 3.03
-%% date: 2015/03/04
+%% version: 3.04
+%% date: 2020/05/29
%%
%% American Mathematical Society
%% Technical Support
@@ -13,7 +13,7 @@
%% fax: (401) 331-3842
%% email: tech-support@ams.org
%%
-%% Copyright 1999, 2010, 2011, 2014-2017 American Mathematical Society.
+%% Copyright 1995, 1999, 2004, 2009-2020 American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -37,10 +37,9 @@
\keepsilent
\preamble
-
This is a generated file.
-Copyright 1995, 199, 2004, 2009, 2015, 2017 American Mathematical Society.
+Copyright 1995, 1999, 2004, 2009-2020 American Mathematical Society.
American Mathematical Society
Technical Support
diff --git a/Master/texmf-dist/source/latex/amscls/amsclass.pdf b/Master/texmf-dist/source/latex/amscls/amsclass.pdf
new file mode 100644
index 00000000000..cc83c94b8e0
--- /dev/null
+++ b/Master/texmf-dist/source/latex/amscls/amsclass.pdf
Binary files differ
diff --git a/Master/texmf-dist/source/latex/amsmath/amsmath.dtx b/Master/texmf-dist/source/latex/amsmath/amsmath.dtx
index 42f3088867d..7f324700f67 100644
--- a/Master/texmf-dist/source/latex/amsmath/amsmath.dtx
+++ b/Master/texmf-dist/source/latex/amsmath/amsmath.dtx
@@ -86,7 +86,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesPackage{amsmath}[2020/01/20 v2.17e AMS math features]
+\ProvidesPackage{amsmath}[2020/09/23 v2.17i AMS math features]
% \end{macrocode}
%
% \section{Catcode defenses}
@@ -466,24 +466,41 @@ For additional information on amsmath, use the \lq ?\rq\space option.%
% \cs{DeclareRobustCommand}.
% \changes{v2.17b}{2018/12/01}{Start LR-mode for \cs{thinspace} and
% friends if necessary (github/49)}
+%
+% We start by undefining a number of commands (which in a current
+% \LaTeX{} kernel will be defined, so that the
+% \cs{DeclareRobustCommand} declarations below do not add a
+% ``Command redefined'' info into the log.
+% \begin{macrocode}
+\let\tmspace\@undefined
+\let\,\@undefined
+\let\!\@undefined
+\let\:\@undefined
+\let\negmedspace\@undefined
+\let\negthickspace\@undefined
+% \end{macrocode}
+%
+%
+% \changes{v2.17g}{2020/03/07}{Math/text spacing commands are now in
+% the \LaTeX{} kernel and are made robust (gh/303)}
% \begin{macrocode}
\ifx\leavevmode@ifvmode\@undefined
-\DeclareRobustCommand{\tmspace}[3]{%
+\DeclareRobustCommand\tmspace[3]{%
\ifmmode\mskip#1#2\else\kern#1#3\fi\relax}
\else
-\DeclareRobustCommand{\tmspace}[3]{%
+\DeclareRobustCommand\tmspace[3]{%
\ifmmode\mskip#1#2\else\leavevmode@ifvmode\kern#1#3\fi\relax}
\fi
-\renewcommand{\,}{\tmspace+\thinmuskip{.1667em}}
+\DeclareRobustCommand\,{\tmspace+\thinmuskip{.1667em}}
\let\thinspace\,
-\renewcommand{\!}{\tmspace-\thinmuskip{.1667em}}
+\DeclareRobustCommand\!{\tmspace-\thinmuskip{.1667em}}
\let\negthinspace\!
-\renewcommand{\:}{\tmspace+\medmuskip{.2222em}}
+\DeclareRobustCommand\:{\tmspace+\medmuskip{.2222em}}
\let\medspace\:
-\newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}}
-\renewcommand{\;}{\tmspace+\thickmuskip{.2777em}}
+\DeclareRobustCommand\negmedspace{\tmspace-\medmuskip{.2222em}}
+\renewcommand\;{\tmspace+\thickmuskip{.2777em}}
\let\thickspace\;
-\newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}}
+\DeclareRobustCommand\negthickspace{\tmspace-\thickmuskip{.2777em}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -598,8 +615,14 @@ Foreign command \@backslashchar#1;\MessageBreak
% abbreviations for some commonly needed mathstyle overrides. To
% conserve csnames we avoid making \cn{dfrac} and \cn{tfrac} robust
% (\cn{genfrac} is itself robust).
+% \changes{v2.17i}{2020/09/23}{added \cs{Ustack} for luatex (moved patch from lualatex-math)}
% \begin{macrocode}
+%
+\ifx\directlua\@undefined
\DeclareRobustCommand{\frac}[2]{{\begingroup#1\endgroup\@@over#2}}
+\else
+\DeclareRobustCommand{\frac}[2]{{\Ustack{\begingroup#1\endgroup\@@over#2}}}
+\fi
\newcommand{\dfrac}{\genfrac{}{}{}0}
\newcommand{\tfrac}{\genfrac{}{}{}1}
% \end{macrocode}
@@ -732,12 +755,12 @@ Foreign command \@backslashchar#1;\MessageBreak
\fi
}
% \end{macrocode}
-%
+% \changes{v2.17i}{2020/09/23}{added \cs{Ustack} (moved patch from lualatex-math)}
% \begin{macrocode}
\DeclareRobustCommand{\genfrac}[6]{{%
\@mathstyle{#4}%
\genfrac@choice o{#1}%
-{\begingroup#5\endgroup\ifx @#3@\@@over\else\@@above\fi#3\relax#6}%
+{\Ustack {\begingroup#5\endgroup\ifx @#3@\@@over\else\@@above\fi#3\relax#6}}%
\genfrac@choice c{#2}%
}}
% \end{macrocode}
@@ -1633,13 +1656,15 @@ Foreign command \@backslashchar#1;\MessageBreak
% \begin{macro}{\dddot}
% \begin{macro}{\ddddot}
% Triple and quadruple dot accents.
+% \changes{v2.17f}{2020/02/20}{Add a kern so that a single char is not
+% vertically shifted and move the dots slightly to the right (gh/126)}
% \begin{macrocode}
\ams@newcommand{\dddot}[1]{%
- {\mathop{#1}\limits^{\vbox to-1.4\ex@{\kern-\tw@\ex@
- \hbox{\normalfont ...}\vss}}}}
+ {\mathop{\kern\z@#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}}}}
+ {\mathop{\kern\z@#1}\limits^{\vbox to-1.4\ex@{\kern-\tw@\ex@
+ \hbox{\,\normalfont....}\vss}}}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2184,17 +2209,33 @@ Foreign command \@backslashchar#1;\MessageBreak
% 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.
-%
+% \changes{v2.17h}{2020/08/24}{detect unicode engines and use their commands}
% \begin{macrocode}
-\mathchardef\std@minus\mathcode`\-\relax
-\mathchardef\std@equal\mathcode`\=\relax
+\@ifundefined{Umathcode}
+ {%
+ \mathchardef\std@minus\mathcode`\-\relax
+ \mathchardef\std@equal\mathcode`\=\relax
+ }
+ {%
+ \Umathcharnumdef\std@minus\Umathcodenum`\-\relax
+ \Umathcharnumdef\std@equal\Umathcodenum`\=\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
-}
+\@ifundefined{Umathcode}
+ {%
+ \AtBeginDocument{%
+ \mathchardef\std@minus\mathcode`\-\relax
+ \mathchardef\std@equal\mathcode`\=\relax
+ }%
+ }
+ {%
+ \AtBeginDocument{%
+ \Umathcharnumdef\std@minus\Umathcodenum`\-\relax
+ \Umathcharnumdef\std@equal\Umathcodenum`\=\relax
+ }%
+ }
% \end{macrocode}
%
% \begin{macro}{\relbar}
@@ -2301,7 +2342,9 @@ Foreign command \@backslashchar#1;\MessageBreak
% 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.
+% \changes{v2.17i}{2020/09/23}{moved to version from lualatex-math for luatex}
% \begin{macrocode}
+\ifx\directlua\@undefined
\newenvironment{subarray}[1]{%
% \end{macrocode}
% Note: The predecessors of \env{subarray} (\env{Sb} and \env{Sp},
@@ -2340,6 +2383,23 @@ Foreign command \@backslashchar#1;\MessageBreak
}{%
\crcr\egroup\egroup
}
+\else
+\newenvironment{subarray}[1]{%
+ \vcenter\bgroup
+ \Let@ \restore@math@cr \default@tag
+ \baselineskip \Umathstacknumup \scriptstyle
+ \advance\baselineskip \Umathstackdenomdown \scriptstyle
+ \lineskip \Umathstackvgap \scriptstyle
+ \lineskiplimit \lineskip
+ \ialign\bgroup\ifx c#1\hfil\fi
+ \Ustartmath
+ \m@th\scriptstyle##
+ \Ustopmath
+ \hfil\crcr
+}{%
+ \crcr\egroup\egroup
+}
+\fi
% \end{macrocode}
% \end{environment}
%
@@ -3438,7 +3498,8 @@ and fix things up.}
% \end{macro}
%
% \begin{macro}{\black@}
-% \changes{v2.17a}{2017/09/02}{add fixed width box so overfull warning generated in centred environments in lists}
+% \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
@@ -3654,6 +3715,77 @@ and fix things up.}
% \end{macrocode}
% \end{macro}
%
+%
+%
+% \begin{macro}{\ams@start@box}
+% This macro tests the optional positioning argument (in
+% \texttt{gathered} or \texttt{aligned}. It explicitly tests for the
+% value \texttt{b}, \texttt{c} and \texttt{t} and if the value is
+% different, then we assume that it is a bracket group that belongs
+% to the formula instead of being an misspelled optional argument.
+% (In earlier versions of the code anything other than \texttt{b}
+% or \texttt{t} was interpreted as \texttt{c} and the data was
+% otherwise dropped.)
+% \changes{v2.17g}{2020/03/10}{Explicity test for b/t/c and return
+% optional argument is different (gh/5)}
+% \begin{macrocode}
+\def\ams@start@box#1{%
+% \end{macrocode}
+% As we may pick up an arbitrary part of the formula by mistake, we
+% need to be very careful with the testing to avoid low-level
+% errors. This is why we use \cs{detokenize}. But we also need to
+% expand the argument (if possible) in case the position value is
+% hidden inside a macro. We therefore apply the \cs{romannumeral}
+% trick (known as f-expansion in \texttt{expl3}) in its old form.
+% The code assumes that
+% the default is correctly set up (which in this case is \texttt{c}).
+% \begin{macrocode}
+ \edef\reserved@a{\csname ams@pos@\expandafter\detokenize
+ \expandafter{\romannumeral-`\0#1}\endcsname}%
+ \expandafter\ifx\reserved@a\relax
+% \end{macrocode}
+% If the argument is neither \texttt{b}, \texttt{c} or \texttt{t}
+% we save it in \cs{ams@return@opt@arg}, so it can later be
+% returned as part of the environment body. We could at this point
+% also issue a warning that bracket group was found at the start of
+% the formula and that it is safer to add a \cs{relax} before it.
+% \begin{macrocode}
+ \PackageWarning{amsmath}{%
+ Bracket group \detokenize{[#1]} at formula start!\MessageBreak
+ It could be a misspelled positional argument.\MessageBreak
+ If it belongs to the formula add a \relax in\MessageBreak
+ front to hide it}%
+ \def\ams@return@opt@arg{[#1]}\vcenter
+% \end{macrocode}
+% If the argument was identified then we clear
+% \cs{ams@return@opt@arg} (just in case somebod ever nests these
+% environment.
+% \begin{macrocode}
+ \else
+ \let\ams@return@opt@arg\@empty\reserved@a
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macro}{\ams@pos@t}
+% \begin{macro}{\ams@pos@b}
+% \begin{macro}{\ams@pos@c}
+%
+% \begin{macrocode}
+\def\ams@pos@t{\vtop}
+\def\ams@pos@b{\vbox}
+\def\ams@pos@c{\vcenter}
+% \end{macrocode}
+% And we accept an empty argument as a way to get the default (as
+% that was the case before as well, albeit by mistake in some sense).
+% \begin{macrocode}
+\let\ams@pos@\ams@pos@c
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \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
@@ -3678,7 +3810,10 @@ and fix things up.}
% to the margin.
% \begin{macrocode}
\alignedspace@left
- \if #1t\vtop \else \if#1b \vbox \else \vcenter \fi \fi \bgroup
+% \end{macrocode}
+% Select the right kind of box based on the optional argument \verb=#1=.
+% \begin{macrocode}
+ \ams@start@box{#1}\bgroup
\maxfields@#2\relax
\ifnum\maxfields@>\m@ne
\multiply\maxfields@\tw@
@@ -3721,6 +3856,13 @@ and fix things up.}
\hfil
\tabskip\alignsep@
\crcr
+% \end{macrocode}
+% If we picked up a bracket group by mistake here is the place to
+% return it for processing.
+% \changes{v2.17g}{2020/03/10}{Explicity test for b/t/c and return
+% optional argument is different (gh/5)}
+% \begin{macrocode}
+ \ams@return@opt@arg
}
% \end{macrocode}
% \end{macro}
@@ -3805,12 +3947,21 @@ and fix things up.}
\nonmatherr@{\begin{gathered}}%
\fi
\alignedspace@left
- \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi \bgroup
+% \end{macrocode}
+% Select the right kind of box based on the optional argument \verb=#1=.
+% \begin{macrocode}
+ \ams@start@box{#1}\bgroup
\Let@ \chardef\dspbrk@context\@ne \restore@math@cr
\spread@equation
\ialign\bgroup
\hfil\strut@$\m@th\displaystyle##$\hfil
\crcr
+% \end{macrocode}
+% And put a mistaking picked up bracket group back:
+% \changes{v2.17g}{2020/03/10}{Explicity test for b/t/c and return
+% optional argument is different (gh/5)}
+% \begin{macrocode}
+ \ams@return@opt@arg
}{%
\endaligned
}
diff --git a/Master/texmf-dist/source/latex/amsmath/amstext.dtx b/Master/texmf-dist/source/latex/amsmath/amstext.dtx
index a5e8491dc2b..5e7e6ca6720 100644
--- a/Master/texmf-dist/source/latex/amsmath/amstext.dtx
+++ b/Master/texmf-dist/source/latex/amsmath/amstext.dtx
@@ -139,7 +139,7 @@ Bug reports can be opened (category \texttt{#1}) at\\%
% 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
+% is some question whether we should 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
diff --git a/Master/texmf-dist/source/latex/animate/animate.tex b/Master/texmf-dist/source/latex/animate/animate.tex
index 684d9216df6..1cabe9c9fef 100644
--- a/Master/texmf-dist/source/latex/animate/animate.tex
+++ b/Master/texmf-dist/source/latex/animate/animate.tex
@@ -1,11 +1,12 @@
-\ifdefined\outputmode\outputmode=0\fi
-\ifdefined\pdfoutput\pdfoutput=0\fi
+\listfiles
% Copyright 2007--\today Alexander Grahn
%
% This material is subject to the LaTeX Project Public License. See
% http://mirrors.ctan.org/macros/latex/base/lppl.txt
% for the details of that license.
%
+\ifdefined\outputmode\outputmode=0\fi
+\ifdefined\pdfoutput\pdfoutput=0\fi
\documentclass[a4paper]{article}
\frenchspacing
\usepackage[buttonbg=0.9]{animate}
@@ -61,7 +62,7 @@
% \makeatother
%\fi
-\def\keywords{include portable PDF animation SVG animation animated PDF animated SVG dvisvgm html TeX4ht web animating embed animated graphics LaTeX pdfLaTeX LuaLaTeX PSTricks pgf TikZ LaTeX-picture MetaPost inline graphics vector graphics animated GIF LaTeX dvips ps2pdf dvipdfmx XeLaTeX JavaScript Acrobat Reader PDF-XChange Foxit Reader Firefox Chrome Chromium}
+\def\keywords{include portable PDF animation SVG animation animated PDF animated SVG dvisvgm html TeX4ht web animating embed animated graphics LaTeX pdfLaTeX LuaLaTeX PSTricks pgf TikZ LaTeX-picture MetaPost inline graphics vector graphics animated GIF LaTeX dvips ps2pdf dvipdfmx XeLaTeX JavaScript Acrobat Reader KDE Okular PDF-XChange Foxit Reader Firefox Chrome Chromium}
\hypersetup{
pdftitle={The animate Package},
pdfsubject={Documentation},
@@ -112,13 +113,16 @@
\section{Introduction}
This package provides an interface for creating PDF and SVG files with animated content from sets of graphics or image files, from inline graphics, such as \LaTeX-picture, PSTricks or pgf/TikZ generated pictures, or just from typeset text. Unlike standard movie/video formats, package `animate' allows for animating vector graphics. The result is roughly similar to the SWF (Flash) format, although not as space-efficient.
-Package `animate' supports the usual workflows for making PDF, i.\,e. pdf\LaTeX{}, Lua\LaTeX{}, \LaTeX{} $\rightarrow$ \verb+dvips+ $\rightarrow$ \verb+ps2pdf+/Distiller and \pXepLaTeX{} $\rightarrow$ \verb+(x)dvipdfmx+. For animated SVG, it supports the \verb+dvisvgm+ driver. The DVI/XDV used as input for \verb+dvisvgm+ can be generated with \LaTeX{}, Lua\LaTeX{} (in DVI mode) and \XeLaTeX.
+Package `animate' supports the usual workflows for making PDF, i.\,e. pdf\LaTeX{}, Lua\-\LaTeX{}, \LaTeX{} $\rightarrow$ \verb+dvips+ $\rightarrow$ \verb+ps2pdf+/Distiller and \pXepLaTeX{} $\rightarrow$ \verb+(x)dvipdfmx+. For animated SVG, it supports the \verb+dvisvgm+ driver. The DVI/XDV used as input for \verb+dvisvgm+ can be generated with \LaTeX{}, Lua\LaTeX{} (in DVI mode with command `\verb+dvilualatex+') and \XeLaTeX{} (with option `\verb+--no-pdf+').
-PDF files with animations can be viewed in Acrobat Reader (except on mobile devices), PDF-XChange and Foxit Reader. Animated SVG produced by means of \LaTeX{} and \verb+dvisvgm+ are self-contained files that can be embedded into HTML using the \verb+<object>+ tag or opened directly in a Web browser, such as Chromium or Firefox.
+PDF files with animations can be viewed in Acrobat Reader (except on mobile devices), KDE Okular, PDF-XChange and Foxit Reader.
-The user interacts with the animation through optional animation controls or using the mouse like so: pressing the mouse button over the animation widget immediately pauses a playing animation and releasing it resumes playback. Pressing the shift-key at the same time reverses the playback direction. Keeping the mouse button pressed while moving the mouse pointer off the animation widget permanently pauses playback.
+Animated SVG produced by means of \LaTeX{} and \verb+dvisvgm+ are self-sufficient files that can be embedded into HTML using the \verb+<object>+ tag or opened directly in a Web browser, such as Chromium or Firefox. Also, presentations, such as `beamer'-class documents, with embedded animations can be exported to SVG instead of PDF and viewed in a Web browser. SVG-capable Web browsers are standard on many platforms and operating systems and thus make SVG a very portable file format. A \LaTeX{} package for embedding video and audio into SVG is also available\cite{media4svg}.
+
+The user interacts with the animation through optional animation controls or using the mouse like so: pressing the mouse button over the animation widget immediately pauses a playing animation and releasing it resumes playback. Pressing the shift-key at the same time reverses the playback direction. Keeping the mouse button pressed while moving the mouse pointer off the animation widget permanently pauses playback. On mobile devices, tapping on the animation toggles between play and pause.
+
+%On mobile devices, interaction with an animated SVG is similar to that on desktop devices, just using finger touches instead of mouse button press/release. To permanently pause an animation without the pause button, touch the animation with a second finger, then lift both fingers off.
-On mobile devices, interaction with an animated SVG is similar to that on desktop devices, just using finger touches instead of mouse button press/release. To permanently pause an animation without the pause button, touch the animation with a second finger, then lift both fingers off.
\section{Requirements}
\begin{trivlist}
@@ -128,8 +132,8 @@ On mobile devices, interaction with an animated SVG is similar to that on deskto
\item \verb+dvipdfmx+ for DVI to PDF conversion
\item dvipdfmx, version $\ge 20190503$, for DVI to PDF conversion
\item \verb+dvisvgm+ for DVI to SVG conversion (also requires Ghostscript)
-\item PDF: Acrobat Reader, PDF-XChange, Foxit Reader
-\item SVG: Chromium-based browsers, Firefox and others
+\item PDF: Acrobat Reader, KDE Okular, PDF-XChange, Foxit Reader
+\item SVG: Chromium-based browsers for best performance
\end{trivlist}
\section{Installation}
@@ -166,9 +170,13 @@ width=<h-size>
height=<v-size> | totalheight=<v-size>
keepaspectratio
scale=<factor>
+bb=<llx> <lly> <urx> <ury>
+viewport=<llx> <lly> <urx> <ury>
+trim=<left> <bottom> <right> <top>
+clip
hiresbb
interpolate
-pagebox
+pagebox=...
buttonsize=<size>
buttonbg=<colour>
buttonfg=<colour>
@@ -227,6 +235,11 @@ and the environment
\newframe
\multiframe{<number of frames>}{[<variables>]}{
... repeated (parameterized) material ...
+ \multiframebreak % optional!
+}
+\newframe*[...] % some \newframe variant required
+\multiframe{...}{...}{ % between two \multiframes
+ ...
}
\end{animateinline}
\end{verbatim}
@@ -241,6 +254,8 @@ The \verb+\multiframe+ command allows the construction of loops around pictures.
\end{verbatim}
\verb+<variable name>+ is a sequence of one or more letters \emph{without} a leading backslash\footnote{This is different from {\tt\string\multido} (package `multido') where variable names have a leading `{\tt\textbackslash}' in the declaration.}. The first (and possibly only) letter of the variable name determines the type of the variable. There are three different types: integers (`\verb+i+', `\verb+I+'), reals (`\verb+n+', `\verb+N+', `\verb+r+', `\verb+R+') and dimensions or \LaTeX{} lengths (`\verb+d+', `\verb+D+'). Upon first execution of the loop body, the variable takes the value \verb+<initial value>+. Each further iteration increments the variable by \verb+<increment>+. Negative increments must be preceded by `\verb+-+'. Here are some examples: `\verb:i=1+2:', `\verb:Rx=10.0+-2.25:', `\verb:dim=20pt+1ex:'. Within the loop body, variables are expanded to their current value by prepending a backslash to the variable name, that is \verb+\i+, \verb+\Rx+ and \verb+\dim+ according to the previous examples. \verb+\multiframe+ must be surrounded by \verb+\begin{animateinline}+ and \verb+\end{animateinline}+ or by any of the \verb+\newframe+ variants. Two consecutive \verb+\multiframe+ commands must be separated by one of the \verb+\newframe+ variants.
+\verb+\multiframebreak+ can be called to terminate a \verb+\multiframe+ loop prematurely, usually as part of a conditional statement. This command should preferably be placed near the end of the loop body in order not to produce an empty animation frame.
+
By default, the animation is built frame by frame in the order of inclusion of the embedded material. However, extended control of the order of appearance, superposition and repetition of the material is available through the `\verb+timeline+' option (see Section~\ref{sect:timeline}).
\myparagraph*{Sets of graphics files}
@@ -266,9 +281,9 @@ For example, the line
\end{verbatim}
would create an animation from all pages of the file `frames.pdf', running at 12 fps.
-\clearpage
+%\clearpage
\section{Command options}
-The following options to \verb+\animategraphics+ and `\verb+animateinline+' have been provided:
+The following options to \verb+\animategraphics+ and `\verb+animateinline+' have been provided.
\subsection{Basic options}
\begin{verbatim}
label=<label text>
@@ -281,7 +296,7 @@ Overrides the searching procedure for graphics files explained in the previous s
\begin{verbatim}
poster[=first | <num> | last | none]
\end{verbatim}
-Specifies which frame to display and print if the animation is not activated. The first frame is shown by default. Thus `\verb+poster+' or `\verb+poster=first+' need not be explicitly set. A frame number \verb+<num>+ may as well be given; \verb+<num>+ is zero-based, that is, the first frame has number `0'.
+Specifies which frame to display and print if the animation is not activated. The first frame is shown by default. Thus, `\verb+poster+' or `\verb+poster=first+' need not be explicitly set. A frame number \verb+<num>+ may as well be given; \verb+<num>+ is zero-based, that is, the first frame has number `0'.
\begin{verbatim}
every=<num>
\end{verbatim}
@@ -331,9 +346,13 @@ viewport=<llx> <lly> <urx> <ury>
\begin{verbatim}
trim=<left> <bottom> <right> <top>
\end{verbatim}
-(\verb+\animategraphics+ only.) Crops graphics at the edges. The four lengths specify the amount to be removed from or, if negative values have been provided, to be added to each side of the graphics.
+(\verb+\animategraphics+ only.) Crops graphic at the edges. The four lengths specify the amount to be removed from or, if negative values have been provided, to be added to each side of the graphic.
+\begin{verbatim}
+clip
+\end{verbatim}
+(\verb+\animategraphics+ only.) Clips the graphic to the (possibly modified) bounding box.
\begin{verbatim}
-pagebox
+pagebox=...
hiresbb
interpolate
\end{verbatim}
@@ -360,7 +379,7 @@ buttonbg=<colour>
buttonfg=<colour>
buttonalpha=<opacity>
\end{verbatim}
-By default, control button widgets are drawn with black strokes on transparent background. The background can be turned into a solid colour by the first option, while the second option specifies the stroke colour. The parameter \verb+<colour>+ is an array of colon-(\verb+:+)-separated numbers in the range from 0.0 to 1.0. The number of array elements determines the colour model in which the colour is defined: (1) gray value, (3) RGB, (4) CMYK. For example, `\verb+1+', `\verb+1:0.5:0.2+' and `\verb+0.5:0.3:0.7:0.1+' are valid colour specifications. Option \verb+buttonalpha+ adds transparency to the control buttons. Its parameter \verb+<opacity>+ is a number between 0.0 and 1.0, where 0.0 produces fully transparent and 1.0 fully opaque buttons.
+By default, control button widgets are drawn with black strokes on empty, fully transparent background. The background can be filled with colour using the first option, while the second option specifies the stroke colour. Option \verb+buttonalpha+ adds transparency to the background colour. The parameter \verb+<colour>+ is an array of colon-(\verb+:+)-separated numbers in the range from 0.0 to 1.0. The number of array elements determines the colour model in which the colour is defined: (1) gray value, (3) RGB, (4) CMYK. For example, `\verb+1+', `\verb+1:0.5:0.2+' and `\verb+0.5:0.3:0.7:0.1+' are valid colour specifications. The parameter \verb+<opacity>+ is a number between 0.0 and 1.0, where 0.0 produces fully transparent and 1.0 fully opaque buttons.
\begin{verbatim}
draft
final
@@ -534,25 +553,7 @@ or
\end{verbatim}
`\verb+anim+' is an array of animation object references. Animations must be labelled using the `\verb+label=...+' command option in order to be present in the `\verb+anim+' array. As usual, properties and methods are accessed via the dot notation. Properties and methods of the animation object are summarized in Tables \ref{tab:props} and \ref{tab:methods}.
-One potential use of the JavaScript interface could be within a timeline file associated with an animation. For example, loops over a sub-range of frames can be programmed by setting the `\verb+frameNum+' property. See Section~\ref{sect:timeline}, p.~\pageref{sect:jsfield} for details.
-
-Also, the programming interface can be used to create custom buttons for playback control. The command \verb+\mediabutton+ from the `media9' package provides a convenient way for achieving this:
-\begin{lstlisting}
- \usepackage{media9}
- \usepackage{animate}
- ...
-
- \animategraphics[label=my_anim]{12}{...}{...}{...}
-
- \mediabutton[
- jsaction={anim['my_anim'].playFwd();}
- ]{\fbox{Play}}
- \mediabutton[
- jsaction={anim['my_anim'].frameNum=5;}
- ]{\fbox{Goto 6th frame}}
-\end{lstlisting}
-
-\begin{table}[p]%[hbp]
+\begin{table}[hbp]%[p]%[hbp]
\centering
\caption{Animation object properties}\label{tab:props}
\begin{tabularx}{\linewidth}[t]{lllX}\hline
@@ -568,7 +569,7 @@ name & type & access & description\\\hline\hline
\end{tabularx}
\end{table}
-\begin{table}[p]%[htbp]
+\begin{table}[htp]%[p]%[htbp]
\centering
\caption{Animation object methods}\label{tab:methods}
\begin{tabularx}{\linewidth}[t]{lX}\hline
@@ -582,6 +583,24 @@ name & description\\\hline\hline
\end{tabularx}
\end{table}
+One potential use of the JavaScript interface could be within a timeline file associated with an animation. For example, loops over a sub-range of frames can be programmed by setting the `\verb+frameNum+' property. See Section~\ref{sect:timeline}, p.~\pageref{sect:jsfield} for details.
+
+Also, the programming interface can be used to create custom buttons for playback control. The command \verb+\mediabutton+ from the `media9' package provides a convenient way for achieving this:
+\begin{lstlisting}
+ \usepackage{media9}
+ \usepackage{animate}
+ ...
+
+ \animategraphics[label=my_anim]{12}{...}{...}{...}
+
+ \mediabutton[
+ jsaction={anim['my_anim'].playFwd();}
+ ]{\fbox{Play}}
+ \mediabutton[
+ jsaction={anim['my_anim'].frameNum=5;}
+ ]{\fbox{Goto 6th frame}}
+\end{lstlisting}
+
\clearpage
\section{Examples}
\subsection{Animations from sets of files, using {\tt\textbackslash animategraphics}}\label{sect:examples}
@@ -1337,17 +1356,16 @@ The following code may serve as a template for generating standalone animated SV
\begin{lstlisting}
\documentclass[dvisvgm]{standalone}
-\usepackage{animate}
-\usepackage{graphicx}
-
%\usepackage{xcolor}
%\pagecolor{white} % opaque background with solid colour
%\usepackage{pstricks} % enable as needed
%\usepackage{tikz}
-\begin{document}
+\usepackage{animate}
+\usepackage{graphicx}
+\begin{document}
%
% \animategraphics{..}{...}{...}{...}
%
@@ -1355,7 +1373,6 @@ The following code may serve as a template for generating standalone animated SV
%
% \begin{animateinline}{..} ... \end{animateinline}
%
-
\end{document}
\end{lstlisting}
Note that when animating external graphics with \verb+\animategraphics+, only PDF and PostScript (EPS, PS, MPS) files are converted to inline SVG code; files in other formats (SVG, PNG, JPEG) remain external and must be bundled with the final SVG output. Thus, for obtaining self-contained SVG, it is recommended to convert PNG, JPEG and SVG files to PDF or PostScript first. Also note that PostScript files must have all required fonts embedded. This is not always the case for \MP-generated PostScript. Here, embedding of fonts is ensured by putting `\verb+prologues := 3;+' into the header of the \MP{} input.
@@ -1368,8 +1385,11 @@ dvilualatex
xelatex -no-pdf
\end{verbatim}
to produce DVI or XDV output from the \LaTeX{} source. After this, SVG is obtained by running
+%\begin{verbatim}
+%dvisvgm --font-format=woff --exact --zoom=-1 --page=1,- --optimize ...
+%\end{verbatim}
\begin{verbatim}
-dvisvgm --font-format=woff --exact --zoom=-1 --page=1,- --optimize ...
+dvisvgm --font-format=woff --exact --zoom=-1 --page=1,- ...
\end{verbatim}
on the intermediate DVI or XDV file.
@@ -1381,7 +1401,7 @@ The purpose of `\verb+--zoom=-1+' is to produce responsive SVG. If embedded in a
By default, \verb+dvisvgm+ processes only the very first page of the input file. To convert multipage DVI/XDV with several animations, add option `\verb+--page=1,-+'.
-With option `\verb+--optimize+', \verb+dvisvgm+ applies several optimizations to reduce the output file size.
+%With option `\verb+--optimize+', \verb+dvisvgm+ applies several optimizations to reduce the output file size.
As SVG derives from XML it is not known to be particularly economical in terms of file size. Compressed SVG, with file extension `\verb+svgz+', shortens download times and is supported by most Web browsers. It can be generated by adding option `\verb+-z+'. Also, option `\verb+--precision=1+' may be used to reduce the SVG file size. It limits the precision of floating point numbers, such as coordinates, to one decimal figure. Sometimes, animations may behave stangely after applying this option. Then, of course, it should be omitted.
@@ -1455,13 +1475,15 @@ In \TeX4ht documents, the whole \verb+<object>...</object>+ tag can be inserted
\section{Acknowledgements}
I would like to thank François Lafont who discovered quite a few bugs and made many suggestions that helped to improve the functionality of the package. Many thanks to Jin-Hwan Cho, the developer of \verb+dvipdfmx+, for contributing the \verb+dvipdfmx+ specific code, and to Walter Scott for proof-reading the documentation.
+\enlargethispage{4ex}
\begin{thebibliography}{8}
- \bibitem{chupin} Chupin, M.: \emph{Syracuse MetaPost/Animations.} URL: \href{http://melusine.eu.org/syracuse/metapost/animations/chupin/?idsec=scara}{\url{http://melusine.eu.org/}} \href{http://melusine.eu.org/syracuse/metapost/animations/chupin/?idsec=scara}{\url{syracuse/metapost/animations/chupin/?idsec=scara}}
+\bibitem{chupin} Chupin, M.: \emph{Syracuse MetaPost/Animations.} URL: \href{http://melusine.eu.org/syracuse/metapost/animations/chupin/?idsec=scara}{\url{http://melusine.eu.org/}} \href{http://melusine.eu.org/syracuse/metapost/animations/chupin/?idsec=scara}{\url{syracuse/metapost/animations/chupin/?idsec=scara}}
\bibitem{dvisvgm} \emph{dvisvgm: A fast DVI to SVG converter} URL: \url{http://dvisvgm.de}
\bibitem{gilg05} Gilg, J.: PDF-Animationen. In: \emph{Die \TeX nische Kom\"odie}, Issue 4, 2005, pp.~30--37
%\bibitem{hol} Holeček, J.: \emph{Animations in a pdf\TeX-generated PDF}. URL: \url{http://www.fi.muni.cz/~xholecek/tex/pdfanim.xhtml}
\bibitem{hol} Holeček, J.; Sojka, P.: Animations in pdf\TeX-generated PDF. In: \emph{\TeX, XML, and Digital Typography}, Springer, 2004, pp.~179--191. doi:10.1007/978-3-540-27773-6\textunderscore14
\bibitem{luque12} Luque, M.: \emph{PSTricks : applications.} URL: \url{http://pstricks.blogspot.com}
+\bibitem{media4svg} \emph{The media4svg Package}. URL: \url{http://www.ctan.org/pkg/media4svg}
\bibitem{media9} \emph{The media9 Package}. URL: \url{http://www.ctan.org/pkg/media9}
\bibitem{texsx} \emph{Beamer: animate package and overlay}. URL: \href{https://tex.stackexchange.com/a/385209}{\url{https://tex.stackexchange.com}}\\ \href{https://tex.stackexchange.com/a/385209}{\url{/a/385209}}
\end{thebibliography}
diff --git a/Master/texmf-dist/source/latex/annee-scolaire/annee-scolaire.dtx b/Master/texmf-dist/source/latex/annee-scolaire/annee-scolaire.dtx
new file mode 100644
index 00000000000..80a75009274
--- /dev/null
+++ b/Master/texmf-dist/source/latex/annee-scolaire/annee-scolaire.dtx
@@ -0,0 +1,658 @@
+% \iffalse meta-comment
+%
+%% File: annee-scolaire.dtx
+%% Copyright (C) 2020 Yvon Henel aka Le TeXnicien de surface
+%%
+%% It may be distributed and/or modified under the conditions of the
+%% LaTeX Project Public License (LPPL), either version 1.3c of this
+%% license or (at your option) any later version. The latest version
+%% of this license is in the file
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%
+%<*driver|package|doc>
+\RequirePackage{expl3}[2013/03/12]
+\GetIdInfo$Id: annee-scolaire.dtx 1.6 2020-07-29 TdS $
+ {}
+%</driver|package|doc>
+%<*driver>
+\documentclass[full]{l3doc}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{amsmath}
+\usepackage[french,main=english]{babel}
+\usepackage{annee-scolaire}
+\usepackage{xspace}
+\usepackage{csquotes}
+
+
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% The \pkg{annee-scolaire} package^^A
+% \thanks{This file describes v\ExplFileVersion, last revised \ExplFileDate.}^^A
+% }
+%
+% \author{^^A
+% Yvon Henel\thanks^^A
+% {^^A
+% E-mail:
+% \href{mailto:le.texnicien.de.surface@yvon-henel.fr}
+% {le.texnicien.de.surface@yvon-henel.fr}^^A
+% }^^A
+% }
+%
+% \date{Released \ExplFileDate}
+%
+% \maketitle
+%
+% \changes{v1.5}{2020/04/05}{First public
+% version.\foreignlanguage{french}{\emph{Première version publique.}}}
+% \changes{v1.6}{2020/04/13}{Correction of typos in documentation.
+% \foreignlanguage{french}{\emph{Correction d'erreurs dans la documentation.}}}
+% \changes{v1.6}{2020/04/13}{Unification of lppl version in documentation.
+% \foreignlanguage{french}{\emph{Unification de la version de la LPPL dans la
+% documentation.}}}
+% \changes{v1.6}{2020/07/29}{Replacement of obsolete macro \cs{c_one}.
+% \foreignlanguage{french}{\emph{Remplacement de la macro obsolète \cs{c_one}.}}}
+%
+% \thispagestyle{empty}
+%
+% \noindent\hrulefill
+%
+% \begin{otherlanguage}{french}
+% \begin{abstract}
+% Cette extension fournit des commandes pour écrire l'année scolaire en
+% cours. L'année est calculée à partir de la date de compilation du
+% document. La date de début de l'année scolaire est, par défaut, le 1\ier
+% aout mais deux options de l'extension permettent de la changer.
+%
+% Cette documentation a été écrite pendant l'année
+% universitaire~\anneescolaire{}.
+%
+% La documentation française pour l'utilisateur de l'extension
+% \pkg{annee-scolaire} est disponible sous le nom de
+% \texttt{annee-scolaire-fra}.
+% \end{abstract}
+% \end{otherlanguage}
+%
+% \noindent\hrulefill
+%
+% \begin{abstract}
+% This package provides macros to write the academic year (French way). The
+% year is calculated from the compilation date. The day of the beginning of
+% the academic year is, by default, 1st August but two options of the package
+% enable us to change it.
+%
+% This documentation was written during academic year~\anneescolaire{}.
+%
+% The English documentation for the final user of the package
+% \pkg{annee-scolaire} is available in the file
+% \texttt{annee-scolaire-eng}.
+% \end{abstract}
+%
+% \noindent\hrulefill
+%
+% \DisableDocumentation
+%
+% \begin{documentation}
+%
+% \end{documentation}
+%
+% \iffalse
+%<*doc>
+\documentclass[full]{l3doc}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+%<FRA>\usepackage[english,main=french]{babel}
+%<ENG>\usepackage[french,main=english]{babel}
+\usepackage{xparse}
+\usepackage[decalage=0]{annee-scolaire}
+\newcommand\BOP{\discretionary{}{}{}}
+\usepackage{xspace}
+\usepackage{csquotes}
+\usepackage{fancyvrb,fancyvrb-ex}
+\begin{document}
+%<*FRA>
+\title{Guide de l'utilisateur de \pkg{annee-scolaire}\thanks{Ce fichier
+ décrit la version~\ExplFileVersion, dernière révision~\ExplFileDate. Édition
+ spéciale \emph{confinement}.}}
+%</FRA>
+%<*ENG>
+\title{\pkg{annee-scolaire} user guide\thanks{This file describes
+ version~\ExplFileVersion, last revised~\ExplFileDate. Special
+ \emph{quarantine} edition.}}
+%</ENG>
+\author{Yvon Henel\thanks{E-mail:
+ \href{mailto:le.texnicien.de.surface@yvon-henel.fr}
+ {le.texnicien.de.surface@yvon-henel.fr}}}
+\maketitle
+\noindent\hrulefill
+
+\begin{abstract}
+%<*FRA>
+Une macro \cs{anneescolaire} pour écrire automatiquement l'année scolaire en
+fonction de la date du jour de compilation.
+%</FRA>
+%<*ENG>
+A macro \cs{anneescolaire} to automatically write academic year (French way)
+according to the date of compilation day.
+%</ENG>
+\end{abstract}
+
+\noindent\hrulefill
+
+%<FRA> \begin{otherlanguage}{english}
+%<ENG> \begin{otherlanguage}{french}
+\begin{abstract}
+%<*FRA>
+A macro \cs{anneescolaire} to automatically write academic year (French way)
+according to the date of compilation day.
+
+The English documentation for the final user of the package
+\pkg{annee-scolaire} is available in the file \texttt{annee-scolaire-eng}.
+%</FRA>
+%<*ENG>
+Une macro \cs{anneescolaire} pour écrire automatiquement l'année scolaire en
+fonction de la date du jour de compilation.
+
+La documentation française pour l'utilisateur de l'extension
+\pkg{annee-scolaire} est disponible sous le nom de \texttt{annee-scolaire-fra}.
+%</ENG>
+\end{abstract}
+\end{otherlanguage}
+
+\noindent\hrulefill
+\vspace{\baselineskip}
+
+%<*ENG>
+\section{The Macros}
+\label{sec:macros}
+
+\pkg{annee-scolaire} offers three main document macros which produce
+text in the final document and one macro which is used to determine the
+presentation of the said text.
+
+\subsection{Main Macros}
+\label{sec:main}
+
+This package has three main document macros viz.
+\begin{function}{\anneescolaire}
+ \begin{syntax}
+ \cs{anneescolaire}\oarg{shift}
+ \end{syntax}
+ where \meta{shift} is an integer the default value of which is~\(0\). It is
+ the number of years the academic year is shifted. The same optional argument
+ with the same aim is available for the next two macros.
+\end{function}
+
+In French \foreignquote{french}{année scolaire} means \enquote{school year}.
+
+\begin{function}{\debutanneescolaire}
+ \begin{syntax}
+ \cs{debutanneescolaire}\oarg{shift}
+ \end{syntax}
+\end{function}
+
+In French \foreignquote{french}{début d'année scolaire} means \enquote{beginning
+ of school year}.
+
+\begin{function}{\finanneescolaire}
+ \begin{syntax}
+ \cs{finanneescolaire}\oarg{shift}
+ \end{syntax}
+\end{function}
+
+In French \foreignquote{french}{fin d'année scolaire} means \enquote{end of
+ school year}.
+
+See examples on page~\pageref{sec:writingyear}.
+
+\subsection{Presentation Macro}
+\label{sec:look}
+
+The presentation of the years as written by the three preceding commands may be
+changed redefining the following macro:
+\begin{function}{\AnneeScolairePresentation}
+ \begin{syntax}
+ \cs{AnneeScolairePresentation}\oarg{number}\marg{year}
+ \end{syntax}
+ where \meta{year} is a integer (a \LaTeX3 \texttt{\textit{int}}) which is the
+ number of the year to be written in the document. The optional argument
+ \meta{number} can be used to tailor the presentation according to the
+ following scheme
+ \begin{description}
+ \item[\textbf{1}] presentation of the beginning year in the text created by the
+ macro \cs{anneescolaire};
+ \item[\textbf{2}] presentation of the ending year in the text created by the
+ macro \cs{anneescolaire};
+ \item[\textbf{3}] presentation of the year in the text created by the
+ macro \cs{debutanneescolaire};
+ \item[\textbf{4}] presentation of the year in the text created by the
+ macro \cs{finanneescolaire}.
+ \end{description}
+
+ By default, the macro is an alias of \cs{int_to_arabic:n}.
+ %
+ If you want to change the presentation, you have to redefine the command with
+ \cs{RenewDocumentCommand}.
+\end{function}
+
+See examples on page \pageref{sec:changelook}.
+%</ENG>
+
+%<*FRA>
+\section{Les macros}
+\label{sec:macros}
+
+L'extension \pkg{annee-scolaire} offre quatre macros de document: trois macros
+principales produisant du texte et une macro, qui ne devrait être utilisée que
+rarement et peut-être même jamais, qui permet de changer la présentation du
+texte écrit.
+
+\subsection{Macros principales}
+\label{sec:principales}
+
+Les trois macros principales de document sont les suivantes:
+
+\begin{function}{\anneescolaire}
+ \begin{syntax}
+ \cs{anneescolaire}\oarg{décalage}
+ \end{syntax}
+ où \meta{décalage} est un entier relatif qui vaut~\(0\) par défaut. C'est le
+ nombre d'années dont l'année scolaire est décalée. Les deux autres macros ont
+ le même argument optionnel.
+\end{function}
+
+\begin{function}{\debutanneescolaire}
+ \begin{syntax}
+ \cs{debutanneescolaire}\oarg{décalage}
+ \end{syntax}
+\end{function}
+
+Comme son nom l'indique, cette macro donne l'année de début de l'année scolaire.
+
+\begin{function}{\finanneescolaire}
+ \begin{syntax}
+ \cs{finanneescolaire}\oarg{décalage}
+ \end{syntax}
+\end{function}
+
+Celle-ci donne l'année de fin.
+
+Voir les exemples en page~\pageref{sec:ecrireannee}.
+
+\subsection{Changement de la présentation}
+\label{sec:presentation}
+
+La présentation des années obtenues à l'aide des trois macros précédentes peut
+être modifiée en redéfinissant la macro \cs{AnneeScolairePresentation}:
+\begin{function}{\AnneeScolairePresentation}
+ \begin{syntax}
+ \cs{AnneeScolairePresentation}\oarg{numéro}\marg{année}
+ \end{syntax}
+ où \meta{année} est un entier relatif (\texttt{\textit{int}} au sens de
+ \LaTeX3), c'est le numéro de l'année à écrire dans le document. L'argument
+ optionnel \meta{numéro} peut être utilisé pour traiter différemment la
+ présentation suivant ce schéma
+ \begin{description}
+ \item[\textbf{1}] présentation de l'année de début dans le texte créé par la
+ macro \cs{anneescolaire};
+ \item[\textbf{2}] présentation de l'année de fin dans le texte créé par la
+ macro \cs{anneescolaire};
+ \item[\textbf{3}] présentation de l'année dans le texte créé par la
+ macro \cs{debutanneescolaire};
+ \item[\textbf{4}] présentation de l'année dans le texte créé par la
+ macro \cs{finanneescolaire}.
+ \end{description}
+
+ Par défaut, cette macro est définie comme un alias de \cs{int_to_arabic:n}.
+ %
+ Si l'on veut changer la présentation, il faut redéfinir cette commande à
+ l'aide de \cs{RenewDocumentCommand}.
+\end{function}
+
+Voir les exemples en page~\pageref{sec:aspect}.
+%</FRA>
+
+%<*ENG>
+\section{The Package Options}
+\label{sec:keys}
+
+The package uses the key-value options. There are four keys:
+\texttt{premiermois} (\emph{first month}), \texttt{premierjour} (\emph{first
+ day}), \texttt{decalage} (\emph{shift}) and \texttt{separateur}
+(\emph{separator}).
+
+\begin{description}
+\item[\texttt{premiermois} (\textit{\texttt{int}})] is the number of the first
+ month of the school year. It defaults to~\(8\).
+
+\item[\texttt{premierjour} (\textit{\texttt{int}})] is the number of the first
+ day of the first month of the school year. Its default value is~\(1\) so the
+ school year begins, by default, on the first of August.
+
+ \emph{Beware: no attempt is made in order to ensure the consistency of the
+ chosen date --- you can chose the 32nd February if you dare. You have to
+ take care of that by yourself.}
+
+\item[\texttt{decalage} (\textit{\texttt{int}})] is an integer which defaults
+ to~\(0\). It is used to shift the school year: passing the option
+ \verb|decalage=1| to the package forces \cs{anneescolaire} to give the next
+ school year.
+
+\item[\texttt{separateur} (\textit{\texttt{token list}})] is the text used
+ between the numbers of the two calendar years which the school year spans. Its
+ default value is~\enquote{\texttt{-}}.
+\end{description}
+%</ENG>
+
+%<*FRA>
+\section{Les options de l'extension}
+\label{sec:clefs}
+
+L'extension utilise le système de clefs-valeurs pour ses options. Elle possède
+quatre clés: \texttt{premiermois}, \texttt{premierjour}, \texttt{decalage} et
+\texttt{separateur}.
+
+\begin{description}
+\item[\texttt{premiermois} (\textit{\texttt{int}})] contient le numéro du 1\ier
+ mois de l'année scolaire. Par défaut sa valeur est~\(8\);
+
+\item[\texttt{premierjour} (\textit{\texttt{int}})] contient le numéro du 1\ier
+ jour du 1\ier mois de l'année scolaire. Par défaut sa valeur est~\(1\). La
+ date de début de l'année scolaire est donc le 1\ier aout;
+
+ \emph{Attention: l'extension ne vérifie pas la validité de la date ainsi
+ choisie --- choisir le 32 février ne provoquera pas d'erreur. L'utilisateur
+ s'en assurera lui-même.}
+
+\item[\texttt{decalage} (\textit{\texttt{int}})] est un entier relatif qui vaut
+ \(0\) par défaut. Il permet de décaler l'année scolaire. En donnant l'option
+ \verb|decalage=1| à l'extension on force \cs{anneescolaire} à donner l'année
+ scolaire prochaine;
+
+\item[\texttt{separateur} (\textit{\texttt{token list}})] est le texte utilisé
+ entre les numéros des deux années civiles composant l'année scolaire. Par
+ défaut sa valeur est \enquote{\texttt{-}}.
+\end{description}
+%</FRA>
+
+%<*ENG>
+\section{Examples}
+\label{sec:examples}
+
+\subsection{Writing the School Year}
+\label{sec:writingyear}
+
+The text\\[0.5\baselineskip]
+\enquote{Today is \today, academic year \anneescolaire, beginning
+ in~\debutanneescolaire{} and ending in~\finanneescolaire.}\\[0.5\baselineskip]
+is obtained with the code\\[0.5\baselineskip]
+\texttt{Today is \cs{today}, academic year \cs{anneescolaire}, beginning
+ in}\verb|~|\cs{debutannee}\BOP \texttt{sco}\BOP \texttt{laire}\verb|{}|
+\texttt{and ending in\verb|~|\cs{finanneescolaire}.}
+
+\medskip{}
+
+What follows illustrates the use of the optional argument of the three document
+commands.
+%</ENG>
+
+%<*FRA>
+\section{Exemples}
+\label{sec:exemples}
+
+\subsection{Écrire l'année scolaire}
+\label{sec:ecrireannee}
+
+Le texte\\[0.5\baselineskip]
+\enquote{Aujourd'hui est le \today, année scolaire \anneescolaire, débutant
+ en~\debutanneescolaire{} et finissant en~\finanneescolaire.}\\[0.5\baselineskip]
+est obtenu avec le code\\[0.5\baselineskip]
+\texttt{Aujourd'hui} \texttt{est} \texttt{le} \cs{today}\texttt{,}
+\texttt{année} \texttt{scolaire} \cs{anneescolaire}\texttt{,} \texttt{débutant}
+\texttt{en}\verb|~|\cs{de}\BOP{}\texttt{but}\BOP \texttt{an}\BOP
+\texttt{nee}\BOP \texttt{sco}\BOP \texttt{laire}\verb|{}| \texttt{et}
+\texttt{finissant} \texttt{en}\verb|~|\cs{finanneescolaire}.
+
+\medskip{}
+
+La suite illustre l'utilisation de l'argument optionnel des trois commandes.
+%</FRA>
+
+\vspace{\baselineskip}
+
+\framebox[0.85\textwidth]{\begin{minipage}{.65\linewidth}
+\vspace*{.5\baselineskip}
+
+%<FRA> Le
+%<ENG> On
+\today{}:
+
+\vspace{.5\baselineskip}
+
+\noindent{}
+{\cs{anneescolaire[-1]}}: \anneescolaire[-1] \par\noindent{}
+{\cs{debutanneescolaire[-1]}}: \debutanneescolaire[-1] \par\noindent{}
+{\cs{finanneescolaire[-1]}}: \finanneescolaire[-1]
+
+\vspace{.5\baselineskip}
+
+\noindent{}
+{\cs{anneescolaire}}: \anneescolaire \par\noindent{}
+{\cs{debutanneescolaire}}: \debutanneescolaire \par\noindent{}
+{\cs{finanneescolaire}}: \finanneescolaire
+
+\vspace{.5\baselineskip}
+
+\noindent{}
+{\cs{anneescolaire[1]}}: \anneescolaire[1] \par\noindent{}
+{\cs{debutanneescolaire[1]}}: \debutanneescolaire[1] \par\noindent{}
+{\cs{finanneescolaire[1]}}: \finanneescolaire[1]
+
+\vspace*{.5\baselineskip}
+\end{minipage}}
+
+%<*ENG>
+\subsection{Changing the Look}
+\label{sec:changelook}
+
+With the following code:
+
+%</ENG>
+
+%<*FRA>
+\subsection{Changer l'aspect}
+\label{sec:aspect}
+
+Avec le code suivant:
+
+%</FRA>
+
+\begin{Verbatim}[gobble=0, frame=lines, label={code}, labelposition=topline]
+\ExplSyntaxOn
+\RenewDocumentCommand{\AnneeScolairePresentation}{ o m }
+{
+ \int_case:nn { #1 }
+ {
+ {1} { \textbf{ \int_to_arabic:n { #2 } } }
+ {2} { \int_to_roman:n { #2 } }
+ {3} { \textit{ \int_to_arabic:n { #2 } } }
+ {4} { \int_to_Roman:n { #2 } }
+ }
+}
+\ExplSyntaxOff
+
+\anneescolaire \quad \debutanneescolaire \quad \finanneescolaire
+\end{Verbatim}
+
+%<ENG> We obtain:
+%<FRA> Nous obtenons:
+
+\bgroup{}
+\ExplSyntaxOn
+\RenewDocumentCommand{\AnneeScolairePresentation}{ o m }
+{
+ \int_case:nn { #1 }
+ {
+ {1} { \textbf{ \int_to_arabic:n { #2 } } }
+ {2} { \int_to_roman:n { #2 } }
+ {3} { \textit{ \int_to_arabic:n { #2 } } }
+ {4} { \int_to_Roman:n { #2 } }
+ }
+}
+\ExplSyntaxOff
+
+\anneescolaire \quad \debutanneescolaire \quad \finanneescolaire
+\egroup{}
+
+\medskip{}
+
+%<*ENG>
+It should be obvious to everyone that the preceding code is given as a mere
+example of what we can do and certainly not as an example of what we \emph{have to}!
+%</ENG>
+%<*FRA>
+Je n'ai pas besoin, je pense, d'insister sur le caractère de pur exemple du code
+qui précède. Il ne viendra à l'esprit de personne d'y voir un encouragement à la
+\emph{créativité typographique}!
+%</FRA>
+
+\vspace{\stretch{2}}
+
+\noindent\hspace*{0.2\textwidth}\hrulefill\hspace*{0.2\textwidth}
+\begin{center}
+ \textsl{Le TeXnicien de Surface scripsit.}
+\end{center}
+\noindent\hspace*{0.2\textwidth}\hrulefill\hspace*{0.2\textwidth}
+
+\vspace*{\stretch{2}}
+
+\end{document}
+%</doc>
+% \fi
+% \begin{implementation}
+%
+% \section{\pkg{annee-scolaire} implementation}
+%
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \begin{macrocode}
+%<@@=AnneeScolaire>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ProvidesExplPackage
+ {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{xparse}
+\RequirePackage{l3keys2e}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\keys_define:nn {annee-scolaire}
+{
+ premiermois .int_set:N = \c_@@_Premier_Mois_int,
+ premiermois .initial:n = {8},
+ premierjour .int_set:N = \c_@@_Premier_Jour_int,
+ premierjour .initial:n = {1},
+ decalage .int_set:N = \c_@@_Decalage_int,
+ decalage .initial:n = {0},
+ separateur .tl_set:N = \c_@@_Separe_Annees_tl,
+ separateur .initial:n = {-}
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\ProcessKeysOptions { annee-scolaire }
+% \end{macrocode}
+%
+%
+% \begin{variable}{\c_@@_Annee_Deb_int}
+% \begin{macrocode}
+\int_const:Nn \c_@@_Annee_Deb_int {
+ \int_compare:nNnTF { 100*\the\month + \the\day } <
+ { 100*\c_@@_Premier_Mois_int + \c_@@_Premier_Jour_int}
+ {\year - 1 + \c_@@_Decalage_int}
+ {\year + \c_@@_Decalage_int}
+}
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_@@_Annee_Fin_int}
+% \begin{macrocode}
+\int_const:Nn \c_@@_Annee_Fin_int {
+ \c_@@_Annee_Deb_int + 1
+}
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\AnneeScolairePresentation}
+% \begin{macrocode}
+\NewDocumentCommand \AnneeScolairePresentation { o m }
+{
+ \int_to_arabic:n { #2 }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\anneescolaire}
+% \begin{macrocode}
+\NewDocumentCommand \anneescolaire { O{0} }
+{
+ \AnneeScolairePresentation[1] {\c_@@_Annee_Deb_int + #1}
+ \c_@@_Separe_Annees_tl
+ \AnneeScolairePresentation[2] {\c_@@_Annee_Fin_int + #1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\debutanneescolaire}
+% \begin{macrocode}
+\NewDocumentCommand \debutanneescolaire { O{0} }
+ {
+ \AnneeScolairePresentation[3] {\c_@@_Annee_Deb_int + #1}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\finanneescolaire}
+% \begin{macrocode}
+\NewDocumentCommand \finanneescolaire { O{0} }
+ {
+ \AnneeScolairePresentation[4] {\c_@@_Annee_Fin_int + #1}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \end{implementation}
+%
+% \Finale \PrintChanges\PrintIndex
+%
+\endinput
+%%% Local Variables:
+%%% mode: doctex
+%%% coding: utf-8
+%%% fill-column: 80
+%%% TeX-master: t
+%%% End:
diff --git a/Master/texmf-dist/source/latex/annee-scolaire/annee-scolaire.ins b/Master/texmf-dist/source/latex/annee-scolaire/annee-scolaire.ins
new file mode 100644
index 00000000000..de8c6d5e357
--- /dev/null
+++ b/Master/texmf-dist/source/latex/annee-scolaire/annee-scolaire.ins
@@ -0,0 +1,34 @@
+\iffalse meta-comment
+
+File annee-scolaire.ins Copyright (C) 2019, 2020 Yvon Henel
+
+It may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version. The latest version
+of this license is in the file
+
+ http://www.latex-project.org/lppl.txt
+
+\fi
+
+\input l3docstrip.tex
+\askforoverwritefalse
+
+\preamble
+
+Do not distribute this file without also distributing the
+source files specified above.
+
+Do not distribute a modified version of this file.
+
+\endpreamble
+
+\keepsilent
+
+\generate{
+ \file{annee-scolaire.sty}{\from{annee-scolaire.dtx}{package}}
+ \file{annee-scolaire-fra.tex}{\from{annee-scolaire.dtx}{doc,FRA}}
+ \file{annee-scolaire-eng.tex}{\from{annee-scolaire.dtx}{doc,ENG}}
+}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/antanilipsum/antanilipsum.dtx b/Master/texmf-dist/source/latex/antanilipsum/antanilipsum.dtx
new file mode 100644
index 00000000000..aa9b03ca0a6
--- /dev/null
+++ b/Master/texmf-dist/source/latex/antanilipsum/antanilipsum.dtx
@@ -0,0 +1,2693 @@
+% \iffalse meta-comment
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+The `antanilipsum` package is an italian blind text generator that ouputs _supercazzole_, mocking nonsense phrases from the movie series Amici Miei, directed by Mario Monicelli.
+
+The package is a modified version of `kantlipsum` by Enrico Gregorio that uses paragraphs from a variety of sources, including original movies, examples from the GitHub package [esseks/monicelli](https://github.com/esseks/monicelli), and online generators like [AntanIpsum](https://antanipsum.com).
+
+The package GitHub repo [AlphaJack/antanilipsum](https://github.com/AlphaJack/antanilipsum) is aimed to facilitate the creation of a custom blind text generator by simply replacing the paragraph files used to build this package.
+
+This released is based on `kantilipsum` version 0.8a.
+
+Copyright 2020 Jack Coleman
+
+It may be distributed and/or modified under the conditions of the LaTeX Project Public License (LPPL), either version 1.3c of this license or (at your option) any later version. The latest version of this license is in the file https://www.latex-project.org/lppl.txt.
+The author is Jack Coleman and is reachable at the email address `alphajack AT tuta DOT io`.
+
+This work has the LPPL maintenance status "author-maintained".
+
+This work consists of the following files:
+
+- README.md (this file)
+- antanilipsum.dtx
+- antanilipsum.pdf
+
+and of the derived file
+
+- antanilipsum.sty
+
+To install the distribution run
+
+```
+lualatex antanilipsum.dtx
+```
+
+It is also possible to use `tex` or `pdflatex` for the task, but `lualatex` [is advised](https://github.com/matlab2tikz/matlab2tikz/wiki/TeX-capacity-exceeded,-sorry) when using a large amount of paragraphs.
+%</readme>
+%<*internal>
+\fi
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+ \expandafter\begingroup
+\fi
+%</internal>
+%<*install>
+\input l3docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+---------------------------------------------------------------
+The antanilipsum package --- Generate sentences in Conte Mascetti's style
+Maintained by Jack Coleman
+E-mail: alphajack AT tuta DOT io
+Released under the LaTeX Project Public License v1.3c or later
+See https://www.latex-project.org/lppl.txt
+---------------------------------------------------------------
+\endpreamble
+\postamble
+Copyright (C) 2020 by
+ Jack Coleman
+ alphajack AT tuta DOT io
+
+It may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version. The latest version
+of this license is in the file
+ https://www.latex-project.org/lppl.txt
+This work consists of the file antanilipsum.dtx
+ and the derived files antanilipsum.pdf,
+ antanilipsum.sty and
+ antanilipsum.ins.
+\endpostamble
+\usedir{tex/latex/antanilipsum}
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+%</install>
+%<install>\endbatchfile
+%<*internal>
+\usedir{source/latex/antanilipsum}
+\generate{
+ \file{\jobname.ins}{\from{\jobname.dtx}{install}}
+}
+\nopreamble\nopostamble
+\usedir{doc/latex/antanilipsum}
+\generate{
+ \file{README.md}{\from{\jobname.dtx}{readme}}
+}
+\ifx\fmtname\nameofplainTeX
+ \expandafter\endbatchfile
+\else
+ \expandafter\endgroup
+\fi
+%</internal>
+%<*driver|package>
+\RequirePackage{expl3}[2019/07/01]
+\RequirePackage{xparse}
+%</driver|package>
+%<*driver>
+\documentclass[a4paper,full]{l3doc}
+\usepackage{bookmark}
+\usepackage{antanilipsum}
+\usepackage[english,italian]{babel}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{\jobname.sty}
+%
+% \title{^^A
+% The \textsf{antanilipsum} package\\ Dummy text in Mascettian style^^A
+% \thanks{This file describes version \fileversion,
+% last revised \filedate.}^^A
+% }
+%
+% \author{^^A
+% Jack Coleman\thanks
+% {^^A
+% The author can be reached at the following email address:
+% \texttt{alphajack AT tuta DOT io}^^A
+% }^^A
+% }
+%
+% \date{Released \filedate}
+%
+% \maketitle
+%
+%
+% \begin{documentation}
+%
+% \section{Introduction}
+%
+% The \pkg{antanilipsum} package is a modified version of \pkg{kantlipsum} that
+% offers the same functionalities, but instead nonsense in Kantian style,
+% it typesets paragraphs of \emph{supercazzole}, italian nonsense phrases
+% composed of invented words, which are used as a joke in order to mock
+% or confuse the person to whom the phrase is addressed. The text it uses comes
+% not only from the original \href{https://www.youtube.com/watch?v=_9MTJw5ctVE}{\emph{Amici Miei}} movie series, but also from fan
+% produced content and online generators like \href{https://antanipsum.com}{\emph{AntanIpsum}}.
+%
+%
+% \section{Example}
+% \begin{otherlanguage}{italian}
+% \antani[1-3]
+% \end{otherlanguage}
+% \section{Options}
+%
+% The package has four document options, the first two of which are
+% alternative to each other:
+% \begin{itemize}[font=\ttfamily]
+% \item[par$\,\vert\,$nopar] With the default \texttt{par} all pieces
+% of text will be ended by a \cs{par} command; specifying \texttt{par}
+% is optional; the option \texttt{nopar} will not add this \cs{par} at
+% the end of each fragment of Mascettian phrases.
+% \item[numbers] Each piece of Mascettian phrases will be preceded by its
+% number (such as in ``1~\textbullet~Lei ha clacsonato. Tarapia tapioco,
+% prematurata alla supercazzola o scherziamo? No, mi permetta\dots''),
+% which can be useful for better control of what is produced.
+% \item[index] Each paragraph will generate an index entry; a
+% |\makeindex| command will be needed, with a suitable package for
+% making the index, and |\printindex| for printing it. However the
+% index entry may be off by one, since the |\index| command is issued
+% at the beginning of the paragraph. Also there is no guarantee that
+% the indexed word really belongs to the paragraph.
+% \end{itemize}
+%
+% \section{Commands}
+%
+% The commands provided by the package are:
+% \begin{itemize}[font=\ttfamily]
+% \item[\cs{antani}] This command takes an optional argument which can
+% be of the form \texttt{[42]} (that is, only one integer) or
+% \texttt{[3-14]} (that is, two integers separated by a hyphen); as in
+% \pkg{lipsum}, \verb|\antani[42]|, \verb|\antani[3-14]| and \verb|\antani|
+% will produce the 42nd pseudomascettian paragraph, the paragraphs from
+% the 3rd to the 14th, and those from the 1st to the 7th,
+% respectively.
+% \item[\cs{antani*}] The same as before, see later for the difference.
+% \item[\cs{antanidef}] This command takes two arguments, a control
+% sequence and an integer; the call \verb|\antanidef{\mytext}{200}| will
+% store in \cs{mytext} the 200th paragraph of pseudomascettian text
+% provided by this package.
+% \end{itemize}
+% The commands \cs{antani}, \cs{antani*} and \cs{antanidef} take a further
+% optional argument; with \verb|\antani[42][1-3]| just the first three
+% sentences of paragraph number~42 will be printed; ranges outside the
+% actual number of sentences will be ignored. The requested sentences
+% are stored, in the case of \cs{antanidef}.
+%
+% What's the difference between \cs{antani} and \cs{antani*}? The normal
+% version will respect the given package option; that is, if
+% \texttt{par} is in force, \verb|\antani[1-2]| will produce \emph{two}
+% paragraphs, while \verb|\antani*[1-2]| will only produce a big chunk
+% of text without issuing any \verb|\par| command. The logic is
+% reversed if the \texttt{nopar} option has been given.
+%
+% By the way, 200 is the number of available pieces; if one exceeds
+% the limit, nothing will be printed. Thus \verb|\antani[200-300]| will
+% print only \emph{one} paragraph. However, printing all paragraphs
+% with the standard ten point size Computer Modern font and the
+% \pkg{article} class fills more than fifty pages, so it seems that
+% the supply of text can be sufficient.
+%
+% \subsection*{Note}
+%
+% This package aims to only modify the text used by the \pkg{kantlipsum} package
+% and in no way tries to alter how it operates. A public repository is available with
+% a bash script that allows to easily build a custom version of this package by simply
+% replacing the text file it uses.
+%
+% The original \pkg{kantlipsum} is just an exercise for practicing with \LaTeX3
+% syntax. It uses the ``experimental'' packages made available by the
+% \LaTeX3 team. Many thanks to Joseph Wright, Bruno Le Floch and Frank
+% Mittelbach for suggesting improvements.
+%
+% \subsection*{Changes from \pkg{kantlipsum} 0.8a}
+%
+% Modified the documentation according to the new package.
+%
+% Paragraphs and index words have been removed from \emph{kantlipsum.dtx}
+% and are now added every time the build script is run.
+%
+% \subsection*{Changes from 0.8}
+%
+% Replaced \emph{kgl} prefixes with \emph{antani}.
+%
+% The CTAN readme has been removed from \emph{kantlipsum.dtx}
+% and is now added every time the build script is run.
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{antanilipsum} implementation}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=antani>
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\ProvidesExplPackage
+ {antanilipsum}
+ {2020-05-23}
+ {0.8.1}
+ {Generate text in Mascettian style}
+% \end{macrocode}
+%
+% A check to make sure that \pkg{expl3} is not too old
+% \begin{macrocode}
+\@ifpackagelater { expl3 } { 2019/07/01 }
+ { }
+ {
+ \PackageError { antanilipsum } { Support~package~expl3~too~old }
+ {
+ You~need~to~update~your~installation~of~the~bundles~
+ 'l3kernel'~and~'l3packages'.\MessageBreak
+ Loading~antanilipsum~will~abort!
+ }
+ \tex_endinput:D
+ }
+% \end{macrocode}
+%
+% \subsection{Package options and required packages}
+% We declare the allowed options and choose by default
+% \texttt{par}. We also need to declare a function |\@@_number:n|
+% that is set by the \texttt{numbers} option; its default action is to
+% gobble its argument.
+% \begin{macrocode}
+\DeclareOption { par }
+ {
+ \cs_set_protected:Nn \@@_star: { \c_space_tl }
+ \cs_set_protected:Nn \@@_nostar: { \par }
+ }
+
+\DeclareOption{ nopar }
+ {
+ \cs_set_protected:Nn \@@_star: { \par }
+ \cs_set_protected:Nn \@@_nostar: { \c_space_tl }
+ }
+
+\DeclareOption{ numbers }
+ {
+ \cs_set_protected:Nn \@@_number:n
+ {
+ #1\nobreak\enspace\textbullet\nobreak\enspace
+ }
+ }
+
+\bool_new:N \g_@@_makeindex_bool
+\bool_gset_false:N \g_@@_makeindex_bool
+\DeclareOption{ index }
+ { \bool_gset_true:N \g_@@_makeindex_bool }
+
+\cs_new_eq:NN \@@_number:n \use_none:n
+\ExecuteOptions{par}
+\ProcessOptions \scan_stop:
+% \end{macrocode}
+%
+% \subsection{Messages}
+% We define two messages.
+% \begin{macrocode}
+\msg_new:nnn {antanilipsum}{how-many}
+ {The~package~provides~paragraphs~1~to~#1.~
+ Values~outside~this~range~will~be~ignored.}
+\msg_new:nnnn {antanilipsum}{already-defined}
+ {Control~sequence~#1~already~defined.}
+ {The~control~sequence~#1~is~already~defined,~
+ I'll~ignore~it}
+% \end{macrocode}
+%
+% \subsection{Variables and constants}
+% The |\l_@@_start_int| variable will contain the starting number for
+% processing, while |\l_@@_end_int| the ending number. The
+% |\g_@@_pars_seq| sequence will contain the pseudomascettian sentences
+% and |\g_@@_words_seq| that contains the words to index.
+% \begin{macrocode}
+\int_new:N \l_@@_start_int
+\int_new:N \l_@@_end_int
+\seq_new:N \g_@@_pars_seq
+\seq_new:N \g_@@_words_seq
+\seq_new:N \l_@@_sentences_seq
+% \end{macrocode}
+%
+% \subsection{User level commands}
+% There are two user level commands, \cs{antani} (with a *-variant) and \cs{antanidef}.
+%
+% \begin{function}{\antani}
+% The (optional) argument is described as before. We use the
+% \cs{SplitArgument} feature provided by \pkg{xparse} to decide
+% whether the `range form' has been specified. In the \cs{antani*} form
+% we reverse the logic.
+% \begin{macrocode}
+\NewDocumentCommand{\antani}
+ {
+ s
+ >{\SplitArgument{1}{-}}O{1-7}
+ >{\SplitArgument{1}{-}}o}
+ {
+ \group_begin:
+ \IfBooleanTF{#1}
+ { \cs_set_eq:NN \@@_par: \@@_star: }
+ { \cs_set_eq:NN \@@_par: \@@_nostar: }
+ \IfNoValueTF{#3}
+ { \@@_process:nn #2 \@@_print: }
+ { \@@_process:nnnn #2 #3 \tl_use:N \l_tmpa_tl \@@_par: }
+ \group_end:
+ }
+% \end{macrocode}
+% \end{function}
+%
+% \begin{function}{\antanidef}
+% Sometimes one needs just a piece of text without implicit \cs{par}
+% attached, so we provide \cs{antanidef}. In a group we neutralize the
+% meaning of |\@@_number:n| and |\@@_par:| and define the control
+% sequence given as first argument to the pseudomascettian sentence being
+% the $k$th element of the sequence containing them, where $k$ is the
+% number given as second argument. If the control sequence is already
+% defined we issue an error and don't perform the definition.
+% \begin{macrocode}
+\NewDocumentCommand{\antanidef}
+ {
+ m
+ m
+ >{\SplitArgument{1}{-}}O{1-50}
+ }
+ {
+ \group_begin:
+ \@@_define:nnnn {#1} {#2} #3
+ \group_end:
+ }
+% \end{macrocode}
+% \end{function}
+%
+% \subsection{Internal functions}
+% \begin{function}{\@@_process:nn}
+% The function |\@@_process:nn| sets the temporary variables
+% |\l_@@_start_int| and |\l_@@_end_int|. If the optional argument to
+% \cs{antani} is missing they are already set to 1 and 7 respectively;
+% otherwise the argument has been split into its components; if the
+% argument was |[|$m$|]| we set both variables to $m$, otherwise it
+% was in the form |[|$m$|-|$n$|]| and we do the obvious action.
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_process:nn
+ {
+ \int_set:Nn \l_@@_start_int {#1}
+ \tl_if_novalue:nTF {#2}
+ { \int_set:Nn \l_@@_end_int {#1} }
+ { \int_set:Nn \l_@@_end_int {#2} }
+ }
+\cs_new_protected:Nn \@@_process:nnnn
+ {
+ \tl_set:Nx \l_tmpa_tl { \seq_item:Nn \g_@@_pars_seq {#1} }
+ \tl_if_novalue:nTF {#4}
+ { \@@_extract:nnV {#3} {#3} \l_tmpa_tl }
+ { \@@_extract:nnV {#3} {#4} \l_tmpa_tl }
+ }
+% \end{macrocode}
+% \end{function}
+%
+% \begin{function}{\@@_print:,\@@_use:n}
+% The printing routine is in the function |\@@_print:|; we start a
+% loop printing item number $x$ in the sequence |\g_@@_pars_seq| for
+% all numbers $x$ in the specified range. The function |\@@_use:n|
+% function is a wrapper to be used with |\int_step_function:nnnN|:
+% it's passed a number as argument, builds the constant name
+% corresponding to it and produces the text. If the index entry is to
+% be issued, the appropriate element from |\g_@@_words_seq| is used;
+% the page reference might not be correct, though.
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_print:
+ {
+ \int_step_function:nnnN
+ {\l_@@_start_int} {1} {\l_@@_end_int} \@@_use:n
+ }
+\cs_new:Nn \@@_use:n
+ {
+ \int_compare:nNnF { #1 } > { \seq_count:N \g_@@_pars_seq }
+ { \@@_number:n {#1} }
+ \bool_if:NT \g_@@_makeindex_bool
+ {
+ \use:x { \exp_not:N \index{ \seq_item:Nn \g_@@_words_seq {#1} } }
+ }
+ \seq_item:Nn \g_@@_pars_seq {#1}
+ }
+% \end{macrocode}
+% \end{function}
+%
+% \begin{function}{\@@_newpara:n}
+% The |\@@_newpara:n| appends a new item to the sequence |\g_@@_pars_seq|
+% consisting of, say, \meta{text of the 42nd sentence}|\@@_par:|
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_newpara:n
+ { \seq_gput_right:Nn \g_@@_pars_seq {#1\@@_par:} }
+% \end{macrocode}
+% \end{function}
+%
+% \begin{function}{\@@_newword:n}
+% The |\@@_newword:n| function appends a new item to the sequence
+% |\g_@@_words_seq| consisting of one word from the corresponding
+% paragraph.
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_newword:n
+ { \seq_gput_right:Nn \g_@@_words_seq {#1} }
+% \end{macrocode}
+% \end{function}
+%
+% \begin{function}{\@@define:nnnn}
+% The function |\@@define:nnnn| chooses the paragraph, then extracts the
+% requested sentences.
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_define:nnnn
+ {
+ \cs_set_eq:NN \@@_number:n \use_none:n
+ \cs_set_eq:NN \@@_par: \prg_do_nothing:
+ \cs_if_exist:NTF #1
+ {
+ \msg_error:nnn {antanilipsum} {already-defined} {#1}
+ }
+ {
+ \tl_set:Nx \l_tmpa_tl { \seq_item:Nn \g_@@_pars_seq {#2} }
+ \tl_if_novalue:nTF {#4}
+ { \@@_extract:nnV {#3} {#3} \l_tmpa_tl }
+ { \@@_extract:nnV {#3} {#4} \l_tmpa_tl }
+ \cs_new:Npx #1 { \l_tmpa_tl }
+ }
+ }
+% \end{macrocode}
+% \end{function}
+% \begin{function}{\@@_extract:nnn}
+% This function does the extraction by splitting the input at periods
+% and then adding the requested sentences to another sequence that
+% later can be used.
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_extract:nnn
+ {
+ \seq_set_split:Nnn \l_@@_sentences_seq { . } {#3}
+ \seq_clear:N \l_tmpa_seq
+ \seq_indexed_map_inline:Nn \l_@@_sentences_seq
+ {
+ \int_compare:nT { #1 <= ##1 <= #2 }
+ {\seq_put_right:Nn \l_tmpa_seq { ##2 } }
+ }
+ \tl_set:Nx \l_tmpa_tl { \seq_use:Nn \l_tmpa_seq { .~ }. }
+ }
+\cs_generate_variant:Nn \@@_extract:nnn { nnV }
+% \end{macrocode}
+% \end{function}
+%
+% \subsection{Defining the sentences}
+% We start a group where we set the category
+% code of the space to 10 so as not to be forced to write |~| for
+% spaces.
+% \begin{macrocode}
+\group_begin:
+\char_set_catcode_space:n {`\ }
+% \end{macrocode}
+%
+% Then we provide all of the sentences with the pattern
+% |\@@_newpara:n {|\meta{text}|}|
+% \begin{macrocode}
+\@@_newpara:n {Lei ha clacsonato. Tarapia tapioco, prematurata alla
+supercazzola o scherziamo? No, mi permetta. No, io; eh scusi noi siamo in
+quattro. Come se fosse antani anche per lei soltanto in due, oppure in quattro
+anche scribai con cofandina; come antifurto, per esempio. Aspetti, mi porga
+l'indice; ecco lo alzi così... guardi, guardi, guardi; lo vede il dito? Lo
+vede che stuzzica, che prematura anche. Ma allora io le potrei dire anche per
+il rispetto per l'autorità che anche soltanto le due cose come vicesindaco,
+capisce? Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò,
+posterdati, per due, anche un pochino antani in prefettura, senza contare che
+la supercazzola prematurata, ha ha perso i contatti col tarapia tapioco.}
+
+\@@_newpara:n {Voglio il cappellano, il cappellano! Ho visto la Madonna! Mi
+scusi; dica lei! Eh, antani, come se fosse antani, anche per il direttore, la
+supercazzola con scappellamento. A destra, per due. Sbiriguda veniale, la
+supercazzola prematurata, come fosse antani, con scappellamento a destra.
+Ostantinato a malliti. Fifty fifty come fosse mea culpa, alla supercazzola.
+Eeeh... non le dico, antani, come trazione per due anche se fosse supercazzola
+bitumata, ha lo scappellamento a destra. Antani, come se fosse antani, anche
+per il direttore, la supercazzola con scappellamento. A destra, per due. Dei
+tre telefoni qual è come se fosse tarapia tapioco che avverto la supercazzola?
+Dei tre...! Non m'ha capito bene, volevo dire dei tre telefoni qual è quello
+col prefisso? Sorella, col tarapia tapioco come se fosse antani la barella
+anche per due con lo scappellamento a sinistra!? No eh...? Pazienza.}
+
+\@@_newpara:n {Sbiliguda! Supercazzola prematurata? No, dico: prematurata la
+supercazzola? Con scappellamento a destra! No, volevo dire: occhiello di
+privilegio come se fosse Antani per lei; ispettore Tombale. Ispettore con
+fuochi fatui... Restai per una quintana, o setta! Intanto, trinita
+confraternita pulitina. Tarapio tapioco come se fosse Antani, la supercazzola
+prematurata con dominus reveriscum blinda. Tarapio sulla supercazzola con
+scappellamento destro o sinistra? Antipodi! Blinda la supercazzola con uno
+scappellamento a sinistra o a destra come se fosse di pentolone... Ecco! È
+l'informazione che volevo. Grazie. Antani come se fosse di scappellamento
+tarapio tapioco scappellamento di forestieri? Carmensita, amore mio, sono un
+uomo d'affari, blinda la supercazzola prematurata, una cosa d'assegni, tarapia
+tapioca, tapioca, torapia, dollari, sterline, allaccia scarpa, scarpallaccia,
+dico d'albergo, ma tu?}
+
+\@@_newpara:n {Sorella, ma la sbiriguda della sbrindolona come se fosse Antani
+come facevo? Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu, nel senso anafestico. Eh, sì; come
+farà di capo d'altitudine, no? Segua col dito. Vede, se va giù non va su. Se
+va su non va giù. Si faccia aiutare dalla suora, ma lei se la blinda la
+supercazzola prematurata come se fosse anche un po' di Casentino che perdura
+anche come cappotto; vede, m'importa sega.}
+
+\@@_newpara:n {Ah, pardon. Una mucca gioisce a la supercazzola, essendo nato
+trinità che, in senso mimetico, antani aveva sbrodolato gia una cosa mucca e
+tapioca, e mangiando infittisce il mistero: adesso la supercazzola prematurata
+quintana, prematurata cristallizza dietro a supercazzola, in senso enfatico,
+antani mangia e soffia spesso prematurata la supercazzola della mucca. Come
+dire, tarapia infama dollari, pesetas con stranezza in mezzo a sbisiguli, in
+senso denotativo, lei succhia con sbisigufi e disprezza antani tra 67 anni.
+Sbiliguli blinda di tarataratata blinda, in senso enfatico, la supercazzola che
+soffia e fanculizza sbifiguri con moderazione qualche volta, secondo la logica
+scarpallaccia-allacciascarpa pecora. Bitumata con lo scappellamento a sinistra
+carpiato in ratablinda. Ehhhh... Antani tira via gioisce spesso sull palle di
+bradipo, avendo disquisito di cucina con antani sbirigudi che sterline, euri,
+franchi francesi, moneta debole sbrodolava insieme a ratapioca, supercazzola
+abbaia giustamente la supercazzola prematurata sbiligufi. Gioisce a fianco di
+dollari, essendosi infervorato la supercazzola prematurata che antani
+sbrodolava insieme ad antani e a una pecora che parla con disgusto frigge
+giustamente prematurata prematurata la supercazzola, sbirigudi soffia racconta
+storie qualche volta pecora ratatapioca, nel senso onomatopeico, prematurata
+blatera con apprensione di alcool fotte ovviamente sbiliguri antani, in senso
+allegorico, taratapioca si infervora insieme a quintana.}
+
+\@@_newpara:n {Bituma per caso una piccola prova? Lei ha clacsonato voglio il
+dito, conte Mascetti, voglio antani, Necchi come fosse 2, voglio troppo,
+Melandri, stuzzica il dito come fosse antani e brematura anche, se vicesindaco
+maggiore di antani vicesindaco come se fosse antani con scappellamento a destra
+per 2, che cos'è il genio? fantasia: vicesindaco come fosse vicesindaco per
+antani, o magari intuizione: mi porga il cappellano, zingarata come fosse
+cappellano più uno, zingarata a posterdati, o magari maggiore di mobiletto:
+genio a posterdati, o tarapia tapioco: mi porga il cappello e velocità di
+esecuzione, vicesindaco a posterdati, mi porga il vicesindaco, brematurata la
+supercazzola tombale con alfio, serio o scherziamo? avvertite don ulrico, ho
+visto la signora! vicesindaco come se fosse brematurata la supercazzola avanti
+con il vicesindaco o scherziamo, vaffanzum 0! blinda la supercazzola Necchi
+antanizzata con alfio Mascetti o scherziamo? vaffanzum alfio meno 2! bituma al
+finale?}
+
+\@@_newpara:n {Lei ha clacsonato voglio una bucaiola, Necchi come se fosse 0
+voglio prematurata, Mascetti come se fosse 72 prematurata a posterdati voglio
+antifurto, Mascetti come se fosse 87. Voglio una cofandina, Mascetti come se
+fosse prematurata con scappellamento a sinistra per 1 cofandina come fosse
+cofandina meno 33 brematurata la supercazzola antanizzata con antifurto,
+cofandina o scherziamo? vaffanzum! bituma scusi, noi siamo in quattro. Blinda
+la supercazzola antanizzata con Alfio Mascetti, tarapia Mascetti o scherziamo?
+voglio vicesindaco, Mascetti come se fosse 101 vicesindaco a posterdati voglio
+pastene, Mascetti come se fosse vicesindaco più 7 pastene a posterdati bituma
+in un certo senso. Pastene a posterdati tarapia a posterdati Alfio a posterdati
+tarapia a posterdati voglio scappellamento, Mascetti come se fosse 114
+scappellamento a posterdati pastene a posterdati voglio Antani, Mascetti come
+se fosse pastene meno 8 Antani a posterdati.}
+
+\@@_newpara:n {Lei ha clacsonato voglio uno, Necchi come se fosse 1 voglio
+antani, Necchi come se fosse uno, voglio il massimo, Necchi come se fosse
+antani per 100 antani per 2 a posterdati stuzzica antani come se fosse antani
+più uno, voglio l'amico, Necchi come se fosse 2 voglio un controllo, Melandri
+come se fosse uno stuzzica voglio vicino, Necchi come se fosse antani diviso
+l'amico per un amico, che cos'è antani? vicino: controllo come se fosse 0 e
+velocità di esecuzione, amico come se fosse amico più uno e brematura anche,
+se amico minore di antani, che cos'è il controllo? uno: antani a posterdati e
+velocità di esecuzione e brematura anche, se antani minore del massimo.}
+
+\@@_newpara:n {Blinda la supercazzola densa con cofandina Sassaroli o
+scherziamo? voglio una zingarata, Mascetti bitumando la confandina. Che cos'è
+la cofandina? maggiore di 8: zingarata come fosse 32 o magari maggiore di 4:
+zingarata come fosse 46 o magari maggiore di 2: zingarata come fosse 43 o
+tarapia tapioco: zingarata come fosse 42 e velocità di esecuzione, zingarata a
+posterdati blinda la supercazzola Sassaroli converge con vero Sassaroli, sogno
+Sassaroli, passo Necchi, destinazione Sassaroli, finta Sassaroli o scherziamo?
+voglio lo sci, Sassaroli come se fosse vero per vero più sogno per sogno che
+cos'è il passo? maggiore di 255: vaffanzum un passo! o tarapia tapioco: che
+cos'è lo sci? maggiore di 4: vaffanzum il passo! o tarapia tapioco: vaffanzum
+prematurata la supercazzola converge con vero per vero meno un sogno per il
+sogno più la destinazione, 2 per il vero per il sogno più la finta, il passo
+più 1, destinazione, finta o scherziamo?! e velocità di esecuzione, e
+velocità di esecuzione bitumata dico io! blinda la supercazzola Sassaroli
+ancora con il vero Sassaroli, un sogno Sassaroli o scherziamo? vaffanzum
+prematurata la supercazzola converge con vero, sogno, 0, vero, sogno o
+scherziamo?! blinda la supercazzola antanizzata con mino Sassaroli, mano
+Sassaroli, piede Sassaroli, fuochino Sassaroli, mono Sassaroli, pastene
+Sassaroli o scherziamo? }
+
+\@@_newpara:n {Voglio ispettore, Mascetti come se fosse 10 voglio una pulitina,
+Sassaroli come fosse mino stuzzica fuochino come se fosse fuochino più pastene
+stuzzica mino come se fosse mino più piede prematurata la supercazzola densa
+con bituma e prematurata la supercazzola bitumata come sempre e ancora con
+mino, fuochino o scherziamo? o scherziamo? bituma no eh! Lo ripeto e brematura
+anche, se mino minore di mano mino come se fosse la pulitina ispettore a
+posterdati e brematura anche, se fuochino minore di mono blinda la supercazzola
+cofandina con vero Sassaroli, l'immagine Sassaroli, la grandezza Sassaroli, il
+finale Sassaroli o scherziamo? bituma come sempre prematurata la supercazzola
+antanizzata con vero, vero più la grandezza per 78, grandezza, immagine,
+immagine più il finale per 40, il finale o scherziamo? Lei ha clacsonato
+prematurata la supercazzola cofandina con -2.3, -1.3, 0.05, 0.07 o scherziamo?}
+
+\@@_newpara:n {Lei ha clacsonato voglio una bucaiola, Necchi come se fosse 0
+voglio prematurata, Mascetti come se fosse 72 prematurata a posterdati voglio
+antifurto, Mascetti come se fosse 87. Voglio una cofandina, Mascetti come se
+fosse prematurata con scappellamento a sinistra per 1 cofandina come fosse
+cofandina meno 33 brematurata la supercazzola antanizzata con antifurto,
+cofandina o scherziamo? vaffanzum! bituma scusi, noi siamo in quattro. Blinda
+la supercazzola antanizzata con Alfio Mascetti, tarapia Mascetti o scherziamo?
+voglio vicesindaco, Mascetti come se fosse 101 vicesindaco a posterdati voglio
+pastene, Mascetti come se fosse vicesindaco più 7 pastene a posterdati bituma
+in un certo senso. Pastene a posterdati tarapia a posterdati Alfio a posterdati
+tarapia a posterdati voglio scappellamento, Mascetti come se fosse 114
+scappellamento a posterdati pastene a posterdati voglio Antani, Mascetti come
+se fosse pastene meno 8 Antani a posterdati.}
+
+\@@_newpara:n {Bituma un po' il calcolo del fattoriale come fosse un Sassaroli,
+o no? blinda la supercazzola Sassaroli antanizzata con pazienza bitumata,
+concorda Sassaroli o scherziamo? voglio il gruppo, Sassaroli il gruppo come
+fosse 1 che cos'è la pazienza? 1: il gruppo come fosse 2 con scappellamento a
+destra per 1 o tarapia tapioco: il gruppo come fosse prematurata la
+supercazzola antanizzata con pazienza meno 1 o scherziamo? per la pazienza e
+velocità di esecuzione bitumata! in fretta, e bitumando! se no il gruppo si
+spacca, e insomma, vaffanzum il gruppo! Lei ha clacsonato voglio il
+vicesindaco, Necchi voglio il numero, Necchi mi porga il numero bitumando il
+vicesindaco, dico, bitumando il vicesindaco come fosse un numero prematurata la
+supercazzola antanizzata con il vicesindaco o scherziamo? a posterdati
+bitumati, pure, o in questura?}
+
+\@@_newpara:n {Voglio una tavola al papero per due per due, Necchi mi porga il
+barilotto stuzzica bitumato il passaggio sullo sci nauticopastene a posterdati
+voglio un passaggio, Necchi come fosse antani,antani come fosse pastene
+bitumato e per finirepastene come fosse il pastene più il passaggiobarilotto
+come fosse il barilotto bitumato di primameno 1 e brematura anche, se il
+barilotto maggiore di Mascettivoglio una tavola al papero per due per due,
+Perozzi, voglio lo sci, che cos'è il passo? maggiore di 255: vaffanzum un
+passo!o tarapia tapioco: che cos'è lo sci? maggiore di 4: vaffanzum il passo!
+o tarapia tapioco: vaffanzum prematurata la supercazzola converge convero per
+vero meno un sogno per il sogno più la destinazione, 2 per il veroper il sogno
+più la finta, il passo più 1, destinazione, finta o scherziamo?!e velocità
+di esecuzione, e velocità di esecuzione bitumata dico io! Che cos'è il
+controllo? uno: antani a posterdati e velocità di esecuzionee brematura anche,
+se antani minore del massimo. Avvertite don ulrico.}
+
+\@@_newpara:n {Lei ha clacsonato antani con scappellamento a sinistra per 2
+voglio antani, Necchi come se fosse 10 stuzzica antani come fosse antani meno 1
+e brematura anche, se antani maggiore di 0 che cos'è il genio? intuizione:
+genio come se fosse genio meno 1 o magari intuizione diviso 2: genio come se
+fosse genio più 1 o magari maggiore di mobiletto per due: genio come se fosse
+genio per 2 o tarapia tapioco: genio come se fosse 2 e velocità di esecuzione
+che cos'è il genio? maggiore di mobiletto: genio come se fosse 2 o tarapia
+tapioco: genio come se fosse 0 e velocità di esecuzione blinda la supercazzola
+Necchi antanizzata con alfio Mascetti o scherziamo? vaffanzum alfio meno 2!
+blinda la supercazzola Necchi antanizzata con alfio Mascetti, barilotto Necchi
+o scherziamo? vaffanzum alfio meno 2! blinda la supercazzola antanizzata o
+scherziamo? vaffanzum! antani come se fosse brematurata la supercazzola alfio
+con barilotto diviso 3 o scherziamo? per 2 antani come se fosse 4 bituma,
+scusi, noi siamo in quattro, ho visto la contessa, avvertite don ulrico scusi
+noi siamo in 4, con rinforzino anche.}
+
+\@@_newpara:n {Ho capito. Tre applicazioni di afasol, di un’ora l’una.
+Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra
+e a destra come se fossero dei pentoloni. Ma allora io le potrei dire anche con
+il rispetto per l’autorità, che anche soltanto le due cose come
+vice-sindaco, capisce? Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Forse non ha capito. Io dicevo che se fosse il
+coso di telefono, o il dito, come se fosse. Andando su o giù, giù o su.
+Faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come farà di capo
+d’altitudine, no? Ah, vuol dire che il telefono è troppo alto? Ho capito.
+Tre applicazioni di afasol, di un’ora l’una. Subito! Che c’è? Ehm...
+blinda la supercazzola con scappellamento a sinistra e a destra come se fossero
+dei pentoloni.}
+
+\@@_newpara:n {Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto?
+Sorella? Eh!? Col tarapia tapioco come se fosse la supercazzola per lei. Voglio
+il cappellano, il cappellano! Ho visto la Madonna!Segua col dito. Vede, se va
+giù non va su. Se va su non va giù. Si faccia aiutare dalla suora. È quello
+che stavo dicendo, no!? Ma che antifurto, mi faccia il piacere! Questi signori
+qui stavano sonando loro. Segua col dito. Vede, se va giù non va su. Se va su
+non va giù. Si faccia aiutare dalla suora. È quello che stavo dicendo, no!? E
+lei... cosa si sente? Professore, non le dico. Antani come trazione per due
+anche se fosse supercazzola bitumata, ha lo scappellamento a destra.}
+
+\@@_newpara:n {Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se
+la blinda la supercazzola prematurata come se fosse anche un po' di Casentino
+che perdura anche come cappotto; vede, m'importa. Che non si ripeta più, vada
+pure! Senz'altro!!! Tarapia tapioco! Brematurata la supercazzola o scherziamo?
+Prego? No, mi permetta. No, io, scusi noi siamo in quattro. Non si
+intrometta!No, aspetti, mi porga l'indice; ecco lo alzi così... guardi,
+guardi, guardi; lo vede il dito? Lo vede che stuzzica, che prematura anche.
+Vicesindaco? Basta così, mi seguano al commissariato! No, no, no, attenzione,
+noo!Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per andicappo
+di altitudine. No? Ah, vuol dire che il telefono è troppo alto? Carmensita,
+amore mio, sono un uomo d'affari, blinda la supercazzola prematurata, una cosa
+d'assegni, tarapia tapioca, tapioca torapia, dollari, sterline, allaccia
+scarpa, scarpallaccia, dico d'albergo.}
+
+\@@_newpara:n {Segua col dito. Vede, se va giù non va su. Se va su non va
+giù. Si faccia aiutare dalla suora. È quello che stavo dicendo, no!? Non si
+intrometta!No, aspetti, mi porga l'indice; ecco lo alzi così... guardi,
+guardi, guardi; lo vede il dito? Lo vede che stuzzica, che prematura anche.
+Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per andicappo di
+altitudine. No? Ah, vuol dire che il telefono è troppo alto? Ah, pardon.
+Tarapio tapioco come se fosse Antani, la supercazzola prematurata con dominus
+reveriscum blinda. Come, prego? Tarapio sulla supercazzola con scappellamento
+destro o sinistra? Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? Segua
+col dito. Vede, se va giù non va su. Se va su non va giù. Si faccia aiutare
+dalla suora. È quello che stavo dicendo, no!? tarapia.}
+
+\@@_newpara:n {Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no,
+no, attenzione, noo!Ho capito. Tre applicazioni di afasol, di un’ora l’una.
+Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra
+e a destra come se fossero dei pentoloni. Si, ma la sbiriguda della
+sbrindellona come se fosse antani come faceva? Prego? Ho provato con la
+supercazzola con scappelamento paraplegico a sinistra, ma non funzionava.
+Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò, posterdati,
+per due, anche un pochino antani in prefettura... senza contare che la
+supercazzola prematurata ha perso i contatti col tarapio tapioco. Ho provato
+con la supercazzola con scappellamento paraplegico a sinistra, ma non
+funzionava, faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come
+farà di capo d'altitudine, no? Ho provato con la supercazzola con
+scappellamento paraplegico a sinistra, ma non funzionava, faceva tu-tu. In che
+senso? Nel senso anafestico. Eh, sì; come farà di capo d'altitudine, no?
+Forse.}
+
+\@@_newpara:n {Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. Come se fosse antani anche per lei soltanto in
+due, oppure in quattro anche scribai con cofandina; come antifurto, per
+esempio. Mi scusi, Antani come se fosse di scappellamento tarapio tapioco
+scappellamento di forestieri? Va be', siete forestieri, ma i cartelli sono
+internazionali. Mi può mostrare la sua patente, per favore? Mi faccia il
+piacere! Questi signori qui stavano sonando loro. Faceva Du-Du! In che senso?
+Nel senso anafestico! Si, forse per andicappo di altitudine. No? Ah, vuol dire
+che il telefono è troppo alto? Vicesindaco? Basta 'osì, mi seguano al
+commissariato! No, no, no, attenzione, noo.}
+
+\@@_newpara:n {Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Quante volte figliolo? Fifty fifty, prematinea
+come fosse mea culpa. Alla supercazzola.Guardi, le ho ritagliato quell'articolo
+sul Casentino. Ma lei se la blinda la supercazzola prematurata come se fosse
+anche un po' di Casentino che perdura anche come cappotto; vede, m'importa.Come
+se fosse antani anche per lei soltanto in due, oppure in quattro anche scribai
+con cofandina; come antifurto, per esempio. E lei... cosa si sente? Professore,
+non le dico. Antani come trazione per due anche se fosse supercazzola bitumata,
+ha lo scappellamento a destra.Faceva Du-Du! In che senso? Nel senso anafestico!
+Si, forse per andicappo di altitudine. No? Ah, vuol dire che il telefono è
+troppo alto? Non si intrometta!No, aspetti, mi porga l'indice; ecco lo alzi
+così... guardi, guardi, guardi; lo vede il dito? Lo vede che stuzzica, che
+prematura anche.}
+
+\@@_newpara:n {No, no... non era troppo alto. Forse non ha capito. Io dicevo
+che se fosse il coso di telefono, o il dito, come se fosse. Andando su o giù,
+giù o su. Si, ma la sbiriguda della sbrindellona come se fosse antani come
+faceva? Prego? Ho provato con la supercazzola con scappelamento paraplegico a
+sinistra, ma non funzionava. Pattene soppaltate secondo l'articolo 12 abbia
+pazienza, sennò, posterdati, per due, anche un pochino antani in prefettura...
+senza contare che la supercazzola prematurata ha perso i contatti col tarapio
+tapioco. Mi scusi, Antani come se fosse di scappellamento tarapio tapioco
+scappellamento di forestieri? Va be', siete forestieri, ma i cartelli sono
+internazionali. Mi può mostrare la sua patente, per favore? Ah, pardon.
+Tarapio tapioco come se fosse Antani, la supercazzola prematurata con dominus
+reveriscum blinda. Come, prego? Tarapio sulla supercazzola con scappellamento
+destro o sinistra? Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti.}
+
+\@@_newpara:n {Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se
+la blinda la supercazzola prematurata come se fosse anche un po' di Casentino
+che perdura anche come cappotto; vede, m'importa. Sorella? Eh!? Col tarapia
+tapioco come se fosse la supercazzola per lei. Voglio il cappellano, il
+cappellano! Ho visto la Madonna! Pattene soppaltate secondo l'articolo 12 abbia
+pazienza, sennò, posterdati, per due, anche un pochino antani in prefettura...
+senza contare che la supercazzola prematurata ha perso i contatti col tarapio
+tapioco. Si, ma la sbiriguda della sbrindellona come se fosse antani come
+faceva? Prego? Ho provato con la supercazzola con scappelamento paraplegico a
+sinistra, ma non funzionava.}
+
+\@@_newpara:n {No, no... non era troppo alto. Forse non ha capito. Io dicevo
+che se fosse il coso di telefono, o il dito, come se fosse. Andando su o giù,
+giù o su. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Quante volte figliolo? Fifty fifty, prematinea
+come fosse mea culpa. Alla supercazzola. Vicesindaco? Basta 'osì, mi seguano
+al commissariato! No, no, no, attenzione, noo! Come se fosse antani anche per
+lei soltanto in due, oppure in quattro anche scribai con cofandina; come
+antifurto, per esempio.}
+
+\@@_newpara:n {Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. No, no... non era troppo alto. Forse non ha
+capito. Io dicevo che se fosse il coso di telefono, o il dito, come se fosse.
+Andando su o giù, giù o su. Ah, pardon. Tarapio tapioco come se fosse Antani,
+la supercazzola prematurata con dominus reveriscum blinda. Come, prego? Tarapio
+sulla supercazzola con scappellamento destro o sinistra? Segua col dito. Vede,
+se va giù non va su. Se va su non va giù. Si faccia aiutare dalla suora. È
+quello che stavo dicendo, no!?}
+
+\@@_newpara:n {Non si intrometta! No, aspetti, mi porga l'indice; ecco lo alzi
+così... guardi, guardi, guardi; lo vede il dito? Lo vede che stuzzica, che
+prematura anche. Pattene soppaltate secondo l'articolo 12 abbia pazienza,
+sennò, posterdati, per due, anche un pochino antani in prefettura... senza
+contare che la supercazzola prematurata ha perso i contatti col tarapio
+tapioco. Come se fosse antani anche per lei soltanto in due, oppure in quattro
+anche scribai con cofandina; come antifurto, per esempio. Segua col dito. Vede,
+se va giù non va su. Se va su non va giù. Si faccia aiutare dalla suora. È
+quello che stavo dicendo, no!?}
+
+\@@_newpara:n {Ma che antifurto, mi faccia il piacere! Questi signori qui
+stavano sonando loro. No, no... non era troppo alto. Forse non ha capito. Io
+dicevo che se fosse il coso di telefono, o il dito, come se fosse. Andando su o
+giù, giù o su. Ah, pardon. Tarapio tapioco come se fosse Antani, la
+supercazzola prematurata con dominus reveriscum blinda. Come, prego? Tarapio
+sulla supercazzola con scappellamento destro o sinistra? Come figliolo?
+Confesso come fosse antani con scappellamento a destra costantinato ammaliti.
+Quante volte figliolo? Fifty fifty, prematinea come fosse mea culpa. Alla
+supercazzola.}
+
+\@@_newpara:n {Si, ma la sbiriguda della sbrindellona come se fosse antani come
+faceva? Prego? Ho provato con la supercazzola con scappelamento paraplegico a
+sinistra, ma non funzionava. Faceva Du-Du! In che senso? Nel senso anafestico!
+Si, forse per andicappo di altitudine. No? Ah, vuol dire che il telefono è
+troppo alto? Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se
+la blinda la supercazzola prematurata come se fosse anche un po' di Casentino
+che perdura anche come cappotto; vede, m'importa. Sorella? Eh!? Col tarapia
+tapioco come se fosse la supercazzola per lei. Voglio il cappellano, il
+cappellano! Ho visto la Madonna!}
+
+\@@_newpara:n {Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto? Come
+figliolo? Confesso come fosse antani con scappellamento a destra costantinato
+ammaliti. Quante volte figliolo? Fifty fifty, prematinea come fosse mea culpa.
+Alla supercazzola. Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Che non si ripeta più, vada pure! Senz'altro!!!
+Tarapia tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi
+permetta. No, io, scusi noi siamo in quattro.}
+
+\@@_newpara:n {Ho capito. Tre applicazioni di afasol, di un’ora l’una.
+Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra
+e a destra come se fossero dei pentoloni. Vicesindaco? Basta 'osì, mi seguano
+al commissariato! No, no, no, attenzione, noo! Dimmi figliolo. Sbiliguda
+veniale con la supercazzola prematurata. Come figliolo? Confesso come fosse
+antani con scappellamento a destra costantinato ammaliti. Che non si ripeta
+più, vada pure! Senz'altro!!! Tarapia tapioco! Brematurata la supercazzola o
+scherziamo? Prego? No, mi permetta. No, io, scusi noi siamo in quattro.}
+
+\@@_newpara:n {Ah, pardon. Tarapio tapioco come se fosse Antani, la
+supercazzola prematurata con dominus reveriscum blinda. Come, prego? Tarapio
+sulla supercazzola con scappellamento destro o sinistra? No, no... non era
+troppo alto. Forse non ha capito. Io dicevo che se fosse il coso di telefono, o
+il dito, come se fosse. Andando su o giù, giù o su. Vicesindaco? Basta 'osì,
+mi seguano al commissariato! No, no, no, attenzione, noo! Dimmi figliolo.
+Sbiliguda veniale con la supercazzola prematurata. Come figliolo? Confesso come
+fosse antani con scappellamento a destra costantinato ammaliti.}
+
+\@@_newpara:n {E lei... cosa si sente? Professore, non le dico. Antani come
+trazione per due anche se fosse supercazzola bitumata, ha lo scappellamento a
+destra. Dimmi figliolo. Sbiliguda veniale con la supercazzola prematurata. Come
+figliolo? Confesso come fosse antani con scappellamento a destra costantinato
+ammaliti. Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò,
+posterdati, per due, anche un pochino antani in prefettura... senza contare che
+la supercazzola prematurata ha perso i contatti col tarapio tapioco. Come se
+fosse antani anche per lei soltanto in due, oppure in quattro anche scribai con
+cofandina; come antifurto, per esempio.}
+
+\@@_newpara:n {Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? E
+lei... cosa si sente? Professore, non le dico. Antani come trazione per due
+anche se fosse supercazzola bitumata, ha lo scappellamento a destra. Ma allora
+io le potrei dire anche con il rispetto per l'autorità, che anche soltanto le
+due cose come vice-sindaco, capisce? Vicesindaco? Basta 'osì, mi seguano al
+commissariato! No, no, no, attenzione, noo!}
+
+\@@_newpara:n {E lei... cosa si sente? Professore, non le dico. Antani come
+trazione per due anche se fosse supercazzola bitumata, ha lo scappellamento a
+destra. Come figliolo? Confesso come fosse antani con scappellamento a destra
+costantinato ammaliti. Quante volte figliolo? Fifty fifty, prematinea come
+fosse mea culpa. Alla supercazzola. Come figliolo? Confesso come fosse antani
+con scappellamento a destra costantinato ammaliti. Quante volte figliolo? Fifty
+fifty, prematinea come fosse mea culpa. Alla supercazzola. Vicesindaco? Basta
+'osì, mi seguano al commissariato! No, no, no, attenzione, noo!}
+
+\@@_newpara:n {Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Ho provato con la supercazzola con scappellamento
+paraplegico a sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel
+senso anafestico. Eh, sì; come farà di capo d'altitudine, no? Ma che
+antifurto, mi faccia il piacere! Questi signori qui stavano sonando loro. Non
+si intrometta! No, aspetti, mi porga l'indice; ecco lo alzi così... guardi,
+guardi, guardi; lo vede il dito? Lo vede che stuzzica, che prematura anche.}
+
+\@@_newpara:n {Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se
+la blinda la supercazzola prematurata come se fosse anche un po' di Casentino
+che perdura anche come cappotto; vede, m'importa. No, no... non era troppo
+alto. Forse non ha capito. Io dicevo che se fosse il coso di telefono, o il
+dito, come se fosse. Andando su o giù, giù o su. Non si intrometta! No,
+aspetti, mi porga l'indice; ecco lo alzi così... guardi, guardi, guardi; lo
+vede il dito? Lo vede che stuzzica, che prematura anche. Mi scusi, Antani come
+se fosse di scappellamento tarapio tapioco scappellamento di forestieri? Va
+be', siete forestieri, ma i cartelli sono internazionali. Mi può mostrare la
+sua patente, per favore?}
+
+\@@_newpara:n {Si, ma la sbiriguda della sbrindellona come se fosse antani come
+faceva? Prego? Ho provato con la supercazzola con scappelamento paraplegico a
+sinistra, ma non funzionava. Mo basta insomma! Qui c’è gente che soffre per
+davvero, lo capite? Chiamo il medico di turno e domani ve la vedrete con il
+professore! Ho capito. Tre applicazioni di afasol, di un’ora l’una. Subito!
+Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra e a
+destra come se fossero dei pentoloni. Si, ma la sbiriguda della sbrindellona
+come se fosse antani come faceva? Prego? Ho provato con la supercazzola con
+scappelamento paraplegico a sinistra, ma non funzionava.}
+
+\@@_newpara:n {Segua col dito. Vede, se va giù non va su. Se va su non va
+giù. Si faccia aiutare dalla suora. È quello che stavo dicendo, no!? Ma
+allora io le potrei dire anche con il rispetto per l'autorità, che anche
+soltanto le due cose come vice-sindaco, capisce? Ma allora io le potrei dire
+anche con il rispetto per l'autorità, che anche soltanto le due cose come
+vice-sindaco, capisce? Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti.}
+
+\@@_newpara:n {Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Faceva Du-Du! In che senso? Nel senso anafestico!
+Si, forse per andicappo di altitudine. No? Ah, vuol dire che il telefono è
+troppo alto? Dimmi figliolo. Sbiliguda veniale con la supercazzola prematurata.
+Come figliolo? Confesso come fosse antani con scappellamento a destra
+costantinato ammaliti. Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti. Quante volte figliolo? Fifty
+fifty, prematinea come fosse mea culpa. Alla supercazzola.}
+
+\@@_newpara:n {Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. Faceva Du-Du! In che senso? Nel senso
+anafestico! Si, forse per andicappo di altitudine. No? Ah, vuol dire che il
+telefono è troppo alto? Carmensita, amore mio, sono un uomo d'affari, blinda
+la supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca
+torapia, dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma
+tu? Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se la blinda
+la supercazzola prematurata come se fosse anche un po' di Casentino che perdura
+anche come cappotto; vede, m'importa.}
+
+\@@_newpara:n {Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce? Mi
+scusi, Antani come se fosse di scappellamento tarapio tapioco scappellamento di
+forestieri? Va be', siete forestieri, ma i cartelli sono internazionali. Mi
+può mostrare la sua patente, per favore? Non si intrometta! No, aspetti, mi
+porga l'indice; ecco lo alzi così... guardi, guardi, guardi; lo vede il dito?
+Lo vede che stuzzica, che prematura anche. Ah, pardon. Tarapio tapioco come se
+fosse Antani, la supercazzola prematurata con dominus reveriscum blinda. Come,
+prego? Tarapio sulla supercazzola con scappellamento destro o sinistra?}
+
+\@@_newpara:n {Si, ma la sbiriguda della sbrindellona come se fosse antani come
+faceva? Prego? Ho provato con la supercazzola con scappelamento paraplegico a
+sinistra, ma non funzionava. Pattene soppaltate secondo l'articolo 12 abbia
+pazienza, sennò, posterdati, per due, anche un pochino antani in prefettura...
+senza contare che la supercazzola prematurata ha perso i contatti col tarapio
+tapioco. Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? Come figliolo? Confesso come
+fosse antani con scappellamento a destra costantinato ammaliti. Quante volte
+figliolo? Fifty fifty, prematinea come fosse mea culpa. Alla supercazzola.}
+
+\@@_newpara:n {Segua col dito. Vede, se va giù non va su. Se va su non va
+giù. Si faccia aiutare dalla suora. È quello che stavo dicendo, no!? Si, ma
+la sbiriguda della sbrindellona come se fosse antani come faceva? Prego? Ho
+provato con la supercazzola con scappelamento paraplegico a sinistra, ma non
+funzionava. Ah, pardon. Tarapio tapioco come se fosse Antani, la supercazzola
+prematurata con dominus reveriscum blinda. Come, prego? Tarapio sulla
+supercazzola con scappellamento destro o sinistra? Ma che antifurto, mi faccia
+il piacere! Questi signori qui stavano sonando loro.}
+
+\@@_newpara:n {Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto? Ah,
+pardon. Tarapio tapioco come se fosse Antani, la supercazzola prematurata con
+dominus reveriscum blinda. Come, prego? Tarapio sulla supercazzola con
+scappellamento destro o sinistra? Come se fosse antani anche per lei soltanto
+in due, oppure in quattro anche scribai con cofandina; come antifurto, per
+esempio. Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò,
+posterdati, per due, anche un pochino antani in prefettura... senza contare che
+la supercazzola prematurata ha perso i contatti col tarapio tapioco.}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? Ah, pardon. Tarapio tapioco come
+se fosse Antani, la supercazzola prematurata con dominus reveriscum blinda.
+Come, prego? Tarapio sulla supercazzola con scappellamento destro o sinistra?
+Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no, no, attenzione,
+noo! Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per andicappo
+di altitudine. No? Ah, vuol dire che il telefono è troppo alto?}
+
+\@@_newpara:n {Segua col dito. Vede, se va giù non va su. Se va su non va
+giù. Si faccia aiutare dalla suora. È quello che stavo dicendo, no!? Come se
+fosse antani anche per lei soltanto in due, oppure in quattro anche scribai con
+cofandina; come antifurto, per esempio. Carmensita, amore mio, sono un uomo
+d'affari, blinda la supercazzola prematurata, una cosa d'assegni, tarapia
+tapioca, tapioca torapia, dollari, sterline, allaccia scarpa, scarpallaccia,
+dico d'albergo, ma tu? Ho capito. Tre applicazioni di afasol, di un’ora
+l’una. Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a
+sinistra e a destra come se fossero dei pentoloni.}
+
+\@@_newpara:n {Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Quante volte figliolo? Fifty fifty, prematinea
+come fosse mea culpa. Alla supercazzola. Come figliolo? Confesso come fosse
+antani con scappellamento a destra costantinato ammaliti. Quante volte
+figliolo? Fifty fifty, prematinea come fosse mea culpa. Alla supercazzola. E
+lei... cosa si sente? Professore, non le dico. Antani come trazione per due
+anche se fosse supercazzola bitumata, ha lo scappellamento a destra. Si, ma la
+sbiriguda della sbrindellona come se fosse antani come faceva? Prego? Ho
+provato con la supercazzola con scappelamento paraplegico a sinistra, ma non
+funzionava.}
+
+\@@_newpara:n {Come se fosse antani anche per lei soltanto in due, oppure in
+quattro anche scribai con cofandina; come antifurto, per esempio. Si, ma la
+sbiriguda della sbrindellona come se fosse antani come faceva? Prego? Ho
+provato con la supercazzola con scappelamento paraplegico a sinistra, ma non
+funzionava. Sorella? Eh!? Col tarapia tapioco come se fosse la supercazzola per
+lei. Voglio il cappellano, il cappellano! Ho visto la Madonna! Ma che
+antifurto, mi faccia il piacere! Questi signori qui stavano sonando loro.}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? Come figliolo? Confesso come
+fosse antani con scappellamento a destra costantinato ammaliti. Quante volte
+figliolo? Fifty fifty, prematinea come fosse mea culpa. Alla supercazzola. Come
+se fosse antani anche per lei soltanto in due, oppure in quattro anche scribai
+con cofandina; come antifurto, per esempio. Ho capito. Tre applicazioni di
+afasol, di un’ora l’una. Subito! Che c’è? Ehm... blinda la supercazzola
+con scappellamento a sinistra e a destra come se fossero dei pentoloni.}
+
+\@@_newpara:n {Non si intrometta! No, aspetti, mi porga l'indice; ecco lo alzi
+così... guardi, guardi, guardi; lo vede il dito? Lo vede che stuzzica, che
+prematura anche. E lei... cosa si sente? Professore, non le dico. Antani come
+trazione per due anche se fosse supercazzola bitumata, ha lo scappellamento a
+destra. Ho capito. Tre applicazioni di afasol, di un’ora l’una. Subito! Che
+c’è? Ehm... blinda la supercazzola con scappellamento a sinistra e a destra
+come se fossero dei pentoloni. Faceva Du-Du! In che senso? Nel senso
+anafestico! Si, forse per andicappo di altitudine. No? Ah, vuol dire che il
+telefono è troppo alto?}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? Carmensita, amore mio, sono un
+uomo d'affari, blinda la supercazzola prematurata, una cosa d'assegni, tarapia
+tapioca, tapioca torapia, dollari, sterline, allaccia scarpa, scarpallaccia,
+dico d'albergo, ma tu? Ma che antifurto, mi faccia il piacere! Questi signori
+qui stavano sonando loro. Come se fosse antani anche per lei soltanto in due,
+oppure in quattro anche scribai con cofandina; come antifurto, per esempio.}
+
+\@@_newpara:n {Mo basta insomma! Qui c’è gente che soffre per davvero, lo
+capite? Chiamo il medico di turno e domani ve la vedrete con il professore! No,
+no... non era troppo alto. Forse non ha capito. Io dicevo che se fosse il coso
+di telefono, o il dito, come se fosse. Andando su o giù, giù o su. Segua col
+dito. Vede, se va giù non va su. Se va su non va giù. Si faccia aiutare dalla
+suora. È quello che stavo dicendo, no!? Ma allora io le potrei dire anche con
+il rispetto per l'autorità, che anche soltanto le due cose come vice-sindaco,
+capisce?}
+
+\@@_newpara:n {Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto?
+Carmensita, amore mio, sono un uomo d'affari, blinda la supercazzola
+prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia, dollari,
+sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? Faceva Du-Du!
+In che senso? Nel senso anafestico! Si, forse per andicappo di altitudine. No?
+Ah, vuol dire che il telefono è troppo alto? Guardi, le ho ritagliato
+quell'articolo sul Casentino. Ma lei se la blinda la supercazzola prematurata
+come se fosse anche un po' di Casentino che perdura anche come cappotto; vede,
+m'importa.}
+
+\@@_newpara:n {Come se fosse antani anche per lei soltanto in due, oppure in
+quattro anche scribai con cofandina; come antifurto, per esempio. Dimmi
+figliolo. Sbiliguda veniale con la supercazzola prematurata. Come figliolo?
+Confesso come fosse antani con scappellamento a destra costantinato ammaliti. E
+lei... cosa si sente? Professore, non le dico. Antani come trazione per due
+anche se fosse supercazzola bitumata, ha lo scappellamento a destra. Ho capito.
+Tre applicazioni di afasol, di un’ora l’una. Subito! Che c’è? Ehm...
+blinda la supercazzola con scappellamento a sinistra e a destra come se fossero
+dei pentoloni.}
+
+\@@_newpara:n {Mo basta insomma! Qui c’è gente che soffre per davvero, lo
+capite? Chiamo il medico di turno e domani ve la vedrete con il professore! Non
+si intrometta! No, aspetti, mi porga l'indice; ecco lo alzi così... guardi,
+guardi, guardi; lo vede il dito? Lo vede che stuzzica, che prematura anche. Ma
+allora io le potrei dire anche con il rispetto per l'autorità, che anche
+soltanto le due cose come vice-sindaco, capisce? Sorella? Eh!? Col tarapia
+tapioco come se fosse la supercazzola per lei. Voglio il cappellano, il
+cappellano! Ho visto la Madonna!}
+
+\@@_newpara:n {Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se
+la blinda la supercazzola prematurata come se fosse anche un po' di Casentino
+che perdura anche come cappotto; vede, m'importa. Come se fosse antani anche
+per lei soltanto in due, oppure in quattro anche scribai con cofandina; come
+antifurto, per esempio. Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Carmensita, amore mio, sono un uomo d'affari,
+blinda la supercazzola prematurata, una cosa d'assegni, tarapia tapioca,
+tapioca torapia, dollari, sterline, allaccia scarpa, scarpallaccia, dico
+d'albergo, ma tu?}
+
+\@@_newpara:n {Ho capito. Tre applicazioni di afasol, di un’ora l’una.
+Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra
+e a destra come se fossero dei pentoloni. Ma che antifurto, mi faccia il
+piacere! Questi signori qui stavano sonando loro. Ah, pardon. Tarapio tapioco
+come se fosse Antani, la supercazzola prematurata con dominus reveriscum
+blinda. Come, prego? Tarapio sulla supercazzola con scappellamento destro o
+sinistra? Sorella? Eh!? Col tarapia tapioco come se fosse la supercazzola per
+lei. Voglio il cappellano, il cappellano! Ho visto la Madonna!}
+
+\@@_newpara:n {Mi scusi, Antani come se fosse di scappellamento tarapio tapioco
+scappellamento di forestieri? Va be', siete forestieri, ma i cartelli sono
+internazionali. Mi può mostrare la sua patente, per favore? Ma allora io le
+potrei dire anche con il rispetto per l'autorità, che anche soltanto le due
+cose come vice-sindaco, capisce? Come se fosse antani anche per lei soltanto in
+due, oppure in quattro anche scribai con cofandina; come antifurto, per
+esempio. Come se fosse antani anche per lei soltanto in due, oppure in quattro
+anche scribai con cofandina; come antifurto, per esempio.}
+
+\@@_newpara:n {Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu?
+Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per andicappo di
+altitudine. No? Ah, vuol dire che il telefono è troppo alto? Mo basta insomma!
+Qui c’è gente che soffre per davvero, lo capite? Chiamo il medico di turno e
+domani ve la vedrete con il professore! Guardi, le ho ritagliato quell'articolo
+sul Casentino. Ma lei se la blinda la supercazzola prematurata come se fosse
+anche un po' di Casentino che perdura anche come cappotto; vede, m'importa.}
+
+\@@_newpara:n {No, no... non era troppo alto. Forse non ha capito. Io dicevo
+che se fosse il coso di telefono, o il dito, come se fosse. Andando su o giù,
+giù o su. Come se fosse antani anche per lei soltanto in due, oppure in
+quattro anche scribai con cofandina; come antifurto, per esempio. Ma allora io
+le potrei dire anche con il rispetto per l'autorità, che anche soltanto le due
+cose come vice-sindaco, capisce? Sorella? Eh!? Col tarapia tapioco come se
+fosse la supercazzola per lei. Voglio il cappellano, il cappellano! Ho visto la
+Madonna!}
+
+\@@_newpara:n {Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no,
+no, attenzione, noo! Pattene soppaltate secondo l'articolo 12 abbia pazienza,
+sennò, posterdati, per due, anche un pochino antani in prefettura... senza
+contare che la supercazzola prematurata ha perso i contatti col tarapio
+tapioco. Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no, no,
+attenzione, noo! Segua col dito. Vede, se va giù non va su. Se va su non va
+giù. Si faccia aiutare dalla suora. È quello che stavo dicendo, no!?}
+
+\@@_newpara:n {Ho capito. Tre applicazioni di afasol, di un’ora l’una.
+Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra
+e a destra come se fossero dei pentoloni. Segua col dito. Vede, se va giù non
+va su. Se va su non va giù. Si faccia aiutare dalla suora. È quello che stavo
+dicendo, no!? Ho capito. Tre applicazioni di afasol, di un’ora l’una.
+Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra
+e a destra come se fossero dei pentoloni. Ho capito. Tre applicazioni di
+afasol, di un’ora l’una. Subito! Che c’è? Ehm... blinda la supercazzola
+con scappellamento a sinistra e a destra come se fossero dei pentoloni.}
+
+\@@_newpara:n {Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce? Ah,
+pardon. Tarapio tapioco come se fosse Antani, la supercazzola prematurata con
+dominus reveriscum blinda. Come, prego? Tarapio sulla supercazzola con
+scappellamento destro o sinistra? Sorella? Eh!? Col tarapia tapioco come se
+fosse la supercazzola per lei. Voglio il cappellano, il cappellano! Ho visto la
+Madonna! Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no?}
+
+\@@_newpara:n {Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto? Ah,
+pardon. Tarapio tapioco come se fosse Antani, la supercazzola prematurata con
+dominus reveriscum blinda. Come, prego? Tarapio sulla supercazzola con
+scappellamento destro o sinistra? Mi scusi, Antani come se fosse di
+scappellamento tarapio tapioco scappellamento di forestieri? Va be', siete
+forestieri, ma i cartelli sono internazionali. Mi può mostrare la sua patente,
+per favore? Si, ma la sbiriguda della sbrindellona come se fosse antani come
+faceva? Prego? Ho provato con la supercazzola con scappelamento paraplegico a
+sinistra, ma non funzionava.}
+
+\@@_newpara:n {Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? Ho
+provato con la supercazzola con scappellamento paraplegico a sinistra, ma non
+funzionava, faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come
+farà di capo d'altitudine, no? Come se fosse antani anche per lei soltanto in
+due, oppure in quattro anche scribai con cofandina; come antifurto, per
+esempio. Ma allora io le potrei dire anche con il rispetto per l'autorità, che
+anche soltanto le due cose come vice-sindaco, capisce?}
+
+\@@_newpara:n {Ho capito. Tre applicazioni di afasol, di un’ora l’una.
+Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra
+e a destra come se fossero dei pentoloni. Vicesindaco? Basta 'osì, mi seguano
+al commissariato! No, no, no, attenzione, noo! Ah, pardon. Tarapio tapioco come
+se fosse Antani, la supercazzola prematurata con dominus reveriscum blinda.
+Come, prego? Tarapio sulla supercazzola con scappellamento destro o sinistra?
+Ah, pardon. Tarapio tapioco come se fosse Antani, la supercazzola prematurata
+con dominus reveriscum blinda. Come, prego? Tarapio sulla supercazzola con
+scappellamento destro o sinistra?}
+
+\@@_newpara:n {Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Quante volte figliolo? Fifty fifty, prematinea
+come fosse mea culpa. Alla supercazzola. Carmensita, amore mio, sono un uomo
+d'affari, blinda la supercazzola prematurata, una cosa d'assegni, tarapia
+tapioca, tapioca torapia, dollari, sterline, allaccia scarpa, scarpallaccia,
+dico d'albergo, ma tu? Si, ma la sbiriguda della sbrindellona come se fosse
+antani come faceva? Prego? Ho provato con la supercazzola con scappelamento
+paraplegico a sinistra, ma non funzionava. Faceva Du-Du! In che senso? Nel
+senso anafestico! Si, forse per andicappo di altitudine. No? Ah, vuol dire che
+il telefono è troppo alto?}
+
+\@@_newpara:n {Mo basta insomma! Qui c’è gente che soffre per davvero, lo
+capite? Chiamo il medico di turno e domani ve la vedrete con il professore! Ho
+provato con la supercazzola con scappellamento paraplegico a sinistra, ma non
+funzionava, faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come
+farà di capo d'altitudine, no? Ma che antifurto, mi faccia il piacere! Questi
+signori qui stavano sonando loro. Si, ma la sbiriguda della sbrindellona come
+se fosse antani come faceva? Prego? Ho provato con la supercazzola con
+scappelamento paraplegico a sinistra, ma non funzionava.}
+
+\@@_newpara:n {Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Faceva Du-Du! In che senso? Nel senso anafestico!
+Si, forse per andicappo di altitudine. No? Ah, vuol dire che il telefono è
+troppo alto? Ma che antifurto, mi faccia il piacere! Questi signori qui stavano
+sonando loro. Ah, pardon. Tarapio tapioco come se fosse Antani, la supercazzola
+prematurata con dominus reveriscum blinda. Come, prego? Tarapio sulla
+supercazzola con scappellamento destro o sinistra?}
+
+\@@_newpara:n {Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se
+la blinda la supercazzola prematurata come se fosse anche un po' di Casentino
+che perdura anche come cappotto; vede, m'importa. Guardi, le ho ritagliato
+quell'articolo sul Casentino. Ma lei se la blinda la supercazzola prematurata
+come se fosse anche un po' di Casentino che perdura anche come cappotto; vede,
+m'importa. Sorella? Eh!? Col tarapia tapioco come se fosse la supercazzola per
+lei. Voglio il cappellano, il cappellano! Ho visto la Madonna! Segua col dito.
+Vede, se va giù non va su. Se va su non va giù. Si faccia aiutare dalla
+suora. È quello che stavo dicendo, no!?}
+
+\@@_newpara:n {Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. Segua col dito. Vede, se va giù non va su. Se
+va su non va giù. Si faccia aiutare dalla suora. È quello che stavo dicendo,
+no!? Che non si ripeta più, vada pure! Senz'altro!!! Tarapia tapioco!
+Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No, io, scusi
+noi siamo in quattro. Ho provato con la supercazzola con scappellamento
+paraplegico a sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel
+senso anafestico. Eh, sì; come farà di capo d'altitudine, no?}
+
+\@@_newpara:n {Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Carmensita, amore mio, sono un uomo d'affari,
+blinda la supercazzola prematurata, una cosa d'assegni, tarapia tapioca,
+tapioca torapia, dollari, sterline, allaccia scarpa, scarpallaccia, dico
+d'albergo, ma tu? Si, ma la sbiriguda della sbrindellona come se fosse antani
+come faceva? Prego? Ho provato con la supercazzola con scappelamento
+paraplegico a sinistra, ma non funzionava. Segua col dito. Vede, se va giù non
+va su. Se va su non va giù. Si faccia aiutare dalla suora. È quello che stavo
+dicendo, no!?}
+
+\@@_newpara:n {Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto? Come
+figliolo? Confesso come fosse antani con scappellamento a destra costantinato
+ammaliti. Quante volte figliolo? Fifty fifty, prematinea come fosse mea culpa.
+Alla supercazzola. Come se fosse antani anche per lei soltanto in due, oppure
+in quattro anche scribai con cofandina; come antifurto, per esempio. Come se
+fosse antani anche per lei soltanto in due, oppure in quattro anche scribai con
+cofandina; come antifurto, per esempio.}
+
+\@@_newpara:n {Sorella? Eh!? Col tarapia tapioco come se fosse la supercazzola
+per lei. Voglio il cappellano, il cappellano! Ho visto la Madonna! Come se
+fosse antani anche per lei soltanto in due, oppure in quattro anche scribai con
+cofandina; come antifurto, per esempio. Dimmi figliolo. Sbiliguda veniale con
+la supercazzola prematurata. Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti. Ah, pardon. Tarapio tapioco come
+se fosse Antani, la supercazzola prematurata con dominus reveriscum blinda.
+Come, prego? Tarapio sulla supercazzola con scappellamento destro o sinistra?}
+
+\@@_newpara:n {Ah, pardon. Tarapio tapioco come se fosse Antani, la
+supercazzola prematurata con dominus reveriscum blinda. Come, prego? Tarapio
+sulla supercazzola con scappellamento destro o sinistra? Vicesindaco? Basta
+'osì, mi seguano al commissariato! No, no, no, attenzione, noo! Faceva Du-Du!
+In che senso? Nel senso anafestico! Si, forse per andicappo di altitudine. No?
+Ah, vuol dire che il telefono è troppo alto? Che non si ripeta più, vada
+pure! Senz'altro!!! Tarapia tapioco! Brematurata la supercazzola o scherziamo?
+Prego? No, mi permetta. No, io, scusi noi siamo in quattro.}
+
+\@@_newpara:n {E lei... cosa si sente? Professore, non le dico. Antani come
+trazione per due anche se fosse supercazzola bitumata, ha lo scappellamento a
+destra. Ho capito. Tre applicazioni di afasol, di un’ora l’una. Subito! Che
+c’è? Ehm... blinda la supercazzola con scappellamento a sinistra e a destra
+come se fossero dei pentoloni. Ma che antifurto, mi faccia il piacere! Questi
+signori qui stavano sonando loro. Mo basta insomma! Qui c’è gente che soffre
+per davvero, lo capite? Chiamo il medico di turno e domani ve la vedrete con il
+professore!}
+
+\@@_newpara:n {No, no... non era troppo alto. Forse non ha capito. Io dicevo
+che se fosse il coso di telefono, o il dito, come se fosse. Andando su o giù,
+giù o su. Come se fosse antani anche per lei soltanto in due, oppure in
+quattro anche scribai con cofandina; come antifurto, per esempio. Ho provato
+con la supercazzola con scappellamento paraplegico a sinistra, ma non
+funzionava, faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come
+farà di capo d'altitudine, no? Carmensita, amore mio, sono un uomo d'affari,
+blinda la supercazzola prematurata, una cosa d'assegni, tarapia tapioca,
+tapioca torapia, dollari, sterline, allaccia scarpa, scarpallaccia, dico
+d'albergo, ma tu?}
+
+\@@_newpara:n {Come se fosse antani anche per lei soltanto in due, oppure in
+quattro anche scribai con cofandina; come antifurto, per esempio. Non si
+intrometta! No, aspetti, mi porga l'indice; ecco lo alzi così... guardi,
+guardi, guardi; lo vede il dito? Lo vede che stuzzica, che prematura anche.
+Come se fosse antani anche per lei soltanto in due, oppure in quattro anche
+scribai con cofandina; come antifurto, per esempio. Pattene soppaltate secondo
+l'articolo 12 abbia pazienza, sennò, posterdati, per due, anche un pochino
+antani in prefettura... senza contare che la supercazzola prematurata ha perso
+i contatti col tarapio tapioco.}
+
+\@@_newpara:n {Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Faceva Du-Du! In che senso? Nel senso anafestico!
+Si, forse per andicappo di altitudine. No? Ah, vuol dire che il telefono è
+troppo alto? Mi scusi, Antani come se fosse di scappellamento tarapio tapioco
+scappellamento di forestieri? Va be', siete forestieri, ma i cartelli sono
+internazionali. Mi può mostrare la sua patente, per favore? Come figliolo?
+Confesso come fosse antani con scappellamento a destra costantinato ammaliti.
+Quante volte figliolo? Fifty fifty, prematinea come fosse mea culpa. Alla
+supercazzola.}
+
+\@@_newpara:n {Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò,
+posterdati, per due, anche un pochino antani in prefettura... senza contare che
+la supercazzola prematurata ha perso i contatti col tarapio tapioco.
+Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no, no, attenzione,
+noo! Come se fosse antani anche per lei soltanto in due, oppure in quattro
+anche scribai con cofandina; come antifurto, per esempio. Non si intrometta!
+No, aspetti, mi porga l'indice; ecco lo alzi così... guardi, guardi, guardi;
+lo vede il dito? Lo vede che stuzzica, che prematura anche.}
+
+\@@_newpara:n {Come se fosse antani anche per lei soltanto in due, oppure in
+quattro anche scribai con cofandina; come antifurto, per esempio. Segua col
+dito. Vede, se va giù non va su. Se va su non va giù. Si faccia aiutare dalla
+suora. È quello che stavo dicendo, no!? Non si intrometta! No, aspetti, mi
+porga l'indice; ecco lo alzi così... guardi, guardi, guardi; lo vede il dito?
+Lo vede che stuzzica, che prematura anche. Faceva Du-Du! In che senso? Nel
+senso anafestico! Si, forse per andicappo di altitudine. No? Ah, vuol dire che
+il telefono è troppo alto?}
+
+\@@_newpara:n {Ma che antifurto, mi faccia il piacere! Questi signori qui
+stavano sonando loro. Guardi, le ho ritagliato quell'articolo sul Casentino. Ma
+lei se la blinda la supercazzola prematurata come se fosse anche un po' di
+Casentino che perdura anche come cappotto; vede, m'importa. Sorella? Eh!? Col
+tarapia tapioco come se fosse la supercazzola per lei. Voglio il cappellano, il
+cappellano! Ho visto la Madonna! Mi scusi, Antani come se fosse di
+scappellamento tarapio tapioco scappellamento di forestieri? Va be', siete
+forestieri, ma i cartelli sono internazionali. Mi può mostrare la sua patente,
+per favore?}
+
+\@@_newpara:n {Come se fosse antani anche per lei soltanto in due, oppure in
+quattro anche scribai con cofandina; come antifurto, per esempio. Non si
+intrometta! No, aspetti, mi porga l'indice; ecco lo alzi così... guardi,
+guardi, guardi; lo vede il dito? Lo vede che stuzzica, che prematura anche. Che
+non si ripeta più, vada pure! Senz'altro!!! Tarapia tapioco! Brematurata la
+supercazzola o scherziamo? Prego? No, mi permetta. No, io, scusi noi siamo in
+quattro. Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no, no,
+attenzione, noo!}
+
+\@@_newpara:n {Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no,
+no, attenzione, noo! Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce? Mo
+basta insomma! Qui c’è gente che soffre per davvero, lo capite? Chiamo il
+medico di turno e domani ve la vedrete con il professore! Ho capito. Tre
+applicazioni di afasol, di un’ora l’una. Subito! Che c’è? Ehm... blinda
+la supercazzola con scappellamento a sinistra e a destra come se fossero dei
+pentoloni.}
+
+\@@_newpara:n {Mi scusi, Antani come se fosse di scappellamento tarapio tapioco
+scappellamento di forestieri? Va be', siete forestieri, ma i cartelli sono
+internazionali. Mi può mostrare la sua patente, per favore? Come figliolo?
+Confesso come fosse antani con scappellamento a destra costantinato ammaliti.
+Quante volte figliolo? Fifty fifty, prematinea come fosse mea culpa. Alla
+supercazzola. Ma che antifurto, mi faccia il piacere! Questi signori qui
+stavano sonando loro. Pattene soppaltate secondo l'articolo 12 abbia pazienza,
+sennò, posterdati, per due, anche un pochino antani in prefettura... senza
+contare che la supercazzola prematurata ha perso i contatti col tarapio
+tapioco.}
+
+\@@_newpara:n {Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Quante volte figliolo? Fifty fifty, prematinea
+come fosse mea culpa. Alla supercazzola. Ma allora io le potrei dire anche con
+il rispetto per l'autorità, che anche soltanto le due cose come vice-sindaco,
+capisce? Che non si ripeta più, vada pure! Senz'altro!!! Tarapia tapioco!
+Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No, io, scusi
+noi siamo in quattro. No, no... non era troppo alto. Forse non ha capito. Io
+dicevo che se fosse il coso di telefono, o il dito, come se fosse. Andando su o
+giù, giù o su.}
+
+\@@_newpara:n {No, no... non era troppo alto. Forse non ha capito. Io dicevo
+che se fosse il coso di telefono, o il dito, come se fosse. Andando su o giù,
+giù o su. Come se fosse antani anche per lei soltanto in due, oppure in
+quattro anche scribai con cofandina; come antifurto, per esempio. Sorella? Eh!?
+Col tarapia tapioco come se fosse la supercazzola per lei. Voglio il
+cappellano, il cappellano! Ho visto la Madonna! Faceva Du-Du! In che senso? Nel
+senso anafestico! Si, forse per andicappo di altitudine. No? Ah, vuol dire che
+il telefono è troppo alto?}
+
+\@@_newpara:n {Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? Si,
+ma la sbiriguda della sbrindellona come se fosse antani come faceva? Prego? Ho
+provato con la supercazzola con scappelamento paraplegico a sinistra, ma non
+funzionava. Ho capito. Tre applicazioni di afasol, di un’ora l’una. Subito!
+Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra e a
+destra come se fossero dei pentoloni. Mo basta insomma! Qui c’è gente che
+soffre per davvero, lo capite? Chiamo il medico di turno e domani ve la vedrete
+con il professore!}
+
+\@@_newpara:n {Segua col dito. Vede, se va giù non va su. Se va su non va
+giù. Si faccia aiutare dalla suora. È quello che stavo dicendo, no!? Non si
+intrometta! No, aspetti, mi porga l'indice; ecco lo alzi così... guardi,
+guardi, guardi; lo vede il dito? Lo vede che stuzzica, che prematura anche. Ma
+che antifurto, mi faccia il piacere! Questi signori qui stavano sonando loro.
+Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò, posterdati,
+per due, anche un pochino antani in prefettura... senza contare che la
+supercazzola prematurata ha perso i contatti col tarapio tapioco.}
+
+\@@_newpara:n {Come se fosse antani anche per lei soltanto in due, oppure in
+quattro anche scribai con cofandina; come antifurto, per esempio. Pattene
+soppaltate secondo l'articolo 12 abbia pazienza, sennò, posterdati, per due,
+anche un pochino antani in prefettura... senza contare che la supercazzola
+prematurata ha perso i contatti col tarapio tapioco. Mo basta insomma! Qui
+c’è gente che soffre per davvero, lo capite? Chiamo il medico di turno e
+domani ve la vedrete con il professore! Ho capito. Tre applicazioni di afasol,
+di un’ora l’una. Subito! Che c’è? Ehm... blinda la supercazzola con
+scappellamento a sinistra e a destra come se fossero dei pentoloni.}
+
+\@@_newpara:n {Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. Guardi, le ho ritagliato quell'articolo sul
+Casentino. Ma lei se la blinda la supercazzola prematurata come se fosse anche
+un po' di Casentino che perdura anche come cappotto; vede, m'importa. Guardi,
+le ho ritagliato quell'articolo sul Casentino. Ma lei se la blinda la
+supercazzola prematurata come se fosse anche un po' di Casentino che perdura
+anche come cappotto; vede, m'importa. Si, ma la sbiriguda della sbrindellona
+come se fosse antani come faceva? Prego? Ho provato con la supercazzola con
+scappelamento paraplegico a sinistra, ma non funzionava.}
+
+\@@_newpara:n {Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. Ah, pardon. Tarapio tapioco come se fosse
+Antani, la supercazzola prematurata con dominus reveriscum blinda. Come, prego?
+Tarapio sulla supercazzola con scappellamento destro o sinistra? Dimmi
+figliolo. Sbiliguda veniale con la supercazzola prematurata. Come figliolo?
+Confesso come fosse antani con scappellamento a destra costantinato ammaliti.
+Mi scusi, Antani come se fosse di scappellamento tarapio tapioco scappellamento
+di forestieri? Va be', siete forestieri, ma i cartelli sono internazionali. Mi
+può mostrare la sua patente, per favore?}
+
+\@@_newpara:n {Non si intrometta! No, aspetti, mi porga l'indice; ecco lo alzi
+così... guardi, guardi, guardi; lo vede il dito? Lo vede che stuzzica, che
+prematura anche. Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? Ho
+capito. Tre applicazioni di afasol, di un’ora l’una. Subito! Che c’è?
+Ehm... blinda la supercazzola con scappellamento a sinistra e a destra come se
+fossero dei pentoloni. Come se fosse antani anche per lei soltanto in due,
+oppure in quattro anche scribai con cofandina; come antifurto, per esempio.}
+
+\@@_newpara:n {Mo basta insomma! Qui c’è gente che soffre per davvero, lo
+capite? Chiamo il medico di turno e domani ve la vedrete con il professore! No,
+no... non era troppo alto. Forse non ha capito. Io dicevo che se fosse il coso
+di telefono, o il dito, come se fosse. Andando su o giù, giù o su. Segua col
+dito. Vede, se va giù non va su. Se va su non va giù. Si faccia aiutare dalla
+suora. È quello che stavo dicendo, no!? Ma che antifurto, mi faccia il
+piacere! Questi signori qui stavano sonando loro.}
+
+\@@_newpara:n {Segua col dito. Vede, se va giù non va su. Se va su non va
+giù. Si faccia aiutare dalla suora. È quello che stavo dicendo, no!? Ma che
+antifurto, mi faccia il piacere! Questi signori qui stavano sonando loro. Segua
+col dito. Vede, se va giù non va su. Se va su non va giù. Si faccia aiutare
+dalla suora. È quello che stavo dicendo, no!? Pattene soppaltate secondo
+l'articolo 12 abbia pazienza, sennò, posterdati, per due, anche un pochino
+antani in prefettura... senza contare che la supercazzola prematurata ha perso
+i contatti col tarapio tapioco.}
+
+\@@_newpara:n {Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce? Dimmi
+figliolo. Sbiliguda veniale con la supercazzola prematurata. Come figliolo?
+Confesso come fosse antani con scappellamento a destra costantinato ammaliti.
+Che non si ripeta più, vada pure! Senz'altro!!! Tarapia tapioco! Brematurata
+la supercazzola o scherziamo? Prego? No, mi permetta. No, io, scusi noi siamo
+in quattro. Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto?}
+
+\@@_newpara:n {Ho capito. Tre applicazioni di afasol, di un’ora l’una.
+Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra
+e a destra come se fossero dei pentoloni. Dimmi figliolo. Sbiliguda veniale con
+la supercazzola prematurata. Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti. Guardi, le ho ritagliato
+quell'articolo sul Casentino. Ma lei se la blinda la supercazzola prematurata
+come se fosse anche un po' di Casentino che perdura anche come cappotto; vede,
+m'importa. Che non si ripeta più, vada pure! Senz'altro!!! Tarapia tapioco!
+Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No, io, scusi
+noi siamo in quattro.}
+
+\@@_newpara:n {Si, ma la sbiriguda della sbrindellona come se fosse antani come
+faceva? Prego? Ho provato con la supercazzola con scappelamento paraplegico a
+sinistra, ma non funzionava. Sorella? Eh!? Col tarapia tapioco come se fosse la
+supercazzola per lei. Voglio il cappellano, il cappellano! Ho visto la Madonna!
+E lei... cosa si sente? Professore, non le dico. Antani come trazione per due
+anche se fosse supercazzola bitumata, ha lo scappellamento a destra. Pattene
+soppaltate secondo l'articolo 12 abbia pazienza, sennò, posterdati, per due,
+anche un pochino antani in prefettura... senza contare che la supercazzola
+prematurata ha perso i contatti col tarapio tapioco.}
+
+\@@_newpara:n {E lei... cosa si sente? Professore, non le dico. Antani come
+trazione per due anche se fosse supercazzola bitumata, ha lo scappellamento a
+destra. Come se fosse antani anche per lei soltanto in due, oppure in quattro
+anche scribai con cofandina; come antifurto, per esempio. Si, ma la sbiriguda
+della sbrindellona come se fosse antani come faceva? Prego? Ho provato con la
+supercazzola con scappelamento paraplegico a sinistra, ma non funzionava. Ho
+capito. Tre applicazioni di afasol, di un’ora l’una. Subito! Che c’è?
+Ehm... blinda la supercazzola con scappellamento a sinistra e a destra come se
+fossero dei pentoloni.}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? Come se fosse antani anche per
+lei soltanto in due, oppure in quattro anche scribai con cofandina; come
+antifurto, per esempio. E lei... cosa si sente? Professore, non le dico. Antani
+come trazione per due anche se fosse supercazzola bitumata, ha lo
+scappellamento a destra. Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti.}
+
+\@@_newpara:n {Segua col dito. Vede, se va giù non va su. Se va su non va
+giù. Si faccia aiutare dalla suora. È quello che stavo dicendo, no!? Mo basta
+insomma! Qui c’è gente che soffre per davvero, lo capite? Chiamo il medico
+di turno e domani ve la vedrete con il professore! Come se fosse antani anche
+per lei soltanto in due, oppure in quattro anche scribai con cofandina; come
+antifurto, per esempio. Che non si ripeta più, vada pure! Senz'altro!!!
+Tarapia tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi
+permetta. No, io, scusi noi siamo in quattro.}
+
+\@@_newpara:n {Non si intrometta! No, aspetti, mi porga l'indice; ecco lo alzi
+così... guardi, guardi, guardi; lo vede il dito? Lo vede che stuzzica, che
+prematura anche. Non si intrometta! No, aspetti, mi porga l'indice; ecco lo
+alzi così... guardi, guardi, guardi; lo vede il dito? Lo vede che stuzzica,
+che prematura anche. Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu?
+Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per andicappo di
+altitudine. No? Ah, vuol dire che il telefono è troppo alto?}
+
+\@@_newpara:n {Si, ma la sbiriguda della sbrindellona come se fosse antani come
+faceva? Prego? Ho provato con la supercazzola con scappelamento paraplegico a
+sinistra, ma non funzionava. Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti. Quante volte figliolo? Fifty
+fifty, prematinea come fosse mea culpa. Alla supercazzola. Come figliolo?
+Confesso come fosse antani con scappellamento a destra costantinato ammaliti.
+Quante volte figliolo? Fifty fifty, prematinea come fosse mea culpa. Alla
+supercazzola. Come se fosse antani anche per lei soltanto in due, oppure in
+quattro anche scribai con cofandina; come antifurto, per esempio.}
+
+\@@_newpara:n {Ah, pardon. Tarapio tapioco come se fosse Antani, la
+supercazzola prematurata con dominus reveriscum blinda. Come, prego? Tarapio
+sulla supercazzola con scappellamento destro o sinistra? Ho capito. Tre
+applicazioni di afasol, di un’ora l’una. Subito! Che c’è? Ehm... blinda
+la supercazzola con scappellamento a sinistra e a destra come se fossero dei
+pentoloni. Non si intrometta! No, aspetti, mi porga l'indice; ecco lo alzi
+così... guardi, guardi, guardi; lo vede il dito? Lo vede che stuzzica, che
+prematura anche. Segua col dito. Vede, se va giù non va su. Se va su non va
+giù. Si faccia aiutare dalla suora. È quello che stavo dicendo, no!?}
+
+\@@_newpara:n {Non si intrometta! No, aspetti, mi porga l'indice; ecco lo alzi
+così... guardi, guardi, guardi; lo vede il dito? Lo vede che stuzzica, che
+prematura anche. Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. Come se fosse antani anche per lei soltanto in
+due, oppure in quattro anche scribai con cofandina; come antifurto, per
+esempio. E lei... cosa si sente? Professore, non le dico. Antani come trazione
+per due anche se fosse supercazzola bitumata, ha lo scappellamento a destra.}
+
+\@@_newpara:n {Come se fosse antani anche per lei soltanto in due, oppure in
+quattro anche scribai con cofandina; come antifurto, per esempio. Pattene
+soppaltate secondo l'articolo 12 abbia pazienza, sennò, posterdati, per due,
+anche un pochino antani in prefettura... senza contare che la supercazzola
+prematurata ha perso i contatti col tarapio tapioco. E lei... cosa si sente?
+Professore, non le dico. Antani come trazione per due anche se fosse
+supercazzola bitumata, ha lo scappellamento a destra. Ho capito. Tre
+applicazioni di afasol, di un’ora l’una. Subito! Che c’è? Ehm... blinda
+la supercazzola con scappellamento a sinistra e a destra come se fossero dei
+pentoloni.}
+
+\@@_newpara:n {Si, ma la sbiriguda della sbrindellona come se fosse antani come
+faceva? Prego? Ho provato con la supercazzola con scappelamento paraplegico a
+sinistra, ma non funzionava. Che non si ripeta più, vada pure! Senz'altro!!!
+Tarapia tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi
+permetta. No, io, scusi noi siamo in quattro. Segua col dito. Vede, se va giù
+non va su. Se va su non va giù. Si faccia aiutare dalla suora. È quello che
+stavo dicendo, no!? Come se fosse antani anche per lei soltanto in due, oppure
+in quattro anche scribai con cofandina; come antifurto, per esempio.}
+
+\@@_newpara:n {Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto?
+Sorella? Eh!? Col tarapia tapioco come se fosse la supercazzola per lei. Voglio
+il cappellano, il cappellano! Ho visto la Madonna! Mi scusi, Antani come se
+fosse di scappellamento tarapio tapioco scappellamento di forestieri? Va be',
+siete forestieri, ma i cartelli sono internazionali. Mi può mostrare la sua
+patente, per favore? Come se fosse antani anche per lei soltanto in due, oppure
+in quattro anche scribai con cofandina; come antifurto, per esempio.}
+
+\@@_newpara:n {No, no... non era troppo alto. Forse non ha capito. Io dicevo
+che se fosse il coso di telefono, o il dito, come se fosse. Andando su o giù,
+giù o su. Segua col dito. Vede, se va giù non va su. Se va su non va giù. Si
+faccia aiutare dalla suora. È quello che stavo dicendo, no!? Come figliolo?
+Confesso come fosse antani con scappellamento a destra costantinato ammaliti.
+Quante volte figliolo? Fifty fifty, prematinea come fosse mea culpa. Alla
+supercazzola. E lei... cosa si sente? Professore, non le dico. Antani come
+trazione per due anche se fosse supercazzola bitumata, ha lo scappellamento a
+destra.}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? Vicesindaco? Basta 'osì, mi
+seguano al commissariato! No, no, no, attenzione, noo! Ho provato con la
+supercazzola con scappellamento paraplegico a sinistra, ma non funzionava,
+faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come farà di capo
+d'altitudine, no? Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce?}
+
+\@@_newpara:n {Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto? E
+lei... cosa si sente? Professore, non le dico. Antani come trazione per due
+anche se fosse supercazzola bitumata, ha lo scappellamento a destra. Faceva
+Du-Du! In che senso? Nel senso anafestico! Si, forse per andicappo di
+altitudine. No? Ah, vuol dire che il telefono è troppo alto? Ma che antifurto,
+mi faccia il piacere! Questi signori qui stavano sonando loro.}
+
+\@@_newpara:n {Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se
+la blinda la supercazzola prematurata come se fosse anche un po' di Casentino
+che perdura anche come cappotto; vede, m'importa. Come se fosse antani anche
+per lei soltanto in due, oppure in quattro anche scribai con cofandina; come
+antifurto, per esempio. Sorella? Eh!? Col tarapia tapioco come se fosse la
+supercazzola per lei. Voglio il cappellano, il cappellano! Ho visto la Madonna!
+Dimmi figliolo. Sbiliguda veniale con la supercazzola prematurata. Come
+figliolo? Confesso come fosse antani con scappellamento a destra costantinato
+ammaliti.}
+
+\@@_newpara:n {No, no... non era troppo alto. Forse non ha capito. Io dicevo
+che se fosse il coso di telefono, o il dito, come se fosse. Andando su o giù,
+giù o su. Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò,
+posterdati, per due, anche un pochino antani in prefettura... senza contare che
+la supercazzola prematurata ha perso i contatti col tarapio tapioco. Dimmi
+figliolo. Sbiliguda veniale con la supercazzola prematurata. Come figliolo?
+Confesso come fosse antani con scappellamento a destra costantinato ammaliti.
+Ah, pardon. Tarapio tapioco come se fosse Antani, la supercazzola prematurata
+con dominus reveriscum blinda. Come, prego? Tarapio sulla supercazzola con
+scappellamento destro o sinistra?}
+
+\@@_newpara:n {Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Quante volte figliolo? Fifty fifty, prematinea
+come fosse mea culpa. Alla supercazzola. Non si intrometta! No, aspetti, mi
+porga l'indice; ecco lo alzi così... guardi, guardi, guardi; lo vede il dito?
+Lo vede che stuzzica, che prematura anche. Pattene soppaltate secondo
+l'articolo 12 abbia pazienza, sennò, posterdati, per due, anche un pochino
+antani in prefettura... senza contare che la supercazzola prematurata ha perso
+i contatti col tarapio tapioco. Come se fosse antani anche per lei soltanto in
+due, oppure in quattro anche scribai con cofandina; come antifurto, per
+esempio.}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? E lei... cosa si sente?
+Professore, non le dico. Antani come trazione per due anche se fosse
+supercazzola bitumata, ha lo scappellamento a destra. Ma allora io le potrei
+dire anche con il rispetto per l'autorità, che anche soltanto le due cose come
+vice-sindaco, capisce? Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu?}
+
+\@@_newpara:n {Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se
+la blinda la supercazzola prematurata come se fosse anche un po' di Casentino
+che perdura anche come cappotto; vede, m'importa. Ho provato con la
+supercazzola con scappellamento paraplegico a sinistra, ma non funzionava,
+faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come farà di capo
+d'altitudine, no? Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse
+per andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto?
+Che non si ripeta più, vada pure! Senz'altro!!! Tarapia tapioco! Brematurata
+la supercazzola o scherziamo? Prego? No, mi permetta. No, io, scusi noi siamo
+in quattro.}
+
+\@@_newpara:n {E lei... cosa si sente? Professore, non le dico. Antani come
+trazione per due anche se fosse supercazzola bitumata, ha lo scappellamento a
+destra. Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò,
+posterdati, per due, anche un pochino antani in prefettura... senza contare che
+la supercazzola prematurata ha perso i contatti col tarapio tapioco. Mo basta
+insomma! Qui c’è gente che soffre per davvero, lo capite? Chiamo il medico
+di turno e domani ve la vedrete con il professore! Ho capito. Tre applicazioni
+di afasol, di un’ora l’una. Subito! Che c’è? Ehm... blinda la
+supercazzola con scappellamento a sinistra e a destra come se fossero dei
+pentoloni.}
+
+\@@_newpara:n {Ah, pardon. Tarapio tapioco come se fosse Antani, la
+supercazzola prematurata con dominus reveriscum blinda. Come, prego? Tarapio
+sulla supercazzola con scappellamento destro o sinistra? Mo basta insomma! Qui
+c’è gente che soffre per davvero, lo capite? Chiamo il medico di turno e
+domani ve la vedrete con il professore! Faceva Du-Du! In che senso? Nel senso
+anafestico! Si, forse per andicappo di altitudine. No? Ah, vuol dire che il
+telefono è troppo alto? Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti. Quante volte figliolo? Fifty
+fifty, prematinea come fosse mea culpa. Alla supercazzola.}
+
+\@@_newpara:n {No, no... non era troppo alto. Forse non ha capito. Io dicevo
+che se fosse il coso di telefono, o il dito, come se fosse. Andando su o giù,
+giù o su. Segua col dito. Vede, se va giù non va su. Se va su non va giù. Si
+faccia aiutare dalla suora. È quello che stavo dicendo, no!? Ho provato con la
+supercazzola con scappellamento paraplegico a sinistra, ma non funzionava,
+faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come farà di capo
+d'altitudine, no? Mo basta insomma! Qui c’è gente che soffre per davvero, lo
+capite? Chiamo il medico di turno e domani ve la vedrete con il professore!}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? Ma che antifurto, mi faccia il
+piacere! Questi signori qui stavano sonando loro. Come se fosse antani anche
+per lei soltanto in due, oppure in quattro anche scribai con cofandina; come
+antifurto, per esempio. Che non si ripeta più, vada pure! Senz'altro!!!
+Tarapia tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi
+permetta. No, io, scusi noi siamo in quattro.}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? Come se fosse antani anche per
+lei soltanto in due, oppure in quattro anche scribai con cofandina; come
+antifurto, per esempio. Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Si, ma la sbiriguda della sbrindellona come se
+fosse antani come faceva? Prego? Ho provato con la supercazzola con
+scappelamento paraplegico a sinistra, ma non funzionava.}
+
+\@@_newpara:n {Segua col dito. Vede, se va giù non va su. Se va su non va
+giù. Si faccia aiutare dalla suora. È quello che stavo dicendo, no!? Come
+figliolo? Confesso come fosse antani con scappellamento a destra costantinato
+ammaliti. Quante volte figliolo? Fifty fifty, prematinea come fosse mea culpa.
+Alla supercazzola. Ho capito. Tre applicazioni di afasol, di un’ora l’una.
+Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra
+e a destra come se fossero dei pentoloni. Come figliolo? Confesso come fosse
+antani con scappellamento a destra costantinato ammaliti. Quante volte
+figliolo? Fifty fifty, prematinea come fosse mea culpa. Alla supercazzola.}
+
+\@@_newpara:n {Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? E
+lei... cosa si sente? Professore, non le dico. Antani come trazione per due
+anche se fosse supercazzola bitumata, ha lo scappellamento a destra. Mo basta
+insomma! Qui c’è gente che soffre per davvero, lo capite? Chiamo il medico
+di turno e domani ve la vedrete con il professore! Pattene soppaltate secondo
+l'articolo 12 abbia pazienza, sennò, posterdati, per due, anche un pochino
+antani in prefettura... senza contare che la supercazzola prematurata ha perso
+i contatti col tarapio tapioco.}
+
+\@@_newpara:n {Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Ma allora io le potrei dire anche con il rispetto
+per l'autorità, che anche soltanto le due cose come vice-sindaco, capisce? Ho
+provato con la supercazzola con scappellamento paraplegico a sinistra, ma non
+funzionava, faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come
+farà di capo d'altitudine, no? Non si intrometta! No, aspetti, mi porga
+l'indice; ecco lo alzi così... guardi, guardi, guardi; lo vede il dito? Lo
+vede che stuzzica, che prematura anche.}
+
+\@@_newpara:n {Ah, pardon. Tarapio tapioco come se fosse Antani, la
+supercazzola prematurata con dominus reveriscum blinda. Come, prego? Tarapio
+sulla supercazzola con scappellamento destro o sinistra? Si, ma la sbiriguda
+della sbrindellona come se fosse antani come faceva? Prego? Ho provato con la
+supercazzola con scappelamento paraplegico a sinistra, ma non funzionava. Segua
+col dito. Vede, se va giù non va su. Se va su non va giù. Si faccia aiutare
+dalla suora. È quello che stavo dicendo, no!? Ma che antifurto, mi faccia il
+piacere! Questi signori qui stavano sonando loro.}
+
+\@@_newpara:n {Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce? E
+lei... cosa si sente? Professore, non le dico. Antani come trazione per due
+anche se fosse supercazzola bitumata, ha lo scappellamento a destra. No, no...
+non era troppo alto. Forse non ha capito. Io dicevo che se fosse il coso di
+telefono, o il dito, come se fosse. Andando su o giù, giù o su. Pattene
+soppaltate secondo l'articolo 12 abbia pazienza, sennò, posterdati, per due,
+anche un pochino antani in prefettura... senza contare che la supercazzola
+prematurata ha perso i contatti col tarapio tapioco.}
+
+\@@_newpara:n {Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Quante volte figliolo? Fifty fifty, prematinea
+come fosse mea culpa. Alla supercazzola. Pattene soppaltate secondo l'articolo
+12 abbia pazienza, sennò, posterdati, per due, anche un pochino antani in
+prefettura... senza contare che la supercazzola prematurata ha perso i contatti
+col tarapio tapioco. Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. Ho capito. Tre applicazioni di afasol, di
+un’ora l’una. Subito! Che c’è? Ehm... blinda la supercazzola con
+scappellamento a sinistra e a destra come se fossero dei pentoloni.}
+
+\@@_newpara:n {No, no... non era troppo alto. Forse non ha capito. Io dicevo
+che se fosse il coso di telefono, o il dito, come se fosse. Andando su o giù,
+giù o su. Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no, no,
+attenzione, noo! Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no,
+no, attenzione, noo! Ma che antifurto, mi faccia il piacere! Questi signori qui
+stavano sonando loro.}
+
+\@@_newpara:n {E lei... cosa si sente? Professore, non le dico. Antani come
+trazione per due anche se fosse supercazzola bitumata, ha lo scappellamento a
+destra. Si, ma la sbiriguda della sbrindellona come se fosse antani come
+faceva? Prego? Ho provato con la supercazzola con scappelamento paraplegico a
+sinistra, ma non funzionava. Mi scusi, Antani come se fosse di scappellamento
+tarapio tapioco scappellamento di forestieri? Va be', siete forestieri, ma i
+cartelli sono internazionali. Mi può mostrare la sua patente, per favore? Non
+si intrometta! No, aspetti, mi porga l'indice; ecco lo alzi così... guardi,
+guardi, guardi; lo vede il dito? Lo vede che stuzzica, che prematura anche.}
+
+\@@_newpara:n {Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? Ho
+capito. Tre applicazioni di afasol, di un’ora l’una. Subito! Che c’è?
+Ehm... blinda la supercazzola con scappellamento a sinistra e a destra come se
+fossero dei pentoloni. Mo basta insomma! Qui c’è gente che soffre per
+davvero, lo capite? Chiamo il medico di turno e domani ve la vedrete con il
+professore! Dimmi figliolo. Sbiliguda veniale con la supercazzola prematurata.
+Come figliolo? Confesso come fosse antani con scappellamento a destra
+costantinato ammaliti.}
+
+\@@_newpara:n {Ah, pardon. Tarapio tapioco come se fosse Antani, la
+supercazzola prematurata con dominus reveriscum blinda. Come, prego? Tarapio
+sulla supercazzola con scappellamento destro o sinistra? Non si intrometta! No,
+aspetti, mi porga l'indice; ecco lo alzi così... guardi, guardi, guardi; lo
+vede il dito? Lo vede che stuzzica, che prematura anche. Come figliolo?
+Confesso come fosse antani con scappellamento a destra costantinato ammaliti.
+Quante volte figliolo? Fifty fifty, prematinea come fosse mea culpa. Alla
+supercazzola. Come se fosse antani anche per lei soltanto in due, oppure in
+quattro anche scribai con cofandina; come antifurto, per esempio.}
+
+\@@_newpara:n {Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce? Mo
+basta insomma! Qui c’è gente che soffre per davvero, lo capite? Chiamo il
+medico di turno e domani ve la vedrete con il professore! Mi scusi, Antani come
+se fosse di scappellamento tarapio tapioco scappellamento di forestieri? Va
+be', siete forestieri, ma i cartelli sono internazionali. Mi può mostrare la
+sua patente, per favore? E lei... cosa si sente? Professore, non le dico.
+Antani come trazione per due anche se fosse supercazzola bitumata, ha lo
+scappellamento a destra.}
+
+\@@_newpara:n {Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se
+la blinda la supercazzola prematurata come se fosse anche un po' di Casentino
+che perdura anche come cappotto; vede, m'importa. Che non si ripeta più, vada
+pure! Senz'altro!!! Tarapia tapioco! Brematurata la supercazzola o scherziamo?
+Prego? No, mi permetta. No, io, scusi noi siamo in quattro. Ho provato con la
+supercazzola con scappellamento paraplegico a sinistra, ma non funzionava,
+faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come farà di capo
+d'altitudine, no? Non si intrometta! No, aspetti, mi porga l'indice; ecco lo
+alzi così... guardi, guardi, guardi; lo vede il dito? Lo vede che stuzzica,
+che prematura anche.}
+
+\@@_newpara:n {Ho capito. Tre applicazioni di afasol, di un’ora l’una.
+Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra
+e a destra come se fossero dei pentoloni. Come figliolo? Confesso come fosse
+antani con scappellamento a destra costantinato ammaliti. Quante volte
+figliolo? Fifty fifty, prematinea come fosse mea culpa. Alla supercazzola. Mi
+scusi, Antani come se fosse di scappellamento tarapio tapioco scappellamento di
+forestieri? Va be', siete forestieri, ma i cartelli sono internazionali. Mi
+può mostrare la sua patente, per favore? Segua col dito. Vede, se va giù non
+va su. Se va su non va giù. Si faccia aiutare dalla suora. È quello che stavo
+dicendo, no!?}
+
+\@@_newpara:n {Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no,
+no, attenzione, noo! Mo basta insomma! Qui c’è gente che soffre per davvero,
+lo capite? Chiamo il medico di turno e domani ve la vedrete con il professore!
+Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò, posterdati,
+per due, anche un pochino antani in prefettura... senza contare che la
+supercazzola prematurata ha perso i contatti col tarapio tapioco. Guardi, le ho
+ritagliato quell'articolo sul Casentino. Ma lei se la blinda la supercazzola
+prematurata come se fosse anche un po' di Casentino che perdura anche come
+cappotto; vede, m'importa.}
+
+\@@_newpara:n {Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce? Mo
+basta insomma! Qui c’è gente che soffre per davvero, lo capite? Chiamo il
+medico di turno e domani ve la vedrete con il professore! Guardi, le ho
+ritagliato quell'articolo sul Casentino. Ma lei se la blinda la supercazzola
+prematurata come se fosse anche un po' di Casentino che perdura anche come
+cappotto; vede, m'importa. Che non si ripeta più, vada pure! Senz'altro!!!
+Tarapia tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi
+permetta. No, io, scusi noi siamo in quattro.}
+
+\@@_newpara:n {Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Pattene soppaltate secondo l'articolo 12 abbia
+pazienza, sennò, posterdati, per due, anche un pochino antani in prefettura...
+senza contare che la supercazzola prematurata ha perso i contatti col tarapio
+tapioco. E lei... cosa si sente? Professore, non le dico. Antani come trazione
+per due anche se fosse supercazzola bitumata, ha lo scappellamento a destra.
+Dimmi figliolo. Sbiliguda veniale con la supercazzola prematurata. Come
+figliolo? Confesso come fosse antani con scappellamento a destra costantinato
+ammaliti.}
+
+\@@_newpara:n {Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò,
+posterdati, per due, anche un pochino antani in prefettura... senza contare che
+la supercazzola prematurata ha perso i contatti col tarapio tapioco. Ah,
+pardon. Tarapio tapioco come se fosse Antani, la supercazzola prematurata con
+dominus reveriscum blinda. Come, prego? Tarapio sulla supercazzola con
+scappellamento destro o sinistra? Non si intrometta! No, aspetti, mi porga
+l'indice; ecco lo alzi così... guardi, guardi, guardi; lo vede il dito? Lo
+vede che stuzzica, che prematura anche. Carmensita, amore mio, sono un uomo
+d'affari, blinda la supercazzola prematurata, una cosa d'assegni, tarapia
+tapioca, tapioca torapia, dollari, sterline, allaccia scarpa, scarpallaccia,
+dico d'albergo, ma tu?}
+
+\@@_newpara:n {Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no,
+no, attenzione, noo! No, no... non era troppo alto. Forse non ha capito. Io
+dicevo che se fosse il coso di telefono, o il dito, come se fosse. Andando su o
+giù, giù o su. No, no... non era troppo alto. Forse non ha capito. Io dicevo
+che se fosse il coso di telefono, o il dito, come se fosse. Andando su o giù,
+giù o su. Che non si ripeta più, vada pure! Senz'altro!!! Tarapia tapioco!
+Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No, io, scusi
+noi siamo in quattro.}
+
+\@@_newpara:n {Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? Ho
+provato con la supercazzola con scappellamento paraplegico a sinistra, ma non
+funzionava, faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come
+farà di capo d'altitudine, no? Pattene soppaltate secondo l'articolo 12 abbia
+pazienza, sennò, posterdati, per due, anche un pochino antani in prefettura...
+senza contare che la supercazzola prematurata ha perso i contatti col tarapio
+tapioco. Mi scusi, Antani come se fosse di scappellamento tarapio tapioco
+scappellamento di forestieri? Va be', siete forestieri, ma i cartelli sono
+internazionali. Mi può mostrare la sua patente, per favore?}
+
+\@@_newpara:n {Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. Ho provato con la supercazzola con
+scappellamento paraplegico a sinistra, ma non funzionava, faceva tu-tu. In che
+senso? Nel senso anafestico. Eh, sì; come farà di capo d'altitudine, no?
+Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se la blinda la
+supercazzola prematurata come se fosse anche un po' di Casentino che perdura
+anche come cappotto; vede, m'importa. Come figliolo? Confesso come fosse antani
+con scappellamento a destra costantinato ammaliti. Quante volte figliolo? Fifty
+fifty, prematinea come fosse mea culpa. Alla supercazzola.}
+
+\@@_newpara:n {Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce? Mi
+scusi, Antani come se fosse di scappellamento tarapio tapioco scappellamento di
+forestieri? Va be', siete forestieri, ma i cartelli sono internazionali. Mi
+può mostrare la sua patente, per favore? Faceva Du-Du! In che senso? Nel senso
+anafestico! Si, forse per andicappo di altitudine. No? Ah, vuol dire che il
+telefono è troppo alto? Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti. Quante volte figliolo? Fifty
+fifty, prematinea come fosse mea culpa. Alla supercazzola.}
+
+\@@_newpara:n {Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto? Mi
+scusi, Antani come se fosse di scappellamento tarapio tapioco scappellamento di
+forestieri? Va be', siete forestieri, ma i cartelli sono internazionali. Mi
+può mostrare la sua patente, per favore? Ah, pardon. Tarapio tapioco come se
+fosse Antani, la supercazzola prematurata con dominus reveriscum blinda. Come,
+prego? Tarapio sulla supercazzola con scappellamento destro o sinistra? Guardi,
+le ho ritagliato quell'articolo sul Casentino. Ma lei se la blinda la
+supercazzola prematurata come se fosse anche un po' di Casentino che perdura
+anche come cappotto; vede, m'importa.}
+
+\@@_newpara:n {Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò,
+posterdati, per due, anche un pochino antani in prefettura... senza contare che
+la supercazzola prematurata ha perso i contatti col tarapio tapioco. Mo basta
+insomma! Qui c’è gente che soffre per davvero, lo capite? Chiamo il medico
+di turno e domani ve la vedrete con il professore! Ho capito. Tre applicazioni
+di afasol, di un’ora l’una. Subito! Che c’è? Ehm... blinda la
+supercazzola con scappellamento a sinistra e a destra come se fossero dei
+pentoloni. Ma allora io le potrei dire anche con il rispetto per l'autorità,
+che anche soltanto le due cose come vice-sindaco, capisce?}
+
+\@@_newpara:n {Si, ma la sbiriguda della sbrindellona come se fosse antani come
+faceva? Prego? Ho provato con la supercazzola con scappelamento paraplegico a
+sinistra, ma non funzionava. Ma che antifurto, mi faccia il piacere! Questi
+signori qui stavano sonando loro. Non si intrometta! No, aspetti, mi porga
+l'indice; ecco lo alzi così... guardi, guardi, guardi; lo vede il dito? Lo
+vede che stuzzica, che prematura anche. No, no... non era troppo alto. Forse
+non ha capito. Io dicevo che se fosse il coso di telefono, o il dito, come se
+fosse. Andando su o giù, giù o su.}
+
+\@@_newpara:n {Ma che antifurto, mi faccia il piacere! Questi signori qui
+stavano sonando loro. Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce? Ho
+capito. Tre applicazioni di afasol, di un’ora l’una. Subito! Che c’è?
+Ehm... blinda la supercazzola con scappellamento a sinistra e a destra come se
+fossero dei pentoloni. Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti.}
+
+\@@_newpara:n {Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no,
+no, attenzione, noo! Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? Ma
+che antifurto, mi faccia il piacere! Questi signori qui stavano sonando loro.
+Che non si ripeta più, vada pure! Senz'altro!!! Tarapia tapioco! Brematurata
+la supercazzola o scherziamo? Prego? No, mi permetta. No, io, scusi noi siamo
+in quattro.}
+
+\@@_newpara:n {Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Vicesindaco? Basta 'osì, mi seguano al
+commissariato! No, no, no, attenzione, noo! Guardi, le ho ritagliato
+quell'articolo sul Casentino. Ma lei se la blinda la supercazzola prematurata
+come se fosse anche un po' di Casentino che perdura anche come cappotto; vede,
+m'importa. No, no... non era troppo alto. Forse non ha capito. Io dicevo che se
+fosse il coso di telefono, o il dito, come se fosse. Andando su o giù, giù o
+su.}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? No, no... non era troppo alto.
+Forse non ha capito. Io dicevo che se fosse il coso di telefono, o il dito,
+come se fosse. Andando su o giù, giù o su. Pattene soppaltate secondo
+l'articolo 12 abbia pazienza, sennò, posterdati, per due, anche un pochino
+antani in prefettura... senza contare che la supercazzola prematurata ha perso
+i contatti col tarapio tapioco. Vicesindaco? Basta 'osì, mi seguano al
+commissariato! No, no, no, attenzione, noo!}
+
+\@@_newpara:n {E lei... cosa si sente? Professore, non le dico. Antani come
+trazione per due anche se fosse supercazzola bitumata, ha lo scappellamento a
+destra. Come se fosse antani anche per lei soltanto in due, oppure in quattro
+anche scribai con cofandina; come antifurto, per esempio. Ma allora io le
+potrei dire anche con il rispetto per l'autorità, che anche soltanto le due
+cose come vice-sindaco, capisce? Dimmi figliolo. Sbiliguda veniale con la
+supercazzola prematurata. Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti.}
+
+\@@_newpara:n {Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto? Ho
+capito. Tre applicazioni di afasol, di un’ora l’una. Subito! Che c’è?
+Ehm... blinda la supercazzola con scappellamento a sinistra e a destra come se
+fossero dei pentoloni. Mo basta insomma! Qui c’è gente che soffre per
+davvero, lo capite? Chiamo il medico di turno e domani ve la vedrete con il
+professore! Mo basta insomma! Qui c’è gente che soffre per davvero, lo
+capite? Chiamo il medico di turno e domani ve la vedrete con il professore!}
+
+\@@_newpara:n {No, no... non era troppo alto. Forse non ha capito. Io dicevo
+che se fosse il coso di telefono, o il dito, come se fosse. Andando su o giù,
+giù o su. Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò,
+posterdati, per due, anche un pochino antani in prefettura... senza contare che
+la supercazzola prematurata ha perso i contatti col tarapio tapioco. E lei...
+cosa si sente? Professore, non le dico. Antani come trazione per due anche se
+fosse supercazzola bitumata, ha lo scappellamento a destra. E lei... cosa si
+sente? Professore, non le dico. Antani come trazione per due anche se fosse
+supercazzola bitumata, ha lo scappellamento a destra.}
+
+\@@_newpara:n {Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. Che non si ripeta più, vada pure!
+Senz'altro!!! Tarapia tapioco! Brematurata la supercazzola o scherziamo? Prego?
+No, mi permetta. No, io, scusi noi siamo in quattro. No, no... non era troppo
+alto. Forse non ha capito. Io dicevo che se fosse il coso di telefono, o il
+dito, come se fosse. Andando su o giù, giù o su. Ma allora io le potrei dire
+anche con il rispetto per l'autorità, che anche soltanto le due cose come
+vice-sindaco, capisce?}
+
+\@@_newpara:n {Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no,
+no, attenzione, noo! Mi scusi, Antani come se fosse di scappellamento tarapio
+tapioco scappellamento di forestieri? Va be', siete forestieri, ma i cartelli
+sono internazionali. Mi può mostrare la sua patente, per favore? Pattene
+soppaltate secondo l'articolo 12 abbia pazienza, sennò, posterdati, per due,
+anche un pochino antani in prefettura... senza contare che la supercazzola
+prematurata ha perso i contatti col tarapio tapioco. Mo basta insomma! Qui
+c’è gente che soffre per davvero, lo capite? Chiamo il medico di turno e
+domani ve la vedrete con il professore!}
+
+\@@_newpara:n {Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no,
+no, attenzione, noo! No, no... non era troppo alto. Forse non ha capito. Io
+dicevo che se fosse il coso di telefono, o il dito, come se fosse. Andando su o
+giù, giù o su. Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no,
+no, attenzione, noo! Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce?}
+
+\@@_newpara:n {Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. Vicesindaco? Basta 'osì, mi seguano al
+commissariato! No, no, no, attenzione, noo! Guardi, le ho ritagliato
+quell'articolo sul Casentino. Ma lei se la blinda la supercazzola prematurata
+come se fosse anche un po' di Casentino che perdura anche come cappotto; vede,
+m'importa. Mi scusi, Antani come se fosse di scappellamento tarapio tapioco
+scappellamento di forestieri? Va be', siete forestieri, ma i cartelli sono
+internazionali. Mi può mostrare la sua patente, per favore?}
+
+\@@_newpara:n {Non si intrometta! No, aspetti, mi porga l'indice; ecco lo alzi
+così... guardi, guardi, guardi; lo vede il dito? Lo vede che stuzzica, che
+prematura anche. Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti. Quante volte figliolo? Fifty
+fifty, prematinea come fosse mea culpa. Alla supercazzola. Che non si ripeta
+più, vada pure! Senz'altro!!! Tarapia tapioco! Brematurata la supercazzola o
+scherziamo? Prego? No, mi permetta. No, io, scusi noi siamo in quattro.}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? Ma che antifurto, mi faccia il
+piacere! Questi signori qui stavano sonando loro. Vicesindaco? Basta 'osì, mi
+seguano al commissariato! No, no, no, attenzione, noo! Faceva Du-Du! In che
+senso? Nel senso anafestico! Si, forse per andicappo di altitudine. No? Ah,
+vuol dire che il telefono è troppo alto?}
+
+\@@_newpara:n {Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se
+la blinda la supercazzola prematurata come se fosse anche un po' di Casentino
+che perdura anche come cappotto; vede, m'importa. Si, ma la sbiriguda della
+sbrindellona come se fosse antani come faceva? Prego? Ho provato con la
+supercazzola con scappelamento paraplegico a sinistra, ma non funzionava. Si,
+ma la sbiriguda della sbrindellona come se fosse antani come faceva? Prego? Ho
+provato con la supercazzola con scappelamento paraplegico a sinistra, ma non
+funzionava. Ho capito. Tre applicazioni di afasol, di un’ora l’una. Subito!
+Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra e a
+destra come se fossero dei pentoloni.}
+
+\@@_newpara:n {Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? Come
+figliolo? Confesso come fosse antani con scappellamento a destra costantinato
+ammaliti. Quante volte figliolo? Fifty fifty, prematinea come fosse mea culpa.
+Alla supercazzola. Mo basta insomma! Qui c’è gente che soffre per davvero,
+lo capite? Chiamo il medico di turno e domani ve la vedrete con il professore!
+Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per andicappo di
+altitudine. No? Ah, vuol dire che il telefono è troppo alto?}
+
+\@@_newpara:n {Mo basta insomma! Qui c’è gente che soffre per davvero, lo
+capite? Chiamo il medico di turno e domani ve la vedrete con il professore! Non
+si intrometta! No, aspetti, mi porga l'indice; ecco lo alzi così... guardi,
+guardi, guardi; lo vede il dito? Lo vede che stuzzica, che prematura anche.
+Dimmi figliolo. Sbiliguda veniale con la supercazzola prematurata. Come
+figliolo? Confesso come fosse antani con scappellamento a destra costantinato
+ammaliti. Carmensita, amore mio, sono un uomo d'affari, blinda la supercazzola
+prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia, dollari,
+sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu?}
+
+\@@_newpara:n {Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Quante volte figliolo? Fifty fifty, prematinea
+come fosse mea culpa. Alla supercazzola. Ma allora io le potrei dire anche con
+il rispetto per l'autorità, che anche soltanto le due cose come vice-sindaco,
+capisce? Come se fosse antani anche per lei soltanto in due, oppure in quattro
+anche scribai con cofandina; come antifurto, per esempio. Si, ma la sbiriguda
+della sbrindellona come se fosse antani come faceva? Prego? Ho provato con la
+supercazzola con scappelamento paraplegico a sinistra, ma non funzionava.}
+
+\@@_newpara:n {Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? Che
+non si ripeta più, vada pure! Senz'altro!!! Tarapia tapioco! Brematurata la
+supercazzola o scherziamo? Prego? No, mi permetta. No, io, scusi noi siamo in
+quattro. E lei... cosa si sente? Professore, non le dico. Antani come trazione
+per due anche se fosse supercazzola bitumata, ha lo scappellamento a destra.
+Segua col dito. Vede, se va giù non va su. Se va su non va giù. Si faccia
+aiutare dalla suora. È quello che stavo dicendo, no!?}
+
+\@@_newpara:n {No, no... non era troppo alto. Forse non ha capito. Io dicevo
+che se fosse il coso di telefono, o il dito, come se fosse. Andando su o giù,
+giù o su. E lei... cosa si sente? Professore, non le dico. Antani come
+trazione per due anche se fosse supercazzola bitumata, ha lo scappellamento a
+destra. Come figliolo? Confesso come fosse antani con scappellamento a destra
+costantinato ammaliti. Quante volte figliolo? Fifty fifty, prematinea come
+fosse mea culpa. Alla supercazzola. Segua col dito. Vede, se va giù non va su.
+Se va su non va giù. Si faccia aiutare dalla suora. È quello che stavo
+dicendo, no!?}
+
+\@@_newpara:n {Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu?
+Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se la blinda la
+supercazzola prematurata come se fosse anche un po' di Casentino che perdura
+anche come cappotto; vede, m'importa. Segua col dito. Vede, se va giù non va
+su. Se va su non va giù. Si faccia aiutare dalla suora. È quello che stavo
+dicendo, no!? Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò,
+posterdati, per due, anche un pochino antani in prefettura... senza contare che
+la supercazzola prematurata ha perso i contatti col tarapio tapioco.}
+
+\@@_newpara:n {Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Che non si ripeta più, vada pure! Senz'altro!!!
+Tarapia tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi
+permetta. No, io, scusi noi siamo in quattro. Dimmi figliolo. Sbiliguda veniale
+con la supercazzola prematurata. Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti. Si, ma la sbiriguda della
+sbrindellona come se fosse antani come faceva? Prego? Ho provato con la
+supercazzola con scappelamento paraplegico a sinistra, ma non funzionava.}
+
+\@@_newpara:n {Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Segua col dito. Vede, se va giù non va su. Se va
+su non va giù. Si faccia aiutare dalla suora. È quello che stavo dicendo,
+no!? Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no, no,
+attenzione, noo! Mo basta insomma! Qui c’è gente che soffre per davvero, lo
+capite? Chiamo il medico di turno e domani ve la vedrete con il professore!}
+
+\@@_newpara:n {Ho capito. Tre applicazioni di afasol, di un’ora l’una.
+Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra
+e a destra come se fossero dei pentoloni. Ma allora io le potrei dire anche con
+il rispetto per l'autorità, che anche soltanto le due cose come vice-sindaco,
+capisce? Come se fosse antani anche per lei soltanto in due, oppure in quattro
+anche scribai con cofandina; come antifurto, per esempio. Ma che antifurto, mi
+faccia il piacere! Questi signori qui stavano sonando loro.}
+
+\@@_newpara:n {Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no,
+no, attenzione, noo! Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti. Quante volte figliolo? Fifty
+fifty, prematinea come fosse mea culpa. Alla supercazzola. Mi scusi, Antani
+come se fosse di scappellamento tarapio tapioco scappellamento di forestieri?
+Va be', siete forestieri, ma i cartelli sono internazionali. Mi può mostrare
+la sua patente, per favore? Non si intrometta! No, aspetti, mi porga l'indice;
+ecco lo alzi così... guardi, guardi, guardi; lo vede il dito? Lo vede che
+stuzzica, che prematura anche.}
+
+\@@_newpara:n {Mo basta insomma! Qui c’è gente che soffre per davvero, lo
+capite? Chiamo il medico di turno e domani ve la vedrete con il professore! Ho
+provato con la supercazzola con scappellamento paraplegico a sinistra, ma non
+funzionava, faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come
+farà di capo d'altitudine, no? Si, ma la sbiriguda della sbrindellona come se
+fosse antani come faceva? Prego? Ho provato con la supercazzola con
+scappelamento paraplegico a sinistra, ma non funzionava. Ah, pardon. Tarapio
+tapioco come se fosse Antani, la supercazzola prematurata con dominus
+reveriscum blinda. Come, prego? Tarapio sulla supercazzola con scappellamento
+destro o sinistra?}
+
+\@@_newpara:n {Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto?
+Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per andicappo di
+altitudine. No? Ah, vuol dire che il telefono è troppo alto? Ma allora io le
+potrei dire anche con il rispetto per l'autorità, che anche soltanto le due
+cose come vice-sindaco, capisce? Come se fosse antani anche per lei soltanto in
+due, oppure in quattro anche scribai con cofandina; come antifurto, per
+esempio.}
+
+\@@_newpara:n {Segua col dito. Vede, se va giù non va su. Se va su non va
+giù. Si faccia aiutare dalla suora. È quello che stavo dicendo, no!? Che non
+si ripeta più, vada pure! Senz'altro!!! Tarapia tapioco! Brematurata la
+supercazzola o scherziamo? Prego? No, mi permetta. No, io, scusi noi siamo in
+quattro. No, no... non era troppo alto. Forse non ha capito. Io dicevo che se
+fosse il coso di telefono, o il dito, come se fosse. Andando su o giù, giù o
+su. Mi scusi, Antani come se fosse di scappellamento tarapio tapioco
+scappellamento di forestieri? Va be', siete forestieri, ma i cartelli sono
+internazionali. Mi può mostrare la sua patente, per favore?}
+
+\@@_newpara:n {Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce? Ah,
+pardon. Tarapio tapioco come se fosse Antani, la supercazzola prematurata con
+dominus reveriscum blinda. Come, prego? Tarapio sulla supercazzola con
+scappellamento destro o sinistra? Si, ma la sbiriguda della sbrindellona come
+se fosse antani come faceva? Prego? Ho provato con la supercazzola con
+scappelamento paraplegico a sinistra, ma non funzionava. Carmensita, amore mio,
+sono un uomo d'affari, blinda la supercazzola prematurata, una cosa d'assegni,
+tarapia tapioca, tapioca torapia, dollari, sterline, allaccia scarpa,
+scarpallaccia, dico d'albergo, ma tu?}
+
+\@@_newpara:n {E lei... cosa si sente? Professore, non le dico. Antani come
+trazione per due anche se fosse supercazzola bitumata, ha lo scappellamento a
+destra. Che non si ripeta più, vada pure! Senz'altro!!! Tarapia tapioco!
+Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No, io, scusi
+noi siamo in quattro. Si, ma la sbiriguda della sbrindellona come se fosse
+antani come faceva? Prego? Ho provato con la supercazzola con scappelamento
+paraplegico a sinistra, ma non funzionava. No, no... non era troppo alto. Forse
+non ha capito. Io dicevo che se fosse il coso di telefono, o il dito, come se
+fosse. Andando su o giù, giù o su.}
+
+\@@_newpara:n {Ah, pardon. Tarapio tapioco come se fosse Antani, la
+supercazzola prematurata con dominus reveriscum blinda. Come, prego? Tarapio
+sulla supercazzola con scappellamento destro o sinistra? Ah, pardon. Tarapio
+tapioco come se fosse Antani, la supercazzola prematurata con dominus
+reveriscum blinda. Come, prego? Tarapio sulla supercazzola con scappellamento
+destro o sinistra? Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce? No,
+no... non era troppo alto. Forse non ha capito. Io dicevo che se fosse il coso
+di telefono, o il dito, come se fosse. Andando su o giù, giù o su.}
+
+\@@_newpara:n {Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no,
+no, attenzione, noo! No, no... non era troppo alto. Forse non ha capito. Io
+dicevo che se fosse il coso di telefono, o il dito, come se fosse. Andando su o
+giù, giù o su. Si, ma la sbiriguda della sbrindellona come se fosse antani
+come faceva? Prego? Ho provato con la supercazzola con scappelamento
+paraplegico a sinistra, ma non funzionava. No, no... non era troppo alto. Forse
+non ha capito. Io dicevo che se fosse il coso di telefono, o il dito, come se
+fosse. Andando su o giù, giù o su.}
+
+\@@_newpara:n {Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? Si,
+ma la sbiriguda della sbrindellona come se fosse antani come faceva? Prego? Ho
+provato con la supercazzola con scappelamento paraplegico a sinistra, ma non
+funzionava. Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto? Si,
+ma la sbiriguda della sbrindellona come se fosse antani come faceva? Prego? Ho
+provato con la supercazzola con scappelamento paraplegico a sinistra, ma non
+funzionava.}
+
+\@@_newpara:n {Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto? Mo
+basta insomma! Qui c’è gente che soffre per davvero, lo capite? Chiamo il
+medico di turno e domani ve la vedrete con il professore! Ma allora io le
+potrei dire anche con il rispetto per l'autorità, che anche soltanto le due
+cose come vice-sindaco, capisce? Ho provato con la supercazzola con
+scappellamento paraplegico a sinistra, ma non funzionava, faceva tu-tu. In che
+senso? Nel senso anafestico. Eh, sì; come farà di capo d'altitudine, no?}
+
+\@@_newpara:n {Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. Ah, pardon. Tarapio tapioco come se fosse
+Antani, la supercazzola prematurata con dominus reveriscum blinda. Come, prego?
+Tarapio sulla supercazzola con scappellamento destro o sinistra? Come se fosse
+antani anche per lei soltanto in due, oppure in quattro anche scribai con
+cofandina; come antifurto, per esempio. Segua col dito. Vede, se va giù non va
+su. Se va su non va giù. Si faccia aiutare dalla suora. È quello che stavo
+dicendo, no!?}
+
+\@@_newpara:n {Sorella? Eh!? Col tarapia tapioco come se fosse la supercazzola
+per lei. Voglio il cappellano, il cappellano! Ho visto la Madonna! Ho capito.
+Tre applicazioni di afasol, di un’ora l’una. Subito! Che c’è? Ehm...
+blinda la supercazzola con scappellamento a sinistra e a destra come se fossero
+dei pentoloni. Pattene soppaltate secondo l'articolo 12 abbia pazienza, sennò,
+posterdati, per due, anche un pochino antani in prefettura... senza contare che
+la supercazzola prematurata ha perso i contatti col tarapio tapioco. Mo basta
+insomma! Qui c’è gente che soffre per davvero, lo capite? Chiamo il medico
+di turno e domani ve la vedrete con il professore!}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? Come se fosse antani anche per
+lei soltanto in due, oppure in quattro anche scribai con cofandina; come
+antifurto, per esempio. Ho capito. Tre applicazioni di afasol, di un’ora
+l’una. Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a
+sinistra e a destra come se fossero dei pentoloni. Come figliolo? Confesso come
+fosse antani con scappellamento a destra costantinato ammaliti. Quante volte
+figliolo? Fifty fifty, prematinea come fosse mea culpa. Alla supercazzola.}
+
+\@@_newpara:n {Carmensita, amore mio, sono un uomo d'affari, blinda la
+supercazzola prematurata, una cosa d'assegni, tarapia tapioca, tapioca torapia,
+dollari, sterline, allaccia scarpa, scarpallaccia, dico d'albergo, ma tu? Ho
+capito. Tre applicazioni di afasol, di un’ora l’una. Subito! Che c’è?
+Ehm... blinda la supercazzola con scappellamento a sinistra e a destra come se
+fossero dei pentoloni. Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti. Quante volte figliolo? Fifty
+fifty, prematinea come fosse mea culpa. Alla supercazzola.}
+
+\@@_newpara:n {Sorella? Eh!? Col tarapia tapioco come se fosse la supercazzola
+per lei. Voglio il cappellano, il cappellano! Ho visto la Madonna! Mi scusi,
+Antani come se fosse di scappellamento tarapio tapioco scappellamento di
+forestieri? Va be', siete forestieri, ma i cartelli sono internazionali. Mi
+può mostrare la sua patente, per favore? Ho provato con la supercazzola con
+scappellamento paraplegico a sinistra, ma non funzionava, faceva tu-tu. In che
+senso? Nel senso anafestico. Eh, sì; come farà di capo d'altitudine, no? Non
+si intrometta! No, aspetti, mi porga l'indice; ecco lo alzi così... guardi,
+guardi, guardi; lo vede il dito? Lo vede che stuzzica, che prematura anche.}
+
+\@@_newpara:n {Come se fosse antani anche per lei soltanto in due, oppure in
+quattro anche scribai con cofandina; come antifurto, per esempio. Come
+figliolo? Confesso come fosse antani con scappellamento a destra costantinato
+ammaliti. Quante volte figliolo? Fifty fifty, prematinea come fosse mea culpa.
+Alla supercazzola. Come figliolo? Confesso come fosse antani con scappellamento
+a destra costantinato ammaliti. Quante volte figliolo? Fifty fifty, prematinea
+come fosse mea culpa. Alla supercazzola. Dimmi figliolo. Sbiliguda veniale con
+la supercazzola prematurata. Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti.}
+
+\@@_newpara:n {Ah, pardon. Tarapio tapioco come se fosse Antani, la
+supercazzola prematurata con dominus reveriscum blinda. Come, prego? Tarapio
+sulla supercazzola con scappellamento destro o sinistra? Dimmi figliolo.
+Sbiliguda veniale con la supercazzola prematurata. Come figliolo? Confesso come
+fosse antani con scappellamento a destra costantinato ammaliti. Ho provato con
+la supercazzola con scappellamento paraplegico a sinistra, ma non funzionava,
+faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come farà di capo
+d'altitudine, no? Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse
+per andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto?}
+
+\@@_newpara:n {Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no,
+no, attenzione, noo! Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. No, no... non era troppo alto. Forse non ha
+capito. Io dicevo che se fosse il coso di telefono, o il dito, come se fosse.
+Andando su o giù, giù o su. E lei... cosa si sente? Professore, non le dico.
+Antani come trazione per due anche se fosse supercazzola bitumata, ha lo
+scappellamento a destra.}
+
+\@@_newpara:n {Faceva Du-Du! In che senso? Nel senso anafestico! Si, forse per
+andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo alto?
+Vicesindaco? Basta 'osì, mi seguano al commissariato! No, no, no, attenzione,
+noo! Come se fosse antani anche per lei soltanto in due, oppure in quattro
+anche scribai con cofandina; come antifurto, per esempio. Ah, pardon. Tarapio
+tapioco come se fosse Antani, la supercazzola prematurata con dominus
+reveriscum blinda. Come, prego? Tarapio sulla supercazzola con scappellamento
+destro o sinistra?}
+
+\@@_newpara:n {Che non si ripeta più, vada pure! Senz'altro!!! Tarapia
+tapioco! Brematurata la supercazzola o scherziamo? Prego? No, mi permetta. No,
+io, scusi noi siamo in quattro. Si, ma la sbiriguda della sbrindellona come se
+fosse antani come faceva? Prego? Ho provato con la supercazzola con
+scappelamento paraplegico a sinistra, ma non funzionava. Ho provato con la
+supercazzola con scappellamento paraplegico a sinistra, ma non funzionava,
+faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come farà di capo
+d'altitudine, no? Ah, pardon. Tarapio tapioco come se fosse Antani, la
+supercazzola prematurata con dominus reveriscum blinda. Come, prego? Tarapio
+sulla supercazzola con scappellamento destro o sinistra?}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? Pattene soppaltate secondo
+l'articolo 12 abbia pazienza, sennò, posterdati, per due, anche un pochino
+antani in prefettura... senza contare che la supercazzola prematurata ha perso
+i contatti col tarapio tapioco. Mi scusi, Antani come se fosse di
+scappellamento tarapio tapioco scappellamento di forestieri? Va be', siete
+forestieri, ma i cartelli sono internazionali. Mi può mostrare la sua patente,
+per favore? Ma che antifurto, mi faccia il piacere! Questi signori qui stavano
+sonando loro.}
+
+\@@_newpara:n {E lei... cosa si sente? Professore, non le dico. Antani come
+trazione per due anche se fosse supercazzola bitumata, ha lo scappellamento a
+destra. Ma che antifurto, mi faccia il piacere! Questi signori qui stavano
+sonando loro. Sorella? Eh!? Col tarapia tapioco come se fosse la supercazzola
+per lei. Voglio il cappellano, il cappellano! Ho visto la Madonna! Carmensita,
+amore mio, sono un uomo d'affari, blinda la supercazzola prematurata, una cosa
+d'assegni, tarapia tapioca, tapioca torapia, dollari, sterline, allaccia
+scarpa, scarpallaccia, dico d'albergo, ma tu?}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? Carmensita, amore mio, sono un
+uomo d'affari, blinda la supercazzola prematurata, una cosa d'assegni, tarapia
+tapioca, tapioca torapia, dollari, sterline, allaccia scarpa, scarpallaccia,
+dico d'albergo, ma tu? Non si intrometta! No, aspetti, mi porga l'indice; ecco
+lo alzi così... guardi, guardi, guardi; lo vede il dito? Lo vede che stuzzica,
+che prematura anche. Faceva Du-Du! In che senso? Nel senso anafestico! Si,
+forse per andicappo di altitudine. No? Ah, vuol dire che il telefono è troppo
+alto?}
+
+\@@_newpara:n {Non si intrometta! No, aspetti, mi porga l'indice; ecco lo alzi
+così... guardi, guardi, guardi; lo vede il dito? Lo vede che stuzzica, che
+prematura anche. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Quante volte figliolo? Fifty fifty, prematinea
+come fosse mea culpa. Alla supercazzola. Ah, pardon. Tarapio tapioco come se
+fosse Antani, la supercazzola prematurata con dominus reveriscum blinda. Come,
+prego? Tarapio sulla supercazzola con scappellamento destro o sinistra? Mo
+basta insomma! Qui c’è gente che soffre per davvero, lo capite? Chiamo il
+medico di turno e domani ve la vedrete con il professore!}
+
+\@@_newpara:n {Segua col dito. Vede, se va giù non va su. Se va su non va
+giù. Si faccia aiutare dalla suora. È quello che stavo dicendo, no!? Faceva
+Du-Du! In che senso? Nel senso anafestico! Si, forse per andicappo di
+altitudine. No? Ah, vuol dire che il telefono è troppo alto? Non si
+intrometta! No, aspetti, mi porga l'indice; ecco lo alzi così... guardi,
+guardi, guardi; lo vede il dito? Lo vede che stuzzica, che prematura anche. Ma
+allora io le potrei dire anche con il rispetto per l'autorità, che anche
+soltanto le due cose come vice-sindaco, capisce?}
+
+\@@_newpara:n {Mi scusi, Antani come se fosse di scappellamento tarapio tapioco
+scappellamento di forestieri? Va be', siete forestieri, ma i cartelli sono
+internazionali. Mi può mostrare la sua patente, per favore? Pattene soppaltate
+secondo l'articolo 12 abbia pazienza, sennò, posterdati, per due, anche un
+pochino antani in prefettura... senza contare che la supercazzola prematurata
+ha perso i contatti col tarapio tapioco. Si, ma la sbiriguda della sbrindellona
+come se fosse antani come faceva? Prego? Ho provato con la supercazzola con
+scappelamento paraplegico a sinistra, ma non funzionava. Ma allora io le potrei
+dire anche con il rispetto per l'autorità, che anche soltanto le due cose come
+vice-sindaco, capisce?}
+
+\@@_newpara:n {Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce? Ah,
+pardon. Tarapio tapioco come se fosse Antani, la supercazzola prematurata con
+dominus reveriscum blinda. Come, prego? Tarapio sulla supercazzola con
+scappellamento destro o sinistra? Segua col dito. Vede, se va giù non va su.
+Se va su non va giù. Si faccia aiutare dalla suora. È quello che stavo
+dicendo, no!? Ma allora io le potrei dire anche con il rispetto per
+l'autorità, che anche soltanto le due cose come vice-sindaco, capisce?}
+
+\@@_newpara:n {Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se
+la blinda la supercazzola prematurata come se fosse anche un po' di Casentino
+che perdura anche come cappotto; vede, m'importa. Mi scusi, Antani come se
+fosse di scappellamento tarapio tapioco scappellamento di forestieri? Va be',
+siete forestieri, ma i cartelli sono internazionali. Mi può mostrare la sua
+patente, per favore? Come se fosse antani anche per lei soltanto in due, oppure
+in quattro anche scribai con cofandina; come antifurto, per esempio. Ho provato
+con la supercazzola con scappellamento paraplegico a sinistra, ma non
+funzionava, faceva tu-tu. In che senso? Nel senso anafestico. Eh, sì; come
+farà di capo d'altitudine, no?}
+
+\@@_newpara:n {Ho provato con la supercazzola con scappellamento paraplegico a
+sinistra, ma non funzionava, faceva tu-tu. In che senso? Nel senso anafestico.
+Eh, sì; come farà di capo d'altitudine, no? Faceva Du-Du! In che senso? Nel
+senso anafestico! Si, forse per andicappo di altitudine. No? Ah, vuol dire che
+il telefono è troppo alto? Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti. Quante volte figliolo? Fifty
+fifty, prematinea come fosse mea culpa. Alla supercazzola. Pattene soppaltate
+secondo l'articolo 12 abbia pazienza, sennò, posterdati, per due, anche un
+pochino antani in prefettura... senza contare che la supercazzola prematurata
+ha perso i contatti col tarapio tapioco.}
+
+\@@_newpara:n {Mi scusi, Antani come se fosse di scappellamento tarapio tapioco
+scappellamento di forestieri? Va be', siete forestieri, ma i cartelli sono
+internazionali. Mi può mostrare la sua patente, per favore? Faceva Du-Du! In
+che senso? Nel senso anafestico! Si, forse per andicappo di altitudine. No? Ah,
+vuol dire che il telefono è troppo alto? Carmensita, amore mio, sono un uomo
+d'affari, blinda la supercazzola prematurata, una cosa d'assegni, tarapia
+tapioca, tapioca torapia, dollari, sterline, allaccia scarpa, scarpallaccia,
+dico d'albergo, ma tu? Mo basta insomma! Qui c’è gente che soffre per
+davvero, lo capite? Chiamo il medico di turno e domani ve la vedrete con il
+professore!}
+
+\@@_newpara:n {Dimmi figliolo. Sbiliguda veniale con la supercazzola
+prematurata. Come figliolo? Confesso come fosse antani con scappellamento a
+destra costantinato ammaliti. Come figliolo? Confesso come fosse antani con
+scappellamento a destra costantinato ammaliti. Quante volte figliolo? Fifty
+fifty, prematinea come fosse mea culpa. Alla supercazzola. Come figliolo?
+Confesso come fosse antani con scappellamento a destra costantinato ammaliti.
+Quante volte figliolo? Fifty fifty, prematinea come fosse mea culpa. Alla
+supercazzola. Ho capito. Tre applicazioni di afasol, di un’ora l’una.
+Subito! Che c’è? Ehm... blinda la supercazzola con scappellamento a sinistra
+e a destra come se fossero dei pentoloni.}
+
+\@@_newpara:n {Mo basta insomma! Qui c’è gente che soffre per davvero, lo
+capite? Chiamo il medico di turno e domani ve la vedrete con il professore!
+Guardi, le ho ritagliato quell'articolo sul Casentino. Ma lei se la blinda la
+supercazzola prematurata come se fosse anche un po' di Casentino che perdura
+anche come cappotto; vede, m'importa. Guardi, le ho ritagliato quell'articolo
+sul Casentino. Ma lei se la blinda la supercazzola prematurata come se fosse
+anche un po' di Casentino che perdura anche come cappotto; vede, m'importa. Ah,
+pardon. Tarapio tapioco come se fosse Antani, la supercazzola prematurata con
+dominus reveriscum blinda. Come, prego? Tarapio sulla supercazzola con
+scappellamento destro o sinistra?}
+
+% \end{macrocode}
+%
+% Now we define the sequence of index words.
+% \begin{macrocode}
+\@@_newword:n {afasol}
+\@@_newword:n {affari}
+\@@_newword:n {altitudine}
+\@@_newword:n {altro}
+\@@_newword:n {ammaliti}
+\@@_newword:n {amore}
+\@@_newword:n {anafestico}
+\@@_newword:n {andicappo}
+\@@_newword:n {Antani}
+\@@_newword:n {antani}
+\@@_newword:n {antifurto}
+\@@_newword:n {articolo}
+\@@_newword:n {aspetti}
+\@@_newword:n {attenzione}
+\@@_newword:n {bituma}
+\@@_newword:n {blinda}
+\@@_newword:n {Brematura}
+\@@_newword:n {Brematurata}
+\@@_newword:n {capito}
+\@@_newword:n {cappellano}
+\@@_newword:n {cappotto}
+\@@_newword:n {Carmensita}
+\@@_newword:n {Casentino}
+\@@_newword:n {cofandina}
+\@@_newword:n {commissariato}
+\@@_newword:n {Confesso}
+\@@_newword:n {contatti}
+\@@_newword:n {costantinato}
+\@@_newword:n {culpa}
+\@@_newword:n {destra}
+\@@_newword:n {destro}
+\@@_newword:n {dito}
+\@@_newword:n {dollari}
+\@@_newword:n {dominus}
+\@@_newword:n {Du}
+\@@_newword:n {du}
+\@@_newword:n {due}
+\@@_newword:n {ecco}
+\@@_newword:n {faccia}
+\@@_newword:n {favore}
+\@@_newword:n {fifty}
+\@@_newword:n {figliolo}
+\@@_newword:n {forestieri}
+\@@_newword:n {giù}
+\@@_newword:n {guardi}
+\@@_newword:n {indice}
+\@@_newword:n {internazionali}
+\@@_newword:n {intrometta}
+\@@_newword:n {Madonna}
+\@@_newword:n {medico}
+\@@_newword:n {Necchi}
+\@@_newword:n {paraplegico}
+\@@_newword:n {pardon}
+\@@_newword:n {Pattene}
+\@@_newword:n {pazienza}
+\@@_newword:n {pentoloni}
+\@@_newword:n {piacere}
+\@@_newword:n {pochino}
+\@@_newword:n {porga}
+\@@_newword:n {porga}
+\@@_newword:n {posterdati}
+\@@_newword:n {prefettura}
+\@@_newword:n {Prego}
+\@@_newword:n {prego}
+\@@_newword:n {prematura}
+\@@_newword:n {prematurata}
+\@@_newword:n {professore}
+\@@_newword:n {provato}
+\@@_newword:n {quattro}
+\@@_newword:n {reveriscum}
+\@@_newword:n {rispetto}
+\@@_newword:n {Sbiliguda}
+\@@_newword:n {sbiriguda}
+\@@_newword:n {sbrindellona}
+\@@_newword:n {scappellamento}
+\@@_newword:n {scarpa}
+\@@_newword:n {scherziamo}
+\@@_newword:n {scribai}
+\@@_newword:n {secondo}
+\@@_newword:n {segua}
+\@@_newword:n {sindaco}
+\@@_newword:n {sinistra}
+\@@_newword:n {sinistro}
+\@@_newword:n {Sorella}
+\@@_newword:n {sterline}
+\@@_newword:n {stuzzica}
+\@@_newword:n {Subito}
+\@@_newword:n {suora}
+\@@_newword:n {supercazzola}
+\@@_newword:n {tapioca}
+\@@_newword:n {tarapia}
+\@@_newword:n {tarapioco}
+\@@_newword:n {telefono}
+\@@_newword:n {trazione}
+\@@_newword:n {tre}
+\@@_newword:n {Vede}
+\@@_newword:n {veniale}
+\@@_newword:n {Vicesindaco}
+\@@_newword:n {vicesindaco}
+\@@_newword:n {voglio}
+% \end{macrocode}
+%
+% Finally we close the group and issue a message in the log file
+% stating how many sentences are available.
+% \begin{macrocode}
+\group_end:
+\msg_info:nnx {antanilipsum} {how-many}
+ { \int_eval:n {\seq_count:N \g_@@_pars_seq} }
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+% \end{implementation}
+%
+% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/aomart/Makefile b/Master/texmf-dist/source/latex/aomart/Makefile
new file mode 100644
index 00000000000..a32946042f1
--- /dev/null
+++ b/Master/texmf-dist/source/latex/aomart/Makefile
@@ -0,0 +1,69 @@
+#
+# Makefile for aomart package
+#
+# This file is in public domain
+#
+# $Id: Makefile,v 1.7 2017/12/14 03:25:19 boris Exp $
+#
+
+PACKAGE=aomart
+
+SAMPLES = \
+ aomsample.tex\
+ aomsample1.tex \
+ aomfrench.tex
+
+PDF = $(PACKAGE).pdf ${SAMPLES:%.tex=%.pdf}
+
+all: ${PDF}
+
+
+%.pdf: %.dtx $(PACKAGE).cls
+ pdflatex $<
+ - bibtex $*
+ pdflatex $<
+ - makeindex -s gind.ist -o $*.ind $*.idx
+ - makeindex -s gglo.ist -o $*.gls $*.glo
+ pdflatex $<
+ while ( grep -q '^LaTeX Warning: Label(s) may have changed' $*.log) \
+ do pdflatex $<; done
+
+
+%.cls: %.ins %.dtx
+ pdflatex $<
+
+%.pdf: %.tex $(PACKAGE).cls
+ pdflatex $<
+ - bibtex $*
+ pdflatex $<
+ while ( grep -q '^LaTeX Warning: Label(s) may have changed' $*.log) \
+ do pdflatex $<; done
+
+aomsample1.tex: fullref.pl aomsample.tex
+ perl fullref.pl aomsample.tex > aomsample1.tex
+
+
+.PRECIOUS: $(PACKAGE).cfg $(PACKAGE).cls
+
+
+clean:
+ $(RM) $(PACKAGE).cls *.log *.aux \
+ *.cfg *.glo *.idx *.toc \
+ *.ilg *.ind *.out *.lof \
+ *.lot *.bbl *.blg *.gls \
+ *.dvi *.ps *.thm *.tgz *.zip *.rpi
+
+distclean: clean
+ $(RM) $(PDF) aomsample1.tex
+
+#
+# Archive for the distribution. Includes typeset documentation
+#
+archive: all clean
+ COPYFILE_DISABLE=1 \
+ tar -C .. -czvf ../$(PACKAGE).tgz --exclude '*~' \
+ --exclude '*.tgz' --exclude '*.zip' --exclude CVS $(PACKAGE)
+ mv ../$(PACKAGE).tgz .
+
+zip: all clean
+ zip -r $(PACKAGE).zip * -x '*~' -x '*.tgz' -x '*.zip' -x CVS -x 'CVS/*'
diff --git a/Master/texmf-dist/source/latex/aomart/aomart.dtx b/Master/texmf-dist/source/latex/aomart/aomart.dtx
index 29d2c8e44db..3bfbf3390ab 100644
--- a/Master/texmf-dist/source/latex/aomart/aomart.dtx
+++ b/Master/texmf-dist/source/latex/aomart/aomart.dtx
@@ -1,7 +1,7 @@
% \iffalse
-% $Id: aomart.dtx,v 1.74 2017/12/14 04:17:05 boris Exp $
+% $Id: aomart.dtx,v 1.77 2020/08/09 22:26:46 boris Exp $
%
-% Copyright 2010-2017, Princeton University (Mathematics Department)
+% Copyright 2010-2020, Princeton University (Mathematics Department)
% 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
@@ -23,7 +23,7 @@
% public domain.
%
% \fi
-% \CheckSum{1474}
+% \CheckSum{1532}
%
%
%% \CharacterTable
@@ -66,7 +66,7 @@
% \GetFileInfo{aomart.dtx}
% \newcommand{\progname}[1]{\textsf{#1}}
% \title{\LaTeX{} Class for The \emph{Annals of
-% Mathematics}\thanks{\copyright 2010, Princeton University
+% Mathematics}\thanks{\copyright 2010--2020, Princeton University
% (Mathematics Department)}}
% \author{Boris Veytsman\thanks{%
% \href{mailto:borisv@lk.net}{\texttt{borisv@lk.net}},
@@ -260,6 +260,9 @@
% \progname{amsart}).
%
%
+% \DescribeOption{printscheme}%
+% Normally the scheme for MSC numbers is not printed. If the option
+% |printscheme| is chosen, however, it is printed explicitly.
%
%
%\subsection{Top Matter}
@@ -412,9 +415,8 @@
% \subject{primary}{msc2000}{20E45}
% \subject{secondary}{msc2000}{20F65}
% \end{verbatim}
-%
%
-% \DescribeMacro{\formatdate}
+% \DescribeMacro{\formatdate}%
% The macro |\formatdate| is used to format the dates in the
% commands. Its argument is the date in the format |YYYY-MM-DD|, for
% example
@@ -779,7 +781,7 @@
\ProvidesFile{aomart.dtx}
%</gobble>
%<class>\ProvidesClass{aomart}
-[2017/12/13 v1.21 Typesetting articles for the Annals of Mathematics]
+[2020/08/09 v1.24 Typesetting articles for the Annals of Mathematics]
% \end{macrocode}
%
%
@@ -878,7 +880,15 @@
%
% \end{macro}
%
-%
+% \begin{macro}{\if@aom@printscheme}
+% \changes{v1.24}{2020/08/09}{Added optional printing of scheme}
+% \begin{macrocode}
+\newif\if@aom@printscheme
+\@aom@printschemefalse
+\DeclareOption{printscheme}{\@aom@printschemetrue}
+% \end{macrocode}
+%
+% \end{macro}
%
% All other options are passed to \progname{amsart}:
% \begin{macrocode}
@@ -912,13 +922,15 @@
% \changes{v0.5}{2010/10/24}{Made Roman font the default URL font}
% \changes{v0.10}{2010/12/20}{Screen mode triggers special URL
% settings}
-% \changes{v1.1}{2010/12/31}{In manuscript mode the links are always blue}
+% \changes{v1.1}{2010/12/31}{In manuscript mode the links are always
+% blue}
+% \changes{v1.22}{2018/05/21}{In screen mode we no longer crop pages}
% \begin{macrocode}
\RequirePackage{fancyhdr, lastpage, ifpdf}
\RequirePackage[breaklinks,colorlinks]{hyperref}
\if@aom@screen@mode
\hypersetup{linkcolor=blue,citecolor=blue,
- urlcolor=blue, pdfpagescrop={110 705 500 80}}%
+ urlcolor=blue}%
\else\if@aom@manuscript@mode
\hypersetup{linkcolor=blue,citecolor=blue,
urlcolor=blue}%
@@ -978,13 +990,40 @@
%
%\subsection{Fonts}
%\label{sec:fonts}
-%
+%
% \changes{v0.8}{2010/1/16}{Added yhmath}
-% We use \progname{yhmath} for wide symbols:
+% We use \progname{yhmath} for large symbols:
% \begin{macrocode}
\RequirePackage{yhmath}
% \end{macrocode}
%
+% \changes{v1.23}{2018/12/25}{Made ymath large symbols default}
+% Since version 1.2 ymath no longer makes its large symbols default.
+% We override this
+% \begin{macrocode}
+\DeclareSymbolFont{largesymbols}{OMX}{yhex}{m}{n}
+% \end{macrocode}
+%
+% \begin{macro}{\widehat}
+% \begin{macro}{\widetilde}
+% \changes{v1.23}{2018/12/25}{We are taking wide hat and wide tilde
+% from amsfonts}
+% The way \cs{widehat} and \cs{widetilde} are implemented in ymath is
+% buggy, see
+% \url{https://www.reddit.com/r/LaTeX/comments/2j7mtn/usepackageamsmath_vs_usepackageyhmath_and_the/}. We use AMS definitions instead
+% \begin{macrocode}
+\xdef\widehat#1{\noexpand\@mathmeasure\z@\textstyle{#1}%
+ \noexpand\ifdim\noexpand\wd\z@>\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\wd\z@>\tw@ em%
+ \mathaccent"0\hexnumber@\symAMSb 5D{#1}%
+ \noexpand\else\mathaccent"0365{#1}\noexpand\fi}
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
%
% \changes{v0.3}{2010/09/26}{Added package mdputu}
% \changes{v0.4}{2010/09/28}{Switched to upright digits in italics
@@ -1363,16 +1402,24 @@
%
% \begin{macro}{\subject}
% \changes{v1.18}{2017/02/15}{Drop scheme and primary/secondary}
-% \changes{v1.20}{2017/05/09}{Make primary and secondary subjects separated}
-% Subjects:
+% \changes{v1.20}{2017/05/09}{Make primary and secondary subjects
+% separated}
+% \changes{v1.24}{2020/08/09}{Added scheme}
+% Subjects.
% \begin{macrocode}
\let\@primarysubjects\@empty
\let\@secondarysubjects\@empty
+\let\@primaryscheme\@empty
+\let\@secondaryschme\@empty
\def\subject#1#2#3{%
\expandafter\ifx\csname @#1subjects\endcsname\@empty\relax
\expandafter\gdef\csname @#1subjects\endcsname{#3}%
\else
\expandafter\g@addto@macro\csname @#1subjects\endcsname{, #3}%
+ \fi
+ \if@aom@printscheme
+ \expandafter\g@addto@macro\csname @#1subjects\endcsname{%
+ ~(#2)}%
\fi}
% \end{macrocode}
%
@@ -1831,20 +1878,20 @@
\def\@setsubjects{%
\let\@subjects\@empty
\ifx\@primarysubjects\@empty\else
- \edef\@subjects{Primary: \@primarysubjects}%
+ \edef\@subjects{Primary:~\@primarysubjects}%
\fi
\ifx\@secondarysubjects\@empty\else
\ifx\@primarysubjects\@empty
- \edef\@subjects{Secondary: \@secondarysubjects}%
+ \edef\@subjects{Secondary:~\@secondarysubjects}%
\else
- \edef\@subjects{\@subjects; Secondary: \@secondarysubjects}%
+ \edef\@subjects{\@subjects; Secondary:~\@secondarysubjects}%
\fi
\fi
\ifpdf
\hypersetup{pdfsubject=\@subjects}%
\fi
\if@aom@oldkeywords\else
- \@footnotetext{AMS Classification: \@subjects.}%
+ \@footnotetext{AMS Classification:~\@subjects.}%
\fi
}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/apa7/apa7.dtx b/Master/texmf-dist/source/latex/apa7/apa7.dtx
index b670b67b92a..036099821c3 100644
--- a/Master/texmf-dist/source/latex/apa7/apa7.dtx
+++ b/Master/texmf-dist/source/latex/apa7/apa7.dtx
@@ -4,11 +4,11 @@
% %
% CHANGE THESE VALUES WITH EACH NEW RELEASE: %
% %
-%<class>\ProvidesClass{apa7}[2020/3/27 v1.05 APA formatting (7th edition)]
+%<class>\ProvidesClass{apa7}[2020/12/05 v2.07 APA formatting (7th edition)]
% %
%<*internal> %
-\def\apaSevenVersionDate{2020/3/27}
-\def\apaSevenVersionNumber{1.05}
+\def\apaSevenVersionDate{2020/12/05}
+\def\apaSevenVersionNumber{2.07}
% %
% %
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -109,6 +109,7 @@ and the derived files apa7.ins,
APA7british.txt,
APA7dutch.txt,
APA7english.txt,
+ APA7french.txt,
APA7german.txt,
APA7ngerman.txt,
APA7greek.txt,
@@ -131,6 +132,7 @@ and the derived files apa7.ins,
\file{./config/APA7british.txt}{\from{\jobname.dtx}{british}}
\file{./config/APA7dutch.txt}{\from{\jobname.dtx}{dutch}}
\file{./config/APA7english.txt}{\from{\jobname.dtx}{english}}
+ \file{./config/APA7french.txt}{\from{\jobname.dtx}{french}}
\file{./config/APA7german.txt}{\from{\jobname.dtx}{german}}
\file{./config/APA7ngerman.txt}{\from{\jobname.dtx}{ngerman}}
\file{./config/APA7greek.txt}{\from{\jobname.dtx}{greek}}
@@ -235,10 +237,31 @@ and the derived files apa7.ins,
%
% \changes{v1.03}{2019/12/29}{Updated class to detect babel package in document and localize accordingly.}
%
-% \changes{v1.04}{2019/12/30}{Added table of contents.}
-% \changes{v1.04}{2019/12/30}{Updated documentation and added correct license statement to cls for apa6 package.}
+% \changes{v1.04}{2019/12/30}{Added table of contents. Updated documentation and added correct license statement to cls for apa6 package.}
%
-% \changes{v1.05}{2020/3/27}{Fixed float placement at end for man and stu mode to ensure one correctly placed figure/table per page. Thanks WC!}
+% \changes{v1.05}{2020/03/27}{Fixed float placement at end for man and stu mode to ensure one correctly placed figure/table per page. Thanks WC.}
+%
+% \changes{v1.06}{2020/05/04}{Added figurenote command.}
+%
+% \changes{v1.07}{2020/05/10}{Fixed bug in figurenote command. Fixed figure title formatting in doc mode. Thanks RH.}
+%
+% \changes{v1.08}{2020/05/27}{Added support for optional running head (shorttitle) in stu mode.}
+%
+% \changes{v1.09}{2020/06/19}{Fixed note command (will no longer print "Author Note" header).}
+%
+% \changes{v2.01}{2020/07/18}{Re-wrote author and affiliation to be APA7 compliant. Fixed spacing on Title Page for title and author. }
+%
+% \changes{v2.02}{2020/08/02}{Added the "and" in multiple author list to localization files. }
+%
+% \changes{v2.03}{2020/08/12}{Added French localization. }
+%
+% \changes{v2.04}{2020/10/11}{Updated ORCID link style for jou mode. }
+%
+% \changes{v2.05}{2020/11/14}{Fixed a bug with the noextraspace option and added donotrepeattitle option to the documentation. }
+%
+% \changes{v2.06}{2020/12/02}{Added tablenote command. Added "Note." for table/figure notes to localization files. }
+%
+% \changes{v2.07}{2020/12/05}{Extended mask command to also mask in stu mode. }
%
% \begin{abstract}
% The \textit{Publication Manual} of the American Psychological
@@ -269,6 +292,13 @@ and the derived files apa7.ins,
% is the sole responsibility of the user to ensure compliance with
% specific journal submission requirements!
%
+% \section{\textsf{apa7} Version 2.01 Changes to Authors and Affiliations}
+% The way that authors and affiliations work has been changed in
+% version 2.01 to be APA 7th edition compliant.
+% This change will require updating any multiple author and/or
+% multiple affiliation documents to use the new |\authorsnames| and
+% |\authorsaffiliations| commands (See Section~\ref{sec:authorsaffiliations}).
+%
% \section{Usage}
% \label{sec:usage}
%
@@ -314,6 +344,8 @@ and the derived files apa7.ins,
% \textsf{babel}; the desired language(s) are listed as options
% immediately following |babel|; the last language listed is the
% main one.
+% \item \DescribeMacro{donotrepeattitle}|donotrepeattitle|: Suppress the title above the
+% introduction (in case a different title is desired).
% \item \DescribeMacro{noextraspace}|noextraspace|: In |man| and |stu| mode,
% removes some of the vertical space between certain elements (e.g.,
% headers and text) in an attempt to more closely resemble true
@@ -378,39 +410,91 @@ and the derived files apa7.ins,
% The following commands are available within the document preamble
% (i.e., the part of the file preceding |\begin{document}|).
%
+% \subsubsection{Document Title and Headers}
+% \label{sec:titleheaders}
% \begin{itemize}
% \item \DescribeMacro{\title}|\title|\marg{document-title}: The title of the document
% \item \DescribeMacro{\shorttitle}|\shorttitle|\marg{short-title}: A
% shortened version of the title (for page headers)
-% \item \DescribeMacro{\author}|\author|\marg{author(s)}: Author name(s)
+% \item
+% \DescribeMacro{\leftheader}|\leftheader|\marg{author-last-name(s)}:
+% Author last name(s) (for even-page headers in |jou| mode)
+% \end{itemize}
+% Optional; use if desired:\par
+% \begin{itemize}
+% \item \DescribeMacro{\journal}|\journal|\marg{journal-name}: Journal
+% name or other note; typeset in the top left header of page 1
+% (|jou| and |doc| modes only); to change the starting page to a
+% number other than 1, insert the following line immediately after
+% |\maketitle|:\\
+% |\setcounter{page}|\marg{custom-page-number}
+% \item \DescribeMacro{\volume}|\volume|\marg{journal-volume}: Volume,
+% number, pages; typeset in the top left header in |jou| and |doc|
+% modes, underneath the content of |\journal|
+% \item \DescribeMacro{\ccoppy}|\ccoppy|\marg{copright-notice}:
+% Copyright notice, etc.; typeset in the top right header of page 1
+% (|jou| and |doc| modes only)
+% \item \DescribeMacro{\copnum}|\copnum|\marg{more-copyright-info}:
+% Any additional text needed; typeset in the top right header in
+% |jou| and |doc| modes, underneath the content of |\ccoppy|
% \end{itemize}
%
-% For authors across multiple affiliations, follow these formats,
-% noting that authors must be matched in sequence with their
-% affiliations in the |\affiliation| command (hence multiple authors
-% inside some braces represent multiple authors from the same
-% institution):\par
+% \subsubsection{Authors and Affiliations}
+% \label{sec:authorsaffiliations}
+% Based on the new APA 7th edition style guide, the previous method for
+% handling multiple authors and multiple affiliations has been deprecated as of version 2.01 of apa7. \par
+% \textit{The followings commands have been deprecated and will return an error:} \par
% |\twoauthors{First Author(s)}{Second Author(s)}|\par
% |\threeauthors{John and Jim}{Mary and Sue}{Nick}|\par
% |\fourauthors{Helen}{Dick}{Tracy and Larry}{James Bond}|\par
% |\fiveauthors{...}{...}{...}{...}{...}|\par
% |\sixauthors{...}{...}{...}{...}{...}{...}|\par
-% \begin{itemize}
-% \item
-% \DescribeMacro{\leftheader}|\leftheader|\marg{author-last-name(s)}:
-% Author last name(s) (for even-page headers in |jou| mode)
-% \item
-% \DescribeMacro{\affiliation}|\affiliation|\marg{affiliation(s)}:
-% Author affiliation(s)
-% \end{itemize}
-%
-% For multiple affiliations, follow these formats:\par
% |\twoaffiliations{Affil. of 1st Author(s)}{Affil. 2nd Author(s)}|\par
% |\threeaffiliations{U of A}{U of B}{U of C}|\par
% |\fouraffiliations{My Company}{Your Department}{Heaven}{Earth}|\par
% |\fiveaffiliations{...}{...}{...}{...}{...}|\par
% |\sixaffiliations{...}{...}{...}{...}{...}{...}|\par
% \begin{itemize}
+% \item \DescribeMacro{\author}|\author|\marg{author name}: Author name (if only 1 author)
+% \item \DescribeMacro{\affiliation}|\affiliation|\marg{author's affiliation}: Author's affiliation (if only 1 affiliation)
+% \item \DescribeMacro{\authorsnames}|\authorsnames|\oarg{comma separated list of superscripts}\marg{comma separated list of authors name(s)}: Authors names (if more than 1 author)
+% \end{itemize}
+%
+% Where \marg{authors names} is a comma separated list of authors in display order
+% and \oarg{superscripts} is an optional comma separated list of affiliation superscripts.
+% If there are multiple superscripts for one author, put the set of superscripts within |{ }|.
+%
+% \begin{itemize}
+% \item
+% \DescribeMacro{\authorsaffiliations}|\authorsaffiliations|\marg{comma separated list of affiliation(s)}:
+% Author affiliation(s). Put each affiliation within |{ }| and separate each affiliation with a comma.
+% \end{itemize}
+%
+% \noindent \textbf{Examples:} \par
+% \noindent One author, one affiliation \par
+% |\authorsnames{Maggie C. Leonard}| \par
+% |\authorsaffiliations{{Department of Psychology, George Mason University}}| \par
+% \noindent One author, two affiliations \par
+% |\authorsnames{Andrew K. Jones-Willoughby}| \par
+% |\authorsaffiliations{{School of Psychology, University of Sydney},| \par
+% |{Center for Behavioral Neuroscience, American University}}| \par
+% \noindent Two authors, shared affiliation \par
+% |\authorsnames{Mackenzie J. Clement,Talia R. Cummings}| \par
+% |\authorsaffiliations{{College of Nursing, Michigan State University}}| \par
+% \noindent Two authors, different affiliations \par
+% |\authorsnames[1,2]{Wilhelm T. Webber,Latasha P. Jackson}| \par
+% |\authorsaffiliations{{Max Planck Institute for Human Development, Berlin, Germany},| \par
+% |{College of Education, University of Georgia}}| \par
+% \noindent Three or more authors, different affiliations \par
+% |\authorsnames[1,{2,3},1]{Savannah C. St. John, Fen-Lei Chang, Carlos O. Vásquez III}| \par
+% |\authorsaffiliations{{Education Testing Service, Princeton, New Jersey, ...},| \par
+% |{MRC Cognition and Brain Science Unit, Cambridge, England},| \par
+% |{Department of Psychology, University of Cambridge}}| \par
+%
+%
+% \subsubsection{Title Page Information}
+% \label{sec:titlepageinfo}
+% \begin{itemize}
% \item \DescribeMacro{\course}|\course|\marg{course-number-name}: The
% course number and name (e.g. PSYC 3170: Clinical Psychology)
% \item \DescribeMacro{\professor}|\professor|\marg{professor}: The
@@ -436,22 +520,7 @@ and the derived files apa7.ins,
% \begin{itemize}
% \item \DescribeMacro{\note}|\note|\marg{note-text}: Notation of
% manuscript date or other information desired beneath the
-% affiliation line
-% \item \DescribeMacro{\journal}|\journal|\marg{journal-name}: Journal
-% name or other note; typeset in the top left header of page 1
-% (|jou| and |doc| modes only); to change the starting page to a
-% number other than 1, insert the following line immediately after
-% |\maketitle|:\\
-% |\setcounter{page}|\marg{custom-page-number}
-% \item \DescribeMacro{\volume}|\volume|\marg{journal-volume}: Volume,
-% number, pages; typeset in the top left header in |jou| and |doc|
-% modes, underneath the content of |\journal|
-% \item \DescribeMacro{\ccoppy}|\ccoppy|\marg{copright-notice}:
-% Copyright notice, etc.; typeset in the top right header of page 1
-% (|jou| and |doc| modes only)
-% \item \DescribeMacro{\copnum}|\copnum|\marg{more-copyright-info}:
-% Any additional text needed; typeset in the top right header in
-% |jou| and |doc| modes, underneath the content of |\ccoppy|
+% affiliation line (not part of the APA 7th edition specification for title page)
% \end{itemize}
%
% \subsection{Maketitle}
@@ -543,6 +612,12 @@ and the derived files apa7.ins,
% | \centering|\par\vspace{-.5em}
% | \begin{threeparttable}|\par
% \item
+% \DescribeMacro{\figurenote}|\figurenote|\marg{figure-note-text}:
+% Formats figure note when placed after |\includegraphic|, |\fitfigure|, or similar command within |\begin{figure}| and |\end{figure}|.
+% \item
+% \DescribeMacro{\tablenote}|\tablenote|\marg{table-note-text}:
+% Formats table note when placed after |\end{tabular}| or similar command within |\begin{table}| and |\end{table}|.
+% \item
% \DescribeMacro{\fitfigure}|\fitfigure|\oarg{height}\marg{eps-filename}:
% Automatically fit a postscript figure; use instead of
% |\includegraphics|
@@ -577,8 +652,6 @@ and the derived files apa7.ins,
%
% \section{Known Limitations}
% \begin{itemize}
-% \item There is a limit of six affiliations for authors (but an
-% unlimited number of authors across those six affiliations).
% \item The |APAenumerate| environment does not nest properly.
% \end{itemize}
%
@@ -915,9 +988,7 @@ and the derived files apa7.ins,
Probabilistic & 80 & 20\tabfnm{*} & 200 \\
Categorical -- coda\tabfnm{b} & 0 & 100\tabfnm{*} & 196 \\ \midrule
\end{tabular}
- \begin{tablenotes}[para,flushleft]
- {\small
- \textit{Note.} All data are approximate.
+ \tablenote{All data are approximate.
\tabfnt{a}Categorical may be onset.
\tabfnt{b}Categorical may also be coda.
@@ -925,7 +996,6 @@ and the derived files apa7.ins,
\tabfnt{*}\textit{p} < .05.
\tabfnt{**}\textit{p} < .01.
}
- \end{tablenotes}
\end{threeparttable}
\end{table}
@@ -1384,9 +1454,11 @@ and the derived files apa7.ins,
% Based on handling of the same issue in apacite.sty
% First define the default American English macros in case no external file is present or needed
+\def\lastauthorseparator{and}
\def\acksname{Author Note}
\def\keywordname{Keywords}
\def\notesname{Footnotes}
+\def\notelabel{Note}
\AtBeginDocument{% so that we know what language is active in babel
@@ -1763,17 +1835,20 @@ and the derived files apa7.ins,
\DeclareCaptionLabelFormat{tablelabel}{\hspace{-\parindent}\raggedright\textbf{#1 #2}}
\DeclareCaptionLabelFormat{figurelabel}{\hspace{-\parindent}\raggedright\textbf{#1 #2}}
\DeclareCaptionTextFormat{tabletext}{\hspace{-\parindent}\raggedright\textit{#1}}
+ \DeclareCaptionLabelSeparator{apalabelsep}{\\}
}{% jou
\DeclareCaptionLabelFormat{tablelabel}{\hspace{-\parindent}\raggedright\textbf{#1 #2}}
\DeclareCaptionLabelFormat{figurelabel}{\hspace{-\parindent}\raggedright\textbf{#1 #2}}
\DeclareCaptionTextFormat{tabletext}{\hspace{-\parindent}\textit{#1}}
+ \DeclareCaptionLabelSeparator{apalabelsep}{\\ \\}
}{% doc
\DeclareCaptionLabelFormat{tablelabel}{\hspace{-\parindent}\raggedright\textbf{#1 #2}}
\DeclareCaptionLabelFormat{figurelabel}{\hspace{-\parindent}\raggedright\textbf{#1 #2}}
\DeclareCaptionTextFormat{tabletext}{\hspace{-\parindent}\raggedright\textit{#1}}
+ \DeclareCaptionLabelSeparator{apalabelsep}{\\ \\}
}
-\captionsetup[table]{position=above,skip=0pt,labelformat=tablelabel,labelsep=newline,textformat=tabletext}
-\captionsetup[figure]{position=above,skip=0pt,labelformat=figurelabel,labelsep=newline,textfont=it}
+\captionsetup[table]{position=above,skip=0pt,labelformat=tablelabel,labelsep=apalabelsep,textformat=tabletext}
+\captionsetup[figure]{position=above,skip=0pt,labelformat=figurelabel,labelsep=apalabelsep,textfont=it}
% space between caption and surrounding document text
% \setlength{\belowcaptionskip}{0pt}
@@ -1785,6 +1860,12 @@ and the derived files apa7.ins,
%
%=============================================================
+\newcommand{\figurenote}[1]{\par \small \textit{\notelabel.} {#1}}
+\newcommand{\tablenote}[1]{\begin{tablenotes}[para,flushleft]
+ {\small
+ \textit{\notelabel.} {#1}
+ }
+ \end{tablenotes}}
% Code from theapa.sty
@@ -1829,42 +1910,24 @@ and the derived files apa7.ins,
%===== apa.cls main declarations for title page contents =====
\long\def\title#1{\long\def\@title{#1}}
-\long\def\author#1{\long\def\@author{#1}}
+\long\def\author#1{\authorsnames{#1}}
+\long\def\affiliation#1{\ClassWarning{apa7}{Deprecated: see documentation for \string\authorsaffiliations}\authorsaffiliations{#1}}
+\long\def\twoauthors#1#2{\ClassError{apa7}{Deprecated: see documentation for \string\authorsnames}{For multiple authors use \string\authorsnames}}
+\long\def\threeauthors#1#2#3{\ClassError{apa7}{Deprecated: see documentation for \string\authorsnames}{For multiple authors use \string\authorsnames}}
+\long\def\onetwoauthors#1#2#3{\ClassError{apa7}{Deprecated: see documentation for \string\authorsnames}{For multiple authors use \string\authorsnames}}
+\long\def\twooneauthors#1#2#3{\ClassError{apa7}{Deprecated: see documentation for \string\authorsnames}{For multiple authors use \string\authorsnames}}
+\long\def\fourauthors#1#2#3#4{\ClassError{apa7}{Deprecated: see documentation for \string\authorsnames}{For multiple authors use \string\authorsnames}}
+\long\def\fiveauthors#1#2#3#4#5{\ClassError{apa7}{Deprecated: see documentation for \string\authorsnames}{For multiple authors use \string\authorsnames}}
+\long\def\sixauthors#1#2#3#4#5#6{\ClassError{apa7}{Deprecated: see documentation for \string\authorsnames}{For multiple authors use \string\authorsnames}}
+\long\def\twoaffiliations#1#2{\ClassError{apa7}{Deprecated: see documentation for \string\authorsaffiliations}{For multiple affiliations use \string\authorsaffiliations}}
+\long\def\threeaffiliations#1#2#3{\ClassError{apa7}{Deprecated: see documentation for \string\authorsaffiliations}{For multiple affiliations use \string\authorsaffiliations}}
+\long\def\fouraffiliations#1#2#3#4{\ClassError{apa7}{Deprecated: see documentation for \string\authorsaffiliations}{For multiple affiliations use \string\authorsaffiliations}}
+\long\def\fiveaffiliations#1#2#3#4#5{\ClassError{apa7}{Deprecated: see documentation for \string\authorsaffiliations}{For multiple affiliations use \string\authorsaffiliations}}
+\long\def\sixaffiliations#1#2#3#4#5#6{\ClassError{apa7}{Deprecated: see documentation for \string\authorsaffiliations}{For multiple affiliations use \string\authorsaffiliations}}
\long\def\course#1{\long\def\@course{#1}}
\long\def\professor#1{\long\def\@professor{#1}}
\long\def\duedate#1{\long\def\@duedate{#1}}
\long\def\shorttitle#1{\long\def\@shorttitle{#1}}
-\long\def\twoauthors#1#2{\long\def\@authorOne{#1}\long\def\@authorTwo{#2}%
- \long\def\@author{#1}}
-\long\def\onetwoauthors#1#2#3{\long\def\@authorOne{#1}\long\def\@authorTwo{#2}%
- \long\def\@authorThree{#3}\long\def\@author{#1}}
-\long\def\twooneauthors#1#2#3{\long\def\@authorOne{#1}\long\def\@authorTwo{#2}%
- \long\def\@authorThree{#3}\long\def\@author{#1}\def\@twofirst{1}}
-\let\threeauthors=\onetwoauthors
-\long\def\fourauthors#1#2#3#4{\long\def\@authorOne{#1}\long\def\@authorTwo{#2}%
- \long\def\@authorThree{#3}\long\def\@authorFour{#4}\long\def\@author{#1}}
-\long\def\fiveauthors#1#2#3#4#5{\long\def\@authorOne{#1}\long\def\@authorTwo{#2}%%%%
- \long\def\@authorThree{#3}\long\def\@authorFour{#4}\long\def\@authorFive{#5}% %%
- \long\def\@author{#1}} %% 2006/01/05 -- added as contributed by Aaron Geller %%
-\long\def\sixauthors#1#2#3#4#5#6{\long\def\@authorOne{#1}% %% thp 2006/01/05
- \long\def\@authorTwo{#2}\long\def\@authorThree{#3}\long\def\@authorFour{#4}%% thp 2006/01/05
- \long\def\@authorFive{#5}\long\def\@authorSix{#6}\long\def\@author{#1}} %% thp 2006/01/05
-\long\def\affiliation#1{\long\def\@affil{#1}}
-\long\def\twoaffiliations#1#2{\long\def\@affilOne{#1}\long\def\@affilTwo{#2}%
-\long\def\@affil{#1}}
-\long\def\onetwoaffiliations#1#2#3{\long\def\@affilOne{#1}\long\def\@affilTwo{#2}%
- \long\def\@affilThree{#3}\long\def\@affil{#1}}
-\long\def\twooneaffiliations#1#2#3{\long\def\@affilOne{#1}\long\def\@affilTwo{#2}%
- \long\def\@affilThree{#3}\long\def\@affil{#1}}
-\let\threeaffiliations=\onetwoaffiliations
-\long\def\fouraffiliations#1#2#3#4{\long\def\@affilOne{#1}\long\def\@affilTwo{#2}%
- \long\def\@affilThree{#3}\long\def\@affilFour{#4}\long\def\@affil{#1}}
-\long\def\fiveaffiliations#1#2#3#4#5{\long\def\@affilOne{#1}\long\def\@affilTwo{#2}%%
- \long\def\@affilThree{#3}\long\def\@affilFour{#4}\long\def\@affilFive{#5}% %%
- \long\def\@affil{#1}} %% 2006/01/05 -- added as contributed by Aaron Geller %%
-\long\def\sixaffiliations#1#2#3#4#5#6{\long\def\@affilOne{#1}% %% thp 2006/01/05
- \long\def\@affilTwo{#2}\long\def\@affilThree{#3}\long\def\@affilFour{#4}%% thp 2006/01/05
- \long\def\@affilFive{#5}\long\def\@affilSix{#6}\long\def\@affil{#1}} %% thp 2006/01/05
\long\def\note#1{\long\def\@note{#1}}
\long\def\abstract#1{\long\def\@abstract{#1}}
\long\def\keywords#1{\long\def\@keywords{#1}}
@@ -1874,50 +1937,147 @@ and the derived files apa7.ins,
\def\volume#1{\def\@vvolume{#1}}
\def\ccoppy#1{\def\@ccoppy{#1}}
\def\copnum#1{\def\@copnum{#1}}
-\def\@error@toomanyauthors{\ClassWarningNoLine{apa7}{More authors than affiliations defined}}
-\def\@error@toomanyaffils{\ClassWarningNoLine{apa7}{More affiliations than authors defined}}
+
+% Combined code from https://tex.stackexchange.com/questions/297507/how-to-apply-a-do-function-to-two-lists and
+% https://www.dickimaw-books.com/latex/admin/html/exercises/oxfordcomma.shtml
+
+% Create etoolbox lists for multiple authors and affiliations
+\newcommand*\listauthors{}
+\newcommand*\listsuperscripts{}
+\newcommand*\listaffiliations{}
+
+\newcommand*{\authorsnames}[2][]{
+ \def\def@multipleauthors{\@multipleauthorsmode} %
+ \renewcommand*\listauthors{}
+ \renewcommand*\listsuperscripts{}
+ \newcounter{NumberOfAuthors}
+ \newcounter{NumberOfSuperscripts}
+ \forcsvlist{\stepcounter{NumberOfAuthors}\listadd\listauthors}{#2}
+ \forcsvlist{\stepcounter{NumberOfSuperscripts}\listadd\listsuperscripts}{#1}
+ }
+
+ \newcommand*{\authorsaffiliations}[1]{
+ \def\def@multipleaffils{\@multipleaffilsmode} %
+ \renewcommand*\listaffiliations{}
+ \newcounter{NumberOfAffiliations}
+ \forcsvlist{\stepcounter{NumberOfAffiliations}\listadd\listaffiliations}{#1}
+ }
+
+\makeatletter
+ \catcode`\|=3
+
+\def\looptwo#1#2{%
+ \edef\tmp{\noexpand\xtwo%
+ \unexpanded\expandafter{#1}\relax % no added delimiter here
+ \unexpanded\expandafter{#2}\relax % no added delimiter here
+ } \tmp%
+ }%
+
+\def\xtwo#1|#2\relax#3|#4\relax{%
+ \dotwo{#1}{#3}%
+ \def\tmp{#2}%
+ \ifx\empty\tmp%
+ \expandafter\@gobble%
+ \else%
+ \expandafter\@firstofone%
+ \fi%
+ {\xtwo#2\relax#4\relax}%
+ }%
+
+ \catcode`\|=12
+\makeatother
+
+\newcommand*{\dotwo}[2]{}
+
+\newcommand*{\authorsep}{}%
+\newcommand*{\lastauthor}{}%
+\newcommand*{\prelastauthor}{}%
+\newcommand*{\prelastauthorsep}{}%
+
+\newcommand{\displayauthors}{%
+ \renewcommand*{\authorsep}{}%
+ \renewcommand*{\lastauthor}{}%
+ \renewcommand*{\prelastauthor}{}%
+ \renewcommand*{\prelastauthorsep}{}%
+ \ifnum\value{NumberOfSuperscripts}=0% If no superscripts are specified, print authors without superscripts.
+ \renewcommand*{\do}[1]{%
+ \authorsep%
+ \lastauthor%
+ \renewcommand{\lastauthor}{%
+ \renewcommand{\authorsep}{,
+ \renewcommand*{\prelastauthorsep}{,}}%
+ \renewcommand{\prelastauthor}{\prelastauthorsep\ \lastauthorseparator\ }% Terminated commands with \ to preserve following space
+ ##1%
+ }%
+ }%
+ \dolistloop{\listauthors}%
+ \else
+ \renewcommand*{\dotwo}[2]{%
+ \authorsep%
+ \lastauthor%
+ \renewcommand{\lastauthor}{%
+ \renewcommand{\authorsep}{,
+ \renewcommand*{\prelastauthorsep}{,}}%
+ \renewcommand{\prelastauthor}{\prelastauthorsep\ \lastauthorseparator\ }% Terminated commands with \ to preserve following space
+ ##1\textsuperscript{##2}%
+ }%
+ }%
+ \looptwo\listauthors\listsuperscripts%
+ \fi
+ \prelastauthor \lastauthor%
+}
+
+\newcommand{\displayaffiliations}{%
+ \ifnum\value{NumberOfSuperscripts}=0% If no superscripts are specified, print affiliations without superscripts.
+ \renewcommand*{\do}[1]{%
+ ##1\\%
+ }%
+ \else
+ \newcounter{AffiliationNumber}
+ \renewcommand*{\do}[1]{%
+ \stepcounter{AffiliationNumber}
+ \textsuperscript{\arabic{AffiliationNumber}}##1\\%
+ }%
+ \fi
+ \dolistloop{\listaffiliations}%
+}
+
+\makeatletter
+
\def\check@author{%
- \@ifundefined{@author}{%
- \ClassWarningNoLine{apa7}{Author not defined}\def\@author{Author}}{}
+ \@ifundefined{def@multipleauthors}{%
+ \ClassWarningNoLine{apa7}{Author not defined}\authorsnames{Author}}{}
\@ifundefined{@title}{%
\ClassWarningNoLine{apa7}{Title not defined}\def\@title{Title}}{}
- \@ifundefined{@affil}{%
- \ClassWarningNoLine{apa7}{Affiliation not defined}\def\@affil{Affiliation}}{}
- \@ifundefined{def@stu}{%
+ \@ifundefined{def@multipleaffils}{%
+ \ClassWarningNoLine{apa7}{Affiliation not defined}\authorsaffiliations{Affiliation}}{}
+ \@ifundefined{def@stu}{% man mode
\@ifundefined{@shorttitle}{%
\ClassWarningNoLine{apa7}{Short title not defined}\def\@shorttitle{INSERT SHORTTITLE COMMAND IN PREAMBLE}}{}
\@ifundefined{@abstract}{%
\ClassWarningNoLine{apa7}{Abstract not defined}}{}
\@ifundefined{@keywords}{%
\ClassInfo{apa7}{Keywords not defined}}{}
- }{
+ }{ % stu mode
\@ifundefined{@course}{%
- \ClassWarningNoLine{apa7}{Course title not defined}}{}
+ \ClassWarningNoLine{apa7}{Course title not defined}\def\@course{Course Title}}{}
\@ifundefined{@professor}{%
- \ClassWarningNoLine{apa7}{Professor not defined}}{}
+ \ClassWarningNoLine{apa7}{Professor not defined}\def\@professor{Professor Name}}{}
\@ifundefined{@duedate}{%
- \ClassInfo{apa7}{Due date not defined}}{}
+ \ClassWarningNoLine{apa7}{Due date not defined}\def\@duedate{Due Date}}{}
+ \@ifundefined{@shorttitle}{%
+ \def\@shorttitle{}}{}%
}
- \@ifundefined{@authorSix}{% % -- thp 2006/01/05
- \@ifundefined{@authorFive}{% % -- thp 2006/01/05
- \@ifundefined{@authorFour}{%
- \@ifundefined{@authorThree}{%
- \@ifundefined{@authorTwo}{%
- }{\@ifundefined{@affilTwo}{\@error@toomanyauthors}{}}
- }{\@ifundefined{@affilThree}{\@error@toomanyauthors}{}}
- }{\@ifundefined{@affilFour}{\@error@toomanyauthors}{}}
- }{\@ifundefined{@affilFive}{\@error@toomanyauthors}{}} % -- thp 2006/01/05
- }{\@ifundefined{@affilSix}{\@error@toomanyauthors}{}} % -- thp 2006/01/05
- \@ifundefined{@affilSix}{% % -- thp 2006/01/05
- \@ifundefined{@affilFive}{% % -- thp 2006/01/05
- \@ifundefined{@affilFour}{%
- \@ifundefined{@affilThree}{%
- \@ifundefined{@affilTwo}{%
- }{\@ifundefined{@authorTwo}{\@error@toomanyaffils}{}}
- }{\@ifundefined{@authorThree}{\@error@toomanyaffils}{}}
- }{\@ifundefined{@authorFour}{\@error@toomanyaffils}{}}
- }{\@ifundefined{@authorFive}{\@error@toomanyaffils}{}} % -- thp 2006/01/05
- }{\@ifundefined{@authorSix}{\@error@toomanyaffils}{}} % -- thp 2006/01/05
+ \@ifundefined{def@multipleauthors}{}{%
+ \ifnum\value{NumberOfSuperscripts}=0%
+ % do nothing. If no superscripts are specified, print authors and affiliations without superscripts.
+ \else \ifnum\value{NumberOfAuthors}=\value{NumberOfSuperscripts}%
+ % do nothing
+ \else
+ \ClassError{apa7}{Number of Authors does not match number of Superscripts}{Please provide an equal number of authors and superscripts.}
+ \fi
+ \fi
+ }%
}
%==== Automatic figure size and orientation determination ====
@@ -2183,7 +2343,6 @@ and the derived files apa7.ins,
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}
-\@ifundefined{def@stu}{ %Professional manuscript
\fancypagestyle{titlepage}{%
\lhead{\MakeUppercase{\@shorttitle}}%
\rhead{\thepage}%
@@ -2192,15 +2351,7 @@ and the derived files apa7.ins,
\lhead{\MakeUppercase{\@shorttitle}}%
\rhead{\thepage}%
}
-\pagestyle{otherpage}}{ %Student manuscript
-\fancypagestyle{titlepage}{%
- \rhead{\thepage}%
-}
-\fancypagestyle{otherpage}{%
- \rhead{\thepage}%
-}
\pagestyle{otherpage}
-}
%========== Alterations to endnotes ===================
@@ -2421,97 +2572,27 @@ and the derived files apa7.ins,
\begin{center}
- \vspace*{0.5in}
+
% \makebox[\linewidth][l]{\rheadname\hspace{0.1in}\MakeUppercase{\r@headr}}\\ %thp090298
- \vspace*{1in}
+ \vspace*{4\baselineskip}
\textbf\@title%
\ifapamodeman{%
\@ifundefined{def@noextraspace}{%
- \vspace{0.25in}\\
- }{}
+ \vspace{\baselineskip}\\
+ }{\\}
}{%
- \vspace{0.25in}\\
+ \vspace{\baselineskip}\\
}
\@ifundefined{def@stu}{ %Professional manuscript
\@ifundefined{apaSeven@maskauthoridentity}{% BDB
+
+ \displayauthors \\
+ \displayaffiliations
- \@ifundefined{@authorTwo}{
- \@author \\
-
- \@affil \vspace{0.25in} \\ }{
- \@ifundefined{@authorThree}{
- \@authorOne \\
-
- \@affilOne \vspace{0.2in} \\
- \@authorTwo \\
-
- \@affilTwo \vspace{0.25in} \\ }{
- \@ifundefined{@authorFour}{
- \@authorOne \\
-
- \@affilOne \vspace{0.2in} \\
- \@authorTwo \\
-
- \@affilTwo \vspace{0.2in} \\
- \@authorThree \\
-
- \@affilThree \vspace{0.25in} \\ }{
- \@ifundefined{@authorFive}{ %% 2006/01/05 added as contributed by Aaron Geller
- \@authorOne \\
-
- \@affilOne \vspace{0.2in} \\
- \@authorTwo \\
-
- \@affilTwo \vspace{0.2in} \\
- \@authorThree \\
-
- \@affilThree \vspace{0.2in} \\
- \@authorFour \\
-
- \@affilFour \vspace{0.25in} \\ }{ %% 2006/01/05 beginning of Aaron Geller contribution
- \@ifundefined{@authorSix}{ %% -- thp 2006/01/05
- \@authorOne \\
-
- \@affilOne \vspace{0.2in} \\
- \@authorTwo \\
-
- \@affilTwo \vspace{0.2in} \\
- \@authorThree \\
-
- \@affilThree \vspace{0.2in} \\
- \@authorFour \\
-
- \@affilFour \vspace{0.2in} \\ %% thp corrected distance to non-final value of 0.2in
- \@authorFive \\
-
- \@affilFive \vspace{0.25in} \\ }{%% 2006/01/05 end of Aaaron Geller contribution
- %% --- thp 2006/01/05 beginning of six-author display
- \@authorOne \\
-
- \@affilOne \vspace{0.2in} \\
- \@authorTwo \\
-
- \@affilTwo \vspace{0.2in} \\
- \@authorThree \\
-
- \@affilThree \vspace{0.2in} \\
- \@authorFour \\
-
- \@affilFour \vspace{0.2in} \\
- \@authorFive \\
-
- \@affilFive \vspace{0.2in} \\
- \@authorSix \\
-
- \@affilSix \vspace{0.25in} \\ }}}}}
- %% --- thp 2006/01/05 end of six-author display
- \@ifundefined{@note}{}{
- \vfill
- \section{\normalfont\normalsize\textbf\acksname}
- \raggedright
- \setlength{\parindent}{0.5in}
- \indent\@note\par}
+ \@ifundefined{@note}
+ {\vspace*{\baselineskip} }
+ {\@note}
}{% mask author identity -- show nothing in the author or author note space
}
@@ -2530,32 +2611,36 @@ and the derived files apa7.ins,
}
}{% mask author identity -- show nothing in the author or author note space
}}{% Student Manuscript
- \@author \\
-
- \@affil \\
+ \@ifundefined{apaSeven@maskauthoridentity}{% BDB
+ \displayauthors \\
+
+ \displayaffiliations
+ }{% mask author identity -- show nothing in the author or affiliations space
+ }
\@course \\
\@professor \\
\@duedate \\
- \@ifundefined{@note}{}{
- \vfill
- \section{\normalfont\normalsize\textbf\acksname}
- \raggedright
- \setlength{\parindent}{0.5in}
- \indent\@note\par}
+ \@ifundefined{apaSeven@maskauthoridentity}{% BDB
+ \@ifundefined{@note}
+ {\vspace*{\baselineskip} }
+ {\@note}
+ }{% mask author identity -- show nothing in the note space
+ }
\end{center}
\@ifundefined{@acks}
{}
{%
- \vfill%
- \begin{center}%
- \acksname%
- \end{center}%
- \protect\raggedright
- \setlength{\parindent}{0.5in}
- \indent\par\@acks%
+ \@ifundefined{apaSeven@maskauthoridentity}{% BDB
+ \vfill%
+ \section{\normalfont\normalsize\textbf\acksname}
+ \raggedright
+ \setlength{\parindent}{0.5in}
+ \indent\@acks\par%
+ }{% mask author identity -- show nothing in the author note space
+ }
}
}
@@ -2682,6 +2767,11 @@ and the derived files apa7.ins,
\@ifundefined{def@jou}{}{%
+\renewcommand{\addORCIDlink}[2]{\href{https://orcid.org/#2}{{\mbox{\scalerel*{
+\begin{tikzpicture}[yscale=-1,transform shape]
+\pic{orcidlogo};
+\end{tikzpicture}
+}{|}}} #1}}
%========== balance last-page columns =================
@@ -2707,56 +2797,10 @@ and the derived files apa7.ins,
\def\r@headr{\protect\MakeUppercase{\protect\scriptsize\@shorttitle}}% BDB
%%%%%%%%%%%%%%%%%%%%%%%\def\shorttitle#1{\def\r@headr{\protect\MakeUppercase{\protect\scriptsize #1}}}% BDB
-\def\put@one@authaffil#1#2{%
- \parbox[t]{\textwidth}{\begin{center}{\large #1\vspace{0in}}%
- {\\ #2\vspace{0.05in}\\}\end{center}}}
-
-\newsavebox\auone@box
-\newsavebox\autwo@box
-\newsavebox\autot@box
-\newlength\auone@boxwidth
-\newlength\autwo@boxwidth
-\newlength\autot@boxwidth
-
-\def\default@d@authaffil#1#2#3#4{%
- \parbox[t]{\columnwidth}{\begin{center}{\large #1\vspace{0in}}%
- {\\ #2\vspace{0.05in}\\}\end{center}}%
- \parbox[t]{\columnwidth}{\begin{center}{\large #3\vspace{0in}}%
- {\\ #4\vspace{0.05in}\\}\end{center}}}
-
-\def\uneven@d@authaffil#1#2#3#4{%
- \hfill\parbox[t]{\auone@boxwidth}{\begin{center}{\large #1\vspace{0in}}%
- {\\ #2\vspace{0.05in}\\}\end{center}}\hfill\hfill%
- \parbox[t]{\autwo@boxwidth}{\begin{center}{\large #3\vspace{0in}}%
- {\\ #4\vspace{0.05in}\\}\end{center}}\hfill}
-
-\def\put@two@authaffil#1#2#3#4{%
- \let\disp@authaffil\default@d@authaffil
- \sbox\auone@box{\begin{tabular}{c}\large #1\\ #2\end{tabular}}
- \settowidth{\auone@boxwidth}{\usebox\auone@box}
- \sbox\autwo@box{\begin{tabular}{c}\large #3\\ #4\end{tabular}}
- \settowidth{\autwo@boxwidth}{\usebox\autwo@box}
- \ifdim\auone@boxwidth<1.25\columnwidth
- \ifdim\autwo@boxwidth<1.25\columnwidth
- \sbox\autot@box{\usebox\auone@box\hspace{0.4in}\usebox\autwo@box}
- \settowidth{\autot@boxwidth}{\usebox\autot@box}
- \ifdim\autot@boxwidth<\textwidth
- \let\disp@authaffil\uneven@d@authaffil
- \fi
- \fi
- \fi
- \ifdim\auone@boxwidth<\columnwidth
- \ifdim\autwo@boxwidth<\columnwidth
- \let\disp@authaffil\default@d@authaffil
- \fi
- \fi
- \disp@authaffil{#1}{#2}{#3}{#4}
-}
-
\def\maketitle{
\check@author
\@ifundefined{r@headr}{\def\r@headr{\protect\MakeUppercase{\protect\scriptsize\@title}}}{}
- \@ifundefined{r@headl}{\def\r@headl{\protect\MakeUppercase{\protect\scriptsize\@author}}}{}
+ \@ifundefined{r@headl}{\def\r@headl{ADD \\LEFTHEADER COMMAND}}{}
\twocolumn[ % anything appearing within the brackets is set in one-column mode
\vspace{0.03in}
@@ -2767,42 +2811,10 @@ and the derived files apa7.ins,
\@ifundefined{apaSeven@maskauthoridentity}{% BDB
- \@ifundefined{@authorTwo}{
- % one author-affiliation
- \put@one@authaffil{\@author}{\@affil}}{
- \@ifundefined{@authorThree}{
- % two authors-affiliations
- \put@two@authaffil{\@authorOne}{\@affilOne}{\@authorTwo}{\@affilTwo}}{
- \@ifundefined{@authorFour}{
- % three authors-affiliations
- \@ifundefined{@twofirst}{
- % first one, then two
- \put@one@authaffil{\@authorOne}{\@affilOne}\vspace{-0.15in}\\
- \put@two@authaffil{\@authorTwo}{\@affilTwo}{\@authorThree}{\@affilThree}
- }{
- % first two, then one
- \put@two@authaffil{\@authorOne}{\@affilOne}{\@authorTwo}{\@affilTwo}\vspace{-0.15in}\\
- \put@one@authaffil{\@authorThree}{\@affilThree}
- }}{
- \@ifundefined{@authorFive}{ % 2006/01/05 as contributed by Aaron Geller
- % four authors-affiliations
- \put@two@authaffil{\@authorOne}{\@affilOne}{\@authorTwo}{\@affilTwo}\vspace{-0.15in}\\
- \put@two@authaffil{\@authorThree}{\@affilThree}{\@authorFour}{\@affilFour}
- }{ % 2006/01/05 beginning of Aaron Geller contribution
- \@ifundefined{@authorSix}{ % -- thp 2006/01/05
- % five authors-affiliations
- \put@two@authaffil{\@authorOne}{\@affilOne}{\@authorTwo}{\@affilTwo}\vspace{-0.15in}\\
- \put@two@authaffil{\@authorThree}{\@affilThree}{\@authorFour}{\@affilFour}%
- \vspace{-0.15in}\\ % thp added negative vertical space
- \put@one@authaffil{\@authorFive}{\@affilFive}
- }{ % 2006/01/05 end of Aaron Geller contribution
- % six authors-affiliations
- %% --- thp 2006/01/05 beginning of six-author display
- \put@two@authaffil{\@authorOne}{\@affilOne}{\@authorTwo}{\@affilTwo}\vspace{-0.15in}\\
- \put@two@authaffil{\@authorThree}{\@affilThree}{\@authorFour}{\@affilFour}\vspace{-0.15in}\\
- \put@two@authaffil{\@authorFive}{\@affilFive}{\@authorSix}{\@affilSix}
- %% --- thp 2006/01/05 end of six-author display
- }}}}}
+ \parbox[t]{\textwidth}{\begin{center}{\large \displayauthors\vspace{0in}}%
+
+ {\displayaffiliations\vspace{0.05in}}\end{center}}
+
\@ifundefined{@note}
{\vspace{0.07in}}
{\vspace{0.07in}\\ {\large\@note\vspace{0.07in}}}
@@ -3063,87 +3075,9 @@ and the derived files apa7.ins,
\vspace{0.3in}
\@ifundefined{apaSeven@maskauthoridentity}{% BDB
- \@ifundefined{@authorTwo}{
- % one author-affiliation
- {\Large \@author} \\
-
- \@affil \vspace{0.1in} \\ }{
- \@ifundefined{@authorThree}{
- % two authors-affiliations
- {\Large \@authorOne} \\
-
- \@affilOne \vspace{0.1in} \\
- {\Large \@authorTwo}\\
-
- \@affilTwo \vspace{0.1in} \\ }{
- \@ifundefined{@authorFour}{
- % three authors-affiliations
- {\Large \@authorOne} \\
-
- \@affilOne \vspace{0.1in} \\
- {\Large \@authorTwo}\\
-
- \@affilTwo \vspace{0.1in} \\
- {\Large \@authorThree}\\
-
- \@affilThree \vspace{0.1in} \\ }{
- \@ifundefined{@authorFive}{ %% 2006/01/05 added as contributed by Aaron Geller
- % four authors-affiliations
- {\Large \@authorOne} \\
-
- \@affilOne \vspace{0.1in} \\
- {\Large \@authorTwo}\\
-
- \@affilTwo \vspace{0.1in} \\
- {\Large \@authorThree}\\
-
- \@affilThree \vspace{0.1in} \\
- {\Large \@authorFour}\\
-
- \@affilFour \vspace{0.1in} \\ }{ %%% 2006/01/05 beginning of Aaron Geller contribution
- \@ifundefined{@authorSix}{ %% -- thp 2006/01/05
- % five authors-affiliations
- {\Large \@authorOne} \\
+ {\Large \displayauthors} \\
- \@affilOne \vspace{0.1in} \\
- {\Large \@authorTwo}\\
-
- \@affilTwo \vspace{0.1in} \\
- {\Large \@authorThree}\\
-
- \@affilThree \vspace{0.1in} \\
- {\Large \@authorFour}\\
-
- \@affilFour \vspace{0.1in} \\
- {\Large \@authorFive}\\
-
- \@affilFive \vspace{0.1in} \\ }{ %%% 2006/01/05 end of Aaron Geller contribution
- % six authors-affiliations
- %% --- thp 2006/01/05 beginning of six-author display
- {\Large \@authorOne} \\
-
- \@affilOne \vspace{0.1in} \\
- {\Large \@authorTwo}\\
-
- \@affilTwo \vspace{0.1in} \\
- {\Large \@authorThree}\\
-
- \@affilThree \vspace{0.1in} \\
- {\Large \@authorFour}\\
-
- \@affilFour \vspace{0.1in} \\
- {\Large \@authorFive}\\
-
- \@affilFive \vspace{0.1in} \\
- {\Large \@authorSix}\\
-
- \@affilSix \vspace{0.1in} \\ }
- %% --- thp 2006/01/05 end of six-author display
- }}}}
- %
- \@ifundefined{@note}
- {\vspace*{\baselineskip} }
- {\@note\vspace{0.2in}}
+ \displayaffiliations \vspace{0.1in}
}{% mask author identity -- show nothing in the author note space
}
@@ -3481,8 +3415,8 @@ and the derived files apa7.ins,
\title{Sample APA-Style Document Using the \textsf{apa7} Package}
-\author{Daniel A. Weiss}
-\affiliation{A University Somewhere}
+\authorsnames{Daniel A. Weiss}
+\authorsaffiliations{Departement of Psychology, A University Somewhere}
\leftheader{Weiss}
@@ -3493,24 +3427,31 @@ and the derived files apa7.ins,
\keywords{APA style, demonstration}
+\authornote{\addORCIDlink{Daniel A. Weiss}{0000-0000-0000-0000}, Department of Psychology, A University Somewhere
+
+Changes of Affiliations and other info here to describe what needs to be said}
+
\begin{document}
\maketitle
We begin with \textcite{Shotton1989}. We can also cite this work in
-parenthesis, like this: \parencite{Shotton1989}.
-
-A three-author paper \parencite[e.g.,][]{Lassen2006} lists all
-three authors for the first citation, then only the first author
-on all subsequent citations \parencite{Lassen2006}.
+parenthesis, like this: \parencite{Lassen2006}.
Note the use of five heading levels throughout this demonstration
Method section.
\section{Method}
\subsection{Participants}
-We had a lot of people in this study.
+We had a lot of people in this study, show in Figure \ref{fig:Figure1}.
+
+\begin{figure}[!htp]
+ \caption{This is my figure caption.}
+ \includegraphics[bb=0in 0in 2.5in 2.5in, height=1.4in, width=1.4in]{Figure1.pdf}
+ \figurenote{This is an awesome figure.}
+ \label{fig:Figure1}
+\end{figure}
\subsection{Materials}
-Several materials were used for this project. Some of themwere
+Several materials were used for this project. Some of them were
already created for prior research.
\subsubsection{Paper-and-Pencil Instrument}
@@ -3552,9 +3493,7 @@ statistical prowess in analyzing these data is unmatched.
Probabilistic & 80 & 20\tabfnm{*} & 200 \\
Categorical -- coda\tabfnm{b} & 0 & 100\tabfnm{*} & 196 \\ \midrule
\end{tabular}
- \begin{tablenotes}[para,flushleft]
- {\small
- \textit{Note.} All data are approximate.
+ \tablenote{All data are approximate.
\tabfnt{a}Categorical may be onset.
\tabfnt{b}Categorical may also be coda.
@@ -3562,7 +3501,6 @@ statistical prowess in analyzing these data is unmatched.
\tabfnt{*}\textit{p} < .05.
\tabfnt{**}\textit{p} < .01.
}
- \end{tablenotes}
\end{threeparttable}
\end{table}
@@ -3595,8 +3533,8 @@ skill in interpreting the results for the masses.
\title{Sample APA-Style Document Using the \textsf{apa7} Package}
\shorttitle{Sample Document}
-\author{Daniel A. Weiss}
-\affiliation{A University Somewhere}
+\authorsnames{Daniel A. Weiss}
+\authorsaffiliations{A University Somewhere}
\leftheader{Weiss}
@@ -3675,6 +3613,7 @@ Table~\ref{tab:BasicTable} summarizes the data. \lipsum[15]
\begin{figure}
\caption{This is my first figure caption.}
\includegraphics[bb=0in 0in 2.5in 2.5in, height=2.5in, width=2.5in]{Figure1.pdf}
+ \figurenote{This is a great figure.}
\label{fig:Figure1}
\end{figure}
@@ -3700,6 +3639,7 @@ As shown in Figure~\ref{fig:Figure2}, these results are impressive. \lipsum[20]
\begin{figure}
\caption{This is my second figure caption.}
\includegraphics[bb=0in 0in 2.5in 2.5in, height=2.5in, width=2.5in]{Figure1.pdf}
+ \figurenote{This is a great appendix figure.}
\label{fig:Figure2}
\end{figure}
@@ -3722,9 +3662,7 @@ The detailed results are shown in Table~\ref{tab:DeckedTable}. \lipsum[22]
Probabilistic & 80 & 20\tabfnm{*} & 200 \\
Categorical -- coda\tabfnm{b} & 0 & 100\tabfnm{*} & 196 \\ \midrule
\end{tabular}
- \begin{tablenotes}[para,flushleft]
- {\small
- \textit{Note.} All data are approximate.
+ \tablenote{All data are approximate.
\tabfnt{a}Categorical may be onset.
\tabfnt{b}Categorical may also be coda.
@@ -3732,7 +3670,6 @@ The detailed results are shown in Table~\ref{tab:DeckedTable}. \lipsum[22]
\tabfnt{*}\textit{p} < .05.
\tabfnt{**}\textit{p} < .01.
}
- \end{tablenotes}
\end{threeparttable}
\end{table}
@@ -3749,11 +3686,13 @@ The detailed results are shown in Table~\ref{tab:DeckedTable}. \lipsum[22]
%\begin{macro}{APA7american.txt}
% \begin{macrocode}
%<*american>
-\ProvidesFile{APA7american.txt}[2019/12/29 v1.00 apa7 configuration for American English]
+\ProvidesFile{APA7american.txt}[2020/12/02 v1.02 apa7 configuration for American English]
+\renewcommand{\lastauthorseparator}{and}
\renewcommand{\acksname}{Author Note}
\renewcommand{\keywordname}{Keywords}
\renewcommand{\notesname}{Footnotes}
+\renewcommand{\notelabel}{Note}
%</american>
@@ -3764,11 +3703,13 @@ The detailed results are shown in Table~\ref{tab:DeckedTable}. \lipsum[22]
%\begin{macro}{APA7british.txt}
% \begin{macrocode}
%<*british>
-\ProvidesFile{APA7british.txt}[2019/12/29 v1.00 apa7 configuration for British English]
+\ProvidesFile{APA7british.txt}[2020/12/02 v1.02 apa7 configuration for British English]
+\renewcommand{\lastauthorseparator}{and}
\renewcommand{\acksname}{Author Note}
\renewcommand{\keywordname}{Keywords}
\renewcommand{\notesname}{Footnotes}
+\renewcommand{\notelabel}{Note}
%</british>
@@ -3779,94 +3720,131 @@ The detailed results are shown in Table~\ref{tab:DeckedTable}. \lipsum[22]
%\begin{macro}{APA7english.txt}
% \begin{macrocode}
%<*english>
-\ProvidesFile{APA7english.txt}[2019/12/29 v1.00 apa7 configuration for non-American English]
+\ProvidesFile{APA7english.txt}[2020/12/02 v1.02 apa7 configuration for non-American English]
+\renewcommand{\lastauthorseparator}{and}
\renewcommand{\acksname}{Author Note}
\renewcommand{\keywordname}{Keywords}
\renewcommand{\notesname}{Footnotes}
+\renewcommand{\notelabel}{Note}
%</english>
% \end{macrocode}
%\end{macro}
%
+%
+%\begin{macro}{APA7french.txt}
+% \begin{macrocode}
+%<*french>
+\ProvidesFile{APA7french.txt}[2020/12/02 v1.02 apa7 configuration for French] % translation by lejun[at]gmx.fr
+
+\renewcommand{\lastauthorseparator}{et}% and
+\renewcommand{\acksname}{Note de l'auteur}% Author Note
+\renewcommand{\keywordname}{Mots Clés}% Keywords
+\renewcommand{\notesname}{Notes de bas de page}% Footnotes
+\renewcommand{\notelabel}{Note}%Note
+
+%</french>
+% \end{macrocode}
+%\end{macro}
+%
+%
%\begin{macro}{APA7dutch.txt}
% \begin{macrocode}
%<*dutch>
-\ProvidesFile{APA7dutch.txt}[2019/12/29 v1.00 apa7 configuration for Dutch]
+\ProvidesFile{APA7dutch.txt}[2020/12/02 v1.02 apa7 configuration for Dutch]
+\renewcommand{\lastauthorseparator}{en}% and
\renewcommand{\acksname}{Auteursnoot}% Author Note
\renewcommand{\keywordname}{Trefwoorden}% Keywords
\renewcommand{\notesname}{Voetnoten}% Footnotes
+\renewcommand{\notelabel}{Noot}%Note
%</dutch>
% \end{macrocode}
%\end{macro}
%
+%
%\begin{macro}{APA7german.txt}
% \begin{macrocode}
%<*german>
-\ProvidesFile{APA7german.txt}[2019/12/29 v1.00 apa7 configuration for German]
+\ProvidesFile{APA7german.txt}[2020/12/02 v1.02 apa7 configuration for German]
+\renewcommand{\lastauthorseparator}{und}% and
\renewcommand{\acksname}{Autorenhinweis}% Author Note
\renewcommand{\keywordname}{Schl\"usselw\"orter}% Keywords
\renewcommand{\notesname}{Fußnoten}% Footnotes
+\renewcommand{\notelabel}{Anmerkung}%Note
%</german>
% \end{macrocode}
%\end{macro}
%
+%
%\begin{macro}{APA7ngerman.txt}
% \begin{macrocode}
%<*ngerman>
-\ProvidesFile{APA7german.txt}[2019/12/29 v1.00 apa7 configuration for "new" German]
+\ProvidesFile{APA7ngerman.txt}[2020/12/02 v1.02 apa7 configuration for "new" German]
+\renewcommand{\lastauthorseparator}{und}% and
\renewcommand{\acksname}{Autorenhinweis}% Author Note
\renewcommand{\keywordname}{Schl\"usselw\"orter}% Keywords
\renewcommand{\notesname}{Fußnoten}% Footnotes
+\renewcommand{\notelabel}{Anmerkung}%Note
%</ngerman>
% \end{macrocode}
%\end{macro}
%
+%
%\begin{macro}{APA7greek.txt}
% \begin{macrocode}
%<*greek>
-\ProvidesFile{APA7greek.txt}[2019/12/29 v1.00 apa7 configuration for Greek]
+\ProvidesFile{APA7greek.txt}[2020/12/02 v1.02 apa7 configuration for Greek]
-\renewcommand{\acksname}{Shmei'wseis tou suggraf'ea}% Author Note
-\renewcommand{\keywordname}{L'exeis kleidi'a}% Keywords
-\renewcommand{\notesname}{Uposhmei'wseis}% Footnotes
+\renewcommand{\lastauthorseparator}{και}% and
+\renewcommand{\acksname}{Σημείωση του συγγραφέα}% Author Note
+\renewcommand{\keywordname}{λέξεις-κλειδιά}% Keywords
+\renewcommand{\notesname}{υποσημείωση}% Footnotes
+\renewcommand{\notelabel}{Σημείωση}%Note
%</greek>
% \end{macrocode}
%\end{macro}
%
+%
%\begin{macro}{APA7czech.txt}
% \begin{macrocode}
%<*czech>
-\ProvidesFile{APA7czech.txt}[2019/12/29 v1.00 apa7 configuration for Czech]
+\ProvidesFile{APA7czech.txt}[2020/12/02 v1.02 apa7 configuration for Czech]
+\renewcommand{\lastauthorseparator}{a}% and
\renewcommand{\acksname}{Poznámka~autora}% Author Note
\renewcommand{\keywordname}{Klícová~1slova}% Keywords
\renewcommand{\notesname}{Poznámky}% Footnotes
+\renewcommand{\notelabel}{Nota}%Note
%</czech>
% \end{macrocode}
%\end{macro}
%
+%
%\begin{macro}{APA7turkish.txt}
% \begin{macrocode}
%<*turkish>
-\ProvidesFile{APA7turkish.txt}[2019/12/29 v1.00 apa7 configuration for Turkish]
+\ProvidesFile{APA7turkish.txt}[2020/12/02 v1.02 apa7 configuration for Turkish]
+\renewcommand{\lastauthorseparator}{ve}% and
\renewcommand{\acksname}{Yazar Notu}% Author Note
\renewcommand{\keywordname}{Anahtar Kelimeler}% Keywords
\renewcommand{\notesname}{Dipnotlar}% Footnotes
+\renewcommand{\notelabel}{Not}%Note
%</turkish>
% \end{macrocode}
%\end{macro}
%
+%
%\begin{macro}{APA7endfloat.cfg}
% \begin{macrocode}
%<*APAendfloat>
diff --git a/Master/texmf-dist/source/latex/apa7/apa7.ins b/Master/texmf-dist/source/latex/apa7/apa7.ins
index 054d5df5e4a..3b4b786df85 100644
--- a/Master/texmf-dist/source/latex/apa7/apa7.ins
+++ b/Master/texmf-dist/source/latex/apa7/apa7.ins
@@ -83,6 +83,7 @@ and the derived files apa7.ins,
APA7british.txt,
APA7dutch.txt,
APA7english.txt,
+ APA7french.txt,
APA7german.txt,
APA7ngerman.txt,
APA7greek.txt,
@@ -105,6 +106,7 @@ and the derived files apa7.ins,
\file{./config/APA7british.txt}{\from{\jobname.dtx}{british}}
\file{./config/APA7dutch.txt}{\from{\jobname.dtx}{dutch}}
\file{./config/APA7english.txt}{\from{\jobname.dtx}{english}}
+ \file{./config/APA7french.txt}{\from{\jobname.dtx}{french}}
\file{./config/APA7german.txt}{\from{\jobname.dtx}{german}}
\file{./config/APA7ngerman.txt}{\from{\jobname.dtx}{ngerman}}
\file{./config/APA7greek.txt}{\from{\jobname.dtx}{greek}}
@@ -148,6 +150,7 @@ and the derived files apa7.ins,
%% APA7british.txt,
%% APA7dutch.txt,
%% APA7english.txt,
+%% APA7french.txt,
%% APA7german.txt,
%% APA7ngerman.txt,
%% APA7greek.txt,
diff --git a/Master/texmf-dist/source/latex/apxproof/apxproof.dtx b/Master/texmf-dist/source/latex/apxproof/apxproof.dtx
index 2385984fd88..d02bb77435d 100644
--- a/Master/texmf-dist/source/latex/apxproof/apxproof.dtx
+++ b/Master/texmf-dist/source/latex/apxproof/apxproof.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2016-2019 by Pierre Senellart
+% Copyright (C) 2016-2020 by Pierre Senellart
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -24,7 +24,7 @@
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
%<package>\ProvidesPackage{apxproof}
-%<package> [2019/10/08 v1.2.0 Automatic proofs in appendix]
+%<package> [2020/10/15 v1.2.1 Automatic proofs in appendix]
%
%<*driver>
\documentclass{ltxdoc}
@@ -45,7 +45,7 @@
%</driver>
% \fi
%
-% \CheckSum{787}
+% \CheckSum{813}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -373,7 +373,8 @@ This is a citation in the appendix~\cite{proofsAreHard}.
% (\meta{title})''.
% \item[\textbackslash|appendixrefname|]\DescribeMacro{\appendixrefname} contains the heading that is displayed before
% the bibliography. By default, this is ``References for the
-% Appendix''.
+% Appendix''. (Note that this command is also defined and used by the
+% |memoir| document class.)
% \item[\textbackslash|appendixbibliographystyle|]\DescribeMacro{\appendixbibliographystyle} contains the |.bst| bibliography
% style that is used in the bibliography in appendix. By default, this is
% |alpha|.
@@ -430,6 +431,7 @@ This is a citation in the appendix~\cite{proofsAreHard}.
% \item \LaTeX{} standard document classes (e.g., |article.cls|)
% \item \href{https://www.ctan.org/pkg/koma-script}{KOMA-Script}
% (e.g., |scrartcl.cls|, |scrbook.cls|)
+% \item \href{https://ctan.org/pkg/memoir}{|memoir.cls|}
% \item \href{https://www.acm.org/publications/proceedings-template}{ACM
% SIG Proceedings} (e.g., |sig-alternate.cls|, |acmart.cls|)
% \item \href{https://www.springer.com/computer/lncs/lncs+authors}{
@@ -466,7 +468,7 @@ This is a citation in the appendix~\cite{proofsAreHard}.
% Issues not listed here should be reported to the author.
%
% \section{License}
-% Copyright \textcopyright{} 2016--2019 by Pierre Senellart.
+% Copyright \textcopyright{} 2016--2020 by Pierre Senellart.
%
% 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
@@ -609,7 +611,7 @@ This is a citation in the appendix~\cite{proofsAreHard}.
% \end{macrocode}
% The external \textsf{bibunits} package
% is used to add a second bibliography for the appendix material.
-% \changes{v1.2.0}{2019/04/17}{Do not load \textsf{binunits} if
+% \changes{v1.2.0}{2019/04/17}{Do not load \textsf{bibunits} if
% \texttt{bibliography} is set to \texttt{common}}
% \begin{macrocode}
\RequirePackage{bibunits}
@@ -713,6 +715,8 @@ This is a citation in the appendix~\cite{proofsAreHard}.
% \begin{macro}{\mainbodyrepeatedtheorem}
% \changes{v1.2.0}{2019/09/21}{Configurable repeated theorem command}
% \begin{macro}{\appendixrefname}
+% \changes{v1.2.1}{2020/10/09}{Fix compatibility with
+% \texttt{memoir} document class}
% \begin{macro}{\appendixbibliographystyle}
% \begin{macro}{\appendixbibliographyprelim}
% \begin{macro}{\appendixprelim}
@@ -725,7 +729,7 @@ This is a citation in the appendix~\cite{proofsAreHard}.
% all modes so that a |\renewcommand| works in all cases.
% \begin{macrocode}
\newcommand{\mainbodyrepeatedtheorem}{}
-\newcommand{\appendixrefname}{References for the Appendix}
+\providecommand{\appendixrefname}{References for the Appendix}
\newcommand{\appendixbibliographystyle}{alpha}
\newcommand{\appendixbibliographyprelim}{}
\newcommand{\appendixprelim}{\clearpage\onecolumn}
@@ -943,7 +947,15 @@ This is a citation in the appendix~\cite{proofsAreHard}.
% Using the functionalities of the \textsf{fancyvrb} package, we define a
% custom verbatim environment |axp@VerbatimOut| that writes every line
% to the |\axp@proofsfile|. We also use the previous macro to disable active
-% characters with the eighth bit set.
+% characters with the eighth bit set, and we make sure the catcode of |@|
+% is reset for every verbatim environment, in case it is used by the user (e.g.,
+% as in the \textsf{xypic} package). Finally, as an additional
+% precaution, we reset |\FV@CatCodesHook| that is for example set by the
+% |commandchars| or |commentchar| option of |\fvset|.
+% \changes{v1.2.1}{2020/01/01}{Fix compatibility with
+% \textsf{xypic} package}
+% \changes{v1.2.1}{2020/10/15}{Fix compatibility with other uses of \textsf{fancyvrb} that set
+% \texttt{\textbackslash FV@CatCodesHook}}
% \begin{macrocode}
\DefineVerbatimEnvironment{axp@VerbatimOut}{axp@VerbatimOut}{}
\def\FVB@axp@VerbatimOut{%
@@ -956,8 +968,12 @@ This is a citation in the appendix~\cite{proofsAreHard}.
\def\FV@ProcessLine{\immediate\write\axp@proofsfile}%
\let\FV@FontScanPrep\relax
\let\@noligs\relax
+ \immediate\write\axp@proofsfile{\noexpand\makeatother}%
+ \def\FV@CatCodesHook{}%
\FV@Scan}
- \def\FVE@axp@VerbatimOut{\endgroup\@esphack}
+ \def\FVE@axp@VerbatimOut{%
+ \immediate\write\axp@proofsfile{\noexpand\makeatletter}%
+ \endgroup\@esphack}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1445,11 +1461,20 @@ This is a citation in the appendix~\cite{proofsAreHard}.
% ensure an empty bibliography environment is not produced.
% The name of the bibliography is changed to |\appendixrefname|; in most
% document classes, it is called |\refname| but it is occasionally
-% (|scrartcl|, |scrreprt|) called |\bibname|.
+% (|scrartcl|, |scrreprt|) called |\bibname|. An ad-hoc test is added
+% to fix a conflict with the \textsf{natbib} package which redefines
+% |bibcite| at the end of the document.
% \changes{v1.0.6}{2018/05/10}{Deal with document classes where the
% bibliography is called \texttt{\textbackslash bibname}}
+% \changes{v1.2.1}{2020/02/27}{Ad hoc fix for \textsf{natbib}
+% package conflict}
% \begin{macrocode}
\AtEndDocument{
+ \ifdefined\NAT@testdef
+ \renewcommand\bibcite[2]{%
+ \global\@namedef{b@#1\@extra@binfo}{#2}%
+ }
+ \fi
\appendixprelim
\appendix
\ifthenelse{\equal{\axp@bibliography}{separate}}{
@@ -1469,6 +1494,9 @@ This is a citation in the appendix~\cite{proofsAreHard}.
\appendixbibliographyprelim
\putbib
\end{bibunit}
+ \ifdefined\NAT@testdef
+ \let\bibcite\NAT@testdef
+ \fi
}{}
}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/archaeologie/archaeologie.dtx b/Master/texmf-dist/source/latex/archaeologie/archaeologie.dtx
index 5f056a37194..0501c036d1c 100644
--- a/Master/texmf-dist/source/latex/archaeologie/archaeologie.dtx
+++ b/Master/texmf-dist/source/latex/archaeologie/archaeologie.dtx
@@ -1,7 +1,7 @@
%\iffalse
%<*internal|bbx|cbx|dbx|lbx>
-\def\archDate{2020/02/15}
-\def\archVersion{2.4.4}
+\def\archDate{2020/08/08}
+\def\archVersion{2.4.5}
%</internal|bbx|cbx|dbx|lbx>
%<*internal>
\iffalse
@@ -70,7 +70,7 @@ Copyright (c) 2015 Lukas C. Bossert | Johannes Friedl
* Email: [info@biblatex.texografie.de](mailto:info@biblatex.texografie.de)
-* Website: [www.biblatex-archaeologie.texografie.de](http://www.biblatex-archaeologie.texografie.de)
+* Website: [www.biblatex-archaeologie.texografie.de](http://biblatex-archaeologie.texografie.de)
This citation-style covers the citation and bibliography rules of
the [__German Archaeological Institute__ (DAI)](http://www.dainst.org/dai/meldungen).
@@ -1138,7 +1138,7 @@ draft=false,
\clearscrheadfoot
\ihead{\normalfont\footnotesize \texttt{bib}\LaTeX-style \texttt{archaeologie \archaeologieversion} \copyright\ by Lukas C. Bossert (2015--\the\year) | Johannes Friedl (2015)}%
\rofoot{\normalfont\footnotesize \textbf{\sffamily \thepage}}
-\lofoot{\normalfont\footnotesize \href{http://www.biblatex-archaeologie.texografie.de}{biblatex-archaeologie.de}}
+\lofoot{\normalfont\footnotesize \href{http://biblatex-archaeologie.texografie.de}{biblatex-archaeologie.texografie.de}}
\RequirePackage[%
% flushmargin, %
@@ -1406,8 +1406,7 @@ examplebox,
of this license or (at your option) any later version.},
pdfhighlight = /N,
pdfdisplaydoctitle = true,
- pdfdate = {\the\year-\the\month-\the\day}
- pdflang = {en},
+ pdflang = {en},
pdfcaptionwriter = {Lukas C. Bossert},
pdfkeywords = {biblatex, archaeology, humanities},
pdfproducer={LuaLaTeX},
@@ -1464,7 +1463,7 @@ examplebox,
\begin{document}
\pdfbookmark[1]{Titlepage}{title}
\title{\texttt{archaeologie} -- \\\texttt{bib\LaTeX} for archaeologists\footnote{Also very handy for scholars of (ancient) history or classics, too.
-For further information about the code visit \href{http://www.biblatex-archaeologie.texografie.de}{biblatex-archaeologie.de}:
+For further information about the code visit \href{http://biblatex-archaeologie.texografie.de}{biblatex-archaeologie.texografie.de}:
Comments and criticisms are welcome.
We thank especially \href{https://tex.stackexchange.com/users/35864/moewe}{M. Wemheuer} and \href{https://tex.stackexchange.com/users/2478/herbert}{H. Voß} for their great help with the code.%
}}
@@ -1560,7 +1559,9 @@ The markdown syntax is inspired by the conventions proposed by [keepachangelog.c
Without any further options the style follows the rules of the \DAI.
No additional settings are needed,
-but you can change the outcome by using some options which are explained below.\footnote{For an easy and unproblematic compiling we suggest to use \hologo{XeLaTeX} or \hologo{LuaTeX}.}
+but you can change the outcome by using some options which are explained below.\footnote{For an easy and unproblematic compiling we suggest to use \hologo{XeLaTeX} or \hologo{LuaTeX}; see the information note in \cref{archaeologie-lstabbrv.bib}.}
+
+
At the end of your document you can write the command |\printbibliography| to print
the bibliography.
@@ -8105,6 +8106,16 @@ To see the long forms of journal titles or series you have to switch on the opti
% ██ ██████ ██████ ██████ ██████ ██ ██ ███████ ██ ████ ██
% */
%<*readme>
+
+
+## v2.4.5 (2020-08-08)
+### *Added*
+* Informational remark about greek letters in `@strings` in the additional `bib`-files (see Issue 153)[https://github.com/LukasCBossert/biblatex-archaeologie/issues/153]
+
+### *Fixed*
+* stale link in description corrected (http://biblatex-archaeologie.texografie.de/)
+
+
## v2.4.4 (2020-02-15)
### *Fixed*
* corrected the use of the `maintitlepunct` in the bibmacro `maintitle+title+volumes`
@@ -8466,8 +8477,8 @@ This update is also due to compatibility with `biblatex 3.8a`/`biber 2.8`.
\iftoggle{bbx:urn}{}{\xout{urn}\seperator}%
\iftoggle{bbx:doi}{}{\xout{doi}\seperator}%
\iflanguage{ngerman}%
- {Weitere Informationen unter \url{http://biblatex-archaeologie.de}}
- {For further information see \url{http://biblatex-archaeologie.de}}
+ {Weitere Informationen unter \url{http://biblatex-archaeologie.texografie.de}}
+ {For further information see \url{http://biblatex-archaeologie.texografie.de}}
}
% \end{macrocode}
%
@@ -11138,3198 +11149,3210 @@ This update is also due to compatibility with `biblatex 3.8a`/`biber 2.8`.
%<*abbrv>
% \fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \section{archaeologie-lstabbrv.bib}
-% Liste der Abkürzungen für Zeitschriften, Reihen,
-% Lexika und häufig zitierte Werke.
-% Manche Kürzel konnten nicht genau umgesetzt werden.
-% Alle Umlaute, Akzente, etc. werden weggelassen, bzw.
-% geändert: "ü-> ue", etc.
+% \label{archaeologie-lstabbrv.bib}
+% This is a list with abbreviations of journals, volumes, references and most cited works.
+% Since not all given short-names of the abbreviations can be used directly
+% it was necessary to modify them slightly.
+% Umlauts are changed: |ä|>|ae|, |ö|>|oe|, |ü|>|ue| etc.
+%
+% They are marked with "*Abweichung!".
+%
+%\begin{marker}There are strings with e.g. greek letters. To have them printed properly use e.g. |lualatex| or add a specific package (e.g. |\usepackage{textalpha}| from greek-fontenc). For more information see \url{https://github.com/LukasCBossert/biblatex-archaeologie/issues/153} \end{marker}
%
-% Diese sind mit "*Abweichung!" gekennzeichnet
% \subsection{Short names}
% \begin{macrocode}
- @String {AA-short = {AA}}
- @String {AAA-short = {AAA}}
- @String {AAcque-short = {AAcque}}
- @String {AAdv-short = {AAdv}}
- @String {AAJ-short = {AAJ}}
- @String {AAlpi-short = {AAlpi}}
- @String {AarbKob-short = {AarbKøb}}%*Abweichung!
- @String {AArchit-short = {AArchit}}
- @String {AAS-short = {AAS}}
- @String {AASOR-short = {AASOR}}
- @String {AAusgrBadWuert-short = {AAusgrBadWürt}}%*Abweichung!
- @String {AAustr-short = {AAustr}}
- @String {ABADY-short = {ABADY}}
- @String {AbhBerlin-short = {AbhBerlin}}
- @String {AbhDuesseldorf-short = {AbhDüsseldorf}}%*Abweichung!
- @String {AbhGoettingen-short = {AbhGöttingen}}%*Abweichung!
- @String {AbhLeipzig-short = {AbhLeipzig}}
- @String {AbhMainz-short = {AbhMainz}}
- @String {AbhMuenchen-short = {AbhMünchen}}%*Abweichung!
- @String {ABret-short = {ABret}}
- @String {Abr-Nahrain-short = {Abr-Nahrain}}
- @String {ABulg-short = {ABulg}}
- @String {ABV-short = {ABV}}
- @String {ACalc-short = {ACalc}}
- @String {ACamp-short = {ACamp}}
- @String {ACant-short = {ACant}}
- @String {AcBibl-short = {AcBibl}}
- @String {Achse-short = {Achse}}
- @String {Acme-short = {Acme}}
- @String {Acontia-short = {Acontia}}
- @String {ACors-short = {ACors}}
- @String {ActaAArtHist-short = {ActaAArtHist}}
- @String {ActaAArtHist-sa-short = {ActaAArtHist s.a.}}%*Abweichung!
- @String {ActaAcAbo-short = {ActaAcAbo}}
- @String {ActaACarp-short = {ActaACarp}}
- @String {ActaALov-short = {ActaALov}}
- @String {ActaALovMono-short = {ActaALovMono}}
- @String {ActaAntHung-short = {ActaAntHung}}
- @String {ActaArch-short = {ActaArch}}
- @String {ActaArchHung-short = {ActaArchHung}}
- @String {ActaAth-short = {ActaAth}}
- @String {ActaCl-short = {ActaCl}}
- @String {ActaClDebrec-short = {ActaClDebrec}}
- @String {ActaHistDac-short = {ActaHistDac}}
- @String {ActaHyp-short = {ActaHyp}}
- @String {ActaInstRomFin-short = {ActaInstRomFin}}
- @String {ActaMusNapoca-short = {ActaMusNapoca}}
- @String {ActaMusPorol-short = {ActaMusPorol}}
- @String {ActaNum-short = {ActaNum}}
- @String {ActaOr-short = {ActaOr}}
- @String {ActaOrHung-short = {ActaOrHung}}
- @String {ActaPhilSocDac-short = {ActaPhilSocDac}}
- @String {ActaPraehistA-short = {ActaPraehistA}}
- @String {ActaTorunA-short = {ActaTorunA}}
- @String {ActaTorunHist-short = {ActaTorunHist}}
- @String {AD-short = {AD}}
- @String {ADAIK-short = {ADAIK}}
- @String {Adalya-short = {Adalya}}
- @String {ADelt-A-short = {ADelt A}}%*Abweichung!
- @String {ADelt-B-short = {ADelt B}}%*Abweichung!
- @String {ADerg-short = {ADerg}}
- @String {ADFU-short = {ADFU}}
- @String {AdI-short = {AdI}}
- @String {ADOG-short = {ADOG}}
- @String {Adumatu-short = {Adumatu}}
- @String {AE-short = {AE}}
- @String {AeA-short = {AeA}}
- @String {Aegaeum-short = {Aegaeum}}
- @String {AegLev-short = {ÄgLev}}%*Abweichung!
- @String {AEmil-short = {AEmil}}
- @String {AEphem-short = {AEphem}}
- @String {AeR-short = {AeR}}
- @String {AErgoMak-short = {AErgoMak}}
- @String {AErt-short = {AErt}}
- @String {AEspA-short = {AEspA}}
- @String {Aevum-short = {Aevum}}
- @String {AevumAnt-short = {AevumAnt}}
- @String {AF-short = {AF}}
- @String {AfO-short = {AfO}}
- @String {Africa-short = {Africa}}
- @String {AGD-short = {AGD}}
- @String {AGeo-short = {AGeo}}
- @String {Agora-short = {Agora}}
- @String {AgoraPB-short = {AgoraPB}}
- @String {AHist-short = {AHist}}
- @String {AHistStAlex-short = {AHistStAlex}}
- @String {AHw-short = {AHw}}
- @String {AiD-short = {AiD}}
- @String {AInf-short = {AInf}}
- @String {AIONArch-short = {AIONArch}}
- @String {AIONFil-short = {AIONFil}}
- @String {AIONLing-short = {AIONLing}}
- @String {AIPhOr-short = {AIPhOr}}
- @String {Aitna-short = {Aitna}}
- @String {AJA-short = {AJA}}
- @String {AJahrBay-short = {AJahrBay}}
- @String {AJPh-short = {AJPh}}
- @String {AJug-short = {AJug}}
- @String {AKorrBl-short = {AKorrBl}}
- @String {AlbaRegia-short = {AlbaRegia}}
- @String {AlmaMaterSt-short = {AlmaMaterSt}}
- @String {AlmanachWien-short = {AlmanachWien}}
- @String {AlonJisrael-short = {AlonJisrael}}
- @String {Al-Qannis-short = {Al-Qanniš}}
- @String {Altamura-short = {Altamura}}
- @String {AltoMed-short = {AltoMed}}
- @String {Alt-Paphos-short = {Alt-Paphos}}
- @String {AltThuer-short = {AltThür}}%*Abweichung!
- @String {AM-short = {AM}}
- @String {AMediev-short = {AMediev}}
- @String {AMethTh-short = {AMethTh}}
- @String {AMI-short = {AMI}}
- @String {AMIT-short = {AMIT}}
- @String {AmJAncHist-short = {AmJAncHist}}
- @String {AmJNum-short = {AmJNum}}
- @String {AMold-short = {AMold}}
- @String {AMosel-short = {AMosel}}
- @String {AMS-short = {AMS}}
- @String {AmStP-short = {AmStP}}
- @String {AMuGS-short = {AMuGS}}
- @String {ANachr-short = {ANachr}}
- @String {ANachrBad-short = {ANachrBad}}
- @String {AnadoluAra-short = {AnadoluAra}}
- @String {AnadoluKonf-short = {AnadoluKonf}}
- @String {AnadoluYil-short = {AnadoluYıl}}
- @String {AnAe-short = {AnAe}}
- @String {Anagennesis-short = {Anagennesis}}
- @String {AnalBolland-short = {AnalBolland}}
- @String {AnalP-short = {AnalP}}
- @String {AnalRom-short = {AnalRom}}
- @String {AnArqAnd-short = {AnArqAnd}}
- @String {Anas-short = {Anas}}
- @String {AnatA-short = {AnatA}}
- @String {Anatolia-short = {Anatolia}}
- @String {ANaturwiss-short = {ANaturwiss}}
- @String {AncCivScytSib-short = {AncCivScytSib}}
- @String {AncHistB-short = {AncHistB}}
- @String {AncInd-short = {AncInd}}
- @String {AncNearEastSt-short = {AncNearEastSt}}
- @String {AnCord-short = {AnCord}}
- @String {AncSoc-short = {AncSoc}}
- @String {AncW-short = {AncW}}
- @String {AncWestEast-short = {AncWestEast}}
- @String {AnDubr-short = {AnDubr}}
- @String {ANews-short = {ANews}}
- @String {ANilMoy-short = {ANilMoy}}
- @String {ANL-short = {ANL}}
- @String {AnMunFaro-short = {AnMunFaro}}
- @String {AnMurcia-short = {AnMurcia}}
- @String {AnnAcEtr-short = {AnnAcEtr}}
- @String {AnnAcTorino-short = {AnnAcTorino}}
- @String {AnnAStorAnt-short = {AnnAStorAnt}}
- @String {AnnBari-short = {AnnBari}}
- @String {AnnBenac-short = {AnnBenac}}
- @String {AnnBiblAModena-short = {AnnBiblAModena}}
- @String {AnnBiblARom-short = {AnnBiblARom}}
- @String {AnnByzConf-short = {AnnByzConf}}
- @String {AnnCagl-short = {AnnCagl}}
- @String {AnnCaglMag-short = {AnnCaglMag}}
- @String {AnnEconSocCiv-short = {AnnEconSocCiv}}
- @String {AnnEgBibl-short = {AnnEgBibl}}
- @String {AnnEth-short = {AnnEth}}
- @String {AnnFaina-short = {AnnFaina}}
- @String {AnnHistA-short = {AnnHistA}}
- @String {AnnHistScSoc-short = {AnnHistScSoc}}
- @String {AnnIstGiapp-short = {AnnIstGiapp}}
- @String {AnnIstItNum-short = {AnnIstItNum}}
- @String {AnnLecce-short = {AnnLecce}}
- @String {AnnLeedsUnOrSoc-short = {AnnLeedsUnOrSoc}}
- @String {AnnMacerata-short = {AnnMacerata}}
- @String {AnnMessMag-short = {AnnMessMag}}
- @String {AnnMusRov-short = {AnnMusRov}}
- @String {AnnNap-short = {AnnNap}}
- @String {AnnNivern-short = {AnnNivern}}
- @String {AnnNoment-short = {AnnNoment}}
- @String {AnnOrNap-short = {AnnOrNap}}
- @String {AnnotNum-short = {AnnotNum}}
- @String {AnnPerugia-short = {AnnPerugia}}
- @String {AnnPisa-short = {AnnPisa}}
- @String {AnnPontAcRom-short = {AnnPontAcRom}}
- @String {AnnRepBSA-short = {AnnRepBSA}}
- @String {AnnRepCypr-short = {AnnRepCypr}}
- @String {AnnRepFoggArtMus-short = {TAnnRepFoggArtMus}}
- @String {AnnSiena-short = {AnnSiena}}
- @String {AnnuarioAcLinc-short = {AnnuarioAcLinc}}
- @String {AnnuarioLecce-short = {AnnuarioLecce}}
- @String {AnnUnBud-short = {AnnUnBud}}
- @String {AnnWorcArtMus-short = {AnnWorcArtMus}}
- @String {Anodos-short = {Anodos}}
- @String {AnOr-short = {AnOr}}
- @String {ANRW-short = {ANRW}}
- @String {Anschnitt-short = {Anschnitt}}
- @String {ANSMusNotes-short = {ANSMusNotes}}
- @String {AnSt-short = {AnSt}}
- @String {Antaeus-short = {Antaeus}}
- @String {AntAfr-short = {AntAfr}}
- @String {AntChr-short = {AntChr}}
- @String {AntCl-short = {AntCl}}
- @String {AnthrAChron-short = {AnthrAChron}}
- @String {Anthropos-short = {Anthropos}}
- @String {Antichthon-short = {Antichthon}}
- @String {AntigCr-short = {AntigCr}}
- @String {Antipolis-short = {Antipolis}}
- @String {Antiqua-short = {Antiqua}}
- @String {Antiquity-short = {Antiquity}}
- @String {AntJ-short = {AntJ}}
- @String {AntK-short = {AntK}}
- @String {AntNat-short = {AntNat}}
- @String {AntPisa-short = {AntPisa}}
- @String {AntPl-short = {AntPl}}
- @String {AntSurv-short = {AntSurv}}
- @String {AntTard-short = {AntTard}}
- @String {AnzAW-short = {AnzAW}}
- @String {AnzWien-short = {AnzWien}}
- @String {AOAT-short = {AOAT}}
- @String {AoF-short = {AoF}}
- @String {AOtkryt-short = {AOtkryt}}
- @String {APamKiiv-short = {APamKiiv}}
- @String {APh-short = {APh}}
- @String {APol-short = {APol}}
- @String {Apollo-short = {Apollo}}
- @String {ApolloLond-short = {ApolloLond}}
- @String {APort-short = {APort}}
- @String {AppRomFil-short = {AppRomFil}}
- @String {APregl-short = {APregl}}
- @String {Apulum-short = {Apulum}}
- @String {AquiLeg-short = {AquiLeg}}
- @String {AquilNost-short = {AquilNost}}
- @String {Aquitania-short = {Aquitania}}
- @String {ArabAEpigr-short = {ArabAEpigr}}
- @String {ARadRaspr-short = {ARadRaspr}}
- @String {ArbFBerSaechs-short = {ArbFBerSaechs}}
- @String {Archaeographie-short = {Archäographie}}%*Abweichung!
- @String {Archaeologia-short = {Archaeologia}}
- @String {Archaeology-short = {Archaeology}}
- @String {Archaeometry-short = {Archaeometry}}
- @String {Archaiognosia-short = {Archaiognosia}}
- @String {ArchBegriffsGesch-short = {ArchBegriffsGesch}}
- @String {ArchByzMnem-short = {ArchByzMnem}}
- @String {ArchCl-short = {ArchCl}}
- @String {Archeo-short = {Archeo}}
- @String {ArcheogrTriest-short = {ArcheogrTriest}}
- @String {ArcheologiaParis-short = {ArcheologiaParis}}
- @String {ArcheologiaRoma-short = {ArcheologiaRoma}}
- @String {ArcheologiaWarsz-short = {ArcheologiaWarsz}}
- @String {ArcheologijaKiiv-short = {ArcheologijaKiiv}}
- @String {ArcheologijaSof-short = {ArcheologijaSof}}
- @String {ArchEubMel-short = {ArchEubMel}}
- @String {ArchHom-short = {ArchHom}}
- @String {Architectura-short = {Architectura}}
- @String {Archivi-short = {Archivi}}
- @String {ArchPF-short = {ArchPF}}
- @String {ArchPrehistLev-short = {ArchPrehistLev}}
- @String {ArchRel-short = {ArchRel}}
- @String {ArchStorCal-short = {ArchStorCal}}
- @String {ArchStorPugl-short = {ArchStorPugl}}
- @String {ArchStorRom-short = {ArchStorRom}}
- @String {ArchStorSicOr-short = {ArchStorSicOr}}
- @String {ArchStorSir-short = {ArchStorSir}}
- @String {Arctos-short = {Arctos}}
- @String {ARepLond-short = {ARepLond}}
- @String {Argo-short = {Argo}}
- @String {ArOr-short = {ArOr}}
- @String {ArOrMono-short = {ArOrMono}}
- @String {ArOrSuppl-short = {ArOrSuppl}}
- @String {ARozhl-short = {ARozhl}}
- @String {ArqBeja-short = {ArqBeja}}
- @String {Arse-short = {Arse}}
- @String {ArsGeorg-short = {ArsGeorg}}
- @String {ArtAntMod-short = {ArtAntMod}}
- @String {ArtARhone-short = {ArtARhône}}%*Abweichung!
- @String {ArtAs-short = {ArtAs}}
- @String {ArtB-short = {ArtB}}
- @String {ArtJ-short = {ArtJ}}
- @String {ArtLomb-short = {ArtLomb}}
- @String {ArtMediev-short = {ArtMediev}}
- @String {ArtVirg-short = {ArtVirg}}
- @String {ARV2-short = {ARV2}}
- @String {ASachs-short = {ASachs}}
- @String {ASAE-short = {ASAE}}
- @String {ASammlUnZuerch-short = {ASammlUnZürch}}%*Abweichung!
- @String {ASAtene-short = {ASAtene}}
- @String {ASbor-short = {ASbor}}
- @String {ASchw-short = {ASchw}}
- @String {ASoc-short = {ASoc}}
- @String {ASoloth-short = {ASoloth}}
- @String {ASR-short = {ASR}}
- @String {Assaph-short = {Assaph}}
- @String {AssyrMisc-short = {AssyrMisc}}
- @String {AST-short = {AST}}
- @String {ASub-short = {ASub}}
- @String {ASubacq-short = {ASubacq}}
- @String {Athenaeum-short = {Athenaeum}}
- @String {Atiqot-short = {Atiqot}}
- @String {AtiqotHeb-short = {AtiqotHeb}}
- @String {Atlal-short = {Atlal}}
- @String {AttiAcPontan-short = {AttiAcPontan}}
- @String {AttiAcRov-short = {AttiAcRov}}
- @String {AttiAcTorino-short = {AttiAcTorino}}
- @String {AttiCAntCl-short = {AttiCAntCl}}
- @String {AttiCItRom-short = {AttiCItRom}}
- @String {AttiMemBologna-short = {AttiMemBologna}}
- @String {AttiMemDal-short = {AttiMemDal}}
- @String {AttiMemFirenze-short = {AttiMemFirenze}}
- @String {AttiMemIstria-short = {AttiMemIstria}}
- @String {AttiMemMagnaGr-short = {AttiMemMagnaGr}}
- @String {AttiMemModena-short = {AttiMemModena}}
- @String {AttiMemTivoli-short = {AttiMemTivoli}}
- @String {AttiMusTrieste-short = {AttiMusTrieste}}
- @String {AttiPalermo-short = {AttiPalermo}}
- @String {AttiRovigno-short = {AttiRovigno}}
- @String {AttiSocFriuli-short = {AttiSocFriuli}}
- @String {AttiVenezia-short = {AttiVenezia}}
- @String {AuA-short = {AuA}}
- @String {AulaOr-short = {AulaOr}}
- @String {AusgrFu-short = {AusgrFu}}
- @String {AusgrFuWestf-short = {AusgrFuWestf}}
- @String {AustrRom-short = {AustrRom}}
- @String {AUTerr-short = {AUTerr}}
- @String {AUWE-short = {AUWE}}
- @String {AV-short = {AV}}
- @String {AVen-short = {AVen}}
- @String {AVes-short = {AVes}}
- @String {AViva-short = {AViva}}
- @String {AvP-short = {AvP}}
- @String {AW-short = {AW}}
- @String {AyasofyaMuezYil-short = {AyasofyaMüzYıl}}%*Abweichung!
- @String {AZ-short = {AZ}}
- @String {Azotea-short = {Azotea}}
- @String {BA-short = {BA}}
- @String {Baalbek-short = {Baalbek}}
- @String {BAAlger-short = {BAAlger}}
- @String {BABarcel-short = {BABarcel}}
- @String {BABesch-short = {BABesch}}
- @String {BAcRHist-short = {BAcRHist}}
- @String {BACopt-short = {BACopt}}
- @String {BadFuBer-short = {BadFuBer}}
- @String {Baetica-short = {Baetica}}
- @String {BaF-short = {BaF}}
- @String {BalacaiKoez-short = {BalacaiKöz}}%*Abweichung!
- @String {BalkSt-short = {BalkSt}}
- @String {BALond-short = {BALond}}
- @String {BALux-short = {BALux}}
- @String {BaM-short = {BaM}}
- @String {BAMaroc-short = {BAMaroc}}
- @String {BAmSocP-short = {BAmSocP}}
- @String {BAncOrMus-short = {BAncOrMus}}
- @String {BAngers-short = {BAngers}}
- @String {BAngloIsrASoc-short = {BAngloIsrASoc}}
- @String {BAnnMusFerr-short = {BAnnMusFerr}}
- @String {BAntFr-short = {BAntFr}}
- @String {BAntLux-short = {BAntLux}}
- @String {BAParis-short = {BAParis}}
- @String {BAProv-short = {BAProv}}
- @String {BAR-short = {BAR}}
- @String {BArchAlex-short = {BArchAlex}}
- @String {BArchit-short = {BArchit}}
- @String {BARIntSer-short = {BARIntSer}}
- @String {BASard-short = {BASard}}
- @String {BAsEspA-short = {BAsEspA}}
- @String {BAsInst-short = {BAsInst}}
- @String {BASOR-short = {BASOR}}
- @String {BAssBude-short = {BAssBudé}}%*Abweichung!
- @String {BAssMosAnt-short = {BAssMosAnt}}
- @String {BASub-short = {BASub}}
- @String {BASudEstEur-short = {BASudEstEur}}
- @String {BATarr-short = {BATarr}}
- @String {BAur-short = {BAur}}
- @String {BAVA-short = {BAVA}}
- @String {BayVgBl-short = {BayVgBl}}
- @String {BBasil-short = {BBasil}}
- @String {BBelgRom-short = {BBelgRom}}
- @String {BBolsena-short = {BBolsena}}
- @String {BBrByzSt-short = {BBrByzSt}}
- @String {BCamuno-short = {BCamuno}}
- @String {BCASic-short = {BCASic}}
- @String {BCercleNum-short = {BCercleNum}}
- @String {BCH-short = {BCH}}
- @String {BCircNumNap-short = {BCircNumNap}}
- @String {BCl-short = {BCl}}
- @String {BClevMus-short = {BClevMus}}
- @String {BCom-short = {BCom}}
- @String {BCord-short = {BCord}}
- @String {BdA-short = {BdA}}
- @String {BdE-short = {BdE}}
- @String {BdEC-short = {BdEC}}
- @String {BdI-short = {BdI}}
- @String {BDirRom-short = {BDirRom}}
- @String {BeazleyAddenda2-short = {Beazley Addenda\textsuperscript{2}}}%*Abweichung!
- @String {BeazleyPara-short = {Beazley, Para.}}%*Abweichung!
- @String {BEcAntNimes-short = {BEcAntNîmes}}%*Abweichung!
- @String {BediKart-short = {BediKart}}
- @String {BEFAR-short = {BEFAR}}
- @String {BeitrESkAr-short = {BeitrESkAr}}
- @String {BeitrNamF-short = {BeitrNamF}}
- @String {BeitrSudanF-short = {BeitrSudanF}}
- @String {BelArt-short = {BelArt}}
- @String {Belleten-short = {Belleten}}
- @String {Benacus-short = {Benacus}}
- @String {BerBayDenkmPfl-short = {BerBayDenkmPfl}}
- @String {BerDFG-short = {BerDFG}}
- @String {BerlBeitrArchaeom-short = {BerlBeitrArchäom}}%*Abweichung!
- @String {BerlBlVFruehGesch-short = {BerlBlVFrühGesch}}%*Abweichung!
- @String {BerlJbVFruehGesch-short = {BerlJbVFrühGesch}}%*Abweichung!
- @String {BerlMus-short = {BerlMus}}
- @String {BerlNumZ-short = {BerlNumZ}}
- @String {BerOudhBod-short = {BerOudhBod}}
- @String {BerRGK-short = {BerRGK}}
- @String {BerVerhLeipz-short = {BerVerhLeipz}}
- @String {Berytus-short = {Berytus}}
- @String {BEspA-short = {BEspA}}
- @String {BEspOr-short = {BEspOr}}
- @String {BEtOr-short = {BEtOr}}
- @String {BFilGrPadova-short = {BFilGrPadova}}
- @String {BFilLingSic-short = {BFilLingSic}}
- @String {BFlegr-short = {BFlegr}}
- @String {BFoligno-short = {BFoligno}}
- @String {BHarvMus-short = {BHarvMus}}
- @String {BIasos-short = {BIasos}}
- @String {BibAr-short = {BibAr}}
- @String {BiblClOr-short = {BiblClOr}}
- @String {BiblSymb-short = {BiblSymb}}
- @String {BIBulg-short = {BIBulg}}
- @String {BICS-short = {BICS}}
- @String {BIFAO-short = {BIFAO}}
- @String {BInfCentumcellae-short = {BInfCentumcellae}}
- @String {BInfCESDAE-short = {BInfCESDAE}}
- @String {BiogrZbor-short = {BiogrZbor}}
- @String {BiOr-short = {BiOr}}
- @String {BIstOrvieto-short = {BIstOrvieto}}
- @String {BJaen-short = {BJaen}}%*Abweichung!
- @String {BJb-short = {BJb}}
- @String {BJerus-short = {BJerus}}
- @String {BLaborMusLouvre-short = {BLaborMusLouvre}}
- @String {BLazioMerid-short = {BLazioMerid}}
- @String {BLikUm-short = {BLikUm}}
- @String {BlMueFreundeF-short = {BlMüFreundeF}}%*Abweichung!
- @String {BLugo-short = {BLugo}}
- @String {BMCGreekCoins-short = {BMC Greek Coins}}%*Abweichung!
- @String {BMCOR-short = {BMCOR}}
- @String {BMCRE-short = {BMCRE}}
- @String {BMCRRI-III-short = {BMCRR I--III}}%*Abweichung!
- @String {BMetrMus-short = {BMetrMus}}
- @String {BMon-short = {BMon}}
- @String {BMonMusPont-short = {BMonMusPont}}
- @String {BMQ-short = {BMQ}}
- @String {BMQNSuppl-short = {BMQNSuppl}}
- @String {BMusBeyrouth-short = {BMusBeyrouth}}
- @String {BMusBrux-short = {BMusBruxs}}
- @String {BMusCadiz-short = {BMusCadiz}}
- @String {BMusCivRom-short = {BMusCivRom}}
- @String {BMusFA-short = {BMusFA}}
- @String {BMusHongr-short = {BMusHongr}}
- @String {BMusMadr-short = {BMusMadr}}
- @String {BMusMich-short = {BMusMich}}
- @String {BMusMonaco-short = {BMusMonaco}}
- @String {BMusPadova-short = {BMusPadova}}
- @String {BMusPBelArt-short = {BMusPBelArt}}
- @String {BMusRom-short = {BMusRom}}
- @String {BMusVars-short = {BMusVars}}
- @String {BMusZaragoza-short = {BMusZaragoza}}
- @String {BNumParis-short = {BNumParis}}
- @String {BNumRoma-short = {BNumRoma}}
- @String {Bogazkoey-Hattusa-short = {Boğazköy-Hattuša}}%*Abweichung!
- @String {Bolskan-short = {Bolskan}}
- @String {BonnHVg-short = {BonnHVg}}
- @String {BOntMus-short = {BOntMus}}
- @String {Boreas-short = {Boreas}}
- @String {BoreasUpps-short = {BoreasUpps}}
- @String {BPeintRom-short = {BPeintRom}}
- @String {BPI-short = {BPI}}
- @String {BPrehistAlp-short = {BPI}}%*Abweichung!
- @String {BProAvent-short = {BProAvent}}
- @String {BProvidence-short = {BProvidence}}
- @String {BracAug-short = {BracAug}}
- @String {BracaraAugusta-short = {BracaraAugusta}}
- @String {BremABl-short = {BremABl}}
- @String {BRest-short = {BRest}}
- @String {Brigantium-short = {Brigantium}}
- @String {BrMusYearbook-short = {BrMusYearbook}}
- @String {BSA-short = {BSA}}
- @String {BSAA-short = {BSAA}}
- @String {BSFE-short = {BSFE}}
- @String {BSiena-short = {BSiena}}
- @String {BSOAS-short = {BSOAS}}
- @String {BSocAChamp-short = {BSocAChamp}}
- @String {BSocBiblReinach-short = {BSocBiblReinach}}
- @String {BSocNumRom-short = {BSocNumRom}}
- @String {BSR-short = {BSR}}
- @String {BStLat-short = {BStLat}}
- @String {BStorArt-short = {BStorArt}}
- @String {BTextilAnc-short = {BStorArt}}
- @String {BTorino-short = {BTorino}}
- @String {BTravTun-short = {BTravTun}}
- @String {BudReg-short = {BudReg}}
- @String {BulletinGetty-short = {BulletinGetty}}
- @String {BulletinNorthampton-short = {BulletinNorthampton}}
- @String {BVallad-short = {BVallad}}
- @String {BVitoria-short = {BVitoria}}
- @String {BWaltersArtGal-short = {BWaltersArtGal}}
- @String {BWPr-short = {BWPr}}
- @String {Byzantina-short = {Byzantina}}
- @String {ByzF-short = {ByzF}}
- @String {ByzJb-short = {ByzJb}}
- @String {ByzZ-short = {ByzZ}}
- @String {BZ-short = {BZ}}
- @String {CAA-short = {CAA}}
- @String {CAD-short = {CAD}}
- @String {CadA-short = {CadA}}
- @String {Caesaraugusta-short = {Caesaraugusta}}
- @String {Caesarodunum-short = {Caesarodunum}}
- @String {CAH-short = {CAH}}
- @String {CahArmeeRom-short = {CahArmeeRom}}
- @String {CahASubaqu-short = {CahASubaqu}}
- @String {CahByrsa-short = {CahByrsa}}
- @String {CahCEC-short = {CahCEC}}
- @String {CahCerEg-short = {CahCerEg}}
- @String {CahDelFrIran-short = {CahDelFrIran}}
- @String {CahGlotz-short = {CahGlotz}}
- @String {CahKarnak-short = {CahKarnak}}
- @String {CahLig-short = {CahLig}}
- @String {CahMariemont-short = {CahMariemont}}
- @String {CahMusChampollion-short = {CahMusChampollion}}
- @String {CahPEg-short = {CahPEg}}
- @String {CahRhod-short = {CahRhod}}
- @String {CahTun-short = {CahTun}}
- @String {CalifStClAnt-short = {CalifStClAnt}}
- @String {CambrAJ-short = {CambrAJ}}
- @String {CArch-short = {CArch}}
- @String {CarinthiaI-short = {Carinthia I}}%*Abweichung!
- @String {CarnuntumJb-short = {CarnuntumJb}}
- @String {Carpica-short = {Carpica}}
- @String {Carrobbio-short = {Carrobbio}}
- @String {CAT-short = {CAT}}
- @String {CE-short = {CE}}
- @String {CEDAC-short = {CEDAC}}
- @String {CEFR-short = {CEFR}}
- @String {Celticum-short = {Celticum}}
- @String {CercA-short = {CercA}}
- @String {CercNum-short = {CercNum}}
- @String {Chiron-short = {Chiron}}
- @String {ChronEg-short = {ChronEg}}
- @String {CIA-short = {CIA}}
- @String {CIE-short = {CIE}}
- @String {CIG-short = {CIG}}
- @String {CIH-short = {CIH}}
- @String {CIL-short = {CIL}}
- @String {CincArtB-short = {CincArtB}}
- @String {CIS-short = {CIS}}
- @String {CIstAMilano-short = {CIstAMilano}}
- @String {CivClCr-short = {CivClCr}}
- @String {CivPad-short = {CivPad}}
- @String {ClAnt-short = {ClAnt}}
- @String {ClevStHistArt-short = {ClevStHistArt}}
- @String {Clio-short = {Clio}}
- @String {ClIre-short = {ClIre}}
- @String {ClJ-short = {ClJ}}
- @String {ClMediaev-short = {ClMediaev}}
- @String {ClPhil-short = {ClPhil}}
- @String {ClQ-short = {ClQ}}
- @String {ClR-short = {ClR}}
- @String {ClRh-short = {ClRh}}
- @String {CMatAOr-short = {CMatAOr}}
- @String {CMGr-short = {CMGr}}
- @String {CMS-short = {CMS}}
- @String {CoinHoards-short = {Coin Hoards}}%*Abweichung!
- @String {ColloquiSod-short = {ColloquiSod}}
- @String {CommunicAHung-short = {CommunicAHung}}
- @String {Complutum-short = {Complutum}}
- @String {Conoscenze-short = {Conoscenze}}
- @String {Corduba-short = {Corduba}}
- @String {Corinth-short = {Corinth}}
- @String {CRAI-short = {CRAI}}
- @String {CretAnt-short = {CretAnt}}
- @String {CretSt-short = {CretSt}}
- @String {CronA-short = {CronA}}
- @String {CronErcol-short = {CronErcol}}
- @String {CronPomp-short = {CronPomp}}
- @String {CRPetersbourg-short = {CRPetersbourg}}%*Abweichung!
- @String {CSE-short = {CSE}}
- @String {CSIR-short = {CSIR}}
- @String {CSSpecPisa-short = {CSSpecPisa}}
- @String {CuadAMed-short = {CuadAMed}}
- @String {CuadArquitRom-short = {CuadArquitRom}}
- @String {CuadCastellon-short = {CuadCastellon}}
- @String {CuadCat-short = {CuadCat}}
- @String {CuadFilCl-short = {CuadFilCl}}
- @String {CuadGallegos-short = {CuadGallegos}}
- @String {CuadGranada-short = {CuadGranada}}
- @String {CuadNavarra-short = {CuadNavarra}}
- @String {CuadPrehistA-short = {CuadPrehistA}}
- @String {CuadRom-short = {CuadRom}}
- @String {CuPaUAM-short = {CuPaUAM}}
- @String {CVA-short = {CVA}}
- @String {CZero-short = {CZero}}
- @String {DAA-short = {DAA}}
- @String {Dacia-short = {Dacia}}
- @String {DACL-short = {DACL}}
- @String {Dacoromania-short = {Dacoromania}}
- @String {DaF-short = {DaF}}
- @String {Daidalos-short = {Daidalos}}
- @String {DAIGeschDok-short = {DAIGeschDok}}
- @String {DaM-short = {DaM}}
- @String {Daremberg-Saglio-short = {Daremberg -- Saglio}}%*Abweichung!
- @String {DebrecMuzEvk-short = {DebrecMuzEvk}}
- @String {Dedalo-short = {Dédalo}}%*Abweichung!
- @String {Delos-short = {Delos}}%*Abweichung!
- @String {DeltChrA-short = {DeltChrA}}
- @String {Demircihueyuek-short = {Demircihüyük}}%*Abweichung!
- @String {DeMuseus-short = {DeMuseus}}
- @String {DenkmPflBadWuert-short = {DenkmPflBadWürt}}%*Abweichung!
- @String {DenkschrWien-short = {DenkschrWien}}
- @String {Diadora-short = {Diadora}}
- @String {DialA-short = {DialA}}
- @String {DialHistAnc-short = {DialHistAnc}}
- @String {Dike-short = {Dike}}
- @String {Dioniso-short = {Dioniso}}
- @String {DiskAB-short = {DiskAB}}
- @String {DKuDenkmPfl-short = {DKuDenkmPfl}}
- @String {DLZ-short = {DLZ}}
- @String {DNP-short = {DNP}}
- @String {DocAlb-short = {DocAlb}}
- @String {DocALouv-short = {DocALouv}}
- @String {DocAMerid-short = {DocAMerid}}
- @String {DocEmRom-short = {DocEmRom}}
- @String {Dodone-short = {Dodone}}
- @String {DOP-short = {DOP}}
- @String {DossAlet-short = {DossAlet}}
- @String {DossAParis-short = {DossAParis}}
- @String {Dura-Europos-short = {Dura-Europos}}
- @String {EAA-short = {EAA}}
- @String {EAE-short = {EAE}}
- @String {EastWest-short = {EastWest}}
- @String {EcAntNimes-short = {EcAntNimes}}
- @String {EchosCl-short = {EchosCl}}
- @String {eDAI-F-short = {eDAI-F}}
- @String {eDAI-J-short = {eDAI-J}}
- @String {EgA-short = {EgA}}
- @String {Egnatia-short = {Egnatia}}
- @String {EgVicOr-short = {EgVicOr}}
- @String {Eikasmos-short = {Eikasmos}}
- @String {Eirene-short = {Eirene}}
- @String {Elenchos-short = {Elenchos}}
- @String {Ellenika-short = {Ellenika}}
- @String {Emerita-short = {Emerita}}
- @String {EmPrerom-short = {EmPrerom}}
- @String {Empuries-short = {Empúries}}%*Abweichung!
- @String {Enalia-short = {Enalia}}
- @String {EnaliaAnn-short = {EnaliaAnn}}
- @String {Enchoria-short = {Enchoria}}
- @String {Eos-short = {Eos}}
- @String {EpetBoiotMel-short = {EpetBoiotMel}}
- @String {EpetByzSpud-short = {EpetByzSpud}}
- @String {EpetKyklMel-short = {EpetKyklMel}}
- @String {EphemDac-short = {EphemDac}}
- @String {EphemNapoc-short = {EphemNapoc}}
- @String {EpigrAnat-short = {EpigrAnat}}
- @String {EpistEpetAth-short = {EpistEpetAth}}
- @String {EpistEpetPolytThess-short = {EpistEpetPolytThess}}
- @String {EpistEpetThess-short = {EpistEpetThess}}
- @String {EPRO-short = {EPRO}}
- @String {Eranos-short = {Eranos}}
- @String {EranosJb-short = {EranosJb}}
- @String {Eretria-short = {Eretria}}
- @String {Eretz-Israel-short = {Eretz-Israel}}
- @String {Ergon-short = {Ergon}}
- @String {ESA-short = {ESA}}
- @String {EspacioHist-short = {EspacioHist}}
- @String {EstMadr-short = {EstMadr}}
- @String {EstZaragoza-short = {EstZaragoza}}
- @String {EtACl-short = {EtACl}}
- @String {EtCl-short = {EtCl}}
- @String {EtClAix-short = {EtClAix}}
- @String {EtCret-short = {EtCret}}
- @String {Ethnos-short = {Ethnos}}
- @String {EtP-short = {EtP}}
- @String {EtPezenas-short = {EtPézenas}}%*Abweichung!
- @String {EtrSt-short = {EtrSt}}
- @String {Etruscans-short = {Etruscans}}
- @String {EtTrav-short = {EtTrav}}
- @String {Eulimene-short = {Eulimene}}
- @String {Eunomia-short = {Eunomia}}
- @String {Euphrosyne-short = {Euphrosyne}}
- @String {EurAnt-short = {EurAnt}}
- @String {EurRHist-short = {EurRHist}}
- @String {Eutopia-short = {Eutopia}}
- @String {EVP-short = {EVP}}
- @String {ExcIsr-short = {ExcIsr}}
- @String {Expedition-short = {Expedition}}
- @String {ExtremA-short = {ExtremA}}
- @String {FA-short = {FA}}
- @String {FAAK-short = {FAAK}}
- @String {Faenza-short = {Faenza}}
- @String {FAVA-short = {FAVA}}
- @String {Faventia-short = {Faventia}}
- @String {FBerBadWuert-short = {FBerBadWürt}}%*Abweichung!
- @String {FdC-short = {FdC}}
- @String {FdD-short = {FdD}}
- @String {FdX-short = {FdX}}
- @String {FeddersenWierde-short = {Feddersen Wierde}}%*Abweichung!
- @String {FelRav-short = {FelRav}}
- @String {FGrHist-short = {FGrHistr}}
- @String {FHG-short = {FHG}}
- @String {FiA-short = {FiA}}
- @String {FichEpigr-short = {FichEpigr}}
- @String {FiE-short = {FiE}}
- @String {FIFAO-short = {FIFAO}}
- @String {Figlina-short = {Figlina}}
- @String {Florentia-short = {Florentia}}
- @String {FlorIl-short = {FlorIl}}
- @String {FMRD-short = {FMRD}}
- @String {FMROe-short = {FMRÖ}}%*Abweichung!
- @String {FoggArtMusAcqu-short = {FoggArtMusAcqu}}
- @String {FolA-short = {FolA}}
- @String {FolOr-short = {FolOr}}
- @String {Fonaments-short = {Fonaments}}
- @String {Fondamenti-short = {Fondamenti}}
- @String {FontAPos-short = {FontAPos}}
- @String {Fontes-short = {Fontes}}
- @String {Forlimpopoli-short = {Forlimpopoli}}
- @String {Fornvaennen-short = {Fornvännen}}%*Abweichung!
- @String {Forum-short = {Forum}}
- @String {FR-short = {FR}}
- @String {FruehMitAltSt-short = {FrühMitAltSt}}%*Abweichung!
- @String {FuAusgrTrier-short = {FuAusgrTrier}}
- @String {FuB-short = {FuB}}
- @String {FuBerBadWuert-short = {FuBerBadWürt}}%*Abweichung!
- @String {FuBerHessen-short = {FuBerHessen}}
- @String {FuBerOe-short = {FuBerÖ}}%*Abweichung!
- @String {FuBerSchwab-short = {FuBerSchwab}}
- @String {FuF-short = {FuF}}
- @String {FuWien-short = {FuWien}}
- @String {GacNum-short = {GacNum}}
- @String {Gades-short = {Gades}}
- @String {Gallaecia-short = {Gallaecia}}
- @String {Gallia-short = {Gallia}}
- @String {GalliaInf-short = {GalliaInf}}
- @String {GalliaInfAReg-short = {GalliaInfAReg}}
- @String {GalliaPrehist-short = {GalliaPrehist}}
- @String {GaR-short = {GaR}}
- @String {GazBA-short = {GazBA}}
- @String {Genava-short = {Genava}}
- @String {GeoAnt-short = {GeoAnt}}
- @String {Germania-short = {Germania}}
- @String {Gesta-short = {Gesta}}
- @String {GettyMusJ-short = {GettyMusJ}}
- @String {GFA-short = {GFA}}
- @String {GGA-short = {GGA}}
- @String {GiornFilFerr-short = {GiornFilFerr}}
- @String {GiornItFil-short = {GiornItFil}}
- @String {GiornStorLun-short = {GiornStorLun}}
- @String {GiRoccPalermo-short = {GiRoccPalermo}}
- @String {Gladius-short = {Gladius}}
- @String {GlasAJ-short = {GlasAJ}}
- @String {GlasBeograd-short = {GlasBeograd}}
- @String {GlasSarajevo-short = {GlasSarajevo}}
- @String {Glotta-short = {Glotta}}
- @String {Gnomon-short = {Gnomon}}
- @String {GodDepA-short = {GodDepA}}
- @String {GodMuzPlov-short = {GodMuzPlov}}
- @String {GodMuzSof-short = {GodMuzSof}}
- @String {GodZborSkopje-short = {GodZborSkopje}}
- @String {GorLet-short = {GorLet}}
- @String {GoettMisz-short = {GöttMisz}}%*Abweichung!
- @String {GraRaspr-short = {GraRaspr}}
- @String {GrazBeitr-short = {GrazBeitr}}
- @String {GrLatOr-short = {GrLatOr}}
- @String {GrLatPrag-short = {GrLatPrag}}
- @String {GrRomByzSt-short = {GrRomByzSt}}
- @String {Gymnasium-short = {Gymnasium}}
- @String {Habis-short = {Habis}}
- @String {HallWPr-short = {HallWPr}}
- @String {Hama-short = {Hama}}
- @String {HambBeitrA-short = {HambBeitrA}}
- @String {HambBeitrNum-short = {HambBeitrNum}}
- @String {Handlingar-short = {Handlingar}}
- @String {HarvStClPhil-short = {HarvStClPhil}}
- @String {HarvTheolR-short = {HarvTheolR}}
- @String {HASB-short = {HASB}}
- @String {HAW-short = {HAW}}
- @String {HdArch-short = {HdArch}}
- @String {Head-short = {Head}}
- @String {Helbig-short = {Helbig}}
- @String {Helike-short = {Helike}}
- @String {Helikon-short = {Helikon}}
- @String {Helinium-short = {Helinium}}
- @String {Helios-short = {Helios}}
- @String {HellenikaJb-short = {HellenikaJb}}
- @String {HelvA-short = {HelvA}}
- @String {Hephaistos-short = {Hephaistos}}
- @String {Hermes-short = {Hermes}}
- @String {Herrscherbild-short = {Herrscherbild}}
- @String {Hesperia-short = {Hesperia}}
- @String {Hispania-short = {Hispania}}
- @String {HispAnt-short = {HispAnt}}
- @String {HispAntEpigr-short = {HispAntEpigra}}
- @String {HispEpigr-short = {HispEpigr}}
- @String {HistAnthr-short = {HistAnthr}}
- @String {HistArt-short = {HistArt}}
- @String {Historia-short = {Historia}}
- @String {Historica-short = {Historica}}
- @String {Histria-short = {Histria}}
- @String {HistriaA-short = {HistriaA}}
- @String {HistriaAnt-short = {HistriaAnt}}
- @String {HistSprF-short = {HistSprF}}
- @String {HKL-short = {HKL}}
- @String {Horos-short = {Horos}}
- @String {HSS-short = {HSS}}
- @String {HuelvaA-short = {HuelvaA}}
- @String {HumBild-short = {HumBild}}
- @String {Hyp-short = {Hyp}}
- @String {HZ-short = {HZ}}
- @String {IA-short = {IA}}
- @String {Iberia-short = {Iberia}}
- @String {IEJ-short = {IEJ}}
- @String {IG-short = {IG}}
- @String {IGCH-short = {IGCH}}
- @String {IGR-short = {IGR}}
- @String {IK-short = {IK}}
- @String {Ilerda-short = {Ilerda}}
- @String {Iliria-short = {Iliria}}
- @String {IllinClSt-short = {IllinClSt}}
- @String {ILN-short = {ILN}}
- @String {ILS-short = {ILS}}
- @String {IndexQuad-short = {IndexQuad}}
- @String {IndogermF-short = {IndogermF}}
- @String {IndUnArtB-short = {IndUnArtB}}
- @String {InsFulc-short = {InsFulc}}
- @String {InstNautAQ-short = {InstNautAQ}}
- @String {IntJClTrad-short = {IntJClTrad}}
- @String {IntJNautA-short = {IntJNautA}}
- @String {IntZSchauBibelWiss-short = {IntZSchauBibelWiss}}
- @String {InvLuc-short = {InvLuc}}
- @String {Ipek-short = {Ipek}}
- @String {Iran-short = {Iran}}
- @String {IrAnt-short = {IrAnt}}
- @String {IsrMusJ-short = {IsrMusJ}}
- @String {IsrMusN-short = {IsrMusN}}
- @String {IsrMusStA-short = {IsrMusStA}}
- @String {IsrNumJ-short = {IsrNumJ}}
- @String {IstanbAMuezYil-short = {IstanbAMüzYıl}}%*Abweichung!
- @String {IstForsch-short = {IstForsch}}
- @String {Isthmia-short = {Isthmia}}
- @String {IstMitt-short = {IstMitt}}
- @String {Italica-short = {Italica}}
- @String {ItNostr-short = {ItNostr}}
- @String {IzvBurgas-short = {IzvBurgas}}
- @String {IzvMuzJuzBalg-short = {IzvMuzJužBalg}}%*Abweichung!
- @String {IzvVarna-short = {IzvVarna}}
- @String {Jabega-short = {Jábega}}%*Abweichung!
- @String {JadrZbor-short = {JadrZbor}}
- @String {JAOS-short = {JAOS}}
- @String {JARCE-short = {JARCE}}
- @String {JASc-short = {JASc}}
- @String {JbAC-short = {JbAC}}
- @String {JbAkMainz-short = {JbAkMainz}}
- @String {JbBadWuert-short = {JbBadWürt}}%*Abweichung!
- @String {JbBerlMus-short = {JbBerlMus}}
- @String {JbBernHistMus-short = {JbBernHistMus}}
- @String {JberAugst-short = {JberAugst}}
- @String {JberBasel-short = {JberBasel}}
- @String {JberBayDenkmPfl-short = {JberBayDenkmPfl}}
- @String {JberProVindon-short = {JberProVindon}}
- @String {JberVgFrankf-short = {JberVgFrankf}}
- @String {JberZuerich-short = {JberZürich}}%*Abweichung!
- @String {JbGoett-short = {JbGött}}%*Abweichung!
- @String {JbHambKuSamml-short = {JbHambKuSamml}}
- @String {JbKHMWien-short = {JbKHMWien}}
- @String {JbKHSWien-short = {JbKHSWien}}
- @String {JbKleinasF-short = {JbKleinasF}}
- @String {JbMuench-short = {JbMünch}}%*Abweichung!
- @String {JbMusKGHamb-short = {JbMusKGHamb}}
- @String {JbMusLinz-short = {JbMusLinz}}
- @String {JbOeByz-short = {JbÖByz}}%*Abweichung!
- @String {JbPreussKul-short = {JbPreussKul}}
- @String {JbRGZM-short = {JbRGZM}}
- @String {JbSchwUrgesch-short = {JbSchwUrgesch}}
- @String {JCS-short = {JCS}}
- @String {JdI-short = {JdI}}
- @String {JEA-short = {JEA}}
- @String {JEChrSt-short = {JEChrSt}}
- @String {JEOL-short = {JEOL}}
- @String {JewelSt-short = {JewelSt}}
- @String {JFieldA-short = {JFieldA}}
- @String {JGS-short = {JGS}}
- @String {JHS-short = {JHS}}
- @String {JIbA-short = {JIbA}}
- @String {JJurP-short = {JJurP}}
- @String {JKuGesch-short = {JKuGesch}}
- @String {JMedA-short = {JMedA}}
- @String {JMedAnthrA-short = {JMedAnthrA}}
- @String {JMithrSt-short = {JMithrSt}}
- @String {JNES-short = {JNES}}
- @String {JNG-short = {JNG}}
- @String {JPrehistRel-short = {JPrehistRel}}
- @String {JRA-short = {JRA}}
- @String {JRomMilSt-short = {JRomMilSt}}
- @String {JRomPotSt-short = {JRomPotSt}}
- @String {JRS-short = {JRS}}
- @String {JSav-short = {JSav}}
- @String {JSchrVgHalle-short = {JSchrVgHalle}}
- @String {JSS-short = {JSS}}
- @String {JTheorA-short = {JTheorA}}
- @String {Jura-short = {Jura}}
- @String {JWaltersArtGal-short = {JWaltersArtGal}}
- @String {JWCI-short = {JWCI}}
- @String {Kadmos-short = {Kadmos}}
- @String {Kairos-short = {Kairos}}
- @String {Kalapodi-short = {Kalapodi}}
- @String {Kalathos-short = {Kalathos}}
- @String {Kalos-short = {Kalós}}%*Abweichung!
- @String {Karthago-short = {Karthago}}
- @String {Kemi-short = {Kêmi}}%*Abweichung!
- @String {Kenchreai-short = {Kenchreai}}
- @String {KentAR-short = {KentAR}}
- @String {Keos-short = {Keos}}
- @String {Kerameikos-short = {Kerameikos}}
- @String {Kernos-short = {Kernos}}
- @String {Klearchos-short = {Klearchos}}
- @String {Kleos-short = {Kleos}}
- @String {Klio-short = {Klio}}
- @String {Kodai-short = {Kodai}}
- @String {KoelnJb-short = {KölnJb}}%*Abweichung!
- @String {KoelnMusB-short = {KölnMusB}}%*Abweichung!
- @String {Kokalos-short = {Kokalos}}
- @String {KollAVA-short = {KollAVA}}
- @String {Kratylos-short = {Kratylos}}
- @String {KretChron-short = {KretChron}}
- @String {KSIA-short = {KSIA}}
- @String {KSIAKiev-short = {KSIAKiev}}
- @String {KST-short = {KST}}
- @String {Ktema-short = {Ktema}}
- @String {KuGeschAnz-short = {KuGeschAnz}}
- @String {Kuml-short = {Kuml}}
- @String {Kunstchronik-short = {Kunstchronik}}
- @String {KuOr-short = {KuOr}}
- @String {Kush-short = {Kush}}
- @String {KuWeltBerlMus-short = {KuWeltBerlMus}}
- @String {KypA-short = {KypA}}
- @String {KypSpud-short = {KypSpud}}
- @String {Labeo-short = {Labeo}}
- @String {LAe-short = {LÄ}}%*Abweichung!
- @String {Laietania-short = {Laietania}}
- @String {Lampas-short = {Lampas}}
- @String {Lancia-short = {Lancia}}
- @String {LandKunVierJBl-short = {LandKunVierJBl}}
- @String {LangOrAnc-short = {LangOrAnc}}
- @String {Latinitas-short = {Latinitas}}
- @String {Latomus-short = {Latomus}}
- @String {Laverna-short = {Laverna}}
- @String {LCS-short = {LCS}}
- @String {Levant-short = {Levant}}
- @String {Lexis-short = {Lexis}}
- @String {LF-short = {LF}}
- @String {LibSt-short = {LibSt}}
- @String {LibyaAnt-short = {LibyaAnt}}
- @String {LibycaBServAnt-short = {LibycaBServAnt}}
- @String {LibycaTrav-short = {LibycaTrav}}
- @String {Liddell-­Scott-Jones-short = {Liddell -- ­Scott -- Jones}}%*Abweichung!
- @String {LIMC-short = {LIMC}}
- @String {Limesforschungen-short = {Limesforschungen}}
- @String {Lindos-short = {Lindos}}
- @String {LingIt-short = {LingIt}}
- @String {LTUR-short = {LTUR}}
- @String {Lucentum-short = {Lucentum}}
- @String {LundAR-short = {LundAR}}
- @String {Lustrum-short = {Lustrum}}
- @String {Lykia-short = {Lykia}}
- @String {MacActaA-short = {MacActaA}}
- @String {Maecenas-short = {Maecenas}}
- @String {MAGesGraz-short = {MAGesGraz}}
- @String {MAGesStei-short = {MAGesStei}}
- @String {Maia-short = {Maia}}
- @String {Mainake-short = {Mainake}}
- @String {MAInstUngAk-short = {MAInstUngAk}}
- @String {MainzZ-short = {MainzZ}}
- @String {MakedNasl-short = {MakedNasl}}
- @String {Makedonika-short = {Makedonika}}
- @String {MAMA-short = {MAMA}}
- @String {MAnthrWien-short = {MAnthrWien}}
- @String {MARo-short = {MAR}}
- @String {MarbWPr-short = {MarbWPr}}
- @String {Marche-short = {Marche}}
- @String {Mari-short = {Mari}}
- @String {Marisia-short = {Marisia}}
- @String {MarNero-short = {MarNero}}
- @String {Marsyas-short = {Marsyas}}
- @String {MascaJ-short = {MascaJ}}
- @String {MascaP-short = {MascaP}}
- @String {Mastia-short = {Mastia}}
- @String {MatABSSR-short = {MatABSSR}}
- @String {MatASevPri-short = {MatASevPri}}
- @String {MatCercA-short = {MatCercA}}
- @String {MatIsslA-short = {MatIsslA}}
- @String {MatStar-short = {MatStar}}
- @String {MatStarWczes-short = {MatStarWczes}}
- @String {MatTestiCl-short = {MatTestiCl}}
- @String {MatWczes-short = {MatWczes}}
- @String {MAVA-short = {MAVA}}
- @String {MB-short = {MB}}
- @String {MBAH-short = {MBAH}}
- @String {MBlVFruehGesch-short = {MBlVFrühGesch}}%*Abweichung!
- @String {MDAIK-short = {MDAIK}}
- @String {MDAVerb-short = {MDAVerb}}
- @String {MdI-short = {MdI}}
- @String {MDOG-short = {MDOG}}
- @String {Meander-short = {Meander}}
- @String {MedA-short = {MedA}}
- @String {MedAnt-short = {MedAnt}}
- @String {MeddelGlypt-short = {MeddelGlypt}}
- @String {MeddelLund-short = {MeddelLund}}
- @String {MeddelThor-short = {MeddelThor}}
- @String {MededRom-short = {MededRom}}
- @String {MedelhavsMusB-short = {MedelhavsMusB}}
- @String {MedHistR-short = {MedHistR}}
- @String {MedievA-short = {MedievA}}
- @String {MediSec-short = {MediSec}}
- @String {MEFRA-short = {MEFRA}}
- @String {MelBeyrouth-short = {MelBeyrouth}}
- @String {MelCasaVelazquez-short = {MelCasaVelazquez}}
- @String {MemAcInscr-short = {MemAcInscr}}
- @String {MemAmAc-short = {MemAmAc}}
- @String {MemAnt-short = {MemAnt}}
- @String {MemAntFr-short = {MemAntFr}}
- @String {MemBarcelA-short = {MemBarcelA}}
- @String {MemBologna-short = {MemBologna}}
- @String {MemHistAnt-short = {MemHistAnt}}
- @String {MemInstNatFr-short = {MemInstNatFr}}
- @String {MemLinc-short = {MemLinc}}
- @String {MemNap-short = {MemNap}}
- @String {MemPontAc-short = {MemPontAc}}
- @String {MemStor-short = {MemStor}}
- @String {MemStorFriuli-short = {MemStorFriuli}}
- @String {Merida-short = {Mérida}}%*Abweichung!
- @String {MeridaMem-short = {MéridaMem}}%*Abweichung!
- @String {Meroitica-short = {Meroitica}}
- @String {Mesopotamia-short = {Mesopotamia}}
- @String {Messana-short = {Messana}}
- @String {Metis-short = {Métis}}%*Abweichung!
- @String {MetrMusJ-short = {MetrMusJ}}
- @String {MetrMusSt-short = {MetrMusSt}}
- @String {MF-short = {MF}}
- @String {MFruehChrOe-short = {MFrühChrÖ}}%*Abweichung!
- @String {Milet-short = {Milet}}
- @String {MilForsch-short = {MilForsch}}
- @String {MinEpigrP-short = {MinEpigrP}}
- @String {Minerva-short = {Minerva}}
- @String {Minos-short = {Minos}}
- @String {MInstWasser-short = {MInstWasser}}
- @String {MIO-short = {MIO}}
- @String {MiscCrAnt-short = {MiscCrAnt}}
- @String {MiscStStor-short = {MiscStStor}}
- @String {MitChrA-short = {MitChrA}}
- @String {MKT-short = {MKT}}
- @String {MKuHistFlorenz-short = {MKuHistFlorenz}}
- @String {MKul-short = {MKul}}
- @String {MM-short = {MM}}
- @String {Mnemosyne-short = {Mnemosyne}}
- @String {MOeNumGes-short = {MÖNumGes}}%*Abweichung!
- @String {MonAnt-short = {MonAnt}}
- @String {MonInst-short = {MonInst}}
- @String {MonPiot-short = {MonPiot}}
- @String {MonPitt-short = {MonPitt}}
- @String {Mozia-short = {Mozia}}
- @String {MPraehistKomWien-short = {MPraehistKomWien}}%*Abweichung!
- @String {MSAtene-short = {MSAtene}}
- @String {MSchliemann-short = {MSchliemann}}
- @String {MSchwUrFruehGesch-short = {MSchwUrFrühGesch}}%*Abweichung!
- @String {MSpaetAByz-short = {MSpätAByz}}%*Abweichung!
- @String {MueJb-short = {MüJb}}%*Abweichung!
- @String {MuenchBeitrVFG-short = {MünchBeitrVFG}}%*Abweichung!
- @String {MuenchStSprWiss-short = {MünchStSprWiss}}%*Abweichung!
- @String {MuM-short = {MuM}}
- @String {MusAfr-short = {MusAfr}}
- @String {MusBenaki-short = {MusBenaki}}
- @String {MusCrit-short = {MusCrit}}
- @String {Muse-short = {Muse}}
- @String {Museon-short = {Muséon}}%*Abweichung!
- @String {MuseumUnesco-short = {MuseumUnesco}}
- @String {MusFerr-short = {MusFerr}}
- @String {MusGalIt-short = {MusGalIt}}
- @String {MusHaaretz-short = {MusHaaretz}}
- @String {MusHelv-short = {MusHelv}}
- @String {MusKoeln-short = {MusKöln}}%*Abweichung!
- @String {MusNotAmNumSoc-short = {MusNotAmNumSoc}}
- @String {MusPontevedra-short = {MusPontevedra}}
- @String {MusRiv-short = {MusRiv}}
- @String {MusTusc-short = {MusTusc}}
- @String {MuzEvkSzeged-short = {MuzEvkSzeged}}
- @String {MuzNa-short = {MuzNa}}
- @String {MuzPamKul-short = {MuzPamKul}}
- @String {NachrArbUWA-short = {NachrArbUWA}}
- @String {NapNobil-short = {NapNobil}}
- @String {NassAnn-short = {NassAnn}}
- @String {NAWG-short = {NAWG}}
- @String {NBWorcArtMus-short = {NBWorcArtMus}}
- @String {NEphemSemEpigr-short = {NEphemSemEpigr}}
- @String {NewsletterAthen-short = {NewsletterAthen}}
- @String {NewsletterPotTech-short = {NewsletterPotTech}}
- @String {NGWG-short = {NGWG}}
- @String {NigCl-short = {NigCl}}
- @String {Nikephoros-short = {Nikephoros}}
- @String {Nin-short = {Nin}}
- @String {NNM-short = {NNM}}
- @String {NomChron-short = {NomChron}}
- @String {Norba-short = {Norba}}
- @String {NordNumArs-short = {NordNumArs}}
- @String {NotABerg-short = {NotABerg}}
- @String {NotAHisp-short = {NotAHisp}}
- @String {NotAHispPrehistoria-short = {NotAHispPrehistoria}}
- @String {NotAllumiere-short = {NotAllumiere}}
- @String {NotALomb-short = {NotALomb}}
- @String {NotMilano-short = {NotMilano}}
- @String {NouvClio-short = {NouvClio}}
- @String {Novaensia-short = {Novaensia}}
- @String {NSc-short = {NSc}}
- @String {NStFan-short = {NStFan}}
- @String {NubChr-short = {NubChr}}
- @String {NubLet-short = {NubLet}}
- @String {NueBlA-short = {NüBlA}}%*Abweichung!
- @String {NumAntCl-short = {NumAntCl}}
- @String {Numantia-short = {Numantia}}
- @String {NumChron-short = {NumChron}}
- @String {Numen-short = {Numen}}
- @String {NumEpigr-short = {NumEpigr}}
- @String {Numisma-short = {Numisma}}
- @String {NumismaticaRom-short = {NumismaticaRom}}
- @String {Numizmaticar-short = {Numizmatičar}}%*Abweichung!
- @String {Nummus-short = {Nummus}}
- @String {NumZ-short = {NumZ}}
- @String {NuovDidask-short = {NuovDidask}}
- @String {OccasPublClSt-short = {OccasPublClSt}}
- @String {OccOr-short = {OccOr}}
- @String {OGIS-short = {OGIS}}
- @String {OeJh-short = {ÖJh}}%*Abweichung!
- @String {OF-short = {OF}}
- @String {Offa-short = {Offa}}
- @String {Ogam-short = {Ogam}}
- @String {Oikumene-short = {Oikumene}}
- @String {OIP-short = {OIP}}
- @String {Olba-short = {Olba}}
- @String {OlBer-short = {OlBer}}
- @String {Olympia-short = {Olympia}}
- @String {Olynthus-short = {Olynthus}}
- @String {OLZ-short = {OLZ}}
- @String {OpArch-short = {OpArch}}
- @String {OpAth-short = {OpAth}}
- @String {OpFin-short = {OpFin}}
- @String {OpPomp-short = {OpPomp}}
- @String {OpRom-short = {OpRom}}
- @String {Opus-short = {Opus}}
- @String {Or-short = {Or}}
- @String {OrA-short = {OrA}}
- @String {OrAnt-short = {OrAnt}}
- @String {OrbTerr-short = {OrbTerr}}
- @String {OrChr-short = {OrChr}}
- @String {OrChrPer-short = {OrChrPer}}
- @String {Ordona-short = {Ordona}}
- @String {Orient-short = {Orient}}
- @String {Origini-short = {Origini}}
- @String {Orizzonti-short = {Orizzonti}}
- @String {Orpheus-short = {Orpheus}}
- @String {OrpheusThracSt-short = {OrpheusThracSt}}
- @String {OrSu-short = {OrSu}}
- @String {OsjZbor-short = {OsjZbor}}
- @String {OstbGrenzm-short = {OstbGrenzm}}
- @String {Ostraka-short = {Ostraka}}
- @String {OudhMeded-short = {OudhMeded}}
- @String {OxfJA-short = {OxfJA}}
- @String {OxfStPhilos-short = {OxfStPhilos}}
- @String {Pact-short = {Pact}}
- @String {Padusa-short = {Padusa}}
- @String {PagA-short = {PagA}}
- @String {PAI-short = {PAI}}
- @String {Paideuma-short = {Paideuma}}
- @String {Palaeohistoria-short = {Palaeohistoria}}
- @String {Paleohispanica-short = {Paleohispánica}}%*Abweichung!
- @String {Palladio-short = {Palladio}}
- @String {Pallas-short = {Pallas}}
- @String {Palmet-short = {Palmet}}
- @String {PamA-short = {PamA}}
- @String {Pan-short = {Pan}}
- @String {PapBilb-short = {PapBilb}}
- @String {Papyri-short = {Papyri}}
- @String {Parthica-short = {Parthica}}
- @String {Partenope-short = {Partenope}}
- @String {PAS-short = {PAS}}
- @String {PBF-short = {PBF}}
- @String {Pegasus-short = {Pegasus}}
- @String {PEQ-short = {PEQ}}
- @String {Peristil-short = {Peristil}}
- @String {Persica-short = {Persica}}
- @String {Peuce-short = {Peuce}}
- @String {PF-short = {PF}}
- @String {Pharos-short = {Pharos}}
- @String {Philologus-short = {Philologus}}
- @String {Phoenix-short = {Phoenix}}
- @String {PhoenixExOrLux-short = {PhoenixExOrLux}}
- @String {Phoibos-short = {Phoibos}}
- @String {Phronesis-short = {Phronesis}}
- @String {Picus-short = {Picus}}
- @String {LPIR-short = {LPIR}}
- @String {PKG-short = {PKG}}
- @String {Platon-short = {Platon}}
- @String {PLup-short = {PLup}}
- @String {PolAMed-short = {PolAMed}}
- @String {Polemon-short = {Polemon}}
- @String {Polis-short = {Polis}}
- @String {PompHercStab-short = {PompHercStab}}
- @String {Pontica-short = {Pontica}}
- @String {Portugalia-short = {Portugalia}}
- @String {PP-short = {PP}}
- @String {PPM-short = {PPM}}
- @String {PraceA-short = {PraceA}}
- @String {PraceMatLodz-short = {PraceMatŁodz}}%*Abweichung!
- @String {Prakt-short = {Prakt}}
- @String {PraktAkAth-short = {PraktAkAth}}
- @String {PreistAlp-short = {PreistAlp}}
- @String {PriloziZagreb-short = {PriloziZagreb}}
- @String {PrincViana-short = {PrincViana}}
- @String {ProblIsk-short = {ProblIsk}}
- @String {ProcAfrClAss-short = {ProcAfrClAss}}
- @String {ProcCambrPhilSoc-short = {ProcCambrPhilSoc}}
- @String {ProcDanInstAth-short = {ProcDanInstAth}}
- @String {ProcPrehistSoc-short = {ProcPrehistSoc}}
- @String {Prometheus-short = {Prometheus}}
- @String {ProspAQuad-short = {ProspAQuad}}
- @String {Prospettiva-short = {Prospettiva}}
- @String {Prospezioni-short = {Prospezioni}}
- @String {ProvHist-short = {ProvHist}}
- @String {ProvLucca-short = {ProvLucca}}
- @String {PublInstTTMeneses-short = {PublInstTTMeneses}}
- @String {Pulpudeva-short = {Pulpudeva}}
- @String {Puteoli-short = {Puteoli}}
- @String {Pyrenae-short = {Pyrenae}}
- @String {PZ-short = {PZ}}
- @String {QDAP-short = {QDAP}}
- @String {QuadABarcel-short = {QuadABarcel}}
- @String {QuadACagl-short = {QuadACagl}}
- @String {QuadACal-short = {QuadACal}}
- @String {QuadALibya-short = {QuadALibya}}
- @String {QuadAMant-short = {QuadAMant}}
- @String {QuadAMess-short = {QuadAMess}}
- @String {QuadAOst-short = {QuadAOst}}
- @String {QuadAPiem-short = {QuadAPiem}}
- @String {QuadAquil-short = {QuadAquil}}
- @String {QuadAReggio-short = {QuadAReggio}}
- @String {QuadAVen-short = {QuadAVen}}
- @String {QuadCast-short = {QuadCast}}
- @String {QuadCat-short = {QuadCat}}
- @String {QuadChieti-short = {QuadChieti}}
- @String {QuadErb-short = {QuadErb}}
- @String {QuadFriulA-short = {QuadFriulA}}
- @String {QuadGerico-short = {QuadGerico}}
- @String {QuadIstFilGr-short = {QuadIstFilGr}}
- @String {QuadIstLat-short = {QuadIstLat}}
- @String {QuadLecce-short = {QuadLecce}}
- @String {QuadMusPontecorvo-short = {QuadMusPontecorvo}}
- @String {QuadMusSalinas-short = {QuadMusSalinas}}
- @String {QuadProtost-short = {QuadProtost}}
- @String {QuadStLun-short = {QuadStLun}}
- @String {QuadStor-short = {QuadStor}}
- @String {QuadStorici-short = {QuadStorici}}
- @String {QuadUrbin-short = {QuadUrbin}}
- @String {Quaternaria-short = {Quaternaria}}
- @String {RA-short = {RA}}
- @String {RAArtLouv-short = {RAArtLouv}}
- @String {RAC-short = {RAC}}
- @String {RACFr-short = {RACFr}}
- @String {RAComo-short = {RAComo}}
- @String {RACr-short = {RACr}}
- @String {RadAkZadar-short = {RadAkZadar}}
- @String {Radiocarbon-short = {Radiocarbon}}
- @String {RadSplit-short = {RadSplit}}
- @String {RAE-short = {RAE}}
- @String {Raggi-short = {Raggi}}
- @String {RAMadrid-short = {RAMadrid}}
- @String {RANarb-short = {RANarb}}
- @String {RAPon-short = {RAPon}}
- @String {RapWyk-short = {RapWyk}}
- @String {RArchBiblMus-short = {RArchBiblMus}}
- @String {RArcheom-short = {RArcheom}}
- @String {RArtMus-short = {RArtMus}}
- @String {RassAPiomb-short = {RassAPiomb}}
- @String {RassLazio-short = {RassLazio}}
- @String {RassStorSalern-short = {RassStorSalern}}
- @String {RassVolt-short = {RassVolt}}
- @String {RAssyr-short = {RAssyr}}
- @String {Ratiariensia-short = {Ratiariensia}}
- @String {RAtlMed-short = {RAtlMed}}
- @String {RavStRic-short = {RavStRic}}
- @String {Raydan-short = {Raydan}}
- @String {RB-short = {RB}}
- @String {RBelgNum-short = {RBelgNum}}
- @String {RBelgPhilHist-short = {RBelgPhilHist}}
- @String {LRBK-short = {LRBK}}
- @String {RCulClMedioev-short = {RCulClMedioev}}
- @String {RdA-short = {RdA}}
- @String {RDAC-short = {RDAC}}
- @String {RdE-short = {RdE}}
- @String {RDroitsAnt-short = {RDroitsAnt}}
- @String {RE-short = {RE}}
- @String {REA-short = {REA}}
- @String {REByz-short = {REByz}}
- @String {RecConstantine-short = {RecConstantine}}
- @String {RechACrac-short = {RechACrac}}
- @String {RechAlb-short = {RechAlb}}
- @String {RecMusAlcoi-short = {RecMusAlcoi}}
- @String {RecTrav-short = {RecTrav}}
- @String {REG-short = {REG}}
- @String {ReiCretActa-short = {ReiCretActa}}
- @String {ReiCretCommunic-short = {ReiCretCommunic}}
- @String {REL-short = {REL}}
- @String {Rema-short = {Rema}}
- @String {RendBologna-short = { RendBologna}}
- @String {RendIstLomb-short = {RendIstLomb}}
- @String {RendLinc-short = {RendLinc}}
- @String {RendNap-short = {RendNap}}
- @String {RendPontAc-short = {RendPontAc}}
- @String {RepMalta-short = {RepMalta}}
- @String {Reppal-short = {Reppal}}
- @String {RepSocLibSt-short = {RepSocLibSt}}
- @String {RES-short = {RES}}
- @String {REstIber-short = {REstIber}}
- @String {REtArm-short = {REtArm}}
- @String {RevEg-short = {RevEg}}
- @String {RFil-short = {RFil}}
- @String {RGeorgCauc-short = {RGeorgCauc}}
- @String {RGF-short = {RGF}}
- @String {RGuimar-short = {RGuimar}}
- @String {RHA-short = {RHA}}
- @String {RheinMusBonn-short = {RheinMusBonn}}
- @String {RHistArmees-short = {RHistArmees}}%*Abweichung!
- @String {RHistRel-short = {RHistRel}}
- @String {RhM-short = {RhM}}
- @String {RIA-short = {RIA}}
- @String {RIC-short = {RIC}}
- @String {RicEgAntCopt-short = {RicEgAntCopt}}
- @String {RicognA-short = {RicognA}}
- @String {RicStBrindisi-short = {RicStBrindisi}}
- @String {RIngIntem-short = {RIngIntem}}
- @String {RItNum-short = {RItNum}}
- @String {RlA-short = {RlA}}
- @String {RLouvre-short = {RLouvre}}
- @String {RM-short = {RM}}
- @String {RNum-short = {RNum}}
- @String {RoczMuzWarsz-short = {RoczMuzWarsz}}
- @String {RoemOe-short = {RömÖ}}%*Abweichung!
- @String {RoemQSchr-short = {RömQSchr}}%*Abweichung!
- @String {Romanobarbarica-short = {Romanobarbarica}}
- @String {RomGens-short = {RomGens}}
- @String {RoscherML-short = {Roscher, ML}}%*Abweichung!
- @String {RossA-short = {RossA}}
- @String {RPC-short = {RPC}}
- @String {RPhil-short = {RPhil}}
- @String {RPortA-short = {RPortA}}
- @String {RPorto-short = {RPorto}}
- @String {RRC-short = {RRC}}
- @String {RSaintonge-short = {RSaintonge}}
- @String {RScPreist-short = {RScPreist}}
- @String {RSO-short = {RSO}}
- @String {RStBiz-short = {RStBiz}}
- @String {RStCl-short = {RStCl}}
- @String {RStFen-short = {RStFen}}
- @String {RStLig-short = {RStLig}}
- @String {RStMarch-short = {RStMarch}}
- @String {RStorAnt-short = {RStorAnt}}
- @String {RStorCal-short = {RStorCal}}
- @String {RStPomp-short = {RStPomp}}
- @String {RStPun-short = {RStPun}}
- @String {RTopAnt-short = {RTopAnt}}
- @String {Rudiae-short = {Rudiae}}
- @String {SaalbJb-short = {SaalbJb}}
- @String {SaarBeitr-short = {SaarBeitr}}
- @String {SaarStMat-short = {SaarStMat}}
- @String {Sacer-short = {Sacer}}
- @String {Saeculum-short = {Saeculum}}
- @String {SAGA-short = {SAGA}}
- @String {SaggiFen-short = {SaggiFen}}
- @String {Saguntum-short = {Saguntum}}
- @String {Saitabi-short = {Saitabi}}
- @String {SAK-short = {SAK}}
- @String {Salduie-short = {Salduie}}
- @String {Samothrace-short = {Samothrace}}
- @String {Sandalion-short = {Sandalion}}
- @String {Sardis-short = {Sardis}}
- @String {Sargetia-short = {Sargetia}}
- @String {SarkSt-short = {SarkSt}}
- @String {Sautuola-short = {Sautuola}}
- @String {Savaria-short = {Savaria}}
- @String {SBBerlin-short = {SBBerlin}}
- @String {SBLeipzig-short = {SBLeipzig}}
- @String {SBMuenchen-short = {SBMünchen}}%*Abweichung!
- @String {SborBrno-short = {SborBrno}}
- @String {SBWien-short = {SBWien}}
- @String {ScAnt-short = {ScAnt}}
- @String {SCE-short = {SCE}}
- @String {SchildStei-short = {SchildStei}}
- @String {Scholia-short = {Scholia}}
- @String {SchwMueBl-short = {SchwMüBl}}%*Abweichung!
- @String {SchwNumRu-short = {SchwNumRu}}
- @String {ScrCiv-short = {ScrCiv}}
- @String {ScrClIsr-short = {ScrClIsr}}
- @String {ScrHieros-short = {ScrHieros}}
- @String {ScrMed-short = {ScrMed}}
- @String {SDAIK-short = {SDAIK}}
- @String {SEG-short = {SEG}}
- @String {SeminRom-short = {SeminRom}}
- @String {Semitica-short = {Semitica}}
- @String {SetubalA-short = {SetubalA}}
- @String {Sibrium-short = {Sibrium}}
- @String {SicA-short = {SicA}}
- @String {SicGymn-short = {SicGymn}}
- @String {SIG-short = {SIG}}
- @String {Sileno-short = {Sileno}}
- @String {SilkRoadArtA-short = {SilkRoadArtA}}
- @String {SIMA-short = {SIMA}}
- @String {Simblos-short = {Simblos}}
- @String {Skyllis-short = {Skyllis}}
- @String {SlovA-short = {SlovA}}
- @String {SlovNum-short = {SlovNum}}
- @String {SMEA-short = {SMEA}}
- @String {SNG-short = {SNG}}
- @String {SocGeoAOran-short = {SocGeoAOran}}
- @String {SoobErmit-short = {SoobErmit}}
- @String {SoobMuzMoskva-short = {SoobMuzMoskva}}
- @String {SovA-short = {SovA}}
- @String {Spal-short = {Spal}}
- @String {SpNov-short = {SpNov}}
- @String {Spoletium-short = {Spoletium}}
- @String {StA-short = {StA}}
- @String {Stadion-short = {Stadion}}
- @String {StaedelJb-short = {StädelJb}}%*Abweichung!
- @String {StAeg-short = {StAeg}}
- @String {StAlb-short = {StAlb}}
- @String {StAnt-short = {StAnt}}
- @String {Starinar-short = {Starinar}}
- @String {StAWarsz-short = {StAWarsz}}
- @String {StBiFranc-short = {StBiFranc}}
- @String {StBitont-short = {StBitont}}
- @String {StBoT-short = {StBoT}}
- @String {StCercIstorV-short = {StCercIstorV}}
- @String {StCercNum-short = {StCercNum}}
- @String {StCl-short = {StCl}}
- @String {StClOr-short = {StClOr}}
- @String {StDocA-short = {StDocA}}
- @String {StDocHistIur-short = {StDocHistIur}}
- @String {StEbla-short = {StEbla}}
- @String {StEgAntPun-short = {StEgAntPun}}
- @String {SteMat-short = {SteMat}}
- @String {StEpigrLing-short = {StEpigrLing}}
- @String {StEtr-short = {StEtr}}
- @String {StGenu-short = {StGenu}}
- @String {StHist-short = {StHist}}
- @String {StiftHambKuSamml-short = {StiftHambKuSamml}}
- @String {StItFilCl-short = {StItFilCl}}
- @String {StLatIt-short = {StLatIt}}
- @String {StMagreb-short = {StMagreb}}
- @String {StMatStorRel-short = {StMatStorRel}}
- @String {StOliv-short = {StOliv}}
- @String {StOr-short = {StOr}}
- @String {StOrCr-short = {StOrCr}}
- @String {StP-short = {StP}}
- @String {StrennaRom-short = {StrennaRom}}
- @String {StRom-short = {StRom}}
- @String {StRomagn-short = {StRomagn}}
- @String {StSalent-short = {StSalent}}
- @String {StSard-short = {StSard}}
- @String {StStorRel-short = {StStorRel}}
- @String {StTardoant-short = {StTardoant}}
- @String {StTrentStor-short = {StTrentStor}}
- @String {StTroica-short = {StTroica}}
- @String {StUrbin-short = {StUrbin}}
- @String {Sumer-short = {Sumer}}
- @String {SylvaMala-short = {Sylva Mala}}%*Abweichung!
- @String {SymbOslo-short = {SymbOslo}}
- @String {Syria-short = {Syria}}
- @String {SyrMesopSt-short = {SyrMesopSt}}
- @String {TAD-short = {TAD}}
- @String {Talanta-short = {Talanta}}
- @String {TAM-short = {TAM}}
- @String {Taras-short = {Taras}}
- @String {Tarsus-short = {ETarsus}}
- @String {TAVO-short = {TAVO}}
- @String {TeherF-short = {TeherF}}
- @String {Teiresias-short = {Teiresias}}
- @String {TelAvivJA-short = {TelAvivJA}}
- @String {TerraAntBalc-short = {TerraAntBalc}}
- @String {TerraVolsci-short = {TerraVolsci}}
- @String {Teruel-short = {Teruel}}
- @String {TextilAnc-short = {TextilAnc}}
- @String {TheolRu-short = {TheolRu}}
- @String {ThesCRA-short = {ThesCRA}}
- @String {Thessalika-short = {Thessalika}}
- @String {Thessalonike-short = {Thessalonike}}
- @String {Thieme-Becker-short = {Thieme -- Becker}}%*Abweichung!
- @String {ThrakChron-short = {ThrakChron}}
- @String {ThrakEp-short = {ThrakEp}}
- @String {TIB-short = {TIB}}
- @String {Tibiscus-short = {Tibiscus}}
- @String {TiLeon-short = {TiLeon}}
- @String {Tiryns-short = {Tiryns}}
- @String {TMA-short = {TMA}}
- @String {Topoi-short = {Topoi}}
- @String {Torretta-short = {Torretta}}
- @String {TourOrleOr-short = {TourOrleOr}}
- @String {TrabAntrEtn-short = {TrabAntrEtn}}
- @String {TrabArq-short = {TrabArq}}
- @String {TrabAssArqPort-short = {TrabAssArqPort}}
- @String {TrabNavarra-short = {TrabNavarra}}
- @String {TrabPrehist-short = {TrabPrehist}}
- @String {Traditio-short = {Traditio}}
- @String {TransactAmPhilAss-short = {TransactAmPhilAss}}
- @String {TransactAmPhilosSoc-short = {TransactAmPhilosSoc}}
- @String {TransactLond-short = {TransactLond}}
- @String {TravMem-short = {TravMem}}
- @String {TravToulouse-short = {TravToulouse}}
- @String {TreMonet-short = {TreMonet}}
- @String {TribArq-short = {TribArq}}
- @String {TrudyErmit-short = {Trudy}}
- @String {TrWPr-short = {TrWPr}}
- @String {TrZ-short = {TrZ}}
- @String {TTKY-short = {TTKY}}
- @String {TueBA-Ar-short = {TüBA-Ar}}%*Abweichung!
- @String {Tyche-short = {Tyche}}
- @String {UF-short = {UF}}
- @String {UPA-short = {UPA}}
- @String {LUrbe-short = {L’Urbe}}%*Abweichung!
- @String {UrSchw-short = {UrSchw}}
- @String {UVB-short = {UVB}}
- @String {VarSpom-short = {VarSpom}}
- @String {VDI-short = {VDI}}
- @String {Vekove-short = {Vekove}}
- @String {Veleia-short = {Veleia}}
- @String {VenArt-short = {VenArt}}
- @String {VerAmstMeded-short = {VerAmstMeded}}
- @String {Verbanus-short = {Verbanus}}
- @String {VeteraChr-short = {VeteraChr}}
- @String {VGesVind-short = {VGesVind}}
- @String {Vichiana-short = {Vichiana}}
- @String {VicOr-short = {VicOr}}
- @String {VigChr-short = {VigChr}}
- @String {Viminacium-short = {Viminacium}}
- @String {VisRel-short = {VisRel}}
- @String {Vitudurum-short = {Vitudurum}}
- @String {VivScyl-short = {VivScyl}}
- @String {VizVrem-short = {VizVrem}}
- @String {VjesAMuzZagreb-short = {VjesAMuzZagreb}}
- @String {VjesDal-short = {VjesDal}}
- @String {Wad-al-Hayara-short = {Wad-al-Hayara}}
- @String {WeltGesch-short = {WeltGesch}}
- @String {WiadA-short = {WiadA}}
- @String {WissMBosn-short = {WissMBosn}}
- @String {WissZBerl-short = {WissZBerl}}
- @String {WissZHalle-short = {WissZHalle}}
- @String {WissZJena-short = {WissZJena}}
- @String {WissZRostock-short = {WissZRostock}}
- @String {WO-short = {WO}}
- @String {WorldA-short = {WorldA}}
- @String {WSt-short = {WSt}}
- @String {WuerzbJb-short = {WürzbJb}}%*Abweichung!
- @String {WVDOG-short = {WVDOG}}
- @String {WZKM-short = {WZKM}}
- @String {Xenia-short = {Xenia}}
- @String {XeniaAnt-short = {XeniaAnt}}
- @String {XeniaKonst-short = {XeniaKonst}}
- @String {YaleClSt-short = {YaleClSt}}
- @String {YaleUnivB-short = {YaleUnivB}}
- @String {ZA-short = {ZA}}
- @String {ZAAK-short = {ZAAK}}
- @String {ZAeS-short = {ZÄS}}%*Abweichung!
- @String {ZAKSSchriften-short = {ZAKSSchriften}}
- @String {ZAntChr-short = {ZAntChr}}
- @String {ZAW-short = {ZAW}}
- @String {ZborMuzBeograd-short = {ZborMuzBeograd}}
- @String {ZborRadBeograd-short = {ZborRadBeograd}}
- @String {ZborZadar-short = {ZborZadar}}
- @String {ZDMG-short = {ZDMG}}
- @String {ZDPV-short = {ZDPV}}
- @String {Zephyrus-short = {Zephyrus}}
- @String {ZEthn-short = {ZEthn}}
- @String {ZfA-short = {ZfA}}
- @String {ZfNum-short = {ZfNum}}
- @String {ZivaAnt-short = {ZivaAnt}}
- @String {ZKuGesch-short = {ZKuGesch}}
- @String {ZNW-short = {ZNW}}
- @String {ZPE-short = {ZPE}}
- @String {ZSav-short = {ZSav}}
- @String {ZSchwA-short = {ZSchwA}}
- @String {ZVerglSprF-short = {ZVerglSprF}}
+@String {AA-short = {AA}}
+@String {AAA-short = {AAA}}
+@String {AAcque-short = {AAcque}}
+@String {AAdv-short = {AAdv}}
+@String {AAJ-short = {AAJ}}
+@String {AAlpi-short = {AAlpi}}
+@String {AarbKob-short = {AarbKøb}}%*Abweichung!
+@String {AArchit-short = {AArchit}}
+@String {AAS-short = {AAS}}
+@String {AASOR-short = {AASOR}}
+@String {AAusgrBadWuert-short = {AAusgrBadWürt}}%*Abweichung!
+@String {AAustr-short = {AAustr}}
+@String {ABADY-short = {ABADY}}
+@String {AbhBerlin-short = {AbhBerlin}}
+@String {AbhDuesseldorf-short = {AbhDüsseldorf}}%*Abweichung!
+@String {AbhGoettingen-short = {AbhGöttingen}}%*Abweichung!
+@String {AbhLeipzig-short = {AbhLeipzig}}
+@String {AbhMainz-short = {AbhMainz}}
+@String {AbhMuenchen-short = {AbhMünchen}}%*Abweichung!
+@String {ABret-short = {ABret}}
+@String {Abr-Nahrain-short = {Abr-Nahrain}}
+@String {ABulg-short = {ABulg}}
+@String {ABV-short = {ABV}}
+@String {ACalc-short = {ACalc}}
+@String {ACamp-short = {ACamp}}
+@String {ACant-short = {ACant}}
+@String {AcBibl-short = {AcBibl}}
+@String {Achse-short = {Achse}}
+@String {Acme-short = {Acme}}
+@String {Acontia-short = {Acontia}}
+@String {ACors-short = {ACors}}
+@String {ActaAArtHist-short = {ActaAArtHist}}
+@String {ActaAArtHist-sa-short = {ActaAArtHist s.a.}}%*Abweichung!
+@String {ActaAcAbo-short = {ActaAcAbo}}
+@String {ActaACarp-short = {ActaACarp}}
+@String {ActaALov-short = {ActaALov}}
+@String {ActaALovMono-short = {ActaALovMono}}
+@String {ActaAntHung-short = {ActaAntHung}}
+@String {ActaArch-short = {ActaArch}}
+@String {ActaArchHung-short = {ActaArchHung}}
+@String {ActaAth-short = {ActaAth}}
+@String {ActaCl-short = {ActaCl}}
+@String {ActaClDebrec-short = {ActaClDebrec}}
+@String {ActaHistDac-short = {ActaHistDac}}
+@String {ActaHyp-short = {ActaHyp}}
+@String {ActaInstRomFin-short = {ActaInstRomFin}}
+@String {ActaMusNapoca-short = {ActaMusNapoca}}
+@String {ActaMusPorol-short = {ActaMusPorol}}
+@String {ActaNum-short = {ActaNum}}
+@String {ActaOr-short = {ActaOr}}
+@String {ActaOrHung-short = {ActaOrHung}}
+@String {ActaPhilSocDac-short = {ActaPhilSocDac}}
+@String {ActaPraehistA-short = {ActaPraehistA}}
+@String {ActaTorunA-short = {ActaTorunA}}
+@String {ActaTorunHist-short = {ActaTorunHist}}
+@String {AD-short = {AD}}
+@String {ADAIK-short = {ADAIK}}
+@String {Adalya-short = {Adalya}}
+@String {ADelt-A-short = {ADelt A}}%*Abweichung!
+@String {ADelt-B-short = {ADelt B}}%*Abweichung!
+@String {ADerg-short = {ADerg}}
+@String {ADFU-short = {ADFU}}
+@String {AdI-short = {AdI}}
+@String {ADOG-short = {ADOG}}
+@String {Adumatu-short = {Adumatu}}
+@String {AE-short = {AE}}
+@String {AeA-short = {AeA}}
+@String {Aegaeum-short = {Aegaeum}}
+@String {AegLev-short = {ÄgLev}}%*Abweichung!
+@String {AEmil-short = {AEmil}}
+@String {AEphem-short = {AEphem}}
+@String {AeR-short = {AeR}}
+@String {AErgoMak-short = {AErgoMak}}
+@String {AErt-short = {AErt}}
+@String {AEspA-short = {AEspA}}
+@String {Aevum-short = {Aevum}}
+@String {AevumAnt-short = {AevumAnt}}
+@String {AF-short = {AF}}
+@String {AfO-short = {AfO}}
+@String {Africa-short = {Africa}}
+@String {AGD-short = {AGD}}
+@String {AGeo-short = {AGeo}}
+@String {Agora-short = {Agora}}
+@String {AgoraPB-short = {AgoraPB}}
+@String {AHist-short = {AHist}}
+@String {AHistStAlex-short = {AHistStAlex}}
+@String {AHw-short = {AHw}}
+@String {AiD-short = {AiD}}
+@String {AInf-short = {AInf}}
+@String {AIONArch-short = {AIONArch}}
+@String {AIONFil-short = {AIONFil}}
+@String {AIONLing-short = {AIONLing}}
+@String {AIPhOr-short = {AIPhOr}}
+@String {Aitna-short = {Aitna}}
+@String {AJA-short = {AJA}}
+@String {AJahrBay-short = {AJahrBay}}
+@String {AJPh-short = {AJPh}}
+@String {AJug-short = {AJug}}
+@String {AKorrBl-short = {AKorrBl}}
+@String {AlbaRegia-short = {AlbaRegia}}
+@String {AlmaMaterSt-short = {AlmaMaterSt}}
+@String {AlmanachWien-short = {AlmanachWien}}
+@String {AlonJisrael-short = {AlonJisrael}}
+@String {Al-Qannis-short = {Al-Qanniš}}
+@String {Altamura-short = {Altamura}}
+@String {AltoMed-short = {AltoMed}}
+@String {Alt-Paphos-short = {Alt-Paphos}}
+@String {AltThuer-short = {AltThür}}%*Abweichung!
+@String {AM-short = {AM}}
+@String {AMediev-short = {AMediev}}
+@String {AMethTh-short = {AMethTh}}
+@String {AMI-short = {AMI}}
+@String {AMIT-short = {AMIT}}
+@String {AmJAncHist-short = {AmJAncHist}}
+@String {AmJNum-short = {AmJNum}}
+@String {AMold-short = {AMold}}
+@String {AMosel-short = {AMosel}}
+@String {AMS-short = {AMS}}
+@String {AmStP-short = {AmStP}}
+@String {AMuGS-short = {AMuGS}}
+@String {ANachr-short = {ANachr}}
+@String {ANachrBad-short = {ANachrBad}}
+@String {AnadoluAra-short = {AnadoluAra}}
+@String {AnadoluKonf-short = {AnadoluKonf}}
+@String {AnadoluYil-short = {AnadoluYıl}}
+@String {AnAe-short = {AnAe}}
+@String {Anagennesis-short = {Anagennesis}}
+@String {AnalBolland-short = {AnalBolland}}
+@String {AnalP-short = {AnalP}}
+@String {AnalRom-short = {AnalRom}}
+@String {AnArqAnd-short = {AnArqAnd}}
+@String {Anas-short = {Anas}}
+@String {AnatA-short = {AnatA}}
+@String {Anatolia-short = {Anatolia}}
+@String {ANaturwiss-short = {ANaturwiss}}
+@String {AncCivScytSib-short = {AncCivScytSib}}
+@String {AncHistB-short = {AncHistB}}
+@String {AncInd-short = {AncInd}}
+@String {AncNearEastSt-short = {AncNearEastSt}}
+@String {AnCord-short = {AnCord}}
+@String {AncSoc-short = {AncSoc}}
+@String {AncW-short = {AncW}}
+@String {AncWestEast-short = {AncWestEast}}
+@String {AnDubr-short = {AnDubr}}
+@String {ANews-short = {ANews}}
+@String {ANilMoy-short = {ANilMoy}}
+@String {ANL-short = {ANL}}
+@String {AnMunFaro-short = {AnMunFaro}}
+@String {AnMurcia-short = {AnMurcia}}
+@String {AnnAcEtr-short = {AnnAcEtr}}
+@String {AnnAcTorino-short = {AnnAcTorino}}
+@String {AnnAStorAnt-short = {AnnAStorAnt}}
+@String {AnnBari-short = {AnnBari}}
+@String {AnnBenac-short = {AnnBenac}}
+@String {AnnBiblAModena-short = {AnnBiblAModena}}
+@String {AnnBiblARom-short = {AnnBiblARom}}
+@String {AnnByzConf-short = {AnnByzConf}}
+@String {AnnCagl-short = {AnnCagl}}
+@String {AnnCaglMag-short = {AnnCaglMag}}
+@String {AnnEconSocCiv-short = {AnnEconSocCiv}}
+@String {AnnEgBibl-short = {AnnEgBibl}}
+@String {AnnEth-short = {AnnEth}}
+@String {AnnFaina-short = {AnnFaina}}
+@String {AnnHistA-short = {AnnHistA}}
+@String {AnnHistScSoc-short = {AnnHistScSoc}}
+@String {AnnIstGiapp-short = {AnnIstGiapp}}
+@String {AnnIstItNum-short = {AnnIstItNum}}
+@String {AnnLecce-short = {AnnLecce}}
+@String {AnnLeedsUnOrSoc-short = {AnnLeedsUnOrSoc}}
+@String {AnnMacerata-short = {AnnMacerata}}
+@String {AnnMessMag-short = {AnnMessMag}}
+@String {AnnMusRov-short = {AnnMusRov}}
+@String {AnnNap-short = {AnnNap}}
+@String {AnnNivern-short = {AnnNivern}}
+@String {AnnNoment-short = {AnnNoment}}
+@String {AnnOrNap-short = {AnnOrNap}}
+@String {AnnotNum-short = {AnnotNum}}
+@String {AnnPerugia-short = {AnnPerugia}}
+@String {AnnPisa-short = {AnnPisa}}
+@String {AnnPontAcRom-short = {AnnPontAcRom}}
+@String {AnnRepBSA-short = {AnnRepBSA}}
+@String {AnnRepCypr-short = {AnnRepCypr}}
+@String {AnnRepFoggArtMus-short = {TAnnRepFoggArtMus}}
+@String {AnnSiena-short = {AnnSiena}}
+@String {AnnuarioAcLinc-short = {AnnuarioAcLinc}}
+@String {AnnuarioLecce-short = {AnnuarioLecce}}
+@String {AnnUnBud-short = {AnnUnBud}}
+@String {AnnWorcArtMus-short = {AnnWorcArtMus}}
+@String {Anodos-short = {Anodos}}
+@String {AnOr-short = {AnOr}}
+@String {ANRW-short = {ANRW}}
+@String {Anschnitt-short = {Anschnitt}}
+@String {ANSMusNotes-short = {ANSMusNotes}}
+@String {AnSt-short = {AnSt}}
+@String {Antaeus-short = {Antaeus}}
+@String {AntAfr-short = {AntAfr}}
+@String {AntChr-short = {AntChr}}
+@String {AntCl-short = {AntCl}}
+@String {AnthrAChron-short = {AnthrAChron}}
+@String {Anthropos-short = {Anthropos}}
+@String {Antichthon-short = {Antichthon}}
+@String {AntigCr-short = {AntigCr}}
+@String {Antipolis-short = {Antipolis}}
+@String {Antiqua-short = {Antiqua}}
+@String {Antiquity-short = {Antiquity}}
+@String {AntJ-short = {AntJ}}
+@String {AntK-short = {AntK}}
+@String {AntNat-short = {AntNat}}
+@String {AntPisa-short = {AntPisa}}
+@String {AntPl-short = {AntPl}}
+@String {AntSurv-short = {AntSurv}}
+@String {AntTard-short = {AntTard}}
+@String {AnzAW-short = {AnzAW}}
+@String {AnzWien-short = {AnzWien}}
+@String {AOAT-short = {AOAT}}
+@String {AoF-short = {AoF}}
+@String {AOtkryt-short = {AOtkryt}}
+@String {APamKiiv-short = {APamKiiv}}
+@String {APh-short = {APh}}
+@String {APol-short = {APol}}
+@String {Apollo-short = {Apollo}}
+@String {ApolloLond-short = {ApolloLond}}
+@String {APort-short = {APort}}
+@String {AppRomFil-short = {AppRomFil}}
+@String {APregl-short = {APregl}}
+@String {Apulum-short = {Apulum}}
+@String {AquiLeg-short = {AquiLeg}}
+@String {AquilNost-short = {AquilNost}}
+@String {Aquitania-short = {Aquitania}}
+@String {ArabAEpigr-short = {ArabAEpigr}}
+@String {ARadRaspr-short = {ARadRaspr}}
+@String {ArbFBerSaechs-short = {ArbFBerSaechs}}
+@String {Archaeographie-short = {Archäographie}}%*Abweichung!
+@String {Archaeologia-short = {Archaeologia}}
+@String {Archaeology-short = {Archaeology}}
+@String {Archaeometry-short = {Archaeometry}}
+@String {Archaiognosia-short = {Archaiognosia}}
+@String {ArchBegriffsGesch-short = {ArchBegriffsGesch}}
+@String {ArchByzMnem-short = {ArchByzMnem}}
+@String {ArchCl-short = {ArchCl}}
+@String {Archeo-short = {Archeo}}
+@String {ArcheogrTriest-short = {ArcheogrTriest}}
+@String {ArcheologiaParis-short = {ArcheologiaParis}}
+@String {ArcheologiaRoma-short = {ArcheologiaRoma}}
+@String {ArcheologiaWarsz-short = {ArcheologiaWarsz}}
+@String {ArcheologijaKiiv-short = {ArcheologijaKiiv}}
+@String {ArcheologijaSof-short = {ArcheologijaSof}}
+@String {ArchEubMel-short = {ArchEubMel}}
+@String {ArchHom-short = {ArchHom}}
+@String {Architectura-short = {Architectura}}
+@String {Archivi-short = {Archivi}}
+@String {ArchPF-short = {ArchPF}}
+@String {ArchPrehistLev-short = {ArchPrehistLev}}
+@String {ArchRel-short = {ArchRel}}
+@String {ArchStorCal-short = {ArchStorCal}}
+@String {ArchStorPugl-short = {ArchStorPugl}}
+@String {ArchStorRom-short = {ArchStorRom}}
+@String {ArchStorSicOr-short = {ArchStorSicOr}}
+@String {ArchStorSir-short = {ArchStorSir}}
+@String {Arctos-short = {Arctos}}
+@String {ARepLond-short = {ARepLond}}
+@String {Argo-short = {Argo}}
+@String {ArOr-short = {ArOr}}
+@String {ArOrMono-short = {ArOrMono}}
+@String {ArOrSuppl-short = {ArOrSuppl}}
+@String {ARozhl-short = {ARozhl}}
+@String {ArqBeja-short = {ArqBeja}}
+@String {Arse-short = {Arse}}
+@String {ArsGeorg-short = {ArsGeorg}}
+@String {ArtAntMod-short = {ArtAntMod}}
+@String {ArtARhone-short = {ArtARhône}}%*Abweichung!
+@String {ArtAs-short = {ArtAs}}
+@String {ArtB-short = {ArtB}}
+@String {ArtJ-short = {ArtJ}}
+@String {ArtLomb-short = {ArtLomb}}
+@String {ArtMediev-short = {ArtMediev}}
+@String {ArtVirg-short = {ArtVirg}}
+@String {ARV2-short = {ARV2}}
+@String {ASachs-short = {ASachs}}
+@String {ASAE-short = {ASAE}}
+@String {ASammlUnZuerch-short = {ASammlUnZürch}}%*Abweichung!
+@String {ASAtene-short = {ASAtene}}
+@String {ASbor-short = {ASbor}}
+@String {ASchw-short = {ASchw}}
+@String {ASoc-short = {ASoc}}
+@String {ASoloth-short = {ASoloth}}
+@String {ASR-short = {ASR}}
+@String {Assaph-short = {Assaph}}
+@String {AssyrMisc-short = {AssyrMisc}}
+@String {AST-short = {AST}}
+@String {ASub-short = {ASub}}
+@String {ASubacq-short = {ASubacq}}
+@String {Athenaeum-short = {Athenaeum}}
+@String {Atiqot-short = {Atiqot}}
+@String {AtiqotHeb-short = {AtiqotHeb}}
+@String {Atlal-short = {Atlal}}
+@String {AttiAcPontan-short = {AttiAcPontan}}
+@String {AttiAcRov-short = {AttiAcRov}}
+@String {AttiAcTorino-short = {AttiAcTorino}}
+@String {AttiCAntCl-short = {AttiCAntCl}}
+@String {AttiCItRom-short = {AttiCItRom}}
+@String {AttiMemBologna-short = {AttiMemBologna}}
+@String {AttiMemDal-short = {AttiMemDal}}
+@String {AttiMemFirenze-short = {AttiMemFirenze}}
+@String {AttiMemIstria-short = {AttiMemIstria}}
+@String {AttiMemMagnaGr-short = {AttiMemMagnaGr}}
+@String {AttiMemModena-short = {AttiMemModena}}
+@String {AttiMemTivoli-short = {AttiMemTivoli}}
+@String {AttiMusTrieste-short = {AttiMusTrieste}}
+@String {AttiPalermo-short = {AttiPalermo}}
+@String {AttiRovigno-short = {AttiRovigno}}
+@String {AttiSocFriuli-short = {AttiSocFriuli}}
+@String {AttiVenezia-short = {AttiVenezia}}
+@String {AuA-short = {AuA}}
+@String {AulaOr-short = {AulaOr}}
+@String {AusgrFu-short = {AusgrFu}}
+@String {AusgrFuWestf-short = {AusgrFuWestf}}
+@String {AustrRom-short = {AustrRom}}
+@String {AUTerr-short = {AUTerr}}
+@String {AUWE-short = {AUWE}}
+@String {AV-short = {AV}}
+@String {AVen-short = {AVen}}
+@String {AVes-short = {AVes}}
+@String {AViva-short = {AViva}}
+@String {AvP-short = {AvP}}
+@String {AW-short = {AW}}
+@String {AyasofyaMuezYil-short = {AyasofyaMüzYıl}}%*Abweichung!
+@String {AZ-short = {AZ}}
+@String {Azotea-short = {Azotea}}
+@String {BA-short = {BA}}
+@String {Baalbek-short = {Baalbek}}
+@String {BAAlger-short = {BAAlger}}
+@String {BABarcel-short = {BABarcel}}
+@String {BABesch-short = {BABesch}}
+@String {BAcRHist-short = {BAcRHist}}
+@String {BACopt-short = {BACopt}}
+@String {BadFuBer-short = {BadFuBer}}
+@String {Baetica-short = {Baetica}}
+@String {BaF-short = {BaF}}
+@String {BalacaiKoez-short = {BalacaiKöz}}%*Abweichung!
+@String {BalkSt-short = {BalkSt}}
+@String {BALond-short = {BALond}}
+@String {BALux-short = {BALux}}
+@String {BaM-short = {BaM}}
+@String {BAMaroc-short = {BAMaroc}}
+@String {BAmSocP-short = {BAmSocP}}
+@String {BAncOrMus-short = {BAncOrMus}}
+@String {BAngers-short = {BAngers}}
+@String {BAngloIsrASoc-short = {BAngloIsrASoc}}
+@String {BAnnMusFerr-short = {BAnnMusFerr}}
+@String {BAntFr-short = {BAntFr}}
+@String {BAntLux-short = {BAntLux}}
+@String {BAParis-short = {BAParis}}
+@String {BAProv-short = {BAProv}}
+@String {BAR-short = {BAR}}
+@String {BArchAlex-short = {BArchAlex}}
+@String {BArchit-short = {BArchit}}
+@String {BARIntSer-short = {BARIntSer}}
+@String {BASard-short = {BASard}}
+@String {BAsEspA-short = {BAsEspA}}
+@String {BAsInst-short = {BAsInst}}
+@String {BASOR-short = {BASOR}}
+@String {BAssBude-short = {BAssBudé}}%*Abweichung!
+@String {BAssMosAnt-short = {BAssMosAnt}}
+@String {BASub-short = {BASub}}
+@String {BASudEstEur-short = {BASudEstEur}}
+@String {BATarr-short = {BATarr}}
+@String {BAur-short = {BAur}}
+@String {BAVA-short = {BAVA}}
+@String {BayVgBl-short = {BayVgBl}}
+@String {BBasil-short = {BBasil}}
+@String {BBelgRom-short = {BBelgRom}}
+@String {BBolsena-short = {BBolsena}}
+@String {BBrByzSt-short = {BBrByzSt}}
+@String {BCamuno-short = {BCamuno}}
+@String {BCASic-short = {BCASic}}
+@String {BCercleNum-short = {BCercleNum}}
+@String {BCH-short = {BCH}}
+@String {BCircNumNap-short = {BCircNumNap}}
+@String {BCl-short = {BCl}}
+@String {BClevMus-short = {BClevMus}}
+@String {BCom-short = {BCom}}
+@String {BCord-short = {BCord}}
+@String {BdA-short = {BdA}}
+@String {BdE-short = {BdE}}
+@String {BdEC-short = {BdEC}}
+@String {BdI-short = {BdI}}
+@String {BDirRom-short = {BDirRom}}
+@String {BeazleyAddenda2-short = {Beazley Addenda\textsuperscript{2}}}%*Abweichung!
+@String {BeazleyPara-short = {Beazley, Para.}}%*Abweichung!
+@String {BEcAntNimes-short = {BEcAntNîmes}}%*Abweichung!
+@String {BediKart-short = {BediKart}}
+@String {BEFAR-short = {BEFAR}}
+@String {BeitrESkAr-short = {BeitrESkAr}}
+@String {BeitrNamF-short = {BeitrNamF}}
+@String {BeitrSudanF-short = {BeitrSudanF}}
+@String {BelArt-short = {BelArt}}
+@String {Belleten-short = {Belleten}}
+@String {Benacus-short = {Benacus}}
+@String {BerBayDenkmPfl-short = {BerBayDenkmPfl}}
+@String {BerDFG-short = {BerDFG}}
+@String {BerlBeitrArchaeom-short = {BerlBeitrArchäom}}%*Abweichung!
+@String {BerlBlVFruehGesch-short = {BerlBlVFrühGesch}}%*Abweichung!
+@String {BerlJbVFruehGesch-short = {BerlJbVFrühGesch}}%*Abweichung!
+@String {BerlMus-short = {BerlMus}}
+@String {BerlNumZ-short = {BerlNumZ}}
+@String {BerOudhBod-short = {BerOudhBod}}
+@String {BerRGK-short = {BerRGK}}
+@String {BerVerhLeipz-short = {BerVerhLeipz}}
+@String {Berytus-short = {Berytus}}
+@String {BEspA-short = {BEspA}}
+@String {BEspOr-short = {BEspOr}}
+@String {BEtOr-short = {BEtOr}}
+@String {BFilGrPadova-short = {BFilGrPadova}}
+@String {BFilLingSic-short = {BFilLingSic}}
+@String {BFlegr-short = {BFlegr}}
+@String {BFoligno-short = {BFoligno}}
+@String {BHarvMus-short = {BHarvMus}}
+@String {BIasos-short = {BIasos}}
+@String {BibAr-short = {BibAr}}
+@String {BiblClOr-short = {BiblClOr}}
+@String {BiblSymb-short = {BiblSymb}}
+@String {BIBulg-short = {BIBulg}}
+@String {BICS-short = {BICS}}
+@String {BIFAO-short = {BIFAO}}
+@String {BInfCentumcellae-short = {BInfCentumcellae}}
+@String {BInfCESDAE-short = {BInfCESDAE}}
+@String {BiogrZbor-short = {BiogrZbor}}
+@String {BiOr-short = {BiOr}}
+@String {BIstOrvieto-short = {BIstOrvieto}}
+@String {BJaen-short = {BJaen}}%*Abweichung!
+@String {BJb-short = {BJb}}
+@String {BJerus-short = {BJerus}}
+@String {BLaborMusLouvre-short = {BLaborMusLouvre}}
+@String {BLazioMerid-short = {BLazioMerid}}
+@String {BLikUm-short = {BLikUm}}
+@String {BlMueFreundeF-short = {BlMüFreundeF}}%*Abweichung!
+@String {BLugo-short = {BLugo}}
+@String {BMCGreekCoins-short = {BMC Greek Coins}}%*Abweichung!
+@String {BMCOR-short = {BMCOR}}
+@String {BMCRE-short = {BMCRE}}
+@String {BMCRRI-III-short = {BMCRR I--III}}%*Abweichung!
+@String {BMetrMus-short = {BMetrMus}}
+@String {BMon-short = {BMon}}
+@String {BMonMusPont-short = {BMonMusPont}}
+@String {BMQ-short = {BMQ}}
+@String {BMQNSuppl-short = {BMQNSuppl}}
+@String {BMusBeyrouth-short = {BMusBeyrouth}}
+@String {BMusBrux-short = {BMusBruxs}}
+@String {BMusCadiz-short = {BMusCadiz}}
+@String {BMusCivRom-short = {BMusCivRom}}
+@String {BMusFA-short = {BMusFA}}
+@String {BMusHongr-short = {BMusHongr}}
+@String {BMusMadr-short = {BMusMadr}}
+@String {BMusMich-short = {BMusMich}}
+@String {BMusMonaco-short = {BMusMonaco}}
+@String {BMusPadova-short = {BMusPadova}}
+@String {BMusPBelArt-short = {BMusPBelArt}}
+@String {BMusRom-short = {BMusRom}}
+@String {BMusVars-short = {BMusVars}}
+@String {BMusZaragoza-short = {BMusZaragoza}}
+@String {BNumParis-short = {BNumParis}}
+@String {BNumRoma-short = {BNumRoma}}
+@String {Bogazkoey-Hattusa-short = {Boğazköy-Hattuša}}%*Abweichung!
+@String {Bolskan-short = {Bolskan}}
+@String {BonnHVg-short = {BonnHVg}}
+@String {BOntMus-short = {BOntMus}}
+@String {Boreas-short = {Boreas}}
+@String {BoreasUpps-short = {BoreasUpps}}
+@String {BPeintRom-short = {BPeintRom}}
+@String {BPI-short = {BPI}}
+@String {BPrehistAlp-short = {BPI}}%*Abweichung!
+@String {BProAvent-short = {BProAvent}}
+@String {BProvidence-short = {BProvidence}}
+@String {BracAug-short = {BracAug}}
+@String {BracaraAugusta-short = {BracaraAugusta}}
+@String {BremABl-short = {BremABl}}
+@String {BRest-short = {BRest}}
+@String {Brigantium-short = {Brigantium}}
+@String {BrMusYearbook-short = {BrMusYearbook}}
+@String {BSA-short = {BSA}}
+@String {BSAA-short = {BSAA}}
+@String {BSFE-short = {BSFE}}
+@String {BSiena-short = {BSiena}}
+@String {BSOAS-short = {BSOAS}}
+@String {BSocAChamp-short = {BSocAChamp}}
+@String {BSocBiblReinach-short = {BSocBiblReinach}}
+@String {BSocNumRom-short = {BSocNumRom}}
+@String {BSR-short = {BSR}}
+@String {BStLat-short = {BStLat}}
+@String {BStorArt-short = {BStorArt}}
+@String {BTextilAnc-short = {BStorArt}}
+@String {BTorino-short = {BTorino}}
+@String {BTravTun-short = {BTravTun}}
+@String {BudReg-short = {BudReg}}
+@String {BulletinGetty-short = {BulletinGetty}}
+@String {BulletinNorthampton-short = {BulletinNorthampton}}
+@String {BVallad-short = {BVallad}}
+@String {BVitoria-short = {BVitoria}}
+@String {BWaltersArtGal-short = {BWaltersArtGal}}
+@String {BWPr-short = {BWPr}}
+@String {Byzantina-short = {Byzantina}}
+@String {ByzF-short = {ByzF}}
+@String {ByzJb-short = {ByzJb}}
+@String {ByzZ-short = {ByzZ}}
+@String {BZ-short = {BZ}}
+@String {CAA-short = {CAA}}
+@String {CAD-short = {CAD}}
+@String {CadA-short = {CadA}}
+@String {Caesaraugusta-short = {Caesaraugusta}}
+@String {Caesarodunum-short = {Caesarodunum}}
+@String {CAH-short = {CAH}}
+@String {CahArmeeRom-short = {CahArmeeRom}}
+@String {CahASubaqu-short = {CahASubaqu}}
+@String {CahByrsa-short = {CahByrsa}}
+@String {CahCEC-short = {CahCEC}}
+@String {CahCerEg-short = {CahCerEg}}
+@String {CahDelFrIran-short = {CahDelFrIran}}
+@String {CahGlotz-short = {CahGlotz}}
+@String {CahKarnak-short = {CahKarnak}}
+@String {CahLig-short = {CahLig}}
+@String {CahMariemont-short = {CahMariemont}}
+@String {CahMusChampollion-short = {CahMusChampollion}}
+@String {CahPEg-short = {CahPEg}}
+@String {CahRhod-short = {CahRhod}}
+@String {CahTun-short = {CahTun}}
+@String {CalifStClAnt-short = {CalifStClAnt}}
+@String {CambrAJ-short = {CambrAJ}}
+@String {CArch-short = {CArch}}
+@String {CarinthiaI-short = {Carinthia I}}%*Abweichung!
+@String {CarnuntumJb-short = {CarnuntumJb}}
+@String {Carpica-short = {Carpica}}
+@String {Carrobbio-short = {Carrobbio}}
+@String {CAT-short = {CAT}}
+@String {CE-short = {CE}}
+@String {CEDAC-short = {CEDAC}}
+@String {CEFR-short = {CEFR}}
+@String {Celticum-short = {Celticum}}
+@String {CercA-short = {CercA}}
+@String {CercNum-short = {CercNum}}
+@String {Chiron-short = {Chiron}}
+@String {ChronEg-short = {ChronEg}}
+@String {CIA-short = {CIA}}
+@String {CIE-short = {CIE}}
+@String {CIG-short = {CIG}}
+@String {CIH-short = {CIH}}
+@String {CIL-short = {CIL}}
+@String {CincArtB-short = {CincArtB}}
+@String {CIS-short = {CIS}}
+@String {CIstAMilano-short = {CIstAMilano}}
+@String {CivClCr-short = {CivClCr}}
+@String {CivPad-short = {CivPad}}
+@String {ClAnt-short = {ClAnt}}
+@String {ClevStHistArt-short = {ClevStHistArt}}
+@String {Clio-short = {Clio}}
+@String {ClIre-short = {ClIre}}
+@String {ClJ-short = {ClJ}}
+@String {ClMediaev-short = {ClMediaev}}
+@String {ClPhil-short = {ClPhil}}
+@String {ClQ-short = {ClQ}}
+@String {ClR-short = {ClR}}
+@String {ClRh-short = {ClRh}}
+@String {CMatAOr-short = {CMatAOr}}
+@String {CMGr-short = {CMGr}}
+@String {CMS-short = {CMS}}
+@String {CoinHoards-short = {Coin Hoards}}%*Abweichung!
+@String {ColloquiSod-short = {ColloquiSod}}
+@String {CommunicAHung-short = {CommunicAHung}}
+@String {Complutum-short = {Complutum}}
+@String {Conoscenze-short = {Conoscenze}}
+@String {Corduba-short = {Corduba}}
+@String {Corinth-short = {Corinth}}
+@String {CRAI-short = {CRAI}}
+@String {CretAnt-short = {CretAnt}}
+@String {CretSt-short = {CretSt}}
+@String {CronA-short = {CronA}}
+@String {CronErcol-short = {CronErcol}}
+@String {CronPomp-short = {CronPomp}}
+@String {CRPetersbourg-short = {CRPetersbourg}}%*Abweichung!
+@String {CSE-short = {CSE}}
+@String {CSIR-short = {CSIR}}
+@String {CSSpecPisa-short = {CSSpecPisa}}
+@String {CuadAMed-short = {CuadAMed}}
+@String {CuadArquitRom-short = {CuadArquitRom}}
+@String {CuadCastellon-short = {CuadCastellon}}
+@String {CuadCat-short = {CuadCat}}
+@String {CuadFilCl-short = {CuadFilCl}}
+@String {CuadGallegos-short = {CuadGallegos}}
+@String {CuadGranada-short = {CuadGranada}}
+@String {CuadNavarra-short = {CuadNavarra}}
+@String {CuadPrehistA-short = {CuadPrehistA}}
+@String {CuadRom-short = {CuadRom}}
+@String {CuPaUAM-short = {CuPaUAM}}
+@String {CVA-short = {CVA}}
+@String {CZero-short = {CZero}}
+@String {DAA-short = {DAA}}
+@String {Dacia-short = {Dacia}}
+@String {DACL-short = {DACL}}
+@String {Dacoromania-short = {Dacoromania}}
+@String {DaF-short = {DaF}}
+@String {Daidalos-short = {Daidalos}}
+@String {DAIGeschDok-short = {DAIGeschDok}}
+@String {DaM-short = {DaM}}
+@String {Daremberg-Saglio-short = {Daremberg -- Saglio}}%*Abweichung!
+@String {DebrecMuzEvk-short = {DebrecMuzEvk}}
+@String {Dedalo-short = {Dédalo}}%*Abweichung!
+@String {Delos-short = {Delos}}%*Abweichung!
+@String {DeltChrA-short = {DeltChrA}}
+@String {Demircihueyuek-short = {Demircihüyük}}%*Abweichung!
+@String {DeMuseus-short = {DeMuseus}}
+@String {DenkmPflBadWuert-short = {DenkmPflBadWürt}}%*Abweichung!
+@String {DenkschrWien-short = {DenkschrWien}}
+@String {Diadora-short = {Diadora}}
+@String {DialA-short = {DialA}}
+@String {DialHistAnc-short = {DialHistAnc}}
+@String {Dike-short = {Dike}}
+@String {Dioniso-short = {Dioniso}}
+@String {DiskAB-short = {DiskAB}}
+@String {DKuDenkmPfl-short = {DKuDenkmPfl}}
+@String {DLZ-short = {DLZ}}
+@String {DNP-short = {DNP}}
+@String {DocAlb-short = {DocAlb}}
+@String {DocALouv-short = {DocALouv}}
+@String {DocAMerid-short = {DocAMerid}}
+@String {DocEmRom-short = {DocEmRom}}
+@String {Dodone-short = {Dodone}}
+@String {DOP-short = {DOP}}
+@String {DossAlet-short = {DossAlet}}
+@String {DossAParis-short = {DossAParis}}
+@String {Dura-Europos-short = {Dura-Europos}}
+@String {EAA-short = {EAA}}
+@String {EAE-short = {EAE}}
+@String {EastWest-short = {EastWest}}
+@String {EcAntNimes-short = {EcAntNimes}}
+@String {EchosCl-short = {EchosCl}}
+@String {eDAI-F-short = {eDAI-F}}
+@String {eDAI-J-short = {eDAI-J}}
+@String {EgA-short = {EgA}}
+@String {Egnatia-short = {Egnatia}}
+@String {EgVicOr-short = {EgVicOr}}
+@String {Eikasmos-short = {Eikasmos}}
+@String {Eirene-short = {Eirene}}
+@String {Elenchos-short = {Elenchos}}
+@String {Ellenika-short = {Ellenika}}
+@String {Emerita-short = {Emerita}}
+@String {EmPrerom-short = {EmPrerom}}
+@String {Empuries-short = {Empúries}}%*Abweichung!
+@String {Enalia-short = {Enalia}}
+@String {EnaliaAnn-short = {EnaliaAnn}}
+@String {Enchoria-short = {Enchoria}}
+@String {Eos-short = {Eos}}
+@String {EpetBoiotMel-short = {EpetBoiotMel}}
+@String {EpetByzSpud-short = {EpetByzSpud}}
+@String {EpetKyklMel-short = {EpetKyklMel}}
+@String {EphemDac-short = {EphemDac}}
+@String {EphemNapoc-short = {EphemNapoc}}
+@String {EpigrAnat-short = {EpigrAnat}}
+@String {EpistEpetAth-short = {EpistEpetAth}}
+@String {EpistEpetPolytThess-short = {EpistEpetPolytThess}}
+@String {EpistEpetThess-short = {EpistEpetThess}}
+@String {EPRO-short = {EPRO}}
+@String {Eranos-short = {Eranos}}
+@String {EranosJb-short = {EranosJb}}
+@String {Eretria-short = {Eretria}}
+@String {Eretz-Israel-short = {Eretz-Israel}}
+@String {Ergon-short = {Ergon}}
+@String {ESA-short = {ESA}}
+@String {EspacioHist-short = {EspacioHist}}
+@String {EstMadr-short = {EstMadr}}
+@String {EstZaragoza-short = {EstZaragoza}}
+@String {EtACl-short = {EtACl}}
+@String {EtCl-short = {EtCl}}
+@String {EtClAix-short = {EtClAix}}
+@String {EtCret-short = {EtCret}}
+@String {Ethnos-short = {Ethnos}}
+@String {EtP-short = {EtP}}
+@String {EtPezenas-short = {EtPézenas}}%*Abweichung!
+@String {EtrSt-short = {EtrSt}}
+@String {Etruscans-short = {Etruscans}}
+@String {EtTrav-short = {EtTrav}}
+@String {Eulimene-short = {Eulimene}}
+@String {Eunomia-short = {Eunomia}}
+@String {Euphrosyne-short = {Euphrosyne}}
+@String {EurAnt-short = {EurAnt}}
+@String {EurRHist-short = {EurRHist}}
+@String {Eutopia-short = {Eutopia}}
+@String {EVP-short = {EVP}}
+@String {ExcIsr-short = {ExcIsr}}
+@String {Expedition-short = {Expedition}}
+@String {ExtremA-short = {ExtremA}}
+@String {FA-short = {FA}}
+@String {FAAK-short = {FAAK}}
+@String {Faenza-short = {Faenza}}
+@String {FAVA-short = {FAVA}}
+@String {Faventia-short = {Faventia}}
+@String {FBerBadWuert-short = {FBerBadWürt}}%*Abweichung!
+@String {FdC-short = {FdC}}
+@String {FdD-short = {FdD}}
+@String {FdX-short = {FdX}}
+@String {FeddersenWierde-short = {Feddersen Wierde}}%*Abweichung!
+@String {FelRav-short = {FelRav}}
+@String {FGrHist-short = {FGrHistr}}
+@String {FHG-short = {FHG}}
+@String {FiA-short = {FiA}}
+@String {FichEpigr-short = {FichEpigr}}
+@String {FiE-short = {FiE}}
+@String {FIFAO-short = {FIFAO}}
+@String {Figlina-short = {Figlina}}
+@String {Florentia-short = {Florentia}}
+@String {FlorIl-short = {FlorIl}}
+@String {FMRD-short = {FMRD}}
+@String {FMROe-short = {FMRÖ}}%*Abweichung!
+@String {FoggArtMusAcqu-short = {FoggArtMusAcqu}}
+@String {FolA-short = {FolA}}
+@String {FolOr-short = {FolOr}}
+@String {Fonaments-short = {Fonaments}}
+@String {Fondamenti-short = {Fondamenti}}
+@String {FontAPos-short = {FontAPos}}
+@String {Fontes-short = {Fontes}}
+@String {Forlimpopoli-short = {Forlimpopoli}}
+@String {Fornvaennen-short = {Fornvännen}}%*Abweichung!
+@String {Forum-short = {Forum}}
+@String {FR-short = {FR}}
+@String {FruehMitAltSt-short = {FrühMitAltSt}}%*Abweichung!
+@String {FuAusgrTrier-short = {FuAusgrTrier}}
+@String {FuB-short = {FuB}}
+@String {FuBerBadWuert-short = {FuBerBadWürt}}%*Abweichung!
+@String {FuBerHessen-short = {FuBerHessen}}
+@String {FuBerOe-short = {FuBerÖ}}%*Abweichung!
+@String {FuBerSchwab-short = {FuBerSchwab}}
+@String {FuF-short = {FuF}}
+@String {FuWien-short = {FuWien}}
+@String {GacNum-short = {GacNum}}
+@String {Gades-short = {Gades}}
+@String {Gallaecia-short = {Gallaecia}}
+@String {Gallia-short = {Gallia}}
+@String {GalliaInf-short = {GalliaInf}}
+@String {GalliaInfAReg-short = {GalliaInfAReg}}
+@String {GalliaPrehist-short = {GalliaPrehist}}
+@String {GaR-short = {GaR}}
+@String {GazBA-short = {GazBA}}
+@String {Genava-short = {Genava}}
+@String {GeoAnt-short = {GeoAnt}}
+@String {Germania-short = {Germania}}
+@String {Gesta-short = {Gesta}}
+@String {GettyMusJ-short = {GettyMusJ}}
+@String {GFA-short = {GFA}}
+@String {GGA-short = {GGA}}
+@String {GiornFilFerr-short = {GiornFilFerr}}
+@String {GiornItFil-short = {GiornItFil}}
+@String {GiornStorLun-short = {GiornStorLun}}
+@String {GiRoccPalermo-short = {GiRoccPalermo}}
+@String {Gladius-short = {Gladius}}
+@String {GlasAJ-short = {GlasAJ}}
+@String {GlasBeograd-short = {GlasBeograd}}
+@String {GlasSarajevo-short = {GlasSarajevo}}
+@String {Glotta-short = {Glotta}}
+@String {Gnomon-short = {Gnomon}}
+@String {GodDepA-short = {GodDepA}}
+@String {GodMuzPlov-short = {GodMuzPlov}}
+@String {GodMuzSof-short = {GodMuzSof}}
+@String {GodZborSkopje-short = {GodZborSkopje}}
+@String {GorLet-short = {GorLet}}
+@String {GoettMisz-short = {GöttMisz}}%*Abweichung!
+@String {GraRaspr-short = {GraRaspr}}
+@String {GrazBeitr-short = {GrazBeitr}}
+@String {GrLatOr-short = {GrLatOr}}
+@String {GrLatPrag-short = {GrLatPrag}}
+@String {GrRomByzSt-short = {GrRomByzSt}}
+@String {Gymnasium-short = {Gymnasium}}
+@String {Habis-short = {Habis}}
+@String {HallWPr-short = {HallWPr}}
+@String {Hama-short = {Hama}}
+@String {HambBeitrA-short = {HambBeitrA}}
+@String {HambBeitrNum-short = {HambBeitrNum}}
+@String {Handlingar-short = {Handlingar}}
+@String {HarvStClPhil-short = {HarvStClPhil}}
+@String {HarvTheolR-short = {HarvTheolR}}
+@String {HASB-short = {HASB}}
+@String {HAW-short = {HAW}}
+@String {HdArch-short = {HdArch}}
+@String {Head-short = {Head}}
+@String {Helbig-short = {Helbig}}
+@String {Helike-short = {Helike}}
+@String {Helikon-short = {Helikon}}
+@String {Helinium-short = {Helinium}}
+@String {Helios-short = {Helios}}
+@String {HellenikaJb-short = {HellenikaJb}}
+@String {HelvA-short = {HelvA}}
+@String {Hephaistos-short = {Hephaistos}}
+@String {Hermes-short = {Hermes}}
+@String {Herrscherbild-short = {Herrscherbild}}
+@String {Hesperia-short = {Hesperia}}
+@String {Hispania-short = {Hispania}}
+@String {HispAnt-short = {HispAnt}}
+@String {HispAntEpigr-short = {HispAntEpigra}}
+@String {HispEpigr-short = {HispEpigr}}
+@String {HistAnthr-short = {HistAnthr}}
+@String {HistArt-short = {HistArt}}
+@String {Historia-short = {Historia}}
+@String {Historica-short = {Historica}}
+@String {Histria-short = {Histria}}
+@String {HistriaA-short = {HistriaA}}
+@String {HistriaAnt-short = {HistriaAnt}}
+@String {HistSprF-short = {HistSprF}}
+@String {HKL-short = {HKL}}
+@String {Horos-short = {Horos}}
+@String {HSS-short = {HSS}}
+@String {HuelvaA-short = {HuelvaA}}
+@String {HumBild-short = {HumBild}}
+@String {Hyp-short = {Hyp}}
+@String {HZ-short = {HZ}}
+@String {IA-short = {IA}}
+@String {Iberia-short = {Iberia}}
+@String {IEJ-short = {IEJ}}
+@String {IG-short = {IG}}
+@String {IGCH-short = {IGCH}}
+@String {IGR-short = {IGR}}
+@String {IK-short = {IK}}
+@String {Ilerda-short = {Ilerda}}
+@String {Iliria-short = {Iliria}}
+@String {IllinClSt-short = {IllinClSt}}
+@String {ILN-short = {ILN}}
+@String {ILS-short = {ILS}}
+@String {IndexQuad-short = {IndexQuad}}
+@String {IndogermF-short = {IndogermF}}
+@String {IndUnArtB-short = {IndUnArtB}}
+@String {InsFulc-short = {InsFulc}}
+@String {InstNautAQ-short = {InstNautAQ}}
+@String {IntJClTrad-short = {IntJClTrad}}
+@String {IntJNautA-short = {IntJNautA}}
+@String {IntZSchauBibelWiss-short = {IntZSchauBibelWiss}}
+@String {InvLuc-short = {InvLuc}}
+@String {Ipek-short = {Ipek}}
+@String {Iran-short = {Iran}}
+@String {IrAnt-short = {IrAnt}}
+@String {IsrMusJ-short = {IsrMusJ}}
+@String {IsrMusN-short = {IsrMusN}}
+@String {IsrMusStA-short = {IsrMusStA}}
+@String {IsrNumJ-short = {IsrNumJ}}
+@String {IstanbAMuezYil-short = {IstanbAMüzYıl}}%*Abweichung!
+@String {IstForsch-short = {IstForsch}}
+@String {Isthmia-short = {Isthmia}}
+@String {IstMitt-short = {IstMitt}}
+@String {Italica-short = {Italica}}
+@String {ItNostr-short = {ItNostr}}
+@String {IzvBurgas-short = {IzvBurgas}}
+@String {IzvMuzJuzBalg-short = {IzvMuzJužBalg}}%*Abweichung!
+@String {IzvVarna-short = {IzvVarna}}
+@String {Jabega-short = {Jábega}}%*Abweichung!
+@String {JadrZbor-short = {JadrZbor}}
+@String {JAOS-short = {JAOS}}
+@String {JARCE-short = {JARCE}}
+@String {JASc-short = {JASc}}
+@String {JbAC-short = {JbAC}}
+@String {JbAkMainz-short = {JbAkMainz}}
+@String {JbBadWuert-short = {JbBadWürt}}%*Abweichung!
+@String {JbBerlMus-short = {JbBerlMus}}
+@String {JbBernHistMus-short = {JbBernHistMus}}
+@String {JberAugst-short = {JberAugst}}
+@String {JberBasel-short = {JberBasel}}
+@String {JberBayDenkmPfl-short = {JberBayDenkmPfl}}
+@String {JberProVindon-short = {JberProVindon}}
+@String {JberVgFrankf-short = {JberVgFrankf}}
+@String {JberZuerich-short = {JberZürich}}%*Abweichung!
+@String {JbGoett-short = {JbGött}}%*Abweichung!
+@String {JbHambKuSamml-short = {JbHambKuSamml}}
+@String {JbKHMWien-short = {JbKHMWien}}
+@String {JbKHSWien-short = {JbKHSWien}}
+@String {JbKleinasF-short = {JbKleinasF}}
+@String {JbMuench-short = {JbMünch}}%*Abweichung!
+@String {JbMusKGHamb-short = {JbMusKGHamb}}
+@String {JbMusLinz-short = {JbMusLinz}}
+@String {JbOeByz-short = {JbÖByz}}%*Abweichung!
+@String {JbPreussKul-short = {JbPreussKul}}
+@String {JbRGZM-short = {JbRGZM}}
+@String {JbSchwUrgesch-short = {JbSchwUrgesch}}
+@String {JCS-short = {JCS}}
+@String {JdI-short = {JdI}}
+@String {JEA-short = {JEA}}
+@String {JEChrSt-short = {JEChrSt}}
+@String {JEOL-short = {JEOL}}
+@String {JewelSt-short = {JewelSt}}
+@String {JFieldA-short = {JFieldA}}
+@String {JGS-short = {JGS}}
+@String {JHS-short = {JHS}}
+@String {JIbA-short = {JIbA}}
+@String {JJurP-short = {JJurP}}
+@String {JKuGesch-short = {JKuGesch}}
+@String {JMedA-short = {JMedA}}
+@String {JMedAnthrA-short = {JMedAnthrA}}
+@String {JMithrSt-short = {JMithrSt}}
+@String {JNES-short = {JNES}}
+@String {JNG-short = {JNG}}
+@String {JPrehistRel-short = {JPrehistRel}}
+@String {JRA-short = {JRA}}
+@String {JRomMilSt-short = {JRomMilSt}}
+@String {JRomPotSt-short = {JRomPotSt}}
+@String {JRS-short = {JRS}}
+@String {JSav-short = {JSav}}
+@String {JSchrVgHalle-short = {JSchrVgHalle}}
+@String {JSS-short = {JSS}}
+@String {JTheorA-short = {JTheorA}}
+@String {Jura-short = {Jura}}
+@String {JWaltersArtGal-short = {JWaltersArtGal}}
+@String {JWCI-short = {JWCI}}
+@String {Kadmos-short = {Kadmos}}
+@String {Kairos-short = {Kairos}}
+@String {Kalapodi-short = {Kalapodi}}
+@String {Kalathos-short = {Kalathos}}
+@String {Kalos-short = {Kalós}}%*Abweichung!
+@String {Karthago-short = {Karthago}}
+@String {Kemi-short = {Kêmi}}%*Abweichung!
+@String {Kenchreai-short = {Kenchreai}}
+@String {KentAR-short = {KentAR}}
+@String {Keos-short = {Keos}}
+@String {Kerameikos-short = {Kerameikos}}
+@String {Kernos-short = {Kernos}}
+@String {Klearchos-short = {Klearchos}}
+@String {Kleos-short = {Kleos}}
+@String {Klio-short = {Klio}}
+@String {Kodai-short = {Kodai}}
+@String {KoelnJb-short = {KölnJb}}%*Abweichung!
+@String {KoelnMusB-short = {KölnMusB}}%*Abweichung!
+@String {Kokalos-short = {Kokalos}}
+@String {KollAVA-short = {KollAVA}}
+@String {Kratylos-short = {Kratylos}}
+@String {KretChron-short = {KretChron}}
+@String {KSIA-short = {KSIA}}
+@String {KSIAKiev-short = {KSIAKiev}}
+@String {KST-short = {KST}}
+@String {Ktema-short = {Ktema}}
+@String {KuGeschAnz-short = {KuGeschAnz}}
+@String {Kuml-short = {Kuml}}
+@String {Kunstchronik-short = {Kunstchronik}}
+@String {KuOr-short = {KuOr}}
+@String {Kush-short = {Kush}}
+@String {KuWeltBerlMus-short = {KuWeltBerlMus}}
+@String {KypA-short = {KypA}}
+@String {KypSpud-short = {KypSpud}}
+@String {Labeo-short = {Labeo}}
+@String {LAe-short = {LÄ}}%*Abweichung!
+@String {Laietania-short = {Laietania}}
+@String {Lampas-short = {Lampas}}
+@String {Lancia-short = {Lancia}}
+@String {LandKunVierJBl-short = {LandKunVierJBl}}
+@String {LangOrAnc-short = {LangOrAnc}}
+@String {Latinitas-short = {Latinitas}}
+@String {Latomus-short = {Latomus}}
+@String {Laverna-short = {Laverna}}
+@String {LCS-short = {LCS}}
+@String {Levant-short = {Levant}}
+@String {Lexis-short = {Lexis}}
+@String {LF-short = {LF}}
+@String {LibSt-short = {LibSt}}
+@String {LibyaAnt-short = {LibyaAnt}}
+@String {LibycaBServAnt-short = {LibycaBServAnt}}
+@String {LibycaTrav-short = {LibycaTrav}}
+@String {Liddell-­Scott-Jones-short = {Liddell -- ­Scott -- Jones}}%*Abweichung!
+@String {LIMC-short = {LIMC}}
+@String {Limesforschungen-short = {Limesforschungen}}
+@String {Lindos-short = {Lindos}}
+@String {LingIt-short = {LingIt}}
+@String {LTUR-short = {LTUR}}
+@String {Lucentum-short = {Lucentum}}
+@String {LundAR-short = {LundAR}}
+@String {Lustrum-short = {Lustrum}}
+@String {Lykia-short = {Lykia}}
+@String {MacActaA-short = {MacActaA}}
+@String {Maecenas-short = {Maecenas}}
+@String {MAGesGraz-short = {MAGesGraz}}
+@String {MAGesStei-short = {MAGesStei}}
+@String {Maia-short = {Maia}}
+@String {Mainake-short = {Mainake}}
+@String {MAInstUngAk-short = {MAInstUngAk}}
+@String {MainzZ-short = {MainzZ}}
+@String {MakedNasl-short = {MakedNasl}}
+@String {Makedonika-short = {Makedonika}}
+@String {MAMA-short = {MAMA}}
+@String {MAnthrWien-short = {MAnthrWien}}
+@String {MARo-short = {MAR}}
+@String {MarbWPr-short = {MarbWPr}}
+@String {Marche-short = {Marche}}
+@String {Mari-short = {Mari}}
+@String {Marisia-short = {Marisia}}
+@String {MarNero-short = {MarNero}}
+@String {Marsyas-short = {Marsyas}}
+@String {MascaJ-short = {MascaJ}}
+@String {MascaP-short = {MascaP}}
+@String {Mastia-short = {Mastia}}
+@String {MatABSSR-short = {MatABSSR}}
+@String {MatASevPri-short = {MatASevPri}}
+@String {MatCercA-short = {MatCercA}}
+@String {MatIsslA-short = {MatIsslA}}
+@String {MatStar-short = {MatStar}}
+@String {MatStarWczes-short = {MatStarWczes}}
+@String {MatTestiCl-short = {MatTestiCl}}
+@String {MatWczes-short = {MatWczes}}
+@String {MAVA-short = {MAVA}}
+@String {MB-short = {MB}}
+@String {MBAH-short = {MBAH}}
+@String {MBlVFruehGesch-short = {MBlVFrühGesch}}%*Abweichung!
+@String {MDAIK-short = {MDAIK}}
+@String {MDAVerb-short = {MDAVerb}}
+@String {MdI-short = {MdI}}
+@String {MDOG-short = {MDOG}}
+@String {Meander-short = {Meander}}
+@String {MedA-short = {MedA}}
+@String {MedAnt-short = {MedAnt}}
+@String {MeddelGlypt-short = {MeddelGlypt}}
+@String {MeddelLund-short = {MeddelLund}}
+@String {MeddelThor-short = {MeddelThor}}
+@String {MededRom-short = {MededRom}}
+@String {MedelhavsMusB-short = {MedelhavsMusB}}
+@String {MedHistR-short = {MedHistR}}
+@String {MedievA-short = {MedievA}}
+@String {MediSec-short = {MediSec}}
+@String {MEFRA-short = {MEFRA}}
+@String {MelBeyrouth-short = {MelBeyrouth}}
+@String {MelCasaVelazquez-short = {MelCasaVelazquez}}
+@String {MemAcInscr-short = {MemAcInscr}}
+@String {MemAmAc-short = {MemAmAc}}
+@String {MemAnt-short = {MemAnt}}
+@String {MemAntFr-short = {MemAntFr}}
+@String {MemBarcelA-short = {MemBarcelA}}
+@String {MemBologna-short = {MemBologna}}
+@String {MemHistAnt-short = {MemHistAnt}}
+@String {MemInstNatFr-short = {MemInstNatFr}}
+@String {MemLinc-short = {MemLinc}}
+@String {MemNap-short = {MemNap}}
+@String {MemPontAc-short = {MemPontAc}}
+@String {MemStor-short = {MemStor}}
+@String {MemStorFriuli-short = {MemStorFriuli}}
+@String {Merida-short = {Mérida}}%*Abweichung!
+@String {MeridaMem-short = {MéridaMem}}%*Abweichung!
+@String {Meroitica-short = {Meroitica}}
+@String {Mesopotamia-short = {Mesopotamia}}
+@String {Messana-short = {Messana}}
+@String {Metis-short = {Métis}}%*Abweichung!
+@String {MetrMusJ-short = {MetrMusJ}}
+@String {MetrMusSt-short = {MetrMusSt}}
+@String {MF-short = {MF}}
+@String {MFruehChrOe-short = {MFrühChrÖ}}%*Abweichung!
+@String {Milet-short = {Milet}}
+@String {MilForsch-short = {MilForsch}}
+@String {MinEpigrP-short = {MinEpigrP}}
+@String {Minerva-short = {Minerva}}
+@String {Minos-short = {Minos}}
+@String {MInstWasser-short = {MInstWasser}}
+@String {MIO-short = {MIO}}
+@String {MiscCrAnt-short = {MiscCrAnt}}
+@String {MiscStStor-short = {MiscStStor}}
+@String {MitChrA-short = {MitChrA}}
+@String {MKT-short = {MKT}}
+@String {MKuHistFlorenz-short = {MKuHistFlorenz}}
+@String {MKul-short = {MKul}}
+@String {MM-short = {MM}}
+@String {Mnemosyne-short = {Mnemosyne}}
+@String {MOeNumGes-short = {MÖNumGes}}%*Abweichung!
+@String {MonAnt-short = {MonAnt}}
+@String {MonInst-short = {MonInst}}
+@String {MonPiot-short = {MonPiot}}
+@String {MonPitt-short = {MonPitt}}
+@String {Mozia-short = {Mozia}}
+@String {MPraehistKomWien-short = {MPraehistKomWien}}%*Abweichung!
+@String {MSAtene-short = {MSAtene}}
+@String {MSchliemann-short = {MSchliemann}}
+@String {MSchwUrFruehGesch-short = {MSchwUrFrühGesch}}%*Abweichung!
+@String {MSpaetAByz-short = {MSpätAByz}}%*Abweichung!
+@String {MueJb-short = {MüJb}}%*Abweichung!
+@String {MuenchBeitrVFG-short = {MünchBeitrVFG}}%*Abweichung!
+@String {MuenchStSprWiss-short = {MünchStSprWiss}}%*Abweichung!
+@String {MuM-short = {MuM}}
+@String {MusAfr-short = {MusAfr}}
+@String {MusBenaki-short = {MusBenaki}}
+@String {MusCrit-short = {MusCrit}}
+@String {Muse-short = {Muse}}
+@String {Museon-short = {Muséon}}%*Abweichung!
+@String {MuseumUnesco-short = {MuseumUnesco}}
+@String {MusFerr-short = {MusFerr}}
+@String {MusGalIt-short = {MusGalIt}}
+@String {MusHaaretz-short = {MusHaaretz}}
+@String {MusHelv-short = {MusHelv}}
+@String {MusKoeln-short = {MusKöln}}%*Abweichung!
+@String {MusNotAmNumSoc-short = {MusNotAmNumSoc}}
+@String {MusPontevedra-short = {MusPontevedra}}
+@String {MusRiv-short = {MusRiv}}
+@String {MusTusc-short = {MusTusc}}
+@String {MuzEvkSzeged-short = {MuzEvkSzeged}}
+@String {MuzNa-short = {MuzNa}}
+@String {MuzPamKul-short = {MuzPamKul}}
+@String {NachrArbUWA-short = {NachrArbUWA}}
+@String {NapNobil-short = {NapNobil}}
+@String {NassAnn-short = {NassAnn}}
+@String {NAWG-short = {NAWG}}
+@String {NBWorcArtMus-short = {NBWorcArtMus}}
+@String {NEphemSemEpigr-short = {NEphemSemEpigr}}
+@String {NewsletterAthen-short = {NewsletterAthen}}
+@String {NewsletterPotTech-short = {NewsletterPotTech}}
+@String {NGWG-short = {NGWG}}
+@String {NigCl-short = {NigCl}}
+@String {Nikephoros-short = {Nikephoros}}
+@String {Nin-short = {Nin}}
+@String {NNM-short = {NNM}}
+@String {NomChron-short = {NomChron}}
+@String {Norba-short = {Norba}}
+@String {NordNumArs-short = {NordNumArs}}
+@String {NotABerg-short = {NotABerg}}
+@String {NotAHisp-short = {NotAHisp}}
+@String {NotAHispPrehistoria-short = {NotAHispPrehistoria}}
+@String {NotAllumiere-short = {NotAllumiere}}
+@String {NotALomb-short = {NotALomb}}
+@String {NotMilano-short = {NotMilano}}
+@String {NouvClio-short = {NouvClio}}
+@String {Novaensia-short = {Novaensia}}
+@String {NSc-short = {NSc}}
+@String {NStFan-short = {NStFan}}
+@String {NubChr-short = {NubChr}}
+@String {NubLet-short = {NubLet}}
+@String {NueBlA-short = {NüBlA}}%*Abweichung!
+@String {NumAntCl-short = {NumAntCl}}
+@String {Numantia-short = {Numantia}}
+@String {NumChron-short = {NumChron}}
+@String {Numen-short = {Numen}}
+@String {NumEpigr-short = {NumEpigr}}
+@String {Numisma-short = {Numisma}}
+@String {NumismaticaRom-short = {NumismaticaRom}}
+@String {Numizmaticar-short = {Numizmatičar}}%*Abweichung!
+@String {Nummus-short = {Nummus}}
+@String {NumZ-short = {NumZ}}
+@String {NuovDidask-short = {NuovDidask}}
+@String {OccasPublClSt-short = {OccasPublClSt}}
+@String {OccOr-short = {OccOr}}
+@String {OGIS-short = {OGIS}}
+@String {OeJh-short = {ÖJh}}%*Abweichung!
+@String {OF-short = {OF}}
+@String {Offa-short = {Offa}}
+@String {Ogam-short = {Ogam}}
+@String {Oikumene-short = {Oikumene}}
+@String {OIP-short = {OIP}}
+@String {Olba-short = {Olba}}
+@String {OlBer-short = {OlBer}}
+@String {Olympia-short = {Olympia}}
+@String {Olynthus-short = {Olynthus}}
+@String {OLZ-short = {OLZ}}
+@String {OpArch-short = {OpArch}}
+@String {OpAth-short = {OpAth}}
+@String {OpFin-short = {OpFin}}
+@String {OpPomp-short = {OpPomp}}
+@String {OpRom-short = {OpRom}}
+@String {Opus-short = {Opus}}
+@String {Or-short = {Or}}
+@String {OrA-short = {OrA}}
+@String {OrAnt-short = {OrAnt}}
+@String {OrbTerr-short = {OrbTerr}}
+@String {OrChr-short = {OrChr}}
+@String {OrChrPer-short = {OrChrPer}}
+@String {Ordona-short = {Ordona}}
+@String {Orient-short = {Orient}}
+@String {Origini-short = {Origini}}
+@String {Orizzonti-short = {Orizzonti}}
+@String {Orpheus-short = {Orpheus}}
+@String {OrpheusThracSt-short = {OrpheusThracSt}}
+@String {OrSu-short = {OrSu}}
+@String {OsjZbor-short = {OsjZbor}}
+@String {OstbGrenzm-short = {OstbGrenzm}}
+@String {Ostraka-short = {Ostraka}}
+@String {OudhMeded-short = {OudhMeded}}
+@String {OxfJA-short = {OxfJA}}
+@String {OxfStPhilos-short = {OxfStPhilos}}
+@String {Pact-short = {Pact}}
+@String {Padusa-short = {Padusa}}
+@String {PagA-short = {PagA}}
+@String {PAI-short = {PAI}}
+@String {Paideuma-short = {Paideuma}}
+@String {Palaeohistoria-short = {Palaeohistoria}}
+@String {Paleohispanica-short = {Paleohispánica}}%*Abweichung!
+@String {Palladio-short = {Palladio}}
+@String {Pallas-short = {Pallas}}
+@String {Palmet-short = {Palmet}}
+@String {PamA-short = {PamA}}
+@String {Pan-short = {Pan}}
+@String {PapBilb-short = {PapBilb}}
+@String {Papyri-short = {Papyri}}
+@String {Parthica-short = {Parthica}}
+@String {Partenope-short = {Partenope}}
+@String {PAS-short = {PAS}}
+@String {PBF-short = {PBF}}
+@String {Pegasus-short = {Pegasus}}
+@String {PEQ-short = {PEQ}}
+@String {Peristil-short = {Peristil}}
+@String {Persica-short = {Persica}}
+@String {Peuce-short = {Peuce}}
+@String {PF-short = {PF}}
+@String {Pharos-short = {Pharos}}
+@String {Philologus-short = {Philologus}}
+@String {Phoenix-short = {Phoenix}}
+@String {PhoenixExOrLux-short = {PhoenixExOrLux}}
+@String {Phoibos-short = {Phoibos}}
+@String {Phronesis-short = {Phronesis}}
+@String {Picus-short = {Picus}}
+@String {LPIR-short = {LPIR}}
+@String {PKG-short = {PKG}}
+@String {Platon-short = {Platon}}
+@String {PLup-short = {PLup}}
+@String {PolAMed-short = {PolAMed}}
+@String {Polemon-short = {Polemon}}
+@String {Polis-short = {Polis}}
+@String {PompHercStab-short = {PompHercStab}}
+@String {Pontica-short = {Pontica}}
+@String {Portugalia-short = {Portugalia}}
+@String {PP-short = {PP}}
+@String {PPM-short = {PPM}}
+@String {PraceA-short = {PraceA}}
+@String {PraceMatLodz-short = {PraceMatŁodz}}%*Abweichung!
+@String {Prakt-short = {Prakt}}
+@String {PraktAkAth-short = {PraktAkAth}}
+@String {PreistAlp-short = {PreistAlp}}
+@String {PriloziZagreb-short = {PriloziZagreb}}
+@String {PrincViana-short = {PrincViana}}
+@String {ProblIsk-short = {ProblIsk}}
+@String {ProcAfrClAss-short = {ProcAfrClAss}}
+@String {ProcCambrPhilSoc-short = {ProcCambrPhilSoc}}
+@String {ProcDanInstAth-short = {ProcDanInstAth}}
+@String {ProcPrehistSoc-short = {ProcPrehistSoc}}
+@String {Prometheus-short = {Prometheus}}
+@String {ProspAQuad-short = {ProspAQuad}}
+@String {Prospettiva-short = {Prospettiva}}
+@String {Prospezioni-short = {Prospezioni}}
+@String {ProvHist-short = {ProvHist}}
+@String {ProvLucca-short = {ProvLucca}}
+@String {PublInstTTMeneses-short = {PublInstTTMeneses}}
+@String {Pulpudeva-short = {Pulpudeva}}
+@String {Puteoli-short = {Puteoli}}
+@String {Pyrenae-short = {Pyrenae}}
+@String {PZ-short = {PZ}}
+@String {QDAP-short = {QDAP}}
+@String {QuadABarcel-short = {QuadABarcel}}
+@String {QuadACagl-short = {QuadACagl}}
+@String {QuadACal-short = {QuadACal}}
+@String {QuadALibya-short = {QuadALibya}}
+@String {QuadAMant-short = {QuadAMant}}
+@String {QuadAMess-short = {QuadAMess}}
+@String {QuadAOst-short = {QuadAOst}}
+@String {QuadAPiem-short = {QuadAPiem}}
+@String {QuadAquil-short = {QuadAquil}}
+@String {QuadAReggio-short = {QuadAReggio}}
+@String {QuadAVen-short = {QuadAVen}}
+@String {QuadCast-short = {QuadCast}}
+@String {QuadCat-short = {QuadCat}}
+@String {QuadChieti-short = {QuadChieti}}
+@String {QuadErb-short = {QuadErb}}
+@String {QuadFriulA-short = {QuadFriulA}}
+@String {QuadGerico-short = {QuadGerico}}
+@String {QuadIstFilGr-short = {QuadIstFilGr}}
+@String {QuadIstLat-short = {QuadIstLat}}
+@String {QuadLecce-short = {QuadLecce}}
+@String {QuadMusPontecorvo-short = {QuadMusPontecorvo}}
+@String {QuadMusSalinas-short = {QuadMusSalinas}}
+@String {QuadProtost-short = {QuadProtost}}
+@String {QuadStLun-short = {QuadStLun}}
+@String {QuadStor-short = {QuadStor}}
+@String {QuadStorici-short = {QuadStorici}}
+@String {QuadUrbin-short = {QuadUrbin}}
+@String {Quaternaria-short = {Quaternaria}}
+@String {RA-short = {RA}}
+@String {RAArtLouv-short = {RAArtLouv}}
+@String {RAC-short = {RAC}}
+@String {RACFr-short = {RACFr}}
+@String {RAComo-short = {RAComo}}
+@String {RACr-short = {RACr}}
+@String {RadAkZadar-short = {RadAkZadar}}
+@String {Radiocarbon-short = {Radiocarbon}}
+@String {RadSplit-short = {RadSplit}}
+@String {RAE-short = {RAE}}
+@String {Raggi-short = {Raggi}}
+@String {RAMadrid-short = {RAMadrid}}
+@String {RANarb-short = {RANarb}}
+@String {RAPon-short = {RAPon}}
+@String {RapWyk-short = {RapWyk}}
+@String {RArchBiblMus-short = {RArchBiblMus}}
+@String {RArcheom-short = {RArcheom}}
+@String {RArtMus-short = {RArtMus}}
+@String {RassAPiomb-short = {RassAPiomb}}
+@String {RassLazio-short = {RassLazio}}
+@String {RassStorSalern-short = {RassStorSalern}}
+@String {RassVolt-short = {RassVolt}}
+@String {RAssyr-short = {RAssyr}}
+@String {Ratiariensia-short = {Ratiariensia}}
+@String {RAtlMed-short = {RAtlMed}}
+@String {RavStRic-short = {RavStRic}}
+@String {Raydan-short = {Raydan}}
+@String {RB-short = {RB}}
+@String {RBelgNum-short = {RBelgNum}}
+@String {RBelgPhilHist-short = {RBelgPhilHist}}
+@String {LRBK-short = {LRBK}}
+@String {RCulClMedioev-short = {RCulClMedioev}}
+@String {RdA-short = {RdA}}
+@String {RDAC-short = {RDAC}}
+@String {RdE-short = {RdE}}
+@String {RDroitsAnt-short = {RDroitsAnt}}
+@String {RE-short = {RE}}
+@String {REA-short = {REA}}
+@String {REByz-short = {REByz}}
+@String {RecConstantine-short = {RecConstantine}}
+@String {RechACrac-short = {RechACrac}}
+@String {RechAlb-short = {RechAlb}}
+@String {RecMusAlcoi-short = {RecMusAlcoi}}
+@String {RecTrav-short = {RecTrav}}
+@String {REG-short = {REG}}
+@String {ReiCretActa-short = {ReiCretActa}}
+@String {ReiCretCommunic-short = {ReiCretCommunic}}
+@String {REL-short = {REL}}
+@String {Rema-short = {Rema}}
+@String {RendBologna-short = {RendBologna}}
+@String {RendIstLomb-short = {RendIstLomb}}
+@String {RendLinc-short = {RendLinc}}
+@String {RendNap-short = {RendNap}}
+@String {RendPontAc-short = {RendPontAc}}
+@String {RepMalta-short = {RepMalta}}
+@String {Reppal-short = {Reppal}}
+@String {RepSocLibSt-short = {RepSocLibSt}}
+@String {RES-short = {RES}}
+@String {REstIber-short = {REstIber}}
+@String {REtArm-short = {REtArm}}
+@String {RevEg-short = {RevEg}}
+@String {RFil-short = {RFil}}
+@String {RGeorgCauc-short = {RGeorgCauc}}
+@String {RGF-short = {RGF}}
+@String {RGuimar-short = {RGuimar}}
+@String {RHA-short = {RHA}}
+@String {RheinMusBonn-short = {RheinMusBonn}}
+@String {RHistArmees-short = {RHistArmees}}%*Abweichung!
+@String {RHistRel-short = {RHistRel}}
+@String {RhM-short = {RhM}}
+@String {RIA-short = {RIA}}
+@String {RIC-short = {RIC}}
+@String {RicEgAntCopt-short = {RicEgAntCopt}}
+@String {RicognA-short = {RicognA}}
+@String {RicStBrindisi-short = {RicStBrindisi}}
+@String {RIngIntem-short = {RIngIntem}}
+@String {RItNum-short = {RItNum}}
+@String {RlA-short = {RlA}}
+@String {RLouvre-short = {RLouvre}}
+@String {RM-short = {RM}}
+@String {RNum-short = {RNum}}
+@String {RoczMuzWarsz-short = {RoczMuzWarsz}}
+@String {RoemOe-short = {RömÖ}}%*Abweichung!
+@String {RoemQSchr-short = {RömQSchr}}%*Abweichung!
+@String {Romanobarbarica-short = {Romanobarbarica}}
+@String {RomGens-short = {RomGens}}
+@String {RoscherML-short = {Roscher, ML}}%*Abweichung!
+@String {RossA-short = {RossA}}
+@String {RPC-short = {RPC}}
+@String {RPhil-short = {RPhil}}
+@String {RPortA-short = {RPortA}}
+@String {RPorto-short = {RPorto}}
+@String {RRC-short = {RRC}}
+@String {RSaintonge-short = {RSaintonge}}
+@String {RScPreist-short = {RScPreist}}
+@String {RSO-short = {RSO}}
+@String {RStBiz-short = {RStBiz}}
+@String {RStCl-short = {RStCl}}
+@String {RStFen-short = {RStFen}}
+@String {RStLig-short = {RStLig}}
+@String {RStMarch-short = {RStMarch}}
+@String {RStorAnt-short = {RStorAnt}}
+@String {RStorCal-short = {RStorCal}}
+@String {RStPomp-short = {RStPomp}}
+@String {RStPun-short = {RStPun}}
+@String {RTopAnt-short = {RTopAnt}}
+@String {Rudiae-short = {Rudiae}}
+@String {SaalbJb-short = {SaalbJb}}
+@String {SaarBeitr-short = {SaarBeitr}}
+@String {SaarStMat-short = {SaarStMat}}
+@String {Sacer-short = {Sacer}}
+@String {Saeculum-short = {Saeculum}}
+@String {SAGA-short = {SAGA}}
+@String {SaggiFen-short = {SaggiFen}}
+@String {Saguntum-short = {Saguntum}}
+@String {Saitabi-short = {Saitabi}}
+@String {SAK-short = {SAK}}
+@String {Salduie-short = {Salduie}}
+@String {Samothrace-short = {Samothrace}}
+@String {Sandalion-short = {Sandalion}}
+@String {Sardis-short = {Sardis}}
+@String {Sargetia-short = {Sargetia}}
+@String {SarkSt-short = {SarkSt}}
+@String {Sautuola-short = {Sautuola}}
+@String {Savaria-short = {Savaria}}
+@String {SBBerlin-short = {SBBerlin}}
+@String {SBLeipzig-short = {SBLeipzig}}
+@String {SBMuenchen-short = {SBMünchen}}%*Abweichung!
+@String {SborBrno-short = {SborBrno}}
+@String {SBWien-short = {SBWien}}
+@String {ScAnt-short = {ScAnt}}
+@String {SCE-short = {SCE}}
+@String {SchildStei-short = {SchildStei}}
+@String {Scholia-short = {Scholia}}
+@String {SchwMueBl-short = {SchwMüBl}}%*Abweichung!
+@String {SchwNumRu-short = {SchwNumRu}}
+@String {ScrCiv-short = {ScrCiv}}
+@String {ScrClIsr-short = {ScrClIsr}}
+@String {ScrHieros-short = {ScrHieros}}
+@String {ScrMed-short = {ScrMed}}
+@String {SDAIK-short = {SDAIK}}
+@String {SEG-short = {SEG}}
+@String {SeminRom-short = {SeminRom}}
+@String {Semitica-short = {Semitica}}
+@String {SetubalA-short = {SetubalA}}
+@String {Sibrium-short = {Sibrium}}
+@String {SicA-short = {SicA}}
+@String {SicGymn-short = {SicGymn}}
+@String {SIG-short = {SIG}}
+@String {Sileno-short = {Sileno}}
+@String {SilkRoadArtA-short = {SilkRoadArtA}}
+@String {SIMA-short = {SIMA}}
+@String {Simblos-short = {Simblos}}
+@String {Skyllis-short = {Skyllis}}
+@String {SlovA-short = {SlovA}}
+@String {SlovNum-short = {SlovNum}}
+@String {SMEA-short = {SMEA}}
+@String {SNG-short = {SNG}}
+@String {SocGeoAOran-short = {SocGeoAOran}}
+@String {SoobErmit-short = {SoobErmit}}
+@String {SoobMuzMoskva-short = {SoobMuzMoskva}}
+@String {SovA-short = {SovA}}
+@String {Spal-short = {Spal}}
+@String {SpNov-short = {SpNov}}
+@String {Spoletium-short = {Spoletium}}
+@String {StA-short = {StA}}
+@String {Stadion-short = {Stadion}}
+@String {StaedelJb-short = {StädelJb}}%*Abweichung!
+@String {StAeg-short = {StAeg}}
+@String {StAlb-short = {StAlb}}
+@String {StAnt-short = {StAnt}}
+@String {Starinar-short = {Starinar}}
+@String {StAWarsz-short = {StAWarsz}}
+@String {StBiFranc-short = {StBiFranc}}
+@String {StBitont-short = {StBitont}}
+@String {StBoT-short = {StBoT}}
+@String {StCercIstorV-short = {StCercIstorV}}
+@String {StCercNum-short = {StCercNum}}
+@String {StCl-short = {StCl}}
+@String {StClOr-short = {StClOr}}
+@String {StDocA-short = {StDocA}}
+@String {StDocHistIur-short = {StDocHistIur}}
+@String {StEbla-short = {StEbla}}
+@String {StEgAntPun-short = {StEgAntPun}}
+@String {SteMat-short = {SteMat}}
+@String {StEpigrLing-short = {StEpigrLing}}
+@String {StEtr-short = {StEtr}}
+@String {StGenu-short = {StGenu}}
+@String {StHist-short = {StHist}}
+@String {StiftHambKuSamml-short = {StiftHambKuSamml}}
+@String {StItFilCl-short = {StItFilCl}}
+@String {StLatIt-short = {StLatIt}}
+@String {StMagreb-short = {StMagreb}}
+@String {StMatStorRel-short = {StMatStorRel}}
+@String {StOliv-short = {StOliv}}
+@String {StOr-short = {StOr}}
+@String {StOrCr-short = {StOrCr}}
+@String {StP-short = {StP}}
+@String {StrennaRom-short = {StrennaRom}}
+@String {StRom-short = {StRom}}
+@String {StRomagn-short = {StRomagn}}
+@String {StSalent-short = {StSalent}}
+@String {StSard-short = {StSard}}
+@String {StStorRel-short = {StStorRel}}
+@String {StTardoant-short = {StTardoant}}
+@String {StTrentStor-short = {StTrentStor}}
+@String {StTroica-short = {StTroica}}
+@String {StUrbin-short = {StUrbin}}
+@String {Sumer-short = {Sumer}}
+@String {SylvaMala-short = {Sylva Mala}}%*Abweichung!
+@String {SymbOslo-short = {SymbOslo}}
+@String {Syria-short = {Syria}}
+@String {SyrMesopSt-short = {SyrMesopSt}}
+@String {TAD-short = {TAD}}
+@String {Talanta-short = {Talanta}}
+@String {TAM-short = {TAM}}
+@String {Taras-short = {Taras}}
+@String {Tarsus-short = {ETarsus}}
+@String {TAVO-short = {TAVO}}
+@String {TeherF-short = {TeherF}}
+@String {Teiresias-short = {Teiresias}}
+@String {TelAvivJA-short = {TelAvivJA}}
+@String {TerraAntBalc-short = {TerraAntBalc}}
+@String {TerraVolsci-short = {TerraVolsci}}
+@String {Teruel-short = {Teruel}}
+@String {TextilAnc-short = {TextilAnc}}
+@String {TheolRu-short = {TheolRu}}
+@String {ThesCRA-short = {ThesCRA}}
+@String {Thessalika-short = {Thessalika}}
+@String {Thessalonike-short = {Thessalonike}}
+@String {Thieme-Becker-short = {Thieme -- Becker}}%*Abweichung!
+@String {ThrakChron-short = {ThrakChron}}
+@String {ThrakEp-short = {ThrakEp}}
+@String {TIB-short = {TIB}}
+@String {Tibiscus-short = {Tibiscus}}
+@String {TiLeon-short = {TiLeon}}
+@String {Tiryns-short = {Tiryns}}
+@String {TMA-short = {TMA}}
+@String {Topoi-short = {Topoi}}
+@String {Torretta-short = {Torretta}}
+@String {TourOrleOr-short = {TourOrleOr}}
+@String {TrabAntrEtn-short = {TrabAntrEtn}}
+@String {TrabArq-short = {TrabArq}}
+@String {TrabAssArqPort-short = {TrabAssArqPort}}
+@String {TrabNavarra-short = {TrabNavarra}}
+@String {TrabPrehist-short = {TrabPrehist}}
+@String {Traditio-short = {Traditio}}
+@String {TransactAmPhilAss-short = {TransactAmPhilAss}}
+@String {TransactAmPhilosSoc-short = {TransactAmPhilosSoc}}
+@String {TransactLond-short = {TransactLond}}
+@String {TravMem-short = {TravMem}}
+@String {TravToulouse-short = {TravToulouse}}
+@String {TreMonet-short = {TreMonet}}
+@String {TribArq-short = {TribArq}}
+@String {TrudyErmit-short = {Trudy}}
+@String {TrWPr-short = {TrWPr}}
+@String {TrZ-short = {TrZ}}
+@String {TTKY-short = {TTKY}}
+@String {TueBA-Ar-short = {TüBA-Ar}}%*Abweichung!
+@String {Tyche-short = {Tyche}}
+@String {UF-short = {UF}}
+@String {UPA-short = {UPA}}
+@String {LUrbe-short = {L’Urbe}}%*Abweichung!
+@String {UrSchw-short = {UrSchw}}
+@String {UVB-short = {UVB}}
+@String {VarSpom-short = {VarSpom}}
+@String {VDI-short = {VDI}}
+@String {Vekove-short = {Vekove}}
+@String {Veleia-short = {Veleia}}
+@String {VenArt-short = {VenArt}}
+@String {VerAmstMeded-short = {VerAmstMeded}}
+@String {Verbanus-short = {Verbanus}}
+@String {VeteraChr-short = {VeteraChr}}
+@String {VGesVind-short = {VGesVind}}
+@String {Vichiana-short = {Vichiana}}
+@String {VicOr-short = {VicOr}}
+@String {VigChr-short = {VigChr}}
+@String {Viminacium-short = {Viminacium}}
+@String {VisRel-short = {VisRel}}
+@String {Vitudurum-short = {Vitudurum}}
+@String {VivScyl-short = {VivScyl}}
+@String {VizVrem-short = {VizVrem}}
+@String {VjesAMuzZagreb-short = {VjesAMuzZagreb}}
+@String {VjesDal-short = {VjesDal}}
+@String {Wad-al-Hayara-short = {Wad-al-Hayara}}
+@String {WeltGesch-short = {WeltGesch}}
+@String {WiadA-short = {WiadA}}
+@String {WissMBosn-short = {WissMBosn}}
+@String {WissZBerl-short = {WissZBerl}}
+@String {WissZHalle-short = {WissZHalle}}
+@String {WissZJena-short = {WissZJena}}
+@String {WissZRostock-short = {WissZRostock}}
+@String {WO-short = {WO}}
+@String {WorldA-short = {WorldA}}
+@String {WSt-short = {WSt}}
+@String {WuerzbJb-short = {WürzbJb}}%*Abweichung!
+@String {WVDOG-short = {WVDOG}}
+@String {WZKM-short = {WZKM}}
+@String {Xenia-short = {Xenia}}
+@String {XeniaAnt-short = {XeniaAnt}}
+@String {XeniaKonst-short = {XeniaKonst}}
+@String {YaleClSt-short = {YaleClSt}}
+@String {YaleUnivB-short = {YaleUnivB}}
+@String {ZA-short = {ZA}}
+@String {ZAAK-short = {ZAAK}}
+@String {ZAeS-short = {ZÄS}}%*Abweichung!
+@String {ZAKSSchriften-short = {ZAKSSchriften}}
+@String {ZAntChr-short = {ZAntChr}}
+@String {ZAW-short = {ZAW}}
+@String {ZborMuzBeograd-short = {ZborMuzBeograd}}
+@String {ZborRadBeograd-short = {ZborRadBeograd}}
+@String {ZborZadar-short = {ZborZadar}}
+@String {ZDMG-short = {ZDMG}}
+@String {ZDPV-short = {ZDPV}}
+@String {Zephyrus-short = {Zephyrus}}
+@String {ZEthn-short = {ZEthn}}
+@String {ZfA-short = {ZfA}}
+@String {ZfNum-short = {ZfNum}}
+@String {ZivaAnt-short = {ZivaAnt}}
+@String {ZKuGesch-short = {ZKuGesch}}
+@String {ZNW-short = {ZNW}}
+@String {ZPE-short = {ZPE}}
+@String {ZSav-short = {ZSav}}
+@String {ZSchwA-short = {ZSchwA}}
+@String {ZVerglSprF-short = {ZVerglSprF}}
% \end{macrocode}
% \subsection{Long names}
+% This is a list with abbreviations of journals, volumes, references and most cited works.
+% Since not all given short-names of the abbreviations can be used directly
+% it was necessary to modify them slightly.
+% Umlauts are changed: |ä|>|ae|, |ö|>|oe|, |ü|>|ue| etc.
+%
+% They are marked with "*Abweichung!".
+%
+%\begin{marker}There are strings with e.g.\@ greek letters. To have them printed properly use e.g.\@ |lualatex| or add a specific package (e.g.\@ |\usepackage{textalpha}| from greek-fontenc). For more information see \url{https://github.com/LukasCBossert/biblatex-archaeologie/issues/153} \end{marker}
+%
% \begin{macrocode}
- @String {AA = {Archäologischer Anzeiger}}
- @String {AAA = {Αρχαιολογικά Ανάλεκτα εξ Αθηνών}}
- @String {AAcque = {Archeologia delle acque. Rivista semestrale di antropologia, archeologia, etnografia, storia dell'acqua}}
- @String {AAdv = {The Archaeological Advertiser}}
- @String {AAJ = {Annual of the Department of Antiquities of Jordan}}
- @String {AAlpi = {Archeologia delle Alpi}}
- @String {AarbKob = {Aarbøger for nordisk oldkyndighed og historie}}%*Abweichung!
- @String {AArchit = {Archeologia dell'architettura}}
- @String {AAS = {Les annales archéologiques arabes syriennes}}
- @String {AASOR = {The Annual of the American Schools of Oriental Research}}
- @String {AAusgrBadWuert = {Archäologische Ausgrabungen in Baden-Württemberg}}%*Abweichung!
- @String {AAustr = {Archaeologia Austriaca}}
- @String {ABADY = {Archäologische Berichte aus dem Yemen}}
- @String {AbhBerlin = {Abhandlungen der Deutschen Akademie der Wissenschaften zu Berlin}}
- @String {AbhDuesseldorf = {Abhandlungen der Rheinisch-Westfälischen Akademie der Wissenschaften}}%*Abweichung!
- @String {AbhGoettingen = {Abhandlungen der Akademie der Wissenschaften zu Göttingen. Philologisch-Historische Klasse}}%*Abweichung!
- @String {AbhLeipzig = {Abhandlungen der Sächsischen Akademie der Wissenschaften zu Leipzig. Philologisch-Historische Klasse}}
- @String {AbhMainz = {Akademie der Wissenschaften und der Literatur in Mainz. Abhandlungen der Geistes- und Sozialwissenschaftlichen Klasse}}
- @String {AbhMuenchen = {Bayerische Akademie der Wissenschaften. Philosophisch-Historische Klasse. Abhandlungen}}%*Abweichung!
- @String {ABret = {Archéologie en Bretagne. Bulletin d'information}}
- @String {Abr-Nahrain = {Abr-Nahrain. An Annual Published by the Department of Middle Eastern Studies, University of Melbourne}}
- @String {ABulg = {Archaeologia Bulgarica}}
- @String {ABV = {J. D. Beazley, Attic Black-figure Vase-painters (Oxford 1956)}}
- @String {ACalc = {Archeologia e calcolatori}}
- @String {ACamp = {Archeologia in Campania. Bolletino di informazioni a cura della Soprintendenza archeologica delle province di Napoli e Caserta}}
- @String {ACant = {Archaeologia Cantiana}}
- @String {AcBibl = {Accademie e biblioteche d'Italia}}
- @String {Achse = {Achse, Rad und Wagen. Beiträge zur Geschichte der Landfahrzeuge}}
- @String {Acme = {Acme. Annali della Facoltà di lettere e filosofia dell'Università degli studi di Milano}}
- @String {Acontia = {Acontia. Revista de arqueología}}
- @String {ACors = {Archeologia corsa}}
- @String {ActaAArtHist = {Acta ad archaeologiam et artium historiam pertinentia}}
- @String {ActaAArtHist-sa = {Acta ad archaeologiam et artium historiam pertinentia. Series altera in 8}}%*Abweichung!
- @String {ActaAcAbo = {Acta Academiae Aboensis}}
- @String {ActaACarp = {Acta archaeologica Carpathica}}
- @String {ActaALov = {Acta archaeologica Lovaniensia}}
- @String {ActaALovMono = {Acta archaeologica Lovaniensia. Monographiae}}
- @String {ActaAntHung = {Acta antiqua Academiae scientiarum Hungaricae}}
- @String {ActaArch = {Acta archaeologica. København}}
- @String {ActaArchHung = {Acta archaeologica Academiae scientiarum Hungaricae}}
- @String {ActaAth = {Acta Instituti Atheniensis regni Sueciae}}
- @String {ActaCl = {Acta classica. Proceedings of the Classical Association of South Africa}}
- @String {ActaClDebrec = {Acta classica Universitatis scientiarum Debreceniensis}}
- @String {ActaHistDac = {Acta historica. Societas academica Dacoromana}}
- @String {ActaHyp = {Acta hyperborea. Danish Studies in Classical Archaeology}}
- @String {ActaInstRomFin = {Acta Instituti Romani Finlandiae}}
- @String {ActaMusNapoca = {Acta Musei Napocensis}}
- @String {ActaMusPorol = {Acta Musei Porolissensis}}
- @String {ActaNum = {Acta numismática (Barcelona)}}
- @String {ActaOr = {Acta orientalia (Kopenhagen)}}
- @String {ActaOrHung = {Acta orientalia Academiae scientiarum Hungaricae}}
- @String {ActaPhilSocDac = {Acta philologica. Societas academica Dacoromana}}
- @String {ActaPraehistA = {Acta praehistorica et archaeologica}}
- @String {ActaTorunA = {Acta Universitatis Nicolai Copernici. Archaeologia}}
- @String {ActaTorunHist = {Acta Universitatis Nicolai Copernici. Historia}}
- @String {AD = {Antike Denkmäler}}
- @String {ADAIK = {Abhandlungen des Deutschen Archäologischen Instituts, Abteilung Kairo}}
- @String {Adalya = {Adalya. Annual of the Suna \& Inan Kiraç-Research Institute on Mediterranean Civilizations}}
- @String {ADelt-A = {Αρχαιολογικόν Δελτίον (Μελέτες)}}%*Abweichung!
- @String {ADelt-B = {Αρχαιολογικόν Δελτίον (Χρονικά)}}%*Abweichung!
- @String {ADerg = {Arkeoloji dergisi. Ege Üniversitesi Edebiyat Fakültesi}}
- @String {ADFU = {Ausgrabungen der Deutschen Forschungsgemeinschaft in Uruk-Warka}}
- @String {AdI = {Annali dell'Instituto di corrispondenza archeologica}}
- @String {ADOG = {Abhandlungen der Deutschen Orient-Gesellschaft}}
- @String {Adumatu = {Adumatu. A Semi-Annual Archeological Refereed Journal on the Arab World}}
- @String {AE = {L'année épigraphique}}
- @String {AeA = {Aegean Archaeology}}
- @String {Aegaeum = {Aegaeum. Annales d'archéologie égéenne de l'Université de Liège}}
- @String {AegLev = {Ägypten und Levante. Egypt and the Levant. Internationale Zeitschrift für ägyptische Archäologie und deren Nachbargebiete}}%*Abweichung!
- @String {AEmil = {Archeologia dell'Emilia-Romagna}}
- @String {AEphem = {Αρχαιολογική Eφημερίς}}
- @String {AeR = {Atene e Roma}}
- @String {AErgoMak = {Το Αρχαιολογικό Έργο στη Μακεδονία και Θράκη}}
- @String {AErt = {Archaeologiai értesitő}}
- @String {AEspA = {Archivo español de arqueología}}
- @String {Aevum = {Aevum. Rassegna di scienze storiche linguistiche e filologiche}}
- @String {AevumAnt = {Aevum antiquum}}
- @String {AF = {Archäologische Forschungen}}
- @String {AfO = {Archiv für Orientforschung}}
- @String {Africa = {Africa. Institut national d'archéologie et d'art, Tunis}}
- @String {AGD = {Antike Gemmen in deutschen Sammlungen}}
- @String {AGeo = {Archaeologia geographica}}
- @String {Agora = {The Athenian Agora}}
- @String {AgoraPB = {Excavations of the Athenian Agora. Picture Book}}
- @String {AHist = {Arqueologia e história}}
- @String {AHistStAlex = {Archaeological and Historical Studies. The Archaeological Society of Alexandria}}
- @String {AHw = {W. von Soden, Akkadisches Handwörterbuch (Wiesbaden 1965--1981)}}
- @String {AiD = {Archäologie in Deutschland}}
- @String {AInf = {Archäologische Informationen. Mitteilungen zur Ur- und Frühgeschichte}}
- @String {AIONArch = {Annali dell'Istituto universitario orientale di Napoli. Dipartimento di studi del mondo classico e del Mediterraneo antico. Sezione di archeologia e storia antica}}
- @String {AIONFil = {Annali dell'Istituto universitario orientale di Napoli. Dipartimento di studi del mondo classico e del Mediterraneo antico. Sezione filologicoletteraria}}
- @String {AIONLing = {Annali dell'Istituto universitario orientale di Napoli. Dipartimento di studi del mondo classico e del Mediterraneo antico. Sezione linguistica}}
- @String {AIPhOr = {Annuaire de l'Institut de philologie et d'histoire orientales et slaves (Université Libre de Bruxelles)}}
- @String {Aitna = {Aitna. Quaderni di topografia antica}}
- @String {AJA = {American Journal of Archaeology}}
- @String {AJahrBay = {Das archäologische Jahr in Bayern}}
- @String {AJPh = {American Journal of Philology}}
- @String {AJug = {Archaeologia Jugoslavica}}
- @String {AKorrBl = {Archäologisches Korrespondenzblatt}}
- @String {AlbaRegia = {Alba Regia. Annales Musei Stephani regis}}
- @String {AlmaMaterSt = {Alma mater studiorum Almanacco calabrese Almoraima}}
- @String {AlmanachWien = {Österreichische Akademie der Wissenschaften. Almanach}}
- @String {AlonJisrael = {'Alon mahleqat ha-'atiqot šel medinat Jisra'el}}
- @String {Al-Qannis = {Al-Qanniš. Boletín del Taller de arqueología de Alcañiz}}
- @String {Altamura = {Altamura. Bollettino dell'Archivio-biblioteca-museo civico}}
- @String {AltoMed = {Alto medioevo}}
- @String {Alt-Paphos = {Ausgrabungen in Alt-Paphos auf Cypern}}
- @String {AltThuer = {Alt-Thüringen}}%*Abweichung!
- @String {AM = {Mitteilungen des Deutschen Archäologischen Instituts, Athenische Abteilung}}
- @String {AMediev = {Archaeologia medievale. Cultura materiale, insediamenti, territorio}}
- @String {AMethTh = {Advances in Archaeological Method and Theory}}
- @String {AMI = {Archäologische Mitteilungen aus Iran}}
- @String {AMIT = {Archäologische Mitteilungen aus Iran und Turan}}
- @String {AmJAncHist = {American Journal of Ancient History}}
- @String {AmJNum = {American Journal of Numismatics}}
- @String {AMold = {Arheologia Moldovei}}
- @String {AMosel = {Archaeologia Mosellana}}
- @String {AMS = {Asia Minor Studien}}
- @String {AmStP = {American Studies in Papyrology}}
- @String {AMuGS = {Antike Münzen und geschnittene Steine}}
- @String {ANachr = {Archäologisches Nachrichtenblatt}}
- @String {ANachrBad = {Archäologische Nachrichten aus Baden}}
- @String {AnadoluAra = {Anadolu araştırmaları. Jahrbuch für kleinasiatische Forschung}}
- @String {AnadoluKonf = {Anadolu Medeniyetleri Müzesi konferansları}}
- @String {AnadoluYil = {Anadolu Medeniyetleri Müzesi yıllığı}}
- @String {AnAe = {Analecta Aegyptiaca}}
- @String {Anagennesis = {Anagennesis. A Papyrological Journal}}
- @String {AnalBolland = {Analecta Bollandiana}}
- @String {AnalP = {Analecta papyrologica}}
- @String {AnalRom = {Analecta Romana Instituti Danici}}
- @String {AnArqAnd = {Anuario arqueológico de Andalucía}}
- @String {Anas = {Anas. Museo nacional de arte romano de Mérida}}
- @String {AnatA = {Anatolian Archaeology. Reports on Research Conducted in Turkey}}
- @String {Anatolia = {Anatolia. Revue annuelle de l’Institut d’archéologie de l’Université d’Ankara}}
- @String {ANaturwiss = {Archäologie und Naturwissenschaften}}
- @String {AncCivScytSib = {Ancient Civilizations from Scythia to Siberia. An International Journal of Comparative Studies in History and Archaeology}}
- @String {AncHistB = {The Ancient History Bulletin}}
- @String {AncInd = {The Ancient India}}
- @String {AncNearEastSt = {Ancient Near Eastern Studies. An Annual}}
- @String {AnCord = {Anales de arqueología cordobesa}}
- @String {AncSoc = {Ancient Society}}
- @String {AncW = {The Ancient World}}
- @String {AncWestEast = {Ancient West and East}}
- @String {AnDubr = {Annali Zavoda za povijesne znanosti Istraivakog centra Jugoslavenske akademije znanosti i umjetnosti u Dubrovniku}}
- @String {ANews = {Archaeological News}}
- @String {ANilMoy = {Archéologie du Nil moyen}}
- @String {ANL = {The Archaeological News Letter}}
- @String {AnMunFaro = {Anais do municípo de Faro}}
- @String {AnMurcia = {Anales de prehistoria y arqueología. Universidad de Murcia}}
- @String {AnnAcEtr = {Annuario. Accademia etrusca di Cortona}}
- @String {AnnAcTorino = {Annuario della Accademia delle scienze di Torino}}
- @String {AnnAStorAnt = {Annali. Sezione di archeologia e storia antica. Istituto universitario orientale di Napoli. Dipartimento di studi del mondo classico e del Mediterraneo antico}}
- @String {AnnBari = {Annali della Facoltà di lettere e filosofia, Università degli Studi, Bari}}
- @String {AnnBenac = {Annali Benacensi}}
- @String {AnnBiblAModena = {Annuario bibliografico di archeologia. Modena}}
- @String {AnnBiblARom = {Annuario bibliografico di archeologia. Nuove accessioni del \ldots. Biblioteca dell’Istituto nazionale di archeologia e storia dell’arte, Roma}}
- @String {AnnByzConf = {Annual Byzantine Studies Conference. Abstracts of Papers}}
- @String {AnnCagl = {Annnali della Facoltà di lettere e filosofia dell'Università di Cagliari}}
- @String {AnnCaglMag = {Annali della Facoltà di magistero dell'Università di Cagliari}}
- @String {AnnEconSocCiv = {Annales. Economies, sociétés, civilisations}}
- @String {AnnEgBibl = {Annual Egyptological Bibliography}}
- @String {AnnEth = {Annales d'Éthiopie}}
- @String {AnnFaina = {Annali della Fondazione per il Museo Claudio Faina}}
- @String {AnnHistA = {Annales d'histoire et d'archéologie}}
- @String {AnnHistScSoc = {Annales. Histoire, sciences sociales}}
- @String {AnnIstGiapp = {Annuario. Istituto giapponese di cultura in Roma}}
- @String {AnnIstItNum = {Annali. Istituto italiano di numismatica}}
- @String {AnnLecce = {Annali dell'Università di Lecce. Facoltà di lettere e filosofia e di magistero}}
- @String {AnnLeedsUnOrSoc = {The Annual of Leeds University Oriental Society}}
- @String {AnnMacerata = {Annali della Facoltà di lettere e filosofia, Università di Macerata}}
- @String {AnnMessMag = {Nuovi annali della Facoltà di magistero dell'Università di Messina}}
- @String {AnnMusRov = {Annali del Museo civico di Rovereto. Sezione archeologia, storia, scienze naturali}}
- @String {AnnNap = {Annali della Facoltà di lettere e filosofia, Università di Napoli}}
- @String {AnnNivern = {Les annales des pays Nivernais}}
- @String {AnnNoment = {Annali. Associazione nomentana di storia e archeologia}}
- @String {AnnOrNap = {Annali. Rivista del Dipartimento di studi asiatici e del Dipartimento di studi e ricerche su Africa e paesi arabi, Istituto universitario orientale di Napoli}}
- @String {AnnotNum = {Annotazioni numismatiche}}
- @String {AnnPerugia = {Annali della Facoltà di lettere e filosofia, Università degli studi di Perugia, 1. Studi classici}}
- @String {AnnPisa = {Annali della Scuola normale superiore di Pisa}}
- @String {AnnPontAcRom = {Annuario della Pontificia accademia romana di archeologia}}
- @String {AnnRepBSA = {Annual Report of Council. British School of Archaeology at Athens}}
- @String {AnnRepCypr = {Annual Report of the Department of Antiquities, Republic of Cyprus}}
- @String {AnnRepFoggArtMus = {The Annual Report of the Fogg Art Museum}}
- @String {AnnSiena = {Annali della Facoltà di lettere e filosofia, Università di Siena}}
- @String {AnnuarioAcLinc = {Annuario della Accademia nazionale dei Lincei}}
- @String {AnnuarioLecce = {Annuario. Liceo-ginnasio statale G. Palmieri, Lecce}}
- @String {AnnUnBud = {Annales Universitatis scientiarum Budapestinensis de Rolando Eötvös nominatae}}
- @String {AnnWorcArtMus = {Annual (Report). Worcester Art Museum}}
- @String {Anodos = {Anodos. Studies of Ancient World}}
- @String {AnOr = {Analecta orientalia. Commentationes scientificae de rebus orientis antiqui}}
- @String {ANRW = {Aufstieg und Niedergang der römischen Welt}}
- @String {Anschnitt = {Der Anschnitt. Mitteilungsblatt der Vereinigung der Freunde von Kunst und Kultur im Bergbau}}
- @String {ANSMusNotes = {Museum Notes. American Numismatic Society}}
- @String {AnSt = {Anatolian Studies}}
- @String {Antaeus = {Antaeus. Communicationes ex Instituto archaeologico Academiae scientiarum hungaricae}}
- @String {AntAfr = {Antiquités africaines}}
- @String {AntChr = {Antike und Christentum}}
- @String {AntCl = {L'antiquité classique}}
- @String {AnthrAChron = {Ανθρωπολογικά και Αρχαιολογικά Χρονικά}}
- @String {Anthropos = {Άνθρωπος. Όργανο της Ανθρωπολογικής Εταιρείας Ελλάδος}}
- @String {Antichthon = {Antichthon. Journal of the Australian Society for Classical Studies}}
- @String {AntigCr = {Antigüedad y cristianismo. Monografías históricas sobre la antigüedad tardía}}
- @String {Antipolis = {Antipolis. A Journal of Mediterranean Archaeology}}
- @String {Antiqua = {Antiqua. Rivista dell'Archeoclub d'Italia}}
- @String {Antiquity = {Antiquity. A Quarterly Review of Archaeology}}
- @String {AntJ = {The Antiquaries Journal}}
- @String {AntK = {Antike Kunst}}
- @String {AntNat = {Antiquités nationales. Saint-Germain-en-Laye}}
- @String {AntPisa = {Antichità pisane}}
- @String {AntPl = {Antike Plastik}}
- @String {AntSurv = {Antiquity and Survival}}
- @String {AntTard = {Antiquité tardive. Revue internationale d'histoire et d'archéologie}}
- @String {AnzAW = {Anzeiger für die Altertumswissenschaft}}
- @String {AnzWien = {Anzeiger. Österreichische Akademie der Wissenschaften, Philosophisch-Historische Klasse}}
- @String {AOAT = {Alter Orient und Altes Testament. Veröffentlichungen zur Kultur und Geschichte des Alten Orients und des Alten Testaments}}
- @String {AoF = {Altorientalische Forschungen}}
- @String {AOtkryt = {Archeologičeskie otkrytija}}
- @String {APamKiiv = {Archeologični pamjatki URSR}}
- @String {APh = {L'année philologique}}
- @String {APol = {Archaeologia Polona}}
- @String {Apollo = {Apollo. Bolletino dei musei provinciali del Salernitano}}
- @String {ApolloLond = {Apollo. The International Magazine of the Arts}}
- @String {APort = {O arqueólogo português}}
- @String {AppRomFil = {Appunti romani di filologia. Studi e comunicazioni di filologia, linguistica e letteratura greca e latina}}
- @String {APregl = {Arheološki pregled. Arheološko društvo Jugoslavije}}
- @String {Apulum = {Apulum. Acta Musei Apulensis}}
- @String {AquiLeg = {Aquila legionis. Cuadernos des estudios sobre el ejército romano}}
- @String {AquilNost = {Aquileia nostra. Bollettino dell'Associazione nazionale per Aquileia}}
- @String {Aquitania = {Aquitania. Une revue inter-régionale d'archéologie}}
- @String {ArabAEpigr = {Arabian Archaeology and Epigraphy}}
- @String {ARadRaspr = {Arheolokiradovi i rasprave}}
- @String {ArbFBerSaechs = {Arbeits- und Forschungsberichte zur sächsischen Bodendenkmalpflege}}
- @String {Archaeographie = {Archäographie. Archäologie und elektronische Datenverarbeitung}}%*Abweichung!
- @String {Archaeologia = {Archaeologia or Miscellaneous Tracts Relating to Antiquity Published by the Society of Antiquaries of London}}
- @String {Archaeology = {Archaeology. A Magazine Dealing with the Antiquity of the World}}
- @String {Archaeometry = {Archaeometry. Bulletin of the Research Laboratory for Archaeology and History of Art, Oxford University}}
- @String {Archaiognosia = {Αρχαιογνωσία}}
- @String {ArchBegriffsGesch = {Archiv für Begriffsgeschichte}}
- @String {ArchByzMnem = {Αρχείον των Βυζαντινών Μνημείων της Ελλάδος }}
- @String {ArchCl = {Archeologia classica}}
- @String {Archeo = {Archeo. Attualità del passato}}
- @String {ArcheogrTriest = {Archeografo triestino}}
- @String {ArcheologiaParis = {Archeologia, Paris. L'archéologie dans le monde et tout ce qui concerne les recherches historiques, artistiques et scientifiques sur terre et dans les mers}}
- @String {ArcheologiaRoma = {Archeologia. Rivista bimestrale. Roma}}
- @String {ArcheologiaWarsz = {Archeologia. Rocznik Instytutu archeologii i etnologii, Polskiej akademii nauk}}
- @String {ArcheologijaKiiv = {Archeologija. Nacional'na akademija nauk Ukraini. Institut archeologii}}
- @String {ArcheologijaSof = {Archeologija. Organ na Archeologičeskija institut i muzej (pri Bălgarskata akademii nauk)}}
- @String {ArchEubMel = {Αρχείον Ευβοϊκών Μελετών}}
- @String {ArchHom = {Archaeologia Homerica}}
- @String {Architectura = {Architectura. Zeitschrift für Geschichte der Baukunst}}
- @String {Archivi = {Archivi. Archivi d'Italia e rassegna internazionale degli archivi}}
- @String {ArchPF = {Archiv für Papyrusforschung und verwandte Gebiete}}
- @String {ArchPrehistLev = {Archivo de prehistoria levantina}}
- @String {ArchRel = {Archiv für Religionsgeschichte}}
- @String {ArchStorCal = {Archivio storico per la Calabria e la Lucania}}
- @String {ArchStorPugl = {Archivio storico pugliese}}
- @String {ArchStorRom = {Archivio della Società romana di storia patria}}
- @String {ArchStorSicOr = {Archivio storico per la Sicilia orientale}}
- @String {ArchStorSir = {Archivio storico siracusano}}
- @String {Arctos = {Arctos. Acta philologica Fennica}}
- @String {ARepLond = {Archaeological Reports}}
- @String {Argo = {Argo. časopis slovenskih muzejev, Narodni Muzej Slovenije}}
- @String {ArOr = {Archív orientální. Quarterly Journal of African and Asian Studies}}
- @String {ArOrMono = {Archív orientální. Quarterly Journal of African, Asian and Latin American Studies. Monografie Archívu orientálního}}
- @String {ArOrSuppl = {Archív orientální. Quarterly Journal of African, Asian and Latin American Studies. Supplementa}}
- @String {ARozhl = {Archeologické rozhledy}}
- @String {ArqBeja = {Arquivo de Beja. Boletim, estudos, arquivo}}
- @String {Arse = {Arse. Boletín del Centro arqueológico saguntino}}
- @String {ArsGeorg = {Ars Georgica}}
- @String {ArtAntMod = {Arte antica e moderna}}
- @String {ArtARhone = {Art et archéologie en Rhône-Alpes}}%*Abweichung!
- @String {ArtAs = {Artibus Asiae}}
- @String {ArtB = {The Art Bulletin}}
- @String {ArtJ = {Art Journal}}
- @String {ArtLomb = {Arte lombarda}}
- @String {ArtMediev = {Arte medievale}}
- @String {ArtVirg = {Arts in Virginia}}
- @String {ARV2 = {J. D. Beazley, Attic Red-figure Vase-painters \textsuperscript{2}(Oxford 1963)}}
- @String {ASachs = {Archäologie in Sachsen-Anhalt}}
- @String {ASAE = {Annales du Service des antiquités de l’Égypte}}
- @String {ASammlUnZuerch = {Archäologische Sammlung der Universität Zürich}}%*Abweichung!
- @String {ASAtene = {Annuario della Scuola archeologica di Atene e delle missioni italiane in Oriente}}
- @String {ASbor = {Archeologičeskij sbornik. Gosudarstvennyj ordena Lenina Ermitaž}}
- @String {ASchw = {Archäologie der Schweiz. Mitteilungsblatt der Schweizerischen Gesellschaft für Ur- und Frühgeschichte}}
- @String {ASoc = {Archeologia e società}}
- @String {ASoloth = {Archäologie des Kantons Solothurn}}
- @String {ASR = {Die antiken Sarkophagreliefs}}
- @String {Assaph = {Assaph. Studies in Art History}}
- @String {AssyrMisc = {Assyriological Miscellanies}}
- @String {AST = {AratirmaSonuçlariToplantisi}}
- @String {ASub = {L'archeologo subacqueo. Quadrimestrale di archeologia subacquea e navale}}
- @String {ASubacq = {Archeologia subacquea. Studi, ricerche e documenti}}
- @String {Athenaeum = {Athenaeum. Studi di letteratura e storia dell'antichità}}
- @String {Atiqot = {`Atiqot. Journal of the Israel Department of Antiquities}}
- @String {AtiqotHeb = {`Atiqot. Journal of the Israel Department of Antiquities. Hebrew Series}}
- @String {Atlal = {Atlal. The Journal of Saudi Arabian Archaeology}}
- @String {AttiAcPontan = {Atti della Accademia pontaniana}}
- @String {AttiAcRov = {Atti della Accademia Roveretana degli Agiati. Contributi della classe di scienze umane, di lettere ed arti}}
- @String {AttiAcTorino = {Atti della Accademia delle scienze di Torino, 2. Classe di scienze morali, storiche e filologiche}}
- @String {AttiCAntCl = {Atti. Centro ricerche e documentazione sull'antichità classica}}
- @String {AttiCItRom = {Atti. Centro studi e documentazione sull'Italia romana}}
- @String {AttiMemBologna = {Atti e memorie. Deputazione di storia patria per le province di Romagna}}
- @String {AttiMemDal = {Atti e memorie della Società dalmata di storia patria}}
- @String {AttiMemFirenze = {Atti e memorie dell'Academia toscana di scienze e lettere »La Columbaria«}}
- @String {AttiMemIstria = {Atti e memorie della Società istriana di archeologia e storia patria}}
- @String {AttiMemMagnaGr = {Atti e memorie della Società Magna Grecia}}
- @String {AttiMemModena = {Atti e memorie. Deputazione di storia patria per le antiche provincie modenesi}}
- @String {AttiMemTivoli = {Atti e memorie della Società tiburtina di storia e d'arte}}
- @String {AttiMusTrieste = {Atti dei Civici musei di storia ed arte di Trieste}}
- @String {AttiPalermo = {Atti della Accademia di scienze, lettere e arti di Palermo}}
- @String {AttiRovigno = {Atti. Centro di ricerche storiche, Rovigno}}
- @String {AttiSocFriuli = {Atti della Società per la preistoria e protostoria della regione Friuli -- Venezia Giulia}}
- @String {AttiVenezia = {Atti. Istituto veneto di scienze, lettere ed arti}}
- @String {AuA = {Antike und Abendland}}
- @String {AulaOr = {Aula orientalis. Revista de estudios del Próximo Oriente antiguo}}
- @String {AusgrFu = {Ausgrabungen und Funde. Nachrichtenblatt der Landesarchäologie}}
- @String {AusgrFuWestf = {Ausgrabungen und Funde in Westfalen-Lippe}}
- @String {AustrRom = {Pro Austria Romana}}
- @String {AUTerr = {Archeologia, uomo, territorio. Rivista dei Gruppi archeologici Nord Italia}}
- @String {AUWE = {Ausgrabungen in Uruk-Warka. Endberichte}}
- @String {AV = {Archäologische Veröffentlichungen. Deutsches Archäologisches Institut, Abteilung Kairo}}
- @String {AVen = {Archeologia veneta}}
- @String {AVes = {Arheološki vestnik (Ljubljana)}}
- @String {AViva = {Archeologia viva}}
- @String {AvP = {Altertümer von Pergamon}}
- @String {AW = {Antike Welt. Zeitschrift für Archäologie und Kulturgeschichte}}
- @String {AyasofyaMuezYil = {Ayasofia Müzesi yıllığı. Annual of Ayasofya Museum}}%*Abweichung!
- @String {AZ = {Archäologische Zeitung}}
- @String {Azotea = {Azotea. Revista de cultura del Ayuntamiento de Coria del Río}}
- @String {BA = {Bollettino di archeologia}}
- @String {Baalbek = {Baalbek. Ergebnisse der Ausgrabungen und Untersuchungen in den Jahren 1898 bis 1905}}
- @String {BAAlger = {Bulletin d'archéologie algérienne}}
- @String {BABarcel = {Butlletí informatiu de l'Institut de prehistòria i arqueologia de la Diputació provincial de Barcelona}}
- @String {BABesch = {Bulletin antieke beschaving. Annual Papers on Classical Archaeology}}
- @String {BAcRHist = {Boletín de la Real academia de la historia}}
- @String {BACopt = {Bulletin de la Société d'archéologie copte}}
- @String {BadFuBer = {Badische Fundberichte}}
- @String {Baetica = {Baetica. Estudios de arte, geografía e historia}}
- @String {BaF = {Baghdader Forschungen}}
- @String {BalacaiKoez = {Balácai közlemények}}%*Abweichung!
- @String {BalkSt = {Balkan Studies}}
- @String {BALond = {Bulletin of the Institute of Archaeology, University of London}}
- @String {BALux = {Bulletin d'archéologie luxembourgeoise}}
- @String {BaM = {Baghdader Mitteilungen}}
- @String {BAMaroc = {Bulletin d'archéologie marocaine}}
- @String {BAmSocP = {The Bulletin of the American Society of Papyrologists}}
- @String {BAncOrMus = {Bulletin of the Ancient Orient Museum (Tokyo)}}
- @String {BAngers = {Bulletin du Centre de recherches et d'enseignement de l'antiquité, Angers}}
- @String {BAngloIsrASoc = {Bulletin of the Anglo-Israel Archaeological Society}}
- @String {BAnnMusFerr = {Bollettino annuale. Musei ferraresi}}
- @String {BAntFr = {Bulletin de la Société nationale des antiquaires de France}}
- @String {BAntLux = {Bulletin des antiquités luxembourgeoises}}
- @String {BAParis = {Bulletin archéologique du Comité des travaux historiques et scientifiques. Antiquités nationales}}
- @String {BAProv = {Bulletin archéologique de Provence}}
- @String {BAR = {British Archaeological Reports. British Series}}
- @String {BArchAlex = {Bulletin. Société archéologique d'Alexandrie}}
- @String {BArchit = {Bollettino del Centro di studi per la storia dell'architettura}}
- @String {BARIntSer = {British Archaeological Reports. International Series}}
- @String {BASard = {Nuovo bullettino archeologico sardo}}
- @String {BAsEspA = {Boletín. Asociación española de amigos de la arqueología}}
- @String {BAsInst = {Bulletin of the Asia Institute}}
- @String {BASOR = {Bulletin of the American Schools of Oriental Research}}
- @String {BAssBude = {Bulletin de l'Association Guillaume Budé}}%*Abweichung!
- @String {BAssMosAnt = {Bulletin d'information de l'Association internationale pour l'étude de la mosaïque antique}}
- @String {BASub = {Bollettino di archeologia subacquea}}
- @String {BASudEstEur = {Bulletin d'archéologie sud-est européenne}}
- @String {BATarr = {Bulletí arqueològic. Reial societat arqueològica tarraconense. Boletín arqueológico. Real sociedad arqueológica tarragonese}}
- @String {BAur = {Boletín auriense}}
- @String {BAVA = {Beiträge zur Allgemeinen und Vergleichenden Archäologie}}
- @String {BayVgBl = {Bayerische Vorgeschichtsblätter}}
- @String {BBasil = {Bollettino storico della Basilicata}}
- @String {BBelgRom = {Bulletin de l'Institut historique belge de Rome}}
- @String {BBolsena = {Bollettino di studi e ricerche. Biblioteca comunale di Bolsena}}
- @String {BBrByzSt = {Bulletin of British Byzantine Studies}}
- @String {BCamuno = {Bullettino del Centro Camuno di studi preistorici}}
- @String {BCASic = {Beni culturali e ambientali. Sicilia}}
- @String {BCercleNum = {Bulletin du Cercle d'études numismatiques}}
- @String {BCH = {Bulletin de correspondance hellénique}}
- @String {BCircNumNap = {Bollettino del Circolo numismatico napoletano}}
- @String {BCl = {Bollettino dei classici}}
- @String {BClevMus = {The Bulletin of The Cleveland Museum of Art}}
- @String {BCom = {Bullettino della Commissione archeologica comunale di Roma}}
- @String {BCord = {Bulletin d'information de l'Association internationale pour l'étude de la mosaïque antique}}
- @String {BdA = {Bollettino d'arte}}
- @String {BdE = {Bibliothèque d'études, Institut français d'archéologie orientale, Kairo}}
- @String {BdEC = {Bibliothèque d'études coptes, Institut français d'archéologie orientale, Kairo}}
- @String {BdI = {Bullettino dell'Instituto di corrispondenza archeologica}}
- @String {BDirRom = {Bullettino dell'Istituto di diritto romano »Vittorio Scialoja«}}
- @String {BeazleyAddenda2 = {T. H. Carpenter (Hrsg.), Beazley Addenda \textsuperscript{2}(Oxford 1989)}}%*Abweichung!
- @String {BeazleyPara. = {J. D. Beazley, Paralipomena. Additions to Attic Black-figure Vase-painters and to Attic Red-figure Vase-painters (Oxford 1971)}}%*Abweichung!
- @String {BEcAntNimes = {Bulletin (annuel) de l'École antique de Nîmes}}%*Abweichung!
- @String {BediKart = {Bedi Kartlisa. Revue de kartvélologie}}
- @String {BEFAR = {Bibliothèque des Écoles françaises d'Athènes et de Rome}}
- @String {BeitrESkAr = {Beiträge zur Erschließung hellenistischer und kaiserzeitlicher Skulptur und Architektur}}
- @String {BeitrNamF = {Beiträge zur Namenforschung}}
- @String {BeitrSudanF = {Beiträge zur Sudanforschung}}
- @String {BelArt = {Bellas artes (Madrid)}}
- @String {Belleten = {Belleten. Türk Tarih Kurumu}}
- @String {Benacus = {Benàcus. Museo archeologico della Val Tenesi}}
- @String {BerBayDenkmPfl = {Bericht der Bayerischen Bodendenkmalpflege}}
- @String {BerDFG = {Bericht der Deutschen Forschungsgemeinschaft}}
- @String {BerlBeitrArchaeom = {Berliner Beiträge zur Archäometrie}}%*Abweichung!
- @String {BerlBlVFruehGesch = {Berliner Blätter für Vor- und Frühgeschichte}}%*Abweichung!
- @String {BerlJbVFruehGesch = {Berliner Jahrbuch für Vor- und Frühgeschichte}}%*Abweichung!
- @String {BerlMus = {Berliner Museen}}
- @String {BerlNumZ = {Berliner numismatische Zeitschrift}}
- @String {BerOudhBod = {Berichten van de Rijksdienst voor het oudheidkundig bodemonderzoek}}
- @String {BerRGK = {Bericht der Römisch-Germanischen Kommission}}
- @String {BerVerhLeipz = {Berichte über die Verhandlungen der Sächsischen Akademie der Wissenschaften zu Leipzig}}
- @String {Berytus = {Berytus. Archaeological Studies}}
- @String {BEspA = {Boletín. Asociación española de amigos de la arqueología}}
- @String {BEspOr = {Boletín de la Asociación española de orientalistas}}
- @String {BEtOr = {Bulletin d'études orientales}}
- @String {BFilGrPadova = {Bollettino dell'Istituto di filologia greca, Università di Padova}}
- @String {BFilLingSic = {Bollettino. Centro di studi filologici e linguistici siciliani}}
- @String {BFlegr = {Bollettino flegreo. Rivista di storia, arte e scienze}}
- @String {BFoligno = {Bollettino storico della città di Foligno}}
- @String {BHarvMus = {Harvard University Art Museums Bulletin}}
- @String {BIasos = {Bollettino dell'Associazione Iasos di Caria}}
- @String {BibAr = {The Biblical Archaeologist. The American School of Oriental Research New Haven}}
- @String {BiblClOr = {Bibliotheca classica orientalis}}
- @String {BiblSymb = {Bibliographie zur Symbolik, Ikonographie und Mythologie. Internationales Referateorgan}}
- @String {BIBulg = {Izvestija na Archeologičeskija institut. Bulletin de l’Institut d’archéologie}}
- @String {BICS = {Bulletin of the Institute of Classical Studies of the University of London}}
- @String {BIFAO = {Bulletin de l'Institut français d'archéologie orientale}}
- @String {BInfCentumcellae = {Bollettino di informazioni. Associazione archeologica Centumcellae}}
- @String {BInfCESDAE = {Bollettino di informazioni del Centro di studi e documentazione sull'area elima}}
- @String {BiogrZbor = {Biogradski zbornik}}
- @String {BiOr = {Bibliotheca orientalis}}
- @String {BIstOrvieto = {Bollettino dell'Istituto storico artistico orvietano}}
- @String {BJaen = {Boletín del Instituto de estudios giennenses}}%*Abweichung!
- @String {BJb = {Bonner Jahrbücher des Rheinischen Landesmuseums in Bonn}}
- @String {BJerus = {Bulletin. The Hebrew University, Jerusalem, Rabinowitz Fund}}
- @String {BLaborMusLouvre = {Bulletin du laboratoire du Musée du Louvre}}
- @String {BLazioMerid = {Bollettino dell'Istituto di storia e di arte del Lazio meridionale}}
- @String {BLikUm = {Bulletin Razreda za likovne umjetnosti Hrvatske akademije znanosti i umjetnosti}}
- @String {BlMueFreundeF = {Blätter für Münzfreunde und Münzforschung}}%*Abweichung!
- @String {BLugo = {Boletín de la Comisión provincial de monumentos históricos y artísticos de Lugo}}
- @String {BMCGreekCoins = {Catalogue of the Greek Coins in the British Museums}}%*Abweichung!
- @String {BMCOR = {Catalogue of Oriental Coins in the British Museum I--X}}
- @String {BMCRE = {H. Mattingly (u. a.), Coins of the Roman Empire in the British Museum (London 1923--1950; \textsuperscript{2}1975)}}
- @String {BMCRRI-III = {H. A. Grueber, Coins of the Roman Republic in the British Museum I--III (London 1910)}}%*Abweichung!
- @String {BMetrMus = {The Metropolitan Museum of Art Bulletin}}
- @String {BMon = {Bulletin monumental}}
- @String {BMonMusPont = {Bollettino. Monumenti, musei e gallerie pontificie}}
- @String {BMQ = {The British Museum Quarterly}}
- @String {BMQNSuppl = {The British Museum Quarterly. News Supplement}}
- @String {BMusBeyrouth = {Bulletin du Musée de Beyrouth}}
- @String {BMusBrux = {Bulletin des Musées royaux d'art et d'histoire, Bruxelles}}
- @String {BMusCadiz = {Boletín del Museo de Cádiz}}
- @String {BMusCivRom = {Bullettino del Museo della civiltà romana}}
- @String {BMusFA = {Bulletin. Museum of Fine Arts, Boston}}
- @String {BMusHongr = {Bulletin du Musée hongrois des beaux-arts}}
- @String {BMusMadr = {Boletín del Museo arqueológico nacional, Madrid}}
- @String {BMusMich = {Bulletin. Museums of Art and Archaeology, University of Michigan}}
- @String {BMusMonaco = {Bulletin du Musée d'anthropologie préhistorique de Monaco}}
- @String {BMusPadova = {Bollettino del Museo civico di Padova}}
- @String {BMusPBelArt = {Boletín del Museo provincial de bellas artes}}
- @String {BMusRom = {Bollettino dei Musei comunali di Roma}}
- @String {BMusVars = {Bulletin du Musée national de Varsovie}}
- @String {BMusZaragoza = {Museo de Zaragoza. Boletín}}
- @String {BNumParis = {Bulletin de la Société française de numismatique}}
- @String {BNumRoma = {Bollettino di numismatica}}
- @String {Bogazkoey-Hattusa = {Boğazköy-Hattuša. Ergebnisse der Ausgrabungen}}%*Abweichung!
- @String {Bolskan = {Bolskan. Revista de arqueología del Instituto de estudios Altoaragoneses, revista de arqueología Oscense}}
- @String {BonnHVg = {Bonner Hefte zur Vorgeschichte}}
- @String {BOntMus = {Bulletin of the Royal Ontario Museum of Archaeology, University of Toronto}}
- @String {Boreas = {Boreas. Münstersche Beiträge zur Archäologie}}
- @String {BoreasUpps = {Boreas. Uppsala Studies in Ancient Mediterranean and Near Eastern Civilization}}
- @String {BPeintRom = {Bulletin de liaison. Centre d'études des peintures murales romaines}}
- @String {BPI = {Bullettino di paletnologia italiana}}
- @String {BPrehistAlp = {Bulletin d'études préhistoriques alpines}}%*Abweichung!
- @String {BProAvent = {Bulletin de l'Association Pro Aventico}}
- @String {BProvidence = {Bulletin of the Rhode Island School of Design. Museum Notes}}
- @String {BracAug = {Bracara Augusta. Revista cultural da Câmara municipal de Braga}}
- @String {BracaraAugusta = {Bracara Augusta. Revista cultural da Câmara municipal de Braga}}
- @String {BremABl = {Bremer archäologische Blätter}}
- @String {BRest = {Bollettino dell'Istituto centrale del restauro}}
- @String {Brigantium = {Brigantium. Museo arqueolóxico e histórico}}
- @String {BrMusYearbook = {The British Museum Yearbook}}
- @String {BSA = {The Annual of the British School at Athens}}
- @String {BSAA = {Boletín del Seminario de estudios de arte y arqueología, Universidad de Valladolid}}
- @String {BSFE = {Bulletin de la Société française d'égyptologie}}
- @String {BSiena = {Bullettino senese di storia patria}}
- @String {BSOAS = {Bulletin of the School of Oriental and African Studies (London)}}
- @String {BSocAChamp = {Bulletin de la Société archéologique champenoise}}
- @String {BSocBiblReinach = {Bulletin de liaison de la Société des amis de la Bibliothèque Salomon Reinach}}
- @String {BSocNumRom = {Buletinul Societăţii numismatice române}}
- @String {BSR = {Papers of the British School at Rome}}
- @String {BStLat = {Bollettino di studi latini}}
- @String {BStorArt = {Bollettino della Unione storia ed arte}}
- @String {BTextilAnc = {Bulletin du Centre international d'étude des textiles anciens}}
- @String {BTorino = {Bollettino della Società piemontese di archeologia e belle arti}}
- @String {BTravTun = {Bulletin des travaux de l'Institut national du patrimoine. Comptes rendus}}
- @String {BudReg = {Budapest régiségei}}
- @String {BulletinGetty = {Bulletin. J. Paul Getty Museum of Art}}
- @String {BulletinNorthampton = {Bulletin. Smith College Museum of Art}}
- @String {BVallad = {Boletín del Seminario de estudios de arte y arqueología, Universidad de Valladolid}}
- @String {BVitoria = {Boletín de la Institución »Sancho el Sabio«}}
- @String {BWaltersArtGal = {The Walters Art Gallery Bulletin}}
- @String {BWPr = {Winckelmannsprogramm der Archäologischen Gesellschaft zu Berlin}}
- @String {Byzantina = {Βυζαντινά. Επιστημονικόν Όργανον Κέντρου Βυζαντινών Ερευνών Φιλοσοφικής Σχολής Αριστοτελείου Πανεπιστημίου Θεσσαλονίκης}}
- @String {ByzF = {Byzantinische Forschungen. Internationale Zeitschrift für Byzantinistik}}
- @String {ByzJb = {Byzantinisch-neugriechische Jahrbücher}}
- @String {ByzZ = {Byzantinische Zeitschrift}}
- @String {BZ = {Biblische Zeitschrift}}
- @String {CAA = {Corpus antiquitatum Aegyptiacarum}}
- @String {CAD = {The Assyrian Dictionary of the Oriental Institute of the University of Chicago}}
- @String {CadA = {Cadernos de arqueologia}}
- @String {Caesaraugusta = {Caesaraugusta. Publicaciones del Seminario de Arqueología y Numismática Aragonesas}}
- @String {Caesarodunum = {Caesarodunum. Bulletin de l'Institut d'études latines et du Centre de recherches A. Piganiol}}
- @String {CAH = {The Cambridge Ancient History}}
- @String {CahArmeeRom = {Cahiers du Groupe de recherches sur l'armée romaine et les provinces}}
- @String {CahASubaqu = {Cahiers d'archéologie subaquatique}}
- @String {CahByrsa = {Cahiers de Byrsa}}
- @String {CahCEC = {Cahier. Centre d'études chypriotes}}
- @String {CahCerEg = {Cahiers de la céramique égyptienne}}
- @String {CahDelFrIran = {Cahiers de la Délégation française en Iran}}
- @String {CahGlotz = {Cahiers du Centre Gustave-Glotz. Revue reconnue par le CNRS}}
- @String {CahKarnak = {Cahiers de Karnak}}
- @String {CahLig = {Cahiers ligures de préhistoire et de protohistoire}}
- @String {CahMariemont = {Les cahiers de Mariemont. Bulletin du Musée royal de Mariemont}}
- @String {CahMusChampollion = {Cahiers du Musée Champollion. Histoire et archéologie}}
- @String {CahPEg = {Cahiers de recherches de l'Institut de papyrologie et d'égyptologie de Lille. Sociétés urbaines en Égypte et au Soudan}}
- @String {CahRhod = {Cahiers rhodaniens}}
- @String {CahTun = {Cahiers de Tunisie}}
- @String {CalifStClAnt = {California Studies in Classical Antiquity}}
- @String {CambrAJ = {Cambridge Archaeological Journal}}
- @String {CArch = {Cahiers archéologiques}}
- @String {CarinthiaI = {Carinthia I. Geschichtliche und volkskundliche Beiträge zur Heimatkunde Kärntens}}%*Abweichung!
- @String {CarnuntumJb = {Carnuntum-Jahrbuch. Zeitschrift für Archäologie und Kulturgeschichte des Donauraumes}}
- @String {Carpica = {Carpica. Muzeul judeţean de istorie şi artă, Bacău}}
- @String {Carrobbio = {Il Carrobbio. Rivista di studi bolognesi}}
- @String {CAT = {Ch. W. Clairmont, Classical Attic Tombstones (Kilchberg 1993--1995)}}
- @String {CE = {Cuadernos emeritenses}}
- @String {CEDAC = {CEDAC. Bulletin. Centre d'études et de documentation archéologique de la conservation de Cartage}}
- @String {CEFR = {Collection de l'École française de Rome}}
- @String {Celticum = {Celticum. Supplément à Ogam}}
- @String {CercA = {Cercetriarheologice}}
- @String {CercNum = {Cercetări numismatice. Muzeul naţional de istorie}}
- @String {Chiron = {Chiron. Mitteilungen der Kommission für Alte Geschichte und Epigraphik des Deutschen Archäologischen Instituts}}
- @String {ChronEg = {Chronique d'Égypte}}
- @String {CIA = {Corpus inscriptionum Atticarum}}
- @String {CIE = {Corpus inscriptionum Etruscarum}}
- @String {CIG = {Corpus inscriptionum Graecarum}}
- @String {CIH = {Corpus inscriptionum Semiticarum. Pars quarta. Inscriptiones himyariticas et sabaeas continens}}
- @String {CIL = {Corpus inscriptionum Latinarum}}
- @String {CincArtB = {The Cincinnati Art Museum Bulletin}}
- @String {CIS = {Corpus inscriptionum Semiticarum}}
- @String {CIstAMilano = {Contributi dell'Istituto di archeologia. Pubblicazioni dell'Università cattolica del Sacro Cuore, Milano}}
- @String {CivClCr = {Civiltà classica e cristiana}}
- @String {CivPad = {Civiltà padana. Archeologia e storia del territorio}}
- @String {ClAnt = {Classical Antiquity}}
- @String {ClevStHistArt = {Cleveland Studies in the History of Art}}
- @String {Clio = {Clio. Revista do Centro de história da Universidade Lisboa}}
- @String {ClIre = {Classics Ireland}}
- @String {ClJ = {The Classical Journal}}
- @String {ClMediaev = {Classica et mediaevalia. Revue danoise de philologie et d'histoire}}
- @String {ClPhil = {Classical Philology}}
- @String {ClQ = {The Classical Quarterly}}
- @String {ClR = {The Classical Review}}
- @String {ClRh = {Clara Rhodos}}
- @String {CMatAOr = {Contributi e materiali di archeologia orientale}}
- @String {CMGr = {Convegni di studi sulla Magna Grecia}}
- @String {CMS = {Corpus der minoischen und mykenischen Siegel}}
- @String {CoinHoards = {Coin Hoards. The Royal Numismatic Society, London}}%*Abweichung!
- @String {ColloquiSod = {Colloqui del Sodalizio}}
- @String {CommunicAHung = {Communicationes archaeologicae hungaricae}}
- @String {Complutum = {Complutum. Publicaciones del Departamento de prehistoria de la Universidad complutense de Madrid}}
- @String {Conoscenze = {Conoscenze. Rivista annuale della Soprintendenza archeologica e per i beni ambientali, architettonici, artistici e storici del Molise}}
- @String {Corduba = {Corduba archaeologica}}
- @String {Corinth = {Corinth. Results of Excavations Conducted by the American School of Classical Studies at Athens}}
- @String {CRAI = {Académie des inscriptions et belles-lettres. Comptes rendus des séances de l'Académie}}
- @String {CretAnt = {Creta antica. Rivista annuale di studi archeologici, storici ed epigrafici}}
- @String {CretSt = {Cretan Studies}}
- @String {CronA = {Cronache di archeologia}}
- @String {CronErcol = {Cronache ercolanesi. Bollettino del Centro internazionale per lo studio dei papiri ercolanesi}}
- @String {CronPomp = {Cronache pompeiane}}
- @String {CRPetersbourg = {Compte-rendu de la Commission impériale archéologique, St. Pétersbourg}}%*Abweichung!
- @String {CSE = {Corpus speculorum Etruscorum}}
- @String {CSIR = {Corpus signorum Imperii Romani}}
- @String {CSSpecPisa = {Contributi della Scuola di specializzazione in archeologia dell'Università degli studi di Pisa}}
- @String {CuadAMed = {Cuadernos de arqueología mediterránea}}
- @String {CuadArquitRom = {Cuadernos de arquitectura romana}}
- @String {CuadCastellon = {Cuadernos de prehistoria y arqueología castellonense}}
- @String {CuadCat = {Cuaderni catanesi di studi classici e medievali}}
- @String {CuadFilCl = {Cuadernos de filología clásica. Facultad de letras y filosofía, Universidad de Madrid}}
- @String {CuadGallegos = {Cuadernos de estudios gallegos}}
- @String {CuadGranada = {Cuadernos de prehistoria de la Universidad de Granada}}
- @String {CuadNavarra = {Cuadernos de arqueología de la Universidad de Navarra}}
- @String {CuadPrehistA = {Cuadernos de prehistoria y arqueología. Universidad autónoma de Madrid}}
- @String {CuadRom = {Cuadernos de trabajos de la Escuela española de historia y arqueología en Roma}}
- @String {CuPaUAM = {Cuadernos de prehistoria y arqueología. Universidad autónoma de Madrid}}
- @String {CVA = {Corpus vasorum antiquorum}}
- @String {CZero = {Cota Zero. Revista d'arqueologia i ciencia}}
- @String {DAA = {Denkmäler antiker Architektur}}
- @String {Dacia = {Dacia. Revue d'archéologie et d'histoire ancienne}}
- @String {DACL = {Dictionnaire d'archéologie chrétienne et de liturgie}}
- @String {Dacoromania = {Dacoromania. Jahrbuch für östliche Latinität}}
- @String {DaF = {Damaszener Forschungen}}
- @String {Daidalos = {Daidalos. Studi e ricerche del Dipartimento di scienze del mondo antico}}
- @String {DAIGeschDok = {Das Deutsche Archäologische Institut. Geschichte und Dokumente}}
- @String {DaM = {Damaszener Mitteilungen}}
- @String {Daremberg-Saglio = {Dictionnaire des antiquités grecques et romaines d'après les textes et les monuments. Ouvrage rédigé sous la direction de Ch. Daremberg et E. Saglio}}%*Abweichung!
- @String {DebrecMuzEvk = {A Debreceni Déri múzeum évkönyve}}
- @String {Dedalo = {Dédalo. Revista de arte e arqueologia}}%*Abweichung!
- @String {Delos = {Exploration archéologique de Délos faite par l'École française d'Athènes}}%*Abweichung!
- @String {DeltChrA = {Δελτίον της Χριστιανικής Αρχαιολογικής Εταιρείας}}
- @String {Demircihueyuek = {Demircihüyük. Die Ergebnisse der Ausgrabungen 1975--1978}}%*Abweichung!
- @String {DeMuseus = {De museus. Quaderns de museologia i museografia}}
- @String {DenkmPflBadWuert = {Denkmalpflege in Baden-Württemberg}}%*Abweichung!
- @String {DenkschrWien = {Österreichische Akademie der Wissenschaften, Philosophisch-Historische Klasse. Denkschriften}}
- @String {Diadora = {Diadora. Glasilo arheoloskog muzeja u Zadru}}
- @String {DialA = {Dialoghi di archeologia}}
- @String {DialHistAnc = {Dialogues d'histoire ancienne}}
- @String {Dike = {Dike. Rivista di storia del diritto greco ed ellenistico. Università degli studi di Milano. Facoltà di giurisprudenza}}
- @String {Dioniso = {Dioniso. Annale della Fondazione INDA, Istituto nazionale del dramma antico}}
- @String {DiskAB = {Diskussionen zur archäologischen Bauforschung}}
- @String {DKuDenkmPfl = {Deutsche Kunst und Denkmalpflege}}
- @String {DLZ = {Deutsche Literaturzeitung für Kritik der internationalen Wissenschaft}}
- @String {DNP = {Der Neue Pauly. Enzyklopädie der Antike}}
- @String {DocAlb = {Documenta Albana}}
- @String {DocALouv = {Documents d'archéologie régionale. Université catholique de Louvain}}
- @String {DocAMerid = {Documents d'archéologie méridionale}}
- @String {DocEmRom = {Documenti. Istituto per i beni artistici, culturali, naturali della regione Emilia-Romagna}}
- @String {Dodone = {Δωδώνη}}
- @String {DOP = {Dumbarton Oaks Papers}}
- @String {DossAlet = {Les dossiers du Centre régional archéologique d'Alet}}
- @String {DossAParis = {Les dossiers d'archéologie}}
- @String {Dura-Europos = {The Excavations at Dura-Europos Conducted by Yale University and the French Academy of Inscriptions and Letters}}
- @String {EAA = {Enciclopedia dell'arte antica classica e orientale}}
- @String {EAE = {Excavaciones arqueológicas en España}}
- @String {EastWest = {East and West}}
- @String {EcAntNimes = {École antique de Nîmes. Bulletin annuel}}
- @String {EchosCl = {Echos du monde classique. Classical Views}}
- @String {eDAI-F = {e-Forschungsberichte des Deutschen Archäologischen Instituts}}
- @String {eDAI-J = {e-Jahresberichte des Deutschen Archäologischen Instituts}}
- @String {EgA = {Egyptian Archaeology. The Bulletin of the Egypt Exploration Society}}
- @String {Egnatia = {Εγνατία. Επιστημονική Επετηρίδα της Φιλοσοφικής Σχολής, Αριστοτέλειο Πανεπιστήμιο Θεσσαλονίκης, Τμήμα Ιστορίας και Αρχαιολογίας}}
- @String {EgVicOr = {Egitto e Vicino Oriente}}
- @String {Eikasmos = {Εικασμός. Quaderni bolognesi di filologia classica}}
- @String {Eirene = {Eirene. Studia Graeca et Latina}}
- @String {Elenchos = {Elenchos. Rivista di studi sul pensiero antico}}
- @String {Ellenika = {Ελληνικά. Φιλολογικόν, Ιστορικόν και Λαογραφικόν Περιοδικόν Σύγγραμμα}}
- @String {Emerita = {Emerita. Revista de linguistica y filología clasica}}
- @String {EmPrerom = {Emilia preromana}}
- @String {Empuries = {Empúries. Revista de prehistòria, arqueologia i etnologia}}%*Abweichung!
- @String {Enalia = {Ενάλια}}
- @String {EnaliaAnn = {Enalia. Annual. English Edition of the Hellenic Institute of Marine Archaeology}}
- @String {Enchoria = {Enchoria. Zeitschrift für Demotistik und Koptologie}}
- @String {Eos = {Eos. Commentarii Societatis philologae Polonorum}}
- @String {EpetBoiotMel = {Επετηρίς της Εταιρείας Βοιωτικών Μελετών}}
- @String {EpetByzSpud = {Επετηρίς της Εταιρείας Βυζαντινών Σπουδών}}
- @String {EpetKyklMel = {Επετηρίς της Εταιρείας Κυκλαδικών Μελετών}}
- @String {EphemDac = {Ephemeris Dacoromana. Annuario della Scuola Romena di Roma}}
- @String {EphemNapoc = {Ephemeris Napocensis}}
- @String {EpigrAnat = {Epigraphica Anatolica. Zeitschrift für Epigraphik und historische Geographie Anatoliens}}
- @String {EpistEpetAth = {Επιστημονική Επετηρίς της Φιλοσοφικής Σχολής του Πανεπιστημίου Αθηνών}}
- @String {EpistEpetPolytThess = {Επιστημονική Επετηρίδα της Πολυτεχνικής Σχολής, Αριστοτέλειο Πανεπιστήμιο Θεσσαλονίκης, Τμήμα Αρχιτεκτόνων}}
- @String {EpistEpetThess = {Επιστημονική Επετηρίδα της Φιλοσοφικής Σχολής του Πανεπιστημίου Θεσσαλονίκης}}
- @String {EPRO = {Études préliminaires aux religions orientales dans l'empire romain}}
- @String {Eranos = {Eranos. Acta philologica Suecana}}
- @String {EranosJb = {Eranos-Jahrbuch}}
- @String {Eretria = {Eretria. Fouilles et recherches}}
- @String {Eretz-Israel = {Eretz-Israel. Archaeological, Historical and Geographical Studies}}
- @String {Ergon = {Το Έργον της Αρχαιολογικής Εταιρείας}}
- @String {ESA = {Eurasia septentrionalis antiqua}}
- @String {EspacioHist = {Espacio, tiempo y forma. Revista de la Facultad de geografia e historia. Serie 2, Historia antigua}}
- @String {EstMadr = {Estudios de prehistoria y arqueología madrileñas}}
- @String {EstZaragoza = {Estudios del Seminario de prehistoria, arqueología e historia antigua de la Facultad de filosofía y letras de Zaragoza}}
- @String {EtACl = {Études d'archéologie classique}}
- @String {EtCl = {Les études classiques. Revue trimestrielle de recherche et d'enseignement}}
- @String {EtClAix = {Études classiques. Faculté des lettres et sciences humaines d'Aix}}
- @String {EtCret = {Études crétoises}}
- @String {Ethnos = {Ethnos. Revista do Instituto português de arqueología, história e etnografia}}
- @String {EtP = {Études de papyrologie}}
- @String {EtPezenas = {Études sur Pézenas et l'Hérault}}%*Abweichung!
- @String {EtrSt = {Etruscan Studies. Journal of the Etruscan Foundation}}
- @String {Etruscans = {Etruscans. Bulletin of the Etruscan Foundation}}
- @String {EtTrav = {Études et travaux. Studia i prace. Travaux du Centre d'archéologie méditerranéenne de l'Académie des sciences polonaise}}
- @String {Eulimene = {Ευλιμένη (Μεσογειακή Αρχαιολογική Εταιρεία)}}
- @String {Eunomia = {Eunomia. Ephemeridis Listy filologické supplementum}}
- @String {Euphrosyne = {Euphrosyne. Revista de filologia clássica}}
- @String {EurAnt = {Eurasia antiqua}}
- @String {EurRHist = {European Review of History. Revue européenne d'histoire}}
- @String {Eutopia = {Eutopia. Commentarii novi de antiquitatibus totius Europae}}
- @String {EVP = {J. D. Beazley, Etruscan Vase Painting (Oxford 1947)}}
- @String {ExcIsr = {Excavations and Surveys in Israel}}
- @String {Expedition = {Expedition. The Magazine of Archaeology, Anthropology}}
- @String {ExtremA = {Extremadura arqueológica}}
- @String {FA = {Fasti archaeologici}}
- @String {FAAK = {Forschungen zur Archäologie Außereuropäischer Kulturen}}
- @String {Faenza = {Faenza. Bollettino del Museo internazionale delle ceramiche in Faenza. Rivista bimestrale di studi storici e di tecnica dell'arte ceramica}}
- @String {FAVA = {Forschungen zur Allgemeinen und Vergleichenden Archäologie}}
- @String {Faventia = {Faventia. Departement de clássiques, Facultat de letres, Universitat autónoma de Barcelona}}
- @String {FBerBadWuert = {Forschungen und Berichte zur Vor- und Frühgeschichte in Baden-"-Württemberg}}%*Abweichung!
- @String {FdC = {Fouilles de Conimbriga. Publiées sous la direction de J. Alarcão et R. Etienne}}
- @String {FdD = {Fouilles de Delphes}}
- @String {FdX = {Fouilles de Xanthos}}
- @String {FeddersenWierde = {Feddersen Wierde. Die Ergebnisse der Ausgrabung der vorgeschichtlichen Wurt Feddersen Wierde bei Bremerhaven in den Jahren 1955 bis 1963}}%*Abweichung!
- @String {FelRav = {Felix Ravenna}}
- @String {FGrHist = {F. Jacoby, Die Fragmente der griechischen Historiker}}
- @String {FHG = {Fragmenta historicorum Graecorum}}
- @String {FiA = {Forschungen in Augst}}
- @String {FichEpigr = {Ficheiro epigráfico. Suplemento de »Conimbriga«}}
- @String {FiE = {Forschungen in Ephesos}}
- @String {FIFAO = {Fouilles de l'Institut français d'archéologie orientale du Caire}}
- @String {Figlina = {Figlina. Documents du Laboratoire de céramologie de Lyon}}
- @String {Florentia = {Florentia. Studi di archeologia}}
- @String {FlorIl = {Florentia Iliberritana. Revista de estudios de antigüedad clásica}}
- @String {FMRD = {Die Fundmünzen der römischen Zeit in Deutschland}}
- @String {FMROe = {Fundmünzen der römischen Zeit in Österreich}}%*Abweichung!
- @String {FoggArtMusAcqu = {Fogg Art Museum. Acquisitions}}
- @String {FolA = {Folia archaeologica}}
- @String {FolOr = {Folia orientalia}}
- @String {Fonaments = {Fonaments. Prehistòria i mon antic als Paisos Catalans}}
- @String {Fondamenti = {Fondamenti. Rivista quadrimestrale di cultura}}
- @String {FontAPos = {Fontes archaeologici Posnanienses}}
- @String {Fontes = {Fontes. Rivista di filologia, iconografia e storia della tradizione classica}}
- @String {Forlimpopoli = {Forlimpopoli. Documenti e studi}}
- @String {Fornvaennen = {Fornvännen. Tidskrift för svensk antikvarisk forskning}}%*Abweichung!
- @String {Forum = {Forum. Revue du Groupe d'archéologie antique}}
- @String {FR = {A. Furtwängler – K. Reichhold, Griechische Vasenmalerei (München 1900--1925)}}
- @String {FruehMitAltSt = {Frühmittelalterliche Studien. Jahrbuch des Instituts für Frühmittelalterforschung der Universität Münster}}%*Abweichung!
- @String {FuAusgrTrier = {Funde und Ausgrabungen im Bezirk Trier}}
- @String {FuB = {Forschungen und Berichte. Staatliche Museen zu Berlin}}
- @String {FuBerBadWuert = {Fundberichte aus Baden-Württemberg}}%*Abweichung!
- @String {FuBerHessen = {Fundberichte aus Hessen}}
- @String {FuBerOe = {Fundberichte aus Österreich}}%*Abweichung!
- @String {FuBerSchwab = {Fundberichte aus Schwaben}}
- @String {FuF = {Forschungen und Fortschritte}}
- @String {FuWien = {Fundort Wien. Berichte zur Archäologie}}
- @String {GacNum = {Gaceta numismática}}
- @String {Gades = {Gades. Revista del Colegio universitario de filosofía y letras}}
- @String {Gallaecia = {Gallaecia. Publicación del Departamento de prehistoria y arqueología}}
- @String {Gallia = {Gallia. Fouilles et monuments archéologiques en France metropolitaine}}
- @String {GalliaInf = {Gallia informations. Préhistoire et histoire}}
- @String {GalliaInfAReg = {Gallia informations. L'archéologie des régions}}
- @String {GalliaPrehist = {Gallia préhistoire. Archéologie de la France préhistorique}}
- @String {GaR = {Greece and Rome}}
- @String {GazBA = {Gazette des beaux-arts}}
- @String {Genava = {Genava. Revue d'histoire de l'art et d'archéologie}}
- @String {GeoAnt = {Geographia antiqua. Rivista di geografia storica del mondo antico e di storia della geografia}}
- @String {Germania = {Germania. Anzeiger der Römisch-Germanischen Kommission des Deutschen Archäologischen Instituts}}
- @String {Gesta = {Gesta. International Center of Medieval Art}}
- @String {GettyMusJ = {The J. Paul Getty Museum Journal}}
- @String {GFA = {Göttinger Forum für Altertumswissenschaft}}
- @String {GGA = {Göttingische Gelehrte Anzeigen}}
- @String {GiornFilFerr = {Giornale filologico ferrarese}}
- @String {GiornItFil = {Giornale italiano di filologia}}
- @String {GiornStorLun = {Giornale storico della Lunigiana e del territorio lucense}}
- @String {GiRoccPalermo = {Giglio di roccia}}
- @String {Gladius = {Gladius. Estudios sobre armas antiguas, armamento, arte militar y vida cultural en Oriente y Occidente}}
- @String {GlasAJ = {Glasgow Archaeological Journal}}
- @String {GlasBeograd = {GlasnikSrpskoarheolokodrutvo}}
- @String {GlasSarajevo = {Glasnik Zemaljskog muzeja Bosne i Hercegovie u Sarajevu. Arheologija}}
- @String {Glotta = {Glotta. Zeitschrift für griechische und lateinische Sprache}}
- @String {Gnomon = {Gnomon. Kritische Zeitschrift für die gesamte klassische Altertumswissenschaft}}
- @String {GodDepA = {Godišnik na Departament archeologija}}
- @String {GodMuzPlov = {Godišnik na Archeologičeski muzej Plovdiv. Annuaire du Musée archéologique Plovdiv}}
- @String {GodMuzSof = {Godišnik na Nacionalnija archeologičeski muzej. Annuaire du Musée national archéologique (Sofia)}}
- @String {GodZborSkopje = {Godišen zbornik na Filozofskiot fakultet na Universitetot vo Skopje}}
- @String {GorLet = {Goriški letnik. Zbornik Goriškega muzeja}}
- @String {GoettMisz = {Göttinger Miszellen. Beiträge zur ägyptologischen Diskussion}}%*Abweichung!
- @String {GraRaspr = {Građa i rasprave. Arheološki muzej Istre, Pula}}
- @String {GrazBeitr = {Grazer Beiträge. Zeitschrift für die Klassische Altertumswissenschaft}}
- @String {GrLatOr = {Graecolatina et orientalia. Zborník Filozofickej fakulty Univerzity Komenského}}
- @String {GrLatPrag = {Graecolatina Pragensia. Acta Universitatis Carolinae. Philologica}}
- @String {GrRomByzSt = {Greek, Roman and Byzantine Studies}}
- @String {Gymnasium = {Gymnasium. Zeitschrift für Kultur der Antike und humanistische Bildung}}
- @String {Habis = {Habis. Universidad de Sevilla. Arqueología, filología clásica}}
- @String {HallWPr = {Hallisches Winckelmannsprogramm}}
- @String {Hama = {Hama. Fouilles et recherches de la Fondation Carlsberg}}
- @String {HambBeitrA = {Hamburger Beiträge zur Archäologie}}
- @String {HambBeitrNum = {Hamburger Beiträge zur Numismatik}}
- @String {Handlingar = {Kungliga vitterhets historie och antikvitets akademiens handlingar. Antikvariska serien}}
- @String {HarvStClPhil = {Harvard Studies in Classical Philology}}
- @String {HarvTheolR = {The Harvard Theological Review}}
- @String {HASB = {Hefte des Archäologischen Seminars der Universität Bern}}
- @String {HAW = {Handbuch der Altertumswissenschaften}}
- @String {HdArch = {Handbuch der Archäologie}}
- @String {Head = {B. V. Head, Historia Numorum. A Manual of Greek Numismatics (Oxford 1887; 1911)}}
- @String {Helbig = {W. Helbig, Führer durch die öffentlichen Sammlungen klassischer Altertümer in Rom}}
- @String {Helike = {Helike. Universidad nacional de educación a distancia, Centro regional de Elche}}
- @String {Helikon = {Helikon. Rivista di tradizione e cultura classica}}
- @String {Helinium = {Helinium. Revue consacrée à l'archéologie des Pays-Bas, de la Belgique et du Grand-Duché de Luxembourg}}
- @String {Helios = {Helios. A Journal Devoted to Critical and Methodological Studies of Classical Culture, Literature and Society}}
- @String {HellenikaJb = {Hellenika. Jahrbuch für die Freunde Griechenlands}}
- @String {HelvA = {Helvetia archaeologica}}
- @String {Hephaistos = {Hephaistos. Kritische Zeitschrift zur Theorie und Praxis der Archäologie und angrenzender Wissenschaften}}
- @String {Hermes = {Hermes. Zeitschrift für klassische Philologie}}
- @String {Herrscherbild = {Das römische Herrscherbild}}
- @String {Hesperia = {Hesperia. Journal of the American School of Classical Studies at Athens}}
- @String {Hispania = {Hispania. Revista española de historia}}
- @String {HispAnt = {Hispania antiqua. Revista de historia antigua}}
- @String {HispAntEpigr = {Hispania antiqua epigraphica}}
- @String {HispEpigr = {Hispania epigraphica}}
- @String {HistAnthr = {Historische Anthropologie. Kultur, Gesellschaft, Alltag}}
- @String {HistArt = {Histoire de l'art. Bulletin d'information de l'Institut National d'Histoire de l'Art}}
- @String {Historia = {Historia. Zeitschrift für Alte Geschichte}}
- @String {Historica = {Historica. Academia RSR. Centrul de istorie, filologie şi etnografie din Craiova}}
- @String {Histria = {Histria. Les résultats des fouilles}}
- @String {HistriaA = {Histria archaeologica}}
- @String {HistriaAnt = {Histria antiqua. Casopis Meunarodnog Istraivakog Centra za Arheologiju. Journal of the International Research Centre for Archeology}}
- @String {HistSprF = {Historische Sprachforschung}}
- @String {HKL = {R. Borger, Handbuch der Keilschriftliteratur (Berlin 1967--1975)}}
- @String {Horos = {Ηόρος. Ἔνα Ἀρχαιογνωστικò Περιοδικό}}
- @String {HSS = {Harvard Semitic Series}}
- @String {HuelvaA = {Huelva arqueológica}}
- @String {HumBild = {Humanistische Bildung}}
- @String {Hyp = {Hyperboreus. Studia classica}}
- @String {HZ = {Historische Zeitschrift}}
- @String {IA = {Iberia archaeologica}}
- @String {Iberia = {Iberia. Revista della antigüedad}}
- @String {IEJ = {Israel Exploration Journal}}
- @String {IG = {Inscriptiones Graecae}}
- @String {IGCH = {M. Thompson – C. M. Kraay – O. Mørkholm, An Inventory of Greek Coin Hoards (New York 1973)}}
- @String {IGR = {Inscriptiones Graecae ad res Romanas pertinentes}}
- @String {IK = {Inschriften griechischer Städte aus Kleinasien}}
- @String {Ilerda = {Ilerda. Instituto de estudios ilerdenses}}
- @String {Iliria = {Iliria. Revistë arkeologjike}}
- @String {IllinClSt = {Illinois Classical Studies}}
- @String {ILN = {The Illustrated London News}}
- @String {ILS = {H. Dessau, Inscriptiones Latinae selectae (Berlin 1892--1916)}}
- @String {IndexQuad = {Index. Quaderni camerti di studi romanistici}}
- @String {IndogermF = {Indogermanische Forschungen}}
- @String {IndUnArtB = {Indiana University Art Museum Bulletin}}
- @String {InsFulc = {Insula Fulcheria}}
- @String {InstNautAQ = {The Institute of Nautical Archaeology Quarterly}}
- @String {IntJClTrad = {International Journal of the Classical Tradition}}
- @String {IntJNautA = {International Journal of Nautical Archaeology}}
- @String {IntZSchauBibelWiss = {Internationale Zeitschriftenschau für Bibelwissenschaft und Grenzgebiete}}
- @String {InvLuc = {Invigilata lucernis}}
- @String {Ipek = {Jahrbuch für prähistorische und ethnographische Kunst}}
- @String {Iran = {Iran. Journal of the British Institute of Persian Studies}}
- @String {IrAnt = {Iranica antiqua}}
- @String {IsrMusJ = {The Israel Museum Journal}}
- @String {IsrMusN = {The Israel Museum News}}
- @String {IsrMusStA = {Israel Museum Studies in Archaeology. An Annual Publication by the Samuel Bronfman Biblical and Archaeological Museum of the Israel Museum, Jerusalem}}
- @String {IsrNumJ = {Israel Numismatic Journal}}
- @String {IstanbAMuezYil = {Istanbul Arkeoloji Müzeleri yıllığı}}%*Abweichung!
- @String {IstForsch = {Istanbuler Forschungen}}
- @String {Isthmia = {Isthmia. Excavations by the University of Chicago under the Auspices of the American School of Classical Studies at Athens}}
- @String {IstMitt = {Istanbuler Mitteilungen}}
- @String {Italica = {Italica. Cuadernos de trabajos de la Escuela española de historia y arqueología en Roma}}
- @String {ItNostr = {Italia nostra}}
- @String {IzvBurgas = {Izvestija na Narodnija muzej Burgas. Bulletin du Musée national de Bourgas}}
- @String {IzvMuzJuzBalg = {Izvestija na muzeite ot Južna Bălgarija. Bulletin des musées de la Bulgarie du Sud}}%*Abweichung
- @String {IzvVarna = {Izvestija na Narodnija muzej Varna}}
- @String {Jabega = {Jábega. Revista de la Disputación provincial de Málaga}}%*Abweichung!
- @String {JadrZbor = {Jadranski zbornik. Prilozi za povijest Istre, Rijeke i Hrvatskog primorja}}
- @String {JAOS = {Journal of the American Oriental Society}}
- @String {JARCE = {Journal of the American Research Center in Egypt}}
- @String {JASc = {Journal of Archaeological Science}}
- @String {JbAC = {Jahrbuch für Antike und Christentum}}
- @String {JbAkMainz = {Jahrbuch. Akademie der Wissenschaften und der Literatur, Mainz}}
- @String {JbBadWuert = {Jahrbuch der Staatlichen Kunstsammlungen in Baden-Württemberg}}%*Abweichung!
- @String {JbBerlMus = {Jahrbuch der Berliner Museen}}
- @String {JbBernHistMus = {Jahrbuch des Bernischen Historischen Museums in Bern}}
- @String {JberAugst = {Jahresberichte aus Augst und Kaiseraugst}}
- @String {JberBasel = {Jahresbericht der Archäologischen Bodenforschung des Kantons Basel-Stadt}}
- @String {JberBayDenkmPfl = {Jahresbericht der Bayerischen Bodendenkmalpflege}}
- @String {JberProVindon = {Jahresbericht. Gesellschaft Pro Vindonissa}}
- @String {JberVgFrankf = {Jahresbericht des Instituts für Vorgeschichte der Universität Frankfurt a. M.}}
- @String {JberZuerich = {Jahresbericht. Schweizerisches Landesmuseum Zürich}}%*Abweichung!
- @String {JbGoett = {Jahrbuch der Akademie der Wissenschaften in Göttingen}}%*Abweichung!
- @String {JbHambKuSamml = {Jahrbuch der Hamburger Kunstsammlungen}}
- @String {JbKHMWien = {Jahrbuch des Kunsthistorischen Museums Wien}}
- @String {JbKHSWien = {Jahrbuch der Kunsthistorischen Sammlungen in Wien}}
- @String {JbKleinasF = {Jahrbuch für kleinasiatische Forschung}}
- @String {JbMuench = {Bayerische Akademie der Wissenschaften. Jahrbuch}}%*Abweichung!
- @String {JbMusKGHamb = {Jahrbuch des Museums für Kunst und Gewerbe, Hamburg}}
- @String {JbMusLinz = {Jahrbuch des Oberösterreichischen Musealvereins}}
- @String {JbOeByz = {Jahrbuch der Österreichischen Byzantinistik}}%*Abweichung!
- @String {JbPreussKul = {Jahrbuch Preussischer Kulturbesitz}}
- @String {JbRGZM = {Jahrbuch des Römisch-Germanischen Zentralmuseums Mainz}}
- @String {JbSchwUrgesch = {Jahrbuch der Schweizerischen Gesellschaft für Ur- und Frühgeschichte}}
- @String {JCS = {Journal of Cuneiform Studies}}
- @String {JdI = {Jahrbuch des Deutschen Archäologischen Instituts}}
- @String {JEA = {The Journal of Egyptian Archaeology}}
- @String {JEChrSt = {Journal of Early Christian Studies. Journal of the North American Patristics Society}}
- @String {JEOL = {Jaarbericht van het Vooraziatisch-Egyptisch Genootschap Ex Oriente Lux}}
- @String {JewelSt = {Jewellery Studies}}
- @String {JFieldA = {Journal of Field Archaeology}}
- @String {JGS = {Journal of Glass Studies}}
- @String {JHS = {The Journal of Hellenic Studies}}
- @String {JIbA = {Journal of Iberian Archaeology}}
- @String {JJurP = {The Journal of Juristic Papyrology}}
- @String {JKuGesch = {Journal für Kunstgeschichte}}
- @String {JMedA = {Journal of Mediterranean Archaeology}}
- @String {JMedAnthrA = {Journal of Mediterranean Anthropology and Archaeology}}
- @String {JMithrSt = {Journal of Mithraic Studies}}
- @String {JNES = {Journal of Near Eastern Studies}}
- @String {JNG = {Jahrbuch für Numismatik und Geldgeschichte}}
- @String {JPrehistRel = {Journal of Prehistoric Religion}}
- @String {JRA = {Journal of Roman Archaeology}}
- @String {JRomMilSt = {Journal of Roman Military Equipment Studies}}
- @String {JRomPotSt = {Journal of Roman Pottery Studies}}
- @String {JRS = {Journal of Roman Studies}}
- @String {JSav = {Journal des savants}}
- @String {JSchrVgHalle = {Jahresschrift für mitteldeutsche Vorgeschichte}}
- @String {JSS = {Journal of Semitic Studies}}
- @String {JTheorA = {Journal of Theoretical Archaeology}}
- @String {Jura = {Iura. Rivista internazionale di diritto romano e antico}}
- @String {JWaltersArtGal = {The Journal of the Walters Art Gallery}}
- @String {JWCI = {Journal of the Warburg and Courtauld Institutes}}
- @String {Kadmos = {Kadmos. Zeitschrift für vor- und frühgriechische Epigraphik}}
- @String {Kairos = {Kairos. Zeitschrift für Judaistik und Religionswissenschaft}}
- @String {Kalapodi = {Kalapodi. Ergebnisse der Ausgrabungen im Heiligtum der Artemis und des Apollon von Hyampolis in der antiken Phokis}}
- @String {Kalathos = {Kalathos. Revista del Seminario de arqueología y etnología Turolense, Universidad de Teruel}}
- @String {Kalos = {Kalós. Arte in Sicilia}}%*Abweichung!
- @String {Karthago = {Karthago. Revue d'archéologie mediterranéenne}}
- @String {Kemi = {Kêmi. Revue de philologie et d'archéologie égytiennes et coptes}}%*Abweichung!
- @String {Kenchreai = {Kenchreai. Eastern Port of Corinth. Results of Investigations by the University of Chicago and Indiana University for the American School of Classical Studies at Athens}}
- @String {KentAR = {Kent Archaeological Review}}
- @String {Keos = {Keos. Results of Excavations Conducted by the University of Cincinnati under the Auspices of the American School of Classical Studies at Athens}}
- @String {Kerameikos = {Kerameikos. Ergebnisse der Ausgrabungen}}
- @String {Kernos = {Kernos. Revue internationale et pluridisciplinaire de religion grecque antique}}
- @String {Klearchos = {Klearchos. Bollettino dell'Associazione Amici del Museo nazionale di Reggio Calabria}}
- @String {Kleos = {Kleos. Estemporaneo di studi e testi sulla fortuna dell'antico}}
- @String {Klio = {Klio. Beiträge zur alten Geschichte}}
- @String {Kodai = {Kodai. Journal of Ancient History}}
- @String {KoelnJb = {Kölner Jahrbuch}}%*Abweichung!
- @String {KoelnMusB = {Kölner Museums-Bulletin. Berichte und Forschungen aus den Museen der Stadt Köln}}%*Abweichung!
- @String {Kokalos = {Kώκαλος. Studi pubblicati dall’Istituto di storia antica dell’Università di Palermo}}%*Abweichung!
- @String {KollAVA = {Kolloquien zur Allgemeinen und Vergleichenden Archäologie}}
- @String {Kratylos = {Kratylos. Kritisches Berichts- und Rezensionsorgan für indogermanische und allgemeine Sprachwissenschaft}}
- @String {KretChron = {Κρητικά Χρονικά}}
- @String {KSIA = {Kratkie soobščenija o dokladach i polevych issledovanijach Instituta archeologii}}
- @String {KSIAKiev = {Kratkie soobščenija Instituta archeologii, Kiev}}
- @String {KST = {Kazı Sonuçları Toplantısı}}
- @String {Ktema = {Ktema. Civilisations de l'Orient, de la Grèce et de Rome antiques}}
- @String {KuGeschAnz = {Kunstgeschichtliche Anzeigen}}
- @String {Kuml = {Kuml. Årbog for Jysk Arkaeologisk Selskab}}
- @String {Kunstchronik = {Kunstchronik. Monatsschrift für Kunstwissenschaft, Museumswesen und Denkmalpflege, Mitteilungsblatt des Verbandes Deutscher Kunsthistoriker}}
- @String {KuOr = {Kunst des Orients}}
- @String {Kush = {Kush. Journal of the National Corporation for Antiquities and Museums (NCAM)}}
- @String {KuWeltBerlMus = {Kunst der Welt in den Berliner Museen}}
- @String {KypA = {Κυπριακή Αρχαιολογία. Archaeologia Cypria}}
- @String {KypSpud = {Κυπριακαì Σπουδαί}}
- @String {Labeo = {Labeo. Rassegna di ritritto romano}}
- @String {LAe = {Lexikon der Ägyptologie}}%*Abweichung!
- @String {Laietania = {Laietania. Estudios d'arqueologia del Maresme}}
- @String {Lampas = {Lampas. Tijdschrift voor nederlandse classici}}
- @String {Lancia = {Lancia. Revista de prehistoria, arqueología e historia antigua del noreste peninsular}}
- @String {LandKunVierJBl = {Landeskundliche Vierteljahrsblätter. Trier}}
- @String {LangOrAnc = {Langues orientales anciennes. Philologie et linguistique}}
- @String {Latinitas = {Latinitas. Commentarii linguae Latinae excolendae provehendae}}
- @String {Latomus = {Latomus. Revue d'études latines}}
- @String {Laverna = {Laverna. Beiträge zur Wirtschafts- und Sozialgeschichte der Alten Welt}}
- @String {LCS = {A. D. Trendall, The Red-figured Vases of Lucania, Campania and Sicily (Oxford 1967--­1983)}}
- @String {Levant = {Levant. Journal of the British School of Archaeology in Jerusalem and the British Institute at Amman for Archaeology and History}}
- @String {Lexis = {Lexis. Poetica, retorica e comunicazione nella tradizione classica}}
- @String {LF = {Listy filologické}}
- @String {LibSt = {Libyan Studies}}
- @String {LibyaAnt = {Libya antiqua}}
- @String {LibycaBServAnt = {Libyca. Bulletin du Service des antiquités. Archéologie, épigraphie}}
- @String {LibycaTrav = {Libyca. Travaux du Laboratoire d'anthropologie et d'archéologie préhistorique du Musée du Bardo}}
- @String {Liddell-­Scott-Jones = {G. Liddell – R. Scott – H. S. Jones, A Greek-English Lexikon \textsuperscript{9}(1996); Suppl. (1996)}}%*Abweichung!
- @String {LIMC = {Lexikon iconographicum mythologiae classicae}}
- @String {Limesforschungen = {Limesforschungen. Studien zur Organisation der römischen Reichsgrenze an Rhein und Donau}}
- @String {Lindos = {Lindos. Fouilles et recherches}}
- @String {LingIt = {Linguistica, epigrafia, filologia italica}}
- @String {LTUR = {Lexikon topographicum urbis Romae}}
- @String {Lucentum = {Lucentum. Anales de la Universidad de Alicante. Prehistoria, arqueología e historia antigua}}
- @String {LundAR = {Lund Archaeological Review}}
- @String {Lustrum = {Lustrum. Internationale Forschungsberichte aus dem Bereich des klassischen Altertums}}
- @String {Lykia = {Lykia. Anadolu-akdeniz kültürleri}}
- @String {MacActaA = {Macedoniae acta archaeologica}}
- @String {Maecenas = {Maecenas. Studi sul mondo classico}}
- @String {MAGesGraz = {Mitteilungen der Archäologischen Gesellschaft Graz}}
- @String {MAGesStei = {Mitteilungen der Archäologischen Gesellschaft Steiermark}}
- @String {Maia = {Maia. Rivista di letterature classiche}}
- @String {Mainake = {Mainake. Estudios de arqueología Malagueña}}
- @String {MAInstUngAk = {Mitteilungen des Archäologischen Instituts der Ungarischen Akademie der Wissenschaften}}
- @String {MainzZ = {Mainzer Zeitschrift}}
- @String {MakedNasl = {Makedonsko nasledstvo. Spisanie za arheologija, istorija, istorija na umetnosta i etnologija}}
- @String {Makedonika = {Μακεδονικά. Σύγγραμμα Περιοδικόν της Εταιρείας Μακεδονικών Σπουδών}}
- @String {MAMA = {Monumenta Asiae Minoris antiqua. Publications of the American Society for Archaeological Research in Asia Minor}}
- @String {MAnthrWien = {Mitteilungen der Anthropologischen Gesellschaft in Wien}}
- @String {MARo = {Monumenta artis Romanae}}
- @String {MarbWPr = {Marburger Winckelmann-Programm}}
- @String {Marche = {Le Marche. Archeologia, storia, territorio}}
- @String {Mari = {Mari. Annales de recherches interdisciplinaires}}
- @String {Marisia = {Marisia. Studii şi materiale. Arheologie, istorie, etnografie}}
- @String {MarNero = {Il Mar Nero. Annali di archeologia e storia}}
- @String {Marsyas = {Marsyas. Studies in the History of Art}}
- @String {MascaJ = {Masca Journal. Museum Applied Science Center for Archaeology, University of Pennsylvania}}
- @String {MascaP = {Masca Research Papers in Science and Archaeology}}
- @String {Mastia = {Mastia. Revista del Museo arqueológico municipal de Cartagena}}
- @String {MatABSSR = {Materialy po archeologii BSSR}}
- @String {MatASevPri = {Materialy po archeologii severnogo Pričernomor’ja}}
- @String {MatCercA = {Materiale şi cercetări arheologice}}
- @String {MatIsslA = {Materialy i issledovanija po archeologii SSSR}}
- @String {MatStar = {Materiały starożytne}}
- @String {MatStarWczes = {Materiały starożytne i wczesnośredniowieczne}}
- @String {MatTestiCl = {Materiali e discussioni per l'analisi dei testi classici}}
- @String {MatWczes = {Materiały wczesnośredniowieczne}}
- @String {MAVA = {Materialien zur Allgemeinen und Vergleichenden Archäologie}}
- @String {MB = {Madrider Beiträge}}
- @String {MBAH = {Marburger Beiträge zur antiken Handels-, Wirtschafts- und Sozialgeschichte, vor Jahrgang 2009 Münstersche Beiträge zur antiken Handelsgeschichte}}
- @String {MBlVFruehGesch = {Mitteilungsblatt für Vor- und Frühgeschichte}}%*Abweichung!
- @String {MDAIK = {Mitteilungen des Deutschen Archäologischen Instituts, Abteilung Kairo}}
- @String {MDAVerb = {Mitteilungen des Deutschen Archäologen-Verbandes e.V.}}
- @String {MdI = {Mitteilungen des Deutschen Archäologischen Instituts}}
- @String {MDOG = {Mitteilungen der Deutschen Orient-Gesellschaft zu Berlin}}
- @String {Meander = {Meander. Miesięcznik poświęcony kulturze świata starożytnego}}
- @String {MedA = {Mediterranean Archaeology}}
- @String {MedAnt = {Mediterraneo antico. Economie, società, culture}}
- @String {MeddelGlypt = {Meddelelser fra Ny Carlsberg Glyptotek}}
- @String {MeddelLund = {Meddelanden från Lunds universtitets historiska museum}}
- @String {MeddelThor = {Meddelelser fra Thorvaldsens Museum}}
- @String {MededRom = {Mededelingen van het Nederlands instituut te Rome}}
- @String {MedelhavsMusB = {Medelhavsmuseet. Bulletin}}
- @String {MedHistR = {Mediterranean Historical Review}}
- @String {MedievA = {Medieval Archaeology. Journal of the Society for Medieval Archaeology}}
- @String {MediSec = {Medicina nei secoli. Arte e scienza}}
- @String {MEFRA = {Mélanges de l'École française de Rome. Antiquité}}
- @String {MelBeyrouth = {Mélanges de l'Université Saint-Joseph}}
- @String {MelCasaVelazquez = {Mélanges de la Casa de Velázquez. Antiquité et moyen âge}}
- @String {MemAcInscr = {Mémoires de l'Académie des inscriptions et belles-lettres}}
- @String {MemAmAc = {Memoirs of the American Academy in Rome}}
- @String {MemAnt = {Memoria antiquitatis. Acta Musei Petrodavensis. Revista Muzeului arheologic Piatra Neamţ}}
- @String {MemAntFr = {Mémoires de la Société nationale des antiquaires de France}}
- @String {MemBarcelA = {Memoria. Universidad de Barcelona, Instituto de arqueología y prehistoria}}
- @String {MemBologna = {Atti de la Accademia delle scienze dell'Istituto di Bologna. Memorie}}
- @String {MemHistAnt = {Memorias de historia antigua (Universidad de Oviedo)}}
- @String {MemInstNatFr = {Mémoires de l'Institut national de France}}
- @String {MemLinc = {Atti dell'Accademia nazionale dei Lincei, Classe di scienze morali, storiche e filologiche. Memorie}}
- @String {MemNap = {Memorie dell'Accademia di archeologia, lettere e belle arti di Napoli}}
- @String {MemPontAc = {Atti della Pontificia accademia romana di archeologia. Memorie}}
- @String {MemStor = {Memoria storica. Rivista del Centro studi storici terni}}
- @String {MemStorFriuli = {Memorie storiche forogiuliesi}}
- @String {Merida = {Mérida. Ciudad y patrimonio}}%*Abweichung!
- @String {MeridaMem = {Mérida. Excavaciones arqueológicas. Memoria}}%*Abweichung!
- @String {Meroitica = {Meroitica. Schriften zur altsudanesischen Geschichte und Archäologie}}
- @String {Mesopotamia = {Mesopotamia. Rivista di archeologia}}
- @String {Messana = {Messana. Rassegna di studi filologici, linguistici e storici}}
- @String {Metis = {Métis. Revue d'anthropologie du monde grec ancien}}%*Abweichung!
- @String {MetrMusJ = {Metropolitan Museum Journal}}
- @String {MetrMusSt = {Metropolitan Museum Studies}}
- @String {MF = {Madrider Forschungen}}
- @String {MFruehChrOe = {Mitteilungen zur frühchristlichen Archäologie in Österreich}}%*Abweichung!
- @String {Milet = {Milet. Ergebnisse der Ausgrabungen und Untersuchungen seit dem Jahr 1899}}
- @String {MilForsch = {Milesische Forschungen}}
- @String {MinEpigrP = {Minima epigraphica et papyrologica. Taccuini della cattedra e del laboratorio di epigrafia e papirologia giuridica dell'Università degli studi di Catanzaro »Magna Graecia«}}
- @String {Minerva = {Minerva. Revista de filología clásica}}
- @String {Minos = {Minos. Revista de filología egea}}
- @String {MInstWasser = {Mitteilungen. Leichtweiss-Institut für Wasserbau der Technischen Universität Braunschweig}}
- @String {MIO = {Mitteilungen des Instituts für Orientforschung}}
- @String {MiscCrAnt = {Miscellanea di studi di letteratura christiana antica}}
- @String {MiscStStor = {Miscellanea di studi storici}}
- @String {MitChrA = {Mitteilungen zur christlichen Archäologie}}
- @String {MKT = {Menschen – Kulturen – Traditionen. Studien aus den Forschungsclustern des Deutschen Archäologischen Instituts}}
- @String {MKuHistFlorenz = {Mitteilungen des Kunsthistorischen Institutes in Florenz}}
- @String {MKul = {Mitteilungen zur Kulturkunde}}
- @String {MM = {Madrider Mitteilungen}}
- @String {Mnemosyne = {Mnemosyne. A Journal of Classical Studies}}
- @String {MOeNumGes = {Mitteilungen der Österreichischen Numismatischen Gesellschaft}}%*Abweichung!
- @String {MonAnt = {Monumenti antichi}}
- @String {MonInst = {Monumenti inediti pubblicati dall'Istituto Archeologico}}
- @String {MonPiot = {Monuments et mémoires. Fondation E. Piot}}
- @String {MonPitt = {Monumenti della pittura antica scoperti in Italia}}
- @String {Mozia = {Mozia. Rapporto preliminare della missione congiunta con la Soprintendenza alle antichità della Sicilia occidentale}}
- @String {MPraehistKomWien = {Mitteilungen der Prähistorischen Kommission der Österreichischen Akademie der Wissenschaften}}%*Abweichung!
- @String {MSAtene = {Monografie della Scuola archeologica di Atene e delle missioni italiane in Oriente}}
- @String {MSchliemann = {Mitteilungen aus dem Heinrich-Schliemann-Museum Ankershagen}}
- @String {MSchwUrFruehGesch = {Mitteilungsblatt der Schweizerischen Gesellschaft für Ur- und Frühgeschichte}}%*Abweichung!
- @String {MSpaetAByz = {Mitteilungen zur spätantiken Archäologie und byzantinischen Kunstgeschichte}}%*Abweichung!
- @String {MueJb = {Münchner Jahrbuch der bildenden Kunst}}%*Abweichung!
- @String {MuenchBeitrVFG = {Münchner Beiträge zur Vor- und Frühgeschichte}}%*Abweichung!
- @String {MuenchStSprWiss = {Münchener Studien zur Sprachwissenschaft}}%*Abweichung!
- @String {MuM = {Münzen und Medaillen}}
- @String {MusAfr = {Museum Africum. West African Journal of Classical and Related Studies}}
- @String {MusBenaki = {Μουσείο Μπενάκη}}
- @String {MusCrit = {Museum criticum}}
- @String {Muse = {Muse. Annual of the Museum of Art and Archaeology, University of Missouri, Columbia}}
- @String {Museon = {Le Muséon. Revue d'études orientales}}%*Abweichung!
- @String {MuseumUnesco = {Museum. A Quarterly Review Published by UNESCO}}
- @String {MusFerr = {Musei Ferraresi. Bollettino annuale}}
- @String {MusGalIt = {Musei e gallerie d'Italia}}
- @String {MusHaaretz = {Museum Haaretz, Tel Aviv. Yearbook}}
- @String {MusHelv = {Museum Helveticum}}
- @String {MusKoeln = {Museen in Köln. Bulletin}}%*Abweichung!
- @String {MusNotAmNumSoc = {Museum Notes. The American Numismatic Society}}
- @String {MusPontevedra = {El Museo de Pontevedra}}
- @String {MusRiv = {Museo in rivista. Notiziario dei Musei civici di Pavia}}
- @String {MusTusc = {Museum Tusculanum. København}}
- @String {MuzEvkSzeged = {A Móra Ferenc múzeum évkönyve}}
- @String {MuzNa = {MuzeulnaionalBucureti}}
- @String {MuzPamKul = {Muzei i pametnici na kulturata}}
- @String {NachrArbUWA = {Nachrichtenblatt Arbeitskreis Unterwasserarchäologie}}
- @String {NapNobil = {Napoli nobilissima}}
- @String {NassAnn = {Nassauische Annalen}}
- @String {NAWG = {Nachrichten der Akademie der Wissenschaften in Göttingen. Philologisch-Historische Klasse}}
- @String {NBWorcArtMus = {News Bulletin and Calendar. Worcester Art Museum}}
- @String {NEphemSemEpigr = {Neue Ephemeris für semitische Epigraphik}}
- @String {NewsletterAthen = {Newsletter of the Netherlands Institute at Athens}}
- @String {NewsletterPotTech = {Newsletter. Department of Pottery Technology, University of Leiden}}
- @String {NGWG = {Nachrichten von der Gesellschaft der Wissenschaften zu Göttingen. Philologisch-Historische Klasse}}
- @String {NigCl = {Nigeria and the Classics}}
- @String {Nikephoros = {Nikephoros. Zeitschrift für Sport und Kultur im Altertum}}
- @String {Nin = {Nin. Journal of Gender Studies in Antiquity}}
- @String {NNM = {American Numismatic Society. Numismatic Notes and Monographs}}
- @String {NomChron = {Νομισματικά Χρονικά. Περιοδική Έκδωσις της Ελληνικής Νομισματικής Εταιρείας}}
- @String {Norba = {Norba. Revista de arte, geografía e historia}}
- @String {NordNumArs = {Nordisk numismatisk årsskrift. Utgiven av Kungliga vitterhets historie och antikvitets akademien i samarbete med Nordisk numismatisk union}}
- @String {NotABerg = {Notizie archeologiche bergomensi. Periodico di archeologia del Civico museo archeologico di Bergamo}}
- @String {NotAHisp = {Noticiario arqueológico hispánico. Arqueología}}
- @String {NotAHispPrehistoria = {Noticiario arqueológico hispánico. Prehistoria}}
- @String {NotAllumiere = {Notiziario. Museo civico, Associazione archeologica, Allumiere}}
- @String {NotALomb = {Notiziario. Soprintendenza archeologica della Lombardia}}
- @String {NotMilano = {Notizie dal chiostro del monastero maggiore. Rassegna di studi del Civico museo archeologico e del Civico gabinetto numismatico di Milano}}
- @String {NouvClio = {La nouvelle Clio}}
- @String {Novaensia = {Novaensia. Badania Ekspedycji archeologicznej Uniwersytetu warszawskiego w Novae}}
- @String {NSc = {Notizie degli scavi di antichità}}
- @String {NStFan = {Nuovi studi fanesi}}
- @String {NubChr = {Nubia christiana}}
- @String {NubLet = {Nubian Letters}}
- @String {NueBlA = {Nürnberger Blätter zur Archäologie. Publikationsreihe des Bildungszentrums der Stadt Nürnberg, Fachbereich Archäologie}}%*Abweichung!
- @String {NumAntCl = {Numismatica e antichità classiche. Quaderni ticinesi}}
- @String {Numantia = {Numantia. Investigaciones arqueológicas en Castilla y León}}
- @String {NumChron = {The Numismatic Chronicle. The Journal of the Royal Society}}
- @String {Numen = {Numen. International Review for the History of Religions}}
- @String {NumEpigr = {Numizmatika i epigrafika}}
- @String {Numisma = {Numisma. Revista de la Sociedad iberoamericana de estudios numismáticos}}
- @String {NumismaticaRom = {Numismatica. Periodico di cultura e di informazione numismatica}}
- @String {Numizmaticar = {Numizmatičar. Casopis za anticki i stari jugoslavenski novac}}%*Abweichung!
- @String {Nummus = {Nummus. Sociedade portuguesa de numismatica}}
- @String {NumZ = {Numismatische Zeitschrift}}
- @String {NuovDidask = {Nuovo Didaskaleion}}
- @String {OccasPublClSt = {Occasional Publications in Classical Studies}}
- @String {OccOr = {Occident and Orient}}
- @String {OGIS = {W. Dittenberger, Orientis Graeci inscriptiones selectae (Leipzig 1903--­1905)}}
- @String {OeJh = {Jahreshefte des Österreichischen Archäologischen Institutes in Wien}}%*Abweichung!
- @String {OF = {Olympische Forschungen}}
- @String {Offa = {Offa. Berichte und Mitteilungen zur Urgeschiche, Frühgeschichte und Mittelalterarchäologie}}
- @String {Ogam = {Ogam. Bulletin des Amis de la tradition celtique}}
- @String {Oikumene = {Oikumene. Studia ad historiam antiquam classicam et orientalem pertinentia}}
- @String {OIP = {Oriental Institute Publications}}
- @String {Olba = {Olba. Mersin Üniversitesi Kilikia Arkeolojisini Araştırma Merkezi yayınları}}
- @String {OlBer = {Bericht über die Ausgrabungen in Olympia}}
- @String {Olympia = {Olympia. Die Ergebnisse der von dem Deutschen Reich veranstalteten Ausgrabung (Berlin 1890--­1897)}}
- @String {Olynthus = {Excavations at Olynthus}}
- @String {OLZ = {Orientalistische Literaturzeitung}}
- @String {OpArch = {Skrifter utgivna av Svenska institutet i Rom. Opuscula archaeologica}}
- @String {OpAth = {Opuscula Atheniensia}}
- @String {OpFin = {Opuscula Instituti Romani Finlandiae}}
- @String {OpPomp = {Opuscula Pompeiana}}
- @String {OpRom = {Opuscula Romana}}
- @String {Opus = {Opus. Rivista internazionale per la storia economica e sociale dell’antichità}}
- @String {Or = {Orientalia (Pontificio Istituto biblico)}}
- @String {OrA = {Orient-Archäologie}}
- @String {OrAnt = {Oriens antiquus. Rivista del Centro per le antichità e la storia dell’arte del Vicino Oriente}}
- @String {OrbTerr = {Orbis terrarum. Internationale Zeitschrift für historische Geographie der Alten Welt}}
- @String {OrChr = {Oriens christianus}}
- @String {OrChrPer = {Orientalia christiana periodica}}
- @String {Ordona = {Ordona. Rapports et études}}
- @String {Orient = {Orient. The Reports of the Society for Near Eastern Studies in Japan}}
- @String {Origini = {Origini. Preistoria e protostoria delle civiltà antiche}}
- @String {Orizzonti = {Orizzonti. Rassegna di archeologia}}
- @String {Orpheus = {Orpheus. Rivista di umanità classica e cristiana}}
- @String {OrpheusThracSt = {Orpheus. Journal of Indo-European, Palaeo-Balkan and Thracian Studies}}
- @String {OrSu = {Orientalia Suecana. An International Journal of Indological, Iranian, Semitic, Turkic Studies}}
- @String {OsjZbor = {Osjekizbornik}}
- @String {OstbGrenzm = {Ostbairische Grenzmarken. Passauer Jahrbuch für Geschichte, Kunst und Volkskunde}}
- @String {Ostraka = {Ostraka. Rivista di antichità}}
- @String {OudhMeded = {Oudheidkundige mededelingen uit het Rijksmuseum van oudheden te Leiden}}
- @String {OxfJA = {Oxford Journal of Archaeology}}
- @String {OxfStPhilos = {Oxford Studies in Ancient Philosophy}}
- @String {Pact = {Pact. Revue du Groupe européen d’études pour les techniques physiques, chimiques et mathématiques appliquées à l’archéologie}}
- @String {Padusa = {Padusa. Bolletino del Centro polesano di studi storici, archeologici ed etnografici, Rovigo}}
- @String {PagA = {Pagine di archeologia. Studi e materiali}}
- @String {PAI = {Polevye archeologičeskie issledovanija}}
- @String {Paideuma = {Paideuma. Mitteilungen zur Kulturkunde}}
- @String {Palaeohistoria = {Palaeohistoria. Acta et communicationes Instituti bio-archaeologici universitatis Groninganae}}
- @String {Paleohispanica = {Paleohispánica. Revista sobre lenguas y culturas de la Hispania antigua}}%*Abweichung!
- @String {Palladio = {Palladio. Rivista di storia dell’architettura}}
- @String {Pallas = {Pallas. Revue d’études antiques}}
- @String {Palmet = {Palmet. Sadberk Hanım Müzesi yıllığı}}
- @String {PamA = {Památky archeologické}}
- @String {Pan = {Pan. Studi dell’Istituto di filologia latina}}
- @String {PapBilb = {Papeles Bilbilitanos}}
- @String {Papyri = {Papyri. Bollettino del Museo del papiro}}
- @String {Parthica = {Parthica. Incontri di culture nel mondo antico}}
- @String {Partenope = {Partenope. Rivista trimestrale di cultura napoletana}}
- @String {PAS = {Prähistorische Archäologie in Südosteuropa}}
- @String {PBF = {Prähistorische Bronzefunde}}
- @String {Pegasus = {Pegasus. Berliner Beiträge zum Nachleben der Antike}}
- @String {PEQ = {Palestine Exploration Quarterly}}
- @String {Peristil = {Peristil. Zbornik radova za povijest umjetnosti}}
- @String {Persica = {Persica. Jaarboek van het Genootschap Nederland-Iran, Stichting voor culturele betrekkingen}}
- @String {Peuce = {Peuce. Studii şi comunicări de istorie veche, arheologie şi numismatică}}
- @String {PF = {Pergamenische Forschungen}}
- @String {Pharos = {Pharos. Journal of the Netherlands Institute at Athens}}
- @String {Philologus = {Philologus. Zeitschrift für das klassische Altertum}}
- @String {Phoenix = {Phoenix. The Journal of the Classical Association of Canada}}
- @String {PhoenixExOrLux = {Phoenix. Bulletin uitgegeven door het Vooraziatisch-Egyptisch Genootschap »Ex Oriente Lux«}}
- @String {Phoibos = {Phoibos. Bulletin du Cercle de philologie classique et orientale de l’Université libre de Bruxelles}}
- @String {Phronesis = {Phronesis. A Journal for Ancient Philosophy}}
- @String {Picus = {Picus. Studi e ricerche sulle Marche nell’antichità}}
- @String {LPIR = {Prosopographia Imperii Romani}}
- @String {PKG = {Propyläen Kunstgeschichte}}
- @String {Platon = {Πλάτον. Δελτίον της Εταιρείας Ελλήνων Φιλολόγων}}
- @String {PLup = {Papyrologica Lupiensia}}
- @String {PolAMed = {Polish Archaeology in the Mediterranean}}
- @String {Polemon = {Πολέμων. Αρχαιολογικόν Περιοδικόν}}
- @String {Polis = {Polis. Revista de ideas y formas políticas de la antigüedad clásica}}
- @String {PompHercStab = {Pompeii, Herculaneum, Stabiae. Bolletino. Associazione internazionale Amici di Pompei}}
- @String {Pontica = {Pontica. Studii şi materiale de istorie, arheologie şi muzeografie, Constanţa}}
- @String {Portugalia = {Portugália. Revista do Instituto de arqueologia da Faculdade de letras da Universidade do Porto}}
- @String {PP = {La parola del passato}}
- @String {PPM = {Pompei: Pitture e mosaici. Enciclopedia dell’arte antica classica e orientale}}
- @String {PraceA = {Prace archeologiczne}}
- @String {PraceMatLodz = {Prace i materialy Muzeum archeologicznego i etnograficznego w Łodzi}}%*Abweichung!
- @String {Prakt = {Πρακτικά της εν Αθήναις Αρχαιολογικής Εταιρείας}}
- @String {PraktAkAth = {Πρακτικά της Ακαδημίας Αθηνών}}
- @String {PreistAlp = {Preistoria alpina. Museo tridentino di scienze naturali}}
- @String {PriloziZagreb = {Prilozi Instituta za arheologiju u Zagrebu}}
- @String {PrincViana = {Principe di Viana}}
- @String {ProblIsk = {Problemi na izkustvoto. Trimesecno spisanie za estetika, teorija, istorija i kritika na izkustvoto}}
- @String {ProcAfrClAss = {The Proceedings of the African Classical Associations}}
- @String {ProcCambrPhilSoc = {Proceedings of the Cambridge Philological Society}}
- @String {ProcDanInstAth = {Proceedings of the Danish Institute at Athens}}
- @String {ProcPrehistSoc = {Proceedings of the Prehistoric Society}}
- @String {Prometheus = {Prometheus. Rivista quadrimestrale di studi classici}}
- @String {ProspAQuad = {Prospezioni archeologiche. Quaderni}}
- @String {Prospettiva = {Prospettiva. Rivista di storia dell’arte antica e moderna}}
- @String {Prospezioni = {Prospezioni. Bollettino di informazioni scientifiche}}
- @String {ProvHist = {Provence historique}}
- @String {ProvLucca = {La provincia di Lucca}}
- @String {PublInstTTMeneses = {Publicaciones de la Institución »Tello Téllez de Meneses«}}
- @String {Pulpudeva = {Pulpudeva. Semaines philippopolitaines de l’histoire et de la culture thrace}}
- @String {Puteoli = {Puteoli. Studi di storia antica}}
- @String {Pyrenae = {Pyrenae. Crónica arqueológica}}
- @String {PZ = {Prähistorische Zeitschrift}}
- @String {QDAP = {The Quarterly of the Department of Antiquities in Palestine}}
- @String {QuadABarcel = {Quaderns d’arqueologia i història de la ciutat (Barcelona)}}
- @String {QuadACagl = {Quaderni. Soprintendenza archeologica per la provincie di Cagliari e Oristano}}
- @String {QuadACal = {Quaderni del Dipartimento delle arti, Università della Calabria}}
- @String {QuadALibya = {Quaderni di archeologia della Libia}}
- @String {QuadAMant = {Quaderni di archeologia del Mantovano}}
- @String {QuadAMess = {Quaderni di archeologia, Università di Messina}}
- @String {QuadAOst = {Quaderni del Gruppo archeologico ostigliese}}
- @String {QuadAPiem = {Quaderni della Soprintendenza archeologica del Piemonte}}
- @String {QuadAquil = {Quaderni aquileiesi}}
- @String {QuadAReggio = {Quaderni d’archeologia reggiana}}
- @String {QuadAVen = {Quaderni di archeologia del Veneto}}
- @String {QuadCast = {Quaderns de prehistòria i arqueologia de Castelló}}
- @String {QuadCat = {Quaderni catanesi di studi classici e medievali}}
- @String {QuadChieti = {Quaderni dell’Istituto di archeologia e storia antica, Università di Chieti}}
- @String {QuadErb = {Quaderni erbesi. Civico museo archeologico di Erba}}
- @String {QuadFriulA = {Quaderni friulani di archeologia}}
- @String {QuadGerico = {Quaderni di Gerico}}
- @String {QuadIstFilGr = {Quaderni dell’Istituto di filologia greca}}
- @String {QuadIstLat = {Quaderni dell’Istituto di lingua e letteratura latina, Università di Roma}}
- @String {QuadLecce = {Quaderni. Istituto di lingue e letterature classiche, Facoltà di magistero, Università degli studi, Lecce}}
- @String {QuadMusPontecorvo = {Museo civico Pontecorvo. Quaderni}}
- @String {QuadMusSalinas = {Quaderni del Museo archeologico regionale Antonino Salinas}}
- @String {QuadProtost = {Quaderni di protostoria. Università di Perugia}}
- @String {QuadStLun = {Quaderni. Centro studi lunensi}}
- @String {QuadStor = {Quaderni di storia}}
- @String {QuadStorici = {Quaderni storici}}
- @String {QuadUrbin = {Quaderni urbinati di cultura classica}}
- @String {Quaternaria = {Quaternaria. Storia naturale e culturale del quaternario}}
- @String {RA = {Revue archéologique}}
- @String {RAArtLouv = {Revue des archéologues et historiens d’art de Louvain}}
- @String {RAC = {Reallexikon für Antike und Christentum}}
- @String {RACFr = {Revue archéologique du Centre de la France}}
- @String {RAComo = {Rivista archeologica dell’antica provincia e diocesi di Como}}
- @String {RACr = {Rivista di archeologia cristiana}}
- @String {RadAkZadar = {Radovi Zavoda za povijesne znanosti, Hrvatska akademija znanosti i umjetnosti u Zadru}}
- @String {Radiocarbon = {Radiocarbon. An International Journal of Cosmogenic Isotope Research}}
- @String {RadSplit = {Radovi. Razdio povijesnih znanosti}}
- @String {RAE = {Revue archéologique de l’Est et du Centre-Est}}
- @String {Raggi = {Raggi. Zeitschrift für Kunstgeschichte und Archäologie}}
- @String {RAMadrid = {Revista de arqueología}}
- @String {RANarb = {Revue archéologique de Narbonnaise}}
- @String {RAPon = {Revista d’arqueologia de Ponent}}
- @String {RapWyk = {Raporty wykopaliskowe}}
- @String {RArchBiblMus = {Revista de archivos, bibliotecas y museos}}
- @String {RArcheom = {Revue d’archéométrie}}
- @String {RArtMus = {La revue des arts. Musées de France}}
- @String {RassAPiomb = {Rassegna di archeologia. Associazione archeologica piombinese}}
- @String {RassLazio = {Rassegna del Lazio}}
- @String {RassStorSalern = {Rassegna storica salernitana}}
- @String {RassVolt = {Rassegna volterrana}}
- @String {RAssyr = {Revue d’assyriologie et d’archéologie orientale}}
- @String {Ratiariensia = {Ratiariensia. Studi e materiali mesici e danubiani}}
- @String {RAtlMed = {Revista atlántica-\-mediterránea de prehistoria y arqueología social}}
- @String {RavStRic = {Ravenna studi e ricerche}}
- @String {Raydan = {Raydan. Journal of the Ancient Yemeni Antiquities and Epigraphy}}
- @String {RB = {Revue biblique}}
- @String {RBelgNum = {Revue belge de numismatique et de sigillographie}}
- @String {RBelgPhilHist = {Revue belge de philologie et d’histoire}}
- @String {LRBK = {Reallexikon zur byzantinischen Kunst}}
- @String {RCulClMedioev = {Rivista di cultura classica e medioevale}}
- @String {RdA = {Rivista di archeologia}}
- @String {RDAC = {Report of the Department of Antiquities, Cyprus}}
- @String {RdE = {Revue d’égyptologie (Kairo)}}
- @String {RDroitsAnt = {Revue internationale des droits de l’antiquité}}
- @String {RE = {Paulys Realencyclopädie der classischen Altertumswissenschaft}}
- @String {REA = {Revue des études anciennes}}
- @String {REByz = {Revue des études byzantines}}
- @String {RecConstantine = {Recueil des notices et memoires de la Société archéologique du département de Constantine}}
- @String {RechACrac = {Recherches archéologiques. Institut d’archéologie de l’Université de Cracovie}}
- @String {RechAlb = {Recherches albanologiques}}
- @String {RecMusAlcoi = {Recerques del Museu d’Alcoi}}
- @String {RecTrav = {Recueil de travaux relatifs à philologie et l’archéologie égyptiennes et assyriennes}}
- @String {REG = {Revue des études grecques}}
- @String {ReiCretActa = {Rei Cretariae Romanae Fautorum acta}}
- @String {ReiCretCommunic = {Rei Cretariae Romanae Fautores. Communicationes}}
- @String {REL = {Revue des études latines}}
- @String {Rema = {Ρήμα. Mitteilungen zur indogermanischen, vornehmlich indo-iranischen Wortkunde sowie zur holothetischen Sprachtheorie}}
- @String {RendBologna = {Atti della Accademia delle scienze dell’Istituto di Bologna. Rendiconti}}
- @String {RendIstLomb = {Rendiconti. Classe di lettere e scienze morali e storiche, Istituto lombardo, Accademia di scienze e lettere}}
- @String {RendLinc = {Rendiconti dell’Accademia nazionale dei Lincei, Classe di scienze morali, storiche e filologiche}}
- @String {RendNap = {Rendiconti della Accademia di archeologia, lettere e belle arti, Napoli}}
- @String {RendPontAc = {Rendiconti. Atti della Pontificia accademia romana di archeologia}}
- @String {RepMalta = {Report on the Working of the Museum Department, Malta, Department of Information}}
- @String {Reppal = {Reppal. Revue des études phénicienne-puniques et des antiquités libyques}}
- @String {RepSocLibSt = {Annual Report. The Society for Libyan Studies}}
- @String {RES = {Répertoire d’épigraphie sémitique (Paris 1900--1950)}}
- @String {REstIber = {Revista de estudios ibéricos}}
- @String {REtArm = {Revue des études arméniennes}}
- @String {RevEg = {Revue égyptologique (Paris)}}
- @String {RFil = {Rivista di filologia e di istruzione classica}}
- @String {RGeorgCauc = {Revue des études géorgiennes et caucasiennes}}
- @String {RGF = {Römisch-Germanische Forschungen}}
- @String {RGuimar = {Revista de Guimarães}}
- @String {RHA = {Revue hittite et asianique}}
- @String {RheinMusBonn = {Das Rheinische Landesmuseum Bonn. Berichte aus der Arbeit des Museums}}
- @String {RHistArmees = {Revue historique des armées}}%*Abweichung!
- @String {RHistRel = {Revue de l’histoire des religions}}
- @String {RhM = {Rheinisches Museum für Philologie}}
- @String {RIA = {Rivista dell’Istituto nazionale d’archeologia e storia dell’arte}}
- @String {RIC = {H. Mattingly – E. A. Sydenham, The Roman Imperial Coinage}}
- @String {RicEgAntCopt = {Ricerche di egittologia e di antichità copte}}
- @String {RicognA = {Ricognizioni archeologiche}}
- @String {RicStBrindisi = {Ricerche e studi. Museo Francesco Ribezzo, Brindisi}}
- @String {RIngIntem = {Rivista Ingauna e Intemelia}}
- @String {RItNum = {Rivista italiana di numismatica e scienze affini}}
- @String {RlA = {Reallexikon der Assyriologie und vorderasiatischen Archäologie}}
- @String {RLouvre = {Revue du Louvre. La revue des musées de France}}
- @String {RM = {Mitteilungen des Deutschen Archäologischen Instituts, Römische Abteilung}}
- @String {RNum = {Revue numismatique}}
- @String {RoczMuzWarsz = {Rocznik Muzeum narodowego w Warszawie}}
- @String {RoemOe = {Römisches Österreich. Jahresschrift der Österreichischen Gesellschaft für Archäologie}}%*Abweichung!
- @String {RoemQSchr = {Römische Quartalschrift für christliche Altertumskunde und Kirchengeschichte}}%*Abweichung!
- @String {Romanobarbarica = {Romanobarbarica. Contributi allo studio dei rapporti culturali tra il mondo latino e mondo barbarico}}
- @String {RomGens = {Romana gens. Bollettino dell’Associazione archeologica romana}}
- @String {RoscherML = {W. H. Roscher, Ausführliches Lexikon der griechischen und römischen Mythologie}}%*Abweichung!
- @String {RossA = {Rossijskaja archeologija}}
- @String {RPC = {Roman Provincial Coinage}}
- @String {RPhil = {Revue de philologie, de littérature et d’histoire anciennes}}
- @String {RPortA = {Revista portuguesa de arqueologia}}
- @String {RPorto = {Revista da Facultade de letras. Serie de historia. Universidade do Porto}}
- @String {RRC = {M. Crawford, Roman Republican Coinage (London 1974)}}
- @String {RSaintonge = {Revue de la Saintonge et de l’Aunis}}
- @String {RScPreist = {Rivista di scienze preistoriche}}
- @String {RSO = {Rivista degli studi orientali}}
- @String {RStBiz = {Rivista di studi bizantini e neoellenici}}
- @String {RStCl = {Rivista di studi classici}}
- @String {RStFen = {Rivista di studi fenici}}
- @String {RStLig = {Rivista di studi liguri}}
- @String {RStMarch = {Rivista di studi marchigiani}}
- @String {RStorAnt = {Rivista storica dell’antichità}}
- @String {RStorCal = {Rivista storica calabrese}}
- @String {RStPomp = {Rivista di studi pompeiani}}
- @String {RStPun = {Rivista di studi punici}}
- @String {RTopAnt = {Rivista di topografia antica}}
- @String {Rudiae = {Rudiae. Ricerche sul mondo classico}}
- @String {SaalbJb = {Saalburg-Jahrbuch. Bericht des Saalburg-Museums}}
- @String {SaarBeitr = {Saarbrücker Beiträge zur Altertumskunde}}
- @String {SaarStMat = {Saarbrücker Studien und Materialien zur Altertumskunde}}
- @String {Sacer = {Sacer. Bollettino della Associazione storica saccarese}}
- @String {Saeculum = {Saeculum. Jahrbuch für Universalgeschichte}}
- @String {SAGA = {Studien zur Archäologie und Geschichte Altägyptens}}
- @String {SaggiFen = {Saggi fenici}}
- @String {Saguntum = {Saguntum. Papeles del Laboratorio de arqueología de Valencia}}
- @String {Saitabi = {Saitabi. Noticiario de historia, arte y arqueología de Levante}}
- @String {SAK = {Studien zur altägyptischen Kultur}}
- @String {Salduie = {Salduie. Estudios de prehistoria y arqueología}}
- @String {Samothrace = {Samothrace. Excavations Conducted by the Institute of Fine Arts of New York University}}
- @String {Sandalion = {Sandalion. Quaderni di cultura classica, cristiana e medievale}}
- @String {Sardis = {Sardis. Publications of the American Society for the Excavation of Sardis}}
- @String {Sargetia = {Sargetia. Acta Musei regionalis Devensis}}
- @String {SarkSt = {Sarkophag-Studien}}
- @String {Sautuola = {Sautuola. Revista del Instituto de prehistoria y arqueologia Sautuola}}
- @String {Savaria = {Savaria. Bulletin der Museen des Komitats Vas}}
- @String {SBBerlin = {Sitzungsberichte der Deutschen Akademie der Wissenschaften zu Berlin. Klasse für Sprache, Literatur und Kunst}}
- @String {SBLeipzig = {Sitzungsberichte der Sächsischen Akademie der Wissenschaften zu Leipzig}}
- @String {SBMuenchen = {Bayerische Akademie der Wissenschaften. Philosophisch-Historische Klasse. Sitzungsberichte}}%*Abweichung!
- @String {SborBrno = {Sborník prací Filozofické fakulty Brněnské univerzity. M, Rada archeologická}}
- @String {SBWien = {Sitzungsberichte. Österreichische Akademie der Wissenschaften}}
- @String {ScAnt = {Scienze dell’antichità. Storia, archeologia, antropologia}}
- @String {SCE = {The Swedish Cyprus Expedition}}
- @String {SchildStei = {Schild von Steier. Beiträge zur Steirischen Vor- und Frühgeschichte und Münzkunde}}
- @String {Scholia = {Scholia. Natal Studies in Classical Antiquity}}
- @String {SchwMueBl = {Schweizer Münzblätter}}%*Abweichung!
- @String {SchwNumRu = {Schweizerische numismatische Rundschau}}
- @String {ScrCiv = {Scrittura e civiltà}}
- @String {ScrClIsr = {Scripta classica Israelica. Yearbook of the Israel Society for the Promotion of Classical Studies}}
- @String {ScrHieros = {Scripta Hierosolymitana. Publications of the Hebrew University, Jerusalem}}
- @String {ScrMed = {Scripta mediterranea. Bulletin of the Society for Mediterranean Studies, Toronto}}
- @String {SDAIK = {Sonderschriften des Deutschen Archäologischen Instituts, Abteilung Kairo}}
- @String {SEG = {Supplementum epigraphicum Graecum}}
- @String {SeminRom = {Seminari romani di cultura greca}}
- @String {Semitica = {Semitica. Cahiers publiés par l’Institut d’études sémitiques du College de France. Avec le concours du Centre national de la recherche scientifique}}
- @String {SetubalA = {Setúbal arqueológica}}
- @String {Sibrium = {Sibrium. Collana di studi e documentazioni}}
- @String {SicA = {Sicilia archeologica}}
- @String {SicGymn = {Siculorum gymnasium}}
- @String {SIG = {W. Dittenberger, Sylloge inscriptionum Graecarum (Leipzig 1915--­1924)}}
- @String {Sileno = {Sileno. Rivista di studi classici e cristiani}}
- @String {SilkRoadArtA = {Silk Road Art and Archaeology. Journal of the Institute of Silk Road Studies, Kamakura}}
- @String {SIMA = {Studies in Mediterranean Archaeology}}
- @String {Simblos = {Simblos. Scritti di storia antica}}
- @String {Skyllis = {Skyllis. Zeitschrift für Unterwasserarchäologie}}
- @String {SlovA = {Slovenská archeológia}}
- @String {SlovNum = {Slovenská numizmatika}}
- @String {SMEA = {Studi micenei ed egeo-anatolici}}
- @String {SNG = {Sylloge nummorum Graecorum}}
- @String {SocGeoAOran = {(Bulletin trimestriel de la) Société de géographie et d’archéologie (de la province) d’Oran}}
- @String {SoobErmit = {Soobščenija Gosudarstvennogo Ėrmitaža}}
- @String {SoobMuzMoskva = {Soobščenija Gosudarstvennogo muzeja izobrazitel’nych isskustv imeni A. S. Puškina}}
- @String {SovA = {Sovetskaja archeologija}}
- @String {Spal = {Spal. Revista de prehistoria y arqueología de la Universidad de Sevilla}}
- @String {SpNov = {Specimina nova dissertationum ex Instituto historico Universitatis Quinqueecclesiensis de Iano Pannonio nominatae}}
- @String {Spoletium = {Spoletium. Rivista di arte, storia, cultura}}
- @String {StA = {Studia archaeologica}}
- @String {Stadion = {Stadion. Internationale Zeitschrift für Geschichte des Sports}}
- @String {StaedelJb = {Städel-Jahrbuch}}%*Abweichung!
- @String {StAeg = {Studia Aegyptiaca. Budapest}}
- @String {StAlb = {Studia Albanica}}
- @String {StAnt = {Studi di antichità. Università di Lecce}}
- @String {Starinar = {StarinarArheoloki institut Beograd}}
- @String {StAWarsz = {Studia archeologiczne. Uniwersytet Warszawski, Instytut archeologii}}
- @String {StBiFranc = {Studium biblicum Franciscanum. Liber annuus}}
- @String {StBitont = {Studi bitontini}}
- @String {StBoT = {Studien zu den Bogazköy-Texten}}
- @String {StCercIstorV = {Studii şi cercetări de istorie veche şi arheologie}}
- @String {StCercNum = {Studii şi cercetări de numismatică}}
- @String {StCl = {Studii clasice. Societatea de studii clasice din Republica socialistă Romănia}}
- @String {StClOr = {Studi classici e orientali}}
- @String {StDocA = {Studi e documenti di archeologia}}
- @String {StDocHistIur = {Studia et documenta historiae et iuris}}
- @String {StEbla = {Studi eblaiti}}
- @String {StEgAntPun = {Studi di egittologia e di antichità puniche}}
- @String {SteMat = {Studi e materiali. Soprintendenza ai beni archeologici per la Toscana}}
- @String {StEpigrLing = {Studi epigrafici e linguistici sul Vicino Oriente antico}}
- @String {StEtr = {Studi etruschi}}
- @String {StGenu = {Studi genuensi}}
- @String {StHist = {Studia historica. Historia antigua}}
- @String {StiftHambKuSamml = {Stiftung zur Förderung der Hamburgischen Kunstsammlungen. Erwerbungen}}
- @String {StItFilCl = {Studi italiani di filologia classica}}
- @String {StLatIt = {Studi latini e italiani}}
- @String {StMagreb = {Studi magrebini}}
- @String {StMatStorRel = {Studi e materiali di storia delle religioni}}
- @String {StOliv = {Studia Oliveriana}}
- @String {StOr = {Studia orientalia, Helsinki}}
- @String {StOrCr = {Studi sull’Oriente cristiano}}
- @String {StP = {Studia papyrologica}}
- @String {StrennaRom = {Strenna dei romanisti}}
- @String {StRom = {Studi romani}}
- @String {StRomagn = {Studi romagnoli}}
- @String {StSalent = {Studi salentini}}
- @String {StSard = {Studi sardi}}
- @String {StStorRel = {Studi storico-religiosi}}
- @String {StTardoant = {Studi tardoantichi}}
- @String {StTrentStor = {Studi trentini di scienze storiche. Sezione seconda}}
- @String {StTroica = {Studia Troica}}
- @String {StUrbin = {Studi urbinati. B, Scienze umane. 3, Linguistica, letteratura, arte}}
- @String {Sumer = {Sumer. A Journal of Archaeology (and History) in Iraq}}
- @String {SylvaMala = {Sylva Mala. Bollettino del Centro di studi archeologici di Boscoreale, Boscotrecase e Trecase}}%*Abweichung!
- @String {SymbOslo = {Symbolae Osloenses}}
- @String {Syria = {Syria. Revue d’art oriental et d’archéologie}}
- @String {SyrMesopSt = {Syro-Mesopotamian Studies}}
- @String {TAD = {Türk arkeoloji dergisi}}
- @String {Talanta = {Τάλαντα. Proceedings of the Dutch Archaeological and Historical Society}}
- @String {TAM = {E. Kalinka (Hrsg.), Tituli Asiae Minoris (Wien 1901--­1941)}}
- @String {Taras = {Taras. Rivista di archeologia}}
- @String {Tarsus = {Excavations at Gözlü Kule, Tarsus}}
- @String {TAVO = {Tübinger Atlas des Vorderen Orients}}
- @String {TeherF = {Teheraner Forschungen}}
- @String {Teiresias = {Teiresias. A Review and Continuing Bibliography of Boiotian Studies}}
- @String {TelAvivJA = {Tel Aviv. Journal of the Institute of Archaeology of Tel Aviv University}}
- @String {TerraAntBalc = {Acta Associationis internationalis »Terra antiqua balcanica«}}
- @String {TerraVolsci = {Terra dei Volsci. Annali del Museo archeologico di Frosinone}}
- @String {Teruel = {Teruel. Instituto de estudios turolenses}}
- @String {TextilAnc = {Textiles anciens. Bulletin du Centre international d’étude des textiles anciens}}
- @String {TheolRu = {Theologische Rundschau}}
- @String {ThesCRA = {Thesaurus Cultus et Rituum Antiquorum}}
- @String {Thessalika = {Θεσσαλικά}}
- @String {Thessalonike = {Η Θεσσαλονίκη}}
- @String {Thieme-Becker = {U. Thieme – F. Becker (Hrsg.), Allgemeines Lexikon der bildenden Künstler}}%*Abweichung!
- @String {ThrakChron = {Θρακικά Χρονικά}}
- @String {ThrakEp = {Θρακική Επετηρίδα}}
- @String {TIB = {Tabula Imperii Byzantini}}
- @String {Tibiscus = {Tibiscus. Istorie, arheologie. Muzeul Banatului Timişoara}}
- @String {TiLeon = {Tierras de León}}
- @String {Tiryns = {Tiryns. Forschungen und Berichte}}
- @String {TMA = {Tijdschrift voor Mediterrane archeologie}}
- @String {Topoi = {Τόποι. Orient – Occident}}
- @String {Torretta = {La torretta. Rivista quadrimestrale a cura della Biblioteca comunale di Blera}}
- @String {TourOrleOr = {La Tour de l’Orle-d’Or, Semur-en-Auxois}}
- @String {TrabAntrEtn = {Trabalhos de antropologia e etnologia}}
- @String {TrabArq = {Trabalhos de arqueologia}}
- @String {TrabAssArqPort = {Trabalhos da associação dos arqueólogos portugueses}}
- @String {TrabNavarra = {Trabajos de arqueología de Navarra}}
- @String {TrabPrehist = {Trabajos de prehistoria}}
- @String {Traditio = {Traditio. Studies in Ancient and Medieval History, Thought and Religion}}
- @String {TransactAmPhilAss = {Transactions and Proceedings of the American Philological Association}}
- @String {TransactAmPhilosSoc = {Transactions of the American Philosophical Society}}
- @String {TransactLond = {Transactions of the London and Middlesex Archaeological Society}}
- @String {TravMem = {Travaux et mémoires. Centre de recherche d’histoire et civilisation byzantine, Paris}}
- @String {TravToulouse = {Travaux de l’Institut d’art préhistorique, Université de Toulouse – Le Mirail}}
- @String {TreMonet = {Trésors monétaires}}
- @String {TribArq = {Tribuna d’arqueologia}}
- @String {TrudyErmit = {Trudy Gosudarstvennogo Ėrmitaža}}
- @String {TrWPr = {Trierer Winckelmannsprogramme}}
- @String {TrZ = {Trierer Zeitschrift für Geschichte und Kunst des Trierer Landes und seiner Nachbargebiete}}
- @String {TTKY = {Türk Tarih Kurumu yayınları}}
- @String {TueBA-Ar = {Türkiye Bilimler Akademisi arkeoloji dergisi}}%*Abweichung!
- @String {Tyche = {Tyche. Beiträge zur Alten Geschichte, Papyrologie und Epigraphik}}
- @String {UF = {Ugarit-Forschungen. Internationales Jahrbuch für die Altertumskunde Syrien-Palästinas}}
- @String {UPA = {Universitätsforschungen zur Prähistorischen Archäologie}}
- @String {LUrbe = {L’Urbe. Rivista romana}}%*Abweichung!
- @String {UrSchw = {Ur-Schweiz. La Suisse primitive}}
- @String {UVB = {Vorläufiger Bericht über die von dem Deutschen Archäologischen Institut und der Deutschen Orient-Gesellschaft aus den Mitteln der Deutschen Forschungsgemeinschaft unternommenen Ausgrabungen in Uruk-Warka}}
- @String {VarSpom = {Varstvo spomenikov}}
- @String {VDI = {Vestnik drevnej istorii}}
- @String {Vekove = {Vekove. Dvumesečno spisanie. Bălgarsko istoričesko družestvo}}
- @String {Veleia = {Veleia. Revista de prehistoria, historia antigua, arqueología y filología clásicas}}
- @String {VenArt = {Venezia arti. Bolletino del Dipartimento di storia e critica delle arti dell’Università di Venezia}}
- @String {VerAmstMeded = {Mededelingenblad. Vereniging van Vrienden Allard Pierson Museum}}
- @String {Verbanus = {Verbanus. Rassegna per la cultura, l’arte, la storia del lago}}
- @String {VeteraChr = {Vetera christianorum}}
- @String {VGesVind = {Veröffentlichungen der Gesellschaft Pro Vindonissa}}
- @String {Vichiana = {Vichiana. Rassegna di studi filologici e storici}}
- @String {VicOr = {Vicino Oriente}}
- @String {VigChr = {Vigiliae christianae}}
- @String {Viminacium = {Viminacium. Zbornik radova Narodnog muzeja}}
- @String {VisRel = {Visible Religion}}
- @String {Vitudurum = {Beiträge zum römischen Oberwinterthur – Vitudurum. Ausgrabungen im Unteren Bühl}}
- @String {VivScyl = {Vivarium Scyllacense. Bollettino dell’Istituto di studi su Cassiodoro e sul medioevo in Calabria}}
- @String {VizVrem = {Vizantijskij vremennik}}
- @String {VjesAMuzZagreb = {Vjesnik Arheološkog muzeja u Zagrebu}}
- @String {VjesDal = {Vjesnik za arheologiju i historiju dalmatinsku. Bulletin d’archéologie et d’histoire dalmates}}
- @String {Wad-al-Hayara = {Wad-al-Hayara. Revista de estudios de la Institución provincial de cultura »Marqués de Santillana« de Guadalajara}}
- @String {WeltGesch = {Die Welt als Geschichte}}
- @String {WiadA = {Wiadomości archeologiczne. Bulletin archéologique polonais}}
- @String {WissMBosn = {Wissenschaftliche Mitteilungen des Bosnischen Landesmuseums, A. Archäologie}}
- @String {WissZBerl = {Wissenschaftliche Zeitschrift der Humboldt-Universität zu Berlin. Gesellschafts- und sprachwissenschaftliche Reihe}}
- @String {WissZHalle = {Wissenschaftliche Zeitschrift. Martin-Luther-Universität Halle-Wittenberg}}
- @String {WissZJena = {Wissenschaftliche Zeitschrift der Friedrich-Schiller-Universität Jena}}
- @String {WissZRostock = {Wissenschaftliche Zeitschrift der Universität Rostock}}
- @String {WO = {Die Welt des Orients. Wissenschaftliche Beiträge zur Kunde des Morgenlandes}}
- @String {WorldA = {World Archaeology}}
- @String {WSt = {Wiener Studien}}
- @String {WuerzbJb = {Würzburger Jahrbücher für die Altertumswissenschaft}}%*Abweichung!
- @String {WVDOG = {Wissenschaftliche Veröffentlichungen der Deutschen Orient-Gesellschaft}}
- @String {WZKM = {Wiener Zeitschrift für die Kunde des Morgenlandes}}
- @String {Xenia = {Xenia. Semestrale di antichità}}
- @String {XeniaAnt = {Xenia antiqua}}
- @String {XeniaKonst = {Xenia. Konstanzer althistorische Vorträge und Forschungen}}
- @String {YaleClSt = {Yale Classical Studies}}
- @String {YaleUnivB = {Yale University Art Gallery Bulletin}}
- @String {ZA = {Zeitschrift für Assyriologie und vorderasiatische Archäologie}}
- @String {ZAAK = {Zeitschrift für Archäologie Außereuropäischer Kulturen}}
- @String {ZAeS = {Zeitschrift für ägyptische Sprache und Altertumskunde}}%*Abweichung!
- @String {ZAKSSchriften = {Schriften des Zentrums für Archäologie und Kulturgeschichte des Schwarzmeerraumes}}
- @String {ZAntChr = {Zeitschrift für antikes Christentum}}
- @String {ZAW = {Zeitschrift für die alttestamentliche Wissenschaft}}
- @String {ZborMuzBeograd = {Zbornik Narodnog muzeja Beograd}}
- @String {ZborRadBeograd = {Zbornik radova Vizantološkog instituta. Recueil des travaux de l’Institut d’études byzantines, Beograd}}
- @String {ZborZadar = {Zbornik Instituta za historijske nauke u Zadru}}
- @String {ZDMG = {Zeitschrift der Deutschen Morgenländischen Gesellschaft}}
- @String {ZDPV = {Zeitschrift des Deutschen Palästina-Vereins}}
- @String {Zephyrus = {Zephyrus. Revista de prehistoria y arqueología}}
- @String {ZEthn = {Zeitschrift für Ethnologie der Deutschen Gesellschaft für Völkerkunde und der Berliner Gesellschaft für Anthropologie, Ethnologie und Urgeschichte}}
- @String {ZfA = {Zeitschrift für Archäologie}}
- @String {ZfNum = {Zeitschrift für Numismatik}}
- @String {ZivaAnt = {Živa antika. Antiquité vivante}}
- @String {ZKuGesch = {Zeitschrift für Kunstgeschichte}}
- @String {ZNW = {Zeitschrift für die neutestamentliche Wissenschaft und die Kunde der älteren Kirche}}
- @String {ZPE = {Zeitschrift für Papyrologie und Epigraphik}}
- @String {ZSav = {Zeitschrift der Savigny-Stiftung für Rechtsgeschichte. Romanistische Abteilung}}
- @String {ZSchwA = {Zeitschrift für Schweizerische Archäologie und Kunstgeschichte}}
- @String {ZVerglSprF = {Zeitschrift für vergleichende Sprachforschung}}
+ @String {AA = {Archäologischer Anzeiger}}
+@String {AAA = {Αρχαιολογικά Ανάλεκτα εξ Αθηνών}}
+@String {AAcque = {Archeologia delle acque. Rivista semestrale di antropologia, archeologia, etnografia, storia dell'acqua}}
+@String {AAdv = {The Archaeological Advertiser}}
+@String {AAJ = {Annual of the Department of Antiquities of Jordan}}
+@String {AAlpi = {Archeologia delle Alpi}}
+@String {AarbKob = {Aarbøger for nordisk oldkyndighed og historie}}%*Abweichung!
+@String {AArchit = {Archeologia dell'architettura}}
+@String {AAS = {Les annales archéologiques arabes syriennes}}
+@String {AASOR = {The Annual of the American Schools of Oriental Research}}
+@String {AAusgrBadWuert = {Archäologische Ausgrabungen in Baden-Württemberg}}%*Abweichung!
+@String {AAustr = {Archaeologia Austriaca}}
+@String {ABADY = {Archäologische Berichte aus dem Yemen}}
+@String {AbhBerlin = {Abhandlungen der Deutschen Akademie der Wissenschaften zu Berlin}}
+@String {AbhDuesseldorf = {Abhandlungen der Rheinisch-Westfälischen Akademie der Wissenschaften}}%*Abweichung!
+@String {AbhGoettingen = {Abhandlungen der Akademie der Wissenschaften zu Göttingen. Philologisch-Historische Klasse}}%*Abweichung!
+@String {AbhLeipzig = {Abhandlungen der Sächsischen Akademie der Wissenschaften zu Leipzig. Philologisch-Historische Klasse}}
+@String {AbhMainz = {Akademie der Wissenschaften und der Literatur in Mainz. Abhandlungen der Geistes- und Sozialwissenschaftlichen Klasse}}
+@String {AbhMuenchen = {Bayerische Akademie der Wissenschaften. Philosophisch-Historische Klasse. Abhandlungen}}%*Abweichung!
+@String {ABret = {Archéologie en Bretagne. Bulletin d'information}}
+@String {Abr-Nahrain = {Abr-Nahrain. An Annual Published by the Department of Middle Eastern Studies, University of Melbourne}}
+@String {ABulg = {Archaeologia Bulgarica}}
+@String {ABV = {J. D. Beazley, Attic Black-figure Vase-painters (Oxford 1956)}}
+@String {ACalc = {Archeologia e calcolatori}}
+@String {ACamp = {Archeologia in Campania. Bolletino di informazioni a cura della Soprintendenza archeologica delle province di Napoli e Caserta}}
+@String {ACant = {Archaeologia Cantiana}}
+@String {AcBibl = {Accademie e biblioteche d'Italia}}
+@String {Achse = {Achse, Rad und Wagen. Beiträge zur Geschichte der Landfahrzeuge}}
+@String {Acme = {Acme. Annali della Facoltà di lettere e filosofia dell'Università degli studi di Milano}}
+@String {Acontia = {Acontia. Revista de arqueología}}
+@String {ACors = {Archeologia corsa}}
+@String {ActaAArtHist = {Acta ad archaeologiam et artium historiam pertinentia}}
+@String {ActaAArtHist-sa = {Acta ad archaeologiam et artium historiam pertinentia. Series altera in 8}}%*Abweichung!
+@String {ActaAcAbo = {Acta Academiae Aboensis}}
+@String {ActaACarp = {Acta archaeologica Carpathica}}
+@String {ActaALov = {Acta archaeologica Lovaniensia}}
+@String {ActaALovMono = {Acta archaeologica Lovaniensia. Monographiae}}
+@String {ActaAntHung = {Acta antiqua Academiae scientiarum Hungaricae}}
+@String {ActaArch = {Acta archaeologica. København}}
+@String {ActaArchHung = {Acta archaeologica Academiae scientiarum Hungaricae}}
+@String {ActaAth = {Acta Instituti Atheniensis regni Sueciae}}
+@String {ActaCl = {Acta classica. Proceedings of the Classical Association of South Africa}}
+@String {ActaClDebrec = {Acta classica Universitatis scientiarum Debreceniensis}}
+@String {ActaHistDac = {Acta historica. Societas academica Dacoromana}}
+@String {ActaHyp = {Acta hyperborea. Danish Studies in Classical Archaeology}}
+@String {ActaInstRomFin = {Acta Instituti Romani Finlandiae}}
+@String {ActaMusNapoca = {Acta Musei Napocensis}}
+@String {ActaMusPorol = {Acta Musei Porolissensis}}
+@String {ActaNum = {Acta numismática (Barcelona)}}
+@String {ActaOr = {Acta orientalia (Kopenhagen)}}
+@String {ActaOrHung = {Acta orientalia Academiae scientiarum Hungaricae}}
+@String {ActaPhilSocDac = {Acta philologica. Societas academica Dacoromana}}
+@String {ActaPraehistA = {Acta praehistorica et archaeologica}}
+@String {ActaTorunA = {Acta Universitatis Nicolai Copernici. Archaeologia}}
+@String {ActaTorunHist = {Acta Universitatis Nicolai Copernici. Historia}}
+@String {AD = {Antike Denkmäler}}
+@String {ADAIK = {Abhandlungen des Deutschen Archäologischen Instituts, Abteilung Kairo}}
+@String {Adalya = {Adalya. Annual of the Suna \& Inan Kiraç-Research Institute on Mediterranean Civilizations}}
+@String {ADelt-A = {Αρχαιολογικόν Δελτίον (Μελέτες)}}%*Abweichung!
+@String {ADelt-B = {Αρχαιολογικόν Δελτίον (Χρονικά)}}%*Abweichung!
+@String {ADerg = {Arkeoloji dergisi. Ege Üniversitesi Edebiyat Fakültesi}}
+@String {ADFU = {Ausgrabungen der Deutschen Forschungsgemeinschaft in Uruk-Warka}}
+@String {AdI = {Annali dell'Instituto di corrispondenza archeologica}}
+@String {ADOG = {Abhandlungen der Deutschen Orient-Gesellschaft}}
+@String {Adumatu = {Adumatu. A Semi-Annual Archeological Refereed Journal on the Arab World}}
+@String {AE = {L'année épigraphique}}
+@String {AeA = {Aegean Archaeology}}
+@String {Aegaeum = {Aegaeum. Annales d'archéologie égéenne de l'Université de Liège}}
+@String {AegLev = {Ägypten und Levante. Egypt and the Levant. Internationale Zeitschrift für ägyptische Archäologie und deren Nachbargebiete}}%*Abweichung!
+@String {AEmil = {Archeologia dell'Emilia-Romagna}}
+@String {AEphem = {Αρχαιολογική Eφημερίς}}
+@String {AeR = {Atene e Roma}}
+@String {AErgoMak = {Το Αρχαιολογικό Έργο στη Μακεδονία και Θράκη}}
+@String {AErt = {Archaeologiai értesitő}}
+@String {AEspA = {Archivo español de arqueología}}
+@String {Aevum = {Aevum. Rassegna di scienze storiche linguistiche e filologiche}}
+@String {AevumAnt = {Aevum antiquum}}
+@String {AF = {Archäologische Forschungen}}
+@String {AfO = {Archiv für Orientforschung}}
+@String {Africa = {Africa. Institut national d'archéologie et d'art, Tunis}}
+@String {AGD = {Antike Gemmen in deutschen Sammlungen}}
+@String {AGeo = {Archaeologia geographica}}
+@String {Agora = {The Athenian Agora}}
+@String {AgoraPB = {Excavations of the Athenian Agora. Picture Book}}
+@String {AHist = {Arqueologia e história}}
+@String {AHistStAlex = {Archaeological and Historical Studies. The Archaeological Society of Alexandria}}
+@String {AHw = {W. von Soden, Akkadisches Handwörterbuch (Wiesbaden 1965--1981)}}
+@String {AiD = {Archäologie in Deutschland}}
+@String {AInf = {Archäologische Informationen. Mitteilungen zur Ur- und Frühgeschichte}}
+@String {AIONArch = {Annali dell'Istituto universitario orientale di Napoli. Dipartimento di studi del mondo classico e del Mediterraneo antico. Sezione di archeologia e storia antica}}
+@String {AIONFil = {Annali dell'Istituto universitario orientale di Napoli. Dipartimento di studi del mondo classico e del Mediterraneo antico. Sezione filologicoletteraria}}
+@String {AIONLing = {Annali dell'Istituto universitario orientale di Napoli. Dipartimento di studi del mondo classico e del Mediterraneo antico. Sezione linguistica}}
+@String {AIPhOr = {Annuaire de l'Institut de philologie et d'histoire orientales et slaves (Université Libre de Bruxelles)}}
+@String {Aitna = {Aitna. Quaderni di topografia antica}}
+@String {AJA = {American Journal of Archaeology}}
+@String {AJahrBay = {Das archäologische Jahr in Bayern}}
+@String {AJPh = {American Journal of Philology}}
+@String {AJug = {Archaeologia Jugoslavica}}
+@String {AKorrBl = {Archäologisches Korrespondenzblatt}}
+@String {AlbaRegia = {Alba Regia. Annales Musei Stephani regis}}
+@String {AlmaMaterSt = {Alma mater studiorum Almanacco calabrese Almoraima}}
+@String {AlmanachWien = {Österreichische Akademie der Wissenschaften. Almanach}}
+@String {AlonJisrael = {'Alon mahleqat ha-'atiqot šel medinat Jisra'el}}
+@String {Al-Qannis = {Al-Qanniš. Boletín del Taller de arqueología de Alcañiz}}
+@String {Altamura = {Altamura. Bollettino dell'Archivio-biblioteca-museo civico}}
+@String {AltoMed = {Alto medioevo}}
+@String {Alt-Paphos = {Ausgrabungen in Alt-Paphos auf Cypern}}
+@String {AltThuer = {Alt-Thüringen}}%*Abweichung!
+@String {AM = {Mitteilungen des Deutschen Archäologischen Instituts, Athenische Abteilung}}
+@String {AMediev = {Archaeologia medievale. Cultura materiale, insediamenti, territorio}}
+@String {AMethTh = {Advances in Archaeological Method and Theory}}
+@String {AMI = {Archäologische Mitteilungen aus Iran}}
+@String {AMIT = {Archäologische Mitteilungen aus Iran und Turan}}
+@String {AmJAncHist = {American Journal of Ancient History}}
+@String {AmJNum = {American Journal of Numismatics}}
+@String {AMold = {Arheologia Moldovei}}
+@String {AMosel = {Archaeologia Mosellana}}
+@String {AMS = {Asia Minor Studien}}
+@String {AmStP = {American Studies in Papyrology}}
+@String {AMuGS = {Antike Münzen und geschnittene Steine}}
+@String {ANachr = {Archäologisches Nachrichtenblatt}}
+@String {ANachrBad = {Archäologische Nachrichten aus Baden}}
+@String {AnadoluAra = {Anadolu araştırmaları. Jahrbuch für kleinasiatische Forschung}}
+@String {AnadoluKonf = {Anadolu Medeniyetleri Müzesi konferansları}}
+@String {AnadoluYil = {Anadolu Medeniyetleri Müzesi yıllığı}}
+@String {AnAe = {Analecta Aegyptiaca}}
+@String {Anagennesis = {Anagennesis. A Papyrological Journal}}
+@String {AnalBolland = {Analecta Bollandiana}}
+@String {AnalP = {Analecta papyrologica}}
+@String {AnalRom = {Analecta Romana Instituti Danici}}
+@String {AnArqAnd = {Anuario arqueológico de Andalucía}}
+@String {Anas = {Anas. Museo nacional de arte romano de Mérida}}
+@String {AnatA = {Anatolian Archaeology. Reports on Research Conducted in Turkey}}
+@String {Anatolia = {Anatolia. Revue annuelle de l’Institut d’archéologie de l’Université d’Ankara}}
+@String {ANaturwiss = {Archäologie und Naturwissenschaften}}
+@String {AncCivScytSib = {Ancient Civilizations from Scythia to Siberia. An International Journal of Comparative Studies in History and Archaeology}}
+@String {AncHistB = {The Ancient History Bulletin}}
+@String {AncInd = {The Ancient India}}
+@String {AncNearEastSt = {Ancient Near Eastern Studies. An Annual}}
+@String {AnCord = {Anales de arqueología cordobesa}}
+@String {AncSoc = {Ancient Society}}
+@String {AncW = {The Ancient World}}
+@String {AncWestEast = {Ancient West and East}}
+@String {AnDubr = {Annali Zavoda za povijesne znanosti Istraivakog centra Jugoslavenske akademije znanosti i umjetnosti u Dubrovniku}}
+@String {ANews = {Archaeological News}}
+@String {ANilMoy = {Archéologie du Nil moyen}}
+@String {ANL = {The Archaeological News Letter}}
+@String {AnMunFaro = {Anais do municípo de Faro}}
+@String {AnMurcia = {Anales de prehistoria y arqueología. Universidad de Murcia}}
+@String {AnnAcEtr = {Annuario. Accademia etrusca di Cortona}}
+@String {AnnAcTorino = {Annuario della Accademia delle scienze di Torino}}
+@String {AnnAStorAnt = {Annali. Sezione di archeologia e storia antica. Istituto universitario orientale di Napoli. Dipartimento di studi del mondo classico e del Mediterraneo antico}}
+@String {AnnBari = {Annali della Facoltà di lettere e filosofia, Università degli Studi, Bari}}
+@String {AnnBenac = {Annali Benacensi}}
+@String {AnnBiblAModena = {Annuario bibliografico di archeologia. Modena}}
+@String {AnnBiblARom = {Annuario bibliografico di archeologia. Nuove accessioni del \ldots. Biblioteca dell’Istituto nazionale di archeologia e storia dell’arte, Roma}}
+@String {AnnByzConf = {Annual Byzantine Studies Conference. Abstracts of Papers}}
+@String {AnnCagl = {Annnali della Facoltà di lettere e filosofia dell'Università di Cagliari}}
+@String {AnnCaglMag = {Annali della Facoltà di magistero dell'Università di Cagliari}}
+@String {AnnEconSocCiv = {Annales. Economies, sociétés, civilisations}}
+@String {AnnEgBibl = {Annual Egyptological Bibliography}}
+@String {AnnEth = {Annales d'Éthiopie}}
+@String {AnnFaina = {Annali della Fondazione per il Museo Claudio Faina}}
+@String {AnnHistA = {Annales d'histoire et d'archéologie}}
+@String {AnnHistScSoc = {Annales. Histoire, sciences sociales}}
+@String {AnnIstGiapp = {Annuario. Istituto giapponese di cultura in Roma}}
+@String {AnnIstItNum = {Annali. Istituto italiano di numismatica}}
+@String {AnnLecce = {Annali dell'Università di Lecce. Facoltà di lettere e filosofia e di magistero}}
+@String {AnnLeedsUnOrSoc = {The Annual of Leeds University Oriental Society}}
+@String {AnnMacerata = {Annali della Facoltà di lettere e filosofia, Università di Macerata}}
+@String {AnnMessMag = {Nuovi annali della Facoltà di magistero dell'Università di Messina}}
+@String {AnnMusRov = {Annali del Museo civico di Rovereto. Sezione archeologia, storia, scienze naturali}}
+@String {AnnNap = {Annali della Facoltà di lettere e filosofia, Università di Napoli}}
+@String {AnnNivern = {Les annales des pays Nivernais}}
+@String {AnnNoment = {Annali. Associazione nomentana di storia e archeologia}}
+@String {AnnOrNap = {Annali. Rivista del Dipartimento di studi asiatici e del Dipartimento di studi e ricerche su Africa e paesi arabi, Istituto universitario orientale di Napoli}}
+@String {AnnotNum = {Annotazioni numismatiche}}
+@String {AnnPerugia = {Annali della Facoltà di lettere e filosofia, Università degli studi di Perugia, 1. Studi classici}}
+@String {AnnPisa = {Annali della Scuola normale superiore di Pisa}}
+@String {AnnPontAcRom = {Annuario della Pontificia accademia romana di archeologia}}
+@String {AnnRepBSA = {Annual Report of Council. British School of Archaeology at Athens}}
+@String {AnnRepCypr = {Annual Report of the Department of Antiquities, Republic of Cyprus}}
+@String {AnnRepFoggArtMus = {The Annual Report of the Fogg Art Museum}}
+@String {AnnSiena = {Annali della Facoltà di lettere e filosofia, Università di Siena}}
+@String {AnnuarioAcLinc = {Annuario della Accademia nazionale dei Lincei}}
+@String {AnnuarioLecce = {Annuario. Liceo-ginnasio statale G. Palmieri, Lecce}}
+@String {AnnUnBud = {Annales Universitatis scientiarum Budapestinensis de Rolando Eötvös nominatae}}
+@String {AnnWorcArtMus = {Annual (Report). Worcester Art Museum}}
+@String {Anodos = {Anodos. Studies of Ancient World}}
+@String {AnOr = {Analecta orientalia. Commentationes scientificae de rebus orientis antiqui}}
+@String {ANRW = {Aufstieg und Niedergang der römischen Welt}}
+@String {Anschnitt = {Der Anschnitt. Mitteilungsblatt der Vereinigung der Freunde von Kunst und Kultur im Bergbau}}
+@String {ANSMusNotes = {Museum Notes. American Numismatic Society}}
+@String {AnSt = {Anatolian Studies}}
+@String {Antaeus = {Antaeus. Communicationes ex Instituto archaeologico Academiae scientiarum hungaricae}}
+@String {AntAfr = {Antiquités africaines}}
+@String {AntChr = {Antike und Christentum}}
+@String {AntCl = {L'antiquité classique}}
+@String {AnthrAChron = {Ανθρωπολογικά και Αρχαιολογικά Χρονικά}}
+@String {Anthropos = {Άνθρωπος. Όργανο της Ανθρωπολογικής Εταιρείας Ελλάδος}}
+@String {Antichthon = {Antichthon. Journal of the Australian Society for Classical Studies}}
+@String {AntigCr = {Antigüedad y cristianismo. Monografías históricas sobre la antigüedad tardía}}
+@String {Antipolis = {Antipolis. A Journal of Mediterranean Archaeology}}
+@String {Antiqua = {Antiqua. Rivista dell'Archeoclub d'Italia}}
+@String {Antiquity = {Antiquity. A Quarterly Review of Archaeology}}
+@String {AntJ = {The Antiquaries Journal}}
+@String {AntK = {Antike Kunst}}
+@String {AntNat = {Antiquités nationales. Saint-Germain-en-Laye}}
+@String {AntPisa = {Antichità pisane}}
+@String {AntPl = {Antike Plastik}}
+@String {AntSurv = {Antiquity and Survival}}
+@String {AntTard = {Antiquité tardive. Revue internationale d'histoire et d'archéologie}}
+@String {AnzAW = {Anzeiger für die Altertumswissenschaft}}
+@String {AnzWien = {Anzeiger. Österreichische Akademie der Wissenschaften, Philosophisch-Historische Klasse}}
+@String {AOAT = {Alter Orient und Altes Testament. Veröffentlichungen zur Kultur und Geschichte des Alten Orients und des Alten Testaments}}
+@String {AoF = {Altorientalische Forschungen}}
+@String {AOtkryt = {Archeologičeskie otkrytija}}
+@String {APamKiiv = {Archeologični pamjatki URSR}}
+@String {APh = {L'année philologique}}
+@String {APol = {Archaeologia Polona}}
+@String {Apollo = {Apollo. Bolletino dei musei provinciali del Salernitano}}
+@String {ApolloLond = {Apollo. The International Magazine of the Arts}}
+@String {APort = {O arqueólogo português}}
+@String {AppRomFil = {Appunti romani di filologia. Studi e comunicazioni di filologia, linguistica e letteratura greca e latina}}
+@String {APregl = {Arheološki pregled. Arheološko društvo Jugoslavije}}
+@String {Apulum = {Apulum. Acta Musei Apulensis}}
+@String {AquiLeg = {Aquila legionis. Cuadernos des estudios sobre el ejército romano}}
+@String {AquilNost = {Aquileia nostra. Bollettino dell'Associazione nazionale per Aquileia}}
+@String {Aquitania = {Aquitania. Une revue inter-régionale d'archéologie}}
+@String {ArabAEpigr = {Arabian Archaeology and Epigraphy}}
+@String {ARadRaspr = {Arheolokiradovi i rasprave}}
+@String {ArbFBerSaechs = {Arbeits- und Forschungsberichte zur sächsischen Bodendenkmalpflege}}
+@String {Archaeographie = {Archäographie. Archäologie und elektronische Datenverarbeitung}}%*Abweichung!
+@String {Archaeologia = {Archaeologia or Miscellaneous Tracts Relating to Antiquity Published by the Society of Antiquaries of London}}
+@String {Archaeology = {Archaeology. A Magazine Dealing with the Antiquity of the World}}
+@String {Archaeometry = {Archaeometry. Bulletin of the Research Laboratory for Archaeology and History of Art, Oxford University}}
+@String {Archaiognosia = {Αρχαιογνωσία}}
+@String {ArchBegriffsGesch = {Archiv für Begriffsgeschichte}}
+@String {ArchByzMnem = {Αρχείον των Βυζαντινών Μνημείων της Ελλάδος }}
+@String {ArchCl = {Archeologia classica}}
+@String {Archeo = {Archeo. Attualità del passato}}
+@String {ArcheogrTriest = {Archeografo triestino}}
+@String {ArcheologiaParis = {Archeologia, Paris. L'archéologie dans le monde et tout ce qui concerne les recherches historiques, artistiques et scientifiques sur terre et dans les mers}}
+@String {ArcheologiaRoma = {Archeologia. Rivista bimestrale. Roma}}
+@String {ArcheologiaWarsz = {Archeologia. Rocznik Instytutu archeologii i etnologii, Polskiej akademii nauk}}
+@String {ArcheologijaKiiv = {Archeologija. Nacional'na akademija nauk Ukraini. Institut archeologii}}
+@String {ArcheologijaSof = {Archeologija. Organ na Archeologičeskija institut i muzej (pri Bălgarskata akademii nauk)}}
+@String {ArchEubMel = {Αρχείον Ευβοϊκών Μελετών}}
+@String {ArchHom = {Archaeologia Homerica}}
+@String {Architectura = {Architectura. Zeitschrift für Geschichte der Baukunst}}
+@String {Archivi = {Archivi. Archivi d'Italia e rassegna internazionale degli archivi}}
+@String {ArchPF = {Archiv für Papyrusforschung und verwandte Gebiete}}
+@String {ArchPrehistLev = {Archivo de prehistoria levantina}}
+@String {ArchRel = {Archiv für Religionsgeschichte}}
+@String {ArchStorCal = {Archivio storico per la Calabria e la Lucania}}
+@String {ArchStorPugl = {Archivio storico pugliese}}
+@String {ArchStorRom = {Archivio della Società romana di storia patria}}
+@String {ArchStorSicOr = {Archivio storico per la Sicilia orientale}}
+@String {ArchStorSir = {Archivio storico siracusano}}
+@String {Arctos = {Arctos. Acta philologica Fennica}}
+@String {ARepLond = {Archaeological Reports}}
+@String {Argo = {Argo. časopis slovenskih muzejev, Narodni Muzej Slovenije}}
+@String {ArOr = {Archív orientální. Quarterly Journal of African and Asian Studies}}
+@String {ArOrMono = {Archív orientální. Quarterly Journal of African, Asian and Latin American Studies. Monografie Archívu orientálního}}
+@String {ArOrSuppl = {Archív orientální. Quarterly Journal of African, Asian and Latin American Studies. Supplementa}}
+@String {ARozhl = {Archeologické rozhledy}}
+@String {ArqBeja = {Arquivo de Beja. Boletim, estudos, arquivo}}
+@String {Arse = {Arse. Boletín del Centro arqueológico saguntino}}
+@String {ArsGeorg = {Ars Georgica}}
+@String {ArtAntMod = {Arte antica e moderna}}
+@String {ArtARhone = {Art et archéologie en Rhône-Alpes}}%*Abweichung!
+@String {ArtAs = {Artibus Asiae}}
+@String {ArtB = {The Art Bulletin}}
+@String {ArtJ = {Art Journal}}
+@String {ArtLomb = {Arte lombarda}}
+@String {ArtMediev = {Arte medievale}}
+@String {ArtVirg = {Arts in Virginia}}
+@String {ARV2 = {J. D. Beazley, Attic Red-figure Vase-painters \textsuperscript{2}(Oxford 1963)}}
+@String {ASachs = {Archäologie in Sachsen-Anhalt}}
+@String {ASAE = {Annales du Service des antiquités de l’Égypte}}
+@String {ASammlUnZuerch = {Archäologische Sammlung der Universität Zürich}}%*Abweichung!
+@String {ASAtene = {Annuario della Scuola archeologica di Atene e delle missioni italiane in Oriente}}
+@String {ASbor = {Archeologičeskij sbornik. Gosudarstvennyj ordena Lenina Ermitaž}}
+@String {ASchw = {Archäologie der Schweiz. Mitteilungsblatt der Schweizerischen Gesellschaft für Ur- und Frühgeschichte}}
+@String {ASoc = {Archeologia e società}}
+@String {ASoloth = {Archäologie des Kantons Solothurn}}
+@String {ASR = {Die antiken Sarkophagreliefs}}
+@String {Assaph = {Assaph. Studies in Art History}}
+@String {AssyrMisc = {Assyriological Miscellanies}}
+@String {AST = {AratirmaSonuçlariToplantisi}}
+@String {ASub = {L'archeologo subacqueo. Quadrimestrale di archeologia subacquea e navale}}
+@String {ASubacq = {Archeologia subacquea. Studi, ricerche e documenti}}
+@String {Athenaeum = {Athenaeum. Studi di letteratura e storia dell'antichità}}
+@String {Atiqot = {`Atiqot. Journal of the Israel Department of Antiquities}}
+@String {AtiqotHeb = {`Atiqot. Journal of the Israel Department of Antiquities. Hebrew Series}}
+@String {Atlal = {Atlal. The Journal of Saudi Arabian Archaeology}}
+@String {AttiAcPontan = {Atti della Accademia pontaniana}}
+@String {AttiAcRov = {Atti della Accademia Roveretana degli Agiati. Contributi della classe di scienze umane, di lettere ed arti}}
+@String {AttiAcTorino = {Atti della Accademia delle scienze di Torino, 2. Classe di scienze morali, storiche e filologiche}}
+@String {AttiCAntCl = {Atti. Centro ricerche e documentazione sull'antichità classica}}
+@String {AttiCItRom = {Atti. Centro studi e documentazione sull'Italia romana}}
+@String {AttiMemBologna = {Atti e memorie. Deputazione di storia patria per le province di Romagna}}
+@String {AttiMemDal = {Atti e memorie della Società dalmata di storia patria}}
+@String {AttiMemFirenze = {Atti e memorie dell'Academia toscana di scienze e lettere »La Columbaria«}}
+@String {AttiMemIstria = {Atti e memorie della Società istriana di archeologia e storia patria}}
+@String {AttiMemMagnaGr = {Atti e memorie della Società Magna Grecia}}
+@String {AttiMemModena = {Atti e memorie. Deputazione di storia patria per le antiche provincie modenesi}}
+@String {AttiMemTivoli = {Atti e memorie della Società tiburtina di storia e d'arte}}
+@String {AttiMusTrieste = {Atti dei Civici musei di storia ed arte di Trieste}}
+@String {AttiPalermo = {Atti della Accademia di scienze, lettere e arti di Palermo}}
+@String {AttiRovigno = {Atti. Centro di ricerche storiche, Rovigno}}
+@String {AttiSocFriuli = {Atti della Società per la preistoria e protostoria della regione Friuli -- Venezia Giulia}}
+@String {AttiVenezia = {Atti. Istituto veneto di scienze, lettere ed arti}}
+@String {AuA = {Antike und Abendland}}
+@String {AulaOr = {Aula orientalis. Revista de estudios del Próximo Oriente antiguo}}
+@String {AusgrFu = {Ausgrabungen und Funde. Nachrichtenblatt der Landesarchäologie}}
+@String {AusgrFuWestf = {Ausgrabungen und Funde in Westfalen-Lippe}}
+@String {AustrRom = {Pro Austria Romana}}
+@String {AUTerr = {Archeologia, uomo, territorio. Rivista dei Gruppi archeologici Nord Italia}}
+@String {AUWE = {Ausgrabungen in Uruk-Warka. Endberichte}}
+@String {AV = {Archäologische Veröffentlichungen. Deutsches Archäologisches Institut, Abteilung Kairo}}
+@String {AVen = {Archeologia veneta}}
+@String {AVes = {Arheološki vestnik (Ljubljana)}}
+@String {AViva = {Archeologia viva}}
+@String {AvP = {Altertümer von Pergamon}}
+@String {AW = {Antike Welt. Zeitschrift für Archäologie und Kulturgeschichte}}
+@String {AyasofyaMuezYil = {Ayasofia Müzesi yıllığı. Annual of Ayasofya Museum}}%*Abweichung!
+@String {AZ = {Archäologische Zeitung}}
+@String {Azotea = {Azotea. Revista de cultura del Ayuntamiento de Coria del Río}}
+@String {BA = {Bollettino di archeologia}}
+@String {Baalbek = {Baalbek. Ergebnisse der Ausgrabungen und Untersuchungen in den Jahren 1898 bis 1905}}
+@String {BAAlger = {Bulletin d'archéologie algérienne}}
+@String {BABarcel = {Butlletí informatiu de l'Institut de prehistòria i arqueologia de la Diputació provincial de Barcelona}}
+@String {BABesch = {Bulletin antieke beschaving. Annual Papers on Classical Archaeology}}
+@String {BAcRHist = {Boletín de la Real academia de la historia}}
+@String {BACopt = {Bulletin de la Société d'archéologie copte}}
+@String {BadFuBer = {Badische Fundberichte}}
+@String {Baetica = {Baetica. Estudios de arte, geografía e historia}}
+@String {BaF = {Baghdader Forschungen}}
+@String {BalacaiKoez = {Balácai közlemények}}%*Abweichung!
+@String {BalkSt = {Balkan Studies}}
+@String {BALond = {Bulletin of the Institute of Archaeology, University of London}}
+@String {BALux = {Bulletin d'archéologie luxembourgeoise}}
+@String {BaM = {Baghdader Mitteilungen}}
+@String {BAMaroc = {Bulletin d'archéologie marocaine}}
+@String {BAmSocP = {The Bulletin of the American Society of Papyrologists}}
+@String {BAncOrMus = {Bulletin of the Ancient Orient Museum (Tokyo)}}
+@String {BAngers = {Bulletin du Centre de recherches et d'enseignement de l'antiquité, Angers}}
+@String {BAngloIsrASoc = {Bulletin of the Anglo-Israel Archaeological Society}}
+@String {BAnnMusFerr = {Bollettino annuale. Musei ferraresi}}
+@String {BAntFr = {Bulletin de la Société nationale des antiquaires de France}}
+@String {BAntLux = {Bulletin des antiquités luxembourgeoises}}
+@String {BAParis = {Bulletin archéologique du Comité des travaux historiques et scientifiques. Antiquités nationales}}
+@String {BAProv = {Bulletin archéologique de Provence}}
+@String {BAR = {British Archaeological Reports. British Series}}
+@String {BArchAlex = {Bulletin. Société archéologique d'Alexandrie}}
+@String {BArchit = {Bollettino del Centro di studi per la storia dell'architettura}}
+@String {BARIntSer = {British Archaeological Reports. International Series}}
+@String {BASard = {Nuovo bullettino archeologico sardo}}
+@String {BAsEspA = {Boletín. Asociación española de amigos de la arqueología}}
+@String {BAsInst = {Bulletin of the Asia Institute}}
+@String {BASOR = {Bulletin of the American Schools of Oriental Research}}
+@String {BAssBude = {Bulletin de l'Association Guillaume Budé}}%*Abweichung!
+@String {BAssMosAnt = {Bulletin d'information de l'Association internationale pour l'étude de la mosaïque antique}}
+@String {BASub = {Bollettino di archeologia subacquea}}
+@String {BASudEstEur = {Bulletin d'archéologie sud-est européenne}}
+@String {BATarr = {Bulletí arqueològic. Reial societat arqueològica tarraconense. Boletín arqueológico. Real sociedad arqueológica tarragonese}}
+@String {BAur = {Boletín auriense}}
+@String {BAVA = {Beiträge zur Allgemeinen und Vergleichenden Archäologie}}
+@String {BayVgBl = {Bayerische Vorgeschichtsblätter}}
+@String {BBasil = {Bollettino storico della Basilicata}}
+@String {BBelgRom = {Bulletin de l'Institut historique belge de Rome}}
+@String {BBolsena = {Bollettino di studi e ricerche. Biblioteca comunale di Bolsena}}
+@String {BBrByzSt = {Bulletin of British Byzantine Studies}}
+@String {BCamuno = {Bullettino del Centro Camuno di studi preistorici}}
+@String {BCASic = {Beni culturali e ambientali. Sicilia}}
+@String {BCercleNum = {Bulletin du Cercle d'études numismatiques}}
+@String {BCH = {Bulletin de correspondance hellénique}}
+@String {BCircNumNap = {Bollettino del Circolo numismatico napoletano}}
+@String {BCl = {Bollettino dei classici}}
+@String {BClevMus = {The Bulletin of The Cleveland Museum of Art}}
+@String {BCom = {Bullettino della Commissione archeologica comunale di Roma}}
+@String {BCord = {Bulletin d'information de l'Association internationale pour l'étude de la mosaïque antique}}
+@String {BdA = {Bollettino d'arte}}
+@String {BdE = {Bibliothèque d'études, Institut français d'archéologie orientale, Kairo}}
+@String {BdEC = {Bibliothèque d'études coptes, Institut français d'archéologie orientale, Kairo}}
+@String {BdI = {Bullettino dell'Instituto di corrispondenza archeologica}}
+@String {BDirRom = {Bullettino dell'Istituto di diritto romano »Vittorio Scialoja«}}
+@String {BeazleyAddenda2 = {T. H. Carpenter (Hrsg.), Beazley Addenda \textsuperscript{2}(Oxford 1989)}}%*Abweichung!
+@String {BeazleyPara. = {J. D. Beazley, Paralipomena. Additions to Attic Black-figure Vase-painters and to Attic Red-figure Vase-painters (Oxford 1971)}}%*Abweichung!
+@String {BEcAntNimes = {Bulletin (annuel) de l'École antique de Nîmes}}%*Abweichung!
+@String {BediKart = {Bedi Kartlisa. Revue de kartvélologie}}
+@String {BEFAR = {Bibliothèque des Écoles françaises d'Athènes et de Rome}}
+@String {BeitrESkAr = {Beiträge zur Erschließung hellenistischer und kaiserzeitlicher Skulptur und Architektur}}
+@String {BeitrNamF = {Beiträge zur Namenforschung}}
+@String {BeitrSudanF = {Beiträge zur Sudanforschung}}
+@String {BelArt = {Bellas artes (Madrid)}}
+@String {Belleten = {Belleten. Türk Tarih Kurumu}}
+@String {Benacus = {Benàcus. Museo archeologico della Val Tenesi}}
+@String {BerBayDenkmPfl = {Bericht der Bayerischen Bodendenkmalpflege}}
+@String {BerDFG = {Bericht der Deutschen Forschungsgemeinschaft}}
+@String {BerlBeitrArchaeom = {Berliner Beiträge zur Archäometrie}}%*Abweichung!
+@String {BerlBlVFruehGesch = {Berliner Blätter für Vor- und Frühgeschichte}}%*Abweichung!
+@String {BerlJbVFruehGesch = {Berliner Jahrbuch für Vor- und Frühgeschichte}}%*Abweichung!
+@String {BerlMus = {Berliner Museen}}
+@String {BerlNumZ = {Berliner numismatische Zeitschrift}}
+@String {BerOudhBod = {Berichten van de Rijksdienst voor het oudheidkundig bodemonderzoek}}
+@String {BerRGK = {Bericht der Römisch-Germanischen Kommission}}
+@String {BerVerhLeipz = {Berichte über die Verhandlungen der Sächsischen Akademie der Wissenschaften zu Leipzig}}
+@String {Berytus = {Berytus. Archaeological Studies}}
+@String {BEspA = {Boletín. Asociación española de amigos de la arqueología}}
+@String {BEspOr = {Boletín de la Asociación española de orientalistas}}
+@String {BEtOr = {Bulletin d'études orientales}}
+@String {BFilGrPadova = {Bollettino dell'Istituto di filologia greca, Università di Padova}}
+@String {BFilLingSic = {Bollettino. Centro di studi filologici e linguistici siciliani}}
+@String {BFlegr = {Bollettino flegreo. Rivista di storia, arte e scienze}}
+@String {BFoligno = {Bollettino storico della città di Foligno}}
+@String {BHarvMus = {Harvard University Art Museums Bulletin}}
+@String {BIasos = {Bollettino dell'Associazione Iasos di Caria}}
+@String {BibAr = {The Biblical Archaeologist. The American School of Oriental Research New Haven}}
+@String {BiblClOr = {Bibliotheca classica orientalis}}
+@String {BiblSymb = {Bibliographie zur Symbolik, Ikonographie und Mythologie. Internationales Referateorgan}}
+@String {BIBulg = {Izvestija na Archeologičeskija institut. Bulletin de l’Institut d’archéologie}}
+@String {BICS = {Bulletin of the Institute of Classical Studies of the University of London}}
+@String {BIFAO = {Bulletin de l'Institut français d'archéologie orientale}}
+@String {BInfCentumcellae = {Bollettino di informazioni. Associazione archeologica Centumcellae}}
+@String {BInfCESDAE = {Bollettino di informazioni del Centro di studi e documentazione sull'area elima}}
+@String {BiogrZbor = {Biogradski zbornik}}
+@String {BiOr = {Bibliotheca orientalis}}
+@String {BIstOrvieto = {Bollettino dell'Istituto storico artistico orvietano}}
+@String {BJaen = {Boletín del Instituto de estudios giennenses}}%*Abweichung!
+@String {BJb = {Bonner Jahrbücher des Rheinischen Landesmuseums in Bonn}}
+@String {BJerus = {Bulletin. The Hebrew University, Jerusalem, Rabinowitz Fund}}
+@String {BLaborMusLouvre = {Bulletin du laboratoire du Musée du Louvre}}
+@String {BLazioMerid = {Bollettino dell'Istituto di storia e di arte del Lazio meridionale}}
+@String {BLikUm = {Bulletin Razreda za likovne umjetnosti Hrvatske akademije znanosti i umjetnosti}}
+@String {BlMueFreundeF = {Blätter für Münzfreunde und Münzforschung}}%*Abweichung!
+@String {BLugo = {Boletín de la Comisión provincial de monumentos históricos y artísticos de Lugo}}
+@String {BMCGreekCoins = {Catalogue of the Greek Coins in the British Museums}}%*Abweichung!
+@String {BMCOR = {Catalogue of Oriental Coins in the British Museum I--X}}
+@String {BMCRE = {H. Mattingly (u. a.), Coins of the Roman Empire in the British Museum (London 1923--1950; \textsuperscript{2}1975)}}
+@String {BMCRRI-III = {H. A. Grueber, Coins of the Roman Republic in the British Museum I--III (London 1910)}}%*Abweichung!
+@String {BMetrMus = {The Metropolitan Museum of Art Bulletin}}
+@String {BMon = {Bulletin monumental}}
+@String {BMonMusPont = {Bollettino. Monumenti, musei e gallerie pontificie}}
+@String {BMQ = {The British Museum Quarterly}}
+@String {BMQNSuppl = {The British Museum Quarterly. News Supplement}}
+@String {BMusBeyrouth = {Bulletin du Musée de Beyrouth}}
+@String {BMusBrux = {Bulletin des Musées royaux d'art et d'histoire, Bruxelles}}
+@String {BMusCadiz = {Boletín del Museo de Cádiz}}
+@String {BMusCivRom = {Bullettino del Museo della civiltà romana}}
+@String {BMusFA = {Bulletin. Museum of Fine Arts, Boston}}
+@String {BMusHongr = {Bulletin du Musée hongrois des beaux-arts}}
+@String {BMusMadr = {Boletín del Museo arqueológico nacional, Madrid}}
+@String {BMusMich = {Bulletin. Museums of Art and Archaeology, University of Michigan}}
+@String {BMusMonaco = {Bulletin du Musée d'anthropologie préhistorique de Monaco}}
+@String {BMusPadova = {Bollettino del Museo civico di Padova}}
+@String {BMusPBelArt = {Boletín del Museo provincial de bellas artes}}
+@String {BMusRom = {Bollettino dei Musei comunali di Roma}}
+@String {BMusVars = {Bulletin du Musée national de Varsovie}}
+@String {BMusZaragoza = {Museo de Zaragoza. Boletín}}
+@String {BNumParis = {Bulletin de la Société française de numismatique}}
+@String {BNumRoma = {Bollettino di numismatica}}
+@String {Bogazkoey-Hattusa = {Boğazköy-Hattuša. Ergebnisse der Ausgrabungen}}%*Abweichung!
+@String {Bolskan = {Bolskan. Revista de arqueología del Instituto de estudios Altoaragoneses, revista de arqueología Oscense}}
+@String {BonnHVg = {Bonner Hefte zur Vorgeschichte}}
+@String {BOntMus = {Bulletin of the Royal Ontario Museum of Archaeology, University of Toronto}}
+@String {Boreas = {Boreas. Münstersche Beiträge zur Archäologie}}
+@String {BoreasUpps = {Boreas. Uppsala Studies in Ancient Mediterranean and Near Eastern Civilization}}
+@String {BPeintRom = {Bulletin de liaison. Centre d'études des peintures murales romaines}}
+@String {BPI = {Bullettino di paletnologia italiana}}
+@String {BPrehistAlp = {Bulletin d'études préhistoriques alpines}}%*Abweichung!
+@String {BProAvent = {Bulletin de l'Association Pro Aventico}}
+@String {BProvidence = {Bulletin of the Rhode Island School of Design. Museum Notes}}
+@String {BracAug = {Bracara Augusta. Revista cultural da Câmara municipal de Braga}}
+@String {BracaraAugusta = {Bracara Augusta. Revista cultural da Câmara municipal de Braga}}
+@String {BremABl = {Bremer archäologische Blätter}}
+@String {BRest = {Bollettino dell'Istituto centrale del restauro}}
+@String {Brigantium = {Brigantium. Museo arqueolóxico e histórico}}
+@String {BrMusYearbook = {The British Museum Yearbook}}
+@String {BSA = {The Annual of the British School at Athens}}
+@String {BSAA = {Boletín del Seminario de estudios de arte y arqueología, Universidad de Valladolid}}
+@String {BSFE = {Bulletin de la Société française d'égyptologie}}
+@String {BSiena = {Bullettino senese di storia patria}}
+@String {BSOAS = {Bulletin of the School of Oriental and African Studies (London)}}
+@String {BSocAChamp = {Bulletin de la Société archéologique champenoise}}
+@String {BSocBiblReinach = {Bulletin de liaison de la Société des amis de la Bibliothèque Salomon Reinach}}
+@String {BSocNumRom = {Buletinul Societăţii numismatice române}}
+@String {BSR = {Papers of the British School at Rome}}
+@String {BStLat = {Bollettino di studi latini}}
+@String {BStorArt = {Bollettino della Unione storia ed arte}}
+@String {BTextilAnc = {Bulletin du Centre international d'étude des textiles anciens}}
+@String {BTorino = {Bollettino della Società piemontese di archeologia e belle arti}}
+@String {BTravTun = {Bulletin des travaux de l'Institut national du patrimoine. Comptes rendus}}
+@String {BudReg = {Budapest régiségei}}
+@String {BulletinGetty = {Bulletin. J. Paul Getty Museum of Art}}
+@String {BulletinNorthampton = {Bulletin. Smith College Museum of Art}}
+@String {BVallad = {Boletín del Seminario de estudios de arte y arqueología, Universidad de Valladolid}}
+@String {BVitoria = {Boletín de la Institución »Sancho el Sabio«}}
+@String {BWaltersArtGal = {The Walters Art Gallery Bulletin}}
+@String {BWPr = {Winckelmannsprogramm der Archäologischen Gesellschaft zu Berlin}}
+@String {Byzantina = {Βυζαντινά. Επιστημονικόν Όργανον Κέντρου Βυζαντινών Ερευνών Φιλοσοφικής Σχολής Αριστοτελείου Πανεπιστημίου Θεσσαλονίκης}}
+@String {ByzF = {Byzantinische Forschungen. Internationale Zeitschrift für Byzantinistik}}
+@String {ByzJb = {Byzantinisch-neugriechische Jahrbücher}}
+@String {ByzZ = {Byzantinische Zeitschrift}}
+@String {BZ = {Biblische Zeitschrift}}
+@String {CAA = {Corpus antiquitatum Aegyptiacarum}}
+@String {CAD = {The Assyrian Dictionary of the Oriental Institute of the University of Chicago}}
+@String {CadA = {Cadernos de arqueologia}}
+@String {Caesaraugusta = {Caesaraugusta. Publicaciones del Seminario de Arqueología y Numismática Aragonesas}}
+@String {Caesarodunum = {Caesarodunum. Bulletin de l'Institut d'études latines et du Centre de recherches A. Piganiol}}
+@String {CAH = {The Cambridge Ancient History}}
+@String {CahArmeeRom = {Cahiers du Groupe de recherches sur l'armée romaine et les provinces}}
+@String {CahASubaqu = {Cahiers d'archéologie subaquatique}}
+@String {CahByrsa = {Cahiers de Byrsa}}
+@String {CahCEC = {Cahier. Centre d'études chypriotes}}
+@String {CahCerEg = {Cahiers de la céramique égyptienne}}
+@String {CahDelFrIran = {Cahiers de la Délégation française en Iran}}
+@String {CahGlotz = {Cahiers du Centre Gustave-Glotz. Revue reconnue par le CNRS}}
+@String {CahKarnak = {Cahiers de Karnak}}
+@String {CahLig = {Cahiers ligures de préhistoire et de protohistoire}}
+@String {CahMariemont = {Les cahiers de Mariemont. Bulletin du Musée royal de Mariemont}}
+@String {CahMusChampollion = {Cahiers du Musée Champollion. Histoire et archéologie}}
+@String {CahPEg = {Cahiers de recherches de l'Institut de papyrologie et d'égyptologie de Lille. Sociétés urbaines en Égypte et au Soudan}}
+@String {CahRhod = {Cahiers rhodaniens}}
+@String {CahTun = {Cahiers de Tunisie}}
+@String {CalifStClAnt = {California Studies in Classical Antiquity}}
+@String {CambrAJ = {Cambridge Archaeological Journal}}
+@String {CArch = {Cahiers archéologiques}}
+@String {CarinthiaI = {Carinthia I. Geschichtliche und volkskundliche Beiträge zur Heimatkunde Kärntens}}%*Abweichung!
+@String {CarnuntumJb = {Carnuntum-Jahrbuch. Zeitschrift für Archäologie und Kulturgeschichte des Donauraumes}}
+@String {Carpica = {Carpica. Muzeul judeţean de istorie şi artă, Bacău}}
+@String {Carrobbio = {Il Carrobbio. Rivista di studi bolognesi}}
+@String {CAT = {Ch. W. Clairmont, Classical Attic Tombstones (Kilchberg 1993--1995)}}
+@String {CE = {Cuadernos emeritenses}}
+@String {CEDAC = {CEDAC. Bulletin. Centre d'études et de documentation archéologique de la conservation de Cartage}}
+@String {CEFR = {Collection de l'École française de Rome}}
+@String {Celticum = {Celticum. Supplément à Ogam}}
+@String {CercA = {Cercetriarheologice}}
+@String {CercNum = {Cercetări numismatice. Muzeul naţional de istorie}}
+@String {Chiron = {Chiron. Mitteilungen der Kommission für Alte Geschichte und Epigraphik des Deutschen Archäologischen Instituts}}
+@String {ChronEg = {Chronique d'Égypte}}
+@String {CIA = {Corpus inscriptionum Atticarum}}
+@String {CIE = {Corpus inscriptionum Etruscarum}}
+@String {CIG = {Corpus inscriptionum Graecarum}}
+@String {CIH = {Corpus inscriptionum Semiticarum. Pars quarta. Inscriptiones himyariticas et sabaeas continens}}
+@String {CIL = {Corpus inscriptionum Latinarum}}
+@String {CincArtB = {The Cincinnati Art Museum Bulletin}}
+@String {CIS = {Corpus inscriptionum Semiticarum}}
+@String {CIstAMilano = {Contributi dell'Istituto di archeologia. Pubblicazioni dell'Università cattolica del Sacro Cuore, Milano}}
+@String {CivClCr = {Civiltà classica e cristiana}}
+@String {CivPad = {Civiltà padana. Archeologia e storia del territorio}}
+@String {ClAnt = {Classical Antiquity}}
+@String {ClevStHistArt = {Cleveland Studies in the History of Art}}
+@String {Clio = {Clio. Revista do Centro de história da Universidade Lisboa}}
+@String {ClIre = {Classics Ireland}}
+@String {ClJ = {The Classical Journal}}
+@String {ClMediaev = {Classica et mediaevalia. Revue danoise de philologie et d'histoire}}
+@String {ClPhil = {Classical Philology}}
+@String {ClQ = {The Classical Quarterly}}
+@String {ClR = {The Classical Review}}
+@String {ClRh = {Clara Rhodos}}
+@String {CMatAOr = {Contributi e materiali di archeologia orientale}}
+@String {CMGr = {Convegni di studi sulla Magna Grecia}}
+@String {CMS = {Corpus der minoischen und mykenischen Siegel}}
+@String {CoinHoards = {Coin Hoards. The Royal Numismatic Society, London}}%*Abweichung!
+@String {ColloquiSod = {Colloqui del Sodalizio}}
+@String {CommunicAHung = {Communicationes archaeologicae hungaricae}}
+@String {Complutum = {Complutum. Publicaciones del Departamento de prehistoria de la Universidad complutense de Madrid}}
+@String {Conoscenze = {Conoscenze. Rivista annuale della Soprintendenza archeologica e per i beni ambientali, architettonici, artistici e storici del Molise}}
+@String {Corduba = {Corduba archaeologica}}
+@String {Corinth = {Corinth. Results of Excavations Conducted by the American School of Classical Studies at Athens}}
+@String {CRAI = {Académie des inscriptions et belles-lettres. Comptes rendus des séances de l'Académie}}
+@String {CretAnt = {Creta antica. Rivista annuale di studi archeologici, storici ed epigrafici}}
+@String {CretSt = {Cretan Studies}}
+@String {CronA = {Cronache di archeologia}}
+@String {CronErcol = {Cronache ercolanesi. Bollettino del Centro internazionale per lo studio dei papiri ercolanesi}}
+@String {CronPomp = {Cronache pompeiane}}
+@String {CRPetersbourg = {Compte-rendu de la Commission impériale archéologique, St. Pétersbourg}}%*Abweichung!
+@String {CSE = {Corpus speculorum Etruscorum}}
+@String {CSIR = {Corpus signorum Imperii Romani}}
+@String {CSSpecPisa = {Contributi della Scuola di specializzazione in archeologia dell'Università degli studi di Pisa}}
+@String {CuadAMed = {Cuadernos de arqueología mediterránea}}
+@String {CuadArquitRom = {Cuadernos de arquitectura romana}}
+@String {CuadCastellon = {Cuadernos de prehistoria y arqueología castellonense}}
+@String {CuadCat = {Cuaderni catanesi di studi classici e medievali}}
+@String {CuadFilCl = {Cuadernos de filología clásica. Facultad de letras y filosofía, Universidad de Madrid}}
+@String {CuadGallegos = {Cuadernos de estudios gallegos}}
+@String {CuadGranada = {Cuadernos de prehistoria de la Universidad de Granada}}
+@String {CuadNavarra = {Cuadernos de arqueología de la Universidad de Navarra}}
+@String {CuadPrehistA = {Cuadernos de prehistoria y arqueología. Universidad autónoma de Madrid}}
+@String {CuadRom = {Cuadernos de trabajos de la Escuela española de historia y arqueología en Roma}}
+@String {CuPaUAM = {Cuadernos de prehistoria y arqueología. Universidad autónoma de Madrid}}
+@String {CVA = {Corpus vasorum antiquorum}}
+@String {CZero = {Cota Zero. Revista d'arqueologia i ciencia}}
+@String {DAA = {Denkmäler antiker Architektur}}
+@String {Dacia = {Dacia. Revue d'archéologie et d'histoire ancienne}}
+@String {DACL = {Dictionnaire d'archéologie chrétienne et de liturgie}}
+@String {Dacoromania = {Dacoromania. Jahrbuch für östliche Latinität}}
+@String {DaF = {Damaszener Forschungen}}
+@String {Daidalos = {Daidalos. Studi e ricerche del Dipartimento di scienze del mondo antico}}
+@String {DAIGeschDok = {Das Deutsche Archäologische Institut. Geschichte und Dokumente}}
+@String {DaM = {Damaszener Mitteilungen}}
+@String {Daremberg-Saglio = {Dictionnaire des antiquités grecques et romaines d'après les textes et les monuments. Ouvrage rédigé sous la direction de Ch. Daremberg et E. Saglio}}%*Abweichung!
+@String {DebrecMuzEvk = {A Debreceni Déri múzeum évkönyve}}
+@String {Dedalo = {Dédalo. Revista de arte e arqueologia}}%*Abweichung!
+@String {Delos = {Exploration archéologique de Délos faite par l'École française d'Athènes}}%*Abweichung!
+@String {DeltChrA = {Δελτίον της Χριστιανικής Αρχαιολογικής Εταιρείας}}
+@String {Demircihueyuek = {Demircihüyük. Die Ergebnisse der Ausgrabungen 1975--1978}}%*Abweichung!
+@String {DeMuseus = {De museus. Quaderns de museologia i museografia}}
+@String {DenkmPflBadWuert = {Denkmalpflege in Baden-Württemberg}}%*Abweichung!
+@String {DenkschrWien = {Österreichische Akademie der Wissenschaften, Philosophisch-Historische Klasse. Denkschriften}}
+@String {Diadora = {Diadora. Glasilo arheoloskog muzeja u Zadru}}
+@String {DialA = {Dialoghi di archeologia}}
+@String {DialHistAnc = {Dialogues d'histoire ancienne}}
+@String {Dike = {Dike. Rivista di storia del diritto greco ed ellenistico. Università degli studi di Milano. Facoltà di giurisprudenza}}
+@String {Dioniso = {Dioniso. Annale della Fondazione INDA, Istituto nazionale del dramma antico}}
+@String {DiskAB = {Diskussionen zur archäologischen Bauforschung}}
+@String {DKuDenkmPfl = {Deutsche Kunst und Denkmalpflege}}
+@String {DLZ = {Deutsche Literaturzeitung für Kritik der internationalen Wissenschaft}}
+@String {DNP = {Der Neue Pauly. Enzyklopädie der Antike}}
+@String {DocAlb = {Documenta Albana}}
+@String {DocALouv = {Documents d'archéologie régionale. Université catholique de Louvain}}
+@String {DocAMerid = {Documents d'archéologie méridionale}}
+@String {DocEmRom = {Documenti. Istituto per i beni artistici, culturali, naturali della regione Emilia-Romagna}}
+@String {Dodone = {Δωδώνη}}
+@String {DOP = {Dumbarton Oaks Papers}}
+@String {DossAlet = {Les dossiers du Centre régional archéologique d'Alet}}
+@String {DossAParis = {Les dossiers d'archéologie}}
+@String {Dura-Europos = {The Excavations at Dura-Europos Conducted by Yale University and the French Academy of Inscriptions and Letters}}
+@String {EAA = {Enciclopedia dell'arte antica classica e orientale}}
+@String {EAE = {Excavaciones arqueológicas en España}}
+@String {EastWest = {East and West}}
+@String {EcAntNimes = {École antique de Nîmes. Bulletin annuel}}
+@String {EchosCl = {Echos du monde classique. Classical Views}}
+@String {eDAI-F = {e-Forschungsberichte des Deutschen Archäologischen Instituts}}
+@String {eDAI-J = {e-Jahresberichte des Deutschen Archäologischen Instituts}}
+@String {EgA = {Egyptian Archaeology. The Bulletin of the Egypt Exploration Society}}
+@String {Egnatia = {Εγνατία. Επιστημονική Επετηρίδα της Φιλοσοφικής Σχολής, Αριστοτέλειο Πανεπιστήμιο Θεσσαλονίκης, Τμήμα Ιστορίας και Αρχαιολογίας}}
+@String {EgVicOr = {Egitto e Vicino Oriente}}
+@String {Eikasmos = {Εικασμός. Quaderni bolognesi di filologia classica}}
+@String {Eirene = {Eirene. Studia Graeca et Latina}}
+@String {Elenchos = {Elenchos. Rivista di studi sul pensiero antico}}
+@String {Ellenika = {Ελληνικά. Φιλολογικόν, Ιστορικόν και Λαογραφικόν Περιοδικόν Σύγγραμμα}}
+@String {Emerita = {Emerita. Revista de linguistica y filología clasica}}
+@String {EmPrerom = {Emilia preromana}}
+@String {Empuries = {Empúries. Revista de prehistòria, arqueologia i etnologia}}%*Abweichung!
+@String {Enalia = {Ενάλια}}
+@String {EnaliaAnn = {Enalia. Annual. English Edition of the Hellenic Institute of Marine Archaeology}}
+@String {Enchoria = {Enchoria. Zeitschrift für Demotistik und Koptologie}}
+@String {Eos = {Eos. Commentarii Societatis philologae Polonorum}}
+@String {EpetBoiotMel = {Επετηρίς της Εταιρείας Βοιωτικών Μελετών}}
+@String {EpetByzSpud = {Επετηρίς της Εταιρείας Βυζαντινών Σπουδών}}
+@String {EpetKyklMel = {Επετηρίς της Εταιρείας Κυκλαδικών Μελετών}}
+@String {EphemDac = {Ephemeris Dacoromana. Annuario della Scuola Romena di Roma}}
+@String {EphemNapoc = {Ephemeris Napocensis}}
+@String {EpigrAnat = {Epigraphica Anatolica. Zeitschrift für Epigraphik und historische Geographie Anatoliens}}
+@String {EpistEpetAth = {Επιστημονική Επετηρίς της Φιλοσοφικής Σχολής του Πανεπιστημίου Αθηνών}}
+@String {EpistEpetPolytThess = {Επιστημονική Επετηρίδα της Πολυτεχνικής Σχολής, Αριστοτέλειο Πανεπιστήμιο Θεσσαλονίκης, Τμήμα Αρχιτεκτόνων}}
+@String {EpistEpetThess = {Επιστημονική Επετηρίδα της Φιλοσοφικής Σχολής του Πανεπιστημίου Θεσσαλονίκης}}
+@String {EPRO = {Études préliminaires aux religions orientales dans l'empire romain}}
+@String {Eranos = {Eranos. Acta philologica Suecana}}
+@String {EranosJb = {Eranos-Jahrbuch}}
+@String {Eretria = {Eretria. Fouilles et recherches}}
+@String {Eretz-Israel = {Eretz-Israel. Archaeological, Historical and Geographical Studies}}
+@String {Ergon = {Το Έργον της Αρχαιολογικής Εταιρείας}}
+@String {ESA = {Eurasia septentrionalis antiqua}}
+@String {EspacioHist = {Espacio, tiempo y forma. Revista de la Facultad de geografia e historia. Serie 2, Historia antigua}}
+@String {EstMadr = {Estudios de prehistoria y arqueología madrileñas}}
+@String {EstZaragoza = {Estudios del Seminario de prehistoria, arqueología e historia antigua de la Facultad de filosofía y letras de Zaragoza}}
+@String {EtACl = {Études d'archéologie classique}}
+@String {EtCl = {Les études classiques. Revue trimestrielle de recherche et d'enseignement}}
+@String {EtClAix = {Études classiques. Faculté des lettres et sciences humaines d'Aix}}
+@String {EtCret = {Études crétoises}}
+@String {Ethnos = {Ethnos. Revista do Instituto português de arqueología, história e etnografia}}
+@String {EtP = {Études de papyrologie}}
+@String {EtPezenas = {Études sur Pézenas et l'Hérault}}%*Abweichung!
+@String {EtrSt = {Etruscan Studies. Journal of the Etruscan Foundation}}
+@String {Etruscans = {Etruscans. Bulletin of the Etruscan Foundation}}
+@String {EtTrav = {Études et travaux. Studia i prace. Travaux du Centre d'archéologie méditerranéenne de l'Académie des sciences polonaise}}
+@String {Eulimene = {Ευλιμένη (Μεσογειακή Αρχαιολογική Εταιρεία)}}
+@String {Eunomia = {Eunomia. Ephemeridis Listy filologické supplementum}}
+@String {Euphrosyne = {Euphrosyne. Revista de filologia clássica}}
+@String {EurAnt = {Eurasia antiqua}}
+@String {EurRHist = {European Review of History. Revue européenne d'histoire}}
+@String {Eutopia = {Eutopia. Commentarii novi de antiquitatibus totius Europae}}
+@String {EVP = {J. D. Beazley, Etruscan Vase Painting (Oxford 1947)}}
+@String {ExcIsr = {Excavations and Surveys in Israel}}
+@String {Expedition = {Expedition. The Magazine of Archaeology, Anthropology}}
+@String {ExtremA = {Extremadura arqueológica}}
+@String {FA = {Fasti archaeologici}}
+@String {FAAK = {Forschungen zur Archäologie Außereuropäischer Kulturen}}
+@String {Faenza = {Faenza. Bollettino del Museo internazionale delle ceramiche in Faenza. Rivista bimestrale di studi storici e di tecnica dell'arte ceramica}}
+@String {FAVA = {Forschungen zur Allgemeinen und Vergleichenden Archäologie}}
+@String {Faventia = {Faventia. Departement de clássiques, Facultat de letres, Universitat autónoma de Barcelona}}
+@String {FBerBadWuert = {Forschungen und Berichte zur Vor- und Frühgeschichte in Baden-"-Württemberg}}%*Abweichung!
+@String {FdC = {Fouilles de Conimbriga. Publiées sous la direction de J. Alarcão et R. Etienne}}
+@String {FdD = {Fouilles de Delphes}}
+@String {FdX = {Fouilles de Xanthos}}
+@String {FeddersenWierde = {Feddersen Wierde. Die Ergebnisse der Ausgrabung der vorgeschichtlichen Wurt Feddersen Wierde bei Bremerhaven in den Jahren 1955 bis 1963}}%*Abweichung!
+@String {FelRav = {Felix Ravenna}}
+@String {FGrHist = {F. Jacoby, Die Fragmente der griechischen Historiker}}
+@String {FHG = {Fragmenta historicorum Graecorum}}
+@String {FiA = {Forschungen in Augst}}
+@String {FichEpigr = {Ficheiro epigráfico. Suplemento de »Conimbriga«}}
+@String {FiE = {Forschungen in Ephesos}}
+@String {FIFAO = {Fouilles de l'Institut français d'archéologie orientale du Caire}}
+@String {Figlina = {Figlina. Documents du Laboratoire de céramologie de Lyon}}
+@String {Florentia = {Florentia. Studi di archeologia}}
+@String {FlorIl = {Florentia Iliberritana. Revista de estudios de antigüedad clásica}}
+@String {FMRD = {Die Fundmünzen der römischen Zeit in Deutschland}}
+@String {FMROe = {Fundmünzen der römischen Zeit in Österreich}}%*Abweichung!
+@String {FoggArtMusAcqu = {Fogg Art Museum. Acquisitions}}
+@String {FolA = {Folia archaeologica}}
+@String {FolOr = {Folia orientalia}}
+@String {Fonaments = {Fonaments. Prehistòria i mon antic als Paisos Catalans}}
+@String {Fondamenti = {Fondamenti. Rivista quadrimestrale di cultura}}
+@String {FontAPos = {Fontes archaeologici Posnanienses}}
+@String {Fontes = {Fontes. Rivista di filologia, iconografia e storia della tradizione classica}}
+@String {Forlimpopoli = {Forlimpopoli. Documenti e studi}}
+@String {Fornvaennen = {Fornvännen. Tidskrift för svensk antikvarisk forskning}}%*Abweichung!
+@String {Forum = {Forum. Revue du Groupe d'archéologie antique}}
+@String {FR = {A. Furtwängler – K. Reichhold, Griechische Vasenmalerei (München 1900--1925)}}
+@String {FruehMitAltSt = {Frühmittelalterliche Studien. Jahrbuch des Instituts für Frühmittelalterforschung der Universität Münster}}%*Abweichung!
+@String {FuAusgrTrier = {Funde und Ausgrabungen im Bezirk Trier}}
+@String {FuB = {Forschungen und Berichte. Staatliche Museen zu Berlin}}
+@String {FuBerBadWuert = {Fundberichte aus Baden-Württemberg}}%*Abweichung!
+@String {FuBerHessen = {Fundberichte aus Hessen}}
+@String {FuBerOe = {Fundberichte aus Österreich}}%*Abweichung!
+@String {FuBerSchwab = {Fundberichte aus Schwaben}}
+@String {FuF = {Forschungen und Fortschritte}}
+@String {FuWien = {Fundort Wien. Berichte zur Archäologie}}
+@String {GacNum = {Gaceta numismática}}
+@String {Gades = {Gades. Revista del Colegio universitario de filosofía y letras}}
+@String {Gallaecia = {Gallaecia. Publicación del Departamento de prehistoria y arqueología}}
+@String {Gallia = {Gallia. Fouilles et monuments archéologiques en France metropolitaine}}
+@String {GalliaInf = {Gallia informations. Préhistoire et histoire}}
+@String {GalliaInfAReg = {Gallia informations. L'archéologie des régions}}
+@String {GalliaPrehist = {Gallia préhistoire. Archéologie de la France préhistorique}}
+@String {GaR = {Greece and Rome}}
+@String {GazBA = {Gazette des beaux-arts}}
+@String {Genava = {Genava. Revue d'histoire de l'art et d'archéologie}}
+@String {GeoAnt = {Geographia antiqua. Rivista di geografia storica del mondo antico e di storia della geografia}}
+@String {Germania = {Germania. Anzeiger der Römisch-Germanischen Kommission des Deutschen Archäologischen Instituts}}
+@String {Gesta = {Gesta. International Center of Medieval Art}}
+@String {GettyMusJ = {The J. Paul Getty Museum Journal}}
+@String {GFA = {Göttinger Forum für Altertumswissenschaft}}
+@String {GGA = {Göttingische Gelehrte Anzeigen}}
+@String {GiornFilFerr = {Giornale filologico ferrarese}}
+@String {GiornItFil = {Giornale italiano di filologia}}
+@String {GiornStorLun = {Giornale storico della Lunigiana e del territorio lucense}}
+@String {GiRoccPalermo = {Giglio di roccia}}
+@String {Gladius = {Gladius. Estudios sobre armas antiguas, armamento, arte militar y vida cultural en Oriente y Occidente}}
+@String {GlasAJ = {Glasgow Archaeological Journal}}
+@String {GlasBeograd = {GlasnikSrpskoarheolokodrutvo}}
+@String {GlasSarajevo = {Glasnik Zemaljskog muzeja Bosne i Hercegovie u Sarajevu. Arheologija}}
+@String {Glotta = {Glotta. Zeitschrift für griechische und lateinische Sprache}}
+@String {Gnomon = {Gnomon. Kritische Zeitschrift für die gesamte klassische Altertumswissenschaft}}
+@String {GodDepA = {Godišnik na Departament archeologija}}
+@String {GodMuzPlov = {Godišnik na Archeologičeski muzej Plovdiv. Annuaire du Musée archéologique Plovdiv}}
+@String {GodMuzSof = {Godišnik na Nacionalnija archeologičeski muzej. Annuaire du Musée national archéologique (Sofia)}}
+@String {GodZborSkopje = {Godišen zbornik na Filozofskiot fakultet na Universitetot vo Skopje}}
+@String {GorLet = {Goriški letnik. Zbornik Goriškega muzeja}}
+@String {GoettMisz = {Göttinger Miszellen. Beiträge zur ägyptologischen Diskussion}}%*Abweichung!
+@String {GraRaspr = {Građa i rasprave. Arheološki muzej Istre, Pula}}
+@String {GrazBeitr = {Grazer Beiträge. Zeitschrift für die Klassische Altertumswissenschaft}}
+@String {GrLatOr = {Graecolatina et orientalia. Zborník Filozofickej fakulty Univerzity Komenského}}
+@String {GrLatPrag = {Graecolatina Pragensia. Acta Universitatis Carolinae. Philologica}}
+@String {GrRomByzSt = {Greek, Roman and Byzantine Studies}}
+@String {Gymnasium = {Gymnasium. Zeitschrift für Kultur der Antike und humanistische Bildung}}
+@String {Habis = {Habis. Universidad de Sevilla. Arqueología, filología clásica}}
+@String {HallWPr = {Hallisches Winckelmannsprogramm}}
+@String {Hama = {Hama. Fouilles et recherches de la Fondation Carlsberg}}
+@String {HambBeitrA = {Hamburger Beiträge zur Archäologie}}
+@String {HambBeitrNum = {Hamburger Beiträge zur Numismatik}}
+@String {Handlingar = {Kungliga vitterhets historie och antikvitets akademiens handlingar. Antikvariska serien}}
+@String {HarvStClPhil = {Harvard Studies in Classical Philology}}
+@String {HarvTheolR = {The Harvard Theological Review}}
+@String {HASB = {Hefte des Archäologischen Seminars der Universität Bern}}
+@String {HAW = {Handbuch der Altertumswissenschaften}}
+@String {HdArch = {Handbuch der Archäologie}}
+@String {Head = {B. V. Head, Historia Numorum. A Manual of Greek Numismatics (Oxford 1887; 1911)}}
+@String {Helbig = {W. Helbig, Führer durch die öffentlichen Sammlungen klassischer Altertümer in Rom}}
+@String {Helike = {Helike. Universidad nacional de educación a distancia, Centro regional de Elche}}
+@String {Helikon = {Helikon. Rivista di tradizione e cultura classica}}
+@String {Helinium = {Helinium. Revue consacrée à l'archéologie des Pays-Bas, de la Belgique et du Grand-Duché de Luxembourg}}
+@String {Helios = {Helios. A Journal Devoted to Critical and Methodological Studies of Classical Culture, Literature and Society}}
+@String {HellenikaJb = {Hellenika. Jahrbuch für die Freunde Griechenlands}}
+@String {HelvA = {Helvetia archaeologica}}
+@String {Hephaistos = {Hephaistos. Kritische Zeitschrift zur Theorie und Praxis der Archäologie und angrenzender Wissenschaften}}
+@String {Hermes = {Hermes. Zeitschrift für klassische Philologie}}
+@String {Herrscherbild = {Das römische Herrscherbild}}
+@String {Hesperia = {Hesperia. Journal of the American School of Classical Studies at Athens}}
+@String {Hispania = {Hispania. Revista española de historia}}
+@String {HispAnt = {Hispania antiqua. Revista de historia antigua}}
+@String {HispAntEpigr = {Hispania antiqua epigraphica}}
+@String {HispEpigr = {Hispania epigraphica}}
+@String {HistAnthr = {Historische Anthropologie. Kultur, Gesellschaft, Alltag}}
+@String {HistArt = {Histoire de l'art. Bulletin d'information de l'Institut National d'Histoire de l'Art}}
+@String {Historia = {Historia. Zeitschrift für Alte Geschichte}}
+@String {Historica = {Historica. Academia RSR. Centrul de istorie, filologie şi etnografie din Craiova}}
+@String {Histria = {Histria. Les résultats des fouilles}}
+@String {HistriaA = {Histria archaeologica}}
+@String {HistriaAnt = {Histria antiqua. Casopis Meunarodnog Istraivakog Centra za Arheologiju. Journal of the International Research Centre for Archeology}}
+@String {HistSprF = {Historische Sprachforschung}}
+@String {HKL = {R. Borger, Handbuch der Keilschriftliteratur (Berlin 1967--1975)}}
+@String {Horos = {Ηόρος. Ἔνα Ἀρχαιογνωστικò Περιοδικό}}
+@String {HSS = {Harvard Semitic Series}}
+@String {HuelvaA = {Huelva arqueológica}}
+@String {HumBild = {Humanistische Bildung}}
+@String {Hyp = {Hyperboreus. Studia classica}}
+@String {HZ = {Historische Zeitschrift}}
+@String {IA = {Iberia archaeologica}}
+@String {Iberia = {Iberia. Revista della antigüedad}}
+@String {IEJ = {Israel Exploration Journal}}
+@String {IG = {Inscriptiones Graecae}}
+@String {IGCH = {M. Thompson – C. M. Kraay – O. Mørkholm, An Inventory of Greek Coin Hoards (New York 1973)}}
+@String {IGR = {Inscriptiones Graecae ad res Romanas pertinentes}}
+@String {IK = {Inschriften griechischer Städte aus Kleinasien}}
+@String {Ilerda = {Ilerda. Instituto de estudios ilerdenses}}
+@String {Iliria = {Iliria. Revistë arkeologjike}}
+@String {IllinClSt = {Illinois Classical Studies}}
+@String {ILN = {The Illustrated London News}}
+@String {ILS = {H. Dessau, Inscriptiones Latinae selectae (Berlin 1892--1916)}}
+@String {IndexQuad = {Index. Quaderni camerti di studi romanistici}}
+@String {IndogermF = {Indogermanische Forschungen}}
+@String {IndUnArtB = {Indiana University Art Museum Bulletin}}
+@String {InsFulc = {Insula Fulcheria}}
+@String {InstNautAQ = {The Institute of Nautical Archaeology Quarterly}}
+@String {IntJClTrad = {International Journal of the Classical Tradition}}
+@String {IntJNautA = {International Journal of Nautical Archaeology}}
+@String {IntZSchauBibelWiss = {Internationale Zeitschriftenschau für Bibelwissenschaft und Grenzgebiete}}
+@String {InvLuc = {Invigilata lucernis}}
+@String {Ipek = {Jahrbuch für prähistorische und ethnographische Kunst}}
+@String {Iran = {Iran. Journal of the British Institute of Persian Studies}}
+@String {IrAnt = {Iranica antiqua}}
+@String {IsrMusJ = {The Israel Museum Journal}}
+@String {IsrMusN = {The Israel Museum News}}
+@String {IsrMusStA = {Israel Museum Studies in Archaeology. An Annual Publication by the Samuel Bronfman Biblical and Archaeological Museum of the Israel Museum, Jerusalem}}
+@String {IsrNumJ = {Israel Numismatic Journal}}
+@String {IstanbAMuezYil = {Istanbul Arkeoloji Müzeleri yıllığı}}%*Abweichung!
+@String {IstForsch = {Istanbuler Forschungen}}
+@String {Isthmia = {Isthmia. Excavations by the University of Chicago under the Auspices of the American School of Classical Studies at Athens}}
+@String {IstMitt = {Istanbuler Mitteilungen}}
+@String {Italica = {Italica. Cuadernos de trabajos de la Escuela española de historia y arqueología en Roma}}
+@String {ItNostr = {Italia nostra}}
+@String {IzvBurgas = {Izvestija na Narodnija muzej Burgas. Bulletin du Musée national de Bourgas}}
+@String {IzvMuzJuzBalg = {Izvestija na muzeite ot Južna Bălgarija. Bulletin des musées de la Bulgarie du Sud}}%*Abweichung
+@String {IzvVarna = {Izvestija na Narodnija muzej Varna}}
+@String {Jabega = {Jábega. Revista de la Disputación provincial de Málaga}}%*Abweichung!
+@String {JadrZbor = {Jadranski zbornik. Prilozi za povijest Istre, Rijeke i Hrvatskog primorja}}
+@String {JAOS = {Journal of the American Oriental Society}}
+@String {JARCE = {Journal of the American Research Center in Egypt}}
+@String {JASc = {Journal of Archaeological Science}}
+@String {JbAC = {Jahrbuch für Antike und Christentum}}
+@String {JbAkMainz = {Jahrbuch. Akademie der Wissenschaften und der Literatur, Mainz}}
+@String {JbBadWuert = {Jahrbuch der Staatlichen Kunstsammlungen in Baden-Württemberg}}%*Abweichung!
+@String {JbBerlMus = {Jahrbuch der Berliner Museen}}
+@String {JbBernHistMus = {Jahrbuch des Bernischen Historischen Museums in Bern}}
+@String {JberAugst = {Jahresberichte aus Augst und Kaiseraugst}}
+@String {JberBasel = {Jahresbericht der Archäologischen Bodenforschung des Kantons Basel-Stadt}}
+@String {JberBayDenkmPfl = {Jahresbericht der Bayerischen Bodendenkmalpflege}}
+@String {JberProVindon = {Jahresbericht. Gesellschaft Pro Vindonissa}}
+@String {JberVgFrankf = {Jahresbericht des Instituts für Vorgeschichte der Universität Frankfurt a. M.}}
+@String {JberZuerich = {Jahresbericht. Schweizerisches Landesmuseum Zürich}}%*Abweichung!
+@String {JbGoett = {Jahrbuch der Akademie der Wissenschaften in Göttingen}}%*Abweichung!
+@String {JbHambKuSamml = {Jahrbuch der Hamburger Kunstsammlungen}}
+@String {JbKHMWien = {Jahrbuch des Kunsthistorischen Museums Wien}}
+@String {JbKHSWien = {Jahrbuch der Kunsthistorischen Sammlungen in Wien}}
+@String {JbKleinasF = {Jahrbuch für kleinasiatische Forschung}}
+@String {JbMuench = {Bayerische Akademie der Wissenschaften. Jahrbuch}}%*Abweichung!
+@String {JbMusKGHamb = {Jahrbuch des Museums für Kunst und Gewerbe, Hamburg}}
+@String {JbMusLinz = {Jahrbuch des Oberösterreichischen Musealvereins}}
+@String {JbOeByz = {Jahrbuch der Österreichischen Byzantinistik}}%*Abweichung!
+@String {JbPreussKul = {Jahrbuch Preussischer Kulturbesitz}}
+@String {JbRGZM = {Jahrbuch des Römisch-Germanischen Zentralmuseums Mainz}}
+@String {JbSchwUrgesch = {Jahrbuch der Schweizerischen Gesellschaft für Ur- und Frühgeschichte}}
+@String {JCS = {Journal of Cuneiform Studies}}
+@String {JdI = {Jahrbuch des Deutschen Archäologischen Instituts}}
+@String {JEA = {The Journal of Egyptian Archaeology}}
+@String {JEChrSt = {Journal of Early Christian Studies. Journal of the North American Patristics Society}}
+@String {JEOL = {Jaarbericht van het Vooraziatisch-Egyptisch Genootschap Ex Oriente Lux}}
+@String {JewelSt = {Jewellery Studies}}
+@String {JFieldA = {Journal of Field Archaeology}}
+@String {JGS = {Journal of Glass Studies}}
+@String {JHS = {The Journal of Hellenic Studies}}
+@String {JIbA = {Journal of Iberian Archaeology}}
+@String {JJurP = {The Journal of Juristic Papyrology}}
+@String {JKuGesch = {Journal für Kunstgeschichte}}
+@String {JMedA = {Journal of Mediterranean Archaeology}}
+@String {JMedAnthrA = {Journal of Mediterranean Anthropology and Archaeology}}
+@String {JMithrSt = {Journal of Mithraic Studies}}
+@String {JNES = {Journal of Near Eastern Studies}}
+@String {JNG = {Jahrbuch für Numismatik und Geldgeschichte}}
+@String {JPrehistRel = {Journal of Prehistoric Religion}}
+@String {JRA = {Journal of Roman Archaeology}}
+@String {JRomMilSt = {Journal of Roman Military Equipment Studies}}
+@String {JRomPotSt = {Journal of Roman Pottery Studies}}
+@String {JRS = {Journal of Roman Studies}}
+@String {JSav = {Journal des savants}}
+@String {JSchrVgHalle = {Jahresschrift für mitteldeutsche Vorgeschichte}}
+@String {JSS = {Journal of Semitic Studies}}
+@String {JTheorA = {Journal of Theoretical Archaeology}}
+@String {Jura = {Iura. Rivista internazionale di diritto romano e antico}}
+@String {JWaltersArtGal = {The Journal of the Walters Art Gallery}}
+@String {JWCI = {Journal of the Warburg and Courtauld Institutes}}
+@String {Kadmos = {Kadmos. Zeitschrift für vor- und frühgriechische Epigraphik}}
+@String {Kairos = {Kairos. Zeitschrift für Judaistik und Religionswissenschaft}}
+@String {Kalapodi = {Kalapodi. Ergebnisse der Ausgrabungen im Heiligtum der Artemis und des Apollon von Hyampolis in der antiken Phokis}}
+@String {Kalathos = {Kalathos. Revista del Seminario de arqueología y etnología Turolense, Universidad de Teruel}}
+@String {Kalos = {Kalós. Arte in Sicilia}}%*Abweichung!
+@String {Karthago = {Karthago. Revue d'archéologie mediterranéenne}}
+@String {Kemi = {Kêmi. Revue de philologie et d'archéologie égytiennes et coptes}}%*Abweichung!
+@String {Kenchreai = {Kenchreai. Eastern Port of Corinth. Results of Investigations by the University of Chicago and Indiana University for the American School of Classical Studies at Athens}}
+@String {KentAR = {Kent Archaeological Review}}
+@String {Keos = {Keos. Results of Excavations Conducted by the University of Cincinnati under the Auspices of the American School of Classical Studies at Athens}}
+@String {Kerameikos = {Kerameikos. Ergebnisse der Ausgrabungen}}
+@String {Kernos = {Kernos. Revue internationale et pluridisciplinaire de religion grecque antique}}
+@String {Klearchos = {Klearchos. Bollettino dell'Associazione Amici del Museo nazionale di Reggio Calabria}}
+@String {Kleos = {Kleos. Estemporaneo di studi e testi sulla fortuna dell'antico}}
+@String {Klio = {Klio. Beiträge zur alten Geschichte}}
+@String {Kodai = {Kodai. Journal of Ancient History}}
+@String {KoelnJb = {Kölner Jahrbuch}}%*Abweichung!
+@String {KoelnMusB = {Kölner Museums-Bulletin. Berichte und Forschungen aus den Museen der Stadt Köln}}%*Abweichung!
+@String {Kokalos = {Kώκαλος. Studi pubblicati dall’Istituto di storia antica dell’Università di Palermo}}%*Abweichung!
+@String {KollAVA = {Kolloquien zur Allgemeinen und Vergleichenden Archäologie}}
+@String {Kratylos = {Kratylos. Kritisches Berichts- und Rezensionsorgan für indogermanische und allgemeine Sprachwissenschaft}}
+@String {KretChron = {Κρητικά Χρονικά}}
+@String {KSIA = {Kratkie soobščenija o dokladach i polevych issledovanijach Instituta archeologii}}
+@String {KSIAKiev = {Kratkie soobščenija Instituta archeologii, Kiev}}
+@String {KST = {Kazı Sonuçları Toplantısı}}
+@String {Ktema = {Ktema. Civilisations de l'Orient, de la Grèce et de Rome antiques}}
+@String {KuGeschAnz = {Kunstgeschichtliche Anzeigen}}
+@String {Kuml = {Kuml. Årbog for Jysk Arkaeologisk Selskab}}
+@String {Kunstchronik = {Kunstchronik. Monatsschrift für Kunstwissenschaft, Museumswesen und Denkmalpflege, Mitteilungsblatt des Verbandes Deutscher Kunsthistoriker}}
+@String {KuOr = {Kunst des Orients}}
+@String {Kush = {Kush. Journal of the National Corporation for Antiquities and Museums (NCAM)}}
+@String {KuWeltBerlMus = {Kunst der Welt in den Berliner Museen}}
+@String {KypA = {Κυπριακή Αρχαιολογία. Archaeologia Cypria}}
+@String {KypSpud = {Κυπριακαì Σπουδαί}}
+@String {Labeo = {Labeo. Rassegna di ritritto romano}}
+@String {LAe = {Lexikon der Ägyptologie}}%*Abweichung!
+@String {Laietania = {Laietania. Estudios d'arqueologia del Maresme}}
+@String {Lampas = {Lampas. Tijdschrift voor nederlandse classici}}
+@String {Lancia = {Lancia. Revista de prehistoria, arqueología e historia antigua del noreste peninsular}}
+@String {LandKunVierJBl = {Landeskundliche Vierteljahrsblätter. Trier}}
+@String {LangOrAnc = {Langues orientales anciennes. Philologie et linguistique}}
+@String {Latinitas = {Latinitas. Commentarii linguae Latinae excolendae provehendae}}
+@String {Latomus = {Latomus. Revue d'études latines}}
+@String {Laverna = {Laverna. Beiträge zur Wirtschafts- und Sozialgeschichte der Alten Welt}}
+@String {LCS = {A. D. Trendall, The Red-figured Vases of Lucania, Campania and Sicily (Oxford 1967--­1983)}}
+@String {Levant = {Levant. Journal of the British School of Archaeology in Jerusalem and the British Institute at Amman for Archaeology and History}}
+@String {Lexis = {Lexis. Poetica, retorica e comunicazione nella tradizione classica}}
+@String {LF = {Listy filologické}}
+@String {LibSt = {Libyan Studies}}
+@String {LibyaAnt = {Libya antiqua}}
+@String {LibycaBServAnt = {Libyca. Bulletin du Service des antiquités. Archéologie, épigraphie}}
+@String {LibycaTrav = {Libyca. Travaux du Laboratoire d'anthropologie et d'archéologie préhistorique du Musée du Bardo}}
+@String {Liddell-­Scott-Jones = {G. Liddell – R. Scott – H. S. Jones, A Greek-English Lexikon \textsuperscript{9}(1996); Suppl. (1996)}}%*Abweichung!
+@String {LIMC = {Lexikon iconographicum mythologiae classicae}}
+@String {Limesforschungen = {Limesforschungen. Studien zur Organisation der römischen Reichsgrenze an Rhein und Donau}}
+@String {Lindos = {Lindos. Fouilles et recherches}}
+@String {LingIt = {Linguistica, epigrafia, filologia italica}}
+@String {LTUR = {Lexikon topographicum urbis Romae}}
+@String {Lucentum = {Lucentum. Anales de la Universidad de Alicante. Prehistoria, arqueología e historia antigua}}
+@String {LundAR = {Lund Archaeological Review}}
+@String {Lustrum = {Lustrum. Internationale Forschungsberichte aus dem Bereich des klassischen Altertums}}
+@String {Lykia = {Lykia. Anadolu-akdeniz kültürleri}}
+@String {MacActaA = {Macedoniae acta archaeologica}}
+@String {Maecenas = {Maecenas. Studi sul mondo classico}}
+@String {MAGesGraz = {Mitteilungen der Archäologischen Gesellschaft Graz}}
+@String {MAGesStei = {Mitteilungen der Archäologischen Gesellschaft Steiermark}}
+@String {Maia = {Maia. Rivista di letterature classiche}}
+@String {Mainake = {Mainake. Estudios de arqueología Malagueña}}
+@String {MAInstUngAk = {Mitteilungen des Archäologischen Instituts der Ungarischen Akademie der Wissenschaften}}
+@String {MainzZ = {Mainzer Zeitschrift}}
+@String {MakedNasl = {Makedonsko nasledstvo. Spisanie za arheologija, istorija, istorija na umetnosta i etnologija}}
+@String {Makedonika = {Μακεδονικά. Σύγγραμμα Περιοδικόν της Εταιρείας Μακεδονικών Σπουδών}}
+@String {MAMA = {Monumenta Asiae Minoris antiqua. Publications of the American Society for Archaeological Research in Asia Minor}}
+@String {MAnthrWien = {Mitteilungen der Anthropologischen Gesellschaft in Wien}}
+@String {MARo = {Monumenta artis Romanae}}
+@String {MarbWPr = {Marburger Winckelmann-Programm}}
+@String {Marche = {Le Marche. Archeologia, storia, territorio}}
+@String {Mari = {Mari. Annales de recherches interdisciplinaires}}
+@String {Marisia = {Marisia. Studii şi materiale. Arheologie, istorie, etnografie}}
+@String {MarNero = {Il Mar Nero. Annali di archeologia e storia}}
+@String {Marsyas = {Marsyas. Studies in the History of Art}}
+@String {MascaJ = {Masca Journal. Museum Applied Science Center for Archaeology, University of Pennsylvania}}
+@String {MascaP = {Masca Research Papers in Science and Archaeology}}
+@String {Mastia = {Mastia. Revista del Museo arqueológico municipal de Cartagena}}
+@String {MatABSSR = {Materialy po archeologii BSSR}}
+@String {MatASevPri = {Materialy po archeologii severnogo Pričernomor’ja}}
+@String {MatCercA = {Materiale şi cercetări arheologice}}
+@String {MatIsslA = {Materialy i issledovanija po archeologii SSSR}}
+@String {MatStar = {Materiały starożytne}}
+@String {MatStarWczes = {Materiały starożytne i wczesnośredniowieczne}}
+@String {MatTestiCl = {Materiali e discussioni per l'analisi dei testi classici}}
+@String {MatWczes = {Materiały wczesnośredniowieczne}}
+@String {MAVA = {Materialien zur Allgemeinen und Vergleichenden Archäologie}}
+@String {MB = {Madrider Beiträge}}
+@String {MBAH = {Marburger Beiträge zur antiken Handels-, Wirtschafts- und Sozialgeschichte, vor Jahrgang 2009 Münstersche Beiträge zur antiken Handelsgeschichte}}
+@String {MBlVFruehGesch = {Mitteilungsblatt für Vor- und Frühgeschichte}}%*Abweichung!
+@String {MDAIK = {Mitteilungen des Deutschen Archäologischen Instituts, Abteilung Kairo}}
+@String {MDAVerb = {Mitteilungen des Deutschen Archäologen-Verbandes e.V.}}
+@String {MdI = {Mitteilungen des Deutschen Archäologischen Instituts}}
+@String {MDOG = {Mitteilungen der Deutschen Orient-Gesellschaft zu Berlin}}
+@String {Meander = {Meander. Miesięcznik poświęcony kulturze świata starożytnego}}
+@String {MedA = {Mediterranean Archaeology}}
+@String {MedAnt = {Mediterraneo antico. Economie, società, culture}}
+@String {MeddelGlypt = {Meddelelser fra Ny Carlsberg Glyptotek}}
+@String {MeddelLund = {Meddelanden från Lunds universtitets historiska museum}}
+@String {MeddelThor = {Meddelelser fra Thorvaldsens Museum}}
+@String {MededRom = {Mededelingen van het Nederlands instituut te Rome}}
+@String {MedelhavsMusB = {Medelhavsmuseet. Bulletin}}
+@String {MedHistR = {Mediterranean Historical Review}}
+@String {MedievA = {Medieval Archaeology. Journal of the Society for Medieval Archaeology}}
+@String {MediSec = {Medicina nei secoli. Arte e scienza}}
+@String {MEFRA = {Mélanges de l'École française de Rome. Antiquité}}
+@String {MelBeyrouth = {Mélanges de l'Université Saint-Joseph}}
+@String {MelCasaVelazquez = {Mélanges de la Casa de Velázquez. Antiquité et moyen âge}}
+@String {MemAcInscr = {Mémoires de l'Académie des inscriptions et belles-lettres}}
+@String {MemAmAc = {Memoirs of the American Academy in Rome}}
+@String {MemAnt = {Memoria antiquitatis. Acta Musei Petrodavensis. Revista Muzeului arheologic Piatra Neamţ}}
+@String {MemAntFr = {Mémoires de la Société nationale des antiquaires de France}}
+@String {MemBarcelA = {Memoria. Universidad de Barcelona, Instituto de arqueología y prehistoria}}
+@String {MemBologna = {Atti de la Accademia delle scienze dell'Istituto di Bologna. Memorie}}
+@String {MemHistAnt = {Memorias de historia antigua (Universidad de Oviedo)}}
+@String {MemInstNatFr = {Mémoires de l'Institut national de France}}
+@String {MemLinc = {Atti dell'Accademia nazionale dei Lincei, Classe di scienze morali, storiche e filologiche. Memorie}}
+@String {MemNap = {Memorie dell'Accademia di archeologia, lettere e belle arti di Napoli}}
+@String {MemPontAc = {Atti della Pontificia accademia romana di archeologia. Memorie}}
+@String {MemStor = {Memoria storica. Rivista del Centro studi storici terni}}
+@String {MemStorFriuli = {Memorie storiche forogiuliesi}}
+@String {Merida = {Mérida. Ciudad y patrimonio}}%*Abweichung!
+@String {MeridaMem = {Mérida. Excavaciones arqueológicas. Memoria}}%*Abweichung!
+@String {Meroitica = {Meroitica. Schriften zur altsudanesischen Geschichte und Archäologie}}
+@String {Mesopotamia = {Mesopotamia. Rivista di archeologia}}
+@String {Messana = {Messana. Rassegna di studi filologici, linguistici e storici}}
+@String {Metis = {Métis. Revue d'anthropologie du monde grec ancien}}%*Abweichung!
+@String {MetrMusJ = {Metropolitan Museum Journal}}
+@String {MetrMusSt = {Metropolitan Museum Studies}}
+@String {MF = {Madrider Forschungen}}
+@String {MFruehChrOe = {Mitteilungen zur frühchristlichen Archäologie in Österreich}}%*Abweichung!
+@String {Milet = {Milet. Ergebnisse der Ausgrabungen und Untersuchungen seit dem Jahr 1899}}
+@String {MilForsch = {Milesische Forschungen}}
+@String {MinEpigrP = {Minima epigraphica et papyrologica. Taccuini della cattedra e del laboratorio di epigrafia e papirologia giuridica dell'Università degli studi di Catanzaro »Magna Graecia«}}
+@String {Minerva = {Minerva. Revista de filología clásica}}
+@String {Minos = {Minos. Revista de filología egea}}
+@String {MInstWasser = {Mitteilungen. Leichtweiss-Institut für Wasserbau der Technischen Universität Braunschweig}}
+@String {MIO = {Mitteilungen des Instituts für Orientforschung}}
+@String {MiscCrAnt = {Miscellanea di studi di letteratura christiana antica}}
+@String {MiscStStor = {Miscellanea di studi storici}}
+@String {MitChrA = {Mitteilungen zur christlichen Archäologie}}
+@String {MKT = {Menschen – Kulturen – Traditionen. Studien aus den Forschungsclustern des Deutschen Archäologischen Instituts}}
+@String {MKuHistFlorenz = {Mitteilungen des Kunsthistorischen Institutes in Florenz}}
+@String {MKul = {Mitteilungen zur Kulturkunde}}
+@String {MM = {Madrider Mitteilungen}}
+@String {Mnemosyne = {Mnemosyne. A Journal of Classical Studies}}
+@String {MOeNumGes = {Mitteilungen der Österreichischen Numismatischen Gesellschaft}}%*Abweichung!
+@String {MonAnt = {Monumenti antichi}}
+@String {MonInst = {Monumenti inediti pubblicati dall'Istituto Archeologico}}
+@String {MonPiot = {Monuments et mémoires. Fondation E. Piot}}
+@String {MonPitt = {Monumenti della pittura antica scoperti in Italia}}
+@String {Mozia = {Mozia. Rapporto preliminare della missione congiunta con la Soprintendenza alle antichità della Sicilia occidentale}}
+@String {MPraehistKomWien = {Mitteilungen der Prähistorischen Kommission der Österreichischen Akademie der Wissenschaften}}%*Abweichung!
+@String {MSAtene = {Monografie della Scuola archeologica di Atene e delle missioni italiane in Oriente}}
+@String {MSchliemann = {Mitteilungen aus dem Heinrich-Schliemann-Museum Ankershagen}}
+@String {MSchwUrFruehGesch = {Mitteilungsblatt der Schweizerischen Gesellschaft für Ur- und Frühgeschichte}}%*Abweichung!
+@String {MSpaetAByz = {Mitteilungen zur spätantiken Archäologie und byzantinischen Kunstgeschichte}}%*Abweichung!
+@String {MueJb = {Münchner Jahrbuch der bildenden Kunst}}%*Abweichung!
+@String {MuenchBeitrVFG = {Münchner Beiträge zur Vor- und Frühgeschichte}}%*Abweichung!
+@String {MuenchStSprWiss = {Münchener Studien zur Sprachwissenschaft}}%*Abweichung!
+@String {MuM = {Münzen und Medaillen}}
+@String {MusAfr = {Museum Africum. West African Journal of Classical and Related Studies}}
+@String {MusBenaki = {Μουσείο Μπενάκη}}
+@String {MusCrit = {Museum criticum}}
+@String {Muse = {Muse. Annual of the Museum of Art and Archaeology, University of Missouri, Columbia}}
+@String {Museon = {Le Muséon. Revue d'études orientales}}%*Abweichung!
+@String {MuseumUnesco = {Museum. A Quarterly Review Published by UNESCO}}
+@String {MusFerr = {Musei Ferraresi. Bollettino annuale}}
+@String {MusGalIt = {Musei e gallerie d'Italia}}
+@String {MusHaaretz = {Museum Haaretz, Tel Aviv. Yearbook}}
+@String {MusHelv = {Museum Helveticum}}
+@String {MusKoeln = {Museen in Köln. Bulletin}}%*Abweichung!
+@String {MusNotAmNumSoc = {Museum Notes. The American Numismatic Society}}
+@String {MusPontevedra = {El Museo de Pontevedra}}
+@String {MusRiv = {Museo in rivista. Notiziario dei Musei civici di Pavia}}
+@String {MusTusc = {Museum Tusculanum. København}}
+@String {MuzEvkSzeged = {A Móra Ferenc múzeum évkönyve}}
+@String {MuzNa = {MuzeulnaionalBucureti}}
+@String {MuzPamKul = {Muzei i pametnici na kulturata}}
+@String {NachrArbUWA = {Nachrichtenblatt Arbeitskreis Unterwasserarchäologie}}
+@String {NapNobil = {Napoli nobilissima}}
+@String {NassAnn = {Nassauische Annalen}}
+@String {NAWG = {Nachrichten der Akademie der Wissenschaften in Göttingen. Philologisch-Historische Klasse}}
+@String {NBWorcArtMus = {News Bulletin and Calendar. Worcester Art Museum}}
+@String {NEphemSemEpigr = {Neue Ephemeris für semitische Epigraphik}}
+@String {NewsletterAthen = {Newsletter of the Netherlands Institute at Athens}}
+@String {NewsletterPotTech = {Newsletter. Department of Pottery Technology, University of Leiden}}
+@String {NGWG = {Nachrichten von der Gesellschaft der Wissenschaften zu Göttingen. Philologisch-Historische Klasse}}
+@String {NigCl = {Nigeria and the Classics}}
+@String {Nikephoros = {Nikephoros. Zeitschrift für Sport und Kultur im Altertum}}
+@String {Nin = {Nin. Journal of Gender Studies in Antiquity}}
+@String {NNM = {American Numismatic Society. Numismatic Notes and Monographs}}
+@String {NomChron = {Νομισματικά Χρονικά. Περιοδική Έκδωσις της Ελληνικής Νομισματικής Εταιρείας}}
+@String {Norba = {Norba. Revista de arte, geografía e historia}}
+@String {NordNumArs = {Nordisk numismatisk årsskrift. Utgiven av Kungliga vitterhets historie och antikvitets akademien i samarbete med Nordisk numismatisk union}}
+@String {NotABerg = {Notizie archeologiche bergomensi. Periodico di archeologia del Civico museo archeologico di Bergamo}}
+@String {NotAHisp = {Noticiario arqueológico hispánico. Arqueología}}
+@String {NotAHispPrehistoria = {Noticiario arqueológico hispánico. Prehistoria}}
+@String {NotAllumiere = {Notiziario. Museo civico, Associazione archeologica, Allumiere}}
+@String {NotALomb = {Notiziario. Soprintendenza archeologica della Lombardia}}
+@String {NotMilano = {Notizie dal chiostro del monastero maggiore. Rassegna di studi del Civico museo archeologico e del Civico gabinetto numismatico di Milano}}
+@String {NouvClio = {La nouvelle Clio}}
+@String {Novaensia = {Novaensia. Badania Ekspedycji archeologicznej Uniwersytetu warszawskiego w Novae}}
+@String {NSc = {Notizie degli scavi di antichità}}
+@String {NStFan = {Nuovi studi fanesi}}
+@String {NubChr = {Nubia christiana}}
+@String {NubLet = {Nubian Letters}}
+@String {NueBlA = {Nürnberger Blätter zur Archäologie. Publikationsreihe des Bildungszentrums der Stadt Nürnberg, Fachbereich Archäologie}}%*Abweichung!
+@String {NumAntCl = {Numismatica e antichità classiche. Quaderni ticinesi}}
+@String {Numantia = {Numantia. Investigaciones arqueológicas en Castilla y León}}
+@String {NumChron = {The Numismatic Chronicle. The Journal of the Royal Society}}
+@String {Numen = {Numen. International Review for the History of Religions}}
+@String {NumEpigr = {Numizmatika i epigrafika}}
+@String {Numisma = {Numisma. Revista de la Sociedad iberoamericana de estudios numismáticos}}
+@String {NumismaticaRom = {Numismatica. Periodico di cultura e di informazione numismatica}}
+@String {Numizmaticar = {Numizmatičar. Casopis za anticki i stari jugoslavenski novac}}%*Abweichung!
+@String {Nummus = {Nummus. Sociedade portuguesa de numismatica}}
+@String {NumZ = {Numismatische Zeitschrift}}
+@String {NuovDidask = {Nuovo Didaskaleion}}
+@String {OccasPublClSt = {Occasional Publications in Classical Studies}}
+@String {OccOr = {Occident and Orient}}
+@String {OGIS = {W. Dittenberger, Orientis Graeci inscriptiones selectae (Leipzig 1903--­1905)}}
+@String {OeJh = {Jahreshefte des Österreichischen Archäologischen Institutes in Wien}}%*Abweichung!
+@String {OF = {Olympische Forschungen}}
+@String {Offa = {Offa. Berichte und Mitteilungen zur Urgeschiche, Frühgeschichte und Mittelalterarchäologie}}
+@String {Ogam = {Ogam. Bulletin des Amis de la tradition celtique}}
+@String {Oikumene = {Oikumene. Studia ad historiam antiquam classicam et orientalem pertinentia}}
+@String {OIP = {Oriental Institute Publications}}
+@String {Olba = {Olba. Mersin Üniversitesi Kilikia Arkeolojisini Araştırma Merkezi yayınları}}
+@String {OlBer = {Bericht über die Ausgrabungen in Olympia}}
+@String {Olympia = {Olympia. Die Ergebnisse der von dem Deutschen Reich veranstalteten Ausgrabung (Berlin 1890--­1897)}}
+@String {Olynthus = {Excavations at Olynthus}}
+@String {OLZ = {Orientalistische Literaturzeitung}}
+@String {OpArch = {Skrifter utgivna av Svenska institutet i Rom. Opuscula archaeologica}}
+@String {OpAth = {Opuscula Atheniensia}}
+@String {OpFin = {Opuscula Instituti Romani Finlandiae}}
+@String {OpPomp = {Opuscula Pompeiana}}
+@String {OpRom = {Opuscula Romana}}
+@String {Opus = {Opus. Rivista internazionale per la storia economica e sociale dell’antichità}}
+@String {Or = {Orientalia (Pontificio Istituto biblico)}}
+@String {OrA = {Orient-Archäologie}}
+@String {OrAnt = {Oriens antiquus. Rivista del Centro per le antichità e la storia dell’arte del Vicino Oriente}}
+@String {OrbTerr = {Orbis terrarum. Internationale Zeitschrift für historische Geographie der Alten Welt}}
+@String {OrChr = {Oriens christianus}}
+@String {OrChrPer = {Orientalia christiana periodica}}
+@String {Ordona = {Ordona. Rapports et études}}
+@String {Orient = {Orient. The Reports of the Society for Near Eastern Studies in Japan}}
+@String {Origini = {Origini. Preistoria e protostoria delle civiltà antiche}}
+@String {Orizzonti = {Orizzonti. Rassegna di archeologia}}
+@String {Orpheus = {Orpheus. Rivista di umanità classica e cristiana}}
+@String {OrpheusThracSt = {Orpheus. Journal of Indo-European, Palaeo-Balkan and Thracian Studies}}
+@String {OrSu = {Orientalia Suecana. An International Journal of Indological, Iranian, Semitic, Turkic Studies}}
+@String {OsjZbor = {Osjekizbornik}}
+@String {OstbGrenzm = {Ostbairische Grenzmarken. Passauer Jahrbuch für Geschichte, Kunst und Volkskunde}}
+@String {Ostraka = {Ostraka. Rivista di antichità}}
+@String {OudhMeded = {Oudheidkundige mededelingen uit het Rijksmuseum van oudheden te Leiden}}
+@String {OxfJA = {Oxford Journal of Archaeology}}
+@String {OxfStPhilos = {Oxford Studies in Ancient Philosophy}}
+@String {Pact = {Pact. Revue du Groupe européen d’études pour les techniques physiques, chimiques et mathématiques appliquées à l’archéologie}}
+@String {Padusa = {Padusa. Bolletino del Centro polesano di studi storici, archeologici ed etnografici, Rovigo}}
+@String {PagA = {Pagine di archeologia. Studi e materiali}}
+@String {PAI = {Polevye archeologičeskie issledovanija}}
+@String {Paideuma = {Paideuma. Mitteilungen zur Kulturkunde}}
+@String {Palaeohistoria = {Palaeohistoria. Acta et communicationes Instituti bio-archaeologici universitatis Groninganae}}
+@String {Paleohispanica = {Paleohispánica. Revista sobre lenguas y culturas de la Hispania antigua}}%*Abweichung!
+@String {Palladio = {Palladio. Rivista di storia dell’architettura}}
+@String {Pallas = {Pallas. Revue d’études antiques}}
+@String {Palmet = {Palmet. Sadberk Hanım Müzesi yıllığı}}
+@String {PamA = {Památky archeologické}}
+@String {Pan = {Pan. Studi dell’Istituto di filologia latina}}
+@String {PapBilb = {Papeles Bilbilitanos}}
+@String {Papyri = {Papyri. Bollettino del Museo del papiro}}
+@String {Parthica = {Parthica. Incontri di culture nel mondo antico}}
+@String {Partenope = {Partenope. Rivista trimestrale di cultura napoletana}}
+@String {PAS = {Prähistorische Archäologie in Südosteuropa}}
+@String {PBF = {Prähistorische Bronzefunde}}
+@String {Pegasus = {Pegasus. Berliner Beiträge zum Nachleben der Antike}}
+@String {PEQ = {Palestine Exploration Quarterly}}
+@String {Peristil = {Peristil. Zbornik radova za povijest umjetnosti}}
+@String {Persica = {Persica. Jaarboek van het Genootschap Nederland-Iran, Stichting voor culturele betrekkingen}}
+@String {Peuce = {Peuce. Studii şi comunicări de istorie veche, arheologie şi numismatică}}
+@String {PF = {Pergamenische Forschungen}}
+@String {Pharos = {Pharos. Journal of the Netherlands Institute at Athens}}
+@String {Philologus = {Philologus. Zeitschrift für das klassische Altertum}}
+@String {Phoenix = {Phoenix. The Journal of the Classical Association of Canada}}
+@String {PhoenixExOrLux = {Phoenix. Bulletin uitgegeven door het Vooraziatisch-Egyptisch Genootschap »Ex Oriente Lux«}}
+@String {Phoibos = {Phoibos. Bulletin du Cercle de philologie classique et orientale de l’Université libre de Bruxelles}}
+@String {Phronesis = {Phronesis. A Journal for Ancient Philosophy}}
+@String {Picus = {Picus. Studi e ricerche sulle Marche nell’antichità}}
+@String {LPIR = {Prosopographia Imperii Romani}}
+@String {PKG = {Propyläen Kunstgeschichte}}
+@String {Platon = {Πλάτον. Δελτίον της Εταιρείας Ελλήνων Φιλολόγων}}
+@String {PLup = {Papyrologica Lupiensia}}
+@String {PolAMed = {Polish Archaeology in the Mediterranean}}
+@String {Polemon = {Πολέμων. Αρχαιολογικόν Περιοδικόν}}
+@String {Polis = {Polis. Revista de ideas y formas políticas de la antigüedad clásica}}
+@String {PompHercStab = {Pompeii, Herculaneum, Stabiae. Bolletino. Associazione internazionale Amici di Pompei}}
+@String {Pontica = {Pontica. Studii şi materiale de istorie, arheologie şi muzeografie, Constanţa}}
+@String {Portugalia = {Portugália. Revista do Instituto de arqueologia da Faculdade de letras da Universidade do Porto}}
+@String {PP = {La parola del passato}}
+@String {PPM = {Pompei: Pitture e mosaici. Enciclopedia dell’arte antica classica e orientale}}
+@String {PraceA = {Prace archeologiczne}}
+@String {PraceMatLodz = {Prace i materialy Muzeum archeologicznego i etnograficznego w Łodzi}}%*Abweichung!
+@String {Prakt = {Πρακτικά της εν Αθήναις Αρχαιολογικής Εταιρείας}}
+@String {PraktAkAth = {Πρακτικά της Ακαδημίας Αθηνών}}
+@String {PreistAlp = {Preistoria alpina. Museo tridentino di scienze naturali}}
+@String {PriloziZagreb = {Prilozi Instituta za arheologiju u Zagrebu}}
+@String {PrincViana = {Principe di Viana}}
+@String {ProblIsk = {Problemi na izkustvoto. Trimesecno spisanie za estetika, teorija, istorija i kritika na izkustvoto}}
+@String {ProcAfrClAss = {The Proceedings of the African Classical Associations}}
+@String {ProcCambrPhilSoc = {Proceedings of the Cambridge Philological Society}}
+@String {ProcDanInstAth = {Proceedings of the Danish Institute at Athens}}
+@String {ProcPrehistSoc = {Proceedings of the Prehistoric Society}}
+@String {Prometheus = {Prometheus. Rivista quadrimestrale di studi classici}}
+@String {ProspAQuad = {Prospezioni archeologiche. Quaderni}}
+@String {Prospettiva = {Prospettiva. Rivista di storia dell’arte antica e moderna}}
+@String {Prospezioni = {Prospezioni. Bollettino di informazioni scientifiche}}
+@String {ProvHist = {Provence historique}}
+@String {ProvLucca = {La provincia di Lucca}}
+@String {PublInstTTMeneses = {Publicaciones de la Institución »Tello Téllez de Meneses«}}
+@String {Pulpudeva = {Pulpudeva. Semaines philippopolitaines de l’histoire et de la culture thrace}}
+@String {Puteoli = {Puteoli. Studi di storia antica}}
+@String {Pyrenae = {Pyrenae. Crónica arqueológica}}
+@String {PZ = {Prähistorische Zeitschrift}}
+@String {QDAP = {The Quarterly of the Department of Antiquities in Palestine}}
+@String {QuadABarcel = {Quaderns d’arqueologia i història de la ciutat (Barcelona)}}
+@String {QuadACagl = {Quaderni. Soprintendenza archeologica per la provincie di Cagliari e Oristano}}
+@String {QuadACal = {Quaderni del Dipartimento delle arti, Università della Calabria}}
+@String {QuadALibya = {Quaderni di archeologia della Libia}}
+@String {QuadAMant = {Quaderni di archeologia del Mantovano}}
+@String {QuadAMess = {Quaderni di archeologia, Università di Messina}}
+@String {QuadAOst = {Quaderni del Gruppo archeologico ostigliese}}
+@String {QuadAPiem = {Quaderni della Soprintendenza archeologica del Piemonte}}
+@String {QuadAquil = {Quaderni aquileiesi}}
+@String {QuadAReggio = {Quaderni d’archeologia reggiana}}
+@String {QuadAVen = {Quaderni di archeologia del Veneto}}
+@String {QuadCast = {Quaderns de prehistòria i arqueologia de Castelló}}
+@String {QuadCat = {Quaderni catanesi di studi classici e medievali}}
+@String {QuadChieti = {Quaderni dell’Istituto di archeologia e storia antica, Università di Chieti}}
+@String {QuadErb = {Quaderni erbesi. Civico museo archeologico di Erba}}
+@String {QuadFriulA = {Quaderni friulani di archeologia}}
+@String {QuadGerico = {Quaderni di Gerico}}
+@String {QuadIstFilGr = {Quaderni dell’Istituto di filologia greca}}
+@String {QuadIstLat = {Quaderni dell’Istituto di lingua e letteratura latina, Università di Roma}}
+@String {QuadLecce = {Quaderni. Istituto di lingue e letterature classiche, Facoltà di magistero, Università degli studi, Lecce}}
+@String {QuadMusPontecorvo = {Museo civico Pontecorvo. Quaderni}}
+@String {QuadMusSalinas = {Quaderni del Museo archeologico regionale Antonino Salinas}}
+@String {QuadProtost = {Quaderni di protostoria. Università di Perugia}}
+@String {QuadStLun = {Quaderni. Centro studi lunensi}}
+@String {QuadStor = {Quaderni di storia}}
+@String {QuadStorici = {Quaderni storici}}
+@String {QuadUrbin = {Quaderni urbinati di cultura classica}}
+@String {Quaternaria = {Quaternaria. Storia naturale e culturale del quaternario}}
+@String {RA = {Revue archéologique}}
+@String {RAArtLouv = {Revue des archéologues et historiens d’art de Louvain}}
+@String {RAC = {Reallexikon für Antike und Christentum}}
+@String {RACFr = {Revue archéologique du Centre de la France}}
+@String {RAComo = {Rivista archeologica dell’antica provincia e diocesi di Como}}
+@String {RACr = {Rivista di archeologia cristiana}}
+@String {RadAkZadar = {Radovi Zavoda za povijesne znanosti, Hrvatska akademija znanosti i umjetnosti u Zadru}}
+@String {Radiocarbon = {Radiocarbon. An International Journal of Cosmogenic Isotope Research}}
+@String {RadSplit = {Radovi. Razdio povijesnih znanosti}}
+@String {RAE = {Revue archéologique de l’Est et du Centre-Est}}
+@String {Raggi = {Raggi. Zeitschrift für Kunstgeschichte und Archäologie}}
+@String {RAMadrid = {Revista de arqueología}}
+@String {RANarb = {Revue archéologique de Narbonnaise}}
+@String {RAPon = {Revista d’arqueologia de Ponent}}
+@String {RapWyk = {Raporty wykopaliskowe}}
+@String {RArchBiblMus = {Revista de archivos, bibliotecas y museos}}
+@String {RArcheom = {Revue d’archéométrie}}
+@String {RArtMus = {La revue des arts. Musées de France}}
+@String {RassAPiomb = {Rassegna di archeologia. Associazione archeologica piombinese}}
+@String {RassLazio = {Rassegna del Lazio}}
+@String {RassStorSalern = {Rassegna storica salernitana}}
+@String {RassVolt = {Rassegna volterrana}}
+@String {RAssyr = {Revue d’assyriologie et d’archéologie orientale}}
+@String {Ratiariensia = {Ratiariensia. Studi e materiali mesici e danubiani}}
+@String {RAtlMed = {Revista atlántica-\-mediterránea de prehistoria y arqueología social}}
+@String {RavStRic = {Ravenna studi e ricerche}}
+@String {Raydan = {Raydan. Journal of the Ancient Yemeni Antiquities and Epigraphy}}
+@String {RB = {Revue biblique}}
+@String {RBelgNum = {Revue belge de numismatique et de sigillographie}}
+@String {RBelgPhilHist = {Revue belge de philologie et d’histoire}}
+@String {LRBK = {Reallexikon zur byzantinischen Kunst}}
+@String {RCulClMedioev = {Rivista di cultura classica e medioevale}}
+@String {RdA = {Rivista di archeologia}}
+@String {RDAC = {Report of the Department of Antiquities, Cyprus}}
+@String {RdE = {Revue d’égyptologie (Kairo)}}
+@String {RDroitsAnt = {Revue internationale des droits de l’antiquité}}
+@String {RE = {Paulys Realencyclopädie der classischen Altertumswissenschaft}}
+@String {REA = {Revue des études anciennes}}
+@String {REByz = {Revue des études byzantines}}
+@String {RecConstantine = {Recueil des notices et memoires de la Société archéologique du département de Constantine}}
+@String {RechACrac = {Recherches archéologiques. Institut d’archéologie de l’Université de Cracovie}}
+@String {RechAlb = {Recherches albanologiques}}
+@String {RecMusAlcoi = {Recerques del Museu d’Alcoi}}
+@String {RecTrav = {Recueil de travaux relatifs à philologie et l’archéologie égyptiennes et assyriennes}}
+@String {REG = {Revue des études grecques}}
+@String {ReiCretActa = {Rei Cretariae Romanae Fautorum acta}}
+@String {ReiCretCommunic = {Rei Cretariae Romanae Fautores. Communicationes}}
+@String {REL = {Revue des études latines}}
+@String {Rema = {Ρήμα. Mitteilungen zur indogermanischen, vornehmlich indo-iranischen Wortkunde sowie zur holothetischen Sprachtheorie}}
+@String {RendBologna = {Atti della Accademia delle scienze dell’Istituto di Bologna. Rendiconti}}
+@String {RendIstLomb = {Rendiconti. Classe di lettere e scienze morali e storiche, Istituto lombardo, Accademia di scienze e lettere}}
+@String {RendLinc = {Rendiconti dell’Accademia nazionale dei Lincei, Classe di scienze morali, storiche e filologiche}}
+@String {RendNap = {Rendiconti della Accademia di archeologia, lettere e belle arti, Napoli}}
+@String {RendPontAc = {Rendiconti. Atti della Pontificia accademia romana di archeologia}}
+@String {RepMalta = {Report on the Working of the Museum Department, Malta, Department of Information}}
+@String {Reppal = {Reppal. Revue des études phénicienne-puniques et des antiquités libyques}}
+@String {RepSocLibSt = {Annual Report. The Society for Libyan Studies}}
+@String {RES = {Répertoire d’épigraphie sémitique (Paris 1900--1950)}}
+@String {REstIber = {Revista de estudios ibéricos}}
+@String {REtArm = {Revue des études arméniennes}}
+@String {RevEg = {Revue égyptologique (Paris)}}
+@String {RFil = {Rivista di filologia e di istruzione classica}}
+@String {RGeorgCauc = {Revue des études géorgiennes et caucasiennes}}
+@String {RGF = {Römisch-Germanische Forschungen}}
+@String {RGuimar = {Revista de Guimarães}}
+@String {RHA = {Revue hittite et asianique}}
+@String {RheinMusBonn = {Das Rheinische Landesmuseum Bonn. Berichte aus der Arbeit des Museums}}
+@String {RHistArmees = {Revue historique des armées}}%*Abweichung!
+@String {RHistRel = {Revue de l’histoire des religions}}
+@String {RhM = {Rheinisches Museum für Philologie}}
+@String {RIA = {Rivista dell’Istituto nazionale d’archeologia e storia dell’arte}}
+@String {RIC = {H. Mattingly – E. A. Sydenham, The Roman Imperial Coinage}}
+@String {RicEgAntCopt = {Ricerche di egittologia e di antichità copte}}
+@String {RicognA = {Ricognizioni archeologiche}}
+@String {RicStBrindisi = {Ricerche e studi. Museo Francesco Ribezzo, Brindisi}}
+@String {RIngIntem = {Rivista Ingauna e Intemelia}}
+@String {RItNum = {Rivista italiana di numismatica e scienze affini}}
+@String {RlA = {Reallexikon der Assyriologie und vorderasiatischen Archäologie}}
+@String {RLouvre = {Revue du Louvre. La revue des musées de France}}
+@String {RM = {Mitteilungen des Deutschen Archäologischen Instituts, Römische Abteilung}}
+@String {RNum = {Revue numismatique}}
+@String {RoczMuzWarsz = {Rocznik Muzeum narodowego w Warszawie}}
+@String {RoemOe = {Römisches Österreich. Jahresschrift der Österreichischen Gesellschaft für Archäologie}}%*Abweichung!
+@String {RoemQSchr = {Römische Quartalschrift für christliche Altertumskunde und Kirchengeschichte}}%*Abweichung!
+@String {Romanobarbarica = {Romanobarbarica. Contributi allo studio dei rapporti culturali tra il mondo latino e mondo barbarico}}
+@String {RomGens = {Romana gens. Bollettino dell’Associazione archeologica romana}}
+@String {RoscherML = {W. H. Roscher, Ausführliches Lexikon der griechischen und römischen Mythologie}}%*Abweichung!
+@String {RossA = {Rossijskaja archeologija}}
+@String {RPC = {Roman Provincial Coinage}}
+@String {RPhil = {Revue de philologie, de littérature et d’histoire anciennes}}
+@String {RPortA = {Revista portuguesa de arqueologia}}
+@String {RPorto = {Revista da Facultade de letras. Serie de historia. Universidade do Porto}}
+@String {RRC = {M. Crawford, Roman Republican Coinage (London 1974)}}
+@String {RSaintonge = {Revue de la Saintonge et de l’Aunis}}
+@String {RScPreist = {Rivista di scienze preistoriche}}
+@String {RSO = {Rivista degli studi orientali}}
+@String {RStBiz = {Rivista di studi bizantini e neoellenici}}
+@String {RStCl = {Rivista di studi classici}}
+@String {RStFen = {Rivista di studi fenici}}
+@String {RStLig = {Rivista di studi liguri}}
+@String {RStMarch = {Rivista di studi marchigiani}}
+@String {RStorAnt = {Rivista storica dell’antichità}}
+@String {RStorCal = {Rivista storica calabrese}}
+@String {RStPomp = {Rivista di studi pompeiani}}
+@String {RStPun = {Rivista di studi punici}}
+@String {RTopAnt = {Rivista di topografia antica}}
+@String {Rudiae = {Rudiae. Ricerche sul mondo classico}}
+@String {SaalbJb = {Saalburg-Jahrbuch. Bericht des Saalburg-Museums}}
+@String {SaarBeitr = {Saarbrücker Beiträge zur Altertumskunde}}
+@String {SaarStMat = {Saarbrücker Studien und Materialien zur Altertumskunde}}
+@String {Sacer = {Sacer. Bollettino della Associazione storica saccarese}}
+@String {Saeculum = {Saeculum. Jahrbuch für Universalgeschichte}}
+@String {SAGA = {Studien zur Archäologie und Geschichte Altägyptens}}
+@String {SaggiFen = {Saggi fenici}}
+@String {Saguntum = {Saguntum. Papeles del Laboratorio de arqueología de Valencia}}
+@String {Saitabi = {Saitabi. Noticiario de historia, arte y arqueología de Levante}}
+@String {SAK = {Studien zur altägyptischen Kultur}}
+@String {Salduie = {Salduie. Estudios de prehistoria y arqueología}}
+@String {Samothrace = {Samothrace. Excavations Conducted by the Institute of Fine Arts of New York University}}
+@String {Sandalion = {Sandalion. Quaderni di cultura classica, cristiana e medievale}}
+@String {Sardis = {Sardis. Publications of the American Society for the Excavation of Sardis}}
+@String {Sargetia = {Sargetia. Acta Musei regionalis Devensis}}
+@String {SarkSt = {Sarkophag-Studien}}
+@String {Sautuola = {Sautuola. Revista del Instituto de prehistoria y arqueologia Sautuola}}
+@String {Savaria = {Savaria. Bulletin der Museen des Komitats Vas}}
+@String {SBBerlin = {Sitzungsberichte der Deutschen Akademie der Wissenschaften zu Berlin. Klasse für Sprache, Literatur und Kunst}}
+@String {SBLeipzig = {Sitzungsberichte der Sächsischen Akademie der Wissenschaften zu Leipzig}}
+@String {SBMuenchen = {Bayerische Akademie der Wissenschaften. Philosophisch-Historische Klasse. Sitzungsberichte}}%*Abweichung!
+@String {SborBrno = {Sborník prací Filozofické fakulty Brněnské univerzity. M, Rada archeologická}}
+@String {SBWien = {Sitzungsberichte. Österreichische Akademie der Wissenschaften}}
+@String {ScAnt = {Scienze dell’antichità. Storia, archeologia, antropologia}}
+@String {SCE = {The Swedish Cyprus Expedition}}
+@String {SchildStei = {Schild von Steier. Beiträge zur Steirischen Vor- und Frühgeschichte und Münzkunde}}
+@String {Scholia = {Scholia. Natal Studies in Classical Antiquity}}
+@String {SchwMueBl = {Schweizer Münzblätter}}%*Abweichung!
+@String {SchwNumRu = {Schweizerische numismatische Rundschau}}
+@String {ScrCiv = {Scrittura e civiltà}}
+@String {ScrClIsr = {Scripta classica Israelica. Yearbook of the Israel Society for the Promotion of Classical Studies}}
+@String {ScrHieros = {Scripta Hierosolymitana. Publications of the Hebrew University, Jerusalem}}
+@String {ScrMed = {Scripta mediterranea. Bulletin of the Society for Mediterranean Studies, Toronto}}
+@String {SDAIK = {Sonderschriften des Deutschen Archäologischen Instituts, Abteilung Kairo}}
+@String {SEG = {Supplementum epigraphicum Graecum}}
+@String {SeminRom = {Seminari romani di cultura greca}}
+@String {Semitica = {Semitica. Cahiers publiés par l’Institut d’études sémitiques du College de France. Avec le concours du Centre national de la recherche scientifique}}
+@String {SetubalA = {Setúbal arqueológica}}
+@String {Sibrium = {Sibrium. Collana di studi e documentazioni}}
+@String {SicA = {Sicilia archeologica}}
+@String {SicGymn = {Siculorum gymnasium}}
+@String {SIG = {W. Dittenberger, Sylloge inscriptionum Graecarum (Leipzig 1915--­1924)}}
+@String {Sileno = {Sileno. Rivista di studi classici e cristiani}}
+@String {SilkRoadArtA = {Silk Road Art and Archaeology. Journal of the Institute of Silk Road Studies, Kamakura}}
+@String {SIMA = {Studies in Mediterranean Archaeology}}
+@String {Simblos = {Simblos. Scritti di storia antica}}
+@String {Skyllis = {Skyllis. Zeitschrift für Unterwasserarchäologie}}
+@String {SlovA = {Slovenská archeológia}}
+@String {SlovNum = {Slovenská numizmatika}}
+@String {SMEA = {Studi micenei ed egeo-anatolici}}
+@String {SNG = {Sylloge nummorum Graecorum}}
+@String {SocGeoAOran = {(Bulletin trimestriel de la) Société de géographie et d’archéologie (de la province) d’Oran}}
+@String {SoobErmit = {Soobščenija Gosudarstvennogo Ėrmitaža}}
+@String {SoobMuzMoskva = {Soobščenija Gosudarstvennogo muzeja izobrazitel’nych isskustv imeni A. S. Puškina}}
+@String {SovA = {Sovetskaja archeologija}}
+@String {Spal = {Spal. Revista de prehistoria y arqueología de la Universidad de Sevilla}}
+@String {SpNov = {Specimina nova dissertationum ex Instituto historico Universitatis Quinqueecclesiensis de Iano Pannonio nominatae}}
+@String {Spoletium = {Spoletium. Rivista di arte, storia, cultura}}
+@String {StA = {Studia archaeologica}}
+@String {Stadion = {Stadion. Internationale Zeitschrift für Geschichte des Sports}}
+@String {StaedelJb = {Städel-Jahrbuch}}%*Abweichung!
+@String {StAeg = {Studia Aegyptiaca. Budapest}}
+@String {StAlb = {Studia Albanica}}
+@String {StAnt = {Studi di antichità. Università di Lecce}}
+@String {Starinar = {StarinarArheoloki institut Beograd}}
+@String {StAWarsz = {Studia archeologiczne. Uniwersytet Warszawski, Instytut archeologii}}
+@String {StBiFranc = {Studium biblicum Franciscanum. Liber annuus}}
+@String {StBitont = {Studi bitontini}}
+@String {StBoT = {Studien zu den Bogazköy-Texten}}
+@String {StCercIstorV = {Studii şi cercetări de istorie veche şi arheologie}}
+@String {StCercNum = {Studii şi cercetări de numismatică}}
+@String {StCl = {Studii clasice. Societatea de studii clasice din Republica socialistă Romănia}}
+@String {StClOr = {Studi classici e orientali}}
+@String {StDocA = {Studi e documenti di archeologia}}
+@String {StDocHistIur = {Studia et documenta historiae et iuris}}
+@String {StEbla = {Studi eblaiti}}
+@String {StEgAntPun = {Studi di egittologia e di antichità puniche}}
+@String {SteMat = {Studi e materiali. Soprintendenza ai beni archeologici per la Toscana}}
+@String {StEpigrLing = {Studi epigrafici e linguistici sul Vicino Oriente antico}}
+@String {StEtr = {Studi etruschi}}
+@String {StGenu = {Studi genuensi}}
+@String {StHist = {Studia historica. Historia antigua}}
+@String {StiftHambKuSamml = {Stiftung zur Förderung der Hamburgischen Kunstsammlungen. Erwerbungen}}
+@String {StItFilCl = {Studi italiani di filologia classica}}
+@String {StLatIt = {Studi latini e italiani}}
+@String {StMagreb = {Studi magrebini}}
+@String {StMatStorRel = {Studi e materiali di storia delle religioni}}
+@String {StOliv = {Studia Oliveriana}}
+@String {StOr = {Studia orientalia, Helsinki}}
+@String {StOrCr = {Studi sull’Oriente cristiano}}
+@String {StP = {Studia papyrologica}}
+@String {StrennaRom = {Strenna dei romanisti}}
+@String {StRom = {Studi romani}}
+@String {StRomagn = {Studi romagnoli}}
+@String {StSalent = {Studi salentini}}
+@String {StSard = {Studi sardi}}
+@String {StStorRel = {Studi storico-religiosi}}
+@String {StTardoant = {Studi tardoantichi}}
+@String {StTrentStor = {Studi trentini di scienze storiche. Sezione seconda}}
+@String {StTroica = {Studia Troica}}
+@String {StUrbin = {Studi urbinati. B, Scienze umane. 3, Linguistica, letteratura, arte}}
+@String {Sumer = {Sumer. A Journal of Archaeology (and History) in Iraq}}
+@String {SylvaMala = {Sylva Mala. Bollettino del Centro di studi archeologici di Boscoreale, Boscotrecase e Trecase}}%*Abweichung!
+@String {SymbOslo = {Symbolae Osloenses}}
+@String {Syria = {Syria. Revue d’art oriental et d’archéologie}}
+@String {SyrMesopSt = {Syro-Mesopotamian Studies}}
+@String {TAD = {Türk arkeoloji dergisi}}
+@String {Talanta = {Τάλαντα. Proceedings of the Dutch Archaeological and Historical Society}}
+@String {TAM = {E. Kalinka (Hrsg.), Tituli Asiae Minoris (Wien 1901--­1941)}}
+@String {Taras = {Taras. Rivista di archeologia}}
+@String {Tarsus = {Excavations at Gözlü Kule, Tarsus}}
+@String {TAVO = {Tübinger Atlas des Vorderen Orients}}
+@String {TeherF = {Teheraner Forschungen}}
+@String {Teiresias = {Teiresias. A Review and Continuing Bibliography of Boiotian Studies}}
+@String {TelAvivJA = {Tel Aviv. Journal of the Institute of Archaeology of Tel Aviv University}}
+@String {TerraAntBalc = {Acta Associationis internationalis »Terra antiqua balcanica«}}
+@String {TerraVolsci = {Terra dei Volsci. Annali del Museo archeologico di Frosinone}}
+@String {Teruel = {Teruel. Instituto de estudios turolenses}}
+@String {TextilAnc = {Textiles anciens. Bulletin du Centre international d’étude des textiles anciens}}
+@String {TheolRu = {Theologische Rundschau}}
+@String {ThesCRA = {Thesaurus Cultus et Rituum Antiquorum}}
+@String {Thessalika = {Θεσσαλικά}}
+@String {Thessalonike = {Η Θεσσαλονίκη}}
+@String {Thieme-Becker = {U. Thieme – F. Becker (Hrsg.), Allgemeines Lexikon der bildenden Künstler}}%*Abweichung!
+@String {ThrakChron = {Θρακικά Χρονικά}}
+@String {ThrakEp = {Θρακική Επετηρίδα}}
+@String {TIB = {Tabula Imperii Byzantini}}
+@String {Tibiscus = {Tibiscus. Istorie, arheologie. Muzeul Banatului Timişoara}}
+@String {TiLeon = {Tierras de León}}
+@String {Tiryns = {Tiryns. Forschungen und Berichte}}
+@String {TMA = {Tijdschrift voor Mediterrane archeologie}}
+@String {Topoi = {Τόποι. Orient – Occident}}
+@String {Torretta = {La torretta. Rivista quadrimestrale a cura della Biblioteca comunale di Blera}}
+@String {TourOrleOr = {La Tour de l’Orle-d’Or, Semur-en-Auxois}}
+@String {TrabAntrEtn = {Trabalhos de antropologia e etnologia}}
+@String {TrabArq = {Trabalhos de arqueologia}}
+@String {TrabAssArqPort = {Trabalhos da associação dos arqueólogos portugueses}}
+@String {TrabNavarra = {Trabajos de arqueología de Navarra}}
+@String {TrabPrehist = {Trabajos de prehistoria}}
+@String {Traditio = {Traditio. Studies in Ancient and Medieval History, Thought and Religion}}
+@String {TransactAmPhilAss = {Transactions and Proceedings of the American Philological Association}}
+@String {TransactAmPhilosSoc = {Transactions of the American Philosophical Society}}
+@String {TransactLond = {Transactions of the London and Middlesex Archaeological Society}}
+@String {TravMem = {Travaux et mémoires. Centre de recherche d’histoire et civilisation byzantine, Paris}}
+@String {TravToulouse = {Travaux de l’Institut d’art préhistorique, Université de Toulouse – Le Mirail}}
+@String {TreMonet = {Trésors monétaires}}
+@String {TribArq = {Tribuna d’arqueologia}}
+@String {TrudyErmit = {Trudy Gosudarstvennogo Ėrmitaža}}
+@String {TrWPr = {Trierer Winckelmannsprogramme}}
+@String {TrZ = {Trierer Zeitschrift für Geschichte und Kunst des Trierer Landes und seiner Nachbargebiete}}
+@String {TTKY = {Türk Tarih Kurumu yayınları}}
+@String {TueBA-Ar = {Türkiye Bilimler Akademisi arkeoloji dergisi}}%*Abweichung!
+@String {Tyche = {Tyche. Beiträge zur Alten Geschichte, Papyrologie und Epigraphik}}
+@String {UF = {Ugarit-Forschungen. Internationales Jahrbuch für die Altertumskunde Syrien-Palästinas}}
+@String {UPA = {Universitätsforschungen zur Prähistorischen Archäologie}}
+@String {LUrbe = {L’Urbe. Rivista romana}}%*Abweichung!
+@String {UrSchw = {Ur-Schweiz. La Suisse primitive}}
+@String {UVB = {Vorläufiger Bericht über die von dem Deutschen Archäologischen Institut und der Deutschen Orient-Gesellschaft aus den Mitteln der Deutschen Forschungsgemeinschaft unternommenen Ausgrabungen in Uruk-Warka}}
+@String {VarSpom = {Varstvo spomenikov}}
+@String {VDI = {Vestnik drevnej istorii}}
+@String {Vekove = {Vekove. Dvumesečno spisanie. Bălgarsko istoričesko družestvo}}
+@String {Veleia = {Veleia. Revista de prehistoria, historia antigua, arqueología y filología clásicas}}
+@String {VenArt = {Venezia arti. Bolletino del Dipartimento di storia e critica delle arti dell’Università di Venezia}}
+@String {VerAmstMeded = {Mededelingenblad. Vereniging van Vrienden Allard Pierson Museum}}
+@String {Verbanus = {Verbanus. Rassegna per la cultura, l’arte, la storia del lago}}
+@String {VeteraChr = {Vetera christianorum}}
+@String {VGesVind = {Veröffentlichungen der Gesellschaft Pro Vindonissa}}
+@String {Vichiana = {Vichiana. Rassegna di studi filologici e storici}}
+@String {VicOr = {Vicino Oriente}}
+@String {VigChr = {Vigiliae christianae}}
+@String {Viminacium = {Viminacium. Zbornik radova Narodnog muzeja}}
+@String {VisRel = {Visible Religion}}
+@String {Vitudurum = {Beiträge zum römischen Oberwinterthur – Vitudurum. Ausgrabungen im Unteren Bühl}}
+@String {VivScyl = {Vivarium Scyllacense. Bollettino dell’Istituto di studi su Cassiodoro e sul medioevo in Calabria}}
+@String {VizVrem = {Vizantijskij vremennik}}
+@String {VjesAMuzZagreb = {Vjesnik Arheološkog muzeja u Zagrebu}}
+@String {VjesDal = {Vjesnik za arheologiju i historiju dalmatinsku. Bulletin d’archéologie et d’histoire dalmates}}
+@String {Wad-al-Hayara = {Wad-al-Hayara. Revista de estudios de la Institución provincial de cultura »Marqués de Santillana« de Guadalajara}}
+@String {WeltGesch = {Die Welt als Geschichte}}
+@String {WiadA = {Wiadomości archeologiczne. Bulletin archéologique polonais}}
+@String {WissMBosn = {Wissenschaftliche Mitteilungen des Bosnischen Landesmuseums, A. Archäologie}}
+@String {WissZBerl = {Wissenschaftliche Zeitschrift der Humboldt-Universität zu Berlin. Gesellschafts- und sprachwissenschaftliche Reihe}}
+@String {WissZHalle = {Wissenschaftliche Zeitschrift. Martin-Luther-Universität Halle-Wittenberg}}
+@String {WissZJena = {Wissenschaftliche Zeitschrift der Friedrich-Schiller-Universität Jena}}
+@String {WissZRostock = {Wissenschaftliche Zeitschrift der Universität Rostock}}
+@String {WO = {Die Welt des Orients. Wissenschaftliche Beiträge zur Kunde des Morgenlandes}}
+@String {WorldA = {World Archaeology}}
+@String {WSt = {Wiener Studien}}
+@String {WuerzbJb = {Würzburger Jahrbücher für die Altertumswissenschaft}}%*Abweichung!
+@String {WVDOG = {Wissenschaftliche Veröffentlichungen der Deutschen Orient-Gesellschaft}}
+@String {WZKM = {Wiener Zeitschrift für die Kunde des Morgenlandes}}
+@String {Xenia = {Xenia. Semestrale di antichità}}
+@String {XeniaAnt = {Xenia antiqua}}
+@String {XeniaKonst = {Xenia. Konstanzer althistorische Vorträge und Forschungen}}
+@String {YaleClSt = {Yale Classical Studies}}
+@String {YaleUnivB = {Yale University Art Gallery Bulletin}}
+@String {ZA = {Zeitschrift für Assyriologie und vorderasiatische Archäologie}}
+@String {ZAAK = {Zeitschrift für Archäologie Außereuropäischer Kulturen}}
+@String {ZAeS = {Zeitschrift für ägyptische Sprache und Altertumskunde}}%*Abweichung!
+@String {ZAKSSchriften = {Schriften des Zentrums für Archäologie und Kulturgeschichte des Schwarzmeerraumes}}
+@String {ZAntChr = {Zeitschrift für antikes Christentum}}
+@String {ZAW = {Zeitschrift für die alttestamentliche Wissenschaft}}
+@String {ZborMuzBeograd = {Zbornik Narodnog muzeja Beograd}}
+@String {ZborRadBeograd = {Zbornik radova Vizantološkog instituta. Recueil des travaux de l’Institut d’études byzantines, Beograd}}
+@String {ZborZadar = {Zbornik Instituta za historijske nauke u Zadru}}
+@String {ZDMG = {Zeitschrift der Deutschen Morgenländischen Gesellschaft}}
+@String {ZDPV = {Zeitschrift des Deutschen Palästina-Vereins}}
+@String {Zephyrus = {Zephyrus. Revista de prehistoria y arqueología}}
+@String {ZEthn = {Zeitschrift für Ethnologie der Deutschen Gesellschaft für Völkerkunde und der Berliner Gesellschaft für Anthropologie, Ethnologie und Urgeschichte}}
+@String {ZfA = {Zeitschrift für Archäologie}}
+@String {ZfNum = {Zeitschrift für Numismatik}}
+@String {ZivaAnt = {Živa antika. Antiquité vivante}}
+@String {ZKuGesch = {Zeitschrift für Kunstgeschichte}}
+@String {ZNW = {Zeitschrift für die neutestamentliche Wissenschaft und die Kunde der älteren Kirche}}
+@String {ZPE = {Zeitschrift für Papyrologie und Epigraphik}}
+@String {ZSav = {Zeitschrift der Savigny-Stiftung für Rechtsgeschichte. Romanistische Abteilung}}
+@String {ZSchwA = {Zeitschrift für Schweizerische Archäologie und Kunstgeschichte}}
+@String {ZVerglSprF = {Zeitschrift für vergleichende Sprachforschung}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%% Stand April 2014, Deutsches Archäologisches Institut
@@ -14658,605 +14681,4418 @@ This update is also due to compatibility with `biblatex 3.8a`/`biber 2.8`.
% \fi
%\section{archaeologie-bibancient.bib}
% \begin{macrocode}
-@book{Acc, title = {}, author = {}, shortauthor = {Accius}, shorthand = {Acc.}, options = {ancient}, keywords = {ancient}}
-@book{AchTat, title = {}, author = {}, shortauthor = {Achilleus Tatios}, shorthand = {Ach. Tat.}, options = {ancient}, keywords = {ancient}}
-@book{Ael:Ep, title = {Epistulae rusticae}, author = {Claudius Aelianus}, shortauthor = {Aelian}, shorthand = {Ael. Ep.}, options = {ancient}, keywords = {ancient}}
-@book{Ael:Fr, title = {Fragmenta}, author = {Claudius Aelianus}, shortauthor = {Aelian}, shorthand = {Ael. Fr.}, options = {ancient}, keywords = {ancient}}
-@book{Ael:NA, title = {de natura animalium}, author = {Claudius Aelianus}, shortauthor = {Aelian}, shorthand = {Ael. NA}, options = {ancient}, keywords = {ancient}}
-@book{Ael:Tact, title = {Tactica (De instruendis aciebus)}, author = {{Aelianus Tacticus}}, shortauthor = {{Aelianus Tacticus}}, shorthand = {Ael. Tact}, options = {ancient}, keywords = {ancient}}
-@book{Ael:VA, title = {varia historia}, author = {Claudius Aelianus}, shortauthor = {Aelian}, shorthand = {Ael. VH}, options = {ancient}, keywords = {ancient}}
-@book{AelArist:Or, title = {Orationes}, author = {{Aelius Aristides}}, shortauthor = {{Aelius Aristides}}, shorthand = {Ael. Arist. Or.}, options = {ancient}, keywords = {ancient}}
-@book{AelArist:Technrhet, title = {Technai rhetorikai}, author = {{Aelius Aristides}}, shortauthor = {{Aelius Aristides}}, shorthand = {Ael. Arist. Techn. rhet.}, options = {ancient}, keywords = {ancient}}
-@book{AenTact, title = {Poliorketika}, author = {{Aineias Taktikos}}, shortauthor = {{Aineias Taktikos}}, shorthand = {Aen. Tact.}, options = {ancient}, keywords = {ancient}}
-@book{Aet, title = {}, author = {}, shortauthor = {Aetios}, shorthand = {Aet.}, options = {ancient}, keywords = {ancient}}
-@book{Aischin:Ctes, title = {in Ctesiphontum}, author = {}, shortauthor = {Aischines}, shorthand = {Aischin. Ctes.}, options = {ancient}, keywords = {ancient}}
-@book{Aischin:epist, title = {epistulae}, author = {}, shortauthor = {Aischines}, shorthand = {Aischin. epist.}, options = {ancient}, keywords = {ancient}}
-@book{Aischin:leg, title = {de falsa legatione}, author = {}, shortauthor = {Aischines}, shorthand = {Aischin. leg.}, options = {ancient}, keywords = {ancient}}
-@book{Aischin:orat, title = {Orationes}, author = {}, shortauthor = {Aischines}, shorthand = {Aischin. orat.}, options = {ancient}, keywords = {ancient}}
-@book{Aischin:Tim, title = {in Timarchum}, author = {}, shortauthor = {Aischines}, shorthand = {Aischin. Tim.}, options = {ancient}, keywords = {ancient}}
-@book{Aischyl:Ag, title = {Agamemnon}, author = {}, shortauthor = {Aischylos}, shorthand = {Aischyl. Ag.}, options = {ancient}, keywords = {ancient}}
-@book{Aischyl:Choeph, title = {Choephoroi}, author = {}, shortauthor = {Aischylos}, shorthand = {Aischyl. Choeph.}, options = {ancient}, keywords = {ancient}}
-@book{Aischyl:Eum, title = {Eumenides}, author = {}, shortauthor = {Aischylos}, shorthand = {Aischyl. Eum.}, options = {ancient}, keywords = {ancient}}
-@book{Aischyl:Pers, title = {Persae}, author = {}, shortauthor = {Aischylos}, shorthand = {Aischyl. Pers.}, options = {ancient}, keywords = {ancient}}
-@book{Aischyl:Prom, title = {Prometheus}, author = {}, shortauthor = {Aischylos}, shorthand = {Aischyl. Prom.}, options = {ancient}, keywords = {ancient}}
-@book{Aischyl:Sept, title = {Septem adversus Thebas}, author = {}, shortauthor = {Aischylos}, shorthand = {Aischyl. Sept.}, options = {ancient}, keywords = {ancient}}
-@book{Aischyl:Suppl, title = {Supplices (Hiketides)}, author = {}, shortauthor = {Aischylos}, shorthand = {Aischyl. Suppl.}, options = {ancient}, keywords = {ancient}}
-@book{Aisop, title = {}, author = {}, shortauthor = {Aisopos}, shorthand = {Aisop.}, options = {ancient}, keywords = {ancient}}
-@book{AlexAphr, title = {}, author = {}, shortauthor = {Alexandros von Aphrodisias}, shorthand = {Alex. Aphr.}, options = {ancient}, keywords = {ancient}}
-@book{Alk, title = {}, author = {}, shortauthor = {Alkaios}, shorthand = {Alk.}, options = {ancient}, keywords = {ancient}}
-@book{Ambr:epist, title = {epistulae}, author = {}, shortauthor = {Ambrosius}, shorthand = {Ambr. epist.}, options = {ancient}, keywords = {ancient}}
-@book{Ambr:excSat, title = {de excessu fratris (Satyri)}, author = {}, shortauthor = {Ambrosius}, shorthand = {Ambr. exc. Sat.}, options = {ancient}, keywords = {ancient}}
-@book{Ambr:obitTheod, title = {de obitu Theodosii}, author = {}, shortauthor = {Ambrosius}, shorthand = {Ambr. obit. Theod.}, options = {ancient}, keywords = {ancient}}
-@book{Ambr:obitValent, title = {de obitu Valentiniani (iunioris)}, author = {}, shortauthor = {Ambrosius}, shorthand = {Ambr. obit. Valent.}, options = {ancient}, keywords = {ancient}}
-@book{Ambr:off, title = {de officiis magistrorum}, author = {}, shortauthor = {Ambrosius}, shorthand = {Ambr. off.}, options = {ancient}, keywords = {ancient}}
-@book{Ambr:paenit, title = {de paenitentia}, author = {}, shortauthor = {Ambrosius}, shorthand = {Ambr. paenit.}, options = {ancient}, keywords = {ancient}}
-@book{Amm, title = {}, author = {{Ammianus <Marcellinus>}}, shortauthor = {Ammianus Marcellinus}, shorthand = {Amm.}, options = {ancient}, keywords = {ancient}}
-@book{Anakr, title = {}, author = {}, shortauthor = {Anakreon}, shorthand = {Anakr.}, options = {ancient}, keywords = {ancient}}
-@book{Anaxag, title = {}, author = {}, shortauthor = {Anaxagoras}, shorthand = {Anaxag.}, options = {ancient}, keywords = {ancient}}
-@book{Anaximand, title = {}, author = {}, shortauthor = {Anaximandros}, shorthand = {Anaximand.}, options = {ancient}, keywords = {ancient}}
-@book{Anaximen, title = {}, author = {}, shortauthor = {Anaximenes}, shorthand = {Anaximen.}, options = {ancient}, keywords = {ancient}}
-@book{And, title = {}, author = {}, shortauthor = {Andokides}, shorthand = {And.}, options = {ancient}, keywords = {ancient}}
-@book{AnthGr, title = {}, author = {}, shortauthor = {Antologia Graeca}, shorthand = {Anth. Gr.}, options = {ancient}, keywords = {ancient}}
-@book{AnthLat, title = {}, author = {}, shortauthor = {Antologia Latina}, shorthand = {Anth. Lat.}, options = {ancient}, keywords = {ancient}}
-@book{AnthPal, title = {}, author = {}, shortauthor = {Antologia Palatina}, shorthand = {Anth. Pal.}, options = {ancient}, keywords = {ancient}}
-@book{AnthPlan, title = {}, author = {}, shortauthor = {Anthologia Planudea}, shorthand = {Anth. Plan.}, options = {ancient}, keywords = {ancient}}
-@book{Antiph, title = {}, author = {}, shortauthor = {Antiphon}, shorthand = {Antiph.}, options = {ancient}, keywords = {ancient}}
-@book{Antisth, title = {}, author = {}, shortauthor = {Antisthenes}, shorthand = {Antisth.}, options = {ancient}, keywords = {ancient}}
-@book{Apg, title = {Apostelgeschichte}, author = {}, shortauthor = {}, shorthand = {Apg.}, options = {ancient}, keywords = {ancient}}
-@book{Apk, title = {Apokalypse}, author = {}, shortauthor = {}, shorthand = {Apk.}, options = {ancient}, keywords = {ancient}}
-@book{Apollod:bibl, title = {bibliotheke}, author = {}, shortauthor = {Apollodoros}, shorthand = {Apollod. bibl.}, options = {ancient}, keywords = {ancient}}
-@book{Apollod:epit, title = {epitome}, author = {}, shortauthor = {Apollodoros}, shorthand = {Apollod. epit.}, options = {ancient}, keywords = {ancient}}
-@book{ApollRhod, title = {Argonautica}, author = {}, shortauthor = {Apollonios Rhodios}, shorthand = {Apoll. Rhod.}, options = {ancient}, keywords = {ancient}}
-@book{App:Celt, title = {Celtica}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. Celt.}, options = {ancient}, keywords = {ancient}}
-@book{App:civ, title = {bella civilia}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. civ.}, options = {ancient}, keywords = {ancient}}
-@book{App:Hann, title = {Hannibalica}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. Hann.}, options = {ancient}, keywords = {ancient}}
-@book{App:Ib, title = {Iberica}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. Ib.}, options = {ancient}, keywords = {ancient}}
-@book{App:Ill, title = {Illyrica}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. Ill.}, options = {ancient}, keywords = {ancient}}
-@book{App:It, title = {Italica}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. It.}, options = {ancient}, keywords = {ancient}}
-@book{App:Lib, title = {Libyca}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. Lib.}, options = {ancient}, keywords = {ancient}}
-@book{App:Mac, title = {Macedonica}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. Mac.}, options = {ancient}, keywords = {ancient}}
-@book{App:Mithr, title = {Mithridatius}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. Mithr.}, options = {ancient}, keywords = {ancient}}
-@book{App:pr, title = {proemium}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. pr.}, options = {ancient}, keywords = {ancient}}
-@book{App:reg, title = {regia}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. reg.}, options = {ancient}, keywords = {ancient}}
-@book{App:Rom, title = {historia romana}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. Rom.}, options = {ancient}, keywords = {ancient}}
-@book{App:Samn, title = {Samnitica}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. Samn.}, options = {ancient}, keywords = {ancient}}
-@book{App:Sic, title = {Sicula}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. Sic.}, options = {ancient}, keywords = {ancient}}
-@book{App:Syr, title = {Syriaca}, author = {Appian}, shortauthor = {Appian}, shorthand = {App. Syr.}, options = {ancient}, keywords = {ancient}}
-@book{Apul:Flor, title = {florida}, author = {Apuleius Madaurensis, Lucius}, shortauthor = {Apuleius}, shorthand = {Apul. Flor.}, options = {ancient}, keywords = {ancient}}
-@book{Apul:met, title = {metamorphoses}, author = {Apuleius Madaurensis, Lucius}, shortauthor = {Apuleius}, shorthand = {Apul. met.}, options = {ancient}, keywords = {ancient}}
-@book{Arat, title = {}, author = {Aratos}, shortauthor = {Aratos}, shorthand = {Arat.}, options = {ancient}, keywords = {ancient}}
-@book{Archil, title = {}, author = {Archilochos}, shortauthor = {Archilochos}, shorthand = {Archil.}, options = {ancient}, keywords = {ancient}}
-@book{Archim, title = {}, author = {Archimedes}, shortauthor = {Archimedes}, shorthand = {Archim.}, options = {ancient}, keywords = {ancient}}
-@book{Archyt, title = {}, author = {Archytas}, shortauthor = {Archytas}, shorthand = {Archyt.}, options = {ancient}, keywords = {ancient}}
-@book{Aristeid, title = {}, author = {Ailios Aristeides}, shortauthor = {Ailios Aristeides}, shorthand = {Aristeid.}, options = {ancient}, keywords = {ancient}}
-@book{Aristoph:Ach, title = {Acharnenses}, author = {Aristophanes}, shortauthor = {Aristophanes}, shorthand = {Aristoph. Ach.}, options = {ancient}, keywords = {ancient}}
-@book{Aristoph:Av, title = {Aves (Ornithes)}, author = {Aristophanes}, shortauthor = {Aristophanes}, shorthand = {Aristoph. Av.}, options = {ancient}, keywords = {ancient}}
-@book{Aristoph:Eccl, title = { Ecclesiazusae}, author = {Aristophanes}, shortauthor = {Aristophanes}, shorthand = {Aristoph. Eccl.}, options = {ancient}, keywords = {ancient}}
-@book{Aristoph:Equ, title = {Equites (Hippeis)}, author = {Aristophanes}, shortauthor = {Aristophanes}, shorthand = {Aristoph. Equ.}, options = {ancient}, keywords = {ancient}}
-@book{Aristoph:Lys, title = {Lysistrata}, author = {Aristophanes}, shortauthor = {Aristophanes}, shorthand = {Aristoph. Lys.}, options = {ancient}, keywords = {ancient}}
-@book{Aristoph:Nub, title = {Nubes (Nephelai)}, author = {Aristophanes}, shortauthor = {Aristophanes}, shorthand = {Aristoph. Nub.}, options = {ancient}, keywords = {ancient}}
-@book{Aristoph:Pax, title = {Pax (Eirene)}, author = {Aristophanes}, shortauthor = {Aristophanes}, shorthand = {Aristoph. Pax}, options = {ancient}, keywords = {ancient}}
-@book{Aristoph:Plut, title = {Plutus}, author = {Aristophanes}, shortauthor = {Aristophanes}, shorthand = {Aristoph. Plut.}, options = {ancient}, keywords = {ancient}}
-@book{Aristoph:Ran, title = {Ranae (Batrachoi)}, author = {Aristophanes}, shortauthor = {Aristophanes}, shorthand = {Aristoph. Ran.}, options = {ancient}, keywords = {ancient}}
-@book{Aristoph:Thesm, title = {Thesmophoriazusae}, author = {Aristophanes}, shortauthor = {Aristophanes}, shorthand = {Aristoph. Thesm.}, options = {ancient}, keywords = {ancient}}
-@book{Aristoph:Vesp, title = {Vespae (Sphekes)}, author = {Aristophanes}, shortauthor = {Aristophanes}, shorthand = {Aristoph. Vesp.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:an, title = {de anima (peri psyches)}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. an.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:anpost, title = {analytica posteriora}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. an post.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:anpr, title = {analytica priora}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. an pr.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:Athpol, title = {Athenaion politeia}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. Ath. pol.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:cael, title = {de caelo}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. cael.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:cat, title = {categoriae}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. cat.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:col, title = {de coloribus (περὶ χρωμάτων)}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. col.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:div, title = {de divinatione (peri mantikes)}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. div.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:EthEud, title = { ethica Eudemia}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. Eth. Eud.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:ethNic, title = {ethica Nicomachea}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. eth. Nic.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:genan, title = {de generatione animalium}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. gen. an.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:gencorr, title = {de generatione et corruptione}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. gen. corr.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:hist, title = {historia animalium}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. hist.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:metaph, title = {metaphysica}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. metaph.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:meteor, title = {meteorologica}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. meteor.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:mir, title = {mirabilia}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. mir.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:mmor, title = {magna moralia}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. m. mor.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:motan, title = {de motu animalium}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. mot. an.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:mund, title = {de mundo (peri kosmu)}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. mund.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:oec, title = {oeconomica}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. oec.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:partan, title = {de partibus animalium}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. part. an.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:phgn, title = {physiognomica}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. phgn.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:phys, title = {physica}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. phys.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:poet, title = {poetica}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. poet.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:pol, title = {politica}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. pol.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:probl, title = {problemata}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. probl.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:rhet, title = {rhetorica}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. rhet.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:rhetAlex, title = {rhetorica ad Alexandrum}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. rhet. Alex.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:sens, title = {de sensu (περὶ αἰσθήσεως)}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. sens.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:somn, title = {de somno et vigilia (περὶ ὔπνου καὶ ἐγρηγόρσεως)}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. somn.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:sophel, title = {sophistici elenchi}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. soph. el.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:spir, title = {de spiritu}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. spir.}, options = {ancient}, keywords = {ancient}}
-@book{Aristot:top, title = {topica}, author = {Aristoteles}, shortauthor = {Aristoteles}, shorthand = {Aristot. top.}, options = {ancient}, keywords = {ancient}}
-@book{Arnob, title = {adversus nationes}, author = {}, shortauthor = {Arnobius}, shorthand = {Arnob.}, options = {ancient}, keywords = {ancient}}
-@book{Arr:an, title = {Anabasis}, author = {Arrianos}, shortauthor = {Arrian}, shorthand = {Arr. an.}, options = {ancient}, keywords = {ancient}}
-@book{Arr:cyn, title = {Cynegeticus}, author = {Arrianos}, shortauthor = {Arrian}, shorthand = {Arr. cyn.}, options = {ancient}, keywords = {ancient}}
-@book{Arr:Ind, title = {Indica}, author = {Arrianos}, shortauthor = {Arrian}, shorthand = {Arr. Ind.}, options = {ancient}, keywords = {ancient}}
-@book{Arr:perpE, title = {Periplus ponti Euxeni}, author = {Arrianos}, shortauthor = {Arrian}, shorthand = {Arr. per p. E.}, options = {ancient}, keywords = {ancient}}
-@book{Arr:succ, title = {Istoria successorum Alexandri}, author = {Arrianos}, shortauthor = {Arrian}, shorthand = {Arr. succ.}, options = {ancient}, keywords = {ancient}}
-@book{Arr:tact, title = {tactica}, author = {Arrianos}, shortauthor = {Arrian}, shorthand = {Arr. tact.}, options = {ancient}, keywords = {ancient}}
-@book{Artem, title = {Onirocriticon}, author = {}, shortauthor = {Artemidor}, shorthand = {Artem.}, options = {ancient}, keywords = {ancient}}
-@book{Athan:adConst, title = {Apologia ad Constantium}, author = {Athanasios}, shortauthor = {Athanasios}, shorthand = {Athan. ad Const.}, options = {ancient}, keywords = {ancient}}
-@book{Athan:cAr, title = {Apologia contra Arianos}, author = {Athanasios}, shortauthor = {Athanasios}, shorthand = {Athan. c. Ar.}, options = {ancient}, keywords = {ancient}}
-@book{Athan:fuga, title = {Apologia de fuga sua}, author = {Athanasios}, shortauthor = {Athanasios}, shorthand = {Athan. fuga}, options = {ancient}, keywords = {ancient}}
-@book{Athan:histAr, title = {Istoria Arianorum ad monachos}, author = {Athanasios}, shortauthor = {Athanasios}, shorthand = {Athan. hist. Ar.}, options = {ancient}, keywords = {ancient}}
-@book{Athen, title = {}, author = {Athenaios}, shortauthor = {Athenaios}, shorthand = {Athen.}, options = {ancient}, keywords = {ancient}}
-@book{Aug:civ, title = {de civitate dei}, author = {Augustinus}, shortauthor = {Augustinus}, shorthand = {Aug. civ.}, options = {ancient}, keywords = {ancient}}
-@book{Aug:conf, title = {confessiones}, author = {Augustinus}, shortauthor = {Augustinus}, shorthand = {Aug. conf.}, options = {ancient}, keywords = {ancient}}
-@book{Aug:doctchrist, title = {de doctrina christiana}, author = {Augustinus}, shortauthor = {Augustinus}, shorthand = {Aug. doct.christ.}, options = {ancient}, keywords = {ancient}}
-@book{Aug:epist, title = {epistulae}, author = {Augustinus}, shortauthor = {Augustinus}, shorthand = {Aug. epist.}, options = {ancient}, keywords = {ancient}}
-@book{Aug:retract, title = {retractationes}, author = {Augustinus}, shortauthor = {Augustinus}, shorthand = {Aug. retract.}, options = {ancient}, keywords = {ancient}}
-@book{Aug:serm, title = {sermones}, author = {Augustinus}, shortauthor = {Augustinus}, shorthand = {Aug. serm.}, options = {ancient}, keywords = {ancient}}
-@book{Aug:soliloq, title = {soliloquia}, author = {Augustinus}, shortauthor = {Augustinus}, shorthand = {Aug. soliloq.}, options = {ancient}, keywords = {ancient}}
-@book{Aug:trin, title = {de trinitate}, author = {Augustinus}, shortauthor = {Augustinus}, shorthand = {Aug. trin.}, options = {ancient}, keywords = {ancient}}
-@book{Aur:Vict, title = {}, author = {}, shortauthor = {Aurelius Victor}, shorthand = {Aur. Vict.}, options = {ancient}, keywords = {ancient}}
-@book{Auson:Mos, title = {Mosella}, author = {}, shortauthor = {Ausonius}, shorthand = {Auson. Mos.}, options = {ancient}, keywords = {ancient}}
-@book{Auson:urb, title = {ordo nobilium urbium}, author = {}, shortauthor = {Ausonius}, shorthand = {Auson. urb.}, options = {ancient}, keywords = {ancient}}
-@book{Avien, title = {}, author = {}, shortauthor = {Avienus}, shorthand = {Avien.}, options = {ancient}, keywords = {ancient}}
-@book{Babr, title = {}, author = {}, shortauthor = {Babrios}, shorthand = {Babr.}, options = {ancient}, keywords = {ancient}}
-@book{Bakchyl, title = {}, author = {}, shortauthor = {Bakchylides}, shorthand = {Bakchyl.}, options = {ancient}, keywords = {ancient}}
-@book{Boeth, title = {}, author = {}, shortauthor = {Boethius}, shorthand = {Boeth.}, options = {ancient}, keywords = {ancient}}
-@book{Caes:BellAfr, title = {Bellum Africum (Ps.-Caes.)}, author = {}, shortauthor = {Caesar}, shorthand = {Caes. Bell. Afr.}, options = {ancient}, keywords = {ancient}}
-@book{Caes:BellAlex, title = {Bellum Alexandrinum (Ps.-Caes.)}, author = {}, shortauthor = {Caesar}, shorthand = {Caes. Bell. Alex.}, options = {ancient}, keywords = {ancient}}
-@book{Caes:BellHisp, title = {Bellum Hispaniense (Ps.-Caes.)}, author = {}, shortauthor = {Caesar}, shorthand = {Caes. Bell. Hisp.}, options = {ancient}, keywords = {ancient}}
-@book{Caes:civ, title = {de bello civili}, author = {Iulius Caesar, Caius}, shortauthor = {Caesar}, shorthand = {Caes. civ.}, options = {ancient}, keywords = {ancient}}
-@book{Caes:Gall, title = {de bello Gallico}, author = {Iulius Caesar, Caius}, shortauthor = {Caesar}, shorthand = {Caes. Gall.}, options = {ancient}, keywords = {ancient}}
-@book{Calp:ecl, title = {Bucolica vel Eclogae}, author = {Calpurnius Siculus, Titus}, shortauthor = {Calpurnius}, shorthand = {Calp. ecl.}, options = {ancient}, keywords = {ancient}}
-@book{Cass:Dio, title = {}, author = {Cassius Dio Cocceianus, Lucius}, shortauthor = {Cassius Dio}, shorthand = {Cass. Dio}, options = {ancient}, keywords = {ancient}}
-@book{Cassiod:inst, title = {institutiones variae}, author = {}, shortauthor = {Cassiodorus}, shorthand = {Cassiod. inst.}, options = {ancient}, keywords = {ancient}}
-@book{Cato:agr, title = {de agri cultura}, author = {}, shortauthor = {Cato}, shorthand = {Cato agr.}, options = {ancient}, keywords = {ancient}}
-@book{Cato:Orig, title = {origines}, author = {}, shortauthor = {Cato}, shorthand = {Cato Orig.}, options = {ancient}, keywords = {ancient}}
-@book{Catull, title = {carmina}, author = {}, shortauthor = {Catullus}, shorthand = {Catull.}, options = {ancient}, keywords = {ancient}}
-@book{Cels, title = {De medicina}, author = {Cornelius Celsus, Aulus}, shortauthor = {Cornelius Celsus}, shorthand = {Cels.}, options = {ancient}, keywords = {ancient}}
-@book{Cels:artes, title = {}, author = {Cornelius Celsus, Aulus}, shortauthor = {Celsus}, shorthand = {Cels. artes}, options = {ancient}, keywords = {ancient}}
-@book{Cels:Dig, title = {Digesta}, author = {}, shortauthor = {Celsus}, shorthand = {Cels. Dig.}, options = {ancient}, keywords = {ancient}}
-@book{Cens, title = {de die natali}, author = {}, shortauthor = {Censorinus}, shorthand = {Cens.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:ac1, title = {Academicorum posteriorum liber 1}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. ac. 1}, options = {ancient}, keywords = {ancient}}
-@book{Cic:ac2, title = {Lucullus sive Academicorum priorum liber 2}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. ac. 2}, options = {ancient}, keywords = {ancient}}
-@book{Cic:adBrut, title = {epistulae ad Brutum}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. ad. Brut.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:adQfr, title = {ad Quintum fratrem}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. ad Q. fr.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Arat, title = {Aratea}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Arat.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Arch, title = {pro Archia poeta}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Arch.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Att, title = {epistulae ad Atticum}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Att.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Balb, title = {pro L. Balbo}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Balb.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Brut, title = {Brutus}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Brut.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Caecin, title = {pro A. Caecina}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Caecin.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Cael, title = {pro M. Caelio}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Cael.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Catil, title = {in Catilinam}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Catil.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Cato, title = {Cato maior de senectute}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Cato}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Cluent, title = {pro A. Cluentio}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Cluent.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Deiot, title = {pro rege Deiotaro}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Deiot.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:deorat, title = {de oratore}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. de orat.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:div, title = {de divinatione}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. div.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:divinCaec, title = {divinatio in Q. Caecilium}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. div. in Caec.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:fam, title = {epistulae ad familiares}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. fam.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:fat, title = {de fato}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. fat.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:fin, title = {de finibus bonorum et malorum}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. fin.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Flacc, title = {pro L. Valerio Flacco}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Flacc.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Font, title = {pro M. Fonteio}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Font.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:harresp, title = {de haruspicum responso}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. har. resp.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:inv, title = {de inventione}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. inv.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Lael, title = {Laelius de amicitia}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Lael.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:leg, title = {de legibus}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. leg.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:legagr, title = {de lege agraria}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. leg. agr.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Lig, title = {pro Q. Ligario}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Lig.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Manil, title = {pro lege Manilia (de imperio Cn. Pompei)}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Manil.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Marcell, title = {pro M. Marcello}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Marcell.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Mil, title = {pro T. Annio Milone}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Mil.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Mur, title = {pro L. Murena}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Mur.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:natdeor, title = {de natura deorum}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. nat. deor.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:off, title = {de officiis}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. off.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:optgen, title = {de optimo genere oratorum}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. opt. gen.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:orat, title = {orator}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. orat.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:parad, title = {paradoxa}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. parad.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:part, title = {partitiones oratoriae}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. part.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Phil, title = {in M. Antonium orationes Philippicae}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Phil.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Pis, title = {in L. Pisonem}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Pis.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Planc, title = {pro Cn. Plancio}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Planc.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:predadQuir, title = {oratio post reditum ad Quirites}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. p.red. ad Quir.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:predinsen, title = {oratio post reditum in senatu}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. p.red. in sen.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:QRosc, title = {pro Q. Roscio comoedo}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Q. Rosc.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Quinct, title = {pro P. Quinctio}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Quinct.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Rabperd, title = {pro C. Rabirioperduellionis reo}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Rab. perd.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Rabpost, title = {pro C. Rabirio Postumo}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Rab post.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:rep, title = {de re publica}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. rep.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Scaur, title = {pro M. Aemilio Scauro}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Scaur.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Sest, title = {pro P. Sestio}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Sest.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:SRosc, title = {pro Sex. Roscio Amerino}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. S. Rosc.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Sull, title = {pro P. Sulla}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Sull.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Tim, title = {Timaeus}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Tim.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:top, title = {topica}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. top.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Tull, title = {pro M.Tullio}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Tull.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Tusc, title = {Tusculanae disputationes}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Tusc.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Vatin, title = {in P. Vatinium testem interrogatio}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Vatin.}, options = {ancient}, keywords = {ancient}}
-@book{Cic:Verr12, title = {in Verrem actio prima, secunda}, author = {Tullius Cicero, Marcus}, shortauthor = {Cicero}, shorthand = {Cic. Verr. 1,2}, options = {ancient}, keywords = {ancient}}
-@book{Claud:carm, title = {carmina}, author = {}, shortauthor = {Claudius Claudianus}, shorthand = {Claud. carm.}, options = {ancient}, keywords = {ancient}}
-@book{Claud:raptPros, title = {de raptu Proserpinae}, author = {}, shortauthor = {Claudius Claudianus}, shorthand = {Claud. rapt. Pros.}, options = {ancient}, keywords = {ancient}}
-@book{CodIust, title = {Corpus Iuris Civilis, Codex Iustinianus}, author = {}, shortauthor = {}, shorthand = { Cod. Iust.}, options = {ancient}, keywords = {ancient}}
-@book{Colum, title = {}, author = {Iunius Moderatus Columella, Lucius}, shortauthor = {Columella}, shorthand = {Colum.}, options = {ancient}, keywords = {ancient}}
-@book{Curt, title = {historiae Alexandri Magni}, author = {}, shortauthor = {Curtius Rufus}, shorthand = {Curt.}, options = {ancient}, keywords = {ancient}}
-@book{Cypr, title = {}, author = {}, shortauthor = {Cyprianus}, shorthand = {Cypr.}, options = {ancient}, keywords = {ancient}}
-@book{Demokr, title = {}, author = {}, shortauthor = {Demokritos}, shorthand = {Demokr.}, options = {ancient}, keywords = {ancient}}
-@book{Demosth:or, title = {or.}, author = {Demosthenes}, shortauthor = {Demosthenes}, shorthand = {Demosth. or.}, options = {ancient}, keywords = {ancient}}
-@book{Dig, title = {Corpus Iuris Civilis, Digesta (Pandekten.}, author = {}, shortauthor = {}, shorthand = { Dig.}, options = {ancient}, keywords = {ancient}}
-@book{Diod, title = {}, author = {{Diodorus Siculus}}, shortauthor = {Diodorus Siculus}, shorthand = {Diod.}, options = {ancient}, keywords = {ancient}}
-@book{Diog:Laert, title = {}, author = {}, shortauthor = {Diogenes Laertios}, shorthand = {Diog. Laert.}, options = {ancient}, keywords = {ancient}}
-@book{Dion:Chrys, title = {Orationes}, author = {{Dion Chrysostomos}}, shortauthor = {Dion Chrysostomos}, shorthand = {Dion Chrys.}, options = {ancient}, keywords = {ancient}}
-@book{Dion:Halant, title = {antiquitates Romanae}, author = {}, shortauthor = {Dionysios Halicarnassos}, shorthand = {Dion. Hal. ant.}, options = {ancient}, keywords = {ancient}}
-@book{Dion:Halcomp, title = {de compositione verborum}, author = {}, shortauthor = {Dionysios Halicarnassos}, shorthand = {Dion. Hal. comp.}, options = {ancient}, keywords = {ancient}}
-@book{Dion:Halrhet, title = {ars rhetorica .}, author = {}, shortauthor = {Dionysios Halicarnassos}, shorthand = {Dion. Hal. rhet.}, options = {ancient}, keywords = {ancient}}
-@book{Don, title = {}, author = {}, shortauthor = {Donatus grammaticus}, shorthand = {Don.}, options = {ancient}, keywords = {ancient}}
-@book{Drac, title = {}, author = {}, shortauthor = {Dracontius}, shorthand = {Drac.}, options = {ancient}, keywords = {ancient}}
-@book{Dt, title = {}, author = {}, shortauthor = {Deuteronomium (= 5. Mose)}, shorthand = {Dt}, options = {ancient}, keywords = {ancient}}
-@book{Emp, title = {}, author = {}, shortauthor = {Empedokles}, shorthand = {Emp.}, options = {ancient}, keywords = {ancient}}
-@book{Enn:ann, title = {Annales (Skutsch, 1985)}, author = {}, shortauthor = {Ennius}, shorthand = {Enn. ann.}, options = {ancient}, keywords = {ancient}}
-@book{Enn:sat, title = {Saturae, (Vahlen, 21928)}, author = {}, shortauthor = {Ennius}, shorthand = {Enn. sat.}, options = {ancient}, keywords = {ancient}}
-@book{Enn:scaen, title = {fragmenta scenica (Vahlen, 21928)}, author = {}, shortauthor = {Ennius}, shorthand = {Enn. scaen.}, options = {ancient}, keywords = {ancient}}
-@book{Ennod, title = {}, author = {}, shortauthor = {Ennodius}, shorthand = {Ennod.}, options = {ancient}, keywords = {ancient}}
-@book{Eph, title = {}, author = {}, shortauthor = {Epheserbrief}, shorthand = {Eph}, options = {ancient}, keywords = {ancient}}
-@book{Epik, title = {}, author = {}, shortauthor = {Epikuros}, shorthand = {Epik.}, options = {ancient}, keywords = {ancient}}
-@book{Epikt, title = {}, author = {}, shortauthor = {Epiktetos}, shorthand = {Epikt.}, options = {ancient}, keywords = {ancient}}
-@book{Etym:m, title = {}, author = {}, shortauthor = {Etymologicum magnum (Gaisford)}, shorthand = {Etym. m.}, options = {ancient}, keywords = {ancient}}
-@book{Eukl:elem, title = {elem.}, author = {}, shortauthor = {Euklid}, shorthand = {Eukl. elem.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Alc, title = {Alcestis}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Alc.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Andr, title = {Andromache}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Andr.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Bacch, title = {Bacchae}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Bacch.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Cycl, title = {Cyclops}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Cycl.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:El, title = {Electra}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. El.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Hec, title = {Hecuba (Hekabe)}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Hec.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Hel, title = {Helena}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Hel.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Heracl, title = {Heraclidae}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Heracl.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Herc, title = {Hercules (furens)}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Herc.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Hipp, title = {Hippolytos}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Hipp.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Ion, title = {Ion}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Ion}, options = {ancient}, keywords = {ancient}}
-@book{Eur:IphA, title = {Iphigenia Aulidensis}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Iph. A.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:IphT, title = {Iphigenia Taurica}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Iph. T.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Med, title = {Medea}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Med.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Or, title = {Orestes}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Or.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Phoen, title = {Phoenissae}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Phoen.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Rhes, title = {Rhesus}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Rhes.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Suppl, title = {Supplices (ἱκέτιδες)}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Suppl.}, options = {ancient}, keywords = {ancient}}
-@book{Eur:Tro, title = {Troades}, author = {Euripides}, shortauthor = {Euripides}, shorthand = {Eur. Tro.}, options = {ancient}, keywords = {ancient}}
-@book{Eus:DeEv, title = {Demonstratio Evangelica}, author = {Eusebios}, shortauthor = {Eusebios}, shorthand = {Eus. De. Ev.}, options = {ancient}, keywords = {ancient}}
-@book{Eus:HE, title = {Historia Ecclesiastica}, author = {Eusebios}, shortauthor = {Eusebios}, shorthand = {Eus. HE}, options = {ancient}, keywords = {ancient}}
-@book{Eus:On, title = {Onomastikon}, author = {Eusebios}, shortauthor = {Eusebios}, shorthand = {Eus. On.}, options = {ancient}, keywords = {ancient}}
-@book{Eus:PrEv, title = {Praeparatio Evangelica}, author = {Eusebios}, shortauthor = {Eusebios}, shorthand = {Eus. Pr. Ev.}, options = {ancient}, keywords = {ancient}}
-@book{Eust, title = {}, author = {}, shortauthor = {Eustathios}, shorthand = {Eust.}, options = {ancient}, keywords = {ancient}}
-@book{Eutr, title = {}, author = {}, shortauthor = {Eutropius}, shorthand = {Eutr.}, options = {ancient}, keywords = {ancient}}
-@book{Fest, title = {}, author = {Pompeius Festus, {Sex}tus}, shortauthor = {Festus}, shorthand = {Fest.}, options = {ancient}, keywords = {ancient}}
-@book{Flor:epit, title = {epitoma de Tito Livio}, author = {Annius Florus, Publius}, shortauthor = {Florus}, shorthand = {Flor. epit.}, options = {ancient}, keywords = {ancient}}
-@book{Frontin:aqustrat, title = {de aquae ductu urbis Romae strategemata}, author = {}, shortauthor = {Frontinus}, shorthand = {Frontin. aqu. strat.}, options = {ancient}, keywords = {ancient}}
-@book{Fulg, title = {}, author = {}, shortauthor = {Fulgentius Afer}, shorthand = {Fulg.}, options = {ancient}, keywords = {ancient}}
-@book{Gal, title = {}, author = {}, shortauthor = {Galenos}, shorthand = {Gal.}, options = {ancient}, keywords = {ancient}}
-@book{Galbr, title = {}, author = {}, shortauthor = {Galaterbrief}, shorthand = {Gal}, options = {ancient}, keywords = {ancient}}
-@book{Gell, title = {noctes Atticae}, author = {Aulus Gellius}, shortauthor = {Gellius}, shorthand = {Gell.}, options = {ancient}, keywords = {ancient}}
-@book{Gorg, title = {}, author = {}, shortauthor = {Gorgias}, shorthand = {Gorg.}, options = {ancient}, keywords = {ancient}}
-@book{GregM:dial, title = {dialogi (de miraculis patrum Italicorum)}, author = {}, shortauthor = {Gregorius Magnus}, shorthand = {Greg. M. dial.}, options = {ancient}, keywords = {ancient}}
-@book{GregM:epist, title = {epistulae}, author = {}, shortauthor = {Gregorius Magnus}, shorthand = {Greg. M. epist.}, options = {ancient}, keywords = {ancient}}
-@book{GregM:past, title = {regula pastoralis}, author = {}, shortauthor = {Gregorius Magnus}, shorthand = {Greg. M. past.}, options = {ancient}, keywords = {ancient}}
-@book{GregNaz:epist, title = {epistulae}, author = {}, shortauthor = {Gregorius Nazianzienus}, shorthand = {Greg. Naz. epist.}, options = {ancient}, keywords = {ancient}}
-@book{GregNaz:or, title = {orationes}, author = {}, shortauthor = {Gregorius Nazianzienus}, shorthand = {Greg. Naz. or.}, options = {ancient}, keywords = {ancient}}
-@book{GregNyss, title = {}, author = {}, shortauthor = {Gregorius Nyssenus}, shorthand = {Greg. Nyss.}, options = {ancient}, keywords = {ancient}}
-@book{GregTur:Franc, title = {historia Francorum}, author = {}, shortauthor = {Gregorius von Tours}, shorthand = {Greg. Tur. Franc.}, options = {ancient}, keywords = {ancient}}
-@book{GregTur:Mart, title = {de virtutibus Martini}, author = {}, shortauthor = {Gregorius von Tours}, shorthand = {Greg. Tur. Mart.}, options = {ancient}, keywords = {ancient}}
-@book{GregTur:vitpatr, title = {de vita patrum}, author = {}, shortauthor = {Gregorius von Tours}, shorthand = {Greg. Tur. vit. patr.}, options = {ancient}, keywords = {ancient}}
-@book{Hdt, title = {}, author = {Herodotos}, shortauthor = {Herodot}, shorthand = {Hdt.}, options = {ancient}, keywords = {ancient}}
-@book{Hekat, title = {}, author = {}, shortauthor = {Hekataios}, shorthand = {Hekat.}, options = {ancient}, keywords = {ancient}}
-@book{Herakl, title = {}, author = {}, shortauthor = {Herakleitos}, shorthand = {Herakl.}, options = {ancient}, keywords = {ancient}}
-@book{Herakl:Pont, title = {}, author = {}, shortauthor = {Herakleides Pontikos}, shorthand = {Herakl. Pont.}, options = {ancient}, keywords = {ancient}}
-@book{Herm:Trism, title = {}, author = {}, shortauthor = {Hermes Trismegistos}, shorthand = {Herm. Trism.}, options = {ancient}, keywords = {ancient}}
-@book{Herodian, title = {ab excessu divi Marci}, author = {}, shortauthor = {Herodian}, shorthand = {Herodian.}, options = {ancient}, keywords = {ancient}}
-@book{Hes:cat, title = {Catalogues feminarum (ἠοίαι)}, author = {}, shortauthor = {Hesiodos}, shorthand = {Hes. cat.}, options = {ancient}, keywords = {ancient}}
-@book{Hes:erg, title = {opera et dies (ἔργα καὶ ἡμέραι)}, author = {}, shortauthor = {Hesiodos}, shorthand = {Hes. erg.}, options = {ancient}, keywords = {ancient}}
-@book{Hes:scut, title = {scutum (ἀσπίς)}, author = {}, shortauthor = {Hesiodos}, shorthand = {Hes. scut.}, options = {ancient}, keywords = {ancient}}
-@book{Hes:theog, title = {Theogonia}, author = {}, shortauthor = {Hesiodos}, shorthand = {Hes. theog.}, options = {ancient}, keywords = {ancient}}
-@book{Hesych, title = {}, author = {}, shortauthor = {Hesychios}, shorthand = {Hesych.}, options = {ancient}, keywords = {ancient}}
-@book{Hier:chron, title = {chronicon}, author = {}, shortauthor = {Hieronymos}, shorthand = {Hier. chron.}, options = {ancient}, keywords = {ancient}}
-@book{Hier:comminEz, title = {commentaria in Ezechielem (PL 25)}, author = {}, shortauthor = {Hieronymos}, shorthand = {Hier. comm. in Ez}, options = {ancient}, keywords = {ancient}}
-@book{Hier:epist, title = {epistulae}, author = {}, shortauthor = {Hieronymos}, shorthand = {Hier. epist.}, options = {ancient}, keywords = {ancient}}
-@book{Hier:On, title = {Onomastikon}, author = {}, shortauthor = {Hieronymos}, shorthand = {Hier. On.}, options = {ancient}, keywords = {ancient}}
-@book{Hier:virill, title = {de viris illustribus}, author = {}, shortauthor = {Hieronymos}, shorthand = {Hier. vir. ill.}, options = {ancient}, keywords = {ancient}}
-@book{Hippokr, title = {}, author = {}, shortauthor = {Hippokrates}, shorthand = {Hippokr.}, options = {ancient}, keywords = {ancient}}
-@book{HL, title = {}, author = {}, shortauthor = {Hohelied}, shorthand = {HL}, options = {ancient}, keywords = {ancient}}
-@book{Hom:h, title = {Hymni Homeri}, author = {Homeros}, shortauthor = {Homer}, shorthand = {Hom. h.}, options = {ancient}, keywords = {ancient}}
-@book{Hom:Il, title = {Ilias}, author = {Homeros}, shortauthor = {Homer}, shorthand = {Hom. Il.}, options = {ancient}, keywords = {ancient}}
-@book{Hom:Od, title = {Odyssee}, author = {Homeros}, shortauthor = {Homer}, shorthand = {Hom. Od.}, options = {ancient}, keywords = {ancient}}
-@book{Hor:ars, title = {ars poetica}, author = {Horatius Flaccus, Quintus}, shortauthor = {Horaz}, shorthand = {Hor. ars}, options = {ancient}, keywords = {ancient}}
-@book{Hor:carm, title = {carmina}, author = {Horatius Flaccus, Quintus}, shortauthor = {Horaz}, shorthand = {Hor. carm.}, options = {ancient}, keywords = {ancient}}
-@book{Hor:carmsaec, title = {carmen saeculare}, author = {Horatius Flaccus, Quintus}, shortauthor = {Horaz}, shorthand = {Hor. carm. saec.}, options = {ancient}, keywords = {ancient}}
-@book{Hor:epist, title = {epistulae}, author = {Horatius Flaccus, Quintus}, shortauthor = {Horaz}, shorthand = {Hor. epist.}, options = {ancient}, keywords = {ancient}}
-@book{Hor:epod, title = {epodi}, author = {Horatius Flaccus, Quintus}, shortauthor = {Horaz}, shorthand = {Hor. epod.}, options = {ancient}, keywords = {ancient}}
-@book{Hor:sat, title = {saturae (sermones)}, author = {Horatius Flaccus, Quintus}, shortauthor = {Horaz}, shorthand = {Hor. sat.}, options = {ancient}, keywords = {ancient}}
-@book{Hyg:astr, title = {astronomica}, author = {}, shortauthor = {Hygin}, shorthand = {Hyg. astr.}, options = {ancient}, keywords = {ancient}}
-@book{Hyg:fab, title = {fabulae}, author = {}, shortauthor = {Hygin}, shorthand = {Hyg. fab.}, options = {ancient}, keywords = {ancient}}
-@book{Iambl:demyst, title = {de mysteriis}, author = {}, shortauthor = {Iamblichos}, shorthand = {Iambl. de myst.}, options = {ancient}, keywords = {ancient}}
-@book{Iambl:protr, title = {protrepticus in philosophiam}, author = {}, shortauthor = {Iamblichos}, shorthand = {Iambl. protr.}, options = {ancient}, keywords = {ancient}}
-@book{Iambl:vP, title = {de vita Pythagorica}, author = {}, shortauthor = {Iamblichos}, shorthand = {Iambl. v. P.}, options = {ancient}, keywords = {ancient}}
-@book{InstIust, title = {Corpus Iuris Civilis, Institutiones}, author = {}, shortauthor = {}, shorthand = { Inst. Iust.}, options = {ancient}, keywords = {ancient}}
-@book{Ios:AntIud, title = {antiquitates Iudaicae}, author = {Flavius Josephus}, shortauthor = {Iosephos (Flavius Iosephus)}, shorthand = {Ios. Ant. Iud.}, options = {ancient}, keywords = {ancient}}
-@book{Ios:BellIud, title = {bellum Iudaicum}, author = {Flavius Josephus}, shortauthor = {Iosephos (Flavius Iosephus)}, shorthand = {Ios. Bell. Iud.}, options = {ancient}, keywords = {ancient}}
-@book{Ios:cAp, title = {contra Apionem}, author = {Flavius Josephus}, shortauthor = {Iosephos (Flavius Iosephus)}, shorthand = {Ios. c. Ap.}, options = {ancient}, keywords = {ancient}}
-@book{Ios:vita, title = {de sua vita}, author = {Flavius Josephus}, shortauthor = {Iosephos (Flavius Iosephus)}, shorthand = {Ios. vita}, options = {ancient}, keywords = {ancient}}
-@book{Isid:nat, title = {de natura rerum}, author = {}, shortauthor = {Isidorus von Sevilla}, shorthand = {Isid. nat.}, options = {ancient}, keywords = {ancient}}
-@book{Isid:orig, title = {origines (etymologiae)}, author = {}, shortauthor = {Isidorus von Sevilla}, shorthand = {Isid. orig.}, options = {ancient}, keywords = {ancient}}
-@book{Isokr:or, title = {orationes}, author = {}, shortauthor = {Isokrates}, shorthand = {Isokr. or.}, options = {ancient}, keywords = {ancient}}
-@book{ItinAnton, title = {Itinerarium Antonini}, author = {}, shortauthor = {}, shorthand = { Itin. Anton.}, options = {ancient}, keywords = {ancient}}
-@book{Iul:epist, title = {epistulae}, author = {}, shortauthor = {Iulianos}, shorthand = {Iul. epist.}, options = {ancient}, keywords = {ancient}}
-@book{Iul:inGal, title = {in Galilaeos}, author = {}, shortauthor = {Iulianos}, shorthand = {Iul. in Gal.}, options = {ancient}, keywords = {ancient}}
-@book{Iul:mis, title = {Misopogon}, author = {}, shortauthor = {Iulianos}, shorthand = {Iul. mis.}, options = {ancient}, keywords = {ancient}}
-@book{Iul:or, title = {orationes}, author = {}, shortauthor = {Iulianos}, shorthand = {Iul. or.}, options = {ancient}, keywords = {ancient}}
-@book{Iul:symp, title = {symposion}, author = {}, shortauthor = {Iulianos}, shorthand = {Iul. symp.}, options = {ancient}, keywords = {ancient}}
-@book{IulVict:Rhet, title = {ars rhetorica}, author = {}, shortauthor = {C. Iulius Victor}, shorthand = {Iul. Vict. Rhet.}, options = {ancient}, keywords = {ancient}}
-@book{Iust, title = {epitoma historiarum Philippicarum}, author = {}, shortauthor = {Iustinus}, shorthand = {Iust.}, options = {ancient}, keywords = {ancient}}
-@book{Iuv:sat, title = {saturae}, author = {Iunius Iuvenalis, Decimus}, shortauthor = {Iuvenal}, shorthand = {Iuv.}, options = {ancient}, keywords = {ancient}}
-@book{Iuvenc, title = {evangelia}, author = {}, shortauthor = {Iuvencus}, shorthand = {Iuvenc.}, options = {ancient}, keywords = {ancient}}
-@book{Jo, title = {}, author = {}, shortauthor = {Johannes}, shorthand = {Jo}, options = {ancient}, keywords = {ancient}}
-@book{Kall:epigr, title = {Epigrammata}, author = {}, shortauthor = {Kallimachos}, shorthand = {Kall. epigr.}, options = {ancient}, keywords = {ancient}}
-@book{Kall:frg, title = {fragmentum}, author = {}, shortauthor = {Kallimachos}, shorthand = {Kall. frg.}, options = {ancient}, keywords = {ancient}}
-@book{Kall:h, title = {hymni}, author = {}, shortauthor = {Kallimachos}, shorthand = {Kall. h.}, options = {ancient}, keywords = {ancient}}
-@book{Lact:inst, title = {divinae institutiones}, author = {}, shortauthor = {Lactantius}, shorthand = {Lact. inst.}, options = {ancient}, keywords = {ancient}}
-@book{Lact:ira, title = {de ira dei}, author = {}, shortauthor = {Lactantius}, shorthand = {Lact. ira}, options = {ancient}, keywords = {ancient}}
-@book{Lact:mortpers, title = {de mortibus persecutorum}, author = {}, shortauthor = {Lactantius}, shorthand = {Lact. mort. pers.}, options = {ancient}, keywords = {ancient}}
-@book{Lact:opif, title = {de opificio dei}, author = {}, shortauthor = {Lactantius}, shorthand = {Lact. opif.}, options = {ancient}, keywords = {ancient}}
-@book{Liv, title = {ab urbe condita}, author = {Livius, Titus}, shortauthor = {Livius}, shorthand = {Liv.}, options = {ancient}, keywords = {ancient}}
-@book{Lk, title = {}, author = {}, shortauthor = {Lukas}, shorthand = {Lk}, options = {ancient}, keywords = {ancient}}
-@book{Lucan, title = {bellum civile}, author = {}, shortauthor = {Lucanus}, shorthand = {Lucan.}, options = {ancient}, keywords = {ancient}}
-@book{Lucil, title = {saturae}, author = {}, shortauthor = {Lucilius}, shorthand = {Lucil.}, options = {ancient}, keywords = {ancient}}
-@book{Lucr, title = {de rerum natura}, author = {Lucretius Carus, Titus}, shortauthor = {Lukrez}, shorthand = {Lucr.}, options = {ancient}, keywords = {ancient}}
-@book{Lukian, title = {}, author = {}, shortauthor = {Lukianos}, shorthand = {Lukian.}, options = {ancient}, keywords = {ancient}}
-@book{LXX, title = {}, author = {}, shortauthor = {Septuaginta}, shorthand = {LXX}, options = {ancient}, keywords = {ancient}}
-@book{Lyd:mag, title = {de magistratibus}, author = {}, shortauthor = {Lydos}, shorthand = {Lyd. mag.}, options = {ancient}, keywords = {ancient}}
-@book{Lyd:mens, title = {de mensibus}, author = {}, shortauthor = {Lydos}, shorthand = {Lyd. mens.}, options = {ancient}, keywords = {ancient}}
-@book{Lykurg, title = {}, author = {}, shortauthor = {Lykurgos}, shorthand = {Lykurg.}, options = {ancient}, keywords = {ancient}}
-@book{Lys, title = {}, author = {}, shortauthor = {Lysias}, shorthand = {Lys.}, options = {ancient}, keywords = {ancient}}
-@book{Macr:Sat, title = {Saturnalia}, author = {}, shortauthor = {Macrobius}, shorthand = {Macr. Sat.}, options = {ancient}, keywords = {ancient}}
-@book{Manil, title = {astronomica}, author = {}, shortauthor = {Manilius}, shorthand = {Manil.}, options = {ancient}, keywords = {ancient}}
-@book{Mart, title = {Epigrammata}, author = {Valerius Martialis, Marcus}, shortauthor = {Martial}, shorthand = {Mart.}, options = {ancient}, keywords = {ancient}}
-@book{Mart:spect, title = {spectacula}, author = {Valerius Martialis, Marcus}, shortauthor = {Martial}, shorthand = {Mart. spect.}, options = {ancient}, keywords = {ancient}}
-@book{MartCap, title = {}, author = {}, shortauthor = {Martianus Capella}, shorthand = {Mart. Cap.}, options = {ancient}, keywords = {ancient}}
-@book{MarVictorin, title = {}, author = {}, shortauthor = {Marius Victorinus}, shorthand = {Mar. Victorin.}, options = {ancient}, keywords = {ancient}}
-@book{Maur, title = {}, author = {}, shortauthor = {Marcus Aurelius Antonius Augustus}, shorthand = {M. Aur.}, options = {ancient}, keywords = {ancient}}
-@book{Mel, title = {}, author = {}, shortauthor = {Pomponius Mela}, shorthand = {Mel.}, options = {ancient}, keywords = {ancient}}
-@book{Men:Dysk, title = {Dyskolo.}, author = {}, shortauthor = {Menandros}, shorthand = {Men. Dysk.}, options = {ancient}, keywords = {ancient}}
-@book{Men:Epitr, title = {Epitrepontes}, author = {}, shortauthor = {Menandros}, shorthand = {Men. Epitr.}, options = {ancient}, keywords = {ancient}}
-@book{Men:Sam, title = {Samia}, author = {}, shortauthor = {Menandros}, shorthand = {Men. Sam.}, options = {ancient}, keywords = {ancient}}
-@book{Mimn, title = {}, author = {}, shortauthor = {Mimnermos}, shorthand = {Mimn.}, options = {ancient}, keywords = {ancient}}
-@book{MinFel, title = {}, author = {}, shortauthor = {Oct. Minucius Felix}, shorthand = {Min. Fel.}, options = {ancient}, keywords = {ancient}}
-@book{Mk, title = {}, author = {}, shortauthor = {Markus}, shorthand = {Mk}, options = {ancient}, keywords = {ancient}}
-@book{Mosch, title = {}, author = {}, shortauthor = {Moschos}, shorthand = {Mosch.}, options = {ancient}, keywords = {ancient}}
-@book{Mt, title = {}, author = {}, shortauthor = {Matthäus}, shorthand = {Mt}, options = {ancient}, keywords = {ancient}}
-@book{Naev, title = {}, author = {}, shortauthor = {Naevius}, shorthand = {Naev.}, options = {ancient}, keywords = {ancient}}
-@book{Nep:Att, title = {Atticus}, author = {}, shortauthor = {Cornelius Nepos}, shorthand = {Nep. Att.}, options = {ancient}, keywords = {ancient}}
-@book{Nep:Hann, title = {Hannibal}, author = {}, shortauthor = {Cornelius Nepos}, shorthand = {Nep. Hann.}, options = {ancient}, keywords = {ancient}}
-@book{Nik:Alex, title = {Alexipharmaka}, author = {}, shortauthor = {Nikander}, shorthand = {Nik. Alex.}, options = {ancient}, keywords = {ancient}}
-@book{Nik:Ther, title = {Theriaka}, author = {}, shortauthor = {Nikander}, shorthand = {Nik. Ther.}, options = {ancient}, keywords = {ancient}}
-@book{Nm, title = {}, author = {}, shortauthor = {Numeri (= 4. Mose)}, shorthand = {Nm}, options = {ancient}, keywords = {ancient}}
-@book{Non, title = {}, author = {}, shortauthor = {Nonius}, shorthand = {Non.}, options = {ancient}, keywords = {ancient}}
-@book{Nonn:Dion, title = {Dion.}, author = {}, shortauthor = {{Nonnos von Panopolis}}, shorthand = {Nonn. Dion.}, options = {ancient}, keywords = {ancient}}
-@book{Nov, title = {Corpus Iuris Civilis, Leges Novellae}, author = {}, shortauthor = {}, shorthand = { Nov.}, options = {ancient}, keywords = {ancient}}
-@book{Orig, title = {}, author = {}, shortauthor = {Origines}, shorthand = {Orig.}, options = {ancient}, keywords = {ancient}}
-@book{Oros, title = {}, author = {Ovidius Naso, Publius}, shortauthor = {Orosius}, shorthand = {Oros..}, options = {ancient}, keywords = {ancient}}
-@book{Ov:am, title = {amores}, author = {Ovidius Naso, Publius}, shortauthor = {Ovid}, shorthand = {Ov. am.}, options = {ancient}, keywords = {ancient}}
-@book{Ov:ars, title = {ars amatoria}, author = {Ovidius Naso, Publius}, shortauthor = {Ovid}, shorthand = {Ov. ars}, options = {ancient}, keywords = {ancient}}
-@book{Ov:epist, title = {epistulae (heroides)}, author = {Ovidius Naso, Publius}, shortauthor = {Ovid}, shorthand = {Ov. epist.}, options = {ancient}, keywords = {ancient}}
-@book{Ov:fast, title = {fasti}, author = {Ovidius Naso, Publius}, shortauthor = {Ovid}, shorthand = {Ov. fast.}, options = {ancient}, keywords = {ancient}}
-@book{Ov:Ib, title = {Ibis}, author = {Ovidius Naso, Publius}, shortauthor = {Ovid}, shorthand = {Ov. Ib.}, options = {ancient}, keywords = {ancient}}
-@book{Ov:medic, title = {medicamina faciei femineae}, author = {Ovidius Naso, Publius}, shortauthor = {Ovid}, shorthand = {Ov. medic.}, options = {ancient}, keywords = {ancient}}
-@book{Ov:met, title = {metamorphoses}, author = {Ovidius Naso, Publius}, shortauthor = {Ovid}, shorthand = {Ov. met.}, options = {ancient}, keywords = {ancient}}
-@book{Ov:Pont, title = {epistulae ex Ponto}, author = {Ovidius Naso, Publius}, shortauthor = {Ovid}, shorthand = {Ov. Pont.}, options = {ancient}, keywords = {ancient}}
-@book{Ov:rem, title = {remedia amoris}, author = {Ovidius Naso, Publius}, shortauthor = {Ovid}, shorthand = {Ov. rem.}, options = {ancient}, keywords = {ancient}}
-@book{Ov:trist, title = {tristia}, author = {Ovidius Naso, Publius}, shortauthor = {Ovid}, shorthand = {Ov. trist.}, options = {ancient}, keywords = {ancient}}
-@book{Papin, title = {}, author = {}, shortauthor = {Aemilius Papinianus}, shorthand = {Papin.}, options = {ancient}, keywords = {ancient}}
-@book{Passmart, title = {Passiones martyrum}, author = {}, shortauthor = {}, shorthand = { Pass. mart.}, options = {ancient}, keywords = {ancient}}
-@book{Paus, title = {}, author = {Pausanias}, shortauthor = {Pausanias}, shorthand = {Paus.}, options = {ancient}, keywords = {ancient}}
-@book{Pers, title = {saturae}, author = {}, shortauthor = {Persius}, shorthand = {Pers.}, options = {ancient}, keywords = {ancient}}
-@book{Petron, title = {satyrica}, author = {}, shortauthor = {Petronius}, shorthand = {Petron.}, options = {ancient}, keywords = {ancient}}
-@book{Phaedr, title = {fabulae}, author = {}, shortauthor = {Phaedrus}, shorthand = {Phaedr.}, options = {ancient}, keywords = {ancient}}
-@book{Pind:frg, title = {fragmentum}, author = {Pindar}, shortauthor = {Pindar}, shorthand = {Pind. frg.}, options = {ancient}, keywords = {ancient}}
-@book{Pind:I, title = {Isthmien}, author = {Pindar}, shortauthor = {Pindar}, shorthand = {Pind. I.}, options = {ancient}, keywords = {ancient}}
-@book{Pind:N, title = {Nemeen}, author = {Pindar}, shortauthor = {Pindar}, shorthand = {Pind. N.}, options = {ancient}, keywords = {ancient}}
-@book{Pind:O, title = {Olympien}, author = {Pindar}, shortauthor = {Pindar}, shorthand = {Pind. O.}, options = {ancient}, keywords = {ancient}}
-@book{Pind:P, title = {Pythien}, author = {Pindar}, shortauthor = {Pindar}, shorthand = {Pind. P.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Alk1, title = {Alkibiades 1}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Alk. 1}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Alk2, title = {Alkibiades 2}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Alk. 2}, options = {ancient}, keywords = {ancient}}
-@book{Plat:apol, title = {apologia}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. apol.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Ax, title = {Axiochos}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Ax.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Charm, title = {Charmides}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Charm.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:def, title = {Definitiones (ὅροι)}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. def.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Dem, title = {Demodokos}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Dem.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:epin, title = {epinomis}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. epin.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:epist, title = {epistulae}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. epist.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:eras, title = {erastae}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. eras.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Eryx, title = {Eryxias}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Eryx.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Euthyd, title = {Euthydemos}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Euthyd.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Euthyphr, title = {Euthyphron}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Euthyphr.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Gorg, title = {Gorgias}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Gorg.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Hipparch, title = {Hipparchos}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Hipparch.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Hippmai, title = {Hippias maior}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Hipp. mai.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Hippmin, title = {Hippias minor}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Hipp. min.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Ion, title = {Ion}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Ion}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Kleit, title = {Kleitophon}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Kleit.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Krat, title = {Kratylos}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Krat.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Krit, title = {Kriton}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Krit.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Kritias, title = {Kritias}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Kritias}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Lach, title = {Laches}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Lach.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:leg, title = {leges (νόμοι)}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. leg.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Lys, title = {Lysis}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Lys.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Men, title = {Menon}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Men.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Min, title = {Minos}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Min.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Mx, title = {Menexenos}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Mx.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Parm, title = {Parmenides}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Parm.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Phaid, title = {Phaidon}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Phaid.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Phaidr, title = {Phaidros}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Phaidr.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Phil, title = {Philebos}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Phil.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:polit, title = {politicus}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. polit.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Prot, title = {Protagoras}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Prot.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:rep, title = {de re publica (πολιτεία)}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. rep.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Sis, title = {Sisyphos}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Sis.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:soph, title = {sophista}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. soph.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:symp, title = {symposium}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. symp.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Thg, title = {Theages}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Thg.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Tht, title = {Theaitetos}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Tht.}, options = {ancient}, keywords = {ancient}}
-@book{Plat:Tim, title = {Timaios}, author = {Platon}, shortauthor = {Platon}, shorthand = {Plat. Tim.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Amph, title = {Amphitruo}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Amph.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Asin, title = {Asinaria}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Asin.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Aul, title = {Aulularia}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Aul.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Bacch, title = {Bacchides}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Bacch.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Cist, title = {Cistellaria}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Cist.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Curc, title = {Curculio}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Curc.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Epid, title = {Epidicus}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Epid.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Men, title = {Menaechmi}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Men.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Merc, title = {Mercator}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Merc.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Mil, title = {Miles gloriosus}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Mil.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Most, title = {Mostellaria}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Most.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Poen, title = {Poenulus}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Poen.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Pseud, title = {Pseudolus}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Pseud.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Rud, title = {Rudens}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Rud.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Stich, title = {Stichus}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Stich.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Trin, title = {Trinummus}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Trin.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Truc, title = {Truculentus}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Truc.}, options = {ancient}, keywords = {ancient}}
-@book{Plaut:Vid, title = {Vidularia}, author = {Maccius Plautus, Titus}, shortauthor = {Plautus}, shorthand = {Plaut. Vid.}, options = {ancient}, keywords = {ancient}}
-@book{Plin:epist, title = {Epistulae}, author = {Plinius Caecilius Secundus, Caius}, shortauthor = {Plinius minor}, shorthand = {Plin. epist.}, options = {ancient}, keywords = {ancient}}
-@book{Plin:nat, title = {naturalis historia}, author = {Plinius Secundus, Caius}, shortauthor = {Plinius maior}, shorthand = {Plin. nat.}, options = {ancient}, keywords = {ancient}}
-@book{Plin:paneg, title = {panegyricus}, author = {Plinius Caecilius Secundus, Caius}, shortauthor = {Plinius minor}, shorthand = {Plin. paneg.}, options = {ancient}, keywords = {ancient}}
-@book{Plot, title = {}, author = {}, shortauthor = {Plotinos}, shorthand = {Plot.}, options = {ancient}, keywords = {ancient}}
-@book{Plut, title = {vitae parallelae}, author = {Plutarchos}, shortauthor = {Plutarch}, shorthand = {Plut.}, options = {ancient}, keywords = {ancient}}
-@book{Plut:am, title = {Amatorius (erotikos)}, author = {Plutarchos}, shortauthor = {Plutarch}, shorthand = {Plut. am.}, options = {ancient}, keywords = {ancient}}
-@book{Plut:dePythOr, title = {de Pythiae oraculis}, author = {Plutarchos}, shortauthor = {Plutarch}, shorthand = {Plut. de Pyth.Or.}, options = {ancient}, keywords = {ancient}}
-@book{Plut:Is, title = {de Iside et Osiride}, author = {Plutarchos}, shortauthor = {Plutarch}, shorthand = {Plut. Is.}, options = {ancient}, keywords = {ancient}}
-@book{Plut:mor, title = {moralia}, author = {Plutarchos}, shortauthor = {Plutarch}, shorthand = {Plut. mor.}, options = {ancient}, keywords = {ancient}}
-@book{Plut:quGr, title = {quaestiones Graecae}, author = {Plutarchos}, shortauthor = {Plutarch}, shorthand = {Plut. qu. Gr.}, options = {ancient}, keywords = {ancient}}
-@book{Plut:quR, title = {quaestiones Romanae}, author = {Plutarchos}, shortauthor = {Plutarch}, shorthand = {Plut. qu. R.}, options = {ancient}, keywords = {ancient}}
-@book{Plut:symp, title = {quaestiones convivales}, author = {Plutarchos}, shortauthor = {Plutarch}, shorthand = {Plut. symp.}, options = {ancient}, keywords = {ancient}}
-@book{Pol, title = {}, author = {}, shortauthor = {Polybios}, shorthand = {Pol.}, options = {ancient}, keywords = {ancient}}
-@book{Poll, title = {}, author = {}, shortauthor = {Pollux}, shorthand = {Poll.}, options = {ancient}, keywords = {ancient}}
-@book{Porph, title = {}, author = {}, shortauthor = {Porphyrios}, shorthand = {Porph.}, options = {ancient}, keywords = {ancient}}
-@book{Poseid, title = {}, author = {}, shortauthor = {Poseidonios}, shorthand = {Poseid.}, options = {ancient}, keywords = {ancient}}
-@book{Priap, title = {}, author = {}, shortauthor = {Priapea}, shorthand = {Priap.}, options = {ancient}, keywords = {ancient}}
-@book{Prisc, title = {}, author = {}, shortauthor = {Priscianus}, shorthand = {Prisc.}, options = {ancient}, keywords = {ancient}}
-@book{Prok:aed, title = {de aedificiis (περὶ κτισμάτων)}, author = {Prokopius}, shortauthor = {Prokop}, shorthand = {Prok. aed.}, options = {ancient}, keywords = {ancient}}
-@book{Prok:BG, title = {bellum Gothicum}, author = {Prokopius}, shortauthor = {Prokop}, shorthand = {Prok. BG}, options = {ancient}, keywords = {ancient}}
-@book{Prok:BP, title = {bellum Persicum}, author = {Prokopius}, shortauthor = {Prokop}, shorthand = {Prok. BP}, options = {ancient}, keywords = {ancient}}
-@book{Prok:BV, title = {bellum Vandalicum}, author = {Prokopius}, shortauthor = {Prokop}, shorthand = {Prok. BV}, options = {ancient}, keywords = {ancient}}
-@book{Prok:HA, title = {historia arcana}, author = {Prokopius}, shortauthor = {Prokop}, shorthand = {Prok. HA}, options = {ancient}, keywords = {ancient}}
-@book{Prokl, title = {}, author = {}, shortauthor = {Proklos}, shorthand = {Prokl.}, options = {ancient}, keywords = {ancient}}
-@book{Prop, title = {elegiae}, author = {Aurelius Propertius, {\relax Sex}tus}, shortauthor = {Properz}, shorthand = {Prop.}, options = {ancient}, keywords = {ancient}}
-@book{Prud, title = {}, author = {}, shortauthor = {Prudentius}, shorthand = {Prud.}, options = {ancient}, keywords = {ancient}}
-@book{Quint:decl, title = {declamationes minores}, author = {Fabius Quintilianus, Marcus}, shortauthor = {Quintilian}, shorthand = {Quint. decl.}, options = {ancient}, keywords = {ancient}}
-@book{Quint:inst, title = {institutio oratoria}, author = {Fabius Quintilianus, Marcus}, shortauthor = {Quintilian}, shorthand = {Quint. inst.}, options = {ancient}, keywords = {ancient}}
-@book{RgestdivAug, title = {Res gestae divi Augusti}, author = {}, shortauthor = {}, shorthand = { R. Gest. div. Aug.}, options = {ancient}, keywords = {ancient}}
-@book{Rhet:Her, title = {}, author = {}, shortauthor = {Rhetorica ad Herennium}, shorthand = {Rhet. Her.}, options = {ancient}, keywords = {ancient}}
-@book{Roem, title = {}, author = {}, shortauthor = {Römerbrief}, shorthand = {Röm}, options = {ancient}, keywords = {ancient}}
-@book{RutNam, title = {de reditu suo}, author = {}, shortauthor = {Rutilius Claudius Namatianus}, shorthand = {Rut. Nam.}, options = {ancient}, keywords = {ancient}}
-@book{Sall:Catil, title = {de coniuratione Catilinae}, author = {Sallustius Crispus, Caius}, shortauthor = {Sallust}, shorthand = {Sall. Catil.}, options = {ancient}, keywords = {ancient}}
-@book{Sall:epist, title = {epistulae ad Caesarem}, author = {Sallustius Crispus, Caius}, shortauthor = {Sallust}, shorthand = {Sall. epist.}, options = {ancient}, keywords = {ancient}}
-@book{Sall:hist, title = {historiae}, author = {Sallustius Crispus, Caius}, shortauthor = {Sallust}, shorthand = {Sall. hist.}, options = {ancient}, keywords = {ancient}}
-@book{Sall:Iug, title = {de bello Iugurthino}, author = {Sallustius Crispus, Caius}, shortauthor = {Sallust}, shorthand = {Sall. Iug.}, options = {ancient}, keywords = {ancient}}
-@book{Semp, title = {}, author = {}, shortauthor = {Sextus Empiricus}, shorthand = {S. Emp.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:apocol, title = {divi Claudii apocolocynthosis}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = {Sen. apocol.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:benef, title = {de beneficiis}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = {Sen. benef.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:clem, title = {de clementia}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = {Sen. clem.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:contr, title = {controversiae}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca maior}, shorthand = {Sen. contr.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:dial, title = {dialogi}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = {Sen. dial.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:epist, title = {epistulae morales ad Lucilium}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = {Sen. epist.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:Hercf, title = {Hercules furens}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = {Sen. Herc. f.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:HercO, title = {Hercules Oetaeus}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = { Herc. O.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:Med, title = {Medea}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = {Sen. Med.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:nat, title = {naturales quaestiones}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = {Sen. nat.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:Oed, title = {Oedipus}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = {Sen. Oed.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:Phaedr, title = {Phaedra}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = {Sen. Phaedr.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:Phoen, title = {Phoenissae}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = {Sen. Phoen.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:suas, title = {suasoriae}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca maior}, shorthand = {Sen. suas.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:Thy, title = {Thyestes}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = {Sen. Thy.}, options = {ancient}, keywords = {ancient}}
-@book{Sen:Tro, title = {Troades}, author = {Annaeus Seneca, Lucius}, shortauthor = {Seneca minor}, shorthand = {Sen. Tro.}, options = {ancient}, keywords = {ancient}}
-@book{Serv:Aen, title = {commentarius in Vergilii Aeneida}, author = {}, shortauthor = {Servius}, shorthand = {Serv. Aen.}, options = {ancient}, keywords = {ancient}}
-@book{Serv:auct, title = {}, author = {}, shortauthor = {Servius auctus Danielis}, shorthand = {Serv. auct.}, options = {ancient}, keywords = {ancient}}
-@book{Serv:ecl, title = {commentarius in Vergilii eclogas}, author = {}, shortauthor = {Servius}, shorthand = {Serv. ecl.}, options = {ancient}, keywords = {ancient}}
-@book{Serv:georg, title = {commentarius in Vergilii georgica}, author = {}, shortauthor = {Servius}, shorthand = {Serv. georg.}, options = {ancient}, keywords = {ancient}}
-@book{Sil, title = {Punica}, author = {}, shortauthor = {Silius Italicus}, shorthand = {Sil.}, options = {ancient}, keywords = {ancient}}
-@book{Sim, title = {}, author = {}, shortauthor = {Simonides}, shorthand = {Sim.}, options = {ancient}, keywords = {ancient}}
-@book{Simpl, title = {}, author = {}, shortauthor = {Simplikios}, shorthand = {Simpl.}, options = {ancient}, keywords = {ancient}}
-@book{Sol, title = {}, author = {}, shortauthor = {Solon}, shorthand = {Sol.}, options = {ancient}, keywords = {ancient}}
-@book{Soph:Ai, title = {Aias}, author = {}, shortauthor = {Sophokles}, shorthand = {Soph. Ai.}, options = {ancient}, keywords = {ancient}}
-@book{Soph:Ant, title = {Antigone}, author = {}, shortauthor = {Sophokles}, shorthand = {Soph. Ant.}, options = {ancient}, keywords = {ancient}}
-@book{Soph:El, title = {Electra}, author = {}, shortauthor = {Sophokles}, shorthand = {Soph. El.}, options = {ancient}, keywords = {ancient}}
-@book{Soph:OidK, title = {Oedipus Coloneus}, author = {}, shortauthor = {Sophokles}, shorthand = {Soph. Oid. K.}, options = {ancient}, keywords = {ancient}}
-@book{Soph:OidT, title = {Oedipus Rex (Oedipus Tyrannus)}, author = {}, shortauthor = {Sophokles}, shorthand = {Soph. Oid. T.}, options = {ancient}, keywords = {ancient}}
-@book{Soph:Phil, title = {Philoctetes}, author = {}, shortauthor = {Sophokles}, shorthand = {Soph. Phil.}, options = {ancient}, keywords = {ancient}}
-@book{Stat:Ach, title = {Achilleis}, author = {}, shortauthor = {Statius}, shorthand = {Stat. Ach.}, options = {ancient}, keywords = {ancient}}
-@book{Stat:silv, title = {silvae}, author = {}, shortauthor = {Statius}, shorthand = {Stat. silv.}, options = {ancient}, keywords = {ancient}}
-@book{Stat:Theb, title = {Thebais}, author = {}, shortauthor = {Statius}, shorthand = {Stat. Theb.}, options = {ancient}, keywords = {ancient}}
-@book{Stesich, title = {}, author = {}, shortauthor = {Stesichoros}, shorthand = {Stesich.}, options = {ancient}, keywords = {ancient}}
-@book{Stob, title = {}, author = {}, shortauthor = {Stobaios}, shorthand = {Stob.}, options = {ancient}, keywords = {ancient}}
-@book{Strab, title = {}, author = {}, shortauthor = {Strabon}, shorthand = {Strab.}, options = {ancient}, keywords = {ancient}}
-@book{Suet:Aug, title = {divus Augustus}, author = {Suetonius Tranquillus, Caius}, shortauthor = {Sueton}, shorthand = {Suet. Aug.}, options = {ancient}, keywords = {ancient}}
-@book{Suet:Cal, title = {Caligula}, author = {Suetonius Tranquillus, Caius}, shortauthor = {Sueton}, shorthand = {Suet. Cal.}, options = {ancient}, keywords = {ancient}}
-@book{Suet:Claud, title = {divus Claudius}, author = {Suetonius Tranquillus, Caius}, shortauthor = {Sueton}, shorthand = {Suet. Claud.}, options = {ancient}, keywords = {ancient}}
-@book{Suet:Dom, title = {Domitianus}, author = {Suetonius Tranquillus, Caius}, shortauthor = {Sueton}, shorthand = {Suet. Dom.}, options = {ancient}, keywords = {ancient}}
-@book{Suet:gramm, title = {de grammaticis}, author = {Suetonius Tranquillus, Caius}, shortauthor = {Sueton}, shorthand = {Suet. gramm.}, options = {ancient}, keywords = {ancient}}
-@book{Suet:Iul, title = {divus Iulius}, author = {Suetonius Tranquillus, Caius}, shortauthor = {Sueton}, shorthand = {Suet. Iul.}, options = {ancient}, keywords = {ancient}}
-@book{Suet:Tib, title = {divus Tiberius}, author = {Suetonius Tranquillus, Caius}, shortauthor = {Sueton}, shorthand = {Suet. Tib.}, options = {ancient}, keywords = {ancient}}
-@book{Suet:Tit, title = {divus Titus}, author = {Suetonius Tranquillus, Caius}, shortauthor = {Sueton}, shorthand = {Suet. Tit.}, options = {ancient}, keywords = {ancient}}
-@book{Suet:Vesp, title = {divus Vespasianus}, author = {Suetonius Tranquillus, Caius}, shortauthor = {Sueton}, shorthand = {Suet. Vesp.}, options = {ancient}, keywords = {ancient}}
-@book{Suet:Vit, title = {Vitellius}, author = {Suetonius Tranquillus, Caius}, shortauthor = {Sueton}, shorthand = {Suet. Vit.}, options = {ancient}, keywords = {ancient}}
-@book{Symm:epist, title = {epistulae}, author = {}, shortauthor = {Symmachus}, shorthand = {Symm. epist.}, options = {ancient}, keywords = {ancient}}
-@book{Symm:or, title = {orationes}, author = {}, shortauthor = {Symmachus}, shorthand = {Symm. or.}, options = {ancient}, keywords = {ancient}}
-@book{Symm:rel, title = {relationes}, author = {}, shortauthor = {Symmachus}, shorthand = {Symm. rel.}, options = {ancient}, keywords = {ancient}}
-@book{Synes:epist, title = {epistulae}, author = {}, shortauthor = {epist.}, shorthand = {Synes. Epist.}, options = {ancient}, keywords = {ancient}}
-@book{Tac:Agr, title = {Agricola}, author = {Cornelius Tacitus, Publius}, shortauthor = {Tacitus}, shorthand = {Tac. Agr.}, options = {ancient}, keywords = {ancient}}
-@book{Tac:ann, title = {annales}, author = {Cornelius Tacitus, Publius}, shortauthor = {Tacitus}, shorthand = {Tac. ann.}, options = {ancient}, keywords = {ancient}}
-@book{Tac:dial, title = {dialogus de oratoribus}, author = {Cornelius Tacitus, Publius}, shortauthor = {Tacitus}, shorthand = {Tac. dial.}, options = {ancient}, keywords = {ancient}}
-@book{Tac:Germ, title = {Germania}, author = {Cornelius Tacitus, Publius}, shortauthor = {Tacitus}, shorthand = {Tac. Germ.}, options = {ancient}, keywords = {ancient}}
-@book{Tac:hist, title = {historiae}, author = {Cornelius Tacitus, Publius}, shortauthor = {Tacitus}, shorthand = {Tac. hist.}, options = {ancient}, keywords = {ancient}}
-@book{Ter:Ad, title = {Adelphoe}, author = {Terentius Afer, Publius }, shortauthor = {Terenz}, shorthand = {Ter. Ad.}, options = {ancient}, keywords = {ancient}}
-@book{Ter:Andr, title = {Andria}, author = {Terentius Afer, Publius }, shortauthor = {Terenz}, shorthand = {Ter. Andr.}, options = {ancient}, keywords = {ancient}}
-@book{Ter:Eun, title = {Eunuchus}, author = {Terentius Afer, Publius }, shortauthor = {Terenz}, shorthand = {Ter. Eun.}, options = {ancient}, keywords = {ancient}}
-@book{Ter:Haut, title = {Heautontimorumenos}, author = {Terentius Afer, Publius }, shortauthor = {Terenz}, shorthand = {Ter. Haut.}, options = {ancient}, keywords = {ancient}}
-@book{Ter:Hec, title = {Hecyra}, author = {Terentius Afer, Publius }, shortauthor = {Terenz}, shorthand = {Ter. Hec.}, options = {ancient}, keywords = {ancient}}
-@book{Ter:Maur, title = {}, author = {}, shortauthor = {Terentianus Maurus}, shorthand = {Ter. Maur.}, options = {ancient}, keywords = {ancient}}
-@book{Ter:Phorm, title = {Phormio}, author = {Terentius Afer, Publius }, shortauthor = {Terenz}, shorthand = {Ter. Phorm.}, options = {ancient}, keywords = {ancient}}
-@book{Tert:apol, title = {apologeticum}, author = {Septimius, Quintus Tertullianus}, shortauthor = {Tertullianus}, shorthand = {Tert. apol.}, options = {ancient}, keywords = {ancient}}
-@book{Tert:nat, title = {ad nationes}, author = {Septimius, Quintus Tertullianus}, shortauthor = {Tertullianus}, shorthand = {Tert. nat.}, options = {ancient}, keywords = {ancient}}
-@book{Theokr, title = {}, author = {}, shortauthor = {Theokritos}, shorthand = {Theokr.}, options = {ancient}, keywords = {ancient}}
-@book{Thgn, title = {}, author = {}, shortauthor = {Theognis}, shorthand = {Thgn.}, options = {ancient}, keywords = {ancient}}
-@book{Thuk, title = {}, author = {}, shortauthor = {Thukydides}, shorthand = {Thuk.}, options = {ancient}, keywords = {ancient}}
-@book{Tib, title = {elegiae}, author = {}, shortauthor = {Tibullus}, shorthand = {Tib.}, options = {ancient}, keywords = {ancient}}
-@book{Ulp:reg, title = {(Ulpiani regulae)}, author = {}, shortauthor = {Ulpianus}, shorthand = {Ulp. Reg.}, options = {ancient}, keywords = {ancient}}
-@book{ValFl, title = {Argonautica}, author = {}, shortauthor = {Valerius Flaccus}, shorthand = {Val. Fl.}, options = {ancient}, keywords = {ancient}}
-@book{ValMax, title = {facta et dicta memorabilia}, author = {}, shortauthor = {Valerius Maximus}, shorthand = {Val. Max.}, options = {ancient}, keywords = {ancient}}
-@book{Varro:ling, title = {de lingua Latina}, author = {Terentius Varro, Marcus}, shortauthor = {Varro}, shorthand = {Varro ling.}, options = {ancient}, keywords = {ancient}}
-@book{Varro:Men, title = {saturae Menippeae}, author = {Terentius Varro, Marcus}, shortauthor = {Varro}, shorthand = {Varro Men.}, options = {ancient}, keywords = {ancient}}
-@book{Varro:rust, title = {res rusticae}, author = {Terentius Varro, Marcus}, shortauthor = {Varro}, shorthand = {Varro rust.}, options = {ancient}, keywords = {ancient}}
-@book{Vell, title = {historiae Romanae}, author = {{Velleius Paterculus}}, shortauthor = {Velleius Paterculus}, shorthand = {Vell. }, options = {ancient}, keywords = {ancient}}
-@book{Ven:Fort, title = {}, author = {}, shortauthor = {Venantius Fortunatus}, shorthand = {Ven. Fort.}, options = {ancient}, keywords = {ancient}}
-@book{Verg:Aen, title = {Aeneis}, author = {}, shortauthor = {Vergilius}, shorthand = {Verg. Aen.}, options = {ancient}, keywords = {ancient}}
-@book{Verg:catal, title = {catalepton}, author = {}, shortauthor = {Vergilius}, shorthand = {Verg. catal.}, options = {ancient}, keywords = {ancient}}
-@book{Verg:ecl, title = {eclogae}, author = {}, shortauthor = {Vergilius}, shorthand = {Verg. ecl.}, options = {ancient}, keywords = {ancient}}
-@book{Verg:georg, title = {georgica}, author = {}, shortauthor = {Vergilius}, shorthand = {Verg. georg.}, options = {ancient}, keywords = {ancient}}
-@book{Vitr, title = {de architectura}, author = {Vitruvius}, shortauthor = {Vitruv}, shorthand = {Vitr.}, options = {ancient}, keywords = {ancient}}
-@book{Vulg, title = {Vulgata}, author = {}, shortauthor = {}, shorthand = { Vulg.}, options = {ancient}, keywords = {ancient}}
-@book{Xen:an, title = {anabasis}, author = {Xenophon}, shortauthor = {Xenophon}, shorthand = {Xen. an.}, options = {ancient}, keywords = {ancient}}
-@book{Xen:apol, title = {apologia}, author = {Xenophon}, shortauthor = {Xenophon}, shorthand = {Xen. apol.}, options = {ancient}, keywords = {ancient}}
-@book{Xen:Athpol, title = {Athenaion politeia}, author = {Xenophon}, shortauthor = {Xenophon}, shorthand = {Xen. Ath. pol.}, options = {ancient}, keywords = {ancient}}
-@book{Xen:hell, title = {hellenica}, author = {Xenophon}, shortauthor = {Xenophon}, shorthand = {Xen. hell.}, options = {ancient}, keywords = {ancient}}
-@book{Xen:kyn, title = {cynegeticus}, author = {Xenophon}, shortauthor = {Xenophon}, shorthand = {Xen. kyn.}, options = {ancient}, keywords = {ancient}}
-@book{Xen:Kyr, title = {Cyrupaideia}, author = {Xenophon}, shortauthor = {Xenophon}, shorthand = {Xen. Kyr.}, options = {ancient}, keywords = {ancient}}
-@book{Xen:mem, title = {memorabilia (Apomnemoneumata)}, author = {Xenophon}, shortauthor = {Xenophon}, shorthand = {Xen. mem.}, options = {ancient}, keywords = {ancient}}
-@book{Xen:oec, title = {oeconomicus}, author = {Xenophon}, shortauthor = {Xenophon}, shorthand = {Xen. oec.}, options = {ancient}, keywords = {ancient}}
-@book{Xen:symp, title = {symposium}, author = {Xenophon}, shortauthor = {Xenophon}, shorthand = {Xen. symp.}, options = {ancient}, keywords = {ancient}}
-@book{Xenophan, title = {}, author = {}, shortauthor = {Xenophanes}, shorthand = {Xenophan.}, options = {ancient}, keywords = {ancient}}
-@book{Zen, title = {}, author = {}, shortauthor = {Zenon}, shorthand = {Zen.}, options = {ancient}, keywords = {ancient}}
-@book{Zenob, title = {}, author = {}, shortauthor = {Zenobios}, shorthand = {Zenob.}, options = {ancient}, keywords = {ancient}}
-@book{Zenod, title = {}, author = {}, shortauthor = {Zenodotos}, shorthand = {Zenod.}, options = {ancient}, keywords = {ancient}}
-@book{Zos, title = {}, author = {}, shortauthor = {Zosimos}, shorthand = {Zos.}, options = {ancient}, keywords = {ancient}}
+@book{Acc,
+ keywords = {ancient},
+ shortauthor = {Accius},
+ shorthand = {Acc.},
+}
+
+@book{AchTat,
+ keywords = {ancient},
+ shortauthor = {Tatios, Achilleus},
+ shorthand = {Ach. Tat.},
+}
+
+@book{Ael:Ep,
+ author = {Aelianus, Claudius},
+ title = {Epistulae rusticae},
+ keywords = {ancient},
+ shortauthor = {Aelian},
+ shorthand = {Ael. Ep.},
+}
+
+@book{Ael:Fr,
+ author = {Aelianus, Claudius},
+ title = {Fragmenta},
+ keywords = {ancient},
+ shortauthor = {Aelian},
+ shorthand = {Ael. Fr.},
+}
+
+@book{Ael:NA,
+ author = {Aelianus, Claudius},
+ title = {de natura animalium},
+ keywords = {ancient},
+ shortauthor = {Aelian},
+ shorthand = {Ael. NA},
+}
+
+@book{Ael:Tact,
+ author = {{Aelianus Tacticus}},
+ title = {Tactica (De instruendis aciebus)},
+ keywords = {ancient},
+ shortauthor = {{Aelianus Tacticus}},
+ shorthand = {Ael. Tact},
+}
+
+@book{Ael:VA,
+ author = {Aelianus, Claudius},
+ title = {varia historia},
+ keywords = {ancient},
+ shortauthor = {Aelian},
+ shorthand = {Ael. VH},
+}
+
+@book{AelArist:Or,
+ author = {{Aelius Aristides}},
+ title = {Orationes},
+ keywords = {ancient},
+ shortauthor = {{Aelius Aristides}},
+ shorthand = {Ael. Arist. Or.},
+}
+
+@book{AelArist:Technrhet,
+ author = {{Aelius Aristides}},
+ title = {Technai rhetorikai},
+ keywords = {ancient},
+ shortauthor = {{Aelius Aristides}},
+ shorthand = {Ael. Arist. Techn. rhet.},
+}
+
+@book{AenTact,
+ author = {{Aineias Taktikos}},
+ title = {Poliorketika},
+ keywords = {ancient},
+ shortauthor = {{Aineias Taktikos}},
+ shorthand = {Aen. Tact.},
+}
+
+@book{Aet,
+ keywords = {ancient},
+ shortauthor = {Aetios},
+ shorthand = {Aet.},
+}
+
+@book{Aischin:Ctes,
+ title = {in Ctesiphontum},
+ keywords = {ancient},
+ shortauthor = {Aischines},
+ shorthand = {Aischin. Ctes.},
+}
+
+@book{Aischin:epist,
+ title = {epistulae},
+ keywords = {ancient},
+ shortauthor = {Aischines},
+ shorthand = {Aischin. epist.},
+}
+
+@book{Aischin:leg,
+ title = {de falsa legatione},
+ keywords = {ancient},
+ shortauthor = {Aischines},
+ shorthand = {Aischin. leg.},
+}
+
+@book{Aischin:orat,
+ title = {Orationes},
+ keywords = {ancient},
+ shortauthor = {Aischines},
+ shorthand = {Aischin. orat.},
+}
+
+@book{Aischin:Tim,
+ title = {in Timarchum},
+ keywords = {ancient},
+ shortauthor = {Aischines},
+ shorthand = {Aischin. Tim.},
+}
+
+@book{Aischyl:Ag,
+ title = {Agamemnon},
+ keywords = {ancient},
+ shortauthor = {Aischylos},
+ shorthand = {Aischyl. Ag.},
+}
+
+@book{Aischyl:Choeph,
+ title = {Choephoroi},
+ keywords = {ancient},
+ shortauthor = {Aischylos},
+ shorthand = {Aischyl. Choeph.},
+}
+
+@book{Aischyl:Eum,
+ title = {Eumenides},
+ keywords = {ancient},
+ shortauthor = {Aischylos},
+ shorthand = {Aischyl. Eum.},
+}
+
+@book{Aischyl:Pers,
+ title = {Persae},
+ keywords = {ancient},
+ shortauthor = {Aischylos},
+ shorthand = {Aischyl. Pers.},
+}
+
+@book{Aischyl:Prom,
+ title = {Prometheus},
+ keywords = {ancient},
+ shortauthor = {Aischylos},
+ shorthand = {Aischyl. Prom.},
+}
+
+@book{Aischyl:Sept,
+ title = {Septem adversus Thebas},
+ keywords = {ancient},
+ shortauthor = {Aischylos},
+ shorthand = {Aischyl. Sept.},
+}
+
+@book{Aischyl:Suppl,
+ title = {Supplices (Hiketides)},
+ keywords = {ancient},
+ shortauthor = {Aischylos},
+ shorthand = {Aischyl. Suppl.},
+}
+
+@book{Aisop,
+ keywords = {ancient},
+ shortauthor = {Aisopos},
+ shorthand = {Aisop.},
+}
+
+@book{AlexAphr,
+ keywords = {ancient},
+ shortauthor = {von Aphrodisias, Alexandros},
+ shorthand = {Alex. Aphr.},
+}
+
+@book{Alk,
+ keywords = {ancient},
+ shortauthor = {Alkaios},
+ shorthand = {Alk.},
+}
+
+@book{Ambr:epist,
+ title = {epistulae},
+ keywords = {ancient},
+ shortauthor = {Ambrosius},
+ shorthand = {Ambr. epist.},
+}
+
+@book{Ambr:excSat,
+ title = {de excessu fratris (Satyri)},
+ keywords = {ancient},
+ shortauthor = {Ambrosius},
+ shorthand = {Ambr. exc. Sat.},
+}
+
+@book{Ambr:obitTheod,
+ title = {de obitu Theodosii},
+ keywords = {ancient},
+ shortauthor = {Ambrosius},
+ shorthand = {Ambr. obit. Theod.},
+}
+
+@book{Ambr:obitValent,
+ title = {de obitu Valentiniani (iunioris)},
+ keywords = {ancient},
+ shortauthor = {Ambrosius},
+ shorthand = {Ambr. obit. Valent.},
+}
+
+@book{Ambr:off,
+ title = {de officiis magistrorum},
+ keywords = {ancient},
+ shortauthor = {Ambrosius},
+ shorthand = {Ambr. off.},
+}
+
+@book{Ambr:paenit,
+ title = {de paenitentia},
+ keywords = {ancient},
+ shortauthor = {Ambrosius},
+ shorthand = {Ambr. paenit.},
+}
+
+@book{Amm,
+ author = {{Ammianus <Marcellinus>}},
+ keywords = {ancient},
+ shortauthor = {Marcellinus, Ammianus},
+ shorthand = {Amm.},
+}
+
+@book{Anakr,
+ keywords = {ancient},
+ shortauthor = {Anakreon},
+ shorthand = {Anakr.},
+}
+
+@book{Anaxag,
+ keywords = {ancient},
+ shortauthor = {Anaxagoras},
+ shorthand = {Anaxag.},
+}
+
+@book{Anaximand,
+ keywords = {ancient},
+ shortauthor = {Anaximandros},
+ shorthand = {Anaximand.},
+}
+
+@book{Anaximen,
+ keywords = {ancient},
+ shortauthor = {Anaximenes},
+ shorthand = {Anaximen.},
+}
+
+@book{And,
+ keywords = {ancient},
+ shortauthor = {Andokides},
+ shorthand = {And.},
+}
+
+@book{AnthGr,
+ keywords = {ancient},
+ shortauthor = {Graeca, Antologia},
+ shorthand = {Anth. Gr.},
+}
+
+@book{AnthLat,
+ keywords = {ancient},
+ shortauthor = {Latina, Antologia},
+ shorthand = {Anth. Lat.},
+}
+
+@book{AnthPal,
+ keywords = {ancient},
+ shortauthor = {Palatina, Antologia},
+ shorthand = {Anth. Pal.},
+}
+
+@book{AnthPlan,
+ keywords = {ancient},
+ shortauthor = {Planudea, Anthologia},
+ shorthand = {Anth. Plan.},
+}
+
+@book{Antiph,
+ keywords = {ancient},
+ shortauthor = {Antiphon},
+ shorthand = {Antiph.},
+}
+
+@book{Antisth,
+ keywords = {ancient},
+ shortauthor = {Antisthenes},
+ shorthand = {Antisth.},
+}
+
+@book{Apg,
+ title = {Apostelgeschichte},
+ keywords = {ancient},
+ shorthand = {Apg.},
+}
+
+@book{Apk,
+ title = {Apokalypse},
+ keywords = {ancient},
+ shorthand = {Apk.},
+}
+
+@book{Apollod:bibl,
+ title = {bibliotheke},
+ keywords = {ancient},
+ shortauthor = {Apollodoros},
+ shorthand = {Apollod. bibl.},
+}
+
+@book{Apollod:epit,
+ title = {epitome},
+ keywords = {ancient},
+ shortauthor = {Apollodoros},
+ shorthand = {Apollod. epit.},
+}
+
+@book{ApollRhod,
+ title = {Argonautica},
+ keywords = {ancient},
+ shortauthor = {Rhodios, Apollonios},
+ shorthand = {Apoll. Rhod.},
+}
+
+@book{App:Celt,
+ author = {Appian},
+ title = {Celtica},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. Celt.},
+}
+
+@book{App:civ,
+ author = {Appian},
+ title = {bella civilia},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. civ.},
+}
+
+@book{App:Hann,
+ author = {Appian},
+ title = {Hannibalica},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. Hann.},
+}
+
+@book{App:Ib,
+ author = {Appian},
+ title = {Iberica},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. Ib.},
+}
+
+@book{App:Ill,
+ author = {Appian},
+ title = {Illyrica},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. Ill.},
+}
+
+@book{App:It,
+ author = {Appian},
+ title = {Italica},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. It.},
+}
+
+@book{App:Lib,
+ author = {Appian},
+ title = {Libyca},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. Lib.},
+}
+
+@book{App:Mac,
+ author = {Appian},
+ title = {Macedonica},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. Mac.},
+}
+
+@book{App:Mithr,
+ author = {Appian},
+ title = {Mithridatius},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. Mithr.},
+}
+
+@book{App:pr,
+ author = {Appian},
+ title = {proemium},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. pr.},
+}
+
+@book{App:reg,
+ author = {Appian},
+ title = {regia},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. reg.},
+}
+
+@book{App:Rom,
+ author = {Appian},
+ title = {historia romana},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. Rom.},
+}
+
+@book{App:Samn,
+ author = {Appian},
+ title = {Samnitica},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. Samn.},
+}
+
+@book{App:Sic,
+ author = {Appian},
+ title = {Sicula},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. Sic.},
+}
+
+@book{App:Syr,
+ author = {Appian},
+ title = {Syriaca},
+ keywords = {ancient},
+ shortauthor = {Appian},
+ shorthand = {App. Syr.},
+}
+
+@book{Apul:Flor,
+ author = {Apuleius Madaurensis, Lucius},
+ title = {florida},
+ keywords = {ancient},
+ shortauthor = {Apuleius},
+ shorthand = {Apul. Flor.},
+}
+
+@book{Apul:met,
+ author = {Apuleius Madaurensis, Lucius},
+ title = {metamorphoses},
+ keywords = {ancient},
+ shortauthor = {Apuleius},
+ shorthand = {Apul. met.},
+}
+
+@book{Arat,
+ author = {Aratos},
+ keywords = {ancient},
+ shortauthor = {Aratos},
+ shorthand = {Arat.},
+}
+
+@book{Archil,
+ author = {Archilochos},
+ keywords = {ancient},
+ shortauthor = {Archilochos},
+ shorthand = {Archil.},
+}
+
+@book{Archim,
+ author = {Archimedes},
+ keywords = {ancient},
+ shortauthor = {Archimedes},
+ shorthand = {Archim.},
+}
+
+@book{Archyt,
+ author = {Archytas},
+ keywords = {ancient},
+ shortauthor = {Archytas},
+ shorthand = {Archyt.},
+}
+
+@book{Aristeid,
+ author = {Aristeides, Ailios},
+ keywords = {ancient},
+ shortauthor = {Aristeides, Ailios},
+ shorthand = {Aristeid.},
+}
+
+@book{Aristoph:Ach,
+ author = {Aristophanes},
+ title = {Acharnenses},
+ keywords = {ancient},
+ shortauthor = {Aristophanes},
+ shorthand = {Aristoph. Ach.},
+}
+
+@book{Aristoph:Av,
+ author = {Aristophanes},
+ title = {Aves (Ornithes)},
+ keywords = {ancient},
+ shortauthor = {Aristophanes},
+ shorthand = {Aristoph. Av.},
+}
+
+@book{Aristoph:Eccl,
+ author = {Aristophanes},
+ title = {Ecclesiazusae},
+ keywords = {ancient},
+ shortauthor = {Aristophanes},
+ shorthand = {Aristoph. Eccl.},
+}
+
+@book{Aristoph:Equ,
+ author = {Aristophanes},
+ title = {Equites (Hippeis)},
+ keywords = {ancient},
+ shortauthor = {Aristophanes},
+ shorthand = {Aristoph. Equ.},
+}
+
+@book{Aristoph:Lys,
+ author = {Aristophanes},
+ title = {Lysistrata},
+ keywords = {ancient},
+ shortauthor = {Aristophanes},
+ shorthand = {Aristoph. Lys.},
+}
+
+@book{Aristoph:Nub,
+ author = {Aristophanes},
+ title = {Nubes (Nephelai)},
+ keywords = {ancient},
+ shortauthor = {Aristophanes},
+ shorthand = {Aristoph. Nub.},
+}
+
+@book{Aristoph:Pax,
+ author = {Aristophanes},
+ title = {Pax (Eirene)},
+ keywords = {ancient},
+ shortauthor = {Aristophanes},
+ shorthand = {Aristoph. Pax},
+}
+
+@book{Aristoph:Plut,
+ author = {Aristophanes},
+ title = {Plutus},
+ keywords = {ancient},
+ shortauthor = {Aristophanes},
+ shorthand = {Aristoph. Plut.},
+}
+
+@book{Aristoph:Ran,
+ author = {Aristophanes},
+ title = {Ranae (Batrachoi)},
+ keywords = {ancient},
+ shortauthor = {Aristophanes},
+ shorthand = {Aristoph. Ran.},
+}
+
+@book{Aristoph:Thesm,
+ author = {Aristophanes},
+ title = {Thesmophoriazusae},
+ keywords = {ancient},
+ shortauthor = {Aristophanes},
+ shorthand = {Aristoph. Thesm.},
+}
+
+@book{Aristoph:Vesp,
+ author = {Aristophanes},
+ title = {Vespae (Sphekes)},
+ keywords = {ancient},
+ shortauthor = {Aristophanes},
+ shorthand = {Aristoph. Vesp.},
+}
+
+@book{Aristot:an,
+ author = {Aristoteles},
+ title = {de anima (peri psyches)},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. an.},
+}
+
+@book{Aristot:anpost,
+ author = {Aristoteles},
+ title = {analytica posteriora},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. an post.},
+}
+
+@book{Aristot:anpr,
+ author = {Aristoteles},
+ title = {analytica priora},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. an pr.},
+}
+
+@book{Aristot:Athpol,
+ author = {Aristoteles},
+ title = {Athenaion politeia},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. Ath. pol.},
+}
+
+@book{Aristot:cael,
+ author = {Aristoteles},
+ title = {de caelo},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. cael.},
+}
+
+@book{Aristot:cat,
+ author = {Aristoteles},
+ title = {categoriae},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. cat.},
+}
+
+@book{Aristot:col,
+ author = {Aristoteles},
+ title = {de coloribus (περὶ χρωμάτων)},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. col.},
+}
+
+@book{Aristot:div,
+ author = {Aristoteles},
+ title = {de divinatione (peri mantikes)},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. div.},
+}
+
+@book{Aristot:EthEud,
+ author = {Aristoteles},
+ title = {ethica Eudemia},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. Eth. Eud.},
+}
+
+@book{Aristot:ethNic,
+ author = {Aristoteles},
+ title = {ethica Nicomachea},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. eth. Nic.},
+}
+
+@book{Aristot:genan,
+ author = {Aristoteles},
+ title = {de generatione animalium},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. gen. an.},
+}
+
+@book{Aristot:gencorr,
+ author = {Aristoteles},
+ title = {de generatione et corruptione},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. gen. corr.},
+}
+
+@book{Aristot:hist,
+ author = {Aristoteles},
+ title = {historia animalium},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. hist.},
+}
+
+@book{Aristot:metaph,
+ author = {Aristoteles},
+ title = {metaphysica},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. metaph.},
+}
+
+@book{Aristot:meteor,
+ author = {Aristoteles},
+ title = {meteorologica},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. meteor.},
+}
+
+@book{Aristot:mir,
+ author = {Aristoteles},
+ title = {mirabilia},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. mir.},
+}
+
+@book{Aristot:mmor,
+ author = {Aristoteles},
+ title = {magna moralia},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. m. mor.},
+}
+
+@book{Aristot:motan,
+ author = {Aristoteles},
+ title = {de motu animalium},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. mot. an.},
+}
+
+@book{Aristot:mund,
+ author = {Aristoteles},
+ title = {de mundo (peri kosmu)},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. mund.},
+}
+
+@book{Aristot:oec,
+ author = {Aristoteles},
+ title = {oeconomica},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. oec.},
+}
+
+@book{Aristot:partan,
+ author = {Aristoteles},
+ title = {de partibus animalium},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. part. an.},
+}
+
+@book{Aristot:phgn,
+ author = {Aristoteles},
+ title = {physiognomica},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. phgn.},
+}
+
+@book{Aristot:phys,
+ author = {Aristoteles},
+ title = {physica},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. phys.},
+}
+
+@book{Aristot:poet,
+ author = {Aristoteles},
+ title = {poetica},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. poet.},
+}
+
+@book{Aristot:pol,
+ author = {Aristoteles},
+ title = {politica},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. pol.},
+}
+
+@book{Aristot:probl,
+ author = {Aristoteles},
+ title = {problemata},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. probl.},
+}
+
+@book{Aristot:rhet,
+ author = {Aristoteles},
+ title = {rhetorica},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. rhet.},
+}
+
+@book{Aristot:rhetAlex,
+ author = {Aristoteles},
+ title = {rhetorica ad Alexandrum},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. rhet. Alex.},
+}
+
+@book{Aristot:sens,
+ author = {Aristoteles},
+ title = {de sensu (περὶ αἰσθήσεως)},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. sens.},
+}
+
+@book{Aristot:somn,
+ author = {Aristoteles},
+ title = {de somno et vigilia (περὶ ὔπνου καὶ ἐγρηγόρσεως)},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. somn.},
+}
+
+@book{Aristot:sophel,
+ author = {Aristoteles},
+ title = {sophistici elenchi},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. soph. el.},
+}
+
+@book{Aristot:spir,
+ author = {Aristoteles},
+ title = {de spiritu},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. spir.},
+}
+
+@book{Aristot:top,
+ author = {Aristoteles},
+ title = {topica},
+ keywords = {ancient},
+ shortauthor = {Aristoteles},
+ shorthand = {Aristot. top.},
+}
+
+@book{Arnob,
+ title = {adversus nationes},
+ keywords = {ancient},
+ shortauthor = {Arnobius},
+ shorthand = {Arnob.},
+}
+
+@book{Arr:an,
+ author = {Arrianos},
+ title = {Anabasis},
+ keywords = {ancient},
+ shortauthor = {Arrian},
+ shorthand = {Arr. an.},
+}
+
+@book{Arr:cyn,
+ author = {Arrianos},
+ title = {Cynegeticus},
+ keywords = {ancient},
+ shortauthor = {Arrian},
+ shorthand = {Arr. cyn.},
+}
+
+@book{Arr:Ind,
+ author = {Arrianos},
+ title = {Indica},
+ keywords = {ancient},
+ shortauthor = {Arrian},
+ shorthand = {Arr. Ind.},
+}
+
+@book{Arr:perpE,
+ author = {Arrianos},
+ title = {Periplus ponti Euxeni},
+ keywords = {ancient},
+ shortauthor = {Arrian},
+ shorthand = {Arr. per p. E.},
+}
+
+@book{Arr:succ,
+ author = {Arrianos},
+ title = {Istoria successorum Alexandri},
+ keywords = {ancient},
+ shortauthor = {Arrian},
+ shorthand = {Arr. succ.},
+}
+
+@book{Arr:tact,
+ author = {Arrianos},
+ title = {tactica},
+ keywords = {ancient},
+ shortauthor = {Arrian},
+ shorthand = {Arr. tact.},
+}
+
+@book{Artem,
+ title = {Onirocriticon},
+ keywords = {ancient},
+ shortauthor = {Artemidor},
+ shorthand = {Artem.},
+}
+
+@book{Athan:adConst,
+ author = {Athanasios},
+ title = {Apologia ad Constantium},
+ keywords = {ancient},
+ shortauthor = {Athanasios},
+ shorthand = {Athan. ad Const.},
+}
+
+@book{Athan:cAr,
+ author = {Athanasios},
+ title = {Apologia contra Arianos},
+ keywords = {ancient},
+ shortauthor = {Athanasios},
+ shorthand = {Athan. c. Ar.},
+}
+
+@book{Athan:fuga,
+ author = {Athanasios},
+ title = {Apologia de fuga sua},
+ keywords = {ancient},
+ shortauthor = {Athanasios},
+ shorthand = {Athan. fuga},
+}
+
+@book{Athan:histAr,
+ author = {Athanasios},
+ title = {Istoria Arianorum ad monachos},
+ keywords = {ancient},
+ shortauthor = {Athanasios},
+ shorthand = {Athan. hist. Ar.},
+}
+
+@book{Athen,
+ author = {Athenaios},
+ keywords = {ancient},
+ shortauthor = {Athenaios},
+ shorthand = {Athen.},
+}
+
+@book{Aug:civ,
+ author = {Augustinus},
+ title = {de civitate dei},
+ keywords = {ancient},
+ shortauthor = {Augustinus},
+ shorthand = {Aug. civ.},
+}
+
+@book{Aug:conf,
+ author = {Augustinus},
+ title = {confessiones},
+ keywords = {ancient},
+ shortauthor = {Augustinus},
+ shorthand = {Aug. conf.},
+}
+
+@book{Aug:doctchrist,
+ author = {Augustinus},
+ title = {de doctrina christiana},
+ keywords = {ancient},
+ shortauthor = {Augustinus},
+ shorthand = {Aug. doct.christ.},
+}
+
+@book{Aug:epist,
+ author = {Augustinus},
+ title = {epistulae},
+ keywords = {ancient},
+ shortauthor = {Augustinus},
+ shorthand = {Aug. epist.},
+}
+
+@book{Aug:retract,
+ author = {Augustinus},
+ title = {retractationes},
+ keywords = {ancient},
+ shortauthor = {Augustinus},
+ shorthand = {Aug. retract.},
+}
+
+@book{Aug:serm,
+ author = {Augustinus},
+ title = {sermones},
+ keywords = {ancient},
+ shortauthor = {Augustinus},
+ shorthand = {Aug. serm.},
+}
+
+@book{Aug:soliloq,
+ author = {Augustinus},
+ title = {soliloquia},
+ keywords = {ancient},
+ shortauthor = {Augustinus},
+ shorthand = {Aug. soliloq.},
+}
+
+@book{Aug:trin,
+ author = {Augustinus},
+ title = {de trinitate},
+ keywords = {ancient},
+ shortauthor = {Augustinus},
+ shorthand = {Aug. trin.},
+}
+
+@book{Aur:Vict,
+ keywords = {ancient},
+ shortauthor = {Victor, Aurelius},
+ shorthand = {Aur. Vict.},
+}
+
+@book{Auson:Mos,
+ title = {Mosella},
+ keywords = {ancient},
+ shortauthor = {Ausonius},
+ shorthand = {Auson. Mos.},
+}
+
+@book{Auson:urb,
+ title = {ordo nobilium urbium},
+ keywords = {ancient},
+ shortauthor = {Ausonius},
+ shorthand = {Auson. urb.},
+}
+
+@book{Avien,
+ keywords = {ancient},
+ shortauthor = {Avienus},
+ shorthand = {Avien.},
+}
+
+@book{Babr,
+ keywords = {ancient},
+ shortauthor = {Babrios},
+ shorthand = {Babr.},
+}
+
+@book{Bakchyl,
+ keywords = {ancient},
+ shortauthor = {Bakchylides},
+ shorthand = {Bakchyl.},
+}
+
+@book{Boeth,
+ keywords = {ancient},
+ shortauthor = {Boethius},
+ shorthand = {Boeth.},
+}
+
+@book{Caes:BellAfr,
+ title = {Bellum Africum (Ps.-Caes.)},
+ keywords = {ancient},
+ shortauthor = {Caesar},
+ shorthand = {Caes. Bell. Afr.},
+}
+
+@book{Caes:BellAlex,
+ title = {Bellum Alexandrinum (Ps.-Caes.)},
+ keywords = {ancient},
+ shortauthor = {Caesar},
+ shorthand = {Caes. Bell. Alex.},
+}
+
+@book{Caes:BellHisp,
+ title = {Bellum Hispaniense (Ps.-Caes.)},
+ keywords = {ancient},
+ shortauthor = {Caesar},
+ shorthand = {Caes. Bell. Hisp.},
+}
+
+@book{Caes:civ,
+ author = {Iulius Caesar, Caius},
+ title = {de bello civili},
+ keywords = {ancient},
+ shortauthor = {Caesar},
+ shorthand = {Caes. civ.},
+}
+
+@book{Caes:Gall,
+ author = {Iulius Caesar, Caius},
+ title = {de bello Gallico},
+ keywords = {ancient},
+ shortauthor = {Caesar},
+ shorthand = {Caes. Gall.},
+}
+
+@book{Calp:ecl,
+ author = {Calpurnius Siculus, Titus},
+ title = {Bucolica vel Eclogae},
+ keywords = {ancient},
+ shortauthor = {Calpurnius},
+ shorthand = {Calp. ecl.},
+}
+
+@book{Cass:Dio,
+ author = {Cassius Dio Cocceianus, Lucius},
+ keywords = {ancient},
+ shortauthor = {Dio, Cassius},
+ shorthand = {Cass. Dio},
+}
+
+@book{Cassiod:inst,
+ title = {institutiones variae},
+ keywords = {ancient},
+ shortauthor = {Cassiodorus},
+ shorthand = {Cassiod. inst.},
+}
+
+@book{Cato:agr,
+ title = {de agri cultura},
+ keywords = {ancient},
+ shortauthor = {Cato},
+ shorthand = {Cato agr.},
+}
+
+@book{Cato:Orig,
+ title = {origines},
+ keywords = {ancient},
+ shortauthor = {Cato},
+ shorthand = {Cato Orig.},
+}
+
+@book{Catull,
+ title = {carmina},
+ keywords = {ancient},
+ shortauthor = {Catullus},
+ shorthand = {Catull.},
+}
+
+@book{Cels,
+ author = {Cornelius Celsus, Aulus},
+ title = {De medicina},
+ keywords = {ancient},
+ shortauthor = {Celsus, Cornelius},
+ shorthand = {Cels.},
+}
+
+@book{Cels:artes,
+ author = {Cornelius Celsus, Aulus},
+ keywords = {ancient},
+ shortauthor = {Celsus},
+ shorthand = {Cels. artes},
+}
+
+@book{Cels:Dig,
+ title = {Digesta},
+ keywords = {ancient},
+ shortauthor = {Celsus},
+ shorthand = {Cels. Dig.},
+}
+
+@book{Cens,
+ title = {de die natali},
+ keywords = {ancient},
+ shortauthor = {Censorinus},
+ shorthand = {Cens.},
+}
+
+@book{Cic:ac1,
+ author = {Tullius Cicero, Marcus},
+ title = {Academicorum posteriorum liber 1},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. ac. 1},
+}
+
+@book{Cic:ac2,
+ author = {Tullius Cicero, Marcus},
+ title = {Lucullus sive Academicorum priorum liber 2},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. ac. 2},
+}
+
+@book{Cic:adBrut,
+ author = {Tullius Cicero, Marcus},
+ title = {epistulae ad Brutum},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. ad. Brut.},
+}
+
+@book{Cic:adQfr,
+ author = {Tullius Cicero, Marcus},
+ title = {ad Quintum fratrem},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. ad Q. fr.},
+}
+
+@book{Cic:Arat,
+ author = {Tullius Cicero, Marcus},
+ title = {Aratea},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Arat.},
+}
+
+@book{Cic:Arch,
+ author = {Tullius Cicero, Marcus},
+ title = {pro Archia poeta},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Arch.},
+}
+
+@book{Cic:Att,
+ author = {Tullius Cicero, Marcus},
+ title = {epistulae ad Atticum},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Att.},
+}
+
+@book{Cic:Balb,
+ author = {Tullius Cicero, Marcus},
+ title = {pro L. Balbo},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Balb.},
+}
+
+@book{Cic:Brut,
+ author = {Tullius Cicero, Marcus},
+ title = {Brutus},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Brut.},
+}
+
+@book{Cic:Caecin,
+ author = {Tullius Cicero, Marcus},
+ title = {pro A. Caecina},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Caecin.},
+}
+
+@book{Cic:Cael,
+ author = {Tullius Cicero, Marcus},
+ title = {pro M. Caelio},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Cael.},
+}
+
+@book{Cic:Catil,
+ author = {Tullius Cicero, Marcus},
+ title = {in Catilinam},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Catil.},
+}
+
+@book{Cic:Cato,
+ author = {Tullius Cicero, Marcus},
+ title = {Cato maior de senectute},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Cato},
+}
+
+@book{Cic:Cluent,
+ author = {Tullius Cicero, Marcus},
+ title = {pro A. Cluentio},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Cluent.},
+}
+
+@book{Cic:Deiot,
+ author = {Tullius Cicero, Marcus},
+ title = {pro rege Deiotaro},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Deiot.},
+}
+
+@book{Cic:deorat,
+ author = {Tullius Cicero, Marcus},
+ title = {de oratore},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. de orat.},
+}
+
+@book{Cic:div,
+ author = {Tullius Cicero, Marcus},
+ title = {de divinatione},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. div.},
+}
+
+@book{Cic:divinCaec,
+ author = {Tullius Cicero, Marcus},
+ title = {divinatio in Q. Caecilium},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. div. in Caec.},
+}
+
+@book{Cic:fam,
+ author = {Tullius Cicero, Marcus},
+ title = {epistulae ad familiares},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. fam.},
+}
+
+@book{Cic:fat,
+ author = {Tullius Cicero, Marcus},
+ title = {de fato},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. fat.},
+}
+
+@book{Cic:fin,
+ author = {Tullius Cicero, Marcus},
+ title = {de finibus bonorum et malorum},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. fin.},
+}
+
+@book{Cic:Flacc,
+ author = {Tullius Cicero, Marcus},
+ title = {pro L. Valerio Flacco},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Flacc.},
+}
+
+@book{Cic:Font,
+ author = {Tullius Cicero, Marcus},
+ title = {pro M. Fonteio},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Font.},
+}
+
+@book{Cic:harresp,
+ author = {Tullius Cicero, Marcus},
+ title = {de haruspicum responso},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. har. resp.},
+}
+
+@book{Cic:inv,
+ author = {Tullius Cicero, Marcus},
+ title = {de inventione},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. inv.},
+}
+
+@book{Cic:Lael,
+ author = {Tullius Cicero, Marcus},
+ title = {Laelius de amicitia},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Lael.},
+}
+
+@book{Cic:leg,
+ author = {Tullius Cicero, Marcus},
+ title = {de legibus},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. leg.},
+}
+
+@book{Cic:legagr,
+ author = {Tullius Cicero, Marcus},
+ title = {de lege agraria},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. leg. agr.},
+}
+
+@book{Cic:Lig,
+ author = {Tullius Cicero, Marcus},
+ title = {pro Q. Ligario},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Lig.},
+}
+
+@book{Cic:Manil,
+ author = {Tullius Cicero, Marcus},
+ title = {pro lege Manilia (de imperio Cn. Pompei)},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Manil.},
+}
+
+@book{Cic:Marcell,
+ author = {Tullius Cicero, Marcus},
+ title = {pro M. Marcello},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Marcell.},
+}
+
+@book{Cic:Mil,
+ author = {Tullius Cicero, Marcus},
+ title = {pro T. Annio Milone},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Mil.},
+}
+
+@book{Cic:Mur,
+ author = {Tullius Cicero, Marcus},
+ title = {pro L. Murena},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Mur.},
+}
+
+@book{Cic:natdeor,
+ author = {Tullius Cicero, Marcus},
+ title = {de natura deorum},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. nat. deor.},
+}
+
+@book{Cic:off,
+ author = {Tullius Cicero, Marcus},
+ title = {de officiis},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. off.},
+}
+
+@book{Cic:optgen,
+ author = {Tullius Cicero, Marcus},
+ title = {de optimo genere oratorum},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. opt. gen.},
+}
+
+@book{Cic:orat,
+ author = {Tullius Cicero, Marcus},
+ title = {orator},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. orat.},
+}
+
+@book{Cic:parad,
+ author = {Tullius Cicero, Marcus},
+ title = {paradoxa},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. parad.},
+}
+
+@book{Cic:part,
+ author = {Tullius Cicero, Marcus},
+ title = {partitiones oratoriae},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. part.},
+}
+
+@book{Cic:Phil,
+ author = {Tullius Cicero, Marcus},
+ title = {in M. Antonium orationes Philippicae},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Phil.},
+}
+
+@book{Cic:Pis,
+ author = {Tullius Cicero, Marcus},
+ title = {in L. Pisonem},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Pis.},
+}
+
+@book{Cic:Planc,
+ author = {Tullius Cicero, Marcus},
+ title = {pro Cn. Plancio},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Planc.},
+}
+
+@book{Cic:predadQuir,
+ author = {Tullius Cicero, Marcus},
+ title = {oratio post reditum ad Quirites},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. p.red. ad Quir.},
+}
+
+@book{Cic:predinsen,
+ author = {Tullius Cicero, Marcus},
+ title = {oratio post reditum in senatu},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. p.red. in sen.},
+}
+
+@book{Cic:QRosc,
+ author = {Tullius Cicero, Marcus},
+ title = {pro Q. Roscio comoedo},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Q. Rosc.},
+}
+
+@book{Cic:Quinct,
+ author = {Tullius Cicero, Marcus},
+ title = {pro P. Quinctio},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Quinct.},
+}
+
+@book{Cic:Rabperd,
+ author = {Tullius Cicero, Marcus},
+ title = {pro C. Rabirioperduellionis reo},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Rab. perd.},
+}
+
+@book{Cic:Rabpost,
+ author = {Tullius Cicero, Marcus},
+ title = {pro C. Rabirio Postumo},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Rab post.},
+}
+
+@book{Cic:rep,
+ author = {Tullius Cicero, Marcus},
+ title = {de re publica},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. rep.},
+}
+
+@book{Cic:Scaur,
+ author = {Tullius Cicero, Marcus},
+ title = {pro M. Aemilio Scauro},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Scaur.},
+}
+
+@book{Cic:Sest,
+ author = {Tullius Cicero, Marcus},
+ title = {pro P. Sestio},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Sest.},
+}
+
+@book{Cic:SRosc,
+ author = {Tullius Cicero, Marcus},
+ title = {pro Sex. Roscio Amerino},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. S. Rosc.},
+}
+
+@book{Cic:Sull,
+ author = {Tullius Cicero, Marcus},
+ title = {pro P. Sulla},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Sull.},
+}
+
+@book{Cic:Tim,
+ author = {Tullius Cicero, Marcus},
+ title = {Timaeus},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Tim.},
+}
+
+@book{Cic:top,
+ author = {Tullius Cicero, Marcus},
+ title = {topica},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. top.},
+}
+
+@book{Cic:Tull,
+ author = {Tullius Cicero, Marcus},
+ title = {pro M.Tullio},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Tull.},
+}
+
+@book{Cic:Tusc,
+ author = {Tullius Cicero, Marcus},
+ title = {Tusculanae disputationes},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Tusc.},
+}
+
+@book{Cic:Vatin,
+ author = {Tullius Cicero, Marcus},
+ title = {in P. Vatinium testem interrogatio},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Vatin.},
+}
+
+@book{Cic:Verr12,
+ author = {Tullius Cicero, Marcus},
+ title = {in Verrem actio prima, secunda},
+ keywords = {ancient},
+ shortauthor = {Cicero},
+ shorthand = {Cic. Verr. 1,2},
+}
+
+@book{Claud:carm,
+ title = {carmina},
+ keywords = {ancient},
+ shortauthor = {Claudianus, Claudius},
+ shorthand = {Claud. carm.},
+}
+
+@book{Claud:raptPros,
+ title = {de raptu Proserpinae},
+ keywords = {ancient},
+ shortauthor = {Claudianus, Claudius},
+ shorthand = {Claud. rapt. Pros.},
+}
+
+@book{CodIust,
+ title = {Corpus Iuris Civilis, Codex Iustinianus},
+ keywords = {ancient},
+ shorthand = {Cod. Iust.},
+}
+
+@book{Colum,
+ author = {Iunius Moderatus Columella, Lucius},
+ keywords = {ancient},
+ shortauthor = {Columella},
+ shorthand = {Colum.},
+}
+
+@book{Curt,
+ title = {historiae Alexandri Magni},
+ keywords = {ancient},
+ shortauthor = {Rufus, Curtius},
+ shorthand = {Curt.},
+}
+
+@book{Cypr,
+ keywords = {ancient},
+ shortauthor = {Cyprianus},
+ shorthand = {Cypr.},
+}
+
+@book{Demokr,
+ keywords = {ancient},
+ shortauthor = {Demokritos},
+ shorthand = {Demokr.},
+}
+
+@book{Demosth:or,
+ author = {Demosthenes},
+ title = {or.},
+ keywords = {ancient},
+ shortauthor = {Demosthenes},
+ shorthand = {Demosth. or.},
+}
+
+@book{Dig,
+ title = {Corpus Iuris Civilis, Digesta (Pandekten.},
+ keywords = {ancient},
+ shorthand = {Dig.},
+}
+
+@book{Diod,
+ author = {{Diodorus Siculus}},
+ keywords = {ancient},
+ shortauthor = {Siculus, Diodorus},
+ shorthand = {Diod.},
+}
+
+@book{Diog:Laert,
+ keywords = {ancient},
+ shortauthor = {Laertios, Diogenes},
+ shorthand = {Diog. Laert.},
+}
+
+@book{Dion:Chrys,
+ author = {{Dion Chrysostomos}},
+ title = {Orationes},
+ keywords = {ancient},
+ shortauthor = {Chrysostomos, Dion},
+ shorthand = {Dion Chrys.},
+}
+
+@book{Dion:Halant,
+ title = {antiquitates Romanae},
+ keywords = {ancient},
+ shortauthor = {Halicarnassos, Dionysios},
+ shorthand = {Dion. Hal. ant.},
+}
+
+@book{Dion:Halcomp,
+ title = {de compositione verborum},
+ keywords = {ancient},
+ shortauthor = {Halicarnassos, Dionysios},
+ shorthand = {Dion. Hal. comp.},
+}
+
+@book{Dion:Halrhet,
+ title = {ars rhetorica .},
+ keywords = {ancient},
+ shortauthor = {Halicarnassos, Dionysios},
+ shorthand = {Dion. Hal. rhet.},
+}
+
+@book{Don,
+ keywords = {ancient},
+ shortauthor = {grammaticus, Donatus},
+ shorthand = {Don.},
+}
+
+@book{Drac,
+ keywords = {ancient},
+ shortauthor = {Dracontius},
+ shorthand = {Drac.},
+}
+
+@book{Dt,
+ keywords = {ancient},
+ shortauthor = {Mose), Deuteronomium (= 5.},
+ shorthand = {Dt},
+}
+
+@book{Emp,
+ keywords = {ancient},
+ shortauthor = {Empedokles},
+ shorthand = {Emp.},
+}
+
+@book{Enn:ann,
+ title = {Annales (Skutsch, 1985)},
+ keywords = {ancient},
+ shortauthor = {Ennius},
+ shorthand = {Enn. ann.},
+}
+
+@book{Enn:sat,
+ title = {Saturae, (Vahlen, 21928)},
+ keywords = {ancient},
+ shortauthor = {Ennius},
+ shorthand = {Enn. sat.},
+}
+
+@book{Enn:scaen,
+ title = {fragmenta scenica (Vahlen, 21928)},
+ keywords = {ancient},
+ shortauthor = {Ennius},
+ shorthand = {Enn. scaen.},
+}
+
+@book{Ennod,
+ keywords = {ancient},
+ shortauthor = {Ennodius},
+ shorthand = {Ennod.},
+}
+
+@book{Eph,
+ keywords = {ancient},
+ shortauthor = {Epheserbrief},
+ shorthand = {Eph},
+}
+
+@book{Epik,
+ keywords = {ancient},
+ shortauthor = {Epikuros},
+ shorthand = {Epik.},
+}
+
+@book{Epikt,
+ keywords = {ancient},
+ shortauthor = {Epiktetos},
+ shorthand = {Epikt.},
+}
+
+@book{Etym:m,
+ keywords = {ancient},
+ shortauthor = {magnum (Gaisford), Etymologicum},
+ shorthand = {Etym. m.},
+}
+
+@book{Eukl:elem,
+ title = {elem.},
+ keywords = {ancient},
+ shortauthor = {Euklid},
+ shorthand = {Eukl. elem.},
+}
+
+@book{Eur:Alc,
+ author = {Euripides},
+ title = {Alcestis},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Alc.},
+}
+
+@book{Eur:Andr,
+ author = {Euripides},
+ title = {Andromache},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Andr.},
+}
+
+@book{Eur:Bacch,
+ author = {Euripides},
+ title = {Bacchae},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Bacch.},
+}
+
+@book{Eur:Cycl,
+ author = {Euripides},
+ title = {Cyclops},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Cycl.},
+}
+
+@book{Eur:El,
+ author = {Euripides},
+ title = {Electra},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. El.},
+}
+
+@book{Eur:Hec,
+ author = {Euripides},
+ title = {Hecuba (Hekabe)},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Hec.},
+}
+
+@book{Eur:Hel,
+ author = {Euripides},
+ title = {Helena},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Hel.},
+}
+
+@book{Eur:Heracl,
+ author = {Euripides},
+ title = {Heraclidae},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Heracl.},
+}
+
+@book{Eur:Herc,
+ author = {Euripides},
+ title = {Hercules (furens)},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Herc.},
+}
+
+@book{Eur:Hipp,
+ author = {Euripides},
+ title = {Hippolytos},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Hipp.},
+}
+
+@book{Eur:Ion,
+ author = {Euripides},
+ title = {Ion},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Ion},
+}
+
+@book{Eur:IphA,
+ author = {Euripides},
+ title = {Iphigenia Aulidensis},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Iph. A.},
+}
+
+@book{Eur:IphT,
+ author = {Euripides},
+ title = {Iphigenia Taurica},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Iph. T.},
+}
+
+@book{Eur:Med,
+ author = {Euripides},
+ title = {Medea},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Med.},
+}
+
+@book{Eur:Or,
+ author = {Euripides},
+ title = {Orestes},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Or.},
+}
+
+@book{Eur:Phoen,
+ author = {Euripides},
+ title = {Phoenissae},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Phoen.},
+}
+
+@book{Eur:Rhes,
+ author = {Euripides},
+ title = {Rhesus},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Rhes.},
+}
+
+@book{Eur:Suppl,
+ author = {Euripides},
+ title = {Supplices (ἱκέτιδες)},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Suppl.},
+}
+
+@book{Eur:Tro,
+ author = {Euripides},
+ title = {Troades},
+ keywords = {ancient},
+ shortauthor = {Euripides},
+ shorthand = {Eur. Tro.},
+}
+
+@book{Eus:DeEv,
+ author = {Eusebios},
+ title = {Demonstratio Evangelica},
+ keywords = {ancient},
+ shortauthor = {Eusebios},
+ shorthand = {Eus. De. Ev.},
+}
+
+@book{Eus:HE,
+ author = {Eusebios},
+ title = {Historia Ecclesiastica},
+ keywords = {ancient},
+ shortauthor = {Eusebios},
+ shorthand = {Eus. HE},
+}
+
+@book{Eus:On,
+ author = {Eusebios},
+ title = {Onomastikon},
+ keywords = {ancient},
+ shortauthor = {Eusebios},
+ shorthand = {Eus. On.},
+}
+
+@book{Eus:PrEv,
+ author = {Eusebios},
+ title = {Praeparatio Evangelica},
+ keywords = {ancient},
+ shortauthor = {Eusebios},
+ shorthand = {Eus. Pr. Ev.},
+}
+
+@book{Eust,
+ keywords = {ancient},
+ shortauthor = {Eustathios},
+ shorthand = {Eust.},
+}
+
+@book{Eutr,
+ keywords = {ancient},
+ shortauthor = {Eutropius},
+ shorthand = {Eutr.},
+}
+
+@book{Fest,
+ author = {Pompeius Festus, {Sex}tus},
+ keywords = {ancient},
+ shortauthor = {Festus},
+ shorthand = {Fest.},
+}
+
+@book{Flor:epit,
+ author = {Annius Florus, Publius},
+ title = {epitoma de Tito Livio},
+ keywords = {ancient},
+ shortauthor = {Florus},
+ shorthand = {Flor. epit.},
+}
+
+@book{Frontin:aqustrat,
+ title = {de aquae ductu urbis Romae strategemata},
+ keywords = {ancient},
+ shortauthor = {Frontinus},
+ shorthand = {Frontin. aqu. strat.},
+}
+
+@book{Fulg,
+ keywords = {ancient},
+ shortauthor = {Afer, Fulgentius},
+ shorthand = {Fulg.},
+}
+
+@book{Gal,
+ keywords = {ancient},
+ shortauthor = {Galenos},
+ shorthand = {Gal.},
+}
+
+@book{Galbr,
+ keywords = {ancient},
+ shortauthor = {Galaterbrief},
+ shorthand = {Gal},
+}
+
+@book{Gell,
+ author = {Gellius, Aulus},
+ title = {noctes Atticae},
+ keywords = {ancient},
+ shortauthor = {Gellius},
+ shorthand = {Gell.},
+}
+
+@book{Gorg,
+ keywords = {ancient},
+ shortauthor = {Gorgias},
+ shorthand = {Gorg.},
+}
+
+@book{GregM:dial,
+ title = {dialogi (de miraculis patrum Italicorum)},
+ keywords = {ancient},
+ shortauthor = {Magnus, Gregorius},
+ shorthand = {Greg. M. dial.},
+}
+
+@book{GregM:epist,
+ title = {epistulae},
+ keywords = {ancient},
+ shortauthor = {Magnus, Gregorius},
+ shorthand = {Greg. M. epist.},
+}
+
+@book{GregM:past,
+ title = {regula pastoralis},
+ keywords = {ancient},
+ shortauthor = {Magnus, Gregorius},
+ shorthand = {Greg. M. past.},
+}
+
+@book{GregNaz:epist,
+ title = {epistulae},
+ keywords = {ancient},
+ shortauthor = {Nazianzienus, Gregorius},
+ shorthand = {Greg. Naz. epist.},
+}
+
+@book{GregNaz:or,
+ title = {orationes},
+ keywords = {ancient},
+ shortauthor = {Nazianzienus, Gregorius},
+ shorthand = {Greg. Naz. or.},
+}
+
+@book{GregNyss,
+ keywords = {ancient},
+ shortauthor = {Nyssenus, Gregorius},
+ shorthand = {Greg. Nyss.},
+}
+
+@book{GregTur:Franc,
+ title = {historia Francorum},
+ keywords = {ancient},
+ shortauthor = {von Tours, Gregorius},
+ shorthand = {Greg. Tur. Franc.},
+}
+
+@book{GregTur:Mart,
+ title = {de virtutibus Martini},
+ keywords = {ancient},
+ shortauthor = {von Tours, Gregorius},
+ shorthand = {Greg. Tur. Mart.},
+}
+
+@book{GregTur:vitpatr,
+ title = {de vita patrum},
+ keywords = {ancient},
+ shortauthor = {von Tours, Gregorius},
+ shorthand = {Greg. Tur. vit. patr.},
+}
+
+@book{Hdt,
+ author = {Herodotos},
+ keywords = {ancient},
+ shortauthor = {Herodot},
+ shorthand = {Hdt.},
+}
+
+@book{Hekat,
+ keywords = {ancient},
+ shortauthor = {Hekataios},
+ shorthand = {Hekat.},
+}
+
+@book{Herakl,
+ keywords = {ancient},
+ shortauthor = {Herakleitos},
+ shorthand = {Herakl.},
+}
+
+@book{Herakl:Pont,
+ keywords = {ancient},
+ shortauthor = {Pontikos, Herakleides},
+ shorthand = {Herakl. Pont.},
+}
+
+@book{Herm:Trism,
+ keywords = {ancient},
+ shortauthor = {Trismegistos, Hermes},
+ shorthand = {Herm. Trism.},
+}
+
+@book{Herodian,
+ title = {ab excessu divi Marci},
+ keywords = {ancient},
+ shortauthor = {Herodian},
+ shorthand = {Herodian.},
+}
+
+@book{Hes:cat,
+ title = {Catalogues feminarum (ἠοίαι)},
+ keywords = {ancient},
+ shortauthor = {Hesiodos},
+ shorthand = {Hes. cat.},
+}
+
+@book{Hes:erg,
+ title = {opera et dies (ἔργα καὶ ἡμέραι)},
+ keywords = {ancient},
+ shortauthor = {Hesiodos},
+ shorthand = {Hes. erg.},
+}
+
+@book{Hes:scut,
+ title = {scutum (ἀσπίς)},
+ keywords = {ancient},
+ shortauthor = {Hesiodos},
+ shorthand = {Hes. scut.},
+}
+
+@book{Hes:theog,
+ title = {Theogonia},
+ keywords = {ancient},
+ shortauthor = {Hesiodos},
+ shorthand = {Hes. theog.},
+}
+
+@book{Hesych,
+ keywords = {ancient},
+ shortauthor = {Hesychios},
+ shorthand = {Hesych.},
+}
+
+@book{Hier:chron,
+ title = {chronicon},
+ keywords = {ancient},
+ shortauthor = {Hieronymos},
+ shorthand = {Hier. chron.},
+}
+
+@book{Hier:comminEz,
+ title = {commentaria in Ezechielem (PL 25)},
+ keywords = {ancient},
+ shortauthor = {Hieronymos},
+ shorthand = {Hier. comm. in Ez},
+}
+
+@book{Hier:epist,
+ title = {epistulae},
+ keywords = {ancient},
+ shortauthor = {Hieronymos},
+ shorthand = {Hier. epist.},
+}
+
+@book{Hier:On,
+ title = {Onomastikon},
+ keywords = {ancient},
+ shortauthor = {Hieronymos},
+ shorthand = {Hier. On.},
+}
+
+@book{Hier:virill,
+ title = {de viris illustribus},
+ keywords = {ancient},
+ shortauthor = {Hieronymos},
+ shorthand = {Hier. vir. ill.},
+}
+
+@book{Hippokr,
+ keywords = {ancient},
+ shortauthor = {Hippokrates},
+ shorthand = {Hippokr.},
+}
+
+@book{HL,
+ keywords = {ancient},
+ shortauthor = {Hohelied},
+ shorthand = {HL},
+}
+
+@book{Hom:h,
+ author = {Homeros},
+ title = {Hymni Homeri},
+ keywords = {ancient},
+ shortauthor = {Homer},
+ shorthand = {Hom. h.},
+}
+
+@book{Hom:Il,
+ author = {Homeros},
+ title = {Ilias},
+ keywords = {ancient},
+ shortauthor = {Homer},
+ shorthand = {Hom. Il.},
+}
+
+@book{Hom:Od,
+ author = {Homeros},
+ title = {Odyssee},
+ keywords = {ancient},
+ shortauthor = {Homer},
+ shorthand = {Hom. Od.},
+}
+
+@book{Hor:ars,
+ author = {Horatius Flaccus, Quintus},
+ title = {ars poetica},
+ keywords = {ancient},
+ shortauthor = {Horaz},
+ shorthand = {Hor. ars},
+}
+
+@book{Hor:carm,
+ author = {Horatius Flaccus, Quintus},
+ title = {carmina},
+ keywords = {ancient},
+ shortauthor = {Horaz},
+ shorthand = {Hor. carm.},
+}
+
+@book{Hor:carmsaec,
+ author = {Horatius Flaccus, Quintus},
+ title = {carmen saeculare},
+ keywords = {ancient},
+ shortauthor = {Horaz},
+ shorthand = {Hor. carm. saec.},
+}
+
+@book{Hor:epist,
+ author = {Horatius Flaccus, Quintus},
+ title = {epistulae},
+ keywords = {ancient},
+ shortauthor = {Horaz},
+ shorthand = {Hor. epist.},
+}
+
+@book{Hor:epod,
+ author = {Horatius Flaccus, Quintus},
+ title = {epodi},
+ keywords = {ancient},
+ shortauthor = {Horaz},
+ shorthand = {Hor. epod.},
+}
+
+@book{Hor:sat,
+ author = {Horatius Flaccus, Quintus},
+ title = {saturae (sermones)},
+ keywords = {ancient},
+ shortauthor = {Horaz},
+ shorthand = {Hor. sat.},
+}
+
+@book{Hyg:astr,
+ title = {astronomica},
+ keywords = {ancient},
+ shortauthor = {Hygin},
+ shorthand = {Hyg. astr.},
+}
+
+@book{Hyg:fab,
+ title = {fabulae},
+ keywords = {ancient},
+ shortauthor = {Hygin},
+ shorthand = {Hyg. fab.},
+}
+
+@book{Iambl:demyst,
+ title = {de mysteriis},
+ keywords = {ancient},
+ shortauthor = {Iamblichos},
+ shorthand = {Iambl. de myst.},
+}
+
+@book{Iambl:protr,
+ title = {protrepticus in philosophiam},
+ keywords = {ancient},
+ shortauthor = {Iamblichos},
+ shorthand = {Iambl. protr.},
+}
+
+@book{Iambl:vP,
+ title = {de vita Pythagorica},
+ keywords = {ancient},
+ shortauthor = {Iamblichos},
+ shorthand = {Iambl. v. P.},
+}
+
+@book{InstIust,
+ title = {Corpus Iuris Civilis, Institutiones},
+ keywords = {ancient},
+ shorthand = {Inst. Iust.},
+}
+
+@book{Ios:AntIud,
+ author = {Josephus, Flavius},
+ title = {antiquitates Iudaicae},
+ keywords = {ancient},
+ shortauthor = {Iosephus), Iosephos (Flavius},
+ shorthand = {Ios. Ant. Iud.},
+}
+
+@book{Ios:BellIud,
+ author = {Josephus, Flavius},
+ title = {bellum Iudaicum},
+ keywords = {ancient},
+ shortauthor = {Iosephus), Iosephos (Flavius},
+ shorthand = {Ios. Bell. Iud.},
+}
+
+@book{Ios:cAp,
+ author = {Josephus, Flavius},
+ title = {contra Apionem},
+ keywords = {ancient},
+ shortauthor = {Iosephus), Iosephos (Flavius},
+ shorthand = {Ios. c. Ap.},
+}
+
+@book{Ios:vita,
+ author = {Josephus, Flavius},
+ title = {de sua vita},
+ keywords = {ancient},
+ shortauthor = {Iosephus), Iosephos (Flavius},
+ shorthand = {Ios. vita},
+}
+
+@book{Isid:nat,
+ title = {de natura rerum},
+ keywords = {ancient},
+ shortauthor = {von Sevilla, Isidorus},
+ shorthand = {Isid. nat.},
+}
+
+@book{Isid:orig,
+ title = {origines (etymologiae)},
+ keywords = {ancient},
+ shortauthor = {von Sevilla, Isidorus},
+ shorthand = {Isid. orig.},
+}
+
+@book{Isokr:or,
+ title = {orationes},
+ keywords = {ancient},
+ shortauthor = {Isokrates},
+ shorthand = {Isokr. or.},
+}
+
+@book{ItinAnton,
+ title = {Itinerarium Antonini},
+ keywords = {ancient},
+ shorthand = {Itin. Anton.},
+}
+
+@book{Iul:epist,
+ title = {epistulae},
+ keywords = {ancient},
+ shortauthor = {Iulianos},
+ shorthand = {Iul. epist.},
+}
+
+@book{Iul:inGal,
+ title = {in Galilaeos},
+ keywords = {ancient},
+ shortauthor = {Iulianos},
+ shorthand = {Iul. in Gal.},
+}
+
+@book{Iul:mis,
+ title = {Misopogon},
+ keywords = {ancient},
+ shortauthor = {Iulianos},
+ shorthand = {Iul. mis.},
+}
+
+@book{Iul:or,
+ title = {orationes},
+ keywords = {ancient},
+ shortauthor = {Iulianos},
+ shorthand = {Iul. or.},
+}
+
+@book{Iul:symp,
+ title = {symposion},
+ keywords = {ancient},
+ shortauthor = {Iulianos},
+ shorthand = {Iul. symp.},
+}
+
+@book{IulVict:Rhet,
+ title = {ars rhetorica},
+ keywords = {ancient},
+ shortauthor = {Victor, C. Iulius},
+ shorthand = {Iul. Vict. Rhet.},
+}
+
+@book{Iust,
+ title = {epitoma historiarum Philippicarum},
+ keywords = {ancient},
+ shortauthor = {Iustinus},
+ shorthand = {Iust.},
+}
+
+@book{Iuv:sat,
+ author = {Iunius Iuvenalis, Decimus},
+ title = {saturae},
+ keywords = {ancient},
+ shortauthor = {Iuvenal},
+ shorthand = {Iuv.},
+}
+
+@book{Iuvenc,
+ title = {evangelia},
+ keywords = {ancient},
+ shortauthor = {Iuvencus},
+ shorthand = {Iuvenc.},
+}
+
+@book{Jo,
+ keywords = {ancient},
+ shortauthor = {Johannes},
+ shorthand = {Jo},
+}
+
+@book{Kall:epigr,
+ title = {Epigrammata},
+ keywords = {ancient},
+ shortauthor = {Kallimachos},
+ shorthand = {Kall. epigr.},
+}
+
+@book{Kall:frg,
+ title = {fragmentum},
+ keywords = {ancient},
+ shortauthor = {Kallimachos},
+ shorthand = {Kall. frg.},
+}
+
+@book{Kall:h,
+ title = {hymni},
+ keywords = {ancient},
+ shortauthor = {Kallimachos},
+ shorthand = {Kall. h.},
+}
+
+@book{Lact:inst,
+ title = {divinae institutiones},
+ keywords = {ancient},
+ shortauthor = {Lactantius},
+ shorthand = {Lact. inst.},
+}
+
+@book{Lact:ira,
+ title = {de ira dei},
+ keywords = {ancient},
+ shortauthor = {Lactantius},
+ shorthand = {Lact. ira},
+}
+
+@book{Lact:mortpers,
+ title = {de mortibus persecutorum},
+ keywords = {ancient},
+ shortauthor = {Lactantius},
+ shorthand = {Lact. mort. pers.},
+}
+
+@book{Lact:opif,
+ title = {de opificio dei},
+ keywords = {ancient},
+ shortauthor = {Lactantius},
+ shorthand = {Lact. opif.},
+}
+
+@book{Liv,
+ author = {Livius, Titus},
+ title = {ab urbe condita},
+ keywords = {ancient},
+ shortauthor = {Livius},
+ shorthand = {Liv.},
+}
+
+@book{Lk,
+ keywords = {ancient},
+ shortauthor = {Lukas},
+ shorthand = {Lk},
+}
+
+@book{Lucan,
+ title = {bellum civile},
+ keywords = {ancient},
+ shortauthor = {Lucanus},
+ shorthand = {Lucan.},
+}
+
+@book{Lucil,
+ title = {saturae},
+ keywords = {ancient},
+ shortauthor = {Lucilius},
+ shorthand = {Lucil.},
+}
+
+@book{Lucr,
+ author = {Lucretius Carus, Titus},
+ title = {de rerum natura},
+ keywords = {ancient},
+ shortauthor = {Lukrez},
+ shorthand = {Lucr.},
+}
+
+@book{Lukian,
+ keywords = {ancient},
+ shortauthor = {Lukianos},
+ shorthand = {Lukian.},
+}
+
+@book{LXX,
+ keywords = {ancient},
+ shortauthor = {Septuaginta},
+ shorthand = {LXX},
+}
+
+@book{Lyd:mag,
+ title = {de magistratibus},
+ keywords = {ancient},
+ shortauthor = {Lydos},
+ shorthand = {Lyd. mag.},
+}
+
+@book{Lyd:mens,
+ title = {de mensibus},
+ keywords = {ancient},
+ shortauthor = {Lydos},
+ shorthand = {Lyd. mens.},
+}
+
+@book{Lykurg,
+ keywords = {ancient},
+ shortauthor = {Lykurgos},
+ shorthand = {Lykurg.},
+}
+
+@book{Lys,
+ keywords = {ancient},
+ shortauthor = {Lysias},
+ shorthand = {Lys.},
+}
+
+@book{Macr:Sat,
+ title = {Saturnalia},
+ keywords = {ancient},
+ shortauthor = {Macrobius},
+ shorthand = {Macr. Sat.},
+}
+
+@book{Manil,
+ title = {astronomica},
+ keywords = {ancient},
+ shortauthor = {Manilius},
+ shorthand = {Manil.},
+}
+
+@book{Mart,
+ author = {Valerius Martialis, Marcus},
+ title = {Epigrammata},
+ keywords = {ancient},
+ shortauthor = {Martial},
+ shorthand = {Mart.},
+}
+
+@book{Mart:spect,
+ author = {Valerius Martialis, Marcus},
+ title = {spectacula},
+ keywords = {ancient},
+ shortauthor = {Martial},
+ shorthand = {Mart. spect.},
+}
+
+@book{MartCap,
+ keywords = {ancient},
+ shortauthor = {Capella, Martianus},
+ shorthand = {Mart. Cap.},
+}
+
+@book{MarVictorin,
+ keywords = {ancient},
+ shortauthor = {Victorinus, Marius},
+ shorthand = {Mar. Victorin.},
+}
+
+@book{Maur,
+ keywords = {ancient},
+ shortauthor = {Augustus, Marcus Aurelius Antonius},
+ shorthand = {M. Aur.},
+}
+
+@book{Mel,
+ keywords = {ancient},
+ shortauthor = {Mela, Pomponius},
+ shorthand = {Mel.},
+}
+
+@book{Men:Dysk,
+ title = {Dyskolo.},
+ keywords = {ancient},
+ shortauthor = {Menandros},
+ shorthand = {Men. Dysk.},
+}
+
+@book{Men:Epitr,
+ title = {Epitrepontes},
+ keywords = {ancient},
+ shortauthor = {Menandros},
+ shorthand = {Men. Epitr.},
+}
+
+@book{Men:Sam,
+ title = {Samia},
+ keywords = {ancient},
+ shortauthor = {Menandros},
+ shorthand = {Men. Sam.},
+}
+
+@book{Mimn,
+ keywords = {ancient},
+ shortauthor = {Mimnermos},
+ shorthand = {Mimn.},
+}
+
+@book{MinFel,
+ keywords = {ancient},
+ shortauthor = {Felix, Oct. Minucius},
+ shorthand = {Min. Fel.},
+}
+
+@book{Mk,
+ keywords = {ancient},
+ shortauthor = {Markus},
+ shorthand = {Mk},
+}
+
+@book{Mosch,
+ keywords = {ancient},
+ shortauthor = {Moschos},
+ shorthand = {Mosch.},
+}
+
+@book{Mt,
+ keywords = {ancient},
+ shortauthor = {Matthäus},
+ shorthand = {Mt},
+}
+
+@book{Naev,
+ keywords = {ancient},
+ shortauthor = {Naevius},
+ shorthand = {Naev.},
+}
+
+@book{Nep:Att,
+ title = {Atticus},
+ keywords = {ancient},
+ shortauthor = {Nepos, Cornelius},
+ shorthand = {Nep. Att.},
+}
+
+@book{Nep:Hann,
+ title = {Hannibal},
+ keywords = {ancient},
+ shortauthor = {Nepos, Cornelius},
+ shorthand = {Nep. Hann.},
+}
+
+@book{Nik:Alex,
+ title = {Alexipharmaka},
+ keywords = {ancient},
+ shortauthor = {Nikander},
+ shorthand = {Nik. Alex.},
+}
+
+@book{Nik:Ther,
+ title = {Theriaka},
+ keywords = {ancient},
+ shortauthor = {Nikander},
+ shorthand = {Nik. Ther.},
+}
+
+@book{Nm,
+ keywords = {ancient},
+ shortauthor = {Mose), Numeri (= 4.},
+ shorthand = {Nm},
+}
+
+@book{Non,
+ keywords = {ancient},
+ shortauthor = {Nonius},
+ shorthand = {Non.},
+}
+
+@book{Nonn:Dion,
+ title = {Dion.},
+ keywords = {ancient},
+ shortauthor = {{Nonnos von Panopolis}},
+ shorthand = {Nonn. Dion.},
+}
+
+@book{Nov,
+ title = {Corpus Iuris Civilis, Leges Novellae},
+ keywords = {ancient},
+ shorthand = {Nov.},
+}
+
+@book{Orig,
+ keywords = {ancient},
+ shortauthor = {Origines},
+ shorthand = {Orig.},
+}
+
+@book{Oros,
+ author = {Ovidius Naso, Publius},
+ keywords = {ancient},
+ shortauthor = {Orosius},
+ shorthand = {Oros..},
+}
+
+@book{Ov:am,
+ author = {Ovidius Naso, Publius},
+ title = {amores},
+ keywords = {ancient},
+ shortauthor = {Ovid},
+ shorthand = {Ov. am.},
+}
+
+@book{Ov:ars,
+ author = {Ovidius Naso, Publius},
+ title = {ars amatoria},
+ keywords = {ancient},
+ shortauthor = {Ovid},
+ shorthand = {Ov. ars},
+}
+
+@book{Ov:epist,
+ author = {Ovidius Naso, Publius},
+ title = {epistulae (heroides)},
+ keywords = {ancient},
+ shortauthor = {Ovid},
+ shorthand = {Ov. epist.},
+}
+
+@book{Ov:fast,
+ author = {Ovidius Naso, Publius},
+ title = {fasti},
+ keywords = {ancient},
+ shortauthor = {Ovid},
+ shorthand = {Ov. fast.},
+}
+
+@book{Ov:Ib,
+ author = {Ovidius Naso, Publius},
+ title = {Ibis},
+ keywords = {ancient},
+ shortauthor = {Ovid},
+ shorthand = {Ov. Ib.},
+}
+
+@book{Ov:medic,
+ author = {Ovidius Naso, Publius},
+ title = {medicamina faciei femineae},
+ keywords = {ancient},
+ shortauthor = {Ovid},
+ shorthand = {Ov. medic.},
+}
+
+@book{Ov:met,
+ author = {Ovidius Naso, Publius},
+ title = {metamorphoses},
+ keywords = {ancient},
+ shortauthor = {Ovid},
+ shorthand = {Ov. met.},
+}
+
+@book{Ov:Pont,
+ author = {Ovidius Naso, Publius},
+ title = {epistulae ex Ponto},
+ keywords = {ancient},
+ shortauthor = {Ovid},
+ shorthand = {Ov. Pont.},
+}
+
+@book{Ov:rem,
+ author = {Ovidius Naso, Publius},
+ title = {remedia amoris},
+ keywords = {ancient},
+ shortauthor = {Ovid},
+ shorthand = {Ov. rem.},
+}
+
+@book{Ov:trist,
+ author = {Ovidius Naso, Publius},
+ title = {tristia},
+ keywords = {ancient},
+ shortauthor = {Ovid},
+ shorthand = {Ov. trist.},
+}
+
+@book{Papin,
+ keywords = {ancient},
+ shortauthor = {Papinianus, Aemilius},
+ shorthand = {Papin.},
+}
+
+@book{Passmart,
+ title = {Passiones martyrum},
+ keywords = {ancient},
+ shorthand = {Pass. mart.},
+}
+
+@book{Paus,
+ author = {Pausanias},
+ keywords = {ancient},
+ shortauthor = {Pausanias},
+ shorthand = {Paus.},
+}
+
+@book{Pers,
+ title = {saturae},
+ keywords = {ancient},
+ shortauthor = {Persius},
+ shorthand = {Pers.},
+}
+
+@book{Petron,
+ title = {satyrica},
+ keywords = {ancient},
+ shortauthor = {Petronius},
+ shorthand = {Petron.},
+}
+
+@book{Phaedr,
+ title = {fabulae},
+ keywords = {ancient},
+ shortauthor = {Phaedrus},
+ shorthand = {Phaedr.},
+}
+
+@book{Pind:frg,
+ author = {Pindar},
+ title = {fragmentum},
+ keywords = {ancient},
+ shortauthor = {Pindar},
+ shorthand = {Pind. frg.},
+}
+
+@book{Pind:I,
+ author = {Pindar},
+ title = {Isthmien},
+ keywords = {ancient},
+ shortauthor = {Pindar},
+ shorthand = {Pind. I.},
+}
+
+@book{Pind:N,
+ author = {Pindar},
+ title = {Nemeen},
+ keywords = {ancient},
+ shortauthor = {Pindar},
+ shorthand = {Pind. N.},
+}
+
+@book{Pind:O,
+ author = {Pindar},
+ title = {Olympien},
+ keywords = {ancient},
+ shortauthor = {Pindar},
+ shorthand = {Pind. O.},
+}
+
+@book{Pind:P,
+ author = {Pindar},
+ title = {Pythien},
+ keywords = {ancient},
+ shortauthor = {Pindar},
+ shorthand = {Pind. P.},
+}
+
+@book{Plat:Alk1,
+ author = {Platon},
+ title = {Alkibiades 1},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Alk. 1},
+}
+
+@book{Plat:Alk2,
+ author = {Platon},
+ title = {Alkibiades 2},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Alk. 2},
+}
+
+@book{Plat:apol,
+ author = {Platon},
+ title = {apologia},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. apol.},
+}
+
+@book{Plat:Ax,
+ author = {Platon},
+ title = {Axiochos},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Ax.},
+}
+
+@book{Plat:Charm,
+ author = {Platon},
+ title = {Charmides},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Charm.},
+}
+
+@book{Plat:def,
+ author = {Platon},
+ title = {Definitiones (ὅροι)},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. def.},
+}
+
+@book{Plat:Dem,
+ author = {Platon},
+ title = {Demodokos},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Dem.},
+}
+
+@book{Plat:epin,
+ author = {Platon},
+ title = {epinomis},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. epin.},
+}
+
+@book{Plat:epist,
+ author = {Platon},
+ title = {epistulae},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. epist.},
+}
+
+@book{Plat:eras,
+ author = {Platon},
+ title = {erastae},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. eras.},
+}
+
+@book{Plat:Eryx,
+ author = {Platon},
+ title = {Eryxias},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Eryx.},
+}
+
+@book{Plat:Euthyd,
+ author = {Platon},
+ title = {Euthydemos},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Euthyd.},
+}
+
+@book{Plat:Euthyphr,
+ author = {Platon},
+ title = {Euthyphron},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Euthyphr.},
+}
+
+@book{Plat:Gorg,
+ author = {Platon},
+ title = {Gorgias},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Gorg.},
+}
+
+@book{Plat:Hipparch,
+ author = {Platon},
+ title = {Hipparchos},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Hipparch.},
+}
+
+@book{Plat:Hippmai,
+ author = {Platon},
+ title = {Hippias maior},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Hipp. mai.},
+}
+
+@book{Plat:Hippmin,
+ author = {Platon},
+ title = {Hippias minor},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Hipp. min.},
+}
+
+@book{Plat:Ion,
+ author = {Platon},
+ title = {Ion},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Ion},
+}
+
+@book{Plat:Kleit,
+ author = {Platon},
+ title = {Kleitophon},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Kleit.},
+}
+
+@book{Plat:Krat,
+ author = {Platon},
+ title = {Kratylos},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Krat.},
+}
+
+@book{Plat:Krit,
+ author = {Platon},
+ title = {Kriton},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Krit.},
+}
+
+@book{Plat:Kritias,
+ author = {Platon},
+ title = {Kritias},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Kritias},
+}
+
+@book{Plat:Lach,
+ author = {Platon},
+ title = {Laches},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Lach.},
+}
+
+@book{Plat:leg,
+ author = {Platon},
+ title = {leges (νόμοι)},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. leg.},
+}
+
+@book{Plat:Lys,
+ author = {Platon},
+ title = {Lysis},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Lys.},
+}
+
+@book{Plat:Men,
+ author = {Platon},
+ title = {Menon},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Men.},
+}
+
+@book{Plat:Min,
+ author = {Platon},
+ title = {Minos},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Min.},
+}
+
+@book{Plat:Mx,
+ author = {Platon},
+ title = {Menexenos},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Mx.},
+}
+
+@book{Plat:Parm,
+ author = {Platon},
+ title = {Parmenides},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Parm.},
+}
+
+@book{Plat:Phaid,
+ author = {Platon},
+ title = {Phaidon},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Phaid.},
+}
+
+@book{Plat:Phaidr,
+ author = {Platon},
+ title = {Phaidros},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Phaidr.},
+}
+
+@book{Plat:Phil,
+ author = {Platon},
+ title = {Philebos},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Phil.},
+}
+
+@book{Plat:polit,
+ author = {Platon},
+ title = {politicus},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. polit.},
+}
+
+@book{Plat:Prot,
+ author = {Platon},
+ title = {Protagoras},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Prot.},
+}
+
+@book{Plat:rep,
+ author = {Platon},
+ title = {de re publica (πολιτεία)},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. rep.},
+}
+
+@book{Plat:Sis,
+ author = {Platon},
+ title = {Sisyphos},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Sis.},
+}
+
+@book{Plat:soph,
+ author = {Platon},
+ title = {sophista},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. soph.},
+}
+
+@book{Plat:symp,
+ author = {Platon},
+ title = {symposium},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. symp.},
+}
+
+@book{Plat:Thg,
+ author = {Platon},
+ title = {Theages},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Thg.},
+}
+
+@book{Plat:Tht,
+ author = {Platon},
+ title = {Theaitetos},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Tht.},
+}
+
+@book{Plat:Tim,
+ author = {Platon},
+ title = {Timaios},
+ keywords = {ancient},
+ shortauthor = {Platon},
+ shorthand = {Plat. Tim.},
+}
+
+@book{Plaut:Amph,
+ author = {Maccius Plautus, Titus},
+ title = {Amphitruo},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Amph.},
+}
+
+@book{Plaut:Asin,
+ author = {Maccius Plautus, Titus},
+ title = {Asinaria},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Asin.},
+}
+
+@book{Plaut:Aul,
+ author = {Maccius Plautus, Titus},
+ title = {Aulularia},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Aul.},
+}
+
+@book{Plaut:Bacch,
+ author = {Maccius Plautus, Titus},
+ title = {Bacchides},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Bacch.},
+}
+
+@book{Plaut:Cist,
+ author = {Maccius Plautus, Titus},
+ title = {Cistellaria},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Cist.},
+}
+
+@book{Plaut:Curc,
+ author = {Maccius Plautus, Titus},
+ title = {Curculio},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Curc.},
+}
+
+@book{Plaut:Epid,
+ author = {Maccius Plautus, Titus},
+ title = {Epidicus},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Epid.},
+}
+
+@book{Plaut:Men,
+ author = {Maccius Plautus, Titus},
+ title = {Menaechmi},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Men.},
+}
+
+@book{Plaut:Merc,
+ author = {Maccius Plautus, Titus},
+ title = {Mercator},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Merc.},
+}
+
+@book{Plaut:Mil,
+ author = {Maccius Plautus, Titus},
+ title = {Miles gloriosus},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Mil.},
+}
+
+@book{Plaut:Most,
+ author = {Maccius Plautus, Titus},
+ title = {Mostellaria},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Most.},
+}
+
+@book{Plaut:Poen,
+ author = {Maccius Plautus, Titus},
+ title = {Poenulus},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Poen.},
+}
+
+@book{Plaut:Pseud,
+ author = {Maccius Plautus, Titus},
+ title = {Pseudolus},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Pseud.},
+}
+
+@book{Plaut:Rud,
+ author = {Maccius Plautus, Titus},
+ title = {Rudens},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Rud.},
+}
+
+@book{Plaut:Stich,
+ author = {Maccius Plautus, Titus},
+ title = {Stichus},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Stich.},
+}
+
+@book{Plaut:Trin,
+ author = {Maccius Plautus, Titus},
+ title = {Trinummus},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Trin.},
+}
+
+@book{Plaut:Truc,
+ author = {Maccius Plautus, Titus},
+ title = {Truculentus},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Truc.},
+}
+
+@book{Plaut:Vid,
+ author = {Maccius Plautus, Titus},
+ title = {Vidularia},
+ keywords = {ancient},
+ shortauthor = {Plautus},
+ shorthand = {Plaut. Vid.},
+}
+
+@book{Plin:epist,
+ author = {Plinius Caecilius Secundus, Caius},
+ title = {Epistulae},
+ keywords = {ancient},
+ shortauthor = {minor, Plinius},
+ shorthand = {Plin. epist.},
+}
+
+@book{Plin:nat,
+ author = {Plinius Secundus, Caius},
+ title = {naturalis historia},
+ keywords = {ancient},
+ shortauthor = {maior, Plinius},
+ shorthand = {Plin. nat.},
+}
+
+@book{Plin:paneg,
+ author = {Plinius Caecilius Secundus, Caius},
+ title = {panegyricus},
+ keywords = {ancient},
+ shortauthor = {minor, Plinius},
+ shorthand = {Plin. paneg.},
+}
+
+@book{Plot,
+ keywords = {ancient},
+ shortauthor = {Plotinos},
+ shorthand = {Plot.},
+}
+
+@book{Plut,
+ author = {Plutarchos},
+ title = {vitae parallelae},
+ keywords = {ancient},
+ shortauthor = {Plutarch},
+ shorthand = {Plut.},
+}
+
+@book{Plut:am,
+ author = {Plutarchos},
+ title = {Amatorius (erotikos)},
+ keywords = {ancient},
+ shortauthor = {Plutarch},
+ shorthand = {Plut. am.},
+}
+
+@book{Plut:dePythOr,
+ author = {Plutarchos},
+ title = {de Pythiae oraculis},
+ keywords = {ancient},
+ shortauthor = {Plutarch},
+ shorthand = {Plut. de Pyth.Or.},
+}
+
+@book{Plut:Is,
+ author = {Plutarchos},
+ title = {de Iside et Osiride},
+ keywords = {ancient},
+ shortauthor = {Plutarch},
+ shorthand = {Plut. Is.},
+}
+
+@book{Plut:mor,
+ author = {Plutarchos},
+ title = {moralia},
+ keywords = {ancient},
+ shortauthor = {Plutarch},
+ shorthand = {Plut. mor.},
+}
+
+@book{Plut:quGr,
+ author = {Plutarchos},
+ title = {quaestiones Graecae},
+ keywords = {ancient},
+ shortauthor = {Plutarch},
+ shorthand = {Plut. qu. Gr.},
+}
+
+@book{Plut:quR,
+ author = {Plutarchos},
+ title = {quaestiones Romanae},
+ keywords = {ancient},
+ shortauthor = {Plutarch},
+ shorthand = {Plut. qu. R.},
+}
+
+@book{Plut:symp,
+ author = {Plutarchos},
+ title = {quaestiones convivales},
+ keywords = {ancient},
+ shortauthor = {Plutarch},
+ shorthand = {Plut. symp.},
+}
+
+@book{Pol,
+ keywords = {ancient},
+ shortauthor = {Polybios},
+ shorthand = {Pol.},
+}
+
+@book{Poll,
+ keywords = {ancient},
+ shortauthor = {Pollux},
+ shorthand = {Poll.},
+}
+
+@book{Porph,
+ keywords = {ancient},
+ shortauthor = {Porphyrios},
+ shorthand = {Porph.},
+}
+
+@book{Poseid,
+ keywords = {ancient},
+ shortauthor = {Poseidonios},
+ shorthand = {Poseid.},
+}
+
+@book{Priap,
+ keywords = {ancient},
+ shortauthor = {Priapea},
+ shorthand = {Priap.},
+}
+
+@book{Prisc,
+ keywords = {ancient},
+ shortauthor = {Priscianus},
+ shorthand = {Prisc.},
+}
+
+@book{Prok:aed,
+ author = {Prokopius},
+ title = {de aedificiis (περὶ κτισμάτων)},
+ keywords = {ancient},
+ shortauthor = {Prokop},
+ shorthand = {Prok. aed.},
+}
+
+@book{Prok:BG,
+ author = {Prokopius},
+ title = {bellum Gothicum},
+ keywords = {ancient},
+ shortauthor = {Prokop},
+ shorthand = {Prok. BG},
+}
+
+@book{Prok:BP,
+ author = {Prokopius},
+ title = {bellum Persicum},
+ keywords = {ancient},
+ shortauthor = {Prokop},
+ shorthand = {Prok. BP},
+}
+
+@book{Prok:BV,
+ author = {Prokopius},
+ title = {bellum Vandalicum},
+ keywords = {ancient},
+ shortauthor = {Prokop},
+ shorthand = {Prok. BV},
+}
+
+@book{Prok:HA,
+ author = {Prokopius},
+ title = {historia arcana},
+ keywords = {ancient},
+ shortauthor = {Prokop},
+ shorthand = {Prok. HA},
+}
+
+@book{Prokl,
+ keywords = {ancient},
+ shortauthor = {Proklos},
+ shorthand = {Prokl.},
+}
+
+@book{Prop,
+ author = {Aurelius Propertius, {\relax Sex}tus},
+ title = {elegiae},
+ keywords = {ancient},
+ shortauthor = {Properz},
+ shorthand = {Prop.},
+}
+
+@book{Prud,
+ keywords = {ancient},
+ shortauthor = {Prudentius},
+ shorthand = {Prud.},
+}
+
+@book{Quint:decl,
+ author = {Fabius Quintilianus, Marcus},
+ title = {declamationes minores},
+ keywords = {ancient},
+ shortauthor = {Quintilian},
+ shorthand = {Quint. decl.},
+}
+
+@book{Quint:inst,
+ author = {Fabius Quintilianus, Marcus},
+ title = {institutio oratoria},
+ keywords = {ancient},
+ shortauthor = {Quintilian},
+ shorthand = {Quint. inst.},
+}
+
+@book{RgestdivAug,
+ title = {Res gestae divi Augusti},
+ keywords = {ancient},
+ shorthand = {R. Gest. div. Aug.},
+}
+
+@book{Rhet:Her,
+ keywords = {ancient},
+ shortauthor = {ad Herennium, Rhetorica},
+ shorthand = {Rhet. Her.},
+}
+
+@book{Roem,
+ keywords = {ancient},
+ shortauthor = {Römerbrief},
+ shorthand = {Röm},
+}
+
+@book{RutNam,
+ title = {de reditu suo},
+ keywords = {ancient},
+ shortauthor = {Namatianus, Rutilius Claudius},
+ shorthand = {Rut. Nam.},
+}
+
+@book{Sall:Catil,
+ author = {Sallustius Crispus, Caius},
+ title = {de coniuratione Catilinae},
+ keywords = {ancient},
+ shortauthor = {Sallust},
+ shorthand = {Sall. Catil.},
+}
+
+@book{Sall:epist,
+ author = {Sallustius Crispus, Caius},
+ title = {epistulae ad Caesarem},
+ keywords = {ancient},
+ shortauthor = {Sallust},
+ shorthand = {Sall. epist.},
+}
+
+@book{Sall:hist,
+ author = {Sallustius Crispus, Caius},
+ title = {historiae},
+ keywords = {ancient},
+ shortauthor = {Sallust},
+ shorthand = {Sall. hist.},
+}
+
+@book{Sall:Iug,
+ author = {Sallustius Crispus, Caius},
+ title = {de bello Iugurthino},
+ keywords = {ancient},
+ shortauthor = {Sallust},
+ shorthand = {Sall. Iug.},
+}
+
+@book{Semp,
+ keywords = {ancient},
+ shortauthor = {Empiricus, Sextus},
+ shorthand = {S. Emp.},
+}
+
+@book{Sen:apocol,
+ author = {Annaeus Seneca, Lucius},
+ title = {divi Claudii apocolocynthosis},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Sen. apocol.},
+}
+
+@book{Sen:benef,
+ author = {Annaeus Seneca, Lucius},
+ title = {de beneficiis},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Sen. benef.},
+}
+
+@book{Sen:clem,
+ author = {Annaeus Seneca, Lucius},
+ title = {de clementia},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Sen. clem.},
+}
+
+@book{Sen:contr,
+ author = {Annaeus Seneca, Lucius},
+ title = {controversiae},
+ keywords = {ancient},
+ shortauthor = {maior, Seneca},
+ shorthand = {Sen. contr.},
+}
+
+@book{Sen:dial,
+ author = {Annaeus Seneca, Lucius},
+ title = {dialogi},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Sen. dial.},
+}
+
+@book{Sen:epist,
+ author = {Annaeus Seneca, Lucius},
+ title = {epistulae morales ad Lucilium},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Sen. epist.},
+}
+
+@book{Sen:Hercf,
+ author = {Annaeus Seneca, Lucius},
+ title = {Hercules furens},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Sen. Herc. f.},
+}
+
+@book{Sen:HercO,
+ author = {Annaeus Seneca, Lucius},
+ title = {Hercules Oetaeus},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Herc. O.},
+}
+
+@book{Sen:Med,
+ author = {Annaeus Seneca, Lucius},
+ title = {Medea},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Sen. Med.},
+}
+
+@book{Sen:nat,
+ author = {Annaeus Seneca, Lucius},
+ title = {naturales quaestiones},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Sen. nat.},
+}
+
+@book{Sen:Oed,
+ author = {Annaeus Seneca, Lucius},
+ title = {Oedipus},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Sen. Oed.},
+}
+
+@book{Sen:Phaedr,
+ author = {Annaeus Seneca, Lucius},
+ title = {Phaedra},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Sen. Phaedr.},
+}
+
+@book{Sen:Phoen,
+ author = {Annaeus Seneca, Lucius},
+ title = {Phoenissae},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Sen. Phoen.},
+}
+
+@book{Sen:suas,
+ author = {Annaeus Seneca, Lucius},
+ title = {suasoriae},
+ keywords = {ancient},
+ shortauthor = {maior, Seneca},
+ shorthand = {Sen. suas.},
+}
+
+@book{Sen:Thy,
+ author = {Annaeus Seneca, Lucius},
+ title = {Thyestes},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Sen. Thy.},
+}
+
+@book{Sen:Tro,
+ author = {Annaeus Seneca, Lucius},
+ title = {Troades},
+ keywords = {ancient},
+ shortauthor = {minor, Seneca},
+ shorthand = {Sen. Tro.},
+}
+
+@book{Serv:Aen,
+ title = {commentarius in Vergilii Aeneida},
+ keywords = {ancient},
+ shortauthor = {Servius},
+ shorthand = {Serv. Aen.},
+}
+
+@book{Serv:auct,
+ keywords = {ancient},
+ shortauthor = {auctus Danielis, Servius},
+ shorthand = {Serv. auct.},
+}
+
+@book{Serv:ecl,
+ title = {commentarius in Vergilii eclogas},
+ keywords = {ancient},
+ shortauthor = {Servius},
+ shorthand = {Serv. ecl.},
+}
+
+@book{Serv:georg,
+ title = {commentarius in Vergilii georgica},
+ keywords = {ancient},
+ shortauthor = {Servius},
+ shorthand = {Serv. georg.},
+}
+
+@book{Sil,
+ title = {Punica},
+ keywords = {ancient},
+ shortauthor = {Italicus, Silius},
+ shorthand = {Sil.},
+}
+
+@book{Sim,
+ keywords = {ancient},
+ shortauthor = {Simonides},
+ shorthand = {Sim.},
+}
+
+@book{Simpl,
+ keywords = {ancient},
+ shortauthor = {Simplikios},
+ shorthand = {Simpl.},
+}
+
+@book{Sol,
+ keywords = {ancient},
+ shortauthor = {Solon},
+ shorthand = {Sol.},
+}
+
+@book{Soph:Ai,
+ title = {Aias},
+ keywords = {ancient},
+ shortauthor = {Sophokles},
+ shorthand = {Soph. Ai.},
+}
+
+@book{Soph:Ant,
+ title = {Antigone},
+ keywords = {ancient},
+ shortauthor = {Sophokles},
+ shorthand = {Soph. Ant.},
+}
+
+@book{Soph:El,
+ title = {Electra},
+ keywords = {ancient},
+ shortauthor = {Sophokles},
+ shorthand = {Soph. El.},
+}
+
+@book{Soph:OidK,
+ title = {Oedipus Coloneus},
+ keywords = {ancient},
+ shortauthor = {Sophokles},
+ shorthand = {Soph. Oid. K.},
+}
+
+@book{Soph:OidT,
+ title = {Oedipus Rex (Oedipus Tyrannus)},
+ keywords = {ancient},
+ shortauthor = {Sophokles},
+ shorthand = {Soph. Oid. T.},
+}
+
+@book{Soph:Phil,
+ title = {Philoctetes},
+ keywords = {ancient},
+ shortauthor = {Sophokles},
+ shorthand = {Soph. Phil.},
+}
+
+@book{Stat:Ach,
+ title = {Achilleis},
+ keywords = {ancient},
+ shortauthor = {Statius},
+ shorthand = {Stat. Ach.},
+}
+
+@book{Stat:silv,
+ title = {silvae},
+ keywords = {ancient},
+ shortauthor = {Statius},
+ shorthand = {Stat. silv.},
+}
+
+@book{Stat:Theb,
+ title = {Thebais},
+ keywords = {ancient},
+ shortauthor = {Statius},
+ shorthand = {Stat. Theb.},
+}
+
+@book{Stesich,
+ keywords = {ancient},
+ shortauthor = {Stesichoros},
+ shorthand = {Stesich.},
+}
+
+@book{Stob,
+ keywords = {ancient},
+ shortauthor = {Stobaios},
+ shorthand = {Stob.},
+}
+
+@book{Strab,
+ keywords = {ancient},
+ shortauthor = {Strabon},
+ shorthand = {Strab.},
+}
+
+@book{Suet:Aug,
+ author = {Suetonius Tranquillus, Caius},
+ title = {divus Augustus},
+ keywords = {ancient},
+ shortauthor = {Sueton},
+ shorthand = {Suet. Aug.},
+}
+
+@book{Suet:Cal,
+ author = {Suetonius Tranquillus, Caius},
+ title = {Caligula},
+ keywords = {ancient},
+ shortauthor = {Sueton},
+ shorthand = {Suet. Cal.},
+}
+
+@book{Suet:Claud,
+ author = {Suetonius Tranquillus, Caius},
+ title = {divus Claudius},
+ keywords = {ancient},
+ shortauthor = {Sueton},
+ shorthand = {Suet. Claud.},
+}
+
+@book{Suet:Dom,
+ author = {Suetonius Tranquillus, Caius},
+ title = {Domitianus},
+ keywords = {ancient},
+ shortauthor = {Sueton},
+ shorthand = {Suet. Dom.},
+}
+
+@book{Suet:gramm,
+ author = {Suetonius Tranquillus, Caius},
+ title = {de grammaticis},
+ keywords = {ancient},
+ shortauthor = {Sueton},
+ shorthand = {Suet. gramm.},
+}
+
+@book{Suet:Iul,
+ author = {Suetonius Tranquillus, Caius},
+ title = {divus Iulius},
+ keywords = {ancient},
+ shortauthor = {Sueton},
+ shorthand = {Suet. Iul.},
+}
+
+@book{Suet:Tib,
+ author = {Suetonius Tranquillus, Caius},
+ title = {divus Tiberius},
+ keywords = {ancient},
+ shortauthor = {Sueton},
+ shorthand = {Suet. Tib.},
+}
+
+@book{Suet:Tit,
+ author = {Suetonius Tranquillus, Caius},
+ title = {divus Titus},
+ keywords = {ancient},
+ shortauthor = {Sueton},
+ shorthand = {Suet. Tit.},
+}
+
+@book{Suet:Vesp,
+ author = {Suetonius Tranquillus, Caius},
+ title = {divus Vespasianus},
+ keywords = {ancient},
+ shortauthor = {Sueton},
+ shorthand = {Suet. Vesp.},
+}
+
+@book{Suet:Vit,
+ author = {Suetonius Tranquillus, Caius},
+ title = {Vitellius},
+ keywords = {ancient},
+ shortauthor = {Sueton},
+ shorthand = {Suet. Vit.},
+}
+
+@book{Symm:epist,
+ title = {epistulae},
+ keywords = {ancient},
+ shortauthor = {Symmachus},
+ shorthand = {Symm. epist.},
+}
+
+@book{Symm:or,
+ title = {orationes},
+ keywords = {ancient},
+ shortauthor = {Symmachus},
+ shorthand = {Symm. or.},
+}
+
+@book{Symm:rel,
+ title = {relationes},
+ keywords = {ancient},
+ shortauthor = {Symmachus},
+ shorthand = {Symm. rel.},
+}
+
+@book{Synes:epist,
+ title = {epistulae},
+ keywords = {ancient},
+ shortauthor = {epist.},
+ shorthand = {Synes. Epist.},
+}
+
+@book{Tac:Agr,
+ author = {Cornelius Tacitus, Publius},
+ title = {Agricola},
+ keywords = {ancient},
+ shortauthor = {Tacitus},
+ shorthand = {Tac. Agr.},
+}
+
+@book{Tac:ann,
+ author = {Cornelius Tacitus, Publius},
+ title = {annales},
+ keywords = {ancient},
+ shortauthor = {Tacitus},
+ shorthand = {Tac. ann.},
+}
+
+@book{Tac:dial,
+ author = {Cornelius Tacitus, Publius},
+ title = {dialogus de oratoribus},
+ keywords = {ancient},
+ shortauthor = {Tacitus},
+ shorthand = {Tac. dial.},
+}
+
+@book{Tac:Germ,
+ author = {Cornelius Tacitus, Publius},
+ title = {Germania},
+ keywords = {ancient},
+ shortauthor = {Tacitus},
+ shorthand = {Tac. Germ.},
+}
+
+@book{Tac:hist,
+ author = {Cornelius Tacitus, Publius},
+ title = {historiae},
+ keywords = {ancient},
+ shortauthor = {Tacitus},
+ shorthand = {Tac. hist.},
+}
+
+@book{Ter:Ad,
+ author = {Terentius Afer, Publius},
+ title = {Adelphoe},
+ keywords = {ancient},
+ shortauthor = {Terenz},
+ shorthand = {Ter. Ad.},
+}
+
+@book{Ter:Andr,
+ author = {Terentius Afer, Publius},
+ title = {Andria},
+ keywords = {ancient},
+ shortauthor = {Terenz},
+ shorthand = {Ter. Andr.},
+}
+
+@book{Ter:Eun,
+ author = {Terentius Afer, Publius},
+ title = {Eunuchus},
+ keywords = {ancient},
+ shortauthor = {Terenz},
+ shorthand = {Ter. Eun.},
+}
+
+@book{Ter:Haut,
+ author = {Terentius Afer, Publius},
+ title = {Heautontimorumenos},
+ keywords = {ancient},
+ shortauthor = {Terenz},
+ shorthand = {Ter. Haut.},
+}
+
+@book{Ter:Hec,
+ author = {Terentius Afer, Publius},
+ title = {Hecyra},
+ keywords = {ancient},
+ shortauthor = {Terenz},
+ shorthand = {Ter. Hec.},
+}
+
+@book{Ter:Maur,
+ keywords = {ancient},
+ shortauthor = {Maurus, Terentianus},
+ shorthand = {Ter. Maur.},
+}
+
+@book{Ter:Phorm,
+ author = {Terentius Afer, Publius},
+ title = {Phormio},
+ keywords = {ancient},
+ shortauthor = {Terenz},
+ shorthand = {Ter. Phorm.},
+}
+
+@book{Tert:apol,
+ author = {Septimius, Quintus Tertullianus},
+ title = {apologeticum},
+ keywords = {ancient},
+ shortauthor = {Tertullianus},
+ shorthand = {Tert. apol.},
+}
+
+@book{Tert:nat,
+ author = {Septimius, Quintus Tertullianus},
+ title = {ad nationes},
+ keywords = {ancient},
+ shortauthor = {Tertullianus},
+ shorthand = {Tert. nat.},
+}
+
+@book{Theokr,
+ keywords = {ancient},
+ shortauthor = {Theokritos},
+ shorthand = {Theokr.},
+}
+
+@book{Thgn,
+ keywords = {ancient},
+ shortauthor = {Theognis},
+ shorthand = {Thgn.},
+}
+
+@book{Thuk,
+ keywords = {ancient},
+ shortauthor = {Thukydides},
+ shorthand = {Thuk.},
+}
+
+@book{Tib,
+ title = {elegiae},
+ keywords = {ancient},
+ shortauthor = {Tibullus},
+ shorthand = {Tib.},
+}
+
+@book{Ulp:reg,
+ title = {(Ulpiani regulae)},
+ keywords = {ancient},
+ shortauthor = {Ulpianus},
+ shorthand = {Ulp. Reg.},
+}
+
+@book{ValFl,
+ title = {Argonautica},
+ keywords = {ancient},
+ shortauthor = {Flaccus, Valerius},
+ shorthand = {Val. Fl.},
+}
+
+@book{ValMax,
+ title = {facta et dicta memorabilia},
+ keywords = {ancient},
+ shortauthor = {Maximus, Valerius},
+ shorthand = {Val. Max.},
+}
+
+@book{Varro:ling,
+ author = {Terentius Varro, Marcus},
+ title = {de lingua Latina},
+ keywords = {ancient},
+ shortauthor = {Varro},
+ shorthand = {Varro ling.},
+}
+
+@book{Varro:Men,
+ author = {Terentius Varro, Marcus},
+ title = {saturae Menippeae},
+ keywords = {ancient},
+ shortauthor = {Varro},
+ shorthand = {Varro Men.},
+}
+
+@book{Varro:rust,
+ author = {Terentius Varro, Marcus},
+ title = {res rusticae},
+ keywords = {ancient},
+ shortauthor = {Varro},
+ shorthand = {Varro rust.},
+}
+
+@book{Vell,
+ author = {{Velleius Paterculus}},
+ title = {historiae Romanae},
+ keywords = {ancient},
+ shortauthor = {Paterculus, Velleius},
+ shorthand = {Vell.},
+}
+
+@book{Ven:Fort,
+ keywords = {ancient},
+ shortauthor = {Fortunatus, Venantius},
+ shorthand = {Ven. Fort.},
+}
+
+@book{Verg:Aen,
+ title = {Aeneis},
+ keywords = {ancient},
+ shortauthor = {Vergilius},
+ shorthand = {Verg. Aen.},
+}
+
+@book{Verg:catal,
+ title = {catalepton},
+ keywords = {ancient},
+ shortauthor = {Vergilius},
+ shorthand = {Verg. catal.},
+}
+
+@book{Verg:ecl,
+ title = {eclogae},
+ keywords = {ancient},
+ shortauthor = {Vergilius},
+ shorthand = {Verg. ecl.},
+}
+
+@book{Verg:georg,
+ title = {georgica},
+ keywords = {ancient},
+ shortauthor = {Vergilius},
+ shorthand = {Verg. georg.},
+}
+
+@book{Vitr,
+ author = {Vitruvius},
+ title = {de architectura},
+ keywords = {ancient},
+ shortauthor = {Vitruv},
+ shorthand = {Vitr.},
+}
+
+@book{Vulg,
+ title = {Vulgata},
+ keywords = {ancient},
+ shorthand = {Vulg.},
+}
+
+@book{Xen:an,
+ author = {Xenophon},
+ title = {anabasis},
+ keywords = {ancient},
+ shortauthor = {Xenophon},
+ shorthand = {Xen. an.},
+}
+
+@book{Xen:apol,
+ author = {Xenophon},
+ title = {apologia},
+ keywords = {ancient},
+ shortauthor = {Xenophon},
+ shorthand = {Xen. apol.},
+}
+
+@book{Xen:Athpol,
+ author = {Xenophon},
+ title = {Athenaion politeia},
+ keywords = {ancient},
+ shortauthor = {Xenophon},
+ shorthand = {Xen. Ath. pol.},
+}
+
+@book{Xen:hell,
+ author = {Xenophon},
+ title = {hellenica},
+ keywords = {ancient},
+ shortauthor = {Xenophon},
+ shorthand = {Xen. hell.},
+}
+
+@book{Xen:kyn,
+ author = {Xenophon},
+ title = {cynegeticus},
+ keywords = {ancient},
+ shortauthor = {Xenophon},
+ shorthand = {Xen. kyn.},
+}
+
+@book{Xen:Kyr,
+ author = {Xenophon},
+ title = {Cyrupaideia},
+ keywords = {ancient},
+ shortauthor = {Xenophon},
+ shorthand = {Xen. Kyr.},
+}
+
+@book{Xen:mem,
+ author = {Xenophon},
+ title = {memorabilia (Apomnemoneumata)},
+ keywords = {ancient},
+ shortauthor = {Xenophon},
+ shorthand = {Xen. mem.},
+}
+
+@book{Xen:oec,
+ author = {Xenophon},
+ title = {oeconomicus},
+ keywords = {ancient},
+ shortauthor = {Xenophon},
+ shorthand = {Xen. oec.},
+}
+
+@book{Xen:symp,
+ author = {Xenophon},
+ title = {symposium},
+ keywords = {ancient},
+ shortauthor = {Xenophon},
+ shorthand = {Xen. symp.},
+}
+
+@book{Xenophan,
+ keywords = {ancient},
+ shortauthor = {Xenophanes},
+ shorthand = {Xenophan.},
+}
+
+@book{Zen,
+ keywords = {ancient},
+ shortauthor = {Zenon},
+ shorthand = {Zen.},
+}
+
+@book{Zenob,
+ keywords = {ancient},
+ shortauthor = {Zenobios},
+ shorthand = {Zenob.},
+}
+
+@book{Zenod,
+ keywords = {ancient},
+ shortauthor = {Zenodotos},
+ shorthand = {Zenod.},
+}
+
+@book{Zos,
+ keywords = {ancient},
+ shortauthor = {Zosimos},
+ shorthand = {Zos.},
+}
% \end{macrocode}
% \iffalse
%</ancient>
%</bib>
-%<bib>%% created by Lukas C. Bossert // digitales-altertum|de
+%<bib>%% created by Lukas C. Bossert // texografie
% \fi \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/archaeologie/archaeologie.ins b/Master/texmf-dist/source/latex/archaeologie/archaeologie.ins
deleted file mode 100644
index 57a0d1296b0..00000000000
--- a/Master/texmf-dist/source/latex/archaeologie/archaeologie.ins
+++ /dev/null
@@ -1,80 +0,0 @@
-%%
-%% This is file `archaeologie.ins',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% archaeologie.dtx (with options: `install')
-%% ----------------------------------------------------------------
-%% biblatex-archaeologie ---
-%% Author: Lukas C. Bossert
-%% E-mail: info@biblatex.texografie.de
-%% License: Released under the LaTeX Project Public License v1.3c or later
-%% See: http://www.latex-project.org/lppl.txt
-%% ----------------------------------------------------------------
-%%
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
-
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-
-\nopreamble\nopostamble
-
-\usedir{doc/latex/\jobname}
-\generate{
- \file{README.md}{\from{\jobname.dtx}{readme}}
- \file{\jobname-examples.bib}{\from{\jobname.dtx}{bib,expl}}
- \file{\jobname-lstlocations.bib}{\from{\jobname.dtx}{bib,locations}}
- \file{\jobname-lstpublishers.bib}{\from{\jobname.dtx}{bib,publishers}}
- \file{\jobname-lstabbrv.bib}{\from{\jobname.dtx}{bib,abbrv}}
- \file{\jobname-bibcorpora.bib}{\from{\jobname.dtx}{bib,corpora}}
- \file{\jobname-bibancient.bib}{\from{\jobname.dtx}{bib,ancient}}
-}
-
-\preamble
-----------------------------------------------------------------
-biblatex-archaeologie ---
-Author: Lukas C. Bossert
-E-mail: info@biblatex.texografie.de
-License: Released under the LaTeX Project Public License v1.3c or later
-See: http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
-\endpreamble
-\postamble
-
-Copyright (C) 2019 Lukas C. Bossert // digitales-altertum.de
-\endpostamble
-
-\usedir{tex/latex/\jobname}
-\generate{
- % \file{\jobname-german.tex}{\from{\jobname.dtx}{doc}}
- \file{archaeologie.bbx}{\from{\jobname.dtx}{bbx}}
- \file{archaeologie.cbx}{\from{\jobname.dtx}{cbx}}
- \file{archaeologie.dbx}{\from{\jobname.dtx}{dbx}}
- \file{english-archaeologie.lbx}{\from{\jobname.dtx}{lbx,en}}
- \file{french-archaeologie.lbx}{\from{\jobname.dtx}{lbx,fr}}
- \file{italian-archaeologie.lbx}{\from{\jobname.dtx}{lbx,it}}
- \file{spanish-archaeologie.lbx}{\from{\jobname.dtx}{lbx,es}}
- \file{german-archaeologie.lbx}{\from{\jobname.dtx}{lbx,de}}
-}
-\endbatchfile
-%%
-%% Copyright (C) 2019 Lukas C. Bossert // digitales-altertum.de
-%%
-%% End of file `archaeologie.ins'.
diff --git a/Master/texmf-dist/source/latex/arraycols/arraycols.dtx b/Master/texmf-dist/source/latex/arraycols/arraycols.dtx
index 335ca53c115..9a62fa7f1cd 100644
--- a/Master/texmf-dist/source/latex/arraycols/arraycols.dtx
+++ b/Master/texmf-dist/source/latex/arraycols/arraycols.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+% Copyright (C) 2019-2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
%
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3 of this license
@@ -20,7 +20,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{arraycols}
- [2019/06/26 v1.0 .dtx arraycols file]
+ [2020/11/23 v1.1 .dtx arraycols file]
%</package>
%<*driver>
\documentclass{ltxdoc}
@@ -50,7 +50,7 @@
%</driver>
% \fi
%
-% \CheckSum{614}
+% \CheckSum{46}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -71,14 +71,16 @@
% \changes{v0.1}{27/12/2011}{First personal version}
% \changes{v1.0}{2019/05/04}{Initial version, creating dtx and ins files}
% \changes{v1.0}{2019/06/17}{English translation by François Bastouil}
+% \changes{v1.1}{2020/11/23}{Incompatibility with tablestyles mentioned,
+% minor changes in documentation}
%
% \GetFileInfo{arraycols.sty}
%
% \title{The \textsf{arraycols} package\thanks{This document
-% corresponds to \textsf{arraycols}~\fileversion, initial version dated \filedate.
-% Thanks to François Bastouil for English translation.}}
+% corresponds to \textsf{arraycols}~\fileversion, dated \filedate.
+% Thanks to François Bastouil for help in English translation.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
-% \date{June 26, 2019}
+% \date{November 23, 2020}
% \maketitle
%
% \section{Introduction}
@@ -132,12 +134,15 @@
% Note that if a column type has already been defined previously,
% it will be overwritten with a warning message.
%
-% Besides \textsf{array}, \textsf{arraycols} loads the \textsf{cellspace} package,
+% Besides \textsf{array}, \textsf{arraycols} loads the \textsf{cellspace} package~\cite{CELLSP},
% necessary for the \texttt{x}, \texttt{y}, \texttt{z} and \texttt{Z} types of columns and
% \textsf{tabularx}~\cite{TABX}, necessary for \texttt{T} and \texttt{Z},
% as well as \textsf{makecell}~\cite{MKCELL} for various alignments of multilined table cells.
+% The \textsf{tablestyles} package~\cite{TBLSTY} defines also L, C, R, Z column types
+% but in a different way, nevertheless this package is incompatible with \textsf{makecell}
+% and therefore with \textsf{arraycols} too.
%
-% This package, with a very short code, does not claim to develop new macros.
+% With a very short code, this package does not claim to develop new macros.
% Its main action is to combine and set features coming from other packages.
%
% \section{Usage}
@@ -145,13 +150,13 @@
%\medskip
% \DescribeEnv{L} \DescribeEnv{C} \DescribeEnv{R}
% Referring to an example from the \textsf{array} package documentation,
-% \textsf{arraycols} provides the |L|, |C|, |R| type of columns
+% \textsf{arraycols} provides the |L|, |C|, |R| columns types
% which reverse the mathematical mode.
-% Then we can use these column types to get centred, left-aligned or right-aligned
-% LR-mode in an \texttt{array} or math-mode in a \texttt{tabular} environment.
-% For instance, declaration *\begin{tabular}{|l|C|r|}* produces the second column
-% in a centred mathematical mode and declaration *\begin{array}{|L|c|c|}*
-% produces the first column in text mode, left aligned\footnote{The declarations
+% Then we can use them to get centered, left-aligned or right-aligned
+% LR-mode in an \texttt{array} environment or math-mode in a \texttt{tabular} environment.
+% For instance, the declaration *\begin{tabular}{|l|C|r|}* sets centered mathematical mode
+% in the second column and declaration *\begin{array}{|L|c|c|}*
+% sets text mode, left aligned in the first column\footnote{The declarations
% \texttt{L, C, R} do not work in a \texttt{tabularx} environment.
% Note that the \textsf{tabulary} package by David Carlisle~\cite{TABY}
% already defines the \texttt{L, C, R, J} column types for particular alignments
@@ -162,22 +167,24 @@
%
% \medskip
% \DescribeEnv{t\marg{width}}
-% We add the definition \texttt{t}\{\meta{width}\} (text in LR-mode)
-% producing a horizontal and a vertical centering in the column unlike the classics
-% \texttt{p}\marg{width} and \texttt{m}\marg{width} which produce left aligned text.
+% The new column type definition \texttt{t}\{\meta{width}\} (text in LR-mode)
+% produces horizontal and vertical centering in the column unlike the classics
+% \texttt{p}\marg{width} (in standard \LaTeX) and \texttt{m}\marg{width}
+% (from the \textsf{array} package) which produce left aligned text (visible when the column
+% is wider than the text inside).
%
% \medskip
% \DescribeEnv{x} \DescribeEnv{y}
-% To ensure a sufficient height for rows, for instance for formulas
-% in displaymath mode, we have defined the columntypes \texttt{x} (centred)
+% To ensure sufficient height for rows, for instance in displaymath mode
+% formulas, we provide the columntypes \texttt{x} (centered)
% and \texttt{y} (left aligned), based on the \textsf{cellspace} package
% by Josselin Noirel~\cite{CELLSP}.
-% They allows an automatic adjustment of the rows heights to avoid touching the
+% They allow automatic adjustment of row heights to avoid touching the
% horizontal rules when content is too high.
% Although \textsf{cellspace} is defined \emph{a priori} for \texttt{tabular} environments,
% the new \texttt{x} and \texttt{y} column types, defined by \textsf{arraycols},
-% produce a column in mathematical mode with the right adjustment,
-% either with a \texttt{tabular} or with an \texttt{array} environment.
+% produce a column in mathematical mode with good adjustment,
+% either in a \texttt{tabular} or in an \texttt{array} environment.
%
% Look at the following examples produced with
% *\begin{array}{|c|}* and with *\begin{array}{|x|}*.
@@ -213,20 +220,20 @@
% \og the \textsf{amsmath} package can be loaded beforehand with other
% packages (such as \texttt{empheq} or \texttt{mathtools}),
% were an incompatibility to arise from one’s loading it later\fg.}
-% for a good management of rows heights in matrix tables.
+% for a good management of row heights in matrix tables.
%
% \medskip
% Notice that another package, \textsf{booktabs}~\cite{BOOK}, also provides
-% an excellent adjustment for rows heights, but unfortunately, it doesn't handle the height
+% an excellent adjustment of row heights, but unfortunately, it doesn't handle height
% of vertical separators *|*.
% To get the same vertical adjustment as \textsf{booktabs},
-% thus we set the \textsf{cellspace} parameters:\\
+% we set the \textsf{cellspace} parameters as follows:\\
% |\setlength{\cellspacetoplimit}{3pt}|, \\
% |\setlength{\cellspacebottomlimit}{2pt}|.
%
% We should also mention the \textsf{tabls} package by Donald Arneseau~\cite{TABLS}
-% making a good adjustment of rows heights as well, but it's incompatible with the \textsf{array}
-% and \textsf{numprint} packages.
+% that makes a good adjustment of row heights as well, but it is incompatible
+% with the \textsf{array} and \textsf{numprint} packages.
%
% \medskip
% At last, it is also possible to make manual adjustments with the |\vstrut| command
@@ -236,8 +243,9 @@
%
% \medskip
% \DescribeEnv{z\marg{width}}
-% The column definition \texttt{z}\marg{width} enables, just as \texttt{t}\marg{width},
-% to set the column width, but also activates the math mode and adjusts the row height,
+% The column type \texttt{z}\marg{width} enables to set the column width,
+% as \texttt{t}\marg{width},
+% but also activates the math mode and adjusts the row height,
% as \texttt{x}.
%
% \medskip
@@ -249,8 +257,8 @@
% *\begin{tabularx}{8cm}{|c|X|X|}* adjusts the width of the \texttt{X} columns
% for a total witdh of the table equals to 8\,cm. As a complement, we propose
% the \texttt{T} declaration, doing the same thing but with horizontal centering
-% and \texttt{Z} which furthermore activates the mathematical mode and adjusts the height
-% of the line (as \texttt{x} or \texttt{z}). Here is an example with
+% and \texttt{Z} which furthermore activates the mathematical mode and adjusts
+% line heights (as \texttt{x} or \texttt{z}). Here is an example with
% *\begin{tabularx}{\linewidth}{|T|y|x|Z|T|}*.
% \begin{center}
% \begin{tabularx}{\linewidth}{|T|y|x|Z|T|}
@@ -264,7 +272,7 @@
% \end{tabularx}
% \end{center}
% To keep the perfect aligment of fraction bars in mathematical formulas,
-% cells are not vertically centred, however, to get a proper vertical positioning
+% cells are not vertically centered, however, to get a proper vertical positioning
% in the last cell, we have used the powerfull |\makecell| command of
% the \textsf{makecell} package by Olga Lapko~\cite{MKCELL}:
% |\makecell{a multiline \\ piece of text}|.
@@ -295,12 +303,14 @@
% |\renewcommand\theadfont{\footnotesize\sffamily}| \\
% (originally |\footnotesize| only, without |\sffamily|).
% At last, according to a recommendation of the \textsf{array} package~\cite{ARRAY},
-% 1\,pt has been added to the normal height of every row of the table, with the command
+% 1\,pt has been added to the normal height of every row of this table, with the command
% |\setlength{\extrarowheight}{1pt}|\footnote{As mentioned
% in the \textsf{array} package documentation:
% \og This is important for tables with horizontal lines because those
% lines normally touch the capital letters\fg.}.
%
+% \StopEventually{}
+%
% \section{Implementation}
% \begin{macrocode}
\RequirePackage{array}
@@ -326,7 +336,7 @@
\setlength{\cellspacebottomlimit}{2pt}
\newcolumntype{z}[1]{>{$}S{>{\centering\arraybackslash}p{#1}}<{$}}
% \end{macrocode}
-% For the \texttt{z} defintion of column, we use \texttt{p} and not \texttt{m}
+% For the \texttt{z} definition of column, we use \texttt{p} and not \texttt{m}
% (which automatically centers) in order to keep a correct alignment for mathematical
% expressions in the cells of a same row.
% \medskip
@@ -334,7 +344,7 @@
\newcolumntype{T}{>{\centering\arraybackslash}X}
\newcolumntype{Z}{>{$}ST<{$}}
% \end{macrocode}
-% The \texttt{T} columns are not automatically centred. It would be possible to do it
+% The \texttt{T} columns are not automatically centered. It would be possible to do it
% with the command |\renewcommand{\tabularxcolumn}[1]{m{#1}}|
% (with \texttt{m} instead of default value \texttt{p}),
% but unfortunately this has a global effect for all the declarations of columns based
@@ -352,7 +362,7 @@
\renewcommand\theadfont{\footnotesize\sffamily}
% \end{macrocode}
%
-% \begin{thebibliography}{10}
+% \begin{thebibliography}{11}
% \bibitem{ARRAY} \emph{A new implementation of LATEX’s \textsf{tabular} and \textsf{array}
% environment}, Frank Mittelbach, David Carlisle, CTAN, v2.4k revised 2018/12/30.
% \bibitem{CELLSP} \emph{The \textsf{cellspace} package}, Josselin Noirel, CTAN,
@@ -360,6 +370,8 @@
% \bibitem{TABX} \emph{The \textsf{tabularx} package}, David Carlisle, CTAN, v2.11.b 2016/02/03.
% \bibitem{MKCELL} \emph{The \textsf{makecell} package}, Olga Lapko, CTAN, v0.1e 2009/08/03.
% \bibitem{TABY} \emph{The \textsf{tabulary} package}, David Carlisle, CTAN, v1.10 2014/06/11.
+% \bibitem{TBLSTY} \emph{The \textsf{tablestyles} package}, Matthias Pospiech, CTAN,
+% v0.1 2014/06/27.
% \bibitem{BOOK} \emph{Publication quality tables in \LaTeX}, package \textsf{booktabs} by
% Simon Fear, CTAN, v1.618033 2016/04/29.
% \bibitem{TABLS} \emph{The \textsf{tabls} package}, Donald Arseneau, CTAN, v3.5 2010/02/26.
diff --git a/Master/texmf-dist/source/latex/arraycols/arraycols.ins b/Master/texmf-dist/source/latex/arraycols/arraycols.ins
index 51d5629aaa5..5c6a796f939 100644
--- a/Master/texmf-dist/source/latex/arraycols/arraycols.ins
+++ b/Master/texmf-dist/source/latex/arraycols/arraycols.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2019 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+%% Copyright (C) 2019-2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
%%
%% This file may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.3 of this license
@@ -21,7 +21,7 @@
This is a generated file.
-Copyright (C) 2019 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+Copyright (C) 2019-2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
This file may be distributed and/or modified under the conditions of
the LaTeX Project Public License, either version 1.3 of this license
diff --git a/Master/texmf-dist/source/latex/askinclude/askinclude.dtx b/Master/texmf-dist/source/latex/askinclude/askinclude.dtx
index ace5aba3e80..4044aa81280 100644
--- a/Master/texmf-dist/source/latex/askinclude/askinclude.dtx
+++ b/Master/texmf-dist/source/latex/askinclude/askinclude.dtx
@@ -1,13 +1,13 @@
% \iffalse meta-comment
%
% File: askinclude.dtx
-% Version: 2019-12-10 v2.6
+% Version: 2020-04-12 v2.7
% Info: Interactive asking of included files
%
% Copyright (C)
% 1991-1994 Pablo A. Straub
% 2007, 2008, 2011 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
+% 2016-2020 Oberdiek Package Support Group
% https://github.com/ho-tex/askinclude/issues
%
% This work may be distributed and/or modified under the
@@ -81,7 +81,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: askinclude 2019-12-10 v2.6 Interactive asking of included files}
+\Msg{* Package: askinclude 2020-04-12 v2.7 Interactive asking of included files}
\Msg{************************************************************************}
\keepsilent
@@ -93,12 +93,12 @@
This is a generated file.
Project: askinclude
-Version: 2019-12-10 v2.6
+Version: 2020-04-12 v2.7
Copyright (C)
1991-1994 Pablo A. Straub
2007, 2008, 2011 Heiko Oberdiek
- 2016-2019 Oberdiek Package Support Group
+ 2016-2020 Oberdiek Package Support Group
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -193,7 +193,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{askinclude.drv}%
- [2019-12-10 v2.6 Interactive asking of included files]%
+ [2020-04-12 v2.7 Interactive asking of included files]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}[2011/11/22]
\usepackage{iftex}
@@ -221,12 +221,12 @@ and the derived files
% \GetFileInfo{askinclude.drv}
%
% \title{The \xpackage{askinclude} package}
-% \date{2019-12-10 v2.6}
+% \date{2020-04-12 v2.7}
% \author{
% Pablo A. Straub\\[1ex]
% Heiko Oberdiek\thanks
% {Please report any issues at \url{https://github.com/ho-tex/askinclude/issues}}}
-%
+%
%
% \maketitle
%
@@ -608,7 +608,7 @@ and the derived files
\TMP@EnsureCode{96}{12}% `
\edef\AskInc@AtEnd{\AskInc@AtEnd\noexpand\endinput}
\ProvidesPackage{askinclude}%
- [2019-12-10 v2.6 Interactive asking of included files]%
+ [2020-04-12 v2.7 Interactive asking of included files]%
% \end{macrocode}
%
% Luatex compat
@@ -1266,9 +1266,9 @@ and the derived files
\AskInc@DoMatch{##1}{%
\AskInc@WriteAddMatch{##1}%
\ifx\@partlist\@empty
- \gdef\@partlist{##1}%
+ \expandafter\gdef\expandafter\@partlist\expandafter{\detokenize{##1}}%
\else
- \g@addto@macro\@partlist{,##1}%
+ \expandafter\g@addto@macro\expandafter\@partlist\expandafter{\expandafter,\detokenize{##1}}%
\fi
}%
}%
@@ -1498,9 +1498,9 @@ and the derived files
\AskInc@AskQuestion
\ifx\AskInc@AskResult\AskInc@CharYes
\ifx\AskInc@Answer\@empty
- \gdef\AskInc@Answer{#1}%
+ \expandafter\gdef\expandafter\AskInc@Answer\expandafter{\detokenize{#1}}%
\else
- \g@addto@macro\AskInc@Answer{,#1}%
+ \expandafter\g@addto@macro\expandafter\AskInc@Answer\expandafter{\expandafter,\detokenize{#1}}%
\fi
\AskInc@SaveAnswer
\let\@partlist\AskInc@Answer
@@ -1820,78 +1820,8 @@ and the derived files
% \begin{Version}{2019-12-10 v2.6}
% \item Updated
% \end{Version}
-% \end{History}
-%
-% \PrintIndex
-%
-% \Finale
-\endinput
-% \begin{Version}{1991/11/05 v0.95}
-% \item
-% First beta-test version (asked two questions).
-% \end{Version}
-% \begin{Version}{1991/11/05 v0.99}
-% \item
-% Second beta-test version (asks one question; uses `|*|' and `|-|').
-% \end{Version}
-% \begin{Version}{1991/11/07 v1.0}
-% \item
-% Changed prompts (sent to \xnewsgroup{comp.text.tex}):
-% \URL{``\link{Interactive inclusion of files in LaTeX}''}^^A
-% {https://groups.google.com/group/comp.text.tex/msg/34b770a7c277e79c}
-% \end{Version}
-% \begin{Version}{1991/12/13 v1.1}
-% \item
-% \textit{Unknown}.
-% \end{Version}
-% \begin{Version}{1994/11/02 v1.2e}
-% \item
-% Two small changes to run under LaTeX2e [RF].
-% \item
-% Additional documentation [TRS].
-% \end{Version}
-% \begin{Version}{2007/10/15 v1.0 (askinc)}
-% \item
-% Reimplementation, published as \xpackage{askinc} in
-% newsgroup \xnewsgroup{comp.text.tex}:\\
-% \URL{``\link{Re: askinclude.sty}''}^^A
-% {https://groups.google.com/group/comp.text.tex/msg/2d638b84a858fdc8}
-% \item
-% Listing of included files, collected from the previous run before
-% the question.
-% \item
-% No error message by \xfile{.aux} file if package is removed.
-% \end{Version}
-% \begin{Version}{2007/10/23 v2.0}
-% \item
-% The next version of \xpackage{askinc} becomes
-% version 2.0 of \xpackage{askinclude}.
-% \item
-% `|?|' added for questioning each file.
-% \item
-% \cs{includeonly} has precedence until package loading.
-% Then it is disabled by a warning.
-% \item
-% Documentation rewritten/added.
-% \item
-% Tests added.
-% \end{Version}
-% \begin{Version}{2008/08/11 v2.1}
-% \item
-% Code is not changed.
-% \item
-% URLs updated.
-% \end{Version}
-% \begin{Version}{2011/12/02 v2.2}
-% \item
-% Bibliography rewritten for biblatex.
-% \end{Version}
-% \begin{Version}{2016/05/14 v2.3}
-% \item
-% Luatex compatibility
-% \end{Version}
-% \begin{Version}{2019-12-10 v2.6}
-% \item Updated
+% \begin{Version}{2020-04-12 v2.7}
+% \item Fixed issue \#1, wrong catcode in filename match after kernel change.
% \end{Version}
% \end{History}
%
diff --git a/Master/texmf-dist/source/latex/atenddvi/atenddvi.dtx b/Master/texmf-dist/source/latex/atenddvi/atenddvi.dtx
index db82a3985f9..a82cd861215 100644
--- a/Master/texmf-dist/source/latex/atenddvi/atenddvi.dtx
+++ b/Master/texmf-dist/source/latex/atenddvi/atenddvi.dtx
@@ -1,12 +1,12 @@
% \iffalse meta-comment
%
% File: atenddvi.dtx
-% Version: 2019-12-11 v1.4
+% Version: 2020-11-11 v1.5
% Info: At end DVI hook
%
% Copyright (C)
% 2007 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
+% 2016-2020 Oberdiek Package Support Group
% https://github.com/ho-tex/atenddvi/issues
%
% This work may be distributed and/or modified under the
@@ -61,6 +61,7 @@
%
% Installation:
% TDS:tex/latex/atenddvi/atenddvi.sty
+% TDS:tex/latex/atenddvi/atenddvi-2019-12-11.sty
% TDS:doc/latex/atenddvi/atenddvi.pdf
% TDS:source/latex/atenddvi/atenddvi.dtx
%
@@ -79,7 +80,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: atenddvi 2019-12-11 v1.4 At end DVI hook (HO)}
+\Msg{* Package: atenddvi 2020-11-11 v1.5 At end DVI hook (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -91,11 +92,11 @@
This is a generated file.
Project: atenddvi
-Version: 2019-12-11 v1.4
+Version: 2020-11-11 v1.5
Copyright (C)
2007 Heiko Oberdiek
- 2016-2019 Oberdiek Package Support Group
+ 2016-2020 Oberdiek Package Support Group
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -126,6 +127,7 @@ and the derived files
\file{atenddvi.drv}{\from{atenddvi.dtx}{driver}}%
\usedir{tex/latex/atenddvi}%
\file{atenddvi.sty}{\from{atenddvi.dtx}{package}}%
+ \file{atenddvi-2019-12-11.sty}{\from{atenddvi.dtx}{packagefrozen}}
}
\catcode32=13\relax% active space
@@ -152,7 +154,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{atenddvi.drv}%
- [2019-12-11 v1.4 At end DVI hook (HO)]%
+ [2020-11-11 v1.5 At end DVI hook (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}[2011/11/22]
\begin{document}
@@ -166,12 +168,15 @@ and the derived files
% \GetFileInfo{atenddvi.drv}
%
% \title{The \xpackage{atenddvi} package}
-% \date{2019-12-11 v1.4}
+% \date{2020-11-11 v1.5}
% \author{Heiko Oberdiek\thanks
% {Please report any issues at \url{https://github.com/ho-tex/atenddvi/issues}}}
%
% \maketitle
%
+% \textbf{This package is unneeded and does nothing with a \LaTeX{} version
+% 2020-10-01 or newer as \cs{AtBeginDvi} is then provided by the format.}
+%
% \begin{abstract}
% \LaTeX\ offers \cs{AtBeginDvi}. This package \xpackage{atenddvi}
% provides the counterpart \cs{AtEndDvi}. The execution of its
@@ -216,12 +221,31 @@ and the derived files
% }
%
% \section{Implementation}
-%
% \begin{macrocode}
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{atenddvi}%
- [2019-12-11 v1.4 At end DVI hook (HO)]%
+ [2020-11-11 v1.5 At end DVI hook (HO)]%
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}
+ {%
+ \PackageWarning{atenddvi}
+ {Functionality of this package is already\MessageBreak
+ provided by LaTeX.\MessageBreak\MessageBreak
+ It is therefore no longer necessary to load it\MessageBreak
+ and you can safely remove it.\MessageBreak
+ Found on}{}%
+ }{\input{atenddvi-2019-12-11.sty}}
+\IfFormatAtLeastTF{2020/10/01}{}{\endinput}
+
+%</package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*packagefrozen>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{atenddvi}%
+ [2020-11-11 v1.5 At end DVI hook / legacy frozen code (HO) ]%
% \end{macrocode}
%
% Load the required packages
@@ -367,7 +391,7 @@ and the derived files
% \end{macro}
%
% \begin{macrocode}
-%</package>
+%</packagefrozen>
% \end{macrocode}
%
% \section{Installation}
@@ -381,27 +405,6 @@ and the derived files
% \item[\CTAN{macros/latex/contrib/atenddvi/atenddvi.pdf}] Documentation.
% \end{description}
%
-%
-% \paragraph{Bundle.} All the packages of the bundle `atenddvi'
-% are also available in a TDS compliant ZIP archive. There
-% the packages are already unpacked and the documentation files
-% are generated. The files and directories obey the TDS standard.
-% \begin{description}
-% \item[\CTANinstall{install/macros/latex/contrib/atenddvi.tds.zip}]
-% \end{description}
-% \emph{TDS} refers to the standard ``A Directory Structure
-% for \TeX\ Files'' (\CTANpkg{tds}). Directories
-% with \xfile{texmf} in their name are usually organized this way.
-%
-% \subsection{Bundle installation}
-%
-% \paragraph{Unpacking.} Unpack the \xfile{atenddvi.tds.zip} in the
-% TDS tree (also known as \xfile{texmf} tree) of your choice.
-% Example (linux):
-% \begin{quote}
-% |unzip atenddvi.tds.zip -d ~/texmf|
-% \end{quote}
-%
% \subsection{Package installation}
%
% \paragraph{Unpacking.} The \xfile{.dtx} file is a self-extracting
@@ -418,6 +421,7 @@ and the derived files
% \def\t{^^A
% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
% atenddvi.sty & tex/latex/atenddvi/atenddvi.sty\\
+% atenddvi-2019-12-11.sty & atenddvi-2019-12-11.sty\\
% atenddvi.pdf & doc/latex/atenddvi/atenddvi.pdf\\
% atenddvi.dtx & source/latex/atenddvi/atenddvi.dtx\\
% \end{tabular}^^A
@@ -549,6 +553,12 @@ and the derived files
% \begin{Version}{2019-12-11 v1.4}
% \item Updated
% \end{Version}
+% \begin{Version}{2020-11-11 v1.5}
+% \item The package is now unneeded as LaTeX formats
+% newer than 2020-10-01 provide \cs{AtBeginDvi} and so does nothing
+% in this case.
+% The old code has been frozen.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/auto-pst-pdf/auto-pst-pdf.dtx b/Master/texmf-dist/source/latex/auto-pst-pdf/auto-pst-pdf.dtx
index 51f2ebb2b8d..1853b12f4a2 100644
--- a/Master/texmf-dist/source/latex/auto-pst-pdf/auto-pst-pdf.dtx
+++ b/Master/texmf-dist/source/latex/auto-pst-pdf/auto-pst-pdf.dtx
@@ -1,69 +1,11 @@
-% \iffalse
+% \iffalse
%<*internal>
-\iffalse
-%</internal>
-%<*readme>
-________________________
-The auto-pst-pdf package
-v0.6 2009/04/26
-
-This package uses -shell-escape (or "write18") to
-automatically perform the extra compilations
-required for the "pst-pdf" package.
-
-This makes it especially easy to integrate into the
-workflow of an editor with just "LaTeX" and "pdfLaTeX"
-buttons.
-
-Wrappers are provided for various psfrag-related
-features so that Matlab figures via laprint, Mathematica
-figures via MathPSfrag, and regular psfrag figures can
-all be input consistently and easily.
-
-Will Robertson - wspr 81 at gmail dot com
-Johannes Große
-
-Copyright 2007
-Distributed under the LaTeX Project Public License
-%</readme>
-%<*internal>
-\fi
\begingroup
-%</internal>
-%<*batchfile>
\input docstrip.tex
-\keepsilent
-\preamble
- __________________________________
- Copyright (C) 2007 Will Robertson
- License information appended.
-\endpreamble
-\postamble
-Copyright (C) 2007 by Will Robertson & Johannes Große
-
-Distributable under the LaTeX Project Public License,
-version 1.3c or higher (your choice). The latest version of
-this license is at: http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status)
-by Will Robertson.
-
-This work consists of the file auto-pst-pdf.dtx
- and the derived files auto-pst-pdf.pdf,
- auto-pst-pdf.sty, and
- auto-pst-pdf.ins.
-\endpostamble
-\askforoverwritefalse
-\generate{\file{\jobname.sty}{\from{\jobname.dtx}{package}}}
-%</batchfile>
-%<batchfile>\endbatchfile
-%<*internal>
-\generate{\file{\jobname.ins}{\from{\jobname.dtx}{batchfile}}}
+\keepsilent\askforoverwritefalse
\nopreamble\nopostamble
-\generate{\file{README.txt}{\from{\jobname.dtx}{readme}}}
\generate{\file{dtx-style.sty}{\from{\jobname.dtx}{dtx-style}}}
\endgroup
-\immediate\write18{mv README.txt README}
\immediate\write18{makeindex -s gind.ist -o \jobname.ind \jobname.idx}
\immediate\write18{makeindex -s gglo.ist -o \jobname.gls \jobname.glo}
%</internal>
@@ -95,7 +37,7 @@ This work consists of the file auto-pst-pdf.dtx
% \maketitle
%
% \section{Future plans}
-% This package is no longer being actively developed
+% This package is no longer being actively developed
% (although I'm happy to add small features and fix bugs). I (Will Robertson) first
% wrote \pkg{auto-pst-pdf} to aid the use of \pkg{psfrag} in pdf\LaTeX\ documents. The newer
% \pkg{pstool} package does this in a more efficient and convenient manner,
@@ -107,7 +49,7 @@ This work consists of the file auto-pst-pdf.dtx
% This package provides a wrapper around \pkg{pst-pdf} to automatically
% accomodate for typesetting either with \DVI\ or \PDF\ output. With
% default package option |[on]|, typesetting under pdf\/\LaTeX\ will
-% automatically initiate an auxiliary compilation of \LaTeX $\to$ |dvips|
+% automatically initiate an auxiliary compilation of \LaTeX $\to$ |dvips|
% $\to$ |ps2pdf| $\to$ |pdfcrop| to generate the required \PDF\ figures for the document.
%
% After this has been done and the figures no longer need to be
@@ -124,43 +66,43 @@ This work consists of the file auto-pst-pdf.dtx
% Requires the following packages: \pkg{ifplatform}, \pkg{pst-pdf}, \pkg{xkeyval}.
%
% Heiko Oberdiek's |pdfcrop| Perl script
-% \note{\url{http://www.ctan.org/tex-archive/support/pdfcrop/}}
+% \note{\url{http://www.ctan.org/tex-archive/support/pdfcrop/}}
% must be installed for the default {\color{niceblue}|crop=on|} option (see section~\ref{sec:opt}).
-% Under Windows, a Perl installation
-% \note{Freely available: \url{http://www.activestate.com/Products/activeperl/index.plex}}
+% Under Windows, a Perl installation
+% \note{Freely available: \url{http://www.activestate.com/Products/activeperl/index.plex}}
% will also need to be installed even though |pdfcrop| itself is part of MiK\TeX.
%
% \section{Provided macros for including graphics}
% Macros are provided to easily facilitate figures created by the
% \textsc{Matlab} package \pkg{laprint}
-% \note{\url{http://www.uni-kassel.de/fb16/rat/matlab/laprint/}}
+% \note{\url{http://www.uni-kassel.de/fb16/rat/matlab/laprint/}}
% and the Mathematica package \pkg{MathPSfrag}
% \note{\url{http://wwwth.mppmu.mpg.de/members/jgrosse/mathpsfrag/}}. Also,
% a generic \pkg{psfrag}
-% \note{\url{http://www.ctan.org/tex-archive/help/Catalogue/entries/psfrag.html}}
+% \note{\url{http://www.ctan.org/tex-archive/help/Catalogue/entries/psfrag.html}}
% wrapper is provided.
%
% \begin{trivlist}\item[]
% \begin{tabular}{@{\hskip 2em}lp{7cm}}
-% \cmd\mathfig\marg{filename} & \raggedright
+% \cmd\mathfig\marg{filename} & \raggedright
% insert a Mathematica graphic from \pkg{MathPSfrag}
% (without |-psfrag| suffix)\arraybackslash \\
-% \cmd\matlabfig\marg{filename} &
+% \cmd\matlabfig\marg{filename} &
% insert a \textsc{Matlab} graphic from \pkg{laprint} \\
-% \cmd\psfragfig\marg{filename} &
+% \cmd\psfragfig\marg{filename} &
% insert an \EPS\ with \pkg{psfrag}
% \end{tabular}
% \end{trivlist}
%
-% \noindent The above commands all accept an optional argument
+% \noindent The above commands all accept an optional argument
% which is passed to the underlying \cmd\includegraphics\ macro.
%
% The \cmd\matlabfig\ command meddles slightly with the output of
-% \pkg{laprint}; the font sizes in the figure will always be as
+% \pkg{laprint}; the font sizes in the figure will always be as
% originally defined. (This is unavoidable I'm afraid.)
%
-% For the \cmd\psfragfig\ command, \pkg{psfrag} statements are input
-% from either or both of the files \meta{document}|-psfrag.tex| and
+% For the \cmd\psfragfig\ command, \pkg{psfrag} statements are input
+% from either or both of the files \meta{document}|-psfrag.tex| and
% \meta{filename}|-psfrag.tex| if they exist. Furthermore, supplementary
% \cmd\psfrag\ statements can be added in a trailing optional argument:
%
@@ -198,11 +140,11 @@ This work consists of the file auto-pst-pdf.dtx
% {\color{gray}|\usepackage[|\color{niceblue}|latex={-interaction=nonstopmode}|\color{gray}|]{auto-pst-pdf}|}
%
% \bigskip\noindent
-% Any package options that are not recognised are passed on to \pkg{pst-pdf}. As an example,
+% Any package options that are not recognised are passed on to \pkg{pst-pdf}. As an example,
%
% {\color{gray}|\usepackage[|\color{niceblue}|final|\color{gray}|]{auto-pst-pdf}|}
%
-% \noindent will load \pkg{pst-pdf} with the \texttt{final} package option, possibly overriding
+% \noindent will load \pkg{pst-pdf} with the \texttt{final} package option, possibly overriding
% a global \texttt{draft} option from the class loading.
%
% \section{Acknowledgements}
@@ -223,10 +165,11 @@ This work consists of the file auto-pst-pdf.dtx
% This is the package.
%
% \begin{macrocode}
-\ProvidesPackage{auto-pst-pdf}[2009/04/26 v0.6 Wrapper for pst-pdf]
+\ProvidesPackage{auto-pst-pdf}[2020/10/08 v0.7 Wrapper for pst-pdf]
% \end{macrocode}
%
% \PrintChanges
+% \changes{v0.7}{2020/10/07}{Security fix for Windows.}
% \changes{v0.6}{2009/04/26}{Pass unknown options to \pkg{pst-pdf}.}
% \changes{v0.6}{2009/04/26}{\texttt{runs} option added (thanks Joseph!!)}
% \changes{v0.5}{2007/11/22}{\texttt{delay} option removed. Keep it simple, stupid!!}
@@ -254,19 +197,19 @@ This work consists of the file auto-pst-pdf.dtx
% \begin{macrocode}
\DeclareOptionX{off}[]{\@app@off@true}
\define@choicekey{auto-pst-pdf.sty}{crop}[\@tempa\@tempb]{on,off}{%
- \ifcase\@tempb\relax
+ \ifcase\@tempb\relax
\@app@crop@true
- \or
- \@app@crop@false
+ \or
+ \@app@crop@false
\fi}
\DeclareOptionX{on}[]{\@app@off@false}
\DeclareOptionX{ext}{\def\app@ext{#1}}
\DeclareOptionX{latex}{%
\def\app@latex@opts{%
\ifwindows
- -disable-write18
+ -disable-write18
\else
- -no-shell-escape
+ -no-shell-escape
\fi
-jobname="\app@jobname"
-interaction=batchmode
@@ -282,7 +225,7 @@ This work consists of the file auto-pst-pdf.dtx
\DeclareOptionX{runs}{%
\setcounter{app@runs}{#1}% support calc
- \ifnum\c@app@runs > \z@
+ \ifnum\c@app@runs > \z@
\else
\app@PackageWarning{The number of runs must be at least one.}%
\c@app@runs\@ne
@@ -350,7 +293,7 @@ This work consists of the file auto-pst-pdf.dtx
\repeat
\app@convert{latex}{\jobname.\app@ext}{\app@jobname.dvi}%
\app@convert{dvips}{\app@jobname.dvi}{\app@jobname.ps}%
- \if@app@crop@
+ \if@app@crop@
\app@convert{pstopdf}{\app@jobname.ps}{\app@jobname.pdf}%
\app@convert{pdfcrop}{\app@jobname.pdf}{\app@pics}%
\else
@@ -358,12 +301,12 @@ This work consists of the file auto-pst-pdf.dtx
\fi
\IfFileExists{\app@pics}
{\app@cleanup}
- {\app@PackageWarning{Could not create \app@pics.
+ {\app@PackageWarning{Could not create \app@pics.
Auxiliary files not deleted.}}}
% \end{macrocode}
% \end{macro}
-%
-% Command-line program to delete files:
+%
+% Command-line program to delete files:
% \begin{macrocode}
\edef\app@rm{\ifwindows del \else rm -- \fi}
% \end{macrocode}
@@ -373,7 +316,11 @@ This work consists of the file auto-pst-pdf.dtx
% \begin{macrocode}
\newcommand\app@try@rm[1]{%
\@for\@tempa:=#1\do{%
- \OnlyIfFileExists{\@tempa}{\app@exe{\app@rm "\@tempa"}}}}
+ \edef\@tempa{\@tempa}%
+ \ifx\@tempa\@empty\else
+ \OnlyIfFileExists{\@tempa}{\app@exe{\app@rm "\@tempa"}}%
+ \fi
+ }}
% \end{macrocode}
% \end{macro}
%
@@ -428,10 +375,10 @@ This work consists of the file auto-pst-pdf.dtx
\app@exe{echo "-------------------------------------------------"}
\else
\app@PackageError{%
- "shell escape" (or "write18") is not enabled:\app@nl
+ "shell escape" (or "write18") is not enabled:\app@nl
auto-pst-pdf will not work!}
- {You need to run LaTeX with the equivalent of
- "pdflatex -shell-escape"\app@nl
+ {You need to run LaTeX with the equivalent of
+ "pdflatex -shell-escape"\app@nl
Or turn off auto-pst-pdf.}%
\fi
\fi
@@ -449,7 +396,7 @@ This work consists of the file auto-pst-pdf.dtx
% \LaTeX\ compilation from scratch (as in `|latex| \meta{document}|.tex|`) --- here the |postscript| environment does nothing and document is processed `normally':
% \changes{v0.5}{2007/11/22}{Removed \cs{ifdefined} to avoid e-\TeX.}
% \begin{macrocode}
- \ifx\APPmakepictures\@undefined
+ \ifx\APPmakepictures\@undefined
\PassOptionsToPackage{inactive}{pst-pdf}
% \end{macrocode}
% \LaTeX\ compilation induced by this package:
@@ -478,7 +425,7 @@ This work consists of the file auto-pst-pdf.dtx
%
% Please suggest wrappers for other packages that output psfrag figures
% (for example: SciLab, R, Maple, LabView, Sage, ... ?)
-%
+%
% \begin{macro}{\matlabfig}
% We need to disable the scaling that laprint applies
% to \cmd\includegraphics\ in here, because otherwise labels that extend
@@ -545,8 +492,8 @@ This work consists of the file auto-pst-pdf.dtx
\renewenvironment{theglossary}
{\small\list{}{}
\item\relax
- \glossary@prologue\GlossaryParms
- \let\item\@idxitem \ignorespaces
+ \glossary@prologue\GlossaryParms
+ \let\item\@idxitem \ignorespaces
\def\pfill{\hspace*{\fill}}}
{\endlist}
@@ -559,7 +506,7 @@ This work consists of the file auto-pst-pdf.dtx
\linespread{1.1} % A bit more space between lines
\frenchspacing % Remove ugly extra space after punctuation
-
+
\definecolor{niceblue}{rgb}{0.2,0.4,0.8}
\def\theCodelineNo{\textcolor{niceblue}{\sffamily\tiny\arabic{CodelineNo}}}
diff --git a/Master/texmf-dist/source/latex/auto-pst-pdf/auto-pst-pdf.ins b/Master/texmf-dist/source/latex/auto-pst-pdf/auto-pst-pdf.ins
index 2ac6a85140e..d9c3bff35b0 100644
--- a/Master/texmf-dist/source/latex/auto-pst-pdf/auto-pst-pdf.ins
+++ b/Master/texmf-dist/source/latex/auto-pst-pdf/auto-pst-pdf.ins
@@ -1,22 +1,14 @@
-%%
-%% This is file `auto-pst-pdf.ins',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% auto-pst-pdf.dtx (with options: `batchfile')
-%% __________________________________
-%% Copyright (C) 2007 Will Robertson
-%% License information appended.
+
\input docstrip.tex
\keepsilent
\preamble
__________________________________
- Copyright (C) 2007 Will Robertson
+ Copyright (C) 2007-2020 Will Robertson
License information appended.
\endpreamble
\postamble
-Copyright (C) 2007 by Will Robertson & Johannes Große
+Copyright (C) 2007-2020 by Will Robertson & Johannes Große
+Copyright (C) 2007 Johannes Große
Distributable under the LaTeX Project Public License,
version 1.3c or higher (your choice). The latest version of
@@ -25,26 +17,9 @@ this license is at: http://www.latex-project.org/lppl.txt
This work is "maintained" (as per LPPL maintenance status)
by Will Robertson.
-This work consists of the file auto-pst-pdf.dtx
- and the derived files auto-pst-pdf.pdf,
- auto-pst-pdf.sty, and
- auto-pst-pdf.ins.
+This work consists of the files auto-pst-pdf.dtx and auto-pst-pdf.ins,
+ and the derived file auto-pst-pdf.sty.
\endpostamble
\askforoverwritefalse
\generate{\file{\jobname.sty}{\from{\jobname.dtx}{package}}}
\endbatchfile
-%% Copyright (C) 2007 by Will Robertson & Johannes Große
-%%
-%% Distributable under the LaTeX Project Public License,
-%% version 1.3c or higher (your choice). The latest version of
-%% this license is at: http://www.latex-project.org/lppl.txt
-%%
-%% This work is "maintained" (as per LPPL maintenance status)
-%% by Will Robertson.
-%%
-%% This work consists of the file auto-pst-pdf.dtx
-%% and the derived files auto-pst-pdf.pdf,
-%% auto-pst-pdf.sty, and
-%% auto-pst-pdf.ins.
-%%
-%% End of file `auto-pst-pdf.ins'.
diff --git a/Master/texmf-dist/source/latex/babel/babel.dtx b/Master/texmf-dist/source/latex/babel/babel.dtx
index 4b7e721f210..1a19d9f2d35 100644
--- a/Master/texmf-dist/source/latex/babel/babel.dtx
+++ b/Master/texmf-dist/source/latex/babel/babel.dtx
@@ -1,7 +1,7 @@
% \iffalse
% This document requires lualatex
%%
-%% Copyright (C) 2012-2020 Javier Bezos and Johannes L. Braams.
+%% Copyright (C) 2012-2021 Javier Bezos and Johannes L. Braams.
%% Copyright (C) 1989-2012 Johannes L. Braams and
%% any individual authors listed elsewhere in this file.
%% All rights reserved.
@@ -31,7 +31,7 @@
%
% \iffalse
%<*filedriver>
-\ProvidesFile{babel.dtx}[2020/03/22 v3.42 The Babel package]
+\ProvidesFile{babel.dtx}[2021/01/26 v3.53 The Babel package]
\documentclass{ltxdoc}
\GetFileInfo{babel.dtx}
\usepackage{fontspec}
@@ -79,7 +79,7 @@
\usepackage{framed}
\usepackage{multicol}
\usepackage{color,colortbl}
-\usepackage[linkbordercolor={.9 .7 .5}]{hyperref}
+\usepackage[linkcolor=blue,urlcolor=blue,colorlinks=true]{hyperref}
\newcommand\New[1]{%
\colorbox[rgb]{.92, .86, .73}{New #1}\enspace\ignorespaces}
\definecolor{thered} {rgb}{0.65,0.04,0.07}
@@ -202,13 +202,14 @@
Version \csname @gobble\expandafter\endcsname\fileversion\newline
\filedate
-\vspace{1cm}
-\textit{Original author}\newline
-Johannes L. Braams
+\LARGE
+\vspace{1.2cm}
+Johannes L. Braams\\[-.5ex]
+{\large Original author}
\vspace{.3cm}
-\textit{Current maintainer}\newline
-Javier Bezos
+Javier Bezos\\[-.5ex]
+{\large Current maintainer}
\end{minipage}
&\cellcolor[rgb]{.92, .86, .73}
\vspace{2cm}
@@ -217,10 +218,10 @@ Javier Bezos
\fontsize{35}{45}\selectfont
\setlength\parskip{3mm}\raggedright
Localization and internationalization\\[1cm]
+Unicode\\
\largetex\\
pdf\largetex\\
Lua\largetex\\
-LuaHB\largetex\\
Xe\largetex
\vspace{20cm}
\end{minipage}
@@ -234,34 +235,53 @@ Xe\largetex
\part{User guide}
-\begin{itemize}
-\item This user guide focuses on internationalization and localization
- with \LaTeX. There are also some notes on its use with Plain \TeX.
-
-\item Changes and new features with relation to version 3.8 are
- highlighted with \New{X.XX}\hspace{-.5em}, and there are some notes
- for the latest versions in
+\begin{description}
+\item[\sffamily\color{messages}What is this document about?] This user
+guide focuses on internationalization and localization with \LaTeX{}
+and \pdftex, \xetex{} and \luatex{} with the \babel{} package. There are
+also some notes on its use with Plain \TeX. Part II describes the code,
+and usually it can be ignored.
+
+\item[\sffamily\color{messages}What if I’m interested only in the
+ latest changes?] Changes and new features with relation to version 3.8
+ are highlighted with \New{X.XX}\hspace{-.5em}, and there are some
+ notes for the latest versions in
\href{https://github.com/latex3/babel/wiki}{the \babel{} wiki}. The
- most recent features could be still unstable. Please, report any
- issues you find in
- \href{https://github.com/latex3/babel/issues}{GitHub}, which is
- better than just complaining on an e-mail list or a web forum.
-
-\item If you are interested in the \TeX{} multilingual support, please
- join the \href{http://tug.org/mailman/listinfo/kadingira}{kadingira
- mail list}. You can follow
- the development of \babel{} in
- \href{https://github.com/latex3/babel}{GitHub} (which provides many
+ most recent features can be still unstable.
+
+\item[\sffamily\color{messages}Can I help?] Sure! If you are interested
+in the \TeX{} multilingual support, please join the
+\href{http://tug.org/mailman/listinfo/kadingira}{kadingira mail list}.
+You can follow the development of \babel{} in
+\href{https://github.com/latex3/babel}{GitHub} and make suggestions; feel
+free to fork it and make pull requests. If you are the author of a
+package, send to me a few test files which I'll add to mine, so that
+possible issues can be caught in the development phase.
+
+\item[\sffamily\color{messages}It doesn't work for me!] You can ask for
+help in some forums like \textsf{tex.stackexchange}, but if you have
+found a bug, I strongly beg you to report it in
+\href{https://github.com/latex3/babel/issues}{GitHub}, which is much
+better than just complaining on an e-mail list or a web forum. Remember
+\textit{warnings are not errors} by themselves, they just warn about
+possible problems or incompatibilities.
+
+\item[\sffamily\color{messages}How can I contribute a new
+language?] See section \ref{contribute} for contributing a language.
+
+\item[\sffamily\color{messages}I only need learn the most basic
+features.] The first subsections (1.1-1.3) describe the traditional way
+of loading a language (with |ldf| files), which is usually all you need.
+The alternative way based on |ini| files, which complements the
+previous one (it does \textit{not} replace it, although it is still
+necessary in some languages), is described below; go to \ref{inifiles}.
+
+\item[\sffamily\color{messages}I don’t like manuals. I prefer sample
+ files.] This manual contains lots of examples and tips, but in GitHub
+ there are many
\href{https://github.com/latex3/babel/tree/master/samples}{sample
- files}, too).
-
-\item See section \ref{contribute} for contributing a language.
-
-\item The first sections describe the traditional way of loading a
- language (with |ldf| files). The alternative way based on |ini|
- files, which complements the previous one (it does \textit{not}
- replace it), is described below.
-\end{itemize}
+ files}.
+\end{description}
\section{The user interface}\label{U-I}
@@ -270,7 +290,12 @@ Xe\largetex
In most cases, a single language is required, and then all you need in
\LaTeX{} is to load the package using its standard mechanism for this
purpose, namely, passing that language as an optional argument. In
-addition, you may want to set the font and input encodings.
+addition, you may want to set the font and input encodings.
+
+Another approach is making the language a global option in order to let
+other packages detect and use it. This is the standard way in \LaTeX{}
+for an option – in this case a language – to be recognized by several
+packages.
Many languages are compatible with \textsf{xetex} and \textsf{luatex}.
With them you can use \babel{} to localize the documents. When these
@@ -284,15 +309,13 @@ attributes with \textsf{fontspec}, too.
Here is a simple full example for “traditional” \TeX{} engines
(see below for \xetex{} and \luatex{}). The packages |fontenc| and
|inputenc| do not belong to \babel, but they are included in the
- example because typically you will need them (however, the package
- \textsf{inputenc} may be omitted with \LaTeX{} $\ge$ 2018-04-01 if
- the encoding is UTF-8):
+ example because typically you will need them. It assumes UTF-8, the
+ default encoding:
\setengine{pdftex}
\begin{verbatim}
\documentclass{article}
\usepackage[T1]{fontenc}
-% \usepackage[utf8]{inputenc} % Uncomment if LaTeX < 2018-04-01
_\usepackage[french]{babel}_
@@ -302,6 +325,15 @@ Plus ça change, plus c'est la même chose!
\end{document}
\end{verbatim}
+
+Now consider something like:
+\begin{verbatim}
+_\documentclass[french]{article}_
+\usepackage{babel}
+\usepackage{varioref}
+\end{verbatim}
+With this setting, the package \texttt{varioref} will also see
+the option |french| and will be able to use it.
\end{example}
\begin{example}
@@ -313,11 +345,11 @@ in UTF-8 and a so-called Unicode font must be loaded (in this example
\setengine{luatex/xetex}
\begin{verbatim}
-\documentclass{article}
+_\documentclass[russian]{article}_
-_\usepackage[russian]{babel}_
+\usepackage{babel}
-\babelfont{rm}{DejaVu Serif}
+_\babelfont{rm}{DejaVu Serif}_
\begin{document}
@@ -334,7 +366,7 @@ _\usepackage[russian]{babel}_
\trouble{Paragraph ended before \textbackslash UTFviii@three@octets
was complete}
A common source of trouble is a wrong setting of the input encoding.
-Depending on the \LaTeX{} version you could get the following somewhat
+Depending on the \LaTeX{} version you can get the following somewhat
cryptic error:
\begin{verbatim}
! Paragraph ended before \UTFviii@three@octets was complete.
@@ -346,17 +378,6 @@ Or the more explanatory:
Make sure you set the encoding actually used by your editor.
\end{troubleshooting}
-Another approach is making the language (\Lopt{french} in the example)
-a global option in order to let other packages detect and use it:
-\begin{verbatim}
-_\documentclass[french]{article}_
-\usepackage{babel}
-\usepackage{varioref}
-\end{verbatim}
-
-In this last example, the package \texttt{varioref} will also see
-the option and will be able to use it.
-
\begin{note}
Because of the way \babel{} has evolved, ``language'' can refer to
(1) a set of hyphenation patterns as preloaded into the format, (2)
@@ -389,6 +410,23 @@ Package babel Warning: No hyphenation patterns were preloaded for
it.
\end{troubleshooting}
+\begin{note}
+ With \textsf{hyperref} you may want to set the document language with
+ something like:
+\begin{verbatim}
+\usepackage[_pdflang=es-MX_]{hyperref}
+\end{verbatim}
+This is not currently done by \babel{} and you must set it by hand.
+\end{note}
+
+\begin{note}
+ Although it has been customary to recommend placing |\title|,
+ |\author| and other elements printed by |\maketitle| after
+ |\begin{document}|, mainly because of shorthands, it is advisable to
+ keep them in the preamble. Currently there is no real need to use
+ shorthands in those macros.
+\end{note}
+
\subsection{Multilingual documents}
In multilingual documents, just use a list of the required languages as
@@ -418,7 +456,7 @@ Examples of cases where |main| is useful are the following.
\begin{note}
Some classes load \babel{} with a hardcoded language option. Sometimes,
-the main language could be overridden with something like that before
+the main language can be overridden with something like that before
|\documentclass|:
\begin{verbatim}
\PassOptionsToPackage{main=english}{babel}
@@ -448,15 +486,13 @@ detail: |\selectlanguage| is used for blocks of text, while
|\foreignlanguage| is for chunks of text inside paragraphs.
\begin{example}
-A full bilingual document follows. The main language is |french|, which
-is activated when the document begins. The package \textsf{inputenc}
-may be omitted with \LaTeX{} $\ge$ 2018-04-01 if the encoding is UTF-8.
+A full bilingual document with \pdftex{} follows. The main language is
+|french|, which is activated when the document begins. It assumes UTF-8:
\setengine{pdftex}
\begin{verbatim}
\documentclass{article}
\usepackage[T1]{fontenc}
-\usepackage[utf8]{inputenc}
_\usepackage[english,french]{babel}_
@@ -496,6 +532,11 @@ _\usepackage[vietnamese,danish]{babel}_
\end{verbatim}
\end{example}
+\begin{note}
+ Once loaded a language, you can select it with the corresponding
+ BCP47 tag. See section \ref{bcp47} for further details.
+\end{note}
+
\subsection{Mostly monolingual documents}
\New{3.39} Very often, multilingual documents consist of a main
@@ -509,27 +550,35 @@ also when provided in the optional argument of |\babelfont|, if used.)
This is particularly useful, too, when there are short texts of this
kind coming from an external source whose contents are not known on
beforehand (for example, titles in a bibliography). At this regard, it
-is worth remembering that |\babelfont| does not load any font until
-required, so that it can be used just in case.
+is worth remembering that |\babelfont| does \textit{not} load any font
+until required, so that it can be used just in case.
\begin{example}
- A trivial document is:
+ A trivial document with the default font in English and Spanish, and
+ FreeSerif in Russian is:
\setengine{luatex/xetex}
\begin{verbatim}
-\documentclass{article}
-\usepackage[english]{babel}
+\documentclass[english]{article}
+\usepackage{babel}
-\babelfont[russian]{rm}{FreeSerif}
+_\babelfont[russian]{rm}{FreeSerif}_
\begin{document}
-English. \foreignlanguage{russian}{Русский}.
-\foreignlanguage{spanish}{Español}
+English. _\foreignlanguage{russian}{Русский}_.
+_\foreignlanguage{spanish}{Español}_.
\end{document}
\end{verbatim}
\end{example}
+\begin{note}
+ Instead of its name, you may prefer to select the language with the
+corresponding BCP47 tag. This alternative, however, must be activated
+explicitly, because a two- or tree-letter word is a valid name for a
+language (eg, |yi|). See section \ref{bcp47} for further details.
+\end{note}
+
\subsection{Modifiers}
\New{3.9c} The basic behavior of some languages can be modified when
@@ -623,8 +672,10 @@ This command can be used as environment, too.
\begin{note}
For ``historical reasons'', a macro name is converted to a language
name without the leading |\|; in other words,
- |\selectlanguage{\german}| is equivalent to |\selectlanguage{german}|.
- Using a macro instead of a ``real'' name is deprecated.
+ |\selectlanguage{\german}| is equivalent to
+ |\selectlanguage{german}|. Using a macro instead of a ``real'' name
+ is deprecated. \New{3.43} However, if the macro name does not match
+ any language, it will get expanded as expected.
\end{note}
\begin{warning}
@@ -637,18 +688,31 @@ This command can be used as environment, too.
code with an additional grouping level.
\end{warning}
-\Describe{\foreignlanguage}{\marg{language}\marg{text}}
-The command |\foreignlanguage| takes two arguments; the second
-argument is a phrase to be typeset according to the rules of the
-language named in its first one. This command (1) only switches the
-extra definitions and the hyphenation rules for the language,
-\emph{not} the names and dates, (2) does not send information about
-the language to auxiliary files (i.e., the surrounding language is
-still in force), and (3) it works even if the language has not been
-set as package option (but in such a case it only sets the hyphenation
-patterns and a warning is shown). With the |bidi| option, it also
-enters in horizontal mode (this is not done always for backwards
-compatibility).
+\Describe{\foreignlanguage}{\oarg{option-list}\marg{language}\marg{text}}
+
+The command |\foreignlanguage| takes two arguments; the second argument
+is a phrase to be typeset according to the rules of the language named
+in its first one.
+
+This command (1) only switches the extra definitions and the
+hyphenation rules for the language, \emph{not} the names and dates, (2)
+does not send information about the language to auxiliary files (i.e.,
+the surrounding language is still in force), and (3) it works even if
+the language has not been set as package option (but in such a case it
+only sets the hyphenation patterns and a warning is shown). With the
+|bidi| option, it also enters in horizontal mode (this is not done
+always for backwards compatibility).
+
+\New{3.44} As already said, captions and dates are not switched.
+However, with the optional argument you can switch them, too. So, you
+can write:
+\begin{verbatim}
+\foreignlanguage[date]{polish}{\today}
+\end{verbatim}
+In addition, captions can be switched with |captions| (or both, of
+course, with |date,| |captions|). Until 3.43 you had to write something
+like |{\selectlanguage{..} ..}|, which was not always the most
+convenient way.
\subsection{Auxiliary language selectors}
@@ -673,7 +737,7 @@ environment with an additional grouping, like braces |{}|.
Spaces after the environment are ignored.
\Describe{\begin\menv{otherlanguage*}}%
-{\marg{language}\Eenv{otherlanguage*}}
+{\oarg{option-list}\marg{language}\Eenv{otherlanguage*}}
Same as |\foreignlanguage| but as environment. Spaces after the
environment are \textit{not} ignored.
@@ -695,11 +759,11 @@ for instance be used to select `nohyphenation', provided that in
loading \file{zerohyph.tex}. It deactivates language shorthands, too
(but not user shorthands).
-Except for these simple uses, |hyphenrules| is discouraged and
-|otherlanguage*| (the starred version) is preferred, as the former does
-not take into account possible changes in encodings of characters like,
-say, |'| done by some languages (eg, \textsf{italian}, \textsf{french},
-\textsf{ukraineb}). To set hyphenation exceptions, use
+Except for these simple uses, |hyphenrules| is deprecated and
+|otherlanguage*| (the starred version) is preferred, because the former
+does not take into account possible changes in encodings of characters
+like, say, |'| done by some languages (eg, \textsf{italian},
+\textsf{french}, \textsf{ukraineb}). To set hyphenation exceptions, use
|\babelhyphenation| (see below).
\subsection{More on selection}
@@ -716,6 +780,17 @@ It defines |\text|\m{tag1}\marg{text} to be
to be |\begin{otherlanguage*}|\marg{language1}, and so on. Note
|\|\m{tag1} is also allowed, but remember to set it locally inside a
group.
+
+\begin{warning}
+ There is a clear drawback to this feature, namely, the ‘prefix’
+ |\text...| is heavily overloaded in \LaTeX{} and conflicts with
+ existing macros may arise (|\textlatin|, |\textbar|, |\textit|,
+ |\textcolor| and many others). The same applies to environments,
+ because |arabic| conflicts with |\arabic|. Except if there is a
+ reason for this ‘syntactical sugar’, the best option is to stick to
+ the default selectors or to define your own alternatives.
+\end{warning}
+
\begin{example}
With
\begin{verbatim}
@@ -768,7 +843,7 @@ language to wrap them with a selector:
By default only the basic captions and |\today| are redefined, but you
can add further macros with the key |include| in the optional argument
(without commas). Macros not to be modified are listed in
-|exclude|. You can also enforce a font encoding with
+|exclude|. You can also enforce a font encoding with the option
|fontenc|.\footnote{With it, encoded strings may not work as expected.}
A couple of examples:
\begin{verbatim}
@@ -788,7 +863,7 @@ With |ini| files (see below), captions are ensured by default.
A \textit{shorthand} is a sequence of one or two characters that
expands to arbitrary \TeX{} code.
-Shorthands can be used for different kinds of things, for example:
+Shorthands can be used for different kinds of things; for example:
(1) in some languages shorthands such as |"a| are defined to be able
to hyphenate the word if the encoding is |OT1|; (2) in some languages
shorthands such as |!| are used to insert the right amount of white
@@ -803,22 +878,20 @@ Unicode characters). As to the point 2, now \textsf{pdfTeX} provides
|\knbccode|, and \luatex{} can manipulate the glyph list. Tools for
point 3 can be still very useful in general.
-There are three levels of shorthands: \textit{user},
-\textit{language}, and \textit{system} (by order of
-precedence). Version 3.9 introduces the \textit{language user} level
-on top of the user level, as described below. In most cases, you will
-use only shorthands provided by languages.
+There are four levels of shorthands: \textit{user}, \textit{language},
+\textit{system}, and \textit{language user} (by order of precedence).
+In most cases, you will use only shorthands provided by languages.
-\begin{note} Note the following:
+\begin{note} Keep in mind the following:
\begin{enumerate}
\item Activated chars used for two-char shorthands cannot be followed
by a closing brace |}| and the spaces following are gobbled. With
one-char shorthands (eg,~|:|), they are preserved.
-\item If on a certain level (system, language, user) there is a
- one-char shorthand, two-char ones starting with that
- char and on the same level are ignored.
+\item If on a certain level (system, language, user, language user)
+ there is a one-char shorthand, two-char ones starting with that char
+ and on the same level are ignored.
\item Since they are active, a shorthand cannot contain the same
- character in its definition (except if it is deactivated with, eg,
+ character in its definition (except if deactivated with, eg,
|\string|).
\end{enumerate}
\end{note}
@@ -908,7 +981,7 @@ system shorthands. Language-dependent user shorthands (new in
\begin{example}
Let's assume you want a unified set of shorthand for discretionaries
(languages do not define shorthands consistently, and |"-|, |\-|,
- |"=| have different meanings). You could start with, say:
+ |"=| have different meanings). You can start with, say:
\begin{verbatim}
\useshorthands*{"}
\defineshorthand{"*}{\babelhyphen{soft}}
@@ -916,10 +989,10 @@ system shorthands. Language-dependent user shorthands (new in
\end{verbatim}
However, the behavior of hyphens is language-dependent. For example, in
languages like Polish and Portuguese, a hard hyphen inside compound
- words are repeated at the beginning of the next line. You could then
+ words are repeated at the beginning of the next line. You can then
set:
\begin{verbatim}
-\defineshorthand[*polish,*portugese]{"-}{\babelhyphen{repeat}}
+\defineshorthand[*polish,*portuguese]{"-}{\babelhyphen{repeat}}
\end{verbatim}
Here, options with |*| set a language-dependent user shorthand,
which means the generic one above only applies for the rest of
@@ -952,7 +1025,7 @@ with, for example, |\useshorthands| or |\useshorthands*|.)
than |\shorthandoff|, for example if you want to define a macro
to easy typing phonetic characters with \textsf{tipa}:
\begin{verbatim}
-\newcommand{\myipa}[1]{{\languageshorthands{none}\tipaencoding#1}}
+\newcommand{\myipa}[1]{{_\languageshorthands{none}_\tipaencoding#1}}
\end{verbatim}
\end{example}
@@ -970,7 +1043,7 @@ macros, or even your own user shorthands provided they do not overlap.)
|\begin{document}|, you may use this macro when defining the |\title|
in the preamble:
\begin{verbatim}
-\title{Documento científico\babelshorthand{"-}técnico}
+\title{Documento científico_\babelshorthand{"-}_técnico}
\end{verbatim}
\end{example}
@@ -1067,7 +1140,7 @@ $\string|$ \texttt{off}}
The only language shorthands activated
are those given, like, eg:
\begin{verbatim}
-\usepackage[esperanto,french,shorthands=:;!?]{babel}
+\usepackage[esperanto,french,_shorthands=:;!?_]{babel}
\end{verbatim}
If \verb|'| is included, \texttt{activeacute} is set; if \verb|`| is
included, \texttt{activegrave} is set. Active characters (like
@@ -1144,7 +1217,7 @@ encodings). Other allowed values are font encoding codes (|T1|, |T2A|,
and the like (this feature misuses some internal \LaTeX\ tools, so use
it only as a last resort).
-\Describe{hyphenmap=}{\texttt{off} $\string|$ \texttt{main}
+\Describe{hyphenmap=}{\texttt{off} $\string|$ \texttt{first}
$\string|$ \texttt{select} $\string|$ \texttt{other} $\string|$
\texttt{other*}}
@@ -1225,7 +1298,13 @@ be the same as the option name as set in |\usepackage|!).
\end{verbatim}
\end{example}
+\begin{warning}
+ Currently this option is not compatible with languages loaded on the
+ fly.
+\end{warning}
+
\subsection{\texttt{ini} files}
+\label{inifiles}
An alternative approach to define a language (or, more precisely, a
\textit{locale}) is by means of an \texttt{ini} file. Currently
@@ -1242,10 +1321,10 @@ main exception being the |\...name| strings).
Most of them set the date, and many also the captions (Unicode and
LICR). They will be evolving with the time to add more features
(something to keep in mind if backward compatibility is important). The
-following section shows how to make use of them currently (by means of
-|\babelprovide|), but a higher interface, based on package options, in
-under study. In other words, |\babelprovide| is mainly meant
-for auxiliary tasks.
+following section shows how to make use of them by means of
+|\babelprovide|. In other words, |\babelprovide| is mainly meant
+for auxiliary tasks, and as alternative when the |ldf|, for some
+reason, does work as expected.
\begin{example}
Although Georgian has its own \texttt{ldf} file, here is how to
@@ -1257,9 +1336,9 @@ for auxiliary tasks.
\documentclass{book}
\usepackage{babel}
-\babelprovide[import, main]{georgian}
+_\babelprovide[import, main]{georgian}_
-\babelfont{rm}{DejaVu Sans}
+\babelfont{rm}[Renderer=Harfbuzz]{DejaVu Sans}
\begin{document}
@@ -1274,36 +1353,74 @@ for auxiliary tasks.
\endgroup
\end{example}
+\New{3.49} Alternatively, you can tell babel to load all or some
+languages passed as options with |\babelprovide| and not from the |ldf|
+file in a few few typical cases. Thus, |provide=*| means ‘load the main
+language with the |\babelprovide| mechanism instead of the |ldf| file’
+applying the basic features, which in this case means |import,| |main|.
+There are (currently) three options:
+\begin{itemize}
+\item |provide=*| is the option just explained, for the main language;
+\item |provide+=*| is the same for additional languages (the main
+ language is still the |ldf| file);
+\item |provide*=*| is the same for all languages, ie, main and
+ additional.
+\end{itemize}
+
+\begin{example}
+ The preamble in the previous example can be more compactly written
+ as:
+\begin{verbatim}
+\documentclass{book}
+\usepackage[_georgian, provide=*_]{babel}
+\babelfont{rm}[Renderer=Harfbuzz]{DejaVu Sans}
+\end{verbatim}
+Or also:
+\begin{verbatim}
+\documentclass[_georgian_]{book}
+\usepackage[_provide=*_]{babel}
+\babelfont{rm}[Renderer=Harfbuzz]{DejaVu Sans}
+\end{verbatim}
+\end{example}
+
\begin{note}
The \texttt{ini} files just define and set some parameters, but the
- corresponding behavior is not always implemented. Also, there are
- some limitations in the engines. A few remarks follows:
+ corresponding behavior is not always implemented. Also, there are
+ some limitations in the engines. A few remarks follow (which could no
+ longer be valid when you read this manual, if the packages involved
+ han been updated). The Harfbuzz renderer has still some issues, so as
+ a rule of thumb prefer the default renderer, and resort to Harfbuzz
+ only if the former does not work for you. Fortunately, fonts can be
+ loaded twice with different renderers; for example:
+\begin{verbatim}
+\babelfont[spanish]{rm}{FreeSerif}
+\babelfont[hindi]{rm}[Renderer=Harfbuzz]{FreeSerif}
+\end{verbatim}
\begin{description}
\itemsep=-\parskip
\item[Arabic] Monolingual documents mostly work in \luatex, but it must
- be fine tuned, and a recent version of
- \textsf{fontspec}/\textsf{loaotfload} is required. In \xetex{}
+ be fine tuned, particularly graphical elements like |picture|. In \xetex{}
\babel{} resorts to the \textsf{bidi} package, which seems to work.
-\item[Hebrew] Niqqud marks seem to work in both engines, but
- cantillation marks are misplaced (\xetex{} seems better, but still
- problematic).
-\item[Devanagari] In \luatex{} many fonts work, but some others do
- not, the main issue being the ‘ra’. It is advisable to set explicitly
- the script to either |deva| or |dev2|, eg:
+\item[Hebrew] Niqqud marks seem to work in both engines, but depending
+ on the font cantillation marks might be misplaced (\xetex{} or
+ \luatex{} with Harfbuzz seems better, but still problematic).
+\item[Devanagari] In \luatex{} and the the default renderer many fonts
+work, but some others do not, the main issue being the ‘ra’. You may
+need to set explicitly the script to either |deva| or |dev2|, eg:
\begin{verbatim}
\newfontscript{Devanagari}{deva}
\end{verbatim}
- Other Indic scripts are still under development in \luatex{}. On the
- other hand, \xetex{} is better. The upcoming \textsf{lualatex} will
- be based on \textsf{luahbtex}, so Indic scripts will be rendered
- correctly with the option |Renderer=Harfbuzz| in \textsc{fontspec}.
+ Other Indic scripts are still under development in the default
+ \luatex{} renderer, but should work with |Renderer=Harfbuzz|. They
+ also work with \xetex{}, although unlike with \luatex{} fine tuning
+ the font behavior is not always possible.
\item[Southeast scripts] Thai works in both \luatex{} and \xetex{}, but
line breaking differs (rules can be modified in \luatex; they are
hard-coded in \xetex). Lao seems to work, too, but there are no
patterns for the latter in \luatex{}. Khemer clusters are rendered
- wrongly. The comment about Indic scripts and \textsf{lualatex} also
- applies here. Some quick patterns could help, with something similar
- to:
+ wrongly with the default renderer. The comment about Indic scripts
+ and \textsf{lualatex} also applies here. Some quick patterns can
+ help, with something similar to:
\begingroup
\setmonofont[Script=Lao,Scale=MatchLowercase]{DejaVu Sans Mono}
\begin{verbatim}
@@ -1312,18 +1429,24 @@ for auxiliary tasks.
\end{verbatim}
\endgroup
\item[East Asia scripts] Settings for either Simplified of Traditional
-should work out of the box. \luatex{} does basic line breaking, but
-currently \xetex{} does not (you may load \textsf{zhspacing}). Although
-for a few words and shorts texts the |ini| files should be fine, CJK
-texts are best set with a dedicated framework (\textsf{CJK},
-\textsf{luatexja}, \textsf{kotex}, \textsf{CTeX}, etc.). This is what
-the class |ltjbook| does with \luatex, which can be used in conjunction
-with the |ldf| for |japanese|, because the following piece of code
-loads \textsf{luatexja}:
+ should work out of the box, with basic line breaking with any
+ renderer. Although for a few words and shorts texts the |ini| files
+ should be fine, CJK texts are best set with a dedicated framework
+ (\textsf{CJK}, \textsf{luatexja}, \textsf{kotex}, \textsf{CTeX},
+ etc.). This is what the class |ltjbook| does with \luatex, which can
+ be used in conjunction with the |ldf| for |japanese|, because the
+ following piece of code loads \textsf{luatexja}:
\begin{verbatim}
-\documentclass{ltjbook}
-\usepackage[japanese]{babel}
+\documentclass[japanese]{ltjbook}
+\usepackage{babel}
\end{verbatim}
+\item[Latin, Greek, Cyrillic] Combining chars with the default
+ \luatex{} font renderer might be wrong; on then other hand, with the
+ Harfbuzz renderer diacritics are stacked correctly, but many
+ hyphenations points are discarded (this bug seems related to kerning,
+ so it depends on the font). With \xetex{} both combining characters
+ and hyphenation work as expected (not quite, but in most cases it
+ works; the problem here are font clusters).
\end{description}
\end{note}
@@ -1403,6 +1526,7 @@ captions):
\tag{ebu} Embu
\tag{ee} Ewe
\tag{el} Greek\hascapu\hascapl
+\tag{el-polyton} Polytonic Greek\hascapu\hascapl
\tag{en-AU} English\hascapu\hascapl
\tag{en-CA} English\hascapu\hascapl
\tag{en-GB} English\hascapu\hascapl
@@ -1430,6 +1554,7 @@ captions):
\tag{ga} Irish\hascapu\hascapl
\tag{gd} Scottish Gaelic\hascapu\hascapl
\tag{gl} Galician\hascapu\hascapl
+\tag{grc} Ancient Greek\hascapu\hascapl
\tag{gsw} Swiss German
\tag{gu} Gujarati
\tag{guz} Gusii
@@ -1631,6 +1756,7 @@ akan\\
albanian\\
american\\
amharic\\
+ancientgreek\\
arabic\\
arabic-algeria\\
arabic-DZ\\
@@ -1840,6 +1966,7 @@ pashto\\
persian\\
piedmontese\\
polish\\
+polytonicgreek\\
portuguese-br\\
portuguese-brazil\\
portuguese-portugal\\
@@ -1992,13 +2119,17 @@ also the package \textsf{combofont} for a complementary approach.}
\Describe\babelfont{\oarg{language-list}\marg{font-family}%
\oarg{font-options}\marg{font-name}}
-The main purpose of |\babelfont| is to define at once in a
-multilingual document the fonts required by the different languages,
-with their corresponding language systems (script and language). So, if
-you load, say, 4 languages, |\babelfont{rm}{FreeSerif}| defines 4 fonts
-(with their variants, of course), which are switched with the language
-by \babel. It is a tool to make things easier and transparent to the
-user.
+\begin{note}
+ See the note in the previous section about some issues in
+ specific languages.
+\end{note}
+
+The main purpose of |\babelfont| is to define at once in a multilingual
+document the fonts required by the different languages, with their
+corresponding language systems (script and language). So, if you load,
+say, 4 languages, |\babelfont{rm}{FreeSerif}| defines 4 fonts (with
+their variants, of course), which are switched with the language by
+\babel. It is a tool to make things easier and transparent to the user.
Here \textit{font-family} is |rm|, |sf| or |tt| (or newly defined
ones, as explained below), and \textit{font-name} is the same as in
@@ -2053,7 +2184,7 @@ Svenska \foreignlanguage{hebrew}{@2עִבְרִית@0} svenska.
\end{verbatim}
\endgroup
-If on the other hand you have to resort to different fonts, you could
+If on the other hand you have to resort to different fonts, you can
replace the red line above with, say:
\setengine{luatex/xetex}
\begin{verbatim}
@@ -2107,8 +2238,8 @@ to select fonts in addition to the three basic families.
command, neither the script nor the language is passed. You must
add them by hand. This is by design, for several reasons —for
example, each font has its own set of features and a generic setting
- for several of them could be problematic, and also a “lower-level”
- font selection is useful.
+ for several of them can be problematic, and also preserving a
+ “lower-level” font selection is useful.
\end{note}
\begin{note}
@@ -2134,7 +2265,7 @@ to select fonts in addition to the three basic families.
font 'FONT' with script 'SCRIPT' 'Default' language used instead'}.
\textbf{This is \textit{not} and error.} This warning is shown by
- \textsf{fontspec}, not by \babel. It could be irrelevant for English,
+ \textsf{fontspec}, not by \babel. It can be irrelevant for English,
but not for many other languages, including Urdu and Turkish. This is
a useful and harmless warning, and if everything is fine with your
document the best thing you can do is just to ignore it altogether.
@@ -2164,33 +2295,57 @@ to select fonts in addition to the three basic families.
\subsection{Modifying a language}
-Modifying the behavior of a language (say, the chapter “caption”), is
-sometimes necessary, but not always trivial.
-\begin{itemize}
-\item The old way, still valid for many languages, to redefine a
- caption is the following:
+Modifying the behavior of a language (say, the chapter
+“caption”), is sometimes necessary, but not always trivial. In the case
+of caption names a specific macro is provided, because this is perhaps
+the most frequent change:
+
+\Describe{\setlocalecaption}{%
+ \marg{language-name}\marg{caption-name}\marg{string}}
+
+\New{3.51} Here \textit{caption-name} is the name as string without the
+trailing |name|. An example, which also shows caption names are often a
+stylistic choice, is:
+\begin{verbatim}
+\setlocalecaption{english}{contents}{Table of Contents}
+\end{verbatim}
+This works not only with existing caption names, because it also serves to
+define new ones by setting the \textit{caption-name} to the name of
+your choice (|name| will be postpended). Captions so defined or
+redefined behave with the ‘new way’ described in the following note.
+
+\begin{note}
+ There are a few alternative methods:
+ \begin{itemize}
+\item With data |import|’ed from |ini| files, you can modify the values
+ of specific keys, like:
+\begin{verbatim}
+\babelprovide[import, _captions/listtable = Lista de tablas_]{spanish}
+\end{verbatim}
+ (In this particular case, instead of the |captions| group you may need
+ to modify the |captions.licr| one.)
+
+\item The ‘old way’, still valid for many languages, to redefine a
+ caption is the following:
\begin{verbatim}
\addto\captionsenglish{%
\renewcommand\contentsname{Foo}%
}
\end{verbatim}
-As of 3.15, there is no need to hide spaces with \texttt{\%%
-} (\babel{} removes them), but it is advisable to do so.
-\item The new way, which is found in |bulgarian|, |azerbaijani|,
- |spanish|, |french|, |turkish|, |icelandic|, |vietnamese| and a few
- more, as well as in languages created with |\babelprovide| and its
- key |import|, is:
+ As of 3.15, there is no need to hide spaces with \texttt{\%%
+ } (\babel{} removes them), but it is advisable to do so. This
+ redefinition is not activated until the language is selected.
+
+\item The ‘new way’, which is found in |bulgarian|, |azerbaijani|,
+ |spanish|, |french|, |turkish|, |icelandic|, |vietnamese| and a few
+ more, as well as in languages created with |\babelprovide| and its
+ key |import|, is:
\begin{verbatim}
\renewcommand\spanishchaptername{Foo}
\end{verbatim}
-\item Macros to be run when a language is selected can be add to
- |\extras|\m{lang}:
-\begin{verbatim}
-\addto\extrasrussian{\mymacro}
-\end{verbatim}
-There is a counterpart for code to be run when a language is
-unselected: |\noextras|\m{lang}.
+This redefinition is immediate.
\end{itemize}
+\end{note}
\begin{note} Do \textit{not} redefine a caption in the following way:
\begin{verbatim}
@@ -2200,6 +2355,14 @@ The changes may be discarded with a language selector, and the original
value restored.
\end{note}
+Macros to be run when a language is selected can be add to
+ |\extras|\m{lang}:
+\begin{verbatim}
+\addto\extrasrussian{\mymacro}
+\end{verbatim}
+There is a counterpart for code to be run when a language is
+unselected: |\noextras|\m{lang}.
+
\begin{note}
These macros (|\captions|\m{lang}, |\extras|\m{lang}) may be
redefined, but \textit{must not} be used as such -- they just pass
@@ -2211,11 +2374,13 @@ is by means of |\babelprovide|, described below in depth. So,
something like:
\begin{verbatim}
\usepackage[danish]{babel}
-\babelprovide[captions=da,hyphenrules=nohyphenation]{danish}
+\babelprovide[captions=da, hyphenrules=nohyphenation]{danish}
\end{verbatim}
first loads |danish.ldf|, and then redefines the captions for
\texttt{danish} (as provided by the |ini| file) and prevents
hyphenation. The rest of the language definitions are not touched.
+Without the optional argument it just loads some aditional tools if
+provided by the |ini| file, like extra counters.
\subsection{Creating a language}
@@ -2243,21 +2408,24 @@ Conveniently, some options allow to fill the language, and \babel{}
warns you about what to do if there is a missing string. Very likely
you will find alerts like that in the |log| file:
\begin{verbatim}
-Package babel Warning: \mylangchaptername not set. Please, define
-(babel) it in the preamble with something like:
-(babel) \renewcommand\maylangchaptername{..}
+Package babel Warning: \mylangchaptername not set. Please, define it
+(babel) after the language has been loaded (typically
+(babel) in the preamble) with the help of
+(babel) \setlocalecaption. An example is:
+(babel) \setlocalecaption{mylang}{chapter}{..}
(babel) Reported on input line 18.
\end{verbatim}
-In most cases, you will only need to define a few macros.
+In most cases, you will only need to define a few macros. Note
+languages loaded on the fly are not yet available in the preamble.
\begin{example}
If you need a language named |arhinish|:
\begin{verbatim}
\usepackage[danish]{babel}
\babelprovide{arhinish}
-\renewcommand\arhinishchaptername{Chapitula}
-\renewcommand\arhinishrefname{Refirenke}
+\setlocalecaption{arhinish}{chapter}{Chapitula}
+\setlocalecaption{arhinish}{refname}{Refirenke}
\renewcommand\arhinishhyphenmins{22}
\end{verbatim}
\end{example}
@@ -2281,8 +2449,8 @@ If the language has been loaded as an argument in |\documentclass| or
|\usepackage|, then |\babelprovide| redefines the requested data.
\Describe{import=}{\meta{language-tag}}
-\New{3.13} Imports data from an |ini| file, including captions, date,
-and hyphenmins. For example:
+\New{3.13} Imports data from an |ini| file, including captions and date
+(also line breaking rules in newly defined languages). For example:
\begin{verbatim}
\babelprovide[_import=hu_]{hungarian}
\end{verbatim}
@@ -2292,22 +2460,24 @@ LICR (ie, with macros like |\'| or |\ss|) ones.
\New{3.23} It may be used without a value. In such a case, the |ini|
file set in the corresponding |babel-<language>.tex| (where
|<language>| is the last argument in |\babelprovide|) is imported. See
-the list of recognized languages above. So, the previous example could
+the list of recognized languages above. So, the previous example can
be written:
\begin{verbatim}
\babelprovide[_import_]{hungarian}
\end{verbatim}
-There are about 200 |ini| files, with data taken from the |ldf| files
+There are about 250 |ini| files, with data taken from the |ldf| files
and the CLDR provided by Unicode. Not all languages in the latter are
complete, and therefore neither are the |ini| files. A few languages
-will show a warning about the current lack of suitability of the date
-format (\textsf{french}, \textsf{breton}, and \textsf{occitan}).
+may show a warning about the current lack of suitability of some
+features.
Besides |\today|, this option defines an additional command for dates:
|\<language>date|, which takes three arguments, namely, year, month and
day numbers. In fact, |\today| calls |\<language>today|, which in turn
-calls |\<language>date{\the\year}{\the\month}{\the\day}|.
+calls |\<language>date{\the\year}{\the\month}{\the\day}|. \New{3.44}
+More convenient is usually |\localedate|, with prints the date for the
+current locale.
\Describe{captions=}{\meta{language-tag}}
Loads only the strings. For example:
@@ -2337,8 +2507,25 @@ for example:
In other engines it just suppresses hyphenation (because the pattern
list is empty).
-\Describe{main}{} This valueless option makes the language the main
-one. Only in newly defined languages.
+\Describe{main}{} This valueless option makes the language the main one
+(thus overriding that set when \babel\ is loaded). Only in newly defined
+languages.
+\begin{example}
+ Let's assume your document is mainly in Polytonic Greek, but with some
+ sections in Italian. Then, the first attempt should be:
+\begin{verbatim}
+\usepackage[italian, greek.polutonic]{babel}
+\end{verbatim}
+ But if, say, accents in Greek are not shown correctly, you can try:
+\begin{verbatim}
+\usepackage[italian]{babel}
+\babelprovide[import, main]{polytonicgreek}
+\end{verbatim}
+Remerber there is an alternative syntax for the latter:
+\begin{verbatim}
+\usepackage[italian, polytonicgreek, provide=*]{babel}
+\end{verbatim}
+\end{example}
\Describe{script=}{\meta{script-name}}
\New{3.15} Sets the script name to be used by \textsf{fontspec} (eg,
@@ -2354,6 +2541,11 @@ Overrides the value in the |ini| file. If \textsf{fontspec} does not
define it, then \babel{} sets its tag to that provided by the |ini|
file. Not so important, but sometimes still relevant.
+\Describe{alph=}{\meta{counter-name}} Assigns to |\alph| that counter.
+See the next section.
+
+\Describe{Alph=}{\meta{counter-name}} Same for |\Alph|.
+
\bigskip
A few options (only \luatex) set some properties of the writing system
@@ -2364,22 +2556,21 @@ cases.
\Describe{onchar=}{\texttt{ids} $\string|$ \texttt{fonts}}
\New{3.38} This option is much like an ‘event’ called when a character
-belonging to the script of this locale is found. There are currently
-two ‘actions’, which can be used at the same time (separated by a
-space): with |ids| the |\language| and the |\localeid| are set to the
-values of this locale; with |fonts|, the fonts are changed to those of
-this locale (as set with |\babelfont|). This option is not compatible
-with |mapfont|. Characters can be added with |\babelcharproperty|.
+belonging to the script of this locale is found (as its name implies,
+it acts on characters, not on spaces). There are currently two
+‘actions’, which can be used at the same time (separated by a space):
+with |ids| the |\language| and the |\localeid| are set to the values of
+this locale; with |fonts|, the fonts are changed to those of this
+locale (as set with |\babelfont|). This option is not compatible with
+|mapfont|. Characters can be added or modified with
+|\babelcharproperty|.
-\Describe{mapfont=}{\texttt{direction}}
-Assigns the font for the writing direction of this language (only with
-|bidi=basic|). Whenever possible, instead of this option use |onchar|,
-based on the script, which usually makes more sense. More precisely,
-what |mapfont=direction| means is, ‘when a character has the same
-direction as the script for the “provided” language, then change its
-font to that set for this language’. There are 3 directions, following
-the bidi Unicode algorithm, namely, Arabic-like, Hebrew-like and left
-to right. So, there should be at most 3 directives of this kind.
+\begin{note}
+ An alternative approach with \luatex{} and Harfbuzz is the font
+ option |RawFeature={multiscript=auto}|. It does not switch the
+ \babel{} language and therefore the line breaking rules, but in many
+ cases it can be enough.
+\end{note}
\Describe{intraspace=}{\meta{base} \meta{shrink} \meta{stretch}}
Sets the interword space for the writing system of the language, in em
@@ -2393,6 +2584,16 @@ Sets the interword penalty for the writing system of this language.
Currently used only in Southeast Asian scrips, like Thai. Ignored if 0
(which is the default value).
+\Describe{mapfont=}{\texttt{direction}}
+Assigns the font for the writing direction of this language (only with
+|bidi=basic|). Whenever possible, instead of this option use |onchar|,
+based on the script, which usually makes more sense. More precisely,
+what |mapfont=direction| means is, ‘when a character has the same
+direction as the script for the “provided” language, then change its
+font to that set for this language’. There are 3 directions, following
+the bidi Unicode algorithm, namely, Arabic-like, Hebrew-like and left
+to right. So, there should be at most 3 directives of this kind.
+
\begin{note}
(1) If you need shorthands, you can define them with |\useshorthands|
and |\defineshorthand| as described above. (2) Captions and |\today|
@@ -2469,10 +2670,16 @@ bidi and fonts are processed (ie, to the node list as generated by the
bidirectional behavior (unlike |Numbers=Arabic| in \textsf{fontspec},
which is not recommended).
-\New{4.41} Many `ini` locale files has been extended with information about
-non-positional numerical systems, based on those predefined in CSS.
-They only work with \xetex{} and \luatex{} and are fully expendable (even
-inside an |\edef|). Currently, they are limited to numbers below 10000.
+\begin{note}
+ With \xetex{} you can use the option |Mapping| when defining a
+ font.
+\end{note}
+
+\New{4.41} Many `ini` locale files has been extended with information
+about non-positional numerical systems, based on those predefined in
+CSS. They only work with \xetex{} and \luatex{} and are fully
+expendable (even inside an unprotected |\edef|). Currently, they are
+limited to numbers below 10000.
There are several ways to use them (for the availabe styles in each
language, see the list below):
@@ -2494,15 +2701,23 @@ The styles are:
\itemsep=-\parskip
\item[Ancient Greek] |lower.ancient|, |upper.ancient|
-\item[Arabic] |abjad|, |maghrebi.abjad|
+\item[Amharic] |afar|, |agaw|, |ari|, |blin|, |dizi|, |gedeo|, |gumuz|,
+|hadiyya|, |harari|, |kaffa|, |kebena|, |kembata|, |konso|, |kunama|,
+|meen|, |oromo|, |saho|, |sidama|, |silti|, |tigre|, |wolaita|, |yemsa|
+
+\item[Arabic] |abjad|, |maghrebi.abjad|
\item[Belarusan, Bulgarian, Macedonian, Serbian] |lower|, |upper|
+\item[Bengali] |alphabetic|
+
+\item[Coptic] |epact|,|lower.letters|
+
\item[Hebrew] |letters| (neither geresh nor gershayim yet)
\item[Hindi] |alphabetic|
-\item[Armenian] |lower|, |upper|
+\item[Armenian] |lower.letter|, |upper.letter|
\item[Japanese] |hiragana|, |hiragana.iroha|, |katakana|,
|katakana.iroha|, |circled.katakana|, |informal|, |formal|,
@@ -2520,10 +2735,14 @@ The styles are:
|hanja.formal|, |hangul.formal|, |cjk-earthly-branch|,
|cjk-heavenly-stem|, |fullwidth.lower.alpha|, |fullwidth.upper.alpha|
+\item[Marathi] |alphabetic|
+
\item[Persian] |abjad|, |alphabetic|
\item[Russian] |lower|, |lower.full|, |upper|, |upper.full|
+\item[Syriac] |letters|
+
\item[Tamil] |ancient|
\item[Thai] |alphabetic|
@@ -2534,6 +2753,29 @@ The styles are:
|fullwidth.lower.alpha|, |fullwidth.upper.alpha|
\end{description}
+\New{3.45} In addition, native digits (in languages defining them) may
+be printed with the numeral style |digits|.
+
+\subsection{Dates}
+
+\New{3.45} When the data is taken from an |ìni| file, you may print the
+date corresponding to the Gregorian calendar and other lunisolar systems
+with the following command.
+
+\Describe{\localedate}{\oarg{calendar=.., variant=..}%
+ {\marg{year}\m{month}\m{day}}}
+
+By default the calendar is the Gregorian, but a |ini| files may define
+strings for other calendars (currently |ar|, |ar-|*, |he|, |fa|, |hi|.)
+In the latter case, the three arguments are the year, the month, and
+the day in those in the corresponding calendar. They are \textit{not}
+the Gregorian data to be converted (which means, say, 13 is a valid
+month number with |calendar=hebrew|).
+
+Even with a certain calendar there may be variants. In Kurmanji the
+default variant prints something like \textit{30. Çileya Pêşîn 2019},
+but with |variant=izafa| it prints \textit{31’ê Çileya Pêşînê 2019}.
+
\subsection{Accessing language info}
\Describe{\languagename}{}
@@ -2560,8 +2802,8 @@ respectively.
\Describe{\localeinfo}{\marg{field}}
\New{3.38} If an |ini| file has been loaded for the current language,
-you may access the information stored in it. This macros is fully
-expandable and the available fields are:
+you may access the information stored in it. This macro is fully
+expandable, and the available fields are:
\begin{description}
\itemsep=-\parskip
\item[|name.english|] as provided by the Unicode CLDR.
@@ -2569,17 +2811,26 @@ expandable and the available fields are:
%%% activated because the bug in \languagename is far from trivial.
\item[|tag.ini|] is the tag of the |ini| file (the way this
file is identified in its name).
-\item[|tag.bcp47|] is the BCP 47 language tag.
+\item[|tag.bcp47|] is the full BCP 47 tag (see the warning below).
+\item[|language.tag.bcp47|] is the BCP 47 language tag.
\item[|tag.opentype|] is the tag used by OpenType (usually, but not
always, the same as BCP 47).
-\item[|script.name|] as provided by the Unicode CLDR.
-\item[|script.tag.bcp47|] is the BCP 47 language tag of the script
+\item[|script.name|], as provided by the Unicode CLDR.
+\item[|script.tag.bcp47|] is the BCP 47 tag of the script
used by this locale.
\item[|script.tag.opentype|] is the tag used by OpenType (usually,
but not always, the same as BCP 47).
\end{description}
-\Describe{\getlocaleproperty}{\marg{macro}\marg{locale}\marg{property}}
+\begin{warning}
+ \New{3.46} As of version 3.46 |tag.bcp47| returns the full BCP 47
+ tag. Formerly it returned just the language subtag, which was clearly
+ counterintuitive.
+\end{warning}
+
+\Describe{\getlocaleproperty}{%
+ \colorbox{thegrey}{\ttfamily\hskip-.2em*\hskip-.2em}%
+ \marg{macro}\marg{locale}\marg{property}}
\New{3.42} The value of any locale property as set by the |ini| files
(or added/modified with |\babelprovide|) can be retrieved and stored in
@@ -2590,6 +2841,10 @@ a macro with this command. For example, after:
the macro |\hechap| will contain the string
{\fontspec[Scale=.87,Script=Hebrew]{Liberation Mono}\textdir TRT פרק}.
+If the key does not exist, the macro is set to |\relax| and an error is
+raised. \New{3.47} With the starred version no error is raised, so that
+you can take your own actions with undefined properties.
+
\Babel{} remembers which |ini| files have been loaded. There is a loop
named |\LocaleForEach| to traverse the list, where |#1| is the name of
the current item, so that |\LocaleForEach{\message{ **#1** }}| just
@@ -2602,13 +2857,29 @@ loaded (and therefore the corresponding data) even if these two
conditions are not met, write |\BabelEnsureInfo| in the preamble.
\end{note}
+\Describe{\localeid}{}
+
+Each language in the \babel{} sense has its own unique numeric
+identifier, which can be retrieved with |\localeid|.
+
+\begin{note}
+ The |\localeid| is not the same as the |\language| identifier, which
+ refers to a set of hyphenation patters (which, in turn, is just a
+ component of the line breaking algorithm described in the next
+ section). The data about preloaded patterns are store in an internal
+ macro named |\bbl@languages| (see the code for further details), but
+ note several locales may share a single |\language|, so they are
+ separated concepts. In \luatex, the |\localeid| is saved in each node
+ (where it makes sense) as an attribute, too.
+\end{note}
+
\subsection{Hyphenation and line breaking}
\Babel{} deals with three kinds of line breaking rules: Western,
typically the LGC group, South East Asian, like Thai, and CJK, but
support depends on the engine: \textsf{pdftex} only deals with the
-former, \xetex{} also with the second one, while \luatex{} provides
-basic rules for the latter, too.
+former, \xetex{} also with the second one (although in a limited way),
+while \luatex{} provides basic rules for the latter, too.
\Describe{\babelhyphen}{%
\colorbox{thegrey}{\ttfamily\hskip-.2em*\hskip-.2em}\marg{type}}
@@ -2735,7 +3006,7 @@ of the previous char in \luatex, and the font size set by the last
\Describe{\babelposthyphenation}{\marg{hyphenrules-name}%
\marg{lua-pattern}\marg{replacement}}
-\New{3.37-3.39} With \luatex{} it is now possible to define
+\New{3.37-3.39} \textit{With \luatex{}} it is now possible to define
non-standard hyphenation rules, like |f-f| $\to$ |ff-f|, repeated
hyphens, ranked ruled (or more precisely, ‘penalized’ hyphenation
points), and so on. No rules are currently provided by default, but
@@ -2755,32 +3026,144 @@ example, if the first capture reads |([ΐΰ])|, the replacement could be
\verb+{1|ΐΰ|ίύ}+, which maps \textit{ΐ} to \textit{ί}, and \textit{ΰ}
to \textit{ύ}, so that the diaeresis is removed.
-This feature is activated with the first |\babelposthyphenation|.
+This feature is activated with the first |\babelposthyphenation| or
+|\babelprehyphenation|.
See the \href{https://github.com/latex3/babel/wiki}{\babel\ wiki} for a
-more detailed description and some examples. It also describes an
-additional replacement type with the key |string|.
+more detailed description and some examples. It also describes a few
+additional replacement types (|string|, |penalty|).
+
+Although the main purpose of this command is non-standard hyphenation,
+it may actually be used for other transformations (after hyphenation is
+applied, so you must take discretionaries into account).
+
+You are limited to substitutions as done by \textsf{lua}, although a
+future implementation may alternatively accept \textsf{lpeg}.
+
+\Describe{\babelprehyphenation}{\marg{locale-name}%
+ \marg{lua-pattern}\marg{replacement}}
+
+\New{3.44-3-52} This command is not strictly about hyphenation, but
+it is included here because it is a clear counterpart of
+|\babelposthyphenation|. It is similar to the latter, but (as its name
+implies) applied before hyphenation. There are other differences: (1)
+the first argument is the locale instead the name of hyphenation
+patterns; (2) in the search patterns |=| has no special meaning, while
+\verb+|+ stands for an ordinary space; (3) in the replacement,
+discretionaries are not accepted.
+
+It handles glyphs and spaces (but you can not insert spaces).
+
+Performance is still somewhat poor in some cases, but it is fast in the
+typical ones.
+
+This feature is activated with the first |\babelposthyphenation| or
+|\babelprehyphenation|.
\begin{example}
- Although the main purpose of this command is non-standard
- hyphenation, it may actually be used for other transformations (after
- hyphenation is applied, so you must take discretionaries into
- account). For example, you can use the |string| replacement to
- replace a character (or series of them) by another character (or
- series of them). Thus, to enter \textit{ž} as |zh| and \textit{š} as
- |sh| in a newly created locale for transliterated Russian:
+ You can replace a character (or series of them) by another character
+ (or series of them). Thus, to enter \textit{ž} as |zh| and \textit{š}
+ as |sh| in a newly created locale for transliterated Russian:
\begin{verbatim}
\babelprovide[hyphenrules=+]{russian-latin} % Create locale
-\babelposthyphenation{russian-latin}{([sz])h} % Create rule
+\babelprehyphenation{russian-latin}{([sz])h} % Create rule
{
- { string = {1|sz|šž} },
+ string = {1|sz|šž},
remove
}
\end{verbatim}
- In other words, it is a quite general tool. (A counterpart
- |\babelprehyphenation| is on the way.)
\end{example}
+\begin{example}
+ The following rule prevent the word “a” from being at the
+ end of a line:
+\begin{verbatim}
+\babelprehyphenation{english}{|a|}
+ {}, {}, % Keep first space and a
+ {insert, penalty = 10000}, % Insert penalty
+ {} % Keep last space
+}
+\end{verbatim}
+\end{example}
+
+\subsection{Selection based on BCP 47 tags}
+\label{bcp47}
+
+\New{3.43} The recommended way to select languages is that described at
+the beginning of this document. However, BCP 47 tags are becoming
+customary, particularly in documents (or parts of documents) generated
+by external sources, and therefore \babel{} will provide a set of tools
+to select the locales in different situations, adapted to the
+particular needs of each case. Currently, \babel{} provides autoloading
+of locales as described in this section. In these contexts autoloading
+is particularly important because we may not know on beforehand which
+languages will be requested.
+
+It must be activated explicitly, because it is primarily meant for
+special tasks. Mapping from BCP 47 codes to locale names are not
+hardcoded in \babel. Instead the data is taken from the \texttt{ini}
+files, which means currently about 250 tags are already recognized.
+\Babel{} performs a simple lookup in the following way: |fr-Latn-FR| $\to$
+|fr-Latn| $\to$ |fr-FR| $\to$ |fr|. Languages with the same resolved
+name are considered the same. Case is normalized before, so that
+|fr-latn-fr| $\to$ |fr-Latn-FR|. If a tag and a name overlap, the tag
+takes precedence.
+
+Here is a minimal example:
+\begin{verbatim}
+\documentclass{article}
+
+\usepackage[danish]{babel}
+
+_\babeladjust{_
+_ autoload.bcp47 = on,_
+_ autoload.bcp47.options = import_
+_}_
+
+\begin{document}
+
+Chapter in Danish: \chaptername.
+
+_\selectlanguage{de-AT}_
+
+\localedate{2020}{1}{30}
+
+\end{document}
+\end{verbatim}
+
+Currently the locales loaded are based on the \texttt{ini} files and
+decoupled from the main \texttt{ldf} files. This is by design, to
+ensure code generated externally produces the same result regardless of
+the languages requested in the document, but an option to use the
+\texttt{ldf} instead will be added in a future release, because both
+options make sense depending on the particular needs of each document
+(there will be some restrictions, however).
+
+The behaviour is adjusted with |\babeladjust| with the following parameters:
+\begin{description}
+\item \texttt{autoload.bcp47} with values |on| and |off|.
+\item \texttt{autoload.bcp47.options}, which are passed to
+ |\babelprovide|; empty by default, but you may add \texttt{import}
+ (features defined in the corresponding |babel-...tex| file might not
+ be available).
+\item \texttt{autoload.bcp47.prefix}. Although the public name used in
+ selectors is the tag, the internal name will be different and
+ generated by prepending a prefix, which by default is
+ \texttt{bcp47-}. You may change it with this key.
+\end{description}
+
+\New{3.46} If an |ldf| file has been loaded, you can enable the
+corresponding language tags as selector names with:
+\begin{verbatim}
+\babeladjust{ bcp47.toname = on }
+\end{verbatim}
+(You can deactivate it with |off|.) So, if |dutch| is one of the
+package (or class) options, you can write |\selectlanguage{nl}|. Note
+the language name does not change (in this example is still |dutch|),
+but you can get it with |\localeinfo| or |\getlanguageproperty|. It
+must be turned on explicitly for similar reasons to those explained
+above.
+
\subsection{Selecting scripts}
Currently \babel{} provides no standard interface to select
@@ -2832,7 +3215,7 @@ to ensure most of the ASCII letters and symbols are the right ones.
No macros to select the writing direction are provided, either --
writing direction is intrinsic to each script and therefore it is best
-set by the language (which could be a dummy one). Furthermore, there
+set by the language (which can be a dummy one). Furthermore, there
are in fact two right-to-left modes, depending on the language, which
differ in the way `weak' numeric characters are ordered (eg, Arabic
\%123 \textit{vs} Hebrew 123\%).
@@ -2840,7 +3223,7 @@ differ in the way `weak' numeric characters are ordered (eg, Arabic
\begin{warning}
The current code for \textbf{text} in \luatex{} should be considered
essentially stable, but, of course, it is not bug-free and there
- could be improvements in the future, because setting bidi text has
+ can be improvements in the future, because setting bidi text has
many subtleties (see for example <https://www.w3.org/TR/html-bidi/>).
A basic stable version for other engines must wait. This applies to
text; there is a basic support for \textbf{graphical} elements,
@@ -3013,7 +3396,7 @@ required by all engines.
counters in general, as well as in \luatex{} with |bidi=default|;
required in \luatex{} for numeric footnote marks $>$9 with
|bidi=basic-r| (but \textit{not} with |bidi=basic|); note, however,
- it could depend on the counter format.
+ it can depend on the counter format.
With |counters|, |\arabic| is not only considered L text always (with
|\babelsublr|, see below), but also an ``isolated'' block which does
@@ -3053,18 +3436,19 @@ bidirectional (with both R and L paragraphs) documents in \luatex{}.
required in \xetex{} and \pdftex{} in some styles (support for the
latter two engines is still experimental) \New{3.18}.
-\item[tabular] required in \luatex{} for R |tabular| (it has been
- tested only with simple tables, so expect some readjustments in the
- future); ignored in \pdftex{} or \xetex{} (which will not support a
- similar option in the short term). It patches an internal command, so
- it might be ignored by some packages and classes (or even raise an
- error). \New{3.18}.
+\item[tabular] required in \luatex{} for R |tabular|, so that the first
+ column is the right one (it has been tested only with simple tables,
+ so expect some readjustments in the future); ignored in \pdftex{} or
+ \xetex{} (which will not support a similar option in the short term).
+ It patches an internal command, so it might be ignored by some
+ packages and classes (or even raise an error). \New{3.18}.
\item[graphics] modifies the |picture| environment so that the whole
- figure is L but the text is R. It \textit{does not} work with the
- standard |picture|, and \textit{pict2e} is required if you want
- sloped lines. It attempts to do the same for \textsf{pgf/tikz}.
- Somewhat experimental. \New{3.32}.
+figure is L but the text is R. It \textit{does not} work with the
+standard |picture|, and \textit{pict2e} is required if you want sloped
+lines \textbf{(With recent versions of \LaTeX, this feature has
+stopped working)}. It attempts to do the same for \textsf{pgf/tikz}.
+Somewhat experimental. \New{3.32}.
\item[extras] is used for miscellaneous readjustments which do not fit into
the previous groups. Currently redefines in \luatex{} |\underline| and
@@ -3106,7 +3490,7 @@ RTL A \foreignlanguage{english}{ltr text \thechapter{} and still ltr} RTL B
\Describe{\BabelPatchSection}{\marg{section-name}}
-Mainly for bidi text, but it could be useful in other cases.
+Mainly for bidi text, but it can be useful in other cases.
|\BabelPatchSection| and the corresponding option |layout=sectioning|
takes a more logical approach (at least in many cases) because it
applies the global language to the section format (including the
@@ -3256,8 +3640,8 @@ ones, they only have a single hook and replace a default definition.
\itemsep=-\parskip
\item[everylanguage] (language) Executed before every language patterns
are loaded.
-\item[loadkernel] (file) By default loads |switch.def|. It can be used
- to load a different version of this file or to load nothing.
+\item[loadkernel] (file) By default just defines a few basic commands.
+ It can be used to define different versions of them or to load a file.
\item[loadpatterns] (patterns file) Loads the patterns file. Used by
\file{luababel.def}.
\item[loadexceptions] (exceptions file) Loads the exceptions
@@ -3301,17 +3685,19 @@ the current options may be different. It does not include |ini| files.
\item[Greek] greek, polutonikogreek
\item[Hebrew] hebrew
\item[Icelandic] icelandic
-\item[Indonesian] bahasa, indonesian, indon, bahasai
+\item[Indonesian] indonesian (bahasa, indon, bahasai)
\item[Interlingua] interlingua
\item[Irish Gaelic] irish
\item[Italian] italian
\item[Latin] latin
\item[Lower Sorbian] lowersorbian
-\item[Malay] bahasam, malay, melayu
+\item[Malay] malay, melayu (bahasam)
\item[North Sami] samin
\item[Norwegian] norsk, nynorsk
\item[Polish] polish
-\item[Portuguese] portuges, portuguese, brazilian, brazil
+\item[Portuguese] portuguese, brazilian (portuges, brazil)\footnote{The
+two last name comes from the times when they had to be shortened to 8
+characters}
\item[Romanian] romanian
\item[Russian] russian
\item[Scottish Gaelic] scottish
@@ -3400,7 +3786,7 @@ deactivate other related options (like paragraph direction with
\item If you use the document class \cls{book} \emph{and} you use
|\ref| inside the argument of |\chapter| (or just use |\ref| inside
|\MakeUppercase|), \LaTeX\ will keep complaining about an undefined
- label. To prevent such problems, you could revert to using
+ label. To prevent such problems, you can revert to using
uppercase labels, you can use |\lowercase{\ref{foo}}| inside the
argument of |\chapter|, or, if you will not use shorthands in
labels, set the |safe| option to |none| or |bib|.
@@ -3427,7 +3813,6 @@ deactivate other related options (like paragraph direction with
\addto\extrasfrench{\inputencoding{latin1}}
\addto\extrasrussian{\inputencoding{koi8-r}}
\end{verbatim}
- (A recent version of \textsf{inputenc} is required.)
\item For the hyphenation to work correctly, lccodes cannot change,
because \TeX{} only takes into account the values when the
paragraph is hyphenated, i.e., when it has been
@@ -3516,28 +3901,24 @@ for a small example (|xe-bidi|).
See the code section for |\foreignlanguage*| (a new starred
version of |\foreignlanguage|).
+For old an deprecated functions, see the wiki.
+
\medskip
-\textbf{Old and deprecated stuff}
+\textbf{Options for locales loaded on the fly}
-A couple of tentative macros were provided by \babel{} ($\ge$3.9g) with
-a partial solution for ``Unicode'' fonts. These macros are now
-deprecated --- use |\babelfont|. A short description follows, for
-reference:
-\begin{itemize}
-\item |\babelFSstore|\marg{babel-language} sets the current three
- basic families (rm, sf, tt) as the default for the language
- given.
-\item |\babelFSdefault|\marg{babel-language}\marg{fontspec-features}
- patches |\fontspec| so that the given features are always passed as
- the optional argument or added to it (not an ideal solution).
-\end{itemize}
-So, for example:
-\begin{verbatim}
-\setmainfont[Language=Turkish]{Minion Pro}
-\babelFSstore{turkish}
-\setmainfont{Minion Pro}
-\babelFSfeatures{turkish}{Language=Turkish}
-\end{verbatim}
+\New{3.51} |\babeladjust{ autoload.options = ... }| sets the options
+when a language is loaded on the fly (by default, no options). A
+typical value would be |import|, which defines captions, date,
+numerals, etc., but ignores the code in the |tex| file (for example,
+extended numerals in Greek).
+
+\medskip
+\textbf{Labels}
+
+\New{3.48} There is some work in progress for \babel{} to deal with
+labels, both with the relation to captions (chapters, part), and how
+counters are used to define them. It is still somewhat tentative
+because it is far from trivial -- see the wiki for further details.
\section{Loading languages with \file{language.dat}}
@@ -3601,7 +3982,7 @@ german hyphen.ger
With the previous settings, if the encoding when the language is
selected is |T1| then the patterns in \file{hyphenT1.ger} are
used, but otherwise use those in \file{hyphen.ger} (note the encoding
-could be set in |\extras|\m{lang}).
+can be set in |\extras|\m{lang}).
A typical error when using \babel{} is the following:
\begin{verbatim}
@@ -3694,10 +4075,17 @@ recommended.
\subsection{Guidelines for contributed languages}
\label{contribute}
-Now language files are “outsourced” and are located in a separate
-directory (\texttt{/macros/latex/contrib/babel-contrib}), so that they
-are contributed directly to CTAN (please, do not send to me language
-styles just to upload them to CTAN).
+Currently, the easiest way to contribute a new language is by taking
+one the the 500 or so |ini| templates available on GitHub as a basis.
+Just make a pull request o dowonload it and then, after filling the
+fields, sent it to me. Fell free to ask for help or to make feature
+requests.
+
+As to \texttt{ldf} files, now language files are “outsourced” and are
+located in a separate directory
+(\texttt{/macros/latex/contrib/babel-contrib}), so that they are
+contributed directly to CTAN (please, do not send to me language styles
+just to upload them to CTAN).
Of course, placing your style files in this directory is not mandatory,
but if you want to do it, here are a few guidelines.
@@ -3719,8 +4107,9 @@ but if you want to do it, here are a few guidelines.
own directory.
\end{itemize}
-The following page provides a starting point:
-\texttt{http://www.texnia.com/incubator.html}.
+The following page provides a starting point for \texttt{ldf} files:
+\texttt{http://www.texnia.com/incubator.html}. See also
+\texttt{https://github.com/latex3/babel/wiki/List-of-locale-templates}.
If you need further assistance and technical advice in the
development of language styles, I am willing to help you. And of
@@ -3734,10 +4123,9 @@ known. The first two are related to hyphenation patterns.
\DescribeMacro{\addlanguage}
The macro |\addlanguage| is a non-outer version of the macro
-|\newlanguage|, defined in \file{plain.tex} version~3.x. For older
-versions of \file{plain.tex} and \file{lplain.tex} a substitute
-definition is used. Here ``language'' is used in the \TeX{} sense of
-set of hyphenation patterns.
+|\newlanguage|, defined in \file{plain.tex} version~3.x. Here
+``language'' is used in the \TeX{} sense of set of hyphenation
+patterns.
\DescribeMacro{\adddialect}
The macro |\adddialect| can be used when two languages can (or
@@ -3762,11 +4150,11 @@ two parameters. For example:
\DescribeMacro{\providehyphenmins}
The macro |\providehyphenmins| should be used in the language
-definition files to set |\lefthyphenmin| and
-|\righthyphenmin|. This macro will check whether these parameters
-were provided by the hyphenation file before it takes any action.
-If these values have been already set, this command is ignored
-(currently, default pattern files do \textit{not} set them).
+definition files to set |\lefthyphenmin| and |\righthyphenmin|. This
+macro will check whether these parameters were provided by the
+hyphenation file before it takes any action. If these values have been
+already set, this command is ignored (currently, default pattern files
+do \textit{not} set them).
\DescribeMacro{\captions\langvar}
The macro |\captions|\langvar\ defines the macros that
@@ -3980,7 +4368,7 @@ instance, be used in adding instructions to a macro like
|\extrasenglish|.
Be careful when using this macro, because depending on the case the
-assignment could be either global (usually) or local (sometimes). That
+assignment can be either global (usually) or local (sometimes). That
does not seem very consistent, but this behavior is preserved for
backward compatibility. If you are using \pkg{etoolbox}, by Philipp
Lehman, consider using the tools provided by this package instead of
@@ -4208,7 +4596,7 @@ optional one. This command, unlike |\SetString|, is executed always
(even without |strings|), and it is intended for minor readjustments
only.
-For example, as |T1| is the default case mapping in \LaTeX, we could
+For example, as |T1| is the default case mapping in \LaTeX, we can
set for Turkish:
\begin{verbatim}
\StartBabelCommands{turkish}{}[ot1enc, fontenc=OT1]
@@ -4292,7 +4680,7 @@ corresponding place. A selective list follows:
selected.
\item |'| (with |activeacute|) had the original value when writing to an
- auxiliary file, and things like an infinite loop could happen. It
+ auxiliary file, and things like an infinite loop can happen. It
worked incorrectly with |^| (if activated) and also if deactivated.
\item Active chars where not reset at the end of language options, and
@@ -4377,6 +4765,8 @@ help from Bernd Raichle, for which I am grateful.
%
% \part{Source code}
%
+% \small
+%
% \babel{} is being developed incrementally, which means parts of the
% code are under development and therefore incomplete. Only documented
% features are considered complete. In other words, use \babel{} only
@@ -4386,22 +4776,24 @@ help from Bernd Raichle, for which I am grateful.
%
% \section{Identification and loading of required files}
%
-% \textit{Code documentation is still under revision.}
-%
-% The \babel{} package after unpacking consists of the following files:
-% \begin{description}
-% \itemsep=-\parskip
-% \item[switch.def] defines macros to set and switch languages.
-% \item[babel.def] defines the rest of macros. It has tow parts: a
-% generic one and a second one only for LaTeX{}.
-% \item[babel.sty] is the \LaTeX{} package, which set options and
-% load language styles.
-% \item[plain.def] defines some \LaTeX{} macros required by
-% \file{babel.def} and provides a few tools for Plain.
-% \item[hyphen.cfg] is the file to be used when generating the
-% formats to load hyphenation patterns. By default it also loads
-% \file{switch.def}.
-% \end{description}
+% \textit{Code documentation is still under revision.}
+%
+% \textbf{The following description is no longer valid, because switch
+% and plain have been merged into babel.def.}
+%
+% The \babel{} package after unpacking consists of the following files:
+% \begin{description}
+% \itemsep=-\parskip
+% \item[switch.def] defines macros to set and switch languages.
+% \item[babel.def] defines the rest of macros. It has tow parts: a
+% generic one and a second one only for LaTeX{}.
+% \item[babel.sty] is the \LaTeX{} package, which set options and
+% load language styles.
+% \item[plain.def] defines some \LaTeX{} macros required by
+% \file{babel.def} and provides a few tools for Plain.
+% \item[hyphen.cfg] is the file to be used when generating the
+% formats to load hyphenation patterns.
+% \end{description}
%
% The \babel{} installer extends \textsf{docstrip} with a few
% ``pseudo-guards'' to set ``variables'' used at installation time.
@@ -4448,16 +4840,19 @@ help from Bernd Raichle, for which I am grateful.
%
% Keys may be further qualified in a particular language with a suffix
% starting with a uppercase letter. It can be just a letter (eg,
-% babel.name.A, babel.name.B) or a name (eg, date.long.Nominative,
-% date.long.Formal, but no language is currently using the latter).
-% Multi-letter qualifiers are forward compatible in the sense they
-% won’t conflict with new ``global'' keys (all lowercase).
+% |babel.name.A|, |babel.name.B|) or a name (eg,
+% |date.long.Nominative|, |date.long.Formal|, but no language is
+% currently using the latter). \textit{Multi-letter} qualifiers are
+% forward compatible in the sense they won’t conflict with new
+% ``global'' keys (which start always with a lowercase case). There is
+% an exception, however: the section |counters| has been devised to
+% have arbitrary keys, so you can add lowercased keys if you want.
%
% \section{Tools}
%
% \begin{macrocode}
-%<<version=3.42>>
-%<<date=2020/03/22>>
+%<<version=3.53>>
+%<<date=2021/01/26>>
% \end{macrocode}
%
% \textbf{Do not use the following macros in \texttt{ldf} files. They
@@ -4465,13 +4860,13 @@ help from Bernd Raichle, for which I am grateful.
% added for replacing, trimming and looping. The older ones, like
% |\bbl@afterfi|, will not change.
%
-% We define some basic macros which just make the code cleaner.
-% |\bbl@add| is now used internally instead of |\addto| because of
-% the unpredictable behavior of the latter. Used in
-% \file{babel.def} and in \file{babel.sty}, which means in \LaTeX{}
-% is executed twice, but we need them when defining options and
-% \file{babel.def} cannot be load until options have been defined.
-% This does not hurt, but should be fixed somehow.
+% We define some basic macros which just make the code cleaner.
+% |\bbl@add| is now used internally instead of |\addto| because of
+% the unpredictable behavior of the latter. Used in
+% \file{babel.def} and in \file{babel.sty}, which means in \LaTeX{}
+% is executed twice, but we need them when defining options and
+% \file{babel.def} cannot be load until options have been defined.
+% This does not hurt, but should be fixed somehow.
%
% \begin{macrocode}
%<<*Basic macros>>
@@ -4607,12 +5002,15 @@ help from Bernd Raichle, for which I am grateful.
%
% \begin{macro}{\bbl@ifblank}
% A tool from \textsf{url}, by Donald Arseneau, which tests if a
-% string is empty or space.
+% string is empty or space. The companion macros tests if a macro is
+% defined with some `real' value, ie, not |\relax| and not empty,
%
% \begin{macrocode}
\def\bbl@ifblank#1{%
\bbl@ifblank@i#1\@nil\@nil\@secondoftwo\@firstoftwo\@nil}
\long\def\bbl@ifblank@i#1#2\@nil#3#4#5\@nil{#4}
+\def\bbl@ifset#1#2#3{%
+ \bbl@ifunset{#1}{#3}{\bbl@exp{\\\bbl@ifblank{#1}}{#3}{#2}}}
% \end{macrocode}
% \end{macro}
%
@@ -4739,6 +5137,38 @@ help from Bernd Raichle, for which I am grateful.
\else
\@ne
\fi
+% \end{macrocode}
+%
+% A somewhat hackish tool (hence its name) to avoid spurious spaces in
+% some contexts.
+%
+% \begin{macrocode}
+\def\bbl@bsphack{%
+ \ifhmode
+ \hskip\z@skip
+ \def\bbl@esphack{\loop\ifdim\lastskip>\z@\unskip\repeat\unskip}%
+ \else
+ \let\bbl@esphack\@empty
+ \fi}
+% \end{macrocode}
+%
+% Another hackish tool, to apply case changes inside a protected
+% macros. It's based on the internal |\let|'s made by |\MakeUppercase|
+% and |\MakeLowercase| between things like |\oe| and |\OE|.
+%
+% \begin{macrocode}
+\def\bbl@cased{%
+ \ifx\oe\OE
+ \expandafter\in@\expandafter
+ {\expandafter\OE\expandafter}\expandafter{\oe}%
+ \ifin@
+ \bbl@afterelse\expandafter\MakeUppercase
+ \else
+ \bbl@afterfi\expandafter\MakeLowercase
+ \fi
+ \else
+ \expandafter\@firstofone
+ \fi}
%<</Basic macros>>
% \end{macrocode}
%
@@ -4756,39 +5186,16 @@ help from Bernd Raichle, for which I am grateful.
%<</Make sure ProvidesFile is defined>>
% \end{macrocode}
%
-% The following code is used in \file{babel.sty} and
-% \file{babel.def}, and loads (only once) the data in |language.dat|.
-%
-% \begin{macrocode}
-%<<*Load patterns in luatex>>
-\ifx\directlua\@undefined\else
- \ifx\bbl@luapatterns\@undefined
- \input luababel.def
- \fi
-\fi
-%<</Load patterns in luatex>>
-% \end{macrocode}
-%
-% The following code is used in \file{babel.def} and
-% \file{switch.def}.
-%
-% \begin{macrocode}
-%<<*Load macros for plain if not LaTeX>>
-\ifx\AtBeginDocument\@undefined
- \input plain.def\relax
-\fi
-%<</Load macros for plain if not LaTeX>>
-% \end{macrocode}
-%
% \subsection{Multiple languages}
%
-% \begin{macro}{\language}
-% Plain \TeX\ version~3.0 provides the primitive |\language| that
-% is used to store the current language. When used with a pre-3.0
-% version this function has to be implemented by allocating a
-% counter. The following block is used in \file{switch.def} and
-% \file{hyphen.cfg}; the latter may seem redundant, but remember
-% \babel{} doesn't requires loading \file{switch.def} in the format.
+% \begin{macro}{\language}
+%
+% Plain \TeX\ version~3.0 provides the primitive |\language| that
+% is used to store the current language. When used with a pre-3.0
+% version this function has to be implemented by allocating a
+% counter. The following block is used in \file{switch.def} and
+% \file{hyphen.cfg}; the latter may seem redundant, but remember
+% \babel{} doesn't requires loading \file{switch.def} in the format.
%
% \begin{macrocode}
%<<*Define core switching macros>>
@@ -4798,45 +5205,23 @@ help from Bernd Raichle, for which I am grateful.
%<</Define core switching macros>>
% \end{macrocode}
%
-% \end{macro}
-%
-% \begin{macro}{\last@language}
-% Another counter is used to store the last language defined. For
-% pre-3.0 formats an extra counter has to be allocated.
+% \end{macro}
%
-% \begin{macro}{\addlanguage}
+% \begin{macro}{\last@language}
%
-% To add languages to \TeX's memory plain \TeX\ version~3.0
-% supplies |\newlanguage|, in a pre-3.0 environment a similar macro
-% has to be provided. For both cases a new macro is defined here,
-% because the original |\newlanguage| was defined to be |\outer|.
+% Another counter is used to store the last language defined. For
+% pre-3.0 formats an extra counter has to be allocated.
%
-% For a format based on plain version~2.x, the definition of
-% |\newlanguage| can not be copied because |\count 19| is used for
-% other purposes in these formats. Therefore |\addlanguage| is
-% defined using a definition based on the macros used to define
-% |\newlanguage| in plain \TeX\ version~3.0.
+% \begin{macro}{\addlanguage}
%
-% For formats based on plain version~3.0 the definition of
-% |\newlanguage| can be simply copied, removing |\outer|.
-% Plain \TeX\ version 3.0 uses |\count 19| for this purpose.
+% This macro was introduced for \TeX{} $<$ 2. Preserved for
+% compatibility.
%
% \begin{macrocode}
%<<*Define core switching macros>>
-\ifx\newlanguage\@undefined
- \csname newcount\endcsname\last@language
- \def\addlanguage#1{%
- \global\advance\last@language\@ne
- \ifnum\last@language<\@cclvi
- \else
- \errmessage{No room for a new \string\language!}%
- \fi
- \global\chardef#1\last@language
- \wlog{\string#1 = \string\language\the\last@language}}
-\else
- \countdef\last@language=19
- \def\addlanguage{\alloc@9\language\chardef\@cclvi}
-\fi
+%<<*Define core switching macros>>
+\countdef\last@language=19 % TODO. why? remove?
+\def\addlanguage{\csname newlanguage\endcsname}
%<</Define core switching macros>>
% \end{macrocode}
%
@@ -4857,30 +5242,19 @@ help from Bernd Raichle, for which I am grateful.
% now. We cannot load |babel.def| here because we first need to
% declare and process the package options.
%
-% \section{The Package File (\LaTeX, \texttt{babel.sty})}
-%
-% In order to make use of the features of \LaTeXe, the \babel\
-% system contains a package file, \file{babel.sty}. This file is
-% loaded by the |\usepackage| command and defines all the language
-% options whose name is different from that of the |.ldf| file
-% (like variant spellings). It also takes care of a number of
-% compatibility issues with other packages an defines a few
-% aditional package options.
%
-% Apart from all the language options below we also have a few options
-% that influence the behavior of language definition files.
+% \subsection{The Package File (\LaTeX, \texttt{babel.sty})}
%
-% Many of the following options don't do anything themselves, they
-% are just defined in order to make it possible for babel and
-% language definition files to check if one of them was specified
-% by the user.
+% This file also takes care of a number of compatibility issues with
+% other packages an defines a few aditional package options. Apart from
+% all the language options below we also have a few options that
+% influence the behavior of language definition files.
%
-% \subsection{\texttt{base}}
+% Many of the following options don't do anything themselves, they are
+% just defined in order to make it possible for babel and language
+% definition files to check if one of them was specified by the user.
%
-% The first option to be processed is |base|, which set the
-% hyphenation patterns then resets |ver@babel.sty| so that
-% \LaTeX forgets about the first loading. After |switch.def| has
-% been loaded (above) and |\AfterBabelLanguage| defined, exits.
+% The first two options are for debugging.
%
% \begin{macrocode}
%<*package>
@@ -4888,22 +5262,87 @@ help from Bernd Raichle, for which I am grateful.
\ProvidesPackage{babel}[<@date@> <@version@> The Babel package]
\@ifpackagewith{babel}{debug}
{\providecommand\bbl@trace[1]{\message{^^J[ #1 ]}}%
- \let\bbl@debug\@firstofone}
+ \let\bbl@debug\@firstofone
+ \ifx\directlua\@undefined\else
+ \directlua{ Babel = Babel or {}
+ Babel.debug = true }%
+ \fi}
{\providecommand\bbl@trace[1]{}%
- \let\bbl@debug\@gobble}
-\ifx\bbl@switchflag\@undefined % Prevent double input
- \let\bbl@switchflag\relax
- \input switch.def\relax
-\fi
-<@Load patterns in luatex@>
+ \let\bbl@debug\@gobble
+ \ifx\directlua\@undefined\else
+ \directlua{ Babel = Babel or {}
+ Babel.debug = false }%
+ \fi}
<@Basic macros@>
+ % Temporarily repeat here the code for errors
+ \def\bbl@error#1#2{%
+ \begingroup
+ \def\\{\MessageBreak}%
+ \PackageError{babel}{#1}{#2}%
+ \endgroup}
+ \def\bbl@warning#1{%
+ \begingroup
+ \def\\{\MessageBreak}%
+ \PackageWarning{babel}{#1}%
+ \endgroup}
+ \def\bbl@infowarn#1{%
+ \begingroup
+ \def\\{\MessageBreak}%
+ \GenericWarning
+ {(babel) \@spaces\@spaces\@spaces}%
+ {Package babel Info: #1}%
+ \endgroup}
+ \def\bbl@info#1{%
+ \begingroup
+ \def\\{\MessageBreak}%
+ \PackageInfo{babel}{#1}%
+ \endgroup}
+ \def\bbl@nocaption{\protect\bbl@nocaption@i}
+\def\bbl@nocaption@i#1#2{% 1: text to be printed 2: caption macro \langXname
+ \global\@namedef{#2}{\textbf{?#1?}}%
+ \@nameuse{#2}%
+ \bbl@warning{% TODO.
+ \@backslashchar#2 not set. Please, define it\\%
+ after the language has been loaded (typically\\%
+ in the preamble) with the help of\\%
+ \string\setlocalecaption. An example is:\\%
+ \string\setlocalecaption{mylang}{chapter}{..}\\
+ Reported}}
+\def\bbl@tentative{\protect\bbl@tentative@i}
+\def\bbl@tentative@i#1{%
+ \bbl@warning{%
+ Some functions for '#1' are tentative.\\%
+ They might not work as expected and their behavior\\%
+ may change in the future.\\%
+ Reported}}
+\def\@nolanerr#1{%
+ \bbl@error
+ {You haven't defined the language #1\space yet.\\%
+ Perhaps you misspelled it or your installation\\%
+ is not complete}%
+ {Your command will be ignored, type <return> to proceed}}
+\def\@nopatterns#1{%
+ \bbl@warning
+ {No hyphenation patterns were preloaded for\\%
+ the language `#1' into the format.\\%
+ Please, configure your TeX system to add them and\\%
+ rebuild the format. Now I will use the patterns\\%
+ preloaded for \bbl@nulllanguage\space instead}}
+ % End of errors
+\@ifpackagewith{babel}{silent}
+ {\let\bbl@info\@gobble
+ \let\bbl@infowarn\@gobble
+ \let\bbl@warning\@gobble}
+ {}
+%
\def\AfterBabelLanguage#1{%
\global\expandafter\bbl@add\csname#1.ldf-h@@k\endcsname}%
% \end{macrocode}
%
% If the format created a list of loaded languages (in
% |\bbl@languages|), get the name of the 0-th to show the actual
-% language used.
+% language used. Also avaliable with |base|, because it just shows
+% info.
%
% \begin{macrocode}
\ifx\bbl@languages\@undefined\else
@@ -4923,74 +5362,31 @@ help from Bernd Raichle, for which I am grateful.
\def\bbl@elt##1##2##3##4{}%
\fi}%
\bbl@languages
-\fi
-\ifodd\bbl@engine
- \def\bbl@activate@preotf{%
- \let\bbl@activate@preotf\relax % only once
- \directlua{
- Babel = Babel or {}
- %
- function Babel.pre_otfload_v(head)
- if Babel.numbers and Babel.digits_mapped then
- head = Babel.numbers(head)
- end
- if Babel.bidi_enabled then
- head = Babel.bidi(head, false, dir)
- end
- return head
- end
- %
- function Babel.pre_otfload_h(head, gc, sz, pt, dir)
- if Babel.numbers and Babel.digits_mapped then
- head = Babel.numbers(head)
- end
- if Babel.bidi_enabled then
- head = Babel.bidi(head, false, dir)
- end
- return head
- end
- %
- luatexbase.add_to_callback('pre_linebreak_filter',
- Babel.pre_otfload_v,
- 'Babel.pre_otfload_v',
- luatexbase.priority_in_callback('pre_linebreak_filter',
- 'luaotfload.node_processor') or nil)
- %
- luatexbase.add_to_callback('hpack_filter',
- Babel.pre_otfload_h,
- 'Babel.pre_otfload_h',
- luatexbase.priority_in_callback('hpack_filter',
- 'luaotfload.node_processor') or nil)
- }}
- \let\bbl@tempa\relax
- \@ifpackagewith{babel}{bidi=basic}%
- {\def\bbl@tempa{basic}}%
- {\@ifpackagewith{babel}{bidi=basic-r}%
- {\def\bbl@tempa{basic-r}}%
- {}}
- \ifx\bbl@tempa\relax\else
- \let\bbl@beforeforeign\leavevmode
- \AtEndOfPackage{\EnableBabelHook{babel-bidi}}%
- \RequirePackage{luatexbase}%
- \directlua{
- require('babel-data-bidi.lua')
- require('babel-bidi-\bbl@tempa.lua')
- }
- \bbl@activate@preotf
- \fi
-\fi
+\fi%
% \end{macrocode}
+% \subsection{\texttt{base}}
+%
+% The first `real' option to be processed is |base|, which set the
+% hyphenation patterns then resets |ver@babel.sty| so that \LaTeX
+% forgets about the first loading. After a subset of |babel.def| has
+% been loaded (the old |switch.def|) and |\AfterBabelLanguage| defined,
+% it exits.
%
% Now the \texttt{base} option. With it we can define (and load, with
% \luatex) hyphenation patterns, even if we are not interesed in the
-% rest of babel. Useful for old versions of \textsf{polyglossia}, too.
+% rest of babel.
%
% \begin{macrocode}
\bbl@trace{Defining option 'base'}
\@ifpackagewith{babel}{base}{%
+ \let\bbl@onlyswitch\@empty
+ \let\bbl@provide@locale\relax
+ \input babel.def
+ \let\bbl@onlyswitch\@undefined
\ifx\directlua\@undefined
\DeclareOption*{\bbl@patterns{\CurrentOption}}%
\else
+ \input luababel.def
\DeclareOption*{\bbl@patterns@lua{\CurrentOption}}%
\fi
\DeclareOption{base}{}%
@@ -5001,7 +5397,7 @@ help from Bernd Raichle, for which I am grateful.
\global\let\@ifl@ter@@\@ifl@ter
\def\@ifl@ter#1#2#3#4#5{\global\let\@ifl@ter\@ifl@ter@@}%
\endinput}{}%
-% \end{macrocode}
+% \end{macrocode}
%
% \subsection{\texttt{key=value} options and other general option}
%
@@ -5015,17 +5411,24 @@ help from Bernd Raichle, for which I am grateful.
% \begin{macrocode}
\bbl@trace{key=value and another general options}
\bbl@csarg\let{tempa\expandafter}\csname opt@babel.sty\endcsname
-\def\bbl@tempb#1.#2{%
+\def\bbl@tempb#1.#2{% Remove trailing dot
#1\ifx\@empty#2\else,\bbl@afterfi\bbl@tempb#2\fi}%
-\def\bbl@tempd#1.#2\@nnil{%
+\def\bbl@tempd#1.#2\@nnil{% TODO. Refactor lists?
\ifx\@empty#2%
\edef\bbl@tempc{\ifx\bbl@tempc\@empty\else\bbl@tempc,\fi#1}%
\else
- \in@{=}{#1}\ifin@
- \edef\bbl@tempc{\ifx\bbl@tempc\@empty\else\bbl@tempc,\fi#1.#2}%
+ \in@{,provide,}{,#1,}%
+ \ifin@
+ \edef\bbl@tempc{%
+ \ifx\bbl@tempc\@empty\else\bbl@tempc,\fi#1.\bbl@tempb#2}%
\else
- \edef\bbl@tempc{\ifx\bbl@tempc\@empty\else\bbl@tempc,\fi#1}%
- \bbl@csarg\edef{mod@#1}{\bbl@tempb#2}%
+ \in@{=}{#1}%
+ \ifin@
+ \edef\bbl@tempc{\ifx\bbl@tempc\@empty\else\bbl@tempc,\fi#1.#2}%
+ \else
+ \edef\bbl@tempc{\ifx\bbl@tempc\@empty\else\bbl@tempc,\fi#1}%
+ \bbl@csarg\edef{mod@#1}{\bbl@tempb#2}%
+ \fi
\fi
\fi}
\let\bbl@tempc\@empty
@@ -5033,7 +5436,7 @@ help from Bernd Raichle, for which I am grateful.
\expandafter\let\csname opt@babel.sty\endcsname\bbl@tempc
% \end{macrocode}
%
-% The next option tells \babel\ to leave shorthand characters active
+% The next option tells \babel{} to leave shorthand characters active
% at the end of processing the package. This is \emph{not} the default
% as it can cause problems with other packages, but for those who want
% to use the shorthand characters in the preamble of their documents
@@ -5049,7 +5452,14 @@ help from Bernd Raichle, for which I am grateful.
\DeclareOption{silent}{}
\DeclareOption{mono}{}
\DeclareOption{shorthands=off}{\bbl@tempa shorthands=\bbl@tempa}
-% Don't use. Experimental:
+\chardef\bbl@iniflag\z@
+\DeclareOption{provide=*}{\chardef\bbl@iniflag\@ne} % main -> +1
+\DeclareOption{provide+=*}{\chardef\bbl@iniflag\tw@} % add = 2
+\DeclareOption{provide*=*}{\chardef\bbl@iniflag\thr@@} % add + main
+% A separate option
+\let\bbl@autoload@options\@empty
+\DeclareOption{provide@=*}{\def\bbl@autoload@options{import}}
+% Don't use. Experimental. TODO.
\newif\ifbbl@single
\DeclareOption{selectors=off}{\bbl@singletrue}
<@More package options@>
@@ -5078,11 +5488,12 @@ help from Bernd Raichle, for which I am grateful.
\bbl@csarg\ifx{opt@#1}\@nnil
\bbl@csarg\edef{opt@#1}{#2}%
\else
- \bbl@error{%
- Bad option `#1=#2'. Either you have misspelled the\\%
- key or there is a previous setting of `#1'}{%
- Valid keys are `shorthands', `config', `strings', `main',\\%
- `headfoot', `safe', `math', among others.}
+ \bbl@error
+ {Bad option `#1=#2'. Either you have misspelled the\\%
+ key or there is a previous setting of `#1'. Valid\\%
+ keys are, among others, `shorthands', `main', `bidi',\\%
+ `strings', `config', `headfoot', `safe', `math'.}%
+ {See the manual for further details.}
\fi}
% \end{macrocode}
%
@@ -5103,7 +5514,7 @@ help from Bernd Raichle, for which I am grateful.
\fi}
% \end{macrocode}
%
-% Now we finish the first pass (and start over).
+% Now we finish the first pass (and start over).
%
% \begin{macrocode}
\ProcessOptions*
@@ -5111,14 +5522,14 @@ help from Bernd Raichle, for which I am grateful.
%
% \subsection{Conditional loading of shorthands}
%
-% If there is no |shorthands=<chars>|, the original \textsf{babel}
-% macros are left untouched, but if there is, these macros are
-% wrapped (in |babel.def|) to define only those given.
+% If there is no |shorthands=<chars>|, the original \textsf{babel}
+% macros are left untouched, but if there is, these macros are
+% wrapped (in |babel.def|) to define only those given.
%
-% A bit of optimization: if there is no |shorthands=|, then
-% |\bbl@ifshorthand| is always true, and it is always false if
-% |shorthands| is empty. Also, some code makes sense only with
-% |shorthands=...|.
+% A bit of optimization: if there is no |shorthands=|, then
+% |\bbl@ifshorthand| is always true, and it is always false if
+% |shorthands| is empty. Also, some code makes sense only with
+% |shorthands=...|.
%
% \begin{macrocode}
\bbl@trace{Conditional loading of shorthands}
@@ -5150,16 +5561,16 @@ help from Bernd Raichle, for which I am grateful.
\fi}
% \end{macrocode}
%
-% We make sure all chars in the string are `other', with the help
-% of an auxiliary macro defined above (which also zaps spaces).
+% We make sure all chars in the string are `other', with the help
+% of an auxiliary macro defined above (which also zaps spaces).
%
% \begin{macrocode}
\edef\bbl@opt@shorthands{%
\expandafter\bbl@sh@string\bbl@opt@shorthands\@empty}%
% \end{macrocode}
%
-% The following is ignored with |shorthands=off|, since it is
-% intended to take some aditional actions for certain chars.
+% The following is ignored with |shorthands=off|, since it is
+% intended to take some aditional actions for certain chars.
%
% \begin{macrocode}
\bbl@ifshorthand{'}%
@@ -5169,9 +5580,9 @@ help from Bernd Raichle, for which I am grateful.
\fi\fi
% \end{macrocode}
%
-% With |headfoot=lang| we can set the language used in heads/foots.
-% For example, in babel/3796 just adds |headfoot=english|. It
-% misuses \cs{@resetactivechars} but seems to work.
+% With |headfoot=lang| we can set the language used in heads/foots.
+% For example, in babel/3796 just adds |headfoot=english|. It
+% misuses \cs{@resetactivechars} but seems to work.
%
% \begin{macrocode}
\ifx\bbl@opt@headfoot\@nnil\else
@@ -5198,7 +5609,8 @@ help from Bernd Raichle, for which I am grateful.
% \end{macrocode}
%
% For |layout| an auxiliary macro is provided, available for packages
-% and language styles.
+% and language styles. Optimization: if there is no |layout|, just do
+% nothing.
%
% \begin{macrocode}
\bbl@trace{Defining IfBabelLayout}
@@ -5215,13 +5627,1078 @@ help from Bernd Raichle, for which I am grateful.
\fi
% \end{macrocode}
%
+% \textbf{Common definitions.} \textit{In progress.} Still based on
+% |babel.def|, but the code should be moved here.
+%
+% \begin{macrocode}
+\input babel.def
+% \end{macrocode}
+%
+% \subsection{Cross referencing macros}
+%
+% The \LaTeX\ book states:
+% \begin{quote}
+% The \emph{key} argument is any sequence of letters, digits, and
+% punctuation symbols; upper- and lowercase letters are regarded as
+% different.
+% \end{quote}
+% When the above quote should still be true when a document is
+% typeset in a language that has active characters, special care
+% has to be taken of the category codes of these characters when
+% they appear in an argument of the cross referencing macros.
+%
+% When a cross referencing command processes its argument, all
+% tokens in this argument should be character tokens with category
+% `letter' or `other'.
+%
+% The following package options control which macros are to be
+% redefined.
+%
+% \begin{macrocode}
+%<<*More package options>>
+\DeclareOption{safe=none}{\let\bbl@opt@safe\@empty}
+\DeclareOption{safe=bib}{\def\bbl@opt@safe{B}}
+\DeclareOption{safe=ref}{\def\bbl@opt@safe{R}}
+%<</More package options>>
+% \end{macrocode}
+%
+% \begin{macro}{\@newl@bel}
+%
+% First we open a new group to keep the changed setting of
+% |\protect| local and then we set the |@safe@actives| switch to
+% true to make sure that any shorthand that appears in any of the
+% arguments immediately expands to its non-active self.
+%
+% \begin{macrocode}
+\bbl@trace{Cross referencing macros}
+\ifx\bbl@opt@safe\@empty\else
+ \def\@newl@bel#1#2#3{%
+ {\@safe@activestrue
+ \bbl@ifunset{#1@#2}%
+ \relax
+ {\gdef\@multiplelabels{%
+ \@latex@warning@no@line{There were multiply-defined labels}}%
+ \@latex@warning@no@line{Label `#2' multiply defined}}%
+ \global\@namedef{#1@#2}{#3}}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\@testdef}
+%
+% An internal \LaTeX\ macro used to test if the labels that have
+% been written on the |.aux| file have changed. It is called by
+% the |\enddocument| macro.
+%
+% \begin{macrocode}
+ \CheckCommand*\@testdef[3]{%
+ \def\reserved@a{#3}%
+ \expandafter\ifx\csname#1@#2\endcsname\reserved@a
+ \else
+ \@tempswatrue
+ \fi}
+% \end{macrocode}
+%
+% Now that we made sure that |\@testdef| still has the same definition
+% we can rewrite it. First we make the shorthands `safe'. Then we use
+% |\bbl@tempa| as an `alias' for the macro that contains the label
+% which is being checked. Then we define |\bbl@tempb| just as
+% |\@newl@bel| does it. When the label is defined we replace the
+% definition of |\bbl@tempa| by its meaning. If the label didn't
+% change, |\bbl@tempa| and |\bbl@tempb| should be identical macros.
+%
+% \begin{macrocode}
+ \def\@testdef#1#2#3{% TODO. With @samestring?
+ \@safe@activestrue
+ \expandafter\let\expandafter\bbl@tempa\csname #1@#2\endcsname
+ \def\bbl@tempb{#3}%
+ \@safe@activesfalse
+ \ifx\bbl@tempa\relax
+ \else
+ \edef\bbl@tempa{\expandafter\strip@prefix\meaning\bbl@tempa}%
+ \fi
+ \edef\bbl@tempb{\expandafter\strip@prefix\meaning\bbl@tempb}%
+ \ifx\bbl@tempa\bbl@tempb
+ \else
+ \@tempswatrue
+ \fi}
+\fi
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\ref}
+% \begin{macro}{\pageref}
+%
+% The same holds for the macro |\ref| that references a label and
+% |\pageref| to reference a page. We make them robust as well (if
+% they weren't already) to prevent problems if they should become
+% expanded at the wrong moment.
+%
+% \begin{macrocode}
+\bbl@xin@{R}\bbl@opt@safe
+\ifin@
+ \bbl@redefinerobust\ref#1{%
+ \@safe@activestrue\org@ref{#1}\@safe@activesfalse}
+ \bbl@redefinerobust\pageref#1{%
+ \@safe@activestrue\org@pageref{#1}\@safe@activesfalse}
+\else
+ \let\org@ref\ref
+ \let\org@pageref\pageref
+\fi
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@citex}
+%
+% The macro used to cite from a bibliography, |\cite|, uses an
+% internal macro, |\@citex|.
+% It is this internal macro that picks up the argument(s),
+% so we redefine this internal macro and leave |\cite| alone. The
+% first argument is used for typesetting, so the shorthands need
+% only be deactivated in the second argument.
+%
+% \begin{macrocode}
+\bbl@xin@{B}\bbl@opt@safe
+\ifin@
+ \bbl@redefine\@citex[#1]#2{%
+ \@safe@activestrue\edef\@tempa{#2}\@safe@activesfalse
+ \org@@citex[#1]{\@tempa}}
+% \end{macrocode}
+%
+% Unfortunately, the packages \pkg{natbib} and \pkg{cite} need a
+% different definition of |\@citex|...
+% To begin with, \pkg{natbib} has a definition for |\@citex| with
+% \emph{three} arguments... We only know that a package is loaded
+% when |\begin{document}| is executed, so we need to postpone the
+% different redefinition.
+%
+% \begin{macrocode}
+ \AtBeginDocument{%
+ \@ifpackageloaded{natbib}{%
+% \end{macrocode}
+%
+% Notice that we use |\def| here instead of |\bbl@redefine| because
+% |\org@@citex| is already defined and we don't want to overwrite
+% that definition (it would result in parameter stack overflow
+% because of a circular definition).
+%
+% (Recent versions of \pkg{natbib} change dynamically |\@citex|, so PR4087
+% doesn't seem fixable in a simple way. Just load \pkg{natbib} before.)
+%
+% \begin{macrocode}
+ \def\@citex[#1][#2]#3{%
+ \@safe@activestrue\edef\@tempa{#3}\@safe@activesfalse
+ \org@@citex[#1][#2]{\@tempa}}%
+ }{}}
+% \end{macrocode}
+%
+% The package \pkg{cite} has a definition of |\@citex| where the
+% shorthands need to be turned off in both arguments.
+%
+% \begin{macrocode}
+ \AtBeginDocument{%
+ \@ifpackageloaded{cite}{%
+ \def\@citex[#1]#2{%
+ \@safe@activestrue\org@@citex[#1]{#2}\@safe@activesfalse}%
+ }{}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\nocite}
+%
+% The macro |\nocite| which is used to instruct BiB\TeX\ to
+% extract uncited references from the database.
+%
+% \begin{macrocode}
+ \bbl@redefine\nocite#1{%
+ \@safe@activestrue\org@nocite{#1}\@safe@activesfalse}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\bibcite}
+%
+% The macro that is used in the |.aux| file to
+% define citation labels. When packages such as \pkg{natbib} or
+% \pkg{cite} are not loaded its second argument is used to typeset the
+% citation label. In that case, this second argument can contain
+% active characters but is used in an environment where
+% |\@safe@activestrue| is in effect. This switch needs to be reset
+% inside the |\hbox| which contains the citation label. In order to
+% determine during \file{.aux} file processing which definition of
+% |\bibcite| is needed we define |\bibcite| in such a way that it
+% redefines itself with the proper definition. We call
+% |\bbl@cite@choice| to select the proper definition for |\bibcite|.
+% This new definition is then activated.
+%
+% \begin{macrocode}
+ \bbl@redefine\bibcite{%
+ \bbl@cite@choice
+ \bibcite}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\bbl@bibcite}
+%
+% The macro |\bbl@bibcite| holds the definition of |\bibcite|
+% needed when neither \pkg{natbib} nor \pkg{cite} is loaded.
+%
+% \begin{macrocode}
+ \def\bbl@bibcite#1#2{%
+ \org@bibcite{#1}{\@safe@activesfalse#2}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\bbl@cite@choice}
+%
+% The macro |\bbl@cite@choice| determines which definition of
+% |\bibcite| is needed. First we give |\bibcite| its default
+% definition.
+%
+% \begin{macrocode}
+ \def\bbl@cite@choice{%
+ \global\let\bibcite\bbl@bibcite
+ \@ifpackageloaded{natbib}{\global\let\bibcite\org@bibcite}{}%
+ \@ifpackageloaded{cite}{\global\let\bibcite\org@bibcite}{}%
+ \global\let\bbl@cite@choice\relax}
+% \end{macrocode}
+%
+% When a document is run for the first time, no \file{.aux} file is
+% available, and |\bibcite| will not yet be properly defined. In
+% this case, this has to happen before the document starts.
+%
+% \begin{macrocode}
+ \AtBeginDocument{\bbl@cite@choice}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\@bibitem}
+%
+% One of the two internal \LaTeX\ macros called by |\bibitem|
+% that write the citation label on the |.aux| file.
+%
+% \begin{macrocode}
+ \bbl@redefine\@bibitem#1{%
+ \@safe@activestrue\org@@bibitem{#1}\@safe@activesfalse}
+\else
+ \let\org@nocite\nocite
+ \let\org@@citex\@citex
+ \let\org@bibcite\bibcite
+ \let\org@@bibitem\@bibitem
+\fi
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \subsection{Marks}
+%
+% \begin{macro}{\markright}
+% Because the output routine is asynchronous, we must pass the
+% current language attribute to the head lines. To achieve this we
+% need to adapt the definition of |\markright| and |\markboth|
+% somewhat. However, headlines and footlines can contain text
+% outside marks; for that we must take some actions in the output
+% routine if the 'headfoot' options is used.
+%
+% We need to make some redefinitions to the output routine
+% to avoid an endless loop and to correctly handle the page number
+% in bidi documents.
+%
+% \begin{macrocode}
+\bbl@trace{Marks}
+\IfBabelLayout{sectioning}
+ {\ifx\bbl@opt@headfoot\@nnil
+ \g@addto@macro\@resetactivechars{%
+ \set@typeset@protect
+ \expandafter\select@language@x\expandafter{\bbl@main@language}%
+ \let\protect\noexpand
+ \ifcase\bbl@bidimode\else % Only with bidi. See also above
+ \edef\thepage{%
+ \noexpand\babelsublr{\unexpanded\expandafter{\thepage}}}%
+ \fi}%
+ \fi}
+ {\ifbbl@single\else
+ \bbl@ifunset{markright }\bbl@redefine\bbl@redefinerobust
+ \markright#1{%
+ \bbl@ifblank{#1}%
+ {\org@markright{}}%
+ {\toks@{#1}%
+ \bbl@exp{%
+ \\\org@markright{\\\protect\\\foreignlanguage{\languagename}%
+ {\\\protect\\\bbl@restore@actives\the\toks@}}}}}%
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\markboth}
+% \begin{macro}{\@mkboth}
+% The definition of |\markboth| is equivalent to that of
+% |\markright|, except that we need two token registers. The
+% documentclasses \cls{report} and \cls{book} define and set the
+% headings for the page. While doing so they also store a copy of
+% |\markboth| in |\@mkboth|. Therefore we need to check whether
+% |\@mkboth| has already been set. If so we neeed to do that again
+% with the new definition of |\markboth|. (As of Oct 2019, \LaTeX{}
+% stores the definition in an intermediate macro, so it's not
+% necessary anymore, but it's preserved for older versions.)
+%
+% \begin{macrocode}
+ \ifx\@mkboth\markboth
+ \def\bbl@tempc{\let\@mkboth\markboth}
+ \else
+ \def\bbl@tempc{}
+ \fi
+ \bbl@ifunset{markboth }\bbl@redefine\bbl@redefinerobust
+ \markboth#1#2{%
+ \protected@edef\bbl@tempb##1{%
+ \protect\foreignlanguage
+ {\languagename}{\protect\bbl@restore@actives##1}}%
+ \bbl@ifblank{#1}%
+ {\toks@{}}%
+ {\toks@\expandafter{\bbl@tempb{#1}}}%
+ \bbl@ifblank{#2}%
+ {\@temptokena{}}%
+ {\@temptokena\expandafter{\bbl@tempb{#2}}}%
+ \bbl@exp{\\\org@markboth{\the\toks@}{\the\@temptokena}}}
+ \bbl@tempc
+ \fi} % end ifbbl@single, end \IfBabelLayout
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Preventing clashes with other packages}
+%
+% \subsubsection{\pkg{ifthen}}
+%
+% \begin{macro}{\ifthenelse}
+%
+% Sometimes a document writer wants to create a special effect
+% depending on the page a certain fragment of text appears on. This
+% can be achieved by the following piece of code:
+%\begin{verbatim}
+% \ifthenelse{\isodd{\pageref{some:label}}}
+% {code for odd pages}
+% {code for even pages}
+%\end{verbatim}
+% In order for this to work the argument of |\isodd| needs to be
+% fully expandable. With the above redefinition of |\pageref| it is
+% not in the case of this example. To overcome that, we add some
+% code to the definition of |\ifthenelse| to make things work.
+%
+% We want to revert the definition of |\pageref| and |\ref| to
+% their original definition for the first argument of |\ifthenelse|,
+% so we first need to store their current meanings.
+%
+% Then we can set the |\@safe@actives| switch and call the original
+% |\ifthenelse|. In order to be able to use shorthands in the
+% second and third arguments of |\ifthenelse| the resetting of the
+% switch \emph{and} the definition of |\pageref| happens inside
+% those arguments.
+%
+% \begin{macrocode}
+\bbl@trace{Preventing clashes with other packages}
+\bbl@xin@{R}\bbl@opt@safe
+\ifin@
+ \AtBeginDocument{%
+ \@ifpackageloaded{ifthen}{%
+ \bbl@redefine@long\ifthenelse#1#2#3{%
+ \let\bbl@temp@pref\pageref
+ \let\pageref\org@pageref
+ \let\bbl@temp@ref\ref
+ \let\ref\org@ref
+ \@safe@activestrue
+ \org@ifthenelse{#1}%
+ {\let\pageref\bbl@temp@pref
+ \let\ref\bbl@temp@ref
+ \@safe@activesfalse
+ #2}%
+ {\let\pageref\bbl@temp@pref
+ \let\ref\bbl@temp@ref
+ \@safe@activesfalse
+ #3}%
+ }%
+ }{}%
+ }
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \subsubsection{\pkg{varioref}}
+%
+% \begin{macro}{\@@vpageref}
+% \begin{macro}{\vrefpagenum}
+% \begin{macro}{\Ref}
+%
+% When the package varioref is in use we need to modify its
+% internal command |\@@vpageref| in order to prevent problems when
+% an active character ends up in the argument of |\vref|. The same
+% needs to happen for |\vrefpagenum|.
+%
+% \begin{macrocode}
+ \AtBeginDocument{%
+ \@ifpackageloaded{varioref}{%
+ \bbl@redefine\@@vpageref#1[#2]#3{%
+ \@safe@activestrue
+ \org@@@vpageref{#1}[#2]{#3}%
+ \@safe@activesfalse}%
+ \bbl@redefine\vrefpagenum#1#2{%
+ \@safe@activestrue
+ \org@vrefpagenum{#1}{#2}%
+ \@safe@activesfalse}%
+% \end{macrocode}
+%
+% The package \pkg{varioref} defines |\Ref| to be a robust command
+% wich uppercases the first character of the reference text. In
+% order to be able to do that it needs to access the expandable form
+% of |\ref|. So we employ a little trick here. We redefine the
+% (internal) command \verb*|\Ref | to call |\org@ref| instead of
+% |\ref|. The disadvantage of this solution is that whenever the
+% definition of |\Ref| changes, this definition needs to be updated
+% as well.
+%
+% \begin{macrocode}
+ \expandafter\def\csname Ref \endcsname#1{%
+ \protected@edef\@tempa{\org@ref{#1}}\expandafter\MakeUppercase\@tempa}
+ }{}%
+ }
+\fi
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{\pkg{hhline}}
+%
+% \begin{macro}{\hhline}
+%
+% Delaying the activation of the shorthand characters has introduced
+% a problem with the \pkg{hhline} package. The reason is that it
+% uses the `:' character which is made active by the french support
+% in \babel. Therefore we need to \emph{reload} the package when
+% the `:' is an active character. Note that this happens
+% \emph{after} the category code of the @-sign has been changed to
+% other, so we need to temporarily change it to letter again.
+%
+% \begin{macrocode}
+\AtEndOfPackage{%
+ \AtBeginDocument{%
+ \@ifpackageloaded{hhline}%
+ {\expandafter\ifx\csname normal@char\string:\endcsname\relax
+ \else
+ \makeatletter
+ \def\@currname{hhline}\input{hhline.sty}\makeatother
+ \fi}%
+ {}}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \subsubsection{\pkg{hyperref}}
+%
+% \begin{macro}{\pdfstringdefDisableCommands}
+%
+% A number of interworking problems between \pkg{babel} and
+% \pkg{hyperref} are tackled by \pkg{hyperref} itself. The
+% following code was introduced to prevent some annoying warnings
+% but it broke bookmarks. This was quickly fixed in \pkg{hyperref},
+% which essentially made it no-op. However, it will not removed for
+% the moment because \pkg{hyperref} is expecting it. TODO. Still
+% true? Commented out in 2020/07/27.
+%
+% \begin{macrocode}
+% \AtBeginDocument{%
+% \ifx\pdfstringdefDisableCommands\@undefined\else
+% \pdfstringdefDisableCommands{\languageshorthands{system}}%
+% \fi}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \subsubsection{\pkg{fancyhdr}}
+%
+% \begin{macro}{\FOREIGNLANGUAGE}
+%
+% The package \pkg{fancyhdr} treats the running head and fout lines
+% somewhat differently as the standard classes. A symptom of this is
+% that the command |\foreignlanguage| which \babel\ adds to the
+% marks can end up inside the argument of |\MakeUppercase|. To
+% prevent unexpected results we need to define |\FOREIGNLANGUAGE|
+% here.
+%
+% \begin{macrocode}
+\DeclareRobustCommand{\FOREIGNLANGUAGE}[1]{%
+ \lowercase{\foreignlanguage{#1}}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\substitutefontfamily}
+%
+% The command |\substitutefontfamily| creates an
+% \file{.fd} file on the fly. The first argument is an encoding
+% mnemonic, the second and third arguments are font family names.
+% This command is deprecated. Use the tools provides by \LaTeX.
+%
+% \begin{macrocode}
+\def\substitutefontfamily#1#2#3{%
+ \lowercase{\immediate\openout15=#1#2.fd\relax}%
+ \immediate\write15{%
+ \string\ProvidesFile{#1#2.fd}%
+ [\the\year/\two@digits{\the\month}/\two@digits{\the\day}
+ \space generated font description file]^^J
+ \string\DeclareFontFamily{#1}{#2}{}^^J
+ \string\DeclareFontShape{#1}{#2}{m}{n}{<->ssub * #3/m/n}{}^^J
+ \string\DeclareFontShape{#1}{#2}{m}{it}{<->ssub * #3/m/it}{}^^J
+ \string\DeclareFontShape{#1}{#2}{m}{sl}{<->ssub * #3/m/sl}{}^^J
+ \string\DeclareFontShape{#1}{#2}{m}{sc}{<->ssub * #3/m/sc}{}^^J
+ \string\DeclareFontShape{#1}{#2}{b}{n}{<->ssub * #3/bx/n}{}^^J
+ \string\DeclareFontShape{#1}{#2}{b}{it}{<->ssub * #3/bx/it}{}^^J
+ \string\DeclareFontShape{#1}{#2}{b}{sl}{<->ssub * #3/bx/sl}{}^^J
+ \string\DeclareFontShape{#1}{#2}{b}{sc}{<->ssub * #3/bx/sc}{}^^J
+ }%
+ \closeout15
+ }
+\@onlypreamble\substitutefontfamily
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \subsection{Encoding and fonts}
+%
+% Because documents may use non-ASCII font encodings, we make sure
+% that the logos of \TeX\ and \LaTeX\ always come out in the right
+% encoding. There is a list of non-ASCII encodings. Unfortunately,
+% \textsf{fontenc} deletes its package options, so we must guess which
+% encodings has been loaded by traversing |\@filelist| to search for
+% \m{enc}|enc.def|. If a non-ASCII has been loaded, we define versions
+% of |\TeX| and |\LaTeX| for them using |\ensureascii|. The default
+% ASCII encoding is set, too (in reverse order): the ``main'' encoding
+% (when the document begins), the last loaded, or |OT1|.
+%
+% \begin{macro}{\ensureascii}
+%
+% \begin{macrocode}
+\bbl@trace{Encoding and fonts}
+\newcommand\BabelNonASCII{LGR,X2,OT2,OT3,OT6,LHE,LWN,LMA,LMC,LMS,LMU,PU,PD1}
+\newcommand\BabelNonText{TS1,T3,TS3}
+\let\org@TeX\TeX
+\let\org@LaTeX\LaTeX
+\let\ensureascii\@firstofone
+\AtBeginDocument{%
+ \in@false
+ \bbl@foreach\BabelNonASCII{% is there a text non-ascii enc?
+ \ifin@\else
+ \lowercase{\bbl@xin@{,#1enc.def,}{,\@filelist,}}%
+ \fi}%
+ \ifin@ % if a text non-ascii has been loaded
+ \def\ensureascii#1{{\fontencoding{OT1}\selectfont#1}}%
+ \DeclareTextCommandDefault{\TeX}{\org@TeX}%
+ \DeclareTextCommandDefault{\LaTeX}{\org@LaTeX}%
+ \def\bbl@tempb#1\@@{\uppercase{\bbl@tempc#1}ENC.DEF\@empty\@@}%
+ \def\bbl@tempc#1ENC.DEF#2\@@{%
+ \ifx\@empty#2\else
+ \bbl@ifunset{T@#1}%
+ {}%
+ {\bbl@xin@{,#1,}{,\BabelNonASCII,\BabelNonText,}%
+ \ifin@
+ \DeclareTextCommand{\TeX}{#1}{\ensureascii{\org@TeX}}%
+ \DeclareTextCommand{\LaTeX}{#1}{\ensureascii{\org@LaTeX}}%
+ \else
+ \def\ensureascii##1{{\fontencoding{#1}\selectfont##1}}%
+ \fi}%
+ \fi}%
+ \bbl@foreach\@filelist{\bbl@tempb#1\@@}% TODO - \@@ de mas??
+ \bbl@xin@{,\cf@encoding,}{,\BabelNonASCII,\BabelNonText,}%
+ \ifin@\else
+ \edef\ensureascii#1{{%
+ \noexpand\fontencoding{\cf@encoding}\noexpand\selectfont#1}}%
+ \fi
+ \fi}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% Now comes the old deprecated stuff (with a little change in 3.9l,
+% for \textsf{fontspec}). The first thing we need to do is to
+% determine, at |\begin{document}|, which latin fontencoding to use.
+%
+% \begin{macro}{\latinencoding}
+% When text is being typeset in an encoding other than `latin'
+% (\texttt{OT1} or \texttt{T1}), it would be nice to still have
+% Roman numerals come out in the Latin encoding.
+% So we first assume that the current encoding at the end
+% of processing the package is the Latin encoding.
+%
+% \begin{macrocode}
+\AtEndOfPackage{\edef\latinencoding{\cf@encoding}}
+% \end{macrocode}
+%
+% But this might be overruled with a later loading of the package
+% \pkg{fontenc}. Therefore we check at the execution of
+% |\begin{document}| whether it was loaded with the \Lopt{T1}
+% option. The normal way to do this (using |\@ifpackageloaded|) is
+% disabled for this package. Now we have to revert to parsing the
+% internal macro |\@filelist| which contains all the filenames
+% loaded.
+%
+% \begin{macrocode}
+\AtBeginDocument{%
+ \@ifpackageloaded{fontspec}%
+ {\xdef\latinencoding{%
+ \ifx\UTFencname\@undefined
+ EU\ifcase\bbl@engine\or2\or1\fi
+ \else
+ \UTFencname
+ \fi}}%
+ {\gdef\latinencoding{OT1}%
+ \ifx\cf@encoding\bbl@t@one
+ \xdef\latinencoding{\bbl@t@one}%
+ \else
+ \ifx\@fontenc@load@list\@undefined
+ \@ifl@aded{def}{t1enc}{\xdef\latinencoding{\bbl@t@one}}{}%
+ \else
+ \def\@elt#1{,#1,}%
+ \edef\bbl@tempa{\expandafter\@gobbletwo\@fontenc@load@list}%
+ \let\@elt\relax
+ \bbl@xin@{,T1,}\bbl@tempa
+ \ifin@
+ \xdef\latinencoding{\bbl@t@one}%
+ \fi
+ \fi
+ \fi}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\latintext}
+% Then we can define the command |\latintext| which is a
+% declarative switch to a latin font-encoding. Usage of this macro
+% is deprecated.
+%
+% \begin{macrocode}
+\DeclareRobustCommand{\latintext}{%
+ \fontencoding{\latinencoding}\selectfont
+ \def\encodingdefault{\latinencoding}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\textlatin}
+% This command takes an argument which is then typeset using the
+% requested font encoding. In order to avoid many encoding switches
+% it operates in a local scope.
+%
+% \begin{macrocode}
+\ifx\@undefined\DeclareTextFontCommand
+ \DeclareRobustCommand{\textlatin}[1]{\leavevmode{\latintext #1}}
+\else
+ \DeclareTextFontCommand{\textlatin}{\latintext}
+\fi
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \subsection{Basic bidi support}
+%
+% \textbf{Work in progress.} This code is currently placed here for
+% practical reasons. It will be moved to the correct place soon, I
+% hope.
+%
+% It is loosely based on |rlbabel.def|, but most of it has been
+% developed from scratch. This \babel{} module (by Johannes Braams and
+% Boris Lavva) has served the purpose of typesetting R documents for
+% two decades, and despite its flaws I think it is still a good starting
+% point (some parts have been copied here almost verbatim), partly
+% thanks to its simplicity. I've also looked at \textsc{arabi} (by
+% Youssef Jabri), which is compatible with \babel{}.
+%
+% There are two ways of modifying macros to make them “bidi”, namely,
+% by patching the internal low-level macros (which is what I have done
+% with lists, columns, counters, tocs, much like |rlbabel| did), and
+% by introducing a “middle layer” just below the user interface
+% (sectioning, footnotes).
+%
+% \begin{itemize}
+% \item pdftex provides a minimal support for bidi text, and it
+% must be done by hand. Vertical typesetting is not possible.
+% \item \xetex{} is somewhat better, thanks to its font engine
+% (even if not always reliable) and a few additional tools. However,
+% very little is done at the paragraph level. Another challenging
+% problem is text direction does not honour \TeX{} grouping.
+% \item \luatex{} can provide the most complete solution, as we can
+% manipulate almost freely the node list, the generated lines,
+% and so on, but bidi text does not work out of the box and some
+% development is necessary. It also provides tools to properly
+% set left-to-right and right-to-left page layouts. As Lua\TeX-ja
+% shows, vertical typesetting is possible, too.
+% \end{itemize}
+%
+% As a frist step, add a handler for bidi and digits (and potentially
+% other processes) just before \textsf{luaoftload} is applied, which is
+% loaded by default by \LaTeX. Just in case, consider the possibility
+% it has not been loaded.
+%
+% \begin{macrocode}
+\ifodd\bbl@engine
+ \def\bbl@activate@preotf{%
+ \let\bbl@activate@preotf\relax % only once
+ \directlua{
+ Babel = Babel or {}
+ %
+ function Babel.pre_otfload_v(head)
+ if Babel.numbers and Babel.digits_mapped then
+ head = Babel.numbers(head)
+ end
+ if Babel.bidi_enabled then
+ head = Babel.bidi(head, false, dir)
+ end
+ return head
+ end
+ %
+ function Babel.pre_otfload_h(head, gc, sz, pt, dir)
+ if Babel.numbers and Babel.digits_mapped then
+ head = Babel.numbers(head)
+ end
+ if Babel.bidi_enabled then
+ head = Babel.bidi(head, false, dir)
+ end
+ return head
+ end
+ %
+ luatexbase.add_to_callback('pre_linebreak_filter',
+ Babel.pre_otfload_v,
+ 'Babel.pre_otfload_v',
+ luatexbase.priority_in_callback('pre_linebreak_filter',
+ 'luaotfload.node_processor') or nil)
+ %
+ luatexbase.add_to_callback('hpack_filter',
+ Babel.pre_otfload_h,
+ 'Babel.pre_otfload_h',
+ luatexbase.priority_in_callback('hpack_filter',
+ 'luaotfload.node_processor') or nil)
+ }}
+\fi
+% \end{macrocode}
+%
+% The basic setup. In luatex, the output is modified at a very low
+% level to set the |\bodydir| to the |\pagedir|.
+%
+% \begin{macrocode}
+\bbl@trace{Loading basic (internal) bidi support}
+\ifodd\bbl@engine
+ \ifnum\bbl@bidimode>100 \ifnum\bbl@bidimode<200
+ \let\bbl@beforeforeign\leavevmode
+ \AtEndOfPackage{\EnableBabelHook{babel-bidi}}
+ \RequirePackage{luatexbase}
+ \bbl@activate@preotf
+ \directlua{
+ require('babel-data-bidi.lua')
+ \ifcase\expandafter\@gobbletwo\the\bbl@bidimode\or
+ require('babel-bidi-basic.lua')
+ \or
+ require('babel-bidi-basic-r.lua')
+ \fi}
+ % TODO - to locale_props, not as separate attribute
+ \newattribute\bbl@attr@dir
+ % TODO. I don't like it, hackish:
+ \bbl@exp{\output{\bodydir\pagedir\the\output}}
+ \AtEndOfPackage{\EnableBabelHook{babel-bidi}}
+ \fi\fi
+\else
+ \ifnum\bbl@bidimode>100 \ifnum\bbl@bidimode<200
+ \bbl@error
+ {The bidi method `basic' is available only in\\%
+ luatex. I'll continue with `bidi=default', so\\%
+ expect wrong results}%
+ {See the manual for further details.}%
+ \let\bbl@beforeforeign\leavevmode
+ \AtEndOfPackage{%
+ \EnableBabelHook{babel-bidi}%
+ \bbl@xebidipar}
+ \fi\fi
+ \def\bbl@loadxebidi#1{%
+ \ifx\RTLfootnotetext\@undefined
+ \AtEndOfPackage{%
+ \EnableBabelHook{babel-bidi}%
+ \ifx\fontspec\@undefined
+ \bbl@loadfontspec % bidi needs fontspec
+ \fi
+ \usepackage#1{bidi}}%
+ \fi}
+ \ifnum\bbl@bidimode>200
+ \ifcase\expandafter\@gobbletwo\the\bbl@bidimode\or
+ \bbl@tentative{bidi=bidi}
+ \bbl@loadxebidi{}
+ \or
+ \bbl@loadxebidi{[rldocument]}
+ \or
+ \bbl@loadxebidi{}
+ \fi
+ \fi
+\fi
+\ifnum\bbl@bidimode=\@ne
+ \let\bbl@beforeforeign\leavevmode
+ \ifodd\bbl@engine
+ \newattribute\bbl@attr@dir
+ \bbl@exp{\output{\bodydir\pagedir\the\output}}%
+ \fi
+ \AtEndOfPackage{%
+ \EnableBabelHook{babel-bidi}%
+ \ifodd\bbl@engine\else
+ \bbl@xebidipar
+ \fi}
+\fi
+% \end{macrocode}
+%
+% Now come the macros used to set the direction when a language is
+% switched. First the (mostly) common macros.
+%
+% \begin{macrocode}
+\bbl@trace{Macros to switch the text direction}
+\def\bbl@alscripts{,Arabic,Syriac,Thaana,}
+\def\bbl@rscripts{% TODO. Base on codes ??
+ ,Imperial Aramaic,Avestan,Cypriot,Hatran,Hebrew,%
+ Old Hungarian,Old Hungarian,Lydian,Mandaean,Manichaean,%
+ Manichaean,Meroitic Cursive,Meroitic,Old North Arabian,%
+ Nabataean,N'Ko,Orkhon,Palmyrene,Inscriptional Pahlavi,%
+ Psalter Pahlavi,Phoenician,Inscriptional Parthian,Samaritan,%
+ Old South Arabian,}%
+\def\bbl@provide@dirs#1{%
+ \bbl@xin@{\csname bbl@sname@#1\endcsname}{\bbl@alscripts\bbl@rscripts}%
+ \ifin@
+ \global\bbl@csarg\chardef{wdir@#1}\@ne
+ \bbl@xin@{\csname bbl@sname@#1\endcsname}{\bbl@alscripts}%
+ \ifin@
+ \global\bbl@csarg\chardef{wdir@#1}\tw@ % useless in xetex
+ \fi
+ \else
+ \global\bbl@csarg\chardef{wdir@#1}\z@
+ \fi
+ \ifodd\bbl@engine
+ \bbl@csarg\ifcase{wdir@#1}%
+ \directlua{ Babel.locale_props[\the\localeid].textdir = 'l' }%
+ \or
+ \directlua{ Babel.locale_props[\the\localeid].textdir = 'r' }%
+ \or
+ \directlua{ Babel.locale_props[\the\localeid].textdir = 'al' }%
+ \fi
+ \fi}
+\def\bbl@switchdir{%
+ \bbl@ifunset{bbl@lsys@\languagename}{\bbl@provide@lsys{\languagename}}{}%
+ \bbl@ifunset{bbl@wdir@\languagename}{\bbl@provide@dirs{\languagename}}{}%
+ \bbl@exp{\\\bbl@setdirs\bbl@cl{wdir}}}
+\def\bbl@setdirs#1{% TODO - math
+ \ifcase\bbl@select@type % TODO - strictly, not the right test
+ \bbl@bodydir{#1}%
+ \bbl@pardir{#1}%
+ \fi
+ \bbl@textdir{#1}}
+% TODO. Only if \bbl@bidimode > 0?:
+\AddBabelHook{babel-bidi}{afterextras}{\bbl@switchdir}
+\DisableBabelHook{babel-bidi}
+% \end{macrocode}
+%
+% Now the engine-dependent macros. TODO. Must be moved to the engine
+% files?
+%
+% \begin{macrocode}
+\ifodd\bbl@engine % luatex=1
+ \chardef\bbl@thetextdir\z@
+ \chardef\bbl@thepardir\z@
+ \def\bbl@getluadir#1{%
+ \directlua{
+ if tex.#1dir == 'TLT' then
+ tex.sprint('0')
+ elseif tex.#1dir == 'TRT' then
+ tex.sprint('1')
+ end}}
+ \def\bbl@setluadir#1#2#3{% 1=text/par.. 2=\textdir.. 3=0 lr/1 rl
+ \ifcase#3\relax
+ \ifcase\bbl@getluadir{#1}\relax\else
+ #2 TLT\relax
+ \fi
+ \else
+ \ifcase\bbl@getluadir{#1}\relax
+ #2 TRT\relax
+ \fi
+ \fi}
+ \def\bbl@textdir#1{%
+ \bbl@setluadir{text}\textdir{#1}%
+ \chardef\bbl@thetextdir#1\relax
+ \setattribute\bbl@attr@dir{\numexpr\bbl@thepardir*3+#1}}
+ \def\bbl@pardir#1{%
+ \bbl@setluadir{par}\pardir{#1}%
+ \chardef\bbl@thepardir#1\relax}
+ \def\bbl@bodydir{\bbl@setluadir{body}\bodydir}
+ \def\bbl@pagedir{\bbl@setluadir{page}\pagedir}
+ \def\bbl@dirparastext{\pardir\the\textdir\relax}% %%%%
+ % Sadly, we have to deal with boxes in math with basic.
+ % Activated every math with the package option bidi=:
+ \def\bbl@mathboxdir{%
+ \ifcase\bbl@thetextdir\relax
+ \everyhbox{\textdir TLT\relax}%
+ \else
+ \everyhbox{\textdir TRT\relax}%
+ \fi}
+ \frozen@everymath\expandafter{%
+ \expandafter\bbl@mathboxdir\the\frozen@everymath}
+ \frozen@everydisplay\expandafter{%
+ \expandafter\bbl@mathboxdir\the\frozen@everydisplay}
+\else % pdftex=0, xetex=2
+ \newcount\bbl@dirlevel
+ \chardef\bbl@thetextdir\z@
+ \chardef\bbl@thepardir\z@
+ \def\bbl@textdir#1{%
+ \ifcase#1\relax
+ \chardef\bbl@thetextdir\z@
+ \bbl@textdir@i\beginL\endL
+ \else
+ \chardef\bbl@thetextdir\@ne
+ \bbl@textdir@i\beginR\endR
+ \fi}
+ \def\bbl@textdir@i#1#2{%
+ \ifhmode
+ \ifnum\currentgrouplevel>\z@
+ \ifnum\currentgrouplevel=\bbl@dirlevel
+ \bbl@error{Multiple bidi settings inside a group}%
+ {I'll insert a new group, but expect wrong results.}%
+ \bgroup\aftergroup#2\aftergroup\egroup
+ \else
+ \ifcase\currentgrouptype\or % 0 bottom
+ \aftergroup#2% 1 simple {}
+ \or
+ \bgroup\aftergroup#2\aftergroup\egroup % 2 hbox
+ \or
+ \bgroup\aftergroup#2\aftergroup\egroup % 3 adj hbox
+ \or\or\or % vbox vtop align
+ \or
+ \bgroup\aftergroup#2\aftergroup\egroup % 7 noalign
+ \or\or\or\or\or\or % output math disc insert vcent mathchoice
+ \or
+ \aftergroup#2% 14 \begingroup
+ \else
+ \bgroup\aftergroup#2\aftergroup\egroup % 15 adj
+ \fi
+ \fi
+ \bbl@dirlevel\currentgrouplevel
+ \fi
+ #1%
+ \fi}
+ \def\bbl@pardir#1{\chardef\bbl@thepardir#1\relax}
+ \let\bbl@bodydir\@gobble
+ \let\bbl@pagedir\@gobble
+ \def\bbl@dirparastext{\chardef\bbl@thepardir\bbl@thetextdir}
+% \end{macrocode}
+%
+% The following command is executed only if there is a right-to-left
+% script (once). It activates the |\everypar| hack for \xetex, to
+% properly handle the par direction. Note text and par dirs are
+% decoupled to some extent (although not completely).
+%
+% \begin{macrocode}
+ \def\bbl@xebidipar{%
+ \let\bbl@xebidipar\relax
+ \TeXXeTstate\@ne
+ \def\bbl@xeeverypar{%
+ \ifcase\bbl@thepardir
+ \ifcase\bbl@thetextdir\else\beginR\fi
+ \else
+ {\setbox\z@\lastbox\beginR\box\z@}%
+ \fi}%
+ \let\bbl@severypar\everypar
+ \newtoks\everypar
+ \everypar=\bbl@severypar
+ \bbl@severypar{\bbl@xeeverypar\the\everypar}}
+ \ifnum\bbl@bidimode>200
+ \let\bbl@textdir@i\@gobbletwo
+ \let\bbl@xebidipar\@empty
+ \AddBabelHook{bidi}{foreign}{%
+ \def\bbl@tempa{\def\BabelText####1}%
+ \ifcase\bbl@thetextdir
+ \expandafter\bbl@tempa\expandafter{\BabelText{\LR{##1}}}%
+ \else
+ \expandafter\bbl@tempa\expandafter{\BabelText{\RL{##1}}}%
+ \fi}
+ \def\bbl@pardir#1{\ifcase#1\relax\setLR\else\setRL\fi}
+ \fi
+\fi
+% \end{macrocode}
+%
+% A tool for weak L (mainly digits). We also disable warnings with
+% \textsf{hyperref}.
+%
+% \begin{macrocode}
+\DeclareRobustCommand\babelsublr[1]{\leavevmode{\bbl@textdir\z@#1}}
+\AtBeginDocument{%
+ \ifx\pdfstringdefDisableCommands\@undefined\else
+ \ifx\pdfstringdefDisableCommands\relax\else
+ \pdfstringdefDisableCommands{\let\babelsublr\@firstofone}%
+ \fi
+ \fi}
+% \end{macrocode}
+%
+% \subsection{Local Language Configuration}
+%
+% \begin{macro}{\loadlocalcfg}
+%
+% At some sites it may be necessary to add site-specific actions to
+% a language definition file. This can be done by creating a file
+% with the same name as the language definition file, but with the
+% extension \file{.cfg}. For instance the file \file{norsk.cfg}
+% will be loaded when the language definition file \file{norsk.ldf}
+% is loaded.
+%
+% For plain-based formats we don't want to override the definition
+% of |\loadlocalcfg| from \file{plain.def}.
+%
+% \begin{macrocode}
+\bbl@trace{Local Language Configuration}
+\ifx\loadlocalcfg\@undefined
+ \@ifpackagewith{babel}{noconfigs}%
+ {\let\loadlocalcfg\@gobble}%
+ {\def\loadlocalcfg#1{%
+ \InputIfFileExists{#1.cfg}%
+ {\typeout{*************************************^^J%
+ * Local config file #1.cfg used^^J%
+ *}}%
+ \@empty}}
+\fi
+% \end{macrocode}%
+% \end{macro}
+%
+% Just to be compatible with \LaTeX$\:$2.09 we add a few more lines
+% of code. TODO. Necessary? Correct place? Used by some ldf file?
+%
+% \begin{macrocode}
+\ifx\@unexpandable@protect\@undefined
+ \def\@unexpandable@protect{\noexpand\protect\noexpand}
+ \long\def\protected@write#1#2#3{%
+ \begingroup
+ \let\thepage\relax
+ #2%
+ \let\protect\@unexpandable@protect
+ \edef\reserved@a{\write#1{#3}}%
+ \reserved@a
+ \endgroup
+ \if@nobreak\ifvmode\nobreak\fi\fi}
+\fi
+%
% \subsection{Language options}
%
-% Languages are loaded when processing the corresponding option
-% \textit{except} if a |main| language has been set. In such a
-% case, it is not loaded until all options has been processed.
-% The following macro inputs the ldf file and does some additional
-% checks (|\input| works, too, but possible errors are not catched).
+% Languages are loaded when processing the corresponding option
+% \textit{except} if a |main| language has been set. In such a
+% case, it is not loaded until all options has been processed.
+% The following macro inputs the ldf file and does some additional
+% checks (|\input| works, too, but possible errors are not catched).
%
% \begin{macrocode}
\bbl@trace{Language options}
@@ -5239,21 +6716,21 @@ help from Bernd Raichle, for which I am grateful.
{\bbl@error{%
Unknown option `\CurrentOption'. Either you misspelled it\\%
or the language definition file \CurrentOption.ldf was not found}{%
- Valid options are: shorthands=, KeepShorthandsActive,\\%
+ Valid options are, among others: shorthands=, KeepShorthandsActive,\\%
activeacute, activegrave, noconfigs, safe=, main=, math=\\%
headfoot=, strings=, config=, hyphenmap=, or a language name.}}}
% \end{macrocode}
%
-% Now, we set language options whose names are different from |ldf| files.
+% Now, we set a few language options whose names are different from
+% |ldf| files. These declarations are preserved for backwards
+% compatibility, but they must be eventually removed. Use proxy files
+% instead.
%
% \begin{macrocode}
\def\bbl@try@load@lang#1#2#3{%
- \IfFileExists{\CurrentOption.ldf}%
- {\bbl@load@language{\CurrentOption}}%
- {#1\bbl@load@language{#2}#3}}
-\DeclareOption{afrikaans}{\bbl@try@load@lang{}{dutch}{}}
-\DeclareOption{brazil}{\bbl@try@load@lang{}{portuges}{}}
-\DeclareOption{brazilian}{\bbl@try@load@lang{}{portuges}{}}
+ \IfFileExists{\CurrentOption.ldf}%
+ {\bbl@load@language{\CurrentOption}}%
+ {#1\bbl@load@language{#2}#3}}
\DeclareOption{hebrew}{%
\input{rlbabel.def}%
\bbl@load@language{hebrew}}
@@ -5262,19 +6739,18 @@ help from Bernd Raichle, for which I am grateful.
\DeclareOption{nynorsk}{\bbl@try@load@lang{}{norsk}{}}
\DeclareOption{polutonikogreek}{%
\bbl@try@load@lang{}{greek}{\languageattribute{greek}{polutoniko}}}
-\DeclareOption{portuguese}{\bbl@try@load@lang{}{portuges}{}}
\DeclareOption{russian}{\bbl@try@load@lang{}{russianb}{}}
\DeclareOption{ukrainian}{\bbl@try@load@lang{}{ukraineb}{}}
\DeclareOption{uppersorbian}{\bbl@try@load@lang{}{usorbian}{}}
% \end{macrocode}
%
-% Another way to extend the list of `known' options for \babel\ was
-% to create the file \file{bblopts.cfg} in which one can add option
-% declarations. However, this mechanism is deprecated -- if you
-% want an alternative name for a language, just create a new |.ldf|
-% file loading the actual one. You can also set the name
-% of the file with the package option |config=<name>|, which will
-% load |<name>.cfg| instead.
+% Another way to extend the list of `known' options for \babel\ was
+% to create the file \file{bblopts.cfg} in which one can add option
+% declarations. However, this mechanism is deprecated -- if you
+% want an alternative name for a language, just create a new |.ldf|
+% file loading the actual one. You can also set the name
+% of the file with the package option |config=<name>|, which will
+% load |<name>.cfg| instead.
%
% \begin{macrocode}
\ifx\bbl@opt@config\@nnil
@@ -5295,57 +6771,102 @@ help from Bernd Raichle, for which I am grateful.
\fi
% \end{macrocode}
%
-% Recognizing global options in packages not having a closed set of
-% them is not trivial, as for them to be processed they must be
-% defined explicitly. So, package options not yet taken into
-% account and stored in |bbl@language@opts| are assumed to be
-% languages (note this list also contains the language given with
-% |main|). If not declared above, the names of the option and the
-% file are the same.
+% Recognizing global options in packages not having a closed set of
+% them is not trivial, as for them to be processed they must be
+% defined explicitly. So, package options not yet taken into
+% account and stored in |bbl@language@opts| are assumed to be
+% languages (note this list also contains the language given with
+% |main|). If not declared above, the names of the option and the
+% file are the same.
%
% \begin{macrocode}
-\bbl@for\bbl@tempa\bbl@language@opts{%
- \bbl@ifunset{ds@\bbl@tempa}%
- {\edef\bbl@tempb{%
- \noexpand\DeclareOption
- {\bbl@tempa}%
- {\noexpand\bbl@load@language{\bbl@tempa}}}%
- \bbl@tempb}%
- \@empty}
+\let\bbl@tempc\relax
+\bbl@foreach\bbl@language@opts{%
+ \ifcase\bbl@iniflag % Default
+ \bbl@ifunset{ds@#1}%
+ {\DeclareOption{#1}{\bbl@load@language{#1}}}%
+ {}%
+ \or % provide=*
+ \@gobble % case 2 same as 1
+ \or % provide+=*
+ \bbl@ifunset{ds@#1}%
+ {\IfFileExists{#1.ldf}{}%
+ {\IfFileExists{babel-#1.tex}{}{\@namedef{ds@#1}{}}}}%
+ {}%
+ \bbl@ifunset{ds@#1}%
+ {\def\bbl@tempc{#1}%
+ \DeclareOption{#1}{%
+ \ifnum\bbl@iniflag>\@ne
+ \bbl@ldfinit
+ \babelprovide[import]{#1}%
+ \bbl@afterldf{}%
+ \else
+ \bbl@load@language{#1}%
+ \fi}}%
+ {}%
+ \or % provide*=*
+ \def\bbl@tempc{#1}%
+ \bbl@ifunset{ds@#1}%
+ {\DeclareOption{#1}{%
+ \bbl@ldfinit
+ \babelprovide[import]{#1}%
+ \bbl@afterldf{}}}%
+ {}%
+ \fi}
% \end{macrocode}
%
-% Now, we make sure an option is explicitly declared for any
-% language set as global option, by checking if an |ldf|
-% exists. The previous step was, in fact, somewhat redundant, but
-% that way we minimize accesing the file system just to see if the
-% option could be a language.
+% Now, we make sure an option is explicitly declared for any language
+% set as global option, by checking if an |ldf| exists. The previous
+% step was, in fact, somewhat redundant, but that way we minimize
+% accessing the file system just to see if the option could be a
+% language.
%
% \begin{macrocode}
+\let\bbl@tempb\@nnil
\bbl@foreach\@classoptionslist{%
\bbl@ifunset{ds@#1}%
- {\IfFileExists{#1.ldf}%
- {\DeclareOption{#1}{\bbl@load@language{#1}}}%
- {}}%
+ {\IfFileExists{#1.ldf}{}%
+ {\IfFileExists{babel-#1.tex}{}{\@namedef{ds@#1}{}}}}%
+ {}%
+ \bbl@ifunset{ds@#1}%
+ {\def\bbl@tempb{#1}%
+ \DeclareOption{#1}{%
+ \ifnum\bbl@iniflag>\@ne
+ \bbl@ldfinit
+ \babelprovide[import]{#1}%
+ \bbl@afterldf{}%
+ \else
+ \bbl@load@language{#1}%
+ \fi}}%
{}}
% \end{macrocode}
%
% If a main language has been set, store it for the third pass.
%
% \begin{macrocode}
+\ifnum\bbl@iniflag=\z@\else
+ \ifx\bbl@opt@main\@nnil
+ \ifx\bbl@tempc\relax
+ \let\bbl@opt@main\bbl@tempb
+ \else
+ \let\bbl@opt@main\bbl@tempc
+ \fi
+ \fi
+\fi
\ifx\bbl@opt@main\@nnil\else
\expandafter
\let\expandafter\bbl@loadmain\csname ds@\bbl@opt@main\endcsname
- \DeclareOption{\bbl@opt@main}{}
+ \expandafter\let\csname ds@\bbl@opt@main\endcsname\@empty
\fi
% \end{macrocode}
%
-% And we are done, because all options for this pass has been
-% declared. Those already processed in the first pass are just
-% ignored.
+% And we are done, because all options for this pass has been
+% declared. Those already processed in the first pass are just
+% ignored.
%
-% The options have to be processed in the order in which the user
-% specified them (except, of course, global options, which \LaTeX{}
-% processes before):
+% The options have to be processed in the order in which the user
+% specified them (except, of course, global options, which \LaTeX{}
+% processes before):
%
% \begin{macrocode}
\def\AfterBabelLanguage#1{%
@@ -5354,15 +6875,16 @@ help from Bernd Raichle, for which I am grateful.
\ProcessOptions*
% \end{macrocode}
%
-% This finished the second pass. Now the third one begins, which
-% loads the main language set with the key |main|. A warning is
-% raised if the main language is not the same as the last named
-% one, or if the value of the key |main| is not a language. Then
-% execute directly the option (because it could be used only in
-% |main|). After loading all languages, we deactivate
-% |\AfterBabelLanguage|.
+% This finished the second pass. Now the third one begins, which
+% loads the main language set with the key |main|. A warning is
+% raised if the main language is not the same as the last named
+% one, or if the value of the key |main| is not a language. Then
+% execute directly the option (because it could be used only in
+% |main|). After loading all languages, we deactivate
+% |\AfterBabelLanguage|.
%
% \begin{macrocode}
+\bbl@trace{Option 'main'}
\ifx\bbl@opt@main\@nnil
\edef\bbl@tempa{\@classoptionslist,\bbl@language@opts}
\let\bbl@tempc\@empty
@@ -5380,10 +6902,18 @@ help from Bernd Raichle, for which I am grateful.
option. Reported}%
\fi
\else
- \DeclareOption{\bbl@opt@main}{\bbl@loadmain}
- \ExecuteOptions{\bbl@opt@main}
- \DeclareOption*{}
- \ProcessOptions*
+ \ifodd\bbl@iniflag % case 1,3
+ \bbl@ldfinit
+ \let\CurrentOption\bbl@opt@main
+ \bbl@exp{\\\babelprovide[import,main]{\bbl@opt@main}}
+ \bbl@afterldf{}%
+ \else % case 0,2
+ \chardef\bbl@iniflag\z@ % Force ldf
+ \expandafter\let\csname ds@\bbl@opt@main\endcsname\bbl@loadmain
+ \ExecuteOptions{\bbl@opt@main}
+ \DeclareOption*{}%
+ \ProcessOptions*
+ \fi
\fi
\def\AfterBabelLanguage{%
\bbl@error
@@ -5391,10 +6921,10 @@ help from Bernd Raichle, for which I am grateful.
{Languages have been loaded, so I can do nothing}}
% \end{macrocode}
%
-% In order to catch the case where the user forgot to specify a
-% language we check whether |\bbl@main@language|, has become
-% defined. If not, no language has been loaded and an error
-% message is displayed.
+% In order to catch the case where the user forgot to specify a
+% language we check whether |\bbl@main@language|, has become
+% defined. If not, no language has been loaded and an error
+% message is displayed.
%
% \begin{macrocode}
\ifx\bbl@main@language\@undefined
@@ -5409,18 +6939,11 @@ help from Bernd Raichle, for which I am grateful.
%
% \section{The kernel of Babel (\texttt{babel.def}, common)}
%
-% The kernel of the \babel\ system is stored in either
-% \file{hyphen.cfg} or \file{switch.def} and \file{babel.def}. The
-% file \file{babel.def} contains most of the code, while
-% \file{switch.def} defines the language-switching commands; both can
-% be read at run time. The file \file{hyphen.cfg} is a file that can
-% be loaded into the format, which is necessary when you want to be
-% able to switch hyphenation patterns (by default, it also inputs
-% \file{switch.def}, for ``historical reasons'', but it is not
-% necessary). When \file{babel.def} is loaded it checks if the current
-% version of \file{switch.def} is in the format; if not, it is
-% loaded. A further file, \file{babel.sty}, contains \LaTeX-specific
-% stuff.
+% The kernel of the \babel\ system is currently stored in
+% \file{babel.def}. The file \file{babel.def} contains most of the
+% code. The file \file{hyphen.cfg} is a file that can be loaded into
+% the format, which is necessary when you want to be able to switch
+% hyphenation patterns.
%
% Because plain \TeX\ users might want to use some of the features of
% the \babel{} system too, care has to be taken that plain \TeX\ can
@@ -5437,13 +6960,10 @@ help from Bernd Raichle, for which I am grateful.
% \subsection{Tools}
%
% \begin{macrocode}
-\ifx\ldf@quit\@undefined
-\else
- \expandafter\endinput
-\fi
+\ifx\ldf@quit\@undefined\else
+\endinput\fi % Same line!
<@Make sure ProvidesFile is defined@>
\ProvidesFile{babel.def}[<@date@> <@version@> Babel common definitions]
-<@Load macros for plain if not LaTeX@>
% \end{macrocode}
%
% The file |babel.def| expects some definitions made in the \LaTeXe{}
@@ -5456,7 +6976,9 @@ help from Bernd Raichle, for which I am grateful.
% set too (but not sure it works).
%
% \begin{macrocode}
-\ifx\bbl@ifshorthand\@undefined
+\ifx\AtBeginDocument\@undefined % TODO. change test.
+ <@Emulate LaTeX@>
+ \def\languagename{english}%
\let\bbl@opt@shorthands\@nnil
\def\bbl@ifshorthand#1#2#3{#2}%
\let\bbl@language@opts\@empty
@@ -5477,20 +6999,990 @@ help from Bernd Raichle, for which I am grateful.
\ifx\@uclclist\@undefined\let\@uclclist\@empty\fi
\ifx\bbl@trace\@undefined\def\bbl@trace#1{}\fi
\expandafter\newif\csname ifbbl@single\endcsname
+ \chardef\bbl@bidimode\z@
\fi
% \end{macrocode}
%
+% Exit immediately with 2.09. An error is raised by the sty file, but
+% also try to minimize the number of errors.
+%
+% \begin{macrocode}
+\ifx\bbl@trace\@undefined
+ \let\LdfInit\endinput
+ \def\ProvidesLanguage#1{\endinput}
+\endinput\fi % Same line!
+% \end{macrocode}
+%
% And continue.
%
+% \section{Multiple languages}
+%
+% This is not a separate file (\texttt{switch.def}) anymore.
+%
+% Plain \TeX\ version~3.0 provides the primitive |\language| that
+% is used to store the current language. When used with a pre-3.0
+% version this function has to be implemented by allocating a
+% counter.
+%
+% \begin{macrocode}
+<@Define core switching macros@>
+% \end{macrocode}
+%
+% \begin{macro}{\adddialect}
+% The macro |\adddialect| can be used to add the name of a dialect
+% or variant language, for which an already defined hyphenation
+% table can be used.
+%
+% \begin{macrocode}
+\def\bbl@version{<@version@>}
+\def\bbl@date{<@date@>}
+\def\adddialect#1#2{%
+ \global\chardef#1#2\relax
+ \bbl@usehooks{adddialect}{{#1}{#2}}%
+ \begingroup
+ \count@#1\relax
+ \def\bbl@elt##1##2##3##4{%
+ \ifnum\count@=##2\relax
+ \bbl@info{\string#1 = using hyphenrules for ##1\\%
+ (\string\language\the\count@)}%
+ \def\bbl@elt####1####2####3####4{}%
+ \fi}%
+ \bbl@cs{languages}%
+ \endgroup}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% |\bbl@iflanguage| executes code only if the language |l@|
+% exists. Otherwise raises and error.
+%
+% The argument of |\bbl@fixname| has to be a macro name, as it may get
+% ``fixed'' if casing (lc/uc) is wrong. It's intented to fix a
+% long-standing bug when |\foreignlanguage| and the like appear in
+% a |\MakeXXXcase|. However, a lowercase form is not imposed to
+% improve backward compatibility (perhaps you defined a language
+% named |MYLANG|, but unfortunately mixed case names cannot be
+% trapped). Note |l@| is encapsulated, so that its case does not
+% change.
+%
+% \begin{macrocode}
+\def\bbl@fixname#1{%
+ \begingroup
+ \def\bbl@tempe{l@}%
+ \edef\bbl@tempd{\noexpand\@ifundefined{\noexpand\bbl@tempe#1}}%
+ \bbl@tempd
+ {\lowercase\expandafter{\bbl@tempd}%
+ {\uppercase\expandafter{\bbl@tempd}%
+ \@empty
+ {\edef\bbl@tempd{\def\noexpand#1{#1}}%
+ \uppercase\expandafter{\bbl@tempd}}}%
+ {\edef\bbl@tempd{\def\noexpand#1{#1}}%
+ \lowercase\expandafter{\bbl@tempd}}}%
+ \@empty
+ \edef\bbl@tempd{\endgroup\def\noexpand#1{#1}}%
+ \bbl@tempd
+ \bbl@exp{\\\bbl@usehooks{languagename}{{\languagename}{#1}}}}
+\def\bbl@iflanguage#1{%
+ \@ifundefined{l@#1}{\@nolanerr{#1}\@gobble}\@firstofone}
+% \end{macrocode}
+%
+% After a name has been ‘fixed’, the selectors will try to load the
+% language. If even the fixed name is not defined, will load it on the
+% fly, either based on its name, or if activated, its BCP47 code.
+%
+% We first need a couple of macros for a simple BCP 47 look up. It also
+% makes sure, with |\bbl@bcpcase|, casing is the correct one, so that
+% sr-latn-ba becomes fr-Latn-BA. Note |#4| may contain some
+% |\@empty|'s, but they are eventually removed. |\bbl@bcplookup| either
+% returns the found |ini| or it is |\relax|.
+%
+% \begin{macrocode}
+\def\bbl@bcpcase#1#2#3#4\@@#5{%
+ \ifx\@empty#3%
+ \uppercase{\def#5{#1#2}}%
+ \else
+ \uppercase{\def#5{#1}}%
+ \lowercase{\edef#5{#5#2#3#4}}%
+ \fi}
+\def\bbl@bcplookup#1-#2-#3-#4\@@{%
+ \let\bbl@bcp\relax
+ \lowercase{\def\bbl@tempa{#1}}%
+ \ifx\@empty#2%
+ \IfFileExists{babel-\bbl@tempa.ini}{\let\bbl@bcp\bbl@tempa}{}%
+ \else\ifx\@empty#3%
+ \bbl@bcpcase#2\@empty\@empty\@@\bbl@tempb
+ \IfFileExists{babel-\bbl@tempa-\bbl@tempb.ini}%
+ {\edef\bbl@bcp{\bbl@tempa-\bbl@tempb}}%
+ {}%
+ \ifx\bbl@bcp\relax
+ \IfFileExists{babel-\bbl@tempa.ini}{\let\bbl@bcp\bbl@tempa}{}%
+ \fi
+ \else
+ \bbl@bcpcase#2\@empty\@empty\@@\bbl@tempb
+ \bbl@bcpcase#3\@empty\@empty\@@\bbl@tempc
+ \IfFileExists{babel-\bbl@tempa-\bbl@tempb-\bbl@tempc.ini}%
+ {\edef\bbl@bcp{\bbl@tempa-\bbl@tempb-\bbl@tempc}}%
+ {}%
+ \ifx\bbl@bcp\relax
+ \IfFileExists{babel-\bbl@tempa-\bbl@tempc.ini}%
+ {\edef\bbl@bcp{\bbl@tempa-\bbl@tempc}}%
+ {}%
+ \fi
+ \ifx\bbl@bcp\relax
+ \IfFileExists{babel-\bbl@tempa-\bbl@tempc.ini}%
+ {\edef\bbl@bcp{\bbl@tempa-\bbl@tempc}}%
+ {}%
+ \fi
+ \ifx\bbl@bcp\relax
+ \IfFileExists{babel-\bbl@tempa.ini}{\let\bbl@bcp\bbl@tempa}{}%
+ \fi
+ \fi\fi}
+\let\bbl@initoload\relax
+\def\bbl@provide@locale{%
+ \ifx\babelprovide\@undefined
+ \bbl@error{For a language to be defined on the fly 'base'\\%
+ is not enough, and the whole package must be\\%
+ loaded. Either delete the 'base' option or\\%
+ request the languages explicitly}%
+ {See the manual for further details.}%
+ \fi
+% TODO. Option to search if loaded, with \LocaleForEach
+ \let\bbl@auxname\languagename % Still necessary. TODO
+ \bbl@ifunset{bbl@bcp@map@\languagename}{}% Move uplevel??
+ {\edef\languagename{\@nameuse{bbl@bcp@map@\languagename}}}%
+ \ifbbl@bcpallowed
+ \expandafter\ifx\csname date\languagename\endcsname\relax
+ \expandafter
+ \bbl@bcplookup\languagename-\@empty-\@empty-\@empty\@@
+ \ifx\bbl@bcp\relax\else % Returned by \bbl@bcplookup
+ \edef\languagename{\bbl@bcp@prefix\bbl@bcp}%
+ \edef\localename{\bbl@bcp@prefix\bbl@bcp}%
+ \expandafter\ifx\csname date\languagename\endcsname\relax
+ \let\bbl@initoload\bbl@bcp
+ \bbl@exp{\\\babelprovide[\bbl@autoload@bcpoptions]{\languagename}}%
+ \let\bbl@initoload\relax
+ \fi
+ \bbl@csarg\xdef{bcp@map@\bbl@bcp}{\localename}%
+ \fi
+ \fi
+ \fi
+ \expandafter\ifx\csname date\languagename\endcsname\relax
+ \IfFileExists{babel-\languagename.tex}%
+ {\bbl@exp{\\\babelprovide[\bbl@autoload@options]{\languagename}}}%
+ {}%
+ \fi}
+% \end{macrocode}
+%
+% \begin{macro}{\iflanguage}
+% Users might want to test (in a private package for instance)
+% which language is currently active. For this we provide a test
+% macro, |\iflanguage|, that has three arguments. It checks
+% whether the first argument is a known language. If so, it
+% compares the first argument with the value of |\language|. Then,
+% depending on the result of the comparison, it executes either the
+% second or the third argument.
+%
+% \begin{macrocode}
+\def\iflanguage#1{%
+ \bbl@iflanguage{#1}{%
+ \ifnum\csname l@#1\endcsname=\language
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \subsection{Selecting the language}
+%
+% \begin{macro}{\selectlanguage}
+%
+% The macro |\selectlanguage| checks whether the language is
+% already defined before it performs its actual task, which is to
+% update |\language| and activate language-specific definitions.
+%
+% \begin{macrocode}
+\let\bbl@select@type\z@
+\edef\selectlanguage{%
+ \noexpand\protect
+ \expandafter\noexpand\csname selectlanguage \endcsname}
+% \end{macrocode}
+%
+% Because the command |\selectlanguage| could be used in a moving
+% argument it expands to \verb*=\protect\selectlanguage =.
+% Therefore, we have to make sure that a macro |\protect| exists.
+% If it doesn't it is |\let| to |\relax|.
+%
+% \begin{macrocode}
+\ifx\@undefined\protect\let\protect\relax\fi
+% \end{macrocode}
+%
+% The following definition is preserved for backwards compatibility. It
+% is related to a trick for 2.09.
+%
+% \begin{macrocode}
+\let\xstring\string
+% \end{macrocode}
+%
+% \end{macro}
+%
+% Since version 3.5 \babel\ writes entries to the auxiliary files in
+% order to typeset table of contents etc. in the correct language
+% environment.
+%
+% \begin{macro}{\bbl@pop@language}
+%
+% \emph{But} when the language change happens \emph{inside} a group
+% the end of the group doesn't write anything to the auxiliary
+% files. Therefore we need \TeX's |aftergroup| mechanism to help
+% us. The command |\aftergroup| stores the token immediately
+% following it to be executed when the current group is closed. So
+% we define a temporary control sequence |\bbl@pop@language| to be
+% executed at the end of the group. It calls |\bbl@set@language|
+% with the name of the current language as its argument.
+%
+% \begin{macro}{\bbl@language@stack}
+% The previous solution works for one level of nesting groups, but
+% as soon as more levels are used it is no longer adequate. For
+% that case we need to keep track of the nested languages using a
+% stack mechanism. This stack is called |\bbl@language@stack| and
+% initially empty.
+%
+% \begin{macrocode}
+\def\bbl@language@stack{}
+% \end{macrocode}
+%
+% When using a stack we need a mechanism to push an element on the
+% stack and to retrieve the information afterwards.
+%
+% \begin{macro}{\bbl@push@language}
+% \begin{macro}{\bbl@pop@language}
+% The stack is simply a list of languagenames, separated with a `+'
+% sign; the push function can be simple:
+%
+% \begin{macrocode}
+\def\bbl@push@language{%
+ \ifx\languagename\@undefined\else
+ \xdef\bbl@language@stack{\languagename+\bbl@language@stack}%
+ \fi}
+% \end{macrocode}
+%
+% Retrieving information from the stack is a little bit less simple, as
+% we need to remove the element from the stack while storing it in the
+% macro |\languagename|. For this we first define a helper function.
+% \begin{macro}{\bbl@pop@lang}
+% This macro stores its first element (which is delimited by the
+% `+'-sign) in |\languagename| and stores the rest of the string
+% in |\bbl@language@stack|.
+%
+% \begin{macrocode}
+\def\bbl@pop@lang#1+#2\@@{%
+ \edef\languagename{#1}%
+ \xdef\bbl@language@stack{#2}}
+% \end{macrocode}
+%
+% \end{macro}
+% The reason for the somewhat weird arrangement of arguments to the
+% helper function is the fact it is called in the following way.
+% This means that before |\bbl@pop@lang| is executed \TeX\ first
+% \emph{expands} the stack, stored in |\bbl@language@stack|. The
+% result of that is that the argument string of |\bbl@pop@lang|
+% contains one or more language names, each followed by a `+'-sign
+% (zero language names won't occur as this macro will only be
+% called after something has been pushed on the stack).
+%
+% \begin{macrocode}
+\let\bbl@ifrestoring\@secondoftwo
+\def\bbl@pop@language{%
+ \expandafter\bbl@pop@lang\bbl@language@stack\@@
+ \let\bbl@ifrestoring\@firstoftwo
+ \expandafter\bbl@set@language\expandafter{\languagename}%
+ \let\bbl@ifrestoring\@secondoftwo}
+% \end{macrocode}
+%
+% Once the name of the previous language is retrieved from the stack,
+% it is fed to |\bbl@set@language| to do the actual work of
+% switching everything that needs switching.
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% An alternative way to identify languages (in the \babel{} sense)
+% with a numerical value is introduced in 3.30. This is one of the
+% first steps for a new interface based on the concept of locale,
+% which explains the name of |\localeid|. This means |\l@...| will be
+% reserved for hyphenation patterns (so that two locales can share the
+% same rules).
+%
+% \begin{macrocode}
+\chardef\localeid\z@
+\def\bbl@id@last{0} % No real need for a new counter
+\def\bbl@id@assign{%
+ \bbl@ifunset{bbl@id@@\languagename}%
+ {\count@\bbl@id@last\relax
+ \advance\count@\@ne
+ \bbl@csarg\chardef{id@@\languagename}\count@
+ \edef\bbl@id@last{\the\count@}%
+ \ifcase\bbl@engine\or
+ \directlua{
+ Babel = Babel or {}
+ Babel.locale_props = Babel.locale_props or {}
+ Babel.locale_props[\bbl@id@last] = {}
+ Babel.locale_props[\bbl@id@last].name = '\languagename'
+ }%
+ \fi}%
+ {}%
+ \chardef\localeid\bbl@cl{id@}}
+% \end{macrocode}
+%
+% The unprotected part of |\selectlanguage|.
+%
+% \begin{macrocode}
+\expandafter\def\csname selectlanguage \endcsname#1{%
+ \ifnum\bbl@hymapsel=\@cclv\let\bbl@hymapsel\tw@\fi
+ \bbl@push@language
+ \aftergroup\bbl@pop@language
+ \bbl@set@language{#1}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\bbl@set@language}
+%
+% The macro |\bbl@set@language| takes care of switching the language
+% environment \emph{and} of writing entries on the auxiliary files.
+% For historial reasons, language names can be either |language| of
+% |\language|. To catch either form a trick is used, but
+% unfortunately as a side effect the catcodes of letters in
+% |\languagename| are messed up. This is a bug, but preserved for
+% backwards compatibility. The list of auxiliary files can be
+% extended by redefining |\BabelContentsFiles|, but make sure they
+% are loaded inside a group (as |aux|, |toc|, |lof|, and |lot| do)
+% or the last language of the document will remain active
+% afterwards.
+%
+% We also write a command to change the current language in the
+% auxiliary files.
+%
+% \begin{macrocode}
+\def\BabelContentsFiles{toc,lof,lot}
+\def\bbl@set@language#1{% from selectlanguage, pop@
+ % The old buggy way. Preserved for compatibility.
+ \edef\languagename{%
+ \ifnum\escapechar=\expandafter`\string#1\@empty
+ \else\string#1\@empty\fi}%
+ \ifcat\relax\noexpand#1%
+ \expandafter\ifx\csname date\languagename\endcsname\relax
+ \edef\languagename{#1}%
+ \let\localename\languagename
+ \else
+ \bbl@info{Using '\string\language' instead of 'language' is\\%
+ deprecated. If what you want is to use a\\%
+ macro containing the actual locale, make\\%
+ sure it does not not match any language.\\%
+ Reported}%
+% I'll\\%
+% try to fix '\string\localename', but I cannot promise\\%
+% anything. Reported}%
+ \ifx\scantokens\@undefined
+ \def\localename{??}%
+ \else
+ \scantokens\expandafter{\expandafter
+ \def\expandafter\localename\expandafter{\languagename}}%
+ \fi
+ \fi
+ \else
+ \def\localename{#1}% This one has the correct catcodes
+ \fi
+ \select@language{\languagename}%
+ % write to auxs
+ \expandafter\ifx\csname date\languagename\endcsname\relax\else
+ \if@filesw
+ \ifx\babel@aux\@gobbletwo\else % Set if single in the first, redundant
+ % \bbl@savelastskip
+ \protected@write\@auxout{}{\string\babel@aux{\bbl@auxname}{}}%
+ % \bbl@restorelastskip
+ \fi
+ \bbl@usehooks{write}{}%
+ \fi
+ \fi}
+% The following is used above to deal with skips before the write
+% whatsit. Adapted from hyperref, but it might fail, so for the moment
+% it's not activated. TODO.
+\def\bbl@savelastskip{%
+ \let\bbl@restorelastskip\relax
+ \ifvmode
+ \ifdim\lastskip=\z@
+ \let\bbl@restorelastskip\nobreak
+ \else
+ \bbl@exp{%
+ \def\\\bbl@restorelastskip{%
+ \skip@=\the\lastskip
+ \\\nobreak \vskip-\skip@ \vskip\skip@}}%
+ \fi
+ \fi}
+\newif\ifbbl@bcpallowed
+\bbl@bcpallowedfalse
+\def\select@language#1{% from set@, babel@aux
+ % set hymap
+ \ifnum\bbl@hymapsel=\@cclv\chardef\bbl@hymapsel4\relax\fi
+ % set name
+ \edef\languagename{#1}%
+ \bbl@fixname\languagename
+ % TODO. name@map must be here?
+ \bbl@provide@locale
+ \bbl@iflanguage\languagename{%
+ \expandafter\ifx\csname date\languagename\endcsname\relax
+ \bbl@error
+ {Unknown language `\languagename'. Either you have\\%
+ misspelled its name, it has not been installed,\\%
+ or you requested it in a previous run. Fix its name,\\%
+ install it or just rerun the file, respectively. In\\%
+ some cases, you may need to remove the aux file}%
+ {You may proceed, but expect wrong results}%
+ \else
+ % set type
+ \let\bbl@select@type\z@
+ \expandafter\bbl@switch\expandafter{\languagename}%
+ \fi}}
+\def\babel@aux#1#2{% TODO. See how to avoid undefined nil's
+ \select@language{#1}%
+ \bbl@foreach\BabelContentsFiles{%
+ \@writefile{##1}{\babel@toc{#1}{#2}}}}% %% TODO - ok in plain?
+\def\babel@toc#1#2{%
+ \select@language{#1}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% First, check if the user asks for a known language. If so,
+% update the value of |\language| and call |\originalTeX|
+% to bring \TeX\ in a certain pre-defined state.
+%
+% The name of the language is stored in the control sequence
+% |\languagename|.
+%
+% Then we have to \emph{re}define |\originalTeX| to compensate for
+% the things that have been activated. To save memory space for
+% the macro definition of |\originalTeX|, we construct the control
+% sequence name for the |\noextras|\langvar\ command at definition
+% time by expanding the |\csname| primitive.
+%
+% Now activate the language-specific definitions. This is done by
+% constructing the names of three macros by concatenating three
+% words with the argument of |\selectlanguage|, and calling these
+% macros. \nb{What if \cs{hyphenation} was used in |extras|? Patch
+% temporarily |\set@hyphenmins| and hyphenation. It can be done in
+% hooks if necessary.}
+%
+% The switching of the values of |\lefthyphenmin| and
+% |\righthyphenmin| is somewhat different. First we save their
+% current values, then we check if |\|\langvar|hyphenmins| is
+% defined. If it is not, we set default values (2 and 3), otherwise
+% the values in |\|\langvar|hyphenmins| will be used.
+%
+% \begin{macrocode}
+\newif\ifbbl@usedategroup
+\def\bbl@switch#1{% from select@, foreign@
+ % make sure there is info for the language if so requested
+ \bbl@ensureinfo{#1}%
+ % restore
+ \originalTeX
+ \expandafter\def\expandafter\originalTeX\expandafter{%
+ \csname noextras#1\endcsname
+ \let\originalTeX\@empty
+ \babel@beginsave}%
+ \bbl@usehooks{afterreset}{}%
+ \languageshorthands{none}%
+ % set the locale id
+ \bbl@id@assign
+ % switch captions, date
+ % No text is supposed to be added here, so we remove any
+ % spurious spaces.
+ \bbl@bsphack
+ \ifcase\bbl@select@type
+ \csname captions#1\endcsname\relax
+ \csname date#1\endcsname\relax
+ \else
+ \bbl@xin@{,captions,}{,\bbl@select@opts,}%
+ \ifin@
+ \csname captions#1\endcsname\relax
+ \fi
+ \bbl@xin@{,date,}{,\bbl@select@opts,}%
+ \ifin@ % if \foreign... within \<lang>date
+ \csname date#1\endcsname\relax
+ \fi
+ \fi
+ \bbl@esphack
+ % switch extras
+ \bbl@usehooks{beforeextras}{}%
+ \csname extras#1\endcsname\relax
+ \bbl@usehooks{afterextras}{}%
+ % > babel-ensure
+ % > babel-sh-<short>
+ % > babel-bidi
+ % > babel-fontspec
+ % hyphenation - case mapping
+ \ifcase\bbl@opt@hyphenmap\or
+ \def\BabelLower##1##2{\lccode##1=##2\relax}%
+ \ifnum\bbl@hymapsel>4\else
+ \csname\languagename @bbl@hyphenmap\endcsname
+ \fi
+ \chardef\bbl@opt@hyphenmap\z@
+ \else
+ \ifnum\bbl@hymapsel>\bbl@opt@hyphenmap\else
+ \csname\languagename @bbl@hyphenmap\endcsname
+ \fi
+ \fi
+ \let\bbl@hymapsel\@cclv
+ % hyphenation - select patterns
+ \bbl@patterns{#1}%
+ % hyphenation - allow stretching with babelnohyphens
+ \ifnum\language=\l@babelnohyphens
+ \babel@savevariable\emergencystretch
+ \emergencystretch\maxdimen
+ \babel@savevariable\hbadness
+ \hbadness\@M
+ \fi
+ % hyphenation - mins
+ \babel@savevariable\lefthyphenmin
+ \babel@savevariable\righthyphenmin
+ \expandafter\ifx\csname #1hyphenmins\endcsname\relax
+ \set@hyphenmins\tw@\thr@@\relax
+ \else
+ \expandafter\expandafter\expandafter\set@hyphenmins
+ \csname #1hyphenmins\endcsname\relax
+ \fi}
+% \end{macrocode}
+%
+% \begin{environment}{otherlanguage}
+% The \Lenv{otherlanguage} environment can be used as an
+% alternative to using the |\selectlanguage| declarative
+% command. When you are typesetting a document which mixes
+% left-to-right and right-to-left typesetting you have to use this
+% environment in order to let things work as you expect them to.
+%
+% The |\ignorespaces| command is necessary to hide the environment
+% when it is entered in horizontal mode.
+%
+% \begin{macrocode}
+\long\def\otherlanguage#1{%
+ \ifnum\bbl@hymapsel=\@cclv\let\bbl@hymapsel\thr@@\fi
+ \csname selectlanguage \endcsname{#1}%
+ \ignorespaces}
+% \end{macrocode}
+%
+% The |\endotherlanguage| part of the environment tries to hide
+% itself when it is called in horizontal mode.
+%
+% \begin{macrocode}
+\long\def\endotherlanguage{%
+ \global\@ignoretrue\ignorespaces}
+% \end{macrocode}
+%
+% \end{environment}
+%
+% \begin{environment}{otherlanguage*}
+% The \Lenv{otherlanguage} environment is meant to be used when a
+% large part of text from a different language needs to be typeset,
+% but without changing the translation of words such as `figure'.
+% This environment makes use of |\foreign@language|.
+%
+% \begin{macrocode}
+\expandafter\def\csname otherlanguage*\endcsname{%
+ \@ifnextchar[\bbl@otherlanguage@s{\bbl@otherlanguage@s[]}}
+\def\bbl@otherlanguage@s[#1]#2{%
+ \ifnum\bbl@hymapsel=\@cclv\chardef\bbl@hymapsel4\relax\fi
+ \def\bbl@select@opts{#1}%
+ \foreign@language{#2}}
+% \end{macrocode}
+%
+% At the end of the environment we need to switch off the extra
+% definitions. The grouping mechanism of the environment will take
+% care of resetting the correct hyphenation rules and ``extras''.
+%
+% \begin{macrocode}
+\expandafter\let\csname endotherlanguage*\endcsname\relax
+% \end{macrocode}
+%
+% \end{environment}
+%
+% \begin{macro}{\foreignlanguage}
+%
+% The |\foreignlanguage| command is another substitute for the
+% |\selectlanguage| command. This command takes two arguments, the
+% first argument is the name of the language to use for typesetting
+% the text specified in the second argument.
+%
+% Unlike |\selectlanguage| this command doesn't switch
+% \emph{everything}, it only switches the hyphenation rules and the
+% extra definitions for the language specified. It does this within
+% a group and assumes the |\extras|\langvar\ command doesn't make
+% any |\global| changes. The coding is very similar to part of
+% |\selectlanguage|.
+%
+% |\bbl@beforeforeign| is a trick to fix a bug in bidi
+% texts. |\foreignlanguage| is supposed to be a `text' command, and
+% therefore it must emit a |\leavevmode|, but it does not, and
+% therefore the indent is placed on the opposite margin. For
+% backward compatibility, however, it is done only if a
+% right-to-left script is requested; otherwise, it is no-op.
+%
+% (3.11) |\foreignlanguage*| is a temporary, experimental macro for
+% a few lines with a different script direction, while preserving
+% the paragraph format (thank the braces around |\par|, things like
+% |\hangindent| are not reset). Do not use it in production,
+% because its semantics and its syntax may change (and very likely
+% will, or even it could be removed altogether). Currently it
+% enters in vmode and then selects the language (which in turn sets the
+% paragraph direction).
+%
+% (3.11) Also experimental are the hook |foreign| and |foreign*|.
+% With them you can redefine |\BabelText| which by default does
+% nothing. Its behavior is not well defined yet. So, use it in
+% horizontal mode only if you do not want surprises.
+%
+% In other words, at the beginning of a paragraph |\foreignlanguage|
+% enters into hmode with the surrounding lang, and with
+% |\foreignlanguage*| with the new lang.
+%
+% \begin{macrocode}
+\providecommand\bbl@beforeforeign{}
+\edef\foreignlanguage{%
+ \noexpand\protect
+ \expandafter\noexpand\csname foreignlanguage \endcsname}
+\expandafter\def\csname foreignlanguage \endcsname{%
+ \@ifstar\bbl@foreign@s\bbl@foreign@x}
+\providecommand\bbl@foreign@x[3][]{%
+ \begingroup
+ \def\bbl@select@opts{#1}%
+ \let\BabelText\@firstofone
+ \bbl@beforeforeign
+ \foreign@language{#2}%
+ \bbl@usehooks{foreign}{}%
+ \BabelText{#3}% Now in horizontal mode!
+ \endgroup}
+\def\bbl@foreign@s#1#2{% TODO - \shapemode, \@setpar, ?\@@par
+ \begingroup
+ {\par}%
+ \let\BabelText\@firstofone
+ \foreign@language{#1}%
+ \bbl@usehooks{foreign*}{}%
+ \bbl@dirparastext
+ \BabelText{#2}% Still in vertical mode!
+ {\par}%
+ \endgroup}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\foreign@language}
+%
+% This macro does the work for |\foreignlanguage| and the
+% \Lenv{otherlanguage*} environment. First we need to store the name
+% of the language and check that it is a known language. Then it
+% just calls |bbl@switch|.
+%
+% \begin{macrocode}
+\def\foreign@language#1{%
+ % set name
+ \edef\languagename{#1}%
+ \ifbbl@usedategroup
+ \bbl@add\bbl@select@opts{,date,}%
+ \bbl@usedategroupfalse
+ \fi
+ \bbl@fixname\languagename
+ % TODO. name@map here?
+ \bbl@provide@locale
+ \bbl@iflanguage\languagename{%
+ \expandafter\ifx\csname date\languagename\endcsname\relax
+ \bbl@warning % TODO - why a warning, not an error?
+ {Unknown language `#1'. Either you have\\%
+ misspelled its name, it has not been installed,\\%
+ or you requested it in a previous run. Fix its name,\\%
+ install it or just rerun the file, respectively. In\\%
+ some cases, you may need to remove the aux file.\\%
+ I'll proceed, but expect wrong results.\\%
+ Reported}%
+ \fi
+ % set type
+ \let\bbl@select@type\@ne
+ \expandafter\bbl@switch\expandafter{\languagename}}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\bbl@patterns}
+%
+% This macro selects the hyphenation patterns by changing the
+% \cs{language} register. If special hyphenation patterns
+% are available specifically for the current font encoding,
+% use them instead of the default.
+%
+% It also sets hyphenation exceptions, but only once, because they
+% are global (here language |\lccode|'s has been set, too).
+% |\bbl@hyphenation@| is set to relax until the very first
+% |\babelhyphenation|, so do nothing with this value. If the
+% exceptions for a language (by its number, not its name, so that
+% |:ENC| is taken into account) has been set, then use
+% |\hyphenation| with both global and language exceptions and empty
+% the latter to mark they must not be set again.
+%
% \begin{macrocode}
-\ifx\bbl@switchflag\@undefined % Prevent double input
- \let\bbl@switchflag\relax
- \input switch.def\relax
+\let\bbl@hyphlist\@empty
+\let\bbl@hyphenation@\relax
+\let\bbl@pttnlist\@empty
+\let\bbl@patterns@\relax
+\let\bbl@hymapsel=\@cclv
+\def\bbl@patterns#1{%
+ \language=\expandafter\ifx\csname l@#1:\f@encoding\endcsname\relax
+ \csname l@#1\endcsname
+ \edef\bbl@tempa{#1}%
+ \else
+ \csname l@#1:\f@encoding\endcsname
+ \edef\bbl@tempa{#1:\f@encoding}%
+ \fi
+ \@expandtwoargs\bbl@usehooks{patterns}{{#1}{\bbl@tempa}}%
+ % > luatex
+ \@ifundefined{bbl@hyphenation@}{}{% Can be \relax!
+ \begingroup
+ \bbl@xin@{,\number\language,}{,\bbl@hyphlist}%
+ \ifin@\else
+ \@expandtwoargs\bbl@usehooks{hyphenation}{{#1}{\bbl@tempa}}%
+ \hyphenation{%
+ \bbl@hyphenation@
+ \@ifundefined{bbl@hyphenation@#1}%
+ \@empty
+ {\space\csname bbl@hyphenation@#1\endcsname}}%
+ \xdef\bbl@hyphlist{\bbl@hyphlist\number\language,}%
+ \fi
+ \endgroup}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{environment}{hyphenrules}
+%
+% The environment \Lenv{hyphenrules} can be used to select
+% \emph{just} the hyphenation rules. This environment does
+% \emph{not} change |\languagename| and when the hyphenation rules
+% specified were not loaded it has no effect. Note however,
+% |\lccode|'s and font encodings are not set at all, so in most
+% cases you should use |otherlanguage*|.
+%
+% \begin{macrocode}
+\def\hyphenrules#1{%
+ \edef\bbl@tempf{#1}%
+ \bbl@fixname\bbl@tempf
+ \bbl@iflanguage\bbl@tempf{%
+ \expandafter\bbl@patterns\expandafter{\bbl@tempf}%
+ \ifx\languageshorthands\@undefined\else
+ \languageshorthands{none}%
+ \fi
+ \expandafter\ifx\csname\bbl@tempf hyphenmins\endcsname\relax
+ \set@hyphenmins\tw@\thr@@\relax
+ \else
+ \expandafter\expandafter\expandafter\set@hyphenmins
+ \csname\bbl@tempf hyphenmins\endcsname\relax
+ \fi}}
+\let\endhyphenrules\@empty
+% \end{macrocode}
+%
+% \end{environment}
+%
+% \begin{macro}{\providehyphenmins}
+% The macro |\providehyphenmins| should be used in the language
+% definition files to provide a \emph{default} setting for the
+% hyphenation parameters |\lefthyphenmin| and |\righthyphenmin|. If
+% the macro |\|\langvar|hyphenmins| is already defined this command
+% has no effect.
+%
+% \begin{macrocode}
+\def\providehyphenmins#1#2{%
+ \expandafter\ifx\csname #1hyphenmins\endcsname\relax
+ \@namedef{#1hyphenmins}{#2}%
+ \fi}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\set@hyphenmins}
+% This macro sets the values of |\lefthyphenmin| and
+% |\righthyphenmin|. It expects two values as its argument.
+%
+% \begin{macrocode}
+\def\set@hyphenmins#1#2{%
+ \lefthyphenmin#1\relax
+ \righthyphenmin#2\relax}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\ProvidesLanguage}
+% The identification code for each file is something that was
+% introduced in \LaTeXe. When the command |\ProvidesFile| does not
+% exist, a dummy definition is provided temporarily. For use in the
+% language definition file the command |\ProvidesLanguage| is
+% defined by \babel.
+%
+% Depending on the format, ie, on if the former is defined, we use
+% a similar definition or not.
+%
+% \begin{macrocode}
+\ifx\ProvidesFile\@undefined
+ \def\ProvidesLanguage#1[#2 #3 #4]{%
+ \wlog{Language: #1 #4 #3 <#2>}%
+ }
+\else
+ \def\ProvidesLanguage#1{%
+ \begingroup
+ \catcode`\ 10 %
+ \@makeother\/%
+ \@ifnextchar[%]
+ {\@provideslanguage{#1}}{\@provideslanguage{#1}[]}}
+ \def\@provideslanguage#1[#2]{%
+ \wlog{Language: #1 #2}%
+ \expandafter\xdef\csname ver@#1.ldf\endcsname{#2}%
+ \endgroup}
\fi
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\originalTeX}
+% The macro|\originalTeX| should be known to \TeX\ at this moment.
+% As it has to be expandable we |\let| it to |\@empty| instead of
+% |\relax|.
+%
+% \begin{macrocode}
+\ifx\originalTeX\@undefined\let\originalTeX\@empty\fi
+% \end{macrocode}
+%
+% Because this part of the code can be included in a format, we
+% make sure that the macro which initializes the save mechanism,
+% |\babel@beginsave|, is not considered to be undefined.
+%
+% \begin{macrocode}
+\ifx\babel@beginsave\@undefined\let\babel@beginsave\relax\fi
+% \end{macrocode}
+%
+% \end{macro}
+%
+% A few macro names are reserved for future releases of \babel, which
+% will use the concept of `locale':
+%
+% \begin{macrocode}
+\providecommand\setlocale{%
+ \bbl@error
+ {Not yet available}%
+ {Find an armchair, sit down and wait}}
+\let\uselocale\setlocale
+\let\locale\setlocale
+\let\selectlocale\setlocale
+\let\localename\setlocale
+\let\textlocale\setlocale
+\let\textlanguage\setlocale
+\let\languagetext\setlocale
+% \end{macrocode}
+%
+% \subsection{Errors}
+%
+% \begin{macro}{\@nolanerr}
+% \begin{macro}{\@nopatterns}
+%
+% The \babel\ package will signal an error when a documents tries
+% to select a language that hasn't been defined earlier. When a
+% user selects a language for which no hyphenation patterns were
+% loaded into the format he will be given a warning about that
+% fact. We revert to the patterns for |\language|=0 in that case.
+% In most formats that will be (US)english, but it might also be
+% empty.
+%
+% \begin{macro}{\@noopterr}
+% When the package was loaded without options not everything will
+% work as expected. An error message is issued in that case.
+%
+% When the format knows about |\PackageError| it must be \LaTeXe,
+% so we can safely use its error handling interface. Otherwise
+% we'll have to `keep it simple'.
+%
+% Infos are not written to the console, but on the other hand many
+% people think warnings are errors, so a further message type is
+% defined: an important info which is sent to the console.
+%
+% \begin{macrocode}
+\edef\bbl@nulllanguage{\string\language=0}
+\ifx\PackageError\@undefined % TODO. Move to Plain
+ \def\bbl@error#1#2{%
+ \begingroup
+ \newlinechar=`\^^J
+ \def\\{^^J(babel) }%
+ \errhelp{#2}\errmessage{\\#1}%
+ \endgroup}
+ \def\bbl@warning#1{%
+ \begingroup
+ \newlinechar=`\^^J
+ \def\\{^^J(babel) }%
+ \message{\\#1}%
+ \endgroup}
+ \let\bbl@infowarn\bbl@warning
+ \def\bbl@info#1{%
+ \begingroup
+ \newlinechar=`\^^J
+ \def\\{^^J}%
+ \wlog{#1}%
+ \endgroup}
+\fi
+\def\bbl@nocaption{\protect\bbl@nocaption@i}
+\def\bbl@nocaption@i#1#2{% 1: text to be printed 2: caption macro \langXname
+ \global\@namedef{#2}{\textbf{?#1?}}%
+ \@nameuse{#2}%
+ \bbl@warning{%
+ \@backslashchar#2 not set. Please, define it\\%
+ after the language has been loaded (typically\\%
+ in the preamble) with the help of\\%
+ \string\setlocalecaption. An example is\\%
+ \string\setlocalecaption{mylang}{chapter}{..}\\
+ Reported}}
+\def\bbl@tentative{\protect\bbl@tentative@i}
+\def\bbl@tentative@i#1{%
+ \bbl@warning{%
+ Some functions for '#1' are tentative.\\%
+ They might not work as expected and their behavior\\%
+ could change in the future.\\%
+ Reported}}
+\def\@nolanerr#1{%
+ \bbl@error
+ {You haven't defined the language #1\space yet.\\%
+ Perhaps you misspelled it or your installation\\%
+ is not complete}%
+ {Your command will be ignored, type <return> to proceed}}
+\def\@nopatterns#1{%
+ \bbl@warning
+ {No hyphenation patterns were preloaded for\\%
+ the language `#1' into the format.\\%
+ Please, configure your TeX system to add them and\\%
+ rebuild the format. Now I will use the patterns\\%
+ preloaded for \bbl@nulllanguage\space instead}}
+\let\bbl@usehooks\@gobbletwo
+\ifx\bbl@onlyswitch\@empty\endinput\fi
+ % Here ended switch.def
+% \end{macrocode}
+%
+% Here ended |switch.def|.
+%
+% \begin{macrocode}
+\ifx\directlua\@undefined\else
+ \ifx\bbl@luapatterns\@undefined
+ \input luababel.def
+ \fi
+\fi
+<@Basic macros@>
\bbl@trace{Compatibility with language.def}
\ifx\bbl@languages\@undefined
\ifx\directlua\@undefined
- \openin1 = language.def
+ \openin1 = language.def % TODO. Remove hardcoded number
\ifeof1
\closein1
\message{I couldn't find the file language.def}
@@ -5509,26 +8001,17 @@ help from Bernd Raichle, for which I am grateful.
\fi
\chardef\l@english\z@
\fi
-<@Load patterns in luatex@>
-<@Basic macros@>
% \end{macrocode}
%
% \begin{macro}{\addto}
-% For each language four control sequences have to be defined that
-% control the language-specific definitions. To be able to add
-% something to these macro once they have been defined the macro
-% |\addto| is introduced. It takes two arguments, a \meta{control
-% sequence} and \TeX-code to be added to the \meta{control
-% sequence}.
-%
-% If the \meta{control sequence} has not been defined before it is
-% defined now. The control sequence could also expand to |\relax|,
-% in which case a circular definition results. The net result is a
-% stack overflow. Otherwise the replacement text for the
-% \meta{control sequence} is expanded and stored in a token
-% register, together with the \TeX-code to be added. Finally the
-% \meta{control sequence} is \emph{re}defined, using the contents
-% of the token register.
+% It takes two arguments, a \meta{control sequence} and \TeX-code to
+% be added to the \meta{control sequence}.
+%
+% If the \meta{control sequence} has not been defined before it is
+% defined now. The control sequence could also expand to |\relax|,
+% in which case a circular definition results. The net result is a
+% stack overflow. Note there is an inconsistency, because the
+% assignment in the last branch is global.
%
% \begin{macrocode}
\def\addto#1#2{%
@@ -5546,9 +8029,11 @@ help from Bernd Raichle, for which I am grateful.
%
% \end{macro}
%
-% The macro |\initiate@active@char| takes all the necessary actions
-% to make its argument a shorthand character. The real work is
-% performed once for each character.
+% The macro |\initiate@active@char| below takes all the necessary
+% actions to make its argument a shorthand character. The real work
+% is performed once for each character. But first we define a little
+% tool. TODO. Always used with additional expansions. Move them here?
+% Move the macro to basic?
%
% \begin{macrocode}
\def\bbl@withactive#1#2{%
@@ -5558,26 +8043,19 @@ help from Bernd Raichle, for which I am grateful.
% \end{macrocode}
%
% \begin{macro}{\bbl@redefine}
-% To redefine a command, we save the old meaning of the macro.
-% Then we redefine it to call the original macro with the
-% `sanitized' argument. The reason why we do it this way is that
-% we don't want to redefine the \LaTeX\ macros completely in case
-% their definitions change (they have changed in the past).
%
-% Because we need to redefine a number of commands we define the
-% command |\bbl@redefine| which takes care of this. It creates a
-% new control sequence, |\org@...|
+% To redefine a command, we save the old meaning of the macro. Then
+% we redefine it to call the original macro with the `sanitized'
+% argument. The reason why we do it this way is that we don't want
+% to redefine the \LaTeX\ macros completely in case their
+% definitions change (they have changed in the past). A macro named
+% |\macro| will be saved new control sequences named |\org@macro|.
%
% \begin{macrocode}
\def\bbl@redefine#1{%
\edef\bbl@tempa{\bbl@stripslash#1}%
\expandafter\let\csname org@\bbl@tempa\endcsname#1%
\expandafter\def\csname\bbl@tempa\endcsname}
-% \end{macrocode}
-%
-% This command should only be used in the preamble of the document.
-%
-% \begin{macrocode}
\@onlypreamble\bbl@redefine
% \end{macrocode}
%
@@ -5597,13 +8075,13 @@ help from Bernd Raichle, for which I am grateful.
%
% \end{macro}
%
-% \begin{macro}{\bbl@redefinerobust}
-% For commands that are redefined, but which \textit{might} be
-% robust we need a slightly more intelligent macro. A robust
-% command |foo| is defined to expand to |\protect|\verb*|\foo |. So
-% it is necessary to check whether \verb*|\foo | exists. The result
-% is that the command that is being redefined is always robust
-% afterwards. Therefore all we need to do now is define \verb*|\foo |.
+% \begin{macro}{\bbl@redefinerobust}
+% For commands that are redefined, but which \textit{might} be
+% robust we need a slightly more intelligent macro. A robust
+% command |foo| is defined to expand to |\protect|\verb*|\foo |. So
+% it is necessary to check whether \verb*|\foo | exists. The result
+% is that the command that is being redefined is always robust
+% afterwards. Therefore all we need to do now is define \verb*|\foo |.
%
% \begin{macrocode}
\def\bbl@redefinerobust#1{%
@@ -5613,11 +8091,6 @@ help from Bernd Raichle, for which I am grateful.
\bbl@exp{\def\\#1{\\\protect\<\bbl@tempa\space>}}}%
{\bbl@exp{\let\<org@\bbl@tempa>\<\bbl@tempa\space>}}%
\@namedef{\bbl@tempa\space}}
-% \end{macrocode}
-%
-% This command should only be used in the preamble of the document.
-%
-% \begin{macrocode}
\@onlypreamble\bbl@redefinerobust
% \end{macrocode}
%
@@ -5625,12 +8098,10 @@ help from Bernd Raichle, for which I am grateful.
%
% \subsection{Hooks}
%
-% Note they are loaded in babel.def. switch.def only provides a
-% ``hook'' for hooks (with a default value which is a no-op,
-% below). Admittedly, the current implementation is a somewhat
-% simplistic and does vety little to catch errors, but it is intended
-% for developpers, after all. |\bbl@usehooks| is the commands used by
-% babel to execute hooks defined for an event.
+% Admittedly, the current implementation is a somewhat simplistic and
+% does very little to catch errors, but it is meant for developers,
+% after all. |\bbl@usehooks| is the commands used by \babel{} to execute
+% hooks defined for an event.
%
% \begin{macrocode}
\bbl@trace{Hooks}
@@ -5639,27 +8110,27 @@ help from Bernd Raichle, for which I am grateful.
\def\bbl@tempa##1,#3=##2,##3\@empty{\def\bbl@tempb{##2}}%
\expandafter\bbl@tempa\bbl@evargs,#3=,\@empty
\bbl@ifunset{bbl@ev@#2@#3@#1}%
- {\bbl@csarg\bbl@add{ev@#3@#1}{\bbl@elt{#2}}}%
+ {\bbl@csarg\bbl@add{ev@#3@#1}{\bbl@elth{#2}}}%
{\bbl@csarg\let{ev@#2@#3@#1}\relax}%
\bbl@csarg\newcommand{ev@#2@#3@#1}[\bbl@tempb]}
\newcommand\EnableBabelHook[1]{\bbl@csarg\let{hk@#1}\@firstofone}
\newcommand\DisableBabelHook[1]{\bbl@csarg\let{hk@#1}\@gobble}
\def\bbl@usehooks#1#2{%
- \def\bbl@elt##1{%
+ \def\bbl@elth##1{%
\bbl@cs{hk@##1}{\bbl@cs{ev@##1@#1@}#2}}%
\bbl@cs{ev@#1@}%
\ifx\languagename\@undefined\else % Test required for Plain (?)
- \def\bbl@elt##1{%
+ \def\bbl@elth##1{%
\bbl@cs{hk@##1}{\bbl@cl{ev@##1@#1}#2}}%
\bbl@cl{ev@#1}%
\fi}
% \end{macrocode}
%
-% To ensure forward compatibility, arguments in hooks are set
-% implicitly. So, if a further argument is added in the future,
-% there is no need to change the existing code. Note events
-% intended for \textsf{hyphen.cfg} are also loaded (just in
-% case you need them for some reason).
+% To ensure forward compatibility, arguments in hooks are set
+% implicitly. So, if a further argument is added in the future,
+% there is no need to change the existing code. Note events
+% intended for \textsf{hyphen.cfg} are also loaded (just in
+% case you need them for some reason).
%
% \begin{macrocode}
\def\bbl@evargs{,% <- don't delete this comma
@@ -5667,7 +8138,7 @@ help from Bernd Raichle, for which I am grateful.
adddialect=2,patterns=2,defaultcommands=0,encodedcommands=2,write=0,%
beforeextras=0,afterextras=0,stopcommands=0,stringprocess=0,%
hyphenation=2,initiateactive=3,afterreset=0,foreign=0,foreign*=0,%
- beforestart=0,languagename=0}
+ beforestart=0,languagename=2}
% \end{macrocode}
%
% \begin{macro}{\babelensure}
@@ -5716,7 +8187,7 @@ help from Bernd Raichle, for which I am grateful.
\def\<bbl@e@#2>{\the\toks@{\bbl@ens@fontenc}}}}
\def\bbl@ensure#1#2#3{% 1: include 2: exclude 3: fontenc
\def\bbl@tempb##1{% elt for (excluding) \bbl@captionslist list
- \ifx##1\@undefined % 3.32 - Don't assume the macros exists
+ \ifx##1\@undefined % 3.32 - Don't assume the macro exists
\edef##1{\noexpand\bbl@nocaption
{\bbl@stripslash##1}{\languagename\bbl@stripslash##1}}%
\fi
@@ -5761,38 +8232,39 @@ help from Bernd Raichle, for which I am grateful.
% \subsection{Setting up language files}
%
% \begin{macro}{\LdfInit}
-% The second version of |\LdfInit| macro takes two arguments. The first
-% argument is the name of the language that will be defined in the
-% language definition file; the second argument is either a control
-% sequence or a string from which a control sequence should be
-% constructed. The existence of the control sequence indicates that
-% the file has been processed before.
%
-% At the start of processing a language definition file we always
-% check the category code of the at-sign. We make sure that it is
-% a `letter' during the processing of the file. We also save its
-% name as the last called option, even if not loaded.
+% |\LdfInit| macro takes two arguments. The first
+% argument is the name of the language that will be defined in the
+% language definition file; the second argument is either a control
+% sequence or a string from which a control sequence should be
+% constructed. The existence of the control sequence indicates that
+% the file has been processed before.
+%
+% At the start of processing a language definition file we always
+% check the category code of the at-sign. We make sure that it is
+% a `letter' during the processing of the file. We also save its
+% name as the last called option, even if not loaded.
%
-% Another character that needs to have the correct category code
-% during processing of language definition files is the equals sign,
-% `=', because it is sometimes used in constructions with the
-% |\let| primitive. Therefore we store its current catcode and
-% restore it later on.
+% Another character that needs to have the correct category code
+% during processing of language definition files is the equals sign,
+% `=', because it is sometimes used in constructions with the
+% |\let| primitive. Therefore we store its current catcode and
+% restore it later on.
%
-% Now we check whether we should perhaps stop the processing of
-% this file. To do this we first need to check whether the second
-% argument that is passed to |\LdfInit| is a control sequence. We
-% do that by looking at the first token after passing |#2| through
-% |string|. When it is equal to |\@backslashchar| we are dealing
-% with a control sequence which we can compare with |\@undefined|.
+% Now we check whether we should perhaps stop the processing of
+% this file. To do this we first need to check whether the second
+% argument that is passed to |\LdfInit| is a control sequence. We
+% do that by looking at the first token after passing |#2| through
+% |string|. When it is equal to |\@backslashchar| we are dealing
+% with a control sequence which we can compare with |\@undefined|.
%
-% If so, we call |\ldf@quit| to set the main language, restore the
-% category code of the @-sign and call |\endinput|
+% If so, we call |\ldf@quit| to set the main language, restore the
+% category code of the @-sign and call |\endinput|
%
-% When |#2| was \emph{not} a control sequence we construct one and
-% compare it with |\relax|.
+% When |#2| was \emph{not} a control sequence we construct one and
+% compare it with |\relax|.
%
-% Finally we check |\originalTeX|.
+% Finally we check |\originalTeX|.
%
% \begin{macrocode}
\bbl@trace{Macros for setting language files up}
@@ -5849,13 +8321,15 @@ help from Bernd Raichle, for which I am grateful.
% category code of the @-sign.
%
% \begin{macrocode}
-\def\bbl@afterldf#1{%
+\def\bbl@afterldf#1{% TODO. Merge into the next macro? Unused elsewhere
\bbl@afterlang
\let\bbl@afterlang\relax
\let\BabelModifiers\relax
\let\bbl@screset\relax}%
\def\ldf@finish#1{%
- \loadlocalcfg{#1}%
+ \ifx\loadlocalcfg\@undefined\else % For LaTeX 209
+ \loadlocalcfg{#1}%
+ \fi
\bbl@afterldf{#1}%
\expandafter\main@language\expandafter{#1}%
\catcode`\@=\atcatcode \let\atcatcode\relax
@@ -5884,31 +8358,36 @@ help from Bernd Raichle, for which I am grateful.
% \begin{macrocode}
\def\main@language#1{%
\def\bbl@main@language{#1}%
- \let\languagename\bbl@main@language
+ \let\languagename\bbl@main@language % TODO. Set localename
\bbl@id@assign
\bbl@patterns{\languagename}}
% \end{macrocode}
%
-% We also have to make sure that some code gets executed at the
-% beginning of the document. Languages do not set |\pagedir|, so
-% we set here for the whole document to the main |\bodydir|.
+% We also have to make sure that some code gets executed at the
+% beginning of the document, either when the |aux| file is read or,
+% if it does not exist, when the |\AtBeginDocument| is executed.
+% Languages do not set |\pagedir|, so we set here for the whole
+% document to the main |\bodydir|.
%
% \begin{macrocode}
\def\bbl@beforestart{%
\bbl@usehooks{beforestart}{}%
\global\let\bbl@beforestart\relax}
\AtBeginDocument{%
- \bbl@cs{beforestart}%
+ \@nameuse{bbl@beforestart}%
\if@filesw
- \immediate\write\@mainaux{\string\bbl@cs{beforestart}}%
+ \providecommand\babel@aux[2]{}%
+ \immediate\write\@mainaux{%
+ \string\providecommand\string\babel@aux[2]{}}%
+ \immediate\write\@mainaux{\string\@nameuse{bbl@beforestart}}%
\fi
\expandafter\selectlanguage\expandafter{\bbl@main@language}%
- \ifbbl@single % must go after the line above
+ \ifbbl@single % must go after the line above.
\renewcommand\selectlanguage[1]{}%
\renewcommand\foreignlanguage[2]{#2}%
\global\let\babel@aux\@gobbletwo % Also as flag
\fi
- \ifcase\bbl@engine\or\pagedir\bodydir\fi} % TODO - a better place
+ \ifcase\bbl@engine\or\pagedir\bodydir\fi} % TODO - a better place
% \end{macrocode}
%
% \end{macro}
@@ -6269,7 +8748,7 @@ help from Bernd Raichle, for which I am grateful.
%
% \begin{macrocode}
\begingroup
-\bbl@ifunset{ifincsname}%
+\bbl@ifunset{ifincsname}% TODO. Ugly. Correct?
{\gdef\active@prefix#1{%
\ifx\protect\@typeset@protect
\else
@@ -6332,8 +8811,7 @@ help from Bernd Raichle, for which I am grateful.
% Both macros take one argument, like |\initiate@active@char|. The
% macro is used to change the definition of an active character to
% expand to |\active@char|\m{char} in the case of |\bbl@activate|,
-% or |\normal@char|\m{char} in the case of
-% |\bbl@deactivate|.
+% or |\normal@char|\m{char} in the case of |\bbl@deactivate|.
%
% \begin{macrocode}
\def\bbl@activate#1{%
@@ -6349,8 +8827,8 @@ help from Bernd Raichle, for which I am grateful.
%
% \begin{macro}{\bbl@firstcs}
% \begin{macro}{\bbl@scndcs}
-% These macros have two arguments. They use one of their arguments
-% to build a control sequence from.
+%
+% These macros are used only as a trick when declaring shorthands.
%
% \begin{macrocode}
\def\bbl@firstcs#1#2{\csname#1\endcsname}
@@ -6371,7 +8849,23 @@ help from Bernd Raichle, for which I am grateful.
% \item the code to be executed when the shorthand is encountered.
% \end{enumerate}
%
+% The auxiliary macro |\babel@texpdf| improves the interoperativity with
+% \textsf{hyperref} and takes 4 arguments: (1) The \TeX{} code in text
+% mode, (2) the string for \textsf{hyperref}, (3) the \TeX{} code in
+% math mode, and (4), which is currently ignored, but it's meant for a
+% string in math mode, like a minus sign instead of an hyphen
+% (currently \textsf{hyperref} doesn't discriminate the mode). This
+% macro may be used in |ldf| files.
+
% \begin{macrocode}
+\def\babel@texpdf#1#2#3#4{%
+ \ifx\texorpdfstring\@undefined
+ \textormath{#1}{#2}%
+ \else
+ \texorpdfstring{\textormath{#1}{#3}}{#2}%
+ % \texorpdfstring{\textormath{#1}{#3}}{\textormath{#2}{#4}}%
+ \fi}
+%
\def\declare@shorthand#1#2{\@decl@short{#1}#2\@nil}
\def\@decl@short#1#2#3\@nil#4{%
\def\bbl@tempa{#3}%
@@ -6429,7 +8923,7 @@ help from Bernd Raichle, for which I am grateful.
%
% \begin{macrocode}
\def\user@group{user}
-\def\language@group{english}
+\def\language@group{english} % TODO. I don't like defaults
\def\system@group{system}
% \end{macrocode}
%
@@ -6438,11 +8932,9 @@ help from Bernd Raichle, for which I am grateful.
% \end{macro}
%
% \begin{macro}{\useshorthands}
-% This is the user level command to tell \LaTeX\ that user level
-% shorthands will be used in the document. It takes one argument,
-% the character that starts a shorthand. First note that this is
-% user level, and then initialize and activate the character for
-% use as a shorthand character (ie, it's active in the
+%
+% This is the user level macro. It initializes and activates the
+% character for use as a shorthand character (ie, it's active in the
% preamble). Languages can deactivate shorthands, so a starred
% version is also provided which activates them always after the
% language has been switched.
@@ -6504,10 +8996,12 @@ help from Bernd Raichle, for which I am grateful.
% \end{macro}
%
% \begin{macro}{\languageshorthands}
+%
% A user level command to change the language from which shorthands
% are used. Unfortunately, \babel{} currently does not keep track
% of defined groups, and therefore there is no way to catch a
-% possible change in casing.
+% possible change in casing to fix it in the same way languages names
+% are fixed. [TODO].
%
% \begin{macrocode}
\def\languageshorthands#1{\def\language@group{#1}}
@@ -6516,7 +9010,11 @@ help from Bernd Raichle, for which I am grateful.
% \end{macro}
%
% \begin{macro}{\aliasshorthand}
-% First the new shorthand needs to be initialized,
+% First the new shorthand needs to be initialized. Then, we define
+% the new shorthand in terms of the original one, but note with
+% |\aliasshorthands{"}{/}| is |\active@prefix /\active@char/|, so we
+% still need to let the lattest to |\active@char"|.
+%
%
% \begin{macrocode}
\def\aliasshorthand#1#2{%
@@ -6526,14 +9024,6 @@ help from Bernd Raichle, for which I am grateful.
\@notshorthand{#2}%
\else
\initiate@active@char{#2}%
-% \end{macrocode}
-%
-% Then, we define the new shorthand in terms of the original
-% one, but note with |\aliasshorthands{"}{/}| is
-% |\active@prefix /\active@char/|, so we still need to let the
-% lattest to |\active@char"|.
-%
-% \begin{macrocode}
\expandafter\let\csname active@char\string#2\expandafter\endcsname
\csname active@char\string#1\endcsname
\expandafter\let\csname normal@char\string#2\expandafter\endcsname
@@ -6579,19 +9069,18 @@ help from Bernd Raichle, for which I am grateful.
% \begin{macro}{\bbl@switch@sh}
%
% The macro |\bbl@switch@sh| takes the list of characters apart one
-% by one and subsequently switches the category code of the
+% by one and subsequently switches the category code of the
% shorthand character according to the first argument of
% |\bbl@switch@sh|.
%
-% But before any of this switching takes place we make sure that
-% the character we are dealing with is known as a shorthand
-% character. If it is, a macro such as |\active@char"| should
-% exist.
+% But before any of this switching takes place we make sure that the
+% character we are dealing with is known as a shorthand character.
+% If it is, a macro such as |\active@char"| should exist.
%
-% Switching off and on is easy -- we just set the category
-% code to `other' (12) and |\active|. With the starred version, the
-% original catcode and the original definition, saved
-% in |@initiate@active@char|, are restored.
+% Switching off and on is easy -- we just set the category code to
+% `other' (12) and |\active|. With the starred version, the original
+% catcode and the original definition, saved in
+% |@initiate@active@char|, are restored.
%
% \begin{macrocode}
\def\bbl@switch@sh#1#2{%
@@ -6617,7 +9106,7 @@ help from Bernd Raichle, for which I am grateful.
% \end{macro}
% \end{macro}
%
-% Note the value is that at the expansion time, eg, in the preample
+% Note the value is that at the expansion time; eg, in the preample
% shorhands are usually deactivated.
%
% \begin{macrocode}
@@ -6627,7 +9116,7 @@ help from Bernd Raichle, for which I am grateful.
{\bbl@putsh@i#1\@empty\@nnil}%
{\csname bbl@active@\string#1\endcsname}}
\def\bbl@putsh@i#1#2\@nnil{%
- \csname\languagename @sh@\string#1@%
+ \csname\language@group @sh@\string#1@%
\ifx\@empty#2\else\string#2@\fi\endcsname}
\ifx\bbl@opt@shorthands\@nnil\else
\let\bbl@s@initiate@active@char\initiate@active@char
@@ -6780,11 +9269,6 @@ help from Bernd Raichle, for which I am grateful.
{\csname\bbl@tempc @attr@##1\endcsname}%
{\@attrerr{\bbl@tempc}{##1}}%
\fi}}}
-% \end{macrocode}
-%
-% This command should only be used in the preamble of a document.
-%
-% \begin{macrocode}
\@onlypreamble\languageattribute
% \end{macrocode}
%
@@ -6833,31 +9317,19 @@ help from Bernd Raichle, for which I am grateful.
% attribute being checked, and the third and fourth arguments are
% the true and false clauses.
%
-% \begin{macrocode}
-\def\bbl@ifattributeset#1#2#3#4{%
-% \end{macrocode}
-%
-% First we need to find out if any attributes were set; if not
-% we're done.
+% First we need to find out if any attributes were set; if not we're
+% done. Then we need to check the list of known attributes. When
+% we're this far |\ifin@| has a value indicating if the attribute in
+% question was set or not. Just to be safe the code to be executed
+% is `thrown over the |\fi|'.
%
% \begin{macrocode}
+\def\bbl@ifattributeset#1#2#3#4{%
\ifx\bbl@known@attribs\@undefined
\in@false
\else
-% \end{macrocode}
-%
-% The we need to check the list of known attributes.
-%
-% \begin{macrocode}
\bbl@xin@{,#1-#2,}{,\bbl@known@attribs,}%
\fi
-% \end{macrocode}
-%
-% When we're this far |\ifin@| has a value indicating if the
-% attribute in question was set or not. Just to be safe the code to
-% be executed is `thrown over the |\fi|'.
-%
-% \begin{macrocode}
\ifin@
\bbl@afterelse#3%
\else
@@ -6874,36 +9346,20 @@ help from Bernd Raichle, for which I am grateful.
% attribute list, the \TeX-code to be executed when the attribute
% is known and the \TeX-code to be executed otherwise.
%
-% \begin{macrocode}
-\def\bbl@ifknown@ttrib#1#2{%
-% \end{macrocode}
-%
-% We first assume the attribute is unknown.
+% We first assume the attribute is unknown. Then we loop over the
+% list of known attributes, trying to find a match. When a match is
+% found the definition of |\bbl@tempa| is changed. Finally we
+% execute |\bbl@tempa|.
%
% \begin{macrocode}
+\def\bbl@ifknown@ttrib#1#2{%
\let\bbl@tempa\@secondoftwo
-% \end{macrocode}
-%
-% Then we loop over the list of known attributes, trying to find a
-% match.
-%
-% \begin{macrocode}
\bbl@loopx\bbl@tempb{#2}{%
\expandafter\in@\expandafter{\expandafter,\bbl@tempb,}{,#1,}%
\ifin@
-% \end{macrocode}
-%
-% When a match is found the definition of |\bbl@tempa| is changed.
-%
-% \begin{macrocode}
\let\bbl@tempa\@firstoftwo
\else
\fi}%
-% \end{macrocode}
-%
-% Finally we execute |\bbl@tempa|.
-%
-% \begin{macrocode}
\bbl@tempa
}
% \end{macrocode}
@@ -6965,15 +9421,15 @@ help from Bernd Raichle, for which I am grateful.
% \begin{macro}{\babel@save}
% \begin{macro}{\babel@savevariable}
%
-% The macro |\babel@save|\meta{csname} saves the current meaning of
-% the control sequence \meta{csname} to
-% |\originalTeX|\footnote{\cs{originalTeX} has to be expandable,
-% i.\,e.\ you shouldn't let it to \cs{relax}.}. To do this, we let
-% the current meaning to a temporary control sequence, the restore
-% commands are appended to |\originalTeX| and the counter is
-% incremented. The macro |\babel@savevariable|\meta{variable} saves
-% the value of the variable. \meta{variable} can be anything allowed
-% after the |\the| primitive.
+% The macro |\babel@save|\meta{csname} saves the current meaning of the
+% control sequence \meta{csname} to
+% |\originalTeX|\footnote{\cs{originalTeX} has to be expandable,
+% i.\,e.\ you shouldn't let it to \cs{relax}.}. To do this, we let the
+% current meaning to a temporary control sequence, the restore commands
+% are appended to |\originalTeX| and the counter is incremented. The
+% macro |\babel@savevariable|\meta{variable} saves the value of the
+% variable. \meta{variable} can be anything allowed after the |\the|
+% primitive.
%
% \begin{macrocode}
\def\babel@save#1{%
@@ -6992,10 +9448,10 @@ help from Bernd Raichle, for which I am grateful.
%
% \begin{macro}{\bbl@frenchspacing}
% \begin{macro}{\bbl@nonfrenchspacing}
-% Some languages need to have |\frenchspacing| in effect. Others
-% don't want that. The command |\bbl@frenchspacing| switches it on
-% when it isn't already in effect and |\bbl@nonfrenchspacing|
-% switches it off if necessary.
+% Some languages need to have |\frenchspacing| in effect. Others
+% don't want that. The command |\bbl@frenchspacing| switches it on
+% when it isn't already in effect and |\bbl@nonfrenchspacing|
+% switches it off if necessary.
%
% \begin{macrocode}
\def\bbl@frenchspacing{%
@@ -7006,6 +9462,12 @@ help from Bernd Raichle, for which I am grateful.
\let\bbl@nonfrenchspacing\nonfrenchspacing
\fi}
\let\bbl@nonfrenchspacing\nonfrenchspacing
+%
+\let\bbl@elt\relax
+\edef\bbl@fs@chars{%
+ \bbl@elt{\string.}\@m{3000}\bbl@elt{\string?}\@m{3000}%
+ \bbl@elt{\string!}\@m{3000}\bbl@elt{\string:}\@m{2000}%
+ \bbl@elt{\string;}\@m{1500}\bbl@elt{\string,}\@m{1250}}
% \end{macrocode}
%
% \end{macro}
@@ -7043,11 +9505,11 @@ help from Bernd Raichle, for which I am grateful.
%
% \begin{macro}{\babelhyphenation}
%
-% This macro saves hyphenation exceptions. Two macros are used to
-% store them: |\bbl@hyphenation@| for the global ones and
-% |\bbl@hyphenation<lang>| for language ones. See |\bbl@patterns|
-% above for further details. We make sure there is a space between
-% words when multiple commands are used.
+% This macro saves hyphenation exceptions. Two macros are used to
+% store them: |\bbl@hyphenation@| for the global ones and
+% |\bbl@hyphenation<lang>| for language ones. See |\bbl@patterns|
+% above for further details. We make sure there is a space between
+% words when multiple commands are used.
%
% \begin{macrocode}
\bbl@trace{Hyphens}
@@ -7082,10 +9544,10 @@ help from Bernd Raichle, for which I am grateful.
%
% \begin{macro}{\bbl@allowhyphens}
%
-% This macro makes hyphenation possible. Basically its definition
-% is nothing more than |\nobreak| |\hskip| \texttt{0pt plus
-% 0pt}\footnote{\TeX\ begins and ends a word for hyphenation at a
-% glue node. The penalty prevents a linebreak at this glue node.}.
+% This macro makes hyphenation possible. Basically its definition
+% is nothing more than |\nobreak| |\hskip| \texttt{0pt plus
+% 0pt}\footnote{\TeX\ begins and ends a word for hyphenation at a
+% glue node. The penalty prevents a linebreak at this glue node.}.
%
% \begin{macrocode}
\def\bbl@allowhyphens{\ifvmode\else\nobreak\hskip\z@skip\fi}
@@ -7097,10 +9559,10 @@ help from Bernd Raichle, for which I am grateful.
%
% \begin{macro}{\babelhyphen}
%
-% Macros to insert common hyphens. Note the space before |@| in
-% |\babelhyphen|. Instead of protecting it with
-% |\DeclareRobustCommand|, which could insert a |\relax|, we use
-% the same procedure as shorthands, with |\active@prefix|.
+% Macros to insert common hyphens. Note the space before |@| in
+% |\babelhyphen|. Instead of protecting it with
+% |\DeclareRobustCommand|, which could insert a |\relax|, we use
+% the same procedure as shorthands, with |\active@prefix|.
%
% \begin{macrocode}
\newcommand\babelnullhyphen{\char\hyphenchar\font}
@@ -7113,18 +9575,18 @@ help from Bernd Raichle, for which I am grateful.
{\csname bbl@hy@#1#2\@empty\endcsname}}
% \end{macrocode}
%
-% The following two commands are used to wrap the ``hyphen'' and
-% set the behavior of the rest of the word -- the version with a
-% single |@| is used when further hyphenation is allowed, while
-% that with |@@| if no more hyphens are allowed. In both cases, if
-% the hyphen is preceded by a positive space, breaking after the
-% hyphen is disallowed.
+% The following two commands are used to wrap the ``hyphen'' and
+% set the behavior of the rest of the word -- the version with a
+% single |@| is used when further hyphenation is allowed, while
+% that with |@@| if no more hyphens are allowed. In both cases, if
+% the hyphen is preceded by a positive space, breaking after the
+% hyphen is disallowed.
%
-% There should not be a discretionary after a hyphen at the
-% beginning of a word, so it is prevented if preceded by a
-% skip. Unfortunately, this does handle cases like ``(-suffix)''.
-% |\nobreak| is always preceded by |\leavevmode|, in case the
-% shorthand starts a paragraph.
+% There should not be a discretionary after a hyphen at the
+% beginning of a word, so it is prevented if preceded by a
+% skip. Unfortunately, this does handle cases like ``(-suffix)''.
+% |\nobreak| is always preceded by |\leavevmode|, in case the
+% shorthand starts a paragraph.
%
% \begin{macrocode}
\def\bbl@usehyphen#1{%
@@ -7184,7 +9646,7 @@ help from Bernd Raichle, for which I am grateful.
%
% The aim following commands is to provide a commom interface for
% strings in several encodings. They also contains several hooks which
-% can be ued by \luatex{} and \xetex. The code is organized here with
+% can be used by \luatex{} and \xetex. The code is organized here with
% pseudo-guards, so we start with the basic commands.
%
% \paragraph{Tools}
@@ -7195,7 +9657,7 @@ help from Bernd Raichle, for which I am grateful.
% \begin{macrocode}
\bbl@trace{Multiencoding strings}
\def\bbl@toglobal#1{\global\let#1#1}
-\def\bbl@recatcode#1{%
+\def\bbl@recatcode#1{% TODO. Used only once?
\@tempcnta="7F
\def\bbl@tempa{%
\ifnum\@tempcnta>"FF\else
@@ -7255,10 +9717,10 @@ help from Bernd Raichle, for which I am grateful.
%<</More package options>>
% \end{macrocode}
%
-% \paragraph{Main command} This is the main command. With the
-% first use it is redefined to omit the basic setup in subsequent
-% blocks. We make sure strings contain actual letters in the range
-% 128-255, not active characters.
+% \paragraph{Main command} This is the main command. With the first
+% use it is redefined to omit the basic setup in subsequent blocks.
+% We make sure strings contain actual letters in the range 128-255,
+% not active characters.
%
% \begin{macrocode}
\@onlypreamble\StartBabelCommands
@@ -7296,22 +9758,22 @@ help from Bernd Raichle, for which I am grateful.
\let\bbl@startcommands\StartBabelCommands
% \end{macrocode}
%
-% Parse the encoding info to get the label, input, and font parts.
+% Parse the encoding info to get the label, input, and font parts.
%
-% Select the behavior of |\SetString|. Thre are two main cases,
-% depending of if there is an optional argument: without it and
-% |strings=encoded|, strings are defined
-% always; otherwise, they are set only if they are still undefined
-% (ie, fallback values). With labelled blocks and
-% |strings=encoded|, define the strings, but with another value,
-% define strings only if the current label or font encoding is the
-% value of |strings|; otherwise (ie, no |strings| or a block whose
-% label is not in |strings=|) do nothing.
+% Select the behavior of |\SetString|. Thre are two main cases,
+% depending of if there is an optional argument: without it and
+% |strings=encoded|, strings are defined
+% always; otherwise, they are set only if they are still undefined
+% (ie, fallback values). With labelled blocks and
+% |strings=encoded|, define the strings, but with another value,
+% define strings only if the current label or font encoding is the
+% value of |strings|; otherwise (ie, no |strings| or a block whose
+% label is not in |strings=|) do nothing.
%
-% We presume the current block is not loaded, and therefore set
-% (above) a couple of default values to gobble the arguments. Then,
-% these macros are redefined if necessary according to several
-% parameters.
+% We presume the current block is not loaded, and therefore set
+% (above) a couple of default values to gobble the arguments. Then,
+% these macros are redefined if necessary according to several
+% parameters.
%
% \begin{macrocode}
\newcommand\bbl@startcmds@ii[1][\@empty]{%
@@ -7375,18 +9837,19 @@ help from Bernd Raichle, for which I am grateful.
\fi}
% \end{macrocode}
%
-% There are two versions of |\bbl@scswitch|. The first version is
-% used when |ldf|s are read, and it makes sure
-% |\|\m{group}\m{language} is reset, but only once (|\bbl@screset|
-% is used to keep track of this). The second version is used in the
-% preamble and packages loaded after \babel{} and does nothing. The
-% macro |\bbl@forlang| loops |\bbl@L| but its body is executed only
-% if the value is in |\BabelLanguages| (inside \babel) or
-% |\date|\m{language} is defined (after \babel{} has been loaded).
-% There are also two version of |\bbl@forlang|. The first one skips
-% the current iteration if the language is not in |\BabelLanguages|
-% (used in |ldf|s), and the second one skips undefined languages
-% (after \babel{} has been loaded) .
+% There are two versions of |\bbl@scswitch|. The first version is used
+% when |ldf|s are read, and it makes sure |\|\m{group}\m{language} is
+% reset, but only once (|\bbl@screset| is used to keep track of this).
+% The second version is used in the preamble and packages loaded after
+% \babel{} and does nothing.
+%
+% The macro |\bbl@forlang| loops |\bbl@L| but its body is executed only
+% if the value is in |\BabelLanguages| (inside \babel) or
+% |\date|\m{language} is defined (after \babel{} has been loaded).
+% There are also two version of |\bbl@forlang|. The first one skips the
+% current iteration if the language is not in |\BabelLanguages| (used
+% in |ldf|s), and the second one skips undefined languages (after
+% \babel{} has been loaded) .
%
% \begin{macrocode}
\def\bbl@forlang#1#2{%
@@ -7417,26 +9880,25 @@ help from Bernd Raichle, for which I am grateful.
\let\bbl@endcommands\EndBabelCommands
% \end{macrocode}
%
-% Now we define commands to be used inside |\StartBabelCommands|.
+% Now we define commands to be used inside |\StartBabelCommands|.
%
-% \paragraph{Strings} The following macro is the actual definition
-% of |\SetString| when it is ``active''
+% \paragraph{Strings} The following macro is the actual definition
+% of |\SetString| when it is ``active''
%
-% First save the ``switcher''. Create it if undefined. Strings are
-% defined only if undefined (ie, like |\providescommmand|). With
-% the event |stringprocess| you can preprocess the string by
-% manipulating the value of |\BabelString|. If there are several
-% hooks assigned to this event, preprocessing is done in the same
-% order as defined. Finally, the string is set.
+% First save the ``switcher''. Create it if undefined. Strings are
+% defined only if undefined (ie, like |\providescommmand|). With
+% the event |stringprocess| you can preprocess the string by
+% manipulating the value of |\BabelString|. If there are several
+% hooks assigned to this event, preprocessing is done in the same
+% order as defined. Finally, the string is set.
%
% \begin{macrocode}
-\def\bbl@setstring#1#2{%
+\def\bbl@setstring#1#2{% eg, \prefacename{<string>}
\bbl@forlang\bbl@tempa{%
\edef\bbl@LC{\bbl@tempa\bbl@stripslash#1}%
\bbl@ifunset{\bbl@LC}% eg, \germanchaptername
- {\global\expandafter % TODO - con \bbl@exp ?
- \bbl@add\csname\bbl@G\bbl@tempa\expandafter\endcsname\expandafter
- {\expandafter\bbl@scset\expandafter#1\csname\bbl@LC\endcsname}}%
+ {\bbl@exp{%
+ \global\\\bbl@add\<\bbl@G\bbl@tempa>{\\\bbl@scset\\#1\<\bbl@LC>}}}%
{}%
\def\BabelString{#2}%
\bbl@usehooks{stringprocess}{}%
@@ -7471,12 +9933,11 @@ help from Bernd Raichle, for which I am grateful.
\fi
% \end{macrocode}
%
-% Define |\SetStringLoop|, which is actually set inside
-% |\StartBabelCommands|. The current definition is
-% somewhat complicated because we need a count, but |\count@| is
-% not under our control (remember |\SetString| may call hooks).
-% Instead of defining a dedicated count, we just ``pre-expand''
-% its value.
+% Define |\SetStringLoop|, which is actually set inside
+% |\StartBabelCommands|. The current definition is somewhat complicated
+% because we need a count, but |\count@| is not under our control
+% (remember |\SetString| may call hooks). Instead of defining a
+% dedicated count, we just ``pre-expand'' its value.
%
% \begin{macrocode}
%<<*Macros local to BabelCommands>>
@@ -7492,8 +9953,8 @@ help from Bernd Raichle, for which I am grateful.
%<</Macros local to BabelCommands>>
% \end{macrocode}
%
-% \paragraph{Delaying code} Now the definition of
-% |\AfterBabelCommands| when it is activated.
+% \paragraph{Delaying code} Now the definition of |\AfterBabelCommands|
+% when it is activated.
%
% \begin{macrocode}
\def\bbl@aftercmds#1{%
@@ -7565,8 +10026,8 @@ help from Bernd Raichle, for which I am grateful.
\bbl@tempa}
% \end{macrocode}
%
-% The following package options control the behavior of
-% hyphenation mapping.
+% The following package options control the behavior of
+% hyphenation mapping.
%
% \begin{macrocode}
%<<*More package options>>
@@ -7589,11 +10050,75 @@ help from Bernd Raichle, for which I am grateful.
\fi}
% \end{macrocode}
%
+% This sections ends with a general tool for resetting the caption
+% names with a unique interface. With the old way, which mixes the
+% switcher and the string, we convert it to the new one, which
+% separates these two steps.
+%
+% \begin{macrocode}
+\newcommand\setlocalecaption{% TODO. Catch typos. What about ensure?
+ \@ifstar\bbl@setcaption@s\bbl@setcaption@x}
+\def\bbl@setcaption@x#1#2#3{% language caption-name string
+ \bbl@trim@def\bbl@tempa{#2}%
+ \bbl@xin@{.template}{\bbl@tempa}%
+ \ifin@
+ \bbl@ini@captions@template{#3}{#1}%
+ \else
+ \edef\bbl@tempd{%
+ \expandafter\expandafter\expandafter
+ \strip@prefix\expandafter\meaning\csname captions#1\endcsname}%
+ \bbl@xin@
+ {\expandafter\string\csname #2name\endcsname}%
+ {\bbl@tempd}%
+ \ifin@ % Renew caption
+ \bbl@xin@{\string\bbl@scset}{\bbl@tempd}%
+ \ifin@
+ \bbl@exp{%
+ \\\bbl@ifsamestring{\bbl@tempa}{\languagename}%
+ {\\\bbl@scset\<#2name>\<#1#2name>}%
+ {}}%
+ \else % Old way converts to new way
+ \bbl@ifunset{#1#2name}%
+ {\bbl@exp{%
+ \\\bbl@add\<captions#1>{\def\<#2name>{\<#1#2name>}}%
+ \\\bbl@ifsamestring{\bbl@tempa}{\languagename}%
+ {\def\<#2name>{\<#1#2name>}}%
+ {}}}%
+ {}%
+ \fi
+ \else
+ \bbl@xin@{\string\bbl@scset}{\bbl@tempd}% New
+ \ifin@ % New way
+ \bbl@exp{%
+ \\\bbl@add\<captions#1>{\\\bbl@scset\<#2name>\<#1#2name>}%
+ \\\bbl@ifsamestring{\bbl@tempa}{\languagename}%
+ {\\\bbl@scset\<#2name>\<#1#2name>}%
+ {}}%
+ \else % Old way, but defined in the new way
+ \bbl@exp{%
+ \\\bbl@add\<captions#1>{\def\<#2name>{\<#1#2name>}}%
+ \\\bbl@ifsamestring{\bbl@tempa}{\languagename}%
+ {\def\<#2name>{\<#1#2name>}}%
+ {}}%
+ \fi%
+ \fi
+ \@namedef{#1#2name}{#3}%
+ \toks@\expandafter{\bbl@captionslist}%
+ \bbl@exp{\\\in@{\<#2name>}{\the\toks@}}%
+ \ifin@\else
+ \bbl@exp{\\\bbl@add\\\bbl@captionslist{\<#2name>}}%
+ \bbl@toglobal\bbl@captionslist
+ \fi
+ \fi}
+% \def\bbl@setcaption@s#1#2#3{} % TODO. Not yet implemented
+% \end{macrocode}
+%
% \subsection{Macros common to a number of languages}
%
% \begin{macro}{\set@low@box}
-% The following macro is used to lower quotes to the same level as
-% the comma. It prepares its argument in box register~0.
+%
+% The following macro is used to lower quotes to the same level as
+% the comma. It prepares its argument in box register~0.
%
% \begin{macrocode}
\bbl@trace{Macros related to glyphs}
@@ -7619,18 +10144,18 @@ help from Bernd Raichle, for which I am grateful.
%
% \subsection{Making glyphs available}
%
-% This section makes a number of glyphs available that either do not
-% exist in the \texttt{OT1} encoding and have to be `faked', or
-% that are not accessible through \file{T1enc.def}.
+% This section makes a number of glyphs available that either do not
+% exist in the \texttt{OT1} encoding and have to be `faked', or
+% that are not accessible through \file{T1enc.def}.
%
% \subsubsection{Quotation marks}
%
% \begin{macro}{\quotedblbase}
-% In the \texttt{T1} encoding the opening double quote at the
-% baseline is available as a separate character, accessible via
-% |\quotedblbase|. In the \texttt{OT1} encoding it is not
-% available, therefore we make it available by lowering the normal
-% open quote character to the baseline.
+% In the \texttt{T1} encoding the opening double quote at the
+% baseline is available as a separate character, accessible via
+% |\quotedblbase|. In the \texttt{OT1} encoding it is not
+% available, therefore we make it available by lowering the normal
+% open quote character to the baseline.
%
% \begin{macrocode}
\ProvideTextCommand{\quotedblbase}{OT1}{%
@@ -7638,8 +10163,8 @@ help from Bernd Raichle, for which I am grateful.
\box\z@\kern-.04em\bbl@allowhyphens}}
% \end{macrocode}
%
-% Make sure that when an encoding other than \texttt{OT1} or
-% \texttt{T1} is used this glyph can still be typeset.
+% Make sure that when an encoding other than \texttt{OT1} or
+% \texttt{T1} is used this glyph can still be typeset.
%
% \begin{macrocode}
\ProvideTextCommandDefault{\quotedblbase}{%
@@ -7667,12 +10192,27 @@ help from Bernd Raichle, for which I am grateful.
%
% \end{macro}
%
-% \begin{macro}{\guillemotleft}
-% \begin{macro}{\guillemotright}
-% The guillemet characters are not available in \texttt{OT1}
-% encoding. They are faked.
+% \begin{macro}{\guillemetleft}
+% \begin{macro}{\guillemetright}
+% The guillemet characters are not available in \texttt{OT1}
+% encoding. They are faked. (Wrong names with o preserved for
+% compatibility.)
%
% \begin{macrocode}
+\ProvideTextCommand{\guillemetleft}{OT1}{%
+ \ifmmode
+ \ll
+ \else
+ \save@sf@q{\nobreak
+ \raise.2ex\hbox{$\scriptscriptstyle\ll$}\bbl@allowhyphens}%
+ \fi}
+\ProvideTextCommand{\guillemetright}{OT1}{%
+ \ifmmode
+ \gg
+ \else
+ \save@sf@q{\nobreak
+ \raise.2ex\hbox{$\scriptscriptstyle\gg$}\bbl@allowhyphens}%
+ \fi}
\ProvideTextCommand{\guillemotleft}{OT1}{%
\ifmmode
\ll
@@ -7689,10 +10229,14 @@ help from Bernd Raichle, for which I am grateful.
\fi}
% \end{macrocode}
%
-% Make sure that when an encoding other than \texttt{OT1} or
-% \texttt{T1} is used these glyphs can still be typeset.
+% Make sure that when an encoding other than \texttt{OT1} or
+% \texttt{T1} is used these glyphs can still be typeset.
%
% \begin{macrocode}
+\ProvideTextCommandDefault{\guillemetleft}{%
+ \UseTextSymbol{OT1}{\guillemetleft}}
+\ProvideTextCommandDefault{\guillemetright}{%
+ \UseTextSymbol{OT1}{\guillemetright}}
\ProvideTextCommandDefault{\guillemotleft}{%
\UseTextSymbol{OT1}{\guillemotleft}}
\ProvideTextCommandDefault{\guillemotright}{%
@@ -7724,8 +10268,8 @@ help from Bernd Raichle, for which I am grateful.
\fi}
% \end{macrocode}
%
-% Make sure that when an encoding other than \texttt{OT1} or
-% \texttt{T1} is used these glyphs can still be typeset.
+% Make sure that when an encoding other than \texttt{OT1} or
+% \texttt{T1} is used these glyphs can still be typeset.
%
% \begin{macrocode}
\ProvideTextCommandDefault{\guilsinglleft}{%
@@ -7741,9 +10285,9 @@ help from Bernd Raichle, for which I am grateful.
%
% \begin{macro}{\ij}
% \begin{macro}{\IJ}
-% The dutch language uses the letter `ij'. It is available in
-% \texttt{T1} encoded fonts, but not in the \texttt{OT1} encoded
-% fonts. Therefore we fake it for the \texttt{OT1} encoding.
+% The dutch language uses the letter `ij'. It is available in
+% \texttt{T1} encoded fonts, but not in the \texttt{OT1} encoded
+% fonts. Therefore we fake it for the \texttt{OT1} encoding.
%
% \begin{macrocode}
\DeclareTextCommand{\ij}{OT1}{%
@@ -7767,15 +10311,15 @@ help from Bernd Raichle, for which I am grateful.
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\dj}
-% \begin{macro}{\DJ}
-% The croatian language needs the letters |\dj| and |\DJ|; they are
-% available in the \texttt{T1} encoding, but not in the
-% \texttt{OT1} encoding by default.
+% \begin{macro}{\dj}
+% \begin{macro}{\DJ}
+% The croatian language needs the letters |\dj| and |\DJ|; they are
+% available in the \texttt{T1} encoding, but not in the
+% \texttt{OT1} encoding by default.
%
-% Some code to construct these glyphs for the \texttt{OT1} encoding
-% was made available to me by Stipčević Mario,
-% (\texttt{stipcevic@olimp.irb.hr}).
+% Some code to construct these glyphs for the \texttt{OT1} encoding
+% was made available to me by Stipčević Mario,
+% (\texttt{stipcevic@olimp.irb.hr}).
%
% \begin{macrocode}
\def\crrtic@{\hrule height0.1ex width0.3em}
@@ -7910,9 +10454,9 @@ help from Bernd Raichle, for which I am grateful.
%
% \begin{macrocode}
\ProvideTextCommandDefault{\flqq}{%
- \textormath{\guillemotleft}{\mbox{\guillemotleft}}}
+ \textormath{\guillemetleft}{\mbox{\guillemetleft}}}
\ProvideTextCommandDefault{\frqq}{%
- \textormath{\guillemotright}{\mbox{\guillemotright}}}
+ \textormath{\guillemetright}{\mbox{\guillemetright}}}
% \end{macrocode}
%
% \end{macro}
@@ -7993,17 +10537,17 @@ help from Bernd Raichle, for which I am grateful.
%
% \end{macro}
%
-% For all vowels we declare |\"| to be a composite command which
-% uses |\bbl@umlauta| or |\bbl@umlaute| to position the umlaut
-% character. We need to be sure that these definitions override the
-% ones that are provided when the package \pkg{fontenc} with
-% option \Lopt{OT1} is used. Therefore these declarations are
-% postponed until the beginning of the document. Note these
-% definitions only apply to some languages, but
-% babel sets them for \textit{all} languages -- you may want to
-% redefine |\bbl@umlauta| and/or |\bbl@umlaute| for a language
-% in the corresponding |ldf| (using the babel switching mechanism,
-% of course).
+% For all vowels we declare |\"| to be a composite command which
+% uses |\bbl@umlauta| or |\bbl@umlaute| to position the umlaut
+% character. We need to be sure that these definitions override the
+% ones that are provided when the package \pkg{fontenc} with
+% option \Lopt{OT1} is used. Therefore these declarations are
+% postponed until the beginning of the document. Note these
+% definitions only apply to some languages, but
+% babel sets them for \textit{all} languages -- you may want to
+% redefine |\bbl@umlauta| and/or |\bbl@umlaute| for a language
+% in the corresponding |ldf| (using the babel switching mechanism,
+% of course).
%
% \begin{macrocode}
\AtBeginDocument{%
@@ -8017,23 +10561,25 @@ help from Bernd Raichle, for which I am grateful.
\DeclareTextCompositeCommand{\"}{OT1}{E}{\bbl@umlaute{E}}%
\DeclareTextCompositeCommand{\"}{OT1}{I}{\bbl@umlaute{I}}%
\DeclareTextCompositeCommand{\"}{OT1}{O}{\bbl@umlauta{O}}%
- \DeclareTextCompositeCommand{\"}{OT1}{U}{\bbl@umlauta{U}}%
-}
+ \DeclareTextCompositeCommand{\"}{OT1}{U}{\bbl@umlauta{U}}}
% \end{macrocode}
%
-% Finally, the default is to use English as the main language.
+% Finally, make sure the default hyphenrules are defined (even if
+% empty). For internal use, another empty |\language| is defined.
+% Currently used in Amharic.
%
% \begin{macrocode}
\ifx\l@english\@undefined
\chardef\l@english\z@
\fi
-\main@language{english}
+% The following is used to cancel rules in ini files (see Amharic).
+\ifx\l@babelnohyhens\@undefined
+ \newlanguage\l@babelnohyphens
+\fi
% \end{macrocode}
%
% \subsection{Layout}
%
-% \textbf{Work in progress}.
-%
% Layout is mainly intended to set bidi documents, but there is at
% least a tool useful in general.
%
@@ -8088,7 +10634,7 @@ help from Bernd Raichle, for which I am grateful.
\fi
% \end{macrocode}
%
-% \subsection{Creating languages}
+% \subsection{Creating and modifying languages}
%
% |\babelprovide| is a general purpose tool for creating and modifying
% languages. It creates the language infrastructure, and loads, if
@@ -8105,11 +10651,12 @@ help from Bernd Raichle, for which I am grateful.
% \global\@namedef{bbl@lcname@#2}{#2}%
\bbl@id@assign
\let\bbl@KVP@captions\@nil
+ \let\bbl@KVP@date\@nil
\let\bbl@KVP@import\@nil
\let\bbl@KVP@main\@nil
\let\bbl@KVP@script\@nil
\let\bbl@KVP@language\@nil
- \let\bbl@KVP@hyphenrules\@nil % only for provide@new
+ \let\bbl@KVP@hyphenrules\@nil
\let\bbl@KVP@mapfont\@nil
\let\bbl@KVP@maparabic\@nil
\let\bbl@KVP@mapdigits\@nil
@@ -8118,7 +10665,8 @@ help from Bernd Raichle, for which I am grateful.
\let\bbl@KVP@onchar\@nil
\let\bbl@KVP@alph\@nil
\let\bbl@KVP@Alph\@nil
- \let\bbl@KVP@info\@nil % Ignored with import? Or error/warning?
+ \let\bbl@KVP@labels\@nil
+ \bbl@csarg\let{KVP@labels*}\@nil
\bbl@forkv{#1}{% TODO - error handling
\in@{/}{##1}%
\ifin@
@@ -8126,13 +10674,31 @@ help from Bernd Raichle, for which I am grateful.
\else
\bbl@csarg\def{KVP@##1}{##2}%
\fi}%
+ % == init ==
+ \ifx\bbl@screset\@undefined
+ \bbl@ldfinit
+ \fi
+ % ==
+ \let\bbl@lbkflag\relax % \@empty = do setup linebreak
+ \bbl@ifunset{date#2}%
+ {\let\bbl@lbkflag\@empty}% new
+ {\ifx\bbl@KVP@hyphenrules\@nil\else
+ \let\bbl@lbkflag\@empty
+ \fi
+ \ifx\bbl@KVP@import\@nil\else
+ \let\bbl@lbkflag\@empty
+ \fi}%
% == import, captions ==
\ifx\bbl@KVP@import\@nil\else
\bbl@exp{\\\bbl@ifblank{\bbl@KVP@import}}%
- {\begingroup
- \def\BabelBeforeIni##1##2{\gdef\bbl@KVP@import{##1}\endinput}%
- \InputIfFileExists{babel-#2.tex}{}{}%
- \endgroup}%
+ {\ifx\bbl@initoload\relax
+ \begingroup
+ \def\BabelBeforeIni##1##2{\gdef\bbl@KVP@import{##1}\endinput}%
+ \bbl@input@texini{#2}%
+ \endgroup
+ \else
+ \xdef\bbl@KVP@import{\bbl@initoload}%
+ \fi}%
{}%
\fi
\ifx\bbl@KVP@captions\@nil
@@ -8142,43 +10708,32 @@ help from Bernd Raichle, for which I am grateful.
\bbl@ifunset{date#2}%
{\bbl@provide@new{#2}}%
{\bbl@ifblank{#1}%
- {\bbl@error
- {If you want to modify `#2' you must tell how in\\%
- the optional argument. See the manual for the\\%
- available options.}%
- {Use this macro as documented}}%
+ {}% With \bbl@load@basic below
{\bbl@provide@renew{#2}}}%
% Post tasks
- \bbl@exp{\\\babelensure[exclude=\\\today]{#2}}%
- \bbl@ifunset{bbl@ensure@\languagename}%
- {\bbl@exp{%
- \\\DeclareRobustCommand\<bbl@ensure@\languagename>[1]{%
- \\\foreignlanguage{\languagename}%
- {####1}}}}%
- {}%
+ % ----------
+ % == ensure captions ==
+ \ifx\bbl@KVP@captions\@nil\else
+ \bbl@ifunset{bbl@extracaps@#2}%
+ {\bbl@exp{\\\babelensure[exclude=\\\today]{#2}}}%
+ {\toks@\expandafter\expandafter\expandafter
+ {\csname bbl@extracaps@#2\endcsname}%
+ \bbl@exp{\\\babelensure[exclude=\\\today,include=\the\toks@}]{#2}}%
+ \bbl@ifunset{bbl@ensure@\languagename}%
+ {\bbl@exp{%
+ \\\DeclareRobustCommand\<bbl@ensure@\languagename>[1]{%
+ \\\foreignlanguage{\languagename}%
+ {####1}}}}%
+ {}%
+ \bbl@exp{%
+ \\\bbl@toglobal\<bbl@ensure@\languagename>%
+ \\\bbl@toglobal\<bbl@ensure@\languagename\space>}%
+ \fi
+ % ==
% At this point all parameters are defined if 'import'. Now we
% execute some code depending on them. But what about if nothing was
- % imported? We just load the very basic parameters: ids and a few
- % more.
- \bbl@ifunset{bbl@lname@#2}%
- {\def\BabelBeforeIni##1##2{%
- \begingroup
- \catcode`\[=12 \catcode`\]=12 \catcode`\==12 \catcode`\;=12 %
- \let\bbl@ini@captions@aux\@gobbletwo
- \def\bbl@inidate ####1.####2.####3.####4\relax ####5####6{}%
- \bbl@read@ini{##1}{basic data}%
- \bbl@exportkey{chrng}{characters.ranges}{}%
- \bbl@exportkey{dgnat}{numbers.digits.native}{}%
- \bbl@exportkey{prehc}{typography.prehyphenchar}{}%
- \bbl@exportkey{lnbrk}{typography.linebreaking}{h}%
- \bbl@exportkey{hyphr}{typography.hyphenrules}{}%
- \bbl@exportkey{hyoth}{typography.hyphenate.other}{}%
- \bbl@exportkey{intsp}{typography.intraspace}{}%
- \endinput
- \endgroup}% boxed, to avoid extra spaces:
- {\setbox\z@\hbox{\InputIfFileExists{babel-#2.tex}{}{}}}}%
- {}%
- % -
+ % imported? We just set the very basic parameters.
+ \bbl@load@basic{#2}%
% == script, language ==
% Override the values from ini or defines them
\ifx\bbl@KVP@script\@nil\else
@@ -8268,26 +10823,38 @@ help from Bernd Raichle, for which I am grateful.
\fi
\bbl@exp{\\\bbl@add\\\bbl@mapselect{\\\bbl@mapdir{\languagename}}}%
\fi
- % == intraspace, intrapenalty ==
+ % == Line breaking: intraspace, intrapenalty ==
% For CJK, East Asian, Southeast Asian, if interspace in ini
\ifx\bbl@KVP@intraspace\@nil\else % We can override the ini or set
\bbl@csarg\edef{intsp@#2}{\bbl@KVP@intraspace}%
\fi
\bbl@provide@intraspace
- % == hyphenate.other ==
- \bbl@ifunset{bbl@hyoth@\languagename}{}%
- {\bbl@csarg\bbl@replace{hyoth@\languagename}{ }{,}%
- \bbl@startcommands*{\languagename}{}%
- \bbl@csarg\bbl@foreach{hyoth@\languagename}{%
+ % == Line breaking: hyphenate.other.locale/.script==
+ \ifx\bbl@lbkflag\@empty
+ \bbl@ifunset{bbl@hyotl@\languagename}{}%
+ {\bbl@csarg\bbl@replace{hyotl@\languagename}{ }{,}%
+ \bbl@startcommands*{\languagename}{}%
+ \bbl@csarg\bbl@foreach{hyotl@\languagename}{%
+ \ifcase\bbl@engine
+ \ifnum##1<257
+ \SetHyphenMap{\BabelLower{##1}{##1}}%
+ \fi
+ \else
+ \SetHyphenMap{\BabelLower{##1}{##1}}%
+ \fi}%
+ \bbl@endcommands}%
+ \bbl@ifunset{bbl@hyots@\languagename}{}%
+ {\bbl@csarg\bbl@replace{hyots@\languagename}{ }{,}%
+ \bbl@csarg\bbl@foreach{hyots@\languagename}{%
\ifcase\bbl@engine
\ifnum##1<257
- \SetHyphenMap{\BabelLower{##1}{##1}}%
+ \global\lccode##1=##1\relax
\fi
\else
- \SetHyphenMap{\BabelLower{##1}{##1}}%
- \fi}%
- \bbl@endcommands}%
- % == maparabic ==
+ \global\lccode##1=##1\relax
+ \fi}}%
+ \fi
+ % == Counters: maparabic ==
% Native digits, if provided in ini (TeX level, xe and lua)
\ifcase\bbl@engine\else
\bbl@ifunset{bbl@dgnat@\languagename}{}%
@@ -8305,7 +10872,7 @@ help from Bernd Raichle, for which I am grateful.
\fi
\fi}%
\fi
- % == mapdigits ==
+ % == Counters: mapdigits ==
% Native digits (lua level).
\ifodd\bbl@engine
\ifx\bbl@KVP@mapdigits\@nil\else
@@ -8342,7 +10909,7 @@ help from Bernd Raichle, for which I am grateful.
}}%
\fi
\fi
- % == alph, Alph ==
+ % == Counters: alph, Alph ==
% What if extras<lang> contains a \babel@save\@alph? It won't be
% restored correctly when exiting the language, so we ignore
% this change with the \bbl@alph@saved trick.
@@ -8370,15 +10937,17 @@ help from Bernd Raichle, for which I am grateful.
\fi
% == require.babel in ini ==
% To load or reaload the babel-*.tex, if require.babel in ini
- \bbl@ifunset{bbl@rqtex@\languagename}{}%
- {\expandafter\ifx\csname bbl@rqtex@\languagename\endcsname\@empty\else
- \let\BabelBeforeIni\@gobbletwo
- \chardef\atcatcode=\catcode`\@
- \catcode`\@=11\relax
- \InputIfFileExists{babel-\bbl@cs{rqtex@\languagename}.tex}{}{}%
- \catcode`\@=\atcatcode
- \let\atcatcode\relax
- \fi}%
+ \ifx\bbl@beforestart\relax\else % But not in doc aux or body
+ \bbl@ifunset{bbl@rqtex@\languagename}{}%
+ {\expandafter\ifx\csname bbl@rqtex@\languagename\endcsname\@empty\else
+ \let\BabelBeforeIni\@gobbletwo
+ \chardef\atcatcode=\catcode`\@
+ \catcode`\@=11\relax
+ \bbl@input@texini{\bbl@cs{rqtex@\languagename}}%
+ \catcode`\@=\atcatcode
+ \let\atcatcode\relax
+ \fi}%
+ \fi
% == main ==
\ifx\bbl@KVP@main\@nil % Restore only if not 'main'
\let\languagename\bbl@savelangname
@@ -8386,43 +10955,6 @@ help from Bernd Raichle, for which I am grateful.
\fi}
% \end{macrocode}
%
-% A tool to define the macros for native digits from the list provided
-% in the |ini| file. Somewhat convoluted because there are 10 digits,
-% but only 9 arguments in \TeX.
-%
-% \begin{macrocode}
-\def\bbl@setdigits#1#2#3#4#5{%
- \bbl@exp{%
- \def\<\languagename digits>####1{% ie, \langdigits
- \<bbl@digits@\languagename>####1\\\@nil}%
- \def\<\languagename counter>####1{% ie, \langcounter
- \\\expandafter\<bbl@counter@\languagename>%
- \\\csname c@####1\endcsname}%
- \def\<bbl@counter@\languagename>####1{% ie, \bbl@counter@lang
- \\\expandafter\<bbl@digits@\languagename>%
- \\\number####1\\\@nil}}%
- \def\bbl@tempa##1##2##3##4##5{%
- \bbl@exp{% Wow, quite a lot of hashes! :-(
- \def\<bbl@digits@\languagename>########1{%
- \\\ifx########1\\\@nil % ie, \bbl@digits@lang
- \\\else
- \\\ifx0########1#1%
- \\\else\\\ifx1########1#2%
- \\\else\\\ifx2########1#3%
- \\\else\\\ifx3########1#4%
- \\\else\\\ifx4########1#5%
- \\\else\\\ifx5########1##1%
- \\\else\\\ifx6########1##2%
- \\\else\\\ifx7########1##3%
- \\\else\\\ifx8########1##4%
- \\\else\\\ifx9########1##5%
- \\\else########1%
- \\\fi\\\fi\\\fi\\\fi\\\fi\\\fi\\\fi\\\fi\\\fi\\\fi
- \\\expandafter\<bbl@digits@\languagename>%
- \\\fi}}}%
- \bbl@tempa}
-% \end{macrocode}
-%
% Depending on whether or not the language exists, we define two macros.
%
% \begin{macrocode}
@@ -8441,7 +10973,11 @@ help from Bernd Raichle, for which I am grateful.
\fi}%
\expandafter\bbl@tempb\bbl@captionslist\@empty
\else
- \bbl@read@ini{\bbl@KVP@captions}{data}% Here all letters cat = 11
+ \ifx\bbl@initoload\relax
+ \bbl@read@ini{\bbl@KVP@captions}0% Here letters cat = 11
+ \else
+ \bbl@read@ini{\bbl@initoload}0% Here all letters cat = 11
+ \fi
\bbl@after@ini
\bbl@savestrings
\fi
@@ -8454,18 +10990,48 @@ help from Bernd Raichle, for which I am grateful.
\bbl@savedate
\fi
\bbl@endcommands
+ \bbl@load@basic{#1}%
+ % == hyphenmins == (only if new)
\bbl@exp{%
- \def\<#1hyphenmins>{%
+ \gdef\<#1hyphenmins>{%
{\bbl@ifunset{bbl@lfthm@#1}{2}{\bbl@cs{lfthm@#1}}}%
{\bbl@ifunset{bbl@rgthm@#1}{3}{\bbl@cs{rgthm@#1}}}}}%
+ % == hyphenrules ==
\bbl@provide@hyphens{#1}%
+ % == frenchspacing == (only if new)
+ \bbl@ifunset{bbl@frspc@#1}{}%
+ {\edef\bbl@tempa{\bbl@cl{frspc}}%
+ \edef\bbl@tempa{\expandafter\@car\bbl@tempa\@nil}%
+ \if u\bbl@tempa % do nothing
+ \else\if n\bbl@tempa % non french
+ \expandafter\bbl@add\csname extras#1\endcsname{%
+ \let\bbl@elt\bbl@fs@elt@i
+ \bbl@fs@chars}%
+ \else\if y\bbl@tempa % french
+ \expandafter\bbl@add\csname extras#1\endcsname{%
+ \let\bbl@elt\bbl@fs@elt@ii
+ \bbl@fs@chars}%
+ \fi\fi\fi}%
+ %
\ifx\bbl@KVP@main\@nil\else
\expandafter\main@language\expandafter{#1}%
\fi}
+% A couple of macros used above, to avoid hashes #######...
+\def\bbl@fs@elt@i#1#2#3{%
+ \ifnum\sfcode`#1=#2\relax
+ \babel@savevariable{\sfcode`#1}%
+ \sfcode`#1=#3\relax
+ \fi}%
+\def\bbl@fs@elt@ii#1#2#3{%
+ \ifnum\sfcode`#1=#3\relax
+ \babel@savevariable{\sfcode`#1}%
+ \sfcode`#1=#2\relax
+ \fi}%
+%
\def\bbl@provide@renew#1{%
\ifx\bbl@KVP@captions\@nil\else
\StartBabelCommands*{#1}{captions}%
- \bbl@read@ini{\bbl@KVP@captions}{data}% Here all letters cat = 11
+ \bbl@read@ini{\bbl@KVP@captions}0% Here all letters cat = 11
\bbl@after@ini
\bbl@savestrings
\EndBabelCommands
@@ -8477,7 +11043,48 @@ help from Bernd Raichle, for which I am grateful.
\EndBabelCommands
\fi
% == hyphenrules ==
- \bbl@provide@hyphens{#1}}
+ \ifx\bbl@lbkflag\@empty
+ \bbl@provide@hyphens{#1}%
+ \fi}
+% Load the basic parameters (ids, typography, counters, and a few
+% more), while captions and dates are left out. But it may happen some
+% data has been loaded before automatically, so we first discard the
+% saved values.
+\def\bbl@linebreak@export{%
+ \bbl@exportkey{lnbrk}{typography.linebreaking}{h}%
+ \bbl@exportkey{hyphr}{typography.hyphenrules}{}%
+ \bbl@exportkey{lfthm}{typography.lefthyphenmin}{2}%
+ \bbl@exportkey{rgthm}{typography.righthyphenmin}{3}%
+ \bbl@exportkey{prehc}{typography.prehyphenchar}{}%
+ \bbl@exportkey{hyotl}{typography.hyphenate.other.locale}{}%
+ \bbl@exportkey{hyots}{typography.hyphenate.other.script}{}%
+ \bbl@exportkey{intsp}{typography.intraspace}{}%
+ \bbl@exportkey{chrng}{characters.ranges}{}}
+\def\bbl@load@basic#1{%
+ \bbl@ifunset{bbl@inidata@\languagename}{}%
+ {\getlocaleproperty\bbl@tempa{\languagename}{identification/load.level}%
+ \ifcase\bbl@tempa\else
+ \bbl@csarg\let{lname@\languagename}\relax
+ \fi}%
+ \bbl@ifunset{bbl@lname@#1}%
+ {\def\BabelBeforeIni##1##2{%
+ \begingroup
+ \let\bbl@ini@captions@aux\@gobbletwo
+ \def\bbl@inidate ####1.####2.####3.####4\relax ####5####6{}%
+ \bbl@read@ini{##1}0%
+ \bbl@linebreak@export
+ \bbl@exportkey{dgnat}{numbers.digits.native}{}%
+ \bbl@exportkey{frspc}{typography.frenchspacing}{u}% unset
+ \ifx\bbl@initoload\relax\endinput\fi
+ \endgroup}%
+ \begingroup % boxed, to avoid extra spaces:
+ \ifx\bbl@initoload\relax
+ \bbl@input@texini{#1}%
+ \else
+ \setbox\z@\hbox{\BabelBeforeIni{\bbl@initoload}{}}%
+ \fi
+ \endgroup}%
+ {}}
% \end{macrocode}
%
% The |hyphenrules| option is handled with an auxiliary macro.
@@ -8497,8 +11104,15 @@ help from Bernd Raichle, for which I am grateful.
{\bbl@exp{\let\bbl@tempa\<l@##1>}}%
\fi}%
\fi
- \ifx\bbl@tempa\relax % if no opt or no language in opt found
- \ifx\bbl@KVP@import\@nil\else % if importing
+ \ifx\bbl@tempa\relax % if no opt or no language in opt found
+ \ifx\bbl@KVP@import\@nil
+ \ifx\bbl@initoload\relax\else
+ \bbl@exp{% and hyphenrules is not empty
+ \\\bbl@ifblank{\bbl@cs{hyphr@#1}}%
+ {}%
+ {\let\\\bbl@tempa\<l@\bbl@cl{hyphr}>}}%
+ \fi
+ \else % if importing
\bbl@exp{% and hyphenrules is not empty
\\\bbl@ifblank{\bbl@cs{hyphr@#1}}%
{}%
@@ -8510,7 +11124,6 @@ help from Bernd Raichle, for which I am grateful.
{\bbl@exp{\\\adddialect\<l@#1>\language}}%
{}}% so, l@<lang> is ok - nothing to do
{\bbl@exp{\\\adddialect\<l@#1>\bbl@tempa}}}% found in opt list or ini
-
% \end{macrocode}
%
% The reader of |ini| files. There are 3 possible cases: a section name
@@ -8521,6 +11134,17 @@ help from Bernd Raichle, for which I am grateful.
\ifx\bbl@readstream\@undefined
\csname newread\endcsname\bbl@readstream
\fi
+\def\bbl@input@texini#1{%
+ \bbl@bsphack
+ \bbl@exp{%
+ \catcode`\\\%=14 \catcode`\\\\=0
+ \catcode`\\\{=1 \catcode`\\\}=2
+ \lowercase{\\\InputIfFileExists{babel-#1.tex}{}{}}%
+ \catcode`\\\%=\the\catcode`\%\relax
+ \catcode`\\\\=\the\catcode`\\\relax
+ \catcode`\\\{=\the\catcode`\{\relax
+ \catcode`\\\}=\the\catcode`\}\relax}%
+ \bbl@esphack}
\def\bbl@inipreread#1=#2\@@{%
\bbl@trim@def\bbl@tempa{#1}% Redundant below !!
\bbl@trim\toks@{#2}%
@@ -8531,8 +11155,10 @@ help from Bernd Raichle, for which I am grateful.
\\\bbl@elt{\bbl@section}{\bbl@tempa}{\the\toks@}}}%
\expandafter\bbl@inireader\bbl@tempa=#2\@@}%
{}}%
-\def\bbl@read@ini#1#2{%
- \bbl@csarg\edef{lini@\languagename}{#1}%
+\def\bbl@fetch@ini#1#2{%
+ \bbl@exp{\def\\\bbl@inidata{%
+ \\\bbl@elt{identification}{tag.ini}{#1}%
+ \\\bbl@elt{identification}{load.level}{#2}}}%
\openin\bbl@readstream=babel-#1.ini
\ifeof\bbl@readstream
\bbl@error
@@ -8541,14 +11167,12 @@ help from Bernd Raichle, for which I am grateful.
is not complete.}%
{Fix the name or reinstall babel.}%
\else
- \bbl@exp{\def\\\bbl@inidata{\\\bbl@elt{identificacion}{tag.ini}{#1}}}%
- \let\bbl@section\@empty
- \let\bbl@savestrings\@empty
- \let\bbl@savetoday\@empty
- \let\bbl@savedate\@empty
- \let\bbl@inireader\bbl@iniskip
- \bbl@info{Importing #2 for \languagename\\%
- from babel-#1.ini. Reported}%
+ \catcode`\[=12 \catcode`\]=12 \catcode`\==12 \catcode`\&=12
+ \catcode`\;=12 \catcode`\|=12 \catcode`\%=14 \catcode`\-=12
+ \bbl@info{Importing
+ \ifcase#2 \or font and identification \or basic \fi
+ data for \languagename\\%
+ from babel-#1.ini. Reported}%
\loop
\if T\ifeof\bbl@readstream F\fi T\relax % Trick, because inside \loop
\endlinechar\m@ne
@@ -8558,28 +11182,35 @@ help from Bernd Raichle, for which I am grateful.
\expandafter\bbl@iniline\bbl@line\bbl@iniline
\fi
\repeat
- \bbl@foreach\bbl@renewlist{%
- \bbl@ifunset{bbl@renew@##1}{}{\bbl@inisec[##1]\@@}}%
- \global\let\bbl@renewlist\@empty
- % Ends last section. See \bbl@inisec
- \def\bbl@elt##1##2{\bbl@inireader##1=##2\@@}%
- \bbl@cs{renew@\bbl@section}%
- \global\bbl@csarg\let{renew@\bbl@section}\relax
- \bbl@cs{secpost@\bbl@section}%
- \bbl@csarg{\global\expandafter\let}{inidata@\languagename}\bbl@inidata
- \bbl@exp{\\\bbl@add@list\\\bbl@ini@loaded{\languagename}}%
- \bbl@toglobal\bbl@ini@loaded
\fi}
+\def\bbl@read@ini#1#2{%
+ \bbl@csarg\xdef{lini@\languagename}{#1}%
+ \let\bbl@section\@empty
+ \let\bbl@savestrings\@empty
+ \let\bbl@savetoday\@empty
+ \let\bbl@savedate\@empty
+ \let\bbl@inireader\bbl@iniskip
+ \bbl@fetch@ini{#1}{#2}%
+ \bbl@foreach\bbl@renewlist{%
+ \bbl@ifunset{bbl@renew@##1}{}{\bbl@inisec[##1]\@@}}%
+ \global\let\bbl@renewlist\@empty
+ % Ends last section. See \bbl@inisec
+ \def\bbl@elt##1##2{\bbl@inireader##1=##2\@@}%
+ \bbl@cs{renew@\bbl@section}%
+ \global\bbl@csarg\let{renew@\bbl@section}\relax
+ \bbl@cs{secpost@\bbl@section}%
+ \bbl@csarg{\global\expandafter\let}{inidata@\languagename}\bbl@inidata
+ \bbl@exp{\\\bbl@add@list\\\bbl@ini@loaded{\languagename}}%
+ \bbl@toglobal\bbl@ini@loaded}
\def\bbl@iniline#1\bbl@iniline{%
\@ifnextchar[\bbl@inisec{\@ifnextchar;\bbl@iniskip\bbl@inipreread}#1\@@}% ]
% \end{macrocode}
%
% The special cases for comment lines and sections are handled by the
% two following commands. In sections, we provide the posibility to
-% take extra actions at the end or at the start (TODO - but note the last
-% section is not ended). By default, key=val pairs are ignored. The
-% |secpost| ``hook'' is used only by `identification', while |secpre|
-% only by |date.gregorian.licr|.
+% take extra actions at the end or at the start. By default, key=val
+% pairs are ignored. The |secpost| ``hook'' is used only by
+% `identification', while |secpre| only by |date.gregorian.licr|.
%
% \begin{macrocode}
\def\bbl@iniskip#1\@@{}% if starts with ;
@@ -8594,7 +11225,28 @@ help from Bernd Raichle, for which I am grateful.
\global\bbl@csarg\let{renew@\bbl@section}\relax
\bbl@cs{secpost@\bbl@section}%
% The previous code belongs to the previous section.
+ % --------------------------
% Now start the current one.
+ \in@{=date.}{=#1}%
+ \ifin@
+ \lowercase{\def\bbl@tempa{=#1=}}%
+ \bbl@replace\bbl@tempa{=date.gregorian}{}%
+ \bbl@replace\bbl@tempa{=date.}{}%
+ \in@{.licr=}{#1=}%
+ \ifin@
+ \ifcase\bbl@engine
+ \bbl@replace\bbl@tempa{.licr=}{}%
+ \else
+ \let\bbl@tempa\relax
+ \fi
+ \fi
+ \ifx\bbl@tempa\relax\else
+ \bbl@replace\bbl@tempa{=}{}%
+ \bbl@exp{%
+ \def\<bbl@inikv@#1>####1=####2\\\@@{%
+ \\\bbl@inidate####1...\relax{####2}{\bbl@tempa}}}%
+ \fi
+ \fi
\def\bbl@section{#1}%
\def\bbl@elt##1##2{%
\@namedef{bbl@KVP@#1/##1}{}}%
@@ -8648,6 +11300,7 @@ help from Bernd Raichle, for which I am grateful.
From babel-\bbl@cs{lini@\languagename}.ini:\\%
\bbl@cs{@kv@identification.warning#1}\\%
Reported }}}
+%
\let\bbl@inikv@identification\bbl@inikv
\def\bbl@secpost@identification{%
\bbl@iniwarning{}%
@@ -8661,46 +11314,62 @@ help from Bernd Raichle, for which I am grateful.
\bbl@exportkey{elname}{identification.name.english}{}%
\bbl@exp{\\\bbl@exportkey{lname}{identification.name.opentype}%
{\csname bbl@elname@\languagename\endcsname}}%
- \bbl@exportkey{lbcp}{identification.tag.bcp47}{}%
+ \bbl@exportkey{tbcp}{identification.tag.bcp47}{}%
+ \bbl@exportkey{lbcp}{identification.language.tag.bcp47}{}%
\bbl@exportkey{lotf}{identification.tag.opentype}{dflt}%
\bbl@exportkey{esname}{identification.script.name}{}%
\bbl@exp{\\\bbl@exportkey{sname}{identification.script.name.opentype}%
{\csname bbl@esname@\languagename\endcsname}}%
\bbl@exportkey{sbcp}{identification.script.tag.bcp47}{}%
- \bbl@exportkey{sotf}{identification.script.tag.opentype}{DFLT}}
+ \bbl@exportkey{sotf}{identification.script.tag.opentype}{DFLT}%
+ \ifbbl@bcptoname
+ \bbl@csarg\xdef{bcp@map@\bbl@cl{tbcp}}{\languagename}%
+ \fi}
+% \end{macrocode}
+%
+% By default, the following sections are just read. Actions are taken
+% later.
+%
+% \begin{macrocode}
\let\bbl@inikv@typography\bbl@inikv
\let\bbl@inikv@characters\bbl@inikv
\let\bbl@inikv@numbers\bbl@inikv
+% \end{macrocode}
+%
+% Additive numerals require an additional definition. When |.1| is
+% found, two macros are defined -- the basic one, without |.1| called
+% by |\localenumeral|, and another one preserving the trailing |.1| for
+% the ‘units’.
+%
+% \begin{macrocode}
\def\bbl@inikv@counters#1=#2\@@{%
+ \bbl@ifsamestring{#1}{digits}%
+ {\bbl@error{The counter name 'digits' is reserved for mapping\\%
+ decimal digits}%
+ {Use another name.}}%
+ {}%
\def\bbl@tempc{#1}%
\bbl@trim@def{\bbl@tempb*}{#2}%
\in@{.1$}{#1$}%
\ifin@
\bbl@replace\bbl@tempc{.1}{}%
- \bbl@csarg\xdef{cntr@\bbl@tempc @\languagename}{%
+ \bbl@csarg\protected@xdef{cntr@\bbl@tempc @\languagename}{%
\noexpand\bbl@alphnumeral{\bbl@tempc}}%
\fi
\in@{.F.}{#1}%
\ifin@\else\in@{.S.}{#1}\fi
\ifin@
- \bbl@csarg\xdef{cntr@#1@\languagename}{\bbl@tempb*}%
+ \bbl@csarg\protected@xdef{cntr@#1@\languagename}{\bbl@tempb*}%
\else
\toks@{}% Required by \bbl@buildifcase, which returns \bbl@tempa
\expandafter\bbl@buildifcase\bbl@tempb* \\ % Space after \\
\bbl@csarg{\global\expandafter\let}{cntr@#1@\languagename}\bbl@tempa
\fi}
\def\bbl@after@ini{%
- \bbl@exportkey{lfthm}{typography.lefthyphenmin}{2}%
- \bbl@exportkey{rgthm}{typography.righthyphenmin}{3}%
- \bbl@exportkey{prehc}{typography.prehyphenchar}{}%
- \bbl@exportkey{lnbrk}{typography.linebreaking}{h}%
- \bbl@exportkey{hyphr}{typography.hyphenrules}{}%
- \bbl@exportkey{hyoth}{typography.hyphenate.other}{}%
- \bbl@exportkey{intsp}{typography.intraspace}{}%
- \bbl@exportkey{jstfy}{typography.justify}{w}%
- \bbl@exportkey{chrng}{characters.ranges}{}%
+ \bbl@linebreak@export
\bbl@exportkey{dgnat}{numbers.digits.native}{}%
\bbl@exportkey{rqtex}{identification.require.babel}{}%
+ \bbl@exportkey{frspc}{typography.frenchspacing}{u}% unset
\bbl@toglobal\bbl@savetoday
\bbl@toglobal\bbl@savedate}
% \end{macrocode}
@@ -8723,74 +11392,231 @@ help from Bernd Raichle, for which I am grateful.
% The auxiliary macro for captions define |\<caption>name|.
%
% \begin{macrocode}
+\def\bbl@ini@captions@template#1#2{% string language tempa=capt-name
+ \bbl@replace\bbl@tempa{.template}{}%
+ \def\bbl@toreplace{#1{}}%
+ \bbl@replace\bbl@toreplace{[ ]}{\nobreakspace{}}%
+ \bbl@replace\bbl@toreplace{[[}{\csname}%
+ \bbl@replace\bbl@toreplace{[}{\csname the}%
+ \bbl@replace\bbl@toreplace{]]}{name\endcsname{}}%
+ \bbl@replace\bbl@toreplace{]}{\endcsname{}}%
+ \bbl@xin@{,\bbl@tempa,}{,chapter,appendix,part,}%
+ \ifin@
+ \@nameuse{bbl@patch\bbl@tempa}%
+ \global\bbl@csarg\let{\bbl@tempa fmt@#2}\bbl@toreplace
+ \fi
+ \bbl@xin@{,\bbl@tempa,}{,figure,table,}%
+ \ifin@
+ \toks@\expandafter{\bbl@toreplace}%
+ \bbl@exp{\gdef\<fnum@\bbl@tempa>{\the\toks@}}%
+ \fi}
\def\bbl@ini@captions@aux#1#2{%
\bbl@trim@def\bbl@tempa{#1}%
- \bbl@ifblank{#2}%
- {\bbl@exp{%
- \toks@{\\\bbl@nocaption{\bbl@tempa}{\languagename\bbl@tempa name}}}}%
- {\bbl@trim\toks@{#2}}%
- \bbl@exp{%
- \\\bbl@add\\\bbl@savestrings{%
- \\\SetString\<\bbl@tempa name>{\the\toks@}}}}
+ \bbl@xin@{.template}{\bbl@tempa}%
+ \ifin@
+ \bbl@ini@captions@template{#2}\languagename
+ \else
+ \bbl@ifblank{#2}%
+ {\bbl@exp{%
+ \toks@{\\\bbl@nocaption{\bbl@tempa}{\languagename\bbl@tempa name}}}}%
+ {\bbl@trim\toks@{#2}}%
+ \bbl@exp{%
+ \\\bbl@add\\\bbl@savestrings{%
+ \\\SetString\<\bbl@tempa name>{\the\toks@}}}%
+ \toks@\expandafter{\bbl@captionslist}%
+ \bbl@exp{\\\in@{\<\bbl@tempa name>}{\the\toks@}}%
+ \ifin@\else
+ \bbl@exp{%
+ \\\bbl@add\<bbl@extracaps@\languagename>{\<\bbl@tempa name>}%
+ \\\bbl@toglobal\<bbl@extracaps@\languagename>}%
+ \fi
+ \fi}
% \end{macrocode}
%
-% But dates are more complex. The full date format is stores in
-% |date.gregorian|, so we must read it in non-Unicode engines, too
-% (saved months are just discarded when the LICR section is reached).
+% \textbf{Labels.} Captions must contain just strings, no
+% format at all, so there is new group in ini files.
+%
+% \begin{macrocode}
+\def\bbl@list@the{%
+ part,chapter,section,subsection,subsubsection,paragraph,%
+ subparagraph,enumi,enumii,enumiii,enumiv,equation,figure,%
+ table,page,footnote,mpfootnote,mpfn}
+\def\bbl@map@cnt#1{% #1:roman,etc, // #2:enumi,etc
+ \bbl@ifunset{bbl@map@#1@\languagename}%
+ {\@nameuse{#1}}%
+ {\@nameuse{bbl@map@#1@\languagename}}}
+\def\bbl@inikv@labels#1=#2\@@{%
+ \in@{.map}{#1}%
+ \ifin@
+ \ifx\bbl@KVP@labels\@nil\else
+ \bbl@xin@{ map }{ \bbl@KVP@labels\space}%
+ \ifin@
+ \def\bbl@tempc{#1}%
+ \bbl@replace\bbl@tempc{.map}{}%
+ \in@{,#2,}{,arabic,roman,Roman,alph,Alph,fnsymbol,}%
+ \bbl@exp{%
+ \gdef\<bbl@map@\bbl@tempc @\languagename>%
+ {\ifin@\<#2>\else\\\localecounter{#2}\fi}}%
+ \bbl@foreach\bbl@list@the{%
+ \bbl@ifunset{the##1}{}%
+ {\bbl@exp{\let\\\bbl@tempd\<the##1>}%
+ \bbl@exp{%
+ \\\bbl@sreplace\<the##1>%
+ {\<\bbl@tempc>{##1}}{\\\bbl@map@cnt{\bbl@tempc}{##1}}%
+ \\\bbl@sreplace\<the##1>%
+ {\<\@empty @\bbl@tempc>\<c@##1>}{\\\bbl@map@cnt{\bbl@tempc}{##1}}}%
+ \expandafter\ifx\csname the##1\endcsname\bbl@tempd\else
+ \toks@\expandafter\expandafter\expandafter{%
+ \csname the##1\endcsname}%
+ \expandafter\xdef\csname the##1\endcsname{{\the\toks@}}%
+ \fi}}%
+ \fi
+ \fi
+ %
+ \else
+ %
+ % The following code is still under study. You can test it and make
+ % suggestions. Eg, enumerate.2 = ([enumi]).([enumii]). It's
+ % language dependent.
+ \in@{enumerate.}{#1}%
+ \ifin@
+ \def\bbl@tempa{#1}%
+ \bbl@replace\bbl@tempa{enumerate.}{}%
+ \def\bbl@toreplace{#2}%
+ \bbl@replace\bbl@toreplace{[ ]}{\nobreakspace{}}%
+ \bbl@replace\bbl@toreplace{[}{\csname the}%
+ \bbl@replace\bbl@toreplace{]}{\endcsname{}}%
+ \toks@\expandafter{\bbl@toreplace}%
+ \bbl@exp{%
+ \\\bbl@add\<extras\languagename>{%
+ \\\babel@save\<labelenum\romannumeral\bbl@tempa>%
+ \def\<labelenum\romannumeral\bbl@tempa>{\the\toks@}}%
+ \\\bbl@toglobal\<extras\languagename>}%
+ \fi
+ \fi}
+% \end{macrocode}
%
-% TODO. Remove copypaste pattern.
+% To show correctly some captions in a few languages, we need to patch
+% some internal macros, because the order is hardcoded. For example, in
+% Japanese the chapter number is surrounded by two string, while in
+% Hungarian is placed after. These replacement works in many classes,
+% but not all. Actually, the following lines are somewhat tentative.
%
% \begin{macrocode}
-\bbl@csarg\def{inikv@date.gregorian}#1=#2\@@{% for defaults
- \bbl@inidate#1...\relax{#2}{}}
-\bbl@csarg\def{inikv@date.islamic}#1=#2\@@{%
- \bbl@inidate#1...\relax{#2}{islamic}}
-\bbl@csarg\def{inikv@date.hebrew}#1=#2\@@{%
- \bbl@inidate#1...\relax{#2}{hebrew}}
-\bbl@csarg\def{inikv@date.persian}#1=#2\@@{%
- \bbl@inidate#1...\relax{#2}{persian}}
-\bbl@csarg\def{inikv@date.indian}#1=#2\@@{%
- \bbl@inidate#1...\relax{#2}{indian}}
-\ifcase\bbl@engine
- \bbl@csarg\def{inikv@date.gregorian.licr}#1=#2\@@{% override
- \bbl@inidate#1...\relax{#2}{}}
- \bbl@csarg\def{secpre@date.gregorian.licr}{% discard uni
- \ifcase\bbl@engine\let\bbl@savedate\@empty\fi}
+\def\bbl@chaptype{chapter}
+\ifx\@makechapterhead\@undefined
+ \let\bbl@patchchapter\relax
+\else\ifx\thechapter\@undefined
+ \let\bbl@patchchapter\relax
+\else\ifx\ps@headings\@undefined
+ \let\bbl@patchchapter\relax
+\else
+ \def\bbl@patchchapter{%
+ \global\let\bbl@patchchapter\relax
+ \bbl@add\appendix{\def\bbl@chaptype{appendix}}% Not harmful, I hope
+ \bbl@toglobal\appendix
+ \bbl@sreplace\ps@headings
+ {\@chapapp\ \thechapter}%
+ {\bbl@chapterformat}%
+ \bbl@toglobal\ps@headings
+ \bbl@sreplace\chaptermark
+ {\@chapapp\ \thechapter}%
+ {\bbl@chapterformat}%
+ \bbl@toglobal\chaptermark
+ \bbl@sreplace\@makechapterhead
+ {\@chapapp\space\thechapter}%
+ {\bbl@chapterformat}%
+ \bbl@toglobal\@makechapterhead
+ \gdef\bbl@chapterformat{%
+ \bbl@ifunset{bbl@\bbl@chaptype fmt@\languagename}%
+ {\@chapapp\space\thechapter}
+ {\@nameuse{bbl@\bbl@chaptype fmt@\languagename}}}}
+ \let\bbl@patchappendix\bbl@patchchapter
+\fi\fi\fi
+\ifx\@part\@undefined
+ \let\bbl@patchpart\relax
+\else
+ \def\bbl@patchpart{%
+ \global\let\bbl@patchpart\relax
+ \bbl@sreplace\@part
+ {\partname\nobreakspace\thepart}%
+ {\bbl@partformat}%
+ \bbl@toglobal\@part
+ \gdef\bbl@partformat{%
+ \bbl@ifunset{bbl@partfmt@\languagename}%
+ {\partname\nobreakspace\thepart}
+ {\@nameuse{bbl@partfmt@\languagename}}}}
\fi
-% eg: 1=months, 2=wide, 3=1, 4=dummy
+% \end{macrocode}
+%
+% \textbf{Date.} TODO. Document
+%
+% \begin{macrocode}
+% Arguments are _not_ protected.
+\let\bbl@calendar\@empty
+\DeclareRobustCommand\localedate[1][]{\bbl@localedate{#1}}
+\def\bbl@localedate#1#2#3#4{%
+ \begingroup
+ \ifx\@empty#1\@empty\else
+ \let\bbl@ld@calendar\@empty
+ \let\bbl@ld@variant\@empty
+ \edef\bbl@tempa{\zap@space#1 \@empty}%
+ \def\bbl@tempb##1=##2\@@{\@namedef{bbl@ld@##1}{##2}}%
+ \bbl@foreach\bbl@tempa{\bbl@tempb##1\@@}%
+ \edef\bbl@calendar{%
+ \bbl@ld@calendar
+ \ifx\bbl@ld@variant\@empty\else
+ .\bbl@ld@variant
+ \fi}%
+ \bbl@replace\bbl@calendar{gregorian}{}%
+ \fi
+ \bbl@cased
+ {\@nameuse{bbl@date@\languagename @\bbl@calendar}{#2}{#3}{#4}}%
+ \endgroup}
+% eg: 1=months, 2=wide, 3=1, 4=dummy, 5=value, 6=calendar
\def\bbl@inidate#1.#2.#3.#4\relax#5#6{% TODO - ignore with 'captions'
\bbl@trim@def\bbl@tempa{#1.#2}%
\bbl@ifsamestring{\bbl@tempa}{months.wide}% to savedate
{\bbl@trim@def\bbl@tempa{#3}%
\bbl@trim\toks@{#5}%
- \bbl@exp{%
- \\\bbl@add\\\bbl@savedate{%
- \\\SetString\<month\romannumeral\bbl@tempa#6name>{\the\toks@}}}}%
+ \@temptokena\expandafter{\bbl@savedate}%
+ \bbl@exp{% Reverse order - in ini last wins
+ \def\\\bbl@savedate{%
+ \\\SetString\<month\romannumeral\bbl@tempa#6name>{\the\toks@}%
+ \the\@temptokena}}}%
{\bbl@ifsamestring{\bbl@tempa}{date.long}% defined now
- {\bbl@trim@def\bbl@toreplace{#5}%
+ {\lowercase{\def\bbl@tempb{#6}}%
+ \bbl@trim@def\bbl@toreplace{#5}%
\bbl@TG@@date
- \global\bbl@csarg\let{date@\languagename}\bbl@toreplace
- \bbl@exp{%
- \gdef\<\languagename date>{\\\protect\<\languagename date >}%
- \gdef\<\languagename date >####1####2####3{%
- \\\bbl@usedategrouptrue
- \<bbl@ensure@\languagename>{%
- \<bbl@date@\languagename>{####1}{####2}{####3}}}%
- \\\bbl@add\\\bbl@savetoday{%
- \\\SetString\\\today{%
- \<\languagename date>{\\\the\year}{\\\the\month}{\\\the\day}}}}}}%
- {}}
-% \end{macrocode}
-%
-% Dates will require some macros for the basic formatting. They may be
-% redefined by language, so ``semi-public'' names (camel case) are
-% used. Oddly enough, the CLDR places particles like “de”
+ \bbl@ifunset{bbl@date@\languagename @}%
+ {\global\bbl@csarg\let{date@\languagename @}\bbl@toreplace
+ % TODO. Move to a better place.
+ \bbl@exp{%
+ \gdef\<\languagename date>{\\\protect\<\languagename date >}%
+ \gdef\<\languagename date >####1####2####3{%
+ \\\bbl@usedategrouptrue
+ \<bbl@ensure@\languagename>{%
+ \\\localedate{####1}{####2}{####3}}}%
+ \\\bbl@add\\\bbl@savetoday{%
+ \\\SetString\\\today{%
+ \<\languagename date>%
+ {\\\the\year}{\\\the\month}{\\\the\day}}}}}%
+ {}%
+ \ifx\bbl@tempb\@empty\else
+ \global\bbl@csarg\let{date@\languagename @\bbl@tempb}\bbl@toreplace
+ \fi}%
+ {}}}
+% \end{macrocode}
+%
+% \textbf{Dates} will require some macros for the basic formatting.
+% They may be redefined by language, so ``semi-public'' names (camel
+% case) are used. Oddly enough, the CLDR places particles like “de”
% inconsistently in either in the date or in the month name.
%
% \begin{macrocode}
\let\bbl@calendar\@empty
\newcommand\BabelDateSpace{\nobreakspace}
-\newcommand\BabelDateDot{.\@}
+\newcommand\BabelDateDot{.\@} % TODO. \let instead of repeating
\newcommand\BabelDated[1]{{\number#1}}
\newcommand\BabelDatedd[1]{{\ifnum#1<10 0\fi\number#1}}
\newcommand\BabelDateM[1]{{\number#1}}
@@ -8823,9 +11649,14 @@ help from Bernd Raichle, for which I am grateful.
\bbl@replace\bbl@toreplace{[y]}{\BabelDatey{####1}}%
\bbl@replace\bbl@toreplace{[yy]}{\BabelDateyy{####1}}%
\bbl@replace\bbl@toreplace{[yyyy]}{\BabelDateyyyy{####1}}%
+ \bbl@replace\bbl@toreplace{[y|}{\bbl@datecntr[####1|}%
+ \bbl@replace\bbl@toreplace{[m|}{\bbl@datecntr[####2|}%
+ \bbl@replace\bbl@toreplace{[d|}{\bbl@datecntr[####3|}%
% Note after \bbl@replace \toks@ contains the resulting string.
% TODO - Using this implicit behavior doesn't seem a good idea.
\bbl@replace@finish@iii\bbl@toreplace}
+\def\bbl@datecntr{\expandafter\bbl@xdatecntr\expandafter}
+\def\bbl@xdatecntr[#1|#2]{\localenumeral{#2}{#1}}
% \end{macrocode}
%
% Language and Script values to be used when defining a font or
@@ -8846,9 +11677,38 @@ help from Bernd Raichle, for which I am grateful.
\bbl@ifunset{bbl@prehc@#1}{}%
{\bbl@exp{\\\bbl@ifblank{\bbl@cs{prehc@#1}}}%
{}%
- {\bbl@csarg\bbl@add@list{lsys@#1}{HyphenChar="200B}}}%
+ {\ifx\bbl@xenohyph\@undefined
+ \let\bbl@xenohyph\bbl@xenohyph@d
+ \ifx\AtBeginDocument\@notprerr
+ \expandafter\@secondoftwo % to execute right now
+ \fi
+ \AtBeginDocument{%
+ \expandafter\bbl@add
+ \csname selectfont \endcsname{\bbl@xenohyph}%
+ \expandafter\selectlanguage\expandafter{\languagename}%
+ \expandafter\bbl@toglobal\csname selectfont \endcsname}%
+ \fi}}%
\fi
\bbl@csarg\bbl@toglobal{lsys@#1}}
+\def\bbl@xenohyph@d{%
+ \bbl@ifset{bbl@prehc@\languagename}%
+ {\ifnum\hyphenchar\font=\defaulthyphenchar
+ \iffontchar\font\bbl@cl{prehc}\relax
+ \hyphenchar\font\bbl@cl{prehc}\relax
+ \else\iffontchar\font"200B
+ \hyphenchar\font"200B
+ \else
+ \bbl@warning
+ {Neither 0 nor ZERO WIDTH SPACE are available\\%
+ in the current font, and therefore the hyphen\\%
+ will be printed. Try changing the fontspec's\\%
+ 'HyphenChar' to another value, but be aware\\%
+ this setting is not safe (see the manual)}%
+ \hyphenchar\font\defaulthyphenchar
+ \fi\fi
+ \fi}%
+ {\hyphenchar\font\defaulthyphenchar}}
+ % \fi}
% \end{macrocode}
%
% The following |ini| reader ignores everything but the
@@ -8864,11 +11724,49 @@ help from Bernd Raichle, for which I am grateful.
\def\BabelBeforeIni##1##2{%
\begingroup
\bbl@add\bbl@secpost@identification{\closein\bbl@readstream }%
- \catcode`\[=12 \catcode`\]=12 \catcode`\==12 \catcode`\;=12 %
- \bbl@read@ini{##1}{font and identification data}%
+ \bbl@read@ini{##1}1%
\endinput % babel- .tex may contain onlypreamble's
\endgroup}% boxed, to avoid extra spaces:
- {\setbox\z@\hbox{\InputIfFileExists{babel-#1.tex}{}{}}}}
+ {\bbl@input@texini{#1}}}
+% \end{macrocode}
+%
+% A tool to define the macros for native digits from the list provided
+% in the |ini| file. Somewhat convoluted because there are 10 digits,
+% but only 9 arguments in \TeX. Non-digits characters are kept. The
+% first macro is the generic “localized” command.
+%
+% \begin{macrocode}
+\def\bbl@setdigits#1#2#3#4#5{%
+ \bbl@exp{%
+ \def\<\languagename digits>####1{% ie, \langdigits
+ \<bbl@digits@\languagename>####1\\\@nil}%
+ \let\<bbl@cntr@digits@\languagename>\<\languagename digits>%
+ \def\<\languagename counter>####1{% ie, \langcounter
+ \\\expandafter\<bbl@counter@\languagename>%
+ \\\csname c@####1\endcsname}%
+ \def\<bbl@counter@\languagename>####1{% ie, \bbl@counter@lang
+ \\\expandafter\<bbl@digits@\languagename>%
+ \\\number####1\\\@nil}}%
+ \def\bbl@tempa##1##2##3##4##5{%
+ \bbl@exp{% Wow, quite a lot of hashes! :-(
+ \def\<bbl@digits@\languagename>########1{%
+ \\\ifx########1\\\@nil % ie, \bbl@digits@lang
+ \\\else
+ \\\ifx0########1#1%
+ \\\else\\\ifx1########1#2%
+ \\\else\\\ifx2########1#3%
+ \\\else\\\ifx3########1#4%
+ \\\else\\\ifx4########1#5%
+ \\\else\\\ifx5########1##1%
+ \\\else\\\ifx6########1##2%
+ \\\else\\\ifx7########1##3%
+ \\\else\\\ifx8########1##4%
+ \\\else\\\ifx9########1##5%
+ \\\else########1%
+ \\\fi\\\fi\\\fi\\\fi\\\fi\\\fi\\\fi\\\fi\\\fi\\\fi
+ \\\expandafter\<bbl@digits@\languagename>%
+ \\\fi}}}%
+ \bbl@tempa}
% \end{macrocode}
%
% Alphabetic counters must be converted from a space separated list to
@@ -8892,13 +11790,14 @@ help from Bernd Raichle, for which I am grateful.
% number of digits in the number to be converted. This explains the
% reverse set |76543210|. Digits above 10000 are not handled yet. When
% the key contains the subkey |.F.|, the number after is treated as an
-% special case. for a fixed form (see |babel-he.ini|, for example).
+% special case, for a fixed form (see |babel-he.ini|, for example).
%
% \begin{macrocode}
\newcommand\localenumeral[2]{\bbl@cs{cntr@#1@\languagename}{#2}}
\def\bbl@localecntr#1#2{\localenumeral{#2}{#1}}
\newcommand\localecounter[2]{%
- \expandafter\bbl@localecntr\csname c@#2\endcsname{#1}}
+ \expandafter\bbl@localecntr
+ \expandafter{\number\csname c@#2\endcsname}{#1}}
\def\bbl@alphnumeral#1#2{%
\expandafter\bbl@alphnumeral@i\number#2 76543210\@@{#1}}
\def\bbl@alphnumeral@i#1#2#3#4#5#6#7#8\@@#9{%
@@ -8915,7 +11814,7 @@ help from Bernd Raichle, for which I am grateful.
\bbl@cs{cntr@#1.3@\languagename}#6%
\bbl@cs{cntr@#1.2@\languagename}#7%
\bbl@cs{cntr@#1.1@\languagename}#8%
- \ifnum#6#7#8>\z@ % An ad hod rule for Greek. Ugly. To be fixed.
+ \ifnum#6#7#8>\z@ % TODO. An ad hoc rule for Greek. Ugly.
\bbl@ifunset{bbl@cntr@#1.S.321@\languagename}{}%
{\bbl@cs{cntr@#1.S.321@\languagename}}%
\fi}%
@@ -8940,34 +11839,42 @@ help from Bernd Raichle, for which I am grateful.
\@namedef{bbl@info@tag.ini}{lini}
\@namedef{bbl@info@name.english}{elname}
\@namedef{bbl@info@name.opentype}{lname}
-\@namedef{bbl@info@tag.bcp47}{lbcp}
-\@namedef{bbl@info@tag.opentype}{lotf}
+\@namedef{bbl@info@tag.bcp47}{tbcp}
+\@namedef{bbl@info@language.tag.bcp47}{lbcp}
+\@namedef{bbl@info@tag.opentype}{lotf}
\@namedef{bbl@info@script.name}{esname}
\@namedef{bbl@info@script.name.opentype}{sname}
\@namedef{bbl@info@script.tag.bcp47}{sbcp}
\@namedef{bbl@info@script.tag.opentype}{sotf}
\let\bbl@ensureinfo\@gobble
\newcommand\BabelEnsureInfo{%
- \def\bbl@ensureinfo##1{%
- \ifx\InputIfFileExists\@undefined\else % not in plain
- \bbl@ifunset{bbl@lname@##1}{\bbl@ini@basic{##1}}{}%
- \fi}}
+ \ifx\InputIfFileExists\@undefined\else
+ \def\bbl@ensureinfo##1{%
+ \bbl@ifunset{bbl@lname@##1}{\bbl@ini@basic{##1}}{}}%
+ \fi
+ \bbl@foreach\bbl@loaded{{%
+ \def\languagename{##1}%
+ \bbl@ensureinfo{##1}}}}
% \end{macrocode}
%
-% More general, but non-expandable, is |\getlocaleproperty|. To inspect
-% every possible loaded |ini|, we define |\LocaleForEach|, where
-% |\bbl@ini@loaded| is a comma-separated list of locales, built by
-% |\bbl@read@ini|.
+% More general, but non-expandable, is |\getlocaleproperty|. To inspect
+% every possible loaded |ini|, we define |\LocaleForEach|, where
+% |\bbl@ini@loaded| is a comma-separated list of locales, built by
+% |\bbl@read@ini|.
%
% \begin{macrocode}
-\newcommand\getlocaleproperty[3]{%
+\newcommand\getlocaleproperty{%
+ \@ifstar\bbl@getproperty@s\bbl@getproperty@x}
+\def\bbl@getproperty@s#1#2#3{%
\let#1\relax
\def\bbl@elt##1##2##3{%
\bbl@ifsamestring{##1/##2}{#3}%
{\providecommand#1{##3}%
\def\bbl@elt####1####2####3{}}%
{}}%
- \bbl@cs{inidata@#2}%
+ \bbl@cs{inidata@#2}}%
+\def\bbl@getproperty@x#1#2#3{%
+ \bbl@getproperty@s{#1}{#2}{#3}%
\ifx#1\relax
\bbl@error
{Unknown key for locale '#2':\\%
@@ -8975,6 +11882,7 @@ help from Bernd Raichle, for which I am grateful.
\string#1 will be set to \relax}%
{Perhaps you misspelled it.}%
\fi}
+\let\bbl@ini@loaded\@empty
\newcommand\LocaleForEach{\bbl@foreach\bbl@ini@loaded}
% \end{macrocode}
%
@@ -8985,7 +11893,10 @@ help from Bernd Raichle, for which I am grateful.
%
% \begin{macrocode}
\newcommand\babeladjust[1]{% TODO. Error handling.
- \bbl@forkv{#1}{\bbl@cs{ADJ@##1@##2}}}
+ \bbl@forkv{#1}{%
+ \bbl@ifunset{bbl@ADJ@##1@##2}%
+ {\bbl@cs{ADJ@##1}{##2}}%
+ {\bbl@cs{ADJ@##1@##2}}}}
%
\def\bbl@adjust@lua#1#2{%
\ifvmode
@@ -9035,1944 +11946,48 @@ help from Bernd Raichle, for which I am grateful.
\bbl@adjust@layout{\let\@tabular\bbl@OL@@tabular}}
\@namedef{bbl@ADJ@layout.lists@on}{%
\bbl@adjust@layout{\let\list\bbl@NL@list}}
-\@namedef{bbl@ADJ@layout.lists@on}{%
+\@namedef{bbl@ADJ@layout.lists@off}{%
\bbl@adjust@layout{\let\list\bbl@OL@list}}
\@namedef{bbl@ADJ@hyphenation.extra@on}{%
\bbl@activateposthyphen}
-% \end{macrocode}
%
-% \section{The kernel of Babel (\texttt{babel.def} for \LaTeX only)}
+\@namedef{bbl@ADJ@autoload.bcp47@on}{%
+ \bbl@bcpallowedtrue}
+\@namedef{bbl@ADJ@autoload.bcp47@off}{%
+ \bbl@bcpallowedfalse}
+\@namedef{bbl@ADJ@autoload.bcp47.prefix}#1{%
+ \def\bbl@bcp@prefix{#1}}
+\def\bbl@bcp@prefix{bcp47-}
+\@namedef{bbl@ADJ@autoload.options}#1{%
+ \def\bbl@autoload@options{#1}}
+\let\bbl@autoload@bcpoptions\@empty
+\@namedef{bbl@ADJ@autoload.bcp47.options}#1{%
+ \def\bbl@autoload@bcpoptions{#1}}
+\newif\ifbbl@bcptoname
+\@namedef{bbl@ADJ@bcp47.toname@on}{%
+ \bbl@bcptonametrue
+ \BabelEnsureInfo}
+\@namedef{bbl@ADJ@bcp47.toname@off}{%
+ \bbl@bcptonamefalse}
+% TODO: use babel name, override
+%
+% As the final task, load the code for lua.
%
-% \subsection{The redefinition of the style commands}
-%
-% The rest of the code in this file can only be processed by
-% \LaTeX, so we check the current format. If it is plain \TeX,
-% processing should stop here. But, because of the need to limit
-% the scope of the definition of |\format|, a macro that is used
-% locally in the following |\if|~statement, this comparison is done
-% inside a group. To prevent \TeX\ from complaining about an
-% unclosed group, the processing of the command |\endinput| is
-% deferred until after the group is closed. This is accomplished by
-% the command |\aftergroup|.
-%
-% \begin{macrocode}
-{\def\format{lplain}
-\ifx\fmtname\format
-\else
- \def\format{LaTeX2e}
- \ifx\fmtname\format
- \else
- \aftergroup\endinput
+\ifx\directlua\@undefined\else
+ \ifx\bbl@luapatterns\@undefined
+ \input luababel.def
\fi
-\fi}
-% \end{macrocode}
-%
-% \subsection{Cross referencing macros}
-%
-% The \LaTeX\ book states:
-% \begin{quote}
-% The \emph{key} argument is any sequence of letters, digits, and
-% punctuation symbols; upper- and lowercase letters are regarded as
-% different.
-% \end{quote}
-% When the above quote should still be true when a document is
-% typeset in a language that has active characters, special care
-% has to be taken of the category codes of these characters when
-% they appear in an argument of the cross referencing macros.
-%
-% When a cross referencing command processes its argument, all
-% tokens in this argument should be character tokens with category
-% `letter' or `other'.
-%
-% The only way to accomplish this in most cases is to use the trick
-% described in the \TeX book~\cite{DEK} (Appendix~D, page~382).
-% The primitive |\meaning| applied to a token expands to the
-% current meaning of this token. For example, `|\meaning\A|' with
-% |\A| defined as `|\def\A#1{\B}|' expands to the characters
-% `|macro:#1->\B|' with all category codes set to `other' or
-% `space'.
-% \begin{macro}{\newlabel}
-% The macro |\label| writes a line with a |\newlabel| command
-% into the |.aux| file to define labels.
-%
-% \begin{macrocode}
-%\bbl@redefine\newlabel#1#2{%
-% \@safe@activestrue\org@newlabel{#1}{#2}\@safe@activesfalse}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\@newl@bel}
-% We need to change the definition of the \LaTeX-internal macro
-% |\@newl@bel|. This is needed because we need to make sure that
-% shorthand characters expand to their non-active version.
-%
-% The following package options control which macros are to be
-% redefined.
-%
-% \begin{macrocode}
-%<<*More package options>>
-\DeclareOption{safe=none}{\let\bbl@opt@safe\@empty}
-\DeclareOption{safe=bib}{\def\bbl@opt@safe{B}}
-\DeclareOption{safe=ref}{\def\bbl@opt@safe{R}}
-%<</More package options>>
-% \end{macrocode}
-%
-% First we open a new group to keep the changed setting of
-% |\protect| local and then we set the |@safe@actives| switch to
-% true to make sure that any shorthand that appears in any of the
-% arguments immediately expands to its non-active self.
-%
-% \begin{macrocode}
-\bbl@trace{Cross referencing macros}
-\ifx\bbl@opt@safe\@empty\else
- \def\@newl@bel#1#2#3{%
- {\@safe@activestrue
- \bbl@ifunset{#1@#2}%
- \relax
- {\gdef\@multiplelabels{%
- \@latex@warning@no@line{There were multiply-defined labels}}%
- \@latex@warning@no@line{Label `#2' multiply defined}}%
- \global\@namedef{#1@#2}{#3}}}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\@testdef}
-% An internal \LaTeX\ macro used to test if the labels that have
-% been written on the |.aux| file have changed. It is called by
-% the |\enddocument| macro. This macro needs to be completely
-% rewritten, using |\meaning|. The reason for this is that in some
-% cases the expansion of |\#1@#2| contains the same characters as
-% the |#3|; but the character codes differ. Therefore \LaTeX\ keeps
-% reporting that the labels may have changed.
-%
-% \begin{macrocode}
- \CheckCommand*\@testdef[3]{%
- \def\reserved@a{#3}%
- \expandafter\ifx\csname#1@#2\endcsname\reserved@a
- \else
- \@tempswatrue
- \fi}
-% \end{macrocode}
-%
-% Now that we made sure that |\@testdef| still has the same
-% definition we can rewrite it. First we make the shorthands
-% `safe'.
-%
-% \begin{macrocode}
- \def\@testdef#1#2#3{%
- \@safe@activestrue
-% \end{macrocode}
-%
-% Then we use |\bbl@tempa| as an `alias' for the macro that
-% contains the label which is being checked.
-%
-% \begin{macrocode}
- \expandafter\let\expandafter\bbl@tempa\csname #1@#2\endcsname
-% \end{macrocode}
-%
-% Then we define |\bbl@tempb| just as |\@newl@bel| does it.
-%
-% \begin{macrocode}
- \def\bbl@tempb{#3}%
- \@safe@activesfalse
-% \end{macrocode}
-%
-% When the label is defined we replace the definition of
-% |\bbl@tempa| by its meaning.
-%
-% \begin{macrocode}
- \ifx\bbl@tempa\relax
- \else
- \edef\bbl@tempa{\expandafter\strip@prefix\meaning\bbl@tempa}%
- \fi
-% \end{macrocode}
-%
-% We do the same for |\bbl@tempb|.
-%
-% \begin{macrocode}
- \edef\bbl@tempb{\expandafter\strip@prefix\meaning\bbl@tempb}%
-% \end{macrocode}
-%
-% If the label didn't change, |\bbl@tempa| and |\bbl@tempb| should
-% be identical macros.
-%
-% \begin{macrocode}
- \ifx\bbl@tempa\bbl@tempb
- \else
- \@tempswatrue
- \fi}
-\fi
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\ref}
-% \begin{macro}{\pageref}
-% The same holds for the macro |\ref| that references a label
-% and |\pageref| to reference a page. So we redefine |\ref| and
-% |\pageref|. While we change these macros, we make them robust as
-% well (if they weren't already) to prevent problems if they should
-% become expanded at the wrong moment.
-%
-% \begin{macrocode}
-\bbl@xin@{R}\bbl@opt@safe
-\ifin@
- \bbl@redefinerobust\ref#1{%
- \@safe@activestrue\org@ref{#1}\@safe@activesfalse}
- \bbl@redefinerobust\pageref#1{%
- \@safe@activestrue\org@pageref{#1}\@safe@activesfalse}
-\else
- \let\org@ref\ref
- \let\org@pageref\pageref
-\fi
-% \end{macrocode}
-%
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@citex}
-% The macro used to cite from a bibliography, |\cite|, uses an
-% internal macro, |\@citex|.
-% It is this internal macro that picks up the argument(s),
-% so we redefine this internal macro and leave |\cite| alone. The
-% first argument is used for typesetting, so the shorthands need
-% only be deactivated in the second argument.
-%
-% \begin{macrocode}
-\bbl@xin@{B}\bbl@opt@safe
-\ifin@
- \bbl@redefine\@citex[#1]#2{%
- \@safe@activestrue\edef\@tempa{#2}\@safe@activesfalse
- \org@@citex[#1]{\@tempa}}
-% \end{macrocode}
-%
-% Unfortunately, the packages \pkg{natbib} and \pkg{cite} need a
-% different definition of |\@citex|...
-% To begin with, \pkg{natbib} has a definition for |\@citex| with
-% \emph{three} arguments... We only know that a package is loaded
-% when |\begin{document}| is executed, so we need to postpone the
-% different redefinition.
-%
-% \begin{macrocode}
- \AtBeginDocument{%
- \@ifpackageloaded{natbib}{%
-% \end{macrocode}
-%
-% Notice that we use |\def| here instead of |\bbl@redefine| because
-% |\org@@citex| is already defined and we don't want to overwrite
-% that definition (it would result in parameter stack overflow
-% because of a circular definition).
-%
-% (Recent versions of \pkg{natbib} change dynamically |\@citex|, so PR4087
-% doesn't seem fixable in a simple way. Just load \pkg{natbib} before.)
-%
-% \begin{macrocode}
- \def\@citex[#1][#2]#3{%
- \@safe@activestrue\edef\@tempa{#3}\@safe@activesfalse
- \org@@citex[#1][#2]{\@tempa}}%
- }{}}
-% \end{macrocode}
-%
-% The package \pkg{cite} has a definition of |\@citex| where the
-% shorthands need to be turned off in both arguments.
-%
-% \begin{macrocode}
- \AtBeginDocument{%
- \@ifpackageloaded{cite}{%
- \def\@citex[#1]#2{%
- \@safe@activestrue\org@@citex[#1]{#2}\@safe@activesfalse}%
- }{}}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\nocite}
-% The macro |\nocite| which is used to instruct BiB\TeX\ to
-% extract uncited references from the database.
-%
-% \begin{macrocode}
- \bbl@redefine\nocite#1{%
- \@safe@activestrue\org@nocite{#1}\@safe@activesfalse}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\bibcite}
-% The macro that is used in the |.aux| file to
-% define citation labels. When packages such as \pkg{natbib} or
-% \pkg{cite} are not loaded its second argument is used to typeset the
-% citation label. In that case, this second argument can contain
-% active characters but is used in an environment where
-% |\@safe@activestrue| is in effect. This switch needs to be reset
-% inside the |\hbox| which contains the citation label. In order to
-% determine during \file{.aux} file processing which definition of
-% |\bibcite| is needed we define |\bibcite| in such a way that it
-% redefines itself with the proper definition. We call
-% |\bbl@cite@choice| to select the proper definition for |\bibcite|.
-% This new definition is then activated.
-%
-% \begin{macrocode}
- \bbl@redefine\bibcite{%
- \bbl@cite@choice
- \bibcite}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\bbl@bibcite}
-% The macro |\bbl@bibcite| holds the definition of |\bibcite|
-% needed when neither \pkg{natbib} nor \pkg{cite} is loaded.
-%
-% \begin{macrocode}
- \def\bbl@bibcite#1#2{%
- \org@bibcite{#1}{\@safe@activesfalse#2}}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\bbl@cite@choice}
-% The macro |\bbl@cite@choice| determines which definition of
-% |\bibcite| is needed. First we give |\bibcite| its default
-% definition.
-%
-% \begin{macrocode}
- \def\bbl@cite@choice{%
- \global\let\bibcite\bbl@bibcite
-% \end{macrocode}
-%
-% Then, when \pkg{natbib} is loaded we restore the original
-% definition of |\bibcite|. For \pkg{cite} we do the same.
-%
-% \begin{macrocode}
- \@ifpackageloaded{natbib}{\global\let\bibcite\org@bibcite}{}%
- \@ifpackageloaded{cite}{\global\let\bibcite\org@bibcite}{}%
-% \end{macrocode}
-%
-% Make sure this only happens once.
-%
-% \begin{macrocode}
- \global\let\bbl@cite@choice\relax}
-% \end{macrocode}
-%
-% When a document is run for the first time, no \file{.aux} file is
-% available, and |\bibcite| will not yet be properly defined. In
-% this case, this has to happen before the document starts.
-%
-% \begin{macrocode}
- \AtBeginDocument{\bbl@cite@choice}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\@bibitem}
-% One of the two internal \LaTeX\ macros called by |\bibitem|
-% that write the citation label on the |.aux| file.
-%
-% \begin{macrocode}
- \bbl@redefine\@bibitem#1{%
- \@safe@activestrue\org@@bibitem{#1}\@safe@activesfalse}
-\else
- \let\org@nocite\nocite
- \let\org@@citex\@citex
- \let\org@bibcite\bibcite
- \let\org@@bibitem\@bibitem
-\fi
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \subsection{Marks}
-%
-% \begin{macro}{\markright}
-% Because the output routine is asynchronous, we must
-% pass the current language attribute to the head lines, together
-% with the text that is put into them. To achieve this we need to
-% adapt the definition of |\markright| and |\markboth| somewhat.
-%
-% We check whether the argument is empty; if it is, we just make
-% sure the scratch token register is empty. Next, we store the
-% argument to |\markright| in the scratch token register. This way
-% these commands will not be expanded later, and we make sure that
-% the text is typeset using the correct language settings. While
-% doing so, we make sure that active characters that may end up in
-% the mark are not disabled by the output routine kicking in while
-% \cs{@safe@activestrue} is in effect.
-%
-% \begin{macrocode}
-\bbl@trace{Marks}
-\IfBabelLayout{sectioning}
- {\ifx\bbl@opt@headfoot\@nnil
- \g@addto@macro\@resetactivechars{%
- \set@typeset@protect
- \expandafter\select@language@x\expandafter{\bbl@main@language}%
- \let\protect\noexpand
- \edef\thepage{%
- \noexpand\babelsublr{\unexpanded\expandafter{\thepage}}}}%
- \fi}
- {\ifbbl@single\else
- \bbl@ifunset{markright }\bbl@redefine\bbl@redefinerobust
- \markright#1{%
- \bbl@ifblank{#1}%
- {\org@markright{}}%
- {\toks@{#1}%
- \bbl@exp{%
- \\\org@markright{\\\protect\\\foreignlanguage{\languagename}%
- {\\\protect\\\bbl@restore@actives\the\toks@}}}}}%
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\markboth}
-% \begin{macro}{\@mkboth}
-% The definition of |\markboth| is equivalent to that of
-% |\markright|, except that we need two token registers. The
-% documentclasses \cls{report} and \cls{book} define and set the
-% headings for the page. While doing so they also store a copy of
-% |\markboth| in |\@mkboth|. Therefore we need to check whether
-% |\@mkboth| has already been set. If so we neeed to do that again
-% with the new definition of |\markboth|. (As of Oct 2019, \LaTeX{}
-% stores the definition in an intermediate macros, so it's not
-% necessary anymore, but it's preserved for older versions.)
-%
-% \begin{macrocode}
- \ifx\@mkboth\markboth
- \def\bbl@tempc{\let\@mkboth\markboth}
- \else
- \def\bbl@tempc{}
- \fi
- \bbl@ifunset{markboth }\bbl@redefine\bbl@redefinerobust
- \markboth#1#2{%
- \protected@edef\bbl@tempb##1{%
- \protect\foreignlanguage
- {\languagename}{\protect\bbl@restore@actives##1}}%
- \bbl@ifblank{#1}%
- {\toks@{}}%
- {\toks@\expandafter{\bbl@tempb{#1}}}%
- \bbl@ifblank{#2}%
- {\@temptokena{}}%
- {\@temptokena\expandafter{\bbl@tempb{#2}}}%
- \bbl@exp{\\\org@markboth{\the\toks@}{\the\@temptokena}}}
- \bbl@tempc
- \fi} % end ifbbl@single, end \IfBabelLayout
-% \end{macrocode}
-%
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Preventing clashes with other packages}
-%
-% \subsubsection{\pkg{ifthen}}
-%
-% \begin{macro}{\ifthenelse}
-%
-% Sometimes a document writer wants to create a special effect
-% depending on the page a certain fragment of text appears on. This
-% can be achieved by the following piece of code:
-%\begin{verbatim}
-% \ifthenelse{\isodd{\pageref{some:label}}}
-% {code for odd pages}
-% {code for even pages}
-%\end{verbatim}
-% In order for this to work the argument of |\isodd| needs to be
-% fully expandable. With the above redefinition of |\pageref| it is
-% not in the case of this example. To overcome that, we add some
-% code to the definition of |\ifthenelse| to make things work.
-%
-% The first thing we need to do is check if the package
-% \pkg{ifthen} is loaded. This should be done at |\begin{document}|
-% time.
-%
-% \begin{macrocode}
-\bbl@trace{Preventing clashes with other packages}
-\bbl@xin@{R}\bbl@opt@safe
-\ifin@
- \AtBeginDocument{%
- \@ifpackageloaded{ifthen}{%
-% \end{macrocode}
-%
-% Then we can redefine |\ifthenelse|:
-%
-% \begin{macrocode}
- \bbl@redefine@long\ifthenelse#1#2#3{%
-% \end{macrocode}
-%
-% We want to revert the definition of |\pageref| and |\ref| to
-% their original definition for the first argument of |\ifthenelse|,
-% so we first need to store their current meanings.
-%
-% \begin{macrocode}
- \let\bbl@temp@pref\pageref
- \let\pageref\org@pageref
- \let\bbl@temp@ref\ref
- \let\ref\org@ref
-% \end{macrocode}
-%
-% Then we can set the |\@safe@actives| switch and call the original
-% |\ifthenelse|. In order to be able to use shorthands in the
-% second and third arguments of |\ifthenelse| the resetting of the
-% switch \emph{and} the definition of |\pageref| happens inside
-% those arguments. When the package wasn't loaded we do nothing.
-%
-% \begin{macrocode}
- \@safe@activestrue
- \org@ifthenelse{#1}%
- {\let\pageref\bbl@temp@pref
- \let\ref\bbl@temp@ref
- \@safe@activesfalse
- #2}%
- {\let\pageref\bbl@temp@pref
- \let\ref\bbl@temp@ref
- \@safe@activesfalse
- #3}%
- }%
- }{}%
- }
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \subsubsection{\pkg{varioref}}
-%
-% \begin{macro}{\@@vpageref}
-% \begin{macro}{\vrefpagenum}
-% \begin{macro}{\Ref}
-%
-% When the package varioref is in use we need to modify its
-% internal command |\@@vpageref| in order to prevent problems when
-% an active character ends up in the argument of |\vref|. The same
-% needs to happen for |\vrefpagenum|.
-%
-% \begin{macrocode}
- \AtBeginDocument{%
- \@ifpackageloaded{varioref}{%
- \bbl@redefine\@@vpageref#1[#2]#3{%
- \@safe@activestrue
- \org@@@vpageref{#1}[#2]{#3}%
- \@safe@activesfalse}%
- \bbl@redefine\vrefpagenum#1#2{%
- \@safe@activestrue
- \org@vrefpagenum{#1}{#2}%
- \@safe@activesfalse}%
-% \end{macrocode}
-%
-% The package \pkg{varioref} defines |\Ref| to be a robust command
-% wich uppercases the first character of the reference text. In
-% order to be able to do that it needs to access the expandable form
-% of |\ref|. So we employ a little trick here. We redefine the
-% (internal) command \verb*|\Ref | to call |\org@ref| instead of
-% |\ref|. The disadvantage of this solution is that whenever the
-% definition of |\Ref| changes, this definition needs to be updated
-% as well.
-%
-% \begin{macrocode}
- \expandafter\def\csname Ref \endcsname#1{%
- \protected@edef\@tempa{\org@ref{#1}}\expandafter\MakeUppercase\@tempa}
- }{}%
- }
-\fi
-% \end{macrocode}
-%
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsubsection{\pkg{hhline}}
-%
-% \begin{macro}{\hhline}
-% Delaying the activation of the shorthand characters has introduced
-% a problem with the \pkg{hhline} package. The reason is that it
-% uses the `:' character which is made active by the french support
-% in \babel. Therefore we need to \emph{reload} the package when
-% the `:' is an active character.
-%
-% So at |\begin{document}| we check whether \pkg{hhline} is loaded.
-%
-% \begin{macrocode}
-\AtEndOfPackage{%
- \AtBeginDocument{%
- \@ifpackageloaded{hhline}%
-% \end{macrocode}
-%
-% Then we check whether the expansion of |\normal@char:| is not
-% equal to |\relax|.
-%
-% \begin{macrocode}
- {\expandafter\ifx\csname normal@char\string:\endcsname\relax
- \else
-% \end{macrocode}
-%
-% In that case we simply reload the package. Note that this happens
-% \emph{after} the category code of the @-sign has been changed to
-% other, so we need to temporarily change it to letter again.
-%
-% \begin{macrocode}
- \makeatletter
- \def\@currname{hhline}\input{hhline.sty}\makeatother
- \fi}%
- {}}}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \subsubsection{\pkg{hyperref}}
-%
-% \begin{macro}{\pdfstringdefDisableCommands}
-%
-% A number of interworking problems between \pkg{babel} and
-% \pkg{hyperref} are tackled by \pkg{hyperref} itself. The
-% following code was introduced to prevent some annoying warnings
-% but it broke bookmarks. This was quickly fixed in \pkg{hyperref},
-% which essentially made it no-op. However, it will not removed for
-% the moment because \pkg{hyperref} is expecting it.
-%
-% \begin{macrocode}
-\AtBeginDocument{%
- \ifx\pdfstringdefDisableCommands\@undefined\else
- \pdfstringdefDisableCommands{\languageshorthands{system}}%
- \fi}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \subsubsection{\pkg{fancyhdr}}
-%
-% \begin{macro}{\FOREIGNLANGUAGE}
-% The package \pkg{fancyhdr} treats the running head and fout lines
-% somewhat differently as the standard classes. A symptom of this is
-% that the command |\foreignlanguage| which \babel\ adds to the
-% marks can end up inside the argument of |\MakeUppercase|. To
-% prevent unexpected results we need to define |\FOREIGNLANGUAGE|
-% here.
-%
-% \begin{macrocode}
-\DeclareRobustCommand{\FOREIGNLANGUAGE}[1]{%
- \lowercase{\foreignlanguage{#1}}}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\substitutefontfamily}
-% The command |\substitutefontfamily| creates an
-% \file{.fd} file on the fly. The first argument is an encoding
-% mnemonic, the second and third arguments are font family names.
-%
-% \begin{macrocode}
-\def\substitutefontfamily#1#2#3{%
- \lowercase{\immediate\openout15=#1#2.fd\relax}%
- \immediate\write15{%
- \string\ProvidesFile{#1#2.fd}%
- [\the\year/\two@digits{\the\month}/\two@digits{\the\day}
- \space generated font description file]^^J
- \string\DeclareFontFamily{#1}{#2}{}^^J
- \string\DeclareFontShape{#1}{#2}{m}{n}{<->ssub * #3/m/n}{}^^J
- \string\DeclareFontShape{#1}{#2}{m}{it}{<->ssub * #3/m/it}{}^^J
- \string\DeclareFontShape{#1}{#2}{m}{sl}{<->ssub * #3/m/sl}{}^^J
- \string\DeclareFontShape{#1}{#2}{m}{sc}{<->ssub * #3/m/sc}{}^^J
- \string\DeclareFontShape{#1}{#2}{b}{n}{<->ssub * #3/bx/n}{}^^J
- \string\DeclareFontShape{#1}{#2}{b}{it}{<->ssub * #3/bx/it}{}^^J
- \string\DeclareFontShape{#1}{#2}{b}{sl}{<->ssub * #3/bx/sl}{}^^J
- \string\DeclareFontShape{#1}{#2}{b}{sc}{<->ssub * #3/bx/sc}{}^^J
- }%
- \closeout15
- }
-% \end{macrocode}
-%
-% This command should only be used in the preamble of a document.
-%
-% \begin{macrocode}
-\@onlypreamble\substitutefontfamily
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \subsection{Encoding and fonts}
-%
-% Because documents may use non-ASCII font encodings, we make sure
-% that the logos of \TeX\ and \LaTeX\ always come out in the right
-% encoding. There is a list of non-ASCII encodings. Unfortunately,
-% \textsf{fontenc} deletes its package options, so we must guess which
-% encodings has been loaded by traversing |\@filelist| to search for
-% \m{enc}|enc.def|. If a non-ASCII has been loaded, we define versions
-% of |\TeX| and |\LaTeX| for them using |\ensureascii|. The default
-% ASCII encoding is set, too (in reverse order): the ``main'' encoding
-% (when the document begins), the last loaded, or |OT1|.
-%
-% \begin{macro}{\ensureascii}
-%
-% \begin{macrocode}
-\bbl@trace{Encoding and fonts}
-\newcommand\BabelNonASCII{LGR,X2,OT2,OT3,OT6,LHE,LWN,LMA,LMC,LMS,LMU,PU,PD1}
-\newcommand\BabelNonText{TS1,T3,TS3}
-\let\org@TeX\TeX
-\let\org@LaTeX\LaTeX
-\let\ensureascii\@firstofone
-\AtBeginDocument{%
- \in@false
- \bbl@foreach\BabelNonASCII{% is there a text non-ascii enc?
- \ifin@\else
- \lowercase{\bbl@xin@{,#1enc.def,}{,\@filelist,}}%
- \fi}%
- \ifin@ % if a text non-ascii has been loaded
- \def\ensureascii#1{{\fontencoding{OT1}\selectfont#1}}%
- \DeclareTextCommandDefault{\TeX}{\org@TeX}%
- \DeclareTextCommandDefault{\LaTeX}{\org@LaTeX}%
- \def\bbl@tempb#1\@@{\uppercase{\bbl@tempc#1}ENC.DEF\@empty\@@}%
- \def\bbl@tempc#1ENC.DEF#2\@@{%
- \ifx\@empty#2\else
- \bbl@ifunset{T@#1}%
- {}%
- {\bbl@xin@{,#1,}{,\BabelNonASCII,\BabelNonText,}%
- \ifin@
- \DeclareTextCommand{\TeX}{#1}{\ensureascii{\org@TeX}}%
- \DeclareTextCommand{\LaTeX}{#1}{\ensureascii{\org@LaTeX}}%
- \else
- \def\ensureascii##1{{\fontencoding{#1}\selectfont##1}}%
- \fi}%
- \fi}%
- \bbl@foreach\@filelist{\bbl@tempb#1\@@}% TODO - \@@ de mas??
- \bbl@xin@{,\cf@encoding,}{,\BabelNonASCII,\BabelNonText,}%
- \ifin@\else
- \edef\ensureascii#1{{%
- \noexpand\fontencoding{\cf@encoding}\noexpand\selectfont#1}}%
- \fi
- \fi}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% Now comes the old deprecated stuff (with a little change in 3.9l,
-% for \textsf{fontspec}). The first thing we need to do is to
-% determine, at |\begin{document}|, which latin fontencoding to use.
-%
-% \begin{macro}{\latinencoding}
-% When text is being typeset in an encoding other than `latin'
-% (\texttt{OT1} or \texttt{T1}), it would be nice to still have
-% Roman numerals come out in the Latin encoding.
-% So we first assume that the current encoding at the end
-% of processing the package is the Latin encoding.
-%
-% \begin{macrocode}
-\AtEndOfPackage{\edef\latinencoding{\cf@encoding}}
-% \end{macrocode}
-%
-% But this might be overruled with a later loading of the package
-% \pkg{fontenc}. Therefore we check at the execution of
-% |\begin{document}| whether it was loaded with the \Lopt{T1}
-% option. The normal way to do this (using |\@ifpackageloaded|) is
-% disabled for this package. Now we have to revert to parsing the
-% internal macro |\@filelist| which contains all the filenames
-% loaded.
-%
-% \begin{macrocode}
-\AtBeginDocument{%
- \@ifpackageloaded{fontspec}%
- {\xdef\latinencoding{%
- \ifx\UTFencname\@undefined
- EU\ifcase\bbl@engine\or2\or1\fi
- \else
- \UTFencname
- \fi}}%
- {\gdef\latinencoding{OT1}%
- \ifx\cf@encoding\bbl@t@one
- \xdef\latinencoding{\bbl@t@one}%
- \else
- \ifx\@fontenc@load@list\@undefined
- \@ifl@aded{def}{t1enc}{\xdef\latinencoding{\bbl@t@one}}{}%
- \else
- \def\@elt#1{,#1,}%
- \edef\bbl@tempa{\expandafter\@gobbletwo\@fontenc@load@list}%
- \let\@elt\relax
- \bbl@xin@{,T1,}\bbl@tempa
- \ifin@
- \xdef\latinencoding{\bbl@t@one}%
- \fi
- \fi
- \fi}}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\latintext}
-% Then we can define the command |\latintext| which is a
-% declarative switch to a latin font-encoding. Usage of this macro
-% is deprecated.
-%
-% \begin{macrocode}
-\DeclareRobustCommand{\latintext}{%
- \fontencoding{\latinencoding}\selectfont
- \def\encodingdefault{\latinencoding}}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\textlatin}
-% This command takes an argument which is then typeset using the
-% requested font encoding. In order to avoid many encoding switches
-% it operates in a local scope.
-%
-% \begin{macrocode}
-\ifx\@undefined\DeclareTextFontCommand
- \DeclareRobustCommand{\textlatin}[1]{\leavevmode{\latintext #1}}
-\else
- \DeclareTextFontCommand{\textlatin}{\latintext}
-\fi
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \subsection{Basic bidi support}
-%
-% \textbf{Work in progress.} This code is currently placed here for
-% practical reasons.
-%
-% It is loosely based on |rlbabel.def|, but most of it has been
-% developed from scratch. This \babel{} module (by Johannes Braams and
-% Boris Lavva) has served the purpose of typesetting R documents for
-% two decades, and despite its flaws I think it is still a good starting
-% point (some parts have been copied here almost verbatim), partly
-% thanks to its simplicity. I've also looked at \textsc{arabi} (by
-% Youssef Jabri), which is compatible with \babel{}.
-%
-% There are two ways of modifying macros to make them “bidi”, namely,
-% by patching the internal low-level macros (which is what I have done
-% with lists, columns, counters, tocs, much like |rlbabel| did), and
-% by introducing a “middle layer” just below the user interface
-% (sectioning, footnotes).
-%
-% \begin{itemize}
-% \item pdftex provides a minimal support for bidi text, and it
-% must be done by hand. Vertical typesetting is not possible.
-% \item \xetex{} is somewhat better, thanks to its font engine
-% (even if not always reliable) and a few additional tools. However,
-% very little is done at the paragraph level. Another challenging
-% problem is text direction does not honour \TeX{} grouping.
-% \item \luatex{} can provide the most complete solution, as we can
-% manipulate almost freely the node list, the generated lines,
-% and so on, but bidi text does not work out of the box and some
-% development is necessary. It also provides tools to properly
-% set left-to-right and right-to-left page layouts. As Lua\TeX-ja
-% shows, vertical typesetting is possible, too.
-% \end{itemize}
-%
-% \begin{macrocode}
-\bbl@trace{Basic (internal) bidi support}
-\def\bbl@alscripts{,Arabic,Syriac,Thaana,}
-\def\bbl@rscripts{%
- ,Imperial Aramaic,Avestan,Cypriot,Hatran,Hebrew,%
- Old Hungarian,Old Hungarian,Lydian,Mandaean,Manichaean,%
- Manichaean,Meroitic Cursive,Meroitic,Old North Arabian,%
- Nabataean,N'Ko,Orkhon,Palmyrene,Inscriptional Pahlavi,%
- Psalter Pahlavi,Phoenician,Inscriptional Parthian,Samaritan,%
- Old South Arabian,}%
-\def\bbl@provide@dirs#1{%
- \bbl@xin@{\csname bbl@sname@#1\endcsname}{\bbl@alscripts\bbl@rscripts}%
- \ifin@
- \global\bbl@csarg\chardef{wdir@#1}\@ne
- \bbl@xin@{\csname bbl@sname@#1\endcsname}{\bbl@alscripts}%
- \ifin@
- \global\bbl@csarg\chardef{wdir@#1}\tw@ % useless in xetex
- \fi
- \else
- \global\bbl@csarg\chardef{wdir@#1}\z@
- \fi
- \ifodd\bbl@engine
- \bbl@csarg\ifcase{wdir@#1}%
- \directlua{ Babel.locale_props[\the\localeid].textdir = 'l' }%
- \or
- \directlua{ Babel.locale_props[\the\localeid].textdir = 'r' }%
- \or
- \directlua{ Babel.locale_props[\the\localeid].textdir = 'al' }%
- \fi
- \fi}
-\def\bbl@switchdir{%
- \bbl@ifunset{bbl@lsys@\languagename}{\bbl@provide@lsys{\languagename}}{}%
- \bbl@ifunset{bbl@wdir@\languagename}{\bbl@provide@dirs{\languagename}}{}%
- \bbl@exp{\\\bbl@setdirs\bbl@cl{wdir}}}
-\def\bbl@setdirs#1{% TODO - math
- \ifcase\bbl@select@type % TODO - strictly, not the right test
- \bbl@bodydir{#1}%
- \bbl@pardir{#1}%
- \fi
- \bbl@textdir{#1}}
-\ifodd\bbl@engine % luatex=1
- \AddBabelHook{babel-bidi}{afterextras}{\bbl@switchdir}
- \DisableBabelHook{babel-bidi}
- \chardef\bbl@thetextdir\z@
- \chardef\bbl@thepardir\z@
- \def\bbl@getluadir#1{%
- \directlua{
- if tex.#1dir == 'TLT' then
- tex.sprint('0')
- elseif tex.#1dir == 'TRT' then
- tex.sprint('1')
- end}}
- \def\bbl@setluadir#1#2#3{% 1=text/par.. 2=\textdir.. 3=0 lr/1 rl
- \ifcase#3\relax
- \ifcase\bbl@getluadir{#1}\relax\else
- #2 TLT\relax
- \fi
- \else
- \ifcase\bbl@getluadir{#1}\relax
- #2 TRT\relax
- \fi
- \fi}
- \def\bbl@textdir#1{%
- \bbl@setluadir{text}\textdir{#1}%
- \chardef\bbl@thetextdir#1\relax
- \setattribute\bbl@attr@dir{\numexpr\bbl@thepardir*3+#1}}
- \def\bbl@pardir#1{%
- \bbl@setluadir{par}\pardir{#1}%
- \chardef\bbl@thepardir#1\relax}
- \def\bbl@bodydir{\bbl@setluadir{body}\bodydir}
- \def\bbl@pagedir{\bbl@setluadir{page}\pagedir}
- \def\bbl@dirparastext{\pardir\the\textdir\relax}% %%%%
- % Sadly, we have to deal with boxes in math with basic.
- % Activated every math with the package option bidi=:
- \def\bbl@mathboxdir{%
- \ifcase\bbl@thetextdir\relax
- \everyhbox{\textdir TLT\relax}%
- \else
- \everyhbox{\textdir TRT\relax}%
- \fi}
-\else % pdftex=0, xetex=2
- \AddBabelHook{babel-bidi}{afterextras}{\bbl@switchdir}
- \DisableBabelHook{babel-bidi}
- \newcount\bbl@dirlevel
- \chardef\bbl@thetextdir\z@
- \chardef\bbl@thepardir\z@
- \def\bbl@textdir#1{%
- \ifcase#1\relax
- \chardef\bbl@thetextdir\z@
- \bbl@textdir@i\beginL\endL
- \else
- \chardef\bbl@thetextdir\@ne
- \bbl@textdir@i\beginR\endR
- \fi}
- \def\bbl@textdir@i#1#2{%
- \ifhmode
- \ifnum\currentgrouplevel>\z@
- \ifnum\currentgrouplevel=\bbl@dirlevel
- \bbl@error{Multiple bidi settings inside a group}%
- {I'll insert a new group, but expect wrong results.}%
- \bgroup\aftergroup#2\aftergroup\egroup
- \else
- \ifcase\currentgrouptype\or % 0 bottom
- \aftergroup#2% 1 simple {}
- \or
- \bgroup\aftergroup#2\aftergroup\egroup % 2 hbox
- \or
- \bgroup\aftergroup#2\aftergroup\egroup % 3 adj hbox
- \or\or\or % vbox vtop align
- \or
- \bgroup\aftergroup#2\aftergroup\egroup % 7 noalign
- \or\or\or\or\or\or % output math disc insert vcent mathchoice
- \or
- \aftergroup#2% 14 \begingroup
- \else
- \bgroup\aftergroup#2\aftergroup\egroup % 15 adj
- \fi
- \fi
- \bbl@dirlevel\currentgrouplevel
- \fi
- #1%
- \fi}
- \def\bbl@pardir#1{\chardef\bbl@thepardir#1\relax}
- \let\bbl@bodydir\@gobble
- \let\bbl@pagedir\@gobble
- \def\bbl@dirparastext{\chardef\bbl@thepardir\bbl@thetextdir}
-% \end{macrocode}
-%
-% The following command is executed only if there is a right-to-left
-% script (once). It activates the |\everypar| hack for \xetex, to
-% properly handle the par direction. Note text and par dirs are
-% decoupled to some extent (although not completely).
-%
-% \begin{macrocode}
- \def\bbl@xebidipar{%
- \let\bbl@xebidipar\relax
- \TeXXeTstate\@ne
- \def\bbl@xeeverypar{%
- \ifcase\bbl@thepardir
- \ifcase\bbl@thetextdir\else\beginR\fi
- \else
- {\setbox\z@\lastbox\beginR\box\z@}%
- \fi}%
- \let\bbl@severypar\everypar
- \newtoks\everypar
- \everypar=\bbl@severypar
- \bbl@severypar{\bbl@xeeverypar\the\everypar}}
- \def\bbl@tempb{%
- \let\bbl@textdir@i\@gobbletwo
- \let\bbl@xebidipar\@empty
- \AddBabelHook{bidi}{foreign}{%
- \def\bbl@tempa{\def\BabelText########1}%
- \ifcase\bbl@thetextdir
- \expandafter\bbl@tempa\expandafter{\BabelText{\LR{####1}}}%
- \else
- \expandafter\bbl@tempa\expandafter{\BabelText{\RL{####1}}}%
- \fi}
- \def\bbl@pardir##1{\ifcase##1\relax\setLR\else\setRL\fi}}
- \@ifpackagewith{babel}{bidi=bidi}{\bbl@tempb}{}%
- \@ifpackagewith{babel}{bidi=bidi-l}{\bbl@tempb}{}%
- \@ifpackagewith{babel}{bidi=bidi-r}{\bbl@tempb}{}%
-\fi
-% \end{macrocode}
-%
-% A tool for weak L (mainly digits). We also disable warnings with
-% \textsf{hyperref}.
-%
-% \begin{macrocode}
-\DeclareRobustCommand\babelsublr[1]{\leavevmode{\bbl@textdir\z@#1}}
-\AtBeginDocument{%
- \ifx\pdfstringdefDisableCommands\@undefined\else
- \ifx\pdfstringdefDisableCommands\relax\else
- \pdfstringdefDisableCommands{\let\babelsublr\@firstofone}%
- \fi
- \fi}
-% \end{macrocode}
-%
-% \subsection{Local Language Configuration}
-%
-% \begin{macro}{\loadlocalcfg}
-% At some sites it may be necessary to add site-specific actions to
-% a language definition file. This can be done by creating a file
-% with the same name as the language definition file, but with the
-% extension \file{.cfg}. For instance the file \file{norsk.cfg}
-% will be loaded when the language definition file \file{norsk.ldf}
-% is loaded.
-%
-% For plain-based formats we don't want to override the definition
-% of |\loadlocalcfg| from \file{plain.def}.
-%
-% \begin{macrocode}
-\bbl@trace{Local Language Configuration}
-\ifx\loadlocalcfg\@undefined
- \@ifpackagewith{babel}{noconfigs}%
- {\let\loadlocalcfg\@gobble}%
- {\def\loadlocalcfg#1{%
- \InputIfFileExists{#1.cfg}%
- {\typeout{*************************************^^J%
- * Local config file #1.cfg used^^J%
- *}}%
- \@empty}}
-\fi
-% \end{macrocode}
-%
-% Just to be compatible with \LaTeX$\:$2.09 we add a few more lines
-% of code:
-%
-% \begin{macrocode}
-\ifx\@unexpandable@protect\@undefined
- \def\@unexpandable@protect{\noexpand\protect\noexpand}
- \long\def\protected@write#1#2#3{%
- \begingroup
- \let\thepage\relax
- #2%
- \let\protect\@unexpandable@protect
- \edef\reserved@a{\write#1{#3}}%
- \reserved@a
- \endgroup
- \if@nobreak\ifvmode\nobreak\fi\fi}
\fi
%</core>
-%<*kernel>
-% \end{macrocode}%
-% \end{macro}
-%
-% \section{Multiple languages (\texttt{switch.def)}}
-%
-% Plain \TeX\ version~3.0 provides the primitive |\language| that
-% is used to store the current language. When used with a pre-3.0
-% version this function has to be implemented by allocating a
-% counter.
-%
-% \begin{macrocode}
-<@Make sure ProvidesFile is defined@>
-\ProvidesFile{switch.def}[<@date@> <@version@> Babel switching mechanism]
-<@Load macros for plain if not LaTeX@>
-<@Define core switching macros@>
-% \end{macrocode}
-%
-% \begin{macro}{\adddialect}
-% The macro |\adddialect| can be used to add the name of a dialect
-% or variant language, for which an already defined hyphenation
-% table can be used.
-%
-% \begin{macrocode}
-\def\bbl@version{<@version@>}
-\def\bbl@date{<@date@>}
-\def\adddialect#1#2{%
- \global\chardef#1#2\relax
- \bbl@usehooks{adddialect}{{#1}{#2}}%
- \begingroup
- \count@#1\relax
- \def\bbl@elt##1##2##3##4{%
- \ifnum\count@=##2\relax
- \bbl@info{\string#1 = using hyphenrules for ##1\\%
- (\string\language\the\count@)}%
- \def\bbl@elt####1####2####3####4{}%
- \fi}%
- \bbl@cs{languages}%
- \endgroup}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% |\bbl@iflanguage| executes code only if the language |l@|
-% exists. Otherwise raises and error.
-%
-% The argument of |\bbl@fixname| has to be a macro name, as it may get
-% ``fixed'' if casing (lc/uc) is wrong. It's intented to fix a
-% long-standing bug when |\foreignlanguage| and the like appear in
-% a |\MakeXXXcase|. However, a lowercase form is not imposed to
-% improve backward compatibility (perhaps you defined a language
-% named |MYLANG|, but unfortunately mixed case names cannot be
-% trapped). Note |l@| is encapsulated, so that its case does not
-% change.
-%
-% \begin{macrocode}
-\def\bbl@fixname#1{%
- \begingroup
- \def\bbl@tempe{l@}%
- \edef\bbl@tempd{\noexpand\@ifundefined{\noexpand\bbl@tempe#1}}%
- \bbl@tempd
- {\lowercase\expandafter{\bbl@tempd}%
- {\uppercase\expandafter{\bbl@tempd}%
- \@empty
- {\edef\bbl@tempd{\def\noexpand#1{#1}}%
- \uppercase\expandafter{\bbl@tempd}}}%
- {\edef\bbl@tempd{\def\noexpand#1{#1}}%
- \lowercase\expandafter{\bbl@tempd}}}%
- \@empty
- \edef\bbl@tempd{\endgroup\def\noexpand#1{#1}}%
- \bbl@tempd
- \bbl@usehooks{languagename}{}}
-\def\bbl@iflanguage#1{%
- \@ifundefined{l@#1}{\@nolanerr{#1}\@gobble}\@firstofone}
-% \end{macrocode}
-%
-% \begin{macro}{\iflanguage}
-% Users might want to test (in a private package for instance)
-% which language is currently active. For this we provide a test
-% macro, |\iflanguage|, that has three arguments. It checks
-% whether the first argument is a known language. If so, it
-% compares the first argument with the value of |\language|. Then,
-% depending on the result of the comparison, it executes either the
-% second or the third argument.
-%
-% \begin{macrocode}
-\def\iflanguage#1{%
- \bbl@iflanguage{#1}{%
- \ifnum\csname l@#1\endcsname=\language
- \expandafter\@firstoftwo
- \else
- \expandafter\@secondoftwo
- \fi}}
% \end{macrocode}
%
-% \end{macro}
-%
-% \subsection{Selecting the language}
-%
-% \begin{macro}{\selectlanguage}
-% The macro |\selectlanguage| checks whether the language is
-% already defined before it performs its actual task, which is to
-% update |\language| and activate language-specific definitions.
-%
-% To allow the call of |\selectlanguage| either with a control
-% sequence name or with a simple string as argument, we have to use
-% a trick to delete the optional escape character.
-%
-% To convert a control sequence to a string, we use the |\string|
-% primitive. Next we have to look at the first character of this
-% string and compare it with the escape character. Because this
-% escape character can be changed by setting the internal integer
-% |\escapechar| to a character number, we have to compare this
-% number with the character of the string. To do this we have to
-% use \TeX's backquote notation to specify the character as a
-% number.
-%
-% If the first character of the |\string|'ed argument is the
-% current escape character, the comparison has stripped this
-% character and the rest in the `then' part consists of the rest of
-% the control sequence name. Otherwise we know that either the
-% argument is not a control sequence or |\escapechar| is set to a
-% value outside of the character range~$0$--$255$.
-%
-% If the user gives an empty argument, we provide a default
-% argument for |\string|. This argument should expand to nothing.
-%
-% \begin{macrocode}
-\let\bbl@select@type\z@
-\edef\selectlanguage{%
- \noexpand\protect
- \expandafter\noexpand\csname selectlanguage \endcsname}
-% \end{macrocode}
-%
-% Because the command |\selectlanguage| could be used in a moving
-% argument it expands to \verb*=\protect\selectlanguage =.
-% Therefore, we have to make sure that a macro |\protect| exists.
-% If it doesn't it is |\let| to |\relax|.
-%
-% \begin{macrocode}
-\ifx\@undefined\protect\let\protect\relax\fi
-% \end{macrocode}
-%
-% As \LaTeX$\:$2.09 writes to files \textit{expanded} whereas
-% \LaTeXe\ takes care \textit{not} to expand the arguments of
-% |\write| statements we need to be a bit clever about the way we
-% add information to \file{.aux} files. Therefore we introduce the
-% macro |\xstring| which should expand to the right amount of
-% |\string|'s.
-%
-% \begin{macrocode}
-\ifx\documentclass\@undefined
- \def\xstring{\string\string\string}
-\else
- \let\xstring\string
-\fi
-% \end{macrocode}
-%
-% \end{macro}
-%
-% Since version 3.5 \babel\ writes entries to the auxiliary files in
-% order to typeset table of contents etc. in the correct language
-% environment.
-% \begin{macro}{\bbl@pop@language}
-% \emph{But} when the language change happens \emph{inside} a group
-% the end of the group doesn't write anything to the auxiliary
-% files. Therefore we need \TeX's |aftergroup| mechanism to help
-% us. The command |\aftergroup| stores the token immediately
-% following it to be executed when the current group is closed. So
-% we define a temporary control sequence |\bbl@pop@language| to be
-% executed at the end of the group. It calls |\bbl@set@language|
-% with the name of the current language as its argument.
-%
-% \begin{macro}{\bbl@language@stack}
-% The previous solution works for one level of nesting groups, but
-% as soon as more levels are used it is no longer adequate. For
-% that case we need to keep track of the nested languages using a
-% stack mechanism. This stack is called |\bbl@language@stack| and
-% initially empty.
+% A proxy file for switch.def
%
% \begin{macrocode}
-\def\bbl@language@stack{}
-% \end{macrocode}
-%
-% When using a stack we need a mechanism to push an element on the
-% stack and to retrieve the information afterwards.
-% \begin{macro}{\bbl@push@language}
-% \begin{macro}{\bbl@pop@language}
-% The stack is simply a list of languagenames, separated with a `+'
-% sign; the push function can be simple:
-%
-% \begin{macrocode}
-\def\bbl@push@language{%
- \xdef\bbl@language@stack{\languagename+\bbl@language@stack}}
-% \end{macrocode}
-%
-% Retrieving information from the stack is a little bit less simple, as
-% we need to remove the element from the stack while storing it in the
-% macro |\languagename|. For this we first define a helper function.
-% \begin{macro}{\bbl@pop@lang}
-% This macro stores its first element (which is delimited by the
-% `+'-sign) in |\languagename| and stores the rest of the string
-% (delimited by `-') in its third argument.
-%
-% \begin{macrocode}
-\def\bbl@pop@lang#1+#2-#3{%
- \edef\languagename{#1}\xdef#3{#2}}
-% \end{macrocode}
-%
-% \end{macro}
-% The reason for the somewhat weird arrangement of arguments to the
-% helper function is the fact it is called in the following way.
-% This means that before |\bbl@pop@lang| is executed \TeX\ first
-% \emph{expands} the stack, stored in |\bbl@language@stack|. The
-% result of that is that the argument string of |\bbl@pop@lang|
-% contains one or more language names, each followed by a `+'-sign
-% (zero language names won't occur as this macro will only be
-% called after something has been pushed on the stack) followed by
-% the `-'-sign and finally the reference to the stack.
-%
-% \begin{macrocode}
-\let\bbl@ifrestoring\@secondoftwo
-\def\bbl@pop@language{%
- \expandafter\bbl@pop@lang\bbl@language@stack-\bbl@language@stack
- \let\bbl@ifrestoring\@firstoftwo
- \expandafter\bbl@set@language\expandafter{\languagename}%
- \let\bbl@ifrestoring\@secondoftwo}
-% \end{macrocode}
-%
-% Once the name of the previous language is retrieved from the stack,
-% it is fed to |\bbl@set@language| to do the actual work of
-% switching everything that needs switching.
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% An alternative way to identify languages (in the \babel{} sense)
-% with a numerical value is introduced in 3.30. This is one of the
-% first steps for a new interface based on the concept of locale,
-% which explains the name of |\localeid|. This means |\l@...| will be
-% reserved for hyphenation patterns.
-%
-% \begin{macrocode}
-\chardef\localeid\z@
-\def\bbl@id@last{0} % No real need for a new counter
-\def\bbl@id@assign{%
- \bbl@ifunset{bbl@id@@\languagename}%
- {\count@\bbl@id@last\relax
- \advance\count@\@ne
- \bbl@csarg\chardef{id@@\languagename}\count@
- \edef\bbl@id@last{\the\count@}%
- \ifcase\bbl@engine\or
- \directlua{
- Babel = Babel or {}
- Babel.locale_props = Babel.locale_props or {}
- Babel.locale_props[\bbl@id@last] = {}
- Babel.locale_props[\bbl@id@last].name = '\languagename'
- }%
- \fi}%
- {}%
- \chardef\localeid\bbl@cl{id@}}
-% \end{macrocode}
-%
-% The unprotected part of |\selectlanguage|.
-%
-% \begin{macrocode}
-\expandafter\def\csname selectlanguage \endcsname#1{%
- \ifnum\bbl@hymapsel=\@cclv\let\bbl@hymapsel\tw@\fi
- \bbl@push@language
- \aftergroup\bbl@pop@language
- \bbl@set@language{#1}}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\bbl@set@language}
-%
-% The macro |\bbl@set@language| takes care of switching the language
-% environment \emph{and} of writing entries on the auxiliary files.
-% For historial reasons, language names can be either |language| of
-% |\language|. To catch either form a trick is used, but
-% unfortunately as a side effect the catcodes of letters in
-% |\languagename| are messed up. This is a bug, but preserved for
-% backwards compatibility. The list of auxiliary files can be
-% extended by redefining |\BabelContentsFiles|, but make sure they
-% are loaded inside a group (as |aux|, |toc|, |lof|, and |lot| do)
-% or the last language of the document will remain active
-% afterwards.
-%
-% We also write a command to change the current language in the
-% auxiliary files.
-%
-% \begin{macrocode}
-\def\BabelContentsFiles{toc,lof,lot}
-\def\bbl@set@language#1{% from selectlanguage, pop@
- \edef\languagename{%
- \ifnum\escapechar=\expandafter`\string#1\@empty
- \else\string#1\@empty\fi}%
- \select@language{\languagename}%
- % write to auxs
- \expandafter\ifx\csname date\languagename\endcsname\relax\else
- \if@filesw
- \ifx\babel@aux\@gobbletwo\else % Set if single in the first, redundant
- \protected@write\@auxout{}{\string\babel@aux{\languagename}{}}%
- \fi
- \bbl@usehooks{write}{}%
- \fi
- \fi}
-\def\select@language#1{% from set@, babel@aux
- % set hymap
- \ifnum\bbl@hymapsel=\@cclv\chardef\bbl@hymapsel4\relax\fi
- % set name
- \edef\languagename{#1}%
- \bbl@fixname\languagename
- \expandafter\ifx\csname date\languagename\endcsname\relax
- \IfFileExists{babel-\languagename.tex}%
- {\babelprovide{\languagename}}%
- {}%
- \fi
- \bbl@iflanguage\languagename{%
- \expandafter\ifx\csname date\languagename\endcsname\relax
- \bbl@error
- {Unknown language `#1'. Either you have\\%
- misspelled its name, it has not been installed,\\%
- or you requested it in a previous run. Fix its name,\\%
- install it or just rerun the file, respectively. In\\%
- some cases, you may need to remove the aux file}%
- {You may proceed, but expect wrong results}%
- \else
- % set type
- \let\bbl@select@type\z@
- \expandafter\bbl@switch\expandafter{\languagename}%
- \fi}}
-\def\babel@aux#1#2{%
- \select@language{#1}%
- \bbl@foreach\BabelContentsFiles{%
- \@writefile{##1}{\babel@toc{#1}{#2}}}}% %% TODO - ok in plain?
-\def\babel@toc#1#2{%
- \select@language{#1}}
-% \end{macrocode}
-%
-% A bit of optimization. Select in heads/foots the language only if
-% necessary. The real thing is in \texttt{babel.def}.
-%
-% \begin{macrocode}
-\let\select@language@x\select@language
-% \end{macrocode}
-%
-% \end{macro}
-%
-% First, check if the user asks for a known language. If so,
-% update the value of |\language| and call |\originalTeX|
-% to bring \TeX\ in a certain pre-defined state.
-%
-% The name of the language is stored in the control sequence
-% |\languagename|.
-%
-% Then we have to \emph{re}define |\originalTeX| to compensate for
-% the things that have been activated. To save memory space for
-% the macro definition of |\originalTeX|, we construct the control
-% sequence name for the |\noextras|\langvar\ command at definition
-% time by expanding the |\csname| primitive.
-%
-% Now activate the language-specific definitions. This is done by
-% constructing the names of three macros by concatenating three
-% words with the argument of |\selectlanguage|, and calling these
-% macros. \nb{What if \cs{hyphenation} was used in |extras|? Patch
-% temporarily |\set@hyphenmins| and hyphenation. It can be done in
-% hooks if necessary.}
-%
-% The switching of the values of |\lefthyphenmin| and
-% |\righthyphenmin| is somewhat different. First we save their
-% current values, then we check if |\|\langvar|hyphenmins| is
-% defined. If it is not, we set default values (2 and 3), otherwise
-% the values in |\|\langvar|hyphenmins| will be used.
-%
-% \begin{macrocode}
-\newif\ifbbl@usedategroup
-\def\bbl@switch#1{% from select@, foreign@
- % make sure there is info for the language if so requested
- \bbl@ensureinfo{#1}%
- % restore
- \originalTeX
- \expandafter\def\expandafter\originalTeX\expandafter{%
- \csname noextras#1\endcsname
- \let\originalTeX\@empty
- \babel@beginsave}%
- \bbl@usehooks{afterreset}{}%
- \languageshorthands{none}%
- % set the locale id
- \bbl@id@assign
- % switch captions, date
- \ifcase\bbl@select@type
- \ifhmode
- \hskip\z@skip % trick to ignore spaces
- \csname captions#1\endcsname\relax
- \csname date#1\endcsname\relax
- \loop\ifdim\lastskip>\z@\unskip\repeat\unskip
- \else
- \csname captions#1\endcsname\relax
- \csname date#1\endcsname\relax
- \fi
- \else
- \ifbbl@usedategroup % if \foreign... within \<lang>date
- \bbl@usedategroupfalse
- \ifhmode
- \hskip\z@skip % trick to ignore spaces
- \csname date#1\endcsname\relax
- \loop\ifdim\lastskip>\z@\unskip\repeat\unskip
- \else
- \csname date#1\endcsname\relax
- \fi
- \fi
- \fi
- % switch extras
- \bbl@usehooks{beforeextras}{}%
- \csname extras#1\endcsname\relax
- \bbl@usehooks{afterextras}{}%
- % > babel-ensure
- % > babel-sh-<short>
- % > babel-bidi
- % > babel-fontspec
- % hyphenation - case mapping
- \ifcase\bbl@opt@hyphenmap\or
- \def\BabelLower##1##2{\lccode##1=##2\relax}%
- \ifnum\bbl@hymapsel>4\else
- \csname\languagename @bbl@hyphenmap\endcsname
- \fi
- \chardef\bbl@opt@hyphenmap\z@
- \else
- \ifnum\bbl@hymapsel>\bbl@opt@hyphenmap\else
- \csname\languagename @bbl@hyphenmap\endcsname
- \fi
- \fi
- \global\let\bbl@hymapsel\@cclv
- % hyphenation - patterns
- \bbl@patterns{#1}%
- % hyphenation - mins
- \babel@savevariable\lefthyphenmin
- \babel@savevariable\righthyphenmin
- \expandafter\ifx\csname #1hyphenmins\endcsname\relax
- \set@hyphenmins\tw@\thr@@\relax
- \else
- \expandafter\expandafter\expandafter\set@hyphenmins
- \csname #1hyphenmins\endcsname\relax
- \fi}
-% \end{macrocode}
-%
-% \begin{environment}{otherlanguage}
-% The \Lenv{otherlanguage} environment can be used as an
-% alternative to using the |\selectlanguage| declarative
-% command. When you are typesetting a document which mixes
-% left-to-right and right-to-left typesetting you have to use this
-% environment in order to let things work as you expect them to.
-%
-% The |\ignorespaces| command is necessary to hide the environment
-% when it is entered in horizontal mode.
-%
-% \begin{macrocode}
-\long\def\otherlanguage#1{%
- \ifnum\bbl@hymapsel=\@cclv\let\bbl@hymapsel\thr@@\fi
- \csname selectlanguage \endcsname{#1}%
- \ignorespaces}
-% \end{macrocode}
-%
-% The |\endotherlanguage| part of the environment tries to hide
-% itself when it is called in horizontal mode.
-%
-% \begin{macrocode}
-\long\def\endotherlanguage{%
- \global\@ignoretrue\ignorespaces}
-% \end{macrocode}
-%
-% \end{environment}
-%
-% \begin{environment}{otherlanguage*}
-% The \Lenv{otherlanguage} environment is meant to be used when a
-% large part of text from a different language needs to be typeset,
-% but without changing the translation of words such as `figure'.
-% This environment makes use of |\foreign@language|.
-%
-% \begin{macrocode}
-\expandafter\def\csname otherlanguage*\endcsname#1{%
- \ifnum\bbl@hymapsel=\@cclv\chardef\bbl@hymapsel4\relax\fi
- \foreign@language{#1}}
-% \end{macrocode}
-%
-% At the end of the environment we need to switch off the extra
-% definitions. The grouping mechanism of the environment will take
-% care of resetting the correct hyphenation rules and ``extras''.
-%
-% \begin{macrocode}
-\expandafter\let\csname endotherlanguage*\endcsname\relax
-% \end{macrocode}
-%
-% \end{environment}
-%
-% \begin{macro}{\foreignlanguage}
-% The |\foreignlanguage| command is another substitute for the
-% |\selectlanguage| command. This command takes two arguments, the
-% first argument is the name of the language to use for typesetting
-% the text specified in the second argument.
-%
-% Unlike |\selectlanguage| this command doesn't switch
-% \emph{everything}, it only switches the hyphenation rules and the
-% extra definitions for the language specified. It does this within
-% a group and assumes the |\extras|\langvar\ command doesn't make
-% any |\global| changes. The coding is very similar to part of
-% |\selectlanguage|.
-%
-% |\bbl@beforeforeign| is a trick to fix a bug in bidi
-% texts. |\foreignlanguage| is supposed to be a `text' command, and
-% therefore it must emit a |\leavevmode|, but it does not, and
-% therefore the indent is placed on the opposite margin. For
-% backward compatibility, however, it is done only if a
-% right-to-left script is requested; otherwise, it is no-op.
-%
-% (3.11) |\foreignlanguage*| is a temporary, experimental macro for
-% a few lines with a different script direction, while preserving
-% the paragraph format (thank the braces around |\par|, things like
-% |\hangindent| are not reset). Do not use it in production,
-% because its semantics and its syntax may change (and very likely
-% will, or even it could be removed altogether). Currently it
-% enters in vmode and then selects the language (which in turn sets the
-% paragraph direction).
-%
-% (3.11) Also experimental are the hook |foreign| and
-% |foreign*|. With them you can redefine |\BabelText| which by
-% default does nothing. Its
-% behavior is not well defined yet. So, use it in
-% horizontal mode only if you do not want surprises.
-%
-% In other words, at the beginning of a paragraph |\foreignlanguage|
-% enters into hmode with the surrounding lang, and with
-% |\foreignlanguage*| with the new lang.
-%
-% \begin{macrocode}
-\providecommand\bbl@beforeforeign{}
-\edef\foreignlanguage{%
- \noexpand\protect
- \expandafter\noexpand\csname foreignlanguage \endcsname}
-\expandafter\def\csname foreignlanguage \endcsname{%
- \@ifstar\bbl@foreign@s\bbl@foreign@x}
-\def\bbl@foreign@x#1#2{%
- \begingroup
- \let\BabelText\@firstofone
- \bbl@beforeforeign
- \foreign@language{#1}%
- \bbl@usehooks{foreign}{}%
- \BabelText{#2}% Now in horizontal mode!
- \endgroup}
-\def\bbl@foreign@s#1#2{% TODO - \shapemode, \@setpar, ?\@@par
- \begingroup
- {\par}%
- \let\BabelText\@firstofone
- \foreign@language{#1}%
- \bbl@usehooks{foreign*}{}%
- \bbl@dirparastext
- \BabelText{#2}% Still in vertical mode!
- {\par}%
- \endgroup}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\foreign@language}
-% This macro does the
-% work for |\foreignlanguage| and the \Lenv{otherlanguage*}
-% environment. First we need to store the name of the language and
-% check that it is a known language. Then it just calls
-% |bbl@switch|.
-%
-% \begin{macrocode}
-\def\foreign@language#1{%
- % set name
- \edef\languagename{#1}%
- \bbl@fixname\languagename
- \expandafter\ifx\csname date\languagename\endcsname\relax
- \IfFileExists{babel-\languagename.tex}%
- {\babelprovide{\languagename}}%
- {}%
- \fi
- \bbl@iflanguage\languagename{%
- \expandafter\ifx\csname date\languagename\endcsname\relax
- \bbl@warning % TODO - why a warning, not an error?
- {Unknown language `#1'. Either you have\\%
- misspelled its name, it has not been installed,\\%
- or you requested it in a previous run. Fix its name,\\%
- install it or just rerun the file, respectively. In\\%
- some cases, you may need to remove the aux file.\\%
- I'll proceed, but expect wrong results.\\%
- Reported}%
- \fi
- % set type
- \let\bbl@select@type\@ne
- \expandafter\bbl@switch\expandafter{\languagename}}}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\bbl@patterns}
-%
-% This macro selects the hyphenation patterns by changing the
-% \cs{language} register. If special hyphenation patterns
-% are available specifically for the current font encoding,
-% use them instead of the default.
-%
-% It also sets hyphenation exceptions, but only once, because they
-% are global (here language |\lccode|'s has been set,
-% too). |\bbl@hyphenation@| is set to relax until the very first
-% |\babelhyphenation|, so do nothing with this value. If the
-% exceptions for a language (by its number, not its name, so that
-% |:ENC| is taken into account) has been set, then use
-% |\hyphenation| with both global and language exceptions and empty
-% the latter to mark they must not be set again.
-%
-% \begin{macrocode}
-\let\bbl@hyphlist\@empty
-\let\bbl@hyphenation@\relax
-\let\bbl@pttnlist\@empty
-\let\bbl@patterns@\relax
-\let\bbl@hymapsel=\@cclv
-\def\bbl@patterns#1{%
- \language=\expandafter\ifx\csname l@#1:\f@encoding\endcsname\relax
- \csname l@#1\endcsname
- \edef\bbl@tempa{#1}%
- \else
- \csname l@#1:\f@encoding\endcsname
- \edef\bbl@tempa{#1:\f@encoding}%
- \fi
- \@expandtwoargs\bbl@usehooks{patterns}{{#1}{\bbl@tempa}}%
- % > luatex
- \@ifundefined{bbl@hyphenation@}{}{% Can be \relax!
- \begingroup
- \bbl@xin@{,\number\language,}{,\bbl@hyphlist}%
- \ifin@\else
- \@expandtwoargs\bbl@usehooks{hyphenation}{{#1}{\bbl@tempa}}%
- \hyphenation{%
- \bbl@hyphenation@
- \@ifundefined{bbl@hyphenation@#1}%
- \@empty
- {\space\csname bbl@hyphenation@#1\endcsname}}%
- \xdef\bbl@hyphlist{\bbl@hyphlist\number\language,}%
- \fi
- \endgroup}}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{environment}{hyphenrules}
-% The environment \Lenv{hyphenrules} can be used to select
-% \emph{just} the hyphenation rules. This environment does
-% \emph{not} change |\languagename| and when the hyphenation rules
-% specified were not loaded it has no effect. Note however,
-% |\lccode|'s and font encodings are not set at all, so in most
-% cases you should use |otherlanguage*|.
-%
-% \begin{macrocode}
-\def\hyphenrules#1{%
- \edef\bbl@tempf{#1}%
- \bbl@fixname\bbl@tempf
- \bbl@iflanguage\bbl@tempf{%
- \expandafter\bbl@patterns\expandafter{\bbl@tempf}%
- \languageshorthands{none}%
- \expandafter\ifx\csname\bbl@tempf hyphenmins\endcsname\relax
- \set@hyphenmins\tw@\thr@@\relax
- \else
- \expandafter\expandafter\expandafter\set@hyphenmins
- \csname\bbl@tempf hyphenmins\endcsname\relax
- \fi}}
-\let\endhyphenrules\@empty
-% \end{macrocode}
-%
-% \end{environment}
-%
-% \begin{macro}{\providehyphenmins}
-% The macro |\providehyphenmins| should be used in the language
-% definition files to provide a \emph{default} setting for the
-% hyphenation parameters |\lefthyphenmin| and |\righthyphenmin|. If
-% the macro |\|\langvar|hyphenmins| is already defined this command
-% has no effect.
-%
-% \begin{macrocode}
-\def\providehyphenmins#1#2{%
- \expandafter\ifx\csname #1hyphenmins\endcsname\relax
- \@namedef{#1hyphenmins}{#2}%
- \fi}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\set@hyphenmins}
-% This macro sets the values of |\lefthyphenmin| and
-% |\righthyphenmin|. It expects two values as its argument.
-%
-% \begin{macrocode}
-\def\set@hyphenmins#1#2{%
- \lefthyphenmin#1\relax
- \righthyphenmin#2\relax}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\ProvidesLanguage}
-% The identification code for each file is something that was
-% introduced in \LaTeXe. When the command |\ProvidesFile| does not
-% exist, a dummy definition is provided temporarily. For use in the
-% language definition file the command |\ProvidesLanguage| is
-% defined by \babel.
-%
-% Depending on the format, ie, on if the former is defined, we use
-% a similar definition or not.
-%
-% \begin{macrocode}
-\ifx\ProvidesFile\@undefined
- \def\ProvidesLanguage#1[#2 #3 #4]{%
- \wlog{Language: #1 #4 #3 <#2>}%
- }
-\else
- \def\ProvidesLanguage#1{%
- \begingroup
- \catcode`\ 10 %
- \@makeother\/%
- \@ifnextchar[%]
- {\@provideslanguage{#1}}{\@provideslanguage{#1}[]}}
- \def\@provideslanguage#1[#2]{%
- \wlog{Language: #1 #2}%
- \expandafter\xdef\csname ver@#1.ldf\endcsname{#2}%
- \endgroup}
-\fi
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\LdfInit}
-% This macro is defined in two versions. The first version is to be
-% part of the `kernel' of \babel, ie. the part that is loaded in
-% the format; the second version is defined in \file{babel.def}.
-% The version in the format just checks the category code of the
-% ampersand and then loads \file{babel.def}.
-%
-% The category code of the ampersand is restored and the macro
-% calls itself again with the new definition from
-% \file{babel.def}
-%
-% \begin{macrocode}
-\def\LdfInit{%
- \chardef\atcatcode=\catcode`\@
- \catcode`\@=11\relax
- \input babel.def\relax
- \catcode`\@=\atcatcode \let\atcatcode\relax
- \LdfInit}
-% \end{macrocode}
-%
-% \end{macro}
-%
-% \begin{macro}{\originalTeX}
-% The macro|\originalTeX| should be known to \TeX\ at this moment.
-% As it has to be expandable we |\let| it to |\@empty| instead of
-% |\relax|.
-%
-% \begin{macrocode}
-\ifx\originalTeX\@undefined\let\originalTeX\@empty\fi
-% \end{macrocode}
-%
-% Because this part of the code can be included in a format, we
-% make sure that the macro which initialises the save mechanism,
-% |\babel@beginsave|, is not considered to be undefined.
-%
-% \begin{macrocode}
-\ifx\babel@beginsave\@undefined\let\babel@beginsave\relax\fi
-% \end{macrocode}
-%
-% \end{macro}
-%
-% A few macro names are reserved for future releases of \babel, which
-% will use the concept of `locale':
-%
-% \begin{macrocode}
-\providecommand\setlocale{%
- \bbl@error
- {Not yet available}%
- {Find an armchair, sit down and wait}}
-\let\uselocale\setlocale
-\let\locale\setlocale
-\let\selectlocale\setlocale
-\let\localename\setlocale
-\let\textlocale\setlocale
-\let\textlanguage\setlocale
-\let\languagetext\setlocale
-% \end{macrocode}
-%
-% \subsection{Errors}
-%
-% \begin{macro}{\@nolanerr}
-% \begin{macro}{\@nopatterns}
-% The \babel\ package will signal an error when a documents tries
-% to select a language that hasn't been defined earlier. When a
-% user selects a language for which no hyphenation patterns were
-% loaded into the format he will be given a warning about that
-% fact. We revert to the patterns for |\language|=0 in that case.
-% In most formats that will be (US)english, but it might also be
-% empty.
-% \begin{macro}{\@noopterr}
-% When the package was loaded without options not everything will
-% work as expected. An error message is issued in that case.
-%
-% When the format knows about |\PackageError| it must be \LaTeXe,
-% so we can safely use its error handling interface. Otherwise
-% we'll have to `keep it simple'.
-%
-% Infos are not written to the console, but on the other hand many
-% people think warnings are errors, so a further message type is
-% defined: an important info which is sent to the console.
-%
-% \begin{macrocode}
-\edef\bbl@nulllanguage{\string\language=0}
-\ifx\PackageError\@undefined
- \def\bbl@error#1#2{%
- \begingroup
- \newlinechar=`\^^J
- \def\\{^^J(babel) }%
- \errhelp{#2}\errmessage{\\#1}%
- \endgroup}
- \def\bbl@warning#1{%
- \begingroup
- \newlinechar=`\^^J
- \def\\{^^J(babel) }%
- \message{\\#1}%
- \endgroup}
- \let\bbl@infowarn\bbl@warning
- \def\bbl@info#1{%
- \begingroup
- \newlinechar=`\^^J
- \def\\{^^J}%
- \wlog{#1}%
- \endgroup}
-\else
- \def\bbl@error#1#2{%
- \begingroup
- \def\\{\MessageBreak}%
- \PackageError{babel}{#1}{#2}%
- \endgroup}
- \def\bbl@warning#1{%
- \begingroup
- \def\\{\MessageBreak}%
- \PackageWarning{babel}{#1}%
- \endgroup}
- \def\bbl@infowarn#1{%
- \begingroup
- \def\\{\MessageBreak}%
- \GenericWarning
- {(babel) \@spaces\@spaces\@spaces}%
- {Package babel Info: #1}%
- \endgroup}
- \def\bbl@info#1{%
- \begingroup
- \def\\{\MessageBreak}%
- \PackageInfo{babel}{#1}%
- \endgroup}
-\fi
-\@ifpackagewith{babel}{silent}
- {\let\bbl@info\@gobble
- \let\bbl@infowarn\@gobble
- \let\bbl@warning\@gobble}
- {}
-\def\bbl@nocaption{\protect\bbl@nocaption@i}
-\def\bbl@nocaption@i#1#2{% 1: text to be printed 2: caption macro \langXname
- \global\@namedef{#2}{\textbf{?#1?}}%
- \@nameuse{#2}%
- \bbl@warning{%
- \@backslashchar#2 not set. Please, define\\%
- it in the preamble with something like:\\%
- \string\renewcommand\@backslashchar#2{..}\\%
- Reported}}
-\def\bbl@tentative{\protect\bbl@tentative@i}
-\def\bbl@tentative@i#1{%
- \bbl@warning{%
- Some functions for '#1' are tentative.\\%
- They might not work as expected and their behavior\\%
- could change in the future.\\%
- Reported}}
-\def\@nolanerr#1{%
- \bbl@error
- {You haven't defined the language #1\space yet.\\%
- Perhaps you misspelled it or your installation\\%
- is not complete}%
- {Your command will be ignored, type <return> to proceed}}
-\def\@nopatterns#1{%
- \bbl@warning
- {No hyphenation patterns were preloaded for\\%
- the language `#1' into the format.\\%
- Please, configure your TeX system to add them and\\%
- rebuild the format. Now I will use the patterns\\%
- preloaded for \bbl@nulllanguage\space instead}}
-\let\bbl@usehooks\@gobbletwo
+%<*kernel>
+\let\bbl@onlyswitch\@empty
+\input babel.def
+\let\bbl@onlyswitch\@undefined
%</kernel>
%<*patterns>
% \end{macrocode}
@@ -10983,60 +11998,31 @@ help from Bernd Raichle, for which I am grateful.
%
% \section{Loading hyphenation patterns}
%
-% The following code is meant to be read by ini\TeX\ because it
-% should instruct \TeX\ to read hyphenation patterns. To this end the
-% \texttt{docstrip} option \texttt{patterns} can be used to include
-% this code in the file \file{hyphen.cfg}. Code is written with lower
-% level macros.
+% The following code is meant to be read by ini\TeX\ because it
+% should instruct \TeX\ to read hyphenation patterns. To this end the
+% \texttt{docstrip} option \texttt{patterns} can be used to include
+% this code in the file \file{hyphen.cfg}. Code is written with lower
+% level macros.
%
-% We want to add a message to the message \LaTeX$\:$2.09 puts in
-% the |\everyjob| register. This could be done by the following
-% code:
-%\begin{verbatim}
-% \let\orgeveryjob\everyjob
-% \def\everyjob#1{%
-% \orgeveryjob{#1}%
-% \orgeveryjob\expandafter{\the\orgeveryjob\immediate\write16{%
-% hyphenation patterns for \the\loaded@patterns loaded.}}%
-% \let\everyjob\orgeveryjob\let\orgeveryjob\@undefined}
-%\end{verbatim}
-% The code above redefines the control sequence \cs{everyjob}
-% in order to be able to add something to the current contents of
-% the register. This is necessary because the processing of
-% hyphenation patterns happens long before \LaTeX\ fills the
-% register.
-%
-% There are some problems with this approach though.
-% \begin{itemize}
-% \item When someone wants to use several hyphenation patterns with
-% \SliTeX\ the above scheme won't work. The reason is that \SliTeX\
-% overwrites the contents of the |\everyjob| register with its own
-% message.
-% \item Plain \TeX\ does not use the |\everyjob| register so the
-% message would not be displayed.
-% \end{itemize}
-% To circumvent this a `dirty trick' can be used. As this code is
-% only processed when creating a new format file there is one
-% command that is sure to be used, |\dump|. Therefore the original
-% |\dump| is saved in |\org@dump| and a new definition is supplied.
-%
-% To make sure that \LaTeX$\:$2.09 executes the
-% |\@begindocumenthook| we would want to alter |\begin{document}|,
-% but as this done too often already, we add the new code at the
-% front of |\@preamblecmds|. But we can only do that after it has
-% been defined, so we add this piece of code to |\dump|.
-%
-% This new definition starts by adding an instruction to write a
-% message on the terminal and in the transcript file to inform the
-% user of the preloaded hyphenation patterns.
-%
-% Then everything is restored to the old situation and the format
-% is dumped.
+% To make sure that \LaTeX$\:$2.09 executes the |\@begindocumenthook|
+% we would want to alter |\begin{document}|, but as this done too often
+% already, we add the new code at the front of |\@preamblecmds|. But we
+% can only do that after it has been defined, so we add this piece of
+% code to |\dump|.
+%
+% This new definition starts by adding an instruction to write a
+% message on the terminal and in the transcript file to inform the
+% user of the preloaded hyphenation patterns.
+%
+% Then everything is restored to the old situation and the format
+% is dumped.
%
% \begin{macrocode}
<@Make sure ProvidesFile is defined@>
\ProvidesFile{hyphen.cfg}[<@date@> <@version@> Babel hyphens]
\xdef\bbl@format{\jobname}
+\def\bbl@version{<@version@>}
+\def\bbl@date{<@date@>}
\ifx\AtBeginDocument\@undefined
\def\@empty{}
\let\orig@dump\dump
@@ -11074,9 +12060,9 @@ help from Bernd Raichle, for which I am grateful.
%
% \begin{macro}{\process@synonym}
%
-% This macro takes care of the lines which start with an
-% \texttt{=}. It needs an empty token register to begin with.
-% |\bbl@languages| is also set to empty.
+% This macro takes care of the lines which start with an
+% \texttt{=}. It needs an empty token register to begin with.
+% |\bbl@languages| is also set to empty.
%
% \begin{macrocode}
\toks@{}
@@ -11109,55 +12095,56 @@ help from Bernd Raichle, for which I am grateful.
%
% \end{macro}
%
-% \begin{macro}{\process@language}
-% The macro |\process@language| is used to process a non-empty line
-% from the `configuration file'. It has three arguments, each
-% delimited by white space. The first argument is the `name' of a
-% language; the second is the name of the file that contains the
-% patterns. The optional third argument is the name of a file
-% containing hyphenation exceptions.
-%
-% The first thing to do is call |\addlanguage| to allocate a pattern
-% register and to make that register `active'. Then the pattern file
-% is read.
-%
-% For some hyphenation patterns it is needed to load them with a
-% specific font encoding selected. This can be specified in the
-% file \file{language.dat} by adding for instance `\texttt{:T1}' to
-% the name of the language. The macro |\bbl@get@enc| extracts the
-% font encoding from the language name and stores it in
-% |\bbl@hyph@enc|. The latter can be used in hyphenation files if
-% you need to set a behavior depending on the given encoding (it
-% is set to empty if no encoding is given).
-%
-% Pattern files may contain assignments to |\lefthyphenmin| and
-% |\righthyphenmin|. \TeX\ does not keep track of these
-% assignments. Therefore we try to detect such assignments and
-% store them in the |\|\langvar|hyphenmins| macro. When no
-% assignments were made we provide a default setting.
-%
-% Some pattern files contain changes to the |\lccode| en |\uccode|
-% arrays. Such changes should remain local to the language;
-% therefore we process the pattern file in a group; the |\patterns|
-% command acts globally so its effect will be remembered.
-%
-% Then we globally store the settings of |\lefthyphenmin| and
-% |\righthyphenmin| and close the group.
-%
-% When the hyphenation patterns have been processed we need to see
-% if a file with hyphenation exceptions needs to be read. This is
-% the case when the third argument is not empty and when it does
-% not contain a space token. (Note however there is no need to save
-% hyphenation exceptions into the format.)
-%
-% \cs{bbl@languages} saves a snapshot of the loaded languages in the
-% form \cs{bbl@elt}\marg{language-name}\marg{number}%
-% \marg{patterns-file}\marg{exceptions-file}. Note the last 2
-% arguments are empty in `dialects' defined in |language.dat| with
-% |=|. Note also the language name can have encoding info.
-%
-% Finally, if the counter |\language| is equal to zero we execute the
-% synonyms stored.
+% \begin{macro}{\process@language}
+%
+% The macro |\process@language| is used to process a non-empty line
+% from the `configuration file'. It has three arguments, each
+% delimited by white space. The first argument is the `name' of a
+% language; the second is the name of the file that contains the
+% patterns. The optional third argument is the name of a file
+% containing hyphenation exceptions.
+%
+% The first thing to do is call |\addlanguage| to allocate a pattern
+% register and to make that register `active'. Then the pattern file
+% is read.
+%
+% For some hyphenation patterns it is needed to load them with a
+% specific font encoding selected. This can be specified in the
+% file \file{language.dat} by adding for instance `\texttt{:T1}' to
+% the name of the language. The macro |\bbl@get@enc| extracts the
+% font encoding from the language name and stores it in
+% |\bbl@hyph@enc|. The latter can be used in hyphenation files if
+% you need to set a behavior depending on the given encoding (it
+% is set to empty if no encoding is given).
+%
+% Pattern files may contain assignments to |\lefthyphenmin| and
+% |\righthyphenmin|. \TeX\ does not keep track of these
+% assignments. Therefore we try to detect such assignments and
+% store them in the |\|\langvar|hyphenmins| macro. When no
+% assignments were made we provide a default setting.
+%
+% Some pattern files contain changes to the |\lccode| en |\uccode|
+% arrays. Such changes should remain local to the language;
+% therefore we process the pattern file in a group; the |\patterns|
+% command acts globally so its effect will be remembered.
+%
+% Then we globally store the settings of |\lefthyphenmin| and
+% |\righthyphenmin| and close the group.
+%
+% When the hyphenation patterns have been processed we need to see
+% if a file with hyphenation exceptions needs to be read. This is
+% the case when the third argument is not empty and when it does
+% not contain a space token. (Note however there is no need to save
+% hyphenation exceptions into the format.)
+%
+% \cs{bbl@languages} saves a snapshot of the loaded languages in the
+% form \cs{bbl@elt}\marg{language-name}\marg{number}%
+% \marg{patterns-file}\marg{exceptions-file}. Note the last 2
+% arguments are empty in `dialects' defined in |language.dat| with
+% |=|. Note also the language name can have encoding info.
+%
+% Finally, if the counter |\language| is equal to zero we execute the
+% synonyms stored.
%
% \begin{macrocode}
\def\process@language#1#2#3{%
@@ -11197,30 +12184,69 @@ help from Bernd Raichle, for which I am grateful.
\fi}
% \end{macrocode}
%
-% \begin{macro}{\bbl@get@enc}
+% \begin{macro}{\bbl@get@enc}
%
-% \begin{macro}{\bbl@hyph@enc}
-% The macro |\bbl@get@enc| extracts the font encoding from the
-% language name and stores it in |\bbl@hyph@enc|. It uses delimited
-% arguments to achieve this.
+% \begin{macro}{\bbl@hyph@enc}
+% The macro |\bbl@get@enc| extracts the font encoding from the
+% language name and stores it in |\bbl@hyph@enc|. It uses delimited
+% arguments to achieve this.
%
% \begin{macrocode}
\def\bbl@get@enc#1:#2:#3\@@@{\def\bbl@hyph@enc{#2}}
% \end{macrocode}
%
-% \end{macro}
-% \end{macro}
-% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
-% Now, hooks are defined. For efficiency reasons, they are dealt
-% here in a special way. Besides \luatex, format-specific
-% configuration files are taken into account.
+% Now, hooks are defined. For efficiency reasons, they are dealt
+% here in a special way. Besides \luatex, format-specific
+% configuration files are taken into account. |loadkernel| currently
+% loads nothing, but define some basic macros instead.
%
% \begin{macrocode}
\def\bbl@hook@everylanguage#1{}
\def\bbl@hook@loadpatterns#1{\input #1\relax}
\let\bbl@hook@loadexceptions\bbl@hook@loadpatterns
-\let\bbl@hook@loadkernel\bbl@hook@loadpatterns
+\def\bbl@hook@loadkernel#1{%
+ \def\addlanguage{\csname newlanguage\endcsname}%
+ \def\adddialect##1##2{%
+ \global\chardef##1##2\relax
+ \wlog{\string##1 = a dialect from \string\language##2}}%
+ \def\iflanguage##1{%
+ \expandafter\ifx\csname l@##1\endcsname\relax
+ \@nolanerr{##1}%
+ \else
+ \ifnum\csname l@##1\endcsname=\language
+ \expandafter\expandafter\expandafter\@firstoftwo
+ \else
+ \expandafter\expandafter\expandafter\@secondoftwo
+ \fi
+ \fi}%
+ \def\providehyphenmins##1##2{%
+ \expandafter\ifx\csname ##1hyphenmins\endcsname\relax
+ \@namedef{##1hyphenmins}{##2}%
+ \fi}%
+ \def\set@hyphenmins##1##2{%
+ \lefthyphenmin##1\relax
+ \righthyphenmin##2\relax}%
+ \def\selectlanguage{%
+ \errhelp{Selecting a language requires a package supporting it}%
+ \errmessage{Not loaded}}%
+ \let\foreignlanguage\selectlanguage
+ \let\otherlanguage\selectlanguage
+ \expandafter\let\csname otherlanguage*\endcsname\selectlanguage
+ \def\bbl@usehooks##1##2{}% TODO. Temporary!!
+ \def\setlocale{%
+ \errhelp{Find an armchair, sit down and wait}%
+ \errmessage{Not yet available}}%
+ \let\uselocale\setlocale
+ \let\locale\setlocale
+ \let\selectlocale\setlocale
+ \let\localename\setlocale
+ \let\textlocale\setlocale
+ \let\textlanguage\setlocale
+ \let\languagetext\setlocale}
\begingroup
\def\AddBabelHook#1#2{%
\expandafter\ifx\csname bbl@hook@#2\endcsname\relax
@@ -11266,28 +12292,24 @@ help from Bernd Raichle, for which I am grateful.
\else
% \end{macrocode}
%
-% Pattern registers are allocated using count register
-% |\last@language|. Its initial value is~0. The definition of the
-% macro |\newlanguage| is such that it first increments the count
-% register and then defines the language. In order to have the
-% first patterns loaded in pattern register number~0 we initialize
-% |\last@language| with the value~$-1$.
+% Pattern registers are allocated using count register
+% |\last@language|. Its initial value is~0. The definition of the
+% macro |\newlanguage| is such that it first increments the count
+% register and then defines the language. In order to have the
+% first patterns loaded in pattern register number~0 we initialize
+% |\last@language| with the value~$-1$.
%
% \begin{macrocode}
\last@language\m@ne
% \end{macrocode}
%
-% We now read lines from the file until the end is found
+% We now read lines from the file until the end is found. While
+% reading from the input, it is useful to switch off recognition of
+% the end-of-line character. This saves us stripping off spaces from
+% the contents of the control sequence.
%
% \begin{macrocode}
\loop
-% \end{macrocode}
-%
-% While reading from the input, it is useful to switch off
-% recognition of the end-of-line character. This saves us stripping
-% off spaces from the contents of the control sequence.
-%
-% \begin{macrocode}
\endlinechar\m@ne
\read1 to \bbl@line
\endlinechar`\^^M
@@ -11308,8 +12330,9 @@ help from Bernd Raichle, for which I am grateful.
\repeat
% \end{macrocode}
%
-% Check for the end of the file. We must reverse the test for
-% |\ifeof| without |\else|. Then reactivate the default patterns.
+% Check for the end of the file. We must reverse the test for
+% |\ifeof| without |\else|. Then reactivate the default patterns,
+% and close the configuration file.
%
% \begin{macrocode}
\begingroup
@@ -11320,17 +12343,12 @@ help from Bernd Raichle, for which I am grateful.
\bbl@languages
\endgroup
\fi
-% \end{macrocode}
-%
-% and close the configuration file.
-%
-% \begin{macrocode}
\closein1
% \end{macrocode}
%
-% We add a message about the fact that babel is loaded in the
-% format and with which language patterns to the \cs{everyjob}
-% register.
+% We add a message about the fact that babel is loaded in the
+% format and with which language patterns to the \cs{everyjob}
+% register.
%
% \begin{macrocode}
\if/\the\toks@/\else
@@ -11370,63 +12388,13 @@ help from Bernd Raichle, for which I am grateful.
%
% \begin{macrocode}
%<<*More package options>>
-\ifodd\bbl@engine
- \DeclareOption{bidi=basic-r}%
- {\ExecuteOptions{bidi=basic}}
- \DeclareOption{bidi=basic}%
- {\let\bbl@beforeforeign\leavevmode
- % TODO - to locale_props, not as separate attribute
- \newattribute\bbl@attr@dir
- % I don't like it, hackish:
- \frozen@everymath\expandafter{%
- \expandafter\bbl@mathboxdir\the\frozen@everymath}%
- \frozen@everydisplay\expandafter{%
- \expandafter\bbl@mathboxdir\the\frozen@everydisplay}%
- \bbl@exp{\output{\bodydir\pagedir\the\output}}%
- \AtEndOfPackage{\EnableBabelHook{babel-bidi}}}
-\else
- \DeclareOption{bidi=basic-r}%
- {\ExecuteOptions{bidi=basic}}
- \DeclareOption{bidi=basic}%
- {\bbl@error
- {The bidi method `basic' is available only in\\%
- luatex. I'll continue with `bidi=default', so\\%
- expect wrong results}%
- {See the manual for further details.}%
- \let\bbl@beforeforeign\leavevmode
- \AtEndOfPackage{%
- \EnableBabelHook{babel-bidi}%
- \bbl@xebidipar}}
- \def\bbl@loadxebidi#1{%
- \ifx\RTLfootnotetext\@undefined
- \AtEndOfPackage{%
- \EnableBabelHook{babel-bidi}%
- \ifx\fontspec\@undefined
- \usepackage{fontspec}% bidi needs fontspec
- \fi
- \usepackage#1{bidi}}%
- \fi}
- \DeclareOption{bidi=bidi}%
- {\bbl@tentative{bidi=bidi}%
- \bbl@loadxebidi{}}
- \DeclareOption{bidi=bidi-r}%
- {\bbl@tentative{bidi=bidi-r}%
- \bbl@loadxebidi{[rldocument]}}
- \DeclareOption{bidi=bidi-l}%
- {\bbl@tentative{bidi=bidi-l}%
- \bbl@loadxebidi{}}
-\fi
-\DeclareOption{bidi=default}%
- {\let\bbl@beforeforeign\leavevmode
- \ifodd\bbl@engine
- \newattribute\bbl@attr@dir
- \bbl@exp{\output{\bodydir\pagedir\the\output}}%
- \fi
- \AtEndOfPackage{%
- \EnableBabelHook{babel-bidi}%
- \ifodd\bbl@engine\else
- \bbl@xebidipar
- \fi}}
+\chardef\bbl@bidimode\z@
+\DeclareOption{bidi=default}{\chardef\bbl@bidimode=\@ne}
+\DeclareOption{bidi=basic}{\chardef\bbl@bidimode=101 }
+\DeclareOption{bidi=basic-r}{\chardef\bbl@bidimode=102 }
+\DeclareOption{bidi=bidi}{\chardef\bbl@bidimode=201 }
+\DeclareOption{bidi=bidi-r}{\chardef\bbl@bidimode=202 }
+\DeclareOption{bidi=bidi-l}{\chardef\bbl@bidimode=203 }
%<</More package options>>
% \end{macrocode}
%
@@ -11435,21 +12403,47 @@ help from Bernd Raichle, for which I am grateful.
% |bbl@font| replaces hardcoded font names inside |\..family| by the
% corresponding macro |\..default|.
%
+% At the time of this writing, \textsf{fontspec} shows a warning about
+% there are languages not available, which some people think refers to
+% \babel{}, even if there is nothing wrong. Here is hack to patch
+% \textsf{fontspec} to avoid the misleading message, which is replaced
+% ba a more explanatory one.
+%
% \begin{macrocode}
%<<*Font selection>>
\bbl@trace{Font handling with fontspec}
+\ifx\ExplSyntaxOn\@undefined\else
+ \ExplSyntaxOn
+ \catcode`\ =10
+ \def\bbl@loadfontspec{%
+ \usepackage{fontspec}%
+ \expandafter
+ \def\csname msg~text~>~fontspec/language-not-exist\endcsname##1##2##3##4{%
+ Font '\l_fontspec_fontname_tl' is using the\\%
+ default features for language '##1'.\\%
+ That's usually fine, because many languages\\%
+ require no specific features, but if the output is\\%
+ not as expected, consider selecting another font.}
+ \expandafter
+ \def\csname msg~text~>~fontspec/no-script\endcsname##1##2##3##4{%
+ Font '\l_fontspec_fontname_tl' is using the\\%
+ default features for script '##2'.\\%
+ That's not always wrong, but if the output is\\%
+ not as expected, consider selecting another font.}}
+ \ExplSyntaxOff
+\fi
\@onlypreamble\babelfont
\newcommand\babelfont[2][]{% 1=langs/scripts 2=fam
\bbl@foreach{#1}{%
\expandafter\ifx\csname date##1\endcsname\relax
- \IfFileExists{babel-##1.tex}%
- {\babelprovide{##1}}%
- {}%
+ \IfFileExists{babel-##1.tex}%
+ {\babelprovide{##1}}%
+ {}%
\fi}%
\edef\bbl@tempa{#1}%
\def\bbl@tempb{#2}% Used by \bbl@bblfont
\ifx\fontspec\@undefined
- \usepackage{fontspec}%
+ \bbl@loadfontspec
\fi
\EnableBabelHook{babel-fontspec}% Just calls \bbl@switchfont
\bbl@bblfont}
@@ -11525,7 +12519,7 @@ help from Bernd Raichle, for which I am grateful.
\bbl@ifunset{bbl@##1dflt@\languagename}%
{\bbl@cs{famrst@##1}%
\global\bbl@csarg\let{famrst@##1}\relax}%
- {\bbl@exp{% order is relevant
+ {\bbl@exp{% order is relevant. TODO: but sometimes wrong!
\\\bbl@add\\\originalTeX{%
\\\bbl@font@rst{\bbl@cl{##1dflt}}%
\<##1default>\<##1family>{##1}}%
@@ -11584,9 +12578,13 @@ help from Bernd Raichle, for which I am grateful.
\ifin@
\bbl@exp{\\\bbl@fontspec@set\\#1\expandafter\@gobbletwo#1\\#3}%
\fi
- \bbl@exp{%
+ \bbl@exp{% 'Unprotected' macros return prev values
\def\\#2{#1}% eg, \rmdefault{\bbl@rmdflt@lang}
- \\\bbl@ifsamestring{#2}{\f@family}{\\#3\let\\\bbl@tempa\relax}{}}}
+ \\\bbl@ifsamestring{#2}{\f@family}%
+ {\\#3%
+ \\\bbl@ifsamestring{\f@series}{\bfdefault}{\\\bfseries}{}%
+ \let\\\bbl@tempa\relax}%
+ {}}}
% TODO - next should be global?, but even local does its job. I'm
% still not sure -- must investigate:
\def\bbl@fontspec@set#1#2#3#4{% eg \bbl@rmdflt@lang fnt-opt fnt-nme \xxfamily
@@ -11594,7 +12592,7 @@ help from Bernd Raichle, for which I am grateful.
\let\bbl@mapselect\relax
\let\bbl@temp@fam#4% eg, '\rmfamily', to be restored below
\let#4\@empty % Make sure \renewfontfamily is valid
- \bbl@exp{%
+ \bbl@exp{%
\let\\\bbl@temp@pfam\<\bbl@stripslash#4\space>% eg, '\rmfamily '
\<keys_if_exist:nnF>{fontspec-opentype}{Script/\bbl@cl{sname}}%
{\\\newfontscript{\bbl@cl{sname}}{\bbl@cl{sotf}}}%
@@ -11683,62 +12681,20 @@ help from Bernd Raichle, for which I am grateful.
% therefore it is reset always to |utf8|, which seems a sensible
% default.
%
-% \LaTeX{} sets many ``codes'' just before loading
-% \verb|hyphen.cfg|. That is not a problem in luatex, but in xetex
-% they must be reset to the proper value. Most of the work is done in
-% \textsf{xe(la)tex.ini}, so here we just ``undo'' some of the
-% changes done by \LaTeX. Anyway, for consistency Lua\TeX{} also
-% resets the catcodes.
-%
-% \begin{macrocode}
-%<<*Restore Unicode catcodes before loading patterns>>
- \begingroup
- % Reset chars "80-"C0 to category "other", no case mapping:
- \catcode`\@=11 \count@=128
- \loop\ifnum\count@<192
- \global\uccode\count@=0 \global\lccode\count@=0
- \global\catcode\count@=12 \global\sfcode\count@=1000
- \advance\count@ by 1 \repeat
- % Other:
- \def\O ##1 {%
- \global\uccode"##1=0 \global\lccode"##1=0
- \global\catcode"##1=12 \global\sfcode"##1=1000 }%
- % Letter:
- \def\L ##1 ##2 ##3 {\global\catcode"##1=11
- \global\uccode"##1="##2
- \global\lccode"##1="##3
- % Uppercase letters have sfcode=999:
- \ifnum"##1="##3 \else \global\sfcode"##1=999 \fi }%
- % Letter without case mappings:
- \def\l ##1 {\L ##1 ##1 ##1 }%
- \l 00AA
- \L 00B5 039C 00B5
- \l 00BA
- \O 00D7
- \l 00DF
- \O 00F7
- \L 00FF 0178 00FF
- \endgroup
- \input #1\relax
-%<</Restore Unicode catcodes before loading patterns>>
-% \end{macrocode}
-%
-% Some more common code.
-%
% \begin{macrocode}
%<<*Footnote changes>>
\bbl@trace{Bidi footnotes}
-\ifx\bbl@beforeforeign\leavevmode
+\ifnum\bbl@bidimode>\z@
\def\bbl@footnote#1#2#3{%
\@ifnextchar[%
{\bbl@footnote@o{#1}{#2}{#3}}%
{\bbl@footnote@x{#1}{#2}{#3}}}
- \def\bbl@footnote@x#1#2#3#4{%
+ \long\def\bbl@footnote@x#1#2#3#4{%
\bgroup
\select@language@x{\bbl@main@language}%
\bbl@fn@footnote{#2#1{\ignorespaces#4}#3}%
\egroup}
- \def\bbl@footnote@o#1#2#3[#4]#5{%
+ \long\def\bbl@footnote@o#1#2#3[#4]#5{%
\bgroup
\select@language@x{\bbl@main@language}%
\bbl@fn@footnote[#4]{#2#1{\ignorespaces#5}#3}%
@@ -11747,12 +12703,12 @@ help from Bernd Raichle, for which I am grateful.
\@ifnextchar[%
{\bbl@footnotetext@o{#1}{#2}{#3}}%
{\bbl@footnotetext@x{#1}{#2}{#3}}}
- \def\bbl@footnotetext@x#1#2#3#4{%
+ \long\def\bbl@footnotetext@x#1#2#3#4{%
\bgroup
\select@language@x{\bbl@main@language}%
\bbl@fn@footnotetext{#2#1{\ignorespaces#4}#3}%
\egroup}
- \def\bbl@footnotetext@o#1#2#3[#4]#5{%
+ \long\def\bbl@footnotetext@o#1#2#3[#4]#5{%
\bgroup
\select@language@x{\bbl@main@language}%
\bbl@fn@footnotetext[#4]{#2#1{\ignorespaces#5}#3}%
@@ -11820,7 +12776,7 @@ help from Bernd Raichle, for which I am grateful.
\fi
\bbl@exp{%
\\\bbl@add\<extras\languagename>{%
- \XeTeXlinebreaklocale "\bbl@cl{lbcp}"%
+ \XeTeXlinebreaklocale "\bbl@cl{tbcp}"%
\<bbl@xeisp@\languagename>%
\<bbl@xeipn@\languagename>}%
\\\bbl@toglobal\<extras\languagename>%
@@ -11838,8 +12794,6 @@ help from Bernd Raichle, for which I am grateful.
\expandafter\bbl@toglobal\csname selectfont \endcsname}%
\fi}%
\fi}
-\AddBabelHook{xetex}{loadkernel}{%
-<@Restore Unicode catcodes before loading patterns@>}
\ifx\DisableBabelHook\@undefined\endinput\fi
\AddBabelHook{babel-fontspec}{afterextras}{\bbl@switchfont}
\AddBabelHook{babel-fontspec}{beforestart}{\bbl@ckeckstdfonts}
@@ -11953,7 +12907,7 @@ help from Bernd Raichle, for which I am grateful.
%
% \subsection{LuaTeX}
%
-% The new loader for luatex is based solely on |language.dat|, which
+% The loader for \luatex{} is based solely on |language.dat|, which
% is read on the fly. The code shouldn't be executed when the format
% is build, so we check if |\AddBabelHook| is defined. Then comes a
% modified version of the loader in |hyphen.cfg| (without the
@@ -11995,14 +12949,21 @@ help from Bernd Raichle, for which I am grateful.
%
% We need catcode tables, but no format (targeted by \babel) provide a
% command to allocate them (although there are packages like
-% \textsf{ctablestack}). For the moment, a dangerous approach is used
-% -- just allocate a high random number and cross the fingers. To
-% complicate things, \textsf{etex.sty} changes the way languages are
-% allocated.
-%
+% \textsf{ctablestack}). FIX - This isn't true anymore. For the moment,
+% a dangerous approach is used - just allocate a high random number and
+% cross the fingers. To complicate things, \textsf{etex.sty} changes
+% the way languages are allocated.
+%
+% This files is read at three places: (1) when |plain.def|, |babel.sty|
+% starts, to read the list of available languages from |language.dat|
+% (for the |base| option); (2) at hyphen.cfg, to modify some macros;
+% (3) in the middle of |plain.def| and |babel.sty|, by |babel.def|,
+% with the commands and other definitions for |luatex| (eg,
+% |\babelpatterns|).
+%
% \begin{macrocode}
%<*luatex>
-\ifx\AddBabelHook\@undefined
+\ifx\AddBabelHook\@undefined % When plain.def, babel.sty starts
\bbl@trace{Read language.dat}
\ifx\bbl@readstream\@undefined
\csname newread\endcsname\bbl@readstream
@@ -12089,29 +13050,31 @@ help from Bernd Raichle, for which I am grateful.
\endgroup
\bbl@trace{Macros for reading patterns files}
\def\bbl@get@enc#1:#2:#3\@@@{\def\bbl@hyph@enc{#2}}
-% TODO - Harcoded value:
\ifx\babelcatcodetablenum\@undefined
- \def\babelcatcodetablenum{5211}
+ \ifx\newcatcodetable\@undefined
+ \def\babelcatcodetablenum{5211}
+ \def\bbl@pattcodes{\numexpr\babelcatcodetablenum+1\relax}
+ \else
+ \newcatcodetable\babelcatcodetablenum
+ \newcatcodetable\bbl@pattcodes
+ \fi
+\else
+ \def\bbl@pattcodes{\numexpr\babelcatcodetablenum+1\relax}
\fi
\def\bbl@luapatterns#1#2{%
\bbl@get@enc#1::\@@@
\setbox\z@\hbox\bgroup
\begingroup
- \ifx\catcodetable\@undefined
- \let\savecatcodetable\luatexsavecatcodetable
- \let\initcatcodetable\luatexinitcatcodetable
- \let\catcodetable\luatexcatcodetable
- \fi
\savecatcodetable\babelcatcodetablenum\relax
- \initcatcodetable\numexpr\babelcatcodetablenum+1\relax
- \catcodetable\numexpr\babelcatcodetablenum+1\relax
- \catcode`\#=6 \catcode`\$=3 \catcode`\&=4 \catcode`\^=7
- \catcode`\_=8 \catcode`\{=1 \catcode`\}=2 \catcode`\~=13
- \catcode`\@=11 \catcode`\^^I=10 \catcode`\^^J=12
- \catcode`\<=12 \catcode`\>=12 \catcode`\*=12 \catcode`\.=12
- \catcode`\-=12 \catcode`\/=12 \catcode`\[=12 \catcode`\]=12
- \catcode`\`=12 \catcode`\'=12 \catcode`\"=12
- \input #1\relax
+ \initcatcodetable\bbl@pattcodes\relax
+ \catcodetable\bbl@pattcodes\relax
+ \catcode`\#=6 \catcode`\$=3 \catcode`\&=4 \catcode`\^=7
+ \catcode`\_=8 \catcode`\{=1 \catcode`\}=2 \catcode`\~=13
+ \catcode`\@=11 \catcode`\^^I=10 \catcode`\^^J=12
+ \catcode`\<=12 \catcode`\>=12 \catcode`\*=12 \catcode`\.=12
+ \catcode`\-=12 \catcode`\/=12 \catcode`\[=12 \catcode`\]=12
+ \catcode`\`=12 \catcode`\'=12 \catcode`\"=12
+ \input #1\relax
\catcodetable\babelcatcodetablenum\relax
\endgroup
\def\bbl@tempa{#2}%
@@ -12144,7 +13107,26 @@ help from Bernd Raichle, for which I am grateful.
{\expandafter\expandafter\expandafter\bbl@luapatterns
\csname bbl@hyphendata@\the\language\endcsname}}{}}
\endinput\fi
-\begingroup
+ % Here ends \ifx\AddBabelHook\@undefined
+ % A few lines are only read by hyphen.cfg
+\ifx\DisableBabelHook\@undefined
+ \AddBabelHook{luatex}{everylanguage}{%
+ \def\process@language##1##2##3{%
+ \def\process@line####1####2 ####3 ####4 {}}}
+ \AddBabelHook{luatex}{loadpatterns}{%
+ \input #1\relax
+ \expandafter\gdef\csname bbl@hyphendata@\the\language\endcsname
+ {{#1}{}}}
+ \AddBabelHook{luatex}{loadexceptions}{%
+ \input #1\relax
+ \def\bbl@tempb##1##2{{##1}{#1}}%
+ \expandafter\xdef\csname bbl@hyphendata@\the\language\endcsname
+ {\expandafter\expandafter\expandafter\bbl@tempb
+ \csname bbl@hyphendata@\the\language\endcsname}}
+\endinput\fi
+ % Here stops reading code for hyphen.cfg
+ % The following is read the 2nd time it's loaded
+\begingroup % TODO - to a lua file
\catcode`\%=12
\catcode`\'=12
\catcode`\"=12
@@ -12200,6 +13182,7 @@ help from Bernd Raichle, for which I am grateful.
\endgroup
\ifx\newattribute\@undefined\else
\newattribute\bbl@attr@locale
+ \directlua{ Babel.attr_locale = luatexbase.registernumber'bbl@attr@locale'}
\AddBabelHook{luatex}{beforeextras}{%
\setattribute\bbl@attr@locale\localeid}
\fi
@@ -12251,19 +13234,6 @@ help from Bernd Raichle, for which I am grateful.
\bbl@ifunset{bbl@prehc@\languagename}{}%
{\\\bbl@ifblank{\bbl@cs{prehc@\languagename}}{}%
{\prehyphenchar=\bbl@cl{prehc}\relax}}}}
-\AddBabelHook{luatex}{everylanguage}{%
- \def\process@language##1##2##3{%
- \def\process@line####1####2 ####3 ####4 {}}}
-\AddBabelHook{luatex}{loadpatterns}{%
- \input #1\relax
- \expandafter\gdef\csname bbl@hyphendata@\the\language\endcsname
- {{#1}{}}}
-\AddBabelHook{luatex}{loadexceptions}{%
- \input #1\relax
- \def\bbl@tempb##1##2{{##1}{#1}}%
- \expandafter\xdef\csname bbl@hyphendata@\the\language\endcsname
- {\expandafter\expandafter\expandafter\bbl@tempb
- \csname bbl@hyphendata@\the\language\endcsname}}
% \end{macrocode}
%
% \begin{macro}{\babelpatterns}
@@ -12307,15 +13277,13 @@ help from Bernd Raichle, for which I am grateful.
% First, some general code for line breaking, used by
% |\babelposthyphenation|.
%
-% \textit{In progress.} Replace regular (ie, implicit) discretionaries
-% by spaceskips, based on the previous glyph (which I think makes
-% sense, because the hyphen and the previous char go always together).
-% Other discretionaries are not touched.
-%
-% For the moment, only 3 SA languages are activated by default (see
-% Unicode UAX 14).
+% Replace regular (ie, implicit) discretionaries by spaceskips, based
+% on the previous glyph (which I think makes sense, because the hyphen
+% and the previous char go always together). Other discretionaries are
+% not touched. See Unicode UAX 14.
%
% \begin{macrocode}
+% TODO - to a lua file
\directlua{
Babel = Babel or {}
Babel.linebreaking = Babel.linebreaking or {}
@@ -12368,7 +13336,7 @@ help from Bernd Raichle, for which I am grateful.
function Babel.sea_disc_to_space (head)
local sea_ranges = Babel.sea_ranges
local last_char = nil
- local quad = 655360 ^^ 10 pt = 655360 = 10 * 65536
+ local quad = 655360 ^% 10 pt = 655360 = 10 * 65536
for item in node.traverse(head) do
local i = item.id
if i == node.id'glyph' then
@@ -12378,16 +13346,16 @@ help from Bernd Raichle, for which I am grateful.
quad = font.getfont(last_char.font).size
for lg, rg in pairs(sea_ranges) do
if last_char.char > rg[1] and last_char.char < rg[2] then
- lg = lg:sub(1, 4) ^^ Remove trailing number of, eg, Cyrl1
+ lg = lg:sub(1, 4) ^% Remove trailing number of, eg, Cyrl1
local intraspace = Babel.intraspaces[lg]
local intrapenalty = Babel.intrapenalties[lg]
local n
if intrapenalty ~= 0 then
- n = node.new(14, 0) ^^ penalty
+ n = node.new(14, 0) ^% penalty
n.penalty = intrapenalty
node.insert_before(head, item, n)
end
- n = node.new(12, 13) ^^ (glue, spaceskip)
+ n = node.new(12, 13) ^% (glue, spaceskip)
node.setglue(n, intraspace.b * quad,
intraspace.p * quad,
intraspace.m * quad)
@@ -12450,7 +13418,9 @@ help from Bernd Raichle, for which I am grateful.
node.insert_before(head, item, n)
end
- quad = font.getfont(item.font).size
+ if font.getfont(item.font) then
+ quad = font.getfont(item.font).size
+ end
last_class = class
last_lang = lang
else % if penalty, glue or anything else
@@ -12540,9 +13510,6 @@ help from Bernd Raichle, for which I am grateful.
% Common stuff.
%
% \begin{macrocode}
-\AddBabelHook{luatex}{loadkernel}{%
-<@Restore Unicode catcodes before loading patterns@>}
-\ifx\DisableBabelHook\@undefined\endinput\fi
\AddBabelHook{babel-fontspec}{afterextras}{\bbl@switchfont}
\AddBabelHook{babel-fontspec}{beforestart}{\bbl@ckeckstdfonts}
\DisableBabelHook{babel-fontspec}
@@ -12563,8 +13530,10 @@ help from Bernd Raichle, for which I am grateful.
% skipped and discretionaries are handled in a special way.
%
% \begin{macrocode}
+% TODO - to a lua file
\directlua{
Babel.script_blocks = {
+ ['dflt'] = {},
['Arab'] = {{0x0600, 0x06FF}, {0x08A0, 0x08FF}, {0x0750, 0x077F},
{0xFE70, 0xFEFF}, {0xFB50, 0xFDFF}, {0x1EE00, 0x1EEFF}},
['Armn'] = {{0x0530, 0x058F}},
@@ -12712,8 +13681,8 @@ end
\let\bbl@chprop@bmg\bbl@chprop@mirror
\def\bbl@chprop@linebreak#1{%
\directlua{
- Babel.Babel.cjk_characters[\the\count@] = Babel.Babel.cjk_characters[\the\count@] or {}
- Babel.Babel.cjk_characters[\the\count@]['c'] = '#1'
+ Babel.cjk_characters[\the\count@] = Babel.cjk_characters[\the\count@] or {}
+ Babel.cjk_characters[\the\count@]['c'] = '#1'
}}
\let\bbl@chprop@lb\bbl@chprop@linebreak
\def\bbl@chprop@locale#1{%
@@ -12737,7 +13706,7 @@ end
% trying other patterns, and this is very likely the main bottleneck).
%
% |post_hyphenate_replace| is the callback applied after
-% |tex.hyphenate|. This means the automatic hyphenation points are
+% |lang.hyphenate|. This means the automatic hyphenation points are
% known. As empty captures return a byte position (as explained in the
% \luatex{} manual), we must convert it to a utf8 position. With
% |first|, the last byte can be the leading byte in a utf8 sequence, so
@@ -12747,13 +13716,17 @@ end
% to be matched.
%
% \begin{macrocode}
-\begingroup
+\begingroup % TODO - to a lua file
+\catcode`\~=12
\catcode`\#=12
\catcode`\%=12
\catcode`\&=14
\directlua{
Babel.linebreaking.replacements = {}
+ Babel.linebreaking.replacements[0] = {} &% pre
+ Babel.linebreaking.replacements[1] = {} &% post
+ &% Discretionaries contain strings as nodes
function Babel.str_to_nodes(fn, matches, base)
local n, head, last
if fn == nil then return nil end
@@ -12773,22 +13746,88 @@ end
return head
end
- function Babel.fetch_word(head, funct)
+ Babel.fetch_subtext = {}
+
+ &% Merging both functions doesn't seen feasible, because there are too
+ &% many differences.
+ Babel.fetch_subtext[0] = function(head)
local word_string = ''
local word_nodes = {}
local lang
local item = head
+ local inmath = false
while item do
- if item.id == 29
- and not(item.char == 124) &% ie, not |
- and not(item.char == 61) &% ie, not =
- and (item.lang == lang or lang == nil) then
- lang = lang or item.lang
- word_string = word_string .. unicode.utf8.char(item.char)
+ if item.id == 11 then
+ inmath = (item.subtype == 0)
+ end
+
+ if inmath then
+ &% pass
+
+ elseif item.id == 29 then
+ local locale = node.get_attribute(item, Babel.attr_locale)
+
+ if lang == locale or lang == nil then
+ if (item.char ~= 124) then &% ie, not | = space
+ lang = lang or locale
+ word_string = word_string .. unicode.utf8.char(item.char)
+ word_nodes[#word_nodes+1] = item
+ end
+ else
+ break
+ end
+
+ elseif item.id == 12 and item.subtype == 13 then
+ word_string = word_string .. '|'
word_nodes[#word_nodes+1] = item
+ &% Ignore leading unrecognized nodes, too.
+ elseif word_string ~= '' then
+ word_string = word_string .. Babel.us_char
+ word_nodes[#word_nodes+1] = item &% Will be ignored
+ end
+
+ item = item.next
+ end
+
+ &% Here and above we remove some trailing chars but not the
+ &% corresponding nodes. But they aren't accessed.
+ if word_string:sub(-1) == '|' then
+ word_string = word_string:sub(1,-2)
+ end
+ word_string = unicode.utf8.gsub(word_string, Babel.us_char .. '+$', '')
+ return word_string, word_nodes, item, lang
+ end
+
+ Babel.fetch_subtext[1] = function(head)
+ local word_string = ''
+ local word_nodes = {}
+ local lang
+ local item = head
+ local inmath = false
+
+ while item do
+
+ if item.id == 11 then
+ inmath = (item.subtype == 0)
+ end
+
+ if inmath then
+ &% pass
+
+ elseif item.id == 29 then
+ if item.lang == lang or lang == nil then
+ if (item.char ~= 124) and (item.char ~= 61) then &% not =, not |
+ lang = lang or item.lang
+ word_string = word_string .. unicode.utf8.char(item.char)
+ word_nodes[#word_nodes+1] = item
+ end
+ else
+ break
+ end
+
elseif item.id == 7 and item.subtype == 2 then
word_string = word_string .. '='
word_nodes[#word_nodes+1] = item
@@ -12797,130 +13836,230 @@ end
word_string = word_string .. '|'
word_nodes[#word_nodes+1] = item
+ &% (1) Go to next word if nothing was found, and (2) implictly
+ &% remove leading USs.
elseif word_string == '' then
&% pass
- else
- return word_string, word_nodes, item, lang
+ &% This is the responsible for splitting by words.
+ elseif (item.id == 12 and item.subtype == 13) then
+ break
+
+ else
+ word_string = word_string .. Babel.us_char
+ word_nodes[#word_nodes+1] = item &% Will be ignored
end
item = item.next
end
+
+ word_string = unicode.utf8.gsub(word_string, Babel.us_char .. '+$', '')
+ return word_string, word_nodes, item, lang
+ end
+
+ function Babel.pre_hyphenate_replace(head)
+ Babel.hyphenate_replace(head, 0)
end
function Babel.post_hyphenate_replace(head)
+ Babel.hyphenate_replace(head, 1)
+ end
+
+ Babel.us_char = string.char(31)
+
+ function Babel.hyphenate_replace(head, mode)
local u = unicode.utf8
- local lbkr = Babel.linebreaking.replacements
+ local lbkr = Babel.linebreaking.replacements[mode]
+
local word_head = head
- while true do
- local w, wn, nw, lang = Babel.fetch_word(word_head)
- if not lang then return head end
+ while true do &% for each subtext block
- if not lbkr[lang] then
- break
+ local w, wn, nw, lang = Babel.fetch_subtext[mode](word_head)
+
+ if Babel.debug then
+ print()
+ print('@@@@@', w, nw)
end
+ if nw == nil and w == '' then break end
+
+ if not lang then goto next end
+ if not lbkr[lang] then goto next end
+
+ &% For each saved (pre|post)hyphenation. TODO. Reconsider how
+ &% loops are nested.
for k=1, #lbkr[lang] do
local p = lbkr[lang][k].pattern
local r = lbkr[lang][k].replace
+ if Babel.debug then
+ print('=====', p, mode)
+ end
+
+ &% This variable is set in some cases below to the first *byte*
+ &% after the match, either as found by u.match (faster) or the
+ &% computed position based on sc if w has changed.
+ local last_match = 0
+
+ &% For every match.
while true do
- local matches = { u.match(w, p) }
+ if Babel.debug then
+ print('-----')
+ end
+ local new &% used when inserting and removing nodes
+ local refetch = false
+
+ local matches = { u.match(w, p, last_match) }
if #matches < 2 then break end
+ &% Get and remove empty captures (with ()'s, which return a
+ &% number with the position), and keep actual captures
+ &% (from (...)), if any, in matches.
local first = table.remove(matches, 1)
- local last = table.remove(matches, #matches)
+ local last = table.remove(matches, #matches)
+ &% Non re-fetched substrings may contain \31, which separates
+ &% subsubstrings.
+ if string.find(w:sub(first, last-1), Babel.us_char) then break end
- &% Fix offsets, from bytes to unicode.
+ local save_last = last &% with A()BC()D, points to D
+
+ &% Fix offsets, from bytes to unicode. Explained above.
first = u.len(w:sub(1, first-1)) + 1
- last = u.len(w:sub(1, last-1))
+ last = u.len(w:sub(1, last-1)) &% now last points to C
- local new &% used when inserting and removing nodes
- local changed = 0
+ if Babel.debug then
+ print(p)
+ print('', 'sc', 'first', 'last', 'last_m', 'w')
+ end
- &% This loop traverses the replace list and takes the
- &% corresponding actions
- for q = first, last do
- local crep = r[q-first+1]
- local char_node = wn[q]
+ &% This loop traverses the matched substring and takes the
+ &% corresponding action stored in the replacement list.
+ &% sc = the position in substr nodes / string
+ &% rc = the replacement table index
+ local sc = first-1
+ local rc = 0
+ while rc < last-first+1 do &% for each replacement
+ if Babel.debug then
+ print('.....')
+ end
+ sc = sc + 1
+ rc = rc + 1
+ local crep = r[rc]
+ local char_node = wn[sc]
local char_base = char_node
+ local end_replacement = false
if crep and crep.data then
char_base = wn[crep.data+first-1]
end
- if crep == {} then
- break
- elseif crep == nil then
- changed = changed + 1
+ if Babel.debug then
+ print('*', sc, first, last, last_match, w)
+ end
+
+ if crep and next(crep) == nil then &% {}
+ last_match = save_last
+
+ elseif crep == nil then &% remove
node.remove(head, char_node)
- elseif crep and (crep.pre or crep.no or crep.post) then
- changed = changed + 1
- d = node.new(7, 0) &% (disc, discretionary)
- d.pre = Babel.str_to_nodes(crep.pre, matches, char_base)
- d.post = Babel.str_to_nodes(crep.post, matches, char_base)
+ table.remove(wn, sc)
+ w = u.sub(w, 1, sc-1) .. u.sub(w, sc+1)
+ last_match = utf8.offset(w, sc)
+ sc = sc - 1 &% Nothing has been inserted
+
+ elseif mode == 1 and crep and (crep.pre or crep.no or crep.post) then
+ local d = node.new(7, 0) &% (disc, discretionary)
+ d.pre = Babel.str_to_nodes(crep.pre, matches, char_base)
+ d.post = Babel.str_to_nodes(crep.post, matches, char_base)
d.replace = Babel.str_to_nodes(crep.no, matches, char_base)
d.attr = char_base.attr
if crep.pre == nil then &% TeXbook p96
- d.penalty = crep.penalty or tex.hyphenpenalty
+ d.penalty = crep.penalty or tex.hyphenpenalty
else
- d.penalty = crep.penalty or tex.exhyphenpenalty
+ d.penalty = crep.penalty or tex.exhyphenpenalty
end
head, new = node.insert_before(head, char_node, d)
- node.remove(head, char_node)
- if q == 1 then
- word_head = new
- end
+ end_replacement = true
+
+ elseif crep and crep.penalty then
+ local d = node.new(14, 0) &% (penalty, userpenalty)
+ d.attr = char_base.attr
+ d.penalty = crep.penalty
+ head, new = node.insert_before(head, char_node, d)
+ end_replacement = true
+
elseif crep and crep.string then
- changed = changed + 1
local str = crep.string(matches)
- if str == '' then
- if q == 1 then
+ if str == '' then &% Gather with nil
+ refetch = true
+ if sc == 1 then
word_head = char_node.next
end
head, new = node.remove(head, char_node)
elseif char_node.id == 29 and u.len(str) == 1 then
char_node.char = string.utfvalue(str)
- else
+ w = u.sub(w, 1, sc-1) .. str .. u.sub(w, sc+1)
+ last_match = utf8.offset(w, sc+1)
+ else
+ refetch = true
local n
for s in string.utfvalues(str) do
if char_node.id == 7 then
- log('Automatic hyphens cannot be replaced, just removed.')
+ &% TODO. Remove this limitation.
+ texio.write_nl('Automatic hyphens cannot be replaced, just removed.')
else
n = node.copy(char_base)
end
n.char = s
- if q == 1 then
- head, new = node.insert_before(head, char_node, n)
+ if sc == 1 then
+ head, new = node.insert_before(head, char_node, n)
word_head = new
else
- node.insert_before(head, char_node, n)
+ node.insert_before(head, char_node, n)
end
end
-
node.remove(head, char_node)
end &% string length
- end &% if char and char.string
- end &% for char in match
- if changed > 20 then
- texio.write('Too many changes. Ignoring the rest.')
- elseif changed > 0 then
- w, wn, nw = Babel.fetch_word(word_head)
+ end &% if char and char.string (ie replacement cases)
+
+ &% Shared by disc and penalty.
+ if end_replacement then
+ if sc == 1 then
+ word_head = new
+ end
+ if crep.insert then
+ last_match = save_last
+ else
+ node.remove(head, char_node)
+ w = u.sub(w, 1, sc-1) .. Babel.us_char .. u.sub(w, sc+1)
+ last_match = utf8.offset(w, sc)
+ end
+ end
+ end &% for each replacement
+
+ if Babel.debug then
+ print('/', sc, first, last, last_match, w)
end
+ &% TODO. refetch will be eventually unnecesary.
+ if refetch then
+ w, wn, nw, lang = Babel.fetch_subtext[mode](word_head)
+ end
+
end &% for match
end &% for patterns
+
+ ::next::
word_head = nw
- end &% for words
+ end &% for substring
return head
end
- &% The following functions belong to the next macro
-
&% This table stores capture maps, numbered consecutively
Babel.capture_maps = {}
+ &% The following functions belong to the next macro
function Babel.capture_func(key, cap)
local ret = "[[" .. cap:gsub('{([0-9])}', "]]..m[%1]..[[") .. "]]"
ret = ret:gsub('{([0-9])|([^|]+)|(.-)}', Babel.capture_func_map)
@@ -12949,7 +14088,6 @@ end
return "]]..Babel.capt_map(m[" .. capno .. "]," ..
(mlen) .. ").." .. "[["
end
-
}
% \end{macrocode}
%
@@ -12978,21 +14116,24 @@ end
\bbl@ifsamestring{##1}{remove}&%
{\bbl@add@list\babeltempb{nil}}&%
{\directlua{
- local rep = [[##1]]
+ local rep = [[##1]]
+ rep = rep:gsub('^%s*(insert)%s*,', 'insert = true, ')
rep = rep:gsub( '(no)%s*=%s*([^%s,]*)', Babel.capture_func)
rep = rep:gsub( '(pre)%s*=%s*([^%s,]*)', Babel.capture_func)
rep = rep:gsub( '(post)%s*=%s*([^%s,]*)', Babel.capture_func)
- rep = rep:gsub('(string)%s*=%s*([^%s,]*)', Babel.capture_func)
+ rep = rep:gsub('(string)%s*=%s*([^%s,]*)', Babel.capture_func)
tex.print([[\string\babeltempa{{]] .. rep .. [[}}]])
}}}&%
\directlua{
- local lbkr = Babel.linebreaking.replacements
+ local lbkr = Babel.linebreaking.replacements[1]
local u = unicode.utf8
&% Convert pattern:
- local patt = string.gsub([[#2]], '%s', '')
+ local patt = string.gsub([==[#2]==], '%s', '')
if not u.find(patt, '()', nil, true) then
patt = '()' .. patt .. '()'
end
+ patt = string.gsub(patt, '%(%)%^', '^()')
+ patt = string.gsub(patt, '%$%(%)', '()$')
patt = u.gsub(patt, '{(.)}',
function (n)
return '%' .. (tonumber(n) and (tonumber(n)+1) or n)
@@ -13002,18 +14143,55 @@ end
{ pattern = patt, replace = { \babeltempb } })
}&%
\endgroup}
+% TODO. Copypaste pattern.
+\gdef\babelprehyphenation#1#2#3{&%
+ \bbl@activateprehyphen
+ \begingroup
+ \def\babeltempa{\bbl@add@list\babeltempb}&%
+ \let\babeltempb\@empty
+ \bbl@foreach{#3}{&%
+ \bbl@ifsamestring{##1}{remove}&%
+ {\bbl@add@list\babeltempb{nil}}&%
+ {\directlua{
+ local rep = [[##1]]
+ rep = rep:gsub('^%s*(insert)%s*,', 'insert = true, ')
+ rep = rep:gsub('(string)%s*=%s*([^%s,]*)', Babel.capture_func)
+ tex.print([[\string\babeltempa{{]] .. rep .. [[}}]])
+ }}}&%
+ \directlua{
+ local lbkr = Babel.linebreaking.replacements[0]
+ local u = unicode.utf8
+ &% Convert pattern:
+ local patt = string.gsub([==[#2]==], '%s', '')
+ if not u.find(patt, '()', nil, true) then
+ patt = '()' .. patt .. '()'
+ end
+ &% patt = string.gsub(patt, '%(%)%^', '^()')
+ &% patt = string.gsub(patt, '([^%%])%$%(%)', '%1()$')
+ patt = u.gsub(patt, '{(.)}',
+ function (n)
+ return '%' .. (tonumber(n) and (tonumber(n)+1) or n)
+ end)
+ lbkr[\the\csname bbl@id@@#1\endcsname] = lbkr[\the\csname bbl@id@@#1\endcsname] or {}
+ table.insert(lbkr[\the\csname bbl@id@@#1\endcsname],
+ { pattern = patt, replace = { \babeltempb } })
+ }&%
+ \endgroup}
\endgroup
\def\bbl@activateposthyphen{%
\let\bbl@activateposthyphen\relax
\directlua{
Babel.linebreaking.add_after(Babel.post_hyphenate_replace)
}}
+\def\bbl@activateprehyphen{%
+ \let\bbl@activateprehyphen\relax
+ \directlua{
+ Babel.linebreaking.add_before(Babel.pre_hyphenate_replace)
+ }}
% \end{macrocode}
%
% \subsection{Layout}
%
-% \textbf{Work in progress}.
-%
% Unlike \xetex{}, \luatex{} requires only minimal changes for
% right-to-left layouts, particularly in monolingual documents (the
% engine itself reverses boxes -- including column order or headings
@@ -13045,7 +14223,7 @@ end
\fi
\fi
\ifx\bbl@opt@layout\@nnil\endinput\fi % if no layout
-\ifx\bbl@beforeforeign\leavevmode % A poor test for bidi=
+\ifnum\bbl@bidimode>\z@
\def\bbl@nextfake#1{% non-local changes, use always inside a group!
\bbl@exp{%
\mathdir\the\bodydir
@@ -13094,25 +14272,23 @@ end
{}
\IfBabelLayout{graphics}
{\let\bbl@pictresetdir\relax
- \def\bbl@pictsetdir{%
+ \def\bbl@pictsetdir#1{%
\ifcase\bbl@thetextdir
\let\bbl@pictresetdir\relax
\else
- \textdir TLT\relax
- \def\bbl@pictresetdir{\textdir TRT\relax}%
+ \bodydir TLT
+ % \(text|par)dir required in pgf:
+ \def\bbl@pictresetdir{\bodydir TRT\pardir TRT\textdir TRT\relax}%
\fi}%
- \let\bbl@OL@@picture\@picture
- \let\bbl@OL@put\put
- \bbl@sreplace\@picture{\hskip-}{\bbl@pictsetdir\hskip-}%
- \def\put(#1,#2)#3{% Not easy to patch. Better redefine.
- \@killglue
- \raise#2\unitlength
- \hb@xt@\z@{\kern#1\unitlength{\bbl@pictresetdir#3}\hss}}%
+ \ifx\AddToHook\@undefined\else
+ \AddToHook{env/picture/begin}{\bbl@pictsetdir\z@}%
+ \fi
\AtBeginDocument
{\ifx\tikz@atbegin@node\@undefined\else
\let\bbl@OL@pgfpicture\pgfpicture
- \bbl@sreplace\pgfpicture{\pgfpicturetrue}{\bbl@pictsetdir\pgfpicturetrue}%
- \bbl@add\pgfsys@beginpicture{\bbl@pictsetdir}%
+ \bbl@sreplace\pgfpicture{\pgfpicturetrue}%
+ {\bbl@pictsetdir\@ne\pgfpicturetrue}%
+ \bbl@add\pgfsys@beginpicture{\bbl@pictsetdir\@ne}%
\bbl@add\tikz@atbegin@node{\bbl@pictresetdir}%
\fi}}
{}
@@ -19819,7 +20995,13 @@ function Babel.bidi(head, ispar, hdir)
first_et = nil
has_en = false
end
-
+
+ -- Force mathdir in math if ON (currently works as expected only
+ -- with 'l')
+ if inmath and d == 'on' then
+ d = ('TRT' == tex.mathdir) and 'r' or 'l'
+ end
+
if d then
if d == 'al' then
d = 'r'
@@ -20306,32 +21488,33 @@ Babel.cjk_breaks = {
% \section{Support for Plain \TeX\ (\texttt{plain.def})}
%
% \subsection{Not renaming \file{hyphen.tex}}
-% As Don Knuth has declared that the filename \file{hyphen.tex} may
-% only be used to designate \emph{his} version of the american
-% English hyphenation patterns, a new solution has to be found in
-% order to be able to load hyphenation patterns for other languages
-% in a plain-based \TeX-format.
-% When asked he responded:
-% \begin{quote}
-% That file name is ``sacred'', and if anybody changes it they will
-% cause severe upward/downward compatibility headaches.
-%
-% People can have a file localhyphen.tex or whatever they like,
-% but they mustn't diddle with hyphen.tex (or plain.tex except to
-% preload additional fonts).
-% \end{quote}
-%
-% The files \file{bplain.tex} and \file{blplain.tex} can be used as
-% replacement wrappers around \file{plain.tex} and
-% \file{lplain.tex} to acheive the desired effect, based on the
-% \pkg{babel} package. If you load each of them with ini\TeX, you
-% will get a file called either \file{bplain.fmt} or
-% \file{blplain.fmt}, which you can use as replacements for
-% \file{plain.fmt} and \file{lplain.fmt}.
-%
-% As these files are going to be read as the first thing ini\TeX\
-% sees, we need to set some category codes just to be able to
-% change the definition of |\input|
+%
+% As Don Knuth has declared that the filename \file{hyphen.tex} may
+% only be used to designate \emph{his} version of the american
+% English hyphenation patterns, a new solution has to be found in
+% order to be able to load hyphenation patterns for other languages
+% in a plain-based \TeX-format.
+% When asked he responded:
+% \begin{quote}
+% That file name is ``sacred'', and if anybody changes it they will
+% cause severe upward/downward compatibility headaches.
+%
+% People can have a file localhyphen.tex or whatever they like,
+% but they mustn't diddle with hyphen.tex (or plain.tex except to
+% preload additional fonts).
+% \end{quote}
+%
+% The files \file{bplain.tex} and \file{blplain.tex} can be used as
+% replacement wrappers around \file{plain.tex} and
+% \file{lplain.tex} to achieve the desired effect, based on the
+% \pkg{babel} package. If you load each of them with ini\TeX, you
+% will get a file called either \file{bplain.fmt} or
+% \file{blplain.fmt}, which you can use as replacements for
+% \file{plain.fmt} and \file{lplain.fmt}.
+%
+% As these files are going to be read as the first thing ini\TeX\
+% sees, we need to set some category codes just to be able to
+% change the definition of |\input|.
%
% \begin{macrocode}
%<*bplain|blplain>
@@ -20340,81 +21523,63 @@ Babel.cjk_breaks = {
\catcode`\#=6 % hash mark is macro parameter character
% \end{macrocode}
%
-% Now let's see if a file called \file{hyphen.cfg} can be found
-% somewhere on \TeX's input path by trying to open it for
-% reading...
+% If a file called \file{hyphen.cfg} can be found, we make sure that
+% \emph{it} will be read instead of the file \file{hyphen.tex}. We
+% do this by first saving the original meaning of |\input| (and I
+% use a one letter control sequence for that so as not to waste
+% multi-letter control sequence on this in the format).
%
% \begin{macrocode}
\openin 0 hyphen.cfg
-% \end{macrocode}
-%
-% If the file wasn't found the following test turns out true.
-%
-% \begin{macrocode}
\ifeof0
\else
-% \end{macrocode}
-%
-% When \file{hyphen.cfg} could be opened we make sure that
-% \emph{it} will be read instead of the file \file{hyphen.tex}
-% which should (according to Don Knuth's ruling) contain the
-% american English hyphenation patterns and nothing else.
-%
-% We do this by first saving the original meaning of |\input| (and
-% I use a one letter control sequence for that so as not to waste
-% multi-letter control sequence on this in the format).
-%
-% \begin{macrocode}
\let\a\input
% \end{macrocode}
%
-% Then |\input| is defined to forget about its argument and load
-% \file{hyphen.cfg} instead.
+% Then |\input| is defined to forget about its argument and load
+% \file{hyphen.cfg} instead. Once that's done the original meaning
+% of |\input| can be restored and the definition of |\a| can be
+% forgotten.
%
% \begin{macrocode}
\def\input #1 {%
\let\input\a
\a hyphen.cfg
-% \end{macrocode}
-%
-% Once that's done the original meaning of |\input| can be restored
-% and the definition of |\a| can be forgotten.
-%
-% \begin{macrocode}
\let\a\undefined
}
\fi
%</bplain|blplain>
% \end{macrocode}
%
-% Now that we have made sure that \file{hyphen.cfg} will be loaded
-% at the right moment it is time to load \file{plain.tex}.
+% Now that we have made sure that \file{hyphen.cfg} will be loaded
+% at the right moment it is time to load \file{plain.tex}.
%
% \begin{macrocode}
%<bplain>\a plain.tex
%<blplain>\a lplain.tex
% \end{macrocode}
%
-% Finally we change the contents of |\fmtname| to indicate that
-% this is \emph{not} the plain format, but a format based on plain
-% with the \pkg{babel} package preloaded.
+% Finally we change the contents of |\fmtname| to indicate that
+% this is \emph{not} the plain format, but a format based on plain
+% with the \pkg{babel} package preloaded.
%
% \begin{macrocode}
%<bplain>\def\fmtname{babel-plain}
%<blplain>\def\fmtname{babel-lplain}
% \end{macrocode}
%
-% When you are using a different format, based on plain.tex you can
-% make a copy of blplain.tex, rename it and replace \file{plain.tex}
-% with the name of your format file.
+% When you are using a different format, based on plain.tex you can
+% make a copy of blplain.tex, rename it and replace \file{plain.tex}
+% with the name of your format file.
%
% \subsection{Emulating some \LaTeX{} features}
%
-% The following code duplicates or emulates parts of \LaTeXe\ that
-% are needed for \babel.
+% The following code duplicates or emulates parts of \LaTeXe\ that
+% are needed for \babel.
%
% \begin{macrocode}
-%<*plain>
+%<<*Emulate LaTeX>>
+ % == Code for plain ==
\def\@empty{}
\def\loadlocalcfg#1{%
\openin0#1.cfg
@@ -20471,6 +21636,7 @@ Babel.cjk_breaks = {
#1%
\ifx#2\@empty\else\expandafter\zap@space\fi
#2}
+\let\bbl@trace\@gobble
% \end{macrocode}
%
% \LaTeXe\ has the command |\@onlypreamble| which adds commands to
@@ -20521,13 +21687,17 @@ Babel.cjk_breaks = {
% \end{macrocode}
%
% \LaTeX\ needs to be able to switch off writing to its auxiliary
-% files; plain doesn't have them by default.
+% files; plain doesn't have them by default. There is a trick to
+% hide some conditional commands from the outer |\ifx|. The same
+% trick is applied below.
%
% \begin{macrocode}
-\ifx\if@filesw\@undefined
+\catcode`\&=\z@
+\ifx&if@filesw\@undefined
\expandafter\let\csname if@filesw\expandafter\endcsname
\csname iffalse\endcsname
\fi
+\catcode`\&=4
% \end{macrocode}
%
% Mimick \LaTeX's commands to define control sequences.
@@ -20594,9 +21764,8 @@ Babel.cjk_breaks = {
\@x@protect#1%
\fi
}
-\def\@x@protect#1\fi#2#3{%
- \fi\protect#1%
-}
+\catcode`\&=\z@ % Trick to hide conditionals
+ \def\@x@protect#1&fi#2#3{&fi\protect#1}
% \end{macrocode}
%
% The following little macro |\in@| is taken from \file{latex.ltx};
@@ -20606,7 +21775,8 @@ Babel.cjk_breaks = {
% construct with the temporary definition of |\bbl@tempa|.
%
% \begin{macrocode}
-\def\bbl@tempa{\csname newif\endcsname\ifin@}
+ \def\bbl@tempa{\csname newif\endcsname&ifin@}
+\catcode`\&=4
\ifx\in@\@undefined
\def\in@#1#2{%
\def\in@@##1#1##2##3\in@@{%
@@ -20809,27 +21979,9 @@ Babel.cjk_breaks = {
}%
}
%
-\def\UseTextSymbol#1#2{%
-% \let\@curr@enc\cf@encoding
-% \@use@text@encoding{#1}%
- #2%
-% \@use@text@encoding\@curr@enc
-}
-\def\UseTextAccent#1#2#3{%
-% \let\@curr@enc\cf@encoding
-% \@use@text@encoding{#1}%
-% #2{\@use@text@encoding\@curr@enc\selectfont#3}%
-% \@use@text@encoding\@curr@enc
-}
-\def\@use@text@encoding#1{%
-% \edef\f@encoding{#1}%
-% \xdef\font@name{%
-% \csname\curr@fontshape/\f@size\endcsname
-% }%
-% \pickup@font
-% \font@name
-% \@@enc@update
-}
+\def\UseTextSymbol#1#2{#2}
+\def\UseTextAccent#1#2#3{}
+\def\@use@text@encoding#1{}
\def\DeclareTextSymbolDefault#1#2{%
\DeclareTextCommandDefault#1{\UseTextSymbol{#2}#1}%
}
@@ -20872,6 +22024,14 @@ Babel.cjk_breaks = {
\ifx\scriptsize\@undefined
\let\scriptsize\sevenrm
\fi
+ % End of code for plain
+%<</Emulate LaTeX>>
+% \end{macrocode}
+%
+% A proxy file:
+% \begin{macrocode}
+%<*plain>
+\input babel.def
%</plain>
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/babel/babel.ins b/Master/texmf-dist/source/latex/babel/babel.ins
index 194f706e249..cd1597a837a 100644
--- a/Master/texmf-dist/source/latex/babel/babel.ins
+++ b/Master/texmf-dist/source/latex/babel/babel.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 2012-2020 Javier Bezos and Johannes L. Braams.
+%% Copyright 2012-2021 Javier Bezos and Johannes L. Braams.
%% Copyright 1989-2008 Johannes L. Braams and any individual authors
%% listed elsewhere in this file. All rights reserved.
%%
@@ -26,7 +26,7 @@
%% and covered by LPPL is defined by the unpacking scripts (with
%% extension .ins) which are part of the distribution.
%%
-\def\filedate{2020/03/22}
+\def\filedate{2021/01/26}
\def\batchfile{babel.ins}
\input docstrip.tex
@@ -127,7 +127,7 @@
\savingtrue
\generate{\usepreamble\empty
\usepostamble\empty
- \file{babel.log}{\from{babel.dtx}{dummy}}}
+ \file{dummy.log}{\from{babel.dtx}{dummy}}}
\savingfalse
\generate{\file{babel.sty}{\from{babel.dtx}{package}}
diff --git a/Master/texmf-dist/source/latex/babel/bbcompat.dtx b/Master/texmf-dist/source/latex/babel/bbcompat.dtx
index 0e831a596e2..84c388a78cc 100644
--- a/Master/texmf-dist/source/latex/babel/bbcompat.dtx
+++ b/Master/texmf-dist/source/latex/babel/bbcompat.dtx
@@ -30,7 +30,7 @@
%
% \iffalse
%<*dtx>
-\ProvidesFile{bbcompat.dtx}[2020/03/22 v3.42]
+\ProvidesFile{bbcompat.dtx}[2021/01/26 v3.53]
%</dtx>
%
%% File 'bbcompat.dtx'
diff --git a/Master/texmf-dist/source/latex/babel/locale.zip b/Master/texmf-dist/source/latex/babel/locale.zip
index 8d6f685275a..a04b7bdfeb7 100644
--- a/Master/texmf-dist/source/latex/babel/locale.zip
+++ b/Master/texmf-dist/source/latex/babel/locale.zip
Binary files differ
diff --git a/Master/texmf-dist/source/latex/base/classes.dtx b/Master/texmf-dist/source/latex/base/classes.dtx
index ea3b014c897..d6f2bb64e6a 100644
--- a/Master/texmf-dist/source/latex/base/classes.dtx
+++ b/Master/texmf-dist/source/latex/base/classes.dtx
@@ -53,7 +53,7 @@
%<*driver>
\ProvidesFile{classes.drv}
%</driver>
- [2019/12/20 v1.4l
+ [2020/04/10 v1.4m
%<article|report|book> Standard LaTeX document class]
%<10pt|11pt|12pt> Standard LaTeX file (size option)]
% \end{macrocode}
@@ -214,6 +214,7 @@
% options that are new in \LaTeXe.}
% \changes{v1.3v}{1997/06/16}{Documentation fixes.}
% \changes{v1.4j}{2019/08/27}{Various commands made robust}
+% \changes{v1.4m}{2020/04/10}{(JLB) prettyprinting the code}
%
%
% \title{Standard Document Classes for \LaTeX{} version 2e\thanks{This
@@ -221,7 +222,7 @@
%
% \author{%
% Copyright (C) 1992 by Leslie Lamport \and
-% Copyright (C) 1994-2019 by Frank Mittelbach \and Johannes Braams \and
+% Copyright (C) 1994-2020 by Frank Mittelbach \and Johannes Braams \and
% \LaTeX3 Project Team
% }
% \date{\filedate}
@@ -322,34 +323,34 @@
% \changes{v1.0g}{1993/12/09}{Removed typo, A4 is not 279 mm high}
% \begin{macrocode}
\if@compatibility\else
-\DeclareOption{a4paper}
- {\setlength\paperheight {297mm}%
- \setlength\paperwidth {210mm}}
-\DeclareOption{a5paper}
- {\setlength\paperheight {210mm}%
- \setlength\paperwidth {148mm}}
-\DeclareOption{b5paper}
- {\setlength\paperheight {250mm}%
- \setlength\paperwidth {176mm}}
-\DeclareOption{letterpaper}
- {\setlength\paperheight {11in}%
- \setlength\paperwidth {8.5in}}
-\DeclareOption{legalpaper}
- {\setlength\paperheight {14in}%
- \setlength\paperwidth {8.5in}}
-\DeclareOption{executivepaper}
- {\setlength\paperheight {10.5in}%
- \setlength\paperwidth {7.25in}}
+ \DeclareOption{a4paper}
+ {\setlength\paperheight {297mm}%
+ \setlength\paperwidth {210mm}}
+ \DeclareOption{a5paper}
+ {\setlength\paperheight {210mm}%
+ \setlength\paperwidth {148mm}}
+ \DeclareOption{b5paper}
+ {\setlength\paperheight {250mm}%
+ \setlength\paperwidth {176mm}}
+ \DeclareOption{letterpaper}
+ {\setlength\paperheight {11in}%
+ \setlength\paperwidth {8.5in}}
+ \DeclareOption{legalpaper}
+ {\setlength\paperheight {14in}%
+ \setlength\paperwidth {8.5in}}
+ \DeclareOption{executivepaper}
+ {\setlength\paperheight {10.5in}%
+ \setlength\paperwidth {7.25in}}
% \end{macrocode}
%
% The option \Lopt{landscape} switches the values of |\paperheight|
% and |\paperwidth|, assuming the dimensions were given for portrait
% paper.
% \begin{macrocode}
-\DeclareOption{landscape}
- {\setlength\@tempdima {\paperheight}%
- \setlength\paperheight {\paperwidth}%
- \setlength\paperwidth {\@tempdima}}
+ \DeclareOption{landscape}
+ {\setlength\@tempdima {\paperheight}%
+ \setlength\paperheight {\paperwidth}%
+ \setlength\paperwidth {\@tempdima}}
\fi
% \end{macrocode}
%
@@ -368,7 +369,7 @@
\if@compatibility
\renewcommand\@ptsize{0}
\else
-\DeclareOption{10pt}{\renewcommand\@ptsize{0}}
+ \DeclareOption{10pt}{\renewcommand\@ptsize{0}}
\fi
\DeclareOption{11pt}{\renewcommand\@ptsize{1}}
\DeclareOption{12pt}{\renewcommand\@ptsize{2}}
@@ -382,7 +383,7 @@
% paragraphs into the outside margin.
% \begin{macrocode}
\if@compatibility\else
-\DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse}
+ \DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse}
\fi
\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue}
% \end{macrocode}
@@ -395,7 +396,7 @@
% \begin{macrocode}
\DeclareOption{draft}{\setlength\overfullrule{5pt}}
\if@compatibility\else
-\DeclareOption{final}{\setlength\overfullrule{0pt}}
+ \DeclareOption{final}{\setlength\overfullrule{0pt}}
\fi
% \end{macrocode}
%
@@ -405,7 +406,7 @@
% \begin{macrocode}
\DeclareOption{titlepage}{\@titlepagetrue}
\if@compatibility\else
-\DeclareOption{notitlepage}{\@titlepagefalse}
+ \DeclareOption{notitlepage}{\@titlepagefalse}
\fi
% \end{macrocode}
%
@@ -427,7 +428,7 @@
% Two-column and one-column printing is again realized via a switch.
% \begin{macrocode}
\if@compatibility\else
-\DeclareOption{onecolumn}{\@twocolumnfalse}
+ \DeclareOption{onecolumn}{\@twocolumnfalse}
\fi
\DeclareOption{twocolumn}{\@twocolumntrue}
% \end{macrocode}
@@ -468,7 +469,7 @@
% First some hook into the bibliography environment is filled.
% \begin{macrocode}
\AtEndOfPackage{%
- \renewcommand\@openbib@code{%
+ \renewcommand\@openbib@code{%
\advance\leftmargin\bibindent
\itemindent -\bibindent
\listparindent \itemindent
@@ -477,7 +478,7 @@
% \end{macrocode}
% In addition the definition of |\newblock| is overwritten.
% \begin{macrocode}
- \renewcommand\newblock{\par}}%
+ \renewcommand\newblock{\par}}%
}
% \end{macrocode}
%
@@ -950,7 +951,7 @@
% |\topskip|.
% \begin{macrocode}
\if@compatibility \setlength\maxdepth{4\p@} \else
-\setlength\maxdepth{.5\topskip} \fi
+ \setlength\maxdepth{.5\topskip} \fi
% \end{macrocode}
% \end{macro}
%
@@ -1106,7 +1107,7 @@
% between two marginal notes is controlled by |\marginparpush|.
% \begin{macrocode}
\if@twocolumn
- \setlength\marginparsep {10\p@}
+ \setlength\marginparsep {10\p@}
\else
%<10pt&!bk> \setlength\marginparsep{11\p@}
%<11pt&!bk> \setlength\marginparsep{10\p@}
@@ -1801,7 +1802,7 @@
% \changes{v1.3o}{1995/11/02}{(CAR) Make \cs{footnote} always work in
% title, etc}
% \begin{macrocode}
- \if@titlepage
+\if@titlepage
\newcommand\maketitle{\begin{titlepage}%
\let\footnotesize\small
\let\footnoterule\relax
@@ -1867,7 +1868,7 @@
\global\let\author\relax
\global\let\date\relax
\global\let\and\relax
-}
+ }
% \end{macrocode}
% When the title is not on a page of its own, the layout of the
% title is a little different. We use symbols to mark the footnotes
@@ -1884,12 +1885,12 @@
% \cs{@makefntext} to a) work and b) without using math}
% \begin{macrocode}
\else
-\newcommand\maketitle{\par
- \begingroup
- \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
- \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}%
- \long\def\@makefntext##1{\parindent 1em\noindent
- \hb@xt@1.8em{%
+ \newcommand\maketitle{\par
+ \begingroup
+ \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
+ \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}%
+ \long\def\@makefntext##1{\parindent 1em\noindent
+ \hb@xt@1.8em{%
\hss\@textsuperscript{\normalfont\@thefnmark}}##1}%
% \end{macrocode}
% If this is a twocolumn document we start a new page in twocolumn
@@ -1899,27 +1900,27 @@
% \changes{v1.2k}{1994/05/06}{Added check on number of columns in use
% locally}
% \begin{macrocode}
- \if@twocolumn
- \ifnum \col@number=\@ne
- \@maketitle
+ \if@twocolumn
+ \ifnum \col@number=\@ne
+ \@maketitle
+ \else
+ \twocolumn[\@maketitle]%
+ \fi
\else
- \twocolumn[\@maketitle]%
- \fi
- \else
% \end{macrocode}
% When this is not a twocolumn document we just start a new page,
% prevent floating objects from appearing on the top of this page
% and print the title information.
% \begin{macrocode}
\newpage
- \global\@topnum\z@ % Prevents figures from going at top of page.
- \@maketitle
- \fi
+ \global\@topnum\z@ % Prevents figures from going at top of page.
+ \@maketitle
+ \fi
% \end{macrocode}
% This page gets a \pstyle{plain} layout. We call |\@thanks| to
% produce the footnotes.
% \begin{macrocode}
- \thispagestyle{plain}\@thanks
+ \thispagestyle{plain}\@thanks
% \end{macrocode}
% Now we can close the group, reset the \Lcount{footnote} counter,
% disable |\thanks|, |\maketitle| and |\@maketitle| and save some
@@ -1928,20 +1929,20 @@
% \changes{v1.3k}{1995/08/27}{Disable \cs{title} and similar decls}
% \changes{v1.3n}{1995/10/29}{Empty \cs{@date} as well}
% \begin{macrocode}
- \endgroup
- \setcounter{footnote}{0}%
- \global\let\thanks\relax
- \global\let\maketitle\relax
- \global\let\@maketitle\relax
- \global\let\@thanks\@empty
- \global\let\@author\@empty
- \global\let\@date\@empty
- \global\let\@title\@empty
- \global\let\title\relax
- \global\let\author\relax
- \global\let\date\relax
- \global\let\and\relax
-}
+ \endgroup
+ \setcounter{footnote}{0}%
+ \global\let\thanks\relax
+ \global\let\maketitle\relax
+ \global\let\@maketitle\relax
+ \global\let\@thanks\@empty
+ \global\let\@author\@empty
+ \global\let\@date\@empty
+ \global\let\@title\@empty
+ \global\let\title\relax
+ \global\let\author\relax
+ \global\let\date\relax
+ \global\let\and\relax
+ }
% \end{macrocode}
% \end{macro}
%
@@ -3144,7 +3145,7 @@
% First we do give the definition for compatibility mode.
% \begin{macrocode}
\if@compatibility
-\newenvironment{titlepage}
+ \newenvironment{titlepage}
{%
%<book> \cleardoublepage
\if@twocolumn
@@ -3162,7 +3163,7 @@
% And here is the one for native \LaTeXe{}.
% \begin{macrocode}
\else
-\newenvironment{titlepage}
+ \newenvironment{titlepage}
{%
%<book> \cleardoublepage
\if@twocolumn
diff --git a/Master/texmf-dist/source/latex/base/doc.dtx b/Master/texmf-dist/source/latex/base/doc.dtx
index 1341f56b8b2..7e7817153c8 100644
--- a/Master/texmf-dist/source/latex/base/doc.dtx
+++ b/Master/texmf-dist/source/latex/base/doc.dtx
@@ -35,7 +35,7 @@
%<+package|shortvrb>\NeedsTeXFormat{LaTeX2e}[1994/12/01]
%<+package> \ProvidesPackage{doc}
%<+shortvrb>\ProvidesPackage{shortvrb}
-%<+package|shortvrb> [2019/12/16 v2.1l
+%<+package|shortvrb> [2020/06/15 v2.1m
%<+package|shortvrb> Standard LaTeX documentation package (FMi)]
%\catcode`\<=12
%
@@ -132,14 +132,14 @@
% \setcounter{StandardModuleDepth}{1}
%
% {\catcode`\p=12 \catcode`\t=12 ^^A hack used later on to print
-% \gdef\dimenvalue#1pt{$#1$pt}} ^^A a register value with a - sign
+% \gdef\dimenvalue#1pt{$#1$pt}} ^^A register values with a - sign
%
% \newcommand{\DOC}{\texttt{doc}}
%
% \changes{v1.9t}{1995/05/11}{Use \cs{GetFileInfo}}
% \GetFileInfo{doc.sty}
%
-% \CheckSum{2208} ^^A % keep the checksum in this file
+% \CheckSum{2213} ^^A % keep the checksum in this file
%
% \title{The \DOC{} and \texttt{shortvrb} Packages\thanks
% {This file has version number \fileversion{} dated \filedate{}.}}
@@ -1324,6 +1324,16 @@
\if@inlabel\leavevmode\fi
\trivlist \parskip \z@ \item[]%
% \end{macrocode}
+% The \cs{item} command sets the \cs{@labels} box but that box is
+% never typeset (as \cs{everypar} that normally does this gets
+% redefined later). That is normally not an issue, but produces a
+% problem when typesetting in mixed directions, (e.g., in
+% Japanese), so we explicitly clear it for that use case.
+% \changes{v2.1m}{2020/06/15}{Void \cs{@labels} for vertical
+% typesetting (gh/344)}
+% \begin{macrocode}
+ \global\setbox\@labels\box\voidb@x
+% \end{macrocode}
% Additionally, everything should be set in \texttt{typewriter} font.
% Some people might prefer it somewhat differently; because of this
% the font choice is
@@ -1448,7 +1458,8 @@
% bothered since doc-sources should be up-to-date but since the
% request came from someone called David Carlisle \ldots :-)
% \changes{v1.9y}{1996/01/26}{Support compat mode}
-% \changes{v2.1l}{2019/12/16}{Use \cs{shapedefault} not \cs{updefault} for extended NFSS}
+% \changes{v2.1l}{2019/12/16}{Use \cs{shapedefault} not
+% \cs{updefault} for extended NFSS}
% \begin{macrocode}
\def\MacroFont{\small
\usefont\encodingdefault
diff --git a/Master/texmf-dist/source/latex/base/docstrip.dtx b/Master/texmf-dist/source/latex/base/docstrip.dtx
index 9cc7945d602..a0a06311edb 100644
--- a/Master/texmf-dist/source/latex/base/docstrip.dtx
+++ b/Master/texmf-dist/source/latex/base/docstrip.dtx
@@ -29,9 +29,9 @@
\catcode`\{=1
\catcode`\}=2
\def\filename{docstrip.dtx}
-\def\fileversion{2.5g}
-\def\filedate{2018/05/03}
-\def\docdate {2018/05/03}
+\def\fileversion{v2.6a}
+\def\filedate{2020-07-07}
+\def\docdate {2020-07-11}
%%
%
%\iffalse
@@ -42,7 +42,7 @@
%% Frank Mittelbach
%% Copyright (C) 1995 Marcin Woli\'nski
%% Copyright (C) 1996-1997 Mark Wooding, Marcin Woli\'nski
-%% Copyright (C) 1998-2003 LaTeX3 project and the above authors
+%% Copyright (C) 1998-2020 LaTeX3 project and the above authors
%% All rights are reserved.
%%
%
@@ -82,6 +82,8 @@
% \changes{2.3e}{1996/10/02}{Introduced ``open lists''}
% \changes{2.4a}{1996/06/06}{Add stream limits (MDW)}
% \changes{2.4c}{1996/06/11}{Add initex support (DPC)}
+% \changes{v2.6a}{2020-07-07}{Added the handling of @@-modules from
+% \texttt{l3docstrip.dtx} (gh/337)}
%
% \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ }
% \DoNotIndex{\@ne}
@@ -785,6 +787,57 @@
% When a block of code is {\em not\/} included, any guards that occur
% within that block are {\em not\/} evaluated.
%
+% \section{Internal functions and variables}
+%
+% An important consideration for \LaTeX3 development is separating
+% out public and internal functions. Functions and variables which
+% are private to one module should not be used or modified by any
+% other module. As \TeX{} does not have any formal namespacing
+% system, this requires a convention for indicating which functions
+% in a code-level module are public and which are private.
+%
+% Using \ds\ allows internal functions to be indicated
+% using a `two part' system. Within the \texttt{.dtx} file,
+% internal functions may be indicated using |@@| in place of the
+% module name, for example
+% \begin{verbatim}
+% \cs_new_protected:Npn \@@_some_function:nn #1#2
+% {
+% % Some code here
+% }
+% \tl_new:N \l_@@_internal_tl
+% \end{verbatim}
+%
+% To extract the code using \ds, the original `guard'
+% mecahnism is extended by the introduction of the syntax
+% \texttt{\%<@@=\meta{module}>}. The \meta{module} name then
+% replaces the |@@| when the code is extracted, so that
+% \begin{verbatim}
+% %<*package>
+% %<@@=foo>
+% \cs_new_protected:Npn \@@_some_function:nn #1#2
+% {
+% % Some code here
+% }
+% \tl_new:N \l_@@_internal_tl
+% %</package>
+% \end{verbatim}
+% is extracted as
+% \begin{verbatim}
+% \cs_new_protected:Npn \__foo_some_function:nn #1#2
+% {
+% % Some code here
+% }
+% \tl_new:N \l__foo_internal_tl
+% \end{verbatim}
+% where the |__| indicates that the functions and variables are
+% internal to the \texttt{foo} module.
+%
+% Use |@@@@| to obtain |@@| in the output (|@@@@@| to get |@@@|).
+% For longer pieces of code the replacement can be completely
+% suppressed by giving an empty module name, namely using the
+% syntax \texttt{\%<@@=>}.
+%
% \section{Those other languages}
% Since \TeX\ is an open system some of \TeX\ packages include
% non-\TeX\ files. Some authors use \ds\ to generate PostScript
@@ -853,7 +906,7 @@
%
% \subsection{Verbatim mode}
% If your programming language uses some construct that can
-% interferes badly with \ds\ (e.g., percent in column one) you may
+% interfere badly with \ds\ (e.g., percent in column one) you may
% need a way for preventing it from being stripped off. For that
% purpose \ds\ features `verbatim mode'.
%
@@ -1635,6 +1688,16 @@ Z
\x
% \end{macrocode}
%
+% \begin{macro}{\quote@name}
+% \changes{v2.5h}{2020/04/18}{Macro added gfh/221)}
+% A macro copied from \texttt{ltfiles.dtx} in order to be able to
+% allow spaces in filenames.
+% \begin{macrocode}
+\def\quote@name#1{"\quote@@name#1\@gobble""}
+\def\quote@@name#1"{#1\quote@@name}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\StreamOpen}\begin{macro}{\StreamPut}
% \begin{macro}{\StreamClose}
% Here is stream opening operator. Its parameter should be a macro
@@ -1642,6 +1705,10 @@ Z
% write to file |foo.tex| use |\StreamOpen\foo|, then
% |\StreamPut\foo| and |\StreamClose\foo|.
%
+% \changes{v2.5h}{2020/04/18}{Allow spaces in filenames by enclosing
+% them in quotes (gh/221)}
+% \changes{v2.5h}{2020/04/18}{Added two times two \cs{expandafters} to
+% make the case with a filename in quotes work as well}
% \begin{macrocode}
\chardef\stream@closed=16
\def\StreamOpen#1{%
@@ -1649,7 +1716,10 @@ Z
\def\s@do##1{\ifnum##1=0
\chardef#1=\expandafter\@stripstr\string##1 %
\global\chardef##1=1 %
- \immediate\openout#1=\csname pth@\@stripstring#1\endcsname %
+ \edef\q@curr@file{%
+ \expandafter\expandafter\expandafter\quote@name
+ \expandafter\expandafter\expandafter{\csname pth@\@stripstring#1\endcsname}}
+ \immediate\openout#1=\q@curr@file\relax
\@streamfound
\fi}
\@outputstreams
@@ -2228,9 +2298,14 @@ Z
% \subsection{Processing the input lines}
%
% \begin{macro}{\normalLine}
+% \changes{v2.6a}{2020-07-07}{The search-and-replace macro
+% \cs{replaceModuleInLine} added from \textsf{l3docstrip.dtx}
+% (gh/337)}
% The macro |\normalLine| writes its argument (which has to be
% delimited with |\endLine|) on all active output files i.e.
-% those with off-counters equal to zero.
+% those with off-counters equal to zero. It uses the
+% search-and-replace macro \cs{replaceModuleInLine} to replace any
+% occurences of \texttt{@@} with the current module name.
% If statistics are included, the counter
% |\codeLinesPassed| is incremented by $1$.
% \begin{macrocode}
@@ -2240,6 +2315,7 @@ Z
%</stats>
\maybeMsg{.}%
\def\inLine{#1}%
+ \replaceModuleInLine
\let\do\putline@do
\activefiles
}
@@ -2400,14 +2476,17 @@ Z
% \changes{2.3a}{1995/08/18}{Adapted to concurrent version}
% \changes{2.3a}{1995/08/20}{Trying to avoid assignments}
% \changes{2.3e}{1996/09/16}{Verbatim mode}
+% \changes{v2.6a}{2020-07-07}{Add the @-sign option from
+% \textsf{l3docstrip.dtx} (gh/337)}
+%
% When the macros that process a line have found that the line
% starts with `\texttt{\%<}', a guard line has been encountered.
% The first character of a guard can be an asterisk (\texttt{*}), a
% slash (\texttt{/}) a plus (\texttt{+}), a minus (\texttt{-}), a
-% less-than sign (\texttt{<}) starting verbatim mode or
-% any other character that can be found in an option name. This
-% means that we have to peek at the next token and
-% decide what kind of guard we have.
+% less-than sign (\texttt{<}) starting verbatim mode, a commercial
+% at (\texttt{@}) or any other character that can be found in an
+% option name. This means that we have to peek at the next token
+% and decide what kind of guard we have.
%
% We reinsert |#1| as it may be needed by |\doOption|.
% \begin{macrocode}
@@ -2415,12 +2494,13 @@ Z
\ifcase
\ifx*#10\else \ifx/#11\else
\ifx+#12\else \ifx-#13\else
- \ifx<#14\else 5\fi\fi\fi\fi\fi\relax
+ \ifx<#14\else \ifx @#15\else 6\fi\fi\fi\fi\fi\fi\relax
\expandafter\starOption\or
\expandafter\slashOption\or
\expandafter\plusOption\or
\expandafter\minusOption\or
\expandafter\verbOption\or
+ \expandafter\moduleOption\or
\expandafter\doOption\fi
#1}
% \end{macrocode}
@@ -2435,12 +2515,17 @@ Z
% result of the test |\if1\Expr{|\meta{options}|}|, the current
% line is either copied to the output stream or removed. Then
% the test is computed for all active output files.
+% \changes{v2.6a}{2020-07-07}{Now use \cs{InLine} and call
+% \cs{replaceModuleInline} (gh/337)}
% \begin{macrocode}
\def\doOption#1>#2\endLine{%
\maybeMsg{<#1 . >}%
\Evaluate{#1}%
\def\do##1##2##3{%
- \if1\Expr{##2}\StreamPut##1{#2}\fi
+ \if1\Expr{##2}%
+ \def\inLine{#2}%
+ \replaceModuleInLine
+ \StreamPut##1{\inLine}\fi
}%
\activefiles
}
@@ -2664,6 +2749,94 @@ Z
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\moduleOption}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+%
+% In the case where the line starts |%<@|: the defined syntax requires that
+% this continues to |%<@@=|. At the moment, we assume that the syntax is
+% correct and |#1| here is the module name for substitution into any
+% internal functions in the extracted material.
+% \begin{macrocode}
+\def\moduleOption @@=#1>#2\endLine{%
+ \maybeMsg{<@@=#1>}%
+ \prepareActiveModule{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\prepareActiveModule}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+% \begin{macro}{\replaceModuleInLine}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+% Here, we set up to do the search-and-replace when doing the
+% extraction. The argument (|#1|) is the replacement text to use,
+% or if empty an indicator that no replacement should be done. The
+% search material is one of |__@@|, |_@@| or |@@|, done in order
+% such that all three end up the same in the output. The string
+% |@@@@| is hidden from these replacements by temporarily turning
+% it into a pair of letters with different category codes, not
+% produced by \ds; this allows to get |@@| in the
+% output. The replacement function is initialised as a do-nothing
+% for the case where |%<@@=| is never seen.
+% \begin{macrocode}
+\begingroup
+ \catcode`\_ = 12 %
+ \long\gdef\prepareActiveModule#1{%
+ \ifx\relax#1\relax
+ \let\replaceModuleInLine\empty
+ \else
+ \edef\replaceModuleInLine{%
+ \noexpand\replaceAllIn\noexpand\inLine{@@@@}{\string aa}%
+ \noexpand\replaceAllIn\noexpand\inLine{__@@}{__#1}%
+ \noexpand\replaceAllIn\noexpand\inLine{_@@}{__#1}%
+ \noexpand\replaceAllIn\noexpand\inLine{@@}{__#1}%
+ \noexpand\replaceAllIn\noexpand\inLine{\string aa}{@@}%
+ }%
+ \fi
+ }
+\endgroup
+\let\replaceModuleInLine\empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\replaceAllIn}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+% \begin{macro}{\replaceAllInAuxI}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+% \begin{macro}{\replaceAllInAuxII}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+% \begin{macro}{\replaceAllInAuxIII}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+% The code here is a simple search-and-replace routine for a macro
+% |#1|, replacing |#2| by |#3|. As set up here, there is an
+% assumption that nothing is going to be expandable, which is
+% reasonable as \ds\ deals with `string' material.
+% \begin{macrocode}
+\long\def\replaceAllIn#1#2#3{%
+ \long\def\tempa##1##2#2{%
+ ##2\qMark\replaceAllInAuxIII#3##1%
+ }%
+ \edef#1{\expandafter\replaceAllInAuxI#1\qMark#2\qStop}%
+}
+\def\replaceAllInAuxI{%
+ \expandafter\replaceAllInAuxII\tempa\replaceAllInAuxI\empty
+}
+\long\def\replaceAllInAuxII#1\qMark#2{#1}
+\long\def\replaceAllInAuxIII#1\qStop{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Batchfile commands}
% \changes{2.3e}{1996/10/02}{Added doc}
% \ds{} keeps information needed to control inclusion of sources in
diff --git a/Master/texmf-dist/source/latex/base/fontdef.dtx b/Master/texmf-dist/source/latex/base/fontdef.dtx
index c5623c5566e..632f1c9be56 100644
--- a/Master/texmf-dist/source/latex/base/fontdef.dtx
+++ b/Master/texmf-dist/source/latex/base/fontdef.dtx
@@ -39,7 +39,7 @@
%<driver, >\ProvidesFile{fontdef.drv}
% \fi
% \ProvidesFile{fontdef.dtx}
-%<-latexrelease> [2020/02/11 v3.0g LaTeX Kernel
+%<-latexrelease> [2020/08/01 v3.0i LaTeX Kernel
% \iftrue (\else
%<text, >(Text
%<math, >(Math
@@ -269,7 +269,7 @@
%
% \changes{v3.0a}{2016/12/03}{(DPC) Default to TU encoding for Unicode TeX engines}
% \begin{macrocode}
-\ifx\Umathchar\@undefined
+\ifx\Umathcode\@undefined
% \end{macrocode}
%
% We then set the default text font encoding. This will
@@ -436,7 +436,7 @@
% The following three definitions set up the meaning for
% |\rmfamily|, |\sffamily|, and |\ttfamily|.
% \begin{macrocode}
-\ifx\Umathchar\@undefined
+\ifx\Umathcode\@undefined
\newcommand\encodingdefault{OT1}
\newcommand\rmdefault{cmr}
\newcommand\sfdefault{cmss}
@@ -451,7 +451,7 @@
%</text>
%<latexrelease>\IncludeInRelease{2017/01/01}%
%<latexrelease> {\encodingdefault}{TU encoding default}%
-%<latexrelease>\ifx\Umathchar\@undefined
+%<latexrelease>\ifx\Umathcode\@undefined
%<latexrelease>\renewcommand\encodingdefault{OT1}
%<latexrelease>\fontencoding{\encodingdefault}
%<latexrelease>\renewcommand\rmdefault{cmr}
@@ -489,8 +489,8 @@
% Series changing commands are influenced by the following hooks.
% \changes{v3.0e}{2019/12/17}{Set \cs{bfdefault} to ``b''}
% \begin{macrocode}
-\newcommand\bfdefault{b} % overwritten below
-\newcommand\mddefault{m}
+\newcommand\bfdefault{b} % overwritten below (for rollback)
+\newcommand\mddefault{m} % overwritten below (for rollback)
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -506,7 +506,7 @@
\newcommand\itdefault{it}
\newcommand\sldefault{sl}
\newcommand\scdefault{sc}
-\newcommand\updefault{up} % overwritten below
+\newcommand\updefault{up} % overwritten below (for rollback)
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -519,8 +519,21 @@
%<*text|latexrelease>
%<latexrelease>\IncludeInRelease{2020/02/02}%
%<latexrelease> {\updefault}{font defaults change}%
+% \begin{macrocode}
\renewcommand\updefault{up}
-\renewcommand\bfdefault{b}
+% \end{macrocode}
+% We append \cs{@empty} to the series value so that we can detect
+% if it got changed via \cs{def} or \cs{renewcommand} later.
+% \changes{v3.0h}{2020/03/19}{Support legacy use of \cs{bfdefault}
+% and \cs{mddefault} (gh/306)}
+% \begin{macrocode}
+\renewcommand\bfdefault{b\@empty}
+\renewcommand\mddefault{m\@empty}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\bfdefault@previous\bfdefault
+\let\mddefault@previous\mddefault
%</text|latexrelease>
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
@@ -528,6 +541,9 @@
%<latexrelease>
%<latexrelease>\renewcommand\updefault{n}
%<latexrelease>\renewcommand\bfdefault{bx}
+%<latexrelease>
+%<latexrelease>\let\bfdefault@previous\undefined
+%<latexrelease>\let\mddefault@previous\undefined
%<latexrelease>\EndIncludeInRelease
%<*text>
% \end{macrocode}
@@ -549,8 +565,8 @@
% which resolved to \texttt{n}, but these days that is no longer
% the case (and \texttt{up} is wrong when you want to do a
% reset. So we now use \texttt{n} explicitly.
-% \begin{macrocode}
% \changes{v3.0e}{2019/12/17}{Set \cs{shapedefault} explicitly to ``n''}
+% \begin{macrocode}
\newcommand\shapedefault{n}
% \end{macrocode}
% \end{macro}
diff --git a/Master/texmf-dist/source/latex/base/format.ins b/Master/texmf-dist/source/latex/base/format.ins
index 940161edd5b..8796d16d3e2 100644
--- a/Master/texmf-dist/source/latex/base/format.ins
+++ b/Master/texmf-dist/source/latex/base/format.ins
@@ -161,7 +161,12 @@ the system are in the document `cfgguide.tex'.
\from{ltdirchk.dtx}{initex,2ekernel,dircheck}
\from{ltplain.dtx}{2ekernel}
\from{ltvers.dtx}{2ekernel}
+ \from{ltluatex.dtx}{2ekernel}
+% This is done as soon as possible here before \texttt{ltdefns.dtx} so that
+% we have the extensions as soon as possible.
+ \from{ltexpl.dtx}{2ekernel} % expl3-based extensions
\from{ltdefns.dtx}{2ekernel}
+ \from{lthooks.dtx}{2ekernel} % L3 layer module
\from{ltalloc.dtx}{2ekernel}
\from{ltcntrl.dtx}{2ekernel}
\from{lterror.dtx}{2ekernel}
@@ -194,9 +199,10 @@ the system are in the document `cfgguide.tex'.
\from{ltidxglo.dtx}{2ekernel}
\from{ltbibl.dtx}{2ekernel}
\from{ltpage.dtx}{2ekernel}
+ \from{ltclass.dtx}{2ekernel,tracerollback}
+ \from{ltfilehook.dtx}{2ekernel} % L3 layer module
+ \from{ltshipout.dtx}{2ekernel} % L3 layer module
\from{ltoutput.dtx}{2ekernel}
- \from{ltclass.dtx}{2ekernel,tracerollback}
- \from{ltluatex.dtx}{2ekernel}
\from{ltfinal.dtx}{2ekernel}}
\file{tracefnt.sty}{%
\from{ltfsstrc.dtx}{package,trace}}
@@ -225,8 +231,16 @@ the system are in the document `cfgguide.tex'.
}
-% expl3-based extensions
-\generate{\file{ltexpl.ltx}{\from{ltexpl.dtx}{2ekernel}}}
+% hook management support
+
+\generate{\file{everyshi-ltx.sty}{\from{ltshipout.dtx}{everyshi-ltx}}} % emulating everyshi
+\generate{\file{atbegshi-ltx.sty}{\from{ltshipout.dtx}{atbegshi-ltx}}} % emulating atbegshi
+\generate{\file{atveryend-ltx.sty}{\from{ltfilehook.dtx}{atveryend-ltx}}} % emulating atveryend
+
+\generate{\file{structuredlog.sty}{\from{ltfilehook.dtx}{structuredlog}}}
+
+
+
% luatex support (TeX part)
diff --git a/Master/texmf-dist/source/latex/base/inputenc.dtx b/Master/texmf-dist/source/latex/base/inputenc.dtx
index 641125cc75d..c1d08b4830f 100644
--- a/Master/texmf-dist/source/latex/base/inputenc.dtx
+++ b/Master/texmf-dist/source/latex/base/inputenc.dtx
@@ -261,18 +261,18 @@
% turn should ``hopefully'' set up the corresponding UTF-8 mapping).
%
% This works well enough for the main Western languages for which \LaTeX{}
-% has proper font encoding support, but currently already falls short on
-% languages like Greek (which has some semi-official font support, but for
-% which corresponding UTF-8 mappings still need to be defined).
+% has proper font encoding support, but can fall short on other
+% languages.
%
-% For some languages (such as Greek mentioned above) all that remains doing is
+% For some of these languages all that remains doing is
% to provide the necessary mappings and stick them into |utf8ienc.dtx|, so
% volunteers are welcome. For other languages that do not fit well into
% \LaTeX{} font selection scheme, e.g., Asian languages the outlined inputenc
% approach will not work. If that is the case one can try using Dominique
% Unruh's option |utf8x| for inputenc which has a somewhat different approach
% and encodes many more UTF-8 characters than the standard |utf8| option.
-% However, we recommend to do so only if you really need such alphabets as
+% However, we recommend to do so only if you really need such alphabets and can not
+% switch to one of the unicode engines xelatex or lualatex as
% there are problems with this extended approach which were precisely the
% reason that we decided to limit the support to what is properly supported
% within the boundaries of \LaTeX's font selection.
@@ -410,7 +410,7 @@
%<cp1252&!ansinew> \ProvidesFile{cp1252.def}
%<cp1250> \ProvidesFile{cp1250.def}
%<cp1257> \ProvidesFile{cp1257.def}
- [2018/08/11 v1.3c Input encoding file]
+ [2020/08/01 v1.3d Input encoding file]
%<cp850>%%
%<cp850>%% If you need a Euro symbol, try cp858 instead.
%<cp850>%%
@@ -545,7 +545,7 @@
% produces a warning message if no suitable definitions get read.
%
% \begin{macrocode}
-\ifx\Umathchar\@undefined
+\ifx\Umathcode\@undefined
% \end{macrocode}
%
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/base/latex209.dtx b/Master/texmf-dist/source/latex/base/latex209.dtx
index 6523e65286f..d08a8001b56 100644
--- a/Master/texmf-dist/source/latex/base/latex209.dtx
+++ b/Master/texmf-dist/source/latex/base/latex209.dtx
@@ -200,7 +200,7 @@
% \end{macrocode}
% Describe the file.
% \begin{macrocode}
-\ProvidesFile{latex209.def}[2018/08/11 v0.54 Standard LaTeX file]
+\ProvidesFile{latex209.def}[2020/08/21 v0.55 Standard LaTeX file]
% \end{macrocode}
% \changes{v0.24}{1994/05/14}{Removed date.}
% \changes{v0.40}{1995/03/21}
@@ -469,6 +469,12 @@
\saved@missingfileerror{#1}{#2}%
\fi
}
+\@ifundefined{@missing@onefilewithoptions}{}{%
+ \def\@missing@onefilewithoptions#1{%
+ \@pass@ptions\@currext{#1}{\@currname}%
+ \@missingfileerror\@currname\@currext
+ \let\@currname\@empty}%
+}
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex/base/latexrelease.ins b/Master/texmf-dist/source/latex/base/latexrelease.ins
index ff55e7d8c0e..ffc92374c35 100644
--- a/Master/texmf-dist/source/latex/base/latexrelease.ins
+++ b/Master/texmf-dist/source/latex/base/latexrelease.ins
@@ -81,50 +81,56 @@ extension .ins) which are part of the distribution.
%\keepsilent
\usedir{tex/latex/base}
+% the order should match the order in the format in case there are dependencies
+% (something defined in one module and used in another)
+
\generateFile{latexrelease.sty}{t}{%
\from{ltclass.dtx} {latexreleasefirst,tracerollback}%
\from{ltvers.dtx} {latexrelease}%
\from{latexrelease.dtx}{latexrelease}%
\from{ltdirchk.dtx} {latexrelease}%
+ \from{ltplain.dtx} {latexrelease}%
+ \from{ltluatex.dtx} {latexrelease}% empty
+ \from{ltexpl.dtx} {latexrelease}% empty
\from{ltdefns.dtx} {latexrelease}%
+ \from{lthooks.dtx} {latexrelease}% empty % L3 layer module
\from{ltalloc.dtx} {latexrelease}% empty
\from{ltcntrl.dtx} {latexrelease}% empty
\from{lterror.dtx} {latexrelease}% empty
\from{ltpar.dtx} {latexrelease}% empty
- \from{ltlists.dtx} {latexrelease}% empty
- \from{ltboxes.dtx} {latexrelease}%
- \from{lttab.dtx} {latexrelease}% empty
- \from{ltmath.dtx} {latexrelease}%
- \from{ltpictur.dtx} {latexrelease}%
- \from{ltthm.dtx} {latexrelease}% empty
- \from{ltsect.dtx} {latexrelease}% empty
+ \from{ltspace.dtx} {latexrelease}%
+ \from{ltlogos.dtx} {latexrelease}% empty
\from{ltfiles.dtx} {latexrelease}%
\from{ltoutenc.dtx} {latexrelease}%
\from{ltcounts.dtx} {latexrelease}%
\from{ltlength.dtx} {latexrelease}%
- \from{ltfloat.dtx} {latexrelease}%
- \from{ltidxglo.dtx} {latexrelease}% empty
- \from{ltbibl.dtx} {latexrelease}% empty
- \from{ltpage.dtx} {latexrelease}% empty
- \from{ltoutput.dtx} {latexrelease}%
- \from{ltclass.dtx} {latexrelease,tracerollback}%
- \from{ltspace.dtx} {latexrelease}%
- \from{ltlogos.dtx} {latexrelease}% empty
- \from{ltplain.dtx} {latexrelease}%
+ \from{ltfssbas.dtx} {latexrelease}%
+ \from{ltfssaxes.dtx} {latexrelease}%
+ \from{ltfsstrc.dtx} {latexrelease}%
\from{ltfssdcl.dtx} {latexrelease}%
\from{ltfssini.dtx} {latexrelease}%
\from{fontdef.dtx} {latexrelease}% (covering fontmath and fonttext)
\from{ltfntcmd.dtx} {latexrelease}% empty
\from{lttextcomp.dtx} {latexrelease}%
- \from{ltfssbas.dtx} {latexrelease}%
- \from{ltfssaxes.dtx} {latexrelease}%
- \from{ltfsstrc.dtx} {latexrelease}%
- \from{ltfsscmp.dtx} {latexrelease}%
\from{ltpageno.dtx} {latexrelease}% empty
\from{ltxref.dtx} {latexrelease}% empty
\from{ltmiscen.dtx} {latexrelease}%
- \from{ltluatex.dtx} {latexrelease}%
- \from{ltexpl.dtx} {latexrelease}%
+ \from{ltmath.dtx} {latexrelease}%
+ \from{ltlists.dtx} {latexrelease}% empty
+ \from{ltboxes.dtx} {latexrelease}%
+ \from{lttab.dtx} {latexrelease}% empty
+ \from{ltpictur.dtx} {latexrelease}%
+ \from{ltthm.dtx} {latexrelease}% empty
+ \from{ltsect.dtx} {latexrelease}% empty
+ \from{ltfloat.dtx} {latexrelease}%
+ \from{ltidxglo.dtx} {latexrelease}% empty
+ \from{ltbibl.dtx} {latexrelease}% empty
+ \from{ltpage.dtx} {latexrelease}% empty
+ \from{ltclass.dtx} {latexrelease,tracerollback}%
+ \from{ltfilehook.dtx} {latexrelease}% empty % L3 layer module
+ \from{ltshipout.dtx} {latexrelease}% empty % L3 layer module
+ \from{ltoutput.dtx} {latexrelease}%
+ \from{ltfsscmp.dtx} {latexrelease}% only in latexrelease!
\from{ltfinal.dtx} {latexrelease}%
}
diff --git a/Master/texmf-dist/source/latex/base/letter.dtx b/Master/texmf-dist/source/latex/base/letter.dtx
index ee9a87cf849..7b31dfbbc96 100644
--- a/Master/texmf-dist/source/latex/base/letter.dtx
+++ b/Master/texmf-dist/source/latex/base/letter.dtx
@@ -45,7 +45,7 @@
%<*driver>
\ProvidesFile{letter.drv}
%</driver>
- [2014/09/29 v1.2z
+ [2020/03/11 v1.3b
%<+letter> Standard LaTeX document class]
% \end{macrocode}
%
@@ -115,10 +115,10 @@
% \end{macrocode}
% Some commonly used abbreviations
% \begin{macrocode}
-\newcommand*{\Lopt}[1]{\textsf {#1}}
-\newcommand*{\file}[1]{\texttt {#1}}
-\newcommand*{\Lcount}[1]{\textsl {\small#1}}
-\newcommand*{\pstyle}[1]{\textsl {#1}}
+\newcommand*\Lopt[1]{\textsf {#1}}
+\newcommand*\file[1]{\texttt {#1}}
+\newcommand*\Lcount[1]{\textsl {\small#1}}
+\newcommand*\pstyle[1]{\textsl {#1}}
% \end{macrocode}
% We also want the full details.
% \begin{macrocode}
@@ -162,6 +162,7 @@
% \changes{v1.2q}{1995/05/17}{cleaned up \cs{changes entries}}
% \changes{v1.2q}{1995/05/18}{replaced \cs{hbox to} by \cs{hb@xt@}}
% \changes{v1.2r}{1995/05/23}{removed a superfluous brace}
+% \changes{v1.3a}{2020/03/07}{merged changes to classes.dtx into letter.dtx}
%
% \iffalse
% Copyright (C) 1994 LaTeX3 project, Frank Mittelbach
@@ -751,29 +752,29 @@
% \item |\name{Dr. L. User}| : to be used for the return address on
% the envelope.
% \begin{macrocode}
-\newcommand*{\name}[1]{\def\fromname{#1}}
+\newcommand*\name[1]{\def\fromname{#1}}
% \end{macrocode}
% \item |\signature{Larry User}| : goes after the closing.
% \begin{macrocode}
-\newcommand*{\signature}[1]{\def\fromsig{#1}}
+\newcommand*\signature[1]{\def\fromsig{#1}}
% \end{macrocode}
% \item |\address{3245 Foo St.\\Gnu York}| : used as the return
% address in the
% letter and on the envelope. If not declared, then an
% institutional standard address is used.
% \begin{macrocode}
-\newcommand*{\address}[1]{\def\fromaddress{#1}}
+\newcommand*\address[1]{\def\fromaddress{#1}}
% \end{macrocode}
% \item |\location{Room 374}| : Acts as modifier to the standard
% institutional address.
% \begin{macrocode}
-\newcommand*{\location}[1]{\def\fromlocation{#1}}
+\newcommand*\location[1]{\def\fromlocation{#1}}
% \end{macrocode}
% \item |\telephone{(415)123-4567}| : Just in case some style puts it
% on the letter.
% \changes{v1.2m}{1994/06/23}{Removed typo (\#[] instead of [1])}
% \begin{macrocode}
-\newcommand*{\telephone}[1]{\def\telephonenum{#1}}
+\newcommand*\telephone[1]{\def\telephonenum{#1}}
% \end{macrocode}
% \end{itemize}
% \end{macro}
@@ -805,7 +806,7 @@
% \begin{macro}{\makelabels}
% The |\makelabels| declaration causes mailing labels to be made.
% \begin{macrocode}
-\newcommand*{\makelabels}{%
+\newcommand*\makelabels{%
% \end{macrocode}
% At the beginning of the document, we need to activate the
% |\@mlabel| and |\@startlabels| commands, as well as write
@@ -914,7 +915,7 @@
% When the command |\stopbreaks| is issued no page breaks should
% occur until |\startbreaks| is called.
% \begin{macrocode}
-\newcommand*{\stopbreaks}{%
+\newcommand*\stopbreaks{%
\interlinepenalty\@M
\def\par{\@@par\nobreak}%
\let\\\@nobreakcr
@@ -953,7 +954,7 @@
% \begin{macro}{\startbreaks}
% This cancels the effect of |\stopbreaks|.
% \begin{macrocode}
-\newcommand*{\startbreaks}{%
+\newcommand*\startbreaks{%
\let\\\@normalcr
\interlinepenalty 200%
\def\par{\@@par\penalty 200\relax}}
@@ -1004,7 +1005,7 @@
% declaration--null if none.
% \end{itemize}
% \begin{macrocode}
-\newcommand*{\opening}[1]{\ifx\@empty\fromaddress
+\newcommand*\opening[1]{\ifx\@empty\fromaddress
\thispagestyle{firstpage}%
{\raggedleft\@date\par}%
\else % home address
@@ -1039,7 +1040,7 @@
% \item |\stopbreaks| : a macro that inhibits page breaking.
% \end{itemize}
% \begin{macrocode}
-\newcommand{\closing}[1]{\par\nobreak\vspace{\parskip}%
+\newcommand\closing[1]{\par\nobreak\vspace{\parskip}%
\stopbreaks
\noindent
\ifx\@empty\fromaddress\else
@@ -1085,7 +1086,7 @@
% \changes{v1.2s}{1995/05/25}{replace \cs{reset@font} with
% \cs{normalfont}; remove \cs{rm}}
% \begin{macrocode}
-\newcommand*{\cc}[1]{%
+\newcommand*\cc[1]{%
\par\noindent
\parbox[t]{\textwidth}{%
\@hangfrom{\normalfont\ccname: }%
@@ -1100,7 +1101,7 @@
% & Bar
% \end{tabular}
% \begin{macrocode}
-\newcommand*{\encl}[1]{%
+\newcommand*\encl[1]{%
\par\noindent
\parbox[t]{\textwidth}{%
\@hangfrom{\normalfont\enclname: }%
@@ -1110,7 +1111,7 @@
% The only thing |\ps| needs to do is call |\startbreaks|,
% which allows page breaking again.
% \begin{macrocode}
-\newcommand*{\ps}{\par\startbreaks}
+\newcommand*\ps{\par\startbreaks}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1137,7 +1138,7 @@
% |\protect\standardreturnaddress|.
% \end{itemize}
% \begin{macrocode}
-\newcommand*{\stopletter}{}
+\newcommand*\stopletter{}
% \end{macrocode}
% \end{macro}
%
@@ -1159,7 +1160,7 @@
% The return address for the mailing labels can be stored in this
% macro.
% \begin{macrocode}
-\newcommand*{\returnaddress}{}
+\newcommand*\returnaddress{}
% \end{macrocode}
% \end{macro}
%
@@ -1177,7 +1178,7 @@
% 5352 address labels.
% \changes{v1.2q}{1995/03/14}{changed value of \cs{columnsep} by 1pt}
% \begin{macrocode}
-\newcommand*{\startlabels}{\labelcount\z@
+\newcommand*\startlabels{\labelcount\z@
\pagestyle{empty}%
\let\@texttop\relax
\topmargin -50\p@
@@ -1226,7 +1227,7 @@
% \changes{v1.2q}{1995/03/14}{changed width of the labels slightly to
% prevent \LaTeX\ stuffing two on each line}
% \begin{macrocode}
-\newcommand*{\mlabel}[2]{%
+\newcommand*\mlabel[2]{%
\parbox[b][2in][c]{262\p@}{\strut\ignorespaces #2}%
}
% \end{macrocode}
@@ -1267,7 +1268,7 @@
% For efficiency, level-one list's values are defined at top level, and
% |\@listi| is defined to set only |\leftmargin|.
% \begin{macrocode}
-\setlength\leftmargini {2.5em}
+\setlength\leftmargini {2.5em}
% \end{macrocode}
% The following three are calculated so that they are larger than
% the sum of |\labelsep| and the width of the default labels (which
@@ -1276,8 +1277,8 @@
\setlength\leftmarginii {2.2em}
\setlength\leftmarginiii {1.87em}
\setlength\leftmarginiv {1.7em}
-\setlength\leftmarginv {1em}
-\setlength\leftmarginvi {1em}
+\setlength\leftmarginv {1em}
+\setlength\leftmarginvi {1em}
% \end{macrocode}
% Here we set the top level leftmargin.
% \begin{macrocode}
@@ -1453,11 +1454,30 @@
% \changes{v1.2x}{1997/04/16}{Changed to \cs{textbullet},
% \cs{textasteriskcentered} and \cs{textperiodcentered}}
% \begin{macrocode}
-\newcommand\labelitemi{\textbullet}
-\newcommand\labelitemii{\normalfont\bfseries \textendash}
-\newcommand\labelitemiii{\textasteriskcentered}
-\newcommand\labelitemiv{\textperiodcentered}
+\newcommand\labelitemi {\labelitemfont \textbullet}
+\newcommand\labelitemii {\labelitemfont \bfseries \textendash}
+\newcommand\labelitemiii{\labelitemfont \textasteriskcentered}
+\newcommand\labelitemiv {\labelitemfont \textperiodcentered}
% \end{macrocode}
+%
+% \begin{macro}{\labelitemfont}
+% The default definition for \cs{labelitemfont} is to reset the
+% font to \cs{normalfont} so that always the same symbol is
+% produced regardless of surrounding conditions.
+%
+% \changes{v1.3a}{2020/03/07}{Normalize label fonts}
+% A possible alternative would be
+%\begin{verbatim}
+%\renewcommand\labelitemfont{%
+% \fontseries\seriesdefault
+% \fontshape\shapedefault\selectfont}
+%\end{verbatim}
+% which resets series and shape doesn't touch the family.
+% \begin{macrocode}
+\newcommand\labelitemfont{\normalfont}
+% \end{macrocode}
+% \changes{v1.3b}{2020/03/11}{Added a missing \cs{end{macro}} statement}
+% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
@@ -1484,8 +1504,8 @@
%
% \changes{v1.2q}{1995/03/14}{made command short}
% \begin{macrocode}
-\newcommand*{\descriptionlabel}[1]{\hspace\labelsep
- \normalfont\bfseries #1}
+\newcommand*\descriptionlabel[1]{\hspace\labelsep
+ \normalfont\bfseries #1}
% \end{macrocode}
% \end{macro}
%
@@ -1795,8 +1815,10 @@
% |\parindent| to the appropriate value for succeeding paragraphs
% and put the proper indentation before the mark.
%
+% \changes{v1.3b}{2020/03/11}{make the switch to the use of
+% \cs{newcommand} complete.}
% \begin{macrocode}
-\long\def\@makefntext#1{%
+\newcommand\@makefntext[1]{%
\noindent
\hangindent 5\p@
\hb@xt@5\p@{\hss\@makefnmark}#1}
@@ -1808,10 +1830,12 @@
% footnotes should be produced by the macro |\@makefnmark|. We use
% the default definition for it.
% \begin{macrocode}
-%\def\@makefnmark{\hbox{$^{\@thefnmark}\m@th$}}
+%\renewcommand\@makefnmark{\hbox{$^{\@thefnmark}\m@th$}}
% \end{macrocode}
% \end{macro}
%
+% \section{Initialization}
+%
% \subsection{Words}
%
% \begin{macro}{\ccname}
@@ -1823,10 +1847,10 @@
% English words must be replaced. All the English words that
% require replacement are defined below in command names.
% \begin{macrocode}
-\newcommand*{\ccname}{cc}
-\newcommand*{\enclname}{encl}
-\newcommand*{\pagename}{Page}
-\newcommand*{\headtoname}{To}
+\newcommand*\ccname{cc}
+\newcommand*\enclname{encl}
+\newcommand*\pagename{Page}
+\newcommand*\headtoname{To}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1839,7 +1863,7 @@
% This macro uses the \TeX\ primitives |\month|, |\day| and |\year|
% to provide the date of the \LaTeX-run.
% \begin{macrocode}
-\newcommand*{\today}{\ifcase\month\or
+\newcommand*\today{\ifcase\month\or
January\or February\or March\or April\or May\or June\or
July\or August\or September\or October\or November\or December\fi
\space\number\day, \number\year}
diff --git a/Master/texmf-dist/source/latex/base/ltboxes.dtx b/Master/texmf-dist/source/latex/base/ltboxes.dtx
index 61ea87235ab..39c134b3bfd 100644
--- a/Master/texmf-dist/source/latex/base/ltboxes.dtx
+++ b/Master/texmf-dist/source/latex/base/ltboxes.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltboxes.dtx}
- [2019/08/27 v1.3b LaTeX Kernel (Box Commands)]
+ [2020/09/27 v1.4a LaTeX Kernel (Box Commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltboxes.dtx}
@@ -365,8 +365,13 @@
% \begin{macro}{\@imakepicbox}
% picture mode version
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@imakepicbox}{default units}%
\long\def\@imakepicbox(#1,#2)[#3]#4{%
- \vbox to#2\unitlength
+ \@defaultunitsset\@tempdimc{#2}\unitlength
+ \vbox to\@tempdimc
{\let\mb@b\vss \let\mb@l\hss\let\mb@r\hss
\let\mb@t\vss
\@tfor\reserved@a :=#3\do{%
@@ -376,14 +381,38 @@
\expandafter\let\csname mb@\reserved@a\endcsname\relax
\fi}%
\mb@t
- \hb@xt@ #1\unitlength{\mb@l #4\mb@r}%
+ \@defaultunitsset\@tempdimc{#1}\unitlength
+ \hb@xt@\@tempdimc{\mb@l #4\mb@r}%
\mb@b
% \end{macrocode}
% This kern ensures that a |b| option aligns on the bottom of the
% text rather than the baseline. this is the documented behaviour in
-% the \LaTeX Book. The kern is removed in compatibility mode.
+% the \LaTeX\ Book. The kern is removed in compatibility mode.
% \begin{macrocode}
\kern\z@}}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@imakepicbox}{default units}%
+%<latexrelease>\long\def\@imakepicbox(#1,#2)[#3]#4{%
+%<latexrelease> \vbox to#2\unitlength
+%<latexrelease> {\let\mb@b\vss \let\mb@l\hss\let\mb@r\hss
+%<latexrelease> \let\mb@t\vss
+%<latexrelease> \@tfor\reserved@a :=#3\do{%
+%<latexrelease> \if s\reserved@a
+%<latexrelease> \let\mb@l\relax\let\mb@r\relax
+%<latexrelease> \else
+%<latexrelease> \expandafter\let\csname mb@\reserved@a\endcsname\relax
+%<latexrelease> \fi}%
+%<latexrelease> \mb@t
+%<latexrelease> \hb@xt@ #1\unitlength{\mb@l #4\mb@r}%
+%<latexrelease> \mb@b
+%<latexrelease> \kern\z@}}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -1290,13 +1319,21 @@
%
% \begin{macro}{\rlap}
% \begin{macro}{\llap}
+% \begin{macro}{\clap}
% These macros place text to the left or right of the current
% reference point without taking up space.
-% \end{macro}
% \begin{macrocode}
\DeclareRobustCommand\rlap[1]{\hb@xt@\z@{#1\hss}}
\DeclareRobustCommand\llap[1]{\hb@xt@\z@{\hss#1}}
% \end{macrocode}
+% And here is the version that centers, it was initially introduced by
+% \texttt{mathtools}.
+% \changes{v1.3c}{2020/03/06}{Macro \cs{clap} added}
+% \begin{macrocode}
+\DeclareRobustCommand\clap[1]{\hb@xt@\z@{\hss#1\hss}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
% \end{macro}
%
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/base/ltclass.dtx b/Master/texmf-dist/source/latex/base/ltclass.dtx
index 578443921b8..c62136c3097 100644
--- a/Master/texmf-dist/source/latex/base/ltclass.dtx
+++ b/Master/texmf-dist/source/latex/base/ltclass.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltclass.dtx}
- [2020/02/20 v1.3j LaTeX Kernel (Class & Package Interface)]
+ [2020/12/17 v1.3v LaTeX Kernel (Class & Package Interface)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltclass.dtx}
@@ -44,6 +44,9 @@
\date{\filedate}
\MaintainedByLaTeXTeam{latex}
\maketitle
+
+ \providecommand\pkg[1]{\texttt{#1}}
+
\DocInput{\filename}
\end{document}
%</driver>
@@ -64,6 +67,7 @@
% \changes{v1.0l}{1994/11/17}{\cs{@tempa} to \cs{reserved@a}}
% \changes{v1.0z}{1998/03/21}{Added to documentation of filecontents}
% \changes{v1.1c}{1998/08/17}{(RmS) Minor documentation fixes.}
+% \changes{v1.3o}{2020/08/21}{Integration of new hook management interface}
%
%
% \section{Introduction}
@@ -161,7 +165,7 @@
% 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
+% search tree of \TeX{}. Finally, you can use \texttt{noheader} 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).
%
@@ -256,8 +260,9 @@
% \PassOptionsToPackage{foo,bar}{fred}
% \RequirePackage[baz]{fred}\end{verbatim}
% is the same as:
-% \begin{verbatim}
-% \RequirePackage[foo,bar,baz]{fred}\end{verbatim}
+%\begin{verbatim}
+% \RequirePackage[foo,bar,baz]{fred}
+%\end{verbatim}
%
% \DescribeMacro\LoadClassWithOptions
% |\LoadClassWithOptions|\marg{name}\oarg{version}:\\
@@ -458,7 +463,9 @@
% \end{macro}
%
% \begin{macro}{\@documentclasshook}
-% The hook called after the first |\documentclass| command. By
+% This legacy hook is called after the first |\documentclass| command.
+% It is \emph{not} integrated with the new 2020 hook management system!
+% By
% default this checks to see if |\@normalsize| is undefined, and if
% so, sets it to |\normalsize|.
% \changes{v0.2q}{1993/12/17}
@@ -517,6 +524,27 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@currpath}
+% Path to the current file if explicitly given.
+% \changes{v1.3u}{2020/11/20}{Macro added}
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}{\@currpath}%
+%<latexrelease> {Add \@currpath}%
+\let\@currpath\@empty
+%<latexrelease>\EndIncludeInRelease
+%
+%<latexrelease>\IncludeInRelease{0000/00/00}{\@currpath}%
+%<latexrelease> {Add \@currpath}%
+%<latexrelease>\let\@currpath\@undefined
+%<latexrelease>\EndIncludeInRelease
+%</2ekernel|latexrelease>
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@currname}
% Name of current package or option.
% \begin{macrocode}
@@ -552,22 +580,117 @@
% |#2| current extension. \\
% |#3| current catcode of |@|. \\
% |#4| Rest of the stack.
+% \changes{v1.3l}{2020/06/05}{Added \cs{@expl@push@filename@@}
+% and \cs{@expl@push@filename@aux@@}}
+% \changes{v1.3s}{2020/10/08}{Added missing 2020/02/02 \cs{IncludeInRelease}}
+% \changes{v1.3v}{2020/12/14}{Removed \cs{@expl@@@hook@curr@name@push@@n}}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}{\@pushfilename}%
+%<latexrelease> {Add \@expl@push@filename@@ and \@expl@push@filename@aux@@}%
\def\@pushfilename{%
+% \end{macrocode}
+% The push and pop macros are injected in \cs{@pushfilename} and
+% \cs{@popfilename} so that they correctly keep track of the hook
+% labels.
+%
+% This needs cleanup with the \pkg{expl3} interfaces also playing
+% here, e.g., \cs{@expl@push@filename@@} needs cleanup and (and
+% should probably not have this name either).
+% \begin{macrocode}
+ \@expl@push@filename@@
\xdef\@currnamestack{%
{\@currname}%
{\@currext}%
{\the\catcode`\@}%
- \@currnamestack}}
+ \@currnamestack}%
+% \end{macrocode}
+% Temporarily add a stack for \cs{@currpath} here. This should be
+% integrated in the main file stack eventually, but other packages
+% rely on \cs{@currnamestack} having three elements per file, so that
+% isn't a trivial change. The prefix \cs{@kernel@...} hopefully
+% discourages people from using it.
+% \begin{macrocode}
+ \xdef\@kernel@currpathstack{%
+ {\@currpath}%
+ \@kernel@currpathstack}%
+ \@expl@push@filename@aux@@}
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% The following version of \cs{@pushfilename} didn't formally exist in
+% this file, but in the 2020/02/02 release, \pkg{expl3} was preloaded
+% and it patched \cs{@pushfilename} (and \cs{@popfilename}) by adding
+% some hooks in there. But rolling back to 2020/02/02, \pkg{expl3}
+% doesn't patch these macros again, so rolling back has to take those
+% hooks into account. Same goes for \cs{@popfilename}.
+% \begin{macrocode}
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{2020/02/02}{\@pushfilename}%
+%<latexrelease> {Add \@expl@push@filename@@}%
+%<latexrelease>\def\@pushfilename{%
+%<latexrelease> \@expl@push@filename@@
+%<latexrelease> \xdef\@currnamestack{%
+%<latexrelease> {\@currname}%
+%<latexrelease> {\@currext}%
+%<latexrelease> {\the\catcode`\@}%
+%<latexrelease> \@currnamestack}%
+%<latexrelease> \@expl@push@filename@aux@@}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{0000/00/00}{\@pushfilename}%
+%<latexrelease> {Add \@expl@push@filename@@ and \@expl@push@filename@aux@@}%
+%<latexrelease>\def\@pushfilename{%
+%<latexrelease> \xdef\@currnamestack{%
+%<latexrelease> {\@currname}%
+%<latexrelease> {\@currext}%
+%<latexrelease> {\the\catcode`\@}%
+%<latexrelease> \@currnamestack}}
+%<latexrelease>\EndIncludeInRelease
\@onlypreamble\@pushfilename
% \end{macrocode}
%
+%
+%
+%
+%
+% \changes{v1.3l}{2020/06/05}{Added \cs{@expl@pop@filename@@}}
% \begin{macrocode}
-\def\@popfilename{\expandafter\@p@pfilename\@currnamestack\@nil}
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}{\@popfilename}%
+%<latexrelease> {Add \@expl@pop@filename@@}%
+\def\@popfilename{\@expl@@@hook@curr@name@pop@@
+ \expandafter\@p@pfilename\@currnamestack\@nil
+% \end{macrocode}
+% Same for popping:
+% \begin{macrocode}
+ \expandafter\@p@pfilepath\@kernel@currpathstack\@nil
+ \@expl@pop@filename@@}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{2020/02/02}{\@popfilename}%
+%<latexrelease> {Add \@expl@push@filename@@}%
+%<latexrelease>\def\@popfilename{\expandafter\@p@pfilename\@currnamestack\@nil
+%<latexrelease> \@expl@pop@filename@@}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{0000/00/00}{\@popfilename}%
+%<latexrelease> {Add \@expl@push@filename@@ and \@expl@push@filename@aux@@}%
+%<latexrelease>\def\@popfilename{\expandafter\@p@pfilename\@currnamestack\@nil}
+%<latexrelease>\EndIncludeInRelease
\@onlypreamble\@popfilename
% \end{macrocode}
%
% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<*2ekernel>
+% \end{macrocode}
+%
+%
+%
+% \begin{macrocode}
\def\@p@pfilename#1#2#3#4\@nil{%
\gdef\@currname{#1}%
\gdef\@currext{#2}%
@@ -584,6 +707,36 @@
% \end{macro}
% \end{macro}
%
+%
+% \begin{macro}{\@kernel@currpathstack}
+% Path to the current file if explicitly given. The auxiliary is
+% needed here to insert a \cs{@empty} to prevent the loss of braces.
+% \changes{v1.3u}{2020/11/20}{Macro added}
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}{\@kernel@currpathstack}%
+%<latexrelease> {Add \@kernel@currpathstack}%
+\gdef\@kernel@currpathstack{}
+\def\@p@pfilepath#1{%
+ \gdef\@currpath{#1}\@p@pfilepath@aux\@empty}
+\def\@p@pfilepath@aux#1\@nil{%
+ \xdef\@kernel@currpathstack{#1}}
+%<latexrelease>\EndIncludeInRelease
+%
+%<latexrelease>\IncludeInRelease{0000/00/00}{\@kernel@currpathstack}%
+%<latexrelease> {Add \@kernel@currpathstack}%
+%<latexrelease>\let\@kernel@currpathstack\@undefined
+%<latexrelease>\let\@p@pfilepath\@undefined
+%<latexrelease>\let\@p@pfilepath@aux\@undefined
+%<latexrelease>\EndIncludeInRelease
+%</2ekernel|latexrelease>
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+%
+%
% \begin{macro}{\@ptionlist}
% Returns the option list of the file.
% \begin{macrocode}
@@ -620,15 +773,60 @@
%
% \begin{macro}{\@ifpackagelater}
% \begin{macro}{\@ifclasslater}
-% |\@ifpackagelater{|\meta{name}|}{YYYY/MM/DD}|
-% Checks that the package loaded is more recent than the given date.
+% |\@ifpackagelater{|\meta{name}|}{YYYY/MM/DD}{|\meta{true
+% code}|}{|\meta{false code}|}|
+% Checks that the package loaded is more recent or equal to the
+% given date.
+% A better name for it would therefore been
+% |\@ifpackagelaterorequal| but it is in use for more than 30
+% years, so \ldots
% \begin{macrocode}
\def\@ifpackagelater{\@ifl@ter\@pkgextension}
\def\@ifclasslater{\@ifl@ter\@clsextension}
\@onlypreamble\@ifpackagelater
\@onlypreamble\@ifclasslater
% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\IfPackageAtLeastTF}
+% \begin{macro}{\IfClassAtLeastTF}
+% \begin{macro}{\IfFormatAtLeastTF}
+% |\IfFormatAtLeastTF{YYYY/MM/DD}{|\meta{true
+% code}|}{|\meta{false code}|}|
+% Test if the format is later or equal to the given date.
+% \changes{v1.3k}{2020/04/07}{Macro added; also in rollback (gh/168)}
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\IfFormatAtLeastTF}{Test format date}%
+\def\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+\let\IfPackageAtLeastTF\@ifpackagelater
+\let\IfClassAtLeastTF\@ifclasslater
+\@onlypreamble\IfFormatAtLeastTF
+\@onlypreamble\IfPackageAtLeastTF
+\@onlypreamble\IfClassAtLeastTF
+% \end{macrocode}
+% For rollback pretend it was available since the beginning of dawn.
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\IfFormatAtLeastTF}{Test format date}%
+%<latexrelease>\def\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+%<latexrelease>\let\IfPackageAtLeastTF\@ifpackagelater
+%<latexrelease>\let\IfClassAtLeastTF\@ifclasslater
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
+% \begin{macro}{\@ifl@ter}
% \begin{macrocode}
\def\@ifl@ter#1#2{%
\expandafter\@ifl@t@r
@@ -675,6 +873,7 @@
% \begin{macrocode}
\@onlypreamble\@ifl@t@r
% \end{macrocode}
+% \end{macro}
%
% \changes{v1.1j}{2016/06/20}
% {don't declare as \cs{@onlypreamble}}
@@ -695,8 +894,8 @@
%</2ekernel|latexreleasefirst>
%<*2ekernel>
% \end{macrocode}
-% \end{macro}
-% \end{macro}
+%
+%
%
% \begin{macro}{\@ifpackagewith}
% \begin{macro}{\@ifclasswith}
@@ -781,15 +980,42 @@
% \changes{v0.3c}{1994/03/12}
% {use \cs{@gtempa}}
% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\ProvidesPackage}{Check name with \strcmp}%
+%<*2ekernel|latexrelease>
\def\ProvidesPackage#1{%
\xdef\@gtempa{#1}%
- \ifx\@gtempa\@currname\else
+% \end{macrocode}
+% \changes{v1.3u}{2020/11/20}
+% {Use string comparison instead of \cs{ifx}}
+% Here \cs{@currpath} is explicitly added to the file name to report
+% when a package or class is loaded using an explicit path. Loading
+% using a path in the argument is supported but not encouraged.
+% \begin{macrocode}
+ \@expandtwoargs\@expl@str@if@eq@@nnTF
+ {\@gtempa}{\@currpath\@currname}{}{%
\@latex@warning@no@line{You have requested
- \@cls@pkg\space`\@currname',\MessageBreak
+ \@cls@pkg\space`\@currpath\@currname',\MessageBreak
but the \@cls@pkg\space provides `#1'}%
- \fi
+ }%
\@ifnextchar[\@pr@videpackage{\@pr@videpackage[]}}%]
\@onlypreamble\ProvidesPackage
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\ProvidesPackage}{Undo: check name with \strcmp}%
+%<latexrelease>\def\ProvidesPackage#1{%
+%<latexrelease> \xdef\@gtempa{#1}%
+%<latexrelease> \ifx\@gtempa\@currname\else
+%<latexrelease> \@latex@warning@no@line{You have requested
+%<latexrelease> \@cls@pkg\space`\@currname',\MessageBreak
+%<latexrelease> but the \@cls@pkg\space provides `#1'}%
+%<latexrelease> \fi
+%<latexrelease> \@ifnextchar[\@pr@videpackage{\@pr@videpackage[]}}%]
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -800,14 +1026,18 @@
% be cautious when handling the identification string in case it
% contains UTF-8 characters.
% \changes{v1.3e}{2019/11/29}{Protect package info text (gh/52)}
+% \changes{v1.3r}{2020/10/01}{Allow for package subsitution}
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2020/02/02}%
-%<latexrelease> {\@pr@videpackage}{Protection for package info}%
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@pr@videpackage}{Allow for package subsitution}%
\def\@pr@videpackage[#1]{%
\expandafter\protected@xdef % <-- protected...
- \csname ver@\@currname.\@currext\endcsname{#1}%
+ \csname ver@\@currname.\@currext\endcsname{#1}% Loaded package
+ \expandafter\let
+ \csname ver@\@currpkg@reqd\expandafter\endcsname % Requested package
+ \csname ver@\@currname.\@currext\endcsname
\ifx\@currext\@clsextension
\typeout{Document Class: \@gtempa\space#1}%
\else
@@ -832,6 +1062,19 @@
% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2020/02/02}%
+%<latexrelease> {\@pr@videpackage}{Protection for package info}%
+%<latexrelease>
+%<latexrelease>\def\@pr@videpackage[#1]{%
+%<latexrelease> \expandafter\protected@xdef % <-- protected...
+%<latexrelease> \csname ver@\@currname.\@currext\endcsname{#1}%
+%<latexrelease>\ifx\@currext\@clsextension
+%<latexrelease> \typeout{Document Class: \@gtempa\space#1}%
+%<latexrelease> \else
+%<latexrelease> \protected@wlog{Package: \@gtempa\space#1}% <--- protected
+%<latexrelease> \fi}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\@pr@videpackage}{Protection for package info}%
%<latexrelease>
@@ -856,9 +1099,18 @@
%
% \begin{macro}{\ProvidesClass}
% Like |\ProvidesPackage|, but for classes.
+% This needs a dummy \pkg{latexrelease} block to copy the definition
+% of \cs{ProvidesPackage} as it changes across releases.
% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\ProvidesClass}{Track \ProvidesPackage}%
+%<*2ekernel|latexrelease>
\let\ProvidesClass\ProvidesPackage
\@onlypreamble\ProvidesClass
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -914,12 +1166,40 @@
% \begin{macro}{\PassOptionsToClass}
% If the package has been loaded, we check that it was first loaded with
% the options. Otherwise we add the option list to that of the package.
+% \changes{v1.3t}{2020/10/18}{Drop path from \cs{input@path} (gh/414).}
% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020/10/01}{\@pass@ptions}
+%<latexrelease> {Add file replacement in \@pass@ptions}%
+%<*2ekernel|latexrelease>
\def\@pass@ptions#1#2#3{%
- \expandafter\xdef\csname opt@#3.#1\endcsname{%
- \@ifundefined{opt@#3.#1}\@empty
- {\csname opt@#3.#1\endcsname,}%
- \zap@space#2 \@empty}}
+ \@expl@@@filehook@set@curr@file@@nNN
+ {\@expl@@@filehook@resolve@file@subst@@w #3.#1\@nil}%
+ \reserved@a\reserved@b
+ \@expl@@@filehook@clear@replacement@flag@@
+ \expandafter\xdef\csname opt@\reserved@a\endcsname{%
+ \@ifundefined{opt@\reserved@a}\@empty
+ {\csname opt@\reserved@a\endcsname,}%
+ \zap@space#2 \@empty}%
+% \end{macrocode}
+% \changes{v1.3u}{2020/11/20}
+% {Copy option list to the requested package.}
+% \begin{macrocode}
+ \expandafter\let
+ \csname opt@#3.#1\expandafter\endcsname
+ \csname opt@\reserved@a\endcsname}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%
+%<latexrelease>\IncludeInRelease{0000/00/00}{\@pass@ptions}
+%<latexrelease> {\@pass@ptions}%
+%<latexrelease>\def\@pass@ptions#1#2#3{%
+%<latexrelease> \expandafter\xdef\csname opt@#3.#1\endcsname{%
+%<latexrelease> \@ifundefined{opt@#3.#1}\@empty
+%<latexrelease> {\csname opt@#3.#1\endcsname,}%
+%<latexrelease> \zap@space#2 \@empty}}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
\@onlypreamble\@pass@ptions
% \end{macrocode}
%
@@ -1050,6 +1330,10 @@
%
% The common part of |\ProcessOptions| and |\ProcessOptions*|.
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@process@pti@ns}{Unused options issue}%
\def\@process@pti@ns{%
\@for\CurrentOption:=\@curroptions\do{%
\@ifundefined{ds@\CurrentOption}%
@@ -1073,11 +1357,33 @@
% \end{macrocode}
% \changes{v1.0r}{1995/10/17}
% {Reset \cs{CurrentOption} for graphics/1873}
+% \changes{v1.3k}{2020/04/07}{Use different method to ignore
+% unprocessed options (gh/22)}
% \begin{macrocode}
\let\CurrentOption\@empty
\let\@fileswith@pti@ns\@@fileswith@pti@ns
- \AtEndOfPackage{\let\@unprocessedoptions\relax}}
+ \AtEndOfPackage{\expandafter\let
+ \csname unprocessedoptions-\@currname.\@currext\endcsname
+ \relax}}
\@onlypreamble\@process@pti@ns
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@process@pti@ns}{Unused options issue}%
+%<latexrelease>
+%<latexrelease>\def\@process@pti@ns{%
+%<latexrelease> \@for\CurrentOption:=\@curroptions\do{%
+%<latexrelease> \@ifundefined{ds@\CurrentOption}%
+%<latexrelease> {\@use@ption
+%<latexrelease> \default@ds}%
+%<latexrelease> \@use@ption}%
+%<latexrelease> \@for\CurrentOption:=\@declaredoptions\do{%
+%<latexrelease> \expandafter\let\csname ds@\CurrentOption\endcsname\relax}%
+%<latexrelease> \let\CurrentOption\@empty
+%<latexrelease> \let\@fileswith@pti@ns\@@fileswith@pti@ns
+%<latexrelease> \AtEndOfPackage{\let\@unprocessedoptions\relax}}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1243,13 +1549,45 @@
% \changes{v1.0v}{1996/10/04}{Reset \cs{@unprocessedoptions} for /2269}
% Load package `|#1|' with the current option list.
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\RequirePackageWithOptions}{Unused options issue}%
\def\RequirePackageWithOptions{%
- \AtEndOfPackage{\let\@unprocessedoptions\relax}%
+% \end{macrocode}
+% The resetting of the unprocessed options is now done on a par package basis.
+% \changes{v1.3k}{2020/04/07}{Use different method to ignore
+% unprocessed options (gh/22)}
+% \begin{macrocode}
+ \AtEndOfPackage{\expandafter\let
+ \csname unprocessedoptions-\@currname.\@currext\endcsname
+ \relax}%
\@loadwithoptions\@pkgextension\RequirePackage}
\@onlypreamble\RequirePackageWithOptions
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\RequirePackageWithOptions}{Unused options issue}%
+%<latexrelease>
+%<latexrelease>\def\RequirePackageWithOptions{%
+%<latexrelease> \AtEndOfPackage{\let\@unprocessedoptions\relax}%
+%<latexrelease> \@loadwithoptions\@pkgextension\RequirePackage}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
+%
+
+
+
+
+
+
+%
% \begin{macro}{\usepackage}
% To begin with, |\usepackage| produces an error. This is reset by
% |\documentclass|.
@@ -1469,6 +1807,9 @@
\@onlypreamble\@fileswith@pti@ns
% \end{macrocode}
%
+% \begin{macro}{\load@onefilewithoptions}
+% This macro is used when loading packages or classes.
+%
% Have the main argument as |#1|, so we only need one |\expandafter|
% above.
% \changes{v0.2a}{1993/11/14}
@@ -1482,91 +1823,398 @@
% \changes{v1.3d}{2019/10/18}{Initialize \cs{...-h@@k} only when loading
% the package or class (gh/198)}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@onefilewithoptions}{Hooks and unused options issue}%
\def\@onefilewithoptions#1[#2][#3]#4{%
+% \end{macrocode}
+% We have to sanitise file names, so that something like
+% \begin{verbatim}
+% \usepackage{some/local/path/array}
+% \usepackage{array}
+% \end{verbatim}
+% won't load \file{array.sty} twice. It is remotely possible that
+% those are two different files, but as a matter of principles, we
+% will consider that the base file name uniquely identifies a
+% package, regardless of where it lives. This assumption already
+% holds for file hooks, for example, which address the hook to a file
+% by its base name only.
+%
+% We'll use \cs{@expl@@@filehook@set@curr@file@@nNN} to parse the
+% file name and return the \meta{path} and \meta{base+ext} in
+% separate token lists. Further ahead, most operations use
+% \cs{@currname} which doesn't have a path attached to it; only few
+% actions prepend \cs{@currpath} to \cs{@currname} (namely loading,
+% as we have to respect the given path).
+%
+% A file substituiton isn't followed just yet because at this point
+% we are parsing user input, so the file is still what the user
+% asked for, and not the file actually loaded.
+% \begin{macrocode}
+ \@expl@@@filehook@set@curr@file@@nNN{#1.#4}\reserved@a\reserved@b
+ \edef\reserved@c{\def\noexpand\reserved@c####1%
+ \detokenize\expandafter{\expanded{.#4}}%
+ \noexpand\@nil{\def\noexpand\reserved@a{####1}}}\reserved@c
+ \expandafter\reserved@c\reserved@a\@nil
\@pushfilename
- \xdef\@currname{#1}%
+ \xdef\@currname{\string@makeletter\reserved@a}%
+ \xdef\@currpath{\ifx\reserved@b\@empty\else\reserved@b/\fi}%
\global\let\@currext#4%
+% \end{macrocode}
+% The command \cs{ver@\meta{file}.\meta{ext}} is used to signal that
+% a package is already loaded, either because it is in fact loaded, or
+% because it's loading was suppressed. In minimal installations, said
+% package may not exist but still have its loading suppressed with
+% \cs{ver@\meta{file}.\meta{ext}}, so before checking if the file
+% exists we have to check that we do need to load it with
+% \cs{@ifl@aded}. If we don't, then there's no point in checking for
+% a typo or load-disabling.
+% \begin{macrocode}
+ \@ifl@aded\@currext\@currname
+% \end{macrocode}
+% If the package is already loaded, check that there were no option
+% clashes:
+% \changes{v1.1b}{1998/05/07}
+% {Modify help message for latex/2805}
+% \begin{macrocode}
+ {\@if@ptions\@currext{\@currname}{#2}{}%
+ {\@latex@error
+ {Option clash for \@cls@pkg\space \@currname}%
+ {The package \@currname\space has already been loaded
+ with options:\MessageBreak
+ \space\space[\@ptionlist{\@currname.\@currext}]\MessageBreak
+ There has now been an attempt to load it
+ with options\MessageBreak
+ \space\space[#2]\MessageBreak
+ Adding the global options:\MessageBreak
+ \space\space
+ \@ptionlist{\@currname.\@currext},#2\MessageBreak
+ to your \noexpand\documentclass declaration may fix this.%
+ \MessageBreak
+ Try typing \space <return> \space to proceed.}}%
+ \@firstofone}%
+ {\makeatletter
+% \end{macrocode}
+% The next line seems to be necessary for 2.09 compatibility (the
+% way the code is written there) This seems questionable and should be
+% look at as in 2e it is definitely unnecessary at this point!
+% \begin{macrocode}
+ \@reset@ptions
+% \end{macrocode}
+% First we take the \meta{name} and \meta{ext} given in the argument
+% and check if the file exists, and issue an error otherwise asking
+% for a correction with \cs{@missingfileerror}. For checking if the
+% file exists we use \cs{@currpath} (usually empty) before
+% \cs{@currname}.
+% \begin{macrocode}
+ \IfFileExists{\@currpath\@currname.\@currext}{}%
+ {\@missing@onefilewithoptions{#2}}%
+% \end{macrocode}
+% If \cs{@currname} is empty (the user replied to the ``Enter file
+% name'' prompt with \meta{RETURN}), so stop here
+% (do \cs{@popfilename} to pop the item just added above).
+%
+% This \cs{@gobble} omits the date check at the end.
+% \begin{macrocode}
+ \ifx\@currname\@empty
+ \expandafter\@gobble
+ \else
+% \end{macrocode}
+% If the file exists, check if it was load-prevented, and otherwise
+% do the bookkeeping with \cs{@filehook@file@push}
+% then call \cs{set@curr@file} to set \cs{@curr@file} (and do any
+% required substitution), then actually load the class/package with
+% \cs{load@onefile@withoptions}. \cs{set@curr@file} also needs the
+% file path.
+% \begin{macrocode}
+ \@disable@packageload@do{\@currname.\@currext}%
+ {\@expl@@@filehook@file@push@@
+ \set@curr@file{\@currpath\@currname.\@currext}%
+ \@filehook@set@CurrentFile
+% \end{macrocode}
+% \changes{v1.3q}{2020/09/06}
+% {Save \cs{@currpkg@reqd} so that we don't lose track of
+% package substitutions.}
+% The \cs{set@curr@file} line above might have replaced the file, so
+% \cs{@currname} and \cs{@currext} may no longer hold the actual
+% package being loaded, so in that case we need to update these two
+% token lists (\cs{@curr@file} holds the file name after replacement,
+% so we parse that).
+%
+% The requested file is saved in \cs{@currpkg@reqd} to be used in
+% \cs{InputIfFileExists} later: if the updated \cs{@currname} and
+% \cs{@currext} are used we lose track of the substitution, so
+% \cs{CurrentFile} and \cs{CurrentFileUsed} will be (incorrectly)
+% the same.
+%
+% \changes{v1.3t}{2020-10-11}{Restore \cs{@currpkg@reqd} after
+% finished loading a package file (gh/408).}
+% \begin{macrocode}
+ \expandafter\@swaptwoargs\expandafter
+ {\expandafter{\@currpkg@reqd}}%
+ {% <
+% \end{macrocode}
+% \cs{@currpkg@reqd} doesn't take a path because it is used later to
+% assign \cs[no-index]{opt@...} and \cs[no-index]{ver@...}.
+% \begin{macrocode}
+ \edef\@currpkg@reqd{\@currname.\@currext}%
+ \ifx\CurrentFile\CurrentFileUsed
+ \else
+ \filename@parse\@curr@file
+ \edef\@currpath{\string@makeletter\filename@area}%
+ \edef\@currname{\string@makeletter\filename@base}%
+ \edef\@currext{\string@makeletter\filename@ext}%
+ \fi
+ \load@onefile@withoptions{#2}%
+ \def\@currpkg@reqd%{\@currpkg@reqd}
+ }% >
+% \end{macrocode}
+% Now just clean up and exit.
+% \begin{macrocode}
+ \@expl@@@filehook@file@pop@@}%
+ \expandafter\@firstofone
+ \fi}%
+% \end{macrocode}
+% Except in the case where \cs{@currname} is empty, the date is
+% checked against the date marked in the package file:
+% \begin{macrocode}
+ {\@ifl@ter\@currext{\@currname}{#3}{}%
+ {\@latex@warning@no@line
+ {You have requested,\on@line,
+ version\MessageBreak
+ `#3' of \@cls@pkg\space \@currname,\MessageBreak
+ but only version\MessageBreak
+ `\csname ver@\@currname.\@currext\endcsname'\MessageBreak
+ is available}}%
+% \end{macrocode}
+% \changes{v0.2c}{1993/11/17}
+% {Added trap for two \cs{LoadClass} commands.}
+% \begin{macrocode}
+ \ifx\@currext\@clsextension\let\LoadClass\@twoloadclasserror\fi}%
+ \@popfilename
+ \@reset@ptions}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\@currpkg@reqd\@empty
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@onlypreamble\@onefilewithoptions
+% \end{macrocode}
+%
+% The kernel no longer uses \cs{@unprocessedoptions}
+% \begin{macrocode}
+\let\@unprocessedoptions\@undefined
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@missing@onefilewithoptions}
+% Now the action taken when a file is not found. Path must be
+% included here as it eventually leads to a file lookup.
+% \begin{macrocode}
+\def\@missing@onefilewithoptions#1{%
+ \@missingfileerror{\@currpath\@currname}\@currext
+ \global\let\@currpath\@missingfile@area
+ \global\let\@currname\@missingfile@base
+ \global\let\@currext\@missingfile@ext}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\load@onefile@withoptions}
+% Now the code that actually does the file loading:
+% \begin{macrocode}
+\def\load@onefile@withoptions#1{%
\let\CurrentOption\@empty
\@reset@ptions
- \makeatletter
% \end{macrocode}
% Grab everything in a macro, so the parameter stack is popped before
% any processing begins.
% \changes{v0.2s}{1994/01/17}
% {Modify to reduce parameter stack usage}
-% \changes{v1.1b}{1998/05/07}
-% {Modify help message for latex/2805}
% \begin{macrocode}
\def\reserved@a{%
- \@ifl@aded\@currext{#1}%
- {\@if@ptions\@currext{#1}{#2}{}%
- {\@latex@error
- {Option clash for \@cls@pkg\space #1}%
- {The package #1 has already been loaded
- with options:\MessageBreak
- \space\space[\@ptionlist{#1.\@currext}]\MessageBreak
- There has now been an attempt to load it
- with options\MessageBreak
- \space\space[#2]\MessageBreak
- Adding the global options:\MessageBreak
- \space\space
- \@ptionlist{#1.\@currext},#2\MessageBreak
- to your \noexpand\documentclass declaration may fix this.%
- \MessageBreak
- Try typing \space <return> \space to proceed.}}}%
- {\@pass@ptions\@currext{#2}{#1}%
+ \@pass@ptions\@currext{#1}{\@currname}%
% \end{macrocode}
-% \changes{v0.3c}{1994/03/12}
-% {Do not use \cs{@pr@videpackage} to avoid typeout}
+% \changes{v1.3u}{2020/11/20}
+% {Copy option list to the requested package.}
% \begin{macrocode}
- \global\expandafter
- \let\csname ver@\@currname.\@currext\endcsname\@empty
+ \expandafter\let
+ \csname opt@\@currpkg@reqd\expandafter\endcsname
+ \csname opt@\@currname.\@currext\endcsname
+ \global\expandafter
+ \let\csname ver@\@currname.\@currext\endcsname\@empty
% \end{macrocode}
% We initialize \cs{...-h@@k} here and only if we load the file so that it
% remains undefined otherwise.
% \begin{macrocode}
- \expandafter\let\csname\@currname.\@currext-h@@k\endcsname\@empty
- \InputIfFileExists
- {\@currname.\@currext}%
- {}%
- {\@missingfileerror\@currname\@currext}%
+ \expandafter\let\csname\@currname.\@currext-h@@k\endcsname\@empty
% \end{macrocode}
-% |\@unprocessedoptions| will generate an error for each specified
-% option in a package unless a |\ProcessOptions| has appeared in the
-% package file.
+% When the current extension is \cs{@pkgextension} we are loading a
+% package otherwise, if it is \cs{@clsextension}, a class, so
+% depending on that we execute different hooks. If the extension is
+% neither, then it is another type of file without special hooks.
+% \begin{macrocode}
+%-----------------------------------------
+ \ifx\@currext\@pkgextension
+ \UseHook{package/before}%
+ \UseHook{package/before/\@currname}%
+ \else
+ \ifx\@currext\@clsextension
+ \UseHook{class/before}%
+ \UseHook{class/before/\@currname}%
+ \fi
+ \fi
+% \end{macrocode}
+% Now actually load the file (at this point we are certain it exists,
+% but use \cs{InputIfFileExists} so that file hooks are executed).
+% \cs{@currpath} is needed here too.
+% \begin{macrocode}
+ \InputIfFileExists{\@currpath\@currpkg@reqd}{}%
+ {\@latex@error
+ {The \@cls@pkg\space\@currpkg@reqd\space failed to load}\@ehd}%
+%-----------------------------------------
+% \end{macrocode}
+% In older versions of the code |\@unprocessedoptions| would
+% generate an error for each specified
+% option in a package unless a |\ProcessOptions| has appeared in the
+% package file.
% \changes{v0.2v}{1994/01/29}
% {All options raise error if no \cs{ProcessOptions} appears}
% \changes{v0.2x}{1994/02/02}
-% {Only run the hook and options check if the file was loaded.}
-% \begin{macrocode}
- \let\@unprocessedoptions\@@unprocessedoptions
+% {Only run the hook and options check if the file was
+% loaded.}
+%
+% This has changed in 2020. We now use a separate macro per package
+% to avoid interferences in case of nested packages. The whole
+% code for handling this issue (GitHub 22) was provided by Hironobu
+% Yamashita, thanks for that.
+% \changes{v1.3k}{2020/04/07}{Use different method to ignore
+% unprocessed options (gh/22)}
+% \begin{macrocode}
+ \expandafter\let\csname unprocessedoptions-\@currname.\@currext\endcsname
+ \@@unprocessedoptions
\csname\@currname.\@currext-h@@k\endcsname
\expandafter\let\csname\@currname.\@currext-h@@k\endcsname
\@undefined
- \@unprocessedoptions}%
% \end{macrocode}
-%
+% Catch the case where the packages has handled the options and
+% redefined \cs{@unprocessedoptions} to \cs{relax} (old interface).
+% In that case no error should be produced.
+% \changes{v1.3k}{2020/04/07}{Use different method to ignore
+% unprocessed options (gh/22)}
% \begin{macrocode}
- \@ifl@ter\@currext{#1}{#3}{}%
- {\@latex@warning@no@line
- {You have requested,\on@line,
- version\MessageBreak
- `#3' of \@cls@pkg\space #1,\MessageBreak
- but only version\MessageBreak
- `\csname ver@#1.\@currext\endcsname'\MessageBreak
- is available}}%
+ \ifx\@unprocessedoptions\relax
+ \let\@unprocessedoptions\@undefined
% \end{macrocode}
-% \changes{v0.2c}{1993/11/17}
-% {Added trap for two \cs{LoadClass} commands.}
+% Otherwise run the per package set of unused options.
% \begin{macrocode}
- \ifx\@currext\@clsextension\let\LoadClass\@twoloadclasserror\fi
- \@popfilename
- \@reset@ptions}%
- \reserved@a}
-\@onlypreamble\@onefilewithoptions
+ \else
+ \csname unprocessedoptions-\@currname.\@currext\endcsname
+ \fi
+% \end{macrocode}
+% In either case we drop the macro afterwards as it is no longer needed.
+% \begin{macrocode}
+ \expandafter\let
+ \csname unprocessedoptions-\@currname.\@currext\endcsname
+ \@undefined
+% \end{macrocode}
+% And same procedure, James, when we are finished loading, except
+% that the hook order is now reversed.
+% \begin{macrocode}
+%-----------------------------------------
+ \ifx\@currext\@pkgextension
+ \UseHook{package/after/\@currname}%
+ \UseHook{package/after}%
+ \else
+ \ifx\@currext\@clsextension
+ \UseHook{class/after/\@currname}%
+ \UseHook{class/after}%
+ \fi
+ \fi}%
+%-----------------------------------------
+ \@ifl@aded\@currext\@currname{}{\reserved@a}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@onefilewithoptions}{Hooks and unused options issue}%
+%<latexrelease>
+% \end{macrocode}
+% Because of the way \cs{@onfilewithoptions} is changed for
+% rollback handling below we have to define
+% \cs{load@onefilewithoptions} when rolling back!
+% \begin{macrocode}
+%<latexrelease>\def\load@onefilewithoptions#1[#2][#3]#4{%
+%<latexrelease> \@pushfilename
+%<latexrelease> \xdef\@currname{#1}%
+%<latexrelease> \global\let\@currext#4%
+%<latexrelease> \let\CurrentOption\@empty
+%<latexrelease> \@reset@ptions
+%<latexrelease> \makeatletter
+%<latexrelease> \def\reserved@a{%
+%<latexrelease> \@ifl@aded\@currext{#1}%
+%<latexrelease> {\@if@ptions\@currext{#1}{#2}{}%
+%<latexrelease> {\@latex@error
+%<latexrelease> {Option clash for \@cls@pkg\space #1}%
+%<latexrelease> {The package #1 has already been loaded
+%<latexrelease> with options:\MessageBreak
+%<latexrelease> \space\space[\@ptionlist{#1.\@currext}]\MessageBreak
+%<latexrelease> There has now been an attempt to load it
+%<latexrelease> with options\MessageBreak
+%<latexrelease> \space\space[#2]\MessageBreak
+%<latexrelease> Adding the global options:\MessageBreak
+%<latexrelease> \space\space
+%<latexrelease> \@ptionlist{#1.\@currext},#2\MessageBreak
+%<latexrelease> to your \noexpand\documentclass declaration may fix this.%
+%<latexrelease> \MessageBreak
+%<latexrelease> Try typing \space <return> \space to proceed.}}}%
+%<latexrelease> {\@pass@ptions\@currext{#2}{#1}%
+%<latexrelease> \global\expandafter
+%<latexrelease> \let\csname ver@\@currname.\@currext\endcsname\@empty
+%<latexrelease> \expandafter\let\csname\@currname.\@currext-h@@k\endcsname\@empty
+%<latexrelease> \InputIfFileExists
+%<latexrelease> {\@currname.\@currext}%
+%<latexrelease> {}%
+%<latexrelease> {\@missingfileerror\@currname\@currext}%
+%<latexrelease> \let\@unprocessedoptions\@@unprocessedoptions
+%<latexrelease> \csname\@currname.\@currext-h@@k\endcsname
+%<latexrelease> \expandafter\let\csname\@currname.\@currext-h@@k\endcsname
+%<latexrelease> \@undefined
+%<latexrelease> \@unprocessedoptions}%
+%<latexrelease> \@ifl@ter\@currext{#1}{#3}{}%
+%<latexrelease> {\@latex@warning@no@line
+%<latexrelease> {You have requested,\on@line,
+%<latexrelease> version\MessageBreak
+%<latexrelease> `#3' of \@cls@pkg\space #1,\MessageBreak
+%<latexrelease> but only version\MessageBreak
+%<latexrelease> `\csname ver@#1.\@currext\endcsname'\MessageBreak
+%<latexrelease> is available}}%
+%<latexrelease> \ifx\@currext\@clsextension\let\LoadClass\@twoloadclasserror\fi
+%<latexrelease> \@popfilename
+%<latexrelease> \@reset@ptions}%
+%<latexrelease> \reserved@a}
+%<latexrelease>
+%<latexrelease>\let \load@onefile@withoptions \@undefined
+%<latexrelease>\let \@missing@onefilewithoptions \@undefined
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
+%
+%
+%
+%
+%
% \begin{macro}{\@@fileswith@pti@ns}
% Save the definition (for error checking).
% \changes{v0.2c}{1993/11/17}
@@ -1593,9 +2241,12 @@
% \end{macrocode}
% \end{macro}
%
+%
+%
+%
% \subsection{Hooks}
%
-% Allow code do be saved to be executed at specific later times.
+% Allow code to be saved to be executed at specific later times.
%
% Save things in macros, I considered using toks registers, (and
% |\addto@hook| from the NFSS code, that would require stacking the
@@ -1615,25 +2266,6 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\g@addto@macro}
-% Globally add to the end of a macro.
-% \changes{v0.2a}{1993/11/14}{Made global}
-% \changes{v0.2w}{1994/01/31}
-% {Use toks register to avoid `hash' problems}
-% \changes{v1.0o}{1995/05/17}
-% {Make long for latex/1522}
-% \changes{v1.0w}{1996/12/17}
-% {Use \cs{begingroup} to save making a mathord}
-% \changes{v1.0x}{1997/02/05}
-% {missing percent /2402}
-% \begin{macrocode}
-\long\def\g@addto@macro#1#2{%
- \begingroup
- \toks@\expandafter{#1#2}%
- \xdef#1{\the\toks@}%
- \endgroup}
-% \end{macrocode}
-% \end{macro}
%
% \begin{macro}{\AtEndOfPackage}
% \begin{macro}{\AtEndOfClass}
@@ -1652,8 +2284,29 @@
% \end{macrocode}
%
% \begin{macrocode}
-\DeclareRobustCommand\AtBeginDocument{\g@addto@macro\@begindocumenthook}
-\DeclareRobustCommand\AtEndDocument{\g@addto@macro\@enddocumenthook}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\AtBeginDocument}{Use hook system}%
+\DeclareRobustCommand\AtBeginDocument{\AddToHook{begindocument}}
+\DeclareRobustCommand\AtEndDocument {\AddToHook{enddocument}}
+%\DeclareRobustCommand\AtEndDocument {\AddToHook{env/document/end}} % alternative impl
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\AtBeginDocument}{Use hook system}%
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand\AtBeginDocument{\g@addto@macro\@begindocumenthook}
+%<latexrelease>\DeclareRobustCommand\AtEndDocument{\g@addto@macro\@enddocumenthook}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+% \begin{macrocode}
\@onlypreamble\AtBeginDocument
% \end{macrocode}
% \end{macro}
@@ -1760,6 +2413,7 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{environment}{filecontents}
% \begin{macro}{\filecontents}
% \begin{macro}{\endfilecontents}
% This environment implements inline files.
@@ -1776,17 +2430,16 @@
% \changes{v1.0m}{1995/04/21}
% {Close input check stream: latex/1487}
% \changes{v1.0p}{1995/05/25}{Delete \cs{filec@ntents} after preamble}
-% \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}
% \changes{v1.3f}{2020/01/05}{Support more write streams in LuaTeX gh/238}
-%
+% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2019/10/01}%
-%<latexrelease> {\filec@ntents}{Spaces in file names + optional arg}%
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\filec@ntents}{Define \q@curr@file directly (gh/220)}%
%
% \end{macrocode}
% We use |@tempswa| to mean no preamble writing and reuse |@filesw|
@@ -1817,7 +2470,7 @@
\filec@ntents
}
% \end{macrocode}
-% Option \texttt{force}) (or \texttt{overwrite}) changes the
+% Option \texttt{force} (or \texttt{overwrite}) changes the
% overwriting switch
% \begin{macrocode}
\let\filec@ntents@force\@fileswfalse
@@ -1829,7 +2482,7 @@
\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.
+% the whole \TeX{} tree for the existence of the file to write.
% \begin{macrocode}
\def\filec@ntents@nosearch{%
\let\filec@ntents@checkdir\@currdir
@@ -1855,10 +2508,12 @@
\catcode`\^^I\active%
% \end{macrocode}
%
+% \changes{v1.3m}{2020-08-08}{define \cs{q@curr@file} directly as the
+% quotes have already been removed (gh/220)}
% \begin{macrocode}
\gdef\filec@ntents#1{%
\set@curr@file{\filec@ntents@checkdir#1}%
- \edef\q@curr@file{\expandafter\quote@name\expandafter{\@curr@file}}%
+ \edef\q@curr@file{"\@curr@file"}%
% \end{macrocode}
%
% Lua\TeX\ has more writes (and 18 is safe here).
@@ -2019,6 +2674,136 @@
% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\filec@ntents}{Spaces in file names + optional arg}%
+%<latexrelease>\def\filecontents{\@tempswatrue\@fileswtrue
+%<latexrelease> \@ifnextchar[\filec@ntents@opt\filec@ntents
+%<latexrelease>}
+%<latexrelease>\@namedef{filecontents*}{\@tempswafalse\@fileswtrue
+%<latexrelease> \@ifnextchar[\filec@ntents@opt\filec@ntents
+%<latexrelease>}
+%<latexrelease>\def\filec@ntents@opt[#1]{%
+%<latexrelease> \edef\@fortmp{\zap@space#1 \@empty}%
+%<latexrelease> \@for\reserved@a:=\@fortmp\do{%
+%<latexrelease> \ifcsname filec@ntents@\reserved@a\endcsname
+%<latexrelease> \csname filec@ntents@\reserved@a\endcsname
+%<latexrelease> \else
+%<latexrelease> \@latex@error{Unknown filecontents option \reserved@a}%
+%<latexrelease> {Valid options are force (or overwrite), nosearch, noheader}%
+%<latexrelease> \fi}%
+%<latexrelease> \filec@ntents
+%<latexrelease>}
+%<latexrelease>\let\filec@ntents@force\@fileswfalse
+%<latexrelease>\let\filec@ntents@overwrite\@fileswfalse % alternative name
+%<latexrelease>\let\filec@ntents@noheader\@tempswafalse
+%<latexrelease>\def\filec@ntents@nosearch{%
+%<latexrelease> \let\filec@ntents@checkdir\@currdir
+%<latexrelease> \def\filec@ntents@where{in current directory}}
+%<latexrelease>\let\filec@ntents@checkdir\@empty
+%<latexrelease>\def\filec@ntents@where{exists on the system}
+%<latexrelease>\begingroup%
+%<latexrelease>\@tempcnta=1
+%<latexrelease>\loop
+%<latexrelease> \catcode\@tempcnta=12 %
+%<latexrelease> \advance\@tempcnta\@ne %
+%<latexrelease>\ifnum\@tempcnta<32 %
+%<latexrelease>\repeat %
+%<latexrelease>\catcode`\*=11 %
+%<latexrelease>\catcode`\^^M\active%
+%<latexrelease>\catcode`\^^L\active\let^^L\relax%
+%<latexrelease>\catcode`\^^I\active%
+%<latexrelease>\gdef\filec@ntents#1{%
+%<latexrelease> \set@curr@file{\filec@ntents@checkdir#1}%
+%<latexrelease> \edef\q@curr@file{\expandafter\quote@name\expandafter{\@curr@file}}%
+%<latexrelease> \chardef\reserved@c\ifx\directlua\@undefined 15 \else 127 \fi%
+%<latexrelease> \openin\@inputcheck\q@curr@file \space %
+%<latexrelease> \ifeof\@inputcheck%
+%<latexrelease> \@latex@warning@no@line%
+%<latexrelease> {Writing file `\@currdir\@curr@file'}%
+%<latexrelease> \ch@ck7\reserved@c\write\relax%
+%<latexrelease> \immediate\openout\reserved@c\q@curr@file\relax%
+%<latexrelease> \else%
+%<latexrelease> \if@filesw%
+%<latexrelease> \@latex@warning@no@line%
+%<latexrelease> {File `\@curr@file' already \filec@ntents@where.\MessageBreak%
+%<latexrelease> Not generating it from this source}%
+%<latexrelease> \let\write\@gobbletwo%
+%<latexrelease> \let\closeout\@gobble%
+%<latexrelease> \else%
+%<latexrelease> \edef\reserved@a{#1}%
+%<latexrelease> \edef\reserved@a{\detokenize\expandafter{\reserved@a}}%
+%<latexrelease> \edef\reserved@b{\detokenize\expandafter{\jobname}}%
+%<latexrelease> \ifx\reserved@a\reserved@b%
+%<latexrelease> \@fileswtrue%
+%<latexrelease> \else%
+%<latexrelease> \edef\reserved@b{\reserved@b\detokenize{.tex}}%
+%<latexrelease> \ifx\reserved@a\reserved@b
+%<latexrelease> \@fileswtrue%
+%<latexrelease> \fi%
+%<latexrelease> \fi%
+%<latexrelease> \ch@ck7\reserved@c\write\relax%
+%<latexrelease> \if@filesw% % Foul ... trying to overwrite \jobname!
+%<latexrelease> \@latex@error{Trying to overwrite `\jobname.tex'}{You can't %
+%<latexrelease> write to the file you are reading from!\MessageBreak%
+%<latexrelease> Data is written to screen instead.}%
+%<latexrelease> \else%
+%<latexrelease> \@latex@warning@no@line%
+%<latexrelease> {Writing or overwriting file `\@currdir\@curr@file'}%
+%<latexrelease> \immediate\openout\reserved@c\q@curr@file\relax%
+%<latexrelease> \fi%
+%<latexrelease> \fi%
+%<latexrelease> \fi%
+%<latexrelease> \closein\@inputcheck%
+%<latexrelease> \if@tempswa%
+%<latexrelease> \immediate\write\reserved@c{%
+%<latexrelease> \@percentchar\@percentchar\space%
+%<latexrelease> \expandafter\@gobble\string\LaTeX2e file `\@curr@file'^^J%
+%<latexrelease> \@percentchar\@percentchar\space generated by the %
+%<latexrelease> `\@currenvir' \expandafter\@gobblefour\string\newenvironment^^J%
+%<latexrelease> \@percentchar\@percentchar\space from source `\jobname' on %
+%<latexrelease> \number\year/\two@digits\month/\two@digits\day.^^J%
+%<latexrelease> \@percentchar\@percentchar}%
+%<latexrelease> \fi%
+%<latexrelease> \let\do\@makeother\dospecials%
+%<latexrelease> \count@ 128\relax%
+%<latexrelease> \loop%
+%<latexrelease> \catcode\count@ 11\relax%
+%<latexrelease> \advance\count@ \@ne%
+%<latexrelease> \ifnum\count@<\@cclvi%
+%<latexrelease> \repeat%
+%<latexrelease> \edef\E{\@backslashchar end\string{\@currenvir\string}}%
+%<latexrelease> \edef\reserved@b{%
+%<latexrelease> \def\noexpand\reserved@b%
+%<latexrelease> ####1\E####2\E####3\relax}%
+%<latexrelease> \reserved@b{%
+%<latexrelease> \ifx\relax##3\relax%
+%<latexrelease> \immediate\write\reserved@c{##1}%
+%<latexrelease> \else%
+%<latexrelease> \edef^^M{\noexpand\end{\@currenvir}}%
+%<latexrelease> \ifx\relax##1\relax%
+%<latexrelease> \else%
+%<latexrelease> \@latex@warning{Writing text `##1' before %
+%<latexrelease> \string\end{\@currenvir}\MessageBreak as last line of \@curr@file}%
+%<latexrelease> \immediate\write\reserved@c{##1}%
+%<latexrelease> \fi%
+%<latexrelease> \ifx\relax##2\relax%
+%<latexrelease> \else%
+%<latexrelease> \@latex@warning{%
+%<latexrelease> Ignoring text `##2' after \string\end{\@currenvir}}%
+%<latexrelease> \fi%
+%<latexrelease> \fi%
+%<latexrelease> ^^M}%
+%<latexrelease> \catcode`\^^L\active%
+%<latexrelease> \let\L\@undefined%
+%<latexrelease> \def^^L{\expandafter\ifx\csname L\endcsname\relax\fi ^^J^^J}%
+%<latexrelease> \catcode`\^^I\active%
+%<latexrelease> \let\I\@undefined%
+%<latexrelease> \def^^I{\expandafter\ifx\csname I\endcsname\relax\fi\space}%
+%<latexrelease> \catcode`\^^M\active%
+%<latexrelease> \edef^^M##1^^M{%
+%<latexrelease> \noexpand\reserved@b##1\E\E\relax}}%
+%<latexrelease>\endgroup%
+%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\filec@ntents}{Spaces in file names + optional arg}%
%<latexrelease>
@@ -2142,6 +2927,7 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{environment}
%
%
%
@@ -2642,19 +3428,20 @@
% A similar error is given if global rollback date and min-date on
% a specific package conflict with each other, but that case is
% happens only once so it is inlined.
+% \changes{v1.3u}{2020/11/09}{Change help text because the package may have
+% existed then --- there is just no rollback data (gh/423).}
% \begin{macrocode}
\def\pkgcls@rollbackdate@error#1{%
\@latex@error{Suspicious rollback date given}%
- {The \@cls@pkg\space'\@currname' claims that it
- came into existence on #1 which\MessageBreak
+ {The \@cls@pkg\space'\@currname' has no rollback data
+ before #1 which\MessageBreak
is after your requested rollback date --- so
- something is wrong here.\MessageBreak
+ something may be wrong here.\MessageBreak
Continue and we use the earliest known release.}}
% \end{macrocode}
% \end{macro}
%
%
-%
% \begin{macro}{\DeclareCurrentRelease}
% This declares the date (and possible name) of the current version
% of a package or class.
@@ -2763,7 +3550,7 @@
%<*afterpreamble>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{pkgindoc}
- [1994/10/20 v1.1 Package Interface in Document (DPC)]
+ [2020-08-08 v1.3m Package Interface in Document (DPC)]
\def\reserved@a#1\do\@classoptionslist#2\do\filec@ntents#3\relax{%
\gdef\@preamblecmds{#1#3}}
\expandafter\reserved@a\@preamblecmds\relax
diff --git a/Master/texmf-dist/source/latex/base/ltdefns.dtx b/Master/texmf-dist/source/latex/base/ltdefns.dtx
index 303b9e5604b..920c1acde6d 100644
--- a/Master/texmf-dist/source/latex/base/ltdefns.dtx
+++ b/Master/texmf-dist/source/latex/base/ltdefns.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltdefns.dtx}
- [2020/02/27 v1.5g LaTeX Kernel (definition commands)]
+ [2020/11/25 v1.5o LaTeX Kernel (definition commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltdefns.dtx}
@@ -90,6 +90,7 @@
% \changes{v1.0p}{1995/07/13}{Updates to documentation}
% \changes{v1.4b}{2015/02/21}
% {Removed autoload support}
+% \changes{v1.5l}{2020/08/21}{Integration of new hook management interface}
%
% \section{Definitions}
%
@@ -101,6 +102,7 @@
%<*2ekernel>
% \end{macrocode}
%
+%
% \subsection{Initex initialisations}
%
% \task{???}{This section needs extension}
@@ -118,9 +120,25 @@
%
% \begin{macro}{\typeout}
% Display something on the terminal.
+% \changes{v1.5g}{2020/05/15}{Allow \cs{par} in the argument (gh/335)}
% \begin{macrocode}
-\def\typeout#1{\begingroup\set@display@protect
- \immediate\write\@unused{#1}\endgroup}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\typeout}{Allow "par" in \typeout}%
+\protected\long\def\typeout#1{\begingroup
+ \set@display@protect
+ \def\par{^^J^^J}%
+ \immediate\write\@unused{#1}\endgroup}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\typeout}{Allow "par" in \typeout}%
+%<latexrelease>
+%<latexrelease>\def\typeout#1{\begingroup\set@display@protect
+%<latexrelease> \immediate\write\@unused{#1}\endgroup}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -366,8 +384,20 @@
%
% \begin{macro}{\@carcube}
% |\@carcube T1 ... Tn\@nil| = |T1| |T2| |T3| , $n > 3$
+% \changes{v1.5k}{2020/08/19}{Made \cs{long} for \cs{NewCommandCopy}}
+% \changes{v1.5o}{2020/11/25}{Added missing latexrelease entry}
% \begin{macrocode}
-\def\@carcube#1#2#3#4\@nil{#1#2#3}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020/10/01}{\@carcube}{Make \@carcube long}%
+%<*2ekernel|latexrelease>
+\long\def\@carcube#1#2#3#4\@nil{#1#2#3}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%
+%<latexrelease>\IncludeInRelease{0000/00/00}{\@carcube}{Undo: Make \@carcube long}%
+%<latexrelease>\def\@carcube#1#2#3#4\@nil{#1#2#3}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -645,7 +675,7 @@
% \begin{macro}{\@ifdefinable}
% \begin{macro}{\@@ifdefinable}
% \begin{macro}{\@rc@ifdefinable}
-% Test is user is allowed to define a command.
+% Test if user is allowed to define a command.
% \begin{macrocode}
\long\def\@ifdefinable #1#2{%
\edef\reserved@a{\expandafter\@gobble\string #1}%
@@ -980,7 +1010,7 @@
% evaluates its argument fully.
% \end{itemize}
% The method \LaTeX{} uses for making fragile commands robust is to
-% precede them with |\protect|. This can have one of five possible
+% precede them with |\protect|. This can have one of four possible
% values:
% \begin{itemize}
% \item |\relax|, for normal typesetting. So |\protect\foo| will
@@ -1174,6 +1204,8 @@
% \changes{v1.4a}{2015/01/08}{Added macro}
% \changes{v1.5f}{2019/08/27}{Make the assignments global as we may
% need to apply them inside a group}
+% \changes{v1.5m}{2020/08/21}{Make \cs{MakeRobust} produce the same
+% command structure as \cs{DeclareRobustCommand}}
%
% 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
@@ -1192,9 +1224,11 @@
% at all.
% \begin{macrocode}
%</2ekernel>
-%<latexrelease>\IncludeInRelease{2019/10/01}{\MakeRobust}{\MakeRobust}%
+%<latexrelease>\IncludeInRelease{2020/10/01}{\MakeRobust}{\MakeRobust}%
%<*2ekernel|latexrelease>
\def\MakeRobust#1{%
+ \count@=\escapechar
+ \escapechar=`\\
\@ifundefined{\expandafter\@gobble\string#1}{%
\@latex@error{The control sequence `\string#1' is undefined!%
\MessageBreak There is nothing here to make robust}%
@@ -1206,12 +1240,15 @@
% \verb*=\foo =. If it is already defined do nothing, otherwise set
% \verb*=\foo = equal to \verb*=\foo= and redefine \verb*=\foo= so
% that it acts like a macro defined with \verb=\DeclareRobustCommand=.
+% We use \cs{@kernel@rename@newcommand} to copy \verb*=\foo= over to
+% \verb*=\foo =, including a possible default optional argument.
% \begin{macrocode}
{%
\@ifundefined{\expandafter\@gobble\string#1\space}%
{%
- \global\expandafter\let\csname
- \expandafter\@gobble\string#1\space\endcsname=#1%
+ \expandafter\@kernel@rename@newcommand
+ \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}%
@@ -1223,10 +1260,72 @@
\csname\expandafter\@gobble\string#1\space\endcsname}%
}%
{\@latex@info{The control sequence `\string#1' is already robust}}%
- }%
+ }%
+ \escapechar=\count@
}%
+% \end{macrocode}
+%
+% \begin{macro}{\@kernel@rename@newcommand}
+% This macro renames a command, possibly with an optional argument (defined
+% with \cs{newcommand}) from |#2| to |#1|, by renaming the internal macro
+% \verb=\\#2= to \verb=\\#1= and defining \verb=\#1= appropriately, then
+% undefining \verb=\#2= and \verb=\\#2=. The \cs{afterassignment} trick is
+% to make both definitions in \cs{@copy@newcommand} global (which are local
+% by default).
+%
+% In case the macro was defined with \cs{newcommand} and an optional
+% argument, to replicate exactly the behaviour of \cs{DeclareRobustCommand}
+% we have to move also the internal \verb*=\\foo= to \verb*=\\foo =. In that
+% case, \verb=#1= will be a parameterless macro (\cs{robust@command@chk@safe}
+% checks that), and \cs{@if@newcommand} will return true (both defined below
+% in this file). If so, we can use \cs{@copy@newcommand} rather than plain
+% \cs{let} to copy the command over. \cs{@kernel@rename@newcommand} does
+% this test and carries out the renaming.
+% \begin{macrocode}
+\def\@kernel@rename@newcommand#1#2{%
+ \robust@command@chk@safe#2%
+ {\@if@newcommand#2%
+ {\afterassignment\global
+ \global\@copy@newcommand#1#2%
+ \global\let#2\@undefined
+ \global\expandafter\let\csname\string#2\endcsname\@undefined}%
+ {\global\let#1=#2}}%
+ {\global\let#1=#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%
+%<latexrelease>\IncludeInRelease{2019/10/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> \global\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> \xdef#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>\let\@kernel@rename@newcommand\@undefined
+%<latexrelease>\EndIncludeInRelease
+%
%<latexrelease>\IncludeInRelease{2015/01/01}{\MakeRobust}{\MakeRobust}%
%<latexrelease>\def\MakeRobust#1{%
%<latexrelease> \@ifundefined{\expandafter\@gobble\string#1}{%
@@ -1252,17 +1351,17 @@
%<latexrelease> {\@latex@info{The control sequence `\string#1' is already robust}}%
%<latexrelease> }%
%<latexrelease>}%
+%<latexrelease>\let\@kernel@rename@newcommand\@undefined
%<latexrelease>\EndIncludeInRelease
+%
%<latexrelease>\IncludeInRelease{0000/00/00}{\MakeRobust}{\MakeRobust}%
%<latexrelease>\let\MakeRobust\@undefined
+%<latexrelease>\let\@kernel@rename@newcommand\@undefined
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
% \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
@@ -1276,7 +1375,7 @@
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease> {\kernel@make@fragile}{Undo robustness}%
\def\kernel@make@fragile#1{%
\@ifundefined{\expandafter\@gobble\string#1\space}%
@@ -1285,16 +1384,39 @@
% \begin{macrocode}
{}%
% \end{macrocode}
-% Otherwise copy \verb*=\foo = back to \verb=\foo= and then undefine
-% the payload command.
+% Otherwise copy \verb*=\foo = back to \verb=\foo=.
+% Then use \cs{@kernel@rename@newcommand} to check and copy
+% \verb*=\\foo = back to \verb*=\\foo= in case the command has an optional
+% argument. If so, also undefine \verb*=\\foo =, and at the end undefine
+% \verb*=\foo =.
% \begin{macrocode}
{%
\global\expandafter\let\expandafter #1\csname
- \expandafter\@gobble\string#1\space\endcsname
+ \expandafter\@gobble\string#1\space\endcsname
+ \expandafter\@kernel@rename@newcommand
+ \csname\expandafter\@gobble\string#1\expandafter\endcsname
+ \csname\expandafter\@gobble\string#1\space\endcsname
\global\expandafter\let\csname
- \expandafter\@gobble\string#1\space\endcsname\@undefined
+ \expandafter\@gobble\string#1\space\endcsname\@undefined
}%
}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\kernel@make@fragile}{Undo robustness}%
+%<latexrelease>\def\kernel@make@fragile#1{%
+%<latexrelease> \@ifundefined{\expandafter\@gobble\string#1\space}%
+%<latexrelease> {}%
+%<latexrelease> {%
+%<latexrelease> \global\expandafter\let\expandafter #1\csname
+%<latexrelease> \expandafter\@gobble\string#1\space\endcsname
+%<latexrelease> \global\expandafter\let\csname
+%<latexrelease> \expandafter\@gobble\string#1\space\endcsname\@undefined
+%<latexrelease> }%
+%<latexrelease>}
%<latexrelease>\EndIncludeInRelease
%</2ekernel|latexrelease>
%<*2ekernel>
@@ -1302,6 +1424,552 @@
% \end{macro}
%
%
+% \subsection{Acting on robust commands}
+%
+% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020-10-01}{\robust@command@act}
+%<latexrelease> {Add \robust@command@act}%
+%<*2ekernel|latexrelease>
+% \end{macrocode}
+%
+% With most document level commands being robust now there is more of a
+% requirement to have a standard way of aliasing (or copying) a command to a
+% new name, for example to save an original definition before changing a
+% command. \cs{DeclareCommandCopy} is analogous to \TeX's \cs{let}, except
+% that it copes with the different types of robust commands defined by
+% \LaTeX's mechanisms.
+%
+% A couple of ``types of robustness'' are defined by the \LaTeXe{} kernel,
+% namely robust commands defined with \cs{DeclareRobustCommand} and commands
+% with optional arguments defined with \cs{newcommand}. However there are
+% other types of robust commands that are frequently used, which are not
+% defined in the \LaTeXe{} kernel, like commands defined with
+% \textsf{xparse}'s \cs{NewDocumentCommand} and \textsf{etoolbox}'s
+% \cs{newrobustcmd}.
+%
+% In this section we will define a generic extensible machinery to act on
+% robust commands. This code will then be used to test if a command is
+% robust, considered the different types of robustness, and then either copy
+% that definition, if \cs{DeclareCommandCopy} (or similar) is used, or show
+% the definition of the command, if \cs{ShowCommmand} is used.
+%
+% \begin{macro}{\robust@command@act}
+% \changes{v1.5k}{2020/08/19}{Made \cs{robust@command@act}
+% (was \cs{declare@command@copy}) more generic}
+%
+% The looping machinery is generic and knows nothing about what is to be done
+% for each case. The syntax of the main macro \cs{robust@command@act} is:
+% \begin{quote}
+% |\robust@command@act|\meta{action-list}\meta{robust-cmd}\\
+% \meta{fallback-action}\meta{act-arg}
+% \end{quote}
+% \meta{action-list} is a token list of the form:
+% \begin{quote}
+% |{|\meta{if-type-1} \meta{act-type-1}|}|\\
+% |{|\meta{if-type-2} \meta{act-type-2}|}|\\
+% \ldots
+% \end{quote}
+% \cs{robust@command@act} will iterate over the \meta{action-list}, evaluating
+% each \meta{if-type-$n$}\meta{robust-cmd}|{|\meta{true}|}{|\meta{false}|}|.
+% If the \meta{if-type-$n$} conditional returns \meta{true}, then
+% \meta{act-type-$n$}\meta{act-arg} is executed, and the loop ends. If the
+% conditional returns \meta{false}, then \meta{if-type-$n+1$} is executed in
+% the same way, until either one of the conditionals return \meta{true}, or
+% the end of the \meta{action-list} is reached. If the end is reached, then
+% \meta{fallback-action}\meta{act-arg} is executed before
+% \cs{robust@command@act} exits.
+%
+% \cs{robust@command@act} will start by using \cs{robust@command@act@chk@args}
+% to check if the \meta{robust-cmd} (|#2|) is a parameterless (possibly
+% \cs{protected}) macro. If it is not, the command is not a robust command:
+% these always start with a parameterless user-level macro; in that case,
+% \cs{robust@command@act@end} is used to short-circuit the process and do the
+% \meta{fallback-action} (|#3|). This first test is necessary because later
+% on we need to be able to expand the \meta{robust-cmd} without the risk of it
+% Breaking Badly, and as a bonus, this speeds up the process in case we used
+% \cs{NewCommandCopy} in a ``normal'' macro.
+% \begin{macrocode}
+\long\def\robust@command@act#1#2#3#4{%
+ \robust@command@chk@safe#2%
+ {\expandafter\robust@command@act@loop
+ \expandafter#2%
+ #1{\@nnil\@nnil}%
+ \robust@command@act@end}%
+ {\robust@command@act@end}%
+ {#3}{#4}}%
+% \end{macrocode}
+%
+% \begin{macro}{\robust@command@act@loop}
+% \begin{macro}{\robust@command@act@loop@aux}
+% \begin{macro}{\robust@command@act@do}
+% If \cs{robust@command@act@chk@args} branched to false, then
+% \cs{robust@command@act@loop} will loop over the list of items in the
+% \meta{action-list} (|#1|), and process each item as described earlier.
+% If the \meta{if-type-$n$} command expands to \meta{true} then
+% \cs{robust@command@act@do} is used to execute \meta{act-type-$n$} on the
+% \meta{act-arg}, otherwise the loop resumes with the next item.
+% \begin{macrocode}
+\long\def\robust@command@act@loop#1#2{\robust@command@act@loop@aux#1#2}
+\long\def\robust@command@act@loop@aux#1#2#3{%
+ \ifx\@nnil#2%
+ \else
+ #2{#1}%
+ {\robust@command@act@do{#3}}%
+ {\expandafter\robust@command@act@loop\expandafter#1}%
+ \fi}
+\long\def\robust@command@act@do#1%
+ \fi#2%
+ \robust@command@act@end#3#4{%
+ \fi
+ #1#4}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\robust@command@act@end}
+% If the end is reached and no action was taken, then do
+% \meta{fallback-action}\meta{act-arg}.
+% \begin{macrocode}
+\long\def\robust@command@act@end#1#2{#1#2}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\robust@command@chk@safe}
+% \begin{macro}{\robust@command@act@chk@args}
+% \begin{macrocode}
+\long\def\robust@command@chk@safe#1{%
+ \begingroup
+ \escapechar=`\\
+ \expandafter\endgroup\expandafter
+ \robust@command@act@chk@args\meaning#1:->\@nil}
+\def\robust@command@act@chk@args#1:->#2\@nil{%
+ \@expl@str@if@eq@@nnTF{#1}{macro}%
+ {\@firstoftwo}%
+ {\@expl@str@if@eq@@nnTF{#1}{\protected macro}%
+ {\@firstoftwo}%
+ {\@secondoftwo}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000-00-00}{\robust@command@act}
+%<latexrelease> {Add \robust@command@act}%
+%<latexrelease>\let\robust@command@act\@undefined
+%<latexrelease>\let\robust@command@act@loop\@undefined
+%<latexrelease>\let\robust@command@act@loop@aux\@undefined
+%<latexrelease>\let\robust@command@act@do\@undefined
+%<latexrelease>\let\robust@command@act@end\@undefined
+%<latexrelease>\let\robust@command@chk@safe\@undefined
+%<latexrelease>\let\robust@command@act@chk@args\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+% \subsubsection{Copying robust commands}
+%
+% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020-10-01}{\DeclareCommandCopy}
+%<latexrelease> {Add \NewCommandCopy, \RenewCommandCopy, and \DeclareCommandCopy}%
+%<*2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macro}{\NewCommandCopy}
+% \begin{macro}{\RenewCommandCopy}
+% \begin{macro}{\DeclareCommandCopy}
+% \changes{v1.5j}{2020/05/09}{Added \cs{DeclareCommandCopy} (gh/239)}
+%
+% \cs{NewCommandCopy} starts by checking if \verb=#1= is already defined, and
+% raises an error if so, otherwise the definition is carried out.
+% \cs{RenewCommandCopy} does (almost) the opposite. If the command is
+% \emph{not} defined, then an error is raised. But the definition is carried
+% out anyhow, so the behaviour is consistent with \cs{renewcommand}.
+%
+% A \cs{ProvideCommandCopy} isn't defined because it's not reasonably useful.
+% \verb=\provide...= commands mean ``define this if there's no other
+% definition'', but copying a command (usually) implies that the command being
+% copied is defined, so \cs{ProvideCommandCopy} doesn't make a lot of sense.
+% But more importantly, the most common use case of copying a command is to
+% redefine it later, while preserving the old definition, as in:
+% \begin{verbatim}
+% \ProvideComandCopy \A \B
+% \renewcommand \B { ... \A ... }
+% \end{verbatim}
+% then, if \verb=\A= is already defined the first line is skipped, an in this
+% case \verb=\B= won't work as expected.
+%
+% The three versions call the internal \cs{declare@commandcopy} with the
+% proper action. \cs{@firstofone} will carry out the copy. The only case
+% when the copy is not made is the \meta{false} case for \cs{NewCommandCopy},
+% in which the command already exists and the definition is aborted.
+% \begin{macrocode}
+\def\NewCommandCopy{%
+ \declare@commandcopy
+ {\@firstofone}%
+ {\@firstoftwo\@notdefinable}}
+\def\RenewCommandCopy{%
+ \declare@commandcopy
+ {\@latex@error{Command \@backslashchar\reserved@a\space undefined}\@ehc
+ \@firstofone}%
+ {\@firstofone}}
+\def\DeclareCommandCopy{%
+ \declare@commandcopy
+ {\@firstofone}%
+ {\@firstofone}}
+% \end{macrocode}
+%
+% \begin{macro}{\declare@commandcopy}
+% Start by checking if the command is already defined. The proper action is
+% taken by each specific command above. If all's good, then
+% \cs{robust@command@act} is called with the proper arguments as described
+% earlier, with \cs{@declarecommandcopylisthook} as the \meta{action-list} and
+% \cs{declare@commandcopy@let} as the \meta{fallback-action}.
+% \begin{macrocode}
+\long\def\declare@commandcopy#1#2#3#4{%
+ \edef\reserved@a{\@expl@cs@to@str@@N#3}%
+ \@ifundefined\reserved@a{#1}{#2}%
+ {\robust@command@act
+ \@declarecommandcopylisthook#4%
+ \declare@commandcopy@let{#3#4}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@declarecommandcopylisthook}
+% The initial definition of \cs{@declarecommandcopylisthook} contains the
+% tests for the two types of robust command in the kernel.
+% \begin{macrocode}
+\def\@declarecommandcopylisthook{%
+ {\@if@DeclareRobustCommand \@copy@DeclareRobustCommand}%
+ {\@if@newcommand \@copy@newcommand}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\declare@commandcopy@let}
+% The initial definition of \cs{@declarecommandcopylisthook} contains the
+% tests for the two types of robust command in the kernel.
+% \begin{macrocode}
+\long\def\declare@commandcopy@let#1#2{\let#1=#2\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% Now the rollback code.
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000-00-00}{\DeclareCommandCopy}
+%<latexrelease> {Undefine \NewCommandCopy, \RenewCommandCopy, and \DeclareCommandCopy}%
+%<latexrelease>\let\NewCommandCopy\@undefined
+%<latexrelease>\let\RenewCommandCopy\@undefined
+%<latexrelease>\let\DeclareCommandCopy\@undefined
+%<latexrelease>\let\declare@commandcopy\@undefined
+%<latexrelease>\let\@declarecommandcopylisthook\@undefined
+%<latexrelease>\let\declare@commandcopy@let\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{Showing robust commands}
+%
+% \begin{macro}{\ShowCommand}
+% \changes{v1.5k}{2020/08/19}{Added \cs{ShowCommand} (gh/373)}
+%
+% Most of the machinery defined for \cs{NewCommandCopy} can be used to show
+% the definition of a robust command, in a similar fashion to \texttt{texdef}.
+% The difference is that after the command's is detected to has a given type
+% of robustness, rather than making a copy, we use a separate routine to show
+% its definition.
+%
+% With all the machinery in place, \cs{ShowCommand} itself is quite simple:
+% use \cs{robust@command@act} to iterate through the \cs{@showcommandlisthook}
+% list, and if nothing is found, fallback to \cs{show}.
+% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020-10-01}{\ShowCommand}%
+%<latexrelease> {Add \ShowCommand}%
+%<*2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\long\def\ShowCommand#1{%
+ \robust@command@act
+ \@showcommandlisthook#1%
+ \show#1}
+% \end{macrocode}
+%
+% \begin{macro}{\@showcommandlisthook}
+% The initial definition of \cs{@showcommandlisthook} contains the same tests
+% as used for copying, but \cs{@show@...} commands instead of \cs{@copy@...}.
+% Same as before, it is initialised to cope with \cs{DeclareRobustCommand} and
+% \cs{newcommand} with optional arguments.
+% \begin{macrocode}
+\def\@showcommandlisthook{%
+ {\@if@DeclareRobustCommand \@show@DeclareRobustCommand}%
+ {\@if@newcommand \@show@newcommand}}
+% \end{macrocode}
+% \end{macro}
+%
+% Now the rollback code.
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000-00-00}{\ShowCommand}
+%<latexrelease> {Undefine \ShowCommand}%
+%<latexrelease>\let\ShowCommand\@undefined
+%<latexrelease>\let\@showcommandlisthook\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020-10-01}{\@if@DeclareRobustCommand}
+%<latexrelease> {Add \@if@DeclareRobustCommand, \@if@newcommand,
+%<latexrelease> \@copy@DeclareRobustCommand, \@copy@newcommand,
+%<latexrelease> \@show@DeclareRobustCommand, \@show@newcommand}%
+%<*2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \subsubsection{Commands defined with \cs{DeclareRobustCommand}}
+%
+% \begin{macro}{\@if@DeclareRobustCommand}
+% \changes{v1.5j}{2020/05/09}{Added \cs{DeclareCommandCopy} (gh/239)}
+%
+% Now that we provided a generic way to copy one macro to another, we need to
+% define a way to check if a command is one of \LaTeXe's robust types. These
+% tests are heavily based on Heiko's \cs{LetLtxMacro}, but chopped into
+% separate macros.
+%
+% \cs{@if@DeclareRobustCommand} checks if a command \verb=\cmd= was defined by
+% \cs{DeclareRobustCommand}. The test returns true if the expansion of
+% \verb=\cmd= is exactly \verb*=\protect\cmd =.
+%
+% \begin{macrocode}
+\long\def\@if@DeclareRobustCommand#1{%
+ \begingroup
+ \escapechar=`\\
+ \edef\reserved@a{\string#1}%
+ \edef\reserved@b{\detokenize{#1}}%
+ \xdef\@gtempa{%
+ \ifx\reserved@a\reserved@b
+ \noexpand\x@protect
+ \noexpand#1%
+ \fi
+ \noexpand\protect
+ \expandafter\noexpand\csname\@expl@cs@to@str@@N#1 \endcsname}%
+ \endgroup
+ \ifx\@gtempa#1\relax
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+% \end{macrocode}
+%
+% \begin{macro}{\@copy@DeclareRobustCommand}
+% \begin{macro}{\copy@kernel@robust@command}
+% If a command was defined by \cs{DeclareRobustCommand} (that is,
+% \cs{@if@DeclareRobustCommand} returns true), then to make a copy of \verb=\cmd=
+% into \verb=\foo= we define the latter such that it expands to
+% \verb*=\protect\foo =, then make \verb*=\foo = equal to \verb*=\cmd =.
+%
+% There is one detail we need to take care of: if a command was defined with
+% \cs{DeclareRobustCommand} it may still have an optional argument, in which
+% case there is one more macro layer before the actual definition of the
+% command. We use \cs{@if@newcommand} to check that and
+% \cs{@copy@newcommand} to do the copying.
+% \begin{macrocode}
+\long\def\@copy@DeclareRobustCommand#1#2{%
+ \begingroup
+ \escapechar=`\\
+ \edef\reserved@a{\string#1}%
+ \edef\reserved@b{\detokenize{#1}}%
+ \edef\reserved@a{%
+ \endgroup
+ \def\noexpand#1{%
+ \ifx\reserved@a\reserved@b
+ \noexpand\x@protect
+ \noexpand#1%
+ \fi
+ \noexpand\protect
+ \expandafter\noexpand\csname\@expl@cs@to@str@@N#1 \endcsname}%
+ \noexpand\copy@kernel@robust@command
+ \expandafter\noexpand\csname\@expl@cs@to@str@@N#1 \endcsname
+ \expandafter\noexpand\csname\@expl@cs@to@str@@N#2 \endcsname}%
+ \reserved@a}
+\long\def\copy@kernel@robust@command#1#2{%
+ \robust@command@chk@safe#2%
+ {\@if@newcommand#2%
+ {\@copy@newcommand}%
+ {\declare@commandcopy@let}}
+ {\declare@commandcopy@let}%
+ #1#2}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@show@DeclareRobustCommand}
+% \begin{macro}{\show@kernel@robust@command}
+% Showing the command is pretty simple. This command prints the top-level
+% expansion as \TeX's \cs{show} would, but with |robust macro:| rather than
+% just |macro:|, then a blank line and then \cs{show} the inner command.
+% For a macro defined with, say, |\DeclareRobustCommand\foo[1]{bar}|, it will
+% print:
+% \begin{verbatim}
+% > \foo=robust macro:
+% ->\protect \foo .
+%
+% > \foo =\long macro:
+% #1->bar.
+% \end{verbatim}
+% If the inner command is defined with an optional argument, then
+% \cs{@show@newcommand} is also used.
+%
+% The value of \cs{escapechar} is deliberately not enforced, so
+% \cs{ShowCommand} behaves more like \cs{show}.
+% \begin{macrocode}
+\long\def\@show@DeclareRobustCommand#1{%
+ \typeout{> \string#1=robust macro:}%
+ \typeout{->\@expl@cs@replacement@spec@@N#1.^^J}%
+ \expandafter\show@kernel@robust@command
+ \csname\@expl@cs@to@str@@N#1 \endcsname}
+\long\def\show@kernel@robust@command#1{%
+ \robust@command@chk@safe#1%
+ {\@if@newcommand#1%
+ {\@show@newcommand}%
+ {\show}}%
+ {\show}%
+ #1}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \end{macro}
+%
+% \subsubsection{Commands defined with \cs{newcommand} (with optional argument)}
+%
+% \begin{macro}{\@if@newcommand}
+% A command \verb=\cmd= (or \verb*=\cmd =, if it was defined with
+% \cs{DeclareRobustCommand}) with an optional argument will expand to
+% \verb*=\@protected@testopt\cmd\\cmd{<opt>}=. To check that we look at the
+% first three tokens in the expansion of \verb=\cmd=, and return true or false
+% accordingly.
+%
+% This test \emph{requires} that the command be a parameterless macro,
+% otherwise it will not work (and probably break). This is ensured with
+% \cs{robust@command@chk@safe} before calling \cs{@if@newcommand}.
+% \begin{macrocode}
+\long\def\@if@newcommand#1{%
+ \edef\reserved@a{%
+ \noexpand\@protected@testopt
+ \noexpand#1%
+ \expandafter\noexpand\csname\@backslashchar\@expl@cs@to@str@@N#1\endcsname}%
+ \edef\reserved@b{%
+ \unexpanded\expandafter\expandafter\expandafter
+ {\expandafter\@carcube#1{}{}{}\@nil}}%
+ \ifx\reserved@a\reserved@b
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+% \end{macrocode}
+%
+% \begin{macro}{\@copy@newcommand}
+% Then, if a command \verb=\cmd= takes an optional argument, we copy it to
+% \verb=\foo= by defining the latter to expand to
+% \verb=\@protected@testopt\foo\\foo{<opt>}=.
+% \begin{macrocode}
+\long\def\@copy@newcommand#1#2{%
+ \edef#1{\noexpand\@protected@testopt
+ \noexpand#1%
+ \expandafter\noexpand\csname\@backslashchar\@expl@cs@to@str@@N#1\endcsname
+ \unexpanded\expandafter\expandafter\expandafter
+ {\expandafter\@gobblethree#2}}%
+ \expandafter
+ \let\csname\@backslashchar\@expl@cs@to@str@@N#1\expandafter\endcsname
+ \csname\@backslashchar\@expl@cs@to@str@@N#2\endcsname}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@show@newcommand}
+% \begin{macro}{\@show@newcommand@aux}
+% A command being \cs{show}n here is guaranteed to have an optional argument.
+% Start by showing the top-level expansion of the command (using \cs{typeout}
+% to avoid TeX asking for interaction and extra context lines), then call
+% \cs{@show@newcommand@aux} with the internal command, which contains the
+% actual definition, and with the expansion of the command to extract the
+% default value of the optional argument.
+% \begin{macrocode}
+\long\def\@show@newcommand#1{%
+ \typeout{> \string#1=robust macro:}%
+ \typeout{->\@expl@cs@replacement@spec@@N#1.^^J}%
+ \expandafter\@show@newcommand@aux
+ \csname\@backslashchar\@expl@cs@to@str@@N#1\expandafter\endcsname
+ \expandafter{#1}}
+% \end{macrocode}
+%
+% For a macro defined with, say, |\newcommand\foo[1][opt]{bar}|, it will
+% print:
+% \begin{verbatim}
+% > \foo=robust macro:
+% ->\@protected@testopt \foo \\foo {opt}.
+%
+% > \\foo=\long macro:
+% > default #1=opt.
+% [#1]->bar.
+% \end{verbatim}
+% If the command was defined with \cs{DeclareRobustCommand}, then another pair
+% of lines show the top-level expansion \verb*|\protect \foo |.
+%
+% The extra gymnastics with \cs{showtokens} ensures that \cs{showtokens}
+% itself, and the internals of this macro aren't showed in the context lines.
+% \begin{macrocode}
+\long\def\@show@newcommand@aux#1#2{%
+ \typeout{> \string#1=\@expl@cs@prefix@spec@@N#1macro:}%
+ \edef\reserved@a{%
+ default \string##1=\expandafter\detokenize\@gobblethree#2.^^J%
+ \@expl@cs@argument@spec@@N#1->\@expl@cs@replacement@spec@@N#1}%
+ \showtokens\expandafter\expandafter\expandafter{\expandafter\reserved@a}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Now the rollback code.
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000-00-00}{\@if@DeclareRobustCommand}
+%<latexrelease> {Undefine \@if@DeclareRobustCommand, \@if@newcommand,
+%<latexrelease> \@copy@DeclareRobustCommand, \@copy@newcommand,
+%<latexrelease> \@show@DeclareRobustCommand, \@show@newcommand}%
+%<latexrelease>\let\@if@DeclareRobustCommand\@undefined
+%<latexrelease>\let\@copy@DeclareRobustCommand\@undefined
+%<latexrelease>\let\@show@DeclareRobustCommand\@undefined
+%<latexrelease>\let\@if@newcommand\@undefined
+%<latexrelease>\let\@copy@newcommand\@undefined
+%<latexrelease>\let\@show@newcommand\@undefined
+%
+%<latexrelease>\let\copy@kernel@robust@command\@undefined
+%<latexrelease>\let\show@kernel@robust@command\@undefined
+%<latexrelease>\let\@show@newcommand@aux\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+% \end{macro}
+%
%
% \subsection{Internal defining commands}
%
@@ -1537,6 +2205,56 @@
% \end{macro}
%
%
+% \begin{macro}{\string@makeletter}
+% \begin{macro}{\@string@makeletter}
+% \begin{macro}{\char@if@alph}
+% Iterates through a string, turning each alphabetic character into
+% a catcode-11 token (partly undoes a \cs{detokenize}). Useful for
+% \cs{ifx}-based string comparisons where \cs{detokenize}-ing the
+% other string would break too much code.
+%
+% \changes{v1.5n}{2020/09/06}
+% {Macro added}
+%
+% The macro uses \textsf{expl3}'s \cs{@expl@str@map@function@@NN} to
+% iterate on the string (without losing spaces) and applies
+% \cs{@string@makeletter} on each character. The latter checks if
+% character is between a--z or A--Z, and uses \cs{@alph} or \cs{@Alph}
+% to get the corresponding catcode-11 token. Other tokens are passed
+% through unchanged.
+% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020/10/01}{\string@makeletter}
+%<latexrelease> {Add \string@makeletter}%
+%<*2ekernel|latexrelease>
+\def\string@makeletter#1{%
+ \@expl@str@map@function@@NN#1\@string@makeletter}
+\def\@string@makeletter#1{%
+ \char@if@alph{#1}%
+ {\@expl@char@generate@@nn{`#1}{11}}%
+ {#1}}
+\def\char@if@alph#1{%
+ \ifnum0\ifnum`#1<`A 1\fi\ifnum`#1>`z 1\fi
+ \if\ifnum`#1>`Z @\fi\ifnum`#1<`a @\fi01\fi>0
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%
+%<latexrelease>\IncludeInRelease{0000/00/00}{\string@makeletter}
+%<latexrelease> {Undefine \string@makeletter}%
+%<latexrelease>\let\string@makeletter\@undefined
+%<latexrelease>\let\@string@makeletter\@undefined
+%<latexrelease>\let\char@if@alph\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
%
% \begin{macro}{\makeatletter}
% \begin{macro}{\makeatother}
@@ -1550,7 +2268,6 @@
% \end{macro}
% \end{macro}
%
-
%
% \section{Discretionary Hyphenation}
% \begin{macro}{\-}
@@ -1560,6 +2277,7 @@
% \changes{v1.0g}{1994/04/12}
% {Define \cs{@dischyph}, was previously in ltboxes.dtx}
% \changes{v1.5b}{2017/03/27}{Define \cs{@dischyph} after \cs{-}}
+% \changes{v1.5j}{2020/05/11}{Do not overwrite \cs{-} under Lua\TeX}
% \end{macro}
% Moved here to be after the definition of |\DeclareRobustCommand|.
%
@@ -1589,35 +2307,56 @@
% older \LaTeX\ definition accessible via \textsf{latexrelease}
% as usual.
%
-% \begin{macrocode}
-%</2ekernel>
-%<latexrelease>\IncludeInRelease{2017/04/15}{\-}{Use \hyphenchar in \-}%
-% \end{macrocode}
+% In Lua\LaTeX\ the primitive definition of \cs{-} is used directly
+% because it's use of extended hyphenation parameters means that \cs{-}
+% works correctly even with \cs{hyphenchar} set to $-1$. This change
+% makes \cs{-} under Lua\LaTeX\ compatible with language specific
+% hyphenation characters.
+%
% Temporary definition of |\@latex@info|, final definition is later.
% \begin{macrocode}
-%<*2ekernel>
\def\@latex@info#1{}
-%</2ekernel>
% \end{macrocode}
%
% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020/10/01}{\-}{Use primitive \- in Lua\LaTeX}%
%<*2ekernel|latexrelease>
-\DeclareRobustCommand{\-}{%
- \discretionary{%
- \char \ifnum\hyphenchar\font<\z@
- \defaulthyphenchar
- \else
- \hyphenchar\font
- \fi
- }{}{}%
-}
-\let\@dischyph=\-
+\ifx\directlua\@undefined
+ \DeclareRobustCommand{\-}{%
+ \discretionary{%
+ \char \ifnum\hyphenchar\font<\z@
+ \defaulthyphenchar
+ \else
+ \hyphenchar\font
+ \fi
+ }{}{}%
+ }
+\else
+ \let\-\@@hyph
+\fi
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2017/04/15}{\-}{Use \hyphenchar in \-}%
+%<latexrelease>\DeclareRobustCommand{\-}{%
+%<latexrelease> \discretionary{%
+%<latexrelease> \char \ifnum\hyphenchar\font<\z@
+%<latexrelease> \defaulthyphenchar
+%<latexrelease> \else
+%<latexrelease> \hyphenchar\font
+%<latexrelease> \fi
+%<latexrelease> }{}{}%
+%<latexrelease>}
+%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}{\-}{Use \hyphenchar in \-}%
%<latexrelease>\def\-{\discretionary{-}{}{}}
-%<latexrelease>\let\@dischyph=\-
%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+\let\@dischyph=\-
+%</2ekernel|latexrelease>
%<*2ekernel>
% \end{macrocode}
% \end{macro}
@@ -1678,6 +2417,28 @@
%<*2ekernel>
% \end{macrocode}
%
+%
+% \begin{macro}{\g@addto@macro}
+% Globally add to the end of a macro.
+% \changes{v0.2a}{1993/11/14}{Made global}
+% \changes{v0.2w}{1994/01/31}
+% {Use toks register to avoid `hash' problems}
+% \changes{v1.0o}{1995/05/17}
+% {Make long for latex/1522}
+% \changes{v1.0w}{1996/12/17}
+% {Use \cs{begingroup} to save making a mathord}
+% \changes{v1.0x}{1997/02/05}
+% {missing percent /2402}
+% \begin{macrocode}
+\long\def\g@addto@macro#1#2{%
+ \begingroup
+ \toks@\expandafter{#1#2}%
+ \xdef#1{\the\toks@}%
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+%
% \begin{macrocode}
%</2ekernel>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/base/ltdirchk.dtx b/Master/texmf-dist/source/latex/base/ltdirchk.dtx
index 25fb9480ddd..3abd49aced5 100644
--- a/Master/texmf-dist/source/latex/base/ltdirchk.dtx
+++ b/Master/texmf-dist/source/latex/base/ltdirchk.dtx
@@ -37,7 +37,7 @@
%<*driver>
% \fi
\ProvidesFile{ltdirchk.dtx}
- [2019/11/01 v1.3a LaTeX Kernel (System Dependent Parts)]
+ [2020/08/21 v1.3a LaTeX Kernel (System Dependent Parts)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltdirchk.dtx}
@@ -172,7 +172,9 @@
%, \LaTeX\ will not work around a bug in old \TeX\ versions, and
% so error messages will appear in a very strange format, with |^^J|
% appearing instead of line breaks:
-% \begingroup\catcode`\==\active \def=#1#2{}\hfuzz\maxdimen
+% \begingroup
+% ^^A FMi next line doesn't work with hacked class
+% ^^A\catcode`\==\active \def=#1#2{}\hfuzz\maxdimen
%\begin{verbatim}
%! LaTeX Error: \rubbish undefined.^^J^^JSee the LaTeX manual or LaTeX=
% Companion
diff --git a/Master/texmf-dist/source/latex/base/ltexpl.dtx b/Master/texmf-dist/source/latex/base/ltexpl.dtx
index 230cd911588..7f9019ede31 100644
--- a/Master/texmf-dist/source/latex/base/ltexpl.dtx
+++ b/Master/texmf-dist/source/latex/base/ltexpl.dtx
@@ -33,67 +33,359 @@
%<*driver>
% \fi
\ProvidesFile{ltexpl.dtx}
- [2019-10-02 v0.0 LaTeX Kernel (expl3-dependent code)]
+ [2020/12/18 v1.2h LaTeX Kernel (expl3-dependent code)]
% \iffalse
\documentclass{ltxdoc}
-\GetFileInfo{ltfinal.dtx}
+\GetFileInfo{ltexpl.dtx}
\title{\filename}
\date{\filedate}
\author{%
Joseph Wright}
+
+\providecommand\pkg[1]{\texttt{#1}}
+
\begin{document}
\MaintainedByLaTeXTeam{latex}
\maketitle
- \DocInput{ltfinal.dtx}
+ \DocInput{ltexpl.dtx}
\end{document}
%</driver>
% \fi
%
+%
+% \changes{v1.2d}{2020/08/21}{Dropped unused command}
+%
% \section{\pkg{expl3}-dependent code}
%
% \StopEventually{}
%
% \changes{v0.0}{2019-10-02}{Initial version}
%
+% \subsection{Loader}
+%
+% \changes{v1.0a}{2020/03/02}
+% {Don't load expl3 if already in the format (gh/295)}
+% \changes{v1.1}{2020/03/05}
+% {Load xparse.ltx if \cs{NewDocumentCommand} is not defined
+% by expl3.ltx}
+% \changes{v1.2c}{2020/06/04}
+% {Define a local version of some \LaTeXe{} basic macros to support
+% package loading}
+%
+% \begin{macro}{\@kernel@after@enddocument,
+% \@kernel@after@enddocument@afterlastpage}
+% These two kernel hooks are used by the shipout code. They are
+% defined earlier here because the \pkg{lthooks} code adds material
+% to them.
+% \changes{v1.2h}{2020/12/18}
+% {Define kernel \cs{enddocument} hooks early}
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {kernel@enddocument hooks}{Define kernel enddocument Hooks}%
+\let\@kernel@after@enddocument\@empty
+\let\@kernel@after@enddocument@afterlastpage\@empty
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {kernel@enddocument hooks}{Define kernel enddocument Hooks}%
+%<latexrelease>\let\@kernel@after@enddocument\@undefined
+%<latexrelease>\let\@kernel@after@enddocument@afterlastpage\@undefined
+%<latexrelease>\EndIncludeInRelease
+%</2ekernel|latexrelease>
+% \end{macrocode}
+% \end{macro}
+%
+% First define some blank commands, so that in case something goes wrong while
+% loading \textsf{expl3}, we won't get strange \texttt{Undefined control
+% sequence} errors.
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@expl@sys@load@backend@@}{Roll forward support}%
+\def\@expl@sys@load@backend@@{}
+\def\@expl@push@filename@@{}
+\def\@expl@push@filename@aux@@{}
+\def\@expl@pop@filename@@{}
+%<latexrelease>\EndIncludeInRelease
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \changes{v1.2d}{2020/07/08}
+% {Add a last-minute hook for \textsf{expl3}}
+% Create a hook for last-minute \pkg{expl3} material.
% \begin{macrocode}
%<*2ekernel>
+\def\@expl@finalise@setup@@{}
+%</2ekernel>
% \end{macrocode}
%
-% \subsection{Loader}
+% Now define some basics to support loading \textsf{expl3}. These macros can
+% be defined here safely, because they are redefined later on by the kernel,
+% so we define simpler versions just to suit our needs.
+% \begin{macrocode}
+%<*2ekernel>
+\long\def\@gobble#1{}
+\long\def\@firstofone#1{#1}
+\long\def\@firstoftwo#1#2{#1}
+\long\def\@secondoftwo#1#2{#2}
+\long\def\IfFileExists#1{%
+ \openin\@inputcheck"#1" %
+ \ifeof\@inputcheck
+ \expandafter\@secondoftwo
+ \else
+ \closein\@inputcheck
+ \expandafter\@firstoftwo
+ \fi}
+\long\def\@ifnextchar#1#2#3{%
+ \let\reserved@d=#1%
+ \def\reserved@a{#2}%
+ \def\reserved@b{#3}%
+ \futurelet\@let@token\@ifnch}
+\def\@ifnch{%
+ \ifx\@let@token\reserved@d
+ \expandafter\reserved@a
+ \else
+ \expandafter\reserved@b
+ \fi}
+%</2ekernel>
+% \end{macrocode}
+%
+% If we are doing a rollback with a format containing expl3 we
+% aren't reloading it as that creates havoc. This may need a
+% refined version!
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {expl3}{Pre-load expl3}%
+\expandafter\ifx\csname tex\string _let:D\endcsname\relax
+ \expandafter\@firstofone
+\else
+ \GenericInfo{}{Skipping: expl3 code already part of the format}%
+%<2ekernel> \expandafter\endinput
+%<latexrelease> \expandafter\@gobble
+\fi
+% \end{macrocode}
%
% Check for the required primitive/engine support and the existence of
% a loader.
% \begin{macrocode}
+ {%
+ \IfFileExists{expl3.ltx}
+ {%
+ \ifnum0%
+ \ifdefined\pdffilesize 1\fi
+ \ifdefined\filesize 1\fi
+ \ifdefined\luatexversion\ifnum\luatexversion>94 1\fi\fi
+ \ifdefined\kanjiskip 1\fi
+ >0 %
+ \expandafter\@firstofone
+ \else
+% \end{macrocode}
+%
+% In \texttt{2ekernel} mode, an error is fatal and building the format
+% is aborted. Use \verb=\batchmode \read -1 to \tokenlist=, which errors
+% with
+% \verb=! Emergency stop. (cannot \read from terminal in nonstop modes)=
+% and aborts the \TeX{} run. In \texttt{latexrelease} mode, raise an
+% error and do nothing. Both ways, the error message shows the minimum
+% \textsf{expl3} engine requirements.
+% \begin{macrocode}
+%<2ekernel> \def~{ }\def\MessageBreak{^^J~~~~~~~~~~~~~~~}%
+%<2ekernel> \errmessage{LaTeX Error:
+%<latexrelease> \@latex@error{%
+ LaTeX requires the e-TeX primitives and additional\MessageBreak
+ functionality available in the engines:\MessageBreak
+ - pdfTeX v1.40\MessageBreak
+ - XeTeX v0.99992\MessageBreak
+ - LuaTeX v0.95\MessageBreak
+ - e-(u)pTeX mid-2012\MessageBreak
+ or later%
+%<latexrelease> }\@ehd \expandafter\@gobble
+%<2ekernel> }\batchmode \read -1 to \reserved@a
+ \fi
+ }
+ {%
+%<*2ekernel>
+ \errmessage{LaTeX requires expl3}%
+ \batchmode \read -1 to \reserved@a
%</2ekernel>
-%<*2ekernel|latexrelease>
+% \end{macrocode}
+% We do not support a roll forward across 2019. You need to start
+% with 2019 if you want to get to 2020 or beyond.
+% \changes{v1.2g}{2020/11/24}{Support for roll forward (gh/434)}
+% \begin{macrocode}
+%<*latexrelease>
+ \@latex@warning@no@line
+ {You need a format that already contains a recent\MessageBreak
+ expl3 as part of the kernel, e.g. at least a kernel\MessageBreak
+ from 2019 to roll forward to that date!\MessageBreak
+ --- I'm giving up!\MessageBreak\MessageBreak
+ Note that manually loading the expl3 package\MessageBreak
+ from your distribution is not enough}%
+ \@@end % die
+%</latexrelease>
+ }%
+ {%
+ \input expl3.ltx
+ \ifdefined\NewDocumentCommand
+ \else
+ \IfFileExists{xparse.ltx}
+ {\input xparse.ltx }
+ {}%
+ \fi
+ }%
+ }
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
%<latexrelease>\IncludeInRelease{2020/02/02}%
%<latexrelease> {expl3}{Pre-load expl3}%
-\IfFileExists{expl3.ltx}
- {%
- \ifnum0%
- \ifdefined\pdffilesize 1\fi
- \ifdefined\filesize 1\fi
- \ifdefined\luatexversion\ifnum\luatexversion>94 1\fi\fi
- >0 %
- \else
- \message{Skipping expl3-dependent extensions}
-%<2ekernel> \expandafter\endinput
+%<latexrelease>\IfFileExists{expl3.ltx}
+%<latexrelease> {%
+%<latexrelease> \ifnum0%
+%<latexrelease> \ifdefined\pdffilesize 1\fi
+%<latexrelease> \ifdefined\filesize 1\fi
+%<latexrelease> \ifdefined\luatexversion\ifnum\luatexversion>94 1\fi\fi
+%<latexrelease> >0 %
+%<latexrelease> \else
+%<latexrelease> \message{Skipping expl3-dependent extensions}
%<latexrelease> \expandafter\@gobbletwo
- \fi
- }
- {%
- \message{Skipping expl3-dependent extensions}%
-%<2ekernel> \endinput
+%<latexrelease> \fi
+%<latexrelease> }
+%<latexrelease> {%
+%<latexrelease> \message{Skipping expl3-dependent extensions}%
%<latexrelease> \@gobbletwo
- }%
-\input{expl3.ltx}
-%</2ekernel|latexrelease>
+%<latexrelease> }%
+%<latexrelease>\input{expl3.ltx}
%<latexrelease>\EndIncludeInRelease
-%<*2ekernel>
% \end{macrocode}
%
+%
+% Starting with 2020-10 the kernel contains most of the
+% \texttt{xparse} interfaces loaded above. These interfaces are
+% later used to define various user command. However, if somebody
+% with an earlier installation tries to roll forward (using a
+% \texttt{latexrelease} package from a newer release) this will not
+% work as the earlier kernel doesn't contain commands such as
+% \cs{NewDocumentCommand}.
+%
+% We therefore add code into \texttt{latexrelease.sty} to load the
+% \texttt{xparse} package of the current installation instead. this
+% may not work if the installation is really old, but roll forward
+% can't do miracles.
+%
+% If the kernel is 2020-10 or later \cs{NewDocumentCommand} is
+% already known (whether or not you roll forward or back) so
+% nothing happens, but if you start from am earlier kernel the
+% \texttt{xparse} package gets loaded by \texttt{latexrelease}.
+% \changes{v1.2g}{2020/11/24}{Load xparse in latexrelease if needed (gh/434)}
% \begin{macrocode}
-%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\NewDocumentCommand}{Emergency loading xparse}%
+%<latexrelease>
+%<latexrelease>\ifdefined\NewDocumentCommand \else
+%<latexrelease> \RequirePackage{xparse}
+%<latexrelease>\fi
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \subsection{Using expl3 code}
+%
+% In order to ease the implemantation of some new features in
+% \LaTeXe\ we may (temporarily) use some coding based on the
+% \pkg{expl3}-code.
+% Such macros will eventually vanish and may be changed
+% unannounced. They are there for internal use in the \LaTeXe\
+% kernel and are not meant to be used in third-party
+% packages. These macros will always have the \verb|@expl@|
+% prefix in their name.
+%
+% The rest of the name matches the \pkg{expl3} name but with all
+% underscores replaced by \texttt{@}s and the \texttt{:} replaced
+% by \texttt{@@}, e.g.,
+%\begin{verbatim}
+% \cs_new_eq:NN \@expl@tl@trim@spaces@apply@@nN \tl_trim_spaces_apply:nN
+%\end{verbatim}
+% if that \pkg{expl3} command is needed in places that are others
+% coded in \LaTeXe{} conventions.
+%
+%
+% In this file, each release of LaTeX adds an \cs{IncludeInRelease}
+% block, in which the macros copied for that release were defined.
+% In case a rollback is requested, the entire block is changed.
+%
+% Each macro copied has a \cs{changes} entry to explain when and why
+% it was copied, so that further to that may spot it easily.
+%
+% Here \cs{cs\string_gset\string_eq:NN} is used, instead of the |new|
+% variant because if different releases use that same name for
+% different purposes, each can copy the macro without worrying about
+% redefinitions.
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2020/10/01}{\@expl@cs@to@str@@N}%
+%<latexrelease> {expl3 macros added for the 2020-10-01 release}%
+% \end{macrocode}
+%
+% The expl3 activation needs to be inside the release guards as
+% otherwise rolling forward is broken in old kernels that do not
+% have expl3 loaded.
+% \changes{v1.2g}{2020/11/24}{Support for roll forward (gh/434)}
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \changes{v1.2e}{2020/08/19}
+% {Add \cs{@expl@cs@to@str@@N} and \cs{@expl@str@if@eq@@nnTF}
+% for \cs{NewCommandCopy} (gh/239)}
+% \begin{macrocode}
+\cs_gset_eq:NN \@expl@cs@to@str@@N \cs_to_str:N
+\cs_gset_eq:NN \@expl@str@if@eq@@nnTF \str_if_eq:nnTF
% \end{macrocode}
%
+% \changes{v1.2e}{2020/08/19}
+% {Add \cs{@expl@cs@\meta{thing}@spec@@N}
+% for \cs{ShowCommand} (gh/373)}
+% \begin{macrocode}
+\cs_gset_eq:NN \@expl@cs@prefix@spec@@N \cs_prefix_spec:N
+\cs_gset_eq:NN \@expl@cs@argument@spec@@N \cs_argument_spec:N
+\cs_gset_eq:NN \@expl@cs@replacement@spec@@N \cs_replacement_spec:N
+% \end{macrocode}
+%
+% \changes{v1.2f}{2020/09/06}
+% {Add \cs{@expl@str@map@function@@NN
+% and \cs{@expl@char@generate@@nn}}
+% for \cs{string@makeletter} (gh/386)}
+% \begin{macrocode}
+\cs_gset_eq:NN \@expl@str@map@function@@NN \str_map_function:NN
+\cs_gset_eq:NN \@expl@char@generate@@nn \char_generate:nn
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+%
+% Here we can't assume that expl3 is available. It will be if we
+% roll back but if this code is executed rolling forward it needs
+% to be pure 2e.
+% \changes{v1.2g}{2020/11/24}{Support for roll forward (gh/434)}
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}{\@expl@cs@to@str@@N}%
+%<latexrelease> {expl3 macros added for the 2020-10-01 release}%
+%<latexrelease>\let \@expl@cs@to@str@@N \@undefined
+%<latexrelease>\let \@expl@str@if@eq@@nnTF \@undefined
+%<latexrelease>\let \@expl@cs@prefix@spec@@N \@undefined
+%<latexrelease>\let \@expl@cs@argument@spec@@N \@undefined
+%<latexrelease>\let \@expl@cs@replacement@spec@@N \@undefined
+%<latexrelease>\let \@expl@str@map@function@@NN \@undefined
+%<latexrelease>\EndIncludeInRelease
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+%
% \Finale
diff --git a/Master/texmf-dist/source/latex/base/ltfilehook.dtx b/Master/texmf-dist/source/latex/base/ltfilehook.dtx
new file mode 100644
index 00000000000..b4f716748a8
--- /dev/null
+++ b/Master/texmf-dist/source/latex/base/ltfilehook.dtx
@@ -0,0 +1,1671 @@
+% \iffalse meta-comment
+%%
+%% File: ltfilehook.dtx (C) Copyright 2020 Frank Mittelbach,
+%% Phelype Oleinik & LaTeX Team
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+%
+% \iffalse
+%
+%%% From File: ltfilehook.dtx
+%
+% \begin{macrocode}
+\providecommand\ltfilehookversion{v1.0e}
+\providecommand\ltfilehookdate{2021/01/07}
+% \end{macrocode}
+%
+%<*driver>
+
+\documentclass{l3doc}
+
+% bug fix fo l3doc.cls
+\ExplSyntaxOn
+\cs_set_protected:Npn \__codedoc_macro_typeset_one:nN #1#2
+ {
+ \vbox_set:Nn \l__codedoc_macro_box
+ {
+ \vbox_unpack_drop:N \l__codedoc_macro_box
+ \hbox { \llap { \__codedoc_print_macroname:nN {#1} #2
+ \MacroFont % <----- without it the \ is in lmr10 if a link is made
+ \
+ } }
+ }
+ \int_incr:N \l__codedoc_macro_int
+ }
+\ExplSyntaxOff
+
+\usepackage{structuredlog} % for demonstration
+
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{ltfilehook.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \long\def\fmi#1{\begin{quote}\itshape Todo: #1\end{quote}}
+%
+% \let\hook\texttt
+%
+% \title{The \texttt{ltfilehook} package\thanks{This package has version
+% \ltfilehookversion\ dated \ltfilehookdate, \copyright\ \LaTeX\
+% Project.}}
+%
+% \author{Frank Mittelbach}
+%
+% \maketitle
+%
+%
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+%
+%
+% \subsection{Provided hooks}
+%
+% The code offers a number of hooks into which packages (or the
+% user) can add code to support different use cases.
+% Many hooks are offered as pairs (i.e., the second hook is
+% reversed. Also important to know is that these pairs are
+% properly nested with respect to other pairs of hooks.
+%
+% There are hooks that are executed for all files of a certain type
+% (if they contain code), e.g., for all \enquote{include files} or
+% all \enquote{packages},
+% and there are also hooks that are specific to a single file,
+% e.g., do something after the package \texttt{foo.sty} has been
+% loaded.
+%
+%
+% \subsection{General hooks for file reading}
+% \label{sec:general-file-hooks}
+%
+% There are four hooks that are called for each file that is read
+% using document-level commands such as \cs{input}, \cs{include},
+% \cs{usepackage}, etc. They are not called for files read using
+% internal low-level methods, such as \cs{@input} or \cs{openin}.
+%
+% \begin{variable}{file/before,file/before/...,
+% file/after/...,file/after,
+% }
+% These are:
+% \begin{description}
+% \item[\texttt{file/before}, \texttt{file/before/\meta{file-name}}]
+%
+% These hooks are executed in that order just before the file is
+% loaded for reading. The code of the first hook is used
+% with every file, while the second is executed only for the
+% file with matching \meta{file-name} allowing you to specify
+% code that only applies to one file.
+%
+% \item[\texttt{file/after/\meta{file-name}}, \texttt{file/after}]
+%
+% These hooks are after the file with name \meta{file-name} has
+% been fully consumed. The order is swapped (the specific one
+% comes first) so that the \texttt{before} and \texttt{after}
+% hooks nest properly, which is important if any of them involve
+% grouping (e.g., contain environments, for example).
+% Furthermore both hooks are reversed hooks to support correct
+% nesting of different packages adding code to both
+% \texttt{/before} and \texttt{/after} hooks.
+%
+% \end{description}
+% \end{variable}
+%
+%
+% So the overall sequence of hook processing for any file read
+% through the user interface commands of \LaTeX{} is:
+%
+% \begin{tabbing}
+% mm\=mm\=mm\=mm\=\kill
+% \>\cs{UseHook}\marg{\hook{file/before}} \\
+% \>\cs{UseHook}\marg{\hook{file/before/\meta{file name}}} \\
+% \>\> \meta{file contents} \\
+% \>\cs{UseHook}\marg{\hook{file/after/\meta{file name}}} \\
+% \>\cs{UseHook}\marg{\hook{file/after}}
+% \end{tabbing}
+%
+% The file hooks only refer to the file by its name and extension,
+% so the \meta{file name} should be the file name as it is on the
+% filesystem with extension (if any) and without paths. Different
+% from \cs{input} and similar commands, the \texttt{.tex}
+% extension is not assumed in hook \meta{file name}, so \texttt{.tex}
+% files must be specified
+% with their extension to be recognized.
+% Files within subfolders should also be addressed by their name and
+% extension only.
+%
+% Extensionless files also work, and should then be given without
+% extension. Note however that \TeX{} prioritizes \texttt{.tex}
+% files, so if two files \texttt{foo} and \texttt{foo.tex} exist in
+% the search path, only the latter will be seen.
+%
+% When a file is input, the \meta{file name} is available in
+% \cs{CurrentFile}, which is then used when accessing the
+% \hook{file/before/\meta{file name}} and
+% \hook{file/after/\meta{file name}}.
+%
+% \begin{variable}{\CurrentFile}
+% The name of the file about to be read (or just finished) is
+% available to the hooks through \cs{CurrentFile} (there is no
+% \texttt{expl3} name for it for now). The file is always provided
+% with its extension, i.e., how it appears on your hard drive, but
+% without any specified path to it. For example,
+% \verb=\input{sample}= and \verb=\input{app/sample.tex}= would
+% both have \cs{CurrentFile} being \texttt{sample.tex}.
+% \end{variable}
+%
+% \begin{variable}{\CurrentFilePath}
+% The path to the current file (complement to \cs{CurrentFile}) is
+% available in \cs{CurrentFilePath} if needed.
+% The paths returned in \cs{CurrentFilePath} are only user paths,
+% given through \cs{input@path} (or \pkg{expl3}'s equivalent
+% \cs{l_file_search_path_seq}) or by directly typing in the path
+% in the \cs{input} command or equivalent. Files located by
+% \texttt{kpsewhich} get the path added internally by the \TeX{}
+% implementation, so at the macro level it looks as if the file were
+% in the current folder, so the path in \cs{CurrentFilePath} is empty
+% in these cases (package and class files, mostly).
+% \end{variable}
+%
+% \begin{variable}{\CurrentFileUsed,\CurrentFilePathUsed}
+% In normal circumstances these are identical to \cs{CurrentFile} and
+% \cs{CurrentFilePath}. They will differ when a file substitution
+% has occurred for \cs{CurrentFile}. In that case,
+% \cs{CurrentFileUsed} and \cs{CurrentFilePathUsed} will hold the
+% actual file name and path loaded by \LaTeX, while \cs{CurrentFile}
+% and \cs{CurrentFilePath} will hold the names that were
+% \emph{asked for}. Unless doing very specific work on the file
+% being read, \cs{CurrentFile} and \cs{CurrentFilePath} should be
+% enough.
+% \end{variable}
+%
+% \subsection{Hooks for package and class files}
+%
+% Commands to load package and class files (e.g., \cs{usepackage},
+% \cs{RequirePackage}, \cs{LoadPackageWithOptions}, etc.) offer the
+% hooks from section~\ref{sec:general-file-hooks} when they are
+% used to load a package or class file, e.g.,
+% \texttt{file/after/array.sty} would be called after the
+% \pkg{array} package got loaded. But as packages and classes form as special group
+% of files, there are some additional hooks available that only
+% apply when a package or class is loaded.
+%
+%
+% \begin{variable}{
+% package/before,package/after,
+% package/before/...,package/after/...,
+% class/before,class/after,
+% class/before/...,class/after/...,
+% }
+% These are:
+% \begin{description}
+% \item[\texttt{package/before}, \texttt{package/after}]
+%
+% These hooks are called for each package being loaded.
+%
+% \item[\texttt{package/before/\meta{name}},
+% \texttt{package/after/\meta{name}}]
+%
+% These hooks are additionally called if the package name is
+% \meta{name} (without extension).
+%
+% \item[\texttt{class/before}, \texttt{class/after}]
+%
+% These hooks are called for each class being loaded.
+%
+% \item[\texttt{class/before/\meta{name}}, \texttt{class/after/\meta{name}}]
+%
+% These hooks are additionally called if the class name is
+% \meta{name} (without extension).
+%
+% \end{description}
+% \end{variable}
+% All \hook{/after} hooks are implemented as reversed hooks.
+%
+% \noindent The overall sequence of execution for \cs{usepackage}
+% and friends is therefore:
+% \begin{tabbing}
+% mm\=mm\=mm\=mm\=\kill
+% \>\cs{UseHook}\marg{\hook{package/before}} \\
+% \>\cs{UseHook}\marg{\hook{package/before/\meta{package name}}} \\[5pt]
+% \>\>\cs{UseHook}\marg{\hook{file/before}} \\
+% \>\>\cs{UseHook}\marg{\hook{file/before/\meta{package name}.sty}} \\
+% \>\>\> \meta{package contents} \\
+% \>\>\cs{UseHook}\marg{\hook{file/after/\meta{package name}.sty}} \\
+% \>\>\cs{UseHook}\marg{\hook{file/after}} \\[5pt]
+% \>\>\emph{code from \cs{AtEndOfPackage} if
+% used inside the package} \\[5pt]
+% \>\cs{UseHook}\marg{\hook{package/after/\meta{package name}}} \\
+% \>\cs{UseHook}\marg{\hook{package/after}}
+% \end{tabbing}
+% and similar for class file loading, except that \texttt{package/}
+% is replaced by \texttt{class/} and \cs{AtEndOfPackage} by
+% \cs{AtEndOfClass}.
+%
+% If a package or class is not loaded (or it was loaded before the
+% hooks were set) none of the hooks are executed!
+%
+% \subsection{Hooks for \cs{include} files}
+%
+% To manage \cs{include} files, \LaTeX{} issues a \cs{clearpage}
+% before and after loading such a file. Depending on the use case
+% one may want to execute code before or after these
+% \cs{clearpage}s especially for the one that is issued at the end.
+%
+% Executing code before the final \cs{clearpage}, means that the
+% code is processed while the last page of the included material is
+% still under construction. Executing code after it means that all
+% floats from inside the include file are placed (which
+% might have added further pages) and the final page has finished.
+%
+% Because of these different scenarios we offer hooks in three
+% places.\footnote{If you want to execute code before the first
+% \cs{clearpage} there is no need to use a hook---you can write it
+% directly in front of the \cs{include}.}
+% None of the hooks are executed when an \cs{include} file is
+% bypassed because of an \cs{includeonly} declaration. They are,
+% however, all executed if \LaTeX{} makes an attempt to load the
+% \cs{include} file (even if it doesn't exist and all that happens
+% is \enquote{\texttt{No file \meta{filename}.tex}}).
+%
+%
+% \begin{variable}{include/before,include/before/...,
+% include/end,include/end/...,
+% include/after,include/after/...,
+% }
+% These are:
+% \begin{description}
+%
+% \item[\texttt{include/before}, \texttt{include/before/\meta{name}}]
+%
+% These hooks are executed (in that order) after the initial
+% \cs{clearpage} and after \texttt{.aux} file is changed to use
+% \texttt{\meta{name}.aux}, but before the
+% \texttt{\meta{name}.tex} file is loaded. In other words they are executed
+% at the very beginning of the first page of the \cs{include}
+% file.
+%
+%
+% \item[\texttt{include/end/\meta{name}}, \texttt{include/end}]
+%
+% These hooks are executed (in that order) after \LaTeX{} has
+% stopped reading from the \cs{include} file, but before it has
+% issued a \cs{clearpage} to output any deferred floats.
+%
+%
+% \item[\texttt{include/after/\meta{name}}, \texttt{include/after}]
+%
+% These hooks are executed (in that order) after \LaTeX{} has
+% issued the \cs{clearpage} but before is has switched back
+% writing to the main \texttt{.aux} file. Thus technically we are
+% still inside the \cs{include} and if the hooks generate any
+% further typeset material including anything that writes to the
+% \texttt{.aux} file, then it would be considered part of the
+% included material and bypassed if it is not loaded because of
+% some \cs{includeonly} statement.\footnotemark
+%
+% \end{description}
+% \end{variable}\footnotetext{For that reason
+% another \cs{clearpage} is executed after these hooks which
+% normally does nothing, but starts a new page if further material
+% got added this way.}
+%
+% \subsection{High-level interfaces for \LaTeX{}}
+%
+% We do not provide any high-level \LaTeX{} commands (like
+% \pkg{filehook} or \pkg{scrlfile} do) but think that for package
+% writers the commands from for hook management are sufficient.
+%
+%
+%
+% \subsection{Internal interfaces for \LaTeX{}}
+%
+% \begin{function}{\declare@file@substitution,\undeclare@file@substitution}
+% \begin{syntax}
+% \cs{declare@file@substitution} \Arg{file} \Arg{replacement-file}
+% \cs{undeclare@file@substitution} \Arg{file}
+% \end{syntax}
+% If \meta{file} is requested for loading replace it with
+% \meta{replacement-file}. \cs{CurrentFile} remains pointing to
+% \meta{file} but \cs{CurrentFileUsed} will show the file actually
+% loaded.
+%
+% The main use case for this declaration is to provide a corrected
+% version of a package that can't be changed (due to its license)
+% but no longer functions because of \LaTeX{} kernel changes, for
+% example, or to provide a version that makes use of new kernel
+% functionality while the original package remains available for
+% use with older releases.
+%
+% The \cs{undeclare@file@substitution} declaration undoes a
+% substitution made earlier.
+%
+% \begin{quote}
+% \em
+% Please do not misuse this functionality and replace a file with
+% another unless if really needed and only if the new version is
+% implementating the same functionality as the original one!
+% \end{quote}
+% \end{function}
+%
+% \begin{function}{\disable@package@load,\reenable@package@load}
+% \begin{syntax}
+% \cs{disable@package@load} \Arg{package} \Arg{alternate-code}
+% \cs{reenable@package@load} \Arg{package}
+% \end{syntax}
+% If \meta{package} is requested do not load it but instead run
+% \meta{alternate-code} which could issue a warning, error or any
+% other code.
+%
+% The main use case is for classes that want to restrict the set of
+% supported packages or contain code that make the use of some
+% packages impossible. So rather than waiting until the document
+% breaks they can set up informative messages why certain packages
+% are not available.
+%
+% The function is only implemented for packages not for arbitrary
+% files.
+% \end{function}
+%
+%
+% \subsection{A sample package for structuring the log output}
+%
+% As an application we provide the package \pkg{structuredlog} that
+% adds lines to the \texttt{.log} when a file is opened and closed
+% for reading keeping track of nesting level es well.
+% For example, for the current document it adds the lines
+%\begin{verbatim}
+% = (LEVEL 1 START) t1lmr.fd
+% = (LEVEL 1 STOP) t1lmr.fd
+% = (LEVEL 1 START) supp-pdf.mkii
+% = (LEVEL 1 STOP) supp-pdf.mkii
+% = (LEVEL 1 START) nameref.sty
+% == (LEVEL 2 START) refcount.sty
+% == (LEVEL 2 STOP) refcount.sty
+% == (LEVEL 2 START) gettitlestring.sty
+% == (LEVEL 2 STOP) gettitlestring.sty
+% = (LEVEL 1 STOP) nameref.sty
+% = (LEVEL 1 START) ltfilehook-doc.out
+% = (LEVEL 1 STOP) ltfilehook-doc.out
+% = (LEVEL 1 START) ltfilehook-doc.out
+% = (LEVEL 1 STOP) ltfilehook-doc.out
+% = (LEVEL 1 START) ltfilehook-doc.hd
+% = (LEVEL 1 STOP) ltfilehook-doc.hd
+% = (LEVEL 1 START) ltfilehook.dtx
+% == (LEVEL 2 START) ot1lmr.fd
+% == (LEVEL 2 STOP) ot1lmr.fd
+% == (LEVEL 2 START) omllmm.fd
+% == (LEVEL 2 STOP) omllmm.fd
+% == (LEVEL 2 START) omslmsy.fd
+% == (LEVEL 2 STOP) omslmsy.fd
+% == (LEVEL 2 START) omxlmex.fd
+% == (LEVEL 2 STOP) omxlmex.fd
+% == (LEVEL 2 START) umsa.fd
+% == (LEVEL 2 STOP) umsa.fd
+% == (LEVEL 2 START) umsb.fd
+% == (LEVEL 2 STOP) umsb.fd
+% == (LEVEL 2 START) ts1lmr.fd
+% == (LEVEL 2 STOP) ts1lmr.fd
+% == (LEVEL 2 START) t1lmss.fd
+% == (LEVEL 2 STOP) t1lmss.fd
+% = (LEVEL 1 STOP) ltfilehook.dtx
+%\end{verbatim}
+% Thus if you inspect an issue in the \texttt{.log} it is easy to
+% figure out in which file it occurred, simply by searching back for
+% \texttt{LEVEL} and if it is a \texttt{STOP} then remove 1 from
+% the level value and search further for \texttt{LEVEL} with that value
+% which should then be the \texttt{START} level of the file you are in.
+%
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+% \begin{macrocode}
+%<*2ekernel>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=filehook>
+% \end{macrocode}
+%
+%
+% \subsection{Document and package-level commands}
+%
+%
+% \begin{macro}{\CurrentFile,\CurrentFilePath}
+% \begin{macro}{\CurrentFileUsed,\CurrentFilePathUsed}
+% User-level macros that hold the current file name and file path.
+% These are used internally as well because the code takes care to
+% protect against a possible redefinition of these macros in the
+% loaded file (it's necessary anyway to make hooks work with nested
+% \cs{input}). The versions |\...Used| hold the \emph{actual} file
+% name and path that is loaded by \LaTeX, whereas the other two hold
+% the name as requested. They will differ in case there's a file
+% substitution.
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\CurrentFile}{Hook management file}%
+\ExplSyntaxOn
+\tl_new:N \CurrentFile
+\tl_new:N \CurrentFilePath
+\tl_new:N \CurrentFileUsed
+\tl_new:N \CurrentFilePathUsed
+\ExplSyntaxOff
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\CurrentFile}{Hook management file}%
+%<latexrelease>
+%<latexrelease>\let \CurrentFile \@undefined
+%<latexrelease>\let \CurrentFilePath \@undefined
+%<latexrelease>\let \CurrentFileUsed \@undefined
+%<latexrelease>\let \CurrentFilePathUsed \@undefined
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsection{\pkg{expl3} helpers}
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@@_file_parse_full_name:nN}{File helpers}%
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \begin{macro}{
+% \@@_file_parse_full_name:nN,
+% \@@_full_name:nn,
+% }
+% A utility macro to trigger \pkg{expl3}'s file-parsing and lookup,
+% and return a normalized representation of the file name. If the
+% queried file doesn't exist, no normalisation takes place.
+% The output of \cs{@@_file_parse_full_name:nN} is passed on to the
+% |#2|---a 3-argument macro that takes the \meta{path}, \meta{base},
+% and \meta{ext} parts of the file name.
+%
+% \begin{macrocode}
+\cs_new:Npn \@@_file_parse_full_name:nN #1
+ {
+ \exp_args:Nf \file_parse_full_name_apply:nN
+ {
+ \exp_args:Nf \@@_full_name:nn
+ { \file_full_name:n {#1} } {#1}
+ }
+ }
+\cs_new:Npn \@@_full_name:nn #1 #2
+ {
+ \tl_if_empty:nTF {#1}
+ { \tl_trim_spaces:n {#2} }
+ { \tl_trim_spaces:n {#1} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_if_no_extension:nTF,
+% \@@_drop_extension:N
+% }
+% Some actions depend on whether the file extension was explicitly
+% given, and sometimes the extension has to be removed. The macros
+% below use \cs{@@_file_parse_full_name:nN} to split up the file name
+% and either check if \meta{ext} (|#3|) is empty, or discard it.
+% \begin{macrocode}
+\cs_new:Npn \@@_if_no_extension:nTF #1
+ {
+ \exp_args:Ne \tl_if_empty:nTF
+ { \file_parse_full_name_apply:nN {#1} \use_iii:nnn }
+ }
+\cs_new_protected:Npn \@@_drop_extension:N #1
+ {
+ \tl_gset:Nx #1
+ {
+ \exp_args:NV \@@_file_parse_full_name:nN #1
+ \@@_drop_extension_aux:nnn
+ }
+ }
+\cs_new:Npn \@@_drop_extension_aux:nnn #1 #2 #3
+ { \tl_if_empty:nF {#1} { #1 / } #2 }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\g_@@_input_file_seq,\l_@@_internal_tl}
+% \begin{macro}{\@@_file_push:,\@@_file_pop:}
+% \begin{macro}{\@@_file_pop_assign:nnnn}
+% Yet another stack, to keep track of \cs{CurrentFile} and
+% \cs{CurrentFilePath} with nested \cs{input}s. At the beginning of
+% \cs{InputIfFileExists}, the current value of \cs{CurrentFilePath}
+% and \cs{CurrentFile} is pushed to \cs{g_@@_input_file_seq}, and
+% at the end, it is popped and the value reassigned. Some other
+% places don't use \cs{InputIfFileExists} directly (\cs{include}) or
+% need \cs{CurrentFile} earlier (\cs{@onefilewithoptions}), so these
+% are manually used elsewhere as well.
+% \begin{macrocode}
+\tl_new:N \l_@@_internal_tl
+\seq_new:N \g_@@_input_file_seq
+\cs_new_protected:Npn \@@_file_push:
+ {
+ \seq_gpush:Nx \g_@@_input_file_seq
+ {
+ { \CurrentFilePathUsed } { \CurrentFileUsed }
+ { \CurrentFilePath } { \CurrentFile }
+ }
+ }
+\cs_new_protected:Npn \@@_file_pop:
+ {
+ \seq_gpop:NNTF \g_@@_input_file_seq \l_@@_internal_tl
+ { \exp_after:wN \@@_file_pop_assign:nnnn \l_@@_internal_tl }
+ {
+ \msg_error:nnn { hooks } { should-not-happen }
+ { Tried~to~pop~from~an~empty~file~name~stack. }
+ }
+ }
+\cs_new_protected:Npn \@@_file_pop_assign:nnnn #1 #2 #3 #4
+ {
+ \tl_set:Nn \CurrentFilePathUsed {#1}
+ \tl_set:Nn \CurrentFileUsed {#2}
+ \tl_set:Nn \CurrentFilePath {#3}
+ \tl_set:Nn \CurrentFile {#4}
+ }
+\ExplSyntaxOff
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% When rolling forward the following expl3 functions may not be defined.
+% If we roll back the code does nothing.
+% \changes{v1.0d}{2020/11/24}{Support for roll forward (gh/434)}
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\file_parse_full_name_apply:nN}{Roll forward help}%
+%<latexrelease>
+%<latexrelease>\ExplSyntaxOn
+%<latexrelease>\cs_if_exist:NF\file_parse_full_name_apply:nN
+%<latexrelease>{
+%<latexrelease>\cs_new:Npn \file_parse_full_name_apply:nN #1
+%<latexrelease> {
+%<latexrelease> \exp_args:Ne \__file_parse_full_name_auxi:nN
+%<latexrelease> { \__kernel_file_name_sanitize:n {#1} }
+%<latexrelease> }
+%<latexrelease>\cs_new:Npn \__file_parse_full_name_auxi:nN #1
+%<latexrelease> {
+%<latexrelease> \__file_parse_full_name_area:nw { } #1
+%<latexrelease> / \s__file_stop
+%<latexrelease> }
+%<latexrelease>\cs_new:Npn \__file_parse_full_name_area:nw #1 #2 / #3 \s__file_stop
+%<latexrelease> {
+%<latexrelease> \tl_if_empty:nTF {#3}
+%<latexrelease> { \__file_parse_full_name_base:nw { } #2 . \s__file_stop {#1} }
+%<latexrelease> { \__file_parse_full_name_area:nw { #1 / #2 } #3 \s__file_stop }
+%<latexrelease> }
+%<latexrelease>\cs_new:Npn \__file_parse_full_name_base:nw #1 #2 . #3 \s__file_stop
+%<latexrelease> {
+%<latexrelease> \tl_if_empty:nTF {#3}
+%<latexrelease> {
+%<latexrelease> \tl_if_empty:nTF {#1}
+%<latexrelease> {
+%<latexrelease> \tl_if_empty:nTF {#2}
+%<latexrelease> { \__file_parse_full_name_tidy:nnnN { } { } }
+%<latexrelease> { \__file_parse_full_name_tidy:nnnN { .#2 } { } }
+%<latexrelease> }
+%<latexrelease> { \__file_parse_full_name_tidy:nnnN {#1} { .#2 } }
+%<latexrelease> }
+%<latexrelease> { \__file_parse_full_name_base:nw { #1 . #2 } #3 \s__file_stop }
+%<latexrelease> }
+%<latexrelease>\cs_new:Npn \__file_parse_full_name_tidy:nnnN #1 #2 #3 #4
+%<latexrelease> {
+%<latexrelease> \exp_args:Nee #4
+%<latexrelease> {
+%<latexrelease> \str_if_eq:nnF {#3} { / } { \use_none:n }
+%<latexrelease> #3 \prg_do_nothing:
+%<latexrelease> }
+%<latexrelease> { \use_none:n #1 \prg_do_nothing: }
+%<latexrelease> {#2}
+%<latexrelease> }
+%<latexrelease>}
+%<latexrelease>\ExplSyntaxOff
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+% \subsection{Declaring the file-related hooks}
+%
+% All hooks starting with \texttt{file/} \texttt{include/},
+% \texttt{class/} or \texttt{package/} are generic and will be
+% allocated if code is added to them. Thus there is no need to
+% explicitly declare any hook in the code below.
+%
+% Furthermore, those named \texttt{.../after} or \texttt{.../end} are
+% automatically declared as reversed hooks if filled with code, so this
+% is also automatically taken care of.
+%
+%
+%
+%
+% \subsection{Patching \LaTeX{}'s \cs{InputIfFileExists} command}
+%
+% Most of what we have to do is adding \cs{UseHook} into several
+% \LaTeXe{} core commands, because of some circular dependencies in the
+% kernel we do this only now and not in \texttt{ltfiles}.
+%
+% \begin{macro}{\InputIfFileExists}
+% \begin{macro}{\@input@file@exists@with@hooks}
+% \begin{macro}{\unqu@tefilef@und}
+% \cs{InputIfFileExists} loads any file if it is available so we
+% have to add the hooks \texttt{file/before} and
+% \texttt{file/after} in the right places. If the file doesn't
+% exist no hooks should be executed.
+% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\InputIfFileExists}{Hook management (files)}%
+%<*2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\InputIfFileExists\@undefined
+\DeclareRobustCommand \InputIfFileExists[2]{%
+ \IfFileExists{#1}%
+ {%
+ \@expl@@@filehook@file@push@@
+ \@filehook@set@CurrentFile
+% \end{macrocode}
+% We pre-expand \cs{@filef@und} so that in case another file is
+% loaded in the true branch of \cs{InputIfFileExists}, these don't
+% change their value meanwhile. This isn't a worry with
+% \cs[no-index]{CurrentFile...} because they are kept in a stack.
+%
+% \changes{v1.0d}{2020/11/20}
+% {Move loading to \cs{@input@file@exists@with@hooks} and expand
+% \cs{@filef@und} to avoid getting the wrong file name in the case of
+% a substitution.}
+% \begin{macrocode}
+ \expandafter\@swaptwoargs\expandafter
+ {\expandafter\@input@file@exists@with@hooks
+ \expandafter{\@filef@und}}%
+ {#2}%
+ \@expl@@@filehook@file@pop@@
+ }%
+}
+\def\@input@file@exists@with@hooks#1{%
+% \end{macrocode}
+% If the file exists then \cs{CurrentFile} holds its name. But we
+% can't rely on that still being true after the file has been
+% processed. Thus for using the name in the file hooks we need to
+% preserve the name and then restore it for the
+% \texttt{file/after/...} hook.
+%
+% The hook always refers to the file requested by the user. The hook
+% is \emph{always} loaded for \cs{CurrentFile} which usually is the
+% same as \cs{CurrentFileUsed}. In the case of a file replacement,
+% the \cs{CurrentFileUsed} holds the actual file loaded. In any case
+% the file names are normalized so that the hooks work on the real
+% file name, rather than what the user typed in.
+%
+% \pkg{expl3}'s \cs{file_full_name:n} normalizes the file
+% name (to factor out differences in the |.tex| extension), and
+% then does a file lookup to take into account a possible path from
+% \cs{l_file_search_path_seq} and \cs{input@path}. However only
+% the file name and extension are returned so that file hooks can
+% refer to the file by their name only. The path to the file is
+% returned in \cs{CurrentFilePath}.
+% \changes{v1.0e}{2021/01/07}{Restore \cs[no-index]{CurrentFile(Path)(Used)}
+% after the input (gh/464)}
+% \begin{macrocode}
+ \edef\reserved@a{%
+ \@expl@@@filehook@file@pop@assign@@nnnn
+ {\CurrentFilePathUsed}%
+ {\CurrentFileUsed}%
+ {\CurrentFilePath}%
+ {\CurrentFile}}%
+ \expandafter\@swaptwoargs\expandafter{\reserved@a}%
+% \end{macrocode}
+%
+% Before adding to the file list we need to make all (letter) characters
+% catcode~11, because several packages use constructions like
+% \begin{verbatim}
+% \filename@parse{<filename>}
+% \ifx\filename@ext\@clsextension
+% ...
+% \fi
+% \end{verbatim}
+% and that doesn't work if \cs{filename@ext} is \cs{detokenize}d.
+% Making \cs{@clsextension} a string doesn't help much because some
+% packages define their own \cs[no-index]{<prefix>@someextension} with
+% normal catcodes. This is not entirely correct because packages loaded
+% (somehow) with catcode~12 alphabetic tokens (say, as the result of
+% a \cs{string} or \cs{detokenize} command, or from a \TeX{} string like
+% \cs{jobname}) will have these character tokens incorrectly turned into
+% letter tokens. This however is rare, so we'll go for the all-letters
+% approach (grepping the packages in \TeX{} Live didn't bring up any
+% obvious candidate for breaking with this catcode change).
+% \begin{macrocode}
+ {\edef\reserved@a{\unqu@tefilef@und#1\@nil}%
+ \@addtofilelist{\string@makeletter\reserved@a}%
+ \UseHook{file/before}%
+% \end{macrocode}
+% The current file name is available in \cs{CurrentFile} so we use
+% that in the specific hook.
+% \begin{macrocode}
+ \UseHook{file/before/\CurrentFile}%
+ \@@input #1% <- trailing space comes from \@filef@und
+ }%
+% \end{macrocode}
+% And here, \cs{CurrentFile} is restored
+% (by \cs{@expl@@@filehook@file@pop@assign@@nnnn}) so we can use it once more.
+% \begin{macrocode}
+ \UseHook{file/after/\CurrentFile}%
+ \UseHook{file/after}}
+\def\unqu@tefilef@und"#1" \@nil{#1}
+%<latexrelease>\EndIncludeInRelease
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \changes{v0.9b}
+% {1993/12/04}{Macro added}
+% \changes{v0.9p}
+% {1994/01/18}{New Definition}
+% \changes{v0.3b}{1994/03/13}
+% {Use new cmd \cs{@addtofilelist}}
+% Now define |\InputIfFileExists| to input |#1| if it seems to exist.
+% Immediately prior to the input, |#2| is executed.
+% If the file |#1| does not exist, execute `|#3|'.
+% \changes{v1.0t}{1995/05/25}
+% {(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}
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\InputIfFileExists}{Hook management (files)}%
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand \InputIfFileExists[2]{%
+%<latexrelease> \IfFileExists{#1}%
+%<latexrelease> {%
+%<latexrelease> \expandafter\@swaptwoargs\expandafter
+%<latexrelease> {\@filef@und}{#2\@addtofilelist{#1}\@@input}}}
+%<latexrelease>\let\@input@file@exists@with@hooks\@undefined
+%<latexrelease>\let\unqu@tefilef@und\@undefined
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\InputIfFileExists}{Hook management (files)}%
+%<latexrelease>\long\def \InputIfFileExists#1#2{%
+%<latexrelease> \IfFileExists{#1}%
+%<latexrelease> {#2\@addtofilelist{#1}\@@input \@filef@und}}
+%<latexrelease>\let\@input@file@exists@with@hooks\@undefined
+%<latexrelease>\let\unqu@tefilef@und\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%
+%
+% \subsection{Declaring a file substitution}
+%
+% \begin{macrocode}
+%<@@=filehook>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@@_subst_add:nn}{Declaring file substitution}%
+\ExplSyntaxOn
+% \end{macrocode}
+%
+%
+% \begin{macro}{\@@_subst_add:nn,\@@_subst_remove:n,
+% \@@_subst_file_normalize:Nn,\@@_subst_empty_name_chk:NN}
+% \cs{@@_subst_add:nn} declares a file substitution by
+% doing a (global) definition of the form
+% |\def|\cs{@file-subst@\meta{file}}|{|\meta{replacement}|}|.
+% The file names are properly sanitised, and normalized with the same
+% treatment done for the file hooks. That is, a file replacement is
+% declared by using the file name (and extension, if any) only, and
+% the file path should not be given. If a file name is empty it is
+% replaced by |.tex| (the empty csname is used to check that).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_subst_add:nn #1 #2
+ {
+ \group_begin:
+ \cs_set:cpx { } { \exp_not:o { \cs:w\cs_end: } }
+ \int_set:Nn \tex_escapechar:D { -1 }
+ \cs_gset:cpx
+ {
+ @file-subst@
+ \@@_subst_file_normalize:Nn \use_ii_iii:nnn {#1}
+ }
+ { \@@_subst_file_normalize:Nn \@@_file_name_compose:nnn {#2} }
+ \group_end:
+ }
+\cs_new_protected:Npn \@@_subst_remove:n #1
+ {
+ \group_begin:
+ \cs_set:cpx { } { \exp_not:o { \cs:w\cs_end: } }
+ \int_set:Nn \tex_escapechar:D { -1 }
+ \cs_undefine:c
+ {
+ @file-subst@
+ \@@_subst_file_normalize:Nn \use_ii_iii:nnn {#1}
+ }
+ \group_end:
+ }
+\cs_new:Npn \@@_subst_file_normalize:Nn #1 #2
+ {
+ \exp_after:wN \@@_subst_empty_name_chk:NN
+ \cs:w \exp_after:wN \cs_end:
+ \cs:w \@@_file_parse_full_name:nN {#2} #1 \cs_end:
+ }
+\cs_new:Npn \@@_subst_empty_name_chk:NN #1 #2
+ { \if_meaning:w #1 #2 .tex \else: \token_to_str:N #2 \fi: }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\use_ii_iii:nnn}
+% A variant of \cs[no-index]{use_...} to discard the first of three
+% arguments.
+% \fmi{this should move to \pkg{expl3}}
+% \begin{macrocode}
+\cs_gset:Npn \use_ii_iii:nnn #1 #2 #3 {#2 #3}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+%
+%
+% \begin{macro}{\declare@file@substitution}
+% \begin{macro}{\undeclare@file@substitution}
+% For two internals we provide \LaTeXe{} names so that we can use
+% them elsewhere in the kernel (and so that they can be used in
+% packages if really needed, e.g., \pkg{scrlfile}).
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\declare@file@substitution}{File substitution}%
+\ExplSyntaxOn
+\cs_new_eq:NN \declare@file@substitution \@@_subst_add:nn
+\cs_new_eq:NN \undeclare@file@substitution \@@_subst_remove:n
+\ExplSyntaxOff
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\declare@file@substitution}{File substitution}%
+%<latexrelease>
+%<latexrelease>\let \declare@file@substitution \@undefined
+%<latexrelease>\let \undeclare@file@substitution \@undefined
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macrocode}
+%<@@=>
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% \subsection{Selecting a file (\cs{set@curr@file})}
+%
+% \begin{macro}{\set@curr@file,\@curr@file,\@curr@file@reqd}
+% Now we hook into \cs{set@curr@file} to resolve a possible file
+% substitution, and add \cs{@expl@@@filehook@set@curr@file@@nNN}
+% at the end, after \cs{@curr@file} is set.
+%
+% A file name is built using
+% \cs{expandafter}\cs{string}\cs{csname}\meta{filename}\cs{endcsname}
+% to avoid expanding utf8 active characters. The \cs{csname} expands
+% the normalisation machinery and the routine to resolve a file
+% substitution, returning a control sequence with the same name as the
+% file.
+%
+% It happens that when \meta{filename} is empty, the generated control
+% sequence is \cs{csname\cs{endcsname}}, and doing \cs{string} on
+% that results in the file |csnameendcsname.tex|. To guard against
+% that we \cs{ifx}-compare the generated control sequence with the
+% empty csname. To do so, \cs{csname\cs{endcsname}} has to be
+% defined, otherwise it would be equal to \cs{relax} and we would have
+% false positives. Here we define \cs{csname\cs{endcsname}} to
+% expand to itself to avoid it matching the definition of some other
+% control sequence.
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\set@curr@file}{Setting current file name}%
+\def\set@curr@file#1{%
+ \begingroup
+ \escapechar\m@ne
+ \expandafter\def\csname\expandafter\endcsname
+ \expandafter{\csname\endcsname}%
+% \end{macrocode}
+% Two file names are set here: \cs{@curr@file@reqd} which is the file
+% requested by the user, and \cs{@curr@file} which should be the same,
+% except when we have a file substitution, in which case it holds the
+% actual loaded file. \cs{@curr@file} is resolved first, to check if
+% a substitution happens. If it doesn't,
+% \cs{@expl@@@filehook@if@file@replaced@@TF} short-cuts and just copies
+% \cs{@curr@file}, otherwise the full normalisation procedure is
+% executed.
+%
+% At this stage the file name is parsed and normalized, but if the
+% input doesn't have an extension, the default |.tex| is \emph{not}
+% added to \cs{@curr@file} because for applications other than
+% \cs{input} (graphics, for example) the default extension may not
+% be |.tex|. First check if the input has an extension, then if the
+% input had no extension, call \cs{@expl@@@filehook@drop@extension@@N}. In case
+% of a file substitution, \cs{@curr@file} will have an extension.
+% \begin{macrocode}
+ \@expl@@@filehook@if@no@extension@@nTF{#1}%
+ {\@tempswatrue}{\@tempswafalse}%
+ \@kernel@make@file@csname\@curr@file
+ \@expl@@@filehook@resolve@file@subst@@w {#1}%
+ \@expl@@@filehook@if@file@replaced@@TF
+ {\@kernel@make@file@csname\@curr@file@reqd
+ \@expl@@@filehook@normalize@file@name@@w{#1}%
+ \if@tempswa \@expl@@@filehook@drop@extension@@N\@curr@file@reqd \fi}%
+ {\if@tempswa \@expl@@@filehook@drop@extension@@N\@curr@file \fi
+ \global\let\@curr@file@reqd\@curr@file}%
+ \@expl@@@filehook@clear@replacement@flag@@
+ \endgroup}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\set@curr@file}{Setting current file name}%
+%<latexrelease>\def\set@curr@file#1{%
+%<latexrelease> \begingroup
+%<latexrelease> \escapechar\m@ne
+%<latexrelease> \xdef\@curr@file{%
+%<latexrelease> \expandafter\expandafter\expandafter\unquote@name
+%<latexrelease> \expandafter\expandafter\expandafter{%
+%<latexrelease> \expandafter\string
+%<latexrelease> \csname\@firstofone#1\@empty\endcsname}}%
+%<latexrelease> \endgroup
+%<latexrelease>}
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\set@curr@file}{Setting current file name}%
+%<latexrelease>\let\set@curr@file\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\@filehook@set@CurrentFile}
+% \begin{macro}{\@kernel@make@file@csname,\@set@curr@file@aux}
+%
+% \fmi{This should get internalized using \texttt{@expl@} names}
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@kernel@make@file@csname}{Make file csname}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@kernel@make@file@csname#1#2#3{%
+ \xdef#1{\expandafter\@set@curr@file@aux
+ \csname\expandafter#2\@firstofone#3\@nil\endcsname}}
+% \end{macrocode}
+% This auxiliary compares \cs{\meta{filename}} with
+% \cs{csname\cs{endcsname}} to check if the empty |.tex| file was
+% requested.
+% \begin{macrocode}
+\def\@set@curr@file@aux#1{%
+ \expandafter\ifx\csname\endcsname#1%
+ .tex\else\string#1\fi}
+% \end{macrocode}
+%
+% Then we call \cs{@expl@@@filehook@set@curr@file@@nNN} once for
+% \cs{@curr@file} to set \cs[no-index]{CurrentFile(Path)Used} and once for
+% \cs{@curr@file@reqd} to set \cs[no-index]{CurrentFile(Path)}.
+% Here too the slower route is only used if a substitution happened,
+% but here \cs{@expl@@@filehook@if@file@replaced@@TF} can't be used because
+% the flag is reset at the \cs{endgroup} above, so we check if
+% \cs{@curr@file} and \cs{@curr@file@reqd} differ. This macro is
+% issued separate from \cs{set@curr@file} because it changes
+% \cs{CurrentFile}, and side-effects would quickly get out of control.
+% \begin{macrocode}
+\def\@filehook@set@CurrentFile{%
+ \@expl@@@filehook@set@curr@file@@nNN{\@curr@file}%
+ \CurrentFileUsed\CurrentFilePathUsed
+ \ifx\@curr@file@reqd\@curr@file
+ \let\CurrentFile\CurrentFileUsed
+ \let\CurrentFilePath\CurrentFilePathUsed
+ \else
+ \@expl@@@filehook@set@curr@file@@nNN{\@curr@file@reqd}%
+ \CurrentFile\CurrentFilePath
+ \fi}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_set_curr_file:nNN,
+% \@@_set_curr_file_assign:nnnNN}
+% When inputting a file, \cs{set@curr@file} does a file lookup
+% (in \cs{input@path} and \cs{l_file_search_path_seq}) and returns the
+% actual file name (\meta{base} plus \meta{ext}) in
+% \cs{CurrentFileUsed}, and in case there's a file substitution, the
+% requested file in \cs{CurrentFile} (otherwise both are the same).
+% Only the base and extension are returned,
+% regardless of the input (both \texttt{path/to/file.tex} and
+% \texttt{file.tex} end up as \texttt{file.tex} in \cs{CurrentFile}).
+% The path is returned in \cs{CurrentFilePath}, in case it's needed.
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {@@_set_curr_file:nNN}{Set curr file}%
+\ExplSyntaxOn
+%<@@=filehook>
+\cs_new_protected:Npn \@@_set_curr_file:nNN #1
+ {
+ \exp_args:Nf \@@_file_parse_full_name:nN {#1}
+ \@@_set_curr_file_assign:nnnNN
+ }
+\cs_new_protected:Npn \@@_set_curr_file_assign:nnnNN #1 #2 #3 #4 #5
+ {
+ \str_set:Nn #5 {#1}
+ \str_set:Nn #4 {#2#3}
+ }
+\ExplSyntaxOff
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{Replacing a file and detecting loops}
+%
+% \begin{macro}{\@@_resolve_file_subst:w}
+% \begin{macro}{\@@_normalize_file_name:w}
+% \begin{macro}{\@@_file_name_compose:nnn}
+% Start by sanitising the file with \cs{@@_file_parse_full_name:nN}
+% then do \cs{@@_file_subst_begin:nnn}\Arg{path}\Arg{name}\Arg{ext}.
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@@_resolve_file_subst:w}{Replace files detect loops}%
+\ExplSyntaxOn
+\cs_new:Npn \@@_resolve_file_subst:w #1 \@nil
+ { \@@_file_parse_full_name:nN {#1} \@@_file_subst_begin:nnn }
+\cs_new:Npn \@@_normalize_file_name:w #1 \@nil
+ { \@@_file_parse_full_name:nN {#1} \@@_file_name_compose:nnn }
+\cs_new:Npn \@@_file_name_compose:nnn #1 #2 #3
+ { \tl_if_empty:nF {#1} { #1 / } #2#3 }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{flag @@_file_replaced}
+% \begin{macro}{\@@_if_file_replaced:TF}
+% \begin{macro}{\@@_clear_replacement_flag:}
+% Since the file replacement is done expandably in a \cs{csname}, use
+% a flag to remember if a substitution happened. We use this in
+% \cs{set@curr@file} to short-circuit some of it in case no
+% substitution happened (by far the most common case, so it's worth
+% optimising). The flag raised during the file substitution algorithm
+% must be explicitly cleared after the \cs{@@_if_file_replaced:TF}
+% conditional is no longer needed, otherwise further uses of
+% \cs{@@_if_file_replaced:TF} will wrongly return true.
+% \begin{macrocode}
+\flag_new:n { @@_file_replaced }
+\cs_new:Npn \@@_if_file_replaced:TF #1 #2
+ { \flag_if_raised:nTF { @@_file_replaced } {#1} {#2} }
+\cs_new_protected:Npn \@@_clear_replacement_flag:
+ { \flag_clear:n { @@_file_replaced } }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_file_subst_begin:nnn}
+% First off, start by checking if the current file ($\meta{name} +
+% \meta{ext}$) has a declared substitution. If not, then just put
+% that as the name (including a possible \meta{path} in this case):
+% this is the default case with no substitutions, so it's the first to
+% be checked. The auxiliary \cs{@@_file_subst_tortoise_hare:nn} sees
+% that there's no replacement for |#2#3| and does nothing else.
+% \begin{macrocode}
+\cs_new:Npn \@@_file_subst_begin:nnn #1 #2 #3
+ {
+ \@@_file_subst_tortoise_hare:nn { #2#3 } { #2#3 }
+ { \@@_file_name_compose:nnn {#1} {#2} {#3} }
+ }
+\ExplSyntaxOff
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsubsection{The Tortoise and Hare algorithm}
+%
+% \begin{macro}{\@@_file_subst_tortoise_hare:nn}
+% \begin{macro}{\@@_file_subst_loop:NN,\@@_file_subst_loop:cc}
+% If there is a substitution (\meta{true} in the first
+% \cs{cs_if_exist:cTF} below), then first check if there is no
+% substitution down the line: this should be the second most common
+% case, of one file replaced by another. In that case just leave the
+% substitution there and the job is done. If any substitution
+% happens, then the \cs{flag @@_file_replaced} is raised
+% (conditionally, because checking if a flag is raised is much faster
+% than raising it over and over again).
+%
+% If, however there are more substitutions, then we need to check for
+% a possible loop in the substitutions, which would otherwise put
+% \TeX{} in an infinite loop if just an exhaustive expansion was used.
+%
+% To detect a loop, the \emph{Tortoise and Hare} algorithm is used.
+% The name of the algorithm is an analogy to Aesop's fable, in which
+% the Hare outruns a Tortoise. The two pointers here are the csnames
+% which contains each file replacement, both of which start at the
+% position zero, which is the file requested. In the inner part of
+% the macro below, \cs{@@_file_subst_loop:cc} is called with
+% \cs[no-index]{@file-subst@\meta{file}} and
+% \cs[no-index]{@file-subst@\cs[no-index]{@file-subst@\meta{file}}};
+% that is, the substitution of \meta{file} and the substution of that
+% substution: the Tortoise walks one step while the Hare walks two.
+%
+% Within \cs{@@_file_subst_loop:NN} the two substitutions are
+% compared, and if they lead to the same file it means that there is
+% a loop in the substitutions. If there's no loop,
+% \cs{@@_file_subst_tortoise_hare:nn} is called again with the
+% Tortoise at position~1 and the hare at~2. Again, the substitutions
+% are checked ahead of the Hare pointer to check that it won't run too
+% far; in case there is no loop in the declarations, eventually one
+% of the \cs{cs_if_exist:cTF} below will go \meta{false} and the
+% algorithm will end; otherwise it will run until the Hare reaches
+% the same spot as the tortoise and a loop is detected.
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@@_file_subst_tortoise_hare:nn}{Tortoise and Hare}%
+\ExplSyntaxOn
+\cs_new:Npn \@@_file_subst_tortoise_hare:nn #1 #2 #3
+ {
+ \cs_if_exist:cTF { @file-subst@ #2 }
+ {
+ \flag_if_raised:nF { @@_file_replaced }
+ { \flag_raise:n { @@_file_replaced } }
+ \cs_if_exist:cTF { @file-subst@ \use:c { @file-subst@ #2 } }
+ {
+ \@@_file_subst_loop:cc
+ { @file-subst@ #1 }
+ { @file-subst@ \use:c { @file-subst@ #2 } }
+ }
+ { \use:c { @file-subst@ #2 } }
+ }
+ { #3 }
+ }
+% \end{macrocode}
+% This is just an auxiliary to check if a loop was found, and continue
+% the algorithm otherwise. If a loop is found, the |.tex| file is
+% used as fallback and \cs{@@_file_subst_cycle_error:cN} is called to
+% report the error.
+% \begin{macrocode}
+\cs_new:Npn \@@_file_subst_loop:NN #1 #2
+ {
+ \token_if_eq_meaning:NNTF #1 #2
+ {
+ .tex
+ \@@_file_subst_cycle_error:cN { @file-subst@ #1 } #1
+ }
+ { \@@_file_subst_tortoise_hare:nn {#1} {#2} {#2} }
+ }
+\cs_generate_variant:Nn \@@_file_subst_loop:NN { cc }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_file_subst_cycle_error:NN,
+% \@@_file_subst_cycle_error:cN,
+% }
+% Showing this type of error expandably is tricky, as we have a very
+% limited amount of characters to show and a potentially large list.
+% As a work around, several errors are printed, each showing one step
+% of the loop, until all the error messages combined show the loop.
+% \begin{macrocode}
+\cs_new:Npn \@@_file_subst_cycle_error:NN #1 #2
+ {
+ \__kernel_msg_expandable_error:nnff { kernel } { file-cycle }
+ {#1} { \use:c { @file-subst@ #1 } }
+ \token_if_eq_meaning:NNF #1 #2
+ { \@@_file_subst_cycle_error:cN { @file-subst@ #1 } #2 }
+ }
+\cs_generate_variant:Nn \@@_file_subst_cycle_error:NN { c }
+% \end{macrocode}
+%
+% And the error message:
+% \begin{macrocode}
+\__kernel_msg_new:nnn { kernel } { file-cycle }
+ { File~loop!~#1~replaced~by~#2... }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+%
+% \subsection{Preventing a package from loading}
+%
+% We support the use case of preventing a package from loading but not
+% any other type of files (e.g., classes).
+%
+% \begin{macro}{\disable@package@load}
+% \begin{macro}{\reenable@package@load}
+% \begin{macro}{\@disable@packageload@do}
+% \cs{disable@package@load} defines
+% \cs[no-index]{@pkg-disable@\meta{package}} to expand to some code |#2|
+% instead of loading the package.
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\disable@package@load}{Disable packages}%
+\def\disable@package@load#1#2{%
+ \global\@namedef{@pkg-disable@#1.\@pkgextension}{#2}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@disable@packageload@do#1#2{%
+ \@ifundefined{@pkg-disable@#1}{#2}%
+ {\@nameuse{@pkg-disable@#1}}}
+% \end{macrocode}
+%
+% \cs{reenable@package@load} undefines
+% \cs[no-index]{@pkg-disable@\meta{package}} to reallow loading a package.
+% \begin{macrocode}
+\def\reenable@package@load#1{%
+ \global\expandafter\let
+ \csname @pkg-disable@#1.\@pkgextension \endcsname \@undefined}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\disable@package@load}{Disable packages}%
+%<latexrelease>
+%<latexrelease>\let\disable@package@load \@undefined
+%<latexrelease>\let\@disable@packageload@do\@undefined
+%<latexrelease>\let\reenable@package@load \@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%
+% \subsection{High-level interfaces for \LaTeX{}}
+%
+% None so far and the general feeling for now is that the hooks are
+% enough. Packages like \pkg{filehook}, etc., may use them to set
+% up their interfaces (samples are given below) but for the now the
+% kernel will not provide any.
+%
+%
+%
+% \subsection{Internal commands needed elsewhere}
+%
+% Here we set up a few horrible (but consistent) \LaTeXe{} names to
+% allow for internal commands to be used outside this module (and
+% in parts that still use \LaTeXe{} syntax. We have to unset the
+% \texttt{@\/@} since we want double ``at'' sign in place of double
+% underscores.
+%
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@expl@@@filehook@if@no@extension@@nTF}{2e tmp interfaces}%
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@expl@@@filehook@if@no@extension@@nTF
+ \__filehook_if_no_extension:nTF
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@expl@@@filehook@set@curr@file@@nNN
+ \__filehook_set_curr_file:nNN
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@expl@@@filehook@resolve@file@subst@@w
+ \__filehook_resolve_file_subst:w
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@expl@@@filehook@normalize@file@name@@w
+ \__filehook_normalize_file_name:w
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@expl@@@filehook@if@file@replaced@@TF
+ \__filehook_if_file_replaced:TF
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@expl@@@filehook@clear@replacement@flag@@
+ \__filehook_clear_replacement_flag:
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@expl@@@filehook@drop@extension@@N
+ \__filehook_drop_extension:N
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@expl@@@filehook@file@push@@
+ \__filehook_file_push:
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@expl@@@filehook@file@pop@@
+ \__filehook_file_pop:
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@expl@@@filehook@file@pop@assign@@nnnn
+ \__filehook_file_pop_assign:nnnn
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% This one specifically has to be undefined because it is left over in
+% the input stream from \cs{InputIfFileExists} and executed when
+% \pkg{latexrelease} is loaded. It cannot be \cs{let} to \cs{@undefined}
+% otherwise it would error as well, so it is \cs{let} to \cs{relax} to
+% be silently ignored when loading \cs{latexrelease}.
+% \changes{v1.0e}{2021/01/07}{Added rollback for this case to avoid
+% spurious errors (part of gh/463)}
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@expl@@@filehook@if@no@extension@@nTF}{2e tmp interfaces}%
+%<latexrelease>\let\@expl@@@filehook@file@pop@@\relax
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+% This ends the kernel code in this file.
+% \begin{macrocode}
+%</2ekernel>
+% \end{macrocode}
+%
+%
+%
+% \section{A sample package for structuring the log output}
+%
+% \begin{macrocode}
+%<*structuredlog>
+%<@@=filehook>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ProvidesExplPackage
+ {structuredlog}{\ltfilehookdate}{\ltfilehookversion}
+ {Structuring the TeX transcript file}
+% \end{macrocode}
+%
+% \begin{macro}{\g_@@_nesting_level_int}
+% Stores the current package nesting level.
+% \begin{macrocode}
+\int_new:N \g_@@_nesting_level_int
+% \end{macrocode}
+% Initialise the counter with the number of files in the
+% \cs{@currnamestack} (the number of items divided by $3$) minus one,
+% because this package is skipped when printing to the log.
+% \begin{macrocode}
+\int_gset:Nn \g_@@_nesting_level_int
+ { ( \tl_count:N \@currnamestack ) / 3 - 1 }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_log_file_record:n}
+% This macro is responsible for increasing and decresing the file
+% nesting level, as well as printing to the log. The argument is
+% either |STOPTART| or |STOP| and the action it takes on the nesting
+% integer depends on that.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_log_file_record:n #1
+ {
+ \str_if_eq:nnT {#1} {START} { \int_gincr:N \g_@@_nesting_level_int }
+ \iow_term:x
+ {
+ \prg_replicate:nn { \g_@@_nesting_level_int } { = } ~
+ ( LEVEL ~ \int_use:N \g_@@_nesting_level_int \c_space_tl #1 ) ~
+ \CurrentFileUsed
+% \end{macrocode}
+% If there was a file replacement, show that as well:
+% \begin{macrocode}
+ \str_if_eq:NNF \CurrentFileUsed \CurrentFile
+ { ~ ( \CurrentFile \c_space_tl requested ) }
+ \iow_newline:
+ }
+ \str_if_eq:nnT {#1} {STOP} { \int_gdecr:N \g_@@_nesting_level_int }
+ }
+% \end{macrocode}
+%
+% Now just hook the macro above in the generic |file/before|\ldots
+% \begin{macrocode}
+\AddToHook{file/before}{ \@@_log_file_record:n { START } }
+% \end{macrocode}
+% \ldots and |file/after| hooks.
+% We don't want to install the \hook{file/after} hook immediately,
+% because that would mean it is the first time executed when the
+% package finishes. We therefore put the declaration inside
+% \cs{AddToHookNext} so that it gets only installed when we have
+% left this package.
+% \begin{macrocode}
+\AddToHookNext{file/after}
+ { \AddToHook{file/after}{ \@@_log_file_record:n { STOP } } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%<@@=>
+%</structuredlog>
+% \end{macrocode}
+%
+%
+%
+%
+%
+%
+% \section{Package emulations}
+%
+%
+% \subsection{Package \pkg{atveryend} emulation}
+%
+% With the new hook management and the hooks in \cs{enddocument}
+% all of \pkg{atveryend} is taken care of.
+% We can make an emulation only here after the substitution
+% functionality is available:
+% \begin{macrocode}
+%<*2ekernel>
+\declare@file@substitution{atveryend.sty}{atveryend-ltx.sty}
+%</2ekernel>
+% \end{macrocode}
+%
+% Here is the package file we point to:
+% \begin{macrocode}
+%<*atveryend-ltx>
+\ProvidesPackage{atveryend-ltx}
+ [2020/08/19 v1.0a
+ Emulation of the original atvery package^^Jwith kernel methods]
+% \end{macrocode}
+%
+%
+% Here are new definitions for its interfaces now pointing to the
+% hooks in \cs{enddocument}
+% \begin{macrocode}
+\newcommand\AfterLastShipout {\AddToHook{enddocument/afterlastpage}}
+\newcommand\AtVeryEndDocument {\AddToHook{enddocument/afteraux}}
+% \end{macrocode}
+% Next one is a bit of a fake, but the result should normally be as
+% expected. If not, one needs to add a rule to sort the code chunks
+% in \hook{enddocument/info}.
+% \begin{macrocode}
+\newcommand\AtEndAfterFileList{\AddToHook{enddocument/info}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtVeryVeryEnd {\AddToHook{enddocument/end}}
+% \end{macrocode}
+%
+% \begin{macro}{\BeforeClearDocument}
+% This one is the only one we don't implement or rather don't have
+% a dedicated hook in the code.
+% \begin{macrocode}
+\ExplSyntaxOn
+\newcommand\BeforeClearDocument[1]
+ { \AtEndDocument{#1}
+ \atveryend@DEPRECATED{BeforeClearDocument \tl_to_str:n{#1}}
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new:Npn\atveryend@DEPRECATED #1
+ {\iow_term:x{======~DEPRECATED~USAGE~#1~==========}}
+\ExplSyntaxOff
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macrocode}
+%</atveryend-ltx>
+% \end{macrocode}
+%
+%
+%
+% \Finale
+%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+
diff --git a/Master/texmf-dist/source/latex/base/ltfiles.dtx b/Master/texmf-dist/source/latex/base/ltfiles.dtx
index 33594a7b912..99be77c8449 100644
--- a/Master/texmf-dist/source/latex/base/ltfiles.dtx
+++ b/Master/texmf-dist/source/latex/base/ltfiles.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltfiles.dtx}
- [2019/11/11 v1.2f LaTeX Kernel (File Handling)]
+ [2020/10/04 v1.2j LaTeX Kernel (File Handling)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfiles.dtx}
@@ -47,6 +47,8 @@
Chris Rowley\and
Rainer Sch\"opf}
+\providecommand\pkg[1]{\texttt{#1}}
+
\begin{document}
\MaintainedByLaTeXTeam{latex}
\maketitle
@@ -55,6 +57,8 @@
%</driver>
% \fi
%
+% \providecommand\hook[1]{\texttt{#1}}
+%
%
% \changes{v1.0h}{1994/05/21}{Use new error commands}
% \changes{v1.0n}{1994/11/17}
@@ -62,6 +66,7 @@
% \changes{v1.0u}{1995/07/13}{Updates to docu}
% \changes{v1.1m}{2015/02/21}
% {Removed autoload support}
+% \changes{v1.2i}{2020/08/21}{Integration of new hook management interface}
%
% \section{File Handling}
%
@@ -234,18 +239,28 @@
% \changes{v0.9e}{1993/12/09}{Hook added}
% \begin{macrocode}
%</2ekernel>
-%<latexrelease>\IncludeInRelease{2017/04/15}%
-%<latexrelease> {\document}{Save language for hyphenation}%
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\document}{Added hook to load l3backend code}%
%<*2ekernel|latexrelease>
+\def\document{%
% \end{macrocode}
-% Cancel the |\begingroup| from |\begin|.
+% We do cancel the grouping as part of the \cs{begin} handling
+% (this is now done inside \cs{begin} instead) so that the
+% \hook{env/\meta{env}/begin} hook is not hidden inside \cs{begingroup}
+% \texttt{...} \cs{endgroup}.
% \begin{macrocode}
-\def\document{\endgroup
+% \endgroup
% \end{macrocode}
-% If some options on |\documentclass| haven't been used by any
-% package we will now give a warning since this is most certainly a
-% misspelling.
+%
% \begin{macrocode}
+ \UseOneTimeHook{begindocument/before}%
+ \@kernel@after@begindocument@before
+% \end{macrocode}
+%
+% Added hook to load \textsf{l3backend} code:
+% \changes{v1.2h}{2020/06/05}{Added hook to load \textsf{l3backend} code}
+% \begin{macrocode}
+ \@expl@sys@load@backend@@
\ifx\@unusedoptionlist\@empty\else
\@latex@warning@no@line{Unused global option(s):^^J%
\@spaces[\@unusedoptionlist]}%
@@ -348,9 +363,11 @@
% \changes{v1.1e}{1996/04/24}
% {(DPC) Reset \cs{AtBeginDocument} eg for latex/1297}
% \begin{macrocode}
- \let\AtBeginDocument\@firstofone
- \@begindocumenthook
+ \@kernel@before@begindocument
+ \UseOneTimeHook{begindocument}%
+ \@kernel@after@begindocument
% \end{macrocode}
+%
% Most of the following assignments will be done globally in case
% the user adds something like |\begin{multicols}| to the document
% hook, i.e. starts are group in |\begin{document}|.
@@ -399,13 +416,128 @@
% \begin{macrocode}
\global\let\do\noexpand
% \end{macrocode}
+%
+% \begin{macrocode}
+ \UseOneTimeHook{begindocument/end}%
+% \end{macrocode}
% \changes{v1.1c}{1995/12/05}{\cs{ignorespaces} added for latex/1933}
-% Use of |\AtBeginDocument| hook might mean that we are already in
+% Use of the hook might mean that we are already in
% horizontal mode, so ignore the space after |\begin{document}|.
% \begin{macrocode}
\ignorespaces}
+% \end{macrocode}
+%
+% The \hook{begindocument} hook already existed in the kernel since
+% 1994 under the name \cs{atbegindocumenthook} the
+% additional ones are originally from the \pkg{etoolbox}
+% package under the names \cs{@endpreamblehook} \cs{afterpreamble}.
+% \begin{macrocode}
+\NewHook{begindocument}
+\NewHook{begindocument/before}
+\NewHook{begindocument/end}
+% \end{macrocode}
+
+
+
+% \begin{macro}{\@kernel@after@begindocument@before,
+% \@kernel@before@begindocument,
+% \@kernel@after@begindocument}
+%
+% Above we used two kernel only hooks to be run after the public
+% \hook{begindocument/before} and after \hook{begindocument}
+% hooks.
+%
+% In \cs{@kernel@after@begindocument@before} we already place one
+% action: drop the fast execution code for the
+% \hook{env/document/begin} hook. That hook marks the end of the
+% preamble and should therefore only be run once. In a normal
+% document that is anyway the case (so the code would just sit
+% there taking up space afterwards, which these days is rather
+% harmless), however, in more complicated scenarios where several
+% full documents are combined to a single document it might get
+% applied several times with harmful effects. We therefore
+% explicitly drop it at this point. the coing is somewhat obscure
+% due to the name of the macro which requires constructing.
+% \begin{macrocode}
+\edef \@kernel@after@begindocument@before {%
+ \let\expandafter\noexpand\csname
+ __hook env/document/begin\endcsname
+ \noexpand\@empty}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let \@kernel@before@begindocument \@empty
+\let \@kernel@after@begindocument \@empty
+% \end{macrocode}
+%
+% \end{macro}
+%
+
+%
+% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2017/04/15}%
+%<latexrelease> {\document}{Save language for hyphenation}%
+%<latexrelease>
+%<latexrelease>\def\document{\endgroup
+%<latexrelease> \ifx\@unusedoptionlist\@empty\else
+%<latexrelease> \@latex@warning@no@line{Unused global option(s):^^J%
+%<latexrelease> \@spaces[\@unusedoptionlist]}%
+%<latexrelease> \fi
+%<latexrelease> \@colht\textheight
+%<latexrelease> \@colroom\textheight \vsize\textheight
+%<latexrelease> \columnwidth\textwidth
+%<latexrelease> \@clubpenalty\clubpenalty
+%<latexrelease> \if@twocolumn
+%<latexrelease> \advance\columnwidth -\columnsep
+%<latexrelease> \divide\columnwidth\tw@ \hsize\columnwidth \@firstcolumntrue
+%<latexrelease> \fi
+%<latexrelease> \hsize\columnwidth \linewidth\hsize
+%<latexrelease> \begingroup\@floatplacement\@dblfloatplacement
+%<latexrelease> \makeatletter\let\@writefile\@gobbletwo
+%<latexrelease> \global \let \@multiplelabels \relax
+%<latexrelease> \@input{\jobname.aux}%
+%<latexrelease> \endgroup
+%<latexrelease> \if@filesw
+%<latexrelease> \immediate\openout\@mainaux\jobname.aux
+%<latexrelease> \immediate\write\@mainaux{\relax}%
+%<latexrelease> \fi
+%<latexrelease> \process@table
+%<latexrelease> \let\glb@currsize\@empty % Force math initialization.
+%<latexrelease> \normalsize
+%<latexrelease> \everypar{}%
+%<latexrelease> \ifx\normalsfcodes\@empty
+%<latexrelease> \ifnum\sfcode`\.=\@m
+%<latexrelease> \let\normalsfcodes\frenchspacing
+%<latexrelease> \else
+%<latexrelease> \let\normalsfcodes\nonfrenchspacing
+%<latexrelease> \fi
+%<latexrelease> \fi
+%<latexrelease> \ifx\document@default@language\m@ne
+%<latexrelease> \chardef\document@default@language\language
+%<latexrelease> \fi
+%<latexrelease> \@noskipsecfalse
+%<latexrelease> \let \@refundefined \relax
+%<latexrelease> \let\AtBeginDocument\@firstofone
+%<latexrelease> \@begindocumenthook
+%<latexrelease> \ifdim\topskip<1sp\global\topskip 1sp\relax\fi
+%<latexrelease> \global\@maxdepth\maxdepth
+%<latexrelease> \global\let\@begindocumenthook\@undefined
+%<latexrelease> \ifx\@listfiles\@undefined
+%<latexrelease> \global\let\@filelist\relax
+%<latexrelease> \global\let\@addtofilelist\@gobble
+%<latexrelease> \fi
+%<latexrelease> \gdef\do##1{\global\let ##1\@notprerr}%
+%<latexrelease> \@preamblecmds
+%<latexrelease> \global\let \@nodocument \relax
+%<latexrelease> \global\let\do\noexpand
+%<latexrelease> \ignorespaces}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\document}{Save language for hyphenation}
%<latexrelease>\def\document{\endgroup
@@ -539,26 +671,14 @@
% \end{macrocode}
%
%
-% \begin{macro}{\includeonly}
+% \begin{macro}{\include,\includeonly}
+% \changes{v0.9p}{1994/01/18}
+% {Use \cs{@input@} so include files are listed.}
% \changes{v1.0p}{1995/04/22}{Allow blanks in argument}
% \changes{v1.2a}{2019/07/01}{Support UTF-8}
-% \begin{macrocode}
-%</2ekernel>
-%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2019/10/01}%
-%<latexrelease> {\includeonly}{Spaces in file names}%
-\def\includeonly#1{%
- \@partswtrue
- \set@curr@file{\zap@space#1 \@empty}%
- \let\@partlist\@curr@file
- }
-\@onlypreamble\includeonly
-% \end{macrocode}
-% \end{macro}
+% \changes{v1.2g}{2020/05/02}{Improved support for spaces in filenames
+% (gh/217)}
%
-% \begin{macro}{\include}
-% \changes{v0.9p}{1994/01/18}
-% {Use \cs{@input@} so include files are listed.}
% In the definition of |\include|, |\def\reserved@b| changed to
% |\edef\reserved@b| to be consistent with the |\edef| in
% |\includeonly|.
@@ -572,21 +692,113 @@
%
% Made |\include| check for being used inside an |\include|'d file, as
% this will not work and cause surprising results.
+% \changes{v1.2g}{2020/05/02}{Get rid of leading and trailing spaces
+% from the filename (gh/217)}
+% \changes{v1.2g}{2020-05-02}{Pass the filename to \cs{@include} by
+% value instead of by reference (gh/217)}
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\includeonly}{Spaces in file names}%
+% \end{macrocode}
+%
% \begin{macrocode}
\def\include#1{\relax
\ifnum\@auxout=\@partaux
\@latex@error{\string\include\space cannot be nested}\@eha
\else
- \set@curr@file{#1 }%
- \expandafter\@include\@curr@file
+% \end{macrocode}
+% Here the normalisation will add |.tex| for all files, (it uses the
+% the same normalisation as the hooks), so we need to remove that
+% manually. \cs{@strip@tex@ext} does that.
+% \begin{macrocode}
+ \set@curr@file{#1}%
+ \edef\@curr@file{\@strip@tex@ext\@curr@file}%
+% \end{macrocode}
+% For historical reasons \cs{@include} expects an argument
+% delimited by a space. This is kept (though uncessary now) to avoid
+% errors in other packages that use \cs{@include} directly.
+% \begin{macrocode}
+ \expandafter\@include\expandafter{\@curr@file} % deliberate space
\fi}
% \end{macrocode}
-% \end{macro}
%
+% Here in \cs{includeonly} we also need to strip |.tex| after
+% normalisation:
+% \begin{macrocode}
+\def\includeonly#1{%
+ \@partswtrue
+% \end{macrocode}
+% Because the argument to |\includeonly| is a comma-separated list
+% of filenames where there may be comma's precedeing some of the
+% filenames or trailing them. Therefore we need to take the list
+% apart, remove the unwanted spaces while leaving the spaces
+% \emph{in} the filenames intact.
+% \begin{macrocode}
+ \let\@partlist\@empty
+ \@for\reserved@a:=#1 \do
+ {%
+ \expandafter\set@curr@file\expandafter{\reserved@a}%
+ \ifx\@partlist\@empty
+ \edef\@partlist{\@strip@tex@ext\@curr@file}%
+ \else
+ \edef\@partlist{\@partlist,\@strip@tex@ext\@curr@file}%
+ \fi
+ }%
+ }
+\@onlypreamble\includeonly
+% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\@strip@tex@ext,\@strip@tex@ext@aux}
+% These macros take a (\cs{detokenize}d file name and remove any
+% |.tex| extension). Extra care is taken to not remove the string
+% |.tex| from the middle of a file name: it is only removed if it's
+% the very last thing in the file name.
% \begin{macrocode}
+\def\reserved@a#1{%
+\def\@strip@tex@ext##1{%
+ \expandafter\@strip@tex@ext@aux
+ ##1\@nil\@nil
+ #1\@nil\relax\@nnil}
+\def\@strip@tex@ext@aux##1#1\@nil##2\@nnil{%
+ \ifx\relax##2\@empty
+ \expandafter\@cdr\expandafter\@empty\@cdr{}##1%
+ \else##1\fi}}%
+\expandafter\reserved@a
+\expandafter{\detokenize{.tex}}
%</2ekernel|latexrelease>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\includeonly}{Spaces in file names}%
+%<latexrelease>
+%<latexrelease>\def\includeonly#1{%
+%<latexrelease> \@partswtrue
+%<latexrelease> \set@curr@file{\zap@space#1 \@empty}%
+%<latexrelease> \let\@partlist\@curr@file
+%<latexrelease> }
+%<latexrelease>
+%<latexrelease>\def\include#1{\relax
+%<latexrelease> \ifnum\@auxout=\@partaux
+%<latexrelease> \@latex@error{\string\include\space cannot be nested}\@eha
+%<latexrelease> \else
+%<latexrelease> \set@curr@file{#1 }%
+%<latexrelease> \expandafter\@include\@curr@file
+%<latexrelease> \fi}
+%<latexrelease>
+%<latexrelease>\let\@strip@tex@ext\@undefined
+%<latexrelease>\let\@strip@tex@ext@aux\@undefined
+%<latexrelease>
%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\includeonly}{Spaces in file names}%
%<latexrelease>\def\includeonly#1{%
@@ -601,9 +813,19 @@
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
% \end{macrocode}
-
%
% \begin{macro}{\@include}
+% \changes{v1.2g}{2020/05/02}{Support spaces in filenames by enclosing
+% the names of \texttt{.aux}-files in quotes (gh/217)}
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@include}{Spaces in file names and hooks}%
+% \end{macrocode}
+%
+% \changes{v1.2j}{2020/10/04}{Quotes around the aux file name removed,
+% they are not needed and upset BibTeX (gh/400)}
% \begin{macrocode}
\def\@include#1 {%
\clearpage
@@ -620,11 +842,41 @@
\if@tempswa
\let\@auxout\@partaux
\if@filesw
- \immediate\openout\@partaux #1.aux
+ \immediate\openout\@partaux "#1.aux"
\immediate\write\@partaux{\relax}%
\fi
+% \end{macrocode}
+% Now before going to the hooks we need to set \cs{CurrentFile}:
+% \begin{macrocode}
+%-----------------------------------------
+ \@filehook@set@CurrentFile
+% \end{macrocode}
+% Execute the \texttt{before} hooks just after we switched the
+% \texttt{.aux} file \ldots
+% \begin{macrocode}
+ \UseHook{include/before}%
+ \UseHook{include/before/#1}%
+%-----------------------------------------
\@input@{#1.tex}%
+%-----------------------------------------
+% \end{macrocode}
+% \ldots{} then \texttt{end} hooks \ldots
+% \begin{macrocode}
+ \UseHook{include/end/#1}%
+ \UseHook{include/end}%
+%-----------------------------------------
\clearpage
+%-----------------------------------------
+% \end{macrocode}
+% \ldots{} and after the \cs{clearpage} the \texttt{after} hooks
+% followed by another \cs{clearpage} just in case new material got
+% added (after all we need to be in well defined state after the
+% \cs{include}).
+% \begin{macrocode}
+ \UseHook{include/after/#1}%
+ \UseHook{include/after}%
+ \clearpage
+%-----------------------------------------
\@writeckpt{#1}%
\if@filesw
\immediate\closeout\@partaux
@@ -640,6 +892,45 @@
\@nameuse{cp@#1}%
\fi
\let\@auxout\@mainaux}
+%<latexrelease>\EndIncludeInRelease
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@include}{Spaces in file names}%
+%<latexrelease>\def\@include#1 {%
+%<latexrelease> \clearpage
+%<latexrelease> \if@filesw
+%<latexrelease> \immediate\write\@mainaux{\string\@input{#1.aux}}%
+%<latexrelease> \fi
+%<latexrelease> \@tempswatrue
+%<latexrelease> \if@partsw
+%<latexrelease> \@tempswafalse
+%<latexrelease> \edef\reserved@b{#1}%
+%<latexrelease> \@for\reserved@a:=\@partlist\do
+%<latexrelease> {\ifx\reserved@a\reserved@b\@tempswatrue\fi}%
+%<latexrelease> \fi
+%<latexrelease> \if@tempswa
+%<latexrelease> \let\@auxout\@partaux
+%<latexrelease> \if@filesw
+%<latexrelease> \immediate\openout\@partaux #1.aux
+%<latexrelease> \immediate\write\@partaux{\relax}%
+%<latexrelease> \fi
+%<latexrelease> \@input@{#1.tex}%
+%<latexrelease> \clearpage
+%<latexrelease> \@writeckpt{#1}%
+%<latexrelease> \if@filesw
+%<latexrelease> \immediate\closeout\@partaux
+%<latexrelease> \fi
+%<latexrelease> \else
+%<latexrelease> \deadcycles\z@
+%<latexrelease> \@nameuse{cp@#1}%
+%<latexrelease> \fi
+%<latexrelease> \let\@auxout\@mainaux}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -688,7 +979,6 @@
%
%
%
-
% \begin{macro}{\@curr@file}
% \begin{macro}{\set@curr@file}
%
@@ -698,8 +988,8 @@
% the code in \texttt{utf8.def}). By setting \cs{escapchar} to
% \texttt{-1} we ensure that we don't get a backslash in front. As a
% result we end up with all characters as catcode 12 (plus
-% spaces). We then sometimes add quotes around the contruct
-% (removing any existing inner quotes. Somes we only remove the
+% spaces). We then sometimes add quotes around the construct
+% (removing any existing inner quotes. Sometimes we only remove the
% quotes if they have been supplied by the user. There is clearly
% some room for improvement.
%
@@ -716,11 +1006,11 @@
% \changes{v1.2c}{2019/10/11}{Remove one brace group}
% \changes{v1.2d}{2019/10/26}{remove quotes}
% \changes{v1.2e}{2019/11/09}{expand and \cs{string} before removing quotes}
+%
+% The definition below is from 2019 and only used during kernel
+% bootstrapping, later on in \texttt{ltfilehook.dtx} it will get
+% overwritten.
% \begin{macrocode}
-%</2ekernel>
-%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2019/10/01}%
-%<latexrelease> {\set@curr@file}{Quote file names}%
\def\set@curr@file#1{%
\begingroup
\escapechar\m@ne
@@ -747,6 +1037,10 @@
% -> ""
%\end{verbatim}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\quote@name}{Quote file names}%
\def\quote@name#1{"\quote@@name#1\@gobble""}
\def\quote@@name#1"{#1\quote@@name}
% \end{macrocode}
@@ -828,12 +1122,11 @@
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
-%<latexrelease> {\set@curr@file}{Quote file names}%
+%<latexrelease> {\quote@name}{Quote file names}%
%<latexrelease>
%<latexrelease>\let\quote@name\@undefined
%<latexrelease>\let\quote@@name\@undefined
%<latexrelease>\let\unquote@name\@undefined
-%<latexrelease>\let\set@curr@file\@undefined
%<latexrelease>
%<latexrelease>\let\IfFileExists@\@undefined
%<latexrelease>
@@ -873,25 +1166,14 @@
%
%
% \begin{macro}{\InputIfFileExists}
-% \changes{v0.9b}
-% {1993/12/04}{Macro added}
-% \changes{v0.9p}
-% {1994/01/18}{New Definition}
-% \changes{v0.3b}{1994/03/13}
-% {Use new cmd \cs{@addtofilelist}}
-% Now define |\InputIfFileExists| to input |#1| if it seems to exist.
-% Immediately prior to the input, |#2| is executed.
-% If the file |#1| does not exist, execute `|#3|'.
-% \changes{v1.0t}{1995/05/25}
-% {(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>
+%
+% Now define |\InputIfFileExists| to input |#1| if it seems to exist.
+% Immediately prior to the input, |#2| is executed.
+% If the file |#1| does not exist, execute `|#3|'.
+%
+% This here is a temporary definition for the kernel. The real one
+% comes somewhat later in the file \texttt{ltfilehook.dtx}.
+%
% \begin{macrocode}
\DeclareRobustCommand \InputIfFileExists[2]{%
\IfFileExists{#1}%
@@ -908,25 +1190,23 @@
% Swap two arguments and return them unbraced (like
% \cs{@firstoftwo} etc).
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\@swaptwoargs}{Don't lose the file name}%
\long\def\@swaptwoargs#1#2{#2#1}
% \end{macrocode}
-% \end{macro}
-%
%
% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
-%<latexrelease> {\InputIfFileExists}{Don't lose the file name}%
-%<latexrelease>\long\def \InputIfFileExists#1#2{%
-%<latexrelease> \IfFileExists{#1}%
-%<latexrelease> {#2\@addtofilelist{#1}\@@input \@filef@und}}
-%<latexrelease>
+%<latexrelease> {\@swaptwoargs}{Don't lose the file name}%
%<latexrelease>\let\@swaptwoargs\@undefined
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
% \end{macrocode}
-%
+% \end{macro}
%
%
% \begin{macro}{\input}
@@ -943,20 +1223,51 @@
% Define |\@iinput| (i.e., |\input|) in terms of
% |\InputIfIfileExists|.
% \changes{v0.9b}{1993/12/04}{Macro reimplemented}
+%
+% Changes to \cs{@iinput}: adapt to the changes to
+% \cs{@missingfileerror}.
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2019/10/01}%
-%<latexrelease> {\@iinput}{Quote file names}%
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@iinput}{Change in file error handling}%
\def\@iinput#1{%
\InputIfFileExists{#1}{}%
{\filename@parse\@curr@file
\edef\reserved@a{\noexpand\@missingfileerror
{\filename@area\filename@base}%
{\ifx\filename@ext\relax tex\else\filename@ext\fi}}%
+% \end{macrocode}
+% This line now just sets \cs[no-index]{@missingfile@\meta{part}}:
+% \begin{macrocode}
+ \reserved@a
+% \end{macrocode}
+% Now here we have to use it. The file here is guaranteed to exist,
+% because \cs{@missingfileerror} ensures so, but we have to use
+% \cs{InputIfFileExists} because it executes the file hooks.
+% \begin{macrocode}
+ \edef\reserved@a{\noexpand\@iinput{%
+ \@missingfile@area\@missingfile@base.\@missingfile@ext}}%
\reserved@a}}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\@iinput}{Quote file names}%
+%<latexrelease>
+%<latexrelease>\def\@iinput#1{%
+%<latexrelease> \InputIfFileExists{#1}{}%
+%<latexrelease> {\filename@parse\@curr@file
+%<latexrelease> \edef\reserved@a{\noexpand\@missingfileerror
+%<latexrelease> {\filename@area\filename@base}%
+%<latexrelease> {\ifx\filename@ext\relax tex\else\filename@ext\fi}}%
+%<latexrelease> \reserved@a}}
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\@iinput}{Quote file names}%
%<latexrelease>\def\@iinput#1{%
@@ -1001,6 +1312,11 @@
% \end{macrocode}
% \end{macro}
%
+%
+%
+%
+%
+%
% \begin{macro}{\@missingfileerror}
% This `error' command avoids \TeX's primitive missing file loop.
%
@@ -1018,7 +1334,16 @@
% {Move here from ltclass}
% \changes{v1.0w}{1995/10/06}
% {Autoload error}
+%
+% Changes to \cs{@missingfileerror}: rather than trying to input the
+% file by force, now \cs{@missingfileerror} just returns three
+% \cs[no-index]{@missingfile@\meta{part}} and the caller macro is
+% responsible for doing the right thing with it.
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@missingfileerror}{Do not load missing file immediately}%
\gdef\@missingfileerror#1#2{%
\typeout{^^J! LaTeX Error: File `#1.#2' not found.^^J^^J%
Type X to quit or <RETURN> to proceed,^^J%
@@ -1027,20 +1352,74 @@
{\endlinechar\m@ne
\global\read\m@ne to\@gtempa}%
\ifx\@gtempa\@empty
+% \end{macrocode}
+% If the user answers with \meta{return}, fallback to the |.tex| file
+% (previously it did nothing).
+% \begin{macrocode}
+ \let\@missingfile@area\@empty
+ \let\@missingfile@base\@empty
+ \def\@missingfile@ext{tex}%
\else
- \def\reserved@a{x}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
- \def\reserved@a{X}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
+% \end{macrocode}
+% Use \cs{batchmode}\cs{read}|-1 to |\meta{tl} to end the \TeX{} run,
+% same as \pkg{expl3} does (it was \cs{batchmode}\cs{@@end} before).
+% \begin{macrocode}
+ \def\reserved@b{\batchmode\read-1 to \reserved@a}%
+ \def\reserved@a{x}\ifx\reserved@a\@gtempa\reserved@b\fi
+ \def\reserved@a{X}\ifx\reserved@a\@gtempa\reserved@b\fi
\filename@parse\@gtempa
\edef\filename@ext{%
\ifx\filename@ext\relax#2\else\filename@ext\fi}%
\edef\reserved@a{%
- \noexpand\InputIfFileExists
+% \end{macrocode}
+% Only check \cs{IfFileExists} (it was \cs{InputIfFileExists}).
+% \begin{macrocode}
+ \noexpand\IfFileExists
{\filename@area\filename@base.\filename@ext}%
- {}%
+% \end{macrocode}
+% If the file exists, define \cs[no-index]{@missingfile@\meta{part}}.
+% \begin{macrocode}
+ {\def\noexpand\@missingfile@area{\filename@area}%
+ \def\noexpand\@missingfile@base{\filename@base}%
+ \def\noexpand\@missingfile@ext {\filename@ext}}%
{\noexpand\@missingfileerror
{\filename@area\filename@base}{\filename@ext}}}%
\reserved@a
- \fi}
+ \fi
+}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@missingfileerror}{Do not load missing file immediately}%
+%<latexrelease>
+%<latexrelease>\gdef\@missingfileerror#1#2{%
+%<latexrelease> \typeout{^^J! LaTeX Error: File `#1.#2' not found.^^J^^J%
+%<latexrelease> Type X to quit or <RETURN> to proceed,^^J%
+%<latexrelease> or enter new name. (Default extension: #2)^^J}%
+%<latexrelease> \message{Enter file name: }%
+%<latexrelease> {\endlinechar\m@ne
+%<latexrelease> \global\read\m@ne to\@gtempa}%
+%<latexrelease> \ifx\@gtempa\@empty
+%<latexrelease> \else
+%<latexrelease> \def\reserved@a{x}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
+%<latexrelease> \def\reserved@a{X}\ifx\reserved@a\@gtempa\batchmode\@@end\fi
+%<latexrelease> \filename@parse\@gtempa
+%<latexrelease> \edef\filename@ext{%
+%<latexrelease> \ifx\filename@ext\relax#2\else\filename@ext\fi}%
+%<latexrelease> \edef\reserved@a{%
+%<latexrelease> \noexpand\InputIfFileExists
+%<latexrelease> {\filename@area\filename@base.\filename@ext}%
+%<latexrelease> {}%
+%<latexrelease> {\noexpand\@missingfileerror
+%<latexrelease> {\filename@area\filename@base}{\filename@ext}}}%
+%<latexrelease> \reserved@a
+%<latexrelease> \fi}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex/base/ltfinal.dtx b/Master/texmf-dist/source/latex/base/ltfinal.dtx
index 56549507624..aa4219723af 100644
--- a/Master/texmf-dist/source/latex/base/ltfinal.dtx
+++ b/Master/texmf-dist/source/latex/base/ltfinal.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltfinal.dtx}
- [2019-10-02 v2.2 LaTeX Kernel (Final Settings)]
+ [2020-09-26 v2.2j LaTeX Kernel (Final Settings)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfinal.dtx}
@@ -88,6 +88,7 @@
% argument.}
% \changes{v2.0r}{2016/10/15}{Require e\TeX{}}
% \changes{v2.0s}{2016/10/15}{Tidy up status of char 127}
+% \changes{v2.2i}{2020/08/21}{Integration of new hook management interface}
%
% \subsection{Debugging}
%
@@ -460,6 +461,14 @@
\fi
% \end{macrocode}
%
+% \changes{v2.2b}{2020/07/08}
+% {Add a last-minute hook for \textsf{expl3}}
+% At this stage, we can install any last-minute \textsf{expl3} set-up.
+% \begin{macrocode}
+\@expl@finalise@setup@@
+\def\@expl@finalise@setup@@{}
+% \end{macrocode}
+%
% This is as good a place as any to active a few Xe\TeX{}-specific
% settings
% \begin{macrocode}
@@ -582,7 +591,7 @@
% Skip this section in Unicode TeX, or if MLTeX and EncTeX are enabled.
% \begin{macrocode}
\ifnum0%
- \ifx\Umathchar\@undefined\else 1\fi
+ \ifx\Umathcode\@undefined\else 1\fi
\ifx\mubyte\@undefined\else 1\fi
\ifx\charsubdef\@undefined\else 1\fi
=\z@
@@ -1044,13 +1053,8 @@
% }{}
% \end{macrocode}
%
-% \subsection{Loading further extensions}
-%
% \changes{v2.2}{2019-10-02}{Load \textsf{ltexpl}}
-% Simply load further code: it's deliberately separate
-% \begin{macrocode}
-\input{ltexpl.ltx}
-% \end{macrocode}
+% \changes{v2.2a}{2020-06-04}{Load \textsf{ltexpl} in \texttt{ltdefns}}
%
% \subsection{Freeing Memory}
%
@@ -1124,14 +1128,6 @@
% \end{macro}
% \end{macro}
%
-% \subsection{Some last minute initializations \ldots}
-%
-% This initializes the 2020/02/02 extensions to NFSS after any changes
-% in the preamble.
-% \begin{macrocode}
-\AtBeginDocument{\reinstall@nfss@defs\init@series@setup}
-% \end{macrocode}
-%
%
%
% \subsection{Do some temporary work for pre-release}
@@ -1139,9 +1135,18 @@
% This is a good place to load code that hasn't yet been
% integrated into the other files \ldots
% \begin{macrocode}
-%\input ...
% \end{macrocode}
%
+% \subsection{Some last minute initializations \ldots}
+%
+% Load the first aid set of definitions for external packages that await updates.
+% \changes{v2.2j}{2020/09/26}
+% {Load first aid file if existing}
+% \begin{macrocode}
+\@input{latex2e-first-aid-for-external-files.ltx}
+% \end{macrocode}
+%
+%
% \subsection{Dumping the format}
% Finally we make |@| into a letter, ensure the format will
% be in the `normal' error mode, and dump everything into the
diff --git a/Master/texmf-dist/source/latex/base/ltfloat.dtx b/Master/texmf-dist/source/latex/base/ltfloat.dtx
index 23c3f464d3f..dee9a10197e 100644
--- a/Master/texmf-dist/source/latex/base/ltfloat.dtx
+++ b/Master/texmf-dist/source/latex/base/ltfloat.dtx
@@ -31,7 +31,7 @@
%
%<*driver>
% \fi
-\ProvidesFile{ltfloat.dtx}[2015/02/21 v1.2c LaTeX Kernel (Floats)]
+\ProvidesFile{ltfloat.dtx}[2020/04/09 v1.2d LaTeX Kernel (Floats)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfloat.dtx}
@@ -1327,13 +1327,36 @@
% always start with a font selection command, to activate the font
% size switch.
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@textsuperscript}{superscript baseline}%
\def\@textsuperscript#1{%
- {\m@th\ensuremath{^{\mbox{\fontsize\sf@size\z@#1}}}}}
+ {\m@th\ensuremath{^{\mbox{\fontsize\sf@size\sf@size#1}}}}}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@textsuperscript}{superscript baseline}%
+%<latexrelease>
+%<latexrelease>\def\@textsuperscript#1{%
+%<latexrelease> {\m@th\ensuremath{^{\mbox{\fontsize\sf@size\z@#1}}}}}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
+%
+%
+%
+%
+%
+%
% \begin{macro}{\textsubscript}
% \changes{v1.2a}{2014/12/30}{Command added (latexrelease)}
+% \changes{v1.2d}{2020/04/09}{Set non-zero baseline (gh/249)}
% \begin{macrocode}
%</2ekernel>
%<latexrelease>\IncludeInRelease{2015/01/01}%
@@ -1345,27 +1368,54 @@
\DeclareRobustCommand*\textsubscript[1]{%
\@textsubscript{\selectfont#1}}%
% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\textsubscript}{\textsubscript}%
+%<latexrelease>\let\textsubscript\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
% \end{macro}
%
+%
+%
+%
% \begin{macro}{\@textsubscript}
% \changes{v1.2a}{2014/12/30}{Command added (latexrelease)}
-%
+% \changes{v1.2d}{2020/04/09}{Set non-zero baseline (gh/249)}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@textsubscript}{subscript baseline}%
\def\@textsubscript#1{%
- {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}}
+ {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\sf@size#1}}}}}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2015/01/01}%
+%<latexrelease> {\@textsubscript}{subscript baseline}%
+%<latexrelease>
+%<latexrelease>\def\@textsubscript#1{%
+%<latexrelease> {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}}
% \end{macrocode}
-% \end{macro}
%
% \begin{macrocode}
-%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
-%<latexrelease> {\textsubscript}{\textsubscript}%
-%<latexrelease>\let\textsubscript\@undefined
+%<latexrelease> {\@textsubscript}{subscript baseline}%
%<latexrelease>\let\@textsubscript\@undefined
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
% \end{macrocode}
+% \end{macro}
+%
+%
%
% \begin{macro}{\footnotesep}
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/base/ltfssaxes.dtx b/Master/texmf-dist/source/latex/base/ltfssaxes.dtx
index 02a49a3122d..a66a26cd39c 100644
--- a/Master/texmf-dist/source/latex/base/ltfssaxes.dtx
+++ b/Master/texmf-dist/source/latex/base/ltfssaxes.dtx
@@ -35,7 +35,7 @@
%
%
\ProvidesFile{ltfssaxes.dtx}
- [2020/02/27 v1.0d LaTeX Kernel (NFSS Axes handing)]
+ [2020/08/21 v1.0g LaTeX Kernel (NFSS Axes handing)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -695,7 +695,7 @@
%
% \begin{macro}{\fontseriesforce}
% To change unconditionally to a new series you can use
-% \cs{fontseriesforce}. If course, if the series doesn't exist for
+% \cs{fontseriesforce}. Of course, if the series doesn't exist for
% the current family substitution still happens, but there is not
% dependency on the current series.
% \changes{v1.0c}{2020/02/10}{Switch \cs{if@forced@series} added}
@@ -836,7 +836,7 @@
% condensed series, etc.). We do this in all branches above because a user
% might have written
%\begin{verbatim}
-\DeclareFontSeriesChangeRule {m}{sc}{msc}{mc}
+% \DeclareFontSeriesChangeRule {m}{sc}{msc}{mc}
%\end{verbatim}
% instead of using \texttt{sc} and \texttt{c} as needed in the
% \texttt{.fd} file.
@@ -849,7 +849,7 @@
% \changes{v1.0d}{2020/02/27}{Drop ``m'' only in a specific set of values (gh/293)}
% \begin{macrocode}
\edef\f@series{#1}%
- \expandafter\series@maybe@drop@one@m\expandafter{\f@series}\f@series
+ \series@maybe@drop@one@m\f@series\f@series
}
% \end{macrocode}
% \end{macro}
@@ -865,7 +865,13 @@
% \changes{v1.0d}{2020/02/27}{Drop ``m'' in certain values from a
% fixed list (gh/293)}
% \begin{macrocode}
-\def\series@maybe@drop@one@m#1#2{%
+\def\series@maybe@drop@one@m#1{%
+ \expandafter\series@maybe@drop@one@m@x\expandafter{#1}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+
+\def\series@maybe@drop@one@m@x#1#2{%
% \end{macrocode}
% The code below is an inline version of the \cs{in@} macro without
% the group, so that it works in \cs{accent}.
@@ -875,7 +881,16 @@
,ulm,elm,lm,slm,mm,sbm,bm,ebm,ubm,muc,mec,mc,msc,msx,mx,mex,mux,{}{},#1,}%
\edef\in@@{\the\series@check@toks}%
\ifx\in@@\@empty
- \def#2{#1}%
+% \end{macrocode}
+% The default definition for \cs{bfdefault} etc is actually
+% \texttt{b\cs{@empty}} so that we can detect if the user has
+% changed the default. However that means a) the above test will
+% definitely fail (maybe something to change) and b) we better use
+% \cs{edef} on the next line to get rid of it as otherwise the test
+% against \verb=#2= (e.g. \cs{bfdef@ult}) will fail in other places.
+% \changes{v1.0e}{2020/05/19}{Need to use \cs{edef} (gh/336)}
+% \begin{macrocode}
+ \edef#2{#1}%
\else
\edef#2{\expandafter\series@drop@one@m #1m\series@drop@one@m}%
\fi
@@ -891,7 +906,7 @@
% \begin{macro}{\series@drop@one@m}
% Drop up to two \texttt{m}s but keep one if that makes the series
% value empty. Actually, with the current implementation we know
-% that there is at least one in the series value istelf and we
+% that there is at least one in the series value itself and we
% added one after it, so all we have to do is now returning
% \verb=#1#2= and dropping the rest.
% \begin{macrocode}
@@ -949,6 +964,7 @@
\DeclareRobustCommand\ulcshape
{\not@math@alphabet\ulcshape\relax
\fontshape\ulcdefault\selectfont}
+\let\ulcdefault\@undefined % for rollback
\newcommand\ulcdefault{ulc}
% \end{macrocode}
% \end{macro}
@@ -969,6 +985,7 @@
\DeclareRobustCommand\swshape
{\not@math@alphabet\swshape\relax
\fontshape\swdefault\selectfont}
+\let\swdefault\@undefined % for rollback
\newcommand\swdefault{sw}
% \end{macrocode}
% \end{macro}
@@ -992,6 +1009,7 @@
\DeclareRobustCommand\sscshape
{\not@math@alphabet\sscshape\relax
\fontshape\sscdefault\selectfont}
+\let\sscdefault\@undefined % for rollback
\newcommand\sscdefault{ssc}
% \end{macrocode}
% \end{macro}
@@ -1276,6 +1294,35 @@
%<latexrelease>\let\reinstall@nfss@defs\relax
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
+% \end{macrocode}
+%
+% This initializes the 2020/02/02 extensions to NFSS after any changes
+% in the preamble.
+% \changes{v1.0g}{2020/08/21}{Integration of new hook management interface}
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\reinstall@nfss@defs}{NFSS series init}%
+\g@addto@macro\@kernel@after@begindocument@before
+ {\reinstall@nfss@defs\init@series@setup}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% The initialization was introduced in 2020/02/02 but
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2020/02/02}%
+%<latexrelease> {\reinstall@nfss@defs}{NFSS series init}%
+%<latexrelease>\AtBeginDocument{\reinstall@nfss@defs\init@series@setup}
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\reinstall@nfss@defs}{NFSS series init}%
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
%</2ekernel>
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/base/ltfssbas.dtx b/Master/texmf-dist/source/latex/base/ltfssbas.dtx
index f51d742d466..30f500b6e4e 100644
--- a/Master/texmf-dist/source/latex/base/ltfssbas.dtx
+++ b/Master/texmf-dist/source/latex/base/ltfssbas.dtx
@@ -35,7 +35,7 @@
%
%
\ProvidesFile{ltfssbas.dtx}
- [2020/02/27 v3.2g LaTeX Kernel (NFSS Basic Macros)]
+ [2020/12/10 v3.2h LaTeX Kernel (NFSS Basic Macros)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -282,7 +282,7 @@
% \cs{reservedb} so we use that and also issue a warning.
% \begin{macrocode}
\edef\reserved@a{#3}%
- \expandafter\series@maybe@drop@one@m\expandafter{#3}\reserved@b
+ \series@maybe@drop@one@m\reserved@a\reserved@b
\ifx\reserved@a\reserved@b\else
\@latex@warning{Font shape declaration has incorrect series
value `#3'.\MessageBreak It should not contain an `m'!
@@ -891,12 +891,31 @@
% series and shape which is not desired if we intend to use an
% explicit font shape!
% \changes{v3.2e}{2019/12/17}{Don't call \cs{fontseries} or \cs{fontshape}}
+% \changes{v3.2h}{2020/12/10}{Drop ``m'' if the series value is a member
+% of a fixed list and issue warning if doing it (gh/453)}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/02/02}%
+%<latexrelease> {\usefont}{Drop m in usefont}%
\DeclareRobustCommand\usefont[4]{\fontencoding{#1}%
\edef\f@family{#2}%
- \edef\f@series{#3}%
+ \set@target@series{#3}%
\edef\f@shape{#4}\selectfont
\ignorespaces}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\usefont}{Drop m in usefont}%
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand\usefont[4]{\fontencoding{#1}%
+%<latexrelease> \edef\f@family{#2}%
+%<latexrelease> \edef\f@series{#3}%
+%<latexrelease> \edef\f@shape{#4}\selectfont
+%<latexrelease> \ignorespaces}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -1850,7 +1869,7 @@
% Finally, it is not possible to simply call the new definition
% since we
% have an argument (the third argument of |\use@mathgroup|
-% or more exactly the argument od |\math@egroup| if the {\ttfamily
+% or more exactly the argument of |\math@egroup| if the {\ttfamily
% margid} option is in force)
% which would swallow our closing |\fi|. So
% we use the |\expandafter| technique to remove the |\fi|
diff --git a/Master/texmf-dist/source/latex/base/ltfssdcl.dtx b/Master/texmf-dist/source/latex/base/ltfssdcl.dtx
index 951c6de2e5a..291cd1368f2 100644
--- a/Master/texmf-dist/source/latex/base/ltfssdcl.dtx
+++ b/Master/texmf-dist/source/latex/base/ltfssdcl.dtx
@@ -36,7 +36,7 @@
%
%
\ProvidesFile{ltfssdcl.dtx}
- [2020/01/20 v3.0t LaTeX Kernel (NFSS Declarative Interface)]
+ [2020/03/19 v3.0v LaTeX Kernel (NFSS Declarative Interface)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -465,7 +465,7 @@
% \changes{v3.0q}{2015/03/18}{Introduce \cs{e@mathgroup@top}}
% \begin{macrocode}
%</2ekernel>
-%<latexrelease>\IncludeInRelease{2015/01/01}
+%<latexrelease>\IncludeInRelease{2020/10/01}
%<latexrelease> {\document@select@group}{\document@select@group}%
%<*2ekernel|latexrelease>
\def\document@select@group#1#2#3#4{%
@@ -491,13 +491,54 @@
\@eha
\fi
\else \expandafter\non@alpherr\fi
- #1{#4}%
+% \end{macrocode}
+% If the legacy interface is used, e.g., \verb=$\sf -1$= the math
+% alphabet \verb=#1= does not take an argument so we better do not
+% surround \verb=#4= with braces, because then we get
+% \verb={\relax}= into the formula and introduce an extra Ord
+% atom. The two different cases can be distinguished by looking at
+% the current value of \cs{math@bgroup}.
+% \changes{v3.0u}{2020/03/19}{fix for (gnats/3357)}
+% \begin{macrocode}
+ \expandafter#1\ifx\math@bgroup\bgroup{#4}\else#4\fi
}%
}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2015/01/01}
+%<latexrelease> {\document@select@group}{\document@select@group}%
+%<latexrelease>
+%<latexrelease>\def\document@select@group#1#2#3#4{%
+%<latexrelease> \ifx\math@bgroup\bgroup\else\relax\expandafter\@firstofone\fi
+%<latexrelease> {%
+%<latexrelease> \ifmmode
+%<latexrelease> \ifnum\csname c@mv@\math@version\endcsname<\e@mathgroup@top
+%<latexrelease> \begingroup
+%<latexrelease> \escapechar\m@ne
+%<latexrelease> \getanddefine@fonts{\csname c@mv@\math@version\endcsname}#3%
+%<latexrelease> \globaldefs\@ne \math@fonts
+%<latexrelease> \endgroup
+%<latexrelease> \expandafter\extract@alph@from@version
+%<latexrelease> \csname mv@\math@version\expandafter\endcsname
+%<latexrelease> \expandafter{\number\csname
+%<latexrelease> c@mv@\math@version\endcsname}%
+%<latexrelease> #1%
+%<latexrelease> \global\advance\csname c@mv@\math@version\endcsname\@ne
+%<latexrelease> \else
+%<latexrelease> \let#1\relax
+%<latexrelease> \@latex@error{Too many math alphabets used
+%<latexrelease> in version \math@version}%
+%<latexrelease> \@eha
+%<latexrelease> \fi
+%<latexrelease> \else \expandafter\non@alpherr\fi
+%<latexrelease> #1{#4}%
+%<latexrelease> }%
+%<latexrelease>}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
%<latexrelease>\IncludeInRelease{0000/00/00}
%<latexrelease> {\document@select@group}{\document@select@group}%
+%<latexrelease>
%<latexrelease>\def\document@select@group#1#2#3#4{%
%<latexrelease> \ifx\math@bgroup\bgroup\else\relax\expandafter\@firstofone\fi
%<latexrelease> {%
@@ -582,17 +623,19 @@
% \begin{macrocode}
\let\select@group\document@select@group
% \end{macrocode}
-% Install the default font attributes they are currently pointing
-% to error font shape.
+% Install the default font attributes as they are currently pointing
+% to error font face. We can speed up the process by just using
+% \cs{edef}, thereby avoiding all kind of extra processing.
% Don't use |\reset@font| since that would trigger |\selectfont|.
+% \changes{v3.0v}{2020/04/13}{Small update for speed.}
% \begin{macrocode}
- \fontencoding{\encodingdefault}%
- \fontfamily{\familydefault}%
- \fontseries{\seriesdefault}%
- \fontshape{\shapedefault}%
+ \fontencoding\encodingdefault
+ \edef\f@family{\familydefault}%
+ \edef\f@series{\seriesdefault}%
+ \edef\f@shape{\shapedefault}%
% \end{macrocode}
-% kill all macros not longer needed.
-% we need to add many more!!!!!!
+% Drop stuff not longer needed.
+% We need to add many more!!!!!!
% \begin{macrocode}
\everyjob{}%
}
diff --git a/Master/texmf-dist/source/latex/base/ltfssini.dtx b/Master/texmf-dist/source/latex/base/ltfssini.dtx
index 98f465ae9b9..fbea725c1df 100644
--- a/Master/texmf-dist/source/latex/base/ltfssini.dtx
+++ b/Master/texmf-dist/source/latex/base/ltfssini.dtx
@@ -36,7 +36,7 @@
%
%
\ProvidesFile{ltfssini.dtx}
- [2020/02/18 v3.1i LaTeX Kernel (NFSS Initialisation)]
+ [2020/10/08 v3.2e LaTeX Kernel (NFSS Initialisation)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -244,7 +244,7 @@
% \DescribeMacro\DeclareFontSeriesDefault
% We now support this concept directly from within \LaTeX{} and for
% use in font packages (or the document preamble) we offer
-% \cs{DeclareSeriesDefault}. This declaration takes three
+% \cs{DeclareFontSeriesDefault}. This declaration takes three
% arguments:
% \begin{description}
% \item[document family interface:] Can either be \texttt{rm},
@@ -278,6 +278,7 @@
% The command to declare font series defaults for the ``rm'', ``sf'' or
% ``tt'' family.
% \begin{macrocode}
+\let\DeclareFontSeriesDefault\@undefined % for rollback
\newcommand\DeclareFontSeriesDefault[3][]{%
\def\reserved@a{#1}%
% \end{macrocode}
@@ -287,11 +288,19 @@
\ifx\reserved@a\@empty
\ifcsname #2series\endcsname % supported are
% \[md/bf]default
+% \end{macrocode}
+% Adding \cs{@empty} allows us to detect if the default gets
+% redefined with \cs{renewcommand} or \cs{def} by the user.
+% \changes{v3.1k}{2020/03/19}{Support legacy use of \cs{bfdefault}
+% and \cs{mddefault} (gh/306)}
+% \begin{macrocode}
+ \expandafter\def
+ \csname #2default\endcsname{#3\@empty}%
\expandafter\def
- \csname #2default\endcsname{#3}%
+ \csname #2default@previous\endcsname{#3\@empty}%
\else
% \end{macrocode}
-%
+%
% \changes{v3.1g}{2020/02/05}{Clarrified error text}
% \begin{macrocode}
\@latex@error{Wrong syntax for \string\DeclareFontSeriesDefault}%
@@ -379,7 +388,364 @@
+%
+%
+%
+% \begin{macro}{\series@change@debug}
+% For debugging, but right now none of this code is extracted. The
+% idea is to have a separate package with debugging code
+% one day.
+% \begin{macrocode}
+%<*debug>
+\let\series@change@debug\typeout
+\let\series@change@debug\@gobble
+%</debug>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\prepare@family@series@update}
+% This is core command that prepares for the family update. The big
+% difference to the documented code above is that the nested
+% \cs{ifx} statements seem to be missing. Instead we loop through
+% an internal list that holds the names of the three meta
+% families. This approach allows us to extend the mechanism at a
+% later stage to allow for additional named meta families.
+%
+% \begin{macro}{\@meta@family@list}
+% Here is the current definition of that list:
+% \begin{macrocode}
+\def\@meta@family@list{\@elt{rm}\@elt{sf}\@elt{tt}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\def\prepare@family@series@update#1#2{%
+% \end{macrocode}
+%
+% \changes{v3.1i}{2020/02/18}{No series auto-update when forced (gh/277)}
+% \begin{macrocode}
+ \if@forced@series
+%<+debug> \series@change@debug{No series preparation (forced \f@series)\on@line}%
+ \fontfamily#2%
+ \else
+%<+debug> \series@change@debug{Prepearing for switching to #1 (#2)\on@line}%
+ \expand@font@defaults
+% \end{macrocode}
+% We prepare for changing the current series. We have to find it
+% before changing the family as discussed above.
+% \begin{macrocode}
+ \let\target@series@value\@empty
+ \def\target@meta@family@value{#1}%
+% \end{macrocode}
+% As the very last item in the meta family list we add
+% \verb=\@elt{??}= and define this pseudo meta family to be the
+% current font family. So if none of the real meta families matched then
+% this will match. This will cover the following case:
+% \begin{itemize}
+% \item \cs{bfseries} is called for a family using \texttt{bx}
+% (e.g., CMR)
+% \item Switch to a font family that is none of the meta
+% families, e.g., via \verb=\fontfamily{ptm}\selectfont=
+% \item Then none of the real meta families, match but the final
+% \verb=\@elt{??}= will.
+% \item Therefore if the current series is \cs{mddefault} or
+% \cs{bfdefault} it will be detected and the corresponding target
+% series selected.
+% \end{itemize}
+% \changes{v3.1i}{2020/02/18}{Recognize current family if it is not a
+% ``meta'' family and auto-update series using \cs{bfdefault} (gh/277)}
+% \begin{macrocode}
+ \expandafter\edef\csname ??def@ult\endcsname{\f@family}%
+% \end{macrocode}
+% To find it we loop over the meta family list with a suitable
+% definition of \cs{@elt}.
+% \begin{macrocode}
+ \let\@elt\update@series@target@value
+ \@meta@family@list
+% \end{macrocode}
+% Last resort pseudo meta family. Will only be looked at f none of
+% the real ones have matched.
+% \begin{macrocode}
+ \@elt{??}%
+ \let\@elt\relax
+% \end{macrocode}
+% That will figure out the correct series value to use without updating
+% it. Now we can change the family.
+% \begin{macrocode}
+ \fontfamily#2%
+% \end{macrocode}
+% After that we update the series. That code is again like the one
+% above.
+% \begin{macrocode}
+ \ifx\target@series@value\@empty
+%<+debug> \series@change@debug{Target series still empty ...}%
+ \else
+ \ifx \f@series\target@series@value
+%<+debug> \series@change@debug{Target series unchanged:
+%<+debug> \f@series \space = \target@series@value}%
+ \else
+ \maybe@load@fontshape
+%<+debug> \series@change@debug{Target series:
+%<+debug> \f@series \space -> \target@series@value}%
+% \end{macrocode}
+% The \cs{target@series@value} may contain something like
+% \texttt{cm} (coming from a default) and so we can't directly
+% asign it to \cs{f@series} be have to drop any surplus \texttt{m}
+% first.
+% \changes{v3.1j}{2020/02/25}{Drop surplus ``m'' from
+% \cs{target@series@value} (gh/291)}
+% \begin{macrocode}
+% \let\f@series\target@series@value
+ \series@maybe@drop@one@m\target@series@value\f@series
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\update@series@target@value}
+% In this macro used in the look you basically find the nested
+% \cs{ifx}s from the outline above. The only difference is that is
+% it is parameterized instead of being written out and only for one
+% block of tests because the code is called reatedly when looping
+% over the meta family list. From the list we get each meta family
+% name in turn.
+% \begin{macrocode}
+\def\update@series@target@value#1{%
+% \end{macrocode}
+% There is one additional test at the beginning, because the list
+% contains all meta families and we need to ignore the case where
+% current one from the list and target one are identical.
+% \begin{macrocode}
+ \def\reserved@a{#1}%
+ \ifx\target@meta@family@value\reserved@a % rm -> rm do nothing
+ \else
+%<+debug> \series@change@debug{Trying to match #1: \csname#1def@ult\endcsname
+%<+debug> \space = \f@family\space ?}%
+% \end{macrocode}
+% We only ``do'' something if the current font family matches the
+% current meta family.
+% \begin{macrocode}
+ \expandafter\ifx\csname#1def@ult\endcsname\f@family
+% \end{macrocode}
+% If that's the case we know that this is the block that applies
+% (only one meta family can match). So to speed things up we
+% change \cs{@elt} so that the rest of the loop gets gobbled.
+% \begin{macrocode}
+ \let\@elt\@gobble
+% \end{macrocode}
+% Then we try to find the right new value for the series (as
+% explained above). The two macros defined first are only there
+% because we now need to use \cs{csname} and this way the code will
+% be a little faster.
+% \begin{macrocode}
+ \expandafter\let\expandafter\reserved@b
+ \csname mdseries@\target@meta@family@value\endcsname
+ \expandafter\let\expandafter\reserved@c
+ \csname bfseries@\target@meta@family@value\endcsname
+%<+debug>\series@change@debug{Targets for mdseries and bfseries:
+%<+debug> \reserved@b\space and \reserved@c}%
+% \end{macrocode}
+% This here is now identical to the nested \cs{ifx} block from the
+% outline, except that it there appeared twice in
+% \cs{rmfamily}. This is now covered by looping and stopping the
+% loop when a match was found.
+% \begin{macrocode}
+% \end{macrocode}
+% We have to sanitize the default value first because it may
+% contain something like \texttt{mc} and that would never match
+% \cs{f@series} because there it would be called \texttt{c} with
+% the \texttt{m} dropped. It would be probably better to do that
+% differently these days, but it is hard to adjust without causing
+% a lot of issues, so we do the dropping in various places instead.
+% \changes{v3.1j}{2020/02/25}{Drop surplus ``m'' from \cs{reserved@d}
+% (gh/291)}
+% \begin{macrocode}
+ \expandafter\series@maybe@drop@one@m
+ \csname mdseries@#1\endcsname\reserved@d
+ \ifx\reserved@d\f@series
+%<+debug> \series@change@debug{mdseries@#1 matched -> \reserved@b}%
+ \let\target@series@value\reserved@b
+ \else
+% \end{macrocode}
+% Again do some sanitizing.
+% \changes{v3.1j}{2020/02/25}{Drop surplus ``m'' from \cs{reserved@d}
+% (gh/291)}
+% \begin{macrocode}
+ \expandafter\series@maybe@drop@one@m
+ \csname bfseries@#1\endcsname\reserved@d
+ \ifx\reserved@d\f@series
+%<+debug> \series@change@debug{bfseries@#1 matched -> \reserved@c}%
+ \let\target@series@value\reserved@c
+ \else\ifx\f@series\mddef@ult \let\target@series@value\reserved@b
+%<+debug> \series@change@debug{mddef@ult matched -> \reserved@b}%
+ \else\ifx\f@series\bfdef@ult \let\target@series@value\reserved@c
+%<+debug> \series@change@debug{bfdef@ult matched -> \reserved@c}%
+ \fi\fi\fi\fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+% \begin{macro}{\init@series@setup}
+% This is code to be run at begin document \ldots
+% \begin{macrocode}
+\def\init@series@setup{%
+% \end{macrocode}
+%
+% We only want \texttt{bx} in \cs{bfseries@rm} if the roman font is
+% Computer Modern or Latin Modern, otherwise it should be
+% \texttt{b}. It was set to \texttt{bx} in the kernel so that any
+% font use with the default families in the preamble get this
+% value. Now at the real document start we check if the fonts have
+% been changed. If there was a \cs{DeclareFontSeriesDefault}
+% declaration or \cs{bfseries@rm} was directly altered then it
+% differs from \cs{bfseries@rm@kernel} and we do nothing.
+% Otherwise we check if \cs{rmdefault} is one of the CM/LM font
+% families and if so we keep \texttt{bx} otherwise we change it to
+% \texttt{b}.
+%
+% This approach doesn't cover one case: CM/LM got changed to a
+% different family that supports \texttt{bx}, but the support
+% package for that family used \verb=\def\bfseries@rm{bx}= instead
+% of using \cs{DeclareFontSeriesDefault}. In that case the code
+% here changes it to \texttt{b}. Solution: use the
+% \cs{DeclareFontSeriesDefault} interface.
+% \begin{macrocode}
+ \ifx\bfseries@rm@kernel\bfseries@rm
+ \expandafter\in@\expandafter{\rmdefault}%
+ {cmr,cmss,cmtt,lcmss,lcmtt,lmr,lmss,lmtt}%
+ \ifin@ \else \def\bfseries@rm{b}\fi\fi
+% \end{macrocode}
+% Same approach for \cs{bfseries@sf} and \cs{bfseries@tt}:
+% \begin{macrocode}
+ \ifx\bfseries@sf@kernel\bfseries@sf
+ \expandafter\in@\expandafter{\sfdefault}%
+ {cmr,cmss,cmtt,lcmss,lcmtt,lmr,lmss,lmtt}%
+ \ifin@ \else \def\bfseries@sf{b}\fi\fi
+ \ifx\bfseries@tt@kernel\bfseries@tt
+ \expandafter\in@\expandafter{\ttdefault}%
+ {cmr,cmss,cmtt,lcmss,lcmtt,lmr,lmss,lmtt}%
+ \ifin@ \else \def\bfseries@tt{b}\fi\fi
+% \end{macrocode}
+%
+% If the document preamble has changed the \cs{familydefault} or if
+% the if the \cs{rmdefault} contains a new font family, we may have to
+% adjust the series defaults accordingly, before starting
+% typesetting.
+%
+% Similarly, if the user has changed the \cs{mddefault} or the
+% medium series for the family selected as document font we may
+% also have to adjust the \cs{seriesdefault}.
+%
+% On the other hand if the document font is still CM or LM then
+% \cs{bfdefault} is wrong, because it is now saying \texttt{b} and not
+% \texttt{bx} as it should for such fonts.
+%
+% To fix all this we first run \cs{reset@font} (the internal kernel
+% name for \cs{normalfont}). This will set up the document encoding,
+% family, series and shape based on the current values of
+% \cs{encodingdefault}, \cs{familydefault}, \cs{seriesdefault} and
+% \cs{shapedefault}.
+% However, if the family (from \cs{familydefault}) has special medium
+% default we should switch to that (and not use what is current
+% value from \cs{seriesdefault}). This can be achieved by afterwards
+% calling \cs{mediumseries} and then changing \cs{seriesdefault} to
+% the now current series value (in \cs{f@series}).
+%
+% But what should happen if \cs{seriesdefault} got explicitly
+% changed? In that case the explicit change should surive and we
+% should not alter \cs{seriesdefault}. This is solved by comparing
+% the current value of \cs{seriesdefault} with a kernel version
+% saved in the format and if they differ we do not call
+% \cs{mdseries} or change \cs{seriesdefault}.
+% \changes{v3.1n}{2020/04/13}{Handling \cs{seriesdefault} changes (gh/315)}
+% \begin{macrocode}
+ \reset@font
+ \ifx\seriesdefault\seriesdefault@kernel
+ \mdseries
+ \let\seriesdefault\f@series
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% As the kernel code now implements the same functionality as
+% \textsf{mweights}, albeit internally coded slightly differently,
+% that package shouldn't be loaded any more. We therefore pretend
+% that it already got loaded. Thus, a font package that tries to
+% load it and then sets \cs{mdseries@..}, etc.\ will continue to
+% work but will now use the kernel code.
+%
+% Of course, mid-term such package should probably use
+% \cs{DeclareFontSeriesDefault} instead of making using low-level
+% definitions.
+%
+% \begin{macrocode}
+\expandafter\let\csname ver@mweights.sty\endcsname\fmtversion
+% \end{macrocode}
+%
+%
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\DeclareFontSeriesDefault}{Custom series}%
+%<latexrelease>
+%<latexrelease>\let\DeclareFontSeriesDefault\@undefined
+%<latexrelease>\let\bfseries@rm\@undefined
+%<latexrelease>\let\bfseries@sf\@undefined
+%<latexrelease>\let\bfseries@tt\@undefined
+%<latexrelease>\let\bfseries@rm@kernel\@undefined
+%<latexrelease>\let\bfseries@sf@kernel\@undefined
+%<latexrelease>\let\bfseries@tt@kernel\@undefined
+%<latexrelease>\let\mdseries@rm\@undefined
+%<latexrelease>\let\mdseries@sf\@undefined
+%<latexrelease>\let\mdseries@tt\@undefined
+%<latexrelease>\expandafter\let\csname ver@mweights.sty\endcsname\@undefined
+%<latexrelease>
+%<latexrelease>\let\@meta@family@list\@undefined
+%<latexrelease>\let\prepare@family@series@update\@undefined
+%<latexrelease>\let\update@series@target@value\@undefined
+%<latexrelease>
+% \end{macrocode}
+% This is always called in \cs{document} so don't make it undefined.
+% \begin{macrocode}
+%<latexrelease>\let\init@series@setup\relax
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\bfseries}{Custom series with hooks}%
+% \end{macrocode}
+
+
% \begin{macro}{\expand@font@defaults}
+% \begin{macro}{\rm@def@ult}
+% \begin{macro}{\sf@def@ult}
+% \begin{macro}{\tt@def@ult}
+% \begin{macro}{\md@def@ult}
+% \begin{macro}{\bf@def@ult}
%
% The family specific defaults are fully expanded, i.e., they are
% defined via \cs{edef} inside \cs{DeclareFontSeriesDefault}.
@@ -393,14 +759,29 @@
\edef\rmdef@ult{\rmdefault}%
\edef\sfdef@ult{\sfdefault}%
\edef\ttdef@ult{\ttdefault}%
- \edef\bfdef@ult{\bfdefault}%
- \edef\mddef@ult{\mddefault}%
- \edef\famdef@ult{\familydefault}%
+% \end{macrocode}
+% The series defaults may contain some surplus \texttt{m} that we
+% need to drop here.
+% \changes{v3.1j}{2020/02/25}{Drop surplus ``m'' from \cs{bfdef@ult}
+% and \cs{mddef@ult} (gh/291)}
+% \begin{macrocode}
+ \series@maybe@drop@one@m\bfdefault\bfdef@ult
+ \series@maybe@drop@one@m\mddefault\mddef@ult
+% \end{macrocode}
+% Formats that set up parallel fonts, e.g., for Japanese, can use
+% this hook to add additional code here.
+% \changes{v3.1m}{2020/04/06}{Hook added (gh/306)}
+% \changes{v3.2b}{2020/08/21}{Integration of new hook management interface}
+% \begin{macrocode}
+ \UseHook{expand@font@defaults}%
}
% \end{macrocode}
-%
% \end{macro}
-
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
% \begin{macro}{\bfseries}
@@ -418,6 +799,45 @@
% of \cs{fontseries} argument so that it is not done several times}
% \begin{macrocode}
\expand@font@defaults
+% \end{macrocode}
+% If \cs{bfdefault} and \cs{bfdefault@previous} are different then
+% the default got changed directly through the legacy interface
+% (i.e., via \cs{def} or \cs{renewcommand}. In that case we reset
+% all meta family defaults so that the document behaves like it was
+% the case before the new mechanism was introduced.
+% \changes{v3.1k}{2020/03/19}{Support legacy use of \cs{bfdefault}
+% and \cs{mddefault} (gh/306)}
+% \begin{macrocode}
+ \ifx\bfdefault\bfdefault@previous\else
+% \end{macrocode}
+% We add \cs{@empty} and then let \cs{bfdefault@previous} to
+% \cs{bfdefault} so that we can detect any further change.
+% \changes{v3.2d}{2020/09/30}{\cs{bfdefault@previous} not \cs{bfseries@previous}
+% (gh/395)}
+% \begin{macrocode}
+ \expandafter\def\expandafter\bfdefault
+ \expandafter{\bfdefault\@empty}%
+ \let\bfdefault@previous\bfdefault
+% \end{macrocode}
+% And we reset the meta family defaults (\cs{bfdef@ult} is an
+% expanded version of \cs{bfdefault}.
+% \begin{macrocode}
+ \let\bfseries@rm\bfdef@ult
+ \let\bfseries@sf\bfdef@ult
+ \let\bfseries@tt\bfdef@ult
+% \end{macrocode}
+%
+% Formats that set up parallel fonts, e.g., for Japanese, can use
+% this hook to add resets here. Not that this hook is only run when
+% resets are necessary.
+% \changes{v3.1m}{2020/04/06}{Hook added (gh/306)}
+% \changes{v3.2b}{2020/08/21}{Integration of new hook management interface}
+% \begin{macrocode}
+ \UseHook{bfseries/defaults}%
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
\ifx\f@family\rmdef@ult \fontseries\bfseries@rm
\else\ifx\f@family\sfdef@ult \fontseries\bfseries@sf
\else\ifx\f@family\ttdef@ult \fontseries\bfseries@tt
@@ -426,6 +846,10 @@
% \begin{macrocode}
\else \fontseries\bfdefault
\fi\fi\fi
+% \end{macrocode}
+% This hook in contrast is always executed.
+% \begin{macrocode}
+ \UseHook{bfseries}%
\selectfont
}
% \end{macrocode}
@@ -437,15 +861,35 @@
% This document command switches to the medium series.
% \changes{v3.1i}{2020/02/18}{Make the \cs{ifx} selection outside
% of \cs{fontseries} argument so that it is not done several times}
+% \changes{v3.1k}{2020/03/19}{Support legacy use of \cs{bfdefault}
+% and \cs{mddefault} (gh/306)}
+% \changes{v3.2d}{2020/09/30}{\cs{mddefault@previous} not \cs{mdseries@previous}
+% (gh/395)}
% \begin{macrocode}
\DeclareRobustCommand\mdseries{%
\not@math@alphabet\mdseries\relax
\expand@font@defaults
+ \ifx\mddefault\mddefault@previous\else
+ \expandafter\def\expandafter\mddefault\expandafter{\mddefault\@empty}%
+ \let\mddefault@previous\mddefault
+ \let\mdseries@rm\mddef@ult
+ \let\mdseries@sf\mddef@ult
+ \let\mdseries@tt\mddef@ult
+% \end{macrocode}
+%
+% Formats that set up parallel fonts, e.g., for Japanese, can use
+% this hook to add resets here.
+% \changes{v3.1m}{2020/04/06}{Hook added (gh/306)}
+% \changes{v3.2b}{2020/08/21}{Integration of new hook management interface}
+% \begin{macrocode}
+ \UseHook{mdseries/defaults}%
+ \fi
\ifx\f@family\rmdef@ult \fontseries\mdseries@rm
\else\ifx\f@family\sfdef@ult \fontseries\mdseries@sf
\else\ifx\f@family\ttdef@ult \fontseries\mdseries@tt
\else \fontseries\mddefault
\fi\fi\fi
+ \UseHook{mdseries}%
\selectfont
}
% \end{macrocode}
@@ -572,8 +1016,9 @@
% \end{macrocode}
% Then comes the hook code (by default a no-op) and finally the call
% to \cs{selectfont}.
+% \changes{v3.2b}{2020/08/21}{Integration of new hook management interface}
% \begin{macrocode}
- \@rmfamilyhook
+ \UseHook{rmfamily}%
\selectfont}
% \end{macrocode}
%
@@ -582,20 +1027,22 @@
% The definitions for \cs{sffamily} and \cs{ttfamily} are similar,
% the differences are only in what font families get checked.
% \changes{v3.1f}{2020/01/11}{Streamlined implementation with hook}
+% \changes{v3.2b}{2020/08/21}{Integration of new hook management interface}
% \begin{macrocode}
\DeclareRobustCommand\sffamily{%
\not@math@alphabet\sffamily\mathsf
\prepare@family@series@update{sf}\sfdefault
- \@sffamilyhook
+ \UseHook{sffamily}%
\selectfont}
% \end{macrocode}
%
% \changes{v3.1f}{2020/01/11}{Streamlined implementation with hook}
+% \changes{v3.2b}{2020/08/21}{Integration of new hook management interface}
% \begin{macrocode}
\DeclareRobustCommand\ttfamily{%
\not@math@alphabet\ttfamily\mathtt
\prepare@family@series@update{tt}\ttdefault
- \@ttfamilyhook
+ \UseHook{ttfamily}%
\selectfont}
% \end{macrocode}
% \end{macro}
@@ -603,333 +1050,293 @@
% \end{macro}
%
%
+% \begin{macro}{rmfamily,sffamily,ttfamily,normalfont,expand@font@defaults,
+% bfseries,bfseries/defaults,mdseries,mdseries/defaults}
+% Declare the hooks used above.
+% \changes{v3.2b}{2020/08/21}{Integration of new hook management interface}
+% \begin{macrocode}
+\NewHook{rmfamily}
+\NewHook{sffamily}
+\NewHook{ttfamily}
+\NewHook{normalfont}
+\NewHook{expand@font@defaults}
+\NewHook{bfseries}
+\NewHook{bfseries/defaults}
+\NewHook{mdseries}
+\NewHook{mdseries/defaults}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@rmfamilyhook}
% \begin{macro}{\@sffamilyhook}
% \begin{macro}{\@ttfamilyhook}
+% \begin{macro}{\@defaultfamilyhook}
+% \changes{v3.1h}{2020/02/10}{Add \cs{@defaultfamilyhook} to \cs{normalfont} (gh/269)}
+% These four hooks have legacy versions used in 2020/02/02 so we
+% should support them until they aren't any longer used.
+%
% By default the hooks do nothing.
% \begin{macrocode}
\let\@rmfamilyhook\@empty
\let\@sffamilyhook\@empty
\let\@ttfamilyhook\@empty
+\let\@defaultfamilyhook\@empty %FMi sort out
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
%
-%
-%
-% \begin{macro}{\series@change@debug}
-% For debugging, but right now none of this code is extracted. The
-% idea is to have a separate package with debugging code
-% one day.
% \begin{macrocode}
-%<*debug>
-\let\series@change@debug\typeout
-\let\series@change@debug\@gobble
-%</debug>
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2020/02/02}%
+%<latexrelease> {\bfseries}{Custom series with hooks}%
+%<latexrelease>
+%<latexrelease>\def\expand@font@defaults{%
+%<latexrelease> \edef\rmdef@ult{\rmdefault}%
+%<latexrelease> \edef\sfdef@ult{\sfdefault}%
+%<latexrelease> \edef\ttdef@ult{\ttdefault}%
+%<latexrelease> \edef\bfdef@ult{\bfdefault}%
+%<latexrelease> \edef\mddef@ult{\mddefault}%
+%<latexrelease> \edef\famdef@ult{\familydefault}%
+%<latexrelease>}
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand\bfseries{%
+%<latexrelease> \not@math@alphabet\bfseries\mathbf
+%<latexrelease> \expand@font@defaults
+%<latexrelease> \ifx\f@family\rmdef@ult \fontseries\bfseries@rm
+%<latexrelease> \else\ifx\f@family\sfdef@ult \fontseries\bfseries@sf
+%<latexrelease> \else\ifx\f@family\ttdef@ult \fontseries\bfseries@tt
+%<latexrelease> \else \fontseries\bfdefault
+%<latexrelease> \fi\fi\fi
+%<latexrelease> \selectfont
+%<latexrelease>}
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand\mdseries{%
+%<latexrelease> \not@math@alphabet\mdseries\relax
+%<latexrelease> \expand@font@defaults
+%<latexrelease> \ifx\f@family\rmdef@ult \fontseries\mdseries@rm
+%<latexrelease> \else\ifx\f@family\sfdef@ult \fontseries\mdseries@sf
+%<latexrelease> \else\ifx\f@family\ttdef@ult \fontseries\mdseries@tt
+%<latexrelease> \else \fontseries\mddefault
+%<latexrelease> \fi\fi\fi
+%<latexrelease> \selectfont
+%<latexrelease>}
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand\rmfamily{%
+%<latexrelease> \not@math@alphabet\rmfamily\mathrm
+%<latexrelease> \prepare@family@series@update{rm}\rmdefault
+%<latexrelease> \@rmfamilyhook
+%<latexrelease> \selectfont}
+%<latexrelease>\DeclareRobustCommand\sffamily{%
+%<latexrelease> \not@math@alphabet\sffamily\mathsf
+%<latexrelease> \prepare@family@series@update{sf}\sfdefault
+%<latexrelease> \@sffamilyhook
+%<latexrelease> \selectfont}
+%<latexrelease>\DeclareRobustCommand\ttfamily{%
+%<latexrelease> \not@math@alphabet\ttfamily\mathtt
+%<latexrelease> \prepare@family@series@update{tt}\ttdefault
+%<latexrelease> \@ttfamilyhook
+%<latexrelease> \selectfont}
+%<latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\bfseries}{Custom series with hooks}%
+%<latexrelease>
+%<latexrelease>\let\expand@font@defaults\@undefined
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand\bfseries
+%<latexrelease> {\not@math@alphabet\bfseries\mathbf
+%<latexrelease> \fontseries\bfdefault\selectfont}
+%<latexrelease>\DeclareRobustCommand\mdseries
+%<latexrelease> {\not@math@alphabet\mdseries\relax
+%<latexrelease> \fontseries\mddefault\selectfont}
+%<latexrelease>\DeclareRobustCommand\rmfamily
+%<latexrelease> {\not@math@alphabet\rmfamily\mathrm
+%<latexrelease> \fontfamily\rmdefault\selectfont}
+%<latexrelease>\DeclareRobustCommand\sffamily
+%<latexrelease> {\not@math@alphabet\sffamily\mathsf
+%<latexrelease> \fontfamily\sfdefault\selectfont}
+%<latexrelease>\DeclareRobustCommand\ttfamily
+%<latexrelease> {\not@math@alphabet\ttfamily\mathtt
+%<latexrelease> \fontfamily\ttdefault\selectfont}
+%<latexrelease>
+%<latexrelease>\let\@rmfamilyhook\@undefined
+%<latexrelease>\let\@sffamilyhook\@undefined
+%<latexrelease>\let\@ttfamilyhook\@undefined
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
-% \end{macro}
%
%
%
+% \begin{macro}{\IfFontSeriesContextTF}
%
-% \begin{macro}{\prepare@family@series@update}
-% This is core command that prepares for the family update. The big
-% difference to the documented code above is that the nested
-% \cs{ifx} statements seem to be missing. Instead we loop through
-% an internal list that holds the names of the three meta
-% families. This approach allows us to extend the mechanism at a
-% later stage to allow for additional named meta families.
+% With the ability for \cs{bfseries} or \cs{mdseries} to be mapped
+% to different NFSS axis values it becomes important to have the
+% ability to determine the current context as we can no longer look
+% at \cs{f@series} to answer a question such as ``am I currently
+% typsetting in a bold typeface?''
%
-% \begin{macro}{\@meta@family@list}
-% Here is the current definition of that list:
+% This is provided by the test \cs{IfFontSeriesContextTF}. It takes
+% three arguments:
+% \begin{itemize}
+% \item
+% The context we try to check (either \texttt{bf} for bold or
+% \texttt{md} for medium, i.e., the same that can go into the
+% first mandatory argument of \cs{DeclareFontSeriesDefault}),
+%
+% \item
+% what to do if we are in this context (true case) and
+%
+% \item
+% what to do if we are not (false case).
+% \end{itemize}
+% This allows you to define commands like \cs{IfBold}, e.g.,
+%\begin{verbatim}
+% \newcommand\IfBold[2]{\IfSeriesContextTF{bf}{#1}{#2}}
+%\end{verbatim}
+% and then do
+%\begin{verbatim}
+% This is \IfBold{bold}{non-bold} text.
+%\end{verbatim}
+% and get the appropriate result.
+%
+% \changes{v3.2a}{2020/05/19}{Macros added (gh/335)}
% \begin{macrocode}
-\def\@meta@family@list{\@elt{rm}\@elt{sf}\@elt{tt}}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\IfFontSeriesContextTF}{Font series context}%
% \end{macrocode}
-% \end{macro}
%
% \begin{macrocode}
-\def\prepare@family@series@update#1#2{%
+\DeclareRobustCommand\IfFontSeriesContextTF[1]{%
+ \expand@font@defaults
% \end{macrocode}
-%
-% \changes{v3.1i}{2020/02/18}{No series auto-update when forced (gh/277)}
+% In the beginning we haven't found the context we are loking for.
% \begin{macrocode}
- \if@forced@series
-%<+debug> \series@change@debug{No series preparation (forced \f@series)\on@line}%
- \fontfamily#2%
- \else
-%<+debug> \series@change@debug{Prepearing for switching to #1 (#2)\on@line}%
- \expand@font@defaults
+ \@font@series@contextfalse
% \end{macrocode}
-% We prepare for changing the current series. We have to find it
-% before changing the family as discussed above.
+% We store the requested context away for use in the tests.
% \begin{macrocode}
- \let\target@series@value\@empty
- \def\target@meta@family@value{#1}%
+ \def\requested@test@context{#1}%
% \end{macrocode}
-% As the very last item in the meta family list we add
-% \verb=\@elt{??}= and define this pseudo meta family to be the
-% current font family. So if none of the real meta families matched then
-% this will match. This will cover the following case:
-% \begin{itemize}
-% \item \cs{bfseries} is called for a family using \texttt{bx}
-% (e.g., CMR)
-% \item Switch to a font family that is none of the the meta
-% families, e.g., via \verb=\fontfamily{ptm}\selectfont=
-% \item Then none of the real meta families, match but the final
-% \verb=\@elt{??}= will.
-% \item Therefore if the current series is \cs{mddefault} or
-% \cs{bfdefault} it will be detected and the corresponding target
-% series selected.
-% \end{itemize}
-% \changes{v3.1i}{2020/02/18}{Recognize current family if it is not a
-% ``meta'' family and auto-update series using \cs{bfdefault} (gh/277)}
+% The next definition is there to ensure that get a final match
+% during testing
+% even if the current family is non of the meta families
+% (\texttt{rm}, \texttt{sf} or \texttt{tt}). This will then
+% basically tests if the current font family matches the overall default.
% \begin{macrocode}
- \expandafter\edef\csname ??def@ult\endcsname{\f@family}%
+ \expandafter\edef\csname ??def@ult\endcsname{\f@family}%
% \end{macrocode}
-% To find it we loop over the meta family list with a suitable
-% definition of \cs{@elt}.
+% Then we run through the meta family list (currently containing
+% just the three values) followed by the artifical meta family
+% \texttt{??} and test each of them in turn using
+% \cs{test@font@series@context} as the testing command.
% \begin{macrocode}
- \let\@elt\update@series@target@value
+ \let\@elt\test@font@series@context
\@meta@family@list
-% \end{macrocode}
-% Last resort pseudo meta family. Will only be looked at f none of
-% the real ones have matched.
-% \begin{macrocode}
\@elt{??}%
- \let\@elt\relax
-% \end{macrocode}
-% That will figure out the correct series value to use without updating
-% it. Now we can change the family.
-% \begin{macrocode}
- \fontfamily#2%
+ \let\@elt\relax
% \end{macrocode}
-% After that we update the series. That code is again like the one
-% above.
+% Following that we evaluate the status of
+% \cs{if@font@series@context} to determine which of the remaining
+% arguments (true/false case) we have to execute.
% \begin{macrocode}
- \ifx\target@series@value\@empty
-%<+debug> \series@change@debug{Target series still empty ...}%
- \else
- \ifx \f@series\target@series@value
-%<+debug> \series@change@debug{Target series unchanged:
-%<+debug> \f@series \space = \target@series@value}%
- \else
- \maybe@load@fontshape
-%<+debug> \series@change@debug{Target series:
-%<+debug> \f@series \space -> \target@series@value}%
- \let\f@series\target@series@value
- \fi
- \fi
- \fi
+ \if@font@series@context
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
}
% \end{macrocode}
% \end{macro}
-%
-%
-%
-% \begin{macro}{\update@series@target@value}
-% In this macro used in the look you basically find the nested
-% \cs{ifx}s from the outline above. The only difference is that is
-% it is parameterized instead of being written out and only for one
-% block of tests because the code is called reatedly when looping
-% over the meta family list. From the list we get each meta family
-% name in turn.
+
+
+
+% \begin{macro}{\test@font@series@context}
+% This tests the context (stored in \cs{requested@test@context})
+% and updates the bookean if the right context is found.
% \begin{macrocode}
-\def\update@series@target@value#1{%
+\def\test@font@series@context#1{%
% \end{macrocode}
-% There is one additional test at the beginning, because the list
-% contains all meta families and we need to ignore the case where
-% current one from the list and target one are identical.
+% First task is to figure out whether the current family matches
+% \cs{rmfamily}, \cs{sffamily}, etc.\ so in \cs{reserved@a} we
+% store the value of \cs{rmdef@ult} (or whatever the given meta
+% family is) and compare that to \cs{f@family}.
% \begin{macrocode}
- \def\reserved@a{#1}%
- \ifx\target@meta@family@value\reserved@a % rm -> rm do nothing
- \else
-%<+debug> \series@change@debug{Trying to match #1: \csname#1def@ult\endcsname
-%<+debug> \space = \f@family\space ?}%
+ \edef\reserved@a{\csname #1def@ult\endcsname}%
+ \ifx\f@family\reserved@a
% \end{macrocode}
-% We only ``do'' something if the current font family matches the
-% current meta family.
+% If they match we have found the right meta family so we don't
+% need to test any of the remaining meta family and therefore
+% change \cs{@elt} to \cs{@gobble}.
% \begin{macrocode}
- \expandafter\ifx\csname#1def@ult\endcsname\f@family
+ \let\@elt\@gobble
% \end{macrocode}
-% If that's the case we know that this is the block that applies
-% (only one meta family can match). So to speed things up we
-% change \cs{@elt} so that the rest of the loop gets gobbled.
+% Now we have to test if \cs{f@series} matches the requested
+% context (e.g., whether \cs{bfseries@rm} has that value if the
+% current meta family is \texttt{rm} and we are looking for the
+% \texttt{bf} context).
% \begin{macrocode}
- \let\@elt\@gobble
+ \expandafter\ifx
+ \csname\requested@test@context series@#1\endcsname\f@series
% \end{macrocode}
-% Then we try to find the right new value for the series (as
-% explained above). The two macros defined first are only there
-% because we now need to use \cs{csname} and this way the code will
-% be a little faster.
+% If yes we change the boolean and are done.
% \begin{macrocode}
- \expandafter\let\expandafter\reserved@b
- \csname mdseries@\target@meta@family@value\endcsname
- \expandafter\let\expandafter\reserved@c
- \csname bfseries@\target@meta@family@value\endcsname
-%<+debug>\series@change@debug{Targets for mdseries and bfseries:
-%<+debug> \reserved@b\space and \reserved@c}%
+ \@font@series@contexttrue
% \end{macrocode}
-% This here is now identical to the nested \cs{ifx} block from the
-% outline, except that it there appeared twice in
-% \cs{rmfamily}. This is now covered by looping and stopping the
-% loop when a match was found.
+% If not then maybe the reason is that nothing special was set up
+% for that meta family so we also check now check if \cs{f@series}
+% matches the overall default (e.g., \cs{bfdef@ult} if we are
+% looking for the bold context). If that matches we change the boolean.
% \begin{macrocode}
- \expandafter\ifx\csname mdseries@#1\endcsname\f@series
-%<+debug> \series@change@debug{mdseries@#1 matched -> \reserved@b}%
- \let\target@series@value\reserved@b
- \else\expandafter\ifx\csname bfseries@#1\endcsname\f@series
-%<+debug> \series@change@debug{bfseries@#1 matched -> \reserved@c}%
- \let\target@series@value\reserved@c
- \else\ifx\f@series\mddef@ult \let\target@series@value\reserved@b
-%<+debug> \series@change@debug{mddef@ult matched -> \reserved@b}%
- \else\ifx\f@series\bfdef@ult \let\target@series@value\reserved@c
-%<+debug> \series@change@debug{bfdef@ult matched -> \reserved@c}%
- \fi\fi\fi\fi
- \fi
- \fi
+ \else
+ \expandafter\ifx
+ \csname\requested@test@context def@ult\endcsname\f@series
+ \@font@series@contexttrue
+ \fi\fi\fi
}
% \end{macrocode}
% \end{macro}
-%
-%
-%
-%
-%
-% \begin{macro}{\init@series@setup}
-% This is code to be run at begin document \ldots
-% \begin{macrocode}
-\def\init@series@setup{%
-% \end{macrocode}
-%
-% We only want \texttt{bx} in \cs{bfseries@rm} if the roman font is
-% Computer Modern or Latin Modern, otherwise it should be
-% \texttt{b}. It was set to \texttt{bx} in the kernel so that any
-% font use with the default families in the preamble get this
-% value. Now at the real document start we check if the fonts have
-% been changed. If there was a \cs{DeclareFontSeriesDefault}
-% declaration or \cs{bfseries@rm} was directly altered then it
-% differs from \cs{bfseries@rm@kernel} and we do nothing.
-% Otherwise we check if \cs{rmdefault} is one of the CM/LM font
-% families and if so we keep \texttt{bx} otherwise we change it to
-% \texttt{b}.
-%
-% This approach doesn't cover one case: CM/LM got changed to a
-% different family that supports \texttt{bx}, but the support
-% package for that family used \verb=\def\bfseries@rm{bx}= instead
-% of using \cs{DeclareFontSeriesDefault}. In that case the code
-% here changes it to \texttt{b}. Solution: use the
-% \cs{DeclareFontSeriesDefault} interface.
-% \begin{macrocode}
- \ifx\bfseries@rm@kernel\bfseries@rm
- \expandafter\in@\expandafter{\rmdefault}{cmr,cmss,cmtt,lcmss,lcmtt,lmr,lmss,lmtt}%
- \ifin@ \else \def\bfseries@rm{b}\fi\fi
-% \end{macrocode}
-% Same approach for \cs{bfseries@sf} and \cs{bfseries@tt}:
-% \begin{macrocode}
- \ifx\bfseries@sf@kernel\bfseries@sf
- \expandafter\in@\expandafter{\sfdefault}{cmr,cmss,cmtt,lcmss,lcmtt,lmr,lmss,lmtt}%
- \ifin@ \else \def\bfseries@sf{b}\fi\fi
- \ifx\bfseries@tt@kernel\bfseries@tt
- \expandafter\in@\expandafter{\ttdefault}{cmr,cmss,cmtt,lcmss,lcmtt,lmr,lmss,lmtt}%
- \ifin@ \else \def\bfseries@tt{b}\fi\fi
-% \end{macrocode}
-%
-% If the document preamble has changed the \cs{familydefault} or if
-% the if the \cs{rmdefault} contains a new font family, we have to
-% adjust the series defaults accordingly, before starting
-% typesetting.
-%
-% On the other hand if we still typeset in CM or LM then
-% \cs{bfdefault} is wrong since it is now saying \texttt{b} and not
-% \texttt{bx}.
-% To fix this we run \cs{rmfamily}, \cs{sffamily} or
-% \cs{ttfamily} depending on the situation and this will correct
-% the setup for us.
+
+% \begin{macro}{\if@font@series@context}
+% The boolean to signal if we found the requested font series context.
% \begin{macrocode}
- \expand@font@defaults
- \ifx\famdef@ult\rmdef@ult \rmfamily
- \else\ifx\famdef@ult\sfdef@ult \sffamily
- \else\ifx\famdef@ult\ttdef@ult \ttfamily
- \fi\fi\fi
-}%
+\newif\if@font@series@context
% \end{macrocode}
% \end{macro}
%
%
-%
-% As the kernel code now implements the same functionality as
-% \textsf{mweights}, albeit internally coded slightly differently,
-% that package shouldn't be loaded any more. We therefore pretend
-% that it already got loaded. Thus, a font package that tries to
-% load it and then sets \cs{mdseries@..}, etc.\ will continue to
-% work but will now use the kernel code.
-%
-% Of course, mid-term such package should probably use
-% \cs{DeclareFontSeriesDefault} instead of making using low-level
-% definitions.
-%
-% \begin{macrocode}
-\expandafter\let\csname ver@mweights.sty\endcsname\fmtversion
-% \end{macrocode}
-%
-%
-%
% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
-%<latexrelease>\IncludeInRelease{0000/00/00}%
-%<latexrelease> {\DeclareFontSeriesDefault}{Custom series}%
-%<latexrelease>
-%<latexrelease>\let\DeclareFontSeriesDefault\@undefined
-%<latexrelease>\let\bfseries@rm\@undefined
-%<latexrelease>\let\bfseries@sf\@undefined
-%<latexrelease>\let\bfseries@tt\@undefined
-%<latexrelease>\let\bfseries@rm@kernel\@undefined
-%<latexrelease>\let\bfseries@sf@kernel\@undefined
-%<latexrelease>\let\bfseries@tt@kernel\@undefined
-%<latexrelease>\let\mdseries@rm\@undefined
-%<latexrelease>\let\mdseries@sf\@undefined
-%<latexrelease>\let\mdseries@tt\@undefined
-%<latexrelease>\let\expand@font@defaults\@undefined
-%<latexrelease>\expandafter\let\csname ver@mweights.sty\endcsname\@undefined
-%<latexrelease>
-%<latexrelease>\DeclareRobustCommand\bfseries
-%<latexrelease> {\not@math@alphabet\bfseries\mathbf
-%<latexrelease> \fontseries\bfdefault\selectfont}
-%<latexrelease>\DeclareRobustCommand\mdseries
-%<latexrelease> {\not@math@alphabet\mdseries\relax
-%<latexrelease> \fontseries\mddefault\selectfont}
-%<latexrelease>\DeclareRobustCommand\rmfamily
-%<latexrelease> {\not@math@alphabet\rmfamily\mathrm
-%<latexrelease> \fontfamily\rmdefault\selectfont}
-%<latexrelease>\DeclareRobustCommand\sffamily
-%<latexrelease> {\not@math@alphabet\sffamily\mathsf
-%<latexrelease> \fontfamily\sfdefault\selectfont}
-%<latexrelease>\DeclareRobustCommand\ttfamily
-%<latexrelease> {\not@math@alphabet\ttfamily\mathtt
-%<latexrelease> \fontfamily\ttdefault\selectfont}
-%<latexrelease>
-%<latexrelease>\let\@rmfamilyhook\@undefined
-%<latexrelease>\let\@sffamilyhook\@undefined
-%<latexrelease>\let\@ttfamilyhook\@undefined
-%<latexrelease>\let\@meta@family@list\@undefined
-%<latexrelease>\let\prepare@family@series@update\@undefined
-%<latexrelease>\let\update@series@target@value\@undefined
-%<latexrelease>
% \end{macrocode}
-% This is always called in \cs{document} so don't make it undefined.
+%
% \begin{macrocode}
-%<latexrelease>\let\init@series@setup\relax
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\IfFontSeriesContextTF}{Font series context}%
%<latexrelease>
+%<latexrelease>\let\IfFontSeriesContextTF\@undefined
+%<latexrelease>\let\test@font@series@context\@undefined
+%<latexrelease>\let\if@font@series@context\@undefined
+%<latexrelease>\let\@font@series@contexttrue\@undefined
+%<latexrelease>\let\@font@series@contextfalse\@undefined
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
% \end{macrocode}
-%
-%
+
+
%
% \section{Supporting nested emphasis}
%
@@ -1201,27 +1608,51 @@
\def\math@version{normal}
% \end{macrocode}
%
-% \subsection{Miscellaneous}
+% \subsection{Legacy}
%
-% \begin{macro}{\newfont}
-% \changes{v1.2g}{1991/03/30}{Definition added.}
-% \changes{v2.2e}{1995/05/23}{Font assignment made local again.}
-% \begin{macro}{\symbol}
-% \changes{v1.2g}{1991/03/30}{Definition added.}
% We start by defining a few macros that are part of
% standard \LaTeX's user interface. The use of these functions is
% not encouraged, but they will allow to process older documents
% without changes to the source.
+%
+% \begin{macro}{\newfont}
+% \changes{v1.2g}{1991/03/30}{Definition added.}
+% \changes{v2.2e}{1995/05/23}{Font assignment made local again.}
% \begin{macrocode}
\def\newfont#1#2{\@ifdefinable#1{\font#1=#2\relax}}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\symbol}
+% \changes{v1.2g}{1991/03/30}{Definition added.}
+% \changes{v3.1h}{2020/02/07}{XeTeX-specific version to avoid bug in maths mode.}
% \begin{macrocode}
-\DeclareRobustCommand\symbol[1]{\char #1\relax}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\symbol}{XeTeX change for math}%
+\ifdefined\XeTeXversion
+ \DeclareRobustCommand\symbol[1]{\Ucharcat#1 12\relax}
+\else
+ \DeclareRobustCommand\symbol[1]{\char#1\relax}
+\fi
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\symbol}{XeTeX change for math}%
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand\symbol[1]{\char#1\relax}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
-% \end{macro}
% \end{macro}
%
+% \subsection{Miscellaneous}
+%
% \begin{macro}{\@setfontsize}
% \begin{macro}{\@setsize}
% This abbreviation is used by \LaTeX's user level size changing
@@ -1344,8 +1775,14 @@
\edef\f@shape{\shapedefault}%
% \end{macrocode}
%
+% \changes{v3.2b}{2020/08/21}{Integration of new hook management interface}
% \begin{macrocode}
- \@defaultfamilyhook
+ \UseHook{normalfont}%
+% \end{macrocode}
+% This is the old name for the hook introduced in 2020/02/02.
+% It will be removed in one of the future releases!
+% \begin{macrocode}
+ \@defaultfamilyhook % hookname from 2020/02 will vanish
\selectfont}
% \end{macrocode}
%
@@ -1356,13 +1793,6 @@
% \end{macro}
%
%
-% \begin{macro}{\@defaultfamilyhook}
-% By default the hooks do nothing.
-% \changes{v3.1h}{2020/02/10}{Add \cs{@defaultfamilyhook} to \cs{normalfont} (gh/269)}
-% \begin{macrocode}
-\let\@defaultfamilyhook\@empty
-% \end{macrocode}
-% \end{macro}
%
% \begin{macrocode}
%</2ekernel|latexrelease>
@@ -1505,6 +1935,26 @@
% \end{macrocode}
%
%
+%
+% \begin{macro}{\seriesdefault}
+% \begin{macro}{\seriesdefault@kernel}
+% After \cs{seriesdefault} got defined inside \texttt{fonttext.ltx}
+% or a \texttt{.cfg} file overwriting it, we alter its value by
+% appending \cs{@empty} to it. This will vanish if expanded but
+% allows us to check if the default gets altered (even to the same
+% value) in the document preamble. All we have to do is to save the
+% current value somewhere and later compare the two. For this we
+% use \cs{seriesdefault@kernel}.
+% \changes{v3.1n}{2020/04/13}{Handling \cs{seriesdefault} changes (gh/315)}
+% \begin{macrocode}
+\expandafter\def\expandafter\seriesdefault\expandafter{\seriesdefault\@empty}
+\let\seriesdefault@kernel\seriesdefault
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
% \begin{macro}{\@acci}
% \begin{macro}{\@accii}
% \begin{macro}{\@acciii}
diff --git a/Master/texmf-dist/source/latex/base/ltfsstrc.dtx b/Master/texmf-dist/source/latex/base/ltfsstrc.dtx
index e997e5be552..055f408ceb3 100644
--- a/Master/texmf-dist/source/latex/base/ltfsstrc.dtx
+++ b/Master/texmf-dist/source/latex/base/ltfsstrc.dtx
@@ -37,7 +37,7 @@
%<package> [2019/10/11 v3.0l Standard LaTeX package (font tracing)]
% \fi
% \ProvidesFile{ltfsstrc.dtx}
-% [2019/10/11 v3.0l LaTeX Kernel (NFSS tracing)]
+% [2020/02/03 v3.0l LaTeX Kernel (NFSS tracing)]
%
% \iffalse
%<+checkmem>\CHECKMEM
@@ -1731,7 +1731,7 @@
% the optional argument (if present) is ignored. The font encoding
% scheme cannot be changed. Therefore, the first thing we do is to
% prepend the encoding scheme.
-% {documentation fixes}
+% \changes{v2.0b}{1992/07/26}{documentation fixes}
% \begin{macrocode}
\DeclareSizeFunction{sub}{\sub@sfcnt\@font@warning}
\DeclareSizeFunction{ssub}{\sub@sfcnt\@font@info}
@@ -1803,7 +1803,7 @@
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2020/02/01}%
+%<latexrelease>\IncludeInRelease{2020/02/02}%
%<latexrelease> {\@font@aliasinfo}{alias size function}%
\DeclareSizeFunction{alias}{\sub@sfcnt\@font@aliasinfo}
\def\@font@aliasinfo#1{%
diff --git a/Master/texmf-dist/source/latex/base/lthooks.dtx b/Master/texmf-dist/source/latex/base/lthooks.dtx
new file mode 100644
index 00000000000..0a04c38efbd
--- /dev/null
+++ b/Master/texmf-dist/source/latex/base/lthooks.dtx
@@ -0,0 +1,4520 @@
+% \iffalse meta-comment
+%%
+%% File: lthooks.dtx (C) Copyright 2020 Frank Mittelbach,
+%% Phelype Oleinik & LaTeX Team
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+%
+% \iffalse
+%
+%%% From File: lthooks.dtx
+%
+% \begin{macrocode}
+\def\lthooksversion{v1.0h}
+\def\lthooksdate{2021/01/07}
+% \end{macrocode}
+%
+%<*driver>
+\documentclass{l3doc}
+
+% bug fix fo l3doc.cls
+\ExplSyntaxOn
+\cs_set_protected:Npn \__codedoc_macro_typeset_one:nN #1#2
+ {
+ \vbox_set:Nn \l__codedoc_macro_box
+ {
+ \vbox_unpack_drop:N \l__codedoc_macro_box
+ \hbox { \llap { \__codedoc_print_macroname:nN {#1} #2
+ \MacroFont % <----- without it the \ is in lmr10 if a link is made
+ \
+ } }
+ }
+ \int_incr:N \l__codedoc_macro_int
+ }
+\ExplSyntaxOff
+
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{lthooks.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \long\def\fmi#1{\begin{quote}\itshape FMi: #1\end{quote}}
+% \long\def\pho#1{\begin{quote}\itshape PhO: #1\end{quote}}
+%
+% \newcommand\hook[1]{\texttt{#1}}
+%
+%
+% \title{The \texttt{lthooks} package\thanks{This package has version
+% \lthooksversion\ dated \lthooksdate, \copyright\ \LaTeX\
+% Project.}}
+%
+% \author{Frank Mittelbach\thanks{Code improvements for speed and other goodies by Phelype Oleinik}}
+%
+% \maketitle
+%
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% Hooks are points in the code of commands or environments where it
+% is possible to add processing code into existing commands. This
+% can be done by different packages that do not know about each
+% other and to allow for hopefully safe processing it is necessary
+% to sort different chunks of code added by different packages into
+% a suitable processing order.
+%
+% This is done by the packages adding chunks of code (via
+% \cs{AddToHook}) and labeling their code with some label by
+% default using the package name as a label.
+%
+% At \verb=\begin{document}= all code for a hook is then sorted
+% according to some rules (given by \cs{DeclareHookRule}) for fast
+% execution without processing overhead. If the hook code is
+% modified afterwards (or the rules are changed),
+% a new version for fast processing is generated.
+%
+% Some hooks are used already in the preamble of the document. If
+% that happens then the hook is prepared for execution (and sorted)
+% already at that point.
+%
+%
+% \section{Package writer interface}
+%
+% The hook management system is offered as a set of CamelCase
+% commands for traditional \LaTeXe{} packages (and for use in the
+% document preamble if needed) as well as \texttt{expl3} commands
+% for modern packages, that use the L3 programming layer of
+% \LaTeX{}. Behind the scenes, a single set of data structures is
+% accessed so that packages from both worlds can coexist and access
+% hooks in other packages.
+%
+%
+%
+% \subsection{\LaTeXe\ interfaces}
+%
+% \subsubsection{Declaring hooks and using them in code}
+%
+% With two exceptions, hooks have to be declared before they can be
+% used. The exceptions are hooks in environments (i.e., executed at
+% \cs{begin} and \cs{end}) and hooks run when loading files,
+% e.g. before and after a package is loaded, etc. Their hook names
+% depend on the environment or the file name and so declaring them
+% beforehand is difficult.
+%
+%
+% \begin{function}{\NewHook}
+% \begin{syntax}
+% \cs{NewHook} \Arg{hook}
+% \end{syntax}
+% Creates a new \meta{hook}.
+% If this is a hook provided as part of a package it is suggested
+% that the \meta{hook} name is always structured as follows:
+% \meta{package-name}\texttt{/}\meta{hook-name}. If necessary you
+% can further subdivide the name by adding more \texttt{/} parts.
+% If a hook name is already taken, an error is raised and the hook
+% is not created.
+%
+% The \meta{hook} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}
+%
+% \begin{function}{\NewReversedHook}
+% \begin{syntax}
+% \cs{NewReversedHook} \Arg{hook}
+% \end{syntax}
+% Like \cs{NewHook} declares a new \meta{hook}.
+% the difference is that the code chunks for this hook are in
+% reverse order by default (those added last are executed first).
+% Any rules for the hook are applied after the default ordering.
+% See sections~\ref{sec:order} and \ref{sec:reversed-order}
+% for further details.
+%
+% The \meta{hook} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}
+%
+%
+% \begin{function}{\NewMirroredHookPair}
+% \begin{syntax}
+% \cs{NewMirroredHookPair} \Arg{hook-1} \Arg{hook-2}
+% \end{syntax}
+% A shorthand for
+% \cs{NewHook}\Arg{hook-1}\cs{NewReversedHook}\Arg{hook-2}.
+%
+% The \meta{hooks} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}
+%
+%
+%
+%
+% \begin{function}{\UseHook}
+% \begin{syntax}
+% \cs{UseHook} \Arg{hook}
+% \end{syntax}
+% Execute the hook code inside a command or environment.
+%
+% Before \verb=\begin{document}= the fast execution code for a hook
+% is not set up, so in order to use a hook there it is explicitly
+% initialized first. As that involves assignments using a hook at
+% those times is not 100\% the same as using it after
+% \verb=\begin{document}=.
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+% \begin{function}{\UseOneTimeHook}
+% \begin{syntax}
+% \cs{UseOneTimeHook} \Arg{hook}
+% \end{syntax}
+% Some hooks are only used (and can be only used) in one place, for
+% example, those in \verb=\begin{document}= or
+% \verb=\end{document}=. Once we have passed that point adding to
+% the hook through a defined \cs{\meta{addto-cmd}} command (e.g.,
+% \cs{AddToHook} or \cs{AtBeginDocument}, etc.\@) would have no
+% effect (as would the use of such a command inside the hook code
+% itself). It is therefore customary to redefine
+% \cs{\meta{addto-cmd}} to simply process its argument, i.e.,
+% essentially make it behave like \cs{@firstofone}.
+%
+% \cs{UseOneTimeHook} does that: it records that the hook has been
+% consumed and any further attempt to add to it will result in
+% executing the code to be added immediately.
+%
+% \fmi{Maybe add an error version as well?}
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+%
+% \subsubsection{Updating code for hooks}
+%
+% \begin{function}{\AddToHook}
+% \begin{syntax}
+% \cs{AddToHook} \Arg{hook}\oarg{label}\Arg{code}
+% \end{syntax}
+% Adds \meta{code} to the \meta{hook} labeled by \meta{label}.
+% When the optional argument \meta{label} is not provided, the
+% \meta{default label} is used (see section~\ref{sec:default-label}).
+% If \cs{AddToHook} is used in a package/class, the
+% \meta{default label} is the package/class name, otherwise it is
+% \hook{top-level} (the \hook{top-level} label is treated
+% differently: see section~\ref{sec:top-level}).
+%
+% If there already exists code under the \meta{label} then the new
+% \meta{code} is appended to the existing one (even if this is a reversed hook).
+% If you want to replace existing code under the
+% \meta{label}, first apply \cs{RemoveFromHook}.
+%
+% The hook doesn't have to exist for code to be added to
+% it. However, if it is not declared, then obviously the
+% added \meta{code} will never be executed. This
+% allows for hooks to work regardless of package loading order and
+% enables packages to add to hooks from other packages without
+% worrying whether they are actually used in the current document.
+% See section~\ref{sec:querying}.
+%
+% The \meta{hook} and \meta{label} can be specified using the
+% dot-syntax to denote the current package name.
+% See section~\ref{sec:default-label}.
+% \end{function}
+%
+% \begin{function}{\RemoveFromHook}
+% \begin{syntax}
+% \cs{RemoveFromHook} \Arg{hook}\oarg{label}
+% \end{syntax}
+% Removes any code labeled by \meta{label} from the \meta{hook}.
+% When the optional argument \meta{label} is not provided, the
+% \meta{default label} is used (see section~\ref{sec:default-label}).
+%
+% If the code for that \meta{label} wasn't yet added to the
+% \meta{hook}, an order is set so that when some code attempts to add
+% that label, the removal order takes action and the code is not
+% added.
+%
+% If the optional argument is \texttt{*}, then all code chunks are
+% removed. This is rather dangerous as it drops code from other
+% packages one may not know about!
+%
+% The \meta{hook} and \meta{label} can be specified using the
+% dot-syntax to denote the current package name.
+% See section~\ref{sec:default-label}.
+% \end{function}
+%
+% \medskip
+%
+% In contrast to the \texttt{voids} relationship between two labels
+% in a \cs{DeclareHookRule} this is a destructive operation as the
+% labeled code is removed from the hook data structure, whereas the
+% relationship setting can be undone by providing a different
+% relationship later.
+%
+% A useful application for this declaration inside the document body
+% is when one wants to temporarily add code to hooks and later remove
+% it again, e.g.,
+%\begin{verbatim}
+% \AddToHook{env/quote/before}{\small}
+% \begin{quote}
+% A quote set in a smaller typeface
+% \end{quote}
+% ...
+% \RemoveFromHook{env/quote/before}
+% ... now back to normal for further quotes
+%\end{verbatim}
+% Note that you can't cancel the setting with
+%\begin{verbatim}
+% \AddToHook{env/quote/before}{}
+%\end{verbatim}
+% because that only \enquote{adds} a further empty chunk of code to
+% the hook. Adding \cs{normalsize} would work but that means the hook
+% then contained \cs{small}\cs{normalsize} which means to font size
+% changes for no good reason.
+%
+% The above is only needed if one wants to typeset several quotes in a
+% smaller typeface. If the hook is only needed once then
+% \cs{AddToHookNext} is simpler, because it resets itself after one use.
+%
+%
+% \begin{function}{\AddToHookNext}
+% \begin{syntax}
+% \cs{AddToHookNext} \Arg{hook}\Arg{code}
+% \end{syntax}
+% Adds \meta{code} to the next invocation of the \meta{hook}.
+% The code is executed after the normal hook code has finished and
+% it is executed only once, i.e. it is deleted after it was used.
+%
+% Using the declaration is a global operation, i.e., the code is
+% not lost, even if the declaration is used inside a group and the
+% next invocation happens after the group. If the declaration is
+% used several times before the hook is executed then all code is
+% executed in the order in which it was declared.\footnotemark
+%
+% It is possible to nest declarations using the same hook (or
+% different hooks), e.g.,
+% \begin{quote}
+% \cs{AddToHookNext}\Arg{hook}\verb={=\meta{code-1}^^A
+% \cs{AddToHookNext}\Arg{hook}\Arg{code-2}\verb=}=
+% \end{quote}
+% will execute \meta{code-1} next time the \meta{hook} is used and at
+% that point puts \meta{code-2} into the \meta{hook} so that it gets
+% executed on following time the hook is run.
+%
+% A hook doesn't have to exist for code to be added to it. This
+% allows for hooks to work regardless of package loading
+% order.
+% See section~\ref{sec:querying}.
+%
+% The \meta{hook} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}\footnotetext{There is
+% no mechanism to reorder such code chunks (or delete them).}
+%
+% \subsubsection{Hook names and default labels}
+% \label{sec:default-label}
+%
+% It is best practice to use \cs{AddToHook} in packages or classes
+% \emph{without specifying a \meta{label}} because then the package
+% or class name is automatically used, which is helpful if rules are
+% needed, and avoids mistyping the \meta{label}.
+%
+% Using an explicit \meta{label} is only necessary in very specific
+% situations, e.g., if you want to add several chunks of code into a
+% single hook and have them placed in different parts of the hook
+% (by providing some rules).
+%
+% The other case is when you develop a larger package with several
+% sub-packages. In that case you may want to use the same
+% \meta{label} throughout the sub-packages in order to avoid
+% that the labels change if you internally reorganize your code.
+%
+% Except for \cs{UseHook}, \cs{UseOneTimeHook}, \cs{IfHookEmptyTF}, and
+% \cs{IfHookExistsTF} (and their \pkg{expl3} interfaces \cs{hook_use:n},
+% \cs{hook_use_once:n}, \cs{hook_if_empty:nTF}, and
+% \cs{hook_if_exist:nTF}), all \meta{hook}
+% and \meta{label} arguments are processed in the same way: first,
+% spaces are trimmed around the argument, then it is fully expanded
+% until only character tokens remain. If the full expansion of the
+% \meta{hook} or \meta{label} contains a non-expandable non-character
+% token, a low-level \TeX{} error is raised (namely, the \meta{hook} is
+% expanded using \TeX's \cs{csname}\ldots\cs{endcsname}, as such,
+% Unicode characters are allowed in \meta{hook} and \meta{label}
+% arguments). The arguments of \cs{UseHook}, \cs{UseOneTimeHook},
+% \cs{IfHookEmptyTF}, and \cs{IfHookExistsTF} are
+% processed much in the same way except that spaces are not trimmed
+% around the argument, for better performance.
+%
+% It is not enforced, but highly recommended that the hooks defined by
+% a package, and the \meta{labels} used to add code to other hooks
+% contain the package name to easily identify the source of the code
+% chunk and to prevent clashes. This should be the standard practice,
+% so this hook management code provides a shortcut to refer to the
+% current package in the name of a \meta{hook} and in a \meta{label}.
+% If the \meta{hook} name or the \meta{label} consist just of a single dot
+% (|.|), or starts with a dot followed by a slash (|./|) then the dot
+% denotes the \meta{default label} (usually the current package or class
+% name---see~\cs{SetDefaultHookLabel}).
+% A \enquote{|.|} or \enquote{|./|} anywhere else in a \meta{hook} or in
+% \meta{label} is treated literally and is not replaced.
+%
+% For example,
+% inside the package \texttt{mypackage.sty}, the default label is
+% \texttt{mypackage}, so the instructions:
+% \begin{verbatim}
+% \NewHook {./hook}
+% \AddToHook {./hook}[.]{code} % Same as \AddToHook{./hook}{code}
+% \AddToHook {./hook}[./sub]{code}
+% \DeclareHookRule{begindocument}{.}{before}{babel}
+% \AddToHook {file/after/foo.tex}{code}
+% \end{verbatim}
+% are equivalent to:
+% \begin{verbatim}
+% \NewHook {mypackage/hook}
+% \AddToHook {mypackage/hook}[mypackage]{code}
+% \AddToHook {mypackage/hook}[mypackage/sub]{code}
+% \DeclareHookRule{begindocument}{mypackage}{before}{babel}
+% \AddToHook {file/after/foo.tex}{code} % unchanged
+% \end{verbatim}
+%
+% The \meta{default label} is automatically set equal to the name of the
+% current package or class at the time the package is loaded. If the
+% hook command is used outside of a package, or the current file wasn't
+% loaded with \cs{usepackage} or \cs{documentclass}, then the
+% \texttt{top-level} is used as the \meta{default label}. This may have
+% exceptions---see \cs{PushDefaultHookLabel}.
+%
+% This syntax is available in all \meta{label} arguments and most
+% \meta{hook} arguments, both in the \LaTeXe{} interface, and the \LaTeX3
+% interface described in section~\ref{sec:l3hook-interface}.
+%
+% Note, however, that the replacement of |.| by the \meta{default label}
+% takes place when the hook command is executed, so actions that are
+% somehow executed after the package ends will have the wrong
+% \meta{default label} if the dot-syntax is used. For that reason,
+% this syntax is not available in \cs{UseHook} (and \cs{hook_use:n})
+% because the hook is most of the time used outside of the package file
+% in which it was defined. This syntax is also not available in the hook
+% conditionals \cs{IfHookEmptyTF} (and \cs{hook_if_empty:nTF}) and
+% \cs{IfHookExistsTF} (and \cs{hook_if_exist:nTF}) because these
+% conditionals are used in some performance-critical parts of the hook
+% management code, and because they are usually used to refer to other
+% package's hooks, so the dot-syntax doesn't make much sense.
+%
+% In some cases, for example in large packages, one may want to separate
+% it in logical parts, but still use the main package name as
+% \meta{label}, then the \meta{default label} can be set using
+% \cs{SetDefaultHookLabel} or
+% \cs{PushDefaultHookLabel}..\cs{PopDefaultHookLabel}.
+%
+% \begin{function}{\PushDefaultHookLabel,\PopDefaultHookLabel}
+% \begin{syntax}
+% \cs{PushDefaultHookLabel} \Arg{default label}
+% \quad \meta{code}
+% \cs{PopDefaultHookLabel}
+% \end{syntax}
+% \cs{PushDefaultHookLabel} sets the current \meta{default label} to
+% be used in \meta{label} arguments, or when replacing a leading
+% ``|.|'' (see above). \cs{PopDefaultHookLabel} reverts the
+% \meta{default label} to its previous value.
+%
+% Inside a package or class, the \meta{default label} is equal to the
+% package or class name, unless explicitly changed. Everywhere else,
+% the \meta{default label} is |top-level| (see
+% section~\ref{sec:top-level}) unless explicitly changed.
+%
+% The effect of \cs{PushDefaultHookLabel} holds until the next
+% \cs{PopDefaultHookLabel}. \cs{usepackage} (and \cs{RequirePackage}
+% and \cs{documentclass}) internally use
+% \begin{quote}
+% \cs{PushDefaultHookLabel}\Arg{package name} \\
+% \null \quad \meta{package code} \\
+% \cs{PopDefaultHookLabel}
+% \end{quote}
+% to set the \meta{default label} for the package or class file.
+% Inside the \meta{package code} the \meta{default label} can also be
+% changed with \cs{SetDefaultHookLabel}. \cs{input} and other
+% file input-related commands from the \LaTeX{} kernel do not use
+% \cs{PushDefaultHookLabel}, so code within files loaded by these
+% commands does \emph{not} get a dedicated \meta{label}! (that is, the
+% \meta{default label} is the current active one when the file was
+% loaded.)
+%
+% Packages that provide their own package-like interfaces
+% (Ti\textit{k}Z's \cs{usetikzlibrary}, for example) can use
+% \cs{PushDefaultHookLabel} and \cs{PopDefaultHookLabel} to set
+% dedicated labels and emulate \cs{usepackage}-like hook behaviour
+% within those contexts.
+%
+% The |top-level| label is treated differently, and is reserved to the
+% user document, so it is not allowed to change the
+% \meta{default label} to |top-level|.
+% \end{function}
+%
+% \begin{function}{\SetDefaultHookLabel}
+% \begin{syntax}
+% \cs{SetDefaultHookLabel} \Arg{default label}
+% \end{syntax}
+% Similarly to \cs{PushDefaultHookLabel},
+% sets the current \meta{default label} to
+% be used in \meta{label} arguments, or when replacing a leading
+% ``|.|''. The effect holds until the label is changed again or until
+% the next \cs{PopDefaultHookLabel}. The difference between
+% \cs{PushDefaultHookLabel} and \cs{SetDefaultHookLabel} is that the
+% latter does not save the current \meta{default label}.
+%
+% This command is useful when a large package is composed of several
+% smaller packages, but all should have the same \meta{label}, so
+% \cs{SetDefaultHookLabel} can be used at the beginning of each
+% package file to set the correct label.
+%
+% \cs{SetDefaultHookLabel} is not allowed in the main document, where
+% the \meta{default label} is |top-level| and there is no
+% \cs{PopDefaultHookLabel} to end its effect.
+% It is also not allowed to change the \meta{default label} to
+% |top-level|.
+% \end{function}
+%
+% \subsubsection{The \texttt{top-level} label}
+% \label{sec:top-level}
+%
+% The |top-level| label, assigned to code added from the main document,
+% is different from other labels. Code added to hooks (usually
+% \cs{AtBeginDocument}) in the preamble is almost always to change
+% something defined by a package, so it should go at the very end of the
+% hook.
+%
+% Therefore, code added in the |top-level| is always executed at the end
+% of the hook, regardless of where it was declared. If the hook is
+% reversed (see \cs{NewReversedHook}), the |top-level| chunk is executed
+% at the very beginning instead.
+%
+% Rules regarding |top-level| have no effect: if a user wants to have a
+% specific set of rules for a code chunk, they should use a different
+% label to said code chunk, and provide a rule for that label instead.
+%
+% The |top-level| label is exclusive for the user, so trying to add code
+% with that label from a package results in an error.
+%
+% \subsubsection{Defining relations between hook code}
+%
+% The default assumption is that code added to hooks by different
+% packages are independent and the order in which they are executed is
+% irrelevant. While this is true in many cases it is obviously false
+% in others.
+%
+% Before the hook management system was introduced
+% packages had to take elaborate precaution to determine of some other
+% package got loaded as well (before or after) and find some ways to
+% alter its behavior accordingly. In addition is was often the user's
+% responsibility to load packages in the right order so that code
+% added to hooks got added in the right order and some cases even
+% altering the loading order wouldn't resolve the conflicts.
+%
+% With the new hook management system it is now possible to define
+% rules (i.e., relationships) between code chunks added by different
+% packages and explicitly describe in which order they should be
+% processed.
+%
+% \begin{function}{\DeclareHookRule}
+% \begin{syntax}
+% \cs{DeclareHookRule} \Arg{hook}\Arg{label1}\Arg{relation}\Arg{label2}
+% \end{syntax}
+% Defines a relation between \meta{label1} and \meta{label2} for a
+% given \meta{hook}. If \meta{hook} is \texttt{??} this defines a default
+% relation for all hooks that use the two labels, i.e., that have
+% chunks of code labeled with \meta{label1} and \meta{label2}.
+% Rules specific to a given hook take precedence over default
+% rules that use \texttt{??} as the \meta{hook}.
+%
+% Currently, the supported relations are the following:
+% \begin{itemize}
+%
+% \item[\texttt{before} or \texttt{\string<}]
+%
+% Code for \meta{label1} comes before code for \meta{label2}.
+%
+% \item[\texttt{after} or \texttt{\string>}]
+% Code for \meta{label1} comes after code for \meta{label2}.
+%
+% \item[\texttt{incompatible-warning}]
+%
+% Only code for either \meta{label1} or \meta{label2} can appear
+% for that hook (a way to say that two packages---or parts of
+% them---are incompatible). A warning is raised if both labels
+% appear in the same hook.
+%
+% \item[\texttt{incompatible-error}]
+%
+% Like \texttt{incompatible-error} but instead of a warning a
+% \LaTeX{} error is raised, and the code for both labels are
+% dropped from that hook until the conflict is resolved.
+%
+% \item[\texttt{voids}]
+%
+% Code for \meta{label1} overwrites code for \meta{label2}. More
+% precisely, code for \meta{label2} is dropped for that
+% hook. This can be used, for example if one package is a
+% superset in functionality of another one and therefore wants to
+% undo code in some hook and replace it with its own version.
+%
+% \item[\texttt{unrelated}]
+%
+% The order of code for \meta{label1} and \meta{label2} is
+% irrelevant. This rule is there to undo an incorrect rule
+% specified earlier.
+%
+% \end{itemize}
+% There can only be a single relation between two labels for a
+% given hook,
+% i.e., a later \cs{DeclareHookrule} overwrites any previous
+% delcaration.
+%
+% The \meta{hook} and \meta{label} can be specified using the
+% dot-syntax to denote the current package name.
+% See section~\ref{sec:default-label}.
+%
+% \end{function}
+%
+%
+% \begin{function}{\ClearHookRule}
+% \begin{syntax}
+% \cs{ClearHookRule}\Arg{hook}\Arg{label1}\Arg{label2}
+% \end{syntax}
+% Syntactic sugar for saying that \meta{label1} and \meta{label2}
+% are unrelated for the given \meta{hook}.
+% \end{function}
+%
+%
+%
+% \begin{function}{\DeclareDefaultHookRule}
+% \begin{syntax}
+% \cs{DeclareDefaultHookRule}\Arg{label1}\Arg{relation}\Arg{label2}
+% \end{syntax}
+% This sets up a relation between \meta{label1} and \meta{label2}
+% for all hooks unless overwritten by a specific rule for a hook.
+% Useful for cases where one package has a specific relation to
+% some other package, e.g., is \texttt{incompatible} or always
+% needs a special ordering \texttt{before} or \texttt{after}.
+% (Technically it is just a shorthand for using \cs{DeclareHookRule}
+% with \texttt{??} as the hook name.)
+%
+% Declaring default rules is only supported in the document
+% preamble.\footnotemark{}
+%
+% The \meta{label} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}\footnotetext{Trying to do so, e.g., via
+% \cs{DeclareHookRule} with \texttt{??} has bad side-effects and
+% is not supported (though not explicitly caught for performance
+% reasons).}
+%
+%
+%
+% \subsubsection{Querying hooks}
+% \label{sec:querying}
+%
+% Simpler data types, like token lists, have three possible states; they
+% can:
+% \begin{itemize}
+% \item exist and be empty;
+% \item exist and be non-empty; and
+% \item not exist (in which case emptiness doesn't apply);
+% \end{itemize}
+% Hooks are a bit more complicated: they have four possible states.
+% A hook may exist or not, and either way it may or may not be empty.
+% This means that even a hook that doesn't exist may be non-empty.
+%
+% This seemingly strange state may happen when, for example, package~$A$
+% defines hook \hook{A/foo}, and package $B$ adds some code to that
+% hook. However, a document may load package $B$ before package $A$, or
+% may not load package $A$ at all. In both cases some code is added to
+% hook \hook{A/foo} without that hook being defined yet, thus that
+% hook is said to be non-empty, whereas it doesn't exist. Therefore,
+% querying the existence of a hook doesn't imply its emptiness, neither
+% does the other way around.
+%
+% A hook is said to be empty when no code was added to it, either to
+% its permanent code pool, or to its ``next'' token list. The hook
+% doesn't need to be declared to have code added to its code pool.
+% A hook is said to exist when it was declared with \cs{NewHook} or
+% some variant thereof. Generic \hook{file} and \hook{env} hooks are
+% automatically declared when code is added to them.
+%
+% \begin{function}[EXP]{\IfHookEmptyTF}
+% \begin{syntax}
+% \cs{IfHookEmptyTF} \Arg{hook} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{hook} is empty (\emph{i.e.}, no code was added to
+% it using either \cs{AddToHook} or \cs{AddToHookNext}), and
+% branches to either \meta{true code} or \meta{false code} depending
+% on the result.
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+% \begin{function}[EXP]{\IfHookExistsTF}
+% \begin{syntax}
+% \cs{IfHookExistsTF} \Arg{hook} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{hook} exists (if it was created with either
+% \cs{NewHook}, \cs{NewReversedHook}, or \cs{NewMirroredHookPair}), and
+% branches to either \meta{true code} or \meta{false code} depending
+% on the result.
+%
+% The existence of a hook usually doesn't mean much from the viewpoint
+% of code that tries to add/remove code from that hook, since package
+% loading order may vary, thus the creation of hooks is asynchronous
+% to adding and removing code from it, so this test should be used
+% sparingly.
+%
+% Generic hooks are declared at the time code is added to them, so the
+% result of \cs{hook_if_exist:n} will change once code is added to
+% said hook (unless the hook was previously declared).
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+% \fmi{Would be helpful if we provide some use cases}
+%
+% \subsubsection{Displaying hook code}
+%
+% If one has to adjust the code execution in a hook using a hook
+% rule it is helpful to get some information about the code
+% associated with a hook, its current order and the existing rules.
+%
+% \begin{function}{\ShowHook,\LogHook}
+% \begin{syntax}
+% \cs{ShowHook} \Arg{hook}
+% \end{syntax}
+% Displays information about the \meta{hook} such as
+% \begin{itemize}
+% \item
+% the code chunks (and their labels) added to it,
+% \item
+% any rules set up to order them,
+% \item
+% the computed order in which the chunks are executed,
+% \item
+% any code executed on the next invocation only.
+% \end{itemize}
+% \end{function}
+%
+% \cs{LogHook} prints the information to the |.log| file, and
+% \cs{ShowHook} prints them to the terminal/command window and starts
+% \TeX's prompt (only in \cs{errorstopmode}) to wait for user action.
+%
+% The \meta{hook} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+%
+%^^A % Code for the listing below:
+%^^A \NewHook{example-hook}
+%^^A \AddToHook{example-hook}{[code from 'top-level']}
+%^^A \AddToHook{example-hook}[foo]{[code from package 'foo']}
+%^^A \AddToHook{example-hook}[bar]{[from package 'bar']}
+%^^A \AddToHook{example-hook}[baz]{[package 'baz' is here]}
+%^^A \AddToHookNext{example-hook}{[one-time code]}
+%^^A \DeclareHookRule{example-hook}{baz}{before}{foo}
+%^^A \DeclareDefaultHookRule{bar}{after}{baz}
+%^^A \ShowHook{example-hook}
+%
+% \def\theFancyVerbLine{\textcolor[gray]{0.5}{%^^A
+% \sffamily\tiny\arabic{FancyVerbLine}}}
+%
+% \bigskip
+% Suppose a hook \texttt{example-hook} whose output of
+% \cs{ShowHook}|{example-hook}| is:
+% \begin{verbatim}[numbers=left]
+% -> The hook 'example-hook':
+% > Code chunks:
+% > foo -> [code from package 'foo']
+% > bar -> [from package 'bar']
+% > baz -> [package 'baz' is here]
+% > Document-level (top-level) code (executed last):
+% > -> [code from 'top-level']
+% > Extra code for next invocation:
+% > -> [one-time code]
+% > Rules:
+% > foo|baz with relation >
+% > baz|bar with default relation <
+% > Execution order (after applying rules):
+% > baz, foo, bar.
+% \end{verbatim}
+%
+% In the listing above, lines~3 to~5 show the three code chunks added
+% to the hook and their respective labels in the format
+% \begin{quote}
+% \quad \meta{label}\verb| -> |\meta{code}
+% \end{quote}
+%
+% Line~7 shows the code chunk added by the user in the main document
+% (labeled |top-level|) in the format
+% \begin{quote}
+% \quad\verb|Document-level (top-level) code (executed |%^^A
+% \meta{first\texttt{\string|}last}\verb|):|\\
+% \quad\verb| -> |\meta{\texttt{top-level} code}
+% \end{quote}
+% This code will be either the first or last code executed by the hook
+% (|last| if the hook is normal, |first| if it is reversed). This
+% chunk is not affected by rules and does not take part in sorting.
+%
+% Line~9 shows the code chunk for the next execution of the hook in
+% the format
+% \begin{quote}
+% \quad \verb|-> |\meta{next-code}
+% \end{quote}
+% This code will be used and disappear at the next
+% \verb|\UseHook{example-hook}|, in contrast to the chunks mentioned
+% earlier, which can only be removed from that hook by doing
+% \verb|\RemoveFromHook{|\meta{label}|}[example-hook]|.
+%
+% Lines~11 and~12 show the rules declared that affect this hook in the
+% format
+% \begin{quote}
+% \quad \meta{label-1}\verb+|+\meta{label-2}| with |%^^A
+% \meta{\texttt{default}?}| relation |\meta{relation}
+% \end{quote}
+% which means that the \meta{relation} applies to \meta{label-1} and
+% \meta{label-2}, in that order, as detailed in \cs{DeclareHookRule}.
+% If the relation is \texttt{default} it means that that rule applies
+% to \meta{label-1} and \meta{label-2} in \emph{all} hooks, (unless
+% overrided by a non-default relation).
+%
+% Finally, line~14 lists the labels in the hook after sorting;
+% that is, in the order they will be executed when the hook is used.
+%
+%
+% \subsubsection{Debugging hook code}
+%
+% \begin{function}{\DebugHooksOn,\DebugHooksOff}
+% \begin{syntax}
+% \cs{DebugHooksOn}
+% \end{syntax}
+% Turn the debugging of hook code on or off. This displays changes
+% made to the hook data structures. The output is rather coarse and
+% not really intended for normal use.
+% \end{function}
+%
+%
+% \subsection{L3 programming layer (\texttt{expl3}) interfaces}
+% \label{sec:l3hook-interface}
+%
+%
+% This is a quick summary of the \LaTeX3 programming interfaces for
+% use with packages written in \texttt{expl3}. In contrast to the
+% \LaTeXe{} interfaces they always use mandatory arguments only, e.g.,
+% you always have to specify the \meta{label} for a code chunk. We
+% therefore suggest to use the declarations discussed in the previous
+% section even in \texttt{expl3} packages, but the choice is yours.
+%
+%
+% \begin{function}
+% {\hook_new:n,\hook_new_reversed:n,\hook_new_pair:nn}
+% \begin{syntax}
+% \cs{hook_new:n} \Arg{hook}
+% \cs{hook_new_reversed:n} \Arg{hook}
+% \cs{hook_new_pair:nn} \Arg{hook-1} \Arg{hook-2}
+% \end{syntax}
+% Creates a new \meta{hook} with normal or reverse ordering of code
+% chunks. \cs{hook_new_pair:nn} creates a pair of such hooks with
+% \Arg{hook-2} being a reversed hook.
+% If a hook name is already taken, an error is raised and the hook
+% is not created.
+%
+% The \meta{hook} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}
+%
+%
+%
+% \begin{function}{\hook_use:n}
+% \begin{syntax}
+% \cs{hook_use:n} \Arg{hook}
+% \end{syntax}
+% Executes the \Arg{hook} code followed (if set up) by the code for next
+% invocation only, then empties that next invocation code.
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+% \begin{function}{\hook_use_once:n}
+% \begin{syntax}
+% \cs{hook_use_once:n} \Arg{hook}
+% \end{syntax}
+% Changes the \Arg{hook} status so that from now on any addition to
+% the hook code is executed immediately. Then execute any
+% \Arg{hook} code already set up.
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+% \begin{function}{\hook_gput_code:nnn}
+% \begin{syntax}
+% \cs{hook_gput_code:nnn} \Arg{hook} \Arg{label} \Arg{code}
+% \end{syntax}
+% Adds a chunk of \meta{code} to the \meta{hook} labeled
+% \meta{label}. If the label already exists the \meta{code} is
+% appended to the already existing code.
+%
+% If code is added to an external \meta{hook} (of the kernel or
+% another package) then the convention is to use the package name
+% as the \meta{label} not some internal module name or some other
+% arbitrary string.
+%
+% The \meta{hook} and \meta{label} can be specified using the
+% dot-syntax to denote the current package name.
+% See section~\ref{sec:default-label}.
+% \end{function}
+%
+% \begin{function}
+% {\hook_gput_next_code:nn}
+% \begin{syntax}
+% \cs{hook_gput_next_code:nn} \Arg{hook} \Arg{code}
+% \end{syntax}
+% Adds a chunk of \meta{code} for use only in the next invocation of the
+% \meta{hook}. Once used it is gone.
+%
+% This is simpler than \cs{hook_gput_code:nnn}, the code is simply
+% appended to the hook in the order of declaration at the very end,
+% i.e., after all standard code for the hook got executed.
+%
+% Thus if one needs to undo what the standard does one has to do
+% that as part of \meta{code}.
+%
+% The \meta{hook} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}
+%
+%
+%
+% \begin{function}{\hook_gremove_code:nn}
+% \begin{syntax}
+% \cs{hook_gremove_code:nn} \Arg{hook} \Arg{label}
+% \end{syntax}
+% Removes any code for \meta{hook} labeled \meta{label}.
+%
+% If the code for that \meta{label} wasn't yet added to the
+% \meta{hook}, an order is set so that when some code attempts to add
+% that label, the removal order takes action and the code is not
+% added.
+%
+% If the second argument is \texttt{*}, then all code chunks are
+% removed. This is rather dangerous as it drops code from other
+% packages one may not know about, so think twice before using
+% that!
+%
+% The \meta{hook} and \meta{label} can be specified using the
+% dot-syntax to denote the current package name.
+% See section~\ref{sec:default-label}.
+% \end{function}
+%
+%
+% \begin{function}{\hook_gset_rule:nnnn}
+% \begin{syntax}
+% \cs{hook_gset_rule:nnnn} \Arg{hook} \Arg{label1} \Arg{relation} \Arg{label2}
+% \end{syntax}
+% Relate \meta{label1} with \meta{label2} when used in \meta{hook}.
+% See \cs{DeclareHookRule} for the allowed \meta{relation}s.
+% If \meta{hook} is \texttt{??} a default rule is specified.
+%
+% The \meta{hook} and \meta{label} can be specified using the
+% dot-syntax to denote the current package name.
+% See section~\ref{sec:default-label}.
+% The dot-syntax is parsed in both \meta{label} arguments, but it
+% usually makes sense to be used in only one of them.
+% \end{function}
+%
+% \begin{function}[pTF]{\hook_if_empty:n}
+% \begin{syntax}
+% \cs{hook_if_empty:nTF} \Arg{hook} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{hook} is empty (\emph{i.e.}, no code was added to
+% it using either \cs{AddToHook} or \cs{AddToHookNext}), and
+% branches to either \meta{true code} or \meta{false code} depending
+% on the result.
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+% \begin{function}[pTF]{\hook_if_exist:n}
+% \begin{syntax}
+% \cs{hook_if_exist:nTF} \Arg{hook} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{hook} exists (if it was created with either
+% \cs{NewHook}, \cs{NewReversedHook}, or \cs{NewMirroredHookPair}), and
+% branches to either \meta{true code} or \meta{false code} depending
+% on the result.
+%
+% The existence of a hook usually doesn't mean much from the viewpoint
+% of code that tries to add/remove code from that hook, since package
+% loading order may vary, thus the creation of hooks is asynchronous
+% to adding and removing code from it, so this test should be used
+% sparingly.
+%
+% Generic hooks are declared at the time code is added to them, so the
+% result of \cs{hook_if_exist:n} will change once code is added to
+% said hook (unless the hook was previously declared).
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+% \begin{function}{\hook_show:n,\hook_log:n}
+% \begin{syntax}
+% \cs{hook_show:n} \Arg{hook}
+% \end{syntax}
+% Displays information about the \meta{hook} such as
+% \begin{itemize}
+% \item
+% the code chunks (and their labels) added to it,
+% \item
+% any rules set up to order them,
+% \item
+% the computed order in which the chunks are executed,
+% \item
+% any code executed on the next invocation only.
+% \end{itemize}
+%
+% \cs{hook_log:n} prints the information to the |.log| file, and
+% \cs{hook_show:n} prints them to the terminal/command window and starts
+% \TeX's prompt (only if \cs{errorstopmode}) to wait for user action.
+%
+% The \meta{hook} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}
+%
+% \begin{function}{\hook_debug_on:,\hook_debug_off:}
+% \begin{syntax}
+% \cs{hook_debug_on:}
+% \end{syntax}
+% Turns the debugging of hook code on or off. This displays changes
+% to the hook data.
+% \end{function}
+%
+%
+%
+% \subsection{On the order of hook code execution} \label{sec:order}
+%
+% Chunks of code for a \meta{hook} under different labels are supposed
+% to be independent if there are no special rules set up that
+% define a relation between the chunks. This means that you can't
+% make assumptions about the order of execution!
+%
+% Suppose you have the following declarations:
+%\begin{verbatim}
+% \NewHook{myhook}
+% \AddToHook{myhook}[packageA]{\typeout{A}}
+% \AddToHook{myhook}[packageB]{\typeout{B}}
+% \AddToHook{myhook}[packageC]{\typeout{C}}
+%\end{verbatim}
+% then executing the hook with \cs{UseHook} will produce the
+% typeout \texttt{A} \texttt{B} \texttt{C} in that order. In other
+% words, the execution order is computed to be \texttt{packageA},
+% \texttt{packageB}, \texttt{packageC} which you can verify with
+% \cs{ShowHook}\texttt{\{myhook\}}:
+%\begin{verbatim}
+% -> The hook 'myhook':
+% > Code chunks:
+% > packageA -> \typeout {A}
+% > packageB -> \typeout {B}
+% > packageC -> \typeout {C}
+% > Document-level (top-level) code (executed last):
+% > ---
+% > Extra code for next invocation:
+% > ---
+% > Rules:
+% > ---
+% > Execution order:
+% > packageA, packageB, packageC.
+%\end{verbatim}
+% The reason is that the code chunks are internally saved in a property list
+% and the initial order of such a property list is the order in
+% which key-value pairs got added. However, that is only true if
+% nothing other than adding happens!
+%
+% Suppose, or example, you want to replace the code chunk for
+% \texttt{packageA}, e.g.,
+%\begin{verbatim}
+% \RemoveFromHook{myhook}[packageA]
+% \AddToHook{myhook}[packageA]{\typeout{A alt}}
+%\end{verbatim}
+% then your order becomes \texttt{packageB},
+% \texttt{packageC}, \texttt{packageA} because the label got removed
+% from the property list and then re-added (at its end).
+%
+% While that may not be too surprising, the execution order is
+% also sometimes altered if you add a redundant rule, e.g. if you specify
+%\begin{verbatim}
+% \DeclareHookRule{myhook}{packageA}{before}{packageB}
+%\end{verbatim}
+% instead of the previous lines we get
+%\begin{verbatim}
+% -> The hook 'myhook':
+% > Code chunks:
+% > packageA -> \typeout {A}
+% > packageB -> \typeout {B}
+% > packageC -> \typeout {C}
+% > Document-level (top-level) code (executed last):
+% > ---
+% > Extra code for next invocation:
+% > ---
+% > Rules:
+% > packageB|packageA with relation >
+% > Execution order (after applying rules):
+% > packageA, packageC, packageB.
+%\end{verbatim}
+% As you can see the code chunks are still in the same order, but
+% in the execution order for the labels \texttt{packageB} and
+% \texttt{packageC} have
+% swapped places.
+% The reason is that, with the rule there are two orders that
+% satisfy it, and the algorithm for sorting happened to pick a
+% different one compared to the case without rules (where it
+% doesn't run at all as there is nothing to resolve).
+% Incidentally, if we had instead specified the redundant rule
+%\begin{verbatim}
+% \DeclareHookRule{myhook}{packageB}{before}{packageC}
+%\end{verbatim}
+% the execution order would not have changed.
+%
+% In summary: it is not possible to rely on the order of execution
+% unless there are rules that partially or fully define the order
+% (in which you can rely on them being fulfilled).
+%
+%
+% \subsection{The use of \enquote{reversed} hooks} \label{sec:reversed-order}
+%
+% You may have wondered why you can declare a \enquote{reversed} hook
+% with \cs{NewReversedHook} and what that does exactly.
+%
+% In short: the execution order of a reversed hook (without any
+% rules!) is exactly reversed to the order you would have gotten for
+% a hook declared with \cs{NewHook}.
+%
+% This is helpful if you have a pair of hooks where you expect to see
+% code added that involves grouping, e.g., starting an environment
+% in the first and closing that environment in the second hook.
+% To give a somewhat contrived example\footnote{there are simpler
+% ways to achieve the same effect.}, suppose there is a package
+% adding the following:
+%\begin{verbatim}
+% \AddToHook{env/quote/before}[package-1]{\begin{itshape}}
+% \AddToHook{env/quote/after} [package-1]{\end{itshape}}
+%\end{verbatim}
+% As a result, all quotes will be in italics.
+% Now suppose further that another |package-too| makes the quotes
+% also in blue and therefore adds:
+%\begin{verbatim}
+% \usepackage{color}
+% \AddToHook{env/quote/before}[package-too]{\begin{color}{blue}}
+% \AddToHook{env/quote/after} [package-too]{\end{color}}
+%\end{verbatim}
+% Now if the \hook{env/quote/after} hook would be a normal hook we
+% would get the same execution order in both hooks, namely:
+%\begin{verbatim}
+% package-1, package-too
+%\end{verbatim}
+% (or vice versa) and as a result, would get:
+%\begin{verbatim}
+% \begin{itshape}\begin{color}{blue} ...
+% \end{itshape}\end{color}
+%\end{verbatim}
+% and an error message that \verb=\begin{color}= ended by
+% \verb=\end{itshape}=.
+% With \hook{env/quote/after} declared as a reversed hook the
+% execution order is reversed and so all environments are closed in
+% the correct sequence and \cs{ShowHook} would give us the
+% following output:
+%\begin{verbatim}
+% -> The hook 'env/quote/after':
+% > Code chunks:
+% > package-1 -> \end {itshape}
+% > package-too -> \end {color}
+% > Document-level (top-level) code (executed first):
+% > ---
+% > Extra code for next invocation:
+% > ---
+% > Rules:
+% > ---
+% > Execution order (after reversal):
+% > package-too, package-1.
+%\end{verbatim}
+%
+% The reversal of the execution order happens before applying any
+% rules, so if you alter the order you will probably have to alter
+% it in both hooks, not just in one, but that depends on the use case.
+%
+%
+%
+%
+% \subsection{Difference between \enquote{normal} and
+% \enquote{one-time} hooks}
+% \label{sec:onetime-hooks}
+%
+% When executing a hook a developer has the choice of using
+% either \cs{UseHook} or \cs{UseOneTimeHook} (or their \pkg{expl3}
+% equivalents \cs{hook_use:n} and \cs{hook_use_once:n}).
+% This choice affects how \cs{AddToHook} is handled after the hook
+% has been executed for the first time.
+%
+% With normal hooks adding code via \cs{AddToHook} means that the
+% code chunk is added to the hook data structure and then used each time
+% \cs{UseHook} is called.
+%
+% With one-time hooks it this is handled slightly differently:
+% After \cs{UseOneTimeHook} has been called, any further attempts to
+% add code to the hook via \cs{AddToHook} will simply execute the
+% \meta{code} immediately.
+%
+% This has some consequences one needs to be aware of:
+% \begin{itemize}
+% \item
+%
+% If \meta{code} is added to a normal hook after the hook was
+% executed and it is never executed again for one or the other
+% reason, then this new \meta{code} will never be executed.
+%
+% \item
+%
+% In contrast if that happens with a one-time hook the \meta{code} is
+% executed immediately.
+%
+% \end{itemize}
+% In particular this means that construct such as
+%\begin{quote}
+% \cs{AddToHook}\verb={myhook}=\\
+% \phantom{\cs{AddToHook}}\verb={= \meta{code-1}
+% \cs{AddToHook}\verb={myhook}=\Arg{code-2}
+% \meta{code-3} \verb=}=
+%\end{quote}
+% works for one-time hooks\footnote{This is sometimes used with
+% \cs{AtBeginDocument} which is why it is supported.} (all three
+% code chunks are executed one after another), but it makes little
+% sense with a normal hook, because with a normal hook the first time
+% \verb=\UseHook{myhook}= is executed it would
+% \begin{itemize}
+% \item
+% execute \meta{code-1},
+% \item
+% then execute \verb=\AddToHook{myhook}{code-2}= which adds the
+% code chunk \meta{code-2} to the hook for use on the next invocation,
+% \item
+% and finally execute \meta{code-3}.
+% \end{itemize}
+% The second time \cs{UseHook} is called it would execute the
+% above and in addition \meta{code-2} as that was added as a code
+% chunk to the hook in the meantime. So each time the hook is used
+% another copy of \meta{code-2} is added and so that code chunk
+% is executed $\meta{\# of invocations} -1$ times.
+%
+%
+%
+%
+%
+% \subsection{Private \LaTeX{} kernel hooks}
+%
+% There are a few places where it is absolutely essential for
+% \LaTeX{} to function correctly that code is executed in a precisely
+% defined order. Even that could have been implemented with the
+% hook management (by adding various rules to ensure the
+% appropriate ordering with respect to other code added by
+% packages). However, this makes every document unnecessary
+% slow, because there has to be sorting even through the result is
+% predetermined. Furthermore it forces package writers to
+% unnecessarily add such rules if they add further code to the hook
+% (or break \LaTeX{}).
+%
+% For that reason such code is not using the hook management, but
+% instead private kernel commands directly before or after a public
+% hook with the following naming
+% convention: \cs{@kernel@before@\meta{hookname}} or
+% \cs{@kernel@after@\meta{hookname}}. For example, in
+% \cs{enddocument} you find
+%\begin{verbatim}
+% \UseHook{enddocument}%
+% \@kernel@after@enddocument
+%\end{verbatim}
+% which means first the user/package-accessible \hook{enddocument}
+% hook is executed and then the internal kernel hook. As their name
+% indicates these kernel commands should not be altered by third-party
+% packages, so please refrain from that in the interest of
+% stability and instead use the public hook next to it.\footnote{As
+% with everything in \TeX{} there is not enforcement of this rule,
+% and by looking at the code it is easy to find out how the kernel
+% adds to them. The main reason of this section is therefore to say
+% \enquote{please don't do that, this is unconfigurable code!}}
+%
+%
+%
+% \subsection{Legacy \LaTeXe{} interfaces}
+%
+% \newcommand\onetimetext{%
+% This is a one-time hook, so after it is executed, all further
+% attempts to add code to it will execute such code immediately
+% (see section~\ref{sec:onetime-hooks}).}
+%
+% \LaTeXe{} offered a small number of hooks together with commands to
+% add to them. They are listed here and are retained for backwards
+% compatibility.
+%
+% With the new hook management several additional hooks have been added
+% to \LaTeX\ and more will follow. See the next section for what
+% is already available.
+%
+%
+% \begin{function}{\AtBeginDocument}
+% \begin{syntax}
+% \cs{AtBeginDocument} \oarg{label} \Arg{code}
+% \end{syntax}
+% If used without the optional argument \meta{label}, it works essentially
+% like before, i.e., it is adding \meta{code} to the hook
+% \hook{begindocument}
+% (which is executed inside \verb=\begin{document}=).
+% However, all code added this way is labeled with the label
+% \hook{top-level} (see section~\ref{sec:top-level})
+% if done outside of a package or class or with the
+% package/class name if called inside such a file
+% (see section~\ref{sec:default-label}).
+%
+% This way one can add further code to the hook using
+% \cs{AddToHook} or \cs{AtBeginDocument} using a different label
+% and explicitly order the code chunks as necessary, e.g., run some
+% code before or after another package's code. When using the
+% optional argument the call is equivalent to running
+% \cs{AddToHook} \texttt{\{begindocument\}} \oarg{label}
+% \Arg{code}.
+%
+% \cs{AtBeginDocument} is a wrapper around the \hook{begindocument}
+% hook (see section~\ref{sec:begindocument-hooks}), which is a
+% one-time hook. As such, after the \hook{begindocument} hook is
+% executed at \verb=\begin{document}= any attempt to add \meta{code}
+% to this hook with \cs{AtBeginDocument} or with \cs{AddToHook} will
+% cause that \meta{code} to execute immediately instead.
+% See section~\ref{sec:onetime-hooks} for more on one-time hooks.
+%
+% For important packages with known order requirement we may over
+% time add rules to the kernel (or to those packages) so that they
+% work regardless of the loading-order in the document.
+% \end{function}
+%
+% \begin{function}{\AtEndDocument}
+% \begin{syntax}
+% \cs{AtEndDocument} \oarg{label} \Arg{code}
+% \end{syntax}
+% Like \cs{AtBeginDocument} but for the \hook{enddocument} hook.
+% \end{function}
+%
+%
+%
+% \begin{function}{\AtBeginDvi}
+% \begin{syntax}
+% \cs{AtBeginDvi} \oarg{label} \Arg{code}
+% \end{syntax}
+% This hook is discussed in conjunction with the shipout hooks.
+% \end{function}
+%
+% \bigskip
+%
+% The few hooks that existed previously in \LaTeXe{} used internally
+% commands such as \cs{@begindocumenthook} and packages sometimes
+% augemented them directly rather than working through
+% \cs{AtBeginDocument}. For that reason there is currently support
+% for this, that is, if the system detects that such an internal
+% legacy hook command contains code it adds it to the new hook
+% system under the label \texttt{legacy} so that it doesn't get
+% lost.
+%
+% However, over time the remaining cases of direct usage need
+% updating because in one of the future release of \LaTeX{} we will
+% turn this legacy support off, as it does unnecessary slow down
+% the processing.
+%
+%
+% \subsection{\LaTeXe{} commands and environments augmented by
+% hooks}
+%
+% \emph{intro to be written}
+%
+% \subsubsection{Generic hooks for all environments}
+%
+% Every environment \meta{env} has now four associated hooks coming
+% with it:
+% \begin{description}
+% \item[\hook{env/\meta{env}/before}]
+%
+% This hook is executed as part of \cs{begin} as the very first
+% action, in particular prior to starting the environment group.
+% Its scope is therefore not restricted by the environment.
+%
+% \item[\hook{env/\meta{env}/begin}]
+%
+% This hook is executed as part of \cs{begin} directly in front
+% of the code specific to the environment start (e.g., the
+% second argument of \cs{newenvironment}). Its scope is the
+% environment body.
+%
+% \item[\hook{env/\meta{env}/end}]
+%
+% This hook is executed as part of \cs{end} directly in front of the
+% code specific to the end of the environment (e.g., the third
+% argument of \cs{newenvironment}).
+%
+% \item[\hook{env/\meta{env}/after}]
+%
+% This hook is executed as part of \cs{end} after the
+% code specific to the environment end and after the environment
+% group has ended.
+% Its scope is therefore not restricted by the environment.
+%
+% The hook is implemented as a reversed hook so if two packages
+% add code to \hook{env/\meta{env}/before} and to
+% \hook{env/\meta{env}/after} they can add surrounding
+% environments and the order of closing them happens in the
+% right sequence.
+%
+% \end{description}
+% Generic environment hooks are never one-time hooks even with
+% environments that are supposed to appear only once in a
+% document.\footnote{Thus if one adds code to such hooks after the
+% environment has been processed, it will only be executed if the
+% environment appears again and if that doesn't happen the code
+% will never get executed.} In contrast to other hooks there is
+% also no need to declare them using \cs{NewHook}.
+%
+% The hooks are only executed if \cs{begin}\Arg{env} and
+% \cs{end}\Arg{env} is used. If the environment code is executed
+% via low-level calls to \cs{\meta{env}} and \cs{end\meta{env}}
+% (e.g., to avoid the environment grouping) they are not
+% available. If you want them available in code using this method,
+% you would need to add them yourself, i.e., write something like
+%\begin{verbatim}
+% \UseHook{env/quote/before}\quote
+% ...
+% \endquote\UseHook{env/quote/after}
+%\end{verbatim}
+% to add the outer hooks, etc.
+%
+%
+% \begin{function}{\BeforeBeginEnvironment}
+% \begin{syntax}
+% \cs{BeforeBeginEnvironment} \oarg{label} \Arg{code}
+% \end{syntax}
+% This declaration adds to the \hook{env/\meta{env}/before} hook
+% using the \meta{label}. If \meta{label} is not given, the
+% \meta{default label} is used (see section~\ref{sec:default-label}).
+% \end{function}
+%
+% \begin{function}{\AtBeginEnvironment}
+% \begin{syntax}
+% \cs{AtBeginEnvironment} \oarg{label} \Arg{code}
+% \end{syntax}
+% Like \cs{BeforeBeginEnvironment} but adds to the \hook{env/\meta{env}/begin} hook.
+% \end{function}
+%
+% \begin{function}{\AtEndEnvironment}
+% \begin{syntax}
+% \cs{AtEndEnvironment} \oarg{label} \Arg{code}
+% \end{syntax}
+% Like \cs{BeforeBeginEnvironment} but adds to the \hook{env/\meta{env}/end} hook.
+% \end{function}
+%
+% \begin{function}{\AfterEndEnvironment}
+% \begin{syntax}
+% \cs{AfterEndEnvironment} \oarg{label} \Arg{code}
+% \end{syntax}
+% Like \cs{BeforeBeginEnvironment} but adds to the \hook{env/\meta{env}/after} hook.
+% \end{function}
+%
+%
+%
+% \subsubsection{Hooks provided by \cs{begin}\texttt{\{document\}}}
+% \label{sec:begindocument-hooks}
+%
+% Until 2020 \cs{begin}\texttt{\{document\}} offered exactly one
+% hook that one could add to using
+% \cs{AtBeginDocument}. Experiences over the years have shown that
+% this single hook in one place was not enough and as part of
+% adding the general hook management system a number of additional
+% hooks have been added at this point. The places for these hooks have
+% been chosen to provide the same support as offered by external
+% packages, such as \pkg{etoolbox} and others that augmented
+% \cs{document} to gain better control.
+%
+% Supported are now the following hooks (all of them one-time hooks):
+% \begin{description}
+%
+%
+% \item[\hook{begindocument/before}]
+%
+% This hook is executed at the very start of \cs{document}, one can
+% think of it as a hook for code at the end of the preamble
+% section and this is how it is used by \pkg{etoolbox}'s
+% \cs{AtEndPreamble}.
+%
+% \onetimetext
+%
+% \item[\hook{begindocument}]
+%
+% This hook is added to when using \cs{AtBeginDocument} and it is
+% executed after the \texttt{.aux} file as be read in and most
+% initialization are done, so they can be altered and inspected by
+% the hook code. It is followed by a small number of further
+% initializations that shouldn't be altered and are therefore
+% coming later.
+%
+% The hook should not be used to add material for typesetting as
+% we are still in \LaTeX's initialization phase and not in the
+% document body. If such material needs to be added to the document
+% body use the next hook instead.
+%
+% \onetimetext
+%
+% \item[\hook{begindocument/end}]
+%
+% This hook is executed at the end of the \cs{document} code in
+% other words at the beginning of the document body. The only
+% command that follows it is \cs{ignorespaces}.
+%
+% \onetimetext
+%
+% \end{description}
+% The generic hooks executed by \cs{begin} also exist, i.e.,
+% \hook{env/document/before} and \hook{env/document/begin}, but
+% with this special environment it is better use the dedicated
+% one-time hooks above.
+%
+%
+%
+%
+% \subsubsection{Hooks provided by \cs{end}\texttt{\{document\}}}
+%
+% \LaTeXe{} always provided \cs{AtEndDocument} to add code to the
+% execution of \verb=\end{document}= just in front of the code that
+% is normally executed there. While this was a big improvement over
+% the situation in \LaTeX\,2.09 it was not flexible enough for a
+% number of use cases and so packages, such as \pkg{etoolbox},
+% \pkg{atveryend} and others patched \cs{enddocument} to add
+% additional points where code could be hooked into.
+%
+% Patching using packages is always problematical as leads to
+% conflicts (code availability, ordering of patches, incompatible
+% patches, etc.). For this reason a number of additional hooks
+% have been added to the \cs{enddocument} code to allow packages
+% to add code in various places in a controlled way without the
+% need for overwriting or patching the core code.
+%
+% Supported are now the following hooks (all of them one-time hooks):
+% \begin{description}
+%
+% \item[\hook{enddocument}]
+%
+% The hook associated with \cs{AtEndDocument}. It is immediately
+% called at the beginning of \cs{enddocument}.
+%
+% When this hook is executed there may be still unprocessed
+% material (e.g., floats on the deferlist) and the hook may add
+% further material to be typeset. After it, \cs{clearpage} is
+% called to ensure that all such material gets typeset. If there
+% is nothing waiting the \cs{clearpage} has no effect.
+%
+% \onetimetext
+%
+% \item[\hook{enddocument/afterlastpage}]
+%
+% As the name indicates this hook should not receive code that
+% generates material for further pages. It is the right place to
+% do some final housekeeping and possibly write out some
+% information to the \texttt{.aux} file (which is still open at
+% this point to receive data). It is also the correct place to
+% set up any testing code to be run when the \texttt{.aux} file
+% is re-read in the next step.
+%
+%
+% After this hook has been executed the \texttt{.aux} file is
+% closed for writing and then read back in to do some tests
+% (e.g., looking for missing references or duplicated labels, etc.).
+%
+% \onetimetext
+%
+% \item[\hook{enddocument/afteraux}]
+%
+% At this point, the \texttt{.aux} file has been reprocessed and so
+% this is a possible place for final checks and display of
+% information to the user. However, for the latter you might
+% prefer the next hook, so that your information is displayed after the
+% (possibly longish) list of files if that got requested via \cs{listfiles}.
+%
+% \onetimetext
+%
+% \item[\hook{enddocument/info}]
+%
+% This hook is meant to receive code that write final information
+% messages to the terminal. It follows immediately after the
+% previous hook (so both could have been combined, but then
+% packages adding further code would always need to also supply
+% an explicit rule to specify where it should go.
+%
+% This hook already contains some code added by the kernel (under
+% the labels \texttt{kernel/filelist} and
+% \texttt{kernel/warnings}), namely the list of files when
+% \cs{listfiles} has been used and the warnings for duplicate
+% labels, missing references, font substitutions etc.
+%
+% \onetimetext
+%
+% \item[\hook{enddocument/end}]
+%
+% Finally, this hook is executed just in front of the final call
+% to \cs{@{}@end}.
+%
+% \onetimetext % is it even possible to add code after this one?
+%
+% \end{description}
+%
+%
+% There is also the hook \hook{shipout/lastpage}. This hook is
+% executed as part of the last \cs{shipout} in the document to
+% allow package to add final \cs{special}'s to that page. Where
+% this hook is executed in relation to those from the above list
+% can vary from document to document. Furthermore to determine correctly
+% which of the \cs{shipout}s is the last one, \LaTeX{} needs to be run
+% several times, so initially it might get executed on the wrong
+% page. See section~\ref{sec:shipout} for where to find the details.
+%
+%
+% It is in also possible to use the generic \hook{env/document/end}
+% hook which is execuded by \cs{end}, i.e., just in front of the
+% first hook above. Note however that the other generic \cs{end}
+% environment hook, i.e., \hook{env/document/after} will never get
+% executed, because by that time \LaTeX{} has finished the document
+% processing.
+%
+%
+%
+%
+% \subsubsection{Hooks provided \cs{shipout} operations}
+% \label{sec:shipout}
+%
+% There are several hooks and mechanisms added to \LaTeX{}'s
+% process of generating pages. These are documented in
+% \texttt{ltshipout-doc.pdf} or with code in
+% \texttt{ltshipout-code.pdf}.
+%
+%
+% \subsubsection{Hooks provided by file loading operations}
+%
+% There are several hooks added to \LaTeX{}'s
+% process of loading file via its high-level interfaces such as
+% \cs{input}, \cs{include}, \cs{usepackage}, etc. These are documented in
+% \texttt{ltfilehook-doc.pdf} or with code in
+% \texttt{ltfilehook-code.pdf}.
+%
+%
+% \subsubsection{Hooks provided in NFSS commands}
+%
+% In languages that need to support for more than one script in
+% parallel (and thus several sets of fonts), e.g., Latin and
+% Japanese fonts, NFSS font commands, such as \cs{sffamily}, need
+% to switch both the Latin family to ``Sans Serif'' and in addition
+% alter a second set of fonts.
+%
+% To support this several NFSS have hooks in which such support can
+% be added.
+% \begin{description}
+%
+% \item[\hook{rmfamily}]
+%
+% After \cs{rmfamily} has done its initial checks and prepared a
+% any font series update this hook is executed and only
+% afterwards \cs{selectfont}.
+%
+% \item[\hook{sffamily}]
+%
+% Like the \hook{rmfamily} hook but for the \cs{sffamily} command.
+%
+% \item[\hook{ttfamily}]
+%
+% Like the \hook{rmfamily} hook but for the \cs{ttfamily} command.
+%
+% \item[\hook{normalfont}]
+%
+% The \cs{normalfont} command resets font encoding family series
+% and shape to their document defaults. It then executes this
+% hook and finally calls \cs{selectfont}.
+%
+% \item[\hook{expand@font@defaults}]
+%
+% The internal \cs{expand@font@defaults} command expands and
+% saves the current defaults for the meta families (rm/sf/tt) and
+% the meta series (bf/md). If the NFSS machinery has been
+% augmented, e.g., for Chinese or Japanese fonts, then further
+% defaults may need to be set at this point. This can be done in
+% this hook which is executed at the end of this macro.
+%
+% \item[\hook{bfseries/defaults}, \hook{bfseries}]
+%
+% If the \cs{bfdefault} was explicitly changed by the user its
+% new value is used to set the bf series defaults for the meta
+% families (rm/sf/tt) when \cs{bfseries} is called. In the
+% \hook{bfseries/defaults} hook further adjustments can be made
+% in this case. This hook is only executed if such a change is
+% detected. In contrast the \hook{bfseries} hook is always
+% executed just before \cs{selectfont} is called to change to the
+% new series.
+%
+%
+% \item[\hook{mdseries/defaults}, \hook{mdseries}]
+%
+% These two hooks are like the previous ones but used in
+% \cs{mdseries} command.
+%
+% \end{description}
+%
+%
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+%
+%
+% \subsection{Loading further extensions}
+%
+% \begin{macrocode}
+%<@@=hook>
+% \end{macrocode}
+%
+%
+% At the moment the whole module rolls back in one go, but if we
+% make any modifications in later releases this will then need
+% splitting.
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\NewHook}{The hook management}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+%
+% \subsection{Debugging}
+%
+% \begin{macro}{\g_@@_debug_bool}
+% Holds the current debugging state.
+% \begin{macrocode}
+\bool_new:N \g_@@_debug_bool
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hook_debug_on:,\hook_debug_off:}
+% \begin{macro}{\@@_debug:n}
+% \begin{macro}{\@@_debug_gset:}
+% Turns debugging on and off by redefining \cs{@@_debug:n}.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_debug:n \use_none:n
+\cs_new_protected:Npn \hook_debug_on:
+ {
+ \bool_gset_true:N \g_@@_debug_bool
+ \@@_debug_gset:
+ }
+\cs_new_protected:Npn \hook_debug_off:
+ {
+ \bool_gset_false:N \g_@@_debug_bool
+ \@@_debug_gset:
+ }
+\cs_new_protected:Npn \@@_debug_gset:
+ {
+ \cs_gset_protected:Npx \@@_debug:n ##1
+ { \bool_if:NT \g_@@_debug_bool {##1} }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsection{Borrowing from internals of other kernel modules}
+%
+%
+% \begin{macro}[EXP]{\@@_str_compare:nn}
+% Private copy of \cs{__str_if_eq:nn}
+% \begin{macrocode}
+\cs_new_eq:NN \@@_str_compare:nn \__str_if_eq:nn
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Declarations}
+%
+% \begin{macro}{\l_@@_tmpa_bool}
+% Scratch boolean used throughout the package.
+% \begin{macrocode}
+\bool_new:N \l_@@_tmpa_bool
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_@@_return_tl,\l_@@_tmpa_tl,\l_@@_tmpb_tl}
+% Scratch variables used throughout the package.
+% \begin{macrocode}
+\tl_new:N \l_@@_return_tl
+\tl_new:N \l_@@_tmpa_tl
+\tl_new:N \l_@@_tmpb_tl
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\g_@@_all_seq}
+% In a few places we need a list of all hook names ever defined so
+% we keep track if them in this sequence.
+% \begin{macrocode}
+\seq_new:N \g_@@_all_seq
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\g_@@_removal_list_prop}
+% A token list to hold delayed removals.
+% \begin{macrocode}
+\tl_new:N \g_@@_removal_list_tl
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_@@_cur_hook_tl}
+% Stores the name of the hook currently being sorted.
+% \begin{macrocode}
+\tl_new:N \l_@@_cur_hook_tl
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_@@_work_prop}
+% A property list holding a copy of the
+% \cs[no-index]{g_@@_\meta{hook}_code_prop} of the hook being sorted
+% to work on, so that changes don't act destructively on the hook data
+% structure.
+% \begin{macrocode}
+\prop_new:N \l_@@_work_prop
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\g_@@_execute_immediately_prop}
+% List of hooks that from no on should not longer receive code.
+% \begin{macrocode}
+\prop_new:N \g_@@_execute_immediately_prop
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\g_@@_used_prop}
+% All hooks that receive code (for use in debugging display).
+% \begin{macrocode}
+\prop_new:N \g_@@_used_prop
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\g_@@_hook_curr_name_tl,\g_@@_name_stack_seq}
+% Default label used for hook commands, and a stack to keep track of
+% packages within packages.
+% \begin{macrocode}
+\tl_new:N \g_@@_hook_curr_name_tl
+\seq_new:N \g_@@_name_stack_seq
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_tmp:w}
+% Temporary macro for generic usage.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_tmp:w ?
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tl_gremove_once:Nx,\tl_show:x,\tl_log:x}
+% Some variants of \pkg{expl3} functions. \fmi{should be moved to expl3}
+% \begin{macrocode}
+\cs_generate_variant:Nn \tl_gremove_once:Nn { Nx }
+\cs_generate_variant:Nn \tl_show:n { x }
+\cs_generate_variant:Nn \tl_log:n { x }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\s_@@_mark}
+% Scan mark used for delimited arguments.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_tl_set:Nn,\@@_tl_set:Nx,
+% \@@_tl_set:cn,\@@_tl_set:cx}
+% Private copies of a few \pkg{expl3} functions. \pkg{l3debug} will
+% only add debugging to the public names, not to these copies, so we
+% don't have to use \cs{debug_suspend:} and \cs{debug_resume:}
+% everywhere.
+%
+% Functions like \cs{@@_tl_set:Nn} have to be redefined, rather than
+% copied because in \pkg{expl3} they use
+% \cs[no-index]{__kernel_tl_(g)set:Nx}, which is also patched by
+% \pkg{l3debug}.
+% \changes{v1.0h}{2021/01/07}{Manually define some \pkg{l3tl} commands
+% to work around \pkg{expl3} changes}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_tl_set:Nn #1#2
+ { \cs_set_nopar:Npx #1 { \__kernel_exp_not:w {#2} } }
+\cs_new_protected:Npn \@@_tl_set:Nx #1#2
+ { \cs_set_nopar:Npx #1 {#2} }
+\cs_generate_variant:Nn \@@_tl_set:Nn { c }
+\cs_generate_variant:Nn \@@_tl_set:Nx { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_tl_gset:Nn,\@@_tl_gset:No,\@@_tl_gset:Nx,
+% \@@_tl_gset:cn,\@@_tl_gset:co,\@@_tl_gset:cx}
+% Same as above.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_tl_gset:Nn #1#2
+ { \cs_gset_nopar:Npx #1 { \__kernel_exp_not:w {#2} } }
+\cs_new_protected:Npn \@@_tl_gset:No #1#2
+ { \cs_gset_nopar:Npx #1 { \__kernel_exp_not:w \exp_after:wN {#2} } }
+\cs_new_protected:Npn \@@_tl_gset:Nx #1#2
+ { \cs_gset_nopar:Npx #1 {#2} }
+\cs_generate_variant:Nn \@@_tl_gset:Nn { c }
+\cs_generate_variant:Nn \@@_tl_gset:No { c }
+\cs_generate_variant:Nn \@@_tl_gset:Nx { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_tl_gput_right:Nn,\@@_tl_gput_right:No,\@@_tl_gput_right:cn}
+% Same as above.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_tl_gput_right:Nn #1#2
+ { \@@_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN { #1 #2 } } }
+\cs_generate_variant:Nn \@@_tl_gput_right:Nn { No, cn }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_tl_gput_left:Nn,\@@_tl_gput_left:No}
+% Same as above.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_tl_gput_left:Nn #1#2
+ {
+ \@@_tl_gset:Nx #1
+ { \__kernel_exp_not:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} }
+ }
+\cs_generate_variant:Nn \@@_tl_gput_left:Nn { No }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_tl_gset_eq:NN}
+% Same as above.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_tl_gset_eq:NN \tl_gset_eq:NN
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_tl_gclear:N,\@@_tl_gclear:c}
+% Same as above.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_tl_gclear:N #1
+ { \@@_tl_gset_eq:NN #1 \c_empty_tl }
+\cs_generate_variant:Nn \@@_tl_gclear:N { c }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Providing new hooks}
+%
+% \begin{macro}{\g_@@_..._code_prop,\@@~...,\@@_next~...}
+%
+% Hooks have a \meta{name} and for each hook we have to provide a number of
+% data structures. These are
+% \begin{description}
+% \item[\cs{g_@@_\meta{name}_code_prop}] A property list holding the code
+% for the hook in separate chunks. The keys are by default the
+% package names that add code to the hook, but it is possible
+% for packages to define other keys.
+%
+% \item[{\cs[no-index]{g_@@_\meta{name}_rule_\meta{label1}\string|\meta{label2}_tl}}]
+% A token list holding the relation between \meta{label1} and
+% \meta{label2} in the \meta{name}. The \meta{labels} are lexically
+% (reverse) sorted to ensure that two labels always point to the same
+% token list. For global rules, the \meta{name} is |??|.
+%
+% \item[\cs{@@~\meta{name}}] The code that is actually executed
+% when the hook is called in the document is stored in this token
+% list. It is constructed from the code chunks applying the
+% information.
+% This token list is named like that so that in case of an error
+% inside the hook, the reported token list in the error is shorter,
+% and to make it simpler to normalize hook names in
+% \cs{@@_make_name:n}.
+%
+% \item[\cs{g_@@_\meta{name}_reversed_tl}] Some hooks are
+% \enquote{reversed}. This token list stores a |-| for such hook
+% so that it can be identified. The |-| character is used because
+% $\meta{reversed}1$ is $+1$ for normal hooks and $-1$ for reversed
+% ones.
+%
+% \item[\cs{@@_toplevel~\meta{name}}] This token list stores the code
+% inserted in the hook from the user's document, in the |top-level|
+% label. This label is special, and doesn't participate in sorting.
+% Instead, all code is appended to it and executed after (or before,
+% if the hook is reversed) the normal
+% hook code, but before the |next| code chunk.
+%
+% \item[\cs{@@_next~\meta{name}}] Finally there is extra code
+% (normally empty) that is used on the next invocation of the hook
+% (and then deleted). This can be used to define some special
+% behavior for a single occasion from within the document. This token
+% list follows the same naming scheme than the main \cs{@@~\meta{name}}
+% token list. It is called \cs{@@_next~\meta{name}} rather than
+% \cs{@@~next_\meta{name}} because otherwise a hook whose name is
+% |next_|\meta{name} would clash with the next code-token list of the
+% hook called \meta{name}.
+%
+% \end{description}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\hook_new:n}
+% The \cs{hook_new:n} declaration declare a new hook and expects
+% the hook \meta{name} as its argument, e.g.,
+% \hook{begindocument}.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_new:n #1
+ { \@@_normalize_hook_args:Nn \@@_new:n {#1} }
+\cs_new_protected:Npn \@@_new:n #1
+ {
+% \end{macrocode}
+% We check for one of the internal data structures and if it
+% already exists we complain.
+% \begin{macrocode}
+ \hook_if_exist:nTF {#1}
+ { \msg_error:nnn { hooks } { exists } {#1} }
+% \end{macrocode}
+% Otherwise we add the hook name to the list of all hooks and
+% allocate the necessary data structures for the new hook.
+% \begin{macrocode}
+ {
+ \seq_gput_right:Nn \g_@@_all_seq {#1}
+% \end{macrocode}
+% This is only used by the actual code of the current hook, so
+% declare it normally:
+% \begin{macrocode}
+ \tl_new:c { @@~#1 }
+% \end{macrocode}
+% Now ensure that the base data structure for the hook exists:
+% \begin{macrocode}
+ \@@_declare:n {#1}
+% \end{macrocode}
+% The \cs{g_@@_\meta{hook}_labels_clist} holds the sorted list of
+% labels (once it got sorted). This is used only for debugging.
+% \begin{macrocode}
+ \clist_new:c {g_@@_#1_labels_clist}
+% \end{macrocode}
+% Some hooks should reverse the default order of code chunks. To
+% signal this we have a token list which is empty for normal hooks
+% and contains a \verb=-= for reversed hooks.
+% \begin{macrocode}
+ \tl_new:c { g_@@_#1_reversed_tl }
+% \end{macrocode}
+% The above is all in L3 convention, but we also provide an
+% interface to legacy \LaTeXe{} hooks of the form \cs{@...hook},
+% e.g., \cs{@begindocumenthook}.
+% there have been a few of them and they have been added to
+% using \cs{g@addto@macro}. If there exists such a macro matching
+% the name of the new hook, i.e.,
+% \verb+\@+\meta{hook-name}\texttt{hook} and it is not empty then
+% we add its contents as a code chunk under the label \texttt{legacy}.
+% \begin{quote}
+% \textbf{Warning: this support will vanish in future releases!}
+% \end{quote}
+%
+% \begin{macrocode}
+ \@@_include_legacy_code_chunk:n {#1}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_declare:n}
+% This function declares the basic data structures for a hook without
+% actually declaring the hook itself. This is needed to allow adding
+% to undeclared hooks. Here it is unnecessary to check whether all
+% variables exist, since all three are declared at the same time
+% (either all of them exist, or none).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_declare:n #1
+ {
+ \@@_if_exist:nF {#1}
+ {
+ \prop_new:c { g_@@_#1_code_prop }
+ \tl_new:c { @@_toplevel~#1 }
+ \tl_new:c { @@_next~#1 }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\hook_new_reversed:n,\@@_new_reversed:n}
+%
+% Declare a new hook. The default ordering of code chunks is
+% reversed, signaled by setting the token list to a minus sign.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_new_reversed:n #1
+ { \@@_normalize_hook_args:Nn \@@_new_reversed:n {#1} }
+\cs_new_protected:Npn \@@_new_reversed:n #1
+ {
+ \@@_new:n {#1}
+% \end{macrocode}
+% If the hook already exists the above will generate an error
+% message, so the next line should be executed (but it is --- too
+% bad).
+% \begin{macrocode}
+ \tl_gset:cn { g_@@_#1_reversed_tl } { - }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hook_new_pair:nn}
+% A shorthand for declaring a normal and a (matching) reversed hook in one go.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_new_pair:nn #1#2
+ { \hook_new:n {#1} \hook_new_reversed:n {#2} }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_include_legacy_code_chunk:n}
+% The \LaTeX{} legacy concept for hooks uses with hooks the
+% following naming scheme in the code: \cs{@...hook}.
+%
+% If this macro is not empty we add it under the label
+% \texttt{legacy} to the current hook and then empty it globally.
+% This way packages or classes directly manipulating commands such
+% as \cs{@begindocumenthook} still get their hook data added.
+% \begin{quote}
+% \textbf{Warning: this support will vanish in future releases!}
+% \end{quote}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_include_legacy_code_chunk:n #1
+ {
+% \end{macrocode}
+% If the macro doesn't exist (which is the usual case) then nothing
+% needs to be done.
+% \begin{macrocode}
+ \tl_if_exist:cT { @#1hook }
+% \end{macrocode}
+% Of course if the legacy hook exists but is empty, there is no need
+% to add anything under \texttt{legacy} the legacy label.
+% \begin{macrocode}
+ {
+ \tl_if_empty:cF { @#1hook }
+ {
+ \exp_args:Nnnv \@@_hook_gput_code_do:nnn {#1}
+ { legacy } { @#1hook }
+% \end{macrocode}
+% Once added to the hook, we need to clear it otherwise it might
+% get added again later if the hook data gets updated.
+% \begin{macrocode}
+ \@@_tl_gclear:c { @#1hook }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Parsing a label}
+%
+% \begin{macro}[EXP]{\@@_parse_label_default:n}
+% This macro checks if a label was given (not \cs{c_novalue_tl}), and
+% if so, tries to parse the label looking for a leading \verb|.| to
+% replace by \cs{@@_currname_or_default:}.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_label_default:n #1
+ {
+ \tl_if_novalue:nTF {#1}
+ { \@@_currname_or_default: }
+ { \tl_trim_spaces_apply:nN {#1} \@@_parse_dot_label:n }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_parse_dot_label:n}
+% \begin{macro}[EXP]{
+% \@@_parse_dot_label:w,
+% \@@_parse_dot_label_cleanup:w,
+% \@@_parse_dot_label_aux:w
+% }
+% Start by checking if the label is empty, which raises an error, and
+% uses the fallback value. If not,
+% split the label at a \verb|./|, if any, and check if no tokens are
+% before the \verb|./|, or if the only character is a \verb|.|.
+% If these requirements are fulfilled, the leading
+% \verb|.| is replaced with \cs{@@_currname_or_default:}. Otherwise
+% the label is returned unchanged.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_dot_label:n #1
+ {
+ \tl_if_empty:nTF {#1}
+ {
+ \msg_expandable_error:nn { hooks } { empty-label }
+ \@@_currname_or_default:
+ }
+ {
+ \str_if_eq:nnTF {#1} { . }
+ { \@@_currname_or_default: }
+ { \@@_parse_dot_label:w #1 ./ \s_@@_mark }
+ }
+ }
+\cs_new:Npn \@@_parse_dot_label:w #1 ./ #2 \s_@@_mark
+ {
+ \tl_if_empty:nTF {#1}
+ { \@@_parse_dot_label_aux:w #2 \s_@@_mark }
+ {
+ \tl_if_empty:nTF {#2}
+ { \@@_make_name:n {#1} }
+ { \@@_parse_dot_label_cleanup:w #1 ./ #2 \s_@@_mark }
+ }
+ }
+\cs_new:Npn \@@_parse_dot_label_cleanup:w #1 ./ \s_@@_mark {#1}
+\cs_new:Npn \@@_parse_dot_label_aux:w #1 ./ \s_@@_mark
+ { \@@_currname_or_default: / \@@_make_name:n {#1} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_currname_or_default:}
+% Uses \cs{g_@@_hook_curr_name_tl} if it is set, otherwise tries
+% \cs{@currname}. If neither is set, raises an error and uses the
+% fallback value \verb|label-missing|.
+% \begin{macrocode}
+\cs_new:Npn \@@_currname_or_default:
+ {
+ \tl_if_empty:NTF \g_@@_hook_curr_name_tl
+ {
+ \tl_if_empty:NTF \@currname
+ {
+ \msg_expandable_error:nnn { hooks } { should-not-happen }
+ { Empty~default~label. }
+ \@@_make_name:n { label-missing }
+ }
+ { \@currname }
+ }
+ { \g_@@_hook_curr_name_tl }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_make_name:n,\@@_make_name:w}
+% Provides a standard sanitisation of a hook's name.
+% It uses \cs{cs:w} to build a control sequence out of the hook name,
+% then uses \cs{cs_to_str:N} to get the string representation of that,
+% without the escape character. \cs{cs:w}-based expansion is used
+% instead of |e|-based because Unicode characters don't behave well
+% inside \cs{expanded}. The macro adds the \cs{@@~} prefix to the
+% hook name to reuse the hook's code token list to build the csname
+% and avoid leaving \enquote{public} control sequences defined
+% (as~\cs{relax}) in TeX's memory.
+% \begin{macrocode}
+\cs_new:Npn \@@_make_name:n #1
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN \@@_make_name:w
+ \exp_after:wN \token_to_str:N \cs:w @@~ #1 \cs_end:
+ }
+\exp_last_unbraced:NNNNo
+\cs_new:Npn \@@_make_name:w #1 \tl_to_str:n { @@~ } { }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_normalize_hook_args:Nn}
+% \begin{macro}{\@@_normalize_hook_args:Nnn}
+% \begin{macro}{\@@_normalize_hook_rule_args:Nnnnn}
+% \begin{macro}{\@@_normalize_hook_args_aux:Nn}
+% Standard route for normalising hook and label arguments. The main
+% macro does the entire operation within a group so that csnames made
+% by \cs{@@_make_name:n} are wiped off before continuing. This means
+% that this function cannot be used for \cs{hook_use:n}!
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_normalize_hook_args_aux:Nn #1 #2
+ {
+ \group_begin:
+ \use:e
+ {
+ \group_end:
+ \exp_not:N #1 #2
+ }
+ }
+\cs_new_protected:Npn \@@_normalize_hook_args:Nn #1 #2
+ {
+ \@@_normalize_hook_args_aux:Nn #1
+ { { \@@_parse_label_default:n {#2} } }
+ }
+\cs_new_protected:Npn \@@_normalize_hook_args:Nnn #1 #2 #3
+ {
+ \@@_normalize_hook_args_aux:Nn #1
+ {
+ { \@@_parse_label_default:n {#2} }
+ { \@@_parse_label_default:n {#3} }
+ }
+ }
+\cs_new_protected:Npn \@@_normalize_hook_rule_args:Nnnnn #1 #2 #3 #4 #5
+ {
+ \@@_normalize_hook_args_aux:Nn #1
+ {
+ { \@@_parse_label_default:n {#2} }
+ { \@@_parse_label_default:n {#3} }
+ { \tl_trim_spaces:n {#4} }
+ { \@@_parse_label_default:n {#5} }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\hook_gput_code:nnn}
+% \begin{macro}{\@@_gput_code:nnn,\@@_gput_code:nxv,\@@_hook_gput_code_do:nnn}
+%
+% With \cs{hook_gput_code:nnn}\Arg{hook}\Arg{label}\Arg{code} a
+% chunk of \meta{code} is added to an existing \meta{hook} labeled
+% with \meta{label}.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_gput_code:nnn #1 #2
+ { \@@_normalize_hook_args:Nnn \@@_gput_code:nnn {#1} {#2} }
+\cs_new_protected:Npn \@@_gput_code:nnn #1 #2 #3
+ {
+% \end{macrocode}
+% First check if the hook was used as a one-time hook:
+% \begin{macrocode}
+ \prop_if_in:NnTF \g_@@_execute_immediately_prop {#1}
+ {#3}
+ {
+% \end{macrocode}
+% Then check if the current \meta{hook}/\meta{label} pair was marked
+% for removal, in which case \cs{@@_unmark_removal:nn} is used to
+% remove that mark (once). This may happen when a package removes
+% code from another package which was not yet loaded: the removal
+% order is stored, and at this stage it is executed by not adding to
+% the hook.
+% \begin{macrocode}
+ \@@_if_marked_removal:nnTF {#1} {#2}
+ { \@@_unmark_removal:nn {#1} {#2} }
+ {
+% \end{macrocode}
+% If no removal is queued, we are free to add. Start by checking if
+% the hook exists.
+% \begin{macrocode}
+ \hook_if_exist:nTF {#1}
+% \end{macrocode}
+% If so we simply add (or append) the new code to the property list
+% holding different chunks for the hook. At \verb=\begin{document}=
+% this is then sorted into a token list for fast execution.
+% \begin{macrocode}
+ {
+ \@@_hook_gput_code_do:nnn {#1} {#2} {#3}
+% \end{macrocode}
+% However, if there is an update within the document we need to alter
+% this execution code which is done by
+% \cs{@@_update_hook_code:n}. In the preamble this does nothing.
+% \begin{macrocode}
+ \@@_update_hook_code:n {#1}
+ }
+% \end{macrocode}
+%
+% If the hook does not exist, however, before giving up try to
+% declare it as a generic hook, if its name matches one of the valid
+% patterns.
+% \begin{macrocode}
+ { \@@_try_declaring_generic_hook:nnn {#1} {#2} {#3} }
+ }
+ }
+ }
+\cs_generate_variant:Nn \@@_gput_code:nnn { nxv }
+% \end{macrocode}
+%
+% This macro will unconditionally add a chunk of code to the given hook.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_hook_gput_code_do:nnn #1 #2 #3
+ {
+% \end{macrocode}
+% However, first some debugging info if debugging is enabled:
+% \begin{macrocode}
+ \@@_debug:n{\iow_term:x{****~ Add~ to~
+ \hook_if_exist:nF {#1} { undeclared~ }
+ hook~ #1~ (#2)
+ \on@line\space <-~ \tl_to_str:n{#3}} }
+% \end{macrocode}
+% Then try to get the code chunk labeled \verb=#2= from the hook.
+% If there's code already there, then append \verb=#3= to that,
+% otherwise just put \verb=#3=. If the current label is |top-level|,
+% the code is added to a dedicated token list
+% \cs[no-index]{@@_toplevel~\meta{hook}} that goes at the end of the
+% hook (or at the beginning, for a reversed hook), just before
+% \cs[no-index]{@@_next~\meta{hook}}.
+% \begin{macrocode}
+ \str_if_eq:nnTF {#2} { top-level }
+ {
+ \str_if_eq:eeTF { top-level } { \@@_currname_or_default: }
+ {
+% \end{macrocode}
+% If the hook's basic structure does not exist, we need to declare it
+% with \cs{@@_declare:n}.
+% \begin{macrocode}
+ \@@_declare:n {#1}
+ \@@_tl_gput_right:cn { @@_toplevel~#1 } {#3}
+ }
+ { \msg_error:nnn { hooks } { misused-top-level } {#1} }
+ }
+ {
+ \prop_get:cnNTF { g_@@_#1_code_prop } {#2} \l_@@_return_tl
+ {
+ \prop_gput:cno { g_@@_#1_code_prop } {#2}
+ { \l_@@_return_tl #3 }
+ }
+ { \prop_gput:cnn { g_@@_#1_code_prop } {#2} {#3} }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_gput_undeclared_hook:nnn}
+% Often it may happen that a package $A$ defines a hook \verb=foo=,
+% but package $B$, that adds code to that hook, is loaded before $A$.
+% In such case we need to add code to the hook before its declared.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_gput_undeclared_hook:nnn #1 #2 #3
+ {
+ \@@_declare:n {#1}
+ \@@_hook_gput_code_do:nnn {#1} {#2} {#3}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_try_declaring_generic_hook:nnn}
+% \begin{macro}{\@@_try_declaring_generic_next_hook:nn}
+% These entry-level macros just pass the arguments along to the
+% common \cs{@@_try_declaring_generic_hook:nNNnn} with the right
+% functions to execute when some action is to be taken.
+%
+% The wrapper \cs{@@_try_declaring_generic_hook:nnn} then defers
+% \cs{hook_gput_code:nnn} if the generic hook was declared, or to
+% \cs{@@_gput_undeclared_hook:nnn} otherwise (the hook was tested for
+% existence before, so at this point if it isn't generic, it doesn't
+% exist).
+%
+% The wrapper \cs{@@_try_declaring_generic_next_hook:nn} for
+% next-execution hooks does the same: it defers the code to
+% \cs{hook_gput_next_code:nn} if the generic hook was declared, or
+% to \cs{@@_gput_next_do:nn} otherwise.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_try_declaring_generic_hook:nnn #1
+ {
+ \@@_try_declaring_generic_hook:nNNnn {#1}
+ \hook_gput_code:nnn \@@_gput_undeclared_hook:nnn
+ }
+\cs_new_protected:Npn \@@_try_declaring_generic_next_hook:nn #1
+ {
+ \@@_try_declaring_generic_hook:nNNnn {#1}
+ \hook_gput_next_code:nn \@@_gput_next_do:nn
+ }
+% \end{macrocode}
+%
+% \begin{macro}{
+% \@@_try_declaring_generic_hook:nNNnn,
+% \@@_try_declaring_generic_hook_split:nNNnn
+% }
+% \begin{macro}[TF]{\@@_try_declaring_generic_hook:wn}
+% \cs{@@_try_declaring_generic_hook:nNNnn} now splits the hook name
+% at the first \texttt{/} (if any) and first checks if it is a
+% file-specific hook (they require some normalization) using
+% \cs{@@_if_file_hook:wTF}. If not then check it is one of a
+% predefined set for generic names. We also split off the second
+% component to see if we have to make a reversed hook. In either case
+% the function returns \meta{true} for a generic hook and \meta{false}
+% in other cases.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_try_declaring_generic_hook:nNNnn #1
+ {
+ \@@_if_file_hook:wTF #1 / / \s_@@_mark
+ {
+ \exp_args:Ne \@@_try_declaring_generic_hook_split:nNNnn
+ { \exp_args:Ne \@@_file_hook_normalize:n {#1} }
+ }
+ { \@@_try_declaring_generic_hook_split:nNNnn {#1} }
+ }
+\cs_new_protected:Npn \@@_try_declaring_generic_hook_split:nNNnn #1 #2 #3
+ {
+ \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: {#1}
+ { #2 }
+ { #3 } {#1}
+ }
+\prg_new_protected_conditional:Npnn \@@_try_declaring_generic_hook:wn
+ #1 / #2 / #3 / #4 \scan_stop: #5 { TF }
+ {
+ \tl_if_empty:nTF {#2}
+ { \prg_return_false: }
+ {
+ \prop_if_in:NnTF \c_@@_generics_prop {#1}
+ {
+ \hook_if_exist:nF {#5} { \hook_new:n {#5} }
+% \end{macrocode}
+% After having declared the hook we check the second component (for
+% file hooks) or the third component for environment hooks) and
+% if it is on the list of components for which we should have declared
+% a reversed hook we alter the hook data structure accordingly.
+% \begin{macrocode}
+ \prop_if_in:NnTF \c_@@_generics_reversed_ii_prop {#2}
+ { \tl_gset:cn { g_@@_#5_reversed_tl } { - } }
+ {
+ \prop_if_in:NnT \c_@@_generics_reversed_iii_prop {#3}
+ { \tl_gset:cn { g_@@_#5_reversed_tl } { - } }
+ }
+% \end{macrocode}
+% Now that we know that the hook is declared we can add the code to it.
+% \begin{macrocode}
+ \prg_return_true:
+ }
+ { \prg_return_false: }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[pTF]{\@@_if_file_hook:w}
+% \cs{@@_if_file_hook:wTF} checks if the argument is a valid
+% file-specific hook (not, for example, |file/before|, but
+% |file/before/foo.tex|). If it is a file-specific hook, then it
+% executes the \meta{true} branch, otherwise \meta{false}.
+%
+% A file-specific hook is \texttt{file/\meta{position}/\meta{name}}.
+% If any of these parts don't exist, it is a general file hook or not
+% a file hook at all, so the conditional evaluates to \meta{false}.
+% Otherwise, it checks that the first part is |file| and that the
+% \meta{position} is in the \cs{c_@@_generics_file_prop}.
+%
+% A property list is used here to avoid having to worry with catcodes,
+% because \pkg{expl3}'s file name parsing turns all characters into
+% catcode-12 tokens, which might differ from hand-input letters.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_file_hook:w
+ #1 / #2 / #3 \s_@@_mark { TF }
+ {
+ \str_if_eq:nnTF {#1} { file }
+ {
+ \bool_lazy_or:nnTF
+ { \tl_if_empty_p:n {#3} }
+ { \str_if_eq_p:nn {#3} { / } }
+ { \prg_return_false: }
+ {
+ \prop_if_in:NnTF \c_@@_generics_file_prop {#2}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ }
+ { \prg_return_false: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_file_hook_normalize:n}
+% \begin{macro}[EXP]{\@@_strip_double_slash:n,\@@_strip_double_slash:w}
+% When a file-specific hook is found, before being declared it is
+% lightly normalized by \cs{@@_file_hook_normalize:n}. The current
+% implementation just replaces two consecutive slashes (|//|) by a
+% single one, to cope with simple cases where the user did something
+% like \verb|\def\input@path{{./mypath/}}|, in which case a hook would
+% have to be \verb|\AddToHook{file/after/./mypath//file.tex}|.
+% \begin{macrocode}
+\cs_new:Npn \@@_file_hook_normalize:n #1
+ { \@@_strip_double_slash:n {#1} }
+\cs_new:Npn \@@_strip_double_slash:n #1
+ { \@@_strip_double_slash:w #1 // \s_@@_mark }
+% \end{macrocode}
+% This function is always called after testing if the argument is a
+% file hook with \cs{@@_if_file_hook:wTF}, so we can assume it has
+% three parts (it is either \verb|file/before/...| or
+% \verb|file/after/...|), so we use \verb|#1/#2/#3 //| instead of just
+% \verb|#1 //| to prevent losing a slash if the file name is empty.
+% \changes{v1.0h}{2021/01/07}{Assume hook name has at least three
+% nonempty parts (gh/464)}
+% \begin{macrocode}
+\cs_new:Npn \@@_strip_double_slash:w #1/#2/#3 // #4 \s_@@_mark
+ {
+ \tl_if_empty:nTF {#4}
+ { #1/#2/#3 }
+ { \@@_strip_double_slash:w #1/#2/#3 / #4 \s_@@_mark }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\c_@@_generics_prop}
+% Property list holding the generic names. We don't provide any user
+% interface to this as this is meant to be static.
+% \begin{description}
+% \item[\texttt{env}]
+% The generic hooks used in \cs{begin} and \cs{end}.
+% \item[\texttt{file}]
+% The generic hooks used when loading a file
+% \end{description}
+% \begin{macrocode}
+\prop_const_from_keyval:Nn \c_@@_generics_prop
+ {env=,file=,package=,class=,include=}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c_@@_generics_reversed_ii_prop,
+% \c_@@_generics_reversed_iii_prop,
+% \c_@@_generics_file_prop}
+% Some of the generic hooks are supposed to use reverse ordering, these are
+% the following (only the second or third sub-component is checked):
+% \begin{macrocode}
+\prop_const_from_keyval:Nn \c_@@_generics_reversed_ii_prop {after=,end=}
+\prop_const_from_keyval:Nn \c_@@_generics_reversed_iii_prop {after=}
+\prop_const_from_keyval:Nn \c_@@_generics_file_prop {before=,after=}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hook_gremove_code:nn}
+% \begin{macro}{\@@_gremove_code:nn}
+%
+% With \cs{hook_gremove_code:nn}\Arg{hook}\Arg{label} any code
+% for \meta{hook} stored under \meta{label} is removed.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_gremove_code:nn #1 #2
+ { \@@_normalize_hook_args:Nnn \@@_gremove_code:nn {#1} {#2} }
+\cs_new_protected:Npn \@@_gremove_code:nn #1 #2
+ {
+% \end{macrocode}
+% First check that the hook code pool exists. \cs{hook_if_exist:nTF}
+% isn't used here because it should be possible to remove code from a
+% hook before its defined (see section~\ref{sec:querying}).
+% \begin{macrocode}
+ \@@_if_exist:nTF {#1}
+ {
+% \end{macrocode}
+% Then remove the chunk and run \cs{@@_update_hook_code:n} so
+% that the execution token list reflects the change if we are after
+% \verb=\begin{document}=.
+%
+% If all code is to be removed, clear the code pool
+% \cs[no-index]{g_@@_\meta{hook}_code_prop}, the top-level code
+% \cs[no-index]{@@_toplevel~\meta{hook}}, and the next-execution code
+% \cs[no-index]{@@_next~\meta{hook}}.
+% \begin{macrocode}
+ \str_if_eq:nnTF {#2} {*}
+ {
+ \prop_gclear:c { g_@@_#1_code_prop }
+ \@@_tl_gclear:c { @@_toplevel~#1 }
+ \@@_tl_gclear:c { @@_next~#1 }
+ }
+ {
+% \end{macrocode}
+% If the label is |top-level| then clear the token list, as all code
+% there is under the same label. Marked removal is not implemented
+% for |top-level| because it is hard to reliably know that no code
+% was added to \cs[no-index]{@@_toplevel~\meta{hook}} (granted that
+% an empty code could be interpreted as that, but then it differs in
+% behaviour from other labels, in which an empty chunk is still valid
+% for removal). Besides, it doesn't make much (if any) sense for
+% packages to remove |top-level| code. So here the chunk is just
+% cleared unconditionally.
+% \begin{macrocode}
+ \str_if_eq:nnTF {#2} { top-level }
+ { \@@_tl_gclear:c { @@_toplevel~#1 } }
+ {
+% \end{macrocode}
+% Otherwise check if the label being removed exists in the code pool.
+% If it does, just call \cs{@@_gremove_code_do:nn} to do the removal,
+% otherwise mark it to be removed.
+% \begin{macrocode}
+ \prop_get:cnNTF { g_@@_#1_code_prop } {#2} \l_@@_return_tl
+ { \@@_gremove_code_do:nn }
+ { \@@_mark_removal:nn }
+ {#1} {#2}
+ }
+ }
+% \end{macrocode}
+% Finally update the code, if the hook exists.
+% \begin{macrocode}
+ \hook_if_exist:nT {#1}
+ { \@@_update_hook_code:n {#1} }
+ }
+% \end{macrocode}
+%
+% If the code pool for this hook doesn't exist it means that nothing
+% tried to add to it before, so we just queue this removal order for
+% later.
+% \begin{macrocode}
+ { \@@_mark_removal:nn {#1} {#2} }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_gremove_code_do:nn}
+% Remove code for a given label.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_gremove_code_do:nn #1 #2
+ { \prop_gremove:cn { g_@@_#1_code_prop } {#2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_mark_removal:nn}
+% Marks \meta{label} (\verb=#2=) to be removed from \meta{hook}
+% (\verb=#1=). The number of removals should be fairly small, and
+% \cs{tl_gremove_once:Nx} is fairly efficient even for longer token
+% lists, so we use a single global token list, rather than one for
+% each hook.
+%
+% A hand-crafted token list is used here because property lists don't
+% hold repeated items, so multiple usages of \cs{@@_mark_removal:nn}
+% would be cancelled by a single \cs{@@_unmark_removal:nn}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_mark_removal:nn #1 #2
+ {
+ \tl_gput_right:Nx \g_@@_removal_list_tl
+ { \@@_removal_tl:nn {#1} {#2} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_unmark_removal:nn}
+% Unmarks \meta{label} (\verb=#2=) to be removed from \meta{hook}
+% (\verb=#1=). \cs{tl_gremove_once:Nx} is used rather than
+% \cs{tl_gremove_all:Nx} so that two additions are needed to cancel
+% two marked removals, rather than only one.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_unmark_removal:nn #1 #2
+ {
+ \tl_gremove_once:Nx \g_@@_removal_list_tl
+ { \@@_removal_tl:nn {#1} {#2} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[TF]{\@@_if_marked_removal:nn}
+% Checks if the \cs{g_@@_removal_list_tl} contains the current
+% \meta{label} (\verb=#2=) and \meta{hook} (\verb=#1=).
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \@@_if_marked_removal:nn #1 #2 { TF }
+ {
+ \exp_args:NNx \tl_if_in:NnTF \g_@@_removal_list_tl
+ { \@@_removal_tl:nn {#1} {#2} }
+ { \prg_return_true: } { \prg_return_false: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[rEXP]{\@@_removal_tl:nn}
+% Builds a token list with \verb=#1= and \verb=#2= which can only be
+% matched by \verb=#1= and \verb=#2=. The |&|$_4$ anchors a removal,
+% so that \verb=#1= can't be mistaken by \verb=#2= and vice versa, and
+% the two |$|$_3$ delimit the two arguments
+% \begin{macrocode}
+\cs_new:Npn \@@_removal_tl:nn #1 #2
+ { & \tl_to_str:n {#2} $ \tl_to_str:n {#1} $ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{
+% \g_@@_??_code_prop,
+% \@@~??,
+% \g_@@_??_reversed_tl,
+% }
+%
+% Initially these variables simply used an empty ``label'' name (not
+% two question marks). This was a bit unfortunate, because then
+% \texttt{l3doc} complains about \verb=__= in the middle of a
+% command name when trying to typeset the documentation. However
+% using a ``normal'' name such as \texttt{default} has the
+% disadvantage of that being not really distinguishable from a real
+% hook name. I now have settled for \texttt{??} which needs some
+% gymnastics to get it into the csname, but since this is used a
+% lot things should be fast, so this is not done with \texttt{c}
+% expansion in the code later on.
+%
+% \cs{@@~??} isn't used, but it has to be defined to trick
+% the code into thinking that \verb=??= is actually a hook.
+% \begin{macrocode}
+\prop_new:c {g_@@_??_code_prop}
+\prop_new:c {@@~??}
+% \end{macrocode}
+%
+% Default rules are always given in normal ordering (never in
+% reversed ordering). If such a rule is applied to a reversed
+% hook it behaves as if the rule is reversed (e.g.,
+% \texttt{after} becomes \texttt{before})
+% because those rules are applied first and then the order is reversed.
+% \begin{macrocode}
+\tl_new:c {g_@@_??_reversed_tl}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Setting rules for hooks code}
+%
+% \begin{macro}{\hook_gset_rule:nnnn}
+% \begin{macro}{\@@_gset_rule:nnnn}
+%
+% \fmi{needs docu correction given new implementation}
+%
+% With
+% \cs{hook_gset_rule:nnnn}\Arg{hook}\Arg{label1}\Arg{relation}\Arg{label2}
+% a relation is defined between the two code labels for the given
+% \meta{hook}. The special hook \texttt{??} stands for \emph{any}
+% hook describing a default rule.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_gset_rule:nnnn #1#2#3#4
+ {
+ \@@_normalize_hook_rule_args:Nnnnn \@@_gset_rule:nnnn
+ {#1} {#2} {#3} {#4}
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_gset_rule:nnnn #1#2#3#4
+ {
+% \end{macrocode}
+% First we ensure the basic data structure of the hook exists:
+% \begin{macrocode}
+ \@@_declare:n {#1}
+% \end{macrocode}
+% Then we clear any previous relationship between both labels.
+% \begin{macrocode}
+ \@@_rule_gclear:nnn {#1} {#2} {#4}
+% \end{macrocode}
+% Then we call the function to handle the given rule. Throw an error if the
+% rule is invalid.
+% \begin{macrocode}
+ \cs_if_exist_use:cTF { @@_rule_#3_gset:nnn }
+ {
+ {#1} {#2} {#4}
+ \@@_update_hook_code:n {#1}
+ }
+ { \msg_error:nnnnnn { hooks } { unknown-rule }
+ {#1} {#2} {#3} {#4} }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_rule_before_gset:nnn, \@@_rule_after_gset:nnn,
+% \@@_rule_<_gset:nnn, \@@_rule_>_gset:nnn}
+% Then we add the new rule. We need to normalize the rules here to
+% allow for faster processing later. Given a pair of labels
+% $l_A$ and $l_B$, the rule $l_A>l_B$ is the same as $l_B<l_A$
+% only presented differently. But by normalizing the
+% forms of the rule to a single representation, say, $l_B<l_A$, reduces
+% the time spent looking for the rules later considerably.
+%
+% Here we do that normalization by using \cs[no-index]{(pdf)strcmp} to
+% lexically sort labels $l_A$ and $l_B$ to a fixed order. This order
+% is then enforced every time these two labels are used together.
+%
+% Here we use \cs{@@_label_pair:nn}~\Arg{hook}~\Arg{l_A}~\Arg{l_B}
+% to build a string \texttt{$l_B$\string|$l_A$} with a fixed order, and
+% use \cs{@@_label_ordered:nnTF} to apply the correct rule to the pair
+% of labels, depending if it was sorted or not.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rule_before_gset:nnn #1#2#3
+ {
+ \@@_tl_gset:cx { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl }
+ { \@@_label_ordered:nnTF {#2} {#3} { < } { > } }
+ }
+\cs_new_eq:cN { @@_rule_<_gset:nnn } \@@_rule_before_gset:nnn
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rule_after_gset:nnn #1#2#3
+ {
+ \@@_tl_gset:cx { g_@@_#1_rule_ \@@_label_pair:nn {#3} {#2} _tl }
+ { \@@_label_ordered:nnTF {#3} {#2} { < } { > } }
+ }
+\cs_new_eq:cN { @@_rule_>_gset:nnn } \@@_rule_after_gset:nnn
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_rule_voids_gset:nnn}
+% This rule removes (clears, actually) the code from label |#3| if
+% label |#2| is in the hook |#1|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rule_voids_gset:nnn #1#2#3
+ {
+ \@@_tl_gset:cx { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl }
+ { \@@_label_ordered:nnTF {#2} {#3} { -> } { <- } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_rule_incompatible-error_gset:nnn,
+% \@@_rule_incompatible-warning_gset:nnn,
+% }
+% These relations make an error/warning if labels |#2| and |#3| appear
+% together in hook |#1|.
+% \begin{macrocode}
+\cs_new_protected:cpn { @@_rule_incompatible-error_gset:nnn } #1#2#3
+ { \@@_tl_gset:cn { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } { xE } }
+\cs_new_protected:cpn { @@_rule_incompatible-warning_gset:nnn } #1#2#3
+ { \@@_tl_gset:cn { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } { xW } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_rule_unrelated_gset:nnn, \@@_rule_gclear:nnn}
+% Undo a setting. \cs{@@_rule_unrelated_gset:nnn} doesn't need to do anything,
+% since we use \cs{@@_rule_gclear:nnn} before setting any rule.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rule_unrelated_gset:nnn #1#2#3 { }
+\cs_new_protected:Npn \@@_rule_gclear:nnn #1#2#3
+ { \cs_undefine:c { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_label_pair:nn}
+% Ensure that the lexically greater label comes first.
+% \begin{macrocode}
+\cs_new:Npn \@@_label_pair:nn #1#2
+ {
+ \if_case:w \@@_str_compare:nn {#1} {#2} \exp_stop_f:
+ #1 | #1 % 0
+ \or: #1 | #2 % +1
+ \else: #2 | #1 % -1
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[pTF]{\@@_label_ordered:nn}
+% Check that labels |#1| and |#2| are in the correct order (as
+% returned by \cs{@@_label_pair:nn}) and if so return true, else
+% return false.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_label_ordered:nn #1#2 { TF }
+ {
+ \if_int_compare:w \@@_str_compare:nn {#1} {#2} > 0 \exp_stop_f:
+ \prg_return_true:
+ \else
+ \prg_return_false:
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_if_label_case:nnnnn}
+% To avoid doing the string comparison twice in \cs{@@_initialize_single:NNn}
+% (once with \cs{str_if_eq:nn} and again with \cs{@@_label_ordered:nn}),
+% we use a three-way branching macro that will compare |#1| and |#2|
+% and expand to \cs{use_i:nnn} if they are equal, \cs{use_ii:nn} if
+% |#1| is lexically greater, and \cs{use_iii:nn} otherwise.
+% \begin{macrocode}
+\cs_new:Npn \@@_if_label_case:nnnnn #1#2
+ {
+ \cs:w use_
+ \if_case:w \@@_str_compare:nn {#1} {#2}
+ i \or: ii \else: iii \fi: :nnn
+ \cs_end:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_update_hook_code:n}
+% Before \verb=\begin{document}= this does nothing, in the body it
+% reinitializes the hook code using the altered data.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_update_hook_code:n \use_none:n
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_initialize_all:}
+% Initialize all known hooks (at \verb=\begin{document}=), i.e.,
+% update the fast execution token lists to hold the necessary code
+% in the right order.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_initialize_all: {
+% \end{macrocode}
+% First we change \cs{@@_update_hook_code:n} which so far was a
+% no-op to now initialize one hook. This way any later updates to
+% the hook will run that code and also update the execution token
+% list.
+% \begin{macrocode}
+ \cs_gset_eq:NN \@@_update_hook_code:n \@@_initialize_hook_code:n
+% \end{macrocode}
+% Now we loop over all hooks that have been defined and update each
+% of them.
+% \begin{macrocode}
+ \@@_debug:n { \prop_gclear:N \g_@@_used_prop }
+ \seq_map_inline:Nn \g_@@_all_seq
+ {
+ \@@_update_hook_code:n {##1}
+ }
+% \end{macrocode}
+% If we are debugging we show results hook by hook for all hooks
+% that have data.
+% \begin{macrocode}
+ \@@_debug:n
+ { \iow_term:x{^^JAll~ initialized~ (non-empty)~ hooks:}
+ \prop_map_inline:Nn \g_@@_used_prop
+ { \iow_term:x{^^J~ ##1~ ->~
+ \exp_not:v {@@~##1}~ }
+ }
+ }
+% \end{macrocode}
+% After all hooks are initialized we change the ``use'' to just
+% call the hook code and not initialize it (as it was done in the
+% preamble.
+% \begin{macrocode}
+ \cs_gset_eq:NN \hook_use:n \@@_use_initialized:n
+ \cs_gset_eq:NN \@@_preamble_hook:n \use_none:n
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_initialize_hook_code:n}
+% Initializing or reinitializing the fast execution hook code. In
+% the preamble this is selectively done in case a hook gets used
+% and at \verb=\begin{document}= this is done for all hooks and
+% afterwards only if the hook code changes.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_initialize_hook_code:n #1
+ {
+ \@@_debug:n{ \iow_term:x{^^JUpdate~ code~ for~ hook~
+ '#1' \on@line :^^J} }
+% \end{macrocode}
+% This does the sorting and the updates.
+% First thing we do is to check if a legacy hook macro exists and
+% if so we add it to the hook under the label \texttt{legacy}. This
+% might make the hook non-empty so we have to do this before
+% the then following test.
+% \begin{macrocode}
+ \@@_include_legacy_code_chunk:n {#1}
+% \end{macrocode}
+% If there aren't any code
+% chunks for the current hook, there is no point in even starting
+% the sorting routine so we make a quick test for that and in that
+% case just update \cs{@@~\meta{hook}} to hold the |top-level| and
+% |next| code chunks. If there are code chunks we call
+% \cs{@@_initialize_single:NNn} and pass to it ready made csnames
+% as they are needed several times inside. This way we save a bit
+% on processing time if we do that up front.
+% \begin{macrocode}
+ \hook_if_exist:nT {#1}
+ {
+ \prop_if_empty:cTF {g_@@_#1_code_prop}
+ {
+ \@@_tl_gset:co { @@~#1 }
+ {
+ \cs:w @@_toplevel~#1 \exp_after:wN \cs_end:
+ \cs:w @@_next~#1 \cs_end:
+ }
+ }
+ {
+% \end{macrocode}
+% By default the algorithm sorts the code chunks and then saves the
+% result in a token list for fast execution by adding the code one
+% after another using \cs{tl_gput_right:NV}. When we sort code for
+% a reversed hook, all we have to do is to add the code chunks in
+% the opposite order into the token list. So all we have to do
+% in preparation is to change two definitions used later on.
+% \begin{macrocode}
+ \@@_if_reversed:nTF {#1}
+ { \cs_set_eq:NN \@@_tl_gput:Nn \@@_tl_gput_left:Nn
+ \cs_set_eq:NN \@@_clist_gput:NV \clist_gput_left:NV }
+ { \cs_set_eq:NN \@@_tl_gput:Nn \@@_tl_gput_right:Nn
+ \cs_set_eq:NN \@@_clist_gput:NV \clist_gput_right:NV }
+% \end{macrocode}
+%
+% When sorting, some relations (namely \verb|voids|) need to
+% act destructively on the code property lists to remove code that
+% shouldn't appear in the sorted hook token list, so we temporarily
+% save the old code property list so that it can be restored later.
+% \begin{macrocode}
+ \prop_set_eq:Nc \l_@@_work_prop { g_@@_#1_code_prop }
+ \@@_initialize_single:ccn
+ { @@~#1 } { g_@@_#1_labels_clist } {#1}
+% \end{macrocode}
+% For debug display we want to keep track of those hooks that
+% actually got code added to them, so we record that in plist. We
+% use a plist to ensure that we record each hook name only once,
+% i.e., we are only interested in storing the keys and the value is
+% arbitrary.
+% \begin{macrocode}
+ \@@_debug:n{ \exp_args:NNx \prop_gput:Nnn
+ \g_@@_used_prop {#1}{} }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[EXP]{\@@_tl_csname:n,\@@_seq_csname:n}
+% It is faster to pass a single token and expand it when necessary
+% than to pass a bunch of character tokens around.
+% \fmi{note to myself: verify}
+% \begin{macrocode}
+\cs_new:Npn \@@_tl_csname:n #1 { l_@@_label_#1_tl }
+\cs_new:Npn \@@_seq_csname:n #1 { l_@@_label_#1_seq }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\l_@@_labels_seq,\l_@@_labels_int,\l_@@_front_tl,
+% \l_@@_rear_tl,\l_@@_label_0_tl}
+%
+% For the sorting I am basically implementing Knuth's algorithm for
+% topological sorting as given in TAOCP volume 1 pages 263--266.
+% For this algorithm we need a number of local variables:
+% \begin{itemize}
+% \item
+% List of labels used in the current hook to label code chunks:
+% \begin{macrocode}
+\seq_new:N \l_@@_labels_seq
+% \end{macrocode}
+% \item
+% Number of labels used in the current hook. In Knuth's algorithm
+% this is called $N$:
+% \begin{macrocode}
+\int_new:N \l_@@_labels_int
+% \end{macrocode}
+% \item
+% The sorted code list to be build is managed using two pointers
+% one to the front of the queue and one to the rear. We model this
+% using token list pointers. Knuth calls them $F$ and $R$:
+% \begin{macrocode}
+\tl_new:N \l_@@_front_tl
+\tl_new:N \l_@@_rear_tl
+% \end{macrocode}
+% \item
+% The data for the start of the queue is kept in this token list,
+% it corresponds to what Don calls \texttt{QLINK[0]} but since we
+% aren't manipulating individual words in memory it is slightly
+% differently done:
+% \begin{macrocode}
+\tl_new:c { \@@_tl_csname:n { 0 } }
+% \end{macrocode}
+%
+% \end{itemize}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_initialize_single:NNn,\@@_initialize_single:ccn}
+%
+% \cs{@@_initialize_single:NNn} implements the sorting of the code
+% chunks for a hook and saves the result in the token list for fast
+% execution (\verb=#4=). The arguments are \meta{hook-code-plist},
+% \meta{hook-code-tl}, \meta{hook-top-level-code-tl},
+% \meta{hook-next-code-tl},
+% \meta{hook-ordered-labels-clist} and \meta{hook-name} (the latter
+% is only used for debugging---the \meta{hook-rule-plist} is accessed
+% using the \meta{hook-name}).
+%
+% The additional complexity compared to Don's algorithm is that we
+% do not use simple positive integers but have arbitrary
+% alphanumeric labels. As usual Don's data structures are chosen in
+% a way that one can omit a lot of tests and I have mimicked that as
+% far as possible. The result is a restriction I do not test for at
+% the moment: a label can't be equal to the number 0! \fmi{Needs
+% checking for, just in case}
+%
+% ^^A #1 <- \@@~#1
+% ^^A #2 <- \g_@@_#1_labels_clist
+% ^^A #3 <- #1
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_initialize_single:NNn #1#2#3
+ {
+% \end{macrocode}
+% Step T1: Initialize the data structure \ldots
+% \begin{macrocode}
+ \seq_clear:N \l_@@_labels_seq
+ \int_zero:N \l_@@_labels_int
+% \end{macrocode}
+%
+% Store the name of the hook:
+% \begin{macrocode}
+ \tl_set:Nn \l_@@_cur_hook_tl {#3}
+% \end{macrocode}
+%
+% We loop over the property list holding the code and record all
+% labels listed there. Only rules for those labels are of interest
+% to us. While we are at it we count them (which gives us the $N$
+% in Knuth's algorithm. The prefix |label_| is added to the variables
+% to ensure that labels named |front|, |rear|, |labels|, or |return|
+% don't interact with our code.
+% \begin{macrocode}
+ \prop_map_inline:Nn \l_@@_work_prop
+ {
+ \int_incr:N \l_@@_labels_int
+ \seq_put_right:Nn \l_@@_labels_seq {##1}
+ \@@_tl_set:cn { \@@_tl_csname:n {##1} } { 0 }
+ \seq_clear_new:c { \@@_seq_csname:n {##1} }
+ }
+% \end{macrocode}
+% Steps T2 and T3: Sort the relevant rules into the data structure\ldots
+%
+% This loop constitutes a square matrix of the labels in
+% \cs{l_@@_work_prop} in the
+% vertical and the horizontal directions. However since the rule
+% $l_A\meta{rel}l_B$ is the same as $l_B\meta{rel}^{-1}l_A$ we can cut
+% the loop short at the diagonal of the matrix (\emph{i.e.}, when
+% both labels are equal), saving a good amount of time. The way the
+% rules were set up (see the implementation of \cs{@@_rule_before_gset:nnn}
+% above) ensures that we have no rule in the ignored side of the
+% matrix, and all rules are seen. The rules are applied in
+% \cs{@@_apply_label_pair:nnn}, which takes the properly-ordered pair
+% of labels as argument.
+% \begin{macrocode}
+ \prop_map_inline:Nn \l_@@_work_prop
+ {
+ \prop_map_inline:Nn \l_@@_work_prop
+ {
+ \@@_if_label_case:nnnnn {##1} {####1}
+ { \prop_map_break: }
+ { \@@_apply_label_pair:nnn {##1} {####1} }
+ { \@@_apply_label_pair:nnn {####1} {##1} }
+ {#3}
+ }
+ }
+% \end{macrocode}
+% Take a breath and take a look at the data structures that have
+% been set up:
+% \begin{macrocode}
+ \@@_debug:n { \@@_debug_label_data:N \l_@@_work_prop }
+% \end{macrocode}
+%
+%
+% Step T4:
+% \begin{macrocode}
+ \tl_set:Nn \l_@@_rear_tl { 0 }
+ \tl_set:cn { \@@_tl_csname:n { 0 } } { 0 }
+ \seq_map_inline:Nn \l_@@_labels_seq
+ {
+ \int_compare:nNnT { \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0
+ {
+ \tl_set:cn { \@@_tl_csname:n { \l_@@_rear_tl } }{##1}
+ \tl_set:Nn \l_@@_rear_tl {##1}
+ }
+ }
+ \tl_set_eq:Nc \l_@@_front_tl { \@@_tl_csname:n { 0 } }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@@_tl_gclear:N #1
+ \clist_gclear:N #2
+% \end{macrocode}
+%
+% The whole loop combines steps T5--T7:
+% \begin{macrocode}
+ \bool_while_do:nn { ! \str_if_eq_p:Vn \l_@@_front_tl { 0 } }
+ {
+% \end{macrocode}
+% This part is step T5:
+% \begin{macrocode}
+ \int_decr:N \l_@@_labels_int
+ \prop_get:NVN \l_@@_work_prop \l_@@_front_tl \l_@@_return_tl
+ \exp_args:NNV \@@_tl_gput:Nn #1 \l_@@_return_tl
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@@_clist_gput:NV #2 \l_@@_front_tl
+ \@@_debug:n{ \iow_term:x{Handled~ code~ for~ \l_@@_front_tl} }
+% \end{macrocode}
+%
+% This is step T6 except that we don't use a pointer $P$ to move
+% through the successors, but instead use \verb=##1= of the mapping
+% function.
+% \begin{macrocode}
+ \seq_map_inline:cn { \@@_seq_csname:n { \l_@@_front_tl } }
+ {
+ \tl_set:cx { \@@_tl_csname:n {##1} }
+ { \int_eval:n
+ { \cs:w \@@_tl_csname:n {##1} \cs_end: - 1 }
+ }
+ \int_compare:nNnT
+ { \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0
+ {
+ \tl_set:cn { \@@_tl_csname:n { \l_@@_rear_tl } } {##1}
+ \tl_set:Nn \l_@@_rear_tl {##1}
+ }
+ }
+% \end{macrocode}
+% and step T7:
+% \begin{macrocode}
+ \tl_set_eq:Nc \l_@@_front_tl
+ { \@@_tl_csname:n { \l_@@_front_tl } }
+% \end{macrocode}
+%
+% This is step T8: If we haven't moved the code for all labels
+% (i.e., if \cs{l_@@_labels_int} is still greater than zero) we
+% have a loop and our partial order can't be flattened out.
+% \begin{macrocode}
+ }
+ \int_compare:nNnF \l_@@_labels_int = 0
+ {
+ \iow_term:x{====================}
+ \iow_term:x{Error:~ label~ rules~ are~ incompatible:}
+% \end{macrocode}
+%
+% This is not really the information one needs in the error case
+% but will do for now \ldots \fmi{fix}
+% \begin{macrocode}
+ \@@_debug_label_data:N \l_@@_work_prop
+ \iow_term:x{====================}
+ }
+% \end{macrocode}
+% After we have added all hook code to \verb=#1= we finish it off
+% with adding extra code for the |top-level| (\verb=#2=) and for one
+% time execution (\verb=#3=). These should normally be empty. The
+% |top-level| code is added with \cs{@@_tl_gput:Nn} as that might
+% change for a reversed hook (then |top-level| is the very first code
+% chunk added). The |next| code is always added last.
+% \begin{macrocode}
+ \exp_args:NNo \@@_tl_gput:Nn #1 { \cs:w @@_toplevel~#3 \cs_end: }
+ \@@_tl_gput_right:No #1 { \cs:w @@_next~#3 \cs_end: }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_generate_variant:Nn \@@_initialize_single:NNn { cc }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_tl_gput:Nn,\@@_clist_gput:NV}
+% These append either on the right (normal hook) or on the left
+% (reversed hook). This is setup up in
+% \cs{@@_initialize_hook_code:n}, elsewhere their behavior is undefined.
+% \begin{macrocode}
+\cs_new:Npn \@@_tl_gput:Nn { \ERROR }
+\cs_new:Npn \@@_clist_gput:NV { \ERROR }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_apply_label_pair:nnn,\@@_label_if_exist_apply:nnnF}
+%
+% This is the payload of steps T2 and T3 executed in the loop described
+% above. This macro assumes |#1| and |#2| are ordered, which means that
+% any rule pertaining the pair |#1| and |#2| is
+% \cs{g_@@_\meta{hook}_rule_\#1\string|\#2_tl}, and not
+% \cs{g_@@_\meta{hook}_rule_\#2\string|\#1_tl}. This also saves a great deal
+% of time since we only need to check the order of the labels once.
+%
+% The arguments here are \meta{label1}, \meta{label2}, \meta{hook}, and
+% \meta{hook-code-plist}. We are about to apply the next rule and
+% enter it into the data structure. \cs{@@_apply_label_pair:nnn} will
+% just call \cs{@@_label_if_exist_apply:nnnF} for the \meta{hook}, and
+% if no rule is found, also try the \meta{hook} name \verb=??=
+% denoting a default hook rule.
+%
+% \cs{@@_label_if_exist_apply:nnnF} will check if the rule exists for
+% the given hook, and if so call \cs{@@_apply_rule:nnn}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_apply_label_pair:nnn #1#2#3
+ {
+% \end{macrocode}
+% Extra complication: as we use default rules and local hook specific
+% rules we first have to check if there is a local rule and if that
+% exist use it. Otherwise check if there is a default rule and use
+% that.
+% \begin{macrocode}
+ \@@_label_if_exist_apply:nnnF {#1} {#2} {#3}
+ {
+% \end{macrocode}
+% If there is no hook-specific rule we check for a default one and
+% use that if it exists.
+% \begin{macrocode}
+ \@@_label_if_exist_apply:nnnF {#1} {#2} { ?? } { }
+ }
+ }
+\cs_new_protected:Npn \@@_label_if_exist_apply:nnnF #1#2#3
+ {
+ \if_cs_exist:w g_@@_ #3 _rule_ #1 | #2 _tl \cs_end:
+% \end{macrocode}
+% What to do precisely depends on the type of rule we have
+% encountered. If it is a \texttt{before} rule it will be handled by the
+% algorithm but other types need to be managed differently. All
+% this is done in \cs{@@_apply_rule:nnnN}.
+% \begin{macrocode}
+ \@@_apply_rule:nnn {#1} {#2} {#3}
+ \exp_after:wN \use_none:n
+ \else:
+ \use:nn
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\@@_apply_rule:nnn}
+% This is the code executed in steps T2 and T3 while looping through
+% the matrix This is part of step T3. We are about to apply the next
+% rule and enter it into the data structure. The arguments are
+% \meta{label1}, \meta{label2}, \meta{hook-name}, and \meta{hook-code-plist}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_apply_rule:nnn #1#2#3
+ {
+ \cs:w @@_apply_
+ \cs:w g_@@_#3_reversed_tl \cs_end: rule_
+ \cs:w g_@@_ #3 _rule_ #1 | #2 _tl \cs_end: :nnn \cs_end:
+ {#1} {#2} {#3}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_apply_rule_<:nnn,\@@_apply_rule_>:nnn}
+% The most common cases are \texttt{\string<} and \texttt{\string>} so we handle
+% that first. They are relations $\prec$ and $\succ$ in TAOCP, and
+% they dictate sorting.
+% \begin{macrocode}
+\cs_new_protected:cpn { @@_apply_rule_<:nnn } #1#2#3
+ {
+ \@@_debug:n { \@@_msg_pair_found:nnn {#1} {#2} {#3} }
+ \tl_set:cx { \@@_tl_csname:n {#2} }
+ { \int_eval:n{ \cs:w \@@_tl_csname:n {#2} \cs_end: + 1 } }
+ \seq_put_right:cn{ \@@_seq_csname:n {#1} }{#2}
+ }
+\cs_new_protected:cpn { @@_apply_rule_>:nnn } #1#2#3
+ {
+ \@@_debug:n { \@@_msg_pair_found:nnn {#1} {#2} {#3} }
+ \tl_set:cx { \@@_tl_csname:n {#1} }
+ { \int_eval:n{ \cs:w \@@_tl_csname:n {#1} \cs_end: + 1 } }
+ \seq_put_right:cn{ \@@_seq_csname:n {#2} }{#1}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_apply_rule_xE:nnn,\@@_apply_rule_xW:nnn}
+% These relations make two labels incompatible within a hook.
+% |xE| makes raises an error if the labels are found in the same
+% hook, and |xW| makes it a warning.
+% \begin{macrocode}
+\cs_new_protected:cpn { @@_apply_rule_xE:nnn } #1#2#3
+ {
+ \@@_debug:n { \@@_msg_pair_found:nnn {#1} {#2} {#3} }
+ \msg_error:nnnnnn { hooks } { labels-incompatible }
+ {#1} {#2} {#3} { 1 }
+ \use:c { @@_apply_rule_->:nnn } {#1} {#2} {#3}
+ \use:c { @@_apply_rule_<-:nnn } {#1} {#2} {#3}
+ }
+\cs_new_protected:cpn { @@_apply_rule_xW:nnn } #1#2#3
+ {
+ \@@_debug:n { \@@_msg_pair_found:nnn {#1} {#2} {#3} }
+ \msg_warning:nnnnnn { hooks } { labels-incompatible }
+ {#1} {#2} {#3} { 0 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_apply_rule_->:nnn,\@@_apply_rule_<-:nnn}
+% If we see \texttt{\detokenize{->}} we have to drop code for label
+% \verb=#3= and carry on. We could do a little better and drop
+% everything for that label since it doesn't matter where we sort
+% in the empty code. However that would complicate the algorithm a
+% lot with little gain.\footnote{This also hase the advantage that
+% the result of the sorting doesn't change which might otherwise
+% (for unrelated chunks) if we aren't careful.} So we still
+% unnecessarily try to sort it in and depending on the rules that
+% might result in a loop that is otherwise resolved. If that turns
+% out to be a real issue, we can improve the code.
+%
+% Here the code is removed from \cs{l_@@_cur_hook_tl} rather than
+% \verb=#3= because the latter may be \verb=??=, and the default
+% hook doesn't store any code. Removing from \cs{l_@@_cur_hook_tl}
+% makes default rules \verb=->= and \verb=<-= work properly.
+% \begin{macrocode}
+\cs_new_protected:cpn { @@_apply_rule_->:nnn } #1#2#3
+ {
+ \@@_debug:n
+ {
+ \@@_msg_pair_found:nnn {#1} {#2} {#3}
+ \iow_term:x{--->~ Drop~ '#2'~ code~ from~
+ \iow_char:N \\ g_@@_ \l_@@_cur_hook_tl _code_prop ~
+ because~ of~ '#1' }
+ }
+ \prop_put:Nnn \l_@@_work_prop {#2} { }
+ }
+\cs_new_protected:cpn { @@_apply_rule_<-:nnn } #1#2#3
+ {
+ \@@_debug:n
+ {
+ \@@_msg_pair_found:nnn {#1} {#2} {#3}
+ \iow_term:x{--->~ Drop~ '#1'~ code~ from~
+ \iow_char:N \\ g_@@_ \l_@@_cur_hook_tl _code_prop ~
+ because~ of~ '#2' }
+ }
+ \prop_put:Nnn \l_@@_work_prop {#1} { }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_apply_-rule_<:nnn,
+% \@@_apply_-rule_>:nnn,
+% \@@_apply_-rule_<-:nnn,
+% \@@_apply_-rule_->:nnn,
+% \@@_apply_-rule_x:nnn,
+% }
+% Reversed rules.
+% \begin{macrocode}
+\cs_new_eq:cc { @@_apply_-rule_<:nnn } { @@_apply_rule_>:nnn }
+\cs_new_eq:cc { @@_apply_-rule_>:nnn } { @@_apply_rule_<:nnn }
+\cs_new_eq:cc { @@_apply_-rule_<-:nnn } { @@_apply_rule_<-:nnn }
+\cs_new_eq:cc { @@_apply_-rule_->:nnn } { @@_apply_rule_->:nnn }
+\cs_new_eq:cc { @@_apply_-rule_xE:nnn } { @@_apply_rule_xE:nnn }
+\cs_new_eq:cc { @@_apply_-rule_xW:nnn } { @@_apply_rule_xW:nnn }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_msg_pair_found:nnn}
+% A macro to avoid moving this many tokens around.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_msg_pair_found:nnn #1#2#3
+ {
+ \iow_term:x{~ \str_if_eq:nnTF {#3} {??} {default} {~normal} ~
+ rule~ \@@_label_pair:nn {#1} {#2}:~
+ \use:c { g_@@_#3_rule_ \@@_label_pair:nn {#1} {#2} _tl } ~
+ found}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_debug_label_data:N}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_debug_label_data:N #1 {
+ \iow_term:x{Code~ labels~ for~ sorting:}
+ \iow_term:x{~ \seq_use:Nnnn\l_@@_labels_seq {~and~}{,~}{~and~} }
+ \iow_term:x{^^J Data~ structure~ for~ label~ rules:}
+ \prop_map_inline:Nn #1
+ {
+ \iow_term:x{~ ##1~ =~ \tl_use:c{ \@@_tl_csname:n {##1} }~ ->~
+ \seq_use:cnnn{ \@@_seq_csname:n {##1} }{~->~}{~->~}{~->~}
+ }
+ }
+ \iow_term:x{}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\hook_show:n,\hook_log:n}
+% \begin{macro}{\@@_log_line:x,\@@_log_line_indent:x}
+% \begin{macro}{\@@_log:nN}
+% This writes out information about the hook given in its argument
+% onto the \texttt{.log} file and the terminal, if \cs{show_hook:n} is
+% used. Internally both share the same structure, except that at the
+% end, \cs{hook_show:n} triggers \TeX's prompt.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_log:n #1
+ {
+ \cs_set_eq:NN \@@_log_cmd:x \iow_log:x
+ \@@_normalize_hook_args:Nn \@@_log:nN {#1} \tl_log:x
+ }
+\cs_new_protected:Npn \hook_show:n #1
+ {
+ \cs_set_eq:NN \@@_log_cmd:x \iow_term:x
+ \@@_normalize_hook_args:Nn \@@_log:nN {#1} \tl_show:x
+ }
+\cs_new_protected:Npn \@@_log_line:x #1
+ { \@@_log_cmd:x { >~#1 } }
+\cs_new_protected:Npn \@@_log_line_indent:x #1
+ { \@@_log_cmd:x { >~\@spaces #1 } }
+\cs_new_protected:Npn \@@_log:nN #1 #2
+ {
+ \@@_preamble_hook:n {#1}
+ \@@_log_cmd:x { ^^J ->~The~hook~'#1': }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \hook_if_exist:nF {#1}
+ { \@@_log_line:x { is~not~declared! } }
+ \hook_if_empty:nTF {#1}
+ { #2 { The~hook~is~empty } }
+ {
+ \@@_log_line:x { Code~chunks: }
+ \prop_if_empty:cTF { g_@@_#1_code_prop }
+ { \@@_log_line_indent:x { --- } }
+ {
+ \prop_map_inline:cn { g_@@_#1_code_prop }
+ { \@@_log_line_indent:x { ##1~->~\tl_to_str:n {##2} } }
+ }
+% \end{macrocode}
+%
+% If there is code in the |top-level| token list, print it:
+% \begin{macrocode}
+ \@@_log_line:x
+ {
+ Document-level~(top-level)~code
+ \hook_if_exist:nT {#1}
+ { ~(executed~\@@_if_reversed:nTF {#1} {first} {last} ) } :
+ }
+ \@@_log_line_indent:x
+ {
+ \tl_if_empty:cTF { @@_toplevel~#1 }
+ { --- }
+ { -> ~ \exp_args:Nv \tl_to_str:n { @@_toplevel~#1 } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@@_log_line:x { Extra~code~for~next~invocation: }
+ \@@_log_line_indent:x
+ {
+ \tl_if_empty:cTF { @@_next~#1 }
+ { --- }
+% \end{macrocode}
+%
+% If the token list is not empty we want to display it but without
+% the first tokens (the code to clear itself) so we call a helper
+% command to get rid of them.
+% \begin{macrocode}
+ { ->~ \exp_args:Nv \@@_log_next_code:n { @@_next~#1 } }
+ }
+% \end{macrocode}
+%
+% Loop through the rules in a hook and for every rule found, print it.
+% If no rule is there, print |---|. The boolean \cs{l_@@_tmpa_bool}
+% here indicates if the hook has no rules.
+% \begin{macrocode}
+ \@@_log_line:x { Rules: }
+ \bool_set_true:N \l_@@_tmpa_bool
+ \@@_list_rules:nn {#1}
+ {
+ \bool_set_false:N \l_@@_tmpa_bool
+ \@@_log_line_indent:x
+ {
+ ##2~ with~
+ \str_if_eq:nnT {##3} {??} { default~ }
+ relation~ ##1
+ }
+ }
+ \bool_if:NT \l_@@_tmpa_bool
+ { \@@_log_line_indent:x { --- } }
+% \end{macrocode}
+%
+% When the hook is declared (that is, the sorting algorithm is applied
+% to that hook) and not empty
+% \begin{macrocode}
+ \bool_lazy_and:nnTF
+ { \hook_if_exist_p:n {#1} }
+ { ! \hook_if_empty_p:n {#1} }
+ {
+ \@@_log_line:x
+ {
+ Execution~order
+ \bool_if:NTF \l_@@_tmpa_bool
+ { \@@_if_reversed:nT {#1} { ~(after~reversal) } }
+ { ~(after~
+ \@@_if_reversed:nT {#1} { reversal~and~ }
+ applying~rules)
+ } :
+ }
+ #2 % \tl_show:n
+ {
+ \@spaces
+ \clist_if_empty:cTF { g_@@_#1_labels_clist }
+ { --- }
+ { \clist_use:cn {g_@@_#1_labels_clist} { ,~ } }
+ }
+ }
+ {
+ #2
+ {
+ Hook~ \hook_if_exist:nTF {#1}
+ {code~pool~empty} {not~declared}
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_log_next_code:n}
+% To display the code for next invocation only (i.e., from
+% \cs{AddToHookNext} we have to remove the first two tokens at the
+% front which are \cs{tl_gclear:N} and the token list to clear.
+% \begin{macrocode}
+\cs_new:Npn \@@_log_next_code:n #1
+ { \exp_args:No \tl_to_str:n { \use_none:nn #1 } }
+% \end{macrocode}
+% \end{macro}
+%
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_list_rules:nn}
+% \begin{macro}{\@@_list_one_rule:nnn,\@@_list_if_rule_exists:nnnF}
+% This macro takes a \meta{hook} and an \meta{inline function} and
+% loops through each pair of \meta{labels} in the \meta{hook}, and if
+% there is a relation between this pair of \meta{labels}, the
+% \meta{inline function} is executed with |#1|${}={}$\meta{relation},
+% |#2|${}={}$\meta{label_1}\verb=|=\meta{label_2},
+% and |#3|${}={}$\meta{hook} (the latter may be the argument |#1| to
+% \cs{@@_list_rules:nn}, or |??| if it is a default rule).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_list_rules:nn #1 #2
+ {
+ \cs_set_protected:Npn \@@_tmp:w ##1 ##2 ##3 {#2}
+ \prop_map_inline:cn { g_@@_#1_code_prop }
+ {
+ \prop_map_inline:cn { g_@@_#1_code_prop }
+ {
+ \@@_if_label_case:nnnnn {##1} {####1}
+ { \prop_map_break: }
+ { \@@_list_one_rule:nnn {##1} {####1} }
+ { \@@_list_one_rule:nnn {####1} {##1} }
+ {#1}
+ }
+ }
+ }
+% \end{macrocode}
+%
+% These two are quite similar to \cs{@@_apply_label_pair:nnn} and
+% \cs{@@_label_if_exist_apply:nnnF}, respectively, but rather than
+% applying the rule, they pass it to the \meta{inline function}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_list_one_rule:nnn #1#2#3
+ {
+ \@@_list_if_rule_exists:nnnF {#1} {#2} {#3}
+ { \@@_list_if_rule_exists:nnnF {#1} {#2} { ?? } { } }
+ }
+\cs_new_protected:Npn \@@_list_if_rule_exists:nnnF #1#2#3
+ {
+ \if_cs_exist:w g_@@_ #3 _rule_ #1 | #2 _tl \cs_end:
+ \exp_args:Nv \@@_tmp:w
+ { g_@@_ #3 _rule_ #1 | #2 _tl } { #1 | #2 } {#3}
+ \exp_after:wN \use_none:nn
+ \fi:
+ \use:n
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_debug_print_rules:n}
+% A shorthand for debugging that prints similar to \cs{prop_show:N}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_debug_print_rules:n #1
+ {
+ \iow_term:n { The~hook~#1~contains~the~rules: }
+ \cs_set_protected:Npn \@@_tmp:w ##1
+ {
+ \@@_list_rules:nn {#1}
+ {
+ \iow_term:x
+ {
+ > ##1 {####2} ##1 => ##1 {####1}
+ \str_if_eq:nnT {####3} {??} { ~(default) }
+ }
+ }
+ }
+ \exp_args:No \@@_tmp:w { \use:nn { ~ } { ~ } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Specifying code for next invocation}
+%
+% \begin{macro}{\hook_gput_next_code:nn}
+% \begin{macro}{%
+% \@@_gput_next_code:nn,
+% \@@_gput_next_do:nn,
+% \@@_gput_next_do:Nnn,
+% \@@_clear_next:n
+% }
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_gput_next_code:nn #1
+ { \@@_normalize_hook_args:Nn \@@_gput_next_code:nn {#1} }
+\cs_new_protected:Npn \@@_gput_next_code:nn #1 #2
+ {
+ \@@_declare:n {#1}
+ \hook_if_exist:nTF {#1}
+ { \@@_gput_next_do:nn {#1} {#2} }
+ { \@@_try_declaring_generic_next_hook:nn {#1} {#2} }
+ }
+\cs_new_protected:Npn \@@_gput_next_do:nn #1
+ {
+ \exp_args:Nc \@@_gput_next_do:Nnn
+ { @@_next~#1 } {#1}
+ }
+% \end{macrocode}
+% First check if the ``next code'' token list is empty: if so we need
+% to add a \cs{tl_gclear:c} to clear it, so the code lasts for one
+% usage only. The token list is cleared early so that nested usages
+% don't get lost. \cs{tl_gclear:c} is used instead of
+% \cs{tl_gclear:N} in case the hook is used in an expansion-only
+% context, so the token list doesn't expand before \cs{tl_gclear:N}:
+% that would make an infinite loop. Also in case the main code token
+% list is empty, the hook code has to be updated to add the next
+% execution token list.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_gput_next_do:Nnn #1 #2
+ {
+ \tl_if_empty:cT { @@~#2 }
+ { \@@_update_hook_code:n {#2} }
+ \tl_if_empty:NT #1
+ { \@@_tl_gset:Nn #1 { \@@_clear_next:n {#2} } }
+ \@@_tl_gput_right:Nn #1
+ }
+\cs_new_protected:Npn \@@_clear_next:n #1
+ { \cs_gset_eq:cN { @@_next~#1 } \c_empty_tl }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Using the hook}
+%
+% \begin{macro}{\hook_use:n}
+% \begin{macro}[EXP]{\@@_use_initialized:n}
+% \begin{macro}{\@@_use_undefined:w,\@@_use_end:}
+% \begin{macro}{\@@_preamble_hook:n}
+% \cs{hook_use:n} as defined here is used in the preamble, where
+% hooks aren't initialized by default. \cs{@@_use_initialized:n} is
+% also defined, which is the non-\tn{protected} version for use within
+% the document. Their definition is identical, except for the
+% \cs{@@_preamble_hook:n} (which wouldn't hurt in the expandable
+% version, but it would be an unnecessary extra expansion).
+%
+% \cs{@@_use_initialized:n} holds the expandable definition while in
+% the preamble. \cs{@@_preamble_hook:n} initializes the hook in the
+% preamble, and is redefined to \cs{use_none:n} at |\begin{document}|.
+%
+% Both versions do the same internally: check if the hook exist as
+% given, and if so use it as quickly as possible. If it doesn't
+% exist, the a call to \cs{@@_use:wn} checks for file hooks.
+%
+% At |\begin{document}|, all hooks are initialized, and any change in
+% them causes an update, so \cs{hook_use:n} can be made expandable.
+% This one is better not protected so that it can expand into nothing
+% if containing no code. Also important in case of generic hooks that
+% we do not generate a \cs{relax} as a side effect of checking for a
+% csname. In contrast to the \TeX{} low-level
+% \verb=\csname ...\endcsname= construct \cs{tl_if_exist:c} is
+% careful to avoid this.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_use:n #1
+ {
+ \tl_if_exist:cTF { @@~#1 }
+ {
+ \@@_preamble_hook:n {#1}
+ \cs:w @@~#1 \cs_end:
+ }
+ { \@@_use:wn #1 / \s_@@_mark {#1} }
+ }
+\cs_new:Npn \@@_use_initialized:n #1
+ {
+ \if_cs_exist:w @@~#1 \cs_end:
+ \else:
+ \@@_use_undefined:w
+ \fi:
+ \cs:w @@~#1 \@@_use_end:
+ }
+\cs_new:Npn \@@_use_undefined:w #1 #2 @@~#3 \@@_use_end:
+ {
+ #1 % fi
+ \@@_use:wn #3 / \s_@@_mark {#3}
+ }
+\cs_new_protected:Npn \@@_preamble_hook:n #1
+ { \@@_initialize_hook_code:n {#1} }
+\cs_new_eq:NN \@@_use_end: \cs_end:
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_use:wn}
+% \begin{macro}{\@@_try_file_hook:n,\@@_if_exist_use:n}
+% \cs{@@_use:wn} does a quick check to test if the current hook is a
+% file hook: those need a special treatment. If it is not, the hook
+% does not exist. If it is, then \cs{@@_try_file_hook:n} is called,
+% and checks that the current hook is a file-specific hook using
+% \cs{@@_if_file_hook:wTF}. If it's not, then it's a generic |file/|
+% hook and is used if it exist.
+%
+% If it is a file-specific hook, it passes through the same
+% normalization as during declaration, and then it is used if defined.
+% \cs{@@_if_exist_use:n} checks if the hook exist, and calls
+% \cs{@@_preamble_hook:n} if so, then uses the hook.
+% \begin{macrocode}
+\cs_new:Npn \@@_use:wn #1 / #2 \s_@@_mark #3
+ {
+ \str_if_eq:nnTF {#1} { file }
+ { \@@_try_file_hook:n {#3} }
+ { } % Hook doesn't exist
+ }
+\cs_new_protected:Npn \@@_try_file_hook:n #1
+ {
+ \@@_if_file_hook:wTF #1 / / \s_@@_mark
+ {
+ \exp_args:Ne \@@_if_exist_use:n
+ { \exp_args:Ne \@@_file_hook_normalize:n {#1} }
+ }
+ { \@@_if_exist_use:n {#1} } % file/ generic hook (e.g. file/before)
+ }
+\cs_new_protected:Npn \@@_if_exist_use:n #1
+ {
+ \tl_if_exist:cT { @@~#1 }
+ {
+ \@@_preamble_hook:n {#1}
+ \cs:w @@~#1 \cs_end:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\hook_use_once:n}
+% For hooks that can and should be used only once we have a special
+% use command that remembers the hook name in
+% \cs{g_@@_execute_immediately_prop}. This has the effect that any
+% further code added to the hook is executed immediately rather
+% than stored in the hook.
+%
+% The code needs some gymnastics to prevent space trimming from the
+% hook name, since \cs{hook_use:n} and \cs{hook_use_once:n} are
+% documented to not trim spaces.
+%
+% \pho{Should this raise an error if the hook doesn't exist?}
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_use_once:n #1
+ {
+ \tl_if_exist:cT { @@~#1 }
+ {
+ \tl_set:Nn \l_@@_return_tl {#1}
+ \@@_normalize_hook_args:Nn \@@_use_once_store:n
+ { \l_@@_return_tl }
+ \hook_use:n {#1}
+ }
+ }
+\cs_new_protected:Npn \@@_use_once_store:n #1
+ { \prop_gput:Nnn \g_@@_execute_immediately_prop {#1} { } }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Querying a hook}
+%
+% Simpler data types, like token lists, have three possible states; they
+% can exist and be empty, exist and be non-empty, and they may not
+% exist, in which case emptiness doesn't apply (though
+% \cs{tl_if_empty:N} returns false in this case).
+%
+% Hooks are a bit more complicated: they have four possible states.
+% A hook may exist or not, and either way it may or may not be empty
+% (even a hook that doesn't exist may be non-empty).
+%
+% A hook is said to be empty when no code was added to it, either to
+% its permanent code pool, or to its ``next'' token list. The hook
+% doesn't need to be declared to have code added to its code pool
+% (it may happen that a package $A$ defines a hook \hook{foo}, but
+% it's loaded after package $B$, which adds some code to that hook.
+% In this case it is important that the code added by package $B$ is
+% remembered until package $A$ is loaded).
+%
+% A hook is said to exist when it was declared with \cs{hook_new:n} or
+% some variant thereof.
+%
+% \begin{macro}[pTF]{\hook_if_empty:n}
+% Test if a hook is empty (that is, no code was added to that hook).
+% A \meta{hook} being empty means that all three of its
+% \cs[no-index]{g_@@_\meta{hook}_code_prop}, its
+% \cs[no-index]{@@_toplevel~\meta{hook}} and its
+% \cs[no-index]{@@_next~\meta{hook}} are empty.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \hook_if_empty:n #1 { p , T , F , TF }
+ {
+ \@@_if_exist:nTF {#1}
+ {
+ \bool_lazy_and:nnTF
+ { \prop_if_empty_p:c { g_@@_#1_code_prop } }
+ {
+ \bool_lazy_and_p:nn
+ { \tl_if_empty_p:c { @@_toplevel~#1 } }
+ { \tl_if_empty_p:c { @@_next~#1 } }
+ }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ { \prg_return_true: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[pTF]{\hook_if_exist:n}
+% A canonical way to test if a hook exists. A hook exists if the
+% token list that stores the sorted code for that hook,
+% \cs[no-index]{@@~\meta{hook}}, exists. The property list
+% \cs[no-index]{g_@@_\meta{hook}_code_prop} cannot be used here
+% because often it is necessary to add code to a hook without knowing
+% if such hook was already declared, or even if it will ever be
+% (for example, in case the package that defines it isn't loaded).
+% \begin{macrocode}
+\prg_new_conditional:Npnn \hook_if_exist:n #1 { p , T , F , TF }
+ {
+ \tl_if_exist:cTF { @@~#1 }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[pTF]{\@@_if_exist:n}
+% An internal check if the hook has already been declared with
+% \cs{@@_declare:n}. This means that the hook was already used somehow
+% (a code chunk or rule was added to it), but it still wasn't declared
+% with \cs{hook_new:n}.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_exist:n #1 { p , T , F , TF }
+ {
+ \prop_if_exist:cTF { g_@@_#1_code_prop }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[pTF]{\@@_if_reversed:n}
+% An internal conditional that checks if a hook is reversed.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_reversed:n #1 { p , T , F , TF }
+ {
+ \if_int_compare:w \cs:w g_@@_#1_reversed_tl \cs_end: 1 < 0 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Messages}
+%
+% \begin{macrocode}
+\msg_new:nnnn { hooks } { labels-incompatible }
+ {
+ Labels~`#1'~and~`#2'~are~incompatible
+ \str_if_eq:nnF {#3} {??} { ~in~hook~`#3' } .~
+ \int_compare:nNnTF {#4} = { 1 }
+ { The~ code~ for~ both~ labels~ will~ be~ dropped. }
+ { You~ may~ see~ errors~ later. }
+ }
+ { LaTeX~found~two~incompatible~labels~in~the~same~hook.~
+ This~indicates~an~incompatibility~between~packages. }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnnn { hooks } { exists }
+ { Hook~`#1'~ has~ already~ been~ declared. }
+ { There~ already~ exists~ a~ hook~ declaration~ with~ this~
+ name.\\
+ Please~ use~ a~ different~ name~ for~ your~ hook.}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnn { hooks } { empty-label }
+ {
+ Empty~code~label~\msg_line_context:.~
+ Using~`\@@_currname_or_default:'~instead.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnn { hooks } { no-default-label }
+ {
+ Missing~(empty)~default~label~\msg_line_context:. \\
+ This~command~was~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnnn { hooks } { unknown-rule }
+ { Unknown~ relationship~ `#3'~
+ between~ labels~ `#2'~ and~ `#4'~
+ \str_if_eq:nnF {#1} {??} { ~in~hook~`#1' }. ~
+ Perhaps~ a~ missspelling?
+ }
+ {
+ The~ relation~ used~ not~ known~ to~ the~ system.~ Allowed~ values~ are~
+ `before'~ or~ `<',~
+ `after'~ or~ `>',~
+ `incompatible-warning',~
+ `incompatible-error',~
+ `voids'~ or~
+ `unrelated'.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnnn { hooks } { misused-top-level }
+ {
+ Illegal~\iow_char:N \\AddToHook{#1}[top-level]{...}.\\
+ 'top-level'~is~reserved~for~the~user's~document.
+ }
+ {
+ The~'top-level'~label~is~meant~for~user~code~only,~and~should~only~
+ be~used~(sparingly)~in~the~main~document.~Use~the~default~label~
+ '\@@_currname_or_default:'~for~this~\@cls@pkg,~or~another~
+ suitable~label.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnn { hooks } { set-top-level }
+ {
+ You~cannot~change~the~default~label~#1~`top-level'.~Illegal \\
+ \use:nn { ~ } { ~ } \iow_char:N \\#2{#3} \\
+ \msg_line_context:.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnn { hooks } { ddhl-deprecated }
+ {
+ \iow_char:N \\DeclareDefaultHookLabel~is~deprecated.\\
+ Use~\iow_char:N \\SetDefaultHookLabel~instead.\\ \\
+ The~deprecated~name~will~be~removed~in~the~next~release.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnn { hooks } { extra-pop-label }
+ {
+ Extra~\iow_char:N \\PopDefaultHookLabel. \\
+ This~command~will~be~ignored.
+ }
+\msg_new:nnn { hooks } { missing-pop-label }
+ {
+ Missing~\iow_char:N \\PopDefaultHookLabel. \\
+ The~label~`#1'~was~pushed~but~never~popped.~Something~is~wrong.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnn { hooks } { should-not-happen }
+ {
+ ERROR!~This~should~not~happen.~#1 \\
+ Please~report~at~https://github.com/latex3/latex2e.
+ }
+% \end{macrocode}
+%
+% \subsection{\LaTeXe{} package interface commands}
+%
+%
+%
+% \begin{macro}{\NewHook,\NewReversedHook,\NewMirroredHookPair}
+% Declaring new hooks \ldots
+% \begin{macrocode}
+\NewDocumentCommand \NewHook { m }{ \hook_new:n {#1} }
+\NewDocumentCommand \NewReversedHook { m }{ \hook_new_reversed:n {#1} }
+\NewDocumentCommand \NewMirroredHookPair { mm }{ \hook_new_pair:nn {#1}{#2} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AddToHook}
+%
+% \begin{macrocode}
+\NewDocumentCommand \AddToHook { m o +m }
+ { \hook_gput_code:nnn {#1} {#2} {#3} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AddToHookNext}
+%
+% \begin{macrocode}
+\NewDocumentCommand \AddToHookNext { m +m }
+ { \hook_gput_next_code:nn {#1} {#2} }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\RemoveFromHook}
+%
+% \begin{macrocode}
+\NewDocumentCommand \RemoveFromHook { m o }
+ { \hook_gremove_code:nn {#1} {#2} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SetDefaultHookLabel}
+% \begin{macro}{\PushDefaultHookLabel}
+% \begin{macro}{\PopDefaultHookLabel}
+% \begin{macro}{\DeclareDefaultHookLabel}
+% \begin{macro}{\@@_curr_name_push:n,\@@_curr_name_push_aux:n}
+% \begin{macro}{\@@_curr_name_pop:}
+% \begin{macro}{\@@_end_document_label_check:}
+% The token list \cs{g_@@_hook_curr_name_tl} stores the name of the
+% current package/file to be used as label for hooks.
+% Providing a consistent interface is tricky, because packages can
+% be loaded within packages, and some packages may not use
+% \cs{SetDefaultHookLabel} to change the default label (in which
+% case \cs{@currname} is used).
+%
+% To pull that one off, we keep a stack that contains the default
+% label for each level of input. The bottom of the stack contains the
+% default label for the |top-level| (this stack should never go
+% empty). If we're building the format, set the default label to be
+% |top-level|:
+% \begin{macrocode}
+\tl_gset:Nn \g_@@_hook_curr_name_tl { top-level }
+% \end{macrocode}
+%
+% Then, in case we're in \pkg{latexrelease} we push something on
+% the stack to support roll forward. But in some rare cases,
+% \pkg{latexrelease} may be loaded inside another package (notably
+% \pkg{platexrelease}), so we'll first push the |top-level| entry:
+% \begin{macrocode}
+%<latexrelease>\seq_gput_right:Nn \g_@@_name_stack_seq { top-level }
+% \end{macrocode}
+% then we dissect the \cs{@currnamestack}, adding \cs{@currname} to
+% the stack:
+% \changes{v1.0f}{2020/11/24}{Support for roll forward (gh/434)}
+% \begin{macrocode}
+%<latexrelease>\cs_set_protected:Npn \@@_tmp:w #1 #2 #3
+%<latexrelease> {
+%<latexrelease> \quark_if_recursion_tail_stop:n {#1}
+%<latexrelease> \seq_gput_right:Nn \g_@@_name_stack_seq {#1}
+%<latexrelease> \@@_tmp:w
+%<latexrelease> }
+%<latexrelease>\exp_after:wN \@@_tmp:w \@currnamestack
+%<latexrelease> \q_recursion_tail \q_recursion_tail
+%<latexrelease> \q_recursion_tail \q_recursion_stop
+% \end{macrocode}
+% and finalle set the default label to be the \cs{@currname}:
+% \begin{macrocode}
+%<latexrelease>\tl_gset:Nx \g_@@_hook_curr_name_tl { \@currname }
+% \end{macrocode}
+%
+% Two commands keep track of the stack: when a file is input,
+% \cs{@@_curr_name_push:n} pushes the current default label to the
+% stack, and sets the new default label in one go:
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_curr_name_push:n #1
+ { \exp_args:Nx \@@_curr_name_push_aux:n { \@@_make_name:n {#1} } }
+\cs_new_protected:Npn \@@_curr_name_push_aux:n #1
+ {
+ \tl_if_blank:nTF {#1}
+ { \msg_error:nn { hooks } { no-default-label } }
+ {
+ \str_if_eq:nnTF {#1} { top-level }
+ {
+ \msg_error:nnnnn { hooks } { set-top-level }
+ { to } { PushDefaultHookLabel } {#1}
+ }
+ {
+ \seq_gpush:NV \g_@@_name_stack_seq \g_@@_hook_curr_name_tl
+ \tl_gset:Nn \g_@@_hook_curr_name_tl {#1}
+ }
+ }
+ }
+% \end{macrocode}
+% and when an input is over, the topmost item of the stack is popped,
+% since the label will not be used again, and \cs{g_@@_hook_curr_name_tl}
+% is updated to the now topmost item of the stack:
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_curr_name_pop:
+ {
+ \seq_gpop:NNTF \g_@@_name_stack_seq \l_@@_return_tl
+ { \tl_gset_eq:NN \g_@@_hook_curr_name_tl \l_@@_return_tl }
+ { \msg_error:nn { hooks } { extra-pop-label } }
+ }
+% \end{macrocode}
+%
+% At the end of the document we want to check if there was no
+% \cs{@@_curr_name_push:} without a matching \cs{@@_curr_name_pop:}
+% (not a critical error, but it might indicate that something else is
+% not quite right):
+% \begin{macrocode}
+\tl_gput_right:Nn \@kernel@after@enddocument@afterlastpage
+ { \@@_end_document_label_check: }
+\cs_new_protected:Npn \@@_end_document_label_check:
+ {
+ \seq_gpop:NNT \g_@@_name_stack_seq \l_@@_return_tl
+ {
+ \msg_error:nnx { hooks } { missing-pop-label }
+ { \g_@@_hook_curr_name_tl }
+ \tl_gset_eq:NN \g_@@_hook_curr_name_tl \l_@@_return_tl
+ \@@_end_document_label_check:
+ }
+ }
+% \end{macrocode}
+%
+% The token list \cs{g_@@_hook_curr_name_tl} is but a mirror of the top
+% of the stack.
+%
+% Now define a wrapper that replaces the top of the stack with the
+% argument, and updates \cs{g_@@_hook_curr_name_tl} accordingly.
+% \begin{macrocode}
+\NewDocumentCommand \SetDefaultHookLabel { m }
+ {
+ \seq_if_empty:NTF \g_@@_name_stack_seq
+ {
+ \msg_error:nnnnn { hooks } { set-top-level }
+ { for } { SetDefaultHookLabel } {#1}
+ }
+ { \exp_args:Nx \@@_set_default_label:n { \@@_make_name:n {#1} } }
+ }
+\cs_new_protected:Npn \@@_set_default_label:n #1
+ {
+ \str_if_eq:nnTF {#1} { top-level }
+ {
+ \msg_error:nnnnn { hooks } { set-top-level }
+ { to } { SetDefaultHookLabel } {#1}
+ }
+ { \tl_gset:Nn \g_@@_hook_curr_name_tl {#1} }
+ }
+\NewDocumentCommand \DeclareDefaultHookLabel { m }
+ {
+ \msg_error:nn { hooks } { ddhl-deprecated }
+ \SetDefaultHookLabel {#1}
+ }
+% \end{macrocode}
+%
+% The label is only automatically updated with \cs{@onefilewithoptions}
+% (\cs{usepackage} and \cs{documentclass}), but some packages, like
+% Ti\emph{k}Z, define package-like interfaces, like
+% \cs{usetikzlibrary} that are wrappers around \cs{input}, so they
+% inherit the default label currently in force (usually |top-level|,
+% but it may change if loaded in another package). To provide a
+% package-like behaviour also for hooks in these files, we provide
+% high-level access to the default label stack.
+% \begin{macrocode}
+\NewDocumentCommand \PushDefaultHookLabel { m }
+ { \@@_curr_name_push:n {#1} }
+\NewDocumentCommand \PopDefaultHookLabel { }
+ { \@@_curr_name_pop: }
+% \end{macrocode}
+%
+% The current label stack holds the labels for all files but the
+% current one (more or less like \cs{@currnamestack}), and the current
+% label token list, \cs{g_@@_hook_curr_name_tl}, holds the label for
+% the current file. However \cs{@pushfilename} happens before
+% \cs{@currname} is set, so we need to look ahead to get the
+% \cs{@currname} for the label. \pkg{expl3} also requires the current
+% file in \cs{@pushfilename}, so here we abuse
+% \cs{@expl@push@filename@aux@@@@} to do \cs{@@_curr_name_push:n}.
+% \begin{macrocode}
+\cs_gset_protected:Npn \@expl@push@filename@aux@@@@ #1#2#3
+ {
+ \@@_curr_name_push:n {#3}
+ \str_gset:Nx \g_file_curr_name_str {#3}
+ #1 #2 {#3}
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\UseHook,\UseOneTimeHook}
+% Avoid the overhead of \pkg{xparse} and its protection that we
+% don't want here (since the hook should vanish without trace if empty)!
+% \begin{macrocode}
+\cs_new:Npn \UseHook { \hook_use:n }
+\cs_new:Npn \UseOneTimeHook { \hook_use_once:n }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\ShowHook,\LogHook}
+% \begin{macrocode}
+\cs_new_protected:Npn \ShowHook { \hook_show:n }
+\cs_new_protected:Npn \LogHook { \hook_log:n }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DebugHooksOn,\DebugHooksOff}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \DebugHooksOn { \hook_debug_on: }
+\cs_new_protected:Npn \DebugHooksOff { \hook_debug_off: }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\DeclareHookRule}
+%
+% \begin{macrocode}
+\NewDocumentCommand \DeclareHookRule { m m m m }
+ { \hook_gset_rule:nnnn {#1}{#2}{#3}{#4} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DeclareDefaultHookRule}
+% This declaration is only supported before \verb=\begin{document}=.
+% \begin{macrocode}
+\NewDocumentCommand \DeclareDefaultHookRule { m m m }
+ { \hook_gset_rule:nnnn {??}{#1}{#2}{#3} }
+\@onlypreamble\DeclareDefaultHookRule
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClearHookRule}
+% A special setup rule that removes an existing relation.
+% Basically {@@_rule_gclear:nnn} plus fixing the property list for debugging.
+% \fmi{Need an L3 interface, or maybe it should get dropped?}
+% \begin{macrocode}
+\NewDocumentCommand \ClearHookRule { m m m }
+{ \hook_gset_rule:nnnn {#1}{#2}{unrelated}{#3} }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[EXP]{\IfHookExistsTF,\IfHookEmptyTF}
+% Here we avoid the overhead of \pkg{xparse}, since \cs{IfHookEmptyTF}
+% is used in \cs{end} (that is, every \LaTeX{} environment). As a
+% further optimisation, use \cs{let} rather than \cs{def} to avoid one
+% expansion step.
+% \begin{macrocode}
+\cs_new_eq:NN \IfHookExistsTF \hook_if_exist:nTF
+\cs_new_eq:NN \IfHookEmptyTF \hook_if_empty:nTF
+% \end{macrocode}
+% \end{macro}
+%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
+%
+% \subsection{Internal commands needed elsewhere}
+%
+% Here we set up a few horrible (but consistent) \LaTeXe{} names to
+% allow for internal commands to be used outside this module. We
+% have to unset the \texttt{@\/@} since we want double ``at'' sign
+% in place of double underscores.
+%
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+% \begin{macro}{\@expl@@@initialize@all@@,
+% \@expl@@@hook@curr@name@pop@@}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@expl@@@initialize@all@@
+ \__hook_initialize_all:
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \@expl@@@hook@curr@name@pop@@
+ \__hook_curr_name_pop:
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+%
+% Rolling back here doesn't undefine the interface commands as they
+% may be used in packages without rollback functionality. So we
+% just make them do nothing which may or may not work depending on
+% the code usage.
+% \changes{v1.0d}{2020/10/04}{Definition \cs{AddToHookNext} was supposed
+% to be for \cs{AddToHook} vize versa (gh/401)}
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\NewHook}{The hook management}%
+%<latexrelease>
+%<latexrelease>\def\NewHook#1{}
+%<latexrelease>\def\NewReversedHook#1{}
+%<latexrelease>\def\NewMirroredHookPair#1#2{}
+%<latexrelease>
+%<latexrelease>\long\def\AddToHookNext#1#2{}
+%<latexrelease>
+%<latexrelease>\def\AddToHook#1{\@gobble@AddToHook@args}
+%<latexrelease>\providecommand\@gobble@AddToHook@args[2][]{}
+%<latexrelease>
+%<latexrelease>\def\RemoveFromHook#1{\@gobble@RemoveFromHook@arg}
+%<latexrelease>\providecommand\@gobble@RemoveFromHook@arg[1][]{}
+%<latexrelease>
+%<latexrelease>\def \UseHook #1{}
+%<latexrelease>\def \UseOneTimeHook #1{}
+%<latexrelease>\def \ShowHook #1{}
+%<latexrelease>\let \DebugHooksOn \@empty
+%<latexrelease>\let \DebugHooksOff\@empty
+%<latexrelease>
+%<latexrelease>\def \DeclareHookRule #1#2#3#4{}
+%<latexrelease>\def \DeclareDefaultHookRule #1#2#3{}
+%<latexrelease>\def \ClearHookRule #1#2#3{}
+% \end{macrocode}
+% If the hook management is not provided we make the test for existence
+% false and the test for empty true in the hope that this is most
+% of the time reasonable. If not a package would need to guard
+% against running in an old kernel.
+% \begin{macrocode}
+%<latexrelease>\long\def \IfHookExistsTF #1#2#3{#3}
+%<latexrelease>\long\def \IfHookEmptyTF #1#2#3{#2}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+%
+% \Finale
+%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/Master/texmf-dist/source/latex/base/ltlists.dtx b/Master/texmf-dist/source/latex/base/ltlists.dtx
index e8c9ebc16bd..653e4e2edd2 100644
--- a/Master/texmf-dist/source/latex/base/ltlists.dtx
+++ b/Master/texmf-dist/source/latex/base/ltlists.dtx
@@ -31,7 +31,7 @@
%<*driver>
% \fi
\ProvidesFile{ltlists.dtx}
- [2015/05/10 v1.0t LaTeX Kernel (List Environments)]
+ [2020/04/24 v1.0t LaTeX Kernel (List Environments)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltlists.dtx}
@@ -546,6 +546,7 @@
% \end{macrocode}
% \end{macro}\end{macro}\end{macro}
%
+% \begin{environment}{list}
% \begin{macro}{\list}
% \begin{macrocode}
\def\list#1#2{%
@@ -572,6 +573,7 @@
\ignorespaces}
% \end{macrocode}
% \end{macro}
+% \end{environment}
%
% \begin{macro}{\par@deathcycles}
% \begin{macrocode}
@@ -626,8 +628,9 @@
% \end{macrocode}
% \end{macro}
%
-% \changes{0.0}{1992/03/18}{RmS: added \cs{@nmbrlistfalse}}
+% \begin{environment}{trivlist}
% \begin{macro}{\trivlist}
+% \changes{0.0}{1992/03/18}{RmS: added \cs{@nmbrlistfalse}}
% \begin{macrocode}
\def\trivlist{%
\parsep\parskip
@@ -647,6 +650,7 @@
\def\makelabel##1{##1}}
% \end{macrocode}
% \end{macro}
+% \end{environment}
%
% \begin{macro}{\endlist}
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/base/ltluatex.dtx b/Master/texmf-dist/source/latex/base/ltluatex.dtx
index 1f9ab8d1332..8573b3e6ca6 100644
--- a/Master/texmf-dist/source/latex/base/ltluatex.dtx
+++ b/Master/texmf-dist/source/latex/base/ltluatex.dtx
@@ -23,12 +23,12 @@
%<tex> \ProvidesFile\undefined\begingroup\def\ProvidesFile
%<tex> #1#2[#3]{\endgroup\immediate\write-1{File: #1 #3}}
%<tex>\fi
-%<plain>\ProvidesFile{ltluatex.tex}
+%<plain>\ProvidesFile{ltluatex.tex}%
%<*driver>
\ProvidesFile{ltluatex.dtx}
%</driver>
%<*tex>
-[2020/02/02 v1.1l
+[2020/09/25 v1.1s
%</tex>
%<plain> LuaTeX support for plain TeX (core)
%<*tex>
@@ -406,6 +406,14 @@
\fi
% \end{macrocode}
%
+% \changes{v1.1n}{2020/06/10}{Define \cs{@gobble}/\cs{@firstofone} even for \LaTeX\ to allow early loading.}
+% Two simple \LaTeX\ macros from |ltdefns.dtx| have to be defined here
+% because ltdefns.dtx is not loaded yet when ltluatex.dtx is executed.
+% \begin{macrocode}
+\long\def\@gobble#1{}
+\long\def\@firstofone#1{#1}
+% \end{macrocode}
+%
% \subsection{Older \LaTeX{}/Plain \TeX\ setup}
%
% \begin{macrocode}
@@ -451,7 +459,7 @@
% \end{macrocode}
% luatex/xetex also allow more math fam.
% \begin{macrocode}
-\edef \et@xmaxfam {\ifx\Umathchar\@undefined\sixt@@n\else\@cclvi\fi}
+\edef \et@xmaxfam {\ifx\Umathcode\@undefined\sixt@@n\else\@cclvi\fi}
% \end{macrocode}
%
% \begin{macrocode}
@@ -521,12 +529,6 @@
\fi}%
% \end{macrocode}
%
-% Two simple \LaTeX\ macros used in |ltlatex.sty|.
-% \begin{macrocode}
-\long\def\@gobble#1{}
-\long\def\@firstofone#1{#1}
-% \end{macrocode}
-%
% Fix up allocations not to clash with |etex.src|.
%
% \begin{macrocode}
@@ -544,23 +546,23 @@
%</tex>
% \end{macrocode}
%
-%
% \subsection{Attributes}
%
% \begin{macro}{\newattribute}
% \changes{v1.0a}{2015/09/24}{Macro added}
+% \changes{v1.1q}{2020/08/02}{Move reset to $0$ inside conditional}
% As is generally the case for the Lua\TeX{} registers we start here
% from~$1$. Notably, some code assumes that |\attribute0| is never used so
% this is important in this case.
% \begin{macrocode}
\ifx\e@alloc@attribute@count\@undefined
\countdef\e@alloc@attribute@count=258
+ \e@alloc@attribute@count=\z@
\fi
\def\newattribute#1{%
\e@alloc\attribute\attributedef
\e@alloc@attribute@count\m@ne\e@alloc@top#1%
}
-\e@alloc@attribute@count=\z@
% \end{macrocode}
% \end{macro}
%
@@ -585,13 +587,13 @@
% \begin{macrocode}
\ifx\e@alloc@ccodetable@count\@undefined
\countdef\e@alloc@ccodetable@count=259
+ \e@alloc@ccodetable@count=\z@
\fi
\def\newcatcodetable#1{%
\e@alloc\catcodetable\chardef
\e@alloc@ccodetable@count\m@ne{"8000}#1%
\initcatcodetable\allocationnumber
}
-\e@alloc@ccodetable@count=\z@
% \end{macrocode}
% \end{macro}
%
@@ -698,18 +700,19 @@
%
% \begin{macro}{\newluafunction}
% \changes{v1.0a}{2015/09/24}{Macro added}
+% \changes{v1.1q}{2020/08/02}{Move reset to $0$ inside conditional}
% Much the same story for allocating Lua\TeX{} functions except here they are
% just numbers so they are allocated in the same way as boxes.
% Lua indexes from~$1$ so once again slot~$0$ is skipped.
% \begin{macrocode}
\ifx\e@alloc@luafunction@count\@undefined
\countdef\e@alloc@luafunction@count=260
+ \e@alloc@luafunction@count=\z@
\fi
\def\newluafunction{%
\e@alloc\luafunction\e@alloc@chardef
\e@alloc@luafunction@count\m@ne\e@alloc@top
}
-\e@alloc@luafunction@count=\z@
% \end{macrocode}
% \end{macro}
%
@@ -717,17 +720,18 @@
%
% \begin{macro}{\newwhatsit}
% \changes{v1.0a}{2015/09/24}{Macro added}
+% \changes{v1.1q}{2020/08/02}{Move reset to $0$ inside conditional}
% These are only settable from Lua but for consistency are definable
% here.
% \begin{macrocode}
\ifx\e@alloc@whatsit@count\@undefined
\countdef\e@alloc@whatsit@count=261
+ \e@alloc@whatsit@count=\z@
\fi
\def\newwhatsit#1{%
\e@alloc\whatsit\e@alloc@chardef
\e@alloc@whatsit@count\m@ne\e@alloc@top#1%
}
-\e@alloc@whatsit@count=\z@
% \end{macrocode}
% \end{macro}
%
@@ -735,17 +739,18 @@
%
% \begin{macro}{\newluabytecode}
% \changes{v1.0a}{2015/09/24}{Macro added}
+% \changes{v1.1q}{2020/08/02}{Move reset to $0$ inside conditional}
% These are only settable from Lua but for consistency are definable
% here.
% \begin{macrocode}
\ifx\e@alloc@bytecode@count\@undefined
\countdef\e@alloc@bytecode@count=262
+ \e@alloc@bytecode@count=\z@
\fi
\def\newluabytecode#1{%
\e@alloc\luabytecode\e@alloc@chardef
\e@alloc@bytecode@count\m@ne\e@alloc@top#1%
}
-\e@alloc@bytecode@count=\z@
% \end{macrocode}
% \end{macro}
%
@@ -753,12 +758,14 @@
% \begin{macro}{\newluachunkname}
% \changes{v1.0a}{2015/09/24}{Macro added}
+% \changes{v1.1q}{2020/08/02}{Move reset to $0$ inside conditional}
% As for bytecode registers, but in addition we need to add a string
% to the \verb|lua.name| table to use in stack tracing. We use the
% name of the command passed to the allocator, with no backslash.
% \begin{macrocode}
\ifx\e@alloc@luachunk@count\@undefined
\countdef\e@alloc@luachunk@count=263
+ \e@alloc@luachunk@count=\z@
\fi
\def\newluachunkname#1{%
\e@alloc\luachunk\e@alloc@chardef
@@ -766,19 +773,31 @@
{\escapechar\m@ne
\directlua{lua.name[\the\allocationnumber]="\string#1"}}%
}
-\e@alloc@luachunk@count=\z@
% \end{macrocode}
% \end{macro}
%
% \subsection{Lua loader}
+% \changes{v1.1r}{2020/08/10}{Load ltluatex Lua module during format building}
+%
+% Lua code loaded in the format often has to to be loaded again at the
+% beginning of every job, so we define a helper whch allows us to avoid
+% duplicated code:
+%
+% \begin{macrocode}
+\def\now@and@everyjob#1{%
+ \everyjob\expandafter{\the\everyjob
+ #1%
+ }%
+ #1%
+}
+% \end{macrocode}
%
% Load the Lua code at the start of every job.
% For the conversion of \TeX{} into numbers at the Lua side we need some
% known registers: for convenience we use a set of systematic names, which
% means using a group around the Lua loader.
% \begin{macrocode}
-%<2ekernel>\everyjob\expandafter{%
-%<2ekernel> \the\everyjob
+%<2ekernel>\now@and@everyjob{%
\begingroup
\attributedef\attributezero=0 %
\chardef \charzero =0 %
@@ -1321,6 +1340,7 @@ local callbacktypes = callbacktypes or {
% \changes{v1.1k}{2019/10/02}{process\_rule is \texttt{exclusive}}
% \changes{v1.1k}{2019/10/02}{mlist\_to\_hlist is \texttt{exclusive}}
% \changes{v1.1l}{2020/02/02}{post\_linebreak\_filter is \texttt{reverselist}}
+% \changes{v1.1p}{2020/08/01}{new\_graf is \texttt{exclusive}}
% \begin{macrocode}
contribute_filter = simple,
buildpage_filter = simple,
@@ -1342,7 +1362,7 @@ local callbacktypes = callbacktypes or {
pre_mlist_to_hlist_filter = list,
mlist_to_hlist = exclusive,
post_mlist_to_hlist_filter = reverselist,
- new_graf = simple,
+ new_graf = exclusive,
% \end{macrocode}
% Section 8.5: information reporting callbacks.
% \changes{v1.0m}{2016/02/11}{show\_warning\_message added}
@@ -1481,6 +1501,7 @@ end
% \end{macrocode}
% Handler for |list| callbacks.
% \changes{v1.0k}{2015/12/02}{resolve name and i.description (PHG)}
+% \changes{v1.1s}{2020/12/02}{Fix return value of list callbacks}
% \begin{macrocode}
local function list_handler(name)
return function(head, ...)
@@ -1493,7 +1514,7 @@ local function list_handler(name)
"Function `" .. i.description .. "' returned false\n"
.. "in callback `" .. name .."'"
)
- break
+ return false
end
if ret ~= true then
alltrue = false
@@ -1526,7 +1547,7 @@ local function reverselist_handler(name)
"Function `" .. cb.description .. "' returned false\n"
.. "in callback `" .. name .."'"
)
- break
+ return false
end
if ret ~= true then
alltrue = false
@@ -1716,6 +1737,7 @@ luatexbase.add_to_callback = add_to_callback
% \changes{v1.0a}{2015/09/24}{Function added}
% \changes{v1.0k}{2015/12/02}{adjust initialisation of cb local (PHG)}
% \changes{v1.0k}{2015/12/02}{Give more specific error messages (PHG)}
+% \changes{v1.1m}{2020/03/07}{Do not call callback.register for user-defined callbacks}
% Remove a function from a callback. First check arguments.
% \begin{macrocode}
local function remove_from_callback(name, description)
@@ -1761,7 +1783,9 @@ local function remove_from_callback(name, description)
)
if #l == 0 then
callbacklist[name] = nil
- callback_register(name, nil)
+ if user_callbacks_defaults[name] == nil then
+ callback_register(name, nil)
+ end
end
return cb.func,cb.description
end
diff --git a/Master/texmf-dist/source/latex/base/ltmath.dtx b/Master/texmf-dist/source/latex/base/ltmath.dtx
index 18688068b04..770367c8a30 100644
--- a/Master/texmf-dist/source/latex/base/ltmath.dtx
+++ b/Master/texmf-dist/source/latex/base/ltmath.dtx
@@ -38,7 +38,7 @@
%<*driver>
% \fi
\ProvidesFile{ltmath.dtx}
- [2019/08/27 v1.2c LaTeX Kernel (Math Setup)]
+ [2020/11/09 v1.2h LaTeX Kernel (Math Setup)]
% \iffalse
%</driver>
%
@@ -407,15 +407,17 @@
% \begin{macro}{\cases}
% \changes{LaTeX2.09}{1991/08/14}
% {(RmS) inserted extra braces around entry for NFSS}
+% \changes{v1.2g}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
% \begin{macrocode}
-\DeclareRobustCommand\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}
+% \changes{v1.2g}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
% \begin{macrocode}
-\DeclareRobustCommand\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}}}\,}
@@ -423,8 +425,9 @@
% \end{macro}
%
% \begin{macro}{\pmatrix}
+% \changes{v1.2g}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
% \begin{macrocode}
-\DeclareRobustCommand\pmatrix[1]{\left(\matrix{#1}\right)}
+\DeclareRobustCommand*\pmatrix[1]{\left(\matrix{#1}\right)}
% \end{macrocode}
% \end{macro}
%
@@ -509,18 +512,110 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\>}
-% \begin{macro}{\;}
-% \begin{macro}{\!}
+
+
+%
+% \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}
+%
+% Originally \LaTeX{} only provided a small set of spacing commands
+% for use in text and math, some of the commands like \cs{;} were
+% only supported in manth mode. \texttt{amsmath} normalized and
+% provided all of them in text and math. This code has now been
+% moved to the kernel so that it is generally available.
+%
+%
% \begin{macrocode}
-%\def\,{\mskip\thinmuskip} % already defined in ltspace
-\def\>{\mskip\medmuskip}
-\def\;{\mskip\thickmuskip}
-\def\!{\mskip-\thinmuskip}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\tmspace}{amsmath spacing commands}%
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
+% \cs{tmspace} is really meant to be an internal command so it
+% doesn't necessarily has to be robust but it was robust in
+% \texttt{amsmath} so we leave it like that.
+% \changes{v1.2e}{2020/03/07}{Add \texttt{amsmath} math/text spacing
+% commands to the kernel (gh/303)}
+% \begin{macrocode}
+\DeclareRobustCommand\tmspace[3]{%
+ \ifmmode\mskip#1#2\else\leavevmode@ifvmode\kern#1#3\fi\relax}
+% \end{macrocode}
+% In \texttt{amsmath} the text kern is \texttt{.1667em}. For
+% compatibility reasons we keep the longer one.
+% \begin{macrocode}
+\DeclareRobustCommand\,{\tmspace+\thinmuskip{.16667em}}
+\let\thinspace\,
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareRobustCommand\!{\tmspace-\thinmuskip{.16667em}}
+\let\negthinspace\!
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareRobustCommand\:{\tmspace+\medmuskip{.2222em}}
+\let\medspace\:
+% \end{macrocode}
+% \LaTeX{} has a second name for this in its manual:
+% \begin{macrocode}
+\let\>=\:
+\DeclareRobustCommand\negmedspace{\tmspace-\medmuskip{.2222em}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareRobustCommand\;{\tmspace+\thickmuskip{.2777em}}
+\let\thickspace\;
+\DeclareRobustCommand\negthickspace{\tmspace-\thickmuskip{.2777em}}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\tmspace}{amsmath spacing commands}%
+%<latexrelease>
+%<latexrelease>\let\tmspace\@undefined
+%<latexrelease>\DeclareRobustCommand{\,}{%
+%<latexrelease> \relax\ifmmode\mskip\thinmuskip\else\thinspace\fi}
+%<latexrelease>\DeclareRobustCommand\thinspace{\leavevmode@ifvmode\kern .16667em }
+%<latexrelease>\DeclareRobustCommand\negthinspace{\leavevmode@ifvmode\kern-.16667em }
+%<latexrelease>\def\>{\mskip\medmuskip}
+%<latexrelease>\let\:=\>
+%<latexrelease>\def\;{\mskip\thickmuskip}
+%<latexrelease>\def\!{\mskip-\thinmuskip}
+%<latexrelease>
+% \end{macrocode}
+% \changes{v1.2h}{2020/11/09}{\cs{negmedspace} and \cs{negthickspace}
+% have been only in amsmath, so we need to undefine for rollback (gh/423)}
+% \begin{macrocode}
+%<latexrelease>\let\negmedspace\@undefined
+%<latexrelease>\let\negthickspace\@undefined
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \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}{\*}
% \begin{macrocode}
@@ -532,7 +627,7 @@
% Nickname for the medium space since |\>| is not available inside
% \texttt{tabbing}.
% \begin{macrocode}
-\let\:=\>
+%\let\:=\>
% \end{macrocode}
% \end{macro}
%
@@ -884,12 +979,32 @@
\def\@yeqncr{\@testopt\@xeqncr\z@skip}
% \end{macrocode}
%
+% \changes{v1.2f}{2020/04/21}{Support calc syntax (gh/152)}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@xeqncr}{eqnarray support calc syntax}%
\def\@xeqncr[#1]{%
\ifnum0=`{\fi}%
\@@eqncr
- \noalign{\penalty\@eqpen\vskip\jot\vskip #1\relax}%
+ \noalign{\penalty\@eqpen\vskip\jot\@vspace@calcify{#1}}%
}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@xeqncr}{eqnarray support calc syntax}%
+%<latexrelease>
+%<latexrelease>\def\@xeqncr[#1]{%
+%<latexrelease> \ifnum0=`{\fi}%
+%<latexrelease> \@@eqncr
+%<latexrelease> \noalign{\penalty\@eqpen\vskip\jot\vskip #1\relax}%
+%<latexrelease>}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
%
% \end{macro}
@@ -1009,9 +1124,11 @@
%
% \begin{macro}{\mathindent}
% The amount of indentation of the equations is stored in a register.
+% \changes{v1.2d}{2020/02/18}{Make \cs{mathindent} a skip register to match
+% amsmath (gh/252)}
% \begin{macrocode}
%<*fleqn>
-\newdimen\mathindent
+\newskip\mathindent
% \end{macrocode}
% The setting of |\mathindent| has to be deferred until the class
% file has been processed, because |\leftmargini| is still 0pt
@@ -1097,7 +1214,13 @@
\hb@xt@\linewidth\bgroup $\m@th% $
\displaystyle
\hskip\mathindent}%
- {$\hfil % $
+% \end{macrocode}
+% Ensure that there is at least a space between formula and
+% equation number so that they don't bump in each other.
+% \changes{v1.2d}{2020/02/18}{Separate formula and eqn number by at
+% least a space in fleqn option}
+% \begin{macrocode}
+ {$\hskip .3em minus.3em\hfil % $
\displaywidth\linewidth\hbox{\@eqnnum}%
\egroup
\endtrivlist}
diff --git a/Master/texmf-dist/source/latex/base/ltmiscen.dtx b/Master/texmf-dist/source/latex/base/ltmiscen.dtx
index 97b1f4a572b..cf7f3c836be 100644
--- a/Master/texmf-dist/source/latex/base/ltmiscen.dtx
+++ b/Master/texmf-dist/source/latex/base/ltmiscen.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltmiscen.dtx}
- [2019/11/02 v1.1s LaTeX Kernel (Misc. Environments)]
+ [2020/12/18 v1.1x LaTeX Kernel (Misc. Environments)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltmiscen.dtx}
@@ -73,6 +73,7 @@
% \cs{@noligs}.}
% \changes{v1.1g}{1998/08/17}{(RmS) Minor documentation fixes.}
% \changes{v1.1p}{2019/08/27}{Make various commands robust}
+% \changes{v1.1v}{2020/08/21}{Integration of new hook management interface}
%
% \section{Miscellaneous Environments}
% This section implements the basic environment mechanism, and also
@@ -182,6 +183,7 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{environment}{document}
% \begin{macro}{\enddocument}
% \changes{LaTeX2.09}{1993/08/03}
% {Changed redefinition of \cs{global} to redefinition
@@ -190,6 +192,10 @@
% {Added warning in case of undefined references.}%
% \changes{v0.9e}{1993/12/09}{Hook added}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\enddocument}{Use Hooks}%
\def\enddocument{%
% \end{macrocode}
% The |\end{document}| hook is executed first. If necessary it can
@@ -208,10 +214,15 @@
% \changes{v1.1i}{2000/05/19}
% {Reset \cs{AtEndDocument} for latex/3060}
% \begin{macrocode}
- \let\AtEndDocument\@firstofone
- \@enddocumenthook
+ \UseOneTimeHook{enddocument}%
+ \@kernel@after@enddocument
+% \end{macrocode}
+%
+% \begin{macrocode}
\@checkend{document}%
\clearpage
+ \UseOneTimeHook{enddocument/afterlastpage}%
+ \@kernel@after@enddocument@afterlastpage
\begingroup
\if@filesw
\immediate\closeout\@mainaux
@@ -228,17 +239,48 @@
% \changes{v1.1k}{2010/08/17}{Use braces around \cs{input} arg (pr/4124)}
% \changes{v1.1l}{2010/08/17}{Change of plan: use \cs{@@input} instead
% (pr/4124)}
+% \changes{v1.1w}{2020/10/23}{Make \texttt{enddocument/afteraux} one-time}
% We use |\@@input| to load the \texttt{.aux} file, so that it doesn't
% show up in the list of files produced by |\listfiles|.
% \begin{macrocode}
\@tempswafalse
\makeatletter \@@input\jobname.aux
\fi
+ \UseOneTimeHook{enddocument/afteraux}%
% \end{macrocode}
-% \changes{v1.0w}{1994/11/30}
-% {(DPC) Use \cs{@dofilelist}}
+% Next hook is expect to contain only code for writing info
+% messages on the terminal.
% \begin{macrocode}
- \@dofilelist
+ \UseOneTimeHook{enddocument/info}%
+ \endgroup
+ \UseOneTimeHook{enddocument/end}%
+ \deadcycles\z@\@@end}
+% \end{macrocode}
+%
+% The public hooks used in \cs{enddocument}:
+% \begin{macrocode}
+\NewHook{enddocument}
+\NewHook{enddocument/afterlastpage}
+\NewHook{enddocument/afteraux}
+\NewHook{enddocument/info}
+\NewHook{enddocument/end}
+% \end{macrocode}
+%
+% This is one of the few places where we already add data and rules
+% to a hook already in the kernel.
+% \changes{v1.0w}{1994/11/30}{(DPC) Use \cs{@dofilelist}}
+% \begin{macrocode}
+\AddToHook{enddocument/info}[kernel/filelist]{\@dofilelist}
+\AddToHook{enddocument/info}[kernel/warnings]{\@enddocument@kernel@warnings}
+\DeclareHookRule{enddocument/info}{kernel/filelist}{before}{kernel/warnings}
+% \end{macrocode}
+% \end{macro}
+% \end{environment}
+%
+% \begin{macro}{\@enddocument@kernel@warnings}
+%
+% \begin{macrocode}
+\def\@enddocument@kernel@warnings{%
% \end{macrocode}
% First we check for font size substitution bigger than
% |\fontsubfuzz|. The |\relax| is necessary because this is a macro
@@ -246,29 +288,29 @@
% \changes{v1.0w}{1994/11/30}
% {(DPC) Do warnings even for \cs{nofiles}}
% \begin{macrocode}
- \ifdim \font@submax >\fontsubfuzz\relax
+ \ifdim \font@submax >\fontsubfuzz\relax
% \end{macrocode}
% In case you wonder about the |\@gobbletwo| inside the message
% below, this is a horrible hack to remove the tokens |\on@line.|
% that are added by |\@font@warning| at the end.
% \changes{v1.1j}{2000/07/11}{Fix typo in warning}
% \begin{macrocode}
- \@font@warning{Size substitutions with differences\MessageBreak
- up to \font@submax\space have occurred.\@gobbletwo}%
- \fi
+ \@font@warning{Size substitutions with differences\MessageBreak
+ up to \font@submax\space have occurred.\@gobbletwo}%
+ \fi
% \end{macrocode}
% The macro |\@defaultsubs| is initially |\relax| but gets redefined
% to produce
% a warning if there have been some default font substitutions.
% \changes{v1.0z}{1995/07/13}{Use \cs{@defaultsubs} instead of switch}
% \begin{macrocode}
- \@defaultsubs
+ \@defaultsubs
% \end{macrocode}
% The macro |\@refundefined| is initially |\relax| but gets redefined
% to produce a warning if there are undefined refs.
% \changes{v1.1b}{1995/10/24}{Use \cs{@refundefined} instead of switch}
% \begin{macrocode}
- \@refundefined
+ \@refundefined
% \end{macrocode}
% If a label is defined more than once, |\@tempswa| will always be
% true and thus produce a ``Label(s) may \ldots'' warning. But
@@ -280,21 +322,76 @@
% \changes{v1.1b}{1995/10/24}{Changed logic for producing
% warning messages and removed switch}
% \begin{macrocode}
- \if@filesw
- \ifx \@multiplelabels \relax
- \if@tempswa
- \@latex@warning@no@line{Label(s) may have changed.
- Rerun to get cross-references right}%
- \fi
- \else
- \@multiplelabels
+ \if@filesw
+ \ifx \@multiplelabels \relax
+ \if@tempswa
+ \@latex@warning@no@line{Label(s) may have changed.
+ Rerun to get cross-references right}%
\fi
+ \else
+ \@multiplelabels
+ \fi
+ \ifx \@extra@page@added \relax
+ \@latex@warning@no@line{Temporary extra page added at the end.
+ Rerun to get it removed}%
\fi
- \endgroup
- \deadcycles\z@\@@end}
+% \end{macrocode}
+% We could think of adding a warning that nothing can be corrected
+% while \cs{nofiles} is in force. In the past the warnings related
+% to the \texttt{aux} file are simply suppressed in this case.
+% \begin{macrocode}
+ \fi
+}
% \end{macrocode}
% \end{macro}
%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\enddocument}{Use Hooks}%
+%<latexrelease>
+%<latexrelease>\def\enddocument{%
+%<latexrelease> \let\AtEndDocument\@firstofone
+%<latexrelease> \@enddocumenthook
+%<latexrelease> \@checkend{document}%
+%<latexrelease> \clearpage
+%<latexrelease> \begingroup
+%<latexrelease> \if@filesw
+%<latexrelease> \immediate\closeout\@mainaux
+%<latexrelease> \let\@setckpt\@gobbletwo
+%<latexrelease> \let\@newl@bel\@testdef
+%<latexrelease> \@tempswafalse
+%<latexrelease> \makeatletter \@@input\jobname.aux
+%<latexrelease> \fi
+%<latexrelease> \@dofilelist
+%<latexrelease> \ifdim \font@submax >\fontsubfuzz\relax
+%<latexrelease> \@font@warning{Size substitutions with differences\MessageBreak
+%<latexrelease> up to \font@submax\space have occurred.\@gobbletwo}%
+%<latexrelease> \fi
+%<latexrelease> \@defaultsubs
+%<latexrelease> \@refundefined
+%<latexrelease> \if@filesw
+%<latexrelease> \ifx \@multiplelabels \relax
+%<latexrelease> \if@tempswa
+%<latexrelease> \@latex@warning@no@line{Label(s) may have changed.
+%<latexrelease> Rerun to get cross-references right}%
+%<latexrelease> \fi
+%<latexrelease> \else
+%<latexrelease> \@multiplelabels
+%<latexrelease> \fi
+%<latexrelease> \fi
+%<latexrelease> \endgroup
+%<latexrelease> \deadcycles\z@\@@end}
+%<latexrelease>
+%<latexrelease>\let\@enddocument@kernel@warnings\@undefined
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+%
+%
% \begin{macro}{\@testdef}
% \begin{macrocode}
\def\@testdef #1#2#3{%
@@ -523,17 +620,107 @@
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2019/10/01}%
-%<latexrelease> {\begin}{Making \begin/\end robust}%
-\DeclareRobustCommand\begin[1]{%
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\begin}{Use hook system}%
+\DeclareRobustCommand*\begin[1]{%
+ \UseHook{env/#1/before}%
\@ifundefined{#1}%
{\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
{\def\reserved@a{\def\@currenvir{#1}%
- \edef\@currenvline{\on@line}%
- \csname #1\endcsname}}%
+ \edef\@currenvline{\on@line}%
+ \@execute@begin@hook{#1}%
+ \csname #1\endcsname}}%
\@ignorefalse
\begingroup\@endpefalse\reserved@a}
% \end{macrocode}
+%
+% Before the \cs{document} code is executed we have to first undo
+% the \cs{endgroup} as there should be none for this environment to
+% avoid that changes on top-level unnecessarily go to \TeX's
+% savestack, and we have to initialize all hooks in the hook system.
+% So we need to test for this environment name. But once it has be
+% found all this testing is no longer needed and so we redefine
+% \cs{@execute@begin@hook} to simply use the hook.
+% \begin{macrocode}
+\def\@execute@begin@hook #1{%
+ \expandafter\ifx\csname #1\endcsname\document
+ \endgroup
+ \gdef\@execute@begin@hook##1{\UseHook{env/##1/begin}}%
+ \@expl@@@initialize@all@@
+ \fi
+% \end{macrocode}
+% If this is an environment before \verb=\begin{document}= we just
+% run the hook so this can be outside the test.
+% \begin{macrocode}
+ \UseHook{env/#1/begin}%
+}
+% \end{macrocode}
+%
+% The top level definition for \cs{end}. for an explanation see
+% below (this is the same as the 2019 version where it was
+% introduced, but for rollback we have to repeat it).
+% \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}
+% Version that adds hooks (so different from the 2019 version). It
+% fixes tlb3722 but the change should perhaps be made in
+% \texttt{tabularx} instead.
+% \begin{macrocode}
+\@namedef{end }#1{%
+ \romannumeral
+ \IfHookEmptyTF{env/#1/end}%
+ {\expandafter\z@}%
+ {\z@\UseHook{env/#1/end}}%
+ \csname end#1\endcsname\@checkend{#1}%
+ \expandafter\endgroup\if@endpe\@doendpe\fi
+ \UseHook{env/#1/after}%
+ \if@ignore\@ignorefalse\ignorespaces\fi
+}
+% \end{macrocode}
+% Version without the fix for tlb3722 for the record:
+% \begin{macrocode}
+%\@namedef{end }#1{%
+% \UseHook{env/#1/end}%
+% \csname end#1\endcsname\@checkend{#1}%
+% \expandafter\endgroup\if@endpe\@doendpe\fi
+% \UseHook{env/#1/after}%
+% \if@ignore\@ignorefalse\ignorespaces\fi}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\begin}{Making \begin/\end robust}%
+%<latexrelease>\DeclareRobustCommand\begin[1]{%
+%<latexrelease> \@ifundefined{#1}%
+%<latexrelease> {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
+%<latexrelease> {\def\reserved@a{\def\@currenvir{#1}%
+%<latexrelease> \edef\@currenvline{\on@line}%
+%<latexrelease> \csname #1\endcsname}}%
+%<latexrelease> \@ignorefalse
+%<latexrelease> \begingroup\@endpefalse\reserved@a}
+% \end{macrocode}
% 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
@@ -606,41 +793,50 @@
% \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
- }
+%<latexrelease>\edef\end
+%<latexrelease> {\unexpanded{%
+%<latexrelease> \romannumeral
+%<latexrelease> \ifx\protect\@typeset@protect
+%<latexrelease> \expandafter %1
+%<latexrelease> \expandafter %2
+%<latexrelease> \expandafter %1
+%<latexrelease> \expandafter %3 expands the \csname inside \end<space>
+%<latexrelease> \expandafter %1
+%<latexrelease> \expandafter %2 expands \end<space>
+%<latexrelease> \expandafter %1 expands the \else
+%<latexrelease> \z@
+%<latexrelease> \else
+%<latexrelease> \expandafter\z@\expandafter\protect
+%<latexrelease> \fi
+%<latexrelease> }%
+%<latexrelease> \expandafter\noexpand\csname end \endcsname
+%<latexrelease> }
% \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}
-\@namedef{end }#1{%
- \csname end#1\endcsname\@checkend{#1}%
- \expandafter\endgroup\if@endpe\@doendpe\fi
- \if@ignore\@ignorefalse\ignorespaces\fi}
-%</2ekernel|latexrelease>
+%<latexrelease>\@namedef{end }#1{%
+%<latexrelease> \csname end#1\endcsname\@checkend{#1}%
+%<latexrelease> \expandafter\endgroup\if@endpe\@doendpe\fi
+%<latexrelease> \if@ignore\@ignorefalse\ignorespaces\fi}
%<latexrelease>\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>\def\begin#1{%
+%<latexrelease> \@ifundefined{#1}%
+%<latexrelease> {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
+%<latexrelease> {\def\reserved@a{\def\@currenvir{#1}%
+%<latexrelease> \edef\@currenvline{\on@line}%
+%<latexrelease> \csname #1\endcsname}}%
+%<latexrelease> \@ignorefalse
+%<latexrelease> \begingroup\@endpefalse\reserved@a}
+%<latexrelease>\def\end#1{%
+%<latexrelease> \csname end#1\endcsname\@checkend{#1}%
+%<latexrelease> \expandafter\endgroup\if@endpe\@doendpe\fi
+%<latexrelease> \if@ignore\@ignorefalse\ignorespaces\fi}
%<latexrelease>
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
@@ -672,6 +868,47 @@
% \end{macro}
%
%
+%
+% \begin{macro}{\AtBeginEnvironment,\AtEndEnvironment,
+% \BeforeBeginEnvironment,\AfterEndEnvironment}
+%
+% We provide 4 high-level hook interfaces directly, the others only when
+% etoolbox is loaded
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\AtBeginEnvironment}{Hooks for environments}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtBeginEnvironment[2][.] {\AddToHook{env/#2/begin}[#1]}
+\newcommand\AtEndEnvironment[2][.] {\AddToHook{env/#2/end}[#1]}
+\newcommand\BeforeBeginEnvironment[2][.]{\AddToHook{env/#2/before}[#1]}
+\newcommand\AfterEndEnvironment[2][.] {\AddToHook{env/#2/after}[#1]}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\AtBeginEnvironment}{Hooks for environments}%
+%<latexrelease>
+%<latexrelease>\let\AtBeginEnvironment\@undefined
+%<latexrelease>\let\AtEndEnvironment\@undefined
+%<latexrelease>\let\BeforeBeginEnvironment\@undefined
+%<latexrelease>\let\AfterEndEnvironment\@undefined
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
% \subsection{Center, Flushright, Flushleft}
%
% \begin{macrocode}
@@ -738,10 +975,25 @@
% \end{macro}
%
% \begin{macro}{\@icentercr}
+% \changes{v1.1t}{2020/04/21}{Support calc syntax (gh/152)}
% \begin{macrocode}
-\def\@icentercr[#1]{\vskip #1\ignorespaces}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@icentercr}{centering, etc support calc}%
+\def\@icentercr[#1]{\@vspace@calcify{#1}\ignorespaces}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@icentercr}{centering, etc support calc}%
+%<latexrelease>
+%<latexrelease>\def\@icentercr[#1]{\vskip #1\ignorespaces}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
-%
% \end{macro}
%
%
@@ -763,33 +1015,39 @@
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2019/10/01}%
-%<latexrelease> {\centering}{Make commands robust}%
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\centering}{Set finaldhypendemerits}%
% \end{macrocode}
%
% \begin{macro}{\centering}
+% \changes{v1.1u}{2020/05/31}{Added \cs{finalhyphendemerits} setting (gh/247)}
% \begin{macrocode}
\DeclareRobustCommand\centering{%
\let\\\@centercr
\rightskip\@flushglue\leftskip\@flushglue
+ \finalhyphendemerits=\z@
\parindent\z@\parfillskip\z@skip}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\raggedright}
+% \changes{v1.1u}{2020/05/31}{Added \cs{finalhyphendemerits} setting (gh/247)}
% \begin{macrocode}
\DeclareRobustCommand\raggedright{%
\let\\\@centercr\@rightskip\@flushglue \rightskip\@rightskip
+ \finalhyphendemerits=\z@
\leftskip\z@skip
\parindent\z@}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\raggedleft}
+% \changes{v1.1u}{2020/05/31}{Added \cs{finalhyphendemerits} setting (gh/247)}
% \begin{macrocode}
\DeclareRobustCommand\raggedleft{%
\let\\\@centercr
\rightskip\z@skip\leftskip\@flushglue
+ \finalhyphendemerits=\z@
\parindent\z@\parfillskip\z@skip}
% \end{macrocode}
% \end{macro}
@@ -797,6 +1055,23 @@
% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\centering}{Make commands robust}%
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand\centering{%
+%<latexrelease> \let\\\@centercr
+%<latexrelease> \rightskip\@flushglue\leftskip\@flushglue
+%<latexrelease> \parindent\z@\parfillskip\z@skip}
+%<latexrelease>\DeclareRobustCommand\raggedright{%
+%<latexrelease> \let\\\@centercr\@rightskip\@flushglue \rightskip\@rightskip
+%<latexrelease> \leftskip\z@skip
+%<latexrelease> \parindent\z@}
+%<latexrelease>\DeclareRobustCommand\raggedleft{%
+%<latexrelease> \let\\\@centercr
+%<latexrelease> \rightskip\z@skip\leftskip\@flushglue
+%<latexrelease> \parindent\z@\parfillskip\z@skip}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\centering}{Make commands robust}%
%<latexrelease>
@@ -983,6 +1258,7 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{environment}{verbatim}
% \begin{macro}{\verbatim}
% \begin{macro}{\endverbatim}
% (RmS 93/09/19) Protected against `missing item' error message
@@ -993,6 +1269,7 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{environment}
%
% \begin{macro}{\verbatim@font}
% \changes{v0.9a}{1993/11/21}{Macro added}
@@ -1010,7 +1287,7 @@
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2018/12/01}%
-%<latexrelease> {\verbvisiblespace}{Setup visible space for verb}%
+%<latexrelease> {\verbvisiblespace}{Setup visible space for \verb}%
% \end{macrocode}
%
%
@@ -1092,15 +1369,71 @@
% \end{macrocode}
% \end{macro}
%
+%^^A \@sverb was here
+%
+% \begin{environment}{verbatim*}
+% For \texttt{verbatim*} we also set up the correct visible space
+% character definition and then run |\@vobeyspaces|. As this code
+% is not called as part of the normal verbatim environment (the
+% method is done the other way around this time) we don't have to
+% check if space is already active---it shouldn't be.
+% \changes{v1.1o}{2018/10/11}
+% {Provide visible space in \cs{verb*} also for XeTeX and LuaTeX (github/69)}
+% \begin{macrocode}
+\@namedef{verbatim*}{\@verbatim
+ \@setupverbvisiblespace
+ \frenchspacing\@vobeyspaces\@sxverbatim}
+\expandafter\let\csname endverbatim*\endcsname =\endverbatim
+% \end{macrocode}
+% \end{environment}
+%
+%
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\verbvisiblespace}{Setup visible space for \verb}%
+%<latexrelease>
+%<latexrelease>\@namedef{verbatim*}{\@verbatim\@sxverbatim}
+%<latexrelease>
+%<latexrelease>\let\asciispace \@undefined
+%<latexrelease>\let\verbvisiblespace \@undefined
+%<latexrelease>\let\@setupverbvisiblespace\@undefined
+%<latexrelease>\let\@verbvisiblespacebox \@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+%
%
% \begin{macro}{\@sverb}
+% \begin{macro}{\@@sverb}
% \changes{v1.0j}{1994/05/10}{Slight change in error message text.}
% Definitions of |\@sverb| and |\@verb| changed so |\verb+ foo+|
% does not lose leading blanks when it comes at the beginning of a line.
% Change made 24 May 89. Suggested by Frank Mittelbach and Rainer
% Sch\"opf.
% \begin{macrocode}
-\def\@sverb#1{%
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@sverb}{Drop spaces before \verb delimiter}%
+% \end{macrocode}
+%
+% If the users types \verb=\verb !~! foo= then surprisingly we would
+% get the space as the delimiter and thus
+% ``\verb=!~!foo='' in the output.
+% To avoid this scenario we check if \verb=#1= has the character
+% code of a space, if so we recurse otherwise we call \cs{@@sverb}
+% (which is the original definition of \cs{@sverb}.
+% \changes{v1.1u}{2020/04/22}{Drop spaces before \cs{verb} delimiter (gh/327)}
+% \begin{macrocode}
+\def\@sverb#1{\if\noexpand#1 \expandafter\@sverb\else\@@sverb{#1}\fi}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@@sverb#1{%
\catcode`#1\active
\lccode`\~`#1%
\gdef\verb@balance@group{\verb@egroup
@@ -1120,39 +1453,28 @@
\else \@setupverbvisiblespace \@vobeyspaces \fi
}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{environment}{verbatim*}
-% For \texttt{verbatim*} we also set up the correct visible space
-% character definition and then run |\@vobeyspaces|. As this code
-% is not called as part of the normal verbatim environment (the
-% method is done the other way around this time) we don't have to
-% check if space is already active---it shouldn't be.
-% \changes{v1.1o}{2018/10/11}
-% {Provide visible space in \cs{verb*} also for XeTeX and LuaTeX (github/69)}
-% \begin{macrocode}
-\@namedef{verbatim*}{\@verbatim
- \@setupverbvisiblespace
- \frenchspacing\@vobeyspaces\@sxverbatim}
-\expandafter\let\csname endverbatim*\endcsname =\endverbatim
-% \end{macrocode}
-% \end{environment}
-%
-%
-%
+%
% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
-%<latexrelease>\IncludeInRelease{0000/00/00}%
-%<latexrelease> {\verbvisiblespace}{Setup visible space for verb}%
-%<latexrelease>
-%<latexrelease>\@namedef{verbatim*}{\@verbatim\@sxverbatim}
+%<latexrelease>\IncludeInRelease{2018/12/01}%
+%<latexrelease> {\@sverb}{Setup visible space for \verb}%
%<latexrelease>
-%<latexrelease>\let\asciispace \@undefined
-%<latexrelease>\let\verbvisiblespace \@undefined
-%<latexrelease>\let\@setupverbvisiblespace\@undefined
-%<latexrelease>\let\@verbvisiblespacebox \@undefined
+%<latexrelease>\def\@sverb#1{%
+%<latexrelease> \catcode`#1\active
+%<latexrelease> \lccode`\~`#1%
+%<latexrelease> \gdef\verb@balance@group{\verb@egroup
+%<latexrelease> \@latex@error{\noexpand\verb illegal in command argument}\@ehc}%
+%<latexrelease> \aftergroup\verb@balance@group
+%<latexrelease> \lowercase{\let~\verb@egroup}%
+%<latexrelease> \ifnum\catcode`\ =\active
+%<latexrelease> \else \@setupverbvisiblespace \@vobeyspaces \fi
+%<latexrelease>}
+%<latexrelease>\let\@@sverb\@undefined
+%<latexrelease>\EndIncludeInRelease
%<latexrelease>
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@sverb}{Setup visible space for \verb}%
%<latexrelease>\def\@sverb#1{%
%<latexrelease> \catcode`#1\active
%<latexrelease> \lccode`\~`#1%
@@ -1164,8 +1486,8 @@
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
% \end{macrocode}
-%
-%
+% \end{macro}
+% \end{macro}
%
%
% \begin{macro}{\@makeother}
diff --git a/Master/texmf-dist/source/latex/base/ltoutenc.dtx b/Master/texmf-dist/source/latex/base/ltoutenc.dtx
index f3c19000edf..c6bfc149b7c 100644
--- a/Master/texmf-dist/source/latex/base/ltoutenc.dtx
+++ b/Master/texmf-dist/source/latex/base/ltoutenc.dtx
@@ -37,14 +37,14 @@
%<TS1>\ProvidesFile{ts1enc.def}[2001/06/05 v3.0e (jk/car/fm)
%<TU>\ProvidesFile{tuenc.def}
%<package>\ProvidesPackage{fontenc}
-%<OT1|T1|OMS|OML|OT4|TU|package> [2020/02/11 v2.0o
+%<OT1|T1|OMS|OML|OT4|TU|package> [2020/08/10 v2.0s
%<OT1|T1|OMS|OML|OT4|TS1|TU> Standard LaTeX file]
%<package> Standard LaTeX package]
%
%<*driver>
% \fi
\ProvidesFile{ltoutenc.dtx}
- [2020/02/11 v2.0o LaTeX Kernel (font encodings)]
+ [2020/08/10 v2.0s LaTeX Kernel (font encodings)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltoutenc.dtx}
@@ -188,6 +188,8 @@
% like.}
% \changes{v1.99m}{2015/02/21}
% {Removed autoload code}
+% \changes{v2.0p}{2020/04/22}
+% {corrected \=y unicode value in tuenc.def}
%
%
% \section{Font encodings}
@@ -1080,8 +1082,9 @@
% deficiencies, see pr/3160.
% \task{?}{Improve this and document its problems, see pr/3160}
% \changes{v1.9z}{2000/01/30}{Macro reimplemented (pr/3160)}
+% \changes{v2.0r}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
% \begin{macrocode}
-\DeclareRobustCommand\UseTextAccent[3]{%
+\DeclareRobustCommand*\UseTextAccent[3]{%
\hmode@start@before@group
{%
% \end{macrocode}
@@ -1096,8 +1099,9 @@
% \end{macrocode}
%
% \changes{v1.9z}{2000/01/30}{Macro reimplemented (pr/3160)}
+% \changes{v2.0r}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
% \begin{macrocode}
-\DeclareRobustCommand\UseTextSymbol[2]{%
+\DeclareRobustCommand*\UseTextSymbol[2]{%
\hmode@start@before@group
{%
\def\@wrong@font@char{\MessageBreak
@@ -2867,28 +2871,64 @@
% \end{macrocode}
%
% LuaTeX.
+% For Lua\TeX~1.10+, define a Lua function to disable any handing by the font code.
+% Otherwise we reload the font without TeX ligatures.
+% \changes{v2.0q}{2020/07/04}{%
+% Implement \cs{remove@tlig} in Lua\TeX without font reloading}
% \begin{macrocode}
\def\UnicodeFontTeXLigatures{+tlig;}
-% \end{macrocode}
-%
-% \begin{macrocode}
- \def\reserved@a#1{%
- \def\@remove@tlig##1{\@remove@tlig@##1\@nil#1\@nil\relax}
- \def\@remove@tlig@##1#1{\@remove@tlig@@##1}}
- \edef\reserved@b{\detokenize{+tlig;}}
- \expandafter\reserved@a\expandafter{\reserved@b}
- \def\@remove@tlig@@#1\@nil#2\relax{#1}
-% \end{macrocode}
-%
-% \begin{macrocode}
- \def\remove@tlig#1{%
- \begingroup
- \font\remove@tlig
- \expandafter\@remove@tlig\expandafter{\fontname\font}%
- \remove@tlig
- \char#1\relax
- \endgroup
- }
+ \ifnum\luatexversion<110
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \def\reserved@a#1{%
+ \def\@remove@tlig##1{\@remove@tlig@##1\@nil#1\@nil\relax}
+ \def\@remove@tlig@##1#1{\@remove@tlig@@##1}}
+ \edef\reserved@b{\detokenize{+tlig;}}
+ \expandafter\reserved@a\expandafter{\reserved@b}
+ \def\@remove@tlig@@#1\@nil#2\relax{#1}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \def\remove@tlig#1{%
+ \begingroup
+ \font\remove@tlig
+ \expandafter\@remove@tlig\expandafter{\fontname\font}%
+ \remove@tlig
+ \char#1\relax
+ \endgroup
+ }
+ \else
+ \newluafunction\@remove@tlig@@@@
+% \end{macrocode}
+% Now we can define the function. Mostly we just have to insert a protected glyph
+% node, which is a glyph node with subtype 256. But we have to keep track of the
+% current mode to avoid inserting the glyph into a vlist.
+% \begin{macrocode}
+ \now@and@everyjob{\directlua{
+ local rawchar_func = token.create'@remove@tlig@@@@'.index
+ local forcehmode = tex.forcehmode
+ local put_next = token.put_next
+ local glyph_id = node.id'glyph'
+ local rawchar_token = token.new(rawchar_func, token.command_id'lua_call')
+ lua.get_functions_table()[rawchar_func] = function()
+ local mode = tex.nest.top.mode
+ if mode == 1 or mode == -1 then
+ put_next(rawchar_token)
+ return forcehmode(true)
+ end
+ local n = node.new(glyph_id, 256)
+ n.font = font.current()
+ n.char = token.scan_int()
+ return node.write(n)
+ end
+ token.set_lua('@remove@tlig@@@', rawchar_func, 'global', 'protected')
+ }}
+% \end{macrocode}
+% Now \verb+\remove@tlig+ can be implemented almost as in XeTeX.
+% \begin{macrocode}
+ \def\remove@tlig#1{\@remove@tlig@@@#1\relax}
+ \fi
% \end{macrocode}
%
% \begin{macrocode}
@@ -3370,7 +3410,7 @@
\DeclareUnicodeComposite{\textcommabelow}{T}{"021A}
\DeclareUnicodeComposite{\textcommabelow}{t}{"021B}
\DeclareUnicodeComposite{\=} {Y}{"0232}
-\DeclareUnicodeComposite{\=} {y}{"0232}
+\DeclareUnicodeComposite{\=} {y}{"0233}
\DeclareUnicodeComposite{\.} {B}{"1E02}
\DeclareUnicodeComposite{\.} {b}{"1E03}
\DeclareUnicodeComposite{\d} {B}{"1E04}
@@ -3601,7 +3641,7 @@
\xdef\@fontenc@load@list{\@fontenc@load@list
\@elt{\csname opt@fontenc.sty\endcsname}}
% \end{macrocode}
-%
+%
% \begin{macrocode}
\global\expandafter\let\csname ver@fontenc.sty\endcsname\relax
\global\expandafter\let\csname opt@fontenc.sty\endcsname\relax
diff --git a/Master/texmf-dist/source/latex/base/ltoutput.dtx b/Master/texmf-dist/source/latex/base/ltoutput.dtx
index c3b27baf42d..35d049b9590 100644
--- a/Master/texmf-dist/source/latex/base/ltoutput.dtx
+++ b/Master/texmf-dist/source/latex/base/ltoutput.dtx
@@ -37,7 +37,7 @@
%<*driver>
% \fi
\ProvidesFile{ltoutput.dtx}
- [2019/08/27 v1.4e LaTeX Kernel (Output Routine)]
+ [2020/08/21 v1.4f LaTeX Kernel (Output Routine)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltoutput.dtx}
@@ -791,12 +791,17 @@
%
% The stuff in the box should not add any typeset material to the
% page when it is unboxed.
+%
+% This interface is no longer used. Instead a new one is inside
+% \texttt{ltshipout.dtx}. We only keep the box in case some old
+% code refers to it directly (or we do some rollback).
+% \changes{v1.4f}{2020/08/21}{Integration of new hook management interface}
% \begin{macrocode}
\newbox\@begindvibox
-\DeclareRobustCommand \AtBeginDvi [1]{%
- \global \setbox \@begindvibox
- \vbox{\unvbox \@begindvibox #1}%
-}
+%\DeclareRobustCommand \AtBeginDvi [1]{%
+% \global \setbox \@begindvibox
+% \vbox{\unvbox \@begindvibox #1}%
+%}
% \end{macrocode}
% \end{macro}
% \end{macro}
diff --git a/Master/texmf-dist/source/latex/base/ltpage.dtx b/Master/texmf-dist/source/latex/base/ltpage.dtx
index f926f330605..8c7aac0a7b8 100644
--- a/Master/texmf-dist/source/latex/base/ltpage.dtx
+++ b/Master/texmf-dist/source/latex/base/ltpage.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltpage.dtx}
- [2019/08/27 v1.0l LaTeX Kernel (page style setup)]
+ [2020/07/27 v1.0m LaTeX Kernel (page style setup)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltpage.dtx}
@@ -201,8 +201,9 @@
% expansion, CAR}
% \changes{v1.0j}{2000/05/26}{Reimplementation to fix expansion
% error (pr/3203).}
+% \changes{v1.0m}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
% \begin{macrocode}
-\DeclareRobustCommand\markboth[2]{%
+\DeclareRobustCommand*\markboth[2]{%
\begingroup
\let\label\relax \let\index\relax \let\glossary\relax
\unrestored@protected@xdef\@themark {{#1}{#2}}%
@@ -212,8 +213,9 @@
\if@nobreak\ifvmode\nobreak\fi\fi}
% \end{macrocode}
%
+% \changes{v1.0m}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
% \begin{macrocode}
-\DeclareRobustCommand\markright[1]{%
+\DeclareRobustCommand*\markright[1]{%
\begingroup
\let\label\relax \let\index\relax \let\glossary\relax
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/base/ltpictur.dtx b/Master/texmf-dist/source/latex/base/ltpictur.dtx
index 9440fc783ad..5bef40375cd 100644
--- a/Master/texmf-dist/source/latex/base/ltpictur.dtx
+++ b/Master/texmf-dist/source/latex/base/ltpictur.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltpictur.dtx}
- [2019/08/27 v1.1m LaTeX Kernel (Picture Mode)]
+ [2020/08/14 v1.2a LaTeX Kernel (Picture Mode)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltpictur.dtx}
@@ -191,6 +191,46 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\@defaultunitsset}
+% \changes{v1.2a}{2020/08/15}{Macro added}
+% Set a length register, |#1|,
+% accepting number or an etex length expression, |#2|,
+% with default unit, |#3|.
+%
+% The register name in |#1| can be prefixed by |\advance| so that
+% the register is incremented by the supplied value.
+%
+% |\@defaultunitsset{\advance\@vxx}{\textwidth-15pt}\unitlength|
+%
+% |#3| can be a literal unit such as |cm| or a length register such
+% as |\unitlength|.
+%
+% This is used in all |picture| commands that take picture coordinates.
+% So |\put(2,2)| as previously but now |\put(\textwidth-5cm,0.4\texteight)|
+% Note that you can only use expressions with lengths, |\put(1+2,0)| is not
+% supported.
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@defaultunitsset}{default units}%
+\def\@defaultunitsset#1#2#3{%
+ \@defaultunits#1\dimexpr#2#3\relax\relax\@nnil}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@defaultunitsset}{default units}%
+%<latexrelease>\let\@defaultunitsset\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{picture}
% \begin{macro}{\picture}
% \changes{v0.1c}{1994/04/28}{(DPC) Ignore spaces before (}
% |#1| should be white space.
@@ -207,12 +247,34 @@
%
% \begin{macro}{\@picture}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@picture}{default units}%
\def\@picture(#1,#2)(#3,#4){%
- \@picht#2\unitlength
- \setbox\@picbox\hb@xt@#1\unitlength\bgroup
- \hskip -#3\unitlength
- \lower #4\unitlength\hbox\bgroup
+ \@defaultunitsset\@picht{#2}\unitlength
+ \@defaultunitsset\@tempdimc{#1}\unitlength
+ \setbox\@picbox\hb@xt@\@tempdimc\bgroup
+ \@defaultunitsset\@tempdimc{#3}\unitlength
+ \hskip -\@tempdimc
+ \@defaultunitsset\@tempdimc{#4}\unitlength
+ \lower\@tempdimc\hbox\bgroup
\ignorespaces}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@picture}{default units}%
+%<latexrelease>\def\@picture(#1,#2)(#3,#4){%
+%<latexrelease> \@picht#2\unitlength
+%<latexrelease> \setbox\@picbox\hb@xt@#1\unitlength\bgroup
+%<latexrelease> \hskip -#3\unitlength
+%<latexrelease> \lower #4\unitlength\hbox\bgroup
+%<latexrelease> \ignorespaces}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -229,16 +291,41 @@
\mbox{\box\@picbox}}
% \end{macrocode}
% \end{macro}
+% \end{environment}
%
% In the definitions of |\put| and |\multiput|, |\hskip| was replaced by
% |\kern| just in case arg |#3| = ``plus''. (Bug detected by Don Knuth.
% changed 20 Jul 87).
%
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\put}{default units}%
+%<latexrelease>\expandafter\let\csname put \endcsname\@undefind
\long\def\put(#1,#2)#3{%
- \@killglue\raise#2\unitlength
- \hb@xt@\z@{\kern#1\unitlength #3\hss}%
+ \@killglue
+ \@defaultunitsset\@tempdimc{#2}\unitlength
+ \raise\@tempdimc
+ \hb@xt@\z@{%
+ \@defaultunitsset\@tempdimc{#1}\unitlength
+ \kern\@tempdimc
+ #3\hss}%
\ignorespaces}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\put}{default units}%
+%<latexrelease>\expandafter\let\csname put \endcsname\@undefind
+%<latexrelease>\long\def\put(#1,#2)#3{%
+%<latexrelease> \@killglue\raise#2\unitlength
+%<latexrelease> \hb@xt@\z@{\kern#1\unitlength #3\hss}%
+%<latexrelease> \ignorespaces}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
%
%
@@ -246,23 +333,63 @@
% \changes{v0.1c}{1994/04/28}{(DPC) Ignore spaces between )(}
% |#3| had better be a |(|.
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\multiput}{default units}%
+%<latexrelease>\expandafter\let\csname multiput \endcsname\@undefind
\def\multiput(#1,#2)#3{%
- \@xdim #1\unitlength
- \@ydim #2\unitlength
+ \@defaultunitsset\@xdim{#1}\unitlength
+ \@defaultunitsset\@ydim{#2}\unitlength
\@multiput(}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\multiput}{default units}%
+%<latexrelease>\expandafter\let\csname multiput \endcsname\@undefind
+%<latexrelease>\def\multiput(#1,#2)#3{%
+%<latexrelease> \@xdim #1\unitlength
+%<latexrelease> \@ydim #2\unitlength
+%<latexrelease> \@multiput(}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\multiput}
+% \begin{macro}{\@multiput}
% \changes{v0.1c}{1994/04/28}{(DPC) Macro added}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@multiput}{default units}%
\long\def\@multiput(#1,#2)#3#4{%
\@killglue\@multicnt #3\relax
\@whilenum \@multicnt >\z@\do
{\raise\@ydim\hb@xt@\z@{\kern\@xdim #4\hss}%
\advance\@multicnt\m@ne
- \advance\@xdim#1\unitlength\advance\@ydim#2\unitlength}%
+ \@defaultunitsset{\advance\@xdim}{#1}\unitlength
+ \@defaultunitsset{\advance\@ydim}{#2}\unitlength}%
\ignorespaces}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@multiput}{default units}%
+%<latexrelease>\long\def\@multiput(#1,#2)#3#4{%
+%<latexrelease> \@killglue\@multicnt #3\relax
+%<latexrelease> \@whilenum \@multicnt >\z@\do
+%<latexrelease> {\raise\@ydim\hb@xt@\z@{\kern\@xdim #4\hss}%
+%<latexrelease> \advance\@multicnt\m@ne
+%<latexrelease> \advance\@xdim#1\unitlength\advance\@ydim#2\unitlength}%
+%<latexrelease> \ignorespaces}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -275,18 +402,22 @@
% \begin{macro}{\thinlines}
% \begin{macro}{\thicklines}
% \begin{macrocode}
-\DeclareRobustCommand\thinlines{\let\@linefnt\tenln \let\@circlefnt\tencirc
+\DeclareRobustCommand\thinlines{\let\@linefnt\tenln
+ \let\@circlefnt\tencirc
\@wholewidth\fontdimen8\tenln \@halfwidth .5\@wholewidth}
-\DeclareRobustCommand\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}
% \end{macro}
%
% \begin{macro}{\linethickness}
+% \changes{v1.1n}{2020/02/14}{Suppress spaces following the declaration (gh/274)}
+% \changes{v1.1p}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
% \begin{macrocode}
-\DeclareRobustCommand\linethickness[1]
- {\@wholewidth #1\relax \@halfwidth .5\@wholewidth}
+\DeclareRobustCommand*\linethickness[1]
+ {\@wholewidth #1\relax \@halfwidth .5\@wholewidth \ignorespaces}
% \end{macrocode}
% \end{macro}
%
@@ -332,8 +463,24 @@
% \end{macro}
%
% \begin{macro}{\@istackcr}
+% \changes{v1.1o}{2020/04/21}{Support calc syntax (gh/152)}
% \begin{macrocode}
-\def\@istackcr[#1]{\cr\noalign{\vskip #1}\ignorespaces}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@istackcr}{\shortstack calc support}%
+\def\@istackcr[#1]{\cr\noalign{\@vspace@calcify{#1}}\ignorespaces}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@istackcr}{\shortstack calc support}%
+%<latexrelease>
+%<latexrelease>\def\@istackcr[#1]{\cr\noalign{\vskip #1}\ignorespaces}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -510,13 +657,35 @@
%
% \begin{macro}{\line}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\line}{default units}%
+%<latexrelease>\expandafter\let\csname line \endcsname\@undefind
\def\line(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
- \@linelen #3\unitlength
+ \@defaultunitsset\@linelen{#3}\unitlength
\ifdim\@linelen<\z@\@badlinearg\else
\ifnum\@xarg =\z@ \@vline
\else \ifnum\@yarg =\z@ \@hline \else \@sline\fi
\fi
\fi}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\line}{default units}%
+%<latexrelease>\expandafter\let\csname line \endcsname\@undefind
+%<latexrelease>\def\line(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
+%<latexrelease> \@linelen #3\unitlength
+%<latexrelease> \ifdim\@linelen<\z@\@badlinearg\else
+%<latexrelease> \ifnum\@xarg =\z@ \@vline
+%<latexrelease> \else \ifnum\@yarg =\z@ \@hline \else \@sline\fi
+%<latexrelease> \fi
+%<latexrelease> \fi}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -600,16 +769,41 @@
%
% \begin{macro}{\vector}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\vector}{default units}%
+%<latexrelease>\expandafter\let\csname vector \endcsname\@undefind
\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
+ \@defaultunitsset\@linelen{#3}\unitlength
\ifdim\@linelen<\z@\@badlinearg\else
\ifnum\@xarg =\z@ \@vvector
\else \ifnum\@yarg =\z@ \@hvector \else \@svector\fi
\fi
\fi
\else\@badlinearg\fi}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\vector}{default units}%
+%<latexrelease>\expandafter\let\csname vector \endcsname\@undefind
+%<latexrelease>\def\vector(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
+%<latexrelease> \@tempcnta \ifnum\@xarg<\z@ -\@xarg\else\@xarg\fi
+%<latexrelease> \ifnum\@tempcnta<5\relax
+%<latexrelease> \@linelen #3\unitlength
+%<latexrelease> \ifdim\@linelen<\z@\@badlinearg\else
+%<latexrelease> \ifnum\@xarg =\z@ \@vvector
+%<latexrelease> \else \ifnum\@yarg =\z@ \@hvector \else \@svector\fi
+%<latexrelease> \fi
+%<latexrelease> \fi
+%<latexrelease> \else\@badlinearg\fi}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -803,11 +997,17 @@
%
% \begin{macro}{\dashbox}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\dashbox}{default units}%
+%<latexrelease>\expandafter\let\csname dashbox \endcsname\@undefind
\def\dashbox#1(#2,#3){\leavevmode\hb@xt@\z@{\baselineskip \z@skip
\lineskip \z@skip
-\@dashdim #2\unitlength
+\@defaultunitsset\@dashdim{#2}\unitlength
\@dashcnt \@dashdim \advance\@dashcnt 200
-\@dashdim #1\unitlength\divide\@dashcnt \@dashdim
+\@defaultunitsset\@dashdim{#1}\unitlength
+\divide\@dashcnt \@dashdim
\ifodd\@dashcnt\@dashdim \z@
\advance\@dashcnt \@ne \divide\@dashcnt \tw@
\else \divide\@dashdim \tw@ \divide\@dashcnt \tw@
@@ -819,15 +1019,19 @@
\put(#2,#3){\hskip-\@dashdim\box\@dashbox}%
\multiply\@dashdim \thr@@
\fi
-\setbox\@dashbox \hbox{\vrule \@height \@halfwidth \@depth \@halfwidth
-\@width #1\unitlength\hskip #1\unitlength}\@tempcnta\z@
+\setbox\@dashbox \hbox{%
+ \@defaultunitsset\@tempdimc{#1}\unitlength
+ \vrule \@height \@halfwidth \@depth \@halfwidth \@width \@tempdimc
+ \hskip\@tempdimc}%
+\@tempcnta\z@
\put(0,0){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
\do{\copy\@dashbox\advance\@tempcnta \@ne }}\@tempcnta\z@
\put(0,#3){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
\do{\copy\@dashbox\advance\@tempcnta \@ne }}%
-\@dashdim #3\unitlength
+\@defaultunitsset\@dashdim{#3}\unitlength
\@dashcnt \@dashdim \advance\@dashcnt 200
-\@dashdim #1\unitlength\divide\@dashcnt \@dashdim
+\@defaultunitsset\@dashdim{#1}\unitlength
+\divide\@dashcnt \@dashdim
\ifodd\@dashcnt \@dashdim \z@
\advance\@dashcnt \@ne \divide\@dashcnt \tw@
\else
@@ -841,14 +1045,79 @@
\put(#2,#3){\lower\@dashdim\copy\@dashbox}%
\multiply\@dashdim \thr@@
\fi
-\setbox\@dashbox\hbox{\vrule \@width \@wholewidth
-\@height #1\unitlength}\@tempcnta\z@
+\@defaultunitsset\@tempdimb{#1}\unitlength
+\setbox\@dashbox\hbox{%
+ \vrule \@width \@wholewidth \@height\@tempdimb}%
+\@tempcnta\z@
\put(0,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta <\@dashcnt
-\do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }%
+\do{\vskip\@tempdimb\copy\@dashbox\advance\@tempcnta \@ne }%
\vskip\@dashdim}}\@tempcnta\z@
\put(#2,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta<\@dashcnt
-\do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }%
+\do{\vskip\@tempdimb\copy\@dashbox\advance\@tempcnta \@ne }%
\vskip\@dashdim}}}\@makepicbox(#2,#3)}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\dashbox}{default units}%
+%<latexrelease>\expandafter\let\csname dashbox \endcsname\@undefind
+%<latexrelease>\def\dashbox#1(#2,#3){%
+%<latexrelease>\leavevmode\hb@xt@\z@{\baselineskip \z@skip
+%<latexrelease>\lineskip \z@skip
+%<latexrelease>\@dashdim #2\unitlength
+%<latexrelease>\@dashcnt \@dashdim \advance\@dashcnt 200
+%<latexrelease>\@dashdim #1\unitlength\divide\@dashcnt \@dashdim
+%<latexrelease>\ifodd\@dashcnt\@dashdim \z@
+%<latexrelease>\advance\@dashcnt \@ne \divide\@dashcnt \tw@
+%<latexrelease>\else \divide\@dashdim \tw@ \divide\@dashcnt \tw@
+%<latexrelease>\advance\@dashcnt \m@ne
+%<latexrelease>\setbox\@dashbox \hbox{%
+%<latexrelease> \vrule \@height \@halfwidth \@depth \@halfwidth
+%<latexrelease> \@width \@dashdim}\put(0,0){\copy\@dashbox}%
+%<latexrelease>\put(0,#3){\copy\@dashbox}%
+%<latexrelease>\put(#2,0){\hskip-\@dashdim\copy\@dashbox}%
+%<latexrelease>\put(#2,#3){\hskip-\@dashdim\box\@dashbox}%
+%<latexrelease>\multiply\@dashdim \thr@@
+%<latexrelease>\fi
+%<latexrelease>\setbox\@dashbox \hbox{%
+%<latexrelease> \vrule \@height \@halfwidth \@depth \@halfwidth
+%<latexrelease> \@width #1\unitlength\hskip #1\unitlength}\@tempcnta\z@
+%<latexrelease>\put(0,0){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
+%<latexrelease>\do{\copy\@dashbox\advance\@tempcnta \@ne }}\@tempcnta\z@
+%<latexrelease>\put(0,#3){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt
+%<latexrelease>\do{\copy\@dashbox\advance\@tempcnta \@ne }}%
+%<latexrelease>\@dashdim #3\unitlength
+%<latexrelease>\@dashcnt \@dashdim \advance\@dashcnt 200
+%<latexrelease>\@dashdim #1\unitlength\divide\@dashcnt \@dashdim
+%<latexrelease>\ifodd\@dashcnt \@dashdim \z@
+%<latexrelease>\advance\@dashcnt \@ne \divide\@dashcnt \tw@
+%<latexrelease>\else
+%<latexrelease>\divide\@dashdim \tw@ \divide\@dashcnt \tw@
+%<latexrelease>\advance\@dashcnt \m@ne
+%<latexrelease>\setbox\@dashbox\hbox{\hskip -\@halfwidth
+%<latexrelease>\vrule \@width \@wholewidth
+%<latexrelease>\@height \@dashdim}\put(0,0){\copy\@dashbox}%
+%<latexrelease>\put(#2,0){\copy\@dashbox}%
+%<latexrelease>\put(0,#3){\lower\@dashdim\copy\@dashbox}%
+%<latexrelease>\put(#2,#3){\lower\@dashdim\copy\@dashbox}%
+%<latexrelease>\multiply\@dashdim \thr@@
+%<latexrelease>\fi
+%<latexrelease>\setbox\@dashbox\hbox{\vrule \@width \@wholewidth
+%<latexrelease>\@height #1\unitlength}\@tempcnta\z@
+%<latexrelease>\put(0,0){%
+%<latexrelease> \hskip -\@halfwidth \vbox{\@whilenum \@tempcnta <\@dashcnt
+%<latexrelease> \do{\vskip #1\unitlength\copy\@dashbox
+%<latexrelease> \advance\@tempcnta\@ne }%
+%<latexrelease> \vskip\@dashdim}}\@tempcnta\z@
+%<latexrelease>\put(#2,0){%
+%<latexrelease> \hskip -\@halfwidth \vbox{\@whilenum \@tempcnta<\@dashcnt
+%<latexrelease> \do{\vskip #1\unitlength\copy\@dashbox
+%<latexrelease> \advance\@tempcnta \@ne }%
+%<latexrelease> \vskip\@dashdim}}}\@makepicbox(#2,#3)}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -1143,12 +1412,26 @@
% \begin{macrocode}
\newif\if@ovvline \@ovvlinetrue
\newif\if@ovhline \@ovhlinetrue
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@ovhlinetrue}%
+%<latexrelease> {Avoid almost zero length leaders}%
+%<latexrelease>\let\if@ovvline\@undefined
+%<latexrelease>\let\if@ovhline\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@oval}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@oval}{default units}%
\def\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen
\@ovttrue \@ovbtrue \@ovltrue \@ovrtrue
% \end{macrocode}
@@ -1157,9 +1440,10 @@
\@ovvlinefalse \@ovhlinefalse
% \end{macrocode}
% \begin{macrocode}
- \@tfor\reserved@a :=#3\do{\csname @ov\reserved@a false\endcsname}%
- \@ovxx #1\unitlength
- \@ovyy #2\unitlength
+ \@tfor\reserved@a :=#3\do{%
+ \csname @ov\reserved@a false\endcsname}%
+ \@defaultunitsset\@ovxx{#1}\unitlength
+ \@defaultunitsset\@ovyy{#2}\unitlength
% \end{macrocode}
% \changes{v1.1l}{2016/03/29}{add setting of line tests}
% \begin{macrocode}
@@ -1187,11 +1471,79 @@
\advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@
\@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}%
\endgroup}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2016/03/31}%
+%<latexrelease> {\@oval}{default units}%
+%<latexrelease>\def\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen
+%<latexrelease> \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue
+%<latexrelease> \@ovvlinefalse \@ovhlinefalse
+%<latexrelease> \@tfor\reserved@a :=#3\do{%
+%<latexrelease> \csname @ov\reserved@a false\endcsname}%
+%<latexrelease> \@ovxx #1\unitlength
+%<latexrelease> \@ovyy #2\unitlength
+%<latexrelease> \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx \@ovvlinetrue
+%<latexrelease> \else \@ovyy \ifdim \@ovyy =\@ovxx \else \@ovhlinetrue
+%<latexrelease> \fi\fi
+%<latexrelease> \advance \@tempdimb -2\p@
+%<latexrelease> \@getcirc \@tempdimb
+%<latexrelease> \@ovro \ht\@tempboxa \@ovri \dp\@tempboxa
+%<latexrelease> \@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@
+%<latexrelease> \@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@
+%<latexrelease> \ifdim \@ovdx >\z@ \@ovhlinetrue \fi
+%<latexrelease> \ifdim \@ovdy >\z@ \@ovvlinetrue \fi
+%<latexrelease> \@circlefnt \setbox\@tempboxa
+%<latexrelease> \hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi
+%<latexrelease> \if@ovl
+%<latexrelease> \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx
+%<latexrelease> \fi
+%<latexrelease> \if@ovt \@ovhorz \kern -\@ovxx \fi
+%<latexrelease> \if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro
+%<latexrelease> \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@
+%<latexrelease> \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}%
+%<latexrelease> \endgroup}
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@oval}{default units}%
+%<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}%
+%<latexrelease> \@ovxx #1\unitlength
+%<latexrelease> \@ovyy #2\unitlength
+%<latexrelease> \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx\else \@ovyy \fi
+%<latexrelease> \advance \@tempdimb -2\p@
+%<latexrelease> \@getcirc \@tempdimb
+%<latexrelease> \@ovro \ht\@tempboxa \@ovri \dp\@tempboxa
+%<latexrelease> \@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@
+%<latexrelease> \@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@
+%<latexrelease> \@circlefnt \setbox\@tempboxa
+%<latexrelease> \hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi
+%<latexrelease> \if@ovl
+%<latexrelease> \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx
+%<latexrelease> \fi
+%<latexrelease> \if@ovt \@ovhorz \kern -\@ovxx \fi
+%<latexrelease> \if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro
+%<latexrelease> \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@
+%<latexrelease> \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}%
+%<latexrelease> \endgroup}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@ovvert}
% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2016/03/31}%
+%<latexrelease> {\@ovvert}{Avoid almost zero length leaders}%
+%<*2ekernel|latexrelease>
\def\@ovvert#1#2{\vbox to\@ovyy{%
\if@ovb \@tempcntb \@tempcnta \advance \@tempcntb #1\relax
\kern -\@ovro \hbox{\char \@tempcntb}\nointerlineskip
@@ -1207,11 +1559,32 @@
\if@ovt \@tempcntb \@tempcnta \advance \@tempcntb #2\relax
\hbox{\char \@tempcntb}%
\else \kern \@ovdy \kern \@ovro \fi}}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@ovvert}{Avoid almost zero length leaders}%
+%<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
+%<latexrelease> \leaders\vrule \@width \@wholewidth\vfil \nointerlineskip
+%<latexrelease> \if@ovt \@tempcntb \@tempcnta \advance \@tempcntb #2\relax
+%<latexrelease> \hbox{\char \@tempcntb}%
+%<latexrelease> \else \kern \@ovdy \kern \@ovro \fi}}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@ovhorz}
% \begin{macrocode}
+%</2ekernel>
+%<latexrelease>\IncludeInRelease{2016/03/31}%
+%<latexrelease> {\@ovhorz}{Avoid almost zero length leaders}%
+%<*2ekernel|latexrelease>
\def\@ovhorz{\hb@xt@\@ovxx{\kern \@ovro
\if@ovr \else \kern \@ovdx \fi
% \end{macrocode}
@@ -1220,51 +1593,18 @@
% \begin{macrocode}
\if@ovhline \leaders \hrule \@height \@wholewidth \fi
% \end{macrocode}
+%
% \begin{macrocode}
\hfil
\if@ovl \else \kern \@ovdx \fi
\kern \@ovri}}
+%</2ekernel|latexrelease>
% \end{macrocode}
-% \end{macro}
-%
+%
% \begin{macrocode}
-%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
-%<latexrelease> {\@ovhlinetrue}%
-%<latexrelease> {Avoid almost zero length leaders}%
-%<latexrelease>\let\if@ovvline\@undefined
-%<latexrelease>\let\if@ovhline\@undefined
-%<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}%
-%<latexrelease> \@ovxx #1\unitlength
-%<latexrelease> \@ovyy #2\unitlength
-%<latexrelease> \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx\else \@ovyy \fi
-%<latexrelease> \advance \@tempdimb -2\p@
-%<latexrelease> \@getcirc \@tempdimb
-%<latexrelease> \@ovro \ht\@tempboxa \@ovri \dp\@tempboxa
-%<latexrelease> \@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@
-%<latexrelease> \@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@
-%<latexrelease> \@circlefnt \setbox\@tempboxa
-%<latexrelease> \hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi
-%<latexrelease> \if@ovl
-%<latexrelease> \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx
-%<latexrelease> \fi
-%<latexrelease> \if@ovt \@ovhorz \kern -\@ovxx \fi
-%<latexrelease> \if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro
-%<latexrelease> \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@
-%<latexrelease> \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}%
-%<latexrelease> \endgroup}
-%<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
-%<latexrelease> \leaders\vrule \@width \@wholewidth\vfil \nointerlineskip
-%<latexrelease> \if@ovt \@tempcntb \@tempcnta \advance \@tempcntb #2\relax
-%<latexrelease> \hbox{\char \@tempcntb}%
-%<latexrelease> \else \kern \@ovdy \kern \@ovro \fi}}
+%<latexrelease> {\@ovhorz}{Avoid almost zero length leaders}%
%<latexrelease>\def\@ovhorz{\hb@xt@\@ovxx{\kern \@ovro
%<latexrelease> \if@ovr \else \kern \@ovdx \fi
%<latexrelease> \leaders \hrule \@height \@wholewidth \hfil
@@ -1273,6 +1613,7 @@
%<latexrelease>\EndIncludeInRelease
%<*2ekernel>
% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\circle}
% \changes{LaTeX2.09}{1993/08/05}
@@ -1284,8 +1625,13 @@
%
% \begin{macro}{\@circle}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@circle}{default units}%
\def\@circle#1{%
- \begingroup \boxmaxdepth \maxdimen \@tempdimb #1\unitlength
+ \begingroup \boxmaxdepth \maxdimen
+ \@defaultunitsset\@tempdimb{#1}\unitlength
\ifdim \@tempdimb >15.5\p@ \@getcirc\@tempdimb
\@ovro\ht\@tempboxa
\setbox\@tempboxa\hbox{\@circlefnt
@@ -1296,13 +1642,52 @@
\box\@tempboxa}\ht\@tempboxa\z@ \dp\@tempboxa\z@
\@put{-\@ovro}{-\@ovro}{\box\@tempboxa}%
\else \@circ\@tempdimb{96}\fi\endgroup}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@circle}{default units}%
+%<latexrelease>\def\@circle#1{%
+%<latexrelease> \begingroup \boxmaxdepth \maxdimen \@tempdimb #1\unitlength
+%<latexrelease> \ifdim \@tempdimb >15.5\p@ \@getcirc\@tempdimb
+%<latexrelease> \@ovro\ht\@tempboxa
+%<latexrelease> \setbox\@tempboxa\hbox{\@circlefnt
+%<latexrelease> \advance\@tempcnta\tw@ \char \@tempcnta
+%<latexrelease> \advance\@tempcnta\m@ne \char \@tempcnta
+%<latexrelease> \kern -2\@tempdima
+%<latexrelease> \advance\@tempcnta\tw@
+%<latexrelease> \raise \@tempdima \hbox{\char\@tempcnta}%
+%<latexrelease> \raise \@tempdima
+%<latexrelease> \box\@tempboxa}\ht\@tempboxa\z@ \dp\@tempboxa\z@
+%<latexrelease> \@put{-\@ovro}{-\@ovro}{\box\@tempboxa}%
+%<latexrelease> \else \@circ\@tempdimb{96}\fi\endgroup}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@dot}
% Internal form of |\circle*|.
% \begin{macrocode}
-\def\@dot#1{\@tempdimb #1\unitlength \@circ\@tempdimb{112}}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@dot}{default units}%
+\def\@dot#1{%
+ \@defaultunitsset\@tempdimb{#1}\unitlength
+ \@circ\@tempdimb{112}}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@dot}{default units}%
+%<latexrelease>\def\@dot#1{\@tempdimb #1\unitlength \@circ\@tempdimb{112}}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -1340,7 +1725,7 @@
% \end{macro}
%
% \begin{macro}{\@xdim}
-% \begin{macro}{\yxdim}
+% \begin{macro}{\@ydim}
% Length registers.
% \begin{macrocode}
\newdimen\@xdim
@@ -1482,35 +1867,45 @@
%
% \begin{macro}{\@bezier}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@bezier}{default units}%
\def\@bezier#1(#2,#3)(#4,#5)(#6,#7){%
\ifnum #1=\z@
- \@ovxx #4\unitlength
- \advance\@ovxx -#2\unitlength
+ \@defaultunitsset\@ovxx{#4}\unitlength
+ \@defaultunitsset{\advance\@ovxx}{-#2}\unitlength
\ifdim \@ovxx<\z@ \@ovxx -\@ovxx \fi
- \@ovdx #6\unitlength
- \advance\@ovdx -#4\unitlength
+ \@defaultunitsset\@ovdx{#6}\unitlength
+ \@defaultunitsset{\advance\@ovdx}{-#4}\unitlength
\ifdim \@ovdx<\z@ \@ovdx -\@ovdx \fi
\ifdim \@ovxx<\@ovdx \@ovxx \@ovdx \fi
- \@ovyy #5\unitlength
- \advance\@ovyy -#3\unitlength
+ \@defaultunitsset\@ovyy{#5}\unitlength
+ \@defaultunitsset{\advance\@ovyy}{-#3}\unitlength
\ifdim \@ovyy<\z@ \@ovyy -\@ovyy \fi
- \@ovdy #7\unitlength
- \advance\@ovdy -#5\unitlength
+ \@defaultunitsset\@ovdy{#7}\unitlength
+ \@defaultunitsset{\advance\@ovdy}{-#5}\unitlength
\ifdim \@ovdy<\z@ \@ovdy -\@ovdy \fi
\ifdim \@ovyy<\@ovdy \@ovyy \@ovdy \fi
\@multicnt
\ifdim \@ovxx>\@ovyy \@ovxx \else \@ovyy \fi
\@ovxx .5\@halfwidth \divide\@multicnt\@ovxx
- \ifnum \qbeziermax<\@multicnt \@multicnt\qbeziermax\relax \fi
+ \ifnum \qbeziermax<\@multicnt
+ \@multicnt\qbeziermax\relax
+ \fi
\else \@multicnt#1\relax \fi
\@tempcnta\@multicnt \advance\@tempcnta\@ne
- \@ovdx #4\unitlength \advance\@ovdx -#2\unitlength
+ \@defaultunitsset\@ovdx{#4}\unitlength
+ \@defaultunitsset{\advance\@ovdx}{-#2}\unitlength
\multiply\@ovdx \tw@
- \@ovxx #6\unitlength \advance\@ovxx -#2\unitlength
+ \@defaultunitsset\@ovxx{#6}\unitlength
+ \@defaultunitsset{\advance\@ovxx}{-#2}\unitlength
\advance\@ovxx -\@ovdx \divide\@ovxx\@multicnt
- \@ovdy #5\unitlength \advance\@ovdy -#3\unitlength
+ \@defaultunitsset\@ovdy{#5}\unitlength
+ \@defaultunitsset{\advance\@ovdy}{-#3}\unitlength
\multiply\@ovdy \tw@
- \@ovyy #7\unitlength \advance\@ovyy -#3\unitlength
+ \@defaultunitsset\@ovyy{#7}\unitlength
+ \@defaultunitsset{\advance\@ovyy}{-#3}\unitlength
\advance\@ovyy -\@ovdy \divide\@ovyy\@multicnt
% \end{macrocode}
%
@@ -1536,6 +1931,67 @@
\hb@xt@\z@{\kern\@xdim
\unhcopy\@tempboxa\hss}%
\advance\count@\@ne}}}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@bezier}{default units}%
+%<latexrelease>\def\@bezier#1(#2,#3)(#4,#5)(#6,#7){%
+%<latexrelease> \ifnum #1=\z@
+%<latexrelease> \@ovxx #4\unitlength
+%<latexrelease> \advance\@ovxx -#2\unitlength
+%<latexrelease> \ifdim \@ovxx<\z@ \@ovxx -\@ovxx \fi
+%<latexrelease> \@ovdx #6\unitlength
+%<latexrelease> \advance\@ovdx -#4\unitlength
+%<latexrelease> \ifdim \@ovdx<\z@ \@ovdx -\@ovdx \fi
+%<latexrelease> \ifdim \@ovxx<\@ovdx \@ovxx \@ovdx \fi
+%<latexrelease> \@ovyy #5\unitlength
+%<latexrelease> \advance\@ovyy -#3\unitlength
+%<latexrelease> \ifdim \@ovyy<\z@ \@ovyy -\@ovyy \fi
+%<latexrelease> \@ovdy #7\unitlength
+%<latexrelease> \advance\@ovdy -#5\unitlength
+%<latexrelease> \ifdim \@ovdy<\z@ \@ovdy -\@ovdy \fi
+%<latexrelease> \ifdim \@ovyy<\@ovdy \@ovyy \@ovdy \fi
+%<latexrelease> \@multicnt
+%<latexrelease> \ifdim \@ovxx>\@ovyy \@ovxx \else \@ovyy \fi
+%<latexrelease> \@ovxx .5\@halfwidth \divide\@multicnt\@ovxx
+%<latexrelease> \ifnum
+%<latexrelease> \qbeziermax<\@multicnt \@multicnt\qbeziermax\relax
+%<latexrelease> \fi
+%<latexrelease> \else \@multicnt#1\relax \fi
+%<latexrelease> \@tempcnta\@multicnt \advance\@tempcnta\@ne
+%<latexrelease> \@ovdx #4\unitlength \advance\@ovdx -#2\unitlength
+%<latexrelease> \multiply\@ovdx \tw@
+%<latexrelease> \@ovxx #6\unitlength \advance\@ovxx -#2\unitlength
+%<latexrelease> \advance\@ovxx -\@ovdx \divide\@ovxx\@multicnt
+%<latexrelease> \@ovdy #5\unitlength \advance\@ovdy -#3\unitlength
+%<latexrelease> \multiply\@ovdy \tw@
+%<latexrelease> \@ovyy #7\unitlength \advance\@ovyy -#3\unitlength
+%<latexrelease> \advance\@ovyy -\@ovdy \divide\@ovyy\@multicnt
+%<latexrelease> \setbox\@tempboxa\hbox{%
+%<latexrelease> \hskip -\@halfwidth
+%<latexrelease> \vrule \@height\@halfwidth
+%<latexrelease> \@depth \@halfwidth
+%<latexrelease> \@width \@wholewidth}%
+%<latexrelease> \put(#2,#3){%
+%<latexrelease> \count@\z@
+%<latexrelease> \@whilenum{\count@<\@tempcnta}\do
+%<latexrelease> {\@xdim\count@\@ovxx
+%<latexrelease> \advance\@xdim\@ovdx
+%<latexrelease> \divide\@xdim\@multicnt
+%<latexrelease> \multiply\@xdim\count@
+%<latexrelease> \@ydim\count@\@ovyy
+%<latexrelease> \advance\@ydim\@ovdy
+%<latexrelease> \divide\@ydim\@multicnt
+%<latexrelease> \multiply\@ydim\count@
+%<latexrelease> \raise \@ydim
+%<latexrelease> \hb@xt@\z@{\kern\@xdim
+%<latexrelease> \unhcopy\@tempboxa\hss}%
+%<latexrelease> \advance\count@\@ne}}}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
% \end{macro}
diff --git a/Master/texmf-dist/source/latex/base/ltplain.dtx b/Master/texmf-dist/source/latex/base/ltplain.dtx
index 06602780664..7949b836d46 100644
--- a/Master/texmf-dist/source/latex/base/ltplain.dtx
+++ b/Master/texmf-dist/source/latex/base/ltplain.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltplain.dtx}
- [2017/04/10 v2.3c LaTeX Kernel (Plain TeX)]
+ [2020/08/20 v2.3d LaTeX Kernel (Plain TeX)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltplain.dtx}
@@ -691,12 +691,32 @@
% \end{macro}
%
% \begin{macro}{\alloc@}
+% \changes{v2.3d}{2020/08/20}
+% {Define \cs{alloc@} in terms of \cs{e@alloc}}
+% Since |\e@alloc| was added in 2015, |\@alloc| has not been used,
+% but was left as some legacy code calls it. However the original
+% defnition gives spurious errors once the ``classic'' registers
+% run out, so it is now defined to call |\e@alloc| internally.
% \begin{macrocode}
-\def\alloc@#1#2#3#4#5{\global\advance\count1#1\@ne
- \ch@ck#1#4#2%
- \allocationnumber\count1#1%
- \global#3#5\allocationnumber
- \wlog{\string#5=\string#2\the\allocationnumber}}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}
+%<latexrelease> {\alloc@}{emulate alloc@}%
+\def\alloc@#1#2#3#4{\e@alloc#2#3{\count1#1}#4\float@count}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\alloc@}{emulate alloc@}%
+%<latexrelease>\def\alloc@#1#2#3#4#5{\global\advance\count1#1\@ne
+%<latexrelease> \ch@ck#1#4#2%
+%<latexrelease> \allocationnumber\count1#1%
+%<latexrelease> \global#3#5\allocationnumber
+%<latexrelease> \wlog{\string#5=\string#2\the\allocationnumber}}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex/base/ltsect.dtx b/Master/texmf-dist/source/latex/base/ltsect.dtx
index 9ccd042fb4e..359b445f453 100644
--- a/Master/texmf-dist/source/latex/base/ltsect.dtx
+++ b/Master/texmf-dist/source/latex/base/ltsect.dtx
@@ -31,7 +31,7 @@
%%% From File: ltsect.dtx
%<*driver>
% \fi
-\ProvidesFile{ltsect.dtx}[2019/08/27 v1.1d LaTeX Kernel (Sectioning)]
+\ProvidesFile{ltsect.dtx}[2020/07/27 v1.1e LaTeX Kernel (Sectioning)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltsect.dtx}
@@ -137,20 +137,22 @@
%
% \begin{macro}{\author}
% \changes{LaTeX2e}{1993/12/11}{Added default}
+% \changes{v1.1e}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
%
% |\author| for use in |\maketitle|. If not given |\maketitle| will
% produce a warning message.
%
% \begin{macrocode}
-\DeclareRobustCommand\author[1]{\gdef\@author{#1}}
+\DeclareRobustCommand*\author[1]{\gdef\@author{#1}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\date}
% |\date| for use in |\maketitle|. If not given |\maketitle| will
% produce |\today| as the default.
+% \changes{v1.1e}{2020/07/27}{Don't make the command \cs{long} (gh/354)}
% \begin{macrocode}
-\DeclareRobustCommand\date[1]{\gdef\@date{#1}}
+\DeclareRobustCommand*\date[1]{\gdef\@date{#1}}
% \end{macrocode}
% \end{macro}
%
@@ -776,20 +778,33 @@
% \cs{addcontentsline}. ASAJ.}
% \changes{v1.1c}{2018/09/26}{Sometimes mask the endline char when
% writing to files (github/73)}
+% \changes{v1.1e}{2020/10/01}{add a fourth argument for better
+% hyperref compability}
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\addcontentsline}{fourth argument}%
+\def\addcontentsline#1#2#3{%
+% \end{macrocode}
+% We add an empty brace pair at the end of \cs{contentsline}
+% so that the number of argument is identical in documents
+% with and without hyperref.
+% \begin{macrocode}
+ \addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}{}%
+ \protected@file@percent}}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{2018/12/01}%
%<latexrelease> {\addcontentsline}{Mask line endings}%
-\def\addcontentsline#1#2#3{%
- \addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}%
+%<latexrelease> \def\addcontentsline#1#2#3{%
+%<latexrelease> \addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}%
% \end{macrocode}
% We add \cs{protected@file@percent} at the end which is turned inside
% \cs{@writefile} into a percent character to mask the newline after
% the closing argument brace.
% \begin{macrocode}
- \protected@file@percent}}
-%</2ekernel|latexrelease>
+%<latexrelease> \protected@file@percent}}
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\addcontentsline}{Mask line endings}%
diff --git a/Master/texmf-dist/source/latex/base/ltshipout.dtx b/Master/texmf-dist/source/latex/base/ltshipout.dtx
new file mode 100644
index 00000000000..e226f753f35
--- /dev/null
+++ b/Master/texmf-dist/source/latex/base/ltshipout.dtx
@@ -0,0 +1,1751 @@
+% \iffalse meta-comment
+%%
+%% File: ltshipout.dtx (C) Copyright 2020 Frank Mittelbach, LaTeX Team
+%%
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+%
+% \iffalse
+%
+%%% From File: ltshipout.dtx
+%
+% \begin{macrocode}
+\providecommand\ltshipoutversion{v1.0d}
+\providecommand\ltshipoutdate{2020/11/24}
+% \end{macrocode}
+%
+%<*driver>
+
+\documentclass{l3doc}
+
+% bug fix fo l3doc.cls
+\ExplSyntaxOn
+\cs_set_protected:Npn \__codedoc_macro_typeset_one:nN #1#2
+ {
+ \vbox_set:Nn \l__codedoc_macro_box
+ {
+ \vbox_unpack_drop:N \l__codedoc_macro_box
+ \hbox { \llap { \__codedoc_print_macroname:nN {#1} #2
+ \MacroFont % <----- without it the \ is in lmr10 if a link is made
+ \
+ } }
+ }
+ \int_incr:N \l__codedoc_macro_int
+ }
+\ExplSyntaxOff
+
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{ltshipout.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \long\def\fmi#1{\begin{quote}\itshape Todo: #1\end{quote}}
+%
+% \providecommand\hook[1]{\texttt{#1}}
+% \providecommand\pkg[1]{\texttt{#1}}
+%
+%
+% \title{The \texttt{ltshipout} package\thanks{This package has version
+% \ltshipoutversion\ dated \ltshipoutdate, \copyright\ \LaTeX\
+% Project.}}
+%
+% \author{Frank Mittelbach}
+%
+% \maketitle
+%
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% The code provides an interface to the \cs{shipout} primitive of
+% \TeX{} which is called when a finished pages is finally
+% \enquote{shipped out} to the target output file, e.g., the
+% \texttt{.dvi} or \texttt{.pdf} file.
+% A good portion of the code is based on ideas by Heiko Oberdiek
+% implemented in his packages \pkg{atbegshi} and \pkg{atenddvi}
+% even though the interfaces are somewhat
+% different.\footnote{Heiko's interfaces are emulated by the kernel
+% code, if a document requests his packages, so older documents
+% will continue to work.}
+%
+% \subsection{Overloading the \cs{shipout} primitive}
+%
+%
+% \begin{function}{\shipout}
+% With this implementation \TeX's shipout primitive is no longer
+% available for direct use. Instead \cs{shipout} is running some
+% (complicated) code that picks up the box to be shipped out
+% regardless of how that is done, i.e., as a constructed \cs{vbox}
+% or \cs{hbox} or as a box register.
+%
+% It then stores it in a named box register. This box can then be
+% manipulated through a set of hooks after which it is shipped out
+% for real.
+% \end{function}
+%
+% \begin{variable}{\ShipoutBox,\l_shipout_box}
+% This box register is called \cs{ShipoutBox} (alternatively available via the
+% L3 name \cs{l_shipout_box}).
+% \end{variable}
+%
+%
+% \begin{variable}{\l_shipout_box_ht_dim,
+% \l_shipout_box_dp_dim,\l_shipout_box_wd_dim,
+% \l_shipout_box_ht_plus_dp_dim}
+% The shipout box dimensions are available in the L3 registers
+% \cs{l_shipout_box_ht_dim}, etc.\ (there are no \LaTeXe{}
+% names).\footnotemark{} These variables can be used
+% inside the hook code for \hook{shipout/before},
+% \hook{shipout/foreground} and \hook{shipout/background} if needed.
+% \end{variable}
+% \footnotetext{Might need changing, but HO's version as strings
+% is not really helpful I think).}
+%
+%
+%
+%
+% \subsection{Provided hooks}
+%
+% \begin{variable}{shipout/before,
+% shipout/foreground,shipout/background,
+% shipout/firstpage,
+% shipout/lastpage}
+% The code offers a number of hooks into which packages (or the
+% user) can add code to support different use cases.
+% These are:
+% \begin{description}
+% \item[\hook{shipout/before}]
+%
+% This hook is executed after the finished page has been stored in
+% \cs{ShipoutBox} / \cs{l_shipout_box}).
+% It can be used to alter that box content or to discard it
+% completely (see \cs{DiscardShipoutBox} below).
+%
+% \item[\hook{shipout/background}]
+%
+% This hook adds a picture environment into the background of
+% the page with the \texttt{(0,0)} coordinate in the top-left
+% corner using a \cs{unitlength} of \texttt{1pt}.
+%
+% It should therefore only receive \cs{put} commands or other
+% commands suitable in a \texttt{picture} environment and the
+% vertical coordinate values would normally be
+% negative.
+%
+% Technically this is implemented by adding a zero-sized
+% \cs{hbox} as the very first item into the \cs{ShipoutBox}
+% containing that \texttt{picture} environment. Thus the rest of
+% the box content will overprint what ever is typeset by that hook.
+%
+%
+% \item[\hook{shipout/foreground}]
+%
+% This hook adds a picture environment into the foreground of
+% the page with the \texttt{(0,0)} coordinate in the top-left
+% corner using a \cs{unitlength} of \texttt{1pt}.
+%
+% Technically this is implemented by adding a zero-sized
+% \cs{hbox} as the very last item into the \cs{ShipoutBox} and
+% raising it up so that it still has its \texttt{(0,0)} point in
+% the top-left corner.
+% But being placed after the main box content it will be typeset
+% later and thus overprints it (i.e., is in the foreground).
+%
+%
+% \item[\hook{shipout/firstpage}]
+%
+% The material from this hook is executed only once at the very
+% beginning of the first output page that is shipped out (i.e.,
+% not discarded at the last minute). It should only contain
+% \cs{special} or similar commands needed to direct post processors
+% handling the \texttt{.dvi} or \texttt{.pdf} output.\footnotemark
+%
+% ^^A \fmi{not sure it has to be that restrictive.}
+%
+%
+% \item[\hook{shipout/lastpage}]
+%
+% The corresponding hook to add \cs{special}s at the very end of
+% the output file. It is only executed on the very last page ---
+% or rather on the page that \LaTeX{} believes is the last one.
+%
+% It may not be possible for \LaTeX{} to correctly determine
+% which page is the last one without several reruns. If this
+% happens and the hook is non-empty then \LaTeX{} will add an
+% extra page to place the material and also request a rerun to
+% get the correct placement sorted out.
+%
+% \end{description}
+% \end{variable}\footnotetext{In
+% \LaTeXe{} that was already existing, but implemented using a box
+% register with the name \cs{@begindvibox}.}
+%
+% As mentioned above the hook \hook{shipout/before} is executed
+% first and can manipulate the prepared shipout box stored in
+% \cs{ShipoutBox} or set things up for use in \cs{write} during the
+% actual shipout. The other hooks are added inside hboxes to the
+% box being shipped out in the following
+% order:
+% \begin{center}
+% \begin{tabular}{ll}
+% \hook{shipout/firstpage} & only on the first page \\
+% \hook{shipout/background} & \\
+% \meta{boxed content of \cs{ShipoutBox}} & \\
+% \hook{shipout/foreground} & \\
+% \hook{shipout/lastpage} & only on the last page \\
+% \end{tabular}
+% \end{center}
+% If any of the hooks has no code then that particular no box is
+% added at that point.
+%
+% In a document that doesn't produce pages, e.g., only makes
+% \cs{typeout}s, none of the hooks are executed (as there is no
+% \cs{shipout}) not even the \hook{shipout/lastpage} hook.
+%
+% \begin{function}{\AtBeginDvi,\AtEndDvi}
+% \cs{AtBeginDvi} is the existing \LaTeXe{} interface to fill the
+% \hook{shipout/firstpage} hook. This is not really a good name
+% as it is not just supporting \texttt{.dvi} but also \texttt{.pdf}
+% output or \texttt{.dvx}.
+%
+% \cs{AtEndDvi} is the counterpart that was not available in the
+% kernel but only through the package \pkg{atenddvi}. It fills the
+% \hook{shipout/lastpage} hook.
+%
+% \fmi{better names? Any suggestions?}
+%
+% \end{function}
+%
+% \subsection{Special commands for use inside the hooks}
+%
+% \begin{function}{\DiscardShipoutBox,\shipout_discard_box:}
+% \begin{syntax}
+% \cs{AddToHookNext} \texttt{\{shipout/before\} \{...\cs{DiscardShipoutBox}...\}}
+% \end{syntax}
+% The \cs{DiscardShipoutBox} declaration (L3 name
+% \cs{shipout_discard_box:})
+% requests that on the next
+% shipout the page box is thrown away instead of being shipped to
+% the \texttt{.dvi} or \texttt{.pdf} file.
+%
+% Typical applications wouldn't do this unconditionally, but have
+% some processing logic that decides to use or not to use the page.
+%
+% Note that if this declaration is used directly in the document it
+% may depend on the placement to which page it applies, given that
+% \LaTeX{} output routine is called in an asynchronous manner!
+%
+% \fmi{Once we have a new mark mechanism available we can improve
+% on that and make sure that the declaration applies to the page
+% that contains it.}
+% \end{function}
+%
+% In the \pkg{atbegshi} package there are a number of additional
+% commands for use inside the \hook{shipout/before} hook. They
+% should normally not be needed any more as one can instead simply
+% add code to the hooks \hook{shipout/before},
+% \hook{shipout/background} or
+% \hook{shipout/foreground}.\footnote{If that assumption turns out to
+% be wrong it would be trivial to change them to public functions
+% (right now they are private).} If \pkg{atbegshi} gets loaded then
+% those commands become available as public functions with their original
+% names as given below.
+%
+%
+% \subsection{Information counters}
+%
+%
+% \begin{variable}{\ReadonlyShipoutCounter,\g_shipout_readonly_int}
+% \begin{syntax}
+% \cs{ifnum}\cs{ReadOnlyShipoutCounter}\texttt{=...}
+% \cs{int_use:N} \cs{g_shipout_readonly_int} \texttt{\% expl3 usage}
+% \end{syntax}
+% This integer holds the number of pages shipped out up to now
+% (including the one to be shipped out when inside the output
+% routine). More precisely, it is incremented only after it is
+% clear that a page will be shipped out, i.e., after the
+% \hook{shipout/before} hook (because that might discard the page)!
+%
+% Just like with the \texttt{page} counter its value is
+% only accurate within the output routine. In the body of the
+% document it may be off by one as the output routine is called
+% asynchronously!
+%
+% Also important: it \emph{must not} be set, only read. There are
+% no provisions to prevent that but if you do, chaos will be the
+% result. To emphasize this fact it is not provided as a \LaTeX{}
+% counter but as a \TeX{} counter (i.e., a command), so
+% \cs{Alph}\Arg{\cs{ReadonlyShipoutCounter}} etc, would not work.
+% \end{variable}
+%
+% \begin{variable}{totalpages,\g_shipout_totalpages_int}
+% \begin{syntax}
+% \cs{arabic}\texttt{\{totalpages\}}
+% \cs{int_use:N} \cs{g_shipout_totalpage_int} \texttt{\% expl3 usage}
+% \end{syntax}
+% In contrast to \cs{ReadonlyShipoutCounter}, the
+% \texttt{totalpages} counter is a \LaTeX{} counter and incremented
+% for each shipout attempt including those pages that are discarded
+% for one or the other reason. Again \hook{shipout/before} sees
+% the counter before it is incremented).
+%
+% Furthermore, while it is incremented for each page, its value is
+% never used by \LaTeX. It can therefore be freely reset or changed by user
+% code, for example, to additionally count a number of pages that
+% are not build by \LaTeX\ but are added in a later part of the
+% process, e.g., cover pages or picture pages made externally.
+%
+% Important: as this is a page-related counter its value is only
+% reliable inside the output routine!
+% \end{variable}
+%
+% \begin{variable}{\PreviousTotalPages}
+% \begin{syntax}
+% \cs{thetotalpages}/\cs{PreviousTotalPages}
+% \end{syntax}
+% Command that expands to the number of total pages from the
+% previous run. If there was no previous run or if usedin the
+% preamble it expands to
+% \texttt{0}. Note that this is a command to a counter, so in order
+% to display the number in, say, Roman numerals you have to assign
+% its value to a counter and then use \cs{Roman} on that counter.
+% \end{variable}
+%
+%
+% \subsection{Debugging shipout code}
+%
+% \begin{function}{\DebugShipoutsOn,\DebugShipoutsOff,
+% \shipout_debug_on:,\shipout_debug_off:}
+% \begin{syntax}
+% \cs{DebugShipoutsOn}
+% \end{syntax}
+% Turn the debugging of shipout code on or off. This displays
+% changes made to the shipout data structures. \fmi{This needs
+% some rationalizing and may not stay this way.}
+% \end{function}
+%
+%
+%
+%
+% \section{Emulating commands from other packages}
+%
+% The packages in this section are no longer necessary but as they
+% are used in other packages they are emulated when they are loaded
+% via \cs{usepackage} or \cs{RequirePackage}.
+%
+%
+% \subsection{Emulating \pkg{atbegshi}}
+%
+%
+% \begin{function}{\AtBeginShipoutUpperLeft,\AtBeginShipoutUpperLeftForeground}
+% \begin{syntax}
+% \cs{AddToHook} \texttt{\{shipout/before\} \{...\cs{AtBeginShipoutUpperLeft}}\Arg{code}\texttt{...\}}
+% \end{syntax}
+% This adds a \texttt{picture} environment into the background of the shipout
+% box expecting \meta{code} to contain \texttt{picture}
+% commands. The same effect can be obtained by simply using kernel
+% features as follows:
+% \begin{quote}
+% \cs{AddToHook}\texttt{\{shipout/background\}}\Arg{code}
+% \end{quote}
+% There is one technical difference: if
+% \cs{AtBeginShipoutUpperLeft} is used several times each
+% invocation is put into its own box inside the shipout box whereas
+% all \meta{code} going into \hook{shipout/background} ends up
+% all in the same box in the order it is added or sorted based on
+% the rules for the hook chunks.
+%
+% \cs{AtBeginShipoutUpperLeftForeground} is similar with the
+% difference that the \texttt{picture} environment is placed in the
+% foreground. To model it with the kernel functions use the hook
+% \hook{shipout/foreground} instead.
+% \end{function}
+%
+%
+% \begin{function}{\AtBeginShipoutAddToBox,\AtBeginShipoutAddToBoxForeground}
+% \begin{syntax}
+% \cs{AddToHook} \texttt{\{shipout/before\} \{...\cs{AtBeginShipoutAddToBox}}\Arg{code}\texttt{...\}}
+% \end{syntax}
+% These work like \cs{AtBeginShipoutUpperLeft} and
+% \cs{AtBeginShipoutUpperLeftForeground} with the difference that
+% \meta{code} is directly placed into an \cs{hbox} inside the
+% shipout box and not surrounded by a \texttt{picture} environment.
+%
+% To emulate them using \hook{shipout/background} or
+% \hook{shipout/foreground} you may have to wrap \meta{code} into
+% a \cs{put} statement but if the code is not doing any typesetting
+% just adding it to the hook should be sufficient.
+% \end{function}
+%
+%
+%
+% \begin{function}{\AtBeginShipoutBox}
+% This is the name of the shipout box as \pkg{atbegshi} knows it.
+% \end{function}
+%
+% \begin{function}{\AtBeginShipoutInit}
+% By default \pkg{atbegshi} delayed its action until
+% \verb=\begin{document}=. This command was forcing it in an earlier
+% place. With the new concept it does nothing.
+% \end{function}
+%
+% \begin{function}{\AtBeginShipout,\AtBeginShipoutNext}
+% \begin{syntax}
+% \cs{AtBeginShipout}\Arg{code} $\equiv$ \cs{AddToHook}\texttt{\{shipout/before\}}\Arg{code}
+% \cs{AtBeginShipoutNext}\Arg{code} $\equiv$ \cs{AddToHookNext}\texttt{\{shipout/before\}}\Arg{code}
+% \end{syntax}
+% This is equivalent to filling the \hook{shipout/before} hook
+% by either using \cs{AddToHook} or \cs{AddToHookNext}, respectively.
+% \end{function}
+%
+% \begin{function}{\AtBeginShipoutFirst,\AtBeginShipoutDiscard}
+% The \pkg{atbegshi} names for \cs{AtBeginDvi} and \cs{DiscardShipoutBox}.
+% \end{function}
+%
+%
+%
+%
+% \subsection{Emulating \pkg{everyshi}}
+%
+%
+% \begin{function}{\EveryShipout}
+% \begin{syntax}
+% \cs{EveryShipout}\Arg{code} $\equiv$ \cs{AddToHook}\texttt{\{shipout/before\}}\Arg{code}
+% \end{syntax}
+% \end{function}
+%
+% \begin{function}{\AtNextShipout}
+% \begin{syntax}
+% \cs{AtNextShipout}\Arg{code} $\equiv$ \cs{AddToHookNext}\texttt{\{shipout/before\}}\Arg{code}
+% \end{syntax}
+% \end{function}
+%
+%
+%
+% \subsection{Emulating \pkg{atenddvi}}
+%
+% The \pkg{atenddvi} package implemented only a single command:
+% \cs{AtEndDvi} and that is now available out of the box.
+%
+%
+%
+% \subsection{Emulating \pkg{everypage}}
+%
+% This page takes over the original \cs{@begindvi} hook and replaces
+% it. It should be all covered by the hooks offered here (details
+% need checking) and thus could simply use the provided hooks
+% rather than defining its own.
+%
+%
+%
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+% \begin{macrocode}
+%<@@=shipout>
+% \end{macrocode}
+%
+% At the moment the whole module rolls back in one go, but if we
+% make any modifications in later releases this will then need
+% splitting.
+% \begin{macrocode}
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\shipout}{Hook mangement (shipout)}%
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+%
+% \subsection{Debugging}
+%
+% \begin{macro}{\g_@@_debug_bool}
+% Holds the current debugging state.
+% \begin{macrocode}
+\bool_new:N \g_@@_debug_bool
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\shipout_debug_on:,\shipout_debug_off:}
+% \begin{macro}{\@@_debug:n}
+% \begin{macro}{\@@_debug_gset:}
+% Turns debugging on and off by redefining \cs{@@_debug:n}.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_debug:n \use_none:n
+\cs_new_protected:Npn \shipout_debug_on:
+ {
+ \bool_gset_true:N \g_@@_debug_bool
+ \@@_debug_gset:
+ }
+\cs_new_protected:Npn \shipout_debug_off:
+ {
+ \bool_gset_false:N \g_@@_debug_bool
+ \@@_debug_gset:
+ }
+\cs_new_protected:Npn \@@_debug_gset:
+ {
+ \cs_gset_protected:Npx \@@_debug:n ##1
+ { \bool_if:NT \g_@@_debug_bool {##1} }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%
+% \begin{macro}{\ShipoutBox,\l_shipout_box}
+% The box filled with the page to be shipped out (both L3 and
+% \LaTeXe{} name).
+% \begin{macrocode}
+\box_new:N \l_shipout_box
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set_eq:NN \ShipoutBox \l_shipout_box
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\@@_execute:}
+% This is going to the be the code run by \cs{shipout}. The code
+% follows closely the ideas from \pkg{atbegshi}, so not
+% documenting that here for now.
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_execute: {
+ \tl_set:Nx \l_@@_group_level_tl
+ { \int_value:w \tex_currentgrouplevel:D }
+ \tex_afterassignment:D \@@_execute_test_level:
+ \tex_setbox:D \l_shipout_box
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\shipout}
+% Overloading the \cs{shipout} primitive:
+% \begin{macrocode}
+\cs_gset_eq:NN \shipout \@@_execute:
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\l_@@_group_level_tl}
+% Helper token list to record the group level at which
+% \cs{@@_execute:} is encountered. \begin{macrocode}
+\tl_new:N \l_@@_group_level_tl
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_execute_test_level:}
+% If the group level has changed then we are still constructing
+% \cs{l_shipout_box} and to continue we need to wait until the
+% current group has finished, hence the \cs{tex_aftergroup:D}.
+% \begin{macrocode}
+\cs_new:Npn \@@_execute_test_level: {
+ \int_compare:nNnT
+ \l_@@_group_level_tl < \tex_currentgrouplevel:D
+ \tex_aftergroup:D
+ \@@_execute_cont:
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_execute_cont:}
+% When we have reached this point the shipout box has been
+% processed and is available in \cs{l_shipout_box} and ready for
+% real ship out (perhaps)..
+%
+% First we quickly check if it is void (can't happen in the
+% standard \LaTeX{} output routine but \cs{shipout} might be called
+% from a package that has some special processing logic). If it is
+% void we aren't shipping anything out and processing ends.\footnote{In that
+% case we don't reset the deadcyles, that would be up to the OR
+% processing logic to do.}
+% \begin{macrocode}
+\cs_new:Npn \@@_execute_cont: {
+ \box_if_empty:NTF \l_shipout_box
+ { \PackageWarning{ltshipout}{Ignoring~ void~ shipout~ box} }
+ {
+% \end{macrocode}
+% Otherwise we assume that we will ship something and prepare for
+% final adjustments (in particular setting the state of
+% \cs{protect} while we are running the hook code).
+% We also save the current \cs{protect} state to restore it later.
+% \begin{macrocode}
+ \bool_gset_false:N \g_@@_discard_bool
+ \cs_set_eq:NN \@@_saved_protect: \protect
+ \set@typeset@protect
+% \end{macrocode}
+% We also store the current shipout box dimension in registers, so that
+% they can be used in the hook code.\footnote{This is not really
+% necessary as the code could access them via \cs{box_ht:N}, etc.,
+% but it is perhaps convenient.}
+% \begin{macrocode}
+ \@@_get_box_size:N \l_shipout_box
+% \end{macrocode}
+% Then we execute the \hook{shipout/before} hook.
+% \begin{macrocode}
+ \hook_use:n {shipout/before}
+% \end{macrocode}
+% In \cs{g_shipout_totalpages_int} we count all shipout attempts so
+% we increment that counter already here (the other one is
+% incremented later when we know for sure that we do a
+% \cs{shipout}.
+%
+% We increment it after running the above hook so that the values
+% for \cs{g_shipout_totalpages_int} and \cs{} are in sync while the
+% hook is executed (in the case that totalpages isn't manually
+% altered or through discarding pages that is).
+% \begin{macrocode}
+ \int_gincr:N \g_shipout_totalpages_int
+% \end{macrocode}
+% The above hook might contain code that requests the page to be discarded so
+% we now test for it.
+% \begin{macrocode}
+ \bool_if:NTF \g_@@_discard_bool
+ { \PackageInfo{ltshipout}{Completed~ page~ discarded}
+ \bool_gset_false:N \g_@@_discard_bool
+% \end{macrocode}
+% As we are discarding the page box and not shipping anything out,
+% we need to do some house cleaning and reset \TeX's deadcycles so
+% that it doesn't complain about too many calls to the OR without
+% any shipout.
+% \begin{macrocode}
+ \tex_deadcycles:D \c_zero_int
+% \end{macrocode}
+% \fmi{In \pkg{atbegshi} the box was dropped but is that actually
+% needed? Or the resetting of \cs{protect} to its kernel value?}
+% \begin{macrocode}
+% \group_begin:
+% \box_set_eq_drop:NN \l_shipout_box \l_shipout_box
+% \group_end:
+% \cs_set_eq:NN \protect \exp_not:N
+ }
+% \end{macrocode}
+% Even if there was no explicit request to discard the box it is
+% possible that the code for the hook \hook{shipout/before} has
+% voided the box (by mistake or deliberately). We therefore test
+% once more but this time make it a warning, because the best
+% practice way is to use the request mechanism.
+% \begin{macrocode}
+ { \box_if_empty:NTF \l_shipout_box
+ { \PackageWarning{ltshipout}{
+ Shipout~ box~ was~ voided~ by~ hook,\MessageBreak
+ ignoring~ shipout~ box }
+ }
+% \end{macrocode}
+% Finally, if the box is still non-empty we are nearly ready to
+% ship it out.
+% First we increment the total page counter so that we can later
+% test if we have reached the final page according to our available
+% information.\footnote{Doing that earlier would be wrong because we
+% might end up with the last page counted but discard and then we
+% have no place to add the final objects into the output file.}
+% \begin{macrocode}
+ {
+ \int_gincr:N \g_shipout_readonly_int
+ \@@_debug:n {
+ \typeout{Absolute~ page~ =~ \int_use:N \g_shipout_readonly_int
+ \space (target:~ \@abspage@last)}
+ }
+% \end{macrocode}
+% Then we store the box sizes again (as they may have
+% changed) and then look at the hooks \hook{shipout/foreground}
+% and \hook{shipout/background}. If either or both are non-empty
+% we add a \texttt{picture} environment to the box (in the
+% foreground and or in the background) and execute the hook code
+% inside that environment.
+%
+% \begin{macrocode}
+ \@@_get_box_size:N \l_shipout_box
+ \hook_if_empty:nF {shipout/foreground}
+ { \@@_add_foreground_picture:n
+ { \hook_use:n {shipout/foreground} } }
+ \hook_if_empty:nF {shipout/background}
+ { \@@_add_background_picture:n
+ { \@kernel@before@shipout@background
+ \hook_use:n {shipout/background} } }
+% \end{macrocode}
+% We then run \cs{@@_execute_firstpage_hook:} that adds
+% the content of the hook \hook{shipout/firstpage} to the
+% start of the first page (if non-empty). It is then redefined to
+% do nothing on later pages.
+% \begin{macrocode}
+ \@@_execute_firstpage_hook:
+% \end{macrocode}
+% The we check if we have to add the \hook{shipout/lastpage} hook
+% because we have reached the last page. This test will be false for
+% all but one (and hopefully the correct) page.
+% \begin{macrocode}
+ \int_compare:nNnT \@abspage@last = \g_shipout_readonly_int
+ { \hook_if_empty:nF {shipout/lastpage}
+ { \@@_debug:n { \typeout{Executing~ lastpage~ hook~
+ on~ page~ \int_use:N \g_shipout_readonly_int } }
+ \_@@_add_foreground_box:n { \UseHook{shipout/lastpage}
+ \@kernel@after@shipout@lastpage }
+ }
+ \bool_gset_true:N \g_@@_lastpage_handled_bool
+ }
+% \end{macrocode}
+% Finally we run the actual \TeX{} primitive for shipout. As that will
+% expand delayed \cs{write} statements inside the page in which
+% protected commands should not expand we first change \cs{protect}
+% to the appropriate definition for that case.
+% \begin{macrocode}
+ \cs_set_eq:NN \protect \exp_not:N
+ \tex_shipout:D \box_use:N \l_shipout_box
+ }
+ }
+% \end{macrocode}
+% Restore the value of \cs{protect} in case \cs{shipout} is called
+% outside of the output routine (where it is automatically restored
+% because of the implicit group).
+% \begin{macrocode}
+ \cs_set_eq:NN \protect \@@_saved_protect:
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_saved_protect:}
+% Remeber the current \cs{protect} state.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_saved_protect: \protect
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{shipout/before,
+% shipout/foreground,shipout/background,
+% shipout/firstpage,
+% shipout/lastpage}
+% Declaring all hooks for the shipout code.
+% \begin{macrocode}
+\hook_new:n{shipout/before}
+\hook_new:n{shipout/foreground}
+\hook_new:n{shipout/background}
+\hook_new:n{shipout/firstpage}
+\hook_new:n{shipout/lastpage}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@kernel@after@shipout@lastpage,
+% \@kernel@before@shipout@background}
+% And here are the internal kernel hooks going before or after the
+% public ones where needed.
+% \begin{macrocode}
+\let\@kernel@after@shipout@lastpage\@empty
+\let\@kernel@before@shipout@background\@empty
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_execute_firstpage_hook: }
+% This command adds any specials into a box and adds that to the
+% very beginning of the first box shipped out. After that we
+% redefine it to do nothing on later pages.
+% \begin{macrocode}
+\cs_new:Npn \@@_execute_firstpage_hook: {
+% \end{macrocode}
+% Adding something to the beginning means adding it to the
+% background as that layer is done first in the output. Of course
+% that is only needed if the hook actually contains anything.
+% \begin{macrocode}
+ \hook_if_empty:nF {shipout/firstpage}
+ { \@@_add_background_box:n { \UseHook{shipout/firstpage} } }
+% \end{macrocode}
+% Once we are here we change the definition to do nothing next time
+% and we also change the command used to implement \cs{AtBeginDvi}
+% to become a warning and not add further material to a hook that
+% is never used again.
+% \begin{macrocode}
+ \cs_gset_eq:NN \@@_execute_firstpage_hook: \prg_do_nothing:
+ \cs_gset:Npn \@@_add_firstpage_material:Nn ##1 ##2 {
+ \@latex@warning{
+ First~ page~ is~ already~ shipped~ out,~ ignoring\MessageBreak
+ \string##1 }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\g_@@_lastpage_handled_bool}
+% A boolean to signal if we have already handled the
+% \hook{shipout/lastpage} hook.
+% \begin{macrocode}
+\bool_new:N \g_@@_lastpage_handled_bool
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_add_firstpage_material:Nn}
+% This command adds material to the
+% \hook{shipout/firstpage} hook. It is used in
+% \cs{AtBeginDvi}, etc. The first argument is the
+% command through which is it called. Initially this is ignored but
+% once we are passed the first page it can be used to generate a
+% warning message mentioning the right user command.
+% \begin{macrocode}
+\cs_new:Npn \@@_add_firstpage_material:Nn #1#2 {
+ \AddToHook{shipout/firstpage}{#2}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+%
+%
+% \begin{macro}{\@@_get_box_size:N}
+% Store the box dimensions in dimen registers.
+% \fmi{This could/should perhaps be generalized to set height depth and
+% width given an arbitrary box.}
+% \begin{macrocode}
+\cs_new:Npn \@@_get_box_size:N #1 {
+ \dim_set:Nn \l_shipout_box_ht_dim { \box_ht:N #1 }
+ \dim_set:Nn \l_shipout_box_dp_dim { \box_dp:N #1 }
+ \dim_set:Nn \l_shipout_box_wd_dim { \box_wd:N #1 }
+ \dim_set:Nn \l_shipout_box_ht_plus_dp_dim { \l_shipout_box_ht_dim +
+ \l_shipout_box_dp_dim }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_shipout_box_ht_dim,
+% \l_shipout_box_dp_dim,\l_shipout_box_wd_dim,
+% \l_shipout_box_ht_plus_dp_dim}
+% And here are the variables set by \cs{@@_get_box_size:N}.
+% \begin{macrocode}
+\dim_new:N \l_shipout_box_ht_dim
+\dim_new:N \l_shipout_box_dp_dim
+\dim_new:N \l_shipout_box_wd_dim
+\dim_new:N \l_shipout_box_ht_plus_dp_dim
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+% \begin{macro}{\g_@@_discard_bool}
+% Indicate whether or not the current page box should be discarded
+% \begin{macrocode}
+\bool_new:N \g_@@_discard_bool
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\l_@@_tmp_box,\l_@@_saved_badness_tl}
+% We need a box for the background and foreground material and a
+% token register to remember badness settings as we disable them
+% during te buildup below.
+% \begin{macrocode}
+\box_new:N \l_@@_tmp_box
+\tl_new:N \l_@@_saved_badness_tl
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_add_background_box:n}
+% In standard \LaTeX{} the shipout box is always a \cs{vbox} but
+% here we are allow for other usage as well, in case some package
+% has its own output routine.
+% \begin{macrocode}
+\cs_new:Npn \@@_add_background_box:n #1
+{ \@@_get_box_size:N \l_shipout_box
+% \end{macrocode}
+% But we start testing for a vertical box as that should be the
+% normal case.
+% \begin{macrocode}
+ \box_if_vertical:NTF \l_shipout_box
+ {
+% \end{macrocode}
+% Save current values of \cs{vfuzz} and \cs{vbadness} then change
+% them to allow box manipulations without warnings.
+% \begin{macrocode}
+ \tl_set:Nx \l_@@_saved_badness_tl
+ { \vfuzz=\the\vfuzz\relax
+ \vbadness=\the\vbadness\relax }
+ \vfuzz=\c_max_dim
+ \vbadness=\c_max_int
+% \end{macrocode}
+% Then we reconstruct \cs{l_shipout_box} \ldots
+% \begin{macrocode}
+ \vbox_set_to_ht:Nnn \l_shipout_box \l_shipout_box_ht_plus_dp_dim
+ {
+% \end{macrocode}
+% \ldots{} the material in \verb=#1= is placed into a horizontal
+% box with zero dimensions.
+% \begin{macrocode}
+ \hbox_set:Nn \l_@@_tmp_box
+ { \l_@@_saved_badness_tl #1 }
+ \box_set_wd:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_ht:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_dp:Nn \l_@@_tmp_box \c_zero_dim
+% \end{macrocode}
+% The we typeset that box followed by whatever was in
+% \cs{l_shipout_box} before (unpacked).
+% \begin{macrocode}
+ \skip_zero:N \baselineskip
+ \skip_zero:N \lineskip
+ \skip_zero:N \lineskiplimit
+ \box_use:N \l_@@_tmp_box
+ \vbox_unpack:N \l_shipout_box
+% \end{macrocode}
+% The \cs{kern} ensures that the box has no depth which is
+% afterwards explicitly corrected.
+% \begin{macrocode}
+ \kern \c_zero_dim
+ }
+ \box_set_ht:Nn \l_shipout_box \l_shipout_box_ht_dim
+ \box_set_dp:Nn \l_shipout_box \l_shipout_box_dp_dim
+% \end{macrocode}
+% \fmi{The whole boxing maneuver looks a bit like overkill to me, but for
+% the moment I leave.}
+% \begin{macrocode}
+ \l_@@_saved_badness_tl
+ }
+ {
+% \end{macrocode}
+% A horizontal box is handled in a similar way. The last case would
+% be a void box in which case we do nothing hence the missing
+% \texttt{F} branch.
+% \begin{macrocode}
+ \box_if_horizontal:NT \l_shipout_box
+ {
+ \tl_set:Nx \l_@@_saved_badness_tl
+ { \hfuzz=\the\hfuzz\relax
+ \hbadness=\the\hbadness\relax }
+ \hfuzz=\c_max_dim
+ \hbadness=\c_max_int
+ \hbox_set_to_wd:Nnn \l_shipout_box \l_shipout_box_wd_dim
+ {
+ \hbox_set:Nn \l_@@_tmp_box
+ { \l_@@_saved_badness_tl #1 }
+ \box_set_wd:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_ht:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_dp:Nn \l_@@_tmp_box \c_zero_dim
+ \box_move_up:nn
+ \l_shipout_box_ht_dim
+ { \box_use:N \l_@@_tmp_box }
+ \hbox_unpack:N \l_shipout_box
+ }
+ \l_@@_saved_badness_tl
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\@@_add_foreground_box:n}
+% Foreground boxes are done in the same way, only the order and
+% placement of boxes has to be done differently.
+% \begin{macrocode}
+\cs_new:Npn \@@_add_foreground_box:n #1
+{
+ \box_if_vertical:NTF \l_shipout_box
+ {
+ \tl_set:Nx \l_@@_saved_badness_tl
+ { \vfuzz=\the\vfuzz\relax
+ \vbadness=\the\vbadness\relax }
+ \vfuzz=\c_max_dim
+ \vbadness=\c_max_int
+ \vbox_set_to_ht:Nnn \l_shipout_box \l_shipout_box_ht_plus_dp_dim
+ {
+ \hbox_set:Nn \l_@@_tmp_box
+ { \l_@@_saved_badness_tl #1 }
+ \box_set_wd:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_ht:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_dp:Nn \l_@@_tmp_box \c_zero_dim
+ \skip_zero:N \baselineskip
+ \skip_zero:N \lineskip
+ \skip_zero:N \lineskiplimit
+ \vbox_unpack:N \l_shipout_box
+ \kern -\l_shipout_box_ht_plus_dp_dim
+ \box_use:N \l_@@_tmp_box
+ \kern \l_shipout_box_ht_plus_dp_dim
+ }
+ \l_@@_saved_badness_tl
+ \box_set_ht:Nn \l_shipout_box \l_shipout_box_ht_dim
+ \box_set_dp:Nn \l_shipout_box \l_shipout_box_dp_dim
+ }
+ {
+ \box_if_horizontal:NT \l_shipout_box
+ {
+ \tl_set:Nx \l_@@_saved_badness_tl
+ { \hfuzz=\the\hfuzz\relax
+ \hbadness=\the\hbadness\relax }
+ \hfuzz=\c_max_dim
+ \hbadness=\c_max_int
+ \hbox_set_to_wd:Nnn \l_shipout_box \l_shipout_box_wd_dim
+ {
+ \hbox_unpack:N \l_shipout_box
+ \kern -\box_wd:N \l_shipout_box
+ \hbox_set:Nn \l_@@_tmp_box
+ { \l_@@_saved_badness_tl #1 }
+ \box_set_wd:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_ht:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_dp:Nn \l_@@_tmp_box \c_zero_dim
+ \box_move_up:nn { \box_ht:N \l_shipout_box }
+ { \box_use:N \l_@@_tmp_box }
+ \kern \box_wd:N \l_shipout_box
+ }%
+ \l_@@_saved_badness_tl
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\@@_init_page_origins:,\c_@@_horigin_tl,\c_@@_vorigin_tl}
+% Two constants holding the offset of the top-left with respect to
+% the media box.
+%
+% Setting the constants this way is courtesy of Bruno.
+%
+% We delay setting the constants to the last possible place as
+% there might be updates in the preamble or even in the
+% \hook{begindocument} hook that affects their setup.
+% \begin{macrocode}
+\cs_new:Npn \@@_init_page_origins: {
+ \tl_const:Nx \c_@@_horigin_tl
+ {
+ \cs_if_exist_use:NTF \pdfvariable { horigin }
+ { \cs_if_exist_use:NF \pdfhorigin { 1in } }
+ }
+ \tl_const:Nx \c_@@_vorigin_tl
+ {
+ \cs_if_exist_use:NTF \pdfvariable { vorigin }
+ { \cs_if_exist_use:NF \pdfvorigin { 1in } }
+ }
+% \end{macrocode}
+% After the constants have been set there is no need to execute
+% this command again, in fact it would raise an error, so we
+% redefine it to do nothing.
+% \begin{macrocode}
+ \cs_gset_eq:NN \@@_init_page_origins: \prg_do_nothing:
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_picture_overlay:n}
+% Put the argument into a \texttt{picture} environment that doesn't take up
+% any size and uses \texttt{1pt} for \cs{unitlength}.
+% \fmi{Could perhaps be generalized as it might be useful elsewhere. For
+% now it is not.}
+% \begin{macrocode}
+\cs_new:Npn \@@_picture_overlay:n #1 {
+% \end{macrocode}
+% The very first time this is executed we have to initializes (and
+% freeze) the origins.
+% \begin{macrocode}
+ \@@_init_page_origins:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \kern -\c_@@_horigin_tl \scan_stop:
+ \vbox_to_zero:n {
+ \kern -\c_@@_vorigin_tl \scan_stop:
+ \unitlength 1pt \scan_stop:
+% \end{macrocode}
+% This mimics a simple zero-sized picture environment. The \cs{hss}
+% is need in case there is horizontal material (without using
+% \cs{put} with a positive width.
+% \changes{v1.0b}{2020/09/09}
+% {Prevent overfull box warnings (gh/387)}
+% \begin{macrocode}
+ \hbox_set_to_wd:Nnn \l_@@_tmp_box \c_zero_dim
+ { \ignorespaces #1 \hss }
+ \box_set_ht:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_dp:Nn \l_@@_tmp_box \c_zero_dim
+ \box_use:N \l_@@_tmp_box
+ \tex_vss:D
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@@_add_background_picture:n}
+% Put a \texttt{picture} env in the background of the shipout box
+% with its reference point in the top-left corner.
+%
+% \begin{macrocode}
+\cs_new:Npn \@@_add_background_picture:n #1 {
+ \@@_add_background_box:n { \@@_picture_overlay:n {#1} }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_add_foreground_picture:n}
+%
+% Put a \texttt{picture} env in the foreground of the shipout box
+% with its reference point in the top-left corner.
+% \begin{macrocode}
+\cs_new:Npn \@@_add_foreground_picture:n #1 {
+ \@@_add_foreground_box:n { \@@_picture_overlay:n {#1} }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\shipout_discard:}
+% Request that the next shipout box should be discarded. At the
+% moment this is just setting a boolean, but we may want to augment
+% this behavior that the position of the call is taken into account
+% (in case \LaTeX{} looks ahead and is not using the position for
+% on the next page).
+% \begin{macrocode}
+\cs_new_protected:Npn \shipout_discard: {
+ \bool_gset_true:N \g_@@_discard_bool
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{Handling the end of job hook}
+%
+% At the moment this is partly solved by using the existing hooks.
+% But rather than putting the code into these hooks it should be
+% moved to the right place directly as we shouldn't prefill hooks
+% with material unless it needs to interact with other code.
+%
+%
+%
+% \begin{macro}{\g_shipout_readonly_int,\ReadonlyShipoutCounter}
+% We count every shipout activity that makes a page (but not those
+% that are discarded) in order to know how many pages got produced.
+% \begin{macrocode}
+\int_new:N \g_shipout_readonly_int
+% \end{macrocode}
+% For \LaTeXe{} it is available as a command (i.e., a \TeX{}
+% counter only.
+% \begin{macrocode}
+\cs_new_eq:NN \ReadonlyShipoutCounter \g_shipout_readonly_int
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\g_shipout_totalpages_int,\c@totalpages}
+% We count every shipout attempt (even those that are discarded) in
+% tis counter. It is not used in the code but may get used in user
+% code.
+% \begin{macrocode}
+\int_new:N \g_shipout_totalpages_int
+% \end{macrocode}
+% For \LaTeXe{} this is offered as a \LaTeX{} counter so can be
+% easily typeset inside the output routine to display things like
+% \enquote{\cs{thepage}\texttt{/}\cs{thetotalpages}}, etc.
+% \begin{macrocode}
+\cs_new_eq:NN \c@totalpages \g_shipout_totalpages_int
+\cs_new:Npn \thetotalpages { \arabic{totalpages} }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\@abspage@last}
+% In \cs{@abspage@last} record the number of pages from the last
+% run. This is written to the \texttt{.aux} and this way made
+% available to the next run. In case there is no \texttt{.aux} file
+% or the statement is missing from it we initialize it with the
+% largest possible number in \TeX{}. We use this as the default
+% because then we are inserting the \hook{shipout/lastpage} on
+% the last page (or after the last page but not on page 1 for a
+% multipage document.
+% \begin{macrocode}
+\xdef\@abspage@last{\number\maxdimen}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\enddocument}
+%
+% Instead of using the hooks \hook{enddocument} and
+% \hook{enddocument/afterlastpage} we add this code to private
+% kernel hooks to be 100\% when it is executed and to avoid
+% cluttering the hooks with data that is always there.
+%
+% Inside \cs{enddocument} there is a \cs{clearpage}. Just before
+% that we execute this code here. There is a good change that we
+% are on the last page. Therefore, if we don't know the value from
+% the last run, we assume that the current page is the right
+% one. So we set \cs{@abspage@last} and as a result the next
+% shipout will run the \hook{shipout/lastpage} code. Of course,
+% if there are floats that still need a placement this guess will
+% be wrong but then rerunning the document will give us the correct
+% value next time around.
+%
+% \begin{macro}{\@kernel@after@enddocument}
+% \begin{macrocode}
+\g@addto@macro \@kernel@after@enddocument {
+ \int_compare:nNnT \@abspage@last = \maxdimen
+ {
+% \end{macrocode}
+% We use \LaTeXe{} coding as \cs{@abspage@last} is not an L3 name.
+% \begin{macrocode}
+ \xdef\@abspage@last{ \int_eval:n {\g_shipout_readonly_int + 1} }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@kernel@after@enddocument@afterlastpage}
+% Once the \cs{clearpage} has done its work inside \cs{enddocument}
+% we know for sure how many pages this document has, so we record
+% that in the \texttt{.aux} file for the next run.
+%
+% \begin{macrocode}
+\g@addto@macro \@kernel@after@enddocument@afterlastpage {
+% \end{macrocode}
+% There is one special case: If no output is produced then there is
+% no point in a) recording the number as 0 will never match the
+% page number of a real page and b) adding an extra page to ran the
+% \hook{shipout/lastpage} is pointless as well (as it would
+% remain forever). So we test for this and run the code only if
+% there have been pages.
+% \begin{macrocode}
+ \int_compare:nNnF \g_shipout_readonly_int = 0
+ {
+% \end{macrocode}
+% This ends up in the \texttt{.aux} so we use \LaTeXe{} names here.
+% \fmi{This needs an interface for \cs{nofiles} in expl3, doesn't at the moment!}
+% \begin{macrocode}
+ \if@filesw
+ \iow_now:Nx \@auxout {
+ \gdef\string\@abspage@last {\int_use:N \g_shipout_readonly_int}}
+ \fi
+% \end{macrocode}
+% But we may have guessed wrongly earlier and we still have to run the
+% \hook{shipout/lastpage} even though there is no page to place
+% it into. If that is the case we make a trivial extra page and put
+% it there. This temporary page will then vanish again on the next
+% run but helps to keep pdf viewers happy.
+% \begin{macrocode}
+ \bool_if:NF \g_@@_lastpage_handled_bool
+ {
+% \end{macrocode}
+% However, making this extra page in case the hook is actually
+% empty would be forcing a rerun without any reason, so we check
+% that condition and also check if
+% \cs{@kernel@after@shipout@lastpage} contains any code. If both
+% are empty we omit the page generation.
+% \begin{macrocode}
+ \bool_lazy_and:nnF
+ { \hook_if_empty_p:n {shipout/lastpage} }
+ { \tl_if_empty_p:N \@kernel@after@shipout@lastpage }
+ {
+ \tex_shipout:D\vbox to\textheight
+ {
+ \hbox:n { \UseHook{shipout/lastpage}
+ \@kernel@after@shipout@lastpage }
+% \end{macrocode}
+% This extra page could be totally empty except for the hook
+% content, but to help the user understanding why it is there we
+% put some text into it.
+% \begin{macrocode}
+ \@@_excuse_extra_page:
+ \null
+ }
+% \end{macrocode}
+% At this point we also signal to \LaTeX{}'s endgame that a rerun is
+% necessary so that an appropriate message can be shown on the
+% terminal. We do this by simply defining a command used as a flag and
+% tested \cs{enddocument}.
+% \begin{macrocode}
+ \cs_gset_eq:NN \@extra@page@added \relax
+ }
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@@_excuse_extra_page:}
+% Say mea culpa \ldots
+% \begin{macrocode}
+\cs_new:Npn \@@_excuse_extra_page: {
+ \vfil
+ \begin{center}
+ \bfseries Temporary~ page!
+ \end{center}
+ \LaTeX{}~ was~ unable~ to~ guess~ the~ total~ number~ of~ pages~
+ correctly.~ ~ As~ there~ was~ some~ unprocessed~ data~ that~
+ should~ have~ been~ added~ to~ the~ final~ page~ this~ extra~
+ page~ has~ been~ added~ to~ receive~ it.
+ \par
+ If~ you~ rerun~ the~ document~ (without~ altering~ it)~ this~
+ surplus~ page~ will~ go~ away,~ because~ \LaTeX{}~ now~ knows~
+ how~ many~ pages~ to~ expect~ for~ this~ document.
+ \vfil
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\PreviousTotalPages,\@kernel@before@begindocument}
+% In the preamble before the \texttt{aux} file was read
+% \cs{PreviousTotalPages} is always zero.
+% \begin{macrocode}
+\def\PreviousTotalPages{0}
+% \end{macrocode}
+% In the \texttt{aux} file there should be an update for
+% \cs{@abspage@last} recording the number of pages from the
+% previous run. If not that macro holds the value of
+% \cs{maxdimen}. So we test for it and update
+% \cs{PreviousTotalPages} if there was a real value. This should
+% happen just before the \hook{begindocument} hook is executed so
+% that the value can be used inside that hook.
+% \begin{macrocode}
+\g@addto@macro\@kernel@before@begindocument
+ {\ifnum\@abspage@last<\maxdimen
+ \xdef\PreviousTotalPages{\@abspage@last}\fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Legacy \LaTeXe{} interfaces}
+%
+%
+%
+% \begin{macro}{\DiscardShipoutBox}
+% Request that the next shipout box is to be discarded.
+% \begin{macrocode}
+\cs_new_eq:NN \DiscardShipoutBox \shipout_discard:
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\AtBeginDvi}
+% If we roll forward from an earlier kernel \cs{AtBeginDvi} is
+% defined so we better not use \cs{cs_new_protected:Npn} here.
+% \changes{v1.0d}{2020/11/24}{Support for roll forward (gh/434)}
+% \begin{macrocode}
+\cs_set_protected:Npn \AtBeginDvi {\@@_add_firstpage_material:Nn \AtBeginDvi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\DebugShipoutsOn,\DebugShipoutsOff}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \DebugShipoutsOn \shipout_debug_on:
+\cs_new_eq:NN \DebugShipoutsOff \shipout_debug_off:
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Internal commands needed elsewhere}
+%
+% These internal commands use double and triple \texttt{@} signs so
+% we need to stop getting them translated to the module name.
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+% \begin{macro}{\@expl@@@shipout@add@firstpage@material@@Nn,
+% \@expl@@@shipout@add@background@box@@n,
+% \@expl@@@shipout@add@foreground@box@@n,
+% \@expl@@@shipout@add@background@picture@@n,
+% \@expl@@@shipout@add@foreground@picture@@n}
+% Some internals needed elsewhere.
+%
+% \begin{macrocode}
+\cs_set_eq:NN \@expl@@@shipout@add@firstpage@material@@Nn
+ \__shipout_add_firstpage_material:Nn
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set_eq:NN \@expl@@@shipout@add@background@box@@n
+ \__shipout_add_background_box:n
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set_eq:NN \@expl@@@shipout@add@foreground@box@@n
+ \__shipout_add_foreground_box:n
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set_eq:NN \@expl@@@shipout@add@background@picture@@n
+ \__shipout_add_background_picture:n
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set_eq:NN \@expl@@@shipout@add@foreground@picture@@n
+ \__shipout_add_foreground_picture:n
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+%
+% Rolling back here doesn't undefine the interface commands as they
+% may be used in packages without rollback functionality. So we
+% just make them do nothing which may or may not work depending on
+% the code usage.
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\shipout}{The hook management (shipout)}%
+%<latexrelease>
+% \end{macrocode}
+% If we roll forward then \cs{tex\_shipout:D} may not be defined in
+% which case \cs{shipout} does have it original definition and so
+% we must not \cs{let} it to something else which is \cs{relax}!
+% \changes{v1.0d}{2020/11/24}{Support for roll forward (gh/434)}
+% \begin{macrocode}
+%<latexrelease>\ifcsname tex_shipout:D\endcsname
+%<latexrelease>\expandafter\let\expandafter\shipout
+%<latexrelease> \csname tex_shipout:D\endcsname
+%<latexrelease>\fi
+%<latexrelease>
+%<latexrelease>\let \ShipoutBox\@undefined
+%<latexrelease>\let \ReadonlyShipoutCounter \@undefined
+%<latexrelease>\let \c@totalpages \@undefined
+%<latexrelease>\let \thetotalpages \@undefined
+%<latexrelease>
+%<latexrelease>\let \DiscardShipoutBox \@undefined
+%<latexrelease>\let \DebugShipoutsOn \@undefined
+%<latexrelease>\let \DebugShipoutsOff \@undefined
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand \AtBeginDvi [1]{%
+%<latexrelease> \global \setbox \@begindvibox
+%<latexrelease> \vbox{\unvbox \@begindvibox #1}%
+%<latexrelease>}
+%<latexrelease>
+%<latexrelease>\let \AtBeginShipout \@undefined
+%<latexrelease>\let \AtBeginShipoutNext \@undefined
+%<latexrelease>
+%<latexrelease>\let \AtBeginShipoutFirst \@undefined
+%<latexrelease>
+%<latexrelease>\let \ShipoutBoxHeight \@undefined
+%<latexrelease>\let \ShipoutBoxDepth \@undefined
+%<latexrelease>\let \ShipoutBoxWidth \@undefined
+%<latexrelease>
+%<latexrelease>\let \AtBeginShipoutDiscard \@undefined
+%<latexrelease>
+%<latexrelease>\let \AtBeginShipoutAddToBox \@undefined
+%<latexrelease>\let \AtBeginShipoutAddToBoxForeground \@undefined
+%<latexrelease>\let \AtBeginShipoutUpperLeft \@undefined
+%<latexrelease>\let \AtBeginShipoutUpperLeftForeground \@undefined
+%<latexrelease>
+% \end{macrocode}
+% We do not undo a substitution when rolling back. As the file
+% support gets undone the underlying data is no longer used (and
+% sufficiently obscure that should not interfer with existing
+% commands) and properly removing it would mean we need to make the
+% \cs{unclare@...} and its support macros available in all earlier
+% kernel releases which is pointless (and actually worse).
+% \begin{macrocode}
+%\undeclare@file@substitution{everyshi.sty}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>
+%<latexrelease>\let \AtEndDvi \@undefined
+% \end{macrocode}
+% We do not reenable a disabled package load when rolling back. As the file
+% support gets undone the underlying data is no longer checked (and
+% sufficiently obscure that it should not interfer with existing
+% commands) and properly removing it would mean we need to make the
+% \cs{reenable@package@load} command available in all earlier
+% kernel releases which is pointless (and actually worse).
+% \begin{macrocode}
+%\reenable@package@load{atenddvi}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+%
+%
+%
+% \section{Package emulation for compatibility}
+%
+%
+% \subsection{Package \pkg{atenddvi} emulation}
+%
+%
+% \begin{macro}{\AtEndDvi}
+% This package has only one public command to simulating it is easy
+% and actually sensible to provide as part of the kernel.
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\AtEndDvi}{atenddvi emulation}%
+\ExplSyntaxOn
+\cs_new_protected:Npn \AtEndDvi {\AddToHook{shipout/lastpage}}
+\ExplSyntaxOff
+% \end{macrocode}
+% As the package is integrate we prevent loading (no need to roll that back):
+% \begin{macrocode}
+\disable@package@load{atenddvi}
+ {\PackageWarning{atenddvi}
+ {Functionality of this package is already\MessageBreak
+ provided by LaTeX.\MessageBreak\MessageBreak
+ It is there no longer necessary to load it\MessageBreak
+ and you can safely remove it.\MessageBreak
+ Found on}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\AtEndDvi}{atenddvi emulation}%
+%<latexrelease>\let \AtEndDvi \@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macrocode}
+%</2ekernel>
+% \end{macrocode}
+%
+%
+% \subsection{Package \pkg{atbegshi} emulation}
+%
+%
+%
+%
+%
+% \begin{macrocode}
+%<*atbegshi-ltx>
+\ProvidesPackage{atbegshi-ltx}
+ [2020/08/17 v1.0a
+ Emulation of the original atbegshi package^^Jwith kernel methods]
+% \end{macrocode}
+%
+%
+% \begin{macro}{\AtBeginShipoutBox}
+% \begin{macrocode}
+\let \AtBeginShipoutBox \ShipoutBox
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\AtBeginShipoutInit}
+% Compatibility only, we aren't delaying \ldots
+% \begin{macrocode}
+\let \AtBeginShipoutInit \@empty
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\AtBeginShipout,\AtBeginShipoutNext}
+% Filling hooks
+% \begin{macrocode}
+\protected \def \AtBeginShipout {\AddToHook{shipout/before}}
+\protected \def \AtBeginShipoutNext {\AddToHookNext{shipout/before}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\AtBeginShipoutFirst}
+% Slightly more complex as we need to know the name of the command under which the
+% \hook{shipout/firstpage} hook is filled.
+% \begin{macrocode}
+\protected \def \AtBeginShipoutFirst
+ {\@expl@@@shipout@add@firstpage@material@@Nn \AtBeginShipoutFirst}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\AtBeginShipoutDiscard}
+% Just a different name.
+% \begin{macrocode}
+\let \AtBeginShipoutDiscard \DiscardShipoutBox
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\AtBeginShipoutAddToBox,\AtBeginShipoutAddToBoxForeground,
+% \AtBeginShipoutUpperLeft,\AtBeginShipoutUpperLeftForeground}
+% We don't expose them.
+% \begin{macrocode}
+\let \AtBeginShipoutAddToBox
+ \@expl@@@shipout@add@background@box@@n
+\let \AtBeginShipoutAddToBoxForeground
+ \@expl@@@shipout@add@foreground@box@@n
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let \AtBeginShipoutUpperLeft
+ \@expl@@@shipout@add@background@picture@@n
+\let \AtBeginShipoutUpperLeftForeground
+ \@expl@@@shipout@add@foreground@picture@@n
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\ShipoutBoxHeight,\ShipoutBoxWidth,\ShipoutoBoxDepth}
+% This is somewhat different from the original in \pkg{atbegshi}
+% where \cs{ShipoutBoxHeight} etc.\ only holds the
+% \verb=\the\ht<box>= value. This may has some implications in some
+% use cases and if that is a problem then it might need changing.
+% \begin{macrocode}
+\ExplSyntaxOn
+\cs_new:Npn \ShipoutBoxHeight { \dim_use:N \l_shipout_box_ht_dim }
+\cs_new:Npn \ShipoutBoxDepth { \dim_use:N \l_shipout_box_dp_dim }
+\cs_new:Npn \ShipoutBoxWidth { \dim_use:N \l_shipout_box_wd_dim }
+\ExplSyntaxOff
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macrocode}
+%</atbegshi-ltx>
+% \end{macrocode}
+%
+% If the package is requested we substitute the one above:
+% \begin{macrocode}
+%<*2ekernel>
+\declare@file@substitution{atbegshi.sty}{atbegshi-ltx.sty}
+%</2ekernel>
+% \end{macrocode}
+%
+%
+%
+%
+%
+%
+% \subsection{Package \pkg{everyshi} emulation}
+%
+% \begin{macrocode}
+%<*everyshi-ltx>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ProvidesPackage{everyshi-ltx}
+ [2020/08/17 v1.0a
+ Emulation of the original everyshi package^^Jwith kernel methods]
+% \end{macrocode}
+%
+% \begin{macro}{\EveryShipout,\AtNextShipout}
+% This package has only two public commands so simulating it is easy:
+% \begin{macrocode}
+\protected \def \EveryShipout {\AddToHook{shipout/before}}
+\protected \def \AtNextShipout {\AddToHookNext{shipout/before}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+% This is one difference between \pkg{everyshi} and the kernel
+% implementation, the latter does not directly use box 255.
+%
+% For usage by ordinary users this makes no difference but of a
+% package use complicated code together with \pkg{everyshi} and
+% directly manipulates box 255 then this package needs updating.
+% In most cases the updates are simple because the kernel offers
+% hooks that makes such complicated code unnecessary.
+%
+% We therefore add a little file into the adjusted package
+% \begin{macrocode}
+%%
+%% In normal circumstances the above emulation is sufficient and in
+%% all known packages (we know of) that use everyshi it either works or
+%% the packages have been adjusted.
+%%
+%% Code that directly manipulates box 255, however, might fail.
+%% If that is the case look at the shipout hooks offered now as
+%% they are normally sufficienct to avoid such minpulations (or
+%% replace box 255 with \ShipoutBox in the code.
+%%
+%</everyshi-ltx>
+% \end{macrocode}
+%
+%
+% If the package is requested we substitute the one above:
+% \begin{macrocode}
+%<*2ekernel>
+\declare@file@substitution{everyshi.sty}{everyshi-ltx.sty}
+%</2ekernel>
+% \end{macrocode}
+%
+%
+% Rather important :-)
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+% \Finale
+%
+%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/Master/texmf-dist/source/latex/base/ltspace.dtx b/Master/texmf-dist/source/latex/base/ltspace.dtx
index 16d7dcb43aa..1a672c6455d 100644
--- a/Master/texmf-dist/source/latex/base/ltspace.dtx
+++ b/Master/texmf-dist/source/latex/base/ltspace.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltspace.dtx}
- [2019/11/02 v1.3k LaTeX Kernel (spacing)]
+ [2020/05/06 v1.3n LaTeX Kernel (spacing)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltspace.dtx}
@@ -63,6 +63,8 @@
% \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}
+% \changes{v1.3l}{2020/03/07}{Moved \cs{thinspace}, \cs{negthinspace}
+% and \cs{,} to ltmath.dtx (gh/303)}
%
%
% \section{Spacing}
@@ -428,6 +430,37 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+%
+%
+%
+% \begin{macro}{\@vspace@calcify}
+% Helper command to produce a \cs{vskip} that is first run through
+% \cs{setlength}. This way the \texttt{calc} package can operate on
+% the argument value.
+% \changes{v1.3m}{2020/04/21}{Support calc syntax (gh/152)}
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@vspace@calcify}{Add calc support}%
+\def\@vspace@calcify#1{\begingroup\setlength\skip@{#1}\vskip\skip@\endgroup}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@vspace@calcify}{Add calc support}%
+%<latexrelease>
+%<latexrelease>\let\@vspace@calcify\@undefined
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+%
+%
+
+
% \begin{macro}{\newline}
% A simple form of the `normal' definition of |\\|.
% \changes{v1.2v}{1997/05/07}{Made completely robust.}
@@ -445,12 +478,31 @@
% \end{macro}
%
% \begin{macro}{\@newline}
+% \changes{v1.3m}{2020/04/21}{Support calc syntax (gh/152)}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@newline}{\newline calc support}%
\def\@newline[#1]{\let \reserved@e \vadjust
- \@gnewline {\vskip #1}}
+ \@gnewline {\@vspace@calcify{#1}}}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@newline}{\newline calc support}%
+%<latexrelease>
+%<latexrelease>\def\@newline[#1]{\let \reserved@e \vadjust
+%<latexrelease> \@gnewline {\vskip #1}}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
+%
+%
% \begin{macro}{\@gnewline}
% \changes{v1.2u}{1996/10/29}{Added macro}
% The |\nobreak| added to prevent null lines when |\\|
@@ -518,7 +570,7 @@
% |\begin{@float}| \ldots |\end{@float}|
% that want to be invisible --- i.e.,
% not leave any extra space when used in the middle of text. Such
-% a macro should begin with |\@bsphack| and end with |\@esphack|
+% a macro should begin with |\@bsphack| and end with |\@esphack|.
% The macro in question should not create any text, nor change the
% mode.
%
@@ -823,20 +875,48 @@
% \changes{v1.2c}{1994/11/13}{Recorrected error message}
% Add vertical space taking into account space already added, as
% described above.
+% \changes{v1.3m}{2020/04/21}{Support calc syntax (gh/152)}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\addvspace}{\addvspace calc support}%
\def\addvspace#1{%
\ifvmode
\if@minipage\else
\ifdim \lastskip =\z@
- \vskip #1\relax
+ \@vspace@calcify{#1}%
\else
- \@tempskipb#1\relax
+ \setlength\@tempskipb{#1}%
\@xaddvskip
\fi
\fi
\else
\@noitemerr
\fi}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\addvspace}{\addvspace calc support}%
+%<latexrelease>
+%<latexrelease>\def\addvspace#1{%
+%<latexrelease> \ifvmode
+%<latexrelease> \if@minipage\else
+%<latexrelease> \ifdim \lastskip =\z@
+%<latexrelease> \vskip #1\relax
+%<latexrelease> \else
+%<latexrelease> \@tempskipb#1\relax
+%<latexrelease> \@xaddvskip
+%<latexrelease> \fi
+%<latexrelease> \fi
+%<latexrelease> \else
+%<latexrelease> \@noitemerr
+%<latexrelease> \fi}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -938,6 +1018,8 @@
% \end{macrocode}
% \end{macro}
%
+%
+%
% \begin{macro}{\vspace}
% \changes{v1.2m}{1996/01/20}{Made robust}
% \begin{macro}{\@vspace}
@@ -957,14 +1039,25 @@
% \end{itemize}
% \begin{macrocode}
\DeclareRobustCommand\vspace{\@ifstar\@vspacer\@vspace}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@vspace}{Support calc in \vspace}%
+% \end{macrocode}
+% We support calc syntax in the argument and therefore use \cs{setlength}.
+% \changes{v1.3m}{2020/04/21}{Support calc syntax (gh/152)}
+% \begin{macrocode}
\def\@vspace #1{%
\ifvmode
- \vskip #1
+ \@vspace@calcify{#1}%
\vskip\z@skip
\else
\@bsphack
\vadjust{\@restorepar
- \vskip #1
+ \@vspace@calcify{#1}%
\vskip\z@skip
}%
\@esphack
@@ -977,7 +1070,7 @@
\dimen@\prevdepth
\hrule \@height\z@
\nobreak
- \vskip #1
+ \@vspace@calcify{#1}%
\vskip\z@skip
\prevdepth\dimen@
\else
@@ -985,10 +1078,46 @@
\vadjust{\@restorepar
\hrule \@height\z@
\nobreak
- \vskip #1
+ \@vspace@calcify{#1}%
\vskip\z@skip}%
\@esphack
\fi}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@vspace}{Support calc in \vspace}%
+%<latexrelease>
+%<latexrelease>\def\@vspace #1{%
+%<latexrelease> \ifvmode
+%<latexrelease> \vskip #1
+%<latexrelease> \vskip\z@skip
+%<latexrelease> \else
+%<latexrelease> \@bsphack
+%<latexrelease> \vadjust{\@restorepar
+%<latexrelease> \vskip #1
+%<latexrelease> \vskip\z@skip
+%<latexrelease> }%
+%<latexrelease> \@esphack
+%<latexrelease> \fi}
+%<latexrelease>\def\@vspacer#1{%
+%<latexrelease> \ifvmode
+%<latexrelease> \dimen@\prevdepth
+%<latexrelease> \hrule \@height\z@
+%<latexrelease> \nobreak
+%<latexrelease> \vskip #1
+%<latexrelease> \vskip\z@skip
+%<latexrelease> \prevdepth\dimen@
+%<latexrelease> \else
+%<latexrelease> \@bsphack
+%<latexrelease> \vadjust{\@restorepar
+%<latexrelease> \hrule \@height\z@
+%<latexrelease> \nobreak
+%<latexrelease> \vskip #1
+%<latexrelease> \vskip\z@skip}%
+%<latexrelease> \@esphack
+%<latexrelease> \fi}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1094,17 +1223,6 @@
% \end{macrocode}
%
%
-% \begin{macro}{\,}
-% Used in paragraph mode produces a |\thinspace|. It has the
-% ordinary definition in math mode. Useful for quotes inside quotes,
-% as in |``\,`Foo', he said.''|
-% \changes{v1.0o}{1994/05/11}{Use \cs{DeclareRobustCommand}. ASAJ.}
-% \begin{macrocode}
-\DeclareRobustCommand{\,}{%
- \relax\ifmmode\mskip\thinmuskip\else\thinspace\fi
-}
-% \end{macrocode}
-% \end{macro}
%
% \begin{macro}{\@}
% Placed before a '.', makes it a sentence-ending period. Does the
@@ -1142,20 +1260,37 @@
% \changes{LaTeX2e}{1993/08/05}
% {(RmS) Removed superfluous \cs{leavevmode} in \cs{@hspace} and
% \cs{@hspacer}, as suggested by CAR.}
+% \changes{v1.3m}{2020/04/21}{Support calc syntax (gh/152)}
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@hspace}{Support calc with \hspace}%
+\def\@hspace#1{\begingroup\setlength\skip@{#1}\hskip\skip@\endgroup}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
% \begin{macrocode}
-\def\@hspace#1{\hskip #1\relax}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@hspace}{Support calc with \hspace}%
+
+%<latexrelease>
+%<latexrelease>\def\@hspace#1{\hskip #1\relax}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@hspacer}
-% extra |\hskip 0pt| added 1985/17/12 to guard
+% Extra |\hskip 0pt| added 1985/17/12 to guard
% against a following |\unskip|
% |\relax| added 13 Oct 88 for usual \TeX\ lossage
% replaced both changes by |\hskip\z@skip| 27 Nov 91
% \begin{macrocode}
\def\@hspacer#1{\vrule \@width\z@\nobreak
- \hskip #1\hskip \z@skip}
+ \@hspace{#1}\hskip \z@skip}
% \end{macrocode}
% \end{macro}
%
@@ -1184,19 +1319,12 @@
%<latexrelease> {\thinspace}{Start LR-mode}%
% \end{macrocode}
%
-%
-% \begin{macro}{\thinspace}
-% \begin{macro}{\negthinspace}
% \begin{macro}{\enspace}
% \changes{v1.3h}{2018/09/24}{Start LR-mode if necessary (git/49)}
% \begin{macrocode}
-\DeclareRobustCommand\thinspace{\leavevmode@ifvmode\kern .16667em }
-\DeclareRobustCommand\negthinspace{\leavevmode@ifvmode\kern-.16667em }
\DeclareRobustCommand\enspace{\leavevmode@ifvmode\kern.5em }
% \end{macrocode}
% \end{macro}
-% \end{macro}
-% \end{macro}
%
% \begin{macro}{\leavevmode@ifvmode}
% Leave vmode but only if we are really in vmode, otherwise the
@@ -1234,6 +1362,18 @@
% \end{macro}
% \end{macro}
%
+% \changes{v1.3n}{2020/05/06}{Made softhyphen active in TU engines}
+%
+% For Unicode engines, make the Unicode soft hyphen an active
+% character defined as \cs{-}.
+%
+% \begin{macrocode}
+\ifx\Umathcode\@undefined\else
+ \catcode "AD=13
+ \def^^ad{\-}
+\fi
+% \end{macrocode}
+%
% \begin{macro}{\obeycr}
% \begin{macro}{\restorecr}
% The following definitions will probably get deleted or moved to
diff --git a/Master/texmf-dist/source/latex/base/lttab.dtx b/Master/texmf-dist/source/latex/base/lttab.dtx
index 47cf4a66184..dedd9e5d375 100644
--- a/Master/texmf-dist/source/latex/base/lttab.dtx
+++ b/Master/texmf-dist/source/latex/base/lttab.dtx
@@ -31,7 +31,7 @@
%%% From File: lttab.dtx
%<*driver>
% \fi
-\ProvidesFile{lttab.dtx}[2019/10/07 v1.1q LaTeX Kernel (Columns)]
+\ProvidesFile{lttab.dtx}[2020/04/24 v1.1r LaTeX Kernel (Columns)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{lttab.dtx}
@@ -475,11 +475,28 @@
% \end{macro}
%
% \begin{macro}{\@itabcr}
+% \changes{v1.1r}{2020/04/21}{Support calc syntax (gh/152)}
% \begin{macrocode}
-\def\@itabcr[#1]{\vskip #1\@startline\ignorespaces}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@itabcr}{Tabbing calc syntax}%
+\def\@itabcr[#1]{\@vspace@calcify{#1}\@startline\ignorespaces}
+%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@itabcr}{Tabbing calc syntax}%
+%<latexrelease>
+%<latexrelease>\def\@itabcr[#1]{\vskip #1\@startline\ignorespaces}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
%
%
+% \begin{environment}{tabbing}
% \begin{macro}{\tabbing}
% \changes{v1.1f}{1995/10/23}{(CAR)Make \cs{@hightab} consistently a
% local variable}
@@ -513,6 +530,8 @@
\@stopline\ifnum\@tabpush >\z@ \@badpoptabs \fi\endtrivlist}
% \end{macrocode}
% \end{macro}
+% \end{environment}
+%
%
% \begin{macro}{\@rtab}
% Omitted |\global| added to |\@rtab| 17 Jun 86
@@ -815,6 +834,7 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{environment}{array}
% \begin{macro}{\array}
% \begin{macrocode}
\def\array{\let\@acol\@arrayacol \let\@classz\@arrayclassz
@@ -822,6 +842,7 @@
\let\\\@arraycr\let\@halignto\@empty\@tabarray}
% \end{macrocode}
% \end{macro}
+% \end{environment}
%
% \begin{macro}{\endarray}
% \begin{macro}{\endtabular}
@@ -835,11 +856,13 @@
% \end{macro}
% \end{macro}
%
+% \begin{environment}{tabular}
% \begin{macro}{\tabular}
% \begin{macrocode}
\def\tabular{\let\@halignto\@empty\@tabular}
% \end{macrocode}
% \end{macro}
+% \end{environment}
%
% \begin{macro}{\tabular*}
% \changes{v1.1j}{1998/05/18}{Use \cs{setlength}, so that
@@ -1003,8 +1026,24 @@
% \end{macro}
%
% \begin{macro}{\@yargarraycr}
+% \changes{v1.1r}{2020/04/21}{Support calc syntax (gh/152)}
% \begin{macrocode}
-\def\@yargarraycr#1{\cr\noalign{\vskip #1}}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\@yargarraycr}{tabular support calc syntax}%
+\def\@yargarraycr#1{\cr\noalign{\@vspace@calcify{#1}}}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@yargarraycr}{tabular support calc syntax}%
+%<latexrelease>
+%<latexrelease>\def\@yargarraycr#1{\cr\noalign{\vskip #1}}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex/base/lttextcomp.dtx b/Master/texmf-dist/source/latex/base/lttextcomp.dtx
index ed37b9d9957..3b6231dafdf 100644
--- a/Master/texmf-dist/source/latex/base/lttextcomp.dtx
+++ b/Master/texmf-dist/source/latex/base/lttextcomp.dtx
@@ -33,7 +33,7 @@
%
%
\ProvidesFile{lttextcomp.dtx}
- [2020/02/10 v1.0c LaTeX Kernel (text companion symbols)]
+ [2020/04/29 v1.0d LaTeX Kernel (text companion symbols)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -445,7 +445,7 @@
% Using \cs{UndeclareTextCommand} above is enough only if the
% encoding definition files are not reloaded afterwards. In the
% past that happened if \texttt{fontenc} was used in the document
-% preamble (not not any longer). So in some sense it is better to fully remove
+% preamble (not any longer). So in some sense it is better to fully remove
% them from the encoding files, but for rollbacks it is easier to
% keep them in for now.
%
@@ -565,24 +565,25 @@
%
% In Unicode engines we just execute the simple accents:
% \changes{v1.0c}{2020/02/10}{Use \cs{@tabacckludge} for tabbing where necessary (gh/271)}
+% \changes{v1.0d}{2020/04/29}{Make all captial accents text commands for hyperref (gh/332)}
% \begin{macrocode}
\else
- \def\capitalacute{\@tabacckludge'}
- \def\capitalbreve{\u}
- \def\capitalcaron{\v}
- \def\capitalcedilla{\c}
- \def\capitalcircumflex{\^}
- \def\capitaldieresis{\"}
- \def\capitaldotaccent{\.}
- \def\capitalgrave{\@tabacckludge`}
- \def\capitalhungarumlaut{\H}
- \def\capitalmacron{\@tabacckludge=}
- \def\capitalnewtie{\t}
- \def\capitalogonek{\k}
- \def\capitalring{\r}
- \def\capitaltie{\t}
- \def\capitaltilde{\~}
- \def\newtie{\t}
+ \DeclareTextCommandDefault\capitalacute{\@tabacckludge'}
+ \DeclareTextCommandDefault\capitalbreve{\u}
+ \DeclareTextCommandDefault\capitalcaron{\v}
+ \DeclareTextCommandDefault\capitalcedilla{\c}
+ \DeclareTextCommandDefault\capitalcircumflex{\^}
+ \DeclareTextCommandDefault\capitaldieresis{\"}
+ \DeclareTextCommandDefault\capitaldotaccent{\.}
+ \DeclareTextCommandDefault\capitalgrave{\@tabacckludge`}
+ \DeclareTextCommandDefault\capitalhungarumlaut{\H}
+ \DeclareTextCommandDefault\capitalmacron{\@tabacckludge=}
+ \DeclareTextCommandDefault\capitalnewtie{\t}
+ \DeclareTextCommandDefault\capitalogonek{\k}
+ \DeclareTextCommandDefault\capitalring{\r}
+ \DeclareTextCommandDefault\capitaltie{\t}
+ \DeclareTextCommandDefault\capitaltilde{\~}
+ \DeclareTextCommandDefault\newtie{\t}
\fi
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/base/ltvers.dtx b/Master/texmf-dist/source/latex/base/ltvers.dtx
index f13a6ae6851..c42a126a31c 100644
--- a/Master/texmf-dist/source/latex/base/ltvers.dtx
+++ b/Master/texmf-dist/source/latex/base/ltvers.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltvers.dtx}
- [2020/01/31 v1.1e LaTeX Kernel (Version Info)]
+ [2020/03/02 v1.1e LaTeX Kernel (Version Info)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltvers.dtx}
@@ -112,10 +112,10 @@
%</2ekernel>
%<latexrelease>\edef\latexreleaseversion
%<*2ekernel|latexrelease>
- {2020-02-02}
+ {2020-10-01}
%</2ekernel|latexrelease>
%<*2ekernel>
-\def\patch@level{5}
+\def\patch@level{4}
% \end{macrocode}
%
% \begin{macro}{\development@branch@name}
@@ -250,6 +250,14 @@
\def\@IncludeInRele@se#1#2#3{%
\toks@{[#1] #3}%
\expandafter\ifx\csname\string#2+\@currname+IIR\endcsname\relax
+% \end{macrocode}
+% If we roll back and the first patch already match then applying
+% that is actually reapplying what is already in the format, i.e.,
+% it is useless and possibly allocating new registers. However, it
+% makes the logic simpler so this is the way it is for now. In
+% theory we could always jump overthe first patch because that is
+% only really needed for rolling forward. So maybe one day \dots
+% \begin{macrocode}
\ifnum\expandafter\@parse@version#1//00\@nil
>\expandafter\@parse@version\fmtversion//00\@nil
\GenericInfo{}{Skipping: \the\toks@}%
diff --git a/Master/texmf-dist/source/latex/base/ltxdoc.dtx b/Master/texmf-dist/source/latex/base/ltxdoc.dtx
index f250b2cb193..0c7130c3717 100644
--- a/Master/texmf-dist/source/latex/base/ltxdoc.dtx
+++ b/Master/texmf-dist/source/latex/base/ltxdoc.dtx
@@ -30,7 +30,7 @@
%
%<class>\NeedsTeXFormat{LaTeX2e}
%<class>\ProvidesClass{ltxdoc}
-%<class> [2019/09/16 v2.0y Standard LaTeX documentation class]
+%<class> [2020/10/04 v2.1b Standard LaTeX documentation class]
%
%<*driver>
\documentclass{ltxdoc}
@@ -54,6 +54,7 @@
%
% \changes{v2.0i}{1994/04/29}{Update the documentation.}
% \changes{v2.0s}{1998/08/17}{(RmS) Documentation fixes.}
+% \changes{v2.1a}{2020/08/21}{Integration of new hook management interface}
%
% \section{Documentation of the \LaTeX\ sources}
%
@@ -422,6 +423,10 @@
\def\partname{File}
% \end{macrocode}
%
+%
+%
+% \changes{v2.0z}{2020/05/17}{Support spaces \emph{within} filenames
+% (gh/218)}
% \begin{macrocode}
\newcommand*{\DocInclude}[1]{%
\relax
@@ -432,14 +437,24 @@
{\def\currentfile{#1.dtx}}%
\ifnum\@auxout=\@partaux
\@latexerr{\string\include\space cannot be nested}\@eha
- \else \@docinclude#1 \fi}
+ \else
+ \set@curr@file{#1}%
+ \edef\@curr@file{\@strip@tex@ext\@curr@file}%
+ \expandafter\@docinclude\expandafter{\@curr@file}
+ \fi}
\def\@docinclude#1 {\clearpage
+% \end{macrocode}
+%
+% \changes{v2.1bj}{2020/10/04}{Quotes around the aux file name removed,
+% they are no longer needed and upset BibTeX (gh/400)}
+% \begin{macrocode}
\if@filesw \immediate\write\@mainaux{\string\@input{#1.aux}}\fi
\@tempswatrue\if@partsw \@tempswafalse\edef\@tempb{#1}\@for
\@tempa:=\@partlist\do{\ifx\@tempa\@tempb\@tempswatrue\fi}\fi
\if@tempswa \let\@auxout\@partaux \if@filesw
-\immediate\openout\@partaux #1.aux
+\immediate\openout\@partaux "#1.aux"
\immediate\write\@partaux{\relax}\fi
+\@filehook@set@CurrentFile
% \end{macrocode}
% We need to save (and later restore) various index-related
% commands which might be changed by the included file.
diff --git a/Master/texmf-dist/source/latex/base/ltxref.dtx b/Master/texmf-dist/source/latex/base/ltxref.dtx
index c20a3245588..56ae09c1650 100644
--- a/Master/texmf-dist/source/latex/base/ltxref.dtx
+++ b/Master/texmf-dist/source/latex/base/ltxref.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltxref.dtx}
- [2019/09/16 v1.1m LaTeX Kernel (Cross Referencing)]
+ [2020/08/23 v1.1o LaTeX Kernel (Cross Referencing)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltxref.dtx}
@@ -311,14 +311,18 @@
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2019/10/01}%
-%<latexrelease> {\refstepcounter}{Add \labelformat and \Ref}%
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\refstepcounter}{Add \@currentcounter}%
% \end{macrocode}
%
% \begin{macro}{\refstepcounter}
% Step the counter and allow for labels to point to its current value.
+% \changes{v1.1n}{2020/05/05}{record the counter name in \cs{@currentcounter}}
+% \changes{v1.1o}{2020/08/23}{add default definition of \cs{@currentcounter}}
% \begin{macrocode}
+\def\@currentcounter{}
\def\refstepcounter#1{\stepcounter{#1}%
+ \edef\@currentcounter{#1}%
\protected@edef\@currentlabel
% \end{macrocode}
% By generating the second csname first the |\p@...| command can
@@ -381,6 +385,17 @@
% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\refstepcounter}{Add \labelformat and \Ref}%
+%<latexrelease>\let\@currentcounter\@undefined
+%<latexrelease>\def\refstepcounter#1{\stepcounter{#1}%
+%<latexrelease> \protected@edef\@currentlabel
+%<latexrelease> {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}%
+%<latexrelease>}
+%<latexrelease>\def\labelformat#1{\expandafter\def\csname p@#1\endcsname##1}
+%<latexrelease>\DeclareRobustCommand\Ref[1]{\protected@edef\@tempa{\ref{#1}}%
+%<latexrelease> \expandafter\MakeUppercase\@tempa}
+%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\refstepcounter}{Add \labelformat and \Ref}%
%<latexrelease>
diff --git a/Master/texmf-dist/source/latex/base/slides.dtx b/Master/texmf-dist/source/latex/base/slides.dtx
index a0dbdabe5f0..8b7276f492d 100644
--- a/Master/texmf-dist/source/latex/base/slides.dtx
+++ b/Master/texmf-dist/source/latex/base/slides.dtx
@@ -53,7 +53,7 @@
%<*driver>
\ProvidesFile{slides.drv}
%</driver>
- [2019/11/04 v2.4b
+ [2020/02/20 v2.4b
%<+class> Standard LaTeX document class]
%<+cmd> SLiTeX definitions]
% \end{macrocode}
@@ -162,7 +162,7 @@
%
% \section{Fonts}
%
-% Note, that that with NFSS you can easily produce slides with special
+% Note, that with NFSS you can easily produce slides with special
% fonts just by calling an appropriate style file (like |times|) in a
% |\usepackage| command. This works, for example, with all
% fonts that are defined to be scaleable (e.g., PostScript fonts) since
@@ -2536,14 +2536,14 @@ COLOR LAYER\\[.75in]%
% \overline, \underline, \frac and \sqrt
%
% \@mathbox{STYLE}{BOX}{MTEXT} : Called in math mode, typesets MTEXT and
-% stores result in BOX, using style STYLE.
+% stores result in BOX, using STYLE.
%
% \@bphant{BOX} : Creates a phantom with dimensions BOX.
% \@vbphant{BOX} : Creates a phantom with ht of BOX and zero width.
% \@hbphant{BOX} : Creates a phantom with width of BOX
% and zero ht & dp.
% \@hvsmash{STYLE}{MTEXT} : Creates a copy of MTEXT with zero height and
-% width in style STYLE.
+% width in STYLE.
%\end{verbatim}
% \begin{macrocode}
\def\@mathbox#1#2#3{\setbox#2\hbox{$\m@th#1{#3}$}}
diff --git a/Master/texmf-dist/source/latex/base/unpack.ins b/Master/texmf-dist/source/latex/base/unpack.ins
index b03dd5c6b1b..3264a401d9e 100644
--- a/Master/texmf-dist/source/latex/base/unpack.ins
+++ b/Master/texmf-dist/source/latex/base/unpack.ins
@@ -123,7 +123,6 @@
\batchinput{latexrelease.ins}
-
\Msg{}
\Msg{*********************************************}
\Msg{*}
diff --git a/Master/texmf-dist/source/latex/beamerappendixnote/beamerappendixnote.dtx b/Master/texmf-dist/source/latex/beamerappendixnote/beamerappendixnote.dtx
new file mode 100644
index 00000000000..5c0d72fabbd
--- /dev/null
+++ b/Master/texmf-dist/source/latex/beamerappendixnote/beamerappendixnote.dtx
@@ -0,0 +1,266 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2020 Christoph Semken <christoph.ban@semken.info>
+% -------------------------------------------------------
+%
+% This file 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:
+%
+% http://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.
+%
+% \fi
+%
+% \iffalse
+%
+%
+%<*driver>
+\ProvidesFile{beamerappendixnote.dtx}
+%</driver>
+%<package> \ProvidesPackage{beamerappendixnote}
+%<*package>
+ [2020/07/01 v1.2.0 backposition option]
+%</package>
+%<*driver>
+\documentclass{l3doc}
+
+%% Packages
+% This package
+\usepackage{beamerappendixnote}
+% Unicode
+\usepackage{fontspec,unicode-math}
+% Auxiliary
+\usepackage{listings,graphicx,xparse}
+
+%% Layout
+% Font
+\setmainfont{TeX Gyre Pagella}
+% Listings
+\lstset{
+ basicstyle=\ttfamily,
+ columns=fullflexible,
+ keepspaces=true,
+}
+% Links
+\hypersetup{colorlinks,citecolor=blue,linkcolor=blue,urlcolor=blue}
+
+%% Definitions
+\newcommand\fnurl[2]{\href{#1}{#2}\footnote{\url{#1}}}
+\ExplSyntaxOn
+\NewDocumentCommand{\example}{m m o}
+ {
+ \IfNoValueTF{#3}
+ {\lstinputlisting{example-#1.tex}}
+ {\lstinputlisting[linerange=#3]{example-#1.tex}}
+ \int_step_inline:nn {#2}
+ {
+ \includegraphics[page=##1,width=.49\linewidth]{example-#1.pdf}
+ \int_if_even:nT {##1} {\newline}
+ }
+ }
+\ExplSyntaxOff
+
+\begin{document}
+
+\GetFileInfo{beamerappendixnote.dtx}
+
+\title{The \pkg{beamerappendixnote} package}
+
+\author{Christoph Semken%
+ \thanks{E-mail:
+ \href{mailto:christoph.ban@semken.info}
+ {christoph.ban@semken.info}%
+ }%
+}
+
+\date{\fileversion\ --- \filedate}
+
+\maketitle
+
+\begin{documentation}
+
+\noindent Beamer appendix note introduces the \cs{appxnote} command, which puts the note's content on a separate beamer frame, shown by the command \cs{printappxnotes}. It also creates interactive buttons to move back and forth between the two frames.
+
+\example{basic}{2}
+
+\clearpage
+\section{Installation}
+
+The \pkg{beamerappendixnote} package is available on \fnurl{https://ctan.org/pkg/beamerappendixnote}{CTAN}. The easiest way to install it is through a package manager. For help, see the \fnurl{https://miktex.org/howto/miktex-console}{MiKTeX} or \fnurl{https://www.tug.org/texlive/doc/texlive-en/texlive-en.html\#x1-430005}{TeX Live} manual. To build \pkg{beamerappendixnote} from the source code, follow the instructions in the \verb|README.md| file.
+
+\section{Usage}
+
+\begin{function}{\appxnote}
+ \begin{syntax}
+ \cs{appxnote}\oarg{frameoptions}\marg{title}\marg{content}
+ \end{syntax}
+
+ Create a new appendix note. Inserts a \cs{beamergotobutton} to a frame that contains \meta{content}. The appendix frame is created using \cs{printappxnotes}. The button’s text and the title of the appendix frame are both set to \meta{title}. If you specify \meta{frameoptions}, these will be used when creating the beamer frame.
+\end{function}
+
+\begin{function}{\printappxnotes}
+ \begin{syntax}
+ \cs{printappxnotes}
+ \end{syntax}
+
+ Prints appendix notes in the order they are created using \cs{appxnote}. Has to be used after the last appendix note. Uses one frame per note. Inserts a \cs{beamerreturnbutton} button to the frame where \cs{appxnote} was called, followed by the content, separated by a \cs{vfill}.
+\end{function}
+
+
+\section{Advanced usage}
+
+\subsection{Change the back button placement}
+
+To move the back button from the body of the appendix notes into the frame title, load the \pkg{beamerappendixnote} package with the \lstinline{backposition=title} option.
+
+\example{backtop}{2}[2-2]
+
+\subsection{Multi-frame notes}
+
+To create appendix notes spanning multiple frames, set \meta{frameoption} to \lstinline{allowframebreaks}. This works well with the \lstinline{backposition=title} package option, as it makes the back button visible on every frame.
+
+\example{longnote}{4}
+
+
+
+\end{documentation}
+
+
+%\begin{implementation}
+% \section{Implementation}
+% \DocInput{beamerappendixnote.dtx}
+%\end{implementation}
+
+
+\end{document}
+%</driver>
+% \fi
+% \iffalse
+%<*package>
+%<@@=ban>
+% \fi
+%
+% \subsection{Dependencies}
+%
+% \begin{macrocode}
+\RequirePackage{expl3}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@ifpackagelater {expl3}{2018/04/22} {} {%
+ \PackageError {beamerappendixnote} {Support package expl3 too old}
+ {%
+ You need to update your installation of the bundles 'l3kernel' and
+ 'l3packages'.\MessageBreak
+ Loading~beamerappendixnote~will~abort!%
+ }%
+ \endinput
+}%
+% \end{macrocode}
+%
+% Identify the package and give the over all version information
+% \begin{macrocode}
+\ProvidesExplPackage {beamerappendixnote} {2020/07/01} {1.2.0}
+ {Create notes in appendix frames}
+% \end{macrocode}
+%
+% User level interfaces are all created by \pkg{xparse}.
+% \begin{macrocode}
+\RequirePackage{xparse}
+\RequirePackage{l3keys2e}
+% \end{macrocode}
+%
+% \subsection{Package options}
+% \begin{macrocode}
+\keys_define:nn { beamerappendixnote }
+{
+ backposition .choices:nn = { top, bottom, title } { },
+ backposition .tl_set:N = \g_ban_backposition
+}
+\keys_set:nn { beamerappendixnote }
+{
+ backposition = top
+}
+\ProcessKeysOptions { beamerappendixnote }
+% \end{macrocode}
+%
+% \subsection{Data structures}
+%
+% Initialise sequences used to store notes
+% \begin{macrocode}
+\seq_new:N \g_ban_titles
+\seq_new:N \g_ban_content
+\seq_new:N \g_ban_options
+\cs_generate_variant:Nn \tl_if_eq:nnT { V }
+% \end{macrocode}
+%
+% \subsection{Macros}
+% \begin{macro}{\appxnote}
+% Create a new appendix note (store values) and insert a button
+% Note: using \cs{newcommand} because \cs{NewDocumentCommand} does not support
+% multiple paragraphs
+% \begin{macrocode}
+\newcommand{\appxnote}[3][t]{
+ \seq_gput_right:Nn \g_ban_titles {#2}
+ \seq_gput_right:Nn \g_ban_options {#1}
+ \seq_gput_right:Nn \g_ban_content {#3}
+ \hyperlink{ban-\seq_count:N \g_ban_titles}{\beamergotobutton{#2}}%
+ \label{ban-back-\seq_count:N \g_ban_titles}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_print_func:n}
+% Print an appendix note
+% Args: title, content, label, back label, options
+% \begin{macrocode}
+\cs_set:Npn \print_func:nnnnn #1 #2 #3 #4 #5 {
+ \def\options{#5}
+ \begin{frame}[\expandafter\options]
+ {
+ \tl_if_eq:VnT \g_ban_backposition { title }
+ {
+ \hyperlink{#4}{\beamerreturnbutton{Back}}~
+ }
+ #1
+ }
+ \label{#3}
+
+ \tl_if_eq:VnT \g_ban_backposition { top }
+ {
+ \hyperlink{#4}{\beamerreturnbutton{Back}}
+ \vfill
+ }
+
+ #2
+ \end{frame}
+}
+% Get title, content, label, back label and options
+% Arg: id
+% \begin{macrocode}
+\cs_set:Npn \expand_func:n #1 {
+ \print_func:nnnnn {\seq_item:Nn \g_ban_titles {#1}}
+ {\seq_item:Nn \g_ban_content {#1}}
+ {ban-#1}
+ {ban-back-#1}
+ {\seq_item:Nn \g_ban_options {#1}}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\printappxnotes}
+% Print all appendix notes
+% \begin{macrocode}
+\NewDocumentCommand{\printappxnotes}{}{
+ \int_step_function:nN {\seq_count:N \g_ban_titles} \expand_func:n
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \iffalse
+%</package>
+% \fi
diff --git a/Master/texmf-dist/source/latex/beamerappendixnote/beamerappendixnote.ins b/Master/texmf-dist/source/latex/beamerappendixnote/beamerappendixnote.ins
new file mode 100644
index 00000000000..9ed4a61322c
--- /dev/null
+++ b/Master/texmf-dist/source/latex/beamerappendixnote/beamerappendixnote.ins
@@ -0,0 +1,39 @@
+%% Copyright (C) 2020 by Christoph Semken <christoph.ban@semken.info>
+%%
+%% This file 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:
+%%
+%% http://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.
+%%
+
+\input docstrip.tex
+
+\keepsilent
+\askforoverwritefalse
+
+\usedir{tex/latex/beamerappendixnote}
+
+\preamble
+
+----------------------------------------------------------------
+beamerappendixnote --- insert notes on appendix slides
+Author: Christoph Semken
+E-mail: christoph.ban@semken.info
+License: Released under the LaTeX Project Public License v1.3c or later
+See: http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
+\endpreamble
+
+\generate{
+ \file{beamerappendixnote.sty}{
+ \from{beamerappendixnote.dtx}{package}
+ }
+}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/beamerswitch/beamerswitch.dtx b/Master/texmf-dist/source/latex/beamerswitch/beamerswitch.dtx
index e683b58287f..e8a6919c147 100644
--- a/Master/texmf-dist/source/latex/beamerswitch/beamerswitch.dtx
+++ b/Master/texmf-dist/source/latex/beamerswitch/beamerswitch.dtx
@@ -228,7 +228,7 @@ Copyright (C) 2016-2020 by Alex Ball <ab318@bath.ac.uk>
%<class>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<class>\ProvidesClass{beamerswitch}
%<*class>
- [2020/01/20 v1.6.1 Convenient mode selection in Beamer documents]
+ [2020/06/06 v1.7 Convenient mode selection in Beamer documents]
%</class>
%<*driver>
\documentclass[12pt]{article}
@@ -381,6 +381,7 @@ Copyright (C) 2016-2020 by Alex Ball <ab318@bath.ac.uk>
\index{\MyName@\tcbIndexPrintValCA {\MyName}|)}%
}
\makeatletter
+\def\MY@EQUALS{=}%
\newcommand{\resetmintedformat}{%
% Comments
\expandafter\def\csname PYGdefault@tok@c\endcsname{\let\PYGdefault@it=\textit\def\PYGdefault@tc####1{\textcolor{gray}{####1}}}
@@ -893,6 +894,7 @@ directives:
load \pkg{hyperref} yourself at a different point, use this option.
\end{docKey}
+\pagebreak % TWEAK: may not be needed in future versions
\begin{docKey}{textinst}{}{no value, initially unset}
In all modes, patches the \cs{inst} command so that it prints its argument
using \cs{textsuperscript} instead of a mathematical superscript. This helps
@@ -917,13 +919,13 @@ using the following command in the preamble.
\key{resize to} layout.
\end{docKey}
-\begin{docKey}{nup}{=\val{2}\textbar \val{3}\textbar \val{3plus}\textbar \val{4}\textbar \val{4plus}\textbar \val{6}\textbar \val{8}}{no default, initially \val{6}}
+\begin{docKey}{nup}{=\val{1}\textbar \val{1plus}\textbar \val{2}\textbar \val{3}\textbar \val{3plus}\textbar \val{4}\textbar \val{4plus}\textbar \val{6}\textbar \val{8}}{no default, initially \val{6}}
Selects how many slides are shown on a single page in \key{handout} mode.
The `plus' layouts leave blank space for recipients to make handwritten notes
- next to each slide. The effects of the various values are shown in Figure~\ref{fig:layouts} on page~\pageref{fig:layouts}. Note that the \docValue{2},
- \docValue{3plus}, \docValue{4} and \docValue{6} layouts are intended for
- slides in the usual 4:3 aspect ratio, while the \docValue{3}, \docValue{4plus}
- and \docValue{8} layouts are intended for widescreen slides.
+ next to each slide. The effects of the various values are shown in Figure~\ref{fig:layouts} on page~\pageref{fig:layouts}. Note that the \val{2}, \val{3plus}, \val{4}
+ and \val{6} layouts are intended for slides in the usual 4:3 aspect ratio,
+ while the \val{3}, \val{4plus} and \val{8} layouts are intended for widescreen
+ slides.
\end{docKey}
\newtcolorbox{pseudopage}[1][]%
@@ -962,9 +964,32 @@ using the following command in the preamble.
,#1
}
\begin{figure}[t!]
+ \newcounter{subfig}%
+ \def\sfno{\rule[-\bigskipamount]{0pt}{1em}\stepcounter{subfig}(\alph{subfig})\space}%
\centering
\begin{minipage}[b]{11em}
\centering
+ \begin{pseudopage}[width=10em,height=7.1em]
+ \begin{pseudoslide}[width=8em,height=6em]
+ \texttt{1}
+ \end{pseudoslide}
+ \end{pseudopage}
+ \par
+ \sfno\key{nup}=\docValue{1}
+ \end{minipage}
+ \begin{minipage}[b]{11em}
+ \centering
+ \begin{pseudopage}
+ \begin{pseudoslide}[width=6em,height=4.5em]
+ \texttt{1}
+ \end{pseudoslide}\par\smallskip
+ \vbox to 4.5em{}
+ \end{pseudopage}
+ \par
+ \sfno\key{nup}=\docValue{1plus}
+ \end{minipage}
+ \begin{minipage}[b]{11em}
+ \centering
\begin{pseudopage}
\begin{pseudoslide}[width=6em,height=4.5em]
\texttt{1}
@@ -974,7 +999,7 @@ using the following command in the preamble.
\end{pseudoslide}
\end{pseudopage}
\par
- (a) \key{nup}=\val{2}
+ \sfno\key{nup}=\docValue{2}
\end{minipage}
\begin{minipage}[b]{11em}
\centering
@@ -992,7 +1017,7 @@ using the following command in the preamble.
\end{pseudowideslide}
\end{pseudopage}
\par
- (b) \key{nup}=\val{3}
+ \sfno\key{nup}=\docValue{3}
\end{minipage}
\begin{minipage}[b]{11em}
\centering
@@ -1004,9 +1029,8 @@ using the following command in the preamble.
\begin{pseudoslide}\texttt{3}\end{pseudoslide}
\end{pseudopage}
\par
- (c) \key{nup}=\val{3plus}
+ \sfno\key{nup}=\docValue{3plus}
\end{minipage}
- \par\bigskip
\begin{minipage}[b]{11em}
\centering
\begin{pseudopage}[width=10em,height=7.1em]
@@ -1024,7 +1048,7 @@ using the following command in the preamble.
\end{pseudoslide}
\end{pseudopage}
\par
- (d) \key{nup}=\val{4}
+ \sfno\key{nup}=\docValue{4}
\end{minipage}
\begin{minipage}[b]{11em}
\centering
@@ -1038,7 +1062,7 @@ using the following command in the preamble.
\begin{pseudowideslide}\texttt{4}\end{pseudowideslide}
\end{pseudopage}
\par
- (e) \key{nup}=\val{4plus}
+ \sfno\key{nup}=\docValue{4plus}
\end{minipage}
\begin{minipage}[b]{11em}
\centering
@@ -1053,9 +1077,8 @@ using the following command in the preamble.
\begin{pseudoslide}\texttt{6}\end{pseudoslide}
\end{pseudopage}
\par
- (f) \key{nup}=\val{6}
+ \sfno\key{nup}=\docValue{6}
\end{minipage}
- \par\bigskip
\begin{minipage}[b]{11em}
\centering
\begin{pseudopage}
@@ -1072,9 +1095,9 @@ using the following command in the preamble.
\begin{pseudowideslide}\texttt{8}\end{pseudowideslide}
\end{pseudopage}
\par
- (g) \key{nup}=\val{8}
+ \sfno\key{nup}=\docValue{8}
\end{minipage}
- \par
+ \\
\caption{Handout layouts provided by \pkg{beamerswitch}}
\label{fig:layouts}
\end{figure}
@@ -1181,6 +1204,7 @@ suggestions for improvements or new features to the
\href{https://github.com/alex-ball/beamerswitch/issues}{Issue Tracker} on GitHub.
\StopEventually{^^A
+ \newpage
\PrintChanges
\printindex
}
@@ -1561,6 +1585,8 @@ suggestions for improvements or new features to the
% \end{optionkey}
%
% \begin{optionkey}{nup}
+% \begin{optionvalue}{1}
+% \begin{optionvalue}{1plus}
% \begin{optionvalue}{2}
% \begin{optionvalue}{3}
% \begin{optionvalue}{3plus}
@@ -1568,17 +1594,19 @@ suggestions for improvements or new features to the
% \begin{optionvalue}{4plus}
% \begin{optionvalue}{6}
% \begin{optionvalue}{8}
+% \changes{v1.7}{2020/06/06}{Add \key{nup}\string\MY@EQUALS\val{1} option.}
+% \changes{v1.7}{2020/06/06}{Add \key{nup}\string\MY@EQUALS\val{1plus} option.}
% The \key{nup} option specifies how many slides to include per page.
% The `plus' keyword indicates a layout with additional gaps for writing.
%
% \begin{macrocode}
\newcounter{beamerswitch@nupcase}
-\setcounter{beamerswitch@nupcase}{5}
-\define@choicekey+[HL]{beamerswitch}{nup}[\val\nr]{2, 3, 3plus, 4, 4plus, 6, 8}{%
+\setcounter{beamerswitch@nupcase}{7}
+\define@choicekey+[HL]{beamerswitch}{nup}[\val\nr]{1, 1plus, 2, 3, 3plus, 4, 4plus, 6, 8}{%
\setcounter{beamerswitch@nupcase}{\nr}
}{%
\ClassWarning{beamerswitch}{Value of `nup' not recognized.
- Allowed values are 2, 3, 3plus, 4, 4plus, 6, and 8.}%
+ Allowed values are 1, 1plus, 2, 3, 3plus, 4, 4plus, 6, and 8.}%
}
% \end{macrocode}
% \end{optionvalue}
@@ -1588,6 +1616,8 @@ suggestions for improvements or new features to the
% \end{optionvalue}
% \end{optionvalue}
% \end{optionvalue}
+% \end{optionvalue}
+% \end{optionvalue}
% \end{optionkey}
%
% \begin{optionkey}{border}
@@ -1720,6 +1750,10 @@ suggestions for improvements or new features to the
}%
\ifbool{HL@beamerswitch@align}{%
\ifcase\value{beamerswitch@nupcase}\relax
+ \relax
+ \or
+ \addtolength{\beamerswitch@pnoadjust}{-0.333\beamerswitch@margin}%
+ \or
\addtolength{\beamerswitch@pnoadjust}{-0.333\beamerswitch@margin}%
\or
\addtolength{\beamerswitch@pnoadjust}{-0.5\beamerswitch@margin}%
@@ -1754,6 +1788,14 @@ suggestions for improvements or new features to the
%
% \begin{macrocode}
\ifcase\value{beamerswitch@nupcase}\relax
+ \def\beamerswitch@nup{1}%
+ \pgfpagesuselayout{1 by 1}[\beamerswitch@handoutpaper,%
+ landscape,border shrink=\the\beamerswitch@margin]%
+ \or
+ \def\beamerswitch@nup{1}%
+ \pgfpagesuselayout{1 by 1 narrow}[\beamerswitch@handoutpaper,%
+ border shrink=\the\beamerswitch@margin]%
+ \or
\def\beamerswitch@nup{2}%
\pgfpagesuselayout{1 by 2}[\beamerswitch@handoutpaper,%
border shrink=\the\beamerswitch@margin]%
@@ -1801,10 +1843,92 @@ suggestions for improvements or new features to the
% Though \pkg{pgfpages} defines some perfectly fine layouts, we need to add
% configurability to the existing ones and provide some new ones.
%
-% The `1 by 2' layout is similar to the normal \key{2 on 1} layout.
+% \changes{v1.7}{2020/06/06}{Add `1 by 1' layout.}
+% The `1 by 1' layout has a single slide per page.
%
% \begin{macrocode}
\mode<handout>{%
+ \pgfpagesdeclarelayout{1 by 1}
+ {
+ \edef\pgfpageoptionheight{\the\paperheight}
+ \edef\pgfpageoptionwidth{\the\paperwidth}
+ \edef\pgfpageoptionborder{0pt}
+ \def\pgfpageoptionfirstshipout{1}
+ }
+ {
+ \pgfpagesphysicalpageoptions
+ {%
+ logical pages=1,%
+ physical height=\pgfpageoptionheight,%
+ physical width=\pgfpageoptionwidth,%
+ current logical shipout=\pgfpageoptionfirstshipout%
+ }
+ \pgfpageslogicalpageoptions{1}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ border code=\beamerswitch@Border,%
+ resized width=\pgfphysicalwidth,%
+ resized height=\pgfphysicalheight,%
+ center=\pgfpoint{.5\pgfphysicalwidth}{.5\pgfphysicalheight}%
+ }%
+ }%
+% \end{macrocode}
+%
+% \changes{v1.7}{2020/06/06}{Add `1 by 1 narrow' layout.}
+% The `1 by 1 narrow' layout is similar to the normal \key{2 on 1} layout, but
+% there is a notes area instead of the second slide.
+%
+% \begin{macrocode}
+ \pgfpagesdeclarelayout{1 by 1 narrow}
+ {
+ \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default
+ \edef\pgfpageoptionwidth{\the\paperheight}
+ \def\pgfpageoptionborder{0pt}
+ \def\pgfpageoptionfirstshipout{1}
+ }
+ {
+ \pgfpagesphysicalpageoptions
+ {%
+ logical pages=1,%
+ physical height=\pgfpageoptionheight,%
+ physical width=\pgfpageoptionwidth,%
+ current logical shipout=\pgfpageoptionfirstshipout%
+ }
+ \ifdim\paperheight>\paperwidth\relax
+ % put side-by-side
+ \pgfpageslogicalpageoptions{1}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ border code=\beamerswitch@Border,%
+ resized width=.5\pgfphysicalwidth,%
+ resized height=\pgfphysicalheight,%
+ center=\ifbool{HL@beamerswitch@align}{%
+ \pgfpoint{.25\pgfphysicalwidth + 0.333\beamerswitch@margin}{.5\pgfphysicalheight}%
+ }{%
+ \pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}%
+ }%
+ }%
+ \else
+ % stack on top of one another
+ \pgfpageslogicalpageoptions{1}
+ {%
+ border shrink=\pgfpageoptionborder,%
+ border code=\beamerswitch@Border,%
+ resized width=\pgfphysicalwidth,%
+ resized height=.5\pgfphysicalheight,%
+ center=\ifbool{HL@beamerswitch@align}{%
+ \pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight - 0.333\beamerswitch@margin}%
+ }{%
+ \pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}%
+ }%
+ }%
+ \fi
+ }
+% \end{macrocode}
+%
+% The `1 by 2' layout is similar to the normal \key{2 on 1} layout.
+%
+% \begin{macrocode}
\pgfpagesdeclarelayout{1 by 2}
{
\edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default
diff --git a/Master/texmf-dist/source/latex/beamerswitch/beamerswitch.ins b/Master/texmf-dist/source/latex/beamerswitch/beamerswitch.ins
deleted file mode 100644
index e3358a2652b..00000000000
--- a/Master/texmf-dist/source/latex/beamerswitch/beamerswitch.ins
+++ /dev/null
@@ -1,46 +0,0 @@
-%%
-%% This is file `beamerswitch.ins',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% beamerswitch.dtx (with options: `install')
-%% ----------------------------------------------------------------
-%% beamerswitch --- Convenient mode selection in Beamer documents
-%% Author: Alex Ball
-%% E-mail: ab318@bath.ac.uk
-%% License: Released under the LaTeX Project Public License v1.3c or later
-%% See: http://www.latex-project.org/lppl.txt
-%% ----------------------------------------------------------------
-%%
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-\preamble
-----------------------------------------------------------------
-beamerswitch --- Convenient mode selection in Beamer documents
-Author: Alex Ball
-E-mail: ab318@bath.ac.uk
-License: Released under the LaTeX Project Public License v1.3c or later
-See: http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
-\endpreamble
-\postamble
-
-Copyright (C) 2016-2020 by Alex Ball <ab318@bath.ac.uk>
-\endpostamble
-
-\usedir{tex/latex/\jobname}
-\generate{
- \file{\jobname.cls}{\from{\jobname.dtx}{class}}
-}
-\usedir{doc/latex/\jobname}
-\generate{
- \file{\jobname-example.tex}{\from{\jobname.dtx}{example}}
-}
-\endbatchfile
-%%
-%% Copyright (C) 2016-2020 by Alex Ball <ab318@bath.ac.uk>
-%%
-%% End of file `beamerswitch.ins'.
diff --git a/Master/texmf-dist/source/latex/bearwear/bearwear.dtx b/Master/texmf-dist/source/latex/bearwear/bearwear.dtx
index 497cf445440..a635c727756 100644
--- a/Master/texmf-dist/source/latex/bearwear/bearwear.dtx
+++ b/Master/texmf-dist/source/latex/bearwear/bearwear.dtx
@@ -81,7 +81,7 @@
\end{scope}
\end{scope}},}
\raggedbottom
-\let\bearwearkey\lstinline
+\newcommand\bearwearkey{\lstinline[style=bearwarestyle,breaklines=false]}
\newcommand{\TikZ}{Ti\emph{k}Z}
\GetFileInfo{bearwear.sty}
@@ -107,7 +107,7 @@
%<*package>
\RequirePackage{xparse}
\RequirePackage{tikzlings-bears}
-\ProvidesExplPackage {bearwear} {2020-01-15} {0.1}
+\ProvidesExplPackage {bearwear} {2020-04-21} {0.2}
{A package for tikz bear fashion}
\ProcessOptions\relax
% a tikzset style to reverse the clip:
@@ -224,6 +224,7 @@
\tl_new:N \l_@@_leftarm_deco_tl
\tl_new:N \l_@@_rightarm_deco_tl
\tl_new:N \l_@@_body_deco_tl
+\tl_new:N \l_@@_tikzkeys_tl
\keys_define:nn {@@}
{
@@ -265,7 +266,8 @@
{
\begin{scope}[even~odd~rule]
% handle keys
- \keys_set:nn { @@ } {#1}
+ \keys_set_known:nnN { @@ } {#1}\l_@@_tikzkeys_tl
+ \exp_args:No\tikzset{\l_@@_tikzkeys_tl}
\@@_init_path:
\@@_set_coordinates:
\@@_clipping_path:
@@ -318,8 +320,8 @@
To dress the bear with the shirt, simply add the \verb+\bear+ command from the \bearwearkey{tikzlings-bears} package.
\begin{tcblisting}{before=\parindent0pt\nopagebreak}
- \tikz{\bear;\bearwear[v-neckline];}
- \tikz{\bear;\bearwear[muscle shirt];}
+ \tikz{\bear\bearwear[v-neckline];}
+ \tikz{\bear\bearwear[muscle shirt];}
\end{tcblisting}
\subsection{Coloring the shirts}
@@ -328,35 +330,35 @@
Basically every option that would make sense in a \lstinline|\fill| is allowed here.
Patterns e.g. would work too.
\begin{tcblisting}{tikz lower}
- \bear;
+ \bear
\bearwear
[v-neckline,
leftarm=red,
rightarm=green,
- body=blue];
+ body=blue]
\end{tcblisting}
\begin{tcblisting}{tikz lower}
- \bear;
- \bearwear[arms=green];
+ \bear
+ \bearwear[arms=green]
\end{tcblisting}
\begin{tcblisting}{tikz lower}
- \bear;
+ \bear
\bearwear
[shirt=
{shade,
top color=blue,
- bottom color=red}];
+ bottom color=red}]
\end{tcblisting}
\begin{tcblisting}{tikz lower,before=\parindent0pt\nopagebreak}
- \bear;
+ \bear
\bearwear
[v-neckline,
shirt =
{pattern=
- horizontal lines light blue}];
+ horizontal lines light blue}]
\end{tcblisting}
\subsection{Additional patterns}
@@ -367,7 +369,7 @@
\bearwearkey{body pattern}, \bearwearkey{shirt pattern},
\begin{tcblisting}{tikz lower}
- \bear;
+ \bear
\bearwear
[v-neckline,
shirt=red,
@@ -375,7 +377,7 @@
{pattern=
{Stars[points=6,
radius=0.5mm,distance=1.5mm]},
- pattern color=yellow}];
+ pattern color=yellow}]
\end{tcblisting}
\subsection{Decorations}
@@ -384,7 +386,7 @@
predefined: \bearwearkey{bearheart} and \bearwearkey{beartummy}.
\begin{tcblisting}{tikz lower}
- \bear;
+ \bear
\bearwear[shirt deco =
{\fill[red] (beartummy) circle (1pt);
\fill[red] (bearheart) circle (1pt);}
@@ -392,7 +394,7 @@
\end{tcblisting}
\begin{tcblisting}{tikz lower}
- \bear;
+ \bear
\bearwear[shirt deco =
{\node at (beartummy)
{\includegraphics[width=5cm]
@@ -400,25 +402,25 @@
\end{tcblisting}
\begin{tcblisting}{tikz lower}
- \bear;
+ \bear
\bearwear[body deco=
{\node at ([yshift=-1mm]bearheart)
{\includegraphics[width=0.3cm]
- {flag}};}];
+ {flag}};}]
\end{tcblisting}
\begin{tcblisting}{tikz lower}
- \bear;
+ \bear
\bearwear[
shirt=Beige!80!black,
body deco=
{\node at ([yshift=-1mm]bearheart)
{\includegraphics[width=0.5cm]
- {latex-project-logo}};}];
+ {latex-project-logo}};}]
\end{tcblisting}
\begin{tcblisting}{tikz lower}
- \bear;
+ \bear
\bearwear[
shirt=HotPink,
body deco=
@@ -427,7 +429,7 @@
\end{tcblisting}
\begin{tcblisting}{tikz lower}
- \bear;
+ \bear
\bearwear[
arms= DeepSkyBlue,
body deco =
@@ -443,11 +445,14 @@
\subsection{Scaling}
- Scaling works as expected, but don't forget that nodes in \TikZ{} normally don't scale if you don't use the \lstinline|transform shape| key:
+ Scaling works as expected, but don't forget that nodes in \TikZ{} normally don't scale if you don't use the \lstinline|transform shape| key.
+ You can use a scope for the scaling, or the \texttt{scale} key as as unknown keys are passed to tikz --
+ in this case don't forget that both
+ the bear and the shirt needs the same scaling factor.
\begin{tcblisting}{tikz lower,before=\parindent0pt\nopagebreak,}
\begin{scope}[scale=1.5]
- \bear;
+ \bear
\bearwear[
arms= DeepSkyBlue,
body deco =
@@ -462,6 +467,32 @@
\end{scope}
\end{tcblisting}
+\begin{tcblisting}{tikz lower,before=\parindent0pt\nopagebreak,}
+ \bear[scale=0.7]
+ \bearwear[scale=0.7,
+ arms= DeepSkyBlue,
+ body deco =
+ {\node at ([yshift=-2mm]beartummy)
+ {\includegraphics[width=4cm]
+ {montblanc}};
+ \node[text=white,
+ font=\tiny\sffamily]
+ at ([yshift=2mm]beartummy)
+ {{Mont Blanc}};
+ }]
+ \end{tcblisting}
+
+ \subsection{Moving}
+
+It is possible to move the bear and the shirt with it. Ensure that the same shift
+is used if you don't want to undress the bear.
+
+\begin{tcblisting}{tikz lower,before=\parindent0pt\nopagebreak,}
+ \coordinate (newbear) at (3,0);
+ \bear\bearwear
+ \bear[shift=(newbear)]\bearwear[shirt=red,shift=(newbear)]
+\end{tcblisting}
+
\subsection{Setting up defaults}
With \lstinline|\bearwearsetup| you can change the defaults:
diff --git a/Master/texmf-dist/source/latex/beilstein/beilstein.dtx b/Master/texmf-dist/source/latex/beilstein/beilstein.dtx
index 85b27a387a0..b1f3f2bcd39 100644
--- a/Master/texmf-dist/source/latex/beilstein/beilstein.dtx
+++ b/Master/texmf-dist/source/latex/beilstein/beilstein.dtx
@@ -19,7 +19,7 @@
beilstein -- Support for submissions to the ``Beilstein Journal
of Nanotechnology'' published by the Beilstein-Institut
zur Foerderung der Chemischen Wissenschaften
-Version: 2.0
+Version: 2.1
E-mail: journals-support@beilstein-institut.de
License: Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
@@ -90,7 +90,7 @@ This work consists of the files beilstein.dtx,
%</internal>
%<*driver>
\ProvidesFile{beilstein.dtx}%
-[2020/02/22 v2.0 Bundle for submissions to the\MessageBreak ``Beilstein Journal
+[2020/08/26 v2.1 Bundle for submissions to the\MessageBreak ``Beilstein Journal
of Nanotechnology'' (BJNANO)]
\documentclass[a4paper]{ltxdoc}
\usepackage[american]{babel}
@@ -102,7 +102,7 @@ This work consists of the files beilstein.dtx,
\usepackage{array,booktabs,tabularx,longtable}
\usepackage{fancyhdr}
\pagestyle{fancy}
-\lfoot{\footnotesize BJNANO Technical Handbook (Version 2.0)}
+\lfoot{\footnotesize BJNANO Technical Handbook (Version 2.1)}
\cfoot{}
\rfoot{\thepage}
\rhead{\small\rightmark}
@@ -182,6 +182,7 @@ This work consists of the files beilstein.dtx,
% \changes{v2.0}{2020/02/05}{CODEN strings were removed from the BiBTeX style
% file}
% \changes{v2.0}{2020/02/11}{Add support for doi in @www}
+% \changes{v2.1}{2020/08/26}{Bugfix for bjnano.bst}
% \GetFileInfo{\jobname.dtx}
% \DoNotIndex{\newcommand,\newenvironment}
% \DoNotIndex{\def,\edef,\gdef,\xdef,\global,\long,\let}
@@ -1297,7 +1298,7 @@ This work consists of the files beilstein.dtx,
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{beilstein}
-[2020/02/22 v2.0 Template for submissions to the ``Beilstein Journal %
+[2020/08/26 v2.1 Template for submissions to the ``Beilstein Journal %
of Nanotechnology'' (BJNANO)]
% \end{macrocode}
% For class options key-value pairs are used. They are provided by the
@@ -2624,7 +2625,6 @@ FUNCTION {new.sentence}
if$
}
-
FUNCTION {fin.entry}
{ add.period$
write$
@@ -3593,7 +3593,7 @@ FUNCTION {inproceedings}
}
if$
booktitle format.proc.title.in "booktitle" output.check
- add.semicolon write$
+ new.block
format.pub.address "publisher" output.check
format.bdate "year" output.check
pages empty$
@@ -3695,7 +3695,7 @@ FUNCTION {software}
{ version output }
if$
after.block 'output.state :=
- format.pub.address "publisher" output.check
+ format.pub.address "publisher" output.check
format.bdate "year" output.check
format.doi output
fin.entry
diff --git a/Master/texmf-dist/source/latex/beilstein/beilstein.ins b/Master/texmf-dist/source/latex/beilstein/beilstein.ins
index 759a495c840..fcc34b6831f 100644
--- a/Master/texmf-dist/source/latex/beilstein/beilstein.ins
+++ b/Master/texmf-dist/source/latex/beilstein/beilstein.ins
@@ -6,7 +6,7 @@
beilstein -- Support for submissions to the ``Beilstein Journal
of Nanotechnology'' published by the Beilstein-Institut
zur Foerderung der Chemischen Wissenschaften
-Version: 2.0
+Version: 2.1
E-mail: journals-support@beilstein-institut.de
License: Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
diff --git a/Master/texmf-dist/source/latex/bewerbung/bewerbung.dtx b/Master/texmf-dist/source/latex/bewerbung/bewerbung.dtx
index a86c3243141..3081b10a143 100644
--- a/Master/texmf-dist/source/latex/bewerbung/bewerbung.dtx
+++ b/Master/texmf-dist/source/latex/bewerbung/bewerbung.dtx
@@ -1,20 +1,20 @@
%\iffalse
% bewerbung.dtx generated using makedtx version 0.94b (c) Nicola Talbot
% Command line args:
-% -author "André Hilbig, mail@andrehilbig.de"
-% -codetitle "Implementation"
-% -setambles "neueBewerbung.sh=>\nopreamble\nopostamble"
-% -date "2015-07-14:14:18:49 -- Version 1.1"
% -src "(.*)\.sty=>\1.sty"
% -src "(.*)\.cls=>\1.cls"
% -src "neueBewerbung.sh=>neueBewerbung.sh"
% -src "(.*)\.inc=>\1.inc"
+% -codetitle "Implementation"
+% -author "André Hilbig, mail@andrehilbig.de"
% -doc "../dokumentation.tex"
+% -setambles "neueBewerbung.sh=>\nopreamble\nopostamble"
+% -date "2020-11-24:11:30:14 -- Version 1.2"
% -macrocode "neueBewerbung.sh"
% -comment "neueBewerbung.sh"
% -comment "config.inc=>config.inc"
% bewerbung
-% Created on 2015-07-14:14:18:49 -- Version 1.1/7/14 14:18
+% Created on 2020-11-24:11:30:14 -- Version 1.2/11/24 11:30
%\fi
%\iffalse
%<*package>
@@ -37,7 +37,7 @@
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
-% Copyright (C) 2015-07-14:14:18:49 -- Version 1.1 André Hilbig, mail@andrehilbig.de, all rights reserved.
+% Copyright (C) 2020-11-24:11:30:14 -- Version 1.2 André Hilbig, mail@andrehilbig.de, all rights reserved.
% \fi
% \iffalse
%<*driver>
@@ -220,7 +220,7 @@
\xspaceaddexceptions{\guillemotright,\guillemotleft}
-\CheckSum{2158}
+\CheckSum{2181}
\begin{document}
@@ -234,7 +234,7 @@
% Übersichtstabelle zur Dokumentation der Bewerbungsversuche}
% \author{Andr\'e Hilbig \\ \texttt{mail@andrehilbig.de} \\
% \url{http://www.andrehilbig.de/index.cgi/Publications/Bewerbung}}
-% \date{2015-07-14}
+% \date{2020-11-24}
% \maketitle
% \begin{abstract}
% \foreignlanguage{english}{
@@ -325,6 +325,11 @@
% \item Satz in der Dokumentation überarbeitet
% \item Kontaktdaten in den READMEs korrigiert
% \end{itemize}
+% \item[v1.2]
+% \begin{itemize}
+% \item Anpassungen an neuere \LaTeX Versionen durchgeführt
+% \item Kleinere Anpassungen an die Titelseite
+% \end{itemize}
% \end{description}
%
% \section{Installation}
@@ -448,7 +453,8 @@
% Der Klasse |bewerbung| kann die Option |idPlain| übergeben werden. Dann wird nach
% der exakten Übereinstimmung der hier notierten Identifikation mit dem Feld ID gesucht.
% Dies muss keine Zahl sein. Wird keine Option übergeben wird die notierte Zahl als
-% Zeilennummer startend bei 0 interpretiert.
+% Zeilennummer startend bei 0 interpretiert. Außerdem kann man die Option |nophone|
+% übergeben, um das Telefonfeld auszublenden.
%
% \DescribeMacro{\Anhang}\label{Anhang}
% An zwei Stellen in einer Bewerbung werden angehangene Dokumente ausgewiesen: Titelseite
@@ -1269,10 +1275,10 @@
% name and title
% \begin{macrocode}
\begin{minipage}[b]{\@titlenamewidth}%
+ \firstnamestyle{\firstname}\\[0.75em] %
% \end{macrocode}
%% ahilbig begin
% \begin{macrocode}
- \firstnamestyle{\firstname}\\ %
\familynamestyle{\familyname}%
\ifdefempty{\acadtitle}{}{%
\\[1.25em]\acadtitlestyle{\acadtitle}}%
@@ -3016,7 +3022,7 @@
%
% \begin{macro}{\tel}
% \begin{macrocode}
-\providecommand{\tel}{}
+\providecommand{\tel}{empty}
% \end{macrocode}
% \end{macro}
%
@@ -3044,10 +3050,10 @@
% \begin{macrocode}
\ProvideDocumentCommand{\anhang}{o}{%
\IfNoValueTF{#1}{%
- Curriculum Vitae.\anhangTmpFlat
+ \lebenslaufTitel.\anhangTmpFlat
}{%
\item Anschreiben
- \item Curriculum Vitae
+ \item \lebenslaufTitel
\anhangTmpList
} %
}
@@ -3421,7 +3427,9 @@
\providecommand{\runKomaVar}{%
\setkomavar{fromname}{\fullname} %
\setkomavar{fromaddress}{\street\\\plz\xspace\stadt} %
- \setkomavar{fromphone}[\Telefon\enskip]{\tel} %
+ \ifthenelse{\equal{\tel}{empty}}{}{%
+ \setkomavar{fromphone}[\Telefon\enskip]{\tel} %
+ }%
\setkomavar{fromfax}[\Mobilefone\enskip]{\mobile} %
\setkomavar{fromemail}[\Letter\enskip]{\email} %
\setkomavar{signature}{\vorname\xspace\name} %
@@ -3442,7 +3450,9 @@
\renewcommand*{\addressstreet}{\street} %
\renewcommand*{\addresscity}{\plz\xspace\stadt} %
\renewcommand*{\address}{\street\\\plz\xspace\stadt} %
- \renewcommand*{\phonenr}{\tel} %
+ \ifthenelse{\equal{\tel}{empty}}{}{%
+ \renewcommand*{\phonenr}{\tel} %
+ }%
% \end{macrocode}
%\iffalse
%% \renewcommand*{\extrainfo}{Some extra info}
@@ -3499,7 +3509,10 @@
\ProvideDocumentEnvironment{lebenslauf}{oo}{%
\clearpage
\newgeometry{top=2.5cm,left=3cm,right=2.5cm,bottom=3cm}
- \pagestyle{empty}
+ %\pagestyle{empty}
+ \pagenumbering{arabic}
+ \hypersetup{hidelinks}
+ \ofoot{Seite \thepage\ von \pageref{LastPage}}
\ifthenelse{\equal{#1}{none}}{\renewcommand{\@listitemsymbol}{}}{} %
%\iffalse
%%\clearscrheadfoot
@@ -3513,6 +3526,7 @@
\fullname\\
\todayOrt, \todayTime
\end{tabular}
+ \label{LastPage}
\end{raggedright}
\IfNoValueF{#2}{%
\newpage %
@@ -3669,16 +3683,27 @@ setkeys=\kvsetkeys%
\DeclareStringOption[classic]{lebenslaufStyle}[classic]
\DeclareStringOption[anschrift.csv]{anschrift}[anschrift.csv]
\DeclareBoolOption{idPlain}
+\DeclareBoolOption{nophone}
\ProcessKeyvalOptions{ahbewerbung} % evaluate keyval options
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrlttr2}}
\ProcessOptions\relax
-\LoadClass[
- DIN, pagenumber=botright, backaddress=true, parskip=half,%
- fromalign=left, fromemail=true, fromfax=true, %
- fromphone=true, fromurl=false, fromalign=right, %
- fromlogo=false, fromrule=true, foldmarks=true, %
- paper=a4, fontsize=10pt,enlargefirstpage=true, firstfoot=false
-]{scrlttr2}
+\ifahbewerbung@nophone %
+ \LoadClass[
+ DIN, pagenumber=botright, backaddress=true, parskip=half,%
+ fromalign=left, fromemail=true, fromfax=true, %
+ fromphone=false, fromurl=false, fromalign=right, %
+ fromlogo=false, fromrule=true, foldmarks=true, %
+ paper=a4, fontsize=10pt,enlargefirstpage=true, firstfoot=false
+ ]{scrlttr2}
+\else %
+ \LoadClass[
+ DIN, pagenumber=botright, backaddress=true, parskip=half,%
+ fromalign=left, fromemail=true, fromfax=true, %
+ fromphone=true, fromurl=false, fromalign=right, %
+ fromlogo=false, fromrule=true, foldmarks=true, %
+ paper=a4, fontsize=10pt,enlargefirstpage=true, firstfoot=false
+ ]{scrlttr2}
+\fi %
% \end{macrocode}
%\iffalse
%% import from komacv.cls for easier maintaining
@@ -3690,7 +3715,7 @@ setkeys=\kvsetkeys%
ifluatex,%
ifxetex,%
marvosym, %
- scrpage2,%
+ scrlayer-scrpage,%
array,%
graphicx,%
microtype,%
@@ -3842,9 +3867,9 @@ cd ..
\textbf{\meinBeruf} \\ \ \\
\street\\
\plz\ \stadt\\
- \Letter\enskip \email\\
\Telefon\enskip \tel\\
\Mobilefone\enskip \mobile
+ \letter\enskip \email\\
\vfill
\textbf{Inhalt}
@@ -3861,8 +3886,10 @@ cd ..
\leftskip=0.3cm
\hspace*{0.1cm}\textit{bei}\\ % hier gehört bei rein
\textbf{\bewerbungFirma}\\
- \bewerbungFirmaAnrede\
- \bewerbungFirmaName\\
+ \ifthenelse{\equal{\bewerbungFirmaName}{n}}{}{%
+ \bewerbungFirmaAnrede\
+ \bewerbungFirmaName\\
+ }
\bewerbungFirmaStr\\
\bewerbungFirmaPlz\ \bewerbungFirmaOrt
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/bewerbung/bewerbung.ins b/Master/texmf-dist/source/latex/bewerbung/bewerbung.ins
index 2d08da06b32..049fe18f90c 100644
--- a/Master/texmf-dist/source/latex/bewerbung/bewerbung.ins
+++ b/Master/texmf-dist/source/latex/bewerbung/bewerbung.ins
@@ -1,10 +1,10 @@
-% bewerbung.ins generated using makedtx version 0.94b 2015-07-14:14:18:49 -- Version 1.1/7/14 14:18
+% bewerbung.ins generated using makedtx version 0.94b 2020-11-24:11:30:14 -- Version 1.2/11/24 11:30
\input docstrip
\preamble
bewerbung.dtx
- Copyright 2015-07-14:14:18:49 -- Version 1.1 André Hilbig, mail@andrehilbig.de
+ Copyright 2020-11-24:11:30:14 -- Version 1.2 André Hilbig, mail@andrehilbig.de
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
diff --git a/Master/texmf-dist/source/latex/biblatex-oxref/Makefile b/Master/texmf-dist/source/latex/biblatex-oxref/Makefile
index ee024a4bf68..e58dba0ac65 100644
--- a/Master/texmf-dist/source/latex/biblatex-oxref/Makefile
+++ b/Master/texmf-dist/source/latex/biblatex-oxref/Makefile
@@ -7,7 +7,7 @@ AUX = aux,bbl,bcf,blg,doc,fdb_latexmk,fls,glo,gls,hd,idx,ilg,ind,listing,log,n
SHELL = bash
PWD = $(shell pwd)
TEMP := $(shell mktemp -d -t tmp.XXXXXXXXXX)
-TDIR = $(TEMP)/$(NAME)
+TDIR = $(TEMP)/$(PFX)$(NAME)
VERS = $(shell ltxfileinfo -v $(NAME).dtx)
LOCAL = $(shell kpsewhich --var-value TEXMFLOCAL)
UTREE = $(shell kpsewhich --var-value TEXMFHOME)
@@ -26,7 +26,7 @@ $(STYS:%=%-doc.pdf): %-doc.pdf : %-doc.tex $(NAME).bbx %.bbx %.cbx british-$(NAM
latexmk -silent -lualatex -shell-escape -interaction=nonstopmode $< >/dev/null
clean:
- for log in *.log; do [ -e "$$log" ] || continue; grep "WARNING: biblatex-oxref" $$log; test $$? -eq 1; done
+ @for log in *.log; do [ -e "$$log" ] || continue; grep "WARNING: biblatex-oxref" $$log; test $$? -eq 1; done
rm -f $(NAME).{$(AUX)} $(STYS:%=%-doc.{$(AUX)})
rm -f $(STYS:%=%.doc) {american,british,english}-$(NAME).doc
rm -rf _minted-*
@@ -58,8 +58,8 @@ uninstall:
zip: all
mkdir $(TDIR)
cp $(NAME).{dtx,pdf} $(STYS:%=%-doc.pdf) README.md Makefile $(NAME).bbx $(STYS:%=%.{b,c,d}bx) $(VARS:%=$(STY1)-%.{b,c,d}bx) {american,british,english}-$(NAME).lbx $(TDIR)
- cd $(TEMP); zip -Drq $(PWD)/$(PFX)$(NAME)-$(VERS).zip $(NAME)
+ cd $(TEMP); zip -Drq $(PWD)/$(PFX)$(NAME)-$(VERS).zip $(PFX)$(NAME)
ctan: all
mkdir $(TDIR)
cp $(NAME).{dtx,pdf} $(STYS:%=%-doc.pdf) README.md Makefile $(TDIR)
- cd $(TEMP); zip -Drq $(PWD)/$(PFX)$(NAME)-$(VERS).zip $(NAME)
+ cd $(TEMP); zip -Drq $(PWD)/$(PFX)$(NAME)-$(VERS).zip $(PFX)$(NAME)
diff --git a/Master/texmf-dist/source/latex/biblatex-oxref/oxref.dtx b/Master/texmf-dist/source/latex/biblatex-oxref/oxref.dtx
index 5677b16828b..66eeb6bee5a 100644
--- a/Master/texmf-dist/source/latex/biblatex-oxref/oxref.dtx
+++ b/Master/texmf-dist/source/latex/biblatex-oxref/oxref.dtx
@@ -1,6 +1,6 @@
% \iffalse
%<*internal|bbx|cbx|dbx|lbx|doc>
-\def\Version{2020/01/27 v2.0.1}
+\def\Version{2021/01/18 v2.2}
%</internal|bbx|cbx|dbx|lbx|doc>
%<*internal>
\iffalse
@@ -166,7 +166,7 @@ See: http://www.latex-project.org/lppl.txt
\endpreamble
\postamble
-Copyright (C) 2016–2020 Alex Ball
+Copyright (C) 2016–2021 Alex Ball
\endpostamble
\usedir{tex/latex/\jobname}
@@ -229,7 +229,7 @@ Copyright (C) 2016–2020 Alex Ball
\PassOptionsToPackage{style=oxnotes}{biblatex}
%</driver>
%<doc&n>\PassOptionsToPackage{style=oxnotes,scnames,varissuedate,anon}{biblatex}
-%<doc&m>\PassOptionsToPackage{style=oxnum,scnames,varissuedate,anon}{biblatex}
+%<doc&m>\PassOptionsToPackage{style=oxnum,scnames,varissuedate,anon,backref=true}{biblatex}
%<doc&a>\PassOptionsToPackage{style=oxalph,varissuedate,anon}{biblatex}
%<doc&y>\PassOptionsToPackage{style=oxyear,varissuedate,anon}{biblatex}
%<*driver|doc>
@@ -380,7 +380,7 @@ Copyright (C) 2016–2020 Alex Ball
}
%</doc>
-\hypersetup{pdfborder={0 0 0},pdfencoding=auto}
+\hypersetup{pdfborder={0 0 0},pdfencoding=unicode}
\usepackage[noabbrev,capitalize,nameinlink]{cleveref}
\crefname{page}{page}{pages}
@@ -842,7 +842,7 @@ first two steps.
## Licence
-Copyright 2016–2020 Alex Ball.
+Copyright 2016–2021 Alex Ball.
This work consists of the documented LaTeX file oxref.dtx and a Makefile.
@@ -971,6 +971,10 @@ The style has some options additional to the regular \pkg{biblatex} ones:
Removes publisher name from all entries. Once set, this option cannot be overridden.
\end{docKey}
+\begin{docKey}{norelatedin}{=\val{true}|\val{false}}{default \val{true}, initially \val{false}}
+ Suppresses the printing of the \code{in} localization string in circumstances where it would appear directly following a related string such as \enquote{originally published as}. It can also be set on a per-type and per-entry basis. The effects of this key are not well tested, so do please get in touch (see below) if you encounter problems with it.
+\end{docKey}
+
\begin{docKey}{relationpunct}{=\val{period}|\val{comma}|\val{semicolon}|\val{colon}|\val{space}}{default \val{semicolon}, initially \val{semicolon}}
Sets the punctuation that precedes the \code{relatedtype} localization string.
An additional space is assumed unless the value is \val{space}.
@@ -5334,7 +5338,7 @@ The \emph{Oxford Guide to Style} prints all information about the transmission,
\section{Images and works of art}
-\tip{If you need the type of image or arrtwork to appear in square brackets,
+\tip{If you need the type of image or artwork to appear in square brackets,
put it in \code{titleaddon}. Otherwise, put it in \code{type}.}
\tip{Use \code{institution} (a list) or \code{venue} (a literal) for the
@@ -6918,8 +6922,13 @@ will trigger the use of parentheses.
\end{Verbatim}
\end{bibexbox}
+\defbibnote{preface}{This document uses the \pkg{biblatex} option \key{backref}
+to demonstrate how entries can be marked with the page(s) on which they were
+cited. The format of the back references comes from \pkg{biblatex} itself
+rather than \pkg[biblatex]{oxref}.}
-\printbibliography[notcategory=hidden]
+%<n|a|y>\printbibliography[notcategory=hidden]
+%<m>\printbibliography[notcategory=hidden,prenote=preface]
%</n|m|a|y>
%</doc|bib>
%<*driver>
@@ -7120,11 +7129,7 @@ will trigger the use of parentheses.
%
% \begin{macrocode}
\newtoggle{blx@ox@nametitle}\toggletrue{blx@ox@nametitle}%
-\DeclareBibliographyOption{usenametitles}[true]{%
- \settoggle{blx@ox@nametitle}{#1}}
-\DeclareTypeOption{usenametitles}[true]{%
- \settoggle{blx@ox@nametitle}{#1}}
-\DeclareEntryOption{usenametitles}[true]{%
+\DeclareBiblatexOption{global,type,entry}{usenametitles}[true]{%
\settoggle{blx@ox@nametitle}{#1}}
% \end{macrocode}
%
@@ -7903,11 +7908,7 @@ will trigger the use of parentheses.
\ifbibstring{#1}{\bibstring{#1}}{#1\isdot}%
}
\newtoggle{blx@ox@timefirst}
-\DeclareBibliographyOption{timefirst}[true]{%
- \settoggle{blx@ox@timefirst}{#1}}
-\DeclareTypeOption{timefirst}[true]{%
- \settoggle{blx@ox@timefirst}{#1}}
-\DeclareEntryOption{timefirst}[true]{%
+\DeclareBiblatexOption{global,type,entry}{timefirst}[true]{%
\settoggle{blx@ox@timefirst}{#1}}
\newbibmacro*{date+time}{%
\ifboolexpr{
@@ -8213,7 +8214,7 @@ will trigger the use of parentheses.
}
\newcommand*{\ifabbrev}[3]{%
\StrRight{#1}{1}[\blx@ox@lastchar]%
- \IfSubStr{\blx@ox@abbrevstring}{\blx@ox@lastchar}{#2}{#3}
+ \expandafter\IfSubStr*{\blx@ox@abbrevstring}{\blx@ox@lastchar}{#2}{#3}%
}
% \end{macrocode}
%
@@ -8245,9 +8246,9 @@ will trigger the use of parentheses.
}{}}%
\usebibmacro{journal}%
\iffieldundef{journalsubtitle}{%
- \ifabbrev{\thefield{journaltitle}}{\setunit{\addspace}}{\newunit}%
+ \ifabbrev{\strfield{journaltitle}}{\setunit{\addspace}}{\newunit}%
}{%
- \ifabbrev{\thefield{journalsubtitle}}{\setunit{\addspace}}{\newunit}}%
+ \ifabbrev{\strfield{journalsubtitle}}{\setunit{\addspace}}{\newunit}}%
\iffieldundef{series}{}{%
\newunit\newblock
\printfield{series}%
@@ -8270,9 +8271,9 @@ will trigger the use of parentheses.
\renewbibmacro*{title+issuetitle}{%
\usebibmacro{periodical}%
\iffieldundef{subtitle}{%
- \ifabbrev{\thefield{title}}{\setunit{\addspace}}{\newunit}%
+ \ifabbrev{\strfield{title}}{\setunit{\addspace}}{\newunit}%
}{%
- \ifabbrev{\thefield{subtitle}}{\setunit{\addspace}}{\newunit}}%
+ \ifabbrev{\strfield{subtitle}}{\setunit{\addspace}}{\newunit}}%
\iffieldundef{series}{}{%
\newunit\newblock
\printfield{series}%
@@ -8345,17 +8346,9 @@ will trigger the use of parentheses.
%
% \begin{macrocode}
\newtoggle{blx@ox@varissuedate}
-\DeclareBibliographyOption{varissuedate}[true]{%
- \settoggle{blx@ox@varissuedate}{#1}}
-\DeclareTypeOption{varissuedate}[true]{%
- \settoggle{blx@ox@varissuedate}{#1}}
-\DeclareEntryOption{varissuedate}[true]{%
+\DeclareBiblatexOption{global,type,entry}{varissuedate}[true]{%
\settoggle{blx@ox@varissuedate}{#1}}
-\DeclareBibliographyOption{issuedate-plain}[true]{%
- \settoggle{blx@ox@varissuedate}{#1}}
-\DeclareTypeOption{issuedate-plain}[true]{%
- \settoggle{blx@ox@varissuedate}{#1}}
-\DeclareEntryOption{issuedate-plain}[true]{%
+\DeclareBiblatexOption{global,type,entry}{issuedate-plain}[true]{%
\settoggle{blx@ox@varissuedate}{#1}}
\renewbibmacro*{issue+date}{%
\ifboolexpr{
@@ -8438,13 +8431,12 @@ will trigger the use of parentheses.
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
- \setunit{\bibpagerefpunct}\newblock
- \usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -8469,13 +8461,12 @@ will trigger the use of parentheses.
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
- \setunit{\bibpagerefpunct}\newblock
- \usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -8531,13 +8522,12 @@ will trigger the use of parentheses.
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
- \setunit{\bibpagerefpunct}\newblock
- \usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -8889,13 +8879,12 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
- \setunit{\bibpagerefpunct}\newblock
- \usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -8953,19 +8942,18 @@ reference,mvreference,inreference]{volume}{%
\printfield{pagetotal}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -8988,9 +8976,9 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{maintitle+booktitle}%
\newunit
\iffieldundef{maintitle}
- {\printfield{volume}%
- \printfield{part}}
- {}%
+ {\printfield{volume}%
+ \printfield{part}}
+ {}%
\newunit\newblock
\usebibmacro{byeditor+others}%
\newunit\newblock
@@ -9003,19 +8991,18 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{chapter+pages}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -9044,9 +9031,9 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{maintitle+booktitle}%
\newunit
\iffieldundef{maintitle}
- {\printfield{volume}%
- \printfield{part}}
- {}%
+ {\printfield{volume}%
+ \printfield{part}}
+ {}%
\newunit\newblock
\usebibmacro{byeditor+others}%
\newunit\newblock
@@ -9057,19 +9044,18 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{chapter+pages}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -9092,9 +9078,9 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{maintitle+booktitle}%
\newunit
\iffieldundef{maintitle}
- {\printfield{volume}%
- \printfield{part}}
- {}%
+ {\printfield{volume}%
+ \printfield{part}}
+ {}%
\newunit\newblock
\usebibmacro{byeditor+others}%
\newunit\newblock
@@ -9107,19 +9093,18 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{chapter+pages}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -9147,19 +9132,18 @@ reference,mvreference,inreference]{volume}{%
\printfield{pagetotal}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -9205,19 +9189,18 @@ reference,mvreference,inreference]{volume}{%
\printfield{pagetotal}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -9242,9 +9225,9 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{maintitle+booktitle}%
\newunit
\iffieldundef{maintitle}
- {\printfield{volume}%
- \printfield{part}}
- {}%
+ {\printfield{volume}%
+ \printfield{part}}
+ {}%
\newunit\newblock
\printfield{volumes}%
\newunit\newblock
@@ -9255,19 +9238,18 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{chapter+pages}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -9296,9 +9278,9 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{maintitle+booktitle}%
\newunit
\iffieldundef{maintitle}
- {\printfield{volume}%
- \printfield{part}}
- {}%
+ {\printfield{volume}%
+ \printfield{part}}
+ {}%
\newunit\newblock
\printfield{volumes}%
\newunit\newblock%
@@ -9307,19 +9289,18 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{chapter+pages}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -9352,19 +9333,18 @@ reference,mvreference,inreference]{volume}{%
\printfield{pagetotal}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -9413,19 +9393,18 @@ reference,mvreference,inreference]{volume}{%
\printfield{pagetotal}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -9450,9 +9429,9 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{maintitle+booktitle}%
\newunit
\iffieldundef{maintitle}
- {\printfield{volume}%
- \printfield{part}}
- {}%
+ {\printfield{volume}%
+ \printfield{part}}
+ {}%
\newunit\newblock
\printfield{edition}%
\newunit
@@ -9469,19 +9448,18 @@ reference,mvreference,inreference]{volume}{%
\printfield{pagetotal}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -9539,9 +9517,9 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{maintitle+title}%
\newunit
\iffieldundef{maintitle}
- {\printfield{volume}%
- \printfield{part}}
- {}%
+ {\printfield{volume}%
+ \printfield{part}}
+ {}%
\newunit\newblock
\usebibmacro{event+venue+date}%
\newunit\newblock
@@ -9560,19 +9538,18 @@ reference,mvreference,inreference]{volume}{%
\printfield{pagetotal}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -9593,9 +9570,9 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{maintitle+booktitle}%
\newunit
\iffieldundef{maintitle}
- {\printfield{volume}%
- \printfield{part}}
- {}%
+ {\printfield{volume}%
+ \printfield{part}}
+ {}%
\newunit\newblock
\usebibmacro{event+venue+date}%
\newunit\newblock
@@ -9612,19 +9589,18 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{chapter+pages}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -9835,9 +9811,9 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{maintitle+title}%
\newunit
\iffieldundef{maintitle}
- {\printfield{volume}%
- \printfield{part}}
- {}%
+ {\printfield{volume}%
+ \printfield{part}}
+ {}%
\setunit{\titlebyauthordelim}\newblock
\usebibmacro{byauthor}%
\newunit\newblock
@@ -9848,28 +9824,26 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{series+type+number}%
\setunit{\addspace}%
\usebibmacro{institution+location+date}%
- \iffieldequals{entrysubtype}{\legreport}{%
- \setunit{\addspace}\nopunct
- }{%
- \newunit\newblock}%
+ \iffieldequals{entrysubtype}{\legreport}
+ {\setunit{\addspace}\nopunct}
+ {\newunit\newblock}%
\usebibmacro{chapter+pages}%
\newunit
\printfield{pagetotal}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isrn}}
- {}%
+ {\printfield{isrn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -9982,13 +9956,12 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
- \setunit{\bibpagerefpunct}\newblock
- \usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -10018,17 +9991,17 @@ reference,mvreference,inreference]{volume}{%
}{}%
\usebibmacro{author/editor}%
\setunit{\printdelim{nametitledelim}}\newblock
- \ifentrytype{software}{%
- \usebibmacro{title+version}%
- }{%
- \usebibmacro{title}}%
+ \ifentrytype{software}
+ {\usebibmacro{title+version}}
+ {\usebibmacro{title}}%
\setunit{\titlebyauthordelim}\newblock
\usebibmacro{byauthor}%
\newunit\newblock
\usebibmacro{byeditor}%
\newunit
- \ifentrytype{software}{}{%
- \newunit\printfield{version}}%
+ \ifentrytype{software}
+ {}
+ {\newunit\printfield{version}}%
\newunit
\printfield{note}%
\newunit\newblock
@@ -10039,19 +10012,18 @@ reference,mvreference,inreference]{volume}{%
\printfield{pagetotal}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
\DeclareBibliographyAlias{standard}{manual}
\ExecuteBibliographyOptions[standard]{useeditor=false}
@@ -10183,19 +10155,18 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{post-byeditor+others}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -10250,19 +10221,18 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{post-byeditor+others}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -10397,19 +10367,18 @@ reference,mvreference,inreference]{volume}{%
\printlist{organization}%
\newunit\newblock
\iftoggle{bbx:isbn}
- {\printfield{isbn}}
- {}%
+ {\printfield{isbn}}
+ {}%
\newunit\newblock
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
\DeclareBibliographyAlias{image}{performance}
\DeclareBibliographyAlias{artwork}{performance}
@@ -10512,19 +10481,18 @@ reference,mvreference,inreference]{volume}{%
\printlist{publisher}%
\newunit\newblock
\iftoggle{bbx:eprint}
- {\usebibmacro{eprint}}
- {}%
+ {\usebibmacro{eprint}}
+ {}%
\newunit\newblock
\usebibmacro{url+urldate}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
+ \iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
- \iftoggle{bbx:related}
- {\usebibmacro{related:init}%
- \usebibmacro{related}}
- {}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -10596,13 +10564,12 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{doi+eprint+url}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
- \setunit{\bibpagerefpunct}\newblock
- \usebibmacro{pageref}%
- \newunit\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -10626,9 +10593,7 @@ reference,mvreference,inreference]{volume}{%
\setboolean{bbx@paryear-essential}{#1}}
\newtoggle{blx@ox@nopostnotedelim}
\newtoggle{bbx:altcourt}
-\DeclareBibliographyOption{court-plain}[true]{%
- \settoggle{bbx:altcourt}{#1}}
-\DeclareEntryOption{court-plain}[true]{%
+\DeclareBiblatexOption{global,type,entry}{court-plain}[true]{%
\settoggle{bbx:altcourt}{#1}}
\newtoggle{bbx@ecliuse}
\newtoggle{bbx@eclionly}
@@ -10962,13 +10927,13 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{doi+eprint+url}%
\setunit{\addspace}%\newblock
\usebibmacro{addendum+pubstate}%
- \setunit{\bibpagerefpunct}\newblock
- \usebibmacro{pageref}%
\setunit{\addspace}%\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
\usebibmacro{finentry}}
\newtoggle{bbx@juriscitedone}
\newbibmacro{juriscitation}{%
@@ -11387,7 +11352,8 @@ reference,mvreference,inreference]{volume}{%
\usebibmacro{legsupp}}}}%
\setunit{\addcomma\space}%
\printfield{note}%
- \setunit{\addspace}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
\usebibmacro{finentry}}
\newbibmacro*{courtrules}{%
\restorefield{prenote}{\postnotesecond}%
@@ -11757,11 +11723,12 @@ reference,mvreference,inreference]{volume}{%
\iftoggle{bbx:url}{%
\usebibmacro{url+urldate}%
}{}%
- \setunit{\relatedtypepunct}\newblock
\iftoggle{bbx:related}{%
\usebibmacro{related:init}%
\usebibmacro{related}%
}{}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -11824,13 +11791,12 @@ reference,mvreference,inreference]{volume}{%
{}%
\newunit\newblock
\usebibmacro{addendum+pubstate}%
- \setunit{\bibpagerefpunct}\newblock
- \usebibmacro{pageref}%
- \setunit{\relatedtypepunct}\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
\usebibmacro{finentry}}
% \end{macrocode}
%
@@ -11851,81 +11817,128 @@ reference,mvreference,inreference]{volume}{%
% \subsection{Related entries}
%
% We make the punctuation before related items configurable in remaining drivers
-% inherited from the standard style.
+% inherited from the standard style, and move the |pageref| macro to the end.
%
% \begin{macrocode}
\xpatchbibdriver{booklet}{%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
\newunit\newblock
\iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
}{%
- \setunit{\relatedtypepunct}\newblock
\iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
}{}{\wlog{WARNING: biblatex-oxref failed to patch booklet}}
+% \end{macrocode}
+% \begin{macrocode}
\xpatchbibdriver{misc}{%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
\newunit\newblock
\iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
}{%
- \setunit{\relatedtypepunct}\newblock
\iftoggle{bbx:related}
+ {\usebibmacro{related:init}%
+ \usebibmacro{related}}
+ {}%
+ \setunit{\bibpagerefpunct}\newblock
+ \usebibmacro{pageref}%
}{}{\wlog{WARNING: biblatex-oxref failed to patch misc}}
% \end{macrocode}
%
% We provide an option for setting the relatedtype punctuation.
%
% \begin{macrocode}
-\DeclareBibliographyOption[string]{relationpunct}[semicolon]{%
- \ifcsdef{add#1}{%
- \ifstrequal{#1}{space}{%
- \renewcommand*{\relatedtypepunct}{\addspace}%
- }{%
- \renewcommand*{\relatedtypepunct}{\csuse{add#1}\space}}%
- }{%
+\DeclareDelimFormat{begrelateddelimequals}{\addspace}
+\DeclareDelimFormat{begrelateddelimin}{\addcomma\space}
+\DeclareDelimFormat{begrelateddelimincludes}{\addcomma\space}
+\DeclareDelimFormat{begrelateddelimreprintfrom}{\addperiod\space}
+\DeclareDelimFormat{begrelateddelimreviewof}{\newunitpunct}
+\DeclareDelimFormat{begrelateddelimtranslationof}{\addspace}
+\DeclareDelimFormat{begrelateddelimmultivolume}{\newunitpunct}
+\DeclareDelimFormat{relateddelimmultivolume}{\newunitpunct}
+\newtoggle{blx@ox@success}
+\DeclareBiblatexOption{global,type}[string]{relationpunct}[semicolon]{%
+ \bgroup\blx@blxinit
+ \ifcsdef{add#1}{\global\toggletrue{blx@ox@success}}{%
+ \global\togglefalse{blx@ox@success}%
\PackageError{biblatex-oxref}{%
Invalid option 'relationpunct=#1'%
}{%
Valid values are 'dot', 'comma', 'semicolon', 'colon',\MessageBreak
- 'period', 'exclam', 'question', and 'space'.}}}
-\DeclareTypeOption[string]{relationpunct}[semicolon]{%
- \ifcsdef{add#1}{%
- \ifstrequal{#1}{space}{%
- \renewcommand*{\relatedtypepunct}{\addspace}%
- }{%
- \renewcommand*{\relatedtypepunct}{\csuse{add#1}\space}}%
+ 'period', 'exclam', 'question', and 'space'.}}%
+ \egroup
+ \iftoggle{blx@ox@success}{\ifstrequal{#1}{space}{%
+ \DeclareDelimFormat{begrelateddelim}{\addspace}%
}{%
- \PackageError{biblatex-oxref}{%
- Invalid option 'relationpunct=#1'%
- }{%
- Valid values are 'dot', 'comma', 'semicolon', 'colon',\MessageBreak
- 'period', 'exclam', 'question', and 'space'.}}}
-\newtoggle{blx@ox@relpunctset}
+ \DeclareDelimFormat{begrelateddelim}{\csuse{add#1}\space}}%
+ }{}}
\DeclareEntryOption[string]{relationpunct}[semicolon]{%
- \ifcsdef{add#1}{%
- \ifstrequal{#1}{space}{%
- \renewcommand*{\relatedtypepunct}{\addspace}%
- }{%
- \renewcommand*{\relatedtypepunct}{\csuse{add#1}\space}}%
- \toggletrue{blx@ox@relpunctset}
- }{%
+ \bgroup\blx@blxinit
+ \ifcsdef{add#1}{\global\toggletrue{blx@ox@success}}{%
+ \global\togglefalse{blx@ox@success}%
\PackageError{biblatex-oxref}{%
Invalid option 'relationpunct=#1'%
}{%
Valid values are 'dot', 'comma', 'semicolon', 'colon',\MessageBreak
- 'period', 'exclam', 'question', and 'space'.}}}
+ 'period', 'exclam', 'question', and 'space'.}}%
+ \egroup
+ \iftoggle{blx@ox@success}{\ifstrequal{#1}{space}{%
+ \DeclareDelimFormat{begrelateddelim}{\addspace}%
+ \DeclareDelimFormat{begrelateddelimequals}{\addspace}%
+ \DeclareDelimFormat{begrelateddelimin}{\addspace}%
+ \DeclareDelimFormat{begrelateddelimincludes}{\addspace}%
+ \DeclareDelimFormat{begrelateddelimreprintfrom}{\addspace}%
+ \DeclareDelimFormat{begrelateddelimreviewof}{\addspace}%
+ \DeclareDelimFormat{begrelateddelimtranslationof}{\addspace}%
+ \DeclareDelimFormat{begrelateddelimmultivolume}{\addspace}%
+ }{%
+ \DeclareDelimFormat{begrelateddelim}{\csuse{add#1}\space}%
+ \DeclareDelimFormat{begrelateddelimequals}{\csuse{add#1}\space}%
+ \DeclareDelimFormat{begrelateddelimin}{\csuse{add#1}\space}%
+ \DeclareDelimFormat{begrelateddelimincludes}{\csuse{add#1}\space}%
+ \DeclareDelimFormat{begrelateddelimreprintfrom}{\csuse{add#1}\space}%
+ \DeclareDelimFormat{begrelateddelimreviewof}{\csuse{add#1}\space}%
+ \DeclareDelimFormat{begrelateddelimtranslationof}{\csuse{add#1}\space}%
+ \DeclareDelimFormat{begrelateddelimmultivolume}{\csuse{add#1}\space}}%
+ }{}}
+\ExecuteBibliographyOptions{relationpunct}
\newcounter{blx@ox@relitem}
\xapptobibmacro{begrelated}{%
\setcounter{blx@ox@relitem}{0}%
- \iftoggle{blx@ox@relpunctset}{}{%
- \iffieldequalstr{relatedtype}{in}{%
- \setunit{\addcomma\space}}{}%
- \iffieldequalstr{relatedtype}{reprintfrom}{%
- \setunit{\addperiod\space}}{}%
- \iffieldequalstr{relatedtype}{translationof}{%
- \setunit{\addspace}}{}%
- \iffieldequalstr{relatedtype}{multivolume}{%
- \setunit{\addcomma\space}}{}%
-}}{}{\wlog{WARNING: biblatex-oxref failed to append to begrelated}}
-\DeclareDelimFormat{relateddelimmultivolume}{\newunitpunct}
-\DeclareDelimFormat{begrelateddelimmultivolume}{\newunitpunct}
+}{}{\wlog{WARNING: biblatex-oxref failed to append to begrelated}}
+% \end{macrocode}
+%
+% We provide an option to prevent a related item beginning with "in".
+%
+% \begin{macrocode}
+\newtoggle{blx@ox@norelin}
+\DeclareBiblatexOption{global,type,entry}{norelatedin}[true]{%
+ \settoggle{blx@ox@norelin}{#1}}
+\xapptobibmacro{begrelatedloop}{%
+ \iftoggle{blx@ox@norelin}{%
+ \renewbibmacro*{in:}{%
+ \ifboolexpr{
+ test {\ifnameundef{author}}
+ and
+ test {\ifnameundef{translator}}
+ and
+ test {\iffieldundef{title}}
+ }{}{%
+ \bibstring{in}%
+ \printunit{\intitlepunct}%
+ }}}{}%
+}{}{\wlog{WARNING: biblatex-oxref failed to append to begrelatedloop}}
% \end{macrocode}
%
@@ -12142,21 +12155,21 @@ reference,mvreference,inreference]{volume}{%
% \subsubsection{Related editions}
%
% This macro is based on the \enquote{bytranslator} one, but more general.
+% Note that |\mkrelatedstringtext| was introduced in \pkg{biblatex} v3.16,
+% so we backport it if an earlier version is used.
%
% \begin{macrocode}
+\providecommand*{\mkrelatedstringtext}[1]{{{\mainlang #1}}}
\newbibmacro*{related:editedas}[1]{%
\entrydata{#1}{%
\renewbibmacro*{name:hook}[1]{%
- \ifnumequal{\value{listcount}}{1}{%
- \begingroup
- \mkrelatedstring%
- \lbx@initnamehook{#1}%
- \endgroup
- }{}}%
+ \ifnumequal{\value{listcount}}{1}
+ {\mkrelatedstringtext{\lbx@initnamehook{#1}}}
+ {}}%
\printfield{edition}%
\setunit{\addspace}%
\usebibmacro{byeditor+others}%
- \setunit*{\addcomma\space\bibstring[\mkrelatedstring]{astitle}\space}%
+ \setunit*{\addcomma\space\bibstring[\mkrelatedstringtext]{astitle}\space}%
\usebibmacro{maintitle+title}%
\setunit{\addspace}%
\printfield{note}%
@@ -12168,13 +12181,10 @@ reference,mvreference,inreference]{volume}{%
\entrydata{#1}{%
\renewbibmacro*{name:hook}[1]{%
\ifnumequal{\value{listcount}}{1}
- {\begingroup
- \mkrelatedstring%
- \lbx@initnamehook{#1}%
- \endgroup}
+ {\mkrelatedstringtext{\lbx@initnamehook{#1}}}
{}}%
\printnames[bytranslator]{translator}%
- \setunit*{\addspace\bibstring[\mkrelatedstring]{astitle}\space}%
+ \setunit*{\addspace\bibstring[\mkrelatedstringtext]{astitle}\space}%
\usebibmacro{maintitle+title}%
\setunit{\addspace}%
\printfield{note}%
@@ -12846,8 +12856,8 @@ reference,mvreference,inreference]{volume}{%
\defbibenvironment{bibliography}
{\list
{\printtext[labelnumberwidth]{%
- \printfield{labelprefix}%
- \printfield{labelnumber}}}
+ \printfield{labelprefix}%
+ \printfield{labelnumber}}}
{\setlength{\labelwidth}{\labelnumberwidth}%
\setlength{\leftmargin}{\labelwidth}%
\setlength{\labelsep}{\biblabelsep}%
@@ -12875,7 +12885,7 @@ reference,mvreference,inreference]{volume}{%
\entryset
{\ifbool{bbx:subentry}
{\printfield[bibentrysetcount]{entrysetcount}%
- \printunit*{\addnbspace}}
+ \printunit*{\addnbspace}}
{}}
{}%
\newunit\newblock
@@ -12999,11 +13009,7 @@ reference,mvreference,inreference]{volume}{%
%
% \begin{macrocode}
\newtoggle{blx@ox@nonodate}
-\DeclareBibliographyOption{nonodate}[true]{%
- \settoggle{blx@ox@nonodate}{#1}}
-\DeclareTypeOption{nonodate}[true]{%
- \settoggle{blx@ox@nonodate}{#1}}
-\DeclareEntryOption{nonodate}[true]{%
+\DeclareBiblatexOption{global,type,entry}{nonodate}[true]{%
\settoggle{blx@ox@nonodate}{#1}}
\newbibmacro*{labeldate}{%
\ifboolexpr{
diff --git a/Master/texmf-dist/source/latex/biblatex-oxref/oxref.ins b/Master/texmf-dist/source/latex/biblatex-oxref/oxref.ins
index 159820d794d..bd53350964c 100644
--- a/Master/texmf-dist/source/latex/biblatex-oxref/oxref.ins
+++ b/Master/texmf-dist/source/latex/biblatex-oxref/oxref.ins
@@ -37,7 +37,7 @@ See: http://www.latex-project.org/lppl.txt
\endpreamble
\postamble
-Copyright (C) 2016–2020 Alex Ball
+Copyright (C) 2016–2021 Alex Ball
\endpostamble
\usedir{tex/latex/\jobname}
@@ -83,6 +83,6 @@ Copyright (C) 2016–2020 Alex Ball
}
\endbatchfile
%%
-%% Copyright (C) 2016–2020 Alex Ball
+%% Copyright (C) 2016–2021 Alex Ball
%%
%% End of file `oxref.ins'.
diff --git a/Master/texmf-dist/source/latex/biblatex-philosophy/biblatex-philosophy.bib b/Master/texmf-dist/source/latex/biblatex-philosophy/biblatex-philosophy.bib
index 77ce8566eee..c5f341c1d19 100644
--- a/Master/texmf-dist/source/latex/biblatex-philosophy/biblatex-philosophy.bib
+++ b/Master/texmf-dist/source/latex/biblatex-philosophy/biblatex-philosophy.bib
@@ -5,239 +5,265 @@
%% The original source files were:
%%
%% biblatex-philosophy.dtx (with options: `bib')
-%% ______________________________________________________
-%% The biblatex-philosophy package
-%% Copyright (C) 2009-2018 Ivan Valbusa
+%%
+%% The 'biblatex-philosophy' package
+%% Copyright (C) 2009-2020 Ivan Valbusa
+%% <ivan dot valbusa at gmail dot com>
+%%
%% All rights reserved
%%
-%% License information appended
+%% 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
+%% http://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 consists of all files listed in README
+%%
+%% This work has the LPPL maintenance status "author-maintained".
%%
-
-
-@BOOK{Eco:2004,
-annotation = {A guide for typesetting a thesis aimed for Italian students in the humanities.},
-author = {Umberto Eco},
-title = {Come si fa una tesi di laurea},
-subtitle = {Le materie umanistiche},
-publisher = {Bompiani},
-location = {Milano},
-date ={1977}
+@book{Eco:2004,
+ annotation = {A guide for typesetting a thesis aimed for
+ Italian students in the humanities.},
+ author = {Umberto Eco},
+ title = {Come si fa una tesi di laurea},
+ subtitle = {Le materie umanistiche},
+ publisher = {Bompiani},
+ location = {Milano},
+ date = {1977}
}
-@INCOLLECTION{Termini:2007,
- author = {Settimo Termini},
- title = {Vita morte e miracoli di Alan Mathison Turing},
- crossref = {Bartocci:2007},
- date-added = {2009-10-22 14:36:21 +0200},
- date-modified = {2013-03-15 16:53:58 +0100},
- keywords= {esempio},
- langid = {italian},
- annotation = {This entry includes all the informations of the parent \texttt{collection} linked through the \texttt{crossref} field}
+@incollection{Termini:2007,
+ author = {Settimo Termini},
+ title = {Vita morte e miracoli di Alan Mathison Turing},
+ crossref = {Bartocci:2007},
+ keywords = {esempio},
+ langid = {italian},
+ annotation = {This entry includes all the informations
+ of the parent \texttt{collection} linked through
+ the \texttt{crossref} field}
}
-@BOOK{aristotle:ethics,
- title = {Nichomachean Ethics},
- publisher = {J. Hall \& Son},
- author = {Aristotle},
- annotation = {A \texttt{book} entry with a \texttt{translator} field. Note also the \texttt{entrysubtype} field which is set to \texttt{classic}},
- booktitle = {Nichomachean Ethics},
- date = {1872},
+@book{aristotle:ethics,
+ title = {Nichomachean Ethics},
+ publisher = {J. Hall \& Son},
+ author = {Aristotle},
+ annotation = {A \texttt{@book} entry with a \texttt{translator} field.
+ Note also the \texttt{entrysubtype} field which
+ is set to \texttt{classic}},
+ booktitle = {Nichomachean Ethics},
+ date = {1872},
entrysubtype = {classic},
- langid = {american},
- keywords = {esempio},
- location = {London},
- shorttitle = {Nich\adddotspace Ethics},
- translator = {F. A. Paley, F. M.}
+ langid = {american},
+ keywords = {esempio},
+ location = {London},
+ shorttitle = {Nich\adddotspace Ethics},
+ translator = {F. A. Paley, F. M.}
}
-@ONLINE{clawson:mla,
- annote = {\texttt{Biblatex-mla} provides support to Biblatex , BibTeX, and LaTeX for citations and Works. Cited lists in the style established by the Modern Language Association (MLA). For commands and options to change package defaults, see § 3.1 and § 3.2, respectively, below. MLA style, a common standard for writers in the humanities, is outlined in the MLA
- \emph{Style Manual}, in its 3\textsubscript{rd} edition, and the \emph{MLA Handbook for Writers of Research Papers}, now
- in its 8\textsubscript{th} edition. \texttt{Biblatex-mla} follows the style outlined in the latter of these. It also
- follows the logic of the MLA when citing similar material repeatedly, trimming unnecessary
- information from citations where necessary. \texttt{Biblatex-mla} is compatible with \texttt{Biblatex}’s
- support for \texttt{hyperref} and \texttt{tex4ht} , and the main word in each citation (either the author’s
- name, the title, or the page number) serves as a link to the particular entry in the Works
- Cited.},
- author = {James Clawson},
- date = {2010},
- date-added = {2012-04-18 11:51:47 +0200},
- date-modified = {2013-03-13 22:02:08 +0100},
- keywords = {primaria},
- subtitle = {MLA Style Using biblatex},
- title = {\texttt{biblatex-mla}},
- url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-mla/doc/biblatex-mla.pdf},
- version = {0.95}
+@online{clawson:mla,
+ annotation = {\texttt{Biblatex-mla} provides support to \texttt{biblatex},
+ \hologo{BibTeX}, and \LaTeX\ for citations and Works Cited lists in the style
+ established by the Modern Language Association (MLA). For commands
+ and options to change package defaults, see § 3.1 and § 3.2,
+ respectively, below. MLA style, a common standard for writers
+ in the humanities, is outlined in the \emph{MLA Style Manual},
+ in its 3\textsubscript{rd} edition,
+ and the \emph{MLA Handbook for Writers of Research Papers},
+ now in its 8\textsubscript{th} edition. \texttt{Biblatex-mla}
+ follows the style outlined in the latter of these. It also
+ follows the logic of the MLA when citing similar material
+ repeatedly, trimming unnecessary
+ information from citations where necessary. \texttt{Biblatex-mla}
+ is compatible with \texttt{Biblatex}’s
+ support for \texttt{hyperref} and \texttt{tex4ht},
+ and the main word in each citation (either the author’s
+ name, the title, or the page number) serves as a link
+ to the particular entry in the Works Cited.},
+ author = {James Clawson},
+ date = {2016-11-02},
+ keywords = {primaria},
+ subtitle = {MLA Style Using \texttt{Biblatex}},
+ title = {\texttt{biblatex-mla}},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-mla/doc/biblatex-mla.pdf},
+ version = {1.9}
}
-@ONLINE{glibof:historian,
- annote = {The files \texttt{historian.bbx}, \texttt{historian.cbx}, and \texttt{historian.lbx} im-
- plement a bibliography and citation style for use with Philipp Lehman’s
- \texttt{biblatex} package. Historian follows the conventions of \emph{The Chicago
- Manual of Style}, as presented in Turabian’s \emph{Manual for Writers}. The
+@online{glibof:historian,
+ annotation = {The files \texttt{historian.bbx},
+ \texttt{historian.cbx},
+ and \texttt{historian.lbx} implement a bibliography
+ and citation style for use with Philipp Lehman’s
+ \texttt{biblatex} package. \texttt{Historian} follows the conventions of
+ \emph{The Chicago Manual of Style}, as presented in Turabian’s
+ \emph{Manual for Writers}. The
style is designed for use by historians who need to generate detailed
- footnotes not only for ordinary books and articles, but also reprint edi-
- tions, correspondence, archives and archival documents, online sources,
+ footnotes not only for ordinary books and articles, but also reprint
+ editions, correspondence, archives and archival documents, online sources,
book reviews, unpublished manuscripts, and conference presentations.},
- author = {Sander Gliboff},
- date = {2010},
- date-added = {2012-04-18 11:49:37 +0200},
- date-modified = {2013-03-13 23:38:14 +0100},
- langid = {english},
- keywords = {primaria},
- subtitle = {A Footnotes-and-Bibliography Style, Following Turabian/Chicago Guidelines:
- For Use with the Biblatex System of Programmable Bibliographies and
- Citations},
- title = {User's Guide to \texttt{Historian}},
- url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-historian/historian.pdf},
- version = {0.4}
+ author = {Sander Gliboff},
+ date = {2010-08-22},
+ langid = {english},
+ keywords = {primaria},
+ subtitle = {A Footnotes-and-Bibliography Style,
+ Following Turabian/Chicago Guidelines:
+ For Use with the \texttt{Biblatex} System of Programmable
+ Bibliographies and Citations},
+ title = {User's Guide to \texttt{Historian}},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-historian/historian.pdf},
+ version = {0.4}
}
-@BOOK{guzman:sd,
- title = {Problemática logico-lingüística de la comunicacíon social con el
- pueblo Aymara},
- year = {s.d.},
- author = {Guzmán de Rojas, Iván},
- note = {mimeo},
- addendum = {Con los auspicios del Centro internacional de Investigacíones para
- el Desarrollo de Canada},
- annote = {A work without a pubblication date. The string \texttt{nodate} (localized)
- is automatically printed},
- date-added = {2012-04-17 23:48:05 +0200},
- date-modified = {2013-03-15 16:40:38 +0100},
- keywords = {esempio},
- shorttitle = {Problemática}
+@book{guzman:sd,
+ title = {Problemática logico-lingüística de la
+ comunicacíon social con el pueblo Aymara},
+ year = {s.d.},
+ author = {Guzmán de Rojas, Iván},
+ note = {mimeo},
+ addendum = {Con los auspicios del Centro internacional
+ de Investigacíones para el Desarrollo de Canada},
+ annotation = {A work without a pubblication date.
+ The string \texttt{nodate} (localized) is automatically printed},
+ keywords = {esempio},
+ shorttitle = {Problemática}
}
-@BOOK{heidegger:sz,
- title = {Sein und Zeit},
- publisher = {Max Niemeyer Verlag},
- author = {Martin Heidegger},
- edition = {18},
- annote = {Note the \texttt{library} field, use for some details about the first
- edition},
- booktitle = {Sein und Zeit},
- date = {2001},
- date-added = {2012-04-15 18:03:59 +0200},
- date-modified = {2013-03-15 16:41:30 +0100},
- keywords = {esempio,volumesingolo},
- library = {Originally published in 1927 in the \emph{Jahrbuch für Philosophie
- und phänomenologische Forschung (vol. VIII)}, directed by H. Husserl},
- location = {Tübingen}
+@book{heidegger:sz,
+ title = {Sein und Zeit},
+ publisher = {Max Niemeyer Verlag},
+ author = {Martin Heidegger},
+ edition = {18},
+ annotation = {Note the \texttt{library} field, use for some
+ details about the first edition.},
+ booktitle = {Sein und Zeit},
+ date = {2001},
+ keywords = {esempio,volumesingolo},
+ library = {Originally published in 1927 in the
+ \emph{Jahrbuch für Philosophie und phänomenologische
+ Forschung (vol. VIII)}, directed by H. Husserl},
+ location = {Tübingen}
}
-@BOOKINBOOK{kant:kpv:xref,
- author = {Kant, Immanuel},
- date = {1968},
- date-added = {2013-02-25 22:44:19 +0100},
- date-modified = {2013-03-15 19:27:33 +0100},
- keywords = {esempio},
- pages = {1-163},
- shorthand = {KpV},
- shorttitle = {Kritik der praktischen Vernunft},
- title = {Kritik der praktischen Vernunft},
- volume = {5},
- xref = {kant:werke},
- annotation = {A single volume from the critical edition of Kant's (\emph{Kants Werke}). Note the \texttt{xref} field.}
+@bookinbook{kant:kpv:xref,
+ author = {Kant, Immanuel},
+ date = {1968},
+ keywords = {esempio},
+ pages = {1-163},
+ shorthand = {KpV},
+ shorttitle = {Kritik der praktischen Vernunft},
+ title = {Kritik der praktischen Vernunft},
+ volume = {5},
+ xref = {kant:werke},
+ annotation = {A single volume from the critical edition
+ of Kant's (\emph{Kants Werke}). Note the \texttt{xref} field.}
}
-@BOOKINBOOK{kant:ku:xref,
- author = {Kant, Immanuel},
- date = {1968},
- date-added = {2013-02-28 09:42:34 +0100},
- date-modified = {2013-03-15 19:27:38 +0100},
- langid = {german},
- keywords = {esempio},
- pages = {165-485},
- title = {Kritik der Urtheilskraft},
- volume = {5},
- xref = {kant:werke},
- annotation = {A single volume from the critical edition of Kant's (\emph{Kants Werke}). Note the \texttt{xref} field.}
+@bookinbook{kant:ku:xref,
+ author = {Kant, Immanuel},
+ date = {1968},
+ langid = {german},
+ keywords = {esempio},
+ pages = {165-485},
+ title = {Kritik der Urtheilskraft},
+ volume = {5},
+ xref = {kant:werke},
+ annotation = {A single volume from the critical edition
+ of Kant's (\emph{Kants Werke}). Note the \texttt{xref} field.}
}
@mvbook{kant:werke,
- author = {Kant, Immanuel},
- booktitle = {Kants Werke. Akademie Textausgabe},
- date = {1968},
- date-added = {2010-03-06 00:26:39 +0100},
- date-modified = {2013-03-15 14:01:45 +0100},
- langid = {german},
- keywords = {esempio},
- location = {Berlin},
- maintitle = {Kants Werke. Akademie Textausgabe},
- publisher = {Walter de Gruyter},
- shorthand = {KW},
- title = {Kants Werke. Akademie Textausgabe},
- volumes = {9}
+ author = {Kant, Immanuel},
+ booktitle = {Kants Werke. Akademie Textausgabe},
+ date = {1968},
+ langid = {german},
+ keywords = {esempio},
+ location = {Berlin},
+ maintitle = {Kants Werke. Akademie Textausgabe},
+ publisher = {Walter de Gruyter},
+ shorthand = {KW},
+ title = {Kants Werke. Akademie Textausgabe},
+ volumes = {9}
}
@mvbook{comenio:oo,
- annote = {This author is known with his Latin name, given in the \texttt{nameaddon}
- field},
- author = {Jan Amos Komensky},
- booktitle = {Opera Omnia},
- date = {1969},
- date-added = {2012-04-19 20:20:03 +0200},
- date-modified = {2013-03-15 16:32:24 +0100},
- keywords = {esempio},
- location = {Praga},
- nameaddon = {Comenius},
- title = {Opera Omnia}
+ annotation = {This author is known with his Latin name,
+ given in the \texttt{nameaddon} field.},
+ author = {Jan Amos Komensky},
+ booktitle = {Opera Omnia},
+ date = {1969},
+ keywords = {esempio},
+ location = {Praga},
+ nameaddon = {Comenius},
+ title = {Opera Omnia}
}
-@ONLINE{kime:biber,
- annotation = {Biber is conceptually a Bib\TeX{} replacement for Biblatex. It is written in Perl
- with the aim of providing a customised and sophisticated data preparation backend
- for Biblatex. You do not need to install Perl to use Biber—binaries are provided
- for many operating systems via the main \TeX{} distributions (\TeX Live, Mac\TeX,
- MiK\TeX) and also via download from SourceForge. Functionally, Biber offers a
- superset of Bib\TeX’s capabilities but is tightly coupled with Biblatex and cannot
- be used as a stand-alone tool with standard .bst styles. Biber’s primary role is to
- support Biblatex by performing the following tasks:
+@online{kime:biber,
+ annotation = {Biber is conceptually a \hologo{BibTeX} replacement for
+ \texttt{biblatex}.
+ It is written in Perl with the aim of providing a customised
+ and sophisticated data preparation backend
+ for \texttt{biblatex}. You do not need to install Perl to use
+ Biber---binaries are provided
+ for many operating systems via the main \TeX{} distributions (\TeX~Live,
+ Mac\TeX, MiK\TeX) and also via download from SourceForge.
+ Functionally, Biber offers a superset of \hologo{BibTeX}’s capabilities
+ but is tightly coupled with \texttt{biblatex} and cannot
+ be used as a stand-alone tool with standard \texttt{.bst} styles.
+ Biber’s primary role is to
+ support \texttt{biblatex} by performing the following tasks:
Parsing data from datasources;
Processing cross-references, entry sets, related entries;
Generating data for name, name list and name/year disambiguation;
- Structural validation according to Biblatex data model;
+ Structural validation according to \texttt{biblatex} data model;
Sorting reference lists;
- Outputting data to a .bbl for Biblatex to consume},
- author = {Philip Kime and François Charette},
- title = {\texttt{biber}},
- subtitle = {A backend bibliography processor for biblatex},
- date = {2016-05-12},
- langid = {english},
- keywords = {primaria},
- url = {http://biblatex-biber.sourceforge.net},
- version = {2.7}
+ Outputting data to a \texttt{.bbl} for \texttt{biblatex} to consume.},
+ author = {Philip Kime and François Charette},
+ title = {\texttt{biber}},
+ subtitle = {A backend bibliography processor for \texttt{biblatex}},
+ date = {2019-12-01},
+ langid = {english},
+ keywords = {primaria},
+ url = {http://biblatex-biber.sourceforge.net},
+ version = {2.14}
}
-@ONLINE{lehman:biblatex,
- annote = {This package provides advanced bibliographic facilities for use with \LaTeX. The
- package is a complete reimplementation of the bibliographic facilities provided by
- \LaTeX. The biblatex package works with the “backend” (program) biber, which
- is used to process Bib\TeX{} format data files and them performs all sorting, label
- generation (and a great deal more). Formatting of the bibliography is entirely con-
- trolled by \TeX{} macros. Good working knowledge in \LaTeX{} should be sufficient to
- design new bibliography and citation styles. This package also supports subdivided
- bibliographies, multiple bibliographies within one document, and separate lists of
- bibliographic information such as abbreviations of various fields. Bibliographies may
- be subdivided into parts and/or segmented by topics. Just like the bibliography styles,
- all citation commands may be freely defined. Features such as full Unicode support
- for bibliography data, customisable sorting, multiple bibliographies with different
- sorting, customisable labels and dynamic data modification are available},
- author = {Philipp Lehman},
- nameaddon = {with Philip Kime, Audrey Boruvka and Joseph Wright},
- date = {2016-11-16},
- langid = {english},
- keywords = {primaria},
- subtitle = {Programmable Bibliographies and Citations},
- title = {The \texttt{biblatex} Package},
- url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf},
- version = {3.7}
+@online{lehman:biblatex,
+ annotation = {This package provides advanced bibliographic facilities
+ for use with \LaTeX. The package is a complete reimplementation
+ of the bibliographic facilities provided by
+ \LaTeX. The \texttt{biblatex} package works with the “backend”
+ (program) \texttt{biber}, which is used to process \hologo{BibTeX} format
+ data files and them performs all sorting, label
+ generation (and a great deal more). Formatting of the bibliography
+ is entirely controlled by \TeX{} macros. Good working knowledge
+ in \LaTeX{} should be sufficient to
+ design new bibliography and citation styles. This package
+ also supports subdivided bibliographies, multiple bibliographies
+ within one document, and separate lists of bibliographic information
+ such as abbreviations of various fields. Bibliographies may
+ be subdivided into parts and/or segmented by topics.
+ Just like the bibliography styles,
+ all citation commands may be freely defined. Features such as
+ full Unicode support for bibliography data, customisable sorting,
+ multiple bibliographies with different
+ sorting, customisable labels and dynamic data
+ modification are available.},
+ author = {Philipp Lehman},
+ nameaddon = {with Philip Kime and Moritz Wemheuer},
+ date = {2019-12-01},
+ langid = {english},
+ keywords = {primaria},
+ subtitle = {Programmable Bibliographies and Citations},
+ title = {The \texttt{biblatex} Package},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf},
+ version = {3.14}
}
-@ONLINE{babel,
- annote = {This manual describes babel, a package that makes
+@online{babel,
+ annotation = {This manual describes \texttt{babel}, a package that makes
use of the capabilities of \TeX{} version 3 and, to some
extent, \texttt{xetex} and \texttt{luatex}, to provide an environment
in which documents can be typeset in a language
@@ -245,283 +271,271 @@ date ={1977}
or script. However, no attempt has been done to take full
advantage of the features provided by the latter,
which would require a completely new core (as for
- example polyglossia or as part of \LaTeX 3)},
- author = {Johannes L. Braams},
- date = {2016-04-23},
- langid = {english},
- keywords = {primaria},
- title = {Babel},
- url = {http://mirrors.ctan.org/macros/latex/contrib/babel/babel.pdf},
- version = {3.9r}
+ example \texttt{polyglossia} or as part of \hologo{LaTeX3})},
+ author = {Johannes L. Braams},
+ nameaddon = {with Javer Bezos},
+ date = {2020-02-28},
+ langid = {english},
+ keywords = {primaria},
+ title = {Babel},
+ subtitle = {Localization and internationalization},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/babel/babel.pdf},
+ version = {3.41}
}
-@ONLINE{polyglossia,
- annote = {Polyglossia is a package for facilitating multilingual typesetting with Xe\LaTeX{} and
- (at an early stage) Lua\LaTeX. Basically, it can be used as an alternative to babel
+@online{polyglossia,
+ annotation = {\texttt{Polyglossia} is a package for facilitating multilingual
+ typesetting with \hologo{XeLaTeX} and
+ (with some exceptions) \hologo{LuaLaTeX}. Basically, it can be used as
+ an alternative to \texttt{babel}
for performing the following tasks automatically:
1. Loading the appropriate hyphenation patterns.
2. Setting the script and language tags of the current font (if possible and
- available), via the package fontspec.
+ available), via the package \texttt{fontspec}.
3. Switching to a font assigned by the user to a particular script or language.
4. Adjusting some typographical conventions according to the current lan-
- guage (such as afterindent, frenchindent, spaces before or after punctu-
- ation marks, etc.).
+ guage (such as afterindent, frenchindent, spaces before or after
+ punctuation marks, etc.).
5. Redefining all document strings (like “chapter”, “figure”, “bibliography”).
6. Adapting the formatting of dates (for non-Gregorian calendars via external
- packages bundled with polyglossia: currently the Hebrew, Islamic and
+ packages bundled with \texttt{polyglossia}: currently the Hebrew, Islamic and
Farsi calendars are supported).
7. For languages that have their own numbering system, modifying the
formatting of numbers appropriately (this also includes redefining the al-
phabetic sequence for non-Latin alphabets).
8. Ensuring proper directionality if the document contains languages that are
- written from right to left (via the package bidi, available separately).},
- author = {François Charette},
- date = {2015-03-25},
- langid = {english},
- keywords = {primaria},
- title = {Polyglossia: An Alternative to Babel for Xe\LaTeX{} and Lua\LaTeX},
- url = {http://mirrors.ctan.org/macros/latex/contrib/babel/babel.pdf},
- version = {1.42.4}
+ written from right to left (via the package \texttt{bidi}, available separately).},
+ author = {François Charette},
+ nameaddon = {with Arthur Reutenauer, Bastien Roucariès and Jürgen Spitzmüller},
+ date = {2020-01-29},
+ langid = {english},
+ keywords = {primaria},
+ title = {Polyglossia: Modern multilingual typesetting with \hologo{XeLaTeX} and \hologo{LuaLaTeX}},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/babel/babel.pdf},
+ version = {1.47}
}
-@ONLINE{csquotes,
- annote = {This package provides advanced facilities for inline and display quotations. It is
- designed for a wide range of tasks ranging from the most simple applications to
- the more complex demands of formal quotations. The facilities include commands,
- environments, and user-definable ‘smart quotes’ which dynamically adjust to their
- context. Quotation marks are switched automatically if quotations are nested and
- can adjust to the current language. There are additional features designed to cope
- with the more specific demands of academic writing. All quote styles as well as the
- optional active quotes are freely configurable},
- author = {Philipp Lehman and Joseph Wright},
- date = {2017-02-03},
- langid = {english},
+@online{csquotes,
+ annotation = {This package provides advanced facilities for inline
+ and display quotations. It is designed for a wide range of
+ tasks ranging from the most simple applications to
+ the more complex demands of formal quotations. The facilities
+ include commands, environments, and user-definable ‘smart quotes’
+ which dynamically adjust to their
+ context. Quotation marks are switched automatically
+ if quotations are nested and
+ can adjust to the current language. There are additional
+ features designed to cope
+ with the more specific demands of academic writing.
+ All quote styles as well as the
+ optional active quotes are freely configurable.},
+ author = {Philipp Lehman and Joseph Wright},
+ date = {2019-12-06},
+ langid = {english},
keywords = {primaria},
subtitle = {Context Sensitive Quotation Facilities},
- title = {The \texttt{csquotes} Package},
- url = {http://mirrors.ctan.org/macros/latex/contrib/csquotes/csquotes.pdf},
- version = {5.2a}
+ title = {The \texttt{csquotes} Package},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/csquotes/csquotes.pdf},
+ version = {5.2j}
}
-@BOOK{pantieri:artelatex,
- title = {L'arte di scrivere con \LaTeX},
- author = {Lorenzo Pantieri and Tommaso Gordini},
- annote = {Lo scopo di questo lavoro, rivolto sia a chi muove i primi passiin \LaTeX{} sia a quanti già lo conoscono, è di offrire ai suoi utenti italiani le conoscenze essenziali per poterlo usare con successo. I concetti fondamentali della materia, raccolti da svariati manuali, vengono presentati nel modo più chiaro e organico possibile; nel contempo si fornisce un vasto campionario di esempi e si analizzano alcuni tipici problemi che potrebbero presentarsi nella redazione di una pubblicazione scientifica o professionale in italiano, indicando per ciascuno le soluzioni per noi migliori.},
- booktitle = {L'arte di scrivere con \LaTeX},
- date = {2011},
- date-added = {2010-03-06 00:26:39 +0100},
- date-modified = {2013-03-13 22:04:30 +0100},
- foreword = {Enrico Gregorio},
- langid = {italian},
- keywords = {primaria},
- subtitle = {Un'introduzione a \LaTeX},
- url = {http://www.lorenzopantieri.net/LaTeX_files/ArteLaTeX.pdf}
+@book{pantieri:artelatex,
+ title = {L'arte di scrivere con \LaTeX},
+ author = {Lorenzo Pantieri and Tommaso Gordini},
+ annotation = {Lo scopo di questo lavoro, rivolto sia a chi muove
+ i primi passi in \LaTeX\ sia a quanti già lo conoscono,
+ è di offrire ai suoi utenti italiani le conoscenze essenziali
+ per poterlo usare con successo. I concetti fondamentali
+ della materia, raccolti da svariati manuali, vengono presentati
+ nel modo più chiaro e organico possibile; nel contempo si fornisce
+ un vasto campionario di esempi e si analizzano alcuni
+ tipici problemi che potrebbero presentarsi nella redazione
+ di una pubblicazione scientifica o professionale in italiano,
+ indicando per ciascuno le soluzioni per noi migliori.},
+ booktitle = {L'arte di scrivere con \LaTeX},
+ date = {2019},
+ foreword = {Enrico Gregorio},
+ langid = {italian},
+ keywords = {primaria},
+ subtitle = {Un'introduzione a \LaTeX},
+ url = {http://www.lorenzopantieri.net/LaTeX_files/ArteLaTeX.pdf}
}
-@BOOK{Poincare:1968-ITA,
- title = {La scienza e l'ipotesi},
- publisher = {Bompiani},
- author = {Jules-Henri Poincaré},
- editor = {Corrado Sinigaglia},
- note = {testo greco a fronte},
- booktitle = {La science et l'hypothèse},
- date = {2003},
- date-modified = {2013-03-15 19:07:03 +0100},
- langid = {italian},
- keywords = {esempio},
- location = {Milano}
+@book{Poincare:1968-ITA,
+ title = {La scienza e l'ipotesi},
+ publisher = {Bompiani},
+ author = {Jules-Henri Poincaré},
+ editor = {Corrado Sinigaglia},
+ note = {testo greco a fronte},
+ booktitle = {La science et l'hypothèse},
+ date = {2003},
+ langid = {italian},
+ keywords = {esempio},
+ location = {Milano}
}
-@BOOK{Poincare:1968-ORIG,
- title = {La science et l'hypothèse},
- publisher = {Flammarion},
- author = {Jules-Henri Poincaré},
- annote = {A book entry followed by its translation, cross-referenced in the
- \texttt{related} field},
- booktitle = {La science et l'hypothèse},
- date = {1968},
- date-added = {2010-03-05 16:18:11 +0100},
- date-modified = {2013-03-15 19:07:49 +0100},
- langid = {french},
- keywords = {esempio},
- location = {Paris},
- related = {Poincare:1968-ITA}
+@book{Poincare:1968-ORIG,
+ title = {La science et l'hypothèse},
+ publisher = {Flammarion},
+ author = {Jules-Henri Poincaré},
+ annotation = {A \texttt{@book} entry followed by its translation, cross-referenced in the
+ \texttt{related} field},
+ booktitle = {La science et l'hypothèse},
+ date = {1968},
+ langid = {french},
+ keywords = {esempio},
+ location = {Paris},
+ related = {Poincare:1968-ITA}
}
-@BOOK{popper-logik,
- title = {Logik der Forschung},
- publisher = {Springer},
- author = {Karl R. Popper},
- annote = {A book entry followed by two differents translations, cross-referenced
- in the \texttt{related} (biber 1.6 required)},
- booktitle = {Logik der Forschung},
- date = {1934},
- date-added = {2013-03-01 17:50:26 +0100},
- date-modified = {2013-03-15 16:46:51 +0100},
- keywords = {esempio},
- location = {Wien},
- related = {popper-logik:ing},
- timestamp = {2012.04.25}
+@book{popper-logik,
+ title = {Logik der Forschung},
+ publisher = {Springer},
+ author = {Karl R. Popper},
+ annotation = {A \texttt{@book} entry followed by two differents translations,
+ cross-referenced in the \texttt{related} (Biber 1.6 required)},
+ booktitle = {Logik der Forschung},
+ date = {1934},
+ keywords = {esempio},
+ location = {Wien},
+ related = {popper-logik:ing},
+ timestamp = {2012.04.25}
}
-@BOOK{popper-logik:ing,
- title = {The Logic of Scientific Discovery},
- publisher = {Hutchinson},
- author = {Karl R. Popper},
- edition = {3},
- booktitle = {The Logic of Scientific Discovery},
- date = {1959},
- date-added = {2013-03-01 17:55:40 +0100},
- date-modified = {2013-03-15 16:48:11 +0100},
- keywords = {esempio,popper},
- location = {London},
- related = {popper-logik:ita},
- relatedstring={it. trans.},
- timestamp = {2012.04.25}
+@book{popper-logik:ing,
+ title = {The Logic of Scientific Discovery},
+ publisher = {Hutchinson},
+ author = {Karl R. Popper},
+ edition = {3},
+ booktitle = {The Logic of Scientific Discovery},
+ date = {1959},
+ keywords = {esempio,popper},
+ location = {London},
+ related = {popper-logik:ita},
+ relatedstring = {it. trans.},
+ timestamp = {2012.04.25}
}
-@BOOK{popper-logik:ita,
- title = {Logica della scoperta scientifica},
- publisher = {Einaudi},
- author = {Karl R. Popper},
- edition = {3},
- date = {1998},
- date-added = {2013-03-01 17:50:46 +0100},
- date-modified = {2013-03-15 16:48:21 +0100},
- hyphenation = {italian},
- keywords = {esempio,popper},
- location = {Torino},
- timestamp = {2012.04.25}
+@book{popper-logik:ita,
+ title = {Logica della scoperta scientifica},
+ publisher = {Einaudi},
+ author = {Karl R. Popper},
+ edition = {3},
+ date = {1998},
+ hyphenation = {italian},
+ keywords = {esempio,popper},
+ location = {Torino},
+ timestamp = {2012.04.25}
}
-@INCOLLECTION{Valbusa:2007,
- author = {Ivan Valbusa},
- title = {Psicologia e sistema in Alsted e in Wolff},
- booktitle = {Christian Wolff tra psicologia empirica e psicologia razionale},
- publisher = {Georg Olms Verlag},
- editor = {Ferdinando Luigi Marcolungo},
- date = {2007},
- date-added = {2009-09-27 23:17:07 +0200},
- date-modified = {2009-10-13 13:16:37 +0200},
- langid = {italian},
- keywords = {esempio},
- location = {Hildesheim and Zürich and London}
+@incollection{Valbusa:2007,
+ author = {Ivan Valbusa},
+ title = {Psicologia e sistema in Alsted e in Wolff},
+ booktitle = {Christian Wolff tra psicologia empirica
+ e psicologia razionale},
+ publisher = {Georg Olms Verlag},
+ editor = {Ferdinando Luigi Marcolungo},
+ date = {2007},
+ langid = {italian},
+ keywords = {esempio},
+ location = {Hildesheim and Zürich and London}
}
-@ONLINE{wassenhoven:dw,
- annote = {A small collection of styles for the biblatex package.
- It was designed for citations in the Humanities and offers some features
- that are not provided by the standard biblatex styles. biblatex-dw
- is dependent on biblatex – version 1.7 needs at least version 3.3
- of biblatex and was tested with biblatex version 3.6 and biber version 2.6.},
- author = {Dominik Waßenhoven},
- date = {2011},
- date-added = {2013-03-13 21:58:04 +0100},
- date-modified = {2013-03-13 22:05:36 +0100},
- keywords = {primaria},
- title = {\texttt{biblatex-dw}},
- url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-dw/doc/biblatex-dw.pdf},
- version = {1.4}
+@online{wassenhoven:dw,
+ annotation = {\texttt{biblatex-dw} is a small collection
+ of styles for the \texttt{biblatex} package.
+ It was designed for citations in the Humanities and offers some features
+ that are not provided by the standard \texttt{biblatex} styles.
+ \texttt{biblatex-dw} is dependent on \texttt{biblatex} – version 1.7
+ needs at least version 3.3
+ of \texttt{biblatex} and was tested with \texttt{biblatex}
+ version 3.6 and \texttt{biber} version 2.6.},
+ author = {Dominik Waßenhoven},
+ date = {2016-12-06},
+ keywords = {primaria},
+ title = {\texttt{biblatex-dw}},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-dw/doc/biblatex-dw.pdf},
+ version = {1.7}
}
-@COLLECTION{Bartocci:2007,
- annote = {A collection with four authors},
+@collection{Bartocci:2007,
+ annotation = {A collection with four authors},
booksubtitle = {Protagonisti del '900 da Hilbert a Wiles},
- booktitle = {Vite matematiche},
- date = {2007},
- editor = {Claudio Bartocci and Renato Betti and Angelo Guerraggio and Roberto
- Lucchetti},
- langid = {italian},
- location = {Milano},
- publisher = {Springer-Verlag Italia},
- title = {Vite matematiche}
+ booktitle = {Vite matematiche},
+ date = {2007},
+ editor = {Claudio Bartocci and Renato Betti and
+ Angelo Guerraggio and Roberto Lucchetti},
+ langid = {italian},
+ location = {Milano},
+ publisher = {Springer-Verlag Italia},
+ title = {Vite matematiche}
}
-@COLLECTION{Filmed:2009,
- annote = {A collection with four editors. The list is automatically truncated
- in the citations},
- booktitle = {Filosofia delle medicina},
- date = {2009},
- date-added = {2009-09-27 23:05:08 +0200},
- date-modified = {2013-03-15 16:37:44 +0100},
- editor = {Pierdaniele Giaretta and Antonio Moretto and Gian Franco Gensini
- and Marco Trabucchi},
- langid = {italian},
- keywords = {esempio},
- location = {Bologna},
- publisher = {il Mulino},
- subtitle = {Metodo, modelli, cura ed errori},
- title = {Filosofia delle medicina},
- volumes = {2}
+@collection{Filmed:2009,
+ annotation = {A collection with four editors. The list
+ is automatically truncated in the citations},
+ booktitle = {Filosofia delle medicina},
+ date = {2009},
+ editor = {Pierdaniele Giaretta and Antonio Moretto
+ and Gian Franco Gensini and Marco Trabucchi},
+ langid = {italian},
+ keywords = {esempio},
+ location = {Bologna},
+ publisher = {il Mulino},
+ subtitle = {Metodo, modelli, cura ed errori},
+ title = {Filosofia delle medicina},
+ volumes = {2}
}
-@INCOLLECTION{corrocher:2009,
- author = {Roberto Corrocher},
- title = {Riflessioni sull'uomo di fronte a nuove sfide},
- pages = {27-42},
- annote = {An \texttt{@incollection} entry. The \texttt{@collection} is automatically
- printed in the bibliography because another \texttt{@incollection}
- has been cited},
- crossref = {Filmed:2009},
- date-added = {2010-03-06 00:26:39 +0100},
- date-modified = {2013-03-15 16:33:22 +0100},
- langid = {italian},
- keywords = {esempio},
- read = {0}
+@incollection{corrocher:2009,
+ author = {Roberto Corrocher},
+ title = {Riflessioni sull'uomo di fronte a nuove sfide},
+ pages = {27-42},
+ annotation = {An \texttt{@incollection} entry.
+ The \texttt{@collection} is automatically
+ printed in the bibliography because
+ another \texttt{@incollection} has been cited.},
+ crossref = {Filmed:2009},
+ langid = {italian},
+ keywords = {esempio},
+ read = {0}
}
-@INCOLLECTION{federspil:2009,
- author = {Giovanni Federspil and Roberto Vettor},
- title = {Medicina: un unico metodo e una sola argomentazione?},
- pages = {43-74},
- annote = {An \texttt{@incollection} entry. The \texttt{@collection} is automatically
- printed in the bibliography because another \texttt{@incollection}
- has been cited},
- crossref = {Filmed:2009},
- date-added = {2010-03-06 00:26:39 +0100},
- date-modified = {2013-03-15 16:37:35 +0100},
- langid = {italian},
- keywords = {esempio}
+@incollection{federspil:2009,
+ author = {Giovanni Federspil and Roberto Vettor},
+ title = {Medicina: un unico metodo e una sola argomentazione?},
+ pages = {43-74},
+ annotation = {An \texttt{@incollection} entry. The \texttt{@collection}
+ is automatically printed in the bibliography because
+ another \texttt{@incollection} has been cited.},
+ crossref = {Filmed:2009},
+ langid = {italian},
+ keywords = {esempio}
}
-@ONLINE{ctan,
- annotation = {The official web site of the Comprehensive \TeX{} Archive Network},
- bdsk-url-1 = {http://www.ctan.org},
- date = {2006},
- date-added = {2011-06-02 17:33:32 +0200},
- date-modified = {2013-03-15 16:35:26 +0100},
- langid = {american},
- keywords = {web},
- label = {CTAN},
- subtitle = {The Comprehensive TeX Archive Network},
- title = {CTAN},
- url = {http://www.ctan.org},
- urldate = {2006-10-01}
+@online{ctan,
+ annotation = {The official website of the Comprehensive \TeX\ Archive Network},
+ bdsk-url-1 = {http://www.ctan.org},
+ date = {2006},
+ langid = {american},
+ keywords = {web},
+ label = {CTAN},
+ subtitle = {The Comprehensive \TeX\ Archive Network},
+ title = {CTAN},
+ url = {http://www.ctan.org},
+ urldate = {2006-10-01}
}
-@ONLINE{guit:sito,
- annotation = {The official web site of the Italian TeX Group},
- bdsk-url-1 = {http://www.guitex.org},
- date = {2012},
- date-added = {2012-04-21 16:52:51 +0200},
- date-modified = {2013-03-15 16:40:18 +0100},
- langid = {italian},
- keywords = {web},
- title = {GuIT. Gruppo degli Utilizzatori Italiani di \TeX},
- url = {http://www.guitex.org},
- urldate = {2012-01-15}
+@online{guit:sito,
+ annotation = {The official website of the Italian \TeX\ Group},
+ bdsk-url-1 = {http://www.guitex.org},
+ date = {2012},
+ langid = {italian},
+ keywords = {web},
+ title = {\GuIT. Gruppo degli Utilizzatori Italiani di \TeX},
+ url = {http://www.guitex.org},
+ urldate = {2012-01-15}
}
-%%
-%% Copyright 2009-2018 by Ivan Valbusa
-%%
-%% This program is provided under the terms of the
-%% LaTeX Project Public License distributed from CTAN
-%% archives in directory macros/latex/base/lppl.txt.
-%%
-%% Author: Ivan Valbusa
-%% ivan dot valbusa at univr dot it
-%%
-%% This work has the LPPL maintenance status "author-maintained".
-%%
+\endinput
%%
%% End of file `biblatex-philosophy.bib'.
diff --git a/Master/texmf-dist/source/latex/biblatex-philosophy/biblatex-philosophy.dtx b/Master/texmf-dist/source/latex/biblatex-philosophy/biblatex-philosophy.dtx
index 8556b4ba562..47b8f33a2d7 100644
--- a/Master/texmf-dist/source/latex/biblatex-philosophy/biblatex-philosophy.dtx
+++ b/Master/texmf-dist/source/latex/biblatex-philosophy/biblatex-philosophy.dtx
@@ -1,31 +1,29 @@
% \iffalse meta-comment
%<*internal>
\begingroup
-\input docstrip.tex
-\keepsilent
+\input docstrip
\preamble
-______________________________________________________
-The biblatex-philosophy package
-Copyright (C) 2009-2018 Ivan Valbusa
-All rights reserved
-
-License information appended
-\endpreamble
-\postamble
+The 'biblatex-philosophy' package
+Copyright (C) 2009-2020 Ivan Valbusa
+<ivan dot valbusa at gmail dot com>
-Copyright 2009-2018 by Ivan Valbusa
+All rights reserved
-This program is provided under the terms of the
-LaTeX Project Public License distributed from CTAN
-archives in directory macros/latex/base/lppl.txt.
+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
+ http://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.
-Author: Ivan Valbusa
-ivan dot valbusa at univr dot it
+This work consists of all files listed in README
This work has the LPPL maintenance status "author-maintained".
-\endpostamble
+\endpreamble
+\keepsilent
\askforoverwritefalse
\Msg{*** Generating the class file ***}
@@ -41,8 +39,7 @@ This work has the LPPL maintenance status "author-maintained".
\file{english-philosophy.lbx}{\from{biblatex-philosophy.dtx}{english-lbx}}
\file{spanish-philosophy.lbx}{\from{biblatex-philosophy.dtx}{spanish-lbx}}
\file{french-philosophy.lbx}{\from{biblatex-philosophy.dtx}{french-lbx}}
- \file{biblatex-philosophy.bib}{\from{biblatex-philosophy.dtx}{bib}}
-}
+ \file{biblatex-philosophy.bib}{\from{biblatex-philosophy.dtx}{bib}}}
\Msg{***********************************************************}
\Msg{*}
@@ -70,21 +67,7 @@ This work has the LPPL maintenance status "author-maintained".
\Msg{***********************************************************}
\endgroup
%</internal>
-%
-% Copyright (C) 2009-2018 by Ivan Valbusa
-% <ivan dot valbusa at univr dot it>
-% -------------------------------------------------------
-%
-% 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
-% http://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.
-%
% \fi
-%
% \iffalse
%<*driver>
\ProvidesFile{biblatex-philosophy.dtx}
@@ -101,54 +84,75 @@ This work has the LPPL maintenance status "author-maintained".
%<spanish-lbx>\ProvidesFile{spanish-philosophy.lbx}
%<french-lbx>\ProvidesFile{french-philosophy.lbx}
%<*standard-bbx|classic-bbx|modern-bbx|verbose-bbx|classic-cbx|modern-cbx|verbose-cbx|italian-lbx|english-lbx|spanish-lbx|french-lbx>
-[2018/03/03 v1.9.8a A set of styles for biblatex]
+[2020/09/30 v1.9.8c A set of styles for biblatex]
%</standard-bbx|classic-bbx|modern-bbx|verbose-bbx|classic-cbx|modern-cbx|verbose-cbx|italian-lbx|english-lbx|spanish-lbx|french-lbx>
%<*driver>
-\documentclass[10pt]{ltxdoc}
+\documentclass[12pt]{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
+\usepackage[fontsize=12pt]{fontsize}
\usepackage[english]{babel}
-% fonts and colors
-\usepackage[osf,p,mono=false]{libertine}
-\usepackage[libertine]{newtxmath}
+%--------------------------------------------------------
+% GRAPHICS
+%--------------------------------------------------------
\usepackage[svgnames]{xcolor}
\definecolor{philA}{named}{DarkRed}
\definecolor{philB}{named}{NavyBlue}
-\usepackage{metalogo}
-\usepackage{guit}
+\definecolor{sufred}{rgb}{0.5,0,0}
+\definecolor{sufgray}{rgb}{0.5,0.5,0.5}
+\usepackage{tikz}
+\usetikzlibrary{shadows}
+\usepackage[framemethod=TikZ]{mdframed}
+\mdfsetup{roundcorner=3pt,linecolor=white,backgroundcolor=gray!10}
+%--------------------------------------------------------
+% DOC FACILITIES
+%--------------------------------------------------------
+\usepackage{metalogo,hologo}
+\usepackage{guit}% before ltxdockit but after xcolor!
\usepackage[final]{microtype}
-% doc facilities
\let\cs\relax
\let\cmd\relax
\usepackage{ltxdockit}
\usepackage{btxdockit}
-% bibliography
+%--------------------------------------------------------
+% FONTS
+%--------------------------------------------------------
+\usepackage{cochineal}
+\usepackage[varqu,varl,var0]{inconsolata}
+\usepackage{biolinum}
+\usepackage[cochineal,bigdelims,cmintegrals,vvarbb]{newtxmath}
+\usepackage{microtype}
+%--------------------------------------------------------
+% LAYOUT
+%--------------------------------------------------------
+\usepackage[skip=1.5ex]{parskip}
+\setcounter{tocdepth}{3}
+\usepackage{geometry}
+\geometry{
+ a4paper,
+ margin=3cm,
+ %paperwidth=128mm,
+ %paperheight=96mm,
+ %margin=1cm,
+ headheight=15pt,
+ ignoreall,
+ heightrounded}
+\usepackage{sectsty}
+\allsectionsfont{\sffamily}
+% --------------------------------------------------------
+% OTHER PACKAGES
+% --------------------------------------------------------
\usepackage{csquotes}
\usepackage[style=philosophy-modern,annotation=true]{biblatex}
+\setlength{\bibhang}{60pt}
\addbibresource{biblatex-philosophy.bib}
\addbibresource{biblatex-examples.bib}
\DeclareBibliographyCategory{biblatex}
\addtocategory{biblatex}{set,stdmodel,matuz:doody,vizedom:related,britannica,gaonkar,jaffe,westfahl:frontier,cms,ctan,jcg,yoon,worman,wilde,westfahl:space,weinberg,wassenberg,vazques-de-parga,springer,spiegelberg,sorace,sigfridsson,shore,sarfraz,salam,reese,pines,piccato,padhye,nussbaum,nietzsche:ksa,nietzsche:ksa1,nietzsche:historie,moraux,moore,moore:related,massa,maron,markey,malinowski,loh,laufenberg,kullback,kullback:reprint,kullback:related,kowalik,knuth:ct,knuth:ct:a,knuth:ct:b,knuth:ct:c,knuth:ct:d,knuth:ct:e,knuth:ct:related,kastenholz,kant:kpv,kant:ku,itzhaki,hyman,murray,iliad,herrmann,hammond,companion,gonzalez,glashow,gillies,gerhardt,vangennep,vangennep:trans,vangennep:related,geer,gaonkar:in,doody,cotton,coleridge,cicero,chiu,brandt,bertram,baez/article,baez/online,averroes/bland,averroes/hannes,averroes/hercz,augustine,aristotle:anima,aristotle:physics,aristotle:poetics,aristotle:rhetoric,angenendt,almendro,aksin}
-
-% layout
-\setcounter{tocdepth}{3}
-\usepackage{geometry}
-\geometry{paperwidth=17cm,paperheight=24cm,margin=1.4cm,top=2cm,bottom=2cm,headheight=15pt,ignoreall,heightrounded}
-\usepackage{sectsty}
-\allsectionsfont{\sffamily}
-\usepackage{fancyhdr}
- \fancyhf{}
- \fancyhead[L]{© 2009--\the\year\quad Ivan Valbusa}
- \fancyfoot[L]{\textsf{biblatex-philosophy}
- \fileversion{} -- \filedate}
- \renewcommand{\footrulewidth}{0.4pt}
- \fancyhead[R]{\thepage}
- \pagestyle{fancy}
-\usepackage[framemethod=TikZ]{mdframed}
- \mdfsetup{roundcorner=3pt}
- \usetikzlibrary{shadows}
-% New commands
-\def\suftesi{\textsf{suftesi}}
+%--------------------------------------------------------
+% COMMANDS AND ENVIRONMENTS
+%--------------------------------------------------------
+\newcommand*{\OR}{${}\mid{}$}
\newcommand{\argstyle}{\itshape}
\DeclareRobustCommand*{\ar}[1]{\texttt{\char`\{}%
\textrm{\argstyle#1}\texttt{\char`\}}}
@@ -161,11 +165,11 @@ This work has the LPPL maintenance status "author-maintained".
\newcommand{\emphasize}[1]{\textcolor{teal}{#1}}
% environments
\newenvironment{ttquote}
-{\begin{mdframed}[linecolor=black!50]
+{\begin{mdframed}
\ttfamily\microtypesetup{activate=false}}
{\end{mdframed}}
\newenvironment{latexcode}
-{\begin{mdframed}[linecolor=black!50]}
+{\begin{mdframed}}
{\end{mdframed}}
\newenvironment{bibexample}[1][]
{\begin{mdframed}[frametitlefont={\bfseries},#1,backgroundcolor=philA!10,linecolor=white]
@@ -176,60 +180,25 @@ This work has the LPPL maintenance status "author-maintained".
\list{}{\setlength{\itemindent}{-.5cm}\setlength{\leftmargin}{.5cm}\setlength{\itemsep}{0pt}}}
{\endlist\end{mdframed}\end{NoHyper}
}
-
\makeatletter
-\renewenvironment*{optionlist}
-{\list{}{%
- \setlength{\labelwidth}{2.5cm}%
- \setlength{\labelsep}{\z@}%
- \setlength{\leftmargin}{2.5cm}%
- \renewcommand*{\makelabel}[1]{\hss\optionlistfont##1}}%
- \ltd@optionlist}
-{\endlist}
-\renewenvironment*{fieldlist}[1][3cm]
-{\list{}{%
- \setlength{\labelwidth}{#1}%
- \setlength{\labelsep}{\marglistsep}%
- \setlength{\leftmargin}{2.5cm}%
- \renewcommand*{\makelabel}[1]{\hss\marglistfont##1}}%
- \def\fielditem##1##2{%
- \item[##1]%
- \ltd@pdfbookmark{##1}{##1}%
- field (##2)\par\nobreak
- \vspace{\itemsep}}%
- \def\listitem##1##2{%
- \item[##1]%
- \ltd@pdfbookmark{##1}{##1}%
- list (##2)\par\nobreak
- \vspace{\itemsep}}}
-{\endlist}
-\renewenvironment*{ltxsyntax}[1][3cm]
-{\list{}{%
- \setlength{\labelwidth}{3cm}%
- \setlength{\labelsep}{0pt}%
- \setlength{\leftmargin}{#1}%
- \renewcommand*{\makelabel}[1]{%
- \hss\ltxsyntaxfont\ltxsyntaxlabelfont##1}}%
- \let\csitem\ltd@csitem
- \let\cmditem\ltd@cmditem
- \let\envitem\ltd@envitem
- \let\lenitem\ltd@csitem
- \let\boolitem\ltd@boolitem
- \let\cntitem\ltd@item
- \let\optitem\ltd@item}
-{\endlist}
-{\endlist}
-\renewenvironment*{valuelist}[1][]
-{\list{}{%
- \ifblank{#1}
- {\setlength{\labelwidth}{5em}}
- {\setlength{\labelwidth}{#1}}%
- \setlength{\labelsep}{1em}%
- \setlength{\leftmargin}{\labelwidth}%
- \addtolength{\leftmargin}{\labelsep}%
- \setlength{\itemsep}{0pt}%
- \renewcommand*{\makelabel}[1]{\valuelistfont##1\hss}}}
-{\endlist}
+% Customizing option and value list:
+\renewcommand*{\ltd@ol@optitem}[3][]{%To use \meta inside #2
+ \ifblank{#1}
+ {\ltd@option{}{#2}{#3}{}}
+ {\ltd@option{}{#2}{#3}{\ltd@textverb{#1}}}}%
+\patchcmd{\optionlist}{\marglistwidth}{0pt}{}{}
+\patchcmd{\optionlist}{\hss}{\phantom{\rule{1pt}{20pt}}\hss}{}{}
+\patchcmd{\ltd@option@i}{\linewidth}{\linewidth-\marglistwidth}{}{}
+
+\patchcmd{\fieldlist}{field }{\ \ field }{}{}
+\patchcmd{\fieldlist}{\marglistwidth}{0pt}{}{}
+\patchcmd{\fieldlist}{\marglistsep}{0pt}{}{}
+
+\pretocmd{\valuelist}{\let\optionlistfont\valuelistfont}{}{}
+\patchcmd{\ltxsyntax}{\marglistwidth}{0pt}{}{}
+\patchcmd{\ltd@option@i}{=}{\ = }{}{}
+\expandafter\patchcmd\csname\string\valuelist\endcsname{{\leftmargin}{\labelsep}}{{\leftmargin}{3\labelsep}}{}{}
+% New color for items
\newcommand*{\valuelistfont}{%
\color{olive}\sffamily\displayverbfont}
\renewcommand*{\optionlistfont}{%
@@ -249,21 +218,26 @@ This work has the LPPL maintenance status "author-maintained".
\@starttoc{toc}%
\end{multicols}}
\makeatother
+% --------------------------------------------------------
+% HYPERREF SETUP
+% --------------------------------------------------------
+\usepackage{hyperref}
+ \hypersetup{%
+ hidelinks,
+ pdftitle={User's guide to \textsf{biblatex philosophy}},
+ pdfsubject={Bibliography styles for (Italian)
+ users of biblatex},
+ pdfauthor={Ivan Valbusa},
+ pdfkeywords={bibliography},
+ }
+% --------------------------------------------------------
+% FINAL SETTINGS
+% --------------------------------------------------------
+\setcounter{tocdepth}{2}
- \usepackage{hyperref}
- \hypersetup{%
-hidelinks,
-% colorlinks=true,citecolor=philA,linkcolor=philA,
- pdftitle={User's Guide to \textsf{biblatex philosophy}},
- pdfsubject={Bibliography styles for (Italian)
- users of biblatex},
- pdfauthor={Ivan Valbusa},
- pdfkeywords={bibliography},
- }
-
- \EnableCrossrefs
- \CodelineIndex
- \RecordChanges
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
\begin{document}
\DocInput{biblatex-philosophy.dtx}
@@ -272,7 +246,7 @@ hidelinks,
%</driver>
% \fi
%
-% \CheckSum{4458}
+% \CheckSum{4353}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -290,6 +264,8 @@ hidelinks,
% Grave accent \` Left brace \{ Vertical bar \|
% Right brace \} Tilde \~}
%
+% \changes{v1.9.8c}{2020/09/30}{Maintenance release. Corrected a bug in the related entries. Added \cmd{mkrelatedparens} and \cmd{mkrelatedbrackets}.}
+% \changes{v1.9.8b}{2020/05/19}{Maintenance release. Corrected a bug in \bibtype{incollection} and \bibtype{inproceeding} without editor.}
% \changes{v1.9.8a}{2018/03/03}{Maintenance release. Corrected missing commas in some \texttt{.lbx} files.}
% \changes{v1.9.8}{2017/11/29}{Maintenance release. Updated macros involving \texttt{extrayear} component.}
% \changes{v1.9.7}{2017/10/05}{Maintenance release. Fixed a bug in the \bibtype{set} bibliography driver.}
@@ -302,8 +278,8 @@ hidelinks,
% \changes{v1.9}{2016/11/26}{Redefined \opt{ibidem} and \opt{loccit} strings in file \file{english-philosophy.lbx} according to the Chicago Manual of Style.}
% \changes{v1.8}{2016/06/16}{Maintenance release. Corrected an incompatibility with \opt{scauthors} option.}
% \changes{v1.7}{2016/06/10}{Maintenance release. Updated documentation.}
-% \changes{v1.6}{2016/05/22}{Removed compatibility with legacy Bib\TeX{} backend.}
-% \changes{v1.5}{2016/05/18}{Improved compatibility with legacy Bib\TeX{} backend.}
+% \changes{v1.6}{2016/05/22}{Removed compatibility with legacy \textsc{Bib}\TeX{} backend.}
+% \changes{v1.5}{2016/05/18}{Improved compatibility with legacy \textsc{Bib}\TeX{} backend.}
% \changes{v1.4}{2016/03/10}{Maintenance release. Updated style for working with \sty{biblatex} v.3.4.}
% \changes{v1.3}{2015/10/09}{Maintenance release. Corrected a spurious space in article entries.}
% \changes{v1.2}{2015/09/19}{Maintenance release. New value \opt{superscript} for \opt{editionformat} option.}
@@ -361,8 +337,7 @@ hidelinks,
%
% \thispagestyle{empty}
% \begin{tikzpicture}[overlay,remember picture]
-% \draw[circular drop shadow,draw=none,fill=white] (current page.center) circle (6cm);
-% \node[align=center,anchor=center] at (current page.center) {%
+% \draw[circular drop shadow,draw=none,fill=white] (current page.center) circle (6cm) node[align=center,anchor=center] {%
% Ivan Valbusa\\[1cm]
%
%\Huge\color{gray}\bfseries \parbox{10cm}{\centering The \\{{\color{philA}\fontsize{30}{32}\textsf{biblatex-philosophy}}\\ bundle}}\\[1cm]
@@ -372,39 +347,49 @@ hidelinks,
%
%};
% \end{tikzpicture}
+% \clearpage\thispagestyle{empty}
%
-% \clearpage
+% \null\vfill
%
-% \thispagestyle{empty}
-% \vspace*{\fill}
-%
-%\noindent Copyright \copyright\ 2009-\the\year{} Ivan Valbusa.
-% \bigskip
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section*{Legalese}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-%\noindent This package is author-maintained.
-%Permission is granted to copy, distribute and/or modify this software under the
-%terms of the LaTeX Project Public License, version 1.3c or later (\url{http://latex-project.org/lppl}). This software is provided ''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.
+% \noindent Copyright \copyright\ 2009-\the\year\ Ivan Valbusa
+% \smallskip
%
-% \bigskip
+% \noindent This package is author-maintained.
+% Permission is granted to copy, distribute and/or modify this software
+% under the terms of the \hologo{LaTeX} Project Public License, version 1.3 or
+% later (\url{http://latex-project.org/lppl}).
+% This software is provided ``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.
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section*{Feedback}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-%\noindent If you have any questions, feedback or requests please email me at \texttt{ivan dot valbusa at univr dot it}. If you need specific features not already implemented, remember to attach the example files.
+% If you have any questions, feedback or requests please email me at \texttt{ivan dot valbusa at gmail dot com}. If you need specific features not already implemented, remember to attach the example files.
%
% \clearpage
%
% \begin{center}
-% {\color{philA}\bfseries
-% \Huge User's Guide to\\ \textsf{biblatex-philosophy}\\[3mm]}
-% {\large\itshape Bibliography styles for (Italian) users of~\textsf{biblatex}}
-%\vspace{.8cm}
+% {\color{philA}\bfseries\sffamily
+% \huge User's guide to \texttt{biblatex-philosophy}\\[3mm]}
+% {\large\bfseries\sffamily Bibliography styles for (Italian) users of~\textsf{biblatex}}
+% \vspace{.8cm}
%
% \normalsize\fileversion{} -- \filedate
% \vspace{.7cm}
%
% Ivan Valbusa\\[2mm]
%
-% \small Dipartimento di Filologia, Letteratura e Linguistica\\
-% \small Università degli Studi di Verona\\
-% \footnotesize\texttt{ivan dot valbusa at univr dot it}
+% \footnotesize\texttt{ivan dot valbusa at gmail dot com}
% \vspace{1cm}
% \end{center}
%
@@ -412,40 +397,61 @@ hidelinks,
%\noindent This bundle provides a small collection of bibliography and citation styles for use with Philipp Lehman's \sty{biblatex} package. The styles try to be language-indipendent but their prime aim is to match the needs of the Italian writers, particularly those concerned in the humanities. They offer useful features to compose detailed bibliographic entries including the translation data of foreign texts, annotations etc. Many options allow you to change the style defaults. Only the Italian, English, Spanish and French localizations are available for now but you can use the styles with all the languages supported by \sty{babel} or \sty{polyglossia} adding simple redefinitions.
% \end{abstract}
%
-% \tableofcontents
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \tableofcontents
+% ^^A
+% ^^A ----------------------------------------------------------------
%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section*{A brief history}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-%\section*{A brief history}
+% The firs step toward the creation of the \sty{philosophy-modern} style was the request of Lorenzo Pantieri in the \GuIT{} Forum at \url{http://www.guit.sssup.it/phpbb/viewtopic.php?t=6472} (See the discussion on \url{http://www.guit.sssup.it/phpbb/viewtopic.php?t=6717.}) Now this is the bibliography style of \citetitle{pantieri:artelatex}, the most popular Italian guide to \hologo{LaTeX} \parencite{pantieri:artelatex}. %\nocite{ctan,guit:sito}
%
-%The firs step toward the creation of the \sty{philosophy-modern} style was the request of Lorenzo Pantieri in the \GuIT{} Forum at \url{http://www.guit.sssup.it/phpbb/viewtopic.php?t=6472} (See the discussion on \url{http://www.guit.sssup.it/phpbb/viewtopic.php?t=6717.}) Now this is the bibliography style of \citetitle{pantieri:artelatex}, the most popular Italian guide to \LaTeX{} \parencite{pantieri:artelatex}. %\nocite{ctan,guit:sito}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section*{Acknowledgments}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% \smallskip
-%
-% {\itshape\noindent I would like to thank all those who took part in the debate on {\fontfamily{cmr}\upshape\selectfont\GuIT{}} Web site and the authors of the styles which inspired \sty{biblatex-philosophy}, specifically: Dominik \textcite{wassenhoven:dw}, James \textcite{clawson:mla} and Sander \textcite{glibof:historian}. Last but not least, a special thank to Philipp \textcite{lehman:biblatex} for his fundamental package and to the actual developers, Philip Kime\index{Kime, Philip}, Audrey Boruvka\index{Boruvka, Audrey} and Joseph Wright\index{Wright, Joseph}.
-% }
+% I would like to thank all those who took part in the debate on {\fontfamily{cmr}\upshape\selectfont\GuIT{}} website and the authors of the styles which inspired \sty{biblatex-philosophy}, specifically: Dominik \textcite{wassenhoven:dw}, James \textcite{clawson:mla} and Sander \textcite{glibof:historian}. Last but not least, a special thank to Philipp \textcite{lehman:biblatex} for his fundamental package and to current developers, Philip Kime\index{Kime, Philip}, Audrey Boruvka\index{Boruvka, Audrey} and Joseph Wright\index{Wright, Joseph}.
%
-%\section{Use}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{Usage}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-%
-%The styles can be loaded as usual, but to ensure language-specific quotation marks you need \sty{babel} (or \sty{polyglossia}) and \sty{csquotes} \parencite[see][]{babel,polyglossia,csquotes}. Biber in place of Bib\TeX{} is also required as backend bibliography processor \parencite{kime:biber}. The example below shows a typical code for an Italian document. Replace \meta{style} with \sty{classic}, \sty{modern} or \sty{verbose}, and \meta{bibfile} with the name of your bibliography database (``.bib'' must be declared). For other languages you can choose to use or not the Italian-style quotation marks provided by \sty{csquotes}.
+%The styles can be loaded as usual, but to ensure language-specific quotation marks you need \sty{babel} (or \sty{polyglossia}) and \sty{csquotes} \parencite[see][]{babel,polyglossia,csquotes}. \sty{biber} in place of \hologo{BibTeX} is also required as backend bibliography processor \parencite{kime:biber}. The example below shows a typical code for an Italian document. Replace \meta{style} with \sty{classic}, \sty{modern} or \sty{verbose}, and \meta{bibfile} with the name of your bibliography database (``\file{.bib}'' must be declared). For other languages you can choose to use or not the Italian-style quotation marks provided by \sty{csquotes}.
%\begin{ttquote}
-%\cmd{usepackage}\oar{italian}\ar{babel}\\
-%\cmd{usepackage}\oar{style=italian}\ar{csquotes}\\
-%\cmd{usepackage}\oar{style=philosophy-\meta{style}}\ar{biblatex}\\
-%\mbox{}\quad \cmd{addbibresource}\ar{\meta{bibfile}.bib}
+%\cmd{usepackage}[italian]\{babel\}\\
+%\cmd{usepackage}[style=italian]\{csquotes\}\\
+%\cmd{usepackage}[style=philosophy-\meta{style}]\{biblatex\}\\
+%\mbox{}\quad \cmd{addbibresource}\{\meta{bibfile}.bib\}
%\end{ttquote}
%To uniform the style of quotation marks in multilingual bibliographies typeset using the \opt{autolang=other} option, you can use the \cmd{DeclareQuoteAlias} command. For example:
%\begin{ttquote}
-%\cmd{DeclareQuoteAlias}\ar{italian}\ar{german}
+%\cmd{DeclareQuoteAlias}[italian]\{german\}
%\end{ttquote}
%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{The styles}\label{sec:introduction}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-%\section{The styles}\label{sec:introduction}
-% This bundle provides two author-year styles (\sty{philosophy-classic} and \sty{philosophy-modern}) and a verbose style (\sty{philosophy-verbose}) and. The first simple and trivial characteristic of these style is that they use commas instead of dots to separate the parts of the entry, according to the most common Italian tradition. But they do much more, of course. The other features, some of which are style-dependent, are described in the next sections and can be easily examined looking at the examples at the end of this documentation or typesetting the example files in the \TeX Live folder \texttt{texmf-dist/doc/latex/biblatex-philosophy/examples.zip}.
+% This bundle provides two author-year styles (\sty{philosophy-classic} and \sty{philosophy-modern}) and a verbose style (\sty{philosophy-verbose}). The first simple and trivial characteristic of these style is that they use commas instead of dots to separate the parts of the entry, according to the most common Italian tradition. But they do much more, of course. The other features, some of which are style-dependent, are described in the next sections and can be easily examined looking at the examples at the end of this documentation or typesetting the example files in the \TeX~Live folder \texttt{texmf-dist/doc/latex/biblatex-philosophy/examples.zip}.
%
% Note that \sty{biblatex} adopts by default a very rational criterion for the ordering of the list of names in multi-authors/editors entries. Only for the first author/editor the surname precedes the name while the other authors/editors are typeset in the form ``Name Surname'' (e.g. ``Eco, Umberto and Gianni Vattimo''). The Italian (academic) writers often see this feature like a sort of inconsistency. Actually it is inconsistent to typeset all the authors in the form ``Surname, Name'' when this is useless.
%
-%\subsection[\sty{philosophy-classic}]{The \sty{philosophy-classic} style}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection[\sty{philosophy-classic}]{The \sty{philosophy-classic} style}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
%The \sty{classic} style is a standard author-year style associated to a compact citation scheme which allows to cite multiple entries of the same author and/or published in the same year, omitting some redundant informations. It is based on \sty{authoryear-comp}:
%\begin{bibexample}
@@ -459,15 +465,18 @@ hidelinks,
%\item ---
%(1986a) \emph{Computers \& Typesetting}, vol. B: \emph{\TeX: The Program}, Addison-Wesley.
% \item ---
-%(1986b) \emph{Computers \& Typesetting}, vol. C: \emph{The METAFONTbook}, Addison-Wesley.
+%(1986b) \emph{Computers \& Typesetting}, vol. C: \emph{The \hologo{METAFONT}book}, Addison-Wesley.
% \item ---
-%(1986c) \emph{Computers \& Typesetting}, vol. D: \emph{METAFONT: The Program}, Addison-Wesley.
+%(1986c) \emph{Computers \& Typesetting}, vol. D: \emph{\hologo{METAFONT}: The Program}, Addison-Wesley.
% \item ---
%(1986d) \emph{Computers \& Typesetting}, vol. E: \emph{Computer Modern Typefaces}, Addison-Wesley.
% \end{bibexamplelist}
%
-%
-%\subsection[\sty{philosophy-modern}]{The \sty{philosophy-modern} style} \label{esempio-modern}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection[\sty{philosophy-modern}]{The \sty{philosophy-modern} style} \label{esempio-modern}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
%The \sty{modern} style uses the ``classic'' citation scheme but produces a fancy bibliography divided into blocks, which is particularly suited for bibliographies with many entries for the same author. This kind of structure is adopted by many Italian publisher, for example Einaudi, and it is particularly loved by Umberto Eco, who recommends it in his Italian bestseller \parencite{Eco:2004}.
% You can change the distance between year and title and, of course, all the common features with the \sty{classic} style. Here is an example of a \sty{modern} bibliography:
@@ -485,22 +494,22 @@ hidelinks,
% \item[1986a]
% \emph{Computers \& Typesetting}, vol. B: \emph{\TeX: The Program}, Addison-Wesley.
% \item[1986b]
-% \emph{Computers \& Typesetting}, vol. C: \emph{The METAFONTbook}, Addison-Wesley.
+% \emph{Computers \& Typesetting}, vol. C: \emph{The \hologo{METAFONT}book}, Addison-Wesley.
% \item[1986c]
-% \emph{Computers \& Typesetting}, vol. D: \emph{METAFONT: The Program}, Addison-Wesley.
+% \emph{Computers \& Typesetting}, vol. D: \emph{\hologo{METAFONT}: The Program}, Addison-Wesley.
%\item \hskip-2cm Nietzsche, Friedrich
% \item[1988a] \emph{Sämtliche Werke. Kritische Studienausgabe}, ed. by Giorgio Colli and Mazzino Montinari,
-%2nd ed., 15 vols., Deutscher Taschenbuch-Verlag and Walter de Gruyter, München,
-%Berlin, and New York.
-%\item[1988b] \emph{Sämtliche Werke. Kritische Studienausgabe}, vol. 1: \emph{Die Geburt der Tragödie. Unzeitgemäße
-%Betrachtungen I–IV. Nachgelassene Schriften 1870–1973}, ed. by Giorgio Colli and Mazzino
-%Montinari, 2nd ed., Deutscher Taschenbuch-Verlag and Walter de Gruyter, München,
-%Berlin, and New York.
-%\item[1988c] ``Unzeitgemässe Betrachtungen. Zweites Stück. Vom Nutzen und Nachtheil der Historie
-%für das Leben'', in \emph{Sämtliche Werke. Kritische Studienausgabe}, vol. 1: \emph{Die Geburt der
-%Tragödie. Unzeitgemäße Betrachtungen I–IV. Nachgelassene Schriften 1870–1973}, ed. by
-%Giorgio Colli and Mazzino Montinari, Deutscher Taschenbuch-Verlag and Walter de
-%Gruyter, München, Berlin, and New York, pp. 243-334.
+% 2nd ed., 15 vols., Deutscher Taschenbuch-Verlag and Walter de Gruyter, München,
+% Berlin, and New York.
+% \item[1988b] \emph{Sämtliche Werke. Kritische Studienausgabe}, vol. 1: \emph{Die Geburt der Tragödie. Unzeitgemäße
+% Betrachtungen I-IV. Nachgelassene Schriften 1870-1973}, ed. by Giorgio Colli and Mazzino
+% Montinari, 2nd ed., Deutscher Taschenbuch-Verlag and Walter de Gruyter, München,
+% Berlin, and New York.
+% \item[1988c] ``Unzeitgemässe Betrachtungen. Zweites Stück. Vom Nutzen und Nachtheil der Historie
+% für das Leben'', in \emph{Sämtliche Werke. Kritische Studienausgabe}, vol. 1: \emph{Die Geburt der
+% Tragödie. Unzeitgemäße Betrachtungen I-IV. Nachgelassene Schriften 1870-1973}, ed. by
+% Giorgio Colli and Mazzino Montinari, Deutscher Taschenbuch-Verlag and Walter de
+% Gruyter, München, Berlin, and New York, p. 243-334.
%\item \hskip-2cm Van Gennep, Arnold
%\item[1909a] \emph{Les rites de passage}, Nourry, Paris.
%\item[1909b] \emph{Les rites de passage}, Nourry, Paris; trans. by Monika B. Vizedom and
@@ -510,64 +519,76 @@ hidelinks,
%\endlist
% \end{bibexample}
%
-%
-%\subsection[\sty{philosophy-verbose}]{The \sty{philosophy-verbose} style}\label{sec:verbose}
-%
-%This style is aimed for citations given in the footnotes and follows the most popular scheme used in the Italian humanities. It prints a full citation similar to a bibliography entry when an item is cited for the first time, and a short citation afterwards, using the title (possibly shortened in the \bibfield{shorttitle} field), followed by the string ``cit.''.
-%Citing the same entry two times, in the second one the string ``Ivi'' (``Ibid.'' for English and French documents) is used; citing the same place of the previous citation you will have ``Ibidem'' (``Ibid.'' for English and French documents):
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection[\sty{philosophy-verbose}]{The \sty{philosophy-verbose} style}\label{sec:verbose}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% This style is aimed for citations given in the footnotes and follows the most popular scheme used in the Italian humanities. It prints a full citation similar to a bibliography entry when an item is cited for the first time, and a short citation afterwards, using the title (possibly shortened in the \bibfield{shorttitle} field), followed by the string ``cit.''.
+% Citing the same entry two times, in the second one the string ``Ivi'' (``Ibid.'' for English and French documents) is used; citing the same place of the previous citation you will have ``Ibidem'' (``Ibid.'' for English and French documents):
%\smallskip
%
% \begin{bibexample}[frametitle=Italian \sty{philosophy-verbose} citation scheme]
-% \textsuperscript{1} \fullcite{Valbusa:2007}, p. 43\\
-% \textsuperscript{2} \emph{Ivi}, p. 26. \\
-% \textsuperscript{3} \emph{Ibidem}. \\
+% \textsuperscript{1} \fullcite{Valbusa:2007}, p. 43.\\
+% \textsuperscript{2} {Ivi}, p. 26. \\
+% \textsuperscript{3} {Ibidem}. \\
% \textsuperscript{4} \fullcite{heidegger:sz}.\\
% \textsuperscript{5} Valbusa, ``Psicologia e sistema'' cit., p. 35.
% \end{bibexample}
%\smallskip
%
% \begin{bibexample}[frametitle=English \sty{philosophy-verbose} citation scheme]
-% \textsuperscript{1} \fullcite{Poincare:1968-ORIG}, p. 43\\
-% \textsuperscript{2} \emph{Ibid.}, p. 26. \\
-% \textsuperscript{3} \emph{Ibid.}. \\
+% \textsuperscript{1} \fullcite{Poincare:1968-ORIG}, p. 43.\\
+% \textsuperscript{2} {Ibid.}, p. 26. \\
+% \textsuperscript{3} {Ibid.} \\
% \textsuperscript{4} \fullcite{heidegger:sz}.\\
% \textsuperscript{5} Poincaré, \emph{La science et l’hypothèse} cit., p. 35.
% \end{bibexample}
%
-%When there is only one entry for the same author, with the \opt{singletitle=true} option
-%the string ``op. cit.'' is used instead of the (short) title followed by ``cit.'':%
+% When there is only one entry for the same author, with the \opt{singletitle=true} option
+% the string ``op. cit.'' is used instead of the (short) title followed by ``cit.'':%
%\begin{bibexample}
%\textsuperscript{6} Heidegger, op. cit., p. 35.
%\end{bibexample}
%
-%All the scholarly abbreviations (\emph{latinitates}) but ``cit.'' are printed by default in normal font. With the \opt{latinemph} option you can get them in italic shape (section \ref{sec:options-verbose}).
+% All the scholarly abbreviations (\emph{latinitates}) but ``cit.'' are printed by default in normal font. With the \opt{latinemph} option you can get them in italic shape (section \ref{sec:options-verbose}).
%
% A \sty{verbose} bibliography is similar to a \sty{classic} bibliography but with the year placed at the end of the entry:
%\begin{bibexamplelist}[frametitle=The \sty{philosophy-verbose} bibliography]
-%\item Donald E. Knuth, \emph{Computers \& Typesetting}, 5 vols., Addison-Wesleys, 1984-1986.
+%\item Donald E. Knuth, \emph{Computers \& Typesetting}, 5 vols., Addison-Wesley, 1984-1986.
%\item ---
% \emph{Computers \& Typesetting}, vol. A: \emph{The \TeX book}, Addison-Wesley, 1984.
%\item ---
% \emph{Computers \& Typesetting}, vol. B: \emph{\TeX: The Program}, Addison-Wesley, 1986.
% \item ---
-% \emph{Computers \& Typesetting}, vol. C: \emph{The METAFONTbook}, Addison-Wesley, 1986.
+% \emph{Computers \& Typesetting}, vol. C: \emph{The \hologo{METAFONT}book}, Addison-Wesley, 1986.
% \item ---
-% \emph{Computers \& Typesetting}, vol. D: \emph{METAFONT: The Program}, Addison-Wesley, 1986.
+% \emph{Computers \& Typesetting}, vol. D: \emph{\hologo{METAFONT}: The Program}, Addison-Wesley, 1986.
% \item ---
% \emph{Computers \& Typesetting}, vol. E: \emph{Computer Modern Typefaces}, Addison- Wesley, 1986.
% \end{bibexamplelist}
%
-% \section{Specialities}\label{sec:specialities}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{Specialities}\label{sec:specialities}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-%\subsection{Related entries}\label{sec:related}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Related entries}\label{sec:related}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-%The \sty{philosophy} styles use the mechanism provided by the \bibfield{related} field to typeset complex entries comprising both the original publication data and the translation data \parencite[see][]{Poincare:1968-ORIG}. The related entry is preceded by the \texttt{translationas} string which defaults to ``trad.~it.'', ``trans.'', ``trad.~es.'' and ``trad.'' for Italian, English, Spanish and French documents, respectively. If you want to change it, use the \bibfield{relatedstring} field, like in \textcite{popper-logik} which shows, among others, an entry with cascading relations.
+% The \sty{philosophy} styles use the mechanism provided by the \bibfield{related} field to typeset complex entries comprising both the original publication data and the translation data \parencite[see][]{Poincare:1968-ORIG}. The related entry is preceded by the \texttt{translationas} string which defaults to ``trad.~it.'', ``trans.'', ``trad.~es.'' and ``trad.'' for Italian, English, Spanish and French documents, respectively. If you want to change it, use the \bibfield{relatedstring} field, like in \textcite{popper-logik} which shows, among others, an entry with cascading relations.
%
% \begin{bibexamplelist}
%\item \fullcite{Poincare:1968-ORIG}.
% \end{bibexamplelist}
%
-%\begin{latexcode}\begin{verbatim}
+%\begin{latexcode}
+%\begin{verbatim}
%@book{Poincare:1968-ORIG,
% author = {Jules-Henri Poincaré},
% title = {La science et l'hypothèse},
@@ -590,159 +611,168 @@ hidelinks,
%
%\begin{latexcode}\begin{verbatim}
%@book{popper-logik,
-% title = {Logik der Forschung},
+% title = {Logik der Forschung},
% publisher = {Springer},
-% author = {Karl R. Popper},
-% date = {1934},
-% location = {Wien},
-% related = {popper-logik:ing}}
+% author = {Karl R. Popper},
+% date = {1934},
+% location = {Wien},
+% related = {popper-logik:ing}}
%
%@book{popper-logik:ing,
-% title = {The Logic of Scientific Discovery},
-% publisher = {Hutchinson},
-% author = {Karl R. Popper},
-% edition = {3},
-% date = {1959},
-% location = {London},
-% related = {popper-logik:ita},
-% relatedstring={it\adddotspace trans\adddot}}
+% title = {The Logic of Scientific Discovery},
+% publisher = {Hutchinson},
+% author = {Karl R. Popper},
+% edition = {3},
+% date = {1959},
+% location = {London},
+% related = {popper-logik:ita},
+% relatedstring ={it\adddotspace trans\adddot}}
%
%@book{popper-logik:ita,
-% title = {Logica della scoperta scientifica},
+% title = {Logica della scoperta scientifica},
% publisher = {Einaudi},
-% author = {Karl R. Popper},
-% edition = {3},
-% date = {1998},
-% location = {Torino}}
-%\end{verbatim}\end{latexcode}
-%
-%
-%\subsection{Crossreferences}\label{sec:crossref}
+% author = {Karl R. Popper},
+% edition = {3},
+% date = {1998},
+% location = {Torino}}
+%\end{verbatim}
+%\end{latexcode}
%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Cross references}\label{sec:crossref}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-%The \sty{philosophy} styles allow you to manage
-%entries referring to other entries via the \bibfield{crossref} fields. This is very useful when you have to cite two or more \bibtype{incollection} of the same \bibtype{collection} \parencite[see][]{corrocher:2009,federspil:2009}. In this way the \bibtype{collection} is printed in the bibliography and it is cross-referenced inside the \bibtype{incollection}, using the corresponding author-year label (the mechanism is the same for \bibtype{inbook} items).
+% The \sty{philosophy} styles allow you to manage
+% entries referring to other entries via the \bibfield{crossref} field. This is very useful when you have to cite two or more \bibtype{incollection} of the same \bibtype{collection} \parencite[see][]{corrocher:2009,federspil:2009}. In this way the \bibtype{collection} is printed in the bibliography and it is cross-referenced inside the \bibtype{incollection}, using the corresponding author-year label (the mechanism is the same for \bibtype{inbook} items).
%\begin{bibexamplelist}
-%\item Corrocher, Roberto (2009) “Riflessioni sull’uomo di fronte a nuove sfide”, in Giaretta et al. (2009), pp. 27-42.
-%\item Federspil, Giovanni and Roberto Vettor (2009), “Medicina: un unico metodo e una sola argomentazione?”, in Giaretta et al. (2009), pp. 43-74.
+%\item Corrocher, Roberto (2009) “Riflessioni sull’uomo di fronte a nuove sfide”, in Giaretta et al. (2009), p. 27-42.
+%\item Federspil, Giovanni and Roberto Vettor (2009), “Medicina: un unico metodo e una sola argomentazione?”, in Giaretta et al. (2009), p. 43-74.
%\item Giaretta, Pierdaniele, Antonio Moretto, Gian Franco Gensini, and Marco Trabucchi (2009) (eds.), \emph{Filosofia delle medicina. Metodo, modelli, cura ed errori}, 2 vols., il Mulino, Bologna.
%\end{bibexamplelist}
%\begin{latexcode}\begin{verbatim}
%@collection{Filmed:2009,
-% title = {Filosofia delle medicina},
+% title = {Filosofia delle medicina},
% booktitle = {Filosofia delle medicina},
-% subtitle = {Metodo, modelli, cura ed errori},
-% editor = {Pierdaniele Giaretta and Antonio Moretto
+% subtitle = {Metodo, modelli, cura ed errori},
+% editor = {Pierdaniele Giaretta and Antonio Moretto
% and Gian Franco Gensini
% and Marco Trabucchi},
-% volumes = {2},
+% volumes = {2},
% publisher = {il Mulino},
-% location = {Bologna},
+% location = {Bologna},
% date = {2009}}
%
%@incollection{corrocher:2009,
-% author = {Roberto Corrocher},
-% title = {Riflessioni sull'uomo di fronte a nuove sfide},
-% pages = {27-42},
+% author = {Roberto Corrocher},
+% title = {Riflessioni sull'uomo di fronte a nuove sfide},
+% pages = {27-42},
% crossref = {Filmed:2009}}
%
%@incollection{federspil:2009,
-% author = {Giovanni Federspil and Roberto Vettor},
-% title = {Medicina: un unico metodo e una sola argomentazione?},
-% pages = {43-74},
+% author = {Giovanni Federspil and Roberto Vettor},
+% title = {Medicina: un unico metodo e una sola argomentazione?},
+% pages = {43-74},
% crossref = {Filmed:2009}}
%\end{verbatim}\end{latexcode}
-%When you have to cite \emph{only one} \bibtype{incollection} of a single \bibtype{collection} you have three choices:
+% When you have to cite \emph{only one} \bibtype{incollection} of a single \bibtype{collection} you have three choices.
% \smallskip
%
-% \noindent 1. use the \bibfield{crossref} field \parencite[see][]{Termini:2007}. In this case all the \bibtype{collection} data are automatically printed inside
+% \noindent 1. Use the \bibfield{crossref} field \parencite[see][]{Termini:2007}. In this case all the \bibtype{collection} data are automatically printed inside
% the \bibtype{incollection} entry:
%\begin{bibexamplelist}
-%\item \fullcite{Termini:2007}
+%\item \fullcite{Termini:2007}.
%\end{bibexamplelist}
%\begin{latexcode}\begin{verbatim}
%@incollection{Termini:2007,
-% author = {Settimo Termini},
-% title = {Vita morte e miracoli di Alan Mathison Turing},
+% author = {Settimo Termini},
+% title = {Vita morte e miracoli di Alan Mathison Turing},
% crossref = {Bartocci:2007}}
%
%@collection{Bartocci:2007,
-% title = {Vite matematiche}
-% booktitle = {Vite matematiche},
-% booksubtitle = {Protagonisti del '900 da Hilbert a Wiles},
-% editor = {Claudio Bartocci and Renato Betti and Angelo Guerraggio and
+% title = {Vite matematiche},
+% booktitle = {Vite matematiche},
+% booksubtitle = {Protagonisti del '900 da Hilbert a Wiles},
+% editor = {Claudio Bartocci and Renato Betti and Angelo Guerraggio and
% Roberto Lucchetti},
-% publisher = {Springer-Verlag Italia},
-% location = {Milano},
-% date = {2007}}
+% publisher = {Springer-Verlag Italia},
+% location = {Milano},
+% date = {2007}}
%\end{verbatim}\end{latexcode}
-% 2. put the \bibtype{collection} data in the fields of the \bibtype{incollection} entry \parencite[see][]{Valbusa:2007}. In this case the \bibtype{incollection} is self-contained:
+% 2. Put the \bibtype{collection} data in the fields of the \bibtype{incollection} entry \parencite[see][]{Valbusa:2007}. In this case the \bibtype{incollection} is self-contained:
% \begin{bibexamplelist}
-%\item \fullcite{Valbusa:2007}
+%\item \fullcite{Valbusa:2007}.
% \end{bibexamplelist}
%\begin{latexcode}\begin{verbatim}
%@incollection{Valbusa:2007,
-% author = {Ivan Valbusa},
-% title = {Psicologia e sistema in Alsted e in Wolff},
+% author = {Ivan Valbusa},
+% title = {Psicologia e sistema in Alsted e in Wolff},
% booktitle = {Christian Wolff tra psicologia empirica e
% psicologia razionale},
% publisher = {Georg Olms Verlag},
-% editor = {Ferdinando Luigi Marcolungo},
-% location = {Hildesheim and Zürich and London},
-% date = {2007}}
+% editor = {Ferdinando Luigi Marcolungo},
+% location = {Hildesheim and Zürich and London},
+% date = {2007}}
%\end{verbatim}\end{latexcode}
-% 3. put the \bibtype{collection} data in the fields of the \bibtype{incollection} entry and put the \bibtype{collection} label in the \bibfield{xref} field of the \bibtype{incollection} \parencite[see][]{kant:kpv:xref,kant:ku:xref}\label{kant}:
+% 3. Put the \bibtype{collection} data in the fields of the \bibtype{incollection} entry and put the \bibtype{collection} label in the \bibfield{xref} field of the \bibtype{incollection} \parencite[see][]{kant:kpv:xref,kant:ku:xref}\label{kant}:
% \begin{bibexamplelist}
-% \item Immanuel Kant (1968a), \emph{Kants Werke. Akademie Textausgabe}, 9 vols., Walter de Gruyter, Berlin
-% \item --- (1968b), \emph{Kritik der praktischen Vernunft}, in Kant (1968a), vol. 5, pp. 1-163
-% \item --- (1968c), \emph{Kritik der Urtheilskraft}, in Kant (1968a), vol. 5, pp. 165-485
+% \item Immanuel Kant (1968a), \emph{Kants Werke. Akademie Textausgabe}, 9 vols., Walter de Gruyter, Berlin.
+% \item --- (1968b), \emph{Kritik der praktischen Vernunft}, in Kant (1968a), vol. 5, p. 1-163.
+% \item --- (1968c), \emph{Kritik der Urtheilskraft}, in Kant (1968a), vol. 5, p. 165-485.
% \end{bibexamplelist}
%\begin{latexcode}\begin{verbatim}
%@bookinbook{kant:kpv:xref,
-% author = {Kant, Immanuel},
-% title = {Kritik der praktischen Vernunft},
+% author = {Kant, Immanuel},
+% title = {Kritik der praktischen Vernunft},
% shorttitle = {Kritik der praktischen Vernunft},
-% volume = {5},
-% pages = {1-163},
-% date = {1968},
-% xref = {kant:werke}}
+% volume = {5},
+% pages = {1-163},
+% date = {1968},
+% xref = {kant:werke}}
%
%@bookinbook{kant:ku:xref,
% author = {Kant, Immanuel},
-% title = {Kritik der Urtheilskraft},
+% title = {Kritik der Urtheilskraft},
% volume = {5},
-% pages = {165-485},
-% date = {1968},
-% xref = {kant:werke}}
+% pages = {165-485},
+% date = {1968},
+% xref = {kant:werke}}
%
%@mvbook{kant:werke,
-% author = {Kant, Immanuel},
-% title = {Kants Werke. Akademie Textausgabe},
+% author = {Kant, Immanuel},
+% title = {Kants Werke. Akademie Textausgabe},
% maintitle = {Kants Werke. Akademie Textausgabe},
% booktitle = {Kants Werke. Akademie Textausgabe},
-% volumes = {9},
+% volumes = {9},
% publisher = {Walter de Gruyter},
-% location = {Berlin},
-% date = {1968}}
+% location = {Berlin},
+% date = {1968}}
%\end{verbatim}\end{latexcode}
%
-%With the \sty{verbose} style, when citing \bibtype{incollection}s entries, the data of the \bibtype{collection} are printed entirely in the first citation and shortened afterwards. Anyway in the final bibliography the \bibtype{incollection} is always complete of all the informations about the corresponding \bibtype{collection}.
-%
+% With the \sty{verbose} style, when citing \bibtype{incollection}s entries, the data of the \bibtype{collection} are printed entirely in the first citation and shortened afterwards. Anyway in the final bibliography the \bibtype{incollection} is always complete of all the informations about the corresponding \bibtype{collection}.
%
-%\subsection{Classical works}\label{sec:classical-works}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Classical works}\label{sec:classical-works}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
+% The treatment of classical works (a fuzzy concept) and other writings with uncertain or omitted date is not particularly difficult if you use the \sty{verbose} style, but with the \sty{classic} and \sty{modern} styles some difficulties inevitably impose clear choices. Anyway remember that every citation label is \emph{merely} a label and it does not affect in any way the object or the subject it refers to. The label ``Plato 1978'' simply means ``the entry in the bibliography which is alphabetized under the name `Plato' and the year `1978'{}''. All the information about the \emph{object} (in this case a book or a collection of writings) will be retrieved in the bibliography entry.
%
-% The treatment of classical works (a fuzzy concept) and other writings with uncertain or omitted date is not particularly difficult if you use the \sty{verbose} style, but with the \sty{classic} and \sty{modern} styles some difficulties inevitably impose clear choices. Anyway remember that every citation label is \emph{merely} a label and it does not affect in any way the object or the subject it refers to. The label ``Plato 1978'' simply means ``the entry in the bibliography which is alphabetized under the name \emph{Plato} and the year \emph{1978}''. All the information about the \emph{object} (in this case a book or a collection of writings) will be retrieved in the bibliography entry.
+% So if a critical edition (or similar) exists you should cite it directly, such as \textcite{heidegger:sz}. If you do not like this ``anachronistic'' label you may use the \bibfield{shorthand} field, such as \cite{kant:kpv:xref}. Note that a ``shorthand intro'' is automatically printed when the entry is cited for the first time (see p. \pageref{kant}) and omitted afterwards. To turn off this feature load the option \opt{shorthandintro=false}. Of course in this case you will need a list of shorthands. If you do not like these solutions you can use the \bibfield{entrysubtype} or the \cmd{sdcite} command in order to get an author-title citation, such as \cite{aristotle:ethics} (see sections \ref{sec:newfields} and \ref{sec:commands:citations}).
%
-%So if a critical edition (or similar) exists you should cite it directly, such as \textcite{heidegger:sz}. If you do not like this ``anachronistic'' label you may use the \bibfield{shorthand} field, such as \cite{kant:kpv:xref}. Note that a ``shorthand intro'' is automatically printed when the entry is cited for the first time (see p. \pageref{kant}) and omitted afterwards. To turn off this feature load the option \opt{shorthandintro=false}. Of course in this case you will need a list of shorthands. If you do not like these solutions you can use the \bibfield{entrysubtype} or the \cmd{sdcite} command in order to get an author-title citation, such as \cite{aristotle:ethics} (see sections \ref{sec:newfields} and \ref{sec:commands:citations}).
-%
-%\section{New fields}\label{sec:newfields}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{New fields}\label{sec:newfields}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
%\begin{fieldlist}
%
%\fielditem{nameaddon}{literal}
%
-%An addon to be printed immediately after the author name in the bibliography.
+% An addon to be printed immediately after the author name in the bibliography.
%It is useful for those author known with alias, Latinized names, etc. For example \textcite{comenio:oo}:
%\begin{bibexamplelist}%
%\item Komensky, Jan Amos \emphasize{[Comenius]}
@@ -750,14 +780,14 @@ hidelinks,
%\end{bibexamplelist}
%\begin{latexcode}\begin{verbatim}
%@mvbook{comenio:oo,
-% author = {Jan Amos Komensky},
+% author = {Jan Amos Komensky},
% nameaddon = {Comenius},
-% title = {Opera Omnia}
-% location = {Praga},
-% date = {1969}}
+% title = {Opera Omnia}
+% location = {Praga},
+% date = {1969}}
%\end{verbatim}\end{latexcode}
%
-% \fielditem{entrysubtype}{literal\makebox[0pt][l]{\hspace*{2cm}[\sty{philosophy-classic} and \sty{philosophy-modern} only]}}
+% \fielditem{entrysubtype}{literal\null\makebox[0pt][l]{\hskip1cm\hfill[\sty{philosophy-classic} and \sty{philosophy-modern} only]}}
% With the \opt{classic} value the citation commands will produce an
% author-title label. This is useful for citing works from classical antiquity.
%\begin{bibexample}
@@ -771,12 +801,11 @@ hidelinks,
% ...
% }
%\end{verbatim}\end{latexcode}
-%In the bibliography the entry is printed with the author-year label, but with the \opt{skipbib} option in the \opt{options} field you can exclude it from the bibliography.
-%
+% In the bibliography the entry is printed with the author-year label, but with the \opt{skipbib} option in the \opt{options} field you can exclude it from the bibliography.
%
%\fielditem{library}{literal}
%
-%This field is printed at the end of the entry, in a new period. It is aimed for secondary informations such as the location of the texts, historical notes, etc. For example \textcite{heidegger:sz}:
+% This field is printed at the end of the entry, in a new period. It is aimed for secondary informations such as the location of the texts, historical notes, etc. For example \textcite{heidegger:sz}:
%\begin{bibexamplelist}
%\item Heidegger, Martin (2001), \emph{Sein und Zeit}, 18th ed., Max Niemeyer Verlag, Tübingen. \emphasize{Originally published in 1927 in the \emph{Jahrbuch für Philosophie und phänomenologische Forschung (vol. VIII)}, directed by H. Husserl}.
%\end{bibexamplelist}
@@ -795,14 +824,14 @@ hidelinks,
%
%\fielditem{annotation}{literal}
%
-%This field is printed in a new paragraph at the very end of the entry. It requires the \opt{annotation} option. The default font can be changed redefining the \cmd{annotationfont} command (section \ref{sec:customization}):
+% This field is printed in a new paragraph at the very end of the entry. It requires the \opt{annotation} option. The default font can be changed redefining the \cmd{annotationfont} command (section \ref{sec:customization}):
%\begin{bibexamplelist}
%\item \fullcite{lehman:biblatex}.\\
% \emphasize{This package provides advanced bibliographic facilities
-% for use with \LaTeX. The package is a complete
+% for use with \hologo{LaTeX}. The package is a complete
% reimplementation of the bibliographic facilities provided
-% by \LaTeX. The biblatex package works with the “backend”
-% (program) \texttt{biber}, which is used to process Bib\TeX{}
+% by \hologo{LaTeX}. The \sty{biblatex} package works with the “backend”
+% (program) \sty{biber}, which is used to process \hologo{BibTeX}
% format data files and them performs all sorting, label
% generation (and a great deal more).}
%\end{bibexamplelist}
@@ -813,32 +842,34 @@ hidelinks,
% subtitle = {Programmable Bibliographies and Citations},
% version = {3.7},
% date = {2016-11-16},
-% annote = {This package provides advanced bibliographic facilities
+% annotation = {This package provides advanced bibliographic facilities
% for use with \LaTeX. The package is a complete reimplementation
% of the bibliographic facilities provided by \LaTeX. The
% \texttt{biblatex} package works with the “backend” (program)
-% \texttt{biber}, which is used to process Bib\TeX{} format data
+% \texttt{biber}, which is used to process \textsc{Bib}\TeX{} format data
% files and them performs all sorting, label generation (and
% a great deal more).}}
%\end{verbatim}\end{latexcode}
%\end{fieldlist}
%
-%
-%\section{New citation commands}\label{sec:commands:citations}
-%
-%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{New citation commands}\label{sec:commands:citations}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
%\begin{ltxsyntax}
%
%\cmditem{sdcite}{key}\hfill[\sty{philosophy-classic} and \sty{philosophy-modern} only]
%
-%Uses an author-title label instead of an author-year label.
-%It is useful for some classical or undated works. Anyway you should prefer the \opt{entrysubtype=classic} field (see above).
+% Uses an author-title label instead of an author-year label.
+% It is useful for some classical or undated works. Anyway you should prefer the \opt{entrysubtype=classic} field (see above).
%\begin{bibexample}
% See \sdcite{guzman:sd} and Rogers (2015) for details.
%\end{bibexample}
%
%\cmditem{footcitet}{key} \hfill[\sty{philosophy-classic} and \sty{philosophy-modern} only]
+%
% Same as \cmd{footcite} but with the \cmd{textcite} style.\textsuperscript{b}
%\begin{bibexample}
%\begin{minipage}{.9\textwidth}
@@ -850,46 +881,48 @@ hidelinks,
%
%\cmditem{ccite}{key}\hfill[\sty{philosophy-verbose} only]
%
-%The same as \cmd{cite}, but omits the author's (editor's) name (defined only for the \sty{verbose} style). Here is an example:
+% The same as \cmd{cite}, but omits the author's (editor's) name (defined only for the \sty{verbose} style). Here is an example:
%\begin{bibexample}
-%This topic is discussed in P. Rossi, \emph{History of Types}, La TeXnica, Verona 2007 and in the recent \emph{Types of History}, Typographica, Milano 2008.
+% This topic is discussed in P. Rossi, \emph{History of Types}, La TeXnica, Verona 2007 and in the recent \emph{Types of History}, Typographica, Milano 2008.
%\end{bibexample}
%\begin{latexcode}
%\begin{verbatim}
-%This topic is discussed in \cite{Rossi:2007} and in the recent
-%\ccite{Rossi:2008}.
+% This topic is discussed in \cite{Rossi:2007} and in the recent \ccite{Rossi:2008}.
%\end{verbatim}
%\end{latexcode}
%\end{ltxsyntax}
%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{New options}\label{sec:options}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-%
-%
-%\section{New options}\label{sec:options}
-%
-%
-%
-%\subsection{Global}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Global}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
%\begin{optionlist}
-%\optitem[semicolon]{relatedformat}{\opt{semicolon}, \opt{parens}, \opt{brackets}}
+%\optitem[semicolon]{relatedformat}{\opt{semicolon}\OR\opt{parens}\OR\opt{brackets}}
%\begin{valuelist}
%\item[semicolon]
-%The ``related'' entry is preceded by a semicolon.
+% The ``related'' entry is preceded by a semicolon.
% \begin{bibexample}%
% Poincaré, Jules-Henri (1968), \emph{La science et l'hypothèse}, Paris,
% Flammarion\emphasize{; trad. it. \emph{La scienza e l'ipotesi},
% Bompiani, 2003}.
% \end{bibexample}
%\item[parens]
-%Puts the ``related'' entry in parentheses.
+% Puts the ``related'' entry in parentheses.
% \begin{bibexample}%
% Poincaré, Jules-Henri (1968), \emph{La science et l'hypothèse}, Paris,
% Flammarion \emphasize{(trad. it. \emph{La scienza e l'ipotesi},
% Bompiani, 2003)}.
% \end{bibexample}
%\item[brackets]
-%Same as the previous option but with brackets.
+% Same as the previous option but with brackets.
% \begin{bibexample}%
% Poincaré, Jules-Henri (1968), \emph{La science et l'hypothèse}, Paris,
% Flammarion \emphasize{[trad. it. \emph{La scienza e l'ipotesi},
@@ -897,10 +930,9 @@ hidelinks,
% \end{bibexample}
%\end{valuelist}
%
-%
-%\optitem[publocyear]{publocformat}{\opt{publocyear}, \opt{locpubyear}, \opt{loccolonpub}}
+%\optitem[publocyear]{publocformat}{\opt{publocyear}\OR\opt{locpubyear}\OR\opt{loccolonpub}}
% This option provides three styles for typesetting the ``publisher/location/date'' block.
-% It is active also for the related entry and for the \bibfield{orig-}fields (section \ref{sec:origfields}).
+% It is active also for the related entry and for the \bibfield{orig-} fields (section \ref{sec:origfields}).
% \begin{valuelist}
% \item[publocyear] Oxford University Press, Oxford 2007
%
@@ -909,8 +941,8 @@ hidelinks,
% \item[loccolonpub] Oxford: Oxford University Press, 2007
% \end{valuelist}
%
-%\optitem[plain]{volnumformat}{\opt{strings}, \opt{parens}, \opt{plain}}
-%This option provides three styles for typesetting the ``volume/number'' block in \bibtype{article} entries.
+%\optitem[plain]{volnumformat}{\opt{strings}\OR\opt{parens}\OR\opt{plain}}
+% This option provides three styles for typesetting the ``volume/number'' block in \bibtype{article} entries.
%\begin{valuelist}
% \item[plain]
% \ldots \emph{Journal Title}, 5, 8, \ldots
@@ -920,8 +952,8 @@ hidelinks,
% \ldots \emph{Journal Title} (5, 8), \ldots
% \end{valuelist}
%
-%\optitem[arabic]{volumeformat}{\opt{arabic}, \opt{roman}, \opt{romansc}, \opt{Roman}}
-%This option provides three styles for typesetting the \bibfield{volume} field:
+%\optitem[arabic]{volumeformat}{\opt{arabic}\OR\opt{roman}\OR\opt{romansc}\opt{Roman}}
+% This option provides three styles for typesetting the \bibfield{volume} field.
% \begin{valuelist}
% \item[arabic]
% \ldots \emph{Book Title}, vol. 12, \ldots
@@ -941,8 +973,8 @@ hidelinks,
%^^A\end{latexcode}
%^^Ayou can restore the default format for all but \bibtype{article} entries.
%
-%\optitem[arabic]{editionformat}{\opt{arabic}, \opt{roman}, \opt{romansc}, \opt{Roman}, \opt{superscript}}
-%This option provides three styles for typesetting the \bibfield{edition} field:
+%\optitem[arabic]{editionformat}{\opt{arabic}\OR\opt{roman}\OR\opt{romansc}\OR\opt{Roman}\OR\opt{superscript}}
+% This option provides three styles for typesetting the \bibfield{edition} field.
% \begin{valuelist}
% \item[arabic]
% \ldots \emph{Book Title}, 3\textsuperscript{a} ed., \ldots
@@ -952,12 +984,12 @@ hidelinks,
% \ldots \emph{Book Title}, \textsc{iii} ed., \ldots
% \item[Roman]
% \ldots \emph{Book Title}, III ed., \ldots
-% \item[superscript] [only for \sty{philosophy-verbose}]\\
+% \item[superscript] \hfill[only for \sty{philosophy-verbose}]\\
% \ldots \emph{Book Title}, Publisher, Location 2010\textsuperscript{3}.
% \end{valuelist}
%
-%\optitem[false]{scauthors}{\opt{bib}, \opt{cite}, \opt{bibcite}, \opt{citefn}, \opt{bibcitefn}, \opt{all}}
-% Prints some or all names in small caps shape.
+%\optitem[false]{scauthors}{\opt{bib}\OR\opt{cite}\OR\opt{bibcite}\OR\opt{citefn}\OR\opt{bibcitefn}\OR\opt{all}}
+% Prints some or all names (authors, editors, translators, etc.) in small caps.
% \begin{valuelist}
% \item[bib] Small caps only for the names at the beginning of the entry in the bibliography.
% \item[cite] Small caps only for the names at the beginning of the entry in the citations.
@@ -975,93 +1007,96 @@ hidelinks,
%
%\boolitem[true]{shorthandintro}
%
-%Prints a language-specific expression such as ``henceforth cited as \meta{shorthand}'' to introduce shorthands on the first citation.
+% Prints a language-specific expression such as ``henceforth cited as \meta{shorthand}'' to introduce shorthands on the first citation.
% \begin{bibexample}
-% Kant (1968a \emphasize{[henceforth cited as KpV]})
+% Kant (1968a \emphasize{[henceforth cited as KpV]}).
% \end{bibexample}
-%You can overwrite the default expression using the \bibfield{shorthandintro}. Note that the alternative expression must include the shorthand.
+% You can overwrite the default expression using the \bibfield{shorthandintro}. Note that the alternative expression must include the shorthand.
% Obviously, if you do not use an intro to the shorthands
% you will need a list of shorthands (\cmd{printshorthand} command).
%
%\boolitem[false]{inbeforejournal}
-%Prints the string ``in'' before the \bibfield{journaltitle} in the \bibtype{article} entries.
+% Prints the string ``in'' before the \bibfield{journaltitle} in the \bibtype{article} entries.
%\begin{bibexample}
-%Doody, Terrence (1974), ``Hemingway’s Style and Jake’s Narration'', \emphasize{in} \emph{The Journal of Narrative Technique}, 4, 3, pp. 212–225
+% Doody, Terrence (1974), ``Hemingway’s Style and Jake’s Narration'', \emphasize{in} \emph{The Journal of Narrative Technique}, 4, 3, p. 212-225.
%\end{bibexample}
%
+%\boolitem[false \textrm{[Only for Italian documents]}]{classical}
%
-%\boolitem[false]{classical}
-%
-% [Only for Italian documents] It requires \sty{babel} or \sty{polyglossia}.
-% If \opt{true} it doubles the last consonant of the abbreviations such as ``p.'', ``vol.'', ``col.'' etc. when used in the plural form. For example you will have ``p.'' for ``page'' and ``pp.'' for ``pages''. This habit is very common in Italian writings even if it remains useless.
+% It requires \sty{babel} or \sty{polyglossia}.
+% If \opt{true} it doubles the last consonant of the abbreviations such as ``p.'', ``vol.'', ``col.'', etc., when used in the plural form. For example you will have ``p.'' for ``page'' and ``pp.'' for ``pages''. This habit is very common in Italian writings even if it remains useless.
%\begin{bibexample}
-%Corrocher, Roberto (2009), ``Riflessioni sull’uomo di fronte a nuove sfide'', in Giaretta et al. (2009), \emphasize{pp.} 27–42.
+% Corrocher, Roberto (2009), ``Riflessioni sull’uomo di fronte a nuove sfide'', in Giaretta et al. (2009), \emphasize{pp.} 27-42.
%\end{bibexample}
%^^A A similar setting is adopted for the default English and Spanish localization modules which, for example, use ``cols.'' for ``columns'' and ``pp'' for ``pages''.
%
%\boolitem[true]{library}
-%Shows the \bibfield{library} field, both in the bibliography and in the citations% (see also section \ref{sec:newfields}).
+% Shows the \bibfield{library} field, both in the bibliography and in the citations% (see also section \ref{sec:newfields}).
%
%\boolitem[false]{annotation}
-% Shows the \bibfield{annotation} field, only in the bibliography% (see also section \ref{sec:newfields}).
-% This option can be given globally or on a per-bibliography basis:
+% Shows the \bibfield{annotation} field only in the bibliography% (see also section \ref{sec:newfields}).
+% This option can be given globally or on a per-bibliography basis.
%\begin{ttquote}
-%\cmd{printbibliography}\oar{annotation=true}
+%\cmd{printbibliography}[annotation=true]
%\end{ttquote}
%
% \end{optionlist}
%
-%\subsection{Style-specific}
-%
-%
-%
-%\subsubsection[For \sty{classic} and
-% \sty{modern}]{Options for \sty{philosophy-classic} and
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection[For \sty{classic}/\sty{modern} styles]{Options for \sty{philosophy-classic} and
% \sty{philosophy-modern}}\label{sec:options-classic-modern}
-%
-%
+% ^^A
+% ^^A ----------------------------------------------------------------
%
% \begin{optionlist}
%
%\boolitem[false]{latinemph}
-%Prints the \emph{latinitas} ``et al.'' (\emph{et alii}) in italic shape.
-%
+% Prints the \emph{latinitas} ``et al.'' (\emph{et alii}) in italic shape.
%
%\boolitem[false]{square}
%
-%Uses brackets instead of parentheses in the citations and in the author-year label used in the bibliography.
+% Uses brackets instead of parentheses in the citations and in the author-year label used in the bibliography.
%
-%\boolitem[true]{nodate} Prints the \texttt{nodate} string when \bibfield{year} or \bibfield{date} is missing. Yo can set this option globally in the package options or in the optional argument of \cmd{printbibliography}.
+%\boolitem[true]{nodate} Prints the \texttt{nodate} string (localized) when \bibfield{year} or \bibfield{date} is missing. Yo can set this option globally in the package options or in the optional argument of \cmd{printbibliography}.
%
+% \end{optionlist}
%
-%\boolitem[false]{yearleft}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection[For \sty{modern} style]{Options for \sty{philosophy-modern}}\label{sec:options-modern}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% [\sty{philosophy-modern} only]
+% \begin{optionlist}
%
-%Prints the date flushed left in the bibliography.
+%\boolitem[false]{yearleft}
%
+% Prints the date flushed left in the bibliography.
%
%\boolitem[true]{restoreclassic}
%
-% [\sty{philosophy-modern} only]
-%
-%This option can be given in the optional argument of \cmd{printbibliography}.
-%It restores the \sty{classic} style within a document typeset using the \sty{modern} style. It is useful to compose a ``Web List'' like that at the end of this document. For example:
+% This option can be given in the optional argument of \cmd{printbibliography}.
+% It restores the \sty{classic} style within a document typeset using the \sty{modern} style. It is useful to compose a ``Web List'' like that at the end of this document. For example:
%\begin{ttquote}
-%\cmd{printbibliography}\oar{restoreclassic,type=online}
+%\cmd{printbibliography}[restoreclassic,type=online]
%\end{ttquote}
%
% \end{optionlist}
%
-%\subsubsection[For \sty{verbose}]{Options for \sty{philosophy-verbose}}\label{sec:options-verbose}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection[For \sty{verbose} style]{Options for \sty{philosophy-verbose}}\label{sec:options-verbose}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
% \begin{optionlist}
%
%\boolitem[false]{latinemph}
-%Prints the \emph{latinitates} ``{ivi}'', ``{ibidem}'' and ``et al.'' in italic shape.
+% Prints the \emph{latinitates} ``{ivi}'', ``{ibidem}'' and ``et al.'' in italic shape.
%
%\boolitem[false]{commacit}
-%Adds a comma at the end of the \bibfield{shorttitle} field when this is followed by the string ``cit.'':
+% Adds a comma at the end of the \bibfield{shorttitle} field when this is followed by the string ``cit.'':
% \begin{bibexample}
%``Descartes, \emph{Discours de la méthode}\emphasize{,} cit.''.
% \end{bibexample}
@@ -1069,10 +1104,20 @@ hidelinks,
%
%
%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{Customizations}\label{sec:customization}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-%\section{Customizations}\label{sec:customization}
% Here we introduce the new commands and lenghts provided by \sty{biblatex-philosophy}. The \sty{biblatex} package offers other commands, lenghts and options to modify many aspects of citations and bibliography. See the \sty{biblatex} documentation for details.
-%\subsection{Fonts}
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Fonts}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
%\begin{ltxsyntax}
%\cmditem{annotationfont} \hfill default: \cmd{footnotesize}
%
@@ -1094,19 +1139,23 @@ hidelinks,
%\end{latexcode}
%\end{ltxsyntax}
%
-%\subsection{Punctuation}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Punctuation}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
%\begin{ltxsyntax}
%\cmditem{volnumpunct} \hfill default: \cmd{addcomma}\cmd{space}
%
-%The separator between \bibfield{volume} and \bibfield{number} in \bibtype{article} entries.
-%It can be redefined with:
+% The separator between \bibfield{volume} and \bibfield{number} in \bibtype{article} entries.
+% It can be redefined with:
%\begin{latexcode}
%\begin{verbatim}
%\renewcommand*{\volnumpunct}{/}
%\end{verbatim}
%\end{latexcode}
-%Combining this with the \opt{volnumformat} and \opt{volumeformat} options
+% Combining this with the \opt{volnumformat} and \opt{volumeformat} options
% you can get other styles for volume and number. For example:\\
% \begin{bibexample}
% \ldots\ \emph{Journal Title}, 5/8, \ldots \\
@@ -1127,8 +1176,11 @@ hidelinks,
%\end{latexcode}
%\end{ltxsyntax}
%
-%\subsection{Lengths}\label{sec:lengths}
-%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Lengths}\label{sec:lengths}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
% These lengths are (re)defined only for the \sty{modern} style. It introduces two new lengths:
%
@@ -1164,11 +1216,16 @@ hidelinks,
%\end{latexcode}
%
%
-%\subsection[Languages]{Using the styles with other languages}\label{sec:languages}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection[Languages]{Using the styles with other languages}\label{sec:languages}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% The languages currently supported by this bundle are Italian, English, Spanish and French. In order to use the styles with different languages, you have first of all to declare the new \opt{opcited} string introduced by \sty{biblatex-philosophy}. You can then test the styles and if the default strings provided in the localization module does not match your needs you can re-define them.
+% The languages currently supported by this bundle are Italian, English, Spanish and French. In order to use the styles with different languages, you have first of all to declare the new \opt{opcited} string introduced by \sty{biblatex-philosophy}. You can then test the styles and if the default strings provided in the localization module does not match your needs you can redefine them.
%
-%Here is a sample code for using the styles in German documents. Note that we first declare the new string \opt{opcited}, then we define it and inherit the German default strings from \file{german.lbx}. The other strings (\opt{translationas}, \opt{ibidem}, \opt{loccit}, \dots) may be re-defined if the default ones are not satisfying. For example you may prefer ``deut. \"Ubers'' to the default ``\"Ubers unter dem Titel''. % Another approach is to use the \cmd{DeclareLanguageMapping} command. See the documentation of the \sty{biblatex} package for details \parencite{lehman:biblatex}.
+%Here is a sample code for using the styles in German documents. Note that we first declare the new string \opt{opcited}, then we define it and inherit the German default strings from \file{german.lbx}. The other strings (\opt{translationas}, \opt{ibidem}, \opt{loccit}, \dots) may be redefined if the default ones are not satisfying. For example you may prefer ``deut. \"Ubers'' to the default ``\"Ubers unter dem Titel''.
+% Another approach is to use the \cmd{DeclareLanguageMapping} command. See the documentation of the \sty{biblatex} package for details \parencite{lehman:biblatex}.
%\begin{latexcode}
%\begin{verbatim}
%\NewBibliographyString{opcited}
@@ -1181,17 +1238,16 @@ hidelinks,
%\end{verbatim}
%\end{latexcode}
%
-% The French default localization module redefines, among others, the \cmd{mkbibnamefamily} command in order to get the family name in small caps shape. We do not like this approach because an author could use a localization module without adhering to the typographical standards which should be indipendent from the linguistic standards. For this reason we have reset it to the default definition. If you prefer the \file{french.lbx} choice use this code:
+% The French default localization module redefines, among others, the \cmd{mkbibnamefamily} command in order to get the family name in small caps. We do not like this approach because an author could use a localization module without adhering to the typographical standards which should be indipendent from the linguistic standards. For this reason we have reset it to the default definition. If you prefer the \file{french.lbx} choice, use this code:
%\begin{latexcode}
%\begin{verbatim}
%\DefineBibliographyExtras{french}{%
% \protected\def\mkbibnamefamily#1{%
-% \textsc{\textnohyphenation{#1}}}
-% }%
+% \textsc{\textnohyphenation{#1}}}}%
%\end{verbatim}
%\end{latexcode}
%
-% The \sty{philosophy} styles redefine the \cmd{bibrangedash} and \cmd{bibdaterangesep} commands in order to get a simple dash (-) instead of an en dash (--) in the page and date ranges. If you prefer the en dash use the following code for all the languages loaded by \sty{babel} or \sty{polyglossia}:
+% The \sty{philosophy} styles redefine the \cmd{bibrangedash} and \cmd{bibdaterangesep} commands in order to get a simple dash (-) instead of an en dash (--), in the page and date ranges. If you prefer the en dash use the following code for all the languages loaded by \sty{babel} or \sty{polyglossia}:
%
%\begin{latexcode}
%\begin{verbatim}
@@ -1202,15 +1258,21 @@ hidelinks,
%\end{verbatim}
%\end{latexcode}
%
-%
-%\section{Backward compatibility}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{Backward compatibility}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
%Previous versions of the styles provided a different mechanism to manage entries comprising both the original publication data and the translation data. This feature is now deprecated and it is still supported only for backward compatibility. This mechanism uses some special fields and provides specific options.
%
-%\subsection{Deprecated fields}\label{sec:origfields}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Deprecated fields}\label{sec:origfields}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
%The following fields can hold the translation or the original edition data. They are preceded by the string ``trans.'' or ``orig. ed.'', respectively according to the \opt{origfields=trans} (default) or \opt{origfields=origed} option (see below). Note that the \bibfield{origdate/transdate} field is needed in order to print these fields. Contrarily they will be ignored.
-
%
%\begin{fieldlist}
%
@@ -1231,7 +1293,6 @@ hidelinks,
%
%\fielditem{origdate}{range}\mbox{}\\[-9ex]
%\fielditem{transdate}{range}
-
%
%The publication date of the translation/original edition.
%^^A\begin{bibexample}
@@ -1244,9 +1305,9 @@ hidelinks,
%\fielditem{origbooktitle}{literal}\mbox{}\\[-9ex]
%\fielditem{transbooktitle}{literal}
%
-%The title of the \bibtype{collection}/\bibtype{book}/\bibtype{mvbook} in which the translation/original edition of an \bibtype{article} (\bibtype{inbook} or \bibtype{incollection}) is published.
+%The title of the \bibtype{collection}/\bibtype{book}/\bibtype{mvbook} in which the translation/original edition of an \bibtype{article}/\bibtype{inbook}/\bibtype{incollection} is published.
%
-% The field is printed after the \bibfield{origtitle/transtitle}.
+% The field is printed after the \bibfield{origtitle/transtitle} fields.
%^^A\vbox{
%^^A \begin{bibexample}
%^^A Moore, George Edward (1903), «The refutation of idealism», \emph{Mind}, N.S., 12 (mag. 1903), p. 433-453; trad. it. «La confutazione dell'idealismo», in \emphasize{\emph{Il Neoempirismo}}, a cura di Alberto Pasquinelli, UTET, Torino 1969, p. 35-61.
@@ -1256,7 +1317,7 @@ hidelinks,
%\fielditem{orignote}{literal}\mbox{}\\[-9ex]
%\fielditem{transnote}{literal}
%
-%This field is printed after the \bibfield{origtitle/transtitle}. It is meat for secondary informations about the translation/original edition, such as the name of editors, translators, etc.:
+%This field is printed after the \bibfield{origtitle/transtitle}. It is meat for secondary informations about the translation/original edition, such as the name of editors, translators, etc.
%^^A \begin{bibexample}
%^^A Mach, E. (1883), \emph{Die Mechanik in ihrer Entwickelung historisch-kritisch dargestellt}; trad. it. \emph{La meccanica nel suo sviluppo storico-critico}, \emphasize{traduzione, introduzione e note di Alfonsina D'Elia}, Bollati Boringhieri, Torino 1977.
%^^A \end{bibexample}
@@ -1266,13 +1327,17 @@ hidelinks,
%\fielditem{transpages}{literal}
%
%This field is printed at the end of the entry, after the \bibfield{origdate/transdate} field. It is meant for the page range of the translation/original edition or other useful informations.
-%In the first case string ``p.'' is omitted.
+%In the first case, string ``p.'' is omitted.
%\end{fieldlist}
%
-%\subsection{Deprecated options}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Deprecated options}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
%\begin{optionlist}
-%\optitem[trans]{origfields}{\opt{trans}, \opt{none}, \opt{edorig}}
+%\optitem[trans]{origfields}{\opt{trans}\OR\opt{none}\OR\opt{edorig}}
%\begin{valuelist}
%\item[true] Prints the \bibfield{orig-} fields.
%\item[none] Omits the \bibfield{orig-} fields.
@@ -1283,78 +1348,85 @@ hidelinks,
%
%Same as the previous but can be set on a per-entry basis in the \opt{options} field.
%
-%\optitem[semicolon]{origfieldsformat}{\opt{semicolon}, \opt{parens}, \opt{brackets}}
-% Deprecated. Use the \opt{relatedformat} option instead.
+%\optitem[semicolon]{origfieldsformat}{\opt{semicolon}\OR\opt{parens}\OR\opt{brackets}}
+% Use the \opt{relatedformat} option instead.
%\begin{valuelist}
%\item[semicolon]
%The translation/original publication data are preceded by a semicolon.
%\item[parens]
%Puts the translation or the original publication data in parentheses.
%\item[brackets]
-%Same as the previous option but with brackets instead of parentheses.
+%Same as the previous option, but with brackets instead of parentheses.
%\end{valuelist}
%\boolitem[false]{scauthorsbib}
-%Same as \opt{scauthors=bib}
+%Same as \opt{scauthors=bib}.
%\boolitem[false]{scauthorscite}
-%Same as \opt{scauthors=cite}
+%Same as \opt{scauthors=cite}.
%\boolitem[false]{scauthors}
-%Same as \opt{scauthors=bibcite}
+%Same as \opt{scauthors=bibcite}.
%\end{optionlist}
%
-%^^A\section{Known issues}
-%^^A
-%^^A The \cmd{textcite} command has an unexpected behaviour in managing entries with a shorthand defined. Note that \cmd{cite} and \cmd{parencite} prints correctly the shorthand, while \cmd{textcite} prints the name plus the shorthand. Anyway this is a bug (or a feature) of \file{authoryear-comp.cbx}.
-%^^A \begin{description}
-%^^A\item[\cmd{cite}\ar{kant:kpv}] \cite{kant:kpv}
-%^^A\item[\cmd{parecite}\ar{kant:kpv}] \parencite{kant:kpv}
-%^^A\item[\cmd{texcite}\ar{kant:kpv}] \textcite{kant:kpv}
-%^^A\end{description}
-%^^A\smallskip
-%^^A
-%^^A Some spurious spaces could come out in entries without author/editor label such as \cite{jcv}. Note the space preceding ``35''.
-%^^A
-%
-% \defbibnote{restoreclassic}{\sffamily\small This is the primary bibliography of this document and it is typeset in \sty{classic} style (through the \opt{restoreclassic} option) even if the bibliography style of the document is \sty{philosophy-modern}. This is particularly useful for typesetting bibliographies in which there is only one entry for an author, such as the Web lists, as shown below.}
+% \section{Known issues}
%
-% \defbibnote{weblist}{\sffamily\small Here we have a list of Web sites typeset in the \sty{classic} style through the \opt{restoreclassic} option. Only the \bibtype{online} entries are printed and the annotation is omitted via the contextual option \opt{annotation=false}.}
+% The \sty{parskip} package redefines \cmd{parindent} and sets it to 0\,pt by default. This conflicts with the \sty{philosophy-modern} style, which uses this length for the left indentation of bibliographic entries. In such a case, remember to select the correct value of \cmd{bibhang}, which is set to \texttt{4}\cmd{parindent} by default (see section \ref{sec:lengths}).
%
-%\defbibnote{biblatex-examples}{\sffamily\small The source of this bibliography, typeset in the \sty{modern} style, is the \file{biblatex-examples.bib} database, distributed with the \sty{biblatex} package. It is provided for checking all the standard features. This list could highlight some bugs.}
+% \defbibnote{weblist}{\label{weblist}\small Here we have a list of Web sites typeset in the \sty{classic} style through the \opt{restoreclassic} option. Only the \bibtype{online} entries are printed and the annotation is omitted via the contextual option \opt{annotation=false}.}
%
-%\defbibnote{philosophy-examples}{\sffamily\small The source of this bibliography, typeset in the \sty{modern} style, is the \file{biblatex-philosophy.bib} database, distributed with the \sty{biblatex-philosophy} package. It is provided for checking all the style-specific features. This list should not highlight any bugs.}
+%\defbibnote{biblatex-examples}{\small The source of this bibliography, typeset in the \sty{modern} style, is the \file{biblatex-examples.bib} database, distributed with the \sty{biblatex} package. It is provided for checking all the standard features. This list could highlight some bugs.}
%
+%\defbibnote{philosophy-examples}{\small The source of this bibliography, typeset in the \sty{modern} style, is the \file{biblatex-philosophy.bib} database, distributed with the \sty{biblatex-philosophy} package. It is provided for checking all the style-specific features. This list should not highlight any bugs.}
%
-%\printbibliography[heading=bibintoc,keyword=primaria,
-% restoreclassic,prenote=restoreclassic]
%\printbibheading[heading=bibintoc,title=Examples]
-%\printshorthands[heading=subbibliography]
-%\printbibliography[heading=subbibliography,title=A Web
-% List,keyword=web,restoreclassic,prenote=weblist,annotation=false]
+%\printshorthands[heading=subbibliography,title=Shorthands]
+%\printbibliography[heading=subbibliography,title=A Web List,
+% keyword=web,restoreclassic,prenote=weblist,annotation=false]
%\printbibliography[heading=subbibliography,title=Philosophy
% examples,prenote=philosophy-examples,keyword=esempio]
%
%\nocite{set,stdmodel,matuz:doody,vizedom:related,britannica,gaonkar,jaffe,westfahl:frontier,cms,ctan,jcg,yoon,worman,wilde,westfahl:space,weinberg,wassenberg,vazques-de-parga,springer,spiegelberg,sorace,sigfridsson,shore,sarfraz,salam,reese,pines,piccato,padhye,nussbaum,nietzsche:ksa,nietzsche:ksa1,nietzsche:historie,moraux,moore,moore:related,massa,maron,markey,malinowski,loh,laufenberg,kullback,kullback:reprint,kullback:related,kowalik,knuth:ct,knuth:ct:a,knuth:ct:b,knuth:ct:c,knuth:ct:d,knuth:ct:e,knuth:ct:related,kastenholz,kant:kpv,kant:ku,itzhaki,hyman,murray,iliad,herrmann,hammond,companion,gonzalez,glashow,gillies,gerhardt,vangennep,vangennep:trans,vangennep:related,geer,gaonkar:in,doody,cotton,coleridge,cicero,chiu,brandt,bertram,baez/article,baez/online,averroes/bland,averroes/hannes,averroes/hercz,augustine,aristotle:anima,aristotle:physics,aristotle:poetics,aristotle:rhetoric,angenendt,almendro,aksin}
+%\printbibliography[heading=subbibliography,title=Biblatex examples,
+% prenote=biblatex-examples,category=biblatex]
+
%
-%\printbibliography[heading=subbibliography,title=Biblatex examples,prenote=biblatex-examples,category=biblatex]
-%
-%
-% \StopEventually{\PrintChanges\PrintIndex}
+% \StopEventually{
+% \defbibnote{restoreclassic}{\small This is the primary bibliography of this document and it is typeset in \sty{classic} style (through the \opt{restoreclassic} option) even if the bibliography style of the document is \sty{philosophy-modern}. This is particularly useful for typesetting bibliographies in which there is only one entry for an author, such as the Web lists. See the example above (p. \pageref{weblist}).}
%
+% \printbibliography[heading=bibintoc,keyword=primaria,
+% restoreclassic,prenote=restoreclassic]
+% \PrintChanges\PrintIndex}
%
% \iffalse
%<*standard-bbx>
% \fi
%
-% \section{The Code}
-%
-% \subsection{\file{philosophy-standard.bbx}}
-% \subsubsection{Initial settings}
-%
-% Biber is the default bibliography processor for \sty{biblatex}.
-% The \sty{philosophy} styles could work without Biber (excluding the experimental \bibtype{jurisprudence} driver)
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{The Code}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{\file{philosophy-standard.bbx}}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsubsection{Initial settings}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% \sty{biber} is the default bibliography processor for \sty{biblatex}.
+% The \sty{philosophy} styles could work without \sty{biber} (excluding the experimental \bibtype{jurisprudence} driver)
% but it is required because it offers many useful functionalities. The \opt{backend=bibtex} or \opt{backend=bibtex8} options
% produce an error message.
% \begin{macrocode}
\RequireBiber[3]
+\@ifpackagelater{biblatex}{2020/08/23}
+ {}
+ {\PackageError{biblatex-philosophy}
+ {Package biblatex is too old. Please update your LaTeX distribution}}
% \end{macrocode}
% The styles are base on \sty{standard} \sty{biblatex} default style.
% \begin{macrocode}
@@ -1448,10 +1520,10 @@ hidelinks,
% \end{macrocode}
% And now one option to be used in the \cmd{printbibliography} and \cmd{printbiblist} commands.
% \begin{macrocode}
-\define@key{blx@bib1}{annotation}[]{}
-\define@key{blx@bib2}{annotation}[true]{\settoggle{bbx:annotation}{#1}}
-\define@key{blx@biblist1}{annotation}[]{}
-\define@key{blx@biblist2}{annotation}[true]{\settoggle{bbx:annotation}{#1}}
+\blx@kv@defkey{blx@bib1}{annotation}[]{}
+\blx@kv@defkey{blx@bib2}{annotation}[true]{\settoggle{bbx:annotation}{#1}}
+\blx@kv@defkey{blx@biblist1}{annotation}[]{}
+\blx@kv@defkey{blx@biblist2}{annotation}[true]{\settoggle{bbx:annotation}{#1}}
% \end{macrocode}
% Now we can execute the default options.
% \begin{macrocode}
@@ -1539,7 +1611,7 @@ hidelinks,
}
% \end{macrocode}
%
-% \subsubsection{New commands}
+% \subsubsection{New commands}
%
% The \cmd{mkibid} command is provided for formatting the \emph{latinitates} ``et al.'', ``ivi'', ``ibidem''.
% Actually the command is introduce for formatting ``et al.'' considering that it is already defined by \sty{verbose-trad2.cbx}
@@ -1553,7 +1625,7 @@ hidelinks,
\newcommand*{\volnumpunct}{\addcomma\space}
\renewcommand*{\newunitpunct}{\addcomma\space}
\renewcommand*{\subtitlepunct}{\addperiod\space}
-\renewcommand*{\intitlepunct}{\nopunct\addspace}
+%\renewcommand*{\intitlepunct}{\addspace}
\renewcommand*{\relatedpunct}{\addsemicolon\space}
% \end{macrocode}
% The \cmd{editorstrgdelim} is introduced to customize the
@@ -1577,6 +1649,11 @@ hidelinks,
\bibleftbracket#1\bibrightbracket%
\endgroup}
% \end{macrocode}
+% We define proper parentheses and brackets for ``related'' blocks
+% \begin{macrocode}
+\def\mkrelatedparens{\mkpureparens}
+\def\mkrelatedbrackets{\mkpurebrackets}
+% \end{macrocode}
% Some commands for changing the font of the \bibfield{annotation}, \bibfield{library} and \bibfield{edition} fields.
% \begin{macrocode}
\newcommand*{\annotationfont}{\footnotesize}
@@ -1601,7 +1678,7 @@ hidelinks,
{\textsc{#1}}}
% \end{macrocode}
%
-% \subsubsection{Names format}
+% \subsubsection{Names format}
%
% First we define a macro to be used in the \cmd{DeclareNameFormat} specifications. The macro simply maps the \cmd{mkbibname*} commands to the new \cmd{mkbibsc} command defined above.
% \begin{macrocode}
@@ -1630,7 +1707,7 @@ hidelinks,
{\namepartgiven}
{\namepartprefix}
{\namepartsuffix}}%
- \ifboolexpe{%
+ \ifboolexpr{%
test {\ifdefvoid\namepartgiven}
and
test {\ifdefvoid\namepartprefix}}
@@ -1764,17 +1841,24 @@ hidelinks,
{\ifdefstring{\bbx@volumeformat}{roman}%
{\Rn{#1}}x%
{\optionerror{volumeformat}}}}}}{#1}}
+% \end{macrocode}
+% With the \opt{parens} and \opt{brackets} options, the related entries are
+% enclosed in parentheses (or brackets) defined specifically,
+% because in the case of cascading entries, they must be eliminated
+% starting from the second entry. This is done below with the |begrelatedloop| macro.
+% See section \ref{code:related-entries}.
+% \begin{macrocode}
\DeclareFieldFormat{related}{%
\ifdefstring{\bbx@relatedformat}{parens}%
- {\mkpureparens{#1}}%
- {\ifdefstring{\bbx@relatedformat}{brackets}%
- {\mkpurebrackets{#1}}%
- {\ifdefstring{\bbx@relatedformat}{semicolon}%
- {#1}%
- {\optionerror{relatedformat}}}}}%
+ {\mkrelatedparens{#1}}%
+ {\ifdefstring{\bbx@relatedformat}{brackets}%
+ {\mkrelatedbrackets{#1}}%
+ {\ifdefstring{\bbx@relatedformat}{semicolon}%
+ {#1}%
+ {\optionerror{relatedformat}}}}}%
\DeclareFieldAlias{related:origpubin}{related}
\DeclareFieldAlias{related:origpubas}{related}
-\DeclareFieldFormat{relatedstring:default}{#1\addspace}%\addspace needed
+\DeclareFieldFormat{relatedstring:default}{#1\addspace}
% \end{macrocode}
% \subsubsection{New macros}
% Experimental in version 1.9.4. The \texttt{translatorstrg} and \texttt{translator+othersstrg} macros do not use the
@@ -1861,20 +1945,6 @@ hidelinks,
\setunit{\addcomma\space}%
\printfield{eid}}
-% TO be removed if implemented in biblatex.def.
-% Code proposed by @moewew
-\renewbibmacro*{journal}{%
- \ifboolexpr{
- test {\iffieldundef{journaltitle}}
- and
- test {\iffieldundef{journalsubtitle}}
- }
- {}
- {\printtext[journaltitle]{%
- \printfield[titlecase]{journaltitle}%
- \setunit{\subtitlepunct}%
- \printfield[titlecase]{journalsubtitle}}}}
-
\renewbibmacro*{periodical}{%
\ifboolexpr{
test {\iffieldundef{title}}
@@ -1976,7 +2046,7 @@ hidelinks,
\setunit*{\addcomma\space}%
\printeventdate}}%
\newunit}
-
+
\renewbibmacro*{publisher+location+date}{%
\ifdefstring{\bbx@publocformat}{loccolonpub}
{\usebibmacro{loccolonpub}}
@@ -2128,7 +2198,14 @@ hidelinks,
\printtext[annotation]{\printfield{annotation}\finentry\par}}}%
{\finentry}}
% \end{macrocode}
-% \subsubsection{Related entries}
+% The default definition of the |in:| macro gives a spacing problem
+% with the \cmd{fulcite} command. Specifically, the command has no effect in citations, while it works correctly in the bibliography. This definition bypasses the problem, but does not actually solve it.
+% \begin{macrocode}
+\renewbibmacro*{in:}{%
+ \bibstring{in}\addspace}
+% \printunit{\intitlepunct}}
+% \end{macrocode}
+% \subsubsection{Related entries}\label{code:related-entries}
% \begin{macrocode}
\newbibmacro*{relateddate}{%
\setunit*{\addspace}%
@@ -2150,33 +2227,41 @@ hidelinks,
\renewbibmacro*{editor}{\usebibmacro{bbx:savehash}}%
\renewcommand*{\labelnamepunct}{}}%
\DeclareCiteCommand{\relatedcite}
- {}%
- {\usedriver
- {\DeclareNameAlias{sortname}{default}%
- \usebibmacro{related:clearauthors}%
- \renewbibmacro*{relateddate}{%
- \setunit*{\addspace}\printdate}%
- \renewbibmacro*{commarelateddate}{%
- \setunit*{\addcomma\space}\printdate}}%
- {\thefield{entrytype}}}%
- {}%
- {}%
+{}%
+{\usedriver
+ {\DeclareNameAlias{sortname}{default}%
+ \ifbibmacroundef{date+extradate}
+ {}
+ {%\renewbibmacro*{date+extradate}{}%
+ \renewbibmacro*{bbx:ifmergeddate}{\@secondoftwo}}%
+ \usebibmacro{related:clearauthors}%
+ \renewbibmacro*{relateddate}{%
+ \setunit*{\addspace}\printdate}%
+ \renewbibmacro*{commarelateddate}{%
+ \setunit*{\addcomma\space}\printdate}%
+ }%
+ {\thefield{entrytype}}}%
+{}%
+{}%
\renewbibmacro*{related:default}[1]{%
- \togglefalse{bbx:annotation}%
+ \togglefalse{bbx:annotation}%
\ifboolexpr{
- test {\iffieldundef{relatedtype}}
- and
- test {\iffieldundef{relatedstring}}
+ test {\iffieldundef{relatedtype}}
+ and
+ test {\iffieldundef{relatedstring}}
}
{\printtext{\bibstring{translationas}}}{}%
- \printtext{\addspace}%
- \relatedcite{\thefield{related}}}
+ \printtext{\addspace}%
+ \relatedcite{\thefield{related}}}
% \end{macrocode}
-% We redefine the \texttt{begrelatedloop} macro to avoid nested parentheses in cascading related entries:
+% We redefine the \texttt{begrelatedloop} macro to avoid nested parentheses
+% in cascading related entries. In this way, with the \opt{parens} and \opt{brackets}
+% options, only the entire block of the related entries will be enclosed in parentheses
+% (or brackets), while the subordinated entries will be separated with a semicolon.
% \begin{macrocode}
\renewbibmacro*{begrelatedloop}{%
- \renewrobustcmd*{\mkpureparens}{\relatedpunct}%
- \renewrobustcmd*{\mkpurebrackets}{\relatedpunct}}
+ \renewrobustcmd*{\mkrelatedparens}{\relatedpunct}%
+ \renewrobustcmd*{\mkrelatedbrackets}{\relatedpunct}}
% \end{macrocode}
% This macro tests the value of the \opt{relatedformat} option. If it sets to \opt{semicolon} the macro adds \cmd{relatedpunct} (i.e. a semicolon plus a space), otherwise it adds a simple space.
% \begin{macrocode}
@@ -3307,40 +3392,41 @@ hidelinks,
\printdate\ifdefstring{\bbx@editionformat}{superscript}%
{\printfield{edition}}{}}
% \end{macrocode}
-% \subsubsection{Crossreferences}
+% \subsubsection{Cross references}
% \begin{macrocode}
\DeclareCiteCommand{\bbx@crossref@inbook}%
- {}%
- {\ifciteseen{%
- \ifthenelse{\value{listtotal}=2}%
- {\printnames[][-\value{maxnamesincross}]{labelname}}%
- {\printnames[][-\value{minnamesincross}]{labelname}}%
- \setunit*{\addcomma\space}\printtext{%
- \printfield[citetitle]{labeltitle}%
+{}%
+{\ifciteseen{%
+ \ifthenelse{\value{listtotal}=2}%
+ {\printnames[][-\value{maxnamesincross}]{labelname}}%
+ {\printnames[][-\value{minnamesincross}]{labelname}}%
+ \setunit*{\addcomma\space}\printtext{%
+ \printfield[citetitle]{labeltitle}%
\iftoggle{cbx:commacit}{\setunit{\addcomma\space}}%
- {\setunit{\addspace\midsentence}}%
- \bibstring{opcit}}}%
- {\DeclareNameAlias{sortname}{default}%
+ {\setunit{\addspace\midsentence}}%
+ \bibstring{opcit}}}%
+ {\DeclareNameAlias{sortname}{default}%
\usebibmacro{usedriver:book}}}%
- {}%
- {}%
+{}%
+{}%
\DeclareCiteCommand{\bbx@crossref@incollection}%
- {}%
- {\ifciteseen{%
-\ifthenelse{\value{listtotal}=2}%
- {\printnames[][-\value{maxnamesincross}]{labelname}}%
- {\printnames[][-\value{minnamesincross}]{labelname}}%
- \setunit{\addspace}%
- \usebibmacro{editorstrg}%
- \setunit*{\addcomma\space}\printtext{%
- \printfield[citetitle]{labeltitle}%
- \iftoggle{cbx:commacit}{\setunit{\addcomma\space}}%
- {\setunit{\addspace\midsentence}}%
- \bibstring{opcit}}}%
- {\DeclareNameAlias{sortname}{default}%
+{}%
+{\ifciteseen{%
+ \ifthenelse{\value{listtotal}=2}%
+ {\printnames[][-\value{maxnamesincross}]{labelname}}%
+ {\printnames[][-\value{minnamesincross}]{labelname}}%
+ \setunit*{\addspace}%
+ \usebibmacro{editorstrg}%
+ \setunit*{\addcomma\space}%
+ \printtext{%
+ \printfield[citetitle]{labeltitle}%
+ \iftoggle{cbx:commacit}{\setunit{\addcomma\space}}%
+ {\setunit{\addspace\midsentence}}%
+ \bibstring{opcit}}}%
+ {\DeclareNameAlias{sortname}{default}%
\usebibmacro{usedriver:collection}}}%
- {}%
- {}%
+{}%
+{}%
% \end{macrocode}
% \subsubsection{Bibliography drivers}
% \begin{macrocode}
@@ -3602,7 +3688,7 @@ hidelinks,
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{nodash:editor+others}%
- \setunit{\labelnamepunct}\newblock
+ \setunit{\labelnamepunct}\newblock%
\usebibmacro{maintitle+title}%
\newunit
\printlist{language}%
@@ -3653,7 +3739,7 @@ hidelinks,
% \fi
% \subsubsection{Initial settings}
% \begin{macrocode}
-\RequireBibliographyStyle{authoryear}
+\RequireBibliographyStyle{authoryear-comp}
\RequireBibliographyStyle{philosophy-standard}
\newtoggle{bbx:square}
@@ -3667,8 +3753,8 @@ hidelinks,
% We define the \opt{nodate} option also to be used in the
% optional argument of \cmd{printbibliography}:
% \begin{macrocode}
-\define@key{blx@bib1}{nodate}[]{}%
-\define@key{blx@bib2}{nodate}[true]{%
+\blx@kv@defkey{blx@bib1}{nodate}[]{}%
+\blx@kv@defkey{blx@bib2}{nodate}[true]{%
\ifstrequal{#1}{false}{\togglefalse{bbx:nodate}}{}}%
% \end{macrocode}
% The \opt{mergedate} option from \file{authoryear.bbx} must be completely redefined.
@@ -3677,23 +3763,6 @@ hidelinks,
% The test \cmd{ifboolexpr} is required to make \texttt{bbx:nodate} macro work properly and
% the \cmd{postsepyear} command is used to surround the date label with a box of fixed width.
% \begin{macrocode}
-%\def\bbx@opt@mergedate@maximum{%
-% \renewbibmacro*{date+extradate}{%
-% \ifboolexpr{%
-% test {\iffieldundef{date}}
-% and
-% test {\iffieldundef{year}}
-% }%
-% {\usebibmacro{bbx:nodate}}
-% {\postsepyear{%
-% \printfield{issue}%
-% \setunit*{\addspace}%
-% \iffieldsequal{year}{labelyear}
-% {\printlabeldateextra}%
-% {\printdateextra}%
-% }}}%
-% \renewbibmacro*{date}{}%
-% \renewbibmacro*{issue+date}{}}
\def\bbx@opt@mergedate@maximum{%
\renewbibmacro*{date+extradate}{%
\iffieldundef{labelyear}
@@ -3704,13 +3773,14 @@ hidelinks,
\setunit*{\addspace}%
\printdateextra}
{\printlabeldateextra}}}}%
- \renewbibmacro*{date}{%
+ \renewbibmacro*{bbx:ifmergeddate}{\iflabeldateisdate}%
+ \renewbibmacro*{date}{%
\iflabeldateisdate
{}
{\printdate}}%
\renewbibmacro*{issue+date}{%
- \iflabeldateisdate
- {}
+ \usebibmacro{bbx:ifmergeddate}
+ {}
{\ifdefstring{\bbx@volnumformat}{parens}%
{\printtext{%
\printfield{issue}%
@@ -3720,33 +3790,6 @@ hidelinks,
\printfield{issue}%
\setunit*{\addspace}%
\printdate}}}}}
-
-
-% merge date with date label
-%\def\bbx@opt@mergedate@compact{%
-% \renewbibmacro*{date+extradate}{%
-% \ifboolexpr{%
-% test {\iffieldundef{date}}
-% and
-% test {\iffieldundef{year}}
-% }%
-% {\usebibmacro{bbx:nodate}}
-% {\postsepyear{%
-% \iffieldsequal{year}{labelyear}
-% {\printlabeldateextra}%
-% {\printdateextra}%
-% }}}%
-% \renewbibmacro*{date}{}%
-% \renewbibmacro*{issue+date}{%
-% \iffieldundef{issue}
-% {}
-% {\ifdefstring{\bbx@volnumformat}{parens}%
-% {\printtext{%
-% \printfield{issue}%
-% \printdate}}%
-% {\printtext[pureparens]{%
-% \printfield{issue}}}}%
-% \newunit}}
\def\bbx@opt@mergedate@compact{%
\renewbibmacro*{date+extradate}{%
\iffieldundef{labelyear}
@@ -3755,6 +3798,7 @@ hidelinks,
\iflabeldateisdate
{\printdateextra}
{\printlabeldateextra}}}}%
+ \renewbibmacro*{bbx:ifmergeddate}{\iflabeldateisdate}%
\renewbibmacro*{date}{%
\iflabeldateisdate
{}
@@ -3766,57 +3810,31 @@ hidelinks,
{\printtext{%
\printfield{issue}%
\setunit*{\addspace}%
- \iflabeldateisdate
+ \usebibmacro{bbx:ifmergeddate}
{}
{\printdate}%
}}%
{\printtext[pureparens]{%
\printfield{issue}%
\setunit*{\addspace}%
- \iflabeldateisdate
+ \usebibmacro{bbx:ifmergeddate}
{}
{\printdate}%
}}}
{}%
\newunit}}
-
-% merge year-only date with date label
-%\def\bbx@opt@mergedate@basic{%
-% \renewbibmacro*{date+extradate}{%
-% \ifboolexpr{%
-% test {\iffieldundef{date}}
-% and
-% test {\iffieldundef{year}}
-% }%
-% {\usebibmacro{bbx:nodate}}
-% {\postsepyear{%
-% \printdateextra%
-% }}}%
-% \renewbibmacro*{date}{%
-% \iffieldundef{month}
-% {}
-% {\printdate}}%
-% \renewbibmacro*{issue+date}{%
-% \ifboolexpr{
-% test {\iffieldundef{issue}}
-% and
-% test {\iffieldundef{month}}
-% }
-% {}
-% {\ifdefstring{\bbx@volnumformat}{parens}%
-% {\printtext{%
-% \printfield{issue}\setunit*{\addspace}%
-% \printdate}}%
-% {\printtext[pureparens]{%
-% \printfield{issue}\setunit*{\addspace}%
-% \printdate}}}%
-% \newunit}}
-
\def\bbx@opt@mergedate@basic{%
\renewbibmacro*{date+extradate}{%
\iffieldundef{labelyear}
{\usebibmacro{bbx:nodate}}
{\postsepyear{\printlabeldateextra}}}%
+ \renewbibmacro*{bbx:ifmergeddate}{%
+ \ifboolexpr{
+ test {\iflabeldateisdate}
+ and
+ not test {\ifdateshavedifferentprecision{label}{}}
+ }%
+}%
\renewbibmacro*{date}{%
\ifboolexpr{
test {\iflabeldateisdate}
@@ -3827,13 +3845,11 @@ hidelinks,
{\printdate}}%
\renewbibmacro*{issue+date}{%
\ifboolexpr{
- test {\iflabeldateisdate}
- and
- not test {\ifdateshavedifferentprecision{label}{}}
- and
- test {\iffieldundef{issue}}
- }
- {}
+ test {\usebibmacro{bbx:ifmergeddate}}
+ and
+ test {\iffieldundef{issue}}
+}
+{}
{\ifdefstring{\bbx@volnumformat}{parens}%
{\printtext{%
\printfield{issue}%
@@ -3844,51 +3860,20 @@ hidelinks,
\setunit*{\addspace}%
\printdate}}}%
\newunit}}
-
-% merge year-only date with year-only date label
-%\def\bbx@opt@mergedate@minimum{%
-% \renewbibmacro*{date+extradate}{%
-% \ifboolexpr{%
-% test {\iffieldundef{date}}
-% and
-% test {\iffieldundef{year}}
-% }%
-% {\usebibmacro{bbx:nodate}}
-% {\postsepyear{%
-% \printdateextra%
-% }}}%
-% \renewbibmacro*{date}{%
-% \ifboolexpr{
-% test {\iffieldundef{month}}
-% and
-% test {\iffieldundef{extrayear}}
-% }
-% {}
-% {\printdate}}%
-% \renewbibmacro*{issue+date}{%
-% \ifboolexpr{
-% test {\iffieldundef{issue}}
-% and
-% test {\iffieldundef{month}}
-% and
-% test {\iffieldundef{extrayear}}
-% }
-% {}
-% {\ifdefstring{\bbx@volnumformat}{parens}%
-% {\printtext{%
-% \printfield{issue}\setunit*{\addspace}%
-% \printdate}}%
-% {\printtext[pureparens]{%
-% \printfield{issue}\setunit*{\addspace}%
-% \printdate}}}%
-% \newunit}}
-
-
\def\bbx@opt@mergedate@minimum{%
\renewbibmacro*{date+extradate}{%
\iffieldundef{labelyear}
{\usebibmacro{bbx:nodate}}
{\postsepyear{\printlabeldateextra}}}%
+ \renewbibmacro*{bbx:ifmergeddate}{%
+ \ifboolexpr{
+ test {\iflabeldateisdate}
+ and
+ not test {\ifdateshavedifferentprecision{label}{}}
+ and
+ test {\iffieldundef{extradate}}
+ }%
+}%
\renewbibmacro*{date}{%
\ifboolexpr{
test {\iflabeldateisdate}
@@ -3901,15 +3886,11 @@ hidelinks,
{\printdate}}%
\renewbibmacro*{issue+date}{%
\ifboolexpr{
- test {\iflabeldateisdate}
- and
- not test {\ifdateshavedifferentprecision{label}{}}
- and
- test {\iffieldundef{extradate}}
- and
- test {\iffieldundef{issue}}
- }
- {}
+ test {\usebibmacro{bbx:ifmergeddate}}
+ and
+ test {\iffieldundef{issue}}
+}
+{}
{\ifdefstring{\bbx@volnumformat}{parens}%
{\printtext{%
\printfield{issue}%
@@ -3920,34 +3901,12 @@ hidelinks,
\setunit*{\addspace}%
\printdate}}}%
\newunit}}
-
-% don't merge date/issue with date label
-%\def\bbx@opt@mergedate@false{%
-% \renewbibmacro*{date+extradate}{%
-% \ifboolexpr{%
-% test {\iffieldundef{date}}
-% and
-% test {\iffieldundef{year}}
-% }%
-% {\usebibmacro{bbx:nodate}}
-% {\postsepyear{%
-% \printdateextra%
-% }}}%
-% \renewbibmacro*{date}{\printdate}%
-% \renewbibmacro*{issue+date}{%
-% {\ifdefstring{\bbx@volnumformat}{parens}%
-% {\printtext{%
-% \printfield{issue}\setunit*{\addspace}%
-% \printdate}}%
-% {\printtext[pureparens]{%
-% \printfield{issue}\setunit*{\addspace}%
-% \printdate}}}}}
-
\def\bbx@opt@mergedate@false{%
\renewbibmacro*{date+extradate}{%
\iffieldundef{labelyear}
{\usebibmacro{bbx:nodate}}
{\postsepyear{\printlabeldateextra}}}%
+ \renewbibmacro*{bbx:ifmergeddate}{\@secondoftwo}%
\renewbibmacro*{date}{\printdate}%
\renewbibmacro*{issue+date}{%
\ifdefstring{\bbx@volnumformat}{parens}%
@@ -4145,7 +4104,7 @@ hidelinks,
{\printfield[title]{shorttitle}}\blx@postpunct}
{\printfield{label}}}
% \end{macrocode}
-% \subsubsection{Crossreferences}
+% \subsubsection{Cross references}
% \begin{macrocode}
\DeclareCiteCommand{\bbx@crossref@inbook}%
{}%
@@ -4195,10 +4154,10 @@ hidelinks,
% \end{macrocode}
% We define here the \opt{restoreclassic} option for the \cmd{printbibliography} and \cmd{printbiblist} commands.
% \begin{macrocode}
-\define@key{blx@biblist1}{restoreclassic}[]{}
-\define@key{blx@biblist2}{restoreclassic}[true]{\setkeys{blx@bib2}{restoreclassic}}%
-\define@key{blx@bib1}{restoreclassic}[]{}
-\define@key{blx@bib2}{restoreclassic}[true]{%
+\blx@kv@defkey{blx@biblist1}{restoreclassic}[]{}
+\blx@kv@defkey{blx@biblist2}{restoreclassic}[true]{\blx@kv@setkeys{blx@bib2}{restoreclassic}}%
+\blx@kv@defkey{blx@bib1}{restoreclassic}[]{}
+\blx@kv@defkey{blx@bib2}{restoreclassic}[true]{%
\ifstrequal{#1}{true}{%
\setlength{\bibhang}{\parindent}%
\renewcommand{\labelnamepunct}{\newunitpunct}%
@@ -4388,7 +4347,7 @@ hidelinks,
}%
}%
% \end{macrocode}
-% \subsubsection{Crossreferences}
+% \subsubsection{Cross references}
% \begin{macrocode}
\DeclareCiteCommand{\bbx@crossref@inbook}%
{\renewcommand*{\postsepyear}{\printtext[parens]}}%
@@ -4426,17 +4385,16 @@ hidelinks,
\savefield{annotation}{\@phil@nnote}%
\clearfield{annotation}%
\entryset{\ifnumgreater{\thefield{entrysetcount}}{1}%
- {\setkeys{blx@bib2}{restoreclassic}}{}}{}%
+ {\blx@kv@setkeys{blx@bib2}{restoreclassic}}{}}{}%
\newunit\newblock
\restorefield{annotation}{\@phil@nnote}%
\usebibmacro{pageref}%
\usebibmacro{finentry}}
% \end{macrocode}
-% \iffalse
+% \iffalse
%</modern-bbx>
% \fi
%
-%
% \subsection{\file{philosophy-verbose.cbx}}
%
% \iffalse
@@ -4523,7 +4481,7 @@ hidelinks,
% A new macro to be used in the new \cmd{ccite} command defined below.
% \begin{macrocode}
\newbibmacro*{ccite:cite}{%
- \usebibmacro{related:clearauthors}%
+% \usebibmacro{related:clearauthors}%
\usebibmacro{cite:citepages}%
\global\togglefalse{cbx:fullcite}%
\global\togglefalse{cbx:loccit}%
@@ -4933,7 +4891,7 @@ hidelinks,
% \begin{macrocode}
\DeclareCiteCommand{\fullcite}
{\usebibmacro{prenote}}
- {\setkeys{blx@bib2}{restoreclassic}%
+ {\blx@kv@setkeys{blx@bib2}{restoreclassic}%
\usedriver
{\iftoggle{cbx:scauthorscite}%
{\DeclareNameAlias{sortname}{scdefault}}%
@@ -4946,7 +4904,6 @@ hidelinks,
%</modern-cbx>
% \fi
%
-%
% \subsection{\file{italian-philosophy.lbx}}
%
% \iffalse
@@ -5326,7 +5283,7 @@ hidelinks,
\DeclareBibliographyExtras{%
% \end{macrocode}
-% The \file{french.lbx} localization module redefines \cmd{mkbibnamefamily} in order to get the family name in small caps shape. We do not like this approach because an author could use a localization module without adhering to the typographical standards which should be indipendent from the linguistic standards. For this reason we prefer to reset it to the default definition.
+% The \file{french.lbx} localization module redefines \cmd{mkbibnamefamily} in order to get the family name in small caps. We do not like this approach because an author could use a localization module without adhering to the typographical standards which should be indipendent from the linguistic standards. For this reason we prefer to reset it to the default definition.
% \begin{macrocode}
\protected\def\mkbibnamefamily#1{#1}%
\protected\def\bibrangedash{-\penalty\hyphenpenalty}%
@@ -5366,230 +5323,245 @@ hidelinks,
%
% \iffalse
%<*bib>
-
-@BOOK{Eco:2004,
-annotation = {A guide for typesetting a thesis aimed for Italian students in the humanities.},
-author = {Umberto Eco},
-title = {Come si fa una tesi di laurea},
-subtitle = {Le materie umanistiche},
-publisher = {Bompiani},
-location = {Milano},
-date ={1977}
+@book{Eco:2004,
+ annotation = {A guide for typesetting a thesis aimed for
+ Italian students in the humanities.},
+ author = {Umberto Eco},
+ title = {Come si fa una tesi di laurea},
+ subtitle = {Le materie umanistiche},
+ publisher = {Bompiani},
+ location = {Milano},
+ date = {1977}
}
-@INCOLLECTION{Termini:2007,
- author = {Settimo Termini},
- title = {Vita morte e miracoli di Alan Mathison Turing},
- crossref = {Bartocci:2007},
- date-added = {2009-10-22 14:36:21 +0200},
- date-modified = {2013-03-15 16:53:58 +0100},
- keywords= {esempio},
- langid = {italian},
- annotation = {This entry includes all the informations of the parent \texttt{collection} linked through the \texttt{crossref} field}
+@incollection{Termini:2007,
+ author = {Settimo Termini},
+ title = {Vita morte e miracoli di Alan Mathison Turing},
+ crossref = {Bartocci:2007},
+ keywords = {esempio},
+ langid = {italian},
+ annotation = {This entry includes all the informations
+ of the parent \texttt{collection} linked through
+ the \texttt{crossref} field}
}
-@BOOK{aristotle:ethics,
- title = {Nichomachean Ethics},
- publisher = {J. Hall \& Son},
- author = {Aristotle},
- annotation = {A \texttt{book} entry with a \texttt{translator} field. Note also the \texttt{entrysubtype} field which is set to \texttt{classic}},
- booktitle = {Nichomachean Ethics},
- date = {1872},
+@book{aristotle:ethics,
+ title = {Nichomachean Ethics},
+ publisher = {J. Hall \& Son},
+ author = {Aristotle},
+ annotation = {A \texttt{@book} entry with a \texttt{translator} field.
+ Note also the \texttt{entrysubtype} field which
+ is set to \texttt{classic}},
+ booktitle = {Nichomachean Ethics},
+ date = {1872},
entrysubtype = {classic},
- langid = {american},
- keywords = {esempio},
- location = {London},
- shorttitle = {Nich\adddotspace Ethics},
- translator = {F. A. Paley, F. M.}
+ langid = {american},
+ keywords = {esempio},
+ location = {London},
+ shorttitle = {Nich\adddotspace Ethics},
+ translator = {F. A. Paley, F. M.}
}
-@ONLINE{clawson:mla,
- annote = {\texttt{Biblatex-mla} provides support to Biblatex , BibTeX, and LaTeX for citations and Works. Cited lists in the style established by the Modern Language Association (MLA). For commands and options to change package defaults, see § 3.1 and § 3.2, respectively, below. MLA style, a common standard for writers in the humanities, is outlined in the MLA
- \emph{Style Manual}, in its 3\textsubscript{rd} edition, and the \emph{MLA Handbook for Writers of Research Papers}, now
- in its 8\textsubscript{th} edition. \texttt{Biblatex-mla} follows the style outlined in the latter of these. It also
- follows the logic of the MLA when citing similar material repeatedly, trimming unnecessary
- information from citations where necessary. \texttt{Biblatex-mla} is compatible with \texttt{Biblatex}’s
- support for \texttt{hyperref} and \texttt{tex4ht} , and the main word in each citation (either the author’s
- name, the title, or the page number) serves as a link to the particular entry in the Works
- Cited.},
- author = {James Clawson},
- date = {2010},
- date-added = {2012-04-18 11:51:47 +0200},
- date-modified = {2013-03-13 22:02:08 +0100},
- keywords = {primaria},
- subtitle = {MLA Style Using biblatex},
- title = {\texttt{biblatex-mla}},
- url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-mla/doc/biblatex-mla.pdf},
- version = {0.95}
+@online{clawson:mla,
+ annotation = {\texttt{Biblatex-mla} provides support to \texttt{biblatex},
+ \hologo{BibTeX}, and \LaTeX\ for citations and Works Cited lists in the style
+ established by the Modern Language Association (MLA). For commands
+ and options to change package defaults, see § 3.1 and § 3.2,
+ respectively, below. MLA style, a common standard for writers
+ in the humanities, is outlined in the \emph{MLA Style Manual},
+ in its 3\textsubscript{rd} edition,
+ and the \emph{MLA Handbook for Writers of Research Papers},
+ now in its 8\textsubscript{th} edition. \texttt{Biblatex-mla}
+ follows the style outlined in the latter of these. It also
+ follows the logic of the MLA when citing similar material
+ repeatedly, trimming unnecessary
+ information from citations where necessary. \texttt{Biblatex-mla}
+ is compatible with \texttt{Biblatex}’s
+ support for \texttt{hyperref} and \texttt{tex4ht},
+ and the main word in each citation (either the author’s
+ name, the title, or the page number) serves as a link
+ to the particular entry in the Works Cited.},
+ author = {James Clawson},
+ date = {2016-11-02},
+ keywords = {primaria},
+ subtitle = {MLA Style Using \texttt{Biblatex}},
+ title = {\texttt{biblatex-mla}},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-mla/doc/biblatex-mla.pdf},
+ version = {1.9}
}
-@ONLINE{glibof:historian,
- annote = {The files \texttt{historian.bbx}, \texttt{historian.cbx}, and \texttt{historian.lbx} im-
- plement a bibliography and citation style for use with Philipp Lehman’s
- \texttt{biblatex} package. Historian follows the conventions of \emph{The Chicago
- Manual of Style}, as presented in Turabian’s \emph{Manual for Writers}. The
+@online{glibof:historian,
+ annotation = {The files \texttt{historian.bbx},
+ \texttt{historian.cbx},
+ and \texttt{historian.lbx} implement a bibliography
+ and citation style for use with Philipp Lehman’s
+ \texttt{biblatex} package. \texttt{Historian} follows the conventions of
+ \emph{The Chicago Manual of Style}, as presented in Turabian’s
+ \emph{Manual for Writers}. The
style is designed for use by historians who need to generate detailed
- footnotes not only for ordinary books and articles, but also reprint edi-
- tions, correspondence, archives and archival documents, online sources,
+ footnotes not only for ordinary books and articles, but also reprint
+ editions, correspondence, archives and archival documents, online sources,
book reviews, unpublished manuscripts, and conference presentations.},
- author = {Sander Gliboff},
- date = {2010},
- date-added = {2012-04-18 11:49:37 +0200},
- date-modified = {2013-03-13 23:38:14 +0100},
- langid = {english},
- keywords = {primaria},
- subtitle = {A Footnotes-and-Bibliography Style, Following Turabian/Chicago Guidelines:
- For Use with the Biblatex System of Programmable Bibliographies and
- Citations},
- title = {User's Guide to \texttt{Historian}},
- url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-historian/historian.pdf},
- version = {0.4}
+ author = {Sander Gliboff},
+ date = {2010-08-22},
+ langid = {english},
+ keywords = {primaria},
+ subtitle = {A Footnotes-and-Bibliography Style,
+ Following Turabian/Chicago Guidelines:
+ For Use with the \texttt{Biblatex} System of Programmable
+ Bibliographies and Citations},
+ title = {User's Guide to \texttt{Historian}},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-historian/historian.pdf},
+ version = {0.4}
}
-@BOOK{guzman:sd,
- title = {Problemática logico-lingüística de la comunicacíon social con el
- pueblo Aymara},
- year = {s.d.},
- author = {Guzmán de Rojas, Iván},
- note = {mimeo},
- addendum = {Con los auspicios del Centro internacional de Investigacíones para
- el Desarrollo de Canada},
- annote = {A work without a pubblication date. The string \texttt{nodate} (localized)
- is automatically printed},
- date-added = {2012-04-17 23:48:05 +0200},
- date-modified = {2013-03-15 16:40:38 +0100},
- keywords = {esempio},
- shorttitle = {Problemática}
+@book{guzman:sd,
+ title = {Problemática logico-lingüística de la
+ comunicacíon social con el pueblo Aymara},
+ year = {s.d.},
+ author = {Guzmán de Rojas, Iván},
+ note = {mimeo},
+ addendum = {Con los auspicios del Centro internacional
+ de Investigacíones para el Desarrollo de Canada},
+ annotation = {A work without a pubblication date.
+ The string \texttt{nodate} (localized) is automatically printed},
+ keywords = {esempio},
+ shorttitle = {Problemática}
}
-@BOOK{heidegger:sz,
- title = {Sein und Zeit},
- publisher = {Max Niemeyer Verlag},
- author = {Martin Heidegger},
- edition = {18},
- annote = {Note the \texttt{library} field, use for some details about the first
- edition},
- booktitle = {Sein und Zeit},
- date = {2001},
- date-added = {2012-04-15 18:03:59 +0200},
- date-modified = {2013-03-15 16:41:30 +0100},
- keywords = {esempio,volumesingolo},
- library = {Originally published in 1927 in the \emph{Jahrbuch für Philosophie
- und phänomenologische Forschung (vol. VIII)}, directed by H. Husserl},
- location = {Tübingen}
+@book{heidegger:sz,
+ title = {Sein und Zeit},
+ publisher = {Max Niemeyer Verlag},
+ author = {Martin Heidegger},
+ edition = {18},
+ annotation = {Note the \texttt{library} field, use for some
+ details about the first edition.},
+ booktitle = {Sein und Zeit},
+ date = {2001},
+ keywords = {esempio,volumesingolo},
+ library = {Originally published in 1927 in the
+ \emph{Jahrbuch für Philosophie und phänomenologische
+ Forschung (vol. VIII)}, directed by H. Husserl},
+ location = {Tübingen}
}
-@BOOKINBOOK{kant:kpv:xref,
- author = {Kant, Immanuel},
- date = {1968},
- date-added = {2013-02-25 22:44:19 +0100},
- date-modified = {2013-03-15 19:27:33 +0100},
- keywords = {esempio},
- pages = {1-163},
- shorthand = {KpV},
- shorttitle = {Kritik der praktischen Vernunft},
- title = {Kritik der praktischen Vernunft},
- volume = {5},
- xref = {kant:werke},
- annotation = {A single volume from the critical edition of Kant's (\emph{Kants Werke}). Note the \texttt{xref} field.}
+@bookinbook{kant:kpv:xref,
+ author = {Kant, Immanuel},
+ date = {1968},
+ keywords = {esempio},
+ pages = {1-163},
+ shorthand = {KpV},
+ shorttitle = {Kritik der praktischen Vernunft},
+ title = {Kritik der praktischen Vernunft},
+ volume = {5},
+ xref = {kant:werke},
+ annotation = {A single volume from the critical edition
+ of Kant's (\emph{Kants Werke}). Note the \texttt{xref} field.}
}
-@BOOKINBOOK{kant:ku:xref,
- author = {Kant, Immanuel},
- date = {1968},
- date-added = {2013-02-28 09:42:34 +0100},
- date-modified = {2013-03-15 19:27:38 +0100},
- langid = {german},
- keywords = {esempio},
- pages = {165-485},
- title = {Kritik der Urtheilskraft},
- volume = {5},
- xref = {kant:werke},
- annotation = {A single volume from the critical edition of Kant's (\emph{Kants Werke}). Note the \texttt{xref} field.}
+@bookinbook{kant:ku:xref,
+ author = {Kant, Immanuel},
+ date = {1968},
+ langid = {german},
+ keywords = {esempio},
+ pages = {165-485},
+ title = {Kritik der Urtheilskraft},
+ volume = {5},
+ xref = {kant:werke},
+ annotation = {A single volume from the critical edition
+ of Kant's (\emph{Kants Werke}). Note the \texttt{xref} field.}
}
@mvbook{kant:werke,
- author = {Kant, Immanuel},
- booktitle = {Kants Werke. Akademie Textausgabe},
- date = {1968},
- date-added = {2010-03-06 00:26:39 +0100},
- date-modified = {2013-03-15 14:01:45 +0100},
- langid = {german},
- keywords = {esempio},
- location = {Berlin},
- maintitle = {Kants Werke. Akademie Textausgabe},
- publisher = {Walter de Gruyter},
- shorthand = {KW},
- title = {Kants Werke. Akademie Textausgabe},
- volumes = {9}
+ author = {Kant, Immanuel},
+ booktitle = {Kants Werke. Akademie Textausgabe},
+ date = {1968},
+ langid = {german},
+ keywords = {esempio},
+ location = {Berlin},
+ maintitle = {Kants Werke. Akademie Textausgabe},
+ publisher = {Walter de Gruyter},
+ shorthand = {KW},
+ title = {Kants Werke. Akademie Textausgabe},
+ volumes = {9}
}
@mvbook{comenio:oo,
- annote = {This author is known with his Latin name, given in the \texttt{nameaddon}
- field},
- author = {Jan Amos Komensky},
- booktitle = {Opera Omnia},
- date = {1969},
- date-added = {2012-04-19 20:20:03 +0200},
- date-modified = {2013-03-15 16:32:24 +0100},
- keywords = {esempio},
- location = {Praga},
- nameaddon = {Comenius},
- title = {Opera Omnia}
+ annotation = {This author is known with his Latin name,
+ given in the \texttt{nameaddon} field.},
+ author = {Jan Amos Komensky},
+ booktitle = {Opera Omnia},
+ date = {1969},
+ keywords = {esempio},
+ location = {Praga},
+ nameaddon = {Comenius},
+ title = {Opera Omnia}
}
-@ONLINE{kime:biber,
- annotation = {Biber is conceptually a Bib\TeX{} replacement for Biblatex. It is written in Perl
- with the aim of providing a customised and sophisticated data preparation backend
- for Biblatex. You do not need to install Perl to use Biber—binaries are provided
- for many operating systems via the main \TeX{} distributions (\TeX Live, Mac\TeX,
- MiK\TeX) and also via download from SourceForge. Functionally, Biber offers a
- superset of Bib\TeX’s capabilities but is tightly coupled with Biblatex and cannot
- be used as a stand-alone tool with standard .bst styles. Biber’s primary role is to
- support Biblatex by performing the following tasks:
+@online{kime:biber,
+ annotation = {Biber is conceptually a \hologo{BibTeX} replacement for
+ \texttt{biblatex}.
+ It is written in Perl with the aim of providing a customised
+ and sophisticated data preparation backend
+ for \texttt{biblatex}. You do not need to install Perl to use
+ Biber---binaries are provided
+ for many operating systems via the main \TeX{} distributions (\TeX~Live,
+ Mac\TeX, MiK\TeX) and also via download from SourceForge.
+ Functionally, Biber offers a superset of \hologo{BibTeX}’s capabilities
+ but is tightly coupled with \texttt{biblatex} and cannot
+ be used as a stand-alone tool with standard \texttt{.bst} styles.
+ Biber’s primary role is to
+ support \texttt{biblatex} by performing the following tasks:
Parsing data from datasources;
Processing cross-references, entry sets, related entries;
Generating data for name, name list and name/year disambiguation;
- Structural validation according to Biblatex data model;
+ Structural validation according to \texttt{biblatex} data model;
Sorting reference lists;
- Outputting data to a .bbl for Biblatex to consume},
- author = {Philip Kime and François Charette},
- title = {\texttt{biber}},
- subtitle = {A backend bibliography processor for biblatex},
- date = {2016-05-12},
- langid = {english},
- keywords = {primaria},
- url = {http://biblatex-biber.sourceforge.net},
- version = {2.7}
+ Outputting data to a \texttt{.bbl} for \texttt{biblatex} to consume.},
+ author = {Philip Kime and François Charette},
+ title = {\texttt{biber}},
+ subtitle = {A backend bibliography processor for \texttt{biblatex}},
+ date = {2019-12-01},
+ langid = {english},
+ keywords = {primaria},
+ url = {http://biblatex-biber.sourceforge.net},
+ version = {2.14}
}
-@ONLINE{lehman:biblatex,
- annote = {This package provides advanced bibliographic facilities for use with \LaTeX. The
- package is a complete reimplementation of the bibliographic facilities provided by
- \LaTeX. The biblatex package works with the “backend” (program) biber, which
- is used to process Bib\TeX{} format data files and them performs all sorting, label
- generation (and a great deal more). Formatting of the bibliography is entirely con-
- trolled by \TeX{} macros. Good working knowledge in \LaTeX{} should be sufficient to
- design new bibliography and citation styles. This package also supports subdivided
- bibliographies, multiple bibliographies within one document, and separate lists of
- bibliographic information such as abbreviations of various fields. Bibliographies may
- be subdivided into parts and/or segmented by topics. Just like the bibliography styles,
- all citation commands may be freely defined. Features such as full Unicode support
- for bibliography data, customisable sorting, multiple bibliographies with different
- sorting, customisable labels and dynamic data modification are available},
- author = {Philipp Lehman},
- nameaddon = {with Philip Kime, Audrey Boruvka and Joseph Wright},
- date = {2016-11-16},
- langid = {english},
- keywords = {primaria},
- subtitle = {Programmable Bibliographies and Citations},
- title = {The \texttt{biblatex} Package},
- url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf},
- version = {3.7}
+@online{lehman:biblatex,
+ annotation = {This package provides advanced bibliographic facilities
+ for use with \LaTeX. The package is a complete reimplementation
+ of the bibliographic facilities provided by
+ \LaTeX. The \texttt{biblatex} package works with the “backend”
+ (program) \texttt{biber}, which is used to process \hologo{BibTeX} format
+ data files and them performs all sorting, label
+ generation (and a great deal more). Formatting of the bibliography
+ is entirely controlled by \TeX{} macros. Good working knowledge
+ in \LaTeX{} should be sufficient to
+ design new bibliography and citation styles. This package
+ also supports subdivided bibliographies, multiple bibliographies
+ within one document, and separate lists of bibliographic information
+ such as abbreviations of various fields. Bibliographies may
+ be subdivided into parts and/or segmented by topics.
+ Just like the bibliography styles,
+ all citation commands may be freely defined. Features such as
+ full Unicode support for bibliography data, customisable sorting,
+ multiple bibliographies with different
+ sorting, customisable labels and dynamic data
+ modification are available.},
+ author = {Philipp Lehman},
+ nameaddon = {with Philip Kime and Moritz Wemheuer},
+ date = {2019-12-01},
+ langid = {english},
+ keywords = {primaria},
+ subtitle = {Programmable Bibliographies and Citations},
+ title = {The \texttt{biblatex} Package},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf},
+ version = {3.14}
}
-@ONLINE{babel,
- annote = {This manual describes babel, a package that makes
+@online{babel,
+ annotation = {This manual describes \texttt{babel}, a package that makes
use of the capabilities of \TeX{} version 3 and, to some
extent, \texttt{xetex} and \texttt{luatex}, to provide an environment
in which documents can be typeset in a language
@@ -5597,272 +5569,270 @@ date ={1977}
or script. However, no attempt has been done to take full
advantage of the features provided by the latter,
which would require a completely new core (as for
- example polyglossia or as part of \LaTeX 3)},
- author = {Johannes L. Braams},
- date = {2016-04-23},
- langid = {english},
- keywords = {primaria},
- title = {Babel},
- url = {http://mirrors.ctan.org/macros/latex/contrib/babel/babel.pdf},
- version = {3.9r}
+ example \texttt{polyglossia} or as part of \hologo{LaTeX3})},
+ author = {Johannes L. Braams},
+ nameaddon = {with Javer Bezos},
+ date = {2020-02-28},
+ langid = {english},
+ keywords = {primaria},
+ title = {Babel},
+ subtitle = {Localization and internationalization},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/babel/babel.pdf},
+ version = {3.41}
}
-@ONLINE{polyglossia,
- annote = {Polyglossia is a package for facilitating multilingual typesetting with Xe\LaTeX{} and
- (at an early stage) Lua\LaTeX. Basically, it can be used as an alternative to babel
+@online{polyglossia,
+ annotation = {\texttt{Polyglossia} is a package for facilitating multilingual
+ typesetting with \hologo{XeLaTeX} and
+ (with some exceptions) \hologo{LuaLaTeX}. Basically, it can be used as
+ an alternative to \texttt{babel}
for performing the following tasks automatically:
1. Loading the appropriate hyphenation patterns.
2. Setting the script and language tags of the current font (if possible and
- available), via the package fontspec.
+ available), via the package \texttt{fontspec}.
3. Switching to a font assigned by the user to a particular script or language.
4. Adjusting some typographical conventions according to the current lan-
- guage (such as afterindent, frenchindent, spaces before or after punctu-
- ation marks, etc.).
+ guage (such as afterindent, frenchindent, spaces before or after
+ punctuation marks, etc.).
5. Redefining all document strings (like “chapter”, “figure”, “bibliography”).
6. Adapting the formatting of dates (for non-Gregorian calendars via external
- packages bundled with polyglossia: currently the Hebrew, Islamic and
+ packages bundled with \texttt{polyglossia}: currently the Hebrew, Islamic and
Farsi calendars are supported).
7. For languages that have their own numbering system, modifying the
formatting of numbers appropriately (this also includes redefining the al-
phabetic sequence for non-Latin alphabets).
8. Ensuring proper directionality if the document contains languages that are
- written from right to left (via the package bidi, available separately).},
- author = {François Charette},
- date = {2015-03-25},
- langid = {english},
- keywords = {primaria},
- title = {Polyglossia: An Alternative to Babel for Xe\LaTeX{} and Lua\LaTeX},
- url = {http://mirrors.ctan.org/macros/latex/contrib/babel/babel.pdf},
- version = {1.42.4}
+ written from right to left (via the package \texttt{bidi}, available separately).},
+ author = {François Charette},
+ nameaddon = {with Arthur Reutenauer, Bastien Roucariès and Jürgen Spitzmüller},
+ date = {2020-01-29},
+ langid = {english},
+ keywords = {primaria},
+ title = {Polyglossia: Modern multilingual typesetting with \hologo{XeLaTeX} and \hologo{LuaLaTeX}},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/babel/babel.pdf},
+ version = {1.47}
}
-@ONLINE{csquotes,
- annote = {This package provides advanced facilities for inline and display quotations. It is
- designed for a wide range of tasks ranging from the most simple applications to
- the more complex demands of formal quotations. The facilities include commands,
- environments, and user-definable ‘smart quotes’ which dynamically adjust to their
- context. Quotation marks are switched automatically if quotations are nested and
- can adjust to the current language. There are additional features designed to cope
- with the more specific demands of academic writing. All quote styles as well as the
- optional active quotes are freely configurable},
- author = {Philipp Lehman and Joseph Wright},
- date = {2017-02-03},
- langid = {english},
+@online{csquotes,
+ annotation = {This package provides advanced facilities for inline
+ and display quotations. It is designed for a wide range of
+ tasks ranging from the most simple applications to
+ the more complex demands of formal quotations. The facilities
+ include commands, environments, and user-definable ‘smart quotes’
+ which dynamically adjust to their
+ context. Quotation marks are switched automatically
+ if quotations are nested and
+ can adjust to the current language. There are additional
+ features designed to cope
+ with the more specific demands of academic writing.
+ All quote styles as well as the
+ optional active quotes are freely configurable.},
+ author = {Philipp Lehman and Joseph Wright},
+ date = {2019-12-06},
+ langid = {english},
keywords = {primaria},
subtitle = {Context Sensitive Quotation Facilities},
- title = {The \texttt{csquotes} Package},
- url = {http://mirrors.ctan.org/macros/latex/contrib/csquotes/csquotes.pdf},
- version = {5.2a}
+ title = {The \texttt{csquotes} Package},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/csquotes/csquotes.pdf},
+ version = {5.2j}
}
-@BOOK{pantieri:artelatex,
- title = {L'arte di scrivere con \LaTeX},
- author = {Lorenzo Pantieri and Tommaso Gordini},
- annote = {Lo scopo di questo lavoro, rivolto sia a chi muove i primi passiin \LaTeX{} sia a quanti già lo conoscono, è di offrire ai suoi utenti italiani le conoscenze essenziali per poterlo usare con successo. I concetti fondamentali della materia, raccolti da svariati manuali, vengono presentati nel modo più chiaro e organico possibile; nel contempo si fornisce un vasto campionario di esempi e si analizzano alcuni tipici problemi che potrebbero presentarsi nella redazione di una pubblicazione scientifica o professionale in italiano, indicando per ciascuno le soluzioni per noi migliori.},
- booktitle = {L'arte di scrivere con \LaTeX},
- date = {2011},
- date-added = {2010-03-06 00:26:39 +0100},
- date-modified = {2013-03-13 22:04:30 +0100},
- foreword = {Enrico Gregorio},
- langid = {italian},
- keywords = {primaria},
- subtitle = {Un'introduzione a \LaTeX},
- url = {http://www.lorenzopantieri.net/LaTeX_files/ArteLaTeX.pdf}
+@book{pantieri:artelatex,
+ title = {L'arte di scrivere con \LaTeX},
+ author = {Lorenzo Pantieri and Tommaso Gordini},
+ annotation = {Lo scopo di questo lavoro, rivolto sia a chi muove
+ i primi passi in \LaTeX\ sia a quanti già lo conoscono,
+ è di offrire ai suoi utenti italiani le conoscenze essenziali
+ per poterlo usare con successo. I concetti fondamentali
+ della materia, raccolti da svariati manuali, vengono presentati
+ nel modo più chiaro e organico possibile; nel contempo si fornisce
+ un vasto campionario di esempi e si analizzano alcuni
+ tipici problemi che potrebbero presentarsi nella redazione
+ di una pubblicazione scientifica o professionale in italiano,
+ indicando per ciascuno le soluzioni per noi migliori.},
+ booktitle = {L'arte di scrivere con \LaTeX},
+ date = {2019},
+ foreword = {Enrico Gregorio},
+ langid = {italian},
+ keywords = {primaria},
+ subtitle = {Un'introduzione a \LaTeX},
+ url = {http://www.lorenzopantieri.net/LaTeX_files/ArteLaTeX.pdf}
}
-@BOOK{Poincare:1968-ITA,
- title = {La scienza e l'ipotesi},
- publisher = {Bompiani},
- author = {Jules-Henri Poincaré},
- editor = {Corrado Sinigaglia},
- note = {testo greco a fronte},
- booktitle = {La science et l'hypothèse},
- date = {2003},
- date-modified = {2013-03-15 19:07:03 +0100},
- langid = {italian},
- keywords = {esempio},
- location = {Milano}
+@book{Poincare:1968-ITA,
+ title = {La scienza e l'ipotesi},
+ publisher = {Bompiani},
+ author = {Jules-Henri Poincaré},
+ editor = {Corrado Sinigaglia},
+ note = {testo greco a fronte},
+ booktitle = {La science et l'hypothèse},
+ date = {2003},
+ langid = {italian},
+ keywords = {esempio},
+ location = {Milano}
}
-@BOOK{Poincare:1968-ORIG,
- title = {La science et l'hypothèse},
- publisher = {Flammarion},
- author = {Jules-Henri Poincaré},
- annote = {A book entry followed by its translation, cross-referenced in the
- \texttt{related} field},
- booktitle = {La science et l'hypothèse},
- date = {1968},
- date-added = {2010-03-05 16:18:11 +0100},
- date-modified = {2013-03-15 19:07:49 +0100},
- langid = {french},
- keywords = {esempio},
- location = {Paris},
- related = {Poincare:1968-ITA}
+@book{Poincare:1968-ORIG,
+ title = {La science et l'hypothèse},
+ publisher = {Flammarion},
+ author = {Jules-Henri Poincaré},
+ annotation = {A \texttt{@book} entry followed by its translation, cross-referenced in the
+ \texttt{related} field},
+ booktitle = {La science et l'hypothèse},
+ date = {1968},
+ langid = {french},
+ keywords = {esempio},
+ location = {Paris},
+ related = {Poincare:1968-ITA}
}
-@BOOK{popper-logik,
- title = {Logik der Forschung},
- publisher = {Springer},
- author = {Karl R. Popper},
- annote = {A book entry followed by two differents translations, cross-referenced
- in the \texttt{related} (biber 1.6 required)},
- booktitle = {Logik der Forschung},
- date = {1934},
- date-added = {2013-03-01 17:50:26 +0100},
- date-modified = {2013-03-15 16:46:51 +0100},
- keywords = {esempio},
- location = {Wien},
- related = {popper-logik:ing},
- timestamp = {2012.04.25}
+@book{popper-logik,
+ title = {Logik der Forschung},
+ publisher = {Springer},
+ author = {Karl R. Popper},
+ annotation = {A \texttt{@book} entry followed by two differents translations,
+ cross-referenced in the \texttt{related} (Biber 1.6 required)},
+ booktitle = {Logik der Forschung},
+ date = {1934},
+ keywords = {esempio},
+ location = {Wien},
+ related = {popper-logik:ing},
+ timestamp = {2012.04.25}
}
-@BOOK{popper-logik:ing,
- title = {The Logic of Scientific Discovery},
- publisher = {Hutchinson},
- author = {Karl R. Popper},
- edition = {3},
- booktitle = {The Logic of Scientific Discovery},
- date = {1959},
- date-added = {2013-03-01 17:55:40 +0100},
- date-modified = {2013-03-15 16:48:11 +0100},
- keywords = {esempio,popper},
- location = {London},
- related = {popper-logik:ita},
- relatedstring={it. trans.},
- timestamp = {2012.04.25}
+@book{popper-logik:ing,
+ title = {The Logic of Scientific Discovery},
+ publisher = {Hutchinson},
+ author = {Karl R. Popper},
+ edition = {3},
+ booktitle = {The Logic of Scientific Discovery},
+ date = {1959},
+ keywords = {esempio,popper},
+ location = {London},
+ related = {popper-logik:ita},
+ relatedstring = {it. trans.},
+ timestamp = {2012.04.25}
}
-@BOOK{popper-logik:ita,
- title = {Logica della scoperta scientifica},
- publisher = {Einaudi},
- author = {Karl R. Popper},
- edition = {3},
- date = {1998},
- date-added = {2013-03-01 17:50:46 +0100},
- date-modified = {2013-03-15 16:48:21 +0100},
- hyphenation = {italian},
- keywords = {esempio,popper},
- location = {Torino},
- timestamp = {2012.04.25}
+@book{popper-logik:ita,
+ title = {Logica della scoperta scientifica},
+ publisher = {Einaudi},
+ author = {Karl R. Popper},
+ edition = {3},
+ date = {1998},
+ hyphenation = {italian},
+ keywords = {esempio,popper},
+ location = {Torino},
+ timestamp = {2012.04.25}
}
-@INCOLLECTION{Valbusa:2007,
- author = {Ivan Valbusa},
- title = {Psicologia e sistema in Alsted e in Wolff},
- booktitle = {Christian Wolff tra psicologia empirica e psicologia razionale},
- publisher = {Georg Olms Verlag},
- editor = {Ferdinando Luigi Marcolungo},
- date = {2007},
- date-added = {2009-09-27 23:17:07 +0200},
- date-modified = {2009-10-13 13:16:37 +0200},
- langid = {italian},
- keywords = {esempio},
- location = {Hildesheim and Zürich and London}
+@incollection{Valbusa:2007,
+ author = {Ivan Valbusa},
+ title = {Psicologia e sistema in Alsted e in Wolff},
+ booktitle = {Christian Wolff tra psicologia empirica
+ e psicologia razionale},
+ publisher = {Georg Olms Verlag},
+ editor = {Ferdinando Luigi Marcolungo},
+ date = {2007},
+ langid = {italian},
+ keywords = {esempio},
+ location = {Hildesheim and Zürich and London}
}
-@ONLINE{wassenhoven:dw,
- annote = {A small collection of styles for the biblatex package.
- It was designed for citations in the Humanities and offers some features
- that are not provided by the standard biblatex styles. biblatex-dw
- is dependent on biblatex – version 1.7 needs at least version 3.3
- of biblatex and was tested with biblatex version 3.6 and biber version 2.6.},
- author = {Dominik Waßenhoven},
- date = {2011},
- date-added = {2013-03-13 21:58:04 +0100},
- date-modified = {2013-03-13 22:05:36 +0100},
- keywords = {primaria},
- title = {\texttt{biblatex-dw}},
- url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-dw/doc/biblatex-dw.pdf},
- version = {1.4}
+@online{wassenhoven:dw,
+ annotation = {\texttt{biblatex-dw} is a small collection
+ of styles for the \texttt{biblatex} package.
+ It was designed for citations in the Humanities and offers some features
+ that are not provided by the standard \texttt{biblatex} styles.
+ \texttt{biblatex-dw} is dependent on \texttt{biblatex} – version 1.7
+ needs at least version 3.3
+ of \texttt{biblatex} and was tested with \texttt{biblatex}
+ version 3.6 and \texttt{biber} version 2.6.},
+ author = {Dominik Waßenhoven},
+ date = {2016-12-06},
+ keywords = {primaria},
+ title = {\texttt{biblatex-dw}},
+ url = {http://mirrors.ctan.org/macros/latex/contrib/biblatex-contrib/biblatex-dw/doc/biblatex-dw.pdf},
+ version = {1.7}
}
-@COLLECTION{Bartocci:2007,
- annote = {A collection with four authors},
+@collection{Bartocci:2007,
+ annotation = {A collection with four authors},
booksubtitle = {Protagonisti del '900 da Hilbert a Wiles},
- booktitle = {Vite matematiche},
- date = {2007},
- editor = {Claudio Bartocci and Renato Betti and Angelo Guerraggio and Roberto
- Lucchetti},
- langid = {italian},
- location = {Milano},
- publisher = {Springer-Verlag Italia},
- title = {Vite matematiche}
+ booktitle = {Vite matematiche},
+ date = {2007},
+ editor = {Claudio Bartocci and Renato Betti and
+ Angelo Guerraggio and Roberto Lucchetti},
+ langid = {italian},
+ location = {Milano},
+ publisher = {Springer-Verlag Italia},
+ title = {Vite matematiche}
}
-
-@COLLECTION{Filmed:2009,
- annote = {A collection with four editors. The list is automatically truncated
- in the citations},
- booktitle = {Filosofia delle medicina},
- date = {2009},
- date-added = {2009-09-27 23:05:08 +0200},
- date-modified = {2013-03-15 16:37:44 +0100},
- editor = {Pierdaniele Giaretta and Antonio Moretto and Gian Franco Gensini
- and Marco Trabucchi},
- langid = {italian},
- keywords = {esempio},
- location = {Bologna},
- publisher = {il Mulino},
- subtitle = {Metodo, modelli, cura ed errori},
- title = {Filosofia delle medicina},
- volumes = {2}
+@collection{Filmed:2009,
+ annotation = {A collection with four editors. The list
+ is automatically truncated in the citations},
+ booktitle = {Filosofia delle medicina},
+ date = {2009},
+ editor = {Pierdaniele Giaretta and Antonio Moretto
+ and Gian Franco Gensini and Marco Trabucchi},
+ langid = {italian},
+ keywords = {esempio},
+ location = {Bologna},
+ publisher = {il Mulino},
+ subtitle = {Metodo, modelli, cura ed errori},
+ title = {Filosofia delle medicina},
+ volumes = {2}
}
-@INCOLLECTION{corrocher:2009,
- author = {Roberto Corrocher},
- title = {Riflessioni sull'uomo di fronte a nuove sfide},
- pages = {27-42},
- annote = {An \texttt{@incollection} entry. The \texttt{@collection} is automatically
- printed in the bibliography because another \texttt{@incollection}
- has been cited},
- crossref = {Filmed:2009},
- date-added = {2010-03-06 00:26:39 +0100},
- date-modified = {2013-03-15 16:33:22 +0100},
- langid = {italian},
- keywords = {esempio},
- read = {0}
+@incollection{corrocher:2009,
+ author = {Roberto Corrocher},
+ title = {Riflessioni sull'uomo di fronte a nuove sfide},
+ pages = {27-42},
+ annotation = {An \texttt{@incollection} entry.
+ The \texttt{@collection} is automatically
+ printed in the bibliography because
+ another \texttt{@incollection} has been cited.},
+ crossref = {Filmed:2009},
+ langid = {italian},
+ keywords = {esempio},
+ read = {0}
}
-@INCOLLECTION{federspil:2009,
- author = {Giovanni Federspil and Roberto Vettor},
- title = {Medicina: un unico metodo e una sola argomentazione?},
- pages = {43-74},
- annote = {An \texttt{@incollection} entry. The \texttt{@collection} is automatically
- printed in the bibliography because another \texttt{@incollection}
- has been cited},
- crossref = {Filmed:2009},
- date-added = {2010-03-06 00:26:39 +0100},
- date-modified = {2013-03-15 16:37:35 +0100},
- langid = {italian},
- keywords = {esempio}
+@incollection{federspil:2009,
+ author = {Giovanni Federspil and Roberto Vettor},
+ title = {Medicina: un unico metodo e una sola argomentazione?},
+ pages = {43-74},
+ annotation = {An \texttt{@incollection} entry. The \texttt{@collection}
+ is automatically printed in the bibliography because
+ another \texttt{@incollection} has been cited.},
+ crossref = {Filmed:2009},
+ langid = {italian},
+ keywords = {esempio}
}
-@ONLINE{ctan,
- annotation = {The official web site of the Comprehensive \TeX{} Archive Network},
- bdsk-url-1 = {http://www.ctan.org},
- date = {2006},
- date-added = {2011-06-02 17:33:32 +0200},
- date-modified = {2013-03-15 16:35:26 +0100},
- langid = {american},
- keywords = {web},
- label = {CTAN},
- subtitle = {The Comprehensive TeX Archive Network},
- title = {CTAN},
- url = {http://www.ctan.org},
- urldate = {2006-10-01}
+@online{ctan,
+ annotation = {The official website of the Comprehensive \TeX\ Archive Network},
+ bdsk-url-1 = {http://www.ctan.org},
+ date = {2006},
+ langid = {american},
+ keywords = {web},
+ label = {CTAN},
+ subtitle = {The Comprehensive \TeX\ Archive Network},
+ title = {CTAN},
+ url = {http://www.ctan.org},
+ urldate = {2006-10-01}
}
-@ONLINE{guit:sito,
- annotation = {The official web site of the Italian TeX Group},
- bdsk-url-1 = {http://www.guitex.org},
- date = {2012},
- date-added = {2012-04-21 16:52:51 +0200},
- date-modified = {2013-03-15 16:40:18 +0100},
- langid = {italian},
- keywords = {web},
- title = {GuIT. Gruppo degli Utilizzatori Italiani di \TeX},
- url = {http://www.guitex.org},
- urldate = {2012-01-15}
+@online{guit:sito,
+ annotation = {The official website of the Italian \TeX\ Group},
+ bdsk-url-1 = {http://www.guitex.org},
+ date = {2012},
+ langid = {italian},
+ keywords = {web},
+ title = {\GuIT. Gruppo degli Utilizzatori Italiani di \TeX},
+ url = {http://www.guitex.org},
+ urldate = {2012-01-15}
}
%</bib>
% \fi
diff --git a/Master/texmf-dist/source/latex/biblatex-software/Makefile b/Master/texmf-dist/source/latex/biblatex-software/Makefile
new file mode 100644
index 00000000000..1b75b6374df
--- /dev/null
+++ b/Master/texmf-dist/source/latex/biblatex-software/Makefile
@@ -0,0 +1,64 @@
+TEXS = $(wildcard *.tex)
+MAIN = sample-use-sty
+
+.SILENT: distrib all
+
+
+all: $(MAIN).pdf software-biblatex.pdf
+
+biblatex-styles: stublist mkbiblatexstubs.sh
+ bash mkbiblatexstubs.sh < stublist
+
+biblio.bib: ../swentry.org
+ ../bin/extract-bibtex.pl < $< > $@
+
+swentries.tex: ../swentry.org
+ ../bin/export-org-to-latex $<
+ ../bin/extract-entries.pl < ../swentry.tex > $@
+
+software-biblatex.pdf: software-biblatex.tex swentries.tex history.tex biblio.bib manual.bib
+ pdflatex software-biblatex.tex
+ bibtex software-biblatex
+ pdflatex software-biblatex.tex
+ pdflatex software-biblatex.tex
+
+sample-use-sty.pdf: biblio.bib sample-content.tex
+
+sample-use-sty.backref.pdf: biblio.bib biblio.bib sample-content.tex
+ # test that backrefs work
+ pdflatex "\PassOptionsToPackage{backref=true}{biblatex} \input{sample-use-sty.backref.tex}"
+ biber sample-use-sty.backref
+ pdflatex "\PassOptionsToPackage{backref=true}{biblatex} \input{sample-use-sty.backref.tex}"
+
+history.tex:
+ git for-each-ref --format="\begin{release}{%(refname:short)}{%(taggerdate:short)} \item %(subject) \end{release}" refs/tags | grep bltx | tac > history.tex
+
+sample.tex : biblio.bib biblatex-styles
+
+%.pdf: %.tex
+ifeq (, $(shell PATH=$(PATH) which rubber))
+ echo "No rubber in $(PATH), falling back to basic pdflatex calls"
+ pdflatex $<
+ biber $*
+ pdflatex $<
+else
+ rubber -m pdftex $<
+endif
+
+
+distrib:
+ # remind maintainer to update version number in the documentation
+ echo -n "Did you update the version number in software-biblatex.tex? [y/N]"
+ read ans; if [ ".$$ans" != ".y" ]; then echo "Please update it and run make distrib again"; exit 1; fi
+ # update history
+ rm history.tex
+ make software-biblatex.pdf
+ tar --transform 's,^\(.\),biblatex-software/\1,' -czhvf biblatex-software.tar.gz `git ls-files`
+
+clean: $(patsubst %,%/clean,$(TEXS))
+ rm -f *+sw.bbx *+sw.dbx *+sw.cbx *+sw.lbx *~
+
+%/clean:
+ if [ -f $* ]; then rubber -m pdftex --clean $* ; fi
+
+distclean: clean
diff --git a/Master/texmf-dist/source/latex/bibleref/bibleref.dtx b/Master/texmf-dist/source/latex/bibleref/bibleref.dtx
index 0802fcf73ba..1eb50d80043 100644
--- a/Master/texmf-dist/source/latex/bibleref/bibleref.dtx
+++ b/Master/texmf-dist/source/latex/bibleref/bibleref.dtx
@@ -220,9 +220,9 @@
%Note that \meta{name} must be the full name, not the
%abbreviated name of the book. For example, to change
%Revelation to Apoc, do
-%\verb|\setbookname{Revelation}{Apoc}|
+%\verb|\setbooktitle{Revelation}{Apoc}|
%(\textbf{Note} that you shouldn't do
-%\verb|\setbookname{Rev}{Apoc}|)
+%\verb|\setbooktitle{Rev}{Apoc}|)
%
%If you want a different title for a book depending on whether it's
%in the main body of the document or in the index, you can set the
@@ -309,6 +309,12 @@
%This is similar to \cs{ibiblechvs} except that it only displays the
%verse(s) in the text.
%
+%\begin{definition}[\DescribeMacro{\ibible}]
+%\cs{ibible}\oarg{format}\marg{book title}\texttt(\marg{chapter}\texttt{:}\meta{verse(s)}\texttt)
+%\end{definition}
+%This is similar to \cs{ibiblech} except that it does not display the
+%anything in the text.
+%
%You may need to create your own custom \app{makeindex} style file
%as the default uses a comma and space to separate the item from
%the page number, which may cause confusion. For example, you
@@ -1008,7 +1014,7 @@
% Declare package
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{bibleref}[2019/12/10 1.24 (NLCT and MR)]
+\ProvidesPackage{bibleref}[2020/06/22 1.25 (NLCT and MR)]
% \end{macrocode}
% Need to do some conditional stuff
% \begin{macrocode}
@@ -1604,6 +1610,7 @@
\newcommand*\br@Wis{\br@Wisdom}%
\newcommand*\br@Wisd{\br@Wisdom}%
\newcommand*\br@Ecclus{\br@Ecclesiasticus}%
+\newcommand*\br@Sir{\br@Ecclesiasticus}%
\newcommand*\br@Isa{\br@Isaiah}%
\newcommand*\br@Jer{\br@Jeremiah}%
\newcommand*\br@Lam{\br@Lamentations}%
@@ -2668,6 +2675,36 @@ defined}{}}}
% \end{macrocode}
%\end{macro}
%
+% \begin{macro}{\ibible}
+%\changes{1.25}{2020/06/22}{new}
+% Only displays verse(s) but indexes under the book and chapters.
+% \begin{macrocode}
+\newcommand*{\ibible}[1][\bvidxpgformat]{%
+ \let\@bv@current@titlestyle\BRbooktitlestyle
+ \let\@bv@current@chapterstyle\BRchapterstyle
+ \let\@bv@current@versestyle\BRversestyle% added on analogy with previous line
+ \let\@bv@current@bkchsep\BRbkchsep
+ \let\@bv@current@chvsep\BRchvsep
+ \let\@bv@current@vrsep\BRvrsep% add me, too!
+ \def\@bv@restore{%
+ \let\BRbooktitlestyle\@bv@current@titlestyle
+ \let\BRchapterstyle\@bv@current@chapterstyle
+ \let\BRversestyle\@bv@current@versestyle% added on analogy with previous line
+ \let\BRbkchsep\@bv@current@bkchsep
+ \let\BRchvsep\@bv@current@chvsep
+ \let\BRvrsep\@bv@current@vrsep% add me, too!
+ }%
+ \def\BRbooktitlestyle##1{}%
+ \def\BRchapterstyle##1{}%
+ \def\BRversestyle##1{}% added on analogy with previous line
+ \def\BRbkchsep{}%
+ \def\BRchvsep{}%
+ \def\BRvrsep{}% add me, too!
+ \def\@bv@idxpgformat{#1}%
+ \@bv@idxtrue\def\@bv@idxentry{}\@bible@verse
+}
+% \end{macrocode}
+% \end{macro}
%\begin{macro}{\bvidxpgformat}
% Default page number format for bible verse index entries
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/bithesis/bithesis.dtx b/Master/texmf-dist/source/latex/bithesis/bithesis.dtx
new file mode 100644
index 00000000000..db84b03eed2
--- /dev/null
+++ b/Master/texmf-dist/source/latex/bithesis/bithesis.dtx
@@ -0,0 +1,807 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2021
+% Association of Bit Network Pioneer and any individual authors listed elsewhere in this file.
+% -----------------------------------
+%
+% This file 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:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2020/11/27 or later.
+%
+% \fi
+%
+% \iffalse
+%<cls>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<book>\ProvidesClass{bitbook}
+%<article>\ProvidesClass{bitart}
+%<cls> [2021/01/06 v1.0.1 BIT Thesis Templates]
+%
+%<*driver>
+\ProvidesFile{bithesis.dtx}[2021/01/06 1.0.1 BIT Thesis Templates]
+\documentclass{ltxdoc}
+\usepackage{dtx-style}
+
+\EnableCrossrefs
+\CodelineIndex
+
+\RecordChanges
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \DoNotIndex{\newenvironment,\@bsphack,\@empty,\@esphack,\sfcode}
+% \DoNotIndex{\addtocounter,\label,\let,\linewidth,\newcounter}
+% \DoNotIndex{\noindent,\normalfont,\par,\parskip,\phantomsection}
+% \DoNotIndex{\providecommand,\ProvidesPackage,\refstepcounter}
+% \DoNotIndex{\RequirePackage,\setcounter,\setlength,\string,\strut}
+% \DoNotIndex{\textbackslash,\texttt,\ttfamily,\usepackage}
+% \DoNotIndex{\begin,\end,\begingroup,\endgroup,\par,\\}
+% \DoNotIndex{\if,\ifx,\ifdim,\ifnum,\ifcase,\else,\or,\fi}
+% \DoNotIndex{\let,\def,\xdef,\edef,\newcommand,\renewcommand}
+% \DoNotIndex{\expandafter,\csname,\endcsname,\relax,\protect}
+% \DoNotIndex{\Huge,\huge,\LARGE,\Large,\large,\normalsize}
+% \DoNotIndex{\small,\footnotesize,\scriptsize,\tiny}
+% \DoNotIndex{\normalfont,\bfseries,\slshape,\sffamily,\interlinepenalty}
+% \DoNotIndex{\textbf,\textit,\textsf,\textsc}
+% \DoNotIndex{\hfil,\par,\hskip,\vskip,\vspace,\quad}
+% \DoNotIndex{\centering,\raggedright,\ref}
+% \DoNotIndex{\c@secnumdepth,\@startsection,\@setfontsize}
+% \DoNotIndex{\ ,\@plus,\@minus,\p@,\z@,\@m,\@M,\@ne,\m@ne}
+% \DoNotIndex{\@@par,\DeclareOperation,\RequirePackage,\LoadClass}
+% \DoNotIndex{\AtBeginDocument,\AtEndDocument}
+%
+% \GetFileInfo{\jobname.dtx} %
+%
+% \def\indexname{索引}
+% \IndexPrologue{\section{\indexname}}
+%
+% \title{\includegraphics[width=0.3\textwidth]{images/icon.png}
+% \\[1cm]
+% \bfseries 北京理工大学本科生{\LaTeX}学位论文及报告模板 }
+% \author{北京理工大学网络开拓者协会 \\ \texttt{webmaster@bitnp.net}} %
+% \date{\zihao{-4} \today\quad \color{RubineRed}{\kaishu {\BIThesis}版本\version}}
+% \maketitle\thispagestyle{empty}
+%
+% \def\abstractname{}
+% \begin{abstract}\noindent
+% 此宏包旨在建立一个简单易用的北京理工大学学位论文模板,包括本科综合论文训练、硕士
+% 论文、博士论文以及博士后出站报告。
+% \end{abstract}
+%
+% \vspace{5mm}
+%
+% \begin{center}
+% \noindent\rule[0.25\baselineskip]{0.5\textwidth}{0.7pt}
+% \end{center}
+%
+% \def\abstractname{免责声明}
+% \begin{abstract}
+% \noindent
+% \begin{enumerate}
+% \item 本模板的发布遵守 \LPPL ,使用前请认真阅读协议内容。
+% \item 任何个人或组织以本模板为基础进行修改、扩展而生成的新的专用模板,请严格遵
+% 守 \LaTeX{} Project Public License 协议。由于违犯协议而引起的任何纠纷争端均与
+% 本模板作者无关。
+% \end{enumerate}
+% \end{abstract}
+%
+% \vspace{5mm}
+%
+% \def\abstractname{简介}
+% \begin{abstract}
+% \BIThesisLaTeX 是北京理工大学本科生毕业设计开题报告、总论文,以及其他课程报告、实验报告等重要论文、报告的 {\LaTeX} 模板集合。
+% 如果你厌烦了 Word 格式的不人性化、参考文献的难以管理、公式输入的差劲体验……那么欢迎来尝试用专业的学术稿件排版利器 —— {\LaTeX},来排版你的论文。
+% 专业高端、学界认可、开源免费,{\LaTeX} 是你论文排版的最佳搭档。
+%
+% \BIThesisLaTeX 目前支持使用 {\hologo{XeLaTeX}} 进行编译,使用以 biber 为后端的 BibLaTeX 进行参考文献的生成,
+% 符合《信息与文献参考文献著录规则》
+% (\href{http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=7FA63E9BBA56E60471AEDAEBDE44B14C}{GB/T 7714—2015})的标准。
+% 目前主要设计完成了计算机学院本科生毕业论文开题报告、毕业设计毕业论文与通用实验报告的 {\LaTeX} 模板。
+%
+% \end{abstract}
+% \newpage
+%
+% \tableofcontents
+% \clearpage
+% \setlength{\parskip}{0.8ex}
+%
+% \section{项目简介}
+% \subsection{历史与贡献者们}
+% \begin{itemize}
+% \item 2019 - 2020 年,\BIThesis 最早由 2016 级的武上博、王赞、唐誉铭、牟思睿和詹熠莎等人维护。
+% \begin{itemize}
+% \item 在此期间,\BIThesis 从无到有诞生了,包括使用手册、在线文档和开箱即用的模板。
+% \item 同时,2017 级的赵池等同学完成了一系列 \BIThesisLaTeX 的视频教程。
+% \end{itemize}
+% \item 2020 - 2021 年,2017 级的冯开宇、杨思云、郝正亮和顾骁等人接管了维护开发工作。
+% \begin{itemize}
+% \item 在此期间,冯开宇将原来的 .tex 文件制作成了宏包,并发布到 CTAN 上。
+% \item 项目代码也随之被拆分成了 \BIThesisMacroPackage,\BIThesisWiki 和 \BIThesisScaffold。
+% \end{itemize}
+% \end{itemize}
+% \subsection{\BIThesis 是什么?}
+% \BIThesis 之名是英文单词 Beijing Institution of Technology(北京理工大学)的首字母缩写“BIT” 与“Thesis”结合而成。在纯文本环境下,该名字应写作“BIThesis”。
+%
+% \BIThesisLaTeX 是由北京理工大学众多学子发起并维护的开源项目。该项目旨在建立一套简单易用的北京理工大学 \LaTeX 学位论文模板,包括本科综合论文训练。
+% \subsubsection{\BIThesisLaTeX 的组成}
+% 我们将 \BIThesisLaTeX 划分为了三个主要仓库:
+% \begin{table}[H]
+% \centering
+% \begin{tabular}{@{}l l p{6cm} @{}}
+% \toprule
+% 项目 & 项目地址 & 主要目的 \\ \midrule
+% BIThesis & \href{https://github.com/BITNP/BIThesis}{BITNP/BIThesis} & 主要存储 \BIThesis 宏包 \\
+% BIThesis-wiki & \href{https://github.com/BITNP/BIThesis-wiki}{BITNP/BIThesis-wiki} & 存储 \BIThesisLaTeX 项目在线文档 \\
+% BIThesis-scaffold & \href{https://github.com/BITNP/BIThesis-scaffold}{BITNP/BIThesis-scaffold} & 存储开箱即用的论文模板样式,便于使用者快速开始写作 \\ \bottomrule
+% \end{tabular}
+% \end{table}
+%
+% 如果你仅想解决「我如何使用 \BIThesisLaTeX 来帮助我完成实验论文?」这个问题,那么欢迎你访问我们的\href{https://bithesis.bitnp.net}{在线文档}以获得更多信息。
+%
+% \section{使用说明}
+% \subsection{\BIThesis 宏包的组成}
+% 为了适应用户的不同需求,并符合 CTeX 宏集的设计习惯,我们将 \BIThesisMacroPackage 的主要功能设计安排在两个中文文档类当中,具体的组成见 \ref{tab:classes}。
+% \begin{table}[H]
+% \centering
+% \caption{测试}
+% \label{tab:classes}
+% \begin{tabular}{@{}lll@{}}
+% \toprule
+% 类别 & 文件 & 说明 \\ \midrule
+% \multirow{2}{*}{文档类} & bitart.cls & 对应 ctxart.cls,提供实验报告模板、开题报告模板。 \\
+% & bitbook.cls & 对应 ctexbook.cls ,提供本科毕业模板。 \\ \cmidrule(l){2-3}
+% \end{tabular}
+% \end{table}
+% \subsection{\BIThesis 宏包的安装和更新}
+% 最常见的 \TeX 发行版(\hologo{TeX} Live 和 \hologo{MiKTeX})已收录\BIThesisMacroPackage 及其依赖的宏包和宏集。
+%
+% 如果安装以上发行版的时间较早,可能你本地的环境中不存在 \BIThesisMacroPackage 或者不是最新版本的。那么你需要通过包管理器来安装/更新 \BIThesisMacroPackage:
+% \mint{bash}|tlmgr update --self --all|
+% \subsection{使用 \BIThesis 文档类}
+% 推荐使用 \BIThesisScaffold 来进行具体的项目编写。\BIThesisScaffold 提供了多种最常用的模板,你可以在 \href{https://github.com/BITNP/BIThesis}{主项目的 Releases}中找到它们。
+% \section{致谢}
+% \section{软件许可证}
+% \begin{itemize}
+% \item 北京理工大学校徽校名图片的版权归北京理工大学所有。
+% \item \BIThesisLaTeX 宏包以及相关文档类使用 \LPPL 授权。
+% \item \BIThesisLaTeX 文档及其他附属文件通过 \LPPL 授权。
+% \end{itemize}
+% \section{实现细节}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \begin{macro}{\YOURMACRO}
+% Put explanation of |\YOURMACRO|’s implementation here.
+% \begin{macrocode}
+\newcommand{\YOURMACRO}{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{YOURENV}
+% Put explanation of |YOURENV|’s implementation here.
+% \begin{macrocode}
+\newenvironment{YOURENV}{}{}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*book>
+% \end{macrocode}
+% \begin{macrocode}
+
+\newif\if@bit@bachelor
+\newif\if@bit@master
+\newif\if@bit@docter
+
+\DeclareOption{bachelor}{\@bit@bachelortrue}
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{ctexbook}}
+\ExecuteOptions{bachelor}
+
+\ProcessOptions\relax
+
+\LoadClass[UTF8,AutoFakeBold,AutoFakeSlant,zihao=-4,oneside,openany]{ctexbook}
+
+\RequirePackage[a4paper,left=3cm,right=2.6cm,top=3.5cm,bottom=2.9cm]{geometry}
+% 目前 29mm 最接近 Word 排版
+\RequirePackage{xeCJK}
+\RequirePackage{titletoc}
+ % \RequirePackage{fontspec}
+\RequirePackage{setspace}
+\RequirePackage{graphicx}
+\RequirePackage{fancyhdr}
+\RequirePackage{pdfpages}
+\RequirePackage{setspace}
+\RequirePackage{booktabs}
+\RequirePackage{multirow}
+\RequirePackage{tikz}
+\RequirePackage{etoolbox}
+\RequirePackage{hyperref}
+\RequirePackage{xcolor}
+\RequirePackage{caption}
+\RequirePackage{array}
+\RequirePackage{amsmath}
+\RequirePackage{amssymb}
+\RequirePackage{pdfpages}
+
+% 设置参考文献编译后端为 biber,引用格式为 GB/T7714-2015 格式
+% 参考文献使用宏包见 https://github.com/hushidong/biblatex-gb7714-2015
+\RequirePackage[
+ backend=biber,
+ style=gb7714-2015,
+ gbalign=gb7714-2015,
+ gbnamefmt=lowercase,
+ gbpub=false,
+ doi=false,
+ url=false,
+ eprint=false,
+ isbn=false,
+]{biblatex}
+
+% 参考文献引用文件位于 misc/ref.bib
+\addbibresource{./misc/ref.bib}
+
+% 西文字体默认为 Times New Roman
+\setromanfont{Times New Roman}
+% 论文题目字体为华文细黑
+\setCJKfamilyfont{xihei}[AutoFakeBold,AutoFakeSlant]{[STXIHEI.TTF]} % 若希望使用本机字体,也可以用 {STXihei} 来调用
+\newcommand{\xihei}{\CJKfamily{xihei}}
+
+
+
+% 主题页面格式:BIThesis
+\fancypagestyle{BIThesis}{
+ % 页眉高度
+ \setlength{\headheight}{20pt}
+ % 页码高度(不完美,比规定稍微靠下 2mm)
+ \setlength{\footskip}{14pt}
+
+ \fancyhf{}
+ % 定义页眉、页码
+ \fancyhead[C]{\zihao{4}\ziju{0.08}\songti{北京理工大学本科生毕业设计(论文)}}
+ \fancyfoot[C]{\songti\zihao{5} \thepage}
+ % 页眉分割线稍微粗一些
+ \renewcommand{\headrulewidth}{0.6pt}
+}
+
+% 设置章节格式
+% 一级标题:黑体,三号,加粗;间距:段前 0.5 行,段后 1 行;
+\ctexset{chapter={
+ name = {第,章},
+ number = {\arabic{chapter}},
+ format = {\heiti \bfseries \centering \zihao{3}},
+ aftername = \hspace{9bp},
+ pagestyle = BIThesis,
+ beforeskip = 8bp,
+ afterskip = 32bp,
+ fixskip = true,
+ }
+}
+
+% 二级标题:黑体,四号,加粗;间距:段前 0.5 行,段后 0 行;
+\ctexset{section={
+ number = {\thechapter.\hspace{4bp}\arabic{section}},
+ format = {\heiti \raggedright \bfseries \zihao{4}},
+ aftername = \hspace{8bp},
+ beforeskip = 20bp plus 1ex minus .2ex,
+ afterskip = 18bp plus .2ex,
+ fixskip = true,
+ }
+}
+
+% 三级标题:黑体、小四、加粗;间距:段前 0.5 行,段后 0 行;
+\ctexset{subsection={
+ number = {\thechapter.\hspace{3bp}\arabic{section}.\hspace{3bp}\arabic{subsection}},
+ format = {\heiti \bfseries \raggedright \zihao{-4}},
+ aftername = \hspace{7bp},
+ beforeskip = 17bp plus 1ex minus .2ex,
+ afterskip = 14bp plus .2ex,
+ fixskip = true,
+ }
+}
+
+% 设置目录样式
+% 添加 PDF 链接
+\addtocontents{toc}{\protect\hypersetup{hidelinks}}
+
+% 解决「目录」二字的格式问题
+\renewcommand{\contentsname}{
+ \fontsize{16pt}{\baselineskip}
+ \normalfont\heiti{目~~~~录}
+ \vspace{-8pt}
+}
+% 定义目录样式
+\titlecontents{chapter}[0pt]{\songti \zihao{-4}}
+{\thecontentslabel\hspace{\ccwd}}{}
+{\hspace{.5em}\titlerule*{.}\contentspage}
+\titlecontents{section}[1\ccwd]{\songti \zihao{-4}}
+{\thecontentslabel\hspace{\ccwd}}{}
+{\hspace{.5em}\titlerule*{.}\contentspage}
+\titlecontents{subsection}[2\ccwd]{\songti \zihao{-4}}
+{\thecontentslabel\hspace{\ccwd}}{}
+{\hspace{.5em}\titlerule*{.}\contentspage}
+
+% 前置页面(原创性声明、中英文摘要、目录等)
+\renewcommand{\frontmatter}{
+ \pagenumbering{Roman}
+ \pagestyle{BIThesis}
+}
+
+% 正文页面
+\renewcommand{\mainmatter}{
+ \pagenumbering{arabic}
+ \pagestyle{BIThesis}
+}
+
+% 设置 caption 与 figure 之间的距离
+\setlength{\abovecaptionskip}{11pt}
+\setlength{\belowcaptionskip}{9pt}
+
+% 设置图片的 caption 格式
+\renewcommand{\thefigure}{\thechapter-\arabic{figure}}
+\captionsetup[figure]{font=small,labelsep=space}
+
+% 设置表格的 caption 格式和 caption 与 table 之间的垂直距离
+\renewcommand{\thetable}{\thechapter-\arabic{table}}
+\captionsetup[table]{font=small,labelsep=space,skip=2pt}
+
+% 调整底层 TeX 排版引擎参数以保证所有段落能够很好地以两端对齐的方式呈现
+\tolerance=1
+\emergencystretch=\maxdimen
+\hyphenpenalty=10000
+\hbadness=10000
+
+% 设置数学公式编号格式
+\renewcommand{\theequation}{\arabic{chapter}-\arabic{equation}}
+
+\newcommand{\unnumchapter}[1]{
+ \chapter*{\vskip 10bp\textmd{#1} \vskip -6bp}
+ \addcontentsline{toc}{chapter}{#1}
+ \stepcounter{chapter}
+}
+
+
+
+% \end{macrocode}
+% \begin{macrocode}
+%</book>
+% \end{macrocode}
+% \begin{macrocode}
+%<*article>
+% \end{macrocode}
+% \begin{macrocode}
+
+\newif\if@bit@labreport
+\newif\if@bit@proposalreport
+
+\DeclareOption{lab-report}{\@bit@labreporttrue\@bit@proposalreportfalse}
+\DeclareOption{proposal-report}{\@bit@labreportfalse\@bit@proposalreporttrue}
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{ctexart}}
+\ExecuteOptions{lab-report}
+\ProcessOptions\relax
+
+\LoadClass[UTF8,AutoFakeBold,AutoFakeSlant,zihao=-4]{ctexart}%
+
+\if@bit@labreport
+ \RequirePackage[a4paper,left=3.18cm,right=3.18cm,top=2.54cm,bottom=2.54cm,includeheadfoot]{geometry}%
+\else
+ \RequirePackage[a4paper,left=3cm,right=2.4cm,top=2.6cm,bottom=2.38cm,includeheadfoot]{geometry}
+\fi
+
+\RequirePackage{fontspec}%
+\RequirePackage{setspace}%
+\RequirePackage{graphicx}%
+\RequirePackage{fancyhdr}%
+\RequirePackage{pdfpages}%
+\RequirePackage{setspace}%
+\RequirePackage{booktabs}%
+\RequirePackage{multirow}%
+\RequirePackage{caption}%
+
+\if@bit@labreport
+ \RequirePackage{titlesec}%
+ \RequirePackage{float}%
+ \RequirePackage{etoolbox}
+\fi
+
+\if@bit@proposalreport
+ % 设置参考文献编译后端为 biber,引用格式为 GB/T7714-2015 格式
+ % 参考文献使用宏包见 https://github.com/hushidong/biblatex-gb7714-2015
+ \usepackage[style=gb7714-2015,backend=biber]{biblatex}
+
+\fi
+
+
+\if@bit@labreport
+ % 将西文字体设置为 Times New Roman
+ \setromanfont{Times New Roman}%
+
+ % 设置引用位于右上角
+ \newcommand{\upcite}[1]{\textsuperscript{\cite{#1}}}%
+
+ % 设置文档标题深度
+ \setcounter{tocdepth}{3}%
+ \setcounter{secnumdepth}{3}%
+
+ %%
+ % 设置一级标题、二级标题格式
+ \ctexset{section={%
+ format={\raggedright \bfseries \songti \zihao{-3}},%
+ name = {,.},%
+ number = \chinese{section}%
+ }%
+ }%
+ \ctexset{subsection={%
+ format = {\bfseries \songti \raggedright \zihao{-4}},%
+ }%
+ }%
+
+ % 页眉和页脚(页码)的格式设定
+ \fancyhf{}%
+ \fancyhead[L]{\fontsize{10.5pt}{10.5pt}\selectfont\kaishu{\reportName}}%
+ \fancyfoot[C]{\fontsize{9pt}{9pt}\selectfont\kaishu{\thepage}}%
+ \renewcommand{\headrulewidth}{0.5pt}%
+ \renewcommand{\footrulewidth}{0pt}%
+
+ \AtBeginDocument{
+ }
+\fi
+
+\if@bit@proposalreport
+ % 定义 caption 字体为楷体
+ \DeclareCaptionFont{kaiticaption}{\kaishu \normalsize}
+
+ % 设置图片的 caption 格式
+ \renewcommand{\thefigure}{\thesection-\arabic{figure}}
+ \captionsetup[figure]{font=small,labelsep=space,skip=10bp,labelfont=bf,font=kaiticaption}
+
+ % 设置表格的 caption 格式
+ \renewcommand{\thetable}{\thesection-\arabic{table}}
+ \captionsetup[table]{font=small,labelsep=space,skip=10bp,labelfont=bf,font=kaiticaption}
+
+ % 输出大写数字日期
+ \CTEXoptions[today=big]
+
+ % 将西文字体设置为 Times New Roman
+ \setromanfont{Times New Roman}
+
+ %% 将中文楷体设置为 SIMKAI.TTF(如果需要)
+ % \setCJKfamilyfont{zhkai}{[SIMKAI.TTF]}
+ % \newcommand*{\kaiti}{\CJKfamily{zhkai}}
+
+ % 设置文档标题深度
+ \setcounter{tocdepth}{3}
+ \setcounter{secnumdepth}{3}
+
+ %%
+ % 设置一级标题、二级标题格式
+ % 一级标题:小三,宋体,加粗,段前段后各半行
+ \ctexset{section={
+ format={\raggedright \bfseries \songti \zihao{-3}},
+ beforeskip = 24bp plus 1ex minus .2ex,
+ afterskip = 24bp plus .2ex,
+ fixskip = true,
+ name = {,.\quad}
+ }
+ }
+ % 二级标题:小四,宋体,加粗,段前段后各半行
+ \ctexset{subsection={
+ format = {\bfseries \songti \raggedright \zihao{4}},
+ beforeskip =24bp plus 1ex minus .2ex,
+ afterskip = 24bp plus .2ex,
+ fixskip = true,
+ }
+ }
+ % 页眉和页脚(页码)的格式设定
+ \fancyhf{}
+ \fancyhead[R]{\fontsize{10.5pt}{10.5pt}\selectfont{北京理工大学本科生毕业设计(论文)开题报告}}
+ \fancyfoot[R]{\fontsize{9pt}{9pt}\selectfont{\thepage}}
+ \renewcommand{\headrulewidth}{1pt}
+ \renewcommand{\footrulewidth}{0pt}
+\fi
+
+
+\AtBeginDocument{
+ \if@bit@labreport
+ \input{../lab-report/misc/cover_v1.tex}
+ % 正文开始
+ \pagestyle{fancy}
+ \setcounter{page}{1}%
+ \fi
+ \if@bit@proposalreport
+ % 报告封面
+ \input{misc/cover.tex}
+ \fi
+
+}
+
+% \end{macrocode}
+%
+% \begin{macrocode}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</article>
+% \end{macrocode}
+%
+% \iffalse
+%<*dtx-style>
+\ProvidesPackage{dtx-style}
+\RequirePackage{hypdoc}
+\RequirePackage{ifthen}
+\RequirePackage{fontspec}[2017/01/20]
+\RequirePackage{amsmath}
+\RequirePackage{unicode-math}
+\RequirePackage[UTF8,scheme=chinese,heading]{ctex}
+\RequirePackage[
+ top=2.5cm, bottom=2.5cm,
+ left=4cm, right=2cm,
+ headsep=3mm]{geometry}
+\RequirePackage{graphicx}
+\RequirePackage{multirow}
+\RequirePackage[ruled,vlined]{algorithm2e}
+\RequirePackage{wrapfig}
+\RequirePackage{hologo}
+\RequirePackage{array,longtable,booktabs}
+\RequirePackage{listings}
+\RequirePackage{fancyhdr}
+\RequirePackage[dvipsnames]{xcolor}
+\RequirePackage{awesomebox}
+\RequirePackage{etoolbox}
+\RequirePackage{dirtree}
+\RequirePackage{metalogo}
+\RequirePackage[tightLists=false]{markdown}
+\RequirePackage{caption}
+\RequirePackage{tikz}
+\usetikzlibrary{positioning}
+\RequirePackage{framed}
+\RequirePackage{menukeys}
+
+ % 设置代码高亮
+\RequirePackage{minted}
+\usemintedstyle{tango}
+
+ % 设置列表无间隔
+\usepackage{enumitem}
+\setlist{nosep}
+
+\markdownSetup{
+ renderers = {
+ link = {\href{#2}{#1}},
+ }
+}
+
+\hypersetup{
+ pdflang = zh-CN,
+ pdftitle = {BIThesis:北京理工大学学位论文及报告模板},
+ pdfauthor = {冯开宇},
+ pdfsubject = {北京理工大学学位论文及报告模板使用说明},
+ pdfkeywords = {论文模板; 北京理工大学; 使用说明},
+ pdfdisplaydoctitle = true
+}%
+
+\newcommand{\BIThesisLaTeX}{{\BIThesis}北京理工大学学位论文及报告{\LaTeX}模板}
+\newcommand{\BIThesisMacroPackage}{{\BIThesis}宏集}
+\newcommand{\BIThesisWiki}{{\BIThesis}在线文档}
+\newcommand{\BIThesisScaffold}{{\BIThesis}模板}
+\newcommand{\LPPL}{{\href{https://www.latex-project.org/lppl/lppl-1-3c.txt}{\LaTeX{} Project Public License (1.3.c)}}}
+\newcommand{\version}{v2.0 BirthdayCake}
+
+\ctexset{
+ today=big,
+ abstractname=简介
+}
+
+\ctexset{section={
+ format={\raggedright \bfseries \zihao{-3}},
+ name = {第,章}
+ }
+}
+
+\ctexset{subsection={
+ format = {\bfseries \raggedright \zihao{4}}
+ }
+}
+
+
+
+\ifthenelse{\equal{\@nameuse{g__ctex_fontset_tl}}{mac}}{
+ \setmainfont{Palatino}
+ \setsansfont[Scale=MatchLowercase]{Helvetica}
+ \setmonofont[Scale=MatchLowercase]{Menlo}
+ \xeCJKsetwidth{‘’“”}{1em}
+}{
+ \setmainfont[
+ Extension = .otf,
+ UprightFont = *-regular,
+ BoldFont = *-bold,
+ ItalicFont = *-italic,
+ BoldItalicFont = *-bolditalic,
+ ]{texgyrepagella}
+ \setsansfont[
+ Extension = .otf,
+ UprightFont = *-regular,
+ BoldFont = *-bold,
+ ItalicFont = *-italic,
+ BoldItalicFont = *-bolditalic,
+ ]{texgyreheros}
+ \setmonofont[
+ Extension = .otf,
+ UprightFont = *-regular,
+ BoldFont = *-bold,
+ ItalicFont = *-italic,
+ BoldItalicFont = *-bolditalic,
+ Scale = MatchLowercase,
+ Ligatures = CommonOff,
+ ]{texgyrecursor}
+}
+\unimathsetup{
+ math-style=ISO,
+ bold-style=ISO,
+}
+\IfFontExistsTF{XITSMath-Regular.otf}{
+ \setmathfont[
+ Extension = .otf,
+ BoldFont = XITSMath-Bold,
+ StylisticSet = 8,
+ ]{XITSMath-Regular}
+ \setmathfont[range={cal,bfcal},StylisticSet=1]{XITSMath-Regular.otf}
+}{
+ \setmathfont[
+ Extension = .otf,
+ BoldFont = *bold,
+ StylisticSet = 8,
+ ]{xits-math}
+ \setmathfont[range={cal,bfcal},StylisticSet=1]{xits-math.otf}
+}
+
+\colorlet{bit@macro}{blue!60!black}
+\colorlet{bit@env}{blue!70!black}
+\colorlet{bit@option}{purple}
+\patchcmd{\PrintMacroName}{\MacroFont}{\MacroFont\bfseries\color{bit@macro}}{}{}
+\patchcmd{\PrintDescribeMacro}{\MacroFont}{\MacroFont\bfseries\color{bit@macro}}{}{}
+\patchcmd{\PrintDescribeEnv}{\MacroFont}{\MacroFont\bfseries\color{bit@env}}{}{}
+\patchcmd{\PrintEnvName}{\MacroFont}{\MacroFont\bfseries\color{bit@env}}{}{}
+
+\def\DescribeOption{%
+ \leavevmode\@bsphack\begingroup\MakePrivateLetters%
+ \Describe@Option}
+\def\Describe@Option#1{\endgroup
+ \marginpar{\raggedleft\PrintDescribeOption{#1}}%
+ \bit@special@index{option}{#1}\@esphack\ignorespaces}
+\def\PrintDescribeOption#1{\strut \MacroFont\bfseries\sffamily\color{bit@option} #1\ }
+\def\bit@special@index#1#2{\@bsphack
+ \begingroup
+ \HD@target
+ \let\HDorg@encapchar\encapchar
+ \edef\encapchar usage{%
+ \HDorg@encapchar hdclindex{\the\c@HD@hypercount}{usage}%
+ }%
+ \index{#2\actualchar{\string\ttfamily\space#2}
+ (#1)\encapchar usage}%
+ \index{#1:\levelchar#2\actualchar
+ {\string\ttfamily\space#2}\encapchar usage}%
+ \endgroup
+ \@esphack}
+
+\lstdefinestyle{lstStyleBase}{%
+ basicstyle=\small\ttfamily,
+ aboveskip=\medskipamount,
+ belowskip=\medskipamount,
+ lineskip=0pt,
+ boxpos=c,
+ showlines=false,
+ extendedchars=true,
+ upquote=true,
+ tabsize=2,
+ showtabs=false,
+ showspaces=false,
+ showstringspaces=false,
+ numbers=none,
+ linewidth=\linewidth,
+ xleftmargin=4pt,
+ xrightmargin=0pt,
+ resetmargins=false,
+ breaklines=true,
+ breakatwhitespace=false,
+ breakindent=0pt,
+ breakautoindent=true,
+ columns=flexible,
+ keepspaces=true,
+ gobble=4,
+ framesep=3pt,
+ rulesep=1pt,
+ framerule=1pt,
+ backgroundcolor=\color{gray!5},
+ stringstyle=\color{green!40!black!100},
+ keywordstyle=\bfseries\color{blue!50!black},
+ commentstyle=\slshape\color{black!60}}
+
+\lstdefinestyle{lstStyleShell}{%
+ style=lstStyleBase,
+ frame=l,
+ rulecolor=\color{purple},
+ language=bash}
+
+\lstdefinestyle{lstStyleLaTeX}{%
+ style=lstStyleBase,
+ frame=l,
+ rulecolor=\color{violet},
+ language=[LaTeX]TeX}
+
+\lstnewenvironment{latex}{\lstset{style=lstStyleLaTeX}}{}
+\lstnewenvironment{shell}{\lstset{style=lstStyleShell}}{}
+
+\setlist{nosep}
+
+\DeclareDocumentCommand{\option}{m}{\textsf{#1}}
+\DeclareDocumentCommand{\env}{m}{\texttt{#1}}
+\newcommand{\myentry}[1]{%
+ \marginpar{\raggedleft\color{purple}\bfseries\strut #1}}
+\newcommand{\note}[2][Note]{{%
+ \color{magenta}{\bfseries #1}\emph{#2}}}
+
+\DeclareDocumentCommand{\githubuser}{m}{\href{https://github.com/#1}{@#1}}
+
+
+ % 设置 caption 与 figure 之间的距离
+\setlength{\abovecaptionskip}{11pt}
+\setlength{\belowcaptionskip}{9pt}
+
+ % 设置图片的 caption 格式
+\renewcommand{\thefigure}{\thesection-\arabic{figure}}
+\captionsetup[figure]{font=small,labelsep=space}
+
+ % 设置表格的 caption 与 table 之间的垂直距离
+\captionsetup[table]{skip=2pt}
+
+ % 设置表格的 caption 格式
+\renewcommand{\thetable}{\thesection-\arabic{table}}
+\captionsetup[table]{font=small,labelsep=space}
+
+ % 定义 BIThesis \LaTeX 风格的 Logo
+\usepackage{relsize}
+\makeatletter
+\def\matex@ssize{\larger[-1]\scshape}
+\DeclareRobustCommand{\BIThesis}{
+ \mbox{
+ \kern-0.5em{B}\kern-0.05em
+ {I}\kern-0.05em
+ {T}\kern-0.1em
+ \raisebox{-0.38ex}{\matex@ssize {H}}\kern-0.1em
+ {\matex@ssize {E}}\kern-0.05em
+ \raisebox{-0.38ex}{\matex@ssize {S}}\kern-0.05em
+ {\matex@ssize {I}}\kern-0.05em
+ \raisebox{-0.35ex}{\matex@ssize {S}}\kern-0.5em
+ \kern 1ex
+ }
+}
+\makeatother
+
+
+
+%</dtx-style>
+% \fi
+%
+%
+% \Finale
+\endinput
+% \iffalse
+% Local Variables:
+% mode: doctex
+% TeX-master: t
+% End:
+% \fi
diff --git a/Master/texmf-dist/source/latex/bithesis/bithesis.ins b/Master/texmf-dist/source/latex/bithesis/bithesis.ins
new file mode 100644
index 00000000000..98393c70e9a
--- /dev/null
+++ b/Master/texmf-dist/source/latex/bithesis/bithesis.ins
@@ -0,0 +1,72 @@
+%% Copyright (C) 2021
+%% Association of Bit Network Pioneer and any individual authors listed elsewhere in this file.
+%% --------------------------------------------------------------------------
+%%
+%% 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. This version of this license is in
+%% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%% and the latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3 or later is part of all distributions of
+%% LaTeX version 2020/11/27 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Mainteiner of this work is Feng Kaiyu.
+%% --------------------------------------------------------------------------
+
+\input docstrip.tex
+\keepsilent
+
+\preamble
+
+ Copyright (C) 2021
+ Association of Bit Network Pioneer and any individual authors listed in the documentation.
+------------------------------------------------------------------------------
+
+ 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. This version of this license is in
+ http://www.latex-project.org/lppl/lppl-1-3c.txt
+ and the latest version of this license is in
+ http://www.latex-project.org/lppl.txt
+ and version 1.3 or later is part of all distributions of
+ LaTeX version 2020/11/27 or later.
+
+ This work has the LPPL maintenance status `maintained'.
+
+ The Current Maintainer of this work is Feng Kaiyu.
+------------------------------------------------------------------------------
+
+\endpreamble
+
+\generate
+ {
+ \usedir{tex/latex/bithesis}
+ \file{bitart.cls} {\from{\jobname.dtx}{cls,article}}
+ \file{bitbook.cls} {\from{\jobname.dtx}{cls,book}}
+ \file{dtx-style.sty} {\from{\jobname.dtx}{dtx-style}}
+ }
+
+\obeyspaces
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* file into proper directories searched by TeX: *}
+\Msg{* *}
+\Msg{* The recommended directory is TDS:tex/latex/bithesis *}
+\Msg{* *}
+\Msg{* bitart.cls *}
+\Msg{* bitbook.cls *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file ctex.dtx *}
+\Msg{* through XeLaTeX. *}
+\Msg{* *}
+\Msg{* Happy BIThesis! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/bookcover/bookcover.dtx b/Master/texmf-dist/source/latex/bookcover/bookcover.dtx
index 304ad059fe5..47ddeb2314e 100644
--- a/Master/texmf-dist/source/latex/bookcover/bookcover.dtx
+++ b/Master/texmf-dist/source/latex/bookcover/bookcover.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2015- by Tibor Tomacs
+% Copyright (C) 2015-2020 by Tibor Tomacs
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.2
@@ -17,52 +17,65 @@
% \iffalse
%<*driver>
\ProvidesFile{bookcover.dtx}
-\newcommand{\eifiledate}{2018/01/21}
-\newcommand{\eifilever}{v2.3}
+\newcommand{\eifiledate}{2021/01/04}
+\newcommand{\eifilever}{v3.3}
%</driver>
+%<class>
%<class>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-%<class>\ProvidesClass{bookcover}[2018/01/21 v2.3 class for book covers and dust jackets]
+%<class>\ProvidesClass{bookcover}[2021/01/04 v3.3 class for book covers and dust jackets]
%
%<*driver>
\documentclass{ltxdoc}
\OnlyDescription
-\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[paperwidth=210mm,paperheight=295mm,textwidth=160mm,top=25mm,bottom=25mm,outer=25mm]{geometry}
\usepackage[unicode,pdfstartview=FitH,bookmarksnumbered,colorlinks,allcolors=teal]{hyperref}
\usepackage[english]{babel}
-\usepackage{xcolor,graphicx,listings,calc,multirow,array,pdfpages}
+\usepackage{graphicx,listings,calc,multirow,array,paralist,eso-pic,tikz}
\colorlet{command}{blue!80!black}
-\colorlet{example}{black}
-\colorlet{layer}{purple}
\colorlet{param}{green!50!black}
\lstnewenvironment{examplelst}{\lstset{
gobble=2,
- belowskip=5mm,
- basicstyle=\color{example}\small\ttfamily,
+ aboveskip=1.4pt,
+ basicstyle=\small\ttfamily,
backgroundcolor=\color{black!10},
columns=fullflexible,
+ comment=[l][\ttfamily\color{purple}]{\%},
+ frame=trbl,
+ framesep=3pt,
+ xleftmargin=3.4pt,
+ xrightmargin=3.4pt,
keepspaces}}{}
\lstnewenvironment{commandlst}{\lstset{
literate={<}{{$\langle$}}1{>}{{$\rangle$}}1,
delim=[is][\color{param}\normalfont\itshape\small]{!}{!},
gobble=2,
+ belowskip=-4pt,
+ aboveskip=4pt,
basicstyle=\color{command}\ttfamily,
backgroundcolor=\color{white},
columns=fullflexible,
+ frame=trbl,
+ frameround=tttt,
+ framesep=3pt,
+ xleftmargin=3.4pt,
+ xrightmargin=3.4pt,
keepspaces}}{}
\lstdefinestyle{examplefile}{
literate={ü}{{\"u}}1{ó}{{\'o}}1{é}{{\'e}}1{á}{{\'a}}1{Á}{{\'A}}1,
- belowskip=5mm,
- basicstyle=\color{example}\small\ttfamily,
+ basicstyle=\small\ttfamily,
backgroundcolor=\color{black!10},
columns=fullflexible,
keepspaces,
- comment=[l][\ttfamily\color{black!50}]{\%}}
+ frame=trbl,
+ framesep=3pt,
+ xleftmargin=3.4pt,
+ xrightmargin=3.4pt,
+ comment=[l][\ttfamily\color{purple}]{\%}}
\newcommand{\commandinline}{\lstinline[
literate={<}{{$\langle$}}1{>}{{$\rangle$}}1,
@@ -71,15 +84,19 @@
columns=fullflexible,
keepspaces]}
-\flushbottom
-
\def\meta#1{{\color{param}\normalfont\itshape\small$\langle$#1$\rangle$}}
-\def\example{\colorbox{command}{\footnotesize\sffamily\bfseries\color{white}EXAMPLE}}
+\def\example{{\setlength{\fboxsep}{3pt}\colorbox{command}{\footnotesize\sffamily\bfseries\color{white}EXAMPLE}}}
\def\BookCover{{\def\sfdefault{ugq}\sffamily\bfseries
- \color{gray}\mbox{}\lower.15ex\hbox{[B}ook%
- \color{orange}\lower.15ex\hbox{C}over\lower.15ex\hbox{]}}}
+ \color{black!90}\mbox{}\lower.15ex\hbox{[B}ook%
+ \color{red!70!black}\lower.15ex\hbox{C}over\lower.15ex\hbox{]}}}
+
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{8pt}
+\renewcommand{\descriptionlabel}[1]{\hspace{0mm}}
+\setlength{\fboxsep}{0pt}
+\newcounter{partfig}
\begin{document}
\DocInput{./bookcover.dtx}
@@ -106,540 +123,775 @@
% \GetFileInfo{bookcover.cls}
%
% \title{{\Huge\BookCover\\[5mm]}
-% Class for book covers and dust jackets\\[2mm]
-% \textsf{bookcover.cls}\\
-% {\large\eifilever\ (\eifiledate)}}
-% \author{Tibor Tómács\\{\normalsize\href{mailto:tomacs.tibor@uni-eszterhazy.hu}{\texttt{tomacs.tibor@uni-eszterhazy.hu}}}}
+% \textsf{Class for book covers and dust jackets}\\[2mm]
+% {\large\texttt{bookcover.cls}\\
+% \eifilever\ (\eifiledate)}}
+% \author{Tibor T\'{o}m\'{a}cs\\{\normalsize\href{mailto:tomacs.tibor@uni-eszterhazy.hu}{\texttt{tomacs.tibor@uni-eszterhazy.hu}}}}
% \date{}
% \maketitle
%
+% \AddToShipoutPictureBG*{\tikz[overlay]\fill[top color=black!50, bottom color=white] (current page.north west) rectangle +(\paperwidth,-11cm);}
+%
% \section{Introduction}
-% In the following picture we can see a typical dust jacket. Its parts are back flap, back, spine, front and front flap.
-% Typographically, a book cover is a dust jacket without flaps, the only difference is that the book cover is a fixed part of the book, whereas the dust jacket is removable.
+%
+% The \texttt{bookcover} document class can be used to create dust jackets and book covers of hardcover and paperback books.
+%
+% \paragraph{Dust jacket.}
+%
+% In the following picture you can see a typical dust jacket of a hardcover book, which is a detachable outer book cover. Its parts are back flap, back cover, spine, front cover and front flap.
% \begin{center}
-% \includegraphics{figures/cover}
+% \includegraphics{figures/bookcover-dustjacket}
% \end{center}
-% When we prepare a cover for printing, some marks are needed to know where to trim or fold the paper. These marks determine a special area of the sheet, which is called ``bleed'' (see the green area in the next figure). The background will be expanded onto the bleed, taking account of slight inaccuracy when trimming.
+% When you prepare a dust jacket for printing, some marks are needed to know where to trim or fold the cover. The crop marks determine a special area of the sheet, which is called ``bleed'' (see the gray area in the next figure). The bleed will be trimmed off. The background will be expanded onto the bleed, taking account of slight inaccuracy when trimming. If there is no bleed, the likelihood of having a white strip on the edge of the finished product is high. In the next schematics figure, the red lines are the marks. The marks closest to the corners are the crop marks, and the other ones are the fold marks.
% \begin{center}
-% \includegraphics{figures/coverscheme}
+% \includegraphics{figures/bookcover-scheme-withflaps}
% \end{center}
-% We get the following result after trimming:
+% The back/front ``wraps'' (see the black area in the previous figure) are the areas between the front cover and front flap, and back cover and back flap. The reason this is defined is that if the front and back covers have background colors or images that continue to the foreedge of each cover, they must continue onto the flap. Because putting the edge of color right at the edge of the board would result in an unsightly boundary line when the book is closed.
+%
+% \paragraph{Book cover for paperback book.}
+%
+% A book cover of a paperback book is glued to the spine of the book and usually has no flaps. The function of the bleed here is the same as before. The crop marks are closest to the corners, and the other ones are the fold marks.
% \begin{center}
-% \includegraphics{figures/result}
+% \includegraphics{figures/bookcover-scheme-withoutflaps}
% \end{center}
+% Rarely, a book cover of a paperback book may have flaps. In this case, its scheme is similar to a dust jacket.
%
-% \section{Loading class}
-% The class \texttt{bookcover} requires the services of the class \texttt{article} and the following packages:
-% \texttt{kvoptions}, \texttt{textpos}, \texttt{geometry}, \texttt{graphicx}, \texttt{calc}, \texttt{ifthen}, \texttt{tikz}, \texttt{fgruler}.
+% \paragraph{Book cover for hardcover book.}
+%
+% The outside of the cover of a hardcover book is glued to the boards of the book. Of course, this never has flaps.
+% \begin{center}
+% \includegraphics{figures/bookcover-scheme-foldingmargin}
+% \end{center}
+% In this case, the function of the bleed is not to eliminate cutting inaccuracies. It will not be trimmed off, but it will be a margin which is folded back and glued onto the inside of the book boards. This way, it will cover all the edges of the boards. The crop marks are closest to the corners, and the other ones are the fold marks.
+%
+% \section{Loading class and options}\label{sec:class}
%
-% \medskip\noindent
% Load the class as usual, with
% \begin{commandlst}
% \documentclass[!<options>!]{bookcover}
% \end{commandlst}
%
-% \begin{center}
-% \begin{tabular}{@{}l@{}l@{\hspace{-13mm}}r@{}}
-% \textbf{option} & \textbf{description} & \textbf{default value}\\
-% \hline
-% \commandinline|coverwidth=!<length>!| & \multirow{6}*{\hspace{-1mm}$\left.\hbox{\rule[-11mm]{0pt}{22mm}}\right\}$ See the next figure}& \texttt{170mm}\\
-% \commandinline|coverheight=!<length>!| & & \texttt{240mm}\\
-% \commandinline|spinewidth=!<length>!| & & \texttt{5mm}\\
-% \commandinline|flapwidth=!<length>!| & & \texttt{0mm}\\
-% \commandinline|marklength=!<length>!| & & \texttt{10mm}\\
-% \commandinline|bleedwidth=!<length>!| & & \texttt{5mm}\\
-% \commandinline|markthick=!<length>!| & Thickness of marks & \texttt{0.4pt}\\
-% \commandinline|markcolor=!<color>!| & Color of marks & \texttt{red}\\
-% \commandinline|10pt| & \multirow{3}*{\hspace{-1mm}$\left.\hbox{\rule[-4mm]{0pt}{8mm}}\right\}$ Normal font size (default: \texttt{10pt})}&\\
-% \commandinline|11pt| & &\\
-% \commandinline|12pt| & &\\
-% \commandinline|trimmed| & It shows trimmed version&\texttt{false}\\
-% \hline
-% \end{tabular}
-% \end{center}
-% \begin{center}
-% \includegraphics{figures/sizes}
-% \end{center}
+% \medskip The list of \meta{options}:
+%
+% \begin{compactdesc}
+% \item[]\commandinline|coverheight=!<length>!| Cover height (default \texttt{coverheight=240mm}).
+% \item[]\commandinline|coverwidth=!<length>!| Front/back cover width (default \texttt{coverwidth=170mm}).
+% \item[]\commandinline|spinewidth=!<length>!| Spine width (default \texttt{spinewidth=5mm}).
+% \item[]\commandinline|flapwidth=!<length>!| Flap width (default \texttt{flapwidth=0mm}).
+% \item[]\commandinline|wrapwidth=!<length>!| Wrap width (default \texttt{wrapwidth=0mm}). It has no effect with \texttt{flapwidth=0mm} option.
+% \item[]\commandinline|bleedwidth=!<length>!| Bleed width (default \texttt{bleedwidth=5mm}).
+% \item[]\commandinline|marklength=!<length>!| Mark length (default \texttt{marklength=10mm}).
+% \item[]\commandinline|foldingmargin| or \commandinline|foldingmargin=true| The bleed will not a trimmed area but a folding margin. The crop marks will be placed at the corners of the bleed and the options \texttt{flapwidth} and \texttt{wrapwidth} will be ineffective, meaning there will be no flaps.
+% \item[]\commandinline|foldingmargin=false| (Default.)
+% \item[]\commandinline|10pt| (Default.) Normal font size is 10\,pt.
+% \item[]\commandinline|11pt| Normal font size is 11\,pt.
+% \item[]\commandinline|12pt| Normal font size is 12\,pt.
+% \item[]\commandinline|markthick=!<length>!| Thickness of marks (default \texttt{markthick=0.4pt}).
+% \item[]\commandinline|markcolor=!<color name>!| Color of marks (default \texttt{markcolor=red}).
+% \item[]\commandinline|pagecolor=!<color name>!| Color of page (default \texttt{pagecolor=white}).
+% \item[]\commandinline|trimmed| or \commandinline|trimmed=true| Trimmed version for demonstration.
+% \item[]\commandinline|trimmed=false| (Default.) No trimming. Use this for printing!
+% \item[]\commandinline|trimmingcolor=!<color name>!| Color of trimming (default \texttt{trimmingcolor=white}).
+% \end{compactdesc}
+%
+% The \texttt{bookcover.cls} requires the services of the \texttt{article} class and the following packages: \texttt{kvoptions}, \texttt{geometry}, \texttt{graphicx}, \texttt{calc}, \texttt{tikz}, \texttt{xparse}, \texttt{etoolbox}, \texttt{fgruler}.
+%
+% \section{Commands and environments}
+% Use \commandinline{bookcover} environment in the document body to make a new book cover. If you need to edit both sides of the cover, you can do it with two \texttt{bookcover} environments (see an example in the Subsection~\ref{subsec-two-sided-example}). You can create a component of the book cover by the following command or environment in the \texttt{bookcover} environment:
+% \begin{commandlst}
+% \bookcovercomponent{!<component type>!}{!<part>!}[!<left>!,!<bottom>!,!<right>!,!<top>!]{!<content>!}
+% \end{commandlst}
+% or its equivalent
+% \begin{commandlst}
+% \begin{bookcoverelement}{!<component type>!}{!<part>!}[!<left>!,!<bottom>!,!<right>!,!<top>!]
+% !<content>!
+% \end{bookcoverelement}
+% \end{commandlst}
%
-% \noindent\example
+% \begin{description}
+% \item[]\meta{component type} It determines the bookcover component type (see the Section~\ref{sec:componenttypes}). Predefined component types: \commandinline{color}, \commandinline{tikz}, \commandinline{tikz clip}, \commandinline{picture}, \commandinline{normal}, \commandinline{center}, \commandinline{ruler}.
+% \item[]\meta{part} This determines where in the book cover the \meta{content} is located. You can read the description of \meta{part} in the Section~\ref{sec:parts}. Some predefined parts: \commandinline{front} (front cover), \commandinline{bg front} (front cover expanded onto the bleed), \commandinline{back} (back cover), \commandinline{bg back} (back cover expanded onto the bleed), \commandinline{whole} (whole book cover), \commandinline{bg whole} (whole book cover expanded onto the bleed), \commandinline{spine}, etc.
+% \item[]\meta{left},\meta{bottom},\meta{right},\meta{top} These are the margins of the \meta{part}. The default value of every margin is \texttt{0mm}. If the \meta{left}, \meta{bottom}, \meta{right} or \meta{top} is empty or space, then its value will be \texttt{0mm}. If the value of a margin is negative, the part size will increase instead of decrease.
+% \item[]\meta{content} This can be text, image, color, etc., which depends on the \meta{component type} (see the Section~\ref{sec:componenttypes}). This will be located in the \meta{part}.
+% \end{description}
+% You can use the following length commands in the \meta{content} and to specify the margins of the \meta{part}:
+%
+% \begin{compactdesc}
+% \item[]\commandinline{\partheight} The height of the \meta{part} (reduced by \meta{bottom} and \meta{top} in \meta{content}).
+% \item[]\commandinline{\partwidth} The width of the \meta{part} (reduced by \meta{left} and \meta{right} in \meta{content}).
+% \item[]\commandinline{\coverheight} Cover height.
+% \item[]\commandinline{\coverwidth} Front/back cover width.
+% \item[]\commandinline{\spinewidth} Spine width.
+% \item[]\commandinline{\flapwidth} Flap width.
+% \item[]\commandinline{\wrapwidth} Wrap width.
+% \item[]\commandinline{\bleedwidth} Bleed width.
+% \item[]\commandinline{\marklength} Mark length.
+% \end{compactdesc}
+%
+% Every |\bookcovercomponent| command and |bookcoverelement| environment generates a layer on the sheet. The first one generates the bottom layer and the last one generates the top layer.
+%
+% In the following example we use |\bookcovercomponent| commands.
+%
+% \example
% \begin{examplelst}
-% \documentclass[flapwidth=50mm,spinewidth=15mm]{bookcover}
+% \documentclass[spinewidth=15mm,markcolor=black]{bookcover}
+% \begin{document}
+% \begin{bookcover}
+% \bookcovercomponent{color}{bg whole}{orange}
+% \bookcovercomponent{normal}{front}[,,,0.4\partheight]{
+% \centering\bfseries\huge Book title\par}
+% \end{bookcover}
+% \end{document}
% \end{examplelst}
%
-% \section{Creating book cover}\label{sec:mainmethod}
-% \subsection{Commands}
-% Use \commandinline{bookcover} environment to make a new book cover. In this environment, you can create a component of the book cover by the following command:
+% In the following example we use |bookcoverelement| environments. This example is equivalent to the previous one.
+%
+% \example
+% \begin{examplelst}
+% \documentclass[spinewidth=15mm,markcolor=black]{bookcover}
+% \begin{document}
+% \begin{bookcover}
+% \begin{bookcoverelement}{color}{bg whole}
+% orange
+% \end{bookcoverelement}
+% \begin{bookcoverelement}{normal}{front}[,,,0.4\partheight]
+% \centering\bfseries\huge Book title\par
+% \end{bookcoverelement}
+% \end{bookcover}
+% \end{document}
+% \end{examplelst}
+%
+% Use \commandinline{bookcoverdescription} environment in the document body for adding the description of the book cover and other information. Don't use it in |bookcover| environment! You can set the page geometry of the description by the following command:
% \begin{commandlst}
-% \bookcovercomponent{!<component type>!}{!<part>!}{!<content>!}
+% \bookcoverdescgeometry{!<geometry parameteres>!}
% \end{commandlst}
-% \meta{component type} See Subsection \ref{subsec:componenttypes}.
+% The possible \meta{geometry parameteres} are the same as for |\newgeometry| in the |geometry| package. Its default value is |margin=1in|. Unlike |\newgeometry|, it can be used in the preamble as well. See an example in the Subsection~\ref{subsec:desc}.
%
-% \medskip\noindent
-% \meta{part} See Subsection \ref{subsec:parts-main-method} or Section~\ref{sec:illustration-parts}.
+% If the value of the \texttt{trimmed} option is \texttt{true}, then you can set the trimmed part by the following command before any \texttt{bookcover} environment:
+% \begin{commandlst}
+% \bookcovertrimmedpart{!<trimmed part>!}[!<left>!,!<bottom>!,!<right>!,!<top>!]
+% \end{commandlst}
%
-% \medskip\noindent
-% \meta{content} It depends on the \meta{component type}. See Subsection \ref{subsec:componenttypes}.
+% Without this command, or if the \meta{trimmed part} is empty or space, then its value will be \texttt{whole} (see the Section~\ref{sec:parts}). The \meta{left}, \meta{bottom}, \meta{right} and \meta{top} are the margins of the \meta{trimmed part}. The default value of every margin is \texttt{0mm}. If the \meta{left}, \meta{bottom}, \meta{right} or \meta{top} is empty or space, then its value will be \texttt{0mm}. The trimmed area will be the \meta{trimmed part} reduced by the margins. If the value of a margin is negative, the \meta{trimmed part} size will increase instead of decrease.
%
-% \medskip\noindent
-% Every |\bookcovercomponent| generates a layer on the sheet. The first one generates the bottom layer and the last one generates the top layer.
+% You can change some options before any \texttt{bookcover} environment by the following command:
+% \begin{commandlst}
+% \setbookcover{!<options>!}
+% \end{commandlst}
+% The \meta{options} can be as follows: \commandinline|markthick=!<length>!|, \commandinline|markcolor=!<color name>!|, \commandinline|pagecolor=!<color name>!|, \commandinline|trimmed|, \commandinline|trimmed=false|, \commandinline|trimmingcolor=!<color name>!| (see the Section~\ref{sec:class}). See an example in the Subsection~\ref{subsec:trimming}
%
-% \bigskip\noindent\example
-% \begin{examplelst}
-% \begin{bookcover}
-% \bookcovercomponent{color}{bg whole}{color=blue}
-% \bookcovercomponent{normal}{front}{
-% \vspace{5cm}
-% \begin{center}
-% \bfseries\huge Book title
-% \end{center}}
-% \end{bookcover}
-% \end{examplelst}
+% \section{Book cover parts}\label{sec:parts}
%
-% \subsection{Parts}\label{subsec:parts-main-method}
-% Important: The background parts are expanded onto the bleed, taking account of slight inaccuracy when trimming!
-% \subsubsection{One-piece background parts}
-% \commandinline{bg back flap}, \commandinline{bg back}, \commandinline{bg spine}, \commandinline{bg front}, \commandinline{bg front flap}
+% Each predefined \meta{part} is illustrated in this section.
%
-% \begin{center}
-% \textbf{With flaps}\\*[0pt]
-% \includegraphics{figures/bg1}
-% \end{center}
-% \begin{center}
-% \textbf{Without flaps}\\*[0pt]
-% \includegraphics{figures/bg4}
-% \end{center}
+% The background parts are expanded onto the bleed, taking account of slight inaccuracy when trimming. In contrast, the foreground parts do not extend onto the bleed. The names of the background parts start with \commandinline{bg}.
%
-% \subsubsection{One-piece foreground parts}
-% \commandinline{back flap}, \commandinline{back}, \commandinline{spine}, \commandinline{front}, \commandinline{front flap}, \commandinline{above back}, \commandinline{above front}, \commandinline{below back}, \commandinline{below front}
+% If your book will also have printing on the inside cover, the layout for the inside cover will be the exact opposite of the outside cover. Therefore, these parts also have synonymous names. The synonymous names contain \commandinline{inside front} instead of \commandinline{back} and \commandinline{inside back} instead of \commandinline{front}. For example \commandinline{bg front} is the same as \commandinline{bg inside back}, \commandinline{above back} is the same as \commandinline{above inside front}, etc.
%
-% \begin{center}
-% \textbf{With flaps}\\*[0pt]
-% \includegraphics{figures/foreground1}
-% \end{center}
-% \begin{center}
-% \textbf{Without flaps}\\*[0pt]
-% \includegraphics{figures/foreground2}
-% \end{center}
+% You can also use short names to specify foreground and background parts. The elements of the abbreviations are as follows: \commandinline{F} (flap), \commandinline{W} (wrap), \commandinline{C} (cover), \commandinline{S} (spine), \commandinline{l} (a part to the left of the spine), \commandinline{r} (a part to the right of the spine). For example \commandinline{lC} is the abbreviation of the left cover, i.e.\ the back cover of the outside cover, or the inside front cover of the inside cover. It is not extended onto the bleed, i.e.\ it is a foreground part. If you want to extend that part onto the bleed, type \commandinline{bg} and then a space in the front of the name. For example \commandinline{bg lC} is the left cover extended onto the bleed. Use a hyphen to specify multi-piece parts. For example \commandinline{lW-S} is the part from the left wrap to the spine, which is not extended onto the bleed.
%
-% \subsubsection{Combined parts}
-% The following combined parts are defined. You can see illustrations in the Section~\ref{sec:illustration-parts}.
-% \begin{center}
-% \begin{tabular}{@{}>{\color{command}\ttfamily}l@{\hspace{1cm}}>{\color{command}\ttfamily}l@{}}
-% {\rmfamily\bfseries\textcolor{black}{background}}&{\rmfamily\bfseries\textcolor{black}{foreground}}\\
-% \hline
-% bg back and flap & back and flap\\
-% bg back and spine & back and spine\\
-% bg front and spine & front and spine\\
-% bg front and flap & front and flap\\
-% bg back and flap and spine & back and flap and spine\\
-% bg front and flap and spine & front and flap and spine\\
-% bg whole without front flap & whole without front flap\\
-% bg whole without back flap & whole without back flap\\
-% bg whole without flaps & whole without flaps\\
-% bg whole & whole\\
-% whole page &
-% \end{tabular}
-% \end{center}
+% The following figures also show the normal and abbreviated names of the blue parts.
+%
+% \subsection{Book cover widthout flaps, background parts}
+%
+% \setcounter{partfig}{1}
+% \loop
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\hfill\stepcounter{partfig}
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\par\smallskip\stepcounter{partfig}
+% \ifnum\value{partfig}<7\repeat
+%
+% \subsection{Book cover widthout flaps, foreground parts}
+%
+% \loop
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\hfill\stepcounter{partfig}
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\par\smallskip\stepcounter{partfig}
+% \ifnum\value{partfig}<13\repeat
+%
+% \subsection{Book cover widthout flaps, other parts}
+%
+% \loop
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\hfill\stepcounter{partfig}
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\par\smallskip\stepcounter{partfig}
+% \ifnum\value{partfig}<17\repeat
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\stepcounter{partfig}
+%
+% \subsection{Book cover width flaps, background parts}
+%
+% \loop
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\hfill\stepcounter{partfig}
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\par\smallskip\stepcounter{partfig}
+% \ifnum\value{partfig}<46\repeat
+%
+% \subsection{Book cover width flaps, foreground parts}
+%
+% \loop
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\hfill\stepcounter{partfig}
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\par\smallskip\stepcounter{partfig}
+% \ifnum\value{partfig}<74\repeat
+%
+% \subsection{Book cover width flaps, other parts}
+%
+% \loop
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\hfill\stepcounter{partfig}
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}\par\smallskip\stepcounter{partfig}
+% \ifnum\value{partfig}<78\repeat
+% \fbox{\includegraphics[page=\thepartfig]{figures/bookcover-parts.pdf}}
+%
+% \subsection{Defining part}
+% You can define a new rectangular part or redefine a defined part with the following commands:
+% \begin{commandlst}
+% \newbookcoverpart{!<new part>!}{!<setting>!}
+% \renewbookcoverpart{!<defined part>!}{!<setting>!}
+% \end{commandlst}
%
-% \subsection{Component types}\label{subsec:componenttypes}
-% The following component types are defined: \commandinline{color}, \commandinline{picture}, \commandinline{tikz}, \commandinline{tikz clip}, \commandinline{normal}, \commandinline{center}, \commandinline{ruler}.
-% \subsubsection[color]{Component type: \texttt{color}}
+% \medskip In \meta{setting} you have to set the new part sizes, the coordinates of its upper left corner (the origin is the upper left corner of the printed area), and the parameters of the \texttt{trimmed part} rectangle node in \texttt{tikz} and \texttt{tikz clip} component types (see in the Section~\ref{sec:componenttypes}). For this purpose, use the following commands:
% \begin{commandlst}
-% \bookcovercomponent{color}{!<part>!}{!<colors>!}
+% \setpartposx{!<coord x>!}
+% \setpartposy{!<coord y>!}
+% \setpartwidth{!<width>!}
+% \setpartheight{!<height>!}
+% \settrimmedpart{!<width minus>!}{!<height minus>!}{!<shift x>!}{!<shift y>!}
% \end{commandlst}
-% It determines the color of the part.
-%
-% \medskip\noindent
-% \meta{colors} The options of the |\fill| in the \texttt{tikz} package:\label{page:color}\\
-% \indent\commandinline{color=!<color name>!} See \meta{color name} in the \texttt{xcolor} package.\\
-% \indent\commandinline{top color=!<color name>!}\\
-% \indent\commandinline{bottom color=!<color name>!}\\
-% \indent\commandinline{middle color=!<color name>!}\\
-% \indent\commandinline{inner color=!<color name>!}\\
-% \indent\commandinline{outer color=!<color name>!}\\
-% \indent\commandinline{ball color=!<color name>!}\\
-% \indent\commandinline{shading angle=!<degree>!} It rotates the shading by the given angle.
-%
-% \pagebreak\bigskip\noindent\example
+%
+% \begin{center}
+% \includegraphics{./figures/bookcover-newpart}
+% \end{center}
+%
+% To give the previous lengths, you can use the following length commands, which are declared by the options of the document class:
+%
+% \begin{compactdesc}
+% \item[]\commandinline{\coverheight} Cover height.
+% \item[]\commandinline{\coverwidth} Front/back cover width.
+% \item[]\commandinline{\spinewidth} Spine width.
+% \item[]\commandinline{\flapwidth} Flap width.
+% \item[]\commandinline{\wrapwidth} Wrap width.
+% \item[]\commandinline{\bleedwidth} Bleed width.
+% \item[]\commandinline{\marklength} Mark length.
+% \end{compactdesc}
+%
+% \example
% \begin{examplelst}
+% \documentclass[flapwidth=3cm]{bookcover} % Also try it with flapwidth=0cm option!
+%
+% \newbookcoverpart{bg half front}{
+% \setpartposx{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\spinewidth+1.5\coverwidth}
+% \setpartposy{\marklength}
+% \setpartheight{\coverheight+2\bleedwidth}
+% \ifdim\flapwidth>0mm
+% \setpartwidth{.5\coverwidth}
+% \settrimmedpart{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
+% \else
+% \setpartwidth{.5\coverwidth+\bleedwidth}
+% \settrimmedpart{\bleedwidth}{2\bleedwidth}{0pt}{\bleedwidth}\fi}
+%
+% \begin{document}
+%
% \begin{bookcover}
-% \bookcovercomponent{color}{bg whole without flaps}{
-% top color=white, bottom color=blue!50!black, shading angle=60}
+% \bookcovercomponent{tikz}{bg half front}{
+% \fill[blue] (part.south west) rectangle (part.north east);
+% \fill[green] (trimmed part.south west) rectangle (trimmed part.north east);}
% \end{bookcover}
+%
+% \end{document}
% \end{examplelst}
%
-% \subsubsection[picture]{Component type: \texttt{picture}}
+% You can rename a defined part with the following commands:
% \begin{commandlst}
-% \bookcovercomponent{picture}{!<part>!}{!<picture file>!}
+% \newnamebookcoverpart{!<new part>!}{!<defined part>!}
+% \letnamebookcoverpart{!<new part>!}{!<defined part>!}[!<left>!,!<bottom>!,!<right>!,!<top>!]
% \end{commandlst}
-% The picture will be rescaled according to the sizes of the \meta{part}.
%
-% \bigskip\noindent\example
+% \medskip Using |\newnamebookcoverpart|, the definition of the \meta{new part} and the \meta{defined part} are always the same, even if you redefine the \meta{defined part} later with the |\renewbookcoverpart|.
+%
+% Using |\letnamebookcoverpart|, the definition of the \meta{new part} is the same as the current definition of the \meta{defined part} reduced by the \meta{left}, \meta{bottom}, \meta{right} and \meta{top} margins. If you change the \meta{defined part} later with the |\renewbookcoverpart|, the \meta{new part} doesn't change with it. The default value of every margin is \texttt{0mm}. If the \meta{left}, \meta{bottom}, \meta{right} or \meta{top} is empty or space, then its value will be \texttt{0mm}. If the value of a margin is negative, the part size will increase instead of decrease. You can use the following length commands to specify the margins:
+%
+% \begin{compactdesc}
+% \item[]\commandinline{\partheight} The height of the \meta{defined part}.
+% \item[]\commandinline{\partwidth} The width of the \meta{defined part}.
+% \item[]\commandinline{\coverheight} Cover height.
+% \item[]\commandinline{\coverwidth} Front/back cover width.
+% \item[]\commandinline{\spinewidth} Spine width.
+% \item[]\commandinline{\flapwidth} Flap width.
+% \item[]\commandinline{\wrapwidth} Wrap width.
+% \item[]\commandinline{\bleedwidth} Bleed width.
+% \item[]\commandinline{\marklength} Mark length.
+% \end{compactdesc}
+%
+% \example
% \begin{examplelst}
+% \documentclass[spinewidth=2cm]{bookcover}
+%
+% \letnamebookcoverpart{extended bg spine}{bg spine}[-\spinewidth,,-\spinewidth,]
+%
+% \begin{document}
+%
% \begin{bookcover}
-% \bookcovercomponent{picture}{bg front flap}{fig.png}
+% \bookcovercomponent{color}{bg whole}{blue}
+% \bookcovercomponent{color}{extended bg spine}{opacity=0.5}
% \end{bookcover}
+%
+% \end{document}
% \end{examplelst}
%
-% \subsubsection[tikz]{Component type: \texttt{tikz}}
-% \begin{commandlst}
-% \bookcovercomponent{tikz}{!<part>!}{!<tikz code>!}
-% \end{commandlst}
-% The origin of the Ti\emph{k}Z figure is the lower left corner of the \meta{part}. Two rectangle nodes come into being: \commandinline{part} and \commandinline{trimmed part}. (Thank Zunbeltz Izaola for the idea.)
+% \section{Book cover component types}\label{sec:componenttypes}
+%
+% Predefined \meta{component type}: \commandinline{color}, \commandinline{tikz}, \commandinline{tikz clip}, \commandinline{picture}, \commandinline{normal}, \commandinline{center}, \commandinline{ruler}.
+%
+% \subsection{The color component type}
+% It determines the color of the \meta{part}. The \meta{content} is the options of the |\fill| in the \texttt{tikz} package:
+% \begin{compactdesc}
+% \item[]\commandinline{!<color name>!} (See it in the \texttt{xcolor} package.)
+% \item[]\commandinline{color=!<color name>!} (It is equivalent to the previous one.)
+% \item[]\commandinline{top color=!<color name>!}
+% \item[]\commandinline{bottom color=!<color name>!}
+% \item[]\commandinline{middle color=!<color name>!}
+% \item[]\commandinline{inner color=!<color name>!}
+% \item[]\commandinline{outer color=!<color name>!}
+% \item[]\commandinline{ball color=!<color name>!}
+% \item[]\commandinline{shading angle=!<degree>!} It rotates the shading by the given angle.
+% \item[]\commandinline{opacity=!<value>!} Sets the filling opacity. The \meta{value} is between 0 and 1.
+% \end{compactdesc}
+%
+% \example
+% \begin{examplelst}
+% \begin{bookcover}
+% \bookcovercomponent{color}{bg front}{red}
+% \bookcovercomponent{color}{bg back}{
+% top color=white, bottom color=blue!50!black, shading angle=60}
+% \end{bookcover}
+% \end{examplelst}
%
-% \bigskip\noindent\example
+% \subsection{The tikz component type}
+% The \meta{content} is a Ti\emph{k}Z code without |\tikz| command and |tikzpicture| environment. The origin of the Ti\emph{k}Z figure is the lower left corner of the \meta{part}. Two rectangle nodes come into being: \commandinline{part} and \commandinline{trimmed part}. (Thanks to Zunbeltz Izaola for the idea.)
+%
+% \begin{minipage}{\textwidth}
+% \example
% \begin{examplelst}
% \begin{bookcover}
% \bookcovercomponent{tikz}{bg whole}{
-% \fill[yellow] (part.south west) rectangle (part.north east);
-% \fill[gray] (trimmed part.south east) rectangle (trimmed part.north west);
-% \draw[green] (0,0) circle [radius=10mm];}
-% \bookcovercomponent{tikz}{bg spine}{
-% \fill[orange] (part.center) circle [radius=8mm];}
+% \fill[black] (part.south west) rectangle (part.north east);
+% \fill[gray] (trimmed part.south east) rectangle (trimmed part.north west);}
+% \bookcovercomponent{tikz}{bg front}{
+% \fill[blue] (part.south west) -- (part.center) -- (part.north west) -- cycle;}
% \end{bookcover}
% \end{examplelst}
+% \end{minipage}
% \begin{center}
-% \setlength{\fboxsep}{0pt}\setlength{\fboxrule}{.4pt}
-% \fcolorbox{black!50}{white}{\includegraphics{figures/tikz}}
+% \fcolorbox{black!50}{white}{\includegraphics{figures/bookcover-tikz}}
% \end{center}
%
-% \subsubsection[tikz clip]{Component type: \texttt{tikz clip}}
-% \begin{commandlst}
-% \bookcovercomponent{tikz clip}{!<part>!}{!<tikz code>!}
-% \end{commandlst}
-% It works the same as the \texttt{tikz} component type, but it clips the \meta{part}.
+% \subsection{The tikz clip component type}
+% It works the same way as the \texttt{tikz} component type, but it clips the \meta{part}.
%
-% \bigskip\noindent\example
+% \example
% \begin{examplelst}
% \begin{bookcover}
-% \bookcovercomponent{tikz clip}{bg whole}{
-% \fill[yellow] (part.south west) rectangle (part.north east);
-% \fill[gray] (trimmed part.south east) rectangle (trimmed part.north west);
-% \draw[green] (0,0) circle [radius=10mm];}
-% \bookcovercomponent{tikz clip}{bg spine}{
-% \fill[orange] (part.center) circle [radius=8mm];}
+% \bookcovercomponent{tikz clip}{front}{
+% \fill[blue] (part.west) circle [radius=8mm];}
+% \bookcovercomponent{tikz}{front}{
+% \fill[gray] (part.west) circle [radius=4mm];}
% \end{bookcover}
% \end{examplelst}
% \begin{center}
-% \setlength{\fboxsep}{0pt}\setlength{\fboxrule}{.4pt}
-% \fcolorbox{black!50}{white}{\includegraphics{figures/tikzclip}}
+% \fcolorbox{black!50}{white}{\includegraphics{figures/bookcover-tikzclip}}
% \end{center}
%
-% \subsubsection[normal]{Component type: \texttt{normal}}
-% \begin{commandlst}
-% \bookcovercomponent{normal}{!<part>!}{!<content>!}
-% \end{commandlst}
+% \subsection{The picture component type}
+% The \meta{content} is a picture file, which will be rescaled according to the sizes of the \meta{part}.
+%
+% \example
+% \begin{examplelst}
+% \begin{bookcover}
+% \bookcovercomponent{picture}{bg whole}{fig.png}
+% \end{bookcover}
+% \end{examplelst}
+%
+% \subsection{The normal component type}
% In this case, the \meta{content} is not specific. You can choose it as text or picture etc.
%
-% \bigskip\noindent\example
+% \example
% \begin{examplelst}
% \begin{bookcover}
-% \bookcovercomponent{normal}{front}{
-% \vspace{5cm}
-% \begin{center}
-% {\bfseries\huge Book title}\\[5mm]
-% \includegraphics[width=6cm]{fig.png}
-% \end{center}}
+% \bookcovercomponent{normal}{front}[,,,5cm]{
+% \centering
+% {\bfseries\huge Book title}\\[5mm]
+% \includegraphics[width=0.4\partwidth]{fig.png}\\}
% \end{bookcover}
% \end{examplelst}
%
-% \subsubsection[center]{Component type: \texttt{center}}
-% \begin{commandlst}
-% \bookcovercomponent{center}{!<part>!}{!<content>!}
-% \end{commandlst}
-% It works the same as the \texttt{normal} component type, but the position of the content is the center of the part (horizontally and vertically).
+% \subsection{The center component type}
+% It works the same way as the \texttt{normal} component type, but the position of the content is the center of the part horizontally and vertically.
%
-% \bigskip\noindent\example
+% \example
% \begin{examplelst}
% \begin{bookcover}
% \bookcovercomponent{center}{above front}{
-% \color{blue}Remark above front}
+% \textcolor{blue}{Remark above front}}
% \bookcovercomponent{center}{spine}{
-% \rotatebox[origin=c]{90}{\bfseries\Large Book title}}
+% \rotatebox[origin=c]{-90}{\bfseries\Large Book title}}
% \end{bookcover}
% \end{examplelst}
%
-% \subsubsection[ruler]{Component type: \texttt{ruler}}
-% Use the \texttt{ruler} component type to check the sizes of the part.
+% \subsection{The ruler component type}
+% Use the \texttt{ruler} component type to check the dimensions of the part. It draws a square ruler at the borders of the part. The \meta{content} is
% \begin{commandlst}
-% \bookcovercomponent{ruler}{!<part>!}{\setruler[!<unit>!]{!<coordsys>!}{!<shift x>!}{!<shift y>!}{!<color>!}}
+% !<unit>!,!<origin>!,!<color name>!
% \end{commandlst}
-% \meta{unit} The ruler unit:\\
-% \indent\commandinline{cm} Metric ruler (centimeter). Default value.\\
-% \indent\commandinline{in} English ruler (inch).
-%
-% \medskip\noindent
-% \meta{coordsys} The type of the coordinate system:\\
-% \indent\commandinline{upper left } The origin is the upper left corner of the part.\\
-% \indent\commandinline{upper right} The origin is the upper right corner of the part.\\
-% \indent\commandinline{lower left } The origin is the lower left corner of the part.\\
-% \indent\commandinline{lower right} The origin is the lower right corner of the part.
-%
-% \medskip\noindent
-% \meta{shift x},\meta{shift y} Moving the origin of the ruler to the vector (\meta{shift x},\meta{shift y}).
%
-% \medskip\noindent
-% \meta{color} The color of the ruler.
-%
-% \pagebreak\bigskip\noindent\example
+% \begin{description}
+% \item[]\meta{unit} The ruler unit:
+% \begin{compactdesc}
+% \item[]\commandinline{cm} Metric ruler (centimeter). If the \meta{unit} is empty or space, then its value will be \texttt{cm}.
+% \item[]\commandinline{in} English ruler (inch).
+% \end{compactdesc}
+%
+% \item[]\meta{origin} The origin of the square ruler:
+% \begin{compactdesc}
+% \item[]\commandinline{upperleft } The origin is the upper left corner of the part. Directions: down and right. If the \meta{origin} is empty or space, then its value will be \texttt{upperleft}.
+% \item[]\commandinline{upperright} The origin is the upper right corner of the part. Directions: down and left.
+% \item[]\commandinline{lowerleft } The origin is the lower left corner of the part. Directions: up and right.
+% \item[]\commandinline{lowerright} The origin is the lower right corner of the part. Directions: up and left.
+% \end{compactdesc}
+%
+% \item[]\meta{color name} The color of the ruler. If it is empty or space, then its value will be the color of the marks.
+% \end{description}
+%
+% \example
% \begin{examplelst}
% \begin{bookcover}
-% \bookcovercomponent{ruler}{back}{\setruler{upper left}{0cm}{0cm}{blue}}
-% \bookcovercomponent{ruler}{back}{\setruler{upper left}{2cm}{1cm}{black}}
-% \bookcovercomponent{ruler}{front}{\setruler{lower right}{0cm}{0cm}{green}}
-% \bookcovercomponent{ruler}{front}{\setruler{lower right}{2cm}{1cm}{gray}}
+% \bookcovercomponent{ruler}{back}{,,}
+% \bookcovercomponent{ruler}{back}[2cm,,,1cm]{,,blue}
+% \bookcovercomponent{ruler}{front}{,lowerright,green}
+% \bookcovercomponent{ruler}{front}[,1cm,2cm,]{,lowerright,gray}
% \end{bookcover}
% \end{examplelst}
% \begin{center}
-% \setlength{\fboxsep}{0pt}\setlength{\fboxrule}{.4pt}
-% \fcolorbox{black!50}{white}{\includegraphics{figures/ruler}}
+% \fcolorbox{black!50}{white}{\includegraphics{figures/bookcover-ruler}}
% \end{center}
%
% \subsection{Defining component type}
% You can define a new component type, redefine or rename a defined component type with the following commands:
% \begin{commandlst}
-% \newbookcovercomponenttype{!<new component type name>!}{!<formatting>!}
-% \renewbookcovercomponenttype{!<defined component type name>!}{!<formatting>!}
-% \newnamebookcovercomponenttype{!<new component type name>!}{!<defined component type name>!}
+% \newbookcovercomponenttype{!<new component type>!}{!<formatting>!}
+% \renewbookcovercomponenttype{!<defined component type>!}{!<formatting>!}
+% \newnamebookcovercomponenttype{!<new component type>!}{!<defined component type>!}
+% \letnamebookcovercomponenttype{!<new component type>!}{!<defined component type>!}
% \end{commandlst}
+%
+% \medskip Using |\newnamebookcovercomponenttype|, the definition of the \meta{new component type} and the \meta{defined component type} are always the same, even if you redefine the \meta{defined component type} later with the |\renewbookcovercomponenttype|.
+%
+% Using |\letnamebookcovercomponenttype|, the definition of the \meta{new component type} is the same as the current definition of the \meta{defined component type}. If you change the \meta{defined component type} later with |\renewbookcovercomponenttype|, the \meta{new component type} doesn't change with it.
+%
% You can use the following length commands in \meta{formatting}:
%
-% \medskip\noindent
-% \commandinline{\partwidth } Width of the part.\\
-% \commandinline{\partheight } Height of the part.
+% \begin{compactdesc}
+% \item[]\commandinline{\partwidth} The width of the part (reduced by the margins) in which you are using the defined component type.
+% \item[]\commandinline{\partheight} The height of the part (reduced by the margins) in which you are using the defined component type.
+% \end{compactdesc}
%
-% \bigskip\noindent
% You have to referrence the content as \verb|#1|.
%
-% \bigskip\noindent\example
+% \example
% \begin{examplelst}
-% \documentclass[spinewidth=1cm]{bookcover}
-% \newbookcovercomponenttype{center rotate}{
-% \parbox[t][\partheight][c]{\partwidth}{
-% \begin{center}
-% \rotatebox[origin=c]{90}{#1}
-% \end{center}}}
+% \documentclass{bookcover}
+% \newbookcovercomponenttype{center picture}{
+% \vfill
+% \centering
+% \includegraphics[width=0.5\partwidth]{#1}
+% \vfill}
% \begin{document}
% \begin{bookcover}
-% \bookcovercomponent{center rotate}{spine}{Author -- Book title}
+% \bookcovercomponent{center picture}{front}{fig.pdf}
% \end{bookcover}
% \end{document}
% \end{examplelst}
%
-% \subsection{Defining part}
-% You can define a new part, redefine or rename a defined part with the following commands:
-% \begin{commandlst}
-% \newbookcoverpart{!<new part name>!}{!<setting>!}
-% \renewbookcoverpart{!<defined part name>!}{!<setting>!}
-% \newnamebookcoverpart{!<new part name>!}{!<defined part name>!}
-% \end{commandlst}
-% In \meta{setting} you have to set the new part sizes, the coordinates of its upper left corner (the origin is the upper left corner of the printed box), and the parameters of the \texttt{trimmed part} rectangle node in \texttt{tikz} and \texttt{tikz clip} component types. For this purpose, use the following commands:
-% \begin{commandlst}
-% \setpartposx{!<coord x>!}
-% \setpartposy{!<coord y>!}
-% \setpartwidth{!<width>!}
-% \setpartheight{!<height>!}
-% \settrimmedpart{!<width minus>!}{!<height minus>!}{!<shift x>!}{!<shift y>!}
-% \end{commandlst}
-%
-%\begin{center}
-%\includegraphics{./figures/newpart}
-%\end{center}
+% \newpage\section{Examples}
%
-% \noindent To give the previous lengths, you can use the following length commands:
+% \subsection{Barcode and QR code}
%
-% \medskip\noindent
-% \commandinline{\marklength \bleedwidth \flapwidth \coverwidth \spinewidth \coverheight}
+% \begin{center}
+% \fcolorbox{black!50}{white}{\includegraphics[width=\textwidth-.8pt]{figures/bookcover-barcode}}
+% \end{center}
%
-% \bigskip\noindent\example
% \begin{examplelst}
-% \documentclass[flapwidth=3cm]{bookcover}
-% \newbookcoverpart{bg half front}{
-% \setpartposx{\marklength+\bleedwidth+\flapwidth+\spinewidth+1.5\coverwidth}
-% \setpartposy{\marklength}
-% \setpartheight{\coverheight+2\bleedwidth}
-% \ifdim\flapwidth>0mm
-% \setpartwidth{.5\coverwidth}
-% \settrimmedpart{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
-% \else
-% \setpartwidth{.5\coverwidth+\bleedwidth}
-% \settrimmedpart{\bleedwidth}{2\bleedwidth}{0pt}{\bleedwidth}\fi}
+% \documentclass[spinewidth=15mm]{bookcover}
+% \usepackage{GS1,qrcode}
+%
% \begin{document}
+%
% \begin{bookcover}
-% \bookcovercomponent{tikz}{bg half front}{
-% \fill[blue] (part.south west) rectangle (part.north east);
-% \fill[green] (trimmed part.south west) rectangle (trimmed part.north east);}
+%
+% \bookcovercomponent{color}{bg whole}{blue!50}
+%
+% \bookcovercomponent{normal}{back}[,1cm,,]{
+% \vfill
+% \centering
+% \savebox0{\EANBarcode[module_height=25mm]{ISBN 978-615-5297-19-9}}
+% \colorbox{white}{%
+% \usebox0
+% \raisebox{\depth}{\qrcode[height=\ht0]{https://www.ctan.org/pkg/bookcover}}}}
+%
% \end{bookcover}
+%
% \end{document}
% \end{examplelst}
%
-% \includepdfset{nup=2x5,delta=4mm 4mm,noautoscale,frame}
-% \includepdf[pages=1-10,pagecommand={\section{Illustration of the predefined parts}\label{sec:illustration-parts}\subsection{Background parts (cover width flaps)}}]{figures/parts.pdf}
-% \includepdf[pages=11-16,pagecommand={}]{figures/parts.pdf}
-% \includepdf[pages=36-42,pagecommand={\subsection{Background parts (cover widthout flaps)}}]{figures/parts.pdf}
-% \includepdf[pages=17-26,pagecommand={\subsection{Foreground parts (cover width flaps)}}]{figures/parts.pdf}
-% \includepdf[pages=27-35,pagecommand={}]{figures/parts.pdf}
-% \includepdf[pages=43-52,pagecommand={\subsection{Foreground parts (cover widthout flaps)}}]{figures/parts.pdf}
+% \newpage\subsection{Description}\label{subsec:desc}
%
-% \newpage\section{Full examples}
-% \subsection{A dust jacket}
-% \lstinputlisting[style=examplefile]{bookcover-example1.tex}
-% \begin{center}
-% \setlength{\fboxsep}{0pt}\setlength{\fboxrule}{.4pt}
-% \fcolorbox{black!50}{white}{\includegraphics[width=\textwidth-.8pt]{bookcover-example1}}\label{page:example1}
-% \end{center}
-%
-% \subsection{A two-sided book cover}
-% \lstinputlisting[style=examplefile]{bookcover-example2.tex}
% \begin{center}
-% \setlength{\fboxsep}{0pt}\setlength{\fboxrule}{.4pt}%
-% \fcolorbox{black!50}{white}{\includegraphics[page=1,width=\textwidth-.8pt]{bookcover-example2}}\\[5mm]
-% \fcolorbox{black!50}{white}{\includegraphics[page=2,width=\textwidth-.8pt]{bookcover-example2}}
+% \fcolorbox{black!50}{white}{\includegraphics[page=1,width=\textwidth-.8pt]{figures/bookcover-description}}\\[5mm]
+% \fcolorbox{black!50}{white}{\includegraphics[page=2,width=\textwidth-.8pt]{figures/bookcover-description}}
% \end{center}
%
-% \newpage\subsection{Barcode}
+% \newpage
% \begin{examplelst}
-% \documentclass{bookcover}
-% \usepackage{pst-barcode}
+% \documentclass[markcolor=black,spinewidth=15mm]{bookcover}
+%
+% \usepackage[english]{babel}
+% \usepackage{kantlipsum,multicol,microtype}
+% \bookcoverdescgeometry{vmargin=25mm,hmargin=9cm}
+%
% \begin{document}
-% \begin{bookcover}
-% \bookcovercomponent{normal}{back}{
-% \vfill
-% \centering
-% \begin{pspicture}(1.5in,1in)
-% \psbarcode{1787-6117}{includetext height=1 width=1.5}{issn}
-% \end{pspicture}
-% \vspace{5mm}}
+%
+% % Description text
+% \begin{bookcoverdescription}
+% \title{Description}
+% \author{John Taylor}
+% \date{}
+% \maketitle
+% \begin{multicols}{3}
+% \kant[1-5]
+% \end{multicols}
+% \end{bookcoverdescription}
+%
+% % Book cover
+% \begin{bookcover}
+% \bookcovercomponent{center}{front}{\Huge BOOK TITLE}
% \end{bookcover}
+%
% \end{document}
% \end{examplelst}
%
-% \noindent You can compile this file with \texttt{latex.exe} or \texttt{xelatex.exe}. Using \texttt{pdflatex.exe} or \texttt{lualatex.exe}, write the following code into the preamble:
-% \begin{examplelst}
-% \usepackage[pdfcrop={-hires}]{auto-pst-pdf}
-% \end{examplelst}
-% In this case, the command to compile this file is the following:
+% \newpage\subsection{Usage of margins}
%
-% \medskip\texttt{pdflatex -shell-escape filename}\\
-% or
-%
-% \texttt{lualatex -shell-escape filename}
-%
-% \bigskip
% \begin{center}
-% \setlength{\fboxsep}{0pt}\setlength{\fboxrule}{.4pt}
-% \fcolorbox{black!50}{white}{\includegraphics[width=\textwidth-.8pt]{figures/barcode}}
+% \fcolorbox{black!50}{white}{\includegraphics[width=\textwidth-.8pt]{figures/bookcover-margins}}
% \end{center}
%
-% \newpage\section{Obsolete method}
+% \begin{examplelst}
+% \documentclass[spinewidth=30mm]{bookcover}
+% \begin{document}
%
-% {\large\bfseries\color{red}The goal of the \emph{obsolete method} is to be compatible with the early versions of the \texttt{bookcover}. It is not recommended to use it in the future, because the method described in the Section~\begin{NoHyper}\ref{sec:mainmethod}\end{NoHyper} is much more flexible!\par}
+% \begin{bookcover}
+% \bookcovercomponent{color}{bg whole}{gray}
+% \bookcovercomponent{color}{back}{blue}
+% \bookcovercomponent{color}{back}[5mm,5mm,5mm,5mm]{blue!50}
+% \bookcovercomponent{color}{front}{red}
+% \bookcovercomponent{color}{front}[5mm,5mm,5mm,5mm]{red!50}
+% \bookcovercomponent{color}{spine}{green!50!black}
+% \bookcovercomponent{color}{spine}[5mm,5mm,5mm,5mm]{green!50}
+% \bookcovercomponent{color}{spine}
+% [-\spinewidth,15mm,-\spinewidth,\partheight-\spinewidth-15mm]{opacity=0.5}
+% \end{bookcover}
%
-% \subsection{Commands}
+% \end{document}
+% \end{examplelst}
%
-% \textbf{Background colors}
-% \begin{commandlst}
-% \setbookcover{bgcolor}{!<background part>!}{!<colors>!}
-% \end{commandlst}
-% See the \meta{background part} in Subsubsection \ref{subsubsec:background} and the \meta{colors} in the page \pageref{page:color}.
+% or its equivalent
%
-% \bigskip\noindent\textbf{Background pictures}
-% \begin{commandlst}
-% \setbookcover{bgpic}{!<background part>!}{!<picture file>!}
-% \end{commandlst}
-% See the \meta{background part} in Subsubsection \ref{subsubsec:background}. The picture will be rescaled according to the sizes of the current background part.
-%
-% \bigskip\noindent\textbf{Background Ti\emph{k}Z figures}
-% \begin{commandlst}
-% \setbookcover{bgtikz}{!<background part>!}{!<tikz code>!}
-% \end{commandlst}
-% See the \meta{background part} in Subsubsection \ref{subsubsec:background}. The Ti\emph{k}Z figure will be placed to the upper left corner of the current background part, without resizing.
-% Using the option \texttt{bgtikznodes} of the document class:
+% \bigskip
+% \begin{examplelst}
+% \documentclass[spinewidth=30mm]{bookcover}
%
-% \begin{itemize}
-% \item the origin moves to the lower left corner of the current background part;
-% \item two rectangle nodes come into being: \commandinline{part} and \commandinline{trimmed part}.
-% \end{itemize}
+% \letnamebookcoverpart{back typing area}{back}[5mm,5mm,5mm,5mm]
+% \letnamebookcoverpart{front typing area}{front}[5mm,5mm,5mm,5mm]
+% \letnamebookcoverpart{spine typing area}{spine}[5mm,5mm,5mm,5mm]
+% \letnamebookcoverpart{spine bottom}{spine}
+% [-\spinewidth,15mm,-\spinewidth,\partheight-\spinewidth-15mm]
%
-% \noindent The option \texttt{bgtikzclip} of the document class works the same as \texttt{bgtikznodes}, but it clips the current part.
+% \begin{document}
%
-% \bigskip\noindent\textbf{First foreground}
-% \begin{commandlst}
-% \setbookcover{fgfirst}{!<foreground part>!}{!<content>!}
-% \end{commandlst}
-% See the \meta{foreground part} in Subsubsection \ref{subsubsec:foreground}. The first foreground is the top layer of the book cover (see Subsection \ref{subsec:layers}).
+% \begin{bookcover}
+% \bookcovercomponent{color}{bg whole}{gray}
+% \bookcovercomponent{color}{back}{blue}
+% \bookcovercomponent{color}{back typing area}{blue!50}
+% \bookcovercomponent{color}{front}{red}
+% \bookcovercomponent{color}{front typing area}{red!50}
+% \bookcovercomponent{color}{spine}{green!50!black}
+% \bookcovercomponent{color}{spine typing area}{green!50}
+% \bookcovercomponent{color}{spine bottom}{opacity=0.5}
+% \end{bookcover}
%
-% \bigskip\noindent\textbf{Second foreground}
-% \begin{commandlst}
-% \setbookcover{fgsecond}{!<foreground part>!}{!<content>!}
-% \end{commandlst}
-% See the \meta{foreground part} in Subsubsection \ref{subsubsec:foreground}. The second foreground is under the first foreground (see Subsection \ref{subsec:layers}).
+% \end{document}
+% \end{examplelst}
%
-% \bigskip\noindent\textbf{Making book cover}
-% \begin{commandlst}
-% \makebookcover
-% \end{commandlst}
-% This command makes the book cover by using the contents of the background and foreground.
+% \newpage\subsection{A dust jacket}
%
-% \subsection{Parts in the obsolete method}
-% \subsubsection{Background parts}\label{subsubsec:background}
-% \begin{center}
-% \textbf{With flaps}\\*[0pt]
-% \includegraphics{figures/background1}\\[2mm]
-% \includegraphics{figures/background2}\\[2mm]
-% \includegraphics{figures/background3}
-% \end{center}
% \begin{center}
-% \textbf{Without flaps}\\*[0pt]
-% \includegraphics{figures/background4}\\[2mm]
-% \includegraphics{figures/background5}
+% \fcolorbox{black!50}{white}{\includegraphics[width=\textwidth-.8pt]{bookcover-example1}}
% \end{center}
+% \lstinputlisting[style=examplefile]{bookcover-example1.tex}
+%
+% \newpage\subsection{A two-sided book cover}\label{subsec-two-sided-example}
%
-% \subsubsection{Foreground parts}\label{subsubsec:foreground}
% \begin{center}
-% \textbf{With flaps}\\*[0pt]
-% \includegraphics{figures/foreground1}
+% \fcolorbox{black!50}{white}{\includegraphics[page=1,width=\textwidth-.8pt]{bookcover-example2}}\\[5mm]
+% \fcolorbox{black!50}{white}{\includegraphics[page=2,width=\textwidth-.8pt]{bookcover-example2}}
% \end{center}
+% \lstinputlisting[style=examplefile]{bookcover-example2.tex}
+%
+% \newpage\subsection{Trimming and checking dimensions}\label{subsec:trimming}
+%
% \begin{center}
-% \textbf{Without flaps}\\*[0pt]
-% \includegraphics{figures/foreground2}
+% \fcolorbox{black!50}{white}{\includegraphics[page=1,width=\textwidth-.8pt]{figures/bookcover-trimming}}\\[5mm]
+% \fcolorbox{black!50}{white}{\includegraphics[page=2,width=\textwidth-.8pt]{figures/bookcover-trimming}}
% \end{center}
-% The other name of \texttt{above front} is \texttt{remark}.
%
-% \subsection{Layers}\label{subsec:layers}
-% In the following table we can see the hierarchy of the layers:
+% This example shows the usage of the \texttt{trimmed} option and the |\bookcovertrimmedpart| command. These allow you to view the finished product for demonstration purposes. We also check the cover dimensions. Set the value of the \texttt{trimmed} option \texttt{false} and clear \texttt{ruler} component type before printing!
+%
+% \bigskip
+% \begin{examplelst}
+% \documentclass[
+% spinewidth=15mm,
+% markcolor=black,
+% trimmed,
+% trimmingcolor=gray,
+% ]{bookcover}
+%
+% \usepackage[latin]{babel}
+% \usepackage{lipsum,microtype}
+%
+% \begin{document}
+%
+% % Trimmed outside cover
+% \begin{bookcover}
+%
+% \bookcovercomponent{color}{bg whole}{
+% top color=white, bottom color=green!30!black}
+%
+% \bookcovercomponent{normal}{front}[22mm,60mm,22mm,70mm]{
+% \centering
+% {\huge\bfseries ANNALES\\ INFORMATICAE\par}
+% \vfill
+% {\large\bfseries TOMUS 43.~(2020)}
+% \vfill
+% {\large COMMISSIO REDACTORIUM}\\[3mm]
+% \lipsum[2]}
+%
+% \bookcovercomponent{normal}{back}[22mm,10mm,22mm,30mm]{
+% {\centering\large ABSTRACTUM\\[5mm]}
+% \lipsum[1-4]}
+%
+% \bookcovercomponent{center}{spine}{
+% \rotatebox[origin=c]{-90}{\footnotesize\bfseries
+% ANNALES INFORMATICAE 43.~(2020)}}
+%
+% \bookcovercomponent{ruler}{whole}{,,} % Check dimensions
+%
+% \end{bookcover}
+%
+% % Trimmed inside back cover
+% \setbookcover{trimmingcolor=black,markcolor=white}
+% \bookcovertrimmedpart{inside back}
+%
+% \begin{bookcover}
+%
+% \bookcovercomponent{normal}{inside back}[22mm,10mm,22mm,30mm]{
+% {\centering\large GRATULATIO\\[5mm]}
+% \lipsum[1-4]}
+%
+% \end{bookcover}
+%
+% \end{document}
+% \end{examplelst}
+%
+% \newpage\subsection{A book cover with folding margin for hardcover book}
+%
% \begin{center}
-% \begin{tabular}{@{}ll@{}c@{}}
-% \cline{1-2}
-% \multirow{2}*{|fgfirst|} & |above front|, |below front|, |above back|, |below back|& \color{layer}top layer\\
-% & |back|, |front|, |spine|, |front flap|, |back flap| &\color{layer}$\uparrow$\\
-% \cline{1-2}
-% |fgsecond| & |back|, |front|, |spine|, |front flap|, |back flap|&\color{layer}$\uparrow$\\
-% \cline{1-2}
-% & |back|, |front|, |spine|, |front flap|, |back flap| &\color{layer}$\uparrow$\\
-% |bgtikz| & |whole without flaps| &\color{layer}$\uparrow$\\
-% & |whole| &\color{layer}$\uparrow$\\
-% \cline{1-2}
-% & |back|, |front|, |spine|, |front flap|, |back flap| &\color{layer}$\uparrow$\\
-% |bgpic| & |whole without flaps| &\color{layer}$\uparrow$\\
-% & |whole| &\color{layer}$\uparrow$\\
-% \cline{1-2}
-% & |back|, |front|, |spine|, |front flap|, |back flap| &\color{layer}$\uparrow$\\
-% |bgcolor| & |whole without flaps| &\color{layer}$\uparrow$\\
-% & |whole| & \color{layer}bottom layer\\
-% \cline{1-2}
-% \end{tabular}
+% \fcolorbox{black!50}{white}{\includegraphics[width=\textwidth-.8pt]{figures/bookcover-foldingmargin}}
% \end{center}
%
-% \subsection{Example}
-% See the figure in the page \pageref{page:example1}.
-% \lstinputlisting[style=examplefile]{bookcover-example-obsoletemethod.tex}
+% \begin{examplelst}
+% \documentclass[
+% coverwidth=150mm,
+% coverheight=220mm,
+% spinewidth=25mm,
+% bleedwidth=20mm,
+% markcolor=black,
+% foldingmargin,
+% 12pt,
+% % trimmed % Show only trimmed part!
+% ]{bookcover}
+%
+% %\bookcovertrimmedpart{front} % Trimmed part is the front cover
+% %\bookcovertrimmedpart{back} % Trimmed part is the back cover
+% %\bookcovertrimmedpart{spine} % Trimmed part is the spine
+%
+% \letnamebookcoverpart{front with margin}{front}[5mm,5mm,5mm,5mm]
+% \letnamebookcoverpart{front upper third}{front with margin}[,2\partheight/3,,]
+% \letnamebookcoverpart{front lower third}{front with margin}[,,,2\partheight/3]
+% \letnamebookcoverpart{back with margin}{back}[5mm,5mm,5mm,5mm]
+% \letnamebookcoverpart{back text area}{back}[27mm,,22mm,27mm]
+% \letnamebookcoverpart{bg spine bottom}{bg spine}[,,,\partheight-\bleedwidth-\spinewidth]
+%
+% \newbookcovercomponenttype{center rotate}{
+% \vfill\centering\rotatebox[origin=c]{-90}{#1}\vfill}
+%
+% \usepackage[english]{babel}
+% \usepackage{kantlipsum,microtype}
+% \usepackage{transparent} % It works only with pdflatex
+%
+% \begin{document}
+%
+% \begin{bookcover}
+%
+% \bookcovercomponent{color}{bg whole}{orange}
+%
+% \bookcovercomponent{color}{front upper third}{red!60!black}
+%
+% \bookcovercomponent{color}{front lower third}{red!60!black}
+%
+% \bookcovercomponent{color}{back with margin}{red!60!black}
+%
+% \bookcovercomponent{tikz}{front with margin}{
+% \draw[opacity=0.4,red,line width=10mm] (\partwidth-15mm,0) -- +(0,\partheight);}
+%
+% \bookcovercomponent{tikz}{back with margin}{
+% \draw[opacity=0.4,red,line width=10mm] (15mm,0) -- +(0,\partheight);}
+%
+% \bookcovercomponent{tikz}{whole}[5mm,,5mm,]{
+% \draw[opacity=0.4,red,line width=10mm] (0,\partheight-20mm) -- +(\partwidth,0);}
+%
+% \bookcovercomponent{color}{bg spine bottom}{black}
+%
+% \bookcovercomponent{center}{front upper third}{
+% \resizebox*{\partwidth-5mm}{\partheight-5mm}{%
+% \color{white}\transparent{0.1}\bfseries\LaTeX}}
+%
+% \bookcovercomponent{center}{front lower third}{
+% \resizebox*{\partwidth-5mm}{\partheight-5mm}{%
+% \color{white}\transparent{0.1}\bfseries\LaTeX}}
+%
+% \bookcovercomponent{center}{front}{
+% \resizebox{90mm}{!}{\bfseries\color{white}\LaTeX}}
+%
+% \bookcovercomponent{normal}{back text area}{\color{white}\kant[1-2]}
+%
+% \bookcovercomponent{center rotate}{spine}{
+% \resizebox{50mm}{!}{\bfseries\color{white}\LaTeX}}
+%
+% \end{bookcover}
+%
+% \end{document}
+% \end{examplelst}
%
% \StopEventually{}
%
% \begin{macrocode}
-%%
+
%% OPTIONS
+
\RequirePackage{kvoptions}
\SetupKeyvalOptions{family=bookcover,prefix=bookcover@}
\DeclareVoidOption{10pt}{\PassOptionsToClass{10pt}{article}}
@@ -649,42 +901,52 @@
\DeclareStringOption[240mm]{coverheight}
\DeclareStringOption[5mm]{spinewidth}
\DeclareStringOption[0mm]{flapwidth}
+\DeclareStringOption[0mm]{wrapwidth}
\DeclareStringOption[10mm]{marklength}
\DeclareStringOption[.4pt]{markthick}
\DeclareStringOption[5mm]{bleedwidth}
\DeclareStringOption[red]{markcolor}
+\DeclareStringOption[white]{pagecolor}
+\DeclareStringOption[white]{trimmingcolor}
\DeclareBoolOption[false]{trimmed}
-\DeclareBoolOption[false]{bgtikznodes}% for obsolete method
-\DeclareBoolOption[false]{bgtikzclip}% for obsolete method
+\DeclareBoolOption[false]{foldingmargin}
+\DeclareBoolOption[false]{bgtikznodes}% for old method
+\DeclareBoolOption[false]{bgtikzclip}% for old method
\ProcessKeyvalOptions{bookcover}
-\ifbookcover@bgtikzclip\bookcover@bgtikznodestrue\fi% for obsolete method
%% CLASS AND PACKAGES
-%%
-%% Don't use 'absolute' option of 'textpos'! It causes problems in some cases:
-%% xelatex.exe + pst-barcode
-%% pdflatex.exe or lualatex.exe + pst-barcode + auto-pst-pdf
-%%
+
\LoadClass{article}
-\RequirePackage{textpos,geometry,graphicx,calc,ifthen,tikz}
+\@ifundefined{AddToHook}{\RequirePackage{lthooks,picture}}{}% for LaTeX format older than 2020/10/01
+\RequirePackage{geometry,graphicx,calc,tikz,xparse,etoolbox}
\RequirePackage[nonefgrulers]{fgruler}
%% PAGE STYLE
+
\pagestyle{empty}
+\def\ps@plain{}
%% NEW IF
+
\newif\if@inbookcoverenv
%% USER LENGTHS
+
\newlength{\coverwidth}
\newlength{\coverheight}
\newlength{\spinewidth}
\newlength{\flapwidth}
+\newlength{\wrapwidth}
\newlength{\marklength}
\newlength{\markthick}
\newlength{\bleedwidth}
%% INTERNAL LENGTHS
+
+\newlength{\bookcover@templength@a}
+\newlength{\bookcover@templength@b}
+\newlength{\bookcover@templength@c}
+\newlength{\bookcover@templength@d}
\newlength{\bookcover@xpos@}
\newlength{\bookcover@ypos@}
\newlength{\bookcover@partwidth@}
@@ -693,231 +955,276 @@
\newlength{\bookcover@tikz@trimmed@part@height@minus}
\newlength{\bookcover@tikz@trimmed@part@push@right}
\newlength{\bookcover@tikz@trimmed@part@push@up}
-\newlength{\bookcover@rulerwidth@}
-\newlength{\bookcover@rulerheight@}
\let\partheight\bookcover@partheight@
\let\partwidth\bookcover@partwidth@
%% USER LENGTHS SETTING
+
\setlength{\coverwidth}{\bookcover@coverwidth}
\setlength{\coverheight}{\bookcover@coverheight}
\setlength{\spinewidth}{\bookcover@spinewidth}
-\setlength{\flapwidth}{\bookcover@flapwidth}
+\ifbookcover@foldingmargin\else\setlength{\flapwidth}{\bookcover@flapwidth}\fi
+\ifdim\flapwidth>0pt\setlength{\wrapwidth}{\bookcover@wrapwidth}\fi
\setlength{\marklength}{\bookcover@marklength}
\setlength{\markthick}{\bookcover@markthick}
\setlength{\bleedwidth}{\bookcover@bleedwidth}
%% PAGE DIMENSIONS SETTING
-\geometry{left=0pt,right=0pt,bottom=0pt,top=-1em,
- paperwidth=2\marklength+2\bleedwidth+2\coverwidth+2\flapwidth+\spinewidth,
- paperheight=2\marklength+2\bleedwidth+\coverheight}
-%% NO PARAGRAPH INDENTATION
-\setlength{\parindent}{0pt}
+\geometry{%
+ margin=0pt,
+ paperwidth=2\marklength+2\bleedwidth+2\coverwidth+2\flapwidth+2\wrapwidth+\spinewidth,
+ paperheight=2\marklength+2\bleedwidth+\coverheight}
%% INTERNAL LENGTHS SETTING
+
\def\bookcover@xpos#1{\setlength{\bookcover@xpos@}{#1}}
\def\bookcover@ypos#1{\setlength{\bookcover@ypos@}{#1}}
\def\bookcover@partwidth#1{\setlength{\bookcover@partwidth@}{#1}}
\def\bookcover@partheight#1{\setlength{\bookcover@partheight@}{#1}}
\def\bookcover@tikz@trimmed@part@param#1#2#3#4{%
\setlength{\bookcover@tikz@trimmed@part@width@minus}{#1}%
- \setlength{\bookcover@tikz@trimmed@part@height@minus}{#2}
- \setlength{\bookcover@tikz@trimmed@part@push@right}{#3}
+ \setlength{\bookcover@tikz@trimmed@part@height@minus}{#2}%
+ \setlength{\bookcover@tikz@trimmed@part@push@right}{#3}%
\setlength{\bookcover@tikz@trimmed@part@push@up}{#4}}
-\def\bookcover@bgtikz@trimmed@part@param#1#2{
- \bookcover@tikz@trimmed@part@param{#1}{2\bleedwidth}{#2}{\bleedwidth}}% for obsolete method
\let\setpartposx\bookcover@xpos
\let\setpartposy\bookcover@ypos
\let\setpartwidth\bookcover@partwidth
\let\setpartheight\bookcover@partheight
\let\settrimmedpart\bookcover@tikz@trimmed@part@param
+%% SETBOOKCOVER
+
+\newif\if@oldsetbookcover% for old method
+
+\long\def\setbookcover#1{%
+ \@for\bookcover@firstparam:={bgcolor,bgpic,bgtikz,fgsecond}\do{% for old method
+ \ifdefstring{\bookcover@firstparam}{#1}{\global\@oldsetbookcovertrue}{}}% for old method
+ \if@oldsetbookcover% for old method
+ \gdef\bookcover@firstparam{#1}% for old method
+ \else% for old method
+ \gdef\oldsetbookcover@{}% for old method
+ \setkeys{bookcover}{#1}%
+ \setlength{\markthick}{\bookcover@markthick}%
+ \fi\oldsetbookcover@% for old method
+ }
+
+%% BOOKCOVERDESCGEOMETRY
+
+\def\bookcoverdescgeometry#1{\def\bookcover@descgeometry{#1}}
+\def\bookcover@descgeometry{margin=1in}
+
+%% BOOKCOVERDESCRIPTION
+
+\newenvironment{bookcoverdescription}{%
+ \if@inbookcoverenv\@latexerr{Don't use 'bookcoverdescription' in 'bookcover' environment!}{}\fi}{}
+\AddToHook{env/bookcoverdescription/before}{\expandafter\newgeometry\expandafter{\bookcover@descgeometry}}
+\AddToHook{env/bookcoverdescription/after}{\restoregeometry}
+
+%% POSBOX
+
+\newcommand{\bookcover@posbox}[5]{%
+ \setlength{\bookcover@templength@a}{#4}%
+ \put(#3,-\bookcover@templength@a){%
+ \parbox[b][0pt][t]{#1}{%
+ \parbox[t][#2][t]{#1}{#5}}}}
+
%% MARKS
-\def\bookcover@vmark{
- \begin{textblock*}{\bookcover@partwidth@}(\bookcover@xpos@,\bookcover@ypos@)
- {\color{\bookcover@markcolor}\rule[0pt]{\markthick}{\marklength}}
- \end{textblock*}}
-
-\def\bookcover@hmark{
- \begin{textblock*}{\bookcover@partwidth@}(\bookcover@xpos@,\bookcover@ypos@)
- {\color{\bookcover@markcolor}\rule[0pt]{\marklength}{\markthick}}
- \end{textblock*}}
-
-\def\bookcover@marks{
- \bookcover@ypos{0mm}
- \bookcover@partwidth{\markthick}
- \bookcover@xpos{\marklength+\bleedwidth-.5\markthick}
- \bookcover@vmark
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth-.5\markthick}
- \bookcover@vmark\fi
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth-.5\markthick}
- \bookcover@vmark
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth-.5\markthick}
- \bookcover@vmark
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+2\coverwidth+\spinewidth-.5\markthick}
- \bookcover@vmark\fi
- \bookcover@xpos{\marklength+\bleedwidth+2\flapwidth+2\coverwidth+\spinewidth-.5\markthick}
- \bookcover@vmark
- \bookcover@ypos{\paperheight-\marklength}
- \bookcover@partwidth{\markthick}
- \bookcover@xpos{\marklength+\bleedwidth-.5\markthick}
- \bookcover@vmark
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth-.5\markthick}
- \bookcover@vmark\fi
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth-.5\markthick}
- \bookcover@vmark
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth-.5\markthick}
- \bookcover@vmark
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+2\coverwidth+\spinewidth-.5\markthick}
- \bookcover@vmark\fi
- \bookcover@xpos{\marklength+\bleedwidth+2\flapwidth+2\coverwidth+\spinewidth-.5\markthick}
- \bookcover@vmark
- \bookcover@xpos{0mm}
- \bookcover@partwidth{\marklength}
- \bookcover@ypos{\marklength+\bleedwidth-.5\markthick}
- \bookcover@hmark
- \bookcover@ypos{\marklength+\bleedwidth+\coverheight-.5\markthick}
- \bookcover@hmark
- \bookcover@xpos{\paperwidth-\marklength}
- \bookcover@partwidth{\marklength}
- \bookcover@ypos{\marklength+\bleedwidth-.5\markthick}
- \bookcover@hmark
- \bookcover@ypos{\marklength+\bleedwidth+\coverheight-.5\markthick}
- \bookcover@hmark}
+
+\def\bookcover@marks{\bookcovercomponent{bookcovertype@tikz}{bookcoverpart@wholepage}{
+ \begin{scope}[line width=\markthick,\bookcover@markcolor]
+ \draw (\marklength+\bleedwidth,0mm) -- +(0mm,\marklength);
+ \ifdim\flapwidth>0mm\draw (\marklength+\bleedwidth+\flapwidth+\wrapwidth,0) -- +(0,\marklength);\fi
+ \draw (\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth,0) -- +(0,\marklength);
+ \draw (\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth+\spinewidth,0) -- +(0,\marklength);
+ \ifdim\flapwidth>0mm\draw (\marklength+\bleedwidth+\flapwidth+\wrapwidth+2\coverwidth+\spinewidth,0) -- +(0,\marklength);\fi
+ \draw (\marklength+\bleedwidth+2\flapwidth+2\wrapwidth+2\coverwidth+\spinewidth,0) -- +(0,\marklength);
+ \draw (\marklength+\bleedwidth,\paperheight) -- +(0,-\marklength);
+ \ifdim\flapwidth>0mm\draw (\marklength+\bleedwidth+\flapwidth+\wrapwidth,\paperheight) -- +(0,-\marklength);\fi%
+ \draw (\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth,\paperheight) -- +(0,-\marklength);
+ \draw (\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth+\spinewidth,\paperheight) -- +(0,-\marklength);
+ \ifdim\flapwidth>0mm\draw (\marklength+\bleedwidth+\flapwidth+\wrapwidth+2\coverwidth+\spinewidth,\paperheight) -- +(0,-\marklength);\fi
+ \draw (\marklength+\bleedwidth+2\flapwidth+2\wrapwidth+2\coverwidth+\spinewidth,\paperheight) -- +(0,-\marklength);
+ \draw (0,\paperheight-\marklength-\bleedwidth) -- +(\marklength,0);
+ \draw (0,\marklength+\bleedwidth) -- +(\marklength,0);
+ \draw (\paperwidth,\paperheight-\marklength-\bleedwidth) -- +(-\marklength,0);
+ \draw (\paperwidth,\marklength+\bleedwidth) -- +(-\marklength,0);
+ \ifbookcover@foldingmargin
+ \draw (\marklength,0) -- +(0,\marklength);
+ \draw (\paperwidth-\marklength,0) -- +(0,\marklength);
+ \draw (\marklength,\paperheight) -- +(0,-\marklength);
+ \draw (\paperwidth-\marklength,\paperheight) -- +(0,-\marklength);
+ \draw (0,\marklength) -- +(\marklength,0);
+ \draw (0,\paperheight-\marklength) -- +(\marklength,0);
+ \draw (\paperwidth,\marklength) -- +(-\marklength,0);
+ \draw (\paperwidth,\paperheight-\marklength) -- +(-\marklength,0);\fi
+ \end{scope}}}
%% TRIMMING
-\def\bookcover@trimming{
- \begin{textblock*}{\paperwidth}(0mm,0mm)
- \begin{tikzpicture}
- \begin{scope}[color=white]
- \fill(0,0)--
- (\paperwidth,0)--
- (\paperwidth,\marklength+\bleedwidth)--
- (0,\marklength+\bleedwidth)--cycle;
- \fill(0,\paperheight)--
- (\paperwidth,\paperheight)--
- (\paperwidth,\paperheight-\marklength-\bleedwidth)--
- (0,\paperheight-\marklength-\bleedwidth)--cycle;
- \fill(0,0)--
- (\marklength+\bleedwidth,0)--
- (\marklength+\bleedwidth,\paperheight)--
- (0,\paperheight)--cycle;
- \fill(\paperwidth-\marklength-\bleedwidth,0)--
- (\paperwidth,0)--
- (\paperwidth,\paperheight)--
- (\paperwidth-\marklength-\bleedwidth,\paperheight)--cycle;
- \end{scope}
- \draw[color=\bookcover@markcolor,line width=\markthick]
- (\marklength+\bleedwidth,\marklength+\bleedwidth)--
- (\paperwidth-\marklength-\bleedwidth,\marklength+\bleedwidth)--
- (\paperwidth-\marklength-\bleedwidth,\paperheight-\marklength-\bleedwidth)--
- (\marklength+\bleedwidth,\paperheight-\marklength-\bleedwidth)--cycle;
- \end{tikzpicture}
- \end{textblock*}
- \bookcover@ypos{\bleedwidth}
- \bookcover@partwidth{\markthick}
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth-.5\markthick}
- \bookcover@vmark
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+2\coverwidth+\spinewidth-.5\markthick}
- \bookcover@vmark\fi
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth-.5\markthick}
- \bookcover@vmark
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth-.5\markthick}
- \bookcover@vmark
- \bookcover@ypos{\paperheight-\marklength-\bleedwidth}
- \bookcover@partwidth{\markthick}
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth-.5\markthick}
- \bookcover@vmark
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+2\coverwidth+\spinewidth-.5\markthick}
- \bookcover@vmark\fi
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth-.5\markthick}
- \bookcover@vmark
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth-.5\markthick}
- \bookcover@vmark}
-%% BOOKCOVER COMPONENT
-\long\def\bookcovercomponent#1#2#3{
- \if@inbookcoverenv\else
- \@latexerr{\string\bookcovercomponent\space is not in 'bookcover' environment.}{}\fi
- \bookcover@xpos{0pt}
- \bookcover@ypos{0pt}
- \bookcover@partwidth{0pt}
- \bookcover@partheight{0pt}
- \bookcover@tikz@trimmed@part@param{0pt}{0pt}{0pt}{0pt}
- \@ifundefined{bookcover@part@param@#2}{\@latexerr{Part '#2' undefined.}{}}{
- \@ifundefined{bookcover@componenttype@#1}{\@latexerr{Component type '#1' undefined.}{}}{
- \ifx\@empty#3\else
- \csname bookcover@part@param@#2\endcsname
- \ifdim\bookcover@partwidth@>0mm
- \ifdim\bookcover@partheight@>0mm
- \csname bookcover@componenttype@#1\endcsname{#3}\fi\fi\fi}}}
+\def\bookcover@trimming@part{%
+ \expandafter\ifblank\expandafter{\bookcover@trimmedpart}{\def\bookcover@trimmedpart{bookcoverpart@whole}}{}%
+ \@ifundefined{bookcover@part@param@\bookcover@trimmedpart}{\@latexerr{Part '\bookcover@trimmedpart' is undefined.}{}}{%
+ \begingroup%
+ \csname bookcover@part@param@\bookcover@trimmedpart\endcsname%
+ \expandafter\bookcover@setpartmargin\expandafter(\bookcover@trimmedmargin)%
+ \ifdim\bookcover@partwidth@>0mm
+ \ifdim\bookcover@partheight@>0mm
+ \bookcover@posbox{\paperwidth}{\paperheight}{0mm}{0mm}{%
+ \begin{tikzpicture}
+ \begin{scope}[\bookcover@trimmingcolor]
+ \fill (0,0) rectangle (\paperwidth,\paperheight-\bookcover@ypos@-\bookcover@partheight@);
+ \fill (0,\paperheight) rectangle (\paperwidth,\paperheight-\bookcover@ypos@);
+ \fill (0,0) rectangle (\bookcover@xpos@,\paperheight);
+ \fill (\bookcover@xpos@+\bookcover@partwidth@,0) rectangle (\paperwidth,\paperheight);
+ \end{scope}
+ \end{tikzpicture}}\fi\fi
+ \endgroup}}
+
+\NewDocumentCommand{\bookcovertrimmedpart}{ m O{,,,} }{\def\bookcover@trimmedpart{#1}\def\bookcover@trimmedmargin{#2}}
+\bookcovertrimmedpart{bookcoverpart@whole}
%% BOOKCOVER ENVIRONMENT
-\def\bookcover{\@inbookcoverenvtrue}
-\def\endbookcover{
- \bookcover@marks
- \ifbookcover@trimmed\bookcover@trimming\fi
- \mbox{}\newpage\@inbookcoverenvfalse}
+
+\def\bookcover{%
+ \@inbookcoverenvtrue%
+ \newpage%
+ \pagecolor{\bookcover@pagecolor}
+ \noindent%
+ \begin{picture}(\paperwidth,\paperheight)(0,-\paperheight)}
+
+\def\endbookcover{%
+ \ifbookcover@trimmed\bookcover@trimming@part\fi%
+ \bookcover@marks%
+ \end{picture}%
+ \par\@inbookcoverenvfalse}
+
+%% BOOKCOVER COMPONENT
+
+\def\bookcover@setpartmargin(#1,#2,#3,#4){%
+ \setlength{\bookcover@templength@a}{0mm}
+ \setlength{\bookcover@templength@b}{0mm}
+ \setlength{\bookcover@templength@c}{0mm}
+ \setlength{\bookcover@templength@d}{0mm}
+ \ifblank{#1}{}{\setlength{\bookcover@templength@a}{#1}}%
+ \ifblank{#2}{}{\setlength{\bookcover@templength@b}{#2}}%
+ \ifblank{#3}{}{\setlength{\bookcover@templength@c}{#3}}%
+ \ifblank{#4}{}{\setlength{\bookcover@templength@d}{#4}}%
+ \addtolength{\bookcover@xpos@}{\bookcover@templength@a}%
+ \addtolength{\bookcover@partwidth@}{-\bookcover@templength@a}%
+ \addtolength{\bookcover@partheight@}{-\bookcover@templength@b}%
+ \addtolength{\bookcover@partwidth@}{-\bookcover@templength@c}%
+ \addtolength{\bookcover@ypos@}{\bookcover@templength@d}%
+ \addtolength{\bookcover@partheight@}{-\bookcover@templength@d}%
+ \ifdim\bookcover@tikz@trimmed@part@width@minus>\dimexpr\bookcover@tikz@trimmed@part@push@right+\bookcover@templength@c\relax%
+ \addtolength{\bookcover@tikz@trimmed@part@width@minus}{-\bookcover@tikz@trimmed@part@push@right-\bookcover@templength@c}%
+ \else\setlength{\bookcover@tikz@trimmed@part@width@minus}{0mm}\fi%
+ \ifdim\bookcover@tikz@trimmed@part@push@right>\bookcover@templength@a%
+ \addtolength{\bookcover@tikz@trimmed@part@push@right}{-\bookcover@templength@a}%
+ \else\setlength{\bookcover@tikz@trimmed@part@push@right}{0mm}\fi%
+ \addtolength{\bookcover@tikz@trimmed@part@width@minus}{\bookcover@tikz@trimmed@part@push@right}%
+ \ifdim\bookcover@tikz@trimmed@part@height@minus>\dimexpr\bookcover@tikz@trimmed@part@push@up+\bookcover@templength@d\relax%
+ \addtolength{\bookcover@tikz@trimmed@part@height@minus}{-\bookcover@tikz@trimmed@part@push@up-\bookcover@templength@d}%
+ \else\setlength{\bookcover@tikz@trimmed@part@height@minus}{0mm}\fi%
+ \ifdim\bookcover@tikz@trimmed@part@push@up>\bookcover@templength@b%
+ \addtolength{\bookcover@tikz@trimmed@part@push@up}{-\bookcover@templength@b}%
+ \else\setlength{\bookcover@tikz@trimmed@part@push@up}{0mm}\fi%
+ \addtolength{\bookcover@tikz@trimmed@part@height@minus}{\bookcover@tikz@trimmed@part@push@up}}
+
+\NewDocumentCommand{\bookcovercomponent}{ m m O{,,,} +m }{%
+ \if@inbookcoverenv\else%
+ \@latexerr{Use \string\bookcovercomponent\space or 'bookcoverelement' in 'bookcover' environment!}{}\fi%
+ \@ifundefined{bookcover@part@param@#2}{\@latexerr{Part '#2' is undefined.}{}}{%
+ \@ifundefined{bookcover@componenttype@#1}{\@latexerr{Component type '#1' is undefined.}{}}{%
+ \ifblank{#4}{}{%
+ \begingroup%
+ \csname bookcover@part@param@#2\endcsname%
+ \bookcover@setpartmargin(#3)%
+ \ifdim\bookcover@partwidth@>0mm%
+ \ifdim\bookcover@partheight@>0mm%
+ \csname bookcover@componenttype@#1\endcsname{#4}\fi\fi%
+ \endgroup}}}}
+
+%% BOOKCOVERELEMENT ENVIRONMENT
+
+\NewDocumentEnvironment{bookcoverelement}{ m m O{,,,} +b }{\bookcovercomponent{#1}{#2}[#3]{#4}}
%% NEW BOOKCOVER PART
-\def\newbookcoverpart#1#2{
- \@ifundefined{bookcover@part@param@#1}{
+
+\def\newbookcoverpart#1#2{%
+ \@ifundefined{bookcover@part@param@#1}{%
\expandafter\def\csname bookcover@part@param@#1\endcsname{#2}}
- {\@latexerr{Part '#1' already defined.}{}}}
+ {\@latexerr{Part '#1' is already defined.}{}}}
%% RENEW BOOKCOVER PART
-\def\renewbookcoverpart#1#2{
- \@ifundefined{bookcover@part@param@#1}{\@latexerr{Part '#1' undefined.}{}}{
+
+\def\renewbookcoverpart#1#2{%
+ \ifstrequal{#1}{bookcoverpart@wholepage}{\@latexerr{Part '#1' is protected.}{}}%
+ \ifstrequal{#1}{bookcoverpart@whole}{\@latexerr{Part '#1' is protected.}{}}%
+ \@ifundefined{bookcover@part@param@#1}{\@latexerr{Part '#1' is undefined.}{}}{%
\expandafter\def\csname bookcover@part@param@#1\endcsname{#2}}}
%% NEW NAME BOOKCOVER PART
-\def\newnamebookcoverpart#1#2{
- \@ifundefined{bookcover@part@param@#1}{
- \@ifundefined{bookcover@part@param@#2}{\@latexerr{Part '#2' undefined.}{}}{
+
+\def\newnamebookcoverpart#1#2{%
+ \@ifundefined{bookcover@part@param@#1}{%
+ \@ifundefined{bookcover@part@param@#2}{\@latexerr{Part '#2' is undefined.}{}}{%
\expandafter\def\csname bookcover@part@param@#1\endcsname{%
\csname bookcover@part@param@#2\endcsname}}}
- {\@latexerr{Part '#1' already defined.}{}}}
+ {\@latexerr{Part '#1' is already defined.}{}}}
+
+%% LET NAME BOOKCOVER PART
+
+\NewDocumentCommand{\letnamebookcoverpart}{ m m O{,,,} }{%
+ \@ifundefined{bookcover@part@param@#1}{%
+ \@ifundefined{bookcover@part@param@#2}{\@latexerr{Part '#2' is undefined.}{}}{%
+ \csletcs{bookcover@part@baseparam@#1}{bookcover@part@param@#2}%
+ \protected@csedef{bookcover@part@margin@#1}{\bookcover@setpartmargin(#3)}%
+ \protected@csedef{bookcover@part@param@#1}{\csuse{bookcover@part@baseparam@#1}\csuse{bookcover@part@margin@#1}}}}
+ {\@latexerr{Part '#1' is already defined.}{}}}
%% NEW BOOKCOVER COMPONENT TYPE
-\def\newbookcovercomponenttype#1#2{
- \@ifundefined{bookcover@componenttype@#1}{
- \long\expandafter\def\csname bookcover@componenttype@#1\endcsname##1{
- \begin{textblock*}{\bookcover@partwidth@}(\bookcover@xpos@,\bookcover@ypos@)
- #2
- \end{textblock*}}}
- {\@latexerr{Component type '#1' already defined.}{}}}
+
+\def\newbookcovercomponenttype#1#2{%
+ \@ifundefined{bookcover@componenttype@#1}{%
+ \long\expandafter\def\csname bookcover@componenttype@#1\endcsname##1{%
+ \bookcover@posbox{\bookcover@partwidth@}{\bookcover@partheight@}{\bookcover@xpos@}{\bookcover@ypos@}{#2}}}
+ {\@latexerr{Component type '#1' is already defined.}{}}}
%% RENEW BOOKCOVER COMPONENT TYPE
-\def\renewbookcovercomponenttype#1#2{
- \@ifundefined{bookcover@componenttype@#1}{\@latex@error{Component type '#1' undefined.}{}}{
- \long\expandafter\def\csname bookcover@componenttype@#1\endcsname##1{
- \begin{textblock*}{\bookcover@partwidth@}(\bookcover@xpos@,\bookcover@ypos@)
- #2
- \end{textblock*}}}}
+
+\def\renewbookcovercomponenttype#1#2{%
+ \ifstrequal{#1}{bookcovertype@tikz}{\@latexerr{Component type '#1' is protected.}{}}%
+ \@ifundefined{bookcover@componenttype@#1}{\@latexerr{Component type '#1' is undefined.}{}}{%
+ \long\expandafter\def\csname bookcover@componenttype@#1\endcsname##1{%
+ \bookcover@posbox{\bookcover@partwidth@}{\bookcover@partheight@}{\bookcover@xpos@}{\bookcover@ypos@}{#2}}}}
%% NEW NAME BOOKCOVER COMPONENT TYPE
-\def\newnamebookcovercomponenttype#1#2{
- \@ifundefined{bookcover@componenttype@#1}{
- \@ifundefined{bookcover@componenttype@#2}{\@latexerr{Component type '#2' undefined.}{}}{
+
+\def\newnamebookcovercomponenttype#1#2{%
+ \@ifundefined{bookcover@componenttype@#1}{%
+ \@ifundefined{bookcover@componenttype@#2}{\@latexerr{Component type '#2' is undefined.}{}}{%
\expandafter\def\csname bookcover@componenttype@#1\endcsname{%
\csname bookcover@componenttype@#2\endcsname}}}
- {\@latexerr{Component type '#1' already defined.}{}}}
+ {\@latexerr{Component type '#1' is already defined.}{}}}
+
+%% LET NAME BOOKCOVER COMPONENT TYPE
+
+\def\letnamebookcovercomponenttype#1#2{%
+ \@ifundefined{bookcover@componenttype@#1}{%
+ \@ifundefined{bookcover@componenttype@#2}{\@latexerr{Component type '#2' is undefined.}{}}{%
+ \csletcs{bookcover@componenttype@#1}{bookcover@componenttype@#2}}}
+ {\@latexerr{Component type '#1' is already defined.}{}}}
%% COMPONENT TYPES
-\newbookcovercomponenttype{color}{
- \tikz\fill[#1] (0,0) rectangle (\bookcover@partwidth@,\bookcover@partheight@);}
-\newbookcovercomponenttype{picture}{
+\newbookcovercomponenttype{color}{%
+ \tikz\fill\expandafter[#1] (0,0) rectangle (\bookcover@partwidth@,\bookcover@partheight@);}
+
+\newbookcovercomponenttype{picture}{%
\includegraphics[width=\bookcover@partwidth@,height=\bookcover@partheight@]{#1}}
-\newbookcovercomponenttype{tikz}{
+\def\bookcover@tikz@content#1{%
\begin{tikzpicture}[overlay,yshift=-\bookcover@partheight@]
\begin{scope}[transparent,line width=0pt]
\pgfset{minimum width=\bookcover@partwidth@,minimum height=\bookcover@partheight@}
@@ -927,52 +1234,37 @@
\pgftransformshift{\pgfpoint{\bookcover@tikz@trimmed@part@push@right}
{\bookcover@tikz@trimmed@part@push@up}}
\pgfnode{rectangle}{south west}{}{trimmed part}{\pgfusepath{draw}}
+ \pgfnodealias{current trimmed part}{trimmed part}% for old method
+ \pgfnodealias{current part}{part}% for old method
\end{scope}
#1
\end{tikzpicture}}
-\newbookcovercomponenttype{tikz clip}{
- \begin{tikzpicture}[overlay,yshift=-\bookcover@partheight@]
- \begin{scope}[transparent,line width=0pt]
- \pgfset{minimum width=\bookcover@partwidth@,minimum height=\bookcover@partheight@}
- \pgfnode{rectangle}{south west}{}{part}{\pgfusepath{draw}}
- \pgfset{minimum width=\bookcover@partwidth@-\bookcover@tikz@trimmed@part@width@minus,
- minimum height=\bookcover@partheight@-\bookcover@tikz@trimmed@part@height@minus}
- \pgftransformshift{\pgfpoint{\bookcover@tikz@trimmed@part@push@right}
- {\bookcover@tikz@trimmed@part@push@up}}
- \pgfnode{rectangle}{south west}{}{trimmed part}{\pgfusepath{draw}}
- \end{scope}
- \clip (part.south west) rectangle (part.north east);
- #1
- \end{tikzpicture}}
+\newbookcovercomponenttype{tikz}{\bookcover@tikz@content{#1}}
+
+\letnamebookcovercomponenttype{bookcovertype@tikz}{tikz} % bookcovertype@tikz is protected type
+
+\newbookcovercomponenttype{tikz clip}{\bookcover@tikz@content{\clip (part.south west) rectangle (part.north east);#1}}
+
+\newbookcovercomponenttype{normal}{#1}
-\newbookcovercomponenttype{normal}{
- \parbox[t][\bookcover@partheight@][t]{\bookcover@partwidth@}{#1}}
+\newbookcovercomponenttype{center}{\vfill{\centering#1\\}\vfill}
-\newbookcovercomponenttype{center}{
- \parbox[t][\bookcover@partheight@][c]{\bookcover@partwidth@}{\begin{center}#1\end{center}}}
+\newbookcovercomponenttype{ruler}{\expandafter\bookcover@setruler\expandafter(#1)}
-\newbookcovercomponenttype{ruler}{
- \parbox[t][\bookcover@partheight@][t]{\bookcover@partwidth@}{#1}}
-\newcommand{\setruler}[5][cm]{%
+\def\bookcover@setruler(#1,#2,#3){%
\rulernorotatenum%
- \rulerparams{}{}{#5}{}{}%
- \setlength{\bookcover@rulerwidth@}{\bookcover@partwidth@-#3}%
- \setlength{\bookcover@rulerheight@}{\bookcover@partheight@-#4}%
- \ifthenelse{\equal{#2}{upper left}}{%
- \vspace{#4}%
- \hspace{#3}%
- \squareruler[#1]{upperleft}{\bookcover@rulerwidth@}{\bookcover@rulerheight@}}{}%
- \ifthenelse{\equal{#2}{upper right}}{%
- \vspace{#4}%
- \squareruler[#1]{upperright}{\bookcover@rulerwidth@}{\bookcover@rulerheight@}}{}%
- \ifthenelse{\equal{#2}{lower left}}{%
- \hspace{#3}%
- \squareruler[#1]{lowerleft}{\bookcover@rulerwidth@}{\bookcover@rulerheight@}}{}%
- \ifthenelse{\equal{#2}{lower right}}{%
- \squareruler[#1]{lowerright}{\bookcover@rulerwidth@}{\bookcover@rulerheight@}}{}}
+ \ifblank{#3}{\rulerparams{}{}{\bookcover@markcolor}{}{}}{\rulerparams{}{}{#3}{}{}}%
+ \ifblank{#2}%
+ {\ifblank{#1}%
+ {\squareruler{upperleft}{\bookcover@partwidth@}{\bookcover@partheight@}}%
+ {\squareruler[#1]{upperleft}{\bookcover@partwidth@}{\bookcover@partheight@}}}%
+ {\ifblank{#1}%
+ {\squareruler{#2}{\bookcover@partwidth@}{\bookcover@partheight@}}%
+ {\squareruler[#1]{#2}{\bookcover@partwidth@}{\bookcover@partheight@}}}}
%% BOOKCOVER PARTS
+
\newbookcoverpart{bg back flap}{
\ifdim\flapwidth>0mm
\bookcover@ypos{\marklength}
@@ -981,11 +1273,19 @@
\bookcover@partwidth{\flapwidth+\bleedwidth}
\bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}\fi}
+\newbookcoverpart{bg back wrap}{
+ \ifdim\flapwidth>0mm
+ \bookcover@ypos{\marklength}
+ \bookcover@partheight{\coverheight+2\bleedwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
+ \bookcover@partwidth{\wrapwidth}
+ \bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}\fi}
+
\newbookcoverpart{bg back}{
\bookcover@ypos{\marklength}
\bookcover@partheight{\coverheight+2\bleedwidth}
\ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth}
\bookcover@partwidth{\coverwidth}
\bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
\else
@@ -996,14 +1296,14 @@
\newbookcoverpart{bg spine}{
\bookcover@ypos{\marklength}
\bookcover@partheight{\coverheight+2\bleedwidth}
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth}
\bookcover@partwidth{\spinewidth}
\bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}}
\newbookcoverpart{bg front}{
\bookcover@ypos{\marklength}
\bookcover@partheight{\coverheight+2\bleedwidth}
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth+\spinewidth}
\ifdim\flapwidth>0mm
\bookcover@partwidth{\coverwidth}
\bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
@@ -1011,26 +1311,47 @@
\bookcover@partwidth{\coverwidth+\bleedwidth}
\bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{0pt}{\bleedwidth}\fi}
+\newbookcoverpart{bg front wrap}{
+ \ifdim\flapwidth>0mm
+ \bookcover@ypos{\marklength}
+ \bookcover@partheight{\coverheight+2\bleedwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+2\coverwidth+\spinewidth}
+ \bookcover@partwidth{\wrapwidth}
+ \bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}\fi}
+
\newbookcoverpart{bg front flap}{
\ifdim\flapwidth>0mm
\bookcover@ypos{\marklength}
\bookcover@partheight{\coverheight+2\bleedwidth}
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+2\coverwidth+\spinewidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+2\wrapwidth+2\coverwidth+\spinewidth}
\bookcover@partwidth{\flapwidth+\bleedwidth}
\bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{0pt}{\bleedwidth}\fi}
-\newbookcoverpart{bg back and flap}{
+\newbookcoverpart{bg back flap and wrap}{
+ \ifdim\flapwidth>0mm
+ \bookcover@ypos{\marklength}
+ \bookcover@partheight{\coverheight+2\bleedwidth}
+ \bookcover@xpos{\marklength}
+ \bookcover@partwidth{\flapwidth+\wrapwidth+\bleedwidth}
+ \bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}\fi}
+
+\newbookcoverpart{bg back and wrap}{
\bookcover@ypos{\marklength}
\bookcover@partheight{\coverheight+2\bleedwidth}
- \bookcover@xpos{\marklength}
- \bookcover@partwidth{\bleedwidth+\flapwidth+\coverwidth}
- \bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}}
+ \ifdim\flapwidth>0mm
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
+ \bookcover@partwidth{\coverwidth+\wrapwidth}
+ \bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
+ \else
+ \bookcover@xpos{\marklength}
+ \bookcover@partwidth{\coverwidth+\bleedwidth}
+ \bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}\fi}
\newbookcoverpart{bg back and spine}{
\bookcover@ypos{\marklength}
\bookcover@partheight{\coverheight+2\bleedwidth}
\ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth}
\bookcover@partwidth{\coverwidth+\spinewidth}
\bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
\else
@@ -1041,7 +1362,7 @@
\newbookcoverpart{bg front and spine}{
\bookcover@ypos{\marklength}
\bookcover@partheight{\coverheight+2\bleedwidth}
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth}
\ifdim\flapwidth>0mm
\bookcover@partwidth{\coverwidth+\spinewidth}
\bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
@@ -1049,26 +1370,99 @@
\bookcover@partwidth{\coverwidth+\spinewidth+\bleedwidth}
\bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{0pt}{\bleedwidth}\fi}
+\newbookcoverpart{bg front and wrap}{
+ \bookcover@ypos{\marklength}
+ \bookcover@partheight{\coverheight+2\bleedwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth+\spinewidth}
+ \ifdim\flapwidth>0mm
+ \bookcover@partwidth{\coverwidth+\wrapwidth}
+ \bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
+ \else
+ \bookcover@partwidth{\coverwidth+\bleedwidth}
+ \bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{0pt}{\bleedwidth}\fi}
+
+\newbookcoverpart{bg front flap and wrap}{
+ \ifdim\flapwidth>0mm
+ \bookcover@ypos{\marklength}
+ \bookcover@partheight{\coverheight+2\bleedwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+2\coverwidth+\spinewidth}
+ \bookcover@partwidth{\flapwidth+\wrapwidth+\bleedwidth}
+ \bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{0pt}{\bleedwidth}\fi}
+
+\newbookcoverpart{bg back and flap}{
+ \bookcover@ypos{\marklength}
+ \bookcover@partheight{\coverheight+2\bleedwidth}
+ \bookcover@xpos{\marklength}
+ \bookcover@partwidth{\bleedwidth+\flapwidth+\wrapwidth+\coverwidth}
+ \bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}}
+
+\newbookcoverpart{bg back and spine and wrap}{
+ \bookcover@ypos{\marklength}
+ \bookcover@partheight{\coverheight+2\bleedwidth}
+ \ifdim\flapwidth>0mm
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
+ \bookcover@partwidth{\wrapwidth+\coverwidth+\spinewidth}
+ \bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
+ \else
+ \bookcover@xpos{\marklength}
+ \bookcover@partwidth{\wrapwidth+\coverwidth+\bleedwidth+\spinewidth}
+ \bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}\fi}
+
+\newbookcoverpart{bg back and spine and front}{
+ \bookcover@ypos{\marklength}
+ \bookcover@partheight{\coverheight+2\bleedwidth}
+ \ifdim\flapwidth>0mm
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth}
+ \bookcover@partwidth{2\coverwidth+\spinewidth}
+ \bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
+ \else
+ \bookcover@xpos{\marklength}
+ \bookcover@partwidth{2\coverwidth+2\bleedwidth+\spinewidth}
+ \bookcover@tikz@trimmed@part@param{2\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}\fi}
+
+\newbookcoverpart{bg front and spine and wrap}{
+ \bookcover@ypos{\marklength}
+ \bookcover@partheight{\coverheight+2\bleedwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth}
+ \ifdim\flapwidth>0mm
+ \bookcover@partwidth{\coverwidth+\spinewidth+\wrapwidth}
+ \bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
+ \else
+ \bookcover@partwidth{\coverwidth+\spinewidth+\bleedwidth}
+ \bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{0pt}{\bleedwidth}\fi}
+
\newbookcoverpart{bg front and flap}{
\bookcover@ypos{\marklength}
\bookcover@partheight{\coverheight+2\bleedwidth}
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
- \bookcover@partwidth{\coverwidth+\flapwidth+\bleedwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth+\spinewidth}
+ \bookcover@partwidth{\coverwidth+\flapwidth+\wrapwidth+\bleedwidth}
\bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{0pt}{\bleedwidth}}
\newbookcoverpart{bg back and flap and spine}{
\bookcover@ypos{\marklength}
\bookcover@partheight{\coverheight+2\bleedwidth}
\bookcover@xpos{\marklength}
- \bookcover@partwidth{\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
+ \bookcover@partwidth{\bleedwidth+\flapwidth+\wrapwidth+\coverwidth+\spinewidth}
\bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}}
-\newbookcoverpart{bg whole without flaps}{
+\newbookcoverpart{bg back and spine and front and back wrap}{
\bookcover@ypos{\marklength}
\bookcover@partheight{\coverheight+2\bleedwidth}
\ifdim\flapwidth>0mm
\bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@partwidth{2\coverwidth+\spinewidth}
+ \bookcover@partwidth{2\coverwidth+\spinewidth+\wrapwidth}
+ \bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
+ \else
+ \bookcover@xpos{\marklength}
+ \bookcover@partwidth{2\coverwidth+2\bleedwidth+\spinewidth}
+ \bookcover@tikz@trimmed@part@param{2\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}\fi}
+
+\newbookcoverpart{bg back and spine and front and front wrap}{
+ \bookcover@ypos{\marklength}
+ \bookcover@partheight{\coverheight+2\bleedwidth}
+ \ifdim\flapwidth>0mm
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth}
+ \bookcover@partwidth{2\coverwidth+\spinewidth+\wrapwidth}
\bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
\else
\bookcover@xpos{\marklength}
@@ -1078,16 +1472,51 @@
\newbookcoverpart{bg front and flap and spine}{
\bookcover@ypos{\marklength}
\bookcover@partheight{\coverheight+2\bleedwidth}
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth}
- \bookcover@partwidth{\coverwidth+\flapwidth+\bleedwidth+\spinewidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth}
+ \bookcover@partwidth{\coverwidth+\flapwidth+\bleedwidth+\wrapwidth+\spinewidth}
\bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{0pt}{\bleedwidth}}
+\newbookcoverpart{bg whole without front flap and wrap}{
+ \bookcover@ypos{\marklength}
+ \bookcover@partheight{\coverheight+2\bleedwidth}
+ \bookcover@xpos{\marklength}
+ \ifdim\flapwidth>0mm
+ \bookcover@partwidth{2\coverwidth+\flapwidth+\wrapwidth+\bleedwidth+\spinewidth}
+ \bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}
+ \else
+ \bookcover@partwidth{2\coverwidth+2\bleedwidth+\spinewidth}
+ \bookcover@tikz@trimmed@part@param{2\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}\fi}
+
+\newbookcoverpart{bg whole without flaps}{
+ \bookcover@ypos{\marklength}
+ \bookcover@partheight{\coverheight+2\bleedwidth}
+ \ifdim\flapwidth>0mm
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
+ \bookcover@partwidth{2\coverwidth+\spinewidth+2\wrapwidth}
+ \bookcover@tikz@trimmed@part@param{0pt}{2\bleedwidth}{0pt}{\bleedwidth}
+ \else
+ \bookcover@xpos{\marklength}
+ \bookcover@partwidth{2\coverwidth+2\bleedwidth+\spinewidth}
+ \bookcover@tikz@trimmed@part@param{2\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}\fi}
+
+\newbookcoverpart{bg whole without back flap and wrap}{
+ \bookcover@ypos{\marklength}
+ \bookcover@partheight{\coverheight+2\bleedwidth}
+ \ifdim\flapwidth>0mm
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth}
+ \bookcover@partwidth{2\coverwidth+\flapwidth+\wrapwidth+\bleedwidth+\spinewidth}
+ \bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{0mm}{\bleedwidth}
+ \else
+ \bookcover@xpos{\marklength}
+ \bookcover@partwidth{2\coverwidth+2\bleedwidth+\spinewidth}
+ \bookcover@tikz@trimmed@part@param{2\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}\fi}
+
\newbookcoverpart{bg whole without front flap}{
\bookcover@ypos{\marklength}
\bookcover@partheight{\coverheight+2\bleedwidth}
\bookcover@xpos{\marklength}
\ifdim\flapwidth>0mm
- \bookcover@partwidth{2\coverwidth+\flapwidth+\bleedwidth+\spinewidth}
+ \bookcover@partwidth{2\coverwidth+\flapwidth+2\wrapwidth+\bleedwidth+\spinewidth}
\bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}
\else
\bookcover@partwidth{2\coverwidth+2\bleedwidth+\spinewidth}
@@ -1098,7 +1527,7 @@
\bookcover@partheight{\coverheight+2\bleedwidth}
\ifdim\flapwidth>0mm
\bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@partwidth{2\coverwidth+\flapwidth+\bleedwidth+\spinewidth}
+ \bookcover@partwidth{2\coverwidth+\flapwidth+2\wrapwidth+\bleedwidth+\spinewidth}
\bookcover@tikz@trimmed@part@param{\bleedwidth}{2\bleedwidth}{0mm}{\bleedwidth}
\else
\bookcover@xpos{\marklength}
@@ -1109,13 +1538,15 @@
\bookcover@ypos{\marklength}
\bookcover@partheight{\coverheight+2\bleedwidth}
\bookcover@xpos{\marklength}
- \bookcover@partwidth{2\coverwidth+2\bleedwidth+2\flapwidth+\spinewidth}
+ \bookcover@partwidth{2\coverwidth+2\bleedwidth+2\flapwidth+2\wrapwidth+\spinewidth}
\bookcover@tikz@trimmed@part@param{2\bleedwidth}{2\bleedwidth}{\bleedwidth}{\bleedwidth}}
\newbookcoverpart{whole page}{
\bookcover@partheight{\paperheight}
\bookcover@partwidth{\paperwidth}}
+\letnamebookcoverpart{bookcoverpart@wholepage}{whole page} % bookcoverpart@wholepage is protected part
+
\newbookcoverpart{back flap}{
\ifdim\flapwidth>0mm
\bookcover@ypos{\marklength+\bleedwidth}
@@ -1123,167 +1554,239 @@
\bookcover@xpos{\marklength+\bleedwidth}
\bookcover@partwidth{\flapwidth}\fi}
+\newbookcoverpart{back wrap}{
+ \ifdim\flapwidth>0mm
+ \bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@partheight{\coverheight}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
+ \bookcover@partwidth{\wrapwidth}\fi}
+
\newbookcoverpart{back}{
\bookcover@ypos{\marklength+\bleedwidth}
\bookcover@partheight{\coverheight}
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth}
\bookcover@partwidth{\coverwidth}}
\newbookcoverpart{spine}{
\bookcover@ypos{\marklength+\bleedwidth}
\bookcover@partheight{\coverheight}
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth}
\bookcover@partwidth{\spinewidth}}
\newbookcoverpart{front}{
\bookcover@ypos{\marklength+\bleedwidth}
\bookcover@partheight{\coverheight}
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth+\spinewidth}
\bookcover@partwidth{\coverwidth}}
+\newbookcoverpart{front wrap}{
+ \bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@partheight{\coverheight}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+2\coverwidth+\spinewidth}
+ \bookcover@partwidth{\wrapwidth}}
+
\newbookcoverpart{front flap}{
\ifdim\flapwidth>0mm
\bookcover@ypos{\marklength+\bleedwidth}
\bookcover@partheight{\coverheight}
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+2\coverwidth+\spinewidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+2\wrapwidth+2\coverwidth+\spinewidth}
\bookcover@partwidth{\flapwidth}\fi}
\newbookcoverpart{above front}{
\ifdim\marklength>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth+\spinewidth}
\bookcover@ypos{0mm}
\bookcover@partwidth{\coverwidth}
\bookcover@partheight{\marklength}\fi}
\newbookcoverpart{below front}{
\ifdim\marklength>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth+\spinewidth}
\bookcover@ypos{\marklength+2\bleedwidth+\coverheight}
\bookcover@partwidth{\coverwidth}
\bookcover@partheight{\marklength}\fi}
\newbookcoverpart{above back}{
\ifdim\marklength>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth}
\bookcover@ypos{0mm}
\bookcover@partwidth{\coverwidth}
\bookcover@partheight{\marklength}\fi}
\newbookcoverpart{below back}{
\ifdim\marklength>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth}
\bookcover@ypos{\marklength+2\bleedwidth+\coverheight}
\bookcover@partwidth{\coverwidth}
\bookcover@partheight{\marklength}\fi}
-\newbookcoverpart{back and flap}{
+\newbookcoverpart{back flap and wrap}{
\bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@partheight{\coverheight}
\bookcover@xpos{\marklength+\bleedwidth}
- \bookcover@partwidth{\flapwidth+\coverwidth}
- \bookcover@partheight{\coverheight}}
+ \bookcover@partwidth{\flapwidth+\wrapwidth}}
-\newbookcoverpart{back and spine}{
+\newbookcoverpart{back and wrap}{
\bookcover@ypos{\marklength+\bleedwidth}
\bookcover@partheight{\coverheight}
\bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
+ \bookcover@partwidth{\coverwidth+\wrapwidth}}
+
+\newbookcoverpart{back and spine}{
+ \bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@partheight{\coverheight}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth}
\bookcover@partwidth{\coverwidth+\spinewidth}}
\newbookcoverpart{front and spine}{
\bookcover@ypos{\marklength+\bleedwidth}
\bookcover@partheight{\coverheight}
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth}
\bookcover@partwidth{\coverwidth+\spinewidth}}
+\newbookcoverpart{front and wrap}{
+ \bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@partheight{\coverheight}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth+\spinewidth}
+ \bookcover@partwidth{\coverwidth+\wrapwidth}}
+
+\newbookcoverpart{front flap and wrap}{
+ \ifdim\flapwidth>0mm
+ \bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@partheight{\coverheight}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+2\coverwidth+\spinewidth}
+ \bookcover@partwidth{\flapwidth+\wrapwidth}\fi}
+
+\newbookcoverpart{back and flap}{
+ \bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@xpos{\marklength+\bleedwidth}
+ \bookcover@partwidth{\flapwidth+\wrapwidth+\coverwidth}
+ \bookcover@partheight{\coverheight}}
+
+\newbookcoverpart{back and spine and wrap}{
+ \bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@partheight{\coverheight}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
+ \bookcover@partwidth{\coverwidth+\spinewidth+\wrapwidth}}
+
+\newbookcoverpart{back and spine and front}{
+ \bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@partheight{\coverheight}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth}
+ \bookcover@partwidth{2\coverwidth+\spinewidth}}
+
+\newbookcoverpart{front and spine and wrap}{
+ \bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@partheight{\coverheight}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth}
+ \bookcover@partwidth{\coverwidth+\spinewidth+\wrapwidth}}
+
\newbookcoverpart{front and flap}{
\bookcover@ypos{\marklength+\bleedwidth}
\bookcover@partheight{\coverheight}
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
- \bookcover@partwidth{\coverwidth+\flapwidth}}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth+\spinewidth}
+ \bookcover@partwidth{\coverwidth+\flapwidth+\wrapwidth}}
\newbookcoverpart{back and flap and spine}{
\bookcover@ypos{\marklength+\bleedwidth}
\bookcover@xpos{\marklength+\bleedwidth}
- \bookcover@partwidth{\flapwidth+\coverwidth+\spinewidth}
+ \bookcover@partwidth{\flapwidth+\wrapwidth+\coverwidth+\spinewidth}
\bookcover@partheight{\coverheight}}
-\newbookcoverpart{whole without flaps}{
+\newbookcoverpart{back and spine and front and back wrap}{
\bookcover@ypos{\marklength+\bleedwidth}
\bookcover@partheight{\coverheight}
\bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@partwidth{2\coverwidth+\spinewidth}}
+ \bookcover@partwidth{2\coverwidth+\spinewidth+\wrapwidth}}
+
+\newbookcoverpart{back and spine and front and front wrap}{
+ \bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@partheight{\coverheight}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth}
+ \bookcover@partwidth{2\coverwidth+\spinewidth+\wrapwidth}}
\newbookcoverpart{front and flap and spine}{
\bookcover@ypos{\marklength+\bleedwidth}
\bookcover@partheight{\coverheight}
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth}
- \bookcover@partwidth{\coverwidth+\flapwidth+\spinewidth}}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth+\coverwidth}
+ \bookcover@partwidth{\coverwidth+\flapwidth+\wrapwidth+\spinewidth}}
+
+\newbookcoverpart{whole without front flap and wrap}{
+ \bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@partheight{\coverheight}
+ \bookcover@xpos{\marklength+\bleedwidth}
+ \bookcover@partwidth{2\coverwidth+\flapwidth+\wrapwidth+\spinewidth}}
+
+\newbookcoverpart{whole without flaps}{
+ \bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@partheight{\coverheight}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
+ \bookcover@partwidth{2\coverwidth+\spinewidth+2\wrapwidth}}
+
+\newbookcoverpart{whole without back flap and wrap}{
+ \bookcover@ypos{\marklength+\bleedwidth}
+ \bookcover@partheight{\coverheight}
+ \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\wrapwidth}
+ \bookcover@partwidth{2\coverwidth+\flapwidth+\wrapwidth+\spinewidth}}
\newbookcoverpart{whole without front flap}{
\bookcover@ypos{\marklength+\bleedwidth}
\bookcover@partheight{\coverheight}
\bookcover@xpos{\marklength+\bleedwidth}
- \bookcover@partwidth{2\coverwidth+\flapwidth+\spinewidth}}
+ \bookcover@partwidth{2\coverwidth+\flapwidth+2\wrapwidth+\spinewidth}}
\newbookcoverpart{whole without back flap}{
\bookcover@ypos{\marklength+\bleedwidth}
\bookcover@partheight{\coverheight}
\bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@partwidth{2\coverwidth+\flapwidth+\spinewidth}}
+ \bookcover@partwidth{2\coverwidth+\flapwidth+2\wrapwidth+\spinewidth}}
\newbookcoverpart{whole}{
\bookcover@ypos{\marklength+\bleedwidth}
\bookcover@partheight{\coverheight}
\bookcover@xpos{\marklength+\bleedwidth}
- \bookcover@partwidth{2\coverwidth+2\flapwidth+\spinewidth}}
-
-%%%%%%%%%%%%%%%%%%%%%
-%% OBSOLETE METHOD %%
-%%%%%%%%%%%%%%%%%%%%%
-
-%% MAIN LAYERS
-\def\bookcover@bgcolor#1{
- \begin{textblock*}{\bookcover@partwidth@}(\bookcover@xpos@,\bookcover@ypos@)
- \tikz\fill\expandafter[#1] (0,0) rectangle (\bookcover@partwidth@,\bookcover@partheight@);
- \end{textblock*}}
-
-\def\bookcover@bgpic#1{
- \begin{textblock*}{\bookcover@partwidth@}(\bookcover@xpos@,\bookcover@ypos@)
- \includegraphics[width=\bookcover@partwidth@,height=\bookcover@partheight@]{#1}
- \end{textblock*}}
-
-\def\bookcover@bgtikz#1{
- \begin{textblock*}{\bookcover@partwidth@}(\bookcover@xpos@,\bookcover@ypos@)
- \ifbookcover@bgtikznodes
- \begin{tikzpicture}[overlay,yshift=-\bookcover@partheight@]
- \begin{scope}[transparent,line width=0pt]
- \pgfset{minimum width=\bookcover@partwidth@,minimum height=\bookcover@partheight@}
- \pgfnode{rectangle}{south west}{}{current part}{\pgfusepath{draw}}% for v1.1.1
- \pgfnode{rectangle}{south west}{}{part}{\pgfusepath{draw}}
- \pgfset{minimum width=\bookcover@partwidth@-\bookcover@tikz@trimmed@part@width@minus,
- minimum height=\bookcover@partheight@-\bookcover@tikz@trimmed@part@height@minus}
- \pgftransformshift{\pgfpoint{\bookcover@tikz@trimmed@part@push@right}
- {\bookcover@tikz@trimmed@part@push@up}}
- \pgfnode{rectangle}{south west}{}{current trimmed part}{\pgfusepath{draw}}% for v1.1.1
- \pgfnode{rectangle}{south west}{}{trimmed part}{\pgfusepath{draw}}
- \end{scope}
- \ifbookcover@bgtikzclip
- \clip (part.south west) rectangle (part.north east);\fi
- \else\begin{tikzpicture}\fi
- #1
- \end{tikzpicture}
- \end{textblock*}}
-
-\def\bookcover@fg#1{
- \begin{textblock*}{\bookcover@partwidth@}(\bookcover@xpos@,\bookcover@ypos@)
- \parbox[t][\bookcover@partheight@][t]{\bookcover@partwidth@}{#1}
- \end{textblock*}}
-
-\def\bookcover@remark#1{
- \begin{textblock*}{\bookcover@partwidth@}(\bookcover@xpos@,\bookcover@ypos@)
- \parbox[t][\bookcover@partheight@][c]{\bookcover@partwidth@}{\begin{center}#1\end{center}}
- \end{textblock*}}
-
-%% RESET DATAS
+ \bookcover@partwidth{2\coverwidth+2\flapwidth+2\wrapwidth+\spinewidth}}
+
+\letnamebookcoverpart{bookcoverpart@whole}{whole} % bookcoverpart@whole is protected part
+
+%% SYNONYMOUS PART NAMES FOR INSIDE COVER ('INSIDE FRONT' = 'BACK', 'INSIDE BACK' = 'FRONT')
+
+\@for\bookcover@partname@:={%
+bg back flap,bg back wrap,bg back,bg front,bg front wrap,bg front flap,%
+bg back flap and wrap,bg back and wrap,bg back and spine,bg front and spine,bg front and wrap,bg front flap and wrap,%
+bg back and flap,bg back and spine and wrap,bg back and spine and front,bg front and spine and wrap,bg front and flap,%
+bg back and flap and spine,bg back and spine and front and back wrap,bg back and spine and front and front wrap,bg front and flap and spine,%
+bg whole without front flap and wrap,bg whole without back flap and wrap,%
+bg whole without front flap,bg whole without back flap,%
+back flap,back wrap,back,front,front wrap,front flap,above back,above front,below back,below front,%
+back flap and wrap,back and wrap,back and spine,front and spine,front and wrap,front flap and wrap,%
+back and flap,back and spine and wrap,back and spine and front,front and spine and wrap,front and flap,%
+back and flap and spine,back and spine and front and back wrap,back and spine and front and front wrap,front and flap and spine,%
+whole without front flap and wrap,whole without back flap and wrap,%
+whole without front flap,whole without back flap}%
+\do{%
+\let\bookcover@partname@original@\bookcover@partname@%
+\patchcmd{\bookcover@partname@}{back}{b@ck}{}{}%
+\patchcmd{\bookcover@partname@}{front}{fr@nt}{}{}%
+\patchcmd{\bookcover@partname@}{b@ck}{inside front}{}{}%
+\patchcmd{\bookcover@partname@}{fr@nt}{inside back}{}{}%
+\letnamebookcoverpart{\bookcover@partname@}{\bookcover@partname@original@}}
+
+%% SHORT PART NAMES
+
+\def\bookcover@shortpartname@#1=#2.{\letnamebookcoverpart{#1}{#2}\letnamebookcoverpart{bg #1}{bg #2}}
+\@for\bookcover@partname@:={%
+lF=back flap.,lW=back wrap.,lC=back.,S=spine.,rC=front.,rW=front wrap.,rF=front flap.,%
+lF-lW=back flap and wrap.,lW-lC=back and wrap.,lC-S=back and spine.,S-rC=front and spine.,rC-rW=front and wrap.,rW-rF=front flap and wrap.,%
+lF-lC=back and flap.,lW-S=back and spine and wrap.,lC-rC=back and spine and front.,S-rW=front and spine and wrap.,rC-rF=front and flap.,%
+lF-S=back and flap and spine.,lW-rC=back and spine and front and back wrap.,lC-rW=back and spine and front and front wrap.,S-rF=front and flap and spine.,%
+lF-rC=whole without front flap and wrap.,lW-rW=whole without flaps.,lC-rF=whole without back flap and wrap.,%
+lF-rW=whole without front flap.,lW-rF=whole without back flap.,%
+lF-rF=whole.}%
+\do{\expandafter\bookcover@shortpartname@\bookcover@partname@}
+
+%% OLD METHOD
+
\def\bookcover@reset{
\def\bookcover@bgcolor@whole{}
\def\bookcover@bgcolor@wholewf{}
@@ -1306,6 +1809,11 @@
\def\bookcover@bgtikz@backflap{}
\def\bookcover@bgtikz@frontflap{}
\def\bookcover@bgtikz@spine{}
+ \def\bookcover@fgsecond@back{}
+ \def\bookcover@fgsecond@front{}
+ \def\bookcover@fgsecond@spine{}
+ \def\bookcover@fgsecond@backflap{}
+ \def\bookcover@fgsecond@frontflap{}
\def\bookcover@fgfirst@back{}
\def\bookcover@fgfirst@front{}
\def\bookcover@fgfirst@spine{}
@@ -1314,301 +1822,103 @@
\def\bookcover@fgfirst@abovefront{}
\def\bookcover@fgfirst@belowfront{}
\def\bookcover@fgfirst@aboveback{}
- \def\bookcover@fgfirst@belowback{}
- \def\bookcover@fgsecond@back{}
- \def\bookcover@fgsecond@front{}
- \def\bookcover@fgsecond@spine{}
- \def\bookcover@fgsecond@backflap{}
- \def\bookcover@fgsecond@frontflap{}}
+ \def\bookcover@fgfirst@belowback{}}
+
\bookcover@reset
-%% SET BOOKCOVER
-\long\def\setbookcover#1#2#3{
- \ifthenelse{\equal{#1}{bgcolor}}{
- \ifthenelse{\equal{#2}{whole}}{\def\bookcover@bgcolor@whole{#3}}{}
- \ifthenelse{\equal{#2}{whole without flaps}}{\def\bookcover@bgcolor@wholewf{#3}}{}
- \ifthenelse{\equal{#2}{back}}{\def\bookcover@bgcolor@back{#3}}{}
- \ifthenelse{\equal{#2}{front}}{\def\bookcover@bgcolor@front{#3}}{}
- \ifthenelse{\equal{#2}{back flap}}{\def\bookcover@bgcolor@backflap{#3}}{}
- \ifthenelse{\equal{#2}{front flap}}{\def\bookcover@bgcolor@frontflap{#3}}{}
- \ifthenelse{\equal{#2}{spine}}{\def\bookcover@bgcolor@spine{#3}}{}}{}
- \ifthenelse{\equal{#1}{bgpic}}{
- \ifthenelse{\equal{#2}{whole}}{\def\bookcover@bgpic@whole{#3}}{}
- \ifthenelse{\equal{#2}{whole without flaps}}{\def\bookcover@bgpic@wholewf{#3}}{}
- \ifthenelse{\equal{#2}{back}}{\def\bookcover@bgpic@back{#3}}{}
- \ifthenelse{\equal{#2}{front}}{\def\bookcover@bgpic@front{#3}}{}
- \ifthenelse{\equal{#2}{back flap}}{\def\bookcover@bgpic@backflap{#3}}{}
- \ifthenelse{\equal{#2}{front flap}}{\def\bookcover@bgpic@frontflap{#3}}{}
- \ifthenelse{\equal{#2}{spine}}{\def\bookcover@bgpic@spine{#3}}{}}{}
- \ifthenelse{\equal{#1}{bgtikz}}{
- \ifthenelse{\equal{#2}{whole}}{\def\bookcover@bgtikz@whole{#3}}{}
- \ifthenelse{\equal{#2}{whole without flaps}}{\def\bookcover@bgtikz@wholewf{#3}}{}
- \ifthenelse{\equal{#2}{back}}{\def\bookcover@bgtikz@back{#3}}{}
- \ifthenelse{\equal{#2}{front}}{\def\bookcover@bgtikz@front{#3}}{}
- \ifthenelse{\equal{#2}{back flap}}{\def\bookcover@bgtikz@backflap{#3}}{}
- \ifthenelse{\equal{#2}{front flap}}{\def\bookcover@bgtikz@frontflap{#3}}{}
- \ifthenelse{\equal{#2}{spine}}{\def\bookcover@bgtikz@spine{#3}}{}}{}
- \ifthenelse{\equal{#1}{fgfirst}}{
- \ifthenelse{\equal{#2}{back}}{\def\bookcover@fgfirst@back{#3}}{}
- \ifthenelse{\equal{#2}{front}}{\def\bookcover@fgfirst@front{#3}}{}
- \ifthenelse{\equal{#2}{spine}}{\def\bookcover@fgfirst@spine{#3}}{}
- \ifthenelse{\equal{#2}{back flap}}{\def\bookcover@fgfirst@backflap{#3}}{}
- \ifthenelse{\equal{#2}{front flap}}{\def\bookcover@fgfirst@frontflap{#3}}{}
- \ifthenelse{\equal{#2}{remark}}{\def\bookcover@fgfirst@abovefront{#3}}{}% for v1.0
- \ifthenelse{\equal{#2}{above front}}{\def\bookcover@fgfirst@abovefront{#3}}{}
- \ifthenelse{\equal{#2}{below front}}{\def\bookcover@fgfirst@belowfront{#3}}{}
- \ifthenelse{\equal{#2}{above back}}{\def\bookcover@fgfirst@aboveback{#3}}{}
- \ifthenelse{\equal{#2}{below back}}{\def\bookcover@fgfirst@belowback{#3}}{}}{}
- \ifthenelse{\equal{#1}{fgsecond}}{
- \ifthenelse{\equal{#2}{back}}{\def\bookcover@fgsecond@back{#3}}{}
- \ifthenelse{\equal{#2}{front}}{\def\bookcover@fgsecond@front{#3}}{}
- \ifthenelse{\equal{#2}{spine}}{\def\bookcover@fgsecond@spine{#3}}{}
- \ifthenelse{\equal{#2}{back flap}}{\def\bookcover@fgsecond@backflap{#3}}{}
- \ifthenelse{\equal{#2}{front flap}}{\def\bookcover@fgsecond@frontflap{#3}}{}}{}}
-
-%% MAKE BOOKCOVER
-\def\makebookcover{
-%% background parameters
-\bookcover@ypos{\marklength}
-\bookcover@partheight{\coverheight+2\bleedwidth}
-%% {bgcolor}{whole}
-\ifx\bookcover@bgcolor@whole\@empty\else
- \bookcover@xpos{\marklength}
- \bookcover@partwidth{2\coverwidth+2\bleedwidth+2\flapwidth+\spinewidth}
- \bookcover@bgcolor{\bookcover@bgcolor@whole}\fi
-%% {bgcolor}{whole without flaps}
-\ifx\bookcover@bgcolor@wholewf\@empty\else
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@partwidth{2\coverwidth+\spinewidth}
- \else
- \bookcover@xpos{\marklength}
- \bookcover@partwidth{2\coverwidth+2\bleedwidth+\spinewidth}\fi
- \bookcover@bgcolor{\bookcover@bgcolor@wholewf}\fi
-%% {bgcolor}{back flap}
-\ifx\bookcover@bgcolor@backflap\@empty\else\ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength}
- \bookcover@partwidth{\flapwidth+\bleedwidth}
- \bookcover@bgcolor{\bookcover@bgcolor@backflap}\fi\fi
-%% {bgcolor}{back}
-\ifx\bookcover@bgcolor@back\@empty\else
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@partwidth{\coverwidth}
- \else
- \bookcover@xpos{\marklength}
- \bookcover@partwidth{\coverwidth+\bleedwidth}\fi
- \bookcover@bgcolor{\bookcover@bgcolor@back}\fi
-%% {bgcolor}{spine}
-\ifx\bookcover@bgcolor@spine\@empty\else
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth}
- \bookcover@partwidth{\spinewidth}
- \bookcover@bgcolor{\bookcover@bgcolor@spine}\fi
-%% {bgcolor}{front}
-\ifx\bookcover@bgcolor@front\@empty\else
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
- \bookcover@partwidth{\coverwidth}
- \else
- \bookcover@xpos{\marklength+\bleedwidth+\coverwidth+\spinewidth}
- \bookcover@partwidth{\coverwidth+\bleedwidth}\fi
- \bookcover@bgcolor{\bookcover@bgcolor@front}\fi
-%% {bgcolor}{front flap}
-\ifx\bookcover@bgcolor@frontflap\@empty\else\ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+2\coverwidth+\spinewidth}
- \bookcover@partwidth{\flapwidth+\bleedwidth}
- \bookcover@bgcolor{\bookcover@bgcolor@frontflap}\fi\fi
-%% {bgpic}{whole}
-\ifx\bookcover@bgpic@whole\@empty\else
- \bookcover@xpos{\marklength}
- \bookcover@partwidth{2\coverwidth+2\bleedwidth+2\flapwidth+\spinewidth}
- \bookcover@bgpic{\bookcover@bgpic@whole}\fi
-%% {bgpic}{whole without flaps}
-\ifx\bookcover@bgpic@wholewf\@empty\else
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@partwidth{2\coverwidth+\spinewidth}
- \else
- \bookcover@xpos{\marklength}
- \bookcover@partwidth{2\coverwidth+2\bleedwidth+\spinewidth}\fi
- \bookcover@bgpic{\bookcover@bgpic@wholewf}\fi
-%% {bgpic}{back flap}
-\ifx\bookcover@bgpic@backflap\@empty\else\ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength}
- \bookcover@partwidth{\flapwidth+\bleedwidth}
- \bookcover@bgpic{\bookcover@bgpic@backflap}\fi\fi
-%% {bgpic}{back}
-\ifx\bookcover@bgpic@back\@empty\else
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@partwidth{\coverwidth}
- \else
- \bookcover@xpos{\marklength}
- \bookcover@partwidth{\coverwidth+\bleedwidth}\fi
- \bookcover@bgpic{\bookcover@bgpic@back}\fi
-%% {bgpic}{spine}
-\ifx\bookcover@bgpic@spine\@empty\else
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth}
- \bookcover@partwidth{\spinewidth}
- \bookcover@bgpic{\bookcover@bgpic@spine}\fi
-%% {bgpic}{front}
-\ifx\bookcover@bgpic@front\@empty\else
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
- \bookcover@partwidth{\coverwidth}
- \else
- \bookcover@xpos{\marklength+\bleedwidth+\coverwidth+\spinewidth}
- \bookcover@partwidth{\coverwidth+\bleedwidth}\fi
- \bookcover@bgpic{\bookcover@bgpic@front}\fi
-%% {bgpic}{front flap}
-\ifx\bookcover@bgpic@frontflap\@empty\else\ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+2\coverwidth+\spinewidth}
- \bookcover@partwidth{\flapwidth+\bleedwidth}
- \bookcover@bgpic{\bookcover@bgpic@frontflap}\fi\fi
-%% {bgtikz}{whole}
-\ifx\bookcover@bgtikz@whole\@empty\else
- \bookcover@xpos{\marklength}
- \bookcover@partwidth{2\coverwidth+2\bleedwidth+2\flapwidth+\spinewidth}
- \bookcover@bgtikz@trimmed@part@param{2\bleedwidth}{\bleedwidth}
- \bookcover@bgtikz{\bookcover@bgtikz@whole}\fi
-%% {bgtikz}{whole without flaps}
-\ifx\bookcover@bgtikz@wholewf\@empty\else
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@partwidth{2\coverwidth+\spinewidth}
- \bookcover@bgtikz@trimmed@part@param{0pt}{0pt}
- \else
- \bookcover@xpos{\marklength}
- \bookcover@partwidth{2\coverwidth+2\bleedwidth+\spinewidth}
- \bookcover@bgtikz@trimmed@part@param{2\bleedwidth}{\bleedwidth}\fi
- \bookcover@bgtikz{\bookcover@bgtikz@wholewf}\fi
-%% {bgtikz}{back flap}
-\ifx\bookcover@bgtikz@backflap\@empty\else\ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength}
- \bookcover@partwidth{\flapwidth+\bleedwidth}
- \bookcover@bgtikz@trimmed@part@param{\bleedwidth}{\bleedwidth}
- \bookcover@bgtikz{\bookcover@bgtikz@backflap}\fi\fi
-%% {bgtikz}{back}
-\ifx\bookcover@bgtikz@back\@empty\else
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@partwidth{\coverwidth}
- \bookcover@bgtikz@trimmed@part@param{0pt}{0pt}
- \else
- \bookcover@xpos{\marklength}
- \bookcover@partwidth{\coverwidth+\bleedwidth}
- \bookcover@bgtikz@trimmed@part@param{\bleedwidth}{\bleedwidth}\fi
- \bookcover@bgtikz{\bookcover@bgtikz@back}\fi
-%% {bgtikz}{spine}
-\ifx\bookcover@bgtikz@spine\@empty\else
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth}
- \bookcover@partwidth{\spinewidth}
- \bookcover@bgtikz@trimmed@part@param{0pt}{0pt}
- \bookcover@bgtikz{\bookcover@bgtikz@spine}\fi
-%% {bgtikz}{front}
-\ifx\bookcover@bgtikz@front\@empty\else
- \ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
- \bookcover@partwidth{\coverwidth}
- \bookcover@bgtikz@trimmed@part@param{0pt}{0pt}
- \else
- \bookcover@xpos{\marklength+\bleedwidth+\coverwidth+\spinewidth}
- \bookcover@partwidth{\coverwidth+\bleedwidth}
- \bookcover@bgtikz@trimmed@part@param{\bleedwidth}{0pt}\fi
- \bookcover@bgtikz{\bookcover@bgtikz@front}\fi
-%% {bgtikz}{front flap}
-\ifx\bookcover@bgtikz@frontflap\@empty\else\ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+2\coverwidth+\spinewidth}
- \bookcover@partwidth{\flapwidth+\bleedwidth}
- \bookcover@bgtikz@trimmed@part@param{\bleedwidth}{0pt}
- \bookcover@bgtikz{\bookcover@bgtikz@frontflap}\fi\fi
-%% foreground parameters
-\bookcover@ypos{\marklength+\bleedwidth}
-\bookcover@partheight{\coverheight}
-%% {fgsecond}{back flap}
-\ifx\bookcover@fgsecond@backflap\@empty\else\ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth}
- \bookcover@partwidth{\flapwidth}
- \bookcover@fg{\bookcover@fgsecond@backflap}\fi\fi
-%% {fgsecond}{back}
-\ifx\bookcover@fgsecond@back\@empty\else
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@partwidth{\coverwidth}
- \bookcover@fg{\bookcover@fgsecond@back}\fi
-%% {fgsecond}{spine}
-\ifx\bookcover@fgsecond@spine\@empty\else
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth}
- \bookcover@partwidth{\spinewidth}
- \bookcover@fg{\bookcover@fgsecond@spine}\fi
-%% {fgsecond}{front}
-\ifx\bookcover@fgsecond@front\@empty\else
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
- \bookcover@partwidth{\coverwidth}
- \bookcover@fg{\bookcover@fgsecond@front}\fi
-%% {fgsecond}{front flap}
-\ifx\bookcover@fgsecond@frontflap\@empty\else\ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+2\coverwidth+\spinewidth}
- \bookcover@partwidth{\flapwidth}
- \bookcover@fg{\bookcover@fgsecond@frontflap}\fi\fi
-%% {fgfirst}{back flap}
-\ifx\bookcover@fgfirst@backflap\@empty\else\ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth}
- \bookcover@partwidth{\flapwidth}
- \bookcover@fg{\bookcover@fgfirst@backflap}\fi\fi
-%% {fgfirst}{back}
-\ifx\bookcover@fgfirst@back\@empty\else
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@partwidth{\coverwidth}
- \bookcover@fg{\bookcover@fgfirst@back}\fi
-%% {fgfirst}{spine}
-\ifx\bookcover@fgfirst@spine\@empty\else
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth}
- \bookcover@partwidth{\spinewidth}
- \bookcover@fg{\bookcover@fgfirst@spine}\fi
-%% {fgfirst}{front}
-\ifx\bookcover@fgfirst@front\@empty\else
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
- \bookcover@partwidth{\coverwidth}
- \bookcover@fg{\bookcover@fgfirst@front}\fi
-%% {fgfirst}{front flap}
-\ifx\bookcover@fgfirst@frontflap\@empty\else\ifdim\flapwidth>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+2\coverwidth+\spinewidth}
- \bookcover@partwidth{\flapwidth}
- \bookcover@fg{\bookcover@fgfirst@frontflap}\fi\fi
-%% {fgfirst}{above front} = {fgfirst}{remark} in v1.0
-\ifx\bookcover@fgfirst@abovefront\@empty\else\ifdim\marklength>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
- \bookcover@ypos{0mm}
- \bookcover@partwidth{\coverwidth}
- \bookcover@partheight{\marklength}
- \bookcover@remark{\bookcover@fgfirst@abovefront}\fi\fi
-%% {fgfirst}{below front}
-\ifx\bookcover@fgfirst@belowfront\@empty\else\ifdim\marklength>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth+\coverwidth+\spinewidth}
- \bookcover@ypos{\marklength+2\bleedwidth+\coverheight}
- \bookcover@partwidth{\coverwidth}
- \bookcover@partheight{\marklength}
- \bookcover@remark{\bookcover@fgfirst@belowfront}\fi\fi
-%% {fgfirst}{above back}
-\ifx\bookcover@fgfirst@aboveback\@empty\else\ifdim\marklength>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@ypos{0mm}
- \bookcover@partwidth{\coverwidth}
- \bookcover@partheight{\marklength}
- \bookcover@remark{\bookcover@fgfirst@aboveback}\fi\fi
-%% {fgfirst}{below back}
-\ifx\bookcover@fgfirst@belowback\@empty\else\ifdim\marklength>0mm
- \bookcover@xpos{\marklength+\bleedwidth+\flapwidth}
- \bookcover@ypos{\marklength+2\bleedwidth+\coverheight}
- \bookcover@partwidth{\coverwidth}
- \bookcover@partheight{\marklength}
- \bookcover@remark{\bookcover@fgfirst@belowback}\fi\fi
-%% marks
-\bookcover@marks
-%% trimming
-\ifbookcover@trimmed\bookcover@trimming\fi
-%% new book cover
-\mbox{}\newpage\bookcover@reset}
+\long\def\oldsetbookcover@#1#2{
+ \ifdefstring{\bookcover@firstparam}{bgcolor}{
+ \ifstrequal{#1}{whole}{\def\bookcover@bgcolor@whole{\bookcovercomponent{color}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{whole without flaps}{\def\bookcover@bgcolor@wholewf{\bookcovercomponent{color}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{back}{\def\bookcover@bgcolor@back{\bookcovercomponent{color}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{front}{\def\bookcover@bgcolor@front{\bookcovercomponent{color}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{back flap}{\def\bookcover@bgcolor@backflap{\bookcovercomponent{color}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{front flap}{\def\bookcover@bgcolor@frontflap{\bookcovercomponent{color}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{spine}{\def\bookcover@bgcolor@spine{\bookcovercomponent{color}{bg #1}{#2}}}{}}{}
+ \ifdefstring{\bookcover@firstparam}{bgpic}{
+ \ifstrequal{#1}{whole}{\def\bookcover@bgpic@whole{\bookcovercomponent{picture}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{whole without flaps}{\def\bookcover@bgpic@wholewf{\bookcovercomponent{picture}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{back}{\def\bookcover@bgpic@back{\bookcovercomponent{picture}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{front}{\def\bookcover@bgpic@front{\bookcovercomponent{picture}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{back flap}{\def\bookcover@bgpic@backflap{\bookcovercomponent{picture}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{front flap}{\def\bookcover@bgpic@frontflap{\bookcovercomponent{picture}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{spine}{\def\bookcover@bgpic@spine{\bookcovercomponent{picture}{bg #1}{#2}}}{}}{}
+ \ifdefstring{\bookcover@firstparam}{bgtikz}{
+ \ifbookcover@bgtikzclip
+ \ifstrequal{#1}{whole}{\def\bookcover@bgtikz@whole{\bookcovercomponent{tikz clip}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{whole without flaps}{\def\bookcover@bgtikz@wholewf{\bookcovercomponent{tikz clip}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{back}{\def\bookcover@bgtikz@back{\bookcovercomponent{tikz clip}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{front}{\def\bookcover@bgtikz@front{\bookcovercomponent{tikz clip}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{back flap}{\def\bookcover@bgtikz@backflap{\bookcovercomponent{tikz clip}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{front flap}{\def\bookcover@bgtikz@frontflap{\bookcovercomponent{tikz clip}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{spine}{\def\bookcover@bgtikz@spine{\bookcovercomponent{tikz clip}{bg #1}{#2}}}{}
+ \else
+ \ifstrequal{#1}{whole}{\def\bookcover@bgtikz@whole{\bookcovercomponent{tikz}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{whole without flaps}{\def\bookcover@bgtikz@wholewf{\bookcovercomponent{tikz}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{back}{\def\bookcover@bgtikz@back{\bookcovercomponent{tikz}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{front}{\def\bookcover@bgtikz@front{\bookcovercomponent{tikz}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{back flap}{\def\bookcover@bgtikz@backflap{\bookcovercomponent{tikz}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{front flap}{\def\bookcover@bgtikz@frontflap{\bookcovercomponent{tikz}{bg #1}{#2}}}{}
+ \ifstrequal{#1}{spine}{\def\bookcover@bgtikz@spine{\bookcovercomponent{tikz}{bg #1}{#2}}}{}
+ \fi}{}
+ \ifdefstring{\bookcover@firstparam}{fgsecond}{
+ \ifstrequal{#1}{back}{\def\bookcover@fgsecond@back{\bookcovercomponent{normal}{#1}{#2}}}{}
+ \ifstrequal{#1}{front}{\def\bookcover@fgsecond@front{\bookcovercomponent{normal}{#1}{#2}}}{}
+ \ifstrequal{#1}{spine}{\def\bookcover@fgsecond@spine{\bookcovercomponent{normal}{#1}{#2}}}{}
+ \ifstrequal{#1}{back flap}{\def\bookcover@fgsecond@backflap{\bookcovercomponent{normal}{#1}{#2}}}{}
+ \ifstrequal{#1}{front flap}{\def\bookcover@fgsecond@frontflap{\bookcovercomponent{normal}{#1}{#2}}}{}}{}
+ \ifdefstring{\bookcover@firstparam}{fgfirst}{
+ \ifstrequal{#1}{back}{\def\bookcover@fgfirst@back{\bookcovercomponent{normal}{#1}{#2}}}{}
+ \ifstrequal{#1}{front}{\def\bookcover@fgfirst@front{\bookcovercomponent{normal}{#1}{#2}}}{}
+ \ifstrequal{#1}{spine}{\def\bookcover@fgfirst@spine{\bookcovercomponent{normal}{#1}{#2}}}{}
+ \ifstrequal{#1}{back flap}{\def\bookcover@fgfirst@backflap{\bookcovercomponent{normal}{#1}{#2}}}{}
+ \ifstrequal{#1}{front flap}{\def\bookcover@fgfirst@frontflap{\bookcovercomponent{normal}{#1}{#2}}}{}
+ \ifstrequal{#1}{remark}{\def\bookcover@fgfirst@abovefront{\bookcovercomponent{center}{#1}{#2}}}{}
+ \ifstrequal{#1}{above front}{\def\bookcover@fgfirst@abovefront{\bookcovercomponent{center}{#1}{#2}}}{}
+ \ifstrequal{#1}{below front}{\def\bookcover@fgfirst@belowfront{\bookcovercomponent{center}{#1}{#2}}}{}
+ \ifstrequal{#1}{above back}{\def\bookcover@fgfirst@aboveback{\bookcovercomponent{center}{#1}{#2}}}{}
+ \ifstrequal{#1}{below back}{\def\bookcover@fgfirst@belowback{\bookcovercomponent{center}{#1}{#2}}}{}}{}}
+
+\long\def\makebookcover{%
+ \begin{bookcover}
+ \bookcover@bgcolor@whole
+ \bookcover@bgcolor@wholewf
+ \bookcover@bgcolor@back
+ \bookcover@bgcolor@front
+ \bookcover@bgcolor@backflap
+ \bookcover@bgcolor@frontflap
+ \bookcover@bgcolor@spine
+ \bookcover@bgpic@whole
+ \bookcover@bgpic@wholewf
+ \bookcover@bgpic@back
+ \bookcover@bgpic@front
+ \bookcover@bgpic@backflap
+ \bookcover@bgpic@frontflap
+ \bookcover@bgpic@spine
+ \bookcover@bgtikz@whole
+ \bookcover@bgtikz@wholewf
+ \bookcover@bgtikz@back
+ \bookcover@bgtikz@front
+ \bookcover@bgtikz@backflap
+ \bookcover@bgtikz@frontflap
+ \bookcover@bgtikz@spine
+ \bookcover@fgsecond@back
+ \bookcover@fgsecond@front
+ \bookcover@fgsecond@spine
+ \bookcover@fgsecond@backflap
+ \bookcover@fgsecond@frontflap
+ \bookcover@fgfirst@back
+ \bookcover@fgfirst@front
+ \bookcover@fgfirst@spine
+ \bookcover@fgfirst@backflap
+ \bookcover@fgfirst@frontflap
+ \bookcover@fgfirst@abovefront
+ \bookcover@fgfirst@belowfront
+ \bookcover@fgfirst@aboveback
+ \bookcover@fgfirst@belowback
+ \end{bookcover}
+ \bookcover@reset}
+
% \end{macrocode}
% \Finale
\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/bookcover/bookcover.ins b/Master/texmf-dist/source/latex/bookcover/bookcover.ins
index 090d80be0bf..d92a4d38dc2 100644
--- a/Master/texmf-dist/source/latex/bookcover/bookcover.ins
+++ b/Master/texmf-dist/source/latex/bookcover/bookcover.ins
@@ -1,5 +1,5 @@
-% Copyright (C) 2015- Tibor Tomacs
+% Copyright (C) 2015-2020 Tibor Tomacs
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.2 of this license or (at your option) any later
@@ -15,7 +15,7 @@
\usedir{tex/latex/bookcover}
\preamble
This is a generated file.
-Copyright (C) 2015- Tibor Tomacs
+Copyright (C) 2015-2020 Tibor Tomacs
This file may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
version 1.2 of this license or (at your option) any later
diff --git a/Master/texmf-dist/source/latex/bookmark/bookmark-frozen.dtx b/Master/texmf-dist/source/latex/bookmark/bookmark-frozen.dtx
new file mode 100644
index 00000000000..bf4456829f3
--- /dev/null
+++ b/Master/texmf-dist/source/latex/bookmark/bookmark-frozen.dtx
@@ -0,0 +1,1073 @@
+% \iffalse meta-comment
+%
+% File: bookmark-frozen.dtx
+% Version: 2020-11-06 v1.29
+% Info: PDF bookmarks
+%
+% Copyright (C)
+% 2007-2011 Heiko Oberdiek
+% 2016-2020 Oberdiek Package Support Group
+% https://github.com/ho-tex/bookmark/issues
+%
+% 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. This version of this license is in
+% https://www.latex-project.org/lppl/lppl-1-3c.txt
+% and 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 Maintainers of this work are
+% Heiko Oberdiek and the Oberdiek Package Support Group
+% https://github.com/ho-tex/bookmark/issues
+%
+% This work consists of the main source file bookmark.dtx
+% and the derived files
+% bookmark.sty, bookmark.pdf, bookmark.ins, bookmark.drv,
+% bkm-dvipdfm.def, bkm-dvips.def,
+% bkm-pdftex.def, bkm-vtex.def,
+% bkm-dvipdfm-2019-12-03.def, bkm-dvips-2019-12-03.def,
+% bkm-pdftex-2019-12-03.def, bkm-vtex-2019-12-03.def,
+% bookmark-example.tex.
+%
+% Distribution:
+% CTAN:macros/latex/contrib/bookmark/bookmark.dtx
+% CTAN:macros/latex/contrib/bookmark/bookmark-frozen.dtx
+% CTAN:macros/latex/contrib/bookmark/bookmark.pdf
+%
+% Unpacking:
+% (a) If bookmark.ins is present:
+% tex bookmark.ins
+% (b) Without bookmark.ins:
+% tex bookmark.dtx
+% (c) If you insist on using LaTeX
+% latex \let\install=y\input{bookmark.dtx}
+% (quote the arguments according to the demands of your shell)
+%
+% Documentation:
+% (a) If bookmark.drv is present:
+% latex bookmark.drv
+% (b) Without bookmark.drv:
+% latex bookmark.dtx; ...
+% The class ltxdoc loads the configuration file ltxdoc.cfg
+% if available. Here you can specify further options, e.g.
+% use A4 as paper format:
+% \PassOptionsToClass{a4paper}{article}
+%
+% Programm calls to get the documentation (example):
+% pdflatex bookmark.dtx
+% makeindex -s gind.ist bookmark.idx
+% pdflatex bookmark.dtx
+% makeindex -s gind.ist bookmark.idx
+% pdflatex bookmark.dtx
+%
+% Installation:
+% TDS:tex/latex/bookmark/bookmark.sty
+% TDS:tex/latex/bookmark/bkm-dvipdfm.def
+% TDS:tex/latex/bookmark/bkm-dvips.def
+% TDS:tex/latex/bookmark/bkm-pdftex.def
+% TDS:tex/latex/bookmark/bkm-vtex.def
+% TDS:tex/latex/bookmark/bkm-dvipdfm-2019-12-03.def
+% TDS:tex/latex/bookmark/bkm-dvips-2019-12-03.def
+% TDS:tex/latex/bookmark/bkm-pdftex-2019-12-03.def
+% TDS:tex/latex/bookmark/bkm-vtex-2019-12-03.def%
+% TDS:doc/latex/bookmark/bookmark.pdf
+% TDS:doc/latex/bookmark/bookmark-example.tex
+% TDS:source/latex/bookmark/bookmark.dtx
+% TDS:source/latex/bookmark/bookmark-frozen.dtx
+%
+% \fi
+%<*pdftexfrozen>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{bkm-pdftex.def}%
+ [2019/12/03 v1.28 bookmark driver for pdfTeX (HO)]%
+\def\BKM@DO@entry#1#2{%
+ \begingroup
+ \kvsetkeys{BKM@DO}{#1}%
+ \def\BKM@DO@title{#2}%
+ \ifx\BKM@DO@srcfile\@empty
+ \else
+ \BKM@UnescapeHex\BKM@DO@srcfile
+ \fi
+ \BKM@UnescapeHex\BKM@DO@title
+ \expandafter\expandafter\expandafter\BKM@getx
+ \csname BKM@\BKM@DO@id\endcsname\@empty\@empty
+ \let\BKM@attr\@empty
+ \ifx\BKM@DO@flags\@empty
+ \else
+ \edef\BKM@attr{\BKM@attr/F \BKM@DO@flags}%
+ \fi
+ \ifx\BKM@DO@color\@empty
+ \else
+ \edef\BKM@attr{\BKM@attr/C[\BKM@DO@color]}%
+ \fi
+ \ifx\BKM@attr\@empty
+ \else
+ \edef\BKM@attr{attr{\BKM@attr}}%
+ \fi
+ \let\BKM@action\@empty
+ \ifx\BKM@DO@gotor\@empty
+ \ifx\BKM@DO@dest\@empty
+ \ifx\BKM@DO@named\@empty
+ \ifx\BKM@DO@rawaction\@empty
+ \ifx\BKM@DO@uri\@empty
+ \ifx\BKM@DO@page\@empty
+ \PackageError{bookmark}{%
+ Missing action\BKM@SourceLocation
+ }\@ehc
+ \edef\BKM@action{goto page1{/Fit}}%
+ \else
+ \ifx\BKM@DO@view\@empty
+ \def\BKM@DO@view{Fit}%
+ \fi
+ \edef\BKM@action{goto page\BKM@DO@page{/\BKM@DO@view}}%
+ \fi
+ \else
+ \BKM@UnescapeHex\BKM@DO@uri
+ \BKM@EscapeString\BKM@DO@uri
+ \edef\BKM@action{user{<</S/URI/URI(\BKM@DO@uri)>>}}%
+ \fi
+ \else
+ \BKM@UnescapeHex\BKM@DO@rawaction
+ \edef\BKM@action{%
+ user{%
+ <<%
+ \BKM@DO@rawaction
+ >>%
+ }%
+ }%
+ \fi
+ \else
+ \BKM@EscapeName\BKM@DO@named
+ \edef\BKM@action{%
+ user{<</S/Named/N/\BKM@DO@named>>}%
+ }%
+ \fi
+ \else
+ \BKM@UnescapeHex\BKM@DO@dest
+ \BKM@DefGotoNameAction\BKM@action\BKM@DO@dest
+ \fi
+ \else
+ \ifx\BKM@DO@dest\@empty
+ \ifx\BKM@DO@page\@empty
+ \def\BKM@DO@page{0}%
+ \else
+ \BKM@CalcExpr\BKM@DO@page\BKM@DO@page-1%
+ \fi
+ \ifx\BKM@DO@view\@empty
+ \def\BKM@DO@view{Fit}%
+ \fi
+ \edef\BKM@action{/D[\BKM@DO@page/\BKM@DO@view]}%
+ \else
+ \BKM@UnescapeHex\BKM@DO@dest
+ \BKM@EscapeString\BKM@DO@dest
+ \edef\BKM@action{/D(\BKM@DO@dest)}%
+ \fi
+ \BKM@UnescapeHex\BKM@DO@gotor
+ \BKM@EscapeString\BKM@DO@gotor
+ \edef\BKM@action{%
+ user{%
+ <<%
+ /S/GoToR%
+ /F(\BKM@DO@gotor)%
+ \BKM@action
+ >>%
+ }%
+ }%
+ \fi
+ \pdfoutline\BKM@attr\BKM@action
+ count\ifBKM@DO@open\else-\fi\BKM@x@childs
+ {\BKM@DO@title}%
+ \endgroup
+}
+\def\BKM@DefGotoNameAction#1#2{%
+ \BKM@EscapeString\BKM@DO@dest
+ \edef#1{goto name{#2}}%
+}
+\def\BKM@SourceLocation{%
+ \ifx\BKM@DO@srcfile\@empty
+ \ifx\BKM@DO@srcline\@empty
+ \else
+ .\MessageBreak
+ Source: line \BKM@DO@srcline
+ \fi
+ \else
+ \ifx\BKM@DO@srcline\@empty
+ .\MessageBreak
+ Source: file `\BKM@DO@srcfile'%
+ \else
+ .\MessageBreak
+ Source: file `\BKM@DO@srcfile', line \BKM@DO@srcline
+ \fi
+ \fi
+}
+\RequirePackage{auxhook}
+\AddLineBeginMainAux{%
+ \string\providecommand\string\BKM@entry[2]{}%
+}
+\newcount\BKM@id
+\BKM@id=\z@
+\@namedef{BKM@0}{000}
+\newif\ifBKM@sw
+\newcommand*{\bookmark}[2][]{%
+ \if@filesw
+ \begingroup
+ \BKM@InitSourceLocation
+ \def\bookmark@text{#2}%
+ \BKM@setup{#1}%
+ \ifx\BKM@srcfile\@empty
+ \else
+ \BKM@EscapeHex\BKM@srcfile
+ \fi
+ \edef\BKM@prev{\the\BKM@id}%
+ \global\advance\BKM@id\@ne
+ \BKM@swtrue
+ \@whilesw\ifBKM@sw\fi{%
+ \ifnum\ifBKM@startatroot\z@\else\BKM@prev\fi=\z@
+ \BKM@startatrootfalse
+ \expandafter\xdef\csname BKM@\the\BKM@id\endcsname{%
+ 0{\BKM@level}0%
+ }%
+ \BKM@swfalse
+ \else
+ \expandafter\expandafter\expandafter\BKM@getx
+ \csname BKM@\BKM@prev\endcsname
+ \ifnum\BKM@level>\BKM@x@level\relax
+ \expandafter\xdef\csname BKM@\the\BKM@id\endcsname{%
+ {\BKM@prev}{\BKM@level}0%
+ }%
+ \ifnum\BKM@prev>\z@
+ \BKM@CalcExpr\BKM@CalcResult\BKM@x@childs+1%
+ \expandafter\xdef\csname BKM@\BKM@prev\endcsname{%
+ {\BKM@x@parent}{\BKM@x@level}{\BKM@CalcResult}%
+ }%
+ \fi
+ \BKM@swfalse
+ \else
+ \let\BKM@prev\BKM@x@parent
+ \fi
+ \fi
+ }%
+ \pdfstringdef\BKM@title{\bookmark@text}%
+ \edef\BKM@FLAGS{\BKM@PrintStyle}%
+ \csname BKM@HypDestOptHook\endcsname
+ \BKM@EscapeHex\BKM@dest
+ \BKM@EscapeHex\BKM@uri
+ \BKM@EscapeHex\BKM@gotor
+ \BKM@EscapeHex\BKM@rawaction
+ \BKM@EscapeHex\BKM@title
+ \immediate\write\@mainaux{%
+ \string\BKM@entry{%
+ id=\number\BKM@id
+ \ifBKM@open
+ \ifnum\BKM@level<\BKM@openlevel
+ ,open%
+ \fi
+ \fi
+ \BKM@auxentry{dest}%
+ \BKM@auxentry{named}%
+ \BKM@auxentry{uri}%
+ \BKM@auxentry{gotor}%
+ \BKM@auxentry{page}%
+ \BKM@auxentry{view}%
+ \BKM@auxentry{rawaction}%
+ \BKM@auxentry{color}%
+ \ifnum\BKM@FLAGS>\z@
+ ,flags=\BKM@FLAGS
+ \fi
+ \BKM@auxentry{srcline}%
+ \BKM@auxentry{srcfile}%
+ }{\BKM@title}%
+ }%
+ \endgroup
+ \fi
+}
+\def\BKM@getx#1#2#3{%
+ \def\BKM@x@parent{#1}%
+ \def\BKM@x@level{#2}%
+ \def\BKM@x@childs{#3}%
+}
+\def\BKM@auxentry#1{%
+ \expandafter\ifx\csname BKM@#1\endcsname\@empty
+ \else
+ ,#1={\csname BKM@#1\endcsname}%
+ \fi
+}
+\def\BKM@InitSourceLocation{%
+ \edef\BKM@srcline{\the\inputlineno}%
+ \BKM@LuaTeX@InitFile
+ \ifx\BKM@srcfile\@empty
+ \ltx@IfUndefined{currfilepath}{}{%
+ \edef\BKM@srcfile{\currfilepath}%
+ }%
+ \fi
+}
+\ifluatex
+ \ifnum\luatexversion>36 %
+ \def\BKM@LuaTeX@InitFile{%
+ \begingroup
+ \ltx@LocToksA={}%
+ \edef\x{\endgroup
+ \def\noexpand\BKM@srcfile{%
+ \the\expandafter\ltx@LocToksA
+ \directlua{%
+ if status and status.filename then %
+ tex.settoks('ltx@LocToksA', status.filename)%
+ end%
+ }%
+ }%
+ }\x
+ }%
+ \else
+ \let\BKM@LuaTeX@InitFile\relax
+ \fi
+\else
+ \let\BKM@LuaTeX@InitFile\relax
+\fi
+\SetupKeyvalOptions{family=BKM@DO,prefix=BKM@DO@}
+\DeclareStringOption[0]{id}
+\DeclareBoolOption{open}
+\DeclareStringOption{flags}
+\DeclareStringOption{color}
+\DeclareStringOption{dest}
+\DeclareStringOption{named}
+\DeclareStringOption{uri}
+\DeclareStringOption{gotor}
+\DeclareStringOption{page}
+\DeclareStringOption{view}
+\DeclareStringOption{rawaction}
+\DeclareStringOption{srcline}
+\DeclareStringOption{srcfile}
+\AtBeginDocument{%
+ \let\BKM@entry\BKM@DO@entry
+}
+\ifBKM@atend
+ \AfterLastShipout{%
+ \BKM@EndHook
+ }%
+\fi
+%</pdftexfrozen>
+%<*dvipsfrozen>
+\def\BKM@SourceLocation{%
+ \ifx\BKM@DO@srcfile\@empty
+ \ifx\BKM@DO@srcline\@empty
+ \else
+ .\MessageBreak
+ Source: line \BKM@DO@srcline
+ \fi
+ \else
+ \ifx\BKM@DO@srcline\@empty
+ .\MessageBreak
+ Source: file `\BKM@DO@srcfile'%
+ \else
+ .\MessageBreak
+ Source: file `\BKM@DO@srcfile', line \BKM@DO@srcline
+ \fi
+ \fi
+}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{bkm-dvips.def}%
+ [2019/12/03 v1.28 bookmark driver for dvips (HO)]%
+\def\BKM@PSHeaderFile#1{%
+ \special{header=#1}%
+}
+\def\BKM@filename{\jobname.out.ps}
+\BKM@PSHeaderFile\BKM@filename
+\RequirePackage{atveryend}[2009/12/07]
+\AfterLastShipout{\BKM@pdfmark@out}
+\def\BKM@pdfmark@out{%
+ \if@filesw
+ \newwrite\BKM@file
+ \immediate\openout\BKM@file=\BKM@filename\relax
+ \BKM@write{\@percentchar!}%
+ \BKM@write{/pdfmark where{pop}}%
+ \BKM@write{%
+ {%
+ /globaldict where{pop globaldict}{userdict}ifelse%
+ /pdfmark/cleartomark load put%
+ }%
+ }%
+ \BKM@write{ifelse}%
+ \else
+ \let\BKM@write\@gobble
+ \let\BKM@DO@entry\@gobbletwo
+ \fi
+}
+\def\BKM@write#{%
+ \immediate\write\BKM@file
+}
+\def\BKM@DO@entry#1#2{%
+ \begingroup
+ \kvsetkeys{BKM@DO}{#1}%
+ \ifx\BKM@DO@srcfile\@empty
+ \else
+ \BKM@UnescapeHex\BKM@DO@srcfile
+ \fi
+ \def\BKM@DO@title{#2}%
+ \BKM@UnescapeHex\BKM@DO@title
+ \expandafter\expandafter\expandafter\BKM@getx
+ \csname BKM@\BKM@DO@id\endcsname\@empty\@empty
+ \let\BKM@attr\@empty
+ \ifx\BKM@DO@flags\@empty
+ \else
+ \edef\BKM@attr{\BKM@attr/F \BKM@DO@flags}%
+ \fi
+ \ifx\BKM@DO@color\@empty
+ \else
+ \edef\BKM@attr{\BKM@attr/C[\BKM@DO@color]}%
+ \fi
+ \let\BKM@action\@empty
+ \ifx\BKM@DO@gotor\@empty
+ \ifx\BKM@DO@dest\@empty
+ \ifx\BKM@DO@named\@empty
+ \ifx\BKM@DO@rawaction\@empty
+ \ifx\BKM@DO@uri\@empty
+ \ifx\BKM@DO@page\@empty
+ \PackageError{bookmark}{%
+ Missing action\BKM@SourceLocation
+ }\@ehc
+ \edef\BKM@action{%
+ /Action/GoTo%
+ /Page 1%
+ /View[/Fit]%
+ }%
+ \else
+ \ifx\BKM@DO@view\@empty
+ \def\BKM@DO@view{Fit}%
+ \fi
+ \edef\BKM@action{%
+ /Action/GoTo%
+ /Page \BKM@DO@page
+ /View[/\BKM@DO@view]%
+ }%
+ \fi
+ \else
+ \BKM@UnescapeHex\BKM@DO@uri
+ \BKM@EscapeString\BKM@DO@uri
+ \edef\BKM@action{%
+ /Action<<%
+ /Subtype/URI%
+ /URI(\BKM@DO@uri)%
+ >>%
+ }%
+ \fi
+ \else
+ \BKM@UnescapeHex\BKM@DO@rawaction
+ \edef\BKM@action{%
+ /Action<<%
+ \BKM@DO@rawaction
+ >>%
+ }%
+ \fi
+ \else
+ \BKM@EscapeName\BKM@DO@named
+ \edef\BKM@action{%
+ /Action<<%
+ /Subtype/Named%
+ /N/\BKM@DO@named
+ >>%
+ }%
+ \fi
+ \else
+ \BKM@UnescapeHex\BKM@DO@dest
+ \BKM@EscapeString\BKM@DO@dest
+ \edef\BKM@action{%
+ /Action/GoTo%
+ /Dest(\BKM@DO@dest)cvn%
+ }%
+ \fi
+ \else
+ \ifx\BKM@DO@dest\@empty
+ \ifx\BKM@DO@page\@empty
+ \def\BKM@DO@page{1}%
+ \fi
+ \ifx\BKM@DO@view\@empty
+ \def\BKM@DO@view{Fit}%
+ \fi
+ \edef\BKM@action{%
+ /Page \BKM@DO@page
+ /View[/\BKM@DO@view]%
+ }%
+ \else
+ \BKM@UnescapeHex\BKM@DO@dest
+ \BKM@EscapeString\BKM@DO@dest
+ \edef\BKM@action{%
+ /Dest(\BKM@DO@dest)cvn%
+ }%
+ \fi
+ \BKM@UnescapeHex\BKM@DO@gotor
+ \BKM@EscapeString\BKM@DO@gotor
+ \edef\BKM@action{%
+ /Action/GoToR%
+ /File(\BKM@DO@gotor)%
+ \BKM@action
+ }%
+ \fi
+ \BKM@write{[}%
+ \BKM@write{/Title(\BKM@DO@title)}%
+ \ifnum\BKM@x@childs>\z@
+ \BKM@write{/Count \ifBKM@DO@open\else-\fi\BKM@x@childs}%
+ \fi
+ \ifx\BKM@attr\@empty
+ \else
+ \BKM@write{\BKM@attr}%
+ \fi
+ \BKM@write{\BKM@action}%
+ \BKM@write{/OUT pdfmark}%
+ \endgroup
+}
+\RequirePackage{auxhook}
+\AddLineBeginMainAux{%
+ \string\providecommand\string\BKM@entry[2]{}%
+}
+\newcount\BKM@id
+\BKM@id=\z@
+\@namedef{BKM@0}{000}
+\newif\ifBKM@sw
+\newcommand*{\bookmark}[2][]{%
+ \if@filesw
+ \begingroup
+ \BKM@InitSourceLocation
+ \def\bookmark@text{#2}%
+ \BKM@setup{#1}%
+ \ifx\BKM@srcfile\@empty
+ \else
+ \BKM@EscapeHex\BKM@srcfile
+ \fi
+ \edef\BKM@prev{\the\BKM@id}%
+ \global\advance\BKM@id\@ne
+ \BKM@swtrue
+ \@whilesw\ifBKM@sw\fi{%
+ \ifnum\ifBKM@startatroot\z@\else\BKM@prev\fi=\z@
+ \BKM@startatrootfalse
+ \expandafter\xdef\csname BKM@\the\BKM@id\endcsname{%
+ 0{\BKM@level}0%
+ }%
+ \BKM@swfalse
+ \else
+ \expandafter\expandafter\expandafter\BKM@getx
+ \csname BKM@\BKM@prev\endcsname
+ \ifnum\BKM@level>\BKM@x@level\relax
+ \expandafter\xdef\csname BKM@\the\BKM@id\endcsname{%
+ {\BKM@prev}{\BKM@level}0%
+ }%
+ \ifnum\BKM@prev>\z@
+ \BKM@CalcExpr\BKM@CalcResult\BKM@x@childs+1%
+ \expandafter\xdef\csname BKM@\BKM@prev\endcsname{%
+ {\BKM@x@parent}{\BKM@x@level}{\BKM@CalcResult}%
+ }%
+ \fi
+ \BKM@swfalse
+ \else
+ \let\BKM@prev\BKM@x@parent
+ \fi
+ \fi
+ }%
+ \pdfstringdef\BKM@title{\bookmark@text}%
+ \edef\BKM@FLAGS{\BKM@PrintStyle}%
+ \csname BKM@HypDestOptHook\endcsname
+ \BKM@EscapeHex\BKM@dest
+ \BKM@EscapeHex\BKM@uri
+ \BKM@EscapeHex\BKM@gotor
+ \BKM@EscapeHex\BKM@rawaction
+ \BKM@EscapeHex\BKM@title
+ \immediate\write\@mainaux{%
+ \string\BKM@entry{%
+ id=\number\BKM@id
+ \ifBKM@open
+ \ifnum\BKM@level<\BKM@openlevel
+ ,open%
+ \fi
+ \fi
+ \BKM@auxentry{dest}%
+ \BKM@auxentry{named}%
+ \BKM@auxentry{uri}%
+ \BKM@auxentry{gotor}%
+ \BKM@auxentry{page}%
+ \BKM@auxentry{view}%
+ \BKM@auxentry{rawaction}%
+ \BKM@auxentry{color}%
+ \ifnum\BKM@FLAGS>\z@
+ ,flags=\BKM@FLAGS
+ \fi
+ \BKM@auxentry{srcline}%
+ \BKM@auxentry{srcfile}%
+ }{\BKM@title}%
+ }%
+ \endgroup
+ \fi
+}
+\def\BKM@getx#1#2#3{%
+ \def\BKM@x@parent{#1}%
+ \def\BKM@x@level{#2}%
+ \def\BKM@x@childs{#3}%
+}
+\def\BKM@auxentry#1{%
+ \expandafter\ifx\csname BKM@#1\endcsname\@empty
+ \else
+ ,#1={\csname BKM@#1\endcsname}%
+ \fi
+}
+\def\BKM@InitSourceLocation{%
+ \edef\BKM@srcline{\the\inputlineno}%
+ \BKM@LuaTeX@InitFile
+ \ifx\BKM@srcfile\@empty
+ \ltx@IfUndefined{currfilepath}{}{%
+ \edef\BKM@srcfile{\currfilepath}%
+ }%
+ \fi
+}
+\ifluatex
+ \ifnum\luatexversion>36 %
+ \def\BKM@LuaTeX@InitFile{%
+ \begingroup
+ \ltx@LocToksA={}%
+ \edef\x{\endgroup
+ \def\noexpand\BKM@srcfile{%
+ \the\expandafter\ltx@LocToksA
+ \directlua{%
+ if status and status.filename then %
+ tex.settoks('ltx@LocToksA', status.filename)%
+ end%
+ }%
+ }%
+ }\x
+ }%
+ \else
+ \let\BKM@LuaTeX@InitFile\relax
+ \fi
+\else
+ \let\BKM@LuaTeX@InitFile\relax
+\fi
+\SetupKeyvalOptions{family=BKM@DO,prefix=BKM@DO@}
+\DeclareStringOption[0]{id}
+\DeclareBoolOption{open}
+\DeclareStringOption{flags}
+\DeclareStringOption{color}
+\DeclareStringOption{dest}
+\DeclareStringOption{named}
+\DeclareStringOption{uri}
+\DeclareStringOption{gotor}
+\DeclareStringOption{page}
+\DeclareStringOption{view}
+\DeclareStringOption{rawaction}
+\DeclareStringOption{srcline}
+\DeclareStringOption{srcfile}
+\AtBeginDocument{%
+ \let\BKM@entry\BKM@DO@entry
+}
+\ifBKM@atend
+ \AfterLastShipout{%
+ \BKM@EndHook
+ }%
+\fi
+%</dvipsfrozen>
+%<*dvipdfmfrozen>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{bkm-dvipdfm.def}%
+ [2019/12/03 v1.28 bookmark driver for dvipdfm (HO)]%
+\newcount\BKM@id
+\BKM@id=\z@
+\@namedef{BKM@0}{000}
+\newif\ifBKM@sw
+\newcommand*{\bookmark}[2][]{%
+ \if@filesw
+ \begingroup
+ \def\bookmark@text{#2}%
+ \BKM@setup{#1}%
+ \edef\BKM@prev{\the\BKM@id}%
+ \global\advance\BKM@id\@ne
+ \BKM@swtrue
+ \@whilesw\ifBKM@sw\fi{%
+ \def\BKM@abslevel{1}%
+ \ifnum\ifBKM@startatroot\z@\else\BKM@prev\fi=\z@
+ \BKM@startatrootfalse
+ \expandafter\xdef\csname BKM@\the\BKM@id\endcsname{%
+ 0{\BKM@level}\BKM@abslevel
+ }%
+ \BKM@swfalse
+ \else
+ \expandafter\expandafter\expandafter\BKM@getx
+ \csname BKM@\BKM@prev\endcsname
+ \ifnum\BKM@level>\BKM@x@level\relax
+ \BKM@CalcExpr\BKM@abslevel\BKM@x@abslevel+1%
+ \expandafter\xdef\csname BKM@\the\BKM@id\endcsname{%
+ {\BKM@prev}{\BKM@level}\BKM@abslevel
+ }%
+ \BKM@swfalse
+ \else
+ \let\BKM@prev\BKM@x@parent
+ \fi
+ \fi
+ }%
+ \csname HyPsd@XeTeXBigCharstrue\endcsname
+ \pdfstringdef\BKM@title{\bookmark@text}%
+ \edef\BKM@FLAGS{\BKM@PrintStyle}%
+ \let\BKM@action\@empty
+ \ifx\BKM@gotor\@empty
+ \ifx\BKM@dest\@empty
+ \ifx\BKM@named\@empty
+ \ifx\BKM@rawaction\@empty
+ \ifx\BKM@uri\@empty
+ \ifx\BKM@page\@empty
+ \PackageError{bookmark}{Missing action}\@ehc
+ \edef\BKM@action{/Dest[@page1/Fit]}%
+ \else
+ \ifx\BKM@view\@empty
+ \def\BKM@view{Fit}%
+ \fi
+ \edef\BKM@action{/Dest[@page\BKM@page/\BKM@view]}%
+ \fi
+ \else
+ \BKM@EscapeString\BKM@uri
+ \edef\BKM@action{%
+ /A<<%
+ /S/URI%
+ /URI(\BKM@uri)%
+ >>%
+ }%
+ \fi
+ \else
+ \edef\BKM@action{/A<<\BKM@rawaction>>}%
+ \fi
+ \else
+ \BKM@EscapeName\BKM@named
+ \edef\BKM@action{%
+ /A<</S/Named/N/\BKM@named>>%
+ }%
+ \fi
+ \else
+ \BKM@EscapeString\BKM@dest
+ \edef\BKM@action{%
+ /A<<%
+ /S/GoTo%
+ /D(\BKM@dest)%
+ >>%
+ }%
+ \fi
+ \else
+ \ifx\BKM@dest\@empty
+ \ifx\BKM@page\@empty
+ \def\BKM@page{0}%
+ \else
+ \BKM@CalcExpr\BKM@page\BKM@page-1%
+ \fi
+ \ifx\BKM@view\@empty
+ \def\BKM@view{Fit}%
+ \fi
+ \edef\BKM@action{/D[\BKM@page/\BKM@view]}%
+ \else
+ \BKM@EscapeString\BKM@dest
+ \edef\BKM@action{/D(\BKM@dest)}%
+ \fi
+ \BKM@EscapeString\BKM@gotor
+ \edef\BKM@action{%
+ /A<<%
+ /S/GoToR%
+ /F(\BKM@gotor)%
+ \BKM@action
+ >>%
+ }%
+ \fi
+ \special{pdf:%
+ out \ifBKM@DvipdfmxOutlineOpen
+ [%
+ \ifBKM@open
+ \ifnum\BKM@level<%
+ \expandafter\ltx@firstofone\expandafter
+ {\number\BKM@openlevel} %
+ \else
+ -%
+ \fi
+ \else
+ -%
+ \fi
+ ] %
+ \fi
+ \BKM@abslevel
+ <<%
+ /Title(\BKM@title)%
+ \ifx\BKM@color\@empty
+ \else
+ /C[\BKM@color]%
+ \fi
+ \ifnum\BKM@FLAGS>\z@
+ /F \BKM@FLAGS
+ \fi
+ \BKM@action
+ >>%
+ }%
+ \endgroup
+ \fi
+}
+\def\BKM@getx#1#2#3{%
+ \def\BKM@x@parent{#1}%
+ \def\BKM@x@level{#2}%
+ \def\BKM@x@abslevel{#3}%
+}
+\ifBKM@atend
+ \RequirePackage{atenddvi}%
+ \AtEndDvi{\BKM@EndHook}%
+\fi
+%</dvipdfmfrozen>
+%<*vtexfrozen>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{bkm-vtex.def}%
+ [2019/12/03 v1.28 bookmark driver for VTeX (HO)]%
+\ifvtexpdf
+\else
+ \PackageWarningNoLine{bookmark}{%
+ The VTeX driver only supports PDF mode%
+ }%
+\fi
+\newcount\BKM@id
+\BKM@id=\z@
+\@namedef{BKM@0}{00}
+\newif\ifBKM@sw
+\newcommand*{\bookmark}[2][]{%
+ \if@filesw
+ \begingroup
+ \def\bookmark@text{#2}%
+ \BKM@setup{#1}%
+ \edef\BKM@prev{\the\BKM@id}%
+ \global\advance\BKM@id\@ne
+ \BKM@swtrue
+ \@whilesw\ifBKM@sw\fi{%
+ \ifnum\ifBKM@startatroot\z@\else\BKM@prev\fi=\z@
+ \BKM@startatrootfalse
+ \def\BKM@parent{0}%
+ \expandafter\xdef\csname BKM@\the\BKM@id\endcsname{%
+ 0{\BKM@level}%
+ }%
+ \BKM@swfalse
+ \else
+ \expandafter\expandafter\expandafter\BKM@getx
+ \csname BKM@\BKM@prev\endcsname
+ \ifnum\BKM@level>\BKM@x@level\relax
+ \let\BKM@parent\BKM@prev
+ \expandafter\xdef\csname BKM@\the\BKM@id\endcsname{%
+ {\BKM@prev}{\BKM@level}%
+ }%
+ \BKM@swfalse
+ \else
+ \let\BKM@prev\BKM@x@parent
+ \fi
+ \fi
+ }%
+ \pdfstringdef\BKM@title{\bookmark@text}%
+ \BKM@vtex@title
+ \edef\BKM@FLAGS{\BKM@PrintStyle}%
+ \let\BKM@action\@empty
+ \ifx\BKM@gotor\@empty
+ \ifx\BKM@dest\@empty
+ \ifx\BKM@named\@empty
+ \ifx\BKM@rawaction\@empty
+ \ifx\BKM@uri\@empty
+ \ifx\BKM@page\@empty
+ \PackageError{bookmark}{Missing action}\@ehc
+ \def\BKM@action{!1}%
+ \else
+ \edef\BKM@action{!\BKM@page}%
+ \fi
+ \else
+ \BKM@EscapeString\BKM@uri
+ \edef\BKM@action{%
+ <u=%
+ /S/URI%
+ /URI(\BKM@uri)%
+ >%
+ }%
+ \fi
+ \else
+ \edef\BKM@action{<u=\BKM@rawaction>}%
+ \fi
+ \else
+ \BKM@EscapeName\BKM@named
+ \edef\BKM@action{%
+ <u=%
+ /S/Named%
+ /N/\BKM@named
+ >%
+ }%
+ \fi
+ \else
+ \BKM@EscapeString\BKM@dest
+ \edef\BKM@action{\BKM@dest}%
+ \fi
+ \else
+ \ifx\BKM@dest\@empty
+ \ifx\BKM@page\@empty
+ \def\BKM@page{1}%
+ \fi
+ \ifx\BKM@view\@empty
+ \def\BKM@view{Fit}%
+ \fi
+ \edef\BKM@action{/D[\BKM@page/\BKM@view]}%
+ \else
+ \BKM@EscapeString\BKM@dest
+ \edef\BKM@action{/D(\BKM@dest)}%
+ \fi
+ \BKM@EscapeString\BKM@gotor
+ \edef\BKM@action{%
+ <u=%
+ /S/GoToR%
+ /F(\BKM@gotor)%
+ \BKM@action
+ >>%
+ }%
+ \fi
+ \ifx\BKM@color\@empty
+ \let\BKM@RGBcolor\@empty
+ \else
+ \expandafter\BKM@toRGB\BKM@color\@nil
+ \fi
+ \special{%
+ !outline \BKM@action;%
+ p=\BKM@parent,%
+ i=\number\BKM@id,%
+ s=%
+ \ifBKM@open
+ \ifnum\BKM@level<\BKM@openlevel
+ o%
+ \else
+ c%
+ \fi
+ \else
+ c%
+ \fi,%
+ \ifx\BKM@RGBcolor\@empty
+ \else
+ c=\BKM@RGBcolor,%
+ \fi
+ \ifnum\BKM@FLAGS>\z@
+ f=\BKM@FLAGS,%
+ \fi
+ t=\BKM@title
+ }%
+ \endgroup
+ \fi
+}
+\def\BKM@getx#1#2{%
+ \def\BKM@x@parent{#1}%
+ \def\BKM@x@level{#2}%
+}
+\def\BKM@toRGB#1 #2 #3\@nil{%
+ \let\BKM@RGBcolor\@empty
+ \BKM@toRGBComponent{#1}%
+ \BKM@toRGBComponent{#2}%
+ \BKM@toRGBComponent{#3}%
+}
+\def\BKM@toRGBComponent#1{%
+ \dimen@=#1pt\relax
+ \ifdim\dimen@>\z@
+ \ifdim\dimen@<\p@
+ \dimen@=255\dimen@
+ \advance\dimen@ by 32768sp\relax
+ \divide\dimen@ by 65536\relax
+ \dimen@ii=\dimen@
+ \divide\dimen@ii by 16\relax
+ \edef\BKM@RGBcolor{%
+ \BKM@RGBcolor
+ \BKM@toHexDigit\dimen@ii
+ }%
+ \dimen@ii=16\dimen@ii
+ \advance\dimen@-\dimen@ii
+ \edef\BKM@RGBcolor{%
+ \BKM@RGBcolor
+ \BKM@toHexDigit\dimen@
+ }%
+ \else
+ \edef\BKM@RGBcolor{\BKM@RGBcolor FF}%
+ \fi
+ \else
+ \edef\BKM@RGBcolor{\BKM@RGBcolor00}%
+ \fi
+}
+\def\BKM@toHexDigit#1{%
+ \ifcase\expandafter\@firstofone\expandafter{\number#1} %
+ 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or
+ 8\or 9\or A\or B\or C\or D\or E\or F%
+ \fi
+}
+\begingroup
+ \catcode`\|=0 %
+ \catcode`\\=12 %
+ |gdef|BKM@vtex@title{%
+ |@onelevel@sanitize|BKM@title
+ |edef|BKM@title{|expandafter|BKM@vtex@leftparen|BKM@title\(|@nil}%
+ |edef|BKM@title{|expandafter|BKM@vtex@rightparen|BKM@title\)|@nil}%
+ |edef|BKM@title{|expandafter|BKM@vtex@zero|BKM@title\0|@nil}%
+ |edef|BKM@title{|expandafter|BKM@vtex@one|BKM@title\1|@nil}%
+ |edef|BKM@title{|expandafter|BKM@vtex@two|BKM@title\2|@nil}%
+ |edef|BKM@title{|expandafter|BKM@vtex@three|BKM@title\3|@nil}%
+ }%
+ |gdef|BKM@vtex@leftparen#1\(#2|@nil{%
+ #1%
+ |ifx||#2||%
+ |else
+ (%
+ |ltx@ReturnAfterFi{%
+ |BKM@vtex@leftparen#2|@nil
+ }%
+ |fi
+ }%
+ |gdef|BKM@vtex@rightparen#1\)#2|@nil{%
+ #1%
+ |ifx||#2||%
+ |else
+ )%
+ |ltx@ReturnAfterFi{%
+ |BKM@vtex@rightparen#2|@nil
+ }%
+ |fi
+ }%
+ |gdef|BKM@vtex@zero#1\0#2|@nil{%
+ #1%
+ |ifx||#2||%
+ |else
+ |noexpand|hv@pdf@char0%
+ |ltx@ReturnAfterFi{%
+ |BKM@vtex@zero#2|@nil
+ }%
+ |fi
+ }%
+ |gdef|BKM@vtex@one#1\1#2|@nil{%
+ #1%
+ |ifx||#2||%
+ |else
+ |noexpand|hv@pdf@char1%
+ |ltx@ReturnAfterFi{%
+ |BKM@vtex@one#2|@nil
+ }%
+ |fi
+ }%
+ |gdef|BKM@vtex@two#1\2#2|@nil{%
+ #1%
+ |ifx||#2||%
+ |else
+ |noexpand|hv@pdf@char2%
+ |ltx@ReturnAfterFi{%
+ |BKM@vtex@two#2|@nil
+ }%
+ |fi
+ }%
+ |gdef|BKM@vtex@three#1\3#2|@nil{%
+ #1%
+ |ifx||#2||%
+ |else
+ |noexpand|hv@pdf@char3%
+ |ltx@ReturnAfterFi{%
+ |BKM@vtex@three#2|@nil
+ }%
+ |fi
+ }%
+|endgroup
+\ifBKM@atend
+ \RequirePackage{atenddvi}%
+ \AtEndDvi{\BKM@EndHook}%
+\fi
+%</vtexfrozen>
diff --git a/Master/texmf-dist/source/latex/bookmark/bookmark.dtx b/Master/texmf-dist/source/latex/bookmark/bookmark.dtx
index 49ed2e897d1..c4431428b95 100644
--- a/Master/texmf-dist/source/latex/bookmark/bookmark.dtx
+++ b/Master/texmf-dist/source/latex/bookmark/bookmark.dtx
@@ -1,12 +1,12 @@
% \iffalse meta-comment
%
% File: bookmark.dtx
-% Version: 2019/12/03 v1.28
+% Version: 2020-11-06 v1.29
% Info: PDF bookmarks
%
% Copyright (C)
% 2007-2011 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
+% 2016-2020 Oberdiek Package Support Group
% https://github.com/ho-tex/bookmark/issues
%
% This work may be distributed and/or modified under the
@@ -28,12 +28,15 @@
% This work consists of the main source file bookmark.dtx
% and the derived files
% bookmark.sty, bookmark.pdf, bookmark.ins, bookmark.drv,
-% bkm-dvipdfm.def, bkm-dvips.def, bkm-dvipsone.def,
-% bkm-textures.def, bkm-pdftex.def, bkm-vtex.def,
+% bkm-dvipdfm.def, bkm-dvips.def,
+% bkm-pdftex.def, bkm-vtex.def,
+% bkm-dvipdfm-2019-12-03.def, bkm-dvips-2019-12-03.def,
+% bkm-pdftex-2019-12-03.def, bkm-vtex-2019-12-03.def,
% bookmark-example.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/bookmark/bookmark.dtx
+% CTAN:macros/latex/contrib/bookmark/bookmark-frozen.dtx
% CTAN:macros/latex/contrib/bookmark/bookmark.pdf
%
% Unpacking:
@@ -66,13 +69,16 @@
% TDS:tex/latex/bookmark/bookmark.sty
% TDS:tex/latex/bookmark/bkm-dvipdfm.def
% TDS:tex/latex/bookmark/bkm-dvips.def
-% TDS:tex/latex/bookmark/bkm-dvipsone.def
-% TDS:tex/latex/bookmark/bkm-textures.def
% TDS:tex/latex/bookmark/bkm-pdftex.def
% TDS:tex/latex/bookmark/bkm-vtex.def
+% TDS:tex/latex/bookmark/bkm-dvipdfm-2019-12-03.def
+% TDS:tex/latex/bookmark/bkm-dvips-2019-12-03.def
+% TDS:tex/latex/bookmark/bkm-pdftex-2019-12-03.def
+% TDS:tex/latex/bookmark/bkm-vtex-2019-12-03.def%
% TDS:doc/latex/bookmark/bookmark.pdf
% TDS:doc/latex/bookmark/bookmark-example.tex
% TDS:source/latex/bookmark/bookmark.dtx
+% TDS:source/latex/bookmark/bookmark-frozen.dtx
%
%<*ignore>
\begingroup
@@ -89,7 +95,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: bookmark 2019/12/03 v1.28 PDF bookmarks (HO)}
+\Msg{* Package: bookmark 2020-11-06 v1.29 PDF bookmarks (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -101,11 +107,11 @@
This is a generated file.
Project: bookmark
-Version: 2019/12/03 v1.28
+Version: 2020-11-06 v1.29
Copyright (C)
2007-2011 Heiko Oberdiek
- 2016-2019 Oberdiek Package Support Group
+ 2016-2020 Oberdiek Package Support Group
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -124,11 +130,12 @@ Heiko Oberdiek and the Oberdiek Package Support Group
https://github.com/ho-tex/bookmark/issues
-This work consists of the main source file bookmark.dtx
+This work consists of the main source file bookmark.dtx and bookmark-frozen.dtx
and the derived files
bookmark.sty, bookmark.pdf, bookmark.ins, bookmark.drv,
- bkm-dvipdfm.def, bkm-dvips.def, bkm-dvipsone.def,
- bkm-textures.def, bkm-pdftex.def, bkm-vtex.def,
+ bkm-dvipdfm.def, bkm-dvips.def, bkm-pdftex.def, bkm-vtex.def,
+ bkm-dvipdfm-2019-12-03.def, bkm-dvips-2019-12-03.def,
+ bkm-pdftex-2019-12-03.def, bkm-vtex-2019-12-03.def,
bookmark-example.tex.
\endpreamble
@@ -141,12 +148,14 @@ and the derived files
\file{bookmark.sty}{\from{bookmark.dtx}{package}}%
\file{bkm-dvipdfm.def}{\from{bookmark.dtx}{dvipdfm}}%
\file{bkm-dvips.def}{\from{bookmark.dtx}{dvips,pdfmark}}%
- \file{bkm-dvipsone.def}{\from{bookmark.dtx}{dvipsone,pdfmark}}%
- \file{bkm-textures.def}{\from{bookmark.dtx}{textures,pdfmark}}%
\file{bkm-pdftex.def}{\from{bookmark.dtx}{pdftex}}%
\file{bkm-vtex.def}{\from{bookmark.dtx}{vtex}}%
\usedir{doc/latex/bookmark}%
\file{bookmark-example.tex}{\from{bookmark.dtx}{example}}%
+ \file{bkm-pdftex-2019-12-03.def}{\from{bookmark-frozen.dtx}{pdftexfrozen}}%
+ \file{bkm-dvips-2019-12-03.def}{\from{bookmark-frozen.dtx}{dvipsfrozen}}%
+ \file{bkm-vtex-2019-12-03.def}{\from{bookmark-frozen.dtx}{vtexfrozen}}%
+ \file{bkm-dvipdfm-2019-12-03.def}{\from{bookmark-frozen.dtx}{dvipdfmfrozen}}%
}
\catcode32=13\relax% active space
@@ -157,8 +166,9 @@ and the derived files
\Msg{* files into a directory searched by TeX:}
\Msg{*}
\Msg{* bookmark.sty, bkm-dvipdfm.def, bkm-dvips.def,}
-\Msg{* bkm-dvipsone.def, bkm-textures.def, bkm-pdftex.def,}
-\Msg{* bkm-vtex.def}
+\Msg{* bkm-pdftex.def, bkm-vtex.def, bkm-dvipdfm-2019-12-03.def,}
+\Msg{* bkm-dvips-2019-12-03.def, bkm-pdftex-2019-12-03.def,}
+\Msg{* and bkm-vtex-2019-12-03.def}
\Msg{*}
\Msg{* To produce the documentation run the file `bookmark.drv'}
\Msg{* through LaTeX.}
@@ -175,7 +185,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{bookmark.drv}%
- [2019/12/03 v1.28 PDF bookmarks (HO)]%
+ [2020-11-06 v1.29 PDF bookmarks (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}[2011/11/22]
\begin{document}
@@ -189,7 +199,7 @@ and the derived files
% \GetFileInfo{bookmark.drv}
%
% \title{The \xpackage{bookmark} package}
-% \date{2019/12/03 v1.28}
+% \date{2020-11-06 v1.29}
% \author{Heiko Oberdiek\thanks
% {Please report any issues at \url{https://github.com/ho-tex/bookmark/issues}}}
%
@@ -287,7 +297,6 @@ and the derived files
% \subsubsection{Driver options}
%
% Supported drivers are \xoption{pdftex}, \xoption{dvips},
-% \xoption{dvipsone}, \xoption{textures},
% \xoption{dvipdfm} (\xoption{xetex}), and \xoption{vtex}.
% The \hologo{TeX} engines \hologo{pdfTeX}, \hologo{XeTeX},
% and \hologo{VTeX} are automatically detected.
@@ -297,18 +306,18 @@ and the derived files
% \begin{quote}
% |\def\BookmarkDriverDefault{dvipdfm}|
% \end{quote}
+% The current versions of the drivers uses new \LaTeX-hooks. If an
+% older format than 2020-10-01 is detected frozen versions of
+% the previous drivers are used as fallback.
+%
+% \paragraph{Open bookmarks with dvipdfmx.} Older version of
+% the package had an option \xoption{dvipdfmx-outline-open}
+% to activate code which allows to specify the open
+% status of an outline entry.
+% The package now assumes that all used dvipdfmx version are current enough to
+% understand this code and so activates the code always.
+% The option itself will be ignored.
%
-% \paragraph{Open bookmarks with dvipdfmx.} Since 2007-04-25 the
-% cvs version of dvipmdfmx contains a patch that extends the
-% \cs{special} for bookmarks in order to specify the open status of
-% an outline entry. Option \xoption{dvipdfmx-outline-open} notifies
-% the package that the dvi driver program understands this kind
-% of \cs{special}. Alternatively \cs{SpecialDvipdfmxOutlineOpen}
-% can be defined as number one in the configuration file or before
-% the package is loaded, e.g.:
-% \begin{quote}
-% |\chardef\SpecialDvipdfmxOutlineOpen=1\relax|
-% \end{quote}
%
% \subsubsection{Layout options}
%
@@ -396,7 +405,7 @@ and the derived files
% unhappily the file name is a secret. The package supports
% some ways to get the file name:
% \begin{itemize}
-% \item If \hologo{LuaTeX} (indenpendently from DVI or PDF modus)
+% \item If \hologo{LuaTeX} (independently from DVI or PDF modus)
% is running, then its |status.filename| is used automatically.
% \item Package \cs{currfile} \cite{currfile} redefines \hologo{LaTeX}
% internals to keep track of the file name. If the package
@@ -607,12 +616,11 @@ and the derived files
% adding bookmarks at the end of the document depends
% on the driver.
%
-% Some drivers
-% (\xoption{pdftex}, \xoption{dvips}, \xoption{dvipsone},
-% \xoption{textures}) use package \xpackage{atveryend}'s
+% The driver \xoption{pdftex}
+% use package \xpackage{atveryend}'s
% for this purpose. \cs{AtEndDocument} is too early,
% the last page might not been shipped out. Because the \xext{aux}
-% file is needed, these drivers use \cs{AfterLastShipout}.
+% file is needed, this driver use \cs{AfterLastShipout}.
%
% The implementation of the other drivers
% (\xoption{dvipdfm}, \xoption{xetex}, \xoption{vtex})
@@ -622,6 +630,8 @@ and the derived files
% helps. It puts its argument on last page of the document.
% Two \hologo{LaTeX} runs are necessary at least, because
% the last page is detected by a reference.
+%
+% \xoption{dvips} uses now the new LaTeX hook \texttt{shipout/lastpage}.
% \item
% The time of expansion of the argument of \cs{BookmarkAtEnd}
% is not specified. This can happen immediately or at the end
@@ -752,7 +762,7 @@ and the derived files
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{bookmark}%
- [2019/12/03 v1.28 PDF bookmarks (HO)]%
+ [2020-11-06 v1.29 PDF bookmarks (HO)]%
% \end{macrocode}
%
% \subsubsection{Requirements}
@@ -1622,23 +1632,13 @@ and the derived files
% \begin{macrocode}
\BKM@DefineDriverKey{pdftex}
\BKM@DefineDriverKey{dvips}
-\BKM@DefineDriverKey{dvipsone}
-\BKM@DefineDriverKey{textures}
\BKM@DefineDriverKey{dvipdfm}
\BKM@DefineDriverKey{dvipdfmx}
\BKM@DefineDriverKey{xetex}
\BKM@DefineDriverKey{vtex}
\define@key{BKM}{dvipdfmx-outline-open}[true]{%
- \expandafter\ifx\csname if#1\expandafter\endcsname
- \csname iftrue\endcsname
- \chardef\SpecialDvipdfmxOutlineOpen\@ne
- \else
- \chardef\SpecialDvipdfmxOutlineOpen\z@
- \fi
-}
-\g@addto@macro\BKM@DisableOptions{%
- \DisableKeyvalOption{BKM}{dvipdfmx-outline-open}%
-}
+ \PackageWarning{bookmark}{Option 'dvipdfmx-outline-open' is obsolete
+ and ignored}{}}
% \end{macrocode}
% \begin{macro}{\bookmark@driver}
% \begin{macrocode}
@@ -1709,22 +1709,6 @@ and the derived files
% \paragraph{Driver validation and loading.}
%
% \begin{macrocode}
-\newif\ifBKM@DvipdfmxOutlineOpen
-\ltx@IfUndefined{SpecialDvipdfmxOutlineOpen}{%
- \ifxetex
- \ifdim\number\XeTeXversion\XeTeXrevision in<0.9995in %
- \else
- \chardef\SpecialDvipdfmxOutlineOpen\ltx@one
- \BKM@DvipdfmxOutlineOpentrue
- \fi
- \fi
-}{%
- \ifnum\SpecialDvipdfmxOutlineOpen>\z@
- \BKM@DvipdfmxOutlineOpentrue
- \fi
-}
-% \end{macrocode}
-% \begin{macrocode}
\def\BKM@temp{dvipdfmx}%
\ifx\BKM@temp\BKM@driver
\def\BKM@driver{dvipdfm}%
@@ -1778,6 +1762,8 @@ and the derived files
\fi
\fi
\fi
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}{}{\edef\BKM@driver{\BKM@driver-2019-12-03}}
\InputIfFileExists{bkm-\BKM@driver.def}{}{%
\PackageError{bookmark}{%
Unsupported driver `\BKM@driver'.\MessageBreak
@@ -1843,7 +1829,7 @@ and the derived files
\let\partnumberline\@gobble
\let\chapternumberline\@gobble
\fi
- \bookmark[level=#4,dest={#3}]{#2}%
+ \bookmark[level=#4,dest={\HyperDestNameFilter{#3}}]{#2}%
\endgroup
\fi
\fi
@@ -1867,7 +1853,7 @@ and the derived files
%<*dvipdfm>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{bkm-dvipdfm.def}%
- [2019/12/03 v1.28 bookmark driver for dvipdfm (HO)]%
+ [2020-11-06 v1.29 bookmark driver for dvipdfm (HO)]%
% \end{macrocode}
%
% \begin{macro}{\BKM@id}
@@ -1990,7 +1976,7 @@ and the derived files
}%
\fi
\special{pdf:%
- out \ifBKM@DvipdfmxOutlineOpen
+ out
[%
\ifBKM@open
\ifnum\BKM@level<%
@@ -2003,7 +1989,6 @@ and the derived files
-%
\fi
] %
- \fi
\BKM@abslevel
<<%
/Title(\BKM@title)%
@@ -2042,7 +2027,7 @@ and the derived files
%<*vtex>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{bkm-vtex.def}%
- [2019/12/03 v1.28 bookmark driver for VTeX (HO)]%
+ [2020-11-06 v1.29 bookmark driver for VTeX (HO)]%
% \end{macrocode}
%
% \begin{macrocode}
@@ -2373,7 +2358,7 @@ and the derived files
%<*pdftex>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{bkm-pdftex.def}%
- [2019/12/03 v1.28 bookmark driver for pdfTeX (HO)]%
+ [2020-11-06 v1.29 bookmark driver for pdfTeX (HO)]%
% \end{macrocode}
%
% \begin{macro}{\BKM@DO@entry}
@@ -2529,55 +2514,28 @@ and the derived files
%<*dvips>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{bkm-dvips.def}%
- [2019/12/03 v1.28 bookmark driver for dvips (HO)]%
+ [2020-11-06 v1.29 bookmark driver for dvips (HO)]%
% \end{macrocode}
% \begin{macro}{\BKM@PSHeaderFile}
% \begin{macrocode}
\def\BKM@PSHeaderFile#1{%
- \special{header=#1}%
+ \special{PSfile=#1}%
}
% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-%</dvips>
-% \end{macrocode}
-%
-% \subsubsection{Driver dvipsone}
-%
-% \begin{macrocode}
-%<*dvipsone>
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{bkm-dvipsone.def}%
- [2019/12/03 v1.28 bookmark driver for dvipsone (HO)]%
-% \end{macrocode}
-% \begin{macro}{\BKM@PSHeaderFile}
+% \begin{macro}{\BKM@filename}
% \begin{macrocode}
-\def\BKM@PSHeaderFile#1{%
- \special{header=#1}%
-}
+\def\BKM@filename{\jobname.out.ps}
% \end{macrocode}
% \end{macro}
% \begin{macrocode}
-%</dvipsone>
-% \end{macrocode}
-%
-% \subsubsection{Driver textures}
-%
-% \begin{macrocode}
-%<*textures>
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{bkm-textures.def}%
- [2019/12/03 v1.28 bookmark driver for textures (HO)]%
-% \end{macrocode}
-% \begin{macro}{\BKM@PSHeaderFile}
-% \begin{macrocode}
-\def\BKM@PSHeaderFile#1{%
- \special{prePostScriptfile #1}%
-}
+\AddToHook{shipout/lastpage}{%
+ \BKM@pdfmark@out
+ \BKM@PSHeaderFile\BKM@filename
+ }
% \end{macrocode}
% \end{macro}
% \begin{macrocode}
-%</textures>
+%</dvips>
% \end{macrocode}
%
% \subsubsection{Common part}
@@ -2585,19 +2543,6 @@ and the derived files
% \begin{macrocode}
%<*pdfmark>
% \end{macrocode}
-% \begin{macro}{\BKM@filename}
-% \begin{macrocode}
-\def\BKM@filename{\jobname.out.ps}
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-\BKM@PSHeaderFile\BKM@filename
-% \end{macrocode}
-%
-% \begin{macrocode}
-\RequirePackage{atveryend}[2009/12/07]
-\AfterLastShipout{\BKM@pdfmark@out}
-% \end{macrocode}
%
% \begin{macro}{\BKM@pdfmark@out}
% Do not use package \xpackage{rerunfilecheck} here, because
@@ -2771,12 +2716,8 @@ and the derived files
% \subsubsection{Write auxiliary file}
%
% \begin{macrocode}
-\RequirePackage{auxhook}
-% \end{macrocode}
-% \begin{macrocode}
-\AddLineBeginMainAux{%
- \string\providecommand\string\BKM@entry[2]{}%
-}
+\AddToHook{begindocument}{%
+ \immediate\write\@mainaux{\string\providecommand\string\BKM@entry[2]{}}}
% \end{macrocode}
%
% \begin{macro}{\BKM@id}
@@ -3005,46 +2946,44 @@ and the derived files
%
% \subsubsection{Drivers using hooks at end of document}
%
-% The following drivers use package \xpackage{atveryend}'s
-% \cs{AfterLastShipout}, because they still need the
-% \xext{aux} file.
+% Driver \xoption{pdftex} use the LaTeX hook \xoption{enddocument/afterlastpage}
+% (which is equivalent to the previously used
+% \cs{AfterLastShipout} of \xpackage{atveryend}'s),
+% because it still needs the \xext{aux} file. It uses
+% uses \cs{pdfoutline} for the bookmakrs that can be used after the last page.
% \begin{itemize}
% \item
% Driver \xoption{pdftex} uses \cs{pdfoutline} that can
% be used after the last page.
-% \item
-% PostScript drivers such as
-% \xoption{dvips} use an external PostScript header file
-% for the bookmarks. File writing can be done after
-% the last shipout page, but before the \xext{aux} file is closed.
% \end{itemize}
% \begin{macrocode}
-%<*pdftex|pdfmark>
+%<*pdftex>
\ifBKM@atend
- \AfterLastShipout{%
+ \AddToHook{enddocument/afterlastpage}{%
\BKM@EndHook
}%
\fi
-%</pdftex|pdfmark>
+%</pdftex>
% \end{macrocode}
%
-% \subsubsection{Drivers using \cs{AtEndDvi}}
+% \subsubsection{Drivers using \xoption{shipout/lastpage}}
%
% The other drivers implement \cs{bookmark} using \cs{special}
% commands. Thus the last bookmarks must be put on the last page,
% not afterwards.
% \cs{AtEndDocument} cannot be used, because it is too late, the
-% last page can already be output. Therefore we use package
-% \xpackage{atenddvi} that uses the help of packages \xpackage{atbegshi}
-% and \xpackage{zref}. The argument of \cs{AtEndDvi} is put
-% at the end of the last page. At least two \hologo{LaTeX} runs are necessary.
-% \begin{macrocode}
-%<*dvipdfm|vtex>
+% last page can already be output. Therefore we use the
+% LaTeX hook \xoption{shipout/lastpage}.
+% At least two \hologo{LaTeX} runs are necessary.
+% The postscript driver \xoption{dvips} use an external PostScript file
+% for the bookmarks. The file writing has been moved to the
+% the last shipout page too to avoid conflicts with pgf.
+% \begin{macrocode}
+%<*dvipdfm|vtex|pdfmark>
\ifBKM@atend
- \RequirePackage{atenddvi}%
- \AtEndDvi{\BKM@EndHook}%
+ \AddToHook{shipout/lastpage}{\BKM@EndHook}%
\fi
-%</dvipdfm|vtex>
+%</dvipdfm|vtex|pdfmark>
% \end{macrocode}
%
% \section{Installation}
@@ -3097,8 +3036,6 @@ and the derived files
% bookmark.sty & tex/latex/bookmark/bookmark.sty\\
% bkm-dvipdfm.def & tex/latex/bookmark/bkm-dvipdfm.def\\
% bkm-dvips.def & tex/latex/bookmark/bkm-dvips.def\\
-% bkm-dvipsone.def & tex/latex/bookmark/bkm-dvipsone.def\\
-% bkm-textures.def & tex/latex/bookmark/bkm-textures.def\\
% bkm-pdftex.def & tex/latex/bookmark/bkm-pdftex.def\\
% bkm-vtex.def & tex/latex/bookmark/bkm-vtex.def\\
% bookmark.pdf & doc/latex/bookmark/bookmark.pdf\\
@@ -3424,7 +3361,7 @@ and the derived files
% \end{Version}
% \begin{Version}{2016/05/17 v1.26}
% \item
-% define \cs{pdfbookmark} to allow pdftex driver to be used with Lua\TeX.
+% define \cs{pdfoutline} to allow pdftex driver to be used with Lua\TeX.
% \end{Version}
% \begin{Version}{2019/06/04 v1.27}
% \item
@@ -3434,9 +3371,22 @@ and the derived files
% \begin{Version}{2019/12/03 v1.28}
% \item
% Documentation updates.
-% \item adjust package loading (all required packages already loade
+% \item adjust package loading (all required packages already loaded
% by \xpackage{hyperref}).
% \end{Version}
+% \begin{Version}{2020-11-06 v1.29}
+% \item Adapted the dvips to avoid a clash with pgf.
+% https://github.com/pgf-tikz/pgf/issues/944
+% \item All drivers now use the new LaTeX hooks
+% and so require a format 2020-10-01 or newer. The older
+% drivers are provided as frozen versions and are used if an older
+% format is detected.
+% \item Added support for destlabel option of hyperref, https://github.com/ho-tex/bookmark/issues/1
+% \item Removed the \xoption{dvipsone} and \xoption{textures} driver.
+% \item Removed the code for option \xoption{dvipdfmx-outline-open}
+% and \cs{SpecialDvipdfmxOutlineOpen}. All dvipdfmx version should now support
+% this out-of-the-box.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/bookshelf/bookshelf.dtx b/Master/texmf-dist/source/latex/bookshelf/bookshelf.dtx
new file mode 100644
index 00000000000..8abaee3d6d1
--- /dev/null
+++ b/Master/texmf-dist/source/latex/bookshelf/bookshelf.dtx
@@ -0,0 +1,2524 @@
+% \iffalse meta-comment
+%
+% Transformed from bookshelf.xml by ClassPack db2dtx.xsl
+% version 1.19 (2020-05-19) on Saturday 23 May 2020 at 23:33:08
+%
+% bookshelf.dtx is copyright © 2020 by Peter Flynn <peter@silmaril.ie>
+%
+% 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:
+%
+% http://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 Peter Flynn <peter@silmaril.ie>
+%
+% This work consists of the files bookshelf.dtx and bookshelf.ins,
+% the derived file ,
+% and any other ancillary files listed in the MANIFEST.
+%
+% \fi
+% \iffalse
+%<*driver>
+\ProvidesFile{bookshelf.dtx}
+%</driver>
+%<class>\NeedsTeXFormat{LaTeX2e}[2017/04/15]
+%<class>\ProvidesClass{bookshelf}[2020/05/24 v0.5
+%<class> Turn your bibliography into a bookshelf image]
+%<*driver>
+\RequirePackage{fix-cm}% included by default.
+\PassOptionsToPackage{svgnames}{xcolor}% xcolor/dox/hyperref implied
+\documentclass[12pt]{ltxdoc}
+%%
+%% Packages added for documentation
+%%
+\usepackage{dox}% used by default. (0)%
+ \makeatletter
+ \doxitem[idxtype=attribute]{Attribute}{CPK@attribute}{attributes}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=attributevalue]{AttributeValue}{CPK@attributevalue}{attribute values}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=class]{Class}{CPK@class}{classes}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=colour]{Colour}{CPK@colour}{colours}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=counter]{Counter}{CPK@counter}{counters}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=DTD]{DTD}{CPK@dtd}{DTDs/Schemas}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=element]{Element}{CPK@element}{element types}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=entity]{Entity}{CPK@entity}{entities}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=error]{Error}{CPK@error}{errors}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=field]{Field}{CPK@field}{fields}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=file]{File}{CPK@file}{files}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=font]{Font}{CPK@font}{fonts}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=function]{Function}{CPK@function}{functions}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=language]{Language}{CPK@language}{languages}
+ \makeatother
+ \makeatletter
+ \doxitem[macrolike,idxtype=length]{Length}{CPK@length}{lengths}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=mode]{Mode}{CPK@mode}{modes}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=option]{Option}{CPK@option}{options}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=package]{Package}{CPK@package}{packages}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=variable]{Variable}{CPK@variable}{variables}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=parameter]{Parameter}{CPK@parameter}{parameters}
+ \makeatother
+ \makeatletter
+ \doxitem[macrolike,idxtype=switch]{Switch}{CPK@switch}{switches}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=template]{Template}{CPK@template}{templates}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=typeface]{Typeface}{CPK@typeface}{typefaces}
+ \makeatother
+ \makeatletter
+ \doxitem[macrolike,idxtype=box]{Box}{CPK@box}{boxes}
+ \makeatother
+ \newcommand{\LabelFont}[2][\relax]{\strut
+ {\fontencoding\encodingdefault
+ \fontfamily{lmtt}\fontseries{lc}#1\selectfont#2}\space}
+ \makeatletter
+ \let\CPK@macro\macro\let\CPK@endmacro\endmacro
+ \makeatother
+ \makeatletter
+ \let\CPK@environment\environment\let\CPK@endenvironment\endenvironment
+ \makeatother
+ \makeatletter
+ \def\PrintAttributeName#1{\LabelFont{@#1}}
+ \makeatother
+ \def\PrintAttributeValueName#1{\LabelFont{"#1"}}
+ \def\PrintClassName#1{\LabelFont[\fontfamily{lmss}]{#1}}
+ \def\PrintColourName#1{\LabelFont[\color{#1}]{#1}}
+ \def\PrintCounterName#1{\LabelFont{#1}}
+ \def\PrintDTDName#1{\LabelFont{#1}}
+ \def\PrintElementName#1{\LabelFont{<#1>}}
+ \def\PrintEntityName#1{\LabelFont{\&#1;}}
+ \def\PrintEnvironmentName#1{\LabelFont[\fontfamily{lmss}]{#1}}
+ \def\PrintErrorName#1{\LabelFont[\color{Red}!]{#1}}
+ \def\PrintFunctionName#1{\LabelFont[\bfseries\itshape]{#1}}
+ \def\PrintLanguageName#1{\LabelFont{#1}}
+ \def\PrintLengthName#1{\LabelFont{#1}}
+ \def\PrintMacroName#1{\LabelFont{#1}}
+ \def\PrintModeName#1{\LabelFont[\sffamily]{\textlangle#1\textrangle}}
+ \def\PrintOptionName#1{\LabelFont[\bfseries]{#1}}
+ \def\PrintPackageName#1{\LabelFont[\fontfamily{lmss}]{#1}}
+ \def\PrintSwitchName#1{\LabelFont{#1}}
+ \def\PrintTemplateName#1{\LabelFont[\bfseries]{#1}}
+ \def\PrintVariableName#1{\LabelFont[\ttfamily]{#1}}
+ \def\PrintParameterName#1{\LabelFont[\ttfamily]{#1}}
+ \def\PrintFieldName#1{\LabelFont[\ttfamily]{#1}}
+%% fontenc omit: conflict: fontspec (3)
+%% inputenc omit: conflict: fontspec (6)
+\usepackage{fontspec}% part/@conformance=xelatex detected. (7)%
+ \renewcommand{\textsc}[1]{{\small\MakeTextUppercase{#1}}}
+\usepackage{noto}% requested by author (15)%
+\usepackage{luximono}% requested by author (16)%
+\usepackage{mflogo}% used by default. (36)%
+\usepackage[british]{babel}% used by default. (41)%
+\usepackage[backend=biber,doi=true,
+ isbn=true,url=true,uniquename=false,style=apa]{biblatex}% bibliography/@arch=biblatex detected. (42)%
+ \makeatletter
+ \AtBeginDocument{%
+ \setlength{\bibitemsep}{1ex}%
+ \setlength{\bibnamesep}{1.5\itemsep}%
+ \defbibheading{shortbib}[References]%
+ {\section{#1}}}
+ \@ifpackagewith{babel}{british}{%
+ \DeclareLanguageMapping{british}%
+ {british-apa}}{\relax}
+ \makeatother
+ \makeatletter
+ \providetoggle{blx@skipbiblist}
+ \makeatother
+\usepackage{calc}% used by default. (50)%
+ \makeatletter
+ {\scriptsize
+ \global\advance\@totalleftmargin by1em
+ \global\advance\MacroIndent by.5em}
+ \makeatother
+\usepackage{ccaption}% used by default. (53)%
+ \captionnamefont{\bfseries}
+ \captionstyle{\raggedright}
+\usepackage[inline]{enumitem}% use of 'variablelist' detected (57)%
+ \setlist[description]{style=unboxed}
+ \setlist[itemize]{leftmargin=2em}
+ \setlist[enumerate]{leftmargin=2em}
+ \newlist{inlineenum}{enumerate*}{1}
+ \setlist[inlineenum,1]{label=\emph{\alph*}),
+ itemjoin={{; }},itemjoin*={{; and }}}
+\usepackage{fancyhdr}% requested by author (59)%
+ \makeatletter
+ \pagestyle{fancy}
+ \cfoot{}
+ \lhead{\footnotesize\rightmark}
+ \rhead{\small\thepage}
+ \rfoot{\footnotesize The \LaTeX\
+ \textsf{\SIL@docname} \SIL@doctype}
+ \renewcommand{\headrulewidth}{0pt}
+ \renewcommand{\footrulewidth}{0pt}
+ \makeatother
+\usepackage{relsize}% use of 'acronym' detected (65)%
+\usepackage{textcase}% used by default. (68)%
+\usepackage{float}% used by default. (70)%
+ \renewcommand{\topfraction}{.85}
+ \renewcommand{\bottomfraction}{.7}
+ \renewcommand{\textfraction}{.15}
+ \renewcommand{\floatpagefraction}{.66}
+ \renewcommand{\dbltopfraction}{.66}
+ \renewcommand{\dblfloatpagefraction}{.66}
+ \setcounter{topnumber}{9}
+ \setcounter{bottomnumber}{9}
+ \setcounter{totalnumber}{20}
+ \setcounter{dbltopnumber}{9}
+\usepackage[level]{fmtcount}% xref/@linkend➝listitem/xml:id detected. (71)%
+\usepackage[a4paper,left=30mm,top=25mm,
+ textwidth=150mm,textheight=225mm,headheight=15pt]{geometry}% used by default. (72)%
+\usepackage{hypdoc}% requested by author (78)%
+ \hypersetup{linkcolor=DarkBlue,urlcolor=Blue,citecolor=Red}
+ \ExecuteBibliographyOptions{maxcitenames=1}
+ \DeclareFieldFormat{citehyperref}{%
+ \DeclareFieldAlias{bibhyperref}{noformat}% Avoid nested links
+ \bibhyperref{#1}}
+ \DeclareFieldFormat{textcitehyperref}{%
+ \DeclareFieldAlias{bibhyperref}{noformat}% Avoid nested links
+ \bibhyperref{%
+ #1%
+ \ifbool{cbx:parens}
+ {\bibcloseparen\global\boolfalse{cbx:parens}}
+ {}}}
+ \savebibmacro{cite}
+ \savebibmacro{textcite}
+ \renewbibmacro*{cite}{%
+ \printtext[citehyperref]{%
+ \restorebibmacro{cite}%
+ \usebibmacro{cite}}}
+ \renewbibmacro*{textcite}{%
+ \ifboolexpr{
+ ( not test {\iffieldundef{prenote}} and
+ test {\ifnumequal{\value{citecount}}{1}} )
+ or
+ ( not test {\iffieldundef{postnote}} and
+ test {\ifnumequal{\value{citecount}}{\value{citetotal}}} )
+ }
+ {\DeclareFieldAlias{textcitehyperref}{noformat}}
+ {}%
+ \printtext[textcitehyperref]{%
+ \restorebibmacro{textcite}%
+ \usebibmacro{textcite}}}
+\usepackage{listings}% use of 'programlisting' detected (85)%
+ \lstdefinelanguage{dummy}
+ {morekeywords={dummy}}
+ \lstdefinelanguage{Makefile}
+ {otherkeywords={.PHONY,.DEFAULT},%
+ morekeywords={PHONY,DEFAULT,shell,ifeq,else,endif},%
+ keywordsprefix={.},%
+ moredelim=[l][\color{Green}]{:},%
+ morecomment=[l]{\#},%
+ moredelim=[s][\color{Blue}]{\$(}{)}%
+ }
+ \lstdefinelanguage{DocBook}[]{XML}
+ {morekeywords={abstract,address,affiliation,annotation,arg,
+ author,book,chapter,classname,cmdsynopsis,command,
+ constraintdef,contrib,copyright,cover,date,email,emphasis,
+ envar,filename,firstname,footnote,guibutton,guilabel,
+ guimenu,guimenuitem,guisubmenu,holder,info,itemizedlist,
+ listitem,literal,member,option,orderedlist,orgdiv,orgname,
+ package,para,parameter,part,personname,phrase,procedure,
+ productname,programlisting,quote,refsection,remark,
+ constructorsynopsis,methodparan,modifier,funcparams,olink,
+ bibliography,biblioentry,biblioset,subtitle,artpagenums,
+ volumenum,issuenum,DOCTYPE,SYSTEM,xml:id,releaseinfo,
+ replaceable,revdescription,revhistory,revision,sect1,sect2,
+ sect3,sect4,seg,seglistitem,segmentedlist,segtitle,
+ simplelist,step,surname,systemitem,tag,term,title,uri,
+ userinput,variablelist,varlistentry,wordasword,xref,year,
+ xlink:href}}
+
+ \makeatletter
+ \lstdefinelanguage{bash}
+ {morestring=[s]{[]},morekeywords={exit,logout,yes,no,@,
+ password,ssh,URL,cd,dvips,latex,ls,makeindex,man,mkdir,
+ pdflatex,sudo,texconfig,texdoc,updmap,xelatex,biber,
+ latexmk,bibtex}}
+
+ \makeatother
+ \lstdefinelanguage{APA}[]{XML}
+ {morekeywords={TTL}}
+
+ \lstdefinelanguage{OOXML}[]{XML}
+ {morekeywords={w:p,w:pPr,w:pStyle,w:rPr,w:rFonts,
+ w:r,w:t,w:lang}}
+
+ \lstdefinelanguage{SGML}[]{XML}
+ {morekeywords={sec,ttl}}
+
+ \lstdefinelanguage{DTD}[]{XML}
+ {morekeywords={ELEMENT,ENTITY,ATTLIST,CDATA,ID,REQUIRED,
+ IMPLIED,PCDATA}}
+
+ \lstdefinelanguage{Runoff}
+ {morekeywords={h1}}
+
+ \lstdefinelanguage{GML}
+ {morekeywords={h1}}
+
+ \lstdefinelanguage{Scribe}
+ {morekeywords={Heading},morestring=[s]{[]}}
+
+ \lstdefinelanguage{RTF}[]{TeX}
+ {moretexcs={rtf,ansi,deff,adeflang,fonttbl,f,froman,fprq,
+ fcharset,f1,fswiss,falt,fnil,colortbl,red,green,blue,
+ stylesheet,s,snext,nowidctlpar,hyphen,hyphlead,hyphtrail,
+ hyphmax,cf,kerning,dbch,af,langfe,afs,alang,loch,fs,
+ pgndec,pard,plain,qc,sb,sa,keepn,b,ab,rtlch,ltrch,par}}
+
+ \lstdefinelanguage{TEI}[]{XML}
+ {morekeywords={TEI,TEI.2,teiHeader,fileDesc,sourceDesc,
+ titleStmt,title,author,editor,respStmt,resp,name,
+ editionStmt,edition,text,body,publicationStmt,publisher,
+ div,div1,placeName,lg,l,s,cl,phr,w,list,distinct,p,pb,
+ mls,div2,head,num,val,app,lem,rdg,q,sup,uncl,note,
+ DOCTYPE,SYSTEM,xml:id}}[keywords,comments,strings]
+
+ \lstdefinelanguage{XSLT2}[]{XML}
+ {morekeywords={xsl:stylesheet,xsl:transform,
+ xsl:apply-imports,xsl:attribute-set,xsl:decimal-format,
+ xsl:import,xsl:include,xsl:key,xsl:namespace-alias,
+ xsl:output,xsl:param,
+ xsl:preserve-space,xsl:strip-space,xsl:template,
+ xsl:variable,xsl:character-map,xsl:function,
+ xsl:import-schema,xsl:param,xsl:variable,
+ xsl:apply-imports,xsl:apply-templates,xsl:attribute,
+ xsl:call-template,xsl:choose,xsl:comment,xsl:copy,
+ xsl:copy-of,xsl:element,xsl:fallback,xsl:for-each,
+ xsl:if,xsl:message,xsl:number,xsl:otherwise,
+ xsl:processing-instruction,xsl:text,xsl:value-of,
+ xsl:variable,xsl:when,xsl:with-param,xsl:sort,
+ xsl:for-each-group,xsl:next-match,xsl:analyze-string,
+ xsl:namespace,xsl:result-document,xsl:copy,
+ xsl:fallback,xsl:document,xsl:sequence,
+ xsl:matching-substring,xsl:non-matching-substring,
+ xsl:perform-sort,xsl:output-character},
+ alsodigit={-}}
+
+ \lstdefinelanguage{LaTeXe}[LaTeX]{TeX}
+ {morekeywords = {selectlanguage,foreignlanguage,
+ textbrokenbar,textlangle,textrangle,subsection,url,
+ chapter,tableofcontents,part,subsubsection,paragraph,
+ subparagraph,maketitle,setlength,listoffigures,
+ listoftables,color,arraybackslash,includegraphics,
+ textcite,parencite,graphicspath,lstinline,
+ DeclareLanguageMapping,textcolor,definecolor,colorbox,
+ fcolorbox,RequirePackage,PassOptionsToPackage}}
+
+ \lstdefinelanguage{BIBTeX}{
+ morekeywords = {title,author,edition,publisher,year,
+ address},
+ morestring=[b]",
+ }
+
+ \lstdefinelanguage{Email}{
+ morekeywords={From,Subject,To,Date},
+ }
+
+ \lstset{defaultdialect=LaTeXe,frame=single,
+ framesep=.5em,backgroundcolor=\color{AliceBlue},
+ rulecolor=\color{LightSteelBlue},framerule=1pt}
+
+ \lstloadlanguages{LaTeXe,DocBook,XML,XSLT2,bash}
+ \lstdefinelanguage{XMLFRAG}{tag=**[s]<>}[html]
+ \lstnewenvironment{listingsdoc}
+ {\lstset{language={[LaTeX]TeX}}}
+ {}
+ \newcommand\basicdefault[1]{\footnotesize
+ \color{Black}\ttfamily#1}
+
+ \lstset{basicstyle=\basicdefault{\spaceskip.5em}}
+ \lstset{literate=
+ {§}{{\S}}1
+ {©}{{\raisebox{.125ex}{\copyright}\enspace}}1
+ {«}{{\guillemotleft}}1
+ {»}{{\guillemotright}}1
+ {Á}{{\'A}}1
+ {Ä}{{\"A}}1
+ {É}{{\'E}}1
+ {Í}{{\'I}}1
+ {Ó}{{\'O}}1
+ {Ö}{{\"O}}1
+ {Ú}{{\'U}}1
+ {Ü}{{\"U}}1
+ {ß}{{\ss}}2
+ {à}{{\`a}}1
+ {á}{{\'a}}1
+ {ä}{{\"a}}1
+ {é}{{\'e}}1
+ {í}{{\'i}}1
+ {ó}{{\'o}}1
+ {ö}{{\"o}}1
+ {ú}{{\'u}}1
+ {ü}{{\"u}}1
+ {¹}{{\textsuperscript1}}1
+ {²}{{\textsuperscript2}}1
+ {³}{{\textsuperscript3}}1
+ {ı}{{\i}}1
+ {—}{{---}}1
+ {’}{{'}}1
+ {…}{{\dots}}1
+ {➝}{{$leftarrow$}}1
+ {⮠}{{$\hookleftarrow$}}1
+ {␣}{{\textvisiblespace}}1,
+ keywordstyle=\color{DarkGreen}\bfseries,
+ identifierstyle=\color{DarkRed},
+ commentstyle=\color{Gray}\upshape,
+ stringstyle=\color{DarkBlue}\upshape,
+ emphstyle=\color{Chocolate}\upshape,
+ showstringspaces=false,
+ columns=fullflexible,
+ keepspaces=true}
+\usepackage{makeidx}% used by default. (87)%
+ \makeindex
+\usepackage{nicefrac}% used by default. (93)%
+ \def\textonehalf{\ensuremath{\nicefrac12}}
+\usepackage{parskip}% requested by author (95)%
+\usepackage{sectsty}% requested by author (99)%
+ \allsectionsfont{\sffamily\raggedright}
+ \renewcommand*{\descriptionlabel}[1]{\hspace\labelsep
+ \sffamily\bfseries #1}
+\usepackage[normalem]{ulem}% use of 'link' detected (105)%
+\usepackage{url}% use of 'uri' detected (106)%
+ \AtBeginDocument{\urlstyle{tt}}
+\usepackage{varioref}% use of 'xref' detected (109)%
+ \vrefwarning
+ \labelformat{appendix}{Appendix~#1}
+ \makeatletter
+ \labelformat{chapter}{\@chapapp~#1}
+ \makeatother
+ \labelformat{section}{section~#1}
+ \labelformat{subsection}{section~#1}
+ \labelformat{subsubsection}{section~#1}
+ \labelformat{paragraph}{section~#1}
+ \labelformat{figure}{Figure~#1}
+ \labelformat{table}{Table~#1}
+ \labelformat{item}{item~#1}
+ \renewcommand{\reftextcurrent}{elsewhere on this
+ page}
+ \def\reftextafter{on the
+ \reftextvario{next}{following} page}
+\usepackage{xcolor}% used by default. (117)%
+ \makeatletter
+ \@ifundefined{T}{%
+ \newcommand{\T}[2]{{\fontencoding{T1}%
+ \selectfont#2}}}{}
+ \makeatother
+\usepackage{classpack}[2020/05/19]% used by default. (122)%
+\makeatletter
+\newcommand{\SIL@doctype}{class}
+\newcommand{\SIL@docname}{bookshelf}
+\newcommand{\SIL@docowner}{Silmaril}
+\makeatother
+\addbibresource{bookshelf.bib}
+\allsectionsfont{\sffamily}
+%
+%%
+%% Settings for docstrip and ltxdoc
+%%
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}\raggedright
+ \DocInput{bookshelf.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{718}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+% \changes{v0.5}{2020/05/24}{Finished initial testing: Replaced hyperref with hypdoc to avoid makeindex bug.}
+% \changes{v0.4}{2020/05/19}{Completed documentation: 1) Updated note on bug in biber when processing sgml.bib; 2) Removed sgml.bib as example until problems are resolved; 3) Backtracked on attempt to use the monographic title for articles, chapters, etc; 4) Revised notes on production.}
+% \changes{v0.3}{2020/05/14}{Finished first pass on documentation: 1) Done preliminary testing; 2) Script adapted for Mac OS X.}
+% \changes{v0.2}{2020/05/12}{Started documentation: Code doc done, user doc still missing.}
+% \changes{v0.1}{2020/05/7}{First packaged draft: Done manually from .tex file.}
+%
+% \GetFileInfo{bookshelf.dtx}
+%
+% \DoNotIndex{\@,\@@par,\@beginparpenalty,\@empty}
+% \DoNotIndex{\@flushglue,\@gobble,\@input,\@makefnmark}
+% \DoNotIndex{\@makeother,\@maketitle,\@namedef,\@ne}
+% \DoNotIndex{\@spaces,\@tempa,\@tempb,\@tempswafalse}
+% \DoNotIndex{\@tempswatrue,\@thanks,\@thefnmark,\@topnum}
+% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa}
+% \DoNotIndex{\@totalleftmargin,\",\/,\@ifundefined,\@nil}
+% \DoNotIndex{\@verbatim,\@vobeyspaces,\|,\~,\ ,\active}
+% \DoNotIndex{\advance,\aftergroup,\begingroup,\bgroup}
+% \DoNotIndex{\mathcal,\csname,\def,\documentstyle}
+% \DoNotIndex{\dospecials,\edef,\egroup,\else,\endcsname}
+% \DoNotIndex{\endgroup,\endinput,\endtrivlist}
+% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef}
+% \DoNotIndex{\global,\hbox,\hss,\if,\if@inlabel}
+% \DoNotIndex{\if@tempswa,\if@twocolumn,\ifcase,\ifcat}
+% \DoNotIndex{\iffalse,\ifx,\ignorespaces,\index,\input}
+% \DoNotIndex{\item,\jobname,\kern,\leavevmode,\leftskip}
+% \DoNotIndex{\let,\llap,\lower,\m@ne,\next,\newpage}
+% \DoNotIndex{\nobreak,\noexpand,\nonfrenchspacing}
+% \DoNotIndex{\obeylines,\or,\protect,\raggedleft}
+% \DoNotIndex{\rightskip,\rm,\sc,\setbox,\setcounter}
+% \DoNotIndex{\small,\space,\string,\strut,\strutbox}
+% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin}
+% \DoNotIndex{\trivlist,\tt,\twocolumn,\typeout,\vss,\vtop}
+% \DoNotIndex{\xdef,\z@,\,,\@bsphack,\@esphack,\@noligs}
+% \DoNotIndex{\@vobeyspaces,\@xverbatim,\`,\catcode,\end}
+% \DoNotIndex{\escapechar,\frenchspacing,\glossary}
+% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht}
+% \DoNotIndex{\it,\langle,\leaders,\long,\makelabel}
+% \DoNotIndex{\marginpar,\markboth,\mathcode,\mathsurround}
+% \DoNotIndex{\mbox,\newcount,\newdimen,\newskip}
+% \DoNotIndex{\nopagebreak,\parfillskip,\parindent}
+% \DoNotIndex{\parskip,\penalty,\raise,\rangle,\section}
+% \DoNotIndex{\setlength,\TeX,\topsep,\underline,\unskip}
+% \DoNotIndex{\verb,\vskip,\vspace,\widetilde,\\,\%,\@date}
+% \DoNotIndex{\@defpar,\[,\{,\},\],\count@,\ifnum,\loop}
+% \DoNotIndex{\today,\uppercase,\uccode,\baselineskip}
+% \DoNotIndex{\begin,\tw@,\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k}
+% \DoNotIndex{\l,\m,\n,\o,\p,\q,\r,\s,\t,\u,\v,\w,\x,\y,\z}
+% \DoNotIndex{\A,\B,\C,\D,\E,\F,\G,\H,\I,\J,\K,\L,\M,\N,\O}
+% \DoNotIndex{\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z,\1,\2,\3,\4}
+% \DoNotIndex{\5,\6,\7,\8,\9,\0,\!,\#,\$,\&,\',\(,\)}
+% \DoNotIndex{\+,\.,\:,\;,\<,\=,\>,\?,\_,\discretionary}
+% \DoNotIndex{\immediate,\makeatletter,\makeatother}
+% \DoNotIndex{\meaning,\newenvironment,\par,\relax}
+% \DoNotIndex{\renewenvironment,\repeat,\scriptsize}
+% \DoNotIndex{\selectfont,\the,\undefined,\arabic,\do}
+% \DoNotIndex{\makeindex,\null,\number,\show,\write,\@ehc}
+% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title}
+% \DoNotIndex{\everypar,\if@minipage,\if@restonecol,\ifeof}
+% \DoNotIndex{\ifmmode,\lccode,\newtoks,\onecolumn,\openin}
+% \DoNotIndex{\p@,\SelfDocumenting,\settowidth}
+% \DoNotIndex{\@resetonecoltrue,\@resetonecolfalse,\bf}
+% \DoNotIndex{\clearpage,\closein,\lowercase,\@tempdima}
+% \DoNotIndex{\@inlabelfalse,\selectfont,\mathcode}
+% \DoNotIndex{\newmathalphabet,\rmdefault,\bfdefault}
+% \DoNotIndex{\DeclareRobustCommand,\@ifpackagewith}
+% \DoNotIndex{\SIL@doctype}
+% \DoNotIndex{\SIL@docname}
+% \DoNotIndex{\SIL@docowner}
+% \DoNotIndex{\SIL@svgcolname}
+% \DoNotIndex{\ifcase}
+% \DoNotIndex{\SIL@svgcolval}
+% \DoNotIndex{\addbibresource}
+% \DoNotIndex{\immediate}
+% \DoNotIndex{\input}
+% \DoNotIndex{\documentclass}
+% \DoNotIndex{\pagewidth}
+% \DoNotIndex{\raggedright}
+% \DoNotIndex{\name}
+% \DoNotIndex{\SIL@topauthor}
+% \DoNotIndex{\SIL@titleoneline}
+% \DoNotIndex{\makebook}
+% \DoNotIndex{\SILmfont}
+% \DoNotIndex{\SILmfontname}
+% \DoNotIndex{\vbox}
+% \DoNotIndex{\fcolorbox}
+% \DoNotIndex{\scalebox}
+% \setcounter{tocdepth}{5}
+% \setcounter{secnumdepth}{5}
+% \makeatletter
+% \def\@@doxdescribe#1#2{\endgroup \ifdox@noprint\else\marginpar{\raggedleft \textcolor{DarkRed}{\@nameuse{PrintDescribe#1}{#2}}}\fi \ifdox@noindex\else\@nameuse{Special#1Index}{#2}\fi \endgroup\@esphack\ignorespaces}
+% \makeatother
+%
+% \def\fileversion{0.5}
+% \def\filedate{2020/05/24}
+% \title{The \textsf{bookshelf} \LaTeXe\ document class\thanks{%
+% This document corresponds to \textsf{bookshelf}
+% \textit{v.}\ \fileversion $\beta$, dated \filedate.}
+% \\[1em]\Large
+% Turn your bibliography into a bookshelf image}
+% \author{Peter Flynn\\\normalsize Silmaril Consultants\\[-.25ex]\normalsize Instant Textual Gratification Division\\\normalsize(\url{peter@silmaril.ie})}
+% \maketitle
+% \renewcommand{\abstractname}{Summary}\thispagestyle{empty}
+% \begin{abstract}
+% \parskip=0.5\baselineskip
+% \advance\parskip by 0pt plus 2pt
+% \parindent=0pt% \noindent
+% The \textsf{bookshelf} package uses
+% \textsf{biblatex} and
+% \emph{biber} to turn a \BibTeX{}
+% bibliography file into a randomly-coloured, randomly-sized
+% shelf of books, with the title and author in a randomly-chosen
+% typeface. The image (converted to {\smaller JPEG} from
+% {\smaller PDF}) can then be used as a background in
+% \emph{Zoom},
+% \emph{Teams},
+% \emph{WhatsApp} etc video calls. It
+% requires a little preliminary work with the supplied script to
+% set up a list of all your fonts, a list of colors, and a list
+% of the \BibTeX{} entry names in your {\ttfamily{}.bib}
+% file, but otherwise should work on any modern \TeX{}
+% distribution.\par
+% \par\centering\includegraphics[width=.666\columnwidth]{myshelf.jpg}
+% \end{abstract}
+% \clearpage
+% \tableofcontents
+% \subsection*{Note on required and optional features}
+% In this document, the keywords
+% {\sffamily {\smaller MUST}}, {\sffamily {\smaller MUST NOT}}, {\sffamily {\smaller REQUIRED}},
+% {\sffamily {\smaller SHALL}}, {\sffamily {\smaller SHALL NOT}}, {\sffamily {\smaller SHOULD}},
+% {\sffamily {\smaller SHOULD NOT}},
+% {\sffamily {\smaller RECOMMENDED}},
+% {\sffamily {\smaller MAY}}, and
+% {\sffamily {\smaller OPTIONAL}} have a specific
+% meaning when shown in {\sffamily {\smaller THIS TYPESTYLE}}, and
+% {\sffamily {\smaller MUST}} be interpreted as described in
+% RFC 2119 \parencite{rfc2119}.\par
+% When shown in normal type, these words keep their conventional
+% contextual degree of meaning.\par
+% \clearpage
+% \section*{Latest changes}
+% \subsection*{v.0.5 (2020-05-24)}
+% \paragraph*{Finished initial testing}
+% \begin{itemize}
+% \item Replaced \textsf{hyperref}
+% with \textsf{hypdoc} to avoid
+% \emph{makeindex} bug\par
+% \end{itemize}
+% \subsection*{v.0.1 (2020-05-7)}
+% \paragraph*{First packaged draft}
+% \begin{itemize}
+% \item Done manually from .tex file\par
+% \end{itemize}
+% \subsection*{v.0.4 (2020-05-19)}
+% \paragraph*{Completed documentation}
+% \begin{itemize}
+% \item Updated note on bug in
+% \emph{biber} when processing
+% {\ttfamily{}sgml.bib}\par
+% \item Removed {\ttfamily{}sgml.bib} as example
+% until problems are resolved\par
+% \item Backtracked on attempt to use the monographic
+% title for articles, chapters, etc\par
+% \item Revised notes on production\par
+% \end{itemize}
+% \subsection*{v.0.3 (2020-05-14)}
+% \paragraph*{Finished first pass on documentation}
+% \begin{itemize}
+% \item Done preliminary testing\par
+% \item Script adapted for Mac OS X\par
+% \end{itemize}
+% See p.\thinspace\pageref{changehistory} for earlier changes.
+% \subsection*{Acknowledgments}
+% Thanks to many people for the original
+% suggestion; and to Isabel Yorke, Bethan Tovey-Walsh,
+% Nelson Beebe, The \LaTeX{} Ninja, Stephan Lukasczyk,
+% and others for their thesis bibliographies and
+% testing comments.\par
+% \clearpage
+% \section{Documentation}
+% During the era of the
+% {\smaller COVID-19} lockdown, the popularity
+% of group video messaging grew rapidly, both for
+% business and domestic use. As people sought for what
+% they believed to be more representative backgrounds
+% than a messy kitchen, an untidy workroom, or a
+% sterile blank wall, a well-populated bookshelf was a
+% frequent choice.\par
+% This package is for those who cannot use (or
+% don't have, or don't want to use) such a bookshelf,
+% but can still lay their hands on a bibliography or
+% reference list in \BibTeX{} format — perhaps from a
+% recent or long-forgotten thesis, book, article, or
+% other document.\par
+% \par\begingroup
+% \fboxsep1em\centering
+% \fbox{\begin{minipage}{0.8\columnwidth}\sffamily
+% \raggedright\parindent0pt
+% \parskip=.5\baselineskip
+% \subsubsection*{\sffamily \XeLaTeX{} and \textsf{biblatex} and
+% \emph{biber}}
+% To avoid problems with accented and other
+% characters, and to make it easier to maintain,
+% this document class uses only \XeLaTeX{} and
+% \textsf{biblatex} and
+% \emph{biber}.\par
+% It will not work with the
+% \emph{pdflatex} or
+% \emph{bibtex} programs, and it does not
+% use the {\ttfamily{}.bst} files of old
+% \BibTeX{}.\par
+% \end{minipage}}\par\endgroup
+% This is a work-in-progress: there are bugs (see \vref{bugs}).\par
+% \subsection{What the package does}
+% The \textsf{bookshelf} package
+% generates what looks like shelves of book spines
+% from your list of references, using random
+% dimensions (within specified limits) in random but
+% contrasting colors, with a randomly-selected
+% typeface.\par
+% It does this by creating a box (rectangle) for each
+% entry in your list, assigning colors to the background and
+% foreground, deciding on the layout and font, and then
+% stacking the boxes side-by-side as if they were letters on a
+% line.\par
+% \subsection{Preparation}
+% To get things ready for this, you need to install this
+% document class, and provide the following files.\par
+% \begin{enumerate}
+% \item Your \BibTeX{} file;
+% \item A list of all the entry values;
+% \item A list of all your usable text fonts;
+% \item A command defining how many such fonts;
+% \item A list of all the colors to choose from.
+% \end{enumerate}
+% These are explained in more detail in the subsections
+% below.\par
+% All but the first of these can be generated by the
+% supplied shell script {\ttfamily{}prepdata.sh}. This
+% works on UNIX/GNU Linux and on Apple Mac OS X, and may work
+% in CygWin, but needs more work for plain Windows.\par
+% \subsubsection{Your \BibTeX{} file}
+% Your \BibTeX{} ({\ttfamily{}.bib}) file,
+% suitable for use with \emph{biber}
+% rather than \emph{bibtex}.\par
+% Old \BibTeX{} files will work, but possibly not
+% optimally: if you want to update them, see \vref{bibchanges} for what to edit; but this is not
+% needed for this class.\par
+% One thing that may help is to replace all the
+% old-style symbolic notation accented characters like
+% \verb|{\"a}| for
+% `ä' and
+% \verb|{\l}| for
+% `ł'. Not only is the symbolic
+% notation no longer needed because \XeLaTeX{} and the
+% \emph{biber} program handle
+% {\smaller UTF-8} characters, which the old
+% \emph{bibtex} program doesn't; the
+% discipline of replacing helps to reduce the problem of
+% unmatched curly braces, which is one of the biggest
+% sources of errors in \BibTeX{} files.\par
+% If you have a bibliography in
+% \emph{EndNote},
+% \emph{Mendeley},
+% \emph{Zotero},
+% \emph{ProCite},
+% \emph{Reference Manager},
+% etc, you should be able to export it in either
+% \BibTeX{} or {\smaller RIS} format. A
+% {\smaller RIS} file can easily be
+% converted to \BibTeX{} by opening it in
+% \emph{JabRef} and saving it
+% as \BibTeX{}.\par
+% \subsubsection{Entry values}
+% A list of all the entry values from your \BibTeX{} file
+% (the unique names immediately after the document type),
+% each given as the argument to a
+% \verb|\makebook}{...}| command in a file called
+% {\ttfamily{}entries.tex}.\par
+% \subsubsection{Font file list}\label{fontfiles}
+% A set of 1–line files in a subdirectory called
+% {\ttfamily{}fontsel} representing of all the
+% usable text fonts on your system that you wish to use;
+% that is, excluding broken or partial fonts, symbols, math,
+% non-Latin characters or alphabets, and display or non-text
+% fonts.\par
+% Each file {\sffamily {\smaller MUST}} be
+% numbered sequentially in its name (eg
+% {\ttfamily{}1.tex}, {\ttfamily{}2.tex},
+% {\ttfamily{}3.tex}, etc) and
+% {\sffamily {\smaller MUST}} contain a
+% \verb|\newfontface{SILmfont}{...}| command for
+% the font name \emph{and} a definition of its
+% name in a \verb|\SILmfontname{...}| command
+% (see the examples generated by the
+% {\ttfamily{}prepdata.sh} script). Be aware that
+% many fonts on your system may not be suitable for setting
+% normal text: see the comments in the script\par
+% These files are entirely dependent on your system
+% because everyone has a different set of fonts.\par
+% \subsubsection{Maximum number of fonts}
+% A file called {\ttfamily{}pickfont.tex}
+% containing a
+% \verb|\setcounter{SIL@maxfont}{...}| command to
+% set the total number of the fonts which are represented in
+% the {\ttfamily{}fontsel} subdirectory above\par
+% \subsubsection{List of colors}
+% A list of all the colors represented by the
+% {\smaller SVG} palette used by the
+% \textsf{xcolor} package: the file created by
+% the script is called {\ttfamily{}svgnam.tex}.
+% This contains three definitions:\par
+% \begin{enumerate}
+% \item the command {\ttfamily{}\textbackslash{}SIL@svgcolname}
+% which uses an {\ttfamily{}\textbackslash{}ifcase} command to
+% return the name of the \emph{n}th color
+% in alphabetical order;\par
+% \item the command {\ttfamily{}\textbackslash{}SIL@svgcolval} which
+% does the same to return the brightness value of that
+% color, computed by the formula on \vpageref{bright} (see script for
+% details);\par
+% \item the counter {\ttfamily{}SIL@maxcolno} which holds
+% the number of colors available.\par
+% \end{enumerate}
+% \subsection{Producing your bookshelf}
+% This class comes with a file
+% {\ttfamily{}test.tex} which you can use to test your
+% file of references. It is initially set just to make the
+% {\ttfamily{}test.aux} file that
+% \emph{biber} needs to create your
+% {\ttfamily{}test.bbl} bibliography file; that is, it
+% will \emph{not} try to run the shell script
+% \emph{or} to create a bookshelf the first time
+% round, until everything else is ready.\par
+% \begin{enumerate}
+% \item Run the shell script with your
+% {\ttfamily{}.bib} filename as the argument,
+% eg;
+% \iffalse
+%<*ignore>
+% \fi
+\begin{lstlisting}[language={[LaTeX]TeX}]
+$ ./prepdata.sh mythesis.bib
+\end{lstlisting}
+% \iffalse
+%</ignore>
+% \fi
+% \item Edit the {\ttfamily{}test.tex} file and
+% change the name of the {\ttfamily{}.bib} file in
+% the {\ttfamily{}\textbackslash{}addbibresource} command to the
+% name of your own file\par
+% Leave the two lines {\ttfamily{}\textbackslash{}immediate} and
+% {\ttfamily{}\textbackslash{}input} commented out for the
+% moment;
+% \item Delete any {\ttfamily{}test.aux} or
+% {\ttfamily{}test.bbl} files in the directory in
+% which you are doing this;
+% \item Typeset the test file with \XeLaTeX{}. You should get
+% three messages:\par
+% \iffalse
+%<*ignore>
+% \fi
+\begin{lstlisting}[language={[LaTeX]TeX}]
+LaTeX Warning: Empty bibliography on input line 12.
+LaTeX Warning: There were undefined references.
+Package biblatex Warning: Please (re)run Biber on the file:
+(biblatex) test
+(biblatex) and rerun LaTeX afterwards.
+\end{lstlisting}
+% \iffalse
+%</ignore>
+% \fi
+% \item Process the test file with
+% \emph{biber}
+% (\emph{not} \emph{bibtex}). You will probably
+% get many warning messages: ignore them. If you get a
+% fatal error, however, you will need to find the problem
+% in your {\ttfamily{}.bib} file and fix it before
+% going any further.\par
+% See also the known bug at item~\ref{sgmlbib} in the list on p.\thinspace\pageref{sgmlbib};
+% \item Edit the test file and
+% \emph{un}comment the line starting
+% {\ttfamily{}\textbackslash{}input}, save the file, and retypeset
+% it twice.
+% \end{enumerate}
+% You should now have a {\smaller PDF} bookshelf!
+% The books are in the order in which they appear in your
+% {\ttfamily{}.bib} file because the script creates
+% the list of entries to process in that order, regardless of
+% what \emph{biblatex} or
+% \emph{biber} are configured to
+% do.\par
+% \subsubsection{Options}
+% The class comes set for making an
+% \textbf{\texttt{a0paper}} page (1189 mm × 841 mm
+% or 4′ 11″ × 2′ 10″) in
+% \textbf{\texttt{landscape}} mode, suitable for
+% large bibliographies. If you have a smaller
+% {\ttfamily{}.bib} file, or if you want
+% fewer volumes per page, you can change the paper
+% size option in the
+% {\ttfamily{}\textbackslash{}documentclass} command to a
+% smaller one: all the `A'
+% sizes from 5 to 0 are supported, plus the common
+% US office sizes including Ledger (Tabloid).\par
+% There is also a \textbf{\texttt{portrait}} option to
+% produce the page in that format instead of
+% landscape.\par
+% \subsection{Changes between \BibTeX{} fields and
+% \emph{biblatex}}\label{bibchanges}
+% This has been expanded from the description provided in
+% \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=33}{§2.3
+% of the online documentation for
+% \textsf{biblatex}} v3.14 (1 December
+% 2019).\par
+% This is for information only. You do not need to do any
+% of this to use the \index{bookshelf=\textsf{bookshelf} (class)}\textsf{bookshelf} document
+% class unless you encounter errors processing your
+% {\ttfamily{}.bib} file.\par
+% \begin{enumerate}
+% \item The entry type {\ttfamily{}@inbook}
+% (basically only use this where each chapter of the book
+% is written by a different author). See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=8}{§2.1.1}
+% and \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=33}{§2.3.1}
+% for details.\par
+% \item Replace {\ttfamily{}school} with {\ttfamily{}institution} for theses;
+% replace {\ttfamily{}publisher} with {\ttfamily{}organization} for manuals
+% and conference sponsors;
+% and replace {\ttfamily{}address} with {\ttfamily{}location}. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=17}{§2.2.2},
+% \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=32}{§2.2.5},
+% and \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=34}{§2.3.4}
+% for details.\par
+% \item The handling of certain types of titles. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=35}{§2.3.5}
+% for details. Replace {\ttfamily{}journal} with
+% {\ttfamily{}journaltitle} in {\ttfamily{}@article} entries.\par
+% \item The field {\ttfamily{}series}: only
+% use it for journal series; for the main title of
+% multi-volume works use {\ttfamily{}maintitle}.
+% See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=17}{§2.2.2}
+% and \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=37}{§2.3.7}
+% for details.\par
+% \item The fields {\ttfamily{}year} and {\ttfamily{}month} must be
+% integers; {\ttfamily{}month} {\sffamily {\smaller MUST NOT}} be
+% alphabetic. The field {\ttfamily{}date} {\sffamily {\smaller MUST}} be an
+% {\smaller ISO} 8601 date in the format
+% {\ttfamily{}yyyy-mm-dd}. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=17}{§2.2.2},
+% \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=38}{§2.3.8},
+% and \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=39}{§2.3.9}
+% for details.\par
+% \item The field {\ttfamily{}edition} must
+% be an integer with no ordinal indicator or abbreviation
+% `ed'. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=17}{§2.2.2}
+% for details.\par
+% \item Replace {\ttfamily{}key} with
+% {\ttfamily{}label}. See \href{http://mirrors.ctan.org/macros/latex/contrib/biblatex/doc/biblatex.pdf\#page=33}{§2.3.2}
+% for details.\par
+% \end{enumerate}
+% Most of this is for creating new entries. For converting
+% \BibTeX{} files for use with
+% \emph{biblatex}, just change the field
+% names as in items 2, 3, 4, and 7; and make sure your months
+% and editions are integers.\par
+% \subsection{Bugs}\label{bugs}
+% Some things don't yet work as they should, and
+% there are some features that may or may not make
+% the final cut.\par
+% \begin{enumerate}
+% \item The shell script doesn't run on Windows
+% because I don't have any Windows. If someone
+% would write some Powershell I could include it
+% in a later version.\par
+% \item There is no conscious
+% `line'-breaking when a
+% row of books comes to the
+% {\ttfamily{}\textbackslash{}pagewidth}, and as it is
+% deliberately set
+% {\ttfamily{}\textbackslash{}raggedright} (because you
+% can't hyphenate a book and variable space
+% between books seems to be a silly idea), there
+% is no filler at the ends of lines to complete
+% the `shelf' (which is
+% in any case just a bar below each
+% book).\par
+% \item \label{sgmlbib}A test with a bibliography file from
+% Nelson Beebe's collection
+% ({\ttfamily{}sgml.bib}) generated a
+% {\ttfamily{}test.bbl} with a missing
+% closing curly brace, terminating (or rather,
+% failing to terminate) the
+% {\ttfamily{}\textbackslash{}name} command for an entry.
+% This appears to be a known bug in
+% \emph{biber} which is
+% being fixed in the version 2.15.\par
+% \item There seems to be a recurrent problem with
+% certain entries and certain fonts where the
+% length of the title is measured as 0.0pt which
+% causes an unresolvable problem for the routine
+% which assigns space and layout. Any
+% suggestions as to why this occurs are
+% welcomed.\par
+% \item The objective of the field re-expressions
+% (see \vref{fields}) was to make sure the book
+% spine for journal {\ttfamily{}@article}, {\ttfamily{}@incollection}, and
+% {\ttfamily{}@inbook} entry
+% types reflected the \emph{book}
+% or \emph{journal} title, not the
+% title of the article or chapter. This may or
+% may not be a good idea.\par
+% \item During development, it became obvious that
+% the number of fonts on many systems can be
+% very large. The
+% {\ttfamily{}prepdata.sh} script
+% currently includes the exclusions I made on
+% {\smaller UNIX}/{\smaller GNU}
+% Linux and Apple Mac {\smaller OS X} in
+% order to get a set of fonts that did not issue
+% errors (bearing in mind we are using
+% \textsf{fontspec}, so for simplicity
+% the script deals only with TrueType and
+% OpenType fonts, not Postscript Type 1 or
+% Type 3, or font packaging systems like
+% \emph{Suitcase} or True
+% Type Collections). I am not aware of any
+% easily-accessible machine-readable list or
+% {\smaller API} for identifying normal
+% text fonts by name (there are commercial
+% databases but that is outside the scope of
+% this document class).\par
+% \end{enumerate}
+% \StopEventually{\label{endcode}%
+% \clearpage
+% \newgeometry{left=3cm}%
+% \addcontentsline{toc}{section}{Change History}%
+% \label{changehistory}%
+% \PrintChanges
+% \clearpage
+% \label{codeindex}%
+% \addcontentsline{toc}{section}{Index}%
+% \PrintIndex}
+% \addtolength{\CPKrevmarg}{\widthof{\LabelFont{AddToShipoutPictureBG}}}
+% \newgeometry{left=\CPKrevmarg}
+% \message{Margin reset to \the\CPKrevmarg, to fit <AddToShipoutPictureBG>}
+% \iffalse
+%<*class>
+% \fi
+% \clearpage
+% \section{Implementation}\label{setup}
+% \par
+% \subsection{Auto-initialisation}\label{setup:autoinit}
+% This section is added automatically by \textit{ClassPack}
+% as a preamble to all classes and style packages.
+% The \textsf{fixltx2e} package, which used to be included
+% automatically, is no longer preloaded, as its
+% features are now a part of the latest \LaTeXe\ kernel.\par
+% The code starts with identity and requirements which are
+% generated automatically as needed by the Doc\TeX\ system.
+% For details see the \textsf{ltxdoc} package documentation.
+% \par\smallskip
+% \begingroup\color{DarkRed}\footnotesize
+% \leavevmode\enspace{\scriptsize1}\quad{\ttfamily\textbackslash NeedsTeXFormat\{LaTeX2e\}[2017/04/15]}\\
+% \leavevmode\enspace{\scriptsize2}\quad{\ttfamily\textbackslash ProvidesClass\{bookshelf\}[2020/05/24 v0.5}\\
+% \leavevmode\enspace{\scriptsize3}\qquad{\ttfamily Turn your bibliography into a bookshelf image]}\\\endgroup
+% \setcounter{CodelineNo}{3}
+% \begin{CPK@package}{fix-cm}
+% Preloaded functions to override the default \LaTeX\
+% step-size font sizes (which can still be used,
+% but are no longer restrictions).\par
+% \begin{macrocode}
+\RequirePackage{fix-cm}
+% \end{macrocode}
+% \end{CPK@package}
+% \begin{CPK@option}{svgnames}
+% Pass the \textbf{\texttt{svgnames}} option to the
+% \textsf{xcolor} package if that gets loaded later.
+% This avoids a conflict with any other packages
+% (eg \textsf{hyperref}) which use their own default
+% is when they load \textsf{xcolor}.\par
+% \begin{macrocode}
+ \PassOptionsToPackage{svgnames}{xcolor}
+% \end{macrocode}
+% \end{CPK@option}
+% \subsection{Options}\label{options}
+% \iffalse
+%%
+%% ******************************************************************
+%%
+%% Options
+% \fi
+% The paper size and orientation are the only two valid
+% options, both of which are the same as the standard
+% documentclass options, and will be passed to the underlying
+% class automatically, but they need recording so that they
+% can be used by the \textsf{geometry}
+% package. The default is for A0 paper, landscape.\par
+% \begin{macrocode}
+\def\SIL@paper{a0paper}%
+\DeclareOption{a0paper}{%
+ \def\SIL@paper{a0paper}%
+ \setlength\paperheight {1189mm}%
+ \setlength\paperwidth {841mm}}
+\DeclareOption{a1paper}{%
+ \def\SIL@paper{a1paper}%
+ \setlength\paperheight {841mm}%
+ \setlength\paperwidth {594mm}}
+\DeclareOption{a2paper}{%
+ \def\SIL@paper{a2paper}%
+ \setlength\paperheight {594mm}%
+ \setlength\paperwidth {420mm}}
+\DeclareOption{a3paper}{%
+ \def\SIL@paper{a3paper}%
+ \setlength\paperheight {420mm}%
+ \setlength\paperwidth {297mm}}
+\DeclareOption{a4paper}{%
+ \def\SIL@paper{a4paper}%
+ \setlength\paperheight {297mm}%
+ \setlength\paperwidth {210mm}}
+\DeclareOption{a5paper}{%
+ \def\SIL@paper{a5paper}%
+ \setlength\paperheight {210mm}%
+ \setlength\paperwidth {148mm}}
+\DeclareOption{b5paper}{%
+ \def\SIL@paper{b5paper}%
+ \setlength\paperheight {250mm}%
+ \setlength\paperwidth {176mm}}
+\DeclareOption{letterpaper}{%
+ \def\SIL@paper{letterpaper}%
+ \setlength\paperheight {11in}%
+ \setlength\paperwidth {8.5in}}
+\DeclareOption{legalpaper}{%
+ \def\SIL@paper{legalpaper}%
+ \setlength\paperheight {14in}%
+ \setlength\paperwidth {8.5in}}
+\DeclareOption{executivepaper}{%
+ \def\SIL@paper{executivepaper}%
+ \setlength\paperheight {10.5in}%
+ \setlength\paperwidth {7.25in}}
+\DeclareOption{ledgerpaper}{%
+ \def\SIL@paper{ledgerpaper}%
+ \setlength\paperheight {17in}%
+ \setlength\paperwidth {11in}}
+\DeclareOption{tabloidpaper}{%
+ \def\SIL@paper{tabloidpaper}%
+ \setlength\paperheight {17in}%
+ \setlength\paperwidth {11in}}
+\def\SIL@orient{landscape}%
+\DeclareOption{landscape}{%
+ \def\SIL@orient{landscape}%
+ \setlength\@tempdima {\paperheight}%
+ \setlength\paperheight {\paperwidth}%
+ \setlength\paperwidth {\@tempdima}}
+\DeclareOption{portrait}{%
+ \def\SIL@orient{}}
+% \end{macrocode}
+% \subsection{Load the document base class}\label{classload}
+% \iffalse
+%%
+%% ******************************************************************
+%%
+%% Load the document base class
+% \fi
+% This class is based on the standard \LaTeX{}
+% \DescribeClass{report}\textsf{report} class, with no special options
+% except the extra sizes defined above. The default is A0
+% paper, landscape.\par
+% \begin{macrocode}
+\DeclareOption*{\ClassWarning{bookshelf}{%
+ Unknown option `\CurrentOption', please RTFM}}
+\ProcessOptions\relax
+\LoadClass{report}
+% \end{macrocode}
+%\iffalse
+%%
+%% Packages required for the class or package
+%%
+% \fi
+% \subsection{Packages required for the class or
+% package}\label{clspackages}
+% \begin{CPK@package}{fontspec}
+% Font specification setup for use with \XeLaTeX{}.
+% \iffalse
+%% Font specification setup for use with \XeLaTeX{}.
+% \fi
+% \begin{macrocode}
+\RequirePackage{fontspec}%
+% \end{macrocode}
+% \end{CPK@package}
+% \begin{CPK@package}{calc}
+% Required for calculations involving lengths or counters,
+% such as changes to widths for margin adjustment.
+% \iffalse
+%% Required for calculations involving lengths or counters, such as changes to widths for margin adjustment.
+% \fi
+% \begin{macrocode}
+\RequirePackage{calc}%
+% \end{macrocode}
+% \end{CPK@package}
+% \begin{CPK@package}{fp}
+% Used for fixed-point calculations;
+% \iffalse
+%% Used for fixed-point calculations
+% \fi
+% \begin{macrocode}
+\RequirePackage{fp}%
+% \end{macrocode}
+% \end{CPK@package}
+% \begin{CPK@package}{graphicx}
+% Provide for graphics (PNG, JPG, or PDF format (only) for
+% pdflatex; EPS format (only) for standard \LaTeX{}).
+% \iffalse
+%% Provide for graphics (PNG, JPG, or PDF format (only) for pdflatex; EPS format (only) for standard \LaTeX{}).
+% \fi
+% \begin{macrocode}
+\RequirePackage{graphicx}%
+% \end{macrocode}
+% \end{CPK@package}
+% \begin{CPK@package}{xcolor}
+% Provide color.
+% \iffalse
+%% Provide color.
+% \fi
+% \begin{macrocode}
+\RequirePackage{xcolor}%
+ \@ifundefined{T}{%
+ \newcommand{\T}[2]{{\fontencoding{T1}%
+ \selectfont#2}}}{}
+% \end{macrocode}
+% There seems to be a bug in the T1 encoding of some package
+% (unidentified, but possibly \textsf{xcolor}) which
+% uses the command {\ttfamily{}\textbackslash{}T1}, which is an
+% impossibility (no digits allowed in command names). So we fake
+% it here to stop \LaTeX{} complaining, by dropping the first
+% argument on the floor.
+% \end{CPK@package}
+% \begin{CPK@package}{eso-pic}
+% Add picture commands (or backgrounds) to every page.
+% \iffalse
+%% Add picture commands (or backgrounds) to every page.
+% \fi
+% \begin{macrocode}
+\RequirePackage{eso-pic}%
+% \end{macrocode}
+% \end{CPK@package}
+% \begin{CPK@package}{geometry}
+% Package for establishing margins and text area.
+% \iffalse
+%% Package for establishing margins and text area.
+% \fi
+% \begin{macrocode}
+\RequirePackage[\SIL@paper,\SIL@orient,nohead,
+ nofoot,margin=1cm]{geometry}%
+% \end{macrocode}
+% \end{CPK@package}
+% \begin{CPK@package}{biblatex}
+% Use \textsf{biblatex} instead of \BibTeX{};
+% \iffalse
+%% Use biblatex instead of \BibTeX{}
+% \fi
+% \begin{macrocode}
+\RequirePackage[backend=biber,style=authoryear,
+ doi=true,isbn=true,url=true,uniquename=false]{biblatex}%
+ \AtBeginDocument{%
+ \setlength{\bibitemsep}{1ex}%
+ \setlength{\bibnamesep}{1.5\itemsep}%
+ \defbibheading{shortbib}[References]%
+ {\section{#1}}}
+ \@ifpackagewith{babel}{british}{%
+ \DeclareLanguageMapping{british}%
+ {british-apa}}{\relax}
+ \providetoggle{blx@skipbiblist}
+% \end{macrocode}
+% \end{CPK@package}
+%
+% \subsection{Non-package resources}
+% \iffalse
+%%
+%% ******************************************************************
+%%
+%% Non-package resources
+% \fi
+% \begin{CPK@file}{random.tex}\label{file--random.tex}
+% There is one resource not available in packaged form,
+% the module that lets \LaTeX{} create random values. This is
+% in {\ttfamily{}random.tex}, which on the author's
+% system is hiding in a directory
+% {\ttfamily{}texmf/tex/generic/genmisc/}, in the
+% {\ttfamily{}texmf-dist} tree, and indexed by an
+% {\ttfamily{}ls-R} database, so it should therefore
+% be findable by any \TeX{} system.\par
+% \begin{macrocode}
+\input{random.tex}
+% \end{macrocode}
+% \end{CPK@file}
+% \subsection{The code}
+% \iffalse
+%%
+%% ******************************************************************
+%%
+%% The code
+% \fi
+% This is beta software: the code is messy and covered in
+% tracing output.\par
+% \subsubsection{Font selection}\label{fonts}
+% \begin{CPK@counter}{maxfont}\label{counter--maxfont}
+% This is set in the {\ttfamily{}\textbackslash{}input} file
+% {\ttfamily{}pickfont.tex}, which is created by
+% the preparatory data script
+% {\ttfamily{}prepdata.sh}. It is the number of
+% working text fonts found on the system.\par
+% \begin{macrocode}
+\newcounter{SIL@maxfont}
+% \end{macrocode}
+% \end{CPK@counter}
+% \begin{CPK@counter}{SIL@fontsel}\label{counter--SIL@fontsel}
+% This is set to a random number between one and
+% \DescribeCounter{SIL@maxfont}{\ttfamily{}SIL@maxfont}, and used as the
+% name of the file containing the font name.\par
+% \begin{macrocode}
+\newcounter{SIL@fontsel}
+% \end{macrocode}
+% \end{CPK@counter}
+% \begin{CPK@file}{pickfont.tex}\label{file--pickfont.tex}
+% This file is created by the preparatory data script
+% {\ttfamily{}prepdata.sh} after it sets up the
+% subdirectory list of valid text fonts. It sets the value
+% of \DescribeCounter{SIL@maxfont}{\ttfamily{}SIL@maxfont}.\par
+% \begin{macrocode}
+\input{pickfont.tex}
+% \end{macrocode}
+% \end{CPK@file}
+% \subsubsection{Color selection}\label{color}
+% \begin{CPK@counter}{SIL@maxcolno}\label{counter--SIL@maxcolno}
+% This value is set at the end of the file
+% {\ttfamily{}svgnam.tex}. This is the number of
+% color names found by the routine in
+% {\ttfamily{}prepdata.sh} which extracts the color
+% names.\par
+% \begin{macrocode}
+\newcounter{SIL@maxcolno}
+% \end{macrocode}
+% \end{CPK@counter}
+% \begin{CPK@file}{svgnam.tex}\label{file--svgnam.tex}
+% The preparatory data script
+% {\ttfamily{}prepdata.sh} retrieves the colors named
+% in the \textbf{\texttt{svgnames}} option to the
+% \textsf{xcolor} package and instantiates them
+% as a \LaTeX{} {\ttfamily{}\textbackslash{}ifcase} list in the file
+% {\ttfamily{}svgnam.tex} as the command
+% {\ttfamily{}\textbackslash{}SIL@svgcolname}.\par
+% \begin{macrocode}
+\input{svgnam.tex}
+% \end{macrocode}
+% \end{CPK@file}
+% \begin{CPK@counter}{SIL@loopcount}\label{counter--SIL@loopcount}
+% The random font selection is done in a loop because
+% of the need to test the values. This counter counts the
+% iterations…\par
+% \begin{macrocode}
+\newcounter{SIL@loopcount}
+% \end{macrocode}
+% \end{CPK@counter}
+% \begin{CPK@counter}{SIL@maxloop}\label{counter--SIL@maxloop}
+% …and this one the limit.\par
+% \begin{macrocode}
+\newcounter{SIL@maxloop}
+% \end{macrocode}
+% \end{CPK@counter}
+% \begin{CPK@counter}{SIL@bgcolno}\label{counter--SIL@bgcolno}
+% The colors are selected numerically. This value is
+% the background color of the spine of a book.\par
+% \begin{macrocode}
+\newcounter{SIL@bgcolno}
+% \end{macrocode}
+% \end{CPK@counter}
+% \begin{CPK@counter}{SIL@fgcolno}\label{counter--SIL@fgcolno}
+% And this is the foreground color, used to typeset
+% the title and author on the spine of a book.\par
+% \begin{macrocode}
+\newcounter{SIL@fgcolno}
+% \end{macrocode}
+% \end{CPK@counter}
+% \begin{CPK@length}{\splitpoint}\label{length--splitpoint}
+% To make sure that \DescribeCounter{SIL@bgcolno}{\ttfamily{}SIL@bgcolno} and \DescribeCounter{SIL@fgcolno}{\ttfamily{}SIL@fgcolno}
+% are distinct, we will need to pick one
+% `dark' and one
+% `light', crudely distinguished by
+% examining their `brightness'
+% (monochrome intensity value) using the formula
+% \label{bright}\(b=\sqrt(.241r^2+.691g^2+.068b^2)\) due to \href{https://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx}{Nir
+% Dobovizki}. From inspection, the modal point of
+% the {\smaller SVG} values occurs around 0.6, so
+% use use this to determine if the randomly-selected color
+% is `dark' or
+% `light'. Because it's a decimal
+% fraction, we express it as a dimension and strip off the
+% `pt' later.\par
+% \begin{macrocode}
+\newlength{\SIL@splitpoint}
+\setlength{\SIL@splitpoint}{0.6pt}
+% \end{macrocode}
+% \end{CPK@length}
+% \begin{CPK@macro}{\SIL@bgcol}\label{macro--SIL@bgcol}
+% We establish defaults for the background color…\par
+% \begin{macrocode}
+\def\SIL@bgcol{White}
+% \end{macrocode}
+% \end{CPK@macro}
+% \begin{CPK@macro}{\SIL@fgcol}\label{macro--SIL@fgcol}
+% …and the foreground color.\par
+% \begin{macrocode}
+\def\SIL@fgcol{Black}
+% \end{macrocode}
+% \end{CPK@macro}
+% \begin{CPK@length}{\SIL@bgval}\label{length--SIL@bgval}
+% The values computed by the
+% {\ttfamily{}prepdata.sh} script and stored in
+% {\ttfamily{}svgnam.tex} are decimal fractions,
+% to they need to be retrieved as lengths. This is the
+% background value…\par
+% \begin{macrocode}
+\newlength{\SIL@bgval}
+% \end{macrocode}
+% \end{CPK@length}
+% \begin{CPK@length}{\SIL@fgval}\label{length--SIL@fgval}
+% …and the foreground value.\par
+% \begin{macrocode}
+\newlength{\SIL@fgval}
+% \end{macrocode}
+% \end{CPK@length}
+% \begin{CPK@length}{\SIL@bgfgdiff}\label{length--SIL@bgfgdiff}
+% The `dark' or
+% `light' test discussed above also
+% needs to test if the values are too close to the
+% splitpoint. By examination, if the values have an
+% absolute difference of 0.2 they should be visually
+% distinct enough. The difference is calculated and stored
+% in this length variable, as it's a decimal fraction.\par
+% \begin{macrocode}
+\newlength{\SIL@bgfgdiff}
+% \end{macrocode}
+% \end{CPK@length}
+% \begin{CPK@switch}{\SIL@notyetcols}\label{switch--SIL@notyetcols}
+% In the testing for colors, the nested conditionals
+% set this switch true or false, so that it can be used to
+% control the iteration through successive attempts to find
+% suitable random values.\par
+% \begin{macrocode}
+\newif\ifSIL@notyetcols
+% \end{macrocode}
+% \end{CPK@switch}
+% \subsubsection{Page border setup}\label{borders}
+% \begin{CPK@macro}{\AddToShipoutPictureBG}\label{macro--AddToShipoutPictureBG}
+% The page background color is set to a pale brown
+% roughly matching the pine veneer of IKEA bookcases, with
+% the inner page (behind the books) in a dark shadow
+% brown. The technique for imposing a colored margin is
+% due to \href{https://tex.stackexchange.com/questions/7725/how-to-set-a-certain-color-other-than-white-to-margin-areas}{Ulrike
+% Fischer} and uses the commands from the
+% \textsf{eso-pic} package.\par
+% \begin{macrocode}
+\pagecolor{BurlyWood}
+\AddToShipoutPictureBG{%
+ \AtTextLowerLeft{\color{SaddleBrown}%
+ \rule[-\footskip]{\textwidth}{%
+ \dimexpr\textheight+\footskip}}}
+% \end{macrocode}
+% \end{CPK@macro}
+% \subsubsection{Size and shape}\label{sizeshape}
+% Each book is assigned a random height and width,
+% within the bounds set by the maxima and minima. The final
+% dimensions may then be modified by the choice of layout
+% and font.\par
+% \begin{macrocode}
+\newlength{\SIL@bookheight}
+\newlength{\SIL@bookwidth}
+\newlength{\SIL@minbookwidth}
+\newlength{\SIL@maxbookwidth}
+\newlength{\SIL@minbookheight}
+\newlength{\SIL@maxbookheight}
+% \end{macrocode}
+% \subsubsection{Title and author dimensions}\label{titling}
+% The title and author need to be measured, and
+% decisions are made about what size they need to be. The
+% two layouts (author separately at the top, and author
+% inline to title) are distinguished with the
+% {\ttfamily{}\textbackslash{}SIL@topauthor} conditional. If the title
+% (with or without the author can fit on one line (rather
+% than multiple lines) this is signalled with the
+% {\ttfamily{}\textbackslash{}SIL@titleoneline} conditional.\par
+% \begin{macrocode}
+\newlength{\SIL@titlewidth}
+\newlength{\SIL@authorwidth}
+\newlength{\SIL@titleheight}
+\newlength{\SIL@authorheight}
+\newlength{\SIL@scaledtitle}
+\newlength{\SIL@heightfortitle}
+\newbox\SIL@titlebox
+\newif\ifSIL@topauthor
+\newif\ifSIL@titleoneline
+% \end{macrocode}
+% \subsubsection{Handling the math}
+% \begin{CPK@counter}{SIL@scale}\label{counter--SIL@scale}
+% To extract the integer part of a fixed-point value,
+% we define a simple strip which uses the integer and
+% throws away the rest. The integer ends up in this
+% counter.\par
+% \begin{macrocode}
+\newcounter{SIL@scale}
+% \end{macrocode}
+% \end{CPK@counter}
+% \begin{CPK@macro}{\SIL@scaleint}\label{macro--SIL@scaleint}
+% The integer macro returns the counter above.\par
+% \begin{macrocode}
+\def\SIL@scaleint#1.#2\sentinel{%
+ \setcounter{SIL@scale}{#1}}
+% \end{macrocode}
+% \end{CPK@macro}
+% \subsubsection{Settings}
+% We set the space around a box and the thickness of the
+% rule, and remove the page numbers.\par
+% \begin{macrocode}
+\fboxsep1em\fboxrule.1pt
+\pagestyle{empty}
+% \end{macrocode}
+% \subsubsection{Making the book}\label{mb}
+% The {\ttfamily{}\textbackslash{}makebook} macro is huge, and
+% handles all the detail of making a book spine. It takes
+% one mandatory argument: a \BibTeX{} entry label value from
+% the declared \BibTeX{} {\ttfamily{}.bib} file in
+% {\ttfamily{}\textbackslash{}addbibresource}.\par
+% \begin{CPK@macro}{\makebook}\label{macro--makebook}
+% Start by announcing the entry label and setting the
+% values that need to be reset every time.\par
+% \begin{macrocode}
+\newcommand{\makebook}[1]{%
+ \typeout{^^J#1}%
+ \setcounter{SIL@maxloop}{10}%
+ \setcounter{SIL@loopcount}{0}%
+% observed
+ \setlength{\SIL@minbookwidth}{5mm}%
+ \setlength{\SIL@maxbookwidth}{20mm}%
+% A5 to A4 height
+ \setlength{\SIL@minbookheight}{70mm}%
+ \setlength{\SIL@maxbookheight}{110mm}%
+ \setlength{\SIL@bookwidth}{0pt}%
+ \setlength{\SIL@bookheight}{0pt}%
+ \setlength{\SIL@heightfortitle}{0pt}%
+ \SIL@topauthorfalse
+% \end{macrocode}
+% \end{CPK@macro}
+% \begin{CPK@macro}{\loop}\label{macro--loop}
+% Start a loop which will pick two random integers,
+% one for background and one for foreground colors. Look
+% these up in the {\ttfamily{}\textbackslash{}SIL@svgcolval} (in
+% {\ttfamily{}svgnam.tex}) to get the brightness
+% values, and calculate the absolute distance between
+% them.\par
+% \begin{macrocode}
+ \loop
+ \addtocounter{SIL@loopcount}{1}%
+ \typeout{Try \theSIL@loopcount}%
+ \setrannum{\c@SIL@bgcolno}{1}{%
+ \c@SIL@maxcolno}%
+ \typeout{BG=\theSIL@bgcolno}%
+ \setrannum{\c@SIL@fgcolno}{1}{%
+ \c@SIL@maxcolno}%
+ \typeout{FG=\theSIL@fgcolno}%
+ \setlength{\SIL@bgval}{%
+ \SIL@svgcolval{\theSIL@bgcolno}pt}%
+ \typeout{BGval=\the\SIL@bgval}%
+ \setlength{\SIL@fgval}{%
+ \SIL@svgcolval{\theSIL@fgcolno}pt}%
+ \typeout{FGval=\the\SIL@fgval}%
+ \setlength{\SIL@bgfgdiff}{%
+ \SIL@bgval - \SIL@fgval}%
+ \typeout{Split gap is \the\SIL@bgfgdiff}%
+ \ifdim\SIL@bgfgdiff<0pt
+ \setlength{\SIL@bgfgdiff}{%
+ \SIL@fgval - \SIL@bgval}%
+ \typeout{Using absolute value
+ \the\SIL@bgfgdiff}%
+ \fi
+% \end{macrocode}
+% The colours need to be separated either side of the
+% 0.6 splitpoint value of the calculated brightness, so
+% make this the outer test, and make the inner test for
+% the separation difference. This will return true if the
+% colors are separated enough, and come from opposite
+% sides of the split point. If the loop makes \DescribeCounter{SIL@maxloop}{\ttfamily{}SIL@maxloop}
+% iterations without finding a pair of values, use
+% whatever was tested last.\par
+% \begin{macrocode}
+ \ifdim\SIL@bgval<\SIL@splitpoint
+ \ifdim\SIL@fgval>\SIL@splitpoint
+ \ifdim\SIL@bgfgdiff>0.2pt
+ \SIL@notyetcolsfalse
+ \else
+ \SIL@notyetcolstrue
+ \fi
+ \else
+ \SIL@notyetcolstrue
+ \fi
+ \else
+ \ifdim\SIL@fgval<\SIL@splitpoint
+ \ifdim\SIL@bgfgdiff>0.2pt
+ \SIL@notyetcolsfalse
+ \else
+ \SIL@notyetcolstrue
+ \fi
+ \else
+ \SIL@notyetcolstrue
+ \fi
+ \fi
+ \typeout{BG=\theSIL@bgcolno,
+ FG=\theSIL@fgcolno}%
+ \ifnum\c@SIL@loopcount>\c@SIL@maxloop
+ \SIL@notyetcolsfalse
+ \fi
+ \ifSIL@notyetcols\repeat
+ \def\SIL@bgcol{\SIL@svgcolname{%
+ \theSIL@bgcolno}}%
+ \def\SIL@fgcol{\SIL@svgcolname{%
+ \theSIL@fgcolno}}%
+ \typeout{BG=\SIL@bgcol, FG=\SIL@fgcol}%
+% \end{macrocode}
+% Now pick a random font: the files generated by
+% {\ttfamily{}prepdata.sh} are named as integers with
+% a {\ttfamily{}.tex} extension in the
+% {\ttfamily{}fontsel} directory. These files load
+% the font as {\ttfamily{}\textbackslash{}SILmfont} (no
+% {\ttfamily{}@} sign, because this is
+% occurring in user mode), and define
+% {\ttfamily{}\textbackslash{}SILmfontname} as the name (for the
+% same reason).\par
+% \begin{macrocode}
+ \setrannum{\c@SIL@fontsel}{1}{\c@SIL@maxfont}%
+ \input{fontsel/\theSIL@fontsel.tex}%
+ \typeout{Set in \SILmfontname}%
+% \end{macrocode}
+% Measure the author width and height at the default
+% size (10pt). If the author fits in 90\% of the
+% maximum width of the book, we put it at the top of the
+% spine and shrink the book width to 1.1 times the set
+% width, provided that is not less than the defined
+% minimum width. The book width is therefore fixed at this
+% point and won't change later.\par
+% \begin{macrocode}
+ \settowidth{\SIL@authorwidth}{%
+ \SILmfont\citefullauthor{#1}}%
+ \typeout{Author width: \the\SIL@authorwidth}%
+ \settoheight{\SIL@authorheight}{%
+ \SILmfont\citefullauthor{#1}}%
+ \typeout{Author height: \the\SIL@authorheight}%
+ \ifdim\SIL@authorwidth<.9\SIL@maxbookwidth
+ \typeout{Author width is less than 90\%
+ of \the\SIL@maxbookwidth}%
+ \setlength{\SIL@bookwidth}{%
+ 1.1\SIL@authorwidth}%
+ \typeout{Book width set to \the\SIL@bookwidth}%
+ \ifdim\SIL@bookwidth<\SIL@minbookwidth
+ \setlength{\SIL@bookwidth}{%
+ \SIL@minbookwidth}%
+ \typeout{Book width reset to min
+ \the\SIL@minbookheight}%
+ \fi
+ \SIL@topauthortrue
+ \else
+ \typeout{Author won't fit in .9 of
+ \the\SIL@maxbookwidth}%
+ \fi
+% \end{macrocode}
+% Now measure the title, with an em rule and the
+% author if it hasn't been assigned to the top of the
+% spine.\par
+% \begin{macrocode}
+ \settowidth{\SIL@titlewidth}{%
+ \SILmfont\citetitle{#1}}%
+ \ifdim\SIL@titlewidth=0pt
+ \typeout{WARNING title width for entry "#1"
+ set in \SILmfontname=0pt!}%
+ \typeout{Likely that the entry has faulty
+ syntax or a bogus title field}%
+ \typeout{or a BiBTeX management or
+ crossref setting is being misinterpreted.}%
+ \typeout{I can't go any further until you
+ fix this, sorry}%
+ \end{document}%
+ \fi
+ \ifSIL@topauthor
+ \typeout{Title width: \the\SIL@titlewidth}%
+ \else
+ \addtolength{\SIL@titlewidth}{%
+ \widthof{\SILmfont~~—~~}}%
+ \addtolength{\SIL@titlewidth}{%
+ \SIL@authorwidth}%
+ \typeout{Title width with em rule and author:
+ \the\SIL@titlewidth}%
+ \fi
+% \end{macrocode}
+% We now have enough data to make a shot at the
+% dimensions. Pick a random book height and set the height
+% available for the title (set sideways) to 90\% of
+% that, so that it fits comfortably. Then if the author
+% was earlier assigned to the top of the spine, reduce
+% this height available for the title by 1.2 times the
+% height occupied by the author (again, to leave a little
+% space). In this case, the width has already been set;
+% otherwise, generate a random width now.\par
+% \begin{macrocode}
+ \typeout{Limits: width=\the\SIL@minbookwidth
+ –\the\SIL@maxbookwidth;
+ height=\the\SIL@minbookheight
+ –\the\SIL@maxbookheight}%
+ \setrandim{\SIL@bookheight}%
+ {\SIL@minbookheight}%
+ {\SIL@maxbookheight}%
+ \typeout{Height generated as
+ \the\SIL@bookheight}%
+ \setlength{\SIL@heightfortitle}%
+ {.9\SIL@bookheight}%
+ \typeout{Height available for title (90\%):
+ \the\SIL@heightfortitle}%
+ \ifSIL@topauthor
+ \typeout{Width set because author fits:
+ \the\SIL@bookwidth}%
+ \addtolength{\SIL@heightfortitle}%
+ {-1.2\SIL@authorheight}%
+ \typeout{Height available for title reset to
+ \the\SIL@heightfortitle}%
+ \else
+ \setrandim{\SIL@bookwidth}%
+ {\SIL@minbookwidth}%
+ {\SIL@maxbookwidth}%
+ \typeout{Width generated as
+ \the\SIL@bookwidth}%
+ \fi
+% \end{macrocode}
+% See how the title will fit the space: if it's
+% smaller, it will fit on one line, but we scale it up so
+% it occupies more of the space available. To do this, we
+% perform fixed-point arithmetic on the space it takes and
+% the space available, and use the resulting decimal
+% fraction later to scale the title. However, if the value
+% resulting is greater than four, set it to four,
+% otherwise the title will be too big to fit. The value
+% four was obtained by inspection and trial and
+% error.\par
+% \begin{macrocode}
+ \ifdim\SIL@titlewidth<\SIL@heightfortitle
+ \typeout{Titling fits in
+ \the\SIL@heightfortitle}%
+ \SIL@titleonelinetrue
+ \edef\titleval{\strip@pt\SIL@titlewidth}%
+ \edef\heightval{\strip@pt\SIL@heightfortitle}%
+ \FPeval\SIL@scaledtitle{\heightval/\titleval}%
+ \typeout{Scaling 1-line title by
+ \SIL@scaledtitle}%
+ \expandafter\SIL@scaleint
+ \SIL@scaledtitle\sentinel
+ \ifnum\c@SIL@scale>4
+ \gdef\SIL@scaledtitle{4}%
+ \typeout{Resetting scale \theSIL@scale\ to
+ \SIL@scaledtitle}%
+ \fi
+% \end{macrocode}
+% Otherwise (too long) the title needs to be set in a
+% box as a multi-line title. This gets complicated:\par
+% \begin{enumerate}
+% \item set the title in a {\ttfamily{}\textbackslash{}vbox} and
+% then add the height and depth it occupies to get the
+% height of the set title;
+% \item if that height is more than the width of the
+% book, use the method above to divide the available
+% height by the [over]used height and use that to reduce
+% the point size by deducting it from 10 (points);
+% \item otherwise (the multiline title fits in the width
+% of the book), do the reverse and increase the point
+% size to take advantage of the extra space by adding it
+% to 10pt.\par
+% \end{enumerate}
+% \begin{macrocode}
+ \else
+ \typeout{Titling won't fit
+ \the\SIL@heightfortitle}%
+ \SIL@titleonelinefalse
+ \setbox\SIL@titlebox=\vbox{%
+ \hsize\SIL@heightfortitle
+ \SILmfont\raggedright
+ \vrule height1em width0pt
+ \bfseries\citetitle{#1}%
+ \vrule depth.2em width0pt
+ }%
+ \setlength{\SIL@titleheight}%
+ {\ht\SIL@titlebox + \dp\SIL@titlebox}%
+ \typeout{Multiline title takes
+ \the\SIL@titleheight}%
+ \ifdim\SIL@titleheight>\SIL@bookwidth
+ \typeout{Height of title
+ \the\SIL@titleheight\
+ is greater than
+ \the\SIL@bookwidth}%
+ \edef\titleval{\strip@pt\SIL@titleheight}%
+ \edef\heightval{\strip@pt\SIL@bookwidth}%
+ \FPeval\SIL@scaledtitle
+ {10 - \heightval / \titleval}%
+ \typeout{10 - \heightval\ ÷ \titleval\
+ = \SIL@scaledtitle}%
+ \typeout{Using smaller font \SIL@scaledtitle
+ pt for multiline title}%
+ \else
+ \typeout{Height of title
+ \the\SIL@titleheight\
+ is less than
+ \the\SIL@bookwidth}%
+ \edef\titleval{\strip@pt\SIL@titleheight}%
+ \edef\heightval{\strip@pt\SIL@bookwidth}%
+ \FPeval\SIL@scaledtitle
+ {10 + \heightval / \titleval}%
+ \typeout{10 + \heightval\ ÷ \titleval\
+ = \SIL@scaledtitle}%
+ \typeout{Using larger font \SIL@scaledtitle
+ pt for multiline title}%
+ \fi
+ \fi
+% \end{macrocode}
+% Finally, set a {\ttfamily{}\textbackslash{}vbox} to the
+% defined width \emph{less} the space
+% occupied by the {\ttfamily{}\textbackslash{}fcolorbox} border and
+% rule; then set the {\ttfamily{}\textbackslash{}fcolorbox} with the
+% chosen colors, with the author at the top if that's what
+% was selected earlier, and the title below, either scaled
+% using {\ttfamily{}\textbackslash{}scalebox} if it was a
+% single-line title, or with the amended font size if it
+% was a multiline title.\par
+% For a setting with the author inline to the title,
+% just do the scaling of the title.\par
+% \begin{macrocode}
+ \leavevmode\vbox{\hsize\SIL@bookwidth
+ \advance\hsize by2\fboxsep
+ \advance\hsize by2\fboxrule
+ \fcolorbox{black}{\SIL@bgcol}{%
+ \ifSIL@topauthor
+ \typeout{Setting with top author}%
+ \vbox to\SIL@bookheight{\hsize\SIL@bookwidth
+ \typeout{Spine is a vbox to
+ \the\SIL@bookheight,
+ hsize=\the\SIL@bookwidth}%
+ \centering
+ \SILmfont\color{\SIL@fgcol}%
+ \citefullauthor{#1}%
+ \par\vfill
+ \rotatebox{90}{\vbox to\SIL@bookwidth{%
+ \hsize\SIL@heightfortitle
+ \null\vfill
+ \typeout{Title in a vbox to
+ \the\SIL@bookwidth,
+ hsize=\the\SIL@heightfortitle}%
+ \raggedright\color{\SIL@fgcol}%
+ \ifSIL@titleoneline
+ \scalebox{\SIL@scaledtitle}%
+ {\bfseries\citetitle{#1}}%
+ \else
+ \fontsize{\SIL@scaledtitle}%
+ {\SIL@scaledtitle}\selectfont
+ \bfseries\citetitle{#1}%
+ \fi
+ \par\vfill}%
+ }%
+ }%
+ \else
+ \typeout{Setting author inline to title}%
+ \vbox to\SIL@bookheight{\hsize\SIL@bookwidth
+ \typeout{Spine is a vbox to
+ \the\SIL@bookheight,
+ hsize=\the\SIL@bookwidth}%
+ \centering
+ \SILmfont\color{\SIL@fgcol}%
+ \rotatebox{90}{\vbox to\SIL@bookwidth{%
+ \hsize\SIL@heightfortitle
+ \null\vfill
+ \typeout{Title and author in a vbox to
+ \the\SIL@bookwidth,
+ hsize=\the\SIL@heightfortitle}%
+ \raggedright\color{\SIL@fgcol}%
+ \ifSIL@titleoneline
+ \scalebox{\SIL@scaledtitle}%
+ {{\bfseries\citetitle{#1}}\quad
+ —\ \ \citefullauthor{#1}}%
+ \else
+ \fontsize{\SIL@scaledtitle}%
+ {\SIL@scaledtitle}\selectfont
+ {\bfseries\citetitle{#1}}\quad
+ —\ \ \citefullauthor{#1}%
+ \fi
+ \par\vfill}%
+ }%
+ }%
+ \fi
+ }%
+% \end{macrocode}
+% At the bottom, add a colored bar to fake up the
+% shelf the books stand on. The number is the number of
+% the font that was selected, and is there for
+% error-tracing purposes only.\par
+% Despite best efforts at ending all
+% non-control-sequence line-ends with a percent shield,
+% space is creeping in somewhere, so the final negative
+% kern removes it.\par
+% \begin{macrocode}
+ \\\fboxsep0pt\fboxrule0pt
+ \colorbox{BurlyWood}{\hbox to\hsize{%
+ \hfil\vrule height3mm depth6mm width0pt
+ \normalfont\scriptsize\theSIL@fontsel\hfil}}%
+ }%
+\kern-2.2mm}%
+% \end{macrocode}
+% \end{CPK@macro}
+% \begin{CPK@macro}{\DeclareCiteCommand}\label{fields}
+% Trying to ensure we have an author's full name, not
+% just the surname. This came from \href{https://tex.stackexchange.com/questions/24979/citing-authors-full-name-in-biblatex}{lockstep},
+% modified at \textsf{biblatex}'s suggestion to
+% use {\ttfamily{}given-family} instead of
+% {\ttfamily{}first-last}, but it doesn't seem
+% to have any effect.\par
+% \begin{macrocode}
+\DeclareCiteCommand{\citefullauthor}
+ {\boolfalse{citetracker}%
+ \boolfalse{pagetracker}%
+ \DeclareNameAlias{labelname}{given-family}%
+ \usebibmacro{prenote}}
+ {\ifciteindex
+ {\indexnames{labelname}}
+ {}%
+ \printnames{labelname}}
+ {\multicitedelim}
+ {\usebibmacro{postnote}}
+% \end{macrocode}
+% \end{CPK@macro}
+% \begin{CPK@macro}{\DeclareLabeltitle}\label{macro--DeclareLabeltitle}
+% Similarly, in an attempt to get keep the author and
+% title for books and monographs, but use the editors and
+% volume/journal/book title for articles, incollection, and
+% inbook entry types, these two definitions don't seem to
+% have any effect. The remaining definitions are
+% needed to cope with the expected commands found in
+% sample bibliographies.\par
+% \begin{macrocode}
+%%\DeclareLabeltitle[article]{%
+%% \field{journaltitle}
+%%}
+%%\DeclareLabeltitle
+%% [inbook,incollection,inproceedings]{%
+%% \field{booktitle}
+%% \field{maintitle}
+%%}
+%
+\DeclareFieldFormat*{citetitle}{#1}
+\let\citeA\textcite
+\let\titleref\emph
+\def\emdash{~--- }
+% \end{macrocode}
+% \end{CPK@macro}
+% \iffalse
+%</class>
+% \fi
+% \nocite{*}
+% \clearpage
+% \raggedright
+% \raggedright\printbibliography
+% \appendix
+% \newgeometry{left=3cm}
+% \clearpage
+% \section{The \LaTeX{} Project Public License (v\thinspace{}1.3c)}\label{LPPL}
+% \begin{quotation}\small\sffamily\parindent0pt
+% \parskip.5\baselineskip
+% \color{DarkBlue}\noindent
+% Everyone is allowed to distribute verbatim copies of this
+% license document, but modification of it is not allowed.\par
+% \end{quotation}
+% \subsection{Preamble}\label{Preamble}
+% The \LaTeX{} Project Public License ({\smaller LPPL})
+% is the primary license under which the \LaTeX{} kernel and the
+% base \LaTeX{} packages are distributed.\par
+% 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{}.\par
+% 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.\par
+% 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.\par
+% We, the \LaTeX{3} 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
+% {\ttfamily{}cfgguide.tex} and {\ttfamily{}modguide.tex} in the base \LaTeX{}
+% distribution for suggestions.\par
+% \subsection{Definitions}\label{Definitions}
+% In this license document the following terms are used:\par
+% \begin{description}[style=unboxed]
+% \item[Work\thinspace:]Any work being distributed under this License.\par
+% \item[Derived Work\thinspace:]Any work that under any applicable law is derived from
+% the Work.\par
+% \item[Modification\thinspace:]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.\par
+% \item[Modify\thinspace:]To apply any procedure that produces a Derived Work
+% under any applicable law.\par
+% \item[Distribution\thinspace:]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
+% {\smaller FTP} or {\smaller HTTP} or by
+% shared file systems such as Sun's Network File System
+% ({\smaller NFS}).\par
+% \item[Compiled Work\thinspace:]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.\par
+% \item[Current Maintainer\thinspace:]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.\par
+% \item[Base Interpreter\thinspace:]A program or process that is normally needed for
+% running or interpreting a part or the whole of the
+% Work.\par
+% 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'.\par
+% \end{description}
+% \subsection{Conditions on Distribution and Modification}\label{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.\par
+% \item \label{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.\par
+% \item You may distribute a Compiled Work that has been
+% generated from a complete, unmodified copy of the Work as
+% distributed under Clause~item~\ref{item-distribute} above 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.\par
+% \item \label{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.\par
+% \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.\par
+% \item \label{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.\par
+% \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.\par
+% \item 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.\par
+% \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.\par
+% \item You distribute at least one of the following with
+% the Derived Work:\par
+% \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;\par
+% \item Information that is sufficient to obtain a
+% complete, unmodified copy of the Work.\par
+% \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~item~\ref{item-conditions} above, above, are met
+% with regard to the Derived Work.\par
+% \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~item~\ref{item-currmaint} above, above.\par
+% \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.\par
+% \item % \begin{enumerate}
+% \item A Derived Work may be distributed under a different
+% license provided that license itself honors the
+% conditions listed in Clause~item~\ref{item-conditions} in the list on p.\thinspace\pageref{item-conditions} above, in
+% regard to the Work, though it does not have to honor the
+% rest of the conditions in this license.\par
+% \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~item~\ref{item-conditions} in the list on p.\thinspace\pageref{item-conditions} above, concerning
+% changes from the Work.\par
+% \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.\par
+% \item Nothing in this license is intended to, or may be used
+% to, prevent complete compliance by all parties with all
+% applicable laws.\par
+% \end{enumerate}
+% \subsection{No Warranty}\label{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.\par
+% 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.\par
+% \subsection{Maintenance of The Work}\label{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'.\par
+% 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.\par
+% 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.\par
+% You can become the Current Maintainer of the Work by
+% agreement with any existing Current Maintainer to take over this
+% role.\par
+% If the Work is unmaintained, you can become the Current
+% Maintainer of the Work through the following steps:\par
+% \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.\par
+% \item If this search is successful, then enquire whether the
+% Work is still maintained.\par
+% \begin{enumerate}
+% \item If it is being maintained, then ask the Current
+% Maintainer to update their communication data within one
+% month.\par
+% \item \label{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 \url{news:comp.text.tex}.)\par
+% \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.\par
+% \item \label{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.\par
+% \end{enumerate}
+% \item \label{item-change}If you make an `intention announcement'
+% as described in~item~\ref{item-intention} in the list on p.\thinspace\pageref{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.\par
+% \item If the previously unreachable Current Maintainer becomes
+% reachable once more within three months of a change
+% completed under the terms of~item~\ref{item-announce} in the list on p.\thinspace\pageref{item-announce}
+% or~item~\ref{item-change} above, then that
+% Current
+% Maintainer must become or remain the Current Maintainer upon
+% request provided they then update their communication data
+% within one month.\par
+% \end{enumerate}
+% A change in the Current Maintainer does not, of itself,
+% alter the fact that the Work is distributed under the
+% {\smaller LPPL} license.\par
+% 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~item~\ref{item-intention} in the list on p.\thinspace\pageref{item-intention}
+% above.\par
+% \subsection{Whether and How to Distribute Works under This
+% License}\label{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.\par
+% \subsubsection{Choosing This License or Another License}\label{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 {\smaller LPPL} or otherwise
+% give the impression that your work is distributed under the
+% {\smaller LPPL}.\par
+% The document {\ttfamily{}modguide.tex} in the base \LaTeX{}
+% distribution explains the motivation behind the conditions of
+% this license. It explains, for example, why distributing
+% \LaTeX{} under the {\smaller GNU} General Public
+% License ({\smaller GPL}) was considered inappropriate.
+% Even if your work is unrelated to \LaTeX{}, the discussion in
+% {\ttfamily{}modguide.tex} may still be
+% relevant, and authors intending to distribute their works
+% under any license are encouraged to read it.\par
+% \subsubsection{A Recommendation on Modification Without
+% Distribution}\label{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.\par
+% \subsubsection{How to Use This License}\label{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.\par
+% Here is an example of such a notice and statement:\par
+% \iffalse
+%<*ignore>
+% \fi
+\begin{lstlisting}[language={[LaTeX]TeX}]
+%%% 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
+%% http://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{lstlisting}
+% \iffalse
+%</ignore>
+% \fi
+% 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
+% {\ttfamily{}pig.dtx}, {\ttfamily{}pig.ins}, and {\ttfamily{}pig.sty} (the last being generated
+% from {\ttfamily{}pig.dtx} using {\ttfamily{}pig.ins}), the `Base
+% Interpreter' referring to any
+% `\LaTeX{}-Format', and both `Copyright
+% Holder' and `Current Maintainer'
+% referring to the person
+% M.~Y.~Name\index{!}.\par
+% If you do not want the Maintenance section of
+% {\smaller 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.\par
+% \subsubsection{Derived Works That Are Not Replacements}\label{NotReplacements}
+% Several clauses of the {\smaller 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 6b and 6d shall not
+% apply.\par
+% \subsubsection{Important Recommendations}\label{Recommendations}
+% \paragraph[Defining What Constitutes the Work]{Defining What Constitutes the Work :}
+% The {\smaller 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:\par
+% \iffalse
+%<*ignore>
+% \fi
+\begin{lstlisting}[language={[LaTeX]TeX}]
+%% This work consists of all files listed in manifest.txt.
+\end{lstlisting}
+% \iffalse
+%</ignore>
+% \fi
+% 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.\par
+% \iffalse
+%<*script>
+#! /bin/bash
+
+# prepdata.sh - prepare the datasets for the bookshelf package
+# which creates a bookshelf image from a BiBTeX file.
+#
+# Peter Flynn, 2020-05-14 <peter@silmaril.ie>
+#
+# Dependencies: the standard UNIX/GNU Linux text utilities
+# and builtins : cat, grep, awk, mkdir, rm, echo, sed, sort
+# PLUS the font-cache program fc-list (1) and the TeX utility
+# kpsewhich (1).
+#
+# Note that if you have not updated your font-cach to take
+# account of fonts added since installation (eg fonts
+# distributed with TeX which are not installed in the system
+# fonts directories) then you should edit /etc/fonts/conf.avail
+# to add the directories where they are installed to (eg)
+# 09-texlive.conf and then alias that file to conf.d, and then
+# run fc-cache as root.
+
+if [ -z "$1" ]; then
+ echo You must give the full name of your BiBTeX file
+ exit 1
+else
+ if [ ! -s "$1" ]; then
+echo I can\'t find the file "$1" anywhere here
+exit 1
+ else
+BIBFILE="$1"
+ fi
+fi
+
+###########################################################
+#
+# Make a list of all the entries in the bib file. This is
+# in effect the 'driver' which creates each book spine image
+# and the entries.tex file is \input in the test.tex file.
+
+cat "$BIBFILE" |\
+ grep '^@' |\
+ grep -viE '(@Preamble|@String)' |\
+ awk -F\{ '{print $2}' |\
+ awk -F, '{print "\\makebook{" $1 "}%"}' >entries.tex
+
+echo `cat entries.tex|wc -l` bibliographic entries
+
+##########################################################
+#
+# Make a list of all the fonts available: this omits PFB
+# fonts (Postscript Type 1) and deduplicates the entries
+# on the first token of their name. CRITICALLY it then
+# applies a (typically) VERY LONG list of disallowed font
+# names so as to exclude non-text fonts: math, symbols,
+# display fonts, bogus and broken fonts, and fonts not
+# providing the Latin alphabet.
+#
+# Note that the current list includes many names which
+# ought not be there, because problems were encountered
+# when using them, especially as they returned a value
+# for the title length of 0.0pt, which is clearly a bug.
+
+mkdir -p fontsel
+rm -f fontsel/*
+
+if [[ "$OSTYPE" =~ ^darwin ]]; then
+
+ system_profiler SPFontsDataType 2>/dev/null |\
+ awk -F: '/^[ ]{4}[A-Za-z0-9\;\ ]*.[ot]tf*:$/ {font=substr($1,5)} \
+ /^[ ]{10}Family:/ {if(font!="") \
+ {print substr($2,2);font=""}}' |\
+ grep -Ev '^[\.\ ]' |\
+ sort |\
+ uniq |\
+ grep -Evi '(Bitmap|Emoji|Dingbats|Jazz|STIX|dings|Symbol|Numeric|DIN|Ornament|OCR|CJK|Awesome|Dummy|Math)' |\
+ awk '{file="fontsel/" NR ".tex";\
+ print "\\newfontface{\\SILmfont}{" $0 "}" >file;
+ print "\\def\\SILmfontname{" $0 "}" >file;
+ close(file)} \
+ END {print "\\setcounter{SIL@maxfont}{" NR "}"}' >pickfont.tex
+
+elif [[ "$OSTYPE" =~ ^linux ]]; then
+
+ fc-list |\
+ grep -v '\.[ot]tf' |\
+ grep -Ev '(fontsite|bitstrea)' |\
+ awk -F: '{print substr($2,2)}' |\
+ awk -F, '{print $1}' |\
+ awk '{print $1 "," length($0) "," $0}' |\
+ sort -t, -k 1,1 -k 2n |\
+ awk -F, '{if($1!=last)print $3;last=$1}' |\
+ grep -Evi '(Bitmap|Emoji|Dingbats|Jazz|STIX|dings|Symbol|Numeric|DIN|Ornament|OCR|CJK|Awesome|Dummy|Math)' |\
+ awk '{file="fontsel/" NR ".tex";\
+ print "\\newfontface{\\SILmfont}{" $0 "}" >file;
+ print "\\def\\SILmfontname{" $0 "}" >file;
+ close(file)} \
+ END {print "\\setcounter{SIL@maxfont}{" NR "}"}' >pickfont.tex
+
+fi
+
+echo `ls -1 fontsel|wc -l` fonts
+
+###########################################################
+#
+# Make a list of the colour selection from the SVG palette
+# of the xcolor LaTeX package, with calculation of the
+# brightness/darkness value according to
+# https://www.nbdtech.com/Blog/archive/2008/04/27/Calculating-the-Perceived-Brightness-of-a-Color.aspx
+
+PALETTE=`kpsewhich svgnam.def`
+cat $PALETTE |\
+ grep '^[A-Z][A-Za-z]*,[\.0-9][0-9]*,[\.0-9][0-9]*,[\.0-9][0-9]*' |\
+ awk -F\; '{print $1}' |\
+ awk -F, '{r=$2;g=$3;b=$4} \
+ {brightness=sqrt((0.241*r*r)+(0.691*g*g)+(0.068*b*b))} \
+ {print $1,r,g,b,brightness}' >svgnam.csv
+ cat svgnam.csv |\
+ awk 'BEGIN {print "\\newcommand{\\SIL@svgcolname}[1]{\\ifcase#1 "} \
+ {print $1 "\\or"} END {print "Black\\fi}\n"}' >svgnam.tex
+ cat svgnam.csv |\
+ awk 'BEGIN {print "\\newcommand{\\SIL@svgcolval}[1]{\\ifcase#1 "} \
+ {print $5 "\\or"} END {print ".666666666\\fi}\n"}' >>svgnam.tex
+ cat svgnam.csv | wc -l |\
+ awk '{print "\\setcounter{SIL@maxcolno}{" $1 "}"}' >>svgnam.tex
+
+echo `cat svgnam.csv|wc -l` colors
+
+exit 0
+
+%</script>
+% \fi
+% \iffalse
+%<*tester>
+%<<COMMENT
+% !TEX TS-program = xelatex
+% !TEX encoding = UTF-8 Unicode
+% !BIB TS-program = biber
+%COMMENT
+
+%</tester>
+% \fi
+% \iffalse
+%<*tester>
+\documentclass[a0paper,landscape]{bookshelf}
+\addbibresource{mythesis.bib}
+\begin{document}\raggedright
+%%\immediate\write18{./prepdata.sh}
+%%\input{entries.tex}
+\nocite{*}
+\par\vfill\clearpage
+\printbibliography
+\end{document}
+
+%</tester>
+% \fi
+% \Finale
+
diff --git a/Master/texmf-dist/source/latex/bookshelf/bookshelf.ins b/Master/texmf-dist/source/latex/bookshelf/bookshelf.ins
new file mode 100644
index 00000000000..cc1b1c81645
--- /dev/null
+++ b/Master/texmf-dist/source/latex/bookshelf/bookshelf.ins
@@ -0,0 +1,62 @@
+% Transformed from bookshelf.xml by ClassPack db2dtx.xsl
+% version 1.19 (2020-05-19) on Saturday 23 May 2020 at 23:33:08
+%
+% bookshelf.ins is copyright © 2020 by Peter Flynn <peter@silmaril.ie>
+%
+% 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:
+%
+% http://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 Peter Flynn <peter@silmaril.ie>
+%
+% This work consists of the files bookshelf.dtx and bookshelf.ins,
+% the derived file
+% and any other ancillary files listed in the MANIFEST.
+%
+\input docstrip.tex
+\keepsilent
+\usedir{tex/latex/bookshelf}
+\preamble
+
+This is a generated file.
+
+Copyright © 2020 by latex@silmaril.ie
+
+This file was generated from an XML master source.
+Amendments and corrections should be notified to the
+maintainer for inclusion in future versions.
+
+\endpreamble
+\generate{\file{bookshelf.cls}{\from{bookshelf.dtx}{class}}
+ \usepreamble\empty\usepostamble\empty
+ \file{prepdata.sh}{\from{bookshelf.dtx}{script}}
+ \usepreamble\empty\usepostamble\empty
+ \file{test.tex}{\from{bookshelf.dtx}{tester}}
+}
+\obeyspaces
+\Msg{********************************************************}
+\Msg{** **}
+\Msg{** Read the documentation before using this class. **}
+\Msg{** **}
+\Msg{** To finish the installation you have to move the **}
+\Msg{** following files into a directory searched by TeX: **}
+\Msg{** **}
+\Msg{** **}
+\Msg{** prepdata.sh **}
+\Msg{** test.tex **}
+\Msg{** **}
+\Msg{** To produce the documentation run the file **}
+\Msg{** bookshelf.dtx through XeLaTeX and biber **}
+\Msg{** **}
+\Msg{** Happy LaTeXing! **}
+\Msg{** **}
+\Msg{********************************************************}
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/boxedminipage2e/boxedminipage2e.dtx b/Master/texmf-dist/source/latex/boxedminipage/boxedminipage.dtx
index 97a3bd45a55..ae093ab6591 100644
--- a/Master/texmf-dist/source/latex/boxedminipage2e/boxedminipage2e.dtx
+++ b/Master/texmf-dist/source/latex/boxedminipage/boxedminipage.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
-% Copyright (C) 2015 by Scott Pakin <scott+bmp2e@pakin.org>
-% -------------------------------------------------------
+% Copyright (C) 2015-2020 by Scott Pakin <scott+bmp@pakin.org>
+% ------------------------------------------------------------
%
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3c of this license
@@ -17,23 +17,68 @@
%
% \iffalse
%<*driver>
-\ProvidesFile{boxedminipage2e.dtx}
+\ProvidesFile{boxedminipage.dtx}
%</driver>
-%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-%<package>\ProvidesPackage{boxedminipage2e}
+%<package|old-package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<package>\ProvidesPackage{boxedminipage}
+%<old-package>\ProvidesPackage{boxedminipage2e}
%<*package>
- [2015/03/09 v1.0 Boxed LaTeX2e minipages]
+ [2020/04/19 v1.1 Boxed LaTeX2e minipages]
%</package>
%
%<*driver>
\documentclass{ltxdoc}
-\usepackage{boxedminipage2e}[2015/03/09]
+\usepackage[T1]{fontenc}
+\usepackage{boxedminipage}
+\usepackage{needspace}
+\usepackage{tocbibind}
+\usepackage{hyperref}
+\usepackage{hyperxmp}
+\usepackage{cleveref}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
+
+% Specify this document's metadata.
+\GetFileInfo{boxedminipage.dtx}
+\title{The \pkgname{boxedminipage} package\thanks{This document
+ corresponds to \pkgname{boxedminipage}~\fileversion, dated \filedate.}}
+\author{Scott Pakin \\ \textit{scott+bmp@pakin.org}}
+\makeatletter
+\edef\versionnumber{\expandafter\@gobble\fileversion} % Drop the "v" in the file version.
+\makeatother
+\hypersetup{%
+ pdftitle={The boxedminipage package},
+ pdfauthor={Scott Pakin},
+ pdfsubject={LaTeX2e minipages with a surrounding frame},
+ pdfkeywords={LaTeX, minipages, boxes, frames, fbox, fboxsep},
+ pdfcopyright={Copyright (C) 2015-2020, Scott Pakin},
+ pdflicenseurl={http://www.latex-project.org/lppl/},
+ pdfcaptionwriter={Scott Pakin},
+ pdfcontactemail={scott+bmp@pakin.org},
+ pdfcontacturl={http://www.pakin.org/\xmptilde scott/},
+ pdfversionid={\versionnumber},
+ pdflang={en-US},
+ pdftrapped={False},
+ pdfstartpage={},
+ pdfurl={http://mirror.ctan.org/macros/latex/contrib/boxedminipage/boxedminipage.pdf},
+ baseurl={http://mirror.ctan.org/macros/latex/contrib/boxedminipage/}
+}
+
+% Begin the documentation.
\begin{document}
- \DocInput{boxedminipage2e.dtx}
+\DocInput{boxedminipage.dtx}
+ \Needspace{10\baselineskip}
+ \phantomsection\addcontentsline{toc}{section}{Change History}
\PrintChanges
+ \makeatletter
+ \let\orig@index@prologue=\index@prologue
+ \def\index@prologue{%
+ \phantomsection\addcontentsline{toc}{section}{Index}
+ \orig@index@prologue
+ }%
+ \makeatother
+ \Needspace{12\baselineskip}
\PrintIndex
\end{document}
%</driver>
@@ -59,20 +104,16 @@
%
%
% \changes{v1.0}{2015/03/09}{Initial version}
+% \changes{v1.1}{2020/04/19}{Renamed the package from
+% \protect\pkgname{boxedminipage2e} to \protect\pkgname{boxedminipage}}
%
-% \GetFileInfo{boxedminipage2e.dtx}
-%
-% \DoNotIndex{\begin,\def,\else,\end,\fi,\ifx,\ifx,\newcommand}
-% \DoNotIndex{\newenvironment,\relax,\the}
+% \DoNotIndex{\@ifnextchar,\MessageBreak,\addtolength,\begin,\def,\else}
+% \DoNotIndex{\end,\fi,\ifx,\ifx,\newcommand,\newenvironment,\relax}
+% \DoNotIndex{\setlength,\the}
%
% ^^A Define a shortcut for typesetting package names.
% \let\pkgname=\textsf
%
-%
-% \title{The \pkgname{boxedminipage2e} package\thanks{This document
-% corresponds to \pkgname{boxedminipage2e}~\fileversion, dated \filedate.}}
-% \author{Scott Pakin \\ \textit{scott+bmp2e@pakin.org}}
-%
% \maketitle
% \sloppy
%
@@ -124,20 +165,25 @@
% \end{minipage}
% \end{center}
%
-% There exists a package called \pkgname{boxedminipage} that also
-% defines a |boxedminipage| environment. However, the
-% \pkgname{boxedminipage} package, last updated in~1992, lacks support
-% for the \LaTeXe\ |minipage|'s \meta{height} and \meta{inner-pos}
-% arguments. \pkgname{boxedminipage2e} is an attempt to augment
-% \pkgname{boxedminipage} with support for |minipage|'s complete
-% functionality. That said, \pkgname{boxedminipage2e} is a complete
-% rewrite; the two packages have no code in common.
+% \paragraph{History}
+% Prior to \pkgname{boxedminipage}~v1.1 (April 2020), the package was
+% known as \pkgname{boxedminipage2e} to distinguish it from Mario
+% Wolczko's \pkgname{boxedminipage} package, developed for \LaTeX~2.09.
+% Mario's package, last updated in~1992, lacks support for the
+% \LaTeXe\ |minipage|'s \meta{height} and \meta{inner-pos} arguments.
+% In contrast, this package supports |minipage|'s complete functionality.
+%
+% At Frank Mittelbach's suggestion and with Mario Wolczko's consent,
+% this \pkgname{boxedminipage} replaces the \LaTeX~2.09 version.
+% \pkgname{boxedminipage2e} is now an alias for \pkgname{boxedminipage}
+% except that it issues a warning message that new documents should
+% instead use \pkgname{boxedminipage}.
%
%
% \section{Usage}
%
% \DescribeEnv{boxedminipage}
-% The \pkgname{boxedminipage2e} package defines a single environment,
+% The \pkgname{boxedminipage} package defines a single environment,
% |boxedminipage|. It takes the same parameters as \LaTeXe's |minipage|
% environment:
%
@@ -162,6 +208,21 @@
%
% \section{Implementation}
%
+% Most readers can ignore this section. It presents an annotated
+% version of \pkgname{boxedminipage}'s source code.
+% \Cref{sec:boxedminipage} describes the contents of |boxedminipage.sty|.
+% \Cref{sec:boxedminipage2e} represents a separate stub file,
+% |boxedminipage2e.sty|, which merely issues a warning message and
+% instructs the author to load \pkgname{boxedminipage} instead of
+% \pkgname{boxedminipage2e}.
+%
+% \subsection{boxedminipage}
+% \label{sec:boxedminipage}
+%
+% \iffalse
+%<*package>
+% \fi
+%
% \begin{macro}{\bmp@box}
% The contents of the |minipage| are collected into |\bmp@box|.
% \begin{macrocode}
@@ -190,7 +251,7 @@
%
% \begin{environment}{boxedminipage}
% The |boxedminipage| environment is the only environment exposed by the
-% \pkgname{boxedminipage2e} package. It takes the same parameters as
+% \pkgname{boxedminipage} package. It takes the same parameters as
% \LaTeXe's ordinary |minipage| environment:\par
% \smallskip
% \begin{tabular}{lcccc}
@@ -253,5 +314,36 @@
% \end{macrocode}
% \end{macro}
%
+% \iffalse
+%</package>
+% \fi
+%
+% \subsection{boxedminipage2e}
+% \label{sec:boxedminipage2e}
+%
+% Issue a warning if the user loaded \pkgname{boxedminipage2e} instead of
+% the newer name, \pkgname{boxedminipage}. Then load \pkgname{boxedminipage}.
+%
+% \medskip
+% \noindent
+% {\sffamily\small
+%<*old-package>
+% }
+% \begin{macrocode}
+\PackageWarningNoLine{boxedminipage2e}{%
+ The boxedminipage2e package has been\MessageBreak
+ renamed to boxedminipage. New documents\MessageBreak
+ should load boxedminipage instead of\MessageBreak
+ boxedminipage2e}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{boxedminipage}
+% \end{macrocode}
+% {\sffamily\small
+%</old-package>
+% }
+%
+%
% \Finale
\endinput
diff --git a/Master/texmf-dist/source/latex/boxedminipage2e/boxedminipage2e.ins b/Master/texmf-dist/source/latex/boxedminipage/boxedminipage.ins
index ab8a8e66f4c..711d69d20f4 100644
--- a/Master/texmf-dist/source/latex/boxedminipage2e/boxedminipage2e.ins
+++ b/Master/texmf-dist/source/latex/boxedminipage/boxedminipage.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2015 by Scott Pakin <scott+bmp2e@pakin.org>
+%% Copyright (C) 2015-2020 by Scott Pakin <scott+bmp@pakin.org>
%%
%% This file may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.3c of this license
@@ -15,13 +15,13 @@
\input docstrip.tex
\keepsilent
-\usedir{tex/latex/boxedminipage2e}
+\usedir{tex/latex/boxedminipage}
\preamble
This is a generated file.
-Copyright (C) 2015 by Scott Pakin <scott+bmp2e@pakin.org>
+Copyright (C) 2015-2020 by Scott Pakin <scott+bmp@pakin.org>
This file may be distributed and/or modified under the conditions of
the LaTeX Project Public License, either version 1.3c of this license
@@ -35,7 +35,10 @@ and version 1.3c or later is part of all distributions of LaTeX version
\endpreamble
-\generate{\file{boxedminipage2e.sty}{\from{boxedminipage2e.dtx}{package}}}
+\generate{%
+ \file{boxedminipage.sty}{\from{boxedminipage.dtx}{package}}
+ \file{boxedminipage2e.sty}{\from{boxedminipage.dtx}{old-package}}
+}
\obeyspaces
\Msg{*************************************************************}
@@ -43,10 +46,10 @@ and version 1.3c or later is part of all distributions of LaTeX version
\Msg{* To finish the installation you have to move the following *}
\Msg{* file into a directory searched by TeX: *}
\Msg{* *}
-\Msg{* boxedminipage2e.sty *}
+\Msg{* boxedminipage.sty *}
\Msg{* *}
\Msg{* To produce the documentation run the file *}
-\Msg{* boxedminipage2e.dtx through LaTeX. *}
+\Msg{* boxedminipage.dtx through LaTeX. *}
\Msg{* *}
\Msg{* Happy TeXing! *}
\Msg{* *}
diff --git a/Master/texmf-dist/source/latex/brandeis-dissertation/brandeis-dissertation.dtx b/Master/texmf-dist/source/latex/brandeis-dissertation/brandeis-dissertation.dtx
index d930d020d90..767651386fe 100644
--- a/Master/texmf-dist/source/latex/brandeis-dissertation/brandeis-dissertation.dtx
+++ b/Master/texmf-dist/source/latex/brandeis-dissertation/brandeis-dissertation.dtx
@@ -22,7 +22,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
%<package>\ProvidesPackage{brandeis-dissertation}
%<*package>
- [2020/01/21 v3.0 .dtx brandeis-dissertation file]
+ [2020/04/09 v3.11 .dtx brandeis-dissertation file]
%</package>
%<package>\LoadClass[12pt]{article}
%<package>\RequirePackage[margin=1in]{geometry}
@@ -31,21 +31,23 @@
%<package>\RequirePackage[utf8]{inputenc}
%<package>\RequirePackage[english]{babel}
%<package>\RequirePackage{csquotes}
+%<package>\RequirePackage{tocloft}
%<package>\AtBeginEnvironment{quote}{\singlespacing}
%
+%<package>\renewcommand\cfttoctitlefont{\normalsize}
+%<package>\renewcommand\cftlottitlefont{\normalsize}
+%<package>\renewcommand\cftloftitlefont{\normalsize}
%<package>\titleformat*{\section}{\normalsize\bfseries}
%<package>\titleformat*{\subsection}{\normalsize\bfseries}
%<package>\titleformat*{\subsubsection}{\normalsize\bfseries}
+%<package>\newcommand{\sectionbreak}{\clearpage}
%
-%<package>\renewcommand\month[1]{\def\@month{#1}}
-%<package>\renewcommand\year[1]{\def\@year{#1}}
+%<package>\newcommand\graduationmonth[1]{\def\@graduationmonth{#1}}
+%<package>\newcommand\graduationyear[1]{\def\@graduationyear{#1}}
%<package>\newcommand\program[1]{\def\@program{#1}}
%<package>\newcommand\advisor[1]{\def\@advisor{#1}}
%<package>\newcommand\signoff[2]{\def\@signoff{#1}\def\@signofftitle{#2}}
-%<package>\newcommand\committeechair[2]{\def\@committeechair{#1}\def\@committeechairdept{#2}}
-%<package>\newcommand\committeetwo[2]{\def\@committeetwo{#1}\def\@committeetwodept{#2}}
-%<package>\newcommand\committeethree[2]{\def\@committeethree{#1}\def\@committeethreedept{#2}}
-%<package>\newcommand\outsidereader[3]{\def\@outsidereader{#1}\def\@outsidereaderdept{#2}\def\@outsidereaderuni{#3}}
+%<package>\newcommand\committee[1]{\def\@committee{#1}}
%<package>\addto\captionsenglish{\renewcommand*\contentsname{Table of Contents}}
%<package>\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.3em}}
%
@@ -74,7 +76,7 @@
by\\
\@author\\
\vspace{1em}
- \@month\,\@year
+ \@graduationmonth\,\@graduationyear
\end{center}
\restoregeometry
\newpage
@@ -103,16 +105,7 @@
Dissertation Committee:
\noindent
- \@committeechair, \@committeechairdept
-
- \noindent
- \@committeetwo, \@committeetwodept
-
- \noindent
- \@committeethree, \@committeethreedept
-
- \noindent
- \@outsidereader, \@outsidereaderdept, \@outsidereaderuni
+ \@committee
\newpage
\setcounter{page}{3}
@@ -126,22 +119,31 @@
Copyright by\\
\@author{}\\
\vspace{1em}
- \@year{}
+ \@graduationyear{}
\end{center}
\restoregeometry
\newpage
\pagenumbering{roman}
\setcounter{page}{4}
}
-
-%\newcommand{\makeacknowledgements}{
-%}
%</package>
%<*package>
-\newenvironment{thesis-abstract}
+\newenvironment{dissertation-acknowledgements}
+ {
+ %\newgeometry{top=1.4in}
+ \begin{center}
+ Acknowledgements\\
+ \vspace{1em}
+ \end{center}
+ }
+ {
+ \restoregeometry
+ }
+%</package>
+%<*package>
+\newenvironment{dissertation-abstract}
{
%\newgeometry{top=1.4in}
- \addcontentsline{toc}{section}{Abstract}
\begin{center}
\MakeUppercase{Abstract}\\
\vspace{1em}
@@ -200,7 +202,9 @@
% Right brace \} Tilde \~}
%
%
-% \changes{v1.0}{2020/01/21}{Initial version}
+% \changes{v3.0}{2020/02/28}{Initial version}
+% \changes{v3.1}{2020/04/09}{Formatting update}
+% \changes{v3.11}{2020/04/09}{Documentation update}
%
% \GetFileInfo{brandeis-dissertation.dtx}
%
@@ -219,7 +223,7 @@
%
% The \textsf{brandeis-dissertation} class will do the following for you:
% \begin{itemize}
-% \item Create your title, approval, copyright, and abstract pages.
+% \item Create your title, approval, copyright, acknowledgements, and abstract pages.
% \item Ensure your dissertation has the correct margins, spacing, and pagination.
% \end{itemize}
%
@@ -234,15 +238,12 @@
% \begin{description}
% \item[\texttt{\textbackslash title\{\}}:] The title of your dissertation.
% \item[\texttt{\textbackslash author\{\}}:] Your name.
-% \item[\texttt{\textbackslash month\{\}}:] The month in which you graduate.
-% \item[\texttt{\textbackslash year\{\}}:] The year in which you graduate.
+% \item[\texttt{\textbackslash graduationmonth\{\}}:] The month in which you graduate.
+% \item[\texttt{\textbackslash graduationyear\{\}}:] The year in which you graduate.
% \item[\texttt{\textbackslash program\{\}}:] Your program.
% \item[\texttt{\textbackslash advisor\{\}}:] Your advisor's name.
% \item[\texttt{\textbackslash signoff\{\}\{\}}:] The name of the individual signing off on your approval page, followed by their title. This likely is the dean.
-% \item[\texttt{\textbackslash committeechair\{\}}:] Your committee chair's name, followed by their department.
-% \item[\texttt{\textbackslash committeetwo\{\}\{\}}:] The name of your second committee member, followed by their department.
-% \item[\texttt{\textbackslash committeethree\{\}\{\}}:] The name of your third committee member, followed by their department.
-% \item[\texttt{\textbackslash outsidereader\{\}\{\}\{\}}:] The name of your outside reader, followed by their department, followed by their university.
+% \item[\texttt{\textbackslash committee\{\}}:] The members of your committee, with each member separated by a double backslash (\texttt{\char`\\\char`\\}).
% \end{description}
%
% For example, including the following in your document:
@@ -250,15 +251,15 @@
% \begin{verbatim}
% \title{LaTeXing Your Dissertation}
% \author{Deanna Daly}
-% \month{May}
-% \year{2020}
+% \graduationmonth{May}
+% \graduationyear{2020}
% \program{Philosophy}
% \advisor{Alan Turing}
% \signoff{Eric Chasalow}{Dean}
-% \committeechair{Bertrand Russell}{Philosophy}
-% \committeetwo{Alfred North Whitehead}{Mathematics}
-% \committeethree{Ludwig Wittgenstein}{Philosophy}
-% \outsidereader{Emmy Noether}{Mathematics}{Bryn Mawr College}
+% \committee{Bertrand Russell, Philosophy\\
+% Alfred North Whitehead, Mathematics\\
+% Ludwig Wittgenstein, Philosophy\\
+% Emmy Noether, Mathematics, Bryn Mawr College}
% \end{verbatim}
%
% would set your dissertation to one with a title of ``LaTeXing Your Dissertation'', an author of ``Deanna Daly'', a graduation time of May 2020, with the advisor ``Alan Turing'' in the Philosophy program. Your approval page should be signed off by Eric Chasalow, the dean. Your committee would be set to consist of Bertrand Russell from the Philosophy Department, Alfred North Whitehead from the Mathematics Department, and Ludwig Wittgenstein from the Philosophy Department. Your outside reader would be set to be Emmy Noether from Bryn Mawr College's Mathematics Department.
@@ -281,13 +282,13 @@
% \end{dissertation-abstract}
% \end{verbatim}
%
-% This will create your abstract page, with the abstract being ``I present a simple explanation of how to LaTeX your dissertation.''
+% This will create your abstract page, with the abstract being ``I present a simple explanation of how to LaTeX your dissertation.'' You may optionally use the \texttt{dissertation-acknowledgements} environment in the same way, immediately before your abstract.
%
-% Table of Contents, List of Figures, etc. can be generated as usual using \LaTeX.
+% Table of Contents, List of Figures, etc. can be generated as usual using \LaTeX. You should precede these with \texttt{\textbackslash doublespacing} to make them double spaced.
%
% To end the front matter section of your dissertation and begin the body of your dissertation, use the command \texttt{\textbackslash startbody}.
%
-% The rest of your dissertation may be written as normal; margins, spacing, and pagination should be set automatically.
+% The rest of your dissertation may be written as normal; margins, spacing, and pagination should be set automatically, with the exception of your bibliography. To make your bibliography single spaced, you should precede it with You should precede these with \texttt{\textbackslash singlespacing}.
%
% \section{Example}
%
@@ -299,15 +300,15 @@
%
% \title{LaTeXing Your Dissertation}
% \author{Deanna Daly}
-% \month{May}
-% \year{2020}
+% \graduationmonth{May}
+% \graduationyear{2020}
% \program{Philosophy}
% \advisor{Alan Turing}
% \signoff{Eric Chasalow}{Dean}
-% \committeechair{Bertrand Russell}{Philosophy}
-% \committeetwo{Alfred North Whitehead}{Mathematics}
-% \committeethree{Ludwig Wittgenstein}{Philosophy}
-% \outsidereader{Emmy Noether}{Mathematics}{Bryn Mawr College}
+% \committee{Bertrand Russell, Philosophy\\
+% Alfred North Whitehead, Mathematics\\
+% Ludwig Wittgenstein, Philosophy\\
+% Emmy Noether, Mathematics, Bryn Mawr College}
%
% \begin{document}
%
@@ -315,11 +316,15 @@
% \makeapproval
% \makecopyright
%
+% \begin{dissertation-acknowledgements}
+% Thank you to John Burt for assisting with creating this package.
+% \end{dissertation-acknowledgements}
+%
% \begin{dissertation-abstract}
% I present a simple explanation of how to LaTeX your dissertation.
% \end{dissertation-abstract}
%
-% \addcontentsline{toc}{section}{Table of Contents}
+% \doublespacing
% \tableofcontents
%
% \startbody
diff --git a/Master/texmf-dist/source/latex/brandeis-thesis/brandeis-thesis.dtx b/Master/texmf-dist/source/latex/brandeis-thesis/brandeis-thesis.dtx
index 3ae38d8f5f3..b148381de95 100644
--- a/Master/texmf-dist/source/latex/brandeis-thesis/brandeis-thesis.dtx
+++ b/Master/texmf-dist/source/latex/brandeis-thesis/brandeis-thesis.dtx
@@ -4,7 +4,7 @@
% -------------------------------------------------------
%
% This file may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3c
+% 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:
%
@@ -22,7 +22,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
%<package>\ProvidesClass{brandeis-thesis}
%<*package>
- [2020/01/21 v1.0 .dtx brandeis-thesis file]
+ [2020/04/09 v3.1 .dtx brandeis-thesis file]
%</package>
%<package>\LoadClass[12pt]{article}
%<package>\RequirePackage[margin=1in]{geometry}
@@ -37,8 +37,8 @@
%<package>\titleformat*{\subsection}{\normalsize\bfseries}
%<package>\titleformat*{\subsubsection}{\normalsize\bfseries}
%
-%<package>\renewcommand\month[1]{\def\@month{#1}}
-%<package>\renewcommand\year[1]{\def\@year{#1}}
+%<package>\renewcommand\graduationmonth[1]{\def\@graduationmonth{#1}}
+%<package>\renewcommand\graduationyear[1]{\def\@graduationyear{#1}}
%<package>\newcommand\program[1]{\def\@program{#1}}
%<package>\newcommand\advisor[1]{\def\@advisor{#1}}
%<package>\newcommand\degreetype[1]{\def\@degreetype{#1}}
@@ -71,7 +71,7 @@
\vspace{1em}
\@author\\
\vspace{1em}
- \@month\,\@year
+ \@graduationmonth\,\@graduationyear
\end{center}
\restoregeometry
\newpage
@@ -87,7 +87,7 @@
Copyright by\\
\@author{}\\
\vspace{1em}
- \@year{}
+ \@graduationyear{}
\end{center}
\restoregeometry
\newpage
@@ -99,7 +99,6 @@
\newenvironment{thesis-abstract}
{
%\newgeometry{top=1.4in}
- \addcontentsline{toc}{section}{Abstract}
\begin{center}
\MakeUppercase{Abstract}\\
\vspace{1em}
@@ -158,7 +157,8 @@
% Right brace \} Tilde \~}
%
%
-% \changes{v1.0}{2020/01/21}{Initial version}
+% \changes{v3.0}{2020/01/21}{Initial version}
+% \changes{v3.1}{2020/04/09}{Formatting update}
%
% \GetFileInfo{brandeis-thesis.dtx}
%
@@ -192,8 +192,8 @@
% \begin{verbatim}
% \title{}
% \author{}
-% \month{}
-% \year{}
+% \graduationmonth{}
+% \graduationyear{}
% \program{}
% \advisor{}
% \degreetype{}
@@ -204,8 +204,8 @@
% \begin{verbatim}
% \title{LaTeXing Your Thesis}
% \author{Deanna Daly}
-% \month{May}
-% \year{2020}
+% \graduationmonth{May}
+% \graduationyear{2020}
% \program{Computer Science}
% \advisor{Alan Turing}
% \degreetype{Science}
@@ -230,13 +230,13 @@
% \end{thesis-abstract}
% \end{verbatim}
%
-% This will create your abstract page, with the abstract being "I present a simple explanation of how to LaTeX your thesis."
+% This will create your abstract page, with the abstract being ``I present a simple explanation of how to LaTeX your thesis.''
%
-% Table of Contents, List of Figures, etc. can be generated as usual using \LaTeX.
+% Table of Contents, List of Figures, etc. can be generated as usual using \LaTeX. You should precede these with \texttt{\textbackslash doublespacing} to make them double spaced.
%
% To end the front matter section of your thesis and begin the body of your thesis, use the command \texttt{\textbackslash startbody}.
%
-% The rest of your thesis may be written as normal; margins, spacing, and pagination should be set automatically.
+% The rest of your thesis may be written as normal; margins, spacing, and pagination should be set automatically, with the exception of your bibliography. To make your bibliography single spaced, you should precede it with You should precede these with \texttt{\textbackslash singlespacing}.
%
% \section{Example}
%
@@ -248,8 +248,8 @@
%
% \title{LaTeXing Your Thesis}
% \author{Deanna Daly}
-% \month{May}
-% \year{2020}
+% \graduationmonth{May}
+% \graduationyear{2020}
% \program{Computer Science}
% \advisor{Alan Turing}
% \degreetype{Science}
@@ -263,7 +263,7 @@
% I present a simple explanation of how to LaTeX your thesis.
% \end{thesis-abstract}
%
-% \addcontentsline{toc}{section}{Table of Contents}
+% \doublespacing
% \tableofcontents
%
% \startbody
diff --git a/Master/texmf-dist/source/latex/breqn/breqn.dtx b/Master/texmf-dist/source/latex/breqn/breqn.dtx
index 9f344f3d1ee..ce68c555b6b 100644
--- a/Master/texmf-dist/source/latex/breqn/breqn.dtx
+++ b/Master/texmf-dist/source/latex/breqn/breqn.dtx
@@ -5,6 +5,7 @@
% Copyright (C) 2007-2014 by Lars Madsen
% Copyright (C) 2007-2020 by Will Robertson
% Copyright (C) 2010-2017 by Joseph Wright
+% Copyright (C) 2020-2020 by Ulrike Fischer
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -150,8 +151,8 @@
%
%
% \title{The \pkg{breqn} package}
-% \def\fileversion{0.98i}
-% \def\filedate{2020/02/18}
+% \def\fileversion{0.98k}
+% \def\filedate{2020/09/24}
% \date{\pkg{breqn} bundle: \filedate\space\fileversion}
% \author{Authors: Michael J. Downes, Morten H\o gholm\\ Maintained by Morten H\o gholm, Will Robertson\\ Feedback: \texttt{https://github.com/wspr/breqn/issues}}
%
@@ -189,18 +190,29 @@
%
% \section{Package loading}
%
+% The \pkg{breqn} package automatically loads \pkg{amsmath} to avoid loading order conflicts.
+% It also automatically loads \pkg{flexisym} and \pkg{mathstyle}, but in some cases these
+% packages need to be loaded separately. The canonical order for package loading is:
+% \begin{verbatim}
+% \usepackage{amsmath}
+% \usepackage{flexisym}
+% \usepackage{breqn}
+% \end{verbatim}
%
% The recommended way of loading the \pkg{breqn} package is to load it
-% \emph{after} other packages dealing with math, \ie, after
-% \pkg{amsmath}, \pkg{amssymb}, or packages such as \pkg{mathpazo} or
-% \pkg{mathptmx}.
+% \emph{before} other packages dealing with math symbols, \ie, before
+% \pkg{amssymb}, or packages such as \pkg{mathpazo} or \pkg{mathptmx}.
+% However, this can sometimes lead to macro definition clashes, and in such cases
+% you may need to juggle the loading order to make it work.
+%
+% \subsection{Options for \pkg{flexisym}}
%
% The \pkg{flexisym} package (described in section \vref{flexisym}) is
% required by \pkg{breqn} and ensures the math symbols are set up
% correctly. By default \pkg{breqn} loads it with support for Computer
% Modern but if you use a different math package requiring slightly
-% different definitions, it must be loaded before \pkg{breqn}. Below
-% is an example of how you enable \pkg{breqn} to work with the widely
+% different definitions, \pkg{flexisym} must be explicitly loaded before \pkg{breqn} as shown above.
+% Below is an example of how you enable \pkg{breqn} to work with the widely
% used \pkg{mathpazo} package.
% \begin{verbatim}
%\usepackage{mathpazo}
@@ -214,11 +226,6 @@
% \fn{flexisym.dtx} for how to create a support file---it is easier
% than one might think. Contributions welcome.
%
-% The documentation for the package was formerly found in
-% \fn{breqndoc}. It has now been added to this implementation
-% file. Below follows the contents of the original \pkg{breqn}
-% documentation. Not all details hold anymore but I have prioritized
-% fixing the package.
%
% \section{Introduction}
%
@@ -556,8 +563,6 @@
% \begin{dmath}[spread={1pt}]
% \begin{dmath}[frame]
% \begin{dmath}[frame={1pt},framesep={2pt}]
-% \begin{dmath}[background={red}]
-% \begin{dmath}[color={purple}]
% \begin{dmath}[breakdepth={0}]
% \end{verbatim}
%
@@ -603,15 +608,6 @@
% Use the \opt{framesep} option to change the amount of space separating
% the frame from what it encloses. The default space is \cs{fboxsep}.
%
-% Use the \opt{background} option to produce a colored background for the
-% equation body. The \pkg{breqn} package doesn't automatically load the
-% \pkg{color} package, so this option won't work unless you remember
-% to load the \pkg{color} package yourself.
-%
-% Use the \opt{color} option to specify a different color for the contents
-% of the equation. Like the \opt{background} option, this doesn't work if
-% you forgot to load the \pkg{color} package.
-%
% Use the \opt{breakdepth} option to change the level of delimiter nesting
% to which line breaks are allowed. To prohibit line breaks within
% delimiters, set this to 0:
@@ -1381,7 +1377,7 @@
% Declare package name and date.
% \begin{macrocode}
\RequirePackage{expl3}
-\ProvidesExplPackage{breqn}{2020/02/18}{0.98i}{Breaking equations}
+\ProvidesExplPackage{breqn}{2020/09/24}{0.98k}{Breaking equations}
% \end{macrocode}
% Regrettably, \pkg{breqn} is internally a mess, so we have to take
% some odd steps.
@@ -6241,8 +6237,9 @@
\def\premath{%
% \end{macrocode}
% BRM: Tricky to cleanup space OR add space ONLY BETWEEN math!
+% FMi: improvement to measure against current font.
% \begin{macrocode}
- \ifdim\lastskip<.3em \unskip
+ \ifdim\lastskip<\fontdimen2\font \unskip
\else\ifnum\lastpenalty<\@M \dquad\fi\fi
}%
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/breqn/breqnbundle.ins b/Master/texmf-dist/source/latex/breqn/breqnbundle.ins
index 69b303c5e5e..de5c4857866 100644
--- a/Master/texmf-dist/source/latex/breqn/breqnbundle.ins
+++ b/Master/texmf-dist/source/latex/breqn/breqnbundle.ins
@@ -13,8 +13,9 @@ This is a generated file.
Copyright (C) 1997-2003 by Michael J. Downes
Copyright (C) 2007-2008 by Morten Hoegholm
Copyright (C) 2007-2014 by Lars Madsen
+Copyright (C) 2007-2020 by Will Robertson
Copyright (C) 2010-2017 by Joseph Wright
-Copyright (C) 2007-2019 by Will Robertson
+Copyright (C) 2020-2020 by Ulrike Fischer
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
diff --git a/Master/texmf-dist/source/latex/breqn/flexisym.dtx b/Master/texmf-dist/source/latex/breqn/flexisym.dtx
index cb9206c14e1..b827447fc60 100644
--- a/Master/texmf-dist/source/latex/breqn/flexisym.dtx
+++ b/Master/texmf-dist/source/latex/breqn/flexisym.dtx
@@ -3,8 +3,9 @@
% Copyright (C) 1997-2003 by Michael J. Downes
% Copyright (C) 2007-2008 by Morten Hoegholm
% Copyright (C) 2007-2014 by Lars Madsen
+% Copyright (C) 2007-2020 by Will Robertson
% Copyright (C) 2010-2017 by Joseph Wright
-% Copyright (C) 2007-2019 by Will Robertson
+% Copyright (C) 2020-2020 by Ulrike Fischer
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -78,8 +79,8 @@
% \fi
%
% \title{The \textsf{flexisym} package}
-% \def\fileversion{0.98i}
-% \def\filedate{2020/02/18}
+% \def\fileversion{0.98k}
+% \def\filedate{2020/09/24}
% \date{\filedate\space\fileversion}
% \author{Authors: Michael J. Downes, Morten H\o gholm\\ Maintained by Morten H\o gholm, Will Robertson\\ Feedback: \texttt{https://github.com/wspr/breqn/issues}}
%
@@ -97,7 +98,7 @@
% \begin{macrocode}
%<*package>
\RequirePackage{expl3}[2009/08/05]
-\ProvidesExplPackage{flexisym}{2020/02/18}{0.98i}{Make math characters macros}
+\ProvidesExplPackage{flexisym}{2020/09/24}{0.98k}{Make math characters macros}
\edef\do{%
\noexpand\AtEndOfPackage{%
@@ -628,9 +629,10 @@
%
% We have to remove the assignments from the \cs{AtBeginDocument} hook
% as they will cause an error there.
+% \changes{v0.98k}{2020/08/24}{Removed the patch as it will break with new LaTeX. Instead
+% the mathcodes are set later.}
% \begin{macrocode}
\@ifpackageloaded{amsmath}{%
- \begingroup
% \end{macrocode}
% Split the contents of \cs{@begindocumenthook} by reading what we
% search for as a delimited argument and ensure these two assignments
@@ -645,13 +647,6 @@
% needed. We need those additional files anyway for things like
% \cs{joinord}.
% \begin{macrocode}
- \long\def\next#1\mathchardef\std@minus\mathcode`\-\relax
- \mathchardef\std@equal\mathcode`\=\relax#2\flexi@stop{%
- \toks@{#1#2}%
- \xdef\@begindocumenthook{\the\toks@}%
- }%
- \expandafter\next\@begindocumenthook\flexi@stop
- \endgroup
}{}
% \end{macrocode}
%
@@ -660,26 +655,34 @@
% mathcode of \texttt{-} being less than 32768. We delay the
% definition \cs{AtBeginDocument} in case \pkg{amssymb} hasn't been
% loaded yet.
+% \changes{v0.98k}{2020/08/24}{Adapted to unicode engines (using definition in amsopn)}
% \begin{macrocode}
\AtBeginDocument{%
-\def\newmcodes@{%
- \mathcode `\'39\space
- \mathcode `\*42\space
- \mathcode `\."613A\space
- \ifnum\mathcode`\-=45\space
- \else
+\ifx\Umathcode\@undefined
+\gdef\newmcodes@{\mathcode`\'39\mathcode`\*42\mathcode`\."613A%
+ \ifnum\mathcode`\-=45 \else
% \end{macrocode}
% The extra check. Don't do anything if \texttt{-} is math active.
% \begin{macrocode}
\ifnum\mathcode`\-=32768\space
\else
- \mathchardef \std@minus \mathcode `\-\relax
+ \mathchardef\std@minus\mathcode`\-\relax
+ \fi
+ \fi
+ \mathcode`\-45\mathcode`\/47\mathcode`\:"603A\relax}
+\else
+\gdef\newmcodes@{\mathcode`\'39\mathcode`\*42\mathcode`\."613A%
+ \ifnum\Umathcodenum`\-=45 \else
+% \end{macrocode}
+% The extra check. Don't do anything if \texttt{-} is math active.
+% \begin{macrocode}
+ \ifnum\Umathcodenum`\-=16777216\space
+ \else
+ \Umathcharnumdef\std@minus\Umathcodenum`\-\relax
\fi
\fi
- \mathcode `\-45\space
- \mathcode `\/47\space
- \mathcode `\:"603A\space\relax
-}%
+ \mathcode`\-45\mathcode`\/47\mathcode`\:"603A\relax}
+\fi
}
% \end{macrocode}
%
@@ -776,7 +779,7 @@
\DeclareFlexSymbol{:} {Rel}{OT1}{3A}
\DeclareFlexSymbol{\colon}{Pun}{OT1}{3A}
\DeclareFlexSymbol{;} {Pun}{OT1}{3B}
-\DeclareFlexSymbol{=} {Rel}{OT1}{3D}
+\AtBeginDocument{\DeclareFlexSymbol{=} {Rel}{OT1}{3D}}
\DeclareFlexSymbol{?} {Pun}{OT1}{3F}
% \end{macrocode}
% \AmS\TeX, and therefore the \pkg{amsmath} package, make the
@@ -942,7 +945,7 @@
% Symbols from the 128-character \fn{cmsy} encoding.
% \begin{macrocode}
\DeclareFlexSymbol{*} {Bin}{bin}{03} % \ast
-\DeclareFlexSymbol{-} {Bin}{bin}{00}
+\AtBeginDocument{\DeclareFlexSymbol{-} {Bin}{bin}{00}}
\DeclareFlexSymbol{|} {Ord}{OMS}{6A}
\DeclareFlexSymbol{\aleph} {Ord}{ord}{40}
\DeclareFlexSymbol{\Re} {Ord}{ord}{3C}
diff --git a/Master/texmf-dist/source/latex/breqn/mathstyle.dtx b/Master/texmf-dist/source/latex/breqn/mathstyle.dtx
index 6df4e9426ac..479b95b91db 100644
--- a/Master/texmf-dist/source/latex/breqn/mathstyle.dtx
+++ b/Master/texmf-dist/source/latex/breqn/mathstyle.dtx
@@ -3,8 +3,9 @@
% Copyright (C) 1997-2003 by Michael J. Downes
% Copyright (C) 2007-2008 by Morten Hoegholm
% Copyright (C) 2007-2014 by Lars Madsen
+% Copyright (C) 2007-2020 by Will Robertson
% Copyright (C) 2010-2017 by Joseph Wright
-% Copyright (C) 2007-2019 by Will Robertson
+% Copyright (C) 2020-2020 by Ulrike Fischer
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -57,8 +58,8 @@
% \fi
%
% \title{The \textsf{mathstyle} package}
-% \def\fileversion{0.98i}
-% \def\filedate{2020/02/18}
+% \def\fileversion{0.98k}
+% \def\filedate{2020/09/24}
% \date{\filedate\quad\fileversion}
% \author{Authors: Michael J. Downes, Morten H\o gholm\\ Maintained by Morten H\o gholm, Will Robertson\\ Feedback: \texttt{https://github.com/wspr/breqn/issues}}
%
@@ -151,7 +152,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{expl3}
-\ProvidesExplPackage{mathstyle}{2020/02/18}{0.98i}{Tracking mathstyle implicitly}
+\ProvidesExplPackage{mathstyle}{2020/09/24}{0.98k}{Tracking mathstyle implicitly}
\ExplSyntaxOff
% \end{macrocode}
%
@@ -215,6 +216,7 @@
% \end{macro}
%
% \begin{macro}{\mathstyle}
+% \begin{macro}{\mathstyledenom}
% A counter for the math style: 0--display, 2--text, 4--script, 6--scriptscript.
% The logic is that display maths will explicitly
% set \verb|\mathstyle| to zero (see above), so by default it is set to the
@@ -224,12 +226,14 @@
% \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname directlua\endcsname\relax
- \chardef\mathstyle\@ne
+ \chardef\mathstyle=2\relax
+ \chardef\mathstyledenom=0\relax
\else
\directlua{tex.enableprimitives("", {"mathstyle"})}
\fi
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% Save the four style changing primitives, \cs{mathchoice} and the
% fraction commands.
@@ -247,18 +251,18 @@
\@saveprimitive\abovewithdelims\@@abovewithdelims
% \end{macrocode}
% Then we redeclare the four style changing primitives: set the value of
-% \cs{mathstyle} if Lua\TeX{} is not in use.q
+% \cs{mathstyle} if Lua\TeX{} is not in use.
% \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname directlua\endcsname\relax
\DeclareRobustCommand{\displaystyle}{%
- \@@displaystyle \chardef\mathstyle\z@}
+ \@@displaystyle \chardef\mathstyle0\relax}
\DeclareRobustCommand{\textstyle}{%
- \@@textstyle \chardef\mathstyle\tw@}
+ \@@textstyle \chardef\mathstyle2\relax}
\DeclareRobustCommand{\scriptstyle}{%
- \@@scriptstyle \chardef\mathstyle4 }
+ \@@scriptstyle \chardef\mathstyle4\relax}
\DeclareRobustCommand{\scriptscriptstyle}{%
- \@@scriptscriptstyle \chardef\mathstyle6 }
+ \@@scriptscriptstyle \chardef\mathstyle6\relax}
\fi
% \end{macrocode}
% First we get the primitive operations. These should have been
@@ -283,8 +287,10 @@
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname directlua\endcsname\relax
\def\subsupstyle{%
- \ifnum\mathstyle<5 \chardef\mathstyle4 %
- \else \chardef\mathstyle6 %
+ \ifnum\mathstyle<4\relax
+ \chardef\mathstyle\numexpr4+\mathstyledenom\relax
+ \else
+ \chardef\mathstyle\numexpr6+\mathstyledenom\relax
\fi
}
\else
@@ -338,17 +344,69 @@
% \end{macro}
%
% \begin{macro}{\genfrac}
+% The amsmath definition:
+% \begin{verbatim}
+% \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{verbatim}
+% with arguments:
+% \begin{itemize}
+% \item left-delim
+% \item right-delim
+% \item line thickness (default if empty)
+% \item mathstyle override
+% \item numerator
+% \item denominator
+% \end{itemize}
% The fractions. Note that this uses the same names as in
% \pkg{amsmath}. Much the same except here they call \cs{fracstyle}.
% \begin{macrocode}
\DeclareRobustCommand\genfrac[6]{%
- {#1\fracstyle
+ {%
+ % emulate old amsmath syntax:
+ \if 0#4\relax\displaystyle\else
+ \if 1#4\relax\textstyle\else
+ \if 2#4\relax\scriptstyle\else
+ \if 3#4\relax\scriptscriptstyle\else
+ #4%
+ \fi\fi\fi\fi
+ \fracstyle
{\begingroup #5\endgroup
- \csname @@\ifx\maxdimen#4\maxdimen over\else above\fi
- \if @#2@\else withdelims\fi\endcsname #2#3\relax
- #6}%
+ \csname @@\ifx\maxdimen#3\maxdimen over\else above\fi
+ \if @#1@\else withdelims\fi\endcsname #1 #2 #3\relax
+ \ifnum\mathstyledenom=0\relax
+ \chardef\mathstyledenom=1\relax
+ \edef\mathstyle@tempa{\number\mathstyle}%
+ \chardef\mathstyle=\numexpr\mathstyle@tempa+1\relax
+ \fi
+ #6%
+ \chardef\mathstyledenom=0\relax}%
}%
}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname directlua\endcsname\relax\else
+\DeclareRobustCommand\genfrac[6]{%
+ {%
+ % emulate old amsmath syntax:
+ \if 0#4\relax\displaystyle\else
+ \if 1#4\relax\textstyle\else
+ \if 2#4\relax\scriptstyle\else
+ \if 3#4\relax\scriptscriptstyle\else
+ #4%
+ \fi\fi\fi\fi
+ \fracstyle
+ {\begingroup #5\endgroup
+ \csname @@\ifx\maxdimen#3\maxdimen over\else above\fi
+ \if @#1@\else withdelims\fi\endcsname #1 #2 #3\relax
+ #6%
+ }%
+ }%
+}
+\fi
% \end{macrocode}
% \changes{v0.90}{2011/08/03}{\cs{fracstyle} must be called \emph{after}
% changing to the required style}
@@ -360,14 +418,14 @@
\renewcommand{\frac}{\genfrac{}{}{}{}}
\providecommand{\dfrac}{}
\providecommand{\tfrac}{}
-\renewcommand{\dfrac}{\genfrac\displaystyle{}{}{}}
-\renewcommand{\tfrac}{\genfrac\textstyle{}{}{}}
+\renewcommand{\dfrac}{\genfrac{}{}{}\displaystyle}
+\renewcommand{\tfrac}{\genfrac{}{}{}\displaystyle}
\providecommand{\binom}{}
\providecommand{\tbinom}{}
\providecommand{\dbinom}{}
-\renewcommand{\binom}{\genfrac{}(){0pt}}
-\renewcommand{\dbinom}{\genfrac\displaystyle(){0pt}}
-\renewcommand{\tbinom}{\genfrac\textstyle(){0pt}}
+\renewcommand{\binom}{\genfrac(){0pt}{}}
+\renewcommand{\dbinom}{\genfrac(){0pt}\displaystyle}
+\renewcommand{\tbinom}{\genfrac(){0pt}\textstyle}
% \end{macrocode}
% The \cs{fracstyle} command is a switch to go one level down but no
@@ -377,15 +435,11 @@
\expandafter\ifx\csname directlua\endcsname\relax
\def\fracstyle{%
\ifcase\numexpr\mathstyle\relax
- \chardef\mathstyle=\@ne
- \or
- \chardef\mathstyle=\@ne
- \or
- \chardef\mathstyle=\tw@
- \or
- \chardef\mathstyle=\tw@
- \else
- \chardef\mathstyle=\thr@@
+ \chardef\mathstyle=0\relax % 0
+ \or \chardef\mathstyle=1\relax % 1
+ \or \chardef\mathstyle=2\relax % 2
+ \or \chardef\mathstyle=3\relax % 3
+ \else \chardef\mathstyle=3\relax % 4 or more
\fi
}
\else
diff --git a/Master/texmf-dist/source/latex/bubblesort/bubblesort.dtx b/Master/texmf-dist/source/latex/bubblesort/bubblesort.dtx
new file mode 100644
index 00000000000..a96fe27fb6d
--- /dev/null
+++ b/Master/texmf-dist/source/latex/bubblesort/bubblesort.dtx
@@ -0,0 +1,448 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2019 by Laurence R Taylor
+% -----------------------------------
+%
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% 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.
+%
+% \fi
+%
+% \iffalse
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{bubblesort}
+\usepackage{graphicx}
+\usepackage{hyperref}
+\hypersetup{
+ colorlinks=true,
+ linkcolor=blue,
+ filecolor=magenta,
+ urlcolor=cyan,
+}
+\DisableCrossrefs
+\CodelineNumbered
+\RecordChanges
+\begin{document}
+\DocInput{bubblesort.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{293}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% \hfuzz=200pt
+% \changes{v1.0}{?2019?/?07?/?17?}{Initial version}
+% \title{bubblesort}
+% \author{Laurence R Taylor}
+% \date{2020/06/24}
+% \maketitle
+% \begin{abstract}
+% This package is a \LaTeX\ port of the sorting function \href{https://en.wikipedia.org/wiki/Bubble_sort}{bubble sort}.
+% Bubble sort is usually coded using arrays but it can be done without them and
+% since \LaTeX\ does not support arrays natively, bubble sort seemed like a good routine to port.
+% It's lack of speed is not really a problem with the data sizes likely to be encountered in most \LaTeX\ applications.
+%
+% The objects to be sorted are either a stack or a list.
+% A \emph{stack} is a sequence of legal \TeX\ code items enclosed in brace pairs, \vskip0pt%
+% \begin{center}|{|\emph{item 1}|}{|\emph{item 2}|}|\dots|{|\emph{item n}|}|\end{center}
+% while a \emph{list} is a macro which expands to a stack. Fragile commands in an \emph{item} may not work as expected.
+% To sort the items one needs a notion of when one \emph{item} is ``less than'' another.
+%
+% The macro |\bubblesort| does the bubble sort. It takes three arguments: |\bubblesort[#1]{#2}{#3}|.
+% The optional argument is a comparator macro telling when one item is smaller than another.
+% If empty it assumes the stack is a stack of integers or real numbers
+% and sorts it using the usual $<$. Argument |#2| is the stack or list to be sorted and
+% argument |#3| a macro which will contain the sorted list in increasing order.
+%
+% The only dependency is |etoolbox.sty|.
+% \end{abstract}
+% \section{Introduction}
+% \makeatletter
+% \newcounter{LineAA}
+% \def\Label#1{\hypertarget{@bubblesort@ref#1}\relax\setcounter{LineAA}{\value{CodelineNo}}\stepcounter{LineAA}
+% {\immediate\write\@auxout{\string\gdef\string\@bubblesort@ref#1{\number\value{LineAA}}}}}
+% \def\codeRef#1{\ifcsdef{@bubblesort@ref#1}{\hyperlink{@bubblesort@ref#1}{\csname @bubblesort@ref#1\endcsname}}{\textbf{??}}}
+% \def\LabelLine#1{\Label{#1}\nointerlineskip\begin{macrocode}}
+% \newbox\ff\setbox\ff=\hbox{\scalebox{0.75}{\hbox{\Large\tt doublebubblesort}}}
+% \newbox\fff\setbox\fff=\hbox{\scalebox{0.75}{\hbox{\Large\tt doublebubblesortB}}}
+% \newbox\mm\setbox\mm=\hbox{\rotatebox{114}{\vrule depth0.8pt height 0pt width 9pt}}
+% \makeatother
+% \newbox\ff\setbox\ff=\hbox{\scalebox{0.75}{\hbox{\Large\tt doublebubblesort}}}
+% \newbox\fff\setbox\fff=\hbox{\scalebox{0.75}{\hbox{\Large\tt doublebubblesortB}}}
+% \newbox\mm\setbox\mm=\hbox{\rotatebox{114}{\vrule depth0.8pt height 0pt width 9pt}}
+% There are two macros provided which implement the standard bubble sort algorithms
+% on stacks or lists. See section \ref{SandL} for a discussion of stacks or lists.
+% \subsection{\texorpdfstring{\copy\mm\tt bubblesort}{bubblesort}}
+% |\bubblesort[#1]{#2}{#3}|: Argument |#2| is the stack or list to be sorted. Argument |#3| contains the sorted list
+% after evaluation. Argument |#2| can be the same as argument |#3|. Argument |#3| can also be blank in which
+% case the output string is inserted into the input stream.
+% Optional argument |#1| is a comparator macro.
+% \subsubsection{Comparator macros}
+% A comparator macro can have any legal \TeX\ name. It must have two arguments.
+% When in use the comparator macro is evaluated on consecutive pairs of elements in the stack.
+% If argument |#2| is ``smaller'' than argument |#1| the macro sets |\bubblesortflag| to |1| and sets it
+% to |-1| otherwise.
+% Two examples are supplied: |\realSort| on line \codeRef{realSort}\ of the code below and
+% |\alphSort| on line \codeRef{alphSort}.
+%
+% \subsection{\texorpdfstring{\copy\mm\tt doublebubblesort}{bubblesort}}|\doublebubblesort[#1]{#2}{#3}{#4}{#5}|:
+%
+% The macro |\doublebubblesort| sorts two stack/lists. Arguments |#1|, |#2| and |#3| are identical to the corresponding
+% arguments for |\bubblesort|. Argument |#4| is another stack or list of the same length or longer than stack/list |#2|.
+% When expanded |\doublebubblesort| sorts |#2| just the same as |\bubblesort| would. However, every move made on
+% stack |#2| is also done on stack |#4|. Argument |#5| is the name for the output of the result of this ``sort'' on |#4|.
+% As usual |#5| can be blank or |#4| and |#5| can be the same macro. |#3| and |#5| can also be the same macro, in
+% which case it contains the result of the sort on argument |#4|, \emph{except} if both |#3| and |#5| are blank, |#3|
+% is put into the input stream followed by |#5|.
+%
+% An example to keep in mind is the following. One way to mimic a hash in \LaTeX\ is to have a list of keys and a second
+% list of values with the value associated to a key being determined by position in the values list. If the key list is sorted it
+% will be necessary to do the same interchanges on the values list to maintain the correspondence.
+% See subsection \ref{permute} for another example using |\doublebubblsort|.
+% \section{Stacks and lists}\label{SandL}
+% The lists here closely resemble Knuth's lists in the
+% \href{http://www.ctex.org/documents/shredder/src/texbook.pdf}{\TeX book}, page 378, Appendix D,
+% except they lack Knuth's initial |\\| prepended to each item. As discussed by Knuth, the |\\| can be used to process
+% each item in the list.
+% Sort algorithms require knowledge of pairs of items from the list
+% so macros which only know about one item are not needed.
+%
+%
+% Other implementations of lists use a reserved character as a separator.
+% Separators like commas or semicolons or whatever have the drawback that then the separator can not be used in the item text
+% without additional coding.
+%
+% \TeX's brace-pair mechanism is quite robust. It handles nested brace pairs just fine. One word of \textcolor{red}{warning}:
+% an empty brace pair |{}| is used as an end of list indicator. They are added to the stack/list arguments
+% when needed and are not present at the end of lists produced by macros in this package so they rarely trouble the user.
+% It does mean that
+% \textcolor{red}{there can be no empty (or even |{white space}|) brace pairs in the input list.}
+% Given how \TeX\ discards white space, |{white space}| is probably not what is wanted anyway. Using |{{white space}}| will probably
+% yield results closer to what was intended and this works.
+% \section{Examples}
+% Here are a few examples if things that can be done with sorts.
+% \subsection{\texorpdfstring{\copy\mm\tt refs}{refs}}
+% Given a stack of references defined from |\label| such as |{ref 1}{ref 2}|\dots|{ref n}| which expand to integers or real numbers
+% try to define
+% \begin{center}
+% \color{red}|\def\refs#1{\bubblesort[\refSort]{#1}{\answers}}|\hskip1in\null \\where |\refSort#1#2{\realSort{\ref{#1}}{\ref{#2}}}|. \color{black}
+% \end{center}
+% The above does not work because |\ref| is protected and does not expand to just the number.
+% Instead, the package |refcount.sty| supplies |\getrefnumber| which is expandable and does what is needed.
+% Add |\usepackage{refcount}| to the preamble and define
+% \begin{verbatim}
+% \def\refSort#1#2{%
+% \edef\aa{\getrefnumber{#1} pt}\edef\bb{\getrefnumber{#2} pt}%
+% \ifdimless{\bb}{\aa}{\bubblesortflag=1}{\bubblesortflag=-1}%
+% }
+% \end{verbatim}
+% Then|\def\refs#1{\bubblesort[\refSort]{#1}{\ans}}| sorts the numbers in increasing order and puts the answer in |\ans|.
+%
+% \subsection{Use {\texorpdfstring{\copy\mm\tt refs}{refs}}\ twice}
+% Since |\bubblesort| is a stable sorting algorithm, it can be usefully used more than once on the same data.
+% Suppose |\refSort| is defined as above and there is a list |\def\LL{{ref 1}{ref 2}|\dots|{ref n}}|.
+% Then |\bubblesort[\refSort]{\LL}{\LL}| sorts the numbers in increasing order.
+%
+% But some of them may be from definitions, others from theorems, or lemmas, etc.
+% Suppose |\refName#1| is a macro such that |\refName{ref k}| returns |Definition|, |Theorem|, |Lemma|, etc..
+% Then
+% \begin{center}
+% |\bubblesort[\refSort]{\LL}{\LL} \bubblesort[\alphSort]{\LL}{\LL}|
+% \end{center}
+% \noindent returns
+% |\def\LL{{ref k_1}{ref k_2}|\dots|{ref k_n}}|
+% where the first set of references are |Definition|'s, the second set of references are |Lemma|'s and
+% the third set of references are |Theorem|'s.
+% The set of numbers for the |Definition|'s are increasing,
+% the set of numbers for the |Lemma|'s are increasing and
+% the set of numbers for the |Theorem|'s are increasing.
+% With more complicated coding, the names can be added and the lists compactified to get something line
+% |Theorems 1-3 and 5, Lemma 9 and Definitions 6, 8 and 12|.
+%
+% \subsection{\texorpdfstring{\copy\mm\tt permute}{permute}}\label{permute}
+% Use |\doublebubblesort| to apply a permutation to a stack/list.
+% A \emph{permutation} is an ordered stack/list of symbols which also has a natural order.
+% Popular symbol sets are positive integers and lowercase letters. The comparator macro needs
+% to sort a list of symbols with no repetitions back to its natural order.
+% A permutation $\pi$ can be given by listing the values of $\pi$ when applied to the symbols
+% in their natural order. For example $\pi$|={{5}{1}{2}{3}{4}}| means $\pi$|(1)=5|, $\pi$|(2)=1|, $\pi$|(3)=2|, $\pi$|(4)=3|, $\pi$|(5)=4|.
+%
+% At the end of line 2 of the displayed code below, |\ott| contains the symbols in their natural order
+% so |\permute| does not need to be told the symbols in advance.
+% At the end of line 3, |\ott| contains the inverse to the original permutation.
+% At the end of line 4, |#4| contains the permuted version of |#3|.
+%
+% \null\hskip0.13\textwidth \vbox{\begin{verbatim}
+% \newcommand{\permute}[4][\realSort]{%
+% \bubblesort[#1]{#2}{\ott}%
+% \doublebubblesort[#1]{#2}{\ott}{\ott}{\ott}%
+% \doublebubblesort[#1]{\ott}{\ott}{#3}{#4}%
+% }
+% \end{verbatim}}
+% If |\def\LL{{${a_1}$}{${a_2}$}{${a_3}$}{${a_4}$}{${a_5}$}}| then\\
+% |\permute{{5}{1}{2}{3}{4}}{\LL}{}| yields
+%
+% {${\tt a}_5$}\, {${\tt a}_1$}\, {${\tt a}_2$}\, {${\tt a}_3$}\, {${\tt a}_4$}\ , which is
+% {${\tt a}_{\pi(1)}$}\, {${\tt a}_{\pi(2)}$}\, {${\tt a}_{\pi(3)}$}\, {${\tt a}_{\pi(4)}$}\, {${\tt a}_{\pi(5)}$}\ as desired.
+% \bigskip
+%
+% |\permute| can also be used to multiply permutations:
+% \begin{itemize}
+% \item |\permute{\pi_1}{\pi_2}{\ans}| yields |\pi_2|$\circ$|\pi_1|
+% \item |\permute{\pi_2}{\pi_1}{\ans}| yields |\pi_1|$\circ$|\pi_2|.
+% \end{itemize}
+%
+% \section{Implementation}\label{implementation}
+% Line numbers refer to the line numbers printed next to the code beginning with |\NeedsTeXFormat| \hyperlink{NeedsTeXFormat}{here}.
+% There are only four public macros, |\bubblesort| on line \codeRef{bubblesort}
+% and |\doublebubblesort| on line \codeRef{doublebubblesort} and comparator macros |\realSort| on line \codeRef{realSort}\ and
+% |\alphSort| on line \codeRef{alphSort}.
+% Private macros begin with |\@bubblesort@| to minimize the chance of name conflicts with other packages.
+% This makes reading the code somewhat tedious so
+% in the descriptions of the code below, the initial |\@bubblesort@| will be replaced by |*|.
+%
+% \subsection{\texorpdfstring{\copy\mm\tt bubblesort}{bubblesort}}
+% |\bubblesort[#1]{#2}{#3}|:
+% The implementation of |\bubblesort| begins by defining an empty |*rightList| and putting the stack/list to be sorted, |#2|, into |*workingList|.
+% Note |#2| is now safe - unless |#2| equals |#3|, |#2| will never change.
+% Then |\bubblesort| removes the leftmost item in |*workingList|
+% and saves it in |*testItem|. Then it moves on to |\@bubblesort@S| which does the recursion.
+%
+% First, |\bubblesort@S| (line \codeRef{bubblesortS}) sets an |etoolbox| boolean, |did a flip|, to false and sets |*leftList| to empty.
+% Then the macro removes the leftmost element in |*workingList| and saves it in |*nextItem|.
+% Then it enters the |while| loop (line \codeRef{while}).
+% The exit condition is that |*nextItem| is empty.
+% Then the comparator macro is evaluated on the ordered pair $\bigl($|*testItem| , |*nextItem|$\bigr)$.
+% The smaller of the pair is append to |*leftList| on the right and the larger is set to |*testItem|.
+% The loop continues until |*workingList| is empty. At this point |*testItem| contains the largest element in the
+% original |*workingList| and it is added to |*rightList| at the left end.
+% Hence |*leftList| followed by |*rightList| is the original list.
+% Next |*leftList| is put into |*workingList| and then the leftmost element is removed and put into |*testItem|.
+% Finally the |while| loop is reentered.
+%
+% After $k$ iterations of the |while| loop, |*rightList| has $k$ elements which are the $k$ largest elements in the original list in increasing order.
+% When the boolean |did a flip| is false, |*leftList| is also ordered so |*leftList| followed by |*rightList| is the original list sorted
+% and the |while| loop exits.
+% The sorted list and macro |#3| from |\bubblesort| are passed on to |\@bubblesort@output| which outputs the list as requested
+% and |\bubblesort| is finished.
+%
+% \noindent\textbf{Remark:} The reader who has worked through the discussion above will have noticed that this implementation of bubble sort
+% uses about four times the storage as the |C| version which sorts the array in place.
+% Stacks used in \LaTeX, are probably small enough that this is not a problem.
+%
+% Sorting a thousand item list of integers in reverse order (which is the worse case scenario) took less than sixty-five seconds running
+% |TexShop| |4.44| on a Mac 2013 Powerbook using timing code from
+% \href{https://tex.stackexchange.com/questions/456316/what-is-the-latex-equivalent-of-context-testfeatureonce-to-benchmark-performanc/456322#456322}{tex.stackexchange}. It put no strain on \TeX's memory allocations.
+%
+% \bigskip
+% \subsection{\texorpdfstring{\copy\mm\tt doublebubblesort}{doublebubblesort}}
+% |\doublebubblesort[#1]{#2}{#3}{#4}{#5}|:
+% The |\doublebubblesort| (line \codeRef{doublebubblesort}), |\@doublebubblesort@S| (line \codeRef{doublebubblesortS}),
+% macros work much like |\bubblesort|, |\@bubblesort@S|.
+% The code in the |double|'d version contains the identical code from |\bubblesort|, |\@bubblesort@S| except that |A| is added
+% to the end of each of the internal macros. There is also a parallel copy of macros with |B| added and everything done with the
+% |A| variables is mimicked with the |B| variables.
+%
+% \bigskip
+% \subsection{The remaining macros}
+% The macro |\@bubblesort@output#1#2| (line \codeRef{output}) is just to shorten the code
+% since there are three places a stack or a list is output (lines \codeRef{outputA}, \codeRef{outputB} and \codeRef{outputC}).
+%
+% The macro |\@bubblesort@EoS| is the End-of-Stack indicator.
+%
+% The remaining macros do the removing items from a list and inserting items at either end of a list.
+% The shift macro is \\
+% \null\hskip1in|\@bubblesort@shift#1#2\@bubblesort@EoS#3#4| (line \codeRef{shiftM})\\
+% which is used as \\|\expandafter\@bubblesort@shift{stack/list}\@bubblesort@EoS{\itemA}{\itemB}| which
+% puts the leftmost item in the stack/list into |\itemA| and the rest of the stack/list into |\itemB|.
+%
+% The macros |\@bubblesort@rightappendItem| (line \codeRef{rAi}) \\and
+% |\@bubblesort@lefttappendItem| (line \codeRef{lAi}) are identical to Knuth's
+% |\rightappenditem| and |\leftappenditem| except that there are no prepended |\\|'s.
+%
+% \StopEventually{}
+% \color{white}
+% \setcounter{CodelineNo}{15}
+% \begin{macro}{blank}\color{black}\textbf{Start of code:}
+% \hypertarget{NeedsTeXFormat}{}
+% The rest of the file from the end of this paragraph onward is a copy of the file
+% generated by \TeX ing the |bubblesort.ins| file except that the standard set of comments
+% at the start of an |ins| generated file are omitted. And of course the line numbers on the left here are
+% not present in the |\bubblesort.sty| file.
+% The comments portion takes 15 lines.
+% Most editors show line numbers and allow line number navigation so it has been arranged that
+% the line numbers in the typeset |bubblesort.dtx| file below match the line numbers
+% in the |ins|-generated |bubblesort.sty| file.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+\ProvidesPackage{bubblesort}
+ [2020/07/01 v1.0 implements a bubble sort]
+
+\RequirePackage{etoolbox}
+
+\makeatletter
+
+\newcount\bubblesortflag
+\newbool{did a flip}
+\def\@bubblesort@EoS{}% End-of-Stack indicator
+
+% \end{macrocode} \LabelLine{realSort}
+\def\realSort#1#2{%
+\ifdimless{#2 pt}{#1 pt}{\bubblesortflag=1}{\bubblesortflag=-1}}
+% \end{macrocode} \LabelLine{alphSort}
+\def\alphSort#1#2{\ifnumequal{\pdfstrcmp{#1}{#2}}{1}%
+{\bubblesortflag=1}{\bubblesortflag=-1}}
+% \end{macrocode} \LabelLine{bubblesort}
+\newcommand{\bubblesort}[3][\realSort]{%
+%% #1 comparator macro, #2 input stack/list, #3 answer list: #2=#3 OK
+\def\@bubblesort@rightList{}%
+\expandafter\@bubblesort@shiftOne#2{}{}{}\@bubblesort@EoS{%
+\@bubblesort@testItem}{\@bubblesort@workingList}%
+\expandafter\@bubblesort@S{#3}{#1}%
+}
+% \end{macrocode} \LabelLine{bubblesortS}
+\def\@bubblesort@S#1#2{% #1 is name for answer --- #2 is comparator macro
+\boolfalse{did a flip}\def\@bubblesort@leftList{}%
+\expandafter\@bubblesort@shiftOne\@bubblesort@workingList{}{}\@bubblesort@EoS{%
+\@bubblesort@nextItem}{\@bubblesort@workingList}%
+% \end{macrocode} \Label{while}\nointerlineskip\begin{macrocode}
+\whileboolexpr{not test{\ifdefvoid{\@bubblesort@nextItem}}}{%
+#2{\@bubblesort@testItem}{\@bubblesort@nextItem}\relax%
+\ifnumequal{\bubblesortflag}{1}{% flip
+\booltrue{did a flip}%
+\expandafter\@bubblesort@rightappendItem\expandafter{\@bubblesort@nextItem}%
+\to\@bubblesort@leftList%
+}{%
+\expandafter\@bubblesort@rightappendItem\expandafter{\@bubblesort@testItem}%
+\to\@bubblesort@leftList%
+\expandafter\def\expandafter\@bubblesort@testItem\expandafter{\@bubblesort@nextItem}%
+}%
+\expandafter\@bubblesort@shiftOne\@bubblesort@workingList\@bubblesort@EoS{%
+\@bubblesort@nextItem}{\@bubblesort@workingList}%
+}%
+\expandafter\leftappendItem\expandafter{\@bubblesort@testItem}\to\@bubblesort@rightList%
+\ifbool{did a flip}{%
+\expandafter\def\expandafter\@bubblesort@workingList\expandafter%
+{\@bubblesort@leftList{}{}{}}%
+\expandafter\@bubblesort@shiftOne\@bubblesort@workingList\@bubblesort@EoS{%
+\@bubblesort@testItem}{\@bubblesort@workingList}%
+\def\@bubblesort@leftList{}%
+\@bubblesort@S{#1}{#2}}%
+% \end{macrocode} \Label{outputA}\nointerlineskip\begin{macrocode}
+{\@bubblesort@output{#1}{\@bubblesort@leftList\@bubblesort@rightList}%
+}}
+% \end{macrocode} \Label{output}\nointerlineskip\begin{macrocode}
+\def\@bubblesort@output#1#2{% #1 name of output list or empty --- #2 sorted stack
+\ifstrempty{#1}%
+{#2}{\expandafter\edef\expandafter#1\expandafter{#2}}%
+}
+% \end{macrocode} \Label{doublebubblesort}\nointerlineskip\begin{macrocode}
+\newcommand{\doublebubblesort}[5][\realSort]{%
+%% #1 comparator macro
+%% #2 input stack/list --- #3 output for #2 stack/list; #2=#3 OK
+%% #4 second stack/list --- #5 answer list for #4; #4=#5 OK
+\def\@bubblesort@rightListA{}\def\@bubblesort@rightListB{}%
+\expandafter\@bubblesort@shiftOne#2{}{}{}\@bubblesort@EoS{%
+\@bubblesort@testItemA}{\@bubblesort@workingListA}%
+\expandafter\@bubblesort@shiftOne#4{}{}{}\@bubblesort@EoS{%
+\@bubblesort@testItemB}{\@bubblesort@workingListB}%
+\expandafter\@doublebubblesort@S{#3}{#5}{#1}%
+}
+% \end{macrocode} \Label{doublebubblesortS}\nointerlineskip\begin{macrocode}
+\def\@doublebubblesort@S#1#2#3{%
+%% #1 output for sorted stack/list --- #2 output for ``sorted'' stack/list
+%% #3 comparator macro
+\boolfalse{did a flip}\def\@bubblesort@leftListA{}\def\@bubblesort@leftListB{}%
+\expandafter\@bubblesort@shiftOne\@bubblesort@workingListA{}{}%
+\@bubblesort@EoS{\@bubblesort@nextItemA}{\@bubblesort@workingListA}%
+\expandafter\@bubblesort@shiftOne\@bubblesort@workingListB{}{}%
+\@bubblesort@EoS{\@bubblesort@nextItemB}{\@bubblesort@workingListB}%
+\whileboolexpr{not test{\ifdefvoid{\@bubblesort@nextItemA}}}{%
+#3{\@bubblesort@testItemA}{\@bubblesort@nextItemA}\relax%
+\ifnumequal{\bubblesortflag}{1}{% flip
+\booltrue{did a flip}%
+\expandafter\@bubblesort@rightappendItem\expandafter{%
+\@bubblesort@nextItemA}\to\@bubblesort@leftListA%
+\expandafter\@bubblesort@rightappendItem\expandafter{%
+\@bubblesort@nextItemB}\to\@bubblesort@leftListB%
+}{%
+\expandafter\@bubblesort@rightappendItem\expandafter{%
+\@bubblesort@testItemA}\to\@bubblesort@leftListA%
+\expandafter\@bubblesort@rightappendItem\expandafter{%
+\@bubblesort@testItemB}\to\@bubblesort@leftListB%
+\expandafter\def\expandafter\@bubblesort@testItemA\expandafter{%
+\@bubblesort@nextItemA}%
+\expandafter\def\expandafter\@bubblesort@testItemB\expandafter{%
+\@bubblesort@nextItemB}%
+}%
+\expandafter\@bubblesort@shiftOne\@bubblesort@workingListA\@bubblesort@EoS{%
+\@bubblesort@nextItemA}{\@bubblesort@workingListA}%
+\expandafter\@bubblesort@shiftOne\@bubblesort@workingListB\@bubblesort@EoS{%
+\@bubblesort@nextItemB}{\@bubblesort@workingListB}%
+}%
+\expandafter\leftappendItem\expandafter{\@bubblesort@testItemA}\to%
+\@bubblesort@rightListA%
+\expandafter\leftappendItem\expandafter{\@bubblesort@testItemB}\to%
+\@bubblesort@rightListB%
+\ifbool{did a flip}{%
+\expandafter\def\expandafter\@bubblesort@workingListA\expandafter{%
+\@bubblesort@leftListA{}{}{}}%
+\expandafter\def\expandafter\@bubblesort@workingListB\expandafter{%
+\@bubblesort@leftListB{}{}{}}%
+\expandafter\@bubblesort@shiftOne\@bubblesort@workingListA\@bubblesort@EoS{%
+\@bubblesort@testItemA}{\@bubblesort@workingListA}%
+\expandafter\@bubblesort@shiftOne\@bubblesort@workingListB\@bubblesort@EoS{%
+\@bubblesort@testItemB}{\@bubblesort@workingListB}%
+\def\@bubblesort@leftListA{}%
+\def\@bubblesort@leftListB{}%
+\expandafter\@doublebubblesort@S{#1}{#2}{#3}}%
+% \end{macrocode} \Label{outputB}\nointerlineskip\begin{macrocode}
+{\@bubblesort@output{#1}{\@bubblesort@leftListA\@bubblesort@rightListA}%
+% \end{macrocode} \Label{outputC}\nointerlineskip\begin{macrocode}
+\@bubblesort@output{#2}{\@bubblesort@leftListB\@bubblesort@rightListB}}%
+}
+
+% \end{macrocode} \Label{shiftM}\nointerlineskip\begin{macrocode}
+\def\@bubblesort@shiftOne#1#2\@bubblesort@EoS#3#4{%
+\expandafter\gdef\expandafter#3\expandafter{#1}%
+\expandafter\gdef\expandafter#4\expandafter{#2}%
+}
+
+\newtoks\ta\newtoks\tb
+% \end{macrocode} \Label{rAi}\nointerlineskip\begin{macrocode}
+\long\def\@bubblesort@rightappendItem#1\to#2{\ta={{#1}}\tb=\expandafter{#2}%
+\edef#2{\the\tb\the\ta}}
+% \end{macrocode} \Label{lAi}\nointerlineskip\begin{macrocode}
+\long\def\leftappendItem#1\to#2{\ta={{#1}}\tb=\expandafter{#2}%
+\edef#2{\the\ta\the\tb}}
+\makeatother
+\endinput
+% \end{macrocode}
+% \end{macro}
+% \Finale
diff --git a/Master/texmf-dist/source/latex/bubblesort/bubblesort.ins b/Master/texmf-dist/source/latex/bubblesort/bubblesort.ins
new file mode 100644
index 00000000000..6f3f61ef1be
--- /dev/null
+++ b/Master/texmf-dist/source/latex/bubblesort/bubblesort.ins
@@ -0,0 +1,39 @@
+%% http://texdoc.net/texmf-dist/doc/latex/dtxtut/dtxtut.pdf
+%% Copyright (C) 2019 by Laurence R Taylor
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. 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.
+%%
+\input docstrip.tex
+\keepsilent
+\usedir{}
+\preamble
+This is a generated file. Copyright (C) 2020 by Laurence R Taylor
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3c of this license or (at your option) any later
+version. 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.
+\endpreamble
+\askforoverwritefalse
+\generate{\file{bubblesort.sty}{\from{bubblesort.dtx}{package}}}
+\Msg{*********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space bubblesort.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file bubblesort.dtx} \Msg{* through LaTeX.}
+\Msg{*}
+\Msg{*********************************************************}
+\endbatchfile \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/bxjscls/bxjscls.dtx b/Master/texmf-dist/source/latex/bxjscls/bxjscls.dtx
index 2f61b3218a9..58878b80729 100644
--- a/Master/texmf-dist/source/latex/bxjscls/bxjscls.dtx
+++ b/Master/texmf-dist/source/latex/bxjscls/bxjscls.dtx
@@ -25,7 +25,7 @@
%
%---------------------------------------
%
-% Copyright 1993-2019
+% Copyright 1993-2020
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -33,7 +33,7 @@
% Copyright 1999-2016 Haruhiko Okumura
% Copyright 2016-2020 Japanese TeX Development Community
%
-% Copyright 2013-2020 Takayuki YATO (aka. "ZR")
+% Copyright 2013-2021 Takayuki YATO (aka. "ZR")
%
% \fi
% \CheckSum{0}
@@ -41,7 +41,7 @@
% \iffalse
%
% \begin{macrocode}
-%<article|report|book|slide>\NeedsTeXFormat{LaTeX2e}
+%<class|anc>\NeedsTeXFormat{LaTeX2e}
%<article>\ProvidesClass{bxjsarticle}
%<report>\ProvidesClass{bxjsreport}
%<book>\ProvidesClass{bxjsbook}
@@ -56,7 +56,18 @@
%<*driver>
\ProvidesFile{bxjscls.dtx}
%</driver>
- [2020/03/25 v2.0 BXJS document classes]
+ [2021/02/02 v2.5 BXJS document classes]
+% [2021/01/27 v2.4a BXJS document classes]
+% [2020/10/16 v2.4 BXJS document classes]
+% [2020/10/10 v2.3 BXJS document classes]
+% based on jsclasses [2020/10/05]
+% [2020/10/04 v2.2c BXJS document classes]
+% [2020/09/29 v2.2b BXJS document classes]
+% [2020/09/22 v2.2a BXJS document classes]
+% [2020/09/04 v2.2 BXJS document classes]
+% [2020/05/28 v2.1 BXJS document classes]
+% [2020/04/04 v2.0a BXJS document classes]
+% [2020/03/25 v2.0 BXJS document classes]
% [2020/02/15 v1.9k BXJS document classes]
% [2020/02/05 v1.9j BXJS document classes]
% based on jsclasses [2020/02/02]
@@ -267,9 +278,19 @@
% \StopEventually{}
%
% 以下では実際のコードに即して説明します。
+%
+% \texttt{minijs}は,\texttt{jsclasses}に似た設定を行うパッケージです。
+%
% \begin{macrocode}
-%<*cls>
-%% このファイルは日本語文字を含みます.
+%<*minijs>
+%% if jsclasses loaded, abort loading this package
+\ifx\@jsc@uplatextrue\@undefined\else
+ \PackageInfo{minijs}{jsclasses does not need minijs, exiting}
+ \expandafter\endinput
+\fi
+%% "fake" jsarticle
+\expandafter\def\csname ver@jsarticle.cls\endcsname{}
+%</minijs>
% \end{macrocode}
%
% \begin{macro}{\bxjs@clsname}
@@ -277,6 +298,8 @@
% 文書クラスの名前です。エラーメッセージ表示などで使われます。
%
% \begin{macrocode}
+%<*class>
+%% このファイルは日本語文字を含みます.
%<article>\def\bxjs@clsname{bxjsarticle}
%<book>\def\bxjs@clsname{bxjsbook}
%<report>\def\bxjs@clsname{bxjsreport}
@@ -475,6 +498,16 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\ifbxjs@old@hook@system}
+% 〔スイッチ〕
+% {\LaTeX}の新しいフック管理システムが未導入であるか。
+% \Note カーネルの2020/10/01版で導入された。
+% \begin{macrocode}
+\newif\ifbxjs@old@hook@system
+\@ifl@t@r\fmtversion{2020/10/01}{}{\bxjs@old@hook@systemtrue}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\bxjs@cond}
% |\bxjs@cond\ifXXX|……|\fi{|\Meta{真}|}{|\Meta{偽}|}|\par
% {\TeX}のif-文(|\ifXXX|……\Meta{真}|\else|\Meta{偽}|\fi|)を
@@ -776,27 +809,56 @@
% \begin{macrocode}
\@onlypreamble\bxjs@setpaper
\def\bxjs@setpaper#1{\def\bxjs@param@paper{#1}}
+\newif\ifbxjs@iso@bsize
+\DeclareOption{iso-bsize}{\bxjs@iso@bsizetrue}
+\@onlypreamble\bxjs@setpaper@bsize
+\def\bxjs@setpaper@bsize#1{\edef\bxjs@param@paper{%
+ b#1\ifbxjs@iso@bsize paper\else j\fi}}
\DeclareOption{a3paper}{\bxjs@setpaper{a3paper}}
\DeclareOption{a4paper}{\bxjs@setpaper{a4paper}}
\DeclareOption{a5paper}{\bxjs@setpaper{a5paper}}
\DeclareOption{a6paper}{\bxjs@setpaper{a6paper}}
-\DeclareOption{b4paper}{\bxjs@setpaper{{257truemm}{364truemm}}}
-\DeclareOption{b5paper}{\bxjs@setpaper{{182truemm}{257truemm}}}
-\DeclareOption{b6paper}{\bxjs@setpaper{{128truemm}{182truemm}}}
+\DeclareOption{b4paper}{\bxjs@setpaper@bsize{4}}
+\DeclareOption{b5paper}{\bxjs@setpaper@bsize{5}}
+\DeclareOption{b6paper}{\bxjs@setpaper@bsize{6}}
\DeclareOption{a4j}{\bxjs@setpaper{a4paper}}
\DeclareOption{a5j}{\bxjs@setpaper{a5paper}}
-\DeclareOption{b4j}{\bxjs@setpaper{{257truemm}{364truemm}}}
-\DeclareOption{b5j}{\bxjs@setpaper{{182truemm}{257truemm}}}
+\DeclareOption{b4j}{\bxjs@setpaper{b4j}}
+\DeclareOption{b5j}{\bxjs@setpaper{b5j}}
\DeclareOption{a4var}{\bxjs@setpaper{{210truemm}{283truemm}}}
\DeclareOption{b5var}{\bxjs@setpaper{{182truemm}{230truemm}}}
+\DeclareOption{letterpaper}{\bxjs@setpaper{letterpaper}}
+\DeclareOption{legalpaper}{\bxjs@setpaper{legalpaper}}
+\DeclareOption{executivepaper}{\bxjs@setpaper{executivepaper}}
% \end{macrocode}
-% \Note |...var| をPandocで使えるように後ろに |paper| をつけた形を用意する。
+% |geometry| の用紙サイズのオプション名を全てサポートする。
+% \begin{macrocode}
+\@for\bxjs@tmpa:={%
+ a0,a1,a2,c0,c1,c2,c3,c4,c5,c6,ansia,ansib,ansic,ansid,ansie%
+}\do{\edef\bxjs@next{%
+ \noexpand\DeclareOption{\bxjs@tmpa paper}%
+ {\noexpand\bxjs@setpaper{\bxjs@tmpa paper}}%
+}\bxjs@next}
+\DeclareOption{screen}{\bxjs@setpaper{screen}}
+% \end{macrocode}
+% ただし |b?paper| は |iso-bsize| の指定に従いISOとJISの
+% 適切な方のB列を選択する。
+% \begin{macrocode}
+\@for\bxjs@tmpa:={0,1,2,3}\do{\edef\bxjs@next{%
+ \noexpand\DeclareOption{b\bxjs@tmpa paper}%
+ {\noexpand\bxjs@setpaper@bsize{\bxjs@tmpa}}%
+}\bxjs@next}
+% \end{macrocode}
+% Pandocでは用紙サイズ指定について「後ろに |paper| を付けた名前
+% のオプション」を指定する。
+% これに対処するため、後ろに |paper| をつけた形を用意する。
+% さらに、「用紙サイズを |custom| とすると何も設定しない」ように
+% するため |custompaper| というオプションを用意する。
% \begin{macrocode}
\DeclareOption{a4varpaper}{\bxjs@setpaper{{210truemm}{283truemm}}}
\DeclareOption{b5varpaper}{\bxjs@setpaper{{182truemm}{230truemm}}}
-\DeclareOption{letterpaper}{\bxjs@setpaper{letterpaper}}
-\DeclareOption{legalpaper}{\bxjs@setpaper{legalpaper}}
-\DeclareOption{executivepaper}{\bxjs@setpaper{executivepaper}}
+\DeclareOption{screenpaper}{\bxjs@setpaper{screen}}
+\DeclareOption{custompaper}{}
% \end{macrocode}
% \end{ZRnote}
%
@@ -918,9 +980,9 @@
%
% JSクラス互換のmagstyle設定オプション。
% \begin{macrocode}
-\DeclareOption{usemag}{\let\bxjs@magstyle\bxjs@magstyle@usemag}
-\DeclareOption{nomag}{\let\bxjs@magstyle\bxjs@magstyle@nomag}
-\DeclareOption{nomag*}{\let\bxjs@magstyle\bxjs@magstyle@xreal}
+\DeclareOption{usemag}{\let\bxjs@magstyle\bxjs@magstyle@@usemag}
+\DeclareOption{nomag}{\let\bxjs@magstyle\bxjs@magstyle@@nomag}
+\DeclareOption{nomag*}{\let\bxjs@magstyle\bxjs@magstyle@@xreal}
% \end{macrocode}
%
% \end{ZRnote}
@@ -1297,6 +1359,9 @@
% 最適化した設定を与える。
% \begin{macrocode}
\DeclareOption{pandoc}{%
+ \bxjs@apply@pandoc@opt}
+\@onlypreamble\bxjs@apply@pandoc@opt
+\def\bxjs@apply@pandoc@opt{%
% \end{macrocode}
% 和文ドライバを |pandoc| に、エンジン指定を |autodetect-engine| に
% 変更する。
@@ -1310,12 +1375,22 @@
% ドライバオプションを |dvi=dvipdfmx| 相当に変更する。
% \Note これは実際のドライバ設定で上書きできる
% (オプション宣言順に注意)。
-% \TODO できない気がする…。
% \begin{macrocode}
- \def\bxjs@driver@opt{dvipdfmx}%
- \bxjs@dvi@opttrue}
+ \ifx\bxjs@driver@opt\@undefined
+ \def\bxjs@driver@opt{dvipdfmx}%
+ \bxjs@dvi@opttrue
+ \fi
+ \global\let\bxjs@apply@pandoc@opt\relax}
% \end{macrocode}
%
+% |pandoc+| オプションは、|pandoc| と同じ設定をした上で、
+% さらに和文パラメタの先頭に |_plus| を追加する。
+% \begin{macrocode}
+\DeclareOption{pandoc+}{%
+ \g@addto@macro\bxjs@post@option@hook{%
+ \edef\jsJaParam{\bxjs@catopt{_plus}\jsJaParam}}%
+ \ExecuteOptions{pandoc}}
+% \end{macrocode}
% \end{ZRnote}
%
% \paragraph{エンジン・ドライバオプション \ZRX}
@@ -1418,13 +1493,9 @@
\let\bxjs@driver@given\bxjs@driver@@xetex}
% \end{macrocode}
%
-% 「もしDVIモードであればドライバを |dvipdfmx| にする」
-% というオプション。
-% \Note 1.2版で |dvi| オプションが新設されたが、互換性のため
-% このオプションも残す。
+% |dvipdfmx-if-dvi| は2.0版より非推奨となった。
% \begin{macrocode}
-\DeclareOption{dvipdfmx-if-dvi}{%
- \setkeys{bxjs}{dvi=dvipdfmx}}
+\DeclareOption{dvipdfmx-if-dvi}{\bxjs@depre@opt@do{dvipdfmx-if-dvi}{dvi=dvipdfmx}}
% \end{macrocode}
%
% \end{ZRnote}
@@ -1433,6 +1504,26 @@
% \mbox{}
% \begin{ZRnote}
% \TODO 互換用オプションを分離する(2.0版で?)。
+%
+% \begin{macro}{\bxjs@depre@opt}
+% \begin{macro}{\bxjs@depre@opt@do}
+% 非推奨のオプションについて警告を出す。
+% \begin{macrocode}
+\@onlypreamble\bxjs@depre@opt
+\def\bxjs@depre@opt#1#2{%
+ \ClassWarningNoLine\bxjs@clsname
+ {The old option '#1' is DEPRECATED\MessageBreak
+ and may be abolished in future!\MessageBreak
+ You should instead write:\MessageBreak
+ \space\space #2}}
+\@onlypreamble\bxjs@depre@opt@do
+\def\bxjs@depre@opt@do#1#2{%
+ \bxjs@depre@opt{#1}{#2}%
+ \setkeys{bxjs}{#2}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\ifbxjs@bigcode}
% {\upTeX}で有効化するToUnicode CMapとして
% 「|UTF8-UCS2|」の代わりに「|UTF8-UTF16|」を使うか。
@@ -1473,6 +1564,24 @@
%
% \end{ZRnote}
%
+% \paragraph{JSクラスのオプションで無効なもの \ZRX}
+% |ltjsclasses| に倣って警告を出す。
+%
+% \begin{macrocode}
+\DeclareOption{winjis}{%
+ \ClassWarningNoLine\bxjs@clsname
+ {This class does not support `winjis' option}%
+}
+\DeclareOption{mingoth}{%
+ \ClassWarningNoLine\bxjs@clsname
+ {This class does not support `mingoth' option}%
+}
+\DeclareOption{jis}{%
+ \ClassWarningNoLine\bxjs@clsname
+ {This class does not support `jis' option}%
+}
+% \end{macrocode}
+%
% \paragraph{keyval型のオプション \ZRX}
% \mbox{}
% \begin{ZRnote}
@@ -1495,13 +1604,15 @@
% \end{macro}
%
% \begin{macro}{\bxjs@declare@enum@option}
-% |\bxjs@declare@enum@option{|\Meta{オプション名}|}{|\Meta{enum名}|}|\par
+% |\bxjs@declare@enum@option{|\Meta{オプション名}|}{|^^A
+% \Meta{enum名}|}{|\Meta{初期値}|}|\par
% “\Meta{オプション名}|=|\Meta{値}”のオプション指定に対して、
% |\|[|bxjs@|\Meta{enum名}] を |\|[|bxjs@|\Meta{enum名}|@@|\Meta{値}] に
% 等値する(後者の制御綴が未定義の場合はエラー)、という動作を規定する。
% \begin{macrocode}
\@onlypreamble\bxjs@declare@enum@option
-\def\bxjs@declare@enum@option#1#2{%
+\def\bxjs@declare@enum@option#1#2#3{%
+ \bxjs@csletcs{bxjs@#2}{bxjs@#2@@#3}%
\define@key{bxjs}{#1}{%
\expandafter\ifx\csname bxjs@#2@@##1\endcsname\relax
\bxjs@error@keyval{#1}{##1}%
@@ -1511,12 +1622,15 @@
% \end{macro}
%
% \begin{macro}{\bxjs@declare@bool@option}
-% |\bxjs@declare@bool@option{|\Meta{オプション名}|}{|\Meta{スイッチ名}|}|\par
+% |\bxjs@declare@bool@option{|\Meta{オプション名}|}{|^^A
+% \Meta{スイッチ名}|}{|\Meta{初期値}|}|\par
% “\Meta{オプション名}|=|\Meta{真偽値}”のオプション指定に対して、
% |\if|[|bxjs@|\Meta{スイッチ名}] を設定する、という動作を規定する。
% \begin{macrocode}
\@onlypreamble\bxjs@declare@bool@option
-\def\bxjs@declare@bool@option#1#2{%
+\def\bxjs@declare@bool@option#1#2#3{%
+ \csname newif\expandafter\endcsname\csname ifbxjs@#2\endcsname
+ \@nameuse{bxjs@#2#3}%
\define@key{bxjs}{#1}[true]{%
\expandafter\ifx\csname bxjs@#2##1\endcsname\relax
\bxjs@error@keyval{#1}{##1}%
@@ -1531,7 +1645,7 @@
% 未定義ならエラーを出す。
% \begin{macrocode}
\def\bxjs@set@keyval#1#2#3{%
- \expandafter\let\expandafter\bxjs@next\csname bxjs@kv@#1@#2\endcsname
+ \bxjs@csletcs{bxjs@next}{bxjs@kv@#1@#2}%
\ifx\bxjs@next\relax
\bxjs@error@keyval{#1}{#2}%
#3%
@@ -1597,7 +1711,7 @@
%
% |noscale| オプションの処理。
% \begin{macrocode}
-\DeclareOption{noscale}{\setkeys{bxjs}{scale=1}}
+\DeclareOption{noscale}{\bxjs@depre@opt@do{noscale}{scale=1}}
% \end{macrocode}
%
% \begin{macro}{\bxjs@param@mag}
@@ -1629,7 +1743,8 @@
% \Note |jadriver| は0.9版で用いられた旧称。
% \Note 単なる |ja| という指定は無視される(Pandoc 対策)。
% \begin{macrocode}
-\define@key{bxjs}{jadriver}{\edef\bxjs@jadriver@opt{#1}}
+\define@key{bxjs}{jadriver}{%
+ \bxjs@depre@opt{jadriver}{ja=#1}\edef\bxjs@jadriver@opt{#1}}
\define@key{bxjs}{ja}[\relax]{%
\ifx\relax#1\else\edef\bxjs@jadriver@opt{#1}\fi}
% \end{macrocode}
@@ -1655,86 +1770,76 @@
%
% |japaram| オプションの処理。
% \begin{macrocode}
-\define@key{bxjs}{japaram}{\edef\jsJaParam{#1}}
+\define@key{bxjs}{japaram}{%
+ \edef\jsJaParam{\bxjs@catopt\jsJaParam{#1}}}
+% \end{macrocode}
+%
+% 引数をもつ |pandoc|・|pandoc+| オプションは、その引数を
+% 和文パラメタの指定と見なす。
+% \begin{macrocode}
+\define@key{bxjs}{pandoc}[]{%
+ \ExecuteOptions{pandoc}%
+ \edef\jsJaParam{\bxjs@catopt\jsJaParam{#1}}}
+\define@key{bxjs}{pandoc+}[]{%
+ \ExecuteOptions{pandoc+}%
+ \edef\jsJaParam{\bxjs@catopt\jsJaParam{#1}}}
% \end{macrocode}
%
% \begin{macro}{\bxjs@magstyle}
% magstyle設定値。(古いイマイチな名前。)
% \begin{macrocode}
-\let\bxjs@magstyle@mag=m
-\let\bxjs@magstyle@real=r
-\let\bxjs@magstyle@xreal=x
+\let\bxjs@magstyle@@mag=m
+\let\bxjs@magstyle@@real=r
+\let\bxjs@magstyle@@xreal=x
% \end{macrocode}
% (新しい素敵な名前。)
-% \Note ただし制御綴としては、|*|付の名前は扱い難いので、|\bxjs@magstyle@xreal|
+% \Note ただし制御綴としては、|*|付の名前は扱い難いので、|\bxjs@magstyle@@xreal|
% の方を優先させる。
% \begin{macrocode}
-\let\bxjs@magstyle@usemag\bxjs@magstyle@mag
-\let\bxjs@magstyle@nomag\bxjs@magstyle@real
-\expandafter\let\csname bxjs@magstyle@nomag*\endcsname\bxjs@magstyle@xreal
+\let\bxjs@magstyle@@usemag\bxjs@magstyle@@mag
+\let\bxjs@magstyle@@nomag\bxjs@magstyle@@real
+\bxjs@cslet{bxjs@magstyle@@nomag*}\bxjs@magstyle@@xreal
% \end{macrocode}
-% |\bxjs@magstyle@default| は既定の値を表す。
+% |\bxjs@magstyle@@default| は既定の値を表す。
% \begin{macrocode}
-\let\bxjs@magstyle@default\bxjs@magstyle@usemag
+\let\bxjs@magstyle@@default\bxjs@magstyle@@usemag
\ifx l\jsEngine \ifnum\luatexversion>86
- \let\bxjs@magstyle@default\bxjs@magstyle@xreal
+ \let\bxjs@magstyle@@default\bxjs@magstyle@@xreal
\fi\fi
\ifjsWithpTeXng
- \let\bxjs@magstyle@default\bxjs@magstyle@xreal
+ \let\bxjs@magstyle@@default\bxjs@magstyle@@xreal
\fi
-\let\bxjs@magstyle\bxjs@magstyle@default
+\let\bxjs@magstyle\bxjs@magstyle@@default
% \end{macrocode}
% \end{macro}
%
% |magstyle| オプションの処理。
% \begin{macrocode}
\define@key{bxjs}{magstyle}{%
- \expandafter\let\expandafter\bxjs@magstyle\csname
- bxjs@magstyle@#1\endcsname
+ \bxjs@csletcs{bxjs@magstyle}{bxjs@magstyle@@#1}%
\ifx\bxjs@magstyle\relax
- \ClassError\bxjs@clsname
- {Invalid value '#1' for option magstyle}\@ehc
- \let\bxjs@magstyle\bxjs@magstyle@default
+ \bxjs@error@keyval{magstyle}{#1}%
+ \let\bxjs@magstyle\bxjs@magstyle@@default
\fi}
% \end{macrocode}
%
% \begin{macro}{\bxjs@geometry}
-% |geometry| オプションの値。
+% |geometry| オプションの指定値。
% \begin{macrocode}
-\let\bxjs@geometry@class=c
-\let\bxjs@geometry@user=u
-\let\bxjs@geometry\bxjs@geometry@class
+\let\bxjs@geometry@@class=c
+\let\bxjs@geometry@@user=u
+\bxjs@declare@enum@option{geometry}{geometry}{class}
% \end{macrocode}
% \end{macro}
%
-% |geometry| オプションの処理。
-% \begin{macrocode}
-\define@key{bxjs}{geometry}{%
- \expandafter\let\expandafter\bxjs@geometry\csname
- bxjs@geometry@#1\endcsname
- \ifx\bxjs@geometry\relax
- \ClassError\bxjs@clsname
- {Invalid value '#1' for option geometry}\@ehc
- \let\bxjs@geometry\bxjs@geometry@class
- \fi}
-% \end{macrocode}
-%
% \begin{macro}{\ifbxjs@fancyhdr}
-% 〔スイッチ〕
+% 〔スイッチ〕 |fancyhdr| の指定値。
% |fancyhdr| パッケージに対する調整を行うか。
% \begin{macrocode}
-\newif\ifbxjs@fancyhdr \bxjs@fancyhdrtrue
+\bxjs@declare@bool@option{fancyhdr}{fancyhdr}{true}
% \end{macrocode}
% \end{macro}
%
-% |fancyhdr| オプションの処理。
-% \begin{macrocode}
-\let\bxjs@kv@fancyhdr@true\bxjs@fancyhdrtrue
-\let\bxjs@kv@fancyhdr@false\bxjs@fancyhdrfalse
-\define@key{bxjs}{fancyhdr}[true]{%
- \bxjs@set@keyval{fancyhdr}{#1}{}}
-% \end{macrocode}
-%
% \begin{macro}{\ifbxjs@dvi@opt}
% |dvi| オプションが指定されたか。
% \begin{macrocode}
@@ -1754,11 +1859,9 @@
% |dvi| オプションの処理。
% \begin{macrocode}
\define@key{bxjs}{dvi}{%
- \expandafter\let\expandafter\bxjs@tmpa\csname
- bxjs@dvidriver@@#1\endcsname
+ \bxjs@csletcs{bxjs@tmpa}{bxjs@dvidriver@@#1}%
\ifx\bxjs@tmpa\relax
- \ClassError\bxjs@clsname
- {Invalid value '#1' for option dvi}\@ehc
+ \bxjs@error@keyval{dvi}{#1}%
\else
% \end{macrocode}
% |\bxjs@driver@given| を未定義にしていることに注意。
@@ -1808,6 +1911,7 @@
% \begin{macrocode}
%\let\bxjs@textwidth@limit@opt\@undefined
\define@key{bxjs}{textwidth-limit}{%
+ \bxjs@depre@opt{textwidth-limit}{textwidth=#1zw}%
\edef\bxjs@textwidth@limit@opt{#1}}
% \end{macrocode}
% \end{macro}
@@ -1843,113 +1947,94 @@
% \begin{macro}{\ifbxjs@whole@zw@lines}
% 〔スイッチ〕 |whole-zw-lines| の指定値。
% \begin{macrocode}
-\newif\ifbxjs@whole@zw@lines \bxjs@whole@zw@linestrue
-\let\bxjs@kv@wholezwlines@true\bxjs@whole@zw@linestrue
-\let\bxjs@kv@wholezwlines@false\bxjs@whole@zw@linesfalse
-\define@key{bxjs}{whole-zw-lines}[true]{\bxjs@set@keyval{wholezwlines}{#1}{}}
+\bxjs@declare@bool@option{whole-zw-lines}{whole@zw@lines}{true}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@jaspace@cmd}
% 〔スイッチ〕 |jaspace-cmd| の指定値。
% \begin{macrocode}
-\newif\ifbxjs@jaspace@cmd \bxjs@jaspace@cmdtrue
-\let\bxjs@kv@jaspacecmd@true\bxjs@jaspace@cmdtrue
-\let\bxjs@kv@jaspacecmd@false\bxjs@jaspace@cmdfalse
-\define@key{bxjs}{jaspace-cmd}[true]{\bxjs@set@keyval{jaspacecmd}{#1}{}}
-\define@key{bxjs}{xkanjiskip-cmd}[true]{\bxjs@set@keyval{jaspacecmd}{#1}{}}
+\bxjs@declare@bool@option{jaspace-cmd}{jaspace@cmd}{true}
+\define@key{bxjs}{xkanjiskip-cmd}[true]{\setkeys{bxjs}{jaspace-cmd=#1}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@fix@at@cmd}
% 〔スイッチ〕 |fix-at-cmd| の指定値。
% \begin{macrocode}
-\newif\ifbxjs@fix@at@cmd \bxjs@fix@at@cmdtrue
-\let\bxjs@kv@fixatcmd@true\bxjs@fix@at@cmdtrue
-\let\bxjs@kv@fixatcmd@false\bxjs@fix@at@cmdfalse
-\define@key{bxjs}{fix-at-cmd}[true]{\bxjs@set@keyval{fixatcmd}{#1}{}}
+\bxjs@declare@bool@option{fix-at-cmd}{fix@at@cmd}{true}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@hyperref@enc}
% 〔スイッチ〕 |hyperref-enc| の指定値。
% \begin{macrocode}
-\newif\ifbxjs@hyperref@enc \bxjs@hyperref@enctrue
-\let\bxjs@kv@hyperrefenc@true\bxjs@hyperref@enctrue
-\let\bxjs@kv@hyperrefenc@false\bxjs@hyperref@encfalse
-\define@key{bxjs}{hyperref-enc}[true]{\bxjs@set@keyval{hyperrefenc}{#1}{}}
+\bxjs@declare@bool@option{hyperref-enc}{hyperref@enc}{true}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@everyparhook}
% |everyparhook| の指定値。
% \begin{macrocode}
-\chardef\bxjs@everyparhook@none=0
-\chardef\bxjs@everyparhook@compat=1
-\chardef\bxjs@everyparhook@modern=2
-\if j\jsEngine
- \let\bxjs@everyparhook\bxjs@everyparhook@compat
-\else
- \let\bxjs@everyparhook\bxjs@everyparhook@modern
-\fi
-\def\bxjs@kv@everyparhook@none{\let\bxjs@everyparhook\bxjs@everyparhook@none}
-\def\bxjs@kv@everyparhook@compat{\let\bxjs@everyparhook\bxjs@everyparhook@compat}
-\def\bxjs@kv@everyparhook@modern{\let\bxjs@everyparhook\bxjs@everyparhook@modern}
-\define@key{bxjs}{everyparhook}{\bxjs@set@keyval{everyparhook}{#1}{}}
+\chardef\bxjs@everyparhook@@none=0
+\chardef\bxjs@everyparhook@@compat=1
+\chardef\bxjs@everyparhook@@modern=2
+\bxjs@declare@enum@option{everyparhook}{everyparhook}{%
+ \if j\jsEngine compat\else modern\fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bxjs@label@section}
% |label-section| の指定値。
% \begin{macrocode}
-\chardef\bxjs@label@section@none=0
-\chardef\bxjs@label@section@compat=1
-\chardef\bxjs@label@section@modern=2
-\let\bxjs@label@section\bxjs@label@section@compat
-\def\bxjs@kv@labelsection@none{\let\bxjs@label@section\bxjs@label@section@none}
-\def\bxjs@kv@labelsection@compat{\let\bxjs@label@section\bxjs@label@section@compat}
-\def\bxjs@kv@labelsection@modern{\let\bxjs@label@section\bxjs@label@section@modern}
-\define@key{bxjs}{label-section}{\bxjs@set@keyval{labelsection}{#1}{}}
+\chardef\bxjs@label@section@@none=0
+\chardef\bxjs@label@section@@compat=1
+\chardef\bxjs@label@section@@modern=2
+\bxjs@declare@enum@option{label-section}{label@section}{compat}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@usezw}
% 〔スイッチ〕 |use-zw| の指定値。
% \begin{macrocode}
-\newif\ifbxjs@usezw \bxjs@usezwtrue
-\bxjs@declare@bool@option{use-zw}{usezw}
-\DeclareOption{nozw}{\setkeys{bxjs}{use-zw=false}}
-\DeclareOption{zw}{\setkeys{bxjs}{use-zw=true}}
+\bxjs@declare@bool@option{use-zw}{usezw}{true}
+\DeclareOption{nozw}{\bxjs@depre@opt@do{nozw}{use-zw=false}}
+\DeclareOption{zw}{\bxjs@depre@opt@do{zw}{use-zw=true}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@disguise@js}
% 〔スイッチ〕 |disguise-js| の指定値。
% \begin{macrocode}
-\newif\ifbxjs@disguise@js \bxjs@disguise@jstrue
-\bxjs@declare@bool@option{disguise-js}{disguise@js}
-\DeclareOption{nojs}{\setkeys{bxjs}{disguise-js=false}}
-\DeclareOption{js}{\setkeys{bxjs}{disguise-js=true}}
+\bxjs@declare@bool@option{disguise-js}{disguise@js}{true}
+\DeclareOption{nojs}{\bxjs@depre@opt@do{nojs}{disguise-js=false}}
+\DeclareOption{js}{\bxjs@depre@opt@do{js}{disguise-js=true}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@precisetext}
% 〔スイッチ〕 |precise-text| の指定値。
% \begin{macrocode}
-\newif\ifbxjs@precisetext
-\bxjs@declare@bool@option{precise-text}{precisetext}
-\DeclareOption{noprecisetext}{\setkeys{bxjs}{precise-text=false}}
-\DeclareOption{precisetext}{\setkeys{bxjs}{precise-text=true}}
+\bxjs@declare@bool@option{precise-text}{precisetext}{false}
+\DeclareOption{noprecisetext}{\bxjs@depre@opt@do{noprecisetext}{precise-text=false}}
+\DeclareOption{precisetext}{\bxjs@depre@opt@do{precisetext}{precise-text=true}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifbxjs@simplejasetup}
% 〔スイッチ〕 |simple-ja-setup| の指定値。
% \begin{macrocode}
-\newif\ifbxjs@simplejasetup \bxjs@simplejasetuptrue
-\bxjs@declare@bool@option{simple-ja-setup}{simplejasetup}
-\DeclareOption{nosimplejasetup}{\setkeys{bxjs}{simple-ja-setup=false}}
-\DeclareOption{simplejasetup}{\setkeys{bxjs}{simple-ja-setup=true}}
+\bxjs@declare@bool@option{simple-ja-setup}{simplejasetup}{true}
+\DeclareOption{nosimplejasetup}{\bxjs@depre@opt@do{nosimplejasetup}{simple-ja-setup=false}}
+\DeclareOption{simplejasetup}{\bxjs@depre@opt@do{simplejasetup}{simple-ja-setup=true}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifbxjs@plautopatch}
+% 〔スイッチ〕 |plautopatch| の指定値。
+% \begin{macrocode}
+\bxjs@declare@bool@option{plautopatch}{plautopatch}{false}
+\g@addto@macro\bxjs@plautopatchfalse{\def\bxjs@plautopatch@given{false}}
% \end{macrocode}
% \end{macro}
%
@@ -2205,17 +2290,38 @@
% 値が未指定の場合は |minimal| に変える。
% ただしエンジンが{(u)\pTeX}である場合は |standard|
% に変える。
+% \Note {(u)\pTeX}以外で |ja| を省略するのは2.0版より非推奨となった。
% \begin{macrocode}
\def\bxjs@@minimal{minimal}
\ifx\bxjs@jadriver\relax
\ifx j\jsEngine
\def\bxjs@jadriver{standard}
\else
+ \ClassWarningNoLine\bxjs@clsname
+ {The option 'ja' is MISSING!!\MessageBreak
+ So 'ja=minimal' is assumed as fallback, but\MessageBreak
+ such implicit setting is now DEPRECATED!\MessageBreak
+ You should write 'ja=minimal' explicitly,\MessageBreak
+ if it is intended}
\let\bxjs@jadriver\bxjs@@minimal
\fi
\fi
% \end{macrocode}
%
+% |plautopatch| が真の場合はここで |plautopatch| を読み込む。
+% \Note この時点で既に読み込まれているパッケージは、
+% |calc|、|keyval|、|ifpdf|。
+% \Note Pandocモードでは |plautopatch| の既定値を真とする。
+% \begin{macrocode}
+\def\bxjs@@pandoc{pandoc}
+\ifx\bxjs@jadriver\bxjs@@pandoc \ifx\bxjs@plautopatch@given\@undefined
+ \bxjs@plautopatchtrue
+\fi\fi
+\ifx j\jsEngine \ifbxjs@plautopatch
+ \RequirePackage{plautopatch}[2018/08/22]%v0.3
+\fi\fi
+% \end{macrocode}
+%
% エンジンオプションがない場合はエラーを出す。
% \Note ただし |ja| 非指定の場合はスキップする。
% \begin{macrocode}
@@ -2233,9 +2339,9 @@
% (この場合の既定値は |nomag*| であり、
% エラーの場合は既定値に置き換えられる。)
% \begin{macrocode}
-\ifx\bxjs@magstyle@default\bxjs@magstyle@mag\else
- \ifx\bxjs@magstyle\bxjs@magstyle@mag
- \let\bxjs@magstyle\bxjs@magstyle@default
+\ifx\bxjs@magstyle@@default\bxjs@magstyle@@mag\else
+ \ifx\bxjs@magstyle\bxjs@magstyle@@mag
+ \let\bxjs@magstyle\bxjs@magstyle@@default
\ClassError\bxjs@clsname
{The engine does not support 'magstyle=usemag'}%
{LuaTeX v0.87 or later no longer supports the "mag" feature of TeX.\MessageBreak
@@ -2353,6 +2459,11 @@
% [2017-01-11] トンボオプションが指定されているとき「だけ」|\stockwidth|,
% |\stockheight|を定義するようにしました。
%
+% [2020-10-04] \LaTeXe~2020-10-01でカーネルの |\shipout| コードが拡張され
+% |\AtBeginDvi| の実行タイミングが変化したので,この時点で
+% 発行する |\special| の中身を展開しておくようにしました。
+% こうしないと,用紙サイズ設定を間違ってしまいます(Issue \#72)。
+%
% \begin{ZRnote}
% BXJSでは出力用紙サイズ記録は |geometry| パッケージが行う。
%
@@ -2389,9 +2500,9 @@
% |\bxjs@magstyle| の値に応じてスイッチ |jsc@mag| と |jsc@mag@xreal| を
% 設定する。
% \begin{macrocode}
-\ifx\bxjs@magstyle\bxjs@magstyle@mag
+\ifx\bxjs@magstyle\bxjs@magstyle@@mag
\jsc@magtrue
-\else\ifx\bxjs@magstyle\bxjs@magstyle@xreal
+\else\ifx\bxjs@magstyle\bxjs@magstyle@@xreal
\jsc@mag@xrealtrue
\fi\fi
% \end{macrocode}
@@ -2879,7 +2990,12 @@
% ここで実際に標準フォントサイズで初期化します。
%
% \begin{macrocode}
+%</class>
+%<*class|minijs>
+%% initialize
\normalsize
+%</class|minijs>
+%<*class>
% \end{macrocode}
%
% \end{macro}
@@ -3205,18 +3321,39 @@
\def\bxjs@unit@zw{\jsZw}\let\bxjs@unit@zh\bxjs@unit@zw
% \end{macrocode}
%
-% |\bxjs@param@paper| が長さ指定(|{W}{H}|)の場合、
+% |\bxjs@param@paper| が長さ指定の場合、
% |geometry| の形式(|papersize={W,H}|)に変換する。
+% |{W}{H}| の形式について。
+% \begin{macrocode}
+\@tempswafalse
+\def\bxjs@tmpdo{\@ifnextchar\bgroup\bxjs@tmpdo@a\remove@to@nnil}
+\def\bxjs@tmpdo@a#1{\edef\bxjs@tmpa{#1}%
+ \@ifnextchar\bgroup\bxjs@tmpdo@b\remove@to@nnil}
+\def\bxjs@tmpdo@b#1{\edef\bxjs@tmpa{\bxjs@tmpa,#1}%
+ \@ifnextchar\@nnil\bxjs@tmpdo@c\remove@to@nnil}
+\def\bxjs@tmpdo@c\@nnil{\@tempswatrue
+ \edef\bxjs@param@paper{papersize={\bxjs@tmpa}}}
+\expandafter\bxjs@tmpdo\bxjs@param@paper\@nnil
+% \end{macrocode}
+% |W,H| の形式について。
+% \begin{macrocode}
+\if@tempswa\else
+ \def\bxjs@tmpa{\@nil,\@nil}
+ \def\bxjs@tmpdo#1,#2,#3\@nnil{%
+ \def\bxjs@tmpb{#3}\ifx\bxjs@tmpa\bxjs@tmpb
+ \@tempswatrue\edef\bxjs@param@paper{papersize={#1,#2}}\fi}
+ \expandafter\bxjs@tmpdo\bxjs@param@paper,\@nil,\@nil\@nnil
+\fi
+% \end{macrocode}
+% |W*H| の形式について。
% \begin{macrocode}
-\def\bxjs@tmpdo{\futurelet\bxjs@tmpa\bxjs@tmpdo@a}
-\def\bxjs@tmpdo@a{%
- \ifx\bxjs@tmpa\bgroup \expandafter\bxjs@tmpdo@b
- \else \expandafter\bxjs@tmpdo@c \fi}
-\def\bxjs@tmpdo@b#1#2#3\@nil{\edef\bxjs@param@paper{papersize={#1,#2}}}
-\def\bxjs@tmpdo@c#1\@nil{\bxjs@tmpdo@d#1,,\@nil}
-\def\bxjs@tmpdo@d#1,#2,#3\@nil{%
- \ifx\@nil#3\@nil\else \edef\bxjs@param@paper{papersize={#1,#2}}\fi}
-\expandafter\bxjs@tmpdo\bxjs@param@paper\@empty\@empty\@nil
+\if@tempswa\else
+ \def\bxjs@tmpa{\@nil*\@nil}
+ \def\bxjs@tmpdo#1*#2*#3\@nnil{%
+ \def\bxjs@tmpb{#3}\ifx\bxjs@tmpa\bxjs@tmpb
+ \@tempswatrue\edef\bxjs@param@paper{papersize={#1,#2}}\fi}
+ \expandafter\bxjs@tmpdo\bxjs@param@paper*\@nil*\@nil\@nnil
+\fi
% \end{macrocode}
%
% \begin{macro}{\bxjs@layout@paper}
@@ -3426,9 +3563,20 @@
% \paragraph{geometry パッケージを読み込む \ZRX}
% \mbox{}
% \begin{ZRnote}
+% ムニャムニャ。
+% \begin{macrocode}
+\def\bxjs@geometry@name{geometry}
+\ifbxjs@old@hook@system
+ \let\bxjs@apply@bd@pre@geometry@hook\AtBeginDocument
+\else
+ \def\bxjs@apply@bd@pre@geometry@hook{%
+ \AddToHook{begindocument}[\bxjs@geometry@name]}
+\fi
+% \end{macrocode}
+%
% |geoemtry=class| の場合に、実際に |geometry| パッケージを読みこむ。
% \begin{macrocode}
-\ifx\bxjs@geometry\bxjs@geometry@class
+\ifx\bxjs@geometry\bxjs@geometry@@class
% \end{macrocode}
%
% |geometry| のドライバオプション指定。
@@ -3454,13 +3602,14 @@
% \Note |geometry| のbegin-documentフックにおいて、Lua{\TeX}の
% 旧版互換を有効にする。
% \begin{macrocode}
-\AtBeginDocument{\bxjs@bd@pre@geometry@hook}
-\AtBeginDocument{\ImposeOldLuaTeXBehavior}
+\bxjs@apply@bd@pre@geometry@hook
+\bxjs@apply@bd@pre@geometry@hook{\bxjs@bd@pre@geometry@hook}
+\bxjs@apply@bd@pre@geometry@hook{\ImposeOldLuaTeXBehavior}
\bxjs@preproc@layout
\edef\bxjs@next{%
\noexpand\RequirePackage[\bxjs@layout@paper,\bxjs@layout]{geometry}%
}\bxjs@next
-\AtBeginDocument{\RevokeOldLuaTeXBehavior}
+\bxjs@apply@bd@pre@geometry@hook{\RevokeOldLuaTeXBehavior}
% \end{macrocode}
%
% \begin{macro}{\bxjs@geometry@driver}
@@ -3523,7 +3672,7 @@
% \begin{ZRnote}
% |geometry=user|の場合の処理。
% \begin{macrocode}
-\else\ifx\bxjs@geometry\bxjs@geometry@user
+\else\ifx\bxjs@geometry\bxjs@geometry@@user
% \end{macrocode}
%
% この場合はユーザが何らかの方法(例えば |geometry| を読み込む)
@@ -4500,7 +4649,7 @@
% |\title| にフックを入れる。
% \begin{macrocode}
\renewcommand*{\title}[1]{\bxjs@decl@subtitle\gdef\@title{#1}}
-\AtBeginDocument{\bxjs@decl@subtitle}
+\g@addto@macro\bxjs@begin@document@hook{\bxjs@decl@subtitle}
\def\bxjs@decl@subtitle{%
\global\let\bxjs@decl@subtitle\relax
\ifx\subtitle\@undefined
@@ -4791,7 +4940,7 @@
% \begin{macro}{\@secpos}
% 節番号の接尾辞。
% \begin{macrocode}
-\ifnum\bxjs@label@section=\bxjs@label@section@compat\else
+\ifnum\bxjs@label@section=\bxjs@label@section@@compat\else
\def\@secapp{\presectionname}
\def\@secpos{\postsectionname}
\fi
@@ -4801,7 +4950,7 @@
% \begin{macro}{\labelsection}
% 節番号の出力書式。
% \begin{macrocode}
-\ifnum\bxjs@label@section=\bxjs@label@section@modern
+\ifnum\bxjs@label@section=\bxjs@label@section@@modern
\def\labelsection{\@secapp\thesection\@secpos}
\fi
% \end{macrocode}
@@ -4891,7 +5040,7 @@
% \begin{macro}{\bxjs@if@ceph}
% |everyparhook=compat| である場合にのみ直後のトークンを実行する。
% \begin{macrocode}
-\ifnum\bxjs@everyparhook=\bxjs@everyparhook@compat
+\ifnum\bxjs@everyparhook=\bxjs@everyparhook@@compat
\let\bxjs@if@ceph\@firstofone
\else \let\bxjs@if@ceph\@gobble
\fi
@@ -5086,7 +5235,7 @@
% \begin{macrocode}
\renewcommand{\thepart}{\@Roman\c@part}
%<*!book&!report>
-\ifnum\bxjs@label@section=\bxjs@label@section@compat
+\ifnum\bxjs@label@section=\bxjs@label@section@@compat
\renewcommand{\thesection}{\presectionname\@arabic\c@section\postsectionname}
\renewcommand{\thesubsection}{\@arabic\c@section.\@arabic\c@subsection}
\else
@@ -6164,7 +6313,7 @@
\newcommand{\appendix}{\par
\setcounter{section}{0}%
\setcounter{subsection}{0}%
- \ifnum\bxjs@label@section=\bxjs@label@section@compat
+ \ifnum\bxjs@label@section=\bxjs@label@section@@compat
\gdef\presectionname{\appendixname}%
\gdef\postsectionname{}%
% \gdef\thesection{\@Alph\c@section}% [2003-03-02]
@@ -7510,7 +7659,7 @@
% これの初期値を先述の |\jsInhibitGlueAtParTop| とする。
% \begin{macrocode}
\def\everyparhook{\jsInhibitGlueAtParTop}
-\ifnum\bxjs@everyparhook=\bxjs@everyparhook@compat
+\ifnum\bxjs@everyparhook=\bxjs@everyparhook@@compat
\g@addto@macro\bxjs@begin@document@hook{\everypar{\everyparhook}}
\fi
% \end{macrocode}
@@ -7571,7 +7720,7 @@
% これは、|everyparhook=compat| の場合にのみ実行する。
% \end{ZRnote}
% \begin{macrocode}
-\ifnum\bxjs@everyparhook=\bxjs@everyparhook@compat
+\ifnum\bxjs@everyparhook=\bxjs@everyparhook@@compat
% \end{macrocode}
%
% これだけではいけないようです。あちこちに |\everypar| を初期化するコマンドが
@@ -7707,7 +7856,7 @@
% のを防ぐため遅延させる。
% \end{ZRnote}
% \begin{macrocode}
-\ifnum\bxjs@everyparhook=\bxjs@everyparhook@none\else
+\ifnum\bxjs@everyparhook=\bxjs@everyparhook@@none\else
\AtEndOfPackage{%
\def\@gnewline #1{%
\ifvmode
@@ -8026,12 +8175,11 @@
% \end{macrocode}
%
% おしまい。
+% \end{ZRnote}
% \begin{macrocode}
-%</cls>
+%</class>
% \end{macrocode}
%
-% \end{ZRnote}
-%
% 以上です。
%
%^^A////////////////////////////////////////////////////////
@@ -8447,6 +8595,9 @@
% \Note 2020-02-02のNFSSの改修に対する |jsclasses| の対策を
% 取り入れた。
% \begin{macrocode}
+\@ifl@t@r\fmtversion{2020/10/01}
+ {\jsc@needsp@tchfalse}{\jsc@needsp@tchtrue}
+\ifjsc@needsp@tch % --- for 2020-02-02 or older BEGIN
\ifx\@rmfamilyhook\@undefined % old
\DeclareRobustCommand\rmfamily
{\not@math@alphabet\rmfamily\mathrm
@@ -8476,6 +8627,14 @@
\g@addto@macro\@ttfamilyhook
{\prepare@family@series@update@kanji{gt}\gtdefault}
\fi
+\else % --- for 2020-02-02 or older END & for 2020-10-01 BEGIN
+\AddToHook{rmfamily}%
+ {\prepare@family@series@update@kanji{mc}\mcdefault}
+\AddToHook{sffamily}%
+ {\prepare@family@series@update@kanji{gt}\gtdefault}
+\AddToHook{ttfamily}%
+ {\prepare@family@series@update@kanji{gt}\gtdefault}
+\fi % --- for 2020-10-01 END
\ifx\DeclareFixJFMCJKTextFontCommand\@undefined
\DeclareJaTextFontCommand{\textmc}{\mcfamily}
\DeclareJaTextFontCommand{\textgt}{\gtfamily}
@@ -8559,11 +8718,18 @@
!else\hbox{\yoko\@textsuperscript{\normalfont\@thefnmark}}!fi}
\fi
% \end{macrocode}
-%
+% エスケープ文字の変更はここまで。
% \begin{macrocode}
\endgroup
% \end{macrocode}
%
+% \paragraph{minijsパッケージのブロック}
+%
+% やっておく。
+% \begin{macrocode}
+\@namedef{ver@minijs.sty}{}
+% \end{macrocode}
+%
%^^A----------------
% \subsection{pdf{\TeX}用の処理}
%
@@ -8702,7 +8868,7 @@
% |everyparhook=modern| の場合の、|\everyparhook| の有効化の実装。
% \Note 本体開始時ではなく最初から有効化していることに注意。
% \begin{macrocode}
-\ifnum\bxjs@everyparhook=\bxjs@everyparhook@modern
+\ifnum\bxjs@everyparhook=\bxjs@everyparhook@@modern
% \end{macrocode}
% まず |\everypar| を“乗っ取る”処理を行う。
% \begin{macrocode}
@@ -8875,15 +9041,8 @@
%
% \paragraph{和文フォント指定の扱い}
%
-% |standard| 和文ドライバでは |\jsJaFont| の値を和文フォントの
-% “プリセット”の指定として用いる。
-% プリセットの値は、{\TeX} Liveの |kanji-config-updmap| コマンドで
-% 使う“ファミリ”と同じにすることを想定する。
-% 特別な値として、|auto| は |kanji-config-updmap| で現在指定
-% されているファミリを表す。
-%
%^^A----------------
-% \subsection{共通処理(1)}
+% \subsection{準備}
%
% まず minimal ドライバを読み込む。
% \begin{macrocode}
@@ -8897,7 +9056,8 @@
\bxjs@simplejasetupfalse
% \end{macrocode}
%
-% \paragraph{japaramオプションの処理}
+%^^A----------------
+% \subsection{和文ドライバパラメタ}
%
% |japaram| の値をkey-valueリストとして解釈する。
% keyvalのファミリは |bxjsStd| とする。
@@ -8946,12 +9106,29 @@
\edef\bxjs@jp@font{#1}}
% \end{macrocode}
%
+% \begin{macro}{\ifbxjs@jp@strong@cmd}
+% |\strong| 命令を補填するか。
+% \begin{macrocode}
+\newif\ifbxjs@jp@strong@cmd \bxjs@jp@strong@cmdtrue
+% \end{macrocode}
+%
+% |strong-cmd| オプションの処理。
+% \begin{macrocode}
+\let\bxjs@kv@strongcmd@true\bxjs@jp@strong@cmdtrue
+\let\bxjs@kv@strongcmd@false\bxjs@jp@strong@cmdfalse
+\define@key{bxjs}{strong-cmd}[true]{\bxjs@set@keyval{strongcmd}{#1}{}}
+% \end{macrocode}
+% \end{macro}
+%
% 実際の |japaram| の値を適用する。
% \begin{macrocode}
\def\bxjs@next#1{\bxjs@safe@setkeys{bxjsStd}{#1}}
\expandafter\bxjs@next\expandafter{\jsJaParam}
% \end{macrocode}
%
+%^^A----------------
+% \subsection{共通処理(1)}
+%
% \paragraph{jis2004パラメタ}
%
% |jis2004| パラメタが有効の場合は、グローバルオプションに |jis2004|
@@ -8959,11 +9136,13 @@
% \Note |otf| や |luatexja-preset| 等のパッケージがこのオプションを
% 利用する。
% \begin{macrocode}
-\ifbxjs@jp@jismmiv
+\@onlypreamble\bxjs@apply@mmiv
+\def\bxjs@apply@mmiv{%
\g@addto@macro\@classoptionslist{,jis2004}
% \@ifpackagewith 判定への対策
\PassOptionsToPackage{jis2004}{otf}
-\fi
+ \global\let\bxjs@apply@mmiv\relax}
+\ifbxjs@jp@jismmiv \bxjs@apply@mmiv \fi
% \end{macrocode}
%
% \paragraph{和文用単位のサポート}
@@ -9021,6 +9200,35 @@
% \end{macrocode}
% \end{macro}
%
+% \paragraph{\textbackslash strong命令の補填}
+%
+% \begin{macro}{\strong}
+% \begin{environment}{strongenv}
+% |fontspec| で提供される |\strong| 命令と |strongenv| 環境を
+% 全てのエンジンで使えるようにする。
+% \Note
+% \begin{macrocode}
+\ifbxjs@jp@strong@cmd\jsAtEndOfClass{%
+ \ifx\strong\@undefined\ifx\strongenv\@undefined
+ \DeclareRobustCommand{\strongenv}{\bxjs@strong@font}%
+ \DeclareTextFontCommand{\strong}{\strongenv}%
+% \end{macrocode}
+% |fontspec| と互換の |\strongfontdeclare| 命令も提供する。
+% ただし、BXJSでの |\strong| は多段階には対応しないので、
+% 引数のコンマ区切りリストのうちの先頭の項目だけが意味をもつ。
+% 既定の設定は |\bfseries|(太字)である。
+% \Note |\strongfontdeclare| は試験的機能とする。
+% \begin{macrocode}
+ \@ifdefinable{\strongfontdeclare}{\bxjs@protected\def\strongfontdeclare#1{%
+ \bxjs@strong@font@declare@a#1,\@nil}}%
+ \def\bxjs@strong@font@declare@a#1,#2\@nil{\def\bxjs@strong@font{#1}}%
+ \def\bxjs@strong@font{\bfseries}%
+ \fi\fi
+}\fi
+% \end{macrocode}
+% \end{environment}
+% \end{macro}
+%
% \paragraph{共通命令の実装}
%
% |\jQ| 等の「単位」系の共通命令を実装する。
@@ -9211,6 +9419,13 @@
%
% \paragraph{和文フォント指定の扱い}
%
+% |standard| 和文ドライバでは |\jsJaFont| の値を和文フォントの
+% “プリセット”の指定として用いる。
+% プリセットの値は、{\TeX} Liveの |kanji-config-updmap| コマンドで
+% 使う“ファミリ”と同じにすることを想定する。
+% 特別な値として、|auto| は |kanji-config-updmap| で現在指定
+% されているファミリを表す。
+%
% \begin{macro}{\bxjs@adjust@jafont}
% |\jsJaFont| に入っている和文フォント設定の値を“調整”して、
% その結果を |\bxjs@tmpa| に返す。
@@ -9221,10 +9436,13 @@
\def\bxjs@adjust@jafont#1{%
\ifx\jsJaFont\bxjs@@auto
\bxjs@get@kanjiEmbed
- \ifx\bxjs@kanjiEmbed\relax
+ \ifx\bxjs@jaEmbed\relax
\let\bxjs@tmpa\@empty
\else
- \let\bxjs@tmpa\bxjs@kanjiEmbed
+ \let\bxjs@tmpa\bxjs@jaEmbed
+ \ifx\bxjs@jaVariant\bxjs@@hziv
+ \bxjs@apply@mmiv
+ \fi
\fi
\else
\let\bxjs@tmpa\jsJaFont
@@ -9238,24 +9456,41 @@
}
\def\bxjs@@auto{auto}
\def\bxjs@@noEmbed{noEmbed}
+\def\bxjs@@hziv{-04}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\bxjs@kanjiEmbed}
-% 現在の |updmap| の |kanjiEmbed| パラメタの値。
+% \begin{macro}{\bxjs@jaEmbed}
+% \begin{macro}{\bxjs@jaVariant}
+% 現在の |updmap| の |jaEmbed|・|jaVariant| パラメタの値。
% |\bxjs@get@kanjiEmbed| により実際の設定値が取得されてここに設定される。
+% \Note 古い版の |updmap| では |kanjiEmbed|・|kanjiVariant| であった。
% \begin{macrocode}
-\let\bxjs@kanjiEmbed\relax
+\let\bxjs@jaEmbed\relax
+\let\bxjs@jaVariant\relax
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\bxjs@get@kanjiEmbed}
-% 現在の |updmap| の |kanjiEmbed| パラメタの値を取得する。
+% 現在の |updmap| の |jaEmbed|・|jaVariant| パラメタの値を取得する。
% \begin{macrocode}
\@onlypreamble\bxjs@get@kanjiEmbed
\def\bxjs@get@kanjiEmbed{%
\begingroup\setbox\z@=\hbox{%
+ \global\let\bxjs@tmpdo\@empty
+ \def\bxjs@next##1##2##3{%
+ \def##1####1##3 ####2\@nil####3\@nnil{%
+ \ifx$####1$\gdef##2{####2}\fi}%
+ \g@addto@macro\bxjs@tmpdo{%
+ \expandafter##1\bxjs@tmpa\@nil##3 \@nil\@nnil}}%
+ \bxjs@next\bxjs@tmpdo@a\bxjs@g@tmpa{kanjiEmbed}%
+ \bxjs@next\bxjs@tmpdo@b\bxjs@g@tmpa{jaEmbed}%
+ \bxjs@next\bxjs@tmpdo@c\bxjs@g@tmpb{kanjiVariant}%
+ \bxjs@next\bxjs@tmpdo@d\bxjs@g@tmpb{jaVariant}%
+%
\global\let\bxjs@g@tmpa\relax
+ \global\let\bxjs@g@tmpb\relax
\endlinechar\m@ne
\let\do\@makeother\dospecials
\catcode32=10 \catcode12=10 %form-feed
@@ -9270,35 +9505,40 @@
\@tempswatrue
\loop\if@tempswa
\read\@inputcheck to\bxjs@tmpa
- \expandafter\bxjs@get@ke@a\bxjs@tmpa\@nil kanjiEmbed \@nil\@nnil
- \ifx\bxjs@tmpb\relax\else
- \global\let\bxjs@g@tmpa\bxjs@tmpb
- \@tempswafalse
- \fi
- \expandafter\bxjs@get@ke@b\bxjs@tmpa\@nil jaEmbed \@nil\@nnil
- \ifx\bxjs@tmpb\relax\else
- \global\let\bxjs@g@tmpa\bxjs@tmpb
- \@tempswafalse
- \fi
+ \bxjs@tmpdo
\ifeof\@inputcheck \@tempswafalse \fi
\repeat
\fi
}\endgroup
- \let\bxjs@kanjiEmbed\bxjs@g@tmpa
+ \let\bxjs@jaEmbed\bxjs@g@tmpa
+ \let\bxjs@jaVariant\bxjs@g@tmpb
}
-\@onlypreamble\bxjs@get@ke@a
-\def\bxjs@get@ke@a#1kanjiEmbed #2\@nil#3\@nnil{%
- \ifx$#1$\def\bxjs@tmpb{#2}%
- \else \let\bxjs@tmpb\relax
- \fi}
-\@onlypreamble\bxjs@get@ke@b
-\def\bxjs@get@ke@b#1jaEmbed #2\@nil#3\@nnil{%
- \ifx$#1$\def\bxjs@tmpb{#2}%
- \else \let\bxjs@tmpb\relax
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bxjs@resolve@jafont@paren}
+% |jafont|パラメタ値内の|()|を解決する。
+% |\bxjs@resolve@jafont@paren\CS| で、|\CS| の内容中の |(...)|
+% を |\bxjs@jafont@paren{...}| に置き換える。
+% \begin{macrocode}
+\@onlypreamble\bxjs@resolve@jafont@paren
+\def\bxjs@resolve@jafont@paren#1{%
+ \def\bxjs@tmpb{\let#1}%
+ \expandafter\bxjs@resolve@jafont@paren@a#1\@nil()\@nil\@nnil#1}
+\@onlypreamble\bxjs@resolve@jafont@paren@a
+\def\bxjs@resolve@jafont@paren@a#1(#2)#3\@nil#4\@nnil#5{%
+ \ifx\relax#4\relax \bxjs@tmpb#5%
+ \else
+ \edef\bxjs@tmpa{#1\bxjs@jafont@paren{#2}#3}%
+ \bxjs@tmpb\bxjs@tmpa
\fi}
% \end{macrocode}
% \end{macro}
%
+% \paragraph{和文として出力}
+%
+% 「欧文扱い」となっている文字を和文として出力するための機能。
+%
% \begin{macro}{\jachar}
% |\jachar{|\meta{文字}|}|\Means
% 和文文字として出力する。
@@ -9393,6 +9633,12 @@
% DVIのなるべく早い位置にspecialを出力する。
% \begin{macrocode}
\@onlypreamble\bxjs@urgent@special
+\@onlypreamble\bxjs@urgent@special@a
+% \end{macrocode}
+% {\LaTeX}カーネルの新フック管理が導入済かを調べる。
+% 未導入の古い版である場合。
+% \begin{macrocode}
+\ifbxjs@old@hook@system
\def\bxjs@urgent@special#1{%
\AtBeginDvi{\special{#1}}%
\g@addto@macro\bxjs@begin@document@hook{%
@@ -9406,24 +9652,18 @@
}%
}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\bxjs@resolve@jafont@paren}
-% |jafont|パラメタ値内の|()|を解決する。
-% |\bxjs@resolve@jafont@paren\CS| で、|\CS| の内容中の |(...)|
-% を |\bxjs@jafont@paren{...}| に置き換える。
+% 導入済の場合。
+% \Note 自分が先行する必要がある対象のパッケージを適宜追加する。
+% \Note |pxjahyper| パッケージの処理と合わせる。
% \begin{macrocode}
-\@onlypreamble\bxjs@resolve@jafont@paren
-\def\bxjs@resolve@jafont@paren#1{%
- \def\bxjs@tmpb{\let#1}%
- \expandafter\bxjs@resolve@jafont@paren@a#1\@nil()\@nil\relax}
-\@onlypreamble\bxjs@resolve@jafont@paren@a
-\def\bxjs@resolve@jafont@paren@a#1(#2)#3\@nil#4\relax{%
- \ifx\relax#4\relax \bxjs@tmpb\jsJaFont
- \else
- \edef\bxjs@tmpa{#1\bxjs@jafont@paren{#2}#3}%
- \bxjs@tmpb\bxjs@tmpa
- \fi}
+\else
+ \def\bxjs@urgent@special#1{%
+ \bxjs@urgent@special@a
+ \AddToHook{shipout/firstpage}[pxjahyper/enc]{\special{#1}}}
+ \def\bxjs@urgent@special@a{%
+ \DeclareHookRule{shipout/firstpage}{pxjahyper/enc}{<}{hyperref}%
+ \global\let\bxjs@urgent@special@a\relax}
+\fi
% \end{macrocode}
% \end{macro}
%
@@ -9582,6 +9822,11 @@
% \begin{macrocode}
\if \ifx\bxjs@driver@given\bxjs@driver@@dvipdfmx T%
\else\ifjsWithpTeXng T\else F\fi\fi T%
+ \IfFileExists{pxjahyper-enc.sty}{\@tempswatrue}{\@tempswafalse}
+ \if@tempswa
+ \RequirePackage{pxjahyper-enc}[2020/10/05]%v0.6
+ \ifbxjs@bigcode\else \suppressbigcode \fi
+ \else
\ifnum\jis"2121="A1A1 %euc
\bxjs@urgent@special{pdf:tounicode EUC-UCS2}
\else\ifnum\jis"2121="8140 %sjis
@@ -9592,9 +9837,11 @@
\PassOptionsToPackage{bigcode}{pxjahyper}
\else
\bxjs@urgent@special{pdf:tounicode UTF8-UCS2}
+ \PassOptionsToPackage{nobigcode}{pxjahyper}
\fi
\fi\fi\fi
\let\bxToUnicodeSpecialDone=t
+ \fi
\fi
% \end{macrocode}
%
@@ -9994,6 +10241,7 @@
% 欧文総称フォント命令で和文フォントが連動するように修正する。
% その他の和文フォント関係の定義を行う。
% \begin{macrocode}
+\@ifpackagelater{luatexja}{2016/03/31}{}{%else
\DeclareRobustCommand\rmfamily
{\not@math@alphabet\rmfamily\mathrm
\romanfamily\rmdefault\kanjifamily\mcdefault\selectfont}
@@ -10003,8 +10251,13 @@
\DeclareRobustCommand\ttfamily
{\not@math@alphabet\ttfamily\mathtt
\romanfamily\ttdefault\kanjifamily\gtdefault\selectfont}
+}
+\long\def\jttdefault{\gtdefault}
+\unless\ifx\@ltj@match@familytrue\@undefined
+ \@ltj@match@familytrue
+\fi
\g@addto@macro\bxjs@begin@document@hook{%
- \reDeclareMathAlphabet{\mathrm}{\mathrm}{\mathmc}
+ \reDeclareMathAlphabet{\mathrm}{\mathrm}{\mathmc}%
\reDeclareMathAlphabet{\mathbf}{\mathbf}{\mathgt}%
\reDeclareMathAlphabet{\mathsf}{\mathsf}{\mathgt}}%
\bxjs@if@sf@default{%
@@ -10046,11 +10299,11 @@
%
% |ltjs*| クラスの定義と同等になるようにパッチを当てる。
% \begin{macrocode}
-\unless\ifnum\bxjs@everyparhook=\bxjs@everyparhook@none
+\unless\ifnum\bxjs@everyparhook=\bxjs@everyparhook@@none
\begingroup
\let\%\@percentchar \def\@#1{[[\detokenize{#1}]]}
\@gobble\if\def\bxjs@tmpa{\@{\everypar{}\fi}}
- \ifnum\bxjs@everyparhook=\bxjs@everyparhook@compat
+ \ifnum\bxjs@everyparhook=\bxjs@everyparhook@@compat
\@gobble\if\def\bxjs@tmpa{\@{\everypar{\everyparhook}\fi}}\fi
\directlua{
local function patchcmd(cs, code, from, to)
@@ -10199,7 +10452,7 @@
% \end{macrocode}
%
%^^A----------------
-%\subsection{フォント設定}
+% \subsection{フォント設定}
%
% T1エンコーディングに変更する。
% \Note 以下のコードは |\usepackage[T1]{fontenc}| と同等。
@@ -10264,7 +10517,13 @@
%^^A========================================================
% \section{和文ドライバ:pandoc \ZRX}
%
-% Pandoc用の何か。
+% 「Pandocモード」で使用される和文ドライバ。
+% standardドライバの機能を継承するが、
+% 「Pandocの既定のlatexテンプレート」が使われることを前提として、
+% それとBXJSの設定を整合させるための措置を加えている。
+%
+%^^A----------------
+% \subsection{準備}
%
% standardドライバの設定を引き継ぐ。
% \begin{macrocode}
@@ -10292,7 +10551,107 @@
% \end{macro}
%
%^^A----------------
-%\subsection{duploadシステム}
+% \subsection{和文ドライバパラメタ}
+%
+% keyvalのファミリは |bxjsPan| とする。
+%
+% \begin{macro}{\ifbxjs@jp@fix@strong}
+% 重要要素を補正するか。
+% \begin{macrocode}
+\newif\ifbxjs@jp@fix@strong \bxjs@jp@fix@strongtrue
+% \end{macrocode}
+% \end{macro}
+%
+% |fix-strong| オプションの処理。
+% \begin{macrocode}
+\let\bxjs@kv@fixstrong@true\bxjs@jp@fix@strongtrue
+\let\bxjs@kv@fixstrong@false\bxjs@jp@fix@strongfalse
+\define@key{bxjsPan}{fix-strong}[true]{%
+ \bxjs@set@keyval{fixstrong}{#1}{}}
+% \end{macrocode}
+%
+% \begin{macro}{\ifbxjs@jp@fix@code}
+% インラインコード要素を補正するか。
+% \begin{macrocode}
+\newif\ifbxjs@jp@fix@code \bxjs@jp@fix@codetrue
+% \end{macrocode}
+% \end{macro}
+%
+% |fix-code| オプションの処理。
+% \begin{macrocode}
+\let\bxjs@kv@fixcode@true\bxjs@jp@fix@codetrue
+\let\bxjs@kv@fixcode@false\bxjs@jp@fix@codefalse
+\define@key{bxjsPan}{fix-code}[true]{%
+ \bxjs@set@keyval{fixcode}{#1}{}}
+% \end{macrocode}
+%
+% \begin{macro}{\bxjs@jp@strong}
+% 重要要素に適用される書体変更の種類。
+% \begin{macrocode}
+\chardef\bxjs@jp@strong=0
+% \end{macrocode}
+% \end{macro}
+%
+% |strong| オプションの処理。
+% \begin{macrocode}
+\def\bxjs@kv@strong@bold{\chardef\bxjs@jp@strong=0 }
+\def\bxjs@kv@strong@sans{\chardef\bxjs@jp@strong=1 }
+\def\bxjs@kv@strong@boldsans{\chardef\bxjs@jp@strong=2 }
+\define@key{bxjsPan}{strong}{%
+ \bxjs@set@keyval{strong}{#1}{}}
+% \end{macrocode}
+%
+% \begin{macro}{\ifbxjs@jp@or@indent}
+% \begin{macro}{\ifbxjs@jp@or@secnumdepth}
+% \begin{macro}{\ifbxjs@jp@or@block@heading}
+% プレアンブルでのレイアウト上書きを許可するか。
+% 既定値は真。
+% \begin{macrocode}
+\newif\ifbxjs@jp@or@indent \bxjs@jp@or@indenttrue
+\newif\ifbxjs@jp@or@secnumdepth \bxjs@jp@or@secnumdepthtrue
+\newif\ifbxjs@jp@or@block@heading \bxjs@jp@or@block@headingtrue
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% クラスで |pandoc+| が指定された場合、内部和文パラメタ |_plus| が
+% 和文ドライバに渡される。
+% この場合、レイアウト上書きを禁止する。
+% \Note |_plus| は必ずパラメタ列の先頭にあるので、
+% 個別のパラメタ設定の方が常に優先される。
+% \begin{macrocode}
+\define@key{bxjsPan}{_plus}[]{%
+ \bxjs@jp@or@indentfalse
+ \bxjs@jp@or@secnumdepthfalse
+ \bxjs@jp@or@block@headingfalse}
+% \end{macrocode}
+%
+% レイアウト上書き許可オプション
+% (|or-indent|・|or-secnumdepth|・|or-block-heading|)の処理。
+% \begin{macrocode}
+\let\bxjs@kv@orindent@true\bxjs@jp@or@indenttrue
+\let\bxjs@kv@orindent@false\bxjs@jp@or@indentfalse
+\define@key{bxjsPan}{or-indent}[true]{%
+ \bxjs@set@keyval{orindent}{#1}{}}
+\let\bxjs@kv@orsecnumdepth@true\bxjs@jp@or@secnumdepthtrue
+\let\bxjs@kv@orsecnumdepth@false\bxjs@jp@or@secnumdepthfalse
+\define@key{bxjsPan}{or-secnumdepth}[true]{%
+ \bxjs@set@keyval{orsecnumdepth}{#1}{}}
+\let\bxjs@kv@orblockheading@true\bxjs@jp@or@block@headingtrue
+\let\bxjs@kv@orblockheading@false\bxjs@jp@or@block@headingfalse
+\define@key{bxjsPan}{or-block-heading}[true]{%
+ \bxjs@set@keyval{blockheading}{#1}{}}
+% \end{macrocode}
+%
+% 実際の |japaram| の値を適用する。
+% \begin{macrocode}
+\def\bxjs@next#1{\bxjs@safe@setkeys{bxjsPan}{#1}}
+\expandafter\bxjs@next\expandafter{\jsJaParam}
+% \end{macrocode}
+%
+%^^A----------------
+% \subsection{duploadシステム}
%
% パッケージが重複して読み込まれたときに“option clash”の
% 検査をスキップする。
@@ -10348,7 +10707,7 @@
% \end{macro}
%
%^^A----------------
-%\subsection{lang変数}
+% \subsection{lang変数}
% |lang=ja| という言語指定が行われると、
% Pandocはこれに対応していないため
% 不完全なBabelやPolyglossiaの設定を出力してしまう。
@@ -10404,6 +10763,14 @@
definitions will be employed}%
\bxjs@pandoc@polyglossia@ja
% \end{macrocode}
+% 言語名が |japanese| だった場合も同様。
+% \begin{macrocode}
+ }{\ifstrequal{##2}{japanese}{%
+ \ClassWarning\bxjs@clsname
+ {Main language is japanese, thus the fallback\MessageBreak
+ definitions will be employed}%
+ \bxjs@pandoc@polyglossia@ja
+% \end{macrocode}
% 言語名が非空ならば、本来の |polyglossia| の処理を実行する。
% \begin{macrocode}
}{%else
@@ -10415,7 +10782,7 @@
\noexpand\RequirePackage[\bxjs@polyglossia@options]{polyglossia}[]%
}\bxjs@next
\setmainlanguage[##1]{##2}%
- }}}
+ }}}}
% \end{macrocode}
%
% プレアンブルで |polyglossia| の読込が指示されなかった場合、
@@ -10432,6 +10799,9 @@
% Pandoc側で |lang=ja| が指定されていた場合の処理。
% この場合はPolyglossiaの処理を無効化するためにダミーの定義を行う。
% その時点でダミーの |\setotherlanguage(s)| を定義する。
+% \Note 現在ではPolyglossiaの日本語用の定義ファイル
+% (|gloss-japanese.ldf|)が存在するので、本来なら普通に処理できる
+% はずであるが、現状の定義ファイルはアレなので回避したい。
% \begin{macrocode}
\@onlypreamble\bxjs@pandoc@polyglossia@ja
\def\bxjs@pandoc@polyglossia@ja{%
@@ -10531,7 +10901,7 @@
% \end{macrocode}
%
%^^A----------------
-%\subsection{geometry変数}
+% \subsection{geometry変数}
% |geometry| を“再度読み込んだ”場合に、
% そのパラメタで |\setpagelayout*| が呼ばれるようにする。
%
@@ -10541,7 +10911,7 @@
% \end{macrocode}
%
%^^A----------------
-%\subsection{CJKmainfont変数}
+% \subsection{CJKmainfont変数}
% Lua{\TeX}(+ Lua{TeX}-ja)の場合に CJKmainfont 変数が
% 指定された場合は |\setmainjfont| の指定にまわす。
% \begin{macrocode}
@@ -10550,7 +10920,14 @@
\providecommand*{\setCJKmainfont}{\setmainjfont}
\fi
% \end{macrocode}
-% ムニャムニャムニャ。
+%
+%^^A----------------
+% \subsection{Option clash対策}
+%
+% |xeCJK| パッケージについて。
+% \Note |xeCJK| はクラス内で既に読み込まれているので、
+% |space| は(意図通りに)無効になる。
+% \Note v2.8~v2.9.2の間。
% \begin{macrocode}
\if x\jsEngine
\expandafter\g@addto@macro\csname opt@xeCJK.sty\endcsname{%
@@ -10559,7 +10936,67 @@
% \end{macrocode}
%
%^^A----------------
-%\subsection{paragraphのマーク}
+% \subsection{レイアウト上書き禁止}
+%
+% レイアウト上書き禁止の実装は |etoolbox| の機能を使う。
+% \begin{macrocode}
+\ifjsWitheTeX
+\@onlypreamble\bxjs@info@or@ban
+\def\bxjs@info@or@ban#1{%
+ \PackageInfo\bxjs@clsname
+ {Freeze layout on '#1',\MessageBreak detected}}
+% \end{macrocode}
+%
+% \paragraph{indentについて}
+% indent変数を指定しない場合に
+% 「段落表現形式をインデント方式に変更する」
+% 動作を抑止する。
+% \begin{macrocode}
+\unless\ifbxjs@jp@or@indent
+ \bxjs@info@or@ban{indent}
+% \end{macrocode}
+% |parskip| がある場合はそれを読み込もうとするため、
+% |parskip| の読込をブロックする。
+% \begin{macrocode}
+ \IfFileExists{parskip.sty}{%
+ \pandocSkipLoadPackage{parskip}%
+% \end{macrocode}
+% |parskip| がない場合はパラメタを変更しようとするため、
+% 該当のパラメタを復帰させる。
+% \begin{macrocode}
+ }{%else
+ \eappto\bxjs@endpreamble@hook{%
+ \parindent=\the\parindent\relax
+ \parskip=\the\parskip\relax}}
+\fi
+%
+% \paragraph{secnumdepthについて}
+% |secnumdepth| の値を決めるのはnumbersections変数
+% (|-N|/|--number-sections| オプションに連動する)
+% やsecnumdepth変数であるが、何れにしても |secnumdepth|
+% の値は書き換えられる。
+% そのため、|secnumdepth| を復帰させる。
+\ifbxjs@jp@or@secnumdepth\else
+ \bxjs@info@or@ban{secnumdepth}
+ \eappto\bxjs@endpreamble@hook{%
+ \c@secnumdepth=\the\c@secnumdepth\relax}
+\fi
+%
+% \paragraph{block-headingについて}
+\ifbxjs@jp@or@block@heading\else
+ \let\bxjs@frozen@paragraph\paragraph
+ \let\bxjs@frozen@subparagraph\subparagraph
+ \bxjs@info@or@ban{block-heading}
+ \appto\bxjs@endpreamble@hook{%
+ \let\oldparagraph\@undefined
+ \let\paragraph\bxjs@frozen@paragraph
+ \let\subparagraph\bxjs@frozen@subparagraph}
+\fi
+\fi
+% \end{macrocode}
+%
+%^^A----------------
+% \subsection{paragraphのマーク}
%
% BXJSクラスでは |\paragraph| の見出しの前に |\jsParagraphMark|
% で指定したマークが付加され、既定ではこれは“■”である。
@@ -10599,7 +11036,7 @@
% \end{macrocode}
%
%^^A----------------
-%\subsection{全角空白文字}
+% \subsection{全角空白文字}
%
% \begin{macrocode}
\ifnum0\if x\jsEngine1\fi\if l\jsEngine1\fi>\z@
@@ -10614,7 +11051,7 @@
% \end{macrocode}
%
%^^A----------------
-% \paragraph{hyperref対策}
+% \subsection{hyperref対策}
%
% |hyperref| の |unicode| オプションの固定を行う。
% \begin{macrocode}
@@ -10626,6 +11063,74 @@
% \end{macrocode}
%
%^^A----------------
+% \subsection{Pandoc要素に対する和文用の補正}
+%
+% \paragraph{重要要素}
+% 重要(Strong)要素に対する{\LaTeX}出力は |\textbf| となるが、
+% 代わりに |\strong| を使いたいため、
+% |\textbf| を書き換えてしまう(うわぁ)。
+% \begin{macrocode}
+\ifbxjs@jp@fix@strong\ifbxjs@jp@strong@cmd
+ \let\orgtextbf\textbf
+ \DeclareRobustCommand\bxjstextbf[1]{%
+ \begingroup
+ \let\textbf\orgtextbf
+ \strong{#1}%
+ \endgroup}%
+ \g@addto@macro\bxjs@begin@document@hook{%
+ \let\textbf\bxjstextbf}
+\fi\fi
+% \end{macrocode}
+%
+% |\strong| の書体を設定する。
+% \begin{macrocode}
+\jsAtEndOfClass{%
+ \ifx\strongfontdeclare\@undefined\else
+ \ifcase\bxjs@jp@strong
+ \or \strongfontdeclare{\sffamily}%
+ \or \strongfontdeclare{\sffamily\bfseries}%
+ \fi
+ \fi}
+% \end{macrocode}
+%
+% \paragraph{インラインコード要素}
+%
+% インラインコード(Code)要素に対する{\LaTeX}出力は |\texttt| となる。
+% |\texttt| の両端に欧文ゴーストが入るようにする。
+% \begin{macrocode}
+\ifbxjs@jp@fix@code
+ \chardef\bxjs@eghost@c=23
+ \ifx j\jsEngine \xspcode\bxjs@eghost@c=3
+ \else\ifx l\jsEngine \ltjsetparameter{alxspmode={\bxjs@eghost@c,3}}
+ \else\ifx x\jsEngine %no-op
+ \else \let\bxjs@eghost@c\@undefined
+ \fi\fi\fi
+ \ifx\bxjs@eghost@c\@undefined\else
+ \font\bxjs@eghost@f=ec-lmr10 at 1.23456pt
+ \def\bxjs@pan@eghost{\bgroup\bxjs@eghost@f\bxjs@eghost@c\egroup}
+ \let\orgtexttt\texttt
+ \DeclareRobustCommand\bxjstexttt[1]{%
+ \ifmmode \nfss@text{\ttfamily #1}%
+ \else
+ \ifvmode \leavevmode \fi
+ \bxjs@pan@eghost\null
+ \begingroup \ttfamily #1\endgroup
+ \null\bxjs@pan@eghost
+ \fi}
+ \g@addto@macro\bxjs@begin@document@hook{%
+ \let\texttt\bxjstexttt}
+% \end{macrocode}
+% さらに |\verb| の外側にも欧文ゴーストが入るようにする。
+% \Note |bxjaghost| の実装を参考にした。
+% \begin{macrocode}
+ \expandafter\def\expandafter\verb\expandafter{%
+ \expandafter\bxjs@pan@eghost\verb}
+ \g@addto@macro\verb@egroup{\bxjs@pan@eghost}
+ \fi
+\fi
+% \end{macrocode}
+%
+%^^A----------------
% \subsection{完了}
% おしまい。
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/bxjscls/bxjscls.ins b/Master/texmf-dist/source/latex/bxjscls/bxjscls.ins
index 0e533ebe34f..d763620d126 100644
--- a/Master/texmf-dist/source/latex/bxjscls/bxjscls.ins
+++ b/Master/texmf-dist/source/latex/bxjscls/bxjscls.ins
@@ -2,10 +2,10 @@
\def\batchfile{bxjscls.ins}
\input docstrip.tex
\keepsilent
-\generateFile{bxjsarticle.cls}{f}{\from{bxjscls.dtx}{cls,article}}
-\generateFile{bxjsreport.cls}{f}{\from{bxjscls.dtx}{cls,report}}
-\generateFile{bxjsbook.cls}{f}{\from{bxjscls.dtx}{cls,book}}
-\generateFile{bxjsslide.cls}{f}{\from{bxjscls.dtx}{cls,slide}}
+\generateFile{bxjsarticle.cls}{f}{\from{bxjscls.dtx}{class,article}}
+\generateFile{bxjsreport.cls}{f}{\from{bxjscls.dtx}{class,report}}
+\generateFile{bxjsbook.cls}{f}{\from{bxjscls.dtx}{class,book}}
+\generateFile{bxjsslide.cls}{f}{\from{bxjscls.dtx}{class,slide}}
\generateFile{bxjsja-minimal.def}{f}{\from{bxjscls.dtx}{drv,minimal}}
\generateFile{bxjsja-standard.def}{f}{\from{bxjscls.dtx}{drv,standard}}
\generateFile{bxjsja-modern.def}{f}{\from{bxjscls.dtx}{drv,modern}}
diff --git a/Master/texmf-dist/source/latex/bytefield/bytefield.dtx b/Master/texmf-dist/source/latex/bytefield/bytefield.dtx
index deb30c81bed..8af3e52bbff 100644
--- a/Master/texmf-dist/source/latex/bytefield/bytefield.dtx
+++ b/Master/texmf-dist/source/latex/bytefield/bytefield.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
-% Copyright (C) 2017 by Scott Pakin <scott+bf@pakin.org>
-% ------------------------------------------------------
+% Copyright (C) 2000-2020 by Scott Pakin <scott+bf@pakin.org>
+% -----------------------------------------------------------
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3a
@@ -22,7 +22,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{bytefield}
%<*package>
- [2017/09/15 v2.4 Network protocol diagrams]
+ [2020/10/31 v2.6 Network protocol diagrams]
%</package>
%
%<*driver>
@@ -35,6 +35,7 @@
\usepackage{calc}
\usepackage{array}
\usepackage{wasysym}
+\usepackage{needspace}
\usepackage{hyperxmp}
\usepackage{hypdoc}
\usepackage{hyperref}
@@ -45,7 +46,7 @@
pdfauthor={Scott Pakin},
pdfsubject={Protocol diagrams for LaTeX},
pdfkeywords={bits, bytes, bit fields, communication, network protocol diagrams, LaTeX2e, memory maps},
- pdfcopyright={Copyright (C) 2017, Scott Pakin},
+ pdfcopyright={Copyright (C) 2000-2020, Scott Pakin},
pdflicenseurl={http://www.latex-project.org/lppl/},
pdfcaptionwriter={Scott Pakin},
pdfcontactemail={scott+bf@pakin.org},
@@ -67,7 +68,7 @@
%</driver>
% \fi
%
-% \CheckSum{1028}
+% \CheckSum{1194}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -99,6 +100,19 @@
% \cs{endwordgroupl} with a \texttt{leftwordgroup} environment and
% also replacing a slew of user-visible lengths and macros with a
% single \cs{bytefieldsetup} macro}
+% \changes{v2.5}{2020/10/20}{Redefine the \protect\cs{bitbox},
+% \protect\cs{wordbox}, and \protect\cs{bitboxes} commands additionally
+% to accept key/value options}
+% \changes{v2.5}{2020/10/20}{Accept a new \protect\optname{bgcolor}
+% option to set a bit's background color}
+% \changes{v2.5}{2020/10/22}{Accept a new \protect\optname{perword}
+% option to execute a macro for each word in a word box. This addresses
+% a feature request by Victor Toni}
+% \changes{v2.6}{2020/10/29}{Accept new \protect\optname{curlystyle},
+% \protect\optname{leftcurlystyle}, and
+% \protect\optname{rightcurlystyle} options to control the styling
+% (e.g.,~color) of curly braces. This addresses a feature request by
+% Victor Toni}
%
% \GetFileInfo{bytefield.dtx}
%
@@ -129,7 +143,7 @@
%
% \title{The \textsf{bytefield} package\thanks{This document
% corresponds to \textsf{bytefield}~\fileversion, dated \filedate.}}
-% \author{Scott Pakin \\ \texttt{scott+bf@pakin.org}}
+% \author{Scott Pakin \\ \textit{scott+bf@pakin.org}}
%
% \sloppy
% \maketitle
@@ -271,10 +285,10 @@
% \item ``skipped words'' within fields.
% \end{itemize}
%
-% Because \pkgname{bytefield} draws its figures using only
-% the \LaTeX{} \texttt{picture} environment, these figures are not
-% specific to any particular backend, do not require PostScript support,
-% and do not need support from external programs. Furthermore, unlike an
+% Because \pkgname{bytefield} draws its figures using only the \LaTeX{}
+% \texttt{picture} environment, these figures are not specific to any
+% particular backend, do not require PostScript or PDF support, and do
+% not need support from external programs. Furthermore, unlike an
% imported graphic, \pkgname{bytefield} pictures can include arbitrary
% \LaTeX{} constructs, such as mathematical equations, |\ref|s and
% |\cite|s to the surrounding document, and macro calls.
@@ -372,12 +386,12 @@
% \label{sec:basic-cmds}
%
% This section explains how to use the \pkgname{bytefield} package. It
-% lists all the exported macros and environments in approximately
+% lists all of the exported macros and environments in approximately
% decreasing order of usefulness.
%
% \begin{decl}
% \SpecialEnvIndex{bytefield}
-% |\begin{bytefield}| \oarg{parameters} \marg{bit-width} \\
+% |\begin{bytefield}| \oarg{options} \marg{bit-width} \\
% \meta{fields} \\
% |\end{bytefield}|
% \end{decl}
@@ -385,19 +399,20 @@
% The \pkgname{bytefield} package's top-level environment is called, not
% surprisingly, ``|bytefield|''. It takes one mandatory argument, which
% is the number of bits in each word, and one optional argument, which
-% is a set of parameters, described in Section~\ref{sec:options}, for
-% formatting the bit-field's layout. One can think of a |bytefield| as
-% being analogous to a |tabular|: words are separated by~``|\\|'', and
-% fields within a word are separated by~``|&|''. As in a |tabular|,
-% ``|\\|'' accepts a \meta{length} as an optional argument, and this
-% specifies the amount of additional vertical whitespace to include
-% after the current word is typeset.
+% is a comma-separated list of \meta{key}=\meta{value} pairs, described
+% in Section~\ref{sec:options}, for formatting the bit-field's layout.
+% One can think of a |bytefield| as being analogous to a |tabular|:
+% words are separated by~``|\\|'', and fields within a word are
+% separated by~``|&|''. As in a |tabular|, ``|\\|'' accepts a
+% \meta{length} as an optional argument, and this specifies the amount
+% of additional vertical whitespace to include after the current word is
+% typeset.
%
% \begin{decl}
% \SpecialUsageIndex{\bitbox}
-% |\bitbox| \oarg{sides} \marg{width} \marg{text} \\
+% |\bitbox| \oarg{sides} \marg{width} \oarg{options} \marg{text} \\
% \SpecialUsageIndex{\wordbox}
-% |\wordbox| \oarg{sides} \marg{height} \marg{text}
+% |\wordbox| \oarg{sides} \marg{height} \oarg{options} \marg{text}
% \end{decl}
%
% The two main commands one uses within a \pkgname{bytefield}
@@ -406,16 +421,19 @@
% typesets a field that is an entire word wide and one or more words
% tall.
%
-% The optional argument, \meta{sides}, is a list of letters specifying
-% which sides of the field box to draw---[|l|]eft, [|r|]ight, [|t|]op,
-% and/or [|b|]ottom.\footnote{Uppercase |L|, |R|, |T|, and |B| undo a
-% prior |l|, |r|, |t|, or |b| and may be useful for writing wrapper
-% commands around \texttt{\string\bitbox} and
+% The first, optional, argument, \meta{sides}, is a list of letters
+% specifying which sides of the field box to draw---[|l|]eft, [|r|]ight,
+% [|t|]op, and/or [|b|]ottom.\footnote{Uppercase |L|, |R|, |T|, and |B|
+% undo a prior |l|, |r|, |t|, or |b| and may be useful for writing
+% wrapper commands around \texttt{\string\bitbox} and
% \texttt{\string\wordbox}.} The default is ``|lrtb|'' (i.e.,~all
-% sides are drawn). \meta{text} is the text to include within the
-% |\bitbox| or |\wordbox|. It is typeset horizontally centered within a
-% vertically centered |\parbox|. Hence, words will wrap, and ``|\\|''
-% can be used to break lines manually.
+% sides are drawn). The second, required, argument is the width in bits
+% of a bit box or the height in words of a word box. The third argument
+% is an optional, comma-separated list of \meta{key}=\meta{value} pairs,
+% described in Section~\ref{sec:options}. The fourth, required,
+% argument is the text to typeset within the box. It is typeset
+% horizontally centered within a vertically centered |\parbox|. Hence,
+% words will wrap, and ``|\\|'' can be used to break lines manually.
%
% The following example shows how to produce a simple 16-bit-wide field:
%
@@ -442,6 +460,35 @@
% mandatory argument to the |bytefield| environment);
% \pkgname{bytefield} does not currently check for under- or overruns.
%
+% Here's an example of using the \optname{bgcolor} option to fill each
+% box with a different color:
+%
+% \begin{verbatim}
+% \definecolor{lightcyan}{rgb}{0.84,1,1}
+% \definecolor{lightgreen}{rgb}{0.64,1,0.71}
+% \definecolor{lightred}{rgb}{1,0.7,0.71}
+% \begin{bytefield}[bitheight=\widthof{~Sign~},
+% boxformatting={\centering\small}]{32}
+% \bitheader[endianness=big]{31,23,0} \\
+% \bitbox{1}[bgcolor=lightcyan]{\rotatebox{90}{Sign}} &
+% \bitbox{8}[bgcolor=lightgreen]{Exponent} &
+% \bitbox{23}[bgcolor=lightred]{Mantissa}
+% \end{bytefield}
+% \end{verbatim}
+%
+% \begin{bffigure}
+% \definecolor{lightcyan}{rgb}{0.84,1,1}
+% \definecolor{lightgreen}{rgb}{0.64,1,0.71}
+% \definecolor{lightred}{rgb}{1,0.7,0.71}
+% \begin{bytefield}[bitheight=\widthof{~Sign~},
+% boxformatting={\centering\small}]{32}
+% \bitheader[endianness=big]{31,23,0} \\
+% \bitbox{1}[bgcolor=lightcyan]{\rotatebox{90}{Sign}} &
+% \bitbox{8}[bgcolor=lightgreen]{Exponent} &
+% \bitbox{23}[bgcolor=lightred]{Mantissa}
+% \end{bytefield}
+% \end{bffigure}
+%
% Within a |\bitbox| or |\wordbox|, the \pkgname{bytefield} package
% defines |\height|, |\depth|, |\totalheight|, and |\width| to the
% corresponding dimensions of the box. Section~\ref{sec:tricks} gives an
@@ -449,8 +496,8 @@
%
% \begin{decl}
% \SpecialUsageIndex{\bitboxes}
-% |\bitboxes| \oarg{sides} \marg{width} \marg{tokens} \\
-% |\bitboxes*| \oarg{sides} \marg{width} \marg{tokens} \\
+% |\bitboxes| \oarg{sides} \marg{width} \oarg{options} \marg{tokens} \\
+% |\bitboxes*| \oarg{sides} \marg{width} \oarg{options} \marg{tokens} \\
% \end{decl}
%
% The |\bitboxes| command provides a shortcut for typesetting a sequence
@@ -521,17 +568,17 @@
%
% \begin{decl}
% \SpecialUsageIndex{\bitheader}
-% |\bitheader| \oarg{parameters} \marg{bit-positions}
+% |\bitheader| \oarg{options} \marg{bit-positions}
% \end{decl}
%
% To make the bit field more readable, it helps to label bit positions
% across the top. The |\bitheader| command provides a flexible way to
-% do that. The optional argument is a set of parameters from the set
-% described in Section~\ref{sec:options}. In practice, the only
-% parameters that are meaningful in the context of |\bitheader| are
-% |bitformatting|, |endianness|, and |lsb|. See
-% Section~\ref{sec:options} for descriptions and examples of those
-% parameters.
+% do that. The optional argument is a comma-separated list of
+% \meta{key}=\meta{value} pairs from the set described in
+% Section~\ref{sec:options}. In practice, the only parameters that are
+% meaningful in the context of |\bitheader| are |bitformatting|,
+% |endianness|, and |lsb|. See Section~\ref{sec:options} for
+% descriptions and examples of those parameters.
%
% |\bitheader|'s mandatory argument, \meta{bit-positions}, is a
% comma-separated list of bit positions to label. For example,
@@ -565,12 +612,12 @@
%
% \begin{decl}
% \SpecialEnvIndex{rightwordgroup}
-% |\begin{rightwordgroup}| \marg{text} \\
+% |\begin{rightwordgroup}| \oarg{options} \marg{text} \\
% \meta{rows of bit boxes and word boxes} \\
% |\end{rightwordgroup}| \\
% \\
% \SpecialEnvIndex{leftwordgroup}
-% |\begin{leftwordgroup}| \marg{text} \\
+% |\begin{leftwordgroup}| \oarg{options} \marg{text} \\
% \meta{rows of bit boxes and word boxes} \\
% |\end{leftwordgroup}|
% \end{decl}
@@ -585,6 +632,12 @@
% |\end{|\meta{side}|wordgroup}| must lie right \emph{before} the end of
% the row (i.e.,~right before a ``|\\|'').
%
+% The optional argument is a comma-separated list of
+% \meta{key}=\meta{value} pairs from the set described in
+% Section~\ref{sec:options}. In practice, only \optname{curlystyle},
+% \optname{leftcurlystyle}, and \optname{rightcurlystyle}, make sense
+% within the context of a |\begin{|\meta{side}|wordgroup}|.
+%
% Unlike other \LaTeX\ environments, |rightwordgroup| and
% |leftwordgroup| do not have to nest properly with each other.
% However, they cannot overlap themselves. In other words,
@@ -691,12 +744,12 @@
%
% \begin{decl}
% \SpecialUsageIndex{\bytefieldsetup}
-% |\bytefieldsetup| \marg{key-value list}
+% |\bytefieldsetup| \marg{options}
% \end{decl}
%
% Alter the formatting of all subsequent bit fields.
% Section~\ref{sec:options} describes the possible values for each
-% \meta{key}=\meta{value} item in the comma-separated list that
+% \meta{key}=\meta{value} pair in the comma-separated list that
% |\bytefieldsetup| accepts as its argument. Note that changes made
% with |\bytefieldsetup| are local to their current scope. Hence, if
% used within an environment (e.g.,~|figure|), |\bytefieldsetup| does
@@ -709,7 +762,7 @@
% A document author can customize many of the \pkgname{bytefield}
% package's figure-formatting parameters, either globally or on a
% per-figure basis. The parameters described below can be specified in
-% four locations:
+% six locations:
%
% \begin{itemize}
% \item as package options (i.e.,~in the
@@ -726,6 +779,14 @@
% \item as the optional argument to a |\bitheader|, which affects only
% that particular header. (Only a few parameters are meaningful in
% this context.)
+%
+% \item as the optional argument to a |\begin{leftwordgroup}| or
+% |\begin{rightwordgroup}|, which affects only that particular word
+% group. (Only a few parameters are meaningful in this context.)
+%
+% \item as the second optional argument to a \cs{bitbox}, \cs{wordbox},
+% or \cs{bitboxes}, which affects only that particular box. (Only a
+% few parameters are meaningful in this context.)
% \end{itemize}
%
% Unfortunately, \LaTeX\ tends to abort with a ``\texttt{TeX capacity
@@ -753,7 +814,7 @@
%
% As a special case, if \optname{bitwidth} is set to the word
% ``|auto|'', it will be set to the width of ``|99i|'' in the current
-% bit-number formatting (cf.~\optname{bitformatting} below). This
+% bit-number formatting (see \optname{bitformatting} below). This
% feature provides a convenient way to adjust the bit width after a
% formatting change.
%
@@ -893,6 +954,17 @@
% \end{bffigure}
%
% \begin{decl}
+% \optname{bgcolor} = \meta{color}
+% \end{decl}
+%
+% Bit and word boxes are normally left unfilled. The \optname{bgcolor}
+% option fills them with a specified background color. A document will
+% need to include the \pkgname{color}, \pkgname{xcolor}, or similar
+% package to expose color names to \pkgname{bytefield}. The
+% \optname{boxformatting} option described above can be used to set the
+% foreground color.
+%
+% \begin{decl}
% \optname{leftcurly} = \meta{delimiter} \\
% \optname{rightcurly} = \meta{delimiter}
% \end{decl}
@@ -1024,6 +1096,55 @@
% different heights.
%
% \begin{decl}
+% \optname{leftcurlystyle} = \meta{command} \\
+% \optname{rightcurlystyle} = \meta{command} \\
+% \optname{curlystyle} = \meta{command}
+% \end{decl}
+%
+% Provide a macro that will be invoked before the code that draws left,
+% right, or both curly braces. The macro must accept either zero or one
+% argument. It can be used, for example, to color the curly brace:
+%
+% \begin{verbatim}
+% \begin{bytefield}[curlystyle=\color{blue}]{16}
+% \bitheader{0-15} \\
+% \begin{rightwordgroup}{Sign-extended}
+% \bitbox{4}{Tag} & \bitbox{12}{Data}
+% \end{rightwordgroup} \\
+% \end{bytefield}
+% \end{verbatim}
+%
+% \begin{bffigure}
+% \begin{bytefield}[curlystyle=\color{blue}]{16}
+% \bitheader{0-15} \\
+% \begin{rightwordgroup}{Sign-extended}
+% \bitbox{4}{Tag} & \bitbox{12}{Data}
+% \end{rightwordgroup} \\
+% \end{bytefield}
+% \end{bffigure}
+%
+% \noindent
+% or
+%
+% \begin{verbatim}
+% \begin{bytefield}{16}
+% \bitheader{0-15} \\
+% \begin{rightwordgroup}[curlystyle=\color{blue}]{Sign-extended}
+% \bitbox{4}{Tag} & \bitbox{12}{Data}
+% \end{rightwordgroup} \\
+% \end{bytefield}
+% \end{verbatim}
+%
+% \begin{bffigure}
+% \begin{bytefield}{16}
+% \bitheader{0-15} \\
+% \begin{rightwordgroup}[curlystyle=\color{blue}]{Sign-extended}
+% \bitbox{4}{Tag} & \bitbox{12}{Data}
+% \end{rightwordgroup} \\
+% \end{bytefield}
+% \end{bffigure}
+%
+% \begin{decl}
% \optname{lsb} = \meta{integer}
% \end{decl}
%
@@ -1067,6 +1188,42 @@
% \end{bytefield}
% \end{bffigure}
%
+% \begin{decl}
+% \optname{perword} = \meta{command}
+% \end{decl}
+%
+% Provide a macro that will be invoked once for each word in a word box
+% after the regular content is rendered. The macro will be passed two
+% arguments: the word number (starting from~0) and the total number of
+% words in the word box. Furthermore, the macro will be invoked within
+% a one-word-wide box positioned at the base of the word.
+% \optname{perword} can therefore be used for delineating words within a
+% word box, numbering words, or performing other such annotations. As a
+% simple example, the following code draws a gray line at the bottom of
+% each word in the ``Descriptive text'' word box:
+%
+% \begin{verbatim}
+% \newcommand{\wordline}[2]{\color[rgb]{0.7,0.7,0.7}\hrulefill}
+% \begin{bytefield}[bitwidth=4em]{8}
+% \bitheader[lsb=1,bitformatting=\small]{1-8} \\
+% \wordbox[lrt]{7}[perword=\wordline]{Descriptive text (60 bytes)} \\
+% \bitbox[lrb]{4}{} & \bitbox{4}{subsys data offset} \\
+% \bitbox{4}{subsys data offset} & \bitbox{2}{version} &
+% \bitbox{2}{endian indicator} \\
+% \end{bytefield}
+% \end{verbatim}
+%
+% \begin{bffigure}
+% \newcommand{\wordline}[2]{\color[rgb]{0.7,0.7,0.7}\hrulefill}
+% \begin{bytefield}[bitwidth=4em]{8}
+% \bitheader[lsb=1,bitformatting=\small]{1-8} \\
+% \wordbox[lrt]{7}[perword=\wordline]{Descriptive text (60 bytes)} \\
+% \bitbox[lrb]{4}{} & \bitbox{4}{subsys data offset} \\
+% \bitbox{4}{subsys data offset} & \bitbox{2}{version} &
+% \bitbox{2}{endian indicator} \\
+% \end{bytefield}
+% \end{bffigure}
+%
%
% \subsection{Common tricks}
% \label{sec:tricks}
@@ -1293,40 +1450,16 @@
% \end{bffigure}
%
% \paragraph{Unused bits}
-% Because |\width| and |\height| are defined within bit boxes (also word
-% boxes), we can represent unused bits by filling a |\bitbox| with a
-% rule of size |\width|~$\times$ |\height|:
-%
-% \begin{verbatim}
-% \begin{bytefield}{32}
-% \bitheader{0,4,8,12,16,20,24,28} \\
-% \bitbox{8}{Tag} & \bitbox{8}{Value} &
-% \bitbox{4}{\rule{\width}{\height}} &
-% \bitbox{12}{Mask} \\
-% \wordbox{1}{Key}
-% \end{bytefield}
-% \end{verbatim}
-%
-% \begin{bffigure}
-% \begin{bytefield}{32}
-% \bitheader{0,4,8,12,16,20,24,28} \\
-% \bitbox{8}{Tag} & \bitbox{8}{Value} &
-% \bitbox{4}{\rule{\width}{\height}} &
-% \bitbox{12}{Mask} \\
-% \wordbox{1}{Key}
-% \end{bytefield}
-% \end{bffigure}
-%
-% \noindent
-% The effect is much better when the \pkgname{color} package is used to
-% draw the unused bits in color. (Light gray looks nice.)
+% The \optname{bgcolor} option can be used to represent unused bits by
+% specifying a background fill color---light gray looks nice---and empty
+% text:
%
% \begin{verbatim}
% \definecolor{lightgray}{gray}{0.8}
% \begin{bytefield}{32}
% \bitheader{0,4,8,12,16,20,24,28} \\
% \bitbox{8}{Tag} & \bitbox{8}{Value} &
-% \bitbox{4}{\color{lightgray}\rule{\width}{\height}} &
+% \bitbox{4}[bgcolor=lightgray]{} &
% \bitbox{12}{Mask} \\
% \wordbox{1}{Key}
% \end{bytefield}
@@ -1337,7 +1470,7 @@
% \begin{bytefield}{32}
% \bitheader{0,4,8,12,16,20,24,28} \\
% \bitbox{8}{Tag} & \bitbox{8}{Value} &
-% \bitbox{4}{\color{lightgray}\rule{\width}{\height}} &
+% \bitbox{4}[bgcolor=lightgray]{} &
% \bitbox{12}{Mask} \\
% \wordbox{1}{Key}
% \end{bytefield}
@@ -1459,44 +1592,6 @@
%
% \subsection{Not-so-common tricks}
%
-% \paragraph{Colored fields}
-% A similar approach to that utilized to indicate unused bits can be
-% applied to coloring an individual bit field. The trick is to use the
-% \TeX\ |\rlap| primitive to draw a colored box that overlaps whatever
-% follows it to the right:
-%
-% \begin{verbatim}
-% \newcommand{\colorbitbox}[3]{%
-% \rlap{\bitbox{#2}{\color{#1}\rule{\width}{\height}}}%
-% \bitbox{#2}{#3}}
-% \definecolor{lightcyan}{rgb}{0.84,1,1}
-% \definecolor{lightgreen}{rgb}{0.64,1,0.71}
-% \definecolor{lightred}{rgb}{1,0.7,0.71}
-% \begin{bytefield}[bitheight=\widthof{~Sign~},
-% boxformatting={\centering\small}]{32}
-% \bitheader[endianness=big]{31,23,0} \\
-% \colorbitbox{lightcyan}{1}{\rotatebox{90}{Sign}} &
-% \colorbitbox{lightgreen}{8}{Exponent} &
-% \colorbitbox{lightred}{23}{Mantissa}
-% \end{bytefield}
-% \end{verbatim}
-%
-% \begin{bffigure}
-% \newcommand{\colorbitbox}[3]{^^A
-% \rlap{\bitbox{#2}{\color{#1}\rule{\width}{\height}}}^^A
-% \bitbox{#2}{#3}}^^A
-% \definecolor{lightcyan}{rgb}{0.84,1,1}
-% \definecolor{lightgreen}{rgb}{0.64,1,0.71}
-% \definecolor{lightred}{rgb}{1,0.7,0.71}
-% \begin{bytefield}[bitheight=\widthof{~Sign~},
-% boxformatting={\centering\small}]{32}
-% \bitheader[endianness=big]{31,23,0} \\
-% \colorbitbox{lightcyan}{1}{\rotatebox{90}{Sign}} &
-% \colorbitbox{lightgreen}{8}{Exponent} &
-% \colorbitbox{lightred}{23}{Mantissa}
-% \end{bytefield}
-% \end{bffigure}
-%
% \paragraph{Omitted bit numbers}
% It is occasionally convenient to show a wide bit field in which the
% middle numbers are replaced with an ellipsis. The trick to
@@ -1951,7 +2046,10 @@
%
% \section{Implementation}
%
-% \newcommand{\usermacro}{\marginpar{\vspace*{1ex}{\strut\hspace{18pt}\huge$\star$}\vspace*{-1ex}}}
+% \newcommand{\usermacro}{^^A
+% \Needspace{2\baselineskip}^^A
+% \marginpar{\huge\raisebox{-1.5ex}[0pt][1.5ex]{\strut\hspace{18pt}$\star$}\par}^^A
+% }
%
% This section contains the complete source code for \pkgname{bytefield}.
% Most users will not get much out of it, but it should be of use to
@@ -2018,7 +2116,7 @@
% \changes{v2.3}{2015/10/28}{Rewrote the macro based on discussions with
% David Carlisle to avoid producing ``\texttt{No room for a new
% \string\string\string\dimen}'' errors in newer versions of $\varepsilon$-\TeX\
-% (cf.~\url{http://tex.stackexchange.com/q/275042})}
+% (see \url{http://tex.stackexchange.com/q/275042})}
% \begin{macrocode}
\AtBeginDocument{%
\expandafter\ifx\csname e@alloc\endcsname\relax
@@ -2057,7 +2155,8 @@
\newlength{\bytefield@height@increment}
\DeclareRobustCommand{\inc@bytefield@height}[1]{%
\setlength{\bytefield@height@increment}{#1}%
- \global\advance\bytefield@height by \bytefield@height@increment}
+ \global\advance\bytefield@height by \bytefield@height@increment
+}
% \end{macrocode}
% \end{macro}
%
@@ -2125,9 +2224,11 @@
% \begin{macrocode}
\vbox\bgroup\ialign\bgroup##\amp##\amp##\cr\amp
}{%
+ \unskip
\amp\show@wordlabelr\cr\egroup\egroup
\end{lrbox}%
- \usebox{\entire@bytefield@picture}}
+ \usebox{\entire@bytefield@picture}%
+}
% \end{macrocode}
% \end{environment}
%
@@ -2187,35 +2288,151 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\bf@call@box@cmd}
+% \begin{macro}{\bf@call@box@func}
+% Define any box-drawing macro that accepts the same set of four
+% arguments. It takes as input the name of a macro that is defined with
+% formal parameters |[#1]#2[#3]#4|. \cs{bf@call@box@cmd} then invokes
+% that macro, passing it a set of lines to draw out of the set
+% ``\texttt{lrtbLRTB}''~(|#1|), a number of bits or words~(|#2|), a list
+% of key/value pairs~(|#3|), and arbitrary text to typeset~(|#4|).
+% \begin{macrocode}
+\newcommand*{\bf@call@box@cmd}[1]{%
+ \def\bf@call@box@func{#1}%
+ \bf@call@box@cmd@i
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bf@call@box@cmd@i}
+% \begin{macro}{\bf@call@box@arg@i}
+% \begin{macro}{\bf@call@box@arg@ii}
+% Store the set of lines and the bit/word count and invoke
+% \cs{bf@call@box@cmd@ii}.
+% \begin{macrocode}
+\newcommand*{\bf@call@box@cmd@i}[2][lrtb]{%
+ \def\bf@call@box@arg@i{#1}%
+ \def\bf@call@box@arg@ii{#2}%
+ \bf@call@box@cmd@ii
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bf@call@box@cmd@ii}
+% \begin{macro}{\bf@call@box@arg@iii}
+% \begin{macro}{\bf@call@box@arg@iv}
+% Store the key/value parameters and the text to typeset then invoke the
+% macro originally passed to \cs{bf@call@box@cmd}.
+% \begin{macrocode}
+\newcommand*{\bf@call@box@cmd@ii}[2][]{%
+ \def\bf@call@box@arg@iii{#1}%
+ \def\bf@call@box@arg@iv{#2}%
+ \bf@call@box@func
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\bitbox}
% \usermacro
-% Put some text (|#3|) in a box that's a given number of bits (|#2|)
-% wide and one byte tall. An optional argument (|#1|) specifies which
+% Put some text~(|#4|) in a box that's a given number of bits~(|#2|)
+% wide and one byte tall. An optional argument~(|#1|) specifies which
% lines to draw---|[l]|eft, |[r]|ight, |[t]|op, and/or |[b]|ottom
-% (default: |lrtb|). Uppercase letters suppress drawing the |[L]|eft,
-% |[R]|ight, |[T]|op, and/or |[B]|ottom sides.
+% (default: |lrtb|). Uppercase letters provide the opposite effect:
+% They suppress drawing the |[L]|eft, |[R]|ight, |[T]|op, and/or
+% |[B]|ottom sides. Additional drawing parameters can be provided via
+% another optional argument~(|#3|).
+% \begin{macrocode}
+\DeclareRobustCommand{\bitbox}{\bf@call@box@cmd{\bf@bitbox}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bf@bitbox}
+% Implement all of the \cs{bitbox} logic.
+% \begin{macrocode}
+\def\bf@bitbox{%
+ \bgroup
+ \expandafter\bf@parse@bitbox@arg\expandafter{\bf@call@box@arg@i}%
+ \setlength{\units@wide}{\bf@bitwidth * \bf@call@box@arg@ii}%
+ \expandafter\bf@bytefieldsetup\expandafter{\bf@call@box@arg@iii}%
+ \@ifundefined{bf@bgcolor}{%
+ }{%
+% \end{macrocode}
+% If \optname{bgcolor} was specified, draw a colored rule of the full
+% size of the box.
% \begin{macrocode}
-\DeclareRobustCommand{\bitbox}[3][lrtb]{%
- \setlength{\units@wide}{\bf@bitwidth * #2}%
- \bf@parse@bitbox@arg{#1}%
- \draw@bit@picture{\strip@pt\units@wide}{\strip@pt\bf@bitheight}{#3}}
+ \rlap{%
+ \draw@bit@picture{\strip@pt\units@wide}{\strip@pt\bf@bitheight}{%
+ \color{\bf@bgcolor}%
+ \rule{\width}{\height}%
+ }%
+ }%
+ }%
+% \end{macrocode}
+% Draw the user-provided text on top of the rule (if any).
+% \begin{macrocode}
+ \draw@bit@picture{\strip@pt\units@wide}{\strip@pt\bf@bitheight}{%
+ \bf@call@box@arg@iv
+ }%
+ \egroup
+ \ignorespaces
+}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\wordbox}
% \usermacro
-% Put some text (|#3|) in a box that's a given number of bytes (|#2|)
-% tall and one word (|\bits@wide| bits) wide.
-% An optional argument (|#1|) specifies which lines to draw---|[l]|eft,
-% |[r]|ight, |[t]|op, and/or |[b]|ottom (default: |lrtb|). Uppercase
-% letters suppress drawing the |[L]|eft, |[R]|ight, |[T]|op, and/or
-% |[B]|ottom sides.
-% \begin{macrocode}
-\DeclareRobustCommand{\wordbox}[3][lrtb]{%
- \setlength{\units@wide}{\bf@bitwidth * \bits@wide}%
- \setlength{\units@tall}{\bf@bitheight * #2}%
- \bf@parse@bitbox@arg{#1}%
- \draw@bit@picture{\strip@pt\units@wide}{\strip@pt\units@tall}{#3}}
+% Put some text~(|#4|) in a box that's a given number of bytes~(|#2|)
+% tall and one word (|\bits@wide| bits) wide. An optional
+% argument~(|#1|) specifies which lines to draw---|[l]|eft, |[r]|ight,
+% |[t]|op, and/or |[b]|ottom (default: |lrtb|). Uppercase letters
+% provide the opposite effect: They suppress drawing the |[L]|eft,
+% |[R]|ight, |[T]|op, and/or |[B]|ottom sides. Additional drawing
+% parameters can be provided via another optional argument~(|#3|).
+% \begin{macrocode}
+\DeclareRobustCommand{\wordbox}{\bf@call@box@cmd{\bf@wordbox}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bf@wordbox}
+% Implement all of the \cs{wordbox} logic.
+% \begin{macrocode}
+\def\bf@wordbox{%
+ \bgroup
+ \expandafter\bf@parse@bitbox@arg\expandafter{\bf@call@box@arg@i}%
+ \setlength{\units@wide}{\bf@bitwidth * \bits@wide}%
+ \setlength{\units@tall}{\bf@bitheight * \bf@call@box@arg@ii}%
+ \expandafter\bf@bytefieldsetup\expandafter{\bf@call@box@arg@iii}%
+ \@ifundefined{bf@bgcolor}{%
+ }{%
+% \end{macrocode}
+% If \optname{bgcolor} was specified, draw a colored rule of the full
+% size of the box.
+% \begin{macrocode}
+ \rlap{%
+ \draw@bit@picture{\strip@pt\units@wide}{\strip@pt\units@tall}{%
+ \color{\bf@bgcolor}%
+ \rule{\width}{\height}%
+ }%
+ }%
+ }%
+% \end{macrocode}
+% Draw the user-provided text on top of the rule (if any).
+% \begin{macrocode}
+ \draw@bit@picture{\strip@pt\units@wide}{\strip@pt\units@tall}{%
+ \bf@call@box@arg@iv
+ }%
+% \end{macrocode}
+% Invoke the user-provided \cs{bf@per@word} macro once per word.
+% \begin{macrocode}
+ \@ifundefined{bf@per@word}{}{\bf@invoke@per@word{\bf@call@box@arg@ii}}%
+ \egroup
+ \ignorespaces
+}
% \end{macrocode}
% \end{macro}
%
@@ -2233,40 +2450,13 @@
\DeclareRobustCommand{\draw@bit@picture}[3]{%
\begin{picture}(#1,#2)%
% \end{macrocode}
-% \begin{macro}{\height}
-% \usermacro
-% \begin{macro}{\depth}
-% \usermacro
-% \begin{macro}{\totalheight}
-% \usermacro
-% \begin{macro}{\width}
-% \usermacro
-% \begin{macro}{\widthunits}
-% \usermacro
-% \begin{macro}{\heightunits}
-% \usermacro
% First, we plot the user's text, with all sorts of useful lengths
% predefined.
% \begin{macrocode}
\put(0,0){\makebox(#1,#2){\parbox{#1\unitlength}{%
- \bf@newdimen\height
- \bf@newdimen\depth
- \bf@newdimen\totalheight
- \bf@newdimen\width
- \height=#2\unitlength
- \depth=0pt%
- \totalheight=#2\unitlength
- \width=#1\unitlength
- \def\widthunits{#1}%
- \def\heightunits{#2}%
+ \bf@set@user@dimens{#1}{#2}%
\bf@boxformatting{#3\par}}}}%
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
% Next, we draw each line individually. I suppose we could make a special
% case for ``all lines'' and use a |\framebox| above, but the following
% works just fine.
@@ -2294,9 +2484,77 @@
\inc@bytefield@height{\unitlength * \real{#2}}%
\global\counting@wordsfalse
\fi
- \ignorespaces}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bf@invoke@per@word}
+% Invoke \cs{bf@per@word} once per word, passing it the (0-indexed) word
+% number and total number of words.
+% \begin{macrocode}
+\newcommand{\bf@invoke@per@word}[1]{%
+ \begin{picture}(0,0)%
+ \@tempcnta=0
+ \@tempdima=#1\bf@bitheight
+% \end{macrocode}
+% Make various useful dimensions available to \cs{bf@per@word}.
+% \begin{macrocode}
+ \bf@set@user@dimens{\strip@pt\units@wide}{\strip@pt\units@tall}%
+ \loop
+ \advance\@tempdima by -\bf@bitheight
+ \bgroup
+ \put(-\strip@pt\units@wide, \strip@pt\@tempdima){%
+ \expandafter\bf@per@word\expandafter{\the\@tempcnta}{#1}%
+ }%
+ \egroup
+ \advance\@tempcnta by 1\relax
+ \ifnum#1>\@tempcnta
+ \repeat
+ \end{picture}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bf@set@user@dimens}
+% \mbox{}\vspace*{-1ex}
+% \begin{macro}{\width}
+% \usermacro
+% \begin{macro}{\height}
+% \usermacro
+% \begin{macro}{\depth}
+% \usermacro
+% \begin{macro}{\totalheight}
+% \usermacro
+% \begin{macro}{\widthunits}
+% \usermacro
+% \begin{macro}{\heightunits}
+% \usermacro
+% Given a width in bits~(|#1|) and a height in words~(|#2|), make a
+% number of box dimensions available to the author: \cs{width},
+% \cs{height}, \cs{depth}, \cs{totalheight}. Additionally, make the
+% arguments available to the author via the \cs{widthunits} and
+% \cs{heightunits} macros.
+% \begin{macrocode}
+\newcommand{\bf@set@user@dimens}[2]{%
+ \bf@newdimen\width
+ \bf@newdimen\height
+ \bf@newdimen\depth
+ \bf@newdimen\totalheight
+ \width=#1\unitlength
+ \height=#2\unitlength
+ \depth=0pt%
+ \totalheight=#2\unitlength
+ \def\widthunits{#1}%
+ \def\heightunits{#2}%
+}
% \end{macrocode}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}{\bitboxes}
% \usermacro
@@ -2312,7 +2570,9 @@
% command omits interior left and right lines.
% \begin{macrocode}
\DeclareRobustCommand{\bitboxes}{%
- \@ifstar\bf@bitboxes@star\bf@bitboxes@no@star
+ \@ifstar
+ {\bf@call@box@cmd{\bf@bitboxes@star}}%
+ {\bf@call@box@cmd{\bf@bitboxes@no@star}}%
}
% \end{macrocode}
% \end{macro}
@@ -2328,112 +2588,114 @@
% \end{macro}
%
% \begin{macro}{\bf@bitboxes@no@star}
-% Implement the unstarred version of |\bitboxes|.
+% Implement the unstarred version of \cs{bitboxes}. This macro simply
+% expands its text argument into a list of tokens followed by \cs{relax}
+% then invokes \cs{bf@bitboxes@no@star@i}.
% \begin{macrocode}
-\newcommand{\bf@bitboxes@no@star}[3][lrtb]{%
+\def\bf@bitboxes@no@star{%
+ \expandafter\bf@bitboxes@no@star@i\bf@call@box@arg@iv\relax
+ \ignorespaces
+}
% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\bf@bitboxes@no@star@i}
-% Define a helper macro that walks the final argument of
-% |\bf@bitboxes@no@star| token-by-token.
-% \begin{macrocode}
- \def\bf@bitboxes@no@star@i##1{%
+% Walk the subsequent tokens one-by-one until \cs{relax} is encountered.
+% For each token, invoke \cs{bf@bitbox} (the internal version of
+% \cs{bitbox} for which \cs{bf@call@box@arg@}\meta{number} are all
+% defined.
+% \begin{macrocode}
+\def\bf@bitboxes@no@star@i#1{%
+ \def\bf@call@box@arg@iv{#1}%
+ \ifx\bf@call@box@arg@iv\bf@relax
+ \let\next=\relax
+ \else
+ \bf@bitbox
+ \let\next=\bf@bitboxes@no@star@i
+ \fi
+ \next
+}
% \end{macrocode}
-% \begin{macro}{\bf@bitboxes@arg}
-% \begin{macro}{\next}
-% Store the current argument token in |\bf@bitboxes@arg| for use with |\ifx|.
-% \begin{macrocode}
- \def\bf@bitboxes@arg{##1}%
- \ifx\bf@bitboxes@arg\bf@relax
- \let\next=\relax
- \else
- \bitbox[#1]{#2}{##1}%
- \let\next=\bf@bitboxes@no@star@i
- \fi
- \next
- }%
- \bf@bitboxes@no@star@i#3\relax
+% \end{macro}
+%
+% \begin{macro}{\bf@bitboxes@star}
+% \begin{macro}{\bf@bitboxes@sides}
+% Implement the starred version of \cs{bitboxes}. This macro simply
+% stores the original \meta{sides} argument in \cs{bf@bitboxes@sides},
+% expands its text argument into a list of tokens followed by two
+% \cs{relax}es, and invokes \cs{bf@bitboxes@star@i}.
+% \begin{macrocode}
+\def\bf@bitboxes@star{%
+ \edef\bf@bitboxes@sides{\bf@call@box@arg@i}%
+ \expandafter\bf@bitboxes@star@i\bf@call@box@arg@iv\relax\relax
\ignorespaces
}
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\bf@bitboxes@star}
-% Implement the starred version of |\bitboxes|.
-% \begin{macrocode}
-\newcommand{\bf@bitboxes@star}[3][lrtb]{%
-% \end{macrocode}
% \begin{macro}{\bf@bitboxes@star@i}
-% If the argument to |\bitboxes*| contains a single (or no) token,
-% simply pass control to |\bitbox| and stop. Otherwise, suppress the
-% box's right border by appending ``|R|'' to |\bitboxes*|'s
-% argument~|#1| and proceeding with the remaining tokens in~|#3|.
-% \begin{macrocode}
- \def\bf@bitboxes@star@i##1##2{%
-% \end{macrocode}
-% \begin{macro}{\bf@bitboxes@arg}
-% \begin{macro}{\next}
-% Store the current argument token in |\bf@bitboxes@arg| for use with |\ifx|.
-% \begin{macrocode}
- \def\bf@bitboxes@arg{##2}%
- \ifx\bf@bitboxes@arg\bf@relax
- \bitbox[#1]{#2}{##1}%
- \let\next=\relax
- \else
- \bitbox[#1R]{#2}{##1}%
- \def\next{\bf@bitboxes@star@ii{##2}}%
- \fi
- \next
- }%
-% \end{macrocode}
-% \begin{macro}{\bf@bitboxes@star@ii}
-% Process all tokens in |\bitboxes*|'s argument |#3| following the first
-% argument. For each token, produce a box with the left side suppressed
-% using~``|L|''.
-% \begin{macrocode}
- \def\bf@bitboxes@star@ii##1##2{%
-% \end{macrocode}
-% \begin{macro}{\bf@bitboxes@arg@i}
+% \begin{macro}{\bf@call@box@arg@iv}
% \begin{macro}{\bf@bitboxes@arg@ii}
-% \begin{macro}{\bf@bitboxes@sides}
% \begin{macro}{\next}
-% Store the next two argument tokens in |\bf@bitboxes@arg@i| and
-% |\bf@bitboxes@arg@i| for use with |\ifx|. We use those to set
-% |\bf@bitboxes@sides| to |\bitbox*|'s argument~|#1| with the left side
-% and, for the final token, the right side suppressed.
-% \begin{macrocode}
- \def\bf@bitboxes@arg@i{##1}%
- \def\bf@bitboxes@arg@ii{##2}%
- \ifx\bf@bitboxes@arg@ii\bf@relax
- \def\bf@bitboxes@sides{#1L}%
- \else
- \def\bf@bitboxes@sides{#1LR}%
- \fi
- \ifx\bf@bitboxes@arg@i\bf@relax
- \let\next=\relax
- \else
- \expandafter\bitbox\expandafter[\bf@bitboxes@sides]{#2}{##1}%
- \def\next{\bf@bitboxes@star@ii{##2}}%
- \fi
- \next
- }%
-% \end{macrocode}
-% \begin{macrocode}
- \bf@bitboxes@star@i#3\relax\relax
- \ignorespaces
+% Process the first token in the text argument passed to \cs{bitboxes*}.
+% If it's also the last token (indicated by its being followed by
+% \cs{relax}), draw an ordinary bit box with all sides present. If it's
+% not the last token, draw a bit box with the right side suppressed and
+% invoke \cs{bf@bitboxes@star@ii} on the remaining tokens.
+% \begin{macrocode}
+\def\bf@bitboxes@star@i#1#2{%
+ \def\bf@call@box@arg@iv{#1}%
+ \def\bf@bitboxes@arg@ii{#2}%
+ \ifx\bf@bitboxes@arg@ii\bf@relax
+ \bf@bitbox
+ \let\next=\relax
+ \else
+ \edef\bf@call@box@arg@i{\bf@bitboxes@sides R}%
+ \bf@bitbox
+ \def\next{\bf@bitboxes@star@ii{#2}}%
+ \fi
+ \next
}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
+%
+% \begin{macro}{\bf@bitboxes@star@ii}
+% \begin{macro}{\bf@call@box@arg@iv}
+% \begin{macro}{\bf@bitboxes@arg@ii}
+% \begin{macro}{\next}
+% Process the second and subsequent tokens in the text argument passed
+% to \cs{bitboxes*}. If the next token in the stream is the final one
+% (indicated by its being followed by \cs{relax}), draw a bit box with
+% the left side suppressed. If it's not the final token, draw a bit box
+% with both the left and right sides suppressed and invoke itself
+% recursively on the remaining tokens.
+% \begin{macrocode}
+\def\bf@bitboxes@star@ii#1#2{%
+ \def\bf@call@box@arg@iv{#1}%
+ \def\bf@bitboxes@arg@ii{#2}%
+ \ifx\bf@bitboxes@arg@ii\bf@relax
+ \edef\bf@call@box@arg@i{\bf@bitboxes@sides L}%
+ \else
+ \edef\bf@call@box@arg@i{\bf@bitboxes@sides LR}%
+ \fi
+ \ifx\bf@call@box@arg@iv\bf@relax
+ \let\next=\relax
+ \else
+ \bf@bitbox
+ \def\next{\bf@bitboxes@star@ii{#2}}%
+ \fi
+ \next
+}
+% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
+%
%
% \subsubsection{Parsing arguments}
%
@@ -2470,7 +2732,8 @@
\bitbox@bottomfalse
\bitbox@leftfalse
\bitbox@rightfalse
- \bf@parse@bitbox@sides#1X}
+ \bf@parse@bitbox@sides#1X%
+}
% \end{macrocode}
% \end{macro}
%
@@ -2516,7 +2779,8 @@
\fi
\fi
\expandafter\bf@parse@bitbox@sides
- \fi}
+ \fi
+}
% \end{macrocode}
% \end{macro}
%
@@ -2552,7 +2816,8 @@
\ifcounting@words
\inc@bytefield@height{\unitlength * \real{\num@tall}}%
\global\counting@wordsfalse
- \fi}
+ \fi
+}
% \end{macrocode}
% \end{macro}
%
@@ -2604,7 +2869,8 @@
\inc@bytefield@height{\unitlength * \real{\strip@pt\units@tall}}%
\global\counting@wordsfalse
\fi
- \ignorespaces}
+ \ignorespaces
+}
% \end{macrocode}
% \end{macro}
%
@@ -2621,7 +2887,8 @@
\else
\bf@parse@range#1-#1-#1\relax
\expandafter\bf@parse@range@list
- \fi}
+ \fi
+}
% \end{macrocode}
% \end{macro}
%
@@ -2664,7 +2931,8 @@
\makebox(\strip@pt\bf@bitwidth,\strip@pt\units@tall){%
\bf@bitformatting{\theheader@val}}}
\addtocounter{header@val}{1}
- \repeat}
+ \repeat
+}
% \end{macrocode}
% \end{macro}
%
@@ -2775,6 +3043,17 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\bf@leftcurlystyle}
+% \begin{macro}{\bf@rightcurlystyle}
+% Define the default formatting for left and right curly braces as ``do
+% nothing special''.
+% \begin{macrocode}
+\let\bf@leftcurlystyle=\relax
+\let\bf@rightcurlystyle=\relax
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\curly@box}
% Define a box in which to temporarily store formatted curly braces.
% \changes{v1.2}{2004/06/14}{Bug fix: Defined \cs{curly@box} globally
@@ -2806,11 +3085,13 @@
\setlength{\curly@shift}{\half@curly@height + 0.5\curly@shift}%
\global\sbox{#1}{\raisebox{\curly@shift}{%
$\xdef\old@axis{\the\fontdimen22\textfont2}$%
- $\fontdimen22\textfont2=0pt%
- \left.
- \vrule height\half@curly@height
- width 0pt
- depth\half@curly@height\right\bf@rightcurly$%
+ \bf@rightcurlystyle{%
+ $\fontdimen22\textfont2=0pt%
+ \left.
+ \vrule height\half@curly@height
+ width 0pt
+ depth\half@curly@height\right\bf@rightcurly$%
+ }%
$\fontdimen22\textfont2=\old@axis$}}%
\endgroup
}
@@ -2839,11 +3120,13 @@
\setlength{\curly@shift}{\half@curly@height + 0.5\curly@shift}%
\global\sbox{#1}{\raisebox{\curly@shift}{%
$\xdef\old@axis{\the\fontdimen22\textfont2}$%
- $\fontdimen22\textfont2=0pt%
- \left\bf@leftcurly
- \vrule height\half@curly@height
- width 0pt
- depth\half@curly@height\right.$%
+ \bf@leftcurlystyle{%
+ $\fontdimen22\textfont2=0pt%
+ \left\bf@leftcurly
+ \vrule height\half@curly@height
+ width 0pt
+ depth\half@curly@height\right.$%
+ }%
$\fontdimen22\textfont2=\old@axis$}}%
\endgroup
}
@@ -2878,12 +3161,17 @@
%
% \begin{environment}{rightwordgroup}
% \usermacro
-% Label the words defined between |\begin{rightwordgroup}| and |\end{rightwordgroup}|
-% on the right side of the bit field.
-% The argument is the text of the label. The label is typeset to the
-% right of a large curly brace, which groups the words together.
-% \begin{macrocode}
-\newenvironment{rightwordgroup}[1]{%
+% Label the words defined between |\begin{rightwordgroup}| and
+% |\end{rightwordgroup}| on the right side of the bit field. The first,
+% optional, argument is a list of parameters, as defined in
+% Section~\ref{sec:options}. The second, mandatory, argument is the
+% text of the label. The label is typeset to the right of a large curly
+% brace, which groups the words together.
+% \changes{v2.6}{2020/10/29}{Suppress spaces following the
+% \protect\cs{end}\protect\texttt{\{rightwordgroup\}}}
+% \changes{v2.6}{2020/10/31}{Accept key/value options}
+% \begin{macrocode}
+\newenvironment{rightwordgroup}[2][]{%
% \end{macrocode}
% We begin by ending the group that |\begin{rightwordgroup}| created. This
% lets the |rightwordgroup| environment span rows (because we're technically
@@ -2892,21 +3180,25 @@
\endgroup
% \end{macrocode}
% \begin{macro}{\wordlabelr@start}
+% \begin{macro}{\wordlabelr@params}
% \begin{macro}{\wordlabelr@text}
-% |\begin{rightwordgroup}| merely stores the starting height in |\wordlabelr@start|
-% and the user-supplied text in |\wordlabelr@text|. |\end{rightwordgroup}|
-% does most of the work.
+% |\begin{rightwordgroup}| merely stores the starting height in
+% |\wordlabelr@start| and the user-supplied text in |\wordlabelr@text|.
+% |\end{rightwordgroup}| does most of the work.
% \begin{macrocode}
\global\wordlabelr@start=\bytefield@height
- \gdef\wordlabelr@text{#1}%
+ \gdef\wordlabelr@params{#1}%
+ \gdef\wordlabelr@text{#2}%
\ignorespaces
}{%
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
% \begin{macro}{\wordlabelr@end}
-% Because we already ended the group that |\begin{rightwordgroup}| created
-% we now have to begin a group for |\end{rightwordgroup}| to end.
+% Because we already ended the group that |\begin{rightwordgroup}|
+% created we now have to begin a group for |\end{rightwordgroup}| to
+% end.
% \begin{macrocode}
\begingroup
\global\wordlabelr@end=\bytefield@height
@@ -2922,23 +3214,32 @@
% \begin{macrocode}
\gdef\show@wordlabelr{%
\sbox{\word@label@box}{%
- \begin{tabular}[b]{@{}l@{}}\wordlabelr@text\end{tabular}}%
+ \begin{tabular}[b]{@{}l@{}}\wordlabelr@text\end{tabular}%
+ }%
\settowidth{\label@box@width}{\usebox{\word@label@box}}%
\setlength{\label@box@height}{\wordlabelr@end-\wordlabelr@start}%
+% \end{macrocode}
+% Evaluate any parameters passed to |\begin{rightwordgroup}| right
+% before we render the curly brace.
+% \begin{macrocode}
+ \expandafter\bf@bytefieldsetup\expandafter{\wordlabelr@params}%
\store@rcurly{\curly@box}{\label@box@height}%
\bf@newdimen\total@box@width
\setlength{\total@box@width}{%
\bf@rightcurlyspace +
\widthof{\usebox{\curly@box}} +
\bf@rightlabelspace +
- \label@box@width}%
+ \label@box@width
+ }%
\begin{picture}(\strip@pt\total@box@width,0)
\put(0,0){%
\hspace*{\bf@rightcurlyspace}%
\usebox{\curly@box}%
\hspace*{\bf@rightlabelspace}%
\makebox(\strip@pt\label@box@width,\strip@pt\label@box@height){%
- \usebox{\word@label@box}}}
+ \usebox{\word@label@box}%
+ }%
+ }%
\end{picture}%
% \end{macrocode}
% The last thing |\show@wordlabelr| does is redefine itself back to a no-op.
@@ -2953,7 +3254,7 @@
% |\begin|.
% \begin{macrocode}
\def\@currenvir{rightwordgroup}%
- \ignorespaces
+ \ignorespacesafterend
}
% \end{macrocode}
% \end{macro}
@@ -3017,25 +3318,28 @@
% there will eventually be enough space to accomodate the label, we know
% that the label won't overlap the bit field or extend beyond the bit-field
% boundaries.
+% \changes{v2.6}{2020/10/29}{Suppress spaces following the
+% \protect\cs{end}\protect\texttt{\{leftwordgroup\}}}
+% \changes{v2.6}{2020/10/31}{Accept key/value options}
% \begin{macrocode}
-\newenvironment{leftwordgroup}[1]{%
-% \end{macrocode}
-% We begin by ending the group that |\begin{rightwordgroup}| created. This
-% lets the |leftwordgroup| environment span rows (because we're technically
-% no longer within the environment).
-% \begin{macrocode}
- \endgroup
+\newenvironment{leftwordgroup}[2][]{%
% \end{macrocode}
% \begin{macro}{\wordlabell@start}
+% \begin{macro}{\wordlabell@params}
% \begin{macro}{\wordlabell@text}
-% We store the starting height and label text, which are needed by the
-% |\end{leftwordgroup}|.
+% We store the starting height, optional parameters (see
+% Section~\ref{sec:options}), and label text, all of which are needed by
+% the |\end{leftwordgroup}|. We immediately parse the parameters
+% because they may affect the \cs{store@lcurly} invocation below.
% \begin{macrocode}
\global\wordlabell@start=\bytefield@height
- \gdef\wordlabell@text{#1}%
+ \gdef\wordlabell@params{#1}%
+ \gdef\wordlabell@text{#2}%
+ \bf@bytefieldsetup{#1}%
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
% Next, we typeset a draft version of the label into |\word@label@box|,
% which we measure (into |\total@lbox@width|) and then discard.
% We can't typeset the final version of the label until we reach the
@@ -3066,7 +3370,14 @@
% \begin{macrocode}
\gdef\make@lspace{%
\hspace*{\total@lbox@width}%
- \gdef\make@lspace{}}%
+ \gdef\make@lspace{}%
+ }%
+% \end{macrocode}
+% We now end the group that |\begin{rightwordgroup}| created. This lets
+% the |leftwordgroup| environment span rows (because we're technically
+% no longer within the environment).
+% \begin{macrocode}
+ \endgroup
\ignorespaces
}{%
% \end{macrocode}
@@ -3085,6 +3396,10 @@
% that we typeset the entire label in the second column, but in a $0
% \times 0$ |picture| environment and with a negative horizontal offset
% (|\starting@point|), thereby making it overlap the first column.
+% Before typesetting the curly brace we re-parse the optional parameters
+% because we're in a new group from the one in which we parsed them
+% before, and the parameters can affect the second \cs{store@lcurly}
+% invocation just they could have affected the first.
% \begin{macrocode}
\global\wordlabell@end=\bytefield@height
\bf@newdimen\starting@point
@@ -3094,6 +3409,7 @@
\begin{tabular}[b]{@{}l@{}}\wordlabell@text\end{tabular}}%
\settowidth{\label@box@width}{\usebox{\word@label@box}}%
\setlength{\label@box@height}{\wordlabell@end-\wordlabell@start}%
+ \expandafter\bf@bytefieldsetup\expandafter{\wordlabell@params}%
\store@lcurly{\curly@box}{\label@box@height}%
\begin{picture}(0,0)
\put(\strip@pt\starting@point,0){%
@@ -3111,7 +3427,8 @@
% |\begin|.
% \begin{macrocode}
\def\@currenvir{leftwordgroup}%
- \ignorespaces}
+ \ignorespacesafterend
+}
% \end{macrocode}
% \end{macro}
% \end{environment}
@@ -3326,6 +3643,8 @@
%
% \begin{macro}{\KV@bytefield@leftcurly}
% \begin{macro}{\KV@bytefield@rightcurly}
+% \begin{macro}{\bf@leftcurly}
+% \begin{macro}{\bf@rightcurly}
% Specify the symbol to use for bracketing a left or right word group.
% This must be an extensible math delimiter (i.e.,~something that can
% immediately follow |\left| or |\right| in math mode).
@@ -3335,10 +3654,14 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}{\KV@bytefield@leftcurlyspace}
% \begin{macro}{\KV@bytefield@rightcurlyspace}
% \begin{macro}{\KV@bytefield@curlyspace}
+% \begin{macro}{\bf@leftcurlyspace}
+% \begin{macro}{\bf@rightcurlyspace}
% Specify the amount of space between the bit fields in a word group and
% the adjacent left or right curly brace. The \optname{curlyspace}
% option is a shortcut that puts the same space before both left and
@@ -3354,10 +3677,14 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}{\KV@bytefield@leftlabelspace}
% \begin{macro}{\KV@bytefield@rightlabelspace}
% \begin{macro}{\KV@bytefield@labelspace}
+% \begin{macro}{\bf@leftlabelspace}
+% \begin{macro}{\bf@rightlabelspace}
% Specify the amount of space between a left or right word group's curly
% brace and the associated label text. The |labelspace| option is a
% shortcut that puts the same space after both left and right curly
@@ -3373,10 +3700,14 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}{\KV@bytefield@leftcurlyshrinkage}
% \begin{macro}{\KV@bytefield@rightcurlyshrinkage}
% \begin{macro}{\KV@bytefield@curlyshrinkage}
+% \begin{macro}{\bf@leftcurlyshrinkage}
+% \begin{macro}{\bf@rightcurlyshrinkage}
% Specify the number of points by which to reduce the height of a curly
% brace (left, right, or both) so its ends don't overlap whatever's
% above or below it.
@@ -3391,6 +3722,30 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\KV@bytefield@leftcurlystyle}
+% \begin{macro}{\KV@bytefield@rightcurlystyle}
+% \begin{macro}{\KV@bytefieldcurlystyle}
+% \begin{macro}{\bf@leftcurlystyle}
+% \begin{macro}{\bf@rightcurlystyle}
+% Specify a macro that takes either zero or one argument and that
+% precedes the text that draws a left curly brace, right curly brace, or
+% either curly brace.
+% \begin{macrocode}
+\define@key{bytefield}{leftcurlystyle}{\def\bf@leftcurlystyle{#1}}
+\define@key{bytefield}{rightcurlystyle}{\def\bf@rightcurlystyle{#1}}
+\define@key{bytefield}{curlystyle}{%
+ \def\bf@leftcurlystyle{#1}%
+ \def\bf@rightcurlystyle{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}{\KV@bytefield@endianness}
% \begin{macro}{\bf@parse@endianness}
@@ -3430,6 +3785,26 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\bf@bgcolor}
+% \begin{macro}{\KV@bytefield@bgcolor}
+% Specify a background color for a bit box or word box.
+% \begin{macrocode}
+\define@key{bytefield}{bgcolor}{\def\bf@bgcolor{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bf@per@word}
+% \begin{macro}{\KV@bytefield@per@word}
+% Specify a macro to invoke for each word of a word box. The macro must
+% take two arguments: the word number (0-indexed) and the total number
+% of words.
+% \begin{macrocode}
+\define@key{bytefield}{perword}{\def\bf@per@word{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\bytefieldsetup}
% \usermacro
% \changes{v2.0}{2011/01/18}{Introduced this macro to provide a more
diff --git a/Master/texmf-dist/source/latex/bytefield/bytefield.ins b/Master/texmf-dist/source/latex/bytefield/bytefield.ins
index 37197a9ab0c..d00c6424054 100644
--- a/Master/texmf-dist/source/latex/bytefield/bytefield.ins
+++ b/Master/texmf-dist/source/latex/bytefield/bytefield.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2017 by Scott Pakin <scott+bf@pakin.org>
+%% Copyright (C) 2000-2020 by Scott Pakin <scott+bf@pakin.org>
%%
%% This file may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.3a of this license
@@ -21,7 +21,7 @@
This is a generated file.
-Copyright (C) 2017 by Scott Pakin <scott+bf@pakin.org>
+Copyright (C) 2000-2020 by Scott Pakin <scott+bf@pakin.org>
This file may be distributed and/or modified under the conditions of
the LaTeX Project Public License, either version 1.3a of this license
diff --git a/Master/texmf-dist/source/latex/canoniclayout/canoniclayout.dtx b/Master/texmf-dist/source/latex/canoniclayout/canoniclayout.dtx
index 0855bd860ec..21acee83376 100644
--- a/Master/texmf-dist/source/latex/canoniclayout/canoniclayout.dtx
+++ b/Master/texmf-dist/source/latex/canoniclayout/canoniclayout.dtx
@@ -6,28 +6,28 @@
\preamble
______________________________________________________
The canoniclayout package for LaTeX
- Copyright (C) 2010-2011 Claudio Beccari
+ Copyright (C) 2010-2020 Claudio Beccari
All rights reserved
License information appended
\endpreamble
-\postamble
-Copyright 2011 Claudio Beccari
+\postamble
Distributable under the LaTeX Project Public License,
version 1.3c or higher (your choice). The latest version of
this license is at: http://www.latex-project.org/lppl.txt
-This work is "author-maintained"
-
-This work consists of this file canoniclayout.dtx, a README file
+This work consists of this file canoniclayout.dtx, a README.txt file
and the derived files canoniclayout.sty and canoniclayout.pdf.
+This work is "maintained"
+
\endpostamble
\askforoverwritefalse
%
\generate{\file{canoniclayout.sty}{\from{canoniclayout.dtx}{package}}}
+\generate{\file{README.txt}{\from{canoniclayout.dtx}{txt}}}
%
\def\tmpa{plain}
\ifx\tmpa\fmtname\endgroup\expandafter\bye\fi
@@ -41,21 +41,22 @@ and the derived files canoniclayout.sty and canoniclayout.pdf.
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}[2009/01/01]
%<package>\ProvidesPackage{canoniclayout}%
-%<*package>
- [2011/11/05 v.0.3 Canonic layout circumscribed to a circle]
-%</package>
+%<txt>\ProvidesFile{README.txt}
+%<*package,txt>
+ [2020-04-09 v.0.5 Canonic layout circumscribed to a circle]
+%</package,txt>
%<*driver>
\documentclass[a4paper]{ltxdoc}
\paperwidth=210mm\paperheight=297mm
\pdfpagewidth=\paperwidth \pdfpageheight=\paperheight
-\usepackage[latin1]{inputenc}
+\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{textcomp}
\usepackage{multicol}
\usepackage{amsmath,array,booktabs}
-\usepackage{pict2e}[2009/06/01]%
-\usepackage{color}
+\usepackage{pict2e}[2019/06/01]%
+\usepackage{color,xfp}
\usepackage{canoniclayout}
\hfuzz 10pt
@@ -63,21 +64,28 @@ and the derived files canoniclayout.sty and canoniclayout.pdf.
\newcommand*\pack[1]{\textsf{#1}}
\newcommand*\prog[1]{\textsl{#1}}
\newcommand*\file[1]{\texttt{#1}}
-\definecolor{grigio}{gray}{.75}
+\definecolor{grigio}{gray}{.85}
\makeatletter
-\def\cblayoutdestro{\dimen256=\dimexpr\headheight+\topmargin+1in-\paperheight\relax
-\dimen258=\dimexpr\oddsidemargin+1in\relax
-\dimen262=1mm\relax
-\dimen260=\dimexpr \paperwidth*\p@/\dimen262\relax
-\dimen264=\dimexpr \paperheight-\topmargin-\headheight-1in-\headsep-\textheight\relax
-\begin{picture}(0,0)(\strip@pt\dimen258,-\strip@pt\dimen256)
+%\newdimen\CLinnermargin % 258
+%\newdimen\CLmm % 262
+%\newdimen\CLpagewidth % 260
+%\newdimen\Clowermargin % 264
+%\newdimen\CLvoffset % 256
+\edef\CLinnermargin{\fpeval{\oddsidemargin+1in}}
+\edef\CLmm{\fpeval{1mm}}
+\edef\CLpagewidth{\fpeval{\paperwidth}}
+\edef\CLlowermargin{\fpeval{\paperheight-\topmargin-\headheight-(1in)-\headsep-\textheight}}
+\edef\CLvoffset{\fpeval{\headheight+\topmargin+1in-\paperheight}}
+\edef\CLpageheight{\fpeval{\paperheight}}
+\def\cblayoutdestro{%
+\begin{picture}(0,0)(\CLinnermargin,-\CLvoffset)
\put(0,0){\unitlength=\p@
-\put(0,0){\framebox(\strip@pt\paperwidth,\strip@pt\paperheight){}}
+\put(0,0){\framebox(\CLpagewidth,\CLpageheight){}}
\color{red}
-\put(\strip@pt\dimen258,\strip@pt\dimen264){\makebox(0,0)[bl]{\color{grigio}\rule{\textwidth}{\textheight}}}
- \Line(0,\strip@pt\paperheight)(\strip@pt\paperwidth,0)
- \put(\strip@pt\dimexpr\paperwidth/2\relax,\strip@pt\dimexpr\dimen264+\textheight/2\relax){\circle{\strip@pt\paperwidth}}
+\put(\CLinnermargin,\CLlowermargin){\makebox(0,0)[bl]{\color{grigio}\rule{\textwidth}{\textheight}}}
+ \Line(0,\CLpageheight)(\CLpagewidth,0)
+ \put(\fpeval{\CLpagewidth/2},\fpeval{\CLlowermargin+(\textheight)/2}){\circle{\CLpagewidth}}
}
\end{picture}}
\def\ps@title{\ps@plain
@@ -86,52 +94,73 @@ and the derived files canoniclayout.sty and canoniclayout.pdf.
\allowdisplaybreaks
\begin{document}
\GetFileInfo{canoniclayout.dtx}
-\title{Package \pack{canoniclayout}\thanks{Version number \fileversion; last
- revision \filedate.}}
-\author{Claudio Beccari\thanks{e-mail: \texttt{claudio dot beccari at gmail dot com}}}
+\title{Package \pack{canoniclayout}}
+\author{Claudio Beccari}
+\date{\centering Version number \fileversion; last revision \filedate.\\
+ e-mail: \texttt{claudio dot beccari at gmail dot com}\par}
\maketitle\thispagestyle{title}
\DocInput{canoniclayout.dtx}
\end{document}
%</driver>
% \fi
%
-% \CheckSum{211}
-% \begin{abstract}
-% This package is a small extension that allows to determine the page
-% parameters for a canonical layout where the text block is placed onto the page in such a
-% way as: $(a)$ its diagonal coincides with the page relevant diagonal, and $(b)$ the
-% circle inscribed within the text block is also tangent to the page sides. The text
-% block width to height ratio is kept equal to the page ratio, as well as the inner to
-% outer and the upper to lower margin ratios.
-%
-% The canonical layout determined by this package is laid down on this very page; of
-% course the actual text block fits the text block grid, because this
-% documentation is typeset by means of the \texttt{ltxdoc} document class, that by
-% itself would use other layout parameters, but that is has been arrayed so as to invoke
-% this very package. This allows you to immediately evaluate this traditional layout and
-% see if it fits to your needs.
-% \end{abstract}
+% \CheckSum{128}
+%\begin{abstract}
+%\noindent
+% This package is a small extension that allows to determine the page
+% parameters for a canonical layout where the text block is placed onto
+% the page in such a way as: $(a)$ its diagonal coincides with the page
+% relevant diagonal, and $(b)$ the circle inscribed within the text block
+% is tangent to the page sides. The text block width to height ratio is
+% kept equal to the page ratio, as well as the inner to outer and the
+% upper to lower margin ratios.
+%
+% The canonical layout determined by this package is laid down on this
+% very page; of course the actual text block fits the text block grid,
+% because this documentation is typeset by means of the \texttt{ltxdoc}
+% document class, that by itself would use other layout parameters, but
+% that is has been arranged so as to invoke this very package. This
+% allows you to immediately evaluate this traditional layout and see if
+% it fits your requirements.
+%\end{abstract}
%
% \begin{multicols}{2}
% \tableofcontents
% \end{multicols}
%
% \section{Introduction}
-% As any user of the \class{memoir} class knows well, this class allows to customize the
-% page layout virtually without any limitation; such limitations are connected mainly with
-% the user inconsistent data that miss to specify necessary information or give unnecessary
-% and contrasting information. Also other classes and/or packages allow the customized
-% design of the page layout; some other classes, such as the standard ones, do not have any
-% facility for customizing the page geometry, unless the user invokes suitable packages,
-% such as \pack{geometry} or \pack{tyeparea}, just to male a couple of well known examples.
+% As any user of the \class{memoir} class knows well, this class allows
+% to customise the page layout virtually without any limitation; such
+% limitations are connected mainly with the user inconsistent data that
+% miss to specify necessary information or give unnecessary or conflicting
+% information. Also other classes and/or packages allow the customised
+% design of the page layout; some other classes, such as the standard
+% ones, do not have any facility to customise the page geometry, unless
+% the user invokes suitable packages, such as \pack{geometry} or
+% \pack{tyeparea}, just to male a couple of well known examples.
%
-% Many packages exist in order to specify a named layout; this package \pack{canoniclayout}
-% is another one that computes the page parameters to determine the horizontal and vertical
-% dimensions of the margins and the text block. All other details shall be specified by the
-% user, for example the dimensions of the stock paper, the trimming widths, and therefore
-% the position of the page onto the stock paper, and so on.
-% This package deals only with the trimmed page, not with the page and stock paper
-% relationship.
+% Many packages exist in order to specify a named layout; this package
+% \pack{canoniclayout} is another one that computes the page parameters
+% to determine the horizontal and vertical dimensions of the margins
+% and the text block. All other details shall be specified by the user,
+% for example the dimensions of the stock paper, the trimming widths,
+% and therefore the position of the page onto the stock paper; and so on.
+% This package deals only with the trimmed page, not with the page and
+% stock paper relationship.
+%
+% \paragraph{Warning} This package works well only with a modern
+% installation of the \TeX\ system; in particular it uses the
+% facilities of the \pack{xfp} package, that is an interface between
+% the end user and the lower level language known as \LaTeX\,3 (L3 for
+% short). This implies a \LaTeX kernel implementation dated at least
+% 2029-01-01, and a complete installation of the \TeX\ system. In
+% particular the availability of the \pack{xfp} package is checked,
+% and if the typesetting program cannot fetch it, is issues a message
+% and interrupts loading this package. It is a clear message that your
+% installation is obsolete; you might have your good reasons for not
+% using a modern release of the \TeX\ system, but either you upgrade
+% your installation or you cannot use this package.
+
%
% \begin{figure}
% \makebox[\textwidth]{\makebox[1.1\textwidth][r]{%
@@ -161,130 +190,160 @@ and the derived files canoniclayout.sty and canoniclayout.pdf.
% \unitlength0.001591\textwidth
% \let\ul=\unitlength
% \begin{picture}(220,330)(0,-20)
-% \put(0,0){\framebox(220,280){}}
-% \put(20.742,33.6){\makebox(0,0)[bl]{\color{grigio}\rule{172.86\ul}{220\ul}}}
-% \put(110,-35){\makebox(0,0)[b]{Letter paper canonical layout}}
-% \color{red}
-% \put(110,143.6){\circle{220}}
+% \put(0,0){\framebox(220,280){}}
+% \put(20.742,33.6){\makebox(0,0)[bl]{\color{grigio}\rule{172.86\ul}{220\ul}}}
+% \put(110,-35){\makebox(0,0)[b]{Letter paper canonical layout}}
+% \color{red}
+% \put(110,143.6){\circle{220}}
% \multiput(0,280)(2.37837837838,-3.02702702703){93}{\line(220,-280){1}}
% \end{picture}
% }}%
-% \caption{A right page with the relevant diagonal, the text block and the canonical circle.
-% In this figure the important information is the page proportions, not the scale; matter of
-% fact the letter paper is 17.6 mm shorter than the A4 paper, but the drawings to the same
-% height emphasize the relative proportions of the various page parts.}
+% \caption{A right page with the relevant diagonal, the text block and the
+% canonical circle.
+% In this figure it is important to notice the page proportions, not the
+% scale; matter of fact the letter paper height is 17.6\,mm shorter than
+% the A4 paper, but the drawings to the same height emphasise the relative
+% proportions of the various page parts.}
% \label{fig:canoniclayout}
% \end{figure}
%
-% Figure~\ref{fig:canoniclayout} depicts the situation described above; the gray rectangle
-% represents the type block; the dotted page diagonal, as it can be seen, passes through
-% the diagonal vertices of the type block; at the same time the circle is tangent to both
-% the type block and the page contour.
-%
-% It must also be noticed, in the sketch on the left, that the page rectangle is a golden
-% one; therefore also the type block is a golden rectangle; the inner to the outer margin
-% ratio is the golden section value so as this same ratio exists between the upper and the
-% lower margin. This canonical layout implies that the type block height is equal to the
-% page width.
-%
-% Therefore this canonical layout is not suited when the page width is too small compared
-% to the page height: with the golden section\footnote{Here we denote $\phi=1,618\dots$
-% with the name of \emph{golden number}, and its reciprocal $\varphi=0,618\dots$ with the
-% name of \emph{golden section}.} this ratio is 0.618, with the ISO paper shape, in the
-% sketch on the center, this ratio is 0,707, and so on.
-%
-% But it is equally unsuitable with squarish pages, such as the sketch on the right where
-% the page proportions conform with the USA letter paper size: the type block leaves little
-% space for the margins, as it is evident from the properties of the canonical circle, which
-% is tangent to the page lateral sides and to the type block horizontal sides; to the limit
-% in a square page the type block is so large that there is no room for the margins.
+% Figure~\ref{fig:canoniclayout} depicts the situation described above;
+% the grey rectangle represents the type block; the dotted page diagonal,
+% as it can be seen, passes through the diagonal vertices of the type
+% block; at the same time the circle is tangent to both the type block
+% and the page contour.
+%
+% It must also be noticed, in the sketch on the left, that the page
+% rectangle is a golden one; therefore also the type block is a golden
+% rectangle; the inner to the outer margin ratio is the golden section
+% value so as this same ratio exists between the upper and the lower
+% margin. This canonical layout implies that the type block height is
+% equal to the page width.
+%
+% Therefore this canonical layout is not suited when the page width
+% is too small compared to the page height: with the golden
+% section\footnote{Here we denote $\phi=1,618\dots$
+% with the name of \emph{golden number}, and its reciprocal
+% $\varphi=0,618\dots$ with the name of \emph{golden section}.} this
+% ratio is 0.618, with the ISO paper shape, in the sketch on the center,
+% this ratio is 0,707, and so on.
+%
+% But it is equally unsuitable with squarish pages, such as the sketch
+% on the right where the page proportions conform with the USA letter
+% paper size: the type block leaves little space for the margins, as
+% it is evident from the properties of the canonical circle, which
+% is tangent to the page lateral sides and to the type block horizontal
+% sides; to the limit in a square page the type block is so large that
+% there is no room for the margins.
%
% \section{The mathematics of the canonical layout}
-% If one plays a little with the drawing of figure~\ref{fig:canoniclayout} and applies what
-% has been described in the Introduction, may easily derive the following formulas:
+% If one plays a little with the drawing of figure~\ref{fig:canoniclayout}
+% and applies what has been described in the Introduction, may easily
+% derive the following formulas:
%\begin{align}
-%&\text{Page shape ratio:}& x&=b/h \label{equ:1} \\
-%&\text{Inner margin:}& I&=bx(1-x)/(1+x) \\
-%&\text{External margin:}& E&=b(1-x)/(1+x) \\
-%&\text{Top margin:}& T&=hx(1-x)/(1+x) \\
-%&\text{Bottom margin:}& B&=h(1-x)/(1+x) \\
-%&\text{Text width:}& W&=xb \\
-%&\text{Text height:}& H&=b \\
-%&\text{Circle center abscissa:}&C_x&=0.5b \\
-%&\text{Circle center ordinate:}&C_y&=h(1-x)/(1+x)+b/2 \\
-%&\text{Circle radius:}& R&=0.5b \label{equ:10}
+%&\text{Page shape ratio:} & x&=b/h \label{equ:1} \\
+%&\text{Inner margin:} & I&=bx(1-x)/(1+x) \\
+%&\text{External margin:} & E&=b(1-x)/(1+x) \\
+%&\text{Top margin:} & T&=hx(1-x)/(1+x) \\
+%&\text{Bottom margin:} & B&=h(1-x)/(1+x) \\
+%&\text{Text width:} & W&=xb \\
+%&\text{Text height:} & H&=b \\
+%&\text{Circle center abscissa:} & C_x&=0.5b \\
+%&\text{Circle center ordinate:} & C_y&=h(1-x)/(1+x)+b/2 \\
+%&\text{Circle radius:} & R&=0.5b \label{equ:10}
%\end{align}
-% whose results are summarized in table~\ref{tab:canoniclayout} for three common values of
-% the shape factor and for the letter paper shape ratio.
-%
-%\begin{table}[!b]\centering\let~\enspace
-%\hrule
-%\caption{Canonical layout ratios referred to the the base (or width, $b$) of the trimmed
-% page and its height ($h$).}\label{tab:canoniclayout}
+% whose results are summarised in table~\ref{tab:canoniclayout} for
+% three common values of the shape factor and for the letter paper
+% shape ratio.
+%
+%\begin{table}[!b]\centering^^A\let~\enspace
+%^^A\hrule
+%\caption{Canonical layout ratios referred to the base
+% (or width, $b$) and the height ($h$) of the trimmed page.}
+%\label{tab:canoniclayout}
%\bigskip
%\begin{tabular}{l@{\qquad}*4{>{$}c<{$}}}
%\toprule
-% &\multicolumn4c{Canon} \\
-%\multicolumn1c{Quantity} & \phi:1 & 3:2 & \sqrt2:1 & 11:8.5\\
+% &\multicolumn4c{Canon} \\
+%\multicolumn1c{Shape ratio} & \phi:1 & 3:2 & \sqrt2:1 & 11:8.5\\
%\midrule
-% Page shape ratio &0,618~ &0,666~ &0,707~ &0,773~ \\
-% Inner margin &0,146b &0,133b &0,121b &0,099b \\
-% External margin &0,236b &0,200b &0,172b &0,128b \\
-% Upper margin &0,146h &0,133h &0,121h &0,099h \\
-% Lower margin &0,236h &0,200h &0,172h &0,128h \\
-% Text width & 0,618b &0,666b &0,707b &0,773b \\
-% Text height & b & b & b &b \\
-% Circle center abscissa & b/2 & b/2 & b/2 &b/2 \\
-% Circle center ordinate & 0,545h &0,533h &0,526h &0,515h \\
-% Circle radius & b/2 & b/2 & b/2 &b/2 \\
+% Page shape ratio &0,618~ &0,666~ &0,707~ &0,773~ \\
+% Inner margin &0,146b &0,133b &0,121b &0,099b \\
+% External margin &0,236b &0,200b &0,172b &0,128b \\
+% Upper margin &0,146h &0,133h &0,121h &0,099h \\
+% Lower margin &0,236h &0,200h &0,172h &0,128h \\
+% Text block width & 0,618b &0,666b &0,707b &0,773b \\
+% Text block height & b & b & b &b \\
+% Circle center abscissa & b/2 & b/2 & b/2 &b/2 \\
+% Circle center ordinate & 0,545h &0,533h &0,526h &0,515h \\
+% Circle radius & b/2 & b/2 & b/2 &b/2 \\
%\bottomrule
%\end{tabular}
%\end{table}
%
-% Actually the formulas~\ref{equ:1}--\ref{equ:10}, and their numerical evaluations reported
-% in table~\ref{tab:canoniclayout}, are just for general information. The actual
-% computations are performed by this package, either by means of the \class{memoir} built-in
-% facilities or by explicit computations that exploit the $\varepsilon$-\TeX\ extensions.
-% But it can be easily seen that as the trimmed page becomes more squarish, the
-% page size ratio tends to one, ad the margins become smaller and smaller. Therefore it
-% seems that this layout is most suited for intermediate page ratios, such as the ISO one
-% or the common European book size of 170\,mm $\times$ 240\,mm with a ratio of 0,708.
+% Actually the formulas~\ref{equ:1}–\ref{equ:10}, and their numerical
+% evaluations reported in table~\ref{tab:canoniclayout}, are just for
+% general information. The actual computations are performed by this
+% package, either by means of the \class{memoir} built-in facilities
+% or by explicit computations that exploit the \pack{xfp} functions.
+% But it can be easily seen that as the trimmed page becomes more
+% squarish, the page size ratio tends to one, ad the margins become
+% smaller and smaller. Therefore it seems that this layout is better
+% suited for intermediate page ratios, such as the ISO one or the
+% common European book size of 170\,mm $\times$ 240\,mm with a ratio
+% of 0,708.
%
% \section{Usage}
% This package is invoked as usual with:
%\begin{verbatim}
% \usepackahe{canoniclayout}
%\end{verbatim}
-% No options are necessary; but it is necessary to invoke the package only after the page
-% dimensions are known, be they specified by an option passed to the class, such as, for
-% example, \texttt{a4paper}, or by means of a \texttt{page}$size$ specification, for example
+% No options are necessary; but it is necessary to invoke the package
+% only after the actual page dimensions are known, be they specified
+% by an option passed to the class, such as, for example, \texttt{a4paper},
+% or by means of a \texttt{page}\meta{size} specification, for example
% \texttt{pagebv} for calling the ISO B5 size.
%
-% At any convenient moment after calling this package, the trimming margins with respect to
-% the stock paper may be computed and the layout rechecked and fixed for consistency.
+% At any convenient moment after calling this package, the trimming
+% margins with respect to the stock paper may be computed and the
+% layout rechecked and fixed for consistency.
%
% \section{Font normal size}
-% At the same time if this page layout is chosen, the font normal size should be selected on
-% the actual text block width; it is possible that the golden ratio type block, on a golden
-% rectangle paper obtained by trimming an ISO A4 stock paper, might be suitable with a 10pt
-% normal font size (exactly 66 characters per line with 10pt Latin Modern fonts), while a
-% full ISO A4 paper yields a type block that might be more suited for a 12pt normal font
-% size (86 characters with 10pt Latin Modern fonts). The computations might be left to the
-% \class{memoir} class commands, but it's better the user is aware of this particular point.
-% For his/her sake this package provides the command |\currentfontletters| (to be used
-% only after |\begin{document}|, because specific font packages might be loaded after the
-% page layout has been computed; in any case the command is ``text producing'', therefore
-% it can't be used while in the preamble!) that types out a sentence such as ``The number
-% of characters in one text line with the current font is $nn$'', where the $nn$ is the
-% actual number printed out. If such number is much larger than the ideal Bringhurst range
-% of $66\pm5$, it's wiser to chose a larger normal font size.
-% In any case the alternative command |\charactersperpage| types out the same information,
-% the number of lines and the estimated number of characters per page. These commands are
-% supposed to be useful while setting up the complete preliminary parameters for the page
+% At the same time if this page layout is chosen, the font normal size
+% should be selected on the actual text block width; it is possible
+% that the golden ratio type block, on a golden rectangle paper obtained
+% by trimming an ISO A4 stock paper, might be suitable with a 10\,pt
+% normal font size (exactly 66 characters per line with 10pt Latin
+% Modern fonts), while a full ISO A4 paper yields a type block that
+% might be more suited for a 12pt normal font size (86 characters with
+% 10pt Latin Modern fonts is too much). The computations might be left
+% to the \class{memoir} class commands, but it's better the user
+% is aware of this particular point.
+% For his/her sake this package provides the command |\currentfontletters|
+% (to be used only after |\begin{document}|, because specific font
+% packages might be loaded after the page layout has been computed; in
+% any case the command is “text producing”, therefore it can't be used
+% while in the preamble!) that types out a sentence such as “The number
+% of characters in one text line with the current font is $nn$”, where
+% the $nn$ is the actual number printed out. If such number is much
+% larger than the ideal Bringhurst range of $66\pm6$, it's wiser to
+% chose a larger normal font size.
+% In any case the alternative command |\charactersperpage| types out
+% the same information, the number of lines and the estimated number
+% of characters per page. These commands are supposed to be useful
+% while setting up the complete preliminary parameters for the page
% layout.
%
-% Just to have a comparison, table~\ref{tab:sizes} displays the number of characters in one
-% line of text for several fonts and for page sizes A4, A5, and B5.
+% Just to have a comparison, table~\ref{tab:sizes} displays the number
+% of characters in one text line for several fonts and for page sizes
+% A4, A5, and B5. As you see, although that Bringhurst range comes form
+% socio-psychological studies and therefore has a large standard deviation,
+% It appears that for the larger papers only those fonts with wider
+% lowercase letters are suitable for this canonical layout; with smaller
+% paper sizes, quite understandably, more font collections are suited.
+% This very document, typeset with this canonical layout on A4 paper
+% with a Latin Modern 10\,pt font size, has long text lines that stress
+% the readers eyes.
%
%\begin{table}
%\caption{Text line lengths measured in average number
@@ -295,120 +354,119 @@ and the derived files canoniclayout.sty and canoniclayout.pdf.
% \let\b\bfseries \let\i\itshape\tabcolsep=5pt
% \makebox[\textwidth]{\small\begin{tabular}{l*9c}
% \toprule
-% Font collection & \multicolumn3c{A4 paper size}
-% & \multicolumn3c{A5 paper size}
-% &\multicolumn3c{B5 paper size}\\
-% & 10\,pt & 11\,pt & 12\,pt & 10\,pt & 11\,pt & 12\,pt & 10\,pt & 11\,pt & 12\,pt \\
+% Font collection & \multicolumn3c{A4 paper size}
+% & \multicolumn3c{A5 paper size}
+% &\multicolumn3c{B5 paper size}\\
+% &10\,pt &11\,pt &12\,pt &10\,pt &11\,pt &12\,pt &10\,pt &11\,pt &12\,pt\\
% \midrule
-% Times eXtended & \i92 & \i84 & \i77 & \b64 & 59 & \i54 & \i77 & \b70 & \b64 \\
-% Latin Modern & \i86 & \i79 & 73 & 60 & \i55 & \i51 & 72 & \b66 & \b61 \\
-% Kepler Project & \i83 & 76 & \b69 & 58 & \i53 & \i48 & \b69 & \b63 & 58 \\
-% Palatino eXtended& \i82 & 75 & \b69 & 58 & \i53 & \i48 & \b69 & \b63 & 57 \\
+% Times eXtended
+% & \i92 & \i84 & \i77 & \b64 & 59 & \i54 & \i77 & \b70 & \b64\\
+% Latin Modern
+% & \i86 & \i79 & 73 & \b60 & \i55 & \i51 & \b72 & \b66 & \b61\\
+% Kepler Project
+% & \i83 & 76 & \b69 & 58 & \i53 & \i48 & \b69 & \b63 & 58\\
+% Palatino eXtended
+% & \i82 & 75 & \b69 & 58 & \i53 & \i48 & \b69 & \b63 & 57\\
% \bottomrule
% \end{tabular}}
%\end{table}
%
-% It can be seen that the bold measures satisfy the Bringhurst rule with a number of
-% characters in the range $66\pm5$; the measures typeset in medium series type are out of
-% the optimal Bringhurst range, but may be considered acceptable; the measures typeset in
-% italics are completely out of the interval $66\pm10$ and should not be considered
-% acceptable. This means that the large A4 paper size may be best used with intrinsically
-% large fonts such as the Palatino eXtended (package \pack{pxfonts}) and the Kepler Project
-% (package \pack{kpfonts}). With the smaller A5 paper size with 10\,pt size fonts the best
-% ones are the Times eXtended (package \pack{txfonts}), but substantially all the examined
-% fonts are acceptable, while with 12\,pt fonts none are acceptable.
-%
-% With an intermediate sized paper, such as a B5 ISO size, all the considered fonts are
-% acceptable inside or just outside the optimal Bringhurst interval.
-%
-% Many books are trimmed to a size close the B5 paper size, therefore the page layout
-% produced with this package is most useful with medium and smaller sizes (at least with
-% ISO sizes).
+% It can be seen that the bold measures satisfy the Bringhurst rule
+% with a number of characters in the range $66\pm6$; the measures
+% typeset in medium series type are out of the optimal Bringhurst
+% range, but may be considered acceptable; the measures typeset in
+% italics are completely out of the interval $66\pm10$ and should
+% not be considered acceptable. This means that the large A4 paper
+% size may be best used with intrinsically large fonts such as the
+% Palatino eXtended (package \pack{newpxtext}) and the Kepler Project
+% (package \pack{kpfonts}). With the smaller A5 paper size with 10\,pt
+% size fonts the best ones are the Times eXtended (package
+% \pack{newtxtext}), and the Latin Modern ones (package \pack{lmodern})
+% but substantially all the examined fonts are acceptable, while with
+% 12\,pt fonts none are acceptable.
+%
+% With an intermediate sized paper, such as a B5 ISO size, all the
+% considered fonts are acceptable inside or just outside the optimal Bringhurst interval.
+%
+% Many books are trimmed to a size close the B5 paper size, therefore
+% the page layout produced with this package is most useful with medium
+% and smaller sizes (at least with ISO sizes).
% \section{Conclusion}
-% I don't think this package should set also the header and footer distances, for example,
-% or should set any specification for the page ``decorations'', such as underlined headers,
-% or overlined footers, or the size, font family, series and shape of the header and footer
-% contents. These specifications are of course important, but have nothing to do with the
-% relationship between the paper size, the page size and the type block size.
-%
-% As a final remark it's worth noting that a single pass of \prog{pdflatex} on this
-% \file{canoniclayout.dtx} file produces at the same time both the \file{canoniclayout.sty}
-% package file and the documentation \file{canoniclayout.pdf} file. After running
-% \prog{pdflatex} move \file{canoniclayout.sty} to a \file{tex/latex/canoniclayout/} folder
-% and \file{canoniclayout.pdf} to a \file{doc/latex\discretionary{}{/}{/}canoniclayout/} one;
-% if such folders don't exist, create them on your personal \TeX\ tree. After moving these
-% files remember to refresh the file name data base.
+% I don't think this package should set also the header and footer
+% distances, for example, or should set any specification for the page
+% “decorations”, such as underlined headers, or over lined footers,
+% or the size, font family, series and shape of the header and footer
+% contents. These specifications are of course important, but have
+% nothing to do with the relationship between the paper size, the
+% page size and the type block size.
+%
+% As a final remark it's worth noting that a single pass of
+% \prog{pdflatex} on this \file{canoniclayout.dtx} file produces at the
+% same time both the \file{canoniclayout.sty} package file and the
+% documentation \file{canoniclayout.pdf} file, besides a \file{README.txt}
+% required for uploading to the \textsc{ctan} archives. After running
+% \prog{pdflatex} move \file{canoniclayout.sty} to a
+% \file{tex/latex/canoniclayout/} folder and \file{canoniclayout.pdf}
+% to a \file{doc/latex\discretionary{}{/}{/}canoniclayout/} one;
+% if such folders don't exist, create them on your personal \TeX\
+% tree. After moving these files and if you have a Mik\TeX\ installation,
+% remember to refresh the file name data base.
%
%
% \StopEventually{}
%
% \section{Documented code}
-% The package preliminaries are already in place. We are going to make some computations in
-% order to determine the page shape factor $x$; to this end we exploit the dimensional
-% computing capabilities of $\varepsilon$-\TeX, that are already embedded in the most recent
-% implementations of the program \prog{pdftex}; in fact it must be remarked that these
-% facilities are being embedded into the \prog{pdftex} typesetting engine since the \TeX~Live
-% distribution of the year 2005. If these facilities are not available, either
-% because the \TeX\ distribution is a little too old, or because the real \prog{tex}
-% typesetting engine, not \prog{pdftex}, is being used, then, this entire package contents is
-% skipped and nothing is done, except issuing a suitable warning.
-% \begin{macrocode}
+% The package preliminaries are already in place. We are going to make
+% some computations in order to determine the page shape factor $x$;
+% to this end we exploit the dimensional computing capabilities package
+% \pack{xft}, that are already available in the most recent \LaTeX\
+% kernel files; in facts, the \LaTeX\,3 (L3) language computing
+% facilities have been available for several years, but the simple
+% and efficient user interface package \pack{xfp} has been available
+% since the 2018 autumn. If these facilities are not available, either
+% because the \TeX\ distribution is a little too old, or because the
+% real \prog{tex} typesetting engine, not \prog{pdftex}, is being used,
+% then, this entire package contents is skipped and nothing is done,
+% except issuing a suitable warning.
+%\iffalse
%<*package>
-\expandafter\ifx\csname eTeXversion\endcsname\relax
- \PackageWarning{canoniclayout}{%
- The typesetting engine is not suited\Messagebreak
- for working in extended mode.\Messagebreak}
- This package is being skipped}
- \expandafter\endinput
-\fi
-\ifnum\eTeXversion>\z@\else
- \PackageWarning{canoniclayout}{%
- The typesetting engine is not working in extended mode.\MessageBreak
- This package is being skipped}
- \expandaftter\endinput
-\fi
+%\fi
+% \begin{macrocode}
+\IfFileExists{xfp.sty}{\RequirePackage{xfp}}{%
+ \PackageError{canoniclayout}{\MessageBreak%
+ The xfp package is not available\MessageBreak
+ and this package cannot work without\MessageBreak}{
+ Reading of this package is skipped\MessageBreak
+ Expect a different layout form the canonical one\Messagebreak
+ Update your TeX system installation!\expandafter\endinput}}
% \end{macrocode}
%
-% In order to have this layout work with the \class{memoir} class or with any other
-% class we have to test the fact they they package has been loaded within the preamble
-% of a \class{memoir} styled document; according to the result of this test we can exploit
-% the \class{memoir} facilities for determining the page geometry, or we have to carry out
-% the complete computations ourselves.
+% In order to have this layout work with the \class{memoir} class or
+% with any other class we have to test the fact that this package
+% has been loaded within the preamble of a \class{memoir} styled document;
+% according to the result of this test we can exploit
+% the \class{memoir} facilities for determining the page geometry,
+% or we have to carry out the complete computations ourselves.
% \begin{macrocode}
-\@ifclassloaded{memoir}{% }% balancing brace
+\@ifclassloaded{memoir}{%
% \end{macrocode}
-% Working with the \class{memoir} facilities, we can determine the page shape factor
-% and we save it into the control sequence |\CLshape|. The trick of multiplying by |p@|,
-% a length of 1\,pt, is a simple trick for reducing the shape ratio to a length whose
-% numerical value is exactly the ratio we are interested in. By stripping the `pt' part
-% from this dimension value we remain with the real number we want to keep in memory.
-% Of course we need also the reciprocal value, therefore we have to perform this
-% calculation a second time with different factors.
-% This ``strange'' way of computing real ratios derives from the ability of the
-% $\varepsilon$-\TeX\ engine to scale lengths with a higher computational precision than
-% ``normal'' \TeX\ can do with the standard dimension and integer operations. In facts
-% all the computational operations are performed in the CPU registers and the intermediate
-% first result of the multiplication is kept into a double length register, so that no bits
-% are rounded or truncated; the division operation is performed with a double length
-% numerator and a single length denominator, so that, again, almost no information is lost
-% at the inevitable end of the division algorithm with a non vanishing remainder.
+% Working with the \class{memoir} facilities, we can determine the page
+% shape factor and we save it into the control sequence |\CLshape|.
% \begin{macrocode}
-\dimen@=\dimexpr \p@ * \paperwidth / \paperheight\relax
-\edef\CLshape{\strip@pt\dimen@}
-\dimen@=\dimexpr \p@ * \p@ / \dimen@\relax
-\edef\CLinvshape{\strip@pt\dimen@}
+\edef\CLshape{\fpeval{\paperwidth / \paperheight}}
+\edef\CLinvshape{\fpeval{1/\CLshape}}
% \end{macrocode}
-% We then assign the text height, thanks to the fact that the canonical layout has the
-% block height just as long as the page width, due to the circle property mentioned in the
-% Introduction; in any case the formulas~\ref{equ:1}--\ref{equ:10} and
-% table~\ref{tab:canoniclayout} confirm this property for any shape.
+% We then assign the text height, thanks to the fact that the canonical
+% layout has the block height just as long as the page width, due to the
+% circle property mentioned in the Introduction; in any case the
+% formulas~\ref{equ:1}--\ref{equ:10} and table~\ref{tab:canoniclayout} confirm this property for any shape.
% \begin{macrocode}
\textheight=\paperwidth
% \end{macrocode}
%
-% This done, we can use the internal \class{memoir} commands to determine the other layout
-% dimensions.
+% This done, we can use the internal \class{memoir} commands to determine
+% the other layout dimensions.
% \begin{macrocode}
\settypeblocksize{\textheight}{*}{\CLshape}
\setlrmargins{*}{*}{\CLinvshape}
@@ -417,129 +475,157 @@ and the derived files canoniclayout.sty and canoniclayout.pdf.
% \end{macrocode}
%
-% We now use the |\checkandfixthelayout| so that it adjusts the type block dimensions
-% to an integer number of lines in the normal font and eventually prints the page
-% parameters to the% \file{.log} file.
+% We now use the |\checkandfixthelayout| so that it adjusts the type
+% block dimensions to an integer number of lines in the normal font and
+% eventually prints the page parameters to the \file{.log} file.
% \begin{macrocode}
\checkandfixthelayout
% \end{macrocode}
%
-% At this point we are finished with the computations if the \class{memoir} class is the active one, nut we need to perform the complete calculations in case we are not working with the \class{memoir} class.
+% At this point we are finished with the computations if the
+% \class{memoir} class is the active one, but we need to perform
+% the complete calculations in case we are not working with the
+% \class{memoir} class.
% \begin{macrocode}
}{%
% \end{macrocode}
-% We start by defining the lengths registers that hold the real inner, outer and upper
-% margins, without the one inch shift and without taking into consideration the headings
-% and their spacings, that must be specified before calling this package.
+% We start by defining the lengths registers that hold the real inner,
+% outer and upper margins, without the one inch shift and without taking
+% into consideration the headings and their spacings, that must be
+% specified before calling this package.
% \begin{macrocode}
\newlength\innermargin
\newlength\outermargin
\newlength\uppermargin
% \end{macrocode}
-% Then we define scratch length registers in order to maintain intermediate values.
+% Then we use some macros where to store some constant values;
+% we compute them using the rimmed page width and height;
% \begin{macrocode}
-\dimendef\CLpageratio=1256% x=b/h
-\dimendef\CLsmallratio=1258% z=x*y
-\dimendef\CLlargeratio=1260% y=(1-x)/(1+x)
-% \end{macrocode}
-% Now we determine the actual values based on the page width and height; we work on dimensions, and we extract the decimal fractional value by stripping off the `pt' part of their measure; we keep the decimal fractionl values into service macros:
-% \begin{macrocode}
-\CLpageratio=\dimexpr \p@*\paperwidth/\paperheight\relax % x
-\CLlargeratio=\dimexpr \p@*(\p@-\CLpageratio)/(\p@+\CLpageratio)\relax % y
-\CLsmallratio=\dimexpr \CLpageratio*\CLlargeratio/\p@\relax % z
-%
-\edef\CL@pageratio{\strip@pt\CLpageratio}
-\edef\CL@smallratio{\strip@pt\CLsmallratio}
-\edef\CL@largeratio{\strip@pt\CLlargeratio}
+\edef\CLpageratio{\fpeval{\paperwidth/\paperheight}} % x
+\edef\CLlargeratio{\fpeval{(1-\CLpageratio)/(1+\CLpageratio)}} % y
+\edef\CLsmallratio{\fpeval{\CLpageratio*\CLlargeratio}} % z
% \end{macrocode}
% We compute the type block dimensions:
% \begin{macrocode}
-\textheight\paperwidth% altezza griglia
-\textwidth=\CL@pageratio\textheight
+\textheight\paperwidth
+\textwidth=\CLpageratio\textheight
% \end{macrocode}
% We then compute the real margins between the page sides and the type block:
% \begin{macrocode}
-\innermargin=\CL@smallratio\paperwidth
-\outermargin=\CL@largeratio\paperwidth
-\uppermargin=\CL@smallratio\paperheight
+\innermargin=\CLsmallratio\paperwidth
+\outermargin=\CLlargeratio\paperwidth
+\uppermargin=\CLsmallratio\paperheight
% \end{macrocode}
-% But the typesetting engine does not use the net margins, due to the historical
-% one inch shift of the original \TeX\ implementation and, for the upper margin,
-% due to the fact that by default this layout implies the headings and the footers
-% outside the type block. Since we have the real outer margin dimension, we compute
+% But the typesetting engine does not use the net margins, due to the
+% historical one inch shift of the original \TeX\ implementation and,
+% for the upper margin, due to the fact that by default this layout
+% implies the headings and the footers outside the type block. Since
+% we have the real outer margin dimension, we compute
% the actual default marginal note measure:
% \begin{macrocode}
-\marginparwidth=\dimexpr0.8\outermargin-\marginparsep\relax
-\evensidemargin=\dimexpr\outermargin -1in\relax
-\oddsidemargin=\dimexpr\innermargin-1in\relax
-\topmargin=\dimexpr\uppermargin-1in-\headheight-\headsep\relax
+\marginparwidth=\fpeval{0.8\outermargin-\marginparsep}pt
+\evensidemargin=\fpeval{\outermargin -(1in)}pt
+\oddsidemargin=\fpeval{\innermargin-(1in)}pt
+\topmargin=\fpeval{\uppermargin-(1in)-\headheight-\headsep}pt
% \end{macrocode}
-% When using different classes from the \class{memoir} one, we adjust the type block
-% dimensions so that the type block contains an integer number of lines; we use the
-% normal size |\baslineskip| value and compute the number of lines contained in the
-% initial type block minus the first line stander height equal to |\topskip|; notice
-% that the integer value expression computed for counter 256 is a rounded value, not
-% a truncated value, therefore the actual type block height might get enlarged or
-% reduced a very little bit that will not be noticed with naked eye when one examines
-% a typeset page; eventually we recompute the |\textheight| taking into account the
-% height of the first line.
+% When using different classes from the \class{memoir} one, we adjust
+% the type block dimensions so that the type block contains an integer
+% number of lines; we use the normal size |\baselineskip| value and
+% compute the number of lines contained in the initial type block minus
+% the first line standard height equal to |\topskip|; notice that the
+% integer value expression is a rounded value,
+% not a truncated one, therefore the actual type block height might get
+% enlarged or reduced by a very little bit that will not be noticed with
+% naked eye when one examines a typeset page; eventually we recompute the
+% |\textheight| taking into account the height of the first line.
% \begin{macrocode}
-\normalfont
-\count256=\numexpr(\textheight-\topskip)/\baselineskip\relax
-\textheight=\count256\baselineskip\relax
-\textheight=\dimexpr\textheight+\topskip\relax
+\normalfont\textheight=%
+\fpeval{round((\textheight - \topskip)/\baselineskip, 0) * \baselineskip + \topskip}pt%
\normalbaselineskip\baselineskip
% \end{macrocode}
-% and we eventually close the second action depending on the use of the \class{memoir}
-% class:
+% and we eventually close the second action depending on the use of the
+% \class{memoir} class:
% \begin{macrocode}
-}
+}% end of test on the class being used
% \end{macrocode}
%
-% Just for testing the number of characters in a line, the following macros are provided.
-% A couple of scratch dimension registers will be used |dimen@| and |\abcwidth|; |\abcwidth|
-% will hold the current lowercase alphabet length, and |\dimen@| will hold several values
-% in succession. The scratch counter |\count254| will receive the final result to be
-% printed out. $\varepsilon$-\TeX\ arithmetics will be used throughout.
-%
-% Another service macro for the user's sake is |\charactersperpage|; this macro
-% typesets the average number of characters per line, the numbers of lines per
-% page, and eventually their product, a good estimate of the number of characters
-% per page.
-%
-% Many text editors have facilities for counting a ``compuscript'' number o words
-% and characters; with this further information the user may easily estimate the
-% number of pages of his/her document; of course s/he must allow a certain allowance
-% for the front and back matter pages, so that s/he can evaluate the total amount
-% of signatures of the whole typeset document; of course, by typesetting it with
-% \prog{(pdf)latex} s/he knows exactly the number of pages of the final document, but the
-% typographer wants to know a good estimate before the source \TeX\ files are finished.
+% Just for testing the number of characters in a line, the following
+% macros are provided. A couple of variables will be used |\CLaux|
+% and |\CLabcwidth|; |\CLabcwidth| will hold the current lowercase
+% alphabet length, while |\CLaux| will hold several values in succession.
+% The scratch variable |\CLcharcount| will receive the final result to be
+% printed out.
+%
+% Another service macro for the user's sake is |\charactersperpage|; this
+% macro typesets the average number of characters per line, the numbers of
+% lines per page, and eventually their product, a good estimate of the
+% number of characters per page.
+%
+% Many text editors have facilities for counting a “compuscript”
+% number of words and characters; with this further information the
+% user may easily estimate the number of pages of his/her document;
+% of course s/he must allow a certain allowance for the front and back
+% matter pages, so that s/he can evaluate the total amount of signatures
+% of the whole typeset document; of course, by typesetting it with
+% \prog{(pdf)latex} s/he knows exactly the number of pages of the final
+% document, but the typography shop generally wants to know a good
+% estimate before the source \TeX\ files are finished.
% \begin{macrocode}
\newlength\abc@width
+\settowidth\abc@width{abcdefghijklmnopqrstuvwxyz}%
+\edef\CLcharcount{\fpeval{round(\textwidth * 26 / \abc@width,0)}}
\newcommand*\currentfontletters{%
-\settowidth\abc@width{abcdefghijklmnopqrstuvwxyz}\dimen0=26\p@
-\dimen0=\dimexpr \textwidth * \dimen0 / \abc@width \relax
-\count254=\numexpr \dimen0 / \p@ \relax
\par The number of characters in one text line with the current font is
- \the\count254.\par}
-
+ \CLcharcount.\par}
+%
\newcommand*\charactersperpage{%
-\settowidth\abc@width{abcdefghijklmnopqrstuvwxyz}\dimen0=26\p@
-\dimen0=\dimexpr \textwidth * \dimen0 / \abc@width \relax
-\count254=\numexpr \dimen0 / \p@ \relax
-\count252=\numexpr \textheight / \baselineskip \relax
-\count250=\numexpr \count252 * \count254\relax
+\edef\CLlinesperpage{\fpeval{round(\textheight / \baselineskip,0)}}
+\edef\CLcharsperpage{%
+ \fpeval{\CLcharcount * \CLlinesperpage}}
\begin{quote} The average number of characters in one text line
- with the current font is \the\count254;
- this text block contains \the\count252\ lines;
+ with the current font is \CLcharcount;
+ this text block contains \CLlinesperpage\ lines;
a rough estimate of the number of characters per page is
- \the\count250.\par
+ \CLcharsperpage.\par
This information may be useful to evaluate the total number
of pages in a document.
\end{quote}}
+% \end{macrocode}
+% Using these macros, we can type out the information relative to this
+% specific documentation.
+% \charactersperpage
+%\iffalse
%</package>
+%<*txt>
+%\fi
+%
+% \begin{macrocode}
+Canoniclayout is a small extension package that allows to design
+a canonic layout based on the great circle inscribed within the
+page and tangent to the horizontal sides of the type block rectangle.
+The margins reflect the trimmed page shape ratio, therefore the
+type block principal diagonal coincides with the corresponding
+page diagonal; this layout is especially good for ISO page shapes
+but it can be used with many other traditional book page shapes.
+
+This new version is completely new, in the sense that its code
+calculations are performed by means of the 2018 xfp package
+facilities. For this reason it cannot be used with any TeX
+distribution preceding the year 2018 and updated by the end of
+that year; should this happen this very package aborts its own
+input while advising the user by means of an Error Message.
+
+This work is released under the Latex Project Public Licence
+v.1.3c. The LPPL is distributed with any TeX system distribution
+and can be found also in any CTAN archive.
+
+Claudio Beccari 2020
+claudio dot beccari at gmail dot com
% \end{macrocode}
+%\iffalse
+%</txt>
+%\fi
% \Finale
% \endinput
%
diff --git a/Master/texmf-dist/source/latex/caption/bicaption.dtx b/Master/texmf-dist/source/latex/caption/bicaption.dtx
index 9008263302a..5bba05cb2ff 100644
--- a/Master/texmf-dist/source/latex/caption/bicaption.dtx
+++ b/Master/texmf-dist/source/latex/caption/bicaption.dtx
@@ -2,7 +2,7 @@
%
% This is file `bicaption.dtx'.
%
-% Copyright (C) 2010-2018 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
+% Copyright (C) 2010-2020 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
%
% --------------------------------------------------------------------------
%
@@ -19,21 +19,25 @@
% This Current Maintainer of this work is Axel Sommerfeldt.
%
% This work consists of the files
-% caption.ins, caption.dtx, caption2.dtx, caption3.dtx,
-% bicaption.dtx, ltcaption.dtx, subcaption.dtx, totalcount.dtx,
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
% the derived files
-% caption.sty, caption2.sty, caption3.sty,
-% bicaption.sty, ltcaption.sty, subcaption.sty, totalcount.sty,
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
% and the user manuals
% caption-deu.tex, caption-eng.tex, caption-rus.tex.
%
% \fi
-% \CheckSum{427}
+% \CheckSum{457}
%
% \iffalse
%<*driver>
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesFile{bicaption.drv}[2016/03/27 v1.2 Adds a bilingual caption feature to the caption package]
+\ProvidesFile{bicaption.drv}[2020/10/25 v1.3 Adds a bilingual caption feature to the caption package]
\hbadness=9999 \newcount\hbadness \hfuzz=74pt % Make TeX shut up.
%\errorcontextlines=3
%
@@ -41,17 +45,11 @@
\setlength\parindent{0pt}
\setlength\parskip{\smallskipamount}
%
-\newcommand\LineBreak{\linebreak[3]}
-\newcommand\PageBreak{\pagebreak[3]}
\usepackage{ifpdf}
\ifpdf
\usepackage{mathptmx,courier}
\usepackage[scaled=0.90]{helvet}
\addtolength\marginparwidth{15pt}
- \ifdim\paperheight=297mm % a4paper
- \renewcommand\LineBreak{\\}
- \renewcommand\PageBreak{\clearpage}
- \fi
\fi
%
\usepackage[T1]{fontenc}
@@ -75,7 +73,7 @@
%
\newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
\newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
-\newcommand*\version[2][]{$v#2$}
+\newcommand*\version[2][]{v$#2$}
%
\usepackage{marvosym}
\makeatletter
@@ -163,16 +161,17 @@
% \label{sec:options}
%
% \DescribeMacro{\captionsetup}
+% The command
% \begin{quote}
% |\captionsetup[bi]|\marg{options}
% \end{quote}
-% do setup options which will be used for bilanguage captions \emph{additionally}
+% does setup options which will be used for bilanguage captions \emph{additionally}
% to the ones which are setup for the specific floating environment.
%
% \begin{quote}
% |\captionsetup[bi-first]|\marg{options}
% \end{quote}
-% do setup options which will be used for the \emph{first} heading
+% does setup options which will be used for the \emph{first} heading
% of the bilanguage captions \emph{additionally}
% to the ones which are setup for the specific floating environment
% and the ones which are setup by |\captionsetup[bi]{|\ldots|}|.
@@ -180,16 +179,16 @@
% \begin{quote}
% |\captionsetup[bi-second]|\marg{options}
% \end{quote}
-% do setup options which will be used for the \emph{second} heading
+% does setup options which will be used for the \emph{second} heading
% of the bilanguage captions \emph{additionally}
% to the ones which are setup for the specific floating environment
% and the ones which are setup by |\captionsetup[bi]{|\ldots|}|.
%
% \bigskip
%
-% Options specified with |\use|\-|package[|\ldots|]{bi|\-|caption}| and
-% |\caption|\-|setup[bi|\ldots|]{|\ldots|}| will override the ones specified by
-% |\caption|\-|setup{|\ldots|}| and |\caption|\-|setup[fig|\-|ure]{|\ldots|}|
+% Options specified with |\use|\-|package[|\ldots|]{bi|\-|cap|\-|tion}| and
+% |\cap|\-|tion|\-|setup[bi|\ldots|]{|\ldots|}| will override the ones specified by
+% |\cap|\-|tion|\-|setup{|\ldots|}| and |\cap|\-|tion|\-|setup[fig|\-|ure]{|\ldots|}|
% (same for `table'). So finally we have the following order how
% settings for bilingual captions are applied:
% \begin{enumerate}
@@ -238,7 +237,6 @@
%
% \begin{Options}{language=}
% \item[lang=]
-% \DescribeMacro{language=}
% Sets the language of the caption, e.g.
% \begin{quote}|\use|\-|package|\-|[lang=eng|\-|lish]{bi|\-|caption}|\end{quote}
% will typeset the second caption of bilingual captions in English.
@@ -246,7 +244,6 @@
% see \autoref{sec:babel} for details.)
%
% \item[bi-lang=]
-% \DescribeMacro{bi-lang=}
% Causes a selection of the headings of bilingual captions.
% \begin{quote}|\captionsetup{bi-lang=both}|\end{quote}
% will cause that both caption headings are being typeset.\\
@@ -257,18 +254,42 @@
% will cause that only the \emph{second} heading is being typeset.
%
% \item[bi-slc=]
-% \DescribeMacro{bi-singlelinecheck=}
-% Switches the common single-line-check |on| or |off|, i.e.~when switched on
+% \begin{quote}|\captionsetup{bi-slc=|\meta{bool}|}|\end{quote}
+% switches the common single-line-check |on| or |off|, i.e.~when switched on
% only a single check will be done for both captions, and the result will affect
% both captions afterwards. So if only one caption is longer than a single line,
% both captions will be treated as if they are longer than a single line, even if
% the second one isn't. (The default is |on|.)
%
% \item[bi-swap=]
-% \DescribeMacro{bi-swap=}
% \begin{quote}|\captionsetup{bi-swap}|\end{quote}
% will swap the primary and secondary language,
% making the first language the second one and vice versa. (The default is |false|.)
+%
+% \NEWfeature{v1.3}
+% \item[bi-separator=]
+% \begin{quote}|\captionsetup{bi-separator=|\meta{name}|}|\end{quote}
+% will select a separator between first and second bilingual caption.
+% You could choose one of the following: `none' (which is the default one
+% and could also be addressed as `default'), `smallskip', `medskip',
+% `largeskip', or a self-defined one using
+% \DescribeMacro{\DeclareBiCaptionSeparator}
+% \begin{quote}|\DeclareBiCaptionSeparator|\marg{name}\marg{code}\end{quote}
+% Examples:
+% \begin{quote}
+% |\captionsetup{bi-separator=smallskip}|
+% \end{quote}
+% will put a |\smallskip| between the two bilingual captions.
+% \begin{quote}
+% |\DeclareBiCaptionSeparator{hrule}{\hrule}|\\
+% |\captionsetup{bi-separator=hrule}|
+% \end{quote}
+% will draw a horizontal line between the two bilingual captions.
+% \begin{quote}
+% |\DeclareBiCaptionSeparator{3pt}{\vspace{3pt}}|\\
+% |\captionsetup{bi-separator=3pt}|
+% \end{quote}
+% will put |3pt| vertical space between the two bilingual captions.
% \end{Options}
%
% \section{The \cs{bicaption} commands}
@@ -333,7 +354,7 @@
% \cs{subcaptionbox}.)
% \endgroup
%
-% \PageBreak
+% \pagebreak[3]
% \section{A sample document}
% \label{sec:example}
%
@@ -440,7 +461,7 @@
% |\end{document}|
% \end{quote}
%
-% \PageBreak
+% \pagebreak[3]
% \captionsetup[bi-first]{lang=german}
% \captionsetup[bi-second]{lang=english,font=it}
% \captionsetup[sub]{format=hang,list=on}
@@ -531,7 +552,7 @@
% {Short English heading}
% \end{figure}
%
-% \PageBreak
+% \pagebreak[3]
% \section{Customising lists}
% \label{sec:lists}
%
@@ -827,17 +848,10 @@
%
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesPackage{bicaption}[2016/03/27 v1.2 Bilingual Captions (AR)]
+\ProvidesPackage{bicaption}[2020/10/25 v1.3 Bilingual Captions (AR)]
% \end{macrocode}
% \begin{macrocode}
-\RequirePackage{caption}[2018/05/11] % needs v3.4 or newer
-% \end{macrocode}
-% \changes{v1.0}{2011/09/01}{Compatibility error added}
-% \begin{macrocode}
-\caption@AtBeginDocument{\caption@ifcompatibility{%
- \caption@Error{%
- The `bicaption' package does not work correctly\MessageBreak
- in compatibility mode}}{}}
+\RequirePackage{caption}[2020/08/23] % needs v3.5 or newer
% \end{macrocode}
%
% \bigskip
@@ -897,6 +911,30 @@
% \end{macro}
%
% \pagebreak[3]
+% \subsection{Compatibility check}
+%
+% \begin{macro}{\bicaption@CheckCompatibility}
+% \changes{v1.0}{2011/09/01}{Compatibility error added}
+% \changes{v1.2a}{2020/08/01}{Error text adapted to \package{caption} package~\version{4.0}}
+% \begin{macrocode}
+\newcommand*\bicaption@CheckCompatibility{%
+% \end{macrocode}
+% \begin{macrocode}
+ \caption@ifcompatibility{%
+ \bicaption@Error
+ {This package does not work with\MessageBreak
+ caption option `compatibility=v1'}%
+ \endinput}{}}
+% \end{macrocode}
+% \begin{macrocode}
+\bicaption@CheckCompatibility
+\caption@AtBeginDocument{%
+ \bicaption@CheckCompatibility
+ \let\bicaption@CheckCompatibility\@undefined}
+% \end{macrocode}
+% \end{macro}
+%
+% \pagebreak[3]
% \subsection{Declaration of options}
%
% The option |bi-lang| will setup which language(s) will actually be typeset,
@@ -932,6 +970,37 @@
\caption@set@bool\bicaption@ifswap{#1}}
% \end{macrocode}
%
+% The option |bi-separator| will setup the separator between
+% the two bi-lingual captions.
+% \begin{macrocode}
+\DeclareCaptionOption{bi-separator}[1]{%
+ \caption@set{biseparator}{#1}}
+% \end{macrocode}
+%
+% \begin{macro}{\DeclareBiCaptionSeparator}
+% \changes{v1.3}{2020/10/25}{This macro added}
+% |\DeclareBiCaptionSeparator|\marg{name}\marg{code}
+% \begin{macrocode}
+\newcommand\DeclareBiCaptionSeparator[2]{%
+ \caption@decl{biseparator}{#1}{#2}}
+\@onlypreamble\DeclareBiCaptionSeparator
+% \end{macrocode}
+% \end{macro}
+%
+% There are four pre-defined separators, called `none',
+% `smallskip', `medskip', and `bigskip'.
+% \begin{macrocode}
+\DeclareBiCaptionSeparator{none}{}
+\DeclareBiCaptionSeparator{smallskip}{\smallskip}
+\DeclareBiCaptionSeparator{medskip}{\medskip}
+\DeclareBiCaptionSeparator{bigskip}{\bigskip}
+% \end{macrocode}
+%
+% The default separator usually maps to `none'.
+% \begin{macrocode}
+\SetCaptionDefault{biseparator}{none}
+% \end{macrocode}
+%
% The option |lang=|\meta{language} will setup the language of the caption.
% We can't set the language immediately because otherwise we will get in trouble, e.g. when
% using the \package{microtype} package via |\usepackage[babel]{microtype}|.
@@ -1031,9 +1100,10 @@
% \pagebreak[3]
% \subsection{Execution of options}
%
-% Setup default values for |bi-lang| and |bi-singlelinecheck|.
+% Setup default values for |bi-lang|, |bi-single|\-|line|\-|check|,
+% |bi-swap|, and |bi-separator|.
% \begin{macrocode}
-\caption@ExecuteOptions{caption}{bi-lang=0,bi-slc=1,bi-swap=0}
+\caption@ExecuteOptions{caption}{bi-lang=0,bi-slc=1,bi-swap=0,bi-separator=default}
% \end{macrocode}
%
% Set the language for the first caption.
@@ -1157,6 +1227,7 @@
%
% \begin{macro}{\bicaption@@make}
% \changes{v1.1}{2015/09/16}{\cs{bicaption@label} replaced by \cs{caption@thelabel}}
+% \changes{v1.3}{2020/10/25}{Usage of \cs{caption@biseparator} added}
% |\bicaption@@make|\marg{text \#2}\marg{label}\marg{text \#1}\par
% Typeset both captions using the original version of \cs{caption@@make}.
% \begin{macrocode}
@@ -1170,8 +1241,8 @@
% \begin{macrocode}
\ifnum\bicaption@lang=0\relax
\bicaption@ifslc
- {\caption@slc{#2}{#3}{}{\KV@caption@singlelinecheck0}%
- \caption@slc{#2}{#1}{}{\KV@caption@singlelinecheck0}}%
+ {\caption@slc{#2}{#3}{}{\caption@setsinglelinecheck0}%
+ \caption@slc{#2}{#1}{}{\caption@setsinglelinecheck0}}%
{}%
\fi
% \end{macrocode}
@@ -1181,17 +1252,20 @@
\ifnum\bicaption@lang=2\relax
\caption@thelabel
\global\let\caption@thelabel\relax
+ \let\bicaption@tempa\relax
\else
\begingroup
\caption@setoptions{bi-first}%
\caption@@make@{#2}{#3}%
\endgroup
+ \def\bicaption@tempa{\bicaption@separator\caption@biseparator}%
\fi
% \end{macrocode}
% Typeset the second caption, if requested.
% \begin{macrocode}
\ifnum\bicaption@lang=1\relax
\else
+ \bicaption@tempa
\begingroup
\caption@setoptions{bi-second}%
\caption@@make@{#2}{#1}%
@@ -1199,6 +1273,9 @@
\fi
}
% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\bicaption@separator{\par}
+% \end{macrocode}
% \end{macro}
%
% \pagebreak[3]
@@ -1259,7 +1336,7 @@
% \end{macrocode}
% \begin{macrocode}
\long\def\@@@@bicaption#1#2[#3]#4{%
- \caption@getlabel#2\label{}\@nil
+ \caption@getlabel{#2}%
\bicaption@ifswap
{\bicaption@setup{#1}{#2}%
\bicaption@cmd[{#3}]{#4}}%
@@ -1293,7 +1370,7 @@
% \begin{macrocode}
\long\def\LT@@@@bicaption#1#2[#3]#4{%
\gdef\bicaption@LTsetup{%
- \caption@getlabel#2\label{}\@nil
+ \caption@getlabel{#2}%
\bicaption@LT@setup}%
\gdef\bicaption@LT@setup{%
\bicaption@ifswap
diff --git a/Master/texmf-dist/source/latex/caption/caption-ams-smf.dtx b/Master/texmf-dist/source/latex/caption/caption-ams-smf.dtx
new file mode 100644
index 00000000000..cc036505c66
--- /dev/null
+++ b/Master/texmf-dist/source/latex/caption/caption-ams-smf.dtx
@@ -0,0 +1,254 @@
+% \iffalse meta-comment
+%
+% This is file `caption-ams-smf.dtx'.
+%
+% Copyright (C) 2007-2020 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
+%
+% --------------------------------------------------------------------------
+%
+% 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
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Axel Sommerfeldt.
+%
+% This work consists of the files
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
+% the derived files
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
+% and the user manuals
+% caption-deu.tex, caption-eng.tex, caption-rus.tex.
+%
+% \fi
+% \CheckSum{21}
+%
+% \iffalse
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-ams-smf.drv}[2020/07/31 v2.0 Implementation of the caption-ams-smf package]
+\hbadness=9999 \newcount\hbadness \hfuzz=100pt % Make TeX shut up.
+%\errorcontextlines=3
+%
+\documentclass{ltxdoc}
+\setlength\parindent{0pt}
+\setlength\parskip{\smallskipamount}
+%
+\makeatletter % make room for subsections like 2.16.14 in the TOC
+%\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}}
+\renewcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.7em}}
+\makeatother
+%
+\usepackage{ifpdf}
+\ifpdf
+ \usepackage{mathptmx,courier}
+ \usepackage[scaled=0.90]{helvet}
+ \addtolength\marginparwidth{15pt}
+\fi
+%
+\usepackage{hypdoc}
+\ifpdf\usepackage{hypdestopt}\fi
+\hypersetup{pdfkeywords={LaTeX, package, caption},pdfstartpage={},pdfstartview={}}
+%
+\DeclareRobustCommand*\AmS{\texorpdfstring
+ {{\protect\usefont{OMS}{cmsy}{m}{n}A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}%
+ {AMS}}
+\DeclareRobustCommand*\SmF{SMF}
+%
+\begin{document}
+ \DocInput{caption-ams-smf.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \newcommand*\purerm[1]{\texorpdfstring{{\upshape\mdseries\rmfamily #1}}{#1}}
+% \newcommand*\puresf[1]{\texorpdfstring{{\upshape\mdseries\sffamily #1}}{#1}}
+% \newcommand*\purett[1]{\texorpdfstring{{\upshape\mdseries\ttfamily #1}}{#1}}
+% \let\class\puresf \let\package\puresf
+% \let\env\purett \let\opt\purett
+%
+% \newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
+% \newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
+% \newcommand*\version[2][]{v$#2$}
+%
+% \GetFileInfo{caption-ams-smf.drv}
+% \let\docdate\filedate
+% \let\docversion\fileversion
+% \GetFileInfo{caption-ams-smf.sto}
+%
+% \title{\texorpdfstring
+% {The adaption of the \package{caption} package to the \AmS\ and \SmF\ document classes\thanks{%^^A
+% This adaption has version number \docversion.}}%^^A
+% {The adaption of the caption package to the AMS and SMF document classes}}
+% \author{Axel Sommerfeldt\\
+% \url{https://gitlab.com/axelsommerfeldt/caption}}
+% \date{\docdate}
+% \maketitle
+%
+% \begin{abstract}
+% This package adapts the \package{caption} package to the \AmS\ and \SmF\ document classes.
+% \end{abstract}
+%
+% \section*{User manual}
+%
+% This document is describing the code implementation only.
+% The user documentation can be found in
+% \nopagebreak\begin{quote}
+% \begin{tabular}{ll}
+% \href{http://mirror.ctan.org/macros/latex/contrib/caption/caption-eng.pdf}%
+% {\texttt{caption-eng.pdf}} & The caption package bundle documentation \\
+% \end{tabular}
+% \end{quote}
+%
+% \StopEventually{}
+% \iffalse
+% \clearpage
+% \tableofcontents
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \DoNotIndex{\\,\_,\ ,\@@par}
+% \DoNotIndex{\@bsphack}
+% \DoNotIndex{\@car,\@cdr,\@classoptionslist,\@cons,\@currext,\@currname}
+% \DoNotIndex{\@ehc,\@ehd,\@empty,\@esphack,\@expandtwoargs}
+% \DoNotIndex{\@for,\@firstofone,\@firstoftwo}
+% \DoNotIndex{\@gobble,\@gobblefour,\@gobbletwo,\@hangfrom}
+% \DoNotIndex{\if@minipage\@ifnextchar,\@ifpackagelater,\@ifpackageloaded}
+% \DoNotIndex{\@ifstar,\@ifundefined,\@latex@error,\@minipagefalse,\@minipagetrue}
+% \DoNotIndex{\@namedef,\@nameuse}
+% \DoNotIndex{\@onlypreamble,\@parboxrestore,\@plus,\@ptionlist}
+% \DoNotIndex{\@removeelement,\@restorepar,\@secondoftwo,\@setminipage,\@setpar}
+% \DoNotIndex{\@tempa,\@tempboxa,\@tempdima,\@tempdimb,\@tempdimc,\@tempb,\@tempc}
+% \DoNotIndex{\@testopt}
+% \DoNotIndex{\@undefined,\@unprocessedoptions,\@unusedoptionlist}
+% \DoNotIndex{\p@,\z@}
+% \DoNotIndex{\active,\addtocounter,\addtolength,\advance,\aftergroup}
+% \DoNotIndex{\baselineskip,\begin,\begingroup,\bfseries,\box}
+% \DoNotIndex{\catcode,\centering,\changes,\csname,\def,\divide,\do,\downarrow}
+% \DoNotIndex{\edef,\else,\empty,\end,\endcsname,\endgraf,\endgroup,\expandafter}
+% \DoNotIndex{\fi,\footnotesize,\global}
+% \DoNotIndex{\hangindent,\hbox,\hfil,\hsize,\hskip,\hspace,\hss}
+% \DoNotIndex{\ifcase,\ifdim,\ifnum,\ifodd,\ifvoid,\ifvmode}
+% \DoNotIndex{\ifx,\ignorespaces,\itshape}
+% \DoNotIndex{\Large,\large,\leavevmode,\leftmargini,\leftskip,\let,\linewidth}
+% \DoNotIndex{\llap,\long,\m@ne,\margin,\mdseries,\message}
+% \DoNotIndex{\newcommand,\newdimen,\newlength,\newline,\newif,\newsavebox}
+% \DoNotIndex{\next,\nobreak,\nobreakspace,\noexpand,\noindent,\numberline}
+% \DoNotIndex{\normalcolor,\normalfont,\normalsize,\or,\par,\parbox,\parfillskip}
+% \DoNotIndex{\parindent,\parskip,\prevdepth,\protect,\protected@edef,\protected@write}
+% \DoNotIndex{\providecommand,\quad}
+% \DoNotIndex{\raggedleft,\raggedright,\relax,\renewcommand,\RequirePackage}
+% \DoNotIndex{\rightskip,\rmfamily}
+% \DoNotIndex{\sbox,\scriptsize,\scshape,\setbox,\setlength,\sffamily,\slshape}
+% \DoNotIndex{\small,\string,\space,\strut}
+% \DoNotIndex{\textheight,\the,\toks@,\typeout,\ttfamily}
+% \DoNotIndex{\unvbox,\uparrow,\upshape,\usebox,\usepackage}
+% \DoNotIndex{\value,\vbox,\vsize,\vskip,\wd,\width,\z@skip}
+% \DoNotIndex{\AtBeginDocument,\AtEndOfPackage,\CurrentOption,\DeclareOption}
+% \DoNotIndex{\ExecuteOptions,\GenericWarning,\IfFileExists,\InputIfFileExists}
+% \DoNotIndex{\NeedsTeXFormat,\MessageBreak}
+% \DoNotIndex{\PackageError,\PackageInfo,\PackageWarning,\PackageWarningNoLine}
+% \DoNotIndex{\PassOptionsToPackage,\ProcessOptions,\ProvidesPackage}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \setlength{\parskip}{0pt plus 1pt}
+% \newcommand*\Note[2][Note]{\par{\small\emph{#1:} #2}\par}
+%
+% \changes{v1.1}{2007/07/29}{\AmS\ \& \SmF\ classes support added}
+% \changes{v2.0}{2020/07/27}{\AmS\ \& \SmF\ class support adapted to \package{caption3}~\version{2.0}}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \section{Identification}
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-ams-smf.sto}[2020/08/22 v2.0 Adaption of the caption package to the AMS and SMF document classes (AR)]
+% \end{macrocode}
+%
+% \section{Margin resp. width}
+%
+% The \AmS\ document classes use |\caption|\-|indent| as fixed margin, usually set to |3pc|.
+% \begin{macrocode}
+\SetCaptionDefault*{margin}{\the\captionindent}
+% \end{macrocode}
+%
+% \section{Label separator}
+%
+% \begin{macrocode}
+\DeclareCaptionLabelSeparator{default}{.\enspace}
+% \end{macrocode}
+%
+% \section{Fonts}
+%
+% The `default' fonts map to |\@caption|\-|font| resp.~|\@caption|\-|head|\-|font|
+% which are usually set to |\sc|\-|shape| resp.~|\normalfont|.
+%
+% \begin{macrocode}
+\DeclareCaptionFont{ams@font}{\@captionfont}
+\DeclareCaptionFont{ams@labelfont}{\@captionheadfont}
+\DeclareCaptionFont{ams@textfont}{\@captionfont\upshape}
+\SetCaptionDefault{font}{ams@font}
+\SetCaptionDefault{labelfont}{ams@labelfont}
+\SetCaptionDefault{textfont}{ams@textfont}
+% \end{macrocode}
+%
+% \section{Vertical spaces before and after captions}
+%
+% The \AmS\ document classes uses |\above|\-|caption|\-|skip| and |\below|\-|caption|\-|skip|
+% different than the standard document classes and the \package{caption} package:
+% They typeset |\above|\-|caption|\-|skip| before the `figure' caption and
+% |\below|\-|caption|\-|skip| after all other captions. Both are preset to |12pt|.
+%
+% For this reason we have to set the |\below|\-|caption|\-|skip| to |0pt| if the \package{caption}
+% package is used, so no extra vertical space will be created.
+%
+% \begin{macrocode}
+\AtCaptionPackage{\setlength\belowcaptionskip{0pt}}
+% \end{macrocode}
+%
+% \section{Positioning}
+%
+% The default caption position in all floating environments except `figure' is `top'.
+% \begin{macrocode}
+\captionsetup{position=t,figureposition=b}
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+% \Finale
+%
+\endinput
+
diff --git a/Master/texmf-dist/source/latex/caption/caption-beamer.dtx b/Master/texmf-dist/source/latex/caption/caption-beamer.dtx
new file mode 100644
index 00000000000..934f489f4a5
--- /dev/null
+++ b/Master/texmf-dist/source/latex/caption/caption-beamer.dtx
@@ -0,0 +1,382 @@
+% \iffalse meta-comment
+%
+% This is file `caption-beamer.dtx'.
+%
+% Copyright (C) 2007-2020 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
+%
+% --------------------------------------------------------------------------
+%
+% 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
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Axel Sommerfeldt.
+%
+% This work consists of the files
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
+% the derived files
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
+% and the user manuals
+% caption-deu.tex, caption-eng.tex, caption-rus.tex.
+%
+% \fi
+% \CheckSum{104}
+%
+% \iffalse
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-beamer.drv}[2018/05/13 v2.0 Implementation of the caption-beamer package]
+\hbadness=9999 \newcount\hbadness \hfuzz=100pt % Make TeX shut up.
+%\errorcontextlines=3
+%
+\documentclass{ltxdoc}
+\setlength\parindent{0pt}
+\setlength\parskip{\smallskipamount}
+%
+\makeatletter % make room for subsections like 2.16.14 in the TOC
+%\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}}
+\renewcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.7em}}
+\makeatother
+%
+\usepackage{ifpdf}
+\ifpdf
+ \usepackage{mathptmx,courier}
+ \usepackage[scaled=0.90]{helvet}
+ \addtolength\marginparwidth{15pt}
+\fi
+%
+\usepackage{hypdoc}
+\ifpdf\usepackage{hypdestopt}\fi
+\hypersetup{pdfkeywords={LaTeX, package, caption},pdfstartpage={},pdfstartview={}}
+%
+\begin{document}
+ \DocInput{caption-beamer.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \newcommand*\purerm[1]{\texorpdfstring{{\upshape\mdseries\rmfamily #1}}{#1}}
+% \newcommand*\puresf[1]{\texorpdfstring{{\upshape\mdseries\sffamily #1}}{#1}}
+% \newcommand*\purett[1]{\texorpdfstring{{\upshape\mdseries\ttfamily #1}}{#1}}
+% \let\class\puresf \let\package\puresf
+% \let\env\purett \let\opt\purett
+%
+% \newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
+% \newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
+% \newcommand*\version[2][]{v$#2$}
+%
+% \GetFileInfo{caption-beamer.drv}
+% \let\docdate\filedate
+% \let\docversion\fileversion
+% \GetFileInfo{caption-beamer.sto}
+%
+% \title{\texorpdfstring
+% {The adaption of the \package{caption} package to the \class{beamer} document class\thanks{%^^A
+% This adaption has version number \docversion.}}%^^A
+% {The adaption of the caption package to the beamer document class}}
+% \author{Axel Sommerfeldt\\
+% \url{https://gitlab.com/axelsommerfeldt/caption}}
+% \date{\docdate}
+% \maketitle
+%
+% \begin{abstract}
+% This package adapts the \package{caption} package to the \class{beamer} document class.
+% \end{abstract}
+%
+% \section*{User manual}
+%
+% This document is describing the code implementation only. The user
+% documentation can be found in
+% \nopagebreak\begin{quote}
+% \begin{tabular}{ll}
+% \href{http://mirror.ctan.org/macros/latex/contrib/caption/caption-eng.pdf}%
+% {\texttt{caption-eng.pdf}} & The caption package bundle documentation \\
+% \end{tabular}
+% \end{quote}
+%
+% \StopEventually{}
+% \iffalse
+% \clearpage
+% \tableofcontents
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \DoNotIndex{\\,\_,\ ,\@@par}
+% \DoNotIndex{\@bsphack}
+% \DoNotIndex{\@car,\@cdr,\@classoptionslist,\@cons,\@currext,\@currname}
+% \DoNotIndex{\@ehc,\@ehd,\@empty,\@esphack,\@expandtwoargs}
+% \DoNotIndex{\@for,\@firstofone,\@firstoftwo}
+% \DoNotIndex{\@gobble,\@gobblefour,\@gobbletwo,\@hangfrom}
+% \DoNotIndex{\if@minipage\@ifnextchar,\@ifpackagelater,\@ifpackageloaded}
+% \DoNotIndex{\@ifstar,\@ifundefined,\@latex@error,\@minipagefalse,\@minipagetrue}
+% \DoNotIndex{\@namedef,\@nameuse}
+% \DoNotIndex{\@onlypreamble,\@parboxrestore,\@plus,\@ptionlist}
+% \DoNotIndex{\@removeelement,\@restorepar,\@secondoftwo,\@setminipage,\@setpar}
+% \DoNotIndex{\@tempa,\@tempboxa,\@tempdima,\@tempdimb,\@tempdimc,\@tempb,\@tempc}
+% \DoNotIndex{\@testopt}
+% \DoNotIndex{\@undefined,\@unprocessedoptions,\@unusedoptionlist}
+% \DoNotIndex{\p@,\z@}
+% \DoNotIndex{\active,\addtocounter,\addtolength,\advance,\aftergroup}
+% \DoNotIndex{\baselineskip,\begin,\begingroup,\bfseries,\box}
+% \DoNotIndex{\catcode,\centering,\changes,\csname,\def,\divide,\do,\downarrow}
+% \DoNotIndex{\edef,\else,\empty,\end,\endcsname,\endgraf,\endgroup,\expandafter}
+% \DoNotIndex{\fi,\footnotesize,\global}
+% \DoNotIndex{\hangindent,\hbox,\hfil,\hsize,\hskip,\hspace,\hss}
+% \DoNotIndex{\ifcase,\ifdim,\ifnum,\ifodd,\ifvoid,\ifvmode}
+% \DoNotIndex{\ifx,\ignorespaces,\itshape}
+% \DoNotIndex{\Large,\large,\leavevmode,\leftmargini,\leftskip,\let,\linewidth}
+% \DoNotIndex{\llap,\long,\m@ne,\margin,\mdseries,\message}
+% \DoNotIndex{\newcommand,\newdimen,\newlength,\newline,\newif,\newsavebox}
+% \DoNotIndex{\next,\nobreak,\nobreakspace,\noexpand,\noindent,\numberline}
+% \DoNotIndex{\normalcolor,\normalfont,\normalsize,\or,\par,\parbox,\parfillskip}
+% \DoNotIndex{\parindent,\parskip,\prevdepth,\protect,\protected@edef,\protected@write}
+% \DoNotIndex{\providecommand,\quad}
+% \DoNotIndex{\raggedleft,\raggedright,\relax,\renewcommand,\RequirePackage}
+% \DoNotIndex{\rightskip,\rmfamily}
+% \DoNotIndex{\sbox,\scriptsize,\scshape,\setbox,\setlength,\sffamily,\slshape}
+% \DoNotIndex{\small,\string,\space,\strut}
+% \DoNotIndex{\textheight,\the,\toks@,\typeout,\ttfamily}
+% \DoNotIndex{\unvbox,\uparrow,\upshape,\usebox,\usepackage}
+% \DoNotIndex{\value,\vbox,\vsize,\vskip,\wd,\width,\z@skip}
+% \DoNotIndex{\AtBeginDocument,\AtEndOfPackage,\CurrentOption,\DeclareOption}
+% \DoNotIndex{\ExecuteOptions,\GenericWarning,\IfFileExists,\InputIfFileExists}
+% \DoNotIndex{\NeedsTeXFormat,\MessageBreak}
+% \DoNotIndex{\PackageError,\PackageInfo,\PackageWarning,\PackageWarningNoLine}
+% \DoNotIndex{\PassOptionsToPackage,\ProcessOptions,\ProvidesPackage}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \setlength{\parskip}{0pt plus 1pt}
+% \newcommand*\Note[2][Note]{\par{\small\emph{#1:} #2}\par}
+%
+% \changes{v1.1}{2007/03/10}{\class{beamer} class support added}
+% \changes{v1.3}{2011/08/06}{\class{beamer} class support revised}
+% \changes{v1.5}{2013/04/27}{The \class{beamer} template \texttt{caption label separator} will be used now}
+% \changes{v1.7}{2016/05/22}{Re-definition of label format \texttt{simpleMagyar} added to \class{beamer} class support}
+% \changes{v1.7}{2018/04/15}{Re-definition of label format \texttt{simpleMagyar} revised}
+% \changes{v1.7}{2018/05/01}{Definition of \class{beamer} default label font revised}
+% \changes{v2.0}{2020/07/27}{\class{beamer} class support adapted to \package{caption3}~\version{2.0}}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \section{Identification}
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-beamer.sto}[2020/08/22 v2.0 Adaption of the caption package to the beamer document classes (AR)]
+% \end{macrocode}
+%
+% \section{Helper macros}
+%
+% \begin{macro}{\caption@ifbeamertemplate}
+% |\caption@ifbeamertemplate|\marg{caption template name}\marg{yes-code}\marg{no-code}\\
+% tests if the given beamer caption template was selected by the user (or not).
+% \begin{macrocode}
+\newcommand*\caption@ifbeamertemplate[1]{%
+ \begingroup
+ \let\beamer@@tmpl@caption@ORI\beamer@@tmpl@caption
+ \@nameuse{beamer@@tmpop@caption@#1}%
+ \ifx\beamer@@tmpl@caption@ORI\beamer@@tmpl@caption
+ \endgroup\expandafter\@firstoftwo
+ \else
+ \endgroup\expandafter\@secondoftwo
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Single-line-check}
+%
+% The `default' single-line-check maps to the beamer template setting `caption name own line'.
+% \begin{macrocode}
+\DeclareCaptionSinglelinecheck{default}{%
+ \caption@ifbeamertemplate{caption name own line}%
+ \@secondoftwo % \@secondoftwo -> singlelinecheck=off
+ \@firstoftwo} % \@firstoftwo -> singlelinecheck=on
+% \end{macrocode}
+%
+% \begin{macro}{\caption@prepareslc}
+% \changes{v1.12b}{2020/07/20}{Special adaption to \class{beamer} added}
+% The patch of \cs{footnote} provided by the \package{caption3} package assumes
+% that the optional arguments of \cs{footnote} and \cs{footnotemark} match.
+% Since this is not the case in \class{beamer} based documents,
+% and since \class{beamer} extents the syntax of \cs{footnote} in a special way,
+% we need a special patch here.\par
+% \emph{Note:} For this patch we assume that \cs{footnote} will always end with the usage of
+% \cs{beamer@footnotetext}. (Unfortunately \cs{footnote} is defined too monolithic
+% in \class{beamer} to offer a less dirty patch.)
+% \begin{macrocode}
+\g@addto@macro\caption@prepareslc{%
+ \def\footnote{%
+ \begingroup
+ \let\stepcounter\caption@l@stepcounter
+ \renewcommand<>\beamer@framefootnotetext[1]{%
+ \endgroup}%
+ \let\@footnotetext\beamer@framefootnotetext
+ \caption@footnote@ORI}}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Label formats}
+%
+% The `default' caption label format maps to either `simple' (if the `numbered' beamer template is set) or `unnumbered' (otherwise).
+% \begin{macrocode}
+\DeclareCaptionLabelFormat{default}{%
+ \caption@ifbeamertemplate{numbered}%
+ \caption@labelformat@simple
+ \caption@labelformat@unnumbered
+ {#1}{#2}}
+% \end{macrocode}
+%
+% The \package{magyar} babel package redefines the current label format to a one called |simple|\-|Magyar|,
+% defined within |\@@magyar@caption|\-|fix| which will be executed |\At|\-|Begin|\-|Document|:
+% \begin{quote}
+% |\DeclareCaptionLabelFormat{simpleMagyar}%|\\
+% | {#2.\bothIfSecond{\nobreakspace}{#1}}|
+% \end{quote}
+% When used with beamer, we need to patch it so no numbering will be used if the `numbered` template isn't selected.
+% \begin{macrocode}
+\DeclareCaptionLabelFormat{simpleMagyar}{%
+ \caption@ifbeamertemplate{numbered}%
+ {#2.\bothIfSecond{\nobreakspace}{#1}}%
+ {\caption@labelformat@unnumbered{#1}{#2}}}
+% \end{macrocode}
+% \begin{macro}{\@@magyar@captionfix}
+% Prevent \package{magyar} from defining this caption label format on its own.
+% \begin{macrocode}
+\let\@@magyar@captionfix\relax
+\AtBeginDocument{\let\@@magyar@captionfix\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Label separator}
+%
+% The `default' caption label separator maps to the beamer templates
+% `caption name own line' and `caption label separator'.
+%
+% If the beamer template `caption name own line' is set, this code equals to
+% \begin{quote}
+% |\DeclareCaptionLabelSeparator*{default}{\\}|
+% \end{quote}
+% otherwise this code equals to
+% \begin{quote}
+% |\DeclareCaptionLabelSeparator{default}%|\\
+% | {\usebeamertemplate{caption label separator}}|
+% \end{quote}
+% \begin{macrocode}
+\DeclareCaptionLabelSeparator**{default}%
+ {\caption@ifbeamertemplate{caption name own line}}%
+ {\caption@ifbeamertemplate{caption name own line}%
+ {\\}%
+ {\usebeamertemplate{caption label separator}}}
+% \end{macrocode}
+%
+% \section{Fonts}
+%
+% The `default' caption font maps to the beamer settings for `caption' resp. `caption name'.
+% \begin{macrocode}
+\DeclareCaptionFont{beamer@font}{%
+ \usebeamerfont*{caption}%
+ \usebeamercolor[fg]{caption}}
+\SetCaptionDefault{font}{beamer@font}
+% \end{macrocode}
+% \begin{macrocode}
+\DeclareCaptionFont{beamer@labelfont}{%
+ \setbeamercolor*{caption}{}% avoid setting "caption" color additionally
+ \usebeamercolor[fg]{caption name}%
+ \setbeamerfont*{caption}{}% avoid setting "caption" font additionally
+ \usebeamerfont{caption name}}
+\SetCaptionDefault{labelfont}{beamer@labelfont}
+% \end{macrocode}
+% \begin{macrocode}
+\DeclareCaptionFont{beamer@textfont}{}
+\SetCaptionDefault{textfont}{beamer@textfont}
+% \end{macrocode}
+%
+% \section{Justification}
+%
+% The `default' caption justification is `raggedright'.
+% \begin{macrocode}
+\SetCaptionDefault{justification}{raggedright}
+% \end{macrocode}
+%
+% \section{Lists}
+%
+% Since the beamer class do not offer a `List of figures' we switch it off.
+% \begin{macrocode}
+\captionsetup{list=off}
+% \end{macrocode}
+%
+% \section{Adaption of figure and table environment}
+%
+% \begin{macrocode}
+\AtCaptionPackage{%
+% \end{macrocode}
+%
+% \begin{macro}{\figure}
+% \changes{v1.1f}{2007/12/17}{This re-definition for \class{beamer} document class added}
+% \changes{v1.8d}{2019/09/01}{This re-definition for \class{beamer} document class revised}
+% \begin{macrocode}
+ \expandafter\let\expandafter\caption@beamer@figure
+ \csname\string\figure\endcsname
+ \@namedef{\string\figure}[#1]{%
+ \caption@beamer@figure[#1]% use original beamer code first
+ \caption@settype{figure}} % set "type=figure" afterwards
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\table}
+% \changes{v1.1f}{2007/12/17}{This re-definition for \class{beamer} document class added}
+% \changes{v1.8d}{2019/09/01}{This re-definition for \class{beamer} document class revised}
+% \changes{v1.8e}{2019/10/18}{Bug fixed which was introduced in previous revision}
+% We redefine |figure| \& |table| so our type-specific options will be used etc.
+% \begin{macrocode}
+ \expandafter\let\expandafter\caption@beamer@table
+ \csname\string\table\endcsname
+ \@namedef{\string\table}[#1]{%
+ \caption@beamer@table[#1]% use original beamer code first
+ \caption@settype{table}} % set "type=table" afterwards
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+}
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+% \Finale
+%
+\endinput
+
diff --git a/Master/texmf-dist/source/latex/caption/caption-deu.tex b/Master/texmf-dist/source/latex/caption/caption-deu.tex
index 6a58b3ca9a8..7d84184285d 100644
--- a/Master/texmf-dist/source/latex/caption/caption-deu.tex
+++ b/Master/texmf-dist/source/latex/caption/caption-deu.tex
@@ -1,7 +1,7 @@
%
% This is file `caption-deu.tex'.
%
-% Copyright (C) 1994-2012 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
+% Copyright (C) 1994-2020 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
%
% --------------------------------------------------------------------------
%
@@ -17,14 +17,21 @@
%
% This Current Maintainer of this work is Axel Sommerfeldt.
%
-% This work consists of the files caption.ins, caption.dtx, caption2.dtx,
-% caption3.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx, and newfloat.dtx,
-% the derived files caption.sty, caption2.sty, caption3.sty,
-% bicaption.sty, ltcaption.sty, subcaption.sty, and newfloat.sty,
-% and the user manuals caption-deu.tex, caption-eng.tex, and caption-rus.tex.
+% This work consists of the files
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
+% the derived files
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
+% and the user manuals
+% caption-deu.tex, caption-eng.tex, caption-rus.tex.
%
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesFile{caption-deu.tex}[2011/11/02 v3.2 Das caption-Paket]
+\ProvidesFile{caption-deu.tex}[2020/08/22 v3.4 Das caption-Paket]
\hbadness=9999 \newcount\hbadness \hfuzz=20pt % Make TeX shut up.
%\errorcontextlines=3
@@ -194,9 +201,12 @@
\GetFileInfo{caption-deu.tex}
\let\docdate\filedate
+\let\docdate\filedate
+\let\docversion\fileversion
\GetFileInfo{caption.sty}
-\title{Anpassen der Abbildungs- und Tabellenbeschriftungen}
+\title{Anpassen der Abbildungs- und Tabellenbeschriftungen\texorpdfstring{%
+ \thanks{Dieses Paket hat Versionsnummer \docversion.}}{}}
\author{Axel Sommerfeldt\\
\url{https://gitlab.com/axelsommerfeldt/caption}}
\date{\docdate}
@@ -223,11 +233,49 @@ kleinen aber feinen \package{capt-of}"=Paketes hierzu völlig ausreichend.
\newcommand\exampletext{%
Die auf die Rotationsfrequenz des Innenzylinders normierten Eigenfrequenzen
- der gefundenen Grundmoden der Taylor"=Str"omung f"ur \mbox{$\eta = 0.5$}. %\\
+ der gefundenen Grundmoden der Taylor"=Strömung f"ur \mbox{$\eta = 0.5$}. %\\
(Die azimutale Wellenzahl ist mit $m$ bezeichnet.)}
% --------------------------------------------------------------------------- %
+\section*{Status dieses Dokumentes}
+
+Diese Dokumentation ist veraltet.
+
+Sie dokumentiert die in Version \version{3.1} des \package{caption}"=Paketes
+verfügbaren Optionen und Befehle, jedoch nicht, was in folgenden Versionen
+hinzugefügt wurde. Warum?
+\begin{itemize}
+\item
+ Ich war nicht glücklich mit der Struktur der Dokumentation und wollte sie daher
+ neu schreiben. Warum also eine aufgegebene Version der Dokumentation pflegen?
+ (Leider hatte ich aber nie die Zeit gefunden, die neue Version zu schreiben.)
+\item
+ Da meine Freizeit seit dem Release der Version \version{3.1} nur spärlich
+ vorhanden war, wollte ich die Veröffentlichung von Verbesserungen und
+ Erweiterungen nicht aufgrund fehlender Dokumentation um Monate verzögern.
+\item
+ Da ich früher Fehlerkorrekturen nur in der aktuellen Entwicklungsversion
+ vorgenommen hatte, wollte ich die Veröffentlichung von Korrekturen nicht
+ aufgrund fehlender Dokumentation um Monate verzögern.
+ (Seit 2015 werden Fehler in der Regel auch für die letzte Release"=Version
+ behoben und auf CTAN veröffentlicht.)
+\end{itemize}
+
+Wie geht es nun weiter?
+\begin{itemize}
+\item
+ Ich werde in den nächsten Wochen starten, die Dokumentation (endlich) zu aktualisieren.
+\item
+ Bis die überarbeitete Version fertig und auf CTAN zu finden ist,
+ kann jederzeit der aktuelle Zwischenstand über
+ \url{https://gitlab.com/axelsommerfeldt/caption/-/blob/master/doc/caption-eng.pdf}
+ bezogen werden. (Zunächst wird die englischsprachige Dokumentation überarbeitet,
+ und erst anschließend die deutschsprachige.)
+\end{itemize}
+
+% --------------------------------------------------------------------------- %
+
\section*{Einleitung}
Mit |\caption| gesetzte Bildunterschriften und Tabellenüberschriften werden
diff --git a/Master/texmf-dist/source/latex/caption/caption-elsarticle.dtx b/Master/texmf-dist/source/latex/caption/caption-elsarticle.dtx
new file mode 100644
index 00000000000..878e8550229
--- /dev/null
+++ b/Master/texmf-dist/source/latex/caption/caption-elsarticle.dtx
@@ -0,0 +1,208 @@
+% \iffalse meta-comment
+%
+% This is file `caption-elsarticle.dtx'.
+%
+% Copyright (C) 2013-2020 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
+%
+% --------------------------------------------------------------------------
+%
+% 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
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Axel Sommerfeldt.
+%
+% This work consists of the files
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
+% the derived files
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
+% and the user manuals
+% caption-deu.tex, caption-eng.tex, caption-rus.tex.
+%
+% \fi
+% \CheckSum{3}
+%
+% \iffalse
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-elsarticle.drv}[2018/05/24 v2.0 Implementation of the caption-elsarticle package]
+\hbadness=9999 \newcount\hbadness \hfuzz=100pt % Make TeX shut up.
+%\errorcontextlines=3
+%
+\documentclass{ltxdoc}
+\setlength\parindent{0pt}
+\setlength\parskip{\smallskipamount}
+%
+\makeatletter % make room for subsections like 2.16.14 in the TOC
+%\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}}
+\renewcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.7em}}
+\makeatother
+%
+\usepackage{ifpdf}
+\ifpdf
+ \usepackage{mathptmx,courier}
+ \usepackage[scaled=0.90]{helvet}
+ \addtolength\marginparwidth{15pt}
+\fi
+%
+\usepackage{hypdoc}
+\ifpdf\usepackage{hypdestopt}\fi
+\hypersetup{pdfkeywords={LaTeX, package, caption},pdfstartpage={},pdfstartview={}}
+%
+\begin{document}
+ \DocInput{caption-elsarticle.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \newcommand*\purerm[1]{\texorpdfstring{{\upshape\mdseries\rmfamily #1}}{#1}}
+% \newcommand*\puresf[1]{\texorpdfstring{{\upshape\mdseries\sffamily #1}}{#1}}
+% \newcommand*\purett[1]{\texorpdfstring{{\upshape\mdseries\ttfamily #1}}{#1}}
+% \let\class\puresf \let\package\puresf
+% \let\env\purett \let\opt\purett
+%
+% \newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
+% \newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
+% \newcommand*\version[2][]{v$#2$}
+%
+% \GetFileInfo{caption-elsarticle.drv}
+% \let\docdate\filedate
+% \let\docversion\fileversion
+% \GetFileInfo{caption-elsarticle.sto}
+%
+% \title{\texorpdfstring
+% {The adaption of the \package{caption} package to the \class{elsarticle} document class\thanks{%^^A
+% This adaption has version number \docversion.}}%^^A
+% {The adaption of the caption package to the elsarticle document class}}
+% \author{Axel Sommerfeldt\\
+% \url{https://gitlab.com/axelsommerfeldt/caption}}
+% \date{\docdate}
+% \maketitle
+%
+% \begin{abstract}
+% This package adapts the \package{caption} package to the \package{elsarticle} document class.
+% \end{abstract}
+%
+% \section*{User manual}
+%
+% This document is describing the code implementation only. The user
+% documentation can be found in
+% \nopagebreak\begin{quote}
+% \begin{tabular}{ll}
+% \href{http://mirror.ctan.org/macros/latex/contrib/caption/caption-eng.pdf}%
+% {\texttt{caption-eng.pdf}} & The caption package bundle documentation \\
+% \end{tabular}
+% \end{quote}
+%
+% \StopEventually{}
+% \iffalse
+% \clearpage
+% \tableofcontents
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \DoNotIndex{\\,\_,\ ,\@@par}
+% \DoNotIndex{\@bsphack}
+% \DoNotIndex{\@car,\@cdr,\@classoptionslist,\@cons,\@currext,\@currname}
+% \DoNotIndex{\@ehc,\@ehd,\@empty,\@esphack,\@expandtwoargs}
+% \DoNotIndex{\@for,\@firstofone,\@firstoftwo}
+% \DoNotIndex{\@gobble,\@gobblefour,\@gobbletwo,\@hangfrom}
+% \DoNotIndex{\if@minipage\@ifnextchar,\@ifpackagelater,\@ifpackageloaded}
+% \DoNotIndex{\@ifstar,\@ifundefined,\@latex@error,\@minipagefalse,\@minipagetrue}
+% \DoNotIndex{\@namedef,\@nameuse}
+% \DoNotIndex{\@onlypreamble,\@parboxrestore,\@plus,\@ptionlist}
+% \DoNotIndex{\@removeelement,\@restorepar,\@secondoftwo,\@setminipage,\@setpar}
+% \DoNotIndex{\@tempa,\@tempboxa,\@tempdima,\@tempdimb,\@tempdimc,\@tempb,\@tempc}
+% \DoNotIndex{\@testopt}
+% \DoNotIndex{\@undefined,\@unprocessedoptions,\@unusedoptionlist}
+% \DoNotIndex{\p@,\z@}
+% \DoNotIndex{\active,\addtocounter,\addtolength,\advance,\aftergroup}
+% \DoNotIndex{\baselineskip,\begin,\begingroup,\bfseries,\box}
+% \DoNotIndex{\catcode,\centering,\changes,\csname,\def,\divide,\do,\downarrow}
+% \DoNotIndex{\edef,\else,\empty,\end,\endcsname,\endgraf,\endgroup,\expandafter}
+% \DoNotIndex{\fi,\footnotesize,\global}
+% \DoNotIndex{\hangindent,\hbox,\hfil,\hsize,\hskip,\hspace,\hss}
+% \DoNotIndex{\ifcase,\ifdim,\ifnum,\ifodd,\ifvoid,\ifvmode}
+% \DoNotIndex{\ifx,\ignorespaces,\itshape}
+% \DoNotIndex{\Large,\large,\leavevmode,\leftmargini,\leftskip,\let,\linewidth}
+% \DoNotIndex{\llap,\long,\m@ne,\margin,\mdseries,\message}
+% \DoNotIndex{\newcommand,\newdimen,\newlength,\newline,\newif,\newsavebox}
+% \DoNotIndex{\next,\nobreak,\nobreakspace,\noexpand,\noindent,\numberline}
+% \DoNotIndex{\normalcolor,\normalfont,\normalsize,\or,\par,\parbox,\parfillskip}
+% \DoNotIndex{\parindent,\parskip,\prevdepth,\protect,\protected@edef,\protected@write}
+% \DoNotIndex{\providecommand,\quad}
+% \DoNotIndex{\raggedleft,\raggedright,\relax,\renewcommand,\RequirePackage}
+% \DoNotIndex{\rightskip,\rmfamily}
+% \DoNotIndex{\sbox,\scriptsize,\scshape,\setbox,\setlength,\sffamily,\slshape}
+% \DoNotIndex{\small,\string,\space,\strut}
+% \DoNotIndex{\textheight,\the,\toks@,\typeout,\ttfamily}
+% \DoNotIndex{\unvbox,\uparrow,\upshape,\usebox,\usepackage}
+% \DoNotIndex{\value,\vbox,\vsize,\vskip,\wd,\width,\z@skip}
+% \DoNotIndex{\AtBeginDocument,\AtEndOfPackage,\CurrentOption,\DeclareOption}
+% \DoNotIndex{\ExecuteOptions,\GenericWarning,\IfFileExists,\InputIfFileExists}
+% \DoNotIndex{\NeedsTeXFormat,\MessageBreak}
+% \DoNotIndex{\PackageError,\PackageInfo,\PackageWarning,\PackageWarningNoLine}
+% \DoNotIndex{\PassOptionsToPackage,\ProcessOptions,\ProvidesPackage}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \setlength{\parskip}{0pt plus 1pt}
+% \newcommand*\Note[2][Note]{\par{\small\emph{#1:} #2}\par}
+%
+% \changes{v1.5}{2013/01/06}{\class{elsarticle} class support added}
+% \changes{v2.0}{2020/07/27}{\class{elsarticle} class support adapted to \package{caption3}~\version{2.0}}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \section{Identification}
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-elsarticle.sto}[2020/08/22 v2.0 Adaption of the caption package to the elsarticle document class (AR)]
+% \end{macrocode}
+%
+% \section{Fonts}
+%
+% The `default' caption size is |\footnotesize|.
+% \begin{macrocode}
+\SetCaptionDefault{font}{footnotesize}
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+% \Finale
+%
+\endinput
+
diff --git a/Master/texmf-dist/source/latex/caption/caption-eng.tex b/Master/texmf-dist/source/latex/caption/caption-eng.tex
index ef9fd389231..21a61546bef 100644
--- a/Master/texmf-dist/source/latex/caption/caption-eng.tex
+++ b/Master/texmf-dist/source/latex/caption/caption-eng.tex
@@ -1,7 +1,7 @@
%
% This is file `caption-eng.tex'.
%
-% Copyright (C) 1994-2012 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
+% Copyright (C) 1994-2020 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
%
% --------------------------------------------------------------------------
%
@@ -17,14 +17,21 @@
%
% This Current Maintainer of this work is Axel Sommerfeldt.
%
-% This work consists of the files caption.ins, caption.dtx, caption2.dtx,
-% caption3.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx, and newfloat.dtx,
-% the derived files caption.sty, caption2.sty, caption3.sty,
-% bicaption.sty, ltcaption.sty, subcaption.sty, and newfloat.sty,
-% and the user manuals caption-deu.tex, caption-eng.tex, and caption-rus.tex.
+% This work consists of the files
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
+% the derived files
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
+% and the user manuals
+% caption-deu.tex, caption-eng.tex, caption-rus.tex.
%
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesFile{caption-eng.tex}[2011/11/02 v3.2 The caption package]
+\ProvidesFile{caption-eng.tex}[2020/09/21 v3.5 The caption package]
\hbadness=9999 \newcount\hbadness \hfuzz=20pt % Make TeX shut up.
%\errorcontextlines=3
@@ -108,7 +115,7 @@
\newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
\newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
-\newcommand*\version[2][]{$v#2$}
+\newcommand*\version[2][]{v$#2$}
\newcommand*\x{\discretionary{}{}{}}
\newenvironment{Annotation}%
@@ -187,9 +194,11 @@
\GetFileInfo{caption-eng.tex}
\let\docdate\filedate
+\let\docversion\fileversion
\GetFileInfo{caption.sty}
-\title{Customizing captions of floating environments}
+\title{Customizing captions of floating environments\texorpdfstring{%
+ \thanks{This package has version number \docversion.}}{}}
\author{Axel Sommerfeldt\\
\url{https://gitlab.com/axelsommerfeldt/caption}}
\date{\docdate}
@@ -206,7 +215,7 @@ many other packages.
commands for customizing captions.
If these possibilities are sufficient for you, there is usually no need for
you to use the \package{caption} package at all.
-And if you are just interested in using the command \cs{captionof}, loading of
+And if you are only interested in using the command \cs{captionof}, loading of
the very small \package{capt-of} package is usually sufficient.
\end{abstract}
@@ -218,6 +227,41 @@ the very small \package{capt-of} package is usually sufficient.
% --------------------------------------------------------------------------- %
+\section*{State of this document}
+
+This documentation is outdated.
+
+It documents the options and commands available in version \version{3.1} of the
+\package{caption} package, but many things added later on is missing here. Why?
+\begin{itemize}
+\item
+ I wasn't happy with the structure of the documentation, so I decided to write a new one.
+ So why updating the abandoned documentation?
+ (Unfortunately I never found the time to actually write the new one.)
+\item
+ Since my spare time was extremly limited since version \version{3.1} I didn't
+ wanted to hold improvements and enhancements back for months because of missing
+ documentation.
+\item
+ Since I used to fix bugs in the most recent development version only,
+ I didn't wanted to hold bugfixes back for months because of missing
+ documentation of features.
+ (But since 2015 bugs will usually get fixed for the latest release version as well,
+ and released to CTAN as bug-fixed version afterwards.)
+\end{itemize}
+
+What now?
+\begin{itemize}
+\item
+ I will update this documentation in the next weeks, finally bringing it up-to-date.
+\item
+ Until the revised documentation is ready the most recent version could be found at
+ \url{https://gitlab.com/axelsommerfeldt/caption/-/blob/master/doc/caption-eng.pdf}
+ since I will not upload every improvement of the documentation to CTAN immediately.
+\end{itemize}
+
+% --------------------------------------------------------------------------- %
+
\section*{Introduction}
Within the standard \LaTeX\ document classes captions haven't received the
@@ -403,10 +447,14 @@ you specify how the caption label will be typeset.
There are five standard caption label formats:
\begin{Options}{\OptionLabel}
- \item[default]
+ \item[original]
The caption label will be typeset as specified by the document class,
usually this means the name and the number (like \texttt{simple}).
- (This is the default behaviour.)
+
+ Until \version{3.4} of \thispackage\ this label format was called `default'.
+ Since \version{3.5} it is called `original' and usually is the default label
+ format, so |label|\-|format=|\-|default| will still select this label format,
+ unless the default was changed by either a document class or babel language package.
\item[empty]
The caption label will be empty.
@@ -613,18 +661,18 @@ You can choose one of the following:
Three examples:
\begin{Example}
\begin{quote}
- |format=plain,justification=centerlast|
+ |format=hang,justification=raggedright|
\end{quote}
\captionsetup{skip=0pt}
- \example{format=plain,justification=centerlast}{\exampletext}
+ \example{format=hang,justification=raggedright}{\exampletext}
\end{Example}
\begin{Example}
\begin{quote}
- |format=hang,justification=raggedright|
+ |format=hang,justification=centerlast|
\end{quote}
\captionsetup{skip=0pt}
- \example{format=hang,justification=raggedright}{\exampletext}
+ \example{format=hang,justification=centerlast}{\exampletext}
\end{Example}
\begin{Example}
@@ -761,10 +809,10 @@ Three examples:
\begin{Example}
\begin{quote}
- |labelfont=bf,textfont=it|
+ |labelfont=sc,textfont=it|
\end{quote}
\captionsetup{skip=0pt}
- \example{labelfont=bf,textfont=it}{\exampletext}
+ \example{labelfont=sc,textfont=it}{\exampletext}
\end{Example}
\begin{Example}
@@ -2157,7 +2205,7 @@ This will be achieved by a combination of
% --------------------------------------------------------------------------- %
\clearpage
-\section{Document classes \& Babel support}
+\section{Supported document classes}
\label{classes}
%\NEWdescription{v3.1}
@@ -2369,51 +2417,31 @@ the caption text font with |\caption|\-|body|\-|font|.
Both is still supported unless you use one of the two options
|label|\-|font=| or |text|\-|font=| offered by \thispackage.
-\subsection{frenchb babel option}
-\label{frenchb}
+% --------------------------------------------------------------------------- %
+
+\clearpage
+\section{Supported babel package options}
+\label{babel}
+
+\NEWfeature{v3.5}
+Since version \version{3.5} of the \package{caption} package the support
+is independent on the load order of \package{caption} and \package{babel}.
+
+\subsection{french babel option}
+\label{french}
-If you use the \package{frenchb} option of the \package{babel} package
+If you use the \package{french} option of the \package{babel} package
with one of the three standard \LaTeX{} classes (or a one derived from them)
the default |label|\-|sep=| will be set to |\Caption|\-|Sep|\-|a|\-|ra|\-|tor|
-(offered by \package{frenchb}), overriding the default value set by the
+(offered by \package{french}), overriding the default value set by the
document class.
So redefining |\Caption|\-|Sep|\-|a|\-|ra|\-|tor| will still work, unless you
don't select a different |label|\-|sep=| than the default one.
-\INFO*
-Please load \thispackage\ \emph{after} the \package{babel} package.
-
-\subsection{frenchle and frenchpro packages}
-\label{frenchpro}
-
-If you use the \package{frenchle} or \package{frenchpro} package,
-the default |label|\-|sep=| will be set to |\caption|\-|sep|\-|a|\-|ra|\-|tor|
-(offered by \package{frenchle/pro}) plus \cs{space}, overriding the default
-value set by the document class.
-So redefining |\caption|\-|sep|\-|a|\-|ra|\-|tor| will still work, unless you
-don't select a different |label|\-|sep=| than the default one.
-
-Furthermore the default |text|\-|font=| will be set to |text|\-|font=|\x|it|,
-since this emulates the default setting of |\caption|\-|font| defined by the
-\package{frenchle} or \package{frenchpro} package.
-%If you redefine |\captionfont| after loading the \package{frenchle} or
-%\package{frenchpro} package, this redefinition gets lost.
-Please note that the command |\caption|\-|font| is used by the
-\package{caption} package internally for a different purpose,
-so you should not change it (anymore).
-
-The command |\un|\-|numbered|\-|captions|\marg{figure \emph{or} table} will
-still work, but only unless you don't select a different |label|\-|format=|
-than the default one.
-
-\INFO*
-Please load \thispackage\ \emph{after} the \package{frenchle}
-or \package{frenchpro} package.
-
% --------------------------------------------------------------------------- %
\clearpage
-\section{Package support}
+\section{Supported packages}
\label{packages}
\label{compatibility}
@@ -2680,6 +2708,35 @@ These options will be executed additionally to the regular ones for
|figure| or |table|.
\pagebreak[3]
+\subsection{frenchle and frenchpro packages}
+\label{frenchpro}
+
+If you use the \package{frenchle} or \package{frenchpro} package,
+the default |label|\-|sep=| will be set to |\caption|\-|sep|\-|a|\-|ra|\-|tor|
+(offered by \package{frenchle/pro}) plus \cs{space}, overriding the default
+value set by the document class.
+So redefining |\caption|\-|sep|\-|a|\-|ra|\-|tor| will still work, unless you
+don't select a different |label|\-|sep=| than the default one.
+
+Furthermore the default |text|\-|font=| will be set to |text|\-|font=|\x|it|,
+since this emulates the default setting of |\caption|\-|font| defined by the
+\package{frenchle} or \package{frenchpro} package.
+%If you redefine |\captionfont| after loading the \package{frenchle} or
+%\package{frenchpro} package, this redefinition gets lost.
+Please note that the command |\caption|\-|font| is used by the
+\package{caption} package internally for a different purpose,
+so you should not change it (anymore).
+
+The command |\un|\-|numbered|\-|captions|\marg{figure \emph{or} table} will
+still work, but only unless you don't select a different |label|\-|format=|
+than the default one.
+
+\NEWfeature{v3.5}
+Since version \version{3.5} of the \package{caption} package the support
+is independent on the load order of \package{caption} and \package{frenchle}
+resp~.\package{frenchpro}.
+
+\pagebreak[3]
\subsection{hyperref}
\label{hyperref}
\packagedescription{%
@@ -3811,7 +3868,7 @@ While all the previous versions were designed for usage with the standard
the current version $3.1$ released in 2007 also supports the \AmS,
\KOMAScript, \NTG, and \SmF\ document classes, and the \class{beamer} class
as well.
-Furthermore it was adapted to the \package{frenchb} Babel option,
+Furthermore it was adapted to the \package{french} Babel option,
the \package{frenchle} \& \package{frenchpro} packages,
and the \package{floatflt}, \package{fltpage}, \package{picinpar},
\package{picins}, \package{setspace}, \package{threeparttable},
@@ -4072,6 +4129,174 @@ to the \package{subfig} package instead and do not load \thispackage\ anymore.
% --------------------------------------------------------------------------- %
\clearpage
+\section{Commands for document class authors}
+
+A document class could simply load the \package{caption} package instead
+of defining an own variant of |\@make|\-|caption|. However if the author decides
+not to do this -- for whatever reason -- there is a second option:
+
+\NEWfeature{v3.5}
+If a document class defines |\caption@document|\-|class|, an adaption to the
+\package{caption} package will be loaded as |caption-|\meta{documentclass}|.sto|
+if the \package{caption} kernel is loaded.
+The goal of this adaption file is changing the default settings of the
+\package{caption} package so simply loading it (without any package options)
+will not make any harm to the look at feel of the captions.
+This gives end-users the opportunity to fine-tune certain aspects of the
+appearance of captions by adding package options, without unwanted
+side-effects on other aspects of the appearance.
+
+In both cases the command |\Set|\-|Caption|\-|Default|
+could be used to adapt the \package{caption} package default values:
+
+\DescribeMacro{\SetCaptionDefault}
+The command
+\begin{quote}
+ |\SetCaptionDefault*|\marg{option}\marg{default value}
+\end{quote}
+changes the default value for the option \meta{option}, for example:
+\begin{quote}
+ |\SetCaptionDefault{format}{hang}|\\
+ |\SetCaptionDefault{justification}{raggedright}|\\
+ |\DeclareCaptionLabelSeparator{silly}{ +++ }|\\
+ |\SetCaptionDefault{labelseparator}{silly}|
+\end{quote}
+This command is available for the options
+ |box|,
+ |font|,
+ |format|,
+ |justification|,
+ |label|\-|font|,
+ |label|\-|format|,
+ |label|\-|separator|,
+ |list|\-|format|,
+ |margin|,
+ |parbox|,
+ |position|,
+ |single|\-|line|\-|check|,
+ |text|\-|font|,
+ |text|\-|format|, and
+ |width|.
+
+The starred variant only makes a difference when setting the default length
+of either |margin| or |width|, in this case it will use |\def| internally
+instead of |\edef| to store the value so the actual margin will be calculated
+when used (and not when set).
+
+\DescribeMacro{\SetCaptionFallback}
+The command
+\begin{quote}
+ |\SetCaptionFallback|\marg{option}\marg{fallback value}
+\end{quote}
+changes the fallback value for the option \meta{option}, for example:
+\begin{quote}
+ |\SetCaptionFallback{labelformat}{simple}|
+\end{quote}
+Currently only the pre-defined label format `original' uses a fallback
+value when |\fnum@|\meta{environment} is not defined for the current (floating)
+environment.
+
+\DescribeMacro{\AtCaptionPackage}
+The adaption file will be loaded when the \package{caption} kernel |caption3.sty|
+will be loaded so the given adaptions will be done for the \package{floatrow}
+and \package{subfig} packages even if the \package{caption} package isn't loaded.
+
+But some adaptions have to be done for the \package{caption} package,
+and for this reason the hook
+\begin{quote}|\AtCaptionPackage|\marg{code}\end{quote}
+is offered to authors of adaption files.
+The \meta{code} inside the hook will be executed right before the given package
+options will be evaluated.
+
+For example the adaption file for the \KOMAScript\ document classes
+uses |\At|\-|Begin|\-|Caption| to re-define the \package{caption} package
+options |figure|\-|position| and |table|\-|position| to issue a warning
+that using these options have little effect here.
+
+\DescribeMacro{\AfterCaptionPackage}
+The additional hook
+\begin{quote}|\AfterCaptionPackage|\marg{code}\end{quote}
+is offered to authors of adaption files as well.
+The \meta{code} inside the hook will be executed at the very end of the
+\package{caption} package.
+
+% --------------------------------------------------------------------------- %
+
+\clearpage
+\section{Commands for babel language package authors}
+
+\NEWfeature{v3.5}
+\DescribeMacro{\caption@switchdefault}
+If the \package{caption3} kernel package is loaded, the command
+\begin{quote}|\caption@switchdefault|\marg{option}\marg{code with \#1}\marg{new value}\end{quote}
+is available which saves the old default value of the given option using
+\meta{code} and sets the new default value afterwards.
+
+\DescribeMacro{\caption@restoredefault}
+The command
+\begin{quote}|\caption@restoredefault|\marg{option}\marg{old value}\end{quote}
+restores the old default value which was stored in \meta{old value} before.
+
+Example:
+\begin{quote}
+ |\DeclareCaptionLabelSeparator{french}{|\ldots|}|\\
+ |\addto\extrasfrench{%|\\
+ | \caption@switchdefault{labelseparator}{\babel@save #1}{french}}|\\
+ |% Note: \caption@restoredefault isn't needed here|
+\end{quote}
+
+Another example:
+\begin{quote}
+ |\caption@switchdefault{font}{\let\original@captionfont#1}{it}%|\\
+ \ldots\\
+ |\caption@restoredefault{font}{\original@captionfont}%|\\
+\end{quote}
+
+Since boths commands are defined with |\def| inside the \package{caption3}
+kernel, they could be pre-defined with
+\begin{quote}
+ |\providecommand\caption@switchdefault[3]{}|\\
+ |\providecommand\caption@restoredefault[2]{}|
+\end{quote}
+inside the babel language package so their existence doesn't need to be tested
+prior use.
+
+Additionally babel language packages should not re-define |\@make|\-|caption|
+if the \package{caption} package is loaded, i.e.~if |\caption@makecaption| is
+defined. (Unfortunately one cannot use the \LaTeX{} kernel command
+|\@if|\-|package|\-|loaded{caption}| here since it's only available in the
+document preamble.)
+
+Please note that code like
+\begin{quote}
+ |\addto\extraswhatever{%|\\
+ | \@ifundefined{caption@makecaption}{%|\\
+ | \babel@save\@makecaption|\\
+ | \let\@makecaption\my@makecaption|\\
+ | }{%|\\
+ | \caption@switchdefault{|\ldots|}{\babel@save #1}{|\ldots|}%|\\
+ | }}|
+\end{quote}
+would be wrong since it mixes up the presence of the \package{caption3} kernel
+and the \package{caption} package.
+If the \package{caption3} kernel is loaded this does not mean that the
+\package{caption} package is loaded, too, and the latter one re-defines
+|\caption|, |\@caption|, and |\@make|\-|caption| while the \package{caption3}
+kernel does not re-define any of them, instead it only provides (default) values
+for the \package{caption}, \package{floatrow}, and \package{subfig} package.
+
+Currently there is build-in support for the following babel language options:
+|arabic|, |farsi|, |french|, |hungarian|, |latvian|, and |magyar|.
+This support could be deactivated by defining
+\begin{quote}
+ |\def\caption@ifbabel@|\meta{package}|{false}|
+\end{quote}
+where \meta{package} is either |arabi|, |french|, |frenchle|, |hungarian|,
+or |latvian|.
+
+% --------------------------------------------------------------------------- %
+
+\clearpage
\begin{thebibliography}{99}
\bibitem{TLC2}
@@ -4230,3 +4455,4 @@ to the \package{subfig} package instead and do not load \thispackage\ anymore.
% --------------------------------------------------------------------------- %
\end{document}
+
diff --git a/Master/texmf-dist/source/latex/caption/caption-koma.dtx b/Master/texmf-dist/source/latex/caption/caption-koma.dtx
new file mode 100644
index 00000000000..380a054df98
--- /dev/null
+++ b/Master/texmf-dist/source/latex/caption/caption-koma.dtx
@@ -0,0 +1,519 @@
+% \iffalse meta-comment
+%
+% This is file `caption-koma.dtx'.
+%
+% Copyright (C) 2004-2020 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
+%
+% --------------------------------------------------------------------------
+%
+% 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
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Axel Sommerfeldt.
+%
+% This work consists of the files
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
+% the derived files
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
+% and the user manuals
+% caption-deu.tex, caption-eng.tex, caption-rus.tex.
+%
+% \fi
+% \CheckSum{273}
+%
+% \iffalse
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-koma.drv}[2018/05/24 v2.0 Implementation of the caption-koma package]
+\hbadness=9999 \newcount\hbadness \hfuzz=100pt % Make TeX shut up.
+%\errorcontextlines=3
+%
+\documentclass{ltxdoc}
+\setlength\parindent{0pt}
+\setlength\parskip{\smallskipamount}
+%
+\makeatletter % make room for subsections like 2.16.14 in the TOC
+%\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}}
+\renewcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.7em}}
+\makeatother
+%
+\usepackage{ifpdf}
+\ifpdf
+ \usepackage{mathptmx,courier}
+ \usepackage[scaled=0.90]{helvet}
+ \addtolength\marginparwidth{15pt}
+\fi
+%
+\usepackage{hypdoc}
+\ifpdf\usepackage{hypdestopt}\fi
+\hypersetup{pdfkeywords={LaTeX, package, caption},pdfstartpage={},pdfstartview={}}
+%
+\DeclareRobustCommand*\KOMAScript{\texorpdfstring
+ {\textsf{K\kern.05em O\kern.05em M\kern.05em A\kern.1em-\kern.1em Script}}%
+ {KOMA-Script}}
+%
+\begin{document}
+ \DocInput{caption-koma.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \newcommand*\purerm[1]{\texorpdfstring{{\upshape\mdseries\rmfamily #1}}{#1}}
+% \newcommand*\puresf[1]{\texorpdfstring{{\upshape\mdseries\sffamily #1}}{#1}}
+% \newcommand*\purett[1]{\texorpdfstring{{\upshape\mdseries\ttfamily #1}}{#1}}
+% \let\class\puresf \let\package\puresf
+% \let\env\purett \let\opt\purett
+%
+% \newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
+% \newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
+% \newcommand*\version[2][]{v$#2$}
+%
+% \GetFileInfo{caption-koma.drv}
+% \let\docdate\filedate
+% \let\docversion\fileversion
+% \GetFileInfo{caption-koma.sto}
+%
+% \title{\texorpdfstring
+% {The adaption of the \package{caption} package to the \KOMAScript\ document classes\thanks{%^^A
+% This adaption has version number \docversion.}}%^^A
+% {The adaption of the caption package to the KOMA-Script document classes}}
+% \author{Axel Sommerfeldt\\
+% \url{https://gitlab.com/axelsommerfeldt/caption}}
+% \date{\docdate}
+% \maketitle
+%
+% \begin{abstract}
+% This package adapts the \package{caption} package to the \KOMAScript\ document classes.
+% \end{abstract}
+%
+% \section*{User manual}
+%
+% This document is describing the code implementation only.
+% The user documentation can be found in
+% \nopagebreak\begin{quote}
+% \begin{tabular}{ll}
+% \href{http://mirror.ctan.org/macros/latex/contrib/caption/caption-eng.pdf}%
+% {\texttt{caption-eng.pdf}} & The caption package bundle documentation \\
+% \end{tabular}
+% \end{quote}
+%
+% \StopEventually{}
+% \iffalse
+% \clearpage
+% \tableofcontents
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \DoNotIndex{\\,\_,\ ,\@@par}
+% \DoNotIndex{\@bsphack}
+% \DoNotIndex{\@car,\@cdr,\@classoptionslist,\@cons,\@currext,\@currname}
+% \DoNotIndex{\@ehc,\@ehd,\@empty,\@esphack,\@expandtwoargs}
+% \DoNotIndex{\@for,\@firstofone,\@firstoftwo}
+% \DoNotIndex{\@gobble,\@gobblefour,\@gobbletwo,\@hangfrom}
+% \DoNotIndex{\if@minipage\@ifnextchar,\@ifpackagelater,\@ifpackageloaded}
+% \DoNotIndex{\@ifstar,\@ifundefined,\@latex@error,\@minipagefalse,\@minipagetrue}
+% \DoNotIndex{\@namedef,\@nameuse}
+% \DoNotIndex{\@onlypreamble,\@parboxrestore,\@plus,\@ptionlist}
+% \DoNotIndex{\@removeelement,\@restorepar,\@secondoftwo,\@setminipage,\@setpar}
+% \DoNotIndex{\@tempa,\@tempboxa,\@tempdima,\@tempdimb,\@tempdimc,\@tempb,\@tempc}
+% \DoNotIndex{\@testopt}
+% \DoNotIndex{\@undefined,\@unprocessedoptions,\@unusedoptionlist}
+% \DoNotIndex{\p@,\z@}
+% \DoNotIndex{\active,\addtocounter,\addtolength,\advance,\aftergroup}
+% \DoNotIndex{\baselineskip,\begin,\begingroup,\bfseries,\box}
+% \DoNotIndex{\catcode,\centering,\changes,\csname,\def,\divide,\do,\downarrow}
+% \DoNotIndex{\edef,\else,\empty,\end,\endcsname,\endgraf,\endgroup,\expandafter}
+% \DoNotIndex{\fi,\footnotesize,\global}
+% \DoNotIndex{\hangindent,\hbox,\hfil,\hsize,\hskip,\hspace,\hss}
+% \DoNotIndex{\ifcase,\ifdim,\ifnum,\ifodd,\ifvoid,\ifvmode}
+% \DoNotIndex{\ifx,\ignorespaces,\itshape}
+% \DoNotIndex{\Large,\large,\leavevmode,\leftmargini,\leftskip,\let,\linewidth}
+% \DoNotIndex{\llap,\long,\m@ne,\margin,\mdseries,\message}
+% \DoNotIndex{\newcommand,\newdimen,\newlength,\newline,\newif,\newsavebox}
+% \DoNotIndex{\next,\nobreak,\nobreakspace,\noexpand,\noindent,\numberline}
+% \DoNotIndex{\normalcolor,\normalfont,\normalsize,\or,\par,\parbox,\parfillskip}
+% \DoNotIndex{\parindent,\parskip,\prevdepth,\protect,\protected@edef,\protected@write}
+% \DoNotIndex{\providecommand,\quad}
+% \DoNotIndex{\raggedleft,\raggedright,\relax,\renewcommand,\RequirePackage}
+% \DoNotIndex{\rightskip,\rmfamily}
+% \DoNotIndex{\sbox,\scriptsize,\scshape,\setbox,\setlength,\sffamily,\slshape}
+% \DoNotIndex{\small,\string,\space,\strut}
+% \DoNotIndex{\textheight,\the,\toks@,\typeout,\ttfamily}
+% \DoNotIndex{\unvbox,\uparrow,\upshape,\usebox,\usepackage}
+% \DoNotIndex{\value,\vbox,\vsize,\vskip,\wd,\width,\z@skip}
+% \DoNotIndex{\AtBeginDocument,\AtEndOfPackage,\CurrentOption,\DeclareOption}
+% \DoNotIndex{\ExecuteOptions,\GenericWarning,\IfFileExists,\InputIfFileExists}
+% \DoNotIndex{\NeedsTeXFormat,\MessageBreak}
+% \DoNotIndex{\PackageError,\PackageInfo,\PackageWarning,\PackageWarningNoLine}
+% \DoNotIndex{\PassOptionsToPackage,\ProcessOptions,\ProvidesPackage}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \setlength{\parskip}{0pt plus 1pt}
+% \newcommand*\Note[2][Note]{\par{\small\emph{#1:} #2}\par}
+%
+% \changes{v1.0a}{2004/01/18}{Minimum adaptation to \KOMAScript\ added}
+% \changes{v1.0h}{2005/08/22}{\KOMAScript\ compatibility options added}
+% \changes{v1.0i}{2005/11/17}{\KOMAScript\ compatibility commands added}
+% \changes{v1.0l}{2007/02/18}{\KOMAScript\ compatibility revised}
+% \changes{v1.1}{2007/03/17}{\KOMAScript\ compatibility options removed}
+% \changes{v1.1}{2007/03/31}{\KOMAScript\ classes support added}
+% \changes{v1.1}{2007/04/05}{\KOMAScript\ compatibility revised \& enhanced}
+% \changes{v2.0}{2020/07/27}{\KOMAScript\ class support adapted to \package{caption3}~\version{2.0}}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \section{Identification}
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-koma.sto}[2020/09/21 v2.0b Adaption of the caption package to the KOMA-Script document classes (AR)]
+% \end{macrocode}
+%
+% \section{Margin resp. width}
+%
+% \begin{macro}{\setcapwidth}
+% \changes{v1.9}{2018/12/26}{Bugfix: Missing curly braces added}
+% Patch |\setcapwidth| so it will set the \package{caption3} width setting, too.
+% \begin{macrocode}
+\expandafter\let\expandafter\caption@koma@setcapwidth
+ \csname\string\setcapwidth\endcsname
+\@namedef{\string\setcapwidth}[#1]#2{%
+ \caption@koma@setcapwidth[{#1}]{#2}%
+ \caption@setcapwidth@opt{#1}%
+ \caption@setcapwidth}
+% \end{macrocode}
+% The optional argument of \cs{setcapwidth} if not supported (yet),
+% so we issue a warning if used.
+% (Since this does not seem to have an negative effect when used
+% by the \texttt{captionbeside} environment, we suppress the warning here.)
+% \begin{macrocode}
+\newcommand*\caption@setcapwidth@opt[1]{}
+\AtCaptionPackage{\renewcommand*\caption@setcapwidth@opt[1]{%
+ \ifx\\#1\\\else
+ \caption@ifdefined\cap@margin{%
+ \def\@tempa{captionbeside}%
+ \ifx\@tempa\@currenvir\else\caption@Warning{%
+ Ignoring optional argument [#1] of \string\setcapwidth\MessageBreak}%
+ \fi}{}%
+ \fi}}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@setcapwidth{%
+ \captionsetup{width=\cap@width}}
+% \end{macrocode}
+% \begin{macrocode}
+\def\caption@tempa{\hsize}%
+\ifx\caption@tempa\cap@width \else
+ \caption@setcapwidth
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \emph{TODO:} |\setcapdynwidth|
+%
+% \begin{macro}{\setcapmargin}
+% Patch |\setcapmargin| so it will set the \package{caption3} margin setting, too.
+% \begin{macrocode}
+\expandafter\let\expandafter\caption@koma@setcapmargin
+ \csname\string\@setcapmargin\endcsname
+\@namedef{\string\@setcapmargin}[#1]#2{%
+ \caption@koma@setcapmargin[{#1}]{#2}%
+ \caption@setcapmargin}
+% \end{macrocode}
+% \begin{macrocode}
+\expandafter\let\expandafter\caption@koma@@setcapmargin
+ \csname\string\@@setcapmargin\endcsname
+\@namedef{\string\@@setcapmargin}[#1]#2{%
+ \caption@koma@@setcapmargin[{#1}]{#2}%
+ \caption@setcapmargin}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@setcapmargin{%
+ \begingroup
+ \let\onelinecaptionsfalse\relax
+ \def\@twoside{0}%
+ \def\if@twoside{\def\@twoside{1}\iffalse}%
+ \cap@margin
+ \def\@tempa{\endgroup}%
+ \ifx\cap@left\hfill\else\ifx\cap@right\hfill\else
+ \def\hspace##1##{\@firstofone}%
+ \edef\@tempa{\endgroup
+ \noexpand\captionsetup{%
+ twoside=\@twoside,slc=0,%
+ margin={\cap@left,\cap@right}}}%
+ \fi\fi
+ \@tempa}
+% \end{macrocode}
+% \begin{macrocode}
+\ifx\cap@margin\relax \else
+ \caption@setcapmargin
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Indentions}
+%
+% \begin{macro}{\setcapindent}
+% Patch |\setcapindent| so it will set the \package{caption3} indention setting, too.
+% \begin{macrocode}
+\let\caption@koma@setcapindent\@setcapindent
+\renewcommand*\@setcapindent[1]{%
+ \caption@koma@setcapindent{#1}%
+ \caption@setcapindent}
+% \end{macrocode}
+% \begin{macrocode}
+\let\caption@koma@@setcapindent\@@setcapindent
+\renewcommand*\@@setcapindent[1]{%
+ \caption@koma@@setcapindent{#1}%
+ \caption@setcapindent}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@setcapindent{%
+ \captionsetup{indent=\ifdim\cap@indent<\z@\z@\else\cap@indent\fi}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\caption@ifdefined\cap@indent{\caption@setcapindent}{}
+% \end{macrocode}
+%
+% \changes{v1.0f}{2005/08/22}{Increased compatibility to KOMA-Script: A special version of options `parindent' and `parskip' added}
+% \changes{v1.0g}{2006/01/03}{Bugfix 06-01-03: KOMA-Script variants of `parskip' and `parindent' options revised and moved into caption kernel}
+% \changes{v1.0h}{2006/02/23}{KOMA-Script variants of `parskip' and `parindent' are obsolete now, removed}
+% \changes{v1.0m}{2007/03/30}{KOMA-Script variants of `parskip' and `parindent' re-added, since they still collide with the current version of the subfig package (Sigh!)}
+%
+% There is an option clash between the \KOMAScript\ document classes
+% and the \package{caption} kernel, both define the options |parindent| and
+% |parskip| but with different meaning.
+% Furthermore the ones defined by the \package{caption} kernel take a
+% value as parameter but the \KOMAScript\ ones do not.
+%
+% So we need special versions of the options |parindent| and |parskip| here
+% which determine if a value is given (and therefore should be treated as
+% our option) or not (and therefore should be ignored by us).\footnote{%^^A
+% This problem was completely solved due a change of \cs{caption@ProcessOptions}
+% in \package{caption3}~\version{1.0h}, but we still need this workaround since
+% these options would otherwise still collide with the current version $1.3$
+% of the \package{subfig} package (Sigh!)}
+%
+% \begin{macrocode}
+\let\caption@koma@parindent\KV@caption@parindent
+\DeclareCaptionOption{parindent}[]{%
+ \ifx,#1,%
+ \caption@Debug{Option `parindent' ignored}%
+ \else
+ \caption@koma@parindent{#1}%
+ \fi}%
+% \end{macrocode}
+% \begin{macrocode}
+\let\caption@koma@parskip\KV@caption@parskip
+\DeclareCaptionOption{parskip}[]{%
+ \ifx,#1,%
+ \caption@Debug{Option `parskip' ignored}%
+ \else
+ \caption@koma@parskip{#1}%
+ \fi}%
+% \end{macrocode}
+%
+% \section{Single-line-check}
+%
+% \begin{macro}{\ifonelinecaptions}
+% \changes{v1.1g}{2008/03/01}{\cs{def} changed to \cs{g@addto@macro}}
+% Patch |\onelinecaptionstrue| and |onelinecaptionsfalse| so they will set the corresponding \package{caption3} setting, too.
+% \begin{macrocode}
+\g@addto@macro\onelinecaptionstrue{\caption@setsinglelinecheck{true}}%
+\g@addto@macro\onelinecaptionsfalse{\caption@setsinglelinecheck{false}}%
+% \end{macrocode}
+% \begin{macrocode}
+\ifonelinecaptions
+ \onelinecaptionstrue
+\else
+ \onelinecaptionsfalse
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Format}
+%
+% The `default' caption format was taken from \KOMAScript\ \cs{@makecaption} and adapted.
+% \begin{macrocode}
+\DeclareCaptionFormat{default}[#1#2#3\par]{%
+ \ifdofullc@p
+ \caption@useformat{hang}{#1}{#2}{#3}%
+ \else
+ #1#2%
+ \ifdim\cap@indent<\z@
+ \par
+ \noindent\hspace*{-\cap@indent}%
+ \else\if@capbreak
+ \par
+ \fi\fi
+ #3\par
+ \fi}
+%
+% \section{Label format}
+%
+% The `fallback' caption label format maps to `autodot'.
+% \begin{macrocode}
+\SetCaptionFallback{labelformat}{autodot}
+% \end{macrocode}
+%
+% \section{Label separator}
+%
+% The `default' caption label separator maps to \cs{captionformat}.
+% \begin{macrocode}
+\DeclareCaptionLabelSeparator{default}{\captionformat}
+% \end{macrocode}
+%
+% \section{Fonts}
+%
+% The `default' fonts map to \cs{scr@fnt@caption} resp. \cs{scr@fnt@captonlabel}.
+% \begin{macrocode}
+\DeclareCaptionFont{scr@font}{\scr@fnt@caption}
+\DeclareCaptionFont{scr@labelfont}{\scr@fnt@captionlabel}
+\SetCaptionDefault{font}{scr@font}
+\SetCaptionDefault{labelfont}{scr@labelfont}
+% \end{macrocode}
+%
+% \section{Positioning}
+%
+% Here we patch the caption related \KOMAScript\ commands to set \package{caption} package settings as well.
+% Furthermore we take over the caption related settings from the \KOMAScript\ classes.
+%
+% \begin{macro}{\if@captionabove}
+% \changes{v1.0j}{2006/03/21}{Bugfix 2006-03-21: \cs{let}\cs{caption@setposition}\cs{@gobble} added}
+% \changes{v1.0n}{2006/03/09}{Accidentally this got broken in \version{1.0m}, fixed}
+% \changes{v1.1}{2007/03/31}{We redefine \cs{captionabovetrue/false} now instead of \cs{captionabove/below}}
+% \changes{v1.1a}{2007/09/14}{Bugfix 2007-09-14: Redefinition of \cs{@captionabovetrue} \& \cs{@captionabovefalse} for \env{longtable} added}
+% \changes{v1.1g}{2008/03/01}{\cs{def} changed to \cs{g@addto@macro}}
+% \changes{v1.1k}{2009/10/09}{\opt{figureposition} and \opt{tableposition} will issue a warning now}
+% \changes{v1.8e}{2019/09/11}{\opt{figureposition} and \opt{tableposition} will now set the position anyway since it could be used by other packages}
+% \changes{v2.0a}{2020/09/12}{Faulty \cs{AtBeginCaption} replaced with correct \cs{AfterCaptionPackage}}
+% Patch |\@captionabovetrue| and |\@captionabovefalse| so they will set the \package{caption3} position setting, too.
+% Note that these are stronger than the \opt{position} setting, therefore we override the options
+% \opt{figureposition} and \opt{tableposition} to typeout a warning.
+% \begin{macrocode}
+\g@addto@macro\@captionabovetrue{\caption@setposition{t}}%
+\g@addto@macro\@captionabovefalse{\caption@setposition{b}}%
+% \end{macrocode}
+% \begin{macrocode}
+\if@captionabove
+ \@captionabovetrue
+\else
+ \@captionabovefalse
+\fi
+% \end{macrocode}
+% |\captionabove| \& |\captionbelow| for longtable:
+% \begin{macrocode}
+\AfterCaptionPackage{\caption@AtBeginLongtable{%
+ \def\@captionabovetrue{\LT@captionsetup{position=t}}%
+ \def\@captionabovefalse{\LT@captionsetup{position=b}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if@tablecaptionabove}
+% \changes{v1.1g}{2008/03/01}{\cs{def} changed to \cs{g@addto@macro}}
+% Patch |\@tablecaptionabovetrue| and |\@tablecaptionabovefalse| so they will set the \package{caption3} position setting, too.
+% \begin{macrocode}
+\g@addto@macro\@tablecaptionabovetrue{\captionsetup*[table]{position=t}}%
+\g@addto@macro\@tablecaptionabovefalse{\captionsetup*[table]{position=b}}%
+% \end{macrocode}
+% \begin{macrocode}
+\if@tablecaptionabove
+ \@tablecaptionabovetrue
+\else
+ \@tablecaptionabovefalse
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if@figurecaptionabove}
+% \changes{v1.5}{2013/02/15}{Support of \cs{if@figurecaptionabove} added}
+% Patch |\@figurecaptionabovetrue| and |\@figurecaptionabovefalse| so they will set the \package{caption3} position setting, too.
+% \begin{macrocode}
+\caption@ifdefined\@figurecaptionabovetrue{%
+ \g@addto@macro\@figurecaptionabovetrue{\captionsetup*[figure]{position=t}}%
+ \g@addto@macro\@figurecaptionabovefalse{\captionsetup*[figure]{position=b}}%
+% \end{macrocode}
+% \begin{macrocode}
+ \if@figurecaptionabove
+ \@figurecaptionabovetrue
+ \else
+ \@figurecaptionabovefalse
+ \fi}{}
+% \end{macrocode}
+% \end{macro}
+%
+% Since the \KOMAScript\ position setting overwrites the one from the \package{caption} package,
+% we re-define the options |figure|\-|position| and |table|\-|position| to issue a warning.
+% \Note{But we set the value anyway since it will be used by sub-captions.}
+%
+% \begin{macrocode}
+\AtCaptionPackage{%
+ \let\caption@koma@figureposition\KV@caption@figureposition
+ \DeclareCaptionOption{figureposition}{%
+ \caption@WarningNoLine{%
+ Option `figureposition=#1' has no effect\MessageBreak
+ when used with a KOMA-Script document class}%
+ \caption@koma@figureposition{#1}}
+% \end{macrocode}
+% \begin{macrocode}
+ \let\caption@koma@tableposition\KV@caption@tableposition
+ \DeclareCaptionOption{tableposition}{%
+ \caption@WarningNoLine{%
+ Option `tableposition=#1' has no effect\MessageBreak
+ when used with a KOMA-Script document class}%
+ \caption@koma@tableposition{#1}}}
+% \end{macrocode}
+%
+% \section{Adaption of \cs{caption} command}
+%
+% \begin{macro}{\scr@caption}
+% \KOMAScript\ contains the code
+% |\AtBeginDocument{\let\scr@caption\caption}|
+% so we need to update |\scr@caption| after the \package{caption} package has re-defined |\caption|.
+% \begin{macrocode}
+\AtBeginDocument{\let\scr@caption\caption}
+% \end{macrocode}
+% \end{macro}
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+% \Finale
+%
+\endinput
+
diff --git a/Master/texmf-dist/source/latex/caption/caption-light.dtx b/Master/texmf-dist/source/latex/caption/caption-light.dtx
new file mode 100644
index 00000000000..c56734a4142
--- /dev/null
+++ b/Master/texmf-dist/source/latex/caption/caption-light.dtx
@@ -0,0 +1,394 @@
+% \iffalse meta-comment
+%
+% This is file `caption-light.dtx'.
+%
+% Copyright (C) 2020 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
+%
+% --------------------------------------------------------------------------
+%
+% 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
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Axel Sommerfeldt.
+%
+% This work consists of the files
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
+% the derived files
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
+% and the user manuals
+% caption-deu.tex, caption-eng.tex, caption-rus.tex.
+%
+% \fi
+% \CheckSum{84}
+%
+% \iffalse
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-light.drv}[2020/08/24 v1.0 Customizing captions (AR)]
+\hbadness=9999 \newcount\hbadness \hfuzz=74pt % Make TeX shut up.
+%\errorcontextlines=3
+%
+\documentclass{ltxdoc}
+\setlength\parindent{0pt}
+\setlength\parskip{\smallskipamount}
+%
+\newcommand\LineBreak{\linebreak[3]}
+\newcommand\PageBreak{\pagebreak[3]}
+\usepackage{ifpdf}
+\ifpdf
+ \usepackage{mathptmx,courier}
+ \usepackage[scaled=0.90]{helvet}
+ \addtolength\marginparwidth{15pt}
+ \ifdim\paperheight=297mm % a4paper
+ \renewcommand\LineBreak{\\}
+ \renewcommand\PageBreak{\clearpage}
+ \fi
+\fi
+%
+\usepackage[bottom]{footmisc}
+%
+\PassOptionsToPackage{breaklinks=true}{hyperref}
+\usepackage{hypdoc}
+\ifpdf\usepackage{hypdestopt}\fi
+\hypersetup{pdfkeywords={LaTeX, package, subcaption},pdfstartpage={},pdfstartview={}}
+%
+\usepackage{caption-light}[2020/08/23] % needs v1.0 or newer
+%
+\newcommand*\purerm[1]{{\upshape\mdseries\rmfamily #1}}
+\newcommand*\puresf[1]{{\upshape\mdseries\sffamily #1}}
+\newcommand*\purett[1]{{\upshape\mdseries\ttfamily #1}}
+\let\package\puresf
+\let\env\purett \let\opt\purett
+%
+\newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
+\newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
+\newcommand*\version[2][]{v$#2$}
+%
+\usepackage{marvosym}
+\makeatletter
+\newcommand*\INFO{\@ifstar{\@INFO{}}{\@INFO{\vbox to \ht\strutbox}}}
+\newcommand*\@INFO[1]{\MARGINSYM{#1{\LARGE\Info}}}
+\makeatother
+%
+\newcommand*\MARGINSYM[1]{\hskip 1sp \marginpar{\raggedleft\textcolor{blue}{{#1}}}}
+\newcommand*\NEW[2]{\MARGINSYM{\vskip2pt\footnotesize#1\\#2}}
+%
+\begin{document}
+ \DocInput{caption-light.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \let\subsectionautorefname\sectionautorefname
+% \let\subsubsectionautorefname\sectionautorefname
+%
+% \def\thispackage{the \package{caption-light} package}
+% \def\Thispackage{The \package{caption-light} package}
+%
+% \newcommand\NEWfeature{\NEW{New feature}}
+% \newcommand\NEWdescription{\NEW{New description}}
+%
+% \makeatletter
+% \def\Ref{\@ifstar{\@Ref\ref}{\@Ref\autoref}}
+% \def\@Ref#1#2{#1{#2}: \textit{\nameref{#2}}}
+% \makeatother
+% \def\See#1{\nopagebreak{\small (See #1)}}
+%
+% \GetFileInfo{caption-light.drv}
+% \let\docdate\filedate
+% \let\docversion\fileversion
+% \GetFileInfo{caption-light.sty}
+%
+% \title{\texorpdfstring{\Thispackage\thanks{%^^A
+% This package has version number \docversion.}}%^^A
+% {The caption-light package}}
+% \author{Axel Sommerfeldt\\
+% \url{https://gitlab.com/axelsommerfeldt/caption}}
+% \date{\docdate}
+% \maketitle
+%
+% \begin{abstract}
+% \Thispackage\ offers (limited) customization of captions
+% in floating environments such |figure| and |table|.
+% \par\smallskip
+% \textit{Please note:} Many document classes already have build-in options and
+% commands for customizing captions.
+% If these possibilities are sufficient for you, there is usually no need for
+% you to use the \package{caption} package at all.
+% And if you are just interested in using the command \cs{captionof}, loading
+% of the very small \package{capt-of} package is usually sufficient.
+% \end{abstract}
+%
+% \iffalse\clearpage\fi
+% \setcounter{tocdepth}{2}
+% \tableofcontents
+%
+% \clearpage
+% \section{Loading the package}
+%
+% Load this package using
+% \begin{quote}
+% |\usepackage|\oarg{options}|{caption-light}|
+% \end{quote}
+% or
+% \begin{quote}
+% |\usepackage{caption-light}|\\
+% \ldots\\
+% |\captionsetup|\marg{options}
+% \end{quote}
+% As opposite to the \package{caption} package only a limited set of options is
+% supported by \thispackage:
+% |aboveskip=|\ldots,
+% |belowskip=|\ldots,
+% |font=|\ldots,
+% |justification=|\ldots,
+% |labelfont=|\ldots,
+% |labelseparator=|\ldots,
+% |position=|\ldots,
+% |singlelinecheck=|\ldots,
+% |skip=|\ldots, and
+% |textfont=|\ldots
+%
+% See \package{caption} package documentation for the meaning and usage of
+% these options.
+%
+% \section{Commands}
+%
+% This package offers |\caption|\-|setup|, |\set|\-|caption|\-|type|, and
+% |\caption|\-|of| as well.
+%
+% \section{Why this package?}
+%
+% This package offers some advantages over the \package{caption} package:
+% \begin{itemize}
+% \item It does not depend on correct |\hsize| for "long" captions,
+% just like the original definition included in |article|, |report|, and |book|.
+% \item If the caption is typeset as "short" (centered), the content of
+% the caption is evaluated only once,
+% just like the original definition included in |article|, |report|, and |book|.
+% \item It does not re-define |\caption| and floating environments,
+% therefore avoiding incompatibilities.
+% \item It does not patch any other packages, therefore avoiding
+% incompatibilities.
+% \end{itemize}
+%
+% In short it's a more compatible and less troublesome variant of the
+% \package{caption} package, but (much) less powerful.
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \StopEventually{%^^A
+% }
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \DoNotIndex{\\,\_,\ ,\@@par}
+% \DoNotIndex{\@bsphack}
+% \DoNotIndex{\@car,\@cdr,\@classoptionslist,\@cons,\@currext,\@currname}
+% \DoNotIndex{\@ehc,\@ehd,\@empty,\@esphack,\@expandtwoargs}
+% \DoNotIndex{\@for,\@firstofone,\@firstoftwo}
+% \DoNotIndex{\@gobble,\@gobblefour,\@gobbletwo,\@hangfrom}
+% \DoNotIndex{\@ifnextchar,\@ifpackagelater,\@ifpackageloaded}
+% \DoNotIndex{\@ifstar,\@ifundefined,\@latex@error,\@namedef,\@nameuse}
+% \DoNotIndex{\@onlypreamble,\@parboxrestore,\@plus,\@ptionlist}
+% \DoNotIndex{\@removeelement,\@restorepar,\@secondoftwo,\@setpar}
+% \DoNotIndex{\@tempa,\@tempboxa,\@tempdima,\@tempdimb,\@tempdimc,\@tempb,\@tempc}
+% \DoNotIndex{\@testopt}
+% \DoNotIndex{\@undefined,\@unprocessedoptions,\@unusedoptionlist}
+% \DoNotIndex{\p@,\z@}
+% \DoNotIndex{\active,\addtocounter,\addtolength,\advance,\aftergroup}
+% \DoNotIndex{\baselineskip,\begin,\begingroup,\bfseries,\box}
+% \DoNotIndex{\catcode,\centering,\changes,\csname,\def,\divide,\do,\downarrow}
+% \DoNotIndex{\edef,\else,\empty,\end,\endcsname,\endgraf,\endgroup,\expandafter}
+% \DoNotIndex{\fi,\footnotesize,\global}
+% \DoNotIndex{\hangindent,\hbox,\hfil,\hsize,\hskip,\hspace,\hss}
+% \DoNotIndex{\ifcase,\ifdim,\ifnum,\ifodd,\ifvoid,\ifvmode}
+% \DoNotIndex{\ifx,\ignorespaces,\itshape}
+% \DoNotIndex{\Large,\large,\leavevmode,\leftmargini,\leftskip,\let,\linewidth}
+% \DoNotIndex{\llap,\long,\m@ne,\margin,\mdseries,\message}
+% \DoNotIndex{\newcommand,\newdimen,\newlength,\newline,\newif,\newsavebox}
+% \DoNotIndex{\next,\nobreak,\nobreakspace,\noexpand,\noindent,\numberline}
+% \DoNotIndex{\normalcolor,\normalfont,\normalsize,\or,\par,\parbox,\parfillskip}
+% \DoNotIndex{\parindent,\parskip,\prevdepth,\protect,\protected@edef,\protected@write}
+% \DoNotIndex{\providecommand,\quad}
+% \DoNotIndex{\raggedleft,\raggedright,\relax,\renewcommand,\RequirePackage}
+% \DoNotIndex{\rightskip,\rmfamily}
+% \DoNotIndex{\sbox,\scriptsize,\scshape,\setbox,\setlength,\sffamily,\slshape}
+% \DoNotIndex{\small,\string,\space,\strut}
+% \DoNotIndex{\textheight,\the,\toks@,\typeout,\ttfamily}
+% \DoNotIndex{\unvbox,\uparrow,\upshape,\usebox,\usepackage}
+% \DoNotIndex{\value,\vbox,\vsize,\vskip,\wd,\width,\z@skip}
+% \DoNotIndex{\AtBeginDocument,\AtEndOfPackage,\CurrentOption,\DeclareOption}
+% \DoNotIndex{\ExecuteOptions,\GenericWarning,\IfFileExists,\InputIfFileExists}
+% \DoNotIndex{\NeedsTeXFormat,\MessageBreak}
+% \DoNotIndex{\PackageError,\PackageInfo,\PackageWarning,\PackageWarningNoLine}
+% \DoNotIndex{\PassOptionsToPackage,\ProcessOptions,\ProvidesPackage}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \setlength{\parskip}{0pt plus 1pt}
+% \changes{v1.0}{2020/08/24}{First version}
+%
+% \newcommand*\Note[2][Note]{\par{\small\emph{#1:} #2}}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+% \section{The implementation}
+% \iffalse
+%<*package>
+% \fi
+%
+% \subsection{Identification}
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesPackage{caption-light}[2020/08/24 v1.0 Customizing captions (AR)]
+% \end{macrocode}
+%
+% \section{Loading the kernel}
+%
+% \begin{macrocode}
+\RequirePackage{caption3}[2020/08/23] % needs v2.0 or newer
+% \end{macrocode}
+%
+% \section{Check against unknown document classes}
+%
+% \begin{macrocode}
+\caption@ifbool{documentclass}{}{%
+ \caption@WarningNoLine{%
+ Unknown document class (or package),\MessageBreak
+ standard defaults will be used}}
+% \end{macrocode}
+%
+% \section{Check against incompatible packages}
+%
+% \begin{macrocode}
+\@ifpackageloaded{caption2}{%
+ \caption@Error{%
+ You can't use both, the (obsolete) caption2 *and*\MessageBreak
+ the caption-light package}%
+ \endinput
+}{}
+% \end{macrocode}
+%
+% \section{Processing of options}
+%
+% \begin{macrocode}
+\caption@SetupOptions{caption-light}{\caption@setkeys{caption}{#2}}
+\caption@ProcessOptions*{caption-light}
+% \end{macrocode}
+%
+% \section{\cs{@makecaption}}
+%
+% If the \package{caption} package is loaded, we abort processing this file.
+% \begin{macrocode}
+\caption@ifdefined\caption@makecaption
+ {\caption@Info{\noexpand\caption@makecaption is already defined}%
+ \endinput}{}
+% \end{macrocode}
+%
+% \begin{macro}{\caption@makecaption}
+% |\@makecaption|\marg{label}\marg{text}\\
+% We do basically the same as the original code (from the standard
+% \LaTeX\ document classes), but take care of selected settings
+% offered by the \package{caption3} kernel.
+% \begin{macrocode}
+\long\def\caption@makecaption#1#2{%
+ \caption@iftop\caption@belowskip\caption@aboveskip
+ \caption@labelseparator % defines \caption@iflabelfont and \caption@labelsep
+ \caption@singlelinecheck
+ {\sbox\@tempboxa{\caption@@makecaption{#1}{#2}}%
+ \ifdim \wd\@tempboxa >\hsize}%
+ {\iftrue}%
+ \caption@@makecaption{#1}{#2}\par
+ \else
+ \global \@minipagefalse
+ \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi
+ \caption@iftop\caption@aboveskip\caption@belowskip}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand\caption@@makecaption[2]{%
+ \caption@applyfont
+ {\captionlabelfont #1}%
+ {\caption@iflabelfont\captionlabelfont
+ \relax\caption@labelsep}%
+ {\captiontextfont #2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@makecaption}
+% Patch |\@makecaption|, so our definition will be used.
+% \begin{macrocode}
+\let\@makecaption\caption@makecaption
+% \end{macrocode}
+% \end{macro}
+%
+% \section{\cs{setcaptiontype}}
+%
+% We offer the options |type=| and |type*=|, too:
+% \begin{macrocode}
+\caption@AtBeginDocument{%
+% \end{macrocode}
+% \begin{macrocode}
+ \DeclareCaptionOption{type}{\setcaptiontype{#1}}%
+ \DeclareCaptionOption{type*}{\setcaptiontype*{#1}}%
+% \end{macrocode}
+% \begin{macrocode}
+}
+% \end{macrocode}
+% \begin{macro}{\setcaptiontype}
+% |\setcaptiontype*|\marg{type}\\
+% For compatibility reasons we offer a starred variant as well,
+% but it does not differ from the non-starred variant here.
+% \begin{macrocode}
+\newcommand*\setcaptiontype{%
+ \caption@teststar{\def\@captype}{}{}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\captionof}
+% |\captionof*|\marg{type}\oarg{list-entry}\marg{text}\\
+% For compatibility reasons we offer a starred variant as well.
+% \begin{macrocode}
+\caption@AtBeginDocument{%
+ \def\captionof{\caption@teststar\caption@of{\caption*}\caption}}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@of[2]{\setcaptiontype*{#2}#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \Finale
+%
+\endinput
diff --git a/Master/texmf-dist/source/latex/caption/caption-memoir.dtx b/Master/texmf-dist/source/latex/caption/caption-memoir.dtx
new file mode 100644
index 00000000000..1f29e68cb80
--- /dev/null
+++ b/Master/texmf-dist/source/latex/caption/caption-memoir.dtx
@@ -0,0 +1,317 @@
+% \iffalse meta-comment
+%
+% This is file `caption-memoir.dtx'.
+%
+% Copyright (C) 2011-2020 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
+%
+% --------------------------------------------------------------------------
+%
+% 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
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Axel Sommerfeldt.
+%
+% This work consists of the files
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
+% the derived files
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
+% and the user manuals
+% caption-deu.tex, caption-eng.tex, caption-rus.tex.
+%
+% \fi
+% \CheckSum{56}
+%
+% \iffalse
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-memoir.drv}[2020/10/10 v2.1 Implementation of the caption-memoir package]
+\hbadness=9999 \newcount\hbadness \hfuzz=100pt % Make TeX shut up.
+%\errorcontextlines=3
+%
+\documentclass{ltxdoc}
+\setlength\parindent{0pt}
+\setlength\parskip{\smallskipamount}
+%
+\makeatletter % make room for subsections like 2.16.14 in the TOC
+%\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}}
+\renewcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.7em}}
+\makeatother
+%
+\usepackage{ifpdf}
+\ifpdf
+ \usepackage{mathptmx,courier}
+ \usepackage[scaled=0.90]{helvet}
+ \addtolength\marginparwidth{15pt}
+\fi
+%
+\usepackage{hypdoc}
+\ifpdf\usepackage{hypdestopt}\fi
+\hypersetup{pdfkeywords={LaTeX, package, caption},pdfstartpage={},pdfstartview={}}
+%
+\begin{document}
+ \DocInput{caption-memoir.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \newcommand*\purerm[1]{\texorpdfstring{{\upshape\mdseries\rmfamily #1}}{#1}}
+% \newcommand*\puresf[1]{\texorpdfstring{{\upshape\mdseries\sffamily #1}}{#1}}
+% \newcommand*\purett[1]{\texorpdfstring{{\upshape\mdseries\ttfamily #1}}{#1}}
+% \let\class\puresf \let\package\puresf
+% \let\env\purett \let\opt\purett
+%
+% \newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
+% \newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
+% \newcommand*\version[2][]{v$#2$}
+%
+% \GetFileInfo{caption-memoir.drv}
+% \let\docdate\filedate
+% \let\docversion\fileversion
+% \GetFileInfo{caption-memoir.sto}
+%
+% \title{\texorpdfstring
+% {The adaption of the \package{caption} package to the \class{memoir} document class\thanks{%^^A
+% This adaption has version number \docversion.}}%^^A
+% {The adaption of the caption package to the memoir document class}}
+% \author{Axel Sommerfeldt\\
+% \url{https://gitlab.com/axelsommerfeldt/caption}}
+% \date{\docdate}
+% \maketitle
+%
+% \begin{abstract}
+% This package adapts the \package{caption} package to the \class{memoir} document class.
+% \end{abstract}
+%
+% \section*{User manual}
+%
+% This document is describing the code implementation only.
+% The user documentation can be found in
+% \nopagebreak\begin{quote}
+% \begin{tabular}{ll}
+% \href{http://mirror.ctan.org/macros/latex/contrib/caption/caption-eng.pdf}%
+% {\texttt{caption-eng.pdf}} & The caption package bundle documentation \\
+% \end{tabular}
+% \end{quote}
+%
+% \StopEventually{}
+% \iffalse
+% \clearpage
+% \tableofcontents
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \DoNotIndex{\\,\_,\ ,\@@par}
+% \DoNotIndex{\@bsphack}
+% \DoNotIndex{\@car,\@cdr,\@classoptionslist,\@cons,\@currext,\@currname}
+% \DoNotIndex{\@ehc,\@ehd,\@empty,\@esphack,\@expandtwoargs}
+% \DoNotIndex{\@for,\@firstofone,\@firstoftwo}
+% \DoNotIndex{\@gobble,\@gobblefour,\@gobbletwo,\@hangfrom}
+% \DoNotIndex{\if@minipage\@ifnextchar,\@ifpackagelater,\@ifpackageloaded}
+% \DoNotIndex{\@ifstar,\@ifundefined,\@latex@error,\@minipagefalse,\@minipagetrue}
+% \DoNotIndex{\@namedef,\@nameuse}
+% \DoNotIndex{\@onlypreamble,\@parboxrestore,\@plus,\@ptionlist}
+% \DoNotIndex{\@removeelement,\@restorepar,\@secondoftwo,\@setminipage,\@setpar}
+% \DoNotIndex{\@tempa,\@tempboxa,\@tempdima,\@tempdimb,\@tempdimc,\@tempb,\@tempc}
+% \DoNotIndex{\@testopt}
+% \DoNotIndex{\@undefined,\@unprocessedoptions,\@unusedoptionlist}
+% \DoNotIndex{\p@,\z@}
+% \DoNotIndex{\active,\addtocounter,\addtolength,\advance,\aftergroup}
+% \DoNotIndex{\baselineskip,\begin,\begingroup,\bfseries,\box}
+% \DoNotIndex{\catcode,\centering,\changes,\csname,\def,\divide,\do,\downarrow}
+% \DoNotIndex{\edef,\else,\empty,\end,\endcsname,\endgraf,\endgroup,\expandafter}
+% \DoNotIndex{\fi,\footnotesize,\global}
+% \DoNotIndex{\hangindent,\hbox,\hfil,\hsize,\hskip,\hspace,\hss}
+% \DoNotIndex{\ifcase,\ifdim,\ifnum,\ifodd,\ifvoid,\ifvmode}
+% \DoNotIndex{\ifx,\ignorespaces,\itshape}
+% \DoNotIndex{\Large,\large,\leavevmode,\leftmargini,\leftskip,\let,\linewidth}
+% \DoNotIndex{\llap,\long,\m@ne,\margin,\mdseries,\message}
+% \DoNotIndex{\newcommand,\newdimen,\newlength,\newline,\newif,\newsavebox}
+% \DoNotIndex{\next,\nobreak,\nobreakspace,\noexpand,\noindent,\numberline}
+% \DoNotIndex{\normalcolor,\normalfont,\normalsize,\or,\par,\parbox,\parfillskip}
+% \DoNotIndex{\parindent,\parskip,\prevdepth,\protect,\protected@edef,\protected@write}
+% \DoNotIndex{\providecommand,\quad}
+% \DoNotIndex{\raggedleft,\raggedright,\relax,\renewcommand,\RequirePackage}
+% \DoNotIndex{\rightskip,\rmfamily}
+% \DoNotIndex{\sbox,\scriptsize,\scshape,\setbox,\setlength,\sffamily,\slshape}
+% \DoNotIndex{\small,\string,\space,\strut}
+% \DoNotIndex{\textheight,\the,\toks@,\typeout,\ttfamily}
+% \DoNotIndex{\unvbox,\uparrow,\upshape,\usebox,\usepackage}
+% \DoNotIndex{\value,\vbox,\vsize,\vskip,\wd,\width,\z@skip}
+% \DoNotIndex{\AtBeginDocument,\AtEndOfPackage,\CurrentOption,\DeclareOption}
+% \DoNotIndex{\ExecuteOptions,\GenericWarning,\IfFileExists,\InputIfFileExists}
+% \DoNotIndex{\NeedsTeXFormat,\MessageBreak}
+% \DoNotIndex{\PackageError,\PackageInfo,\PackageWarning,\PackageWarningNoLine}
+% \DoNotIndex{\PassOptionsToPackage,\ProcessOptions,\ProvidesPackage}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \setlength{\parskip}{0pt plus 1pt}
+% \newcommand*\Note[2][Note]{\par{\small\emph{#1:} #2}\par}
+%
+% \changes{v1.4a}{2011/10/21}{\class{memoir} class support added}
+% \changes{v2.0}{2020/07/27}{\class{memoir} class support adapted to \package{caption3}~\version{2.0}}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \section{Identification}
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-memoir.sto}[2020/10/10 v2.1 Adaption of the caption package to the memoir document class (AR)]
+% \end{macrocode}
+%
+% \section{Adaptions already included in the caption package}
+%
+% The following adaptions to the \class{memoir} document class are already included in the \package{caption} package:
+% \begin{itemize}
+% \item \cs{@caption} expands \cs{memcaptioninfo}
+% \item \cs{caption@prepareanchor} expands \cs{M@gettitle}
+% \item \cs{caption@refstepcounter} expands \cs{donemaincaptiontrue}
+% \item All sub-caption counters will be reset at |\@mem|\-|reset|\-|sub|\-|counter|,
+% even if they weren't defined by the \class{memoir} document class itself.
+% As work-around this command will be patched to protect the counters
+% defined by |\Declare|\-|Caption|\-|Sub|\-|Type|.
+% \end{itemize}
+%
+% \section{Single-line-check}
+%
+% \begin{macro}{\caption@prepareslc}
+% \changes{v1.4a}{2011/10/21}{Re-definition of \cs{pagenote} added}
+% We re-define \cs{pagenote} here so it won't disturb the single-line-check.
+% \begin{macrocode}
+\g@addto@macro\caption@prepareslc{%
+ \let\pagenote\caption@gobble}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Label separator}
+%
+% The `default' caption label separator maps to \cs{@contdelim}.
+% \begin{macrocode}
+\DeclareCaptionLabelSeparator{@contdelim}{\@contdelim}
+\SetCaptionDefault{labelseparator}{@contdelim}
+% \end{macrocode}
+%
+% \begin{macro}{\captiondelim}
+% \changes{v2.1}{2020/10/10}{Re-definition of \cs{captiondelim} added}
+% We re-define |\caption|\-|delim| so it will set the \package{caption3} label separator setting, too.
+% \begin{macrocode}
+\let\caption@memoir@delim\captiondelim
+\renewcommand\captiondelim{%
+ \captionsetup{labelsep=@contdelim}%
+ \caption@memoir@delim}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.0a}{2020/10/10}{Re-definition of label separator `gobble' added}
+% If |\fnum@figure| (or |\fnum@table| or\ldots) ends with |\@gobble|, the `:' part of the caption
+% label separator will be suppressed when a standard document class (\class{article}, \class{report},
+% or \class{book}) will be used, leaving the following space character intact.
+% This is different when using the \class{memoir} document class, in this case the complete
+% label separator will be suppressed. For this reason we re-define the pre-defined caption label
+% separator `gobble' to emulate this behaviour.
+%
+% \begin{macrocode}
+\DeclareCaptionLabelSeparator{gobble}{}
+% \end{macrocode}
+%
+% \section{Fonts}
+%
+% The `default' caption fonts map to \cs{@contnfont} resp.~\cs{conttfont}.
+% \begin{macrocode}
+\DeclareCaptionFont{@contnfont}{\@contnfont}
+\SetCaptionDefault{labelfont}{@contnfont}
+% \end{macrocode}
+% \begin{macrocode}
+\DeclareCaptionFont{@conttfont}{\@conttfont}
+\SetCaptionDefault{textfont}{@conttfont}
+% \end{macrocode}
+%
+% \begin{macro}{\captionnamefont}
+% \changes{v2.1}{2020/10/10}{Re-definition of \cs{captionnamefont} added}
+% We re-define |\caption|\-|delim| so it will set the \package{caption3} label separator setting, too.
+% \begin{macrocode}
+\let\caption@memoir@namefont\captionnamefont
+\renewcommand\captionnamefont{%
+ \captionsetup{labelfont=@contnfont}%
+ \caption@memoir@namefont}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\captiontitlefont}
+% \changes{v2.1}{2020/10/10}{Re-definition of \cs{captiontitlefont} added}
+% We re-define |\caption|\-|delim| so it will set the \package{caption3} label separator setting, too.
+% \begin{macrocode}
+\let\caption@memoir@titlefont\captiontitlefont
+\renewcommand\captiontitlefont{%
+ \captionsetup{textfont=@conttfont}%
+ \caption@memoir@titlefont}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Vertical spaces before and after captions}
+%
+% The \class{memoir} document classes uses |\above|\-|caption|\-|skip| and |\below|\-|caption|\-|skip|
+% different than the standard document classes and the \package{caption} package:
+% They always typeset |\above|\-|caption|\-|skip| before the caption and
+% |\below|\-|caption|\-|skip| after the captions. Both are preset to |0.5\one|\-|line|\-|skip|.
+%
+% For this reason we have to set the |\below|\-|caption|\-|skip| to |0pt| if the \package{caption}
+% package is used, so no extra vertical space will be created.
+%
+% \begin{macrocode}
+\AtCaptionPackage{\setlength\belowcaptionskip{0pt}}
+% \end{macrocode}
+%
+% \section{TODO}
+%
+% \begin{macrocode}
+% TODO: \captionstyle
+% TODO: \captionwidth, \changecaptionwidth, \normalcaptionwidth
+% TODO: \hangcaption, \indentcaption, \normalcaption
+% TODO: \precaption, \postcaption, \midbicaption
+% TODO: \captiontitlefinal
+% TODO: \contcaption
+% TODO: \newfixedcaption, \renewfixedcaption, \providefixedcaption
+%
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+% \Finale
+%
+\endinput
+
diff --git a/Master/texmf-dist/source/latex/caption/caption-ntg.dtx b/Master/texmf-dist/source/latex/caption/caption-ntg.dtx
new file mode 100644
index 00000000000..97e0379f5f5
--- /dev/null
+++ b/Master/texmf-dist/source/latex/caption/caption-ntg.dtx
@@ -0,0 +1,213 @@
+% \iffalse meta-comment
+%
+% This is file `caption-ntg.dtx'.
+%
+% Copyright (C) 2007-2020 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
+%
+% --------------------------------------------------------------------------
+%
+% 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
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Axel Sommerfeldt.
+%
+% This work consists of the files
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
+% the derived files
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
+% and the user manuals
+% caption-deu.tex, caption-eng.tex, caption-rus.tex.
+%
+% \fi
+% \CheckSum{8}
+%
+% \iffalse
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-ntg.drv}[2020/08/01 v2.0 Implementation of the caption-ntg package]
+\hbadness=9999 \newcount\hbadness \hfuzz=100pt % Make TeX shut up.
+%\errorcontextlines=3
+%
+\documentclass{ltxdoc}
+\setlength\parindent{0pt}
+\setlength\parskip{\smallskipamount}
+%
+\makeatletter % make room for subsections like 2.16.14 in the TOC
+%\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}}
+\renewcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.7em}}
+\makeatother
+%
+\usepackage{ifpdf}
+\ifpdf
+ \usepackage{mathptmx,courier}
+ \usepackage[scaled=0.90]{helvet}
+ \addtolength\marginparwidth{15pt}
+\fi
+%
+\usepackage{hypdoc}
+\ifpdf\usepackage{hypdestopt}\fi
+\hypersetup{pdfkeywords={LaTeX, package, caption},pdfstartpage={},pdfstartview={}}
+%
+\DeclareRobustCommand*\NTG{NTG}
+%
+\begin{document}
+ \DocInput{caption-ntg.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \newcommand*\purerm[1]{\texorpdfstring{{\upshape\mdseries\rmfamily #1}}{#1}}
+% \newcommand*\puresf[1]{\texorpdfstring{{\upshape\mdseries\sffamily #1}}{#1}}
+% \newcommand*\purett[1]{\texorpdfstring{{\upshape\mdseries\ttfamily #1}}{#1}}
+% \let\class\puresf \let\package\puresf
+% \let\env\purett \let\opt\purett
+%
+% \newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
+% \newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
+% \newcommand*\version[2][]{v$#2$}
+%
+% \GetFileInfo{caption-ntg.drv}
+% \let\docdate\filedate
+% \let\docversion\fileversion
+% \GetFileInfo{caption-ntg.sto}
+%
+% \title{\texorpdfstring
+% {The adaption of the \package{caption} package to the \NTG\ document classes\thanks{%^^A
+% This adaption has version number \docversion.}}%^^A
+% {The adaption of the caption package to the NTG document classes}}
+% \author{Axel Sommerfeldt\\
+% \url{https://gitlab.com/axelsommerfeldt/caption}}
+% \date{\docdate}
+% \maketitle
+%
+% \begin{abstract}
+% This package adapts the \package{caption} package to the \NTG\ document classes.
+% \end{abstract}
+%
+% \section*{User manual}
+%
+% This document is describing the code implementation only.
+% The user documentation can be found in
+% \nopagebreak\begin{quote}
+% \begin{tabular}{ll}
+% \href{http://mirror.ctan.org/macros/latex/contrib/caption/caption-eng.pdf}%
+% {\texttt{caption-eng.pdf}} & The caption package bundle documentation \\
+% \end{tabular}
+% \end{quote}
+%
+% \StopEventually{}
+% \iffalse
+% \clearpage
+% \tableofcontents
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \DoNotIndex{\\,\_,\ ,\@@par}
+% \DoNotIndex{\@bsphack}
+% \DoNotIndex{\@car,\@cdr,\@classoptionslist,\@cons,\@currext,\@currname}
+% \DoNotIndex{\@ehc,\@ehd,\@empty,\@esphack,\@expandtwoargs}
+% \DoNotIndex{\@for,\@firstofone,\@firstoftwo}
+% \DoNotIndex{\@gobble,\@gobblefour,\@gobbletwo,\@hangfrom}
+% \DoNotIndex{\if@minipage\@ifnextchar,\@ifpackagelater,\@ifpackageloaded}
+% \DoNotIndex{\@ifstar,\@ifundefined,\@latex@error,\@minipagefalse,\@minipagetrue}
+% \DoNotIndex{\@namedef,\@nameuse}
+% \DoNotIndex{\@onlypreamble,\@parboxrestore,\@plus,\@ptionlist}
+% \DoNotIndex{\@removeelement,\@restorepar,\@secondoftwo,\@setminipage,\@setpar}
+% \DoNotIndex{\@tempa,\@tempboxa,\@tempdima,\@tempdimb,\@tempdimc,\@tempb,\@tempc}
+% \DoNotIndex{\@testopt}
+% \DoNotIndex{\@undefined,\@unprocessedoptions,\@unusedoptionlist}
+% \DoNotIndex{\p@,\z@}
+% \DoNotIndex{\active,\addtocounter,\addtolength,\advance,\aftergroup}
+% \DoNotIndex{\baselineskip,\begin,\begingroup,\bfseries,\box}
+% \DoNotIndex{\catcode,\centering,\changes,\csname,\def,\divide,\do,\downarrow}
+% \DoNotIndex{\edef,\else,\empty,\end,\endcsname,\endgraf,\endgroup,\expandafter}
+% \DoNotIndex{\fi,\footnotesize,\global}
+% \DoNotIndex{\hangindent,\hbox,\hfil,\hsize,\hskip,\hspace,\hss}
+% \DoNotIndex{\ifcase,\ifdim,\ifnum,\ifodd,\ifvoid,\ifvmode}
+% \DoNotIndex{\ifx,\ignorespaces,\itshape}
+% \DoNotIndex{\Large,\large,\leavevmode,\leftmargini,\leftskip,\let,\linewidth}
+% \DoNotIndex{\llap,\long,\m@ne,\margin,\mdseries,\message}
+% \DoNotIndex{\newcommand,\newdimen,\newlength,\newline,\newif,\newsavebox}
+% \DoNotIndex{\next,\nobreak,\nobreakspace,\noexpand,\noindent,\numberline}
+% \DoNotIndex{\normalcolor,\normalfont,\normalsize,\or,\par,\parbox,\parfillskip}
+% \DoNotIndex{\parindent,\parskip,\prevdepth,\protect,\protected@edef,\protected@write}
+% \DoNotIndex{\providecommand,\quad}
+% \DoNotIndex{\raggedleft,\raggedright,\relax,\renewcommand,\RequirePackage}
+% \DoNotIndex{\rightskip,\rmfamily}
+% \DoNotIndex{\sbox,\scriptsize,\scshape,\setbox,\setlength,\sffamily,\slshape}
+% \DoNotIndex{\small,\string,\space,\strut}
+% \DoNotIndex{\textheight,\the,\toks@,\typeout,\ttfamily}
+% \DoNotIndex{\unvbox,\uparrow,\upshape,\usebox,\usepackage}
+% \DoNotIndex{\value,\vbox,\vsize,\vskip,\wd,\width,\z@skip}
+% \DoNotIndex{\AtBeginDocument,\AtEndOfPackage,\CurrentOption,\DeclareOption}
+% \DoNotIndex{\ExecuteOptions,\GenericWarning,\IfFileExists,\InputIfFileExists}
+% \DoNotIndex{\NeedsTeXFormat,\MessageBreak}
+% \DoNotIndex{\PackageError,\PackageInfo,\PackageWarning,\PackageWarningNoLine}
+% \DoNotIndex{\PassOptionsToPackage,\ProcessOptions,\ProvidesPackage}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \setlength{\parskip}{0pt plus 1pt}
+% \newcommand*\Note[2][Note]{\par{\small\emph{#1:} #2}\par}
+%
+% \changes{v1.1}{2007/04/06}{\NTG\ class support added}
+% \changes{v2.0}{2020/08/01}{\NTG\ class support adapted to \package{caption3}~\version{2.0}}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \section{Identification}
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-ntg.sto}[2020/08/22 v2.0 Adaption of the caption package to the NTG document classes (AR)]
+% \end{macrocode}
+%
+% \section{Fonts}
+%
+% The `default' fonts map to \cs{CaptionLabelFont} resp. \cs{CaptionTextFont}.
+% \begin{macrocode}
+\DeclareCaptionFont{ntg@labelfont}{\CaptionLabelFont}
+\DeclareCaptionFont{ntg@textfont}{\CaptionTextFont}
+\SetCaptionDefault{labelfont}{ntg@labelfont}
+\SetCaptionDefault{textfont}{ntg@textfont}
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+% \Finale
+%
+\endinput
+
diff --git a/Master/texmf-dist/source/latex/caption/caption-thesis.dtx b/Master/texmf-dist/source/latex/caption/caption-thesis.dtx
new file mode 100644
index 00000000000..c358eadff1c
--- /dev/null
+++ b/Master/texmf-dist/source/latex/caption/caption-thesis.dtx
@@ -0,0 +1,219 @@
+% \iffalse meta-comment
+%
+% This is file `caption-thesis.dtx'.
+%
+% Copyright (C) 2008-2020 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
+%
+% --------------------------------------------------------------------------
+%
+% 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
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2003/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Axel Sommerfeldt.
+%
+% This work consists of the files
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
+% the derived files
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
+% and the user manuals
+% caption-deu.tex, caption-eng.tex, caption-rus.tex.
+%
+% \fi
+% \CheckSum{9}
+%
+% \iffalse
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-thesis.drv}[2020/08/01 v2.0 Implementation of the caption-thesis package]
+\hbadness=9999 \newcount\hbadness \hfuzz=100pt % Make TeX shut up.
+%\errorcontextlines=3
+%
+\documentclass{ltxdoc}
+\setlength\parindent{0pt}
+\setlength\parskip{\smallskipamount}
+%
+\makeatletter % make room for subsections like 2.16.14 in the TOC
+%\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}}
+\renewcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.7em}}
+\makeatother
+%
+\usepackage{ifpdf}
+\ifpdf
+ \usepackage{mathptmx,courier}
+ \usepackage[scaled=0.90]{helvet}
+ \addtolength\marginparwidth{15pt}
+\fi
+%
+\usepackage{hypdoc}
+\ifpdf\usepackage{hypdestopt}\fi
+\hypersetup{pdfkeywords={LaTeX, package, caption},pdfstartpage={},pdfstartview={}}
+%
+\begin{document}
+ \DocInput{caption-thesis.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \newcommand*\purerm[1]{\texorpdfstring{{\upshape\mdseries\rmfamily #1}}{#1}}
+% \newcommand*\puresf[1]{\texorpdfstring{{\upshape\mdseries\sffamily #1}}{#1}}
+% \newcommand*\purett[1]{\texorpdfstring{{\upshape\mdseries\ttfamily #1}}{#1}}
+% \let\class\puresf \let\package\puresf
+% \let\env\purett \let\opt\purett
+%
+% \newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
+% \newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
+% \newcommand*\version[2][]{v$#2$}
+%
+% \GetFileInfo{caption-thesis.drv}
+% \let\docdate\filedate
+% \let\docversion\fileversion
+% \GetFileInfo{caption-thesis.sto}
+%
+% \title{\texorpdfstring
+% {The adaption of the \package{caption} package to the \class{thesis} document class\thanks{%^^A
+% This adaption has version number \docversion.}}%^^A
+% {The adaption of the caption package to the thesis document class}}
+% \author{Axel Sommerfeldt\\
+% \url{https://gitlab.com/axelsommerfeldt/caption}}
+% \date{\docdate}
+% \maketitle
+%
+% \begin{abstract}
+% This package adapts the \package{caption} package to the thesis document class.
+% \end{abstract}
+%
+% \section*{User manual}
+%
+% This document is describing the code implementation only.
+% The user documentation can be found in
+% \nopagebreak\begin{quote}
+% \begin{tabular}{ll}
+% \href{http://mirror.ctan.org/macros/latex/contrib/caption/caption-eng.pdf}%
+% {\texttt{caption-eng.pdf}} & The caption package bundle documentation \\
+% \end{tabular}
+% \end{quote}
+%
+% \StopEventually{}
+% \iffalse
+% \clearpage
+% \tableofcontents
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \DoNotIndex{\\,\_,\ ,\@@par}
+% \DoNotIndex{\@bsphack}
+% \DoNotIndex{\@car,\@cdr,\@classoptionslist,\@cons,\@currext,\@currname}
+% \DoNotIndex{\@ehc,\@ehd,\@empty,\@esphack,\@expandtwoargs}
+% \DoNotIndex{\@for,\@firstofone,\@firstoftwo}
+% \DoNotIndex{\@gobble,\@gobblefour,\@gobbletwo,\@hangfrom}
+% \DoNotIndex{\if@minipage\@ifnextchar,\@ifpackagelater,\@ifpackageloaded}
+% \DoNotIndex{\@ifstar,\@ifundefined,\@latex@error,\@minipagefalse,\@minipagetrue}
+% \DoNotIndex{\@namedef,\@nameuse}
+% \DoNotIndex{\@onlypreamble,\@parboxrestore,\@plus,\@ptionlist}
+% \DoNotIndex{\@removeelement,\@restorepar,\@secondoftwo,\@setminipage,\@setpar}
+% \DoNotIndex{\@tempa,\@tempboxa,\@tempdima,\@tempdimb,\@tempdimc,\@tempb,\@tempc}
+% \DoNotIndex{\@testopt}
+% \DoNotIndex{\@undefined,\@unprocessedoptions,\@unusedoptionlist}
+% \DoNotIndex{\p@,\z@}
+% \DoNotIndex{\active,\addtocounter,\addtolength,\advance,\aftergroup}
+% \DoNotIndex{\baselineskip,\begin,\begingroup,\bfseries,\box}
+% \DoNotIndex{\catcode,\centering,\changes,\csname,\def,\divide,\do,\downarrow}
+% \DoNotIndex{\edef,\else,\empty,\end,\endcsname,\endgraf,\endgroup,\expandafter}
+% \DoNotIndex{\fi,\footnotesize,\global}
+% \DoNotIndex{\hangindent,\hbox,\hfil,\hsize,\hskip,\hspace,\hss}
+% \DoNotIndex{\ifcase,\ifdim,\ifnum,\ifodd,\ifvoid,\ifvmode}
+% \DoNotIndex{\ifx,\ignorespaces,\itshape}
+% \DoNotIndex{\Large,\large,\leavevmode,\leftmargini,\leftskip,\let,\linewidth}
+% \DoNotIndex{\llap,\long,\m@ne,\margin,\mdseries,\message}
+% \DoNotIndex{\newcommand,\newdimen,\newlength,\newline,\newif,\newsavebox}
+% \DoNotIndex{\next,\nobreak,\nobreakspace,\noexpand,\noindent,\numberline}
+% \DoNotIndex{\normalcolor,\normalfont,\normalsize,\or,\par,\parbox,\parfillskip}
+% \DoNotIndex{\parindent,\parskip,\prevdepth,\protect,\protected@edef,\protected@write}
+% \DoNotIndex{\providecommand,\quad}
+% \DoNotIndex{\raggedleft,\raggedright,\relax,\renewcommand,\RequirePackage}
+% \DoNotIndex{\rightskip,\rmfamily}
+% \DoNotIndex{\sbox,\scriptsize,\scshape,\setbox,\setlength,\sffamily,\slshape}
+% \DoNotIndex{\small,\string,\space,\strut}
+% \DoNotIndex{\textheight,\the,\toks@,\typeout,\ttfamily}
+% \DoNotIndex{\unvbox,\uparrow,\upshape,\usebox,\usepackage}
+% \DoNotIndex{\value,\vbox,\vsize,\vskip,\wd,\width,\z@skip}
+% \DoNotIndex{\AtBeginDocument,\AtEndOfPackage,\CurrentOption,\DeclareOption}
+% \DoNotIndex{\ExecuteOptions,\GenericWarning,\IfFileExists,\InputIfFileExists}
+% \DoNotIndex{\NeedsTeXFormat,\MessageBreak}
+% \DoNotIndex{\PackageError,\PackageInfo,\PackageWarning,\PackageWarningNoLine}
+% \DoNotIndex{\PassOptionsToPackage,\ProcessOptions,\ProvidesPackage}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \setlength{\parskip}{0pt plus 1pt}
+% \newcommand*\Note[2][Note]{\par{\small\emph{#1:} #2}\par}
+%
+% \changes{v1.2a}{2008/01/31}{thesis class support added}
+% \changes{v1.2e}{2009/11/15}{Bugfix 09-11-14: thesis class support revised}
+% \changes{v2.0}{2020/08/01}{thesis class support adapted to \package{caption3}~\version{2.0}}
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \section{Identification}
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1994/12/01]
+\ProvidesFile{caption-thesis.sto}[2020/08/22 v2.0 Adaption of the caption package to the thesis document class (AR)]
+% \end{macrocode}
+%
+% \section{Format}
+%
+% The `default' format maps to `hang'.
+% \begin{macrocode}
+\SetCaptionDefault{format}{hang}
+% \end{macrocode}
+%
+% \section{Fonts}
+%
+% The `default' fonts map to \cs{cph@font} resp. \cs{cpb@font}.
+% \begin{macrocode}
+\DeclareCaptionFont{cph@font}{\cph@font}
+\DeclareCaptionFont{cpb@font}{\cpb@font}
+\SetCaptionDefault{labelfont}{cph@font}
+\SetCaptionDefault{textfont}{cpb@font}
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \iffalse
+% --------------------------------------------------------------------------- %
+% \fi
+%
+% \clearpage
+% \Finale
+%
+\endinput
+
diff --git a/Master/texmf-dist/source/latex/caption/caption.dtx b/Master/texmf-dist/source/latex/caption/caption.dtx
index 1c5a196e139..09cef7fb865 100644
--- a/Master/texmf-dist/source/latex/caption/caption.dtx
+++ b/Master/texmf-dist/source/latex/caption/caption.dtx
@@ -19,21 +19,25 @@
% This Current Maintainer of this work is Axel Sommerfeldt.
%
% This work consists of the files
-% caption.ins, caption.dtx, caption2.dtx, caption3.dtx,
-% bicaption.dtx, ltcaption.dtx, subcaption.dtx, totalcount.dtx,
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
% the derived files
-% caption.sty, caption2.sty, caption3.sty,
-% bicaption.sty, ltcaption.sty, subcaption.sty, totalcount.sty,
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
% and the user manuals
% caption-deu.tex, caption-eng.tex, caption-rus.tex.
%
% \fi
-% \CheckSum{3044}
+% \CheckSum{2692}
%
% \iffalse
%<*driver>
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesFile{caption.drv}[2015/09/16 v3.4 Implementation of the caption package]
+\ProvidesFile{caption.drv}[2020/10/11 v3.5 Implementation of the caption package]
\hbadness=9999 \newcount\hbadness \hfuzz=100pt % Make TeX shut up.
%\errorcontextlines=3
%
@@ -62,14 +66,6 @@
\DeclareRobustCommand*\eTeX{\texorpdfstring
{\leavevmode\hbox{$\varepsilon$}-\TeX}%
{e-TeX}}
-\DeclareRobustCommand*\AmS{\texorpdfstring
- {{\protect\usefont{OMS}{cmsy}{m}{n}A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}%
- {AMS}}
-\DeclareRobustCommand*\KOMAScript{\texorpdfstring
- {\textsf{K\kern.05em O\kern.05em M\kern.05em A\kern.1em-\kern.1em Script}}%
- {KOMA-Script}}
-\DeclareRobustCommand*\NTG{NTG}
-\DeclareRobustCommand*\SmF{SMF}
%
\begin{document}
\DocInput{caption.dtx}
@@ -88,19 +84,22 @@
%
% \newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
% \newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
-% \newcommand*\version[2][]{\textit{v#2}}
+% \newcommand*\version[2][]{v$#2$}
%
% \newcommand*\issue[1]{GitLab~\##1}
%
+% \GetFileInfo{caption.drv}
+% \let\docdate\filedate
+% \let\docversion\fileversion
% \GetFileInfo{caption.sty}
%
% \title{The Implementation of
% \texorpdfstring{\thispackage\thanks{%^^A
-% This package has version number \fileversion, last revised \filedate.}}%^^A
+% This package has version number \docversion.}}%^^A
% {the caption package}}
% \author{Axel Sommerfeldt\\
% \url{https://gitlab.com/axelsommerfeldt/caption}}
-% \date{\filedate}
+% \date{\docdate}
% \maketitle
%
% \begin{abstract}
@@ -137,6 +136,30 @@
% \footnotetext{Thanks a lot to Olga Lapko for this translation}
% \end{quote}
%
+% \pagebreak[4]
+% \section*{Internal commands}
+%
+% These internal commands are save to use by other packages as well
+% since their interface will not change in future releases:
+% \begin{quote}\begin{tabular}{ll}
+% Internal command & Currently used by \\
+% \hline
+% |\caption@kernel@addcontentsline| & \package{floatrow} \\
+% |\caption@makecaption| & \package{bidi} \\
+% |\caption@settype| & \package{newfloat} \\
+% |\caption@setsubtype| & \package{floatrow} \\
+% |\caption@starfalse| & \package{bidi} \\
+% |\caption@startrue| & \package{bidi} \\
+% |\caption@xlabel| & \package{cleveref} \\
+% \end{tabular}\end{quote}
+%
+% If your package wants to use any other internal command of the \package{caption} package,
+% please write me an e-mail so we can define a proper interface together.
+%
+% The \package{lwarp} package uses a lot of internal commands as well,
+% but we are working on it on the Git branch \texttt{feature/lwarp}:
+% \url{https://gitlab.com/axelsommerfeldt/caption/-/tree/feature/lwarp}
+%
% \StopEventually{}
% \clearpage
% \tableofcontents
@@ -218,13 +241,13 @@
%
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesPackage{caption}[2020/01/03 v3.4h Customizing captions (AR)]
+\ProvidesPackage{caption}[2020/10/26 v3.5g Customizing captions (AR)]
% \end{macrocode}
%
% \section{Loading the kernel}
%
% \begin{macrocode}
-\RequirePackage{caption3}[2020/01/03] % needs v1.8h or newer
+\RequirePackage{caption3}[2020/10/06] % needs v2.2b or newer
% \end{macrocode}
%
% \section{Check against unknown document classes}
@@ -282,123 +305,6 @@
%
% \section{Declaration of options}
%
-% \subsection{Options for figure and table}
-%
-% \changes{v3.0a}{2004/01/09}{Options \opt{figureposition} and \opt{tableposition} added}
-% \begin{macrocode}
-\DeclareCaptionOption{figureposition}{%
- \captionsetup*[figure]{position=#1}}
-\@onlypreamble@key{caption}{figureposition}
-% \end{macrocode}
-% \begin{macrocode}
-\DeclareCaptionOption{tableposition}{%
- \captionsetup*[table]{position=#1}}
-\@onlypreamble@key{caption}{tableposition}
-% \end{macrocode}
-%
-% \changes{v3.0d}{2004/08/03}{Options \opt{figurename} and \opt{tablename} added}
-% \changes{v3.1}{2007/07/04}{Options \opt{figurename} and \opt{tablename} re-written}
-% \changes{v3.1f}{2007/11/18}{Option \opt{name} added}
-% \begin{macrocode}
-\DeclareCaptionOption{figurename}{\caption@SetName{figure}{#1}}
-\@onlypreamble@key{caption}{figurename}
-\DeclareCaptionOption{tablename}{\caption@SetName{table}{#1}}
-\@onlypreamble@key{caption}{tablename}
-% \end{macrocode}
-%
-% \changes{v3.1g}{2008/02/28}{Options \opt{listfigurename} and \opt{listtablename} added}
-% \begin{macrocode}
-\DeclareCaptionOption{listfigurename}{\caption@SetName{listfigure}{#1}}
-\@onlypreamble@key{caption}{listfigurename}
-\DeclareCaptionOption{listtablename}{\caption@SetName{listtable}{#1}}
-\@onlypreamble@key{caption}{listtablename}
-% \end{macrocode}
-%
-% \begin{macro}{\caption@SetName}
-% \changes{v3.1}{2007/07/04}{This macro added}
-% \changes{v3.1f}{2007/11/18}{After-preamble variant added}
-% \changes{v3.1g}{2008/02/28}{Renamed from \cs{caption@SetFloatName} to \cs{caption@SetName}}
-% \changes{v3.1i}{2008/08/02}{Bugfix: Works now without \cs{addto}, too}
-% \changes{v3.2d}{2011/10/29}{Outsourced to \package{newfloat} package}
-% \changes{v3.2f}{2012/01/12}{Bugfix: Uses \cs{caption@NewFloat} now}
-% |\caption@SetName|\marg{float}\marg{name}
-% \begin{macrocode}
-\newcommand*\caption@SetName[2]{%
- \caption@NewFloat{\newfloat@setname{#1}{#2}}}
-\@onlypreamble\caption@SetName
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\DeclareCaptionOption{name}{\caption@setname\@captype{#1}}
-% \end{macrocode}
-% \begin{macro}{\caption@setname}
-% |\caption@setname|\marg{float}\marg{name}
-% \begin{macrocode}
-\newcommand*\caption@setname[2]{%
- \@namedef{#1name}{#2}}
-% \end{macrocode}
-% \end{macro}
-%
-% \changes{v3.1f}{2007/12/21}{Options \opt{figurewithin} and \opt{tablewithin} added}
-% \changes{v3.1i}{2008/04/13}{Option \opt{within} added}
-% \changes{v3.1l}{2010/01/09}{The \opt{within} options are now available within the document, too}
-% \changes{v3.1l}{2010/01/09}{The global \opt{within} option will now affect user-defined
-% floats declared with \cs{DeclareCaptionType}, too}
-%
-% \begin{macro}{\caption@DeclareWithinOption}
-% \changes{v3.1l}{2010/01/09}{This macro and its usage added}
-% |\caption@DeclareWithinOption|\marg{float}
-% declares the options \meta{float}\texttt{within} and \meta{float}\texttt{without},
-% e.g. \texttt{figurewithin} and \texttt{figurewithout}.
-% \begin{macrocode}
-\newcommand*\caption@DeclareWithinOption[1]{%
- \DeclareCaptionOption{#1within}{\caption@Within{#1}{##1}}%
- \DeclareCaptionOptionNoValue{#1without}{\caption@Within{#1}{none}}}
-\@onlypreamble\caption@DeclareWithinOption
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-\caption@DeclareWithinOption{figure}
-\caption@DeclareWithinOption{table}
-% \end{macrocode}
-% \begin{macrocode}
-\DeclareCaptionOption{within}{%
- \caption@NewFloat{\newfloatsetup{within=#1}}}
-\DeclareCaptionOptionNoValue{without}{%
- \caption@NewFloat{\newfloatsetup{without}}}
-% \end{macrocode}
-% \begin{macro}{\caption@Within}
-% \changes{v3.1}{2007/12/21}{This macro added}
-% \changes{v3.2d}{2011/10/29}{Outsourced to \package{newfloat} package}
-% \changes{v3.2f}{2012/01/12}{Bugfix: Uses \cs{caption@NewFloat} now}
-% |\caption@Within|\marg{float}\marg{value}
-% \begin{macrocode}
-\newcommand*\caption@Within[2]{%
- \caption@NewFloat{\newfloat@setwithin{#1}{#2}}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\caption@NewFloat}
-% \changes{v3.2f}{2012/01/12}{This macro added}
-% \changes{v3.4h}{2020/01/03}{Usage of \cs{caption@ifpackageloaded} replaced by \cs{RequirePackage}}
-% |\caption@NewFloat|\marg{code}
-% loads the \package{newfloat} package and executes the given code afterwards.
-% Note: Since the \package{newfloat} package uses the crappy \package{keyval}
-% package, too, we need to save \& restore some macros here, otherwise this
-% recursion won't work properly.
-% {\itshape (TODO: Re-write \package{newfloat} so it uses \package{kvoptions} instead.)}
-% \begin{macrocode}
-\newcommand*\caption@NewFloat[1]{%
- \let\KV@prefix@ORI\KV@prefix
- \let\@tempc@ORI\@tempc
- \caption@ifdefined\newfloatsetup{}{\RequirePackage{newfloat}}%
- #1%
- \let\@tempc\@tempc@ORI
- \let\KV@prefix\KV@prefix@ORI}
-% \end{macrocode}
-% \end{macro}
-%
% \subsection{Miscellaneous options}
%
% \begin{macrocode}
@@ -429,36 +335,105 @@
\captionsetup{list-entry=default}
% \end{macrocode}
%
+% \begin{macro}{\caption@declparboxrestore}
+% \changes{v3.5g}{2020/10/26}{This macro added}
+% |\caption@declparboxrestore|\marg{name}\marg{code}
+% \begin{macrocode}
+% TODO: Remove \caption@declparboxrestore
+\newcommand\caption@declparboxrestore{%
+ \caption@decl{parboxrestore}}
+% \end{macrocode}
+% \begin{macrocode}
+\@onlypreamble\caption@declparboxrestore
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\caption@setparboxrestore}
% \changes{v3.2}{2010/11/07}{This macro added}
+% \changes{v3.5g}{2020/10/26}{New implementation; default changed from `partial' to `full'}
% |\caption@setparboxrestore|\marg{\purett{partial} or \purett{full}}
% \begin{macrocode}
-\newcommand*\caption@setparboxrestore[1]{%
- \caption@ifinlist{#1}{full}{%
- \caption@setfullparboxrestore
- }{\caption@ifinlist{#1}{default,light,partial}{%
- \let\caption@parboxrestore\@secondoftwo
- }{%
- \caption@Error{Undefined parboxrestore `#1'}%
- }}}
+% TODO: Remove \caption@setparboxrestore
+\newcommand*\caption@setparboxrestore{%
+ \caption@set{parboxrestore}}
+% \end{macrocode}
+% \begin{macrocode}
+\caption@declparboxrestore{full}{%
+ \@parboxrestore}
+% \end{macrocode}
+% The original code (from |latex/base/ltboxes.dtx|):
+% \begin{verbatim}
+% \def\@parboxrestore{\@arrayparboxrestore\let\\\@normalcr}
+% \def\@arrayparboxrestore{%
+% \let\if@nobreak\iffalse
+% \let\if@noskipsec\iffalse
+% \let\par\@@par
+% \let\-\@dischyph
+% \let\'\@acci\let\`\@accii\let\=\@acciii
+% \parindent\z@ \parskip\z@skip
+% \everypar{}%
+% \linewidth\hsize
+% \@totalleftmargin\z@
+% \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip
+% \parfillskip\@flushglue \lineskip\normallineskip
+% \baselineskip\normalbaselineskip
+% \sloppy}
+% \end{verbatim}%^^A
+% This one will be used by |\@caption| instead of |\@parboxrestore|.
+% \begin{macrocode}
+\caption@declparboxrestore{partial}{%
+ \let\if@nobreak\iffalse
+ \let\if@noskipsec\iffalse
+ \let\par\@@par
+% \let\-\@dischyph
+% \let\'\@acci\let\`\@accii\let\=\@acciii
+ \parindent\z@ \parskip\z@skip
+ \everypar{}%
+% \linewidth\hsize
+% \@totalleftmargin\z@
+ \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip
+ \parfillskip\@flushglue \lineskip\normallineskip
+ \baselineskip\normalbaselineskip
+ \sloppy
+ \let\\\@normalcr}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\caption@setfullparboxrestore}
-% \changes{v3.2}{2010/11/07}{This macro added}
-% |\caption@setfullparboxrestore|\par
-% This is an abbreviation for |\caption@setparboxrestore{full}|.
+% \begin{macro}{\caption@parboxrestore@mini}
+% \changes{v3.2}{2010/10/24}{This macro added}
+% \changes{v3.5g}{2020/10/26}{Renamed from \cs{caption@boxrestore@mini} to \cs{caption@parboxrestore@mini}}
+% Resets |\par| so the very first |\par| in |\@caption| behaves quite the same as in floating environments.
+% Will be used by |\set|\-|caption|\-|type|.
% \begin{macrocode}
-\newcommand*\caption@setfullparboxrestore{%
- \let\caption@parboxrestore\@firstoftwo}
+\caption@declparboxrestore{mini}{%
+ \let\par\@@par
+ \parindent\z@ \parskip\z@skip
+ \sloppy}
% \end{macrocode}
% \end{macro}
%
+% `default' usually maps to `full'.
+% \changes{v3.5g}{2020/10/26}{The default of \cs{caption@parboxrestore} maps to `full' instead of `partial' now}
+% \begin{macrocode}
+\SetCaptionDefault{parboxrestore}{full}
+% \end{macrocode}
+%
% \changes{v3.2}{2010/11/07}{Option \opt{parboxrestore} added}
% \begin{macrocode}
+% TODO: Remove the (undocumentated) option "parboxrestore"
\DeclareCaptionOption{parboxrestore}{\caption@setparboxrestore{#1}}
+% \end{macrocode}
+%
+% \begin{macro}{\caption@parboxrestore}
+% \changes{v3.1}{2007/03/03}{This macro and its usage added}
+% \changes{v3.1b}{2007/09/17}{Bugfix: Redefinition of CR added}
+% \changes{v3.2}{2010/11/07}{Support of option \opt{parboxrestore} added}
+% \changes{v3.5g}{2020/10/26}{New implementation; renamed from \cs{caption@boxrestore} to \cs{caption@parboxrestore}}
+% \begin{macrocode}
+% TODO: Change definition to \def\caption@parboxrestore{\@parboxrestore}
\captionsetup{parboxrestore=default}
% \end{macrocode}
+% \end{macro}
%
% \changes{v3.1f}{2007/11/28}{Option \opt{@minipage=} added}
% \begin{macrocode}
@@ -473,6 +448,7 @@
% \changes{v3.1}{2007/07/21}{Option `compatibility' added}
% \changes{v3.1}{2007/09/01}{caption v1.x compatibility options revised}
% \changes{v3.1d}{2007/10/24}{Bugfix 07-10-24 in caption v1.x$ compatibility options}
+% \changes{v3.5a}{2020/09/02}{caption v1.x compatibility options fixed}
%
% Currently we support |v1| and |v3| as values for the |compatibility=| option.
% But since this used to be a boolean option is the past we still support any boolean value
@@ -523,20 +499,15 @@
%
% \begin{macrocode}
\DeclareCaptionOptionNoValue*{normal}{%
- \caption@setformat{plain}%
- \caption@setjustification{justified}}
+ \caption@setup{format=plain,justification=justified}}
\DeclareCaptionOptionNoValue*{isu}{%
- \caption@setformat{hang}%
- \caption@setjustification{justified}}
+ \caption@setup{format=hang,justification=justified}}
\DeclareCaptionOptionNoValue*{hang}{%
- \caption@setformat{hang}%
- \caption@setjustification{justified}}
+ \caption@setup{format=hang,justification=justified}}
\DeclareCaptionOptionNoValue*{center}{%
- \caption@setformat{plain}%
- \caption@setjustification{centering}}
+ \caption@setup{format=plain,justification=centering}}
\DeclareCaptionOptionNoValue*{centerlast}{%
- \caption@setformat{plain}%
- \caption@setjustification{centerlast}}
+ \caption@setup{format=plain,justification=centerlast}}
% \end{macrocode}
%
% \begin{macrocode}
@@ -549,19 +520,19 @@
% \end{macrocode}
%
% \begin{macrocode}
-\DeclareCaptionOptionNoValue*{up}{\l@addto@macro\captionlabelfont\upshape}
-\DeclareCaptionOptionNoValue*{it}{\l@addto@macro\captionlabelfont\itshape}
-\DeclareCaptionOptionNoValue*{sl}{\l@addto@macro\captionlabelfont\slshape}
-\DeclareCaptionOptionNoValue*{sc}{\l@addto@macro\captionlabelfont\scshape}
-\DeclareCaptionOptionNoValue*{md}{\l@addto@macro\captionlabelfont\mdseries}
-\DeclareCaptionOptionNoValue*{bf}{\l@addto@macro\captionlabelfont\bfseries}
-\DeclareCaptionOptionNoValue*{rm}{\l@addto@macro\captionlabelfont\rmfamily}
-\DeclareCaptionOptionNoValue*{sf}{\l@addto@macro\captionlabelfont\sffamily}
-\DeclareCaptionOptionNoValue*{tt}{\l@addto@macro\captionlabelfont\ttfamily}
+\DeclareCaptionOptionNoValue*{up}{\caption@setup{labelfont+=up}}
+\DeclareCaptionOptionNoValue*{it}{\caption@setup{labelfont+=it}}
+\DeclareCaptionOptionNoValue*{sl}{\caption@setup{labelfont+=sl}}
+\DeclareCaptionOptionNoValue*{sc}{\caption@setup{labelfont+=sc}}
+\DeclareCaptionOptionNoValue*{md}{\caption@setup{labelfont+=md}}
+\DeclareCaptionOptionNoValue*{bf}{\caption@setup{labelfont+=bf}}
+\DeclareCaptionOptionNoValue*{rm}{\caption@setup{labelfont+=rm}}
+\DeclareCaptionOptionNoValue*{sf}{\caption@setup{labelfont+=sf}}
+\DeclareCaptionOptionNoValue*{tt}{\caption@setup{labelfont+=tt}}
% \end{macrocode}
%
% \begin{macrocode}
-\DeclareCaptionOptionNoValue*{nooneline}{\caption@setbool{slc}{0}}
+\DeclareCaptionOptionNoValue*{nooneline}{\caption@setup{slc=0}}
% \end{macrocode}
%
% \begin{macrocode}
@@ -573,17 +544,16 @@
% \changes{v3.0h}{2005/07/08}{caption2 \version{2.x} compatibility options added}
% \changes{v3.1}{2007/09/01}{caption2 v2.x compatibility options revised}
% \changes{v3.1d}{2007/10/24}{Bugfix 07-10-24 in caption v2.x$ compatibility options}
+% \changes{v3.5a}{2020/09/02}{caption v2.x compatibility options fixed}
%
% \begin{macrocode}
\DeclareCaptionOptionNoValue*{flushleft}{%
- \caption@setformat{plain}%
- \caption@setjustification{raggedright}}
+ \caption@setup{format=plain,justification=raggedright}}
\DeclareCaptionOptionNoValue*{flushright}{%
- \caption@setformat{plain}%
- \caption@setjustification{raggedleft}}
+ \caption@setup{format=plain,justification=raggedleft}}
% \end{macrocode}
% \begin{macrocode}
-\DeclareCaptionOptionNoValue*{oneline}{\caption@setbool{slc}{1}}
+\DeclareCaptionOptionNoValue*{oneline}{\caption@setup{slc=1}}
% \end{macrocode}
% \begin{macrocode}
\DeclareCaptionOptionNoValue*{ignoreLTcapwidth}{%
@@ -640,223 +610,24 @@
\captionsetup{hypcap=1,hypcapspace=.5\baselineskip}
% \end{macrocode}
%
-% \section{\AmS{} \& \SmF{} document classes support}
-% \changes{v3.1}{2007/07/29}{\AmS\ \& \SmF\ document classes support added}
-%
-% \begin{macrocode}
-\caption@ifclassloaded{ams}{%
- \caption@InfoNoLine{AMS or SMF document class}%
-% \end{macrocode}
-% \begin{macrocode}
- \setlength\belowcaptionskip{0pt}% set to 12pt by AMS class
-% \end{macrocode}
-% \begin{macrocode}
-}{}
-% \end{macrocode}
-%
-% \section{\KOMAScript{} document classes support}
-% \changes{v3.0a}{2004/01/18}{Minimum adaptation to \KOMAScript\ added}
-% \changes{v3.0h}{2005/08/22}{\KOMAScript\ compatibility options added}
-% \changes{v3.0i}{2005/11/17}{\KOMAScript\ compatibility commands added}
-% \changes{v3.0l}{2007/02/18}{\KOMAScript\ compatibility revised}
-% \changes{v3.1}{2007/03/17}{\KOMAScript\ compatibility options removed}
-% \changes{v3.1}{2007/04/05}{\KOMAScript\ compatibility revised \& enhanced}
-%
-% \begin{macrocode}
-\caption@ifclassloaded{koma}{%
- \caption@InfoNoLine{KOMA-Script document class}%
-% \end{macrocode}
-%
-% Here we emulate the caption related commands and take over the caption
-% related settings from the \KOMAScript\ classes.
-%
-% \begin{macro}{\@tablecaptionabovetrue}
-% \begin{macro}{\@tablecaptionabovefalse}
-% \changes{v3.1g}{2008/03/01}{\cs{def} changed to \cs{g@addto@macro}}
-% \begin{macrocode}
- \g@addto@macro\@tablecaptionabovetrue{\captionsetup*[table]{position=t}}
- \g@addto@macro\@tablecaptionabovefalse{\captionsetup*[table]{position=b}}
-% \end{macrocode}
-% \begin{macrocode}
- \if@tablecaptionabove
- \@tablecaptionabovetrue
- \else
- \@tablecaptionabovefalse
- \fi
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@figurecaptionabovetrue}
-% \begin{macro}{\@figurecaptionabovefalse}
-% \changes{v3.3}{2013/02/15}{Support of \cs{@figurecaptionabovetrue} added}
-% \begin{macrocode}
- \caption@ifdefined\@figurecaptionabovetrue{%
-% \end{macrocode}
-% \begin{macrocode}
- \g@addto@macro\@figurecaptionabovetrue{\captionsetup*[figure]{position=t}}
- \g@addto@macro\@figurecaptionabovefalse{\captionsetup*[figure]{position=b}}
-% \end{macrocode}
-% \begin{macrocode}
- \if@figurecaptionabove
- \@figurecaptionabovetrue
- \else
- \@figurecaptionabovefalse
- \fi
-% \end{macrocode}
-% \begin{macrocode}
- }{}%
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\onelinecaptionstrue}
-% \begin{macro}{\onelinecaptionsfalse}
-% \changes{v3.1g}{2008/03/01}{\cs{def} changed to \cs{g@addto@macro}}
-% \begin{macrocode}
- \g@addto@macro\onelinecaptionstrue{\let\caption@ifslc\@firstoftwo}
- \g@addto@macro\onelinecaptionsfalse{\let\caption@ifslc\@secondoftwo}
-% \end{macrocode}
-% \begin{macrocode}
- \ifonelinecaptions
- \onelinecaptionstrue
- \else
- \onelinecaptionsfalse
- \fi
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@captionabovetrue}
-% \begin{macro}{\@captionabovefalse}
-% \changes{v3.0j}{2006/03/21}{Bugfix 06-03-21:
-% \cs{let}\cs{caption@setposition}\cs{@gobble} added}
-% \changes{v3.0n}{2006/03/09}{Accidentally this got broken in \version{3.0m}, fixed}
-% \changes{v3.1}{2007/03/31}{We redefine \cs{captionabovetrue/false} now
-% instead of \cs{captionabove/below}}
-% \changes{v3.1g}{2008/03/01}{\cs{def} changed to \cs{g@addto@macro}}
-% \changes{v3.1k}{2009/10/09}{\opt{figureposition} and \opt{tableposition} will issue a warning now}
-% \changes{v3.4}{2019/09/11}{\opt{figureposition} and \opt{tableposition} will now set the position anyway since it could be used by other packages}
-% Please note that these are stronger than the \opt{position} setting, therefore we
-% override the options \opt{figureposition} and \opt{tableposition} to typeout a warning.
-% \begin{macrocode}
- \g@addto@macro\@captionabovetrue{\let\caption@position\@firstoftwo}
- \g@addto@macro\@captionabovefalse{\let\caption@position\@secondoftwo}
-% \end{macrocode}
-% \begin{macrocode}
- \DeclareCaptionOption{figureposition}{%
- \caption@WarningNoLine{Option `figureposition=#1' has no effect\MessageBreak
- when used with a KOMA script document class}%
- \captionsetup*[figure]{position=#1}}
- \DeclareCaptionOption{tableposition}{%
- \caption@WarningNoLine{Option `tableposition=#1' has no effect\MessageBreak
- when used with a KOMA script document class}%
- \captionsetup*[table]{position=#1}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\setcapindent}
-% \begin{macrocode}
- \let\caption@KOMA@setcapindent\@setcapindent
- \renewcommand*\@setcapindent[1]{%
- \caption@KOMA@setcapindent{#1}\caption@setcapindent}
-% \end{macrocode}
-% \begin{macrocode}
- \let\caption@KOMA@@setcapindent\@@setcapindent
- \renewcommand*\@@setcapindent[1]{%
- \caption@KOMA@@setcapindent{#1}\caption@setcapindent}
-% \end{macrocode}
-% \begin{macrocode}
- \newcommand*\caption@setcapindent{%
- \captionsetup{indent=\ifdim\cap@indent<\z@\z@\else\cap@indent\fi}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
- \caption@ifdefined\cap@indent{\caption@setcapindent}{}
-% \end{macrocode}
-%
-% \begin{macro}{\setcapwidth}
-% \changes{v3.3}{2018/12/26}{Bugfix: Missing curly braces added}
-% \Note{The optional argument of \cs{setcapwidth} if not supported (yet),
-% so we issue a warning if used.
-% (Since this does not seem to have an negative effect when used
-% by the \texttt{captionbeside} environment, we suppress the warning here.)}
-% \begin{macrocode}
- \expandafter\let\expandafter\caption@KOMA@setcapwidth
- \csname\string\setcapwidth\endcsname
- \@namedef{\string\setcapwidth}[#1]#2{%
- \caption@KOMA@setcapwidth[{#1}]{#2}\caption@setcapwidth{#1}}
-% \end{macrocode}
-% \begin{macrocode}
- \newcommand*\caption@setcapwidth[1]{%
- \ifx\\#1\\\else
- \caption@ifdefined\cap@margin{%
- \def\@tempa{captionbeside}%
- \ifx\@tempa\@currenvir\else\caption@Warning{%
- Ignoring optional argument [#1] of \string\setcapwidth\MessageBreak}%
- \fi}{}%
- \fi
- \captionsetup{width=\cap@width}}
-% \end{macrocode}
-% \end{macro}
+% \section{Document class support}
%
-% \begin{macrocode}
- \def\caption@tempa{\hsize}%
- \ifx\caption@tempa\cap@width \else
- \caption@setcapwidth{?}
- \fi
-% \end{macrocode}
+% Execute the code declared with |\At|\-|Caption|\-|Package|.
+% We do this right before processing the options so stuff done with
+% |\At|\-|Caption|\-|Package| could be overwritten by user options.
%
-% \begin{macro}{\setcapmargin}
-% \begin{macrocode}
- \expandafter\let\expandafter\caption@KOMA@setcapmargin
- \csname\string\@setcapmargin\endcsname
- \@namedef{\string\@setcapmargin}[#1]#2{%
- \caption@KOMA@setcapmargin[{#1}]{#2}\caption@setcapmargin}
-% \end{macrocode}
% \begin{macrocode}
- \expandafter\let\expandafter\caption@KOMA@@setcapmargin
- \csname\string\@@setcapmargin\endcsname
- \@namedef{\string\@@setcapmargin}[#1]#2{%
- \caption@KOMA@@setcapmargin[{#1}]{#2}\caption@setcapmargin}
-% \end{macrocode}
-% \begin{macrocode}
- \newcommand*\caption@setcapmargin{%
- \begingroup
- \let\onelinecaptionsfalse\relax
- \def\@twoside{0}%
- \def\if@twoside{\def\@twoside{1}\iffalse}%
- \cap@margin
- \def\@tempa{\endgroup}%
- \ifx\cap@left\hfill\else\ifx\cap@right\hfill\else
- \def\hspace##1##{\@firstofone}%
- \edef\@tempa{\endgroup
- \noexpand\captionsetup{%
- twoside=\@twoside,slc=0,%
- margin={\cap@left,\cap@right}}}%
- \fi\fi
- \@tempa}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
- \ifx\cap@margin\relax \else
- \caption@setcapmargin
- \fi
-% \end{macrocode}
-%
-% \begin{macrocode}
-}{}
+\caption@documentclass@code
+\let\caption@documentclass@code\@undefined
+\let\AtCaptionPackage\@firstofone
% \end{macrocode}
%
% \section{Processing of options}
%
% \changes{v3.0m}{2007/03/04}{Verbose option added}
% \changes{v3.1}{2007/07/02}{Verbose option removed from package}
-%
% \changes{v3.1}{2007/03/17}{We do not process global options anymore}
+%
% \begin{macrocode}
\caption@SetupOptions{caption}{\caption@setkeys{#1}{#2}}
\caption@ProcessOptions*{caption}
@@ -966,14 +737,10 @@
% \changes{v3.2f}{2012/01/14}{Usage of \cs{M@gettitle} moved to \cs{caption@prepareanchor}}
% \changes{v3.3}{2013/01/06}{Adapted to the \textsf{nag} package}
% As above, our version has been adapted to the packages we support.
-% Additionally our code is nested by |\caption@beginex| \&
-% |\caption@end| instead of |\begingroup| \& |\endgroup|.
-% Furthermore we use |\caption@boxrestore| instead of |\@parboxrestore|
-% so this code also works correctly inside list-based environments
-% like |wide| \& |addmargin|. (This, and the fact that we use
-% |\linewidth| instead of |\hsize| inside |\@makecaption|, solves
-% \href{http://www.latex-project.org/cgi-bin/ltxbugs2html?pr=latex/2472}%^^A
-% {\LaTeX\ PR \texttt{latex/2472}}.)
+% Additionally our code is nested by |\caption@begin|\-|ex| \&
+% |\caption@end| instead of |\begin|\-|group| \& |\end|\-|group|.
+% Furthermore we use |\caption@par|\-|box|\-|restore| instead of
+% |\@parbox|\-|restore|.
% \begin{macrocode}
\long\def\caption@@caption#1[#2]#3{%
% \end{macrocode}
@@ -988,7 +755,7 @@
\par
\caption@beginex{#1}{#2}{#3}%
\caption@setfloatcapt{%
- \caption@boxrestore
+ \caption@parboxrestore
\if@minipage
\@setminipage
\fi
@@ -1001,9 +768,8 @@
\caption@if@minipage\@minipagetrue\@minipagefalse}%
\caption@end}
% \end{macrocode}
-% \textsf{memoir} document class stuff:
+% \class{memoir} document class stuff:
% \begin{macrocode}
-\providecommand\M@gettitle[1]{}
\providecommand\memcaptioninfo[4]{}
% \end{macrocode}
% \end{macro}
@@ -1017,6 +783,10 @@
\caption@ifhypcap\caption@@start\relax
\M@gettitle{#2}}
% \end{macrocode}
+% \class{memoir} document class stuff:
+% \begin{macrocode}
+\providecommand\M@gettitle[1]{}
+% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@makecaption}
@@ -1055,25 +825,13 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\caption@aboveskip}
-% \begin{macro}{\caption@belowskip}
-% \changes{v3.3a}{2019/04/02}{This macro added}
-% |\caption@aboveskip|\\
-% |\caption@belowskip|\par
-% Typesets the skip above resp.~below the caption.
-% \begin{macrocode}
-\newcommand*\caption@aboveskip{%
- \vskip\abovecaptionskip}
-% \end{macrocode}
+% \begin{macro}{\caption@redefine}
+% \changes{v3.1k}{2009/03/30}{This macro added, it contains the patching code now}
% \begin{macrocode}
-\newcommand*\caption@belowskip{%
- \vskip\belowcaptionskip}
+\newcommand*\caption@redefine{}
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\caption@redefine}
-% \changes{v3.1k}{2009/03/30}{This macro added, it contains the patching code now}
% Prior to \version{3.4} we only redefined |\caption| and |\@caption| if the current definitions
% were well known, so documents written in the old (\package{caption} package \version{1.x}) days
% (where |\caption| \& |\@caption| were not redefined by us) still compiled fine.
@@ -1081,8 +839,8 @@
% but is simply overcautious and especially unwanted by the user nowadays.
% So starting with \version{3.4} we only do not redefine |\caption| and |\@caption| if the
% `compatibility' option is set to `v1'.
+%
% \begin{macrocode}
-\newcommand*\caption@redefine{}
\g@addto@macro\caption@redefine{%
% \end{macrocode}
% \begin{macrocode}
@@ -1096,13 +854,13 @@
\renewcommand*\caption@redefine{}%
% \end{macrocode}
%
-% |\continuedfloat| is not supported in compatibility mode.
+% |\continuedfloat| is not supported in compatibility mode `v1'.
% \begin{macrocode}
\renewcommand*\caption@continuedfloat[1]{%
- \caption@Error{Not available in compatibility mode}}%
+ \caption@Error{Not available with option `compatibility=v1'}}%
% \end{macrocode}
%
-% |\caption@start| is not supported in compatibility mode.
+% |\caption@start| is not supported in compatibility mode `v1'.
% \begin{macrocode}
\caption@AtBeginDocument*{%
\let\caption@start\relax
@@ -1146,22 +904,50 @@
% \begin{macro}{\@xfloat}
% \changes{v3.1}{2007/05/09}{This re-definition added}
% \changes{v3.1b}{2007/09/22}{Will now be redefined in compatibility mode, too}
-% We redefine |\@xfloat| so inside floating environments our
-% type-specific options will be used, a \package{hyperref}
-% anchor will be set etc.
+% \changes{v3.5}{2020/08/30}{Hook added}
+% We redefine |\@x|\-|float| so inside floating environments our
+% type-specific options will be used, a \package{hyperref}
+% anchor will be set etc.
% \begin{macrocode}
\let\caption@ORI@xfloat\@xfloat
+% \end{macrocode}
+% \begin{macrocode}
\def\@xfloat#1[#2]{%
\caption@ORI@xfloat{#1}[#2]%
- \caption@settype{#1}}%
+ \caption@settype{#1}%
+ \caption@xfloat@hook}%
+% \end{macrocode}
+% Hook, could be extended with |\g@addto@macro\caption@x|\-|float@hook{|\ldots|}|.
+% (The caption type could be found in |\@cap|\-|type|.)
+% \begin{macrocode}
+ \newcommand*\caption@xfloat@hook{}%
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@xdblfloat}
+% \changes{v3.5}{2020/08/30}{Re-definition of \cs{xdblfloat} added}
+% We redefine |\@xdbl|\-|float|, too, so special options for |figure*|
+% resp.~|table*| will be applied here.
% \begin{macrocode}
-}
+ \let\caption@ORI@xdblfloat\@xdblfloat
+% \end{macrocode}
+% \begin{macrocode}
+ \def\@xdblfloat#1[#2]{%
+ \caption@ORI@xdblfloat{#1}[#2]% expands to \@xfloat{#1}[#2] + extra stuff
+ \caption@setoptions{#1*}%
+ \caption@xdblfloat@hook}%
+% \end{macrocode}
+% Hook, could be extended with |\g@addto@macro\caption@xdbl|\-|float@hook{|\ldots|}|.
+% (The caption type could be found in |\@cap|\-|type|.)
+% \begin{macrocode}
+ \newcommand*\caption@xdblfloat@hook{}%
% \end{macrocode}
% \end{macro}
%
+% \begin{macrocode}
+}
+% \end{macrocode}
+%
% Some packages (like the \package{hyperref} package for example) redefines
% |\caption| and |\@caption|, too.
% So we have to use |\AtBeginDocument| here, so we can make sure
@@ -1188,7 +974,7 @@
% \end{macrocode}
% \end{macro}
%
-% \section{\cs{captionof}}
+% \section{\cs{setcaptiontype} and \cs{setcaptionsubtype}}
%
% \changes{v3.0d}{2004/08/03}{Option \opt{type=} added}
% \changes{v3.1}{2007/06/25}{Option \opt{type*=} added}
@@ -1218,16 +1004,18 @@
% \begin{macro}{\setcaptiontype}
% \changes{v3.2}{2010/10/24}{This macro added}
% \changes{v3.4e}{2020/01/02}{Check added if the subtype is defined}
-% Like |\captionsetup{type=xxx}|, but also works if \cs{captionsetup} was redefined.
+% \changes{v3.5}{2020/08/24}{Definition method adapted to the \package{caption-light} package}
+% Like |\captionsetup{type=xxx}|, but also works if |\caption|\-|setup| was redefined.
% \begin{macrocode}
-\newcommand\setcaptiontype{%
- \caption@boxrestore@mini
+\def\setcaptiontype{%
+ \caption@parboxrestore@mini
\caption@settype}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setcaptionsubtype}
% \changes{v3.2a}{2011/08/15}{This macro added}
+% \changes{v3.5d}{2020/09/28}{This macro revised}
% Same, but sets the sub-type.
% \begin{macrocode}
\newcommand\setcaptionsubtype{%
@@ -1237,9 +1025,11 @@
% \end{macrocode}
% \begin{macrocode}
\newcommand\caption@setsubtype{%
- \@ifstar
- {\caption@@settype{sub}*{sub\@captype}}%
- {\caption@@settype{sub}{sub\@captype}}}%
+ \caption@teststar\caption@@setsubtype\@firstoftwo\@secondoftwo}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@@setsubtype[1]{%
+ \caption@@@settype{sub}{#1}{sub\@captype}}
% \end{macrocode}
% \end{macro}
%
@@ -1253,6 +1043,7 @@
% \changes{v3.2}{2010/10/26}{Error message moved from here to \cs{caption@refstepcounter}}
% \changes{v3.3}{2011/12/28}{Resetting of \cs{ifcaption@caption} and \cs{ifcaption@subcaption} added}
% \changes{v3.4e}{2020/01/02}{Checks added to prevent misuse regading subtypes}
+% \changes{v3.5d}{2020/09/28}{This macro revised}
% |\caption@settype*|\marg{type}\par
% sets |\@captype| and executes the options associated with it
% (using |\caption@set|\-|options|).
@@ -1270,17 +1061,17 @@
% \end{macrocode}
% \begin{macrocode}
\newcommand*\caption@set@type{%
- \caption@@settype{}}
+ \caption@teststar\caption@@settype\@firstoftwo\@secondoftwo}
% \end{macrocode}
% \begin{macrocode}
-\newcommand*\caption@@settype[1]{%
- \caption@teststar{\caption@@@settype{#1}}\@firstoftwo\@secondoftwo}
+\newcommand*\caption@@settype{%
+ \caption@@@settype{}}
% \end{macrocode}
% \begin{macrocode}
\newcommand*\caption@@@settype[3]{%
% #1 = "" or "sub"
% #2 = \@firstoftwo in star form, \@secondoftwo otherwise
-% #3 = <type>, e.g. "figure" or "subfigure"
+% #3 = <type>, e.g.: "figure" or "subfigure"
\caption@Debug{#1type=#3}%
\@nameuse{caption@check#1type}{#3}%
{\caption@checkgrouplevel{#1}{%
@@ -1330,21 +1121,43 @@
%
% \begin{macro}{\caption@checktype}
% \changes{v3.4g}{2020/01/02}{This macro and its usage added}
-% |\setcaptiontype| should not be used with a subtype,
-% and |\setcaptionsubtype| should not be used with an undefined subtype.
+% \changes{v3.4m}{2020/07/29}{Check of \cs{sf@counterlist} from \package{subfig} package added}
+% |\caption@checktype|\marg{type}\marg{code}\par
+% is used by |\caption@settype| and should either expand the code or issue an error
+% if the given type is not a proper type, i.e. it is a sub-type instead (either defined by
+% |\DeclareCaptionSubType| or |\newsubfloat|\cite{subfig}).
% \begin{macrocode}
\newcommand*\caption@checktype[1]{%
- \caption@ifsubtype{#1}%
- {\caption@Error{Should not be used with subtype `#1'}%
- \@gobble}%
- \@firstofone}
+ \caption@ifsubtype{#1}\@firstoftwo{\caption@ifin@list\sf@counterlist{#1}}%
+ {\caption@Error{Should not be used with subtype `#1'}%
+ \@gobble}%
+ \@firstofone}
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@checksubtype}
+% \changes{v3.4g}{2020/01/02}{This macro and its usage added}
+% \changes{v3.4m}{2020/07/29}{Check of \cs{sf@counterlist} from \package{subfig} package added}
+% |\caption@checksubtype|\marg{type}\marg{code}\par
+% is used by |\caption@settype| and should either expand the code or issue an error
+% if the given type is not a proper sub-type, i.e. not defined by |\Declare|\-|Caption|\-|Sub|\-|Type|.
+% Since the |sub|\-|float|\-|row| environment offered by the \package{floatrow} package\cite{floatrow}
+% is using |\caption|\-|setup{sub|\-|type}| even if the sub-type was defined by |\new|\-|sub|\-|float|
+% offered by \package{subfig}\cite{subfig}, we take a more relaxed view of things here and allow
+% those sub-types as well (but not without warning since we do not support this).
% \begin{macrocode}
\newcommand*\caption@checksubtype[1]{%
\caption@ifsubtype{#1}%
- \@firstofone
- {\caption@Error{Undefined subtype `#1'}%
- \@gobble}}
+ \@firstofone
+ {\caption@ifin@list\sf@counterlist{#1}%
+ {\caption@Warning{%
+ \noexpand\setcaptionsubtype without \string\DeclareCaptionSubType.\MessageBreak
+ This is not designed to work; you could try replacing\MessageBreak
+ the `subfig' package with `subcaption' to resolve\MessageBreak
+ this problem which occurred}%
+ \@firstofone}%
+ {\caption@Error{Undefined subtype `#1'}%
+ \@gobble}}}
% \end{macrocode}
% \end{macro}
%
@@ -1352,24 +1165,21 @@
% \changes{v3.1}{2007/07/15}{This macro and its usage added}
% \changes{v3.1f}{2007/11/28}{Error changed to warning (compatibility)}
% \changes{v3.3}{2013/04/21}{Uses \cs{caption@ifeTeX} now}
+% \changes{v3.5}{2019/09/11}{Relies on \eTeX{} now}
% Checks if |\captionsetup{type=|\ldots|}| or |\caption| is done
% inside a group or not -- in the latter case a warning message will
-% be issued. (needs \eTeX)
-% \begin{macrocode}
-\caption@ifeTeX{%
- \newcommand*\caption@checkgrouplevel[2]{%
- \@ifundefined{#1caption@grouplevel}{%
- \caption@ifundefined\caption@grouplevel{\let\caption@grouplevel\z@}{}%
- \ifnum\currentgrouplevel>\caption@grouplevel\relax
- \expandafter\edef\csname #1caption@grouplevel\endcsname{%
- \the\currentgrouplevel}%
- \else
- \caption@Warning{\string#2\MessageBreak outside box or environment}%
- \fi
- }{}}%
-}{%
- \let\caption@checkgrouplevel\@gobbletwo
-}
+% be issued.
+% \begin{macrocode}
+\newcommand*\caption@checkgrouplevel[2]{%
+ \@ifundefined{#1caption@grouplevel}{%
+ \caption@ifundefined\caption@grouplevel{\let\caption@grouplevel\z@}{}%
+ \ifnum\currentgrouplevel>\caption@grouplevel\relax
+ \expandafter\edef\csname #1caption@grouplevel\endcsname{%
+ \the\currentgrouplevel}%
+ \else
+ \caption@Warning{\string#2\MessageBreak outside box or environment}%
+ \fi
+ }{}}%
% \end{macrocode}
% \end{macro}
%
@@ -1431,6 +1241,7 @@
% \changes{v3.1c}{2007/09/22}{Bugfix: Redefinition of \cs{caption@setfloatcapt} removed}
% \changes{v3.1e}{2007/10/30}{Better compatibility: Will be defined with \cs{AtBeginDocument} now}
% \changes{v3.2}{2010/10/24}{Bugfix 10-10-17: Uses \cs{setcaptiontype} instead of \cs{caption@settype} now}
+% \changes{v3.5}{2020/08/24}{Definition method adapted to the \package{caption-light} package}
% |\captionof|\marg{type}\oarg{lst\_entry}\marg{heading}\\
% |\captionof*|\oarg{lst\_entry}\marg{heading}\par
% \Note{This will be defined with \cs{AtBeginDocument} so
@@ -1441,7 +1252,7 @@
\def\captionof{\caption@teststar\caption@of{\caption*}\caption}}
% \end{macrocode}
% \begin{macrocode}
-\newcommand*\caption@of[2]{\setcaptiontype*{#2}#1}
+\providecommand*\caption@of[2]{\setcaptiontype*{#2}#1}
% \end{macrocode}
% \end{macro}
%
@@ -1481,6 +1292,7 @@
% \changes{v3.3}{2012/04/09}{Adapted to revised version of \cs{caption@withoptargs}}
% \changes{v3.3}{2017/03/19}{When used with fixed witdh the content will not be hboxed anymore}
% \changes{v3.3c}{2019/09/01}{Adapted so it could be used by \cs{subfloat} offered by \package{subcaption}}
+% \changes{v3.5}{2020/07/28}{Adapted to \package{caption3} v2.0}
% A |\parbox| with contents and caption, separated by an invisible |\hrule|.
% \begin{macrocode}
\newcommand*\captionbox{%
@@ -1494,12 +1306,12 @@
% \end{macrocode}
% \begin{macrocode}
\long\def\caption@iibox#1#2#3[#4]{%
- \@testopt{\caption@iiibox{#1}{#2}{#3}[{#4}]}\captionbox@hj@default}
+ \@testopt{\caption@iiibox{#1}{#2}{#3}[{#4}]}\captionbox@innerpos@default}
% \end{macrocode}
% \begin{macrocode}
\long\def\caption@iibox@#1#2#3#4{%
\setbox\@tempboxa\hbox{#4}%
- \caption@iiibox{#1}{#2}{#3}[\wd\@tempboxa][\captionbox@hj@default]{\unhbox\@tempboxa}}
+ \caption@iiibox{#1}{#2}{#3}[\wd\@tempboxa][\captionbox@innerpos@default]{\unhbox\@tempboxa}}
% \end{macrocode}
% \begin{macrocode}
\long\def\caption@iiibox#1{%
@@ -1516,28 +1328,28 @@
\caption@setposition t%
#2{\caption#4{#5}}%
\captionbox@hrule
- \csname caption@hj@#7\endcsname
+ \csname caption@justification@#7\endcsname
#8}%
}{%
\endgroup
\parbox[b]{#6}{%
#1\relax
\caption@setposition b%
- \csname caption@hj@#7\endcsname
+ \csname caption@justification@#7\endcsname
#8%
\captionbox@hrule
#3{\caption#4{#5}}}%
}}
% \end{macrocode}
% \begin{macrocode}
-\newcommand*\captionbox@hj@default{c}
+\newcommand*\captionbox@innerpos@default{c}
\newcommand*\captionbox@hrule{\hrule\@height\z@\relax}
% \end{macrocode}
% \begin{macrocode}
-\providecommand*\caption@hj@c{\centering}
-\providecommand*\caption@hj@l{\raggedright}
-\providecommand*\caption@hj@r{\raggedleft}
-\providecommand*\caption@hj@s{}
+\providecommand*\caption@justification@c{\centering}
+\providecommand*\caption@justification@l{\raggedright}
+\providecommand*\caption@justification@r{\raggedleft}
+\providecommand*\caption@justification@s{}
% \end{macrocode}
% \end{macro}
%
@@ -1554,6 +1366,7 @@
% \changes{v3.3}{2013/05/01}{Usage of \cs{caption@restorecounters} added}
% \changes{v3.3}{2013/12/16}{Bugfix: Does not use \cs{caption@ContinuedFloat} anymore since this breaks \cs{ContinuedFloat} offered by the \package{subfig} package}
% \changes{v3.4}{2015/09/16}{Renamed from \cs{ContinuedFloat} to \cs{continuedfloat}}
+% \changes{v3.5f}{2020/10/06}{Usage of \cs{caption@restorecounters} removed}
% |\continuedfloat|\\
% |\continuedfloat*|\par
% This mainly sets the appropriate flag, increments the
@@ -1589,7 +1402,6 @@
\newcommand*\caption@continued@float[1]{%
\edef\caption@tempa{#1}%
\ifx\caption@tempa\caption@CFtype
- \caption@restorecounters
\caption@@continuedfloat{#1}%
\else
\caption@Error{Continued `#1' after `\caption@CFtype'}%
@@ -1662,18 +1474,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\donemaincaptionfalse}
-% Since the \class{memoir} document class resets the sub-caption
-% counter at |\@float|, right after |\done|\-|main|\-|caption|\-|false|,
-% we save all sub-caption counters at |\done|\-|main|\-|caption|\-|false|
-% so we can restore them using |\caption@restore|\-|counters|
-% inside |\continued|\-|float|.
-% \begin{macrocode}
-\caption@ifdefined\donemaincaptionfalse{%
- \g@addto@macro\donemaincaptionfalse\caption@savesubcounters}{}
-% \end{macrocode}
-% \end{macro}
-%
% \section{Internal helpers}
%
% \begin{macro}{\caption@refstepcounter}
@@ -1681,6 +1481,7 @@
% \changes{v3.2}{2010/10/26}{Error message moved from \cs{caption@@@settype} to here}
% \changes{v3.2c}{2011/09/04}{Support of \cs{donemaincaptiontrue} from \textsf{memoir} document class added}
% \changes{v3.3}{2011/12/28}{Usage of \cs{ifcaption@caption}, \cs{ifcaption@subcaption}, and \cs{ifcaption@ContinuedFloat} added}
+% \changes{v3.5e}{2020/09/28}{Bugfix in re-definition of \cs{stepcounter}; uses \cs{edef} instead of \cs{def} now}
% Increments the float (i.e. |figure| or |table|) counter,
% resets the continuation counter, and redefines itself to |\@gobble|.
% \begin{macrocode}
@@ -1693,7 +1494,7 @@
% (If |\caption@if|\-|top| is not set, |\caption| is at the bottom of this part,
% therefore ending this part, so we set the flag to |false| in this case.)
% \begin{macrocode}
- \caption@fixposition
+ \caption@fixposition % TODO: Make this independant on the "position" setting
\caption@iftop\caption@setflag\caption@clrflag2% caption
% \end{macrocode}
% This part does not contain content (like sub-figures) yet,
@@ -1714,7 +1515,7 @@
\let\caption@tempa\caption@@refstepcounter
\caption@ifflag2{}{% caption
\caption@ifflag4{% subcaption
-% Counter was already incremented by content, so we suppress \stepcounter{#1} here
+ % Counter was already incremented by content, so we suppress \stepcounter{#1} here
\let\caption@tempa\caption@@refcounter
}{}%
}%
@@ -1725,8 +1526,8 @@
\newcommand*\caption@@refcounter[1]{%
\let\caption@stepcounter@ORI\stepcounter
\def\stepcounter##1{%
- \def\caption@tempa{#1}%
- \def\caption@tempb{##1}%
+ \edef\caption@tempa{#1}%
+ \edef\caption@tempb{##1}%
\ifx\caption@tempa\caption@tempb \else
\caption@stepcounter@ORI{##1}%
\fi}%
@@ -1758,8 +1559,7 @@
%
% \begin{macro}{\caption@dblarg}
% \changes{v3.1}{2007/02/05}{This macro added}
-% \changes{v3.1f}{2007/12/06}{Bugfix 07-12-06: Changed so it works without \cs{kernel@ifnextchar}
-% (which was introduced in \LaTeXe\ 2004/01/23), too}
+% \changes{v3.1f}{2007/12/06}{Bugfix 07-12-06: Changed so it works without \cs{kernel@ifnextchar} (which was introduced in \LaTeXe\ 2004/01/23), too}
% \changes{v3.3}{2012/03/25}{Support of option \opt{list-entry} added}
% A |\relax| was added compared to |\@dblarg| so |\caption{}| will be
% expanded to |\caption[\relax]{}| (and not to |\caption[]{}|).
@@ -1835,93 +1635,31 @@
% \end{macrocode}
% \end{macro}
%
-% \changes{v3.0a}{2004/01/23}{%
-% Internal hooks \cs{caption@@begin} \& \cs{caption@@end} added}
-% \changes{v3.0h}{2005/10/06}{%
-% Internal hooks \cs{caption@@begin} \& \cs{caption@@end} removed}
+% \changes{v3.0a}{2004/01/23}{Internal hooks \cs{caption@@begin} \& \cs{caption@@end} added}
+% \changes{v3.0h}{2005/10/06}{Internal hooks \cs{caption@@begin} \& \cs{caption@@end} removed}
%
% \begin{macro}{\caption@setfnum}
% \changes{v3.1}{2007/03/10}{This macro added}
+% \changes{v3.5}{2020/08/03}{Adapted to \package{caption3} v2.0}
% |\caption@setfnum|\marg{type}\\
-% redefines |\fnum@|\meta{type} according the caption label format
-% set with |labelformat=|. But if |labelformat=default| is set,
-% |\fnum@|\meta{type} will not be overwritten by us.
+% stores the original definition of |\fnum@|\meta{type} in |\caption@fnum@|\meta{type}
+% and re-defines it according the caption label format set with |label|\-|format=|.
% \begin{macrocode}
\newcommand*\caption@setfnum[1]{%
- \@ifundefined{fnum@#1}{\iftrue}{\ifx\caption@lfmt\caption@lfmt@default\else}%
- \@namedef{fnum@#1}{\caption@fnum{#1}}%
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\caption@boxrestore}
-% \changes{v3.1}{2007/03/03}{This macro and its usage added}
-% \changes{v3.1b}{2007/09/17}{Bugfix: Redefinition of CR added}
-% \changes{v3.2}{2010/11/07}{Support of option \opt{parboxrestore} added}
-% The original code (from |latex/base/ltboxes.dtx|):
-% \begin{verbatim}
-% \def\@parboxrestore{\@arrayparboxrestore\let\\\@normalcr}
-% \def\@arrayparboxrestore{%
-% \let\if@nobreak\iffalse
-% \let\if@noskipsec\iffalse
-% \let\par\@@par
-% \let\-\@dischyph
-% \let\'\@acci\let\`\@accii\let\=\@acciii
-% \parindent\z@ \parskip\z@skip
-% \everypar{}%
-% \linewidth\hsize
-% \@totalleftmargin\z@
-% \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip
-% \parfillskip\@flushglue \lineskip\normallineskip
-% \baselineskip\normalbaselineskip
-% \sloppy}
-% \end{verbatim}%^^A
-% This one will be used by |\@caption| instead of |\@parboxrestore|.
-% \begin{macrocode}
-\newcommand*\caption@boxrestore{%
- \caption@parboxrestore{\@parboxrestore}{%
- \let\if@nobreak\iffalse
- \let\if@noskipsec\iffalse
- \let\par\@@par
-% \let\-\@dischyph
-% \let\'\@acci\let\`\@accii\let\=\@acciii
- \parindent\z@ \parskip\z@skip
- \everypar{}%
-% \linewidth\hsize
-% \@totalleftmargin\z@
- \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip
- \parfillskip\@flushglue \lineskip\normallineskip
- \baselineskip\normalbaselineskip
- \sloppy
- \let\\\@normalcr
- }}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\caption@boxrestore@mini}
-% \changes{v3.2}{2010/10/24}{This macro added}
-% Resets \cs{par} so the very first \cs{par} in \cs{@caption} behaves quite the same as in floating environments.
-% Will be used by \cs{setcaptiontype}.
-% \begin{macrocode}
-\newcommand\caption@boxrestore@mini{%
- \let\par\@@par
- \parindent\z@ \parskip\z@skip
- \sloppy}
+ \@ifundefined{caption@fnum@#1}%
+ {\expandafter\let\csname caption@fnum@#1\expandafter\endcsname\csname fnum@#1\endcsname
+ \@namedef{fnum@#1}{\caption@fnum{#1}}}%
+ {}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@normalsize}
% \changes{v3.1}{2007/05/05}{This macro and its usage added}
-% This one will be used by |\@caption| instead of |\normalsize|.\par
-% Its code is equivalent to
-% \begin{quote}
-% |\caption@font{normal}%|
-% \end{quote}
-% but executes faster (since the starred form of |\caption@font|
-% does not use |\setkeys| internally).
+% \changes{v3.5}{2020/07/27}{Adapted to \package{caption3} v2.0}
+% This one will be used by |\@caption| instead of |\normalsize|.
% \begin{macrocode}
\newcommand*\caption@normalsize{%
- \caption@font*{\KV@caption@fnt@normal\@unused}}
+ \caption@font@normal\@unused}
% \end{macrocode}
% \end{macro}
%
@@ -1975,30 +1713,6 @@
% \section{Support for sub-captions}
% \changes{v3.1f}{2007/11/16}{Support for sub-captions added}
%
-% \begin{macro}{\caption@DeclareSubType}
-% |\caption@DeclareSub| initializes the usage of \cs{caption}
-% in sub-floats.
-% \begin{macrocode}
-\def\caption@DeclareSubType sub#1\@nil{%
- \caption@Debug{Initializing subtype for `#1'\@gobble}%
- \@namedef{caption@beginsub#1}{\caption@beginsubfloat{#1}}}
-\@onlypreamble\caption@DeclareSubType
-% \end{macrocode}
-% \end{macro}
-%
-% Initialize the sub-captions defined with \cs{DeclareCaptionSubType}\ldots
-% \begin{macrocode}
-\caption@For*{subtypelist}{\caption@DeclareSubType sub#1\@nil}
-% \end{macrocode}
-%
-% Initialize the sub-captions defined with \cs{newsubfloat}\cite{subfig}\ldots
-% \begin{macrocode}
-\caption@AtBeginDocument*{%
- \caption@ifdefined\sf@counterlist{%
- \@for\sf@temp:=\sf@counterlist\do{%
- \expandafter\caption@DeclareSubType\sf@temp\@nil}}{}}
-% \end{macrocode}
-%
% \begin{macro}{\caption@subtypehook}
% \changes{v3.1g}{2008/03/20}{Redefinition of \cs{caption@setlist} added}
% \changes{v3.1k}{2009/10/09}{Bugfix 09-08-12b: \cs{@makecaption} will now be restored here, too}
@@ -2012,6 +1726,7 @@
% \changes{v3.3}{2013/06/17}{Missing redefinition of \cs{captionlistentry} added}
% \changes{v3.3}{2018/09/06}{Adapted to the \package{chkfloat} package}
% \changes{v3.4f}{2020/01/03}{Redefinition of \cs{@caption} added since it was redefined by the \env{threeparttable} environment}
+% \changes{v3.5}{2020/07/27}{Adapted to \package{caption3} v2.0}
% Hook, will be used inside \cs{caption@setsubtype}.\par
% (Note: If we are inside an |sub|\-|float|\-|row| environment we have to keep
% the |\@make|\-|caption| code of the \package{floatrow} package intact.)
@@ -2042,7 +1757,7 @@
\let\caption@chkfloat\@gobbletwo
% \end{macrocode}
% \begin{macrocode}
- \caption@setbox{none}%
+ \caption@set{box}{none}%
\caption@clearmargin
\caption@iflist{}{\let\caption@setlist\@gobble}%
\caption@setoptions{sub}%
@@ -2086,7 +1801,8 @@
\caption@AtBeginDocument{%
\caption@ifundefined\@subfloatrowtrue
{\newif\if@subfloatrow
- \caption@ifundefined\subfloatrow{}%
+ \caption@ifundefined\subfloatrow
+ {}%
{\caption@Debug{Patching subfloatrow environment}%
\g@addto@macro\capsubrowsettings{\@subfloatrowtrue}%
\g@addto@macro\killfloatstyle{%
@@ -2141,8 +1857,7 @@
% \end{macro}
%
% \begin{macro}{\caption@addsubcontentsline}
-% \changes{v3.1i}{2008/08/02}{Bugfix 08-07-28:
-% \cs{label}, \cs{index}, and \cs{glossary} are allowed inside the list entry now}
+% \changes{v3.1i}{2008/08/02}{\cs{label}, \cs{index}, and \cs{glossary} are allowed inside the list entry now}
% \changes{v3.2}{2011/06/26}{Uses \cs{caption@@addcontentsline} instead of \cs{addcontentsline} now}
% \changes{v3.2c}{2011/08/19}{Uses \cs{caption@gobble} instead of \cs{@gobble} now}
% \changes{v3.3}{2012/01/15}{Debug message added}
@@ -2211,181 +1926,117 @@
% \end{macrocode}
% \end{macro}
%
+% \section{Babel package support}
%
-% \section{Document class \& Babel package support}
-%
-% \subsection{The \AmS{} \& \SmF{} classes}
-% \changes{v3.1}{2007/07/29}{\AmS\ \& \SmF\ classes support added}
+% \subsection{The arabic \& farsi babel option}
+% \changes{v3.5}{2020/08/02}{\package{arabic} babel support addded}
%
% \begin{macrocode}
-\caption@ifdefined\smf@makecaption{\let\smf@makecaption\@makecaption}{}
+\caption@IfBabelArabi{%
% \end{macrocode}
%
-% \subsection{The beamer class}
-% \changes{v3.1}{2007/03/10}{beamer class support added}
+% The \package{arabicore} package re-defines |\@make|\-|caption|, |\fnum@figure|, and |\fnum@table|
+% incompatible to the \package{caption} package, therefore we have to restore our resp.~the original definitions here.
%
% \begin{macrocode}
-\@ifclassloaded{beamer}{%
- \caption@InfoNoLine{beamer document class}%
+ \let\@makecaption\caption@makecaption
+ \def\fnum@figure{\figurename\nobreakspace\thefigure}%
+ \def\fnum@table{\tablename\nobreakspace\thetable}%
% \end{macrocode}
%
-% \begin{macro}{\figure}
-% \changes{v3.1f}{2007/12/17}{This re-definition for \class{beamer} document class added}
-% \changes{v3.3d}{2019/09/01}{This re-definition for \class{beamer} document class revised}
-% We redefine |figure| so our type-specific options will be used etc.
-% \begin{macrocode}
- \let\caption@ORI@figure\figure
- \def\figure{\caption@settype{figure}\caption@ORI@figure}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\table}
-% \changes{v3.1f}{2007/12/17}{This re-definition for \class{beamer} document class added}
-% \changes{v3.3d}{2019/09/01}{This re-definition for \class{beamer} document class revised}
-% \changes{v3.4a}{2019/10/18}{Bug fixed which was introduced in previous revision}
-% We redefine |table| so our type-specific options will be used etc.
-% \begin{macrocode}
- \let\caption@ORI@table\table
- \def\table{\caption@settype{table}\caption@ORI@table}
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macrocode}
}{}
% \end{macrocode}
%
-% \subsection{The \KOMAScript{} classes}
-%
-% \KOMAScript\ contains the code
-% |\AtBeginDocument{\let\scr@caption\caption}|
-% so we need to update |\scr@caption| here, too.
+% \subsection{The frenchle \& frenchpro package}
+% \changes{v3.0h}{2005/10/03}{\package{frenchle/pro} package support added}
+% \changes{v3.5}{2020/08/01}{\package{frenchle/pro} package support updated}
%
% \begin{macrocode}
-\caption@ifdefined\scr@caption{%
- \caption@AtBeginDocument{\let\scr@caption\caption}}{}
+\caption@IfFrenchLe{%
% \end{macrocode}
%
-% \subsection{The frenchb Babel option}
-% \changes{v3.1}{2006/05/14}{Adaptation to \package{frenchb} added}
-%
-% Suppress
-% ``Package |frenchb.ldf| Warning: The definition of |\@makecaption| has been
-% changed, frenchb will NOT customize it.''
-% (but only if we emulate this customization)
+% \begin{macro}{\f@ffrench}
+% \begin{macro}{\f@tfrench}
+% |\f@ffrench| and |\f@tfrench| reflect |\fnum@figure| and |\fnum@table|
+% when used in French mode. These contain additional code which typesets
+% the caption separator |\caption|\-|separator| instead of the usual colon.
+% Because this breaks with our |\@make|\-|caption| code we have to remove
+% this additional code here.
% \begin{macrocode}
-\@nameuse{caption@frenchb}\@nameundef{caption@frenchb}
+ \def\f@ffrench{\ifx\listoffigures\relax\else\figurename~\thefigure\fi}%
+ \def\f@tfrench{\ifx\listoftables\relax\else\tablename~\thetable\fi}%
+ \let\@eatDP\@undefined
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
-% \subsection{The frenchle/pro package}
-% \changes{v3.0h}{2005/10/03}{Adaptation to \package{frenchle/pro} added}
-%
+% Since the \package{frenchle} package overwrites |\@make|\-|caption| (within |\GO|\-|french|),
+% we need to save it beforehand and restore it afterwards.
% \begin{macrocode}
-\caption@AtBeginDocument{\caption@ifdefined\frenchTeXmods{%
- \caption@InfoNoLine{frenchle/pro package is loaded}%
+ \caption@AtBeginDocument{%
+ \let\caption@original@makecaption\@makecaption}%
+ \g@addto@macro\GOfrench{%
+ \let\@makecaption\caption@original@makecaption}%
% \end{macrocode}
%
% \begin{macrocode}
- \let\captionfont@ORI\captionfont
- \let\captionlabelfont@ORI\captionlabelfont
- \let\@makecaption@ORI\@makecaption
-% \end{macrocode}
-
-% If |\GOfrench| is defined as |\relax| all the re-definitions regarding
-% captions have already been done, so we can do our patches immediately.
-% Otherwise we must add our stuff to |\GOfrench|.
-% \begin{macrocode}
- \caption@ifdefined\GOfrench
- {\def\caption@tempa{\g@addto@macro\GOfrench}}%
- {\let\caption@tempa\@firstofone}%
- \caption@tempa{%
+}{}
% \end{macrocode}
%
-% \begin{macrocode}
- \let\captionfont\captionfont@ORI
- \let\captionfont@ORI\@undefined
- \let\captionlabelfont\captionlabelfont@ORI
- \let\captionlabelfont@ORI\@undefined
- \let\@makecaption\@makecaption@ORI
- \let\@makecaption@ORI\@undefined
-% \end{macrocode}
+% \subsection{The hungarian \& magyar babel option}
+% \changes{v3.2}{2009/03/29}{\package{magyar} babel support added}
+% \changes{v3.3}{2018/08/26}{\package{magyar} babel support revised}
+% \changes{v3.5}{2020/08/02}{\package{magyar} babel support updated}
%
-% \begin{macro}{\@cnORI}
-% We update the definition of |\@cnORI| so it actually reflects
-% our definition of |\caption|.
% \begin{macrocode}
- \let\@cnORI\caption
+\caption@IfBabelHungarian{%
% \end{macrocode}
-% \end{macro}
%
-% \begin{macro}{\@tablescaption}
-% The \package{frenchle/pro} package sets |\caption| to |\@tablescaption| at
-% |\begin{table}| for special treatment of footnotes.
-% Therefore we have to patch |\@tablescaption| so |\caption*| will work
-% inside the |table| environment.
+% Since the \package{magyar} package tends to overwrite |\@make|\-|caption|
+% we save it beforehand and restore it afterwards.
+% \Note{Currently it will not be overwritten, caused by a side-effect of a
+% work-around for the \package{floatrow} package within \package{caption3}.}
+%
% \begin{macrocode}
- \let\caption@tcORI\@tablescaption
- \def\@tablescaption{\caption@star\relax\caption@tcORI}%
+ \caption@AtBeginDocument{%
+ \let\caption@original@makecaption\@makecaption}%
+ \caption@ifdefined\extrashungarian{%
+ \addto\extrashungarian{%
+ \let\@makecaption\caption@original@makecaption}}{}%
+ \caption@ifdefined\extrasmagyar{%
+ \addto\extrasmagyar{%
+ \let\@makecaption\caption@original@makecaption}}{}%
% \end{macrocode}
-% \end{macro}
%
-% \begin{macro}{\f@ffrench}
-% \begin{macro}{\f@tfrench}
-% |\f@ffrench| and |\f@tfrench| reflect |\fnum@figure| and |\fnum@table|
-% when used in French mode. These contain additional code which typesets
-% the caption separator |\captionseparator| instead of the usual colon.
-% Because this breaks with our |\@makecaption| code we have to remove
-% this additional code here.
% \begin{macrocode}
- \let\@eatDP\@undefined
- \let\caption@tempa\@empty
- \ifx\f@ffrench\fnum@figure
- \l@addto@macro\caption@tempa{\let\fnum@figure\f@ffrench}%
- \fi
- \ifx\f@tfrench\fnum@table
- \l@addto@macro\caption@tempa{\let\fnum@table\f@tfrench}%
- \fi
- \def\f@ffrench{\ifx\listoffigures\relax\else\figurename~\thefigure\fi}%
- \def\f@tfrench{\ifx\listoftables\relax\else\tablename~\thetable\fi}%
- \caption@tempa
+}{}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
+%
+% \subsection{The latvian babel option}
+% \changes{v3.5}{2020/08/02}{\package{latvian} babel support updated}
%
% \begin{macrocode}
- }%
-}{}}
+\caption@IfBabelLatvian{%
% \end{macrocode}
%
-% \subsection{The hungarian and magyar Babel option}
-% \changes{v3.2}{2009/03/29}{\package{magyar} package support added}
-% \changes{v3.3}{2018/08/26}{\package{magyar} package support revised}
+% The \package{latvian} package re-defines |\@make|\-|caption| incompatible to the \package{caption} package,
+% therefore we have to restore our definitions here.
%
% \begin{macrocode}
-\def\caption@tempa#1{%
- \@ifpackagewith{babel}{#1}{%
- \caption@InfoNoLine{#1 babel option is loaded}%
- \expandafter\addto\csname extras#1\endcsname{%
- % reverse changes made by magyar.ldf
- \let\@makecaption\caption@makecaption
- \babel@save\@makecaption
- \caption@redefine
- \babel@save\@caption}%
- }{}}
+ \let\@makecaption\caption@makecaption
% \end{macrocode}
+%
% \begin{macrocode}
-\caption@tempa{hungarian}%
-\caption@tempa{magyar}%
+}{}
% \end{macrocode}
%
% \section{Package support}
-% \changes{v3.1}{2007/04/11}{Package options `float', `longtable' etc.
-% are not supported anymore, removed}
+% \changes{v3.1}{2007/04/11}{Package options `float', `longtable' etc.~are not supported anymore, removed}
%
% \begin{macro}{\caption@IfPackageLoaded}
-% \changes{v3.0f}{2005/05/29}{3rd argument \meta{code} added,
-% so no extra check is needed}
-% \changes{v3.1}{2007/07/04}{Re-written \& renamed from \cs{caption@ifpackage}
-% to \cs{caption@IfPackageLoaded}}
+% \changes{v3.0f}{2005/05/29}{3rd argument \meta{code} added, so no extra check is needed}
+% \changes{v3.1}{2007/07/04}{Re-written \& renamed from \cs{caption@ifpackage} to \cs{caption@IfPackageLoaded}}
% \changes{v3.3}{2018/12/26}{Bugfix: Missing curly braces added}
% |\caption@IfPackageLoaded|\marg{package}\oarg{version}\marg{true}\marg{false}\par
% Some kind of combination of |\@ifpackageloaded| and |\@ifpackagelater|.
@@ -2561,6 +2212,77 @@
% \end{macrocode}
% \end{macro}
%
+% \subsection{The changepage package}
+% \changes{v3.4k}{2020/05/30}{Patch of the \package{changepage} package added}
+%
+% \begin{macrocode}
+\caption@IfPackageLoaded{changepage}[2008/07/23 memoir-v3.7k]{%
+% \end{macrocode}
+%
+% Both environments, \env{adjustwidth} and \env{adjustwidth*}, are starting a \env{list} \cs{item}.
+% But \cs{hsize} isn't set properly inside a \env{list} item, and therefore \cs{@makecaption}
+% (offered by document classes) doesn't work properly when used inside \env{adjustwidth}.
+% Therefore we try to detect the situation ``Are we inside a adjustwidth environment?''
+% inside \cs{@makecaption} and fix this. (Sigh!)
+%
+% We cannot simply set and test a flag here since our adjustment to \cs{hsize} should
+% not be done within a \cs{parbox} within a adjustwidth environment for example,
+% and therefore we store \cs{hsize} and \cs{linewidth}, and test \cs{hsize} and \cs{linewidth}
+% against the stored values instead. If they are equal we are (hopefully) quite save
+% to assume that we are now inside a plain \env{adjustwidth} environment and therefore need
+% to fix \cs{hsize} before typesetting the caption. (Deep sigh!)
+%
+% \begin{macro}{\caption@adjustwidth@hsize}
+% \begin{macro}{\caption@adjustwidth@linewidth}
+% \begin{macrocode}
+ \newdimen\caption@adjustwidth@hsize
+ \newdimen\caption@adjustwidth@linewidth
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\caption@set@adjustwidth}
+% \changes{v3.4k}{2020/05/30}{This macro and its usage added}
+% Store the values of \cs{hsize} and \cs{linewidth}.
+% \begin{macrocode}
+ \providecommand*\caption@set@adjustwidth{%
+ \caption@adjustwidth@hsize\hsize
+ \caption@adjustwidth@linewidth\linewidth}%
+% \end{macrocode}
+% \begin{macrocode}
+ \providecommand*\caption@patch@changepage[1]{%
+ \expandafter\let\csname caption@#1\expandafter\endcsname\csname #1\endcsname
+ \expandafter\renewcommand\csname #1\endcsname[2]{%
+ \@nameuse{caption@#1}{##1}{##2}%
+ \caption@set@adjustwidth}}%
+ \caption@patch@changepage{adjustwidth}%
+ \caption@patch@changepage{adjustwidth*}%
+ \let\caption@patch@changepage\relax
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@test@adjustwidth}
+% \changes{v3.4k}{2020/05/30}{This macro and its usage added}
+% Test if the values of \cs{hsize} and \cs{linewidth} are identical to
+% the ones stored in the \env{adjustwidth} environment.
+% If yes, set \cs{hsize} to the correct value.
+% \begin{macrocode}
+ \providecommand\caption@test@adjustwidth{%
+ \ifdim\hsize=\caption@adjustwidth@hsize
+ \ifdim\linewidth=\caption@adjustwidth@linewidth
+ \hsize=\linewidth
+ \fi
+ \fi}%
+% \end{macrocode}
+% \begin{macrocode}
+ \AtBeginCaption{\caption@test@adjustwidth}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+ }{}%
+% \end{macrocode}
+%
% \subsection{The chkfloat package}
% \changes{v3.3}{2018/09/06}{Support of the \package{chkfloat} package added}
%
@@ -2679,7 +2401,7 @@
% \begin{macro}{\float@makebox}
% \changes{v3.3}{2013/01/06}{Corrects wrong load order hyperref-float now}
% \changes{v3.3}{2013/02/03}{Correction of wrong load order hyperref-float revised}
-% Redefine |\float@makebox| (only if we are not operating in compatibility mode).
+% Redefine |\float@makebox| (only if we are not operating in compatibility mode `v1').
% \begin{macrocode}
\caption@AtBeginDocument{\caption@ifcompatibility{}{%
% \end{macrocode}
@@ -2719,8 +2441,7 @@
% \begin{macrocode}
\newcommand*\caption@float@setname[1]{%
\expandafter\ifx\csname #1name\endcsname\relax
- \expandafter\let\csname #1name\expandafter\endcsname
- \csname fname@#1\endcsname
+ \expandafter\let\csname #1name\expandafter\endcsname\csname fname@#1\endcsname
\fi}%
% \end{macrocode}
% \end{macro}
@@ -2855,14 +2576,14 @@
% |\caption|\-|setup[|\-|floating|\meta{type}|]{|\ldots|}| is supported.
% \item |\line|\-|width| must be set correctly.
% Usually this is done by |\@par|\-|box|\-|restore| inside |\@caption|,
-% but since we use |\@caption@box|\-|restore| we have to map this to
+% but since we use |\@caption@parbox|\-|restore| we have to map this to
% |\@par|\-|box|\-|restore| instead.
% \end{enumerate}
% \begin{macrocode}
\newcommand*\caption@floatflt[1]{%
\caption@settype{#1}%
\caption@clearmargin
- \caption@setfullparboxrestore
+ \caption@setparboxrestore{full}%
\caption@setoptions{floating#1}}%
% \end{macrocode}
% \end{macro}
@@ -3353,18 +3074,9 @@
% \changes{v3.4c}{2020/01/01}{Ugly workaround for usage in lists added}
% \changes{v3.4d}{2020/01/01}{Ugly workaround for usage in lists revised}
% To support the \package{listings} package we need to redefine
-% |\lst@MakeCaption| so the original stuff is nested with
+% |\lst@Make|\-|Caption| so the original stuff is nested with
% |\caption@begin| and |\caption@end| etc.\par
-% Unfortunately |\lst@MakeCaption| is sometimes used with |\linewidth| intact but sometimes with |\linewidth| adapted.
-% So we either could write a bunch of very ugly code which is using internals of the \package{listings} package, or
-% we could simply ignore this fact since |\hsize| will be left untouched by the \package{listings} package.
-% (This is the reason why the caption is mis-aligned when using one of the options |linewidth=|, |xleftmargin=|, |yleftmargin=|, or |resetmargins=|,
-% even if the \package{caption} package isn't used. This needs to be fixed within the \package{listings} package, for example by using
-% |\lst@MakeCaption| inside a parbox of correct width.)
-%
-% The \package{listings} package calls |\lst@MakeCaption| sometimes with original |\linewidth|, sometimes with adapted |\linewidth|.
-% So we need to detect if |\linewidth| is already adapted or not.
-% We realize this by setting a flag inside the "Init" hook of the \package{listings} package (where the adaption takes place).
+% We set a flag inside the "Init" hook of the \package{listings} package (where adaption of |\line|\-|width| etc.~takes place).
% \begin{macrocode}
\caption@setbool{lst@Init}{0}%
\lst@AddToHook{Init}{\caption@setbool{lst@Init}{1}}%
@@ -3378,28 +3090,8 @@
% \begin{macrocode}
\begingroup
% \end{macrocode}
-% \begin{macrocode}
-%% \caption@Debug{%
-%% linewidth=\lst@linewidth,
-%% xleftmargin=\lst@xleftmargin,\MessageBreak
-%% xrightmargin=\lst@xrightmargin,
-%% resetmargins=\lst@ifresetmargins true\else false\fi}%
-% \end{macrocode}
-% If |\linewidth| isn't adapted by the \package{listings} package yet, do the adaption now.
-% \begin{macrocode}
-%% \caption@iflst@Init{}{%
-%% \linewidth\lst@linewidth\relax
-%% \lst@ifresetmargins
-%% \advance\linewidth\@totalleftmargin
-%% \advance\linewidth\rightmargin
-%% \@totalleftmargin\z@
-%% \fi
-%% \advance\linewidth-\lst@xleftmargin
-%% \advance\linewidth-\lst@xrightmargin
-%% \advance\@totalleftmargin\lst@xleftmargin\relax}%
-% \end{macrocode}
-% Inside lists the \package{listings} package ignores the left margin (|\@totalleftmargin|) for captions.
-% We emulate this behaviour by adding a negativ skip which will be typeset ahead of |\caption@box|.\par
+% Inside lists the \package{listings} package ignores the left margin (|\@total|\-|left|\-|margin|) for captions.
+% We emulate this behaviour by adding a negative skip which will be typeset ahead of |\caption@box|.\par
% Note: We only need to do this if the ``Init'' hook of the \package{listings} package wasn't called yet.
% \begin{macrocode}
\caption@iflst@Init{}{%
@@ -3478,6 +3170,15 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\caption@AtBeginLongtable}
+% \changes{v3.5}{2018/04/15}{This macro added}
+% \begin{macrocode}
+\providecommand*\caption@LT@array{}
+\newcommand\caption@AtBeginLongtable{%
+ \g@addto@macro\caption@LT@array}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
\caption@IfPackageLoaded{longtable}[1995/05/24 v3.14]{%
% \end{macrocode}
@@ -3488,85 +3189,81 @@
%
% \begin{macro}{\LT@array}
% \changes{v3.1}{2007/07/22}{This redefinition added}
-% \changes{v3.1a}{2007/09/14}{Bugfix 07-09-14: Redefinition of \cs{@captionabovetrue} \& \cs{@captionabovefalse} added}
% \changes{v3.1a}{2007/09/16}{Bugfix: This redefinition will always be done \cs{AtBeginDocument}}
% \changes{v3.1g}{2008/01/20}{Bugfix in \cs{captionlistentry}: Table counter will not be incremented anymore, \cs{nameref} works}
% \changes{v3.3}{2016/01/31}{Support for \cs{bicaption} added}
% \changes{v3.3}{2018/10/05}{Definition of \cs{captionlistentry} fixed}
-% We redefine |\LT@array| here to get |\captionsetup|\marg{options}
-% working inside |longtable|s.
+% \changes{v3.5}{2018/04/15}{Usage of \cs{caption@AtBeginLongtable} added}
+% We redefine |\LT@array| here to get |\captionsetup|\marg{options} working inside |longtable|s.
% \Note{Since the \package{hyperref} package patches \cs{LT@array} as well
% and since this only works with the original definition of \cs{LT@array},
-% we have to do this after the \package{hyperref} package,
-% i.e.~\cs{AtBeginDocument}.}
+% we have to do this after the \package{hyperref} package, i.e.~\cs{AtBeginDocument}.}
% \begin{macrocode}
\caption@AtBeginDocument{%
\let\caption@ORI@LT@array\LT@array
\renewcommand*\LT@array{%
+ \caption@LT@array
+ \caption@ORI@LT@array}}%
% \end{macrocode}
-% |\captionsetup| for longtable:
% \begin{macrocode}
- \global\let\caption@opt@@longtable\@undefined
- \def\captionsetup{%
- \noalign\bgroup
- \@ifstar\@captionsetup\@captionsetup}% gobble *
- \def\@captionsetup##1{\LT@captionsetup{##1}\egroup}%
- \def\LT@captionsetup##1{%
- \captionsetup@startrue\caption@setup@options[@longtable]{##1}%
- \global\let\caption@opt@@longtable\caption@opt@@longtable}%
-% \end{macrocode}
-% |\captionabove| \& |\captionbelow| for longtable: (\KOMAScript\ document class)
+ \caption@AtBeginLongtable{%
+% |\captionsetup| for longtable:
% \begin{macrocode}
- \def\@captionabovetrue{\LT@captionsetup{position=t}}%
- \def\@captionabovefalse{\LT@captionsetup{position=b}}%
+ \global\let\caption@opt@@longtable\@undefined
+ \def\captionsetup{%
+ \noalign\bgroup
+ \@ifstar\@captionsetup\@captionsetup}% gobble *
+ \def\@captionsetup#1{\LT@captionsetup{#1}\egroup}%
+ \def\LT@captionsetup#1{%
+ \captionsetup@startrue\caption@setup@options[@longtable]{#1}%
+ \global\let\caption@opt@@longtable\caption@opt@@longtable}%
% \end{macrocode}
% |\captionlistentry| for longtable:
% \begin{macrocode}
- \def\captionlistentry{%
- \noalign\bgroup
- \@ifstar{\egroup\LT@listentry\LTcaptype}% gobble *
- {\egroup\LT@listentry\LTcaptype}}%
+ \def\captionlistentry{%
+ \noalign\bgroup
+ \@ifstar{\egroup\LT@listentry\LTcaptype}% gobble *
+ {\egroup\LT@listentry\LTcaptype}}%
% \end{macrocode}
% |\continuedfloat| for longtable:\\
% {\small(Commented out, since it's not deeply tested and quite useless anyway)}
% \Note{\package{hyperref} versions $<$ v6.76j uses $2\times$ \cs{hyper@makecurrent}}
% \begin{macrocode}
-% \caption@ifhypcap{%
-% \let\caption@ORI@hyper@makecurrent\hyper@makecurrent
-% \def\hyper@makecurrent##1{%
-% \let\hyper@makecurrent\caption@ORI@hyper@makecurrent
-% \caption@makestart{##1}%
-%% \let\Hy@LT@currentHlabel\@currentHlabel
-% \let\Hy@LT@currentHref\@currentHref
-% \def\hyper@makecurrent####1{%
-%% \let\@currentHlabel\Hy@LT@currentHlabel
-% \let\@currentHref\Hy@LT@currentHref}}%
-% \let\caption@ORI@continuedfloat\continuedfloat
-% \def\continuedfloat{\noalign{%
-% \gdef\caption@setContinuedFloat{%
-% \let\caption@reset@continuedfloat\@gobble}%
-% \def\caption@setoptions####1{%
-% \g@addto@macro\caption@setContinuedFloat{%
-% \caption@setoptions{####1}}}%
-% \let\@captype\LTcaptype
-% \caption@ORI@ContinuedFloat}}%
-% }{%
-% \def\continuedfloat{\noalign{%
-% \caption@Error{%
-% \noexpand\continuedfloat inside longtables\MessageBreak
-% is only available with `hypcap=true'}}}%
-% }%
-% \global\let\caption@setContinuedFloat\@empty
- \def\continuedfloat{\noalign{%
- \caption@Error{\noexpand\continuedfloat outside float}}}%
+% \caption@ifhypcap{%
+% \let\caption@ORI@hyper@makecurrent\hyper@makecurrent
+% \def\hyper@makecurrent##1{%
+% \let\hyper@makecurrent\caption@ORI@hyper@makecurrent
+% \caption@makestart{##1}%
+%% \let\Hy@LT@currentHlabel\@currentHlabel
+% \let\Hy@LT@currentHref\@currentHref
+% \def\hyper@makecurrent####1{%
+%% \let\@currentHlabel\Hy@LT@currentHlabel
+% \let\@currentHref\Hy@LT@currentHref}}%
+% \let\caption@ORI@continuedfloat\continuedfloat
+% \def\continuedfloat{\noalign{%
+% \gdef\caption@setContinuedFloat{%
+% \let\caption@reset@continuedfloat\@gobble}%
+% \def\caption@setoptions##1{%
+% \g@addto@macro\caption@setContinuedFloat{%
+% \caption@setoptions{##1}}}%
+% \let\@captype\LTcaptype
+% \caption@ORI@ContinuedFloat}}%
+% }{%
+% \def\continuedfloat{\noalign{%
+% \caption@Error{%
+% \noexpand\continuedfloat inside longtables\MessageBreak
+% is only available with `hypcap=true'}}}%
+% }%
+% \global\let\caption@setContinuedFloat\@empty
+ \def\continuedfloat{\noalign{%
+ \caption@Error{\noexpand\continuedfloat outside float}}}%
% \end{macrocode}
% |\bicaption| for longtable:
% \begin{macrocode}
- \let\bicaption\LT@bicaption
+ \let\bicaption\LT@bicaption
% \end{macrocode}
-%
% \begin{macrocode}
- \caption@ORI@LT@array}}%
+ }%
% \end{macrocode}
% \end{macro}
%
@@ -3589,10 +3286,8 @@
% \end{macro}
%
% \begin{macro}{\LT@makecaption}
-% \changes{v3.0d}{2004/08/10}{%
-% Bugfix 04-08-04: \cs{abovecaptionskip} \& \cs{belowcaptionskip} will be used now}
-% \changes{v3.0e}{2005/05/05}{%
-% Bugfix: \cs{captionsetup[longtable]} overrides \cs{LTcapwidth} now}
+% \changes{v3.0d}{2004/08/10}{Bugfix 04-08-04: \cs{abovecaptionskip} \& \cs{belowcaptionskip} will be used now}
+% \changes{v3.0e}{2005/05/05}{Bugfix: \cs{captionsetup[longtable]} overrides \cs{LTcapwidth} now}
% \changes{v3.0h}{2005/10/07}{\cs{caption@LT@make} introduced}
% \changes{v3.3}{2016/02/01}{Support for \cs{bicaption} via \cs{caption@LT@setup} added}
% \changes{v3.3a}{2019/04/02}{Work-around for problem with \package{floatrow} added}
@@ -3619,19 +3314,16 @@
\caption@LT@make{%
\caption@LT@settype\LTcaptype
% \end{macrocode}
-%
% |\caption@LT@setup| is re-defined inside the \package{bicaption} package
% and contains the preparation of typesetting of the bilingual caption.
% \begin{macrocode}
\caption@LT@setup
% \end{macrocode}
-%
% \iffalse
% The default |position=| setting for longtables is |top|.
% (This emulates the standard behavior of the \package{longtable} package
% which has no skip above the caption but a skip below it.)
% \fi
-%
% |position=auto| is a bad idea for longtables, but we do our very best.
% This works quite well for captions inside the longtable contents, but
% not for captions inside the longtable (end)foot.
@@ -3639,22 +3331,18 @@
% \begin{macrocode}
\caption@setautoposition{\ifcase\LT@rows t\else b\fi}%
% \end{macrocode}
-%
% We set |\ifcaption@star| according the 1st argument.
% \begin{macrocode}
\caption@startrue#1\caption@starfalse
% \end{macrocode}
-%
% \begin{macrocode}
\caption@prepare@stepcounter\LTcaptype{LT}%
% \end{macrocode}
-%
-% \changes{v3.1}{2007/05/05}{\cs{caption@normalsize} added}
+% \changes{v3.1}{2007/05/05}{\cs{caption@font@normal} added}
% \begin{macrocode}
\caption@begin\LTcaptype
\caption@normalsize
% \end{macrocode}
-%
% The following skip has the purpose to correct the height of the
% |\parbox[t]|. Usually it's the height of the very first line, but
% because of our extra skips (|\abovecaptionskip| and |\belowcaptionskip|)
@@ -3667,16 +3355,14 @@
% \begin{macrocode}
\vskip-\ht\strutbox
% \end{macrocode}
-%
-% Work-around for problem with \package{floatrow}:
-% The |\belowcaptionskip| disturbs the environment in which the caption is actually typeset (by creating extra, unwanted space),
-% so we supress this skip if the \package{floatrow} package is loaded.
-% (This fixes \issue{50})
+% Work-around for problem with \package{floatrow}:
+% The |\below|\-|caption|\-|skip| disturbs the environment in which the caption is actually typeset (by creating extra, unwanted space),
+% so we supress this skip if the \package{floatrow} package is loaded.
+% (This fixes \issue{50})
% \begin{macrocode}
\caption@ifdefined\FBifcaptop{%
\let\caption@belowskip\@empty}{}%
% \end{macrocode}
-%
% The following code should look familiar. We do our skips and use
% |\caption@@make| to typeset the caption itself.
% \begin{macrocode}
@@ -3747,7 +3433,10 @@
% \end{macro}
%
% \begin{macrocode}
-}{}
+}{%
+ \let\caption@AtBeginLongtable\@gobble
+ \let\caption@LT@array\@undefined
+}
% \end{macrocode}
%
% \begin{macro}{\caption@LT@setup}
@@ -3787,7 +3476,7 @@
%
% \begin{macro}{\caption@window}
% \changes{v3.1c}{2007/10/06}{Bugfix: \cs{caption@clearmargin} added}
-% Beside calling |\caption@settype| we redefine |\caption@boxrestore|
+% Beside calling |\caption@settype| we redefine |\caption@par|\-|box|\-|restore|
% (as in \package{floatflt} \& \package{picins} package support)
% and |\@makecaption| (as in \package{float} package support) here.
% \begin{macrocode}
@@ -3796,7 +3485,7 @@
\caption@setautoposition b%
\caption@settype{#1}%
\caption@clearmargin
- \caption@setfullparboxrestore}%
+ \caption@setparboxrestore{full}}%
% \end{macrocode}
% \end{macro}
%
@@ -3903,9 +3592,9 @@
% \item We use |\caption@setoptions{parpic}| so
% |\captionsetup[parpic]{|\ldots|}| is supported.
% \item |\linewidth| must be set correctly.
-% Usually this is done by |\@parboxrestore| inside |\@caption|,
-% but since we use |\@caption@boxrestore| we have to map this to
-% |\@parboxrestore| instead.
+% Usually this is done by |\@parbox|\-|restore| inside |\@caption|,
+% but since we use |\@caption@parbox|\-|restore| we have to map this to
+% |\@parbox|\-|restore| instead.
% \item The two arguments of |\caption| (|\sh@rtf@rm| \& |\capti@nt@xt|)
% should be expanded on first level so |\caption[]{|\ldots|}| and
% |\caption[|\ldots|]{}| work correctly.
@@ -3924,7 +3613,7 @@
% \else
% \captionwidth\z@ % do not use "width=" setting
% \fi
- \caption@setfullparboxrestore
+ \caption@setparboxrestore{full}%
\caption@setoptions{parpic}%
\caption@setautoposition b%
% \end{macrocode}
@@ -4114,7 +3803,7 @@
\def\caption@setSC@justify{%
\caption@clearmargin
\ifx\SC@justify\@empty \else
- \let\caption@hj\SC@justify
+ \let\caption@justification\SC@justify
\let\SC@justify\@empty
\fi}%
% \end{macrocode}
@@ -4237,12 +3926,11 @@
% \package{supertabular} package: If |\topcaption| was used,
% the position will be |top| automatically, |bottom| otherwise.
% \begin{macrocode}
- \def\caption@fixposition{%
- \caption@setposition{\if@topcaption t\else b\fi}}%
+ \caption@setposition{\if@topcaption t\else b\fi}%
% \end{macrocode}
% \begin{macrocode}
\caption@beginex{#1}{#2}{#3}%
- \caption@boxrestore
+ \caption@parboxrestore
\caption@normalsize
\@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
\caption@end}%
@@ -4304,13 +3992,12 @@
\caption@setoptions{xtabular}%
% \end{macrocode}
% \begin{macrocode}
- \def\caption@fixposition{%
- \caption@setposition{\if@topcaption t\else b\fi}}%
+ \caption@set{position}{\if@topcaption t\else b\fi}%
% \end{macrocode}
% \begin{macrocode}
\@initisotab
\caption@beginex{#1}{#2}{#3}%
- \caption@boxrestore
+ \caption@parboxrestore
\caption@normalsize
\@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
\caption@end
@@ -4338,7 +4025,7 @@
\let\caption@ORI@threeparttable\threeparttable
\renewcommand*\threeparttable{%
\caption@settype{\@ifundefined{@captype}{table}{\@captype}}%
-%%% \caption@setposition a% ?
+%%% \caption@setposition{auto}% ?
\caption@clearmargin
\caption@setoptions{threeparttable}%
\caption@ORI@threeparttable}%
@@ -4351,7 +4038,7 @@
\let\caption@ORI@measuredfigure\measuredfigure
\renewcommand*\measuredfigure{%
\caption@settype{\@ifundefined{@captype}{figure}{\@captype}}%
-%%% \caption@setposition a% ?
+%%% \caption@setposition{auto}% ?
\caption@clearmargin
\caption@setoptions{measuredfigure}%
\caption@ORI@measuredfigure}%
@@ -4466,6 +4153,16 @@
}{}
% \end{macrocode}
%
+% \section{That's all Folks!}
+%
+% Execute the code declared with |\After|\-|Caption|\-|Package|.
+%
+% \begin{macrocode}
+\caption@endtitles@code
+\let\caption@endtitles@code\@undefined
+\let\AfterCaptionPackage\@firstofone
+% \end{macrocode}
+%
% \iffalse
%</package>
% \fi
@@ -4476,24 +4173,6 @@
%
% \clearpage
% \begin{thebibliography}{99}
-% \bibitem{beamer}
-% Till Tantau:\\
-% \href{http://www.ctan.org/pkg/beamer}%
-% {\emph{The beamer class, User Guide for version 3.25}},\\
-% December 26, 2012
-%
-% \bibitem{KOMAScript}
-% Markus Kohm \& Jens-Uwe-Morawski:\\
-% \href{http://www.ctan.org/pkg/koma-script}%
-% {\emph{KOMA-Script -- a versatile \LaTeXe\ bundle}},\\
-% 2012-07-22
-%
-% \bibitem{NTG}
-% Victor Eijkhout:\\
-% \href{http://www.ctan.org/pkg/ntgclass}%
-% {\emph{An introduction to the Dutch \LaTeX\ document classes}},\\
-% 3 September 1989
-%
% \bibitem{float}
% Anselm Lingnau:\\
% \href{http://www.ctan.org/pkg/float}%
diff --git a/Master/texmf-dist/source/latex/caption/caption.ins b/Master/texmf-dist/source/latex/caption/caption.ins
index d6ea31962f1..188347ba15c 100644
--- a/Master/texmf-dist/source/latex/caption/caption.ins
+++ b/Master/texmf-dist/source/latex/caption/caption.ins
@@ -25,30 +25,41 @@ This work has the LPPL maintenance status "maintained".
This Current Maintainer of this work is Axel Sommerfeldt.
This work consists of the files
- caption.ins, caption.dtx, caption2.dtx, caption3.dtx,
- bicaption.dtx, ltcaption.dtx, subcaption.dtx, totalcount.dtx,
+ caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+ caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+ caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+ caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
the derived files
- caption.sty, caption2.sty, caption3.sty,
- bicaption.sty, ltcaption.sty, subcaption.sty, totalcount.sty,
+ caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+ caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+ caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+ caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
and the user manuals
caption-deu.tex, caption-eng.tex, caption-rus.tex.
\endpreamble
\generate{\file{caption.sty}{\from{caption.dtx}{package}}}
+\generate{\file{caption-light.sty}{\from{caption-light.dtx}{package}}}
\generate{\file{caption2.sty}{\from{caption2.dtx}{package}}}
\generate{\file{caption3.sty}{\from{caption3.dtx}{package}}}
+
+\generate{\file{caption-ams-smf.sto}{\from{caption-ams-smf.dtx}{package}}}
+\generate{\file{caption-beamer.sto}{\from{caption-beamer.dtx}{package}}}
+\generate{\file{caption-elsarticle.sto}{\from{caption-elsarticle.dtx}{package}}}
+\generate{\file{caption-koma.sto}{\from{caption-koma.dtx}{package}}}
+\generate{\file{caption-memoir.sto}{\from{caption-memoir.dtx}{package}}}
+\generate{\file{caption-ntg.sto}{\from{caption-ntg.dtx}{package}}}
+\generate{\file{caption-thesis.sto}{\from{caption-thesis.dtx}{package}}}
+
\generate{\file{bicaption.sty}{\from{bicaption.dtx}{package}}}
\generate{\file{ltcaption.sty}{\from{ltcaption.dtx}{package}}}
\generate{\file{subcaption.sty}{\from{subcaption.dtx}{package}}}
-\generate{\file{totalcount.sty}{\from{totalcount.dtx}{package}}}
\Msg{***********************************************************}
\Msg{*}
\Msg{* To finish the installation you have to move the files}
-\Msg{* `caption.sty', `caption2.sty', 'caption3.sty',}
-\Msg{* `bicaption.sty', `ltcaption.sty', `subcaption.sty',}
-\Msg{* and `totalcount.sty' into a directory searched by TeX.}
+\Msg{* `*.sty' and `*.sto' into a directory searched by TeX.}
\Msg{*}
\Msg{* To produce the documentation run the file}
\Msg{* `caption-eng.tex' (English version) or `caption-rus.tex'}
diff --git a/Master/texmf-dist/source/latex/caption/caption2.dtx b/Master/texmf-dist/source/latex/caption/caption2.dtx
index 2b6f3c73c2b..9e6850dfe69 100644
--- a/Master/texmf-dist/source/latex/caption/caption2.dtx
+++ b/Master/texmf-dist/source/latex/caption/caption2.dtx
@@ -19,16 +19,20 @@
% This Current Maintainer of this work is Axel Sommerfeldt.
%
% This work consists of the files
-% caption.ins, caption.dtx, caption2.dtx, caption3.dtx,
-% bicaption.dtx, ltcaption.dtx, subcaption.dtx, totalcount.dtx,
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
% the derived files
-% caption.sty, caption2.sty, caption3.sty,
-% bicaption.sty, ltcaption.sty, subcaption.sty, totalcount.sty,
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
% and the user manuals
% caption-deu.tex, caption-eng.tex, caption-rus.tex.
%
% \fi
-% \CheckSum{868}
+% \CheckSum{864}
%
% \iffalse
%<*driver>
@@ -207,7 +211,7 @@
%
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesPackage{caption2}[2020/01/02 v2.2e Customising captions (AR)]
+\ProvidesPackage{caption2}[2020/09/28 v2.2f Customising captions (AR)]
% \end{macrocode}
%
% \changes{v2.2b}{2007/06/15}{Made obsolete warning even more annoying}
@@ -226,7 +230,7 @@
% \subsection{Loading the caption3 kernel}
%
% \begin{macrocode}
-\RequirePackage{caption3}[2019/12/31] % should be used with v1.8f or newer
+\RequirePackage{caption3}[2020/09/28] % needs v2.2a or newer
% \end{macrocode}
% We undefine user commands offered by \package{caption} but not by \package{caption2}
% since they should not be used together with \package{caption2}.
@@ -238,15 +242,25 @@
\let\DeclareCaptionSubType\@undefined
% \end{macrocode}
%
+% \begin{macro}{\captiontwo@Error}
+% \changes{v2.2f}{2020/09/28}{This macro added}
+% |\captiontwo@Error|\marg{message}\\
+% issues an error message (with code line indication).
+% \begin{macrocode}
+\newcommand*\captiontwo@Error[2][]{%
+ \PackageError{caption2}{#2}{#1\caption@@eh{caption2}}}
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Check against the regular caption package}
% \changes{v2.2}{2007/04/06}{Check against regular \package{caption} package added}
% \changes{v2.2a}{2007/04/11}{Bugfix: Usage of \cs{caption@error} replaced by \cs{PackageError}}
%
% \begin{macrocode}
\@ifpackageloaded{caption}{%
- \PackageError{caption2}{%
+ \captiontwo@Error{%
You can't use both, the (current) caption *and*\MessageBreak
- the (obsolete) caption2 package}\caption@eh
+ the (obsolete) caption2 package}%
\endinput
}{}
% \end{macrocode}
@@ -343,7 +357,9 @@
%
% \begin{macro}{\defcaptionstyle}
% \begin{macro}{\newcaptionstyle}
+% \changes{v2.2f}{2020/09/28}{Uses \cs{captiontwo@Error} instead of \cs{PackageError} now}
% \begin{macro}{\renewcaptionstyle}
+% \changes{v2.2f}{2020/09/28}{Uses \cs{captiontwo@Error} instead of \cs{PackageError} now}
% These macros will define a new caption style. \cs{newcaptionstyle} and \cs{renewcaptionstyle}
% will additionally check if the caption style already exists or not.
% \begin{macrocode}
@@ -355,7 +371,7 @@
\expandafter\ifx\csname caption@@#1\endcsname\relax
\expandafter\defcaptionstyle
\else
- \PackageError{caption2}{Caption style `#1' already defined}{\caption@eh}%
+ \captiontwo@Error{Caption style `#1' already defined}%
\expandafter\@gobbletwo
\fi
{#1}}
@@ -363,7 +379,7 @@
% \begin{macrocode}
\newcommand*\renewcaptionstyle[1]{%
\expandafter\ifx\csname caption@@#1\endcsname\relax
- \PackageError{caption2}{Caption style `#1' undefined}{\caption@eh}%
+ \captiontwo@Error{Caption style `#1' undefined}%
\expandafter\@gobbletwo
\else
\expandafter\defcaptionstyle
@@ -375,6 +391,7 @@
% \end{macro}
%
% \begin{macro}{\dummycaptionstyle}
+% \changes{v2.2f}{2020/09/28}{Uses \cs{captiontwo@Error} instead of \cs{PackageError} now}
% This macro will also define a new caption style, but a one which is based on the
% actual set caption style. Therefore you can't set a caption style made with this
% command with \cs{captionstyle} -- we check this to avoid an endless recursion.
@@ -383,11 +400,11 @@
\defcaptionstyle{#1}{%
\expandafter\ifx\csname caption@@\caption@style\expandafter\endcsname%
\csname caption@@#1\endcsname
- \PackageError{caption2}{You can't use the caption style `#1' directy}{%
- The caption style `#1' is only a dummy and does not really exists.%
- \MessageBreak You have to redefine it (with \protect\renewcaptionstyle)
- before you can select\MessageBreak it with \protect\captionstyle.
- \space\caption@eh}%
+ \captiontwo@Error
+ [The caption style `#1' is only a dummy and does not really exists.%
+ \MessageBreak You have to redefine it (with \protect\renewcaptionstyle)
+ before you can select\MessageBreak it with \protect\captionstyle.\space]%
+ {You can't use the caption style `#1' directy}%
\else
#2\usecaptionstyle\caption@style
\fi}}
@@ -395,12 +412,13 @@
% \end{macro}
%
% \begin{macro}{\captionstyle}
+% \changes{v2.2f}{2020/09/28}{Uses \cs{captiontwo@Error} instead of \cs{PackageError} now}
% \cs{captionstyle} sets the actual caption style. It includes a check if the given caption
% style is defined or not.
% \begin{macrocode}
\newcommand*\captionstyle[1]{%
\expandafter\ifx\csname caption@@#1\endcsname\relax
- \PackageError{caption2}{Undefined caption style `#1'}{\caption@eh}%
+ \captiontwo@Error{Undefined caption style `#1'}%
\else
\def\caption@style{#1}%
\fi}
@@ -820,22 +838,22 @@
% \end{macro}
%
% \begin{macro}{\usecaptionstyle}
-% First we check if we are inside a caption -- if \cs{captiontext} is undefined we are not.
-% If we are we call the appropriate caption definition.
-%
% \changes{v2.1b}{2004/04/16}{Missing percent added (and extra space removed)}
% \changes{v2.2}{2007/04/06}{\cs{let}\cs{caption@make}\cs{caption@makecaption} added}
+% \changes{v2.2f}{2020/09/28}{Uses \cs{captiontwo@Error} instead of \cs{PackageError} now}
+% First we check if we are inside a caption -- if \cs{captiontext} is undefined we are not.
+% If we are we call the appropriate caption definition.
% \begin{macrocode}
\newcommand*\usecaptionstyle[1]{%
\caption@ifundefined\captiontext{%
- \PackageError{caption2}{You can't use \protect#1
- in normal text}{The usage of \protect#1 is only
- allowed inside code declared with\MessageBreak \protect\defcaptionstyle,
- \protect\newcaptionstyle \space or \protect\renewcaptionstyle.
- \space\caption@eh}
+ \captiontwo@Error
+ [The usage of \protect#1 is only
+ allowed inside code declared with\MessageBreak \protect\defcaptionstyle,
+ \protect\newcaptionstyle \space or \protect\renewcaptionstyle.\space]%
+ {You can't use \protect#1 in normal text}%
}{%
\@ifundefined{caption@@#1}%
- {\PackageError{caption2}{Caption style `#1' undefined}{\caption@eh}}%
+ {\captiontwo@Error{Caption style `#1' undefined}}%
{\let\caption@make\caption@makecaption
\@nameuse{caption@@#1}}%
}}
@@ -1297,12 +1315,13 @@
% \end{macro}
%
% \begin{macro}{\subcapstyle}
+% \changes{v2.2f}{2020/09/28}{Uses \cs{captiontwo@Error} instead of \cs{PackageError} now}
% Analogous to \cs{captionstyle} we define \cs{subcapstyle}
% and set it (via \cs{setsubcapstyle}) to a appropriate value.
% \begin{macrocode}
\newcommand*\subcapstyle[1]{%
\expandafter\ifx\csname caption@@#1\endcsname\relax
- \PackageError{caption2}{Undefined caption style `#1'}{\caption@eh}%
+ \captiontwo@Error{Undefined caption style `#1'}%
\else
\def\caption@substyle{#1}%
\fi}
diff --git a/Master/texmf-dist/source/latex/caption/caption3.dtx b/Master/texmf-dist/source/latex/caption/caption3.dtx
index 5cd6a8d9eab..96b2bc8ea95 100644
--- a/Master/texmf-dist/source/latex/caption/caption3.dtx
+++ b/Master/texmf-dist/source/latex/caption/caption3.dtx
@@ -19,21 +19,25 @@
% This Current Maintainer of this work is Axel Sommerfeldt.
%
% This work consists of the files
-% caption.ins, caption.dtx, caption2.dtx, caption3.dtx,
-% bicaption.dtx, ltcaption.dtx, subcaption.dtx, totalcount.dtx,
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
% the derived files
-% caption.sty, caption2.sty, caption3.sty,
-% bicaption.sty, ltcaption.sty, subcaption.sty, totalcount.sty,
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
% and the user manuals
% caption-deu.tex, caption-eng.tex, caption-rus.tex.
%
% \fi
-% \CheckSum{3476}
+% \CheckSum{3674}
%
% \iffalse
%<*driver>
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesFile{caption3.drv}[2015/09/15 v1.8 Implementation of the caption kernel]
+\ProvidesFile{caption3.drv}[2020/10/11 v2.2 Implementation of the caption kernel]
\hbadness=9999 \newcount\hbadness \hfuzz=100pt % Make TeX shut up.
%\errorcontextlines=3
%
@@ -57,16 +61,11 @@
\ifpdf\usepackage{hypdestopt}\fi
\hypersetup{pdfkeywords={LaTeX, package, caption},pdfstartpage={},pdfstartview={}}
%
-\usepackage{caption3}[2019/09/09]
+\usepackage{caption3}[2020/09/12]
%
-\DeclareRobustCommand*\AmS{\texorpdfstring
- {{\protect\usefont{OMS}{cmsy}{m}{n}A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}%
- {AMS}}
-\DeclareRobustCommand*\KOMAScript{\texorpdfstring
- {\textsf{K\kern.05em O\kern.05em M\kern.05em A\kern.1em-\kern.1em Script}}%
- {KOMA-Script}}
-\DeclareRobustCommand*\NTG{NTG}
-\DeclareRobustCommand*\SmF{SMF}
+\DeclareRobustCommand*\eTeX{\texorpdfstring
+ {\leavevmode\hbox{$\varepsilon$}-\TeX}%
+ {e-TeX}}
%
\begin{document}
\DocInput{caption3.dtx}
@@ -74,28 +73,31 @@
%</driver>
% \fi
%
+% \def\thispackage{the \package{caption} kernel}
+% \def\Thispackage{The \package{caption} kernel}
+%
% \newcommand*\purerm[1]{{\upshape\mdseries\rmfamily #1}}
% \newcommand*\puresf[1]{{\upshape\mdseries\sffamily #1}}
% \newcommand*\purett[1]{{\upshape\mdseries\ttfamily #1}}
% \let\class\puresf \let\package\puresf
% \let\env\purett \let\opt\purett
%
-% \def\thispackage{the \package{caption} kernel}
-% \def\Thispackage{The \package{caption} kernel}
-%
% \newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
% \newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
-% \newcommand*\version[2][]{\textit{v#2}}
+% \newcommand*\version[2][]{v$#2$}
%
+% \GetFileInfo{caption3.drv}
+% \let\docdate\filedate
+% \let\docversion\fileversion
% \GetFileInfo{caption3.sty}
%
% \title{The Implementation of
% \texorpdfstring{\thispackage\thanks{%^^A
-% This package has version number \fileversion, last revised \filedate.}}%^^A
+% This package has version number \docversion.}}%^^A
% {the caption kernel}}
% \author{Axel Sommerfeldt\\
% \url{https://gitlab.com/axelsommerfeldt/caption}}
-% \date{\filedate}
+% \date{\docdate}
% \maketitle
%
% \begin{abstract}
@@ -115,6 +117,56 @@
% \package{subfig} packages.
% \end{abstract}
%
+% \section*{Internal commands}
+%
+% These internal commands are save to use by other packages as well
+% since their interface will not change in future releases:
+% \begin{quote}\begin{tabular}{ll}
+% Internal command & Currently used by \\
+% \hline
+% |\caption@addcontentsline| & \package{floatrow} \\
+% |\caption@fnun| & \package{floatrow} \\
+% |\caption@ifinlist| & \package{floatrow} \\
+% |\caption@iftop| & \package{keyfloat}, \package{subfig} \\
+% |\caption@make| & \package{subfig} \\
+% |\caption@@make| & \package{floatrow} \\
+% |\caption@setautoposition| & \package{bidi} \\
+% |\caption@setoptions| & \package{floatrow} \\
+% |\caption@setposition| & \package{floatrow} \\
+% |\caption@switchdefault| & \emph{none} \\
+% \end{tabular}\end{quote}
+%
+% If your package wants to use any other internal command of the \package{caption3} package,
+% please write me an e-mail so we can define a proper interface together.
+%
+% Unfortunately these internal commands are used by other packages and therefore will likely
+% not change in the future, too, but I do not support them (and maybe I will change them anyway
+% and patch the other package on-the-fly instead, at least if it's unmaintained):
+% \begin{quote}\begin{tabular}{ll}
+% Internal command & Currently used by \\
+% \hline
+% |\caption@hangindent | & \package{bidi} \\
+% |\caption@@@make| & \package{floatrow} \\
+% |\caption@@par| & \package{bidi} \\
+% |\caption@parindent| & \package{bidi} \\
+% |\caption@set@bool| & \package{floatrow} \\
+% |\caption@setfont| & \package{floatrow} \\
+% |\caption@setkeys| & \package{floatrow} \\
+% |\caption@setstyle*| & \package{floatrow} \\
+% \hline
+% |\caption@hj@|\meta{name} & \package{floatrow} \\
+% |\caption@lsep@|\meta{name} & \package{floatrow} \\
+% |\caption@lsep@default| & \package{babel-hungarian} \\
+% |\caption@sty@|\meta{name} & \package{floatrow} \\
+% \end{tabular}\end{quote}
+%
+% Furthermore the \package{floatrow} package uses the undocumented option
+% |position=a| (as abbreviation of |position=auto|).
+%
+% The \package{lwarp} package uses a lot of internal commands as well,
+% but we are working on it on the Git branch \texttt{feature/lwarp}:
+% \url{https://gitlab.com/axelsommerfeldt/caption/-/tree/feature/lwarp}
+%
% \StopEventually{}
% \clearpage
% \tableofcontents
@@ -174,8 +226,7 @@
% \newcommand*\Note[2][Note]{\par{\small\emph{#1:} #2}\par}
%
% \changes{v1.0}{2003/12/20}{Rewritten; many new commands and features}
-% \changes{v1.0c}{2004/11/28}{Split into two packages:
-% \package{caption} \& \package{caption3}}
+% \changes{v1.0c}{2004/11/28}{Split into two packages: \package{caption} \& \package{caption3}}
%
% \iffalse
% --------------------------------------------------------------------------- %
@@ -191,38 +242,17 @@
%
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesPackage{caption3}[2020/01/03 v1.8h caption3 kernel (AR)]
-% \end{macrocode}
-%
-% \section{Workaround for bug in package \package{arabtex}}
-% \package{arabtex} re-defines \cs{@gobble} as not-long so the packages of the
-% \package{caption} package bundle are doomed to fail.
-% Since this fatal bug won't be fixed in \package{arabtex} but we are dependent on a
-% proper definition of \cs{@gobble}, \cs{@firstofone}, \cs{@firstoftwo}, \cs{@secondoftwo},
-% and so on we fix this here. (Sigh!)
-% \begin{macrocode}
-\providecommand\caption@FixArabTeX{%
- \def\caption@tempa##1{}%
- \ifx\caption@tempa\@gobble
- \PackageInfo{caption3}{Fixing ArabTeX}%
- \long\def\@gobble##1{}%
- \fi}
-% \end{macrocode}
-% Do the fix now and at |\begin{document}|, in case \package{arabtex} will be loaded after \package{caption}.
-% \begin{macrocode}
-\caption@FixArabTeX
-\AtBeginDocument{%
- \caption@FixArabTeX
- \let\caption@FixArabTeX\@undefined}
+\ProvidesPackage{caption3}[2020/10/21 v2.2e caption3 kernel (AR)]
% \end{macrocode}
%
% \section{Generic helpers}
%
% \begin{macro}{\@nameundef}
-% This is the opposite to |\@namedef| which is offered by the \LaTeX\ kernel.
-% We use it to remove the definition of some commands and keyval options after
-% |\begin{document}| (to save \TeX\ memory) and to remove caption options defined
-% with |\captionsetup|\oarg{type}.
+% |\@nameundef|\marg{command name}\\
+% is the opposite to |\@name|\-|def| which is offered by the \LaTeX\ kernel.
+% We use it to remove the definition of some commands and keyval options after
+% |\begin{document}| (to save \TeX\ memory) and to remove caption options defined
+% with |\caption|\-|setup|\oarg{type}.
% \begin{macrocode}
\providecommand*\@nameundef[1]{%
\expandafter\let\csname #1\endcsname\@undefined}
@@ -231,92 +261,106 @@
%
% \begin{macro}{\l@addto@macro}
% \changes{v1.5}{2013/04/26}{Revised}
-% The \LaTeXe\ kernel offers the internal helper macro |\g@addto@macro| which
-% globally adds tokens to existing macros, like in |\AtBeginDocument|.
-% This is the same but it works local, not global.
-% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname currentgrouplevel\endcsname\relax
- \PackageInfo{caption3}{TeX engine: TeX}
- \let\caption@ifeTeX\@secondoftwo
- \providecommand\l@addto@macro[2]{%
- \begingroup
- \toks@\expandafter{#1#2}%
- \xdef\caption@addto@temp{\the\toks@}%
- \endgroup
- \let#1\caption@addto@temp}
-\else
- \PackageInfo{caption3}{TeX engine: e-TeX}
- \let\caption@ifeTeX\@firstoftwo
- \providecommand\l@addto@macro[2]{%
- \edef#1{\unexpanded\expandafter{#1#2}}}
-\fi
+% \changes{v2.0}{2019/09/11}{Relies on \eTeX{} now}
+% |\l@addto@macro|\marg{command}\marg{code}\\
+% The \LaTeXe\ kernel offers the internal helper macro |\g@addto@macro| which
+% globally adds tokens to existing macros, like in |\AtBeginDocument|.
+% This one is the same but it works locally, not globally.
+% \begin{macrocode}
+\providecommand\l@addto@macro[2]{%
+ \edef#1{\unexpanded\expandafter{#1#2}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bothIfFirst}
+% \changes{v2.2}{2020/09/21}{Usage of \cs{caption@prepare@bothif} added}
% \begin{macro}{\bothIfSecond}
-% |\bothIfFirst| tests if the first argument is not empty, |\bothIfSecond|
-% tests if the second argument is not empty. If yes both arguments get
-% typeset, otherwise none of them.
+% \changes{v2.2}{2020/09/21}{Usage of \cs{caption@prepare@bothif} added}
+% |\bothIfFirst|\marg{code no. 1}\marg{code no. 2}\\
+% |\bothIfSecond|\marg{code no. 1}\marg{code no. 2}\\
+% |\bothIfFirst| tests if the first argument is not empty, |\bothIfSecond|
+% tests if the second argument is not empty. If yes both arguments get
+% typeset, otherwise none of them.
% \begin{macrocode}
-\def\bothIfFirst#1#2{%
- \protected@edef\caption@tempa{#1}%
- \ifx\caption@tempa\@empty \else
- #1#2%
- \fi}
+\def\bothIfFirst#1#2{\caption@bothif{#1}{#1#2}}
+% \end{macrocode}
+% \begin{macrocode}
+\def\bothIfSecond#1#2{\caption@bothif{#2}{#1#2}}
% \end{macrocode}
% \begin{macrocode}
-\def\bothIfSecond#1#2{%
- \protected@edef\caption@tempa{#2}%
+\newcommand*\caption@bothif[2]{%
+ \begingroup
+ \caption@prepare@bothif
+ \protected@xdef\caption@tempa{#1}%
+ \endgroup
\ifx\caption@tempa\@empty \else
- #1#2%
+ #2%
\fi}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\caption@prepare@bothif}
+% \changes{v2.2}{2020/09/21}{This macro added}
+% |\caption@prepare@bothif|\\
+% re-defines anything which could disturb either |\both|\-|If|\-|First| or |\both|\-|If|\-|Second| check.
+% \begin{macrocode}
+\providecommand*\caption@prepare@bothif{}
+\g@addto@macro\caption@prepare@bothif{%
+ \let\inputencoding\@gobble}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\caption@ifundefined}
% \changes{v1.3a}{2011/08/12}{This macro added}
% \changes{v1.3b}{2011/08/18}{Made expandable}
-% Similar to \cs{@ifundefined} offered by the \LaTeX kernel,
-% but takes a macro as argument instead of a macro name.
+% |\caption@ifundefined|\marg{command}\marg{yes-code}\marg{no-code}\\
+% is similar to \cs{@ifundefined} offered by the \LaTeX kernel,
+% but takes a command as argument instead of a command name.
% \begin{macrocode}
\newcommand*\caption@ifundefined[1]{%
- \ifx#1\@undefined
- \expandafter\@firstoftwo
- \else\ifx#1\relax
- \expandafter\expandafter\expandafter\@firstoftwo
+ \ifdefined#1%
+ \ifx#1\relax
+ \expandafter\expandafter\expandafter\@firstoftwo
+ \else
+ \expandafter\expandafter\expandafter\@secondoftwo
+ \fi
\else
- \expandafter\expandafter\expandafter\@secondoftwo
- \fi\fi}
+ \expandafter\@firstoftwo
+ \fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@ifdefined}
% \changes{v1.8e}{2018/05/11}{This macro added}
-% Similar to \cs{@ifundefined} offered by the \LaTeX kernel,
-% but takes a macro as argument instead of a macro name.
+% |\caption@ifdefined|\marg{command}\marg{yes-code}\marg{no-code}\\
+% is similar to \cs{@ifundefined} offered by the \LaTeX kernel,
+% but takes a command as argument instead of a command name.
% \begin{macrocode}
\newcommand*\caption@ifdefined[1]{%
- \ifx#1\@undefined
- \expandafter\@secondoftwo
- \else\ifx#1\relax
- \expandafter\expandafter\expandafter\@secondoftwo
+ \ifdefined#1%
+ \ifx#1\relax
+ \expandafter\expandafter\expandafter\@secondoftwo
+ \else
+ \expandafter\expandafter\expandafter\@firstoftwo
+ \fi
\else
- \expandafter\expandafter\expandafter\@firstoftwo
- \fi\fi}
+ \expandafter\@secondoftwo
+ \fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@ifinlist}
% \changes{v1.1}{2007/07/29}{Rewritten}
-% This helper macro checks if the first argument is in the comma separated
-% list which is offered as second argument. So for example
-% \begin{quote}
-% |\caption@ifinlist{frank}{axel,frank,olga,steven}{yes}{no}|
-% \end{quote}
-% would expand to |yes|.
+% |\caption@ifinlist|\marg{element}\marg{list}\marg{yes-code}\marg{no-code}\\
+% This helper command checks if the \meta{element} is in the comma separated
+% \meta{list}. So for example
+% \begin{quote}
+% |\caption@ifinlist{frank}{axel,frank,olga,steven}{yes}{no}|
+% \end{quote}
+% would expand to |yes|.\par
+% (Note: Since this command is used by the \package{floatrow} package as well
+% its syntax should not change.)
% \begin{macrocode}
\newcommand*\caption@ifinlist{%
\@expandtwoargs\caption@@ifinlist}
@@ -337,7 +381,9 @@
%
% \begin{macro}{\caption@ifin@list}
% \changes{v1.1}{2007/08/12}{This macro added}
-% |\caption@ifin@list|\marg{cmd}\marg{list entry}\marg{yes}\marg{no}
+% |\caption@ifin@list|\marg{cmd}\marg{element}\marg{yes-code}\marg{no-code}\\
+% is the same as |\caption@ifinlist| but with a command (containing a list)
+% instead of the list itself.
% \begin{macrocode}
\newcommand*\caption@ifin@list[2]{%
\caption@ifempty@list#1%
@@ -348,7 +394,9 @@
%
% \begin{macro}{\caption@g@addto@list}
% \changes{v1.1}{2007/07/29}{This macro added}
-% |\caption@g@addto@list|\marg{cmd}\marg{list entry}
+% |\caption@g@addto@list|\marg{cmd}\marg{element}\\
+% adds an element to a command containing a list.
+% (The command will get defined if it isn't defined yet.)
% \begin{macrocode}
\newcommand*\caption@g@addto@list[2]{%
\caption@ifempty@list#1{\gdef#1{#2}}{\g@addto@macro#1{,#2}}}
@@ -356,7 +404,8 @@
% \end{macro}
% \begin{macro}{\caption@l@addto@list}
% \changes{v1.1}{2007/07/29}{This macro added}
-% |\caption@l@addto@list|\marg{cmd}\marg{list entry}
+% |\caption@l@addto@list|\marg{cmd}\marg{element}\\
+% is the same as |\caption@g@addto@list| but works locally.
% \begin{macrocode}
\newcommand*\caption@l@addto@list[2]{%
\caption@ifempty@list#1{\def#1{#2}}{\l@addto@macro#1{,#2}}}
@@ -365,7 +414,10 @@
%
% \begin{macro}{\caption@g@removefrom@list}
% \changes{v1.1}{2007/07/29}{This macro added}
-% |\caption@g@removefrom@list|\marg{cmd}\marg{list entry}
+% |\caption@g@removefrom@list|\marg{cmd}\marg{element}\\
+% removes an element from a command containing a list.
+% \Note[Caveat]{\meta{cmd} will be expanded during this process since
+% \cs{@removeelement} is using \cs{edef} to build the new list.}
% \begin{macrocode}
\newcommand*\caption@g@removefrom@list[2]{%
\caption@l@removefrom@list#1{#2}%
@@ -374,9 +426,10 @@
% \end{macro}
% \begin{macro}{\caption@l@removefrom@list}
% \changes{v1.1}{2007/07/29}{This macro added}
-% |\caption@l@removefrom@list|\marg{cmd}\marg{list entry}\par
-% \Note[Caveat]{\meta{cmd} will be expanded during this process since
-% \cs{@removeelement} is using \cs{edef} to build the new list!}
+% |\caption@l@removefrom@list|\marg{cmd}\marg{element}\\
+% is the same as |\caption@g@removefrom@list| but works locally.
+% \Note[Caveat]{\meta{cmd} will be expanded during this process since
+% \cs{@removeelement} is using \cs{edef} to build the new list.}
% \begin{macrocode}
\newcommand*\caption@l@removefrom@list[2]{%
\caption@ifempty@list#1{}{\@expandtwoargs\@removeelement{#2}#1#1}}
@@ -385,19 +438,22 @@
%
% \begin{macro}{\caption@for@list}
% \changes{v1.1}{2007/07/29}{This macro added}
-% |\caption@for@list|\marg{cmd}\marg{code with \#1}
+% |\caption@for@list|\marg{cmd}\marg{code with \#1}\\
+% iterates all elements of the list (within \meta{cmd}) using the given
+% \meta{code}.
% \begin{macrocode}
\newcommand*\caption@for@list[2]{%
- \caption@ifempty@list#1{}{%
- \def\caption@tempb##1{#2}%
- \@for\caption@tempa:=#1\do{%
- \expandafter\caption@tempb\expandafter{\caption@tempa}}}}
+ \caption@ifempty@list#1{}%
+ {\def\caption@tempb##1{#2}%
+ \@for\caption@tempa:=#1\do{%
+ \expandafter\caption@tempb\expandafter{\caption@tempa}}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@ifempty@list}
% \changes{v1.1}{2007/07/29}{This macro added}
-% |\caption@ifempty@list|\marg{cmd}\marg{true}\marg{false}
+% |\caption@ifempty@list|\marg{cmd}\marg{yes-code}\marg{no-code}\\
+% This helper command checks if the list (within \meta{cmd}) is empty.
% \begin{macrocode}
\newcommand*\caption@ifempty@list[1]{%
\ifx#1\@undefined
@@ -416,30 +472,33 @@
%
% \pagebreak[3]
% \begin{macro}{\caption@setbool}
-% \begin{macro}{\caption@set@bool}
% \changes{v1.1}{2007/04/05}{\cs{caption@set@bool}\marg{cmd}\marg{value} added}
% \begin{macro}{\caption@ifbool}
+% \changes{v1.1}{2020/08/02}{\cs{caption@if@bool}\marg{value} added}
% \begin{macro}{\caption@undefbool}
-% For setting and testing boolean options we offer these three helper macros:
-% \begin{quote}
-% |\caption@setbool|\marg{name}\marg{value}\\
-% | |(with |value = false/true/no/yes/off/on/0/1|)\\
-% |\caption@ifbool|\marg{name}\marg{if-clause}\marg{else-clause}\\
-% |\caption@undefbool|\marg{name}
-% \end{quote}
+% For setting and testing boolean options we offer these three helper macros:
+% \begin{quote}
+% |\caption@setbool|\marg{name}\marg{value}\\
+% | |(with |value = false/true/no/yes/off/on/0/1|)\\
+% |\caption@ifbool|\marg{name}\marg{if-clause}\marg{else-clause}\\
+% |\caption@undefbool|\marg{name}
+% \end{quote}
% \begin{macrocode}
\newcommand*\caption@setbool[1]{%
\expandafter\caption@set@bool\csname caption@if#1\endcsname}
% \end{macrocode}
% \begin{macrocode}
\newcommand*\caption@set@bool[2]{%
- \caption@ifinlist{#2}{1,true,yes,on}{%
- \let#1\@firstoftwo
- }{\caption@ifinlist{#2}{0,false,no,off}{%
- \let#1\@secondoftwo
- }{%
- \caption@Error{Undefined boolean value `#2'}%
- }}}
+ \caption@if@bool{#2}{\let#1\@firstoftwo}{\let#1\@secondoftwo}}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@if@bool[1]{%
+ \caption@ifinlist{#1}{1,true,yes,on}%
+ {\@firstoftwo}%
+ {\caption@ifinlist{#1}{0,false,no,off}%
+ {}%
+ {\caption@Error{Undefined boolean value `#1'}}%
+ \@secondoftwo}}
% \end{macrocode}
% \begin{macrocode}
\newcommand*\caption@ifbool[1]{\@nameuse{caption@if#1}}
@@ -450,21 +509,31 @@
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
%
% \begin{macro}{\caption@teststar}
% \changes{v1.1}{2007/05/08}{This macro and its usage added}
% \changes{v1.1e}{2007/10/28}{\cs{caption@teststar@} added}
-% |\caption@teststar|\marg{cmd}\marg{star arg}\marg{non-star arg}\\
-% |\caption@teststar@|\marg{cmd}\marg{star arg}\marg{non-star arg}
+% |\caption@teststar|\marg{cmd}\marg{star-arg}\marg{non-star-arg}\\
+% expands \meta{cmd} with either argument \marg{star-arg} or
+% \meta{non-star-arg}, depending on if the next char is a star (or not).\par
+% |\caption@teststar@|\marg{cmd}\marg{star-arg}\marg{non-star-arg}\\
+% will test the catcode of the character \@ additionally.
% \begin{macrocode}
-\newcommand*\caption@teststar[3]{\@ifstar{#1{#2}}{#1{#3}}}
+\newcommand*\caption@teststar[3]{%
+ \@ifstar{#1{#2}}{#1{#3}}}
% \end{macrocode}
% \begin{macrocode}
\newcommand*\caption@teststar@[3]{%
\@ifstar{#1{#2}}{\caption@ifatletter{#1{#2}}{#1{#3}}}}
\AtBeginDocument{\let\caption@teststar@\caption@teststar}
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@ifatletter}
+% \changes{v1.1e}{2007/10/28}{This macro added}
+% |\caption@ifatletter|\marg{yes-code}\marg{no-code}\\
+% will either expand \meta{yes-code} or \meta{no-code},
+% depending on the catcode of the character \@.
% \begin{macrocode}
\newcommand*\caption@ifatletter{%
\ifnum\the\catcode`\@=11
@@ -472,6 +541,8 @@
\else
\expandafter\@secondoftwo
\fi}
+% \end{macrocode}
+% \begin{macrocode}
\AtBeginDocument{\let\caption@ifatletter\@secondoftwo}
% \end{macrocode}
% \end{macro}
@@ -479,7 +550,9 @@
% \begin{macro}{\caption@withoptargs}
% \changes{v1.1}{2007/08/12}{This macro added}
% \changes{v1.5}{2012/04/09}{This macro revised}
-% |\caption@withoptargs|\marg{cmd}
+% |\caption@withoptargs|\marg{cmd}\\
+% collects a star and all optional arguments, and expands \meta{cmd}
+% afterwards with the collected stuff as first argument.
% \begin{macrocode}
\newcommand*\caption@withoptargs[1]{%
\@ifstar
@@ -506,8 +579,8 @@
%
% \begin{macro}{\caption@gobble}
% \changes{v1.4}{2011/08/19}{This macro added}
-% |\caption@gobble*|\oarg{arg}\oarg{\ldots}\marg{arg}\par
-% Same as |\@gobble|, but gobbles optional arguments as well.
+% |\caption@gobble*|\oarg{arg}\oarg{\ldots}\marg{arg}\\
+% is similar to |\@gobble| but gobbles a star and optional arguments as well.
% \begin{macrocode}
\DeclareRobustCommand*\caption@gobble{%
\caption@withoptargs\@gobbletwo}
@@ -517,11 +590,11 @@
% \begin{macro}{\caption@AtBeginDocument}
% \changes{v1.1}{2007/04/13}{This macro and its usage added}
% \changes{v1.2e}{2010/01/09}{Adapted to the combine document class}
-% |\caption@AtBeginDocument*|\marg{code}\\
-% Same as |\AtBeginDocument| but the execution of code
-% will be surrounded by two |\PackageInfo|s.
-% The starred variant causes the code to be executed after all code
-% specified using the non-starred variant.
+% |\caption@AtBeginDocument*|\marg{code}\\
+% is similar to |\AtBeginDocument| but the execution of code will be
+% surrounded by two |\Package|\-|Info|s.
+% The starred variant causes the code to be executed after all code
+% specified using the non-starred variant.
% \begin{macrocode}
\let\caption@begindocumenthook\@empty
\let\caption@@begindocumenthook\@empty
@@ -557,7 +630,8 @@
%
% \begin{macro}{\caption@Info}
% \changes{v1.3}{2010/10/25}{Moved from package to kernel}
-% |\caption@Info|\marg{message}
+% |\caption@Info|\marg{message}\\
+% issues an info message (with code line indication).
% \begin{macrocode}
\newcommand*\caption@Info[1]{%
\PackageInfo{caption}{#1}}
@@ -565,10 +639,11 @@
% \end{macro}
% \begin{macro}{\caption@InfoNoLine}
% \changes{v1.3}{2010/10/25}{Moved from package to kernel}
-% |\caption@InfoNoLine|\marg{message}\\
-% \Note{The \cs{@gobble} at the end of the 2nd argument of
-% \cs{PackageInfo} suppresses the line number info.
-% See TLC2\cite{TLC2}, A.4.7, p885 for details.}
+% |\caption@InfoNoLine|\marg{message}\\
+% issues an info message without code line indication.
+% \Note{The \cs{@gobble} at the end of the 2nd argument of
+% \cs{PackageInfo} suppresses the line number info.
+% See TLC2\cite{TLC2}, A.4.7, p885 for details.}
% \begin{macrocode}
\newcommand*\caption@InfoNoLine[1]{%
\caption@Info{#1\@gobble}}
@@ -577,7 +652,8 @@
%
% \begin{macro}{\caption@Warning}
% \changes{v1.1c}{2007/10/14}{This macro added, will now be used for warnings}
-% |\caption@Warning|\marg{message}
+% |\caption@Warning|\marg{message}\\
+% issues a warning message (with code line indication).
% \begin{macrocode}
\newcommand*\caption@Warning[1]{%
\caption@WarningNoLine{#1\on@line}}
@@ -585,7 +661,8 @@
% \end{macro}
% \begin{macro}{\caption@WarningNoLine}
% \changes{v1.1c}{2007/10/14}{This macro added, will now be used for warnings}
-% |\caption@WarningNoLine|\marg{message}
+% |\caption@WarningNoLine|\marg{message}\\
+% issues a warning message without code line indication.
% \begin{macrocode}
\newcommand*\caption@WarningNoLine[1]{%
\PackageWarning{caption}{#1.^^J\caption@wh\@gobbletwo}}
@@ -600,21 +677,26 @@
% \changes{v1.0j}{2007/01/20}{This macro added, will now be used for errors}
% \changes{v1.0o}{2007/04/11}{Renamed from \cs{caption@error} to \cs{caption@Error}}
% \changes{v1.1b}{2007/09/18}{Usage of \cs{caption@Package} removed}
-% |\caption@Error|\marg{message}
+% \changes{v2.2a}{2020/09/28}{\cs{caption@eh} renamed to \cs{caption@@eh} and revised}
+% |\caption@Error|\marg{message}\\
+% issues an error message (with code line indication).
% \begin{macrocode}
\newcommand*\caption@Error[1]{%
- \PackageError{caption}{#1}\caption@eh}
+ \PackageError{caption}{#1}{\caption@@eh{caption}}}
% \end{macrocode}
% \begin{macrocode}
-\newcommand*\caption@eh{%
+\newcommand*\caption@@eh[1]{%
If you do not understand this error, please take a closer look\MessageBreak
- at the documentation of the `caption' package, especially the\MessageBreak
+ at the documentation of the `#1' package, especially the\MessageBreak
section about errors.\MessageBreak\@ehc}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@KV@err}
% \changes{v1.1b}{2007/09/18}{This macro added}
+% |\caption@KV@err|\marg{message}\\
+% will be used to issue an error while parsing the key-value (package)
+% options.
% \begin{macrocode}
\let\caption@KV@err\caption@Error
% \end{macrocode}
@@ -622,15 +704,15 @@
%
% \section{Using the keyval package}
%
-% We need the \package{keyval} package for option handling, so we load it here.
+% We need the \package{keyval} package for option handling, so we load it here.\par
+% \emph{TODO:} Use some recent stuff instead, for example kvdefinekey and kvsetkeys.
% \begin{macrocode}
\RequirePackage{keyval}[1997/11/10]
% \end{macrocode}
%
% \begin{macro}{\undefine@key}
-% |\undefine@key|\marg{family}\marg{key}\par
-% This helper macro is the opposite of |\define@key|, it removes a keyval
-% definition.
+% |\undefine@key|\marg{family}\marg{key}\\
+% is the opposite of |\define@key|, it removes a keyval definition.
% \begin{macrocode}
\providecommand*\undefine@key[2]{%
\@nameundef{KV@#1@#2}\@nameundef{KV@#1@#2@default}}
@@ -640,8 +722,9 @@
% \begin{macro}{\@onlypreamble@key}
% \changes{v1.1}{2007/07/22}{This macro added}
% \changes{v1.1e}{2007/11/01}{\cs{KV@err} will be used now instead of \cs{@notprerr}}
-% |\onlypreamble@key|\marg{family}\marg{key}\par
-% Analogous to |\@onlypreamble| from \LaTeXe.
+% |\onlypreamble@key|\marg{family}\marg{key}\\
+% marks a keyval definition only valid in the document preamble, analogous to
+% |\@only|\-|preamble| from \LaTeXe.
% \begin{macrocode}
\providecommand*\@preamble@keys{}
\providecommand*\@onlypreamble@key[2]{\@cons\@preamble@keys{{#1}{#2}}}
@@ -660,13 +743,12 @@
% \end{macro}
%
% \begin{macro}{\DeclareCaptionOption}
-% |\DeclareCaptionOption|\marg{option}\oarg{default value}\marg{code}\\
-% |\DeclareCaptionOption*|\marg{option}\oarg{default value}\marg{code}\par
-% We declare our options using these commands (instead of using
-% |\DeclareOption| offered by \LaTeXe), so the keyval package is used.
-% The starred form makes the option available during the lifetime of the
-% current package only, so they can be used with |\usepackage|, but
-% \emph{not} with |\captionsetup| later on.
+% |\DeclareCaptionOption*|\marg{option}\oarg{default value}\marg{code}\\
+% We declare our options using these commands (instead of using
+% |\Declare|\-|Option| offered by \LaTeXe), so the keyval package is used.
+% The starred form makes the option available during the lifetime of the
+% current package only, so they can be used with |\use|\-|package|, but
+% \emph{not} with |\caption|\-|setup| later on.
% \begin{macrocode}
\newcommand*\DeclareCaptionOption{%
\caption@teststar\caption@declareoption\AtEndOfPackage\@gobble}
@@ -680,15 +762,15 @@
% \begin{macrocode}
\newcommand*\caption@declare@option{%
\define@key{caption}}
-%% no \@onlypreamble\caption@declare@option, will be used by \captionsetup
+%% no \@onlypreamble\caption@declare@option since it will be used by \captionsetup
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\DeclareCaptionOptionNoValue}
% \changes{v1.1c}{2007/10/06}{This macro added}
-% |\DeclareCaptionOptionNoValue|\marg{option}\marg{code}\\
-% |\DeclareCaptionOptionNoValue*|\marg{option}\marg{code}\par
-% Same as \cs{DeclareCaptionOption} but issues an error if a value is given.
+% |\DeclareCaptionOptionNoValue*|\marg{option}\marg{code}\\
+% is the same as |\DeclareCaptionOption| but issues an error if a value is
+% given.
% \begin{macrocode}
\newcommand*\DeclareCaptionOptionNoValue{%
\caption@teststar\caption@declareoption@novalue\AtEndOfPackage\@gobble}
@@ -713,8 +795,8 @@
%
% \begin{macro}{\ifcaptionsetup@star}
% \changes{v1.2a}{2008/01/12}{This macro added}
-% If the starred form of |\captionsetup| is used, this will be set to |true|.
-% (It will be reset to |false| at the end of |\caption@setkeys|.)
+% If the starred form of |\caption|\-|setup| is used, this will be set to |true|.
+% (It will be reset to |false| at the end of |\caption@set|\-|keys|.)
% \begin{macrocode}
\newif\ifcaptionsetup@star
% \end{macrocode}
@@ -728,13 +810,13 @@
% \changes{v1.2a}{2008/01/12}{\cs{ifcaptionsetup@star} will be set now}
% \changes{v1.5}{2012/04/09}{Support of multiple optional arguments added}
% \changes{v1.8h}{2020/01/03}{Syntax check of saved options added}
-% |\captionsetup|\oarg{type}\ldots\marg{keyval-list of options}\\
-% |\captionsetup*|\oarg{type}\ldots\marg{keyval-list of options}\par
-% If the optional argument `type' is specified, we simply save or append
-% the option list, otherwise we `execute' it with |\setkeys|.
-% (The non-starred variant issues a warning if \meta{keyval-list of options}
-% is not used later on.)
-% \Note{The starred variant will be used inside packages automatically.}
+% |\captionsetup*|\oarg{type}\ldots\marg{keyval-list of options}\\
+% applies the given list of options.
+% If the optional argument `type' is specified, we simply save or append
+% the option list, otherwise we `execute' it with |\set|\-|keys|.
+% (The non-starred variant issues a warning if \meta{keyval-list of options}
+% is not used later on.)
+% \Note{The starred variant will be used inside packages automatically.}
% \begin{macrocode}
\newcommand*\captionsetup{%
\caption@teststar@\@captionsetup\@gobble\@firstofone}
@@ -742,14 +824,15 @@
% \begin{macrocode}
\newcommand*\@captionsetup[1]{%
\captionsetup@startrue#1\captionsetup@starfalse
- \@ifnextchar[\caption@setup@options\caption@setup}
+ \@ifnextchar[%]
+ \caption@setup@options\caption@setup}
% \end{macrocode}
% \begin{macrocode}
\newcommand*\caption@setup{\caption@setkeys{caption}}
% \end{macrocode}
% \begin{macrocode}
\def\caption@setup@options[#1]{%
- \@ifnextchar[%
+ \@ifnextchar[%]
{\caption@stepthecounter
\caption@withoptargs{\@expandtwoargs
\caption@setup@options@i{#1}{@\caption@thecounter}}}%
@@ -772,8 +855,8 @@
%
% \begin{macro}{\caption@checkoptions}
% \changes{v1.8h}{2020/01/03}{This macro added}
-% Check the syntax of the given options by executing them inside a group.
-% (This way the \package{ragged2e} package check will be done for these options, too.)
+% |\caption@checkoptions|\marg{keyval-list of options}\\
+% checks the syntax of the given options by executing them inside a group.
% \begin{macrocode}
\newcommand*\caption@checkoptions[1]{%
\begingroup
@@ -781,11 +864,22 @@
\caption@setup{#1}%
\endgroup}
% \end{macrocode}
-% Some caption options depend on the definition of |\@captype|,
-% so we set it to |figure| before executing them.
% \begin{macrocode}
-\newcommand*\caption@prepare@optioncheck{%
- \def\@captype{figure}}
+\providecommand*\caption@prepare@optioncheck{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IfCaptionOptionCheck}
+% \changes{v1.10}{2020/05/10}{This macro added}
+% |\IfCaptionOptionCheck|\marg{yes-code}\marg{no-code}\\
+% executes the \meta{yes-code} if options are just checked for syntax,
+% and \meta{no-code} if not.
+% \begin{macrocode}
+\let\IfCaptionOptionCheck\@secondoftwo
+% \end{macrocode}
+% \begin{macrocode}
+\g@addto@macro\caption@prepare@optioncheck{%
+ \let\IfCaptionOptionCheck\@firstoftwo}
% \end{macrocode}
% \end{macro}
%
@@ -794,12 +888,11 @@
% \changes{v1.1}{2007/08/17}{Starred variant added}
% \changes{v1.1e}{2007/07/27}{Inside packages the starred variant will be used automatically}
% \changes{v1.2}{2007/11/16}{Bugfix 07-11-09: `space hack' added}
-% |\clearcaptionsetup|\oarg{option}\marg{type}\\
-% |\clearcaptionsetup*|\oarg{option}\marg{type}\par
-% This removes the saved option list associated with \meta{type}.
-% If \meta{option} is given, only this option will be removed from the list.
-% (The starred variant does not issue warnings.)
-% \Note{The starred variant will be used inside packages automatically.}
+% |\clearcaptionsetup*|\oarg{option}\marg{type}\\
+% removes the saved option list associated with \meta{type}.
+% If \meta{option} is given, only this option will be removed from the list.
+% (The starred variant does not issue warnings.)
+% \Note{The starred variant will be used inside packages automatically.}
% \begin{macrocode}
\newcommand*\clearcaptionsetup{%
\caption@teststar@\@clearcaptionsetup\@gobble\@firstofone}
@@ -857,9 +950,9 @@
% \changes{v1.0d}{2005/05/03}{Optimized for memory usage}
% \changes{v1.1}{2007/07/29}{Bugfix: Does not expand option list anymore}
% \changes{v1.2}{2007/11/16}{Bugfix 07-11-09: `space hack' added}
-% |\showcaptionsetup|\oarg{package}\marg{type}\par
-% This comes for debugging issues: It shows the saved option list which
-% is associated with \meta{type}.
+% |\showcaptionsetup|\oarg{package}\marg{type}\\
+% shows the saved option list which is associated with \meta{type}
+% (as warning message).
% \begin{macrocode}
\newcommand*\showcaptionsetup[2][\@firstofone]{%
\@bsphack
@@ -891,14 +984,9 @@
% \changes{v1.2}{2007/12/03}{Definition of \cs{caption@iftypewarning} removed}
% \changes{v1.3}{2010/09/05}{Starred variant added}
% \changes{v1.4b}{2012/01/12}{Starred variant removed}
-% |\caption@setoptions|\marg{type or environment or\ldots}\par
-% Caption options which have been saved with |\captionsetup|\oarg{type} can
-% be executed by using this command.
-% It simply executes the saved option list (and clears it afterwards),
-% if there is any.
-% \iffalse
-% (The starred variant do not clear the option list.)
-% \fi
+% |\caption@setoptions|\marg{type or environment or\ldots}\\
+% applies caption options which have been saved with |\caption|\-|setup|\oarg{type}.
+% To prevent multiple application the list will be cleared (locally) afterwards.
% \begin{macrocode}
\newcommand*\caption@setoptions[1]{%
\caption@Debug{options=#1}%
@@ -918,19 +1006,19 @@
% \begin{macro}{\caption@removefromoptlist}
% \changes{v1.1}{2007/07/22}{This macro added}
% \changes{v1.2c}{2008/08/24}{Fatal typo corrected}
-% |\caption@addtooptlist|\marg{type}\\
-% |\caption@removefromoptlist|\marg{type}\par
-% Adds or removes an \meta{type} to the list of unused caption options.
-% Note that the catcodes of \meta{type} are sanitized here so removing
-% \meta{type} from the list do not fail when the \package{float} package
-% is used (since |\float@getstyle| gives a result which tokens have catcode
-% 12 $=$ ``other'').
+% |\caption@addtooptlist|\marg{type}\\
+% |\caption@removefromoptlist|\marg{type}\\
+% adds or removes an \meta{type} to the list of unused caption options.
+% Note that the catcodes of \meta{type} are sanitized here so removing
+% \meta{type} from the list do not fail when the \package{float} package
+% is used (since |\float@getstyle| gives a result which tokens have catcode
+% 12 $=$ ``other'').
% \begin{macrocode}
\newcommand*\caption@addtooptlist[1]{%
- \@ifundefined{caption@opt@#1@lineno}{%
- \caption@dooptlist\caption@g@addto@list{#1}%
- \expandafter\xdef\csname caption@opt@#1@lineno\endcsname{\the\inputlineno}%
- }{}}
+ \@ifundefined{caption@opt@#1@lineno}%
+ {\caption@dooptlist\caption@g@addto@list{#1}%
+ \expandafter\xdef\csname caption@opt@#1@lineno\endcsname{\the\inputlineno}}%
+ {}}
% \end{macrocode}
% \begin{macrocode}
\newcommand*\caption@removefromoptlist[1]{%
@@ -946,10 +1034,10 @@
% \end{macrocode}
% \begin{macrocode}
\AtEndDocument{%
- \caption@for@list\caption@optlist{%
- \caption@WarningNoLine{%
- Unused \string\captionsetup[#1]
- on input line \csname caption@opt@#1@lineno\endcsname}}}
+ \caption@for@list\caption@optlist
+ {\caption@WarningNoLine{%
+ Unused \string\captionsetup[#1]
+ on input line \csname caption@opt@#1@lineno\endcsname}}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -964,10 +1052,10 @@
% \changes{v1.2a}{2008/01/12}{\cs{captionsetup@starfalse} added}
% \changes{v1.2d}{2009/09/30}{Bugfix 09-09-29: Missing error handler will be defined automatically}
% \changes{v1.4}{2011/08/24}{Redefinition of \cs{XKV@err} added}
-% |\caption@setkeys|\oarg{package}\marg{family}\marg{key-values}\par
-% This one simply calls |\setkeys|\marg{family}\marg{key-values}
-% but lets the error messages not refer to the \package{keyval} package,
-% but to the \meta{package} package instead.
+% |\caption@setkeys|\oarg{package}\marg{family}\marg{key-values}\\
+% expands to |\setkeys|\marg{family}\marg{key-values},
+% but lets the error messages not refer to the \package{keyval} package
+% but to the \meta{package} package instead.
% \begin{macrocode}
\newcommand*\caption@setkeys{\@dblarg\caption@@setkeys}
% \end{macrocode}
@@ -991,7 +1079,7 @@
\def\XKV@err{\let\@tempa\XKV@tkey\KV@err}%
% \end{macrocode}
% \begin{macrocode}
- \caption@Debug{\protect\setkeys{#2}{#3}}%
+ \caption@Debug{\noexpand\setkeys{#2}{#3}}%
\setkeys{#2}{#3}%
% \end{macrocode}
% \begin{macrocode}
@@ -1014,9 +1102,9 @@
% \begin{macro}{\caption@ExecuteOptions}
% \changes{v1.1}{2007/07/15}{This macro added}
% \changes{v1.3}{2010/09/04}{Depends on package now}
-% |\caption@ExecuteOptions|\marg{package}\marg{key-values}\par
-% We execute our options using the keyval interface, so we use this one
-% instead of |\ExecuteOptions| offered by \LaTeXe.
+% |\caption@ExecuteOptions|\marg{package}\marg{key-value options}\\
+% applies the given options using the keyval interface, so we use this one
+% instead of |\Execute|\-|Options| offered by \LaTeXe.
% \begin{macrocode}
\newcommand*\caption@ExecuteOptions[2]{%
\expandafter\@expandtwoargs\csname caption@setkeys@#1\endcsname{#1}{#2}}%
@@ -1025,21 +1113,17 @@
% \end{macro}
%
% \begin{macro}{\caption@ProcessOptions}
-% \changes{v1.0a}{2004/01/23}{Bugfix, see
-% \purett{news:400D360C.9678329F@gmx.net} for details}
-% \changes{v1.0g}{2006/01/03}{Improvement, uses \cs{caption@setkeys}
-% instead of \cs{setkeys}}
-% \changes{v1.0h}{2006/02/23}{Bugfix, now processes only those global
-% options which have a default value}
-% \changes{v1.0j}{2007/01/30}{\cs{ProcessOptionsWithKV} renamed to
-% \cs{caption@ProcessOptions} and moved from the package to the kernel}
-% \changes{v1.1}{2007/04/17}{Star variant added}
-% |\caption@ProcessOptions*|\marg{package}\par
-% We process our options using the keyval package, so we use this one
-% instead of |\ProcessOptions| offered by \LaTeXe.
-% The starred variant do not process the global options.
-% (This code was taken from the \package{hyperref} package\cite{hyperref}
-% \version{6.74} and improved.)
+% \changes{v1.0a}{2004/01/23}{Bugfix, see \purett{news:400D360C.9678329F@gmx.net} for details}
+% \changes{v1.0g}{2006/01/03}{Improvement, uses \cs{caption@setkeys} instead of \cs{setkeys}}
+% \changes{v1.0h}{2006/02/23}{Bugfix, now processes only those global options which have a default value}
+% \changes{v1.0j}{2007/01/30}{\cs{ProcessOptionsWithKV} renamed to \cs{caption@ProcessOptions} and moved from the package to the kernel}
+% \changes{v1.1}{2007/04/17}{Starred variant added}
+% |\caption@ProcessOptions*|\marg{package}\\
+% processes the given options using the keyval package, so we use this one
+% instead of |\Process|\-|Options| offered by \LaTeXe.
+% The starred variant does not process the global options.
+% (This code was taken from the \package{hyperref} package\cite{hyperref}
+% \version{6.74} and modified.)
% \begin{macrocode}
\newcommand*\caption@ProcessOptions{%
\caption@teststar\caption@@ProcessOptions\@gobble\@firstofone}
@@ -1072,23 +1156,23 @@
%
% \begin{macro}{\caption@SetupOptions}
% \changes{v1.3}{2010/09/04}{This macro added}
-% |\caption@SetupOptions|\marg{package}\marg{code}\par
-% After calling this macro |\caption@ExecuteOptions| and
-% |\usepackage|\oarg{options}\marg{package}
-% will both be mapped to \meta{code} with \meta{package} and \meta{options}
-% as arguments |#1| and |#2|. (This helps avoiding ``Option clash'' errors.)
-% \begin{macrocode}
-\newcommand*\caption@packagelist{}
-\@onlypreamble\caption@packagelist
-% \end{macrocode}
+% |\caption@SetupOptions|\marg{package}\marg{code}\\
+% After application of this command |\caption@Execute|\-|Options| and
+% |\use|\-|package| will both be mapped to \meta{code} with \meta{package}
+% and \meta{options} as arguments |#1| and |#2|.
+% (This helps avoiding ``Option clash'' errors.)
% \begin{macrocode}
\newcommand\caption@SetupOptions[2]{%
\@namedef{caption@setkeys@#1}##1##2{#2}%
\expandafter\@onlypreamble\csname caption@setkeys@#1\endcsname
- \@cons\caption@packagelist{{#1}}}
+ \@cons\caption@SetupOptions@list{{#1}}}
\@onlypreamble\caption@SetupOptions
% \end{macrocode}
% \begin{macrocode}
+\newcommand*\caption@SetupOptions@list{}
+\@onlypreamble\caption@SetupOptions@list
+% \end{macrocode}
+% \begin{macrocode}
\let\caption@onefilewithoptions\@onefilewithoptions
\def\@onefilewithoptions#1[#2]{%
\begingroup
@@ -1104,12 +1188,290 @@
\caption@ExecuteOptions{#1}{#2}%
\caption@onefilewithoptions{#1}[]}%
\fi}
- \caption@packagelist
+ \caption@SetupOptions@list
\@tempa}
\@onlypreamble\caption@onefilewithoptions
% \end{macrocode}
% \end{macro}
%
+% \section{Declaring and setting key values}
+%
+% \begin{macro}{\caption@decl}
+% \changes{v2.0}{2019/09/10}{This macro added}
+% |\caption@decl|\oarg{command}\marg{option}\marg{name}\\
+% is used for declaring boxes, fonts, formats etc.
+% (It defines |\caption@|\meta{option}|@|\meta{name}
+% using the given \meta{command}.)
+% \begin{macrocode}
+\newcommand*\caption@decl[3][\def]{%
+ \global\long\expandafter#1\csname caption@#2@#3\endcsname}
+\@onlypreamble\caption@decl
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@ifdecl}
+% \changes{v2.0}{2019/09/10}{This macro added}
+% |\caption@ifdecl|\marg{option}\marg{name}\marg{yes-code}\marg{no-code}\\
+% checks if the given \meta{option} and \meta{name} combination is
+% already declared.
+% \begin{macrocode}
+\newcommand*\caption@ifdecl[2]{%
+ \@ifundefined{caption@#1@#2}\@secondoftwo\@firstoftwo}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@checkdecl}
+% \changes{v2.0}{2019/09/10}{This macro added}
+% |\caption@checkdecl|\marg{option}\marg{name}\marg{yes-code}\\
+% behaves similar to |\caption@if|\-|decl| but issues an error message if the
+% given \meta{option} plus \meta{name} is not defined.
+% \begin{macrocode}
+\newcommand*\caption@checkdecl[2]{%
+ \caption@ifdecl{#1}{#2}%
+ \@firstofone
+ {\caption@Error{Undefined #1 `#2'}%
+ \@gobble}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@set}
+% \changes{v2.0}{2019/09/10}{This macro added}
+% \changes{v2.0}{2020/07/26}{Uses \cs{def} instead of \cs{let} internally}
+% |\caption@set|\marg{option}\marg{name}\\
+% sets the declared \meta{option} to \meta{name}, for example
+% |label|\-|format| to |simple|.
+% Note that since version \version{2.0} future changes to \meta{name}
+% (via |\caption@decl|) will effect the outcome,
+% for example |\caption@decl{labelformat}{simple}\ldots| will not only change
+% the definition of the label format |simple| but also effect the current
+% label format if set to |simple| (via |\caption@set|).
+% \begin{macrocode}
+\newcommand*\caption@set{%
+ \caption@maparg\caption@@set}%
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@@set[3]{%
+ \caption@checkdecl{#1}{#3}{%
+% \expandafter\edef\csname caption@@#2\endcsname{#3}% could be used for debugging
+ \expandafter\def\csname caption@#2\expandafter\endcsname\expandafter{\csname caption@#1@#3\endcsname}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SetCaptionDefault}
+% \changes{v2.0}{2019/09/10}{This macro added}
+% \changes{v2.0}{2020/07/28}{Check for `default' added to prevent infinite loop}
+% |\SetCaptionDefault*|\marg{option}\marg{name}\\
+% sets the default value for the \meta{option}.
+% The starred variant is only relevant for setting default values for lengths
+% like |margin|. (See definition of |\caption@set|\-|default@length| for
+% details.)
+% \begin{macrocode}
+\newcommand*\SetCaptionDefault{%
+ \caption@teststar\caption@setdefault\def\edef}
+\@onlypreamble\SetCaptionDefault
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@setdefault[2]{%
+ \@ifundefined{caption@setdefault@#2}%
+ {\caption@maparg\caption@@setdefault}%
+ {\@nameuse{caption@setdefault@#2}{#1}}%
+ {#2}}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@@setdefault[3]{%
+ \caption@ifdefault{#3}%
+ {\caption@Error{Invalid argument for \string\SetCaptionDefault: `#3'}}% would cause an infinite loop otherwise
+ {\caption@@set{#1}{#2@default}{#3}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@ifdefault}
+% \changes{v2.0}{2020/08/23}{This macro added}
+% |\caption@ifdefault|\marg{value}\marg{yes-code}\marg{no-code}\\
+% expands to \meta{yes-code} if the \meta{value} expands to `default',
+% and to \meta{no-code} otherwise.
+% \begin{macrocode}
+\newcommand*\caption@ifdefault{\caption@ifequal{default}}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@ifequal[2]{%
+ \edef\caption@tempa{#1}%
+ \edef\caption@tempb{#2}%
+ \ifx\caption@tempa\caption@tempb
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@setmapping}
+% \changes{v2.0}{2020/08/23}{This macro added}
+% |\caption@setmapping|\marg{source option}\marg{destination option}\\
+% sets a mapping from the \meta{source option} to the
+% \meta{destination option}, for example |label|\-|font| to |font|
+% since |label|\-|font| does not have any own definitions but shares
+% them with |font|.
+% \begin{macrocode}
+\newcommand*\caption@setmapping[2]{%
+ \@namedef{caption@map@#1}{#2}}
+\@onlypreamble\caption@setmapping
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@maparg}
+% \changes{v2.0}{2020/08/23}{This macro added}
+% |\caption@maparg|\marg{command}\marg{option}\\
+% similar to |\@dblarg| but either duplicates the given \meta{option} or
+% expands it to \meta{destination option} plus \meta{option} if a mapping
+% was defined for the given option (via |\caption@set|\-|mapping|).
+% \begin{macrocode}
+\newcommand*\caption@maparg[2]{%
+ \@ifundefined{caption@map@#2}%
+ {#1{#2}}%
+ {#1{\csname caption@map@#2\endcsname}}%
+ {#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@switchdefault}
+% \changes{v2.0}{2020/08/01}{This macro added}
+% |\caption@switchdefault\marg{option}|\marg{code with \#1}\marg{name}\\
+% like |\Set|\-|Caption|\-|Default| but first expands the given code with the
+% to-be-overwritten internal command as argument, so it can be stored (and
+% restored later on).
+% The main purpose of this command is switching default settings in
+% \package{babel} language packages, e.g.:
+% \begin{quote}|\caption@switchdefault{labelfont}{\babel@save #1}{sc}|\end{quote}
+% \begin{macrocode}
+\def\caption@switchdefault#1#2{%
+ \def\caption@tempa##1{#2}%
+ \expandafter\caption@tempa\csname caption@#1@default\endcsname
+ \caption@setdefault\def{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@restoredefault}
+% \changes{v2.0}{2020/08/01}{This macro added}
+% |\caption@restoredefault\marg{option}|\marg{command}\\
+% restores a default setting which was stored to \meta{command} before
+% (via |\caption@switch|\-|default|).
+% \begin{macrocode}
+\def\caption@restoredefault#1#2{%
+ \caption@checkdecl{#1}{default}{%
+ \caption@ifdefined#2{%
+ \expandafter\let\csname caption@#1@default\endcsname#2%
+ \let#2\@undefined}{}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SetCaptionFallback}
+% \changes{v2.2}{2020/09/21}{This macro added}
+% |\SetCaptionFallback|\marg{option}\marg{name}\\
+% sets the fallback value for the \meta{option}.
+% \begin{macrocode}
+\newcommand*\SetCaptionFallback{%
+ \caption@maparg\caption@@setfallback}
+\@onlypreamble\SetCaptionFallback
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@@setfallback[3]{%
+ \caption@ifequal{fallback}{#3}%
+ {\caption@Error{Invalid argument for \string\SetCaptionFallback: `#3'}}% would cause an infinite loop otherwise
+ {\caption@@set{#1}{#2@fallback}{#3}}}
+\@onlypreamble\caption@@setfallback
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@decl@package}
+% \changes{v2.0}{2020/07/26}{This macro added}
+% |\caption@decl@package|\marg{option}\marg{cmd}\oarg{package}\marg{name}\ldots\\
+% Helper command to declare a caption package option value which is dependent
+% on the existence of a specific package, for example the |font| value
+% |one|\-|half|\-|spacing| which is dependent on the \package{setspace}
+% package.
+% \begin{macrocode}
+\newcommand*\caption@decl@package[2]{%
+ \@ifnextchar[%]
+ {\caption@declare@package{#1}{#2}}%
+ {\caption@declarepackage{#1}{#2}}}
+\@onlypreamble\caption@decl@package
+% \end{macrocode}
+% \begin{macrocode}
+\def\caption@declare@package#1#2[#3]#4{%
+ \global\@namedef{caption@#1@#4@package}{#3}%
+ #2{#4}}
+\@onlypreamble\caption@declare@package
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@declarepackage[3]{%
+ \global\@nameundef{caption@#1@#3@package}%
+ #2{#3}}
+\@onlypreamble\caption@declarepackage
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@load@package}
+% \changes{v2.0}{2020/07/26}{This macro added}
+% |\caption@load@package|\marg{option}\marg{value}\\
+% If the given option value needs a package, it will be loaded automatically.
+% \begin{macrocode}
+\newcommand*\caption@load@package[2]{%
+ \expandafter\let\expandafter\caption@tempa\csname caption@#1@#2@package\endcsname
+ \caption@ifdefined\caption@tempa
+ {\caption@requirepackage\caption@tempa{#1=#2}}%
+ {}}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Declaring and setting lengths}
+%
+% \begin{macro}{\DeclareCaptionLength}
+% \changes{v2.0}{2020/08/09}{This macro added}
+% |\DeclareCaptionLength|\marg{name}\marg{default value}\\
+% \begin{enumerate}
+% \item Defines a new length (dimension)
+% \item Installes a hook for |\caption@set|\-|default| so
+% |\caption@set|\-|default@length| will be used to set a default
+% value for this length
+% \item Sets a default value using |\Set|\-|Caption|\-|Default*|.
+% \end{enumerate}
+% \begin{macrocode}
+\newcommand*\DeclareCaptionLength[1]{%
+ \expandafter\newdimen\csname caption#1\endcsname
+ \@namedef{caption@setdefault@#1}##1{%
+ \caption@setdefault@length{##1}}%
+ \SetCaptionDefault*{#1}}
+\@onlypreamble\DeclareCaptionLength
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@setdefault@length}
+% \changes{v2.0}{2020/08/09}{This macro added}
+% |\caption@setdefault@length*|\marg{cmd}\marg{name}\marg{value}\\
+% sets a default value for the given \meta{length}, either using |\def|
+% (if the starred variant is used) or |\edef| (if the non-starred variant is
+% used).
+% \begin{macrocode}
+\newcommand*\caption@setdefault@length[3]{%
+ \expandafter#1\csname caption#2@default\endcsname{#3}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@setlength}
+% \changes{v2.0}{2020/08/09}{This macro added}
+% |\caption@setlength|\marg{name}\marg{value}\\
+% sets a length to either the given \meta{value} or to the default value if
+% \meta{value} is `default'.
+% \begin{macrocode}
+\newcommand*\caption@setlength[2]{%
+ \caption@ifdefault{#2}%
+ {\expandafter\let\expandafter\caption@tempa\csname caption#1@default\endcsname}%
+ {\def\caption@tempa{#2}}%
+ \expandafter\setlength\csname caption#1\endcsname\caption@tempa}
+% \end{macrocode}
+% \end{macro}
+%
% \section{Margin resp. width}
% \changes{v1.0n}{2007/04/01}{\cs{captionmarginx} renamed to \cs{captionmargin@}}
% \changes{v1.0n}{2007/04/03}{Option `twoside' added}
@@ -1118,17 +1480,17 @@
%
% \begin{macro}{\captionmargin}
% \begin{macro}{\captionwidth}
-% |\captionmargin| and |\captionwidth| contain the extra margin
-% resp. the total width used for captions. Please never set these values in
-% a direct way, they are just accessible in user documents to provide
-% compatibility to \version{1.x}.\par
-% Note that we can only set one value at a time, `margin' \emph{or} `width'.
-% If |\captionwidth| is not zero we will take this value afterwards,
-% otherwise |\captionmargin| and |\captionmargin@|.
-% \begin{macrocode}
-\newdimen\captionmargin
-\newdimen\captionmargin@
-\newdimen\captionwidth
+% |\captionmargin| and |\captionwidth| contain the extra margin
+% resp. the total width used for captions. Please never set these values in
+% a direct way, they are just accessible in user documents to provide
+% compatibility to \version{1.x} of the \package{caption} package.\par
+% Note that we can only set one value at a time, `margin' \emph{or} `width'.
+% If |\caption|\-|width| is not zero we will take this value afterwards,
+% otherwise |\caption|\-|margin| and |\caption|\-|margin@|.
+% \begin{macrocode}
+\DeclareCaptionLength{margin}{0pt}
+\DeclareCaptionLength{margin@}{\the\captionmargin}
+\DeclareCaptionLength{width}{0pt}
\newdimen\caption@tempdima
% \end{macrocode}
% \end{macro}
@@ -1149,6 +1511,7 @@
% \begin{macrocode}
\DeclareCaptionOption{twoside}[1]{\caption@set@bool\caption@iftwoside{#1}}
\DeclareCaptionOptionNoValue{oneside}{\caption@set@bool\caption@iftwoside0}
+\caption@set@bool\caption@iftwoside{\if@twoside 1\else 0\fi}
% \end{macrocode}
% \begin{macrocode}
\DeclareCaptionOption{minmargin}{\caption@setoptcmd\caption@minmargin{#1}}
@@ -1157,17 +1520,14 @@
%
% \begin{macro}{\setcaptionmargin}
% \changes{v1.0f}{2005/10/24}{Renamed from \cs{caption@setmargin} to \cs{setcaptionmargin}}
-% \changes{v1.0f}{2005/10/24}{\cs{setcaptionmargin} enhanced so it can take
-% left+right margin}
+% \changes{v1.0f}{2005/10/24}{\cs{setcaptionmargin} enhanced so it can take left+right margin}
% \changes{v1.1}{2007/08/11}{Starred variant added}
-% \changes{v1.1}{2007/08/12}{\cs{setlength}\cs{captionmargin} \&
-% \cs{setlength}\cs{captionmargin@} swapped so
-% `\texttt{margin*=}\cs{captionmargin}' works in singleline options}
+% \changes{v1.1}{2007/08/12}{\cs{setlength}\cs{captionmargin} \& \cs{setlength}\cs{captionmargin@} swapped so `\texttt{margin*=}\cs{captionmargin}' works in singleline options}
% \changes{v1.3}{2010/11/07}{Support for option \opt{calcmargin} added}
-% |\setcaptionmargin|\marg{amount}\\
-% |\setcaptionmargin*|\marg{amount}\par
-% Please never use this in user documents, it's just there to
-% provide compatibility to the \package{caption2} package.
+% |\setcaptionmargin*|\marg{amount}\\
+% sets the caption margin to the given \meta{amount}.
+% Please never use this in user documents, it's just there to
+% provide compatibility to the \package{caption2} package.
% \begin{macrocode}
\newcommand*\setcaptionmargin{%
\caption@resetcalcmargin
@@ -1184,8 +1544,8 @@
% \end{macrocode}
% \begin{macrocode}
\def\caption@@@setmargin#1,#2,#3\@nil{%
- \setlength\captionmargin@{#2}%
- \setlength\captionmargin{#1}%
+ \caption@setlength{margin}{#1}%
+ \caption@setlength{margin@}{#2}%
\addtolength\captionmargin@{-\captionmargin}}
% \end{macrocode}
% \end{macro}
@@ -1194,10 +1554,10 @@
% \changes{v1.0f}{2005/10/24}{Renamed from \cs{caption@setwidth} to \cs{setcaptionwidth}}
% \changes{v1.3}{2010/11/07}{Starred variant added}
% \changes{v1.3}{2010/11/07}{Support for option \opt{calcwidth} added}
-% |\setcaptionwidth|\marg{amount}\\
-% |\setcaptionwidth*|\marg{amount}\par
-% Please never use this in user documents, it's just there to
-% provide compatibility to the \package{caption2} package.
+% |\setcaptionwidth*|\marg{amount}\\
+% sets the caption width to the given \meta{amount}.
+% Please never use this in user documents, it's just there to
+% provide compatibility to the \package{caption2} package.
% \begin{macrocode}
\newcommand*\setcaptionwidth{%
\caption@resetcalcmargin
@@ -1210,20 +1570,16 @@
% \begin{macrocode}
\newcommand*\caption@@setwidth[2]{%
#1{\captionmargin\z@\captionmargin@\z@}%
- \setlength\captionwidth{#2}}%
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\caption@resetcalcmargin}
-% \changes{v1.3}{2010/11/07}{This macro added}
-% \begin{macrocode}
-\newcommand*\caption@resetcalcmargin{%
- \let\caption@calcmargin@hook\@empty}
+ \caption@setlength{width}{#2}}%
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@setcalcmargin}
% \changes{v1.3}{2010/11/07}{This macro added}
+% |\caption@setcalcmargin*|\marg{amount}\\
+% sets the caption margin to the given \meta{amount}
+% right before the caption will be typeset, i.e.\meta{amount} will
+% not be evaluated immediately.
% \begin{macrocode}
\newcommand*\caption@setcalcmargin{%
\caption@teststar{\caption@@setcalcmargin\caption@setmargin}%
@@ -1237,8 +1593,22 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\caption@resetcalcmargin}
+% \changes{v1.3}{2010/11/07}{This macro added}
+% |\caption@resetcalcmargin|\\
+% clears the value which was stored in |\caption@set|\-|calc|\-|margin|.
+% \begin{macrocode}
+\newcommand*\caption@resetcalcmargin{%
+ \let\caption@calcmargin@hook\@empty}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\caption@setcalcwidth}
% \changes{v1.3}{2010/11/07}{This macro added}
+% |\caption@setcalcwidth*|\marg{amount}\\
+% sets the caption width to the given \meta{amount}
+% right before the caption will be typeset, i.e.\meta{amount} will
+% not be evaluated immediately.
% \begin{macrocode}
\newcommand*\caption@setcalcwidth{%
\caption@teststar{\caption@@setcalcmargin\caption@setwidth}%
@@ -1246,29 +1616,30 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\caption@counter}
+% \begin{macro}{\caption@thecounter}
% \changes{v1.0n}{2007/04/03}{This counter added}
-% \changes{v1.1e}{2007/10/28}{Renamed to \cs{caption@thecounter}; \cs{caption@stepcounter} added}
+% \changes{v1.1e}{2007/10/28}{Renamed from \cs{caption@counter} to \cs{caption@thecounter}; \cs{caption@stepcounter} added}
% \changes{v1.5}{2012/04/09}{\cs{caption@stepcounter} renamed to \cs{caption@stepthecounter}}
-% Internal counter. At the moment it will be used inside
-% |\caption@ifoddpage| only.
+% Internal counter.
+% At the moment it will be used inside |\caption@if|\-|odd|\-|page| only.
% \begin{macrocode}
\newcommand*\caption@thecounter{0}
% \end{macrocode}
% \begin{macrocode}
\newcommand*\caption@stepthecounter{%
\@tempcnta\caption@thecounter
- \advance\@tempcnta\@ne
+ \advance\@tempcnta\@ne\relax
\xdef\caption@thecounter{\the\@tempcnta}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@newlabel}
% \changes{v1.0n}{2007/04/03}{This macro added}
-% This command is a modified version of |\newlabel| from \LaTeX2e.
-% It will be written to the \texttt{.aux} file to
-% pass label information from one run to another.
-% (We use it inside |\caption@ifoddpage| and |\caption@ragged|.)
+% |\caption@newlabel|\marg{name}\marg{value}\\
+% This command is a modified version of |\new|\-|label| from \LaTeX2e.
+% It will be written to the \texttt{.aux} file to
+% pass label information from one run to another.
+% (We use it inside |\caption@if|\-|odd|\-|page|.)
% \begin{macrocode}
\newcommand*\caption@newlabel{\@newl@bel{caption@r}}
% \end{macrocode}
@@ -1276,8 +1647,8 @@
%
% \begin{macro}{\caption@thepage}
% \changes{v1.0n}{2007/04/03}{This macro added}
-% This command is a modified version of |\thepage| from \LaTeX2e.
-% It will be used inside |\caption@ifoddpage| only.
+% This command is a modified version of |\the|\-|page| from \LaTeX2e.
+% It will be used inside |\caption@if|\-|odd|\-|page| only.
% \begin{macrocode}
\newcommand*\caption@thepage{\the\c@page}
% \end{macrocode}
@@ -1285,9 +1656,10 @@
%
% \begin{macro}{\caption@label}
% \changes{v1.1}{2007/09/01}{This macro added}
-% \changes{v1.2}{2007/12/03}{Definition of \cs{caption@newlabel} in AUX file added}
-% This command is a modified version of |\label| from \LaTeX2e.
-% It will be used inside |\caption@ifoddpage| and |\FP@helpNote|.
+% \changes{v1.2}{2007/12/03}{Definition of \cs{caption@newlabel} in aux file added}
+% |\caption@label|\marg{name}\\
+% This command is a modified version of |\label| from \LaTeX2e.
+% It will be used inside |\caption@if|\-|odd|\-|page| and |\FP@help|\-|Note|.
% \begin{macrocode}
\newcommand*\caption@label[1]{%
\caption@@label
@@ -1305,8 +1677,9 @@
% \begin{macro}{\caption@pageref}
% \changes{v1.1}{2007/09/01}{This macro added}
% \changes{v1.2d}{2009/10/09}{Uses \cs{@latex@warning} instead of \cs{caption@Warning} now}
-% This command is a modified version of |\pageref| from \LaTeX2e.
-% It will be used inside |\caption@ifoddpage| and |\FP@helpNote|.
+% |\caption@pageref|\marg{name}\\
+% This command is a modified version of |\page|\-|ref| from \LaTeX2e.
+% It will be used inside |\caption@if|\-|odd|\-|page| and |\FP@help|\-|Note|.
% \begin{macrocode}
\newcommand*\caption@pageref[1]{%
\expandafter\ifx\csname caption@r@#1\endcsname\relax
@@ -1321,11 +1694,13 @@
% \begin{macro}{\caption@ifoddpage}
% \changes{v1.0n}{2007/04/03}{This macro added}
% \changes{v1.1e}{2007/10/28}{Incrementation of counter moved to \cs{caption@@make}}
-% At the moment this macro uses an own label\ldots ref mechanism,
-% but an alternative implementation method would be using the
-% \package{refcount} package\cite{refcount} and |\ifodd\getpagerefnumber{|\ldots|}|.
-% \Note{This macro re-defines itself so the \texttt{.aux} file will
-% only be used once per group.}
+% Currently this macro uses an own label\ldots ref mechanism,
+% but an alternative implementation method would use the
+% \package{refcount} package\cite{refcount} and
+% |\ifodd\get|\-|page|\-|ref|\-|number{|\ldots|}|.
+% Maybe we will change that in a later release.
+% \Note{This macro re-defines itself so the \texttt{.aux} file will
+% only be used once per group.}
% \begin{macrocode}
\newcommand*\caption@ifoddpage{%
\caption@iftwoside{%
@@ -1345,7 +1720,9 @@
%
% \begin{macro}{\caption@setoptcmd}
% \changes{v1.1}{2007/08/11}{This macro added}
-% |\caption@setoptcmd|\marg{cmd}\marg{off -or- value}
+% |\caption@setoptcmd|\marg{command}\marg{off -or- value}\\
+% defines the given \meta{command} to \meta{value},
+% but if \meta{value} if `off' the given \meta{command} is undefined instead.
% \begin{macrocode}
\newcommand*\caption@setoptcmd[2]{%
\caption@ifinlist{#2}{0,false,no,off}{\let#1\@undefined}{\def#1{#2}}}
@@ -1358,41 +1735,39 @@
% \changes{v1.1}{2007/07/29}{Renamed from \cs{captionindent} to \cs{caption@indent}}
% \begin{macro}{\caption@parindent}
% \begin{macro}{\caption@hangindent}
-% These are the indentions we support.
+% These are the indentions we support.
% \begin{macrocode}
-\newdimen\caption@indent
-\newdimen\caption@parindent
-\newdimen\caption@hangindent
+\DeclareCaptionLength{@indent}{0pt}
+\DeclareCaptionLength{@parindent}{0pt}
+\DeclareCaptionLength{@hangindent}{0pt}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
-% \changes{v1.0b}{2004/05/16}{Defaults added for options \opt{parindent=}
-% and \opt{hangindent=}}
-% \changes{v1.0f}{2005/08/22}{Option \opt{parskip=}: \cs{AtBeginCaption}
-% replaced by \cs{caption@@par}}
-% \changes{v1.0f}{2005/08/22}{Undocumented defaults for \opt{parindent=},
-% \opt{hangindent=}, and \opt{parskip=} removed}
+% \changes{v1.0b}{2004/05/16}{Defaults added for options \opt{parindent=} and \opt{hangindent=}}
+% \changes{v1.0f}{2005/08/22}{Option \opt{parskip=}: \cs{AtBeginCaption} replaced by \cs{caption@@par}}
+% \changes{v1.0f}{2005/08/22}{Undocumented defaults for \opt{parindent=}, \opt{hangindent=}, and \opt{parskip=} removed}
% \begin{macrocode}
-\DeclareCaptionOption{indent}[\leftmargini]{% obsolete!
- \setlength\caption@indent{#1}}
+\DeclareCaptionOption{indent}[\leftmargini]{% obsolete
+ \caption@setlength{@indent}{#1}}
\DeclareCaptionOption{indention}[\leftmargini]{%
- \setlength\caption@indent{#1}}
+ \caption@setlength{@indent}{#1}}
\DeclareCaptionOption{parindent}{%
- \setlength\caption@parindent{#1}}
+ \caption@setlength{@parindent}{#1}}
\DeclareCaptionOption{hangindent}{%
- \setlength\caption@hangindent{#1}}
+ \caption@setlength{@hangindent}{#1}}
\DeclareCaptionOption{parskip}{%
- \l@addto@macro\caption@@par{\setlength\parskip{#1}}}
+ \l@addto@macro\caption@@par{\setlength\parskip{#1}}}
% \end{macrocode}
%
% \section{Styles}
%
% \begin{macro}{\DeclareCaptionStyle}
-% \changes{v1.0a}{2004/01/17}{Pass through argument \#3 so extra spaces
-% between arguments do make any harm}
-% |\DeclareCaptionStyle|\marg{name}\oarg{single-line-list-of-KV}\marg{list-of-KV}
+% \changes{v1.0a}{2004/01/17}{Pass through argument \#3 so extra spaces between arguments do make any harm}
+% \changes{v2.0}{2019/09/10}{Uses \cs{caption@decl} now}
+% \changes{v2.0}{2020/07/27}{\cs{caption@sls} renamed to \cs{caption@slsty}}
+% |\DeclareCaptionStyle|\marg{name}\oarg{single-line-list-of-KV}\marg{list-of-KV}
% \begin{macrocode}
\newcommand*\DeclareCaptionStyle[1]{%
\@testopt{\caption@declarestyle{#1}}{}}
@@ -1400,8 +1775,16 @@
% \end{macrocode}
% \begin{macrocode}
\def\caption@declarestyle#1[#2]#3{%
- \global\@namedef{caption@sls@#1}{#2}%
- \global\@namedef{caption@sty@#1}{#3}}
+ \caption@decl{style}{#1}%
+ {\def\caption@slsty{#2}%
+ \def\caption@sty{#3}}%
+% \end{macrocode}
+% The \package{floatrow} package uses |\@if|\-|undefined{caption@sty@#1}| to
+% determine in |\flrow@set|\-|style| if a caption style is defined or not.
+% Since the \package{floatrow} package is unmaintained we fake the definition
+% so the test will still work.
+% \begin{macrocode}
+ \@namedef{caption@sty@#1}{\@unused}}
\@onlypreamble\caption@declarestyle
% \end{macrocode}
% \end{macro}
@@ -1417,58 +1800,55 @@
% \changes{v1.1}{2007/07/29}{Recursive style definitions should work now}
% \changes{v1.1d}{2007/10/23}{`SingleLine' renamed to `singleline' for consistency}
% \changes{v1.2}{2007/12/03}{Definition of \cs{caption@iftypewarning} removed}
-% |\caption@setstyle|\marg{name}\\
-% |\caption@setstyle*|\marg{name}\par
-% Selecting a caption style means saving the additional
-% \meta{single-line-list-of-KV} (this will be done by |\caption@sls|),
-% resetting the caption options to the base ones (this will be done using
-% |\caption@resetstyle|) and executing the \meta{list-of-KV} options
-% (this will be done using |\caption@setup|).\par
-% The starred version will give no error message if the given style is not
-% defined.
+% \changes{v2.0}{2019/09/10}{Uses \cs{caption@ifdecl} and \cs{caption@checkdecl} now}
+% |\caption@setstyle*|\marg{name}\\
+% Selecting a caption style means saving the additional
+% \meta{single-line-list-of-KV} (this will be done by |\caption@sl|\-|sty|),
+% resetting the caption options to the base ones (this will be done using
+% |\caption@reset|\-|style|) and executing the \meta{list-of-KV} options
+% (this will be done using |\caption@setup|).\par
+% The starred version will give no error message if the given style is not
+% defined.
% \begin{macrocode}
\newcommand*\caption@setstyle{%
- \caption@teststar\caption@@setstyle\@gobble\@firstofone}
+ \caption@teststar\caption@@setstyle\caption@ifdecl\caption@checkdecl}
% \end{macrocode}
% \begin{macrocode}
\newcommand*\caption@@setstyle[2]{%
- \@ifundefined{caption@sty@#2}%
- {#1{\caption@Error{Undefined style `#2'}}}%
- {\expandafter\let\expandafter\caption@sty\csname caption@sty@#2\endcsname
+ #1{style}{#2}%
+ {\caption@set{style}{#2}%
+ \caption@style % defines \caption@sty & \caption@slsty
\ifx\caption@setstyle@flag\@undefined
- \let\caption@setstyle@flag\relax
+ \let\caption@setstyle@flag\relax % prevent \caption@resetstyle if called recursively
\caption@resetstyle
\caption@xsetup\caption@sty
\let\caption@setstyle@flag\@undefined
\else
\caption@xsetup\caption@sty
- \fi
- \expandafter\let\expandafter\caption@sls\csname caption@sls@#2\endcsname
- \expandafter\caption@l@addto@list\expandafter\caption@opt@singleline
- \expandafter{\caption@sls}}}
+ \fi}%
+ {}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@resetstyle}
-% \changes{v1.1}{2007/02/04}{%
-% This macro renamed from \cs{caption@setdefault} to \cs{caption@resetstyle}}
+% \changes{v1.1}{2007/02/04}{This macro renamed from \cs{caption@setdefault} to \cs{caption@resetstyle}}
% \changes{v1.1d}{2007/10/23}{`SingleLine' renamed to `singleline' for consistency}
% \changes{v1.2}{2007/11/17}{Usage of \opt{size=} added}
% \changes{v1.2b}{2008/05/06}{Usage of \opt{rule} added}
% \changes{v1.5}{2012/03/15}{\opt{box=parbox} added}
% \changes{v1.6}{2013/05/01}{\opt{box=none} added, \opt{box=parbox} changed to \opt{parbox=parbox}}
-% This resets (nearly) all caption options to the base ones.
-% \emph{Note that this does not touch the skips and the positioning!}
+% |\caption@resetstyle|\\
+% This resets (nearly) all caption options to the base ones.
+% \emph{Note that this does not touch the skips and the positioning.}
% \begin{macrocode}
\newcommand*\caption@resetstyle{%
\caption@setup{%
box=none,boxcolor=white,parbox=parbox,%
format=plain,labelformat=default,labelsep=colon,textformat=simple,%
- justification=justified,font=,size=,labelfont=,textfont=,%
+ font=,labelfont=,textfont=,size=,%
+ justification=justified,slc,rule,strut,%
margin=0pt,minmargin=0,maxmargin=0,%
- indent=0pt,parindent=0pt,hangindent=0pt,%
- slc,rule,strut}%
- \caption@clearsetup{singleline}}
+ indent=0pt,parindent=0pt,hangindent=0pt}}
% \end{macrocode}
% \end{macro}
%
@@ -1478,31 +1858,69 @@
% \changes{v1.1c}{2007/10/14}{\opt{format=plain} removed from caption style \opt{default}}
% \changes{v1.5}{2012/03/15}{\opt{box=default} added to caption style \opt{default}}
% Currently there are two pre-defined styles, called `base' \& `default'.
-% The first one is a perfect match to the behavior of |\@makecaption| offered
-% by the standard \LaTeX\ document classes (and was called `default' in
-% \thispackage\ \version{1.0}), the second one matches the document
+% The first one is a perfect match to the behavior of |\@make|\-|caption|
+% offered by the standard \LaTeX\ document classes (and was called `default'
+% in \thispackage\ \version{1.0}), the second one matches the document
% class actually used.
% \begin{macrocode}
\DeclareCaptionStyle{base}[indent=0pt,justification=centering]{}
\DeclareCaptionStyle{default}[indent=0pt,justification=centering]{%
- box=default,format=default,labelsep=default,textformat=default,%
- justification=default,font=default,labelfont=default,textfont=default}
+ box=default,%
+ format=default,labelformat=default,labelsep=default,textformat=default,%
+ font=default,labelfont=default,textfont=default,size=default,%
+ justification=default,slc=default,margin=default,%
+ indent=default,parindent=default,hangindent=default}
% \end{macrocode}
%
+% \begin{macro}{\DeclareCaptionSinglelinecheck}
+% \changes{v2.0}{2019/09/10}{This macro added}
+% |\DeclareCaptionSinglelinecheck|\marg{name}\marg{code}
+% \begin{macrocode}
+\newcommand*\DeclareCaptionSinglelinecheck[2]{%
+ \caption@decl{singlelinecheck}{#1}{#2}}
+\@onlypreamble\DeclareCaptionSinglelinecheck
+% \end{macrocode}
+% \end{macro}
+%
% \changes{v1.2b}{2008/05/06}{Option \opt{slc=} added}
% \begin{macrocode}
-\DeclareCaptionOption{singlelinecheck}[1]{\caption@set@bool\caption@ifslc{#1}}
+\DeclareCaptionOption{singlelinecheck}[1]{\caption@setsinglelinecheck{#1}}
\DeclareCaptionOption{slc}[1]{\KV@caption@singlelinecheck{#1}}
% \end{macrocode}
%
+% These are the pre-defined single-line-check code snippets.
+% \begin{macrocode}
+\DeclareCaptionSinglelinecheck{on}{\@firstoftwo}
+\DeclareCaptionSinglelinecheck{off}{\@secondoftwo}
+% \end{macrocode}
+%
+% `default' usually maps to `on'.
+% \begin{macrocode}
+\SetCaptionDefault{singlelinecheck}{on}
+% \end{macrocode}
+%
+% \begin{macro}{\caption@setsinglelinecheck}
+% \changes{v2.0}{2018/03/13}{This macro added}
+% |\caption@setsinglelinecheck|\marg{value}\\
+% sets the single-line-check either on or off,
+% where \meta{value} could be either a \meta{name} or boolean value.
+% \begin{macrocode}
+\newcommand*\caption@setsinglelinecheck[1]{%
+ \caption@ifdecl{singlelinecheck}{#1}%
+ {\caption@set{singlelinecheck}{#1}}%
+ {\caption@set@bool\caption@singlelinecheck{#1}}}
+% \end{macrocode}
+% \end{macro}
+%
% \section{Boxes}
%
% \begin{macro}{\DeclareCaptionBox}
% \changes{v1.5}{2012/03/15}{This macro added}
-% |\DeclareCaptionBox|\marg{name}\marg{code with \#1 and \#2}
+% \changes{v2.0}{2019/09/10}{Uses \cs{caption@decl} now}
+% |\DeclareCaptionBox|\marg{name}\marg{code with \#1 and \#2}
% \begin{macrocode}
\newcommand*\DeclareCaptionBox[2]{%
- \global\long\@namedef{caption@box@#1}##1##2{#2}}
+ \caption@decl{box}{#1}##1##2{#2}}
\@onlypreamble\DeclareCaptionBox
% \end{macrocode}
% \end{macro}
@@ -1510,66 +1928,51 @@
% \changes{v1.5}{2012/03/15}{Option \opt{box=} added}
% \changes{v1.6}{2013/05/01}{Option \opt{parbox=} added}
% \begin{macrocode}
-\DeclareCaptionOption{box}{\caption@setbox{#1}}
-\DeclareCaptionOption{parbox}{\caption@set@box\caption@parbox{#1}}
-% \end{macrocode}
-%
-% \begin{macro}{\caption@setbox}
-% |\caption@setbox|\marg{name}\par
-% Selecting a caption box simply means saving the code (in |\caption@box|).
-% \begin{macrocode}
-\newcommand*\caption@setbox{%
- \caption@set@box\caption@box}
-% \end{macrocode}
-% \begin{macrocode}
-\newcommand*\caption@set@box[2]{%
- \@ifundefined{caption@box@#2}%
- {\caption@Error{Undefined box `#2'}}%
- {\expandafter\let\expandafter#1\csname caption@box@#2\endcsname}}
+\DeclareCaptionOption{box}{\caption@set{box}{#1}}
+\DeclareCaptionOption{parbox}{\caption@set{parbox}{#1}}
+\caption@setmapping{parbox}{box}
% \end{macrocode}
-% \end{macro}
%
% There are four pre-defined boxes, called `empty', `none',
% `parbox', and `colorbox'.
-% \changes{v1.0i}{2006/05/13}{We define \cs{captionbox} instead of
-% \cs{caption@start/endbox}}
-% \changes{v1.0l}{2006/03/09}{Bugfix 07-03-09: \cs{captionbox} changed from
-% \cs{parbox-t} to \cs{parbox-b}}
+% \changes{v1.0i}{2006/05/13}{We define \cs{captionbox} instead of \cs{caption@start/endbox}}
+% \changes{v1.0l}{2006/03/09}{Bugfix 07-03-09: \cs{captionbox} changed from \cs{parbox-t} to \cs{parbox-b}}
% \changes{v1.2}{2007/11/11}{\cs{captionbox} renamed to \cs{caption@parbox}}
% \changes{v1.5}{2012/03/15}{\cs{caption@parbox} adapted to \cs{DeclareCaptionBox}}
% \changes{v1.6}{2013/05/02}{Option \opt{boxsep=} added}
+% \changes{v2.1b}{2020/09/17}{Missing braces re-added to \opt{colorbox} option code}
% \begin{macrocode}
\DeclareCaptionBox{empty}{}
\DeclareCaptionBox{none}{#2}
\DeclareCaptionBox{parbox}{\parbox[b]{#1}{#2}}
-%\DeclareCaptionBox{colorbox}{%
-% \colorbox{\caption@boxcolor}{\caption@box@parbox{\dimexpr #1-2\fboxsep}{#2}}}
-\DeclareCaptionBox{colorbox}{\colorbox{\caption@boxcolor}{%
- \setlength\caption@tempdima{#1}%
- \addtolength\caption@tempdima{-2\fboxsep}%
- \linewidth\caption@tempdima
- \hsize\caption@tempdima
- #2}}
+\DeclareCaptionBox{colorbox}{%
+ \colorbox{\caption@boxcolor}{%
+ \setlength\caption@tempdima{#1}%
+ \addtolength\caption@tempdima{-2\fboxsep}%
+ \linewidth\caption@tempdima\relax
+ \hsize\caption@tempdima\relax
+ #2}}
\DeclareCaptionOption{boxcolor}{\def\caption@boxcolor{#1}}
\DeclareCaptionOption{boxsep}{\setlength\fboxsep{#1}}
% \end{macrocode}
%
-% `default' usually maps to `none`.
+% `default' usually maps to `none' resp.~`parbox'.
% \begin{macrocode}
-\def\caption@box@default{\caption@box@none}
+\SetCaptionDefault{box}{none}
+%\SetCaptionDefault{parbox}{parbox}
% \end{macrocode}
%
% \section{Formats}
%
% \begin{macro}{\DeclareCaptionFormat}
-% \changes{v1.0a}{2004/01/17}{Pass through argument \#3 so extra spaces
-% between arguments do make any harm}
+% \changes{v1.0a}{2004/01/17}{Pass through argument \#3 so extra spaces between arguments do make any harm}
% \changes{v1.0c}{2005/02/09}{Starred variant added}
% \changes{v1.1c}{2007/10/15}{Optional argument added}
-% |\DeclareCaptionFormat|\marg{name}\marg{code with \#1, \#2, and \#3}\\
-% |\DeclareCaptionFormat*|\marg{name}\marg{code with \#1, \#2, and \#3}\par
-% The starred form causes the code being typeset in vertical (instead of
-% horizontal) mode, but does not support the |indention=| option.
+% \changes{v2.0}{2019/09/10}{Uses \cs{caption@decl} now}
+% \changes{v2.0}{2020/07/27}{\cs{caption@ifh} renamed to \cs{caption@ifhmode}}
+% |\DeclareCaptionFormat*|\marg{name}\marg{code with \#1, \#2, and \#3}\\
+% The starred form causes the code being typeset in vertical (instead of
+% horizontal) mode, but does not support the |indention=| option.
% \begin{macrocode}
\newcommand*\DeclareCaptionFormat{%
\caption@teststar\caption@declareformat\@gobble\@firstofone}
@@ -1582,110 +1985,80 @@
% \end{macrocode}
% \begin{macrocode}
\long\def\caption@@declareformat#1#2[#3]#4{%
- \global\expandafter\let\csname caption@ifh@#2\endcsname#1%
- \global\long\@namedef{caption@slfmt@#2}##1##2##3{#3}%
- \global\long\@namedef{caption@fmt@#2}##1##2##3{#4}}
+ \caption@decl[\edef]{format}{#2}{%
+ \unexpanded{\let\caption@ifhmode#1}%
+ \unexpanded{\long\def\caption@slfmt}####1####2####3\unexpanded{{#3}}%
+ \unexpanded{\long\def\caption@fmt}####1####2####3\unexpanded{{#4}}}}
\@onlypreamble\caption@@declareformat
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\caption@useformat}
+% \changes{v2.0}{2020/07/31}{This macro added}
+% |\caption@useformat|\marg{name}\\
+% expands |\caption@fmt| based on the given format \meta{name}.
% \begin{macrocode}
-\DeclareCaptionOption{format}{\caption@setformat{#1}}
-% \end{macrocode}
-%
-% \begin{macro}{\caption@setformat}
-% |\caption@setformat|\marg{name}\par
-% Selecting a caption format simply means saving the code (in |\caption@fmt|)
-% and if the code should be used in horizontal or vertical mode (|\caption@ifh|).
-% \begin{macrocode}
-\newcommand*\caption@setformat[1]{%
- \@ifundefined{caption@fmt@#1}%
- {\caption@Error{Undefined format `#1'}}%
- {\expandafter\let\expandafter\caption@ifh\csname caption@ifh@#1\endcsname
- \expandafter\let\expandafter\caption@slfmt\csname caption@slfmt@#1\endcsname
- \expandafter\let\expandafter\caption@fmt\csname caption@fmt@#1\endcsname}}
+\newcommand*\caption@useformat[1]{% used by caption-koma.sto
+ \caption@checkdecl{format}{#1}{%
+ \begingroup
+ \@nameuse{caption@format@#1}\global\let\caption@tempa\caption@fmt
+ \endgroup\caption@tempa}}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\DeclareCaptionDefaultFormat}
-% \changes{v1.2a}{2008/01/31}{This macro added}
% \begin{macrocode}
-\newcommand*\DeclareCaptionDefaultFormat[1]{%
- \expandafter\def\expandafter\caption@fmt@default\expandafter
- {\csname caption@fmt@#1\endcsname}%
- \expandafter\def\expandafter\caption@slfmt@default\expandafter
- {\csname caption@slfmt@#1\endcsname}%
- \expandafter\def\expandafter\caption@ifh@default\expandafter
- {\csname caption@ifh@#1\endcsname}}
-\@onlypreamble\DeclareCaptionDefaultFormat
+\DeclareCaptionOption{format}{\caption@set{format}{#1}}
% \end{macrocode}
-% \end{macro}
%
-% \changes{v1.0a}{2004/01/23}{%
-% Caption format \opt{default} renamed to \opt{normal}}
-% \changes{v1.0e}{2005/05/12}{%
-% Caption format \opt{normal} renamed to \opt{@normal}}
-% \changes{v1.0f}{2005/08/25}{%
-% Caption format \opt{@normal} renamed to \opt{plain} and documented}
-% \changes{v1.1c}{2007/10/14}{%
-% Single-line variant of caption format \opt{hang} added}
+% \changes{v1.0a}{2004/01/23}{Caption format \opt{default} renamed to \opt{normal}}
+% \changes{v1.0e}{2005/05/12}{Caption format \opt{normal} renamed to \opt{@normal}}
+% \changes{v1.0f}{2005/08/25}{Caption format \opt{@normal} renamed to \opt{plain} and documented}
+% \changes{v1.1c}{2007/10/14}{Single-line variant of caption format \opt{hang} added}
% There are two pre-defined formats, called `plain' and `hang'.
% \begin{macrocode}
\DeclareCaptionFormat{plain}{#1#2#3\par}
% \end{macrocode}
% \begin{macrocode}
\DeclareCaptionFormat{hang}[#1#2#3\par]{%
- \caption@ifin@list\caption@lsepcrlist\caption@lsepname
+ \caption@iflabelseparatorwithnewline
{\caption@Error{%
- The option `labelsep=\caption@lsepname' does not work\MessageBreak
+ The option `labelsep=\caption@labelsep@name' does not work\MessageBreak
with `format=hang'}}%
{\@hangfrom{#1#2}%
- \advance\caption@parindent\hangindent
- \advance\caption@hangindent\hangindent
+ \advance\caption@parindent\hangindent\relax
+ \advance\caption@hangindent\hangindent\relax
\caption@@par#3\par}}
% \end{macrocode}
%
-% \changes{v1.0a}{2004/01/23}{Caption format \opt{default} linked to \opt{plain}}
-% \changes{v1.0d}{2005/04/28}{Bugfix 05-04-28: Missing \cs{caption@ifh@default} added}
% `default' usually maps to `plain'.
% \begin{macrocode}
-\DeclareCaptionDefaultFormat{plain}
+\SetCaptionDefault{format}{plain}
% \end{macrocode}
%
% \section{Label formats}
%
% \begin{macro}{\DeclareCaptionLabelFormat}
-% \changes{v1.0a}{2004/01/17}{%
-% Pass through argument \#2 so extra spaces between arguments do make any harm}
-% |\DeclareCaptionLabelFormat|\marg{name}\marg{code with \#1 and \#2}
+% \changes{v1.0a}{2004/01/17}{Pass through argument \#2 so extra spaces between arguments do make any harm}
+% \changes{v2.0}{2019/09/10}{Uses \cs{caption@decl} now}
+% |\DeclareCaptionLabelFormat|\marg{name}\marg{code with \#1 and \#2}
% \begin{macrocode}
\newcommand*\DeclareCaptionLabelFormat[2]{%
- \global\@namedef{caption@lfmt@#1}##1##2{#2}}
+ \caption@decl{labelformat}{#1}##1##2{#2}}
\@onlypreamble\DeclareCaptionLabelFormat
% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
-\DeclareCaptionOption{labelformat}{\caption@setlabelformat{#1}}
+\DeclareCaptionOption{labelformat}{\caption@set{labelformat}{#1}}
% \end{macrocode}
%
-% \begin{macro}{\caption@setlabelformat}
-% |\caption@setlabelformat|\marg{name}\par
-% Selecting a caption label format simply means saving the code (in |\caption@lfmt|).
-% \begin{macrocode}
-\newcommand*\caption@setlabelformat[1]{%
- \@ifundefined{caption@lfmt@#1}%
- {\caption@Error{Undefined label format `#1'}}%
- {\expandafter\let\expandafter\caption@lfmt\csname caption@lfmt@#1\endcsname}}
-% \end{macrocode}
-% \end{macro}
-%
% \changes{v1.2}{2007/12/16}{Caption label format \opt{brace} added}
% \changes{v1.7}{2015/09/16}{Caption label format \opt{autodot} added}
% \changes{v1.7}{2016/05/22}{Caption label format \opt{autodot} fixed}
% \changes{v1.8}{2016/05/22}{Caption label format \opt{unnumbered} added}
% There are six pre-defined label formats, called `empty', `simple',
% `parens', `brace', `autodot', and `unnumbered'.
+%
% \begin{macrocode}
\DeclareCaptionLabelFormat{empty}{}
\DeclareCaptionLabelFormat{simple}{\bothIfFirst{#1}{\nobreakspace}#2}
@@ -1695,64 +2068,123 @@
\DeclareCaptionLabelFormat{unnumbered}{#1}
% \end{macrocode}
%
-% `default' usually maps to `simple'.
+% \changes{v2.0}{2020/08/03}{Caption label format \opt{original} added}
+% The label format `original' tries to preserve the original definition
+% of the label format which was defined by |\fnum@|\meta{environment}.
+% If no original definition is available, use the label format `simple'
+% as fallback.
+%
+% \begin{macrocode}
+\DeclareCaptionLabelFormat{original}{%
+ \caption@ifdefined\caption@original@fnum
+ {\caption@original@fnum}%
+ {\caption@labelformat@fallback{#1}{#2}}}
+% \end{macrocode}
+%
+% `default' usually maps to `original' resp. `simple'.
% \begin{macrocode}
-\def\caption@lfmt@default{\caption@lfmt@simple}
+\SetCaptionDefault{labelformat}{original}
+\SetCaptionFallback{labelformat}{simple}
% \end{macrocode}
%
% \section{Label separators}
%
% \begin{macro}{\DeclareCaptionLabelSeparator}
-% \changes{v1.0a}{2004/01/17}{Pass through argument \#2 so extra spaces
-% between arguments do make any harm}
+% \changes{v1.0a}{2004/01/17}{Pass through argument \#2 so extra spaces between arguments do make any harm}
% \changes{v1.0f}{2005/08/25}{Starred variant added}
% \changes{v1.1}{2007/07/13}{Test for CR added}
% \changes{v1.3}{2011/08/06}{Test for CR revised}
-% |\DeclareCaptionLabelSeparator|\marg{name}\marg{code}\\
-% |\DeclareCaptionLabelSeparator*|\marg{name}\marg{code}\par
-% The starred form causes the label separator to be typeset \emph{without} using |\captionlabelfont|.
+% \changes{v2.0}{2018/05/15}{Variant with two stars added}
+% \changes{v2.0}{2019/09/10}{Uses \cs{caption@decl} now}
+% \changes{v2.0}{2020/07/27}{\cs{caption@iflf} renamed to \cs{caption@iflabelfont}}
+% \changes{v2.0}{2020/07/27}{\cs{caption@lsep} renamed to \cs{caption@labelsep}}
+% \changes{v2.0}{2020/07/27}{Definition of \cs{caption@labelsep@name} added}
+% |\DeclareCaptionLabelSeparator|\marg{name}\marg{code}\\
+% |\DeclareCaptionLabelSeparator*|\marg{name}\marg{code}\\
+% |\DeclareCaptionLabelSeparator**|\marg{name}\marg{condition}\marg{code}\\
+% The starred form causes the label separator to be typeset \emph{without}
+% using |\caption|\-|label|\-|font|.
+% The two-starred form uses \meta{condition} to decide if the label separator
+% should be typeset with or without using |\caption|\-|label|\-|font|.
% \begin{macrocode}
\newcommand\DeclareCaptionLabelSeparator{%
- \caption@teststar\caption@declarelabelseparator\@gobble\@firstofone}
+ \@ifstar
+ \DeclareCaptionLabelSeparator@
+ {\caption@declarelabelseparator\@firstofone}}
\@onlypreamble\DeclareCaptionLabelSeparator
% \end{macrocode}
% \begin{macrocode}
+\newcommand\DeclareCaptionLabelSeparator@{%
+ \@ifstar
+ \DeclareCaptionLabelSeparator@@
+ {\caption@declarelabelseparator\@gobble}}
+\@onlypreamble\DeclareCaptionLabelSeparator@
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\DeclareCaptionLabelSeparator@@[2]{%
+ \caption@declarelabelseparator
+ {#2\@gobble\@firstofone}%
+ {#1}}
+\@onlypreamble\DeclareCaptionLabelSeparator@@
+% \end{macrocode}
+% \begin{macrocode}
\newcommand\caption@declarelabelseparator[3]{%
- \global\@namedef{caption@iflf@#2}{#1}%
- \global\long\@namedef{caption@lsep@#2}{#3}%
- \caption@@declarelabelseparator{#2}#3\\\@nil}
-\@onlypreamble\caption@declarelabelseparator
+ \caption@decl{labelseparator}{#2}%
+ {\def\caption@iflabelfont{#1}%
+ \def\caption@labelsep@name{#2}%
+ \def\caption@labelsep{#3}}%
% \end{macrocode}
+% Unfortunately |\Declare|\-|Float|\-|Separators| of the \package{floatrow}
+% package mis-uses |\Declare|\-|Caption|\-|Label|\-|Separator| instead of
+% storing the definition on its own. Since the \package{floatrow} package is
+% unmaintained we have to store the separator definition inside
+% |\caption@lsep@|\meta{name} for \package{floatrow}, too. (Sigh!)
% \begin{macrocode}
-\long\def\caption@@declarelabelseparator#1#2\\#3\@nil{%
- \def\@tempa{#3}\ifx\@tempa\@empty \else
- \caption@g@addto@list\caption@lsepcrlist{#1}%
- \fi}
-\@onlypreamble\caption@@declarelabelseparator
+ \@namedef{caption@lsep@#2}{#3}}
+% \end{macrocode}
+% Since the `default' caption label separator will usually not be defined
+% with |\Declare|\-|Caption|\-|Label|\-|Separator|, we need to define
+% |\caption@lsep@default| manually.
+% \Note{This definition is used by \package{magyar.ldf} but only needs to be different
+% than \cs{caption@lsep} (which is usually undefined).}
+% \begin{macrocode}
+\newcommand*\caption@lsep@default{\caption@labelseparator@default\caption@labelsep}%
+% \end{macrocode}
+% \begin{macrocode}
+\@onlypreamble\caption@declarelabelseparator
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\caption@LabelSeparatorWithNewline}
+% \changes{v2.0}{2020/07/27}{This macro added}
+% |\caption@LabelSeparatorWithNewline|\marg{name}\\
+% adds the given label separator to a list of label separators which uses
+% |\\| internally. (They are incompatible to the `hang' caption format.)
% \begin{macrocode}
-\DeclareCaptionOption{labelsep}{\caption@setlabelseparator{#1}}
-\DeclareCaptionOption{labelseparator}{\caption@setlabelseparator{#1}}
+\newcommand*\caption@LabelSeparatorWithNewline[1]{%
+ \caption@g@addto@list\caption@labelsep@crlist{#1}}
+\@onlypreamble\caption@LabelSeparatorWithNewline
% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}{\caption@setlabelseparator}
-% |\caption@setlabelseparator|\marg{name}\par
-% Selecting a caption label separator simply means saving the code (in |\caption@lsep|).
+% \begin{macro}{\caption@iflabelseparatorwithnewline}
+% \changes{v2.0}{2020/07/31}{This macro added}
+% |\caption@iflabelseparatorwithnewline|\marg{yes-code}\marg{no-code}\\
+% tests if the current label separator uses |\\| internally.
% \begin{macrocode}
-\newcommand*\caption@setlabelseparator[1]{%
- \@ifundefined{caption@lsep@#1}%
- {\caption@Error{Undefined label separator `#1'}}%
- {\edef\caption@lsepname{#1}%
- \expandafter\let\expandafter\caption@iflf\csname caption@iflf@#1\endcsname
- \expandafter\let\expandafter\caption@lsep\csname caption@lsep@#1\endcsname}}
+\newcommand*\caption@iflabelseparatorwithnewline{%
+ \caption@ifin@list\caption@labelsep@crlist\caption@labelsep@name}
% \end{macrocode}
% \end{macro}
%
-% \changes{v1.0e}{2005/06/11}{Bugfix 05-03-23: Caption label separator
-% \opt{newline} implementation changed from \cs{newline} to \cs{\textbackslash}}
+% \begin{macrocode}
+\DeclareCaptionOption{labelsep}{\caption@set{labelseparator}{#1}}
+\DeclareCaptionOption{labelseparator}{\caption@set{labelseparator}{#1}}
+% \end{macrocode}
+%
+% \changes{v1.0e}{2005/06/11}{Caption label separator \opt{newline} implementation changed from \cs{newline} to \cs{textbackslash}}
% \changes{v1.0f}{2005/08/24}{Caption label separator \opt{endash} added}
+% \changes{v1.12}{2020/05/30}{Caption label separator \opt{newline} implementation changed from \cs{textbackslash} to \cs{captionnewline}}
% There are seven pre-defined label separators, called `none', `colon', `period', `space',
% `quad', `newline', and `endash'.
% \begin{macrocode}
@@ -1761,62 +2193,69 @@
\DeclareCaptionLabelSeparator{period}{. }
\DeclareCaptionLabelSeparator{space}{ }
\DeclareCaptionLabelSeparator*{quad}{\quad}
-\DeclareCaptionLabelSeparator*{newline}{\\}
+\DeclareCaptionLabelSeparator*{newline}{\captionnewline}
+% TODO: \DeclareCaptionLabelSeparator should detect on its own if it contains \captionnewline or not
+\caption@LabelSeparatorWithNewline{newline} % does not work with "format=hang"
\DeclareCaptionLabelSeparator*{endash}{\space\textendash\space}
% \end{macrocode}
%
-% \begin{macro}{\caption@setdefaultlabelsep}
-% \changes{v1.2d}{2009/03/29}{This macro added}
+% \changes{v2.2c}{2020/10/10}{Caption label separators \opt{gobble} and \opt{gobbletwo} added}
+%
+% It's a common hack to mis-use |\fnum@figure| and |\fnum@table| to replace the caption
+% label separator, for example changing the separator to a period plus space with
+% \begin{quote}
+% |\renewcommand\fnum@figure[1]{\figurename~\thefigure.}|
+% \end{quote}
+% or dropping the label and separator completely with
+% \begin{quote}
+% |\renewcommand\fnum@figure[1]{\ignorespaces}|\quad
+% \end{quote}
+% (taken from \url{http://compgroups.net/comp.text.tex/figure-without-caption/1915079}).
+%
+% We emulate the behaviour of |\@make|\-|caption| of the base document classes
+% \class{article}, \class{report}, and \class{book} in this regard (in |\caption@@@make|)
+% so these hacks still work if the \package{caption} package is loaded.
+%
+% These are the label separators used when one or two tokens after the label format
+% should be dropped, called `gobble' and `gobbletwo':
% \begin{macrocode}
-\newcommand*\caption@setdefaultlabelsep[1]{%
- \ifx\caption@lsep\caption@lsep@default
- \caption@set@default@labelsep{#1}%
- \caption@setlabelseparator{default}%
- \else
- \caption@set@default@labelsep{#1}%
- \fi}
+\DeclareCaptionLabelSeparator{gobble}{ }
+\DeclareCaptionLabelSeparator{gobbletwo}{}
% \end{macrocode}
+%
+% \begin{macro}{\captionnewline}
+% \changes{v1.12}{2020/05/30}{This macro added}
+% \changes{v2.0}{2020/07/31}{\cs{relax} added to definition}
+% |\captionnewline|\\
+% will be used in the caption label separator |new|\-|line|,
+% and re-defined for |long|\-|table| environments
+% (in package \package{ltcaption}).
% \begin{macrocode}
-\newcommand*\caption@set@default@labelsep[1]{%
- \def\caption@lsep@default{\@nameuse{caption@lsep@#1}}%
- \def\caption@iflf@default{\@nameuse{caption@iflf@#1}}}
+\newcommand*\captionnewline{\\\relax}
% \end{macrocode}
% \end{macro}
%
% `default' usually maps to `colon'.
% \begin{macrocode}
-\caption@set@default@labelsep{colon}
+\SetCaptionDefault{labelseparator}{colon}
% \end{macrocode}
%
% \section{Text formats}
%
% \begin{macro}{\DeclareCaptionTextFormat}
% \changes{v1.0j}{2007/02/18}{This macro added}
-% |\DeclareCaptionTextFormat|\marg{name}\marg{code with \#1}
+% \changes{v2.0}{2019/09/10}{Uses \cs{caption@decl} now}
+% |\DeclareCaptionTextFormat|\marg{name}\marg{code with \#1}
% \begin{macrocode}
\newcommand*\DeclareCaptionTextFormat[2]{%
- \global\long\@namedef{caption@tfmt@#1}##1{#2}}
+ \caption@decl{textformat}{#1}##1{#2}}
\@onlypreamble\DeclareCaptionTextFormat
% \end{macrocode}
% \end{macro}
%
-% \changes{v1.0c}{2005/02/12}{Option \opt{strut=} added}
-% \begin{macrocode}
-\DeclareCaptionOption{textformat}{\caption@settextformat{#1}}
-\DeclareCaptionOption{strut}[1]{\caption@set@bool\caption@ifstrut{#1}}
-% \end{macrocode}
-%
-% \begin{macro}{\caption@settextformat}
-% \changes{v1.0j}{2007/02/18}{This macro added}
-% |\caption@settextformat|\marg{name}\par
-% Selecting a caption text format simply means saving the code (in |\caption@tfmt|).
% \begin{macrocode}
-\newcommand*\caption@settextformat[1]{%
- \@ifundefined{caption@tfmt@#1}%
- {\caption@Error{Undefined text format `#1'}}%
- {\expandafter\let\expandafter\caption@tfmt\csname caption@tfmt@#1\endcsname}}
+\DeclareCaptionOption{textformat}{\caption@set{textformat}{#1}}
% \end{macrocode}
-% \end{macro}
%
% There are three pre-defined text formats, called `empty', `simple' and `period'.
% \changes{v1.4}{2011/10/05}{Pre-defined text format `empty' added}
@@ -1829,9 +2268,9 @@
\long\def\caption@get@label#1\caption@makeanchor#2#3\@nil{%
\def\caption@tempa{#2}%
\ifx\caption@tempa\@empty
- \caption@getlabel#1\label{}\@nil
+ \caption@getlabel{#1}%
\else
- \caption@getlabel#2\label{}\@nil
+ \caption@getlabel{#2}%
\fi}
% \end{macrocode}
% \begin{macrocode}
@@ -1841,16 +2280,21 @@
%
% `default' usually maps to `simple'.
% \begin{macrocode}
-\def\caption@tfmt@default{\caption@tfmt@simple}
+\SetCaptionDefault{textformat}{simple}
% \end{macrocode}
%
% \begin{macro}{\caption@getlabel}
% \changes{v1.0}{2011/09/03}{\cs{label} can have optional arguments now}
% \changes{v1.7}{2015/09/16}{Moved from \package{bicaption} package to \package{caption3}}
% \changes{v1.8d}{2019/09/01}{Bugfix: Global definition of \cs{caption@thelabel} added}
-% Gets the label command out of the (first) caption text and stores it to |\caption@thelabel|.
-% \begin{macrocode}
-\long\def\caption@getlabel#1\label#2#3\@nil{%
+% \changes{v2.0}{2020/08/23}{Syntax changed}
+% |\caption@getlabel|\marg{text}\\
+% gets the label command out of the given caption text and stores it to
+% |\caption@the|\-|label|.
+% \begin{macrocode}
+\newcommand\caption@getlabel[1]{%
+ \caption@@getlabel#1\label{}\@nil}
+\long\def\caption@@getlabel#1\label#2#3\@nil{%
\def\@tempa{#2}%
\ifx\@tempa\@empty
\let\caption@thelabel\relax
@@ -1858,85 +2302,95 @@
\def\@tempb{*}%
\ifx\@tempa\@tempb
\def\caption@thelabel{\label*}%
- \caption@@getlabel#3\@nil
+ \caption@@@getlabel#3\@nil
\else
\def\caption@thelabel{\label}%
- \caption@@getlabel{#2}#3\@nil
+ \caption@@@getlabel{#2}#3\@nil
\fi
\fi}
% \end{macrocode}
% \begin{macrocode}
-\long\def\caption@@getlabel#1#2\@nil{%
+\long\def\caption@@@getlabel#1#2\@nil{%
\def\@tempa{#1}%
\def\@tempb{[}%
\ifx\@tempa\@tempb
- \caption@@@getlabel#1#2\@nil
+ \caption@@@@getlabel#1#2\@nil
\else
\l@addto@macro\caption@thelabel{{#1}}%
\fi}
% \end{macrocode}
% \begin{macrocode}
-\long\def\caption@@@getlabel[#1]#2\@nil{%
+\long\def\caption@@@@getlabel[#1]#2\@nil{%
\l@addto@macro\caption@thelabel{[{#1}]}%
- \caption@@getlabel#2\@nil}
+ \caption@@@getlabel#2\@nil}
% \end{macrocode}
% \begin{macrocode}
\let\caption@thelabel\relax
% \end{macrocode}
% \end{macro}
%
+% \changes{v1.0c}{2005/02/12}{Option \opt{strut=} added}
+% \begin{macrocode}
+\DeclareCaptionOption{strut}[1]{\caption@set@bool\caption@ifstrut{#1}}
+% \end{macrocode}
+%
% \section{Fonts}
%
% \begin{macro}{\DeclareCaptionFont}
% \changes{v1.0a}{2004/01/22}{Bugfix: Multi token arguments are allowed now}
% \changes{v1.1}{2007/05/07}{Internal: Uses \cs{caption@fnt} instead of \cs{caption@temp} now}
% \changes{v1.8h}{2020/01/03}{Check for \package{ragged2e} package related options added}
-% |\DeclareCaptionFont|\marg{name}\marg{code}
+% \changes{v1.10}{2020/05/10}{Optional argument \opt{package} added}
+% |\DeclareCaptionFont|\oarg{package}\marg{name}\marg{code}
% \begin{macrocode}
-\newcommand*\DeclareCaptionFont[2]{%
- \define@key{caption@fnt}{#1}[]{\caption@addto@fnt{#2}}}
+\newcommand*\DeclareCaptionFont{%
+ \caption@decl@package{font}{\caption@declarefont}}
\@onlypreamble\DeclareCaptionFont
% \end{macrocode}
% \begin{macrocode}
-\newcommand*\caption@addto@fnt[1]{%
- \caption@check@ragged{#1}%
- \l@addto@macro\caption@fnt{#1}}
+\newcommand*\caption@declarefont[2]{%
+ \caption@decl{font}{#1}##1{#2}%
+ \define@key{caption@font}{#1}[]{\caption@addto@font{#1}{##1}}}
+\@onlypreamble\caption@@declarefont
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@addto@font[1]{%
+% \end{macrocode}
+% \begin{macrocode}
+% Load package first, if necessary
+ \caption@load@package{font}{#1}%
+% \end{macrocode}
+% Add the content to \cs{caption@fnt}
+% \begin{macrocode}
+ \caption@add@to@font{font}{#1}}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DeclareCaptionDefaultFont}
-% \changes{v1.1}{2006/05/14}{This macro added}
-% \changes{v1.2a}{2008/01/31}{Renamed from \cs{DeclareDefaultCaptionFont} to \cs{DeclareCaptionDefaultFont}}
-% |\DeclareCaptionDefaultFont|\marg{name}\marg{code}
% \begin{macrocode}
-\newcommand*\DeclareCaptionDefaultFont[2]{%
- \global\@namedef{caption#1@default}{#2}}
-\@onlypreamble\DeclareCaptionDefaultFont
+\newcommand*\caption@add@to@font[3]{%
+ \expandafter\g@addto@macro\expandafter\caption@fnt\expandafter{\csname caption@#1@#2\endcsname{#3}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
\DeclareCaptionOption{font}{\caption@setfont{font}{#1}}
\DeclareCaptionOption{font+}{\caption@addtofont{font}{#1}}
-\DeclareCaptionDefaultFont{font}{}
% \end{macrocode}
% \begin{macrocode}
\DeclareCaptionOption{labelfont}{\caption@setfont{labelfont}{#1}}
\DeclareCaptionOption{labelfont+}{\caption@addtofont{labelfont}{#1}}
-\DeclareCaptionDefaultFont{labelfont}{}
+\caption@setmapping{labelfont}{font}
% \end{macrocode}
% \begin{macrocode}
\DeclareCaptionOption{textfont}{\caption@setfont{textfont}{#1}}
\DeclareCaptionOption{textfont+}{\caption@addtofont{textfont}{#1}}
-\DeclareCaptionDefaultFont{textfont}{}
+\caption@setmapping{textfont}{font}
% \end{macrocode}
%
% \begin{macro}{\caption@setfont}
% \changes{v1.0j}{2007/01/30}{Usage of \cs{caption@setkeys} with optional argument}
% \changes{v1.1}{2006/05/14}{Support of \cs{DeclareDefaultCaptionFont} added}
-% |\caption@setfont|\marg{name}\marg{keyval-list of names}\par
-% Selecting a caption font means saving all the code snippets
-% in |\caption|\meta{name}.
+% |\caption@setfont|\marg{name}\marg{keyval-list of names}\\
+% Selecting a caption font means saving all the code snippets
+% in |\caption|\meta{name}.
% \begin{macrocode}
\newcommand*\caption@setfont[1]{%
\expandafter\let\csname caption#1\endcsname\@empty
@@ -1946,38 +2400,18 @@
%
% \begin{macro}{\caption@addtofont}
% \changes{v1.2}{2007/11/17}{This macro added}
-% |\caption@addtofont|\marg{name}\marg{keyval-list of names}\par
-% Like |\caption@setfont|, but adds the code snippets to |\caption|\meta{name}.\par
-% Because we use |\setkeys| recursive here we need to do this inside an
-% extra group.
+% |\caption@addtofont|\marg{name}\marg{keyval-list of names}\\
+% Like |\caption@set|\-|font|, but adds the code snippets to |\caption|\meta{name}.
+% Because we use |\set|\-|keys| recursive here we need to do this inside an
+% extra group.
% \begin{macrocode}
\newcommand*\caption@addtofont[2]{%
+ \expandafter\let\expandafter\caption@fnt\csname caption#1\endcsname
\begingroup
- \expandafter\let\expandafter\caption@fnt\csname caption#1\endcsname
- \define@key{caption@fnt}{default}[]{%
- \l@addto@macro\caption@fnt{\csname caption#1@default\endcsname}}%
- \caption@setkeys[caption]{caption@fnt}{#2}%
- \global\let\caption@tempa\caption@fnt
+ \define@key{caption@font}{default}[]{\caption@add@to@font{#1}{default}{##1}}%
+ \caption@setkeys[caption]{caption@font}{#2}%
\endgroup
- \expandafter\let\csname caption#1\endcsname\caption@tempa}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\caption@font}
-% \changes{v1.1}{2007/05/07}{This macro added}
-% |\caption@font|\marg{keyval-list of names}\\
-% |\caption@font*|\marg{keyval-code}\par
-% Sets the given font, e.g.~|\caption@font{small,it}|
-% is equivalent to |\small\itshape|.
-% \begin{macrocode}
-\newcommand*\caption@font{%
- \caption@teststar\caption@@font\@firstofone
- {\caption@setkeys[caption]{caption@fnt}}}
-\newcommand*\caption@@font[2]{%
- \begingroup
- \def\caption@fnt{\endgroup}%
- #1{#2}%
- \caption@fnt}
+ \expandafter\let\csname caption#1\endcsname\caption@fnt}
% \end{macrocode}
% \end{macro}
%
@@ -2016,7 +2450,40 @@
\DeclareCaptionFont{Huge}{\Huge}
% \end{macrocode}
%
-% \changes{v1.8}{2018/05/01}{Font size \texttt{smaller} added}
+% \changes{v1.8}{2018/05/01}{Font sizes \texttt{smaller} and \texttt{larger} added}
+% \begin{macrocode}
+\DeclareCaptionFont{smaller}{\caption@smaller}
+\DeclareCaptionFont{larger}{\caption@larger}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareCaptionFont{none}{}
+\DeclareCaptionFont{normal}{%
+ \caption@font@normalcolor\@unused
+ \caption@font@normalfont\@unused
+ \caption@font@normalsize\@unused
+ \caption@font@singlespacing\@unused}
+% \end{macrocode}
+%
+% `default' usually maps to `none'.
+% \begin{macrocode}
+\SetCaptionDefault{font}{none}
+\SetCaptionDefault{labelfont}{none}
+\SetCaptionDefault{textfont}{none}
+% \end{macrocode}
+%
+% The \package{floatrow} package uses the fonts `footfont` and `@tempa` additionally,
+% so we need to map and define the default value for them, too.
+% \begin{macrocode}
+\caption@setmapping{footfont}{font}
+\SetCaptionDefault{footfont}{none}
+\caption@setmapping{@tempa}{font}
+\SetCaptionDefault{@tempa}{none}
+% \end{macrocode}
+%
+% \begin{macro}{\caption@smaller}
+% |\caption@smaller|\\
+% selects a font size which is smaller than the current one.
% \begin{macrocode}
\newcommand\caption@smaller{%
\ifx\@currsize\tiny
@@ -2044,10 +2511,12 @@
Cannot determine current font size.\MessageBreak
Try setting it with `size=' explicitly}%
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
-\DeclareCaptionFont{smaller}{\caption@smaller}
% \end{macrocode}
+% \end{macro}
%
-% \changes{v1.8}{2018/05/02}{Font size \texttt{larger} added}
+% \begin{macro}{\caption@larger}
+% |\caption@larger|\\
+% selects a font size which is larger than the current one.
% \begin{macrocode}
\newcommand\caption@larger{%
\ifx\@currsize\tiny
@@ -2075,41 +2544,20 @@
Cannot determine current font size.\MessageBreak
Try setting it with `size=' explicitly}%
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
-\DeclareCaptionFont{larger}{\caption@larger}
-% \end{macrocode}
-%
-% \changes{v1.3}{2011/01/01}{\package{sansmath} package support added}
-% \begin{macrocode}
-\DeclareCaptionFont{sansmath}{\sansmath}
% \end{macrocode}
+% \end{macro}
%
-% \changes{v1.0n}{2007/04/02}{\package{setspace} package support added}
-% \changes{v1.2d}{2009/10/09}{Bugfix 09-05-18: \package{setspace} package support revised}
-% \begin{macrocode}
-\DeclareCaptionFont{singlespacing}{%
- \caption@ifdefined\setspace@singlespace{%
- \setstretch\setspace@singlespace}{}}% normally 1
-\DeclareCaptionFont{onehalfspacing}{%
- \caption@setspace{onehalfspacing}\onehalfspacing\relax}
-\DeclareCaptionFont{doublespacing}{%
- \caption@setspace{doublespacing}\doublespacing\relax}
-\DeclareCaptionFont{stretch}{%
- \caption@setspace{stretch}\setstretch\@gobble{#1}}
-% \end{macrocode}
+% \begin{macro}{\caption@hypersetup}
+% |\caption@hypersetup|\marg{options}\\
+% expands to |\hypersetup|\marg{options} if defined, to nothing otherwise.
% \begin{macrocode}
-\newcommand*\caption@setspace{\caption@ifpackageloaded{setspace}}
+\newcommand*\caption@hypersetup{\caption@ifdefined\hypersetup\hypersetup\@gobble}
+\DeclareCaptionFont{hypersetup}{\caption@hypersetup{#1}} % for usage in \captionsetup{font={hypersetup=...}}
+\DeclareCaptionOption{hypersetup}{\caption@hypersetup{#1}} % for usage in \captionsetup[<env>]{hypersetup=...}
% \end{macrocode}
+% \end{macro}
%
-% \begin{macrocode}
-%\DeclareCaptionFont{normal}{%
-% \caption@font{normalcolor,normalfont,normalsize,singlespacing}
-\DeclareCaptionFont{normal}{%
- \caption@font*{%
- \KV@caption@fnt@normalcolor\@unused
- \KV@caption@fnt@normalfont\@unused
- \KV@caption@fnt@normalsize\@unused
- \KV@caption@fnt@singlespacing\@unused}}
-% \end{macrocode}
+% \section{Sizes}
%
% \changes{v1.0a}{2004/01/23}{Option \opt{size=} now sets \cs{captionsize} instead of \cs{captionfont}}
% The old versions \version{1.x} of \thispackage\ offered this
@@ -2117,49 +2565,46 @@
% so old documents will work fine.
% \begin{macrocode}
\DeclareCaptionOption{size}{\caption@setfont{size}{#1}}
-\DeclareCaptionDefaultFont{size}{}
+\caption@setmapping{size}{font}
+% \end{macrocode}
+%
+% `default' usually maps to `none'.
+% \begin{macrocode}
+\SetCaptionDefault{size}{none}
% \end{macrocode}
%
% \section{Justifications}
%
% \begin{macro}{\DeclareCaptionJustification}
-% \changes{v1.0a}{2004/01/17}{Pass through argument \#2 so extra spaces
-% between arguments do make any harm}
+% \changes{v1.0a}{2004/01/17}{Pass through argument \#2 so extra spaces between arguments do make any harm}
% \changes{v1.1}{2007/07/03}{Mapped to \cs{DeclareCaptionFont}}
-% |\DeclareCaptionJustification|\marg{name}\marg{code}
+% \changes{v2.0}{2020/07/26}{Uses \cs{caption@decl} now}
+% |\DeclareCaptionJustification|\oarg{package}\marg{name}\marg{code}
% \begin{macrocode}
-\newcommand*\DeclareCaptionJustification[2]{%
- \global\@namedef{caption@hj@#1}{#2}% for compatibility to v1.0
- \DeclareCaptionFont{#1}{#2}}
-\@onlypreamble\DeclareCaptionJustification
+\newcommand*\DeclareCaptionJustification{%
+% \caption@decl@package{justification}{\caption@decl{justification}}} % Because of floatrow it isn't so easy...
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\DeclareCaptionDefaultJustification}
-% \changes{v1.1}{2007/07/03}{This macro added}
-% \changes{v1.2a}{2008/01/31}{Renamed from \cs{DeclareDefaultCaptionJustification} to \cs{DeclareCaptionDefaultJustification}}
-% |\DeclareCaptionDefaultJustification|\marg{code}
+% Unfortunately the (unmaintained) \package{floatrow} uses the old storage scheme
+% of the \package{caption} package and therefore expects the justification code
+% in |\caption@hj@|\meta{name} instead of |\caption@justification@|\meta{name}.
+% For this reason we have to store the code for the \package{floatrow} package
+% additionally, so |\flrow@FBo|\-|Align| will still work fine.
% \begin{macrocode}
-\newcommand*\DeclareCaptionDefaultJustification[1]{%
- \global\@namedef{caption@hj@default}{#1}% for compatibility to v1.0
- \DeclareCaptionDefaultFont{@hj}{#1}}
-\@onlypreamble\DeclareCaptionDefaultJustification
+ \caption@withoptargs\caption@declare@justification}
% \end{macrocode}
-% \end{macro}
-%
% \begin{macrocode}
-\DeclareCaptionOption{justification}{\caption@setjustification{#1}}
-\DeclareCaptionDefaultJustification{}
+\newcommand*\caption@declare@justification[3]{%
+ \caption@decl@package{justification}{\caption@decl{justification}}#1{#2}{#3}%
+ \expandafter\let\csname caption@hj@#2\expandafter\endcsname\csname caption@justification@#2\endcsname}
+\@onlypreamble\DeclareCaptionJustification
% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}{\caption@setjustification}
-% \changes{v1.1}{2007/07/03}{Mapped to \cs{caption@setfont}}
-% |\caption@setjustification|\marg{name}\par
-% Selecting a caption justification simply means saving the code (in |\caption@hj|).
% \begin{macrocode}
-\newcommand*\caption@setjustification{\caption@setfont{@hj}}
+\DeclareCaptionOption{justification}{%
+ \caption@load@package{justification}{#1}%
+ \caption@set{justification}{#1}}
% \end{macrocode}
-% \end{macro}
%
% These are the pre-defined justification code snippets.
% \begin{macrocode}
@@ -2171,10 +2616,15 @@
\DeclareCaptionJustification{raggedright}{\raggedright}
% \end{macrocode}
%
+% `default' usually maps to `justified'.
+% \begin{macrocode}
+\SetCaptionDefault{justification}{justified}
+% \end{macrocode}
+%
% \begin{macro}{\centerfirst}
% \changes{v1.0j}{2007/01/21}{Bugfix: Usage of \cs{@centercr} added (Thanks to Olga!)}
% \changes{v1.0j}{2007/01/21}{This macro renamed from \cs{caption@centerfirst} to \cs{centerfirst}}
-% Please blame Frank Mittelbach for the code of |\centerfirst| |:-)|
+% Please blame Frank Mittelbach for the code of |\center|\-|first| |:-)|
% \begin{macrocode}
\providecommand\centerfirst{%
\let\\\@centercr
@@ -2193,7 +2643,7 @@
% \begin{macro}{\centerlast}
% \changes{v1.0j}{2007/01/21}{Bugfix: Usage of \cs{@centercr} added (Thanks to Olga!)}
% \changes{v1.0j}{2007/01/21}{This macro renamed from \cs{caption@centerlast} to \cs{centerlast}}
-% This is based on code from Anne Br\"uggemann-Klein\cite{Anne}
+% This one is based on code from Anne Br\"uggemann-Klein\cite{Anne}.
% \begin{macrocode}
\providecommand\centerlast{%
\let\\\@centercr
@@ -2203,125 +2653,12 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{The ragged2e package}
-% \changes{v1.0b}{2004/05/16}{Improved \package{ragged2e} package support}
-% \changes{v1.8h}{2020/01/03}{Revised \package{ragged2e} package support}
-%
-% We also support the upper-case commands offered by the \package{ragged2e}
-% package.
-% Note that these just map to their lower-case variants if the
-% \package{ragged2e} package is not available.
-% \begin{macrocode}
-\DeclareCaptionJustification{Centering}{\caption@Centering}
-\DeclareCaptionJustification{RaggedLeft}{\caption@RaggedLeft}
-\DeclareCaptionJustification{RaggedRight}{\caption@RaggedRight}
-% \end{macrocode}
-% \begin{macrocode}
-\newcommand*\caption@Centering{%
- \caption@ragged{Centering}\Centering\centering}
-\newcommand*\caption@RaggedLeft{%
- \caption@ragged{RaggedLeft}\RaggedLeft\raggedleft}
-\newcommand*\caption@RaggedRight{%
- \caption@ragged{RaggedRight}\RaggedRight\raggedright}
-% \end{macrocode}
-%
-% \begin{macro}{\caption@ragged}
-% \changes{v1.0n}{2007/04/07}{The `ragged2e' package will now only been loaded when needed}
-% \changes{v1.0o}{2007/04/11}{Bugfix: Usage of \cs{caption@Info} replaced by \cs{caption@Debug}}
-% \changes{v1.1}{2007/04/16}{A different warning will be given on first \LaTeX\ run}
-% \changes{v1.4f}{2012/01/12}{Uses \cs{caption@ifpackageloaded} now}
-% |\caption@ragged|\marg{yes-code}\marg{no-code}
-% executes the \meta{yes-code} if the \package{ragged2e} package is loaded and \meta{no-code} if not.
-% \begin{macrocode}
-\newcommand*\caption@ragged{\caption@ifpackageloaded{ragged2e}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\caption@ifpackageloaded}
-% \changes{v1.4f}{2012/01/12}{This macro added}
-% \changes{v1.8h}{2020/01/03}{Does not load the package anymore but issue an error message instead}
-% |\caption@ifpackageloaded|\marg{package}\marg{option}\marg{yes-code}\marg{no-code}
-% executes the \meta{yes-code} if the given package is loaded and \meta{no-code} if not.
-% \begin{macrocode}
-\newcommand*\caption@ifpackageloaded[4]{%
- \caption@ifdefined#3#3{%
- \caption@Error{Option `#2' requires the `#1' package\MessageBreak
- (or an alternative definition of \string#3)}%
- #4}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\caption@pkg@list}
-% \changes{v1.4f}{2012/01/12}{This macro added}
-% We use this as list of packages loaded |\AtBeginDocument|.
-% (Note: Old |.aux| files could contain |\@cons|\-|\caption@pkg@list|\-|{{|\meta{package}|}}|,
-% so this macro should always be defined, even if we change the following code in the future.)
-% \begin{macrocode}
-\newcommand*\caption@pkg@list{}
-% \end{macrocode}
-% \begin{macrocode}
-\caption@AtBeginDocument{%
- \def\caption@tempa{\endgroup}%
- \begingroup
- \def\@elt#1{%
- \g@addto@macro\caption@tempa{%
- \caption@InfoNoLine{Load package `#1'}%
- \RequirePackage{#1}\relax}}%
- \caption@pkg@list
- \caption@tempa}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\caption@check@ragged}
-% \changes{v1.4h}{2020/01/03}{This macro added}
-% In the past we tried to load the \package{ragged2e} package automatically if needed.
-% But since we have dropped this unreliable code users will get an error message instead.
-% To compensate for this change we try to detect the usage of the \package{ragged2e}
-% at least within the preamble of the document.
-% (Note: Checking the name of the option is not sufficient here since it could have
-% been re-defined by the user. So we have to check the option code instead.)
-% \begin{macrocode}
-\@ifpackageloaded{ragged2e}{\let\caption@check@ragged\@gobble}{%
-% \end{macrocode}
-% \begin{macrocode}
- \newcommand*\caption@check@ragged[1]{%
- \begingroup
- \def\caption@tempa{#1}%
- \caption@check@ragged@{Centering}%
- \caption@check@ragged@{RaggedLeft}%
- \caption@check@ragged@{RaggedRight}%
- \endgroup}%
-% \end{macrocode}
-% \begin{macrocode}
- \newcommand*\caption@check@ragged@[1]{%
- \expandafter\def\expandafter\caption@tempb\expandafter{\csname caption@#1\endcsname}%
- \ifx\caption@tempa\caption@tempb % our definition of `ragged2e' option?
- \@ifundefined{#1}{%
- \caption@Info{Usage of `ragged2e' command \expandafter\string\csname #1\endcsname\space detected}%
- \@cons\caption@pkg@list{{ragged2e}}% load `ragged2e' package later on
- \global\let\caption@check@ragged\@gobble}{}%
- \fi
- }%
-% \end{macrocode}
-% \begin{macrocode}
- \caption@AtBeginDocument{%
- \let\caption@check@ragged\@gobble
- \let\caption@check@ragged@\@undefined}}
-% \end{macrocode}
-% Make the \package{subfig} package documentation compile.
-% \begin{macrocode}
-%%\@ifl@aded{dtx}{subfig}{\RequirePackage{ragged2e}\relax}{} % not needed
-\DeclareCaptionOption{lofdepth}[2]{\caption@ifdefined\c@lofdepth{\setcounter{lofdepth}{#1}}{}}
-\DeclareCaptionOption{lotdepth}[2]{\caption@ifdefined\c@lotdepth{\setcounter{lotdepth}{#1}}{}}
-% \end{macrocode}
-% \end{macro}
-%
% \section{Vertical spaces before and after captions}
%
% \begin{macro}{\abovecaptionskip}
% \begin{macro}{\belowcaptionskip}
-% Usually these skips are defined within the document class, but some
-% document classes don't do so.
+% Usually these skips are defined within the document class, but some
+% document classes don't.
% \begin{macrocode}
\caption@ifundefined\abovecaptionskip{%
\newlength\abovecaptionskip\setlength\abovecaptionskip{10\p@}}{}
@@ -2340,8 +2677,8 @@
%
% \begin{macro}{\caption@rule}
% \changes{v1.2b}{2008/05/06}{This macro added}
-% |\caption@rule|\par
-% Draws an invisible rule to adjust the ``skip'' setting.
+% |\caption@rule|\\
+% Draws an invisible rule to adjust the ``skip'' setting.
% \begin{macrocode}
\newcommand*\caption@rule{\caption@ifrule\caption@hrule\relax}
% \end{macrocode}
@@ -2366,46 +2703,68 @@
% usually has to take care for himself that this hint actually matches the
% right position.
%
+% \begin{macro}{\caption@declare@position}
+% \changes{v2.0}{2020/07/26}{This macro added}
+% |\caption@declare@position|\marg{name}\marg{code}\\
+% declares a captionposition setting of the given \meta{name},
+% \meta{code} must either expand to |\@first|\-|of|\-|two| (top) or
+% |\@second|\-|of|\-|two| (below).
+% \begin{macrocode}
+\newcommand*\caption@declare@position[2]{%
+ \caption@decl{position}{#1}{#2}}
+\@onlypreamble\caption@declare@position
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
\DeclareCaptionOption{position}{\caption@setposition{#1}}
% \end{macrocode}
+% \changes{v1.0a}{2004/01/09}{Options \opt{figureposition} and \opt{tableposition} added}
+% \begin{macrocode}
+\DeclareCaptionOption{figureposition}{\captionsetup*[figure]{position=#1}}
+\@onlypreamble@key{caption}{figureposition}
+% \end{macrocode}
+% \begin{macrocode}
+\DeclareCaptionOption{tableposition}{\captionsetup*[table]{position=#1}}
+\@onlypreamble@key{caption}{tableposition}
+% \end{macrocode}
%
% \begin{macro}{\caption@setposition}
-% \changes{v1.0a}{2004/01/22}{Now the positions \opt{t}, \opt{above}, \opt{b},
-% \opt{below}, and \opt{a} are allowed, too}
+% \changes{v1.0a}{2004/01/22}{Now the positions \opt{t}, \opt{above}, \opt{b}, \opt{below}, and \opt{a} are allowed, too}
% \changes{v1.0c}{2004/08/10}{Usage of \cs{caption@defaultpos} added}
-% |\caption@setposition|\marg{position}\par
-% Selecting the caption position means that we put |\caption@position| to
-% the right value. \emph{Please do \textbf{not} use the internal macro
-% \cs{caption@position} in your own package or document, but use the wrapper
-% macro \cs{caption@iftop} instead.}
-% \begin{macrocode}
-\newcommand*\caption@setposition[1]{%
- \caption@ifinlist{#1}{d,default}{%
- \let\caption@position\caption@defaultpos
- }{\caption@ifinlist{#1}{t,top,above}{%
- \let\caption@position\@firstoftwo
- }{\caption@ifinlist{#1}{b,bottom,below}{%
- \let\caption@position\@secondoftwo
- }{\caption@ifinlist{#1}{a,auto}{%
- \let\caption@position\@undefined
- }{%
- \caption@Error{Undefined position `#1'}%
- }}}}}
+% \changes{v2.0}{2020/07/27}{Uses \cs{caption@set} now}
+% |\caption@setposition|\marg{position}\\
+% puts |\caption@position| to the right value.
+% (Note: Since this command is used by the \package{floatrow} package as well
+% its syntax should not change.)
+% \begin{macrocode}
+\newcommand*\caption@setposition{\caption@set{position}}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\caption@defaultpos}
+% These are the pre-defined position code snippets.
+% \begin{macrocode}
+\caption@declare@position{t}{\@firstoftwo}
+\caption@declare@position{top}{\@firstoftwo}
+\caption@declare@position{above}{\@firstoftwo}
+\caption@declare@position{b}{\@secondoftwo}
+\caption@declare@position{bottom}{\@secondoftwo}
+\caption@declare@position{below}{\@secondoftwo}
+\caption@declare@position{a}{\caption@autoposition}% needed by floatrow package, \flrow@cappos
+\caption@declare@position{auto}{\caption@autoposition}
+% \end{macrocode}
+%
% \changes{v1.1}{2007/05/08}{Default position changed from `bottom' to `auto'}
-% The default `position' is `auto', this means that \thispackage\ will try
-% to guess the current position of the caption.
-% (But in many cases, for example in |longtable|s, this is doomed to fail!)\par
-% The setting `bottom' correspondents to the |\@makecaption| implementation
-% in the standard \LaTeX\ document classes, but `auto' should give better
-% results in most cases.
+% `default' usually maps to `auto'.
+% \begin{macrocode}
+\SetCaptionDefault{position}{auto}
+% \end{macrocode}
+%
+% \begin{macro}{\caption@autoposition}
+% \changes{v2.0}{2020/07/27}{This macro added}
+% If in doubt, `position=auto' maps to `position=below'.
% \begin{macrocode}
-%\caption@setdefaultpos{a}% default = auto
-\let\caption@defaultpos\@undefined
+\let\caption@autoposition\@secondoftwo
% \end{macrocode}
% \end{macro}
%
@@ -2413,70 +2772,51 @@
% \changes{v1.0a}{2004/01/23}{Split into \cs{caption@iftop} \& \cs{caption@fixposition}}
% \changes{v1.0c}{2005/02/12}{Adapted to \cs{caption@defaultpos}}
% \changes{v1.1}{2007/05/08}{Position will be fixed to `bottom' if `auto'}
-% |\caption@iftop|\marg{true-code}\marg{false-code}\par
-% (If the |position=| is set to |auto| we assume a |bottom| position here.)
+% \changes{v2.0}{2020/07/27}{Adapted to current implementation of `auto'}
+% |\caption@iftop|\marg{true-code}\marg{false-code}\\
+% Since version \version{2.0} this command is identical to |\caption@position|.
% \begin{macrocode}
-\newcommand*\caption@iftop{%
- \ifx\caption@position\@undefined
- \let\caption@position\@secondoftwo
-% = \caption@setposition b%
- \fi
- \caption@position}
+\newcommand*\caption@iftop{\caption@position}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@fixposition}
-% \changes{v1.0b}{2004/05/16}{%
-% Split into \cs{caption@fixposition} & \cs{caption@autoposition}}
-% |\caption@fixposition|\par
-% This macro checks if the `position' is set to `auto'.
-% If yes, |\caption@autoposition| will be called to
-% set |\caption@position| to a proper value we can actually use.
+% \changes{v1.0a}{2004/01/23}{\cs{ifvmode} added}
+% \changes{v1.0b}{2004/05/16}{Split into \cs{caption@fixposition} & \cs{caption@autoposition}}
+% \changes{v2.0}{2020/07/27}{Adapted to current implementation of `auto'}
+% |\caption@fixposition|\\
+% We try to guess the current position of the caption by checking |\prev|\-|depth|.\par
+% A different solution would be setting the |\space|\-|factor| to something
+% not much less than 1000 (for example 994) in |\caption@start| and
+% checking this value here by |\ifnum\space|\-|factor=994|.
+% (It's implemented in the \package{threeparttable} package\cite{threeparttable} this way.)\par
+% Another idea would be checking |\@if|\-|mini|\-|page|, but since some packages
+% typeset the caption within a simple |\vbox| this does not seem to be a good one.
% \begin{macrocode}
\newcommand*\caption@fixposition{%
- \ifx\caption@position\@undefined
- \caption@autoposition
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\caption@autoposition}
-% \changes{v1.0a}{2004/01/23}{\cs{ifvmode} added}
-% |\caption@autoposition|\par
-% We guess the current position of the caption by checking |\prevdepth|.\par
-% A different solution would be setting the |\spacefactor| to something
-% not much less than 1000 (for example 994) in |\caption@start| and
-% checking this value here by |\ifnum\spacefactor=994|.
-% (It's implemented in the \package{threeparttable}
-% package\cite{threeparttable} this way.)\par
-% Another idea would be checking |\@ifminipage|, but since some packages
-% typeset the caption within a simple |\vbox| this does not seem to be a
-% good one.
-% \begin{macrocode}
-\newcommand*\caption@autoposition{%
\ifvmode
\edef\caption@tempa{\the\prevdepth}%
\caption@Debug{\protect\prevdepth=\caption@tempa}%
\ifdim\prevdepth>-\p@
- \let\caption@position\@secondoftwo
+ \let\caption@autoposition\@secondoftwo % position=below
\else
- \let\caption@position\@firstoftwo
+ \let\caption@autoposition\@firstoftwo % position=above
\fi
-% = \caption@setposition{\ifdim\prevdepth>-\p@ b\else t\fi}%
\else
\caption@Debug{no \protect\prevdepth}%
- \let\caption@position\@secondoftwo
-% = \caption@setposition b%
+ \let\caption@autoposition\@secondoftwo % position=below
\fi}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}{\caption@setautoposition}
% \changes{v1.1}{2007/06/10}{This macro added}
-% |\caption@setautoposition|\marg{position}\par
-% replaces the above algorithm by a different one (or a fixed position setting).
+% \changes{v2.0}{2020/07/27}{Adapted to current implementation of `auto'}
+% |\caption@setautoposition|\marg{position}\\
+% replaces the above algorithm by a different one (or a fixed position setting).
% \begin{macrocode}
\newcommand*\caption@setautoposition[1]{%
- \def\caption@autoposition{\caption@setposition{#1}}}
+ \def\caption@fixposition{\caption@@set{position}{autoposition}{#1}}}
% \end{macrocode}
% \end{macro}
%
@@ -2484,9 +2824,10 @@
%
% \begin{macro}{\AtBeginCaption}
% \begin{macro}{\AtEndCaption}
-% |\AtBeginCaption| \marg{code}\\
-% |\AtEndCaption| \marg{code}\par
-% These hooks can be used analogous to |\AtBeginDocument| and |\AtEndDocument|.
+% |\AtBeginCaption|\marg{code}\\
+% |\AtEndCaption|\marg{code}\\
+% These hooks can be used analogous to |\At|\-|Begin|\-|Document| and
+% |\At|\-|End|\-|Document|.
% \begin{macrocode}
\newcommand*\caption@beginhook{}
\newcommand*\caption@endhook{}
@@ -2507,10 +2848,14 @@
%
% \begin{macro}{\caption@setlist}
% \changes{v1.2a}{2008/03/20}{This macro added}
-% |\caption@setlist|\marg{boolean}
+% |\caption@setlist|\marg{boolean value}\\
+% sets the `list' option to either `off' or `on'.
% \begin{macrocode}
\newcommand*\caption@setlist{\caption@set@bool\caption@iflist}
% \end{macrocode}
+% \begin{macrocode}
+\caption@setlist{on}
+% \end{macrocode}
% \end{macro}
%
% \changes{v1.4}{2011/08/30}{Option \opt{listtype=} added}
@@ -2522,7 +2867,8 @@
%
% \begin{macro}{\caption@setlisttype}
% \changes{v1.4}{2011/08/30}{This macro added}
-% |\caption@setlisttype|\marg{type}
+% |\caption@setlisttype|\marg{type}\\
+% sets the `listtype' option to the given \meta{type}.
% \begin{macrocode}
\newcommand*\caption@setlisttype{%
\caption@setlisttype@ext{}%
@@ -2534,9 +2880,11 @@
\ifx#1\@empty \let#1\@undefined \fi}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}{\caption@setlisttype@ext}
% \changes{v1.4}{2011/08/30}{This macro added}
-% |\caption@setlisttype@ext|\marg{type extension}
+% |\caption@setlisttype@ext|\marg{type extension}\\
+% sets the `listtype' option to the given \meta{type extension}.
% \begin{macrocode}
\newcommand*\caption@setlisttype@ext{%
\caption@@setlisttype\caption@listtype@ext}
@@ -2546,10 +2894,11 @@
% \begin{macro}{\DeclareCaptionListFormat}
% \changes{v1.1}{2004/07/15}{This macro added}
% \changes{v1.2}{2007/11/17}{Renamed from \cs{DeclareCaptionListOfFormat} to \cs{DeclareCaptionListFormat}}
-% |\DeclareCaptionListFormat|\marg{name}\marg{code with \#1 and \#2}
+% \changes{v2.0}{2020/07/26}{Uses \cs{caption@decl} now}
+% |\DeclareCaptionListFormat|\marg{name}\marg{code with \#1 and \#2}
% \begin{macrocode}
\newcommand*\DeclareCaptionListFormat[2]{%
- \global\@namedef{caption@lstfmt@#1}##1##2{#2}}
+ \caption@decl{listformat}{#1}##1##2{#2}}
\@onlypreamble\DeclareCaptionListFormat
% \end{macrocode}
% \end{macro}
@@ -2557,53 +2906,33 @@
% \changes{v1.1}{2007/07/15}{Option \opt{listofformat=} added}
% \changes{v1.2}{2007/11/17}{Option \opt{listofformat=} renamed to \opt{listformat=}}
% \begin{macrocode}
-\DeclareCaptionOption{listformat}{\caption@setlistformat{#1}}
-% \end{macrocode}
-%
-% \begin{macro}{\caption@setlistformat}
-% \changes{v1.1}{2004/07/15}{This macro added}
-% \changes{v1.2}{2007/11/17}{Renamed from \cs{caption@setlistofformat} to \cs{caption@setlistformat}}
-% |\caption@setlistformat|\marg{name}\par
-% Selecting a caption list format simply means saving the code (in |\caption@lstfmt|).
-% \begin{macrocode}
-\newcommand*\caption@setlistformat[1]{%
- \@ifundefined{caption@lstfmt@#1}%
- {\caption@Error{Undefined list format `#1'}}%
- {\expandafter\let\expandafter\caption@lstfmt
- \csname caption@lstfmt@#1\endcsname}}
+\DeclareCaptionOption{listformat}{\caption@set{listformat}{#1}}
% \end{macrocode}
-% \end{macro}
%
-% There are five pre-defined list formats, taken from the \package{subfig} package.
+% There are seven pre-defined list formats. (The first five were taken from the \package{subfig} package.)
% \begin{macrocode}
\DeclareCaptionListFormat{empty}{}
\DeclareCaptionListFormat{simple}{#1#2}
-\DeclareCaptionListFormat{parens}{#1(#2)}
\DeclareCaptionListFormat{subsimple}{#2}
+\DeclareCaptionListFormat{parens}{#1(#2)}
\DeclareCaptionListFormat{subparens}{(#2)}
+\DeclareCaptionListFormat{period}{#1#2.}
+\DeclareCaptionListFormat{subperiod}{#2.}
% \end{macrocode}
%
-% \begin{macro}{\caption@setdefaultlistformat}
-% \changes{v1.2d}{2009/03/29}{This macro added}
-% \begin{macrocode}
-\newcommand*\caption@setdefaultlistformat[1]{%
- \ifx\caption@lstfmt\caption@lstfmt@default
- \caption@set@default@listformat{#1}%
- \caption@setlistformat{default}%
- \else
- \caption@set@default@listformat{#1}%
- \fi}
-% \end{macrocode}
+% `default' usually maps to `subsimple'.
% \begin{macrocode}
-\newcommand*\caption@set@default@listformat[1]{%
- \def\caption@lstfmt@default{\@nameuse{caption@lstfmt@#1}}}
+\SetCaptionDefault{listformat}{subsimple}
% \end{macrocode}
-% \end{macro}
%
-% `default' usually maps to `subsimple'.
+% \begin{macro}{\caption@lstfmt}
+% \changes{v2.0}{This macro added}
+% To provide backward compatibility we still offer \cs{caption@lstfmt}.
+% (\cs{caption@lstfmt} is used in the \package{dgruyter} package.)
% \begin{macrocode}
-\caption@set@default@listformat{subsimple}
+\newcommand*\caption@lstfmt{\caption@listformat}
% \end{macrocode}
+% \end{macro}
%
% \section{Debug option}
% \changes{v1.0k}{2007/03/04}{Debug option added}
@@ -2622,12 +2951,70 @@
\setkeys{caption}{debug=0}
% \end{macrocode}
%
-% \section{Document classes \& Babel support}
+% \section{Document class support}
+% \changes{v2.0}{2018/05/11}{Document class support re-written}
+%
+% \begin{macro}{\@makecaption@standard}
+% \begin{macrocode}
+% article|report|book.sty [2005/09/16 v1.4f Standard LaTeX document class]
+\newcommand\@makecaption@standard[2]{%
+ \vskip\abovecaptionskip
+ \sbox\@tempboxa{#1: #2}%
+ \ifdim \wd\@tempboxa >\hsize
+ #1: #2\par
+ \else
+ \global \@minipagefalse
+ \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi
+ \vskip\belowcaptionskip}
+\@onlypreamble\@makecaption@standard
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@makecaption@arabic}
+% \begin{macrocode}
+% arabicore.sty [2006/01/01 v1.0 Arabi Core switching commands (may still change)]
+\newcommand\@makecaption@arabic[2]{%
+ \vskip\abovecaptionskip
+ \sbox\@tempboxa{#1: #2}%
+ \sbox\@Arabitempboxa{\textRL{#2} : #1}%
+ \if@rl{
+ \ifdim \wd\@Arabitempboxa >\hsize
+ \textRL{#2} : #1\par
+ \else
+ \global \@minipagefalse
+ \hb@xt@\hsize{\hfil\box\@Arabitempboxa\hfil}%
+ \fi}\else{
+ \ifdim \wd\@tempboxa >\hsize
+ #1: #2\par
+ \else
+ \global \@minipagefalse
+ \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi}\fi
+ \vskip\belowcaptionskip}
+\@onlypreamble\@makecaption@arabic
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@makecaption@latvian}
+% \begin{macrocode}
+% latvian.ldf [2018/02/19 v2.0b Latvian support from the babel system]
+\newcommand\@makecaption@latvian[2]{%
+ \vskip10\p@
+ \sbox\@tempboxa{#1\if\empty#2\else: #2\fi}%
+ \ifdim\wd\@tempboxa>\hsize
+ #1: #2\par
+ \else
+ \hbox to\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi}
+\@onlypreamble\@makecaption@latvian
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\caption@ifdocumentclass}
-% Boolean switch which is set if the document class could be detected successfully,
-% i.e. |\caption@document|\-|class| is set to a proper value.
-% (If |\caption@document|\-|class| is already set, this flag will also be set.)
+% Boolean switch which is set if the document class could be detected
+% successfully, i.e. |\caption@document|\-|class| is set to a proper value.
+% (If |\caption@document|\-|class| is already set, this flag will also be set.)
% \begin{macrocode}
\caption@setbool{documentclass}{1}
% \end{macrocode}
@@ -2635,8 +3022,8 @@
%
% \begin{macro}{\caption@documentclass}
% \changes{v1.8e}{2018/05/11}{This macro added}
-% Determine document class used.
-% Set |\caption@document|\-|class| by good-guessing, if not already set.
+% Determine document class used.
+% Set |\caption@document|\-|class| by good-guessing, if not already set.
% \begin{macrocode}
\caption@ifundefined\caption@documentclass{%
% \end{macrocode}
@@ -2660,19 +3047,19 @@
\caption@InfoNoLine{KOMA-Script document class detected}%
\def\caption@documentclass{koma}%
% \end{macrocode}
-% If |\@captionheadfont| is defined, we assume it's a AMS or SMF document class.
+% If |\@captionheadfont| is defined, we assume it's a AMS or SMF document class.
% \begin{macrocode}
}{\caption@ifdefined\@captionheadfont{%
\caption@InfoNoLine{AMS or SMF document class detected}%
- \def\caption@documentclass{ams}%
+ \def\caption@documentclass{ams-smf}%
% \end{macrocode}
-% If |\@CaptionFonts| is defined, we assume it's a NTG Dutch document class.
+% If |\CaptionFonts| is defined, we assume it's a NTG Dutch document class.
% \begin{macrocode}
}{\caption@ifdefined\CaptionFonts{%
\caption@InfoNoLine{NTG document class detected}%
\def\caption@documentclass{ntg}%
% \end{macrocode}
-% If |\cph@font| and |\cpb@font| are defined, we assume it's a NTG Dutch document class.
+% If |\cph@font| and |\cpb@font| are defined, we assume it's the thesis document class.
% \begin{macrocode}
}{\caption@ifdefined\cph@font{%
\caption@ifdefined\cpb@font\@firstoftwo\@secondoftwo
@@ -2683,398 +3070,666 @@
\def\caption@documentclass{thesis}%
}{%
% \end{macrocode}
-% If the definition of |\@makecaption| matches the one from the standard \LaTeX\ document classes
-% |article|, |report|, or |book|, we assume it's either one of them or is compatible to them.
+% If the definition of |\@make|\-|caption| matches the one from the standard
+% \LaTeX\ document classes |article|, |report|, or |book|, we assume it's
+% either one of them or is compatible to them.
% \begin{macrocode}
- % article|report|book [2005/09/16 v1.4f Standard LaTeX document class]
- \long\def\caption@tempa#1#2{%
- \vskip\abovecaptionskip
- \sbox\@tempboxa{#1: #2}%
- \ifdim \wd\@tempboxa >\hsize
- #1: #2\par
- \else
- \global \@minipagefalse
- \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
- \fi
- \vskip\belowcaptionskip}}
- \ifx\caption@tempa\@makecaption
- \caption@InfoNoLine{Standard document class detected}%
+ \ifx\@makecaption\@undefined
+ \caption@InfoNoLine{Document class w/o caption stuff detected}%
\else
+ \ifx\@makecaption\@makecaption@standard
+ \caption@InfoNoLine{Standard document class detected}%
+ \else
+ \ifx\@makecaption\@makecaption@arabic
+ \caption@InfoNoLine{arabic babel option detected}%
+ \else
+ \ifx\@makecaption\@makecaption@latvian
+ \caption@InfoNoLine{latvian babel option detected}%
+ \else
% \end{macrocode}
-% Otherwise we are clueless and use standard default settings for the captions anyway.
-% (And we unset the |document|\-|class| flag to indicate that the content of |\caption@document|\-|class| is not correct.)
+% Otherwise we are clueless and use standard default settings for the captions.
+% (And we unset the |document|\-|class| flag to indicate that the content of
+% |\caption@document|\-|class| is not correct.)
% \begin{macrocode}
- \caption@InfoNoLine{%
- Unknown document class (or package),\MessageBreak
- standard defaults will be used}%
- \caption@InfoNoLine{\string\@makecaption\space=\space\meaning\@makecaption\@gobble}%
- \caption@setbool{documentclass}{0}%
+ \caption@InfoNoLine{%
+ Unknown document class (or package),\MessageBreak
+ standard defaults will be used}%
+ \caption@InfoNoLine{\string\@makecaption\space=\space\meaning\@makecaption\@gobble}%
+ \caption@setbool{documentclass}{0}% unknown document class
+ \fi
+ \fi
+ \fi
\fi
- \def\caption@documentclass{base}%
- }}}}}}%
+% \end{macrocode}
+% \begin{macrocode}
+ \let\caption@documentclass\@empty % don't load adaption code later on
+ }}}}}}}%
}{}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\caption@ifclassloaded}
-% \changes{v1.8e}{2019/09/09}{This macro added}
-% |\caption@ifclassloaded|\marg{name}\marg{yes-code}\marg{no-code}
+% \begin{macro}{\AtCaptionPackage}
+% \changes{v2.0}{2018/05/14}{This macro added}
+% |\AtCaptionPackage|\marg{code}\\
+% can be used by the document class adaption packages to execute extra code
+% if the \package{caption} package is loaded (later on).
+% This code will by applied right before the package options are evaluated.
% \begin{macrocode}
-\newcommand*\caption@ifclassloaded[1]{%
- \edef\caption@tempa{#1}%
- \ifx\caption@tempa\caption@documentclass
- \expandafter\@firstoftwo
- \else
- \expandafter\@secondoftwo
- \fi}
+\newcommand*\AtCaptionPackage{%
+ \g@addto@macro\caption@documentclass@code}
+\@onlypreamble\AtCaptionPackage
+% \end{macrocode}
+% \begin{macrocode}
+\providecommand*\caption@documentclass@code{}
+\@onlypreamble\caption@documentclass@code
% \end{macrocode}
% \end{macro}
%
-% \subsection{The standard \texorpdfstring{\LaTeX{}}{LaTeX} classes}
+% \begin{macro}{\AfterCaptionPackage}
+% \changes{v2.1}{2020/09/12}{This macro added}
+% |\AfterCaptionPackage|\marg{code}\\
+% can be used by the document class adaption packages to execute extra code
+% if the \package{caption} package is loaded (later on).
+% This code will by applied at the very end.
+% \begin{macrocode}
+\newcommand*\AfterCaptionPackage{%
+ \g@addto@macro\caption@endtitles@code}
+\@onlypreamble\AfterCaptionPackage
+% \end{macrocode}
+% \begin{macrocode}
+\providecommand*\caption@endtitles@code{}
+\@onlypreamble\caption@endtitles@code
+% \end{macrocode}
+% \end{macro}
%
-% Since this is the default, there is no extra work to be done here.
+% \section{Babel support}
%
-% \subsection{The elsarticle classes}
-% \changes{v1.5}{2013/01/06}{elsarticle class support added}
+% \begin{macro}{\caption@IfBabelPackageLoaded}
+% |\caption@IfBabelPackageLoaded|\marg{option}\marg{cmd}\marg{yes-code}\marg{no-code}\\
+% expands the given \meta{yes-code} if |\caption@if|\-|babel@|\meta{option}
+% is set and \meta{cmd} is defined.
+% Otherwise the \meta{no-code} is expanded.\par
+% This way the adaption could be prevented by defining
+% \begin{quote}|\def\caption@ifbabel@|\meta{option}|{false}|\end{quote}
+% \begin{macrocode}
+\newcommand*\caption@IfBabelPackageLoaded[4]{%
+ \caption@ifdefined#2\@firstofone\caption@AtBeginDocument{%
+ \caption@if@bool{\@nameuse{caption@ifbabel@#1}}%
+ {\def\caption@tempa{\caption@ifdefined#2}}%
+ {\let\caption@tempa\@secondoftwo}%
+ \caption@tempa
+ {\caption@InfoNoLine{#1 babel package is loaded}#3}%
+ {#4}}}
+\@onlypreamble\caption@IfBabelPackageLoaded
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The arabic \& farsi babel option}
+% \changes{v1.8}{2018/05/20}{\package{arabic} babel support added}
+% \changes{v2.0}{2020/08/02}{\package{arabic} babel support updated}
+% \changes{v2.0}{2020/08/02}{\package{farsi} babel support added}
%
% \begin{macrocode}
-\caption@ifclassloaded{elsarticle}{%
+\DeclareCaptionLabelSeparator{arabi}{\if@rl\space\fi: }
% \end{macrocode}
+%
+% \begin{macro}{\caption@IfBabelArabi}
+% |\caption@IfBabelArabic|\marg{yes-code}\marg{no-code}
% \begin{macrocode}
- \DeclareCaptionDefaultFont{font}{\footnotesize}
+\newcommand*\caption@IfBabelArabi{%
+ \caption@IfBabelPackageLoaded{arabi}{\ArabiCoreLoaded}}
+\@onlypreamble\caption@IfBabelArabi
% \end{macrocode}
% \begin{macrocode}
-}{}
+\providecommand*\caption@ifbabel@arabi{true}
% \end{macrocode}
+% \end{macro}
%
-% \subsection{The \AmS{} \& \SmF{} classes}
-% \changes{v1.1}{2007/07/29}{\AmS\ \& \SmF\ classes support added}
+% \begin{macrocode}
+\caption@IfBabelArabi{%
+% \end{macrocode}
%
+% \begin{macro}{\caption@rl}
+% \changes{v1.8}{2018/05/20}{This macro added}
% \begin{macrocode}
-\caption@ifclassloaded{ams}{%
+ \newcommand\caption@rl[1]{\if@rl\textRL{#1}\else\textLR{#1}\fi}%
% \end{macrocode}
+% \end{macro}
+%
+% If the language `arabic' or `farsi' is selected, we switch the default label separator to `arabi'.
+%
% \begin{macrocode}
- \let\captionmargin\captionindent % set to 3pc by AMS class
- \begingroup\edef\@tempa{\endgroup
- \noexpand\caption@g@addto@list\noexpand\caption@sty@default
- {margin=\the\captionmargin
- \caption@ifdefined\smf@makecaption{,maxmargin=.1\linewidth}{}}}
- \@tempa
- \caption@g@addto@list\caption@sls@default{margin*=.5\captionmargin}
- \DeclareCaptionLabelSeparator{default}{.\enspace}
- \DeclareCaptionDefaultFont{font}{\@captionfont}
- \DeclareCaptionDefaultFont{labelfont}{\@captionheadfont}
- \DeclareCaptionDefaultFont{textfont}{\@captionfont\upshape}
- \captionsetup[figure]{position=b}
- \captionsetup[table]{position=t}
+ \caption@ifdefined\extrasarabic{%
+ \addto\extrasarabic{%
+ \caption@switchdefault{labelseparator}{\babel@save #1}{arabi}}}{}%
+ \caption@ifdefined\extrasfarsi{%
+ \addto\extrasfarsi{%
+ \caption@switchdefault{labelseparator}{\babel@save #1}{arabi}}}{}%
% \end{macrocode}
+%
% \begin{macrocode}
-}{}
+}{%
+ \let\caption@rl\@firstofone
+}
% \end{macrocode}
%
-% \subsection{The beamer class (Part one)}
-% \changes{v1.1}{2007/03/10}{\package{beamer} class support added}
-% \changes{v1.3}{2011/08/06}{\package{beamer} class support revised}
-% \changes{v1.5}{2013/04/27}{The \package{beamer} template \texttt{caption label separator} will be used now}
-% \changes{v1.7}{2016/05/22}{Re-definition of label format \texttt{simpleMagyar} added to \package{beamer} class support}
-% \changes{v1.7}{2018/04/15}{Re-definition of label format \texttt{simpleMagyar} revised}
-% \changes{v1.7}{2018/05/01}{Definition of \package{beamer} default label font revised}
+% \subsection{The babel-french package}
+% \changes{v1.1}{2006/05/14}{\package{frenchb} babel support added}
+% \changes{v2.0}{2020/08/01}{\package{french} babel support updated}
+%
+% We provide a `french' caption label separator.
+% |\caption@french@label|\-|separator| will be defined later on,
+% dependent on the `french' package used later on.
%
% \begin{macrocode}
-\caption@ifclassloaded{beamer}{%
+\DeclareCaptionLabelSeparator{french}{\caption@french@labelseparator}
% \end{macrocode}
%
-% \begin{macro}{\caption@ifbeamertemplate}
-% |\caption@ifbeamertemplate|\marg{caption template name}\marg{yes-code}\marg{no-code}\\
-% tests if the given beamer caption template was selected by the user (or not).
+% \begin{macro}{\caption@IfBabelFrench}
+% |\caption@IfBabelFrench|\marg{yes-code}\marg{no-code}
% \begin{macrocode}
- \newcommand*\caption@ifbeamertemplate[1]{%
- \begingroup
- \let\beamer@@tmpl@caption@ORI\beamer@@tmpl@caption
- \@nameuse{beamer@@tmpop@caption@#1}%
- \ifx\beamer@@tmpl@caption@ORI\beamer@@tmpl@caption
- \endgroup\expandafter\@firstoftwo
- \else
- \endgroup\expandafter\@secondoftwo
- \fi}
+\newcommand*\caption@IfBabelFrench{%
+ \caption@IfBabelPackageLoaded{french}{\FB@makecaption}}
+\@onlypreamble\caption@IfBabelFrench
+% \end{macrocode}
+% \begin{macrocode}
+\providecommand*\caption@ifbabel@french{true}
% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
- \DeclareCaptionLabelFormat{default}{%
- \caption@ifbeamertemplate{numbered}%
- \caption@lfmt@simple
- \caption@lfmt@unnumbered
- {#1}{#2}}
+\caption@IfBabelFrench{%
% \end{macrocode}
-% The \package{magyar} babel package redefines the current label format to a one called |simple|\-|Magyar|,
-% defined within |\@@magyar@caption|\-|fix| which will be executed |\At|\-|Begin|\-|Document|.
+%
+% The \package{babel-french} package uses |\Caption|\-|Separator| as label separator.
+%
% \begin{macrocode}
- \DeclareCaptionLabelFormat{default@magyar}{%
- \caption@ifbeamertemplate{numbered}%
- \caption@lfmt@simple@magyar
- \caption@lfmt@unnumbered
- {#1}{#2}}
- \@ifundefined{@@magyar@captionfix}\AtBeginDocument\@firstofone{%
- \@ifundefined{@@magyar@captionfix}{}{%
- \g@addto@macro\@@magyar@captionfix{%
- \let\caption@lfmt@simple@magyar\caption@lfmt@simpleMagyar
- \let\caption@lfmt@simpleMagyar\caption@lfmt@default@magyar}}}
+ \providecommand\caption@french@labelseparator{\CaptionSeparator}%
% \end{macrocode}
+%
+% Add a space before the label separator `colon' in French
+% in order to avoid problems when |Auto|\-|Space|\-|Punctuation| is set to |false|.
+%
% \begin{macrocode}
- \caption@declarelabelseparator
- {\caption@ifbeamertemplate{caption name own line}\@gobble\@firstofone}
- {default}
- {\caption@ifbeamertemplate{caption name own line}{\\}%
- {\usebeamertemplate{caption label separator}}}
- \DeclareCaptionDefaultFont{font}{%
- \usebeamerfont*{caption}%
- \usebeamercolor[fg]{caption}}
- \DeclareCaptionDefaultFont{labelfont}{%
- \setbeamercolor*{caption}{}% avoid setting "caption" color additionally
- \usebeamercolor[fg]{caption name}%
- \setbeamerfont*{caption}{}% avoid setting "caption" font additionally
- \usebeamerfont{caption name}}
- \DeclareCaptionDefaultJustification{\raggedright}
+ \ifFB@active@punct
+ \DeclareCaptionLabelSeparator{colon}{%
+ \ifFBfrench\penalty\@M\FBcolonspace\fi : }%
+ \fi
% \end{macrocode}
+%
+% We switch the default label separator to `french', dependant on the switches
+% |Customise|\-|Fig|\-|Tab|\-|Captions| and |Old|\-|Fig|\-|Tab|\-|Captions|.
+%
% \begin{macrocode}
- \DeclareOption{beamerclass}{%
- \renewcommand\caption@ifslc{%
- \caption@ifbeamertemplate{caption name own line}\@secondoftwo\@firstoftwo}
- % Since the beamer class do not offer a `list of figures' we switch this support off.
- \captionsetup{list=0}}
- \PassOptionsToPackage{beamerclass}{caption3}
+ \ifFBOldFigTabCaptions
+ \caption@ifdefined\extrasfrench{%
+ \addto\extrasfrench{%
+ \caption@switchdefault{labelseparator}{\babel@save #1}{french}}}{}%
+ \caption@ifdefined\extrasacadian{%
+ \addto\extrasacadian{%
+ \caption@switchdefault{labelseparator}{\babel@save #1}{french}}}{}%
+ \else
+ \ifFBCustomiseFigTabCaptions
+ \caption@AtBeginDocument{%
+ \ifFB@mainlanguage@FR
+ \SetCaptionDefault{labelseparator}{french}%
+ \fi}%
+ \fi
+ \fi
% \end{macrocode}
%
-% If the \package{beamer} document class is used, we offer a beamer
-% template called `caption3' which can be used with option `beamer' or
-% |\setbeamertemplate{caption}[caption3]|.\par
-% (Note that this is of no use when the \package{caption} package is used, too.)
% \begin{macrocode}
- \defbeamertemplate{caption}{caption3}{%
- \caption@make\insertcaptionname\insertcaptionnumber\insertcaption}
+}{}
% \end{macrocode}
+%
+% \subsection{The frenchle \& frenchpro package}
+% \changes{v1.1}{2006/05/14}{\package{frenchle/pro} package support added}
+% \changes{v2.0}{2020/08/01}{\package{frenchle/pro} package support updated}
+%
+% \begin{macro}{\caption@IfFrenchLe}
+% |\caption@IfFrenchLe|\marg{yes-code}\marg{no-code}
% \begin{macrocode}
- \DeclareOption{beamer}{%
- % \usebeamertemplate**{caption} will set font
- \DeclareCaptionDefaultFont{font}{}%
- \setbeamertemplate{caption}[caption3]}
+\newcommand*\caption@IfFrenchLe{%
+ \caption@IfBabelPackageLoaded{frenchle}{\frenchTeXmods}}
+\@onlypreamble\caption@IfBabelFrenchLe
% \end{macrocode}
% \begin{macrocode}
+\providecommand*\caption@ifbabel@frenchle{true}
+% \end{macrocode}
+% \end{macro}
%
-% \begin{macrocode]
-}{}
+% \begin{macrocode}
+\caption@IfFrenchLe{%
% \end{macrocode}
%
-% \subsection{The KOMA-Script classes}
-% \changes{v1.1}{2007/03/31}{\KOMAScript\ classes support added}
+% The \package{frenchle} package uses |\caption|\-|separator| plus |\space| as label separator.
%
% \begin{macrocode}
-\caption@ifclassloaded{koma}{%
+ \providecommand\caption@french@labelseparator{\captionseparator\space}%
% \end{macrocode}
+%
+% If the language `french' is selected, we switch the default label separator to `french',
+% and switch the default font to `it' and the default label font to `up'.
+%
% \begin{macrocode}
- \DeclareCaptionFormat{default}[#1#2#3\par]{%
- \ifdofullc@p
- \caption@ifin@list\caption@lsepcrlist\caption@lsepname
- {\caption@Error{%
- The option `labelsep=\caption@lsepname' does not work\MessageBreak
- with \noexpand\setcaphanging (which is set by default)}}%
- {\caption@fmt@hang{#1}{#2}{#3}}%
- \else
- #1#2%
- \ifdim\cap@indent<\z@
- \par
- \noindent\hspace*{-\cap@indent}%
- \else\if@capbreak
- \par
- \fi\fi
- #3\par
- \fi}
- \DeclareCaptionLabelSeparator{default}{\captionformat}
- \DeclareCaptionDefaultFont{font}{\scr@fnt@caption}
- \DeclareCaptionDefaultFont{labelfont}{\scr@fnt@captionlabel}
-% \end{macrocode}
-%
-% \changes{v1.0f}{2005/08/22}{Increased compatibility to KOMA-Script:
-% A special version of options `parindent' and `parskip' added}
-% \changes{v1.0g}{2006/01/03}{Bugfix 06-01-03: KOMA-Script variants of
-% `parskip' and `parindent' options revised and moved into caption kernel}
-% \changes{v1.0h}{2006/02/23}{KOMA-Script variants of `parskip' and
-% `parindent' are obsolete now, removed}
-% \changes{v1.0m}{2007/03/30}{KOMA-Script variants of `parskip' and
-% `parindent' re-added, since they still collide with the current
-% version of the subfig package (Sigh!)}
-%
-% There is an option clash between the \KOMAScript\ document classes
-% and the \package{caption} kernel, both define the options |parindent| and
-% |parskip| but with different meaning.
-% Furthermore the ones defined by the \package{caption} kernel take a
-% value as parameter but the \KOMAScript\ ones do not.
-% So we need special versions of the options |parindent| and |parskip| here
-% which determine if a value is given (and therefore should be treated as
-% our option) or not (and therefore should be ignored by us).\footnote{%^^A
-% This problem was completely solved due a change of \cs{caption@ProcessOptions}
-% in \thispackage\ \version{1.0h}, but we still need this workaround since
-% these options would otherwise still collide with the current version $1.3$
-% of the \package{subfig} package (Sigh!)}
-% \begin{macrocode}
- \let\caption@KV@parindent\KV@caption@parindent
- \DeclareCaptionOption{parindent}[]{%
- \ifx,#1,%
- \caption@Debug{Option `parindent' ignored}%
- \else
- \caption@KV@parindent{#1}%
- \fi}%
+ \g@addto@macro\extrasfrench{%
+ \caption@switchdefault{labelseparator}{\let\caption@original@labelseparator#1}{french}%
+ \caption@switchdefault{font}{\let\caption@original@font#1}{it}%
+ \caption@switchdefault{labelfont}{\let\caption@original@labelfont#1}{up}}%
+ \g@addto@macro\extrasenglish{%
+ \caption@restoredefault{labelseparator}{\caption@original@labelseparator}%
+ \caption@restoredefault{font}{\caption@original@font}%
+ \caption@restoredefault{labelfont}{\caption@original@labelfont}}%
% \end{macrocode}
+%
+% Since the \package{frenchle} package overwrites |\caption|\-|font| and |\caption|\-|label|\-|font|
+% (within |\GOfrench|) we need to save them beforehand and restore them afterwards.
+%
% \begin{macrocode}
- \let\caption@KV@parskip\KV@caption@parskip
- \DeclareCaptionOption{parskip}[]{%
- \ifx,#1,%
- \caption@Debug{Option `parskip' ignored}%
- \else
- \caption@KV@parskip{#1}%
- \fi}%
+ \caption@AtBeginDocument{%
+ \let\captionfont@original\captionfont
+ \let\captionlabelfont@original\captionlabelfont}%
+ \g@addto@macro\GOfrench{%
+ \let\captionfont\captionfont@original
+ \let\captionlabelfont\captionlabelfont@original}%
% \end{macrocode}
+%
% \begin{macrocode}
}{}
% \end{macrocode}
%
-% \subsection{The \NTG{} Dutch classes}
-% \changes{v1.1}{2007/04/06}{NTG classes support added}
+% \subsection{The babel-hungarian package}
+% \changes{v1.3}{2009/03/29}{\package{magyar} babel support added}
+% \changes{v1.3a}{2011/08/12}{\package{magyar} babel support revised}
+% \changes{v1.8b}{2018/08/26}{\package{magyar} babel support revised}
+% \changes{v2.0}{2020/08/03}{\package{magyar} babel support updated}
%
% \begin{macrocode}
-\caption@ifclassloaded{ntg}{%
+\DeclareCaptionLabelFormat{magyar}{#2\bothIfSecond{.~}{#1}}
% \end{macrocode}
+%
+% \begin{macro}{\caption@IfBabelHungarian}
+% |\caption@IfBabelHungarian|\marg{yes-code}\marg{no-code}
+% \begin{macrocode}
+\newcommand*\caption@IfBabelHungarian{%
+ \caption@IfBabelPackageLoaded{hungarian}{\magyar@opt@defaults}}
+\@onlypreamble\caption@IfBabelHungarian
+% \end{macrocode}
+% \begin{macrocode}
+\providecommand*\caption@ifbabel@hungarian{true}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\caption@IfBabelHungarian{%
+% \end{macrocode}
+%
+% If the language `hungarian' or `magyar' is selected,
+% we switch the default label format to `magyar', the default separator to `period',
+% and the default list format to `subperiod'.
+%
% \begin{macrocode}
- \DeclareCaptionDefaultFont{labelfont}{\CaptionLabelFont}
- \DeclareCaptionDefaultFont{textfont}{\CaptionTextFont}
+ \caption@ifdefined\extrashungarian{%
+ \addto\extrashungarian{%
+ \caption@switchdefault{labelformat}{\babel@save #1}{magyar}%
+ \caption@switchdefault{labelseparator}{\babel@save #1}{period}%
+ \caption@switchdefault{listformat}{\babel@save #1}{subperiod}}}{}%
+ \caption@ifdefined\extrasmagyar{%
+ \addto\extrasmagyar{%
+ \caption@switchdefault{labelformat}{\babel@save #1}{magyar}%
+ \caption@switchdefault{labelseparator}{\babel@save #1}{period}%
+ \caption@switchdefault{listformat}{\babel@save #1}{subperiod}}}{}%
% \end{macrocode}
+%
% \begin{macrocode}
}{}
% \end{macrocode}
%
-% \subsection{The thesis class}
-% \changes{v1.2a}{2008/01/31}{thesis class support added}
-% \changes{v1.2e}{2009/11/15}{Bugfix 09-11-14: thesis class support revised}
+% \subsection{The latvian babel option}
%
% \begin{macrocode}
-\caption@ifclassloaded{thesis}{%
+\DeclareCaptionLabelFormat{latvian}{#2\bothIfSecond{~}{#1}}
% \end{macrocode}
+%
+% \begin{macro}{\caption@IfBabelLatvian}
+% |\caption@IfBabelLatvian|\marg{yes-code}\marg{no-code}
+% \begin{macrocode}
+\newcommand*\caption@IfBabelLatvian{%
+ \caption@IfBabelPackageLoaded{latvian}{\bbl@latvianindent}}
+\@onlypreamble\caption@IfBabelLatvian
+% \end{macrocode}
+% \begin{macrocode}
+\providecommand*\caption@ifbabel@latvian{true}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\caption@IfBabelLatvian{%
+% \end{macrocode}
+%
+% If the language `latvian' is selected, we switch the default label format to `latvian'.
+%
% \begin{macrocode}
- \DeclareCaptionDefaultFormat{hang}
- \DeclareCaptionDefaultFont{labelfont}{\cph@font}
- \DeclareCaptionDefaultFont{textfont}{\cpb@font}
+ \caption@ifdefined\extraslatvian{%
+ \addto\extraslatvian{%
+ \caption@switchdefault{labelformat}{\babel@save #1}{latvian}}}{}%
% \end{macrocode}
+%
% \begin{macrocode}
}{}
% \end{macrocode}
%
-% \subsection{The arabic Babel option}
-% \changes{v1.8}{2018/05/20}{\package{arabic} babel package support added}
+% \section{Package support}
%
+% \begin{macro}{\caption@ifpackageloaded}
+% \changes{v2.0}{2020/07/26}{This macro added}
+% |\caption@ifpackageloaded|\marg{package}\marg{yes-code}\marg{no-code}\\
+% expands the given code if the given package is (not) loaded.
+% (Note: We cannot use |\@if|\-|package|\-|loaded| here since it's not
+% available after |\At|\-|Begin|\-|Document|.)
+% \begin{macrocode}
+\newcommand*\caption@ifpackageloaded[1]{%
+ \expandafter\ifx\csname ver@#1.\caption@pkgextension\endcsname\relax
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi}
+% \end{macrocode}
% \begin{macrocode}
-\caption@ifdefined\ArabiCoreLoaded{%
+\let\caption@pkgextension\@pkgextension
% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}{\caption@rl}
-% \changes{v1.8}{2018/05/20}{This macro added}
+% \begin{macro}{\caption@pkg@list}
+% \changes{v1.4b}{2012/01/12}{This macro added}
+% We used this in the past as list of packages loaded
+% |\At|\-|Begin|\-|Document|.
+% (Note: Old |.aux| files could contain
+% |\@cons|\-|\caption@pkg@list|\-|{{|\meta{package}|}}|,
+% so this macro should always be defined, even if we don't use it anymore.)
% \begin{macrocode}
- \newcommand\caption@rl[1]{\if@rl\textRL{#1}\else\textLR{#1}\fi}
+\newcommand*\caption@pkg@list{}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\caption@requirepackage}
+% \changes{v1.10}{2020/05/10}{This macro added}
+% \changes{v2.0}{2020/07/27}{This macro revised}
+% |\caption@requirepackage|\marg{package}\marg{option}\marg{value}\\
+% indicates that the given package option needs a package.
% \begin{macrocode}
- \def\fnum@figure{\figurename\nobreakspace\thefigure}%
- \def\fnum@table{\tablename\nobreakspace\thetable}%
+\newcommand*\caption@requirepackage[2]{%
+ \caption@ifpackageloaded{#1}{}{\caption@@requirepackage{#1}{#2}}}
% \end{macrocode}
% \begin{macrocode}
- \DeclareCaptionLabelSeparator{arabi}{ : }
- \DeclareCaptionLabelSeparator{default}{%
- \if@rl\caption@lsep@arabi\else\caption@lsep@colon\fi}
+\newcommand*\caption@@requirepackage[2]{%
+ \@cons\caption@packagelist{{#1}{#2}}} % load package later on
% \end{macrocode}
% \begin{macrocode}
-}{%
- \let\caption@rl\@firstofone
-}
+\caption@AtBeginDocument{%
+ \renewcommand*\caption@@requirepackage[2]{%
+ \caption@Error{Option `#2' requires the `#1' package}}}
% \end{macrocode}
+% \end{macro}
%
-% \subsection{The frenchb Babel option}
-% \changes{v1.1}{2006/05/14}{\package{frenchb} babel package support added}
+% \begin{macro}{\caption@packagelist}
+% \changes{v1.11}{2020/05/10}{This macro added}
+% We use this as list of packages loaded |\At|\-|Begin|\-|Document|.
+% \begin{macrocode}
+\newcommand*\caption@packagelist{}
+\@onlypreamble\caption@packagelist
+% \end{macrocode}
+% \begin{macrocode}
+\caption@AtBeginDocument{%
+ \def\caption@tempa{\endgroup}%
+ \begingroup
+ \def\@elt#1#2{%
+ \g@addto@macro\caption@tempa{%
+ \caption@loadpackage{#1}{#2}}}%
+ \caption@packagelist
+ \caption@tempa}
+% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\caption@loadpackage}
+% \changes{v1.11}{2020/05/10}{This macro added}
+% \changes{v2.0}{2020/07/26}{This macro revised}
+% |\caption@loadpackage|\marg{package}\marg{option}\marg{value}\\
+% loads the given package immediately.
% \begin{macrocode}
-\caption@ifdefined\FB@makecaption{%
+\newcommand*\caption@loadpackage[2]{%
+ \caption@ifpackageloaded{#1}{}{\caption@@loadpackage{#1}{#2}}}
% \end{macrocode}
% \begin{macrocode}
- \ifx\@makecaption\STD@makecaption
- \DeclareCaptionLabelSeparator{default}{\CaptionSeparator}
- \def\caption@frenchb{% supress frenchb warning
- \let\STD@makecaption\@makecaption
- \let\FB@makecaption\@makecaption}
- \else
- \ifx\@makecaption\@undefined\else
- \caption@InfoNoLine{%
- The definition of \protect\@makecaption\space
- has been changed,\MessageBreak
- frenchb will NOT customize it}%
- \fi
- \fi
+\newcommand*\caption@@loadpackage[2]{%
+ \caption@Info{Option `#2' requires the `#1' package}%
+ \RequirePackage{#1}\relax}
% \end{macrocode}
% \begin{macrocode}
-}{}
+\caption@AtBeginDocument{%
+ \let\caption@@loadpackage\caption@@requirepackage}
% \end{macrocode}
+% \end{macro}
%
-% \subsection{The frenchle/pro package}
-% \changes{v1.1}{2006/05/14}{\package{frenchle/pro} package support added}
+% \subsection{The newfloat package}
%
+% \begin{macro}{\caption@newfloat}
+% \changes{v1.4b}{2012/01/12}{This macro added}
+% \changes{v1.8h}{2020/01/03}{Usage of \cs{caption@ifpackageloaded} replaced by \cs{RequirePackage}}
+% \changes{v1.11}{2020/05/10}{Usage of \cs{RequirePackage} replaced by \cs{caption@usepackage}}
+% \changes{v2.0}{2020/07/27}{This macro revised}
+% |\caption@newfloat|\marg{option}\marg{value}\marg{code}\\
+% loads the \package{newfloat} package and executes the given code afterwards.
+% (Note: Since the package might use the crappy \package{keyval}
+% package, too, we need to save \& restore some macros here, otherwise this
+% recursion won't work properly.)
% \begin{macrocode}
-\caption@ifdefined\frenchTeXmods{%
+\newcommand*\caption@newfloat[2]{%
+ \IfCaptionOptionCheck
+ {\caption@requirepackage{newfloat}{#1}}%
+ {\let\KV@prefix@ORI\KV@prefix
+ \let\@tempc@ORI\@tempc
+ \caption@loadpackage{newfloat}{#1}%
+ #2%
+ \let\@tempc\@tempc@ORI
+ \let\KV@prefix\KV@prefix@ORI}}
+% \end{macro}
% \end{macrocode}
+% \end{macro}
+%
+% \changes{v1.0c}{2004/08/03}{Options \opt{figurename} and \opt{tablename} added}
+% \changes{v1.1}{2007/07/04}{Options \opt{figurename} and \opt{tablename} re-written}
+% \changes{v1.2}{2007/11/18}{Option \opt{name} added}
% \begin{macrocode}
- \DeclareCaptionDefaultFont{textfont}{\itshape}%
- \DeclareCaptionLabelSeparator{default}{\captionseparator\space}%
+\DeclareCaptionOption{figurename}{\caption@SetName{figure}{#1}}
+\@onlypreamble@key{caption}{figurename}
+\DeclareCaptionOption{tablename}{\caption@SetName{table}{#1}}
+\@onlypreamble@key{caption}{tablename}
% \end{macrocode}
+%
+% \changes{v1.2a}{2008/02/28}{Options \opt{listfigurename} and \opt{listtablename} added}
% \begin{macrocode}
-}{}
+\DeclareCaptionOption{listfigurename}{\caption@SetName{listfigure}{#1}}
+\@onlypreamble@key{caption}{listfigurename}
+\DeclareCaptionOption{listtablename}{\caption@SetName{listtable}{#1}}
+\@onlypreamble@key{caption}{listtablename}
% \end{macrocode}
%
-% \subsection{The hungarian and magyar Babel option}
-% \changes{v1.3}{2009/03/29}{\package{magyar} package support added}
-% \changes{v1.3a}{2011/08/12}{\package{magyar} package support revised}
-% \changes{v1.8b}{2018/08/26}{\package{magyar} package support revised}
+% \begin{macro}{\caption@SetName}
+% \changes{v1.1}{2007/07/04}{This macro added}
+% \changes{v1.2}{2007/11/18}{After-preamble variant added}
+% \changes{v1.2a}{2008/02/28}{Renamed from \cs{caption@SetFloatName} to \cs{caption@SetName}}
+% \changes{v1.2b}{2008/08/02}{Bugfix: Works now without \cs{addto}, too}
+% \changes{v1.4a}{2011/10/29}{Outsourced to \package{newfloat} package}
+% \changes{v1.4b}{2012/01/12}{Bugfix: Uses \cs{caption@newfloat} now}
+% |\caption@SetName|\marg{float}\marg{name}\\
+% loads the \package{newfloat} package and uses |\newfloat@set|\-|name|.
+% \begin{macrocode}
+\newcommand*\caption@SetName[2]{%
+ \caption@newfloat{#1name}{\newfloat@setname{#1}{#2}}}
+\@onlypreamble\caption@SetName
+% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
-\DeclareCaptionListFormat{subperiod}{#2.}
+\DeclareCaptionOption{name}{%
+ \IfCaptionOptionCheck{}{\caption@setname\@captype{#1}}}
% \end{macrocode}
%
+% \begin{macro}{\caption@setname}
+% |\caption@setname|\marg{float}\marg{name}\\
+% sets the given float name, e.g.: `Figure` for `figure`.
% \begin{macrocode}
-\def\caption@tempa#1{%
- \@ifpackagewith{babel}{#1}{%
- \caption@InfoNoLine{#1 babel option is loaded}%
- \expandafter\addto\csname extras#1\endcsname{%
- % change default labelsep and listformat
- \caption@setdefaultlabelsep{period}%
- \caption@setdefaultlistformat{subperiod}}%
- \expandafter\addto\csname noextras#1\endcsname{%
- % change default labelsep and listformat
- \caption@setdefaultlabelsep{colon}%
- \caption@setdefaultlistformat{subsimple}}%
- }{}}
+\newcommand*\caption@setname[2]{%
+ \@namedef{#1name}{#2}}
% \end{macrocode}
+% \end{macro}
+%
+% \changes{v1.2}{2007/12/21}{Options \opt{figurewithin} and \opt{tablewithin} added}
+% \changes{v1.2e}{2010/01/09}{The \opt{within} options are now available within the document, too}
+%
% \begin{macrocode}
-\caption@tempa{hungarian}
-\caption@tempa{magyar}
+\DeclareCaptionOption{figurewithin}{\caption@within{figure}{#1}}
+\DeclareCaptionOptionNoValue{figurewithout}{\caption@within{figure}{none}}
+\DeclareCaptionOption{tablewithin}{\caption@within{table}{#1}}
+\DeclareCaptionOptionNoValue{tablewithout}{\caption@within{table}{none}}
% \end{macrocode}
%
-% TODO: babel-latvian/latvian.ldf
+% \begin{macro}{\caption@within}
+% \changes{v1.2}{2007/12/21}{This macro added}
+% \changes{v1.4a}{2011/10/29}{Outsourced to \package{newfloat} package}
+% \changes{v1.4b}{2012/01/12}{Bugfix: Uses \cs{caption@newfloat} now}
+% |\caption@within|\marg{float}\marg{value}\\
+% loads the \package{newfloat} package and uses |\newfloat@set|\-|within|.
+% \begin{macrocode}
+\newcommand*\caption@within[2]{%
+ \caption@newfloat{#1within=#2}{\newfloat@setwithin{#1}{#2}}}
+% \end{macrocode}
+% \end{macro}
%
-% \section{Execution of options}
+% \changes{v1.2b}{2008/04/13}{Option \opt{within} added}
+% \changes{v1.2e}{2010/01/09}{The global \opt{within} option will now affect user-defined floats declared with \cs{DeclareCaptionType}, too}
%
% \begin{macrocode}
-\captionsetup{style=default,position=default,%
- list,listformat=default,twoside=\if@twoside 1\else 0\fi}
+\DeclareCaptionOption{within}{%
+ \caption@newfloat{within=#1}{\newfloatsetup{within=#1}}}
+\DeclareCaptionOptionNoValue{without}{%
+ \caption@newfloat{without}{\newfloatsetup{without}}}
% \end{macrocode}
+%
+% \subsection{The ragged2e package}
+% \changes{v1.0b}{2004/05/16}{Improved \package{ragged2e} package support}
+% \changes{v1.8h}{2020/01/03}{Revised \package{ragged2e} package support}
+% \changes{v1.9}{2020/05/05}{Enhanced \package{ragged2e} package support}
+% \changes{v1.10}{2020/05/10}{Revised \package{ragged2e} package support}
+%
+% We support the upper-case commands offered by the \package{ragged2e}
+% package.
% \begin{macrocode}
-\ProcessOptions*
+\DeclareCaptionJustification[ragged2e]{Justified}{\justifying}
+\DeclareCaptionJustification[ragged2e]{Centering}{\Centering}
+\DeclareCaptionJustification[ragged2e]{RaggedLeft}{\RaggedLeft}
+\DeclareCaptionJustification[ragged2e]{RaggedRight}{\RaggedRight}
+% \end{macrocode}
+%
+% \subsection{The sansmath package}
+% \changes{v1.3}{2011/01/01}{\package{sansmath} package support added}
+% \changes{v1.10}{2020/05/10}{\package{sansmath} package support revised}
+%
+% \begin{macrocode}
+\DeclareCaptionFont[sansmath]{sansmath}{\sansmath}
+% \end{macrocode}
+%
+% \subsection{The setspace package}
+% \changes{v1.0n}{2007/04/02}{\package{setspace} package support added}
+% \changes{v1.2d}{2009/10/09}{\package{setspace} package support revised}
+%
+% \begin{macrocode}
+\DeclareCaptionFont{singlespacing}{%
+ \caption@ifdefined\setspace@singlespace{%
+ \setstretch\setspace@singlespace}{}}% normally 1
+\DeclareCaptionFont[setspace]{onehalfspacing}{\onehalfspacing}
+\DeclareCaptionFont[setspace]{doublespacing}{\doublespacing}
+\DeclareCaptionFont[setspace]{stretch}{\setstretch{#1}}
+% \end{macrocode}
+%
+% \subsection{The subfig package}
+% \changes{v1.1}{2007/07/07}{Adaptions to the \package{subfig} package added}
+% \changes{v1.4a}{2011/11/01}{Test for the \package{subfig} package revised}
+% \changes{v2.0a}{2020/09/07}{Re-definition of \cs{sf@ifpositiontop} added}
+%
+% Since the \package{subfig} package is not maintained anymore,
+% we have to make adaptions to \thispackage~\version{1.1} here.
+% Please note that we only support the version $1.3$ of the \package{subfig} package,
+% so older versions do not work with this version of \thispackage, and newer
+% versions are expected to be adapted.
+%
+% \begin{macrocode}
+\caption@AtBeginDocument{%
+ \def\@tempa{2005/06/28 ver: 1.3 subfig package}%
+ \expandafter\ifx\csname ver@subfig.sty\endcsname\@tempa
+ \caption@InfoNoLine{subfig package v1.3 is loaded}%
+% \end{macrocode}
+% \begin{macrocode}
+ \def\caption@eh{\caption@@eh{subfig}}%
+ \let\caption@setfloattype\@gobble
+ \let\@dottedxxxline\sf@NEW@dottedxxxline
+ \let\sf@subfloat\sf@NEW@subfloat
+ \let\sf@ifpositiontop\caption@iftop
+% \end{macrocode}
+% \begin{macrocode}
+ \fi
+ \let\sf@NEW@dottedxxxline\@undefined
+ \let\sf@NEW@subfloat\@undefined}
+% \end{macrocode}
+%
+% \begin{macro}{\@dottedxxxline}
+% New version of |\@dottedxxxline|
+% \begin{macrocode}
+\def\sf@NEW@dottedxxxline#1#2#3#4#5#6#7{%
+ \begingroup
+ \caption@setfloattype{#1}%
+ \caption@setoptions{subfloat}%
+ \caption@setoptions{sub#1}%
+ \ifnum #3>\@nameuse{c@#2depth}\else
+ \@dottedtocline{\z@}{#4}{#5}{#6}{#7}%
+ \fi
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sf@subfloat}
+% \changes{v1.4b}{2011/12/29}{Bugfix 11-12-23: Usage of \cs{caption@warmup} added}
+% New version of |\sf@subfloat|
+% \begin{macrocode}
+\def\sf@NEW@subfloat{%
+ \begingroup
+ \@nameuse{caption@warmup}%
+ \caption@setfloattype\@captype
+ \sf@ifpositiontop{%
+ \maincaptiontoptrue
+ }{%
+ \maincaptiontopfalse
+ }%
+ \caption@setoptions{subfloat}%
+ \caption@setoptions{sub\@captype}%
+ \let\sf@oldlabel=\label
+ \let\label=\subfloat@label
+ \ifmaincaptiontop\else
+ \advance\@nameuse{c@\@captype}\@ne\relax
+ \fi
+ \refstepcounter{sub\@captype}%
+ \setcounter{sub\@captype @save}{\value{sub\@captype}}%
+ \@ifnextchar [% %] match left bracket
+ {\sf@@subfloat}%
+ {\sf@@subfloat[\@empty]}}
+% \end{macrocode}
+% \end{macro}
+%
+% Make the \package{subfig} package documentation compile.
+% \begin{macrocode}
+\DeclareCaptionOption{lofdepth}[2]{\caption@ifdefined\c@lofdepth{\setcounter{lofdepth}{#1}}{}}
+\DeclareCaptionOption{lotdepth}[2]{\caption@ifdefined\c@lotdepth{\setcounter{lotdepth}{#1}}{}}
% \end{macrocode}
%
% \section{Making an `List of' entry}
@@ -3089,10 +3744,9 @@
% \changes{v1.7}{2015/09/15}{Argument \#3 which holds the environment name added to \cs{caption@lstfmt}}
% \changes{v1.7}{2015/09/20}{Unfortunately \package{subfig} defines and uses \cs{caption@lstfmt} as well, so I replaced the third argument with \cs{captionlisttype}}
% \changes{v1.8}{2018/09/06}{Adapted to the \package{chkfloat} package}
-% |\caption@addcontentsline|\marg{type}\marg{list entry}\par
-% Makes an entry in the list-of-whatever, if requested,
-% i.e.~the argument \meta{list entry} is not empty and
-% |listof=| was set to |true|.
+% |\caption@addcontentsline|\marg{type}\marg{list entry}\\
+% makes an entry in the list-of-whatever, if requested, i.e.~the argument
+% \meta{list entry} is not empty and |list|\-|of=| was set to |true|.
% \begin{macrocode}
\newcommand\caption@addcontentsline[2]{%
\caption@ifcontentsline{#2}{%
@@ -3122,7 +3776,7 @@
\caption@add@contentsline
{\csname ext@#1\endcsname}%
{#1}%
- {\caption@lstfmt{\@nameuse{p@#1}}{\@nameuse{the#1}}}%
+ {\caption@listformat{\@nameuse{p@#1}}{\@nameuse{the#1}}}%
{\ignorespaces #2}%
\caption@chkfloat{#1}{#2}}}}
% \end{macrocode}
@@ -3165,39 +3819,54 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\caption@aboveskip}
+% \begin{macro}{\caption@belowskip}
+% \changes{v2.0}{2020/08/23}{This macro moved from package to kernel}
+% |\caption@aboveskip| and |\caption@belowskip|\\
+% typeset the skip above resp.~below the caption.
+% \begin{macrocode}
+\newcommand*\caption@aboveskip{%
+ \vskip\abovecaptionskip}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand*\caption@belowskip{%
+ \vskip\belowcaptionskip}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\caption@fnum}
% \changes{v1.1}{2007/08/21}{This macro added}
-% |\caption@fnum|\marg{float type}\par
-% Typesets the caption label; as replacement for |\fnum@|\meta{float type}.
+% \changes{v2.0}{2020/08/03}{The original definition will be stored in \cs{caption@original@fnum}}
+% |\caption@fnum|\marg{float type}\\
+% typesets the caption label; this acts as replacement for |\fnum@|\meta{float type}.
% \begin{macrocode}
-\newcommand*\caption@fnum[1]{\caption@lfmt{\@nameuse{#1name}}{\@nameuse{the#1}}}
+\newcommand*\caption@fnum[1]{%
+ \expandafter\let\expandafter\caption@original@fnum\csname caption@fnum@#1\endcsname % for label format `original'
+ \caption@labelformat{\@nameuse{#1name}}{\@nameuse{the#1}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@make}
-% |\caption@make|\marg{float name}\marg{ref.\ number}\marg{text}\par
-% Typesets the caption.
+% |\caption@make|\marg{float name}\marg{ref.\ number}\marg{text}\\
+% typesets the caption.
% \begin{macrocode}
-\newcommand\caption@make[2]{\caption@@make{\caption@lfmt{#1}{#2}}}
+\newcommand\caption@make[2]{\caption@@make{\caption@labelformat{#1}{#2}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@@make}
% \changes{v1.0b}{2004/05/16}{Bugfix 04-05-05: \cs{ifdim}\cs{captionindent=}\cs{z@} added}
-% \changes{v1.0c}{2005/02/12}{Bugfix 04-10-26: Use \cs{@tempdima} instead of
-% \cs{captionmargin} resp. \cs{captionwidth}; check for \cs{z@} added}
-% \changes{v1.0c}{2005/02/12}{Bugfix: \cs{hskip}\cs{captionmargin} to the end
-% of caption added}
+% \changes{v1.0c}{2005/02/12}{Bugfix 04-10-26: Use \cs{@tempdima} instead of \cs{captionmargin} resp. \cs{captionwidth}; check for \cs{z@} added}
+% \changes{v1.0c}{2005/02/12}{Bugfix: \cs{hskip}\cs{captionmargin} to the end of caption added}
% \changes{v1.0c}{2005/02/12}{Bugfix: \cs{strut} moved from here to \cs{caption@@@make}}
% \changes{v1.0c}{2005/02/12}{Single-line-check moved up so it can affect margins now}
-% \changes{v1.0c}{2005/02/09}{Improvement: \cs{caption@ifh} added}
+% \changes{v1.0c}{2005/02/09}{Improvement: \cs{caption@ifhmode} added}
% \changes{v1.0c}{2005/02/09}{Bugfix: \cs{leavevmode} added}
% \changes{v1.0f}{2005/08/24}{Uses \cs{sbox} instead of \cs{setbox} in single-line-check}
% \changes{v1.0g}{2005/12/04}{Uses \cs{caption@slc} now}
-% \changes{v1.0g}{2006/01/11}{Bugfix: \cs{caption@calcmargin} inside
-% single-line-check replaced by \cs{relax}}
-% \changes{v1.0g}{2006/01/11}{Bugfix: \cs{caption@startbox} will always be
-% typeset in horizontal mode}
+% \changes{v1.0g}{2006/01/11}{Bugfix: \cs{caption@calcmargin} inside single-line-check replaced by \cs{relax}}
+% \changes{v1.0g}{2006/01/11}{Bugfix: \cs{caption@startbox} will always be typeset in horizontal mode}
% \changes{v1.0i}{2006/05/13}{Uses \cs{caption@parbox} instead of \cs{caption@start/endbox}}
% \changes{v1.0j}{2007/01/04}{Oops, bugfix 04-05-05 got lost in v1.0h, re-added}
% \changes{v1.0n}{2007/04/03}{Usage of \cs{caption@ifoddpage} added}
@@ -3208,7 +3877,7 @@
% \changes{v1.6}{2013/05/01}{Usage of \cs{caption@box} added}
% \changes{v1.7}{2016/01/31}{Adapted to the \package{bicaption} package}
% \changes{v1.8f}{2019/12/18}{Usage of \cs{linewidth} replaced by \cs{hsize}}
-% |\caption@@make|\marg{caption label}\marg{caption text}
+% |\caption@@make|\marg{caption label}\marg{caption text}
% \begin{macrocode}
\newcommand\caption@@make[2]{%
\begingroup
@@ -3221,69 +3890,60 @@
\caption@stepthecounter
\caption@beginhook
% \end{macrocode}
-%
-% Typeset the outer box |\caption@box|
+% Typeset the outer box |\caption@box|
% \begin{macrocode}
\caption@box\hsize{%
% \end{macrocode}
-%
-% Special single-line treatment (option |singlelinecheck=|)
+% Special single-line treatment (option |singlelinecheck=|)
% \begin{macrocode}
- \caption@ifslc{\caption@slc{#1}{#2}\caption@singleline\relax}{}%
+ \caption@singlelinecheck{\caption@slc{#1}{#2}\caption@singleline\caption@multiline}{\caption@multiline}%
% \end{macrocode}
-%
-% Typeset the left margin (option |margin=|)
+% Typeset the left margin (option |margin=|)
% \begin{macrocode}
\caption@calcmargin
\caption@tempdima\captionmargin
\ifdim\captionmargin@=\z@ \else
- \caption@ifoddpage{}{\advance\caption@tempdima\captionmargin@}%
+ \caption@ifoddpage{}{\advance\caption@tempdima\captionmargin@\relax}%
\fi
- \caption@ifh{\advance\caption@tempdima\caption@indent}%
+ \caption@ifhmode{\advance\caption@tempdima\caption@indent\relax}%
\hspace\caption@tempdima
% \end{macrocode}
-%
-% We actually use a |\vbox| of width |\captionwidth - \caption@indent|
-% to typeset the caption.
-% \Note{\cs{captionindent} is \emph{not} supported if the caption format
-% was defined with \cs{DeclareCaptionFormat*}.}
+% We actually use a |\vbox| of width |\captionwidth - \caption@indent|
+% to typeset the caption.
+% \Note{\cs{captionindent} is \emph{not} supported if the caption format
+% was defined with \cs{DeclareCaptionFormat*}.}
% \begin{macrocode}
\caption@tempdima\captionwidth
- \caption@ifh{\advance\caption@tempdima-\caption@indent}%
+ \caption@ifhmode{\advance\caption@tempdima-\caption@indent\relax}%
\caption@parbox\caption@tempdima{%
% \end{macrocode}
-%
-% Typeset the indention (option |indention=|)\\
-% {\small Bugfix 04-05-05:
-% |\hskip-\caption@indent| replaced by |\ifdim\caption@indent=\z@|\ldots}
+% Typeset the indention (option |indention=|)\\
+% {\small Bugfix 04-05-05:
+% |\hskip-\caption@indent| replaced by |\ifdim\caption@indent=\z@|\ldots}
% \begin{macrocode}
- \caption@ifh{%
+ \caption@ifhmode{%
\ifdim\caption@indent=\z@
\leavevmode
\else
\hskip-\caption@indent
\fi}%
% \end{macrocode}
-%
-% Typeset the caption itself and close the |\caption@parbox|
+% Typeset the caption itself and close the |\caption@parbox|
% \begin{macrocode}
\caption@@@make{#1}{#2}}%
% \end{macrocode}
-%
-% Typeset the right margin (option |margin=|)
+% Typeset the right margin (option |margin=|)
% \begin{macrocode}
\caption@tempdima\captionmargin
\ifdim\captionmargin@=\z@ \else
- \caption@ifoddpage{\advance\caption@tempdima\captionmargin@}{}%
+ \caption@ifoddpage{\advance\caption@tempdima\captionmargin@\relax}{}%
\fi
\hspace\caption@tempdima
% \end{macrocode}
-%
-% Close the outer box |\caption@box|
+% Close the outer box |\caption@box|
% \begin{macrocode}
}%
% \end{macrocode}
-%
% \begin{macrocode}
\caption@endhook}
% \end{macrocode}
@@ -3299,14 +3959,14 @@
% \changes{v1.1}{2006/05/13}{Check of \cs{@listdepth} removed (not necessary anymore), use \cs{linewidth} instead of \cs{hsize}}
% \changes{v1.5}{2012/12/26}{max-margin stuff moved from \cs{caption@@make} to here}
% \changes{v1.8f}{2019/12/18}{Usage of \cs{linewidth} replaced by \cs{hsize}}
-% |\caption@calcmargin|\par
-% Calculate |\captionmargin| \& |\captionwidth|, so both contain valid
-% values.
+% |\caption@calcmargin|\\
+% calculates |\caption|\-|margin| and |\caption|\-|width|, so both contain
+% valid values.
% \begin{macrocode}
\newcommand*\caption@calcmargin{%
\caption@calcmargin@hook
% \end{macrocode}
-% Check margin, if |\caption@minmargin| or |\caption@maxmargin| is set
+% Check margin, if |\caption@min|\-|margin| or |\caption@max|\-|margin| is set
% \begin{macrocode}
\ifx\caption@maxmargin\@undefined \else
\ifdim\captionmargin>\caption@maxmargin\relax
@@ -3321,14 +3981,14 @@
% \end{macrocode}
% \begin{macrocode}
\ifdim\captionwidth=\z@
- \captionwidth\hsize
- \advance\captionwidth by -2\captionmargin
- \advance\captionwidth by -\captionmargin@
+ \captionwidth\hsize\relax
+ \advance\captionwidth by -2\captionmargin\relax
+ \advance\captionwidth by -\captionmargin@\relax
\else
- \captionmargin\hsize
- \advance\captionmargin by -\captionwidth
- \divide\captionmargin by 2
- \captionmargin@\z@
+ \captionmargin\hsize\relax
+ \advance\captionmargin by -\captionwidth\relax
+ \divide\captionmargin by 2\relax
+ \captionmargin@\z@\relax
\fi
% \end{macrocode}
% \begin{macrocode}
@@ -3344,23 +4004,22 @@
% \end{macro}
%
% \begin{macro}{\caption@slc}
-% \changes{v1.1}{2007/06/13}{\cs{let}\cs{caption@hj}\cs{relax} added}
+% \changes{v1.1}{2007/06/13}{\cs{let}\cs{caption@justification}\cs{relax} added}
% \changes{v1.1}{2007/07/29}{\cs{caption@setup}\cs{caption@sls} added after \cs{begingroup}}
% \changes{v1.1}{2007/07/29}{\cs{caption@calcmargin} added}
-% \changes{v1.1c}{2007/10/14}{Support of \cs{caption@slfmt} added}
-% \changes{v1.1d}{2007/10/23}{`SingleLine' renamed to `singleline' for consistency}
+% \changes{v1.1c}{2007/10/14}{\cs{caption@setup}\cs{caption@opt@SingleLine} outsourced to \cs{caption@SingleLine}}
% \changes{v1.3}{2010/09/04}{Split into \cs{caption@slc} and \cs{caption@@slc}}
% \changes{v1.5}{2012/12/26}{Merged into a single macro again}
-% \changes{v1.5}{2013/04/14}{Definition and usage of \cs{ifsinglelinecaption} added}
-% |\caption@slc|\marg{label}\marg{text}\marg{single-line-code}\marg{multi-line-code}\par
-% This one does the single-line-check.
+% \changes{v1.5}{2013/04/14}{Usage of \cs{ifsinglelinecaption} added}
+% |\caption@slc|\marg{label}\marg{text}\marg{single-line-code}\marg{multi-line-code}\\
+% This one does the single-line-check.
% \begin{macrocode}
\newcommand\caption@slc[4]{%
\caption@Debug{Begin SLC}%
\singlelinecaptiontrue
\begingroup
\caption@singleline
- \let\caption@hj\@empty
+ \let\caption@justification\relax
\caption@calcmargin % calculate \captionwidth
\caption@prepareslc
\sbox\@tempboxa{\caption@@@make{#1}{#2}}%
@@ -3374,68 +4033,102 @@
\fi
\caption@Debug{End SLC}}
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifsinglelinecaption}
+% \changes{v1.5}{2013/04/14}{This definition added}
+% |\ifsinglelinecaption|\\
+% could be used inside own caption formats to test if the caption is
+% currently typeset as single-line caption (or not).
% \begin{macrocode}
\newif\ifsinglelinecaption
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\caption@singleline}
+% \changes{v1.1c}{2007/10/14}{This macro extracted from \cs{caption@slc}}
+% \changes{v1.1c}{2007/10/14}{Support of \cs{caption@slfmt} added}
+% \changes{v1.1d}{2007/10/23}{This macro renamed from \cs{caption@SingleLine} to \cs{caption@singleline} for consistency}
+% |\caption@singleline|\\
+% prepares the typesetting of a single-line caption.
% \begin{macrocode}
\newcommand*\caption@singleline{%
- \caption@xsetup\caption@opt@singleline
+ \caption@xsetup\caption@slsty % Note: This could change \caption@format
+ \caption@format % defines \caption@ifhmode, \caption@slfmt, and \caption@fmt
\let\caption@fmt\caption@slfmt}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\caption@multiline}
+% \changes{v2.0}{2020/07/28}{This macro added}
+% |\caption@multiline|\\
+% prepares the typesetting of a multi-line caption.
+% \begin{macrocode}
+\newcommand*\caption@multiline{%
+ \caption@format} % defines \caption@ifhmode, \caption@slfmt, and \caption@fmt
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\caption@prepareslc}
% \changes{v1.0b}{2004/05/16}{Bugfix: Redefinition of \cs{label} \& \cs{@footnotetext} added}
% \changes{v1.0b}{2004/05/16}{Redefine \cs{stepcounter} instead of \cs{footnote(mark)}}
-% \changes{v1.0c}{2005/02/12}{\cs{let}\cs{caption@hj}\cs{relax} added}
+% \changes{v1.0c}{2005/02/12}{\cs{let}\cs{caption@justification}\cs{relax} added}
% \changes{v1.0f}{2005/07/09}{Support of \package{endnotes} package added}
-% \changes{v1.1}{2007/06/13}{\cs{let}\cs{caption@hj}\cs{relax} moved to \cs{caption@slc}}
+% \changes{v1.1}{2007/06/13}{\cs{let}\cs{caption@justification}\cs{relax} moved to \cs{caption@slc}}
% \changes{v1.1}{2007/06/13}{Redefinition of \cs{(H@)refstepcounter} added}
% \changes{v1.1}{2007/08/12}{Redefinition of \cs{label} improved}
% \changes{v1.1c}{2007/10/06}{Definition of \cs{caption@l@stepcounter} added}
% \changes{v1.3}{2011/07/07}{Bugfix 11-07-06: Redefinition of \cs{footnote} and \cs{footnotemark} added, redefinition of \cs{stepcounter} and \cs{refstepcounter} dropped}
-% \changes{v1.4a}{2011/10/21}{Redefinition of \cs{pagenote} from \textsf{memoir} document class added}
% \changes{v1.4a}{2011/10/22}{Redefinition of \cs{footnote} revised}
% \changes{v1.5}{2013/04/13}{Redefinition os \cs{glsunset} added}
% \changes{v1.8}{2018/01/21}{Redefinition of \cs{endnote} added (thanks to Markus Kohm)}
% \changes{v1.8}{2018/05/16}{Redefinition of \cs{acused} added}
% \changes{v1.8}{2018/05/26}{Definition method changed so it can be pre-defined by other packages}
% \changes{v1.8}{2018/05/27}{Redefinition of \cs{hypertarget} added}
-% |\caption@prepareslc|\par
-% Re-define anything which would disturb the single-line-check.
+% |\caption@prepareslc|\\
+% re-defines anything which could disturb the single-line-check.
% \begin{macrocode}
-\@ifundefined{caption@prepareslc}\def\g@addto@macro\caption@prepareslc{%
+\providecommand*\caption@prepareslc{}
+\g@addto@macro\caption@prepareslc{%
\let\label\caption@gobble
\let\hypertarget\@gobbletwo
% \end{macrocode}
+% We re-define \cs{footnote} so
+% \begin{enumerate}
+% \item The footnote counter will not be increased twice (but still the
+% correct footnote mark will be used within the single-line-check)
+% \item The footnote text will not be evaluated twice
+% \end{enumerate}
% \begin{macrocode}
- \let\caption@footnotemark@ORI\footnotemark
+ \let\caption@footnote@ORI\footnote
\def\footnote{\caption@withoptargs\caption@footnote}%
+ \let\caption@footnotemark@ORI\footnotemark
\def\footnotemark{\caption@withoptargs\caption@footnotemark}%
+ \let\caption@footnotetext@ORI\@footnotetext
\let\@footnotetext\caption@gobble
% \end{macrocode}
+% Same for \cs{endnote}
% \begin{macrocode}
- \let\caption@endnotemark@ORI\endnotemark
+ \let\caption@endnote@ORI\endnote
\def\endnote{\caption@withoptargs\caption@endnote}%
+ \let\caption@endnotemark@ORI\endnotemark
\def\endnotemark{\caption@withoptargs\caption@endnotemark}%
+ \let\caption@endnotetext@ORI\@endnotetext
\let\@endnotetext\caption@gobble
% \end{macrocode}
-% \begin{macrocode}
- \let\pagenote\caption@gobble
-% \end{macrocode}
-% Adaption to the \package{acronym} package.\par
-% See also \url{https://tex.stackexchange.com/questions/428788}
+% Adaption to the \package{acronym} package\par
+% See also \url{https://tex.stackexchange.com/questions/428788}
% \begin{macrocode}
\let\acused\@gobble
\let\AC@placelabel\@gobble
% \end{macrocode}
-% Adaption to the \package{glossaries} package.\par
-% Please note that while this adaption is usually sufficient
-% it could give incorrect measuring results if \cs{gls} is both used
-% for the very first time and more than once (for a particular acronym).
-% The alternative would be using internal macros of the
-% \package{glossaries} package which I would like to avoid.\par
-% See also \url{https://tex.stackexchange.com/questions/108368}
+% Adaption to the \package{glossaries} package.\par
+% Please note that while this adaption is usually sufficient
+% it could give incorrect measuring results if \cs{gls} is both used
+% for the very first time and more than once (for a particular acronym).
+% The alternative would be using internal macros of the
+% \package{glossaries} package which I would like to avoid.\par
+% See also \url{https://tex.stackexchange.com/questions/108368}
% \begin{macrocode}
\let\glsunset\@gobble
% \end{macrocode}
@@ -3445,19 +4138,23 @@
% \begin{macrocode}
\newcommand\caption@footnote[2]{%
\caption@footnotemark{#1}}
+% \end{macrocode}
+% \begin{macrocode}
\newcommand\caption@footnotemark[1]{%
\begingroup
\let\stepcounter\caption@l@stepcounter
- \caption@footnotemark@ORI#1%
+ \caption@footnotemark@ORI#1\relax
\endgroup}
% \end{macrocode}
% \begin{macrocode}
\newcommand\caption@endnote[2]{%
\caption@endnotemark{#1}}
+% \end{macrocode}
+% \begin{macrocode}
\newcommand\caption@endnotemark[1]{%
\begingroup
\let\stepcounter\caption@l@stepcounter
- \caption@endnotemark@ORI#1
+ \caption@endnotemark@ORI#1\relax
\endgroup}
% \end{macrocode}
% \begin{macrocode}
@@ -3468,97 +4165,119 @@
%
% \begin{macro}{\caption@applyfont}
% \changes{v1.3}{2010/09/04}{This macro added}
-% |\caption@applyfont|\par
-% This macro executes the font relevant macros, i.e. by default
-% the options set by |justification=|, |font=|, and |size=|.
+% |\caption@applyfont|\\
+% applies the relevant font settings, i.e. by default
+% the options set by |justification=|, |font=|, and |size=|.
% \begin{macrocode}
\newcommand*\caption@applyfont{%
- \caption@hj\captionfont\captionsize}
+ \caption@justification\captionfont\captionsize}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@@@make}
% \changes{v1.0b}{2004/05/16}{Bugfix 04-05-06: \cs{allowhyphens} added}
-% \changes{v1.0c}{2005/02/12}{Bugfix 04-12-16: Use some kind of
-% \cs{@startstrut}\cs{strutbox} instead of \cs{strut}}
+% \changes{v1.0c}{2005/02/12}{Bugfix 04-12-16: Use some kind of \cs{@startstrut}\cs{strutbox} instead of \cs{strut}}
% \changes{v1.0c}{2005/02/12}{Bugfix 05-01-23: \cs{@finalstrut}\cs{strutbox} added}
-% \changes{v1.0d}{2005/05/05}{Use \cs{caption@ifempty};
-% \cs{let}\cs{caption@ifstrut}\cs{@secondoftwo} added}
+% \changes{v1.0d}{2005/05/05}{Use \cs{caption@ifempty}; \cs{let}\cs{caption@ifstrut}\cs{@secondoftwo} added}
% \changes{v1.0d}{2005/05/05}{Bugfix: Handling of \cs{ifcaption@star} changed}
% \changes{v1.0f}{2005/08/24}{Check for empty label added}
% \changes{v1.0f}{2005/08/25}{\cs{caption@iflf} added}
-% \changes{v1.0j}{2007/02/18}{Usage of \cs{caption@tfmt} added}
+% \changes{v1.0j}{2007/02/18}{Usage of \cs{caption@textformat} added}
% \changes{v1.1}{2007/05/07}{Bugfix: \cs{ifhmode} added to \cs{@finalstrut}}
% \changes{v1.2}{2007/11/17}{Made option \opt{size=} stronger than \opt{font=}}
% \changes{v1.3}{2010/09/04}{Uses \cs{caption@applyfont} now}
% \changes{v1.3}{2010/11/01}{Bugfix: If the caption text is empty, the text format will be set to \opt{simple} now}
-% \changes{v1.7}{2016/02/01}{Bugfix: \cs{relax} added before \cs{caption@lsep} so the label separator
-% will not be gobbled if the label font command ignores spaces, e.g. by usage of \cs{color}}
-% \changes{v1.8}{2018/09/12}{\cs{par} replaced by \cs{captiontextend}}
-% |\caption@@@make|\marg{caption label}\marg{caption text}\par
-% This one finally typesets the caption paragraph, without margin and indention.
+% \changes{v1.7}{2016/02/01}{Bugfix: \cs{relax} added before \cs{caption@lsep} so the label separator will not be gobbled if the label font command ignores spaces, e.g. by usage of \cs{color}}
+% \changes{v1.8}{2018/09/12}{\cs{par} replaced by \cs{caption@textend}}
+% \changes{v2.2c}{2020/10/10}{Usage of the label separators \opt{gobble} and \opt{gobbletwo} added}
+% \changes{v2.2e}{2020/10/21}{Adaptions to \package{floatrow} package added}
+% |\caption@@@make|\marg{caption label}\marg{caption text}\\
+% This one finally typesets the caption paragraph, without margin and indention.
% \begin{macrocode}
\newcommand\caption@@@make[2]{%
% \end{macrocode}
-%
-% If the label is empty, we use no caption label separator.
-% \begin{macrocode}
- \sbox\@tempboxa{#1}%
+% The \package{floatrow} package uses |\caption@@@make|, too,
+% but without using |\caption@single|\-|line| or |\caption@multi|\-|line|.
+% For this reason we must expand |\caption@format| if |\caption@fmt| isn't defined yet.
+% Furthermore it uses |\caption@lfmt| as argument which was renamed to
+% |\caption@label|\-|format| in \package{caption3}\version{2.0}.
+% \begin{macrocode}
+ \ifx\caption@fmt\@undefined\caption@format\fi
+ \let\caption@lfmt\caption@labelformat
+% \end{macrocode}
+% If the label is empty, we use the label separator `none'.
+% Futhermore we use this check to determine if |#1| ends with either
+% |\@gobble|, |\@gobble|\-|two|, and/or |\ignore|\-|spaces|.
+% If yes, we use the corresponding label separator.
+% \begin{macrocode}
+ \global\def\caption@tempa{gobbletwo}%
+ \global\def\caption@tempb{}%
+ \sbox\@tempboxa{%
+ \let\caption@ignorespaces\ignorespaces
+ \def\ignorespaces{%
+ \global\def\caption@tempb{two}% "gobble" -> "gobbletwo" if \ignorespaces is used addtionally
+ \caption@ignorespaces}%
+ #1%
+ {\global\let\caption@tempa\@undefined\aftergroup\@gobble}%
+ {\global\def\caption@tempa{gobble\caption@tempb}}}%
\ifdim\wd\@tempboxa=\z@
- \let\caption@lsep\relax
+ \gdef\caption@tempa{none}%
% \@capbreakfalse
\fi
+ \ifx\caption@tempa\@undefined \else
+ \@expandtwoargs\caption@set{labelseparator}{\caption@tempa}%
+ \fi
% \end{macrocode}
-%
-% If the text is empty, we use no caption label separator, too.
-% (And no text format either.)
+% If the text is empty, we use no caption label separator, too.
+% (And no text format either.)
% \begin{macrocode}
\caption@ifempty{#2}{%
- \let\caption@lsep\@empty
- \let\caption@tfmt\@firstofone
+ \caption@set{labelseparator}{none}%
+ \caption@set{textformat}{simple}%
% \@capbreakfalse
% \let\caption@ifstrut\@secondoftwo
}%
% \end{macrocode}
-%
-% Take care that |\caption@parindent| and |\caption@hangindent| will be used
-% to typeset the paragraph.
+% \begin{macrocode}
+ \caption@labelseparator % defines \caption@iflabelfont, \caption@labelsep and \caption@labelsep@name (the latter is needed by \caption@fmt)
+% \end{macrocode}
+% Take care that |\caption@par|\-|indent| and |\caption@hang|\-|indent|
+% will be used to typeset the paragraph.
% \begin{macrocode}
\@setpar{\@@par\caption@@par}\caption@@par
% \end{macrocode}
-%
-% Finally typeset the caption.
+% Finally typeset the caption.
% \begin{macrocode}
\caption@applyfont
\caption@fmt
{\ifcaption@star\else
\begingroup
\captionlabelfont
- #1%
+ #1\relax\relax
\endgroup
\fi}%
{\ifcaption@star\else
\begingroup
- \caption@iflf\captionlabelfont
- \relax\caption@lsep
+ \caption@iflabelfont\captionlabelfont
+ \relax\caption@labelsep
\endgroup
\fi}%
{{\captiontextfont
- \captiontextstart
+ \caption@textstart
\caption@ifstrut
{\vrule\@height\ht\strutbox\@width\z@}%
{}%
\nobreak\hskip\z@skip % enable hyphenation
- \caption@tfmt{#2}%
+ \caption@textformat{#2}%
% \caption@ifstrut{\vrule\@height\z@\@depth\dp\strutbox\@width\z@}{}%
\caption@ifstrut
{\ifhmode\@finalstrut\strutbox\fi}%
{}%
- \captiontextend}}}
+ \caption@textend}}}
% \end{macrocode}
% \begin{macrocode}
-\newcommand*\captiontextstart{}
-\newcommand*\captiontextend{\par}
+\newcommand*\caption@textstart{}
+\newcommand*\caption@textend{\par}
% \end{macrocode}
% \end{macro}
%
@@ -3567,12 +4286,12 @@
% \changes{v1.1}{2007/07/04}{Re-defines itself now}
% \changes{v1.2a}{2007/01/22}{Revised so \cs{label} will be detected, too}
% \changes{v1.2b}{2008/08/02}{Revised so \cs{index} and \cs{glossary} will be detected, too}
-% |\caption@ifempty|\marg{text}\marg{true} (\emph{no} \meta{false})\par
-% This one tests if the \meta{text} is actually empty.
-% \Note{This will be done without expanding the text,
-% therefore this is far away from being bullet-proof.}
-% \Note{This macro is re-defining itself so only
-% the first test (in a group) will actually be done.}
+% |\caption@ifempty|\marg{text}\marg{yes-code}\\
+% tests if the \meta{text} is actually empty.
+% \Note{This will be done without expanding the text,
+% therefore this is far away from being bullet-proof.}
+% \Note{This macro is re-defining itself so only
+% the first test (in a group) will actually be done.}
% \begin{macrocode}
\newcommand\caption@ifempty[1]{%
\caption@if@empty{#1}%
@@ -3621,8 +4340,8 @@
%
% \begin{macro}{\caption@@par}
% \changes{v1.0f}{2005/08/22}{Made this definition global}
-% |\caption@@par|\par
-% This command will be executed with every |\par| inside the caption.
+% |\caption@@par|\\
+% will be expanded with every |\par| inside the caption.
% \begin{macrocode}
\newcommand*\caption@@par{%
\parindent\caption@parindent\hangindent\caption@hangindent}%
@@ -3640,36 +4359,58 @@
% \changes{v1.2b}{2008/08/02}{Support of \cs{float@exts} and \cs{float@addtolists} added}
% \changes{v1.2e}{2010/01/09}{Usage of \cs{caption@DeclareWithinOption} added}
% \changes{v1.3}{2011/08/06}{Definition of \cs{listofXXXes} added}
-% \changes{v1.4a}{2011/10/29}{Outsourced as \package{newfloat} package}
-% |\DeclareCaptionType|\oarg{options}\marg{environment}\oarg{name}\oarg{list name}
+% \changes{v1.4a}{2011/10/29}{Outsourced to \package{newfloat} package}
+% |\DeclareCaptionType|\oarg{options}\marg{environment}\oarg{name}\oarg{list name}\\
+% loads the \package{newfloat} package and uses |\Declare|\-|Floating|\-|Environment|.
% \begin{macrocode}
\newcommand*\DeclareCaptionType{%
- \RequirePackage{newfloat}%
+ \caption@loadpackage{newfloat}{declare type}%
\DeclareFloatingEnvironment}
\@onlypreamble\DeclareCaptionType
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\caption@ForEachType}
+% \begin{macro}{\ForEachCaptionType}
% \changes{v1.4a}{2011/10/29}{This macro added}
-% |\caption@ForEachType|\marg{code}
-% will execute the given code for all (known) floating environments.
+% \changes{v1.13}{2020/07/29}{Renamed from \cs{caption@ForEachType} to \cs{ForEachCaptionType} and starred variant added}
+% |\ForEachCaptionType*|\marg{code with \#1}\\
+% will execute the given code for each (known) floating environment.
+% The starred variant will only work for already existing environments,
+% i.e.~no hook will be placed inside |\Declare|\-|Floating|\-|Environment|
+% (offered by the \package{newfloat} package).
+% \begin{macrocode}
+\newcommand*\ForEachCaptionType{%
+ \@ifstar
+ {\caption@foreach@type\@gobble}%
+ {\caption@foreach@type\@iden}}
+% \end{macrocode}
% \begin{macrocode}
-\newcommand\caption@ForEachType[1]{%
+\newcommand\caption@foreach@type[2]{%
\caption@ifdefined\ForEachFloatingEnvironment
- {\ForEachFloatingEnvironment{#1}}%
- {\def\@elt##1{#1}%
+ {\ForEachFloatingEnvironment*{#2}}%
+ {\def\@elt##1{#2}%
\caption@ifdefined\c@figure\@elt\@gobble{figure}%
\caption@ifdefined\c@table\@elt\@gobble{table}%
- \let\@elt\relax
- \newfloat@addtohook{#1}}}
+ \let\@elt\relax}%
+ #1{\newfloat@addtohook{#2}}}
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\newfloat@addtohook}
+% |\newfloat@addtohook|\marg{code with \#1}\\
+% adds code to the hook called in |\Declare|\-|Floating|\-|Environment|.\par
+% Note: We use |\provide|\-|command| instead of |\new|\-|command| here since the
+% exact same code is defined in the \package{newfloat} package.
% \begin{macrocode}
\providecommand\newfloat@addtohook[1]{%
\toks@=\expandafter{\newfloat@hook{##1}#1}%
\edef\@tempa{\def\noexpand\newfloat@hook####1{\the\toks@}}%
\@tempa}
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\newfloat@hook}
+% Hook used in |\Declare|\-|Floating|\-|Environment|.
% \begin{macrocode}
\providecommand*\newfloat@hook[1]{}
% \end{macrocode}
@@ -3685,11 +4426,13 @@
% \changes{v1.5}{2013/01/10}{Bugfix: Definition of autoref string corrected}
% \changes{v1.6}{2013/06/17}{Bugfix: \cs{c@tocdepth} will be set (locally) now}
% \changes{v1.8g}{2020/01/02}{Check revised if the sub-type is already defined or not}
-% |\DeclareCaptionSubType|\oarg{numbering scheme}\marg{type}\\
-% |\DeclareCaptionSubType*|\oarg{numbering scheme}\marg{type}\par
-% The starred variant provides the numbering format
-% \meta{type}|.|\meta{subtype} while the non-starred variant simply
-% uses \meta{subtype}.
+% \changes{v1.13}{2020/07/28}{Uses \cs{caption@l@addto@list} instead of \cs{@cons} now}
+% \changes{v1.13}{2020/07/29}{Usage of \cs{caption@subtype@hook} added}
+% \changes{v1.13}{2020/07/29}{We don't re-use existing counters anymore (This was a bad idea anyway)}
+% |\DeclareCaptionSubType*|\oarg{numbering scheme}\marg{type}\\
+% The starred variant provides the numbering format
+% \meta{type}|.|\meta{subtype} while the non-starred variant simply uses
+% \meta{subtype}.
% \begin{macrocode}
\newcommand*\DeclareCaptionSubType{%
\caption@teststar\caption@declaresubtype\@firstoftwo\@secondoftwo}
@@ -3704,39 +4447,42 @@
\def\caption@@declaresubtype#1[#2]#3{%
\@ifundefined{c@#3}%
{\caption@Error{No float type '#3' defined}}%
+ {\caption@@@declaresubtype{#1}{#2}{#3}{sub#3}}}
+\@onlypreamble\caption@@declaresubtype
% \end{macrocode}
-% Check if the sub-type was already defined by |\Declare|\-|Sub|\-|Type|.
-% If not, define the counter and list entry.
% \begin{macrocode}
- {\caption@ifsubtype{sub#3}%
- {\caption@Debug{Modify subtype `sub#3'}}%
- {\caption@Debug{New subtype `sub#3'}%
- \@ifundefined{c@sub#3}%
- {\newcounter{sub#3}\relax}%
- {\caption@Warning{Using already defined counter `sub#3'}}%
- \@addtoreset{sub#3}{#3}%
- \@namedef{ext@sub#3}{\csname ext@#3\endcsname}%
- \caption@declaresublistentry{#3}%
- \@cons\caption@subtypelist{{#3}}}%
+\newcommand*\caption@@@declaresubtype[4]{%
% \end{macrocode}
-% Support of \package{titletoc} package
% \begin{macrocode}
- \caption@ifdefined\contentsuse{%
- \contentsuse{sub#3}{\csname ext@sub#3\endcsname}}{}%
+% Check if the sub-type was already defined by |\Declare|\-|Sub|\-|Type|.
+% If not, define the counter and list entry.
+% \begin{macrocode}
+ \caption@ifsubtype{#4}%
+ {\caption@Debug{Modify subtype `#4'}}%
+ {\caption@Debug{New subtype `#4'}%
+ \newcounter{#4}[{#3}]%
+ \@namedef{ext@#4}{\csname ext@#3\endcsname}%
+ \caption@declaresublistentry{#3}%
+ \caption@l@addto@list\caption@subtypelist{#4}%
+ \caption@subtype@hook{#4}}%
% \end{macrocode}
+% Support of \package{titletoc} package
% \begin{macrocode}
- \@namedef{sub#3name}{}%
- \@namedef{sub#3autorefname}{\csname #3autorefname\endcsname}%
- #1% is \@firstoftwo in star form, and \@secondoftwo otherwise
- {\@namedef{p@sub#3}{}%
- \@namedef{thesub#3}{\csname the#3\endcsname.\@nameuse{#2}{sub#3}}}%
- {\@namedef{p@sub#3}{\csname the#3\endcsname}%
- \@namedef{thesub#3}{\@nameuse{#2}{sub#3}}}%
- \@namedef{theHsub#3}{\csname theH#3\endcsname.\arabic{sub#3}}%
- }}
+ \caption@ifdefined\contentsuse{%
+ \contentsuse{#4}{\csname ext@#4\endcsname}}{}%
% \end{macrocode}
% \begin{macrocode}
-\@onlypreamble\caption@@declaresubtype
+ \@namedef{#4name}{}%
+ \@namedef{#4autorefname}{\csname #3autorefname\endcsname}%
+ #1% is \@firstoftwo in star form, and \@secondoftwo otherwise
+ {\@namedef{p@#4}{}%
+ \@namedef{the#4}{\csname the#3\endcsname.\@nameuse{#2}{#4}}}%
+ {\@namedef{p@#4}{\csname the#3\endcsname}%
+ \@namedef{the#4}{\@nameuse{#2}{#4}}}%
+ \@namedef{theH#4}{\csname theH#3\endcsname.\arabic{#4}}}
+% \end{macrocode}
+% \begin{macrocode}
+\@onlypreamble\caption@@@declaresubtype
% \end{macrocode}
% \begin{macrocode}
\newcommand*\caption@declaresublistentry{%
@@ -3757,12 +4503,12 @@
% \begin{macrocode}
\long\def\caption@@@declaresublistentry#1\@dottedtocline#2\caption@nil#3{%
\def\@tempa{#1}%
-% Does \l@(sub)subsection start with \@dottedtocline?
+% Does \l@(sub)subsection start with \@dottedtocline?
\ifx\@tempa\@empty
-% Yes
+% Yes
\caption@@@@declaresublistentry{#3}#2\caption@nil
\else
-% No
+% No
\caption@@@@declaresublistentry{#3}@{3.8em}{3.2em}\caption@nil
\fi}
\@onlypreamble\caption@@@declaresublistentry
@@ -3798,8 +4544,8 @@
% \end{macro}
%
% \begin{macro}{\caption@subtypelist}
-% An \cs{@elt}-list containing the subtypes defined
-% with |\Declare|\-|Caption|\-|Sub|\-|Type|.
+% A list containing the sub-types defined with
+% |\Declare|\-|Caption|\-|Sub|\-|Type|.
% \begin{macrocode}
\newcommand*\caption@subtypelist{}
% \end{macrocode}
@@ -3807,149 +4553,85 @@
%
% \begin{macro}{\caption@ifsubtype}
% \changes{v1.8g}{2020/01/02}{This macro added}
-% This macro checks if the given subtype was defined
-% with |\Declare|\-|Caption|\-|Sub|\-|Type| or not.
+% \changes{v1.13}{2020/07/28}{Uses \cs{caption@ifin@list} now}
+% |\caption@ifsubtype|\marg{yes-code}\marg{no-code}\\
+% checks if the given subtype was defined with
+% |\Declare|\-|Caption|\-|Sub|\-|Type|.
% \begin{macrocode}
-\newcommand*\caption@ifsubtype[1]{%
- \begingroup
- \let\next\@secondoftwo
- \edef\@tempa{#1}%
- \def\@elt##1{%
- \def\@tempb{sub##1}%
- \ifx\@tempa\@tempb
- \let\next\@firstoftwo
- \fi}%
- \caption@subtypelist
- \expandafter\endgroup\next}
+\newcommand*\caption@ifsubtype{%
+ \caption@ifin@list\caption@subtypelist}
% \end{macrocode}
% \end{macro}
%
-% Unfortunately the \class{memoir} document class resets the
-% \texttt{subfigure} resp.~\texttt{subtable} counter at the begin
-% of floating environments, i.e.~at |\@float|.
-% As a side-effect |\Continued|\-|Float| does not work correctly.
-% For that reason we need to introduce macros to save and restore
-% all sub-caption counters here.
-%
-% \begin{macro}{\caption@restorecounters}
-% \changes{v1.5}{2013/05/01}{This macro added}
-% |\caption@restore|\-|counters| restores all counters saved with
-% |\caption@save|\-|counter|.
+% \begin{macro}{\ForEachCaptionSubType}
+% \changes{v1.13}{2020/07/29}{This macro added as replacement for \cs{caption@For}}
+% |\ForEachCaptionSubType*|\marg{code with \#1}\\
+% will execute the given code for each (known) sub-type.
+% The starred variant will only work for already existing sub-types,
+% i.e.~no hook will be placed inside |\Declare|\-|Caption|\-|Sub|\-|Type|.
% \begin{macrocode}
-\newcommand*\caption@restorecounters{%
- \caption@restore@counters
- \global\let\caption@restore@counters\@empty}
+\newcommand*\ForEachCaptionSubType{%
+ \@ifstar
+ {\caption@foreach@subtype\@gobble}%
+ {\caption@foreach@subtype\@iden}}
% \end{macrocode}
% \begin{macrocode}
-\newcommand*\caption@restore@counters{}
+\newcommand\caption@foreach@subtype[2]{%
+ \caption@for@list\caption@subtypelist{#2}%
+ #1{\caption@addto@subtype@hook{#2}}}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\caption@savesubcounters}
-% \changes{v1.5}{2013/05/01}{This macro added}
-% |\caption@save|\-|sub|\-|counters| saves all sub-caption counters,
-% so they can be restored with |\caption@restore|\-|counters| later on.
% \begin{macrocode}
-\newcommand*\caption@savesubcounters{%
- \def\@elt##1{\caption@savecounter{sub##1}}%
- \caption@subtypelist
- \let\@elt\relax}%
+\providecommand\caption@addto@subtype@hook[1]{%
+ \toks@=\expandafter{\caption@subtype@hook{##1}#1}%
+ \edef\@tempa{\def\noexpand\caption@subtype@hook####1{\the\toks@}}%
+ \@tempa}
% \end{macrocode}
% \begin{macrocode}
-\newcommand*\caption@savecounter[1]{%
- \edef\caption@tempa{%
- \noexpand\l@addto@macro\noexpand\caption@restore@counters
- {\noexpand\setcounter{#1}{\number\value{#1}}}}%
- \caption@tempa}
+\providecommand*\caption@subtype@hook[1]{}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\caption@For}
-% \changes{v1.1a}{2007/09/07}{This macro added}
-% \changes{v1.2}{2007/11/16}{Renamed from \cs{ForFloatingEnvironments} to \cs{caption@For}}
-% |\caption@For|\marg{elt-list}\marg{code with \#1}\\
-% |\caption@For*|\marg{elt-list}\marg{code with \#1}
-% \begin{macrocode}
-\newcommand*\caption@For{\caption@withoptargs\caption@@For}
-%\@onlypreamble\caption@For
-% \end{macrocode}
+% \begin{macro}{\@memresetsubcounter}
+% \changes{v1.5}{2013/05/01}{The macro \cs{caption@savesubcounters} added}
+% \changes{v1.13}{2020/07/28}{Uses \cs{caption@for@list} now for iterating the list}
+% \changes{v2.2b}{2020/10/06}{This stuff replaced by a patch of \cs{@memresetsubcounter}}
+% The \class{memoir} document class resets the \texttt{subfigure}
+% resp.~\texttt{subtable} counter at the begin of floating environments using
+% |\@mem|\-|reset|\-|sub|\-|counter|.
+% As a side-effect |\continued|\-|float| does not work correctly.
+% For that reason we need to patch |\@mem|\-|reset|\-|sub|\-|counter| here,
+% suppressing the counter reset if the counter was defined with
+% |\Declare|\-|Caption|\-|Sub|\-|Type|.
% \begin{macrocode}
-\newcommand\caption@@For[3]{%
- \caption@AtBeginDocument#1{%
- \def\@elt##1{#3}%
- \@nameuse{caption@#2}%
- \let\@elt\relax}}%
-%\@onlypreamble\caption@@For
+\caption@ifdefined\@memresetsubcounter
+ {\let\caption@memresetsubcounter\@memresetsubcounter
+ \renewcommand*\@memresetsubcounter[1]{%
+ \caption@ifsubtype{sub#1}\@gobble\caption@memresetsubcounter{#1}}}%
+ {}
% \end{macrocode}
% \end{macro}
%
-% \section{subfig package adaptions}
-% \changes{v1.1}{2007/07/07}{Several adaptions to the \package{subfig} package added}
-% \changes{v1.4a}{2011/11/01}{Bugfix 11-11-01: Test for the \package{subfig} package revised}
+% \section{Execution of options}
%
-% Since the \package{subfig} package is not maintained anymore,
-% we have to make several adaptions to \thispackage~\version{1.1} here.
-% Please note that we only support the version $1.3$ of the \package{subfig} package here.
-% So older versions do not work with this version of \thispackage, and newer
-% versions are expected to be adapted.
-% \begin{macrocode}
-\caption@AtBeginDocument{%
- \def\@tempa{2005/06/28 ver: 1.3 subfig package}%
- \expandafter\ifx\csname ver@subfig.sty\endcsname\@tempa
- \caption@InfoNoLine{subfig package v1.3 is loaded}%
-% \end{macrocode}
% \begin{macrocode}
- \let\caption@setfloattype\@gobble
- \let\@dottedxxxline\sf@NEW@dottedxxxline
- \let\sf@subfloat\sf@NEW@subfloat
-% \end{macrocode}
-% \begin{macrocode}
- \fi
- \let\sf@NEW@dottedxxxline\@undefined
- \let\sf@NEW@subfloat\@undefined}
+\ifx\caption@documentclass\@empty\else
+ \@pushfilename
+ \edef\@currname{caption-\caption@documentclass}
+ \edef\@currext{sto}
+ \InputIfFileExists
+ {\@currname.\@currext}%
+ {}%
+ {\@missingfileerror\@currname\@currext}%
+ \@popfilename
+\fi
% \end{macrocode}
%
-% \begin{macro}{\@dottedxxxline}
-% New version of |\@dottedxxxline|
% \begin{macrocode}
-\def\sf@NEW@dottedxxxline#1#2#3#4#5#6#7{%
- \begingroup
- \caption@setfloattype{#1}%
- \caption@setoptions{subfloat}%
- \caption@setoptions{sub#1}%
- \ifnum #3>\@nameuse{c@#2depth}\else
- \@dottedtocline{\z@}{#4}{#5}{#6}{#7}%
- \fi
- \endgroup}
+\captionsetup{style=default,position=default,listformat=default}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\sf@subfloat}
-% \changes{v1.4b}{2011/12/29}{Bugfix 11-12-23: Usage of \cs{caption@warmup} added}
-% New version of |\sf@subfloat|
% \begin{macrocode}
-\def\sf@NEW@subfloat{%
- \begingroup
- \@nameuse{caption@warmup}%
- \caption@setfloattype\@captype
- \sf@ifpositiontop{%
- \maincaptiontoptrue
- }{%
- \maincaptiontopfalse
- }%
- \caption@setoptions{subfloat}%
- \caption@setoptions{sub\@captype}%
- \let\sf@oldlabel=\label
- \let\label=\subfloat@label
- \ifmaincaptiontop\else
- \advance\@nameuse{c@\@captype}\@ne
- \fi
- \refstepcounter{sub\@captype}%
- \setcounter{sub\@captype @save}{\value{sub\@captype}}%
- \@ifnextchar [% %] match left bracket
- {\sf@@subfloat}%
- {\sf@@subfloat[\@empty]}}
+\ProcessOptions*
% \end{macrocode}
-% \end{macro}
%
% \iffalse
%</package>
diff --git a/Master/texmf-dist/source/latex/caption/ltcaption.dtx b/Master/texmf-dist/source/latex/caption/ltcaption.dtx
index 343dbf695b4..fab8a4c05ea 100644
--- a/Master/texmf-dist/source/latex/caption/ltcaption.dtx
+++ b/Master/texmf-dist/source/latex/caption/ltcaption.dtx
@@ -2,7 +2,7 @@
%
% This is file `ltcaption.dtx'.
%
-% Copyright (C) 2007-2013 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
+% Copyright (C) 2007-2020 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
%
% --------------------------------------------------------------------------
%
@@ -19,23 +19,25 @@
% This Current Maintainer of this work is Axel Sommerfeldt.
%
% This work consists of the files
-% caption.ins, caption.dtx, caption2.dtx, caption3.dtx,
-% bicaption.dtx, ltcaption.dtx, subcaption.dtx, totalcount.dtx,
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
% the derived files
-% caption.sty, caption2.sty, caption3.sty,
-% bicaption.sty, ltcaption.sty, subcaption.sty, totalcount.sty,
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
% and the user manuals
% caption-deu.tex, caption-eng.tex, caption-rus.tex.
%
% \fi
-% \CheckSum{378}
+% \CheckSum{381}
%
% \iffalse
%<*driver>
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesFile{ltcaption.drv}%
- [2013/06/01 v1.4 This package fixes caption problems with
- other-than-centered aligned longtables]
+\ProvidesFile{ltcaption.drv}[2013/06/01 v1.4 This package fixes caption problems with other-than-centered aligned longtables]
\hbadness=9999 \newcount\hbadness \hfuzz=48pt % Make TeX shut up.
%
\documentclass{ltxdoc}
@@ -77,7 +79,7 @@
%
% \def\thispackage{the \package{ltcaption} package}
% \def\Thispackage{The \package{ltcaption} package}
-% \newcommand*\version[2][]{\textit{v#2}}
+% \newcommand*\version[2][]{v$#2$}
%
% \GetFileInfo{ltcaption.drv}
% \let\docdate\filedate
@@ -464,7 +466,7 @@
%
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesPackage{ltcaption}[2018/08/26 v1.4a longtable captions (AR)]
+\ProvidesPackage{ltcaption}[2020/05/30 v1.4b longtable captions (AR)]
% \end{macrocode}
%
% \begin{macrocode}
@@ -554,6 +556,7 @@
%
% \begin{macro}{\LT@array}
% \changes{v1.1a}{2008/03/21}{Improved redefinition of \cs{refstepcounter} etc.}
+% \changes{v1.4b}{2020/05/30}{Re-definition of \cs{captionnewline} added}
% We insert our stuff into the definition of |\LT@array| here.
% Since the \package{hyperref} package patches |\LT@array| as well
% and since this only works with the original definition of |\LT@array|,
@@ -582,6 +585,10 @@
% \begin{macrocode}
\def\lst@@caption{\relax}%
% \end{macrocode}
+% Re-define |\caption|\-|newline| so |\par| will be used inside longtables instead of |\\|.
+% \begin{macrocode}
+ \def\captionnewline{\par}%
+% \end{macrocode}
% \begin{macrocode}
\ltcaption@ORI@LT@array}}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/caption/subcaption.dtx b/Master/texmf-dist/source/latex/caption/subcaption.dtx
index a3b8bdb2ee8..3dc8cca22e0 100644
--- a/Master/texmf-dist/source/latex/caption/subcaption.dtx
+++ b/Master/texmf-dist/source/latex/caption/subcaption.dtx
@@ -19,21 +19,25 @@
% This Current Maintainer of this work is Axel Sommerfeldt.
%
% This work consists of the files
-% caption.ins, caption.dtx, caption2.dtx, caption3.dtx,
-% bicaption.dtx, ltcaption.dtx, subcaption.dtx, totalcount.dtx,
+% caption.ins, caption.dtx, caption-light.dtx, caption2.dtx, caption3.dtx,
+% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx,
+% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx,
+% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx,
% the derived files
-% caption.sty, caption2.sty, caption3.sty,
-% bicaption.sty, ltcaption.sty, subcaption.sty, totalcount.sty,
+% caption.sty, caption-light.sty, caption2.sty, caption3.sty,
+% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto,
+% caption-koma.sto, caption-memoir.sto, caption-ntg.sto,
+% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty,
% and the user manuals
% caption-deu.tex, caption-eng.tex, caption-rus.tex.
%
% \fi
-% \CheckSum{232}
+% \CheckSum{221}
%
% \iffalse
%<*driver>
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesFile{subcaption.drv}[2019/09/10 v1.3 Adds a sub-caption feature to the caption package]
+\ProvidesFile{subcaption.drv}[2020/08/24 v1.3 Adds a sub-caption feature to the caption package]
\hbadness=9999 \newcount\hbadness \hfuzz=74pt % Make TeX shut up.
%\errorcontextlines=3
%
@@ -74,7 +78,7 @@
%
\newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
\newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
-\newcommand*\version[2][]{$v#2$}
+\newcommand*\version[2][]{v$#2$}
%
\usepackage{marvosym}
\makeatletter
@@ -176,7 +180,7 @@
%
% The default settings for |sub|captions are:
% \begin{quote}
-% |margin=0pt,size=smaller,labelformat=parens,labelsep=space,|\\
+% |margin=0pt,font+=smaller,labelformat=parens,labelsep=space,|\\
% |skip=6pt,list=false,hypcap=false|~\footnote{%^^A
% This means that sub-captions are not listed in the List of Figures
% or Tables by default, but you can enable that by
@@ -197,7 +201,7 @@
% \item Local settings
% {\small(|\captionsetup{|\ldots|}| inside |figure| or |table| environment)}
% \item Default `sub' settings
-% {\small(|margin=0pt,size=smaller,|\ldots, see above)}
+% {\small(|margin=0pt,font+=smaller,|\ldots, see above)}
% \item Custom `sub' settings
% {\small(|\usepackage[|\ldots|]{subcaption}| and |\captionsetup[sub]{|\ldots|}|)}
% \item Environmental `sub' settings
@@ -349,7 +353,16 @@
% \begin{background}
% The |\sub|\-|caption|\-|box| is a |\par|\-|box| with
% |\set|\-|caption|\-|sub|\-|type| as first contents line.
-% \iffalse See implementation for details.\fi
+% \iffalse
+% Prepared with |\Declare|\-|Caption|\-|Sub|\-|Type| (offered by the
+% \package{caption} package), the caption package command |\set|\-|caption|\-|sub|\-|type|
+% becames available.
+% Analogous to the |\set|\-|caption|\-|type| command of the \package{caption} package,
+% the |\set|\-|caption|\-|sub|\-|type| command sets the sub-type of the box or environment
+% (so |\caption| will typeset a sub-caption instead of an ordinary one),
+% places a proper hyperlink anchor (non-starred variant only),
+% executes options associated with the sub-type etc.
+% \fi
% \end{background}
%
% \PageBreak
@@ -416,7 +429,7 @@
% The |subfigure| \& |subtable| environments are just simple |minipage|
% environments with |\set|\-|caption|\-|sub|\-|type| as first contents line.
% These environments are defined with the help of
-% |\caption@For{subtypelist}|, which executes code for every sub-type
+% |\For|\-|Each|\-|Caption|\-|Sub|\-|Type|, which executes code for every sub-type
% declared with |\Declare|\-|Caption|\-|Sub|\-|Type|.
% \end{background}
%
@@ -466,14 +479,6 @@
% \bigskip
%
% \begin{background}
-% Prepared with |\Declare|\-|Caption|\-|Sub|\-|Type| (offered by the
-% \package{caption} package), the caption package command |\set|\-|caption|\-|sub|\-|type|
-% becames available.
-% Analogous to the |\set|\-|caption|\-|type| command of the \package{caption} package,
-% the |\set|\-|caption|\-|sub|\-|type| command sets the sub-type of the box or environment
-% (so |\caption| will typeset a sub-caption instead of an ordinary one),
-% places a proper hyperlink anchor (non-starred variant only),
-% executes options associated with the sub-type etc.\par
% The |\subcaption| command is just a simple combination of
% |\set|\-|caption|\-|sub|\-|type*| and |\caption|.
% \end{background}
@@ -484,9 +489,6 @@
% \DescribeMacro\DeclareCaptionSubType
% For using the sub-caption feature of the \package{caption} package some
% commands and counters must be prepared. This is done with
-% \iffalse\footnote{%^^A
-% \cs{newsubfloat} offered by the \package{subfig} package\cite{subfig}
-% could be used for this purpose as well.}\fi
% \begin{quote}
% |\DeclareCaptionSubType|\oarg{numbering scheme}\marg{type}\\
% |\DeclareCaptionSubType*|\oarg{numbering scheme}\marg{type}
@@ -536,8 +538,8 @@
% \end{minipage}
%
% \begin{background}
-% |\Declare|\-|Caption|\-|Sub|\-|Type| is an integral part of the \package{caption}
-% package kernel.
+% |\Declare|\-|Caption|\-|Sub|\-|Type| and |\For|\-|Each|\-|Caption|\-|Sub|\-|Type|
+% are integral parts of the \package{caption} package kernel.
% \end{background}
%
% \PageBreak
@@ -797,12 +799,16 @@
%
% \pagebreak[3]
% \section{Beyond this package}
-% \label{floatrow}
+% \label{keyfloat}\label{floatrow}
%
% For a more advanced usage of the sub-caption feature of the
-% \package{caption} package, please take a look at the \package{floatrow}
-% package\cite{floatrow} which provides the powerful \texttt{subfloatrow}
-% environment for typesetting sub-figures.
+% \package{caption} package, please take a look at the excellent
+% \package{keyfloat} package\cite{keyfloat} which provides the environments
+% |key|\-|sub|\-|figs|, |key|\-|sub|\-|tabs|, and |key|\-|sub|\-|floats| for
+% typesetting sub-figures and sub-tables.
+%
+% Furthermore the \package{floatrow} package\cite{floatrow} provides the
+% |sub|\-|float|\-|row| environment for typesetting sub-figures.
%
% \iffalse
% --------------------------------------------------------------------------- %
@@ -840,6 +846,11 @@
% \href{http://www.ctan.org/pkg/hypcap}%
% {\emph{The hypcap package -- Adjusting anchors of captions}},
% 2007/04/09
+% \bibitem{keyfloat}
+% Brian Duun:\\
+% \href{http://www.ctan.org/pkg/keyfloat}%
+% {\emph{The \LaTeX\ keyfloat Package}},
+% 2019/09/23
% \iffalse
% \bibitem{subfig}
% Steven D. Cochran:\\
@@ -924,93 +935,75 @@
%
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesPackage{subcaption}[2020/01/22 v1.3d Sub-captions (AR)]
+\ProvidesPackage{subcaption}[2020/10/07 v1.3j Sub-captions (AR)]
% \end{macrocode}
%
% \subsection{Initial code}
%
% Since we base on the \package{caption} package we load it here.
% \begin{macrocode}
-\RequirePackage{caption}[2020/01/03] % needs v3.4h or newer
+\RequirePackage{caption}[2020/09/28] % needs v3.5c or newer
% \end{macrocode}
%
+% \begin{macro}{\subcaption@Error}
+% \changes{v1.3h}{2020/09/28}{This macro added}
+% |\subcaption@Error|\marg{message}\\
+% issues an error message (with code line indication).
+% \begin{macrocode}
+\newcommand*\subcaption@Error[1]{%
+ \PackageError{subcaption}{#1}{\caption@@eh{subcaption}}}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\subcaption@CheckCompatibility}
% \changes{v1.1}{2011/09/01}{Compatibility error added}
% \changes{v1.1}{2016/05/22}{The presence of \package{subfigure} or \package{subfig} will be checked \cs{AtBeginDocument}, too}
+% \changes{v1.3g}{2020/08/01}{Error text adapted to \package{caption} package~\version{4.0}}
% Since we are incompatible to them an error message will be issued when
% the \package{subfigure} or \package{subfig} package is loaded.
% \begin{macrocode}
-\newcommand\subcaption@CheckCompatibility{%
+\newcommand*\subcaption@CheckCompatibility{%
% \end{macrocode}
% \begin{macrocode}
- \@ifundefined{caption@ifcompatibility}{}{%
- \caption@ifcompatibility{%
- \caption@Error{%
- The `subcaption' package does not work correctly\MessageBreak
- in compatibility mode}}{}}%
+ \caption@ifcompatibility{%
+ \subcaption@Error
+ {This package does not work with\MessageBreak
+ caption option `compatibility=v1'}%
+ \endinput}{}%
% \end{macrocode}
% \begin{macrocode}
\@ifpackageloaded{subfigure}{%
- \PackageError{subcaption}%
+ \subcaption@Error
{This package can't be used in cooperation\MessageBreak
with the subfigure package}%
- {\subcaption@EH}%
\endinput}{}%
% \end{macrocode}
% \begin{macrocode}
\@ifpackageloaded{subfig}{%
- \PackageError{subcaption}%
+ \subcaption@Error
{This package can't be used in cooperation\MessageBreak
with the subfig package}%
- {\subcaption@EH}%
\endinput}{}%
% \end{macrocode}
% \begin{macrocode}
}
% \end{macrocode}
% \begin{macrocode}
-\newcommand*\subcaption@EH{%
- If you do not understand this error, please take a closer look\MessageBreak
- at the documentation of the `subcaption' package, especially the\MessageBreak
- section about errors.\MessageBreak\@ehc}
-% \end{macrocode}
-% \begin{macrocode}
\subcaption@CheckCompatibility
-% \end{macrocode}
-% \begin{macrocode}
\caption@AtBeginDocument{%
\subcaption@CheckCompatibility
- \let\subcaption@CheckCompatibility\@undefined
- \let\subcaption@EH\@undefined
-}
+ \let\subcaption@CheckCompatibility\@undefined}
% \end{macrocode}
% \end{macro}
%
% \subsection{Main code}
%
-% \changes{v1.1}{2011/10/30}{Adapted to the newfloat package}
-% We call |\Declare|\-|Caption|\-|Sub|\-|Type| for |figure|, |table|,
-% and each caption type declared with |\Declare|\-|Floating|\-|Environment| here.
-% \begin{macrocode}
-\caption@ForEachType{\DeclareCaptionSubType{#1}}
-% \end{macrocode}
-%
-% \begin{macro}{\newsubfloat}
-% \changes{v1.1}{2016/01/31}{Adapted to the memoir document class}
-% We re-define |\new|\-|sub|\-|float| (offered by the \package{memoir} document class),
-% so our stuff will be used instead.
-% \begin{macrocode}
-\caption@ifundefined\newsubfloat{}{%
- \renewcommand*\newsubfloat{\DeclareCaptionSubType}}
-% \end{macrocode}
-% \end{macro}
-%
% \pagebreak[3]
% \subsubsection{The \cs{subcaption} command}
%
% \begin{macro}{\subcaption}
-% \changes{v1.1}{2012/04/06}{\cs{newcommand} changed to \cs{def}
-% so it works with the \package{memoir} document class, too}
+% \changes{v1.1}{2012/04/06}{\cs{newcommand} changed to \cs{def} so it works with the \package{memoir} document class, too}
+% \changes{v1.3h}{2020/09/28}{Usage of \cs{caption@Error} replaced by \cs{subcaption@Error}}
% Without a prefacing |\set|\-|caption|\-|sub|\-|type|, |\sub|\-|caption| is some kind
% of |\caption|\-|of{sub|\-|\@cap|\-|type}|.
% \Note{Like \cs{captionof}, this command is designed to be used inside an
@@ -1019,7 +1012,7 @@
\def\subcaption{%
\caption@iftype
{\setcaptionsubtype*\caption}%
- {\caption@Error{\noexpand\subcaption outside float}%
+ {\subcaption@Error{\noexpand\subcaption outside float}%
\caption@gobble}}%
% \end{macrocode}
% But with a prefacing |\set|\-|caption|\-|sub|\-|type|, |\sub|\-|caption| is simply
@@ -1035,12 +1028,13 @@
%
% \begin{macro}{\phantomsubcaption}
% \changes{v1.1}{2011/08/17}{This macro added}
+% \changes{v1.3h}{2020/09/28}{Usage of \cs{caption@Error} replaced by \cs{subcaption@Error}}
% Same as |\phantom|\-|caption|, but for subfigures.
% \begin{macrocode}
\newcommand*\phantomsubcaption{%
\caption@iftype
{\setcaptionsubtype*\phantomcaption}%
- {\caption@Error{\noexpand\phantomsubcaption outside float}}}%
+ {\subcaption@Error{\noexpand\phantomsubcaption outside float}}}%
% \end{macrocode}
% \begin{macrocode}
\g@addto@macro\caption@subtypehook{%
@@ -1055,20 +1049,21 @@
% \begin{macro}{subtable}
% \changes{v1.2}{2016/02/21}{Optional argument values `B' and `T' added}
% \changes{v1.3d}{2020/01/22}{Definition and usage of \cs{@subfloatboxreset} added}
+% \changes{v1.3e}{2020/07/29}{Uses \cs{ForEachCaptionSubType} (instead of \cs{caption@For}) to define the environments now}
% This is just an ordinary \env{minipage} environment with
% |\setcaptionsubtype| as first contents line.
-% It will be defined using the helper macro |\caption@For{sub|\-|type|\-|list}|
-% offered by the \package{caption} kernel, so for every caption type
-% declared with |\Declare|\-|Floating|\-|Environment| a corresponding
+% It will be defined using the helper macro |\For|\-|Each|\-|Caption|\-|Sub|\-|Type|
+% offered by the \package{caption} kernel, so for every caption sub-type
+% declared with |\Declare|\-|Caption|\-|Sub|\-|Type| a corresponding
% `sub' environment will be defined automatically.
% \begin{macrocode}
-\caption@For{subtypelist}{%
- \newenvironment{sub#1}%
+\ForEachCaptionSubType{%
+ \newenvironment{#1}%
{\@ifnextchar[%]
\subcaption@iminipage
{\subcaption@iminipage[c]}}%
{\subcaption@endminipage
- \endminipage}}%
+ \endminipage}}
% \end{macrocode}
% We pass all other optional arguments using the generic helper macro
% |\caption@with|\-|opt|\-|args| offered by the \package{caption} kernel).
@@ -1183,31 +1178,48 @@
% \end{macrocode}
%
% \begin{macro}{\subcaption@setrefformat}
+% \changes{v1.3g}{2020/07/27}{Adapted to \package{caption3} v2.0}
+% \changes{v1.3h}{2020/09/28}{Usage of \cs{caption@Error} replaced by \cs{subcaption@Error}}
+% \changes{v1.3j}{2020/10/07}{Definition of the label formats \texttt{subsimple} and \texttt{subparens} added}
% |\subcaption@setrefformat|\marg{name}\par
% Selecting a subref format simply means saving the code (in |\subcaption@reffmt|).
% \begin{macrocode}
\newcommand*\subcaption@setrefformat[1]{%
- \@ifundefined{caption@lfmt@#1}%
- {\caption@Error{Undefined label format `#1'}}%
- {\expandafter\let\expandafter\subcaption@reffmt\csname caption@lfmt@#1\endcsname}}
+ \@ifundefined{caption@labelformat@#1}%
+ {\subcaption@Error{Undefined label format `#1'}}%
+ {\expandafter\let\expandafter\subcaption@reffmt\csname caption@labelformat@#1\endcsname}}
% \end{macrocode}
% \begin{macrocode}
\subcaption@setrefformat{simple}
% \end{macrocode}
+% To offer a smooth transition from the \package{subfig} to the \package{subcaption} package
+% we offer the options |sub|\-|ref|\-|format=sub|\-|simple| and |sub|\-|ref|\-|format=sub|\-|parens|, too.
+% \begin{macrocode}
+\DeclareCaptionLabelFormat{subsimple}{#2}
+\DeclareCaptionLabelFormat{subparens}{(#2)}
+% \end{macrocode}
% \end{macro}
%
% \subsection{Execution of options}
%
-% We use |\caption@ExecuteOptions| and |\caption@ProcessOptions| here to add
+% \changes{v1.1}{2018/05/01}{Option \texttt{font+=smaller} changed to \texttt{size=smaller}}
+% \changes{v1.3e}{2020/07/27}{Option \texttt{size=smaller} changed back to \texttt{font+=smaller}}
+% We use |\caption@Execute|\-|Options| and |\caption@Process|\-|Options| here to add
% the options to the `|sub|' option list instead of executing them immediately.
-% \changes{v1.1}{2018/05/01}{Bugfix: Option \texttt{font+=small} changed to \texttt{size=smaller}}
% \begin{macrocode}
\caption@SetupOptions{subcaption}{\captionsetup[sub]{#2}}%
\caption@ExecuteOptions{subcaption}{%
- size=smaller,labelformat=parens,labelsep=space,skip=6pt,list=0,hypcap=0}
+ font+=smaller,labelformat=parens,labelsep=space,skip=6pt,list=0,hypcap=0}
\caption@ProcessOptions*{subcaption}
% \end{macrocode}
%
+% \changes{v1.1}{2011/10/30}{Adapted to the newfloat package}
+% We call |\Declare|\-|Caption|\-|Sub|\-|Type| for |figure|, |table|,
+% and each floating environment declared with |\Declare|\-|Floating|\-|Environment| here.
+% \begin{macrocode}
+\ForEachCaptionType{\DeclareCaptionSubType{#1}}
+% \end{macrocode}
+%
% \subsection{Bonus material}
%
% \subsubsection{The \cs{subfloat} command}
@@ -1218,39 +1230,45 @@
% \changes{v1.3}{2019/08/31}{This macro re-added and revised}
% \changes{v1.3a}{2019/09/01}{\cs{ignorespaces} copied from \cs{sf@@@subfloat}}
% \changes{v1.3b}{2020/01/03}{Previous definition of \cs{subfloat} will be overwritten}
+% \changes{v1.3f}{2020/07/29}{Bugfix: Usage of \cs{caption@hj@default} replaced by \cs{captionbox@innerpos@default}}
+% \changes{v1.3i}{2020/09/28}{This macro will be defined with \cs{providecommand} now to preserve an original definition}
% |\subfloat|\oarg{list\_entry}\oarg{sub-caption}\marg{body}\par
% If \meta{sub-caption} is given, we map this to |\sub|\-|caption|\-|box|
% but transfer the |\label| from \meta{body} to \meta{sub-caption}.
% If not, we do the same as |\sub|\-|caption|\-|box| does, but use |\phantom|\-|caption| instead of |\caption|.
% In both cases we do a |\ignore|\-|spaces| at the end since the original implementation of |\sub|\-|float| does this, too.
% \begin{macrocode}
-\def\subfloat{%
- \@ifnextchar[\@subfloat\subfloat@}
+\caption@AtBeginDocument{\providecommand*\subfloat{%
+ \@ifnextchar[%]
+ \subcaption@subfloat
+ \subcaption@subfloat@}}
% \end{macrocode}
% \begin{macrocode}
-\long\def\@subfloat[#1]{%
- \@ifnextchar[{\@@subfloat{#1}}{\@@@subfloat\subcaptionbox{#1}}}
+\long\def\subcaption@subfloat[#1]{%
+ \@ifnextchar[%]
+ {\subcaption@@subfloat{#1}}%
+ {\subcaption@@@subfloat\subcaptionbox{#1}}}
% \end{macrocode}
% \begin{macrocode}
-\long\def\@@subfloat#1[#2]{%
- \@@@subfloat{\subcaptionbox[{#1}]}{#2}}
+\long\def\subcaption@@subfloat#1[#2]{%
+ \subcaption@@@subfloat{\subcaptionbox[{#1}]}{#2}}
% \end{macrocode}
% \begin{macrocode}
-\long\def\@@@subfloat#1#2#3{%
- \caption@getlabel#3\label{}\@nil
+\long\def\subcaption@@@subfloat#1#2#3{%
+ \caption@getlabel{#3}%
#1{#2\caption@thelabel}{\let\label\caption@gobble#3}%
\global\let\caption@thelabel\relax
\ignorespaces}
% \end{macrocode}
% \begin{macrocode}
-\def\subfloat@#1{%
+\def\subcaption@subfloat@#1{%
\setbox\@tempboxa\hbox{#1}%
\caption@iiiibox
\setcaptionsubtype
{\phantomcaption\@gobble}{\phantomcaption\@gobble}% no box with \caption
{}% no optional arguments for \caption
{}% no sub-caption
- [\wd\@tempboxa][\caption@hj@default]%
+ [\wd\@tempboxa][\captionbox@innerpos@default]%
{\unhbox\@tempboxa}%
\ignorespaces}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/cascade/cascade.dtx b/Master/texmf-dist/source/latex/cascade/cascade.dtx
index a69a8122128..33aaa5b8a93 100644
--- a/Master/texmf-dist/source/latex/cascade/cascade.dtx
+++ b/Master/texmf-dist/source/latex/cascade/cascade.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2018 by F. Pantigny
+% Copyright (C) 2018-2020 by F. Pantigny
% -----------------------------------
%
% This file may be distributed and/or modified under the
@@ -15,8 +15,8 @@
%
% \fi
% \iffalse
-\def\myfileversion{1.01}
-\def\myfiledate{2018/07/12}
+\def\myfileversion{1.1}
+\def\myfiledate{2020/07/05}
%
%
%<*batchfile>
@@ -26,7 +26,7 @@
\usedir{tex/latex/cascade}
\preamble
-Copyright (C) 2018 by F. Pantigny
+Copyright (C) 2018-2020 by F. Pantigny
-----------------------------------
This file may be distributed and/or modified under the
@@ -60,21 +60,53 @@ version 2005/12/01 or later.
\fvset{commandchars=\~\#\@,formatcom={\color{gray}}}
\parindent 0pt
\skip\footins = 2\bigskipamount
-\DisableCrossrefs
+
+
+\EnableCrossrefs
+\makeatletter
+\ExplSyntaxOn
+\DoNotIndex{\begin,\end}
+\DoNotIndex{\c@iRow,\c@jCol,\theiRow,\thejCol}
+\DoNotIndex{\pgfpicture,\endpgfpicture,\tikzpicture,\endtikzpicture}
+\DoNotIndex{\pgfpoint,\pgfnode,\pgfnodealias,\pgfcoordinate}
+\DoNotIndex{\pgf@x,\pgf@y}
+\DoNotIndex{\int_add:Nn,\int_case:nnTF,\int_compare:nNnTF,\int_compare:nTF,
+ \int_compare_p:nNn,\int_decr:N,\int_eval:n,\int_add:Nn,\int_gdecr:N,\int_gincr:N
+ \int_gset:Nn,\int_gset_eq:NN,\int_gzero:N,\int_gzero_new:N,\int_if_odd:nTF,
+ \int_max:nn,\int_new:N,\int_set:Nn,\int_set_eq:NN,\int_step_inline:nnn,
+ \int_step_variable:nNn,\int_step_variable:nnNn,\int_sub:Nn,\int_use:N,\int_zero:N,
+ \int_zero_new:N,\g_tmpa_int,\l_tmpa_int,\l_tmpb_int
+}
+\DoNotIndex{\dim_abs:n,\dim_add:Nn,\dim_compare:nNnTF,\dim_compare_p:nNn,
+\dim_const:Nn,\dim_eval:n,\dim_gadd:Nn,\dim_gset:Nn,\dim_gset_eq:NN,
+\dim_gset:Nn,\dim_gset_eq:NN,\dim_gsub:Nn,\dim_gzero_new:N,\dim_max:nn,
+\dim_min:nn,\dim_new:N,\dim_ration:nn,\dim_set:Nn,\dim_set_eq:NN,\dim_sub:Nn,
+\dim_use:N,\dim_zero:N,\dim_zero_new:N,\g_tmpa_dim,\l_tmpa_dim,\l_tmpb_dim,
+\c_zero_dim}
+\DoNotIndex{\cs_new_protected:Npn,\cs_new:Npn,\cs_set_eq:NN,
+\cs_set_protected:Npn}
+\DoNotIndex{\bool_if:NTF,\bool_new:N,\bool_set_false:N,\bool_set_true:N,\l_tmpa_bool}
+\DoNotIndex{\group_begin:,\group_end:,\c_math_toggle_token}
+\DoNotIndex{\tl_set:Nn,\l_tmpa_tl}
+\ExplSyntaxOff
+\makeatother
+
+
\begin{document}
\DocInput{cascade.dtx}
\end{document}
%</driver>
% \fi
-% \title{The package \pkg{cascade}\thanks{This document corresponds to the version~\myfileversion\space of
-% \pkg{cascade}, at the date of~\myfiledate.}}
+% \title{The package \pkg{cascade}\thanks{This document corresponds to the
+% version~\myfileversion\space of \pkg{cascade}, at the date of~\myfiledate.}}
% \author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}}
%
% \maketitle
%
% \begin{abstract}
-% The LaTeX package \pkg{cascade} provides a command |\Cascade| to do constructions to present mathematical
-% demonstrations with successive braces for the deductions.
+% The LaTeX package \pkg{cascade} provides a command |\Cascade| to do
+% constructions to present mathematical demonstrations with successive braces
+% for the deductions.
% \end{abstract}
%
%
@@ -82,8 +114,9 @@ version 2005/12/01 or later.
% \vspace{1cm}
% \section{Presentation}
%
-% The package \pkg{cascade} gives a command |\Cascade| which allows constructions like the following where the size
-% of the right brace is computed on only a part of the LaTeX elements composed on the left.
+% The package \pkg{cascade} provides a command |\Cascade| which allows
+% constructions like the following where the size of the right brace is computed
+% on only a part of the LaTeX elements composed on the left.
% \begin{center}
% \Cascade{$\det(A) = \begin{vmatrix}3&4\\ -1&7\end{vmatrix}\neq 0$}%
% {and, therefore, $A$ is inversible}%
@@ -122,12 +155,15 @@ version 2005/12/01 or later.
% \end{center}
%
% \interitem
-% For the lisibility of such constructions, a simplified version of |\Cascade| is available, named |\ShortCascade|.
+% For the lisibility of such constructions, a simplified version of |\Cascade|
+% is available, named |\ShortCascade|.
%
-% The code |\ShortCascade{X}{Y}| is merely a shortcut for the code |\Cascade{}{X}{}{Y}|.
+% The code |\ShortCascade{X}{Y}| is merely a shortcut for the code
+% |\Cascade{}{X}{}{Y}|.
%
% \medskip
-% The preceding example can be coded with two commands |\ShortCascade| and an encompassing command |\Cascade| :
+% The preceding example can be coded with two commands |\ShortCascade| and an
+% encompassing command |\Cascade|:
% \begin{Verbatim}
% ~emphase#\Cascade@{~emphase#\ShortCascade@{$(BH) \perp (AC)$}
% {$(OC) \perp (AC)$}}
@@ -140,17 +176,51 @@ version 2005/12/01 or later.
%
%
% \bigskip
-% \section{The options}
+% \section{The option t}
+%
+% With the option |t| in the encompassing command |\Cascade|, a whole strucutre
+% of nested commands |\Cascade| is aligned on the top line.
+%
+% When the key |t| is used, if we wish to add some text after the structure, we
+% have to put that text between angle brackets in order to have that text
+% aligned with the last brace.
+%
+% \begin{Verbatim}
+% \begin{enumerate}
+% \item \Cascade~emphase#[t]@{\ShortCascade{$(BH) \perp (AC)$}{$(OC) \perp (AC)$}}
+% {hence\enskip $(BH) \parallel (OC)$}
+% {\Cascade{}{$(CH) \perp (AB)$}{}{$(OB) \perp (AB)$}}
+% {hence\enskip $(CH) \parallel (OB)$}
+% ~emphase#<hence $(OBHC)$ is a parallelogram>@
+% \end{enumerate}
+% \end{Verbatim}
+%
+%
+% \begin{enumerate}
+% \item \Cascade[t]{\ShortCascade{$(BH) \perp (AC)$}{$(OC) \perp (AC)$}}
+% {hence\enskip $(BH) \parallel (OC)$}
+% {\Cascade{}{$(CH) \perp (AB)$}{}{$(OB) \perp (AB)$}}
+% {hence\enskip $(CH) \parallel (OB)$}
+% <hence $(OBHC)$ is a parallelogram>
+% \end{enumerate}
+%
+%
+%
+% \bigskip
+% \section{Other options}
%
% \begin{itemize}
-% \item The option |space-between| is a TeX dimension described on the following figure. Its default value is
-% $0.5$~em. It applies to the current command |\Cascade| but also to the possible nested commands.
+% \item The option |space-between| is a TeX dimension described on the following
+% figure. Its initial value is $0.5$~em. It applies to the current command
+% |\Cascade| but also to the possible nested commands.
%
-% \item The option |interline| can be used to \emph{increase} the ``interline'' showed in the following picture.
-% The default value of |interline| is $0$~pt and applies only to the current command |\Cascade|.
+% \item The option |interline| can be used to \emph{increase} the ``interline''
+% showed in the following picture. The initial value of |interline| is $0$~pt
+% and applies only to the current command |\Cascade|.
%
-% \item The option |interline-all| changes the default value of |interline| used by the current command |Cascade|
-% and all the possible nested commands |\Cascade|.
+% \item The option |interline-all| changes the default value of |interline| used
+% by the current command |\Cascade| and all the possible nested commands
+% |\Cascade|.
% \end{itemize}
%
% \vspace{1cm}
@@ -164,8 +234,6 @@ version 2005/12/01 or later.
% {\fbox{\vbox{\hbox{\tikz[remember picture] \coordinate (four) at (0,0) ;}%
% \hbox to 2.5cm{\vrule height 15 pt depth 14 pt width 0pt\hfil \texttt{\#3}\hfil}}}}%
% {\fbox{\hbox to 1.7cm{\vrule height 12 pt depth 5 pt width 0pt\hfil \texttt{\#4}\hfil}}}
-% \end{center}
-%
% \begin{tikzpicture}[remember picture,overlay,blue]
% \draw (one) to ++(0,1cm) coordinate (A) to ++(0,2mm) ;
% \draw (two) to ++(0,1cm) coordinate (B) to ++(0,2mm) ;
@@ -180,6 +248,7 @@ version 2005/12/01 or later.
% \draw[<-] (D) -- ++(0,-1mm) ;
% \path ($(C)!0.5!(D)$) node [left=2mm] {the ``interline''} ;
% \end{tikzpicture}
+% \end{center}
%
% \begin{Verbatim}
% \Cascade[~emphase#interline=4mm@]{\ShortCascade{A}{B}}{E}{\ShortCascade{C}{D}}{F} G
@@ -199,15 +268,17 @@ version 2005/12/01 or later.
% \end{center}
%
% \interitem
-% The options can also be given at the document level with the command |\CascadeOptions|. In this case, the scope
-% of the declarations is the current TeX group (these declarations are ``semi-global'').
+% The options can also be given at the document level with the command
+% |\CascadeOptions|. In this case, the scope of the declarations is the current
+% TeX group (these declarations are ``semi-global'').
%
%
% \bigskip
% \section{Technical remark}
%
-% The package |\Cascade| is designed to give by default results similar to the those given by the environments of
-% \pkg{amsmath} --- and \pkg{mathtools} --- especially |{aligned}|.
+% The package |\Cascade| is designed to provide by default results similar to the
+% those given by the environments of \pkg{amsmath} --- and \pkg{mathtools} ---
+% especially |{aligned}|.
%
% \bigskip
% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -229,8 +300,9 @@ version 2005/12/01 or later.
% \ShortCascade{$\displaystyle A = \sqrt{a^2+b^2}$}{$B = \dfrac{ax+b}{cx+d}$}
%
% \interitem
-% The package \pkg{cascade} constructs the braces with the classical pair |\left|-|\right| of TeX. However, the
-% extensible delimiters, in TeX, cannot take all sizes. We give, in the following example, the braces obtained when
+% The package \pkg{cascade} constructs the braces with the classical pair
+% |\left|-|\right| of TeX. However, the extensible delimiters, in TeX, cannot
+% take all sizes. We give, in the following example, the braces obtained when
% surrounding vertical rules from $6$~mm to $17$~mm (the code is in |expl3|).
%
% \begin{Verbatim}
@@ -269,20 +341,26 @@ version 2005/12/01 or later.
%% The following macro is the same as the macro of amsmath
% \fi
% \DescribeMacro{\spread@equation}
-% We will use the command |\spread@equation| of \pkg{amsmath} to increase the interline in the commands |\Cascade|.
-% When used, this command becomes no-op (in the current TeX group).
+% We will use the command |\spread@equation| of \pkg{amsmath} to increase the
+% interline in the commands |\Cascade|. When used, this command becomes no-op
+% (in the current TeX group).
%
-% Nevertheless, we want the extension \pkg{cascade} available without \pkg{amsmath}. That's why we give a
-% definition of |\spread@equation| (this definition will be loaded only if \pkg{amsmath} --- or \pkg{mathtools} --- has
+% Nevertheless, we want the extension \pkg{cascade} available without
+% \pkg{amsmath}. That's why we give a definition of |\spread@equation| (this
+% definition will be loaded only if \pkg{amsmath} --- or \pkg{mathtools} --- has
% not been loaded yet).
% \begin{macrocode}
\cs_if_free:NT \spread@equation
- {\cs_set_protected:Npn \spread@equation
- {\openup\jot
- \cs_set_protected:Npn \spread@equation {}}}
+ {
+ \cs_set_protected:Npn \spread@equation
+ {
+ \openup \jot
+ \cs_set_protected:Npn \spread@equation { }
+ }
+ }
% \end{macrocode}
-% Don't put |\cs_set_eq:NN \spread@equation \prog_do_nothing:| in the last line because this would raise errors
-% with nested environments.
+% Don't put |\cs_set_eq:NN \spread@equation \prog_do_nothing:| in the last line
+% because this would raise errors with nested environments.
%
%
% \iffalse
@@ -290,28 +368,37 @@ version 2005/12/01 or later.
%% The following registers will be used for the options.
% \fi
% \interitem
-% The dimension |\l_@@_interline_dim| will be the value of the vertical space added between the two boxes connected
-% by the brace.
+% The dimension |\l_@@_interline_dim| will be the value of the vertical space
+% added between the two boxes connected by the brace.
% \begin{macrocode}
\dim_new:N \l_@@_interline_dim
% \end{macrocode}
%
-% \medskip
-% The dimension |\l_@@_interline_all_dim| is the default value of |\l_@@_interline_dim|. This default value can be
-% modified with the option |interline-all|. Therefore, when modified in the options of a command |\Cascade|, this
-% value will affect all the possible nested commands.
+% \medskip
+% The dimension |\l_@@_interline_all_dim| is the default value of
+% |\l_@@_interline_dim|. This default value can be modified with the option
+% |interline-all|. Therefore, when modified in the options of a command
+% |\Cascade|, this value will affect all the possible nested commands.
% \begin{macrocode}
\dim_new:N \l_@@_interline_all_dim
% \end{macrocode}
%
% \medskip
-% The dimension |\l_@@_space_between_dim| is the horizontal space inserted between the two elements of the same row
-% of the construction.
+% The dimension |\l_@@_space_between_dim| is the horizontal space inserted
+% between the two elements of the same row of the construction.
% \begin{macrocode}
\dim_new:N \l_@@_space_between_dim
-\dim_set:Nn \l_@@_space_between_dim {0.5 em}
+\dim_set:Nn \l_@@_space_between_dim { 0.5 em }
% \end{macrocode}
%
+% \medskip
+% \begin{macrocode}
+\bool_new:N \l_@@_t_bool
+\bool_new:N \l_@@_main_command_bool
+\bool_new:N \l_@@_nested_command_bool
+\bool_new:N \l_@@_first_argument_bool
+% \end{macrocode}
+%
% \interitem
% \iffalse
%%
@@ -319,29 +406,42 @@ version 2005/12/01 or later.
% \fi
% The set of keys |cascade/command| will be used for the commands |\Cascade|.
% \begin{macrocode}
-\keys_define:nn {cascade/command}
+\keys_define:nn { cascade / command }
{
% \end{macrocode}
-% The option |interline| is the vertical space added between the two items connected by a~brace.
+% The key |t| means that the command |\Cascade| will be aligned upwards.
+% \begin{macrocode}
+ t .code:n =
+ \bool_if:NTF \l_@@_t_bool
+ { \msg_error:nn { cascade } { t~option~already~set } }
+ { \bool_set_true:N \l_@@_t_bool } ,
+ t .value_forbidden:n = true ,
+% \end{macrocode}
+% The option |interline| is the vertical space added between the two items
+% connected by a~brace.
% \begin{macrocode}
- interline .dim_set:N = \l_@@_interline_dim,
- interline .value_required:n = true ,
+ interline .dim_set:N = \l_@@_interline_dim,
+ interline .value_required:n = true ,
% \end{macrocode}
%
-% The option |interline-all| will change the value of |interline| for all the commands |\Cascade|, even the nested
-% commands.
+% The option |interline-all| will change the value of |interline| for all the
+% commands |\Cascade|, even the nested commands.
% \begin{macrocode}
- interline-all .code:n = { \dim_set:Nn \l_@@_interline_all_dim {#1}
- \dim_set:Nn \l_@@_interline_dim {#1} },
- interline-all .value_required:n = true,
+ interline-all .code:n =
+ {
+ \dim_set:Nn \l_@@_interline_all_dim { #1 }
+ \dim_set:Nn \l_@@_interline_dim { #1 }
+ } ,
+ interline-all .value_required:n = true ,
% \end{macrocode}
%
% \medskip
-% The option |space-between| is the horizontal space inserted between the two elements of the same row
-% of the construction.
+% The option |space-between| is the horizontal space inserted between the two
+% elements of the same row of the construction.
% \begin{macrocode}
- space-between .dim_set:N = \l_@@_space_between_dim,
- space-between .value_required:n = true}
+ space-between .dim_set:N = \l_@@_space_between_dim ,
+ space-between .value_required:n = true
+ }
% \end{macrocode}
%
% \iffalse
@@ -349,24 +449,27 @@ version 2005/12/01 or later.
%% This set of options will be used by \CascadeOptions
% \fi
% \medskip
-% The set of keys |cascade/global| will be used for the command |\CascadeOptions| (which fixes the options at a
-% ``global'' level).
+% The set of keys |cascade/global| will be used for the command
+% |\CascadeOptions| (which fixes the options at a ``global'' level).
%
% \begin{macrocode}
-\keys_define:nn {cascade/global}
- {interline-all .dim_set:N = \l_@@_interline_all_dim,
- interline-all .value_required:n = true,
- space-between .dim_set:N = \l_@@_space_between_dim,
- space-between .value_required:n = true}
+\keys_define:nn { cascade / global }
+ {
+ interline-all .dim_set:N = \l_@@_interline_all_dim ,
+ interline-all .value_required:n = true ,
+ space-between .dim_set:N = \l_@@_space_between_dim ,
+ space-between .value_required:n = true
+ }
% \end{macrocode}
%
% \medskip
% \DescribeMacro{\CascadeOptions}
-% The command |\CascadeOptions| is the command to set the options of the \pkg{cascade} at the document level (these
-% options are set in a local way in the sense of the TeX groups).
+% The command |\CascadeOptions| is the command to set the options of the
+% \pkg{cascade} at the document level (these options are set in a local way in
+% the sense of the TeX groups).
% \begin{macrocode}
-\NewDocumentCommand \CascadeOptions {m}
- {\keys_set:nn {cascade/global} {#1}}
+\NewDocumentCommand \CascadeOptions { m }
+ { \keys_set:nn { cascade / global } { #1 } }
% \end{macrocode}
%
% \iffalse
@@ -378,101 +481,232 @@ version 2005/12/01 or later.
% The command |\Cascade| is the main command of this package.
%
% \begin{macrocode}
-\NewDocumentCommand \Cascade {O{} mmmm}
- { \if_mode_math:
- \msg_error:nn {cascade} {Cascade~in~math~mode}
- \fi:
- \mode_leave_vertical:
- \group_begin:
- \spread@equation
- \dim_set_eq:NN \l_@@_interline_dim \l_@@_interline_all_dim
- \keys_set:nn {cascade/command} {#1}
- \box_clear_new:N \l_@@_box_one
- \box_clear_new:N \l_@@_box_two
- \box_clear_new:N \l_@@_box_three
- \box_clear_new:N \l_@@_box_four
- \hbox_set:Nn \l_@@_box_one {#2}
- \hbox_set:Nn \l_@@_box_two {#3}
- \hbox_set:Nn \l_@@_box_three {#4}
- \hbox_set:Nn \l_@@_box_four {#5}
+\NewDocumentCommand \Cascade { O { } m m m m D < > { } }
+ {
+ \if_mode_math:
+ \msg_error:nn { cascade } { Cascade~in~math~mode }
+ \fi:
+ \mode_leave_vertical:
+% \end{macrocode}
+% The dimension |\g_@@_yoffset_dim| will be used by the option~|t|.
+% \begin{macrocode}
+ \bool_if:NF \l_@@_nested_command_bool
+ {
+ \dim_gzero_new:N \g_@@_yoffset_dim
+ \bool_set_true:N \l_@@_first_argument_bool
+ }
+ \group_begin:
+
+ \spread@equation
+ \dim_set_eq:NN \l_@@_interline_dim \l_@@_interline_all_dim
+ \keys_set:nn { cascade / command } { #1 }
+ \box_clear_new:N \l_@@_box_one
+ \box_clear_new:N \l_@@_box_two
+ \box_clear_new:N \l_@@_box_three
+ \box_clear_new:N \l_@@_box_four
+ \hbox_set:Nn \l_@@_box_one
+ {
+ \bool_set_true:N \l_@@_first_argument_bool
+ \bool_set_true:N \l_@@_nested_command_bool
+ #2
+ }
+ \hbox_set:Nn \l_@@_box_two { #3 }
+ \hbox_set:Nn \l_@@_box_three
+ {
+ \bool_set_false:N \l_@@_first_argument_bool
+ \bool_set_true:N \l_@@_nested_command_bool
+ #4
+ }
+ \hbox_set:Nn \l_@@_box_four { #5 }
% \end{macrocode}
%
% \medskip
-% The dimension |\l_@@_top_dim| is the space that we will have to add before the main construction to make up for the
-% ``|\smash[t]|'' of the box |#1|.
+% The dimension |\l_@@_top_dim| is the space that we will have to add before the
+% main construction to make up for the ``|\smash[t]|'' of the box |#1|.
% \begin{macrocode}
- \dim_zero_new:N \l_@@_top_dim
- \dim_set:Nn \l_@@_top_dim
- {\dim_max:nn \c_zero_dim
- {\box_ht:N \l_@@_box_one - \box_ht:N \l_@@_box_two}}
+ \dim_zero_new:N \l_@@_top_dim
+ \dim_set:Nn \l_@@_top_dim
+ {
+ \dim_max:nn
+ \c_zero_dim
+ { \box_ht:N \l_@@_box_one - \box_ht:N \l_@@_box_two }
+ }
% \end{macrocode}
-% The dimension |\l_@@_bottom_dim| is the space that we will have to add after the main construction to make up for
-% the ``|\smash[b]|'' of the box |#3|.
+% The dimension |\l_@@_bottom_dim| is the space that we will have to add after
+% the main construction to make up for the ``|\smash[b]|'' of the box |#3|.
% \begin{macrocode}
- \dim_zero_new:N \l_@@_bottom_dim
- \dim_set:Nn \l_@@_bottom_dim
- {\dim_max:nn \c_zero_dim
- {\box_dp:N \l_@@_box_three - \box_dp:N \l_@@_box_four}}
+ \dim_zero_new:N \l_@@_bottom_dim
+ \dim_set:Nn \l_@@_bottom_dim
+ {
+ \dim_max:nn
+ \c_zero_dim
+ { \box_dp:N \l_@@_box_three - \box_dp:N \l_@@_box_four }
+ }
% \end{macrocode}
%
% \medskip
% We do the ``|\smash[t]|'' of box |#1| and the ``|\smash[b]|'' of box |#3|.
% \begin{macrocode}
- \box_set_ht:Nn \l_@@_box_one \c_zero_dim
- \box_set_dp:Nn \l_@@_box_three \c_zero_dim
+ \box_set_ht:Nn \l_@@_box_one \c_zero_dim
+ \box_set_dp:Nn \l_@@_box_three \c_zero_dim
% \end{macrocode}
%
% \medskip
% We can now construct the box.
% \begin{macrocode}
- \vbox:n
- {\skip_vertical:N \l_@@_top_dim
- \vbox_top:n
- {\hbox:n
- {$\left.
- \vcenter {\halign{\hfil##\cr
- \hbox:n{\tl_if_empty:nF {#2}
- {\box_use_drop:N \l_@@_box_one
- \skip_horizontal:n \l_@@_space_between_dim}
- \box_use_drop:N \l_@@_box_two \strut} \cr
- \noalign{\skip_vertical:n \l_@@_interline_dim}
- \hbox:n{\tl_if_empty:nF {#4}
- {\box_use_drop:N \l_@@_box_three
- \skip_horizontal:n \l_@@_space_between_dim}
- \box_use_drop:N \l_@@_box_four \strut} \cr
- }
- }
- \right\}$
+ \vbox_set:Nn \l_tmpa_box
+ {
+ \skip_vertical:N \l_@@_top_dim
+ \vbox_top:n
+ {
+ \@@_the_vcenter:nn { #2 } { #4 }
+% \end{macrocode}
+% We update |\g_@@_yoffset_dim|.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_first_argument_bool
+ {
+ \dim_set:Nn \l_tmpa_dim
+ { \box_ht:N \l_tmpb_box + \box_dp:N \l_tmpb_box }
+ \l_tmpa_dim = 0.5\l_tmpa_dim
+ \dim_add:Nn \l_tmpa_dim { \the \fontdimen 22 \textfont2 }
+ \dim_sub:Nn \l_tmpa_dim
+ { \dim_max:nn { \box_ht:N \l_@@_box_two } { \box_ht:N \strutbox } }
+ \dim_gadd:Nn \g_@@_yoffset_dim \l_tmpa_dim
+ }
+% \end{macrocode}
+% \begin{macrocode}
+ \hbox:n
+ {
+ \c_math_toggle_token
+ \left .
+ \box_use_drop:N \l_tmpb_box
+ \right \}
+ \c_math_toggle_token
+ \bool_if:NT \l_@@_t_bool
+ {
+ \bool_if:NF \l_@@_nested_command_bool
+ {
+ \tl_if_empty:nF { #6 }
+ {
+ \skip_horizontal:n \l_@@_space_between_dim
+ #6
+ }
+ }
+ }
+ }
+ \skip_vertical:N \l_@@_bottom_dim
}
- \skip_vertical:N \l_@@_bottom_dim
- }
}
- \group_end:
-}
+ \bool_if:NTF \l_@@_nested_command_bool
+ { \box_use_drop:N \l_tmpa_box }
+ {
+% \end{macrocode}
+% We are in the main command |\Cascade| and, if the option~|t| is in force, we
+% have now to take into account that key.
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_t_bool
+ { \box_move_down:nn \g_@@_yoffset_dim { \box_use:N \l_tmpa_box } }
+ { \box_use_drop:N \l_tmpa_box }
+ }
+ \group_end:
+ }
% \end{macrocode}
%
-%
% \bigskip
+% The following macro is only for the lisibility of the code.
% \begin{macrocode}
-\msg_new:nnn {cascade}
- {Cascade~in~math~mode}
- {The~commands~\token_to_str:N \Cascade\
- and~\token_to_str:N \ShortCascade\
- should~be~used~in~text~mode~only.~However,~you~can~
- go~on~for~this~time.}
+\cs_new_protected:Npn \@@_the_vcenter:nn #1 #2
+ {
+ \hbox_set:Nn \l_tmpb_box
+ {
+ \c_math_toggle_token
+ \vcenter
+ {
+ \halign
+ {
+ \hfil ## \cr
+ \hbox:n
+ {
+ \tl_if_empty:nF { #1 }
+ {
+ \box_use_drop:N \l_@@_box_one
+ \skip_horizontal:n \l_@@_space_between_dim
+ }
+ \box_use:N \l_@@_box_two
+ \strut
+ }
+ \cr
+ \noalign { \skip_vertical:n \l_@@_interline_dim }
+ \hbox:n
+ {
+ \tl_if_empty:nF { #2 }
+ {
+ \box_use_drop:N \l_@@_box_three
+ \skip_horizontal:n \l_@@_space_between_dim
+ }
+ \box_use_drop:N \l_@@_box_four
+ \strut
+ }
+ \cr
+ }
+ }
+ \c_math_toggle_token
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\msg_new:nnn
+ { cascade }
+ { Cascade~in~math~mode }
+ {
+ The~commands~\token_to_str:N \Cascade\
+ and~\token_to_str:N \ShortCascade\
+ should~be~used~in~text~mode~only.~However,~you~can~
+ go~on~for~this~time.
+ }
% \end{macrocode}
%
+% \begin{macrocode}
+\msg_new:nnn
+ { cascade }
+ { t~option~already~set }
+ {
+ You~can't~use~the~key~'t'~here~because~it~has~been~set~
+ in~an~encompassing~command.~If~you~go~on,~this~key~will~be~
+ ignored.
+ }
+% \end{macrocode}
+%
% \bigskip
% \DescribeMacro{\ShortCascade}
-% The command |\ShortCascade| is a version simplified of |\Cascade| with only two arguments.
+% The command |\ShortCascade| is a simplified version of |\Cascade| with only
+% two arguments.
% \begin{macrocode}
-\NewDocumentCommand \ShortCascade {O{}mm}
- {\Cascade[#1]{}{#2}{}{#3}}
+\NewDocumentCommand \ShortCascade { O { } m m }
+ { \Cascade [ #1 ] { } { #2 } { } { #3 } }
% \end{macrocode}
-% \endinput
%
+% \vspace{1cm}
+% \section{History}
+%
+% \subsection*{Changes between versions 1.0 and 1.1}
+%
+% New option |t|.
+%
+%
+%
+% \PrintIndex
+% \tableofcontents
+%
+% \end{document}
+%
% Local Variables:
-% TeX-fold-mode: nil
+% TeX-fold-mode: t
+% TeX-fold-preserve-comments: nil
+% flyspell-mode: nil
+% fill-column: 80
% End:
diff --git a/Master/texmf-dist/source/latex/ccfonts/ccfonts.dtx b/Master/texmf-dist/source/latex/ccfonts/ccfonts.dtx
index 2480f1f9869..5135d128aca 100644
--- a/Master/texmf-dist/source/latex/ccfonts/ccfonts.dtx
+++ b/Master/texmf-dist/source/latex/ccfonts/ccfonts.dtx
@@ -1,4 +1,4 @@
-%\CheckSum{144}
+%\CheckSum{146}
%
% \iffalse meta comment
%
@@ -23,9 +23,9 @@
\ProvidesFile{ccfonts.drv}
%</driver>
%<package>\ProvidesPackage{ccfonts}
- [2000/06/30 v1.1 (WaS)]
+ [2020/03/25 v1.2 (WaS)]
%
-%<*driver>
+%<*driver>
\documentclass[11pt]{ltxdoc}
\usepackage{mflogo,url}
\CodelineNumbered
@@ -38,7 +38,7 @@
% \GetFileInfo{ccfonts.drv}
% \DeleteShortVerb{\|}
% \MakeShortVerb{\+}
-%
+%
% \title{The \LaTeXe{} package \texttt{ccfonts}}
% \author{Walter Schmidt\thanks{\texttt{walter.schmidt@arcormail.de}}}
% \date{(\fileversion{} -- \filedate)}
@@ -57,7 +57,7 @@
% (CTAN: \path{fonts/concmath/})
% \item The +.fd+ files for the traditional and mathematical
% Concrete fonts (CTAN: \path{macros/latex/contrib/supported/concmath/})
-% \item The +.fd+ files for the European Concrete fonts,
+% \item The +.fd+ files for the European Concrete fonts,
% which are distributed and installed in conjunction
% with the +ccfonts+ package
% \end{itemize}
@@ -68,7 +68,7 @@
%
%
% \section{Using the package}
-% The \LaTeX{} macro package +ccfonts+
+% The \LaTeX{} macro package +ccfonts+
% supports typesetting with the font family `Concrete'.
% Loading this package through
% \begin{verse}
@@ -86,7 +86,7 @@
%
% Notice that you may still have to specify the option +psamsfonts+
% for these packages, so as to prevent them from using design sizes
-% of the Euler Fraktur fonts, which may be
+% of the Euler Fraktur fonts, which may be
% unavailable within your TeX system; this works flawlessly with
% version 1.1 of the +ccfonts+ package now. (You need not care for this
% subject, unless Euler Fraktur is actually used.)
@@ -97,12 +97,12 @@
% \begin{description}
% \oitem{boldsans} The semibold series of CM Sans is used
% as a replacement for the missing bold series of Concrete.
-% (The default behaviour is to use the bold extended version of
+% (The default behaviour is to use the bold extended version of
% CM Roman.)
% \oitem{standard-baselineskips} disables the increased leading.
% This can be useful, e.g., when typesetting in narrow columns.
% \oitem{exscale} implements scaling of the math extension font.
-% For a discussion of this feature see the file +exscale.dtx+.
+% For a discussion of this feature see the file +exscale.dtx+.
% \oitem{slantedGreek} makes uppercase Greek letters slanted by default.
% Regardless of this option, the new commands +\upDelta+ and +\upOmega+
% will always produce an upright \( \Delta \) and \( \Omega \).
@@ -123,7 +123,7 @@
% There are no bold math fonts available.
% \item
% In order to enlarge the default +\baselineskip+, the size-changing
-% macros have been redefined, and they are no longer as robust as the
+% macros have been redefined, and they are no longer as robust as the
% original definitions. This may result in \LaTeX\ errors with
% `moving arguments'. As a workaround, you may protect any font-related
% commands in moving arguments with a +\protect+ command. In case this
@@ -148,14 +148,14 @@
% OMX & ccex & m & n \\ \hline \hline
% \multicolumn{4}{|c|}{\textit{Concrete AMS A, B}}\\ \hline
% U & msa & m & n \\ \hline
-% U & msb & m & n \\ \hline
+% U & msb & m & n \\ \hline
% \end{tabular}
% \end{center}
-% Notice, that
+% Notice, that
% \begin{itemize}
% \item the series c (condensed) is available as slanted
% and with a font size of 9\,pt only;
-% \item the Concrete AMS fonts are only defined
+% \item the Concrete AMS fonts are only defined
% through the package \textsf{ccfonts},
% i.e., there are no related \texttt{.fd} files.
% \end{itemize}
@@ -217,7 +217,7 @@
% \end{macrocode}
%
% \subsubsection{The option \texttt{exscale}}
-% The code is simply copied from \texttt{exscale.sty},
+% The code is simply copied from \texttt{exscale.sty},
% with \texttt{xccex} instead of \texttt{cmex}.
% \begin{macrocode}
\DeclareOption{exscale}{
@@ -262,7 +262,9 @@
% \subsection{The option \texttt{boldsans}}
% \begin{macrocode}
\DeclareOption{boldsans}{%
- \renewcommand{\bfdefault}{sbc}}
+ \@ifundefined{DeclareFontSeriesDefault}{%
+ \renewcommand{\bfdefault}{sbc}}{%
+ \DeclareFontSeriesDefault[rm]{bf}{sbc}}}
% \end{macrocode}
%
% \subsubsection{Processing options}
@@ -282,10 +284,10 @@
% \end{macrocode}
%
% In case the package +amsfonts+ is loaded additionally,
-% we must ensure that the Concrete versions of the
+% we must ensure that the Concrete versions of the
% AMS symbol fonts are used. We execute the font definitions
-% AtBeginDocument, so that loading +amsfonts+ with the
-% option +psamsfonts+ cannot do any harm. Notice that the option may
+% AtBeginDocument, so that loading +amsfonts+ with the
+% option +psamsfonts+ cannot do any harm. Notice that the option may
% be required for getting the Euler Fraktur fonts right.
% \begin{macrocode}
\AtBeginDocument{
@@ -294,13 +296,13 @@
<5><6><7><8><9><10>gen*xccam%
<10.95><12><14.4><17.28><20.74><24.88>xccam10}{}
\DeclareFontFamily{U}{msb}{}
- \DeclareFontShape{U}{msb}{m}{n}{%
+ \DeclareFontShape{U}{msb}{m}{n}{%
<5><6><7><8><9><10>gen*xccbm%
<10.95><12><14.4><17.28><20.74><24.88>xccbm10}{}
}
% \end{macrocode}
%
-%
+%
% \subsection{Initialization}
% We ensure that any package loaded after \texttt{ccfonts}
% will find the new value of +\baselineskip+.
@@ -331,4 +333,3 @@
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
%%
-
diff --git a/Master/texmf-dist/source/latex/ccool/ccool.dtx b/Master/texmf-dist/source/latex/ccool/ccool.dtx
new file mode 100644
index 00000000000..933183883d6
--- /dev/null
+++ b/Master/texmf-dist/source/latex/ccool/ccool.dtx
@@ -0,0 +1,2438 @@
+% \iffalse meta-comment
+% !TEX program = pdfLaTeX
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+----------------------------------------------------------------
+##### ccool --- A key-value document command parser
+- Source repository: https://github.com/rogard/ccool
+- Released under the LaTeX Project Public License v1.3c or later
+- See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
+%</readme>
+%<*internal>
+\fi
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+\expandafter\begingroup
+\fi
+%</internal>
+%<*install>
+\input l3docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+----------------------------------------------------------------------------
+ccool --- A key-value document command parser
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------------------
+
+\endpreamble
+\postamble
+
+Copyright (C) 2020 by Erwann Rogard
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+Erwann Rogard.
+
+This work consists of the file ccool.dtx and the derived files:
+ccool.sty, and ccool.pdf.
+
+\endpostamble
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+%</install>
+%<install> \endbatchfile
+%<*internal>
+\generate{
+ \file{\jobname.ins}{\from{\jobname.dtx}{install}}
+}
+\nopreamble\nopostamble
+\generate{
+ \file{README.md}{\from{\jobname.dtx}{readme}}
+}
+\ifx\fmtname\nameofplainTeX
+\expandafter\endbatchfile
+\else
+\expandafter\endgroup
+\fi
+%</internal>
+%<package> \NeedsTeXFormat{LaTeX2e}[2020/02/02]
+%<package> \RequirePackage{erw-l3}[2020/06/04]
+%<package> \RequirePackage{etoolbox}[2019/09/21]
+%<package> \RequirePackage{l3keys2e}[2020/03/06]
+%<package> \RequirePackage{xparse}[2020/03/06]
+%<package> \ProvidesExplPackage
+%<package> {ccool} % Package name
+%<package> {2020/10/10} % Release date
+%<package> {3.1} % Release version
+%<package> {cool --- A key-value document command parser} % Description
+%
+%<*driver>
+\RequirePackage{fvextra, xparse}%^^A\NB{done}{Warning:csquotes should be loaded after fvextra->nope}
+\documentclass[full, show-notes]{l3doc}
+\listfiles
+%^^A\usepackage{xparse, longtable, array, booktabs}
+\ExplSyntaxOn
+\clist_new:N \g__ccooldoc_usepackage_clist
+\cs_new_protected:Nn \__ccooldoc_usepackage:n
+{
+ \clist_put_right:Nn \g__ccooldoc_usepackage_clist
+ {
+ \textbackslash{}usepackage\char`{ #1 \char`}
+ }
+ \usepackage{#1}
+}
+\cs_new_protected:Nn \__ccooldoc_usepackage:nn
+{
+ \clist_put_right:Nn \g__ccooldoc_usepackage_clist
+ {
+ {
+ \textbackslash{}
+ usepackage
+ \char`[ #1 \char`]
+ \char`{ #2 \char`}
+ }
+ }
+ \usepackage[#1]{#2}
+}
+\cs_new:Nn \__ccooldoc_usepackage:
+{
+ \texttt
+ {
+ \noindent
+ \clist_use:Nnnn \g__ccooldoc_usepackage_clist { \\ } { \\ } { \\ }
+ }
+}
+\__ccooldoc_usepackage:n{amsmath, amssymb}
+\__ccooldoc_usepackage:nn{
+%^^A afrikaans,
+%^^A basque,
+%^^A catalan,
+%^^A croatian,
+%^^A czech,
+%^^A danish,
+%^^A dutch,
+%^^A %^^A esperanto, % ERROR
+%^^A estonian,
+%^^A finnish,
+french,
+%^^A % ^^A galician, % ERROR
+german,
+%^^A hungarian,
+%^^A icelandic,
+%^^A indonesian,
+%^^A irish,
+%^^A italian,
+%^^A %^^A kurmanji, % ERROR
+%^^A latin,
+%^^A %^^A latvian, % ERROR
+%^^A lithuanian,
+%^^A ngerman,
+%^^A polish,
+%^^A portuguese,
+%^^A romanian,
+%^^A slovak,
+spanish.noquoting,
+%^^A swedish,
+%^^A swissgerman,
+%^^A turkish,
+%^^A turkmen,
+%^^A welsh,
+english
+}
+{babel}
+\__ccooldoc_usepackage:n{bookmark, ccool, microtype, tabto, tcolorbox}
+\__ccooldoc_usepackage:nn{T1}{fontenc}% \char`[
+ \ExplSyntaxOff
+\tcbuselibrary{listings, breakable}
+\makeatletter
+\newcommand*{\docsetnameref}{\def\@currentlabelname}%https://tex.stackexchange.com/questions/537751
+\makeatother
+\ExplSyntaxOn
+\tl_gset:Nn \partname {Part}
+\ExplSyntaxOff
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+% ^^A\AtEndDocument { \PrintChanges \PrintIndex }
+\ExplSyntaxOn
+\newenvironment{docabstract}[1]%https://latex.org/forum/viewtopic.php?t=12156
+{\renewcommand{\abstractname}{#1}\begin{abstract}}
+ {\end{abstract}}
+\ProvideDocumentCommand\DocPhantomSection{smmm}
+{
+ \leavevmode
+ \refstepcounter{#2}
+ \IfBooleanT{#1}
+ {
+ \addcontentsline{toc}{#2}{\protect\numberline{\use:c{the#2}}#3}
+ }
+ \docsetnameref{#3}
+ \label{#4}
+}
+% ^^A Sort--->
+\providecommand\docarg[1]{\texttt{#1}} % fun[param] (macro) vs fun[arg] (eval)
+\providecommand\docargnoval{\c_novalue_tl}
+\providecommand\docassign[2]{#1~$\leftarrow$~#2}
+\providecommand\docccept[1]{\textit{#1}}
+\providecommand\doccceptargspec{arg~spec}
+\providecommand\doccceptbool{boolean}
+\providecommand\doccceptclist{clist}
+\providecommand\doccceptcode{code}
+\providecommand\doccceptcsname{cs name}
+\providecommand\doccceptcsorcode{cs~or~code}
+\providecommand\doccceptcs{cs}
+\providecommand\doccceptempty{empty}
+\providecommand\doccceptgopt{global~option}
+\providecommand\doccceptgroup{local~group}
+\providecommand\doccceptint{integer}
+\providecommand\doccceptitems{items}
+\providecommand\doccceptkey{key}
+\providecommand\doccceptkvl{keyval~list}
+\providecommand\doccceptopt{option}
+\providecommand\doccceptpath{path}
+\providecommand\doccceptplaceh{placeholder}
+\providecommand\doccceptpre{preamble}
+\providecommand\doccceptprop{prop}
+\providecommand\doccceptsep{separators}
+\providecommand\doccceptseq{seq}
+\providecommand\docccepttlvar{tl~var}
+\providecommand\docccepttl{token~list}
+\providecommand\docccepttok{token}
+\providecommand\doccceptval{val}
+\providecommand\docconv[1]{convention~\autoref{conv:#1}}
+\providecommand\docdefaultfor{default~for~}
+\providecommand\docenvdoc{\env{document}}
+\providecommand\docparm[1]{\texttt{\char`\{}#1\texttt{\char`\}}}
+\providecommand\docexpand[2]{#1~$\rightarrow$~#2}
+\providecommand\docfillblank{\begin{minipage}[t]{\linewidth}\end{minipage}}
+\providecommand\docissuedont{Don't: }
+\providecommand\docissuedo{Do: }
+\providecommand\docissuesymp{Symptom: }
+\providecommand\doclist[1]{Listing~\ref{listing:#1}}
+\providecommand\docmetakeyorkeyval[1][i]{\meta{key_{#1}}|\meta{key_{#1}}=\meta{val_{#1}}}
+\providecommand\docnb{\noindent\textbf{NB}:~}
+\providecommand\docpard[1]{\texttt{\textless}#1\texttt{\textgreater}}
+\providecommand\docpare[2]{\texttt{#1}\docparm{#2}}
+\providecommand\docparo[1]{\texttt{[}#1\texttt{]}}
+\providecommand\docpipe{\textbar}
+\providecommand\docreflist[1]{Listing~\ref{listing:#1}}
+\providecommand\docsee{See:~}
+\providecommand\docstep[1]{step~\ref{step:#1}}
+\providecommand\doctip{\noindent\textbf{Tip}:~}
+\providecommand\docvers[2]{v#1.#2}
+\providecommand\docwarn{\noindent\textbf{Warning}:~}
+\providecommand\docxparsed[1][~argument]{`d'-type~#1}
+\providecommand\docxparsee[1][~argument]{`e'-type~#1}
+\providecommand\docxparsem[1][~argument]{`m'-type~#1}
+\providecommand\docxparseo[1][~argument]{`o'-type~#1}
+\providecommand\pkgkey{key$_{i}$}
+\providecommand\pkgobj[1]{object identified by #1}
+\providecommand\pkgoptan{\docarg{And}}
+\providecommand\pkgoptex{\docarg{Expans}}
+\providecommand\pkgoptfi{\docarg{File}}
+\providecommand\pkgoptin{\docarg{Inner}}
+%^^A\providecommand\pkgoptions{kvl0}
+\providecommand\pkgoptions{\doccceptkvl$_0$}
+\providecommand\pkgoptou{\docarg{Outer}}
+\providecommand\pkgoptpad{\docarg{Default}}%default
+\providecommand\pkgoptpa{\docarg{Param}}
+\providecommand\pkgoptse{\docarg{Separ}}
+\providecommand\pkgoptwr{\docarg{Write}}
+\providecommand\pkgparap{\texttt{+}}%append
+\providecommand\pkgparex{\texttt{*}}%expand
+\providecommand\pkgparhe{tl$_{1}$}%head
+\providecommand\pkgparin{code$_{1}$}%inner
+\providecommand\pkgparkvl{\doccceptkvl$_1$}
+\providecommand\pkgparkvlnxt{\doccceptkvl$_2$}
+\providecommand\pkgparou{code$_{2}$}%outer
+\providecommand\pkgparpa{tl$_{2}$}%param
+\providecommand\pkgparsiii{tl$_{5}$}
+\providecommand\pkgparsii{tl$_{4}$}
+\providecommand\pkgparsi{tl$_{3}$}
+\providecommand\pkgpars{\Arg{\pkgparsi}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\Arg{\pkgparsiii}}%separ
+\providecommand\pkgparta{tl$_{6}$}%tail
+\providecommand\pkgsep[1]{\Arg{#1}}
+\providecommand\pkgval{val$_{i}$}
+\providecommand\pkgwrite{\cs{Ccool}\docarg{\meta{\pkgparpa}}\docpare{i}{\meta{\pkgparin}}\Arg{\pkgparkvl}}
+% ^^A Sort<---
+\ExplSyntaxOff
+\begin{document}
+\DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{\jobname.sty}
+% \begin{documentation}
+% \title{The \pkg{ccool} package\thanks{^^A
+% This file describes version \fileversion, last revised \filedate.^^A
+% }^^A
+% }
+% \author{Erwann Rogard\thanks{firstname dot lastname AusTria gmail dot com}}
+%
+% \date{Released \filedate}
+%
+% \maketitle
+%
+% \selectlanguage{english}
+% \begin{docabstract}{Abstract}
+% The package \pkg{ccool} for \LaTeX~is a \textit{key-value} interface, \nameref{usage:cs:ccool},
+% on top of \pkg{xparse}'s document command parser. Global options control input processing and its expansion.
+% By default, they are set to meet likely requirements, depending on context: the selected language,
+% and which of text and math mode is active. These options can be overriden inline.
+% This versality could find its use, for example, to encode notational conventions (such as \docexpand{\cs{Real}}{}|\mathbb{R}|)
+% at the point where they are introduced in the \env{document} (``Let $\mathbb{R}$ denote real numbers'').
+% Polymorphic commands can be generated by parameterizing the keys
+% (for instance, one parameter value for style, another for a property).
+% User input to \cs{Ccool} can optionally be serialized.
+% This can useful for typesetting documents sharing the same notation.
+% \end{docabstract}
+%
+% \selectlanguage{french}
+% \begin{docabstract}{Résumé}
+% L'extension~\pkg{ccool} pour \LaTeX~met à disposition une interface de type \textit{clé-valeur}, \nameref{usage:cs:ccool},
+% destinée à faciliter la géneration de commandes. Les paramètres globaux contrôlant le traitement de ces \textit{clé-valeur} sont fixés
+% par défaut pour répondre aux besoins courants, suivant le contexte (langage, mode textuel ou mathématique).
+% Un exemple d'application, est la command-isation des conventions de notation (\docexpand{\cs{Reel}}{} |\mathbb{R}|),
+% au point dans le \env{document} où elles sont introduites (``Soit~$\mathbb{R}$~les nombres réels.'').
+% Des commandes polymorphes peuvent être générées, en associant aux clés un paramètre
+% (par exemple, une valeur pour le style typographique, une autre pour la description du concept associé).
+% En option, les instructions passées à cette interface peuvent être sauvegardées,
+% ce qui peut être utile pour la rédaction de documents faisant appel à des conventions typographiques communes.
+% \end{docabstract}
+% \selectlanguage{english}
+%
+% \tableofcontents
+%
+% \part{Usage}\label{part:usage}
+% ^^A \VerbatimFootnotes
+%
+% \setcounter{section}{0}
+% \label{usage:conv}
+% \addcontentsline{toc}{section}{\protect\numberline{\thesection}Convention}
+% \section*{Convention}
+% \begin{enumerate}[label={\emph{\alph*)}}]
+% \item \label{conv:expl3} Loosely, those of \cite{interface3}, for example as to the meaning of \docccept{\docccepttl}, which may be abbreviated \docccept{tl}.
+% \item \label{conv:xparse} Those of \cite{xparse}, for example \docparo{arg} is an \docccept{\docxparseo}.
+% \item \docassign{\meta{X}}{\docarg{Y}}: set \meta{X} to |Y|
+% \item \docexpand{\cs{X}}{\docarg{Y}}: \cs{X} expands to |Y|
+% \item If unspecified, the environment in which a macro is to be used is \docenvdoc.
+% \end{enumerate}
+%
+% \refstepcounter{section}
+% \label{usage:load}
+% \addcontentsline{toc}{section}{\protect\numberline{\thesection}Loading the package}
+% \begin{function}{\usepackage}
+% \begin{syntax}
+% \cs{usepackage}\docparm{\pkg{ccool}}
+% \end{syntax}
+% \begin{description}
+% \item[Requirement]\docfillblank
+% \begin{enumerate}
+% \item \file{ccool.sty} is in the path of the \LaTeX~engine. See \autoref{part:other}, \autoref{other:support}.
+% \item Put in the~\docccept{\doccceptpre}
+% \end{enumerate}
+% \end{description}
+% \end{function}
+%
+% \DocPhantomSection*{section}{\cs{Ccool}}{usage:cs:ccool}
+% \begin{function}{\Ccool}
+% \begin{syntax}
+% \cs{Ccool}\docparo{\meta{\pkgparhe}}\docpard{\meta{\pkgparpa}}\docpare{c}{\meta{\pkgparin}}\Arg{\pkgparkvl}\pkgparap\pkgparex\docpare{s}{\meta{\doccceptsep}}\docpare{c}{\meta{\pkgparou}}\docparo{\meta{\pkgparta}}
+% \end{syntax}where \meta{\doccceptsep} is either of: \Arg{\pkgparsi}, \Arg{\pkgparsi}\Arg{\pkgparsii}, and \Arg{\pkgparsi}\Arg{\pkgparsii}\Arg{\pkgparsiii}.
+% \begin{description}
+% \item[Semantics] See \autoref{ccool:core}-\ref{ccool:wr}.
+% \end{description}
+% \end{function}
+%
+% \subsection{Core feature}
+% \label{ccool:core}
+% \nameref{usage:cs:ccool}\Arg{\pkgparkvl} executes for each \meta{\pkgkey}|=|\meta{\pkgval},
+% \begin{enumerate}[label=\emph{\arabic*)}]
+% \item \docassign{\meta{\pkgval} }
+% { \cs{function}\Arg{\pkgval} }\label{step:val}
+% \item define \cs{\meta{\pkgkey}} such that \docexpand{ \cs{\meta{\pkgkey} } }{\meta{\pkgval}},
+% \label{step:key}
+% \end{enumerate}where \cs{function} is encoded in \docccept{\doccceptgopt}~\nameref{usage:opt:in}.
+% For instance, the side effect of |\Ccool{ Real = \mathbb{R} }| is \docexpand{\cs{Real}}{\docarg{\textbackslash{}mathbb\{R\}}}.
+% To be sparingly used, \docccept{\doccceptgopt}~\nameref{usage:opt:ex} controls the type of expansion of \meta{\pkgkey}~and \meta{\pkgval}.
+%
+% See \nameref{usage:cs:lambda} to allow command \cs{\meta{\pkgkey}} to take arguments.
+%
+% \subsection{Process the \texorpdfstring{\docccept{\pkgval}}'s}
+% \label{ccool:in}
+% \nameref{usage:cs:ccool}\ \docpare{c}{\meta{\pkgparin}}\Arg{\pkgparkvl} is identical to the \nameref{ccool:core},
+% except it overrides \nameref{usage:opt:in}.
+%
+% In our example, if multiple number systems are defined with \cs{Ccool} (natural, reals, \dots),
+% it is more efficient to omit |\mathbb{.}| inside \meta{\pkgval}, and instead
+% use |c{\mathbb{#1}}|, where |#1| means ``parameter to be replaced''.
+%
+% \subsection{Append to a hook}
+% \label{ccool:ap}
+% \nameref{usage:cs:ccool}\Arg{\pkgparkvl}\pkgparap~is identical to the \nameref{ccool:core}, except it
+% repeats after \nameref{usage:cs:hook}.
+% This is useful to make the side effect persist after a \docccept{\doccceptgroup} (such as \env{theorem}).
+%
+% \subsection{Expand the \texorpdfstring{\docccept{\pkgval}}'s}
+% \label{ccool:ex}
+% \nameref{usage:cs:ccool}\Arg{\pkgparkvl}\pkgparex~supplements the \nameref{ccool:core} with
+% the expansion of the \meta{\pkgval}'s using typesetting rules encoded in \docccept{\doccceptgopt}~\nameref{usage:opt:se}
+% and~\nameref{usage:opt:ou}. The first are \docccept{\doccceptsep} applied to the \meta{\pkgval}'s to form a \docccept{\docccepttl},
+% and the second a function applied to the latter.
+%
+% They can be overriden inline by appending further \docpare{s}{\meta{\doccceptsep}}~and~\docpare{c}{\meta{\pkgparou}}, respectively,
+% to the list of arguments.
+%
+% \subsection{Head}
+% \label{ccool:he}
+% \nameref{usage:cs:ccool}\docparo{\meta{\pkgparhe}}\Arg{\pkgparkvl}~expands \meta{\pkgparhe} and executes the \nameref{ccool:core}.
+%
+% There may be situations where it is convenient to pass \meta{\pkgparhe}~as \doccceptempty.
+%
+% \subsection{Tail}
+% \label{ccool:ta}
+% \nameref{usage:cs:ccool}\Arg{\pkgparkvl}\docparo{\meta{\pkgparta}}\Arg{\pkgparkvlnxt}~is identical to
+% \nameref{usage:cs:ccool}\Arg{\pkgparkvl} followed by \nameref{usage:cs:ccool}\docparo{\meta{\pkgparta}}\Arg{\pkgparkvlnxt}.
+%
+% The combination of \nameref{ccool:core}, \nameref{ccool:he}, and \nameref{ccool:ta} allows to integrate typesetting and
+% the creation of commands.
+%
+% \subsection{Parameterize the \texorpdfstring{\docccept{\pkgkey}}'s}
+% \label{ccool:pa}
+% \nameref{usage:cs:ccool}\docpard{\meta{\pkgparpa}}\Arg{\pkgparkvl} is identical to the \nameref{ccool:core},
+% except \meta{\pkgkey} is replaced by \meta{\pkgkey\docpard{\pkgparpa}}.
+% The default value of \meta{\pkgparpa} is encoded in \nameref{usage:opt:pa}.
+% In our example, \meta{\pkgparpa} could be \docarg{Style}.
+%
+% \subsection{Write}
+% \label{ccool:wr}
+% \docccept{\doccceptgopt}~\nameref{usage:opt:wr}~is identical to the \nameref{ccool:core},
+% except that if \nameref{usage:opt:wr} is set to \cs{BooleanTrue},
+% the code is written to a file whose \doccceptpath~is encoded in \docccept{\doccceptgopt}~\nameref{usage:opt:fi}.
+%
+% \DocPhantomSection*{section}{\cs{CcoolClear}}{usage:cs:clear}
+% \begin{function}{\CcoolClear}
+% \begin{syntax}
+% \cs{CcoolClear}\docpard{\meta{\pkgparpa}}\docparm{\dots\meta{\doccceptkey_i},\dots}
+% \end{syntax}
+% \begin{description}
+% \item[Semantics] Clears all \cs{\meta{\pkgkey\docpard{\pkgparpa}}}'s
+% \end{description}
+% \end{function}
+%
+% \DocPhantomSection*{section}{\cs{CcoolHook}}{usage:cs:hook}
+% \begin{function}{\CcoolHook}
+% \begin{syntax}
+% \cs{CcoolHook}
+% \end{syntax}
+% \begin{description}
+% \item[Semantics] No side effect or expansion
+% \end{description}
+% \end{function}
+%
+% \DocPhantomSection*{section}{\cs{CcoolLambda}}{usage:cs:lambda}
+% \begin{function}{\CcoolLambda}
+% \begin{syntax}
+% \cs{CcoolLambda}\docparo{\meta{\doccceptargspec}}\Arg{\doccceptcode},
+% \end{syntax} where \docccept{\doccceptargspec} is by default an \docccept{\docxparseo}.
+% \begin{description}
+% \item[Example] \cs{Ccool}|{ EvalAt = \CcoolLambda{(#1)} }|
+% \item[Semantics] Returns a command of type \cs{DeclareDocumentCommand}\cite{xparse},
+% \end{description}
+% \end{function}
+%
+% \DocPhantomSection*{section}{\cs{CcoolOption}}{usage:cs:option}
+% \begin{function}{\CcoolOption}
+% \begin{syntax}
+% \cs{CcoolOption}\docparo{\dots{}\docmetakeyorkeyval[i],\dots}
+% \end{syntax}where \meta{\doccceptkey_i} is either of
+% \nameref{usage:opt:an},
+% \nameref{usage:opt:ex},
+% \nameref{usage:opt:fi},
+% \nameref{usage:opt:in},
+% \nameref{usage:opt:pa},
+% \nameref{usage:opt:ou},
+% \nameref{usage:opt:se},
+% and \nameref{usage:opt:wr}.
+% \begin{description}
+% \item[Semantics] Modify the default behavior of \nameref{usage:cs:ccool}
+% \end{description}
+% \end{function}
+%
+% \DocPhantomSection*{subsection}{\pkgoptan}{usage:opt:an}
+% \DescribeOption{\pkgoptan}
+% \begin{description}
+% \item[Also see] \autoref{part:impl}~\nameref{impl:opt:an}
+% \item[Semantics] Sets the translation of \textit{and} in language \meta{\doccceptkey} to \meta{\doccceptval}
+% \item[Syntax] \meta{\doccceptkvl}
+% \end{description}
+%
+% \DocPhantomSection*{subsection}{\pkgoptex}{usage:opt:ex}
+% \DescribeOption{\pkgoptex}
+% \begin{description}
+% \item[Also see] \nameref{ccool:core} and \autoref{part:impl}~\nameref{impl:opt:ex}
+% \item[Syntax] \texttt{eo\docpipe{}ee\docpipe{}ex\docpipe{}xo\docpipe{}xe\docpipe{}xx}
+% \end{description}
+%
+% \DocPhantomSection*{subsection}{\pkgoptfi}{usage:opt:fi}
+% \DescribeOption{\pkgoptfi}
+% \begin{description}
+% \item[Also see] \autoref{part:usage}~\nameref{ccool:wr} and \autoref{part:impl}~\nameref{impl:opt:fi}
+% \item[Syntax] \meta{\doccceptpath}
+% \end{description}
+%
+% \DocPhantomSection*{subsection}{\pkgoptin}{usage:opt:in}
+% \DescribeOption{\pkgoptin}
+% \begin{description}
+% \item[Also see] \nameref{ccool:in} and \autoref{part:impl}~\nameref{impl:opt:in}
+% \item[Syntax] \meta{\doccceptcode}, with |####1| as the \docccept{\doccceptplaceh}
+% \end{description}
+%
+% \DocPhantomSection*{subsection}{\pkgoptpa}{usage:opt:pa}
+% \DescribeOption{\pkgoptpa}
+% \begin{description}
+% \item[Also see] \nameref{ccool:pa}, and \autoref{part:impl}~\nameref{impl:opt:pa}
+% \item[Syntax] \meta{\docccepttl}
+% \end{description}
+%
+% \DocPhantomSection*{subsection}{\pkgoptou}{usage:opt:ou}
+% \DescribeOption{\pkgoptou}
+% \begin{description}
+% \item[Also see] \nameref{ccool:ex}, and \autoref{part:impl}~\nameref{impl:opt:ou}
+% \item[Default] |\ensuremath{####1}|
+% \item[Syntax] \meta{\doccceptcode}, with |####1| as the \docccept{\doccceptplaceh}
+% \end{description}
+%
+% \DocPhantomSection*{subsection}{\pkgoptse}{usage:opt:se}
+% \DescribeOption{\pkgoptse}
+% \begin{description}
+% \item[Also see] \nameref{ccool:ex}; \doclist{lang}; and \autoref{part:impl}~\nameref{impl:opt:se}
+% \item[Other] Default behavior depends on whether \pkg{babel} and \pkg{amsmath} are loaded
+% \item[Syntax] That of \docccept{\doccceptsep} in \cite[Section 8 of \pkg{l3seq}]{interface3}
+% \end{description}
+%
+% \DocPhantomSection*{subsection}{\pkgoptwr}{usage:opt:wr}
+% \DescribeOption{\pkgoptwr}
+% \begin{description}
+% \item[Also see] \autoref{part:usage}~\nameref{ccool:wr} and \autoref{part:impl}~\nameref{impl:opt:wr}
+% \item[Syntax] \cs{BooleanFalse}\docpipe\cs{BooleanTrue}
+% \end{description}
+%
+% \DocPhantomSection*{section}{\cs{CcoolRead}}{usage:cs:read}
+% \begin{function}{\CcoolRead}
+% \begin{syntax}
+% \cs{CcoolRead}\docparo{\meta{\doccceptpath}}
+% \end{syntax}
+% \begin{description}
+% \item[Also see] \autoref{part:impl}~\nameref{impl:cs:read}
+% \item[Semantics]\docfillblank
+% \begin{enumerate}
+% \item Reads the definitions in \meta{\doccceptpath}.
+% \item Writes to \file{ccool.log}: `read from \meta{\doccceptpath}'
+% \end{enumerate}
+% \end{description}
+% \end{function}
+%
+% \DocPhantomSection*{section}{\cs{CcoolVers}}{usage:cs:vers}
+% \begin{function}{\CcoolVers}
+% \begin{syntax}
+% \cs{CcoolVers}
+% \end{syntax}
+% \begin{description}
+% \item[Semantics] \docexpand{}{the package's version}
+% \end{description}
+% \end{function}
+%
+% \section{Do's and dont's}
+% \label{usage:dosdont}
+%
+% \begin{enumerate}[label=\emph{\arabic*)}]
+% \item \docfillblank
+% \begin{itemize}
+% \item[\docissuedont] |Inner=\{####1\}|
+% \item[\docissuesymp] \cs{CcoolRead} fails
+% \item[\docissuedo] |Inner={\char`{####1\char`}}|
+% \end{itemize}
+% \item \docfillblank
+% \begin{itemize}
+% \item[\docissuedont] |$|\meta{\pkgkey}|<x$|.
+% \item[\docissuedo] |$|\cs{\meta{\pkgkey}}|{<}x$|
+% \end{itemize}
+% \item\docfillblank
+% \begin{itemize}
+% \item[\docissuedont] |[a, b)|
+% \item[\docissuedo] |{[}a, b{)}|
+% \end{itemize}
+% \item \docfillblank
+% \begin{itemize}
+% \item[\docissuedont] |\cal F|.
+% \item[\docissuedo] |\cal{F}| or |\mathcal{F}|
+% \end{itemize}
+% \item \docfillblank
+% \begin{itemize}
+% \item[\docissuedont] |\[x_0,x\]|
+% \item[\docissuedo] |\left[x_0,x\right]|
+% \end{itemize}
+% \item \docfillblank
+% \begin{itemize}
+% \item[\docissuedont] Use \docccept{\docxparsed[]} or \docccept{\docxparsee[]}~arguments\cite{xparse} for \nameref{usage:cs:lambda}
+% \item[\docissuedo] Use only \docccept{\docxparsem[]} and \docccept{\docxparseo[]}~arguments
+% \end{itemize}
+% \item \docfillblank
+% \begin{itemize}
+% \item[\docissuedont] |\usepackage[spanish]{babel}|
+% \item[\docissuedo] |\usepackage[spanish.noquoting]{babel}|\cite{a-547018}
+% \end{itemize}
+% \item Also see \autoref{part:other}, \autoref{other:issue}
+% \end{enumerate}
+%
+% \clearpage
+% \part{Listing}\label{part:listing}
+%
+% \newtcblisting[auto counter]
+% {listing}[2][]{
+% noparskip,
+% breakable,
+% colback=white,
+% colframe=black,
+% opacitybacktitle=.8,%
+% fonttitle=\bfseries,
+% title={Listing~\thetcbcounter. #1},
+% arc=0pt,
+% outer arc=0pt,
+% boxrule=1pt,
+% listing and text,
+% #2}
+%
+% \docnb
+% \begin{enumerate}
+% \item Some statements affect only the output of listings that come after that in which they appear.
+% The demarcation is indicated by |%^^||A--->| and |%^^||A<---|, where applicable
+% \end{enumerate}
+% \phantomsection\addcontentsline{toc}{section}
+% {\ref{listing:vers}.\cs{CcoolVers}}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[\cs{CcoolVers}]
+ {label=listing:vers}
+ \CcoolVers
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}
+% {\ref{listing:thisdeps}. This doc's dependencies}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[This doc's dependencies]
+ {label=listing:thisdeps}
+ \ExplSyntaxOn
+ \__ccooldoc_usepackage:
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}
+% {\ref{listing:numbrsys:base}. \texorpdfstring{Let~$\mathbb{N}$ and $\mathbb{R}$ denote\dots} (start of the tutorial)}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[``Let~$\mathbb{N}$ and $\mathbb{R}$ denote\dots'' (start of the tutorial)]
+ {label=listing:numbrsys:base, listing and text}
+ Let~$\mathbb{N}$ and $\mathbb{R}$ denote the natural and real numbers.
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}
+% {\ref{listing:numbrsys:cmd}. Equivalent to \ref{listing:numbrsys:base}, with \cs{NewDocumentCommand}}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[ Equivalent to \ref{listing:numbrsys:base}, with \cs{NewDocumentCommand}]
+ {label=listing:numbrsys:cmd, listing and text}
+ \DeclareDocumentCommand\Nat{}{\mathbb{N}}
+ \DeclareDocumentCommand\Real{}{\mathbb{R}}
+ Let~$\Nat$ and $\Real$ denote the natural and real numbers.
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}
+% {\ref{listing:numbrsys:in}. Equivalent to \ref{listing:numbrsys:cmd}, with \cs{Ccool}}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[ Equivalent to \ref{listing:numbrsys:cmd}, with \cs{Ccool}]
+ {label=listing:numbrsys:in, listing and text}
+ % ^^A--->
+ \Ccool c{\mathbb{#1}}{ Nat = {N}, Real = {R} }
+ Let~$\Nat$ and $\Real$~denote the natural and real numbers.
+ % ^^A<---
+ \CcoolClear
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}
+% {\ref{listing:numbrsys:ex}. Equivalent to \ref{listing:numbrsys:in}, with expansion}
+% \iffalse
+%<*guardlisting>
+\fi
+\begin{listing}[ Equivalent to \ref{listing:numbrsys:in}, with expansion]
+ {label=listing:numbrsys:ex, listing and text}
+ % ^^A--->
+ \Ccool[Let~]
+ c{\mathbb{#1}}{ Nat = {N}, Real = {R} }*
+ [~denote the natural and real numbers.]{}
+ % ^^A<---
+ \CcoolClear
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}
+% {\ref{listing:numbrsys:pa}. Equivalent to \ref{listing:numbrsys:in}, parameterized (end of the tutorial)}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[ Equivalent to \ref{listing:numbrsys:in}, parameterized (end of the tutorial)]
+ {label=listing:numbrsys:pa, listing and text}
+ % ^^A--->
+ \Ccool<Style>c{\mathbb{#1}}{ Nat = {N}, Real = {R} }
+ [Let $\Nat<Style>$ and $\Real<Style>$ denote the natural and real numbers.]{}
+ % ^^A<---
+ \CcoolClear<Style>
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}
+% {\ref{listing:lang}. Language and mode}
+%^^A \selectlanguage{afrikaans}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{basque}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{catalan}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{croatian}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{czech}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{danish}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{dutch}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A % ^^A esperanto, % ERROR
+%^^A \selectlanguage{estonian}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{finnish}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{french}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A % ^^A galician, % ERROR
+%^^A \selectlanguage{german}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{hungarian}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{icelandic}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{indonesian}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{irish}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{italian}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A % ^^A kurmanji, % ERROR
+%^^A \selectlanguage{latin}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A % ^^A latvian, % ERROR
+%^^A \selectlanguage{lithuanian}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{ngerman}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{polish}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{portuguese}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{romanian}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{slovak}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{spanish}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{swedish}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{swissgerman}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{turkish}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{turkmen}\\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+%^^A \selectlanguage{welsh} \\
+%^^A \noindent\textbf{\languagename}{:}\\
+%^^A \CcoolOption[ Separ ]
+%^^A \Ccool{ X = x, Y = y }*
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[Language and mode]
+ {label=listing:lang}
+ % ^^A--->
+ \textbf{\languagename}{:}~\Ccool{ X = x, Y = y }*
+ \begin{otherlanguage}{spanish}
+ \CcoolOption[ Separ ]\\
+ \textbf{\languagename}{:}~\Ccool{ X = x, Y = y }*
+ \end{otherlanguage}\\
+ \textbf{\languagename}{:}~\Ccool{ X = x, Y = y }*
+ \\[1em]
+ \CcoolOption[ Outer = ####1 ]
+ \textbf{\languagename}{:}~\Ccool{ X = this, Y = that }*
+ \begin{otherlanguage}{spanish}
+ \CcoolOption[ Separ ]\\
+ \textbf{\languagename}{:}~\Ccool{ X = esto, Y = aquello }*
+ \end{otherlanguage}\\
+ \textbf{\languagename}{:}~\Ccool{ X = this, Y = that }*
+ \CcoolOption[ Separ ]\\
+ % ^^A<---
+ \CcoolOption
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}
+% {\ref{listing:se}. Separators}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[Separators
+ % \NB{bug}
+ % {Removing the closing \CcoolOption subsequently causes inconsistent separators between text and math mode (case replicated in uncommented form in dtx)
+ % ^^A% \begin{listing}[Separators]
+ % ^^A% {label=listing:se}
+ % ^^A% % ^^A--->
+ % ^^A% \CcoolOption[ Separ={{\ \char`@\ }{\ \%\ }{\ \char`@\ }} ]
+ % ^^A% \Ccool{ X = x, Y = y }*[\\]
+ % ^^A% { X = x, Y = y }*s{{~\&~}}[\\]
+ % ^^A% { X = x, Y = y }*s{{,~}{~\&~}}[\\[1em]]
+ % ^^A% { X = x, Y = y, Z = z }*[\\]
+ % ^^A% { X = x, Y = y, Z = z }*s{{~\&~}}[\\]
+ % ^^A% { X = x, Y = y, Z = z }*s{{,~}{\&~}}[\\]
+ % ^^A% { X = x, Y = y, Z = z }*s{{~\&~}{,~}{,~\&~}}\\
+ % ^^A%% ^^A<---
+ % ^^A% \CcoolClear
+ % ^^A% \end{listing}
+ % ^^A% \begin{listing}[Controlling the mode]
+ % ^^A% {label=listing:mode}
+ % ^^A% \Ccool{ X = x, Y = y }*\\
+ % ^^A% \Ccool{ X = x, Y = y, Z = z }*\\[1em]
+ % ^^A% \CcoolOption[ Outer = ####1 ]
+ % ^^A% \Ccool{ X = x, Y = y }*\\
+ % ^^A% \Ccool{ X = x, Y = y, Z = z }*\\[1em]
+ % ^^A% \CcoolOption[ Outer ]
+ % ^^A% \Ccool{ X = x, Y = y }*\\
+ % ^^A% \Ccool{ X = x, Y = y, Z = z }*
+ % ^^A% {Symptom:} Inconsistent separators
+ % ^^A% {Workaround:} Put \CcoolOption in listing:se
+ % ^^A% \end{listing}
+ % ^^A% }
+ % }
+ ]
+ {label=listing:se}
+ % ^^A--->
+ \CcoolOption[ Separ={{\ \char`@\ }{\ \%\ }{\ \char`@\ }} ]
+ \Ccool{ X = x, Y = y }*[\\]
+ { X = x, Y = y }*s{{~\&~}}[\\]
+ { X = x, Y = y }*s{{,~}{~\&~}}[\\[1em]]
+ { X = x, Y = y, Z = z }*[\\]
+ { X = x, Y = y, Z = z }*s{{~\&~}}[\\]
+ { X = x, Y = y, Z = z }*s{{,~}{\&~}}[\\]
+ { X = x, Y = y, Z = z }*s{{~\&~}{,~}{,~\&~}}\\
+ % ^^A<---
+ \CcoolOption
+ \CcoolClear
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}
+% {\ref{listing:hw:i}. Hello, world! (for testing's sake)}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[Hello, world! (testing)]
+ {label=listing:hw:i}
+ \CcoolOption[ Write = \BooleanTrue ]
+ % ^^A--->
+ \CcoolOption[Separ = {{}{.}{.}}, Outer = {####1}]
+ \Ccool
+ <Test>{ KeyA = {.}, KeyB = {!}, KeyC = {\%} }[]
+ <Test>{ KeyD = {d}, KeyE = {\%} }[]
+ <Test>c{\{#1\}}{ KeyF = {H}, KeyG = {e}, KeyH = {l} }*[]
+ <Test>{ KeyI = {\%}, KeyJ = {\%}, KeyK = {\%} }[.\{l\}.\{o\}]
+ <Test>{ KeyL = {l}, KeyM = {\char`[}, KeyN = {\char`]} }[]
+ <Test>{ KeyO = {o}, KeyP = {\%}, KeyQ = {\%} }[{,\ }]
+ <Test>{ KeyR = {w}, KeyS = {o}, KeyT = {r} }*
+ s{{}{}{}}c{{\char`[}#1}[]
+ <Test>{ KeyU = {\%}, KeyV = {\%}, KeyW = {\%} }[]
+ <Test>{ KeyX = {\%}, KeyY = {\%}, KeyZ = {\KeyB<Test>} }\nobreak
+ \KeyL<Test>\KeyD<Test>\KeyZ<Test>\KeyN<Test>\\
+ % ^^A<---
+ \CcoolOption
+ \CcoolClear
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}
+% {\ref{listing:hw:ii}. \docreflist{hw:i} read from file}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[\docreflist{hw:i} read from file]
+ {label=listing:hw:ii}
+ % ^^A--->
+ \CcoolRead
+ \KeyF<Test>\KeyA<Test>\nobreak
+ \KeyG<Test>\KeyA<Test>\nobreak
+ \KeyH<Test>\KeyA<Test>\nobreak
+ \KeyH<Test>\KeyA<Test>\nobreak
+ {\{}\nobreak\KeyO<Test>{\}},{\ }\nobreak
+ \KeyM<Test>\KeyR<Test>\nobreak
+ \KeyO<Test>\nobreak
+ \KeyT<Test>\nobreak
+ \KeyL<Test>\nobreak
+ \KeyD<Test>\nobreak
+ \KeyZ<Test>\nobreak
+ \KeyN<Test>\nobreak
+ % ^^A<---
+ \CcoolClear
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:proba:i}. Probability space}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[Probability space]
+ {label=listing:proba:i}
+ \CcoolOption[ Write = \BooleanTrue ]
+ % ^^A--->
+ \Ccool[Let~]
+ { Space = \Omega, Field = \mathcal{F}, Meas = \mathcal{P} }
+ *s{{,}}c{$\{#1\}$}
+ [~denote the probability space, where~]{ PowerSet = { 2^{\Space} } }
+ [$\Field\subset \PowerSet$.]
+ {}
+ % ^^A<---
+ \CcoolClear
+ \CcoolOption
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:proba:ii}. \docreflist{proba:i} read from file}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[\docreflist{proba:i} read from file]
+ {label=listing:proba:ii}
+ % ^^A--->
+ \CcoolRead \tab $\Omega$ $\Field$ $\Meas$
+ % ^^A<---
+ \CcoolClear
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:mvt:i}. Mittelwertsatz f\"ur \texorpdfstring{$n$} Variable. }
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[{Mittelwertsatz f\"ur $n$ Variable\cite[17.3]{tcolbox}}]
+ {label=listing:mvt:i}
+ \CcoolOption[ Write = \BooleanTrue ]
+ % ^^A--->
+ \selectlanguage{german}
+ \newtheorem{theorem}{Theorem}
+ \AfterEndEnvironment{theorem}{\CcoolHook}
+ \Ccool c{\mathbb{#1}}
+ { N = { N } , R = { R } }+[]
+ { Grad = { \operatorname{grad} } }+
+ [\begin{theorem}
+ [Mittelwertsatz f\"ur $n$ Variable]Es~sei~]
+ { OffMenge = {D}, Ci = {C^{1}}, Strecke = { \left[x_0,x\right] } }+
+ [$n\in\N$,~$\OffMenge\subseteq\N^n$ eine offene Menge und $f\in\Ci(\OffMenge,\R)$.
+ Dann gibt es auf jeder Strecke $\Strecke\subset\OffMenge$ einen Punkt $\xi\in\Strecke$,~]
+ { Steig = { \frac{ f(x)-f(x_0) }{ x-x_0 } }, Punkt = { \xi } }+
+ [so dass gilt
+ \begin{equation*}
+ \Steig = \Grad f(\Punkt)^{\top}
+ \end{equation*}
+ \end{theorem}]
+ {}
+ (Check: $\N$, $\Punkt$)
+ % ^^A<---
+ \CcoolClear
+ \CcoolOption
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:mvt:ii}. \docreflist{mvt:i} read from file}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[\docreflist{mvt:i} read from file]
+ {label=listing:mvt:ii}
+ % ^^A--->
+ \CcoolRead \tab $\N$ $\R$ $\OffMenge$ $\Ci$ $\Strecke$
+ % ^^A<---
+ \CcoolClear
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:poly:real:i}. Families of polynomial functions}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[Families of polynomial functions]
+ {label=listing:poly:real:i}
+ \CcoolOption[ Write = \BooleanTrue ]
+ % ^^A--->
+ \Ccool c{\mathbb{#1}}{ Nat = {N}, Real = {R} }
+ [Let~]
+ { PolyR = \CcoolLambda[o]{\Real\IfValueT{#1}{_#1}[X] } }
+ [$\PolyR[n]$ and $\PolyR$, denote the families of polynomial functions on $\Real$, of order $n$ et and their union over $n \in \Nat$, respectively. ]
+ {}
+ % ^^A<---
+ \CcoolClear
+ \CcoolOption
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:poly:real:ii}. \docreflist{poly:real:i} read from file}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[\docreflist{poly:real:i} read from file]
+ {label=listing:poly:real:ii}
+ % ^^A--->
+ \CcoolRead \tab $\PolyR[n]$ et $\PolyR$
+ % ^^A<---
+ \CcoolClear
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:poly:arb:i}. Same as \docreflist{poly:real:i}, but arbitrary number system}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[Same as \docreflist{poly:real:i}, but arbitrary number system]
+ {label=listing:poly:arb:i}
+ \CcoolOption[ Write = \BooleanTrue ]
+ % ^^A--->
+ \selectlanguage{french}
+ \Ccool c{\mathbb{#1}}{ Corps = {K}, Nat = {N}, Reel = {R} }
+ [Soient~]
+ {
+ Poly = \CcoolLambda[om]{#2\IfValueT{#1}{_#1}[X] },
+ PolyR = \CcoolLambda[o]{\Poly[#1]{\Reel}}
+ }
+ [$\Poly[n]{\Corps}$ et $\Poly{\Corps}$, les familles de polyn\^omes sur $\Corps$, de degr\'e $n$ et leur union pour $n \in \Nat$, respectivement. En particulier,
+ ils sont d\'enot\'es $\PolyR[n]$ et $\PolyR$, pour $\Corps=\Reel$.]
+ {}
+ % ^^A<---
+ \CcoolClear
+ \CcoolOption
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:poly:real:ii}. \docreflist{poly:arb:i} read from file}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[\docreflist{poly:arb:i} read from file]
+ {label=listing:poly:arb:ii}
+ % ^^A--->
+ \CcoolRead \tab $\PolyR[n]$ et $\PolyR$
+ % ^^A<---
+ \CcoolClear
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:fonc:i}. Fonction et fonctionelle}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[Fonction et fonctionelle]
+ {label=listing:fonc:i}
+ \CcoolOption[ Write = \BooleanTrue ]
+ % ^^A--->
+ \selectlanguage{french}
+ \Ccool{ EvalAt = \CcoolLambda{(#1)}, ApplyOp = \CcoolLambda[mm]{#1[#2]} }
+ [Supposons une fonction $f\EvalAt{t}$, et \'etudions le probl\`eme o\`u la fonctionnelle $\ApplyOp{S}{f}$ est donn\'ee par\dots]{}
+ % ^^A<---
+ \CcoolClear
+ \CcoolOption
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:fonc:ii}. \docreflist{fonc:i} read from file}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[\docreflist{fonc:i} read from file]
+ {label=listing:fonc:ii}
+ % ^^A--->
+ \CcoolRead \tab $f\EvalAt{t}$, $\ApplyOp{S}{f}$
+ % ^^A<---
+ \CcoolClear
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:cusum:i}. CUSUM statistic.}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[CUSUM statistic\cite{ccool-thesis}]
+ {label=listing:cusum:i}
+ \CcoolOption[ Write = \BooleanTrue ]
+ % ^^A--->
+ \newtheorem{definition}{Definition}
+ \AfterEndEnvironment{definition}{\CcoolHook}
+ \Ccool{
+ SuchThat = { ;~ },
+ Time = { t },
+ Process = { \xi },
+ StopT = { T },
+ EvalAt = \CcoolLambda{(#1)}
+ }
+ [The CUSUM statistic process and the corresponding one-sided CUSUM stopping time are defined as follows:
+ \begin{definition}\label{the CUSUM statistic}. Let~]
+ {
+ Scale = { \lambda },
+ Real = {\mathcal{R}}
+ }+*s{{~\in~}}
+ [~and~]
+ { CUSUMthresh = { \nu } }+*c{$#1\in\Real^{+}$.}
+ [~Define the following processes:]
+ {
+ LogWald = { u },
+ CUSUMst = { \StopT_{c} },
+ CUSUM = { y },
+ LogWaldInf = { m }
+ }+
+ [\begin{enumerate}
+ \item{
+ $\LogWald_{\Time}\EvalAt{ \Scale } = \Scale\Process_{\Time} - \frac{1}{2}\Scale^2\Time$;
+ $\LogWaldInf_{\Time}\EvalAt{ \Scale } = \inf_{ 0\le s \le \Time }\CUSUM_{s} \EvalAt{ \Scale }$.
+ }
+ \item{
+ $\CUSUM_{\Time}\EvalAt{ \Scale } = \LogWaldInf_{\Time}\EvalAt{ \Scale } - \LogWald_{\Time}\EvalAt{ \Scale }\ge0$,
+ which is the CUSUM statistic process.
+ }
+ \item{
+ $\CUSUMst \EvalAt{ \Scale, \LogWaldInf } = \inf\left[ \Time \ge 0 \SuchThat \CUSUM_{\Time}\EvalAt{\Scale} \ge \LogWaldInf \right]$,
+ which is the CUSUM stopping time.
+ }
+ \end{enumerate}
+ \end{definition}\par]{}
+
+ (Check: $\Scale$, $\CUSUM$)
+ % ^^A<---
+ \CcoolClear
+ \CcoolOption
+% \end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \phantomsection\addcontentsline{toc}{section}{\ref{listing:cusum:ii}. \docreflist{cusum:i} read from file}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[\docreflist{cusum:i} read from file]
+ {label=listing:cusum:ii}
+ % ^^A--->
+ \CcoolRead \tab $\Time $ $\Process$ $\Scale$ $\Real$ $\CUSUMthresh$ $\LogWald$ $\CUSUMst$ $\CUSUM$ $\LogWaldInf$
+ % ^^A<---
+ \CcoolClear
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \clearpage
+% \part{Other}\label{part:other}
+%
+% \section{Acknowledgment}\label{other:acknowl}
+%
+% This work has benefited from Q\&A's from the \LaTeX community\cite{user-erw}\cite{p158966}.
+% Specific attributions are made throughout this document.
+%
+% \section{Genealogy}\label{other:geneal}
+%
+% \textquote
+% [\pkg{cool}\cite{cool}]
+% {Give commands the ability to contain the mathematical meaning while retaining the typesetting versatility}.
+% The addition of `c', in \pkg{ccool}, is for \emph{custom}. With hinsdight it is restrictive to
+% describe \pkg{ccool} as a tool for encoding mathematical convention.
+%
+% \section{Install}\label{other:install}
+% \begin{enumerate}[label=\emph{\arabic*)}]
+% \item Compile \file{ccool.dtx} (under Unix, \texttt{\$pdflatex ccool.dtx})
+% \item Put the generated \file{ccool.sty} in the search path of the \LaTeX engine
+%^^A \NB{todo}{\pkg{l3buid} install}
+% \end{enumerate}
+%
+% \section{Issue}\label{other:issue}
+%
+% Listed under:
+% \begin{enumerate}[label={\emph{\alph*)}}]
+% \item \env{NOTE} or \cs{NB}, tagged either \texttt{bug} or \texttt{fixed}, inside \jobname|.dtx|
+% \end{enumerate}
+%
+% \section{Support}\label{other:support}
+%
+% This package is available from \url{https://www.ctan.org/pkg/ccool} and \url{https://github.com/rogard/ccool}.
+%
+% \section{Testing}\label{other:testing}
+%
+% \subsection{Technicality}
+% Not possible to compile-check the expansion of a certain class of macros against predefined values\cite{a-534100}.
+% Instead, one can
+% \begin{enumerate}[label={\emph{\alph*)}}]
+% \item Follow the steps in \autoref{other:install} on one's own machine to generate \jobname|.pdf|
+% \item Visually check \autoref{part:listing}, against that \href{https://github.com/rogard/ccool}{of the repository}, for the same version.
+% \end{enumerate}
+% Also see:
+% \begin{enumerate}[label={\emph{\alph*)}}]
+% \setcounter{enumi}{2}
+% \item Also see: \autoref{other:todo}~\ref{todo:regtest}
+% \end{enumerate}
+%
+% \subsection{Platform}
+% \begin{enumerate}[label=\emph{\roman*)}]
+% \item
+% ^^A uname -a
+% \begin{Verbatim}[breaklines=true]
+% Linux laptop 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
+% \end{Verbatim}
+% \label{plat:lin}
+% \end{enumerate}
+%
+% \subsection{Engine}
+% \begin{enumerate}[label=\emph{\alph*)}]
+% \item
+% \begin{Verbatim}[breaklines=true]
+% pdfTeX 3.14159265-2.6-1.40.20 (TeX Live 2019)
+% \end{Verbatim}
+% \label{eng:tlxviiii:pdf}
+% \item
+% \begin{Verbatim}[breaklines=true]
+% pdfTeX 3.14159265-2.6-1.40.21 (TeX Live 2020)
+% \end{Verbatim}
+% \label{eng:tlxx:pdf}
+% \item
+% \begin{Verbatim}[breaklines=true]
+% LuaHBTeX, Version 1.12.0 (TeX Live 2020)
+% \end{Verbatim}
+% \label{eng:tlxx:lua}
+% \item
+% \begin{Verbatim}[breaklines=true]
+% XeTeX 3.14159265-2.6-0.999992 (TeX Live 2020)
+% \end{Verbatim}
+% \label{eng:tlxx:xe}
+% \end{enumerate}
+%
+% \subsection{Results}
+%
+% \begin{enumerate}[label=\emph{\arabic*)}]
+% \item \pkg{ccool} \docvers{1}{8} compiles satisfactorily on platform \ref{plat:lin} and engine \ref{eng:tlxviiii:pdf}
+% \item \pkg{ccool} \docvers{1}{8} compiles satisfactorily on platform \ref{plat:lin} and engine \ref{eng:tlxx:pdf}
+% \item \pkg{ccool} \docvers{1}{9} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf} and \ref{eng:tlxx:lua}
+% \item \pkg{ccool} \docvers{2}{0} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf}, \ref{eng:tlxx:lua}, and \ref{eng:tlxx:xe}
+% \item \pkg{ccool} \docvers{2}{1} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf}, \ref{eng:tlxx:lua}, and \ref{eng:tlxx:xe}
+% \item \pkg{ccool} \docvers{2}{3} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf}, \ref{eng:tlxx:lua}, and \ref{eng:tlxx:xe}
+% \item \pkg{ccool} \docvers{2}{7} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf}, \ref{eng:tlxx:lua}, and \ref{eng:tlxx:xe}
+% \item \pkg{ccool} \docvers{2}{8} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf}, \ref{eng:tlxx:lua}, and \ref{eng:tlxx:xe}
+% \end{enumerate}
+%
+% \subsection{Other}
+% Check \cite{ccool-thesis} for testing \pkg{ccool} with \cls{llncs}
+%
+% \section{To do}\label{other:todo}
+%
+% \begin{enumerate}[label=\emph{\alph*)}]
+% \item Regression testing using \cite[Section 3.2—Specifying expectations]{l3build}. \label{todo:regtest}
+% \end{enumerate}
+% Also see:
+% \begin{enumerate}[label=\emph{\alph*)}]
+% \setcounter{enumi}{1}
+% \item \env{NOTE} or \cs{NB} tagged \texttt{abandon\docpipe{}done\docpipe{}todo} inside \jobname|.dtx|
+% \end{enumerate}
+%
+% \DocPhantomSection*{section}{References}{other:bib}
+% \begin{thebibliography}{1}
+% \bibitem{cool} Nick Setzer {\em The \pkg{cool} package}, 2005, \url{https://www.ctan.org/pkg/cool}
+% \bibitem{interface3} The \LaTeX3 Project Team {\em The \LaTeX3 interfaces}, 2019,
+% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}
+% \bibitem{l3build} The \LaTeX3 Project Team {\em The \pkg{l3build} package}, 2020,
+% \url{http://mirror.utexas.edu/ctan/macros/latex/contrib/l3build/l3build.pdf}
+% \bibitem{tcolbox} Thomas F. Sturm {\em The \pkg{tcolorbox} package}, 2019,
+% \url{http://www.texdoc.net/texmf-dist/doc/latex/tcolorbox/tcolorbox.pdf}
+% \bibitem{xparse} The \LaTeX3 Project Team {\em The \pkg{xparse} package}, 2020,
+% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3packages/xparse.pdf}
+% \bibitem{ccool-thesis} Erwann Rogard and Olympia Hadjiliadis {\em Typesetting a math thesis with \pkg{ccool}}, 2020,
+% \url{https://github.com/rogard/ccool/blob/master/thesis.pdf}
+% \bibitem{user-erw} \url{https://tex.stackexchange.com/users/112708/erwann?tab=questions}
+% \bibitem{a-534100} \href{https://tex.stackexchange.com/users/73/joseph-wright}{@{}joseph-wright}'s answer to
+% ``Checking a function's expansion against a string'', \url{https://tex.stackexchange.com/a/534100}
+% \bibitem{a-536597} \href{https://tex.stackexchange.com/users/73317/frougon}{@{}frougon}'s answer to ``Journaling calls to a function \textdel{taking inline code as argument}'', \url{https://tex.stackexchange.com/a/536620}
+% \bibitem{p158966}\cs{Ccool}, extension à \LaTeX~à vocation mathématique, \url{http://forum.mathematex.net/latex-f6/ccool-extension-latex-a-vocation-mathematique-t17314.html}
+% \bibitem{a-547018} \href{https://tex.stackexchange.com/users/5735/javier-bezos}{@{}Javier Bezos}'s answer to~\url{https://tex.stackexchange.com/a/547018/112708}
+% \end{thebibliography}
+%
+% \changes{\docvers{1}{0}}
+% {2020/03/08}
+% {Initial version}
+% \changes{\docvers{1}{1}}
+% {2020/04/04}
+% {Rearrange: much of the implementation}
+% \changes{\docvers{1}{1}}
+% {2020/04/04}
+% {Replace: \Arg{kvl_{2}}~by~\docpard{\meta{kvl_{2}}}~given that option type \texttt{G} not recommended\cite{xparse}}
+% \changes{\docvers{1}{1}}
+% {2020/04/04}
+% {Replace: \cs{OopsOptions}~by~\cs{OopsOption}}
+% \changes{\docvers{1}{1}}
+% {2020/04/04}
+% {Replace: \docarg{GenericObject}~by~\docarg{Name}}
+% \changes{\docvers{1}{1}}
+% {2020/04/04}
+% {Replace: \docarg{Separators}~by~\docarg{Separ}}
+% \changes{\docvers{1}{1}}
+% {2020/04/04}
+% {Add:\cs{OopsTest}}
+% \changes{\docvers{1}{1}}
+% {2020/04/04}
+% {Add:\cs{OopsRestore}}
+% \changes{\docvers{1}{1}}
+% {2020/04/04}
+% {Add: \docarg{Save}}
+% \changes{\docvers{1}{1}}
+% {2020/04/04}
+% {Delete: Listing 1-5 from \docvers{1}{0}}
+% \changes{\docvers{1}{1}}
+% {2020/04/04}
+% {Add: Listing~1., 2., 3., 4., 6., and 9.}
+% \changes{\docvers{1}{1}}
+% {2020/04/04}
+% {Fix: apparent anomaly in \docvers{1}{0}'s Listing~4, see \docreflist{hw:i}}
+% \changes{\docvers{1}{2}}
+% {2020/04/06}
+% {Add: optional \pkgparex to \cs{OopsNew} as instruction to expand \pkgparkvl}
+% \changes{\docvers{1}{2}}
+% {2020/04/06}
+% {Replace: \cs{OopsClear}\Arg{\pkgparpa} by \cs{OopsClear}\docparo{\meta{\doccceptkvl}}}
+% \changes{\docvers{1}{2}}
+% {2020/04/06}
+% {Delete: \meta{kvl_{2}}~and~\meta{code_{2}}}
+% \changes{\docvers{1}{2}}
+% {2020/04/06}
+% {Delete: \cs{OopsTest}}
+% \changes{\docvers{1}{2}}
+% {2020/04/06}
+% {Delete: Listing~2-3 from \docvers{1}{1}.}
+% \changes{\docvers{1}{2}}
+% {2020/04/06}
+% {Replace: \cs{Save} by \cs{Write}}
+% \changes{\docvers{1}{2}}
+% {2020/04/06}
+% {Replace: \cs{Restore} by \cs{Read}}
+% \changes{\docvers{1}{3}}
+% {2020/04/06}
+% {Replace: \cs{OopsNew} by \cs{Oops}}
+% \changes{\docvers{1}{3}}
+% {2020/04/06}
+% {Replace: \Arg{\pkgparpa} and \docparo{\meta{\pkgparpa}} by \docpard{\meta{\pkgparpa}} }
+% \changes{\docvers{1}{4}}
+% {2020/04/10}
+% {Replace: \docpare{s}{\Arg{\pkgparsi}\Arg{\pkgparsii}\Arg{\pkgparsiii}}
+% by \docpare{s}{\Arg{\pkgparsi}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\Arg{\pkgparsiii}}}
+% \changes{\docvers{1}{4}}
+% {2020/04/10}
+% {Add:optional \pkgparap to \cs{OopsNew} to make side effects presist beyond local group}
+% \changes{\docvers{1}{4}}
+% {2020/04/10}
+% {Add: \cs{OopsHook}}
+% \changes{\docvers{1}{4}}
+% {2020/04/10}
+% {Delete: Listing~1., and 2. }
+% \changes{\docvers{1}{4}}
+% {2020/04/10}
+% {Add: Listing~1., 2., and 3. }
+% \changes{\docvers{1}{4}}
+% {2020/04/10}
+% {Add: \docarg{Expans} (for debugging' sake, but...) }
+% \changes{\docvers{1}{4}}
+% {2020/04/10}
+% {Add: \autoref{usage:dosdont} }
+% \changes{\docvers{1}{4}}
+% {2020/04/10}
+% {Add: \cs{OopsDebug} }
+% \changes{\docvers{1}{5}}
+% {2020/04/10}
+% {Delete: dependence on \pkg{datetime} }
+% \changes{\docvers{1}{5}}
+% {2020/04/10}
+% {Add: \pkgoptfi }
+% \changes{\docvers{1}{6}}
+% {2020/04/10}
+% {Rename: \pkg{oops} to \pkg{ccool} (better describes the purpose) }
+% \changes{\docvers{1}{6}}
+% {2020/04/10}
+% {Rename: \cs{Oops} to \cs{Ccool}}
+% \changes{\docvers{1}{6}}
+% {2020/04/10}
+% {Rename: \cs{OopsClear} to \cs{CcoolClear}}
+% \changes{\docvers{1}{6}}
+% {2020/04/10}
+% {Rename: \cs{OopsDebug} to \cs{CcoolDebug}}
+% \changes{\docvers{1}{6}}
+% {2020/04/10}
+% {Rename: \cs{OopsHook} to \cs{CcoolHook}}
+% \changes{\docvers{1}{6}}
+% {2020/04/10}
+% {Rename: \cs{OopsOption} to \cs{CcoolOption}}
+% \changes{\docvers{1}{6}}
+% {2020/04/10}
+% {Rename: \cs{OopsRead} to \cs{CcoolRead}}
+% \changes{\docvers{1}{6}}
+% {2020/04/10}
+% {Add: Listing showing part of the preamble }
+% \changes{\docvers{1}{7}}
+% {2020/04/11}
+% {Add: \docreflist{cusum:i} (CUSUM) }
+% \changes{\docvers{1}{7}}
+% {2020/04/11}
+% {Add: Legends to listings }
+% \changes{\docvers{1}{7}}
+% {2020/04/11}
+% {Delete: \cs{CcoolDebug} }
+% \changes{\docvers{1}{7}}
+% {2020/04/11}
+% {Delete: Listing~5 from \docvers{1}{6} }
+% \changes{\docvers{1}{8}}
+% {2020/04/12}
+% {Add: \hyperref[usage:cs:lambda]{\cs{CcoolLambda}} }
+% \changes{\docvers{1}{8}}
+% {2020/04/12}
+% {Add: \docreflist{fonc:i}, \docreflist{fonc:ii} }
+% \changes{\docvers{1}{8}}
+% {2020/04/12}
+% {Add: \cs{CcoolVers} }
+% \changes{\docvers{1}{8}}
+% {2020/04/12}
+% {Add: \docreflist{vers} }
+% \changes{\docvers{1}{9}}
+% {2020/04/14}
+% {Add: support for \LuaTeX }
+% \changes{\docvers{1}{9}}
+% {2020/04/14}
+% {Move: from \autoref{part:usage} to \autoref{part:impl}, what is now that part's \autoref{impl:frontend}}
+% \changes{\docvers{2}{0}}
+% {2020/04/15}
+% {Delete: \pkgoptfi's dependency on \pkg{texosquery} and \cs{pdfcreationdate}}
+% \changes{\docvers{2}{0}}
+% {2020/04/15}
+% {Add: support for \XeTeX}
+% \changes{\docvers{2}{0}}
+% {2020/04/15}
+% {Update: \cs{RequirePackage}, \cs{NeedsTeXFormat}'s second argument / TeX Live 2020}
+% \changes{\docvers{2}{1}}
+% {2020/04/17}
+% {Replace: \hyperref[usage:cs:lambda]{\cs{CcoolLambda}}'s optional integer argument (number of \texttt{m}'s)
+% by a standard argument list}
+% \changes{\docvers{2}{1}}
+% {2020/04/17}
+% {Replace: \hyperref[ccool:pa]{\meta{\pkgparpa}}'s position within \cs{Ccool}'s argument list, from first to second. Greater versatility }
+% \changes{\docvers{2}{1}}
+% {2020/04/17}
+% {Replace: as~the~default~of~\pkgoptpa,~\docarg{Math}~by~\pkgoptpad}
+% \changes{\docvers{2}{1}}
+% {2020/04/17}
+% {Replace: \docccept{\doccceptgopt}~\docarg{Name} by \nameref{usage:opt:pa} }
+% \changes{\docvers{2}{1}}
+% {2020/04/17}
+% {Add:Listings 3, 4, 5, 6, 7, 8, and 9}
+% \changes{\docvers{2}{2}}
+% {2020/04/20}
+% {Remove: \% from listings}
+% \changes{\docvers{2}{2}}
+% {2020/04/20}
+% {Replace: part of the abstract's with more straighforward descriptions based on input from forum participtants}
+% \changes{\docvers{2}{3}}
+% {2020/05/16}
+% {Replace: for \cs{Ccool}, \docpare{i}{} by \docpare{c}{}}
+% \changes{\docvers{2}{3}}
+% {2020/05/16}
+% {Rearranged: \nameref{usage:cs:ccool}'s subsections. Previously, by argument. Now, by feature. }
+% \changes{\docvers{2}{3}}
+% {2020/05/16}
+% {Replace: In \docstep{key}, the created command's implementation, from \cs{ProvideDocumentCommand} to \cs{DeclareDocumentCommand}}
+% \changes{\docvers{2}{3}}
+% {2020/05/16}
+% {Complete: \docreflist{poly:real:i}}
+% \changes{\docvers{2}{3}}
+% {2020/05/16}
+% {Add: \docreflist{poly:real:ii}, \docreflist{poly:arb:i}, and \docreflist{poly:arb:ii}}
+% \changes{\docvers{2}{3}}
+% {2020/05/16}
+% {Remove: Listing showing part of the preamble }
+% \changes{\docvers{2}{4}}
+% {2020/05/16}
+% {Fix: minor error in the listings (\cs{Real} rather than \cs{Reel}, hitherto unnoticed). }
+% \changes{\docvers{2}{4}}
+% {2020/05/16}
+% {Remove: examples from \autoref{part:usage},~\nameref{usage:cs:ccool}, as redundant with \autoref{part:listing}~\docreflist{numbrsys:base}-\ref{listing:numbrsys:pa}}
+% \changes{\docvers{2}{5}}
+% {2020/05/21}
+% {Modify: behavior of \autoref{part:usage}~\nameref{ccool:ex}, rely on \pkg{erw-l3}'s \cs{erw_seq_use:Nn} }
+%
+% \changes{\docvers{2}{5}}
+% {2020/05/21}
+% {Modify: \nameref{impl:opt:fi}, rely on \pkg{erw-l3}'s \cs{erw_jobnametimestamp:} }
+%
+% \changes{\docvers{2}{6}}
+% {2020/05/22}
+% {Modify: \nameref{impl:cs:lambda}, rely on \pkg{erw-l3}'s \cs{erw_lambda:nnn} }
+%
+% \changes{\docvers{2}{7}}
+% {2020/05/28}
+% {Add: \docccept{\doccceptgopt}~\nameref{usage:opt:an} }
+%
+% \changes{\docvers{2}{7}}
+% {2020/05/28}
+% {Add: \doclist{lang} }
+%
+% \changes{\docvers{2}{7}}
+% {2020/05/28}
+% {Modify: \nameref{usage:opt:se}'s default rely on \pkg{babel} and \pkg{amsmath}, if applicable}
+%
+% \changes{\docvers{2}{7}}
+% {2020/05/28}
+% {Modify: \nameref{usage:cs:option}'s \docxparsem by \docxparseo}
+%
+% \changes{\docvers{2}{8}}
+% {2020/05/28}
+% {Fix: conflict between \cs{usepackage}\docparo{spanish}\docparm{babel} and \nameref{ccool:pa} }
+%
+% \changes{\docvers{2}{9}}
+% {2020/06/03}
+% {Miscellaneous }
+%
+% \changes{\docvers{3}{0}}
+% {2020/06/04}
+% {Miscellaneous }
+%
+% \changes{\docvers{3}{1}}
+% {2020/10/10}
+% {Replaced: \doclist{thisdeps}'s content, from exhaustive dependencies to those explicit with \cs{usepackage}}
+%
+% \PrintChanges
+% \PrintIndex
+% \clearpage
+% \StopEventually{
+% ^^A \PrintChanges
+% ^^A \PrintIndex
+% }
+% \end{documentation}
+% \begin{implementation}
+% \selectlanguage{english}
+% \part{Implementation}\label{part:impl}
+%
+% \section{Opening}
+% \begin{macrocode}
+%<*package>
+%<@@=ccool>
+\ExplSyntaxOn
+% \end{macrocode}
+% \section{\textsf{aux}}
+% \begin{macro}{\@@_aux_inner_set:n}
+% \begin{arguments}
+% \item \meta{code}
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_inner_set:n
+{
+ \cs_gset:Npn \@@_aux_inner:n ##1 {#1}
+ \cs_generate_variant:Nn \@@_aux_inner:n { e }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_key:w }
+% \begin{arguments}
+% \item \meta{ key }
+% \item \meta{ value }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_aux_key:w #1 = #2 \q_stop
+{
+ \seq_gput_right:Nx \g@@_aux_key_seq { \tl_trim_spaces:n{#1} }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_key:n }
+% \begin{arguments}
+% \item \meta{ key = value }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_key:n
+{
+ \@@_aux_key:w #1 \q_stop
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_key:N }
+% \begin{arguments}
+% \item \meta{ seq }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_key:N
+{
+ \seq_gclear_new:N \g@@_aux_key_seq
+ \seq_map_function:NN #1 \@@_aux_key:n
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_outer_set:n}
+% \begin{arguments}
+% \item \meta{ inline code }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_outer_set:n
+{
+ \cs_gset:Npn \@@_aux_outer:n ##1 {#1}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_prop:nn}
+% \begin{macrocode}
+\prop_new:N \g@@_aux_prop
+\cs_new_protected:Nn \@@_aux_prop:nn
+{
+ \prop_gput:Nnn \g@@_aux_prop{#1}{#2}
+}
+\cs_generate_variant:Nn \@@_aux_prop:nn { eo, ee, ex, xo, xe, xx }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_prop:w}
+% \begin{arguments}
+% \item \meta{ key }
+% \item \meta{ value }
+% \end{arguments}
+% \begin{macrocode}
+\tl_new:N \g@@_option_expans_tl
+\cs_new_protected:Npn \@@_aux_prop:w #1 = #2 \q_stop
+{
+ \exp_args:Nx
+ \use:c{@@_aux_prop:\g@@_option_expans_tl}
+ { \tl_trim_spaces:n{#1} }
+ { \@@_aux_inner:n{ \tl_trim_spaces:n{#2} } }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_prop:n}
+% \begin{arguments}
+% \item \meta{ key = value }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_prop:n
+{
+ \@@_aux_prop:w #1 \q_stop
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_prop:N}
+% \begin{arguments}
+% \item \meta{keyval list}
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_prop:N
+{
+ \prop_gclear_new:N \g@@_aux_prop
+ \seq_if_empty:NTF #1
+ { \c_empty_tl }
+ {
+ \seq_map_function:NN #1 \@@_aux_prop:n
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_val:Nn}
+% \begin{arguments}
+% \item \meta{ seq }
+% \item \meta{ tl var name }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_val:Nn
+{
+ \seq_gclear_new:N \g@@_aux_val_seq
+ \@@_seq_from_prop:NNn \g@@_aux_val_seq #1 { \@@_prop_name:n{#2} }
+}
+% \end{macrocode}
+% \end{macro}
+% \section{\textsf{lang}}
+% \begin{macrocode}
+\prop_new:N \g@@_lang_and_prop
+% \end{macrocode}
+% \begin{macro}{\@@_lang_and_update:n}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_lang_and_update:n
+{
+ \erw_prop_keyval_parse:NNNn
+ \g@@_lang_and_prop
+ \erw_keyval_error:Nn
+ \prop_gput:Nnn
+ { #1 }
+}
+\cs_generate_variant:Nn \@@_lang_and_update:n { e }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_lang_and:n, \@@_lang_and:}
+% \begin{macrocode}
+\cs_new:Nn \@@_lang_and:n
+{
+ \prop_if_in:NnTF
+ \g@@_lang_and_prop
+ {#1}
+ {\prop_item:Nn\g@@_lang_and_prop{#1}}
+ {
+ \msg_warning:nnn{@@}{lang_and}{#1}
+ \@@_lang_and:n{english}
+ }
+}
+\ifcsdef{languagename}
+{
+ \cs_new:Nn \@@_lang_and:{\exp_args:No\@@_lang_and:n{\languagename}}
+}
+{
+ \cs_new:Nn \@@_lang_and:{english}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{variable}{\c@@_lang_and_tl}
+%\NB{todo}{Non latin-alphabet languages}
+% \begin{macrocode}
+\tl_const:Nn \c@@_lang_and_tl
+{
+%^^A https://www.overleaf.com/learn/latex/International_language_support
+ afrikaans=en,
+ basque=eta,
+ catalan=i,
+ croatian=i,
+ czech=a,
+ danish=og,
+ dutch=en,
+ english=and,
+ esperanto=kaj,
+ estonian=ja,
+ finnish=ja,
+ french=et,
+ galician=e,
+ german=und,
+ hungarian=\'es,
+ icelandic=og,
+ indonesian=dan,
+ irish=agus,
+ italian=e,
+ kurmanji=\^u,
+ latin=et,
+ latvian=un,
+ lithuanian=ir,
+ ngerman=und,
+ polish=i,
+ portuguese=e,
+ romanian=\c{s}i,
+ slovak=a,
+ spanish=y,
+ swedish=och,
+ swissgerman=und,
+ turkish=ve,
+ turkmen=we,
+ welsh=a
+}
+% \end{macrocode}
+% \end{variable}
+% \section{\textsf{log}}
+% \begin{macro}{\@@_log_close:}
+% \begin{macrocode}
+\iow_new:N \g@@_log_iow
+\AtEndDocument{\iow_close:N \g@@_log_iow}
+\bool_set_false:N \g@@_log_open_bool
+\cs_new_protected:Nn \@@_log_close:
+{
+ \iow_close:N \g@@_log_iow
+ \bool_gset_false:N \g@@_log_open_bool
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_log_open:}
+% \begin{macrocode}
+\tl_new:N \g@@_log_file_tl
+\cs_new_protected:Nn \@@_log_open:
+{
+ \tl_gset:Nx \g@@_log_to_tl{\g@@_log_file_tl}
+ \iow_open:Nn \g@@_log_iow {\g@@_log_to_tl}
+ \bool_gset_true:N \g@@_log_open_bool
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_log_read:n}
+% \begin{arguments}
+% \item \meta{path}
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_log_read:n
+{
+ \file_input:n{#1}
+ \tl_log:n{read~from~#1}
+}
+\cs_generate_variant:Nn \@@_log_read:n { e }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_log_read:}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_log_read:
+{
+ \@@_log_read:e{\g@@_log_to_tl}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_log_write:n}
+% \begin{macrocode}
+\tl_new:N \g@@_log_to_tl
+\cs_new_protected:Nn \@@_log_write:n
+{
+ \bool_if:nTF{ \g@@_log_open_bool }
+ {
+ \iow_now:Nn \g@@_log_iow {#1}
+ \tl_log:n{ write~to~#1 }
+ }
+ { \msg_error:nnn{ @@ }{ iow }{ \g@@_log_iow } }
+}
+\cs_generate_variant:Nn \@@_log_write:n { e }
+% \end{macrocode}
+% \end{macro}
+% \section{\textsf{make_key}}
+% \begin{macro}{\@@_make_key:Nn}
+% \begin{arguments}
+% \item \meta{ token }
+% \item \meta{ key }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_make_key:Nn
+{
+ \exp_args:NNx
+ \DeclareDocumentCommand{#1}
+ { D<>{\g@@_option_param_tl} }
+ {
+ \@@_prop_item:nn{##1}{#2}
+ }
+}
+\cs_generate_variant:Nn \@@_make_key:Nn {c}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_make_key:n}
+% \begin{arguments}
+% \item \meta{ key }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_make_key:n
+{
+ \@@_make_key:cn{#1}{#1}
+}
+\cs_generate_variant:Nn \@@_make_key:n { e }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_make_key:N}
+% \begin{arguments}
+% \item \meta{ seq }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_make_key:N
+{
+ \seq_map_function:NN #1 \@@_make_key:e
+}
+% \end{macrocode}
+% \end{macro}
+% \section{\textsf{make_ccool}}
+% \begin{macro}{\@@_make_ccool_exp:nnn}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_make_ccool_exp:nnn
+{
+ \@@_aux_val:Nn \g@@_aux_key_seq {#1}
+ \@@_aux_outer_set:n{#3}
+ \@@_aux_outer:n
+ {
+ \exp_args:NNf
+ \erw_seq_use:Nn
+ \g@@_aux_val_seq
+ {#2}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_make_ccool_key:nnn}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_make_ccool_key:nnn
+{
+ \@@_prop_if_exist:nTF{#1}
+ { \c_empty_tl }
+ { \@@_prop_new:n{#1} }
+ \exp_args:No \@@_aux_inner_set:n{#2}
+ \seq_set_from_clist:Nn \g@@_aux_keyval_seq {#3}
+ \@@_aux_prop:N \g@@_aux_keyval_seq
+ \@@_prop_append:Nn \g@@_aux_prop {#1}
+ \@@_aux_key:N \g@@_aux_keyval_seq
+ \@@_make_key:N \g@@_aux_key_seq
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_make_ccool_sideeffect:nnn}\cite{a-536597}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_make_ccool_sideeffect:nnn
+{
+ \@@_make_ccool_key:nnn{#1}{#2}{#3}
+ \bool_if:nTF{ \g@@_log_open_bool }
+ {
+ \@@_log_write:n
+ {
+ \begingroup
+ \def \@@_log_entry { \Ccool<#1>c{#2}{#3} } \expandafter
+ \endgroup \@@_log_entry
+ }
+ }{\c_empty_tl}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_make_ccool:nnnn}
+% \begin{arguments}
+% \item \meta{ token list }
+% \item \meta{ seq_{1} }
+% \item \meta{ seq_{2} }
+% \item \meta{ prop }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_make_ccool:nnnn #1 #2 #3 #4
+{
+ \exp_args:NNx \DeclareDocumentCommand \Ccool
+ {%^^A 2 3 4 5 6 7 8 9
+ +o D<>{#1} E{ c }{{#2}} m t+ s E{ s c }{{#3}{#4}} +o
+ }
+ {
+ \IfValueT{##1}{##1}
+ \@@_make_ccool_sideeffect:nnn{##2}{##3}{##4}
+ \IfBooleanT{##6}
+ {
+ \@@_make_ccool_exp:nnn{##2}{##7}{##8}
+ }
+ \bool_if:nTF{##5}
+ {
+ \gappto{\CcoolHook}
+ {
+ \@@_make_ccool_sideeffect:nnn{##2}{##3}{##4}
+ }
+ }
+ {\c_empty_tl}
+ \IfValueT{##9}
+ {
+ \exp_not:n{ \Ccool[##9] }
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \section{\textsf{msg}}
+% \begin{macrocode}
+\msg_new:nnn {@@}
+{ iow }
+{#1~is~closed~can't~write}
+\msg_new:nnn {@@}
+{lang_and}
+{~key~#1~missing~for~global~option~'And';~falling~back~on~'english'}
+% \end{macrocode}
+% \section{\textsf{option}}
+% \begin{macro}{\@@_option_inner:n}
+% \begin{arguments}
+% \item \meta{code}
+% \end{arguments}
+% \begin{macrocode}
+\tl_new:N \g@@_option_inner_tl
+\cs_new_protected:Nn \@@_option_inner:n
+{
+ \tl_gset:Nn \g@@_option_inner_tl {#1}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_option_param:n}
+% \begin{arguments}
+% \item \meta{token list}
+% \end{arguments}
+% \begin{macrocode}
+\tl_new:N \g@@_option_param_tl
+\cs_new_protected:Nn \@@_option_param:n
+{
+ \tl_gset:Nn \g@@_option_param_tl{#1}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_option_outer:n}
+% \begin{arguments}
+% \item \meta{ inline code }
+% \end{arguments}
+% \begin{macrocode}
+\tl_new:N \g@@_option_outer_tl
+\cs_new_protected:Nn \@@_option_outer:n
+{
+ \tl_gset:Nn \g@@_option_outer_tl {#1}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_option_separ:n}
+% \begin{arguments}
+% \item \Arg{ tl_{1} }\Arg{ tl_{2} }\Arg{ tl_{3} }
+% \end{arguments}
+% \begin{macrocode}
+\tl_new:N \g@@_option_separ_tl
+\cs_new_protected:Nn \@@_option_separ:n
+{
+ \cs_gset:Npn \g@@_option_separ_tl {#1}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{variable}{\g@@_option_separ_tl}
+% \begin{macrocode}
+\ifcsdef{text}
+{
+ \tl_const:Nn \c@@_option_separ_default_tl
+ {
+ { \text{{\ }\@@_lang_and:{\ }} }
+ { \text{,{\ }} }
+ { \text{,{\ }\@@_lang_and:{\ }} }
+ }
+}
+{
+ \tl_const:Nn \c@@_option_separ_default_tl
+ {
+ { {\ }\@@_lang_and:{\ } }
+ { ,{\ } }
+ { ,{\ }\@@_lang_and:{\ } }
+ }
+}
+% \end{macrocode}
+% \end{variable}
+% \section{\textsf{prop}}
+% \begin{macro}{\@@_prop_append:NN}
+% \begin{arguments}
+% \item \meta{ prop_{1} }
+% \item \meta{ prop_{2} }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_prop_append:NN #1 #2
+{
+ \cs_set:Nn \@@_prop_append:nn
+ {
+ \prop_gput:Nnx #1 {##1}{ \prop_item:Nn #2{##1} }
+ }
+ \prop_map_function:NN #2 \@@_prop_append:nn
+}
+\cs_generate_variant:Nn \@@_prop_append:NN { cN }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_append:Nn}
+% \begin{arguments}
+% \item \meta{ prop }
+% \item \meta{ tl var name }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_prop_append:Nn
+{
+ \@@_prop_append:cN{ \@@_prop_name:n {#2} } #1
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_clear_new:n}
+% \begin{arguments}
+% \item \meta{ tl var name }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_prop_clear_new:n
+{
+ \exp_args:No \prop_clear_new:c{ \@@_prop_name:n {#1} }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_clear_new_map:n}
+% \begin{arguments}
+% \item \meta{ keyval list }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_prop_clear_new_map:n
+{
+ \seq_set_from_clist:Nn \g@@_aux_key_seq {#1}
+ \seq_map_function:NN \g@@_aux_key_seq \@@_prop_clear_new:n
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_if_exist:nTF}
+% \begin{arguments}
+% \item \meta{tl_{1}}
+% \item \meta{tl_{2}}
+% \item \meta{tl_{3}}
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Nn \@@_prop_if_exist:nTF
+{
+ \prop_if_exist:cTF{ \@@_prop_name:n {#1} }{#2}{#3}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_item:nn}
+% \begin{arguments}
+% \item \meta{ tl var name }
+% \item \meta{ key }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Nn \@@_prop_item:nn
+{
+ \prop_item:cn { \@@_prop_name:n {#1} } {#2}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_name:n}
+% \begin{arguments}
+% \item \meta{ tl var name }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Npn \@@_prop_name:n #1{ @@_#1 }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_new:n}
+% \begin{arguments}
+% \item \meta{ tl var name }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_prop_new:n
+{
+ \prop_new:c{ \@@_prop_name:n {#1} }
+}
+% \end{macrocode}
+% \end{macro}
+% \section{\textsf{seq}}
+% \begin{macro}{\@@_seq_from_prop:NNn}
+% \begin{arguments}
+% \item \meta{ seq_{1} }
+% \item \meta{ seq_{2} } (keys)
+% \item \meta{ prop }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_seq_from_prop:NNn
+{
+ \cs_set_protected:Nn \@@_seq_from_prop:n
+ {
+ \seq_gput_right:No #1 { \prop_item:cn{#3}{##1} }
+ }
+ \seq_map_function:NN #2 \@@_seq_from_prop:n
+}
+% \end{macrocode}
+% \end{macro}
+% \section{Front-end}\label{impl:frontend}
+% \DocPhantomSection*{subsection}{\cs{CcoolClear}}{impl:cs:clear}
+% \begin{macro}{\CcoolClear}
+% \begin{macrocode}
+\NewDocumentCommand{ \CcoolClear }
+{ D<>{\g@@_option_param_tl} }
+{
+ \@@_prop_clear_new_map:n{#1}
+}
+% \end{macrocode}
+% \end{macro}
+% \DocPhantomSection*{subsection}{\cs{CcoolHook}}{impl:cs:hook}
+% \begin{macro}{\CcoolHook}
+% \begin{macrocode}
+\NewDocumentCommand{\CcoolHook}{}{\c_empty_tl}
+% \end{macrocode}
+% \end{macro}
+% \DocPhantomSection*{subsection}{\cs{CcoolLambda}}{impl:cs:lambda}
+% \begin{macro}{\CcoolLambda}
+% \NB{todo}{allow only m- or o-type arguments}
+% \begin{macrocode}
+\ProvideDocumentCommand \CcoolLambda { O{m} m }
+{
+ \erw_lambda:nnn \DeclareDocumentCommand { #1 } { #2 }
+}
+% \end{macrocode}
+% \end{macro}
+% \DocPhantomSection*{subsection}{\cs{CcoolOption}}{impl:cs:option}
+% \begin{macro}{\CcoolOption}
+% \NB{todo}{Fix placeholders passed to options requiring code (only one pound sign)}
+% \NB{abandon}{Requirement: write to file if Write; Update: redundant with \cs{Ccool}+Write}
+% \begin{macrocode}
+\NewDocumentCommand{ \CcoolOption }
+{ O{ And, Expans, File, Inner, Param, Outer, Separ, Write } }
+{
+ \keys_set:nn{ @@ }{#1}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\keys_define:nn { @@ }
+{
+% \end{macrocode}
+% \DocPhantomSection*{subsubsection}{\pkgoptan}{impl:opt:an}
+% \DescribeOption{\pkgoptan}
+% \begin{macrocode}
+And .code:n = { \@@_lang_and_update:e{ #1 } },
+And .default:n = { \c@@_lang_and_tl },
+And .initial:n = { \c@@_lang_and_tl },
+% \end{macrocode}
+% \DocPhantomSection*{subsubsection}{\pkgoptex}{impl:opt:ex}
+% \DescribeOption{\pkgoptex}
+% \begin{macrocode}
+Expans .multichoices:nn = { eo, ee, ex, xo, xe, xx }
+{ \tl_gset_eq:NN \g@@_option_expans_tl \l_keys_choice_tl },
+Expans .default:n = { xo },
+Expans .initial:n = { xo },
+% \end{macrocode}
+% \DocPhantomSection*{subsubsection}{\pkgoptfi}{impl:opt:fi}
+% \DescribeOption{\pkgoptfi}
+% \begin{macrocode}
+File .code:n = {
+ \tl_gset:Nx \g@@_log_file_tl{#1}
+},
+File .default:n = { \erw_sys_jobnametimestamp: },
+File .initial:n = { \erw_sys_jobnametimestamp: },
+% \end{macrocode}
+% \DocPhantomSection*{subsubsection}{\pkgoptin}{impl:opt:in}
+% \DescribeOption{\pkgoptin}
+% \begin{macrocode}
+Inner .code:n={
+ \@@_option_inner:n{#1}
+ \exp_last_unbraced:Nf
+ \@@_make_ccool:nnnn
+ {
+ { \g@@_option_param_tl }
+ { \g@@_option_inner_tl }
+ { \g@@_option_separ_tl }
+ { \g@@_option_outer_tl }
+ }
+},
+Inner .value_required:n = false,
+Inner .default:n = {####1},
+Inner .initial:n = {####1},
+% \end{macrocode}
+% \DocPhantomSection*{subsubsection}{\pkgoptpa}{impl:opt:pa}
+% \DescribeOption{\pkgoptpa}
+% \begin{macrocode}
+Param .code:n={
+ \@@_option_param:n{#1}
+ \exp_last_unbraced:Nf
+ \@@_make_ccool:nnnn
+ {
+ { \g@@_option_param_tl }
+ { \g@@_option_inner_tl }
+ { \g@@_option_separ_tl }
+ { \g@@_option_outer_tl }
+ }
+},
+Param .value_required:n = false,
+Param .default:n = { Default },
+Param .initial:n = { Default },
+% \end{macrocode}
+% \DocPhantomSection*{subsubsection}{\pkgoptou}{impl:opt:ou}
+% \DescribeOption{\pkgoptou}
+% \begin{macrocode}
+Outer .code:n={
+ \@@_option_outer:n{#1}
+ \exp_last_unbraced:Nf
+ \@@_make_ccool:nnnn
+ {
+ { \g@@_option_param_tl }
+ { \g@@_option_inner_tl }
+ { \g@@_option_separ_tl }
+ { \g@@_option_outer_tl }
+ }
+},
+Outer .value_required:n = false,
+Outer .default:n = { \ensuremath{####1} },
+Outer .initial:n = { \ensuremath{####1} },
+% \end{macrocode}
+% \DocPhantomSection*{subsubsection}{\pkgoptse}{impl:opt:se}
+% \DescribeOption{\pkgoptse}
+% \begin{macrocode}
+Separ .code:n={
+ \@@_option_separ:n{#1}
+ \exp_last_unbraced:Nf
+ \@@_make_ccool:nnnn
+ {
+ { \g@@_option_param_tl }
+ { \g@@_option_inner_tl }
+ { \g@@_option_separ_tl }
+ { \g@@_option_outer_tl }
+ }
+},
+Separ .value_required:n = false,
+Separ .default:n = { \c@@_option_separ_default_tl },
+Separ .initial:n = { \c@@_option_separ_default_tl },
+% \end{macrocode}
+% \DocPhantomSection*{subsubsection}{\pkgoptwr}{impl:opt:wr}
+% \DescribeOption{\pkgoptwr}
+% \begin{macrocode}
+Write .code:n = {
+ \bool_if:nTF{#1}
+ {\@@_log_open:}
+ {\@@_log_close:}
+},
+Write .value_required:n = false,
+Write .default:n = \BooleanFalse,
+Write .initial:n = \BooleanFalse
+% \end{macrocode}
+% \begin{macrocode}
+}
+% \end{macrocode}
+% \DocPhantomSection*{subsection}{\cs{CcoolRead}}{impl:cs:read}
+% \begin{macro}{\CcoolRead}
+% \begin{macrocode}
+\NewDocumentCommand{\CcoolRead}
+{o}
+{
+ \IfValueTF{#1}
+ {\@@_log_read:e{#1}}
+ {\@@_log_read:}
+}
+% \end{macrocode}
+% \end{macro}
+% \DocPhantomSection*{subsection}{\cs{CcoolVers}}{impl:cs:vers}
+% \begin{macro}{\CcoolVers}
+% \begin{macrocode}
+\NewDocumentCommand{\CcoolVers}
+{}
+{\use:c{ver@ccool.sty}}
+% \end{macrocode}
+% \end{macro}
+% \section{Closing}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+%</package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+% \Finale
+\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/cellprops/cellprops.dtx b/Master/texmf-dist/source/latex/cellprops/cellprops.dtx
index 67b4dc8cd2f..264361e91e4 100644
--- a/Master/texmf-dist/source/latex/cellprops/cellprops.dtx
+++ b/Master/texmf-dist/source/latex/cellprops/cellprops.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
% vim: tw=80 spl=en
%
-%% File: cellprops.dtx (C) Copyright 2016-2019 RIVAUD Julien
+%% File: cellprops.dtx (C) Copyright 2016-2021 RIVAUD Julien
%%
%% It may be distributed and/or modified under the conditions of the
%% General Public License (GPL), either version 3 of this
@@ -14,8 +14,8 @@
\RequirePackage{expl3}[2018/06/19]
\def\ExplFileName{cellprops}
\def\ExplFileDescription{CSS-like cell and table properties}
-\def\ExplFileDate{2019/09/29}
-\def\ExplFileVersion{1.6}
+\def\ExplFileDate{2021/01/30}
+\def\ExplFileVersion{2.0}
%</driver|package>
%<*driver>
\documentclass[full]{l3doc}
@@ -66,13 +66,13 @@
%
% I recommend to add globally:
%\begin{verbatim}
-%\cellprops{ td { padding: 1ex; min-height: 0pt; min-depth: 0pt; } }
+% \cellprops{ td { padding: 1ex; min-height: 0pt; min-depth: 0pt; } }
%\end{verbatim}
% so that you get better-looking tables by default.
%
% \subsection{Examples}
%
-% To produce:
+% To produce the (arguably ugly):
% \[
% \cellprops{
% td {
@@ -102,6 +102,15 @@
% math-mode: text;
% text-align: left;
% }
+% tr:nth-child(6) td:nth-child(1) {
+% vertical-align: top; % see remark in usage guide
+% }
+% tr:nth-child(6) td:nth-child(2) {
+% vertical-align: middle;
+% }
+% tr:nth-child(6) td:nth-child(3) {
+% vertical-align: bottom; % see remark in usage guide
+% }
% }
% \begin{array}{nnnp{5em}}
% This is text & A_2 & A_3 & A_4 \\
@@ -109,6 +118,16 @@
% C1 & C_2 & X & Y \\
% D1 & D_2 & DX & v \\
% & F & \int_a^b f(t) dt & v \\
+% \fbox{Top} & \fbox{Middle} & \fbox{Bottom} & \fbox{Baseline}%
+% \textcolor{red}{%
+% \kern -9cm\relax
+% \vrule height 0.1pt depth 0.1pt width 10cm
+% \kern -1cm\relax
+% }\textcolor{blue}{%
+% \kern -9cm\relax
+% \vrule height 0.52ex depth -0.48ex width 10cm
+% \kern -1cm\relax
+% } \\
% \end{array}
% \]
% you can use:
@@ -142,13 +161,32 @@
% math-mode: text;
% text-align: left;
% }
+% tr:nth-child(6) td:nth-child(1) {
+% vertical-align: top; % see remark in usage guide
+% }
+% tr:nth-child(6) td:nth-child(2) {
+% vertical-align: middle;
+% }
+% tr:nth-child(6) td:nth-child(3) {
+% vertical-align: bottom; % see remark in usage guide
+% }
% }
-% \begin{array}{nnnn}
+% \begin{array}{nnnp{5em}}
% This is text & A_2 & A_3 & A_4 \\
% B1 & This is maths & B_3 & \\
% C1 & C_2 & X & Y \\
% D1 & D_2 & DX & v \\
-% E & F & \int_a^b f(t) dt & v \\
+% & F & \int_a^b f(t) dt & v \\
+% \fbox{Top} & \fbox{Middle} & \fbox{Bottom} & \fbox{Baseline}%
+% \textcolor{red}{%
+% \kern -9cm\relax
+% \vrule height 0.1pt depth 0.1pt width 10cm
+% \kern -1cm\relax
+% }\textcolor{blue}{%
+% \kern -9cm\relax
+% \vrule height 0.52ex depth -0.48ex width 10cm
+% \kern -1cm\relax
+% } \\
% \end{array}
% \]
%\end{verbatim}
@@ -159,6 +197,8 @@
%
%\cellprops{
% td { border: thin solid black; }
+% tr:nth-child(-n+3) { background-color: black!10; }
+% tr:nth-child(n+8) { background-color: blue!10; }
% tr:nth-child(4n) td:first-child,
% tr:nth-child(4n+1) td:nth-child(2),
% tr:nth-child(4n+2) td:nth-child(3),
@@ -198,20 +238,22 @@
%
% This table has been produced by:
%\begin{verbatim}
-%\cellprops{
+% \cellprops{
% td { border: thin solid black; }
+% tr:nth-child(-n+3) { background-color: black!10; }
+% tr:nth-child(n+8) { background-color: blue!10; }
% tr:nth-child(4n) td:first-child,
% tr:nth-child(4n+1) td:nth-child(2),
% tr:nth-child(4n+2) td:nth-child(3),
% tr:nth-child(4n+3) td:nth-child(4) {
% border: thick solid red;
% }
-%}
-%\begin{longtable}{nnnn}
+% }
+% \begin{longtable}{nnnn}
% aaaaa & baaaa & caaaaa & dbbbb \\
% ...
% aaaaa & baaaa & caaaaa & dbbbb \\
-%\end{longtable}
+% \end{longtable}
%\end{verbatim}
%
% \subsection{Usage guide}
@@ -225,15 +267,16 @@
% ]
% \item[usage] "'\cellprops{'" [ \<selectors> "'{'" \<properties> "'}'" ]* "'}'"
% \item[selectors] \<selector> ["," \<selectors> ]
-% \item[selector] [\<environment> "' '"] \<element1>
-% \item[element1]
-% "'table'" \OR
-% "'tr'"[\<pseudo-class>] ["' '" \<element2>] \OR
-% \<element2>
-% \item[element2] "'td'"[\<pseudo-class>] ["' '" \<parbox>] \OR \<parbox>
-% \item[parbox] "'p'"
-% \item[pseudo-class] "':nth-child('"\<nth>"')"
-% \item[nth] \<number> \OR "'odd'" \OR "'even'" \OR \<number>"'n+'"\<number>
+% \item[selector] [\<table> "' '"] [\<tr> "' '"] [\<td> "' '"] [\<parbox>]
+% \item[table] "'table'" ["'.'" \<class>]* ["':where(.'"\<class>"')'"]*
+% \OR "':where('"\<table>"')'"
+% \item[tr] "'tr'" [\<pseudoclass>]* \OR "':where('"\<tr>"')'"
+% \item[td] "'td'" [\<pseudoclass>]* \OR "':where('"\<td>"')'"
+% \item[parbox] "'p'" \OR "':where('"\<p>"')'"
+% \item[pseudoclass] "':where('"[\<pseudoclass>]*"')'" \OR "':nth-child('"\<nth>"')"
+% \item[nth]
+% "'odd'" \OR "'even'" \OR \<number> \OR
+% \<number>"'n+'"\<number> \OR \<number>"'n-'"\<number>
% \item[properties] [ \<property> "';'" ]*
% \item[property]
% "'padding: '" ( \<dimension> ) \{1,4\} \OR \\
@@ -245,6 +288,7 @@
% "'min-depth: '" \<dimension> \OR \\
% "'min-width: '" \<dimension> \OR \\
% "'text-align: '" ( "'left'" \OR "'right'" \OR "'center'" ) \OR \\
+% "'vertical-align: '" ( "'top'" \OR "'middle'" \OR "'baseline'" \OR "'bottom'" ) \OR \\
% "'math-mode: '" ( "'text'" \OR "'math'" \OR "'auto'" ) \OR \\
% "'color: '" \<color> \OR \\
% "'background-color: '" ( \<color> \OR "'transparent'" ) \OR \\
@@ -312,16 +356,36 @@
% "td:nth-child()" to select a column. Currently, cells spanning several
% columns actually increase the child count by the number of column they
% span, so that nth-child can still be used to select columns.
-% This is not consistent with the CSS specification.
-% \item Any ":nth-child("$A$"n+"$B$")" or ":nth-child("$A$"n)"
-% or ":nth-child("$B$")" is supported, with arbitrary $A$~and~$B$. The
-% performance will slowly degrade the more different~$A$ are active
-% (but if in a \TeX\ group, they will become inactive again when leaving
-% the group). \emph{A big difference} with the CSS specification is that
-% currently $n$ is not enforced non-negative. In particular
-% ":nth-child(2n+8)" \emph{will} match for the second element. This also
-% prevents tricks like ":nth-child(-n+3)". I am investigating how to
-% handle those without slowing down the general case.
+% This is not consistent with the HTML specification of tables, but acts
+% as if a cell spanning multiple columns was implicitly creating
+% "display: none" empty cell siblings following it.
+% \item Any ":nth-child("$A$"n+"$B$")" or ":nth-child("$A$"n)" or
+% ":nth-child("$B$")" is supported, with arbitrary $A$~and~$B$, including
+% nothing for~$A$ (standing for~$A = 1$) or just a minus sign (standing
+% for~$A = -1$).
+% \item "vertical-align" values "baseline" and "middle" are following the CSS
+% specification. On the other hand, "top" (resp.~"bottom") align the top
+% (resp.~bottom) of the cell with the row baseline which gives a
+% different result than CSS if there is mixed alignment in the row.
+% The common case where all cells have "vertical-align: top" or
+% "vertical-align: bottom" behaves as expected from the CSS
+% specification.
+%
+% As fas as I can tell, obeying CSS in all cases would require
+% typesetting each row in two passes.
+% \item Class names are matched against the classes defined with
+% \cs{cellpropsclass}, which takes a space-separated list of classes. By
+% default, \cs{cellpropsclass} also add as a class the name of the
+% environment that created the tabular-like structure (that is, "tabular"
+% or "array" or "matrix" or similar). If you do not want that behavior,
+% you can use \cs{cellpropsclass*}. The class list is
+% redefined locally, and \pkg{cellprops} initially calls
+% "\cellpropsclass{}".
+% \item The ":where()" pseudo-class is the same as in CSS selectors level 4,
+% except that it does not accept spaces nor commas. Its only effect is to
+% neutering the specificity of the selectors within while still keeping
+% their matching conditions. This is mainly useful to write default yet
+% specific rules whose specificity would otherwise dwarf simple rules.
% \end{itemize}
%
% \subsection{Compatibility}
@@ -338,8 +402,7 @@
%
% Add a test suite with compatibility tests. Improve
% the documentation, and test more \LaTeX\ table constructs and preamble column
-% types. Enforce $n\ge0$ in ":nth-child" selectors to match the CSS
-% specification.
+% types.
%
% \end{documentation}
%
@@ -452,6 +515,12 @@
%
% \end{macro}
%
+% \begin{macro}{\@@_parse_properties:nn}
+% Now we can parse the block of properties for a given selector. The first
+% argument is the token list variable which will ultimately hold the expanded
+% code setting internal variables from the properties. That code will be
+% called when recalling the computed values in a specific context.
+%
% \begin{macrocode}
\cs_new_protected:Nn \@@_parse_properties:Nn {
\tl_clear:N #1
@@ -459,25 +528,34 @@
\seq_map_inline:Nn \l_tmpa_seq {
\tl_if_empty:nF {##1} {
\exp_args:NNV \seq_set_split:Nnn \l_tmpb_seq \c_colon_str {##1}
- \int_compare:nNnTF {\seq_count:N \l_tmpb_seq} = { 2 } {
+ \int_compare:nNnT {\seq_count:N \l_tmpb_seq} = { 2 } {
\seq_get_left:NN \l_tmpb_seq \l_tmpa_tl
\exp_args:NNV \str_set:Nn \l_tmpa_str \l_tmpa_tl
\seq_get_right:NN \l_tmpb_seq \l_tmpa_tl
- \cs_if_exist:cTF { _@@_property_type_\l_tmpa_str :nn } {
+ \cs_if_exist:cT { _@@_property_type_\l_tmpa_str :nn } {
\tl_put_right:Nx #1 {
\exp_args:NVV \@@_delegate_setter:nn
\l_tmpa_str \l_tmpa_tl
}
- }{
- % TODO: ERROR-no property with that name
}
- }{
- % TODO: ERROR-too many : or none at all
}
}
}
}
-
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Defining new properties}
+%
+% \subsubsection{Some helpers}
+%
+% \begin{macro}{\@@_fourval_setter:nnnnnn}
+% \begin{macro}{\@@_define_fourval_properties:nnnnnn}
+% We first define helpers to parse and define compound properties like
+% "padding" where you can give one to four different values and the missing
+% values are copied from the given ones.
+%
+% \begin{macrocode}
\cs_new:Nn \@@_fourval_setter:nnnnnn {
\@@_fourval_setter_aux:w
{#1}{#2}{#3}{#4}#6~{\q_no_value}~{\q_no_value}~{\q_no_value}~\q_stop
@@ -510,7 +588,14 @@
#2
}
}
-
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_color_setter:nn}
+% This macro is used to parse color definitions, either named, rgb, or hsl.
+%
+% \begin{macrocode}
\tl_const:Nn \c_@@_inherit_color_tl { \q_nil }
\cs_new_nopar:Nn \@@_color_setter:nn {
@@ -533,6 +618,13 @@
}
}
}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_bgcolor_setter:nn}
+% For background colors, we support "transparent" as an alias for "inherit".
+%
+% \begin{macrocode}
\cs_new_nopar:Nn \@@_bgcolor_setter:nn {
\str_if_eq:nnTF {#2} {transparent} {
\@@_color_setter:nn {#1} {inherit}
@@ -540,7 +632,13 @@
\@@_color_setter:nn {#1} {#2}
}
}
-
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_linewidth_setter:nn}
+% A setter for line widths that supports common keywords:
+%
+% \begin{macrocode}
\cs_new_nopar:Nn \@@_linewidth_setter:nn {
\str_case:nnF {#2} {
{thin} { \@@_generic_setter:nnn \exp_not:n {#1} { \fboxrule} }
@@ -550,7 +648,16 @@
\@@_generic_setter:nnn \exp_not:n {#1} {#2}
}
}
-
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_border_setter:nn }
+% "border" and "border-"<side> are compound properties that can define the
+% width, the style and the color. As per the specification, the "border"
+% property always sets all four sides at the same time instead of being a
+% four-valued property.
+%
+% \begin{macrocode}
\cs_new_nopar:Nn \@@_border_setter:nn {
\@@_border_setter_aux:nw
{#1}#2~{\q_no_value}~{\q_no_value}~\q_stop
@@ -567,7 +674,7 @@
}
}{
\quark_if_no_value:nTF {#3} {
- %% TODO: Error, one no-style value, ambiguous
+ %% One no-style value, ambiguous. Ignore the property
}{
\@@_border_setter_isstyle:nTF {#3} {
\@@_delegate_setter:nn {#1-width} {#2}
@@ -586,13 +693,22 @@
\@@_delegate_setter:nn {#1-color} {#4}
}
}
+
\cs_new:Npn \@@_border_setter_isstyle:nTF #1 {
\str_case:nnTF {#1} {
{none}{} {hidden}{} {dotted}{} {dashed}{} {solid}{}
{double}{} {groove}{} {ridge}{} {inset}{} {outset}{}
}
}
-
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Actual definitions of properties}
+%
+% First some simple-valued properties where we just store the value
+% unexpanded.
+%
+% \begin{macrocode}
\@@_define_properties:nn {
\@@_generic_setter:nnn \exp_not:n
}{
@@ -600,19 +716,33 @@
min-depth,
min-width,
}
-
+% \end{macrocode}
+%
+% "padding" is a compound property for "padding-"<side> which store their
+% value unexpanded.
+%
+% \begin{macrocode}
\@@_define_fourval_properties:nnnnnn
{ \@@_generic_setter:nnn \exp_not:n }
{padding}
{padding-top}{padding-right}{padding-bottom}{padding-left}
-
+% \end{macrocode}
+%
+% Simple-valued properties that store a str value.
+%
+% \begin{macrocode}
\@@_define_properties:nn {
\@@_generic_setter:nnn \tl_to_str:n
}{
text-align,
+ vertical-align,
math-mode,
}
-
+% \end{macrocode}
+%
+% Some simple-valued color properties, using the dedicated parser.
+%
+% \begin{macrocode}
\@@_define_properties:nn {
\@@_color_setter:nn
}{
@@ -624,167 +754,464 @@
}{
background-color,
}
-
+% \end{macrocode}
+%
+% A compound property whose individual sides use the linewidth setter for
+% keyword recognition.
+%
+% \begin{macrocode}
\@@_define_fourval_properties:nnnnnn
{ \@@_linewidth_setter:nn }
{border-width}
{border-top-width}{border-right-width}
{border-bottom-width}{border-left-width}
-
+% \end{macrocode}
+%
+% A compound property whose individual sides are str values. They could be
+% checked against the list of valid values, but any non-existing one will be
+% ignored anyway due to the way they are implemented.
+%
+% \begin{macrocode}
\@@_define_fourval_properties:nnnnnn
{ \@@_generic_setter:nnn \tl_to_str:n }
{border-style}
{border-top-style}{border-right-style}
{border-bottom-style}{border-left-style}
-
+% \end{macrocode}
+%
+% A compound property whose individual sides are colors.
+%
+% \begin{macrocode}
\@@_define_fourval_properties:nnnnnn
{ \@@_color_setter:nn }
{border-color}
{border-top-color}{border-right-color}
{border-bottom-color}{border-left-color}
-
+% \end{macrocode}
+%
+% The five border-specific compound properties are defined here.
+%
+% \begin{macrocode}
\@@_define_properties:nn {
\@@_border_setter:nn
}{
border, border-top, border-right, border-bottom, border-left
}
-
+% \end{macrocode}
+%
+% \subsection{Parsing a CSS stylesheet}
+%
+% \begin{macrocode}
\NewDocumentCommand \cellprops { m } {
\@@_parse_css:n {#1}
}
\cs_new_protected:Nn \@@_parse_css:n {
\@@_parse_css:w #1 \q_mark {\q_nil} \q_stop
+% \end{macrocode}
+%
+% Ensure the already seen specificities is in order without duplicates.
+%
+% \begin{macrocode}
+ \seq_remove_duplicates:N \l_@@_specificities_seq
+ \seq_sort:Nn \l_@@_specificities_seq {
+ \int_compare:nNnTF { ##1 } > { ##2 }
+ { \sort_return_swapped: }
+ { \sort_return_same: }
+ }
}
-
-\tl_new:N \l_@@_parse_tmp_tl
+% \end{macrocode}
+%
+% Grab the content up to the first opening brace. That content will be the
+% comma-separated selector list, and the braced content is a block of
+% properties. We can loop until there is no such block remaining.
+%
+% \begin{macrocode}
+\tl_new:N \l_@@_parse_properties_tl
\NewDocumentCommand \@@_parse_css:w { lmu{\q_stop} } {
\quark_if_nil:nF {#2} {
- \@@_parse_properties:Nn \l_@@_parse_tmp_tl {#2}
+ \@@_parse_properties:Nn \l_@@_parse_properties_tl {#2}
\clist_map_inline:nn {#1} {
- \@@_parse_css_addprops:nV {##1} \l_@@_parse_tmp_tl
+ \tl_if_empty:nF {##1} { \@@_parse_css_addprops:n {##1} }
}
\@@_parse_css:w #3 \q_stop
}
}
+% \end{macrocode}
+%
+% Some pseudo-classes generate conditional code for the properties to be
+% applied. Check if such code exists, and wrap the parsed property setters
+% in a \cs{bool_if:nT}.
+%
+% \begin{macrocode}
+\tl_new:N \l_@@_current_selector_tl
+\tl_new:N \l_@@_current_selector_check_tl
+\cs_new_protected:Nn \@@_parse_css_addprops:n {
+ \@@_parse_selector:n {#1}
+ \tl_if_empty:NF \l_@@_current_selector_tl {
+ \tl_set:Nx \l_tmpa_tl
+ { l_@@_property_group_\l_@@_current_selector_tl _tl }
+ \tl_if_exist:cF { \l_tmpa_tl } { \tl_clear:c { \l_tmpa_tl } }
+ \tl_if_empty:NTF \l_@@_current_selector_check_tl {
+ \tl_put_right:cV { \l_tmpa_tl } \l_@@_parse_properties_tl
+ }{
+ \tl_put_right:cx { \l_tmpa_tl } {
+ \exp_not:N \bool_if:nT {
+ \exp_not:V \l_@@_current_selector_check_tl
+ }{
+ \exp_not:V \l_@@_parse_properties_tl
+ }
+ }
+ }
+ }
+}
+% \end{macrocode}
+%
+% Here we parse a selector. These are naturally space-separated, but we first
+% need to detect and normalize constructs like ":nth-child(argument)". We
+% replace them by ":nth-child{argument}" where the braces will procect any
+% space that can legitimately occur within "argument".
+%
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_parse_selector_sanitize:n {
+ \exp_args:Nx \@@_parse_selector_sanitize_aux:n
+ { \tl_to_str:n{#1} }
+}
+\cs_new_protected:Nn \@@_parse_selector_sanitize_aux:n {
+ \cs_set:Npn \@@_parse_selector_sanitize:w ##1:#1(##2)##3\q_stop
+ {
+ \quark_if_nil:nTF {##3} {
+ ##1
+ }{
+ ##1:#1{##2}\@@_parse_selector_sanitize:w ##3\q_stop
+ }
+ }
+ \tl_set:Nx \l_@@_current_selector_tl {
+ \exp_last_unbraced:NV
+ \@@_parse_selector_sanitize:w
+ \l_@@_current_selector_tl
+ :#1()\q_nil\q_stop
+ }
+}
+% \end{macrocode}
+%
+% Now that we can sanitize pseudo-classes, parsing the selector is safe. The
+% constructs to protect are ":nth-child()" and ":where()" since other supported
+% pseudo-classes have no argument.
+%
+% \begin{macrocode}
+\seq_new:N \l_@@_current_selector_seq
+\seq_new:N \l_@@_pseudoclasses_seq
+\tl_new:N \l_@@_current_element_tl
+\tl_new:N \l_@@_current_tableclass_tl
+\int_new:N \l_@@_current_level_int
+\int_new:N \l_@@_current_specificity_int
+\seq_new:N \l_@@_specificities_seq
+\cs_new_protected:Nn \@@_parse_selector:n {
+ \tl_set:Nx \l_@@_current_selector_tl { \tl_to_str:n {#1} }
+% \end{macrocode}
+%
+% The sanitize code is more readable with Expl category colon, so replace it
+% now, instead of defining the method with expand or lccode tricks.
+%
+% \begin{macrocode}
+ \exp_args:NNV \tl_replace_all:Nnn
+ \l_@@_current_selector_tl \c_colon_str {:}
+ \@@_parse_selector_sanitize:n {nth-child}
+ \@@_parse_selector_sanitize:n {where}
+ \seq_set_split:NnV \l_@@_current_selector_seq {~} \l_@@_current_selector_tl
+ \tl_clear:N \l_@@_current_selector_tl
+ \tl_clear:N \l_@@_current_selector_check_tl
+ \tl_clear:N \l_@@_current_tableclass_tl
+ \int_set:Nn \l_@@_current_level_int {-1}
+ \int_zero:N \l_@@_current_specificity_int
+ \seq_map_inline:Nn \l_@@_current_selector_seq {
+ \tl_clear:N \l_@@_current_element_tl
+ \@@_parse_simple_selector:n {##1}
+ }
+% \end{macrocode}
+%
+% Remember the current selector as "<last element>~<specificity>".
+%
+% \begin{macrocode}
+ \tl_if_empty:NF \l_@@_current_element_tl {
+ \tl_if_empty:NF \l_@@_current_tableclass_tl {
+ \tl_set:Nx \l_@@_current_tableclass_tl {
+ l_@@_active_classes_\l_@@_current_tableclass_tl _bool
+ }
+ \bool_if_exist:cF { \l_@@_current_tableclass_tl } {
+ \bool_new:c { \l_@@_current_tableclass_tl }
+ }
+ \@@_add_check:x {
+ \exp_not:n { \bool_if_p:N }
+ {
+ \exp_not:c { \l_@@_current_tableclass_tl }
+ }
+ }
+ }
+ \tl_set:Nx \l_@@_current_selector_tl {
+ \exp_not:V \l_@@_current_element_tl
+ \exp_not:n {~}
+ \int_use:N \l_@@_current_specificity_int
+ }
+ \seq_put_right:Nx \l_@@_specificities_seq {
+ \int_use:N \l_@@_current_specificity_int
+ }
+ }
+}
+\tl_new:N \l_@@_maybe_element_tl
-\seq_new:N \l_@@_parse_selector_seq
-\tl_new:N \l_@@_parse_desc_tl
-
-\str_const:Nn \c_@@_parse_nthchild_str { :nth-child( }
-\prop_new:N \c_@@_parse_replace_prop
-\prop_put:Nnn \c_@@_parse_replace_prop { :first-child } { :nth-child(1) }
-
-\cs_new_protected:Nn \@@_parse_selector:Nn {
- \str_set:Nx \l_tmpa_str {#2}
+\cs_new_protected:Nn \@@_parse_simple_selector:n {
+% \end{macrocode}
+%
+% First we replace "." with ":." so that class selectors can be handled with
+% the same code as pseudo-classes. Then we split the current selector item on
+% ":" to get the base element and the pseudo-classes.
+%
+% \begin{macrocode}
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_replace_all:Nnn \l_tmpa_tl {.} {:.}
+ \seq_set_split:NnV \l_@@_pseudoclasses_seq {:} \l_tmpa_tl
+ \seq_pop_left:NN \l_@@_pseudoclasses_seq \l_@@_maybe_element_tl
+% \end{macrocode}
+%
+% Known type selectors increase the specificity by one.
+%
+% \begin{macrocode}
+ \str_case:VnTF \l_@@_maybe_element_tl {
+ { table } { \int_set:Nn \l_tmpa_int { 1 } }
+ { tr } { \int_set:Nn \l_tmpa_int { 2 } }
+ { td } { \int_set:Nn \l_tmpa_int { 3 } }
+ { p } { \int_set:Nn \l_tmpa_int { 4 } }
+ }{
+ \int_add:Nn \l_@@_current_specificity_int { 1 }
+ }{
% \end{macrocode}
%
-% Replace some aliases with their meaning:
+% An empty type selector is accepted to account for ":where()" pseudo-classes.
+% They will be handled in the loop below, but of course there should be a type
+% selector eventually. Map that case to a big positive next level so that we can
+% detect that and keep the current level as-is.
+%
+% Unknown type selectors are mapped to big negative levels
+% so that the descendant check will refuse them, unless we are at the very
+% first type selector in which case we map the deprecated environment
+% selector to a class selector.
%
% \begin{macrocode}
- \prop_map_inline:Nn \c_@@_parse_replace_prop {
- \use:x {
- \exp_not:n { \tl_replace_all:Nnn \l_tmpa_str }
- { \tl_to_str:n { ##1 } } { \tl_to_str:n { ##2 } }
+ \tl_if_empty:NTF \l_@@_maybe_element_tl {
+ \int_set:Nn \l_tmpa_int { 10 }
+ }{
+ \int_compare:nNnTF \l_@@_current_level_int = { -1 } {
+ \tl_set_eq:NN
+ \l_@@_current_tableclass_tl
+ \l_@@_maybe_element_tl
+ \tl_set:Nn \l_@@_maybe_element_tl { table }
+ \int_set:Nn \l_tmpa_int { 1 }
+ \int_add:Nn \l_@@_current_specificity_int { 11 }
+ }{
+ \int_set:Nn \l_tmpa_int { -10 }
+ }
}
}
% \end{macrocode}
%
-% Replace all spaces by \cs{q_stop} to defeat the space removal feature of
-% \cs{seq_set_split:Nnn}.
+% If no type selector has been found yet, record the one we may have found
+% now. Else, refuse to have two in the same selector.
%
% \begin{macrocode}
- \tl_replace_all:Nnn \l_tmpa_str {~} {\q_stop}
- \exp_args:NNVV
- \seq_set_split:Nnn \l_tmpa_seq \c_@@_parse_nthchild_str \l_tmpa_str
- \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
+ \tl_if_empty:NTF \l_@@_current_element_tl {
+ \tl_set_eq:NN \l_@@_current_element_tl \l_@@_maybe_element_tl
+ }{
+ \tl_if_empty:NF \l_@@_maybe_element_tl {
+ \int_set:Nn \l_tmpa_int { -10 }
+ }
+ }
% \end{macrocode}
%
-% And replace them back.
+% If the detected element is a descendent of the previous one, the selector
+% can match; count the element selector specificity and parse its
+% pseudo-classes. If not, the whole selector cannot match and we discard it
+% early.
%
% \begin{macrocode}
- \tl_replace_all:Nnn \l_tmpa_tl {\q_stop} {~}
- \seq_clear:N \l_@@_parse_selector_seq
- \seq_put_right:NV \l_@@_parse_selector_seq \l_tmpa_tl
- \seq_map_inline:Nn \l_tmpa_seq {
- \tl_set:Nn \l_tmpa_tl { ##1 }
+ \int_compare:nNnTF \l_tmpa_int > \l_@@_current_level_int {
+ \int_compare:nNnT \l_tmpa_int < 10 {
+ \int_set_eq:NN \l_@@_current_level_int \l_tmpa_int
+ }
+ \seq_map_inline:Nn \l_@@_pseudoclasses_seq {
+ \@@_parse_pseudoclass:w ##1{}\q_stop
+ }
+ }{
+ \tl_clear:N \l_@@_current_element_tl
+ }
% \end{macrocode}
%
-% And replace them back again.
+% At the end of the selector parsing, the current element should not be empty.
%
% \begin{macrocode}
- \tl_replace_all:Nnn \l_tmpa_tl {\q_stop} {~}
+ \tl_if_empty:NT \l_@@_current_element_tl {
+ \seq_map_break:
+ }
+}
% \end{macrocode}
%
-% Now replace the first closing parenthesis by \cs{q_stop}\cs{prg_do_nothing:}
-% to use \cs{q_stop} as a delimiter for \cs{seq_set_split:Nnn} and thus split
-% at most once. Note that here the space trimming feature is desired for the
-% left part, but not just at the right of the parenthesis, so
-% \cs{prg_do_nothing:} will act as a guard and will be removed afterwards.
+% The first argument is the complete pseudo-class up to the opening argument
+% brace (if any), and the second argument is the braced content (if any).
+% The third argument gobbles any trailing garbage.
+%
+% If the pseudo-class starts with a "." this is a class selector. Else, this
+% is an unknown pseudo-class and we reject the complete selector.
%
% \begin{macrocode}
- \tl_replace_once:Nnn \l_tmpa_tl { ) } { \q_stop\prg_do_nothing: }
- \seq_set_split:NnV \l_tmpa_seq { \q_stop } \l_tmpa_tl
- \seq_pop_right:NN \l_tmpa_seq \l_@@_parse_desc_tl
- \tl_replace_once:Nnn \l_@@_parse_desc_tl { \prg_do_nothing: } {}
- \seq_get_left:NNT \l_tmpa_seq \l_tmpa_tl {
- \exp_args:NNV \@@_parse_nth:Nn \l_tmpa_tl \l_tmpa_tl
- \tl_put_left:Nn \l_@@_parse_desc_tl { ) }
- \tl_put_left:NV \l_@@_parse_desc_tl \l_tmpa_tl
+\NewDocumentCommand \@@_parse_pseudoclass:w { lmu{\q_stop} } {
+ \str_case:nnF { #1 } {
+ {first-child} { \@@_parse_selector_nth:n {1} }
+ {nth-child} { \@@_parse_selector_nth:n {#2} }
+ {where} { \@@_parse_where:n {#2} }
+ }{
+ \str_if_eq:eeTF { \str_head:n { #1 } } {.} {
+ \tl_set:Nx \l_@@_current_tableclass_tl {
+ \str_tail:n { #1 }
+ }
+ \int_add:Nn \l_@@_current_specificity_int { 10 }
+ }{
+ \tl_clear:N \l_@@_current_element_tl
+ \seq_map_break:n { \seq_map_break: }
}
- \seq_put_right:NV \l_@@_parse_selector_seq \l_@@_parse_desc_tl
- }
- \tl_set:Nx #1 {
- \exp_args:NNV \seq_use:Nn
- \l_@@_parse_selector_seq \c_@@_parse_nthchild_str
}
}
\str_const:Nn \c_@@_parse_n_str {n}
-\seq_new:N \l_@@_used_nth_factors_seq
-\cs_new_protected:Nn \@@_parse_nth:Nn {
- \str_case:nnF {#2} {
+\int_new:N \l_@@_nth_coeff_int
+\int_new:N \l_@@_nth_offset_int
+\cs_new_protected:Nn \@@_parse_selector_nth:n {
+% \end{macrocode}
+%
+% Count the pseudo-class in the specificity.
+%
+% \begin{macrocode}
+ \int_add:Nn \l_@@_current_specificity_int { 10 }
+% \end{macrocode}
+%
+% Now parse the nth-child argument:
+%
+% \begin{macrocode}
+ \str_case:nnF {#1} {
{even} { \str_set:Nn \l_tmpa_str {2n} }
{odd} { \str_set:Nn \l_tmpa_str {2n+1} }
}{
- \str_set:Nn \l_tmpa_str {#2}
+ \str_set:Nn \l_tmpa_str {#1}
}
- \exp_args:NNVV
- \seq_set_split:Nnn \l_tmpa_seq \c_@@_parse_n_str \l_tmpa_str
+ \exp_args:NNV
+ \seq_set_split:NnV \l_tmpa_seq \c_@@_parse_n_str \l_tmpa_str
\seq_pop_right:NN \l_tmpa_seq \l_tmpa_tl
- \int_set:Nn \l_tmpb_int { 0\l_tmpa_tl }
+ \tl_if_empty:NTF \l_tmpa_tl {
+ \int_zero:N \l_@@_nth_offset_int
+ }{
+ \int_set:Nn \l_@@_nth_offset_int { \l_tmpa_tl }
+ }
\seq_get_left:NNTF \l_tmpa_seq \l_tmpa_tl {
- \int_set:Nn \l_tmpa_int { 0\l_tmpa_tl }
+ \tl_if_empty:NTF \l_tmpa_tl {
+ \int_set:Nn \l_@@_nth_coeff_int {1}
+ }{
+ \exp_args:NV \tl_if_eq:nnTF \l_tmpa_tl {-} {
+ \int_set:Nn \l_@@_nth_coeff_int {-1}
+ }{
+ \int_set:Nn \l_@@_nth_coeff_int { \l_tmpa_tl }
+ }
+ }
}{
- \int_zero:N \l_tmpa_int
+ \int_zero:N \l_@@_nth_coeff_int
+ }
+% \end{macrocode}
+%
+% At last, generate the condition code.
+%
+% \begin{macrocode}
+ \str_case:Vn \l_@@_current_element_tl {
+ {tr} { \@@_generate_check_nth:n {\g_@@_row_int} }
+ {td} { \@@_generate_check_nth:n {\g_@@_col_int} }
}
- \int_compare:nNnTF \l_tmpa_int = { 0 } {
- \tl_set:Nx #1 { \int_use:N \l_tmpb_int }
+}
+
+\cs_new_protected_nopar:Nn \@@_generate_check_nth:n {
+ \int_compare:nNnTF \l_@@_nth_coeff_int = { 0 } {
+ \@@_add_check:x {
+ \exp_not:n { \int_compare_p:nNn #1 = }
+ {
+ \exp_not:V \l_@@_nth_offset_int
+ }
+ }
}{
- \int_set:Nn \l_tmpb_int { \int_mod:nn {\l_tmpb_int} {\l_tmpa_int} }
- \tl_set:Nx #1 {
- \int_use:N \l_tmpa_int \exp_not:V \c_@@_parse_n_str
- + \int_use:N \l_tmpb_int }
- \seq_put_right:Nx
- \l_@@_used_nth_factors_seq { \int_use:N \l_tmpa_int }
+ \tl_set:Nx \l_tmpb_tl {
+ {
+ \exp_not:n { #1 - }
+ \exp_not:V \l_@@_nth_offset_int
+ }{
+ \exp_not:V \l_@@_nth_coeff_int
+ }
+ }
+ \@@_add_check:x {
+ \exp_not:N \bool_lazy_and_p:nn {
+ \exp_not:n { \int_compare_p:nNn 0 = }
+ {
+ \exp_not:N \int_mod:nn
+ \exp_not:V \l_tmpb_tl
+ }
+ }{
+ \exp_not:n { \int_compare_p:nNn 0 < }
+ {
+ \exp_not:N \int_div_truncate:nn
+ \exp_not:V \l_tmpb_tl
+ \exp_not:n { + 1 }
+ }
+ }
+ }
}
}
-\cs_new_protected:Npn \@@_parse_css_addprops:nV #1 #2 {
- \@@_parse_selector:Nn \l_tmpa_tl {#1}
- \tl_set:Nx \l_tmpa_tl { l_@@_property_group_\l_tmpa_tl _tl }
- \tl_if_exist:cF { \l_tmpa_tl } { \tl_clear:c { \l_tmpa_tl } }
- \tl_put_right:cV { \l_tmpa_tl } #2
+\cs_new_protected:Nn \@@_parse_where:n {
+ \use:x {
+ \exp_not:n {
+ \@@_parse_simple_selector:n { #1 }
+ \int_set:Nn \l_@@_current_specificity_int
+ }
+ {
+ \int_use:N \l_@@_current_specificity_int
+ }
+ }
}
-\cs_set_protected:Nn \@@_recall_properties:n {
- \tl_if_exist:cT { l_@@_property_group_#1_tl } {
- \tl_use:c { l_@@_property_group_#1_tl }
+\cs_new_protected:Nn \@@_add_check:n {
+ \tl_if_empty:NTF \l_@@_current_selector_check_tl {
+ \tl_set:Nn \l_@@_current_selector_check_tl { #1 }
+ }{
+ \tl_set:Nx \l_@@_current_selector_check_tl {
+ \exp_not:N \bool_lazy_and_p:nn {
+ \exp_not:V \l_@@_current_selector_check_tl
+ }{
+ \exp_not:n { #1 }
+ }
+ }
+ }
+}
+\cs_generate_variant:Nn \@@_add_check:n {x}
+
+\seq_new:N \l_@@_classes_seq
+\NewDocumentCommand \cellpropsclass { sm } {
+ \seq_set_split:Nnn \l_@@_classes_seq {~} { #2 }
+ \IfBooleanF {#1} {
+ \seq_put_right:Nn \l_@@_classes_seq { \@currenvir }
}
- \clist_map_inline:nn { \@currenvir } {
- \tl_if_exist:cT { l_@@_property_group_##1~#1_tl } {
- \tl_use:c { l_@@_property_group_##1~#1_tl }
+}
+\cellpropsclass{}
+
+\cs_set_protected:Nn \@@_recall_properties:n {
+ \seq_map_inline:Nn \l_@@_specificities_seq {
+ \tl_if_exist:cT { l_@@_property_group_#1~##1_tl } {
+ \tl_use:c { l_@@_property_group_#1~##1_tl }
}
}
}
@@ -795,22 +1222,23 @@
\ExplSyntaxOff
\cellprops{
- td {
+ :where(td) {
padding: 0pt \csname l_@@_colsep_dim\endcsname;
min-height: \csname l_@@_strut_ht_dim\endcsname;
min-depth: \csname l_@@_strut_dp_dim\endcsname;
min-width: 0pt;
text-align: left;
+ vertical-align: baseline;
math-mode: auto;
color: inherit;
background-color: transparent;
border: thin none inherit;
}
- tr {
+ :where(tr) {
color: inherit;
background-color: transparent;
}
- table {
+ :where(table) {
padding: 0pt; % No change at load time
color: inherit;
background-color: transparent;
@@ -837,7 +1265,8 @@
\tl_new:N \l_@@_color_tl
\tl_new:N \l_@@_bgcolor_tl
-% To count rows and columns
+\seq_new:N \l_@@_classes_at_start_seq
+
\cs_new_protected:Nn \@@_array_init: {
\tl_set:Nx \l_@@_restore_tl {
\bool_if:NTF \g_@@_inrow_bool {
@@ -856,6 +1285,23 @@
\exp_not:n { \tl_gset:Nn \g_@@_borders_tl }
{ \exp_not:V \g_@@_borders_tl }
}
+% \end{macrocode}
+%
+% Unset all previous active classes, and set current ones as active.
+%
+% \begin{macrocode}
+ \seq_map_inline:Nn \l_@@_classes_at_start_seq {
+ \bool_set_false:c { l_@@_active_classes_##1_bool }
+ }
+ \seq_set_eq:NN \l_@@_classes_at_start_seq \l_@@_classes_seq
+ \seq_map_inline:Nn \l_@@_classes_at_start_seq {
+ \bool_set_true:c { l_@@_active_classes_##1_bool }
+ }
+% \end{macrocode}
+%
+% To count rows and columns.
+%
+% \begin{macrocode}
\int_gzero:N \g_@@_row_int
\bool_gset_false:N \g_@@_inrow_bool
\tl_gclear:N \g_@@_borders_tl
@@ -887,7 +1333,6 @@
\dim_set_eq:NN \l_@@_tablepadding_bottom_dim \g_tmpb_dim
\tl_set_eq:NN \l_@@_color_tl \g_tmpa_tl
\tl_set_eq:NN \l_@@_bgcolor_tl \g_tmpb_tl
- \@@_recall_properties:n {tr}
\dim_set:Nn \l_@@_strut_ht_dim { \box_ht:N \@arstrutbox }
\dim_set:Nn \l_@@_strut_dp_dim { \box_dp:N \@arstrutbox }
\box_clear:N \@arstrutbox
@@ -897,13 +1342,46 @@
\hlx{s[\l_@@_tablepadding_top_dim]}
}
+\cs_new_protected_nopar:Nn \@@_maybe_startrow: {
+ \bool_if:NF \g_@@_inrow_bool {
+ \bool_gset_true:N \g_@@_inrow_bool
+ \int_gincr:N \g_@@_row_int
+ \int_gset_eq:NN \g_@@_col_int \c_one_int
+ \dim_gzero:N \g_@@_ht_dim
+ \dim_gzero:N \g_@@_dp_dim
+ }
+}
+
+\cs_new_protected_nopar:Nn \@@_maybe_endrow: {
+ \bool_if:NT \g_@@_inrow_bool {
+ \@@_every_cell_end:
+ \bool_gset_false:N \g_@@_inrow_bool
+ }
+}
+
+\cs_new_protected_nopar:Nn \@@_every_cell_end: {
+ \int_gincr:N \g_@@_col_int
+}
+
\cs_set_protected_nopar:Nn \@@_readpreamble:n {
\cs_set_eq:NN \tab@readpreamble \@@_orig_tab@readpreamble:n
- \tl_put_left:Nn \tab@multicol {\@@_startrow:}
- \tl_put_left:Nn \tab@tabtext {\int_gincr:N \g_@@_col_int}
+% \end{macrocode}
+%
+% \cs{tab@multicol} is inserted at the beginning of a each row, and by
+% \cs{multicolumn} after its \cs{omit}. We use it to ensure that the row is
+% initialized correctly however it starts (normally or with a
+% \cs{multicolumn}).
+%
+% \cs{tab@tabtext} is inserted at the end of every cell but the last one, so
+% we should ensure that its effect is applied at the end of the row;
+% \cs{@@_maybe_endrow} will take care of that.
+%
+% \begin{macrocode}
+ \tl_put_left:Nn \tab@multicol {\@@_maybe_startrow:}
+ \tl_put_left:Nn \tab@tabtext {\@@_every_cell_end:}
\tab@readpreamble{#1}
\exp_args:Nx \tab@preamble
- { \exp_not:N\@@_startrow: \the\tab@preamble \exp_not:N\@@_endrow: }
+ { \the\tab@preamble \exp_not:N\@@_maybe_endrow: }
}
% \end{macrocode}
%
@@ -976,24 +1454,8 @@
\@@_end_array:n { \@@_orig_endLT: }
}
-\cs_new_protected_nopar:Nn \@@_startrow: {
- \bool_if:NF \g_@@_inrow_bool {
- \bool_gset_true:N \g_@@_inrow_bool
- \int_gincr:N \g_@@_row_int
- \int_gset_eq:NN \g_@@_col_int \c_one_int
- \dim_gzero:N \g_@@_ht_dim
- \dim_gzero:N \g_@@_dp_dim
- }
-}
-
-\cs_new_protected_nopar:Nn \@@_endrow: {
- \bool_if:NT \g_@@_inrow_bool {
- \bool_gset_false:N \g_@@_inrow_bool
- }
-}
-
\cs_new_protected_nopar:Nn \@@_cr:n {
- \@@_endrow:
+ \@@_maybe_endrow:
\tl_if_empty:NF \g_@@_borders_tl {
\cr
\noalign{\nobreak}
@@ -1016,10 +1478,12 @@
\cs_set_eq:NN \@@_orig_multicolumn:w \multicolumn
\cs_set:Npn \multicolumn#1#2#3 {
- \@@_orig_multicolumn:w {#1}{#2}{
- #3
- \int_gadd:Nn \g_@@_col_int {#1}
+ \@@_orig_multicolumn:w {#1}{#2}{#3}
+ \int_gadd:Nn \g_@@_col_int {#1}
+ \tl_gput_right:Nx \g_@@_borders_tl {
+ \prg_replicate:nn {#1 - 1} {\span\omit}
}
+ \ignorespaces
}
}
@@ -1110,20 +1574,6 @@
\colpop
-% \end{macrocode}
-%
-% Handle various \verb|:nth-child()| forms.
-%
-% \begin{macrocode}
-\cs_new_protected_nopar:Nn \@@_seq_nthchild:Nn {
- \seq_clear:N #1
- \seq_map_inline:Nn \l_@@_used_nth_factors_seq {
- \seq_put_right:Nx #1 {
- ##1 n + \int_eval:n{\int_mod:nn{#2}{##1}}
- }
- }
- \seq_put_right:Nx #1 { \int_eval:n{#2} }
-}
\cs_new_protected_nopar:Nn \@@_begincell:n {
\@@_begin_raw_cell:n {
@@ -1162,25 +1612,7 @@
\global\@minipagefalse
\everypar{}
}
- \@@_seq_nthchild:Nn \l_tmpa_seq { \g_@@_row_int }
- \@@_seq_nthchild:Nn \l_tmpb_seq { \g_@@_col_int }
- \@@_recall_properties:n {td~p}
- \seq_map_inline:Nn \l_tmpa_seq {
- \@@_recall_properties:n {tr:nth-child(##1)~p}
- }
- \seq_map_inline:Nn \l_tmpb_seq {
- \@@_recall_properties:n {td:nth-child(##1)~p}
- }
- \@@_recall_properties:n {tr~td~p}
- \seq_map_inline:Nn \l_tmpa_seq {
- \@@_recall_properties:n {tr:nth-child(##1)~td~p}
- }
- \seq_map_inline:Nn \l_tmpa_seq {
- \seq_map_inline:Nn \l_tmpb_seq {
- \@@_recall_properties:n {tr:nth-child(##1)~
- td:nth-child(####1)~p}
- }
- }
+ \@@_recall_properties:n {p}
}
}
\cs_new_protected_nopar:Nn \@@_end_par_cell:n {
@@ -1195,26 +1627,9 @@
\cs_new_protected_nopar:Nn \@@_begin_raw_cell:n {
\group_begin:
- \@@_seq_nthchild:Nn \l_tmpa_seq { \g_@@_row_int }
- \@@_seq_nthchild:Nn \l_tmpb_seq { \g_@@_col_int }
- \seq_map_inline:Nn \l_tmpa_seq {
- \@@_recall_properties:n {tr:nth-child(##1)}
- }
+ \@@_recall_properties:n {tr}
\@@_update_colors:
\@@_recall_properties:n {td}
- \@@_recall_properties:n {tr~td}
- \seq_map_inline:Nn \l_tmpb_seq {
- \@@_recall_properties:n {td:nth-child(##1)}
- }
- \seq_map_inline:Nn \l_tmpa_seq {
- \@@_recall_properties:n {tr:nth-child(##1)~td}
- }
- \seq_map_inline:Nn \l_tmpa_seq {
- \seq_map_inline:Nn \l_tmpb_seq {
- \@@_recall_properties:n {tr:nth-child(##1)~
- td:nth-child(####1)}
- }
- }
\@@_update_colors:
% Additional init code
#1
@@ -1302,12 +1717,50 @@
\tl_if_empty:NF \g_@@_borders_tl { \exp_not:n {&} }
\exp_not:n { \omit \kern \c_zero_dim }
}
- % Handle padding-top, min-height and border-top
- \@@_get_border_info:n {top}
+ % Handle min-height, min-depth and vertical-align
+ % wrong values are treated as |baseline|.
\box_set_ht:Nn \l_@@_cell_box {
\dim_max:nn
{\box_ht:N \l_@@_cell_box}
{\@@_get_property:n {min-height}}
+ }
+ \box_set_dp:Nn \l_@@_cell_box {
+ \dim_max:nn
+ {\box_dp:N \l_@@_cell_box}
+ {\@@_get_property:n {min-depth}}
+ }
+ \str_case_e:nn {\@@_get_property:n {vertical-align}} {
+ { top } {
+ \hbox_set:Nn \l_@@_cell_box {
+ \vbox_top:n {
+ \kern 0pt\relax
+ \box_use_drop:N \l_@@_cell_box
+ }
+ }
+ }
+ { bottom } {
+ \hbox_set:Nn \l_@@_cell_box {
+ \vbox:n {
+ \box_use_drop:N \l_@@_cell_box
+ \kern 0pt\relax
+ }
+ }
+ }
+ { middle } {
+ \hbox_set:Nn \l_@@_cell_box {
+ \dim_set:Nn \l_tmpa_dim {
+ (\box_dp:N \l_@@_cell_box
+ - \box_ht:N \l_@@_cell_box
+ + 1ex) / 2
+ }
+ \raisebox{\l_tmpa_dim}{\box_use_drop:N \l_@@_cell_box}
+ }
+ }
+ }
+ % Handle padding-top and border-top
+ \@@_get_border_info:n {top}
+ \box_set_ht:Nn \l_@@_cell_box {
+ \box_ht:N \l_@@_cell_box
+ (\@@_get_property:n {padding-top})
+ \l_@@_border_width_dim
}
@@ -1323,12 +1776,10 @@
{ \exp_not:V \l_@@_border_color_tl }
}
}
- % Handle padding-bottom, min-depth and border-bottom
+ % Handle padding-bottom and border-bottom
\@@_get_border_info:n {bottom}
\box_set_dp:Nn \l_@@_cell_box {
- \dim_max:nn
- {\box_dp:N \l_@@_cell_box}
- {\@@_get_property:n {min-depth}}
+ \box_dp:N \l_@@_cell_box
+ (\@@_get_property:n {padding-bottom})
+ \l_@@_border_width_dim
}
diff --git a/Master/texmf-dist/source/latex/cellprops/cellprops.ins b/Master/texmf-dist/source/latex/cellprops/cellprops.ins
index 195394a7e74..1b50038e33a 100644
--- a/Master/texmf-dist/source/latex/cellprops/cellprops.ins
+++ b/Master/texmf-dist/source/latex/cellprops/cellprops.ins
@@ -1,6 +1,6 @@
\iffalse meta-comment
-File cellprops.ins (C) Copyright 2016-2019 RIVAUD Julien
+File cellprops.ins (C) Copyright 2016-2021 RIVAUD Julien
It may be distributed and/or modified under the conditions of the
General Public License (GPL), either version 3 of this
diff --git a/Master/texmf-dist/source/latex/centerlastline/centerlastline.dtx b/Master/texmf-dist/source/latex/centerlastline/centerlastline.dtx
new file mode 100644
index 00000000000..b4efe915efb
--- /dev/null
+++ b/Master/texmf-dist/source/latex/centerlastline/centerlastline.dtx
@@ -0,0 +1,114 @@
+%% \CheckSum{11}
+% \iffalse
+% File: centerlastline.dtx
+% Copyright (C) 2020 Miguel V. S. Frasson (mvsfrasson@gmail.com)
+%
+% This package may be distributed under the terms of the LaTeX
+% Project Public License, as described in lppl.txt in the base
+% LaTeX distribution, either version 1.2 or (at your option)
+% any later version.
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{doc}
+\usepackage[T1]{fontenc}
+\usepackage{xcolor,lipsum,centerlastline,microtype}
+%\usepackage[margin=1.6in]{geometry}
+\begin{document}
+ \DocInput{centerlastline.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \StopEventually
+%
+% \changes{1.0}{2020/10/12}{Initial version}
+%
+% \MakeShortVerb+
+%
+% \title{\textsf{centerlastline}: last line centered}
+% \author{Miguel V.\ S.\ Frasson\\(\texttt{mvsfrasson@gmail.com})}
+% \date{2020, oct. 12}
+%
+% \maketitle
+%
+% This package provides command +\centerlastline+, which sets
+% paragraph style\footnote{Paragraph style like
+% \texttt{\string\centering}, \texttt{\string\raggedright} or
+% \texttt{\string\raggedleft}.} to typeset with no indentation and
+% last line centered, an arrangement known as \emph{spanish
+% paragraph}. It is a not-so-frequent composition, useful to finish a
+% large paragraph of text, at the end of chapters, prologues, back
+% cover of books, etc. It can be used as an environment
+% +centerlastline+.
+%
+% In command form +\centerlastline+, user must take care that the text
+% ends with a new paragraph (either a blank line or a +\par+), to
+% ensure that the paragraph style +\centerlastline+ is active at the
+% end of the paragraph. In environment form, this is automatic.
+%
+% Below an example of
+% such paragraph\ldots\bigskip
+%
+% \begin{centerlastline}
+% \color{blue}\lipsum[1]
+% \end{centerlastline}\bigskip
+%
+% \noindent \ldots{} produced with\bigskip
+%
+% \noindent
+% +\begin{centerlastline}+\\
+% + \color{blue}\lipsum[1]+\\
+% +\end{centerlastline}+\medskip
+%
+% \noindent or\medskip
+%
+% \noindent +{\centerlastline+\\+ \color{blue}\lipsum[1]\par}+
+%
+% \clearpage
+% \section*{Code}
+%
+% Identidication of the package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{centerlastline}[2020/10/12 v1.0 Last line centered (spanish par.)]
+% \end{macrocode}
+%
+% \DescribeMacro{\centerlastline}
+% Implementation of +\centerlastline+ based on +\centerlastline+ from
+% ``memoir'' class. Definition with +\providecommand+ to avoid error
+% if loaded with ``memoir'' class.
+% \begin{macrocode}
+\providecommand{\centerlastline}{%
+ \parindent=0pt
+ \leftskip=0pt plus 1fil
+ \rightskip=0pt plus -1fil
+ \parfillskip=0pt plus 2fil}
+% \end{macrocode}
+%
+% Ending enviromnment with +\par+ to ensure paragraph style keeps
+% effect until last paragraph.
+% \begin{macrocode}
+\def\endcenterlastline{\par}
+% \end{macrocode}
+% \Finale
+%
+\endinput
+%
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
diff --git a/Master/texmf-dist/source/latex/centerlastline/centerlastline.ins b/Master/texmf-dist/source/latex/centerlastline/centerlastline.ins
new file mode 100644
index 00000000000..a7a54673959
--- /dev/null
+++ b/Master/texmf-dist/source/latex/centerlastline/centerlastline.ins
@@ -0,0 +1,27 @@
+
+\input docstrip
+
+\preamble
+
+Copyright (C) 2020 Miguel V. S. Frasson (mvsfrasson@gmail.com)
+
+This file is part of the `centerlastline' package.
+
+This package may be distributed under the terms of the LaTeX
+Project Public License, as described in lppl.txt in the base
+LaTeX distribution, either version 1.2 or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+\endpreamble
+
+\askforoverwritefalse
+\askonceonly
+\showprogress
+
+\generate{\file{centerlastline.sty}{\from{centerlastline.dtx}{}}}
+
+\endbatchfile \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/changes/changes.drv b/Master/texmf-dist/source/latex/changes/changes.drv
index 0ca29f10a1d..22ee08eb908 100644
--- a/Master/texmf-dist/source/latex/changes/changes.drv
+++ b/Master/texmf-dist/source/latex/changes/changes.drv
@@ -137,16 +137,16 @@
\usepackage{changes}
\definechangesauthor[name={Ekkart Kleinod}, color=Sienna]{EK}
\setcommentmarkup{%
- \ifthenelse{\isColored}%
+ \IfIsColored%
{%
- \ifthenelse{\isAnonymous{#2}}%
+ \IfIsAnonymous{#2}%
{%
\todo[color=authorcolor!10, bordercolor=authorcolor, linecolor=authorcolor!70, nolist]{\footnotesize\textbf{[\arabic{authorcommentcount}]} #1}%
}{%
\todo[color=authorcolor!10, bordercolor=authorcolor, linecolor=authorcolor!70, nolist]{\footnotesize\textbf{[#3~\arabic{authorcommentcount}]} #1}%
}%
}{%
- \ifthenelse{\isAnonymous{#2}}%
+ \IfIsAnonymous{#2}%
{%
\todo[color=black!0, bordercolor=black, linecolor=black!70, nolist]{\footnotesize\textbf{[\arabic{authorcommentcount}]} #1}%
}{%
@@ -162,10 +162,9 @@
\CodelineIndex
% formatting
-\newcommand{\chpackage}[1]{\textsl{#1}}
-\newcommand{\choption}[1]{\texttt{#1}}
-\newcommand{\chfile}[1]{\texttt{#1}}
-\newcommand{\chcommand}[1]{\texttt{\textbackslash{}#1}}
+\newcommand{\docpackage}[1]{\textsl{#1}}
+\newcommand{\docoption}[1]{\texttt{#1}}
+\newcommand{\doccommand}[1]{\texttt{\textbackslash{}#1}}
% additional description list formatting
\newlength{\mylabelwidth}
@@ -194,7 +193,7 @@
]{#2}%
}
\newcommand{\chinline}[2][]{%
- \chinputlisting{#1}{userdoc/in_#2}%
+ \chinputlisting{#1}{userdoc/#2_in}%
}
\newcommand{\chexample}[1]{
\ifENGLISH
@@ -203,7 +202,7 @@
\ifGERMAN
\minisec{Beispiele}
\fi
- \lstinputlisting{userdoc/ex_#1}
+ \lstinputlisting{userdoc/#1_ex}
}
\newcommand{\chresult}[1]{
\ifENGLISH
@@ -213,7 +212,7 @@
\minisec{Resultat}
\fi
\begin{quote}
- \input{userdoc/ex_#1}
+ \input{userdoc/#1_ex}
\end{quote}
}
@@ -253,18 +252,18 @@
% new commands
\newcommand{\chnewcmd}[1]{
- \subsubsection{\chcommand{#1}}
+ \subsubsection{\doccommand{#1}}
\label{sec:ui:cmd:#1}
}
% document title
\ifENGLISH
- \title{The \chpackage{changes}-package}
- \subtitle{Manual change markup --- version 3.2.1}
+ \title{The \docpackage{changes}-package}
+ \subtitle{Manual change markup --- version 4.0.1}
\fi
\ifGERMAN
- \title{Das \chpackage{changes}-Paket}
- \subtitle{Manuelle Änderungsmarkierung -- Version 3.2.1}
+ \title{Das \docpackage{changes}-Paket}
+ \subtitle{Manuelle Änderungsmarkierung -- Version 4.0.1}
\fi
\author{Ekkart Kleinod}
diff --git a/Master/texmf-dist/source/latex/changes/changes.dtx b/Master/texmf-dist/source/latex/changes/changes.dtx
index 06042238585..c5f18a6d61e 100644
--- a/Master/texmf-dist/source/latex/changes/changes.dtx
+++ b/Master/texmf-dist/source/latex/changes/changes.dtx
@@ -1,8 +1,8 @@
-% \CheckSum{1509}
+% \CheckSum{1262}
%
% \iffalse meta-comment
%
-% Copyright (C) 2007-2019
+% Copyright (C) 2007-2021
% Ekkart Kleinod (ekleinod@edgesoft.de)
% --------------------------------------------------------------------------
%
@@ -61,6 +61,9 @@
% \changes{v3.1.3}{2019/07/21}{bugfix: option clash for ulem and truncate; documentation of known problems and solutions}
% \changes{v3.2.0}{2019/10/28}{Merge changes script (pyMergeChanges): Support nested brackets}
% \changes{v3.2.1}{2019/11/17}{removed obsolete package pdfcolmk}
+% \changes{v3.2.2}{2020/06/16}{Merge changes script (pyMergeChanges): Correctly handle multiple different macros in the same line}
+% \changes{v4.0.0}{2021/01/28}{new: convenience macros, setlocextension, option commandnameprefix, defaultcolor; removed: xifthen, remark}
+% \changes{v4.0.1}{2021/02/14}{bugfix: Command do undefined}
% \GetFileInfo{changes.dtx}
% \RecordChanges
%
@@ -101,45 +104,116 @@
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{changes}
-[2019/11/17 v3.2.1 changes package]
-\typeout{*** changes package 2019/11/17 v3.2.1 ***}
+[2021/02/14 v4.0.1 changes package]
+\typeout{*** changes package 2021/02/14 v4.0.1 ***}
% \end{macrocode}
%
-% Package \chpackage{xkeyval} provides options with key-value-pairs.
+% Package \docpackage{xkeyval} provides options with key-value-pairs.
% \begin{macrocode}
\RequirePackage{xkeyval}
% \end{macrocode}
%
-% Package \chpackage{xifthen} provides improved \texttt{if} as well as a \texttt{while}-loop.
+% Package \docpackage{etoolbox} provides improved \emph{if}, \emph{bools} as well as a \emph{list} operations.
+% todo
% \begin{macrocode}
-\RequirePackage{xifthen}
+\RequirePackage{etoolbox}
% \end{macrocode}
%
-% Package \chpackage{xstring} provides improved string test and handling methods.
+% Package \docpackage{xstring} provides improved string test and handling methods.
% \begin{macrocode}
\RequirePackage{xstring}
% \end{macrocode}
%
+% \begin{macro}{\IfIsInList}
+%
+% Helper macro: tests if one of the pipe separated values is in the second list of pipe separated values (boolean or).
+%
+% Corresponds to the if macros of \docpackage{etoolbox}, so it can be used in it's boolean tests.
+% Mainly the last two parameters are the results of \emph{true} and \emph{false} computation.
+%
+% Declare list parsers.
+% \begin{macrocode}
+\DeclareListParser{\dopsvlist}{|}
+\DeclareListParser*{\forpsvlist}{|}
+% \end{macrocode}
+%
+% A temporary list and flag.
+% \begin{macrocode}
+\newcommand{\Changes@tmplist}{}
+\newbool{Changes@inlist}
+% \end{macrocode}
+%
+% Fill list with values, then check if one of the values of the first list is in the second one.
+% \begin{macrocode}
+\newrobustcmd{\IfIsInList}[4]{%
+ \renewcommand{\Changes@tmplist}{}%
+% \end{macrocode}
+%
+% I could not get
+% \doccommand{forpsvlist}\{\doccommand{listadd}\doccommand{Changes@tmplist}\}\{\#2\}
+% to work if \#2 is a macro, so I used the code below.
+%
+% Thanks to Ulrike Fischer for the fix of the macro call of \doccommand{dopsvlist} with \doccommand{expandafter}.
+%
+% To make sure \doccommand{do} can be renewed, we define it first, some macros, such as \doccommand{chapter} undefine it.
+% \begin{macrocode}
+ \def\do{}%
+ \renewcommand*{\do}[1]{%
+ \listadd{\Changes@tmplist}{##1}%
+ }%
+ \expandafter\dopsvlist\expandafter{#2}%
+% \end{macrocode}
+% End fo the workaround for \doccommand{forpsvlist}.
+% \begin{macrocode}
+ \setbool{Changes@inlist}{false}%
+ \renewcommand*{\do}[1]{%
+ \ifinlist{##1}{\Changes@tmplist}%
+ {\setbool{Changes@inlist}{true}}%
+ {}%
+ }%
+ \expandafter\dopsvlist\expandafter{#1}%
+ \ifbool{Changes@inlist}%
+ {#3}%
+ {#4}%
+}
+% \end{macrocode}
+% \end{macro}
+%
% \subsubsection{Package options}
%
-% Option \choption{draft}, \emph{default} is \texttt{true}.
+% Option \docoption{draft}, \emph{default} is \emph{true}.
% \begin{macrocode}
-\newboolean{Changes@optiondraft}
-\setboolean{Changes@optiondraft}{true}
+\newbool{Changes@optiondraft}
+\setbool{Changes@optiondraft}{true}
\DeclareOptionX{draft}{
- \setboolean{Changes@optiondraft}{true}
+ \setbool{Changes@optiondraft}{true}
\typeout{changes-option '\CurrentOption'}
}
% \end{macrocode}
%
-% Option \choption{final}, sets \choption{draft} to \texttt{false}.
+% Option \docoption{final}, sets \docoption{draft} to \emph{false}.
% \begin{macrocode}
\DeclareOptionX{final}{
- \setboolean{Changes@optiondraft}{false}
+ \setbool{Changes@optiondraft}{false}
\typeout{changes-option '\CurrentOption'}
}
% \end{macrocode}
%
+% Declare storage for authormarkup option and store option value or set to default value \emph{superscript}.
+% \begin{macrocode}
+\newcommand{\Changes@optioncommandnameprefix}{none}
+\DeclareOptionX{commandnameprefix}{
+ \ifblank{#1}
+ {}
+ {
+ \IfIsInList{#1}{none|always|ifneeded}
+ {\renewcommand{\Changes@optioncommandnameprefix}{#1}}
+ {\PackageWarning{changes}{commandnameprefix '#1' unknown, using '\Changes@optioncommandnameprefix'}}
+ }
+ \typeout{changes-option 'commandnameprefix=\Changes@optioncommandnameprefix'}
+}
+% \end{macrocode}
+%
% Declare storage for markup options, they are set by the markup option but can be changed with the more special options, therefore they have to be declared at this place.
% Replacement markup is a combination of added and deleted markup, thus there is no special markup storage.
% \begin{macrocode}
@@ -149,40 +223,35 @@
\newcommand{\Changes@optioncommentmarkup}{todo}
% \end{macrocode}
%
-% Option \choption{markup}, sets markup options accordingly.
+% Option \docoption{markup}, sets markup options accordingly.
% \begin{macrocode}
\newcommand{\Changes@optionmarkup}{default}
\DeclareOptionX{markup}{
- \ifthenelse{\equal{\@empty}{#1}}
+ \ifblank{#1}
{}
{
- \ifthenelse{
- \equal{#1}{default}\or
- \equal{#1}{underlined}\or
- \equal{#1}{bfit}\or
- \equal{#1}{nocolor}
- }
+ \IfIsInList{#1}{bfit|default|nocolor|underlined}
{\renewcommand{\Changes@optionmarkup}{#1}}
{\PackageWarning{changes}{markup '#1' unknown, using '\Changes@optionmarkup'}}
}
- \ifthenelse{\equal{\Changes@optionmarkup}{default}}
+ \IfStrEq{\Changes@optionmarkup}{default}
{
- % nothing to do
+ % nothing to do, included for symmetry and potential later use
}
{}
- \ifthenelse{\equal{\Changes@optionmarkup}{underlined}}
+ \IfStrEq{\Changes@optionmarkup}{underlined}
{
\renewcommand{\Changes@optionaddedmarkup}{uline}
\renewcommand{\Changes@optionhighlightmarkup}{uwave}
}
{}
- \ifthenelse{\equal{\Changes@optionmarkup}{bfit}}
+ \IfStrEq{\Changes@optionmarkup}{bfit}
{
\renewcommand{\Changes@optionaddedmarkup}{bf}
\renewcommand{\Changes@optiondeletedmarkup}{it}
}
{}
- \ifthenelse{\equal{\Changes@optionmarkup}{nocolor}}
+ \IfStrEq{\Changes@optionmarkup}{nocolor}
{
\renewcommand{\Changes@optionaddedmarkup}{uline}
\renewcommand{\Changes@optionhighlightmarkup}{uwave}
@@ -192,24 +261,13 @@
}
% \end{macrocode}
%
-% Option \choption{addedmarkup}, stored or set to default value ``\texttt{colored}''.
+% Option \docoption{addedmarkup}, stored or set to default value \emph{colored}.
% \begin{macrocode}
\DeclareOptionX{addedmarkup}{
- \ifthenelse{\equal{\@empty}{#1}}
+ \ifblank{#1}
{}
{
- \ifthenelse{
- \equal{#1}{colored}\or
- \equal{#1}{uline}\or
- \equal{#1}{uuline}\or
- \equal{#1}{uwave}\or
- \equal{#1}{dashuline}\or
- \equal{#1}{dotuline}\or
- \equal{#1}{bf}\or
- \equal{#1}{it}\or
- \equal{#1}{sl}\or
- \equal{#1}{em}
- }
+ \IfIsInList{#1}{bf|colored|dashuline|dotuline|em|it|sl|uline|uuline|uwave}
{\renewcommand{\Changes@optionaddedmarkup}{#1}}
{\PackageWarning{changes}{addedmarkup '#1' unknown, using '\Changes@optionaddedmarkup'}}
}
@@ -217,26 +275,13 @@
}
% \end{macrocode}
%
-% Option \choption{deletedmarkup}, stored or set to default value ``\texttt{sout}''.
+% Option \docoption{deletedmarkup}, stored or set to default value \emph{sout}.
% \begin{macrocode}
\DeclareOptionX{deletedmarkup}{
- \ifthenelse{\equal{\@empty}{#1}}
+ \ifblank{#1}
{}
{
- \ifthenelse{
- \equal{#1}{sout}\or
- \equal{#1}{colored}\or
- \equal{#1}{uline}\or
- \equal{#1}{uuline}\or
- \equal{#1}{uwave}\or
- \equal{#1}{dashuline}\or
- \equal{#1}{dotuline}\or
- \equal{#1}{xout}\or
- \equal{#1}{bf}\or
- \equal{#1}{it}\or
- \equal{#1}{sl}\or
- \equal{#1}{em}
- }
+ \IfIsInList{#1}{bf|colored|dashuline|dotuline|em|it|sl|sout|uline|uuline|uwave|xout}
{\renewcommand{\Changes@optiondeletedmarkup}{#1}}
{\PackageWarning{changes}{deletedmarkup '#1' unknown, using '\Changes@optiondeletedmarkup'}}
}
@@ -244,17 +289,13 @@
}
% \end{macrocode}
%
-% Option \choption{highlightmarkup}, stored or set to default value ``\texttt{background}''.
+% Option \docoption{highlightmarkup}, stored or set to default value \emph{background}.
% \begin{macrocode}
\DeclareOptionX{highlightmarkup}{
- \ifthenelse{\equal{\@empty}{#1}}
+ \ifblank{#1}
{}
{
- \ifthenelse{
- \equal{#1}{background}\or
- \equal{#1}{uuline}\or
- \equal{#1}{uwave}
- }
+ \IfIsInList{#1}{background|uuline|uwave}
{\renewcommand{\Changes@optionhighlightmarkup}{#1}}
{\PackageWarning{changes}{highlightmarkup '#1' unknown, using '\Changes@optionhighlightmarkup'}}
}
@@ -262,18 +303,13 @@
}
% \end{macrocode}
%
-% Option \choption{commentmarkup}, stored or set to default value ``\texttt{todo}''.
+% Option \docoption{commentmarkup}, stored or set to default value \emph{todo}.
% \begin{macrocode}
\DeclareOptionX{commentmarkup}{
- \ifthenelse{\equal{\@empty}{#1}}
+ \ifblank{#1}
{}
{
- \ifthenelse{
- \equal{#1}{todo}\or
- \equal{#1}{margin}\or
- \equal{#1}{footnote}\or
- \equal{#1}{uwave}
- }
+ \IfIsInList{#1}{footnote|margin|todo|uwave}
{\renewcommand{\Changes@optioncommentmarkup}{#1}}
{\PackageWarning{changes}{commentmarkup '#1' unknown, using '\Changes@optioncommentmarkup'}}
}
@@ -281,20 +317,14 @@
}
% \end{macrocode}
%
-% Declare storage for authormarkup option and store option value or set to default value ``\texttt{superscript}''.
+% Declare storage for authormarkup option and store option value or set to default value \emph{superscript}.
% \begin{macrocode}
\newcommand{\Changes@optionauthormarkup}{superscript}
\DeclareOptionX{authormarkup}{
- \ifthenelse{\equal{\@empty}{#1}}
+ \ifblank{#1}
{}
{
- \ifthenelse{
- \equal{#1}{superscript}\or
- \equal{#1}{subscript}\or
- \equal{#1}{brackets}\or
- \equal{#1}{footnote}\or
- \equal{#1}{none}
- }
+ \IfIsInList{#1}{brackets|footnote|none|subscript|superscript}
{\renewcommand{\Changes@optionauthormarkup}{#1}}
{\PackageWarning{changes}{authormarkup '#1' unknown, using '\Changes@optionauthormarkup'}}
}
@@ -302,17 +332,14 @@
}
% \end{macrocode}
%
-% Declare storage for authormarkupposition option and store option value or set to default value ``\texttt{right}''.
+% Declare storage for authormarkupposition option and store option value or set to default value \emph{right}.
% \begin{macrocode}
\newcommand{\Changes@optionauthormarkupposition}{right}
\DeclareOptionX{authormarkupposition}{
- \ifthenelse{\equal{\@empty}{#1}}
+ \ifblank{#1}
{}
{
- \ifthenelse{
- \equal{#1}{right}\or
- \equal{#1}{left}
- }
+ \IfIsInList{#1}{left|right}
{\renewcommand{\Changes@optionauthormarkupposition}{#1}}
{\PackageWarning{changes}{authormarkupposition '#1' unknown, using '\Changes@optionauthormarkupposition'}}
}
@@ -320,17 +347,14 @@
}
% \end{macrocode}
%
-% Declare storage for authormarkuptext option and store option value or set to default value ``\texttt{id}''.
+% Declare storage for authormarkuptext option and store option value or set to default value \emph{id}.
% \begin{macrocode}
\newcommand{\Changes@optionauthormarkuptext}{id}
\DeclareOptionX{authormarkuptext}{
- \ifthenelse{\equal{\@empty}{#1}}
+ \ifblank{#1}
{}
{
- \ifthenelse{
- \equal{#1}{id}\or
- \equal{#1}{name}
- }
+ \IfIsInList{#1}{id|name}
{\renewcommand{\Changes@optionauthormarkuptext}{#1}}
{\PackageWarning{changes}{authormarkuptext '#1' unknown, using '\Changes@optionauthormarkuptext'}}
}
@@ -338,9 +362,21 @@
}
% \end{macrocode}
%
+% Store default author color..
+% \begin{macrocode}
+\newcommand{\Changes@optiondefaultcolor}{blue}
+\DeclareOptionX{defaultcolor}{
+ \ifblank{#1}
+ {}
+ {
+ \renewcommand{\Changes@optiondefaultcolor}{#1}
+ }
+ \typeout{changes-option 'defaultcolor=\Changes@optiondefaultcolor'}
+}
+% \end{macrocode}
%
%
-% Options for package \chpackage{todonotes} are directly passed to the package.
+% Options for package \docpackage{todonotes} are directly passed to the package.
% \begin{macrocode}
\DeclareOptionX{todonotes}{
\typeout{todonotes-option '#1', passed to package todonotes}
@@ -348,7 +384,7 @@
}
% \end{macrocode}
%
-% Options for package \chpackage{truncate} are directly passed to the package.
+% Options for package \docpackage{truncate} are directly passed to the package.
% \begin{macrocode}
\DeclareOptionX{truncate}{
\typeout{truncate-option '#1', passed to package truncate}
@@ -356,7 +392,7 @@
}
% \end{macrocode}
%
-% Options for package \chpackage{ulem} are directly passed to the package.
+% Options for package \docpackage{ulem} are directly passed to the package.
% \begin{macrocode}
\DeclareOptionX{ulem}{
\typeout{ulem-option '#1', passed to package ulem}
@@ -364,7 +400,7 @@
}
% \end{macrocode}
%
-% Options for package \chpackage{xcolor} are directly passed to the package.
+% Options for package \docpackage{xcolor} are directly passed to the package.
% \begin{macrocode}
\DeclareOptionX{xcolor}{
\typeout{xcolor-option '#1', passed to package xcolor}
@@ -381,9 +417,9 @@
%
% \subsubsection{Command options}
%
-% All options for commands (e.g. \chcommand{definechangesauthor}) have to be declared before option processing.
+% All options for commands (e.g. \doccommand{definechangesauthor}) have to be declared before option processing.
%
-% \minisec{\chcommand{definechangesauthor}}
+% \minisec{\doccommand{definechangesauthor}}
%
% Declare available options of the command, define value storage.
% \begin{macrocode}
@@ -395,16 +431,15 @@
% \begin{macrocode}
\presetkeys{Changes@definechangesauthor}{
name=\@empty,
- color=blue
+ color=\Changes@optiondefaultcolor
}{}
% \end{macrocode}
%
-% \minisec{\chcommand{added}}
+% \minisec{\doccommand{added}}
%
% Declare available options of the command, define value storage.
% \begin{macrocode}
\DeclareOptionX<Changes@added>{id}{\def\Changes@added@id{#1}}
-\DeclareOptionX<Changes@added>{remark}{\def\Changes@added@remark{#1}}
\DeclareOptionX<Changes@added>{comment}{\def\Changes@added@comment{#1}}
% \end{macrocode}
%
@@ -412,17 +447,15 @@
% \begin{macrocode}
\presetkeys{Changes@added}{
id=\@empty,
- remark=\@empty,
comment=\@empty,
}{}
% \end{macrocode}
%
-% \minisec{\chcommand{deleted}}
+% \minisec{\doccommand{deleted}}
%
% Declare available options of the command, define value storage.
% \begin{macrocode}
\DeclareOptionX<Changes@deleted>{id}{\def\Changes@deleted@id{#1}}
-\DeclareOptionX<Changes@deleted>{remark}{\def\Changes@deleted@remark{#1}}
\DeclareOptionX<Changes@deleted>{comment}{\def\Changes@deleted@comment{#1}}
% \end{macrocode}
%
@@ -430,17 +463,15 @@
% \begin{macrocode}
\presetkeys{Changes@deleted}{
id=\@empty,
- remark=\@empty,
comment=\@empty,
}{}
% \end{macrocode}
%
-% \minisec{\chcommand{replaced}}
+% \minisec{\doccommand{replaced}}
%
% Declare available options of the command, define value storage.
% \begin{macrocode}
\DeclareOptionX<Changes@replaced>{id}{\def\Changes@replaced@id{#1}}
-\DeclareOptionX<Changes@replaced>{remark}{\def\Changes@replaced@remark{#1}}
\DeclareOptionX<Changes@replaced>{comment}{\def\Changes@replaced@comment{#1}}
% \end{macrocode}
%
@@ -448,17 +479,15 @@
% \begin{macrocode}
\presetkeys{Changes@replaced}{
id=\@empty,
- remark=\@empty,
comment=\@empty,
}{}
% \end{macrocode}
%
-% \minisec{\chcommand{highlight}}
+% \minisec{\doccommand{highlight}}
%
% Declare available options of the command, define value storage.
% \begin{macrocode}
\DeclareOptionX<Changes@highlight>{id}{\def\Changes@highlight@id{#1}}
-\DeclareOptionX<Changes@highlight>{remark}{\def\Changes@highlight@remark{#1}}
\DeclareOptionX<Changes@highlight>{comment}{\def\Changes@highlight@comment{#1}}
% \end{macrocode}
%
@@ -466,12 +495,11 @@
% \begin{macrocode}
\presetkeys{Changes@highlight}{
id=\@empty,
- remark=\@empty,
comment=\@empty,
}{}
% \end{macrocode}
%
-% \minisec{\chcommand{comment}}
+% \minisec{\doccommand{comment}}
%
% Declare available options of the command, define value storage.
% \begin{macrocode}
@@ -485,7 +513,7 @@
}{}
% \end{macrocode}
%
-% \minisec{\chcommand{listofchanges}}
+% \minisec{\doccommand{listofchanges}}
%
% Declare available options of the command, define value storage.
% \begin{macrocode}
@@ -521,101 +549,140 @@
\ProcessOptionsX*\relax
% \end{macrocode}
%
-% \subsection{Packages}
+% \subsection{Utility tests}
%
-% \begin{macro}{\isColored}
+% \begin{macro}{\IfIsColored}
%
% Check if text should be colored.
+%
+% Corresponds to the if macros of \docpackage{etoolbox}, so it can be used in it's boolean tests.
+% Mainly the last two parameters are the results of \emph{true} and \emph{false} computation.
% \begin{macrocode}
-\newtest{\isColored}{%
- \not\equal{\Changes@optionmarkup}{nocolor}%
+\newrobustcmd{\IfIsColored}[2]{%
+ \IfStrEq{\Changes@optionmarkup}{nocolor}%
+ {#2}%
+ {#1}%
}
% \end{macrocode}
% \end{macro}
%
-% Package \chpackage{xcolor} provides colored text.
+% \begin{macro}{\IfIsEmpty}
+%
+% Checks if text in \docoption{\#1} is empty, executes \docoption{\#2} if empty, \docoption{\#3} otherwise.
+%
+% Corresponds to the if macros of \docpackage{etoolbox}, so it can be used in it's boolean tests.
+% Mainly the last two parameters are the results of \emph{true} and \emph{false} computation.
% \begin{macrocode}
-\ifthenelse{\isColored}
- {
- \RequirePackage{xcolor}
- }
+\newrobustcmd{\IfIsEmpty}[3]{%
+ \ifboolexpr{%
+ test {\ifblank{#1}} or%
+ test {\IfStrEq{#1}{}} or%
+ test {\IfStrEq{#1}{\@empty}}%
+ }%
+ {#2}%
+ {#3}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IfIsAnonymous}
+%
+% Check if author id is empty, therefore the author is anonymous.
+%
+% Corresponds to the if macros of \docpackage{etoolbox}, so it can be used in it's boolean tests.
+% Mainly the last two parameters are the results of \emph{true} and \emph{false} computation.
+% \begin{macrocode}
+\newrobustcmd{\IfIsAnonymous}[3]{%
+ \IfIsEmpty{#1}{#2}{#3}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IfIsAuthorEmptyAtPosition}
+%
+% Check if author is anonymous or position does not equal needed position, therefore the author text is empty.
+% This is a new test that can be tested using \doccommand{ifthenelse}.
+%
+% This test could be removed if the test for empty \doccommand{Changes@output@author} would work. % todo
+%
+% Corresponds to the if macros of \docpackage{etoolbox}, so it can be used in it's boolean tests.
+% Mainly the last two parameters are the results of \emph{true} and \emph{false} computation.
+% \begin{macrocode}
+\newrobustcmd{\IfIsAuthorEmptyAtPosition}[4]{%
+ \ifboolexpr{%
+ test {\IfIsAnonymous{#1}} or%
+ not test {\IfStrEq{\Changes@optionauthormarkupposition}{#2}}%
+ }%
+ {#3}%
+ {#4}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Packages}
+%
+% Package \docpackage{xcolor} provides colored text.
+% \begin{macrocode}
+\IfIsColored
+ {\RequirePackage{xcolor}}
{}
% \end{macrocode}
%
-% Package \chpackage{ulem} provides commands for striking out text.
-% Providing the needed package options via \chcommand{ExecuteOptionsX}.
-% \begin{macrocode}
-\ifthenelse{
- \equal{\Changes@optionaddedmarkup}{uline}\or
- \equal{\Changes@optionaddedmarkup}{uuline}\or
- \equal{\Changes@optionaddedmarkup}{uwave}\or
- \equal{\Changes@optionaddedmarkup}{dashuline}\or
- \equal{\Changes@optionaddedmarkup}{dotuline}\or
- \equal{\Changes@optiondeletedmarkup}{uline}\or
- \equal{\Changes@optiondeletedmarkup}{uuline}\or
- \equal{\Changes@optiondeletedmarkup}{uwave}\or
- \equal{\Changes@optiondeletedmarkup}{dashuline}\or
- \equal{\Changes@optiondeletedmarkup}{dotuline}\or
- \equal{\Changes@optiondeletedmarkup}{sout}\or
- \equal{\Changes@optiondeletedmarkup}{xout}\or
- \equal{\Changes@optioncommentmarkup}{uwave}\or
- \equal{\Changes@optionhighlightmarkup}{uuline}\or
- \equal{\Changes@optionhighlightmarkup}{uwave}
+% Package \docpackage{ulem} provides commands for striking out text.
+% Providing the needed package options via \doccommand{ExecuteOptionsX}.
+% \begin{macrocode}
+\ifboolexpr{
+ test {\IfIsInList{\Changes@optionaddedmarkup}{dashuline|dotuline|sout|uline|uuline|uwave|xout}} or
+ test {\IfIsInList{\Changes@optiondeletedmarkup}{dashuline|dotuline|sout|uline|uuline|uwave|xout}} or
+ test {\IfIsInList{\Changes@optionhighlightmarkup}{dashuline|dotuline|sout|uline|uuline|uwave|xout}}
}
{\RequirePackage{ulem}}
{}
% \end{macrocode}
%
-% Package \chpackage{todonotes} provides commands for todo notes in the margin.
+% Package \docpackage{todonotes} provides commands for todo notes in the margin.
% \begin{macrocode}
-\ifthenelse{
- \equal{\Changes@optioncommentmarkup}{todo}
-}
+\IfStrEq{\Changes@optioncommentmarkup}{todo}
{\RequirePackage{todonotes}}
{}
% \end{macrocode}
%
% \subsection{Language dependent texts}
%
-% If the \chpackage{babel} package is not loaded, the default language is English, in order to use another language, the user has to redefine the variables.
-% If the \chpackage{babel} or the \chpackage{polyglossia} package is loaded, the default language is English too for undefined languages.
-% \begin{macrocode}
-\newcommand*\listofchangesname{List of changes}
-\newcommand*\summaryofchangesname{Changes}
-\newcommand*\compactsummaryofchangesname{Changes (compact)}
-\newcommand*\changesaddname{Added}
-\newcommand*\changesdeletename{Deleted}
-\newcommand*\changesreplacename{Replaced}
-\newcommand*\changeshighlightname{Highlighted}
-\newcommand*\changescommentname{Commented}
-\newcommand*\changesauthorname{Author}
-\newcommand*\changesanonymousname{anonymous}
-\newcommand*\changesnochanges{No changes.}
-\newcommand*\changesnoloc{List of changes is available after the next \LaTeX\ run.}
-\newcommand*\changesnosoc{Summary of changes is available after the next \LaTeX\ run.}
-% \end{macrocode}
-%
-% The check for \chpackage{babel} or \chpackage{polyglossia}, define language dependent texts afterwards.
-% \begin{macrocode}
-\newboolean{Changes@langpackage}
-\setboolean{Changes@langpackage}{false}
-\@ifpackageloaded{babel}
- {\setboolean{Changes@langpackage}{true}}
- {}
-\@ifpackageloaded{polyglossia}
- {\setboolean{Changes@langpackage}{true}}
- {}
-\ifthenelse{\boolean{Changes@langpackage}}
+% If the \docpackage{babel} package is not loaded, the default language is English, in order to use another language, the user has to redefine the variables.
+% If the \docpackage{babel} or the \docpackage{polyglossia} package is loaded, the default language is English too for undefined languages.
+% \begin{macrocode}
+\def\listofchangesname{List of changes}
+\def\summaryofchangesname{Changes}
+\def\compactsummaryofchangesname{Changes (compact)}
+\def\changesaddedname{Added}
+\def\changesdeletedname{Deleted}
+\def\changesreplacedname{Replaced}
+\def\changeshighlightname{Highlighted}
+\def\changescommentname{Commented}
+\def\changesauthorname{Author}
+\def\changesanonymousname{anonymous}
+\def\changesnochanges{No changes.}
+\def\changesnoloc{List of changes is available after the next \LaTeX\ run.}
+\def\changesnosoc{Summary of changes is available after the next \LaTeX\ run.}
+% \end{macrocode}
+%
+% The check for \docpackage{babel} or \docpackage{polyglossia}, define language dependent texts afterwards.
+% \begin{macrocode}
+\ifboolexpr{
+ test {\@ifpackageloaded{babel}} or
+ test {\@ifpackageloaded{polyglossia}}
+}
{
\addto\captionsngerman{\def\listofchangesname{Liste der \"Anderungen}}
\addto\captionsngerman{\def\summaryofchangesname{\"Anderungen}}
\addto\captionsngerman{\def\compactsummaryofchangesname{\"Anderungen (kompakt)}}
- \addto\captionsngerman{\def\changesaddname{Eingef\"ugt}}
- \addto\captionsngerman{\def\changesdeletename{Gel\"oscht}}
- \addto\captionsngerman{\def\changesreplacename{Ersetzt}}
+ \addto\captionsngerman{\def\changesaddedname{Eingef\"ugt}}
+ \addto\captionsngerman{\def\changesdeletedname{Gel\"oscht}}
+ \addto\captionsngerman{\def\changesreplacedname{Ersetzt}}
\addto\captionsngerman{\def\changeshighlightname{Hervorgehoben}}
\addto\captionsngerman{\def\changescommentname{Kommentiert}}
- \addto\captionsngerman{\def\changesauthorname{Autor}}
+ \addto\captionsngerman{\def\changesauthorname{Autor:in}}
\addto\captionsngerman{\def\changesanonymousname{Anonym}}
\addto\captionsngerman{\def\changesnochanges{Keine \"Anderungen.}}
\addto\captionsngerman{\def\changesnoloc{Liste der \"Anderungen nach dem n\"achsten \LaTeX-Lauf verf\"ugbar.}}
@@ -624,12 +691,12 @@
\addto\captionsgerman{\def\listofchangesname{Liste der \"Anderungen}}
\addto\captionsgerman{\def\summaryofchangesname{\"Anderungen}}
\addto\captionsgerman{\def\compactsummaryofchangesname{\"Anderungen (kompakt)}}
- \addto\captionsgerman{\def\changesaddname{Eingef\"ugt}}
- \addto\captionsgerman{\def\changesdeletename{Gel\"oscht}}
- \addto\captionsgerman{\def\changesreplacename{Ersetzt}}
+ \addto\captionsgerman{\def\changesaddedname{Eingef\"ugt}}
+ \addto\captionsgerman{\def\changesdeletedname{Gel\"oscht}}
+ \addto\captionsgerman{\def\changesreplacedname{Ersetzt}}
\addto\captionsgerman{\def\changeshighlightname{Hervorgehoben}}
\addto\captionsgerman{\def\changescommentname{Kommentiert}}
- \addto\captionsgerman{\def\changesauthorname{Autor}}
+ \addto\captionsgerman{\def\changesauthorname{Autor:in}}
\addto\captionsgerman{\def\changesanonymousname{Anonym}}
\addto\captionsgerman{\def\changesnochanges{Keine \"Anderungen.}}
\addto\captionsgerman{\def\changesnoloc{Liste der \"Anderungen nach dem n\"achsten \LaTeX-Lauf verf\"ugbar.}}
@@ -638,9 +705,9 @@
\addto\captionsenglish{\def\listofchangesname{List of changes}}
\addto\captionsenglish{\def\summaryofchangesname{Changes}}
\addto\captionsenglish{\def\compactsummaryofchangesname{Changes (compact)}}
- \addto\captionsenglish{\def\changesaddname{Added}}
- \addto\captionsenglish{\def\changesdeletename{Deleted}}
- \addto\captionsenglish{\def\changesreplacename{Replaced}}
+ \addto\captionsenglish{\def\changesaddedname{Added}}
+ \addto\captionsenglish{\def\changesdeletedname{Deleted}}
+ \addto\captionsenglish{\def\changesreplacedname{Replaced}}
\addto\captionsenglish{\def\changeshighlightname{Highlighted}}
\addto\captionsenglish{\def\changescommentname{Commented}}
\addto\captionsenglish{\def\changesauthorname{Author}}
@@ -652,9 +719,9 @@
\addto\captionsbritish{\def\listofchangesname{List of changes}}
\addto\captionsbritish{\def\summaryofchangesname{Changes}}
\addto\captionsbritish{\def\compactsummaryofchangesname{Changes (compact)}}
- \addto\captionsbritish{\def\changesaddname{Added}}
- \addto\captionsbritish{\def\changesdeletename{Deleted}}
- \addto\captionsbritish{\def\changesreplacename{Replaced}}
+ \addto\captionsbritish{\def\changesaddedname{Added}}
+ \addto\captionsbritish{\def\changesdeletedname{Deleted}}
+ \addto\captionsbritish{\def\changesreplacedname{Replaced}}
\addto\captionsbritish{\def\changeshighlightname{Highlighted}}
\addto\captionsbritish{\def\changescommentname{Commented}}
\addto\captionsbritish{\def\changesauthorname{Author}}
@@ -666,9 +733,9 @@
\addto\captionsitalian{\def\listofchangesname{Lista delle modifiche}}
\addto\captionsitalian{\def\summaryofchangesname{Modifiche}}
\addto\captionsitalian{\def\compactsummaryofchangesname{Modifiche (coerente)}} % translation by me (EK), please provide correct translation
- \addto\captionsitalian{\def\changesaddname{Aggiunte}}
- \addto\captionsitalian{\def\changesdeletename{Cancellazioni}}
- \addto\captionsitalian{\def\changesreplacename{Sostituzioni}}
+ \addto\captionsitalian{\def\changesaddedname{Aggiunte}}
+ \addto\captionsitalian{\def\changesdeletedname{Cancellazioni}}
+ \addto\captionsitalian{\def\changesreplacedname{Sostituzioni}}
\addto\captionsitalian{\def\changeshighlightname{Accentare}} % translation by me (EK), please provide correct translation
\addto\captionsitalian{\def\changescommentname{Commenti}} % translation by me (EK), please provide correct translation
\addto\captionsitalian{\def\changesauthorname{Autore}}
@@ -680,21 +747,36 @@
{}
% \end{macrocode}
%
-% \subsection{File extension}
+% \subsection{File extensions}
+%
+% \begin{macro}{\Changes@locextension}
+% Store file extension for list of changes, set default to \emph{loc}.
+% \begin{macrocode}
+\newcommand{\Changes@locextension}{loc}
+% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}{\Changes@extension}
-% Store file extension in variable, set default to \texttt{soc} (summary of changes).
+% \begin{macro}{\setlocextension}
+% Sets a new file extension for list of changes.
% \begin{macrocode}
-\newcommand{\Changes@extension}{soc}
+\newcommand{\setlocextension}[1]{
+ \renewcommand{\Changes@locextension}{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Changes@socextension}
+% Store file extension for summary of changes, set default to \emph{soc}.
+% \begin{macrocode}
+\newcommand{\Changes@socextension}{soc}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setsocextension}
-% Set a new file extension.
-% Argument: new extension.
+% Sets a new file extension for summary of changes.
% \begin{macrocode}
\newcommand{\setsocextension}[1]{
- \renewcommand{\Changes@extension}{#1}
+ \renewcommand{\Changes@socextension}{#1}
}
% \end{macrocode}
% \end{macro}
@@ -714,7 +796,7 @@
% \begin{macro}{\definechangesauthor}
% Define a new author.
% Mandatory argument: author's id.
-% Optional arguments (key-value): author's name (default: empty) and author's color (default: blue).
+% Optional arguments (key-value): author's name (default: empty) and author's color (default: \doccommand{Changes@optiondefaultcolor} (blue)).
%
% Store id, name and color using named variables.
% Define counter and color per author.
@@ -763,11 +845,21 @@
% Store markup for authors.
% \begin{macrocode}
\newcommand{\Changes@Markup@author}[1]{%
- \ifthenelse{\equal{\Changes@optionauthormarkup}{superscript}}{\textsuperscript{#1}}{}%
- \ifthenelse{\equal{\Changes@optionauthormarkup}{subscript}}{\textsubscript{#1}}{}%
- \ifthenelse{\equal{\Changes@optionauthormarkup}{brackets}}{(#1)}{}%
- \ifthenelse{\equal{\Changes@optionauthormarkup}{footnote}}{\footnote{#1}}{}%
- \ifthenelse{\equal{\Changes@optionauthormarkup}{none}}{}{}%
+ \IfStrEq{\Changes@optionauthormarkup}{superscript}%
+ {\textsuperscript{#1}}%
+ {}%
+ \IfStrEq{\Changes@optionauthormarkup}{subscript}%
+ {\textsubscript{#1}}%
+ {}%
+ \IfStrEq{\Changes@optionauthormarkup}{brackets}%
+ {(#1)}%
+ {}%
+ \IfStrEq{\Changes@optionauthormarkup}{footnote}%
+ {\footnote{#1}}%
+ {}%
+ \IfStrEq{\Changes@optionauthormarkup}{none}%
+ {}%
+ {}%
}
% \end{macrocode}
% \end{macro}
@@ -806,20 +898,62 @@
% Replaced text is always typeset as follows: \meta{added text}\meta{deleted text}.
% Therefore no extra command for markup of replaced text is given.
%
+% \begin{macro}{\Changes@Markup}
+% Predefined markups for text.
+% \begin{macrocode}
+\newcommand{\Changes@Markup}[2]{%
+ \IfStrEq{#1}{background}%
+ {%
+ \IfIsColored%
+ {\colorbox{authorcolor!30}{#2}}%
+ {#2}%
+ }%
+ {}%
+ \IfStrEq{#1}{bf}%
+ {\textbf{#2}}%
+ {}%
+ \IfStrEq{#1}{colored}%
+ {#2}%
+ {}%
+ \IfStrEq{#1}{dashuline}%
+ {\dashuline{#2}}%
+ {}%
+ \IfStrEq{#1}{dotuline}%
+ {\dotuline{#2}}%
+ {}%
+ \IfStrEq{#1}{em}%
+ {\emph{#2}}%
+ {}%
+ \IfStrEq{#1}{it}%
+ {\textit{#2}}%
+ {}%
+ \IfStrEq{#1}{sl}%
+ {\textsl{#2}}%
+ {}%
+ \IfStrEq{#1}{sout}%
+ {\sout{#2}}%
+ {}%
+ \IfStrEq{#1}{uline}%
+ {\uline{#2}}%
+ {}%
+ \IfStrEq{#1}{uuline}%
+ {\uuline{#2}}%
+ {}%
+ \IfStrEq{#1}{uwave}%
+ {\uwave{#2}}%
+ {}%
+ \IfStrEq{#1}{xout}%
+ {\xout{#2}}%
+ {}%
+}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\Changes@Markup@added}
% Store markup for added text.
% \begin{macrocode}
\newcommand{\Changes@Markup@added}[1]{%
- \ifthenelse{\equal{\Changes@optionaddedmarkup}{colored}}{#1}{}%
- \ifthenelse{\equal{\Changes@optionaddedmarkup}{uline}}{\uline{#1}}{}%
- \ifthenelse{\equal{\Changes@optionaddedmarkup}{uuline}}{\uuline{#1}}{}%
- \ifthenelse{\equal{\Changes@optionaddedmarkup}{uwave}}{\uwave{#1}}{}%
- \ifthenelse{\equal{\Changes@optionaddedmarkup}{dashuline}}{\dashuline{#1}}{}%
- \ifthenelse{\equal{\Changes@optionaddedmarkup}{dotuline}}{\dotuline{#1}}{}%
- \ifthenelse{\equal{\Changes@optionaddedmarkup}{bf}}{\textbf{#1}}{}%
- \ifthenelse{\equal{\Changes@optionaddedmarkup}{it}}{\textit{#1}}{}%
- \ifthenelse{\equal{\Changes@optionaddedmarkup}{sl}}{\textsl{#1}}{}%
- \ifthenelse{\equal{\Changes@optionaddedmarkup}{em}}{\emph{#1}}{}%
+ \Changes@Markup{\Changes@optionaddedmarkup}{#1}{}%
}
% \end{macrocode}
% \end{macro}
@@ -837,18 +971,7 @@
% Store markup for deleted text.
% \begin{macrocode}
\newcommand{\Changes@Markup@deleted}[1]{%
- \ifthenelse{\equal{\Changes@optiondeletedmarkup}{sout}}{\sout{#1}}{}%
- \ifthenelse{\equal{\Changes@optiondeletedmarkup}{colored}}{#1}{}%
- \ifthenelse{\equal{\Changes@optiondeletedmarkup}{uline}}{\uline{#1}}{}%
- \ifthenelse{\equal{\Changes@optiondeletedmarkup}{uuline}}{\uuline{#1}}{}%
- \ifthenelse{\equal{\Changes@optiondeletedmarkup}{uwave}}{\uwave{#1}}{}%
- \ifthenelse{\equal{\Changes@optiondeletedmarkup}{dashuline}}{\dashuline{#1}}{}%
- \ifthenelse{\equal{\Changes@optiondeletedmarkup}{dotuline}}{\dotuline{#1}}{}%
- \ifthenelse{\equal{\Changes@optiondeletedmarkup}{xout}}{\xout{#1}}{}%
- \ifthenelse{\equal{\Changes@optiondeletedmarkup}{bf}}{\textbf{#1}}{}%
- \ifthenelse{\equal{\Changes@optiondeletedmarkup}{it}}{\textit{#1}}{}%
- \ifthenelse{\equal{\Changes@optiondeletedmarkup}{sl}}{\textsl{#1}}{}%
- \ifthenelse{\equal{\Changes@optiondeletedmarkup}{em}}{\emph{#1}}{}%
+ \Changes@Markup{\Changes@optiondeletedmarkup}{#1}{}%
}
% \end{macrocode}
% \end{macro}
@@ -867,14 +990,7 @@
% Store markup for highlighted text.
% \begin{macrocode}
\newcommand{\Changes@Markup@highlight}[1]{%
- \ifthenelse{\equal{\Changes@optionhighlightmarkup}{background}}%
- {%
- \ifthenelse{\isColored}%
- {\colorbox{authorcolor!30}{#1}}%
- {#1}%
- }{}%
- \ifthenelse{\equal{\Changes@optionhighlightmarkup}{uuline}}{\uuline{#1}}{}%
- \ifthenelse{\equal{\Changes@optionhighlightmarkup}{uwave}}{\uwave{#1}}{}%
+ \Changes@Markup{\Changes@optionhighlightmarkup}{#1}{}%
}
% \end{macrocode}
% \end{macro}
@@ -899,68 +1015,37 @@
% \end{enumerate}
% \begin{macrocode}
\newcommand{\Changes@Markup@comment}[3]{%
-% \end{macrocode}
-%
-% This one is tricky, because the parameters depend on tests.
-% If I use the tests inside the \chcommand{todo} command, they break because of the use of \chpackage{ifthenelse}.
-% Thus I am implementing a slightly dirty working version, having in mind, that the code should be revisited in future releases.
-% \begin{macrocode}
- \ifthenelse{\equal{\Changes@optioncommentmarkup}{todo}}%
+ \IfStrEq{\Changes@optioncommentmarkup}{todo}%
{%
- \ifthenelse{\isColored}%
- {%
- \ifthenelse{\isAnonymous{#2}}%
- {%
- \todo[color=authorcolor!10, bordercolor=authorcolor, linecolor=authorcolor!70, nolist]{\textbf{[\arabic{authorcommentcount}]} #1}%
- }{%
- \todo[color=authorcolor!10, bordercolor=authorcolor, linecolor=authorcolor!70, nolist]{\textbf{[#3~\arabic{authorcommentcount}]} #1}%
- }%
- }{%
- \ifthenelse{\isAnonymous{#2}}%
- {%
- \todo[color=black!0, bordercolor=black, linecolor=black!70, nolist]{\textbf{[\arabic{authorcommentcount}]} #1}%
- }{%
- \todo[color=black!0, bordercolor=black, linecolor=black!70, nolist]{\textbf{[#3~\arabic{authorcommentcount}]:} #1}%
- }%
- }%
+ \IfIsColored%
+ {\colorlet{Changes@todocolor}{authorcolor}}%
+ {\colorlet{Changes@todocolor}{black}}%
+ \todo[color=Changes@todocolor!10, bordercolor=Changes@todocolor, linecolor=Changes@todocolor!70, nolist]{\textbf{[\IfIsAnonymous{#2}{}{#3~}\arabic{authorcommentcount}]} #1}%
}{}%
-% \end{macrocode}
-%
-% Something a little more easy.
-% \begin{macrocode}
- \ifthenelse{\equal{\Changes@optioncommentmarkup}{margin}}%
+ \IfStrEq{\Changes@optioncommentmarkup}{margin}%
{%
\marginpar{%
- \ifthenelse{\isColored}%
+ \IfIsColored%
{\leavevmode\color{authorcolor}}%
{}%
- \ifthenelse{\isAnonymous{#2}}%
- {\textbf{[\arabic{Changes@commentCount#2}]:} }%
- {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }%
- #1%
+ \textbf{[\IfIsAnonymous{#2}{}{#3~}\arabic{Changes@commentCount#2}]:} #1%
}%
}{}%
- \ifthenelse{\equal{\Changes@optioncommentmarkup}{footnote}}%
+ \IfStrEq{\Changes@optioncommentmarkup}{footnote}%
{%
\footnote{%
- \ifthenelse{\isAnonymous{#2}}%
- {\textbf{[\arabic{Changes@commentCount#2}]:} }%
- {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }%
- #1%
+ \textbf{[\IfIsAnonymous{#2}{}{#3~}\arabic{Changes@commentCount#2}]:} #1%
}%
}{}%
- \ifthenelse{\equal{\Changes@optioncommentmarkup}{uwave}}%
+ \IfStrEq{\Changes@optioncommentmarkup}{uwave}%
{%
{%
- \ifthenelse{\isColored}%
+ \IfIsColored%
{\color{authorcolor}}%
{}%
\allowbreak%
\uwave{%
- \ifthenelse{\isAnonymous{#2}}%
- {\textbf{[\arabic{Changes@commentCount#2}]:} }%
- {\textbf{[#3~\arabic{Changes@commentCount#2}]:} }%
- #1%
+ \textbf{[\IfIsAnonymous{#2}{}{#3~}\arabic{Changes@commentCount#2}]:} #1%
}%
}%
}{}%
@@ -980,64 +1065,14 @@
%
% \subsubsection{Change management command definition}
%
-% \begin{macro}{\ifIsEmpty}
-%
-% Checks if text in \choption{\#1} is empty, executes \choption{\#2} if empty, \choption{\#3} otherwise.
-% This is a shortcut for the \chcommand{ifthenelse} test, it basically eases the use of the test.
-%
-% \begin{macrocode}
-\DeclareRobustCommand{\ifIsEmpty}[3]{%
- \ifthenelse{\equal{#1}{} \or \equal{#1}{\@empty}}%
- {#2}%
- {#3}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\isAnonymous}
-%
-% Check if author id is empty, therefore the author is anonymous.
-% This is a new test that can be tested using \chcommand{ifthenelse}.
-%
-% This test has the following arguments:
-% \begin{enumerate}
-% \item author's id
-% \end{enumerate}
-%
-% \begin{macrocode}
-\newtest{\isAnonymous}[1]{%
- \equal{#1}{\@empty}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\isAuthorEmpty}
-%
-% Check if author is anonymous or position does not equal needed position, therefore the author text is empty.
-% This is a new test that can be tested using \chcommand{ifthenelse}.
-%
-% This test could be removed if the test for empty \chcommand{Changes@output@author} would work.
-%
-% This test has the following arguments:
-% \begin{enumerate}
-% \item author's id
-% \item position
-% \end{enumerate}
-%
-% \begin{macrocode}
-\newtest{\isAuthorEmpty}[2]{%
- \isAnonymous{#1} \or \not\equal{\Changes@optionauthormarkupposition}{#2}%
-}
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}{\Changes@check@author}
%
% Check if author id is valid.
% An empty id is valid by default.
%
% If the id is not valid, a package error is raised.
-% I have the feeling that the code is optimizable.
+%
+% Loop code is taken from \url{https://texfaq.org/FAQ-repeat-num}
%
% This command has the following arguments:
% \begin{enumerate}
@@ -1045,23 +1080,26 @@
% \end{enumerate}
%
% \begin{macrocode}
-\newboolean{Changes@WrongID}
+\newbool{Changes@WrongID}
\newcommand{\Changes@check@author}[1]{%
- \ifIsEmpty{#1}%
+ \IfIsEmpty{#1}%
{}%
{%
- \setboolean{Changes@WrongID}{true}%
+ \setbool{Changes@WrongID}{true}%
\setcounter{Changes@Author}{0}%
- \whiledo{\value{Changes@Author} < \value{Changes@AuthorCount}}{%
+ \loop%
\stepcounter{Changes@Author}%
- \ifthenelse{\equal{#1}{\@nameuse{Changes@AuthorID\theChanges@Author}}}%
- {\setboolean{Changes@WrongID}{false}}%
+ \IfStrEq{#1}{\csuse{Changes@AuthorID\theChanges@Author}}%
+ {\setbool{Changes@WrongID}{false}}%
{}%
- }%
- \ifthenelse{\boolean{Changes@WrongID}}%
- {\PackageError{changes}%
- {Undefined changes author: #1}%
- {You have to define the author #1 with e.g.: \definechangesauthor{#1}}}%
+ \ifnum\theChanges@Author<\theChanges@AuthorCount%
+ \repeat%
+ \ifbool{Changes@WrongID}%
+ {%
+ \PackageError{changes}%
+ {Undefined changes author: #1}%
+ {You have to define the author #1 with e.g.: \definechangesauthor{#1}}%
+ }%
{}%
}%
}
@@ -1078,29 +1116,24 @@
% \item position to output the author to (left or right)
% \end{enumerate}
%
-% \chcommand{DeclareRobustCommand} is used for not breaking the todo note definition.
+% \doccommand{DeclareRobustCommand} is used for not breaking the todo note definition.
% \begin{macrocode}
-\DeclareRobustCommand{\Changes@output@author}[2]{%
+\newrobustcmd{\Changes@output@author}[2]{%
% \end{macrocode}
%
% Output author text only if author's id is given and the position matches, otherwise output empty text.
% \begin{macrocode}
- \ifthenelse{\isAuthorEmpty{#1}{#2}}%
+ \IfIsAuthorEmptyAtPosition{#1}{#2}%
{}%
{%
- \ifthenelse{\equal{\Changes@optionauthormarkuptext}{id}}%
- {%
- #1%
- }%
+ \IfStrEq{\Changes@optionauthormarkuptext}{id}%
+ {#1}%
{}%
- \ifthenelse{\equal{\Changes@optionauthormarkuptext}{name}}%
+ \IfStrEq{\Changes@optionauthormarkuptext}{name}%
{%
- \ifIsEmpty{\@nameuse{Changes@AuthorName#1}}%
- {%
- #1%
- }{%
- \@nameuse{Changes@AuthorName#1}%
- }%
+ \IfIsEmpty{\csuse{Changes@AuthorName#1}}%
+ {#1}%
+ {\csuse{Changes@AuthorName#1}}%
}%
{}%
}%
@@ -1118,9 +1151,9 @@
% \end{enumerate}
%
% \begin{macrocode}
-\newcommand{\Changes@set@color}[1]{%
- \ifthenelse{\isColored}%
- {\colorlet{authorcolor}{\@nameuse{Changes@AuthorColor#1}}}%
+\newrobustcmd{\Changes@set@color}[1]{%
+ \IfIsColored%
+ {\colorlet{authorcolor}{\csuse{Changes@AuthorColor#1}}}%
{}%
}
% \end{macrocode}
@@ -1137,12 +1170,44 @@
%
% \begin{macrocode}
\newcounter{authorcommentcount}
-\newcommand{\Changes@set@commentcount}[1]{%
+\newrobustcmd{\Changes@set@commentcount}[1]{%
\setcounter{authorcommentcount}{\value{Changes@commentCount#1}}%
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\Changes@set@commandname}
+%
+% Sets the command name according to setting of \docoption{commandname}.
+% \begin{macrocode}
+\def\Changes@commandprefix{ch}
+\newrobustcmd{\Changes@set@commandname}[1]{
+ \def\Changes@commandname{#1}
+ \IfStrEq{\Changes@optioncommandnameprefix}{always}
+ {
+ \def\Changes@commandname{\Changes@commandprefix#1}
+ \typeout{changes-package option commandnameprefix=always: using prefix on #1, new command name is \Changes@commandname.}
+ }{
+ \ifcsdef{#1}
+ {
+ \IfStrEq{\Changes@optioncommandnameprefix}{none}
+ {
+ \PackageError{changes}
+ {Command #1 is already defined.}
+ {Try package option commandnameprefix with "always" or "ifneeded", e.g. usepackage[commandnameprefix=always]{changes}}
+ }{}
+ \IfStrEq{\Changes@optioncommandnameprefix}{ifneeded}
+ {
+ \def\Changes@commandname{\Changes@commandprefix#1}
+ \PackageWarning{changes}{Command #1 is already defined, using \Changes@commandname}
+ }{}
+ }
+ {}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\Changes@output}
%
% Output command for the changed text.
@@ -1158,12 +1223,12 @@
% \item text for list of changes
% \end{enumerate}
% \begin{macrocode}
-\newcommand{\Changes@output}[7]{%
+\newrobustcmd{\Changes@output}[7]{%
% \end{macrocode}
%
-% Output changed text if option \choption{draft} is set, otherwise output unchanged text.
+% Output changed text if option \docoption{draft} is set, otherwise output unchanged text.
% \begin{macrocode}
- \ifthenelse{\boolean{Changes@optiondraft}}%
+ \ifbool{Changes@optiondraft}%
{%
% \end{macrocode}
%
@@ -1182,23 +1247,18 @@
%
% I think this code is not elegant but it gets the work done for now.
% \begin{macrocode}
- \ifthenelse{%
- \equal{#1}{added}\or%
- \equal{#1}{deleted}\or%
- \equal{#1}{replaced}\or%
- \equal{#1}{highlight}%
- }%
+ \IfIsInList{#1}{added|deleted|replaced|highlight}%
{%
% \end{macrocode}
%
% Author text for left positioning (only without comment).
% \begin{macrocode}
- \ifIsEmpty{#5}%
+ \IfIsEmpty{#5}%
{%
- \ifthenelse{\isAuthorEmpty{#2}{left}}%
+ \IfIsAuthorEmptyAtPosition{#2}{left}%
{}%
{{%
- \ifthenelse{\isColored}%
+ \IfIsColored%
{\color{authorcolor}}%
{}%
\Changes@Markup@author{\Changes@output@author{#2}{left}}%
@@ -1209,27 +1269,27 @@
% Changed/highlighted text.
% \begin{macrocode}
{%
- \ifthenelse{\not\equal{#1}{highlight}}%
- {%
- \ifthenelse{\isColored}%
+ \IfStrEq{#1}{highlight}%
+ {}{%
+ \IfIsColored%
{\color{authorcolor}}%
{}%
- }{}%
- \ifthenelse{\equal{#1}{added}}{\Changes@Markup@added{#3}}{}%
- \ifthenelse{\equal{#1}{deleted}}{\Changes@Markup@deleted{#4}}{}%
- \ifthenelse{\equal{#1}{replaced}}{{\Changes@Markup@added{#3}}\allowbreak\Changes@Markup@deleted{#4}}{}%
- \ifthenelse{\equal{#1}{highlight}}{\Changes@Markup@highlight{#3}}{}%
+ }%
+ \IfStrEq{#1}{added}{\Changes@Markup@added{#3}}{}%
+ \IfStrEq{#1}{deleted}{\Changes@Markup@deleted{#4}}{}%
+ \IfStrEq{#1}{replaced}{{\Changes@Markup@added{#3}}\allowbreak\Changes@Markup@deleted{#4}}{}%
+ \IfStrEq{#1}{highlight}{\Changes@Markup@highlight{#3}}{}%
}%
% \end{macrocode}
%
% Author text for right positioning (only without comment).
% \begin{macrocode}
- \ifIsEmpty{#5}%
+ \IfIsEmpty{#5}%
{%
- \ifthenelse{\isAuthorEmpty{#2}{right}}%
+ \IfIsAuthorEmptyAtPosition{#2}{right}%
{}%
{{%
- \ifthenelse{\isColored}%
+ \IfIsColored%
{\color{authorcolor}}%
{}%
\Changes@Markup@author{\Changes@output@author{#2}{right}}%
@@ -1245,7 +1305,7 @@
%
% Comments.
% \begin{macrocode}
- \ifIsEmpty{#5}%
+ \IfIsEmpty{#5}%
{}%
{%
\stepcounter{Changes@commentCount#2}%
@@ -1259,17 +1319,17 @@
% \end{macrocode}
% Store line for list of changes.
% \begin{macrocode}
- \ifIsEmpty{#2}%
+ \IfIsEmpty{#2}%
{\def\Changes@locid{}}%
{\def\Changes@locid{~(#2)}}%
- \addtocontents{loc}{\protect\ChangesListline{#1}{#6\Changes@locid}{#7}{\thepage}}%
+ \addtocontents{\Changes@locextension}{\protect\ChangesListline{#1}{#6\Changes@locid}{#7}{\thepage}}%
}%
% \end{macrocode}
%
-% Output unchanged text (option \choption{final} was set).
+% Output unchanged text (option \docoption{final} was set).
% \begin{macrocode}
{%
- \ifIsEmpty{#3}%
+ \IfIsEmpty{#3}%
{\@bsphack\@esphack}%
{#3}%
}%
@@ -1281,38 +1341,21 @@
% The command formats text as new text.
%
% Mandatory argument: added text.
-% Optional argument (key-value): author's id, comment, remark (deprecated)
+% Optional argument (key-value): author's id, comment
% \begin{macrocode}
-\newcommand{\added}[2][\@empty]{%
+\Changes@set@commandname{added}
+\expandafter\newcommand\expandafter{\csname\Changes@commandname\endcsname}[2][\@empty]{%
% \end{macrocode}
% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage.
% \begin{macrocode}
\setkeys{Changes@added}{#1}%
-% \end{macrocode}
-% Check for use of deprecated \choption{remark} option.
-% \begin{macrocode}
- \ifIsEmpty{\Changes@added@remark}%
- {}%
- {%
- \ifIsEmpty{\Changes@added@comment}%
- {%
- \PackageWarning{changes}{You used the deprecated option 'remark' in your markup, please use 'comment' instead.}%
- \let\Changes@added@comment\Changes@added@remark%
- }%
- {%
- \PackageWarning{changes}{You used both options 'comment' and the deprecated 'remark' in your markup, please use 'comment' only, the content of 'remark' will be ignored.}%
- }%
- }%
-% \end{macrocode}
-% End of check for use of deprecated \choption{remark} option.
-% \begin{macrocode}
\Changes@output%
{added}%
{\Changes@added@id}%
{#2}%
{}%
{\Changes@added@comment}%
- {\changesaddname}%
+ {\changesaddedname}%
{#2}%
}
% \end{macrocode}
@@ -1322,42 +1365,25 @@
% The command formats text as deleted text.
%
% The definition of the empty text for unchanged text is provided by Frank Mittelbach, slightly modified by me.
-% It solves the problem of additional space caused by an empty command (e.g. when using the \choption{final} option).
+% It solves the problem of additional space caused by an empty command (e.g. when using the \docoption{final} option).
% Before that, there was a slightly erroneous version from \texttt{de.comp.text.tex} (issue \#2).
%
% Mandatory argument: deleted text.
-% Optional argument (key-value): author's id, comment, remark (deprecated)
+% Optional argument (key-value): author's id, comment
% \begin{macrocode}
-\newcommand{\deleted}[2][\@empty]{%
+\Changes@set@commandname{deleted}
+\expandafter\newcommand\expandafter{\csname\Changes@commandname\endcsname}[2][\@empty]{%
% \end{macrocode}
% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage.
% \begin{macrocode}
\setkeys{Changes@deleted}{#1}%
-% \end{macrocode}
-% Check for use of deprecated \choption{remark} option.
-% \begin{macrocode}
- \ifIsEmpty{\Changes@deleted@remark}%
- {}%
- {%
- \ifIsEmpty{\Changes@deleted@comment}%
- {%
- \PackageWarning{changes}{You used the deprecated option 'remark' in your markup, please use 'comment' instead.}%
- \let\Changes@deleted@comment\Changes@deleted@remark%
- }%
- {%
- \PackageWarning{changes}{You used both options 'comment' and the deprecated 'remark' in your markup, please use 'comment' only, the content of 'remark' will be ignored.}%
- }%
- }%
-% \end{macrocode}
-% End of check for use of deprecated \choption{remark} option.
-% \begin{macrocode}
\Changes@output%
{deleted}%
{\Changes@deleted@id}%
{}%
{#2}%
{\Changes@deleted@comment}%
- {\changesdeletename}%
+ {\changesdeletedname}%
{#2}%
}
% \end{macrocode}
@@ -1367,38 +1393,21 @@
% The command formats text as replaced text.
%
% Mandatory arguments: new text and old text.
-% Optional argument (key-value): author's id, comment, remark (deprecated)
+% Optional argument (key-value): author's id, comment
% \begin{macrocode}
-\newcommand{\replaced}[3][\@empty]{%
+\Changes@set@commandname{replaced}
+\expandafter\newcommand\expandafter{\csname\Changes@commandname\endcsname}[3][\@empty]{%
% \end{macrocode}
% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage.
% \begin{macrocode}
\setkeys{Changes@replaced}{#1}%
-% \end{macrocode}
-% Check for use of deprecated \choption{remark} option.
-% \begin{macrocode}
- \ifIsEmpty{\Changes@replaced@remark}%
- {}%
- {%
- \ifIsEmpty{\Changes@replaced@comment}%
- {%
- \PackageWarning{changes}{You used the deprecated option 'remark' in your markup, please use 'comment' instead.}%
- \let\Changes@replaced@comment\Changes@replaced@remark%
- }%
- {%
- \PackageWarning{changes}{You used both options 'comment' and the deprecated 'remark' in your markup, please use 'comment' only, the content of 'remark' will be ignored.}%
- }%
- }%
-% \end{macrocode}
-% End of check for use of deprecated \choption{remark} option.
-% \begin{macrocode}
\Changes@output%
{replaced}%
{\Changes@replaced@id}%
{#2}%
{#3}%
{\Changes@replaced@comment}%
- {\changesreplacename}%
+ {\changesreplacedname}%
{#2}%
}
% \end{macrocode}
@@ -1408,32 +1417,15 @@
% The command formats text as highlighted text.
%
% Mandatory argument: highlighted text.
-% Optional argument (key-value): author's id, comment, remark (deprecated)
+% Optional argument (key-value): author's id, comment
% \begin{macrocode}
-\newcommand{\highlight}[2][\@empty]{%
+\Changes@set@commandname{highlight}
+\expandafter\newcommand\expandafter{\csname\Changes@commandname\endcsname}[2][\@empty]{%
% \end{macrocode}
%
% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage.
% \begin{macrocode}
\setkeys{Changes@highlight}{#1}%
-% \end{macrocode}
-% Check for use of deprecated \choption{remark} option.
-% \begin{macrocode}
- \ifIsEmpty{\Changes@highlight@remark}%
- {}%
- {%
- \ifIsEmpty{\Changes@highlight@comment}%
- {%
- \PackageWarning{changes}{You used the deprecated option 'remark' in your markup, please use 'comment' instead.}%
- \let\Changes@highlight@comment\Changes@highlight@remark%
- }%
- {%
- \PackageWarning{changes}{You used both options 'comment' and the deprecated 'remark' in your markup, please use 'comment' only, the content of 'remark' will be ignored.}%
- }%
- }%
-% \end{macrocode}
-% End of check for use of deprecated \choption{remark} option.
-% \begin{macrocode}
\Changes@output%
{highlight}%
{\Changes@highlight@id}%
@@ -1452,7 +1444,8 @@
% Mandatory argument: comment text.
% Optional argument (key-value): author's id
% \begin{macrocode}
-\newcommand{\comment}[2][\@empty]{%
+\Changes@set@commandname{comment}
+\expandafter\newcommand\expandafter{\csname\Changes@commandname\endcsname}[2][\@empty]{%
% \end{macrocode}
%
% Call \emph{setkeys} in order to evaluate the key-value-options and fill the value storage.
@@ -1472,9 +1465,9 @@
%
% \subsection{List of changes}
%
-% The list of changes truncates text, therefore the \chpackage{truncate} package is used.
+% The list of changes truncates text, therefore the \docpackage{truncate} package is used.
% (Using fit and redefining the marker: suggestion and code by Frank Mittelbach)
-% Providing the needed package options via \chcommand{ExecuteOptionsX}.
+% Providing the needed package options via \doccommand{ExecuteOptionsX}.
% \begin{macrocode}
\RequirePackage{truncate}
\renewcommand\TruncateMarker{ [\dots\negthinspace]\ }
@@ -1487,14 +1480,14 @@
% The contents have to be separated by a semicolon.
% \begin{macrocode}
\def\changes@chopline#1;#2;#3;#4;#5;#6;#7;#8 \\{%
- \def\Changes@InID{#1}%
- \def\Changes@InColor{#2}%
- \def\Changes@InName{#3}%
- \def\Changes@InAdded{#4}%
- \def\Changes@InDeleted{#5}%
- \def\Changes@InReplaced{#6}%
- \def\Changes@InHighlight{#7}%
- \def\Changes@InComment{#8}%
+ \def\Changes@Inid{#1}%
+ \def\Changes@Incolor{#2}%
+ \def\Changes@Inname{#3}%
+ \def\Changes@Inadded{#4}%
+ \def\Changes@Indeleted{#5}%
+ \def\Changes@Inreplaced{#6}%
+ \def\Changes@Inhighlight{#7}%
+ \def\Changes@Incomment{#8}%
}
% \end{macrocode}
% \end{macro}
@@ -1506,33 +1499,23 @@
% This command has the following arguments:
% \begin{enumerate}
% \item change type (added, ...)
+% \item change description with author
% \item text
% \item page
% \end{enumerate}
%
% \begin{macrocode}
\newcommand{\ChangesListline}[4]{%
- \IfSubStr{\Changes@loc@show}{#1}{%
+ \IfIsInList{#1}{\Changes@loc@show}{%
\@ifundefined{@dotsep}%
- {\def\@dotsep{4.5}}{}%
- \@dottedtocline{1}{0px}{2em}{#2: \truncate{\Changes@truncate@width}{#3}}{#4}%
+ {\def\@dotsep{4.5}}%
+ {}%
+ \@dottedtocline{1}{0pt}{2em}{#2: \truncate{\Changes@truncate@width}{#3}}{#4}%
}{}%
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\Changes@truncate@width}
-%
-% Length for the width of the truncation.
-%
-% Default: two third of the text width
-%
-% \begin{macrocode}
-\newlength{\Changes@truncate@width}
-\setlength{\Changes@truncate@width}{.6\textwidth}
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}{\settruncatewidth}
%
% Set the width of the truncation.
@@ -1544,15 +1527,15 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\Changes@summary@width}
+% \begin{macro}{\Changes@truncate@width}
%
-% Length for the width of the change summary.
+% Length for the width of the truncation.
%
-% Default: one third of the text width
+% Default: two third of the text width
%
% \begin{macrocode}
-\newlength{\Changes@summary@width}
-\setlength{\Changes@summary@width}{.3\textwidth}
+\newlength{\Changes@truncate@width}
+\settruncatewidth{.6\textwidth}
% \end{macrocode}
% \end{macro}
%
@@ -1578,143 +1561,109 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\Changes@summaryline}
+% \begin{macro}{\Changes@summary@width}
%
-% Auxiliary command for output of a summary line.
+% Length for the width of the change summary.
%
-% This command has the following arguments:
-% \begin{enumerate}
-% \item change type (added, ...)
-% \item number of items
-% \item name of items
-% \item line delimiter
-% \end{enumerate}
+% Default: one third of the text width
%
% \begin{macrocode}
-\newcommand{\Changes@summaryline}[4]{%
- \IfSubStr{\Changes@loc@show}{#1}{%
- \ifthenelse{\not\equal{\Changes@loc@style}{compactsummary} \or #2 > 0}%
- {%
- \parbox{\Changes@summary@width}{#3~\let\cleaders\leaders\dotfill~#2}#4%
- }{}%
- }{}%
-}
+\newlength{\Changes@summary@width}
+\setsummarywidth{.3\textwidth}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\listofchanges}
%
% This command outputs the list of changes.
-% Options: \choption{style} and \choption{title}.
+% Options: \docoption{title}, \docoption{style} and \docoption{show}.
%
% The following styles are available:
% \begin{description}
-% \item [\choption{list}] prints the list of changes like a list of figures
-% \item [\choption{summary}] prints the number of changes grouped by author
-% \item [\choption{compactsummary}] same as \choption{summary} but entries with count 0 are omitted
+% \item [\docoption{list}] prints the list of changes like a list of figures
+% \item [\docoption{summary}] prints the number of changes grouped by author
+% \item [\docoption{compactsummary}] same as \docoption{summary} but entries with count 0 are omitted
% \end{description}
%
-% For the list, the values are read from the auxiliary file.
-%
-% For the summary, the values are read from the loc-file, if it exists.
-% If no loc-file exists, an according message is generated.
+% The following show values are available:
+% \begin{description}
+% \item [\docoption{all}] all kinds of changes
+% \item [\docoption{added}] print only additions (same for delete, replace, highlight, comment)
+% \item [\docoption{added|deleted}] print additions and deletions (and other combinations with |)
+% \end{description}
%
-% Some definitions that have to reside outside the command in order to use the command multiple times.
-% \begin{macrocode}
-\newboolean{Changes@MoreLines}
-\newboolean{Changes@ShowOK}
-% \end{macrocode}
-% The definition of \chcommand{listofchanges}.
+% For the lists, the values are read from the auxiliary files (loc and soc).
+% If no loc/soc-files exists, an according message is generated.
% \begin{macrocode}
\newcommand{\listofchanges}[1][\@empty]{%
\setkeys{Changes@loc}{#1}%
% \end{macrocode}
% All work is done only in draft mode.
% \begin{macrocode}
- \ifthenelse{\boolean{Changes@optiondraft}}%
+ \ifbool{Changes@optiondraft}%
{%
% \end{macrocode}
%
-% Check if style is known, otherwise use \choption{list} by default.
+% Check if style is known, otherwise use \docoption{list} by default.
% \begin{macrocode}
- \ifIsEmpty{\Changes@loc@style}%
- {\def\Changes@loc@style{list}}%
+ \IfIsInList{\Changes@loc@style}{list|summary|compactsummary}%
+ {}%
{%
- \ifthenelse{%
- \equal{\Changes@loc@style}{list}\or%
- \equal{\Changes@loc@style}{summary}\or%
- \equal{\Changes@loc@style}{compactsummary}%
- }%
- {}%
- {%
- \PackageWarning{changes}{Wrong style for list of changes: '\Changes@loc@style', using 'list' instead.}%
- \def\Changes@loc@style{list}%
- }%
+ \PackageWarning{changes}{Wrong style for list of changes: '\Changes@loc@style', using 'list' instead.}%
+ \def\Changes@loc@style{}%
}%
+ \IfIsEmpty{\Changes@loc@style}%
+ {\def\Changes@loc@style{list}}%
+ {}%
% \end{macrocode}
%
-% Check if show-value is known, otherwise use \choption{all} by default.
+% Check if show-value is known, otherwise use \docoption{all} by default.
% \begin{macrocode}
- \ifIsEmpty{\Changes@loc@show}%
- {\def\Changes@loc@show{all}}%
+ \IfStrEq{\Changes@loc@show}{all}%
+ {\def\Changes@loc@show{added|deleted|replaced|highlight|comment}}%
+ {}%
+ \IfIsInList{\Changes@loc@show}{added|deleted|replaced|highlight|comment}%
+ {}%
{%
-% \end{macrocode}
-%
-% This check is complicated, because the \chcommand{isin} test of \chpackage{xifthen} does not work with macros.
-% On the other hand I could not define a new text using the \chcommand{IfSubStr} macro of \chpackage{xstring},
-% \begin{macrocode}
- \setboolean{Changes@ShowOK}{false}%
- \ifthenelse{\equal{\Changes@loc@show}{all}}{\setboolean{Changes@ShowOK}{true}}{}%
- \IfSubStr{\Changes@loc@show}{added}{\setboolean{Changes@ShowOK}{true}}{}%
- \IfSubStr{\Changes@loc@show}{deleted}{\setboolean{Changes@ShowOK}{true}}{}%
- \IfSubStr{\Changes@loc@show}{replaced}{\setboolean{Changes@ShowOK}{true}}{}%
- \IfSubStr{\Changes@loc@show}{highlight}{\setboolean{Changes@ShowOK}{true}}{}%
- \IfSubStr{\Changes@loc@show}{comment}{\setboolean{Changes@ShowOK}{true}}{}%
- \ifthenelse{\boolean{Changes@ShowOK}}%
- {}%
- {%
- \PackageWarning{changes}{Wrong show-value for list of changes: '\Changes@loc@show', using 'all' instead.}%
- \def\Changes@loc@show{all}%
- }%
+ \PackageWarning{changes}{Wrong show-value for list of changes: '\Changes@loc@show', using 'all' instead.}%
+ \def\Changes@loc@show{}%
}%
- \ifthenelse{\equal{\Changes@loc@show}{all}}%
- {%
- \def\Changes@loc@show{added|deleted|replaced|highlight|comment}%
- }{}%
+ \IfIsEmpty{\Changes@loc@show}%
+ {\def\Changes@loc@show{added|deleted|replaced|highlight|comment}}%
+ {}%
% \end{macrocode}
%
% Print heading.
% \begin{macrocode}
- \def\Changes@heading{\Changes@loc@title}
- \ifIsEmpty{\Changes@loc@title}%
+ \IfIsEmpty{\Changes@loc@title}%
{%
- \ifthenelse{\equal{\Changes@loc@style}{list}}%
+ \IfStrEq{\Changes@loc@style}{list}%
{\def\Changes@heading{\listofchangesname}}{}%
- \ifthenelse{\equal{\Changes@loc@style}{summary}}%
+ \IfStrEq{\Changes@loc@style}{summary}%
{\def\Changes@heading{\summaryofchangesname}}{}%
- \ifthenelse{\equal{\Changes@loc@style}{compactsummary}}%
+ \IfStrEq{\Changes@loc@style}{compactsummary}%
{\def\Changes@heading{\compactsummaryofchangesname}}{}%
- }{}%
+ }%
+ {\def\Changes@heading{\Changes@loc@title}}%
\section*{\Changes@heading}
% \end{macrocode}
%
% Print list.
+%
+% The \doccommand{ifeof} command is neccessary in the loop too, otherwise there are problems with the last (empty) line of the file.
% \begin{macrocode}
- \ifthenelse{\equal{\Changes@loc@style}{list}}%
+ \IfIsInList{\Changes@loc@style}{list}%
{%
- \IfFileExists{\jobname.loc}%
+ \IfFileExists{\jobname.\Changes@locextension}%
{%
- \setboolean{Changes@MoreLines}{true}%
\newread\Changes@InFile%
- \openin\Changes@InFile = \jobname.loc%
- \whiledo{\boolean{Changes@MoreLines}}{%
+ \openin\Changes@InFile=\jobname.\Changes@locextension%
+ \loop\unless\ifeof\Changes@InFile%
\read\Changes@InFile to \Changes@Line%
- \ifeof\Changes@InFile%
- \setboolean{Changes@MoreLines}{false}%
- \else%
+ \ifeof\Changes@InFile\else%
\Changes@Line%
- \fi%
- }%
+ \fi
+ \repeat
\closein\Changes@InFile%
}{%
\emph{\changesnoloc}%
@@ -1723,52 +1672,76 @@
}{}%
% \end{macrocode}
% Print summary or compact summary.
+%
+% The \doccommand{ifeof} command is neccessary in the loop too, otherwise there are problems with the last (empty) line of the file.
% \begin{macrocode}
- \ifthenelse{\equal{\Changes@loc@style}{summary} \or \equal{\Changes@loc@style}{compactsummary}}%
+ \IfIsInList{\Changes@loc@style}{summary|compactsummary}%
{%
- \IfFileExists{\jobname.\Changes@extension}%
+ \IfFileExists{\jobname.\Changes@socextension}%
{%
- \setboolean{Changes@MoreLines}{true}%
\newread\Changes@InFile%
- \openin\Changes@InFile = \jobname.\Changes@extension%
- \whiledo{\boolean{Changes@MoreLines}}{%
+ \openin\Changes@InFile = \jobname.\Changes@socextension%
+% \end{macrocode}
+% Every line contains the author's id, color and number of changes.
+% \begin{macrocode}
+ \loop\unless\ifeof\Changes@InFile%
\read\Changes@InFile to \Changes@Line%
- \ifeof\Changes@InFile%
- \setboolean{Changes@MoreLines}{false}%
- \else%
+ \ifeof\Changes@InFile\else%
\expandafter\changes@chopline\Changes@Line\\%
\textbf{%
- \ifthenelse{\isColored}%
- {\color{\Changes@InColor}}%
+ \IfIsColored%
+ {\color{\Changes@Incolor}}%
{}%
- \ifthenelse{\equal{\Changes@InID}{\@empty}}%
+ \IfIsAnonymous{\Changes@Inid}%
{\changesauthorname: \changesanonymousname}%
{%
- \changesauthorname: \Changes@InID%
- \ifthenelse{\equal{\Changes@InName}{\@empty}}%
+ \changesauthorname: \Changes@Inid%
+ \IfIsEmpty{\Changes@Inname}%
{}%
- { (\Changes@InName)}%
+ { (\Changes@Inname)}%
}%
}\\%
- \ifthenelse{%
- \Changes@InAdded > 0 \or%
- \Changes@InDeleted > 0 \or%
- \Changes@InReplaced > 0 \or%
- \Changes@InHighlight > 0 \or%
- \Changes@InComment > 0%
+% \end{macrocode}
+% Compute the relevant sum of changes in order to print "no changes" correctly.
+%
+% To make sure \doccommand{do} can be renewed, we define it first, some macros, such as \doccommand{chapter} undefine it.
+% \begin{macrocode}
+ \numdef{\Changes@InSum}{0}%
+ \def\do{}%
+ \renewcommand*{\do}[1]{%
+ \numdef{\Changes@InSum}{\Changes@InSum + \csuse{Changes@In########1}}%
}%
+ \expandafter\dopsvlist\expandafter{\Changes@loc@show}%
+% \end{macrocode}
+% Print summary.
+% \begin{macrocode}
+ \ifnumcomp{\Changes@InSum}{=}{0}%
{%
- \Changes@summaryline{added}{\Changes@InAdded}{\changesaddname}{\\}%
- \Changes@summaryline{deleted}{\Changes@InDeleted}{\changesdeletename}{\\}%
- \Changes@summaryline{replaced}{\Changes@InReplaced}{\changesreplacename}{\\}%
- \Changes@summaryline{highlight}{\Changes@InHighlight}{\changeshighlightname}{\\}%
- \Changes@summaryline{comment}{\Changes@InComment}{\changescommentname}{\\[1ex]}%
+ \parbox{\Changes@summary@width}{\changesnochanges}\\[1ex]%
}%
{%
- \parbox{\Changes@summary@width}{\changesnochanges}\\[1ex]%
+ \numdef{\Changes@InCount}{0}%
+ \renewcommand*{\do}[1]{%
+ \numdef{\Changes@InCount}{\Changes@InCount + \csuse{Changes@In########1}}%
+ \ifboolexpr{%
+ not test {\IfStrEq{\Changes@loc@style}{compactsummary}} or%
+ test {\ifnumgreater{\csuse{Changes@In########1}}{0}}%
+ }%
+ {%
+ \parbox{\Changes@summary@width}{\csuse{changes########1name}~\let\cleaders\leaders\dotfill~\csuse{Changes@In########1}}%
+ \ifnumless{\Changes@InCount}{\Changes@InSum}%
+ {\\}%
+ {\\[1ex]}%
+ }%
+ {}%
+ }%
+ \expandafter\dopsvlist\expandafter{\Changes@loc@show}%
}%
\fi%
- }%
+% \end{macrocode}
+% File read loop.
+% \begin{macrocode}
+ \repeat
\closein\Changes@InFile%
}{%
\emph{\changesnosoc}%
@@ -1784,7 +1757,7 @@
% \end{macro}
%
% At the end of the document: write the list of changes in the loc-file, therefore open file, write values, close file.
-% Changes are written as \hologo{LaTeX}-formatted text, so they can simply be read via \chcommand{input}.
+% Changes are written as \hologo{LaTeX}-formatted text, so they can simply be read via \doccommand{input}.
%
% The order of entries is: id, color, name, added, deleted, replaced, comment, highlight.
% The contents have to be separated by a semicolon.
@@ -1794,10 +1767,10 @@
% Open output file.
% \begin{macrocode}
\newwrite\Changes@OutFile
- \immediate\openout\Changes@OutFile = \jobname.\Changes@extension
+ \immediate\openout\Changes@OutFile = \jobname.\Changes@socextension
% \end{macrocode}
-% Redefine expandable of \chcommand{protect} in order to write correct special characters.
-% Store original definition for resetting \chcommand{protect}.
+% Redefine expandable of \doccommand{protect} in order to write correct special characters.
+% Store original definition for resetting \doccommand{protect}.
% \begin{macrocode}
\let\Changes@protect\protect
\let\protect\@unexpandable@protect
@@ -1805,24 +1778,24 @@
% Output data for list of changes.
% \begin{macrocode}
\setcounter{Changes@Author}{0}
- \whiledo{\value{Changes@Author} < \value{Changes@AuthorCount}}{%
+ \loop\unless\ifnum\theChanges@Author = \value{Changes@AuthorCount}
\stepcounter{Changes@Author}%
- \def\Changes@ID{\@nameuse{Changes@AuthorID\theChanges@Author}}%
+ \def\Changes@ID{\csuse{Changes@AuthorID\theChanges@Author}}%
\immediate\write\Changes@OutFile{\Changes@ID;%
- \@nameuse{Changes@AuthorColor\Changes@ID};%
- \@nameuse{Changes@AuthorName\Changes@ID};%
+ \csuse{Changes@AuthorColor\Changes@ID};%
+ \csuse{Changes@AuthorName\Changes@ID};%
\the\value{Changes@addedCount\Changes@ID};%
\the\value{Changes@deletedCount\Changes@ID};%
\the\value{Changes@replacedCount\Changes@ID};%
\the\value{Changes@highlightCount\Changes@ID};%
\the\value{Changes@commentCount\Changes@ID}}%
- }%
+ \repeat
% \end{macrocode}
% Close output file.
% \begin{macrocode}
\immediate\closeout\Changes@OutFile
% \end{macrocode}
-% Restore original definition of \chcommand{protect}.
+% Restore original definition of \doccommand{protect}.
% \begin{macrocode}
\let\protect\Changes@protect
% \end{macrocode}
@@ -1830,10 +1803,10 @@
% Write content of listofchanges to file.
% \begin{macrocode}
\if@filesw
- \@ifundefined{tf@loc}{%
- \expandafter\newwrite\csname tf@loc\endcsname
- \immediate\openout \csname tf@loc\endcsname \jobname.loc\relax
- }{}%
+ \@ifundefined{tf@\Changes@locextension}{
+ \expandafter\newwrite\csname tf@\Changes@locextension\endcsname
+ \immediate\openout \csname tf@\Changes@locextension\endcsname \jobname.\Changes@locextension\relax
+ }{}
\fi
}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/changes/changes.ins b/Master/texmf-dist/source/latex/changes/changes.ins
index acf9b774684..489d804e35b 100644
--- a/Master/texmf-dist/source/latex/changes/changes.ins
+++ b/Master/texmf-dist/source/latex/changes/changes.ins
@@ -1,6 +1,6 @@
%% This file creates the needed files from changes.dtx
%%
-\def\filedate{2019/11/17}
+\def\filedate{2021/02/14}
\def\batchfile{changes.ins}
\input docstrip
@@ -10,7 +10,7 @@
\preamble
changes.dtx
-Copyright 2007-2019 Ekkart Kleinod (ekleinod@edgesoft.de)
+Copyright 2007-2021 Ekkart Kleinod (ekleinod@edgesoft.de)
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
@@ -31,7 +31,7 @@ This work consists of the files
source/latex/changes/README
source/latex/changes/userdoc/*.tex
- scripts/changes/delcmdchanges.bash
+ scripts/changes/pyMergeChanges.py
and the derived files
doc/latex/changes/changes.english.pdf
doc/latex/changes/changes.english.withcode.pdf
@@ -45,102 +45,109 @@ and the derived files
\endpreamble
\postamble
-Copyright 2007-2019 Ekkart Kleinod
+Copyright 2007-2021 Ekkart Kleinod
\endpostamble
\generate{
\file{changes.sty}{\from{changes.dtx}{changes}}
%
- \file{changes.example.simple.tex}{\from{examples.dtx}{example:simple}}
- \file{changes.example.draft.tex}{\from{examples.dtx}{example:draft}}
- \file{changes.example.final.tex}{\from{examples.dtx}{example:final}}
-%
- \file{changes.example.markup.default.tex}{\from{examples.dtx}{example:markup:default}}
- \file{changes.example.markup.underlined.tex}{\from{examples.dtx}{example:markup:underlined}}
- \file{changes.example.markup.bfit.tex}{\from{examples.dtx}{example:markup:bfit}}
- \file{changes.example.markup.nocolor.tex}{\from{examples.dtx}{example:markup:nocolor}}
- \file{changes.example.markup.wrong.tex}{\from{examples.dtx}{example:markup:wrong}}
-%
- \file{changes.example.addedmarkup.colored.tex}{\from{examples.dtx}{example:addedmarkup:colored}}
- \file{changes.example.addedmarkup.uline.tex}{\from{examples.dtx}{example:addedmarkup:uline}}
- \file{changes.example.addedmarkup.uuline.tex}{\from{examples.dtx}{example:addedmarkup:uuline}}
- \file{changes.example.addedmarkup.uwave.tex}{\from{examples.dtx}{example:addedmarkup:uwave}}
- \file{changes.example.addedmarkup.dashuline.tex}{\from{examples.dtx}{example:addedmarkup:dashuline}}
- \file{changes.example.addedmarkup.dotuline.tex}{\from{examples.dtx}{example:addedmarkup:dotuline}}
- \file{changes.example.addedmarkup.bf.tex}{\from{examples.dtx}{example:addedmarkup:bf}}
- \file{changes.example.addedmarkup.it.tex}{\from{examples.dtx}{example:addedmarkup:it}}
- \file{changes.example.addedmarkup.sl.tex}{\from{examples.dtx}{example:addedmarkup:sl}}
- \file{changes.example.addedmarkup.em.tex}{\from{examples.dtx}{example:addedmarkup:em}}
- \file{changes.example.addedmarkup.wrong.tex}{\from{examples.dtx}{example:addedmarkup:wrong}}
-%
- \file{changes.example.deletedmarkup.colored.tex}{\from{examples.dtx}{example:deletedmarkup:colored}}
- \file{changes.example.deletedmarkup.uline.tex}{\from{examples.dtx}{example:deletedmarkup:uline}}
- \file{changes.example.deletedmarkup.uuline.tex}{\from{examples.dtx}{example:deletedmarkup:uuline}}
- \file{changes.example.deletedmarkup.uwave.tex}{\from{examples.dtx}{example:deletedmarkup:uwave}}
- \file{changes.example.deletedmarkup.dashuline.tex}{\from{examples.dtx}{example:deletedmarkup:dashuline}}
- \file{changes.example.deletedmarkup.dotuline.tex}{\from{examples.dtx}{example:deletedmarkup:dotuline}}
- \file{changes.example.deletedmarkup.sout.tex}{\from{examples.dtx}{example:deletedmarkup:sout}}
- \file{changes.example.deletedmarkup.xout.tex}{\from{examples.dtx}{example:deletedmarkup:xout}}
- \file{changes.example.deletedmarkup.bf.tex}{\from{examples.dtx}{example:deletedmarkup:bf}}
- \file{changes.example.deletedmarkup.it.tex}{\from{examples.dtx}{example:deletedmarkup:it}}
- \file{changes.example.deletedmarkup.sl.tex}{\from{examples.dtx}{example:deletedmarkup:sl}}
- \file{changes.example.deletedmarkup.em.tex}{\from{examples.dtx}{example:deletedmarkup:em}}
- \file{changes.example.deletedmarkup.wrong.tex}{\from{examples.dtx}{example:deletedmarkup:wrong}}
-%
- \file{changes.example.commentmarkup.margin.tex}{\from{examples.dtx}{example:commentmarkup:margin}}
- \file{changes.example.commentmarkup.footnote.tex}{\from{examples.dtx}{example:commentmarkup:footnote}}
- \file{changes.example.commentmarkup.uwave.tex}{\from{examples.dtx}{example:commentmarkup:uwave}}
- \file{changes.example.commentmarkup.todo.tex}{\from{examples.dtx}{example:commentmarkup:todo}}
-%
- \file{changes.example.highlightmarkup.background.tex}{\from{examples.dtx}{example:highlightmarkup:background}}
- \file{changes.example.highlightmarkup.uuline.tex}{\from{examples.dtx}{example:highlightmarkup:uuline}}
- \file{changes.example.highlightmarkup.uwave.tex}{\from{examples.dtx}{example:highlightmarkup:uwave}}
-%
- \file{changes.example.setaddedmarkup.tex}{\from{examples.dtx}{example:setaddedmarkup}}
- \file{changes.example.setdeletedmarkup.tex}{\from{examples.dtx}{example:setdeletedmarkup}}
- \file{changes.example.setcommentmarkup.tex}{\from{examples.dtx}{example:setcommentmarkup}}
- \file{changes.example.sethighlightmarkup.tex}{\from{examples.dtx}{example:sethighlightmarkup}}
-%
- \file{changes.example.authormarkup.superscript.tex}{\from{examples.dtx}{example:authormarkup:superscript}}
- \file{changes.example.authormarkup.subscript.tex}{\from{examples.dtx}{example:authormarkup:subscript}}
- \file{changes.example.authormarkup.brackets.tex}{\from{examples.dtx}{example:authormarkup:brackets}}
- \file{changes.example.authormarkup.footnote.tex}{\from{examples.dtx}{example:authormarkup:footnote}}
- \file{changes.example.authormarkup.none.tex}{\from{examples.dtx}{example:authormarkup:none}}
- \file{changes.example.authormarkup.wrong.tex}{\from{examples.dtx}{example:authormarkup:wrong}}
-%
- \file{changes.example.authormarkupposition.left.tex}{\from{examples.dtx}{example:authormarkupposition:left}}
- \file{changes.example.authormarkupposition.right.tex}{\from{examples.dtx}{example:authormarkupposition:right}}
- \file{changes.example.authormarkupposition.wrong.tex}{\from{examples.dtx}{example:authormarkupposition:wrong}}
-%
- \file{changes.example.authormarkuptext.id.tex}{\from{examples.dtx}{example:authormarkuptext:id}}
- \file{changes.example.authormarkuptext.name.tex}{\from{examples.dtx}{example:authormarkuptext:name}}
- \file{changes.example.authormarkuptext.wrong.tex}{\from{examples.dtx}{example:authormarkuptext:wrong}}
-%
- \file{changes.example.setauthormarkup.tex}{\from{examples.dtx}{example:setauthormarkup}}
- \file{changes.example.setauthormarkupposition.tex}{\from{examples.dtx}{example:setauthormarkupposition}}
- \file{changes.example.setauthormarkuptext.tex}{\from{examples.dtx}{example:setauthormarkuptext}}
-%
- \file{changes.example.settruncatewidth.tex}{\from{examples.dtx}{example:settruncatewidth}}
-%
- \file{changes.example.setsummarywidth.tex}{\from{examples.dtx}{example:setsummarywidth}}
- \file{changes.example.setsummarytowidth.tex}{\from{examples.dtx}{example:setsummarytowidth}}
-%
- \file{changes.example.setsocextension.tex}{\from{examples.dtx}{example:setsocextension}}
-%
- \file{changes.example.listofchanges.list.tex}{\from{examples.dtx}{example:listofchanges:list}}
- \file{changes.example.listofchanges.summary.tex}{\from{examples.dtx}{example:listofchanges:summary}}
- \file{changes.example.listofchanges.compactsummary.tex}{\from{examples.dtx}{example:listofchanges:compactsummary}}
- \file{changes.example.listofchanges.all.tex}{\from{examples.dtx}{example:listofchanges:all}}
- \file{changes.example.listofchanges.title.tex}{\from{examples.dtx}{example:listofchanges:title}}
- \file{changes.example.listofchanges.show.tex}{\from{examples.dtx}{example:listofchanges:show}}
- \file{changes.example.listofchanges.wrong.tex}{\from{examples.dtx}{example:listofchanges:wrong}}
-%
- \file{changes.example.packageoptions.todonotes.tex}{\from{examples.dtx}{example:packageoptions.todonotes}}
- \file{changes.example.packageoptions.truncate.tex}{\from{examples.dtx}{example:packageoptions.truncate}}
- \file{changes.example.packageoptions.ulem.tex}{\from{examples.dtx}{example:packageoptions.ulem}}
- \file{changes.example.packageoptions.xcolor.tex}{\from{examples.dtx}{example:packageoptions.xcolor}}
-%
- \file{changes.example.screenshot.tex}{\from{example-screenshot.dtx}{example:screenshot}}
+ \file{examples/changes.example.simple.tex}{\from{examples.dtx}{example:simple}}
+ \file{examples/changes.example.draft.tex}{\from{examples.dtx}{example:draft}}
+ \file{examples/changes.example.final.tex}{\from{examples.dtx}{example:final}}
+%
+ \file{examples/changes.example.markup.default.tex}{\from{examples.dtx}{example:markup:default}}
+ \file{examples/changes.example.markup.underlined.tex}{\from{examples.dtx}{example:markup:underlined}}
+ \file{examples/changes.example.markup.bfit.tex}{\from{examples.dtx}{example:markup:bfit}}
+ \file{examples/changes.example.markup.nocolor.tex}{\from{examples.dtx}{example:markup:nocolor}}
+ \file{examples/changes.example.markup.wrong.tex}{\from{examples.dtx}{example:markup:wrong}}
+%
+ \file{examples/changes.example.commandnameprefix.none.tex}{\from{examples.dtx}{example:commandnameprefix:none}}
+ \file{examples/changes.example.commandnameprefix.always.tex}{\from{examples.dtx}{example:commandnameprefix:always}}
+ \file{examples/changes.example.commandnameprefix.ifneeded.tex}{\from{examples.dtx}{example:commandnameprefix:ifneeded}}
+ \file{examples/changes.example.commandnameprefix.wrong.tex}{\from{examples.dtx}{example:commandnameprefix:wrong}}
+%
+ \file{examples/changes.example.addedmarkup.colored.tex}{\from{examples.dtx}{example:addedmarkup:colored}}
+ \file{examples/changes.example.addedmarkup.uline.tex}{\from{examples.dtx}{example:addedmarkup:uline}}
+ \file{examples/changes.example.addedmarkup.uuline.tex}{\from{examples.dtx}{example:addedmarkup:uuline}}
+ \file{examples/changes.example.addedmarkup.uwave.tex}{\from{examples.dtx}{example:addedmarkup:uwave}}
+ \file{examples/changes.example.addedmarkup.dashuline.tex}{\from{examples.dtx}{example:addedmarkup:dashuline}}
+ \file{examples/changes.example.addedmarkup.dotuline.tex}{\from{examples.dtx}{example:addedmarkup:dotuline}}
+ \file{examples/changes.example.addedmarkup.bf.tex}{\from{examples.dtx}{example:addedmarkup:bf}}
+ \file{examples/changes.example.addedmarkup.it.tex}{\from{examples.dtx}{example:addedmarkup:it}}
+ \file{examples/changes.example.addedmarkup.sl.tex}{\from{examples.dtx}{example:addedmarkup:sl}}
+ \file{examples/changes.example.addedmarkup.em.tex}{\from{examples.dtx}{example:addedmarkup:em}}
+ \file{examples/changes.example.addedmarkup.wrong.tex}{\from{examples.dtx}{example:addedmarkup:wrong}}
+%
+ \file{examples/changes.example.deletedmarkup.colored.tex}{\from{examples.dtx}{example:deletedmarkup:colored}}
+ \file{examples/changes.example.deletedmarkup.uline.tex}{\from{examples.dtx}{example:deletedmarkup:uline}}
+ \file{examples/changes.example.deletedmarkup.uuline.tex}{\from{examples.dtx}{example:deletedmarkup:uuline}}
+ \file{examples/changes.example.deletedmarkup.uwave.tex}{\from{examples.dtx}{example:deletedmarkup:uwave}}
+ \file{examples/changes.example.deletedmarkup.dashuline.tex}{\from{examples.dtx}{example:deletedmarkup:dashuline}}
+ \file{examples/changes.example.deletedmarkup.dotuline.tex}{\from{examples.dtx}{example:deletedmarkup:dotuline}}
+ \file{examples/changes.example.deletedmarkup.sout.tex}{\from{examples.dtx}{example:deletedmarkup:sout}}
+ \file{examples/changes.example.deletedmarkup.xout.tex}{\from{examples.dtx}{example:deletedmarkup:xout}}
+ \file{examples/changes.example.deletedmarkup.bf.tex}{\from{examples.dtx}{example:deletedmarkup:bf}}
+ \file{examples/changes.example.deletedmarkup.it.tex}{\from{examples.dtx}{example:deletedmarkup:it}}
+ \file{examples/changes.example.deletedmarkup.sl.tex}{\from{examples.dtx}{example:deletedmarkup:sl}}
+ \file{examples/changes.example.deletedmarkup.em.tex}{\from{examples.dtx}{example:deletedmarkup:em}}
+ \file{examples/changes.example.deletedmarkup.wrong.tex}{\from{examples.dtx}{example:deletedmarkup:wrong}}
+%
+ \file{examples/changes.example.commentmarkup.margin.tex}{\from{examples.dtx}{example:commentmarkup:margin}}
+ \file{examples/changes.example.commentmarkup.footnote.tex}{\from{examples.dtx}{example:commentmarkup:footnote}}
+ \file{examples/changes.example.commentmarkup.uwave.tex}{\from{examples.dtx}{example:commentmarkup:uwave}}
+ \file{examples/changes.example.commentmarkup.todo.tex}{\from{examples.dtx}{example:commentmarkup:todo}}
+%
+ \file{examples/changes.example.highlightmarkup.background.tex}{\from{examples.dtx}{example:highlightmarkup:background}}
+ \file{examples/changes.example.highlightmarkup.uuline.tex}{\from{examples.dtx}{example:highlightmarkup:uuline}}
+ \file{examples/changes.example.highlightmarkup.uwave.tex}{\from{examples.dtx}{example:highlightmarkup:uwave}}
+%
+ \file{examples/changes.example.setaddedmarkup.tex}{\from{examples.dtx}{example:setaddedmarkup}}
+ \file{examples/changes.example.setdeletedmarkup.tex}{\from{examples.dtx}{example:setdeletedmarkup}}
+ \file{examples/changes.example.setcommentmarkup.tex}{\from{examples.dtx}{example:setcommentmarkup}}
+ \file{examples/changes.example.sethighlightmarkup.tex}{\from{examples.dtx}{example:sethighlightmarkup}}
+%
+ \file{examples/changes.example.authormarkup.superscript.tex}{\from{examples.dtx}{example:authormarkup:superscript}}
+ \file{examples/changes.example.authormarkup.subscript.tex}{\from{examples.dtx}{example:authormarkup:subscript}}
+ \file{examples/changes.example.authormarkup.brackets.tex}{\from{examples.dtx}{example:authormarkup:brackets}}
+ \file{examples/changes.example.authormarkup.footnote.tex}{\from{examples.dtx}{example:authormarkup:footnote}}
+ \file{examples/changes.example.authormarkup.none.tex}{\from{examples.dtx}{example:authormarkup:none}}
+ \file{examples/changes.example.authormarkup.wrong.tex}{\from{examples.dtx}{example:authormarkup:wrong}}
+%
+ \file{examples/changes.example.authormarkupposition.left.tex}{\from{examples.dtx}{example:authormarkupposition:left}}
+ \file{examples/changes.example.authormarkupposition.right.tex}{\from{examples.dtx}{example:authormarkupposition:right}}
+ \file{examples/changes.example.authormarkupposition.wrong.tex}{\from{examples.dtx}{example:authormarkupposition:wrong}}
+%
+ \file{examples/changes.example.authormarkuptext.id.tex}{\from{examples.dtx}{example:authormarkuptext:id}}
+ \file{examples/changes.example.authormarkuptext.name.tex}{\from{examples.dtx}{example:authormarkuptext:name}}
+ \file{examples/changes.example.authormarkuptext.wrong.tex}{\from{examples.dtx}{example:authormarkuptext:wrong}}
+%
+ \file{examples/changes.example.defaultcolor.tex}{\from{examples.dtx}{example:defaultcolor}}
+%
+ \file{examples/changes.example.setauthormarkup.tex}{\from{examples.dtx}{example:setauthormarkup}}
+ \file{examples/changes.example.setauthormarkupposition.tex}{\from{examples.dtx}{example:setauthormarkupposition}}
+ \file{examples/changes.example.setauthormarkuptext.tex}{\from{examples.dtx}{example:setauthormarkuptext}}
+%
+ \file{examples/changes.example.settruncatewidth.tex}{\from{examples.dtx}{example:settruncatewidth}}
+%
+ \file{examples/changes.example.setsummarywidth.tex}{\from{examples.dtx}{example:setsummarywidth}}
+ \file{examples/changes.example.setsummarytowidth.tex}{\from{examples.dtx}{example:setsummarytowidth}}
+%
+ \file{examples/changes.example.setsocextension.tex}{\from{examples.dtx}{example:setsocextension}}
+%
+ \file{examples/changes.example.listofchanges.list.tex}{\from{examples.dtx}{example:listofchanges:list}}
+ \file{examples/changes.example.listofchanges.summary.tex}{\from{examples.dtx}{example:listofchanges:summary}}
+ \file{examples/changes.example.listofchanges.compactsummary.tex}{\from{examples.dtx}{example:listofchanges:compactsummary}}
+ \file{examples/changes.example.listofchanges.all.tex}{\from{examples.dtx}{example:listofchanges:all}}
+ \file{examples/changes.example.listofchanges.title.tex}{\from{examples.dtx}{example:listofchanges:title}}
+ \file{examples/changes.example.listofchanges.show.tex}{\from{examples.dtx}{example:listofchanges:show}}
+ \file{examples/changes.example.listofchanges.wrong.tex}{\from{examples.dtx}{example:listofchanges:wrong}}
+%
+ \file{examples/changes.example.packageoptions.todonotes.tex}{\from{examples.dtx}{example:packageoptions.todonotes}}
+ \file{examples/changes.example.packageoptions.truncate.tex}{\from{examples.dtx}{example:packageoptions.truncate}}
+ \file{examples/changes.example.packageoptions.ulem.tex}{\from{examples.dtx}{example:packageoptions.ulem}}
+ \file{examples/changes.example.packageoptions.xcolor.tex}{\from{examples.dtx}{example:packageoptions.xcolor}}
+%
+ \file{examples/changes.example.screenshot.tex}{\from{example-screenshot.dtx}{example:screenshot}}
}
\endinput
diff --git a/Master/texmf-dist/source/latex/changes/example-screenshot.dtx b/Master/texmf-dist/source/latex/changes/example-screenshot.dtx
index 251b4b5a7cb..7da50cf8892 100644
--- a/Master/texmf-dist/source/latex/changes/example-screenshot.dtx
+++ b/Master/texmf-dist/source/latex/changes/example-screenshot.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2018-2018
+% Copyright (C) 2018-2021
% Ekkart Kleinod (ekleinod@edgesoft.de)
% --------------------------------------------------------------------------
%
diff --git a/Master/texmf-dist/source/latex/changes/examples.dtx b/Master/texmf-dist/source/latex/changes/examples.dtx
index 78eaf393c1a..9dc8932bfaa 100644
--- a/Master/texmf-dist/source/latex/changes/examples.dtx
+++ b/Master/texmf-dist/source/latex/changes/examples.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2007-2019
+% Copyright (C) 2007-2021
% Ekkart Kleinod (ekleinod@edgesoft.de)
% --------------------------------------------------------------------------
%
@@ -57,6 +57,20 @@
\usepackage[final]{changes}
%</example:final>
%
+%<*example:commandnameprefix:none>
+\usepackage[commandnameprefix=none]{changes}
+%</example:commandnameprefix:none>
+%<*example:commandnameprefix:always>
+\usepackage[commandnameprefix=always]{changes}
+%</example:commandnameprefix:always>
+%<*example:commandnameprefix:ifneeded>
+\newcommand{\added}{Definition of added}
+\usepackage[commandnameprefix=ifneeded]{changes}
+%</example:commandnameprefix:ifneeded>
+%<*example:commandnameprefix:wrong>
+\usepackage[commandnameprefix=wrong]{changes}
+%</example:commandnameprefix:wrong>
+%
%<*example:markup:default>
\usepackage[markup=default]{changes}
%</example:markup:default>
@@ -209,6 +223,10 @@
\usepackage[authormarkuptext=wrong]{changes}
%</example:authormarkuptext:wrong>
%
+%<*example:defaultcolor>
+\usepackage[defaultcolor=magenta]{changes}
+%</example:defaultcolor>
+%
%<*example:packageoptions.todonotes>
\usepackage[todonotes={textsize=tiny}]{changes}
%</example:packageoptions.todonotes>
@@ -229,7 +247,7 @@
\setdeletedmarkup{\emph{#1}}
%</example:setdeletedmarkup>
%<*example:setcommentmarkup>
-\setcommentmarkup{\ifthenelse{\isColored}{\color{authorcolor}}{}---~\ifthenelse{\isAnonymous{#2}}{}{\textbf{#3} }#1~---}
+\setcommentmarkup{\IfIsColored{\color{authorcolor}}{}---~\IfIsAnonymous{#2}{}{\textbf{#3} }#1~---}
%</example:setcommentmarkup>
%<*example:sethighlightmarkup>
\sethighlightmarkup{\emph{#1}}
@@ -279,7 +297,7 @@
%<example:listofchanges:summary>\verb|\listofchanges[style=summary]|
%<example:setaddedmarkup>\verb|\setaddedmarkup{\emph{#1}}|
%<example:setdeletedmarkup>\verb|\setdeletedmarkup{\emph{#1}}|
-%<example:setcommentmarkup>\verb|\setcommentmarkup{\ifthenelse{\isColored}{\color{authorcolor}}{}---~\ifthenelse{\isAnonymous{#2}}{}{\textbf{#3} }#1~---}|
+%<example:setcommentmarkup>\verb|\setcommentmarkup{\IfIsColored{\color{authorcolor}}{}---~\IfIsAnonymous{#2}{}{\textbf{#3} }#1~---}|
%<example:sethighlightmarkup>\verb|\sethighlightmarkup{\emph{#1}}|
%<example:setauthormarkup>\verb|\setauthormarkup{\xout{#1}}|
%<example:setauthormarkupposition>\verb|\setauthormarkupposition{left}|
diff --git a/Master/texmf-dist/source/latex/chessboard/chessboard.dtx b/Master/texmf-dist/source/latex/chessboard/chessboard.dtx
index 0ba57af48a4..dc0cbe0d6c7 100644
--- a/Master/texmf-dist/source/latex/chessboard/chessboard.dtx
+++ b/Master/texmf-dist/source/latex/chessboard/chessboard.dtx
@@ -1,7 +1,6 @@
%<*chessboard>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{chessboard}[2019/06/23 version v1.8 print chessboards]
-%%$Date: 2011/03/23 08:42:57 $$Version: 66142533647c $
+\ProvidesPackage{chessboard}[2020/11/01 version v1.9 print chessboards]
%1.4: Changed to restore style key
%1.5: corrected values for mover key (w/b instead of w/s)
@@ -9,6 +8,7 @@
% 14.3.2011: added \normallineskip=1pt\relax\normallineskiplimit=0pt\relax
% (default latex values).
% to avoid bad spacing in amsart.cls (see tex.stackexchange discussion)
+% 1.9. corrected area code, lists not always correctly processed
\DeclareOption{skaknew}{}%
\ProcessOptions
@@ -1436,7 +1436,7 @@
%</chessboard>
%<*chessboard-pgf>
-\ProvidesFile{chessboard-pgf.sty}[2019/06/23 version v1.8 pgf code for chessboard.sty]
+\ProvidesFile{chessboard-pgf.sty}[2020/11/01 version v1.9 pgf code for chessboard.sty]
%%$Date: 2011/01/11 14:07:20 $$Version: 3d9f59c743f1 $
\newcommand\board@pgf@extrabackground{}%
@@ -2553,7 +2553,7 @@
%</chessboard-pgf>
%<*chessboard-keys-main>
-\ProvidesFile{chessboard-keys-main.sty}[2019/06/23 version v1.8 key definitions for chessboard.sty]
+\ProvidesFile{chessboard-keys-main.sty}[2020/11/01 version v1.9 key definitions for chessboard.sty]
%%$Date: 2011/03/23 08:42:57 $$Version: 66142533647c $
%%file=Linie=column=vertikal=al_f_abetisch= a-h
@@ -3475,7 +3475,7 @@
{\board@do@cleararea{\board@temp@curarea}}}%
\define@key[UFCB]{glofill}{cleararea}{% D
- \board@do@l@addto@macro\board@val@savedkeylist{,cleararea=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,cleararea={#1}}}%
\define@key[UFCB]{locfill}{clearareas}{% D
\edef\board@temp@list{#1}%
@@ -3483,7 +3483,7 @@
{\board@do@cleararea{\board@temp@curarea}}}%
\define@key[UFCB]{glofill}{clearareas}{% D
- \board@do@l@addto@macro\board@val@savedkeylist{,clearareas=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,clearareas={#1}}}%
\define@key[UFCB]{locfill}{clearboard}[true]{%D
\edef\board@temp@curstartfield{\board@val@minfilechar\board@val@maxranknum}%
@@ -3561,7 +3561,7 @@
\board@do@hidearea{#1}}%
\define@key[UFCB]{glofill}{hidearea}{% D
- \board@do@l@addto@macro\board@val@savedkeylist{,hidearea=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,hidearea={#1}}}%
\define@key[UFCB]{locfill}{hideareas}{% D
\edef\board@temp@list{#1}%
@@ -3569,7 +3569,7 @@
{\board@do@hidearea{\board@temp@curarea}}}%
\define@key[UFCB]{glofill}{hideareas}{% D
- \board@do@l@addto@macro\board@val@savedkeylist{,hideareas=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,hideareas={#1}}}%
\define@key[UFCB]{locfill}{hideboard}[true]{% D
\edef\board@temp@curstartfield{\board@val@minfilechar\board@val@maxranknum}%
@@ -3683,7 +3683,7 @@
\board@do@showarea{#1}}%
\define@key[UFCB]{glofill}{showarea}{%
- \board@do@l@addto@macro\board@val@savedkeylist{,showarea=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,showarea={#1}}}%
\define@key[UFCB]{locfill}{showareas}{% D
\edef\board@temp@list{#1}%
@@ -3691,7 +3691,7 @@
{\board@do@showarea{\board@temp@curarea}}}%
\define@key[UFCB]{glofill}{showareas}{% D
- \board@do@l@addto@macro\board@val@savedkeylist{,showareas=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,showareas={#1}}}%
\define@key[UFCB]{locfill}{showboard}[true]{%
\edef\board@temp@curstartfield{\board@val@minfilechar\board@val@maxranknum}%
@@ -3785,7 +3785,7 @@
\let\board@val@startfenranknum\board@temp@curranknum}%
\define@key[UFCB]{glofill}{startfen}{% D
- \board@do@l@addto@macro\board@val@savedkeylist{,startfen=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,startfen={#1}}}%
\define@key[UFCB]{locfill}{startfill}{% D
\expandafter\board@split@field#1ARGEND%
@@ -3794,7 +3794,7 @@
\let\board@val@startfillranknum\board@temp@curranknum}%
\define@key[UFCB]{glofill}{startfill}{% D
- \board@do@l@addto@macro\board@val@savedkeylist{,startfill=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,startfill={#1}}}%
\define@key[UFCB]{locfill}{stopfill}{% D
\expandafter\board@split@field#1ARGEND%
@@ -3803,7 +3803,7 @@
\let\board@val@stopfillranknum\board@temp@curranknum}%
\define@key[UFCB]{glofill}{stopfill}{% D
- \board@do@l@addto@macro\board@val@savedkeylist{,startfill=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,startfill={#1}}}%
\define@key[UFCB]{locfill}{fillarea}{% a7-f1 %D
\expandafter\board@split@areasort#1ARGEND%
@@ -3811,7 +3811,7 @@
startfill=\board@temp@curstartfield, stopfill=\board@temp@curstopfield}}%
\define@key[UFCB]{glofill}{fillarea}{% D
- \board@do@l@addto@macro\board@val@savedkeylist{,fillarea=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,fillarea={#1}}}%
%%%
%% setting pieces with fen
@@ -3986,7 +3986,7 @@
\board@do@empharea{#1}}%
\define@key[UFCB]{glofill}{empharea}{% D
- \board@do@l@addto@macro\board@val@savedkeylist{,empharea=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,empharea={#1}}}%
\define@key[UFCB]{locfill}{emphareas}{% D
\XKV@sp@deflist\board@templist{#1}%
@@ -4020,7 +4020,7 @@
\define@key[UFCB]{locfill}{emphrank}{% D
\board@do@setsinglekeys*[UFCB]{locfill}{%
- emphranks=#1}}%
+ emphranks={#1}}}%
\define@key[UFCB]{glofill}{emphrank}{%D
\board@do@l@addto@macro\board@val@savedkeylist{,emphrank={#1}}}%
@@ -4038,10 +4038,10 @@
\define@key[UFCB]{locfill}{emphfile}{% D
\board@do@setsinglekeys*[UFCB]{locfill}{%
- emphfiles=#1}}%
+ emphfiles={#1}}}%
\define@key[UFCB]{glofill}{emphfile}{%D
- \board@do@l@addto@macro\board@val@savedkeylist{,emphfile=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,emphfile={#1}}}%
\define@key[UFCB]{locfill}{emphfields}{% D
\edef\board@temp@list{#1}%
@@ -4054,10 +4054,10 @@
\define@key[UFCB]{locfill}{emphfield}{% D
\board@do@setsinglekeys*[UFCB]{locfill}{%
- emphfields=#1}}%
+ emphfields={#1}}}%
\define@key[UFCB]{glofill}{emphfield}{%D
- \board@do@l@addto@macro\board@val@savedkeylist{,emphfield=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,emphfield={#1}}}%
\define@key[UFCB]{locfill}{colorpieces}{% D
\PackageWarning{chessboard}{The key colorpieces doesn't work anymore. \MessageBreak
@@ -4078,7 +4078,7 @@
%</chessboard-keys-main>
%<*chessboard-keys-pgf>
-\ProvidesFile{chessboard-keys-pgf.sty}[2019/06/23 version v1.8 key definitions for chessboard.sty]
+\ProvidesFile{chessboard-keys-pgf.sty}[2020/11/01 version v1.9 key definitions for chessboard.sty]
%%$Date: 2011/03/17 13:42:38 $$Version: e7ec1b100ede $
%% new 1.5.: style keys for curvemove
@@ -4302,7 +4302,7 @@
\fi}%
\define@key[UFCB]{glofill}{trimarea}{%
- \board@do@l@addto@macro\board@val@savedkeylist{,trimarea=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,trimarea={#1}}}%
\define@boolkey[UFCB]{locfill}{captrimtoprint}[true]{}%
@@ -5007,14 +5007,14 @@
\board@do@l@addto@macro\board@val@savedkeylist{,applycolor=#1}}%
\define@key[UFCB]{locfill}{colorbackarea}{% D
- \board@do@setsinglekeys*[UFCB]{locfill}{colorbackareas=#1}}%
+ \board@do@setsinglekeys*[UFCB]{locfill}{colorbackareas={#1}}}%
\define@key[UFCB]{glofill}{colorbackarea}{% D
- \board@do@l@addto@macro\board@val@savedkeylist{,colorbackarea=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,colorbackarea={#1}}}%
\define@key[UFCB]{locfill}{colorbackareas}{% D
\let\board@pgf@savebackstyle\board@pgf@curbackstyle
- \board@do@setsinglekeys*[UFCB]{locfill}{backstyle=color,backareas=#1,backstyle=\board@pgf@savebackstyle}}%
+ \board@do@setsinglekeys*[UFCB]{locfill}{backstyle=color,backareas={#1},backstyle=\board@pgf@savebackstyle}}%
\define@key[UFCB]{glofill}{colorbackareas}{% D
\board@do@l@addto@macro\board@val@savedkeylist{,colorbackareas={#1}}}%
@@ -5048,7 +5048,7 @@
\define@key[UFCB]{locfill}{colorbackrank}{% D
\board@do@setsinglekeys*[UFCB]{locfill}{%
- colorbackranks=#1}}%
+ colorbackranks={#1}}}%
\define@key[UFCB]{glofill}{colorbackrank}{%D
\board@do@l@addto@macro\board@val@savedkeylist{,colorbackrank={#1}}}%
@@ -5066,7 +5066,7 @@
\define@key[UFCB]{locfill}{colorbackfile}{% D
\board@do@setsinglekeys*[UFCB]{locfill}{%
- colorbackfiles=#1}}%
+ colorbackfiles={#1}}}%
\define@key[UFCB]{glofill}{colorbackfile}{%D
\board@do@l@addto@macro\board@val@savedkeylist{,colorbackfile={#1}}}%
@@ -5124,11 +5124,11 @@
\define@key[UFCB]{locfill}{pgfborder}[\printarea]{%
\edef\board@pgf@savebackstyle{\board@pgf@curbackstyle}%
\board@do@setsinglekeys*[UFCB]{locfill}{%
- backstyle=border,backregions=#1}%
+ backstyle=border,backregions={#1}}%
\expandafter\board@do@setsavedkey\expandafter{\board@pgf@savebackstyle}{backstyle}}%
\define@key[UFCB]{glofill}{pgfborder}[\printarea]{% %D
- \board@do@l@addto@macro\board@val@savedkeylist{,pgfborder=#1}}%
+ \board@do@l@addto@macro\board@val@savedkeylist{,pgfborder={#1}}}%
%</chessboard-keys-pgf>
diff --git a/Master/texmf-dist/source/latex/chhaya/chhaya.dtx b/Master/texmf-dist/source/latex/chhaya/chhaya.dtx
new file mode 100644
index 00000000000..43940f990ed
--- /dev/null
+++ b/Master/texmf-dist/source/latex/chhaya/chhaya.dtx
@@ -0,0 +1,224 @@
+% \iffalse meta-comment
+%
+% File: chhaya.dtx
+% ---------------------------------------------------------------------------
+% आज्ञासंच: chhaya
+% लेखक: निरंजन
+% माहिती: भाषावैज्ञानिक छायांगांचे संक्षेप पुरवणारा आज्ञासंच
+% दुवा: https://gitlab.com/niranjanvikastambe/chhaya
+% अडचणी: https://gitlab.com/niranjanvikastambe/chhaya/-/issues
+% परवाना: लाटेक् प्रकल्प परवाना. आवृत्ती १.३सी किंवा त्यापुढील.
+% ---------------------------------------------------------------------------
+% हे काम लाटेक् प्रकल्प परवान्याच्या अटींचे पालन करून वितरित केले जाऊ शकते
+% तसेच सुधारले जाऊ शकते.
+%
+% ह्या परवान्याची नवीनतम आवृत्ती पुढील संकेतस्थळावरून मिळवता येऊ शकते.
+%
+% http://www.latex-project.org/lppl.txt.
+%
+% हा आज्ञासंचाची लाटेक् प्रकल्पाच्या नियमांनुसार देखरेख केली जात आहे.
+%
+% ह्या आज्ञासंचाचा लेखक व पालक निरंजन आहे.
+%
+% ह्या कामात chhaya.dtx, chhaya.ins तसेच त्यांपासून निर्माण केलेली
+% chhaya.sty ही धारिका समाविष्ट आहे.
+% ---------------------------------------------------------------------------
+%
+% \fi
+% \iffalse
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+आज्ञासंच: chhaya
+लेखक: निरंजन
+आवृत्ती: ०.२ (१३ ऑगस्ट, २०२०)
+माहिती: भाषावैज्ञानिक छायांगांचे संक्षेप पुरवणारा आज्ञासंच
+दुवा: https://gitlab.com/niranjanvikastambe/chhaya
+अडचणी: https://gitlab.com/niranjanvikastambe/chhaya/-/issues
+परवाना: लाटेक् प्रकल्प परवाना. आवृत्ती १.३सी किंवा त्यापुढील.
+
+अधिक माहितीकरिता chhaya.dtx ही बीजधारिका पाहा.
+--------------------------------------------------------------------------
+Package: chhaya
+Author: Niranjan
+Version: 0.1 (13 August, 2020)
+Description: For linguistic glossing in Marathi language.
+Repository: https://gitlab.com/niranjanvikastambe/chhaya
+Bug tracker: https://gitlab.com/niranjanvikastambe/chhaya/-/issues
+License: The LaTeX Project Public License v1.3c or later.
+--------------------------------------------------------------------------
+%</readme>
+%<*internal>
+\fi
+%</internal>
+%<*driver>
+\documentclass[10pt]{l3doc}
+\usepackage{xltxtra}
+\usepackage{marathi}
+\usepackage{xcolor}
+\usepackage{hyperref}
+\hypersetup{
+ colorlinks,
+ linkcolor={red!50!black},
+ citecolor={blue!50!black},
+ urlcolor={blue!80!black}
+}
+\usepackage{capt-of}
+\renewcommand{\tablename}{कोष्टक}
+\usepackage{standalone}
+\makeatletter
+\RequirePackage{devanagaridigits}
+\def\@arabic#1{\expandafter\devanagaridigits\expandafter{\number#1}}
+\makeatother
+\renewcommand{\theCodelineNo}{{\scriptsize\arabic{CodelineNo}}\quad}
+\setmonofont[Script=Devanagari]{Mukta}
+\newfontfamily{\mukta}[Script=Devanagari]{Mukta}
+\newfontfamily{\sho}{Shobhika}
+\usepackage{minted}
+\usemintedstyle{bw}
+\usepackage{fontawesome5}
+\renewcommand{\abstractname}{सारांश}
+\renewcommand{\contentsname}{अनुक्रमणिका}
+\usepackage[sort=use,nonumberlist]{glossaries}
+\usepackage{biblatex}
+\addbibresource{ref.bib}
+\usepackage{longtable}
+\usepackage{standalone}
+\makenoidxglossaries
+\usepackage{setspace}
+\sloppy
+\hyphenpenalty=10000
+\exhyphenpenalty=1000
+
+\RecordChanges
+\begin{document}
+\setstretch{1.5}
+\DocInput{chhaya.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+%
+% \title{छाया}
+% \author{निरंजन}
+% \date^^A
+% {^^A
+% आवृत्ती ०.२ \textemdash\ १३ ऑगस्ट, २०२०\\[1ex]^^A
+% {\small\faIcon{gitlab}\quad\url{https://gitlab.com/niranjanvikastambe/chhaya}}^^A
+% }
+%
+% \maketitle
+%
+% \begin{abstract}
+% भाषावैज्ञानिक लेखनात अपरिचित भाषांतील उदाहरणांची छाया देणे ही एक अनिवार्य गोष्ट आहे. त्यासाठीच्या संक्षेपांचा संग्रह ह्या आज्ञासंचात करण्यात आला आहे. इंग्रजी छायांगांचे संक्षेप \href{https://ctan.org/pkg/leipzig?lang=en}{leipzig} ह्या आज्ञासंचामार्फत पुरवले जातात. लायप्चिश् विद्यापीठाच्या नियमावलीनुसार लागणाऱ्या अनेक निकषांची पूर्तता ह्या आज्ञासंचातर्फे केली जाते. मराठी भाषावैज्ञानिक लेखनाकरिता छायांगलेखनाचे नवे नियम मुंबई विद्यापीठाच्या संकेतस्थळावर \href{https://www.mumbailinguisticcircle.com/resources/}{येथे} देण्यात आले आहेत \cite{मुंबई}. त्यांचा विचार करून हा आज्ञासंच घडवण्यात आला आहे. ह्या आज्ञासंचात काही छायांगांच्या तयार आज्ञा आहेतच, शिवाय लेखकांना गरजेनुसार नवी छायांगे निर्माण करण्यासाठी एक आज्ञादेखील आहे. \href{https://ctan.org/pkg/hyperref?lang=en}{hyperref} हा आज्ञासंच वापरत असाल, तर छाया हा आज्ञासंच त्यानंतर वापरा.
+% \end{abstract}
+% \tableofcontents
+% \clearpage\pagebreak
+% \begin{documentation}
+% \begin{function}{\छायांग}
+% \begin{syntax}
+% \cs{छायांग}\marg{संक्षिप्त रूप}\marg{विस्तृत वर्णन}
+% \end{syntax}
+% ह्या आज्ञेचा पहिला कार्यघटक छायांगाचे संक्षिप्त रूप हा आहे व दुसरा कार्यघटक त्या छायांगाचे स्पष्टीकरणात्मक वर्णन. उदा. एकवचनासाठीचे \textbf{एव} हे छायांग पुढीलप्रमाणे घडवता येते.
+%
+% \noindent\verb|\छायांग{एव}{एकवचन}|
+% \end{function}
+% \begin{function}{\छायांगसूची}
+% ही आज्ञा वापरल्यास दस्तऐवजातील सर्व छायांगांची यादी छापली जाते. आज्ञासंचातर्फे ह्या यादीचे नाव छायांगसूची असे ठेवले आहे.
+% \end{function}
+% \begin{function}{समरेखा}
+% छायालेखनाच्या नियमावलीतील तिसऱ्या नियमानुसार मजकूर पारंपरिक टंकात असेल, तर छायांगांकरिता समरेखा टंक वापरण्यात यावेत व मजकूर समरेखा टंकात असेल, तर छायांगांकरिता पारंपरिक टंक वापरावेत. पारंपरिक टंक देवनागरी लिहिताना जास्त वापरले जात असल्यामुळे ह्या आज्ञासंचाद्वारे मुक्त हा समरेखा टंक छायांगांसाठी निवडण्यात आला आहे. हा टंक तुमच्याकडे नसेल, तर \href{https://ctan.org/pkg/ektype-tanka}{एक-टाईप टंक} हा आज्ञासंच तुमच्या संगणकावर बसवून घ्या. मजकूर समरेखा टंकात लिहीत असाल, तर आज्ञासंचासह \textbf{समरेखा} हे प्राचल वापरा. त्यामुळे छायांगांकरिता शोभिका हा पारंपरिक टंक निवडला जाईल. ह्या प्राचलास किंमत देता येते. \verb|समरेखा = <टंकाचे नाव>| अशा प्रकारे हे प्राचल लिहिल्यास छायांगांचा टंक आपल्या पसंतीनुसार निवडता येतो.
+% \end{function}
+% \bigskip
+% \noindent\textbf{महत्त्वाची सूचना} - दोन छायांगांमध्ये मोकळी जागा हवी असल्यास छायांगानंतर महिरपी कंस टाकण्यात यावेत. उदा. \verb|\एव{}|.
+% \section{आज्ञासंचातील छायांगे {\small (आ ०.१)}}
+%\begin{longtable}{lll}
+% \hline
+% छायांग & वर्णन \\
+% \hline
+% पुं & पुल्लिंग\\
+% स्त्री & स्त्रीलिंग\\
+% नपुं & नपुंसकलिंग\\
+% १ & प्रथम व्यक्ती\\
+% २ & द्वितीय व्यक्ती\\
+% ३ & तृतीय व्यक्ती\\
+% एव & एकवचन\\
+% द्विव & द्विवचन\\
+% त्रिव & त्रिव\\
+% अव & अल्पवचन\\
+% बव & बहुवचन\\
+% अवि & अभिधानपर विभक्ती\\
+% कर्मवि & कर्मपर विभक्ती\\
+% सा & साधनपर विभक्ती\\
+% दावि & दानपर विभक्ती\\
+% वियो & वियोगपर विभक्ती\\
+% संयो & संबंधयोजक विभक्ती\\
+% अधि & अधिकरण विभक्ती\\
+% संबो & संबोधन विभक्ती\\
+% साह & साहचर्यदर्शक विभक्ती\\
+% कवि & कर्तृत्वपर विभक्ती\\
+% आवि & आगत विभक्ती\\
+% साक्रि & साहाय्यक क्रियापद\\
+% गणक & गणक\\
+% भूत & भूतकाळ\\
+% वर्त & वर्तमान काळ\\
+% भवि & भविष्यकाळ\\
+% पू & पूर्ण\\
+% अपू & अपूर्ण\\
+% नि & नित्य\\
+% अखं & अखंडित\\
+% क्र & क्रमिक\\
+% अक्र & अक्रमिक\\
+% \end{longtable}
+% \end{documentation}
+% \begin{implementation}
+% \section{आज्ञासंचाची घडण}
+% आज्ञासंचाकरिता आवश्यक सामग्री पुढील आज्ञांद्वारे पुरवली आहे.
+% \begin{macrocode}
+%<*package>
+\ProvidesPackage{chhaya}[2020-08-13 v0.2 भाषावैज्ञानिक छायांगे पुरवणारा आज्ञासंच]
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{fontspec}
+\RequirePackage[acronym]{glossaries}
+% \end{macrocode}
+% समरेखा हे प्राचल पुढील आज्ञावलीमार्फत पुरवले जाते.
+% \begin{macrocode}
+\pgfkeys{
+ chhaya/.is family,
+ chhaya/.cd,
+ समरेखा/.code={\setfontfamily\test@acronymfont[Script=Devanagari,Mapping=devanagarinumerals]{#1}},
+ समरेखा=Mukta,
+ समरेखा/.default=Shobhika,
+}
+\DeclareTextFontCommand{\textacronym}{\test@acronymfont}
+\def\chhaya@setkey#1{\pgfkeys{chhaya/.cd,#1}}
+\DeclareOption*{\expandafter\chhaya@setkey\expandafter{\CurrentOption}}
+\ProcessOptions
+% \end{macrocode}
+% नव्या छायांगांकरिता आज्ञेची निर्मिती पुढील आज्ञेने होते.
+% \begin{macrocode}
+\newcommand{\छायांग}[2]
+{
+ \newacronym{#1}{\textacronym{#1}}{#2}
+ \expandafter\newcommand\csname#1\endcsname{\acrshort{#1}}
+}
+% \end{macrocode}
+% \verb|sankshep.tex| ह्या धारिकेत काही छायांगे पुरवली आहेत. त्यांना पुढील आज्ञांमुळे वापरता येते.
+% \begin{macrocode}
+\makeglossaries
+\input{sankshep.tex}
+% \end{macrocode}
+% छायांगसूची छापण्यासाठी पुढील आज्ञा समाविष्ट केली आहे.
+% \begin{macrocode}
+\providecommand{\छायांगसूची}{
+ \printglossary[type=\acronymtype,title={छायांगसूची}]
+}
+% \end{macrocode}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+% \end{implementation}
+% \printbibliography
+% \Finale \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/chhaya/chhaya.ins b/Master/texmf-dist/source/latex/chhaya/chhaya.ins
new file mode 100644
index 00000000000..527101783e5
--- /dev/null
+++ b/Master/texmf-dist/source/latex/chhaya/chhaya.ins
@@ -0,0 +1,56 @@
+% File: chhaya.ins
+\input l3docstrip.tex
+
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+-------------------------------------------------------------------------
+आज्ञासंच: chhaya
+लेखक: निरंजन
+आवृत्ती: ०.२ (१३ ऑगस्ट, २०२०)
+माहिती: भाषावैज्ञानिक छायांगांचे संक्षेप पुरवणारा आज्ञासंच
+दुवा: https://gitlab.com/niranjanvikastambe/chhaya
+अडचणी: https://gitlab.com/niranjanvikastambe/chhaya/-/issues
+परवाना: लाटेक् प्रकल्प परवाना. आवृत्ती १.३सी किंवा त्यापुढील.
+
+अधिक माहितीकरिता chhaya.dtx ही बीज-धारिका पाहा.
+---------------------------------------------------------------------------
+हे काम लाटेक् प्रकल्प परवान्याच्या (१.३सी अथवा त्यापुढील) अटींचे पालन करून वितरित केले जाऊ शकते
+तसेच सुधारले जाऊ शकते.
+
+ह्या परवान्याची नवीनतम प्रत खालील दुव्यावर उपलब्ध आहे.
+
+http://www.latex-project.org/lppl.txt.
+
+हा आज्ञासंचाची लाटेक् प्रकल्पाच्या नियमांनुसार देखरेख केली जात आहे.
+
+ह्या आज्ञासंचाचा लेखक व पालक निरंजन आहे.
+
+ह्या कामात chhaya.dtx, chhaya.ins तसेच त्यांपासून निर्माण केलेली
+chhaya.sty ही धारिका समाविष्ट आहे.
+--------------------------------------------------------------------------
+Package: chhaya
+Author: Niranjan
+Version: 0.2 (13 August, 2020)
+Description: For linguistic glossing in Marathi language.
+Repository: https://gitlab.com/niranjanvikastambe/chhaya
+Bug tracker: https://gitlab.com/niranjanvikastambe/chhaya/-/issues
+License: The LaTeX Project Public License v1.3c or later.
+---------------------------------------------------------------------------
+
+\endpreamble
+
+\usedir{tex/latex/\jobname}
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+
+\nopreamble\nopostamble
+\usedir{doc/latex/\jobname}
+\generate{
+ \file{README.txt}{\from{\jobname.dtx}{readme}}
+}
+
+\endbatchfile \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/clefval/Makefile b/Master/texmf-dist/source/latex/clefval/Makefile
deleted file mode 100644
index 801ba0b9c43..00000000000
--- a/Master/texmf-dist/source/latex/clefval/Makefile
+++ /dev/null
@@ -1,190 +0,0 @@
-# ---------------------------------------------------------------
-# Makefile for the paresse package by Y. Henel
-# modified version of the Makefile of the kerntest package
-# many thanks to Harald Harders whose kerntest.xml I have also
-# hacked to obtain my paresse.xml
-#
-# documentation bilingue / bilingual documentation
-# ---------------------------------------------------------------
-
-SRCDIR=clefval
-INSTALLDIR=`kpsewhich --expand-path='$$TEXMFLOCAL'`/tex/latex/clefval
-DOCDIR=`kpsewhich --expand-path='$$TEXMFLOCAL'`/doc/latex/clefval
-SOURCEDIR=`kpsewhich --expand-path='$$TEXMFLOCAL'`/source/latex/clefval
-VERSION=0
-
-TEX= clefval.sty \
-
-DOC= clefval.pdf \
-
-
-FRADOC= \
- LISEZMOI \
- Changements \
- exemple.pdf \
- exemple.tex \
-
-ENGDOC= \
- README \
- Changes \
- example.pdf \
- example.tex \
-
-SOURCE= \
- Makefile \
- clefval.dtx \
- clefval.ins \
- fra-clefval.ins \
-
-XML= clefval.xml \
-
-# ---------------------------------------------------------------
-
-.SUFFIXES: .sty .ins .dtx .dvi .ps .pdf
-
-# ---------------------------------------------------------------
-.ins.sty:
- latex $<
-
-.dtx.pdf:
- pdflatex $<
- makeindex -s gind.ist $(*D)/$(*F)
- makeindex -s gglo.ist -o $(*D)/$(*F).gls $(*D)/$(*F).glo
- pdflatex $<
-
-.tex.pdf:
- pdflatex $<
- pdflatex $<
-
-.dvi.ps:
- dvips -o $(*D)/$(*F).ps $(*D)/$(*F)
-
-# ---------------------------------------------------------------
-
-sty:
- @-rm -f clefval.sty
- @-latex clefval.ins
-
-eng-sty: sty
-
-fra-sty:
- @-rm -f clefval.sty
- @-latex fra-clefval.ins
-
-# ---------------------------------------------------------------
-
-help:
- @-echo "******************************************************"
- @-echo "* Choisir une des options :"
- @-echo "= Choose one of the options:"
- @-echo "* 'doc' -> clefval.pdf"
- @-echo "* 'fra-sty' -> clefval.sty (version française du module)"
- @-echo "* 'sty' -> clefval.sty (English version of the package)"
- @-echo "* 'dist'-> clefval.sty & doc"
- @-echo "* 'clean' petit nettoyage"
- @-echo "* 'distclean' (encore plus propre)"
- @-echo "* 'tar' -> clefval-VERSION.tar.gz"
- @-echo "* 'install-fra' pour l'installation "
- @-echo "* de l'extension francisée et de la documentation."
- @-echo "************ OU / OR ***********"
- @-echo "= 'install-eng' for an installation"
- @-echo "= of the English version of package and documentation."
- @-echo "************ NOTA BENE ***********"
- @-echo "* l'installation est faite par defaut dans TEXMFLOCAL "
- @-echo "= by default installs in TEXMFLOCAL"
- @-echo "* c'est a dire :"
- @-echo "* that is: "
- @-echo `kpsewhich --expand-path='$$TEXMFLOCAL'`
- @-echo "******************************************************"
-
-dist: sty clefval.pdf
-
-# ---------------------------------------------------------------
-
-clean:
- @-rm -f clefval.glo clefval.gls clefval.idx clefval.ilg
- @-rm -f clefval.ind clefval.aux clefval.log clefval.toc
- @-rm -f fra-clefval.log
- @-rm -f clefval.dvi clefval.ps
- @-rm -f exemple.aux exemple.log exemple.dvi exemple.ps
- @-rm -f example.aux example.log example.dvi example.ps
- @-rm -f *~
-
-distclean: clean
- @-rm -f clefval.sty
- @-rm -f clefval.pdf
-
-# ---------------------------------------------------------------
-
-tar: dist clean
- echo clefval-$(VERSION).tar.gz
- -rm -f clefval-$(VERSION).tar.gz
- tar czCf .. clefval-$(VERSION).tar.gz \
- $(SRCDIR)/README \
- $(SRCDIR)/LISEZMOI \
- $(SRCDIR)/Changes \
- $(SRCDIR)/Changements \
- $(SRCDIR)/Makefile \
- $(SRCDIR)/clefval.dtx \
- $(SRCDIR)/clefval.sty \
- $(SRCDIR)/clefval.ins \
- $(SRCDIR)/fra-clefval.ins \
- $(SRCDIR)/clefval.pdf \
- $(SRCDIR)/exemple.pdf \
- $(SRCDIR)/example.pdf \
- $(SRCDIR)/exemple.tex \
- $(SRCDIR)/example.tex \
- $(SRCDIR)/clefval.xml
-
-# ---------------------------------------------------------------
-
-texlive: sty doc clean
- @-rm -rf texmf
- mkdir -p texmf/tex/latex/clefval
- mkdir -p texmf/doc/latex/clefval
- mkdir -p texmf/source/latex/clefval
- mkdir -p texmf/doc/html/catalogue/entries
- cp $(TEX) texmf/tex/latex/clefval
- cp $(DOC) texmf/doc/latex/clefval
- cp $(ENGDOC) texmf/doc/latex/clefval
- cp $(FRADOC) texmf/doc/latex/clefval
- cp $(SOURCE) texmf/source/latex/clefval
- cp $(XML) texmf/doc/html/catalogue/entries
-
-# ---------------------------------------------------------------
-
-zip: texlive
- -@rm -f clefval-$(VERSION).zip
- zip -r clefval-$(VERSION).zip texmf
- @-rm -r texmf/
-
-# ---------------------------------------------------------------
-
-install-fra: fra-sty doc
- if [ ! -d $(INSTALLDIR) ]; then mkdir -p $(INSTALLDIR); fi
- if [ ! -d $(DOCDIR) ]; then mkdir -p $(DOCDIR); fi
- if [ ! -d $(SOURCEDIR) ]; then mkdir -p $(SOURCEDIR); fi
- install -m644 $(TEX) $(INSTALLDIR)
- install -m644 $(DOC) $(DOCDIR)
- install -m644 $(FRADOC) $(DOCDIR)
- install -m644 $(SOURCE) $(SOURCEDIR)
- texhash
-# ---------------------------------------------------------------
-
-install-eng: eng-sty doc
- if [ ! -d $(INSTALLDIR) ]; then mkdir -p $(INSTALLDIR); fi
- if [ ! -d $(DOCDIR) ]; then mkdir -p $(DOCDIR); fi
- if [ ! -d $(SOURCEDIR) ]; then mkdir -p $(SOURCEDIR); fi
- install -m644 $(TEX) $(INSTALLDIR)
- install -m644 $(DOC) $(DOCDIR)
- install -m644 $(ENGDOC) $(DOCDIR)
- install -m644 $(SOURCE) $(SOURCEDIR)
- texhash
-# ---------------------------------------------------------------
-
-install: install-eng
-
-doc: sty clefval.pdf
-# ---------------------------------------------------------------
-# echu e an abaden
-# Le \TeX nicien de surface 2004-05-20
diff --git a/Master/texmf-dist/source/latex/clefval/clefval.dtx b/Master/texmf-dist/source/latex/clefval/clefval.dtx
index 67bbea73a8e..d8cc603b7c2 100644
--- a/Master/texmf-dist/source/latex/clefval/clefval.dtx
+++ b/Master/texmf-dist/source/latex/clefval/clefval.dtx
@@ -1,55 +1,51 @@
% \iffalse meta-comment
-% -*- mode: LaTeX; coding: iso-8859-15 -*-
%
-%%%% Copyright (C) 2004 by Josselin Noirel
-%%%% and Yvon Henel <Yvon.Henel@wanadoo.fr>
+%%%% Copyright (C) 2004, 2020 by Josselin Noirel
+%%%% and Yvon Henel aka Le TeXnicien de surface
%%%% --------------------------------------------------------
%
% This file may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.2
+% 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.2 or later is part of all distributions of LaTeX
-% version 1999/12/01 or later.
% \fi
%
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}
-%<package>\def\fileversion{v0}
-%<package>\def\filedate{2004/05/22}
+%<package>\def\fileversion{v0.1}
+%<package>\def\filedate{2020/07/27}
%<packfra>\def\fileinfo{d\'efinir et utiliser des paires cle/valeurs}
%<packeng>\def\fileinfo{define and use pair of key/values}
%<package>\ProvidesPackage{clefval}
%<package> [\filedate\space\fileversion\space\fileinfo]
%<*driver>
\documentclass[a4paper]{ltxdoc}
-\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{clefval}
\usepackage{xspace,url,multicol,ifthen}
\IfFileExists{lmodern.sty}{\usepackage{lmodern}}{}
-\usepackage[english,frenchb]{babel}
+\usepackage[english, main=french]{babel}
% commentez la ligne suivante pour avoir un document avec le code
-\OnlyDescription
+% \OnlyDescription
% comment out the preceding line to obtain the full code
% with explanations in French only, sorry.
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\makeatletter
-%%% quelques redfinition de commande de la classe ltxdoc.cls ou de
-%%% l'extension doc.sty pour une documentation en franais.
+%%% quelques redéfinition de commande de la classe ltxdoc.cls ou de
+%%% l'extension doc.sty pour une documentation en français.
\GlossaryPrologue{\section*{{Changements --
Changes}}\markboth{{Changements -- Changes}}{{Changements -- Changes}}}
\IndexPrologue{\section*{Index}\markboth{Index}{Index}%
\begin{Morciau}\selectlanguage{french}
- Les nombres en italique renvoient la page o l'entre est dcrite ; les
- nombres souligns renvoient la ligne de code de la dfinition ; les
- nombres en caractres romains renvoient la ligne de code o l'entre est
- utilise.\EnAnglais Numbers written in italic refer to the page where the
+ Les nombres en italique renvoient à la page où l'entrée est décrite ; les
+ nombres soulignés renvoient à la ligne de code de la définition ; les
+ nombres en caractères romains renvoient à la ligne de code où l'entrée est
+ utilisée.\EnAnglais Numbers written in italic refer to the page where the
corresponding entry is described; numbers underlined refer to the code
line of the definition; numbers in roman refer to the code line where the
entry is used.\end{Morciau}}
@@ -60,7 +56,7 @@
\special@index{environnements:\levelchar{%
\string\ttfamily\space#1}\encapchar main}\@esphack}
\makeatother
-\def\generalname{Gnral}
+\def\generalname{Général}
%%% fin de la francisation
\setlength{\columnseprule}{0.5pt}
\setlength{\multicolsep}{6pt plus 2.0pt minus 1.5pt}
@@ -109,7 +105,17 @@
%
% \GetFileInfo{clefval.sty}
%
-% \changes{v0}{2004/05/20}{1\iere version publique.}
+% \changes{v0}{2004/05/20}{1\iere version
+% publique. \textit{\foreignlanguage{english}{1st public version.}}}
+% \changes{v0.1}{2020/07/27}{Amélioration du message d'erreur dans le
+% document. \textit{\foreignlanguage{english}{Improved error message
+% in document.}}}
+% \changes{v0.1}{2020/07/27}{Version permettant l'utilisation du
+% codage utf-8 avec \texttt{pdflatex}, \texttt{lualatex} et
+% \texttt{xelatex}. \textit{\foreignlanguage{english}{This version can
+% be used in utf-8 encoded source with \texttt{pdflatex},
+% \texttt{lualatex} and \texttt{xelatex}.}}}
+
%
% \DoNotIndex{\newcommand, \renewcommand, \providecommand,^^A
% \def, \let,\csname, \endcsname, \afterassignment,^^A
@@ -133,7 +139,8 @@
% \textsf{clefval}}
%
% \author{Le \TeX nicien de
-% surface\thanks{\texttt{Yvon.Henel@wanadoo.fr}}\and Josselin Noirel}
+% surface\thanks{\texttt{le.texnicien.de.surface@yvon-henel.fr}}\and
+% Josselin Noirel}
%
% \maketitle
%
@@ -141,68 +148,96 @@
% \label{secIntro}
% \noindent\textbf{Description}\DescribeMacro{\TheKey}\DescribeMacro{\TheValue}
% \begin{Morciau}[Macros~publiques/Public~Macros]
-% Deux macros \cs{TheKey} et \cs{TheValue} pour dfinir puis utiliser
+% Deux macros \cs{TheKey} et \cs{TheValue} pour définir puis utiliser
% des paires clef/valeur.
% \EnAnglais
% Two macros \cs{TheKey} and \cs{TheValue} to define then use pairs
% of key/value.
% \end{Morciau}
% \begin{Morciau}[Syntaxe/Syntax]
-% \cs{TheKey}\marg{cl}\marg{valeur} pour dfinir la \emph{valeur}
-% associe la \emph{cl}, ne produit pas de texte ;
-% \cs{TheValue}\marg{cl} pour insrer la \emph{valeur} associe la
-% \emph{cl}.
+% \cs{TheKey}\marg{clé}\marg{valeur} pour définir la \emph{valeur}
+% associée à la \emph{clé}, ne produit pas de texte ;
+% \cs{TheValue}\marg{clé} pour insérer la \emph{valeur} associée à la
+% \emph{clé}.
% \EnAnglais
% \cs{TheKey}\marg{key}\marg{value} to define the \emph{value}
% associated to the \emph{key}, does not produce text ;
% \cs{TheValue}\marg{key} to insert the \emph{value} linked to the
% \emph{key}.
% \end{Morciau}
+%
+%
+% \subsection{Version 0.1}
+%
+% \begin{Morciau}
+% Edd \textsc{Barrett}, le 27 juillet 2020, a signalé sur
+% \texttt{stackexchange} un problème lié à l'utilisation de
+% \texttt{clefval}. C'est lui, également, qui a fourni un ECM et
+% trouvé la cause dudit problème: la présence d'un espace insécable
+% dans le fichier codé en \texttt{iso-8859-15} entrainait l'arrêt de
+% \LaTeX{} avec le message:
+% \EnAnglais
+% On the 27th July 2020, Edd \textsc{Barrett} wrote on
+% \texttt{stackexchange} about a problem linked to the use of
+% \texttt{clefval}. He also wrote a MCE and found the cause of the
+% said problem: an unbreakable space in the file encoded in
+% \texttt{iso-8859-15} forced \LaTeX{} to stop with the following
+% error message:
+% \end{Morciau}
+%
+% \texttt{Package inputenc Error: Invalid UTF-8 byte "A0.}
+%
+% \begin{Morciau}
+% Comme tout le travail avait été fait, il m'a été facile de
+% corriger l'erreur dans le code. J'en ai profité pour faire
+% apparaître, \emph{dans le document}, un message d'erreur plus
+% explicite nommant la clé indéfinie et pour moderniser un peu cette
+% extension.
+% \EnAnglais
+% As all the work was already done I easily wrote the correction in
+% the code. I've taken the opportunity to make appear, \emph{in the
+% document}, a more explicit error message in case of undefined key
+% and to modernise a bit this package.
+% \end{Morciau}
+%
% \section{Utilisation -- Usage}
%
-% \begin{Morciau}[Procd/Process]
-% Le procd mis en uvre par ce module est le mme que celui des
-% rfrences classiques de \LaTeX{} avec \cs{label} et \cs{ref}. Il
+% \begin{Morciau}[Procédé/Process]
+% Le procédé mis en œuvre par ce module est le même que celui des
+% références classiques de \LaTeX{} avec \cs{label} et \cs{ref}. Il
% faut donc deux compilations pour en voir l'effet.
% \EnAnglais
% \texttt{clefval} uses the process which \LaTeX's \cs{label} and \cs{ref}
% use. You must therefore compile twice to obtain the full effect.
% \end{Morciau}
% \begin{Morciau}
-% Lors de la 1\iere compilation, \cs{TheKey}\LB|{cl}|\LB|{valeur}| crit,
-% dans le fichier \texttt{aux}, \cs{newkey}\LB|{cl}|\LB|{{valeur}}|. |cl| et
-% |valeur| sont dvelopps moins qu'ils ne soient protgs soit pour avoir
-% t dclars robustes (voir \cs{DeclareRobustCommand}) soit pour avoir t
-% protgs (voir \cs{protect}) par vous.
+% Lors de la 1\iere compilation, \cs{TheKey}\LB|{clé}|\LB|{valeur}| écrit,
+% dans le fichier \texttt{aux}, \cs{newkey}\LB|{clé}|\LB|{valeur}|. |clé| et
+% |valeur| sont développés à moins qu'ils ne soient protégés soit pour avoir
+% été déclarés robustes (voir \cs{DeclareRobustCommand}) soit pour avoir été
+% protégés (voir \cs{protect}) par vous.
% \EnAnglais
% During the 1st run of \LaTeX, \cs{TheKey}\LB|{key}|\LB|{value}| writes
-% \cs{newkey}\LB|{key}|\LB|{{value}}| in the \texttt{aux} file. |key|
+% \cs{newkey}\LB|{key}|\LB|{value}| in the \texttt{aux} file. |key|
% and |value| are expanded unless they are protected since they have been
% declared robust (see \cs{DeclareRobustCommand}) or since they have been
% protected (see \cs{protect}) by you.
% \end{Morciau}
% \begin{Morciau}
-% Lors de la 2\ieme compilation, aprs lecture du fichier \texttt{aux},
-% \cs{TheValue}|{cl}| crit |valeur|.
+% Lors de la 2\ieme compilation, après lecture du fichier \texttt{aux},
+% \cs{TheValue}|{clé}| écrit |valeur|.
% \EnAnglais
% During the 2nd run, the \texttt{aux} file having been read,
% \cs{TheValue}|{key}| writes |value|.
% \end{Morciau}
% \begin{Morciau}[Attention/Caution]
% Les deux arguments de \cs{TheKey} sont \og mobiles \fg au sens de \LaTeX{}
-% et il faudra donc parfois les protger. On crira donc
-% \cs{TheKey}\LB\texttt{\{}\LB\cs{protect}|\(|\LB|2+3|\cs{protect}|\)|\LB\texttt{\}} si on
-% ne veut pas d'ennuis ou, plus simplement,
-% \cs{TheKey}\LB\texttt{\{}\LB|$|\LB|2+3|\LB|$|\LB\texttt{\}} \Sourire
+% et il faudra donc parfois les protéger.
% \EnAnglais
% Both arguments of \cs{TheKey} are `moving' as \LaTeX{} defines it and we have
% sometimes to protect them.
-%
-% So one will write
-% \cs{TheKey}\LB\texttt{\{}\LB\cs{protect}|\(|\LB|2+3|\cs{protect}|\)|\LB\texttt{\}}
-% to avoid troubles or, more easily,
-% \cs{TheKey}\LB\texttt{\{}\LB|$|\LB|2+3|\LB|$|\LB\texttt{\}} \Sourire
% \end{Morciau}
+%
% \begin{Morciau}
% Par ailleurs, les arguments ne doivent pas contenir de saut de
% paragraphe (\cs{par}) ---~ou tout autre truc interdit dans les
@@ -212,29 +247,67 @@
% (\cs{par}) ---~or any other thingummy which is forbidden in the
% arguments of a macro which is not \cs{long}.
% \end{Morciau}
+%
+% \begin{Morciau}[Exemples/Examples]
+% On peut écrire
+% \EnAnglais
+% On can write
+% \end{Morciau}
+%
+% {\centering \TheKey{clou}{$2+5=7$}|\TheKey{clou}{$2+5=7$}|
+% \TheKey{glue}{\(2+6=8\)}|\TheKey{glue}{\(2+6=8\)}|
+% \par}
+%
+% \begin{Morciau}
+% puis \EnAnglais then
+% \end{Morciau}
+%
+% {\centering |\TheValue{clou}|, |\TheValue{glue}|\par}
+%
+% \begin{Morciau}
+% pour obtenir \EnAnglais to obtain
+% \end{Morciau}
+%
+% {\centering \TheValue{clou}, \TheValue{glue}.\par}
+%
+% \begin{Morciau}
+% On peut utiliser |$2+3$| comme clé --- même si on ne voit pas
+% pourquoi on le ferait --- mais \textbf{pas} |\(2+3\)|. Ce qui
+% tient à la manière dont les commandes |\(| et |\)| ont été
+% robustifiées. \emph{Ce n'est pas un bogue mais une fonctionnalité.}
+% \EnAnglais
+% On can use |$2+3$| as a key ---and I don't say that one should---
+% but \textbf{not} |\(2+3\)|. That is due to the way the macros |\(|
+% and |\)| have been robustified. \emph{It's not a bug but a feature.}
+% \end{Morciau}
+%
+%
% \begin{Morciau}[Avertissements/Warnings]
-% Le module signale les dfinitions multiples d'une mme clef et
-% marque {\selectlanguage{english}\textbf{????}} l o l'on utilise
-% \cs{TheValue}\LB|{clou}| alors que |clou| n'est pas dfinie comme
+% Le module signale les définitions multiples d'une même clef et
+% marque {\selectlanguage{english}\textbf{[?? clou ??]}} là où l'on utilise
+% \cs{TheValue}\LB|{clou}| alors que |clou| n'est pas définie comme
% clef. En cas d'erreur, le fichier \texttt{log} contient la ligne :
% \EnAnglais
% The package warns about multiple definitions of the same key and
-% writes \textbf{????} where one used \cs{TheValue}\LB|{kew}| whereas
+% writes \textbf{[?? kew ??]} where one used \cs{TheValue}\LB|{kew}| whereas
% |kew| was not defined as a key. In case of error, the \texttt{log}
% file contains the line:
% \end{Morciau}
% \noindent\hspace*{\stretch{1}}\texttt{LaTeX Warning: There were undefined
-% references.}\hspace*{\stretch{1}}
+% references.}\hspace*{\stretch{1}}
+%
+% \vspace{\baselineskip}
+%
% \begin{Morciau}[Remarque/Remark]
% Josselin \textsc{Noirel} est intervenu efficacement, tant sur \fctt
% que par courriel, pour corriger les modifications que j'avais fait
-% subir au code tir de \texttt{ltxref} et \texttt{ltfiles}. C'est
-% pour sa contribution dcisive qu'il est cit comme co-auteur de ce
-% module. Qu'il trouve l l'expression de ma profonde gratitude.
+% subir au code tiré de \texttt{ltxref} et \texttt{ltfiles}. C'est
+% pour sa contribution décisive qu'il est cité comme co-auteur de ce
+% module. Qu'il trouve là l'expression de ma profonde gratitude.
%
-% Cependant, j'assume l'entire responsabilit de la rdaction de
-% cette documentation et de sa traduction ainsi que la paternit de
-% l'ide d'utiliser le mcanisme des \cs{label} pour accder un
+% Cependant, j'assume l'entière responsabilité de la rédaction de
+% cette documentation et de sa traduction ainsi que la paternité de
+% l'idée d'utiliser le mécanisme des \cs{label} pour accéder à un
% \texttt{hashage} rudimentaire.
% \EnAnglais
% Josselin \textsc{Noirel} has efficiently helped me, on \fctt and by
@@ -248,24 +321,56 @@
% having fathered the idea of using the \cs{label} mecanism to obtain
% a rudimentary \texttt{hash}.
% \end{Morciau}
-% \hspace*{\stretch{1}}Le \TeX nicien de surface. \hspace*{0.125\linewidth}
+%
+% \vspace{\baselineskip}
+%
+% \begin{Morciau}[Version 0.1/Version 0.1]
+% Cette version est compatible avec un fichier codé en utf-8 compilé
+% avec \texttt{pdflatex}, \texttt{lualatex} ou \texttt{xelatex}
+% d'après mes --- quelques --- essais. Si ce n'était pas le cas,
+% n'hésitez pas à me signaler le problème.
+% \EnAnglais
+% This version is usable with a utf-8 encoded source run through
+% \texttt{pdflatex}, \texttt{lualatex} or \texttt{xelatex} as it
+% appears from my ---not very numerous--- trials. If it was not the
+% case don't hesitate to contact me.
+% \end{Morciau}
+%
+% \hspace*{\stretch{1}}Le \TeX nicien de
+% surface. \hspace*{0.125\linewidth}
+%
+% \vspace{2\baselineskip}
+%
+% \begingroup
+% \small
+% \hspace*{\stretch{1}}\textbf{In memoriam Énola Néra}\hspace*{\stretch{1}}
+%
+% \begin{Morciau}
+% Gentille chienne aimante et fidèle, compagne de plus de 10 ans que
+% son cœur a laché le 27 juillet 2020.
+% \EnAnglais
+% Kind, loving and faithfull bitch, companion of more than 10 years
+% whose heart stopped on the 27th July 2020.
+% \end{Morciau}
+% \endgroup
+%
% \StopEventually{}
% \section{Le code}
% \label{secCode}
%
% Le code comporte des balises utilisable par \texttt{DocStrip} avec
-% lesquelles on peut produire une version francise ou une version
+% lesquelles on peut produire une version francisée ou une version
% anglaise de \NomDeModule{clefval}. Voir la documentation de
% \texttt{DocStrip} pour de plus amples renseignements.
%
-% On dit boujour, en franais ou en anglais suivant la manire dont on
-% a cr \NomDeModule{clefval}. Puis on entre dans le vif du
+% On dit boujour, en français ou en anglais suivant la manière dont on
+% a créé \NomDeModule{clefval}. Puis on entre dans le vif du
% sujet.
%
-% Le code a d'abord t repris de \texttt{ltxref} mais j'avais
+% Le code a d'abord été repris de \texttt{ltxref} mais j'avais
% quelques ennuis avec les avertissements concernant les clefs non
-% dfinies ou dfinies plusieurs fois. Josselin Noirel a bien voulu
-% rpondre mon appel au secours sur \fctt. Le code qui suit est donc
+% définies ou définies plusieurs fois. Josselin Noirel a bien voulu
+% répondre à mon appel au secours sur \fctt. Le code qui suit est donc
% la correction par Josselin de mes modifications du code de
% \texttt{ltxref}, moyennant quoi, je signe \Sourire
%
@@ -273,30 +378,30 @@
%<*package>
% \fi
% \begin{macro}{\@setTheValue}
-% Le code est copi sur celui de |\@setref| dans
-% \texttt{ltxref}. Cette macro est appele par \cs{TheValue}. Elle
-% vrifie que la clef appele existe. Si elle n'existe pas elle
-% imprime {\selectlanguage{english}\textbf{????}} et place un
+% Le code est copié sur celui de |\@setref| dans
+% \texttt{ltxref}. Cette macro est appelée par \cs{TheValue}. Elle
+% vérifie que la \meta{clef} appelée existe. Si elle n'existe pas elle
+% imprime {\selectlanguage{english}\textbf{[?? \meta{clef} ??]}} et place un
% avertissement dans le \texttt{log}. Sinon elle rend son premier
% argument.
%
% On utilise |\G@refundefinedtrue| pour provoquer le message d'erreur
% \og There were undefined references \fg. Un peu sybillin pour ce qui
-% nous concerne, il a l'avantage d'tre reconnu par au moins
+% nous concerne, il a l'avantage d'être reconnu par au moins
% \texttt{emacs} plus \texttt{Auctex} et d'indiquer qu'il faut
% relancer la compilation.
% \begin{macrocode}
\newcommand*{\@setTheValue}[2]{%
\ifx#1\relax
\protect\G@refundefinedtrue
- \nfss@text{\reset@font\bfseries????}%
+ \nfss@text{\reset@font\bfseries[?? #2 ??]}%
% \end{macrocode}
% \end{macro}
% \iffalse
%</package>
%<*packfra>
% \fi
-% \textsf{Messages d'avertissement en franais}
+% \textsf{Messages d'avertissement en français}
% \begin{macrocode}
\@latex@warning{Valeur de #2 en page \thepage\space non d\'efinie}%
% \end{macrocode}
@@ -316,16 +421,16 @@
\else #1\null \fi}
% \end{macrocode}
% \begin{macro}{\TheValue}
-% Le code est copi sur celui de |\ref| dans \texttt{ltxref}. Si
+% Le code est copié sur celui de |\ref| dans \texttt{ltxref}. Si
% l'argument de \cs{TheValue} est une clef valide, on obtient la
-% valeur rfrence par cette clef.
+% valeur référencée par cette clef.
% \begin{macrocode}
\newcommand*{\TheValue}[1]{\expandafter\@setTheValue\csname
V@#1\endcsname{#1}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\@newk@ey}
-% Le code est copi sur celui de |\@newl@bel| dans \texttt{ltxref}.
+% Le code est copié sur celui de |\@newl@bel| dans \texttt{ltxref}.
% \begin{macrocode}
\newcommand*{\@newk@ey}[3]{{%
\@ifundefined{#1@#2}%
@@ -337,7 +442,7 @@
%</package>
%<*packfra>
% \fi
-% \textsf{Messages d'avertissement en franais}
+% \textsf{Messages d'avertissement en français}
% \begin{macrocode}
\@latex@warning@no@line{Des clefs sont d\'efinies plusieurs fois.}}%
\@latex@warning@no@line{La clef #2 est d\'efinie plusieurs fois}}%
@@ -359,7 +464,7 @@
\global\@namedef{#1@#2}{#3}}}
% \end{macrocode}
% \begin{macro}{\newkey}
-% On opre ici une puissante magie qui fait que tout marche comme
+% On opère ici une puissante magie qui fait que tout marche comme
% attendu \Sourire
% \begin{macrocode}
\def\newkey{\@newk@ey V}
@@ -372,16 +477,16 @@
% ^^A fin du code de Josselin Noirel
%<*package>
% \fi
-% partir d'ici votre serviteur s'est dbrouill tout seul pour
+% À partir d'ici votre serviteur s'est débrouillé tout seul pour
% modifier le code des bases de \LaTeX.
%
% \begin{macro}{\@protected@write}
-% Le code est copi sur celui de |\protected@write| dfini dans
-% \texttt{ltfiles}. On n'a besoin que d'un seul argument qui est crit
-% dans le fichier |\@auxout| c--d. le fichier \texttt{aux}.
-% La macro prend soin de ce qui est protg soit de manire dfinitive
-% pour avoir t dfini par \cs{DeclareRobustCommand} et ses petits
-% amis, soit pour tre prcd de \cs{protect} comme on doit le faire
+% Le code est copié sur celui de |\protected@write| défini dans
+% \texttt{ltfiles}. On n'a besoin que d'un seul argument qui est écrit
+% dans le fichier |\@auxout| c-à-d. le fichier \texttt{aux}.
+% La macro prend soin de ce qui est protégé soit de manière définitive
+% pour avoir été défini par \cs{DeclareRobustCommand} et ses petits
+% amis, soit pour être précédé de \cs{protect} comme on doit le faire
% parfois pour les arguments \og mobiles \fg (\emph{moving
% argument}).
% \begin{macrocode}
@@ -394,9 +499,9 @@
% \end{macrocode}
% \end{macro}
% \begin{macro}{\@multiplekeys}
-% En mettant |\@multiplekeys| \cs{relax}, on s'assure qu'il n'y aura
-% pas de hurlements alors que rien n'est encore dfini et donc encore
-% moins dfini plusieurs fois \Sourire
+% En mettant |\@multiplekeys| à \cs{relax}, on s'assure qu'il n'y aura
+% pas de hurlements alors que rien n'est encore défini et donc encore
+% moins défini plusieurs fois \Sourire
% \begin{macrocode}
\let \@multiplekeys \relax
% \end{macrocode}
@@ -404,7 +509,7 @@
% \begin{macro}{\TheKey}
% Le code remprend celui de \cs{label} mais il nous faut deux
% arguments, le 1\ier pour la clef, le 2\textsuperscript{nd} pour la
-% valeur associe.
+% valeur associée.
% \begin{macrocode}
\def\TheKey#1#2{{\@bsphack
\@protected@write{\string\newkey{#1}{#2}}%
diff --git a/Master/texmf-dist/source/latex/clefval/clefval.ins b/Master/texmf-dist/source/latex/clefval/clefval.ins
index a5f33524c32..ab1da622431 100644
--- a/Master/texmf-dist/source/latex/clefval/clefval.ins
+++ b/Master/texmf-dist/source/latex/clefval/clefval.ins
@@ -1,37 +1,32 @@
-%%% 2004-05-22
+%% 2020-07-27
%%
-%% Copyright (C) 2004 by Yvon Henel Le TeXnicien de surface
-%% <Yvon.Henel@wanadoo.fr>
+%% Copyright (C) 2004, 2020 by Yvon Henel Le TeXnicien de surface
+%% <le.texnicien.de.surface@yvon-henel.fr>
%%
%% This file may be distributed and/or modified under the conditions of
-%% the LaTeX Project Public License, either version 1.2 of this license
+%% 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.2 or later is part of all distributions of LaTeX version
-%% 1999/12/01 or later.
-%%
\input docstrip.tex
\keepsilent
\preamble
This is a generated file.
-Copyright (C) 2004 Y. Henel, le TeXnicien de surface
-<Yvon.Henel@wanadoo.fr>
+Copyright (C) 2004, 2020 Y. Henel, le TeXnicien de surface
+<le.texnicien.de.surface@yvon-henel.fr>
This file may be distributed and/or modified under the conditions of
-the LaTeX Project Public License, either version 1.2 of this license
+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.2 or later is part of all distributions of LaTeX version
-1999/12/01 or later.
\endpreamble
-%%% for English warnings :
+%%% for English warnings:
\generate{\file{clefval.sty}{\from{clefval.dtx}{package,packeng}}}
\Msg{***************************************************************}
diff --git a/Master/texmf-dist/source/latex/clefval/fra-clefval.ins b/Master/texmf-dist/source/latex/clefval/fra-clefval.ins
deleted file mode 100644
index 8471c591ea8..00000000000
--- a/Master/texmf-dist/source/latex/clefval/fra-clefval.ins
+++ /dev/null
@@ -1,58 +0,0 @@
-%%% 2004-05-22
-%%
-%% Copyright (C) 2004 by Yvon Henel Le TeXnicien de surface
-%% <Yvon.Henel@wanadoo.fr>
-%%
-%% This file may be distributed and/or modified under the conditions of
-%% the LaTeX Project Public License, either version 1.2 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.2 or later is part of all distributions of LaTeX version
-%% 1999/12/01 or later.
-%%
-\input docstrip.tex
-\keepsilent
-\preamble
-This is a generated file.
-
-Copyright (C) 2004 Y. Henel, le TeXnicien de surface
-<Yvon.Henel@wanadoo.fr>
-
-This file may be distributed and/or modified under the conditions of
-the LaTeX Project Public License, either version 1.2 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.2 or later is part of all distributions of LaTeX version
-1999/12/01 or later.
-\endpreamble
-%%% pour messages en fran\c cais :
-\generate{\file{clefval.sty}{\from{clefval.dtx}{package,packfra}}}
-
-\Msg{****************************************************************}
-\Msg{*}
-\Msg{* VERSION FRANAISE :: FRENCH VERSION}
-\Msg{*}
-\Msg{* Pour finir l'installation vous devez placer}
-\Msg{* le fichier suivant dans un rpertoire parcouru par TeX.}
-\Msg{*}
-\Msg{* \space\space clefval.sty}
-\Msg{*}
-\Msg{* Pour produire la documentation (bilingue) faire : }
-\Msg{* pdflatex clefval.dtx}
-\Msg{* makeindex -s gind clefval }
-\Msg{* makeindex -s gglo -o clefval.gls clefval.glo}
-\Msg{* pdflatex clefval.dtx}
-\Msg{*}
-\Msg{* puis placez clefval.pdf dans un rpertoire de documentation}
-\Msg{* comme par exemple texmf-local/doc/latex/clefval}
-\Msg{*}
-\Msg{********************* TeXez dans la joie ! *********************}
-\Msg{****************************************************************}
-
-\endbatchfile
diff --git a/Master/texmf-dist/source/latex/color-edits/color-edits.dtx b/Master/texmf-dist/source/latex/color-edits/color-edits.dtx
new file mode 100644
index 00000000000..80fa06463ba
--- /dev/null
+++ b/Master/texmf-dist/source/latex/color-edits/color-edits.dtx
@@ -0,0 +1,333 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2020 by David Kempe
+% ---------------------------------
+%
+% This file 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:
+%
+% http://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.
+%
+% \fi
+%
+% \iffalse
+%<package> \ProvidesPackage{color-edits}[2020/09/18 v1.1 Class for annotating authors' edits in color]
+%
+%<package>\def\coloredits@SuppressEdits{no}
+%<package>\DeclareOption{suppress}{\def\coloredits@SuppressEdits{yes}}
+%
+%<package>\def\coloredits@ShowDeletions{no}
+%<package>\DeclareOption{showdeletions}{\def\coloredits@ShowDeletions{yes}}
+%
+%<package>\ProcessOptions\relax
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{color-edits}
+%\usepackage{fullpage}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{color-edits.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \iffalse \OnlyDescription \fi
+%
+% \CheckSum{185}
+%
+ % \CharacterTable
+ % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+ % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+ % Digits \0\1\2\3\4\5\6\7\8\9
+ % Exclamation \! Double quote \" Hash (number) \#
+ % Dollar \$ Percent \% Ampersand \&
+ % Acute accent \' Left paren \( Right paren \)
+ % Asterisk \* Plus \+ Comma \,
+ % Minus \- Point \. Solidus \/
+ % Colon \: Semicolon \; Less than \<
+ % Equals \= Greater than \> Question mark \?
+ % Commercial at \@ Left bracket \[ Backslash \\
+ % Right bracket \] Circumflex \^ Underscore \_
+ % Grave accent \` Left brace \{ Vertical bar \|
+ % Right brace \} Tilde \~}
+%
+% \changes{v0.1}{2014/08/17}{First version of .sty file}
+% \changes{v0.2}{2016/06/16}{Improved definition for robustness, including making commands long, i.e., accepting multi-paragraph arguments}
+% \changes{v0.3}{2020/02/26}{Added replace and deletecomment commands}
+% \changes{v1.0}{2020/03/03}{First fully packaged version}
+% \changes{v1.1}{2020/09/18}{Added ability to suppress individual authors}
+%
+% \GetFileInfo{color-edits.sty}
+%
+% \DoNotIndex{\ifthenelse,\equal}
+% \DoNotIndex{\expandafter,\long,\def,\csname,\endcsname}
+% \DoNotIndex{\color,\marginpar,\scriptsize}
+% \DoNotIndex{\@authorname}
+%
+%
+% \title{The \textsf{color-edits} package\thanks{This document corresponds to \textsf{color-edits}~\fileversion, dated \filedate.}}
+% \author{David Kempe \\ \texttt{David.M.Kempe@gmail.com}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% The color-edits style file packages and streamlines/improves a functionality that I and many co-authors used to copy-paste and redo by hand: marking/annotating edits by different authors in a jointly edited document. It provides one command that generates a suite of six commands for each author, assigning each author a color. These six automatically generated commands allow each author to distinguish by color text which the author suggests (1) adding, (2) substituting for other text, (3) deleting, (4) deleting while giving a reason for the deletion. In addition, it provides commands to add comments in the text or margin.
+%
+% The package has two useful options. One option |suppress| allows to suppress all colors, replacements, comments, and marked deletions --- it basically results in the document being displayed as you probably want it to when all suggested changes have been resolved. The option |showdeletions| shows all suggested deletions in the text in gray, rather than just indicating that \emph{something} was deleted.
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% The package |color-edits| implements a suite of functionalities that is often needed when multiple authors jointly edit a document. When doing so, authors will frequently want to mark up their (suggested or implemented) changes to the document in a way that is directly visible to co-authors, and also sometimes provide explanations for their changes, or raise issues/questions for their co-authors to consider or address. Many author teams address this by defining a macro for each author that displays the author's edits in an author-specific color. While this works well for additions, it does not make it as easy to mark deletions, and requires manual changes when comments have not been addressed and a deadline looms.
+%
+% For example, if one has just one colorful macro for an author, and the author uses it both for marking recent edits/additions and providing comments to co-authors, there is no simple way to delete the comments while keeping the added text (but changing its color to the ``normal'' one.) The present package tries to address these issues with a fairly simple implementation that provides six macros whose behavior can be altered in the (hopefully) ``straightforward'' way with package options.
+%
+% \section{Usage}
+%
+% \subsection{Package Options} \label{sec:package-options}
+%
+% The package |color-edits| has two options: |suppress| and |showdeletions|. Here, we discuss their purpose at a high level --- the precise effects are discussed in Section~\ref{sec:generated-macros}.
+%
+% The option \DescribeMacro{suppress} |suppress| suppresses all authors (see Section~\ref{sec:suppressed-author}): it changes the definitions of the commands in such a way that the file that is produced looks as much as possible as one would expect if all editing issues had been addressed/accepted by the authors.
+%
+% The option \DescribeMacro{showdeletions} |showdeletions| is useful when one wants to see in the compiled file not only \emph{that} something was replaced/deleted, but also \emph{what} the old text was. Specifically, for the replacement and deletion macros, instead of just marking that something was deleted/replaced, it displays the replaced/deleted text in gray. Author suppression overrides |showdeletions|, i.e., |showdeletions| has no effect when an author is suppressed.
+%
+% \subsection{The exported macro \texttt{\textbackslash{}addauthor}}
+% \label{sec:exported-macro}
+% The package only exports one macro: |\addauthor| \oarg{auth-name} \marg{auth} \marg{auth-color}. Calling this macro in the preamble of your document automatically generates the following six macros, described in more detail below.
+% \begin{enumerate}
+% \item |\<auth>edit| \marg{text}
+% \item |\<auth>replace| \marg{old-text} \marg{new-text}
+% \item |\<auth>comment| \marg{comment}
+% \item |\<auth>margincomment| \marg{comment}
+% \item |\<auth>delete| \marg{deleted-text}
+% \item |\<auth>deletecomment| \marg{comment} \marg{deleted-text}
+% \end{enumerate}
+%
+% When the optional argument \meta{auth-name} is not provided, the argument \meta{auth} will be used as the author's name. The intended use is that \meta{auth} is short enough that authors will not mind using it as part of a command name, but \meta{auth-name} might be more descriptive, to display with comments or notes about deletions. For example, if Ada Lovelace and Charles Babbage were working on a paper together, they might write the following:
+%
+% \begin{verbatim}
+% \usepackage{color-edits}
+% \addauthor[Ada]{al}{blue}
+% \addauthor{cb}{green}
+% \end{verbatim}
+%
+% All edits by Ada will be marked in blue, and those by Charles in green. Whenever there is an attributed comment/deletion, for Ada, it would be prefaced by |Ada|, whereas for Charles, it would be prefaced by |cb|.
+%
+% There is one specific use of the optional name. If an author's optional name \meta{auth-name} is set to |suppress|, then this author's edits/comments/deletions are suppressed; see Section~\ref{sec:suppressed-author}. Notice that this gives more fine-grained control --- for instance, it can let you focus on the most recent round of edits/comments, if a new ``author'' has been added for it.\footnote{I would like to thank Krishnamurthy Iyer for this suggestion and a suggested implementation.}
+%
+% \subsection{Suppressed Authors} \label{sec:suppressed-author}
+% One sometimes wants to suppress the colorful edits and make the file look as much as possible as what is expected after all comments have been addressed and all suggested edits/deletions have been approved.
+% We call this \emph{suppressing} an author\footnote{We still highly recommend explicitly addressing all issues, then removing the macros to let your co-author(s) know that you saw their edits and approve of them, and that all comments have been addressed. The use of suppression is intended primarily for a quick check of, e.g., how long your document will be once all comments are removed, or to focus on the most recent round of suggested edits. Of course, every now and then, it is 3 minutes before the submission deadline, and you have no choice. Please note that there may be some very minor spacing issues when using suppression --- see Section~\ref{sec:bugs}.}.
+% Specifically, suppressing an author does the following (described in more detail in the context of the specific macros):
+% \begin{itemize}
+% \item Remove all color.
+% \item Remove all comments (both in the text and margins).
+% \item For all text that has been (suggested as) deleted or replaced, nothing is displayed.
+% \end{itemize}
+%
+% There are two ways to suppress authors: one can suppress individual authors by changing their optional names to |suppress| (see Section~\ref{sec:exported-macro}). Alternatively, by using the package option |suppress| (see Section~\ref{sec:package-options}), all authors are suppressed.
+%
+% \subsection{Generated Macros} \label{sec:generated-macros}
+%
+% In this section, we describe in detail the functionality of the macros generated by |\addauthor|. We will refer to them with the generic name. Throughout, keeping the earlier example of Ada and Charles in mind, the reader is encouraged to substitute in his/her mind |al| or |cb| for |<auth>|. We will frequently reference suppressed authors --- see Section~\ref{sec:suppressed-author} for a discussion.
+%
+% The macros are internally defined using |\long\def|, so all arguments below that are given as \meta{text} or \meta{new-text} or \meta{comment} (and similar ones) are allowed to contain multiple paragraphs.
+%
+% The macro \DescribeMacro{\<auth>edit} |\<auth>edit| \marg{text} in its default behavior simply displays \meta{text} in the color assigned to the author |<auth>|. If the author has been suppressed, it displays \meta{text} in the standard style/color. The macro is not affected by the |showdeletions| package option. The main purpose of this macro is to mark text as changed/added by the given author. If the text was changed, the implicit assumption is that the co-author will not care much about what the text was prior to the change --- otherwise, the macro |\<auth>replace| would be preferable.
+%
+% The macro \DescribeMacro{\<auth>replace} |\<auth>replace| \marg{old-text} \marg{new-text} in its default behavior simply displays \meta{new-text} in the color assigned to the author |<auth>|. The macro should be used instead of |\<auth>edit| if the co-authors might want to see what was in the file before the change. While the old text is not displayed in the output per default, it is of course still in the \LaTeX\ source, so co-authors can easily see it. If the author was suppressed, then |\<auth>replace| simply displays \meta{new-text} in the standard style/color. If the package option |showdeletions| was used (and the author was not suppressed), then |\<auth>replace| displays \meta{old-text} in gray, followed by \meta{new-text} in the color assigned to the author |<auth>|.
+%
+% The macro \DescribeMacro{\<auth>comment} |\<auth>comment| \marg{text} is used for leaving comments for one's co-authors, as opposed to text that should become part of the document itself. Its default behavior is to show |[<auth-name>: <text>]| in the color assigned to the author |<auth>|. Here, \meta{auth-name} is the name assigned to the author --- either the optional long name if given, or otherwise \meta{auth} (see Section~\ref{sec:exported-macro}). If the author is suppressed, then nothing is displayed. Notice that this is the main difference to the |\<auth>edit| macro, which still displays its text. This is in line with the idea that a change to the document/text should be included in a version that is --- say --- submitted to a conference, while internal comments to co-authors should not be included. The macro is not affected by the |showdeletions| package option.
+%
+% The macro \DescribeMacro{\<auth>margincomment} |\<auth>margincomment| \marg{text} is used for leaving comments for one's co-authors in the margins as opposed to in the main text. Thus, its purpose is basically the same as that of |\<auth>comment|, but different authors may prefer comments to be displayed in different places, e.g., for reasons of flow. Its default behavior is to show a marker in the main text in the color assigned to the author |<auth>|, and to show |[<auth-name>: <text>]| in the margin, also in the color assigned to the author |<auth>|. Here, \meta{auth-name} is the name assigned to the author --- either the optional long name if given, or otherwise \meta{auth} (see Section~\ref{sec:exported-macro}). If the author is suppressed, then nothing is displayed. The macro is not affected by the |showdeletions| package option. Because the macro is implemented using the |\marginpar| macro, it cannot be used in environments where |\marginpar| does not work, such as in footnotes, section headings, or captions.
+%
+% The macro \DescribeMacro{\<auth>delete} |\<auth>delete| \marg{text} is used for letting co-authors know that one deleted \meta{text} (or suggests doing so). Its default behavior is to display a marker in the color assigned to the author |<auth>| in the spot where the command occurs, and to leave a mark |[<auth-name> deleted here]| in the margin. Here, \meta{auth-name} is the name assigned to the author --- either the optional long name if given, or otherwise \meta{auth} (see Section~\ref{sec:exported-macro}). If the author is suppressed, then nothing is displayed. The main purpose of having the argument \meta{text} is to allow co-authors to see not only \emph{that} text was deleted, but \emph{what} text was deleted. Accordingly, if the package option |showdeletions| is used (and the author is not suppressed), then instead of placing a marker and a comment in the margin, the text \meta{text} is displayed, but in gray. This allows co-authors to see the deleted text not only in the source file, but also in the compiled output. Because the macro is implemented using the |\marginpar| macro, it cannot be used in environments where |\marginpar| does not work, such as in footnotes, section headings, or captions.
+%
+% The macro \DescribeMacro{\<auth>deletecomment} |\<auth>deletecomment| \marg{comment} \marg{text} is used for letting co-authors know that one deleted \meta{text} (or suggests doing so), and to also provide a \meta{comment} explaining the deletion. Its default behavior is to display a marker in the color assigned to the author |<auth>| in the spot where the command occurs, and to leave a mark |[<auth-name> deleted here: <comment>]| in the margin. Here, \meta{auth-name} is the name assigned to the author --- either the optional long name if given, or otherwise \meta{auth} (see Section~\ref{sec:exported-macro}). If the author is suppressed, then nothing is displayed. As with the |\<auth>delete| command, the main purpose of having the argument \meta{text} is to allow co-authors to see what text was deleted. If the package option |showdeletions| is used (and the author is not suppressed), then instead of placing a marker, the text \meta{text} is displayed, but in gray. This allows co-authors to see the deleted text not only in the source file, but also in the compiled output. In addition, |[<auth-name>: <comment>]| is still displayed in the margin in the color assigned to the author. Because the macro is implemented using the |\marginpar| macro, it cannot be used in environments where |\marginpar| does not work, such as in footnotes, section headings, or captions.
+%
+%
+%
+% \StopEventually{\PrintChanges}
+%
+% \section{The Package Implementation}
+%
+%\subsection{The Initial Stuff}
+%The package only requires the |ifthen| package (heavily, for distinctions based on package options and such) and the |color| package (obviously, to display stuff in colors for different authors).
+% \begin{macrocode}
+\RequirePackage{ifthen}
+\RequirePackage{color}
+% \end{macrocode}
+
+%We define a color gray to use for showing deleted text. For all other colors, it is the user's responsibility to define them if they are not defined standard.
+% \begin{macrocode}
+\definecolor{@gray}{rgb}{0.5,0.5,0.5}
+% \end{macrocode}
+
+%\subsection{Helper Macros for Defining the Exported Functions}
+% \begin{macro}{\coloredits@addauthoredit}
+% |\coloredits@addauthoredit| \marg{auth} \marg{auth-color} is a helper macro.
+% It defines the command |\<auth>edit| \marg{text}.
+% How |\<auth>edit| \marg{text} is defined depends on the package options and arguments.
+% If the author is suppressed, then |\<auth>edit| \marg{text} simply displays \meta{text}.
+% Otherwise, it displays \meta{text} in the given color \meta{auth-color}.
+% \begin{macrocode}
+\newcommand{\coloredits@addauthoredit}[3]{%
+\ifthenelse{\equal{\coloredits@SuppressEdits}{yes} \or \equal{#2}{suppress}}{% suppressed
+\expandafter\long\expandafter\def\csname #1edit\endcsname ##1{##1}%
+}{% not suppressed
+\expandafter\long\expandafter\def\csname #1edit\endcsname ##1{{\color{#3}##1}}
+}}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\coloredits@addauthorreplace}
+% |\coloredits@addauthorreplace| \marg{auth} \marg{auth-name} \marg{auth-color} is a helper macro.
+% It defines the command |\<auth>replace| \marg{old-text} \marg{new-text}.
+% How |\<auth>replace| \marg{old-text} \marg{old-text} is defined depends on the package options and parameters passed in.
+% If the author is suppressed, then |\<auth>replace| \marg{old-text} \marg{new-text} simply displays \meta{new-text}.
+% If the author is not suppressed and |showdeletions| was not specified as a package option, it displays \meta{new-text} in the given color \meta{auth-color}.
+% If the author is not suppressed and |showdeletions| was specified as a package option, it displays \meta{old-text} in gray, followed by \meta{new-text} in the given color \meta{auth-color}.
+% \begin{macrocode}
+\newcommand{\coloredits@addauthorreplace}[3]{%
+\ifthenelse{\equal{\coloredits@SuppressEdits}{yes} \or \equal{#2}{suppress}}{% suppressed
+\expandafter\long\expandafter\def\csname #1replace\endcsname ##1##2{##2}
+}{% not suppressed
+\ifthenelse{\equal{\coloredits@ShowDeletions}{yes}}{% Showing deletions
+\expandafter\long\expandafter\def\csname #1replace\endcsname ##1##2{%
+{\color{@gray}##1}{\color{#3}##2}}
+}{% Not showing deletions
+\expandafter\long\expandafter\def\csname #1replace\endcsname ##1##2{%
+{\color{#3}##2}}
+}%
+}}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\coloredits@addauthorcomment}
+% |\coloredits@addauthorcomment| \marg{auth} \marg{auth-name} \marg{auth-color} is a helper macro.
+% It defines the command |\<auth>comment| \marg{text}.
+% How |\<auth>comment| \marg{text} is defined depends on the package options and arguments.
+% If the author is suppressed, then |\<auth>comment| \marg{text} does nothing.
+% If the author is not suppressed, it displays, in square brackets, \meta{text} in the given color \meta{auth-color}, prefixed by \meta{auth-name}.
+% \begin{macrocode}
+\newcommand{\coloredits@addauthorcomment}[3]{%
+\ifthenelse{\equal{\coloredits@SuppressEdits}{yes} \or \equal{#2}{suppress}}{% suppressed
+\expandafter\long\expandafter\def\csname #1comment\endcsname ##1{}
+}{% not suppressed
+\expandafter\long\expandafter\def\csname #1comment\endcsname ##1{%
+{\color{#3}[#2: ##1]}}
+}}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\coloredits@addauthormargincomment}
+% |\coloredits@addauthormargincomment| \marg{auth} \marg{auth-name} \marg{auth-color} is a helper macro.
+% It defines the command |\<auth>margincomment| \marg{text}.
+% How |\<auth>margincomment| \marg{text} is defined depends on the package options and arguments.
+% If the author is suppressed, then |\<auth>margincomment| \marg{text} does nothing.
+% If the author is not suppressed, it displays, in the margin and in square brackets, \meta{text} in the given color \meta{auth-color}, prefixed by \meta{auth-name}. It also places a bullet in square brackets of color \meta{auth-color} in the text at the place where the command was used.
+% \begin{macrocode}
+\newcommand{\coloredits@addauthormargincomment}[3]{%
+\ifthenelse{\equal{\coloredits@SuppressEdits}{yes} \or \equal{#2}{suppress}}{% suppressed
+\expandafter\long\expandafter\def\csname #1margincomment\endcsname ##1{}
+}{% not suppressed
+\expandafter\long\expandafter\def\csname #1margincomment\endcsname##1{{%
+\color{#3}$[\bullet]$\marginpar{\scriptsize\color{#3}[#2: ##1]}}}
+}}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\coloredits@addauthordelete}
+% |\coloredits@addauthordelete| \marg{auth} \marg{auth-name} \marg{auth-color} is a helper macro.
+% It defines the command |\<auth>delete| \marg{text}.
+% How |\<auth>delete| \marg{text} is defined depends on the package options and arguments.
+% If the author is suppressed, then |\<auth>delete| \marg{text} does nothing.
+% If the author is not suppressed and |showdeletions| was not used, it places a bullet in brackets in the color \meta{auth-color} at the place of the command, and places the note |[<auth-name> deleted here]| in the margin in the color \meta{auth-color}.
+% If the author is not suppressed and |showdeletions| was used, it displays \meta{text} in gray.
+% \begin{macrocode}
+\newcommand{\coloredits@addauthordelete}[3]{%
+\ifthenelse{\equal{\coloredits@SuppressEdits}{yes} \or \equal{#2}{suppress}}{% suppressed
+\expandafter\long\expandafter\def\csname #1delete\endcsname ##1{}
+}{% not suppressed
+\ifthenelse{\equal{\coloredits@ShowDeletions}{yes}}{% Showing deletions
+\expandafter\long\expandafter\def\csname #1delete\endcsname ##1{{\color{@gray}##1}}
+}{% Not showing deletions
+\expandafter\long\expandafter\def\csname #1delete\endcsname ##1{{%
+\color{#3}$[\bullet]$\marginpar{\scriptsize\color{#3}#2 deleted here}}}
+}%
+}}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\coloredits@addauthordeletecomment}
+% |\coloredits@addauthordeletecomment| \marg{auth} \marg{auth-name} \marg{auth-color} is a helper macro.
+% It defines the command |\<auth>deletecomment| \marg{comment} \marg{text}.
+% How |\<auth>deletecomment| \marg{comment} \marg{text} is defined depends on the package options and arguments.
+% If the author is suppressed, then |\<auth>deletecomment| \marg{comment} \marg{text} does nothing.
+% If the author is not suppressed and |showdeletions| is not used, it places a bullet in brackets in the color \meta{auth-color} at the place of the command, and places the note |[<auth-name> deleted here: <comment>]| in the margin in the color \meta{auth-color}.
+% If the author is not suppressed and |showdeletions| was used, it displays \meta{text} in gray, and places the note |[<auth-name>: <comment>]| in the margin in the color \meta{auth-color}.
+% \begin{macrocode}
+\newcommand{\coloredits@addauthordeletecomment}[3]{%
+\ifthenelse{\equal{\coloredits@SuppressEdits}{yes} \or \equal{#2}{suppress}}{% suppressed
+\expandafter\long\expandafter\def\csname #1deletecomment\endcsname ##1##2{}
+}{% not suppressed
+\ifthenelse{\equal{\coloredits@ShowDeletions}{yes}}{% Showing deletions
+\expandafter\long\expandafter\def\csname #1deletecomment\endcsname ##1##2{{%
+\color{#3}$[\bullet]$\color{@gray}##2\marginpar{\scriptsize\color{#3}#2: ##1}}}
+}{% Not showing deletions
+\expandafter\long\expandafter\def\csname #1deletecomment\endcsname ##1##2{{%
+\color{#3}$[\bullet]$\marginpar{\scriptsize\color{#3}#2 deleted here: ##1}}}
+}%
+}}
+% \end{macrocode}
+% \end{macro}
+
+
+% \subsection{The Exported Macro \texttt{\textbackslash{}addauthor}}
+% \begin{macro}{\addauthor}
+% |\addauthor| \oarg{auth-name} \marg{auth} \marg{auth-color} is the only exported macro of the package.
+% The definition of the |\<auth>edit| and |\<auth>replace| macros are independent of whether the optional longer name \meta{auth-name} was provided, except for the author being suppressed if the longer name was |suppress|.
+% For the definition of the two comment and deletion macros, there is a case distinction regarding whether the optional \meta{auth-name} was not provided (in which case the short \meta{auth} is used), or it was provided (in which case \meta{auth-name} is used).
+% For all the definitions, this macro just calls the helper macros to define the commands for the given author, using the given name and color.
+% \begin{macrocode}
+\newcommand{\addauthor}[3][]{%
+\coloredits@addauthoredit{#2}{#1}{#3}
+\coloredits@addauthorreplace{#2}{#1}{#3}
+\ifthenelse{\equal{#1}{}}{%optional name was not provided
+\coloredits@addauthorcomment{#2}{#2}{#3}
+\coloredits@addauthormargincomment{#2}{#2}{#3}
+\coloredits@addauthordelete{#2}{#2}{#3}
+\coloredits@addauthordeletecomment{#2}{#2}{#3}}{%optional name was provided
+\coloredits@addauthorcomment{#2}{#1}{#3}
+\coloredits@addauthormargincomment{#2}{#1}{#3}
+\coloredits@addauthordelete{#2}{#1}{#3}
+\coloredits@addauthordeletecomment{#2}{#1}{#3}}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \Finale
+%
+% \section{Disclaimer and Known Problems}
+% \label{sec:bugs}
+% The biggest disclaimer is that I am not a very expert \TeX programmer, so this package may not be particularly well written. I am sharing it because several co-authors seem to enjoy using it and have encouraged me to share it publicly. If you see ways to improve the implementation or functionality (while keeping it still light-weight), I would love to hear from you. You are obviously using this package at your own risk.
+%
+% As discussed above, because the macros for deletion and the one for comments in the margin are based on the |\marginpar| command in \LaTeX, their use is restricted to settings in which |\marginpar| works. In particular, this excludes using them in footnotes, captions, and section/subsection titles. An alternative might be to use the |marginnote| package and its command |\marginnote|, but that package seems to have other known problems, and at the moment, I am not ready to try to decide which issues are larger. If you see a clean way to resolve this, feel free to let me know.
+%
+% Earlier versions had some very minor spacing issues when using the |suppress| package option. Specifically, when there was a space before and after --- say --- an |\<auth>comment| command, then \LaTeX would still keep both spaces, resulting in slightly more space than there should be between the preceding and following items on the line. I may have accidentally fixed this in revisions, or the issue may still persist --- I have not checked this extensively. Fixing this is not a high priority for me, as I view the suppression mechanism as primarily a way to see what the document will look like once all comments have been addressed/removed. An actual final version should actually address and remove them, so the spacing issues should be resolved in that way. If you notice the issue persisting and know of an easy way to resolve it, I'd love to hear from you and implement it.
+%
+\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/color-edits/color-edits.ins b/Master/texmf-dist/source/latex/color-edits/color-edits.ins
new file mode 100644
index 00000000000..03bd72f4416
--- /dev/null
+++ b/Master/texmf-dist/source/latex/color-edits/color-edits.ins
@@ -0,0 +1,53 @@
+%%
+%% Copyright (C) 2020 by David Kempe
+%%
+%% This file 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:
+%%
+%% http://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.
+%%
+
+\input docstrip.tex
+\keepsilent
+
+\usedir{tex/latex/color-edits}
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2020 by David Kempe
+
+This file 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:
+
+ http://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.
+
+\endpreamble
+
+\generate{\file{color-edits.sty}{\from{color-edits.dtx}{package}}}
+
+\Msg{*********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space color-edits.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file color-edits.dtx}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*********************************************************}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/cquthesis/cquthesis.dtx b/Master/texmf-dist/source/latex/cquthesis/cquthesis.dtx
index 60df9b710dd..00bc741efdf 100644
--- a/Master/texmf-dist/source/latex/cquthesis/cquthesis.dtx
+++ b/Master/texmf-dist/source/latex/cquthesis/cquthesis.dtx
@@ -16,7 +16,7 @@
%
% \iffalse
%<*driver>
-\ProvidesFile{cquthesis.dtx}[2019/10/12 v1.40 Chongqing University Thesis Template]
+\ProvidesFile{cquthesis.dtx}[2020/06/23 v1.50 Chongqing University Thesis Template]
\documentclass{ltxdoc}
\usepackage{dtx-style}
@@ -30,7 +30,7 @@
%</driver>
% \fi
%
-% \CheckSum{1891}
+% \CheckSum{1893}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -99,7 +99,7 @@
% \GlossaryPrologue{\section{\glossaryname}}
%
% \title{\bfseries\color{blue!50!black}\cquthesis:重庆大学毕业论文\LaTeX 模板}
-% \author{{\fangsong 李振楠}\\[5pt]\texttt{i@nanmu.me}}
+% \author{{\fangsong 李振楠\footnote{\href{https://nanmu.me/zh-cn/about/}{中文页面},\href{https://nanmu.me/en/about}{About in English}}}\\[5pt]\texttt{i@nanmu.me}}
% \date{\fileversion\ (\filedate)}
% \maketitle\thispagestyle{empty}
% \vspace{\stretch{1}}
@@ -115,7 +115,7 @@
% \begin{abstract}\noindent
% \begin{enumerate}
% \item 本模板按照LaTeX Project Public License发布,协议版本号为1.3或以后的任何版本(随你意);
-% \item 截止本文档编译时,重庆大学教务处和研究生院只提供了\href{https://github.com/nanmu42/CQUThesis/tree/master/toolkit}{毕业论文写作指南},没有提供官方模板,也没有授权或认证任何第三方模板为官方模板\footnote{\href{http://jq.qq.com/?_wv=1027&k=2HvYu95}{重庆大学\TeX 用户组}正在推动学校\href{https://github.com/CQUtug/TeXProposal}{认证\cquthesis} 。}。本模板是按照写作指南的参考实现,模板作者自当尽力,但不保证审查老师不提意见。在开始使用前,您同意,任何由于本模板而引起的论文格式审查问题与本模板作者无关。
+% \item 截止本文档编译时,重庆大学教务处和研究生院只提供了\href{https://github.com/nanmu42/CQUThesis/tree/master/toolkit}{毕业论文写作指南},没有提供官方模板,也没有授权或认证任何第三方模板为官方模板\footnote{\href{http://jq.qq.com/?_wv=1027&k=2HvYu95}{重庆大学\TeX 用户组}做过推动学校\href{https://github.com/CQUtug/TeXProposal}{认证\cquthesis}的努力。}。本模板是按照写作指南的参考实现,模板作者自当尽力,但不保证审查老师不提意见。在开始使用前,您同意,任何由于本模板而引起的论文格式审查问题与本模板作者无关。
% \end{enumerate}
% \vskip2cm
% \end{abstract}
@@ -956,13 +956,15 @@
% \begin{macrocode}
\RequirePackage{fontspec}
\RequirePackage{amsmath}
+\RequirePackage{amssymb}
+\RequirePackage{amsfonts}
% \end{macrocode}
%
% 一些字体相关的宏包:
% \begin{macrocode}
\RequirePackage[defaultsups]{newtxtext}
\RequirePackage{pifont}
-\RequirePackage{CJKfntef}
+\RequirePackage{xeCJKfntef}
% \end{macrocode}
%
% 解决各种文档部件需求,如表格、题注、插图等
@@ -1538,18 +1540,19 @@
\renewcommand{\thesubtable}{(\alph{subtable})}
% \end{macrocode}
% \begin{macro}{\bicaption}
+% \changes{v1.50}{2020/06/23}{修改了双语图注的声明顺序,以适应新版\cs{bicaption}的变更。}
% 这里对\cs{bicaption}这个命令进行设置,题注的第二语言默认为英文,用户可以重定义\cs{shorttablenameEN}和\cs{shortfigurenameEN}
% \begin{macrocode}
-\captionsetup[bi-first]{bi-first}
-\captionsetup[bi-second]{bi-second}
\DeclareCaptionOption{bi-first}[]{%
\def\tablename{\shorttablename}
\def\figurename{\shortfigurename}
}%bi-first
\DeclareCaptionOption{bi-second}[]{%
- \def\tablename{\shorttablenameEN}
- \def\figurename{\shortfigurenameEN}
+\def\tablename{\shorttablenameEN}
+\def\figurename{\shortfigurenameEN}
}%bi-second
+\captionsetup[bi-first]{bi-first}
+\captionsetup[bi-second]{bi-second}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\listoffiguresEN}
@@ -2515,4 +2518,4 @@ headsep=3mm]{geometry}
% \fi
%
% \Finale
-\endinput \ No newline at end of file
+\endinput
diff --git a/Master/texmf-dist/source/latex/crop/Makefile b/Master/texmf-dist/source/latex/crop/Makefile
index 979d0d5623a..3f0ebd78605 100644
--- a/Master/texmf-dist/source/latex/crop/Makefile
+++ b/Master/texmf-dist/source/latex/crop/Makefile
@@ -1,62 +1,29 @@
-# $Id: Makefile,v 1.11 2002/11/22 08:34:30 m Rel $
-
NAME=crop
-ARCHIVE_NAME=$(NAME).tar.gz
-ARCHIVE_CONTENTS=$(NAME).dtx Makefile $(NAME).txt $(NAME).ins
-MAKEIDXOPT=
-DVIPSOPT= #-Pcmz -Pamz
-DEP=$(NAME).sty
-
-all: $(NAME).ps
-
-print: $(NAME).ps
- psbook $(NAME).ps|psnup -2|psselect -e|lpr
- @ echo -n revert paper stack and hit return
- @ read key
- psbook $(NAME).ps|psnup -2|psselect -o -r|lpr
-
-ps: $(NAME).ps
-
-%.ps: %.dvi
- dvips $(DVIPSOPT) $< -o $@
-
-pdf: $(NAME).pdf
+VERSION=`cat VERSION`
+ARCHIVE_NAME=$(NAME).zip
+ARCHIVE_CONTENTS=$(NAME).dtx $(NAME).pdf Makefile README $(NAME).ins
-%.pdf: %.dtx
- pdflatex $<
+all: $(NAME).sty $(NAME).pdf VERSION
-arc: archive
+archive: $(ARCHIVE_CONTENTS)
+ rm -rf $(NAME)/
+ mkdir $(NAME)/
+ cp $(ARCHIVE_CONTENTS) $(NAME)/
+ zip -r $(ARCHIVE_NAME) $(NAME)
-archive: $(NAME).ins
- @ tar -czf $(ARCHIVE_NAME) $(ARCHIVE_CONTENTS)
- @ echo $(ARCHIVE_NAME):
- @ echo ====================
- @ tar -tzf $(ARCHIVE_NAME)
+$(NAME).dtx: $(NAME).dtx.in
+ nancy $(NAME).dtx.in . > $(NAME).dtx
-clean:
- rm -f $(NAME).{log,toc,lot,lof,idx,ilg,ind,aux,blg,bbl,dvi,ins}
+$(NAME).pdf: $(NAME.dtx)
+ latexmk $(NAME).dtx
-distclean: clean
- rm -f $(NAME).{ps,pdf,sty} $(ARCHIVE_NAME)
-
-
-REFWARN = 'Rerun to get cross-references'
-LATEXMAX = 5
-
-%.dvi: %.dtx $(DEP)
- latex $<
- RUNS=$(LATEXMAX); \
- while [ $$RUNS -gt 0 ] ; do \
- if grep $(REFWARN) $*.log > /dev/null; \
- then latex $< ; else break; fi; \
- RUNS=`expr $$RUNS - 1`; \
- done
-
-$(NAME).sty: $(NAME).ins FORCE
+$(NAME).sty: $(NAME).ins
tex $(NAME).ins
$(NAME).ins:
- latex $(NAME).dtx
-
-FORCE:
+ pdflatex $(NAME).dtx
+release: archive
+ git diff --exit-code && \
+ git tag -a -m "Release tag" "v$(VERSION)" && \
+ git push && git push --tags
diff --git a/Master/texmf-dist/source/latex/crop/crop.dtx b/Master/texmf-dist/source/latex/crop/crop.dtx
index 321cd24c241..678c235931f 100644
--- a/Master/texmf-dist/source/latex/crop/crop.dtx
+++ b/Master/texmf-dist/source/latex/crop/crop.dtx
@@ -1,7 +1,6 @@
% \iffalse
-%% File: crop.dtx Copyright (C) 1998--2003 Melchior FRANZ
-%% $Id: crop.dtx,v 1.92 2003/05/19 20:05:17 m Rel $
-%% $Version: 1.9 $
+%% File: crop.dtx Copyright (C) 1998--2017 Melchior FRANZ
+%
%<*preamble>
%
%
@@ -28,15 +27,15 @@
%% ====================================================================
%% @LaTeX-package-file{
%% author = "Melchior FRANZ",
-%% version = "1.9",
-%% date = "20 May 2003",
+%% version = "1.10.2",
+%% date = "05 Jun 2020",
%% filename = "crop.dtx",
%% address = "Melchior FRANZ
%% Rieder Hauptstrasse 52
%% A-5212 SCHNEEGATTERN
%% AUSTRIA",
-%% URL = "http://www.unet.univie.ac.at/~a8603365/",
-%% email = "a8603365@unet.univie.ac.at",
+%% URL = "https://github.com/rrthomas/crop/",
+%% email = "rrt@sc3d.org",
%% codetable = "ISO/ASCII",
%% keywords = "cropmarks, frame, mirror, rotate, invert",
%% supported = "yes",
@@ -75,9 +74,20 @@
%
%
%<*driver>
-\def\fileversion{1.9}
-\def\filedate{2003/05/20}
-\documentclass[draft]{ltxdoc}
+\def\fileversion{1.10.2}
+\def\filedate{2020/06/05}
+\documentclass{ltxdoc}
+\usepackage{hyperref}
+\hypersetup{
+ bookmarksopen,
+ colorlinks,
+ pdftitle={The crop package},
+ pdfauthor={Melchior FRANZ},
+ pdfkeywords={crop marks, mirror, invert, center}
+}
+\usepackage[pdftex]{graphicx,color}
+%
+%
%
\newcommand*\option{\textsf}
\newcommand*\package{\texttt}
@@ -130,7 +140,7 @@
% \fi
%
%
-% \CheckSum{1063}
+% \CheckSum{1098}
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
@@ -154,7 +164,7 @@
% \title{The \CROP\ package}
%
% \author{Melchior \textsc{FRANZ}}
-% \date{May 20, 2003}
+% \date{Nov 19, 2017}
% \maketitle
%
%
@@ -199,6 +209,8 @@
% \changes{v1.9}{2003/05/20}{don't create command sequences by merely
% checking for them}
%
+% \changes{v1.10}{2017/11/19}{fix dimensions of a1, a2, a5 and a6 paper; add
+% support for LuaTeX.}
%
%
% \begin{abstract}
@@ -258,9 +270,9 @@
% b0, b1, b2, b3, b4, b5, b6, letter, legal, executive]\hfill\break
% These options declare the printing paper dimensions. One of them should be
% specified if the \option{center} option or one of the options \option{dvips},
-% \option{pdftex} and \option{vtex} is used. The size options do not
-% define the logical document page size! See section~\ref{sec:custom-logical}
-% for how to achieve this.
+% \option{pdftex}, \option{luatex} and \option{vtex} is used. The size options
+% do not define the logical document page size! See
+% section~\ref{sec:custom-logical} for how to achieve this.
%
% \item[\itemfont width, height]---
% Instead of using one of the pre-defined paper formats as described
@@ -279,11 +291,12 @@
% to center a document on \emph{landscape oriented} paper. It has nothing
% to do with \LaTeX's |landscape| document class option.
%
-% \item[\itemfont dvips, pdftex, pdflatex, vtex, nodriver]---
-% If you are working with \program{dvips}, \program{pdftex} or \program{vtex}
+% \item[\itemfont dvips, pdftex, pdflatex, luatex, lualatex, vtex, nodriver]---
+% If you are working with \program{dvips}, \program{pdftex},
+% \program{luatex} or \program{vtex}
% you may want to pass the dimensions of the paper that you are planning to print on to
-% the respective driver program. Especially viewer programs like \program{gs}
-% or \program{gv} make use of this \emph{bounding box} information. Unfortunately,
+% the respective driver program. Especially viewer programs like \program{evince}
+% or \program{xpdf} make use of this \emph{bounding box} information. Unfortunately,
% this can't be done in a generic way---there's no standard. These options select
% driver specific methods to set the paper size and to rotate and reflect a page.
%
@@ -296,7 +309,8 @@
% through \program{pdflatex}. In this case \CROP\ will automatically use
% the \option{pdflatex} driver. You can also force \CROP\ not to use any
% of the drivers by requesting the \option{nodriver} option.
-% \option{pdflatex} is a synonym for \option{pdftex}.
+% \option{pdflatex} is a synonym for \option{pdftex}, and \option{lualatex}
+% is a synonym for \option{luatex}.
%
% \item[\itemfont mirror]
% This option reflects the whole document, provided that the selected output
@@ -599,7 +613,8 @@
%
% \subsection{Custom printing paper sheet size}
%
-% If you want to use one of the \option{center}, \option{dvips}, \option{pdftex} or \option{vtex}
+% If you want to use one of the \option{center}, \option{dvips}, \option{pdftex},
+% \option{pdflatex}, \option{luatex}, \option{lualatex} or \option{vtex}
% options together with non-standard printing paper, you can set it
% via the \option{width} and \option{height} option, or simply add
% the respective paper definition to your |crop.cfg| file (see \ref{sec:config}).
@@ -772,6 +787,10 @@
% (Tested with |graphics.sty|, version~1.0l as of 1999/02/16.)
%
%
+% \subsubsection{\package{ifluatex.sty}}
+%
+% \CROP's driver detection depends on the \package{ifluatex} package.
+%
%
% \StopEventually{\addtocontents{toc}{\protect\end{multicols}}}
%
@@ -807,7 +826,8 @@
% \begin{macrocode}
%<*package>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{crop}[2003/05/20 v1.9 crop marks (mf)]
+\ProvidesPackage{crop}[2017/11/19 1.10 crop marks (mf)]
+\RequirePackage{ifluatex}
\expandafter\ifx\csname stockwidth\endcsname\relax
\newdimen\stockwidth
\stockwidth\paperwidth
@@ -922,6 +942,8 @@
\DeclareOption{vtex}{\def\CROP@reqdriver{vtex}}
\DeclareOption{pdftex}{\def\CROP@reqdriver{pdftex}}
\DeclareOption{pdflatex}{\def\CROP@reqdriver{pdftex}}
+\DeclareOption{luatex}{\def\CROP@reqdriver{luatex}}
+\DeclareOption{lualatex}{\def\CROP@reqdriver{luatex}}
\DeclareOption{dvips}{\def\CROP@reqdriver{dvips}}
% \end{macrocode}
% \end{macro}
@@ -942,6 +964,8 @@
\DeclareOption{vtex!}{\def\CROP@driver{vtex}}
\DeclareOption{pdftex!}{\def\CROP@driver{pdftex}}
\DeclareOption{pdflatex!}{\def\CROP@driver{pdftex}}
+\DeclareOption{luatex!}{\def\CROP@driver{luatex}}
+\DeclareOption{lualatex!}{\def\CROP@driver{luatex}}
\DeclareOption{dvips!}{\def\CROP@driver{dvips}}
\DeclareOption{nodriver}{\def\CROP@driver{none}}
\DeclareOption{!}{\def\CROP@driver{none}}
@@ -965,10 +989,14 @@
\newcommand*\CROP@evaldriver{%
\ifx\CROP@driver\@empty
\PackageInfo{crop}{requested driver: `\CROP@reqdriver'}%
- \ifx\pdfoutput\@undefined\else
- \ifx\pdfoutput\relax\else
- \ifcase\pdfoutput\else
- \def\CROP@detdriver{pdftex}%
+ \ifluatex
+ \def\CROP@detdriver{luatex}%
+ \else
+ \ifx\pdfoutput\@undefined\else
+ \ifx\pdfoutput\relax\else
+ \ifcase\pdfoutput\else
+ \def\CROP@detdriver{pdftex}%
+ \fi
\fi
\fi
\fi
@@ -1015,6 +1043,7 @@
%
% \begin{macro}{\CROP@init@dvips}
% \begin{macro}{\CROP@init@pdftex}
+% \begin{macro}{\CROP@init@luatex}
% \begin{macro}{\CROP@init@vtex}
% \begin{macro}{\CROP@init@none}
% These macros prepare the \CROP\ package for one of the supported
@@ -1031,8 +1060,17 @@
}
\newcommand*\CROP@init@pdftex{%
\PackageInfo{crop}{using `pdftex' graphics driver}%
- \pdfpagewidth\stockwidth
- \pdfpageheight\stockheight
+ \let\CROP@reflect\CROP@genreflect
+ \let\CROP@rotate\CROP@genrotate
+ \newcommand*\CROP@shiphook{%
+ \pdfpagewidth\stockwidth
+ \pdfpageheight\stockheight
+ }%
+}
+\newcommand*\CROP@init@luatex{%
+ \PackageInfo{crop}{using `luatex' graphics driver}%
+ \pagewidth\stockwidth
+ \pageheight\stockheight
\let\CROP@reflect\CROP@genreflect
\let\CROP@rotate\CROP@genrotate
}
@@ -1051,6 +1089,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
%
%
@@ -1067,8 +1106,9 @@
% \begin{macro}{\CROP@opt@height}
% These options set different standard printing paper sizes, which
% are needed for centering and as a hint for the \program{dvips},
-% \program{pdftex} or \program{vtex} program. Since the physical paper
-% dimensions must not underlie a possible scaling, |true| dimensions
+% \program{pdftex}, \program{luatex} or \program{vtex} program.
+% Since the physical paper
+% dimensions must not undergo a possible scaling, |true| dimensions
% are used. The \option{landscape} option exchanges the |\hoffset| and
% |\voffset| values.
%
@@ -1078,12 +1118,12 @@
\def\CROP@size#1#2{\stockheight#1 \stockwidth#2 }%
}
\DeclareOption{a0}{\CROP@size{841truemm}{1189truemm}}
-\DeclareOption{a1}{\CROP@size{595truemm}{841truemm}}
-\DeclareOption{a2}{\CROP@size{420truemm}{595truemm}}
+\DeclareOption{a1}{\CROP@size{594truemm}{841truemm}}
+\DeclareOption{a2}{\CROP@size{420truemm}{594truemm}}
\DeclareOption{a3}{\CROP@size{297truemm}{420truemm}}
\DeclareOption{a4}{\CROP@size{210truemm}{297truemm}}
-\DeclareOption{a5}{\CROP@size{149truemm}{210truemm}}
-\DeclareOption{a6}{\CROP@size{105truemm}{149truemm}}
+\DeclareOption{a5}{\CROP@size{148truemm}{210truemm}}
+\DeclareOption{a6}{\CROP@size{105truemm}{148truemm}}
\DeclareOption{b0}{\CROP@size{1000truemm}{1414truemm}}
\DeclareOption{b1}{\CROP@size{707truemm}{1000truemm}}
\DeclareOption{b2}{\CROP@size{500truemm}{707truemm}}
@@ -1585,6 +1625,7 @@
\box\@cclv
}
\newcommand*\CROP@@ship{%
+ \csname CROP@shiphook\endcsname
\CROP@shipout\vbox{\CROP@shiplist}%
}
% \end{macrocode}
@@ -1811,7 +1852,8 @@
% The \option{mirror} and \option{rotate} options add a macro to the
% \emph{shiplist,} which then gets every output page and embeds it in
% a \POSTSCRIPT\ environment (\option{dvips}) or lets the
-% \package{graphics} package reflect or rotate it (\option{pdftex}).
+% \package{graphics} package reflect or rotate it (\option{pdftex} or
+% \option{luatex}).
% We could also use the generic operations |\CROP@genreflect| and
% |\CROP@genrotate| for the \option{dvips} mode. They would produce
% correct \PS\ documents, the intermediate \DVI\ document, however,
@@ -2192,4 +2234,4 @@
%
% ^^A \PrintChanges
% ^^A vim:ts=4:sw=4:et:cindent
-% \Finale ^^A.E.I.O.U.^^
+% \Finale ^^A.E.I.O.U.^^ \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/crop/crop.ins b/Master/texmf-dist/source/latex/crop/crop.ins
index fbc4e74c584..d07ecbad9eb 100644
--- a/Master/texmf-dist/source/latex/crop/crop.ins
+++ b/Master/texmf-dist/source/latex/crop/crop.ins
@@ -1,6 +1,6 @@
%% LaTeX2e file `crop.ins'
%% generated by the `filecontents' environment
-%% from source `crop' on 2003/05/20.
+%% from source `crop' on 2020/06/01.
%%
\def\batchfile{crop.ins}
\input docstrip.tex
diff --git a/Master/texmf-dist/source/latex/crossword/cwpuzzle.dtx b/Master/texmf-dist/source/latex/crossword/cwpuzzle.dtx
index 3442440ea4f..c7c64db2ead 100644
--- a/Master/texmf-dist/source/latex/crossword/cwpuzzle.dtx
+++ b/Master/texmf-dist/source/latex/crossword/cwpuzzle.dtx
@@ -1,7 +1,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\filename{cwpuzzle.dtx}
-\def\fileversion{1.9}
-\def\filedate{2014/01/12}
+\def\fileversion{1.10}
+\def\filedate{2020/05/23}
\let\docversion=\fileversion
\let\docdate=\filedate
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -19,11 +19,11 @@
%%
%%
%% Author: Gerd Neugebauer
-%% Im Lerchelshl 5
-%% 64521 Gro-Gerau
+%% Im Lerchels\"ohl 5
+%% 64521 Gro\ss-Gerau
%% Mail: gene@gerd-neugebauer.de
%%
-%% Copyright (c) 1995-2014 Gerd Neugebauer
+%% Copyright (c) 1995-2020 Gerd Neugebauer
%%
%% cwpuzzle.dtx is distributed in the hope that it will be useful,
%% but WITHOUT ANY WARRANTY. No author or distributor accepts
@@ -35,10 +35,6 @@
%% cwpuzzle.dtx, provided this copyright notice is preserved and
%% any modifications are indicated.
%%
-%%
-%% This style is still under development and may be replaced with a
-%% new version which provides an enhanced functionality.
-%%
%<*driver>
\documentclass{ltxdoc}
\usepackage{xcolor}
@@ -77,8 +73,8 @@
% \DoNotIndex{\hfill,\if,\ifx,\large,\let,\makebox,\mbox,\newcommand}
% \DoNotIndex{\newcount,\newdimen,\newenvironment,\newif,\noindent}
% \DoNotIndex{\normalsize,\null,\par,\put,\raggedright,\raggedleft}
-% \DoNotIndex{\relax,\renewcommand,\RequirePackage,\rm,\rule}
-% \DoNotIndex{\scriptsize,\sf,\small,\textsf,\textwidth}
+% \DoNotIndex{\relax,\renewcommand,\RequirePackage,\rm,\rmfamily,\rule}
+% \DoNotIndex{\scriptsize,\sf,\sffamily,\small,\textsf,\textwidth}
% \DoNotIndex{\the,\tiny,\unitlength,\uppercase,\xdef,\ProvidesPackage}
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -568,7 +564,7 @@
% \begin{minipage}{.65\textwidth}\small
% \begin{verbatim}
% \definecolor{gray}{gray}{.9}
-% \PuzzleDefineColorCell{g}{gray}
+% \PuzzleDefineColorCell{c}{gray}
% \begin{Puzzle}{2}{2}
% |{} |[1][cf]X |.
% |[2][c]X |{} |.
@@ -577,7 +573,7 @@
% \end{minipage}\hfill
% \begin{minipage}{.30\textwidth}
% \definecolor{gray}{gray}{.9}
-% \PuzzleDefineColorCell{g}{gray}
+% \PuzzleDefineColorCell{c}{gray}
% \begin{Puzzle}{2}{2}
% |{} |[1][cf]X |.
% |[2][c]X |{} |.
@@ -598,9 +594,10 @@
% default it is typeset in a mini-page of the appropriate width
% centered horizontally and vertically.
%
+% \changes{1.10}{2020/05/23}{Font changing macros modernized}
% \begin{verbatim}
% \begin{Puzzle}{8}{6}
-% \Frame{2}{2}{4}{2}{\sf Crossword\\Puzzle}
+% \Frame{2}{2}{4}{2}{\sffamily Crossword\\Puzzle}
% |[1]E|* |[2]N |U |L |[3]L |* |[4]V|.
% |[5]T|[6]R|I |A |N |G |[7]L|E |.
% |A |U |{} |{} |{} |{} |[8]C|C |.
@@ -613,7 +610,7 @@
% \PuzzleUnsolved\noindent
% \begin{minipage}{.5\textwidth}\PuzzleUnitlength=18pt
% \begin{Puzzle}{8}{6}%
-% \Frame{2}{2}{4}{2}{\sf Crossword\\Puzzle}%
+% \Frame{2}{2}{4}{2}{\sffamily Crossword\\Puzzle}%
% |[1]E|* |[2]N|U|L|[3]L|* |[4]V|.
% |[5]T|[6]R|I|A|N|G|[7]L|E|.
% |A|U|{}|{}|{}|{}|[8]C|C|.
@@ -769,7 +766,7 @@
% to switch to solution mode. Then all numbers are shown. The
% parameters to modify the appearance of a puzzle work here as well. \medskip
%
-% {\PuzzleSolution\PuzzleUnitlength=14pt\footnotesize\sf
+% {\PuzzleSolution\PuzzleUnitlength=14pt\sffamily\footnotesize
% \begin{Sudoku}
% | 7|*2| 4| 1| 3| 5| 6|*9| 8|.
% |*3| 8|*1|*9| 7|*6|*5| 4|*2|.
@@ -811,7 +808,7 @@
% \def\myColor{}\ifcase#1
% \def\myColor{white}\or\def\myColor{red}\or\def\myColor{green}\or\def\myColor{yellow}\or\def\myColor{orange}\or\def\myColor{lime}\or\def\myColor{purple}\or\def\myColor{violet}\or\def\myColor{teal}\or\def\myColor{brown}\else\def\myColor{white}\fi
% \colorbox{\myColor}{\makebox(1,1){#1}}}
-% \PuzzleSolution\PuzzleUnitlength=14pt\footnotesize\sf
+% \PuzzleSolution\PuzzleUnitlength=14pt\sffamily\footnotesize
% \begin{Sudoku}
% | 7|*2| 4| 1| 3| 5| 6|*9| 8|.
% |*3| 8|*1|*9| 7|*6|*5| 4|*2|.
@@ -882,7 +879,7 @@
% \begin{minipage}{.25\textwidth}
% {\PuzzleSolution
% \PuzzleUnitlength=14pt
-% \footnotesize\sf
+% \sffamily\footnotesize
% \begin{Kakuro}{6}{9}
% | - |<:13> |<:37> | - |<:41> |<:7> | - |.
% |<4:> |* 3 | 1 |<14:> | 8 | 6 | - |.
@@ -899,7 +896,7 @@
% \begin{verbatim}
% \PuzzleSolution
% \PuzzleUnitlength=14pt
-% \footnotesize\sf
+% \sffamily\footnotesize
% \begin{Kakuro}{6}{9}
% | - |<:13> |<:37>| - |<:41>|<:7> | - |.
% |<4:> |* 3 | 1 |<14:> | 8 | 6 | - |.
@@ -1191,16 +1188,18 @@
%
% The macro |\PuzzleFont| contains font changing
% commands issued before the puzzle is typeset.
+% \changes{1.10}{2020/05/23}{Font changing macros modernized}
% \begin{macrocode}
-\newcommand\PuzzleFont{\rm\normalsize}
+\newcommand\PuzzleFont{\rmfamily\normalsize}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\PuzzleNumberFont}
% The macro |\PuzzleNumberFont| contains font changing
% commands issued before the numbers in a puzzle are typeset.
+% \changes{1.10}{2020/05/23}{Font changing macros modernized}
% \begin{macrocode}
-\newcommand\PuzzleNumberFont{\sf\scriptsize}
+\newcommand\PuzzleNumberFont{\sffamily\scriptsize}
% \end{macrocode}
% \end{macro}
%
@@ -1970,7 +1969,8 @@
\gdef\Sudoku{\begin{Puzzle}{9}{9}%
\let\Puzzle@pipe=|%
\def\PPa{\Puzzle@pipe[][fS]}%
- \def|##1{\ifx##1*\let\next\PPa\else\Puzzle@pipe{##1}\let\next\relax\fi\next}
+ \def|##1{\ifx##1*\let\next\PPa\else
+ \Puzzle@pipe{##1}\let\next\relax\fi\next}
}
\endgroup
% \end{macrocode}
@@ -2014,8 +2014,9 @@
% The macro |\KakuroNumberFont| is used to typeset the hints, i.e.
% the horizontal and vertical sums.
% \changes{1.8}{2009/09/13}{New}
+% \changes{1.10}{2020/05/23}{Font changing macros modernized}
% \begin{macrocode}
-\newcommand\KakuroNumberFont{\sf\tiny}
+\newcommand\KakuroNumberFont{\sffamily\tiny}
% \end{macrocode}
% \end{macro}
%
@@ -2023,6 +2024,7 @@
% The macro |\Kakuro@cell| is used to typeset the cells. It
% analyzes the argument and acts accordingly.
% \changes{1.8}{2009/09/13}{New}
+% \changes{1.10}{2020/05/23}{Font changing macros modernized}
% \begin{macrocode}
\def\Kakuro@cell#1{%
\ifx#1. \def\next{\Puzzle@pipe.}%
@@ -2059,12 +2061,16 @@
\def\Kakuro@hint#1:#2>{%
\def\x{#2}%
\ifx\x\empty\else
- \put(\Puzzle@X,\Puzzle@Y){\makebox(1,.8)[r]{\parbox{.95\unitlength}{\raggedright\KakuroNumberFont
+ \put(\Puzzle@X,\Puzzle@Y){%
+ \makebox(1,.8)[r]{\parbox{.95\unitlength}{%
+ \raggedright\KakuroNumberFont
$\blacktriangledown$\\#2}}}
\fi
\def\x{#1}%
\ifx\x\empty\else
- \put(\Puzzle@X,\Puzzle@Y){\makebox(1,1.2){\parbox{.95\unitlength}{\raggedleft\KakuroNumberFont
+ \put(\Puzzle@X,\Puzzle@Y){%
+ \makebox(1,1.2){\parbox{.95\unitlength}{%
+ \raggedleft\KakuroNumberFont
#1 $\blacktriangleright$\\\mbox{}}}}
\fi
\Puzzle@pipe[][\KakuroHintType]{ }}%
@@ -2138,6 +2144,7 @@
% Now, that everything is in place we can arrange some package
% options.
% \changes{1.6}{2006/08/12}{Several style options defined}
+% \changes{1.10}{2020/05/23}{Font changing macros modernized}
% \begin{macrocode}
\DeclareOption{numbered}{\Puzzle@SolutionNumberedtrue}
\DeclareOption{nocenter}{\let\PuzzlePre=\relax
@@ -2145,11 +2152,11 @@
\DeclareOption{unboxed}{\let\PuzzleCluePre=\relax
\let\PuzzleCluePost=\relax}
\DeclareOption{normalsize}{\PuzzleUnitlength=20pt
- \def\PuzzleFont{\rm\normalsize}}
+ \def\PuzzleFont{\rmfamily\normalsize}}
\DeclareOption{small}{\PuzzleUnitlength=16pt
- \def\PuzzleFont{\rm\small}}
+ \def\PuzzleFont{\rmfamily\small}}
\DeclareOption{large}{\PuzzleUnitlength=24pt
- \def\PuzzleFont{\rm\large}}
+ \def\PuzzleFont{\rmfamily\large}}
\DeclareOption{german}{%
\renewcommand\PuzzleWordsText[1]{Worte der L\"ange #1: }%
\renewcommand\PuzzleLettersText{Benutzte Buchstaben: }%
diff --git a/Master/texmf-dist/source/latex/crossword/cwpuzzle.ins b/Master/texmf-dist/source/latex/crossword/cwpuzzle.ins
index 31d4c39b549..b7cc2b3b7fb 100644
--- a/Master/texmf-dist/source/latex/crossword/cwpuzzle.ins
+++ b/Master/texmf-dist/source/latex/crossword/cwpuzzle.ins
@@ -1,11 +1,11 @@
%%------------------------------------------------------------------
%% Driver file to extract the dtx style and package file.
%%
-%% Copyright (C) 1995-2014 Gerd Neugebauer
+%% Copyright (C) 1995-2020 Gerd Neugebauer
%%
%% Author: Gerd Neugebauer
-%% Im Lerchelshl 5
-%% 64521 Gro-Gerau
+%% Im Lerchelsb\"ohl 5
+%% 64521 Gro\ss-Gerau
%% Mail: gene@gerd-neugebauer.de
%%
%% cwpuzzle.ins is distributed in the hope that it will be useful,
diff --git a/Master/texmf-dist/source/latex/cryptocode/cryptocode.dtx b/Master/texmf-dist/source/latex/cryptocode/cryptocode.dtx
new file mode 100644
index 00000000000..f2cf2f7a9aa
--- /dev/null
+++ b/Master/texmf-dist/source/latex/cryptocode/cryptocode.dtx
@@ -0,0 +1,9392 @@
+%\iffalse
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\DeclareRelease{v0.30}{2018-11-11}{cryptocode-2018-11-11.sty}
+\DeclareRelease{v0.32}{2020-04-24}{cryptocode-2020-04-24.sty}
+\DeclareCurrentRelease{v0.40}{2020-07-10}
+\ProvidesPackage{cryptocode}
+ [2020/07/10 v0.40 Cryptocode LaTeX package for typesetting pseudocode, algorithms and protocols as well as cryptographic proofs.]
+%</package>
+%\fi
+% \iffalse
+% Doc-Source file to use with LaTeX2e
+% Copyright (C) 2020 Arno Mittelbach, all rights reserved.
+% \fi
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[T1]{fontenc}
+\usepackage{lmodern}
+\usepackage[usenames]{xcolor}
+\usepackage{hypdoc}
+\usepackage[
+ n,
+ operators,
+ advantage,
+ sets,
+ adversary,
+ landau,
+ probability,
+ notions,
+ logic,
+ ff,
+ mm,
+ primitives,
+ events,
+ complexity,
+ oracles,
+ asymptotics,
+ keys]{cryptocode}
+
+\createpseudocodeblock{pcb}{center,boxed}{}{}{}
+\createprocedureblock{procb}{center,boxed}{}{}{}
+\usepackage{csquotes}
+\usepackage{fullpage}
+\usepackage{dashbox}
+\usepackage{textcomp}
+\usepackage{url}
+\usepackage{xspace}
+
+\usetikzlibrary{shapes.callouts}
+
+\usepackage{listings}
+
+\usepackage{trace}
+
+\usepackage{makeidx}
+\usepackage{mdframed}
+
+\definecolor{mygreen}{rgb}{0,0.6,0}
+\definecolor{mygray}{rgb}{0.1,0.1,0.1}
+\definecolor{verylightgray}{rgb}{0.9,0.9,0.9}
+\definecolor{mymauve}{rgb}{0.58,0,0.82}
+
+\let\amipagebreak\pagebreak
+
+\setlength{\textwidth}{386pt}
+\addtolength\marginparwidth{50pt}
+\addtolength\oddsidemargin{40pt}
+\addtolength\evensidemargin{40pt}
+
+\lstset{language=[LaTeX]TeX,
+ backgroundcolor=\color{verylightgray}, % choose the background color; you must add \usepackage{color} or \usepackage{xcolor}
+ rulecolor=\color{lightgray},
+ basicstyle=\scriptsize, % the size of the fonts that are used for the code
+ breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
+ breaklines=true, % sets automatic line breaking
+ captionpos=b, % sets the caption-position to bottom
+ commentstyle=\color{mygreen}, % comment style
+ escapeinside={\%*}{*)}, % if you want to add LaTeX within your code
+ extendedchars=true, % lets you use non-ASCII characters; for 8-bits encodings only, does not work with UTF-8
+ frame=single, % adds a frame around the code
+ keepspaces=true, % keeps spaces in text, useful for keeping indentation of code (possibly needs columns=flexible)
+ keywordstyle=\color{blue}, % keyword style
+ numbers=left, % where to put the line-numbers; possible values are (none, left, right)
+ numbersep=5pt, % how far the line-numbers are from the code
+ numberstyle=\scriptsize\color{mygray}, % the style that is used for the line-numbers
+ rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. comments (green here))
+ showspaces=false, % show spaces everywhere adding particular underscores; it overrides 'showstringspaces'
+ showstringspaces=false, % underline spaces within strings only
+ showtabs=false, % show tabs within strings adding particular underscores
+ stepnumber=1, % the step between two line-numbers. If it's 1, each line will be numbered
+ stringstyle=\color{mymauve}, % string literal style
+ frameround=ftff,
+ belowskip=-0.8 \baselineskip,
+ aboveskip=1em,
+ tabsize=2, % sets default tabsize to 2 spaces
+ title=\lstname }
+
+ \CodelineIndex
+\CodelineIndex
+\RecordChanges
+\begin{document}
+\DocInput{cryptocode.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \changes{v0.10}{2015/03/30}{Initial version}
+% \changes{v0.11}{2016/11/30}{changed command pckeystyle to ensure that subscripts on $\sk$ and $\pk$ are aligned the same
+% before, $(\sk_R, \pk_R)$ had slightly misaligned subscripts due to Tex treating
+% subscripts on composite objects with descenders differently than without.}
+% ^^A see \url{https://groups.google.com/forum/#!msg/comp.text.tex/IaXu_xBG06Q/CibRPH5GCAAJ}
+%
+% \changes{v0.11}{2016/11/30}{Added \textbackslash{}NAND command.}
+% \changes{v0.11}{2016/11/30}{Added \emph{pcmbox} environment for matrices in pseudocode.}
+%
+% \changes{v0.20}{2016/12/02}{Changed \emph{minheight} for bbrbox environment to actually reflect a minimum height in tikz.
+% The old minheight which added space at the bottom was preserved as \emph{addheight}.}
+% \changes{v0.20}{2016/12/02}{Added namepos middle for bbrbox.}
+% \changes{v0.20}{2016/12/02}{Added \textbackslash{}pcfail.}
+% \changes{v0.20}{2016/12/02}{Added valign to pseudocode to allow minipage vertical alignment.}
+% \changes{v0.20}{2016/12/02}{Ensure line numbers are right aligned to allow for two digit linenumbers having the same width.}
+%
+% \changes{v0.04}{2017/08/26}{added \textbackslash{}pcabort.}
+% \changes{v0.04}{2017/08/26}{better control whitespace for \textbackslash{}pcif, \textbackslash{}pcelse, \textbackslash{}pcelseif.}
+%
+% \changes{v0.05}{2017/10/02}{side and oside support to \textbackslash{}bbroracleqryto and \textbackslash{}bbroracleqryfrom}
+% \changes{v0.05}{2017/10/02}{add bottom to namepos in bbrbox}
+% \changes{v0.05}{2017/10/02}{names for brrinput and bbroutput}
+% \changes{v0.05}{2017/10/02}{angle for bbrloop}
+% \changes{v0.05}{2017/10/02}{fix length for bbrinput}
+% \changes{v0.05}{2017/10/02}{introduce hoffset for bbrinput}
+%
+% \changes{v0.06}{2017/12/21}{added \textbackslash{}pcunless}
+%
+% \changes{v0.30}{2018/11/11}{replace obsolete l3regex}
+%
+% \changes{v0.31}{2018/11/26}{added \textbackslash{}tprob (variants for prob and co for in-text)}
+% \changes{v0.31}{2018/11/26}{added \textbackslash{}prp}
+%
+% \changes{v0.32}{2020/01/11}{allow to control spacing with \textbackslash{}pcfor}
+% \changes{v0.32}{2020/01/11}{allow overwriting rule command in pseudocode via headlinecmd (defaults to \textbackslash{}hrule)}
+%
+% \changes{v0.40}{2020/06/20}{Bigger refactoring. Not completely backwards compatible. In particular, optimized spacing of pseudocode blocks and black box reductions.}
+% \changes{v0.40}{2020/06/20}{Switched to mathtools \emph{DeclarePairedDelimiter} for paired operators.
+% Each paired operator comes in two forms, e.g, \emph{abs} and \emph{tabs} the latter to be used in flowtext
+% which does not scale the outer delimiters.}
+% \changes{v0.40}{2020/06/20}{Adjusted spacing via \textbackslash{}pcaboveskip and \textbackslash{}pcbelowskip which are
+% added to \textbackslash{}pseudocode blocks and \emph{pchstack} environments}
+% \changes{v0.40}{2020/06/20}{Added block forms for pseudocode and procedure commands (\textbackslash{}pseudocodeblock and \textbackslash{}procedureblock).}
+% \changes{v0.40}{2020/06/20}{Added minlineheight option to \textbackslash{}pseudocode.}
+% \changes{v0.40}{2020/06/20}{Added headheight option to \textbackslash{}pseudocode.}
+% \changes{v0.40}{2020/06/20}{Added \textbackslash{}argmax and \textbackslash{}argmin to operators.}
+% \changes{v0.40}{2020/06/20}{Added \textbackslash{}pindist, \textbackslash{}sindist, and \textbackslash{}cindist to operators.}
+% \changes{v0.40}{2020/06/20}{Added aboveskip and belowskip option to \textbackslash{}pchstack and \textbackslash{}pcvstack.}
+% \changes{v0.40}{2020/06/20}{Added boxed, inline, noindent options to \textbackslash{}pchstack and \textbackslash{}pcvstack.}
+% \changes{v0.40}{2020/06/20}{Added space option to \textbackslash{}pchstack and \textbackslash{}pcvstack.}
+% \changes{v0.40}{2020/06/20}{Renamed horizontal spacing commands \textbackslash{}beforepcskip and \textbackslash{}afterpcskip to \textbackslash{}pcbeforeskip and \textbackslash{}pcafterskip.}
+% \changes{v0.40}{2020/06/20}{Added command \textbackslash{}pcsetargs to define default arguments for pseudocode blocks.}
+% \changes{v0.40}{2020/06/20}{Added command \textbackslash{}pcsethstackargs and \textbackslash{}pcsetvstackargs to define default arguments for hstack and vstack environments.}
+% \changes{v0.40}{2020/06/20}{Adapted bbrenv environment to take key value option list. Old format is still supported but deprecated.}
+% \changes{v0.40}{2020/06/20}{Added additional polynomials.}
+% \changes{v0.40}{2020/06/20}{Added additional adversaries.}
+% \changes{v0.40}{2020/06/20}{Added additional complexity classes.}
+% \changes{v0.40}{2020/06/20}{Added oracles package option.}
+% \changes{v0.40}{2020/06/20}{Fixed spacing issues with black box reduction messages.}
+% \changes{v0.40}{2017/10/02}{Added clockwise, leftstyle, centerstyle, rightstyle for bbrloop. Adjusted placing of center.}
+% \changes{v0.40}{2017/10/02}{Added fixedoffset, fixedboffset, islast for reduction messages.}
+%
+%
+%
+%
+%
+% \author{Arno Mittelbach\\
+% \texttt{mail@arno-mittelbach.de}\\
+% \url{https://github.com/arnomi/cryptocode}\thanks{If you use cryptocode in your work, consider starring the repository on GitHub and/or rating it on CTAN.}}
+% \title{\Huge Cryptocode \\ \large\textsc{Typesetting Cryptography}}
+%
+%
+% \maketitle
+%
+%
+%
+%
+% \begin{abstract}
+% \thispagestyle{empty}
+% The cryptocode package provides a set of macros to ease the typesetting of
+% pseudocode, algorithms and protocols (such as the one below). In addition it comes with a wide range of tools to typeset cryptographic papers (hence the name).
+% This includes simple predefined commands for typesetting probabilities and \enquote{commonly encountered math}
+% as well as for concepts such as
+% a security parameter $\secparam$ or advantage terms $\advantage{prf}{\adv,\prf} = \negl$. Furthermore, it includes
+% environments to layout game-based proofs or black-box reductions.
+%
+% \vspace{2em}
+% \begin{center}
+% \fbox{
+% \pseudocode{%
+% \textbf{ Alice} \< \< \textbf{ Bob} \\[0.1\baselineskip][\hline]
+% \<\< \\[-0.5\baselineskip]
+% x \sample \ZZ_q \< \< \\
+% X \gets g^x \<\< \\[-4ex]
+% \< \sendmessageright*{\GG,q,g,X} \< \\[-2ex]
+% \<\< y \sample \ZZ_q \\
+% \<\< Y \gets g^y \\[-4ex]
+% \< \sendmessageleft*{Y} \< \\
+% \key_A \gets Y^x \<\< \key_B \gets X^y }
+% }
+% \end{center}
+%
+%
+% \end{abstract}
+% \newpage
+%
+% \pagenumbering{roman}
+%
+% \tableofcontents
+% \thispagestyle{empty}
+% \newpage
+%
+% \pagenumbering{arabic}
+%
+%
+% \section{Cryptocode by Example}
+%
+% The cryptocode package provides a set of commands to ease the typesetting of
+% pseudocode, protocols, game-based proofs and black-box reductions. In addition it comes
+% with a large number of predefined commands. In this section we present the various features of
+% cryptocode by giving small examples. But first, let's load the package
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\usepackage[
+ n, % or lambda
+ advantage,
+ operators,
+ sets,
+ adversary,
+ landau,
+ probability,
+ notions,
+ logic,
+ ff,
+ mm,
+ primitives,
+ events,
+ complexity,
+ oracles,
+ asymptotics,
+ keys
+]{cryptocode}\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% Note that all the options refer to a set of commands. That is, without any options cryptocode will provide the mechanisms
+% for writing pseudocode, protocols, game-based proofs and black-box reductions but not define additional commands,
+% such as |\pk| or |\sk| (for typesetting public and private/secret keys) which are part of the keys option.
+% We discuss the various options and associated commands in Section~\ref{chap:commands}.
+%
+%
+% \subsection{Pseudocode}
+% The cryptocode package tries to make writing pseudocode easy and enjoyable. The
+% |\pseudocode| command takes a single parameter where you can start writing
+% code in mathmode using \lstinline{\\} as line breaks. Following is an $\indcpa$ game
+% definition using various commands from cryptocode to ease writing keys (\lstinline{\pk,\sk}),
+% sampling (\lstinline{\sample}), and more:
+%
+% \medskip
+% \pseudocode[linenumbering]{
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen (\secparam) \\
+% (\state,m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c, \state) \\
+% \pcreturn b = b' }
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+ \pseudocode[linenumbering]{
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen (\secparam) \\
+ (\state,m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c, \state) \\
+ \pcreturn b = b' }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% \amipagebreak
+%
+% In many cases, we want to set pseudocode blocks in-between paragraphs with spacing
+% similar to how we would offset equations. For this, and for laying out multiple code
+% blocks, cryptocode offers \enquote{stacking} environments |\pchstack| and |\pcvstack|.
+% For typesetting a code block nicely centered and boxed
+% \begin{pchstack}[center,boxed]
+% \pseudocode[linenumbering]{
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen (\secparam) \\
+% (\state,m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c, \state) \\
+% \pcreturn b = b' }
+% \end{pchstack}
+% you could thus use:
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\begin{pchstack}[center,boxed]
+ \pseudocode[linenumbering]{
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen (\secparam) \\
+ (\state,m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c, \state) \\
+ \pcreturn b = b' }
+\end{pchstack}\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% As this is a common task, cryptocode offers the |\pseudocodeblock| command which
+% is a shorthand for the above (without the frame). In case you want to provide different
+% options or a shorter command (say |\pcb|) you can easily define the command via
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+ \createpseudocodeblock{pcb}{center,boxed}{}{}{}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% The above could now be written, more succinctly as
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\pcb[linenumbering]{
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen (\secparam) \\
+ (\state,m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c, \state) \\
+ \pcreturn b = b'
+}\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+%
+% The pseudocode command (and its block variant) takes a single mandatory argument (the code) plus an optional argument
+% which allows you to specify options in a key=value fashion. In the above example we used the linenumbering
+% option.
+%
+% \medskip
+%
+% It is easy to define a heading for your code. Either specify the header using the option \enquote{head} or use
+% the |\procedure| command (or its block variant |\procedureblock|) which takes an additional argument to specify the headline.
+%
+% \procedureblock[linenumbering]{$\indcpa_\enc^\adv(\secpar)$}{
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen (\secparam) \\
+% (\state,m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c, \state) \\
+% \pcreturn b = b' }
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\procedureblock[linenumbering]{$\indcpa_\enc^\adv(\secpar)$}{
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen (\secparam) \\
+ (\state,m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c, \state) \\
+ \pcreturn b = b' }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% Similarly to before, we can define a shorthand and boxed variant as
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+ \createprocedureblock{procb}{center,boxed}{}{}{}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+%
+% There is a lot more that we will discuss in detail in Section~\ref{chap:pseudocode}. Here, for example,
+% is the same code with an overlay explanation and a division of the pseudocode.
+%
+% \begin{pcimage}
+% \procb[linenumbering]{$\indcpa_\enc^\adv(\secpar)$}{
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen (\secparam)\pcnode{kgen} \pclb
+% \pcintertext[dotted]{Setup Completed}
+% (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c, \state) \\
+% \pcreturn b = b' }
+%
+% \pcdraw{
+% \node[rectangle callout,callout absolute pointer=(kgen),fill=orange]
+% at ([shift={(+3,-1)}]kgen) {
+% \begin{varwidth}{3cm}
+% $\kgen(\secparam)$ samples a public key $\pk$ and a private key $\sk$.
+% \end{varwidth}
+% };
+% }
+% \end{pcimage}
+%
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+ \begin{pcimage}
+ \procedureblock[linenumbering]{$\indcpa_\enc^\adv(\secpar)$}{%
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen(\secparam)\pcnode{kgen} \pclb
+ \pcintertext[dotted]{Setup Completed}
+ (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c, \state) \\
+ \pcreturn b = b' }
+
+ \pcdraw{
+ \node[rectangle callout,callout absolute pointer=(kgen),fill=orange]
+ at ([shift={(+3,-1)}]kgen) {
+ \begin{varwidth}{3cm}
+ $\kgen(\secparam)$ samples a public key $\pk$ and a private key $\sk$.
+ \end{varwidth}
+ };
+ }
+ \end{pcimage}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Stacking}
+%
+% To arrange multiple procedures, cryptocode offers horizontal and vertical stacking
+% environments |\pchstack| and |\pcvstack|. In the example below we arrange four
+% code blocks in three columns equispaced with 1cm distance and stack two procedures
+% in the center column.
+%
+% \begin{pchstack}[center,space=1cm]
+% \procedure{A}{
+% a \sample A \\
+% \pcreturn a
+% }
+%
+% \begin{pcvstack}[boxed,space=0.5cm]
+% \procedure{B.1}{
+% b \sample B \\
+% \pcreturn b
+% }
+% \procedure{B.1}{
+% b \sample B \\
+% \pcreturn b
+% }
+% \end{pcvstack}
+%
+% \procedure{C}{
+% c \sample C \\
+% \pcreturn c
+% }
+% \end{pchstack}
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\begin{pchstack}[center,space=1cm]
+ \procedure{A}{
+ a \sample A \\
+ \pcreturn a
+ }
+
+ \begin{pcvstack}[boxed,space=0.5cm]
+ \procedure{B.1}{
+ b \sample B \\
+ \pcreturn b
+ }
+ \procedure{B.1}{
+ b \sample B \\
+ \pcreturn b
+ }
+ \end{pcvstack}
+
+ \procedure{C}{
+ c \sample C \\
+ \pcreturn c
+ }
+\end{pchstack}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Columns}
+% The |\pseudocode| and |\procedure| commands allow the usage of multiple columns.
+% You switch to a new column by inserting a |\>|. This is similar to using an |align|
+% environment and placing a tabbing \& character.\footnote{In fact, the \emph{pseudocode} command
+% is based on amsmath's flalign environment.}
+% \pcb{
+% \textbf{First} \> \textbf{Second} \> \textbf{Third} \> \textbf{Fourth} \\
+% b \sample \bin \> b \sample \bin \> b \sample \bin \> b \sample \bin}
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocodeblock{%
+ \textbf{First} \> \textbf{Second} \> \textbf{Third} \> \textbf{Fourth} \\
+ b \sample \bin \> b \sample \bin \> b \sample \bin \> b \sample \bin}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% As you can see the first column is left aligned the second right, the third left and so forth.
+% In order to get only left aligned columns you could thus always skip a column by
+% using |\>\>| or you can alternatively use |\<| as a shorthand for |\>\>|.
+% \pcb{
+% \textbf{First} \< \textbf{Second} \< \textbf{Third} \< \textbf{Fourth} \\
+% b \sample \bin \< b \sample \bin \< b \sample \bin \< b \sample \bin}
+%
+% \subsection{Protocols}
+% Using columns makes it easy to write even complex protocols. Following is a simple
+% three-party protocol.
+% \pcb{
+% \textbf{Alice} \< \< \textbf{Bob} \< \< \textbf{Charlie} \\[][\hline]
+% \text{work} \< \< \< \< \\
+% \< \sendmessageright{top=Work result,topstyle=red} \< \< \< \\
+% \< \< \text{work} \< \< \\
+% \< \< \< \sendmessageright{top=Work result,bottom=Bottom message} \< \\
+% \< \< \< \< \text{work} \\
+% \< \sendmessageleftx{8}{\text{A long message for Alice}} \< \\
+% \text{finalize} \< \< \< \< }
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+ \pseudocodeblock{
+ \textbf{Alice} \< \< \textbf{Bob} \< \< \textbf{Charlie} \\[][\hline]
+ \text{work} \< \< \< \< \\
+ \< \sendmessageright{top=Work result,topstyle=red} \< \< \< \\
+ \< \< \text{work} \< \< \\
+ \< \< \< \sendmessageright{top=Work result,bottom=Bottom message} \< \\
+ \< \< \< \< \text{work} \\
+ \< \sendmessageleftx{8}{\text{A long message for Alice}} \< \\
+ \text{finalize} \< \< \< \< }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% The commands |\sendmessageright| and |\sendmessageleft| are very flexible and
+% allow to style the sending of messages in various ways. Also note the |\\[][\hline]| at the end of the
+% first line. Here the first optional argument allows us to specify the lineheight (similarly to the behavior in an
+% align environment) while the second optional argument allows us to, for example, draw a horizontal line.
+%
+% \medskip
+% In multi-player protocols such as the one
+% above the commands |\sendmessagerightx| and |\sendmessageleftx| (note the x at the end)
+% allow to send messages over multiple columns. In the example, as we were using |\<| the
+% final message thus spans 8 columns.
+%
+% \medskip
+% For basic protocols you might also utilize the |\sendmessageright*| and |\sendmessageleft*|
+% commands which simply take a message which is displayed (in math mode) on top.
+% \pcb{
+% \textbf{ Alice} \< \< \textbf{ Bob} \\[0.1\baselineskip][\hline]
+% \<\< \\[-0.5\baselineskip]
+% x \sample \ZZ_q \< \< \\
+% X \gets g^x \<\< \\
+% \< \sendmessageright*{\GG,q,g,X} \< \\
+% \<\< y \sample \ZZ_q \\
+% \<\< Y \gets g^y \\
+% \< \sendmessageleft*{Y} \< \\
+% \key_A \gets Y^x \<\< \key_B \gets X^y
+% }
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\pseudocodeblock{
+ \textbf{ Alice} \< \< \textbf{ Bob} \\[0.1\baselineskip][\hline]
+ \<\< \\[-0.5\baselineskip]
+ x \sample \ZZ_q \< \< \\
+ X \gets g^x \<\< \\
+ \< \sendmessageright*{\GG,q,g,X} \< \\
+ \<\< y \sample \ZZ_q \\
+ \<\< Y \gets g^y \\
+ \< \sendmessageleft*{Y} \< \\
+ \key_A \gets Y^x \<\< \key_B \gets X^y }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% We will discuss protocols in greater detail in Section~\ref{chap:protocols}.
+%
+% \subsection{Game-Based Proofs}
+% Cryptocode supports authors in visualizing game-based proofs. It defines an environment
+% |gameproof| which allows to wrap a number of game procedures displaying helpful
+% information as to what changes from game to game and to what each step is reduced.
+%
+%\begin{gameproof}
+% \begin{pchstack}[center,space=1em]
+% \gameprocedure[linenumbering,minlineheight=1.5em]{%
+% \text{Step 1} \\
+% \\
+% \text{Step 2}
+% }
+%
+% \tbxgameprocedure[minlineheight=1.5em]{%
+% \text{Step 1} \\
+% \pcbox{\text{From game 3 on}} \\
+% \gamechange{\text{Step 3 is different}}
+% }
+%
+% \gameprocedure[minlineheight=1.5em]{%
+% \text{Step 1} \\
+% \text{From game 3 on}\\
+% \text{\gamechange{Step 3 adapted again}}
+% }
+%
+% \end{pchstack}
+%\end{gameproof}
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\begin{gameproof}
+ \begin{pchstack}[center,space=1em]
+ \gameprocedure[linenumbering,minlineheight=1.5em]{%
+ \text{Step 1} \\
+ \\
+ \text{Step 3}
+ }
+
+ \tbxgameprocedure[minlineheight=1.5em]{%
+ \text{Step 1} \\
+ \pcbox{\text{From game 3 on}} \\
+ \gamechange{\text{Step 3 is different}}
+ }
+
+ \gameprocedure[minlineheight=1.5em]{%
+ \text{Step 1} \\
+ \text{From game 3 on}\\
+ \text{\gamechange{Step 3 adapted again}}
+ }
+
+ \end{pchstack}
+\end{gameproof}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Note that we made use of the option \enquote{mode=text} in the above example which tells the underlying pseudocode
+% command to not work in math mode but in plain text mode. We will discuss how to visualize game-based proofs in Section~\ref{chap:gbproofs}.
+%
+% \subsection{Black-Box Reductions}
+% Cryptocode provides a strucured syntax to visualize black-box reductions. Basically cryptocode
+% provides an environment to draw boxes that may have oracles and/or challengers and that can be communicated with.
+% Cryptocode makes heavy use of TIKZ (\url{https://www.ctan.org/pkg/pgf}) for this, which gives you
+% quite some control over how things should look like. Additionally, as you can specify node names
+% (for example the outer box in the next example is called \enquote{A}) you can easily extend the pictures
+% by using plain TIKZ commands. Following is an example reduction. We discuss the details in Section~\ref{chap:bbr}.
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=0.5cm]{A}
+% \begin{bbrbox}[name=Reduction]
+% \pseudocode{
+% \text{Do something} \\
+% \text{Step 2}
+% }
+%
+% \begin{bbrenv}{B}
+% \begin{bbrbox}[name=Adversary,minheight=2.25cm]
+% \end{bbrbox}
+%
+% \bbrmsgto{top=$m$}
+% \bbrmsgfrom{top=$\sigma$}
+% \bbrmsgtxt{\pseudocode{%
+% \text{more work}
+% }}
+% \bbrmsgto{top=$m$}
+% \bbrmsgfrom{top=$\sigma$}
+%
+% \bbrqryto{side=$m$}
+% \bbrqryfrom{side=$b$}
+% \end{bbrenv}
+%
+% \pseudocode{
+% \text{finalize}
+% }
+%
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+%
+% \begin{bbroracle}{OraA}
+% \begin{bbrbox}[name=Oracle 1,minheight=1cm]
+% \end{bbrbox}
+% \end{bbroracle}
+% \bbroracleqryto{top=$m$}
+% \bbroracleqryfrom{top=$b$}
+%
+% \begin{bbroracle}{OraB}
+% \begin{bbrbox}[name=Oracle 2,minheight=1cm]
+% \end{bbrbox}
+% \end{bbroracle}
+% \bbroracleqryto{top=$m$}
+% \bbroracleqryfrom{top=$b$}
+% \end{bbrenv}
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\begin{bbrenv}{A}
+ \begin{bbrbox}[name=Reduction]
+ \pseudocode{
+ \text{Do something} \\
+ \text{Step 2}
+ }
+
+ \begin{bbrenv}{B}
+ \begin{bbrbox}[name=Adversary,minheight=2.25cm]
+ \end{bbrbox}
+
+ \bbrmsgto{top=$m$}
+ \bbrmsgfrom{top=$\sigma$}
+ \bbrmsgtxt{\pseudocode{%
+ \text{more work}
+ }}
+ \bbrmsgto{top=$m$}
+ \bbrmsgfrom{top=$\sigma$}
+
+ \bbrqryto{side=$m$}
+ \bbrqryfrom{side=$b$}
+ \end{bbrenv}
+
+ \pseudocode{
+ \text{finalize}
+ }
+
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+
+ \begin{bbroracle}{OraA}
+ \begin{bbrbox}[name=Oracle 1,minheight=1cm]
+ \end{bbrbox}
+ \end{bbroracle}
+ \bbroracleqryto{top=$m$}
+ \bbroracleqryfrom{top=$b$}
+
+ \begin{bbroracle}{OraB}
+ \begin{bbrbox}[name=Oracle 2,minheight=1cm]
+ \end{bbrbox}
+ \end{bbroracle}
+ \bbroracleqryto{top=$m$}
+ \bbroracleqryfrom{top=$b$}
+\end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \amipagebreak
+% \section{Notation Macros}
+% \label{chap:commands}
+% \index{package options}
+% In this section we'll discuss the various commands for notation that can be
+% loaded via package options.
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\usepackage[
+ n, % or lambda
+ advantage,
+ operators,
+ sets,
+ adversary,
+ landau,
+ probability,
+ notions,
+ logic,
+ ff,
+ mm,
+ primitives,
+ events,
+ complexity,
+ oracles,
+ asymptotics,
+ keys
+ ]{cryptocode}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \textbf{Remark. }
+% Note that the available command sets are far from complete and
+% reflect my own work (especially once you get to cryptographic notions and primitives).
+% In case you feel that something should be added feel free to drop me an email,
+% or better yet, open an issue and pull request on github (\url{https://github.com/arnomi/cryptocode}).
+%
+% \subsection{Security Parameter}
+% \index{security parameter|see {package options}}
+% \index{package options!security parameter}
+% In cryptography we make use of a security parameter which is usually denoted by $1^n$ or $1^\lambda$. The cryptocode
+% package, when loading either option \enquote{n} or option \enquote{lambda} will define the commands
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+ \secpar
+ \secparam
+ \SECPAR
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% The first command provides the \enquote{letter}, i.e., either $n$ or $\lambda$, whereas |\secparam| prints
+% |\1^\secpar| (i.e., $\secparam$ for option \enquote{n}). Finally, |\SECPAR| yields $N_0$ (resp.~$\Lambda$)
+% and is meant to be used in sentences such as, \enquote{there exists $\SECPAR\in\NN$ such that for all $\secpar \geq \SECPAR$, ...}
+%
+% \subsection{Advantage Terms}
+% Load the package option ``advantage'' in order to define the command |\advantage| used to specify advantage terms such as:
+% \[
+% \advantage{prf}{\adv,\prf}
+% \]
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \advantage{prf}{\adv,\prf}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Specify an optional third parameter to replace the $(\secpar)$.
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \advantage{prf}{\adv,\prf}[(arg)]
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% In order to redefine the styles in which superscript and subscript are set, or in case
+% you want to replace the term $\pcadvantagename$, redefine:
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\pcadvantagename}{\mathsf{Adv}}
+ \renewcommand{\pcadvantagesuperstyle}[1]{\mathrm{\MakeLowercase{#1}}}
+ \renewcommand{\pcadvantagesubstyle}[1]{#1}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Math Operators}
+% \index{operators|see {package options}}
+% \index{package options!operators}
+% \index{math operators|see {package options}}
+% \index{\textbackslash{} sample}
+% \index{\textbackslash{} floor}
+% \index{\textbackslash{} tfloor}
+% \index{\textbackslash{} ceil}
+% \index{\textbackslash{} tceil}
+% \index{\textbackslash{} Angle}
+% \index{\textbackslash{} tAngle}
+% \index{\textbackslash{} abs}
+% \index{\textbackslash{} tabs}
+% \index{\textbackslash{} norm}
+% \index{\textbackslash{} tnorm}
+% \index{\textbackslash{} concat}
+% \index{\textbackslash{} emptystring}
+% \index{\textbackslash{} argmax}
+% \index{\textbackslash{} argmin}
+% \index{\textbackslash{} pindist}
+% \index{\textbackslash{} cindist}
+% \index{\textbackslash{} sindist}
+% The \enquote{operators} option provides the following list of commands:
+%
+% \begin{center}
+% \begin{tabular}{l p{5cm} l l}
+% \textbf{Command} & \textbf{Description} & \textbf{Result} & \textbf{Example} \\\hline
+% |\sample| & Sampling from a distribution, or running a randomized procedure & $\sample$ & $b \sample \bin$ \\
+% |\floor{42.5}| & Rounding down & $\floor{42.5}$ & \\
+% |\ceil{41.5}| & Rounding up & $\ceil{41.5}$ & \\
+% |\Angle{x,y}| & Vector product & $\Angle{x,y}$ & \\
+% |\abs{\frac{a}{b}}| & Absolute number & $\abs{\frac{a}{b}}$ & \\
+% |\norm{x}| & Norm & $\norm{x}$ & \\
+% |\concat| & Verbose concatenation (I usually prefer simply \verb$\|$) & $\concat$ & $x \gets a\concat b$ \\
+% |\emptystring| & The empty string & $\emptystring$ & $x \gets \emptystring$ \\
+% |\argmax| & arg max & $\argmax$ & $\argmax_{x \in S} f(x)$ \\
+% |\argmin| & arg min & $\argmin$ & $\argmin_{x \in S} f(x)$ \\
+% |\pindist| & Perfect indistinguishability & $\pindist$ & $X \pindist Y$ \\
+% |\sindist| & Statistical indistinguishability & $\sindist$ & $X \sindist Y$ \\
+% |\cindist| & Computational indistinguishability & $\cindist$ & $X \cindist Y$
+% \end{tabular}
+% \end{center}
+%
+% The paired operators |\floor|, |\ceil|, |\Angle|, |\norm|, and |\abs| also
+% come in a form for flow text which does not scale the outer delimter. These
+% are |\tfloor|, |\tceil|, |\tAngle|, |\tnorm|, and |\tabs|.
+%
+% Note that $\argmax$ and $\argmin$ in block formulas will set their subscripts as limits, i.e.,:
+%
+% \[ \argmax_{x \in S} f(x) \]
+%
+% \subsection{Adversaries}
+% \index{adversary|see {package options}}
+% \index{package options!adversary}
+% The \enquote{adversary} option provides the following list of commands:
+%
+% \begin{center}
+% \begin{tabular}{l l l}
+% \textbf{Command} & \textbf{Description} & \textbf{Result} \\\hline
+% |\adv| & Adversary & $\adv$ \\
+% |\bdv| & Adversary & $\bdv$ \\
+% |\cdv| & Adversary & $\cdv$ \\
+% |\ddv| & Adversary & $\ddv$ \\
+% |\edv| & Adversary & $\edv$ \\
+% |\mdv| & Adversary & $\mdv$ \\
+% |\pdv| & Adversary & $\pdv$ \\
+% |\rdv| & Adversary & $\rdv$ \\
+% |\sdv| & Adversary & $\sdv$
+% \end{tabular}
+% \end{center}
+%
+% \noindent The style in which an adversary is rendered is controlled via
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\pcadvstyle}[1]{\ensuremath{\mathcal{#1}}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+%
+% \subsection{Landau}
+% \index{Landau|see {package options}}
+% \index{package options!Landau}
+% The \enquote{landau} option provides the following list of commands:
+%
+% \begin{center}
+% \begin{tabular}{l l l}
+% \textbf{Command} & \textbf{Description} & \textbf{Result} \\\hline
+% |\bigO{n^2}| & Big O(micron) notation & $\bigO{n^2}$ \\
+% |\smallO{n^2}| & small o(micron) notation & $\smallO{n^2}$ \\
+% |\bigOmega{n^2}| & Big Omega notation & $\bigOmega{n^2}$ \\
+% |\bigTheta{n^2}| & Big Theta & $\bigTheta{n^2}$ \\
+% |\orderOf| & On the order of & $f(n) \orderOf g(n)$
+% \end{tabular}
+% \end{center}
+%
+%
+% \subsection{Probabilities}
+% \index{probability|see {package options}}
+% \index{package options!probabilities}
+% The \enquote{probability} option provides commands for writing probabilities. Use
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \prob{X=x}
+ \probsub{x\sample{\bin^n}}{x=5}
+ \condprob{X=x}{A=b}
+ \condprobsub{x\sample{\bin^n}}{x=5}{A=b}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% to write basic probabilities, probabilities with explicit probability spaces and conditional probabilities.
+% \begin{align*}
+% & \prob{X=x} \\
+% & \probsub{x\sample{\bin^n}}{X=x} \\
+% & \condprob{X=x}{A=b} \\
+% & \condprobsub{x\sample{\bin^n}}{x=5}{A=b}
+% \end{align*}
+% You can control the probability symbol (Pr) by redefining
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\probname}{Pr}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% The probability commands have a flowtext version |\tprob{X=X}| or |\tcondprob{X=x}{Y=y}|
+% which does not scale the delimiters.
+% In case the probability space is more complex, you can use
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+ \probsublong{x,y\sample\set{1,2,3,4,5,6}, z = x + y}{z = 7}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% which yields
+% \[ \probsublong{x,y\sample\set{1,2,3,4,5,6}, z = x + y}{z = 7}.\]
+%
+%
+% For specifying expectations the following commands are defined
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \expect{X}
+ \expsub{x,y\sample\set{1,\ldots,6}}{x+y}
+ \condexp{X+Y}{Y>3}
+ \condexpsub{x,y\sample\set{1,\ldots,6}}{x+y}{y>3}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% yielding
+% \begin{align*}
+% & \expect{X} \\
+% & \expsub{x,y\sample\set{1,\ldots,6}}{x+y} \\
+% & \condexp{X+Y}{Y>3} \\
+% & \condexpsub{x,y\sample\set{1,\ldots,6}}{x+y}{y>3}
+% \end{align*}
+% Again flowtext versions such as |\texpect{X}| are available.
+% To control the expactation symbol ($\mathbb{E}$), redefine
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\expectationname}{\ensuremath{\mathbb{E}}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% The support $\supp{X}$ of a random variable $X$ can be written as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \supp{X}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% where again the name can be controlled via
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\supportname}{Supp}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% For denoting entropy and min-entropy use
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \entropy{X}
+ \minentropy{X}
+ \condentropy{X}{Y=5}
+ \condminentropy{X}{Y=5}
+ \condavgminentropy(X}{Y=5}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% This yields
+% \begin{align*}
+% & \entropy{X} \\
+% & \minentropy{X} \\
+% & \condentropy{X}{Y=5} \\
+% & \condminentropy{X}{Y=5} \\
+% & \condavgminentropy{X}{Y=5}
+% \end{align*}
+%
+% \subsection{Sets}
+% \index{sets|see {package options}}
+% \index{package options!sets}
+% The \enquote{sets} option provides commands for basic mathematical sets.
+% You can write sets and sequences as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \set{1, \ldots, 10}
+ \sequence{1, \ldots, 10}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% which are typeset as
+% \begin{align*}
+% & \set{1, \ldots, 10} \\
+% & \sequence{1, \ldots, 10}
+% \end{align*}
+% In addition, the following commands are provided
+% \begin{center}
+% \begin{tabular}{l l l}
+% \textbf{Command} & \textbf{Description} & \textbf{Result} \\\hline
+% |\bin| & The set containing 0 and 1 & $\bin$ \\
+% |\NN| & Natural numbers & $\NN$ \\
+% |\ZZ| & Integers & $\ZZ$ \\
+% |\QQ| & Rational numbers & $\QQ$ \\
+% |\CC| & Complex numbers & $\CC$ \\
+% |\RR| & Reals & $\RR$ \\
+% |\PP| & & $\PP$ \\
+% |\FF| & & $\FF$ \\
+% |\GG| & & $\GG$ \\
+% \end{tabular}
+% \end{center}
+%
+% The style in which sets are being set can be adapted by redefining
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\pcsetstyle}[1]{\ensuremath{\mathbb{#1}}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Cryptographic Notions}
+% \index{notions|see {package options}}
+% \index{package options!notions}
+% \index{Crypto notions|see {package options}}
+% The \enquote{notions} option defines the following list of commands:
+%
+% \begin{center}
+% \begin{tabular}{l p{8cm} l}
+% \textbf{Command} & \textbf{Description} & \textbf{Result} \\\hline
+% |\indcpa| & IND-CPA security for encryption schemes & $\indcpa$ \\
+% |\indcca| & IND-CCA security for encryption schemes & $\indcca$ \\
+% |\indccai| & IND-CCA1 security for encryption schemes & $\indccai$ \\
+% |\indccaii| & IND-CCA2 security for encryption schemes & $\indccaii$ \\
+% |\ind| & IND security & $\ind$ \\
+% |\priv| & PRIV security for deterministic public-key encryption schemes & $\priv$ \\
+% |\prvcda| & PRV-CDA security (for deterministic public-key encryption schemes)& $\prvcda$ \\
+% |\prvrcda| & PRV\$-CDA security (for deterministic public-key encryption schemes) & $\prvrcda$ \\
+% |\kiae| & Key independent authenticated encryption & $\kiae$ \\
+% |\kdae| & Key dependent authenticated encryption & $\kdae$ \\
+% |\mle| & Message locked encryption & $\mle$ \\
+% |\uce| & Universal computational extractors & $\uce$ \\
+% |\eufcma| & Existential unforgeability under chosen message attack & $\eufcma$ \\
+% |\eufnacma| & Non-adaptive existential unforgeability under chosen message attack & $\eufnacma$ \\
+% |\seufcma| & Strong existential unforgeability under chosen message attack & $\seufcma$ \\
+% |\eufko| & Existential unforgeability under key only attack & $\eufko$
+% \end{tabular}
+% \end{center}
+%
+% The style in which notions are displayed can be controlled via redefining
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\pcnotionstyle}[1]{\ensuremath{\mathrm{#1}}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Logic}
+% \index{logic|see {package options}}
+% \index{package options!logic}
+% The \enquote{logic} option provides the following list of commands:
+%
+% \begin{center}
+% \begin{tabular}{l l l}
+% \textbf{Command} & \textbf{Description} & \textbf{Result} \\\hline
+% |\AND| & Logical AND & $\AND$ \\
+% |\NAND| & Logical NAND & $\NAND$ \\
+% |\OR| & Logical OR & $\OR$ \\
+% |\NOR| & Logical NOR & $\NOR$ \\
+% |\XOR| & Logical XOR & $\XOR$ \\
+% |\XNOR| & Logical XNOR & $\XNOR$ \\
+% |\notimplies| & Negated implication & $\notimplies$ \\
+% |\NOT| & not & $\NOT$ \\
+% |\xor| & exclusive or & $\xor$ \\
+% |\false| & false & $\false$ \\
+% |\true| & true & $\true$
+% \end{tabular}
+% \end{center}
+%
+%
+% \subsection{Function Families}
+% \index{ff|see {package options}}
+% \index{package options!ff}
+% \index{function families|see {package options}}
+% The \enquote{ff} option provides the following list of commands:
+%
+% \begin{center}
+% \begin{tabular}{l l l}
+% \textbf{Command} & \textbf{Description} & \textbf{Result} \\\hline
+% |\kgen| & Key generation & $\kgen$ \\
+% |\pgen| & Parameter generation & $\pgen$ \\
+% |\eval| & Evaluation & $\eval$ \\
+% |\invert| & Inversion & $\invert$ \\
+% |\il| & Input length & $\il$ \\
+% |\ol| & Output length & $\ol$ \\
+% |\kl| & Key length & $\kl$ \\
+% |\nl| & Nonce length & $\nl$ \\
+% |\rl| & Randomness length & $\rl$
+% \end{tabular}
+% \end{center}
+%
+% The style in which these are displayed can be controlled via redefining
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\pcalgostyle}[1]{\ensuremath{\mathsf{#1}}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+%
+% \subsection{Machine Model}
+% \index{machine model|see {package options}}
+% \index{package options!mm}
+% \index{mm|see {package options}}
+% The \enquote{mm} option provides the following list of commands:
+%
+% \begin{center}
+% \begin{tabular}{l l l}
+% \textbf{Command} & \textbf{Description} & \textbf{Result} \\\hline
+% |\CRKT| & A circuit & $\CRKT$ \\
+% |\TM| & A Turing machine & $\TM$ \\
+% |\PROG| & A program & $\PROG$ \\
+% |\uTM| & A universal Turing machine & $\uTM$ \\
+% |\uC| & A universal Circuit & $\uC$ \\
+% |\uP| & A universal Program & $\uP$ \\
+% |\tmtime| & Time (of a TM) & $\tmtime$ \\
+% |\ppt| & Probabilistic polynomial time & $\ppt$
+% \end{tabular}
+% \end{center}
+%
+% The style in which these are displayed can be controlled via redefining
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\pcmachinemodelstyle}[1]{\ensuremath{\mathsf{#1}}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \amipagebreak
+% \subsection{Crypto Primitives}
+% \index{primitives|see {package options}}
+% \index{package options!primitives}
+% \index{Crypto primitives|see {package options}}
+% The \enquote{primitives} option provides the following list of commands:
+%
+%
+% \begin{center}
+% \begin{tabular}{l l l}
+% \textbf{Command} & \textbf{Description} & \textbf{Result} \\\hline
+% |\prover| & Proover & $\prover$ \\
+% |\verifier| & Verifier & $\verifier$ \\
+% |\nizk| & Non interactie zero knowledge & $\nizk$ \\
+% |\hash| & A hash function & $\hash$ \\
+% |\gash| & A hash function& $\gash$ \\
+% |\fash| & A hash function & $\fash$ \\
+% |\pad| & A padding function & $\pad$ \\
+% |\enc| & Encryption & $\enc$ \\
+% |\dec| & Decryption & $\dec$ \\
+% |\sig| & Signing & $\sig$ \\
+% |\sign| & Signing & $\sign$ \\
+% |\verify| & Verifying & $\verify$ \\
+% |\owf| & One-way function & $\owf$ \\
+% |\prf| & Pseudorandom function & $\prf$ \\
+% |\prp| & Pseudorandom permutation & $\prp$ \\
+% |\prg| & Pseudorandom generator & $\prg$ \\
+% |\obf| & Obfuscation & $\obf$ \\
+% |\iO| & Indistinguishability obfuscation & $\iO$ \\
+% |\diO| & Differing inputs obfuscation & $\diO$ \\
+% |\mac| & Message authentication & $\mac$ \\
+% |\puncture| & Puncturing & $\puncture$ \\
+% |\source| & A source & $\source$ \\
+% |\predictor| & A predictor & $\predictor$ \\
+% |\sam| & A sampler & $\sam$ \\
+% |\distinguisher| & A distinguisher & $\distinguisher$ \\
+% |\dist| & A distinguisher& $\dist$ \\
+% |\simulator| & A simulator & $\simulator$ \\
+% |\extractor| & An extractor & $\extractor$ \\
+% |\ext| & Shorthand for |\extractor| & $\ext$
+% \end{tabular}
+% \end{center}
+%
+% The style in which these are displayed can be controlled via redefining
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\pcalgostyle}[1]{\ensuremath{\mathsf{#1}}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Oracles}
+% \index{oracles|see {package options}}
+% \index{package options!oracles}
+% The \enquote{oracles} option provides the following list of commands:
+%
+%
+% \begin{center}
+% \begin{tabular}{l l l}
+% \textbf{Command} & \textbf{Description} & \textbf{Result} \\\hline
+% |\oracle| & Generic oracle & $\oracle$ \\
+% |\oracle[LoR]| & Custom oracle & $\oracle[LoR]$ \\
+% |\ro| & Random oracle & $\ro$ \\
+% |\Oracle{\sign}| & Oracle version of procedure & $\Oracle{\sign}$
+% \end{tabular}
+% \end{center}
+%
+% The style in which these are displayed can be controlled via redefining
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\pcoraclestyle}[1]{\ensuremath{\mathsf{#1}}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Events}
+% \index{events|see {package options}}
+% \index{package options!events}
+% The \enquote{events} option provides the following list of commands.
+%
+% \begin{center}
+% \begin{tabular}{l l l}
+% \textbf{Command} & \textbf{Description} & \textbf{Result} \\\hline
+% |\event{E}| & Event \event{E} & $\event{E}$ \\
+% |\nevent{E}| & Negated event \event{E} & $\nevent{E}$ \\
+% |\bad| & Bad event & $\bad$ \\
+% |\nbad| & Bad event & $\nbad$
+% \end{tabular}
+% \end{center}
+%
+% \subsection{Complexity}
+% \index{complexity|see {package options}}
+% \index{package options!complexity}
+% The \enquote{complexity} option provides the following list of commands:
+%
+% \begin{center}
+% \begin{tabular}{l l l}
+% \textbf{Command} & \textbf{Result} \\\hline
+% |\complclass{myClass}| & $\complclass{myClass}$ \\
+% |\cocomplclass{myClass}| & $\cocomplclass{myClass}$ \\
+% |\npol| & $\npol$ \\
+% |\conpol| & $\conpol$ \\
+% |\pol| & $\pol$ \\
+% |\bpp| & $\bpp$ \\
+% |\ppoly| & $\ppoly$ \\
+% |\NC{1}| & $\NC1$ \\
+% |\AC{1}| & $\AC1$ \\
+% |\TC{1}| & $\TC1$ \\
+% |\AM| & $\AM$ \\
+% |\coAM| & $\coAM$ \\
+% |\PH| & $\PH$ \\
+% |\csigma{1}| & $\csigma{1}$ \\
+% |\cpi{1}| & $\cpi{1}$ \\
+% |\cosigma{1}| & $\cosigma{1}$ \\
+% |\copi{1}| & $\copi{1}$
+% \end{tabular}
+% \end{center}
+%
+% The style in which these are displayed can be controlled via redefining
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\pccomplexitystyle}[1]{\ensuremath{\mathsf{#1}}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \amipagebreak
+% \subsection{Asymptotics}
+% \index{asymptotics|see {package options}}
+% \index{package options!asymptotics}
+% The \enquote{asymptotics} option provides the following list of commands:
+%
+% \begin{center}
+% \begin{tabular}{l l p{7.5cm}}
+% \textbf{Command} & \textbf{Description} & \textbf{Result} \\\hline
+% |\negl| & A negligible function & $\negl$ (\secpar\ is |\secpar|) \\
+% |\negl[x]| & A negligible function & $\negl[x]$ \\
+% |\negl[]| & A negligible function & $\negl[]$ \\
+% |\poly| & A polynomial & $\poly$ (\secpar\ is |\secpar|) \\
+% |\poly[x]| & A polynomial & $\poly[x]$ \\
+% |\poly[]| & A polynomial & $\poly[]$ \\
+% |\pp| & some polynomial $\pp$ & $\pp$ \\
+% |\pp[t]| & some custom polynomial $\pp[t]$ & $\pp[t]$ \\
+% |\cc| & some polynomial $\cc$ & $\cc$ \\
+% |\ee| & some polynomial $\ee$ & $\ee$ \\
+% |\kk| & some polynomial $\kk$ & $\kk$ \\
+% |\mm| & some polynomial $\mm$ & $\mm$ \\
+% |\nn| & some polynomial $\nn$ & $\nn$ \\
+% |\qq| & some polynomial $\qq$ & $\qq$ \\
+% |\rr| & some polynomial $\rr$ & $\rr$
+% \end{tabular}
+% \end{center}
+%
+% The style in which these are displayed can be controlled via redefining
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\pcpolynomialstyle}[1]{\ensuremath{\mathrm{#1}}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Keys}
+% \index{keys|see {package options}}
+% \index{package options!keys}
+% The \enquote{keys} option provides the following list of commands:
+%
+%
+% \begin{center}
+% \begin{tabular}{l l l}
+% \textbf{Command} & \textbf{Description} & \textbf{Result} \\\hline
+% |pk| &public key & $\pk$ \\
+% |vk| & verification key& $\vk$ \\
+% |sk| & secret key& $\sk$ \\
+% |key| & a plain key& $\key$ \\
+% |key[xk]| & custom key & $\key[xk]$ \\
+% |hk| & hash key& $\hk$ \\
+% |gk| &gash key & $\gk$ \\
+% |fk| & function key & $\fk$ \\
+% |st| & state & $\st$ \\
+% |state| & state & $\state$ \\
+% |state{myState}| & custom state & $\state{myState}$
+% \end{tabular}
+% \end{center}
+%
+% The style in which these are displayed can be controlled via redefining
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\pckeystyle}[1]{\ensuremath{\mathsf{#1}}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+%
+% \amipagebreak
+% \section{Pseudocode}
+% \label{chap:pseudocode}
+%
+% \subsection{Basics}
+% \index{\textbackslash pseudocode}
+%
+% The cryptocode package provides the command |\pseudocode| for typesetting algorithms.
+% Consider the following definition of an IND-CPA game
+%
+% \begin{pchstack}[center]
+% \pseudocode{%
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen (\secparam) \\
+% (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c) \\
+% \pcreturn b = b' }
+% \end{pchstack}
+% which is generated by
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\begin{pchstack}[center]
+\pseudocode{
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen (\secparam) \\
+ (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c) \\
+ \pcreturn b = b' }
+\end{pchstack}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% First note that |\pseudocode| on its own does not space itself. For laying out
+% one (or multiple) code blocks cryptocode
+% defines stacking environemnts such as |\pchstack| and |\pcvstack| that we discuss
+% in Section~\ref{chap:stacking}. Wrapping a single pseudocode in a |\pchstack|
+% as in the above example generates a nicely offset code block.
+%
+% \medskip
+% As code blocks are most often not used in flow text, cryptocode offers the shorthand
+% |\pseudocodeblock| which centers and offsets a pseudocode block as above. We thus
+% get the very same by writing
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\pseudocodeblock{
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen (\secparam) \\
+ (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c) \\
+ \pcreturn b = b' }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% We can also define custom block commands, for example, the following defines
+% a command |\pcb| that offsets and centers code and draws a tight fitting box around the code block:
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\createpseudocodeblock{pcb}{center,boxed}{}{}{}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% (We discuss creating custom pseudocode commands in detail in Section~\ref{sec:custom:pc:command}).
+% If we now use |\pcb| as just defined in the above example, we obtain the following
+% nicely spaced and boxed result.
+% \pcb{
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen (\secparam) \\
+% (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c) \\
+% \pcreturn b = b' }
+% which is generated as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pcb{
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen (\secparam) \\
+ (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c) \\
+ \pcreturn b = b' }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \textbf{Remark. } In the following we will use this boxed representation for the examples, but
+% use |\pseudocodeblock| in the corresponding code listings.
+%
+% \medskip
+% As you can see, the pseudocode command provides a math based environment where you can simply start typing your pseudocode
+% separating lines by |\\|.
+%
+%
+%
+% \subsubsection{Customizing Pseudocode}
+% \index{lnstart}
+% \index{head}
+% \index{lnstartright}
+% \index{linenumbering}
+% \index{syntaxhighlight}
+% \index{keywords}
+% \index{keywordsindent}
+% \index{codesize}
+% \index{keywordsunindent}
+% \index{keywordsuninindent}
+% \index{addkeywords}
+% \index{altkeywords}
+% \index{mode}
+% \index{space}
+% \index{xshift}
+% \index{colsep}
+% \index{addtolength}
+% \index{nodraft}
+% \index{yshift}
+% \index{bodylinesep}
+% \index{headlinesep}
+% \index{jot}
+% \index{beginline}
+% \index{endline}
+% \index{minlineheight}
+% \index{\textbackslash{}pcminlineheight}
+%
+% Besides the mandatory argument the |\pseudocode| command can take an optional argument which consists of a list of key=value pairs
+% separated by commas.
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocode[options]{body}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% The following parameters are available:
+% \begin{description}
+% \item[head]
+% A header for the code
+% \item[width]
+% An exact width. If no width is specified, cryptocode tries to automatically compute the correct width.
+% \item[lnstart]
+% The starting line number when using line numbering.
+% \item[lnstartright]
+% The starting line number for right aligned line numberswhen using line numbering.
+% \item[linenumbering]
+% Enables line numbering.
+%
+% \item[skipfirstln]
+% Starts line numbering on the second line.
+%
+% \item[minlineheight]
+% Specify a minimum height for each line. Can be globally set by redefining |\pcminlineheight|.
+%
+% \item[syntaxhighlight]
+% When set to \enquote{auto} cryptocode will attempt to automatically hightlight keywords such as \enquote{for}, \enquote{foreach}
+% and \enquote{return}. Note that this feature should be regarded as experimental. In particular, it is rather slow.
+% \item[keywords]
+% Provide a comma separated list of keywords for automatic syntax highlighting. To customize the behavior of automatic spacing
+% you can provide keywords as
+% \begin{description}
+% \item[keywordsindent]
+% After seeing this keyword all following lines will be indented one extra level.
+% \item[keywordsunindent]
+% After seeing this keyword the current and all following lines will be unindented one extra level.
+% \item[keywordsuninindent]
+% After seeing this keyword the current line will be unindented one level.
+% \end{description}
+% \item[addkeywords]
+% Provide additional keywords for automatic syntax highlighting.
+% \item[altkeywords]
+% Provide a second list of keywords for automatic syntax highlighting that are highlighted differently.
+% \item[mode]
+% When set to text pseudocode will not start in math mode but in text mode.
+% \item[space]
+% Allows you to enable automatic spacing mode. If set to \enquote{keep} the spaces in the input are preserved.
+% If set to \enquote{auto} it will try to detect spacing according to keywords such as \enquote{if} and \enquote{fi}.
+% \item[codesize]
+% Allows to specify the fontsize for the pseudocode. Set to |\scriptsize| for a smaller size.
+%
+% \item[colspace]
+% Allows to insert spacing between columns. In particular this allows to also overlap columns by inserting negative space.
+%
+% \item[jot]
+% Allows to specify extra space between each line. Use |jot=1mm|.
+%
+% \item[beginline]
+% Allows to specify a macro that is placed at the beginning of each line.
+%
+% \item[endline]
+% Allows to specify a macro that is placed at the end of each line.
+%
+% \item[xshift]
+% Allows horizontal shifting
+% \item[yshift]
+% Allows horizontal shifting
+%
+% \item[headlinesep]
+% Specifies the distance between header and the line. By default set to 0pt which can be globally overwritten by setting length |\pcheadlinesep|.
+% \item[bodylinesep]
+% Specifies the distance between body and the line. By default set to |0.3\baselineskip| which can be globally overwritten by setting length |\pcbodylinesep|.
+% \item[colsep]
+% Defines the space between columns.
+%
+% \item[headheight]
+% Specifies the height of the header. By default set to 3.25ex which can be globally overwritten by setting length |\pcheadheight|.
+%
+% \item[headlinecmd]
+% Allows to overwrite which command is used to draw the bar below the headline. Defaults to |\hrule|.
+%
+% \item[addtolength]
+% Is added to the automatically computed width of the pseudocode (which does not take colsep into account).
+%
+% \item[valign]
+% Controls the vertical alignment of the pseudocode. Pseudocode is wrapped in a minipage environment and valign value is passed as orientation for the minipage. By default valign is set to \enquote{t}.
+%
+% \item[nodraft]
+% Forces syntax highlighting also in draft mode.
+% \end{description}
+% The following code
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocodeblock[linenumbering,syntaxhighlight=auto,head=Header]{ return null }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% creates
+% \begin{center}
+% \pcb[linenumbering,syntaxhighlight=auto,head=Header]{ return null }
+% \end{center}
+%
+% \subsubsection{Customized Pseudocode Commands}\label{sec:custom:pc:command}
+% \index{\textbackslash procedure}
+% \index{\textbackslash createpseudocodecommand}
+% \index{\textbackslash createprocedurecommand}
+%
+% Besides the |\pseudocode| and |\pseudocodeblock| command the command |\procedure|
+% (and its block variant |\procedureblock| provides easy access to generate code with a header.
+% They take the following form
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedure[options]{Header}{Body}
+ \procedureblock[options]{Header}{Body}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection*{Examples}
+% \procb{$\indcpa_\enc^\adv(\secpar)$}{
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen(\secparam) \\
+% (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c) \\
+% \pcreturn b = b' }
+% which is generated as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedureblock{$\indcpa_\enc^\adv(\secpar)$}{
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen(\secparam) \\
+ (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c) \\
+ \pcreturn b = b' }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+%
+% \medskip
+% You can define customized pseudocode commands which either take one optional argument and two mandatory arguments (as the procedure command)
+% or one optional and one mandatory argument (as the pseudocode command). The following
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\createpseudocodecommand{mypseudocode}{}{}{linenumbering}
+\createprocedurecommand{myprocedure}{}{}{linenumbering}
+\createpseudocodeblock{pcb}{center,boxed}{}{}{linenumbering}
+\createprocedureblock{procb}{center,boxed}{}{}{linenumbering}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% creates the commands |\mypseudocode| and |\myprocedure| with line numbering always enabled as well
+% as the block commands |\pcb| and |\procb| also with line numbering enabled. The created commands
+% have an identical interface as the |\pseudocode| (resp.~|\procedure|) command.
+% The two arguments that we kept empty when generating the commands allows us to specify commands that are executed at the
+% very beginning when the command is called (first empty argument) and a prefix for the header.
+% For example, the command created as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\createprocedureblock{expproc}{center,boxed}{}{$\mathrm{Experiment}$\xspace}{linenumbering}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% could be used as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \expproc{$\indcpa_\enc^\adv(\secpar)$}{
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen(\secparam) \\
+ (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c) \\
+ \pcreturn b = b' }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% This results in
+% \createprocedureblock{expproc}{center,boxed}{}{$\mathrm{Experiment}$\xspace}{linenumbering}
+% \expproc{$\indcpa_\enc^\adv(\secpar)$}{%
+% b \sample \bin \\
+%(\pk,\sk) \sample \kgen(\secparam) \\
+%(m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+%c \sample \enc(\pk,m_b) \\
+%b' \sample \adv(\secparam, \pk, c) \\
+% \pcreturn b = b' }
+%
+%
+% \subsection{Indentation}
+% \index{indentation}
+% \index{\textbackslash pcind}
+% \index{\textbackslash t}
+%
+% In order to indent code use |\pcind| or short |\t|. You can also use customized spacing such as |\quad| or |\hspace|
+% when using the pseudocode command in math mode.
+% \pcb{
+% \pcfor i = 1..10 \pcdo \\
+% \pcind T[i] \sample \bin^n \\
+% \pcfor i = 1..10 \pcdo \\
+% \t T[i] \sample \bin^n }
+% which is generated as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocodeblock{
+ \pcfor i = 1..10 \pcdo \\
+ \pcind T[i] \sample \bin^n \\
+ \pcfor i = 1..10 \pcdo \\
+ \t T[i] \sample \bin^n }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% You can specify multiple levels via the optional first argument
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \t[level] % \pcind[level]
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% \pcb{
+% \pcfor i = 1..10 \pcdo \\
+% \t T[i] \sample \bin^n \\
+% \t\t T[i] \sample \bin^n \\
+% \t[3] T[i] \sample \bin^n \\
+% \t[4] T[i] \sample \bin^n \\
+% \t[5] T[i] \sample \bin^n }
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocodeblock{
+ \pcfor i = 1..10 \pcdo \\
+ \t T[i] \sample \bin^n \\
+ \t\t T[i] \sample \bin^n \\
+ \t[3] T[i] \sample \bin^n \\
+ \t[4] T[i] \sample \bin^n \\
+ \t[5] T[i] \sample \bin^n }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \index{\textbackslash pcindentname}
+% You can customize the indentation shortcut by redefining
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \renewcommand{\pcindentname}{t}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection*{Automatic Indentation}
+% The pseudocode command comes with an option \enquote{space=auto} which tries to detect the correct indentation from the use of
+% keywords. When it sees one of the following keywords
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pcif, \pcfor, \pcwhile, \pcrepeat, \pcforeach
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% it will increase the indentation starting from the next line. It will again remove the indentation on seeing
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pcfi, \pcendif, \pcendfor, \pcendwhile, \pcuntil, \pcendforeach
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Additionally, on seeing
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pcelse, \pcelseif
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% it will remove the indentation for that particular line. Thus the following
+% \pcb[space=auto]{%
+% \pcfor a \in [10] \pcdo \\
+% \pcfor a \in [10] \pcdo \\
+% \pcfor a \in [10] \pcdo \\
+% \pcif a = b \pcthen \\
+% \text{some operation} \\
+% \pcelseif a = c \pcthen \\
+% \text{some operation} \\
+% \pcelse \\
+% \text{some default operation} \\
+% \pcfi \\
+% \pcendfor \\
+% \pcendfor \\
+% \pcendfor \\
+% \pcreturn a}
+% can be obtained by:
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocodeblock[space=auto]{%
+ \pcfor a \in [10] \pcdo \\
+ \pcfor a \in [10] \pcdo \\
+ \pcfor a \in [10] \pcdo \\
+ \pcif a = b \pcthen \\
+ \text{some operation} \\
+ \pcelseif a = c \pcthen \\
+ \text{some operation} \\
+ \pcelse \\
+ \text{some default operation} \\
+ \pcfi \\
+ \pcendfor \\
+ \pcendfor \\
+ \pcendfor \\
+ \pcreturn a}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Note that the manual indentation in the above example is not necessary for the outcome. Further note that the same
+% works when using automatic syntax highlighting (see Section~\ref{sec:syntaxhighlight}).
+%
+% \subsubsection*{Keep Input Indentation (experimental)}
+% \label{sec:keepindent}
+% The pseudocode package comes with an \emph{experimental} feature that preserves the spacing in the input. This can be enabled with
+% the option \enquote{space=keep}.
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{center}
+ \pseudocode[space=keep]{%
+ \pcfor i = 1..10 \pcdo \\
+ T[i] \sample \bin^n \\
+ T[i] \sample \bin^n \\
+ T[i] \sample \bin^n \\
+ T[i] \sample \bin^n \\
+ T[i] \sample \bin^n }
+ \end{center}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% This yields the following result
+% \begin{center}
+% \pseudocode[space=keep]{%
+% \pcfor i = 1..10 \pcdo \\
+% T[i] \sample \bin^n \\
+% T[i] \sample \bin^n \\
+% T[i] \sample \bin^n \\
+% T[i] \sample \bin^n \\
+% T[i] \sample \bin^n }
+% \end{center}
+%
+% Note that automatic spacing only works when the |\pseudocode| command is not wrapped within another command.
+% Thus in order to get a frame box |\fbox{\pseudocode[space=keep]{code}}| will not work but you would need to use
+% an environment such as one offered by the \emph{mdframed} package ((\url{https://www.ctan.org/pkg/mdframed}). Also see
+% Section~\ref{sec:keepindent-problem}.
+%
+% \subsection{Textmode}
+% \index{text mode}
+%
+% By default pseudocode enables \LaTeX' math mode. You can change this behavior and tell the pseudocode command to interpret the content
+% in text mode by setting the option \enquote{mode=text}.
+% \begin{center}
+% \fbox{\pseudocode[mode=text]{%
+% This is \\
+% \t simply text}}
+% \end{center}
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocodeblock[mode=text]{%
+ This is \\
+ \t simply text}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Syntax Highlighting}
+% \label{sec:syntaxhighlight}
+%
+% \index{\textbackslash pcabort}
+% \index{\textbackslash pcfail}
+% \index{\textbackslash pccontinue}
+% \index{\textbackslash pccomment}
+% \index{\textbackslash pcdo}
+% \index{\textbackslash pcdone}
+% \index{\textbackslash pcelse}
+% \index{\textbackslash pcelseif}
+% \index{\textbackslash pcfi}
+% \index{\textbackslash pcendif}
+% \index{\textbackslash pcforeach}
+% \index{\textbackslash pcendforeach}
+% \index{\textbackslash pcglobvar}
+% \index{\textbackslash pcif}
+% \index{\textbackslash pcin}
+% \index{\textbackslash pcnew}
+% \index{\textbackslash pcnull}
+% \index{\textbackslash pcparse}
+% \index{\textbackslash pcrepeat}
+% \index{\textbackslash pcuntil}
+% \index{\textbackslash pcreturn}
+% \index{\textbackslash pcthen}
+% \index{\textbackslash pctrue}
+% \index{\textbackslash pcwhile}
+% \index{\textbackslash pcendwhile}
+%
+%
+% In the above examples we have used commands |\pcreturn| and |\pcfor| to highlight certain keywords.
+% Besides the \emph{pcreturn}, \emph{pcfor} and \emph{pcdo} (where the pc stands for pseudocode) that were used in the above
+% examples the package defines the following set of constants:
+%
+% \begin{center}
+% \begin{tabular}{lll}
+% \textbf{command} & \textbf{outcome} \\
+% |\pcabort| & \pcabort\\
+% |\pccontinue| & \pccontinue \\
+% |\pccomment{comment}| & \pccomment{comment} \\
+% |\pccomment[2em]{comment}| & \pccomment[2em]{comment} \\
+% |\pclinecomment{comment}| & \pclinecomment{comment} \\
+% |\pcdo| & \pcdo \\
+% |\pcdone| & \pcdone \\
+% |\pcfail| & \pcfail \\
+% |\pcfalse| & \pcfalse \\
+% |\pcif| & \pcif \\
+% |\pcfi| & \pcfi \\
+% |\pcendif| & \pcendif \\
+% |\pcelse| & \pcelse \\
+% |\pcelseif| & \pcelseif \\
+% |\pcfor| & \pcfor \\
+% |\pcendfor| & \pcendfor \\
+% |\pcforeach| & \pcforeach \\
+% |\pcendforeach| & \pcendforeach \\
+% |\pcglobvar| & \pcglobvar \\
+% |\pcin| & \pcin \\
+% |\pcnew| & \pcnew \\
+% |\pcnull| & \pcnull \\
+% |\pcparse| & \pcparse \\
+% |\pcrepeat{10}| & \pcrepeat{10} \\
+% |\pcreturn| & \pcreturn \\
+% |\pcuntil| & \pcuntil \\
+% |\pcthen| & \pcthen \\
+% |\pctrue| & \pctrue \\
+% |\pcwhile| & \pcwhile \\
+% |\pcendwhile| & \pcendwhile \\
+% \end{tabular}
+% \end{center}
+% Note that |\pcdo|, |\pcin| and |\pcthen| have a leading space. This is due to their usual usage scenarios
+% such as
+% \pseudocodeblock{\pcfor i \pcin \{1,\ldots,10\}}
+% Furthermore all constants have a trailing space. This can be removed by adding the optional parameter [] such as
+% \pseudocodeblock{\pcfor i \pcin[] \{1,\ldots,10\}}
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocodeblock{\pcfor i \pcin[] \{1,\ldots,10\}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \index{highlight keywords}
+% \index{emphasize|see highlight keywords}
+% \index{\textbackslash highlightkeyword}
+% In order to change the font you can overwrite the command \lstinline{\highlightkeyword} which is defined as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \newcommand{\highlightkeyword}[2][\ ]{\ensuremath{\mathbf{#2}}#1}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection{Automatic Syntax Highlighting (Experimental)}
+% The pseudocode command comes with an experimental (and rather slow) feature to automatically highlight keywords.
+% This can be activated via
+% the option \enquote{syntaxhighlight=auto}. The preset list of keywords it looks for are
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+for,foreach,{return },return,{ do },{ in },new,if, null, true,{until },{ to }, false,{ then},repeat,else if,elseif,while,else,done
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Note that the keywords are matched with spaces and note the grouping for trailing spaces. That is, the \enquote{ do } keyword won't match within the string \enquote{don't}.
+% Via the option \enquote{keywords} you can provide a custom list of keywords.
+% Thus the following bubblesort variant (taken from \url{http://en.wikipedia.org/wiki/Bubble_sort})
+% \procb[syntaxhighlight=auto]{Bubblesort(A : list of items)}{
+% n \gets \mathsf{length}(A) \\
+% repeat \\
+% \t s \gets false \\
+% \t for i = 1 to n-1 do \\
+% \t\t \pclinecomment{if this pair is out of order} \\
+% \t\t if A[i-1] > A[i] then \\
+% \t\t\t \pclinecomment{swap them and remember something changed} \\
+% \t\t\t \mathsf{swap}( A[i-1], A[i] ) \\
+% \t\t\t s \gets true \\
+% until \neg s }
+% \noindent can be typeset as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedureblock[syntaxhighlight=auto]{Bubblesort(A : list of items)}{
+ n \gets \mathsf{length}(A) \\
+ repeat \\
+ \t s \gets false \\
+ \t for i = 1 to n-1 do \\
+ \t\t \pclinecomment{if this pair is out of order} \\
+ \t\t if A[i-1] > A[i] then \\
+ \t\t\t \pclinecomment{swap them and remember something changed} \\
+ \t\t\t \mathsf{swap}( A[i-1], A[i] ) \\
+ \t\t\t s \gets true \\
+ until \neg s }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \index{addkeywords}
+% You can also define additional keywords using the \enquote{addkeywords} option.
+% This would allow us to specify \enquote{length} and \enquote{swap} in the above example.
+% \procb[syntaxhighlight=auto,addkeywords={swap,length}]{Bubblesort(A : list of items)}{
+% n \gets \mathsf{length}(A) \\
+% repeat \\
+% \t s \gets false \\
+% \t for i = 1 to n-1 do \\
+% \t\t \pclinecomment{if this pair is out of order} \\
+% \t\t if A[i-1] > A[i] then \\
+% \t\t\t \pclinecomment{swap them and remember something changed} \\
+% \t\t\t \mathsf{swap}( A[i-1], A[i] ) \\
+% \t\t\t s \gets true \\
+% until \neg s }
+% can be typeset as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedureblock[syntaxhighlight=auto,addkeywords={swap,length}]{Bubblesort(A : list of items)}{
+ n \gets \mathsf{length}(A) \\
+ repeat \\
+ \t s \gets false \\
+ \t for i = 1 to n-1 do \\
+ \t\t \pclinecomment{if this pair is out of order} \\
+ \t\t if A[i-1] > A[i] then \\
+ \t\t\t \pclinecomment{swap them and remember something changed} \\
+ \t\t\t \mathsf{swap}( A[i-1], A[i] ) \\
+ \t\t\t s \gets true \\
+ until \neg s }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% We can also combine automatic syntax highlighting with automatic spacing in which case we need
+% to insert \enquote{group end} keywords:
+% \procb[space=auto,syntaxhighlight=auto,addkeywords={swap,length}]{Bubblesort(A : list of items)}{
+% n \gets length(A) \\
+% repeat \\
+% s \gets false \\
+% for i=1 to n-1 do \\
+% \pclinecomment{assuming this pair is out of order} \\
+% if A[i-1]>A[i] then \\
+% \pclinecomment{swap them and remember something changed} \\
+% swap(A[i-1], A[i]) \\
+% s \gets true \\
+% endif \\
+% endfor \\
+% until \neg s }
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedureblock[space=auto,syntaxhighlight=auto,addkeywords={swap,length}]{Bubblesort(A : list of items)}{
+ n \gets length(A) \\
+ repeat \\
+ s \gets false \\
+ for i=1 to n-1 do \\
+ \pclinecomment{assuming this pair is out of order} \\
+ if A[i-1]>A[i] then \\
+ \pclinecomment{swap them and remember something changed} \\
+ swap(A[i-1], A[i]) \\
+ s \gets true \\
+ endif \\
+ endfor \\
+ until \neg s }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection*{Alternative Keywords}
+% \index{altkeywords}
+% There is a second keyword list that you can add keywords to which are highlighted not via |\highlightkeyword| but via |\highlightaltkeyword|
+% where alt stands for alternate. This allows you to have two different keyword styles which are by default defined as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \newcommand{\highlightkeyword}[2][\ ]{\ensuremath{\mathbf{#2}}#1}
+ \newcommand{\highlightaltkeyword}[1]{\ensuremath{\mathsf{#1}}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% This allows you to rewrite the above example and emphasize the different nature of swap and length.
+% \procb[space=auto,syntaxhighlight=auto,altkeywords={swap,length}]{Bubblesort(A : list of items)}{
+% n \gets length(A) \\
+% repeat \\
+% s \gets false \\
+% for i=1 to n-1 do \\
+% \pclinecomment{assuming this pair is out of order} \\
+% if A[i-1]>A[i] then \\
+% \pclinecomment{swap them and remember something changed} \\
+% swap(A[i-1], A[i]) \\
+% s \gets true \\
+% endif \\
+% endfor \\
+% until \neg s }
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedureblock[space=auto,syntaxhighlight=auto,addkeywords={swap,length}]{Bubblesort(A : list of items)}{
+ n \gets length(A) \\
+ repeat \\
+ s \gets false \\
+ for i=1 to n-1 do \\
+ \pclinecomment{assuming this pair is out of order} \\
+ if A[i-1]>A[i] then \\
+ \pclinecomment{swap them and remember something changed} \\
+ swap(A[i-1], A[i]) \\
+ s \gets true \\
+ endif \\
+ endfor \\
+ until \neg s }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection*{Draft Mode}
+% \index{nodraft}
+% \index{performance}
+% \index{draft mode}
+% Automatic syntax highlighting is a somewhat expensive operation as it requires several rounds of regular expression matching.
+% In order to speed up compilation the pseudocode command will not attempt automatic highlighting when the document is in draft mode.
+% When in draft mode and you want to force a specific instance of |\pseudocode| to render the code with automatic syntax
+% highlighting you can use the option |nodraft|.
+%
+%
+% \subsection{Line Numbering}
+% \index{line numbering}
+% \index{\textbackslash pcln}
+% \index{\textbackslash pclnr}
+% \index{\textbackslash pcrln}
+% The pseudocode command allows to insert line numbers into pseudocode.
+% You can either manually control line numbering or simply turn on the option
+% |linenumbering|.
+% \procb[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen(\secparam) \\
+% \label{my:line:label} (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c) \\
+% \pcreturn b = b' }
+% is generated by
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedureblock[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen(\secparam) \\
+ \label{my:line:label} (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c) \\
+ \pcreturn b = b' }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Note that you can use labels. In the above example |\label{my:line:label}| points to~\ref{my:line:label}.
+%
+% \subsubsection{Skipping Line Numbers}
+% \index{skipfirstln}
+% \index{\textbackslash pcskipln}
+%
+% When using automatic line numbering, you can skip line numbers by inserting a |\pcskipln| command.
+% This causes the line number on the \emph{next line} to be supressed. In order to suppress the first
+% line number use the option |skipfirstln|. Thus the following
+% \pcb[linenumbering,skipfirstln,mode=text]{
+% \pclinecomment{Some comment on first line} \\
+% Some code \pcskipln\\
+% \pclinecomment{Some other comment } \\
+% Some code }
+% is generated by
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocodeblock[linenumbering,skipfirstln,mode=text]{
+ \pclinecomment{Some comment on first line} \\
+ Some code \pcskipln\\
+ \pclinecomment{Some other comment } \\
+ Some code }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+%
+% \subsubsection{Manually Inserting Line Numbers}
+% In order to manually insert line numbers use the command |\pcln|.
+% \procb{$\indcpa_\enc^\adv(\secparam)$}{%
+% \pcln b \sample \bin \\
+% \pcln (\pk,\sk) \sample \kgen(\secparam) \\
+% \pcln\label{my:line:label2} (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+% \pcln c \sample \enc(\pk,m_b) \\
+% \pcln b' \sample \adv(\secparam, \pk, c) \\
+% \pcln \pcreturn b = b' }
+% is generated by
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedure{$\indcpa_\enc^\adv(\secparam)$}{
+ \pcln b \sample \bin \\
+ \pcln (\pk,\sk) \sample \kgen(\secparam) \\
+ \pcln\label{my:line:label2} (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+ \pcln c \sample \enc(\pk,m_b) \\
+ \pcln b' \sample \adv(\secparam, \pk, c) \\
+ \pcln \pcreturn b = b' }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Note that labels also work when manually placing line numbers. In the above example
+% label \emph{my:line:label2} points to line number~\ref{my:line:label2}.
+%
+%
+%
+% \subsubsection{Start Values}
+% You can specify the start value (minus one) of the counter by setting the option |lnstart|.
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedure[lnstart=10,linenumbering]{Header}{Body}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% \procb[lnstart=10,linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen(\secparam) \\
+% (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c) \\
+% \pcreturn b = b' }
+%
+% \subsubsection{Separators}
+% \index{\textbackslash pclnseparator}
+% The command |\pclnseparator| defines the separator between code and line number. By
+% default the left separator is set to (:) colon. Also see Section~\ref{sec:protocol:separator}.
+%
+% \subsubsection{Style}
+% \index{\textbackslash pclnstyle}
+% The style in which line numbers are set can be controlled by redefining |\pclnstyle|.
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\renewcommand\pclnstyle[1]{\text{\scriptsize#1}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% For example, to set line numbers in normal font and dot separated use
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\renewcommand{\pclnstyle}[1]{\text{#1}}
+\renewcommand{\pclnseparator}{.}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% {
+% \renewcommand{\pclnstyle}[1]{\text{#1}}
+% \renewcommand{\pclnseparator}{.}
+% \procb[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen(\secparam) \\
+% (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c) \\
+% \pcreturn b = b' }}
+%
+%
+% \subsection{Subprocedures}
+% \index{subprocedure}
+% The pseudocode package allows the typesetting of subprocedures such as
+%
+% \procb[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen(\secparam) \\
+% (m_0,m_1) \sample \begin{subprocedure}%
+% \dbox{\procedure{$\adv(\secparam, \pk, c)$}{%
+% \text{Step 1} \\
+% \text{Step 2} \\
+% \pcreturn m_0, m_1 }}
+% \end{subprocedure} \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c) \\
+% \pcreturn b = b' }
+%
+% To create a subprocedure use the |subprocedure| environment. The above example is generated via
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedureblock[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen(\secparam) \\
+ (m_0,m_1) \sample \begin{subprocedure}%
+ \dbox{\procedure{$\adv(\secparam, \pk, c)$}{%
+ \text{Step 1} \\
+ \text{Step 2} \\
+ \pcreturn m_0, m_1 }}
+ \end{subprocedure} \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c) \\
+ \pcreturn b = b' }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Here the dbox command (from the dashbox package) is used to generate a dashed box around the sub procedure.
+%
+% \subsubsection{Numbering in Subprocedures}
+% As subprocedures are simply normal pseudocode blocks, you can use easily add line numbers.
+% By default the line numbering starts with 1 in a subprocedure while
+% ensuring that the outer numbering remains intact. Also note that the linenumbering on the outer procedure in the above example is inherited
+% by the subprocedure. For more control, either use manual numbering or set the
+% option \enquote{linenumbering=off} on the |\pseudocode| command within the subprocedure.
+%
+%
+%
+% \subsection{Stacking Procedures}\label{chap:stacking}
+% You can stack procedures horizontally or vertically using the environments \enquote{pchstack} and \enquote{pcvstack}.
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{pchstack}[options] body \end{pchstack}
+ \begin{pcvstack}[options] body \end{pcvstack}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% The following example displays two procedures next to one another. To space two horizontally outlined procedures
+% use the |space| option or manually insert spaces via |\pchspace| which takes an optional length as a parameter.
+%
+% \begin{pchstack}[boxed,center,space=1em]
+% \procedure[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen(\secparam) \\
+% (m_0,m_1) \sample \adv^O(\secparam, \pk) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c) \\
+% \pcreturn b = b' }
+%
+% \procedure[linenumbering,mode=text]{Oracle $O$}{
+% Some code \\
+% Some more code
+% }
+% \end{pchstack}
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\begin{pchstack}[boxed,center,space=1em]
+ \procedure[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen(\secparam) \\
+ (m_0,m_1) \sample \adv^O(\secparam, \pk) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c) \\
+ \pcreturn b = b' }
+
+ % alternatively use \pchspace for spacing
+
+ \procedure[linenumbering,mode=text]{Oracle $O$}{%
+ Some code \\
+ Some more code
+ }
+ \end{pchstack}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% Similarly you can stack two procedures vertically using the \enquote{pcvstack} environment. As a spacing
+% between two vertically stacked procedures again use either the |space| option or
+% insert space manually via |\pcvspace| which takes an optional length as a parameter.
+%
+% \begin{pcvstack}[boxed,center,space=0.5em]
+% \procedure[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen(\secparam) \\
+% (m_0,m_1) \sample \adv^O(\secparam, \pk) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c) \\
+% \pcreturn b = b' }
+%
+% \procedure[linenumbering,mode=text]{Oracle $O$}{
+% Some code \\
+% Some more code
+% }
+% \end{pcvstack}
+%
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{pcvstack}[boxed,center,space=0.5em]]
+ \procedure[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen(\secparam) \\
+ (m_0,m_1) \sample \adv^O(\secparam, \pk) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c) \\
+ \pcreturn b = b' }
+
+ % alternatively use \pcvspace for spacing
+
+ \procedure[linenumbering,mode=text]{Oracle $O$}{%
+ Some code \\
+ Some more code
+ }
+\end{pcvstack}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% Horizontal and vertical stacking can be combined
+% \begin{pcvstack}[boxed,center,space=1em]
+%
+% \begin{pchstack}[space=2em,center]
+% \procedure[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen(\secparam) \\
+% (m_0,m_1) \sample \adv^O(\secparam, \pk) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c) \\
+% \pcreturn b = b' }
+%
+% \procedure[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen(\secparam) \\
+% (m_0,m_1) \sample \adv^O(\secparam, \pk) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c) \\
+% \pcreturn b = b' }
+% \end{pchstack}
+%
+% \begin{pchstack}[space=0.25em]
+% \procedure[linenumbering,mode=text]{Oracle $O$}{
+% Some code \\
+% Some more code
+% }
+%
+% \procedure[linenumbering,mode=text]{Oracle $H_1$}{
+% Some code \\
+% Some more code
+% }
+%
+% \procedure[linenumbering,mode=text]{Oracle $H_2$}{
+% Some code \\
+% Some more code
+% }
+% \end{pchstack}
+% \end{pcvstack}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\begin{pcvstack}[boxed,center,space=1em]
+ \begin{pchstack}[center,space=2em]
+
+ \procedure[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen(\secparam) \\
+ (m_0,m_1) \sample \adv^O(\secparam, \pk) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c) \\
+ \pcreturn b = b' }
+
+ % alternatively use \pchspace for spacing
+
+ \procedure[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen(\secparam) \\
+ (m_0,m_1) \sample \adv^O(\secparam, \pk) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c) \\
+ \pcreturn b = b' }
+
+ \end{pchstack}
+
+ % alternatively use \pcvspace for spacing
+
+ \begin{pchstack}[space=0.25em]
+ \procedure[linenumbering,mode=text]{Oracle $O$}{
+ Some code \\
+ Some more code
+ }
+
+ \procedure[linenumbering,mode=text]{Oracle $H_1$}{
+ Some code \\
+ Some more code
+ }
+
+ \procedure[linenumbering,mode=text]{Oracle $H_2$}{
+ Some code \\
+ Some more code
+ }
+ \end{pchstack}
+\end{pcvstack}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection{Stacking Options}
+% \index{center}
+% \index{boxed}
+% \index{space}
+% \index{noindent}
+% \index{aboveskip}
+% \index{belowskip}
+%
+% The following keys are available on both |pchstack| and |pcvstack| environments
+% \begin{description}
+% \item[center]
+% Centers the stack.
+%
+% \item[boxed]
+% Draws a box around the stack.
+%
+% \item[space]
+% Controls the space between two pseudocode blocks within a stack. The default is 0pt
+% which can be adapted globally by redefining |\pchstackspace| or |\pcvstackspace|.
+%
+% \item[noindent]
+% Does not indent the stack. Only applies if option |center| is not used.
+%
+% \item[inline]
+% Ensures that no paragraph is added by |pchstack|. This cannot be used together with either |center| or |noindent|.
+%
+% \item[aboveskip]
+% By default the outer most stack adds vertical space above. The default space added
+% is |\abovedisplayskip| and can be adapted by redefining |\pcaboveskip|.
+%
+% \item[belowskip]
+% By default the outer most stack adds vertical space below. The default space added
+% is |\belowdisplayskip| and can be adapted by redefining |\pcbelowskip|. Note that
+% the defualt space below will not be added when used in a floating environment such as a figure.
+% However, when manually setting belowskip it will always be added.
+% \end{description}
+%
+% \subsection{Default Arguments}
+% \index{\textbackslash pcsetargs}
+% \index{\textbackslash pcsethstackargs}
+% \index{\textbackslash pcsetvstackargs}
+%
+% You can set the default arguments to be used with pseudocode blocks via |\pcsetargs|.
+% This is especially handy in stacking environments to add arguments to all enclosed
+% code blocks.
+% \begin{pchstack}[space=1em,center,boxed]
+% \renewcommand\pclnstyle[1]{#1}
+% \pcsetargs{linenumbering,mode=text,minlineheight=1cm,codesize=\Large{}}
+% \procedure{Some Procedue A}{%
+% Step 1\\
+% Step 2 }
+%
+%\procedure{Some Procedue B}{%
+%\text{Step 1}\\
+%\scriptsize$\begin{pcmbox}\begin{pmatrix} A \\ B + C \end{pmatrix}\end{pcmbox}$\\
+%\text{Step 3}}
+%
+%
+%\procedure{Some Procedue C}{
+% Step 1\\
+% Step 2 }
+%
+% \end{pchstack}
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\begin{pchstack}[space=1em,center,boxed]
+ % Do not change size to scriptsize for line numbers
+ \renewcommand\pclnstyle[1]{#1}
+
+ % set default arguments for all pseudocode blocks in this hstack
+ \pcsetargs{linenumbering,mode=text,minlineheight=1cm,codesize=\Large{}}
+
+ \procedure{Some Procedue A}{
+ Step 1\\
+ Step 2 }
+
+ \procedure{Some Procedue B}{
+ \text{Step 1}\\
+ \scriptsize$\begin{pcmbox}\begin{pmatrix}A \\ B + C \end{pmatrix}\end{pcmbox}$\\
+ \text{Step 3}}
+
+ \procedure{Some Procedue C}{
+ Step 1\\
+ Step 2 }
+\end{pchstack}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection*{Default Arguments for Stacking}
+% Similarly to |\pcsetargs| you can define default arguments for |hstack| and |vstack|
+% environments via |\pcsethstackargs| and |\pcsetvstackargs|.
+%
+% \subsection{Divisions and Linebreaks}
+% \index{linebreaks}
+% \index{\textbackslash hline}
+% Within the pseudocode command you generate linebreaks as |\\|. In order to specify the linewidth you can add an optional argument
+% \iffalse
+%<*example>
+% \fi
+% \begin{lstlisting}
+ \\[height]
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Furthermore, you can add horizontal lines by using the second optional argument and write
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \\[][\hline]
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \procb[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{
+% b \sample \bin \\[2\baselineskip][\hline\hline]
+% (\pk,\sk) \sample \kgen(\secparam) \\
+% (m_0,m_1) \sample \adv^O(\secparam, \pk) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c) \\
+% \pcreturn b = b' }
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedureblock[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+ b \sample \bin \\[2\baselineskip][\hline\hline]
+ (\pk,\sk) \sample \kgen(\secparam) \\
+ (m_0,m_1) \sample \adv^O(\secparam, \pk) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c) \\
+ \pcreturn b = b' }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection{Optimizing Layout}
+%
+% In case you are laying out multiple procedures horizontally, procedures may be slightly
+% misaligned if the procedure headings are not of the same height. As an example, Consider
+% the following setup
+%
+%\begin{pchstack}[center,space=1ex]
+%\procedure[linenumbering]{Procedure $A$}{
+%\text{do}\\
+%\text{some} \\
+%\text{work}
+%}
+%
+%\procedure[linenumbering]{Procedure $B^{F^{h^*}}_{G_1}$}{
+%\text{do}\\
+%\text{some} \\
+%\text{work}
+%}
+%\end{pchstack}
+%
+% Here the sub and double superscripts in Procedure $B$ make the header slightly larger than
+% the maximum alotted space provided for headers which causes procedure $B$ to be slightly
+% shifted to the bottom. The best way to remedy such a situation is to use a combination
+% of the |headheight| and |headlinesep| properties to increase the header space in both procedures
+% and shift back the headline for a more compact visualization. As we here want to set some
+% arguments for all procedure blocks within the stacking environment we can use |\pcsetargs|.
+%
+%\begin{pchstack}[center,space=1ex]
+%\pcsetargs{headheight=5ex,headlinesep=-1ex}
+%
+%\procedure[linenumbering]{Procedure $A$}{
+%\text{do}\\
+%\text{some} \\
+%\text{work}
+%}
+%
+%\procedure[linenumbering]{Procedure $B^{F^{h^*}}_{G_1}$}{
+%\text{do}\\
+%\text{some} \\
+%\text{work}
+%}
+%\end{pchstack}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\begin{pchstack}[center,space=1ex]
+ \pcsetargs{headheight=5ex,headlinesep=-1ex}
+
+ \procedure[linenumbering]{Procedure $A$}{
+ \text{do}\\
+ \text{some} \\
+ \text{work}
+ }
+
+ \procedure[linenumbering]{Procedure $B^{F^{h^*}}_{G_1}$}{
+ \text{do}\\
+ \text{some} \\
+ \text{work}
+ }
+\end{pchstack}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Matrices and Math Environments within Pseudocode}
+%
+% In order to work its magic, cryptocode (in particular within the \lstinline{\pseudocode} command) mingles with a few low level commands such as
+% \lstinline{\\} or \lstinline{\halign}. The effect of this is, that when you use certain math environments, for example, to create matrices, within pseudocode
+% the result may be unexpected. Consider the following example
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocodeblock{
+ \text{compute } P = \begin{pmatrix}
+ A \\ B + C
+ \end{pmatrix}
+ }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% which, somewhat unexpectedly, yields
+% \pcb{
+% \text{compute } P = \begin{pmatrix}
+% A \\ B + C
+% \end{pmatrix}
+% }
+%
+% Here, the alignment is somewhat off. In order, to allow for the \emph{pmatrix} environment
+% to properly work without interference from |\pseudocode|
+% you can wrap it into a |pcmbox| environment (where pcmbox is short for pseudocode math box).
+% This ensures that the low-level changes introduced by |\pseudocode| are not active.
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocodeblock{
+ \text{compute } P = \begin{pcmbox}\begin{pmatrix}
+ A \\ B + C
+ \end{pmatrix}\end{pcmbox}
+ }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \begin{center}
+% \fbox{
+% \pseudocode{
+% \text{compute } P = \begin{pcmbox}\begin{pmatrix}
+% A \\ B + C
+% \end{pmatrix}\end{pcmbox}
+% }
+% }
+% \end{center}
+%
+% \subsection{Fancy Code with Overlays}
+%
+% Consider the \indcpa\ game. Here we have a single adversary $\adv$ that is called twice, first to output two messages and
+% which is then given the ciphertext of one of the messages in order to \enquote{guess} which one was encrypted.
+% Often this is not visualized.
+% Sometimes an additional state $\state$ is passed as we have in the following example on the left. On the right,
+% we visualize the same idea in a slightly more fancy way.
+%
+% \begin{pchstack}[center,space=1cm]
+%
+% \procedure[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen (\secparam) \\
+% (\state,m_0,m_1) \sample \adv(\secparam, \pk, c) \pcnode{start} \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c, \state) \pcnode{end} \\
+% \pcreturn b = b' }
+%
+% \begin{pcimage}
+% \procedure[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen (\secparam) \\
+% (m_0,m_1) \sample \adv(\secparam, \pk, c) \pcnode{start} \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c, \state) \pcnode{end} \\
+% \pcreturn b = b' }
+%
+% \pcdraw{
+% \path[->] (start) edge[bend left=50] node[right]{$\state$} (start|-end);
+% }
+% \end{pcimage}
+% \end{pchstack}
+%
+% The image on the right is generated by:
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{pcimage}
+ \procedureblock[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen (\secparam) \\
+ (m_0,m_1) \sample \adv(\secparam, \pk, c) \pcnode{start} \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c, \state) \pcnode{end} \\
+ \pcreturn b = b' }
+
+ \pcdraw{
+ \path[->] (start) edge[bend left=50] node[right]{$\state$} (start|-end);
+ }
+ \end{pcimage}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% In order to achieve the above effect cryptocode utilizes TIKZ underneath. The
+% |\pcnode| command generates TIKZ nodes and additionally we wrapped the
+% pseudocode (or procedure) command in an |\begin{pcimage}\end{pcimage}| environment
+% which allows us to utilize these nodes later, for example using the |\pcdraw|
+% command. We can achieve a similar effect without an additional pcimage environment by
+% using the optional argument of |\pcnode| for the TIKZ code.
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedureblock[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen (\secparam) \\
+ (m_0,m_1) \sample \adv(\secparam, \pk, c) \pcnode{start} \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c, \state) \pcnode{end}[draw={
+ \path[->] (start) edge[bend left=50] node[right]{$\state$} (start|-end);
+ }] \\
+ \pcreturn b = b' }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection*{Example: Explain your Code}
+% As an exmaple of what you can do with this, let us put an explanation to a line of the code.
+%
+% \begin{pcimage}
+% \procb[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+% b \sample \bin \\
+% (\pk,\sk) \sample \kgen (\secparam)\pcnode{kgen} \\
+% (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+% c \sample \enc(\pk,m_b) \\
+% b' \sample \adv(\secparam, \pk, c, \state) \\
+% \pcreturn b = b' }
+%
+% \pcdraw{
+% \node[rectangle callout,callout absolute pointer=(kgen),fill=orange]
+% at ([shift={(+3,+1)}]kgen) {
+% \begin{varwidth}{3cm}
+% $\kgen(\secparam)$ samples a public key $\pk$ and a private key $\sk$.
+% \end{varwidth}
+% };
+% }
+% \end{pcimage}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\begin{pcimage}
+\procedureblock[linenumbering]{$\indcpa_\enc^\adv(\secparam)$}{%
+ b \sample \bin \\
+ (\pk,\sk) \sample \kgen (\secparam)\pcnode{kgen} \\
+ (m_0,m_1) \sample \adv(\secparam, \pk, c) \\
+ c \sample \enc(\pk,m_b) \\
+ b' \sample \adv(\secparam, \pk, c, \state) \\
+ \pcreturn b = b' }
+
+\pcdraw{
+ \node[rectangle callout,callout absolute pointer=(kgen),fill=orange]
+ at ([shift={(+3,+1)}]kgen) {
+ \begin{varwidth}{3cm}
+ $\kgen(\secparam)$ samples a public key $\pk$ and a private key $\sk$.
+ \end{varwidth}
+ };
+}
+\end{pcimage}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \amipagebreak
+% \section{Tabbing Mode}
+% \label{chap:tabbing}
+% \index{\&}
+% \index{Tabbing Mode}
+% \index{\textbackslash\textlangle{}}
+% \index{\textbackslash\textrangle{}}
+% In the following section we discuss how to create multiple columns within a |\pseudocode| command.
+% Within a |\pseudocode| command you can switch to a new column by inserting a |\>|.
+% This is similar to using an |align| environment and placing a tabbing character (\&). Also,
+% similarly to using |align| you should ensure that the number of |\>| are identical
+% on each line.
+% \pcb{%
+% \textbf{First} \> \textbf{Second} \> \textbf{Third} \> \textbf{Fourth} \\
+% b \sample \bin \> b \sample \bin \> b \sample \bin \> b \sample \bin}
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\pseudocodeblock{
+ \textbf{First} \> \textbf{Second} \> \textbf{Third} \> \textbf{Fourth} \\
+ b \sample \bin \> b \sample \bin \> b \sample \bin \> b \sample \bin}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% As you can see the first column is left aligned the second right, the third left and so forth.
+% In order to get only left aligned columns you could thus simply always skip a column by
+% using |\>\>|. You can also use |\<| a shorthand for |\>\>|.
+% \pcb{%
+% \textbf{First} \< \textbf{Second} \< \textbf{Third} \< \textbf{Fourth} \\
+% b \sample \bin \< b \sample \bin \< b \sample \bin \< b \sample \bin}
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\pseudocodeblock{
+ \textbf{First} \< \textbf{Second} \< \textbf{Third} \< \textbf{Fourth} \\
+ b \sample \bin \< b \sample \bin \< b \sample \bin \< b \sample \bin}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \paragraph{Column Spacing}
+% \index{colsep}
+% \index{addtolength}
+% You can control the space between columns using the option \enquote{colsep=2em}. Note that when doing so you should
+% additionally use \enquote{addtolength=5em} (where 5em depends on the number of columns) in order to avoid having
+% overfull hboxes.
+% \pcb[colsep=1em,addtolength=10em]{%
+% \textbf{First} \< \textbf{Second} \< \textbf{Third} \< \textbf{Fourth} \\
+% b \sample \bin \< b \sample \bin \< b \sample \bin \< b \sample \bin}
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocodeblock[colsep=1em,addtolength=10em]{%
+ \textbf{First} \< \textbf{Second} \< \textbf{Third} \< \textbf{Fourth} \\
+ b \sample \bin \< b \sample \bin \< b \sample \bin \< b \sample \bin}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% This is basically all you need to know in order to go on to writing protocols with the
+% cryptocode package. So unless you want to know a bit more about tabbing (switching columns)
+% and learn some of the internals, feel free to proceed to Section~\ref{chap:protocols}.
+%
+% \subsection{Tabbing in Detail}
+% \index{mintabmode}
+% At the heart of the pseudocode package is an align (or rather a flalign*) environment which allows you to use basic math notation.
+% Usually an align (or flalign) environment uses \& as tabbing characters.
+% The pseudocode comes in two modes the first of which changes the default align behavior.
+% That is, it automatically adds a tabbing character to the beginning and end of each line
+% and changes the tabbing character to |\>|. This mode is called \emph{mintabmode} and is active by default.
+%
+% In mintabmode in order to make use of extra columns in the align environment
+% (which we will use shortly in order to write protocols) you can use |\>| as you would use \& normally.
+% But, don't forget that there is an alignment tab already placed at the beginning and end of each line. So the following example
+% \pcb{%
+% \textbf{Alice} \> \> \textbf{Bob} \\
+% b \sample \bin \> \> \\
+% \> \xrightarrow{\text{send over } b} \> \\
+% \> \> \text{do something}}
+% is generated by
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocodeblock{
+ \textbf{Alice} \> \> \textbf{Bob} \\
+ b \sample \bin \> \> \\
+ \> \xrightarrow{\text{send over } b} \> \\
+ \> \> \text{do something}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection{Overriding The Tabbing Character}
+% \index{\textbackslash pctabname}
+% If you don't like |\>| as the tabbing character you can choose a custom command by overwriting |\pctabname|.
+% For example
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\renewcommand{\pctabname}{\myTab}
+
+\pseudocode{
+ \textbf{Alice} \myTab \myTab \textbf{Bob} \\
+ b \sample \bin \myTab \myTab \\
+ \myTab \xrightarrow{\text{send over } b} \myTab \\
+ \myTab \myTab \text{do something}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection{Custom Line Spacing and Horizontal Rules}
+% \index{\textbackslash pclb}
+% As explained, underlying the pseudocode command is an flalign environment. This would allow the use
+% of |\\[spacing]| to specifiy the spacing between two lines or of |[\\\hline]|
+% to insert a horizontal rule. In order to achieve the same effect within the pseudocode command you
+% can use |\\[spacing][\hline]|. You can also use |\pclb| to get a line break which
+% does not insert the additional alignment characters.
+%
+% \amipagebreak
+% \section{Protocols}
+% \label{chap:protocols}
+%
+% Using tabbing, we can use |\pseudocode| to also layout protocols such as
+% \procb{My Protocol}{
+% \textbf{Alice} \> \> \textbf{Bob} \\
+% b \sample \bin \> \> \\
+% \> \xrightarrow{\text{send over } b} \> \\
+% \> \> \text{do something} \\
+% \> \xleftarrow{\text{send over sth. else}} \> \\
+% \text{finalize} \> \>}
+% which is generated as
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\procedureblock{My Protocol}{
+ \textbf{Alice} \> \> \textbf{Bob} \\
+ b \sample \bin \> \> \\
+ \> \xrightarrow{\text{send over } b} \> \\
+ \> \> \text{do something} \\
+ \> \xleftarrow{\text{send over sth. else}} \> \\
+ \text{finalize} \> \>}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% \index{\textbackslash sendmessage}%
+% \index{\textbackslash sendmessage*}%
+% \index{\textbackslash sendmessageright*}
+% \index{\textbackslash sendmessageright}
+% \index{\textbackslash sendmessageleft*}
+% \index{\textbackslash sendmessageleft}
+% In order to get nicer message arrows use the commands |\sendmessageright*{message}|, |\sendmessageleft*{message}|, and
+% |\sendmessagerightleft*{message}|.
+% All three take an additional optional argument specifying the length of the arrow and all
+% wrap their mandatory argument in an |aligned| environment.
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \sendmessageright*[3.5cm]{message}
+ \sendmessageleft*[3.5cm]{message}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \procb{My Protocol}{
+% \textbf{Alice} \> \> \textbf{Bob} \\
+% b \sample \bin \> \> \\
+% \> \sendmessageright*{\text{send over } b} \> \\
+% \> \> \text{do something} \\
+% \> \sendmessageleft*{\text{send over sth. else}} \> \\
+% \text{finalize} \> \> }
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedureblock{My Protocol}{%
+ \textbf{Alice} \> \> \textbf{Bob} \\
+ b \sample \bin \> \> \\
+ \> \sendmessageright*{\text{send over } b} \> \\
+ \> \> \text{do something} \\
+ \> \sendmessageleft*{\text{send over sth. else}} \> \\
+ \text{finalize} \> \> }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% To obtain granular control over how messages are set use the |\sendmessage| and
+% |\sendmessage*| commands. These take two parameters, the first being the message style
+% for the underlying TIKZ path (e.g., |->| for messages to the right) and the second
+% a key value list of arguments. The difference between the starred version and the
+% unstarred version is that the starred version wraps its labels in an |aligned|
+% environment. Following is an example, that showcases various message options.
+% \procedureblock{My Protocol}{
+% \textbf{Alice} \> \> \textbf{Bob} \\
+% b \sample \bin \> \> \\
+% \> \sendmessage{->}{centercol=3,top=send over $b$,bottom=Text below,topstyle={draw,solid,yshift=0.25cm},style={dashed}} \> \\
+% \> \> \text{do something} \\
+% \> \sendmessage{<-}{length=8cm,top=send over sth. else} \> \\
+% \> \sendmessage*{<->}{length=8cm,top={{a,b, c\\c,d, e}},bottom={foo}} \> \\
+% \> \sendmessage{<->}{length=8cm,top=\pseudocode[linenumbering]{\text{you can also}\\\text{use pseudocode}},bottom={foo}} \> \\
+% \text{finalize} \> \> }
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\procedureblock{My Protocol}{
+ \textbf{Alice} \> \> \textbf{Bob} \\
+ b \sample \bin \> \> \\
+ \> \sendmessage{->}{centercol=3,top=send over $b$,bottom=Text below,topstyle={draw,solid,yshift=0.25cm},style={dashed}} \> \\
+ \> \> \text{do something} \\
+ \> \sendmessage{<-}{length=8cm,top=send over sth. else} \> \\
+ \> \sendmessage*{<->}{length=8cm,top={{a,b, c\\c,d, e}},bottom={foo}} \> \\
+ \> \sendmessage{<->}{length=8cm,top=\pseudocode[linenumbering]{\text{you can also}\\\text{use pseudocode}},bottom={foo}} \> \\
+ \text{finalize} \> \> }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% |sendmessage| and |sendmessage*| support the following options:
+% \begin{description}
+% \item[top]
+% The content to display on top of the arrow.
+% \item[bottom]
+% The content to display below the arrow.
+% \item[left]
+% The content to display on the left of the arrow.
+% \item[right]
+% The content to display on the right of the arrow.
+% \item[topstyle]
+% The TIKZ style to be used for the top node.
+% \item[bottomstyle]
+% The TIKZ style to be used for the bottom node.
+% \item[rightstyle]
+% The TIKZ style to be used for the right node.
+% \item[leftstyle]
+% The TIKZ style to be used for the left node.
+% \item[length]
+% The length of the arrow.
+% \item[style]
+% The style of the arrow.
+% \item[width]
+% The width of the column
+% \item[centercol]
+% Can be used to ensure that the message is displayed in the center. This should be set to the
+% column index. In the above example, the message column is the third column (note that there is
+% a column left of alice that is automatically inserted).
+% \end{description}
+%
+% \subsection{Tabbing}
+% When typesetting protocols you might find that using two tabs instead of a single tab usually provides
+% a better result as this ensures that all columns are left aligned.
+% For this you can use |\<| instead of |\>| (see Section~\ref{chap:tabbing}).
+%
+% \medskip
+% Following is once more the example from before but now with double tapping.
+% \procb{My Protocol}{
+% \textbf{Alice} \< \< \textbf{Bob} \\
+% b \sample \bin \< \< \\
+% \< \sendmessageright*{\text{send over } b} \< \\
+% \< \< \text{do something} \\
+% \< \sendmessageleft*{\text{send over sth. else}} \< \\
+% \text{finalize} \< \< }
+%
+% \subsection{Multiline Messages}
+% Using the starred send message commands you can easily generate multiline messages as the command
+% wraps an \emph{aligned} environment around the message.
+% \procb{My Protocol}{%
+% \textbf{Alice} \< \< \textbf{Bob} \\
+% b \sample \bin \< \< \\
+% \< \sendmessageright*{\text{send over } b\\ \text{second line}} \< \\
+% \< \< \text{do something} \\
+% \< \sendmessage*{<-}{top={\>\text{left aligned}\\ \> \text{multiline message}}} \< \\
+% \text{finalize} \< \<}
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedureblock{My Protocol}{%
+ \textbf{Alice} \< \< \textbf{Bob} \\
+ b \sample \bin \< \< \\
+ \< \sendmessageright*{\text{send over } b\\ \text{second line}} \< \\
+ \< \< \text{do something} \\
+ \< \sendmessage*{<-}{top={\>\text{left aligned}\\ \> \text{multiline message}}} \< \\
+ \text{finalize} \< \<}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \textbf{Remark. } When using |\sendmessage*| the tabbing character |&| cannot be used.
+% Instead use the |\>| command as defined within |\pseudocode|.
+%
+% \subsubsection{Multiplayer Protocols}
+%
+% You are not limited to two players. In order to send messages skipping players
+% use |\sendmessagerightx| and |\sendmessageleftx|.
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \sendmessagerightx[width]{columnspan}{Text}
+ \sendmessageleftx[width]{columnspan}{Text}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \procb{Multiparty Protocol}{
+% \textbf{Alice} \< \< \textbf{Bob} \< \< \textbf{Charlie} \\
+% \text{work} \< \< \< \< \\
+% \< \sendmessageright{top=Work result} \< \< \< \\
+% \< \< \text{work} \< \< \\
+% \< \< \< \sendmessageright{top=Work result,bottom=Bottom message} \< \\
+% \< \< \< \< \text{work} \\
+% \< \sendmessageleftx[7cm]{8}{\text{A long message for Alice}} \< \\
+% \text{finalize} \< \< \< \< }
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \procedureblock{Multiparty Protocol}{%
+ \textbf{Alice} \< \< \textbf{Bob} \< \< \textbf{Charlie} \\
+ \text{work} \< \< \< \< \\
+ \< \sendmessageright{top=Work result} \< \< \< \\
+ \< \< \text{work} \< \< \\
+ \< \< \< \sendmessageright{top=Work result,bottom=Bottom message} \< \\
+ \< \< \< \< \text{work} \\
+ \< \sendmessageleftx[7cm]{8}{\text{A long message for Alice}} \< \\
+ \text{finalize} \< \< \< \< }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Note that for the last message from Charlie to Alice we needed to specify the number of passed
+% over colums (|\sendmessageleftx[7cm]{8}{message}|). As we were passing
+% 4 |\<| where each creates 2 columns, the total was 8 columns.
+%
+% \subsubsection{Divisions}
+% You can use |\pcintertext| in order to divide protocols (or other pseudocode for that matter).
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pcintertext[dotted|center]{Division Text}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Note that in order to use the |\pcintertext| you need to use |\pclb| as the line break for the line
+% before. Also see Section~\ref{chap:tabbing}.
+%
+% \procb{My Protocol}{
+% \textbf{Alice} \< \< \textbf{Bob} \\
+% b \sample \bin \< \< \pclb
+% \pcintertext[dotted]{Some Division} \\
+% \< \sendmessageright*{\text{send over } b} \< \\
+% \< \< \text{do something} \pclb
+% \pcintertext[dotted]{Another Division} \\
+% \< \sendmessageleft*{\text{message}} \< \\
+% \text{finalize} \< \< }
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\procedureblock{My Protocol}{%
+ \textbf{Alice} \< \< \textbf{Bob} \\
+ b \sample \bin \< \< \pclb
+ \pcintertext[dotted]{Some Division} \\
+ \< \sendmessageright*{\text{send over } b} \< \\
+ \< \< \text{do something} \pclb
+ \pcintertext[dotted]{Another Division} \\
+ \< \sendmessageleft*{\text{message}} \< \\
+ \text{finalize} \< \< }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Line Numbering in Protocols}
+% Protocols can be numbered similarly to plain pseudocode. Additionally to the
+% |\pcln| there are the commands |\pclnr| and |\pcrln|. The first
+% allows you to right align line numbers but uses the same counter as
+% |\pcln|. The second uses a different counter.
+%
+% \procb{My Protocol}{%
+% \pcln \textbf{Alice} \< \< \textbf{Bob} \< \\
+% \pcln b \sample \bin \< \< \< \\
+% \< \sendmessageright*{\text{send over } b} \< \< \pclnr\\
+% \< \< \text{do something} \< \pclnr \\
+% \< \sendmessageleft*{\text{send over sth. else}} \<\< \pclnr \\
+% \pcln \text{finalize} \< \< \<}
+% Which is generated as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\procedureblock{My Protocol}{
+ \pcln \textbf{Alice} \< \< \textbf{Bob} \< \\
+ \pcln b \sample \bin \< \< \< \\
+ \< \sendmessageright*{\text{send over } b} \< \< \pclnr\\
+ \< \< \text{do something} \< \pclnr \\
+ \< \sendmessageleft*{\text{send over sth. else}} \<\< \pclnr \\
+ \pcln \text{finalize} \< \< \<}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% And using |\pcrln| we obtain:
+% \procb{My Protocol}{%
+% \pcln \textbf{Alice} \< \< \textbf{Bob} \< \\
+% \pcln b \sample \bin \< \< \< \\
+% \< \sendmessageright*{\text{send over } b} \<\< \pcrln\\
+% \< \< \text{do something} \< \pcrln \\
+% \< \sendmessageleft*{\text{send over sth. else}} \< \< \pcrln \\
+% \pcln \text{finalize} \< \< \< }
+% This is generated as
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\procedureblock{My Protocol}{%
+ \pcln \textbf{Alice} \< \< \textbf{Bob} \\
+ \pcln b \sample \bin \< \< \\
+ \< \sendmessageright*{\text{send over } b} \< \pcrln\\
+ \< \< \text{do something} \pcrln \\
+ \< \sendmessageleft*{\text{send over sth. else}} \< \pcrln \\
+ \pcln \text{finalize} \< \< }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection{Separators}
+% \label{sec:protocol:separator}
+% The commands |\pclnseparator| and |\pcrlnseparator| define the separators between code and line number.
+% By default the left separator is set to (:) colon and the right separator is set to an empty string.
+%
+% \subsubsection{Spacing}
+% Spacings after the left separator and in front of the right separator can be controlled by
+% |\pclnspace| and |\pclnrspace| which are set to 1em and 0.5em, respectively.
+%
+% \subsection{Sub Protocols}
+%
+% Use the |subprocedure| environemnt to also create sub protocols.
+%
+% \procb{My Protocol}{
+% \textbf{Alice} \< \< \textbf{Bob} \\
+% b \sample \bin \< \< \\
+% \< \sendmessageright*{\text{send over } b} \< \\
+% \< \< \text{do something} \\
+% \<\< \dbox{\begin{subprocedure}\procedure{Subprotocol}{
+% \< \< \textbf{Charlie} \\
+% \text{something more} \< \< \\
+% \< \sendmessageright*[1.5cm]{\text{message}} \< \\
+% \< \< \text{some processing} \\
+% \< \< \text{more processing} \\
+% \< \sendmessageleft*[1.5cm]{\text{message}} \< \\
+% \< \sendmessageright*[1.5cm]{\text{message}} \< \\
+% \< \sendmessageleft*[1.5cm]{\text{message}} \< \\
+% }\end{subprocedure}} \\
+% \< \sendmessageleft*{\text{send over sth. else}} \< \\
+% \text{finalize} \< \< }
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\procedureblock{My Protocol}{
+ \textbf{Alice} \< \< \textbf{Bob} \\
+ b \sample \bin \< \< \\
+ \< \sendmessageright*{\text{send over } b} \< \\
+ \< \< \text{do something} \\
+ \<\< \dbox{\begin{subprocedure}\procedure{Subprotocol}{
+ \< \< \textbf{Charlie} \\
+ \text{something more} \< \< \\
+ \< \sendmessageright*[1.5cm]{\text{message}} \< \\
+ \< \< \text{some processing} \\
+ \< \< \text{more processing} \\
+ \< \sendmessageleft*[1.5cm]{\text{message}} \< \\
+ \< \sendmessageright*[1.5cm]{\text{message}} \< \\
+ \< \sendmessageleft*[1.5cm]{\text{message}} \< \\
+ }\end{subprocedure}} \\
+ \< \sendmessageleft*{\text{send over sth. else}} \< \\
+ \text{finalize} \< \< }
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \amipagebreak
+% \section{Game-Based Proofs}
+% \label{chap:gbproofs}
+%
+% \subsection{Basics}
+% \index{gameproof}
+% \index{\textbackslash \pcgame}
+% \index{gameprocedure}
+%
+% Besides displaying pseudocode the package also comes with commands to help presetn game-based proofs.
+% The |gameproof| environment wraps the pseudocode block of a game-based proof.
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\begin{gameproof}
+ proof goes here
+\end{gameproof}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Within a |gameproof| environment use the command |\gameprocedure| which works similarly to the pseudocode
+% command and produces a heading of the form $\pcgame[\text{counter}](\secpar)$ where counter is a consecutive counter.
+% Thus, we can create the following setup
+% \begin{gameproof}
+% \begin{pchstack}[space=1em,center,boxed]
+% \gameprocedure[linenumbering,mode=text]{%
+% Step 1 \\
+% Step 2
+% }
+% \gameprocedure[mode=text]{%
+% Step 1 \\
+% Step 2
+% }
+% \end{pchstack}
+% \end{gameproof}
+% by using
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\begin{gameproof}
+\begin{pchstack}[space=1em,center,boxed]
+ \gameprocedure[linenumbering,mode=text]{%
+ Step 1 \\
+ Step 2
+ }
+ \gameprocedure[mode=text]{%
+ Step 1 \\
+ Step 2
+ }
+\end{pchstack}
+\end{gameproof}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% For discussing individual games, cryptocode provides the |\pcgame| command which
+% without argument prints \pcgame\ and with (optional) argument |\pcgame[n]| prints \pcgame[n].
+%
+% \subsubsection{Highlight Changes}
+% \index{highlight game change}
+% \index{\textbackslash gamechange}
+% In order to highlight changes from one game to the next use |\gamechange|.
+% \begin{gameproof}
+% \begin{pchstack}[space=1em,center,boxed]
+% \gameprocedure[linenumbering,mode=text]{%
+% Step 1 \\
+% Step 2
+% }
+% \gameprocedure[mode=text]{%
+% Step 1 \\
+% \gamechange{Step 2}
+% }
+% \end{pchstack}
+% \end{gameproof}
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\begin{gameproof}
+\begin{pchstack}[space=1em,center,boxed]
+ \gameprocedure[linenumbering,mode=text]{%
+ Step 1 \\
+ Step 2
+ }
+ \gameprocedure[mode=text]{%
+ Step 1 \\
+ \gamechange{Step 2}
+ }
+\end{pchstack}
+\end{gameproof}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% The background color can be controlled by redefining |\gamechangecolor| which by default
+% is defined as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \definecolor{gamechangecolor}{gray}{0.90}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \textbf{Remark. } Note that |\gamechange| is always in text mode.
+%
+% \subsubsection{Boxed Games}
+% \index{\textbackslash tbxgameprocedure}
+% \index{\textbackslash pcbox}
+% Use |\tbxgameprocedure| in order to create two consecutive games where the second game is \emph{boxed}. Use
+% |\pcbox| to create boxed statements.
+%\begin{gameproof}
+%\begin{pchstack}[space=1em,boxed,center]
+% \gameprocedure[linenumbering]{
+% \text{Step 1} \\
+% \text{Step 2}
+% }
+% \tbxgameprocedure{
+% \text{Step 1}; \pcbox{\text{Alternative step 1}} \\
+% \gamechange{\text{Step 2 is different}}
+% }
+% \gameprocedure{
+% \text{Step 1} \\
+% \text{\gamechange{Step 2}}
+% }
+%\end{pchstack}
+%\end{gameproof}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\begin{gameproof}
+\begin{pchstack}[space=1em,boxed,center]
+ \gameprocedure[linenumbering]{
+ \text{Step 1} \\
+ \text{Step 2}
+ }
+ \tbxgameprocedure{
+ \text{Step 1}; \pcbox{\text{Alternative step 1}} \\
+ \gamechange{\text{Step 2 is different}}
+ }
+ \gameprocedure{
+ \text{Step 1} \\
+ \text{\gamechange{Step 2}}
+ }
+\end{pchstack}
+\end{gameproof}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection{Reduction Hints}
+% \index{\textbackslash addgamehop}
+% In a game based proof, in order to go from one game to the next we usually give a reduction, for example, we show that
+% the difference between two games is bound by the security of some pseudorandom generator $\mathsf{PRG}$. To give a hint
+% within the pseudocode that the difference between two games is down to ``something'' you can use the |\addgamehop|
+% command.
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \addgamehop{startgame}{endgame}{options}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Here options allows you to specify the hint as well as the style. The following options are available
+% \begin{description}
+% \item[hint]
+% The hint text
+% \item[nodestyle]
+% A TIKZ style to be used for the node.
+% \item[pathstyle]
+% A TIKZ style to be used for the path.
+% \item[edgestyle]
+% A TIKZ style to be used for the edge. This defaults to \enquote{bend left}.
+% \end{description}
+%
+%\begin{gameproof}
+%\begin{pchstack}[center,space=2em,aboveskip=1.5em]
+% \gameprocedure[linenumbering]{
+% \text{Step 1} \\
+% \text{Step 2}
+% }
+% \tbxgameprocedure{
+% \text{Step 1} \\
+% \gamechange{\text{Step 2 is different}}
+% }
+%\end{pchstack}
+%
+%\addgamehop{1}{2}{hint=\footnotesize some hint,nodestyle=red}
+%\addgamehop{2}{3}{hint=\footnotesize some other hint,nodestyle=red}
+%\end{gameproof}
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\begin{gameproof}
+\begin{pchstack}[center,space=2em]
+ \gameprocedure[linenumbering]{
+ \text{Step 1} \\
+ \text{Step 2}
+ }
+ \tbxgameprocedure{
+ \text{Step 1} \\
+ \gamechange{\text{Step 2 is different}}
+ }
+\end{pchstack}
+
+\addgamehop{1}{2}{hint=\footnotesize some hint,nodestyle=red}
+\addgamehop{2}{3}{hint=\footnotesize some other hint}
+\end{gameproof}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% The edgestyle allows you to specify how the hint is displayed. If you, for example want a straight line, rather than the curved arrow simply
+% use
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \addgamehop{1}{2}{hint=\footnotesize some hint,edgestyle=}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% If game proofs do not fit into a single picture you can specify start and end hints using the commands
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \addstartgamehop[first game]{options}
+ \addendgamehop[last game]{options}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+%\begin{gameproof}
+%\begin{pchstack}[center,space=2em,aboveskip=1em]
+% \gameprocedure[linenumbering]{
+% \text{Step 1} \\
+% \text{Step 2}
+% }
+% \gameprocedure{%
+% \text{Step 1} \\
+% \gamechange{\text{Step 2 is different}}
+% }
+%\addstartgamehop{hint=\footnotesize some hint,edgestyle=}
+%\addgamehop{1}{2}{hint=\footnotesize some hint}
+%\addendgamehop{hint=\footnotesize some outgoing hint,edgestyle=}
+%\end{pchstack}
+%\end{gameproof}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\begin{gameproof}
+\begin{pchstack}[center,space=2em]
+ \gameprocedure[linenumbering]{
+ \text{Step 1} \\
+ \text{Step 2}
+ }
+ \gameprocedure{
+ \text{Step 1} \\
+ \gamechange{\text{Step 2 is different}}
+ }
+\end{pchstack}
+
+\addstartgamehop{hint=\footnotesize some hint,edgestyle=}
+\addgamehop{1}{2}{hint=\footnotesize some hint}
+\addendgamehop{hint=\footnotesize some outgoing hint,edgestyle=}
+\end{gameproof}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection{Numbering and Names}
+% By default the |gameproof| environment starts to count from 1 onwards. Its optional parameters allow you to specify a custom
+% name for the game as well as defining the starting number.
+% \iffalse
+%<*example>
+% \fi
+% \begin{lstlisting}
+ \begin{gameproof}[options]
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% The following parameters are available which, as usual, are provided in a key=value based form.
+% \begin{description}
+% \item[nr]
+% The starting number minus 1. Thus, when setting nr=5, the first game will be \pcgame[6].
+% \item[name]
+% The name for the game
+% \item[arg]
+% The argument to be used for the game.
+% \end{description}
+%
+%\begin{gameproof}[nr=5,name=\mathsf{MyGame},arg=(1^n)]
+%\begin{pchstack}[center,space=2em,aboveskip=2.5em]
+% \gameprocedure[linenumbering]{
+% \text{Step 1} \\
+% \text{Step 2} }
+% \gameprocedure{
+% \text{Step 1} \\
+% \gamechange{\text{Step 2 is different}} }
+%\end{pchstack}
+%
+%\addstartgamehop{hint=\footnotesize some ingoing hint,edgestyle=}
+%\addgamehop{6}{7}{hint=\footnotesize some hint}
+%\addendgamehop{hint=\footnotesize some outgoing hint,edgestyle=}
+%\end{gameproof}
+%
+% \iffalse
+%<*example>
+% \fi
+% \begin{lstlisting}
+\begin{gameproof}[nr=5,name=\mathsf{MyGame},arg=(1^n)]
+\begin{pchstack}[center,space=2em]
+ \gameprocedure[linenumbering]{
+ \text{Step 1} \\
+ \text{Step 2} }
+ \gameprocedure{
+ \text{Step 1} \\
+ \gamechange{\text{Step 2 is different}} }
+\end{pchstack}
+
+\addstartgamehop{hint=\footnotesize some ingoing hint,edgestyle=}
+\addgamehop{6}{7}{hint=\footnotesize some hint}
+\addendgamehop{hint=\footnotesize some outgoing hint,edgestyle=}
+\end{gameproof}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection{Default Name and Argument}
+% The default name and argument are controlled via the commands |\pcgamename| and |\gameprocedurearg|.
+%
+% \begin{center}
+% \begin{tabular}{ll}
+% \textbf{Command} & \textbf{Default} \\
+% |\pcgamename| & |\mathsf{Game}| \\
+% |\gameprocedurearg| & |\secpar|
+% \end{tabular}
+% \end{center}
+%
+% \subsubsection{Bi-Directional Games}
+% \index{\textbackslash bxgameprocedure}
+% \index{\textbackslash addloopgamehop}
+% You can use the |\bxgameprocedure| to generate games for going in two directions. Use the |\addloopgamehop|
+% to add the gamehop in the middle.
+%
+% \vspace{1cm}
+% \begin{center}
+% \begin{gameproof}
+% \bxgameprocedure{4}{%
+% \pcln \text{Step 1}; \pcbox{Alternative} \\
+% \pcln \text{Step 2}
+% }
+% \bxgameprocedure{3}{%
+% \text{Step 1}; \pcbox{Alternative} \\
+% \gamechange{\text{Step 2 is different}}
+% }
+% \addstartgamehop{hint=\footnotesize some hint,edgestyle=}
+% \addgamehop{1}{2}{hint=\footnotesize some hint,edgestyle=}
+% \addloopgamehop{hint=\footnotesize some loop hint}
+% \addgamehop{2}{1}{hint=\footnotesize some hint}
+% \end{gameproof}
+% \end{center}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{gameproof}
+ \bxgameprocedure{4}{%
+ \pcln \text{Step 1}; \pcbox{Alternative} \\
+ \pcln \text{Step 2}
+ }
+ \bxgameprocedure{3}{%
+ \text{Step 1}; \pcbox{Alternative} \\
+ \gamechange{\text{Step 2 is different}}
+ }
+ \addstartgamehop{hint=\footnotesize some hint,edgestyle=}
+ \addgamehop{1}{2}{hint=\footnotesize some hint,edgestyle=}
+ \addloopgamehop{hint=\footnotesize some loop hint}
+ \addgamehop{2}{1}{hint=\footnotesize some hint}
+ \end{gameproof}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection{Styling Game Procedures}
+% It may come in handy to define default style arguments for the underlying pseudocode
+% command used by |\gameprocedure|. For this you can
+% define the default arguments by calling \lstinline{\setgameproceduredefaultstyle} to
+% for example:
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \setgameproceduredefaultstyle{beginline=\vphantom{\bin^\prg_\prg}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% The default is to not set any options.
+%
+% \subsection{Game Descriptions}
+% Cryptocode also comes with an environment to provide textual descriptions of games such as
+%
+% \begin{gamedescription}[name=MyGame,nr=2]
+% \describegame
+% This is the third game. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis condimentum velit et orci volutpat, sed ultrices lorem lobortis. Nam vehicula, justo eu varius interdum, felis mi consectetur dolor, ac posuere nulla lacus varius diam. Etiam dapibus blandit leo, et porttitor augue lacinia auctor.
+%
+% \describegame[inhint=reduction target]
+% This is the fourt game. The arrow at the side indicates the reduction target.
+% \end{gamedescription}
+%
+% The above example is generated as
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{gamedescription}[name=MyGame,nr=2]
+ \describegame
+ This is the third game. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis condimentum velit et orci volutpat, sed ultrices lorem lobortis. Nam vehicula, justo eu varius interdum, felis mi consectetur dolor, ac posuere nulla lacus varius diam. Etiam dapibus blandit leo, et porttitor augue lacinia auctor.
+
+ \describegame[inhint=reduction target]
+ This is the second game. The arrow at the side indicates the reduction target.
+ \end{gamedescription}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% The |gamedescription| environment takes an optional argument to specify name and counter (defaults to Game and 0). The command
+% |\describegame| starts a new game description and can allows you to provide a reduction hint using the option parameter |inhint|.
+%
+% \begin{description}
+% \item[inhint] Displays an ingoing arrow to denote the reduction target for this game hop.
+% \item[length] Allows to control the length of the arrow. \\
+% \item[nodestyle] Allows to control the style of the node. \\
+% \item[hint] Instead of having an ingoing arrow, this adds an outgoing arrow. \\
+% \end{description}
+%
+% \amipagebreak
+% \section{Black-Box Reductions}
+% \label{chap:bbr}
+% \index{bbrenv}
+% \index{bbrbox}
+% \index{\textbackslash bbrinput}
+% \index{\textbackslash bbroutput}
+%
+% The cryptocode package comes with support for drawing basic black box reductions. A reduction
+% always takes the following form.
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Box Name]
+ % The Box's content
+ \end{bbrbox}
+ % Commands to display communication, input output etc
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% That is, a |bbrenv| environment (where bbr is short for black-box reduction) which takes a single
+% |bbrbox| environment plus some additional commands.
+%
+% \medskip
+% Following is a simple example with a single (black)box and some code plus inputs outputs:
+%
+% \begin{bbrenv}[aboveskip=0.75cm,belowskip=0.75cm]{A}
+% \begin{bbrbox}[name=Box Name]
+% \pseudocode{
+% \text{step 1} \\
+% \text{step 2} \\
+% \pcfor \text{some condition} \pcdo \\
+% \t\text{step 3}
+% }
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+% \end{bbrenv}
+%
+% \noindent This box is generated as
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}[aboveskip=1cm,belowskip=1cm]{A}
+ \begin{bbrbox}[name=Box Name]
+ \pseudocode{
+ \text{step 1} \\
+ \text{step 2} \\
+ \pcfor \text{some condition} \pcdo \\
+ \t\text{step 3}
+ }
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% The commands |bbrinput| and |bbroutput| allow to specify input and output for the latest
+% |bbrenv| environment. The optional parameter for the |bbrenv| environment allows to specify leading and trailing space (this
+% may become necessary when using inputs and outputs). For this provide |aboveskip| and |belowskip| keys.
+% (Note that in an earlier version of cryptocode you could write |\begin{bbrenv}[1cm]{A}[1cm]|. While this format
+% is still supported it should be regarded deprecated.)
+% The single mandatory argument to the bbrenv environment needs to specify a unique identifier
+% (unique for the current reduction). This id is used as an internal TIKZ node name (\url{https://www.ctan.org/pkg/pgf}).
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\begin{bbrenv}[options]{UNIQUE IDENTIFIER}
+% deprecated version
+\begin{bbrenv}[vspace before]{UNIQUE IDENTIFIER}[vspace after]
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% As we are drawing a TIKZ image, note that we can easily later customize the image using the labels that we
+% have specified on the way.
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=1cm]{A}
+% \begin{bbrbox}[name=Box Name]
+% \pseudocode{
+% \text{step 1} \\
+% \text{step 2} \\
+% \pcfor \text{some condition} \pcdo \\
+% \pcind\text{step 3}
+% }
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+%
+% \filldraw[fill=blue] (A.north) circle (4pt);
+% \filldraw[fill=blue] (A.west) circle (4pt);
+% \filldraw[fill=blue] (A.east) circle (4pt);
+% \filldraw[fill=blue] (A.south) circle (4pt);
+% \end{bbrenv}
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Box Name]
+ \pseudocode{
+ \text{step 1} \\
+ \text{step 2} \\
+ \pcfor \text{some condition} \pcdo \\
+ \pcind\text{step 3}
+ }
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+
+ \filldraw[fill=blue] (A.north) circle (4pt);
+ \filldraw[fill=blue] (A.west) circle (4pt);
+ \filldraw[fill=blue] (A.east) circle (4pt);
+ \filldraw[fill=blue] (A.south) circle (4pt);
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% The |bbrbox| takes as single argument a comma separated list of key value pairs. In the example we used
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ name=Box Name
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% to specify the label. The following options are available
+%
+% \index{namepos}
+% \index{namestyle}
+% \index{abovesep}
+% \index{minheight}
+% \index{xshift}
+% \index{yshift}
+% \begin{center}
+% \begin{tabular}{ll}
+% \textbf{Option} & \textbf{Description} \\ \hline
+% name & Specifies the box's label \\
+% namepos & Specifies the position (left, center, right, top left, top center, top right, middle) \\
+% namestyle & Specifies the style of the name \\
+% abovesep & Space above box (defaults to |\baselineskip|) \\
+% minheight & The minimal height \\
+% addheight & Additional height at the end of the box \\
+% xshift & Allows horizontal positioning \\
+% yshift & Allows horizontal positioning \\
+% style & allows to customize the node
+% \end{tabular}
+% \end{center}
+%
+% \subsection{Nesting of Boxes}
+% Boxes can be nested. For this simply insert a |bbrenv| (together with a single bbrbox) environment into an
+% existing bbrbox.
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=0.5cm]{A}
+% \begin{bbrbox}[name=Box Name]
+% \pseudocode{
+% \text{step 1} \\
+% \text{step 2} \\
+% \pcfor \text{some condition} \pcdo \\
+% \pcind\text{step 3}
+% }
+%
+% \begin{bbrenv}{B}
+% \begin{bbrbox}[name=Inner Box]
+% \pseudocode{
+% \text{inner step 1} \\
+% \text{inner step 2}
+% }
+% \end{bbrbox}
+% \end{bbrenv}
+%
+% \pseudocode{
+% \text{step 4} \\
+% \text{step 5}
+% }
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+% \end{bbrenv}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Box Name]
+ \pseudocode{
+ \text{step 1} \\
+ \text{step 2} \\
+ \pcfor \text{some condition} \pcdo \\
+ \pcind\text{step 3}
+ }
+
+ \begin{bbrenv}{B}
+ \begin{bbrbox}[name=Inner Box]
+ \pseudocode{
+ \text{inner step 1} \\
+ \text{inner step 2}
+ }
+ \end{bbrbox}
+ \end{bbrenv}
+
+ \pseudocode{
+ \text{step 4} \\
+ \text{step 5}
+ }
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Messages and Queries}
+% \index{\textbackslash bbrmsgto}
+% \index{\textbackslash bbrmsgfrom}
+% \index{\textbackslash bbrmsgtofrom}
+% \index{\textbackslash bbrmsgfromto}
+% \index{\textbackslash bbrqryto}
+% \index{\textbackslash bbrqryfrom}
+% \index{\textbackslash bbrqrytofrom}
+% \index{\textbackslash bbrqryfromto}
+%
+% You can send messages and queries to boxes. For this use the commands
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \bbrmsgto{options}
+ \bbrmsgfrom{options}
+ \bbrmsgtofrom{options}{options}
+ \bbrmsgfromto{options}{options}
+ \bbrqryto{options}
+ \bbrqryfrom{options}
+ \bbrqrytofrom{options}{options}
+ \bbrqryfromto{options}{options}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% By convention messages are on the left of boxes and queries on the right. Commands ending on |to|
+% make an arrow to the right while commands ending on |from| make an arrow to the left. The |options|
+% define how the message is drawn and consists of a key-value list. The |tofrom| and |fromto| variants
+% draw two messages (back and forth) that are more compactly set together. Here usually, the fist message
+% should be drawn on top (|top=Label|) while the second message should be drawn on the bottom (|bottom=Label|).
+%
+% \medskip
+% For example, to draw a message with a label on top and on the side use
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \bbrmsgto{top=Top Label, side=Side Label}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% If your label contains a \enquote{,} (comma), then group the label in $\{\}$ (curly brackets).
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \bbrmsgto{top=Top Label, side={Side, Label}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% Following is a complete example. Notice that cryptocode takes care of the vertical positioning.
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=0.5cm]{A}
+% \begin{bbrbox}[name=Box Name]
+% \pseudocode{
+% \text{step 1} \\
+% \text{step 2} \\
+% \pcfor \text{some condition} \pcdo \\
+% \pcind\text{step 3}
+% }
+%
+% \begin{bbrenv}{B}
+% \begin{bbrbox}[name=Inner Box]
+% \pseudocode{
+% \text{inner step 1} \\
+% \text{inner step 2}
+% }
+% \end{bbrbox}
+%
+% \bbrmsgto{top={$m_0,m_1$}}
+% \bbrmsgfrom{top=$q$}
+%
+% \bbrqrytofrom{top={$m_0,m_1$}}{bottom=$q$}
+%
+% \end{bbrenv}
+%
+% \pseudocode{
+% \text{step 4} \\
+% \text{step 5}
+% }
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+% \end{bbrenv}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Box Name]
+ \pseudocode{
+ \text{step 1} \\
+ \text{step 2} \\
+ \pcfor \text{some condition} \pcdo \\
+ \pcind\text{step 3}
+ }
+
+ \begin{bbrenv}{B}
+ \begin{bbrbox}[name=Inner Box]
+ \pseudocode{
+ \text{inner step 1} \\
+ \text{inner step 2}
+ }
+ \end{bbrbox}
+
+ \bbrmsgto{top={$m_0,m_1$}}
+ \bbrmsgfrom{top=$q$}
+
+ \bbrqrytofrom{top={$m_0,m_1$}}{bottom=$q$}
+
+ \end{bbrenv}
+
+ \pseudocode{
+ \text{step 4} \\
+ \text{step 5}
+ }
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection{Options}
+% Following is a list of all available options. Remember that underneath the reduction
+% commands is a TIKZ image (\url{https://www.ctan.org/pkg/pgf/}) and for each label
+% position (top, side, bottom) a node is generated which can be further customized
+% via low-level TIKZ.
+%
+% \begin{description}
+% \item[top] Label on top
+% \item[bottom] Label on the bottom
+% \item[side] Label on the far side of the box. For challengers and oracles, on the side of the box.
+% \item[oside] Label on the \enquote{other} side.
+% \item[topstyle] Style for label on top
+% \item[bottomstyle] Style for label on bottom
+% \item[sidestyle] Style for label on side
+% \item[osidestyle] Style for label on other side
+% \item[edgestyle] Style for edge
+% \item[length] Length of arrow
+% \item[topname] Name for node on top
+% \item[bottomname] Name for node on bottom
+% \item[sidename] Name for node on side
+% \item[osidename] Name for node on other side
+% \item[aboveskip] Space before message
+% \item[belowskip] Space after message
+% \item[fixedoffset] Ignores automatic spacing and sets the message at the provided offset from the top.
+% \item[fixedboffset] Ignores automatic spacing and sets the message at the provided offset from the bottom.
+% \item[islast] Places the message at the bottom.
+% \end{description}
+%
+%
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=0.5cm]{A}
+% \begin{bbrbox}[name=Box Name]
+% \pseudocode{
+% \text{step 1} \\
+% \text{step 2} \\
+% \pcfor \text{some condition} \pcdo \\
+% \pcind\text{step 3}
+% }
+%
+% \begin{bbrenv}{B}
+% \begin{bbrbox}[name=Inner Box]
+% \pseudocode{
+% \text{inner step 1} \\
+% \text{inner step 2} \\
+% }
+% \end{bbrbox}
+%
+% \bbrmsgto{top={$m_0,m_1$},side=Side Label, bottom=$b$, length=2cm,
+% topstyle={draw, solid}, sidestyle={red}, bottomstyle={draw, dashed}}
+%
+% \end{bbrenv}
+%
+% \pseudocode{
+% \text{step 4} \\
+% \text{step 5} \\
+% }
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+% \end{bbrenv}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Box Name]
+ \pseudocode{
+ \text{step 1} \\
+ \text{step 2} \\
+ \pcfor \text{some condition} \pcdo \\
+ \pcind\text{step 3}
+ }
+
+ \begin{bbrenv}{B}
+ \begin{bbrbox}[name=Inner Box]
+ \pseudocode{
+ \text{inner step 1} \\
+ \text{inner step 2} \\
+ }
+ \end{bbrbox}
+
+ \bbrmsgto{top={$m_0,m_1$},side=Side Label, bottom=$b$, length=2cm,
+ topstyle={draw, solid}, sidestyle={red}, bottomstyle={draw, dashed}}
+
+ \end{bbrenv}
+
+ \pseudocode{
+ \text{step 4} \\
+ \text{step 5} \\
+ }
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+%
+% \subsubsection{First Message}
+% \index{\textbackslash bbrfirstmessageoffset}
+% The first message is offset by |\bbrfirstmessageoffset| which defaults to 1ex.
+%
+% \subsubsection{Add Space}
+% \index{\textbackslash bbrmsgspace}
+% \index{\textbackslash bbrqryspace}
+% If the spacing between messages is not sufficient you can use the |bbrmsgspace| and
+% |bbrqryspace| commands to add additional space.
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=0.5cm]{A}
+% \begin{bbrbox}[name=Reduction]
+% \pseudocode{
+% \text{Do something}
+% }
+%
+% \begin{bbrenv}{B}
+%
+% \begin{bbrbox}[name=Adversary,minheight=15ex,xshift=4cm]
+%
+% \end{bbrbox}
+%
+% \bbrmsgto{top=$m$}
+% \bbrmsgspace{1.5cm}
+% \bbrmsgfrom{top=$\sigma$}
+%
+% \bbrqryto{top=$m$}
+% \bbrqryspace{1cm}
+% \bbrqryfrom{top=$\sigma$}
+%
+% \end{bbrenv}
+%
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+% \end{bbrenv}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Reduction]
+ \pseudocode{
+ \text{Do something}
+ }
+
+ \begin{bbrenv}{B}
+
+ \begin{bbrbox}[name=Adversary,minheight=15ex,xshift=4cm]
+
+ \end{bbrbox}
+
+ \bbrmsgto{top=$m$}
+ \bbrmsgspace{1.5cm}
+ \bbrmsgfrom{top=$\sigma$}
+
+ \bbrqryto{top=$m$}
+ \bbrqryspace{1cm}
+ \bbrqryfrom{top=$\sigma$}
+
+ \end{bbrenv}
+
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% Note that for placing a message at the bottom, |islast| or fixed offsets often allow
+% obtain more accurate results.
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=0.5cm]{A}
+% \begin{bbrbox}[name=Reduction]
+% \pseudocode{
+% \text{Do something}
+% }
+%
+% \begin{bbrenv}{B}
+%
+% \begin{bbrbox}[name=Adversary,minheight=15ex,xshift=4cm]
+%
+% \end{bbrbox}
+%
+% \bbrmsgto{top=$m$}
+% \bbrmsgfrom{top=$\sigma$,islast}
+%
+% \bbrqryto{top=$m$,fixedoffset=4ex}
+% \bbrqryfrom{top=$\sigma$,fixedboffset=4ex}
+%
+% \end{bbrenv}
+%
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+% \end{bbrenv}
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Reduction]
+ \pseudocode{
+ \text{Do something}
+ }
+
+ \begin{bbrenv}{B}
+
+ \begin{bbrbox}[name=Adversary,minheight=15ex,xshift=4cm]
+
+ \end{bbrbox}
+
+ \bbrmsgto{top=$m$}
+ \bbrmsgfrom{top=$\sigma$,islast}
+
+ \bbrqryto{top=$m$,fixedoffset=4ex}
+ \bbrqryfrom{top=$\sigma$,fixedboffset=4ex}
+
+ \end{bbrenv}
+
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsubsection{Loops}
+% \index{\textbackslash bbrloop}
+% Often an adversary may send poly many queries to an oracle, or a reduction sends many queries to an adversary.
+% Consider the following setting
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=0.5cm]{A}
+% \begin{bbrbox}[name=Reduction]
+% \pseudocode{
+% \text{Do something}
+% }
+%
+% \begin{bbrenv}{B}
+%
+% \begin{bbrbox}[name=Adversary,minheight=10ex,xshift=4cm]
+%
+% \end{bbrbox}
+%
+% \bbrmsgto{top=$m$,sidename=BeginLoop}
+% \bbrmsgfrom{top=$\sigma$,sidename=EndLoop}
+%
+% \end{bbrenv}
+%
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+% \end{bbrenv}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Reduction]
+ \pseudocode{
+ \text{Do something}
+ }
+
+ \begin{bbrenv}{B}
+
+ \begin{bbrbox}[name=Adversary,minheight=10ex,xshift=4cm]
+
+ \end{bbrbox}
+
+ \bbrmsgto{top=$m$}
+ \bbrmsgfrom{top=$\sigma$}
+
+ \end{bbrenv}
+
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% First note that by specifying the minheight and xshift option we shifted the adversary box a bit to the right
+% and enlarged its box. Further we specified custom names for the node on the side of the two messages. We
+% can now use the |bbrloop| command to visualize that these two messages are exchanged $q$ many times
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \bbrloop{BeginLoop}{EndLoop}{center=$q$}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% The |bbrloop| command takes two node names and a config which allows you to specify if the label is
+% to be shown on the left, center or right. Here is the result.
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=0.5cm]{A}
+% \begin{bbrbox}[name=Reduction]
+% \pseudocode{
+% \text{Do something}
+% }
+%
+% \begin{bbrenv}{B}
+%
+% \begin{bbrbox}[name=Adversary,minheight=10ex,xshift=4cm]
+%
+% \end{bbrbox}
+%
+% \bbrmsgto{top=$m$,sidename=BeginLoop}
+% \bbrmsgspace{0.5cm}
+% \bbrmsgfrom{top=$\sigma$,sidename=EndLoop}
+% \bbrloop{BeginLoop}{EndLoop}{center=$q$}
+%
+% \end{bbrenv}
+%
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+% \end{bbrenv}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Reduction]
+ \pseudocode{
+ \text{Do something}
+ }
+
+ \begin{bbrenv}{B}
+
+ \begin{bbrbox}[name=Adversary,minheight=10ex,xshift=4cm]
+
+ \end{bbrbox}
+
+ \bbrmsgto{top=$m$,sidename=BeginLoop}
+ \bbrmsgspace{0.5cm}
+ \bbrmsgfrom{top=$\sigma$,sidename=EndLoop}
+ \bbrloop{BeginLoop}{EndLoop}{center=$q$}
+
+ \end{bbrenv}
+
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% The |\bbrloop| command supports the following parameters:
+% \begin{description}
+% \item[center]
+% Label displayed within the loop
+% \item[left]
+% Label displayed left of the loop
+% \item[right]
+% Label displayed right of the loop
+% \item[centerstyle]
+% Style for center label
+% \item[leftstyle]
+% Style for left label
+% \item[rightstyle]
+% Style for right label
+% \item[clockwise]
+% Loop going in clockwise direction
+% \item[angle]
+% Angle of the arrows
+% \end{description}
+%
+% \subsubsection{Intertext}
+% \index{\textbackslash bbrmsgtxt}
+% \index{\textbackslash bbrqrytxt}
+%
+% If your reduction needs to do some extra work between queries use the |\bbrmsgtxt|
+% and |\bbrqrytxt| commands.
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \bbrmsgtxt[options]{Text}
+ \bbrqrytxt[options]{Text}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=0.5cm]{A}
+% \begin{bbrbox}[name=Reduction]
+% \pseudocode{
+% \text{Do something}
+% }
+%
+% \begin{bbrenv}{B}
+%
+% \begin{bbrbox}[name=Adversary,minheight=12ex,xshift=4cm]
+%
+% \end{bbrbox}
+%
+% \bbrmsgto{top=$m$}
+% \bbrmsgtxt{\pseudocode{
+% do \\
+% some \\
+% work
+% }}
+% \bbrmsgfrom{top=$\sigma$}
+%
+% \bbrqryto{top=$m$}
+% \bbrqrytxt[nodestyle={draw,dashed},xshift=2cm]{\pseudocode{
+% do \\
+% some \\
+% work
+% }}
+% \bbrqryfrom{top=$\sigma$}
+%
+% \end{bbrenv}
+%
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+% \end{bbrenv}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Reduction]
+ \pseudocode{
+ \text{Do something}
+ }
+
+ \begin{bbrenv}{B}
+
+ \begin{bbrbox}[name=Adversary,minheight=12ex,xshift=4cm]
+
+ \end{bbrbox}
+
+ \bbrmsgto{top=$m$}
+ \bbrmsgtxt{\pseudocode{
+ do \\
+ some \\
+ work
+ }}
+ \bbrmsgfrom{top=$\sigma$}
+
+ \bbrqryto{top=$m$}
+ \bbrqrytxt[nodestyle={draw,dashed},xshift=2cm]{\pseudocode{
+ do \\
+ some \\
+ work
+ }}
+ \bbrqryfrom{top=$\sigma$}
+
+ \end{bbrenv}
+
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Oracles}
+% \index{bbroracle}
+% \index{hdistance}
+% \index{vdistance}
+% Each box can have one or more oracles which are drawn on the right hand side of the box. An oracle
+% is created similarly to a |bbrenv| environment using the |bbroracle| environment. Oracles
+% go behind the single |bbrbox| environment within an |bbrenv| enviornment.
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=0.5cm]{A}
+% \begin{bbrbox}[name=Reduction]
+% \pseudocode{
+% \text{Do something}
+% }
+%
+% \begin{bbrenv}{B}
+% \begin{bbrbox}[name=Adversary,minheight=3cm,xshift=4cm]
+% \end{bbrbox}
+%
+% \end{bbrenv}
+%
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+%
+% \begin{bbroracle}{OraA}
+% \begin{bbrbox}[name=Oracle 1]
+% \end{bbrbox}
+% \end{bbroracle}
+%
+% \begin{bbroracle}{OraB}[vdistance=2cm,hdistance=3cm]
+% \begin{bbrbox}[name=Oracle 2]
+% \end{bbrbox}
+% \end{bbroracle}
+% \end{bbrenv}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Reduction]
+ \pseudocode{
+ \text{Do something}
+ }
+
+ \begin{bbrenv}{B}
+ \begin{bbrbox}[name=Adversary,minheight=3cm,xshift=4cm]
+ \end{bbrbox}
+
+ \end{bbrenv}
+
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+
+ \begin{bbroracle}{OraA}
+ \begin{bbrbox}[name=Oracle 1]
+ \end{bbrbox}
+ \end{bbroracle}
+
+ \begin{bbroracle}{OraB}[vdistance=2cm,hdistance=3cm]
+ \begin{bbrbox}[name=Oracle 2]
+ \end{bbrbox}
+ \end{bbroracle}
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Via the option \enquote{hdistance=length} and \enquote{vdistance=length} you can control the horizontal and vertical position of the oracle. By default this value is set to 1.5cm and |\baselineskip|.
+%
+% \subsubsection{Communicating with Oracles}
+% \index{\textbackslash bbroracleqryfrom}
+% \index{\textbackslash bbroracleqryto}
+% \index{\textbackslash bbroracleqrytofrom}
+% \index{\textbackslash bbroracleqryfromto}
+% As oracles use the \emph{bbrbox} environment we can directly use the established ways to send messages and
+% queries to oracles. In addition you can use the |\bbroracleqryfrom| and |\bbroracleqryto|.
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \bbroracleqryfrom{options}
+ \bbroracleqryto{options}
+ \bbroracleqrytofrom{options}{options}
+ \bbroracleqryfromto{options}{options}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Here options allow you to specify where the label goes (top, bottom). In addition you can use
+% |\bbroracleqryspace| to generate extra space between oracle messages. Note
+% that oracle messages need to be added after the closing |\end{bbroracle}| command.
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=0.5cm]{A}
+% \begin{bbrbox}[name=Reduction]
+% \pseudocode{
+% \text{Do something}
+% }
+%
+% \begin{bbrenv}{B}
+% \begin{bbrbox}[name=Adversary,minheight=3cm,xshift=3cm]
+% \end{bbrbox}
+%
+% \end{bbrenv}
+%
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+%
+% \begin{bbroracle}{OraA}
+% \begin{bbrbox}[name=Oracle 1,minheight=1cm]
+% \end{bbrbox}
+% \end{bbroracle}
+% \bbroracleqryto{top=$m$}
+% \bbroracleqryfrom{top=$b$}
+%
+% \begin{bbroracle}{OraB}
+% \begin{bbrbox}[name=Oracle 2,minheight=1cm]
+% \end{bbrbox}
+% \end{bbroracle}
+% \bbroracleqrytofrom{top=$m$}{bottom=$b$}
+% \end{bbrenv}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Reduction]
+ \pseudocode{
+ \text{Do something}
+ }
+
+ \begin{bbrenv}{B}
+ \begin{bbrbox}[name=Adversary,minheight=3cm,xshift=3cm]
+ \end{bbrbox}
+
+ \end{bbrenv}
+
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+
+ \begin{bbroracle}{OraA}
+ \begin{bbrbox}[name=Oracle 1,minheight=1cm]
+ \end{bbrbox}
+ \end{bbroracle}
+ \bbroracleqrytotop=$m$}
+ \bbroracleqryfrom{top=$b$}
+
+ \begin{bbroracle}{OraB}
+ \begin{bbrbox}[name=Oracle 2,minheight=1cm]
+ \end{bbrbox}
+ \end{bbroracle}
+ \bbroracleqrytofrom{top=$m$}{bottom=$b$}
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Challengers}
+% \index{bbrchallenger}
+% \index{hdistance}
+% \index{vdistance}
+% Each box can have one or more challengers which are drawn on the left hand side of the box. Challengers
+% behave identically to oracles with the exception that they are to the left of the box. A challenger
+% is created similarly to a \emph{bbrenv} environment using the \emph{bbrchallenger} environment. Challengers
+% go behind the single \emph{bbrbox} environment within an \emph{bbrenv} enviornment.
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=0.5cm]{A}
+% \begin{bbrbox}[name=Adversary,minheight=2cm]
+% \pseudocode{
+% \text{Do something}
+% }
+%
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+%
+% \begin{bbrchallenger}{ChaA}
+% \begin{bbrbox}[name=Challenger,minheight=2cm]
+%
+% \end{bbrbox}
+% \end{bbrchallenger}
+% \end{bbrenv}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Adversary,minheight=2cm]
+ \pseudocode{
+ \text{Do something}
+ }
+
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+
+ \begin{bbrchallenger}{ChaA}
+ \begin{bbrbox}[name=Challenger,minheight=2cm]
+
+ \end{bbrbox}
+ \end{bbrchallenger}
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Via the option \enquote{hdistance=length} and \enquote{vdistance=length} you can control the horizontal and vertical position of the challenger. By default this value is set to 1.5cm and |\baselineskip|.
+%
+% \subsubsection{Communicating with Challengers}
+% \index{\textbackslash bbrchallengerqryfrom}
+% \index{\textbackslash bbrchallengerqryto}
+% \index{\textbackslash bbrchallengerqrytofrom}
+% \index{\textbackslash bbrchallengerqryfromto}
+% As challengers use the \emph{bbrbox} environment we can directly use the established ways to send messages and
+% queries to oracles. In addition you can use the |\bbrchallengerqryfrom| and |\bbrchallengerqryto|.
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \bbrchallengerqryfrom{options}
+ \bbrchallengerqryto{options}
+ \bbrchallengerqrytofrom{options}{options}
+ \bbrchallengerqryfromto{options}{options}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% Here options allow you to specify where the label goes (top, bottom). In addition you can use
+% |\bbrchallengerqryspace| to generate extra space between oracle messages. Note
+% that challenger messages need to be added after the closing |\end{bbrchallenger}| command.
+%
+% \begin{bbrenv}[aboveskip=1cm,belowskip=0.5cm]{A}
+% \begin{bbrbox}[name=Adversary,minheight=2cm]
+% \pseudocode{
+% \text{Do something}
+% }
+%
+% \end{bbrbox}
+% \bbrinput{input}
+% \bbroutput{output}
+%
+% \begin{bbrchallenger}{ChaA}
+% \begin{bbrbox}[name=Challenger,minheight=2cm]
+%
+% \end{bbrbox}
+% \end{bbrchallenger}
+%
+% \bbrchallengerqrytofrom{top=$m$}{bottom=$b$}
+% \end{bbrenv}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \begin{bbrenv}{A}
+ \begin{bbrbox}[name=Adversary,minheight=2cm]
+ \pseudocode{
+ \text{Do something}
+ }
+
+ \end{bbrbox}
+ \bbrinput{input}
+ \bbroutput{output}
+
+ \begin{bbrchallenger}{ChaA}
+ \begin{bbrbox}[name=Challenger,minheight=2cm]
+
+ \end{bbrbox}
+ \end{bbrchallenger}
+
+ \bbrchallengerqryfromto{top=$m$}{bottom=$b$}
+ \end{bbrenv}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{Examples}
+% A reduction sketch for full domain hash.
+%
+%\begin{bbrenv}{Red}
+%
+% \begin{bbrbox}[name=\textsc{Reduction }$\bdv$]
+%
+% \pseudocode{
+% j \sample [q]
+% }
+%
+% \vspace{2ex}
+% \emph{/* begin simulation */}
+%
+% \begin{bbrenv}[aboveskip=2em]{Adv}
+% \begin{bbrbox}[name=$\adv$,minheight=8.5cm,style={fill=black},namestyle={color=white},xshift=3cm]
+% \end{bbrbox}
+%
+% \bbrinput{$\fk$}
+% \bbroutput{$\sigma$}
+%
+% \bbrmsgfrom{top=$m_1$,afterskip=-0.5\baselineskip}
+% \bbrmsgto{bottom=$\$$,afterskip=0.5\baselineskip}
+%
+% \bbrmsgvdots
+%
+% \bbrmsgfrom{top=$m_{j-1}$,beforeskip=0.5\baselineskip,afterskip=-0.5\baselineskip}
+% \bbrmsgto{bottom=$\$$,afterskip=1.5\baselineskip}
+%
+% \bbrmsgfrom{top=$m_j$,afterskip=-0.5\baselineskip}
+% \bbrmsgto{bottom=$y$,afterskip=1.5\baselineskip}
+%
+% \bbrmsgfrom{top=$m_{j+1}$,afterskip=-0.5\baselineskip}
+% \bbrmsgto{bottom=$\$$,afterskip=0.5\baselineskip}
+%
+% \bbrmsgvdots
+%
+% \bbrmsgfrom{top=$m_q$,beforeskip=0.5\baselineskip,afterskip=-0.5\baselineskip}
+% \bbrmsgto{bottom=$\$$}
+%
+% \begin{bbroracle}{Sign}
+% \begin{bbrbox}[name=Sign,namepos=center,style={draw},minheight=1cm]
+% \end{bbrbox}
+% \end{bbroracle}
+%
+% \bbroracleqryto{top=$m$}
+% \bbroracleqryfrom{top=$\sigma$}
+%
+% \end{bbrenv}
+%
+% \pcdraw{
+% \node[left=2cm of Adv.north west] (startsim) {};
+% \node[left=2cm of Adv.south west] (endsim) {};
+% \draw[->,thick] (startsim) -- (endsim);
+% \node[rotate=90, left=2.75cm of Adv.west,anchor=center] () {\textsc{Simulation of Random Oracle}};
+% }
+%
+% \emph{/* end simulation */}
+%
+% \pseudocode{
+% y \gets \sigma
+% }
+%
+% \end{bbrbox}
+% \bbrqryfrom{beforeskip=0.25cm,top={$(\fk, y)$},side={\dbox{\pseudocode{
+% \fk \sample \fash.\kgen(\secparam) \\ x \sample \bin^{\fash.\il(\secpar)} \\ y \gets \fash.\eval(\fk, x)}
+% }}}
+% \bbrqryto{beforeskip=11.75cm,side=\pseudocode{y \in \fash^{-1}(\fk, x)}}
+% \end{bbrenv}
+%
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+\begin{bbrenv}{Red}
+
+ \begin{bbrbox}[name=\textsc{Reduction }$\bdv$]
+
+ \pseudocode{
+ j \sample [q]
+ }
+
+ \vspace{2ex}
+ \emph{/* begin simulation */}
+
+ \begin{bbrenv}[aboveskip=2em]{Adv}
+ \begin{bbrbox}[name=$\adv$,minheight=8.5cm,style={fill=black},namestyle={color=white},xshift=3cm]
+ \end{bbrbox}
+
+ \bbrinput{$\fk$}
+ \bbroutput{$\sigma$}
+
+ \bbrmsgfrom{top=$m_1$,afterskip=-0.5\baselineskip}
+ \bbrmsgto{bottom=$\$$,afterskip=0.5\baselineskip}
+
+ \bbrmsgvdots
+
+ \bbrmsgfrom{top=$m_{j-1}$,beforeskip=0.5\baselineskip,afterskip=-0.5\baselineskip}
+ \bbrmsgto{bottom=$\$$,afterskip=1.5\baselineskip}
+
+ \bbrmsgfrom{top=$m_j$,afterskip=-0.5\baselineskip}
+ \bbrmsgto{bottom=$y$,afterskip=1.5\baselineskip}
+
+ \bbrmsgfrom{top=$m_{j+1}$,afterskip=-0.5\baselineskip}
+ \bbrmsgto{bottom=$\$$,afterskip=0.5\baselineskip}
+
+ \bbrmsgvdots
+
+ \bbrmsgfrom{top=$m_q$,beforeskip=0.5\baselineskip,afterskip=-0.5\baselineskip}
+ \bbrmsgto{bottom=$\$$}
+
+ \begin{bbroracle}{Sign}
+ \begin{bbrbox}[name=Sign,namepos=center,style={draw},minheight=1cm]
+ \end{bbrbox}
+ \end{bbroracle}
+
+ \bbroracleqryto{top=$m$}
+ \bbroracleqryfrom{top=$\sigma$}
+
+ \end{bbrenv}
+
+ \pcdraw{
+ \node[left=2cm of Adv.north west] (startsim) {};
+ \node[left=2cm of Adv.south west] (endsim) {};
+ \draw[->,thick] (startsim) -- (endsim);
+ \node[rotate=90, left=2.75cm of Adv.west,anchor=center] () {\textsc{Simulation of Random Oracle}};
+ }
+
+ \emph{/* end simulation */}
+
+ \pseudocode{
+ y \gets \sigma
+ }
+
+ \end{bbrbox}
+ \bbrqryfrom{beforeskip=0.25cm,top={$(\fk, y)$},side={\dbox{\pseudocode{
+ \fk \sample \fash.\kgen(\secparam) \\ x \sample \bin^{\fash.\il(\secpar)} \\ y \gets \fash.\eval(\fk, x)}
+ }}}
+ \bbrqryto{beforeskip=11.75cm,side=\pseudocode{y \in \fash^{-1}(\fk, x)}}
+\end{bbrenv}
+
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \amipagebreak
+% \section{Known Issues}
+%
+% \subsection{Pseudocode KeepSpacing within Commands}
+% \label{sec:keepindent-problem}
+% \index{\textbackslash fbox}
+% \index{framebox}
+% The (experimental) \enquote{space=keep} option of pseudocode which should output spacing identical to that of the input
+% will fail, if the pseudocode command is called from within another command. An example is to
+% wrap the |\pseudocode| command in an |\fbox| or in a stacking environment such as |\pchstack|.
+% As a workaround for generating frame boxes you should hence
+% use a package such as \emph{mdframed} (\url{https://www.ctan.org/pkg/mdframed}) which provides a frame environment.
+%
+% \begin{mdframed}
+% \pseudocode[space=keep,mode=text]{ Pseudocode with - spaces -}
+% \end{mdframed}
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \pseudocode[space=keep,mode=text]{ Pseudocode with - spaces -}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% As an alternative you could use a \emph{savebox} (in combination with the |lrbox| environment):
+%
+% \newsavebox{\mypcbox}
+% \begin{lrbox}{\mypcbox}%
+% \pseudocode[space=keep,mode=text]{ Pseudocode with - spaces -}%
+% \end{lrbox}
+% \fbox{\usebox{\mypcbox}}
+%
+% \iffalse
+%<*example>
+% \fi
+ \begin{lstlisting}
+ \newsavebox{\mypcbox}
+ \begin{lrbox}{\mypcbox}%
+ \pseudocode[space=keep,mode=text]{ Pseudocode with - spaces -}%
+ \end{lrbox}
+ \fbox{\usebox{\mypcbox}}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \subsection{AMSFonts}
+% \index{amsfonts}
+% \index{noamsfonts|see {package options}}
+% \index{package options!noamsfonts}
+% Some packages are not happy with the \enquote{amsfonts} package. Cryptocode will attempt to load amsfonts if it is loaded
+% with either the \enquote{sets} or the \enquote{probability} option. In order to not load amsfonts you can additionally add the
+% \enquote{noamsfonts} at the very end. Note that in this case you should ensure that the command |\mathbb| is defined
+% as this is used by most of the commands in \enquote{sets} and some of the commands in \enquote{probability}.
+%
+% \subsection{Hyperref}
+% The hyperref package (\url{https://www.ctan.org/pkg/hyperref}) should be loaded before cryptocode. If this is not possible
+% call the |\pcfixhyperref| after |\begin{document}|.
+%
+%
+%\StopEventually{%
+% \PrintChanges
+% \PrintIndex
+%}
+%
+%
+% \amipagebreak
+%\section{Implementation}
+%
+% Following is the implementation of cryptocode. The source code documentation is
+% a work in progress.
+%
+% \begin{macrocode}
+%<*cryptocode.sty>
+% \end{macrocode}
+%
+% Note that most macros are prefixed with \emph{pc}
+% short for pseudocode. This is a general design choice to not conflict
+% with macros defined by other packages. One exception are the macros
+% defined via the various package options.
+%
+%
+% Load amsmath and mathtools early on, before defining various macros.
+% \begin{macrocode}
+\RequirePackage{amsmath}
+\RequirePackage{mathtools}
+% \end{macrocode}
+%
+%
+% \subsection{Package Options}
+%
+%\begin{macro}{\@pc@opt@amsfonts}
+% Definitions of boolean flags used to determin whether or not to load amsfonts.
+% \begin{macrocode}
+\newif\if@pc@opt@amsfonts
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\@pc@opt@advantage}
+% Whether or not to define commands for the given option.
+% \begin{macrocode}
+\newif\if@pc@opt@advantage
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\@pc@opt@centernot}
+% Whether or not to load centernot
+% \begin{macrocode}
+\newif\if@pc@opt@centernot
+% \end{macrocode}
+%\end{macro}
+%
+%
+% \subsubsection{operators}
+%
+%\begin{macro}{\sample}
+%\begin{macro}{\floor}
+%\begin{macro}{\tfloor}
+%\begin{macro}{\ceil}
+%\begin{macro}{\tceil}
+%\begin{macro}{\Angle}
+%\begin{macro}{\tAngle}
+%\begin{macro}{\abs}
+%\begin{macro}{\tabs}
+%\begin{macro}{\norm}
+%\begin{macro}{\tnorm}
+%\begin{macro}{\concat}
+%\begin{macro}{\emptystring}
+%\begin{macro}{\argmax}
+%\begin{macro}{\argmin}
+%\begin{macro}{\pindist}
+%\begin{macro}{\cindist}
+%\begin{macro}{\sindist}
+% Definitions of macros for the \emph{operators} pacakge option.
+%
+% \begin{macrocode}
+\DeclareOption{operators}{
+\providecommand{\sample}{\hskip2.3pt{\gets\!\!\mbox{\scriptsize${\$}$\normalsize}}\,}
+
+\DeclarePairedDelimiter\pc@floor{\lfloor}{\rfloor}
+\providecommand{\floor}[1]{\pc@floor*{#1}}
+\providecommand{\tfloor}[1]{\pc@floor{#1}}
+
+\DeclarePairedDelimiter\pc@ceil{\lceil}{\rceil}
+\providecommand{\ceil}[1]{\pc@ceil*{#1}}
+\providecommand{\tceil}[1]{\pc@ceil{#1}}
+
+\DeclarePairedDelimiter\pc@Angle{\langle}{\rangle}
+\providecommand{\Angle}[1]{\pc@Angle*{#1}}
+\providecommand{\tAngle}[1]{\pc@Angle{#1}}
+
+\DeclarePairedDelimiter\pc@abs{\lvert}{\rvert}
+\providecommand{\abs}[1]{\pc@abs*{#1}}
+\providecommand{\tabs}[1]{\pc@abs{#1}}
+
+\DeclarePairedDelimiter\pc@norm{\lVert}{\rVert}
+\providecommand{\norm}[1]{\pc@norm*{#1}}
+\providecommand{\tnorm}[1]{\pc@tnorm{#1}}
+
+\providecommand{\concat}{\ensuremath{\|}}
+\providecommand{\emptystring}{\ensuremath{\varepsilon}}
+
+\DeclareMathOperator*{\argmax}{arg\,max}
+\DeclareMathOperator*{\argmin}{arg\,min}
+
+%indistinguishability
+\newcommand{\@pc@oset}[3][0ex]{%
+ \mathrel{\mathop{#3}\limits^{
+ \vbox to#1{\kern-2\ex@
+ \hbox{$\scriptstyle#2$}\vss}}}}
+
+\newcommand{\pindist}{\@pc@oset{\text{p}}{\lower.2ex\hbox{$=$}}}
+\newcommand{\sindist}{\@pc@oset{\text{s}}{\lower.1ex\hbox{$\approx$}}}
+\newcommand{\cindist}{\@pc@oset{\text{c}}{\lower.1ex\hbox{$\approx$}}}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsubsection{adversary}
+%
+%\begin{macro}{\adversary}
+%\begin{macro}{\adv}
+%\begin{macro}{\bdv}
+%\begin{macro}{\cdv}
+%\begin{macro}{\ddv}
+%\begin{macro}{\edv}
+%\begin{macro}{\mdv}
+%\begin{macro}{\pdv}
+%\begin{macro}{\rdv}
+%\begin{macro}{\sdv}
+% Definitions of adversaries $\adv$ (|\adv|), $\bdv$ (|\bdv|), etc.~together with a style |\pcadvstyle|.
+% \begin{macrocode}
+\DeclareOption{adversary}{
+\providecommand{\adversary}[1]{\pcadvstyle{#1}}
+
+\providecommand{\adv}{\pcadvstyle{A}}
+\providecommand{\bdv}{\pcadvstyle{B}}
+\providecommand{\cdv}{\pcadvstyle{C}}
+\providecommand{\ddv}{\pcadvstyle{D}}
+\providecommand{\edv}{\pcadvstyle{E}}
+\providecommand{\mdv}{\pcadvstyle{M}}
+\providecommand{\pdv}{\pcadvstyle{P}}
+\providecommand{\rdv}{\pcadvstyle{R}}
+\providecommand{\sdv}{\pcadvstyle{S}}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsubsection{landau}
+%
+%\begin{macro}{\bigO}
+%\begin{macro}{\smallO}
+%\begin{macro}{\bigOmega}
+%\begin{macro}{\smallOmega}
+%\begin{macro}{\bigsmallO}
+%\begin{macro}{\bigTheta}
+%\begin{macro}{\orderOf}
+% Defines several \emph{Landau symbols}.
+% \begin{macrocode}
+\DeclareOption{landau}{
+\providecommand{\bigO}[1]{\ensuremath{\mathcal{O}\pc@olrk*{#1}}}
+\providecommand{\smallO}[1]{\ensuremath{\text{o}\pc@olrk*{#1}}}
+\providecommand{\bigOmega}[1]{\ensuremath{\Omega\pc@olrk*{#1}}}
+\providecommand{\smallOmega}[1]{\ensuremath{\omega\pc@olrk*{#1}}}
+\providecommand{\bigsmallO}[1]{%
+\PackageWarning{cryptocode}{bigsmallO is deprecated. Use bigTheta instead.}%
+\ensuremath{\Theta\pc@olrk*{#1}}}
+\providecommand{\bigTheta}[1]{\ensuremath{\Theta\pc@olrk*{#1}}}
+\providecommand{\orderOf}{\ensuremath{\sim}}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsubsection{probability}
+%
+%\begin{macro}{\probname}
+%\begin{macro}{\expectationname}
+%\begin{macro}{\supportname}
+%\begin{macro}{\tprob}
+%\begin{macro}{\prob}
+%\begin{macro}{\tprobsub}
+%\begin{macro}{\probsub}
+%\begin{macro}{\probsublong}
+%\begin{macro}{\tcondprob}
+%\begin{macro}{\condprob}
+%\begin{macro}{\tcondprobsub}
+%\begin{macro}{\condprobsub}
+%\begin{macro}{\texpect}
+%\begin{macro}{\expect}
+%\begin{macro}{\texpsub}
+%\begin{macro}{\expsub}
+%\begin{macro}{\tcondexp}
+%\begin{macro}{\condexp}
+%\begin{macro}{\tcondexpsub}
+%\begin{macro}{\condexpsub}
+%\begin{macro}{\supp}
+%\begin{macro}{\entropy}
+%\begin{macro}{\condentropy}
+%\begin{macro}{\minentropy}
+%\begin{macro}{\condminentropy}
+%\begin{macro}{\condavgminentropy}
+% The \emph{probability} package option defines various macros for typesetting
+% probabilities.
+%
+% Sets flags |\@pc@opt@amsfontstrue|.
+% \begin{macrocode}
+\DeclareOption{probability}{
+\@pc@opt@amsfontstrue
+
+\providecommand{\probname}{Pr}
+\providecommand{\expectationname}{\ensuremath{\mathbb{E}}}
+\providecommand{\supportname}{Supp}
+
+\providecommand{\tprob}[1]{\ensuremath{\operatorname{\probname}\pc@elrk{#1}}}
+\providecommand{\prob}[1]{\ensuremath{\operatorname{\probname}\pc@elrk*{#1}}}
+
+\providecommand{\tprobsub}[2]{\ensuremath{\operatorname{\probname}_{#1}\pc@elrk{#2}}}
+\providecommand{\probsub}[2]{\ensuremath{\operatorname{\probname}_{#1}\pc@elrk*{#2}}}
+\providecommand{\probsublong}[2]{\ensuremath{\prob{#2\,:\,#1}}}
+
+\providecommand{\tcondprob}[2]{\ensuremath{\tprob{#1\,\left|\,#2\vphantom{#1}\right.}}}
+\providecommand{\condprob}[2]{\ensuremath{\prob{#1\,\left|\,#2\vphantom{#1}\right.}}}
+
+\providecommand{\tcondprobsub}[3]{\ensuremath{\tprobsub{#1}{#2\,\left|\,#3\vphantom{#1}\right.}}}
+\providecommand{\condprobsub}[3]{\ensuremath{\probsub{#1}{#2\,\left|\,#3\vphantom{#1}\right.}}}
+
+\providecommand{\texpect}[1]{\ensuremath{\operatorname{\expectationname}\pc@elrk{#1}}}
+\providecommand{\expect}[1]{\ensuremath{\operatorname{\expectationname}\pc@elrk*{#1}}}
+
+\providecommand{\texpsub}[2]{\ensuremath{\operatorname{\expectationname}_{#1}\pc@elrk{#2}}}
+\providecommand{\expsub}[2]{\ensuremath{\operatorname{\expectationname}_{#1}\pc@elrk*{#2}}}
+
+\providecommand{\tcondexp}[2]{\ensuremath{\texpect{#1\,\left|\,#2\vphantom{#1}\right.}}}
+\providecommand{\condexp}[2]{\ensuremath{\expect{#1\,\left|\,#2\vphantom{#1}\right.}}}
+
+\providecommand{\tcondexpsub}[3]{\ensuremath{\texpsub{#1}{#2\,\left|\,#3\vphantom{#1}\right.}}}
+\providecommand{\condexpsub}[3]{\ensuremath{\expsub{#1}{#2\,\left|\,#3\vphantom{#1}\right.}}}
+
+\providecommand{\supp}[1]{\ensuremath{\operatorname{Supp}\pc@olrk*{#1}}}
+
+\providecommand{\entropy}[1]{\ensuremath{\operatorname{H}\pc@olrk*{#1}}}
+\providecommand{\condentropy}[2]{%
+\ensuremath{\operatorname{H}\pc@olrk*{#1\,\left|\,#2\vphantom{#1}\right.}}}
+
+\providecommand{\minentropy}[1]{\ensuremath{\operatorname{H_\infty}\pc@olrk*{#1}}}
+\providecommand{\tminentropy}[1]{\ensuremath{\operatorname{H_\infty}\pc@olrk{#1}}}
+\providecommand{\condminentropy}[2]{%
+\ensuremath{\operatorname{H_\infty}\pc@olrk*{#1\,\left|\,#2\vphantom{#1}\right.}}}
+\providecommand{\tcondminentropy}[2]{%
+\ensuremath{\operatorname{H_\infty}\pc@olrk{#1\,\left|\,#2\vphantom{#1}\right.}}}
+\providecommand{\condavgminentropy}[2]{%
+\ensuremath{\operatorname{\tilde{H}_\infty}\pc@olrk*{#1\,\left|\,#2\vphantom{#1}\right.}}}
+\providecommand{\tcondavgminentropy}[2]{%
+\ensuremath{\operatorname{\tilde{H}_\infty}\pc@olrk{#1\,\left|\,#2\vphantom{#1}\right.}}}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsubsection{sets}
+%
+%\begin{macro}{\NN}
+%\begin{macro}{\ZZ}
+%\begin{macro}{\CC}
+%\begin{macro}{\QQ}
+%\begin{macro}{\RR}
+%\begin{macro}{\PP}
+%\begin{macro}{\FF}
+%\begin{macro}{\GG}
+%\begin{macro}{\set}
+%\begin{macro}{\sequence}
+%\begin{macro}{\bin}
+% The \emph{sets} option defines various macros for standard sets such as
+% natural numbers |\NN| (\NN). The style can be configured via |\pcsetstyle|.
+%
+% As we usually work with bit strings, the macro |\bin| defines the set \bin.
+% Sets the flags |\@pc@opt@amsfontstrue|.
+% \begin{macrocode}
+\DeclareOption{sets}{
+\@pc@opt@amsfontstrue
+
+\providecommand\NN{\pcsetstyle{N}}
+\providecommand\ZZ{\pcsetstyle{Z}}
+\providecommand\CC{\pcsetstyle{C}}
+\providecommand\QQ{\pcsetstyle{Q}}
+\providecommand\RR{\pcsetstyle{R}}
+\providecommand\PP{\pcsetstyle{P}}
+\providecommand\FF{\pcsetstyle{F}}
+\providecommand\GG{\pcsetstyle{G}}
+
+\providecommand{\set}[1]{\ensuremath{\pc@clrk*{#1}}}
+\providecommand{\sequence}[1]{\ensuremath{\pc@olrk*{#1}}}
+\providecommand{\bin}{\ensuremath{\{0,1\}}}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+% \subsubsection{noamsfonts}
+%
+%\begin{macro}{\@pc@opt@amsfontsfalse}
+% Package option \emph{noamsfonts} ensures that ams fonts are not loaded.
+% For this flag |\@pc@opt@amsfontsfalse| is set to false.
+% \begin{macrocode}
+\DeclareOption{noamsfonts}{
+ \@pc@opt@amsfontsfalse
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+% \subsubsection{notions}
+%
+%\begin{macro}{\indcpa}
+%\begin{macro}{\indcca}
+%\begin{macro}{\indccai}
+%\begin{macro}{\indccaii}
+%\begin{macro}{\priv}
+%\begin{macro}{\ind}
+%\begin{macro}{\indcda}
+%\begin{macro}{\prvcda}
+%\begin{macro}{\prvrcda}
+%\begin{macro}{\kiae}
+%\begin{macro}{\kdae}
+%\begin{macro}{\mle}
+%\begin{macro}{\uce}
+%\begin{macro}{\eufcma}
+%\begin{macro}{\eufko}
+%\begin{macro}{\eufnacma}
+%\begin{macro}{\seufcma}
+% The \emph{notion} package option defines various cryptographic security
+% notions.
+% The style to be can be defined via |\pcnotionstyle|.
+% \begin{macrocode}
+\DeclareOption{notions}{
+\providecommand{\indcpa}{\pcnotionstyle{IND\pcmathhyphen{}CPA}}
+\providecommand{\indcca}{\pcnotionstyle{IND\pcmathhyphen{}CCA}}
+\providecommand{\indccai}{\pcnotionstyle{IND\pcmathhyphen{}CCA1}}
+\providecommand{\indccaii}{\pcnotionstyle{IND\pcmathhyphen{}CCA2}}
+\providecommand{\priv}{\pcnotionstyle{PRIV}}
+\providecommand{\ind}{\pcnotionstyle{IND}}
+\providecommand{\indcda}{\pcnotionstyle{IND\pcmathhyphen{}CDA}}
+\providecommand{\prvcda}{\pcnotionstyle{PRV\pcmathhyphen{}CDA}}
+\providecommand{\prvrcda}{\pcnotionstyle{PRV\$\pcmathhyphen{}CDA}}
+\providecommand{\kiae}{\pcnotionstyle{KIAE}}
+\providecommand{\kdae}{\pcnotionstyle{KDAE}}
+\providecommand{\mle}{\pcnotionstyle{MLE}}
+\providecommand{\uce}{\pcnotionstyle{UCE}}
+
+\providecommand{\eufcma}{\pcnotionstyle{EUF\pcmathhyphen{}CMA}}
+\providecommand{\eufnacma}{\pcnotionstyle{EUF\pcmathhyphen{}naCMA}}
+\providecommand{\seufcma}{\pcnotionstyle{SUF\pcmathhyphen{}CMA}}
+
+\providecommand{\eufko}{\pcnotionstyle{EUF\pcmathhyphen{}KO}}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+% \subsubsection{logic}
+%
+%\begin{macro}{\AND}
+%\begin{macro}{\OR}
+%\begin{macro}{\NOR}
+%\begin{macro}{\NOT}
+%\begin{macro}{\NAND}
+%\begin{macro}{\XOR}
+%\begin{macro}{\XNOR}
+%\begin{macro}{\xor}
+%\begin{macro}{\false}
+%\begin{macro}{\true}
+%\begin{macro}{\notimplies}
+% \begin{macrocode}
+\DeclareOption{logic}{
+% load centernot needed for notimplies
+\@pc@opt@centernottrue
+
+\providecommand{\AND}{\ensuremath{\mathrm{AND}}}
+\providecommand{\OR}{\ensuremath{\mathrm{OR}}}
+\providecommand{\NOR}{\ensuremath{\mathrm{NOR}}}
+\providecommand{\NOT}{\ensuremath{\mathrm{NOT}}}
+\providecommand{\NAND}{\ensuremath{\mathrm{NAND}}}
+\providecommand{\XOR}{\ensuremath{\mathrm{XOR}}}
+\providecommand{\XNOR}{\ensuremath{\mathrm{XNOR}}}
+\providecommand{\xor}{\ensuremath{\oplus}}
+\providecommand{\false}{\mathsf{false}}
+\providecommand{\true}{\mathsf{true}}
+\providecommand{\notimplies}{\centernot\implies}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsubsection{ff (function families)}
+%
+%
+%\begin{macro}{\kgen}
+%\begin{macro}{\pgen}
+%\begin{macro}{\eval}
+%\begin{macro}{\invert}
+%\begin{macro}{\il}
+%\begin{macro}{\ol}
+%\begin{macro}{\kl}
+%\begin{macro}{\nl}
+%\begin{macro}{\rl}
+% The \emph{ff} option defines macros for function families.
+% Algorithms are typeset via |\pcalgostyle|.
+% \begin{macrocode}
+\DeclareOption{ff}{
+\providecommand{\kgen}{\pcalgostyle{KGen}}
+\providecommand{\pgen}{\pcalgostyle{Pgen}}
+\providecommand{\eval}{\pcalgostyle{Eval}}
+\providecommand{\invert}{\pcalgostyle{Inv}}
+
+\providecommand{\il}{\pcalgostyle{il}}
+\providecommand{\ol}{\pcalgostyle{ol}}
+\providecommand{\kl}{\pcalgostyle{kl}}
+\providecommand{\nl}{\pcalgostyle{nl}}
+\providecommand{\rl}{\pcalgostyle{rl}}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsubsection{mm (machine models)}
+%
+%
+%\begin{macro}{\pcmachinemodelstyle}
+%\begin{macro}{\CRKT}
+%\begin{macro}{\TM}
+%\begin{macro}{\PROG}
+%\begin{macro}{\uTM}
+%\begin{macro}{\uC}
+%\begin{macro}{\uP}
+%\begin{macro}{\csize}
+%\begin{macro}{\tmtime}
+%\begin{macro}{\ppt}
+% The \emph{mm} option defines macros for machine models.
+% \begin{macrocode}
+\DeclareOption{mm}{
+\providecommand{\CRKT}{\pcmachinemodelstyle{C}}
+\providecommand{\TM}{\pcmachinemodelstyle{M}}
+\providecommand{\PROG}{\pcmachinemodelstyle{P}}
+
+\providecommand{\uTM}{\pcmachinemodelstyle{UM}}
+\providecommand{\uC}{\pcmachinemodelstyle{UC}}
+\providecommand{\uP}{\pcmachinemodelstyle{UEval}}
+
+\providecommand{\csize}{\pcmachinemodelstyle{size}}
+\providecommand{\tmtime}{\pcmachinemodelstyle{time}}
+\providecommand{\ppt}{\pcalgostyle{PPT}}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+% \subsubsection{advantage}
+%
+% The \emph{advantage} option defines an |\advantage| command for typesetting
+% advantage declarations of adversaries.
+% \begin{macrocode}
+\DeclareOption{advantage}{
+\@pc@opt@advantagetrue
+}
+% \end{macrocode}
+%
+%
+% \subsubsection{primitives}
+%
+%\begin{macro}{\prover}
+%\begin{macro}{\verifier}
+%\begin{macro}{\nizk}
+%\begin{macro}{\hash}
+%\begin{macro}{\gash}
+%\begin{macro}{\fash}
+%\begin{macro}{\enc}
+%\begin{macro}{\dec}
+%\begin{macro}{\sig}
+%\begin{macro}{\sign}
+%\begin{macro}{\verify}
+%\begin{macro}{\obf}
+%\begin{macro}{\iO}
+%\begin{macro}{\diO}
+%\begin{macro}{\owf}
+%\begin{macro}{\prf}
+%\begin{macro}{\prp}
+%\begin{macro}{\prg}
+%\begin{macro}{\mac}
+%\begin{macro}{\puncture}
+%\begin{macro}{\source}
+%\begin{macro}{\predictor}
+%\begin{macro}{\sam}
+%\begin{macro}{\dist}
+%\begin{macro}{\distinguisher}
+%\begin{macro}{\simulator}
+%\begin{macro}{\ext}
+%\begin{macro}{\extractor}
+% The \emph{primitives} package option defines various cryptographic primitives.
+% \begin{macrocode}
+\DeclareOption{primitives}{
+% \end{macrocode}
+% Zero knowledge
+% \begin{macrocode}
+\providecommand{\prover}{\pcalgostyle{P}}
+\providecommand{\verifier}{\pcalgostyle{V}}
+\providecommand{\nizk}{\pcalgostyle{NIZK}}
+% \end{macrocode}
+% Hash
+% \begin{macrocode}
+\providecommand{\hash}{\pcalgostyle{H}}
+\providecommand{\gash}{\pcalgostyle{G}}
+\providecommand{\fash}{\pcalgostyle{F}}
+\providecommand{\pad}{\pcalgostyle{pad}}
+% \end{macrocode}
+% Encryption
+% \begin{macrocode}
+\providecommand{\enc}{\pcalgostyle{Enc}}
+\providecommand{\dec}{\pcalgostyle{Dec}}
+% \end{macrocode}
+% Signatures
+% \begin{macrocode}
+\providecommand{\sig}{\pcalgostyle{Sig}}
+\providecommand{\sign}{\pcalgostyle{Sign}}
+\providecommand{\verify}{\pcalgostyle{Vf}}
+% \end{macrocode}
+% Obfuscation
+% \begin{macrocode}
+\providecommand{\obf}{\pcalgostyle{O}}
+\providecommand{\iO}{\pcalgostyle{iO}}
+\providecommand{\diO}{\pcalgostyle{diO}}
+% \end{macrocode}
+% One-wayness
+% \begin{macrocode}
+\providecommand{\owf}{\pcalgostyle{OWF}}
+\providecommand{\owp}{\pcalgostyle{OWP}}
+\providecommand{\tdf}{\pcalgostyle{TF}}
+\providecommand{\inv}{\pcalgostyle{Inv}}
+\providecommand{\hcf}{\pcalgostyle{HC}}
+% \end{macrocode}
+% Pseudorandomness
+% \begin{macrocode}
+\providecommand{\prf}{\pcalgostyle{PRF}}
+\providecommand{\prp}{\pcalgostyle{PRP}}
+\providecommand{\prg}{\pcalgostyle{PRG}}
+% \end{macrocode}
+% Message authentication code
+% \begin{macrocode}
+\providecommand{\mac}{\pcalgostyle{MAC}}
+% \end{macrocode}
+% Puncture
+% \begin{macrocode}
+\providecommand{\puncture}{\pcalgostyle{Puncture}}
+% \end{macrocode}
+% Misc
+% \begin{macrocode}
+\providecommand{\source}{\pcalgostyle{S}}
+\providecommand{\predictor}{\pcalgostyle{P}}
+\providecommand{\sam}{\pcalgostyle{Sam}}
+\providecommand{\dist}{\pcalgostyle{D}}
+\providecommand{\distinguisher}{\pcalgostyle{Dist}}
+\providecommand{\simulator}{\pcalgostyle{Sim}}
+\providecommand{\ext}{\pcalgostyle{Ext}}
+\providecommand{\extractor}{\ext}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsubsection{oracles}
+%
+%\begin{macro}{\Oracle}
+%\begin{macro}{\oracle}
+%\begin{macro}{\ro}
+% The \emph{oracles} package option defines macros for typesetting oracles.
+% \begin{macrocode}
+\DeclareOption{oracles}{
+\providecommand{\Oracle}[1]{\pcalgostyle{O{#1}}}
+
+\def\oracle{\bgroup\oracle@}
+\newcommand{\oracle@}[1][]{\ifthenelse{\equal{#1}{}}{\oracle@@{O}}{\oracle@@{#1}}}
+\def\oracle@@#1{\pcoraclestyle{#1}\egroup}
+
+\providecommand{\ro}{\pcoraclestyle{RO}}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+% \subsubsection{events}
+%
+%\begin{macro}{\event}
+%\begin{macro}{\nevent}
+%\begin{macro}{\bad}
+%\begin{macro}{\nbad}
+% The \emph{events} package option defines macros for typesetting
+% events (probabilistic).
+% Also defines |\bad| as a \emph{bad event} often used in game based proofs.
+% \begin{macrocode}
+\DeclareOption{events}{
+\providecommand{\event}[1]{\ensuremath{\mathsf{#1}}}
+\providecommand{\nevent}[1]{\ensuremath{\overline{\event{#1}}}}
+
+\providecommand{\bad}{\ensuremath{\event{bad}}}
+\providecommand{\nbad}{\ensuremath{\nevent{bad}}}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+% \subsubsection{complexity}
+%
+%\begin{macro}{\complclass}
+%\begin{macro}{\cocomplclass}
+%\begin{macro}{\npol}
+%\begin{macro}{\conpol}
+%\begin{macro}{\pol}
+%\begin{macro}{\bpp}
+%\begin{macro}{\ppoly}
+%\begin{macro}{\AM}
+%\begin{macro}{\coAM}
+%\begin{macro}{\AC}
+%\begin{macro}{\NC}
+%\begin{macro}{\TC}
+%\begin{macro}{\PH}
+%\begin{macro}{\csigma}
+%\begin{macro}{\cpi}
+%\begin{macro}{\cosigma}
+%\begin{macro}{\copi}
+% The \emph{complexity} package option defines various complexity classes.
+% The style can be adjusted via |\pccomplexitystyle|
+% \begin{macrocode}
+\DeclareOption{complexity}{
+\providecommand{\complclass}[1]{\pccomplexitystyle{#1}}
+\providecommand{\cocomplclass}[1]{\pccomplexitystyle{co}\pcmathhyphen{}\pccomplexitystyle{#1}}
+
+\providecommand{\npol}{\pccomplexitystyle{NP}}
+\providecommand{\conpol}{\cocomplclass{NP}}
+\providecommand{\pol}{\pccomplexitystyle{P}}
+\providecommand{\bpp}{\pccomplexitystyle{BPP}}
+\providecommand{\ppoly}{\ensuremath{\pol/\mathrm{poly}}}
+
+\providecommand{\AM}{\pccomplexitystyle{AM}}
+\providecommand{\coAM}{\cocomplclass{AM}}
+
+\providecommand{\AC}[1]{\ensuremath{\ifthenelse{\equal{#1}{}}{\pccomplexitystyle{AC}}{\pccomplexitystyle{AC}^{#1}}}}
+\providecommand{\NC}[1]{\ensuremath{\ifthenelse{\equal{#1}{}}{\pccomplexitystyle{NC}}{\pccomplexitystyle{NC}^{#1}}}}
+\providecommand{\TC}[1]{\ensuremath{\ifthenelse{\equal{#1}{}}{\pccomplexitystyle{TC}}{\pccomplexitystyle{TC}^{#1}}}}
+
+\providecommand{\PH}{\pccomplexitystyle{PH}}
+\providecommand{\csigma}[1]{\pccomplexitystyle{\Sigma}^p_{#1}}
+\providecommand{\cpi}[1]{\pccomplexitystyle{\Pi}^p_{#1}}
+\providecommand{\cosigma}[1]{\cocomplclass{\Sigma}^p_{#1}}
+\providecommand{\copi}[1]{\cocomplclass{\Pi}^p_{#1}}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+% \subsubsection{asymptotics}
+%
+%\begin{macro}{\negl}
+%\begin{macro}{\poly}
+%\begin{macro}{\cc}
+%\begin{macro}{\ee}
+%\begin{macro}{\kk}
+%\begin{macro}{\mm}
+%\begin{macro}{\nn}
+%\begin{macro}{\pp}
+%\begin{macro}{\qq}
+%\begin{macro}{\rr}
+% The \emph{asymptotics} package option defines \enquote{polynomials} \cc\ (|\cc|),
+% \ee\ (|\ee|), \kk\, (|\kk|), \mm\ (|\mm|), \nn\ (|\nn|), \pp\ (|\pp|), and \qq\ (|\qq|) as well as macros |\negl| and |\poly|.
+% \begin{macrocode}
+\DeclareOption{asymptotics}{
+\providecommand{\negl}[1][\secpar]{%
+\pcpolynomialstyle{negl}\ifthenelse{\equal{#1}{}}{}{\pc@olrk*{#1}}}
+
+\providecommand{\poly}[1][\secpar]{%
+\pcpolynomialstyle{poly}\ifthenelse{\equal{#1}{}}{}{\pc@olrk*{#1}}}
+
+\def\pp{\bgroup\pp@}
+\newcommand{\pp@}[1][]{\ifthenelse{\equal{#1}{}}{\pp@@{p}}{\pp@@{#1}}}
+\def\pp@@#1{\pcpolynomialstyle{#1}\egroup}
+
+
+\providecommand{\cc}{\pcpolynomialstyle{c}}
+\providecommand{\ee}{\pcpolynomialstyle{e}}
+\providecommand{\kk}{\pcpolynomialstyle{k}}
+\providecommand{\mm}{\pcpolynomialstyle{m}}
+\providecommand{\nn}{\pcpolynomialstyle{n}}
+\providecommand{\qq}{\pcpolynomialstyle{q}}
+\providecommand{\rr}{\pcpolynomialstyle{r}}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsubsection{keys}
+%
+%\begin{macro}{\pk}
+%\begin{macro}{\vk}
+%\begin{macro}{\sk}
+%\begin{macro}{\key}
+%\begin{macro}{\hk}
+%\begin{macro}{\gk}
+%\begin{macro}{\fk}
+%\begin{macro}{\st}
+%\begin{macro}{\state}
+% The \emph{keys} package option defines various \enquote{keys} such as
+% a symmetric and general purpose \key\ (|\key|) or an asymmetric key pair
+% \pk, \sk\ (|\pk| and |\sk|)
+% \begin{macrocode}
+\DeclareOption{keys}{
+\providecommand{\pk}{\pckeystyle{pk}}
+\providecommand{\vk}{\pckeystyle{vk}}
+\providecommand{\sk}{\pckeystyle{sk}}
+
+\def\key{\bgroup\key@}
+\newcommand{\key@}[1][]{\ifthenelse{\equal{#1}{}}{\key@@{k}}{\key@@{#1}}}
+\def\key@@#1{\pckeystyle{#1}\egroup}
+
+\providecommand{\hk}{\pckeystyle{hk}}
+\providecommand{\gk}{\pckeystyle{gk}}
+\providecommand{\fk}{\pckeystyle{fk}}
+
+\providecommand{\st}{\pckeystyle{st}}
+
+\def\state{\bgroup\state@}
+\newcommand{\state@}[1][]{\ifthenelse{\equal{#1}{}}{\state@@{state}}{\state@@{#1}}}
+\def\state@@#1{\pckeystyle{#1}\egroup}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+% \subsubsection{Security parameter}
+%
+%
+%\begin{macro}{\SECPAR}
+%\begin{macro}{\secpar}
+%\begin{macro}{\secparam}
+% The \emph{n} option defines security parameter macros |\secpar| and |\secparam|
+% using $n$.
+% See also \enquote{lambda} package option.
+% \begin{macrocode}
+\DeclareOption{n}{
+ \providecommand{\SECPAR}{\ensuremath{{N_0}}}
+ \providecommand{\secpar}{\ensuremath{n}}
+ \providecommand{\secparam}{\ensuremath{1^\secpar}}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%\begin{macro}{\SECPAR}
+%\begin{macro}{\secpar}
+%\begin{macro}{\secparam}
+% The \emph{n} option defines security parameter macros |\secpar| and |\secparam|
+% using $\lambda$.
+% See also \enquote{n} package option.
+% \begin{macrocode}
+\DeclareOption{lambda}{
+ \renewcommand{\SECPAR}{\ensuremath{\Lambda}}
+ \renewcommand{\secpar}{\ensuremath{\lambda}}
+ \renewcommand{\secparam}{\ensuremath{1^\secpar}}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Preamble and Option Parsing}
+%
+% Print a warning in case an undefined package option is provided.
+% \begin{macrocode}
+\DeclareOption*{%
+ \PackageError{cryptocode}{Unknown option ‘\CurrentOption’}%
+}
+% \end{macrocode}
+%
+% By default, only the \emph{n} option (security parameter as $n$ and $1^n$) is loaded
+% \begin{macrocode}
+\ExecuteOptions{n}
+% \end{macrocode}
+%
+% We are now ready to process all package options
+% \begin{macrocode}
+\ProcessOptions\relax
+% \end{macrocode}
+%
+% The cryptocode package depends on various external packages which are
+% loaded next. Note that the \emph{amsfonts} package is optional and can be
+% disabled via the \emph{noamsfonts} package option.
+%
+% Note that amsmath and mathtools have been loaded already earlier.
+% \begin{macrocode}
+\RequirePackage{etex}
+\if@pc@opt@amsfonts
+ \RequirePackage{amsfonts}
+\fi
+\if@pc@opt@centernot
+ \RequirePackage{centernot}
+\fi
+\RequirePackage{xcolor}
+\RequirePackage{calc}
+\RequirePackage{tikz}
+\usetikzlibrary{positioning,calc}
+\RequirePackage{ifthen}
+\RequirePackage{xargs}
+\RequirePackage{pgf}
+\RequirePackage{forloop}
+\RequirePackage{array}
+\RequirePackage{xparse}
+\RequirePackage{expl3}
+\RequirePackage{pbox}
+\RequirePackage{varwidth}
+\RequirePackage{suffix}
+\RequirePackage{etoolbox}
+\RequirePackage{environ}
+\RequirePackage{xkeyval}
+% \end{macrocode}
+%
+%
+%
+%\begin{macro}{\pcadvantagesuperstyle}
+%\begin{macro}{\pcadvantagename}
+%\begin{macro}{\pcadvantagesubstyle}
+%\begin{macro}{\advantage}
+% The \emph{advantage} option defines an |\advantage| command for typesetting
+% advantage declarations of adversaries.
+% \begin{macrocode}
+\if@pc@opt@advantage
+\providecommand{\pcadvantagesuperstyle}[1]{\mathrm{\MakeLowercase{#1}}}
+\providecommand{\pcadvantagesubstyle}[1]{#1}
+\providecommand{\pcadvantagename}{\mathsf{Adv}}
+
+\newcommandx*{\advantage}[3][3=(\secpar)]{\ensuremath{\pcadvantagename^{\pcadvantagesuperstyle{#1}}_{\pcadvantagesubstyle{#2}}#3}}
+\fi
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+% \subsection{Global Macros}
+%
+%
+%
+%
+% \subsubsection{Styles}
+%
+%
+%
+%\begin{macro}{\pcalgostyle}
+%\begin{macro}{\pcsetstyle}
+%\begin{macro}{\pccomplexitystyle}
+%\begin{macro}{\pcpolynomialstyle}
+%\begin{macro}{\pcadvstyle}
+%\begin{macro}{\pcnotionstyle}
+%\begin{macro}{\pckeystyle}
+%\begin{macro}{\pcmachinemodelstyle}
+%\begin{macro}{\pcoraclestyle}
+% Definition of styles for algorithms, sets, complexity classes, polynomials,
+% adversaries, notions, keys, and machine models.
+% \begin{macrocode}
+\providecommand{\pcalgostyle}[1]{\ensuremath{\mathsf{#1}}}
+\providecommand{\pcsetstyle}[1]{\ensuremath{\mathbb{#1}}}
+\providecommand{\pccomplexitystyle}[1]{\ensuremath{\mathsf{#1}}}
+\providecommand{\pcpolynomialstyle}[1]{\ensuremath{\mathsf{#1}}}
+\providecommand{\pcadvstyle}[1]{\ensuremath{\mathcal{#1}}}
+\providecommand{\pcnotionstyle}[1]{\ensuremath{\mathrm{#1}}}
+\providecommand{\pckeystyle}[1]{\ensuremath{\mathsf{\protect\vphantom{p}#1}}}
+\providecommand{\pcmachinemodelstyle}[1]{\ensuremath{\mathsf{#1}}}
+\providecommand{\pcoraclestyle}[1]{\ensuremath{\mathsf{#1}}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsubsection{Order of Growth}
+%
+%\begin{macro}{\pc@olrk}
+%\begin{macro}{\pc@olrk*}
+%\begin{macro}{\pc@elrk}
+%\begin{macro}{\pc@elrk*}
+%\begin{macro}{\pc@clrk}
+%\begin{macro}{\pc@clrk*}
+% Define order of growth helper macros. These are optionally defined depending
+% on the loaded package options.
+% \begin{macrocode}
+\DeclarePairedDelimiter\pc@olrk{(}{)}
+\DeclarePairedDelimiter\pc@elrk{[}{]}
+\DeclarePairedDelimiter\pc@clrk{\{}{\}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsubsection{Spacing}
+%
+%\begin{macro}{\pcaboveskip}
+%\begin{macro}{\pcbelowskip}
+%\begin{macro}{\pcbeforeskip}
+%\begin{macro}{\pcafterskip}
+% Control the spacing before (resp.~after) pseudocode and stacking blocks both
+% vertically and horizontally.
+% \begin{macrocode}
+\newlength\pcaboveskip
+\setlength\pcaboveskip{\abovedisplayskip}
+
+\newlength\pcbelowskip
+\setlength\pcbelowskip{\belowdisplayskip}
+
+\newlength\pcbeforeskip
+\newlength\pcafterskip
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+% \subsubsection{Keywords and Highlighting}
+%
+%
+%\begin{macro}{\highlightkeyword}
+%\begin{macro}{\highlightaltkeyword}
+% Commands for highlighting primary and secondary keywords.
+% Both commands take an optional first parameter to control spacing
+% \begin{macrocode}
+\newcommand{\highlightkeyword}[2][\ ]{\ensuremath{\mathbf{#2}}#1}
+\newcommand{\highlightaltkeyword}[2][\ ]{\ensuremath{\mathsf{#2}}#1}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{\pcglobvar}
+%\begin{macro}{\pcnew}
+%\begin{macro}{\pcwhile}
+%\begin{macro}{\pcendwhile}
+%\begin{macro}{\pcdo}
+%\begin{macro}{\pcif}
+%\begin{macro}{\pcunless}
+%\begin{macro}{\pcelse}
+%\begin{macro}{\pcelseif}
+%\begin{macro}{\pcfi}
+%\begin{macro}{\pcendif}
+%\begin{macro}{\pcendfor}
+%\begin{macro}{\pcthen}
+%\begin{macro}{\pcreturn}
+%\begin{macro}{\pcin}
+%\begin{macro}{\pcfor}
+%\begin{macro}{\pcrepeat}
+%\begin{macro}{\pcrepeatuntil}
+%\begin{macro}{\pcforeach}
+%\begin{macro}{\pcendforeach}
+%\begin{macro}{\pcuntil}
+%\begin{macro}{\pccontinue}
+%\begin{macro}{\pcfalse}
+%\begin{macro}{\pctrue}
+%\begin{macro}{\pcnull}
+%\begin{macro}{\pcdone}
+%\begin{macro}{\pcparse}
+%\begin{macro}{\pcfail}
+%\begin{macro}{\pcabort}
+% All predefined (highlightable) keywords.
+% \begin{macrocode}
+\newcommand{\pcglobvar}{\highlightkeyword{gbl}}
+\newcommand{\pcnew}{\highlightkeyword{new}}
+\newcommand{\pcwhile}{\@pc@increaseindent\highlightkeyword{while}}
+\newcommand{\pcendwhile}{\@pc@decreaseindent\highlightkeyword{endwhile}}
+\newcommandx*{\pcdo}[2][1=\ ,2=]{#1\highlightkeyword[#2]{do}}
+\newcommandx*{\pcif}[1][1=\ ]{\@pc@increaseindent\highlightkeyword[#1]{if}}
+\newcommandx*{\pcunless}[1][1=\ ]{\@pc@increaseindent\highlightkeyword[#1]{unless}}
+\newcommandx*{\pcelse}[1][1=\ ]{\@pc@tmpdecreaseindent\highlightkeyword[#1]{else}}
+\newcommandx*{\pcelseif}[1][1=\ ]{\@pc@tmpdecreaseindent\highlightkeyword[#1]{else if}}
+\newcommand{\pcfi}{\@pc@decreaseindent\highlightkeyword{fi}}
+\newcommand{\pcendif}{\@pc@decreaseindent\highlightkeyword{endif}}
+\newcommand{\pcendfor}{\@pc@decreaseindent\highlightkeyword{endfor}}
+\newcommandx*{\pcthen}[2][1=\ ,2=\ ]{#1\highlightkeyword[#2]{then}}
+\newcommand{\pcreturn}{\highlightkeyword{return}}
+\newcommandx*{\pcin}[2][1=\ ,2=]{#1\highlightkeyword[#2]{in}}
+\newcommandx*{\pcfor}[1][1=\ ]{\@pc@increaseindent\highlightkeyword[#1]{for}}
+\newcommand{\pcrepeat}[1]{%
+\@pc@increaseindent\ensuremath{%
+\highlightkeyword{repeat} #1\ \highlightkeyword{times}%
+}}
+\newcommand{\pcrepeatuntil}[2]{%
+\ensuremath{\highlightkeyword{repeat}\ #1\ \highlightkeyword{until}\ #2}}
+\newcommand{\pcforeach}{\@pc@increaseindent\highlightkeyword{foreach}}
+\newcommand{\pcendforeach}{\@pc@decreaseindent\highlightkeyword{endforeach}}
+\newcommand{\pcuntil}{\@pc@decreaseindent\highlightkeyword{until}}
+\newcommand{\pccontinue}{\highlightkeyword{continue}}
+\newcommandx*{\pcfalse}[2][1=\ ,2=]{\highlightkeyword[#2]{false}}
+\newcommandx*{\pctrue}[2][1=\ ,2=]{\highlightkeyword[#2]{true}}
+\newcommandx*{\pcnull}[2][1=\ ,2=]{\highlightkeyword[#2]{null}}
+\newcommand{\pcdone}{\highlightkeyword{done}}
+\newcommand{\pcparse}{\highlightkeyword{parse}}
+\newcommand{\pcfail}{\highlightkeyword{fail}}
+\newcommand{\pcabort}{\highlightkeyword{abort}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+% \subsubsection{Misc}
+%
+%
+%\begin{macro}{\pcmathhyphen}
+% Definition of a hyphen to be used within math formulas.
+% \begin{macrocode}
+\mathchardef\pcmathhyphen ="2D
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\pccomment}
+%\begin{macro}{\pclinecomment}
+% Programming style line comment prefixing the comment with a double slash.
+% An optional first parameter allows to control the spacing before the comment
+% (defaults to 1em).
+% \begin{macrocode}
+\newcommand{\pccomment}[2][1em]{\hspace{#1}{\mbox{/\!\!/ } \text{\scriptsize#2}}}
+\newcommand{\pclinecomment}[2][0em]{\hspace{#1}{\mbox{/\!\!/ } \text{\scriptsize#2}}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsection{Internal Helper Functions}
+%
+%
+%\begin{macro}{\@expandedsetkeys}
+%^^A https://tex.stackexchange.com/questions/27172/how-can-i-detect-if-im-inside-or-outside-of-a-float-environment
+% \begin{macrocode}
+\newcommand\@pc@ifinfloat[2]{\ifnum\@floatpenalty<0\relax#1\else#2\fi}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@expandedsetkeys}
+% Calls |\setkeys| from the xkeyval package but before exapands argument number 4.
+% Arguments \marg{families} \marg{na} \marg{first set of keys} \marg{keys to be expanded} \marg{final set of keys}
+% \begin{macrocode}
+\newcommand*\@expandedsetkeys[5]{\expandafter\@expandedsetkeys@\expandafter{#4}{#1}{#2}{#3}{#5}}
+\def\@expandedsetkeys@#1#2#3#4#5{\setkeys{#2}[#3]{#4,#1,#5}}
+% \end{macrocode}
+%\end{macro}
+%
+% \begin{macrocode}
+\newenvironment{@pc@withspaces}
+ {\obeyspaces\begingroup\lccode`~=` \lowercase{\endgroup\let~}\ }
+ {}
+% \end{macrocode}
+%
+%\begin{macro}{\@pc@settowidthofalign}
+%\begin{macro}{\@pc@settowidthofaligned}
+% Commands to measure width of an align (resp. aligned) environment. Takes two arguments
+% a length in which to store the resulting width and the content.
+% \begin{macrocode}
+\newcommand{\@pc@settowidthofalign}[2]{%
+ \setbox\z@=\vbox{\@pseudocodecodesize
+ \begin{flalign*}
+ #2
+ \ifmeasuring@\else\global\let\got@maxcolwd\maxcolumn@widths\fi
+ \end{flalign*}
+ }%
+ \begingroup
+ \def\or{+}\edef\x{\endgroup#1=\dimexpr\got@maxcolwd\relax}\x}
+
+\newcommand{\@pc@settowidthofaligned}[2]{%
+\settowidth{#1}{\@pseudocodesubcodesize$\begin{aligned}#2\end{aligned}$}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{\@pc@ifdraft}
+% Check for draft mode.
+% \begin{macrocode}
+\def\@pc@ifdraft{\ifdim\overfullrule>\z@
+ \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\@pc@executeblindly}
+% Run stuff in an empty box
+% \begin{macrocode}
+\newcommand{\@pc@executeblindly}[1]{%
+ \setbox\z@=\vbox{#1 }}
+% \end{macrocode}
+%\end{macro}
+%
+%
+% We need to fiddle with the label command to use it in |\pseudocode|. To
+% access the original, we store it in
+% \begin{macrocode}
+\AtBeginDocument{
+ \let\@pc@original@label\ltx@label
+}
+% \end{macrocode}
+%
+%
+%\begin{macro}{\@pc@globaladdtolength}
+%\begin{macro}{\@pc@globalsetlength}
+% A helper command to set (resp.~add to) the length to a given value globally
+% even when being within a scoped grouping.
+% \begin{macrocode}
+\newcommand*{\@pc@globaladdtolength}[2]{%
+\addtolength{#1}{#2}%
+\global#1=#1\relax}
+
+\newcommand*{\@pc@globalsetlength}[2]{%
+\setlength{#1}{#2}%
+\global#1=#1\relax}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+%
+%
+%\begin{macro}{@pc@global@pc@cnt}
+%\begin{macro}{@pc@global@pc@nestcnt}
+% A global counter storing the number of times the pseudocode command was triggered.
+% \begin{macrocode}
+\newcounter{@pc@global@pc@cnt}
+\newcounter{@pc@global@pc@nestcnt}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+%
+%
+% Fix hyperref package.. gnarl http://tex.stackexchange.com/questions/130319/incompatibility-between-etoolbox-and-hyperref
+% \begin{macrocode}
+\providecommand{\pcfixhyperref}{
+\global\let\textlabel\label
+\global\let\@pc@original@label\textlabel
+ %\global\let\@pc@original@label\relax
+ %\global\let\label\relax
+}
+% \end{macrocode}
+%
+%
+%
+%
+%
+% \subsection{Stacking}
+%
+% In the following we define two stacking environments |pchstack| and |pcvstack|
+% to layout multiple pseudocode blocks.
+%
+%
+%
+% \subsubsection{Manual Spacing}
+%
+% \begin{macrocode}
+%
+\newcommand{\pchspace}[1][1em]{\hspace{#1}}
+\newcommand{\pcvspace}[1][\baselineskip]{\par\vspace{#1}}
+%
+% \end{macrocode}
+%
+%
+% \subsubsection{Misc}
+%
+%\begin{macro}{@pc@stackdepth}
+%\begin{macro}{\@pc@incstackdepth}
+%\begin{macro}{\@pc@decstackdepth}
+% Counter to keep track of nesting level of stacks.
+% \begin{macrocode}
+\newcounter{@pc@stackdepth}
+\newcommand{\@pc@incstackdepth}{\addtocounter{@pc@stackdepth}{1}}
+\newcommand{\@pc@decstackdepth}{\addtocounter{@pc@stackdepth}{-1}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+% \subsubsection{Stacking Options}
+%
+%\begin{macro}{center}
+%\begin{macro}{\@pc@centerstack}
+% Allows to center the stack.
+% \begin{macrocode}
+\newcommand{\@pc@centerstack}{false}
+\define@key{pcstack}{center}[true]{\ifthenelse{\equal{#1}{true}}
+{\renewcommand{\@pc@centerstack}{true}}
+{\renewcommand{\@pc@centerstack}{false}}}%
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{boxed}
+%\begin{macro}{\@pc@boxedstack}
+% Allows to draw a box around the stack.
+% \begin{macrocode}
+\newcommand{\@pc@boxedstack}{false}
+\define@key{pcstack}{boxed}[true]{\ifthenelse{\equal{#1}{true}}
+{\renewcommand{\@pc@boxedstack}{true}}
+{\renewcommand{\@pc@boxedstack}{false}}}%
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{noindent}
+%\begin{macro}{\@pc@noindentstack}
+% Allows to draw a box around the stack.
+% \begin{macrocode}
+\newcommand{\@pc@noindentstack}{false}
+\define@key{pcstack}{noindent}[true]{\ifthenelse{\equal{#1}{true}}
+{\renewcommand{\@pc@noindentstack}{true}}
+{\renewcommand{\@pc@noindentstack}{false}}}%
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{inline}
+%\begin{macro}{\@pc@inlinestack}
+% Allows to keep the pchstack inline and not creating a paragraph.
+% \begin{macrocode}
+\newcommand{\@pc@inlinestack}{false}
+\define@key{pcstack}{inline}[true]{\ifthenelse{\equal{#1}{true}}
+{\renewcommand{\@pc@inlinestack}{true}}
+{\renewcommand{\@pc@inlinestack}{false}}}%
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{space}
+%\begin{macro}{\pchstackspace}
+%\begin{macro}{\pcvstackspace}
+%\begin{macro}{\@pc@centerstack}
+% Introduces horizontal (resp.~vertical) space in-between pseudocode blocks
+% in stacking environments .
+% \begin{macrocode}
+\providecommand{\pchstackspace}{0pt}
+\providecommand{\pcvstackspace}{0pt}
+\newcommand{\@pc@stackspace@forpseudocode}{}
+\newlength{\@pc@stackspace@len}
+\newcommand*{\@pc@stackspace}{0pt}
+\newcommand*{\@pc@reset@stackspace}{\setlength{\@pc@stackspace@len}{\@pc@stackspace}}
+\define@key{pcstack}{space}[0pt]{\renewcommand*{\@pc@stackspace}{#1}}%
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{aboveskip}
+%\begin{macro}{\@pc@applyaboveskipinstack}
+%\begin{macro}{\@pc@addabovespaceunlessstacking}
+% By default |\pcaboveskip| is applied on the outer most stacking environment.
+% Can be overriden using |aboveskip|.
+% \begin{macrocode}
+\newcommand{\@pc@addabovespaceunlessstacking}{%
+\ifthenelse{\value{@pc@stackdepth}=0}{\par\addvspace{\pcaboveskip}}{}}
+
+\newcommand{\@pc@applyaboveskipinstack}{\@pc@addabovespaceunlessstacking}
+\let\org@pc@applyaboveskipinstack\@pc@applyaboveskipinstack
+
+\define@key{pcstack}{aboveskip}[default]{\ifthenelse{\equal{#1}{default}}
+{\renewcommand{\@pc@applyaboveskipinstack}{\org@pc@applyaboveskipinstack}}
+{\renewcommand{\@pc@applyaboveskipinstack}{\vspace{#1}}}}%
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{belowskip}
+%\begin{macro}{\@pc@applybelowskipinstack}
+%\begin{macro}{\@pc@addbelowspaceunlessstacking}
+% By default |\pcbelowskip| is applied on the outer most stacking environment.
+% Can be overriden using |belowskip|.
+% \begin{macrocode}
+\newcommand{\@pc@addbelowspaceunlessstacking}{%
+\ifthenelse{\value{@pc@stackdepth}=0}
+ {\@pc@ifinfloat{}{\par\addvspace{\pcbelowskip}}}
+ {}}
+
+\newcommand{\@pc@applybelowskipinstack}{\@pc@addbelowspaceunlessstacking}
+\let\org@pc@applybelowskipinstack\@pc@addbelowspaceunlessstacking
+
+\define@key{pcstack}{belowskip}[default]{\ifthenelse{\equal{#1}{default}}
+{\renewcommand{\@pc@applybelowskipinstack}{\org@pc@applybelowskipinstack}}
+{\renewcommand{\@pc@applybelowskipinstack}{\par\addvspace{#1}}}}%
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{\pcbeforehstackskip}
+%\begin{macro}{\pcafterhstackskip}
+%Allows adding global skips before and after |\pchstack| blocks.
+% \begin{macrocode}
+\newlength{\pcbeforehstackskip}
+\newlength{\pcafterhstackskip}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{\@pc@boxedstack}
+% For |\pchstack| and |\pcvstack| we use a box to store temporary results.
+% \begin{macrocode}
+\newsavebox{\@pc@stackcontentbox}%
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\pcsethstackargs}
+%\begin{macro}{\pcsetvstackargs}
+% \begin{macrocode}
+\newcommand*\@pc@hstack@defaultargs{}
+\newcommand*\pcsethstackargs[1]{\renewcommand*\@pc@hstack@defaultargs{#1}}
+\newcommand*\@pc@vstack@defaultargs{}
+\newcommand*\pcsetvstackargs[1]{\renewcommand*\@pc@vstack@defaultargs{#1}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+% \subsubsection{The Stacking Environments}
+%
+%\begin{macro}{pccenter}
+% \begin{macrocode}
+\newenvironment{pccenter}{%
+\setlength\topsep{0pt}\setlength\parskip{0pt}%
+\begin{center}}{\end{center}}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{environment}{pchstack}
+% A stacking environment for horizontally stacked pseudocode blocks.
+% \begin{macrocode}
+\NewEnviron{pchstack}[1][]{%
+%Ensure that the parameters are defaulted
+\begingroup%
+% parse args this is the same as
+% \setkeys{pcstack}{center=false,boxed=false,aboveskip=default,belowskip=default,space=\pchstackspace,#1}%
+% expect that we expand the default args
+\@expandedsetkeys{pcstack}{}{center=false,boxed=false,aboveskip=default,belowskip=default,space=\pchstackspace}{\@pc@hstack@defaultargs}{#1}%
+\@pc@reset@stackspace%
+%add above skip except when in inline mode
+\ifthenelse{\equal{\@pc@inlinestack}{true}}{}{\@pc@applyaboveskipinstack}%
+\@pc@incstackdepth%
+\renewcommand{\@pc@stackspace@forpseudocode}{\hspace{\@pc@stackspace}}%
+%Store main content in a box
+\ifthenelse{\equal{\@pc@boxedstack}{true}}%
+{\sbox{\@pc@stackcontentbox}
+ {\fbox{\mbox{\hspace{\pcbeforehstackskip}\BODY\hspace{\pcafterhstackskip}\hspace{-\@pc@stackspace}}}}}%
+{\sbox{\@pc@stackcontentbox}
+ {\mbox{\hspace{\pcbeforehstackskip}\BODY\hspace{\pcafterhstackskip}\hspace{-\@pc@stackspace}}}}%
+% handle noindent
+\ifthenelse{\equal{\@pc@noindentstack}{true}}{\par\noindent\ignorespaces}{}%
+%set content either centered or directly
+\ifthenelse{\equal{\@pc@centerstack}{true}}%
+{\begin{pccenter}\usebox{\@pc@stackcontentbox}\end{pccenter}}
+{\usebox{\@pc@stackcontentbox}}%
+% cleanup
+\@pc@decstackdepth%
+\ifthenelse{\equal{\@pc@inlinestack}{true}}{}{\@pc@applybelowskipinstack}%
+\endgroup%reset space outside group
+\@pc@reset@stackspace%
+\@pc@stackspace@forpseudocode%
+%ignore any spaces after, to allow staying within paragraph
+\ignorespacesafterend\noindent%
+}
+% \end{macrocode}
+%\end{environment}
+%
+%
+%\begin{environment}{pchstack}
+% A stacking environment for vertically stacked pseudocode blocks.
+% \begin{macrocode}
+\NewEnviron{pcvstack}[1][]{%
+%Ensure that the parameters are defaulted
+\begingroup%
+% parse args this is the same as
+% \setkeys{pcstack}{center=false,boxed=false,aboveskip=default,belowskip=default,space=\pcvstackspace,#1}
+% expect that we expand the default args
+\@expandedsetkeys{pcstack}{}{center=false,boxed=false,aboveskip=default,belowskip=default,space=\pcvstackspace}{\@pc@vstack@defaultargs}{#1}%
+\@pc@reset@stackspace%
+\@pc@applyaboveskipinstack%
+\@pc@incstackdepth%
+\renewcommand{\@pc@stackspace@forpseudocode}{\par\vspace{\@pc@stackspace}}%
+%Store main content in a box
+\sbox{\@pc@stackcontentbox}{%
+\ifthenelse{\equal{\@pc@boxedstack}{true}}%
+{\fbox{\raisebox{\dimexpr\ht\strutbox-\height}{\begin{varwidth}[t]{2\linewidth}\BODY\end{varwidth}}}}%
+{\raisebox{\dimexpr\ht\strutbox-\height}{\begin{varwidth}[t]{2\linewidth}\BODY\end{varwidth}}}%
+\vspace{-\@pc@stackspace}}%
+% handle noindent
+\ifthenelse{\equal{\@pc@noindentstack}{true}}{\par\noindent\ignorespaces}{}%
+% display content
+\ifthenelse{\equal{\@pc@centerstack}{true}}%
+{\begin{pccenter}\usebox{\@pc@stackcontentbox}\end{pccenter}}%
+{\usebox{\@pc@stackcontentbox}}%
+% cleanup
+\@pc@decstackdepth%
+\@pc@applybelowskipinstack%
+\endgroup%reset space outside group
+\@pc@reset@stackspace%
+\@pc@stackspace@forpseudocode%
+%ignore any spaces after, to allow staying within paragraph
+\ignorespacesafterend\noindent%
+}
+% \end{macrocode}
+%\end{environment}
+%
+%
+%
+% \subsection{The pseudocode command}
+%
+%
+%
+% Define internal lengths used for measurements within pseudocode.
+% \begin{macrocode}
+\newlength{\@pc@minipage@length}
+\newlength{\@pc@alt@minipage@length}
+\newlength{\@pc@length@tmp@width@vstack}
+% \end{macrocode}
+%
+%
+% Define flags used in game based proofs.
+% \begin{macrocode}
+\newcommand{\@withingame}{false}
+\newcommand{\@withinbxgame}{false}
+\newcommand{\@withingamedescription}{false}
+% \end{macrocode}
+%
+%
+%\begin{macro}{\@bxgameheader}
+% Define a placeholder command which will take the current game header.
+% \begin{macrocode}
+\newcommand{\@bxgameheader}{}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\@pc@beginnewline}
+% An internal helper that is called at the beginning of each new line.
+% \begin{macrocode}
+\newlength\@pseudocodecodeminlineheight@len
+\newcommand{\@pc@beginnewline}{%
+\@pseudocodecodeatbeginline\@pseudocodelinenumber\@pc@and\@pcln@stephiddenlncnt%
+\setlength{\@pseudocodecodeminlineheight@len}{\@pseudocodecodeminlineheight}%
+\vphantom{\rule[0.5ex-0.5\@pseudocodecodeminlineheight@len]{0pt}{\@pseudocodecodeminlineheight@len}}%
+%checkspace
+\ifthenelse{\equal{\@pseudocodespace}{auto}}%
+{\expandafter\pcind\expandafter[\value{@pc@indentationlevel}]}%
+{}%
+%reset column counter
+\setcounter{pccolumncounter}{2}%
+%beginmode
+\@pc@modebegin}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{\@pc@and@wrap@end}
+%\begin{macro}{\@pc@and@wrap@start}
+% Every pseudocode line is wrapped in between |\@pc@and@wrap@start| and
+% |\@pc@and@wrap@end|.
+% \begin{macrocode}
+\newcommand{\@pc@and@wrap@start}{\@pc@beginnewline}
+\newcommand{\@pc@and@wrap@end}{\@pc@modeend&\@pseudocodecodeatendline}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{\@pc@and}
+% An internal helper to store the ampersand. As this is a special character
+% this is the easiest in order to place custom alignment tags.
+% \begin{macrocode}
+\newcommand{\@pc@and}{&}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{\pcind}
+% An indentation macro to be used within pseudocode.
+% As writing |\pcind| is a bit cumbersome, there is a shorthand that can
+% be defined via |\pcindentname| (defaults to t). See below.
+% \begin{macrocode}
+\newlength{\@pcindentwidth}
+\providecommand{\pcind}[1][1]{%
+\setlength{\@pcindentwidth}{\widthof{\ensuremath{\quad}}*#1}%
+\ensuremath{\mathmakebox[\@pcindentwidth]{}}}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{\pctabname}
+%\begin{macro}{\pcdbltabname}
+%\begin{macro}{\pcindentname}
+% Shorthands for alignment tabs and indentation. These are defined only within
+% the pseudocode scope.
+% \begin{macrocode}
+\newcommand{\pctabname}{>}
+\newcommand{\pcdbltabname}{<}
+\newcommand{\pcindentname}{t}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+
+%
+% The following commands handle line numbering within the pseudocode command. The
+% pseudocode command itself does need to do some counter magic. We start
+% with a definition of various helper counters.
+% The H version of counters is needed to make hyperref happy
+% \begin{macrocode}
+\newcounter{pclinenumber}
+\newcounter{Hpclinenumber}
+\newcounter{@pclinenumber}
+\newcounter{H@pclinenumber}
+\newcounter{@pclinenumbertmp}
+\newcounter{pcgamecounter}
+\newcounter{Hpcgamecounter}
+\newcounter{pcrlinenumber}
+\newcounter{Hpcrlinenumber}
+\newcounter{@pcrlinenumbertmp}
+% \end{macrocode}
+%
+% The following implements some counter magic. When using automatic linenumbering
+% line numbers are nicely aligned before the first alignment tag. This, however
+% confuses hyperref and we thus have a second counter that is updated after the
+% first tag. This is done with the |\@pcln@stephiddenlncnt|
+% \begin{macrocode}
+\renewcommand{\the@pclinenumber}{\thepclinenumber}
+\providecommand{\@pcln@stephiddenlncnt}{%
+\refstepcounter{@pclinenumber}%
+\stepcounter{H@pclinenumber}%
+}
+% \end{macrocode}
+%
+%
+%\begin{macro}{\pclnseparator}
+%\begin{macro}{\pcrlnseparator}
+% Define separators between line numbers and code (left and right).
+% Note that line numbers can be displayed either to the left or to the right
+% of code.
+% \begin{macrocode}
+\providecommand{\pclnseparator}{:}
+\providecommand{\pcrlnseparator}{}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{\pclnspace}
+%\begin{macro}{\pclnrspace}
+% Define spacing between line numbers and code (left and right).
+% \begin{macrocode}
+\providecommand{\pclnspace}{1em}
+\providecommand{\pclnrspace}{0.5em}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{\pclnstyle}
+% \begin{macrocode}
+\providecommand\pclnstyle[1]{\text{\scriptsize#1}}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{pcln}
+% Manually place (left aligned) line numbers.
+% This command is also used by the automatic placement of line numbers.
+% \begin{macrocode}
+\providecommand{\pcln}{%
+\ifthenelse{\equal{\@pc@skiplnmarker}{1}}{\ifmeasuring@\else\@pc@resetskipln{}\fi}{%
+\refstepcounter{pclinenumber}%
+\stepcounter{Hpclinenumber}%
+\ifthenelse{\value{pclinenumber}<10}{\hspace{1ex}}{}%
+\pclnstyle{\arabic{pclinenumber}}\pclnseparator\hspace{\pclnspace}%
+}}%
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\pcskipln}
+%\begin{macro}{\@pc@skiplnmarker}
+%\begin{macro}{skipfirstln}
+% allow to skip numbering single lines if linenumbering=on
+% \begin{macrocode}
+\def\@pc@skiplnmarker{}
+\providecommand{\pcskipln}{\ifmeasuring@\else\global\def\@pc@skiplnmarker{1}\fi}
+\newcommand{\@pc@resetskipln}{\global\def\@pc@skiplnmarker{}}
+\define@key{pseudocode}{skipfirstln}[1]{\global\def\@pc@skiplnmarker{1}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{\pclnr}
+%\begin{macro}{\pcrln}
+% Manual placement of right aligned line numbers using the same counter
+% (|\pclnr|) or a separate counter (|\pcrln|).
+% \begin{macrocode}
+\providecommand{\pclnr}{%
+\refstepcounter{pclinenumber}%
+\stepcounter{Hpclinenumber}%
+\hspace{\pclnrspace}\pcrlnseparator\pclnstyle{\arabic{pclinenumber}}}
+
+\providecommand{\pcrln}{
+\refstepcounter{pcrlinenumber}%
+\stepcounter{Hpcrlinenumber}%
+\hspace{\pclnrspace}\pcrlnseparator\pclnstyle{\arabic{pcrlinenumber}}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsubsection{Options}
+%
+%
+% The following commands define a bunch of placeholders (plus their default values)
+% that are defined via the various options of the pseudocode command.
+% \begin{macrocode}
+\newcommand*\@pseudocodehead{}
+\newcommand*\@pseudocodewidth{}
+\newcommand*\@pseudocodexshift{0pt}
+\newcommand*\@pseudocodeyshift{0pt}
+\newcommand*\@pseudocodelinenumber{}
+\newcommand*\@pseudocodebeforeskip{0ex}
+\newcommand*\@pseudocodeafterskip{0ex}
+\newcommand*\@pseudocodelnstart{0}
+\newcommand*\@pseudocodelnstartright{0}
+\newcommand*\@pseudocodesyntaxhighlighting{}
+\newcommand*\@pseudocodenodraft{false}
+\newcommand*\@pseudocodecolspace{} % empty per default, use length,
+
+\newcommand*\@pseudocodeheadlinecmd{\hrule}
+
+% \end{macrocode}
+
+%\begin{macro}{headlinesep}
+%\begin{macro}{\pcheadlinesep}
+%\begin{macro}{\@pseudocodeheadlinesep}
+% Distance between header and line.
+% \begin{macrocode}
+\newlength\pcheadlinesep
+\setlength\pcheadlinesep{0pt}
+\newcommand*\@pseudocodeheadlinesep{0em}
+\define@key{pseudocode}{headlinesep}[0em]{\renewcommand*\@pseudocodeheadlinesep{#1}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{bodylinesep}
+%\begin{macro}{\pcbodylinesep}
+%\begin{macro}{\@pseudocodebodylinesep}
+% \begin{macrocode}
+\newlength\pcbodylinesep
+\setlength\pcbodylinesep{0.3\baselineskip}
+\newcommand*\@pseudocodebodylinesep{0em}
+\define@key{pseudocode}{bodylinesep}[0em]{\renewcommand*\@pseudocodebodylinesep{#1}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%\begin{macro}{headheight}
+%\begin{macro}{\pcheadheight}
+%\begin{macro}{\@pc@headheightskip}
+%\begin{macro}{\@pseudocodeheadheight}
+% \begin{macrocode}
+\newlength\@pseudocodeheadheight@len
+\newcommand{\@pc@headheightskip}{%
+\setlength{\@pseudocodeheadheight@len}{\@pseudocodeheadheight}%
+\vphantom{\rule[0.5ex-0.5\@pseudocodeheadheight@len]{0pt}{\@pseudocodeheadheight@len}}%
+}
+\newlength\pcheadheight
+\setlength{\pcheadheight}{3.25ex}
+\newcommand*\@pseudocodeheadheight{\pcheadheight}
+\define@key{pseudocode}{headheight}[0em]{\renewcommand*\@pseudocodeheadheight{#1}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+
+
+%
+% \begin{macrocode}
+
+\newcommand*\@pseudocodecolsep{0em}
+\newcommand*\@pseudocodeaddtolength{2pt}
+
+\newcommand*\@pseudocodecodeatbeginline{}
+\newcommand*\@pseudocodecodeatendline{}
+\newcommand*\@pseudocodecodejot{0em}
+\newcommand*\@pseudocodecodesize{\small}
+\newcommand*\@pseudocodesubcodesize{\footnotesize}
+
+\newcommand*\@pseudocodeminipagealign{t}
+
+%
+% Define keywords for the automatic syntax highlighting
+% the accompanying add provides additional keywords.
+% The space version for automatic spacing
+\newcommand*\@pseudocodekeywordsindent{for ,foreach ,if ,repeat ,while }
+\newcommand*\@pseudocodekeywordsunindent{endfor,endforeach,fi,endif,until,endwhile}
+\newcommand*\@pseudocodekeywordsuninindent{else if ,elseif ,else }
+\newcommand*\@pseudocodekeywords{for,foreach,{return },return,{ do },{ in },new,if, null, true,{until },{ to }, false,{ then},repeat,else if,elseif,while,else,done}
+\newcommand*\@pseudocodeaddkeywords{}
+\newcommand*\@pseudocodealtkeywords{}
+\begin{@pc@withspaces}
+\global\def\@pseudocodekeywordsspace{for,endfor,foreach,endforeach,return,do,in,new,if,null,true,until,to,false,then,repeat,else if,elseif,while,endwhile,else,done,fi,endif}
+\end{@pc@withspaces}
+% \end{macrocode}
+%
+%
+% Specification of the various options of the |\pseudocode| command.
+% \begin{macrocode}
+\define@key{pseudocode}{beginline}[]{\renewcommand*\@pseudocodecodeatbeginline{#1}}
+\define@key{pseudocode}{endline}[]{\renewcommand*\@pseudocodecodeatendline{#1}}
+\define@key{pseudocode}{jot}[0em]{\renewcommand*\@pseudocodecodejot{#1}}
+\define@key{pseudocode}{codesize}[\small]{\renewcommand*\@pseudocodecodesize{#1}}
+\define@key{pseudocode}{subcodesize}[\small]{\renewcommand*\@pseudocodesubcodesize{#1}}
+\define@key{pseudocode}{head}[]{\renewcommand*\@pseudocodehead{#1}}
+\define@key{pseudocode}{width}[]{\renewcommand*\@pseudocodewidth{#1}}
+\define@key{pseudocode}{valign}[t]{\renewcommand*\@pseudocodeminipagealign{#1}}
+\define@key{pseudocode}{xshift}[]{\renewcommand*\@pseudocodexshift{#1}}
+\define@key{pseudocode}{yshift}[]{\renewcommand*\@pseudocodeyshift{#1}}
+\define@key{pseudocode}{colspace}[]{\renewcommand*\@pseudocodecolspace{#1}}
+\define@key{pseudocode}{linenumbering}[on]{\ifthenelse{\equal{#1}{on}}{\renewcommand*\@pseudocodelinenumber{\pcln}}{\renewcommand*\@pseudocodelinenumber{}}}
+\define@key{pseudocode}{beforeskip}[]{\renewcommand*\@pseudocodebeforeskip{#1}}
+\define@key{pseudocode}{afterskip}[]{\renewcommand*\@pseudocodeafterskip{#1}}
+\define@key{pseudocode}{lnstart}[0]{\renewcommand*\@pseudocodelnstart{#1}}
+\define@key{pseudocode}{lnstartright}[0]{\renewcommand*\@pseudocodelnstartright{#1}}
+\define@key{pseudocode}{colsep}[0em]{\renewcommand*\@pseudocodecolsep{#1}}
+\define@key{pseudocode}{headlinecmd}[\hrule]{\renewcommand*\@pseudocodeheadlinecmd{#1}}
+\define@key{pseudocode}{addtolength}[2pt]{\renewcommand*\@pseudocodeaddtolength{#1}}
+\define@key{pseudocode}{nodraft}[true]{\renewcommand*\@pseudocodenodraft{#1}}
+\define@key{pseudocode}{keywords}[]{\renewcommand*\@pseudocodekeywords{#1}}
+\define@key{pseudocode}{keywordsindent}[]{\renewcommand*\@pseudocodekeywordsindent{#1}}
+\define@key{pseudocode}{keywordsunindent}[]{\renewcommand*\@pseudocodekeywordsunindent{#1}}
+\define@key{pseudocode}{keywordsuninindent}[]{\renewcommand*\@pseudocodekeywordsuninindent{#1}}
+\define@key{pseudocode}{addkeywords}[]{\renewcommand*\@pseudocodeaddkeywords{#1}}
+\define@key{pseudocode}{altkeywords}[]{\renewcommand*\@pseudocodealtkeywords{#1}}
+\define@key{pseudocode}{syntaxhighlight}[]{\renewcommand*\@pseudocodesyntaxhighlighting{#1}}
+% \end{macrocode}
+%
+%
+%
+%\begin{macro}{mode}
+% The \oarg{mode} key (with values \meta{text} or \meta{math} (default)) specifies
+% whether within a pseudocode block input is by default typeset in text mode or in
+% math mode.
+% The |\@pc...| variables are variables that help typesetting each line in a pseudocode block.
+% \begin{macrocode}
+\newcommand{\@pc@modebegin}{}
+\newcommand{\@pc@modeend}{}
+\define@key{pseudocode}{mode}[math]{%
+\ifthenelse{\equal{#1}{text}}{%
+\renewcommand*\@pc@modebegin{\begin{varwidth}{\textwidth}%
+%introduce line magic for text mode
+\let\@pc@lb\\%
+\renewcommandx*{\\}[2][1=,2=]{\@pc@modeend\@pc@and \@pseudocodecodeatendline\ifthenelse{\equal{####1}{}}{\@pc@lb}{\@pc@lb[####1]}####2 \@pc@beginnewline}%
+\def\pclb{\let\\\@pc@lb\relax\@pc@modeend\\}%
+\def\pcolb{\let\\\@pc@lb\relax\@pc@modeend\\}%
+}%
+\renewcommand*\@pc@modeend{\end{varwidth}}%
+}{\renewcommand{\@pc@modebegin}{}\renewcommand{\@pc@modeend}{}}}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{minlineheight}
+%\begin{macro}{\pcminlineheight}
+%\begin{macro}{\@pseudocodecodeminlineheight}
+% Control the minimal line height of pseudocode blocks.
+% \begin{macrocode}
+\providecommand{\pcminlineheight}{0pt}
+\newcommand*\@pseudocodecodeminlineheight{\pcminlineheight}
+\define@key{pseudocode}{minlineheight}[0pt]{\renewcommand*\@pseudocodecodeminlineheight{#1}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+%
+% \subsubsection{Automatic Syntax Highlighting and Spacing (Experimental)}
+%
+%
+%
+%
+% Experimental LaTex3 string substitution helpers for automatic keyword
+% highlighting. The regex parsing is (regrettably) super slow.
+% \begin{macrocode}
+\ExplSyntaxOn
+\tl_new:N \l_pc_strsub_input_tl
+\tl_new:N \l_pc_strsub_search_tl
+\tl_new:N \l_pc_strsub_replace_tl
+
+\NewDocumentCommand{\@pc@stringsubstitution}{mmm}
+ {
+ \tl_set:Nn \l_pc_strsub_input_tl { #1 }
+ \tl_set:Nn \l_pc_strsub_search_tl { #2 }
+ \tl_set:Nn \l_pc_strsub_replace_tl { #3 }
+ % \tl_show_analysis:N \l_pc_strsub_input_tl % uncomment for debugging
+ % \tl_show_analysis:N \l_pc_strsub_search_tl % uncomment for debugging
+ % \tl_show_analysis:N \l_pc_strsub_replace_tl % uncomment for debugging
+ \regex_replace_all:nnN
+ { \u{l_pc_strsub_search_tl} } %only match if keyword does not have a word character preceding
+ { \u{l_pc_strsub_replace_tl} }
+ \l_pc_strsub_input_tl
+ % \tl_show_analysis:N \l_tmpa_tl % uncomment for debugging
+ \tl_use:N \l_pc_strsub_input_tl
+ }
+\ExplSyntaxOff
+% \end{macrocode}
+%
+%
+%
+%\begin{macro}{\@pc@syntaxhighlight}
+%\begin{macro}{\@pc@highlight}
+%\begin{macro}{\@pc@highlightindent}
+%\begin{macro}{\@pc@highlightunindent}
+%\begin{macro}{\@pc@highlightuninindent}
+%\begin{macro}{\@pc@althighlight}
+% This is the core of the (experimental) automatic syntax highlighting and
+% automatic spacing. The code is ugly, and very slow.
+% It is not really recommended to be used in larger projects.
+% \begin{macrocode}
+\newcommand{\@pc@syntaxhighlight}[1]{%
+%don't highlight during measuring runs for performance improvements.
+\ifmeasuring@#1\else%
+\ifthenelse{\equal{\@pseudocodesyntaxhighlighting}{auto}}{%
+\def\@shtmp{#1}% first step
+% Depending on space mode, we might later run the indent/unindent/... lists
+% if not, we add them now to tmp lists in order to have a complete list.
+\ifthenelse{\equal{\@pseudocodespace}{keep}}
+ {\edef\@tmpkeywords{\@pseudocodekeywordsspace,\@pseudocodeaddkeywords}}
+ {\ifthenelse{\equal{\@pseudocodespace}{auto}}
+ {\edef\@tmpkeywords{\@pseudocodekeywords,\@pseudocodeaddkeywords}}
+ {\edef\@tmpkeywords{\@pseudocodekeywords,\@pseudocodekeywordsindent,\@pseudocodekeywordsunindent,\@pseudocodekeywordsuninindent,\@pseudocodeaddkeywords}}}
+\foreach \@pckw in \@tmpkeywords{%
+\ifthenelse{\equal{\@pckw}{}}{}{%
+% we are doing a simple strsub and storing the result (globally) in @shtmp
+\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \gdef\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \@shtmp\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ {\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \@pc@stringsubstitution\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ {\expandafter\expandafter\expandafter\@shtmp\expandafter\expandafter\expandafter
+ }\expandafter\expandafter\expandafter{\expandafter\@pckw\expandafter}\expandafter{\expandafter\@pc@highlight\expandafter{\@pckw}}}%
+}}% alt keywords
+\foreach \@pckw in \@pseudocodealtkeywords{%
+\ifthenelse{\equal{\@pckw}{}}{}{%
+% we are doing a simple strsub and storing the result (globally) in @shtmp
+\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \gdef\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \@shtmp\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ {\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \@pc@stringsubstitution\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ {\expandafter\expandafter\expandafter\@shtmp\expandafter\expandafter\expandafter
+ }\expandafter\expandafter\expandafter{\expandafter\@pckw\expandafter}\expandafter{\expandafter\@pc@althighlight\expandafter{\@pckw}}}%
+}}%
+% if automatic spacing
+\ifthenelse{\equal{\@pseudocodespace}{auto}}
+{%
+\foreach \@pckw in \@pseudocodekeywordsindent{% indentation keywords
+\ifthenelse{\equal{\@pckw}{}}{}{%
+% we are doing a simple strsub and storing the result (globally) in @shtmp
+\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \gdef\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \@shtmp\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ {\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \@pc@stringsubstitution\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ {\expandafter\expandafter\expandafter\@shtmp\expandafter\expandafter\expandafter
+ }\expandafter\expandafter\expandafter{\expandafter\@pckw\expandafter}\expandafter{\expandafter\@pc@highlightindent\expandafter{\@pckw}}}%
+}}%
+\foreach \@pckw in \@pseudocodekeywordsunindent{% unindentation keywords
+\ifthenelse{\equal{\@pckw}{}}{}{%
+% we are doing a simple strsub and storing the result (globally) in @shtmp
+\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \gdef\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \@shtmp\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ {\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \@pc@stringsubstitution\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ {\expandafter\expandafter\expandafter\@shtmp\expandafter\expandafter\expandafter
+ }\expandafter\expandafter\expandafter{\expandafter\@pckw\expandafter}\expandafter{\expandafter\@pc@highlightunindent\expandafter{\@pckw}}}%
+}}%
+\foreach \@pckw in \@pseudocodekeywordsuninindent{% uninindentation keywords
+\ifthenelse{\equal{\@pckw}{}}{}{%
+% we are doing a simple strsub and storing the result (globally) in @shtmp
+\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \gdef\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \@shtmp\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ {\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ \@pc@stringsubstitution\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter
+ {\expandafter\expandafter\expandafter\@shtmp\expandafter\expandafter\expandafter
+ }\expandafter\expandafter\expandafter{\expandafter\@pckw\expandafter}\expandafter{\expandafter\@pc@highlightuninindent\expandafter{\@pckw}}}%
+}}%
+}{}%
+% return result
+\@shtmp%
+}{#1}% nothing to highlight
+\fi}
+
+\newcommand{\@pc@highlight}[1]{%
+\ifthenelse{\equal{\@pseudocodespace}{keep}}
+ {\highlightkeyword[]{#1}}%
+ {\highlightkeyword[]{\@pc@stringsubstitution{#1}{ }{~}}}%
+}
+
+\newcommand{\@pc@highlightindent}[1]{%
+\@pc@increaseindent\@pc@highlight{#1}%
+}
+
+\newcommand{\@pc@highlightunindent}[1]{%
+\@pc@decreaseindent\@pc@highlight{#1}%
+}
+
+\newcommand{\@pc@highlightuninindent}[1]{%
+\@pc@tmpdecreaseindent\@pc@highlight{#1}%
+}
+
+\newcommand{\@pc@althighlight}[1]{%
+\ifthenelse{\equal{\@pseudocodespace}{keep}}
+ {\highlightaltkeyword{#1}}%
+ {\highlightaltkeyword{\@pc@stringsubstitution{#1}{ }{~}}}%
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsubsection{Helper Variables}
+%
+%\begin{macro}{\@pc@thecontent}
+%\begin{macro}{\@pc@colspace}
+% Helper variables used within pseudocode
+% \begin{macrocode}
+\newcommand{\@pc@thecontent}{}
+\newcommand{\@pc@colspace}{}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+%
+%\begin{macro}{\@withinspaces}
+%\begin{macro}{\@keepspaces}
+% Helper variables for controlling automatic spacing
+% \begin{macrocode}
+\newcommand{\@withinspaces}{false}%
+\newcommand{\@keepspaces}{%
+\renewcommand{\@withinspaces}{true}\@pc@withspaces%
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+% \begin{macrocode}
+\newcommand*\@pseudocodespace{}
+\define@key{pcspace}{space}[]{\ifthenelse{\equal{#1}{keep}}{\@keepspaces}{}\renewcommand*\@pseudocodespace{#1}}
+
+
+\newcommand*\@pc@defaultargs{}
+\newcommand*\pcsetargs[1]{\renewcommand*\@pc@defaultargs{#1}}
+
+% automatic indentation
+\newcounter{@pc@indentationlevel}
+\newcommand{\@pc@increaseindent}{\addtocounter{@pc@indentationlevel}{1}}
+\newcommand{\@pc@decreaseindent}{\ifthenelse{\equal{\@pseudocodespace}{auto}}{\pcind[-1]}{}\addtocounter{@pc@indentationlevel}{-1}}
+\newcommand{\@pc@tmpdecreaseindent}{\ifthenelse{\equal{\@pseudocodespace}{auto}}{\pcind[-1]}{}}
+
+\newcounter{pccolumncounter}
+\setcounter{pccolumncounter}{2}
+
+% store original halign
+\let\@pc@halign\halign%
+% \end{macrocode}
+%
+% \subsubsection{The Actual Pseudocode Command}
+%
+% \begin{macrocode}
+% Check if the pseudocode command is called with an optional argument
+\providecommand{\pseudocode}{%
+\begingroup%
+\renewcommand{\@withinspaces}{false}%
+\@ifnextchar[%]
+ {\@pseudocodeA}%
+ {\@pseudocode[]}%
+}
+
+\def\@pseudocodeA[#1]{%
+\setkeys*{pcspace}{#1}%test if there is a space assignment within the keys .. make the necessary arrangements and call the actual method
+\@pseudocode[#1]%
+}
+
+\def\@pseudocode[#1]#2{%
+\begingroup%
+% reset skip marker before parsing options, as this might set it
+\@pc@resetskipln%
+% parse options
+% this is the same as %\setkeys{pseudocode}[space]{\@pc@defaultargs,#1}%ignore the space key.
+% expect that we expand the default args
+\@expandedsetkeys{pseudocode}{space}{head=}{\@pc@defaultargs}{#1}%
+% check draft mode and disable syntax highlighting
+\@pc@ifdraft{\ifthenelse{\equal{\@pseudocodenodraft}{true}}{}{\renewcommand\@pseudocodesyntaxhighlighting{}}}{}%
+%
+%
+\addtocounter{@pc@global@pc@nestcnt}{1}%
+% allow for tikz usage
+\@pc@ensureremember%
+%
+% create tabbing command
+\ifcsname \pctabname\endcsname%
+\expandafter\renewcommand\csname \pctabname\endcsname{\@pc@modeend&\@pc@colspace\@pc@modebegin}%
+\else%
+\expandafter\newcommand\csname \pctabname\endcsname{\@pc@modeend&\@pc@colspace\@pc@modebegin}%
+\fi%
+\ifcsname \pcdbltabname\endcsname%
+\expandafter\renewcommand\csname \pcdbltabname\endcsname{\@pc@modeend&&\@pc@colspace\@pc@modebegin}%
+\else%
+\expandafter\newcommand\csname \pcdbltabname\endcsname{\@pc@modeend&&\@pc@colspace\@pc@modebegin}%
+\fi%
+% create colspace command if necessary (must be empty for multicolumns
+\ifthenelse{\equal{\@pseudocodecolspace}{}}
+ {}
+ {\renewcommand{\@pc@colspace}{\hspace{\@pseudocodecolspace}}}%
+%
+%adjust row width
+\addtolength{\jot}{\@pseudocodecodejot}%
+% create indent command
+\expandafter\let\csname \pcindentname\endcsname\pcind%
+%
+%store and wrap (do syntax highlighting) argument
+\renewcommand{\@pc@thecontent}{\@pc@and@wrap@start\@pc@syntaxhighlight{#2}\@pc@and@wrap@end}%
+%
+%take care of counters
+\stepcounter{@pc@global@pc@cnt}%
+\setcounter{pclinenumber}{\@pseudocodelnstart}%
+\setcounter{pcrlinenumber}{\@pseudocodelnstartright}%
+\setlength{\@pc@minipage@length}{0pt}%
+\setlength{\@pc@alt@minipage@length}{0pt}%
+\setcounter{@pclinenumbertmp}{\value{pclinenumber}}%
+\setcounter{@pcrlinenumbertmp}{\value{pcrlinenumber}}%
+%reset column counter
+\setcounter{pccolumncounter}{2}%
+%
+% vertical space
+\vspace{\@pseudocodeyshift}%
+%
+%
+%
+% line magic
+\ifthenelse{\value{@pc@global@pc@nestcnt}=1}{%
+\let\@pc@halign\halign%
+\newenvironment{pcmbox}{\let\halign\@pc@halign}{}%
+\def\halign{%
+\renewcommand{\label}[1]{\ifmeasuring@\else\@pc@original@label{####1}\fi}%
+\let\@pc@lb\\%
+\renewcommandx*{\\}[2][1=,2=]{\@pc@modeend\@pc@and\@pseudocodecodeatendline \ifthenelse{\equal{####1}{}}{\@pc@lb}{\@pc@lb[####1]}####2 \@pc@beginnewline}%
+\def\pclb{\let\\\@pc@lb\relax\@pc@modeend\\}%
+\@pc@halign}%
+}{}%
+%
+%align column separation
+\renewcommand*{\minalignsep}{\@pseudocodecolsep}%
+%
+%as the following block will execute the pseudocode we need to store the skip command
+\edef\@pc@org@skiplnmarker{\@pc@skiplnmarker}%
+% if no width is set compute width and store in circuitlength
+\ifthenelse{\equal{\@pseudocodewidth}{}}{%
+% compute length of pseudocode
+\ifthenelse{\value{@pcsubprogstep}=0}{%
+\@pc@settowidthofalign{\@pc@minipage@length}{\@pc@thecontent}%
+}{%
+\@pc@settowidthofaligned{\@pc@minipage@length}{\@pc@thecontent}%
+}%
+%compute length of header
+\ifthenelse{\equal{\@withingame}{true}}%
+{\ifthenelse{\equal{\@pc@secondheader}{true}}%
+ {\addtolength{\@pc@alt@minipage@length}{\widthof{x\ensuremath{\@pc@gametitle[1]\@pc@gametitle[1]}}}}
+ {\addtolength{\@pc@alt@minipage@length}{\widthof{\ensuremath{\@pc@gametitle[1]}}}}}%
+{\addtolength{\@pc@alt@minipage@length}{\widthof{\@pseudocodehead}}}%
+% use header length if longer and add some points for good measure
+\ifdim\@pc@alt@minipage@length>\@pc@minipage@length%
+\setlength{\@pc@minipage@length}{\@pc@alt@minipage@length}%
+\fi%
+\addtolength{\@pc@minipage@length}{\@pseudocodeaddtolength}%
+}{\addtolength{\@pc@minipage@length}{\@pseudocodewidth}}%
+% reset counter and skip command
+\setcounter{pclinenumber}{\value{@pclinenumbertmp}}%
+\setcounter{pcrlinenumber}{\value{@pcrlinenumbertmp}}%
+\setcounter{@pc@indentationlevel}{0}%
+\edef\@pc@skiplnmarker{\@pc@org@skiplnmarker}%
+% begin actual output
+%
+%
+%do the actual mini page
+\hspace{\pcbeforeskip}\hspace{\@pseudocodexshift}%
+\ifthenelse{\equal{\@pseudocodeminipagealign}{t}}{%
+\raisebox{\dimexpr\ht\strutbox-\height}{\@pc@pseudocodeminipage{t}}%
+}{%
+\@pc@pseudocodeminipage{\@pseudocodeminipagealign}%
+}%
+\hspace{\pcafterskip}%
+% tikz usage
+\@pc@releaseremember%
+\addtocounter{@pc@global@pc@nestcnt}{-1}%
+\endgroup%
+% close spacing and potentially a single group generated by the space tester
+\ifthenelse{\equal{\@withinspaces}{true}}{\end@pc@withspaces}{}%
+\endgroup%
+%insert space from stacking
+\@pc@stackspace@forpseudocode%
+}
+
+\newcommand{\@pc@pseudocodeminipage}[1]{%
+\begin{minipage}[#1]{\@pc@minipage@length}%
+\ifthenelse{\value{@pcsubprogstep}=0}{%
+\pc@display@pseudocode{\@pseudocodehead}{\@pc@thecontent}%
+}{% if sub procedure
+\pc@display@subcode{\@pseudocodehead}{\@pc@thecontent}%
+}%
+\end{minipage}%
+}
+
+
+\newcommand{\@pc@display@gameheader}[1]{%
+\tikz{\gdef\i{\thepcgamecounter}%
+\node[anchor=base,text depth=0pt, inner sep=0.05em,outer sep=0pt] (gamenode\i) {#1};
+\ifthenelse{\equal{\@withinbxgame}{true}}
+ {\node[draw,anchor=base, above=2ex of gamenode\i] (bgamenode\i) {\@bxgameheader};}
+ {}%
+}%
+}
+
+\let\pclb\relax
+%
+\newcommand{\pc@display@pseudocode}[2]{%
+\ifthenelse{\equal{#1}{}}{\vspace{-\baselineskip}\@pseudocodecodesize{}}{%
+\ifthenelse{\equal{\@withingame}{true}}
+ {\ifthenelse{\equal{\@pc@secondheader}{true}}
+ {\@pc@display@gameheader{#1}\addtocounter{pcgamecounter}{1}\fboxsep=1pt\fbox{\vphantom{#1}\@pc@display@gameheader{#1}}}
+ {\@pc@display@gameheader{#1}}}
+ {#1}%
+\@pc@headheightskip\vspace{\pcheadlinesep}\vspace{\@pseudocodeheadlinesep}\@pseudocodeheadlinecmd%
+\vspace{-\baselineskip}\vspace{\pcbodylinesep}\vspace{\@pseudocodebodylinesep}\@pseudocodecodesize}%
+\begin{flalign*}#2\end{flalign*}%
+}
+
+
+\newcommand{\pc@display@subcode}[2]{%
+\begingroup%
+\ifthenelse{\equal{#1}{}}{}{#1\@pc@headheightskip%
+\vspace{\pcheadlinesep}\vspace{\@pseudocodeheadlinesep}\@pseudocodeheadlinecmd{}%
+\vspace{\pcbodylinesep}\vspace{\@pseudocodebodylinesep}}%
+\@pseudocodesubcodesize%
+$\begin{aligned}#2\end{aligned}$%
+\endgroup%
+}
+
+
+\newcommand{\@pc@gettikzwidth}[2]{ % #1 = width, #2 = height
+ \pgfextractx{\@tempdima}{\pgfpointdiff{\pgfpointanchor{current bounding box}{south west}}
+ {\pgfpointanchor{current bounding box}{north east}}}
+ \global#1=\@tempdima
+ \pgfextracty{\@tempdima}{\pgfpointdiff{\pgfpointanchor{current bounding box}{south west}}
+ {\pgfpointanchor{current bounding box}{north east}}}
+ \global#2=\@tempdima
+}
+
+
+% \end{macrocode}
+%
+% \subsection{Create Pseudocode/Procedure Commands}
+%
+% \begin{macrocode}
+%
+% parameter reordering
+\def\@pseudocodeB#1#2[#3]#4{\setkeys*{pcspace}{#2,#3}\@pseudocode[head={#1#4},#2,#3]}
+\def\@pseudocodeC#1#2#3{\setkeys*{pcspace}{#2}\@pseudocode[head={#1#3},#2]}
+%for no headers
+\def\@pseudocodeE#1#2[#3]{\setkeys*{pcspace}{#2,#3}\@pseudocode[head={#1},#2,#3]}
+\def\@pseudocodeF#1#2{\setkeys*{pcspace}{#2}\@pseudocode[head={#1},#2]}
+%
+% \end{macrocode}
+%
+%\begin{macro}{\createprocedurecommand}
+% Define pseudocode command with parameters:
+% \begin{enumerate}
+% \item name
+% \item code to execute after begingroup
+% \item head prefix
+% \item other config
+% \end{enumerate}
+% \begin{macrocode}
+\newcommand*{\@pc@createproc@headmode}{text}
+\newcommand{\createprocedurecommand}[4]{
+ \expandafter\gdef\csname #1\endcsname{%
+\begingroup%
+\renewcommand{\@withinspaces}{false}%
+#2%
+\@ifnextchar[%]
+ {\@pseudocodeB{#3}{#4}}
+ {\@pseudocodeC{#3}{#4}}%
+}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{\createpseudocodecommand}
+% \begin{macrocode}
+\newcommand{\createpseudocodecommand}[4]{
+ \expandafter\gdef\csname #1\endcsname{%
+\begingroup%
+\renewcommand{\@withinspaces}{false}%
+#2%
+\@ifnextchar[%]
+ {\@pseudocodeE{#3}{#4}}
+ {\@pseudocodeF{#3}{#4}}%
+}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%
+%
+%
+%\begin{macro}{\createpseudocodeblock}
+% Creates a command that has pseudocode wrapped in an |\pchstack|.
+% \item name
+% \item options for |\pchstack|
+% \item code to execute after begingroup
+% \item head prefix
+% \item other config
+% \begin{macrocode}
+\newcommand{\createpseudocodeblock}[5]{
+\createpseudocodecommand{#1@pc}{#3}{#4}{#5}
+\expandafter\gdef\csname #1\endcsname{%
+\@ifnextchar[%]
+ {\csname #1@@\endcsname}
+ {\csname #1@\endcsname}
+}%
+\expandafter\gdef\csname #1@\endcsname##1{%
+\begin{pchstack}[#2]
+\csname #1@pc\endcsname{##1}
+\end{pchstack}
+}
+\expandafter\gdef\csname #1@@\endcsname[##1]##2{%
+\begin{pchstack}[#2]
+\csname #1@pc\endcsname[##1]{##2}
+\end{pchstack}
+}
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{\createprocedureblock}
+% Creates a command that has procedure wrapped in an |\pchstack|.
+% \item name
+% \item options for |\pchstack|
+% \item code to execute after begingroup
+% \item head prefix
+% \item other config
+% \begin{macrocode}
+\newcommand{\createprocedureblock}[5]{
+\createprocedurecommand{#1@pc}{#3}{#4}{#5}
+\expandafter\gdef\csname #1\endcsname{%
+\@ifnextchar[%]
+ {\csname #1@@\endcsname}
+ {\csname #1@\endcsname}
+}%
+\expandafter\gdef\csname #1@\endcsname##1##2{%
+\begin{pchstack}[#2]
+\csname #1@pc\endcsname{##1}{##2}
+\end{pchstack}
+}
+\expandafter\gdef\csname #1@@\endcsname[##1]##2##3{%
+\begin{pchstack}[#2]
+\csname #1@pc\endcsname[##1]{##2}{##3}
+\end{pchstack}
+}
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{\procedure}
+%\begin{macro}{\pseudocodeblock}
+%\begin{macro}{\procedureblock}
+% Create |\procedure| command.
+% \begin{macrocode}
+\createprocedurecommand{procedure}{}{}{}
+\createpseudocodeblock{pseudocodeblock}{center}{}{}{}
+\createprocedureblock{procedureblock}{center}{}{}{}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+% \subsection{Subprocedures}
+%
+% \begin{macrocode}
+
+%
+% subprocedures
+\newcounter{@pcsubprogcnt1}
+\newcounter{@pcrsubprogcnt1}
+\newcounter{@pcsubprogcnt2}
+\newcounter{@pcrsubprogcnt2}
+\newcounter{@pcsubprogcnt3}
+\newcounter{@pcrsubprogcnt3}
+\newcounter{@pcsubprogcnt4}
+\newcounter{@pcrsubprogcnt4}
+\newcounter{@pcsubprogcnt5}
+\newcounter{@pcrsubprogcnt5}
+\newcounter{@pcsubprogcnt6}
+\newcounter{@pcrsubprogcnt6}
+\newcounter{@pcsubprogcnt7}
+\newcounter{@pcrsubprogcnt7}
+\newcounter{@pcsubprogcnt8}
+\newcounter{@pcrsubprogcnt8}
+\newcounter{@pcsubprogcnt9}
+\newcounter{@pcrsubprogcnt9}
+\newcounter{@pcsubprogstep}
+
+\newenvironment{subprocedure}{%
+\addtocounter{@pcsubprogstep}{1}%
+% store old counter values
+\setcounter{@pcsubprogcnt\the@pcsubprogstep}{\value{pclinenumber}}%
+\setcounter{@pcrsubprogcnt\the@pcsubprogstep}{\value{pcrlinenumber}}%
+}{%
+\setcounter{pclinenumber}{\value{@pcsubprogcnt\the@pcsubprogstep}}%
+\setcounter{pcrlinenumber}{\value{@pcrsubprogcnt\the@pcsubprogstep}}%
+\addtocounter{@pcsubprogstep}{-1}}
+
+
+% \end{macrocode}
+%
+% \subsection{Protocols}
+%
+% \begin{macrocode}
+
+%
+% send message
+\newcommand{\pcshortmessageoffset}{0.5cm}
+\newcommand{\pcdefaultmessagelength}{3.5cm}
+\newcommand{\pcdefaultlongmessagelength}{6cm}
+\newcommand{\pcbeforemessageskip}{0pt}
+\newcommand{\pcaftermessageskip}{10pt}
+\newlength{\pcmessagearrow}
+
+\newcommand*\@pcsendmessagelength{\pcdefaultmessagelength}
+\newcommand*\@pcsendmessagecol{}
+\newcommand*\@pcsendmessagewidth{}
+\newcommand*\@pcsendmessagestyle{}
+\newcommand*\@pcsendmessagetop{}
+\newcommand*\@pcsendmessagebottom{}
+\newcommand*\@pcsendmessageright{}
+\newcommand*\@pcsendmessageleft{}
+\newcommand*\@pcsendmessagetopname{t}
+\newcommand*\@pcsendmessagebottomname{b}
+\newcommand*\@pcsendmessagerightname{r}
+\newcommand*\@pcsendmessageleftname{l}
+\newcommand*\@pcsendmessagetopstyle{}
+\newcommand*\@pcsendmessagebottomstyle{}
+\newcommand*\@pcsendmessagerightstyle{}
+\newcommand*\@pcsendmessageleftstyle{}
+\newcommand*\@pcsendmessagebeforeskip{\pcbeforemessageskip}
+\newcommand*\@pcsendmessageafterskip{\pcaftermessageskip}
+
+\define@key{pcsendmessage}{centercol}[]{\renewcommand*\@pcsendmessagecol{#1}}
+\define@key{pcsendmessage}{width}[]{\renewcommand*\@pcsendmessagewidth{#1}}
+\define@key{pcsendmessage}{style}[]{\renewcommand*\@pcsendmessagestyle{#1}}
+\define@key{pcsendmessage}{length}[]{\renewcommand*\@pcsendmessagelength{#1}}
+\define@key{pcsendmessage}{top}[]{\renewcommand*\@pcsendmessagetop{#1}}
+\define@key{pcsendmessage}{bottom}[]{\renewcommand*\@pcsendmessagebottom{#1}}
+\define@key{pcsendmessage}{right}[]{\renewcommand*\@pcsendmessageright{#1}}
+\define@key{pcsendmessage}{left}[]{\renewcommand*\@pcsendmessageleft{#1}}
+\define@key{pcsendmessage}{topname}[]{\renewcommand*\@pcsendmessagetopname{#1}}
+\define@key{pcsendmessage}{bottomname}[]{\renewcommand*\@pcsendmessagebottomname{#1}}
+\define@key{pcsendmessage}{rightname}[]{\renewcommand*\@pcsendmessagerightname{#1}}
+\define@key{pcsendmessage}{leftname}[]{\renewcommand*\@pcsendmessageleftname{#1}}
+\define@key{pcsendmessage}{topstyle}[]{\renewcommand*\@pcsendmessagetopstyle{#1}}
+\define@key{pcsendmessage}{bottomstyle}[]{\renewcommand*\@pcsendmessagebottomstyle{#1}}
+\define@key{pcsendmessage}{rightstyle}[]{\renewcommand*\@pcsendmessagerightstyle{#1}}
+\define@key{pcsendmessage}{leftstyle}[]{\renewcommand*\@pcsendmessageleftstyle{#1}}
+\define@key{pcsendmessage}{beforeskip}[]{\renewcommand*\@pcsendmessagebeforeskip{#1}}
+\define@key{pcsendmessage}{afterskip}[]{\renewcommand*\@pcsendmessageafterskip{#1}}
+
+\newcommand*\@pcsendmessagealignedtop{false}
+\define@key{pcsendmessage}{topaligned}[true]{\renewcommand*\@pcsendmessagealignedtop{#1}}
+\newcommand*\@pcsendmessagealignedbottom{false}
+\define@key{pcsendmessage}{bottomaligned}[true]{\renewcommand*\@pcsendmessagealignedbottom{#1}}
+\newcommand*\@pcsendmessagealignedleft{false}
+\define@key{pcsendmessage}{leftaligned}[true]{\renewcommand*\@pcsendmessagealignedleft{#1}}
+\newcommand*\@pcsendmessagealignedright{false}
+\define@key{pcsendmessage}{rightaligned}[true]{\renewcommand*\@pcsendmessagealignedright{#1}}
+
+
+\newcommand{\@pc@centerincol}[2]{%
+\ifmeasuring@%
+#2%
+\else%
+\makebox[\ifcase\expandafter #1\maxcolumn@widths\fi]{$\displaystyle#2$}%
+\fi%
+}
+
+\newcommand{\centerincol}[1]{\@pc@centerincol{\thepccolumncounter}{#1}}
+
+\newcommand{\@do@sendmessage}[1]{%
+\ifthenelse{\equal{\@pcsendmessagecol}{}}{%
+\ifthenelse{\equal{\@pcsendmessagewidth}{}}{#1}{% we have some width
+\makebox[\@pcsendmessagewidth]{$\displaystyle#1$}%
+}}{%we know the column to center on
+\@pc@centerincol{\@pcsendmessagecol}{#1}%
+}%
+}
+
+\newcommand*{\sendmessage}[2]{%
+\begingroup\setkeys{pcsendmessage}{#2}%
+\tikzset{PCSENDMSG-PATH-STYLE/.style/.expand once=\@pcsendmessagestyle}%
+\tikzset{PCSENDMSG-TOP-STYLE/.style/.expand once=\@pcsendmessagetopstyle}%
+\tikzset{PCSENDMSG-BOTTOM-STYLE/.style/.expand once=\@pcsendmessagebottomstyle}%
+\tikzset{PCSENDMSG-LEFT-STYLE/.style/.expand once=\@pcsendmessageleftstyle}%
+\tikzset{PCSENDMSG-RIGHT-STYLE/.style/.expand once=\@pcsendmessagerightstyle}%
+%
+%
+\ifthenelse{\equal{\@pcsendmessagealignedtop}{true}}
+{\ifthenelse{\equal{\@pcsendmessagetop}{}}
+ {\let\@pc@fin@sendmessagetop\@pcsendmessagetop}%
+ {\newcommand{\@pc@fin@sendmessagetop}{\let\halign\@pc@halign$\begin{aligned}\@pcsendmessagetop\end{aligned}$}}}
+ {\let\@pc@fin@sendmessagetop\@pcsendmessagetop}%
+%
+\ifthenelse{\equal{\@pcsendmessagealignedbottom}{true}}
+{\ifthenelse{\equal{\@pcsendmessagebottom}{}}
+ {\let\@pc@fin@sendmessagebottom\@pcsendmessagebottom}%
+ {\newcommand{\@pc@fin@sendmessagebottom}{\let\halign\@pc@halign$\begin{aligned}\@pcsendmessagebottom\end{aligned}$}}}
+ {\let\@pc@fin@sendmessagebottom\@pcsendmessagebottom}%
+%
+\ifthenelse{\equal{\@pcsendmessagealignedright}{true}}
+{\ifthenelse{\equal{\@pcsendmessageright}{}}
+ {\let\@pc@fin@sendmessageright\@pcsendmessageright}
+ {\newcommand{\@pc@finsendmessageright}{\let\halign\@pc@halign$\begin{aligned}\@pcsendmessageright\end{aligned}$}}}
+ {\let\@pc@fin@sendmessageright\@pcsendmessageright}%
+%
+\ifthenelse{\equal{\@pcsendmessagealignedleft}{true}}
+{\ifthenelse{\equal{\@pcsendmessageleft}{}}
+ {\let\@pc@fin@sendmessageleft\@pcsendmessageleft}
+ {\newcommand{\@pc@fin@sendmessageleft}{\let\halign\@pc@halign$\begin{aligned}\@pcsendmessageleft\end{aligned}$}}}
+ {\let\@pc@fin@sendmessageleft\@pcsendmessageleft}%
+%restore halign
+%
+\addtocounter{@pcsubprogstep}{1}%
+\hspace{\@pcsendmessagebeforeskip}%
+\begin{varwidth}{\linewidth}
+\@do@sendmessage{
+ \begin{tikzpicture}%
+ \node[PCSENDMSG-LEFT-STYLE] (\@pcsendmessageleftname) {\@pc@fin@sendmessageleft};
+ \node[right=\@pcsendmessagelength of \@pcsendmessageleftname,PCSENDMSG-RIGHT-STYLE] (\@pcsendmessagerightname) {\@pc@fin@sendmessageright};
+ \path[#1,PCSENDMSG-PATH-STYLE] (\@pcsendmessageleftname) edge[] node[above,PCSENDMSG-TOP-STYLE] (\@pcsendmessagetopname) {\@pc@fin@sendmessagetop} node[below,PCSENDMSG-BOTTOM-STYLE] (\@pcsendmessagebottomname) {\@pc@fin@sendmessagebottom} (\@pcsendmessagerightname);
+ \end{tikzpicture}%
+}%
+\end{varwidth}
+\addtocounter{@pcsubprogstep}{-1}%
+\hspace{\@pcsendmessageafterskip}%
+\endgroup%
+}
+
+\WithSuffix\newcommand\sendmessage*[2]{%
+\sendmessage{#1}{topaligned,leftaligned,bottomaligned,rightaligned,#2}%
+}
+
+\newcommandx*{\sendmessageright}[2][1=->]{%
+\sendmessage{#1}{#2}%
+}
+
+\newcommandx*{\sendmessageleft}[2][1=<-]{%
+\sendmessage{#1}{#2}%
+}
+
+\WithSuffix\newcommand\sendmessageleft*[2][\pcdefaultmessagelength]{%
+\begingroup%
+\renewcommand{\@pcsendmessagetop}{\let\halign\@pc@halign$\begin{aligned}#2\end{aligned}$}%
+\sendmessage{<-}{length=#1}%
+\endgroup%
+}
+
+
+\WithSuffix\newcommand\sendmessageright*[2][\pcdefaultmessagelength]{%
+\begingroup%
+\renewcommand{\@pcsendmessagetop}{\let\halign\@pc@halign$\begin{aligned}#2\end{aligned}$}%
+\sendmessage{->}{length=#1}%
+\endgroup%
+}
+
+\WithSuffix\newcommand\sendmessagerightleft*[2][\pcdefaultmessagelength]{%
+\begingroup%
+\renewcommand{\@pcsendmessagetop}{\let\halign\@pc@halign$\begin{aligned}#2\end{aligned}$}%
+\sendmessage{<->}{length=#1}%
+\endgroup%
+}
+
+\DeclareExpandableDocumentCommand{\sendmessagerightx}{O{\pcdefaultlongmessagelength}mO{}m}{%
+\multicolumn{#2}{c}{\ensuremath{\hspace{\pcbeforemessageskip}\xrightarrow[\begin{aligned}#3\end{aligned}]{\mathmakebox[#1]{\begin{aligned}#4\end{aligned}}}\hspace{\pcaftermessageskip}}}
+}
+
+\DeclareExpandableDocumentCommand{\sendmessageleftx}{O{\pcdefaultlongmessagelength}mO{}m}{%
+\multicolumn{#2}{c}{\ensuremath{\hspace{\pcbeforemessageskip}\xleftarrow[\begin{aligned}#3\end{aligned}]{\mathmakebox[#1]{\begin{aligned}#4\end{aligned}}}\hspace{\pcaftermessageskip}}}
+}
+
+%
+% Division
+\DeclareExpandableDocumentCommand{\pcintertext}{O{}m}{\intertext{%
+\ifthenelse{\equal{#1}{center}}{\makebox[\linewidth][c]{#2}}{}%
+\ifthenelse{\equal{#1}{dotted}}{\dotfill#2\dotfill}{}%
+\ifthenelse{\equal{#1}{}}{#2}{}%
+}\@pc@beginnewline}
+
+
+
+% \end{macrocode}
+%
+% \subsection{Tikz within Pseudocode}
+%
+% \begin{macrocode}
+
+%
+% remember pictues
+\newcounter{@pc@remember}
+
+\newcommand{\@pc@ensureremember}{%
+\ifthenelse{\value{@pc@remember}=0}{\tikzstyle{every picture}+=[remember picture]}{}%
+\addtocounter{@pc@remember}{1}}
+
+\newcommand{\@pc@releaseremember}{%
+\addtocounter{@pc@remember}{-1}%
+\ifthenelse{\value{@pc@remember}=0}{\tikzstyle{every picture}-=[remember picture]}{}%
+}
+
+
+%
+% pcimage
+\newenvironment{pcimage}{%
+\begingroup\@pc@ensureremember%
+}{%
+\@pc@releaseremember\endgroup%
+}
+
+\newcommand*\@pcnodecontent{}
+\newcommand*\@pcnodestyle{}
+\newcommand*\@pcnodedraw{}
+\define@key{pcnode}{content}[]{\renewcommand*\@pcnodecontent{#1}}
+\define@key{pcnode}{style}[]{\renewcommand*\@pcnodestyle{#1}}
+\define@key{pcnode}{draw}[]{\renewcommand*\@pcnodedraw{#1}}
+
+\newcommandx*{\pcnode}[2][2=]{%
+\begingroup\setkeys{pcnode}{#2}%
+\tikzset{PCNODE-STYLE/.style/.expand once=\@pcnodestyle}%
+\begin{tikzpicture}[inner sep=0ex,baseline=0pt]%
+\node[PCNODE-STYLE] (#1) {\@pcnodecontent}; %
+\end{tikzpicture}%
+\ifdefempty{\@pcnodedraw}{}{%
+\begin{tikzpicture}[overlay,inner sep=0ex,baseline=0pt]\@pcnodedraw\end{tikzpicture}
+}%
+\endgroup}
+
+\newcommandx*{\pcdraw}[2][2=]{%
+\begin{tikzpicture}[overlay,inner sep=0ex,baseline=0pt,#2]
+#1
+\end{tikzpicture}}
+
+% \end{macrocode}
+%
+% \subsection{Black Box Reductions}
+%
+% \begin{macrocode}
+
+%
+% Reductions
+\newcommand{\@bb@lastbox}{}
+\newcommand{\@bb@lastoracle}{}
+\newcommand{\@bb@lastchallenger}{}
+
+\newlength{\@bb@message@voffset}
+\newlength{\@bb@query@voffset}
+\newlength{\@bb@oraclequery@voffset}
+\newlength{\@bb@challengerquery@voffset}
+
+\newcounter{@bb@oracle@cnt}
+\newcounter{@bb@oracle@nestcnt}
+\newcounter{@bb@challenger@cnt}
+\newcounter{@bb@challenger@nestcnt}
+
+\newcounter{@bb@env@nestcnt}
+
+\newcommand{\bbroraclenodenameprefix}{ora-}
+\newcommand{\bbrchallengernodenameprefix}{challenger-}
+\newcommand{\bbrenvnodenameprefix}{env-}
+% \end{macrocode}
+
+
+
+%\begin{macro}{aboveskip}
+%\begin{macro}{\@pc@bbrenvaboveskip}
+% \begin{macrocode}
+\newcommand*\@pc@bbrenvaboveskip{0pt}
+\define@key{pcbbrenv}{aboveskip}[0pt]{\renewcommand*\@pc@bbrenvaboveskip{#1}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{belowskip}
+%\begin{macro}{\@pc@bbrenvbelowskip}
+% \begin{macrocode}
+\newcommand*\@pc@bbrenvbelowskip{0pt}
+\define@key{pcbbrenv}{belowskip}[0pt]{\renewcommand*\@pc@bbrenvbelowskip{#1}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+
+%\begin{macro}{\@pc@bbrenv@legacyargcheck}
+%\begin{macro}{\@pc@bbrenv@argstring}
+% ensures that first command can still be 5cm which is rewritten as aboveskip=5cm
+% \begin{macrocode}
+\newcommand*\@pc@bbrenv@argstring{}
+\def\@pc@bbrenv@remfinalequals#1=#2=\relax{\renewcommand*\@pc@bbrenv@argstring{#1=#2}}
+\def\@pc@bbrenv@legacyargcheck#1=#2\relax{%
+\ifthenelse{\equal{#2}{}}
+ {\PackageWarning{cryptocode}{Deprecated option for bbrenv. Please use key value list as first parameter with keys aboveskip and/or belowskip.}%
+\renewcommand*\@pc@bbrenv@argstring{aboveskip=#1}}
+ {\@pc@bbrenv@remfinalequals#1=#2\relax}%
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%\begin{macro}{\bbrfirstmessageoffset}
+% offset of the first message from top
+% \begin{macrocode}
+\providecommand{\bbrfirstmessageoffset}{1ex}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%
+%\begin{environment}{bbrenv}
+% Black Box Reduction Environment
+% \begin{macrocode}
+\newenvironmentx{bbrenv}[3][1={aboveskip=0pt,belowskip=0pt},3=0pt]{%
+\addtocounter{@bb@env@nestcnt}{1}%
+\renewcommand{\@bb@lastbox}{#2}%
+% parse args and allow old style #1=0pt
+\@pc@bbrenv@legacyargcheck#1=\relax%
+\@expandedsetkeys{pcbbrenv}{}{belowskip=#3}{\@pc@bbrenv@argstring}{}%
+%
+% reset lengths
+\@pc@globalsetlength{\@bb@message@voffset}{\bbrfirstmessageoffset}%
+\@pc@globalsetlength{\@bb@query@voffset}{\bbrfirstmessageoffset}%
+\@pc@globalsetlength{\@bb@oraclequery@voffset}{\bbrfirstmessageoffset}%
+\@pc@globalsetlength{\@bb@challengerquery@voffset}{\bbrfirstmessageoffset}%
+%
+%reset oracle counter and oracle query offset
+\ifthenelse{\value{@bb@oracle@nestcnt}=0}
+ {\setcounter{@bb@oracle@cnt}{0}}{}%
+\ifthenelse{\value{@bb@challenger@nestcnt}=0}
+ {\setcounter{@bb@challenger@cnt}{0}}{}%
+%
+\vspace{\@pc@bbrenvaboveskip}%
+\ifthenelse{\value{@bb@env@nestcnt}=1}
+ {\@pc@ensureremember%
+\begin{tikzpicture}
+}{\tikz\bgroup}
+}{%
+\ifthenelse{\value{@bb@env@nestcnt}=1}
+{\end{tikzpicture}%
+\@pc@releaseremember%
+}{\egroup}%
+\vspace{\@pc@bbrenvbelowskip}%
+\addtocounter{@bb@env@nestcnt}{-1}%
+% reset lengths
+\@pc@globalsetlength{\@bb@message@voffset}{\bbrfirstmessageoffset}%
+\@pc@globalsetlength{\@bb@query@voffset}{\bbrfirstmessageoffset}%
+\@pc@globalsetlength{\@bb@oraclequery@voffset}{\bbrfirstmessageoffset}%
+\@pc@globalsetlength{\@bb@challengerquery@voffset}{\bbrfirstmessageoffset}%
+}
+% \end{macrocode}
+%\end{environment}
+
+%
+%
+
+%
+% black box reduction box
+% option keys
+% \begin{macrocode}
+\newcommand*\bbrboxname{}
+\newcommand*\bbrboxnamepos{right}
+\newcommand*\bbrboxnamestyle{}
+\newcommand*\@bbrboxnamepos{below right=0.5ex and -0.5ex of \@bb@lastbox.north east,anchor=north east}
+\newcommand*\bbrboxabovesep{\baselineskip}
+\newcommand*\@bbrboxnameposoffset{below left=\bbrboxabovesep of phantomname.south west}
+\newcommand*\bbrboxstyle{draw}
+\newcommand*\bbrboxafterskip{}
+\newcommand*\bbrboxminheight{0cm}
+\newcommand*\bbrboxminwidth{2cm}
+\newcommand*\bbrboxxshift{0cm}
+\newcommand*\bbrboxyshift{0cm}
+\define@key{bbrbox}{abovesep}[]{\renewcommand*\bbrboxabovesep{#1}}
+\define@key{bbrbox}{name}[]{\renewcommand*\bbrboxname{#1}}
+\define@key{bbrbox}{namestyle}[]{\renewcommand*\bbrboxnamestyle{#1}}
+\define@key{bbrbox}{namepos}[]{\renewcommand*\bbrboxnamepos{#1}}
+\define@key{bbrbox}{style}[draw]{\renewcommand*\bbrboxstyle{#1}}
+\define@key{bbrbox}{minwidth}[]{\renewcommand*\bbrboxminwidth{#1}}
+\define@key{bbrbox}{addheight}[]{\renewcommand*\bbrboxafterskip{#1}}
+\define@key{bbrbox}{minheight}[]{\renewcommand*\bbrboxminheight{#1}}
+\define@key{bbrbox}{xshift}[]{\renewcommand*\bbrboxxshift{#1}}
+\define@key{bbrbox}{yshift}[]{\renewcommand*\bbrboxyshift{#1}}
+
+
+\NewEnviron{bbrbox}[1][]{%
+\setkeys{bbrbox}{#1}%
+
+\ifthenelse{\equal{\bbrboxnamepos}{center}}
+ {\renewcommand{\@bbrboxnamepos}{below=0.5ex of \@bb@lastbox.north,anchor=north}}{}
+\ifthenelse{\equal{\bbrboxnamepos}{left}}
+ {\renewcommand{\@bbrboxnamepos}{below=0.5ex of \@bb@lastbox.north west,anchor=north west}}{}
+\ifthenelse{\equal{\bbrboxnamepos}{top right}}
+ {\renewcommand{\@bbrboxnamepos}{above=0cm of \@bb@lastbox.north east,anchor=south east}\renewcommand{\@bbrboxnameposoffset}{below left=0cm of phantomname.north west}}{}
+\ifthenelse{\equal{\bbrboxnamepos}{top center}}
+ {\renewcommand{\@bbrboxnamepos}{above=0cm of \@bb@lastbox.north,anchor=south}\renewcommand{\@bbrboxnameposoffset}{below left=0cm of phantomname.north west}}{}
+\ifthenelse{\equal{\bbrboxnamepos}{top left}}
+ {\renewcommand{\@bbrboxnamepos}{above=0cm of \@bb@lastbox.north west,anchor=south west}\renewcommand{\@bbrboxnameposoffset}{below left=0cm of phantomname.north west}}{}
+\ifthenelse{\equal{\bbrboxnamepos}{middle}}
+ {\renewcommand{\@bbrboxnamepos}{above=0.5ex of \@bb@lastbox.base,anchor=south}}{}
+\ifthenelse{\equal{\bbrboxnamepos}{bottom}}
+ {\renewcommand{\@bbrboxnamepos}{above=0.5ex of \@bb@lastbox.base,anchor=north}}{}
+
+
+\tikzset{BBRBOXSTYLE/.style/.expand once=\bbrboxstyle}%
+\tikzset{BBRBOXNAMEPOS/.style/.expand once=\@bbrboxnamepos}%
+\tikzset{BBRBOXNAMESTYLE/.style/.expand once=\bbrboxnamestyle}%
+\tikzset{BBRBOXNAMEPOSOFFSET/.style/.expand once=\@bbrboxnameposoffset}%
+
+\coordinate[inner sep=0pt,outer sep=0pt] (\@bb@lastbox-tmpouter) {};
+\node at (\@bb@lastbox-tmpouter) {}; %this empty node seems needed to get the xyshift right.
+\node[inner sep=.3333em,anchor=north,BBRBOXSTYLE,minimum height=\bbrboxminheight,below right=\bbrboxyshift and \bbrboxxshift of \@bb@lastbox-tmpouter] (\@bb@lastbox) \bgroup
+ \tikz{
+ \node[inner sep=0pt,outer sep=0pt,minimum height=0cm] (phantomname) {}; %minimum width
+ \node[BBRBOXNAMEPOSOFFSET,minimum height=0cm] (\@bb@lastbox-inner) {\begin{varwidth}{2\linewidth}\BODY\end{varwidth}};
+ \ifthenelse{\equal{\bbrboxafterskip}{}}{}{
+ \node[below=0cm of \@bb@lastbox-inner,minimum height=\bbrboxafterskip] {};
+ }
+ \node[inner sep=0pt,outer sep=0pt,at=(\@bb@lastbox-inner.south west),minimum height=0cm] () {\phantom{\hspace{\bbrboxminwidth}}}; %minimum width
+ }
+\egroup;
+\ifthenelse{\equal{\bbrboxnamepos}{none}}
+{}{\node[BBRBOXNAMEPOS,BBRBOXNAMESTYLE, inner sep=0.2ex, outer sep=0pt, overlay] () {\bbrboxname};}
+}
+
+
+\newcommand*\bbroraclevdistance{\baselineskip}
+\newcommand*\bbroraclehdistance{1.5cm}
+\define@key{bbroracle}{distance}[]{\renewcommand*\bbroraclehdistance{#1}}
+\define@key{bbroracle}{hdistance}[]{\renewcommand*\bbroraclehdistance{#1}}
+\define@key{bbroracle}{vdistance}[]{\renewcommand*\bbroraclevdistance{#1}}
+
+
+% ORACLES
+\newenvironmentx{bbroracle}[2][2=]{%
+ \begingroup
+ \setkeys{bbroracle}{#2}
+ %reset query boolean. This is a bit crude and does not allow nesting oracles
+ %in oracles but should be good enough
+ \gdef\@bbr@first@oraclequery{true}
+ %add to nesting cout
+ \addtocounter{@bb@oracle@nestcnt}{1}
+ %if first oracle, then put it to the right, else stack them vertically
+ \addtocounter{@bb@oracle@cnt}{1}
+ \ifthenelse{\value{@bb@oracle@cnt}=1}{
+ \setlength{\@bb@tmplength@b}{\bbroraclevdistance-\baselineskip}
+ \node[inner sep=0pt,below right=\@bb@tmplength@b and \bbroraclehdistance of \@bb@lastbox.north east,anchor=north west] (\bbroraclenodenameprefix#1) \bgroup
+ }{
+% compute distance of top of last box to bottom of last oracle
+ \coordinate (@bbtmpcoord) at (\@bb@lastbox.north east);
+ \path (@bbtmpcoord);
+ \pgfgetlastxy{\XCoord}{\YCoordA}
+ \coordinate (@bbtmpcoord) at (\bbroraclenodenameprefix \@bb@lastoracle.south west);
+ \path (@bbtmpcoord);
+ \pgfgetlastxy{\XCoord}{\YCoordB}
+ \setlength{\@bb@tmplength@b}{\YCoordA-\YCoordB+\bbroraclevdistance}
+ \node[inner sep=0pt,below right=\@bb@tmplength@b and \bbroraclehdistance of \@bb@lastbox.north east,anchor=north west] (\bbroraclenodenameprefix#1) \bgroup
+ }
+ \global\def\@bb@lastoracle{#1}
+ \begin{bbrenv}{#1}
+}{
+ \end{bbrenv}
+ \egroup;
+
+ \addtocounter{@bb@oracle@nestcnt}{-1}
+ \endgroup
+}
+
+
+\newcommand*\bbrchallengerhdistance{1.5cm}
+\newcommand*\bbrchallengervdistance{\baselineskip}
+\define@key{bbrchallenger}{distance}[]{\renewcommand*\bbrchallengerhdistance{#1}}
+\define@key{bbrchallenger}{hdistance}[]{\renewcommand*\bbrchallengerhdistance{#1}}
+\define@key{bbrchallenger}{vdistance}[]{\renewcommand*\bbrchallengervdistance{#1}}
+
+
+% Challenger
+\newenvironmentx{bbrchallenger}[2][2=]{%
+\begingroup%
+\setkeys{bbrchallenger}{#2}%
+%reset query boolean. This is a bit crude and does not allow nesting oracles
+%in oracles but should be good enough
+\gdef\@bbr@first@challengerquery{true}%
+%add to nesting cout
+\addtocounter{@bb@challenger@nestcnt}{1}%
+%if first oracle, then put it to the right, else stack them vertically
+\addtocounter{@bb@challenger@cnt}{1}%
+\ifthenelse{\value{@bb@challenger@cnt}=1}{%
+\setlength{\@bb@tmplength@b}{\bbrchallengervdistance-\baselineskip}%
+\node[inner sep=0pt,outer sep=0pt,below left=\@bb@tmplength@b and \bbrchallengerhdistance of \@bb@lastbox.north west,anchor=north east] (\bbrchallengernodenameprefix#1) \bgroup%
+}{%
+\coordinate (@bbtmpcoord) at (\@bb@lastbox.north west);%
+\path (@bbtmpcoord);%
+\pgfgetlastxy{\XCoord}{\YCoordA}%
+\coordinate (@bbtmpcoord) at (\bbrchallengernodenameprefix \@bb@lastchallenger.south east);%
+\path (@bbtmpcoord);%
+\pgfgetlastxy{\XCoord}{\YCoordB}%
+\setlength{\@bb@tmplength@b}{\YCoordA-\YCoordB+\bbrchallengervdistance}%
+\node[inner sep=0pt,below left=\@bb@tmplength@b and \bbrchallengerhdistance of \@bb@lastbox.north west,anchor=north east] (\bbrchallengernodenameprefix#1) \bgroup%
+}%
+\global\def\@bb@lastchallenger{#1}
+\begin{bbrenv}{#1}%
+}{
+\end{bbrenv}%
+\egroup;%
+\addtocounter{@bb@challenger@nestcnt}{-1}%
+\endgroup%
+\let\msgfrom\bbrchallengerqueryto%
+}
+
+
+\newcommand*\bbrinputlength{0.5cm}
+\newcommand*\bbrinputhoffset{0.5cm}
+\newcommand*\bbrinputbottom{}
+\newcommand*\bbrinputtop{}
+\newcommand*\bbrinputedgestyle{}
+\newcommand*\bbrinputtopstyle{}
+\newcommand*\bbrinputbottomstyle{}
+\newcommand*\bbrinputnodestyle{}
+\newcommand*\bbrinputnodename{}
+\define@key{bbrinput}{length}[]{\renewcommand*\bbrinputlength{#1}}
+\define@key{bbrinput}{hoffset}[]{\renewcommand*\bbrinputhoffset{#1}}
+\define@key{bbrinput}{name}[]{\renewcommand*\bbrinputnodename{#1}}
+\define@key{bbrinput}{top}[]{\renewcommand*\bbrinputtop{#1}}
+\define@key{bbrinput}{bottom}[]{\renewcommand*\bbrinputbottom{#1}}
+
+
+\newcommand{\@bb@inputsetup}[1]{
+ %load keys
+ \begingroup % for local keys
+
+ \setkeys{bbrinput}{#1}%
+
+ \tikzset{BBRINPUT-NODESTYLE/.style/.expand once=\bbrinputedgestyle}%
+ \tikzset{BBRINPUT-TOPSTYLE/.style/.expand once=\bbrinputtopstyle}%
+ \tikzset{BBRINPUT-BOTTOMSTYLE/.style/.expand once=\bbrinputbottomstyle}%
+ \tikzset{BBRINPUT-EDGESTYLE/.style/.expand once=\bbrinputedgestyle}%
+
+}
+
+\newcommand{\@bb@inputfinalize}{
+ \endgroup
+}
+
+\newcommandx*{\bbrinput}[2][2=]{%
+\@bb@inputsetup{#2}
+\ifthenelse{\equal{\bbrinputnodename}{}}
+ {\renewcommand{\bbrinputnodename}{\@bb@lastbox-input}}{}
+
+\node[overlay,above right={\bbrinputlength} and {\bbrinputhoffset} of \@bb@lastbox.north west, anchor=south,BBRINPUT-NODESTYLE] (\bbrinputnodename) {#1};
+\path[->] (\bbrinputnodename.south) edge[BBRINPUT-EDGESTYLE] node[above,anchor=east,BBRINPUT-TOPSTYLE] () {\bbrinputtop} node[below,anchor=west,BBRINPUT-BOTTOMSTYLE] () {\bbrinputbottom} (\bbrinputnodename.south|-\@bb@lastbox.north);
+\@bb@inputfinalize
+}
+
+\newcommandx*{\bbroutput}[2][2=]{%
+\@bb@inputsetup{#2}
+\ifthenelse{\equal{\bbrinputnodename}{}}
+ {\renewcommand{\bbrinputnodename}{\@bb@lastbox-output}}{}
+
+\node[overlay,below right={\bbrinputlength} and {\bbrinputhoffset} of \@bb@lastbox.south west, anchor=north] (\bbrinputnodename) {#1};
+\draw[->] (\bbrinputnodename.north|-\@bb@lastbox.south) -- (\bbrinputnodename.north|-\bbrinputnodename.north);
+\@bb@inputfinalize
+}
+
+\newenvironment{bbrpic}[1][]{%
+\begin{tikzpicture}[overlay,inner sep=0ex,baseline=0pt,#1]%
+}{%
+\end{tikzpicture}}
+
+%
+% communication
+%temporary lengths
+\newlength{\@bb@com@tmpoffset}
+\newlength{\@bb@tmplength@b}
+
+%keys
+\newcommand*\@bbrcomsidestyle{}
+\newcommand*\@bbrcomosidestyle{}
+\newcommand*\@bbrcomtopstyle{}
+\newcommand*\@bbrcombottomstyle{}
+\newcommand*\@bbrcomside{}
+\newcommand*\@bbrcomoside{}
+\newcommand*\@bbrcomtop{}
+\newcommand*\@bbrcombottom{}
+\newcommand*\@bbrcomedgestyle{}
+\newcommand*\@bbrcomlength{1.25cm}
+\newcommand*\@bbrcomtopname{bbrcomtop}
+\newcommand*\@bbrcombottomname{bbrcombottom}
+\newcommand*\@bbrcomsidename{bbrcomside}
+\newcommand*\@bbrcomosidename{bbrcomoside}
+\newcommand*\@bbrcombeforeskip{0pt}
+\newcommand*\@bbrcomafterskip{0ex}
+\define@key{bbrcom}{sidestyle}[]{\renewcommand*\@bbrcomsidestyle{#1}}
+\define@key{bbrcom}{osidestyle}[]{\renewcommand*\@bbrcomosidestyle{#1}}
+\define@key{bbrcom}{topstyle}[]{\renewcommand*\@bbrcomtopstyle{#1}}
+\define@key{bbrcom}{bottomstyle}[]{\renewcommand*\@bbrcombottomstyle{#1}}
+\define@key{bbrcom}{side}[]{\renewcommand*\@bbrcomside{#1}}
+\define@key{bbrcom}{oside}[]{\renewcommand*\@bbrcomoside{#1}}
+\define@key{bbrcom}{top}[]{\renewcommand*\@bbrcomtop{#1}}
+\define@key{bbrcom}{bottom}[]{\renewcommand*\@bbrcombottom{#1}}
+\define@key{bbrcom}{edgestyle}[]{\renewcommand*\@bbrcomedgestyle{#1}}
+\define@key{bbrcom}{length}[]{\renewcommand*\@bbrcomlength{#1}}
+\define@key{bbrcom}{topname}[]{\renewcommand*\@bbrcomtopname{#1}}
+\define@key{bbrcom}{bottomname}[]{\renewcommand*\@bbrcombottomname{#1}}
+\define@key{bbrcom}{sidename}[]{\renewcommand*\@bbrcomsidename{#1}}
+\define@key{bbrcom}{osidename}[]{\renewcommand*\@bbrcomosidename{#1}}
+\define@key{bbrcom}{beforeskip}[]{\renewcommand*\@bbrcombeforeskip{#1}}
+\define@key{bbrcom}{aboveskip}[]{\renewcommand*\@bbrcombeforeskip{#1}}
+\define@key{bbrcom}{afterskip}[]{\renewcommand*\@bbrcomafterskip{#1}}
+\define@key{bbrcom}{belowskip}[]{\renewcommand*\@bbrcomafterskip{#1}}
+% \end{macrocode}
+
+
+%\begin{macro}{\@bbrcomfixedoffset}
+%\begin{macro}{\@bbrcomfixedboffset}
+%\begin{macro}{fixedoffset}
+%\begin{macro}{fixedboffset}
+% Provide means for fixed message offset from top or bottom
+% \begin{macrocode}
+\newcommand*\@bbrcomfixedoffset{}
+\newcommand*\@bbrcomfixedboffset{false}
+\define@key{bbrcom}{fixedoffset}[]{\renewcommand*\@bbrcomfixedoffset{#1}}
+\define@key{bbrcom}{fixedboffset}[]{\renewcommand*\@bbrcomfixedoffset{#1}\renewcommand*\@bbrcomfixedboffset{true}}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \begin{macrocode}
+%
+%
+\newcommand*\@bbrbasenodestyle{}
+\newcommand*\@bbrbasenodename{bbrtmpname}
+\define@key{bbrabase}{nodestyle}[]{\renewcommand*\@bbrbasenodestyle{#1}}
+\define@key{bbrabase}{nodename}[]{\renewcommand*\@bbrbasenodename{#1}}
+
+\newcommand*\@bbr@first@msg{true}
+\newcommand*\@bbr@first@query{true}
+\newcommand*\@bbr@first@oraclequery{true}
+\newcommand*\@bbr@first@challengerquery{true}
+
+% \end{macrocode}
+%
+%
+%\begin{macro}{\@bbr@intermessage@skip}
+%\begin{macro}{\@bbr@intermessage@medskip}
+%\begin{macro}{\@bbr@intermessage@shortskip}
+%\begin{macro}{\@bbr@intermessage@veryshortskip}
+% Skip between two messages.
+% \begin{macrocode}
+\newcommand*\@bbr@intermessage@skip{4ex}
+\newcommand*\@bbr@intermessage@veryshortskip{1ex}
+\newcommand*\@bbr@intermessage@shortskip{1.5ex}
+\newcommand*\@bbr@intermessage@medskip{2.5ex}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{islast}
+%\begin{macro}{\@bbrcomislast}
+% Sets the message from the bottom of the box with the same distance as the first message.
+% \begin{macrocode}
+\newcommand*\@bbrcomislast{false}
+\define@key{bbrcom}{islast}[true]{\renewcommand*\@bbrcomislast{#1}}
+
+\newcommand*\@bbrcom@check@islast{%
+\ifthenelse{\equal{\@bbrcomislast}{true}}
+ {\renewcommand*\@bbrcomfixedoffset{\bbrfirstmessageoffset}\renewcommand*\@bbrcomfixedboffset{true}}
+ {}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{\@bbr@lastskip}
+% marker to set whether next skip is a short or a long one
+% \begin{macrocode}
+\def\@bbr@lastskip{0pt}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@bb@comsetup}
+% Sets up communication parameters for message/query commands. Parameters are
+% \marg{key value list}, \marg{length}, \marg{command for adding space}
+% \marg{true if first message}
+% \begin{macrocode}
+\newcommand{\@bb@comsetup}[4]{
+ % check if is first message and mark as false
+ \edef\@tmp@bbr@isfirst{#4}
+ \renewcommand#4{false}
+
+ %load keys
+ \begingroup % for local keys
+
+ \setkeys{bbrcom}{#1}%
+
+ %set styles
+ \tikzset{BBRCOM-SIDESTYLE/.style/.expand once=\@bbrcomsidestyle}%
+ \tikzset{BBRCOM-OSIDESTYLE/.style/.expand once=\@bbrcomosidestyle}%
+ \tikzset{BBRCOM-TOPSTYLE/.style/.expand once=\@bbrcomtopstyle}%
+ \tikzset{BBRCOM-BOTTOMSTYLE/.style/.expand once=\@bbrcombottomstyle}%
+ \tikzset{BBRCOM-EDGESTYLE/.style/.expand once=\@bbrcomedgestyle}%
+
+ \@bbrcom@check@islast{}
+
+ % increase space
+ #3{\@bbrcombeforeskip}
+ \ifthenelse{\equal{\@bbrcomfixedoffset}{}}
+ {
+ \ifthenelse{\equal{\@tmp@bbr@isfirst}{true}}
+ {}{#3{\@bbr@lastskip}}
+
+ \setlength{\@bb@com@tmpoffset}{#2}%
+ }
+ {
+ \setlength{\@bb@com@tmpoffset}{\@bbrcomfixedoffset}%
+ }
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\@bb@comfinalize}
+% \begin{macrocode}
+\newcommand{\@bb@comfinalize}[1]{
+ #1{\@bbrcomafterskip}
+ \endgroup
+ \def\@bbr@lastskip{\@bbr@intermessage@skip}
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{\@bbrmsg}
+% 9 -> true if first message
+% 10 -> anchor from bottom
+% \begin{macrocode}
+\newcommand{\@bbrmsg}[9]{
+ \@bb@comsetup{#1}{#7}{#8}{#9}
+ %
+ \ifthenelse{\equal{\@bbrcomfixedboffset}{true}}
+ {
+ % from bottom
+ \ifthenelse{\equal{#4}{north east}}{\def\@bbr@tmp@bottomanchor{south east}}{}
+ \ifthenelse{\equal{#4}{north west}}{\def\@bbr@tmp@bottomanchor{south west}}{}
+ \node[#3=-\@bb@com@tmpoffset and \@bbrcomlength of \@bb@lastbox.\@bbr@tmp@bottomanchor,anchor=#6,BBRCOM-SIDESTYLE] (\@bbrcomsidename) {\@bbrcomside};
+ }
+ {
+ % from top
+ \node[#3=\@bb@com@tmpoffset and \@bbrcomlength of \@bb@lastbox.#4,anchor=#6,BBRCOM-SIDESTYLE] (\@bbrcomsidename) {\@bbrcomside};
+ }
+ \path[#2] (\@bbrcomsidename.#6) edge[BBRCOM-EDGESTYLE] node[above,BBRCOM-TOPSTYLE] (\@bbrcomtopname) {\@bbrcomtop} node[below,BBRCOM-BOTTOMSTYLE] (\@bbrcombottomname) {\@bbrcombottom} (\@bb@lastbox.#5|-\@bbrcomsidename) -- (\@bb@lastbox.#5|-\@bbrcomsidename) node[inner sep=0pt,outer sep=0pt,BBRCOM-OSIDESTYLE] (\@bbrcomosidename) {};
+ %
+ \@bb@comfinalize{#8}
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\bbrmsgto}
+%\begin{macro}{\bbrmsgfrom}
+%\begin{macro}{\bbrmsgtofrom}
+%\begin{macro}{\bbrmsgfromto}
+% \begin{macrocode}
+\newcommandx{\bbrmsgto}[1]{%
+\@bbrmsg{#1}{->}{below left}{north west}{west}{east}{\@bb@message@voffset}{\bbrmsgspace}{\@bbr@first@msg}
+}
+\newcommandx{\bbrmsgfrom}[1]{%
+\@bbrmsg{#1}{<-}{below left}{north west}{west}{east}{\@bb@message@voffset}{\bbrmsgspace}{\@bbr@first@msg}
+}
+
+\newcommandx{\bbrmsgtofrom}[2]{%
+\bbrmsgto{#1}
+\bbrmsgspace{-\@bbr@intermessage@skip}
+\bbrmsgspace{\@bbr@intermessage@shortskip}
+\bbrmsgfrom{#2}
+\bbrmsgspace{\@bbr@intermessage@medskip}
+}
+
+\newcommandx{\bbrmsgfromto}[2]{%
+\bbrmsgfrom{#1}
+\bbrmsgspace{-\@bbr@intermessage@skip}
+\bbrmsgspace{\@bbr@intermessage@shortskip}
+\bbrmsgto{#2}
+\bbrmsgspace{\@bbr@intermessage@medskip}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{\bbrmsgvdots}
+% \begin{macrocode}
+\newcommandx{\bbrmsgvdots}{%
+ \bbrmsgtxt[xshift=\@bbrcomlength/2,afterskip=\@bbr@intermessage@skip]{$\vdots$}
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\bbrqryto}
+%\begin{macro}{\bbrqryfrom}
+%\begin{macro}{\bbrqrytofrom}
+%\begin{macro}{\bbrqryfromto}
+% \begin{macrocode}
+\newcommandx{\bbrqryto}[1]{%
+\@bbrmsg{#1}{<-}{below right}{north east}{east}{west}{\@bb@query@voffset}{\bbrqryspace}{\@bbr@first@query}
+}
+\newcommandx{\bbrqryfrom}[1]{%
+\@bbrmsg{#1}{->}{below right}{north east}{east}{west}{\@bb@query@voffset}{\bbrqryspace}{\@bbr@first@query}
+}
+
+\newcommand*{\bbrqrytofrom}[2]{%
+\bbrqryto{#1}
+\bbrqryspace{-\@bbr@intermessage@skip}
+\bbrqryspace{\@bbr@intermessage@shortskip}
+\bbrqryfrom{#2}
+\bbrqryspace{\@bbr@intermessage@medskip}
+}
+
+\newcommand*{\bbrqryfromto}[2]{%
+\bbrqryfrom{#1}
+\bbrqryspace{-\@bbr@intermessage@skip}
+\bbrqryspace{\@bbr@intermessage@shortskip}
+\bbrqryto{#2}
+\bbrqryspace{\@bbr@intermessage@medskip}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{\@bbroracleqry}
+% \begin{macrocode}
+\newcommand{\@bbroracleqry}[4]{
+ \@bb@comsetup{#1}{#3}{#4}{\@bbr@first@oraclequery}
+ %
+ \ifthenelse{\equal{\@bbrcomfixedboffset}{true}}
+ {
+ % from bottom
+ \path[#2] (\@bb@lastoracle.south west) -- ++ (0,\@bb@com@tmpoffset) node[inner sep=0pt,outer sep=0pt,anchor=west,BBRCOM-SIDESTYLE] (\@bbrcomsidename){\@bbrcomside} edge[BBRCOM-EDGESTYLE] node[above,BBRCOM-TOPSTYLE] (\@bbrcomtopname) {\@bbrcomtop} node[below,BBRCOM-BOTTOMSTYLE] (\@bbrcombottomname) {\@bbrcombottom} (\@bb@lastbox.east|-\@bbrcomsidename) -- (\@bb@lastbox.east|-\@bbrcomsidename) node[inner sep=0pt,outer sep=0pt,anchor=east,BBRCOM-OSIDESTYLE] (\@bbrcomosidename) {\@bbrcomoside};
+ }
+ {
+ \path[#2] (\@bb@lastoracle.north west) -- ++ (0,-\@bb@com@tmpoffset) node[inner sep=0pt,outer sep=0pt,anchor=west,BBRCOM-SIDESTYLE] (\@bbrcomsidename){\@bbrcomside} edge[BBRCOM-EDGESTYLE] node[above,BBRCOM-TOPSTYLE] (\@bbrcomtopname) {\@bbrcomtop} node[below,BBRCOM-BOTTOMSTYLE] (\@bbrcombottomname) {\@bbrcombottom} (\@bb@lastbox.east|-\@bbrcomsidename) -- (\@bb@lastbox.east|-\@bbrcomsidename) node[inner sep=0pt,outer sep=0pt,anchor=east,BBRCOM-OSIDESTYLE] (\@bbrcomosidename) {\@bbrcomoside};
+ }
+ %
+ \@bb@comfinalize{#4}
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\bbroracleqryto}
+%\begin{macro}{\bbroracleqryfrom}
+%\begin{macro}{\bbroracleqrytofrom}
+%\begin{macro}{\bbroracleqryfromto}
+% \begin{macrocode}
+\newcommand{\bbroracleqryfrom}[1]{
+ \@bbroracleqry{#1}{->}{\@bb@oraclequery@voffset}{\bbroracleqryspace}
+}
+
+\newcommand{\bbroracleqryto}[1]{
+ \@bbroracleqry{#1}{<-}{\@bb@oraclequery@voffset}{\bbroracleqryspace}
+}
+
+\newcommand*{\bbroracleqrytofrom}[2]{%
+\bbroracleqryto{#1}
+\bbroracleqryspace{-\@bbr@intermessage@skip}
+\bbroracleqryspace{\@bbr@intermessage@shortskip}
+\bbroracleqryfrom{#2}
+\bbroracleqryspace{\@bbr@intermessage@medskip}
+}
+
+\newcommand*{\bbroracleqryfromto}[2]{%
+\bbroracleqryfrom{#1}
+\bbroracleqryspace{-\@bbr@intermessage@skip}
+\bbroracleqryspace{\@bbr@intermessage@shortskip}
+\bbroracleqryto{#2}
+\bbroracleqryspace{\@bbr@intermessage@medskip}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{\@bbrchallengerqry}
+% \begin{macrocode}
+\newcommand{\@bbrchallengerqry}[4]{
+ \@bb@comsetup{#1}{#3}{#4}{\@bbr@first@challengerquery}
+ %
+ \ifthenelse{\equal{\@bbrcomfixedboffset}{true}}
+ {
+ \path[#2] (\@bb@lastchallenger.south east) -- ++ (0,\@bb@com@tmpoffset) node[inner sep=0pt,outer sep=0pt,anchor=east,BBRCOM-SIDESTYLE] (\@bbrcomsidename){\@bbrcomside} edge[BBRCOM-EDGESTYLE] node[above,BBRCOM-TOPSTYLE] (\@bbrcomtopname) {\@bbrcomtop} node[below,BBRCOM-BOTTOMSTYLE] (\@bbrcombottomname) {\@bbrcombottom} (\@bb@lastbox.west|-\@bbrcomsidename) -- (\@bb@lastbox.west|-\@bbrcomsidename) node[inner sep=0pt,outer sep=0pt,anchor=west,BBRCOM-OSIDESTYLE] (\@bbrcomosidename) {\@bbrcomoside};
+ }
+ {
+ \path[#2] (\@bb@lastchallenger.north east) -- ++ (0,-\@bb@com@tmpoffset) node[inner sep=0pt,outer sep=0pt,anchor=east,BBRCOM-SIDESTYLE] (\@bbrcomsidename){\@bbrcomside} edge[BBRCOM-EDGESTYLE] node[above,BBRCOM-TOPSTYLE] (\@bbrcomtopname) {\@bbrcomtop} node[below,BBRCOM-BOTTOMSTYLE] (\@bbrcombottomname) {\@bbrcombottom} (\@bb@lastbox.west|-\@bbrcomsidename) -- (\@bb@lastbox.west|-\@bbrcomsidename) node[inner sep=0pt,outer sep=0pt,anchor=west,BBRCOM-OSIDESTYLE] (\@bbrcomosidename) {\@bbrcomoside};
+ }
+ %
+ \@bb@comfinalize{#4}
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%
+%\begin{macro}{\bbroracleqryto}
+%\begin{macro}{\bbroracleqryfrom}
+%\begin{macro}{\bbroracleqrytofrom}
+%\begin{macro}{\bbroracleqryfromto}
+% \begin{macrocode}
+\newcommand{\bbrchallengerqryfrom}[1]{
+ \@bbrchallengerqry{#1}{<-}{\@bb@challengerquery@voffset}{\bbrchallengerqryspace}
+}
+
+\newcommand{\bbrchallengerqryto}[1]{
+ \@bbrchallengerqry{#1}{->}{\@bb@challengerquery@voffset}{\bbrchallengerqryspace}
+}
+
+\newcommand*{\bbrchallengerqrytofrom}[2]{%
+\bbrchallengerqryto{#1}
+\bbrchallengerqryspace{-\@bbr@intermessage@skip}
+\bbrchallengerqryspace{\@bbr@intermessage@shortskip}
+\bbrchallengerqryfrom{#2}
+\bbrchallengerqryspace{\@bbr@intermessage@medskip}
+}
+
+\newcommand*{\bbrchallengerqryfromto}[2]{%
+\bbrchallengerqryfrom{#1}
+\bbrchallengerqryspace{-\@bbr@intermessage@skip}
+\bbrchallengerqryspace{\@bbr@intermessage@shortskip}
+\bbrchallengerqryto{#2}
+\bbrchallengerqryspace{\@bbr@intermessage@medskip}
+}
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \begin{macrocode}
+
+
+\newcommand*\bbrcomloopleft{}
+\newcommand*\bbrcomloopleftstyle{}
+\newcommand*\bbrcomloopright{}
+\newcommand*\bbrcomlooprightstyle{}
+\newcommand*\bbrcomloopcenter{}
+\newcommand*\bbrcomloopcenterstyle{}
+\newcommand*\bbrcomloopclockwise{false}
+\newcommand*\bbrcomloopangle{50}
+\define@key{bbrcomloop}{left}[]{\renewcommand*\bbrcomloopleft{#1}}
+\define@key{bbrcomloop}{leftstyle}[]{\renewcommand*\bbrcomloopleftstyle{#1}}
+\define@key{bbrcomloop}{right}[]{\renewcommand*\bbrcomloopright{#1}}
+\define@key{bbrcomloop}{rightstyle}[]{\renewcommand*\bbrcomlooprightstyle{#1}}
+\define@key{bbrcomloop}{center}[]{\renewcommand*\bbrcomloopcenter{#1}}
+\define@key{bbrcomloop}{centerstyle}[]{\renewcommand*\bbrcomloopcenterstyle{#1}}
+\define@key{bbrcomloop}{angle}[]{\renewcommand*\bbrcomloopangle{#1}}
+\define@key{bbrcomloop}{clockwise}[true]{\renewcommand*\bbrcomloopclockwise{#1}}
+
+\newcommand{\bbrloop}[3]{
+ \begingroup % for local keys
+ \setkeys{bbrcomloop}{#3}%
+
+ \tikzset{BBRLOOP-LEFTSTYLE/.style/.expand once=\bbrcomloopleftstyle}%
+ \tikzset{BBRLOOP-RIGHTSTYLE/.style/.expand once=\bbrcomlooprightstyle}%
+ \tikzset{BBRLOOP-CENTERSTYLE/.style/.expand once=\bbrcomloopcenterstyle}%
+
+
+ \ifthenelse{\equal{\bbrcomloopclockwise}{true}}
+ {
+ \path[->] (#1) edge[bend left=\bbrcomloopangle] node[midway,left,inner sep=0,outer sep=0,BBRLOOP-LEFTSTYLE] (bbrleft) {\bbrcomloopleft} (#2);
+ \path[->] (#2) edge[bend left=\bbrcomloopangle] node[midway,right,inner sep=0,outer sep=0,BBRLOOP-RIGHTSTYLE] (bbrright) {\bbrcomloopright} (#1);
+ }
+ {
+ \path[->] (#1) edge[bend right=\bbrcomloopangle] node[midway,left,inner sep=0,outer sep=0,] (bbrleft) {\bbrcomloopleft} (#2);
+ \path[->] (#2) edge[bend right=\bbrcomloopangle] node[midway,right,inner sep=0,outer sep=0,] (bbrright) {\bbrcomloopright} (#1);
+ }
+ \node[at=($(bbrleft.west)!0.5!(bbrright.east)$),anchor=center,BBRLOOP-CENTERSTYLE]() {\bbrcomloopcenter};
+
+ \endgroup
+}
+
+\newcommand*\bbrintertexthoffset{1.5cm}
+\define@key{bbrintertext}{xshift}[]{\renewcommand*\bbrintertexthoffset{#1}}
+
+\newcommand{\@bb@intertextsetup}[1]{
+ %load keys
+ \begingroup % for local keys
+
+ % fix align environment (e.g. for use of pseudocode)
+ % ^^A https://tex.stackexchange.com/questions/36954/spurious-space-above-align-environment-at-top-of-page-minipage
+ %\pretocmd\start@align{%
+ %\if@minipage\kern-0.5\abovedisplayskip\fi
+ %}{}{}
+
+ \setkeys{bbrcom,bbrabase,bbrintertext}{#1}%
+ \@bbrcom@check@islast{}
+
+ \tikzset{BBRBASE-NODESTYLE/.style/.expand once=\@bbrbasenodestyle}%
+}
+
+\newcommand{\@bb@intertextfinalize}[1]{
+ #1{\@bbrcomafterskip}
+ \endgroup
+ \def\@bbr@lastskip{\@bbr@intermessage@veryshortskip}
+}
+% \end{macrocode}
+
+%\begin{macro}{\@bbrintertext}
+% 7 -> whether or not this is the first msg/query
+% \begin{macrocode}
+\newcommand{\@bbrintertext}[7]{
+ \edef\@tmp@bbr@isfirst{#7}
+ \renewcommand#7{false}
+
+ \@bb@intertextsetup{#1}
+
+ % increase space
+ #5{\@bbrcombeforeskip}
+ \ifthenelse{\equal{\@bbrcomfixedoffset}{}}
+ {
+ \ifthenelse{\equal{\@tmp@bbr@isfirst}{true}}
+ {}{#5{\@bbr@intermessage@veryshortskip}}
+
+ \setlength{\@bb@com@tmpoffset}{#4}%
+ }
+ {
+ \setlength{\@bb@com@tmpoffset}{\@bbrcomfixedoffset}%
+ }
+
+ %
+ \ifthenelse{\equal{\@bbrcomfixedboffset}{true}}
+ {
+ % from bottom
+ \ifthenelse{\equal{#3}{north east}}{\def\@bbr@tmp@bottomanchor{south east}}{}
+ \ifthenelse{\equal{#3}{north west}}{\def\@bbr@tmp@bottomanchor{south west}}{}
+
+ \node[#2=-\@bb@com@tmpoffset and \bbrintertexthoffset of \@bb@lastbox.\@bbr@tmp@bottomanchor, inner sep=0, outer sep=0, BBRBASE-NODESTYLE] (\@bbrbasenodename) {#6};
+ }
+ {
+ \node[#2=\@bb@com@tmpoffset and \bbrintertexthoffset of \@bb@lastbox.#3, inner sep=0, outer sep=0, BBRBASE-NODESTYLE] (\@bbrbasenodename) {#6};
+ }
+ %
+ % compute height of node
+ \coordinate (@bbtmpcoord) at (\@bbrbasenodename.north);
+ \path (@bbtmpcoord);
+ \pgfgetlastxy{\XCoord}{\YCoordA}
+ \coordinate (@bbtmpcoord) at (\@bbrbasenodename.south);
+ \path (@bbtmpcoord);
+ \pgfgetlastxy{\XCoord}{\YCoordB}
+
+ % update voffset
+ \setlength{\@bb@tmplength@b}{\YCoordA-\YCoordB}
+ #5{\the\@bb@tmplength@b}
+
+ \@bb@intertextfinalize{#5}
+}
+% \end{macrocode}
+%\end{macro}
+
+% \begin{macrocode}
+\newcommand{\bbrmsgtxt}[2][]{
+ \@bbrintertext{#1}{below left}{north west}{\@bb@message@voffset}{\bbrmsgspace}{#2}{\@bbr@first@msg}
+}
+
+\newcommand{\bbrqrytxt}[2][]{
+ \@bbrintertext{#1}{below right}{north east}{\@bb@query@voffset}{\bbrqryspace}{#2}{\@bbr@first@query}
+}
+
+\newcommand{\bbrchallengertxt}[2][]{
+\begingroup
+\setlength{\@bb@tmplength@b}{\bbrchallengerhdistance/2}%
+\renewcommand{\bbrintertexthoffset}{\the\@bb@tmplength@b}%
+\@bbrintertext{#1}{below left}{north west}{\@bb@challengerquery@voffset}{\bbrchallengerqryspace}{#2}{\@bbr@first@challengerquery}
+\endgroup
+}
+
+\newcommand{\bbroracletxt}[2][]{
+\begingroup
+\setlength{\@bb@tmplength@b}{\bbroraclehdistance/2}%
+\renewcommand{\bbrintertexthoffset}{\the\@bb@tmplength@b}%
+\@bbrintertext{#1}{below left}{north west}{\@bb@oraclequery@voffset}{\bbroracleqryspace}{#2}{\@bbr@first@oraclequery}
+\endgroup
+}
+
+\newcommand{\bbrmsgspace}[1]{
+\@pc@globaladdtolength{\@bb@message@voffset}{#1}
+}
+
+\newcommand{\bbrqryspace}[1]{
+\@pc@globaladdtolength{\@bb@query@voffset}{#1}
+}
+
+\newcommand{\bbroracleqryspace}[1]{
+\@pc@globaladdtolength{\@bb@oraclequery@voffset}{#1}
+}
+
+\newcommand{\bbrchallengerqryspace}[1]{
+\@pc@globaladdtolength{\@bb@challengerquery@voffset}{#1}
+}
+
+
+% \end{macrocode}
+%
+% \subsection{Game-Based Proofs}
+%
+% \begin{macrocode}
+
+\newcounter{pcstartgamecounter}
+%
+%
+% \end{macrocode}
+%
+%
+%\begin{macro}{gamechange}
+% Highlighting of changes between games. Highlight color can be set via
+% |\gamechangecolor|
+% \begin{macrocode}
+\definecolor{gamechangecolor}{gray}{0.90}
+\newcommand{\gamechange}[2][gamechangecolor]{%
+{\setlength{\fboxsep}{0pt}\colorbox{#1}{\ifmmode$\displaystyle#2$\else#2\fi}}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\pcbox}
+% A simple box for conditional (ie., boxed) lines.
+% \begin{macrocode}
+\newcommand{\pcbox}[1]{%
+{\setlength{\fboxsep}{3pt}\fbox{$\displaystyle#1$}}
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%
+%
+%\begin{macro}{\pcgame}
+%\begin{macro}{\pcgamename}
+%\begin{macro}{\pcgameprocedurestyle}
+% \begin{macrocode}
+\newcommand*{\pcgamename}{Game}
+\newcommand*{\pcgameprocedurestyle}[1]{\ensuremath{\mathsf{#1}}}
+
+\def\pcgame{\bgroup\pcgame@}
+\newcommand{\pcgame@}[1][]{\ifthenelse{\equal{#1}{}}{\pcgame@@}{\pcgame@@@{#1}}}
+\def\pcgame@@{\pcgameprocedurestyle{\pcgamename}\egroup}
+\def\pcgame@@@#1{\ensuremath{\pcgameprocedurestyle{\pcgamename_{\normalfont{#1}}}}\egroup}
+
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+%\begin{macro}{\@pc@gametitle}
+% Creates the header/title of a game
+% \begin{macrocode}
+\newcommand\@pc@gametitle[1][]{\ifthenelse{\equal{#1}{}}
+{\ensuremath{\pcgame[\thepcgamecounter]\gameprocedurearg}}
+{\ensuremath{\pcgame[#1]\gameprocedurearg}}}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\gameprocedurearg}
+% \begin{macrocode}
+\newcommand*{\gameprocedurearg}{\ensuremath{(\secpar)}}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{environment}{gameproof}
+% \begin{macrocode}
+\newcommand*\@pcgameproofgamenr{0}
+\define@key{pcgameproof}{nr}[]{\renewcommand*\@pcgameproofgamenr{#1}}
+\define@key{pcgameproof}{name}[]{\renewcommand*\pcgamename{\ensuremath{#1}}}
+\define@key{pcgameproof}{arg}[]{\renewcommand*\gameprocedurearg{\ensuremath{#1}}}
+
+\newenvironment{gameproof}[1][]{%
+\begingroup%
+\setkeys{pcgameproof}{#1}%
+\@pc@ensureremember%
+\setcounter{pcgamecounter}{\@pcgameproofgamenr}%
+\setcounter{pcstartgamecounter}{\@pcgameproofgamenr}\stepcounter{pcstartgamecounter}%
+}{\@pc@releaseremember\endgroup}
+% \end{macrocode}
+%\end{environment}
+%
+%
+%
+% \begin{macrocode}
+\newcommand{\setgameproceduredefaultstyle}[1]{%
+\PackageWarning{cryptocode}{Deprecated command setgameproceduredefaultstyle. Use pcsetargs instead.}%
+\pcsetargs{#1}}
+
+\createpseudocodecommand{gameprocedure}
+ {\addtocounter{pcgamecounter}{1}\renewcommand{\@withingame}{true}}
+ {\@pc@gametitle}
+ {}
+
+\def\@bxgame@pseudocodeA[#1]#2#3{\setkeys*{pcspace}{#1}\renewcommand{\@bxgameheader}{\@pc@gametitle[#2]}%
+\@pseudocode[head=\@pc@gametitle,#1]{#3}}
+\def\@bxgame@pseudocodeB#1#2{\renewcommand{\@bxgameheader}{\@pc@gametitle[#1]}%
+\@pseudocode[head=\@pc@gametitle]{#2}}
+
+\newcommand{\bxgameprocedure}{
+\begingroup%
+\renewcommand{\@withinspaces}{false}%
+\renewcommand{\@withingame}{true}%
+\renewcommand{\@withinbxgame}{true}%
+\stepcounter{pcgamecounter}%
+\@ifnextchar[%]
+ {\@bxgame@pseudocodeA}
+ {\@bxgame@pseudocodeB}%
+}
+
+\newcommand{\@pc@secondheader}{}
+
+%tbx top boxed
+\createpseudocodecommand{tbxgameprocedure}
+ {\addtocounter{pcgamecounter}{1}\renewcommand{\@withingame}{true}%
+\renewcommand{\@pc@secondheader}{true}}
+{\@pc@gametitle}
+{}
+
+
+\newcommand*\@pcgamehopnodestyle{}
+\newcommand*\@pcgamehopedgestyle{bend left}
+\newcommand*\@pcgamehoppathestyle{}
+\newcommand*\@pcgamehophint{}
+\newcommand*\@pcgamehophintbelow{}
+\newcommand*\@pcgamehopinhint{}
+\newcommand*\@pcgamehoplength{1.5cm}
+\define@key{pcgamehop}{nodestyle}[]{\renewcommand*\@pcgamehopnodestyle{#1}}
+\define@key{pcgamehop}{edgestyle}[]{\renewcommand*\@pcgamehopedgestyle{#1}}
+\define@key{pcgamehop}{pathstyle}[]{\renewcommand*\@pcgamehoppathestyle{#1}}
+\define@key{pcgamehop}{hint}[]{\renewcommand*\@pcgamehophint{#1}}
+\define@key{pcgamehop}{belowhint}[]{\renewcommand*\@pcgamehophintbelow{#1}}
+\define@key{pcgamehop}{inhint}[]{\renewcommand*\@pcgamehopinhint{#1}}
+\define@key{pcgamehop}{length}[]{\renewcommand*\@pcgamehoplength{#1}}
+
+
+\newcommand{\@pc@setupgamehop}[1]{
+\begingroup\setkeys{pcgamehop}{#1}%
+\tikzset{GAMEHOP-PATH-STYLE/.style/.expand once=\@pcgamehoppathestyle}%
+\tikzset{GAMEHOP-NODE-STYLE/.style/.expand once=\@pcgamehopnodestyle}%
+\tikzset{GAMEHOP-EDGE-STYLE/.style/.expand once=\@pcgamehopedgestyle}%
+}
+
+\newcommand{\@pc@finalizegamehop}{
+\endgroup
+}
+
+\newcommandx*{\addgamehop}[3]{%
+\begingroup%
+\ifthenelse{#1<#2}%
+ {\ifthenelse{\equal{\@withingamedescription}{true}}%
+ {\renewcommand*\@pcgamehopedgestyle{bend right=20}\renewcommand*\@pcgamehopnodestyle{rotate=90}}{}%
+ }%
+ {\renewcommand*\@pcgamehopedgestyle{bend right}}%
+\@pc@setupgamehop{#3}%
+\begin{tikzpicture}[overlay]%
+\ifthenelse{#1<#2}{%
+ \path[->,GAMEHOP-PATH-STYLE] (gamenode#1) edge[GAMEHOP-EDGE-STYLE] node[above,GAMEHOP-NODE-STYLE] {\@pcgamehophint}
+ node[below,GAMEHOP-NODE-STYLE] {\@pcgamehophintbelow} (gamenode#2);
+}{%
+ \path[->,GAMEHOP-PATH-STYLE] (bgamenode#1) edge[GAMEHOP-EDGE-STYLE] node[above,GAMEHOP-NODE-STYLE] {\@pcgamehophint}
+ node[above,GAMEHOP-NODE-STYLE] {\@pcgamehophintbelow} (bgamenode#2);
+}%
+\end{tikzpicture}%
+\@pc@finalizegamehop%
+\endgroup%
+}
+\newcommandx*{\addstartgamehop}[2][1=\thepcstartgamecounter]{%
+\@pc@setupgamehop{#2}
+\begin{tikzpicture}[overlay]
+ \node[left=\@pcgamehoplength of gamenode#1] (tmpgamenode0) {};
+ \path[->,GAMEHOP-PATH-STYLE] (tmpgamenode0) edge[GAMEHOP-EDGE-STYLE] node[above,GAMEHOP-NODE-STYLE] {\@pcgamehophint}
+ node[below,GAMEHOP-NODE-STYLE] {\@pcgamehophintbelow} (gamenode#1);
+\end{tikzpicture}
+\@pc@finalizegamehop
+}
+\newcommandx*{\addendgamehop}[2][1=\thepcgamecounter]{%
+\@pc@setupgamehop{#2}
+\begin{tikzpicture}[overlay]
+ \node[right=\@pcgamehoplength of gamenode#1] (tmpgamenode#1) {};
+ \path[->,GAMEHOP-PATH-STYLE] (gamenode#1) edge[GAMEHOP-EDGE-STYLE] node[above,GAMEHOP-NODE-STYLE] {\@pcgamehophint}
+ node[below,GAMEHOP-NODE-STYLE] {\@pcgamehophintbelow} (tmpgamenode#1);
+\end{tikzpicture}
+\@pc@finalizegamehop
+}
+\newcommandx*{\addbxgamehop}[3]{%
+\@pc@setupgamehop{#3}
+\begin{tikzpicture}[overlay]
+ \path[->,GAMEHOP-PATH-STYLE] (bgamenode#1) edge[GAMEHOP-EDGE-STYLE] node[above,GAMEHOP-NODE-STYLE]] {\@pcgamehophint}
+ node[below,GAMEHOP-NODE-STYLE] {\@pcgamehophintbelow} (bgamenode#2);
+\end{tikzpicture}
+\@pc@finalizegamehop
+}
+\newcommandx*{\addloopgamehop}[2][1=\thepcgamecounter]{%
+\@pc@setupgamehop{#2}
+\begin{tikzpicture}[overlay]
+ \node (looptemp1) [right=0.5cm of gamenode#1] {};
+ \draw[->,GAMEHOP-PATH-STYLE] (gamenode#1) -- (looptemp1|-gamenode#1) -- node[right,GAMEHOP-NODE-STYLE] {\@pcgamehophint}
+ node[left,GAMEHOP-NODE-STYLE] {\@pcgamehophintbelow} (looptemp1|-bgamenode#1)-- (bgamenode#1);
+\end{tikzpicture}
+\@pc@finalizegamehop
+}
+
+
+% \end{macrocode}
+%
+% \subsubsection{Game Descriptions}
+%
+% \begin{macrocode}
+
+\newenvironment{gamedescription}[1][]{%
+\begingroup%
+\setkeys{pcgameproof}{#1}
+\renewcommand{\@withingamedescription}{true}%
+\@pc@ensureremember%
+\setcounter{pcgamecounter}{\@pcgameproofgamenr}%
+\setcounter{pcstartgamecounter}{\@pcgameproofgamenr}\stepcounter{pcstartgamecounter}%
+\begin{description}%
+}{\end{description}\@pc@releaseremember\endgroup}
+
+\newcommandx*{\describegame}[1][1=]{%
+\addtocounter{pcgamecounter}{1}%
+\item[%
+\pcdraw{
+\gdef\i{\thepcgamecounter}%
+\node[inner sep=0.0em,outer sep=0, xshift=-1ex, yshift=0.5ex] (gamenode\i) {};
+}%
+\@pc@gametitle:]%
+\begingroup\setkeys{pcgamehop}{#1}%
+\ifthenelse{\equal{}{\@pcgamehophint}}
+ {}
+ {\hspace{-0.7ex}\pcdraw{%the -0.7ex is a horrible hack to fix a whitespace issue with tikz (see http://tex.stackexchange.com/questions/22873/tikzpicture-with-overlay-takes-up-space
+\tikzset{GAMEHOP-PATH-STYLE/.style/.expand once=\@pcgamehoppathestyle}%
+\tikzset{GAMEHOP-NODE-STYLE/.style/.expand once=\@pcgamehopnodestyle}%
+\draw[->,GAMEHOP-PATH-STYLE] (gamenode\thepcgamecounter) --++ (0,-\@pcgamehoplength) node[midway,above,xshift=-1mm,rotate=90,GAMEHOP-NODE-STYLE] {\@pcgamehophint};
+}}%
+\ifthenelse{\equal{}{\@pcgamehopinhint}}
+ {}
+ {\hspace{-0.7ex}\pcdraw{%the -0.7ex is a horrible hack to fix a whitespace issue with tikz (see http://tex.stackexchange.com/questions/22873/tikzpicture-with-overlay-takes-up-space
+\tikzset{GAMEHOP-PATH-STYLE/.style/.expand once=\@pcgamehoppathestyle}%
+\tikzset{GAMEHOP-NODE-STYLE/.style/.expand once=\@pcgamehopnodestyle}%
+\draw[<-,GAMEHOP-PATH-STYLE] (gamenode\thepcgamecounter) --++ (0,\@pcgamehoplength) node[midway,above,xshift=-1mm,rotate=90,GAMEHOP-NODE-STYLE] {\@pcgamehopinhint};
+}%
+}%
+\endgroup%
+}
+%
+% \end{macrocode}
+%
+%
+%
+% \begin{macrocode}
+%</cryptocode.sty>
+% \end{macrocode}
+%\Finale \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/cryptocode/cryptocode.ins b/Master/texmf-dist/source/latex/cryptocode/cryptocode.ins
new file mode 100644
index 00000000000..381b5eebb3e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/cryptocode/cryptocode.ins
@@ -0,0 +1,32 @@
+% cryptocode.ins generated using makedtx version 1.2 2020/6/20 20:14
+\input docstrip
+
+\preamble
+
+ cryptocode.dtx
+ Copyright 2020 Mittelbach, Arno
+
+ 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
+ http://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 Mittelbach, Arno.
+
+ This work consists of the files cryptocode.dtx and cryptocode.ins and the derived files
+ cryptocode.sty and cryptocode.pdf.
+
+\endpreamble
+
+\askforoverwritefalse
+
+\generate{\file{cryptocode.sty}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{cryptocode.dtx}{cryptocode.sty,package}}
+}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/ctex/ctex-zhconv-make.lua b/Master/texmf-dist/source/latex/ctex/ctex-zhconv-make.lua
new file mode 100644
index 00000000000..4b6f1bf8a4b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/ctex/ctex-zhconv-make.lua
@@ -0,0 +1,114 @@
+#!/usr/bin/env texlua
+--
+-- File ctex-zhconv-make.lua
+--
+-- Copyright (C) 2020 by Qing Lee <sobenlee@gmail.com>
+--------------------------------------------------------------------------
+--
+-- 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. This version of this license is in
+-- http://www.latex-project.org/lppl/lppl-1-3c.txt
+-- and the latest version of this license is in
+-- http://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 Qing Lee.
+--
+-- This work consists of the files ctex-zhconv.lua, ctex-zhconv-make.lua
+-- and the derived file ctex-zhconv-index.lua.
+--
+--------------------------------------------------------------------------
+--
+
+local preamble = [[
+--
+-- File ctex-zhconv-index.lua
+--
+-- Copyright (C) 2020 by Qing Lee <sobenlee@gmail.com>
+--------------------------------------------------------------------------
+--
+-- 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. This version of this license is in
+-- http://www.latex-project.org/lppl/lppl-1-3c.txt
+-- and the latest version of this license is in
+-- http://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 Qing Lee.
+--
+-- This work consists of the files ctex-zhconv.lua, ctex-zhconv-make.lua
+-- and the derived file ctex-zhconv-index.lua.
+--
+--------------------------------------------------------------------------
+--
+-- Do not edit this file!
+-- Generated from the WHATWG Encoding Standard:
+--
+-- https://encoding.spec.whatwg.org/index-big5.txt (Date: %s)
+-- https://encoding.spec.whatwg.org/index-gb18030.txt (Date: %s)
+-- https://encoding.spec.whatwg.org/index-gb18030-ranges.txt (Date: %s)
+--
+--
+]]
+
+local rep, format, dump = string.rep, string.format, string.dump
+local insert, unpack, concat = table.insert, table.unpack, table.concat
+local io_open, os_execute = io.open, os.execute
+
+local curlcmd = "curl --silent --output %s https://encoding.spec.whatwg.org/%s"
+local function prepare_index (file)
+ local file_path = file
+ local handle = io_open(file, "rb")
+ if handle then return handle end
+ local ret = os_execute(curlcmd:format(file, file))
+ assert(ret == 0, "the curl command failed with: ".. ret)
+ return assert(io_open(file, "rb"))
+end
+
+local index, date = { }, { }
+
+local indent = 2
+local begin_enc = "%s[%q] = {"
+local end_enc = "%s} ,"
+local num_item = "%s[%s] = %s ,"
+local tab_item = "%s{ %6d , %s } ,"
+local tab = rep(" ", indent)
+local tabtab = tab .. tab
+
+insert(index, "return {")
+for i, v in ipairs { { "index-big5.txt", "big5" },
+ { "index-gb18030.txt", "gb18030" },
+ { "index-gb18030-ranges.txt", "gb18030_ranges" } } do
+ local file, encode = unpack(v)
+ local handle = prepare_index(file)
+ insert(index, begin_enc:format(tab, encode))
+ for line in handle:lines() do
+ if not date[i] then
+ local s = line:match("Date: (.+)$")
+ if s then date[i] = s end
+ end
+ local pointer, code_point = line:match("^%s*(%d+)\t(0x%x+)")
+ if pointer and code_point then
+ insert(index, format(i == 3 and tab_item or num_item, tabtab, pointer, code_point))
+ end
+ end
+ insert(index, end_enc:format(tab))
+ handle:close()
+end
+insert(index, "}\n")
+
+local index = concat(index, "\n")
+
+local handle = io_open("ctex-zhconv-index.lua", "wb")
+handle:write(preamble:format(unpack(date)), index)
+handle:close()
diff --git a/Master/texmf-dist/source/latex/ctex/ctex.dtx b/Master/texmf-dist/source/latex/ctex/ctex.dtx
index d4a80e43448..6d349c415cb 100644
--- a/Master/texmf-dist/source/latex/ctex/ctex.dtx
+++ b/Master/texmf-dist/source/latex/ctex/ctex.dtx
@@ -2,7 +2,7 @@
% !TeX program = XeLaTeX
% !TeX encoding = UTF-8
%
-% Copyright (C) 2003--2019
+% Copyright (C) 2003--2020
% CTEX.ORG and any individual authors listed elsewhere in this file.
% --------------------------------------------------------------------------
%
@@ -16,9 +16,7 @@
% 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 Maintainers of this work are Leo Liu, Qing Lee and Liam Huang.
+% This work has the LPPL maintenance status "maintained".
%
% --------------------------------------------------------------------------
%
@@ -43,6 +41,10 @@ Authors and Contributors
* Chen Zhichu <zhichu.chen@gmail.com>
* Li Qing <sobenlee@gmail.com>
* Liam Huang <liamhuang0205@gmail.com>
+* Zeng Xiangdong <xdzeng96@gmail.com>
+* Li Zeping <zepinglee@gmail.com>
+* Zhou Yukai <muzimuzhi@gmail.com>
+* Zhang Ruixi <ruixizhang42@gmail.com>
Contributing
------------
@@ -54,7 +56,7 @@ Issues and pull requests are welcome.
Copyright and Licence
---------------------
- Copyright (C) 2003--2019
+ Copyright (C) 2003--2020
CTEX.ORG and any individual authors listed elsewhere in this file.
----------------------------------------------------------------------
@@ -68,11 +70,13 @@ Copyright and Licence
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 Maintainers of this work are Leo Liu, Qing Lee and Liam Huang.
+ This work has the LPPL maintenance status "maintained".
- This package consists of the file ctex.dtx,
+ This package consists of the files ctex.dtx,
+ ctxdoc.cls,
+ ctxdocstrip.tex,
+ ctex-zhconv.lua,
+ ctex-zhconv-make.lua,
and the derived files ctex.pdf,
ctex.ins,
ctex.sty,
@@ -82,16 +86,15 @@ Copyright and Licence
ctexbook.cls,
ctexrep.cls,
ctexbeamer.cls,
- ctxdoc.cls,
ctexcap.sty,
ctexhook.sty,
ctexpatch.sty,
ctex-c5size.clo,
ctex-cs4size.clo,
- ctex-article.def,
- ctex-book.def,
- ctex-report.def,
- ctex-beamer.def,
+ ctex-heading-article.def,
+ ctex-heading-book.def,
+ ctex-heading-report.def,
+ ctex-heading-beamer.def,
ctex-scheme-plain.def,
ctex-scheme-plain-article.def,
ctex-scheme-plain-book.def,
@@ -106,6 +109,7 @@ Copyright and Licence
ctex-name-utf8.cfg,
ctex.cfg,
ctexopts.cfg,
+ ctexbackend.cfg,
ctex-engine-pdftex.def,
ctex-engine-xetex.def,
ctex-engine-luatex.def,
@@ -123,26 +127,25 @@ Copyright and Licence
jt2zhrm.fd,
jt2zhsf.fd,
jt2zhtt.fd,
- ctex-fontset-windows.def,
- ctex-fontset-windowsnew.def,
- ctex-fontset-windowsold.def,
ctex-fontset-adobe.def,
ctex-fontset-fandol.def,
+ ctex-fontset-founder.def,
ctex-fontset-mac.def,
ctex-fontset-macnew.def,
ctex-fontset-macold.def,
- ctex-fontset-founder.def,
ctex-fontset-ubuntu.def,
+ ctex-fontset-windows.def,
ctexspa.def,
ctexpunct.spa,
- ctexmakespa.tex,
- ctexspamacro.tex,
- ctxdocstrip.tex,
- zhadobefonts.tex,
- zhfandolfonts.tex,
- zhfounderfonts.tex,
- zhubuntufonts.tex,
- zhwindowsfonts.tex,
+ ctex-spa-make.tex,
+ ctex-spa-macro.tex,
+ ctex-zhmap-adobe.tex,
+ ctex-zhmap-fandol.tex,
+ ctex-zhmap-founder.tex,
+ ctex-zhmap-mac.tex,
+ ctex-zhmap-ubuntu.tex,
+ ctex-zhmap-windows.tex,
+ ctex-zhconv-index.lua,
translator-theorem-dictionary-ChineseGBK.dict,
translator-theorem-dictionary-ChineseUTF8.dict, and
README.md (this file).
@@ -160,9 +163,9 @@ Copyright and Licence
\preamble
- Copyright (C) 2003--2019
+ Copyright (C) 2003--2020
CTEX.ORG and any individual authors listed in the documentation.
-------------------------------------------------------------------------------
+---------------------------------------------------------------------
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -174,16 +177,18 @@ Copyright and Licence
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 Maintainers of this work are Leo Liu, Qing Lee and Liam Huang.
+ This work has the LPPL maintenance status "maintained".
-------------------------------------------------------------------------------
+---------------------------------------------------------------------
\endpreamble
\postamble
- This package consists of the file ctex.dtx,
+ This package consists of the files ctex.dtx,
+ ctxdoc.cls,
+ ctxdocstrip.tex,
+ ctex-zhconv.lua,
+ ctex-zhconv-make.lua,
and the derived files ctex.pdf,
ctex.ins,
ctex.sty,
@@ -193,16 +198,15 @@ Copyright and Licence
ctexbook.cls,
ctexrep.cls,
ctexbeamer.cls,
- ctxdoc.cls,
ctexcap.sty,
ctexhook.sty,
ctexpatch.sty,
ctex-c5size.clo,
ctex-cs4size.clo,
- ctex-article.def,
- ctex-book.def,
- ctex-report.def,
- ctex-beamer.def,
+ ctex-heading-article.def,
+ ctex-heading-book.def,
+ ctex-heading-report.def,
+ ctex-heading-beamer.def,
ctex-scheme-plain.def,
ctex-scheme-plain-article.def,
ctex-scheme-plain-book.def,
@@ -217,6 +221,7 @@ Copyright and Licence
ctex-name-utf8.cfg,
ctex.cfg,
ctexopts.cfg,
+ ctexbackend.cfg,
ctex-engine-pdftex.def,
ctex-engine-xetex.def,
ctex-engine-luatex.def,
@@ -234,26 +239,25 @@ Copyright and Licence
jt2zhrm.fd,
jt2zhsf.fd,
jt2zhtt.fd,
- ctex-fontset-windows.def,
- ctex-fontset-windowsnew.def,
- ctex-fontset-windowsold.def,
ctex-fontset-adobe.def,
ctex-fontset-fandol.def,
+ ctex-fontset-founder.def,
ctex-fontset-mac.def,
ctex-fontset-macnew.def,
ctex-fontset-macold.def,
- ctex-fontset-founder.def,
ctex-fontset-ubuntu.def,
+ ctex-fontset-windows.def,
ctexspa.def,
ctexpunct.spa,
- ctexmakespa.tex,
- ctexspamacro.tex,
- ctxdocstrip.tex,
- zhadobefonts.tex,
- zhfandolfonts.tex,
- zhfounderfonts.tex,
- zhubuntufonts.tex,
- zhwindowsfonts.tex,
+ ctex-spa-make.tex,
+ ctex-spa-macro.tex,
+ ctex-zhmap-adobe.tex,
+ ctex-zhmap-fandol.tex,
+ ctex-zhmap-founder.tex,
+ ctex-zhmap-mac.tex,
+ ctex-zhmap-ubuntu.tex,
+ ctex-zhmap-windows.tex,
+ ctex-zhconv-index.lua,
translator-theorem-dictionary-ChineseGBK.dict,
translator-theorem-dictionary-ChineseUTF8.dict, and
README.md.
@@ -270,16 +274,15 @@ Copyright and Licence
\file{ctexrep.cls} {\from{\jobname.dtx}{class,report}}
\file{ctexbeamer.cls} {\from{\jobname.dtx}{class,beamer}}
\usepostamble\emptypostamble
- \file{ctxdoc.cls} {\from{\jobname.dtx}{ctxdoc}}
\file{ctexcap.sty} {\from{\jobname.dtx}{ctexcap}}
\file{ctexhook.sty} {\from{\jobname.dtx}{ctexhook}}
\file{ctexpatch.sty} {\from{\jobname.dtx}{ctexpatch}}
\file{ctex-c5size.clo} {\from{\jobname.dtx}{c5size}}
\file{ctex-cs4size.clo} {\from{\jobname.dtx}{cs4size}}
- \file{ctex-article.def} {\from{\jobname.dtx}{heading,article}}
- \file{ctex-book.def} {\from{\jobname.dtx}{heading,book}}
- \file{ctex-report.def} {\from{\jobname.dtx}{heading,report}}
- \file{ctex-beamer.def} {\from{\jobname.dtx}{heading,beamer}}
+ \file{ctex-heading-article.def} {\from{\jobname.dtx}{heading,article}}
+ \file{ctex-heading-book.def} {\from{\jobname.dtx}{heading,book}}
+ \file{ctex-heading-report.def} {\from{\jobname.dtx}{heading,report}}
+ \file{ctex-heading-beamer.def} {\from{\jobname.dtx}{heading,beamer}}
\file{ctex-scheme-plain.def} {\from{\jobname.dtx}{scheme,generic,plain}}
\file{ctex-scheme-plain-article.def} {\from{\jobname.dtx}{scheme,article,plain}}
\file{ctex-scheme-plain-book.def} {\from{\jobname.dtx}{scheme,book,plain}}
@@ -290,10 +293,11 @@ Copyright and Licence
\file{ctex-scheme-chinese-book.def} {\from{\jobname.dtx}{scheme,book,chinese}}
\file{ctex-scheme-chinese-report.def} {\from{\jobname.dtx}{scheme,report,chinese}}
\file{ctex-scheme-chinese-beamer.def} {\from{\jobname.dtx}{scheme,beamer,chinese}}
- \file{ctex-name-gbk.cfg} {\from{\jobname.dtx}{name,GBK}}
+ \ctxfile{GBK}{ctex-name-gbk.cfg} {\from{\jobname.dtx}{name,GBK}}
\file{ctex-name-utf8.cfg} {\from{\jobname.dtx}{name,UTF8}}
\file{ctex.cfg} {\from{\jobname.dtx}{config}}
\file{ctexopts.cfg} {\from{\jobname.dtx}{ctexopts}}
+ \file{ctexbackend.cfg} {\from{\jobname.dtx}{backend}}
\file{ctex-engine-pdftex.def} {\from{\jobname.dtx}{pdftex}}
\file{ctex-engine-xetex.def} {\from{\jobname.dtx}{xetex}}
\file{ctex-engine-luatex.def} {\from{\jobname.dtx}{luatex}}
@@ -311,34 +315,29 @@ Copyright and Licence
\file{jt2zhrm.fd} {\from{\jobname.dtx}{fd,rm,jt2}}
\file{jt2zhsf.fd} {\from{\jobname.dtx}{fd,sf,jt2}}
\file{jt2zhtt.fd} {\from{\jobname.dtx}{fd,tt,jt2}}
- \file{ctex-fontset-windows.def} {\from{\jobname.dtx}{fontset,windows}}
- \file{ctex-fontset-windowsnew.def} {\from{\jobname.dtx}{fontset,windowsnew}}
- \file{ctex-fontset-windowsold.def} {\from{\jobname.dtx}{fontset,windowsold}}
\file{ctex-fontset-adobe.def} {\from{\jobname.dtx}{fontset,adobe}}
\file{ctex-fontset-fandol.def} {\from{\jobname.dtx}{fontset,fandol}}
+ \file{ctex-fontset-founder.def} {\from{\jobname.dtx}{fontset,founder}}
\file{ctex-fontset-mac.def} {\from{\jobname.dtx}{fontset,mac}}
- \file{ctex-fontset-macold.def} {\from{\jobname.dtx}{fontset,macold}}
\file{ctex-fontset-macnew.def} {\from{\jobname.dtx}{fontset,macnew}}
- \file{ctex-fontset-founder.def} {\from{\jobname.dtx}{fontset,founder}}
+ \file{ctex-fontset-macold.def} {\from{\jobname.dtx}{fontset,macold}}
\file{ctex-fontset-ubuntu.def} {\from{\jobname.dtx}{fontset,ubuntu}}
- \file{translator-theorem-dictionary-ChineseGBK.dict}
+ \file{ctex-fontset-windows.def} {\from{\jobname.dtx}{fontset,windows}}
+ \ctxfile{GBK}{translator-theorem-dictionary-ChineseGBK.dict}
{\from{\jobname.dtx}{dict,theorem,GBK}}
\file{translator-theorem-dictionary-ChineseUTF8.dict}
{\from{\jobname.dtx}{dict,theorem,UTF8}}
- \file{ctexspa.def}
- {
- \from{\jobname.dtx} {ctexspa}
- \from{ctexpunct.spa} {}
- }
+ \file{ctexspa.def} {\from{\jobname.dtx}{ctexspa}
+ \from{ctexpunct.spa}{}}
\usedir{tex/generic/ctex}
- \file{ctexmakespa.tex} {\from{\jobname.dtx}{spa,make}}
- \file{ctexspamacro.tex} {\from{\jobname.dtx}{spa,macro}}
- \file{zhadobefonts.tex} {\from{\jobname.dtx}{zhmap,adobe}}
- \file{zhfandolfonts.tex} {\from{\jobname.dtx}{zhmap,fandol}}
- \file{zhfounderfonts.tex} {\from{\jobname.dtx}{zhmap,founder}}
- \file{zhubuntufonts.tex} {\from{\jobname.dtx}{zhmap,ubuntu}}
- \file{zhwindowsfonts.tex} {\from{\jobname.dtx}{zhmap,windows}}
- \file{ctxdocstrip.tex} {\from{\jobname.dtx}{docstrip}}
+ \file{ctex-spa-make.tex} {\from{\jobname.dtx}{spa,make}}
+ \file{ctex-spa-macro.tex} {\from{\jobname.dtx}{spa,macro}}
+ \file{ctex-zhmap-adobe.tex} {\from{\jobname.dtx}{zhmap,adobe}}
+ \file{ctex-zhmap-fandol.tex} {\from{\jobname.dtx}{zhmap,fandol}}
+ \file{ctex-zhmap-founder.tex} {\from{\jobname.dtx}{zhmap,founder}}
+ \file{ctex-zhmap-mac.tex} {\from{\jobname.dtx}{zhmap,mac}}
+ \file{ctex-zhmap-ubuntu.tex} {\from{\jobname.dtx}{zhmap,ubuntu}}
+ \file{ctex-zhmap-windows.tex} {\from{\jobname.dtx}{zhmap,windows}}
%</install>
%<*internal>
\usedir{source/latex/ctex}
@@ -366,16 +365,15 @@ Copyright and Licence
\Msg{* ctexbook.cls *}
\Msg{* ctexrep.cls *}
\Msg{* ctexbeamer.cls *}
-\Msg{* ctxdoc.cls *}
\Msg{* ctexcap.sty *}
\Msg{* ctexhook.sty *}
\Msg{* ctexpatch.sty *}
\Msg{* ctex-c5size.clo *}
\Msg{* ctex-cs4size.clo *}
-\Msg{* ctex-article.def *}
-\Msg{* ctex-book.def *}
-\Msg{* ctex-report.def *}
-\Msg{* ctex-beamer.def *}
+\Msg{* ctex-heading-article.def *}
+\Msg{* ctex-heading-book.def *}
+\Msg{* ctex-heading-report.def *}
+\Msg{* ctex-heading-beamer.def *}
\Msg{* ctex-scheme-plain.def *}
\Msg{* ctex-scheme-plain-article.def *}
\Msg{* ctex-scheme-plain-book.def *}
@@ -390,6 +388,7 @@ Copyright and Licence
\Msg{* ctex-name-utf8.cfg *}
\Msg{* ctex.cfg *}
\Msg{* ctexopts.cfg *}
+\Msg{* ctexbackend.cfg *}
\Msg{* ctex-engine-pdftex.def *}
\Msg{* ctex-engine-xetex.def *}
\Msg{* ctex-engine-luatex.def *}
@@ -407,25 +406,23 @@ Copyright and Licence
\Msg{* jt2zhrm.fd *}
\Msg{* jt2zhsf.fd *}
\Msg{* jt2zhtt.fd *}
-\Msg{* ctex-fontset-windows.def *}
-\Msg{* ctex-fontset-windowsnew.def *}
-\Msg{* ctex-fontset-windowsold.def *}
\Msg{* ctex-fontset-adobe.def *}
\Msg{* ctex-fontset-fandol.def *}
+\Msg{* ctex-fontset-founder.def *}
\Msg{* ctex-fontset-mac.def *}
-\Msg{* ctex-fontset-macold.def *}
\Msg{* ctex-fontset-macnew.def *}
-\Msg{* ctex-fontset-founder.def *}
+\Msg{* ctex-fontset-macold.def *}
\Msg{* ctex-fontset-ubuntu.def *}
+\Msg{* ctex-fontset-windows.def *}
\Msg{* ctexspa.def *}
-\Msg{* ctexmakespa.tex *}
-\Msg{* ctexspamacro.tex *}
-\Msg{* ctxdocstrip.tex *}
-\Msg{* zhadobefonts.tex *}
-\Msg{* zhfandolfonts.tex *}
-\Msg{* zhfounderfonts.tex *}
-\Msg{* zhubuntufonts.tex *}
-\Msg{* zhwindowsfonts.tex *}
+\Msg{* ctex-spa-make.tex *}
+\Msg{* ctex-spa-macro.tex *}
+\Msg{* ctex-zhmap-adobe.tex *}
+\Msg{* ctex-zhmap-fandol.tex *}
+\Msg{* ctex-zhmap-founder.tex *}
+\Msg{* ctex-zhmap-mac.tex *}
+\Msg{* ctex-zhmap-ubuntu.tex *}
+\Msg{* ctex-zhmap-windows.tex *}
\Msg{* translator-theorem-dictionary-ChineseGBK.dict *}
\Msg{* translator-theorem-dictionary-ChineseUTF8.dict *}
\Msg{* *}
@@ -442,12 +439,11 @@ Copyright and Licence
\fi
%</internal>
%<*!(driver|readme|install|zhmap|spa|docstrip)>
-%<*!(fd|ctexspa|dict)>
-%<class|style|ctexcap|ctexhook|ctexpatch|ctxdoc>\NeedsTeXFormat{LaTeX2e}
-%<class|style|ctexcap|ctexhook|ctexpatch|ctxdoc>\RequirePackage{expl3}
-%<+!driver>\GetIdInfo$Id: ctex.dtx 735dfe2 2019-05-29 21:42:29 +0800 Qing Lee <sobenlee@gmail.com> $
-%<ctxdoc> {ctex documentation (CTEX)}
-%<ctxdoc>\ProvidesExplClass{ctxdoc}
+%<*!(fd|ctexspa|dict|backend)>
+%<class|style|ctexcap|ctexhook|ctexpatch>\NeedsTeXFormat{LaTeX2e}
+%<class>\input{ctexbackend.cfg}
+%<class|style|ctexcap|ctexhook|ctexpatch>\RequirePackage{expl3}
+%<+!driver>\GetIdInfo$Id: ctex.dtx 81d4c90 2020-10-19 20:24:58 +0800 Qing Lee <sobenlee@gmail.com> $
%<ctex> {Chinese adapter in LaTeX (CTEX)}
%<ctex>\ProvidesExplPackage{\ExplFileName}
%<ctexsize> {Chinese font size definition (CTEX)}
@@ -502,7 +498,7 @@ Copyright and Licence
%<scheme&chinese&beamer>\ProvidesExplFile{ctex-scheme-chinese-beamer.def}
%<name&GBK> {Caption with encoding GBK (CTEX)}
%<name&GBK>\ProvidesExplFile{ctex-name-gbk.cfg}
-%<name&UTF8> {Caption with encoding UTF8 (CTEX)}
+%<name&UTF8> {Caption with encoding UTF-8 (CTEX)}
%<name&UTF8>\ProvidesExplFile{ctex-name-utf8.cfg}
%<config> {Configuration file (CTEX)}
%<config>\ProvidesExplFile{\ExplFileName.cfg}
@@ -520,26 +516,22 @@ Copyright and Licence
%<uptex>\ProvidesExplFile{ctex-engine-uptex.def}
%<windows> {Windows fonts definition (CTEX)}
%<windows>\ProvidesExplFile{ctex-fontset-windows.def}
-%<windowsnew> {Windows fonts definition for Vista or later version (CTEX)}
-%<windowsnew>\ProvidesExplFile{ctex-fontset-windowsnew.def}
-%<windowsold> {Windows fonts definition for XP or earlier version (CTEX)}
-%<windowsold>\ProvidesExplFile{ctex-fontset-windowsold.def}
%<adobe> {Adobe fonts definition (CTEX)}
%<adobe>\ProvidesExplFile{ctex-fontset-adobe.def}
%<fandol> {Fandol fonts definition (CTEX)}
%<fandol>\ProvidesExplFile{ctex-fontset-fandol.def}
-%<mac> {Mac OS X fonts definition (CTEX)}
+%<mac> {macOS fonts definition (CTEX)}
%<mac>\ProvidesExplFile{ctex-fontset-mac.def}
-%<macnew> {Mac OS X fonts definition for El Capitan or later version (CTEX)}
+%<macnew> {macOS fonts definition for El Capitan or later version (CTEX)}
%<macnew>\ProvidesExplFile{ctex-fontset-macnew.def}
-%<macold> {Mac OS X fonts definition for Yosemite or earlier version (CTEX)}
+%<macold> {macOS fonts definition for Yosemite or earlier version (CTEX)}
%<macold>\ProvidesExplFile{ctex-fontset-macold.def}
%<founder> {Founder fonts definition (CTEX)}
%<founder>\ProvidesExplFile{ctex-fontset-founder.def}
%<ubuntu> {Ubuntu fonts definition (CTEX)}
%<ubuntu>\ProvidesExplFile{ctex-fontset-ubuntu.def}
-%<!driver> {\ExplFileDate}{2.4.16}{\ExplFileDescription}
-%</!(fd|ctexspa|dict)>
+%<!driver> {\ExplFileDate}{2.5.5}{\ExplFileDescription}
+%</!(fd|ctexspa|dict|backend)>
%<c19&rm>\ProvidesFile{c19rm.fd}%
%<c19&sf>\ProvidesFile{c19sf.fd}%
%<c19&tt>\ProvidesFile{c19tt.fd}%
@@ -553,11 +545,13 @@ Copyright and Licence
%<jt2&sf>\ProvidesFile{jt2zhsf.fd}%
%<jt2&tt>\ProvidesFile{jt2zhtt.fd}%
%<ctexspa>\ProvidesFile{ctexspa.def}%
+%<backend>\ProvidesFile{ctexbackend.cfg}%
%<dict&theorem&GBK>\ProvidesDictionary{translator-theorem-dictionary}{ChineseGBK}%
%<dict&theorem&UTF8>\ProvidesDictionary{translator-theorem-dictionary}{ChineseUTF8}%
-%<fd> [2019/05/29 v2.4.16 Chinese font definition (CTEX)]
-%<ctexspa> [2019/05/29 v2.4.16 Space info for CJKpunct (CTEX)]
-%<dict&theorem> [2019/05/29 v2.4.16 Chinese translation for theorem name (CTEX)]
+%<fd> [2020/10/19 v2.5.5 Chinese font definition (CTEX)]
+%<ctexspa> [2020/10/19 v2.5.5 Space info for CJKpunct (CTEX)]
+%<backend> [2020/10/19 v2.5.5 Backend configuration file (CTEX)]
+%<dict&theorem> [2020/10/19 v2.5.5 Chinese translation for theorem name (CTEX)]
%</!(driver|readme|install|zhmap|spa|docstrip)>
%<*driver>
\documentclass{ctxdoc}
@@ -579,9 +573,9 @@ Copyright and Licence
% \changes{v2.4}{2015/02/19}{加强 \pkg{beamer} 宏包支持。}
% \changes{v2.4.12}{2018/01/13}{同步 \LaTeXiii{} 2017/12/16。}
% \changes{v2.4.15}{2019/03/23}{同步 \LaTeXiii{} 2019/03/05。}
+% \changes{v2.5.1}{2020/05/02}{\pkg{zhconv} 更名为 \pkg{ctex-zhconv}。}
%
-%
-% \CheckSum{5934}
+% \CheckSum{6265}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -599,7 +593,7 @@ Copyright and Licence
% Grave accent \` Left brace \{ Vertical bar \|
% Right brace \} Tilde \~}
%
-% \GetFileId{ctex.sty}%
+% \GetFileId{ctex.sty}
%
% \title{\bfseries \CTeX{} 宏集手册}
% \author{\href{http://www.ctex.org}{CTEX.ORG}}
@@ -612,13 +606,13 @@ Copyright and Licence
% 日期转换等支持功能,可适应论文、报告、书籍、幻灯片等不同类型的中文文档。
%
% \CTeX{} 宏集支持 \LaTeX、\pdfLaTeX、\XeLaTeX、\LuaLaTeX、\upLaTeX{} 等多种不同
-% 的编译方式,并为它们提供了统一的界面。主要功能由宏包 \pkg{ctex} 和中文文档类
+% 的编译方式,并为它们提供了统一的界面。主要功能由宏包 \pkg{ctex} 以及中文文档类
% \cls{ctexart}、\cls{ctexrep}、\cls{ctexbook} 和 \cls{ctexbeamer} 实现。
% \end{abstract}
%
% \tableofcontents
%
-% \clearpage
+% \bigskip
% \setlength{\parskip}{0.8ex}
%
% \begin{documentation}
@@ -629,14 +623,14 @@ Copyright and Licence
%
% \CTeX{} 宏集的源头有两个:一是王磊编写的 \cls{cjkbook} 文档类,二是吴凌云编写的
% \file{GB.cap}。
-% 这些工作没有经过认真、系统的设计,也没有用户文档,不利于维护和改进。
+% 这些工作没有经过认真系统的设计,也没有用户文档,不利于维护和改进。
%
% 2003 年,吴凌云使用 \pkg{doc} 和 \pkg{DocStrip} 重构了整个工程,并增加了许多新的功能,
% 称为 \pkg{ctex} 宏包。2007 年,oseen 和王越在 \pkg{ctex} 宏包的基础上,
% 增加了对 UTF-8 编码的支持,开发出了 \pkg{ctexutf8} 宏包。
%
% 2009 年 5 月,我们在 Google Code 建立了 ctex-kit 项目^^A
-% \footnote{\nolinkurl{http://code.google.com/p/ctex-kit/}},
+% \footnote{\nolinkurl{http://code.google.com/p/ctex-kit/},该链接现已失效。},
% 对 \pkg{ctex} 宏包及相关脚本进行了整合,并加入了对 \XeTeX{} 引擎的支持。
% 在开发新版本时,考虑到合作开发和调试的方便,我们放弃了 \pkg{doc} 和 \pkg{DocStrip},
% 采取了直接编写宏包代码的方式。
@@ -649,11 +643,11 @@ Copyright and Licence
% \href{https://github.com/CTeX-org/ctex-kit}{GitHub}^^A
% \footnote{\url{https://github.com/CTeX-org/ctex-kit}}。
%
-% 最初,Knuth 在设计开发 \TeX{} 的时候没有考虑到多国语言支持,特别是对多字节的中日韩
-% 语言的支持。这使得 \TeX{} 以至后来的 \LaTeX{} 对中文的支持一直不是很好。即使在
+% 最初,Knuth 在设计开发 \TeX{} 的时候没有考虑到多国文字支持,特别是对多字节的中日韩
+% 表意文字的支持。这使得 \TeX{} 以至后来的 \LaTeX{} 对中文的支持一直不是很好。即使在
% \pkg{CJK} 宏包解决了中文字符处理的问题以后,中文用户使用 \LaTeX{} 仍然要面对许
% 多困难。
-% 这些困难里,以章节标题的中文化为最。由于中文和西文语言习惯的差异,用户很难使用标准
+% 这些困难里,以章节标题的中文化为最。由于中文和西文书写习惯的差异,用户很难使用标准
% 文档类中的代码结构来表达中文标题。于是,用户不得不对标准文档类做较大的修改。
% 除此之外,日期格式、首行缩进、中文字号和字距等细节问题,也需要精细的调校。
% 我们设计 \CTeX{} 宏集的目的之一就是解决这些 \LaTeX{} 文档的汉化难题。
@@ -661,23 +655,24 @@ Copyright and Licence
% 另一方面,随着 \TeX{} 引擎和 \LaTeX{} 宏包的不断发展,\LaTeX{} 的中文支持方式从早期的
% 专用系统(如 \pkg{CCT})发展为适用于不同引擎的多种方式^^A
% \footnote{比如:\pdfTeX{} 引擎下的 \pkg{CJK}、\pkg{zhmCJK}宏包,
-% \XeTeX{} 引擎下的 \pkg{xeCJK} 宏包和 \LuaTeX{} 引擎下的 \pkg{LuaTeX-ja} 宏
-% 包}。这些方式的适用情况和使用方式有不少细节上的差异,同时操作系统的不同、语言环境的不同等
+% \XeTeX{} 引擎下的 \pkg{xeCJK} 宏包和 \LuaTeX{} 引擎下的 \pkg{LuaTeX-ja} 宏包。}。
+% 这些方式的适用情况和使用方式有不少细节上的差异,同时操作系统的不同、语言环境的不同等
% 客观情况又进一步带来了更多的细节差异。我们设计 \CTeX{} 宏集的另一个主要目的就是
% 尽可能消除这些差异带来的影响,使用户能够以一个统一的接口来使用不同的中文支持方式,
% 使得同一份文档能够在不同环境下交换使用。
%
-% \CTeX{} 宏集的许多实现细节离不开热心朋友们在 \url{bbs.ctex.org} 论坛上的讨论,
-% 在此对参与讨论的朋友们表示感谢。
+% \CTeX{} 宏集的许多实现细节离不开热心朋友们在 \nolinkurl{bbs.ctex.org} 论坛^^A
+% \footnote{2018 年,\CTeX{} 论坛因故无限期关闭,此链接现已失效。}^^A
+% 上的讨论,在此对参与讨论的朋友们表示感谢。
%
% \subsection*{关于宏集名字的说明}
%
% \CTeX{} 之名是英文单词 China(中国)或 Chinese(中文)的首字母“C”与 “\TeX{}”
% 结合而成的。在纯文本环境下,该名字应写作“CTeX”。
%
-% \CTeX{} 宏集是由 \href{http://bbs.ctex.org}{\CTeX{} 社区} 发起并维护的
+% \CTeX{} 宏集是由 \href{https://github.com/CTeX-org}{\CTeX{} 社区}发起并维护的
% \LaTeX{} \emph{宏包和文档类的集合}。
-% 社区另有发布名为 \href{http://www.ctex.org/CTeX}{\CTeX{} 套装}
+% 社区另有发布名为 \href{http://www.ctex.org/CTeX}{\CTeX{} 套装}^^A
% 的 \TeX{} 发行版,与本文档所述的 \CTeX{} 宏集并非是同一事物。
%
% \pkg{ctex} 则是本宏集中的 \pkg{ctex.sty} 的名字。这一完全小写的名称,在过去
@@ -688,7 +683,7 @@ Copyright and Licence
%
% \subsection{\CTeX{} 宏集的组成}
%
-% 为了适应用户不同的需求,我们将 \CTeX{} 宏集的主要功能分散在四个中文文档类和
+% 为了适应用户不同的需求,我们将 \CTeX{} 宏集的主要功能设计安排在四个中文文档类和
% 三个宏包当中,具体的组成见表~\ref{tab:ctex}。
%
% \begin{table}[htbp]
@@ -698,21 +693,21 @@ Copyright and Licence
% \toprule
% 类别 & 文件 & 说明 \\
% \midrule
-% 文档类 & \file{ctexart.cls} & 标准文档类 \cls{article} 的汉化版本,一般适用于
-% 短篇幅的文章 \\
-% & \file{ctexrep.cls} & 标准文档类 \cls{report} 的汉化版本,一般适用于
-% 中篇幅的报告 \\
-% & \file{ctexbook.cls} & 标准文档类 \cls{book} 的汉化版本,一般适用于
-% 长篇幅的书籍 \\
-% & \file{ctexbeamer.cls} & 文档类 \cls{beamer} 的汉化版本,适用于
-% 幻灯片演示 \\
+% 文档类 & \file{ctexart.cls} & 标准文档类 \cls{article} 的汉化版本,
+% 一般适用于短篇幅的文章 \\
+% & \file{ctexrep.cls} & 标准文档类 \cls{report} 的汉化版本,
+% 一般适用于中篇幅的报告 \\
+% & \file{ctexbook.cls} & 标准文档类 \cls{book} 的汉化版本,
+% 一般适用于长篇幅的书籍 \\
+% & \file{ctexbeamer.cls} & 文档类 \cls{beamer} 的汉化版本,
+% 适用于幻灯片演示 \\
% \midrule
-% 宏包 & \file{ctex.sty} & 提供全部功能,但\emph{默认不开启章节标题设置功能},
-% 需要使用 \opt{heading} 选项来开启 \\
-% & \file{ctexsize.sty} & 定义和调整中文字号,在 \pkg{ctex} 宏包
-% 或 \CTeX{} 中文文档类之外单独调用 \\
+% 宏包 & \file{ctex.sty} & 提供全部功能,但\emph{默认不开启章节标题设置功能},
+% 需要使用 \opt{heading} 选项来开启 \\
+% & \file{ctexsize.sty} & 定义和调整中文字号,可以在 \pkg{ctex} 宏包
+% 或 \CTeX{} 中文文档类之外单独调用 \\
% & \file{ctexheading.sty} & 提供章节标题设置功能(见 \ref{sec:secstyle}
-% 节),在 \pkg{ctex} 宏包或 \CTeX{} 中文
+% 节),可以在 \pkg{ctex} 宏包或 \CTeX{} 中文
% 文档类之外单独调用 \\
% \bottomrule
% \end{tabularx}
@@ -720,37 +715,42 @@ Copyright and Licence
%
% \subsection{\CTeX{} 宏集的安装和更新}
% \label{subsec:easy-ins}
-%
-% \CTeX{} 宏集依赖的宏包和宏集已被最常见的 \TeX{} 发行版 \TeXLive{} 和 \MiKTeX{}
-% 所收录。如果本地安装 \TeXLive{} 或 \MiKTeX{} 不是完全版本,就可能需要通过这
-% 两个发行版提供的\emph{宏包管理器}来安装宏包。
-%
-% \TeXLive{} 的宏包管理器是 tlmgr。用户可以在系统命令行中^^A
-% \footnote{Windows 系统的命令行是 CMD 命令提示符,你可以使用 Win + R 组合键^^A
-% 打开“运行”对话框,然后输入 cmd 确认打开命令提示符窗口。}^^A
-% 执行
+% 最常见的 \TeX{} 发行版(\TeXLive{} 和 \MiKTeX{})已收录 \CTeX{} 宏集及其依赖的宏包和宏集。
+% \footnote{\pkg{zhmCJK} 宏包是个例外。当用户显式指定选项 \opt{zhmap = zhmCJK} 时,^^A
+% \CTeX{} 宏集依赖它。由于,它没有被 \TeXLive{} 和 \MiKTeX{} 收录,用户可能需要遵照其说明文档
+% 自行安装。}如果本地安装 \TeXLive{} 或 \MiKTeX{} 不是完整版本,则可能需要通过这
+% 两个发行版提供的\emph{包管理器}来安装宏包。
+%
+% \TeXLive{} 的包管理器是 tlmgr(\TeXLive{} Manager)。用户可以在系统命令行中^^A
+% \footnote{Windows 系统的命令行是 CMD 命令提示符,你可以使用 Win + R 组合键
+% 打开“运行”对话框,然后输入 cmd 确认打开命令提示符窗口。}执行
% \begin{frameverb}
% tlmgr gui
% \end{frameverb}
-% 启动管理器的图形界面(Windows 用户也可以通过开始菜单的
-% TeX Live 2015 \ding{212} TeX Live Manager 打开)。
-% 连接上远程仓库之后,搜索 ctex 安装即可。
-% tlmgr 的图形界面使用 Perl 编写,容易造成系统假死。遇到这种问题的用户,
+% 启动管理器的图形界面(Windows 用户也可以通过开始菜单的 TeX Live 20XX(年份)
+% \ding{212} TeX Live Manager 打开)。连接上远程仓库之后,搜索 |ctex| 即可安装。
+% tlmgr 的图形界面使用 Perl 编写,在实践中发现容易造成系统假死。遇到这种问题的用户,
% 也可以直接在系统命令行执行
% \begin{frameverb}
% tlmgr install ctex
% \end{frameverb}
-% 来安装 \CTeX{} 宏集\footnote{*nix 用户可能需要超级用户权限才能正确安装宏集。}。
+% 来安装 \CTeX{} 宏集^^A
+% \footnote{*nix 用户可能需要超级用户权限(sudo)才能正确安装宏集。}。
%
-% \MiKTeX{} 的宏包管理器是 mpm (\MiKTeX{} Package Manager)。用户可以在开始菜单
-% 找到 MiKTeX \ding{212} Maintenance (Admin) \ding{212} Package Manager (Admin),
-% 打开管理器,连接上远程仓库之后,搜索 ctex 安装即可。
+% \MiKTeX{} 通常会在缺失宏包时自动完成安装。如需手动安装,可以使用其管理维护
+% 工具 \MiKTeX{} Console。用户可以打开管理器,连接上远程仓库之后,在“Package”
+% 选项卡中搜索“ctex”并安装即可。
+% 也可以使用 mpm(\MiKTeX{} Package Manager),在命令行执行
+% \begin{frameverb}
+% mpm --admin --install=ctex
+% \end{frameverb}
+% 来安装 \CTeX{} 宏集。
%
-% 若希望了解 \CTeX{} 宏集具体的依赖情况和手工安装宏集的方法,
+% 若希望了解 \CTeX{} 宏集具体的依赖情况或手工安装宏集的方法,
% 请参阅第 \ref{sec:dep-ins}~节。
%
-% 当宏包发布新版本,并被发行版在远程仓库安装之后,在本地就可以通过宏包管理器来
-% 取得新版本。
+% 当我们将宏集的新版本发布于 CTAN,且为发行版的远程仓库更新后,用户就可以在本地
+% 通过包管理器获取新版本。
%
% 对于 \TeXLive{},可以在 tlmgr 的图形界面点击“更新全部已安装的”按钮或者在
% 命令行执行
@@ -759,14 +759,17 @@ Copyright and Licence
% \end{frameverb}
% 来完整更新已安装的宏包。
%
-% 对于 \MiKTeX{},在开始菜单找到
-% MiKTeX \ding{212} Maintenance (Admin) \ding{212} Update (Admin),
-% 按照界面说明更新即可。
+% 对于 \MiKTeX{},在 \MiKTeX{} Console 中找到“Updates”选项卡,检查更新后即可
+% 选择升级宏包。也可以使用 mpm,在命令行执行
+% \begin{frameverb}
+% mpm --admin --update
+% \end{frameverb}
+% 来进行更新。
%
% \subsection{使用 \CTeX{} 文档类}
%
-% \emph{如果用户需要在标准文档类的基础上添加中文支持和中文版式支持,我们建议用户使用 \CTeX{}
-% 宏集提供的四个中文文档类。}
+% \emph{如果用户需要在三个标准文档类或 \cls{beamer} 的基础上添加中文及版式的支持,
+% 我们建议用户使用 \CTeX{} 宏集提供的四个中文文档类。}
%
% \CTeX{} 宏集提供了四个中文文档类:\cls{ctexart}、\cls{ctexrep}、\cls{ctexbook} 和
% \cls{ctexbeamer},分别对应 \LaTeX{} 的标准文档类 \cls{article}、\cls{report}、
@@ -775,18 +778,18 @@ Copyright and Licence
% \ref{subs:encoding}~节)}。
%
% \begin{ctexexam}
-% \documentclass[UTF8]{ctexart}
+% \documentclass{ctexart}
% \begin{document}
% 中文文档类测试。你需要将所有源文件保存为 UTF-8 编码。
%
% 你可以使用 XeLaTeX、LuaLaTeX 或 upLaTeX 编译,也可以使用 (pdf)LaTeX 编译。
-% 推荐使用 XeLaTeX 或 LuaLaTeX 编译。
+% 推荐使用 XeLaTeX 或 LuaLaTeX 编译。对高级用户,我们也推荐使用 upLaTeX 编译。
% \end{document}
% \end{ctexexam}
%
% 以下是使用 \cls{ctexbeamer} 文档类编写中文演示文稿的一个示例。
% \begin{ctexexam}
-% \documentclass[UTF8]{ctexbeamer}
+% \documentclass{ctexbeamer}
% \begin{document}
% \begin{frame}{中文演示文档}
% \begin{itemize}
@@ -794,6 +797,7 @@ Copyright and Licence
% \item 你可以使用 XeLaTeX、LuaLaTeX 或 upLaTeX 编译
% \item 也可以使用 (pdf)LaTeX 编译
% \item 推荐使用 XeLaTeX 或 LuaLaTeX 编译
+% \item 对高级用户,我们也推荐使用 upLaTeX 编译
% \end{itemize}
% \end{frame}
% \end{document}
@@ -801,14 +805,14 @@ Copyright and Licence
%
% \subsection{使用 \pkg{ctex} 宏包}
%
-% \emph{用户在使用非标准文档类时,如果需要添加中文支持或中文版式支持,则可以使用 \pkg{ctex}
-% 宏包。}
+% \emph{用户在使用非标准文档类及 \cls{beamer} 时,如果需要添加中文及版式的支持,
+% 则可以使用 \pkg{ctex} 宏包。}
%
-% 有些文档类是建立在 \LaTeX{} 标准文档类之上开发的。这时,给 \pkg{ctex} 宏包
+% 对于建立在 \LaTeX{} 标准文档类之上开发的文档类,在使用 \pkg{ctex} 宏包时
% 加上 \opt{heading} 选项,可以将章节标题设置为中文风格。
% \begin{ctexexam}
% \documentclass{ltxdoc}
-% \usepackage[UTF8, heading = true]{ctex}
+% \usepackage[heading = true]{ctex}
% \begin{document}
% \section{简介}
% 章节标题中文化的 \LaTeX{} 手册。
@@ -820,16 +824,13 @@ Copyright and Licence
%
% \CTeX{} 宏集已经尽可能就中文的行文和版式习惯做了调整和配置,通常而言,这些配置
% 已经够用。因此,除非必要,我们不建议普通用户修改这些默认配置。如果你认为 \CTeX{} 宏集
-% 的默认配置还可以完善,可以在项目主页上%
+% 的默认配置还可以完善,可以在项目主页上^^A
% \href{https://github.com/CTeX-org/ctex-kit/issues}{提交 issue},
% 向我们反映,我们会酌情在后续版本中予以改进。
%
% 不过,\CTeX{} 宏集也提供了一系列选项。用户可以使用这些选项来控制 \CTeX{} 宏集的行为。
-% 具体来说,这些选项里,有的以传统的方式提供,
-% 也有的以 \meta{key}|=|\meta{value} 的形式提供。对于以键值对形式提供的选项,
-% 在下面的说明中使用\textbf{粗体}来表示 \CTeX{} 的默认设置。
-%
-% 另一方面,这些选项可以分为以下三类:
+% 按形式分类,这些选项有的以传统的方式提供,有的以 \meta{key}|=|\meta{value} 的形式提供。
+% 按指定位置分类,这些选项又可以分为以下三类:
% \begin{itemize}
% \item 名字后带有 \rexptarget\rexpstar{} 号的选项,只能作为宏包/文档类选项,需要
% 在引入宏包/文档类的时候指定;
@@ -891,28 +892,24 @@ Copyright and Licence
% \end{table}
%
% 不同的编译方式和中文支持方式会在一定程度上影响 \CTeX{} 宏集的行为,比如宏包对
-% 编码的处理。
-% 在用户使用 \XeLaTeX、\LuaLaTeX{} 及 \upLaTeX{} 编译时,\CTeX{} 宏集使用(且仅
-% 能使用)UTF-8 编码;而因为历史原因,在用户使用 \LaTeX{} 及 \pdfLaTeX{} 编译
-% 时,宏包默认使用 GBK 编码。用户需要\emph{保证编译方式、
-% 源文件编码、宏包编码选项三者一致}。
-% 关于宏包编码选项,可以参考 \ref{subs:encoding}~节。
-%
-% 除去文档编码之外,选择不同的编译方式还可能影响 \CTeX{} 宏集对字体选择、空格处理、
-% 标点处理的处理。具体的影响将在本文档后续内容中进行阐述。
+% 文档编码、字体选择、空格、标点等的处理。具体细节将在本文档后续内容中进行阐述。
%
% \subsection{中文编码}
% \label{subs:encoding}
%
-% \begin{function}[rEXP]{GBK, UTF8}
-% 指明编写文档时使用的编码格式。\CTeX{} 宏集无法检测用户编写文档时使用的编码格式,因此
-% 需要用户自行指定编码。\emph{我们建议用户总是使用 UTF-8 编码,并显式指定 \opt{UTF8}
-% 选项,并使用 \XeLaTeX、\LuaLaTeX{} 或 \upLaTeX{} 编译。}
+% \begin{function}[rEXP,updated=2019-11-10]{GBK, UTF8}
+% 指明编写文档时使用的编码。\CTeX{} 宏集无法检测文档源文件的实际编码格式,因此需要
+% 用户通过选项声明。如果没有显式指定,则默认采用 UTF-8 编码。
+%
+% 使用 \XeLaTeX{}、\LuaLaTeX{} 或 \upLaTeX{} 编译时,\CTeX{} 宏集强制使用
+% UTF-8 编码,此时 \opt{GBK} 选项无效;使用 (pdf)\LaTeX{} 编译时,
+% \CTeX{} 宏集默认使用 UTF-8 编码,但用户也可以显式声明 \opt{GBK} 选项,
+% 使 \CTeX{} 宏集按 GBK 编码处理文档。
+%
+% 用户需要\emph{保证编译方式、源文件编码、宏包编码选项三者一致}。
%
-% 使用 \XeLaTeX、\LuaLaTeX{} 或 \upLaTeX{} 编译时,\CTeX{} 宏集强制使用 UTF-8
-% 编码,此时 \opt{GBK} 选项无效。
-% 使用 (pdf)\LaTeX{} 编译时,\CTeX{} 宏集默认启用 \opt{GBK} 选项;不过,用户也可以
-% 显式声明 \opt{UTF8} 选项,使 \CTeX{} 宏集工作在 UTF-8 编码下。
+% \emph{我们建议编写新文档时始终使用 UTF-8 编码,而仅把 GBK 编码留给
+% 历史遗留文档。}
% \end{function}
%
% \subsection{中文字库}
@@ -920,9 +917,9 @@ Copyright and Licence
%
% 以往,为 \LaTeX{} 文档配置中文支持是一件相当繁琐的事情。默认情况下,
% \CTeX{} 宏集能自动检测用户使用的编译方式(参见 \ref{subs:compile}~节)和
-% 操作系统\footnote{\CTeX{} 宏集现在能够识别 Mac~OS~X 系统以及 Windows 系统。},
-% 选择合适的底层支持和字库,从而简化配置过程。自动配置的情况参见
-% 表~\ref{tab:default-font-select}。
+% 操作系统\footnote{\CTeX{} 宏集现在能够识别 macOS 及 Windows 系统,
+% 并将其他系统统一归为 Linux。},选择合适的底层支持和字库,从而简化配置过程。
+% 自动配置的情况参见表~\ref{tab:default-font-select}。
%
% \begin{table}[htbp]
% \centering
@@ -931,42 +928,50 @@ Copyright and Licence
% \label{tab:default-font-select}
% \begin{tabular}{*{5}{c}}
% \toprule
-% & Mac OS X & Windows New\tnote{1} & Windows Old\tnote{2} &
-% 其他 \\
+% & macOS Old\tnote{1}
+% & macOS New\tnote{2}
+% & Windows\tnote{3}
+% & 其他 \\
% \midrule
-% \XeLaTeX{} & \makecell{\pkg{xeCJK}\\华文字库} &
-% \makecell{\pkg{xeCJK}\\中易字库 + 微软雅黑} & \makecell{\pkg{xeCJK}\\中易字库} &
-% \makecell{\pkg{xeCJK}\\Fandol 字库\tnote{3}} \\
+% \XeLaTeX & \makecell{\pkg{xeCJK}\\华文字库}
+% & \makecell{\pkg{xeCJK}\\华文字库 + 苹方}
+% & \makecell{\pkg{xeCJK}\\中易字库 + 微软雅黑}
+% & \makecell{\pkg{xeCJK}\\Fandol 字库\tnote{4}} \\
% \cmidrule(lr){1-5}
-% \LuaLaTeX{}\tnote{4} & \makecell{\pkg{LuaTeX-ja}\\华文字库} &
-% \makecell{\pkg{LuaTeX-ja}\\中易字库 + 微软雅黑} &
-% \makecell{\pkg{LuaTeX-ja}\\中易字库} &
-% \makecell{\pkg{LuaTeX-ja}\\Fandol 字库} \\
+% \LuaLaTeX\tnote{5}
+% & \makecell{\pkg{LuaTeX-ja}\\华文字库}
+% & \makecell{\pkg{LuaTeX-ja}\\华文字库 + 苹方}
+% & \makecell{\pkg{LuaTeX-ja}\\中易字库 + 微软雅黑}
+% & \makecell{\pkg{LuaTeX-ja}\\Fandol 字库} \\
% \cmidrule(lr){1-5}
-% \pdfLaTeX{} & 不可用\tnote{5} &
-% \makecell{\pkg{CJK} + \pkg{zhmetrics}\\中易字库 + 微软雅黑} &
-% \makecell{\pkg{CJK} + \pkg{zhmetrics}\\中易字库} & 不可用\tnote{5} \\
+% \pdfLaTeX
+% & 不可用
+% & 不可用
+% & \makecell{\pkg{CJK} + \pkg{zhmetrics}\\中易字库 + 微软雅黑\tnote{6}}
+% & 不可用 \\
% \cmidrule(lr){1-5}
-% \makecell{\LaTeX{} + \\\dvipdfmx{}} & 不可用\tnote{6} &
-% \makecell{\pkg{CJK} + \pkg{zhmetrics}\\中易字库 + 微软雅黑} &
-% \makecell{\pkg{CJK} + \pkg{zhmetrics}\\中易字库} &
-% \makecell{\pkg{CJK} + \pkg{zhmetrics}\\Fandol 字库} \\
+% \makecell{\LaTeX{} + \\\dvipdfmx}
+% & 不可用
+% & \makecell{\pkg{CJK} + \pkg{zhmetrics}\\华文字库 + 苹方}
+% & \makecell{\pkg{CJK} + \pkg{zhmetrics}\\中易字库 + 微软雅黑\tnote{6}}
+% & \makecell{\pkg{CJK} + \pkg{zhmetrics}\\Fandol 字库} \\
% \cmidrule(lr){1-5}
-% \makecell{\upLaTeX{} + \\\dvipdfmx{}} & 不可用\tnote{6} &
-% \makecell{\pkg{zhmetrics-uptex}\\中易字库 + 微软雅黑} &
-% \makecell{\pkg{zhmetrics-uptex}\\中易字库} &
-% \makecell{\pkg{zhmetrics-uptex}\\Fandol 字库} \\
+% \makecell{\upLaTeX{} + \\\dvipdfmx}
+% & 不可用
+% & \makecell{\pkg{zhmetrics-uptex}\\华文字库 + 苹方}
+% & \makecell{\pkg{zhmetrics-uptex}\\中易字库 + 微软雅黑}
+% & \makecell{\pkg{zhmetrics-uptex}\\Fandol 字库} \\
% \bottomrule
% \end{tabular}
% \begin{tablenotes}
-% \item [1] Windows Vista 及以后的 Windows 操作系统。
-% \item [2] Windows XP 及以前的 Windows 操作系统。
-% \item [3] 由马起园、苏杰、黄晨成等人开发的开源中文字体,
-% 参见:\url{https://github.com/clerkma/fandol-fonts}。
-% \item [4] \LuaLaTeX{} 编译时使用 \pkg{LuaTeX-ja} 宏包。对此,
+% \item [1] Yosemite (10.10) 及以前的 macOS 系统。
+% \item [2] El Capitan (10.11) 及以后的 macOS 系统。
+% \item [3] 仅支持 Windows Vista 及以后的 Windows 操作系统。
+% \item [4] 由马起园、苏杰、黄晨成等人开发的开源中文字体,
+% 参见:\url{https://www.ctan.org/pkg/fandol}。
+% \item [5] \LuaLaTeX{} 编译时使用 \pkg{LuaTeX-ja} 宏包。对此,
% 第 \ref{sec:lualatex-chinese}~节有特别说明。
-% \item [5] 受 \pdfTeX{} 的限制,无法嵌入 OpenType 字体。
-% \item [6] 目前受 \dvipdfmx{} 的限制,Mac OS X 系统上的黑体和仿宋无法读取。
+% \item [6] 微软雅黑字体并不总是有效,这和选项 \opt{zhmap} 的取值有关。
% \end{tablenotes}
% \end{threeparttable}
% \end{table}
@@ -980,14 +985,20 @@ Copyright and Licence
% \begin{syntax}
% zhmap = <\TTF|zhmCJK>
% \end{syntax}
-% 指定字体映射机制。本选项只在使用 \pdfLaTeX/\LaTeX{} 编译时有意义。
+% 指定字体映射机制。本选项只在使用 (pdf)\LaTeX{} 编译时有意义。
% \end{function}
% \begin{optdesc}
-% \item[true] 使用 \pkg{zhmetrics} 宏包,将 CJK 字库通过 \tn{special}
+% \item[true] 这是该选项的默认值。^^A
+% \footnote{对于以键值对形式提供的选项,文档以\textbf{粗体}来表示其默认值。^^A
+% 下同,不再额外解释。}使用 \pkg{zhmetrics} 宏包,将 CJK 字库通过 \tn{special}
% 命令映射到 \file{.ttf} 文件。
%
% \item[false] 使用传统的 CJK 字库(Type 1)^^A
-% \footnote{如果需要使用自定义的字体映射文件,或者希望使用 Type1 字库,请禁用本选项。}。
+% \footnote{使用 (pdf)\LaTeX{} 编译时,如果需要使用自定义的字体映射文件(比如需要
+% 使用 \LaTeX{} + Dvips 编译),或者希望使用 Type1 字库,请禁用本选项。为此,你
+% 可能需要安装 CJK 字体。参考 \pkg{zhmetrics} 宏包提供的脚本
+% \href{https://github.com/CTeX-org/ctex-kit/blob/master/zhmetrics/CTeXFonts.lua}
+% {\file{CTeXFonts.lua}}。}。
%
% \item[zhmCJK] 载入 \pkg{zhmCJK} 宏包^^A
% \footnote{\pkg{zhmCJK} 宏包基于 \pkg{zhmetrics} 和 \pkg{CJK} 宏包,提供与
@@ -997,8 +1008,7 @@ Copyright and Licence
%
% \begin{function}[added=2014-03-08]{fontset}
% \begin{syntax}
-% fontset =^^A
-% <none|adobe|fandol|founder|mac|macnew|macold|ubuntu|windows|windowsnew|windowsold|...>
+% fontset = <adobe|fandol|founder|mac|macnew|macold|ubuntu|windows|none|...>
% \end{syntax}
% 指定 \CTeX{} 宏集加载的字库。
%
@@ -1012,24 +1022,18 @@ Copyright and Licence
% \item[adobe] 使用 Adobe 公司的四款中文字体,\emph{不支持 \pdfLaTeX}。
% \item[fandol] 使用 Fandol 中文字体,\emph{不支持 \pdfLaTeX}。
% \item[founder] 使用方正公司的中文字体。
-% \item[mac] 使用 Mac OS X 系统下的字体,\emph{不支持 (pdf)\LaTeX}。
-% \item[macnew] 使用 El Capitan 或之后的多字重宋体、苹方黑体。
-% \item[macold] 使用 Yosemite 或之前的华文字库。
-% \item[ubuntu] 使用 Ubuntu 系统下的文泉驿和文鼎字体。
-% \item[windows] 使用简体中文 Windows 系统下的中文字体,自动判断 Windows 系
-% 统版本,采用 |windowsnew| 或 |windowsold| 的设置。
-% \item[windowsnew] 使用简体中文 Windows Vista 或之后系统下的中易字体和微软
-% 雅黑字体。
-% \item[windowsold] 使用简体中文 Windows XP 或之前系统下的中易字体。
+% \item[mac] 使用 macOS 系统下的字体,\emph{不支持 \pdfLaTeX},根据版本分为
+% |macnew| 和 |macold| 两种。
+% \item[macnew] 使用 El Capitan 或之后的多字重华文字体和苹方字体。
+% \item[macold] 使用 Yosemite 或之前的华文字体。
+% \item[ubuntu] 使用 Ubuntu 系统下的思源宋体、思源黑体和 \TeX{} 发行版自带的
+% 文鼎楷体,\emph{不支持 \pdfLaTeX}。
+% \item[windows] 使用 Windows 系统下的中易字体和微软雅黑字体。
+% 当使用 (pdf)\LaTeX{} 编译时,微软雅黑仅在以下两种情形有效:
+% 安装有 \pkg{zhmCJK} 宏包且选项 \opt{zhmap=zhmCJK} 时,或者
+% 安装有微软雅黑的 Type1 字体且选项 \opt{zhmap=false} 时。
% \end{optdesc}
%
-% 注意:使用 (pdf)\LaTeX{} 编译的时候,若设置 \opt{zhmap = false}(比如需要
-% 使用 \LaTeX{} + Dvips 编译),则需要按照传统方式^^A
-% \footnote{可以使用 \pkg{zhmetrics} 宏包提供的脚本
-% \href{https://github.com/CTeX-org/ctex-kit/blob/master/zhmetrics/CTeXFonts.lua}
-% {\file{CTeXFonts.lua}}。}^^A
-% 在本地安装好 CJK 字体。
-%
% 如果不想使用 \CTeX{} 预定义的中文字库,可以设置 \opt{fontset} 为下述值之一。
%
% \begin{optdesc}
@@ -1043,7 +1047,7 @@ Copyright and Licence
% \end{optdesc}
%
% 注意:\emph{如果希望使用 \tn{ctexset} 在导言区指定字库,则需要先在宏包/文档类选项中指定
-% \opt{fontset = none}}。例如:
+% \opt{fontset = none}}(这会禁用 \CTeX{} 宏集的操作系统检测功能和自动设定字库功能)。例如:
% \begin{ctexexam}
% \documentclass[fontset = none]{ctexart}
% \ctexset{fontset = founder}
@@ -1054,27 +1058,25 @@ Copyright and Licence
% \end{ctexexam}
%
% \CTeX{} 宏集预定义的中文字库还定义了一些字体命令。除了在 \opt{ubuntu} 字库中没有
-% \tn{fangsong} 的定义外,所有字库都有以下四个字体命令。
-%
+% \tn{fangsong} 的定义外,所有字库都有以下四个字体命令:
% \begin{optdesc}
% \item[\tn{songti}] 宋体,CJK 等价命令 |\CJKfamily{zhsong}|。
% \item[\tn{heiti}] 黑体,CJK 等价命令 |\CJKfamily{zhhei}|。
% \item[\tn{fangsong}] 仿宋,CJK 等价命令 |\CJKfamily{zhfs}|。
% \item[\tn{kaishu}] 楷书,CJK 等价命令 |\CJKfamily{zhkai}|。
% \end{optdesc}
-%
-% 在 \opt{windows} 和 \opt{founder} 字库中,额外定义了 \tn{lishu} 和 \tn{youyuan}。
+% 在 \opt{windows}、\opt{founder} 和 \opt{macnew} 字库中,额外定义了 \tn{lishu}
+% 和 \tn{youyuan}:
% \begin{optdesc}
% \item[\tn{lishu}] 隶书,CJK 等价命令 |\CJKfamily{zhli}|。
% \item[\tn{youyuan}] 圆体,CJK 等价命令 |\CJKfamily{zhyou}|。
% \end{optdesc}
-% 在 \opt{windowsnew} 和 \opt{macnew} 字库中,还有 \tn{yahei}。
-% 其中在 \opt{macnew} 字库中,\tn{yahei} 实际调用苹方黑体。此举乃是为了更好的兼容性而设。
+% 在 \opt{windows} 字库中还定义了 \tn{yahei}。出于兼容性的考虑,\tn{yahei} 命令
+% 在 \opt{macnew} 字库中也有定义,但实际调用苹方黑体:
% \begin{optdesc}
% \item[\tn{yahei}] 微软雅黑,CJK 等价命令 |\CJKfamily{zhyahei}|。
% \end{optdesc}
-%
-% 在 \opt{macnew} 字库中,还定义了 \tn{pingfang}。
+% 在 \opt{macnew} 字库中,还定义了 \tn{pingfang}:
% \begin{optdesc}
% \item[\tn{pingfang}] 苹方黑体,CJK 等价命令 |\CJKfamily{zhpf}|。
% \end{optdesc}
@@ -1093,9 +1095,10 @@ Copyright and Licence
% 本选项可以用于四个 \CTeX{} 文档类和 \pkg{ctex} 宏包,
% 也可以用于 \pkg{ctexsize} 宏包。
%
-% \opt{scheme = chinese} 时,对标准文档类默认值为 |5|,即设置
-% \tn{normalsize} 为五号字;对 \cls{beamer} 则为 |false|,使用文档类原有的设
-% 置。
+% 该选项的默认值与 \opt{scheme} 的取值有关。
+% 当 \opt{scheme = chinese} 时,对标准文档类默认值为 |5|,即设置
+% \tn{normalsize} 为五号字;对 \cls{beamer} 则为 |false|,使用文档类原有的设置。
+% 当 \opt{scheme = plain} 时,该选项不设默认值,沿用标准文档类或 \cls{beamer} 的原有设置。
% \end{function}
%
% \begin{table}[htbp]
@@ -1150,8 +1153,7 @@ Copyright and Licence
% 本选项只能在调用 \pkg{ctex.sty} 时作为宏包选项使用。
%
% \CTeX{} 宏集提供了一套用于修改文档章节标题格式的接口。该选项用于选择是否
-% 启用该功能。详细的设置方法请参见
-% \ref{sec:secstyle}~节和 \ref{subs:pagestyle}~节。
+% 启用该功能。详细的设置方法请参见第 \ref{subs:pagestyle}~节和第 \ref{sec:secstyle}~节。
% \end{function}
%
% \CTeX{} 宏集提供的四个文档类总是启用该功能。如果在 \pkg{ctex.sty} 下启用该选项,
@@ -1169,9 +1171,9 @@ Copyright and Licence
% 的格式。启用 \opt{sub4section} 会将 \tn{paragraph} 和 \tn{subparagraph} 的格式
% 都修改为类似 \tn{section} 的格式。
%
-% 启用该选项通常需要将计数器 |secnumdepth| 的值为设置为 4 或 5。
+% 启用该选项通常还需要将计数器 |secnumdepth| 的值为设置为 |4| 或 |5|。
%
-% 具体格式可参考 \ref{sec:secstyle}~节中的 \opt{runin} 和 \opt{afterskip} 选项。
+% 具体格式可参考 \ref{subsec:sec-spacing}~小节中的 \opt{runin} 和 \opt{afterskip} 选项。
%
% 注意,上述两个选项只有在非 \cls{beamer} 文档类下 \opt{heading} 选项启用的时候
% 才有意义。亦即,只有在使用除了 \cls{ctexbeamer} 的三个 \CTeX{} 文档类或启用了
@@ -1185,7 +1187,7 @@ Copyright and Licence
% \begin{syntax}
% scheme = <(chinese)|plain>
% \end{syntax}
-% 选择文章的排版方案,预设有 \opt{chinese} 和 \opt{plain} 两种方案。%
+% 选择文章的排版方案,预设有 \opt{chinese} 和 \opt{plain} 两种方案。
% \end{function}
% \begin{optdesc}[itemsep=\medskipamount]
% \item[chinese] 对 \cls{beamer} 以外的文档类,调整默认字号为五号字,并调
@@ -1224,14 +1226,14 @@ Copyright and Licence
% \begin{syntax}
% space = <\TF|(auto)>
% \end{syntax}
-% 是否在生成的 PDF 中保留汉字后面的空格。
+% 是否在生成的 PDF 中保留汉字后面的空格。该选项仅在使用 \XeLaTeX{}/(pdf)\LaTeX{} 编译时有效。
% \end{function}
%
% \begin{optdesc}
% \item[true] 总是保留汉字后的空格。此时,用户需要自行在行尾加上~|%|~处理换行产生
% 的空格\footnote{\LaTeX{} 将单个换行视作一个空格。}。
-% \item[false] 总是忽略掉汉字后面的空格,不论汉字后是什么(使用 (pdf)\LaTeX{}
-% 编译时);等同于 \opt{auto} 的效果(使用 \XeLaTeX{} 编译时)。不建议使用该选项。
+% \item[false] 使用 (pdf)\LaTeX{} 编译时:总是忽略掉汉字后面的空格,不论汉字后是什么;
+% 使用 \XeLaTeX{} 编译时,等同于 \opt{auto} 的效果。不建议使用该选项。
% \item[auto] 根据空格后面的情况决定是否保留:如果空格后面是汉字,则忽略该
% 空格,否则保留。
% \end{optdesc}
@@ -1278,8 +1280,10 @@ Copyright and Licence
% \begin{optdesc}
% \item[\meta{数值或带单位的数值}] 用于设置段首缩进的长度。如果不带单位,则默认
% 单位是单个汉字字宽 \tn{ccwd};如果带单位,则使用该单位。
+% 若要显式使用 \tn{ccwd} 为单位,则必须在导言区进行设置。
%
-% \item[true] 等价于设置 \opt{autoindent = 2}。
+% \item[true] 等价于设置 \opt{autoindent = 2} 或
+% 在导言区设置 \opt{autoindent = 2\tn{ccwd}}。
%
% \item[false] 禁用自动调整功能,可以设置固定长度的段首缩进。如设置每段缩进 40 点:
% \begin{ctexexam}
@@ -1315,7 +1319,7 @@ Copyright and Licence
% \subsection{日期汉化}
%
% \CTeX 宏包对显示当前日期的 \tn{today} 命令进行了汉化,使之以中文的方式显示今
-% 天的日期。如编译本文档的日期就是“\today”。
+% 天的日期。如本文档编译时的日期是“\today”。
%
% \begin{function}[EXP]{today}
% \begin{syntax}
@@ -1329,6 +1333,7 @@ Copyright and Licence
% 效果为“\today”。使用全汉字的日期格式。
% \item[old] \ctexset{today=old}
% 效果为“\today”。使用文档原来的(英文)日期格式。
+% \ctexset{today=small} ^^A NOTE(Liam): 复原设定是好习惯。
% \end{optdesc}
% \end{function}
%
@@ -1343,7 +1348,7 @@ Copyright and Licence
% \subsection{文档标题汉化}
% \label{subs:capname}
%
-% 这里主要介绍由宏包 \opt{scheme} 选项(\ref{subs:options-type-style}~节)控制
+% 这里主要介绍由 \opt{scheme} 选项(\ref{subs:options-type-style}~节)控制
% 的文档标题汉化功能。
%
% 设置文档标题名的示例可见例~\ref{exam:capname}。下面的选项(如
@@ -1413,8 +1418,16 @@ Copyright and Licence
% \begin{syntax}
% bibname = <名字>
% \end{syntax}
-% 设置参考文献标题名 \tn{refname}(对 \cls{article})或 \tn{bibname}(对
-% \cls{report}、\cls{book} 和 \cls{beamer})。中文默认为“\refname”。
+% 设置参考文献标题名。中文默认为“\refname”。
+%
+% 在标准文档类中 \cls{article} 的参考文献名使用宏 \tn{refname},而
+% \cls{book} 和 \cls{report} 使用宏 \tn{bibname}。本选项会根据标准文档类的不同,自动
+% 设定 \tn{refname} 或是 \tn{bibname}。因此,对于标准文档类及对应的 \CTeX{} 文档类
+% 可以统一地使用 \opt{bibname} 选项来控制参考文献标题名。
+%
+% 对于 \cls{beamer} 及对应的 \cls{ctexbeamer} 来说,它们同时具有宏 \tn{bibname} 和
+% 宏 \tn{refname}。本选项仅控制其中的 \tn{bibname};
+% \tn{refname} 则交由 \opt{refname} 选项控制。
% \end{function}
%
% \begin{function}[EXP]{proofname}
@@ -1433,6 +1446,10 @@ Copyright and Licence
% refname = <名字>
% \end{syntax}
% 设置参考文献标题名 \tn{refname}。中文默认为“\refname”。
+%
+% 注意,三个标准文档类(及相应的 \CTeX{} 文档类)的参考文献标题名由 \opt{bibname} 选项
+% 统一设置,本选项仅适用于 \cls{beamer} 及其对应的 \cls{ctexbeamer}。
+% 在三个标准文档类(及相应的 \CTeX{} 文档类)中使用 \opt{refname} 选项会报错。
% \end{function}
%
% \begin{function}[EXP]{algorithmname}
@@ -1455,8 +1472,10 @@ Copyright and Licence
% \subsection{页面格式设置与汉化}
% \label{subs:pagestyle}
%
-% 当使用了 \CTeX 的文档类或是用 \pkg{ctex} 宏包加载了 \opt{heading} 选项时,会
-% 设置整个文档的页面格式(page style)为 |headings|,即相当于设置了
+% 页面格式设置与汉化的功能(及章节标题样式设置功能,见第 \ref{sec:secstyle} 节)^^A
+% 由 \pkg{ctexheading} 宏包完成。加载该宏包时,或者使用 \CTeX{} 文档类时,^^A
+% 或者是使用 \pkg{ctex} 宏包并设定选项 \opt{heading = true} 时,相关功能被激活。
+% 此时,整个文档的页面格式(page style)被设定为 |headings|,即相当于设置了
% \begin{frameverb}
% \pagestyle{headings}
% \end{frameverb}
@@ -1473,7 +1492,7 @@ Copyright and Licence
% 的包提供了以下宏供使用:
% \begin{itemize}
% \item \tn{CTEXthechapter}、\tn{CTEXthesection} 等章节编号(见
-% \ref{sec:secstyle} 节)。它们用来代替英文文档类中的
+% \ref{subsec:sec-commands}~小节)。它们用来代替英文文档类中的
% \tn{thechapter}、\tn{thesection} 等宏。
%
% \item \tn{leftmark}、\tn{rightmark},它们是在使用章节标题命令后,自动设置的
@@ -1481,7 +1500,7 @@ Copyright and Licence
% \tn{chaptermark}、\tn{sectionmark} 中调用 \tn{markright} 或 \tn{markboth} 生
% 成的。
% \end{itemize}
-% 有关 \LaTeX 页面标记的涵义与使用细节,已经超出了本文档讨论的范围。可以参考
+% 有关 \LaTeX 页面标记的含义与使用细节,已经超出了本文档讨论的范围。可以参考
% \cite[Chapter~23]{knuthtex1986}、\cite[\S4.3, \S4.4]{mittelbach2004} 等书籍。
%
% 这里举一个例子,说明通过重定义 \tn{sectionmark},在 \cls{ctexart} 文档类中的
@@ -1548,41 +1567,50 @@ Copyright and Licence
% \smallskip\hrule
% \end{trivlist}
%
-% \section{章节标题格式设置}
+% \section{章节标题样式设置}
% \label{sec:secstyle}
%
-% \CTeX 宏包对 \LaTeX 的标准文档类(\cls{article}、\cls{report} 和
-% \cls{book})和 \cls{beamer} 进行了扩充。当以 \opt{heading} 选项调用 \CTeX
-% 宏包时(\ref{subs:options-heading}~节),则会启用章
-% 节标题的格式设置功能。本节就来介绍有关章节标题的格式选项,所有选项使用
-% \tn{ctexset} 命令设置。
+% \CTeX{} 宏集对 \LaTeX{} 的标准文档类(\cls{article}、\cls{report}、
+% \cls{book})和 \cls{beamer} 进行了章节标题样式设置功能的扩充。
+% 章节标题样式设置功能(及页面格式设置与汉化功能,见第 \ref{subs:pagestyle} 节)^^A
+% 由 \pkg{ctexheading} 宏包完成。加载该宏包时,或者使用 \CTeX{} 文档类时,^^A
+% 或者是使用 \pkg{ctex} 宏包并设定选项 \opt{heading = true} 时,相关功能被激活。
+% 其中,独立使用 \pkg{ctexheading} 宏包时,本节介绍各选项的默认值与指定
+% \opt{scheme = plain} 时相同。
%
-% 第 \ref{subs:pagestyle} 节和本节介绍的功能已经被提取到 \pkg{ctexheading}
-% 宏包之中,可以在 \pkg{ctex} 宏包和 \cls{ctexart} 等文档类之外独立使用。
-% 各选项的默认值与 \opt{scheme = plain} 时的情形相同。
+% 本节涉及的所有选项均需使用 \tn{ctexset} 命令设置。
%
% \changes{v2.0}{2015/03/21}{\tn{CTEXsetup}, \tn{CTEXoptions} 是过时命令。}
-% 章节标题的格式选项是分层设置的。顶层的选项是章节标题名称,次一级的选项是章节
-% 标题的格式。章节标题名包括 |part|, |chapter|, |section|, |subsection|,
-% |subsubsection|, |paragraph|, |subparagraph|;而可用的格式包括 \opt{numbering},
-% \opt{name}, \opt{number}, \opt{format}, \opt{nameformat}, \opt{numberformat},
-% \opt{aftername}, \opt{titleformat}, \opt{aftertitle}, \opt{runin},
-% \opt{afterindent}, \opt{beforeskip}, \opt{afterskip}, \opt{fixskip},
-% \opt{lotskip}, \opt{lofskip}, \opt{indent}, \opt{hang},
-% \opt{pagestyle}, \opt{break}, \opt{tocline} 等。
+%
+% 章节标题的样式选项是分层设置的。顶层的选项是章节标题名称(例如 |section|),
+% 次一层的选项是章节标题的样式(例如 \opt{nameformat})。章节标题名称包括
+% |part|, |chapter|, |section|, |subsection|, |subsubsection|, |paragraph|,
+% |subparagraph|。可用的样式选项包括:
+% \begin{itemize}
+% \item 编号相关(\ref{subsec:sec-number}~小节):
+% \opt{numbering}, \opt{name}, \opt{number}
+% \item 格式相关(\ref{subsec:sec-format}~小节):
+% \opt{format}, \opt{nameformat}, \opt{numberformat}, \opt{titleformat},
+% \opt{aftername}, \opt{aftertitle}, \opt{pagestyle}
+% \item 间距、缩进相关(\ref{subsec:sec-spacing}~小节):
+% \opt{runin}, \opt{hang}, \opt{indent}, \opt{beforeskip}, \opt{afterskip},
+% \opt{fixskip}, \opt{break}, \opt{afterindent}
+% \item 目录、附录相关(\ref{subsec:sec-toc-appendix}~小节):
+% \opt{tocline}, \opt{lofskip}, \opt{lotskip}, \opt{appendix/numbering},
+% \opt{appendix/name}, \opt{appendix/number}
+% \end{itemize}
%
% 注意,对 \cls{article} 及其衍生的 \cls{ctexart} 等文档类,没有 |chapter|
-% 级别的标题。而对于 \cls{beamer} 文档类,这些选项控制的是由 \tn{partpage},
-% \tn{sectionpage} 和 \tn{subsectionpage} 产生的标题格式,此时只有 |part|,
+% 级别的标题;而对于 \cls{beamer} 文档类,这些选项控制的是由 \tn{partpage},
+% \tn{sectionpage} 和 \tn{subsectionpage} 产生的标题样式,此时只有 |part|,
% |section| 和 |subsection| 这三层级别,并且 \opt{runin}, \opt{afterindent},
-% \opt{fixskip}, \opt{hang}, \opt{break} 和 \opt{tocline} 这六个格式无效。
+% \opt{fixskip}, \opt{hang}, \opt{break} 和 \opt{tocline} 这六个选项无效。
%
-% 多级选项之间用斜线分开,例如,\opt{part/name} 选项设置 \tn{part} 标题的在数
+% 多层选项之间用斜线分开,例如,\opt{part/name} 选项设置 \tn{part} 标题的在数
% 字前后的名称,而 \opt{section/number} 选项设置 \tn{section} 标题的数字类型。
-% 注意,斜线 |/| 前后不能有空格或者换行。
-%
-% 使用 \tn{ctexset} 设置多级选项时,可以在同一个上级选项下设置多个下级选项。
+% 注意,斜线 |/| 的前后不能有空格或者换行。
%
+% 使用 \tn{ctexset} 设置多级选项时,还可以在同一个上级选项下设置多个下级选项。
% 例如,同时设置 |part| 一级标题的 \opt{pagestyle} 选项,|chapter| 一级标题的
% \opt{format} 与 \opt{pagestyle} 选项和 |section| 一级标题的 \opt{name} 与
% \opt{number} 选项:
@@ -1600,32 +1628,104 @@ Copyright and Licence
% }
% \end{ctexexam}
%
+% \subsection{编号相关}
+% \label{subsec:sec-number}
+%
% \begin{function}[EXP,added=2015-06-21]{part/numbering, chapter/numbering,
% section/numbering, subsection/numbering, subsubsection/numbering,
% paragraph/numbering, subparagraph/numbering}
% \begin{syntax}
% numbering = \TTF
% \end{syntax}
-% 控制是否对章节标题编号。对各级标题的默认值均为 \opt{true}。
+% 控制是否对\emph{不带星号}的章节标题进行编号。
+% 各级标题的默认值均为 \opt{true}。
+%
+% \LaTeX{} 标准的章节标题命令(如 \tn{section})大体上完成四项工作:
+% 输出标题内容、对标题编号(计数器增加 1)、将标题列入目录(若调用了
+% \pkg{hyperref} 宏包还会添加 PDF 书签)、更新页眉页脚标记。带星号的
+% 章节标题命令(如 \tn{section*})只简单地输出章节标题内容,但不对标题编号,
+% 不将标题列入目录或 PDF 书签,也不写入页眉页脚标记。与之不同的是,
+% 本选项仅仅是否对\emph{不带星号}的章节标题进行编号。因此,当设置本选项为
+% \opt{false} 时,除了不对标题编号以外,其余功能与正常标题一致:可以
+% 编入目录,并生成正确的 \pkg{hyperref} 目录超链接位置和页眉页脚标记。例如:
+% \begin{ctexexam}
+% \documentclass{ctexbook}
+% \begin{document}
+% \tableofcontents
+% \chapter{A}
+% \chapter*{B}
+% \ctexset{chapter/numbering=false}
+% \chapter{C}
+% \end{document}
+% \end{ctexexam}
+% 三章的标题分别为“第一章\quad A”、“B”和“C”,但在目录中则只出现
+% “第一章\quad A”和“C”。
+%
+% 注意,章节标题是否编号还要受到 \LaTeX{} 计数器 |secnumdepth| 的控制^^A
+% (可通过以下介绍的 \opt{secnumdepth} 选项设置)。
+% 例如,对于 |section| 而言,其深度为 1。因此,|section| 会被编号,当且仅当
+% |secnumdepth| 不小于 1,并且 \opt{section/numbering} 为 \opt{true},
+% 并且使用不带星号的章节标题命令(即 \tn{section})。
+% \end{function}
%
-% 我们知道,\LaTeX{} 带星号的章节标题命令(如 \tn{section*})不会对标题编号,
-% 但也不会将该没编号的标题编入目录中。本选项控制的是不带星号的标题命令是否编号。
-% 设置本选项为 \opt{false},除了不对标题编号以外,功能与正常标题一致,
-% 比如可以编目录,正确的 \pkg{hyperref} 目录超链接位置和页眉标记。
+% \begin{function}[EXP,added=2020-05-06]{secnumdepth}
+% \begin{syntax}
+% secnumdepth = <整数或章节名称>
+% \end{syntax}
+% 设置对章节标题进行编号的层次数。\opt{secnumdepth} 的值可以是一个整数,也可以是
+% |part|, |chapter| 等名称。
+% 层次数与名称的对应关系见表~\ref{tab:heading-level}。
+% 章节层次的默认设置见表~\ref{tab:heading-level-default}。
%
-% 注意,章节标题的编号深度受 \LaTeX{} 计数器 |secnumdepth| 的控制。
-% \opt{numbering} 选项在 |secnumdepth| 的控制下起作用。
+% 本选项对 \cls{beamer}/\cls{ctexbeamer} 文档类无效。
% \end{function}
%
-% 如果没有特别说明,以下将用 “|...|” 代表各级章节标题名。
+% \begin{table}[htbp]
+% \begin{minipage}[t]{.43\linewidth}
+% \small\centering
+% \caption{章节层次}
+% \label{tab:heading-level}
+% \begin{tabular}{rll}
+% \toprule
+% 层次 & 名称 & 注 \\
+% \midrule
+% |-1| & part & \cls{book}/\cls{report} 类 \\
+% |0| & chapter & \cls{book}/\cls{report} 类 \\
+% |0| & part & \cls{article} 类 \\
+% |1| & section \\
+% |2| & subsection \\
+% |3| & subsubsection \\
+% |4| & paragraph \\
+% |5| & subparagraph \\
+% \bottomrule
+% \end{tabular}
+% \end{minipage}^^A
+% \begin{minipage}[t]{.57\linewidth}
+% \small\centering
+% \caption{章节层次的默认设置}
+% \label{tab:heading-level-default}
+% \begin{tabular}{lll}
+% \toprule
+% 文档类 & \opt{secnumdepth} & \opt{tocdepth} \\
+% \midrule
+% \cls{article} & |3| (subsubsection) & |3| (subsubsection) \\
+% \cls{book}/\cls{report} & |2| (subsection) & |2| (subsection) \\
+% \cls{beamer} & 无效 & |3| (subsubsection) \\
+% \bottomrule
+% \end{tabular}
+% \end{minipage}
+% \end{table}
+%
+% 如果没有特别说明,以下将用 “|...|” 代表各级章节标题名。
%
% \begin{function}[EXP,updated=2014-03-08]{.../name}
% \begin{syntax}
% name = \{<前名字>,<后名字>\}
% name = \Arg{前名字}
% \end{syntax}
-% 设置章节的名字。名字可以分为前后两部分,即章节编号前后的词语,两个词之间用
-% 一个半角逗号分开;也可以只有一部分,表示只有章节编号之前的名字。例如:
+% 设置章节的名字。所谓“章节的名字”,可以分为前后两部分,即章节编号前后的
+% 词语,两个词之间用一个半角逗号分开;也可以只有一部分,表示只有章节编号之前
+% 的名字。例如:
% \begin{ctexexam}
% \ctexset{
% chapter/name = {第,章},
@@ -1633,30 +1733,32 @@ Copyright and Licence
% }
% \end{ctexexam}
% 会使得 \tn{chapter} 标题使用形如“第一章”的名字,而 \tn{section} 标题则使
-% 用形如“\S1”的名字。
+% 用形如“\S1”的名字。该选项的默认设置见表~\ref{tab:name-default}。
% \end{function}
%
% \begin{table}[htbp]
-% \small\centering
-% \caption{\opt{name} 选项的默认设置}
-% \begin{tabular}{llll}
-% \toprule
-% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} & 注 \\
-% \midrule
-% part & |{第,部分}| & |{\partname\space}| & 原 \tn{partname} 为 Part \\
-% chapter & |{第,章}| & |{\chaptername\space}|
-% & 原 \tn{chaptername} 为 Chapter \\
-% section (beamer) & |{}| & |{\sectionname\space}|
-% & \BSTACK 原 \tn{sectionname} 为\\ |\translate{Section}| \ESTACK \\
-% section & 同右 & |{}| & \\
-% subsection (beamer) & |{}| & |{\subsectionname\space}|
-% & \BSTACK 原 \tn{subsectionname} 为\\ |\translate{Subsection}| \ESTACK \\
-% subsection & 同右 & |{}| & \\
-% subsubsection & 同右 & |{}| & \\
-% paragraph & 同右 & |{}| & \\
-% subparagraph & 同右 & |{}| & \\
-% \bottomrule
-% \end{tabular}
+% \small\centering
+% \setlength\leftskip{0pt plus 1 fil minus \marginparwidth}
+% \caption{\opt{name} 选项的默认设置}
+% \label{tab:name-default}
+% \begin{tabular}{llll}
+% \toprule
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} & 注 \\
+% \midrule
+% part & |{第,部分}| & |{\partname\space}| & 原 \tn{partname} 为 Part \\
+% chapter & |{第,章}| & |{\chaptername\space}|
+% & 原 \tn{chaptername} 为 Chapter \\
+% section (beamer) & |{}| & |{\sectionname\space}|
+% & \BSTACK 原 \tn{sectionname} 为\\ |\translate{Section}| \ESTACK \\
+% section & 同右 & |{}| & \\
+% subsection (beamer) & |{}| & |{\subsectionname\space}|
+% & \BSTACK 原 \tn{subsectionname} 为\\ |\translate{Subsection}| \ESTACK \\
+% subsection & 同右 & |{}| & \\
+% subsubsection & 同右 & |{}| & \\
+% paragraph & 同右 & |{}| & \\
+% subparagraph & 同右 & |{}| & \\
+% \bottomrule
+% \end{tabular}
% \end{table}
%
% \begin{function}[EXP]{.../number}
@@ -1664,118 +1766,132 @@ Copyright and Licence
% number = \Arg{数字输出命令}
% \end{syntax}
% 设置章节编号的数字输出格式。\meta{数字输出命令} 通常是对应章节编号计数器的
-% 输出命令,如 \tn{thesection} 或 |\chinese{chapter}| 之类。
+% 输出命令,如 \tn{thesection} 或 |\chinese{chapter}| 之类。例如:
% \begin{ctexexam}
% \ctexset{
% section/number = \Roman{section}
% }
% \end{ctexexam}
-% \end{function}
+% 将会使 \tn{section} 的编号变为大写罗马数字(如 I、II 等)。
%
-% \opt{number} 选项的定义同时将控制对章节计数器的交叉引用。在引用计数器时,
+% \opt{number} 选项定义的同时将控制对章节计数器的交叉引用。在引用计数器时,
% 记录在 \LaTeX{} 辅助文件中的是 \opt{number} 选项的定义。
%
% 但是,\opt{number} 选项不会影响计数器本身的输出。即设置 |section/number|
-% 不会影响 \tn{thesection} 的定义。(但该选项会影响 \tn{CTEXthesection} 的定
-% 义,见后。)
+% 不会影响 \tn{thesection} 的定义(但该选项会影响 \tn{CTEXthesection} 的定
+% 义,见后)。该选项的默认设置见表~\ref{tab:number-default}。
+% \end{function}
%
% \begin{table}[htbp]
-% \small\centering
-% \caption{\opt{number} 选项的默认设置}
-% \setlength\leftskip{0pt plus 1 fil minus \marginparwidth}
-% \begin{tabular}{llll}
-% \toprule
-% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain}
-% & 原 |\the|\meta{标题} 等价定义 \\
-% \midrule
-% part (beamer) & |\chinese{part}| & |\insertromanpartnumber| & 意义为 |\Roman{part}| \\
-% part & |\chinese{part}| & |\thepart| & |\Roman{part}| \\
-% chapter & |\chinese{chapter}| & |\thechapter| & |\arabic{chapter}| \\
-% section (beamer) & 同右 & |\insertsectionnumber| & 意义为 |\arabic{section}| \\
-% section & 同右 & |\thesection| & |\arabic{section}| \\
-% subsection (beamer)
-% & \BSTACK |\arabic{section}.|\\ |\arabic{subsection}| \ESTACK
-% & |\insertsubsectionnumber| & 意义为 |\arabic{subsection}| \\
-% subsection & 同右 & |\thesubsection| & |\thesection.\arabic{subsection}| \\
-% subsubsection & 同右 & |\thesubsubsection|
-% & |\thesubsection.\arabic{subsubsection}| \\
-% paragraph & 同右 & |\theparagraph|
-% & |\thesubsubsection.\arabic{paragraph}| \\
-% subparagraph & 同右 & |\thesubparagraph|
-% & |\theparagraph.\arabic{subparagraph}| \\
-% \bottomrule
-% \end{tabular}
+% \small\centering
+% \caption{\opt{number} 选项的默认设置}
+% \label{tab:number-default}
+% \setlength\leftskip{0pt plus 1 fil minus \marginparwidth}
+% \begin{tabular}{llll}
+% \toprule
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain}
+% & 原 |\the|\meta{标题} 等价定义 \\
+% \midrule
+% part (beamer) & |\chinese{part}| & |\insertromanpartnumber| & 意义为 |\Roman{part}| \\
+% part & |\chinese{part}| & |\thepart| & |\Roman{part}| \\
+% chapter & |\chinese{chapter}| & |\thechapter| & |\arabic{chapter}| \\
+% section (beamer) & 同右 & |\insertsectionnumber| & 意义为 |\arabic{section}| \\
+% section & 同右 & |\thesection| & |\arabic{section}| \\
+% subsection (beamer)
+% & \BSTACK |\arabic{section}.|\\ |\arabic{subsection}| \ESTACK
+% & |\insertsubsectionnumber| & 意义为 |\arabic{subsection}| \\
+% subsection & 同右 & |\thesubsection| & |\thesection.\arabic{subsection}| \\
+% subsubsection & 同右 & |\thesubsubsection|
+% & |\thesubsection.\arabic{subsubsection}| \\
+% paragraph & 同右 & |\theparagraph|
+% & |\thesubsubsection.\arabic{paragraph}| \\
+% subparagraph & 同右 & |\thesubparagraph|
+% & |\theparagraph.\arabic{subparagraph}| \\
+% \bottomrule
+% \end{tabular}
% \end{table}
%
-% \begin{function}{\CTEXthepart, \CTEXthechapter, \CTEXthesection,
-% \CTEXthesubsection, \CTEXthesubsubsection, \CTEXtheparagraph,
-% \CTEXthesubparagraph}
-% 以 |\CTEXthe| 开头的这组宏给出结合了 \opt{name} 与 \opt{number} 选项的章节
-% 编号输出格式。例如在 \opt{scheme = chinese} 时,默认章编号输出格式就是
-% \tn{CTEXthechapter},形如“第一章”。
-%
-% 这组宏在 \CTeX 文档类中将代替 \tn{thechapter} 等宏的作用,在章节中引用本章
-% 节的完整编号。例如用于帮助定义自定义的目录格式、页眉格式等。
-% \end{function}
-%
-% \begin{function}[added=2016-09-18]{\CTEXifname}
-% \begin{syntax}
-% \tn{CTEXifname} \Arg{有名字时的格式命令} \Arg{无名字时的格式命令}
-% \end{syntax}
-% \tn{CTEXifname} 用于根据当前章节的名字的有无设置不同的格式。
-%
-% 它可用于 \opt{format}, \opt{titleformat}, \opt{aftertitle}, \opt{afterskip},
-% \opt{indent} 这五个选项和 \tn{chapter} 标题 \opt{beforeskip} 选项的格式设置之中。
-% 也可用于帮助定义自定义的目录格式、页眉格式等。
-%
-% 例如,设置章的标题有名字时左对齐,无名字时居中对齐,并且在标题后画一条横线。
-% \begin{ctexexam}
-% \ctexset{
-% chapter/format = \CTEXifname{\raggedright}{\centering},
-% chapter/aftertitle = \par\CTEXifname{}{\hrule},
-% }
-% \end{ctexexam}
-% \end{function}
-%
-% \begin{function}[EXP,updated=2015-06-30]{.../format, .../format+}
+% \subsection{格式相关}
+% \label{subsec:sec-format}
+%
+% \CTeX{} 宏集提供了 \opt{numberformat}, \opt{nameformat}, \opt{titleformat},
+% \opt{format} 这几个选项用来控制章节标题的格式。
+% 它们的作用范围如图~\ref{fig:heading-format} 所示。具体用法见下文。
+%
+% \begin{figure}[htbp]
+% \centering
+% \[
+% \underbrace{
+% \overbrace{
+% \text{\huge\bfseries 第}
+% \mspace{-25mu}
+% \underbrace{\text{\huge\bfseries 1}}_{\text{\small\opt{numberformat}}}
+% \mspace{-25mu}
+% \text{\huge\bfseries 章}
+% }^{\text{\small\opt{nameformat}}} \quad
+% \overbrace{\text{\huge\bfseries 熟悉 \LaTeX}}^{\text{\small\opt{titleformat}}}
+% }_{\text{\small\opt{format}}}
+% \]
+% \caption{\opt{numberformat}, \opt{nameformat}, \opt{titleformat},
+% \opt{format} 几个选项的作用范围示意}
+% \label{fig:heading-format}
+% \end{figure}
+%
+% \begin{function}[EXP,updated=2020-04-22]{.../format, .../format+}
% \begin{syntax}
% format = \Arg{格式命令}
% format+= \Arg{格式命令}
% \end{syntax}
% \opt{format} 选项用于控制章节标题的全局格式,作用域为章节名字和随后的标题
% 内容。可以用于控制章节标题的对齐方式、整体字体字号等格式。
+% 带加号的 \opt{format+} 选项用于在已有的格式命令后附加内容。
%
-% 带加号的 \opt{format+} 选项则用于在已有格式之后追加新的格式命令。
+% \opt{format} 选项的最后一个格式命令可以带有一个参数。
+% 这一参数用于接受章节名字、编号和标题内容(以及由 \opt{nameformat}, \opt{numberformat},
+% \opt{aftername}, \opt{titleformat}, \opt{aftertitle}, \opt{indent}
+% 及 \opt{hang} 选项设定的,应用于这些内容之上的格式),以实现特殊效果。
%
-% 例如,设置章格式为无衬线字体左对齐,为节格式增加无衬线字体设置:
+% 例如,设置章标题为无衬线字体左对齐、为节标题增加无衬线字体设置、
+% 为小节标题加框(\tn{fbox} 命令本身需带一个参数):
% \begin{ctexexam}
% \ctexset{
-% chapter/format = \sffamily\raggedright,
-% section/format += \sffamily
+% chapter/format = \sffamily\raggedright,
+% section/format += \sffamily,
+% subsection/format += \fbox,
% }
% \end{ctexexam}
+%
+% \opt{format} 选项的默认设置见表~\ref{tab:format-default}。
% \end{function}
%
% \begin{table}[htbp]
-% \small\centering
-% \caption{\opt{format} 选项的默认设置}
-% \begin{tabular}{lll}
-% \toprule
-% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
-% \midrule
-% part (article) & |\Large\bfseries\centering| & |\raggedright| \\
-% part (beamer) & 同右 & |\centering| \\
-% part & |\huge\bfseries\centering| & |\centering| \\
-% chapter & |\huge\bfseries\centering| & |\raggedright| \\
-% section (beamer) & 同右 & |\centering| \\
-% section & |\Large\bfseries\centering| & |\Large\bfseries| \\
-% subsection (beamer) & 同右 & |\centering| \\
-% subsection & 同右 & |\large\bfseries| \\
-% subsubsection & 同右 & |\normalsize\bfseries| \\
-% paragraph & 同右 & |\normalsize\bfseries| \\
-% subparagraph & 同右 & |\normalsize\bfseries| \\
-% \bottomrule
-% \end{tabular}
+% \small\centering
+% \begin{threeparttable}
+% \caption{\opt{format} 选项的默认设置}
+% \label{tab:format-default}
+% \begin{tabular}{lll}
+% \toprule
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
+% \midrule
+% part (article) & |\Large\bfseries\centering| & |\raggedright|\tnote{*} \\
+% part (beamer) & 同右 & |\centering| \\
+% part & |\huge\bfseries\centering| & |\centering| \\
+% chapter & |\huge\bfseries\centering| & |\raggedright| \\
+% section (beamer) & 同右 & |\centering| \\
+% section & |\Large\bfseries\centering| & |\Large\bfseries| \\
+% subsection (beamer) & 同右 & |\centering| \\
+% subsection & 同右 & |\large\bfseries| \\
+% subsubsection & 同右 & |\normalsize\bfseries| \\
+% paragraph & 同右 & |\normalsize\bfseries| \\
+% subparagraph & 同右 & |\normalsize\bfseries| \\
+% \bottomrule
+% \end{tabular}
+% \begin{tablenotes}
+% \item[*] 为了与 \LaTeXe{} 的默认效果保持一致,在 \opt{scheme = plain}
+% 时,part 和 chapter 的 \opt{nameformat} 和 \opt{titleformat}
+% 并不一样,因此没有使用 \opt{format} 选项统一设置名字和标题的格式。
+% \end{tablenotes}
+% \end{threeparttable}
% \end{table}
%
% \begin{function}[EXP,updated=2015-06-30]{.../nameformat, .../nameformat+}
@@ -1785,42 +1901,42 @@ Copyright and Licence
% \end{syntax}
% \opt{nameformat} 用于控制章节名字的格式,作用域为章节名字,包括编号。它一
% 般用于章节名(包括编号)与章节标题的字体、字号等设置不一致的情形。参见
-% \opt{titleformat} 选项。
-%
-% \opt{nameformat+} 用于在已有的章节名字格式后附加内容。
+% 下面的 \opt{titleformat} 选项。\opt{nameformat+} 用于在已有的章节名字
+% 格式命令后附加内容。
%
-% \opt{nameformat} 选项的最后一个格式命令可以是一个有一个参数的命令。
-% 这个命令的参数用于接受章节名字和编号,实现特殊效果(见例~\ref{exam:miscopt})。
+% \opt{nameformat} 选项的最后一个格式命令可以带有一个参数。
+% 这一参数用于接受章节名字和编号,以实现特殊效果(见例~\ref{exam:miscopt})。
%
-% \opt{nameformat} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
+% \opt{nameformat} 选项的默认设置见表~\ref{tab:nameformat-default}。
% \end{function}
%
% \begin{table}[htbp]
-% \small\centering
-% \caption{\opt{nameformat} 选项的默认设置}
-% \begin{tabular}{lll}
-% \toprule
-% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
-% \midrule
-% part (article) & |{}| & |\Large\bfseries| \\
-% part (beamer) & 同右
-% & \BSTACK |\usebeamerfont{part name}| \\
-% |\usebeamercolor[fg]{part name}| \ESTACK \\
-% part & |{}| & |\huge\bfseries| \\
-% chapter & |{}| & |\huge\bfseries| \\
-% section (beamer) & 同右
-% & \BSTACK |\usebeamerfont{section name}| \\
-% |\usebeamercolor[fg]{section name}| \ESTACK \\
-% section & 同右 & |{}| \\
-% subsection (beamer) & 同右
-% & \BSTACK |\usebeamerfont{subsection name}| \\
-% |\usebeamercolor[fg]{subsection name}| \ESTACK \\
-% subsection & 同右 & |{}| \\
-% subsubsection & 同右 & |{}| \\
-% paragraph & 同右 & |{}| \\
-% subparagraph & 同右 & |{}| \\
-% \bottomrule
-% \end{tabular}
+% \small\centering
+% \caption{\opt{nameformat} 选项的默认设置}
+% \label{tab:nameformat-default}
+% \begin{tabular}{lll}
+% \toprule
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
+% \midrule
+% part (article) & |{}| & |\Large\bfseries| \\
+% part (beamer) & 同右
+% & \BSTACK |\usebeamerfont{part name}| \\
+% |\usebeamercolor[fg]{part name}| \ESTACK \\
+% part & |{}| & |\huge\bfseries| \\
+% chapter & |{}| & |\huge\bfseries| \\
+% section (beamer) & 同右
+% & \BSTACK |\usebeamerfont{section name}| \\
+% |\usebeamercolor[fg]{section name}| \ESTACK \\
+% section & 同右 & |{}| \\
+% subsection (beamer) & 同右
+% & \BSTACK |\usebeamerfont{subsection name}| \\
+% |\usebeamercolor[fg]{subsection name}| \ESTACK \\
+% subsection & 同右 & |{}| \\
+% subsubsection & 同右 & |{}| \\
+% paragraph & 同右 & |{}| \\
+% subparagraph & 同右 & |{}| \\
+% \bottomrule
+% \end{tabular}
% \end{table}
%
% \begin{function}[EXP,updated=2015-06-19]{.../numberformat, .../numberformat+}
@@ -1829,74 +1945,37 @@ Copyright and Licence
% numberformat+= \Arg{格式命令}
% \end{syntax}
% \opt{numberformat} 选项用于控制章节编号的格式,作用域仅为编号数字本身。对
-% 各级标题默认均为空,当你需要编号的格式和前后的章节名字不一样时可以使用。
-%
-% \opt{numberformat+} 选项用于在原有编号格式后面附加格式命令。
+% 各级标题默认均为空,当需要编号的格式和前后的章节名字不一样时可以使用。
+% \opt{numberformat+} 用于在已有的编号格式命令后附加内容。
%
-% \opt{numberformat} 选项的最后一个格式命令可以是一个有一个参数的命令。
-% 这个命令的参数用于接受编号数字。
-% \end{function}
-%
-% 例如,我们可以使用 \opt{numberformat} 特别强调章标题中的数字:
+% \opt{numberformat} 选项的最后一个格式命令可以带有一个参数。这一参数用于接受
+% 编号数字。例如,我们可以使用 \opt{numberformat} 特别强调章标题中的数字:
% \begin{ctexexam}
% \ctexset{
% chapter/number = \arabic{chapter},
-% chapter/numberformat = \color{blue}\zihao{0}\itshape,
+% chapter/numberformat = \color{blue}\zihao{0}\emph,
% }
% \end{ctexexam}
% 上面的代码在 \opt{scheme = chinese} 时可以做出类似这样的章标题效果:
% \begin{center}
-% \huge\bfseries 第 \textit{\color{blue}\zihao{0}4} 章
+% \huge\bfseries 第 \emph{\color{blue}\zihao{0}4} 章
% \end{center}
%
-% \begin{function}[EXP,updated=2014-03-08]{.../aftername, .../aftername+}
-% \begin{syntax}
-% aftername = \Arg{代码}
-% aftername+= \Arg{代码}
-% \end{syntax}
-% \opt{aftername} 选项的参数 \meta{代码} 将被插入到章节编号与其后的标题内容之
-% 间,用于控制格式变换。常用于控制章节编号与标题内容之间的距离,或者控制标题
-% 是否另起一行。
-%
-% \opt{aftername+} 选项用于在原有代码后面附加代码。
+% \opt{numberformat} 选项默认均设置为空,故章节编号默认与章节名字使用
+% 相同的格式。
% \end{function}
%
-% \begin{table}[htbp]
-% \small\centering
-% \caption{\opt{aftername} 选项的默认设置}
-% \begin{tabular}{lll}
-% \toprule
-% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
-% \midrule
-% part (article) & |\quad| & |\par\nobreak| \\
-% part (beamer) & 同右 & |\vskip 1em \par| \\
-% part & 同右 & |\par\vskip 20pt| \\
-% chapter & |\quad| & |\par\nobreak\vskip 20pt| \\
-% section (beamer) & 同右 & |\vskip 1em \par| \\
-% section & 同右 & |\quad| \\
-% subsection (beamer) & 同右 & |\vskip 1em \par| \\
-% subsection & 同右 & |\quad| \\
-% subsubsection & 同右 & |\quad| \\
-% paragraph & 同右 & |\quad| \\
-% subparagraph & 同右 & |\quad| \\
-% \bottomrule
-% \end{tabular}
-% \end{table}
-%
% \begin{function}[EXP,updated=2015-06-30]{.../titleformat, .../titleformat+}
% \begin{syntax}
% titleformat = \Arg{格式命令}
% titleformat+= \Arg{格式命令}
% \end{syntax}
% \opt{titleformat} 选项用于控制标题内容的格式,作用域为章节标题内容。
+% \opt{titleformat+} 选项用于在已有的标题格式命令后附加内容。
%
-% \opt{titleformat+} 选项用于在原有标题格式后面附加格式命令。
-%
-% 需要注意的是,\opt{titleformat} 选项的最后一个格式命令可以是一个有一个
-% 参数的命令。这个命令的参数接受标题内容,用于实现特殊效果。
-% 例如,实现多行标题的居中悬挂对齐:
-% \end{function}
-% \begin{ctexexam}
+% \opt{titleformat} 选项的最后一个格式命令可以带有一个参数。这一参数用于接受
+% 标题内容。例如,实现多行标题的居中悬挂对齐:
+% \begin{ctexexam}
% \usepackage{varwidth} %% 提供 varwidth 环境
% \ctexset{
% chapter/name = {第,回},
@@ -1906,202 +1985,275 @@ Copyright and Licence
% \begin{varwidth}[t]{.7\linewidth}#1\end{varwidth}}
% ......
% \chapter{情中情因情感妹妹\\错里错以错劝哥哥}
-% \end{ctexexam}
-% 上面的代码可以做出类似这样的章标题效果:
-% \begin{center}\Large\bfseries
-% 第三十四回\quad
-% \begin{tabular}[t]{l}
-% 情中情因情感妹妹\\
-% 错里错以错劝哥哥
-% \end{tabular}
-% \end{center}
+% \end{ctexexam}
+% 上面的代码可以做出类似这样的章标题效果:
+% \begin{center}\Large\bfseries
+% 第三十四回\quad
+% \begin{tabular}[t]{l}
+% 情中情因情感妹妹\\
+% 错里错以错劝哥哥
+% \end{tabular}
+% \end{center}
+%
+% \opt{titleformat} 选项的默认设置见表~\ref{tab:titleformat-default}。
+% \end{function}
%
% \begin{table}[htbp]
-% \small\centering
-% \caption{\opt{titleformat} 选项的默认设置}
-% \begin{tabular}{lll}
-% \toprule
-% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
-% \midrule
-% part (article) & |{}| & |\huge\bfseries| \\
-% part (beamer) & 同右 & |\usebeamerfont{part title}| \\
-% part & |{}| & |\Huge\bfseries| \\
-% chapter & |{}| & |\Huge\bfseries| \\
-% section (beamer) & 同右 & |\usebeamerfont{section title}| \\
-% section & 同右 & |{}| \\
-% subsection (beamer) & 同右 & |\usebeamerfont{subsection title}| \\
-% subsection & 同右 & |{}| \\
-% subsubsection & 同右 & |{}| \\
-% paragraph & 同右 & |{}| \\
-% subparagraph & 同右 & |{}| \\
-% \bottomrule
-% \end{tabular}
+% \small\centering
+% \caption{\opt{titleformat} 选项的默认设置}
+% \label{tab:titleformat-default}
+% \begin{tabular}{lll}
+% \toprule
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
+% \midrule
+% part (article) & |{}| & |\huge\bfseries| \\
+% part (beamer) & 同右 & |\usebeamerfont{part title}| \\
+% part & |{}| & |\Huge\bfseries| \\
+% chapter & |{}| & |\Huge\bfseries| \\
+% section (beamer) & 同右 & |\usebeamerfont{section title}| \\
+% section & 同右 & |{}| \\
+% subsection (beamer) & 同右 & |\usebeamerfont{subsection title}| \\
+% subsection & 同右 & |{}| \\
+% subsubsection & 同右 & |{}| \\
+% paragraph & 同右 & |{}| \\
+% subparagraph & 同右 & |{}| \\
+% \bottomrule
+% \end{tabular}
% \end{table}
%
+% \begin{function}[EXP,updated=2014-03-08]{.../aftername, .../aftername+}
+% \begin{syntax}
+% aftername = \Arg{代码}
+% aftername+= \Arg{代码}
+% \end{syntax}
+% \opt{aftername} 选项的参数 \meta{代码} 将被插入到章节编号与其后的标题内容之
+% 间,用于控制格式变换。常用于控制章节编号与标题内容之间的距离,或者控制标题
+% 是否另起一行。\opt{aftername+} 用于在已有的代码后附加内容。该选项的默认设置
+% 见表~\ref{tab:aftername-default}。
+% \end{function}
+%
% \begin{function}[EXP,added=2015-06-19]{.../aftertitle, .../aftertitle+}
% \begin{syntax}
% aftertitle = \Arg{代码}
% aftertitle+= \Arg{代码}
% \end{syntax}
% \opt{aftertitle} 选项的参数 \meta{代码} 将被插入到章节标题内容之后。
+% \opt{aftertitle+} 用于在已有的代码后附加内容。该选项的默认设置
+% 见表~\ref{tab:aftertitle-default}。需注意,\opt{sub3section} 或
+% \opt{sub4section} 宏包选项(见 \ref{subs:options-heading}~节)会影响
+% \opt{aftertitle} 选项的默认值。
+% \end{function}
%
-% \opt{aftertitle+} 选项用于在原有代码后面附加代码。
-%
-% \opt{aftertitle} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
+% \begin{table}[htbp]
+% \setlength\leftskip{0pt plus 1 fil minus \marginparwidth}
+% \begin{minipage}[t]{.75\linewidth}
+% \small\centering
+% \caption{\opt{aftername} 选项的默认设置}
+% \label{tab:aftername-default}
+% \begin{tabular}{lll}
+% \toprule
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
+% \midrule
+% part (article) & |\quad| & |\par\nobreak| \\
+% part (beamer) & 同右 & |\vskip 1em \par| \\
+% part & 同右 & |\par\vskip 20pt| \\
+% chapter & |\quad| & |\par\nobreak\vskip 20pt| \\
+% section (beamer) & 同右 & |\vskip 1em \par| \\
+% section & 同右 & |\quad| \\
+% subsection (beamer) & 同右 & |\vskip 1em \par| \\
+% subsection & 同右 & |\quad| \\
+% subsubsection & 同右 & |\quad| \\
+% paragraph & 同右 & |\quad| \\
+% subparagraph & 同右 & |\quad| \\
+% \bottomrule
+% \end{tabular}
+% \end{minipage}\nobreak\quad
+% \begin{minipage}[t]{.42\linewidth}
+% \small\centering
+% \caption{\opt{aftertitle} 选项的默认设置}
+% \label{tab:aftertitle-default}
+% \begin{tabular}{p{\dimexpr .58\linewidth - 2\tabcolsep\relax}p{\dimexpr .4\linewidth - 2\tabcolsep\relax}}
+% \toprule
+% 标题名 & 默认值 \\
+% \midrule
+% part & |\par| \\
+% chapter & |\par| \\
+% section & |\@@par| \\
+% subsection & |\@@par| \\
+% subsubsection & |\@@par| \\
+% paragraph & |{}| \\
+% \qquad(sub3section) & |\@@par| \\
+% \qquad(sub4section) & 同上 \\
+% subparagraph & |{}| \\
+% \qquad(sub4section) & |\@@par| \\
+% \bottomrule
+% \end{tabular}
+% \end{minipage}
+% \end{table}
%
-% \opt{sub3section} 或 \opt{sub4section} 宏包选项(见
-% \ref{subs:options-heading}~节)会影响 \opt{aftertitle} 选项的默认值。
+% \begin{function}[EXP,added=2014-03-21]{part/pagestyle, chapter/pagestyle}
+% \begin{syntax}
+% pagestyle = \Arg{页面格式}
+% \end{syntax}
+% 设置 \cls{book}/\cls{ctexbook} 或 \cls{report}/\cls{ctexrep} 文档类
+% 中,\tn{part} 与 \tn{chapter} 标题所在页的页面格式(page style)。
+% 该选项的默认设置见表~\ref{tab:pagestyle-default}。
% \end{function}
%
% \begin{table}[htbp]
-% \begin{minipage}[t]{.5\linewidth}
-% \small\centering
-% \caption{\opt{aftertitle} 选项的默认设置}
-% \begin{tabular}{ll}
-% \toprule
-% 标题名 & 默认值 \\
-% \midrule
-% part & |\par| \\
-% chapter & |\par| \\
-% section & |\@@par| \\
-% subsection & |\@@par| \\
-% subsubsection & |\@@par| \\
-% paragraph & |{}| \\
-% \qquad(sub3section) & |\@@par| \\
-% \qquad(sub4section) & 同上 \\
-% subparagraph & |{}| \\
-% \qquad(sub4section) & |\@@par| \\
-% \bottomrule
-% \end{tabular}
-% \end{minipage}%
-% \begin{minipage}[t]{.5\linewidth}
-% \small\centering
-% \caption{\opt{runin} 选项的默认设置}
-% \begin{tabular}{ll}
-% \toprule
-% 标题名 & 默认值 \\
-% \midrule
-% part & 无效 \\
-% chapter & 无效 \\
-% section & |false| \\
-% subsection & |false| \\
-% subsubsection & |false| \\
-% paragraph & |true| \\
-% \qquad(sub3section) & |false| \\
-% \qquad(sub4section) & 同上 \\
-% subparagraph & |true| \\
-% \qquad(sub4section) & |false| \\
-% \bottomrule
-% \end{tabular}
-% \end{minipage}
+% \small\centering
+% \caption{\opt{pagestyle} 选项的默认设置}
+% \label{tab:pagestyle-default}
+% \begin{tabular}{ll}
+% \toprule
+% 标题名 & 默认值 \\
+% \midrule
+% part (article) & 无效 \\
+% part & |plain| \\
+% chapter & |plain| \\
+% \bottomrule
+% \end{tabular}
% \end{table}
%
+% \subsection{间距、缩进相关}
+% \label{subsec:sec-spacing}
+%
% \begin{function}[EXP,added=2015-06-27]{section/runin, subsection/runin,
% subsubsection/runin, paragraph/runin, subparagraph/runin}
% \begin{syntax}
% runin = \TF
% \end{syntax}
-% \opt{runin} 选项只对 \tn{section} 级以下标题有意义。
-% 用于确定标题与随后的正文是否排在同一段之上。
-%
-% \opt{runin} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
+% \opt{runin} 选项只对 \tn{section} 级以下标题有意义,用于确定标题与随后的
+% 正文是否排在同一段之上。该选项的默认设置见表~\ref{tab:runin-default}。
%
% 默认情况下,\tn{paragraph}、\tn{subparagraph} 两级标题是与后面正文排在同一
% 段的,\opt{runin} 选项为 \opt{true};但使用 \opt{sub3section} 或
-% \opt{sub4section} 宏包选项(见 \ref{subs:options-heading}~节)后,
-% 将对这两级标题设 \opt{runin} 选项为 \opt{false},这两级标题会改为排在不同段。
+% \opt{sub4section} 宏包选项(见 \ref{subs:options-heading}~节)后,将对
+% 这两级标题设 \opt{runin} 选项为 \opt{false},这两级标题会改为排在不同段。
% \end{function}
%
-% \begin{function}[EXP,added=2015-06-27]{.../afterindent}
+% \begin{table}[htbp]
+% \small\centering
+% \caption{\opt{runin} 选项的默认设置}
+% \label{tab:runin-default}
+% \begin{tabular}{ll}
+% \toprule
+% 标题名 & 默认值 \\
+% \midrule
+% part & 无效 \\
+% chapter & 无效 \\
+% section & |false| \\
+% subsection & |false| \\
+% subsubsection & |false| \\
+% paragraph & |true| \\
+% \qquad(sub3section) & |false| \\
+% \qquad(sub4section) & 同上 \\
+% subparagraph & |true| \\
+% \qquad(sub4section) & |false| \\
+% \bottomrule
+% \end{tabular}
+% \end{table}
+%
+% \begin{function}[EXP,updated=2020-04-23]{.../hang}
% \begin{syntax}
-% afterindent = \TF
+% hang = \TF
% \end{syntax}
-% \opt{afterindent} 选项用于设置章节标题后首段的缩进。
+% \opt{hang} 选项用于设置是否对章节标题实施悬挂缩进(缩进的宽度为名字宽度
+% 和 \opt{indent} 选项设置的宽度之和)。
%
-% \cls{book} 和 \cls{report} 类的 \tn{part} 标题被单独排在一页之上,
-% \opt{afterindent} 选项没有意义。
+% 注意,当 \opt{hang = true} 时,不恰当地设置选项 \opt{aftername} 的值,可能会引发
+% 错误。这是因为当 \opt{hang = true} 时,\LaTeX{} 内部会构造一个 \tn{hbox} 而
+% 进入受限水平模式(restricted horizontal mode)。若在 \opt{aftername} 中加入
+% 包含 \tn{vskip} 等会导致从受限水平模式切出的垂直命令(vertical command)时,就会报错。
+% 特别地,\opt{aftername} 的默认值也可能导致这种情形(见表~\ref{tab:aftername-default})。
+% 因此,当设置 \opt{hang = true} 时,用户必须恰当地设置选项 \opt{aftername} 的值。
%
+% 本选项对 \cls{beamer}/\cls{ctexbeamer} 文档类无效。
% 对于 \tn{section} 级以下标题,若设置了 \opt{runin} 选项为 \opt{true},
-% 即标题与随后正文排在同一段,\opt{afterindent} 选项也就没有了意义。
+% 即标题与随后正文排在同一段,\opt{hang} 选项没有意义。
+% 该选项的默认设置见表~\ref{tab:hang-default}。
% \end{function}
%
% \begin{table}[htbp]
-% \small\centering
-% \caption{\opt{afterindent} 选项的默认设置}
-% \begin{tabular}{lll}
-% \toprule
-% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
-% \midrule
-% part (article) & |true| & |false| \\
-% part & 无效 & 无效 \\
-% chapter & |true| & |false| \\
-% section & |true| & |false| \\
-% subsection & |true| & |false| \\
-% subsubsection & |true| & |false| \\
-% paragraph & |true| & |false| \\
-% subparagraph & |true| & |false| \\
-% \bottomrule
-% \end{tabular}
+% \begin{minipage}[t]{.5\linewidth}
+% \small\centering
+% \caption{\opt{hang} 选项的默认设置}
+% \label{tab:hang-default}
+% \begin{tabular}{ll}
+% \toprule
+% 标题名 & 默认值 \\
+% \midrule
+% part & |false| \\
+% chapter & |false| \\
+% section & |true| \\
+% subsection & |true| \\
+% subsubsection & |true| \\
+% paragraph & 无意义 \\
+% \qquad(sub3section) & |true| \\
+% \qquad(sub4section) & |true| \\
+% subparagraph & 无意义 \\
+% \qquad(sub4section) & |true| \\
+% \bottomrule
+% \end{tabular}
+% \end{minipage}^^A
+% \begin{minipage}[t]{.5\linewidth}
+% \small\centering
+% \caption{\opt{indent} 选项的默认设置}
+% \label{tab:indent-default}
+% \begin{tabular}{ll}
+% \toprule
+% 标题名 & 默认值 \\
+% \midrule
+% part & |0pt| \\
+% chapter & |0pt| \\
+% section & |0pt| \\
+% subsection & |0pt| \\
+% subsubsection & |0pt| \\
+% paragraph & |0pt| \\
+% subparagraph & |\parindent| \\
+% \qquad(sub3section) & |0pt| \\
+% \qquad(sub4section) & 同上 \\
+% \bottomrule
+% \end{tabular}
+% \end{minipage}
% \end{table}
%
+% \begin{function}[EXP,updated=2020-04-23]{.../indent}
+% \begin{syntax}
+% indent = \Arg{缩进间距}
+% \end{syntax}
+% \opt{indent} 选项用于设置章节标题本身的首行缩进。
+% 该选项的默认设置见表~\ref{tab:indent-default}。
+%
+% 如果 \opt{indent} 的值是以 \texttt{em}、\texttt{ex} 或 \cs{ccwd} 为单位,
+% 那么缩进间距的大小是相对于 \opt{format} 中指定的字号大小。
+% 例如,设置 \tn{part} 标题缩进三个字、\tn{section} 标题缩进 \SI{20}{pt}:
+% \begin{ctexexam}
+% \ctexset{
+% part = {
+% format += \raggedright,
+% indent = 3\ccwd,
+% },
+% section = {
+% format = \Large\bfseries,
+% indent = 20pt,
+% }
+% }
+% \part{首行缩进的标题}
+% \noindent 无缩进的正文。
+% \section{首行缩进的标题}
+% \noindent 无缩进的正文。
+% \end{ctexexam}
+% \end{function}
+%
% \begin{function}[EXP,updated=2016-05-10]{.../beforeskip}
% \begin{syntax}
% beforeskip = \Arg{弹性间距}
% \end{syntax}
% \opt{beforeskip} 选项用于设置章节标题前的垂直间距。
-%
-% \opt{beforeskip} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
+% 该选项的默认设置见表~\ref{tab:beforeskip-default}。
% \end{function}
%
-% \begin{table}[htbp]
-% \setlength\leftskip{0pt plus 1 fil minus \marginparwidth}
-% \begin{minipage}[t]{.6\linewidth}
-% \small\centering
-% \caption{\opt{beforeskip} 选项的默认设置}
-% \begin{tabular}{ll}
-% \toprule
-% 标题名 & 默认值 \\
-% \midrule
-% part (article) & |4ex| \\
-% part (beamer) & |0pt| \\
-% part & |0pt plus 1fil| \\
-% chapter & |50pt| \\
-% section (beamer) & |0pt| \\
-% section & |3.5ex plus 1ex minus .2ex| \\
-% subsection (beamer) & |0pt| \\
-% subsection & |3.25ex plus 1ex minus .2ex| \\
-% subsubsection & |3.25ex plus 1ex minus .2ex| \\
-% paragraph & |3.25ex plus 1ex minus .2ex| \\
-% subparagraph & |3.25ex plus 1ex minus .2ex| \\
-% \bottomrule
-% \end{tabular}
-% \end{minipage}%
-% \begin{minipage}[t]{.5\linewidth}
-% \small\centering
-% \caption{\opt{afterskip} 选项的默认设置}
-% \begin{tabular}{ll}
-% \toprule
-% 标题名 & 默认值 \\
-% \midrule
-% part (article) & |3ex| \\
-% part (beamer) & |0pt| \\
-% part & |0pt plus 1fil| \\
-% chapter & |40pt| \\
-% section (beamer) & |0pt| \\
-% section & |2.3ex plus .2ex| \\
-% subsection (beamer) & |0pt| \\
-% subsection & |1.5ex plus .2ex| \\
-% subsubsection & |1.5ex plus .2ex| \\
-% paragraph & |1em| \\
-% \qquad(sub3section) & |1ex plus .2ex| \\
-% \qquad(sub4section) & 同上 \\
-% subparagraph & |1em| \\
-% \qquad(sub4section) & |1ex plus .2ex| \\
-% \bottomrule
-% \end{tabular}
-% \end{minipage}
-% \end{table}
-%
% \begin{function}[EXP,updated=2015-06-27]{.../afterskip}
% \begin{syntax}
% afterskip = \Arg{弹性间距}
@@ -2112,222 +2264,217 @@ Copyright and Licence
% 若 \opt{runin} 为 \opt{true},标题与随后正文排在同一段,\meta{弹性间距} 给出水平间距。
% 否则,正文另起一段,\meta{弹性间距} 给出的是垂直间距。
%
-% \opt{afterskip} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
-%
-% \opt{sub3section} 或 \opt{sub4section} 宏包选项(见
+% 该选项的默认设置见表~\ref{tab:afterskip-default}。
+% 注意 \opt{sub3section} 或 \opt{sub4section} 宏包选项(见
% \ref{subs:options-heading}~节)会影响 \opt{aftertitle} 选项的默认值。
% \end{function}
%
+% \begin{table}[htbp]
+% \setlength\leftskip{0pt plus 1 fil minus \marginparwidth}
+% \begin{minipage}[t]{.6\linewidth}
+% \small\centering
+% \caption{\opt{beforeskip} 选项的默认设置}
+% \label{tab:beforeskip-default}
+% \begin{tabular}{ll}
+% \toprule
+% 标题名 & 默认值 \\
+% \midrule
+% part (article) & |4ex| \\
+% part (beamer) & |0pt| \\
+% part & |0pt plus 1fil| \\
+% chapter & |50pt| \\
+% section (beamer) & |0pt| \\
+% section & |3.5ex plus 1ex minus .2ex| \\
+% subsection (beamer) & |0pt| \\
+% subsection & |3.25ex plus 1ex minus .2ex| \\
+% subsubsection & |3.25ex plus 1ex minus .2ex| \\
+% paragraph & |3.25ex plus 1ex minus .2ex| \\
+% subparagraph & |3.25ex plus 1ex minus .2ex| \\
+% \bottomrule
+% \end{tabular}
+% \end{minipage}\nobreak\quad
+% \begin{minipage}[t]{.5\linewidth}
+% \small\centering
+% \caption{\opt{afterskip} 选项的默认设置}
+% \label{tab:afterskip-default}
+% \begin{tabular}{ll}
+% \toprule
+% 标题名 & 默认值 \\
+% \midrule
+% part (article) & |3ex| \\
+% part (beamer) & |0pt| \\
+% part & |0pt plus 1fil| \\
+% chapter & |40pt| \\
+% section (beamer) & |0pt| \\
+% section & |2.3ex plus .2ex| \\
+% subsection (beamer) & |0pt| \\
+% subsection & |1.5ex plus .2ex| \\
+% subsubsection & |1.5ex plus .2ex| \\
+% paragraph & |1em| \\
+% \qquad(sub3section) & |1ex plus .2ex| \\
+% \qquad(sub4section) & 同上 \\
+% subparagraph & |1em| \\
+% \qquad(sub4section) & |1ex plus .2ex| \\
+% \bottomrule
+% \end{tabular}
+% \end{minipage}
+% \end{table}
+%
% \begin{function}[EXP,added=2016-06-03]{.../fixskip}
% \begin{syntax}
% fixskip = \TFF
% \end{syntax}
-% 默认情况下,\cls{article}、\cls{book} 和 \cls{report} 类的标题与正文的距离除了由
-% \opt{beforeskip} 和 \opt{afterskip} 选项设置的垂直间距外,还会有一些多余的间距。
-% \opt{fixskip} 选项用于抑制这些多余间距。
+% 默认情况下,\cls{article}、\cls{book} 和 \cls{report} 类的标题与正文的距离
+% 除了由 \opt{beforeskip} 和 \opt{afterskip} 选项设置的垂直间距外,还会有
+% 一些多余的间距。\opt{fixskip} 选项用于抑制这些多余间距。该选项默认不开启。
% \end{function}
%
-% \begin{function}[EXP,added=2016-10-01]{chapter/lofskip, chapter/lotskip}
-% \begin{syntax}
-% lofskip = \Arg{弹性间距}
-% lotskip = \Arg{弹性间距}
-% \end{syntax}
-% \opt{lofskip} 选项控制插图目录(\file{.lof})中,章之间的插图标题的距离。
-%
-% 同样,\opt{lotskip} 选项控制表格目录(\file{.lot})中,章之间的表格标题的距离。
-%
-% 目前,这两个选项只在 \opt{chapter} 标题下有定义。
-% 他们的默认值,在 \opt{scheme} 选项的不同取值下都为 \SI{10}{pt}。
-% \end{function}
-%
-% \begin{function}[EXP,updated=2015-06-27]{.../indent}
+% \begin{function}[EXP,added=2016-09-19]{.../break, .../break+}
% \begin{syntax}
-% indent = \Arg{缩进间距}
+% break = \Arg{格式命令}
+% break+= \Arg{格式命令}
% \end{syntax}
-% \opt{indent} 选项用于设置章节标题本身的首行缩进。
-%
-% \opt{indent} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
+% \opt{break} 选项用于控制章节标题与\emph{之前}正文的分隔关系。
+% 一般用于设置是否在标题之前分页或者设置行间罚点。
+% \opt{break+} 用于在已有的格式命令后附加内容。
%
-% 如果 \opt{indent} 的值是以 \texttt{em}、\texttt{ex} 或 \cs{ccwd} 为单位,
-% 那么缩进间距的大小是相对于 \opt{format} 中指定的字号大小。
+% 例如,若当前页剩余高度小于正文高度的一半时,则另起一页输出
+% \tn{section} 标题:
+% \begin{ctexexam}
+% \usepackage{needspace}
+% \ctexset{section/break = \Needspace{.5\textheight}}
+% \end{ctexexam}
%
-% 例如,设置 \tn{part} 标题缩进三个字、\tn{section} 标题缩进 \SI{20}{pt}:
+% 该选项的默认设置见表~\ref{tab:break-default}。
% \end{function}
-% \begin{ctexexam}
-% \ctexset{
-% part={
-% format+=\raggedright,
-% indent=3\ccwd,
-% },
-% section={
-% format=\Large\bfseries,
-% indent=20pt,
-% }
-% }
-% \part{首行缩进的标题}
-% \noindent 无缩进的正文。
-% \section{首行缩进的标题}
-% \noindent 无缩进的正文。
-% \end{ctexexam}
%
% \begin{table}[htbp]
-% \begin{minipage}[t]{.5\linewidth}
-% \small\centering
-% \caption{\opt{indent} 选项的默认设置}
-% \begin{tabular}{ll}
-% \toprule
-% 标题名 & 默认值 \\
-% \midrule
-% part & |0pt| \\
-% chapter & |0pt| \\
-% section & |0pt| \\
-% subsection & |0pt| \\
-% subsubsection & |0pt| \\
-% paragraph & |0pt| \\
-% subparagraph & |\parindent| \\
-% \qquad(sub3section) & |0pt| \\
-% \qquad(sub4section) & 同上 \\
-% \bottomrule
-% \end{tabular}
-% \end{minipage}%
-% \begin{minipage}[t]{.5\linewidth}
-% \small\centering
-% \caption{\opt{hang} 选项的默认设置}
-% \begin{tabular}{ll}
-% \toprule
-% 标题名 & 默认值 \\
-% \midrule
-% part & |false| \\
-% chapter & |false| \\
-% section & |true| \\
-% subsection & |true| \\
-% subsubsection & |true| \\
-% paragraph & 无意义 \\
-% \qquad(sub3section) & |true| \\
-% \qquad(sub4section) & |true| \\
-% subparagraph & 无意义 \\
-% \qquad(sub4section) & |true| \\
-% \bottomrule
-% \end{tabular}
-% \end{minipage}%
+% \small\centering
+% \caption{\opt{break} 选项的默认设置}
+% \label{tab:break-default}
+% \begin{tabular}{ll}
+% \toprule
+% 标题名 & 默认值 \\
+% \midrule
+% part (article) & |{}| \\
+% part & |\if@openright\cleardoublepage\else\clearpage\fi| \\
+% chapter & 同上 \\
+% section & |\addpenalty{\@secpenalty}| \\
+% subsection & 同上 \\
+% subsubsection & 同上 \\
+% paragraph & 同上 \\
+% subparagraph & 同上 \\
+% \bottomrule
+% \end{tabular}
% \end{table}
%
-% \begin{function}[EXP,updated=2019-03-31]{part/hang, chapter/hang, section/hang,
-% subsection/hang, subsubsection/hang, paragraph/hang, subparagraph/hang}
+% \begin{function}[EXP,added=2015-06-27]{.../afterindent}
% \begin{syntax}
-% hang = \TF
+% afterindent = \TF
% \end{syntax}
-% \opt{hang} 选项用于设置是否对章节标题实施悬挂缩进(缩进的宽度为名字宽度和 \opt{indent} 选项
-% 设置的宽度之和)。
+% \opt{afterindent} 选项用于设置章节标题后首段的缩进。
%
-% 本选项对 \cls{beamer}/\cls{ctexbeamer} 文档类无效。
+% \cls{book} 和 \cls{report} 类的 \tn{part} 标题被单独排在一页之上,
+% \opt{afterindent} 选项没有意义。
% 对于 \tn{section} 级以下标题,若设置了 \opt{runin} 选项为 \opt{true},
-% 即标题与随后正文排在同一段,\opt{hang} 选项没有意义。
-% \end{function}
+% 即标题与随后正文排在同一段,\opt{afterindent} 选项也就没有了意义。
%
-% \begin{function}[EXP,added=2014-03-21]{part/pagestyle, chapter/pagestyle}
-% \begin{syntax}
-% pagestyle = \Arg{页面格式}
-% \end{syntax}
-% 设置 \cls{book}/\cls{ctexbook} 或 \cls{report}/\cls{ctexrep} 文档类
-% 中,\tn{part} 与 \tn{chapter} 标题所在页的页面格式(page style)。
+% 该选项的默认设置见表~\ref{tab:afterindent-default}。
% \end{function}
%
% \begin{table}[htbp]
-% \small\centering
-% \caption{\opt{pagestyle} 选项的默认设置}
-% \begin{tabular}{ll}
-% \toprule
-% 标题名 & 默认值 \\
-% \midrule
-% part (article) & 无效 \\
-% part & |plain| \\
-% chapter & |plain| \\
-% \bottomrule
-% \end{tabular}
+% \small\centering
+% \caption{\opt{afterindent} 选项的默认设置}
+% \label{tab:afterindent-default}
+% \begin{tabular}{lll}
+% \toprule
+% 标题名 & \opt{scheme = chinese} & \opt{scheme = plain} \\
+% \midrule
+% part (article) & |true| & |false| \\
+% part & 无效 & 无效 \\
+% chapter & |true| & |false| \\
+% section & |true| & |false| \\
+% subsection & |true| & |false| \\
+% subsubsection & |true| & |false| \\
+% paragraph & |true| & |false| \\
+% subparagraph & |true| & |false| \\
+% \bottomrule
+% \end{tabular}
% \end{table}
%
-% \begin{function}[EXP,added=2016-09-19]{.../break, .../break+}
+% \subsection{目录、附录相关}
+% \label{subsec:sec-toc-appendix}
+%
+% \begin{function}[EXP,added=2020-05-06]{tocdepth}
% \begin{syntax}
-% break = \Arg{格式命令}
-% break+= \Arg{格式命令}
+% tocdepth = <整数或章节名称>
% \end{syntax}
-% \opt{break} 选项用于控制章节标题与之前正文的分隔关系。一般用于设置是否在标题之前分页或者设置行间罚点。
-%
-% 带加号的 \opt{break+} 选项则用于在已有格式之后追加新的格式命令。
-%
-% \opt{break} 选项的默认值,在 \opt{scheme} 选项的不同取值下相同。
-%
-% 例如,若当前页剩余高度小于正文高度的一半时,则另起一页输出 \tn{section} 标题:
-% \begin{ctexexam}
-% \usepackage{needspace}
-% \ctexset{section/break = \Needspace{.5\textheight}}
-% \end{ctexexam}
+% 设置对章节标题编入目录的层次数。\opt{tocdepth} 的值可以是一个整数,也可以是
+% |part|, |chapter| 等名称。
+% 层次数与名称的对应关系见表~\ref{tab:heading-level}。
+% 章节层次的默认设置见表~\ref{tab:heading-level-default}。
% \end{function}
%
-% \begin{table}[htbp]
-% \small\centering
-% \caption{\opt{break} 选项的默认设置}
-% \begin{tabular}{ll}
-% \toprule
-% 标题名 & 默认值 \\
-% \midrule
-% part (article) & |{}| \\
-% part & |\if@openright\cleardoublepage\else\clearpage\fi| \\
-% chapter & 同上 \\
-% section & |\addpenalty{\@secpenalty}| \\
-% subsection & 同上 \\
-% subsubsection & 同上 \\
-% paragraph & 同上 \\
-% subparagraph & 同上 \\
-% \bottomrule
-% \end{tabular}
-% \end{table}
-%
% \begin{function}[EXP,added=2016-10-25]{.../tocline}
% \begin{syntax}
% tocline = \Arg{格式定义}
% \end{syntax}
-% \opt{tocline} 选项用于定义章节标题在目录文件(\file{.toc})中的格式。\meta{格式定义}有两个参数:
-% 参数 |#1| 是 |part|、|chapter| 等名字,参数 |#2| 是标题内容。
+% \opt{tocline} 选项用于定义章节标题在目录文件(\file{.toc})中的格式。
+% \meta{格式定义}有两个参数:参数 |#1| 是 |part|、|chapter| 等名字,
+% 参数 |#2| 是标题内容。该选项的默认设置见表~\ref{tab:tocline-default}。
% \end{function}
%
% \begin{table}[htbp]
-% \small\centering
-% \caption{\opt{tocline} 选项的默认设置}
-% \begin{tabular}{ll}
-% \toprule
-% 标题名 & 默认值 \\
-% \midrule
-% part & |\CTEXifname{\CTEXthepart\hspace{1em}}{}#2| \\
-% chapter (\opt{chinese})
-% & |\CTEXifname{\protect\numberline{\CTEXthechapter\hspace{.3em}}}{}#2| \\
-% chapter (\opt{plain})
-% & |\CTEXnumberline{#1}#2| \\
-% section & |\CTEXnumberline{#1}#2| \\
-% subsection & 同上 \\
-% subsubsection & 同上 \\
-% paragraph & 同上 \\
-% subparagraph & 同上 \\
-% \bottomrule
-% \end{tabular}
-%
-% \medskip
-% 其中 \tn{CTEXnumberline} 的意义是若标题 |#1| 没有名字,则不输出 |\numberline{\CTEXthe#1}|
-% 等编号:
-% \begin{verbatim}
-% \CTEXifname{\protect\numberline{\csname CTEXthe#1\endcsname}}{}
-% \end{verbatim}
+% \small\centering
+% \caption{\opt{tocline} 选项的默认设置}
+% \label{tab:tocline-default}
+% \begin{tabular}{ll}
+% \toprule
+% 标题名 & 默认值 \\
+% \midrule
+% part & |\CTEXifname{\CTEXthepart\hspace{1em}}{}#2| \\
+% chapter (\opt{chinese})
+% & |\CTEXifname{\protect\numberline{\CTEXthechapter\hspace{.3em}}}{}#2| \\
+% chapter (\opt{plain})
+% & |\CTEXnumberline{#1}#2| \\
+% section & |\CTEXnumberline{#1}#2| \\
+% subsection & 同上 \\
+% subsubsection & 同上 \\
+% paragraph & 同上 \\
+% subparagraph & 同上 \\
+% \bottomrule
+% \end{tabular}
+%
+% \medskip
+% \raggedright
+% 这里 \tn{CTEXnumberline} 的意义是,若标题 |#1| 没有名字,则不输出
+% |\numberline{\CTEXthe#1}| 等编号:
+% \begin{verbatim}
+% \CTEXifname{\protect\numberline{\csname CTEXthe#1\endcsname}}{}
+% \end{verbatim}
+% 其中,\tn{CTEXifname} 的定义见 \ref{subsec:sec-commands}~小节。
% \end{table}
%
+% \begin{function}[EXP,added=2016-10-01]{chapter/lofskip, chapter/lotskip}
+% \begin{syntax}
+% lofskip = \Arg{弹性间距}
+% lotskip = \Arg{弹性间距}
+% \end{syntax}
+% \opt{lofskip} 选项控制插图目录(\file{.lof})中,章之间的插图标题的距离。
+% 同样,\opt{lotskip} 选项控制表格目录(\file{.lot})中,章之间的表格标题
+% 的距离。
+%
+% 目前,这两个选项只在 \opt{chapter} 标题下有定义。
+% 它们的默认值,在 \opt{scheme} 选项的不同取值下都为 \SI{10}{pt}。
+% \end{function}
+%
% \begin{function}[EXP,added=2015-06-21]{appendix/numbering}
% \begin{syntax}
% numbering = \TTF
% \end{syntax}
-% 控制是否对附录章(对 \cls{book} 与 \cls{report})或附录节(对 \cls{article})
-% 进行编号。
-%
-% 用法与普通章节 \opt{numbering} 选项类似。
+% 控制是否对附录章(对应 \cls{book} 与 \cls{report})或附录节
+% (对应 \cls{article})进行编号,用法与普通章节对应的 \opt{numbering}
+% 选项相同。该选项默认值为 \opt{true}。
% \end{function}
%
% \begin{function}[EXP,updated=2014-03-08]{appendix/name}
@@ -2335,60 +2482,104 @@ Copyright and Licence
% name = \{<前名字>,<后名字>\}
% name = \Arg{前名字}
% \end{syntax}
-% 设置附录章(对 \cls{book} 与 \cls{report})或附录节(对 \cls{article})的
-% 名字。
-%
-% 用法与普通章节 \opt{name} 选项类似。
+% 设置附录章(对应 \cls{book} 与 \cls{report})或附录节(对应 \cls{article})
+% 的名字,用法与普通章节对应的 \opt{name} 选项相同。
%
% 注意该选项与 \opt{appendixname} 选项(\ref{subs:capname}~节)在意义上有
-% 些重叠,但意义不同。\opt{appendixname} 选项只用来重定义
-% \tn{appendixname},而不管 \tn{appendixname} 如何使用;该选项则决定在章节标
-% 题中输出的名字,可以调用 \tn{appendixname} 设置。
+% 些重叠,但不完全相同。\opt{appendixname} 选项只用来重定义
+% \tn{appendixname},而不管 \tn{appendixname} 如何使用;该选项则决定在章节
+% 标题中输出的名字,可以调用 \tn{appendixname} 设置。
+%
+% 该选项的默认设置见表~\ref{tab:appendix-name-default}。
% \end{function}
%
% \begin{table}[htbp]
-% \small\centering
-% \caption{\opt{appendix/name} 选项的默认设置}
-% \begin{tabular}{llllll}
-% \toprule
-% 文档类 & 影响命令 & \opt{scheme = chinese} & 实际定义
-% & \opt{scheme = plain} & 实际定义 \\
-% \midrule
-% article & \tn{section} & |{}| & & |{}| & \\
-% book, report & \tn{chapter} & |\appendixname\space| & \verb*|附录 |
-% & |\appendixname\space| & \verb*|Appendix | \\
-% \bottomrule
-% \end{tabular}
+% \small\centering
+% \caption{\opt{appendix/name} 选项的默认设置}
+% \label{tab:appendix-name-default}
+% \begin{tabular}{llllll}
+% \toprule
+% 文档类 & 影响命令 & \opt{scheme = chinese} & 实际定义
+% & \opt{scheme = plain} & 实际定义 \\
+% \midrule
+% \cls{article} & \tn{section} & |{}| & & |{}| & \\
+% \cls{book}, \cls{report}
+% & \tn{chapter} & |\appendixname\space| & \verb*|附录 |
+% & |\appendixname\space| & \verb*|Appendix | \\
+% \bottomrule
+% \end{tabular}
% \end{table}
%
% \begin{function}[EXP]{appendix/number}
% \begin{syntax}
% number = \Arg{数字输出命令}
% \end{syntax}
-% 设置附录章(对 \cls{book} 与 \cls{report})或附录节(对 \cls{article})编
-% 号的数字输出格式。
-%
-% 用法与普通章节的 \opt{number} 选项类似。
-%
-% 该选项也同时控制附录章节计数器的交叉引用。
+% 设置附录章(对 \cls{book} 与 \cls{report})或附录节(对 \cls{article})
+% 编号的数字输出格式,用法与普通章节对应的 \opt{number} 选项相同。
%
+% \opt{appendix/number} 选项同时也会控制附录章节计数器的交叉引用。
% 与普通章节的 \opt{number} 选项类似,同样需要注意,该选项不会影响计数器本身
% 的输出,即不影响 \tn{thesection} 或 \tn{thechapter} 的定义。
+%
+% 该选项的默认设置见表~\ref{tab:appendix-number-default}。
% \end{function}
%
% \begin{table}[htbp]
-% \small\centering
-% \caption{\opt{appendix/number} 选项的默认设置}
-% \begin{tabular}{llllll}
-% \toprule
-% 文档类 & 影响命令 & 默认值 \\
-% \midrule
-% article & \tn{section} & |\Alph{section}| \\
-% book, report & \tn{chapter} & |\Alph{chapter}| \\
-% \bottomrule
-% \end{tabular}
+% \small\centering
+% \caption{\opt{appendix/number} 选项的默认设置}
+% \label{tab:appendix-number-default}
+% \begin{tabular}{llllll}
+% \toprule
+% 文档类 & 影响命令 & 默认值 \\
+% \midrule
+% \cls{article} & \tn{section} & |\Alph{section}| \\
+% \cls{book}, \cls{report} & \tn{chapter} & |\Alph{chapter}| \\
+% \bottomrule
+% \end{tabular}
% \end{table}
%
+% \subsection{辅助命令}
+% \label{subsec:sec-commands}
+%
+% \CTeX{} 宏集还提供了一些辅助命令(宏),用于存储章节标题格式,或进行一些条件判断。
+%
+% \begin{function}{\CTEXthepart, \CTEXthechapter, \CTEXthesection,
+% \CTEXthesubsection, \CTEXthesubsubsection, \CTEXtheparagraph,
+% \CTEXthesubparagraph}
+% 以 |\CTEXthe| 开头的这组宏给出结合了 \opt{name} 与 \opt{number} 选项的章节
+% 编号输出格式。例如在 \opt{scheme = chinese} 时,默认章编号输出格式就是
+% \tn{CTEXthechapter},形如“第一章”。
+%
+% 这组宏在 \CTeX 文档类中将代替 \tn{thechapter} 等宏的作用,在章节中引用本章
+% 节的完整编号。例如用于帮助定义自定义的目录格式、页眉格式等。
+% \end{function}
+%
+% \begin{function}[added=2016-09-18]{\CTEXifname}
+% \begin{syntax}
+% \tn{CTEXifname} \Arg{有名字时的内容} \Arg{无名字时的内容}
+% \end{syntax}
+% \tn{CTEXifname} 会根据当前章节有无名字展开得到不同内容(通常是格式命令)。
+% 由于章节名字总是与编号一起出现,章节有无名字通常也表达为“章节是否编号”。
+% 在 \LaTeX{} 中,后者取决于以下几个方面:章节深度是否不大于计数器
+% |secnumdepth| 的值,章节标题是否使用不带星号的命令。在 \CTeX{} 宏集中,
+% 后者还取决于 \opt{.../numbering} 是否为 \opt{true}。
+%
+% \tn{CTEXifname} 可用于 \opt{format}, \opt{titleformat}, \opt{aftertitle},
+% \opt{afterskip}, \opt{indent} 这五个选项和 \tn{chapter} 标题
+% \opt{beforeskip} 选项的格式设置之中。也可用于帮助定义自定义的目录格式、
+% 页眉格式等。
+%
+% 例如,设置章的标题有名字时左对齐,无名字时居中对齐,并且在标题后画一条横线。
+% \begin{ctexexam}
+% \ctexset{
+% chapter/format = \CTEXifname{\raggedright}{\centering},
+% chapter/aftertitle = \par\CTEXifname{}{\hrule},
+% }
+% \end{ctexexam}
+% \end{function}
+%
+% \subsection{示例}
+%
% 我们最后举一个稍微复杂的例子,来看看上述选项的综合应用。
%
% \begin{ctexexam}[labelref=exam:miscopt]
@@ -2548,18 +2739,18 @@ Copyright and Licence
%
% \subsection{\LuaLaTeX{} 下替代字体的设置}
%
-% \begin{function}[added=2014-04-14]{AlternateFont}
+% \begin{function}[updated=2020-04-30]{AlternateFont}
% \begin{syntax}
-% \tn{setCJKfamilyfont} \Arg{family}
+% \tn{setCJKfamilyfont} \Arg{family} \Arg{base font name}
% \ [
+% \ <base font features> ,
% \ AlternateFont =
% \ \{
-% \ \Arg{character range_1} \oarg{alternate font features_1} \Arg{alternate font name_1} ||
-% \ \Arg{character range_2} \oarg{alternate font features_2} \Arg{alternate font name_2} ||
+% \ \Arg{character range_1} \Arg{alternate font name_1} ,
+% \ \Arg{character range_2} \Arg{alternate font name_2} \Arg{alternate font features_2} ,
% \ ......
-% \ \} ,
-% \ <base font features>
-% \ ] \Arg{base font name}
+% \ \}
+% \ ]
% \end{syntax}
% 在设置字体族 \meta{family} 的时候,同时设置该字体族在字符范围
% \meta{character range_n} 内,对应字形的替代字体。
@@ -2567,11 +2758,11 @@ Copyright and Licence
%
% \begin{function}[added=2014-04-14]{CharRange}
% \begin{syntax}
-% \tn{setCJKfamilyfont} \Arg{family}
+% \tn{setCJKfamilyfont} \Arg{family} \Arg{alternate font name}
% \ [
% \ CharRange = \Arg{character range} ,
% \ <alternate font features>
-% \ ] \Arg{alternate font name}
+% \ ]
% \end{syntax}
% 只设置字体族 \meta{family} 在字符范围 \meta{character range} 内,对应字形的
% 替代字体。
@@ -2586,7 +2777,7 @@ Copyright and Licence
% \setCJKmainfont[CharRange={"6800->"9FFF}, ...]{...}
% \end{ctexexam}
%
-% \begin{function}[EXP,added=2014-04-14]{declarecharrange}
+% \begin{function}[EXP,added=2020-04-30]{declarecharrange}
% \begin{syntax}
% \tn{ctexset}
% \ \{
@@ -2605,9 +2796,10 @@ Copyright and Licence
%
% 在声明字符范围 \meta{name} 的同时,还为 \tn{setCJKmainfont} 等字体设置命令定义
% 了选项 \meta{name},用于设置对应字符的替代字体:
-% \begin{quote}\linespread{1}\small\ttfamily
-% \meta{name} = \oarg{alternate font features} \Arg{alternate font name}
-% \end{quote}
+% \begin{syntax}
+% \meta{name} = \Arg{alternate font name}
+% \meta{name} = \Arg{alternate font name} \Arg{alternate font features}
+% \end{syntax}
% \meta{name} 选项可以与 \opt{AlternateFont} 共同使用,但不能与 \opt{CharRange}
% 一起使用。如果没有给 \meta{name} 设置值,则等价于设置 \opt{CharRange=\meta{name}},
% 即只设置 \meta{name} 对应的字符范围的替代字体。
@@ -2652,7 +2844,7 @@ Copyright and Licence
% 例如对于 \TeX{} Live,系统自带的配置文件就在 \TeX{} Live 安装目录下的
% \path{texmf-dist/tex/latex/ctex/config/} 子目录下,可以修改它的副本,保存在
% 本地 TDS 树的 \path{texmf-local/tex/latex/ctex/} 目录下,或者用户 TDS 树的
-% \path{~/.texlive2015/texmf-var/tex/latex/ctex/} 目录下,作为本地/用户专有的
+% \path{~/texmf/tex/latex/ctex/} 目录下,作为本地/用户专有的
% 配置文件。复制配置文件后需要运行 |texhash| 命令使本地配置文件生效。
%
% \MiKTeX{} 的配置文件也保存在类似的目录结构中,\MiKTeX{} 管理的
@@ -2668,13 +2860,12 @@ Copyright and Licence
% 注释就可以生效。
%
% \begin{ctexexam}
-% % 系统自带 ctexopts.cfg 注释中的示例语句,固定默认字体集为 windowsnew。
+% % 系统自带 ctexopts.cfg 注释中的示例语句,固定默认字体集为 windows。
% % 该设置可以用在安装了 Windows 字体的非 Windows 系统中。
-% \keys_set:nn { ctex / option } { fontset = windowsnew }
+% \ctex_set:nn { option } { fontset = windows }
% \end{ctexexam}
-% 如上例所示,宏包选项通常使用 \LaTeXiii{} 的 \cs{keys_set:nn} 命令完成键值设置,
-% 第一个参数是固定的子模块 |ctex/option|,第二个参数中是用户定义的新的默认宏包
-% 选项。
+% 如上例所示,宏包选项通常使用 \LaTeXiii{} 的 \cs{ctex_set:nn} 命令完成键值设置,
+% 第一个参数是固定的子模块 |option|,第二个参数中是用户定义的新的默认宏包选项。
%
% \file{ctexopts.cfg} 中的设置将在 \CTeX{} 宏集的开始处,定义过宏包选项之后,
% \tn{ProcessKeysOptions} 命令之前生效。最好只使用此配置文件修改宏包默认选项。
@@ -2820,20 +3011,22 @@ Copyright and Licence
%
% \begin{function}{fntef}
% 旧版本的 \opt{fntef} 选项用于统一 \pkg{CCTfntef} 与 \pkg{CJKfntef} 的界面,
-% 新版本 \CTeX{} 宏集不再支持 \pkg{CCT},而是直接载入 \pkg{CJKfntef} 或
-% \pkg{xeCJKfntef} 宏包并禁用其彩色设置。该选项是过时选项。
+% 新版本 \CTeX{} 宏集不再支持 \pkg{CCT},也不再自动载入 \pkg{CJKfntef} 或
+% \pkg{xeCJKfntef} 宏包,而仅在其末尾做适当格式调整。
+%
+% \opt{fntef} 选项过时,因兼容性保留,功能是根据引擎载入 \pkg{CJKfntef}
+% (\pdfTeX{}) 或 \pkg{xeCJKfntef} (\XeTeX{}) 宏包。
% \end{function}
%
% \begin{function}{\CTEXunderdot, \CTEXunderline, \CTEXunderdblline,
-% \CTEXunderwave, \CTEXsout, \CTEXxout, \CTEXfilltwosides}
+% \CTEXunderwave, \CTEXsout, \CTEXxout, CTEXfilltwosides}
% 在调用 \opt{fntef} 宏包选项的同时,旧版本 \CTeX{} 宏包由于需要支持 \pkg{CCT}
% 系统,会将以 |\CJK| 开头的 \tn{CJKunderline} 等宏换名为以 |\CTEX| 开头的
-% \tn{CTEXunderline} 等宏。此功能在新版本的 \CTeX{} 宏集中已失去意义。
-%
-% 此外,在 \pdfTeX{} 引擎下,用于设置格式的 \tn{CJKunderdotbasesep} 等宏也被换
-% 名为 \tn{CTEXunderdotbasesep} 等宏。
+% \tn{CTEXunderline} 等宏。此功能在新版本的 \CTeX{} 宏集中已失去意义。此外,
+% 在 \pdfTeX{} 引擎下,用于设置格式的 \tn{CJKunderdotbasesep} 等宏也被更名为
+% \tn{CTEXunderdotbasesep} 等宏。
%
-% 在新版本中,上述由 \opt{fntef} 衍生的相关宏都成为过时命令。
+% 在新版本中,上述由 \opt{fntef} 衍生的相关命令和环境均被移除。
% \end{function}
%
% \begin{function}{\CTEXsetfont}
@@ -2927,11 +3120,53 @@ Copyright and Licence
% 这两个选项已经被删除,相应功能由新的选项 \opt{fixskip} 提供。
% \end{function}
%
+% \subsection{\CTeX\ 2.5 之前的版本}
+%
+% \CTeX\ 2.5 有一些比较大的变动。
+%
+% \begin{function}[label =]{UTF8, GBK}
+% (pdf)\LaTeX{} 格式下,文档编码初始值统一设置成 UTF-8。因此,仍旧使用 GBK
+% 编码的文档,需要在文档类或宏包选项中显式指定 \opt{GBK}。
+% \end{function}
+%
+% \begin{function}[label =]{\CTEXunderdot, \CTEXunderline, \CTEXunderdblline,
+% \CTEXunderwave, \CTEXsout, \CTEXxout, CTEXfilltwosides}
+% 不再默认载入 \pkg{CJKfntef} 或 \pkg{xeCJKfntef} 宏包,同步移除有关命令
+% 和环境。若需使用相关宏包,建议用户使用 \tn{usepackage} 命令主动载入。
+% \end{function}
+%
+% \begin{function}[label =]{fntef}
+% 作为兼容性保留,会视编译引擎载入相应宏包。
+% \end{function}
+%
+% \begin{function}{windows}
+% 不再支持 Windows XP 系统,默认要求 Windows 系统有微软雅黑字体。
+% 建议 Windows XP 系统的用户及时更新操作系统。若一定要在 Windows XP 中使用,
+% 请使用 2.5 以前的版本。
+% \end{function}
+%
+% \begin{function}{windowsold, windowsnew}
+% 过时字库选项,作为兼容性保留,功能是载入 \opt{windows} 字库。
+% \end{function}
+%
+% \begin{function}{ubuntu}
+% 改用思源(Noto CJK)和文鼎字库。该字库不再支持 \pdfLaTeX 编译。
+% \end{function}
+%
+% \begin{function}[label =]{AlternateFont}
+% 不再支持将替代字体的可选项放在字体名之前的方括号中,
+% 新的语法是将可选项放在字体名之后的花括号之内。
+% \end{function}
+%
+% 除了以上列出的选项以外,当用户使用 \CTeX{} 系列文档类,且使用 \LaTeX 或
+% \upLaTeX 编译时,若用户没有在文档类选项中显式指定 |dvips|/|dvipdfmx|/|dvisvgm|
+% 等驱动选项,则文档类指定默认驱动为 \dvipdfmx。
+%
% \section{宏集依赖情况与手工安装方法}
% \label{sec:dep-ins}
%
% 本节介绍 \CTeX{} 宏集的依赖情况,并介绍手工编译安装的具体方法。
-% 通常用户只需参照第 \ref{subsec:easy-ins}~节介绍的方法,使用发行版自带的宏包管理器安装
+% 通常用户只需参照第 \ref{subsec:easy-ins}~节介绍的方法,使用发行版自带的包管理器安装
% 本宏集。
%
% \CTeX{} 宏集有两个源文件:\file{ctex.dtx}、\file{ctexpunct.spa}。
@@ -2943,14 +3178,20 @@ Copyright and Licence
% 和 \pkg{l3packages} 宏集。
% \item \pkg{indentfirst} 宏包,属于 \pkg{tools} 宏集。
% \item \pkg{everysel} 宏包,属于 \pkg{ms} 宏集。
-% \item \pkg{ulem} 宏包。
% \item \pkg{zhnumber} 宏包。
% \item[\ding{229}] 以上是各种编译方式都必需的依赖项。
% \item \pkg{CJK} 宏集。
% \item \pkg{CJKpunct} 宏包。
% \item \pkg{xCJK2uni} 宏包。
% \item \pkg{zhmetrics} 宏包。
-% \item \pkg{zhmCJK} 宏包,它还依赖 \pkg{oberdiek} 宏集。
+% \item \pkg{zhmCJK} 宏包,它还依赖
+% \begin{itemize}
+% \item \pkg{iftex} 宏包。
+% \item \pkg{ltxcmds} 宏包。
+% \item \pkg{kvoptions} 宏包。
+% \item \pkg{kvsetkeys} 宏包。
+% \item \pkg{keyval} 宏包,\pkg{graphics} 宏集。
+% \end{itemize}
% \item[\ding{229}] 以上是使用 \pdfLaTeX{} 或 \LaTeX{} + \dvipdfmx{} 的编译方式所需要
% 的依赖项,其中 \pkg{zhmCJK} 是可选的。
% \item \pkg{xeCJK} 宏集,它还依赖
@@ -2958,28 +3199,21 @@ Copyright and Licence
% \item \pkg{xtemplate} 宏包,它属于 \pkg{l3packages} 宏集。
% \item \pkg{fontspec} 宏包。
% \end{itemize}
-% \item \pkg{environ} 宏包,它还依赖 \pkg{trimspaces} 宏包。
% \item[\ding{229}] 以上是使用 \XeLaTeX{} 编译时的依赖项。
% \item \pkg{luatexja} 宏包,它还依赖
% \begin{itemize}
% \item \pkg{adobemapping} 宏包。
-% \item \pkg{lualibs} 宏包。
-% \item \pkg{luaotfload} 宏包。
+% \item \pkg{luaotfload} 宏包,它还依赖 \pkg{lualibs} 宏包。
% \item \pkg{luatexbase} 宏包,它还依赖 \pkg{ctablestack} 宏包。
-% \item \pkg{oberdiek} 宏集。
-% \item \pkg{xkeyval} 宏包。
+% \item \pkg{atbegshi} 宏包。
% \item \pkg{etoolbox} 宏包。
+% \item \pkg{iftex} 宏包。
+% \item \pkg{infwarerr} 宏包。
+% \item \pkg{ltxcmds} 宏包。
+% \item \pkg{pdftexcmds} 宏包。
+% \item \pkg{xkeyval} 宏包。
% \end{itemize}
% \item \pkg{fontspec} 宏包。
-% \item \pkg{xunicode-addon} 宏包,属于 \pkg{xeCJK} 宏集,它还依赖
-% \begin{itemize}
-% \item \pkg{xunicode} 宏包,它还依赖
-% \begin{itemize}
-% \item \pkg{graphics} 宏集。
-% \item \pkg{graphics-cfg} 宏包。
-% \item \pkg{graphics-def} 宏包。
-% \end{itemize}
-% \end{itemize}
% \item[\ding{229}] 以上是使用 \LuaLaTeX{} 编译时的依赖项。
% \item \pkg{pxeverysel} 宏包,属于 \pkg{platex-tools} 宏集。
% \item \pkg{zhmetrics-uptex} 宏包。
@@ -3001,7 +3235,7 @@ Copyright and Licence
% 中第 3 节的指导。
%
% \emph{\CTeX{} 宏集已被 \TeXLive{} 和 \MiKTeX{} 收录,若无特别理由,
-% 我们强烈建议用户使用宏包管理器安装本宏集。}
+% 我们强烈建议用户使用包管理器安装本宏集。}
%
% 若要手工安装,请遵循如下步骤:
% \begin{enumerate}
@@ -3023,9 +3257,12 @@ Copyright and Licence
% \item 陈之初 (\email{zhichu.chen@gmail.com})
% \item 李清 (\email{sobenlee@gmail.com})
% \item 黄晨成 (\email{liamhuang0205@gmail.com})
+% \item 曾祥东 (\email{xdzeng96@gmail.com})
+% \item 李泽平 (\email{zepinglee@gmail.com})
+% \item 周宇恺 (\email{muzimuzhi@gmail.com})
+% \item 张瑞熹 (\email{ruixizhang42@gmail.com})
% \end{itemize}
%
-% 目前比较活跃的开发维护人员是刘海洋、李清和黄晨成。
%
%
% \begin{thebibliography}{9}
@@ -3105,11 +3342,11 @@ Copyright and Licence
\msg_new:nnnn { ctex } { l3-too-old }
{ Support~package~`#1'~too~old. }
{
- Please~update~an~up~to~date~version~of~the~bundles\\\\
+ Please~update~an~up-to-date~version~of~the~bundles\\\\
`l3kernel'~and~`l3packages'\\\\
using~your~TeX~package~manager~or~from~CTAN.
}
-\@ifpackagelater { expl3 } { 2019/03/05 } { }
+\@ifpackagelater { expl3 } { 2020/07/17 } { }
{ \msg_error:nnn { ctex } { l3-too-old } { expl3 } }
%<*class>
\@ifpackagelater { l3keys2e } { 2015/12/20 } { }
@@ -3138,13 +3375,20 @@ Copyright and Licence
%</class|ctex>
% \end{macrocode}
%
+% \changes{v2.5}{2020/04/19}
+% {处理 \cs{ctex_file_input:n} 在 \pkg{ctexsize} 中未定义的错误。}
+% \changes{v2.5}{2020/04/21}{在 \pkg{ctexsize} 也载入 \pkg{fix-cm}。}
+%
% \begin{macrocode}
-%<*class|ctex|ctexheading>
+%<*class|ctex|ctexheading|ctexsize>
% \end{macrocode}
%
+% \pkg{ctexsize} 也要载入 \pkg{fix-cm} 包解决传统 cm 字体字号缺失的问题。
% \begin{macrocode}
-\RequirePackage { ctexhook , ctexpatch }
-%<!ctexheading>\RequirePackage { fix-cm , everysel }
+%<!ctexsize>\RequirePackage { ctexhook , ctexpatch }
+%<!ctexheading>\RequirePackage { fix-cm }
+%<*!ctexsize>
+%<!ctexheading>\RequirePackage { everysel }
% \end{macrocode}
%
% \subsection{内部函数与变量}
@@ -3159,52 +3403,86 @@ Copyright and Licence
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}[int]{\ctex_file_wrapper:nnn}
-% 设置文件操作的 \tn{catcode} 环境,参数 |#1| 是设置,|#2| 是文件操作,|#3| 是恢复。
-% 默认关闭 \LaTeXiii{} 语法环境,并设置 |@| 的 \tn{catcode} 为 $11$。
+% \begin{macro}[int]{\ctex_define_option:n,
+% \ctex_define:n,\ctex_set:n,\ctex_set:nn}
+% 在宏包内部使用的键值选项定义、设置命令。
% \begin{macrocode}
-\cs_new_protected:Npn \ctex_file_wrapper:nnn #1#2#3
- {
- \use:x
- {
- \ExplSyntaxOff
- \char_set_catcode_letter:n { 64 }
- #1
- \exp_not:n {#2}
- \bool_if:NTF \l__kernel_expl_bool
- { \ExplSyntaxOn }
- { \ExplSyntaxOff }
- \char_set_catcode:nn { 64 } { \char_value_catcode:n { 64 } }
- #3
- }
- }
+%</!ctexsize>
+\cs_new_protected:Npn \ctex_define_option:n
+ { \keys_define:nn { ctex / option } }
+%<*!ctexsize>
+\cs_new_protected:Npn \ctex_define:n
+ { \keys_define:nn { ctex } }
+\cs_new_protected:Npn \ctex_set:n
+ { \keys_set:nn { ctex } }
+\cs_new_protected:Npn \ctex_set:nn #1
+ { \keys_set:nn { ctex / #1 } }
+%</!ctexsize>
% \end{macrocode}
% \end{macro}
%
+% \changes{v2.5.3}{2020/06/06}{正确关闭和恢复 \LaTeXiii 语法环境。}
+% \changes{v2.5.4}{2020/08/02}{应用 \pkg{l3cctab}。}
+% \changes{v2.5.5}{2020/10/17}{放弃应用 \pkg{l3cctab}。}
+%
% \begin{macro}[int]{\ctex_file_input:n}
-% 输入文件。
+% 输入文件,关闭 \LaTeXiii 语法环境,并设置 |@| 为字母类、|^| 为上标和 \tn{endlinechar} 为 $13$。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_file_input:n #1
- { \ctex_file_wrapper:nnn { } { \file_input:n {#1} } { } }
+\cs_new_protected:Npn \ctex_file_input:n #1
+ {
+ \ctex_push_file:
+ \file_input:n {#1}
+ \ctex_pop_file:
+ }
+\cs_new_protected:Npn \ctex_push_file:
+ {
+ \seq_gpush:Nx \g_@@_file_status_seq
+ {
+ {
+ \bool_if:NTF \l__kernel_expl_bool
+ { \ExplSyntaxOn }
+ { \ExplSyntaxOff }
+ }
+ { \char_value_catcode:n { 64 } }
+ { \char_value_catcode:n { 94 } }
+ { \int_use:N \tex_endlinechar:D }
+ }
+ \ExplSyntaxOff
+ \char_set_catcode_letter:n { 64 }
+ \char_set_catcode_math_superscript:n { 94 }
+ \int_set:Nn \tex_endlinechar:D { 13 }
+ }
+\cs_new_protected:Npn \ctex_pop_file:
+ {
+ \seq_gpop:NN \g_@@_file_status_seq \l_@@_file_status_tl
+ \exp_after:wN \@@_pop_file_aux:nnnn \l_@@_file_status_tl
+ }
+\cs_new_protected:Npn \@@_pop_file_aux:nnnn #1#2#3#4
+ {
+ #1
+ \char_set_catcode:nn { 64 } {#2}
+ \char_set_catcode:nn { 94 } {#3}
+ \int_set:Nn \tex_endlinechar:D {#4}
+ }
+\tl_new:N \l_@@_file_status_tl
+\seq_new:N \g_@@_file_status_seq
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\ctex_scheme_input:n}
% 输入 \opt{scheme} 文件。先查找当前文档类下的 \meta{scheme},找不到再查找一般的文件。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_scheme_input:n #1
+%<*!ctexsize>
+\cs_new_protected:Npn \ctex_scheme_input:n #1
{
- \ctex_file_wrapper:nnn
- { }
- {
- \tl_if_exist:NTF \c_@@_class_tl
- {
- \file_if_exist_input:nF { ctex-scheme- #1 - \c_@@_class_tl .def }
- { \file_input:n { ctex-scheme- #1 .def } }
- }
- { \file_input:n { ctex-scheme- #1 .def } }
- }
- { }
+ \ctex_push_file:
+ \tl_if_exist:NTF \c_@@_class_tl
+ {
+ \file_if_exist_input:nF { ctex-scheme- #1 - \c_@@_class_tl .def }
+ { \file_input:n { ctex-scheme- #1 .def } }
+ }
+ { \file_input:n { ctex-scheme- #1 .def } }
+ \ctex_pop_file:
}
\cs_generate_variant:Nn \ctex_scheme_input:n { o }
% \end{macrocode}
@@ -3222,7 +3500,8 @@ Copyright and Licence
% \end{variable}
%
% \begin{macrocode}
-%</class|ctex|ctexheading>
+%</!ctexsize>
+%</class|ctex|ctexheading|ctexsize>
%<*class|ctex>
% \end{macrocode}
%
@@ -3231,7 +3510,7 @@ Copyright and Licence
\msg_new:nnnn { ctex } { package-too-old }
{ Support~package~`#1'~too~old. }
{
- Please~update~an~up~to~date~version~of~the~package~`#1'\\
+ Please~update~an~up-to-date~version~of~the~package~`#1'\\
using~your~TeX~package~manager~or~from~CTAN.
}
% \end{macrocode}
@@ -3278,12 +3557,10 @@ Copyright and Licence
% \end{macrocode}
% \end{macro}
%
-% \begin{variable}{\l_@@_encoding_tl}
-% (pdf)\LaTeX{} 初始化编码为 GBK,其它则是 UTF8。
+% \begin{variable}{\g_@@_encoding_tl}
+% 所有引擎下默认编码均设为 UTF-8,初始值为空,\tn{ProcessKeysOptions} 再判断。
% \begin{macrocode}
-\tl_new:N \l_@@_encoding_tl
-\tl_set:Nx \l_@@_encoding_tl
- { \sys_if_engine_pdftex:TF { GBK } { UTF8 } }
+\tl_new:N \g_@@_encoding_tl
% \end{macrocode}
% \end{variable}
%
@@ -3318,8 +3595,8 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_at_end:n}
% 区分 \tn{AtEndOfClass} 和 \tn{AtEndOfPackage},虽然它们的意思都是一样的。
% \begin{macrocode}
-%<class>\cs_new_protected_nopar:Npn \ctex_at_end:n { \AtEndOfClass }
-%<ctex>\cs_new_protected_nopar:Npn \ctex_at_end:n { \AtEndOfPackage }
+%<class>\cs_new_protected:Npn \ctex_at_end:n { \AtEndOfClass }
+%<ctex>\cs_new_protected:Npn \ctex_at_end:n { \AtEndOfPackage }
% \end{macrocode}
% \end{macro}
%
@@ -3340,15 +3617,28 @@ Copyright and Licence
{ Value~`#1'~is~invalid~for~the~key~`\l_keys_key_tl'. }
% \end{macrocode}
%
+% \begin{macro}[int]{\ctex_deprecated_option:nn,
+% \ctex_set_deprecated_option:n,\ctex_deprecated_command:Nn}
% 对过时选项或命令给出警告。
% \begin{macrocode}
+\cs_new_protected:Npn \ctex_deprecated_option:n
+ { \msg_warning:nnn { ctex } { deprecated-option } }
+\cs_new_protected:Npn \ctex_set_deprecated_option:n #1
+ {
+ \ctex_deprecated_option:n { Option~`#1'~is~set. }
+ \ctex_set:nn { option } {#1}
+ }
+\cs_new_protected:Npn \ctex_deprecated_command:Nn #1#2
+ {
+ \msg_warning:nnxx { ctex } { deprecated-command }
+ { \token_to_str:N #1 } { \exp_not:n {#2} }
+ }
\msg_new:nnn { ctex } { deprecated-option }
- { Option~ `\l_keys_key_tl'~ is~ deprecated.\\ #1 }
+ { Option~`\l_keys_key_tl'~is~deprecated.\\ #1 }
\msg_new:nnn { ctex } { deprecated-command }
- { Command~ #1 is~ deprecated.\\ #2 }
-\msg_new:nnn { ctex } { deprecated-environment }
- { Environment~ `#1'~ is~ deprecated.\\ #2 }
+ { Command~`#1'~is~deprecated.\\ #2 }
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
%</class|ctex>
@@ -3360,7 +3650,7 @@ Copyright and Licence
% \begin{macrocode}
%<*class|ctex|ctexsize>
\int_new:N \g_@@_font_size_int
-\int_set:Nn \g_@@_font_size_int { -1 }
+\int_gset:Nn \g_@@_font_size_int { -1 }
%</class|ctex|ctexsize>
% \end{macrocode}
% \end{variable}
@@ -3372,7 +3662,7 @@ Copyright and Licence
%
% \begin{macrocode}
%<*class|style>
-\keys_define:nn { ctex / option }
+\ctex_define_option:n
{
%</class|style>
% \end{macrocode}
@@ -3392,18 +3682,8 @@ Copyright and Licence
%<ctexsize> }
%</class|ctex|ctexsize>
%<*class|ctex>
- c5size .code:n =
- {
- \msg_warning:nnn { ctex } { deprecated-option }
- { Option~ `zihao=5'~ is~ set. }
- \keys_set:nn { ctex / option } { zihao = 5 }
- } ,
- cs4size .code:n =
- {
- \msg_warning:nnn { ctex } { deprecated-option }
- { Option~ `zihao=-4'~ is~ set. }
- \keys_set:nn { ctex / option } { zihao = -4 }
- } ,
+ c5size .code:n = { \ctex_set_deprecated_option:n { zihao = 5 } } ,
+ cs4size .code:n = { \ctex_set_deprecated_option:n { zihao = -4 } } ,
c5size .value_forbidden:n = true ,
cs4size .value_forbidden:n = true ,
% \end{macrocode}
@@ -3451,31 +3731,40 @@ Copyright and Licence
% \begin{macrocode}
indent .code:n =
{
- \msg_warning:nnn { ctex } { deprecated-option }
+ \ctex_deprecated_option:n
{
- The~ functionality~ has~ been~ removed.\\
- It's~ better~ to~ set~ the~ heading~ styles~ via~ `afterindent'~
- options.~
+ The~functionality~has~been~removed.\\
+ It's~better~to~set~the~heading~styles~via~`afterindent'~option.
}
} ,
indent .value_forbidden:n = true ,
noindent .code:n =
{
- \msg_warning:nnn { ctex } { deprecated-option }
+ \ctex_deprecated_option:n
{
- The~ functionality~ has~ been~ removed.\\
- It's~ better~ to~ set~ the~ heading~ styles~ via~ `afterindent'~
- options.
+ The~functionality~has~been~removed.\\
+ It's~better~to~set~the~heading~styles~via~`afterindent'~option.
}
} ,
noindent .value_forbidden:n = true ,
% \end{macrocode}
% \end{macro}
%
+% \changes{v2.5}{2019/11/10}{所有引擎下默认编码均设为 UTF-8。}
+%
% \begin{macro}{GBK,UTF8}
+% 文档编码,默认为 UTF-8。
% \begin{macrocode}
- GBK .code:n = { \tl_set:Nn \l_@@_encoding_tl { GBK } } ,
- UTF8 .code:n = { \tl_set:Nn \l_@@_encoding_tl { UTF8 } } ,
+ GBK .code:n =
+ {
+ \sys_if_engine_pdftex:TF
+ { \tl_gset:Nn \g_@@_encoding_tl { GBK } }
+ {
+ \msg_warning:nn { ctex } { invalid-option }
+ \tl_gset:Nn \g_@@_encoding_tl { UTF8 }
+ }
+ } ,
+ UTF8 .code:n = { \tl_gset:Nn \g_@@_encoding_tl { UTF8 } } ,
GBK .value_forbidden:n = true ,
UTF8 .value_forbidden:n = true ,
% \end{macrocode}
@@ -3487,36 +3776,12 @@ Copyright and Licence
%
% \begin{macro}{fontset}
% 初始值为空。若用户未指定,则根据操作系统载入对应字体配置,可以区分 Windows、
-% Mac~OS~X 和其它。
+% macOS 和其他。
% \begin{macrocode}
fontset .tl_gset:N = \g_@@_fontset_tl ,
- nofonts .code:n =
- {
- \msg_warning:nnn { ctex } { deprecated-option }
- {
- Option~ `fontset=none'~ is~ set.~ It~ is~ better~ to~ use~
- fontset~ option.
- }
- \keys_set:nn { ctex / option } { fontset = none }
- } ,
- adobefonts .code:n =
- {
- \msg_warning:nnn { ctex } { deprecated-option }
- {
- Option~ `fontset=adobe'~ is~ set.~ It~ is~ better~ to~ use~
- fontset~ option.
- }
- \keys_set:nn { ctex / option } { fontset = adobe }
- } ,
- winfonts .code:n =
- {
- \msg_warning:nnn { ctex } { deprecated-option }
- {
- Option~ `fontset=windows'~ is~ set.~ It~ is~ better~ to~ use~
- fontset~ option.
- }
- \keys_set:nn { ctex / option } { fontset = windows }
- } ,
+ nofonts .code:n = { \ctex_set_deprecated_option:n { fontset = none } } ,
+ adobefonts .code:n = { \ctex_set_deprecated_option:n { fontset = adobe } } ,
+ winfonts .code:n = { \ctex_set_deprecated_option:n { fontset = windows } } ,
nofonts .value_forbidden:n = true ,
winfonts .value_forbidden:n = true ,
adobefonts .value_forbidden:n = true ,
@@ -3546,11 +3811,7 @@ Copyright and Licence
\cs_gset_eq:NN \ctex_zhmap_case:nnn \use_iii:nnn
} ,
nozhmap .code:n =
- {
- \msg_warning:nnn { ctex } { deprecated-option }
- { Option~ `zhmap=false'~ is~ set. }
- \keys_set:nn { ctex / option } { zhmap = false }
- } ,
+ { \ctex_set_deprecated_option:n { zhmap = false } } ,
nozhmap .value_forbidden:n = true ,
% \end{macrocode}
% \end{macro}
@@ -3564,12 +3825,7 @@ Copyright and Licence
punct .tl_set:N = \l_@@_punct_tl ,
punct .default:n = { quanjiao } ,
punct .initial:n = { quanjiao } ,
- nopunct .code:n =
- {
- \msg_warning:nnn { ctex } { deprecated-option }
- { Option~ `punct=plain'~ is~ set. }
- \keys_set:nn { ctex / option } { punct = plain }
- } ,
+ nopunct .code:n = \ctex_set_deprecated_option:n { punct = plain } ,
nopunct .value_forbidden:n = true ,
% \end{macrocode}
% \end{macro}
@@ -3581,15 +3837,10 @@ Copyright and Licence
{ true , auto , false }
{
\exp_args:Nx \ctex_at_end:n
- { \keys_set:nn { ctex } { space = \l_keys_choice_tl } }
+ { \ctex_set:n { space = \l_keys_choice_tl } }
} ,
space .default:n = { true } ,
- nospace .code:n =
- {
- \msg_warning:nnn { ctex } { deprecated-option }
- { Option~ `space=false'~ is~ set. }
- \keys_set:nn { ctex / option } { space = false }
- } ,
+ nospace .code:n = { \ctex_deprecated_option:nn { space = false } } ,
nospace .value_forbidden:n = true ,
% \end{macrocode}
% \end{macro}
@@ -3622,6 +3873,7 @@ Copyright and Licence
%
% \changes{v2.0}{2015/04/15}{新增 \opt{scheme} 选项,并将 \opt{cap} 和 \opt{nocap}
% 列为过时选项。}
+%
% \begin{macro}{scheme}
% \begin{macrocode}
scheme .tl_set:N = \l_@@_scheme_tl ,
@@ -3635,25 +3887,18 @@ Copyright and Licence
scheme .initial:n = { chinese } ,
%</!ctexheading>
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
%</class|ctex|ctexheading>
%<*class|ctex>
% \end{macrocode}
%
+% \begin{macro}{cap,nocap}
+% \opt{cap} 和 \opt{nocap} 是过时选项。
% \begin{macrocode}
- cap .code:n =
- {
- \msg_warning:nnn { ctex } { deprecated-option }
- { Option~ `scheme = chinese' ~ is~ set. }
- \keys_set:nn { ctex / option } { scheme = chinese }
- } ,
- nocap .code:n =
- {
- \msg_warning:nnn { ctex } { deprecated-option }
- { Option~ `scheme = plain' ~ is~ set. }
- \keys_set:nn { ctex / option } { scheme = plain }
- } ,
+ cap .code:n = { \ctex_set_deprecated_option:n { scheme = chinese } } ,
+ nocap .code:n = { \ctex_set_deprecated_option:n { scheme = plain } } ,
cap .value_forbidden:n = true ,
nocap .value_forbidden:n = true ,
% \end{macrocode}
@@ -3662,25 +3907,51 @@ Copyright and Licence
% \changes{v2.0}{2015/04/20}{\opt{hyperref} 成为过时选项,原选项功能总是打开。}
% \changes{v2.0}{2015/04/20}{\opt{fancyhdr} 成为过时选项,原选项功能总是打开。}
% \changes{v2.0}{2015/04/20}{\opt{fntef} 成为过时选项,原选项功能总是打开。}
-% \begin{macro}{fntef,fancyhdr,hyperref}
-% \changes{v2.1}{2015/06/03}{补充定义 \tn{hypersetup}。}
-% 这些都是过时的宏包兼容选项,原选项功能总是打开的。
+%
+% 以下三项都是过时的兼容选项,它们会载入有关宏包。
+%
+% \begin{macro}{fntef}
+% \changes{v2.5}{2019/11/10}{仅在该选项启用时会载入 \pkg{CJKfntef} 或
+% \pkg{xeCJKfntef} 宏包。}
% \begin{macrocode}
- fntef .code:n =
+ fntef .code:n =
{
- \msg_warning:nnn { ctex } { deprecated-option }
- { `(xe)CJKfntef'~ package~ is~ always~ loaded. }
+ \sys_if_engine_xetex:TF
+ {
+ \ctex_deprecated_option:n { `xeCJKfntef'~package~is~loaded. }
+ \ctex_at_end:n { \RequirePackage { xeCJKfntef } }
+ }
+ {
+ \sys_if_engine_pdftex:TF
+ {
+ \ctex_deprecated_option:n { `CJKfntef'~package~is~loaded. }
+ \ctex_at_end:n { \RequirePackage { CJKfntef } }
+ }
+ {
+ \ctex_deprecated_option:n
+ { Furthermore,~option~`fntef'~is~invalid~in~current~mode. }
+ }
+ }
} ,
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{fancyhdr}
+% \begin{macrocode}
fancyhdr .code:n =
{
- \msg_warning:nnn { ctex } { deprecated-option }
- { `fancyhdr'~ package~ is~ loaded. }
- \RequirePackage { fancyhdr }
+ \ctex_deprecated_option:n { `fancyhdr'~package~is~loaded. }
+ \ctex_at_end:n { \RequirePackage { fancyhdr } }
} ,
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{hyperref}
+% \changes{v2.1}{2015/06/03}{补充定义 \tn{hypersetup}。}
+% \begin{macrocode}
hyperref .code:n =
{
- \msg_warning:nnn { ctex } { deprecated-option }
- { `hyperref'~ package~ will~ be~ loaded. }
+ \ctex_deprecated_option:n { `hyperref'~package~will~be~loaded. }
\ctex_at_end:n
{
\cs_if_exist:NF \hypersetup
@@ -3726,7 +3997,7 @@ Copyright and Licence
#1 .value_forbidden:n = true ,
}
}
-\use:x { \keys_define:nn { ctex / option } { \exp_not:o { \l_@@_tmp_tl } } }
+\exp_args:No \ctex_define_option:n { \l_@@_tmp_tl }
\tl_clear:N \l_@@_tmp_tl
% \end{macrocode}
% \end{macro}
@@ -3734,7 +4005,7 @@ Copyright and Licence
% 将未知选项传给标准文档类。
% \begin{macrocode}
%<*class>
-\keys_define:nn { ctex / option }
+\ctex_define_option:n
{
unknown .code:n =
{ \clist_gput_right:No \g_@@_std_options_clist { \CurrentOption } }
@@ -3742,28 +4013,44 @@ Copyright and Licence
%</class>
% \end{macrocode}
%
+% 载入选项配置文件。
% \begin{macrocode}
%<!ctexsize>\ctex_file_input:n { ctexopts.cfg }
%</class|ctex|ctexsize>
% \end{macrocode}
%
+% 处理宏包选项。
% \begin{macrocode}
%<*class|style>
\ProcessKeysOptions { ctex / option }
%</class|style>
% \end{macrocode}
%
+% \pdfLaTeX{} 下,如果没有显式指定编码为 |UTF8|,则给出警告信息。
+% \begin{macrocode}
+%<*class|ctex>
+\msg_new:nnn { ctex } { pdftex-utf8 }
+ { UTF8~will~be~used~as~the~default~encoding. }
+\tl_if_empty:NT \g_@@_encoding_tl
+ {
+ \sys_if_engine_pdftex:T
+ { \msg_warning:nn { ctex } { pdftex-utf8 } }
+ \tl_gset:Nn \g_@@_encoding_tl { UTF8 }
+ }
+%</class|ctex>
+% \end{macrocode}
+%
% \begin{macrocode}
%<*class>
% \end{macrocode}
%
% 五号字使用标准文档类的 |10pt| 字体大小设置,小四号字则使用 |12pt|。
% \begin{macrocode}
-\if_case:w \g_@@_font_size_int
- \clist_gput_right:Nn \g_@@_std_options_clist { 10pt }
-\or:
- \clist_gput_right:Nn \g_@@_std_options_clist { 12pt }
-\fi:
+\int_case:nn { \g_@@_font_size_int }
+ {
+ { 0 } { \clist_gput_right:Nn \g_@@_std_options_clist { 10pt } }
+ { 1 } { \clist_gput_right:Nn \g_@@_std_options_clist { 12pt } }
+ }
% \end{macrocode}
%
% 使用 \tn{PassOptionsToClass} 是为了预防可能存在的选项冲突。
@@ -3796,19 +4083,77 @@ Copyright and Licence
%
% \subsection{特定引擎支持与设置}
%
+% \changes{v2.5}{2020/04/22}{给 \LaTeX 和 \upLaTeX 下的文档类指定驱动为 \dvipdfmx。}
+%
+% \subsubsection{\pkg{ctexbackend.cfg}}
+%
+% 对于 \XeLaTeX{}/\pdfLaTeX{}/\LuaLaTeX{} 等默认直接输出 PDF 的编译方式,用户
+% 无需为涉及驱动的宏包指定驱动选项。对于 \LaTeX 和 \upLaTeX{} 等默认不直接输出 PDF 的编译方式,
+% 用户则需要指定驱动选项。
+%
+% 由于历史遗留问题,在使用 \LaTeX{} 或 \upLaTeX{} 等编译时,
+% 大多数涉及驱动的宏包选定的默认输出驱动都是 Dvips。
+% 考虑当前实际使用频率,以及考虑到 \CTeX{} 宏集对中文支持的默认方式,
+% 我们在用户使用 \CTeX{} 系列文档类时,将默认的输出驱动改为 \dvipdfmx。
+%
+% 具体来说,如果 |dvips|,|dvipdfmx|,|dvisvgm| 等驱动没有在文档类的全局选项中被明确指定,
+% 我们就在 \tn{@classoptionslist} 开头加入 |dvipdfmx|。
+%
+% 本段代码只在 \cls{ctexart} 等文档类开头载入,不在 \pkg{ctex} 中使用。
+% 并且需要放在 \pkg{expl3} 之前载入,保证它载入正确的 backend 文件。
+% \begin{macrocode}
+%<*backend>
+\begingroup
+\expandafter\ifx\csname Umathchardef\endcsname\relax
+\else\expandafter\endgroup\expandafter\endinput\fi
+ \ifodd
+ \expandafter\ifx\csname pdfoutput\endcsname\relax
+ \expandafter\ifx\csname enablecjktoken\endcsname\relax 0\else 1\fi
+ \else\ifnum\pdfoutput>0 0\else 1\fi\fi\space
+ \def\x#1{%
+ \if\relax\detokenize{#1}\relax
+ \gdef\@classoptionslist{dvipdfmx}%
+ \else
+ \let\CTEX@add\@ne
+ \@tfor\x:={dvips}{dvipdfmx}{dvisvgm}\do{%
+ \expandafter\in@\expandafter{\expandafter,\x,}{,#1,}%
+ \ifin@ \let\CTEX@add\tw@ \@break@tfor \fi}%
+ \ifodd\CTEX@add \gdef\@classoptionslist{dvipdfmx,#1}\fi
+ \fi}
+ \expandafter\x\expandafter{\@classoptionslist}
+ \fi
+\endgroup
+%</backend>
+% \end{macrocode}
+%
% \subsubsection{\pkg{ctex-engine-pdftex.def}}
%
% \begin{macro}[int]{\ctex_set_zhmap:n}
% 设置 \upTeX{} 字体映射,同时作用于 \tn{AtBeginDvi} 与
% \tn{AtBeginShipoutFirst}。该宏对 \pdfTeX{} 和 \upTeX{} 均有用。
+% \tn{AtBeginDvi} 直接将 \tn{special} 保存到盒子中,
+% \tn{AtBeginShipoutFirst} 是保存到到宏中,并且不展开参数。
+%
+% 可以使用 \LaTeX\ 2020/10/01 的钩子机制来统一设置。
% \begin{macrocode}
%<*pdftex|uptex|aptex>
-\cs_new_protected_nopar:Npn \ctex_set_zhmap:n #1
- {
- \AtBeginDvi {#1}
+\cs_new_protected:Npn \ctex_set_zhmap:n
+ { \tl_gput_right:Nx \g_@@_zhmap_tl }
+\cs_new_protected:Npn \ctex_use_zhmap:
+ { \tl_use:N \g_@@_zhmap_tl }
+\cs_if_exist:NTF \ctex_gadd_ltxhook:nn
+ { \ctex_gadd_ltxhook:nn { shipout/firstpage } { \ctex_use_zhmap: } }
+ {
+ \cs_new_protected:Npn \ctex_add_dvi_zhmap:
+ { \AtBeginDvi { \ctex_use_zhmap: } }
+ \ctex_after_end_preamble:n { \ctex_add_dvi_zhmap: }
\ctex_at_end_package:nn { atbegshi }
- { \AtBeginShipoutFirst {#1} }
+ {
+ \AtBeginShipoutFirst { \ctex_use_zhmap: }
+ \cs_gset_eq:NN \ctex_add_dvi_zhmap: \prg_do_nothing:
+ }
}
+\tl_new:N \g_@@_zhmap_tl
\@onlypreamble \ctex_set_zhmap:n
%</pdftex|uptex|aptex>
% \end{macrocode}
@@ -3818,7 +4163,7 @@ Copyright and Licence
%<*pdftex>
% \end{macrocode}
%
-% \changes{v2.1}{2015/05/18}{给 \pdfLaTeX{} 下的非 UTF8 编码 CJK 字体族加上 CMap。}
+% \changes{v2.1}{2015/05/18}{给 \pdfLaTeX{} 下的非 UTF-8 编码 CJK 字体族加上 CMap。}
%
% \begin{variable}{\c_@@_cmap_encoding_seq}
% 需要加上 CMap 的 CJK 字体编码。
@@ -3831,7 +4176,7 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_family_cmap:nn}
% 在 \tn{DeclareFontFamily} 的 \meta{loading-settings} 中给 CJK 字体族加上 CMap。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_family_cmap:nn #1#2
+\cs_new_protected:Npn \ctex_family_cmap:nn #1#2
{
\cs_if_free:cF { #1 + #2 }
{
@@ -3847,22 +4192,22 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_add_cmap:n}
% 给 |#1| 编码的 CJK 字体加上 CMap。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_add_cmap:n #1
+\cs_new_protected:Npn \ctex_add_cmap:n #1
{
\cs_if_free:NF \CJK@plane
{ \ctex_add_cmap:cn { @@_add_cmap_ #1 \CJK@plane : } {#1} }
}
-\cs_new_protected_nopar:Npn \ctex_add_cmap:Nn #1#2
+\cs_new_protected:Npn \ctex_add_cmap:Nn #1#2
{
\cs_if_exist:NF #1 { \@@_save_cmap:Nn #1 {#2} }
#1
}
\cs_generate_variant:Nn \ctex_add_cmap:Nn { c }
-\cs_new_protected_nopar:Npn \@@_save_cmap:Nn #1#2
+\cs_new_protected:Npn \@@_save_cmap:Nn #1#2
{
- \tl_set:Nx \l_@@_tmp_tl { \str_lower_case:n {#2} \CJK@plane }
+ \tl_set:Nx \l_@@_tmp_tl { \str_lowercase:n {#2} \CJK@plane }
\tex_immediate:D \tex_pdfobj:D stream ~ file { \l_@@_tmp_tl .cmap }
- \cs_new_protected_nopar:Npx #1
+ \cs_new_protected:Npx #1
{
\exp_not:N \tex_pdffontattr:D \exp_not:N \tex_font:D
{ /ToUnicode ~ \int_use:N \tex_pdflastobj:D \c_space_tl 0 ~ R }
@@ -3894,76 +4239,34 @@ Copyright and Licence
% 首先检查选项,决定是否载入 \pkg{zhmCJK} 宏包。
% \begin{macrocode}
\if_bool:N \g_@@_zhmCJK_bool
- \PassOptionsToPackage { encoding = \l_@@_encoding_tl } { zhmCJK }
+ \PassOptionsToPackage { encoding = \g_@@_encoding_tl } { zhmCJK }
\RequirePackage { zhmCJK }
% \end{macrocode}
% 不载入 \pkg{zhmCJK} 宏包时直接调用 \pkg{CJK} 及相关宏包。
% \begin{macrocode}
\else:
- \str_if_eq:onTF { \l_@@_encoding_tl } { GBK }
+ \str_if_eq:onTF { \g_@@_encoding_tl } { GBK }
{ \RequirePackage { CJK } }
{ \RequirePackage { CJKutf8 } }
\RequirePackage { CJKpunct , CJKspace }
% \end{macrocode}
%
+% \changes{v2.4.4}{2016/09/09}{解决 \opt{zhmap} 文件的 \tn{catcode} 问题。}
+%
% \begin{macro}[int]{\ctex_load_zhmap:nnnn}
% 载入 \pkg{zhmetrics} 的字体映射文件,同时设置 \tn{CJKrmdefault} 等。
% \begin{macrocode}
- \cs_new_protected_nopar:Npn \ctex_load_zhmap:nnnn #1#2#3#4
+ \cs_new_protected:Npn \ctex_load_zhmap:nnnn #1#2#3#4
{
\tl_set:Nn \CJKrmdefault {#1}
\tl_set:Nn \CJKsfdefault {#2}
\tl_set:Nn \CJKttdefault {#3}
- \ctex_set_zhmap:n { \ctex_zhmap_input:n {#4} }
+ \ctex_set_zhmap:n { \ctex_file_input:n { ctex-zhmap- #4 .tex } }
}
\@onlypreamble \ctex_load_zhmap:nnnn
% \end{macrocode}
% \end{macro}
%
-% \changes{v2.4.4}{2016/09/09}{解决 \opt{zhmap} 文件的 \tn{catcode} 问题。}
-% \begin{macro}[int]{\ctex_zhmap_input:n}
-% 载入字体映射文件时,确认 |%| 和 |\| 的 \tn{catcode}。
-% \begin{macrocode}
- \cs_new_protected_nopar:Npn \ctex_zhmap_input:n #1
- {
- \ctex_file_wrapper:nnn
- {
- \char_set_catcode_comment:n { 37 } % %
- \char_set_catcode_escape:n { 92 } % \
- }
- { \file_input:n {#1} }
- {
- \char_set_catcode:nn { 37 } { \char_value_catcode:n { 37 } }
- \char_set_catcode:nn { 92 } { \char_value_catcode:n { 92 } }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
- \tl_if_exist:NF \CJKfamilydefault
- { \tl_const:Nn \CJKfamilydefault { \CJKrmdefault } }
- \tl_if_exist:NF \CJKrmdefault { \tl_new:N \CJKrmdefault }
- \tl_if_exist:NF \CJKsfdefault { \tl_new:N \CJKsfdefault }
- \tl_if_exist:NF \CJKttdefault { \tl_new:N \CJKttdefault }
- \ctex_preto_cmd:NnnTF \rmfamily { \ExplSyntaxOff }
- { \CJKfamily { \CJKrmdefault } }
- { }
- { \ctex_patch_failure:N \rmfamily }
- \ctex_preto_cmd:NnnTF \sffamily { \ExplSyntaxOff }
- { \CJKfamily { \CJKsfdefault } }
- { }
- { \ctex_patch_failure:N \sffamily }
- \ctex_preto_cmd:NnnTF \ttfamily { \ExplSyntaxOff }
- { \CJKfamily { \CJKttdefault } }
- { }
- { \ctex_patch_failure:N \ttfamily }
- \ctex_preto_cmd:NnnTF \normalfont { \ExplSyntaxOff }
- { \CJKfamily { \CJKfamilydefault } }
- { \cs_set_eq:NN \reset@font \normalfont }
- { \ctex_patch_failure:N \normalfont }
-% \end{macrocode}
-%
% \pkg{zhmCJK} 判断结束。
% \begin{macrocode}
\fi:
@@ -3973,22 +4276,14 @@ Copyright and Licence
% \pkg{breqn} 包可能会在正文中将 |^| 的 \tn{catcode} 改为 $12$ 或 $13$,这将
% 破坏 \pkg{CJK} 对汉字的首字节的定义(\tn{CJK@loadBinding} 和
% \tn{CJK@loadEncoding})。因此需要确保载入 \file{.enc} 和 \file{.bdg} 文件时,
-% |^| 的 \tn{catcode} 为 $7$。
+% |^| 的 \tn{catcode} 为 $7$。同时要设置 \tn{endlinechar} 为 $-1$。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_CJK_input:n #1
+\cs_new_protected:Npn \ctex_CJK_input:n #1
{
- \ctex_file_wrapper:nnn
- {
- \char_set_catcode_other:n { 60 } % <
- \char_set_catcode_math_superscript:n { 94 } % ^
- \int_set:Nn \tex_endlinechar:D { -1 }
- }
- { \file_input:n {#1} }
- {
- \char_set_catcode:nn { 60 } { \char_value_catcode:n { 60 } }
- \char_set_catcode:nn { 94 } { \char_value_catcode:n { 94 } }
- \int_set:Nn \tex_endlinechar:D { \int_use:N \tex_endlinechar:D }
- }
+ \ctex_push_file:
+ \int_set:Nn \tex_endlinechar:D { -1 }
+ \file_input:n {#1}
+ \ctex_pop_file:
}
\cs_set_eq:NN \CJK@input \ctex_CJK_input:n
% \end{macrocode}
@@ -4002,7 +4297,7 @@ Copyright and Licence
% 我们在这里给出 \tn{CJK@surr} 的一个不依赖 \tn{uppercase} 的实现。
% \begin{macrocode}
\if_cs_exist:N \CJK@surr
- \cs_new_protected_nopar:Npn \ctex_plane_to_utfxvibe:Nn #1#2
+ \cs_new_protected:Npn \ctex_plane_to_utfxvibe:Nn #1#2
{
\tl_set:Nx \l_@@_tmp_tl {#2}
\int_set:Nn \l_@@_tmp_int
@@ -4039,14 +4334,14 @@ Copyright and Licence
\ctex_at_end_preamble:n { \ctex_update_default_family: }
% \end{macrocode}
%
-% 启用中文字符功能。\texttt{GBK} 编码时,将汉字的首字节设置为活动字符,并对这些
-% 字符初始化;\texttt{UTF8} 编码时,上游宏包已经处理好。
+% 启用中文字符功能。\opt{GBK} 编码时,将汉字的首字节设置为活动字符,并对这些
+% 字符初始化;\opt{UTF8} 编码时,上游宏包已经处理好。
% \tn{CJK@makeActive} 应该先于 \file{ctex-name-gbk.cfg} 等文件的载入。
% 注意 \tn{CJK@loadBinding} 需要调用补丁后的 \tn{CJK@input}。使用
% \pkg{zhmCJK} 时,此功能已经被启用。
% \begin{macrocode}
\reverse_if:N \if_bool:N \g_@@_zhmCJK_bool
- \str_if_eq:onF { \l_@@_encoding_tl } { UTF8 }
+ \str_if_eq:onF { \g_@@_encoding_tl } { UTF8 }
{
\CJK@makeActive
\CJK@loadBinding { standard }
@@ -4087,7 +4382,7 @@ Copyright and Licence
\exp_args:Nx \ctex_at_end_preamble:n
{
\exp_not:N \CJK@envStart
- { } { \l_@@_encoding_tl } { \exp_not:N \CJKfamilydefault }
+ { } { \g_@@_encoding_tl } { \exp_not:N \CJKfamilydefault }
\exp_not:N \CJKtilde
}
% \end{macrocode}
@@ -4098,14 +4393,9 @@ Copyright and Licence
% \end{macrocode}
%
% \begin{macro}[int]{\ctex_auto_ignorespaces:}
-% 关闭名字空间,保存 \tn{CJK@@ignorespaces} 的定义,方便使用。
+% 保存 \tn{CJK@@ignorespaces} 的定义,方便使用。
% \begin{macrocode}
-%<@@=>
-\cs_new_eq:NN \ctex_auto_ignorespaces: \CJK@@ignorespaces
-% \end{macrocode}
-% 恢复名字空间,要把它放在一个 \env{macrocode} 环境中,\cls{l3doc} 才能正确工作。
-% \begin{macrocode}
-%<@@=ctex>
+\cs_new_eq:NN \ctex_auto_ignorespaces: \CJK@@@@ignorespaces
% \end{macrocode}
% \end{macro}
%
@@ -4113,30 +4403,32 @@ Copyright and Licence
% 设置忽略空格的的方式。根据 \opt{space} 选项的值重定义 \tn{CJK@ignorespaces},
% 并保存起来供 \tn{CJKhook} 备用。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ignorespaces_case:N #1
+\cs_new_protected:Npn \ctex_ignorespaces_case:N #1
{
- \cs_set_protected_nopar:Npn \ctex_set_ignorespaces:
+ \cs_set_protected:Npn \ctex_set_ignorespaces:
{ \cs_set_eq:NN \CJK@ignorespaces #1 }
\ctex_set_ignorespaces:
}
-\cs_new_protected_nopar:Npn \ctex_set_ignorespaces:
+\cs_new_protected:Npn \ctex_set_ignorespaces:
{ \cs_set_eq:NN \CJK@ignorespaces \ctex_auto_ignorespaces: }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\CJKhook}
+% \changes{v2.5.5}{2020/10/06}{不再通过旧的钩子命令来定义。}
% \env{CJK} 和 \env{CJK*} 环境都会重新定义 \tn{CJK@ignorespaces}。我们在 \pkg{CJK}
% 宏包提供的 \tn{CJKhook} 里重新设置它,让这两个环境忽略空格的方式都受 \opt{space}
% 选项的控制。这对 \pkg{zhmCJK} 是必要的。
% \begin{macrocode}
-\ctex_gadd_hook:Nn \CJKhook { \ctex_set_ignorespaces: }
+\tl_if_exist:NF \CJKhook { \tl_new:N \CJKhook }
+\tl_gput_right:Nn \CJKhook { \ctex_set_ignorespaces: }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\ctex_punct_set:n}
% 设置 CJK 族对应到实际的字体。|#1| 是 \opt{fontset} 的名字。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_punct_set:n #1
+\cs_new_protected:Npn \ctex_punct_set:n #1
{
\clist_map_inline:Nn \c_@@_punct_family_clist
{
@@ -4151,7 +4443,8 @@ Copyright and Licence
\clist_const:Nn \c_@@_punct_family_clist
{
zhsong , zhhei , zhfs , zhkai , zhli , zhyou ,
- zhsongb , zhheil , zhheib , zhyoub , zhyahei , zhyaheib
+ zhsongb , zhheil , zhheib , zhyoub ,
+ zhyahei , zhyaheib , zhpf , zhpfb
}
% \end{macrocode}
% \end{macro}
@@ -4159,7 +4452,7 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_punct_map_family:nn}
% CJK 族 |#1| 使用族 |#2| 的边界信息。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_punct_map_family:nn #1#2
+\cs_new_protected:Npn \ctex_punct_map_family:nn #1#2
{
\cs_if_free:cF { CJKpunct@ #2 @spaces }
{ \cs_set_eq:cc { CJKpunct@ #1 @spaces } { CJKpunct@ #2 @spaces } }
@@ -4170,7 +4463,7 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_punct_map_bfseries:nn}
% CJK 族 |#1| 的 \tn{bfseries} 使用族 |#2| 的边界信息。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_punct_map_bfseries:nn #1#2
+\cs_new_protected:Npn \ctex_punct_map_bfseries:nn #1#2
{
\clist_map_inline:nn {#1}
{
@@ -4178,7 +4471,7 @@ Copyright and Licence
\ctex_punct_map_series:nnn { ##1 } { bx } {#2}
}
}
-\cs_new_protected_nopar:Npn \ctex_punct_map_series:nnn #1#2#3
+\cs_new_protected:Npn \ctex_punct_map_series:nnn #1#2#3
{
\CJKpunctmapfamily { C19 } {#1} {#2} { m } {#3}
\CJKpunctmapfamily { C19 } {#1} {#2} { it } {#3}
@@ -4193,7 +4486,7 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_punct_map_itshape:nn}
% CJK 族 |#1| 的 \tn{itshape} 使用族 |#2| 的边界信息。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_punct_map_itshape:nn #1#2
+\cs_new_protected:Npn \ctex_punct_map_itshape:nn #1#2
{
\CJKpunctmapfamily { C19 } {#1} { m } { it } {#2}
\CJKpunctmapfamily { C19 } {#1} { b } { it } {#2}
@@ -4208,7 +4501,7 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_punct_space:nn,\ctexspadef}
% 定义标点的边界信息。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_punct_space:nn #1#2
+\cs_new_protected:Npn \ctex_punct_space:nn #1#2
{ \tl_const:cn { c_@@_ #1 _punct_spaces_tl } {#2} }
\cs_new_eq:NN \ctexspadef \ctex_punct_space:nn
% \end{macrocode}
@@ -4259,6 +4552,8 @@ Copyright and Licence
%
% \changes{v2.0}{2014/03/08}{通过 \pkg{LuaTeX-ja} 宏包支持 \LuaLaTeX。}
% \changes{v2.3}{2015/09/25}{更新 \pkg{LuaTeX-ja} 支持(20150922.0)。}
+% \changes{v2.5}{2020/04/18}{更新 \pkg{LuaTeX-ja} 支持(20200412.0)。}
+% \changes{v2.5.4}{2020/08/16}{更新 \pkg{LuaTeX-ja} 支持(20200808.0)。}
%
% \pkg{LuaTeX-ja} 为了兼容 p\LaTeX 的使用习惯,对 \LaTeXe 的 \pkg{NFSS} 作了不少
% 修改和扩充,这对于简体中文用户来说不是必要的。我们在这里禁用它。
@@ -4275,13 +4570,13 @@ Copyright and Licence
%
% \begin{macrocode}
\RequirePackage { luatexja }
-\@ifpackagelater { luatexja } { 2015/09/21 } { }
+\@ifpackagelater { luatexja } { 2020/04/12 } { }
{ \msg_error:nnn { ctex } { package-too-old } { luatexja } }
% \end{macrocode}
%
% \begin{macrocode}
\RequirePackage { fontspec }
-\@ifpackagelater { fontspec } { 2014/05/25 } { }
+\@ifpackagelater { fontspec } { 2020/02/21 } { }
{ \msg_error:nnn { ctex } { package-too-old } { fontspec } }
% \end{macrocode}
%
@@ -4300,25 +4595,26 @@ Copyright and Licence
\ltjdefcharrange{1}{"80-"36F, "1E00-"1EFF}
\ltjdefcharrange{2}{"370-"4FF, "1F00-"1FFF}
\ltjdefcharrange{3}{%
- "2000-"206F, "2070-"243F, "2460-"24FF, "2500-"27BF, "2900-"29FF,
- "2B00-"2BFF}
+ "2000-"243F, "2460-"24FF, "2500-"27BF, "2900-"29FF, "2B00-"2BFF}
\ltjdefcharrange{4}{%
"500-"10FF, "1200-"1DFF, "2440-"245F, "27C0-"28FF, "2A00-"2AFF,
- "2C00-"2E7F, "4DC0-"4DFF, "A4D0-"A82F, "A840-"ABFF, "FB00-"FE0F,
- "FE20-"FE2F, "FE70-"FEFF, "10000-"1FFFF, "E000-"F8FF} % non-Japanese
+ "2C00-"2E7F, "4DC0-"4DFF, "A4D0-"A95F, "A980-"ABFF, "E000-"F8FF,
+ "FB00-"FE0F, "FE20-"FE2F, "FE70-"FEFF, "10000-"1AFFF, "1B170-"1F0FF,
+ "1F300-"1FFFF, "2000-"206F}
\ltjdefcharrange{5}{"D800-"DFFF, "E0000-"E00FF, "E01F0-"10FFFF}
\ltjdefcharrange{6}{%
"2E80-"2EFF, "3000-"30FF, "3190-"319F, "31F0-"4DBF,
- "4E00-"9FFF, "F900-"FAFF, "FE10-"FE6F, "20000-"2FFFF, "E0100-"E01EF}
+ "4E00-"9FFF, "F900-"FAFF, "FE10-"FE1F, "FE30-"FE6F, "FF00-"FFEF,
+ "1B000-"1B16F, "1F100-"1F2FF, "20000-"3FFFF, "E0100-"E01EF}
\ltjdefcharrange{7}{%
- "1100-"11FF, "2F00-"2FFF, "3100-"31EF, "A000-"A4CF,
- "A830-"A83F, "AC00-"D7FF}
+ "1100-"11FF, "2F00-"2FFF, "3100-"318F, "31A0-"31EF, "A000-"A4CF,
+ "A960-"A97F, "AC00-"D7FF}
\ltjdefcharrange{8}{"A7, "A8, "B0, "B1, "B4, "B6, "D7, "F7}
% \end{macrocode}
-% 将引号、破折号等中西文公用的标点符号归入字符范围 9,将他们设置为 JAchar。
+% 将间隔号、引号、破折号等中西文公用的标点符号归入字符范围 9,将他们设置为 JAchar。
% \begin{macrocode}
\ltjdefcharrange{9}{%
- "2018, "2019, "201C, "201D, "2013, "2014, "2025, "2026, "2027, "2E3A}
+ "00B7, "2018, "2019, "201C, "201D, "2013, "2014, "2025, "2026, "2027, "2E3A}
% \end{macrocode}
% \changes{v2.4.11}{2017/08/17}{不把希腊和西里尔字母设置为 JAchar。}
% \pkg{LuaTeX-ja} 默认把字符范围 2 和 3 设置为 JAchar,我们这里把它们都改成 ALchar。
@@ -4327,18 +4623,23 @@ Copyright and Licence
\directlua{for x=128,255 do luatexja.math.is_math_letters[x] = true end}
% \end{macrocode}
%
-% 以下设置抄录自 \file{ltj-latex.sty}。
+% 以下设置抄录自 2020/08/08 之前的 \file{ltj-latex.sty}。
+% 自 2020/08/08 开始,\pkg{LuaTeX-ja} 引入新的缓存机制,此段设置被整合进 \file{luatexja.lua}。
% \begin{macrocode}
-\directlua{
- local s = kpse.find_file('ltj-kinsoku.lua', 'tex')
- luatexja.stack.charprop_stack_table[0] = s and dofile(s) or {}
-}
-\ltjsetparameter{kanjiskip=\z@ plus .4pt minus .5pt,
- xkanjiskip=.25\zw plus 1pt minus 1pt,
- autospacing, autoxspacing, jacharrange={-1},
- yalbaselineshift=\z@, yjabaselineshift=\z@,
- jcharwidowpenalty=500, differentjfm=paverage
-}
+\@ifpackagelater{luatexja}{2020/08/08}
+ { \ltjsetparameter { autospacing, autoxspacing, differentjfm = paverage } }
+ {
+ \directlua{
+ local s = kpse.find_file('ltj-kinsoku.lua', 'tex')
+ luatexja.stack.charprop_stack_table[0] = s and dofile(s) or {}
+ }
+ \ltjsetparameter{kanjiskip=\z@ plus .4pt minus .5pt,
+ xkanjiskip=.25\zw plus 1pt minus 1pt,
+ autospacing, autoxspacing, jacharrange={-1},
+ yalbaselineshift=\z@, yjabaselineshift=\z@,
+ jcharwidowpenalty=500, differentjfm=paverage
+ }
+ }
% \end{macrocode}
%
% \begin{macrocode}
@@ -4351,63 +4652,311 @@ Copyright and Licence
%<@@=ctex_ltj>
% \end{macrocode}
%
+% \changes{v2.5.3}{2020/05/31}{不再依赖 \pkg{xunicode},单独补丁 \file{tuenc.def}。}
+%
+% \begin{macro}{\CTEX@alchar, \CTEX@beginallalchar, \CTEX@endallalchar}
+% 分组中的字符都是 ALchar 类。
+% \begin{macrocode}
+\cs_new_protected:Npn \CTEX@alchar #1
+ { \CTEX@beginallalchar #1 \CTEX@endallalchar }
+\cs_new_protected:Npn \CTEX@beginallalchar
+ {
+ \group_begin:
+ \ctex_ltj_zero_globaldefs:
+ \ltj@allalchar
+ }
+\cs_new_protected:Npn \CTEX@endallalchar
+ { \group_end: }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CTEX@chardef@text@cmd}
+% 补丁 \tn{chardef@text@cmd},应用于 \tn{DeclareTextSymbol},使其定义的符号都是 ALchar。
+% \begin{macrocode}
+\cs_new_protected:Npn \CTEX@chardef@text@cmd #1
+ {
+ \cs_set_eq:NN \@ifdefinable \@@@@ifdefinable
+ \tl_set:Nn \l_@@_cmd_tl {#1}
+ \tex_afterassignment:D \@@_chardef_text_cmd:
+ \tex_chardef:D #1
+ }
+\tl_new:N \l_@@_cmd_tl
+\cs_new_protected:Npn \@@_chardef_text_cmd:
+ { \exp_after:wN \@@_chardef_text_cmd_aux:N \l_@@_cmd_tl }
+\cs_new_protected:Npn \@@_chardef_text_cmd_aux:N #1
+ {
+ \int_compare:nNnF {#1} < { "80 }
+ { \cs_set_protected:Npx #1 { \CTEX@alchar { \tex_Uchar:D #1 } } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CTEX@text@composite@x}
+% \tn{@text@composite@x} 的重定义,应用于 \tn{DeclareUnicodeComposite} 等。
+% \begin{macrocode}
+\cs_new_protected:Npn \CTEX@text@composite@x #1#2
+ {
+ \CTEX@beginallalchar
+ \cs_if_exist_use:NF #1 {#2}
+ \CTEX@endallalchar
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CTEX@add@unicode@accent}
+% \tn{add@unicode@accent} 的重定义,应用于 \tn{DeclareUnicodeAccent}。
+% \begin{macrocode}
+\cs_new_protected:Npx \CTEX@add@unicode@accent #1#2
+ {
+ \CTEX@beginallalchar
+ \exp_not:N \tl_if_blank:nTF {#2} { \tex_Uchar:D "A0 ~ } {#2}
+ \exp_not:N \tex_Uchar:D \tex_numexpr:D #1 \scan_stop:
+ \CTEX@endallalchar
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CTEX@patch@text@cmd}
+% 单独补丁由 \tn{DeclareTextCommand} 定义的命令。
+% \begin{macrocode}
+\cs_new_protected:Npn \CTEX@patch@text@cmd #1
+ {
+ \exp_args:NNc \@@_patch_text_cmd:NN #1
+ { \UnicodeEncodingName \token_to_str:N #1 }
+ }
+\cs_new_protected:Npn \@@_patch_text_cmd:NN #1#2
+ {
+ \cs_set_eq:NN \CTEX@textcmd #2
+ \ctex_preto_cmd:NnnTF \CTEX@textcmd
+ { \ExplSyntaxOff \makeatletter }
+ { \CTEX@beginallalchar }
+ {
+ \ctex_appto_cmd:NnnTF \CTEX@textcmd
+ { \ExplSyntaxOff \makeatletter }
+ { \CTEX@endallalchar }
+ { \cs_set_eq:NN #2 \CTEX@textcmd }
+ { \ctex_patch_failure:N #1 }
+ }
+ { \ctex_patch_failure:N #1 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CTEX@patch@tunec}
+% 重新载入 \tn{tunec.def},使补丁生效。
+% \begin{macrocode}
+\cs_new_protected:Npn \CTEX@patch@tunec
+ {
+ \cs_set_eq:NN \chardef@text@cmd \CTEX@chardef@text@cmd
+ \ctex_file_input:n { tuenc.def }
+ \cs_set_eq:NN \@text@composite@x \CTEX@text@composite@x
+ \cs_set_eq:NN \add@unicode@accent \CTEX@add@unicode@accent
+ \CTEX@patch@text@cmd \textasteriskcentered
+ }
+\@ifpackageloaded { xunicode }
+ { }
+ { \CTEX@patch@tunec }
+% \end{macrocode}
+% \end{macro}
+%
% \changes{v2.3}{2015/09/26}{更新 \pkg{unicode-math} 宏包补丁。}
%
% 在 \LaTeX{} 下,\pkg{LuaTeX-ja} 对 \pkg{fontspec}、\pkg{xunicode}、\pkg{unicode-math}
% 和 \pkg{listings} 打了补丁。其中前三个是把 \tn{char} 换成 \tn{ltjalchar},确保
% 字符是 ALchar 类。我们这里用 \pkg{xunicode-addon} 来处理 \pkg{xunicode}。
% \begin{macrocode}
-\RequirePackage { xunicode-addon }
-\AtBeginUTFCommand
+\ctex_at_end_package:nn { xunicode }
{
- \group_begin:
- \lua_now:e { tex.globaldefs = 0 }
- \ltj@allalchar
+ \RequirePackage { xunicode-addon }
+ \AtBeginUTFCommand { \CTEX@beginallalchar }
+ \AtEndUTFCommand { \CTEX@endallalchar }
}
-\AtEndUTFCommand { \group_end: }
% \end{macrocode}
%
% \changes{v2.4.2}{2016/05/15}{恢复 \pkg{luatexja} 对 \tn{emshape} 和
% \tn{eminnershape} 的重定义。}
% \changes{v2.4.3}{2016/08/26}{简化 \pkg{fontspec} 补丁。}
-% \begin{macro}[int]{\fontspec_visible_space:}
-% 我们不使用 \pkg{luatexja} 对 \pkg{fontspec} 的补丁,直接处理。
+% \changes{v2.5}{2020/04/18}{删除 \pkg{fontspec} 补丁。}
+%
+% 对 \pkg{listings} 的补丁是让代码环境支持 JAchar 类。
% \begin{macrocode}
-\cs_set_protected:Npn \fontspec_visible_space:
- {
- \tex_iffontchar:D \tex_font:D "2423 \exp_stop_f:
- \ltjalchar "2423 \exp_stop_f:
- \else:
- \fontspec_visible_space_fallback:
- \fi:
- }
+\ctex_at_end_package:nn { listings }
+ { \RequirePackage { lltjp-listings } }
% \end{macrocode}
-% \end{macro}
%
-% 对 \pkg{listings} 的补丁是让代码环境支持 JAchar 类。\pkg{LuaTeX-ja} 的补丁会将
-% 代码目录标题改为日文,我们不需要。
+% \paragraph{\pkg{Lua} 函数}
+%
+% 直接用 |token.set_lua| 定义,不是传统意义上的 \TeX \ 宏。
% \begin{macrocode}
-\ctex_at_end_package:nn { listings }
+\group_begin:
+\char_set_catcode_space:n { 32 }
+\lua_now:e
{
- \use:x
- {
- \exp_not:N \RequirePackage { lltjp-listings }
- \tl_set:Nn \exp_not:N \lstlistingname
- { \exp_not:o { \lstlistingname } }
- \tl_set:Nn \exp_not:N \lstlistlistingname
- { \exp_not:o { \lstlistlistingname } }
- }
+ local func = lua.get_functions_table()
+ local ltjfont = luatexja.jfont
+ local getattribute = tex.getattribute
+ local set_lua = token.set_lua
+ local scan_int, scan_arg = token.scan_int, token.scan_argument
+ local new_luafunction = luatexbase.new_luafunction
+% \end{macrocode}
+% \begin{macro}{\ctex_ltj_add_kyenc:n}
+% 保存 jfont 的编码,用于判断。
+% \begin{macrocode}
+ local id = new_luafunction("ctex")
+ func[id] = ltjfont.add_kyenc_list
+ set_lua("ctex_ltj_add_kyenc:n", id, "global", "protected")
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ctex_ltj_is_kenc:n}
+% 判断编码是否属于 jfont。
+% \begin{macrocode}
+ local id = new_luafunction("ctex")
+ func[id] = ltjfont.is_kenc
+ set_lua("ctex_ltj_is_kenc:n", id, "global")
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ctex_ltj_patch_external_font:n}
+% 若对字体的定义完全相同,则它们有相同的 \texttt{font.id}。因此如果字形是由
+% \textsf{NFSS} 的替换机制定义的,它们就有相同的 \texttt{font.id}。
+% |print_aftl_address| 函数的定义是
+% \begin{verbatim}
+% function luatexja.jfont.print_aftl_address()
+% return ';ltjaltfont' .. tostring(aftl_base):sub(8)
+% end
+% \end{verbatim}
+% 主要目的是,如果当前字形有替代字体,则往字形的定义中加入一些标志,确保
+% \texttt{font.id} 唯一。
+% \begin{macrocode}
+ local id = new_luafunction("ctex")
+ func[id] = function ()
+ local s = scan_arg()
+ local is_braced, is_quoted
+ if s:sub(1,1) == '{' and s:sub(-1)=='}' then
+ is_braced = true; s = s:sub(2,-2)
+ end
+ if s:sub(1,1) == '"' and s:sub(-1) == '"' then
+ is_quoted = true; s = s:sub(2,-2)
+ end
+ s = s .. ltjfont.print_aftl_address()
+ if is_braced then s = '{'..s..'}'
+ elseif is_quoted then s = '"'..s..'"'
+ end
+ tex.sprint(-2, s)
+ end
+ set_lua("ctex_ltj_patch_external_font:n", id, "global")
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ctex_ltj_use_jfont:}
+% 使用 jfont,确保当前的 \tn{font} 是 jfont。
+% \begin{macrocode}
+ local id = new_luafunction("ctex")
+ func[id] = function ()
+ font.current(getattribute("ltj@curjfnt"))
+ end
+ set_lua("ctex_ltj_use_jfont:", id, "global", "protected")
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ctex_ltj_set_alt_font:nnnn}
+% |#1| 和 |#2| 分别是字符区间的首末,|#3| 是基础字体,|#4| 是替代字体。
+% \begin{macrocode}
+ local id = new_luafunction("ctex")
+ func[id] = function ()
+ local b = tonumber(scan_arg())
+ local e = tonumber(scan_arg())
+ local alt = scan_arg()
+ local base = scan_arg()
+ ltjfont.set_alt_font_latex(b, e, alt, base)
+ end
+ set_lua("ctex_ltj_set_alt_font:nnnn", id, "global", "protected")
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ctex_ltj_clear_alt_font:n}
+% 清除 |#1| 的替代字体。
+% \begin{macrocode}
+ local id = new_luafunction("ctex")
+ func[id] = function ()
+ local base = scan_arg()
+ ltjfont.clear_alt_font_latex(base)
+ end
+ set_lua("ctex_ltj_clear_alt_font:n", id, "global", "protected")
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ctex_ltj_pickup_alt_font:nn}
+% 定义 |#1| 的替代字体,|#2| 是字体大小。\\
+% 会在内部执行 \tn{ltj@pickup@altfont@auxy} 和 \tn{ltj@pickup@altfont@copy}。
+% \begin{macrocode}
+ local id = new_luafunction("ctex")
+ func[id] = function ()
+ local base = scan_arg()
+ local size = scan_arg()
+ ltjfont.output_alt_font_cmd("y", base)
+ ltjfont.pickup_alt_font_a(size)
+ end
+ set_lua("ctex_ltj_pickup_alt_font:nn", id, "global", "protected")
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_pickup_alt_font:Nn}
+% |#1| 是 \texttt{font.id},|#2| 是字体名称。
+% 在 \tn{ltj@pickup@altfont@copy} 之中使用。
+% \begin{macrocode}
+ local id = new_luafunction("ctex")
+ func[id] = function ()
+ local num = scan_int()
+ local base = scan_arg()
+ ltjfont.pickup_alt_font_b(num, base)
+ end
+ set_lua("@@_pickup_alt_font:Nn", id, "global", "protected")
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_if_alt_set:nT}
+% 判断是否存在替代字体。会设置变量 |aftl_base| 和返回 \tn{@firstofone} 或 \tn{@gobble}。
+% \begin{verbatim}
+% function luatexja.jfont.does_alt_set(bbase)
+% aftl_base = alt_font_table_latex[bbase]
+% tex.sprint(cat_lp, aftl_base and '\\@firstofone' or '\\@gobble')
+% end
+% \end{verbatim}
+% \pkg{luatexja} 20200412.0 以后的定义为:
+% \begin{verbatim}
+% function luatexja.jfont.does_alt_set()
+% aftl_base = alt_font_table_latex[scan_arg()]
+% tex.sprint(cat_lp, aftl_base and '\\@firstofone' or '\\@gobble')
+% end
+% \end{verbatim}
+% \begin{macrocode}
+ local id = new_luafunction("ctex")
+ func[id] = \LuaTeXjaversion > 20200412.0
+ and ltjfont.does_alt_set
+ or function ()
+ local base = scan_arg()
+ ltjfont.does_alt_set(base)
+ end
+ set_lua("@@_if_alt_set:nT", id, "global")
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\ctex_ltj_zero_globaldefs:}
+% 设置 \tn{globaldefs} 为 $0$,避免全局设置,应当在分组中使用。
+% 这里通过 Lua 设置,可以不受外部 \TeX\ 环境中的 \tn{globaldefs} 的影响。
+% \begin{macrocode}
+ local id = new_luafunction("ctex")
+ func[id] = function ()
+ tex.set("globaldefs", 0)
+ end
+ set_lua("ctex_ltj_zero_globaldefs:", id, "global", "protected")
}
+\group_end:
% \end{macrocode}
+% \end{macro}
%
% \paragraph{字体切换方式}
%
% \begin{macro}[int]{\ctex_ltj_select_font:,\CJK@family}
% \tn{CJK@family} 保存的是当前 CJK 实际的字体族名,如果为空表示没有设置过字体。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_select_font:
+\cs_new_protected:Npn \ctex_ltj_select_font:
{
- \cs_if_exist_use:cF { \l_@@_current_font_tl }
+ \group_begin: \exp_args:NNc \group_end:
+ \cs_if_exist_use:NF { \l_@@_current_font_tl }
{ \tl_if_empty:NF \CJK@family { \@@_select_font_aux: } }
}
\tl_new:N \CJK@family
@@ -4421,7 +4970,7 @@ Copyright and Licence
% 使用 \tn{pickup@font} 取得字体名称前,总需要先设置 \tn{font@name}。在这里将
% \tn{f@family} 换成 CJK 字体族,并确保编码正确。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_select_font_aux:
+\cs_new_protected:Npn \@@_select_font_aux:
{
\group_begin:
\tl_set_eq:NN \f@encoding \CJK@encoding
@@ -4440,20 +4989,24 @@ Copyright and Licence
\cs_if_exist:cF { \l_@@_current_font_tl }
{ \@@_select_font_aux: }
}
-\cs_new_protected_nopar:Npn \@@_push_fontname:n #1
+\cs_new_protected:Npn \@@_push_fontname:n #1
{
- \cs_gset_eq:NN \@@_save_fontname:w \font@name
+ \seq_gpush:No \g_@@_fontname_seq { \font@name }
\cs_gset_nopar:Npx \font@name {#1}
}
-\cs_new_protected_nopar:Npn \@@_pop_fontname:
- { \cs_gset_eq:NN \font@name \@@_save_fontname:w }
+\cs_new_protected:Npn \@@_pop_fontname:
+ {
+ \seq_gpop:NNT \g_@@_fontname_seq \l_@@_tmp_tl
+ { \cs_gset_eq:NN \font@name \l_@@_tmp_tl }
+ }
+\seq_new:N \g_@@_fontname_seq
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\ctex_ltj_pickup_font:}
% 替换 \tn{define@newfont} 内部调用的 \tn{extract@font} 和 \tn{do@subst@correction}。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_pickup_font:
+\cs_new_protected:Npn \ctex_ltj_pickup_font:
{
\exp_after:wN \cs_if_exist:NF \font@name
{
@@ -4474,11 +5027,18 @@ Copyright and Licence
% %%%%%%%% \jfont\CS={...:...;jfm=metric;...}, \globaljfont
% \protected\def\jfont#1{%
% \afterassignment\ltj@@jfont
-% \directlua{luatexja.jfont.jfontdefX(false, 'yoko','\luatexluaescapestring{\noexpand#1}')}}
+% \directlua{luatexja.jfont.jfontdefX
+% (false, 'yoko','\luatexluaescapestring{\noexpand#1}')}}
% \protected\def\globaljfont#1{%
% \afterassignment\ltj@@jfont
-% \directlua{luatexja.jfont.jfontdefX(true, 'yoko','\luatexluaescapestring{\noexpand#1}')}}
-% \def\ltj@@jfont{\directlua{luatexja.jfont.jfontdefY()}}
+% \directlua{luatexja.jfont.jfontdefX
+% (true, 'yoko','\luatexluaescapestring{\noexpand#1}')}}
+% \newluafunction\ltj@@jfont@inner
+% \directlua{
+% local t = lua.get_functions_table()
+% t[\the\ltj@@jfont@inner] = luatexja.jfont.jfontdefY
+% }
+% \def\ltj@@jfont{\luafunction\ltj@@jfont@inner}
% \end{verbatim}
% \texttt{jfontdefX} 函数的作用是把 \tn{CS} 定义为其后的字体,\texttt{jfontdefY}
% 的作用是更新 \texttt{JFM} 和记录相关字体信息。最后的工作是:
@@ -4505,7 +5065,7 @@ Copyright and Licence
% 赋值总是全局的,不会受到分组的影响。
% \begin{macrocode}
\font@name
- \lua_now:e { font.current(tex.getattribute('ltj@curjfnt')) }
+ \ctex_ltj_use_jfont:
\use:c { \f@encoding + \f@family }
\use:c { \curr@fontshape }
}
@@ -4557,42 +5117,28 @@ Copyright and Licence
% \begin{macrocode}
\prg_new_conditional:Npnn \ctex_ltj_if_alternate_shape_exist:n #1 { T , F , TF }
{
- \lua_now:e { luatexja.jfont.does_alt_set ('\lua_escape:e {#1}') }
- \prg_return_true: \else: \prg_return_false: \fi:
+ \@@_if_alt_set:nT {#1} { \prg_return_true: \use_none:n }
+ \prg_return_false:
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_patch_external_font:w}
-% 若对字体的定义完全相同,则它们有相同的 \texttt{font.id}。因此如果字形是由
-% \textsf{NFSS} 的替换机制定义的,它们就有相同的 \texttt{font.id}。
-% |print_aftl_address| 函数的定义是
-% \begin{verbatim}
-% function print_aftl_address()
-% tex.sprint(cat_lp, ';ltjaltfont' .. tostring(aftl_base):sub(8))
-% end
-% \end{verbatim}
-% 主要目的是,如果当前字形有替代字体,则往字形的定义中加入一些标志,确保
-% \texttt{font.id} 唯一。
% \begin{macrocode}
-\cs_new_nopar:Npn \@@_patch_external_font:w #1 ~ at
- { #1 \lua_now:e { luatexja.jfont.print_aftl_address() } ~ at }
+\cs_new:Npn \@@_patch_external_font:w #1 ~ at
+ { \ctex_ltj_patch_external_font:n {#1} ~ at }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\ctex_ltj_select_alternate_font:}
% 在 \tn{selectfont} 中更新替代字体。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_select_alternate_font:
+\cs_new_protected:Npn \ctex_ltj_select_alternate_font:
{
\ctex_ltj_if_alternate_shape_exist:nT { \l_@@_current_shape_tl }
{
- \lua_now:e
- {
- luatexja.jfont.output_alt_font_cmd
- ('y', '\lua_escape:e { \l_@@_current_shape_tl }')
- }
- \lua_now:e { luatexja.jfont.pickup_alt_font_a ('\f@size') }
+ \ctex_ltj_pickup_alt_font:nn
+ { \l_@@_current_shape_tl } { \f@size }
}
}
\tl_new:N \l_@@_current_shape_tl
@@ -4604,12 +5150,12 @@ Copyright and Licence
% \begin{macro}[int]{\ltj@pickup@altfont@auxy}
% 被用在函数 |output_alt_font_cmd| 中,作用是定义替代字体。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ltj@pickup@altfont@auxy #1
+\cs_new_protected:Npn \ltj@pickup@altfont@auxy #1
{
\cs_if_exist:cF { #1/\f@size }
{
\group_begin:
- \use:x { \exp_not:N \split@name #1 / \f@size } \@nil
+ \use:e { \exp_not:N \split@name #1 / \f@size } \@nil
\@@_push_fontname:n { \use:c { \curr@fontshape / \f@size } }
\ctex_ltj_pickup_font:
\group_end:
@@ -4619,32 +5165,20 @@ Copyright and Licence
% \end{macrocode}
% \end{macro}
%
-% \begin{macrocode}
-%<@@=>
-% \end{macrocode}
-%
% \begin{macro}[int]{\ltj@pickup@altfont@copy}
% 被用在函数 |pickup_alt_font_a| 中。\tn{ltj@@getjfontnumber} 的作用是将字体命令
% |#1| 对应的 \texttt{font.id} 保存到 \tn{ltj@tempcntc} 中。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ltj@pickup@altfont@copy #1#2
+\cs_new_protected:Npn \ltj@pickup@altfont@copy #1#2
{
- \ltj@@getjfontnumber #1
- \lua_now:e
- {
- luatexja.jfont.pickup_alt_font_b
- ( \int_use:N \ltj@tempcntc, '\lua_escape:e {#2}' )
- }
+ \ltj@@@@getjfontnumber #1
+ \@@_pickup_alt_font:Nn \ltj@tempcntc {#2}
}
% \end{macrocode}
% \end{macro}
%
% \paragraph{数学字体族}
%
-% \begin{macrocode}
-%<@@=ctex_ltj>
-% \end{macrocode}
-%
% 以下内容来自 \file{lltjfont.sty},目的是让汉字可以在数学环境中直接使用。
%
% \begin{macro}[int]{\ctex_ltj_if_jfont:nTF}
@@ -4657,10 +5191,11 @@ Copyright and Licence
% \begin{macrocode}
\cs_new:Npn \ctex_ltj_if_jfont:nTF #1
{
- \lua_now:e
- { luatexja.jfont.is_kenc( string.match('\lua_escape:e {#1}', '[^/]+') ) }
+ \ctex_ltj_is_kenc:n { \@@_ltj_if_jfont:w #1 / \q_stop }
\ifin@ \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi:
}
+\cs_new:Npn \@@_ltj_if_jfont:w #1 / #2 \q_stop
+ {#1}
% \end{macrocode}
% \end{macro}
%
@@ -4678,24 +5213,20 @@ Copyright and Licence
% \end{macrocode}
% \end{macro}
%
-% \begin{macrocode}
-%<@@=>
-% \end{macrocode}
-%
% \begin{macro}[int]{\getanddefine@fonts,\ctex_ltj_get_and_define_fonts:nN}
% 在使用的场合,\tn{escapechar} 已经被设置成 $-1$,使用 \cs{token_to_str:N} 就
% 可以得到名字,不必使用 \cs{cs_to_str:N}。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_get_and_define_fonts:nN #1#2
+\cs_new_protected:Npn \ctex_ltj_get_and_define_fonts:nN #1#2
{
- \ctex_ltj_if_jfont:nTF { \token_to_str:N #2 }
+ \exp_args:No \ctex_ltj_if_jfont:nTF { \token_to_str:N #2 }
{ \ctex_ltj_get_and_define_fonts_ja:nN }
{ \ctex_ltj_get_and_define_fonts_al:nN }
{#1} #2
}
\cs_new_eq:NN \ctex_ltj_get_and_define_fonts_al:nN \getanddefine@fonts
\cs_set_eq:NN \getanddefine@fonts \ctex_ltj_get_and_define_fonts:nN
-\cs_new_protected_nopar:Npn \ctex_ltj_get_and_define_fonts_ja:nN #1#2
+\cs_new_protected:Npn \ctex_ltj_get_and_define_fonts_ja:nN #1#2
{
\tl_gset:Nx \font@name { \use:c { \token_to_str:N #2 / \tf@size } }
\ctex_ltj_pickup_font: \tl_set_eq:NN \textfont@name \font@name
@@ -4706,22 +5237,18 @@ Copyright and Licence
\tl_put_right:Nx \math@fonts
{
\ltj@setpar@global
- \ltj@@set@stackfont #1 , \textfont@name \c_colon_str { MJT }
- \ltj@@set@stackfont #1 , \scriptfont@name \c_colon_str { MJS }
- \ltj@@set@stackfont #1 , \font@name \c_colon_str { MJSS }
+ \ltj@@@@set@stackfont #1 , \textfont@name \c_colon_str { MJT }
+ \ltj@@@@set@stackfont #1 , \scriptfont@name \c_colon_str { MJS }
+ \ltj@@@@set@stackfont #1 , \font@name \c_colon_str { MJSS }
}
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macrocode}
-%<@@=ctex_ltj>
-% \end{macrocode}
-%
% \begin{macro}[int]{\use@mathgroup,\ctex_ltj_use_math_group:Nn}
% 在使用 \pkg{unicode-math} 宏包时,\cs{ctex_ltj_math_group_hook:} 将被重定义。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_use_math_group:Nn #1#2
+\cs_new_protected:Npn \ctex_ltj_use_math_group:Nn #1#2
{
\mode_if_math:T
{
@@ -4762,7 +5289,7 @@ Copyright and Licence
}
{
\cs_set_eq:NN \use@mathgroup \ctex_ltj_use_math_group:Nn
- \cs_set_protected_nopar:Npn \ctex_ltj_math_group_hook:
+ \cs_set_protected:Npn \ctex_ltj_math_group_hook:
{ \__um_switchto_literal: }
\ctex_ltj_set_math_letter:NN
\__um_sym:nnn
@@ -4777,7 +5304,7 @@ Copyright and Licence
% \begin{variable}{\l_@@_jfm_tl}
% \pkg{LuaTeX-ja} 中与标点格式 \opt{plain} 对应的 \texttt{JFM} 是 \opt{mono}。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_mono_jfm:n #1
+\cs_new_protected:Npn \ctex_mono_jfm:n #1
{
\str_if_eq:nnTF {#1} { plain }
{ \tl_set:Nn \l_@@_jfm_tl { mono } }
@@ -4791,7 +5318,6 @@ Copyright and Licence
% \end{macro}
%
% \begin{macro}[int]{\CJK@encoding}
-% \begin{macro}{\@@_change_encoding:}
% 在 \LaTeX 下,\pkg{LuaTeX-ja} 依赖字体编码来实现特殊设置。例如上述的
% \cs{ctex_ltj_if_jfont:nTF} 就是通过判断编码来实现的,它在设置数学字体时会用到。所以
% 不应该与西文共用 \texttt{EU2}。定义字体族 song 为 \tn{CJK@encoding} 的默认替换
@@ -4799,29 +5325,26 @@ Copyright and Licence
% \begin{macrocode}
\tl_const:Nn \CJK@encoding { LTJY3 }
\DeclareFontEncoding { \CJK@encoding } { } { }
-\use:x
+\use:e
{
\exp_not:N \DeclareFontSubstitution
- { \CJK@encoding } { song } { \mddefault } { \updefault }
+ { \CJK@encoding } { song } { \mddefault } { \shapedefault }
}
-\lua_now:e { luatexja.jfont.add_kyenc_list('\CJK@encoding') }
-\cs_new_protected_nopar:Npn \@@_change_encoding:
- { \tl_set_eq:NN \g_fontspec_encoding_tl \CJK@encoding }
+\ctex_ltj_add_kyenc:n { \CJK@encoding }
\DeclareFontFamily { \CJK@encoding } { song } { }
-\DeclareFontShape { \CJK@encoding } { song } { \mddefault } { \updefault }
+\DeclareFontShape { \CJK@encoding } { song } { \mddefault } { \shapedefault }
{ <-> psft:SimSun:cid=Adobe-GB1-5;jfm=\l_@@_jfm_tl } { }
-\DeclareFontShape { \CJK@encoding } { song } { \bfdefault } { \updefault }
+\DeclareFontShape { \CJK@encoding } { song } { \bfdefault } { \shapedefault }
{ <-> psft:SimHei:cid=Adobe-GB1-5;jfm=\l_@@_jfm_tl } { }
\tl_const:Nn \c_@@_math_tl { CJKmath }
\DeclareSymbolFont { \c_@@_math_tl }
- { \CJK@encoding } { song } { \mddefault } { \updefault }
+ { \CJK@encoding } { song } { \mddefault } { \shapedefault }
\SetSymbolFont { \c_@@_math_tl } { bold }
- { \CJK@encoding } { song } { \bfdefault } { \updefault }
+ { \CJK@encoding } { song } { \bfdefault } { \shapedefault }
\int_const:Nn \c_@@_math_fam_int { \use:c { sym \c_@@_math_tl } }
\jfam \c_@@_math_fam_int
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% 这是 \pkg{luatexja-fontspec} 中新增的一些字体选项。
% \begin{macrocode}
@@ -4847,7 +5370,7 @@ Copyright and Licence
{
\group_begin:
\clist_clear:N \l_@@_char_range_clist
- \seq_clear:N \l_@@_alternate_seq
+ \prop_clear:N \l_@@_alternate_prop
\tl_set:Nn \l_@@_base_CJKfamily_tl {#1}
\keys_set_known:nnN { ctex_ltj / fontspec } {#2} \l_@@_tmp_tl
\clist_set:No \l_@@_font_options_clist { \l_@@_tmp_tl }
@@ -4864,10 +5387,17 @@ Copyright and Licence
}
\tl_new:N \l_@@_base_CJKfamily_tl
\clist_new:N \l_@@_font_options_clist
-\cs_new_protected_nopar:Npn \@@_use_global_options:N #1
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_use_global_options:N}
+% 应用默认字体选项,并总是设置 \opt{JFM} 和 \opt{NFSSEncoding} 。
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_use_global_options:N #1
{
\clist_concat:NNN #1 \g_@@_default_features_clist #1
- \clist_put_left:Nx #1 { JFM = \l_@@_jfm_tl }
+ \clist_put_left:Nx #1
+ { NFSSEncoding = \CJK@encoding , JFM = \l_@@_jfm_tl }
}
% \end{macrocode}
% \end{macro}
@@ -4885,7 +5415,7 @@ Copyright and Licence
% \begin{macro}{\@@_check_family:n}
% 删除重复的定义,清除替代字体的先前设置。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_check_family:n #1
+\cs_new_protected:Npn \@@_check_family:n #1
{
\prop_gpop:NnNT \g_@@_family_font_name_prop {#1} \l_@@_tmp_tl
{
@@ -4911,28 +5441,24 @@ Copyright and Licence
% 在设置字体时,实际上并不是马上就定义。而是只保存相关参数,在通过 \tn{CJKfamily}
% 第一次使用时才定义。需要注意将编码改为 \tn{CJK@encoding}。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_gset_family_cs:nn #1#2
+\cs_new_protected:Npn \@@_gset_family_cs:nn #1#2
{
- \cs_gset_protected_nopar:cpx { \@@_family_csname:n {#1} }
+ \cs_gset_protected:cpx { \@@_family_csname:n {#1} }
{
\group_begin:
- \@@_change_encoding:
\exp_not:n { \cs_set_eq:NN \CJKfamily \use_none:n }
- \exp_not:n { \cs_set_eq:NN \CTEX@fontfamily \use_none:n }
- \exp_not:n { \fontspec_set_family:Nnn \g_@@_fontspec_family_tl }
+ \exp_not:n { \fontspec_gset_family:Nnn \g_@@_fontspec_family_tl }
{ \exp_not:o { \l_@@_font_options_clist } } {#2}
\prop_gput:Nno \exp_not:N \g_@@_family_name_prop {#1}
{ \exp_not:N \g_@@_fontspec_family_tl }
- \tl_gset_eq:NN \exp_not:N \g_@@_fontspec_family_tl
- \exp_not:N \g_@@_fontspec_family_tl
\@@_set_alternate_family:n {#1}
\group_end:
}
}
\tl_new:N \l_@@_base_family_tl
\tl_new:N \g_@@_fontspec_family_tl
-\cs_new_nopar:Npn \@@_family_csname:n #1 { ctex_ltj/family/#1 }
-\cs_new_protected_nopar:Npn \@@_set_alternate_family:n #1
+\cs_new:Npn \@@_family_csname:n #1 { ctex_ltj/family/#1 }
+\cs_new_protected:Npn \@@_set_alternate_family:n #1
{
\tl_set:Nn \l_@@_base_CJKfamily_tl {#1}
\tl_set_eq:NN \l_@@_base_family_tl \g_@@_fontspec_family_tl
@@ -4948,7 +5474,7 @@ Copyright and Licence
% \begin{macrocode}
\NewDocumentCommand \CJKfamily { m }
{ \ctex_ltj_switch_family:x {#1} \tex_ignorespaces:D }
-\cs_new_protected_nopar:Npn \ctex_ltj_switch_family:n #1
+\cs_new_protected:Npn \ctex_ltj_switch_family:n #1
{
\ctex_ltj_family_if_exist:nNTF {#1} \CJK@family
{
@@ -4984,7 +5510,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_family_unknown_warning:n}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_family_unknown_warning:n #1
+\cs_new_protected:Npn \@@_family_unknown_warning:n #1
{
\prop_if_empty:NF \g_@@_family_font_name_prop
{
@@ -5001,7 +5527,7 @@ Copyright and Licence
Unknown~CJK~family~`\@@_msg_family_map:n {#1}'~is~being~ignored.\\
Try~to~use~`\@@_msg_def_family_map:n {#1}'~to~define~it.
}
-\cs_new_nopar:Npn \@@_msg_def_family_map:n #1
+\cs_new:Npn \@@_msg_def_family_map:n #1
{
\str_case_e:nnF {#1}
{
@@ -5012,7 +5538,7 @@ Copyright and Licence
{ \token_to_str:N \setCJKfamilyfont \{ #1 \} }
[...]\{...\}
}
-\cs_new_nopar:Npn \@@_msg_family_map:n #1
+\cs_new:Npn \@@_msg_family_map:n #1
{
\str_case_e:nnF {#1}
{
@@ -5027,21 +5553,21 @@ Copyright and Licence
%
% \begin{macro}[int]{\ctex_ltj_fontspec:nn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_fontspec:nn #1#2
+\cs_new_protected:Npn \ctex_ltj_fontspec:nn #1#2
{
\prop_get:NnNTF \g_@@_fontspec_prop
{ CJKfontspec/#1/#2/id } \l_ctex_ltj_family_tl
{ \ctex_ltj_switch_family:x { \l_ctex_ltj_family_tl } }
{
\int_gincr:N \g_@@_family_int
- \@@_fontspec:xnn
+ \@@_fontspec:enn
{ CJKfontspec ( \int_use:N \g_@@_family_int ) }
{#1} {#2}
}
}
-\cs_new_protected_nopar:Npn \ctex_ltj_fontspec:xx #1#2
- { \use:x { \ctex_ltj_fontspec:nn {#1} {#2} } }
-\cs_new_protected_nopar:Npn \@@_fontspec:nnn #1#2#3
+\cs_new_protected:Npn \ctex_ltj_fontspec:ee #1#2
+ { \use:e { \ctex_ltj_fontspec:nn {#1} {#2} } }
+\cs_new_protected:Npn \@@_fontspec:nnn #1#2#3
{
\bool_if:NT \l_@@_add_alternate_bool
{
@@ -5061,7 +5587,7 @@ Copyright and Licence
\ctex_ltj_set_family:nnn {#1} {#2} {#3}
\ctex_ltj_switch_family:n {#1}
}
-\cs_generate_variant:Nn \@@_fontspec:nnn { x }
+\cs_generate_variant:Nn \@@_fontspec:nnn { e }
\prop_new:N \g_@@_fontspec_prop
% \end{macrocode}
% \end{macro}
@@ -5069,9 +5595,9 @@ Copyright and Licence
% \begin{macro}[int]
% {\ctex_ltj_add_font_features:n,\ctex_ltj_add_font_features:nn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_add_font_features:n #1
+\cs_new_protected:Npn \ctex_ltj_add_font_features:n #1
{ \ctex_ltj_add_font_features:xn { \l_ctex_ltj_family_tl } {#1} }
-\cs_new_protected_nopar:Npn \ctex_ltj_add_font_features:nn #1#2
+\cs_new_protected:Npn \ctex_ltj_add_font_features:nn #1#2
{
\prop_get:NnNTF \g_@@_family_font_name_prop
{#1} \l_@@_tmp_tl
@@ -5080,7 +5606,7 @@ Copyright and Licence
{#1} \l_@@_font_options_clist
\clist_put_right:Nn \l_@@_font_options_clist {#2}
\bool_set_true:N \l_@@_add_alternate_bool
- \ctex_ltj_fontspec:xx
+ \ctex_ltj_fontspec:ee
{ \exp_not:o { \l_@@_font_options_clist } }
{ \exp_not:o { \l_@@_tmp_tl } }
}
@@ -5102,16 +5628,16 @@ Copyright and Licence
% \begin{macrocode}
\cs_new_protected:Npn \@@_pass_args:nnnn #1#2#3#4
{
- \IfNoValueTF {#2}
+ \tl_if_novalue:nTF {#2}
{ \@@_post_arg:w {#1} {#3} {#4} }
{
- \use:x { #1 {#2} {#3} }
+ \use:e { #1 {#2} {#3} }
#4
}
}
\NewDocumentCommand \@@_post_arg:w { m m m O { } }
{
- \use:x { #1 {#4} {#2} }
+ \use:e { #1 {#4} {#2} }
#3
}
% \end{macrocode}
@@ -5131,8 +5657,8 @@ Copyright and Licence
\NewDocumentCommand \newCJKfontfamily { o m o m }
{
\tl_set:Nx \l_@@_tmp_tl
- { \IfNoValueTF {#1} { \cs_to_str:N #2 } {#1} }
- \cs_new_protected_nopar:Npx #2
+ { \tl_if_novalue:nTF {#1} { \cs_to_str:N #2 } {#1} }
+ \cs_new_protected:Npx #2
{ \ctex_ltj_switch_family:n { \l_@@_tmp_tl } }
\@@_pass_args:nnnn
{ \ctex_ltj_set_family:nnn { \l_@@_tmp_tl } } {#3} {#4}
@@ -5194,54 +5720,13 @@ Copyright and Licence
% \end{macrocode}
% \end{macro}
%
-% \begin{macrocode}
-\tl_if_exist:NF \CJKfamilydefault
- { \tl_const:Nn \CJKfamilydefault { \CJKrmdefault } }
-\tl_if_exist:NF \CJKrmdefault { \tl_const:Nn \CJKrmdefault { rm } }
-\tl_if_exist:NF \CJKsfdefault { \tl_const:Nn \CJKsfdefault { sf } }
-\tl_if_exist:NF \CJKttdefault { \tl_const:Nn \CJKttdefault { tt } }
-% \end{macrocode}
-%
-% \begin{macro}[int]{\fontfamily}
-% \begin{macro}[int]{\CTEX@fontfamily}
% \changes{v2.4.8}{2017/02/23}
% {解决与 \pkg{fontspec} 2017/01/24 v2.5d 的字体族匹配兼容问题。}
-% 修改 \tn{fontfamily},使主要 |CJK| 字体族能随西文主要字体更新。
-% \begin{macrocode}
-\RenewDocumentCommand \fontfamily { m }
- {
- \tl_set:Nx \f@family {#1}
- \CTEX@fontfamily {#1}
- }
-\cs_new_protected_nopar:Npn \CTEX@fontfamily #1
- {
- \str_if_eq:nnTF {#1} { \familydefault }
- { \CJKfamily { \CJKfamilydefault } }
- { \@@_update_family_aux: }
- }
-\cs_new_protected_nopar:Npn \@@_update_family_aux:
- {
- \str_case_e:nn { \f@family }
- {
- { \rmdefault } { \CJKfamily { \CJKrmdefault } }
- { \sfdefault } { \CJKfamily { \CJKsfdefault } }
- { \ttdefault } { \CJKfamily { \CJKttdefault } }
- { \familydefault } { \CJKfamily { \CJKfamilydefault } }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% 在导言区末尾更新 \tn{CJKfamilydefault}。
-% \begin{macrocode}
-\ctex_at_end_preamble:n { \ctex_update_default_family: }
-% \end{macrocode}
%
% \begin{macro}[int]{\ctex_ltj_ensure_default_family:}
% 在导言区结束确认 \tn{CJKfamilydefault} 确实存在。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_ensure_default_family:
+\cs_new_protected:Npn \ctex_ltj_ensure_default_family:
{
\prop_if_empty:NF \g_@@_family_font_name_prop
{
@@ -5272,7 +5757,7 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_ltj_update_mathfont:}
% 更新数学字体为实际的字体。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_update_mathfont:
+\cs_new_protected:Npn \ctex_ltj_update_mathfont:
{
\ctex_ltj_family_if_exist:xNTF { \c_@@_math_tl } \l_@@_tmp_tl
{ \ctex_ltj_update_mathfont:n { \l_@@_tmp_tl } }
@@ -5281,20 +5766,20 @@ Copyright and Licence
{ \ctex_ltj_update_mathfont:n { \l_@@_tmp_tl } }
}
}
-\cs_new_protected_nopar:Npn \ctex_ltj_update_mathfont:n #1
+\cs_new_protected:Npn \ctex_ltj_update_mathfont:n #1
{
\tl_const:Nx \c_@@_math_family_tl {#1}
\DeclareSymbolFont { \c_@@_math_tl } { \CJK@encoding }
- { \c_@@_math_family_tl } { \mddefault } { \updefault }
+ { \c_@@_math_family_tl } { \mddefault } { \shapedefault }
\cs_if_free:cTF
- { \CJK@encoding/\c_@@_math_family_tl/\bfdefault/\updefault }
+ { \CJK@encoding/\c_@@_math_family_tl/\bfdefault/\shapedefault }
{
\SetSymbolFont { \c_@@_math_tl } { bold } { \CJK@encoding }
- { \c_@@_math_family_tl } { \mddefault } { \updefault }
+ { \c_@@_math_family_tl } { \mddefault } { \shapedefault }
}
{
\SetSymbolFont { \c_@@_math_tl } { bold } { \CJK@encoding }
- { \c_@@_math_family_tl } { \bfdefault } { \updefault }
+ { \c_@@_math_family_tl } { \bfdefault } { \shapedefault }
}
}
% \end{macrocode}
@@ -5302,12 +5787,14 @@ Copyright and Licence
%
% \paragraph{替代字体的设置}
%
+% \changes{v2.5}{2020/04/30}{重构字体选项 \opt{AlternateFont}。}
+%
% \begin{macro}{AlternateFont,CharRange}
% 设置替代字体的选项。
% \begin{macrocode}
\keys_define:nn { ctex_ltj / fontspec }
{
- AlternateFont .code:n = \ctex_ltj_set_alternate_seq:n {#1} ,
+ AlternateFont .code:n = \ctex_ltj_set_alternate_prop:n {#1} ,
AlternateFont .value_required:n = true ,
CharRange .clist_set:N = \l_@@_char_range_clist ,
CharRange .value_required:n = true
@@ -5315,84 +5802,84 @@ Copyright and Licence
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[int]{\ctex_ltj_set_alternate_seq:n}
-% 我们使用 \verb=||= 作为替代字体序列的分隔标志。它可能被设置为活动字符,为此
-% 需要先“消毒”,同时过滤掉空元素。
+% \begin{macro}[int]{\ctex_ltj_set_alternate_prop:n}
+% 保存替代字体序列。
% \begin{macrocode}
-\group_begin:
- \char_set_catcode_other:N \|
- \cs_set:Npn \@@_tmp:w #1
- {
- \cs_new_protected:Npn \ctex_ltj_set_alternate_seq:n ##1
- {
- \clist_if_empty:NT \l_@@_char_range_clist
- {
- \tl_set:Nn \l_@@_tmp_tl { ##1 }
- \tl_replace_all:Nnn \l_@@_tmp_tl {#1} { || }
- \seq_set_split:NnV \l_@@_tmp_seq { || } \l_@@_tmp_tl
- \seq_set_filter:NNn \l_@@_tmp_seq \l_@@_tmp_seq
- { ! \tl_if_blank_p:n { ####1 } }
- \seq_concat:NNN \l_@@_alternate_seq
- \l_@@_alternate_seq \l_@@_tmp_seq
- }
- }
- }
- \char_set_catcode_active:N \|
- \@@_tmp:w { || }
-\group_end:
-\seq_new:N \l_@@_tmp_seq
-\seq_new:N \l_@@_alternate_seq
+\cs_new_protected:Npn \ctex_ltj_set_alternate_prop:n #1
+ { \clist_map_function:nN {#1} \@@_push_alternate_prop:n }
+\cs_new_protected:Npn \@@_push_alternate_prop:n #1
+ {
+ \clist_set:Nx \l_@@_tmp_clist { \tl_head:n {#1} }
+ \tl_remove_all:Nn \l_@@_tmp_clist { ~ }
+ \exp_args:No \@@_push_alternate_prop:nn
+ { \l_@@_tmp_clist } {#1}
+ }
+\cs_new_protected:Npn \@@_push_alternate_prop:nn #1
+ {
+ \prop_remove:Nn \l_@@_alternate_prop {#1}
+ \prop_put:Nnn \l_@@_alternate_prop {#1}
+ }
+\clist_new:N \l_@@_tmp_clist
+\prop_new:N \l_@@_alternate_prop
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\ctex_ltj_set_alternate_family:nnF}
% 如果在字体的选项中设置了 \opt{CharRange},则只设置替代字体。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_set_alternate_family:nnF #1#2#3
+\cs_new_protected:Npn \ctex_ltj_set_alternate_family:nnF
{
\clist_if_empty:NTF \l_@@_char_range_clist
- {
- \@@_check_family:n {#1}
- \seq_if_empty:NF \l_@@_alternate_seq
- { \ctex_ltj_save_alternate_seq:cn { \@@_alternate_cs:n {#1} } {#2} }
- #3
- }
- { \ctex_ltj_set_alternate_family:nn {#1} {#2} }
+ { \@@_set_family_aux:nnn }
+ { \@@_set_alternate_family_aux:nnn }
}
+\cs_new_protected:Npn \@@_set_family_aux:nnn #1#2#3
+ {
+ \@@_check_family:n {#1}
+ \prop_if_empty:NF \l_@@_alternate_prop
+ { \ctex_ltj_save_alternate_seq:cn { \@@_alternate_cs:n {#1} } {#2} }
+ #3
+ }
+\cs_new_protected:Npn \@@_set_alternate_family_aux:nnn #1#2#3
+ { \ctex_ltj_set_alternate_family:nn {#1} {#2} }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[int]
-% {\ctex_ltj_save_alternate_seq:Nn,\ctex_ltj_save_alternate_seq:Nnnwn}
+% \begin{macro}[int]{\ctex_ltj_save_alternate_seq:Nn}
% 保存由 \opt{AlternateFont} 设置的替代字体序列。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_save_alternate_seq:Nn #1#2
+\cs_new_protected:Npn \ctex_ltj_save_alternate_seq:Nn #1#2
{
- \seq_map_inline:Nn \l_@@_alternate_seq
- { \ctex_ltj_save_alternate_seq:Nnnwnw #1 {#2} ##1 { } \q_stop }
+ \prop_map_inline:Nn \l_@@_alternate_prop
+ { \@@_save_alternate_auxi:w ##2 { } \q_mark #1 {#2} }
}
-\cs_generate_variant:Nn \ctex_ltj_save_alternate_seq:Nn { c }
-\NewDocumentCommand \ctex_ltj_save_alternate_seq:Nnnwnw
- { m m m +O{ } m u{ \q_stop } }
+\cs_new_protected:Npn \@@_save_alternate_auxi:w #1#2#
+ {
+ \tl_if_blank:nTF {#2}
+ { \@@_save_alternate_auxii:w {#1} }
+ { \@@_save_alternate_auxii:w {#1} {#2} }
+ }
+\cs_new_protected:Npn \@@_save_alternate_auxii:w #1#2#3 #4 \q_mark #5#6
{
- \clist_set:Nn \l_@@_char_range_clist {#3}
- \clist_set:Nn \l_@@_alternate_options_clist {#4}
+ \clist_set:Nn \l_@@_char_range_clist {#1}
+ \clist_set:Nn \l_@@_alternate_options_clist {#3}
\@@_use_global_options:N \l_@@_alternate_options_clist
- \tl_if_blank:nTF {#5}
- { \tl_set:Nn \l_@@_tmp_tl {#2} }
+ \tl_if_blank:nTF {#2}
+ { \tl_set:Nn \l_@@_tmp_tl {#6} }
{
- \tl_set:Nn \l_@@_tmp_tl {#5}
- \tl_replace_all:Nnn \l_@@_tmp_tl { * } {#2}
+ \tl_set:Nx \l_@@_tmp_tl { \tl_trim_spaces:n {#2} }
+ \tl_replace_all:Nnn \l_@@_tmp_tl { * } {#6}
}
- \use:x
+ \use:e
{
- \ctex_ltj_save_alternate_family:Nnnn \exp_not:N #1
+ \ctex_ltj_save_alternate_family:Nnnn \exp_not:N #5
{ \exp_not:o { \l_@@_char_range_clist } }
{ \exp_not:o { \l_@@_alternate_options_clist } }
{ \exp_not:o { \l_@@_tmp_tl } }
}
}
\clist_new:N \l_@@_alternate_options_clist
+\cs_generate_variant:Nn \ctex_ltj_save_alternate_seq:Nn { c }
% \end{macrocode}
% \end{macro}
%
@@ -5400,7 +5887,7 @@ Copyright and Licence
% 设置选项 \opt{CharRange} 范围内的替代字体。如果已经定义了主字体,我们也马上
% 定义替代字体,否则只保存起来备用。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_set_alternate_family:nn #1#2
+\cs_new_protected:Npn \ctex_ltj_set_alternate_family:nn #1#2
{
\@@_update_family_uid:N \l_@@_font_options_clist
\@@_use_global_options:N \l_@@_font_options_clist
@@ -5409,7 +5896,7 @@ Copyright and Licence
{ \l_@@_char_range_clist }
{ \l_@@_font_options_clist } {#2} {#1}
}
-\cs_new_protected_nopar:Npn \ctex_ltj_set_alternate_family:Nnnnn #1#2#3#4#5
+\cs_new_protected:Npn \ctex_ltj_set_alternate_family:Nnnnn #1#2#3#4#5
{
\prop_get:NnNT \g_@@_family_name_prop {#5} \l_@@_base_family_tl
{ \ctex_ltj_set_alternate_family:nnn {#2} {#3} {#4} }
@@ -5422,10 +5909,10 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_ltj_save_alternate_family:Nnnn}
% 保存替代字体序列的定义,以备定义主字体时使用。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_save_alternate_family:Nnnn #1#2#3#4
+\cs_new_protected:Npn \ctex_ltj_save_alternate_family:Nnnn #1#2#3#4
{
\cs_if_exist:NF #1 { \cs_set_eq:NN #1 \prg_do_nothing: }
- \cs_gset_protected_nopar:Npx #1
+ \cs_gset_protected:Npx #1
{ \exp_not:o { #1 \ctex_ltj_set_alternate_family:nnn {#2} {#3} {#4} } }
}
% \end{macrocode}
@@ -5434,10 +5921,9 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_ltj_set_alternate_family:nnn}
% 实际定义替代字体族。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_set_alternate_family:nnn #1#2#3
+\cs_new_protected:Npn \ctex_ltj_set_alternate_family:nnn #1#2#3
{
\group_begin:
- \@@_change_encoding:
\cs_set_eq:NN \CJKfamily \use_none:n
\ctex_ltj_swap_cs:NN
\DeclareFontShape@ \ctex_ltj_declare_alternate_shape:nnnnnn
@@ -5469,7 +5955,7 @@ Copyright and Licence
% \pkg{fontspec} 对 CJK 字体族总是定义新字体。
% \begin{macrocode}
\keys_define:nn { fontspec } { LTJFONTUID .code:n = }
-\cs_new_protected_nopar:Npn \@@_update_family_uid:N #1
+\cs_new_protected:Npn \@@_update_family_uid:N #1
{
\int_gincr:N \g_@@_family_int
\clist_put_right:Nx #1 { LTJFONTUID = \int_use:N \g_@@_family_int }
@@ -5488,8 +5974,7 @@ Copyright and Licence
{
\ctex_ltj_declare_alternate_shape:nnnnnn {#1} {#2} {#3} {#4} {#5} {#6}
\ctex_ltj_set_alternate_shape:Nnnnnnn \l_@@_char_range_clist
- { \l_@@_base_family_tl } {#3} {#4}
- { \l_fontspec_family_tl } {#3} {#4}
+ { \l_@@_base_family_tl } {#3} {#4} {#2} {#3} {#4}
}
% \end{macrocode}
% \end{macro}
@@ -5498,7 +5983,7 @@ Copyright and Licence
% 与 \pkg{LuaTeX-ja} 的 \tn{DeclareAlternateKanjiFont} 的功能类似,区别是固定编码
% 为 \tn{CJK@encoding}。这个设置总是全局的。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_set_alternate_shape:Nnnnnnn #1#2#3#4#5#6#7
+\cs_new_protected:Npn \ctex_ltj_set_alternate_shape:Nnnnnnn #1#2#3#4#5#6#7
{
\clist_map_inline:Nn #1
{
@@ -5509,10 +5994,9 @@ Copyright and Licence
}
{ \ctex_ltj_set_alternate_shape:nnn { #2/#3/#4 } { #5/#6/#7 } { ##1 } }
}
- \@@_save_alternate_shape:cnn
+ \@@_save_alternate_shape:cn
{ \@@_alternate_cs:n { clear / \l_@@_base_CJKfamily_tl } }
- { luatexja.jfont.clear_alt_font_latex }
- { '\lua_escape:e { \CJK@encoding/#2/#3/#4 }' }
+ { \ctex_ltj_clear_alt_font:n { \CJK@encoding/#2/#3/#4 } }
}
% \end{macrocode}
% \end{macro}
@@ -5526,85 +6010,80 @@ Copyright and Licence
\NewDocumentCommand \ctex_ltj_set_alternate_shape:nnn
{ m m > { \SplitArgument { 1 } { -> } } m }
{ \ctex_ltj_set_alternate_shape:nnnn {#1} {#2} #3 }
-\cs_new_protected_nopar:Npn \ctex_ltj_set_alternate_shape:nnnn #1#2#3#4
+\cs_new_protected:Npn \ctex_ltj_set_alternate_shape:nnnn #1#2#3#4
{
- \ctex_ltj_set_alternate_shape:n
+ \ctex_ltj_set_alternate_shape:e
{
- \IfNoValueTF {#4}
- { \int_eval:n {#3} , \int_eval:n {#3} , }
- {
- \int_eval:n { \tl_if_blank:nTF {#3} { "80 } {#3} } ,
- \int_eval:n { \tl_if_blank:nTF {#4} { "10FFFF } {#4} } ,
- }
- '\lua_escape:e { \CJK@encoding/#2 }' ,
- '\lua_escape:e { \CJK@encoding/#1 }'
+ \@@_range_normalization:nn {#3} {#4}
+ { \CJK@encoding / \exp_not:n {#2} }
+ { \CJK@encoding / \exp_not:n {#1} }
}
}
-\cs_new_protected_nopar:Npn \ctex_ltj_set_alternate_shape:n #1
+\cs_new_protected:Npn \ctex_ltj_set_alternate_shape:n #1
{
- \lua_now:e { luatexja.jfont.set_alt_font_latex ( #1 ) }
- \@@_save_alternate_shape:cnn
+ \ctex_ltj_set_alt_font:nnnn #1
+ \@@_save_alternate_shape:cn
{ \@@_alternate_cs:n { reset / \l_@@_base_CJKfamily_tl } }
- { luatexja.jfont.set_alt_font_latex } {#1}
+ { \ctex_ltj_set_alt_font:nnnn #1 }
}
+\cs_generate_variant:Nn \ctex_ltj_set_alternate_shape:n { e }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\ctex_ltj_set_alternate_shape:nnN}
% 若字符范围预先由 \texttt{declarecharrange} 声明,则可以直接使用。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_set_alternate_shape:nnN #1#2#3
+\cs_new_protected:Npn \ctex_ltj_set_alternate_shape:nnN #1#2#3
{
\tl_map_inline:Nn #3
{
\ctex_ltj_set_alternate_shape:n
{
- ##1 ,
- '\lua_escape:e { \CJK@encoding/#2 }' ,
- '\lua_escape:e { \CJK@encoding/#1 }'
+ ##1
+ { \CJK@encoding/#2 }
+ { \CJK@encoding/#1 }
}
}
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_save_alternate_shape:Nnn}
+% \begin{macro}{\@@_save_alternate_shape:Nn}
% 将实际设置的替换字形保存起来用于清除或恢复。
% 暂时令 \cs{l_@@_base_family_tl} 为 \cs{scan_stop:} 是让它不被展开,使得替换
% 字体的设置可以在 \tn{addCJKfontfeature} 中直接使用。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_save_alternate_shape:Nnn #1#2#3
+\cs_new_protected:Npn \@@_save_alternate_shape:Nn #1#2
{
\group_begin:
- \cs_if_exist:NF #1 { \cs_set_eq:NN #1 \prg_do_nothing: }
- \cs_set_eq:NN \l_@@_base_family_tl \scan_stop:
- \cs_set_eq:NN \lua_escape:e \scan_stop:
- \cs_gset_protected_nopar:Npx #1
- { \exp_not:o {#1} \exp_not:N \lua_now:e { #2 ( #3 ) } }
+ \cs_if_exist:NF #1 { \cs_set_eq:NN #1 \prg_do_nothing: }
+ \cs_set_eq:NN \l_@@_base_family_tl \scan_stop:
+ \cs_gset_protected:Npx #1 { \exp_not:o {#1} #2 }
\group_end:
}
-\cs_generate_variant:Nn \@@_save_alternate_shape:Nnn { c }
+\cs_generate_variant:Nn \@@_save_alternate_shape:Nn { c }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{clearalternatefont,resetalternatefont}
% 清除和重置操作总是全局的。
% \begin{macrocode}
-\keys_define:nn { ctex }
+\ctex_define:n
{
clearalternatefont .code:n =
- { \clist_map_function:xN {#1} \ctex_ltj_clear_alternate_font:n } ,
+ { \clist_map_function:eN {#1} \ctex_ltj_clear_alternate_font:n } ,
resetalternatefont .code:n =
- { \clist_map_function:xN {#1} \ctex_ltj_reset_alternate_font:n } ,
+ { \clist_map_function:eN {#1} \ctex_ltj_reset_alternate_font:n } ,
clearalternatefont .default:n = \l_ctex_ltj_family_tl ,
resetalternatefont .default:n = \l_ctex_ltj_family_tl
}
-\cs_new_protected_nopar:Npn \ctex_ltj_clear_alternate_font:n #1
+\cs_new_protected:Npn \ctex_ltj_clear_alternate_font:n #1
{
\group_begin:
\ctex_ltj_family_if_exist:xNTF {#1} \l_@@_base_family_tl
{
- \cs_if_exist_use:cT { \@@_alternate_cs:n { clear / #1 } }
+ \cs_if_exist_use:cT
+ { \@@_alternate_cs:n { clear / #1 } }
{
\prop_gput:Nno \g_@@_reset_alternate_prop
{#1} { \l_@@_base_family_tl }
@@ -5615,7 +6094,7 @@ Copyright and Licence
{ \@@_family_unknown_warning:n {#1} }
\group_end:
}
-\cs_new_protected_nopar:Npn \ctex_ltj_reset_alternate_font:n #1
+\cs_new_protected:Npn \ctex_ltj_reset_alternate_font:n #1
{
\group_begin:
\prop_gpop:NnNT \g_@@_reset_alternate_prop {#1} \CJK@family
@@ -5627,23 +6106,23 @@ Copyright and Licence
\group_end:
}
\prop_new:N \g_@@_reset_alternate_prop
-\cs_generate_variant:Nn \clist_map_function:nN { x }
+\cs_generate_variant:Nn \clist_map_function:nN { e }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{declarecharrange}
% 预先声明字符范围。
% \begin{macrocode}
-\keys_define:nn { ctex }
+\ctex_define:n
{
- declarecharrange .code:n = \ctex_ltj_declare_char_range:x {#1} ,
+ declarecharrange .code:n = \ctex_ltj_declare_char_range:e {#1} ,
declarecharrange .value_required:n = true
}
-\cs_new_protected_nopar:Npn \ctex_ltj_declare_char_range:n #1
+\cs_new_protected:Npn \ctex_ltj_declare_char_range:n #1
{ \clist_map_inline:nn {#1} { \@@_declare_char_range:nn ##1 } }
-\cs_generate_variant:Nn \ctex_ltj_declare_char_range:n { x }
-\cs_new_protected_nopar:Npn \@@_declare_char_range:nn #1#2
- { \use:x { \ctex_ltj_declare_char_range:nn { \tl_trim_spaces:n {#1} } } {#2} }
+\cs_generate_variant:Nn \ctex_ltj_declare_char_range:n { e }
+\cs_new_protected:Npn \@@_declare_char_range:nn #1
+ { \tl_trim_spaces_apply:nN {#1} \ctex_ltj_declare_char_range:nn }
% \end{macrocode}
% \end{macro}
%
@@ -5651,7 +6130,7 @@ Copyright and Licence
% \begin{variable}{\g_@@_char_range_prop}
% |#1| 是名字,|#2| 是范围。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_declare_char_range:nn #1#2
+\cs_new_protected:Npn \ctex_ltj_declare_char_range:nn #1#2
{
\tl_clear:N \l_@@_char_range_tl
\clist_map_function:nN {#2} \ctex_ltj_save_char_range:n
@@ -5671,25 +6150,32 @@ Copyright and Licence
\NewDocumentCommand \ctex_ltj_save_char_range:n
{ > { \SplitArgument { 1 } { -> } } m }
{ \ctex_ltj_save_char_range:nn #1 }
-\cs_new_protected_nopar:Npn \ctex_ltj_save_char_range:nn #1#2
+\cs_new_protected:Npn \ctex_ltj_save_char_range:nn #1#2
{
\tl_put_right:Nx \l_@@_char_range_tl
- { {
- \IfNoValueTF {#2}
- { \int_eval:n {#1} , \int_eval:n {#1} }
- {
- \int_eval:n { \tl_if_blank:nTF {#1} { "80 } {#1} } ,
- \int_eval:n { \tl_if_blank:nTF {#2} { "10FFFF } {#2} }
- }
- } }
+ { { \@@_range_normalization:nn {#1} {#2} } }
+ }
+\cs_new:Npn \@@_range_normalization:nn #1#2
+ {
+ \tl_if_novalue:nTF {#2}
+ {
+ { \int_eval:n {#1} }
+ { \int_eval:n {#1} }
+ }
+ {
+ { \int_eval:n { \tl_if_blank:nTF {#1} { \c_@@_range_min_int } {#1} } }
+ { \int_eval:n { \tl_if_blank:nTF {#2} { \c_@@_range_max_int } {#2} } }
+ }
}
+\int_const:Nn \c_@@_range_min_int { "80 }
+\int_const:Nn \c_@@_range_max_int { \c_max_char_int }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\ctex_ltj_def_char_range_key:n}
% 在字体设置选项中定义字符范围键。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_def_char_range_key:n #1
+\cs_new_protected:Npn \ctex_ltj_def_char_range_key:n #1
{
\keys_if_exist:nnF { ctex_ltj / fontspec } {#1}
{
@@ -5706,42 +6192,13 @@ Copyright and Licence
\cs_new_protected:Npn \ctex_ltj_char_range_key:nn #1#2
{
\tl_if_blank:nTF {#2}
- { \tl_set:Nn \l_@@_char_range_clist {#1} }
- {
- \clist_if_empty:NT \l_@@_char_range_clist
- {
- \tl_set:Nn \l_@@_tmp_tl { {#1} }
- \@@_char_range_parse_feature:w #2 \q_stop
- }
- }
+ { \clist_set:Nn \l_@@_char_range_clist {#1} }
+ { \@@_push_alternate_prop:nn {#1} { {#1} #2 } }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_char_range_parse_feature:w}
-% 可以使用加方括号的方式,通过文件名来调用字体。这容易与字体选项混淆。例如,需要
-% 将 |[simsun.ttc]| 设置为 \opt{range} 的主字体,就需要使用
-% |range={{[simsun.ttc]}}| 或者 |[]{[simsun.ttc]}|。下面的目的是,支持直接使用
-% |[simsun.ttc]| 和 |[...][simsun.ttc]|。
-% \begin{macrocode}
-\NewDocumentCommand \@@_char_range_parse_feature:w
- { +o o u { \q_stop } }
- {
- \exp_args:NNf \tl_put_right:Nn \l_@@_tmp_tl
- {
- \IfNoValueTF {#1} { {#3} }
- {
- \IfNoValueTF {#2}
- { \tl_if_blank:nTF {#3} { { [#1] } } { [ {#1} ] {#3} } }
- { [ {#1} ] { [#2] } }
- }
- }
- \seq_put_right:No \l_@@_alternate_seq { \l_@@_tmp_tl }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \paragraph{其它设置}
+% \paragraph{其他设置}
%
% 在抄录环境中禁用 \opt{autospacing} 和 \opt{autoxspacing}。然而,\pkg{LuaTeX-ja}
% 还是会使 JAchar 自动折行。没有看到有简单的禁用折行的办法,可能需要设置所有的
@@ -5768,16 +6225,14 @@ Copyright and Licence
{ }
{ \ctex_patch_failure:N \verbatim@font }
}
-\cs_new_protected_nopar:Npn \CTEX@verbatim@font@hook
+\cs_new_protected:Npn \CTEX@verbatim@font@hook
{ \ltjsetparameter { autospacing = false , autoxspacing = false } }
% \end{macrocode}
%
-% \begin{macro}{\@@italiccorr}
+% \begin{macro}{\@@@@italiccorr}
% \LaTeX{} 的倾斜校正也要重新定义。
% \begin{macrocode}
-%<@@=>
-\cs_set_eq:NN \@@italiccorr \/
-%<@@=ctex>
+\cs_set_eq:NN \@@@@italiccorr \/
% \end{macrocode}
% \end{macro}
%
@@ -5787,14 +6242,15 @@ Copyright and Licence
% \tn{ltjsetkanjiskip} 和 \tn{ltjsetxkanjiskip} 是相应的 \tn{ltjsetparameter}
% 的快捷方式,在使用他们时,要注意先使用 \tn{ltj@setpar@global}。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_ltj_set_kanjiskip:N
+\cs_new_protected:Npn \ctex_ltj_set_kanjiskip:N
{ \ltj@setpar@global \ltjsetkanjiskip }
-\cs_new_protected_nopar:Npn \ctex_ltj_set_xkanjiskip:N
+\cs_new_protected:Npn \ctex_ltj_set_xkanjiskip:N
{ \ltj@setpar@global \ltjsetxkanjiskip }
% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
+%<@@=ctex>
%</luatex>
% \end{macrocode}
%
@@ -5807,39 +6263,10 @@ Copyright and Licence
% \changes{v2.4}{2016/02/28}{初步支持 \upLaTeX。}
% \changes{v2.4.15}{2019/04/05}{显式补丁 \upLaTeX 的 \tn{rmfamily} 等字体命令。}
%
-% 按 \pkg{CJK} 的命名习惯模拟部分命令,并设置默认字体。
+% 按 \pkg{CJK} 的命名习惯模拟 \tn{CJKfamily}。
% \begin{macrocode}
-\tl_set:Nn \CJKrmdefault { zhrm }
-\tl_set:Nn \CJKsfdefault { zhsf }
-\tl_set:Nn \CJKttdefault { zhtt }
-\tl_set:Nn \CJKfamilydefault { \CJKrmdefault }
-\tl_set:Nn \kanjifamilydefault { \CJKfamilydefault }
-\RenewDocumentCommand \rmfamily { }
- {
- \not@math@alphabet \rmfamily \mathrm
- \romanfamily \rmdefault
- \kanjifamily \CJKrmdefault
- \selectfont
- }
-\RenewDocumentCommand \sffamily { }
- {
- \not@math@alphabet \sffamily \mathsf
- \romanfamily \sfdefault
- \kanjifamily \CJKsfdefault
- \selectfont
- }
-\RenewDocumentCommand \ttfamily { }
- {
- \not@math@alphabet \ttfamily \mathtt
- \romanfamily \ttdefault
- \kanjifamily \CJKttdefault
- \selectfont
- }
\NewDocumentCommand \CJKfamily { m }
- {
- \kanjifamily {#1}
- \selectfont
- }
+ { \kanjifamily {#1} \selectfont }
% \end{macrocode}
%
% \changes{v2.4.15}{2019/04/05}{将 \upLaTeX 的默认字体由 \texttt{mc} 改为
@@ -5847,24 +6274,14 @@ Copyright and Licence
%
% 将 \upLaTeX 的默认字体由 |mc| 改为 |zhrm|,并启用 \tn{jfam}。
% \begin{macrocode}
-\DeclareErrorKanjiFont{JY2}{zhrm}{m}{n}{10}
-\DeclareKanjiSubstitution{JY2}{zhrm}{m}{n}
-\DeclareKanjiSubstitution{JT2}{zhrm}{m}{n}
+\DeclareErrorKanjiFont {JY2}{zhrm}{m}{n}{10}
+\DeclareKanjiSubstitution {JY2}{zhrm}{m}{n}
+\DeclareKanjiSubstitution {JT2}{zhrm}{m}{n}
\DeclareSymbolFont{mincho}{JY2}{zhrm}{m}{n}
\SetSymbolFont{mincho}{bold}{JY2}{zhrm}{bx}{n}
\jfam \symmincho
% \end{macrocode}
%
-% 在导言区末尾更新 \tn{CJKfamilydefault}。
-% \begin{macrocode}
-\ctex_at_end_preamble:n { \ctex_update_default_family: }
-% \end{macrocode}
-%
-% 使修改立刻生效,保证导言区字体族正确。
-% \begin{macrocode}
-\normalfont
-% \end{macrocode}
-%
% \begin{macro}[int]{\em}
% \changes{v2.4.2}{2016/05/15}{兼容 \upLaTeX{} 2016/05/07u00 的定义。}
% 取消 \upLaTeX{} 对 \tn{em} 使用 |\mcfamily|、|\gtfamily| 命令的重定义,恢复
@@ -5892,19 +6309,20 @@ Copyright and Licence
% 形如 |upzhserif|,不包括表示方向的后缀 |-h| 与 |-v|。粗体字体名为空时不设置该
% 字形。本命令不设置字体映射,需要复用已有的字体映射或另行设置。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_set_upfamily:nnn #1 #2 #3
+\cs_new_protected:Npn \ctex_set_upfamily:nnn #1#2#3
{
\DeclareKanjiFamily{JY2}{#1}{}
\DeclareKanjiFamily{JT2}{#1}{}
\DeclareFontShape{JY2}{#1}{m}{n}{<->~ #2-h}{}
\DeclareFontShape{JT2}{#1}{m}{n}{<->~ #2-v}{}
- \tl_if_empty:nF { #3 }
+ \tl_if_empty:nF {#3}
{
+ \DeclareFontShape{JY2}{#1}{b}{n}{<->~ #3-h}{}
+ \DeclareFontShape{JT2}{#1}{b}{n}{<->~ #3-v}{}
\DeclareFontShape{JY2}{#1}{bx}{n}{<->~ #3-h}{}
\DeclareFontShape{JT2}{#1}{bx}{n}{<->~ #3-v}{}
}
}
-\@onlypreamble \ctex_set_upfamily:nnn
% \end{macrocode}
% \end{macro}
%
@@ -5913,20 +6331,38 @@ Copyright and Licence
% 的后缀 |b| 与表示排版方向的后缀 |-h| 与 |-v|。|#2| 与 |#3| 是普通与粗体的实际
% 字体名。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_set_upmap:nnn #1 #2 #3
+\cs_new_protected:Npn \ctex_set_upmap:nnn #1#2#3
{
\ctex_set_zhmap:n
{
- \special{ pdf:mapline~ #1-h~ UniGB-UTF16-H~ #2 }
- \special{ pdf:mapline~ #1-v~ UniGB-UTF16-V~ #2 }
- \tl_if_empty:nF { #3 }
+ \special { pdf:mapline~#1-h~UniGB-UTF16-H~#2 }
+ \special { pdf:mapline~#1-v~UniGB-UTF16-V~#2 }
+ \tl_if_empty:nF {#3}
{
- \special{ pdf:mapline~ #1b-h~ UniGB-UTF16-H~ #3 }
- \special{ pdf:mapline~ #1b-v~ UniGB-UTF16-V~ #3 }
+ \special { pdf:mapline~#1b-h~UniGB-UTF16-H~#3 }
+ \special { pdf:mapline~#1b-v~UniGB-UTF16-V~#3 }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_set_upmap_unicode:nnn}
+% 设置 \upTeX{} 字体映射,使用 |unicode| CMap。参数同上。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_set_upmap_unicode:nnn #1#2#3
+ {
+ \ctex_set_zhmap:n
+ {
+ \special { pdf:mapline~#1-h~unicode~#2 }
+ \special { pdf:mapline~#1-v~unicode~#2 }
+ \tl_if_empty:nF {#3}
+ {
+ \special { pdf:mapline~#1b-h~unicode~#3 }
+ \special { pdf:mapline~#1b-v~unicode~#3 }
}
}
}
-\@onlypreamble \ctex_set_upmap:nnn
% \end{macrocode}
% \end{macro}
%
@@ -5934,17 +6370,24 @@ Copyright and Licence
% 设置 \upTeX{} 基本字体映射,按 \pkg{zhmetrics-uptex} 的定义,依次设置衬线体
% 正、粗、意大利,无衬线体正、粗,等宽体正——共 6 种字体,并分横排及直排。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_set_upfonts:nnnnnn #1 #2 #3 #4 #5 #6
+\cs_new_protected:Npn \ctex_set_upfonts:nnnnnn #1#2#3#4#5#6
{
- \ctex_set_upmap:nnn { upserif } { #1 } { #2 }
- \ctex_set_upmap:nnn { upserifit } { #3 } {}
- \ctex_set_upmap:nnn { upsans } { #4 } { #5 }
- \ctex_set_upmap:nnn { upmono } { #6 } {}
+ \ctex_set_upmap:nnn { upserif } {#1} {#2}
+ \ctex_set_upmap:nnn { upserifit } {#3} {}
+ \ctex_set_upmap:nnn { upsans } {#4} {#5}
+ \ctex_set_upmap:nnn { upmono } {#6} {}
}
-\@onlypreamble \ctex_set_upfonts:nnnnnn
% \end{macrocode}
% \end{macro}
%
+% 以下命令只能在导言区使用。
+% \begin{macrocode}
+\@onlypreamble \ctex_set_upfamily:nnn
+\@onlypreamble \ctex_set_upmap:nnn
+\@onlypreamble \ctex_set_upmap_unicode:nnn
+\@onlypreamble \ctex_set_upfonts:nnnnnn
+% \end{macrocode}
+%
% \changes{v2.4.7}{2016/12/27}{依赖 \pkg{pxeverysel} 宏包。}
%
% \pkg{everysel} 宏包(2011/10/28)未考虑 \upLaTeX{} 对 \tn{selectfont} 的修
@@ -5957,7 +6400,101 @@ Copyright and Licence
%</uptex|aptex>
% \end{macrocode}
%
-% \subsubsection{调整 \tn{CJKfamilydefault}}
+% \subsubsection{修改主要字体命令}
+%
+% \changes{v2.5.2}{2020/05/06}{兼容 \LaTeX\ 2020-02-02 之前的版本。}
+% \changes{v2.5.4}{2020/06/07}{修正主要字体命令补丁。}
+%
+% 修改 \tn{rmfamily} 等主要字体命令,使得中文字体能随西文主要字体更新。
+% \LaTeX\ 2020-02-02 以后的版本可以直接使用 \tn{@rmfamilyhook} 等钩子。
+% 我们暂时需要处理旧内核的情况,以保持兼容性。
+%
+% \pkg{xeCJK} 和 \pkg{zhmCJK} 已经有相同的工作,本段代码不需要对他们使用。
+% \begin{macrocode}
+%<*pdftex|luatex|uptex|aptex>
+%<pdftex>\reverse_if:N \if_bool:N \g_@@_zhmCJK_bool
+% \end{macrocode}
+%
+% \changes{v2.5.5}{2020/10/17}{进一步应用 \LaTeX\ 2020/10/01 的新钩子。}
+%
+% \begin{macro}[int]{\ctex_provide_font_hook:NNN,\CTEX@rmfamilyhook}
+% 给 \tn{rmfamily} 等字体命令加钩子,钩子名字统一为 \tn{CTEX@rmfamilyhook} 等。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_provide_font_hook:NNN #1#2
+ {
+ \exp_args:Nc \@@_provide_font_hook_aux:NNNN
+ { CTEX \cs_to_str:N #2 } #1#2
+ }
+\cs_if_exist:NTF \ctex_gadd_ltxhook:nn
+ {
+ \cs_new_protected:Npn \@@_provide_font_hook_aux:NNNN #1#2#3#4
+ {
+ \tl_new:N #1
+ \exp_args:Nx \ctex_gadd_ltxhook:nn { \cs_to_str:N #2 } {#1}
+ }
+ }
+ {
+ \cs_new_protected:Npn \@@_provide_font_hook_aux:NNNN #1#2#3#4
+ {
+ \tl_new:N #1
+ \cs_if_exist:NTF #3
+ { \tl_gput_right:Nn #3 {#1} }
+% \end{macrocode}
+% 注意此处不能用 \cs{ctex_patch_cmd:Nnn} 来打补丁,因其会关闭 \LaTeXiii 语法,
+% 但 \pkg{fontspec} 会在 \tn{rmfamily} 的命令中相应加入
+% \cs{l__fontspec_rmfamily_encoding_tl} 等,导致补丁失败。
+% \begin{macrocode}
+ { \ctex_parse_name:NN \tl_replace_once:Nnn #2 {#4} { #1#4 } }
+ }
+ }
+\ctex_provide_font_hook:NNN \rmfamily \@rmfamilyhook \selectfont
+\ctex_provide_font_hook:NNN \sffamily \@sffamilyhook \selectfont
+\ctex_provide_font_hook:NNN \ttfamily \@ttfamilyhook \selectfont
+%<pdftex|luatex>\ctex_provide_font_hook:NNN \normalfont \@defaultfamilyhook \usefont
+% \end{macrocode}
+% \end{macro}
+%
+% 按 \pkg{CJK} 的命名习惯模拟部分命令,并设置默认字体。
+% \begin{macrocode}
+\tl_if_exist:NF \CJKfamilydefault
+ { \tl_const:Nn \CJKfamilydefault { \CJKrmdefault } }
+%<*pdftex|luatex>
+\tl_if_exist:NF \CJKrmdefault { \tl_const:Nn \CJKrmdefault { rm } }
+\tl_if_exist:NF \CJKsfdefault { \tl_const:Nn \CJKsfdefault { sf } }
+\tl_if_exist:NF \CJKttdefault { \tl_const:Nn \CJKttdefault { tt } }
+\tl_gput_right:Nn \CTEX@rmfamilyhook { \CJKfamily { \CJKrmdefault } }
+\tl_gput_right:Nn \CTEX@sffamilyhook { \CJKfamily { \CJKsfdefault } }
+\tl_gput_right:Nn \CTEX@ttfamilyhook { \CJKfamily { \CJKttdefault } }
+\tl_gput_right:Nn \CTEX@defaultfamilyhook { \CJKfamily { \CJKfamilydefault } }
+%</pdftex|luatex>
+% \end{macrocode}
+% \upLaTeX 不需要补丁 \tn{normalfont},只需要修改 \tn{kanjifamilydefault}。
+% \begin{macrocode}
+%<*uptex|aptex>
+\tl_if_exist:NF \CJKrmdefault { \tl_const:Nn \CJKrmdefault { zhrm } }
+\tl_if_exist:NF \CJKsfdefault { \tl_const:Nn \CJKsfdefault { zhsf } }
+\tl_if_exist:NF \CJKttdefault { \tl_const:Nn \CJKttdefault { zhtt } }
+\tl_gput_right:Nn \CTEX@rmfamilyhook { \kanjifamily { \CJKrmdefault } }
+\tl_gput_right:Nn \CTEX@sffamilyhook { \kanjifamily { \CJKsfdefault } }
+\tl_gput_right:Nn \CTEX@ttfamilyhook { \kanjifamily { \CJKttdefault } }
+\tl_gset:Nn \kanjifamilydefault { \CJKfamilydefault }
+%</uptex|aptex>
+% \end{macrocode}
+%
+% \pkg{zhmCJK} 判断结束。
+% \begin{macrocode}
+%<pdftex>\fi:
+% \end{macrocode}
+%
+% 使修改立刻生效,保证导言区字体族正确。
+% \begin{macrocode}
+\normalfont
+% \end{macrocode}
+%
+% 在导言区末尾更新 \tn{CJKfamilydefault},\pdfTeX 已经在之前使用过此处代码。
+% \begin{macrocode}
+%<!pdftex>\ctex_at_end_preamble:n { \ctex_update_default_family: }
+% \end{macrocode}
%
% \changes{v2.4}{2016/02/15}{正确更新 \pkg{CJK} 包的 \tn{CJKfamilydefault}。}
% \changes{v2.4.1}{2016/04/26}{正确更新 \upLaTeX{} 的 \tn{CJKfamilydefault}。}
@@ -5966,8 +6503,7 @@ Copyright and Licence
% 在导言区结束,如果 \tn{CJKfamilydefault} 没有被更改,则在此时根据西文字体的情况
% 更新 \tn{CJKfamilydefault}。\pkg{xeCJK} 已经有这个功能,不需要再调整。
% \begin{macrocode}
-%<*pdftex|luatex|uptex|aptex>
-\cs_new_protected_nopar:Npn \ctex_update_default_family:
+\cs_new_protected:Npn \ctex_update_default_family:
{
\tl_if_eq:NNT \CJKfamilydefault \l_@@_family_default_init_tl
{
@@ -5990,9 +6526,7 @@ Copyright and Licence
% 确认它的存在性。使用 \pkg{CJK} 宏包或 \upLaTeX{}
% 时,\texttt{C19rm}、\texttt{JY2rm} 等总是有定义的,不需要确认。
% \begin{macrocode}
-%<*luatex>
- \ctex_ltj_ensure_default_family:
-%</luatex>
+%<luatex> \ctex_ltj_ensure_default_family:
}
% \end{macrocode}
% \end{macro}
@@ -6008,94 +6542,16 @@ Copyright and Licence
{ \exp_not:o { \CJKfamilydefault } }
}
\tl_gset_eq:NN \CJKfamilydefault \l_@@_family_default_init_tl
-%</pdftex|luatex|uptex|aptex>
% \end{macrocode}
% \end{variable}
%
-% \subsubsection{操作系统的判断}
-%
-% \changes{v2.0}{2014/04/16}{自动检测操作系统,载入对应的字体配置。}
-%
-% \begin{macro}[int]{\ctex_detected_platform:}
-% 在 \LuaTeX{} 下直接用调用 |os.name| 来判断。
% \begin{macrocode}
-%<*luatex>
-\cs_new_protected_nopar:Npn \ctex_detected_platform:
- {
- \tl_gset:Nx \g_@@_fontset_tl
- {
- \lua_now:e
- {
- if ~ os.name == 'windows' then ~
- tex.sprint ( 'windows' )
- elseif ~ os.name == 'macosx' then ~
- tex.sprint ( 'mac' )
- else ~
- tex.sprint ( 'fandol' )
- end
- }
- }
- }
-%</luatex>
-% \end{macrocode}
-%
-% \ApTeX{} 可以使用 \tn{ngostype} 来判断。
-% \begin{macrocode}
-%<*aptex>
-\cs_new_protected_nopar:Npn \ctex_detected_platform:
- {
- \tl_gset:Nx \g_@@_fontset_tl
- {
- \str_case:onF { \ngostype }
- {
- { Win32 } { windows }
- { Win64 } { windows }
- { Darwin } { mac }
- }
- { fandol }
- }
- }
-%</aptex>
-% \end{macrocode}
-%
-% \pdfTeX{} 和 \XeTeX{} 下则依据 \file{/dev/null} 和 \file{nul:} 的存在性以及
-% 文件系统的大小写敏感性来判断。Mac~OS~X 的大小写敏感性在安装时是可选的。为了
-% 保险起见,这里的判断很繁琐,最多要进行 4 次文件操作!
-% \begin{macrocode}
-%<*xetex|pdftex|uptex>
-\cs_new_protected_nopar:Npn \ctex_detected_platform:
- {
- \file_if_exist:nTF { /dev/null }
- {
- \file_if_exist:nTF { nul: }
- {
- \file_if_exist:nTF { \c_@@_upper_case_file_str }
- { \ctex_if_macosx:TF { mac } { windows } }
- { \ctex_if_macosx:TF { mac } { fandol } }
- }
- { \ctex_if_macosx:TF { mac } { fandol } }
- }
- { \tl_gset:Nn \g_@@_fontset_tl { windows } }
- }
-\str_const:Nx \c_@@_upper_case_file_str
- { \exp_args:No \str_upper_case:n { \g_file_curr_name_str } }
+%</pdftex|luatex|uptex|aptex>
% \end{macrocode}
-% \end{macro}
%
-% \begin{macro}[int]{\ctex_if_macosx:TF}
-% \changes{v2.1}{2015/06/17}{改用 \file{/Library/Fonts/Songti.ttc} 为特征文件。}
-% 以 \file{/Library/Fonts/Songti.ttc} 为特征文件判断 Mac~OS~X。
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_if_macosx:TF #1#2
- {
- \file_if_exist:nTF { \c_@@_macosx_file_str }
- { \tl_gset:Nn \g_@@_fontset_tl {#1} }
- { \tl_gset:Nn \g_@@_fontset_tl {#2} }
- }
-\str_const:Nn \c_@@_macosx_file_str { /Library/Fonts/Songti.ttc }
-%</xetex|pdftex|uptex>
-% \end{macrocode}
-% \end{macro}
+% \changes{v2.0}{2014/04/16}{自动检测操作系统,载入对应的字体配置。}
+% \changes{v2.5}{2019/10/25}{操作系统检测移动至载入中文字库处,且不再需要
+% 依赖特定引擎。}
%
% \subsubsection{\pkg{hyperref} 兼容性处理}
%
@@ -6113,11 +6569,11 @@ Copyright and Licence
%<*class|ctex>
\@ifpackageloaded { hyperref }
{
- \cs_new_protected_nopar:Npn \ctex_hypersetup:n #1
+ \cs_new_protected:Npn \ctex_hypersetup:n #1
{ \hypersetup {#1} }
}
{
- \cs_new_protected_nopar:Npn \ctex_hypersetup:n #1
+ \cs_new_protected:Npn \ctex_hypersetup:n #1
{ \PassOptionsToPackage {#1} { hyperref } }
}
%</class|ctex>
@@ -6125,14 +6581,14 @@ Copyright and Licence
% \end{macro}
%
% 在 \pdfTeX{} 下使用 \texttt{GBK} 编码,\dvipdfmx{} 驱动可以直接用它的
-% \tn{special} 命令,其它模式用 \pkg{xCJK2uni} 宏包处理。使用 \texttt{UTF-8} 编
+% \tn{special} 命令,其他模式用 \pkg{xCJK2uni} 宏包处理。使用 \texttt{UTF-8} 编
% 码时,\pkg{CJKutf8} 已经处理了书签问题,但仍需要设置 \opt{pdfencoding} 为
% \opt{unicode},目的是在书签的开头写入 BOM (|\376\377|),提示这是
% \texttt{UTF-16BE} 字节流。
% \begin{macrocode}
%<*pdftex>
\ctex_hypersetup:n { driverfallback = dvipdfmx }
-\str_if_eq:onTF { \l_@@_encoding_tl } { GBK }
+\str_if_eq:onTF { \g_@@_encoding_tl } { GBK }
{
\ctex_hypersetup:n { CJKbookmarks = true }
\sys_if_output_pdf:TF
@@ -6152,47 +6608,7 @@ Copyright and Licence
{ \ctex_hypersetup:n { pdfencoding = unicode } }
%</pdftex>
% \end{macrocode}
-% 在 \XeTeX{} 下,\pkg{hyperref} 在处理带有非 ASCII 字符和 |\%| 的书签时有问题^^A
-% \footnote{\url{https://github.com/CTeX-org/ctex-kit/issues/39}}。
-% 事实上,\pkg{hyperref} 在驱动文件 \file{hxetex.def} 中设置了
-% \tn{Hy@unicodetrue},从而书签总是会被 \tn{HyPsd@ConvertToUnicode} 转化成
-% \texttt{UTF-16BE} 编码的形式(抄录自 \tn{pdfstringdef}的定义):
-% \begin{verbatim}
-% \ifHy@unicode
-% \HyPsd@ConvertToUnicode#1%
-% \ifx\HyPsd@pdfencoding\HyPsd@pdfencoding@auto
-% \ltx@IfUndefined{StringEncodingConvertTest}{%
-% }{%
-% \EdefUnescapeString\HyPsd@temp#1%
-% \ifxetex
-% \let\HyPsd@UnescapedString\HyPsd@temp
-% \StringEncodingConvertTest\HyPsd@temp\HyPsd@temp
-% {utf16be}{ascii-print}{%
-% \EdefEscapeString\HyPsd@temp\HyPsd@temp
-% \global\let#1\HyPsd@temp
-% \HyPsd@EscapeTeX#1%
-% \Hy@unicodefalse
-% }{%
-% \HyPsd@ToBigChars#1%
-% }%
-% \end{verbatim}
-% 通过宏包选项 \opt{pdfencoding=unicode} 设置 \tn{HyPsd@pdfencoding} 为
-% \opt{unicode},可以避免随后再将书签从 \texttt{UTF-16BE} 字节流转化回正常
-% 字符(其中使用的 \tn{HyPsd@ToBigChars} 没有考虑书签中含有 |\%| 的情况)。
-% Heiko Oberdiek 在 \file{README} 中说明了将书签转化回正常字符的意图:避免
-% XDVIPDFMX 的警告^^A
-% \footnote{\url{http://project.ktug.org/dvipdfmx/mailman/dvipdfmx/2009-December/000153.html}}:
-% \begin{verbatim}
-% ** WARNING ** Failed to convert input string to UTF16...
-% \end{verbatim}
-% \XeTeX{} 的维护者 Khaled Hosny 已经注意到了这个问题^^A
-% \footnote{\url{http://tug.org/pipermail/tex-live/2013-December/034613.html}}。
-% 需要注意的是,\file{hxetex.def} 重载了宏包选项 \opt{unicode},目的是不能设置
-% 它为 \opt{false},但也导致它不会改变 \tn{HyPsd@pdfencoding}。如果
-% \pkg{hyperref} 先于 \CTeX{} 被载入,那么 \opt{unicode} 选项是没有意义的。
-% 因此要通过意义相同但在 \XeTeX{} 下更保险的 \opt{pdfencoding} 选项来设置。
-% 为了与 \XeTeX 下的行为一致(使用 \tn{HyPsd@LoadUnicode} 载入 \file{puenc.def}),
-% 在 \LuaTeX{} 下也启用这个选项。
+% \XeTeX 和 \LuaTeX 统一设置 \opt{pdfencoding} 为 \opt{unicode}。
% \begin{macrocode}
%<*xetex|luatex>
\ctex_hypersetup:n { pdfencoding = unicode }
@@ -6205,7 +6621,7 @@ Copyright and Licence
%<*uptex|aptex>
\ctex_hypersetup:n { driverfallback = dvipdfmx }
\ctex_at_end_package:nn { hyperref }
- { \AtBeginShipoutFirst { \special { pdf:tounicode~ UTF8-UTF16 } } }
+ { \AtBeginShipoutFirst { \special { pdf:tounicode~UTF8-UTF16 } } }
%</uptex|aptex>
% \end{macrocode}
%
@@ -6215,83 +6631,46 @@ Copyright and Licence
%
% \subsubsection{\pkg{CJKfntef}、\pkg{xeCJKfntef} 相关设置}
%
-% \CTeX{} 宏集对 \pdfTeX{} 与 \XeTeX{} 引擎,分别载入 \pkg{CJKfntef} 或
-% \pkg{xeCJKfntef} 宏包,并关闭宏包默认的彩色等多余格式。
-%
% \changes{v2.0}{2015/03/25}{默认关闭 \pkg{CJKfntef} 或 \pkg{xeCJKfntef} 的彩
% 色设置。}
-% \changes{v2.0}{2015/03/25}{\tn{CTEXunderdot}, \tn{CTEXunderline},
-% \tn{CTEXunderdblline}, \tn{CTEXunderwave}, \tn{CTEXsout}, \tn{CTEXxout} 是过
+% \changes{v2.0}{2015/03/25}{\tn{CTEXunderdot}、\tn{CTEXunderline}、
+% \tn{CTEXunderdblline}、\tn{CTEXunderwave}、\tn{CTEXsout}、\tn{CTEXxout} 是过
% 时命令;\env{CTEXfilltwosides} 是过时环境。}
+% \changes{v2.5}{2019/11/10}{不再自动载入 \pkg{CJKfntef} 或 \pkg{xeCJKfntef} 宏包。}
+% \changes{v2.5}{2019/11/10}{移除 \tn{CTEXunderdot}、\tn{CTEXunderline}、
+% \tn{CTEXunderdblline}、\tn{CTEXunderwave}、\tn{CTEXsout}、\tn{CTEXxout}、
+% \env{CTEXfilltwosides} 等命令和环境。}
%
-% 载入 \pkg{CJKfntef} 或 \pkg{xeCJKfntef} 并做适当格式设置。有关 |\CTEX| 开头
-% 的宏定义是过时命令,仅做兼容性保留。
+% 对 \pdfTeX{} 与 \XeTeX{} 引擎,分别在 \pkg{CJKfntef}、\pkg{xeCJKfntef} 宏包
+% 的末尾关闭彩色显式等多余格式。
%
% \begin{macrocode}
%<*pdftex>
-\RequirePackage { CJKfntef }
-\normalem
-\cs_new_protected_nopar:Npn \@@_clear_fntef_color:n #1
- { \tl_clear:c { CJK#1color } }
-%</pdftex>
-%<*xetex>
-\RequirePackage { xeCJKfntef }
-\@ifpackagelater { xeCJKfntef } { 2014/11/04 }
+\ctex_at_end_package:nn { CJKfntef }
{
- \cs_new_protected_nopar:Npn \@@_clear_fntef_color:n #1
- { \xeCJKsetup { #1 / format = { } } }
- }
- {
- \cs_new_protected_nopar:Npn \@@_clear_fntef_color:n #1
+ \normalem
+ \cs_new_protected:Npn \@@_clear_fntef_color:n #1
{ \tl_clear:c { CJK#1color } }
- }
-%</xetex>
-%<*luatex|uptex|aptex>
-\msg_new:nnn { ctex } { fntef-not-available }
-%<luatex> { Functions~ of~ `CJKfntef'~ is~ not~ available~ in~ LuaLaTeX. }
-%<uptex> { Functions~ of~ `CJKfntef'~ is~ not~ available~ in~ upLaTeX. }
-%<aptex> { Functions~ of~ `CJKfntef'~ is~ not~ available~ in~ ApLaTeX. }
-\msg_warning:nn { ctex } { fntef-not-available }
-%</luatex|uptex|aptex>
-\clist_map_inline:nn
- { underdot , underline , underdblline , underwave , sout , xout }
-%<*pdftex|xetex>
+%</pdftex>
+%<*xetex>
+\ctex_at_end_package:nn { xeCJKfntef }
{
- \@@_clear_fntef_color:n {#1}
- \cs_new_protected_nopar:cpx { CTEX#1 }
+ \@ifpackagelater { xeCJKfntef } { 2014/11/04 }
{
- \msg_warning:nnnn { ctex } { deprecated-command } { \exp_not:c { CTEX#1 } }
- { You~ can~ use~ the~ command~ with~ prefix~ \exp_not:N \CJK~ instead. }
- \exp_not:c { CJK#1 }
+ \cs_new_protected:Npn \@@_clear_fntef_color:n #1
+ { \xeCJKsetup { #1 / format = { } } }
}
+ {
+ \cs_new_protected:Npn \@@_clear_fntef_color:n #1
+ { \tl_clear:c { CJK#1color } }
+ }
+%</xetex>
+%<*pdftex|xetex>
+ \clist_map_inline:nn
+ { underdot , underline , underdblline , underwave , sout , xout }
+ { \@@_clear_fntef_color:n {#1} }
}
-\cs_new_protected_nopar:Npn { \CTEXfilltwosides }
- {
- \msg_warning:nnnn { ctex } { deprecated-environment } { CTEXfilltwosides }
- { You~ can~ use~ `CJKfilltwosides'~ environment~ instead. }
- \CJKfilltwosides
- }
-\cs_new_protected_nopar:Npn { \endCTEXfilltwosides } { \endCJKfilltwosides }
%</pdftex|xetex>
-%<*luatex|uptex|aptex>
- { \cs_new_eq:cN { CTEX#1 } \use:n }
-\cs_new_eq:NN \CTEXfilltwosides \use_none:n
-\cs_new_eq:NN \endCTEXfilltwosides \prg_do_nothing:
-%</luatex|uptex|aptex>
-%<*pdftex>
-\clist_map_inline:nn
- {
- underdotbasesep , underdotsep , underlinebasesep ,
- underlinesep , underdbllinesep , underdbllinebasesep ,
- underwavebasesep , underwavesep , southeight ,
- underdotcolor , underwavecolor , underlinecolor ,
- underdbllinecolor , soutcolor , xoutcolor
- }
- {
- \cs_new_eq:cc { CTEX#1 } { CJK#1 }
- \cs_set_nopar:cpx { CJK#1 } { \exp_not:c { CTEX#1 } }
- }
-%</pdftex>
% \end{macrocode}
%
% \subsubsection{\tn{ccwd} 的更新}
@@ -6299,7 +6678,7 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_update_ccwd:,\ccwd}
% \changes{v2.4.1}{2016/04/29}{正确设置 \upTeX{} 下的 \tn{ccwd}。}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_update_ccwd:
+\cs_new_protected:Npn \ctex_update_ccwd:
%<*pdftex|xetex>
{
\hbox_set:Nn \l_@@_tmp_box { \CJKglue }
@@ -6319,10 +6698,10 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_update_ccglue:}
% 更新字间距。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_update_ccglue:
+\cs_new_protected:Npn \ctex_update_ccglue:
%<*pdftex|xetex>
{
- \cs_set_protected_nopar:Npn \CJKglue
+ \cs_set_protected:Npn \CJKglue
{ \skip_horizontal:N \l_@@_ccglue_skip }
}
%</pdftex|xetex>
@@ -6354,13 +6733,7 @@ Copyright and Licence
{ \prg_return_false: } { \prg_return_true: }
%</uptex|aptex>
}
-% \end{macrocode}
-% 注意下面的标记不能用 \verb"%<pdftex|xetex>",它会导致旧版本的 \pkg{l3docstrip}
-% 不能替换 \texttt{@@}。
-% \begin{macrocode}
-%<*pdftex|xetex>
-\ctex_at_end:n { \cs_new_eq:NN \@@_ccglue: \CJKglue }
-%</pdftex|xetex>
+%<pdftex|xetex>\ctex_at_end:n { \cs_new_eq:NN \@@_ccglue: \CJKglue }
% \end{macrocode}
% \end{macro}
%
@@ -6374,27 +6747,29 @@ Copyright and Licence
% 意义。在 \LuaTeX{} 下,\pkg{LuaTeX-ja} 总是按照 JFM 中的设置输出汉字的宽度,可以
% 直接用 \tn{zw} 作为汉字宽度。\upTeX{} 可以直接使用原生的长度单位 |zw|。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_update_em_unit:
+\cs_new_protected:Npn \ctex_update_em_unit:
%<pdftex|xetex> { \dim_set:Nn \ccwd { \f@size \p@ } }
%<luatex> { \dim_set:Nn \ccwd { \zw } }
%<uptex|aptex> { \dim_set:Nn \ccwd { 1zw } }
% \end{macrocode}
% \end{macro}
%
-% \subsubsection{其它}
+% \subsubsection{其他}
%
+% \begin{macro}[int]{\ctex_add_to_selectfont:n,\CTEX@selectfont@hook}
% \changes{v2.4.13}{2018/03/23}{修正导言区 \tn{selectfont} 钩子位置。}
+% \changes{v2.5}{2020/04/19}{兼容 \pkg{KOMA-Script} 的 \tn{selectfont} 补丁。}
%
-% \begin{macro}[int]{\ctex_add_to_selectfont:n,\CTEX@selectfont@hook}
% \tn{EverySelectfont} 直到文档开始时才有效。为了 \tn{ccwd} 和 \pkg{LuaTeX-ja} 的
% 字体设置在导言区也可用,我们还需要在这里手工修改 \tn{selectfont}。\pkg{everysel}
% 宏包会用 \tn{CheckCommand} 来检查 \tn{selectfont} 是否为标准定义。我们修改了
% \tn{selectfont},所以会给出一个警告。为了消除这个警告,在它检查之前,还原本来
% 定义。\pkg{pxeverysel} 宏包取消了检查,但也需要恢复定义,避免重复使用钩子。
+% \pkg{KOMA-Script} 宏包也会进行检查,我们需要小心处理。
% \begin{macrocode}
\cs_new_protected:Npn \ctex_add_to_selectfont:n #1
{
- \cs_set_protected_nopar:Npx \CTEX@selectfont@hook
+ \cs_set_protected:Npx \CTEX@selectfont@hook
{ \exp_not:o { \CTEX@selectfont@hook #1 } }
}
\cs_new_eq:NN \CTEX@selectfont@hook \prg_do_nothing:
@@ -6404,10 +6779,32 @@ Copyright and Licence
{
\tl_set:Nn \l_@@_tmp_tl {#1}
\cs_new_eq:NN \CTEX@selectfont@save #1
- \cs_new_protected_nopar:Npn \@@_restore_selectfont:
+ \cs_new_protected:Npn \@@_restore_selectfont:
{
+ \cs_if_free:NF \scr@new@selectfont
+ {
+% \end{macrocode}
+% \pkg{CJK} 直接修改 \tn{selectfont} 和 \pkg{pxeverysel} 的补丁,
+% 会使 \pkg{KOMA-Script} 的 \tn{par@update} 失效。
+% \begin{macrocode}
+%<*pdftex|uptex|aptex>
+ \cs_if_free:NF \par@update
+%<*uptex|aptex>
+ {
+ \tl_put_right:Nn \@EverySelectfont@Init
+ { \tl_put_right:Nn #1 { \par@update } }
+ }
+%</uptex|aptex>
+%<*pdftex>
+ { \tl_put_right:Nn #1 { \par@update } }
+ \cs_set_eq:NN \scr@selectfont \CTEX@selectfont@save
+%</pdftex>
+%</pdftex|uptex|aptex>
+ \cs_set_eq:NN \scr@new@selectfont #1
+%<!pdftex> \cs_set_eq:NN \CTEX@selectfont@save \scr@selectfont
+ }
\tl_put_left:Nn \@EverySelectfont@Init
- { \let #1 \CTEX@selectfont@save }
+ { \cs_set_eq:NN #1 \CTEX@selectfont@save }
\cs_undefine:N \@@_restore_selectfont:
}
}
@@ -6458,7 +6855,7 @@ Copyright and Licence
% 全段。
% \begin{macrocode}
%<*luatex|uptex|aptex>
-\cs_new_protected_nopar:Npn \ctex_update_xkanjiskip:
+\cs_new_protected:Npn \ctex_update_xkanjiskip:
{
\skip_if_eq:nnT
%<luatex> { \ltjgetparameter { xkanjiskip } } { \l_@@_xkanjiskip_skip }
@@ -6488,35 +6885,34 @@ Copyright and Licence
%
% \changes{v2.4.10}{2017/07/23}{定义 \tn{cht},\tn{cdp} 和 \tn{cwd}。}
%
-% \begin{macro}[int]{\cht,\cdp,\cwd}
+% \begin{macro}[int]{\cht,\cdp,\cwd,\ctex_update_kanjisize:}
% 分别从 \file{.jfm} 中读取字符高度、深度和宽度,目前仅考虑横排的情况。
% \begin{macrocode}
%<*luatex>
\dim_new:N \cht
\dim_new:N \cdp
\dim_new:N \cwd
-\newluafunction \g_@@_kanjisize_func
\group_begin:
\char_set_catcode_space:n { 32 }
\lua_now:e
{
local nulltable = { }
- local t = lua.get_functions_table()
local fmt = luatexja.jfont.font_metric_table
local getattribute = tex.getattribute
local setdimen = tex.setdimen
- t[\int_use:N \g_@@_kanjisize_func] = function ()
- local ft = fmt[getattribute('ltj@curjfnt')] or nulltable
+ local func = lua.get_functions_table()
+ local id = luatexbase.new_luafunction("ctex")
+ func[id] = function ()
+ local ft = fmt[getattribute("ltj@curjfnt")] or nulltable
local ft = ft and ft.char_type or nulltable
local fk = ft and ft[0] or nulltable
- setdimen('cht', fk.height or 0)
- setdimen('cdp', fk.depth or 0)
- setdimen('cwd', fk.width or ft.zw or 0)
+ setdimen("cht", fk.height or 0)
+ setdimen("cdp", fk.depth or 0)
+ setdimen("cwd", fk.width or ft.zw or 0)
end
+ token.set_lua("ctex_update_kanjisize:", id, "global", "protected")
}
\group_end:
-\cs_new_protected_nopar:Npn \ctex_update_kanjisize:
- { \tex_luafunction:D \g_@@_kanjisize_func }
\ctex_add_to_selectfont:n { \ctex_update_kanjisize: }
%</luatex>
% \end{macrocode}
@@ -6527,7 +6923,7 @@ Copyright and Licence
% \pdfTeX{} 和 \XeTeX{} 下初始设置为 \opt{auto},\LuaTeX{}、\upTeX{} 下是无效
% 选项。
% \begin{macrocode}
-\keys_define:nn { ctex }
+\ctex_define:n
{
%<*pdftex|xetex>
space .choice: ,
@@ -6555,11 +6951,11 @@ Copyright and Licence
% 在导言区或正文中设置标点符号输出格式。\pkg{LuaTeX-ja} 设置的是字体的默认 \texttt{JFM},
% 只会影响到之后设置的字体。\upTeX{} 暂时无效。
% \begin{macrocode}
-\keys_define:nn { ctex }
+\ctex_define:n
{
punct .code:n =
{
- \tl_set:Nx \l_@@_punct_tl { #1 }
+ \tl_set:Nx \l_@@_punct_tl {#1}
%<pdftex> \punctstyle { \l_@@_punct_tl }
%<xetex> \xeCJKsetup { PunctStyle = \l_@@_punct_tl }
%<luatex> \ctex_mono_jfm:o { \l_@@_punct_tl }
@@ -6570,13 +6966,6 @@ Copyright and Licence
% \end{macrocode}
% \end{macro}
%
-% \XeLaTeX{}、\LuaLaTeX{} 和 \upLaTeX{} 总是使用 \texttt{UTF8} 编码。
-% \begin{macrocode}
-%<*xetex|luatex|uptex|aptex>
-\tl_set:Nn \l_@@_encoding_tl { UTF8 }
-%</xetex|luatex|uptex|aptex>
-% \end{macrocode}
-%
% \begin{macrocode}
%</pdftex|xetex|luatex|uptex|aptex>
% \end{macrocode}
@@ -6597,27 +6986,35 @@ Copyright and Licence
% \begin{macro}{\ctexset}
% \begin{macrocode}
%<*class|ctex|ctexheading>
-\NewDocumentCommand \ctexset { } { \keys_set:nn { ctex } }
+\NewDocumentCommand \ctexset { } { \ctex_set:n }
%</class|ctex|ctexheading>
% \end{macrocode}
% \end{macro}
%
% \changes{v2.0}{2015/03/21}{\tn{CTEXsetup}, \tn{CTEXoptions} 是过时命令。}
% \begin{macro}{\CTEXsetup,\CTEXoptions}
-% 过时命令。出于历史原因,\tn{CTEXoptions} 需要在 \pkg{pxeverysel} 宏包之后定义。
+% 过时命令。
% \begin{macrocode}
%<*class|ctex>
-\NewDocumentCommand \CTEXsetup { +o > { \TrimSpaces } m }
+\NewDocumentCommand \CTEXsetup { +O { } > { \TrimSpaces } m }
{
- \msg_warning:nnnn { ctex } { deprecated-command } { \CTEXsetup }
- { \ctexset~ {~ #2~ =~ {~ #1~ }~ }~ is~ set. }
- \IfNoValueF {#1} { \keys_set:nn { ctex / #2 } {#1} }
+ \tl_if_blank:nTF {#1}
+ { \ctex_deprecated_command:Nn \CTEXsetup { } }
+ {
+ \ctex_deprecated_command:Nn \CTEXsetup
+ { \ctexset {~#2~=~{~#1~}~}~is~set. }
+ \ctex_set:nn {#2} {#1}
+ }
}
-\NewDocumentCommand \CTEXoptions { +o }
+\NewDocumentCommand \CTEXoptions { +O { } }
{
- \msg_warning:nnnn { ctex } { deprecated-command } { \CTEXoptions }
- { \ctexset~ {~ #1~ }~ is~ set. }
- \IfNoValueF {#1} { \keys_set:nn { ctex } {#1} }
+ \tl_if_blank:nTF {#1}
+ { \ctex_deprecated_command:Nn \CTEXoptions { } }
+ {
+ \ctex_deprecated_command:Nn \CTEXoptions
+ { \ctexset {~#1~}~is~set. }
+ \ctex_set:n {#1}
+ }
}
% \end{macrocode}
% \end{macro}
@@ -6627,7 +7024,7 @@ Copyright and Licence
% \begin{macro}{autoindent}
% \opt{autoindent} 也是可以用在正文中的选项,意义与宏包选项 |option/autoindent| 相同。
% \begin{macrocode}
-\keys_define:nn { ctex }
+\ctex_define:n
{
autoindent .choice: ,
autoindent .default:n = { true } ,
@@ -6651,7 +7048,7 @@ Copyright and Licence
% 无论字体大小是否变化都更新相关信息。
% \begin{macrocode}
\NewDocumentCommand \CTEXsetfont { } { \ctex_select_size: }
-\cs_new_protected_nopar:Npn \ctex_select_size:
+\cs_new_protected:Npn \ctex_select_size:
{ \cs_if_free:NTF \size@update { \ctex_update_size: } { \selectfont } }
% \end{macrocode}
% \end{macro}
@@ -6659,7 +7056,7 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_update_size:}
% 在字号变化时更新 \tn{ccwd}、\tn{parindent} 和汉字间距。字距为零则恢复正常设置。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_update_size:
+\cs_new_protected:Npn \ctex_update_size:
{
\tl_if_eq:NNTF \l_@@_ziju_tl \c_@@_zero_tl
{
@@ -6687,7 +7084,7 @@ Copyright and Licence
% 额外伸展量。初始化为一个汉字的宽度。若设置为 \tn{maxdimen},则禁用此功能。
% 参数的默认单位是汉字的宽度 \tn{ccwd}。
% \begin{macrocode}
-\keys_define:nn { ctex }
+\ctex_define:n
{
linestretch .code:n =
{
@@ -6710,40 +7107,44 @@ Copyright and Licence
% \tn{ccwd},否则设置伸展量为 $0.08$ 倍 \tn{baselineskip}。注意 \pkg{everysel} 的
% 钩子位于 \tn{size@update} 之前,\tn{baselineskip} 还未更新,不能直接使用它。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_update_stretch:
+\cs_new_protected:Npn \ctex_update_stretch:
{
\ctex_update_em_unit:
\dim_set:Nn \l_@@_tmp_dim { \l_@@_line_stretch_tl }
\dim_compare:nNnTF \l_@@_tmp_dim = \c_max_dim
+ { \@@_update_stretch_auxi: }
+ { \@@_update_stretch_auxii: }
+ }
+\cs_new_protected:Npn \@@_update_stretch_auxi:
+ {
+ \ctex_if_ccglue_touched:TF
+ { \ctex_update_ccwd: }
{
- \ctex_if_ccglue_touched:TF
- { \ctex_update_ccwd: }
- {
- \dim_set:Nn \l_@@_tmp_dim
- { \baselinestretch \tex_glueexpr:D \f@baselineskip \scan_stop: }
- \skip_set:Nn \l_@@_ccglue_skip
- { \c_zero_dim plus .08 \l_@@_tmp_dim }
- \ctex_update_ccglue:
- }
+ \dim_set:Nn \l_@@_tmp_dim
+ { \baselinestretch \tex_glueexpr:D \f@baselineskip \scan_stop: }
+ \skip_set:Nn \l_@@_ccglue_skip
+ { \c_zero_dim plus .08 \l_@@_tmp_dim }
+ \ctex_update_ccglue:
}
+ }
+\cs_new_protected:Npn \@@_update_stretch_auxii:
+ {
+ \int_set:Nn \l_@@_tmp_int
+ { \tex_dimexpr:D \linewidth - \ccwd - \l_@@_tmp_dim \scan_stop: }
+ \tex_divide:D \l_@@_tmp_int \ccwd
+ \int_compare:nNnTF \l_@@_tmp_int > \c_zero_int
{
- \int_set:Nn \l_@@_tmp_int
- { \tex_dimexpr:D \linewidth - \ccwd - \l_@@_tmp_dim \scan_stop: }
- \tex_divide:D \l_@@_tmp_int \ccwd
- \int_compare:nNnTF \l_@@_tmp_int > \c_zero_int
+ \skip_set:Nn \l_@@_ccglue_skip
{
- \skip_set:Nn \l_@@_ccglue_skip
+ \c_zero_dim plus \dim_eval:n
{
- \c_zero_dim plus \dim_eval:n
- {
- ( \linewidth - \ccwd - \l_@@_tmp_int \ccwd ) /
- \l_@@_tmp_int
- }
+ ( \linewidth - \ccwd - \l_@@_tmp_int \ccwd ) /
+ \l_@@_tmp_int
}
}
- { \skip_zero:N \l_@@_ccglue_skip }
- \ctex_update_ccglue:
}
+ { \skip_zero:N \l_@@_ccglue_skip }
+ \ctex_update_ccglue:
}
% \end{macrocode}
% \end{macro}
@@ -6751,7 +7152,7 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_update_parindent:}
% 更新段落首行缩进。此函数在字号变化时调用。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_update_parindent:
+\cs_new_protected:Npn \ctex_update_parindent:
{
\tl_if_empty:NF \l_@@_autoindent_tl
{
@@ -6767,7 +7168,7 @@ Copyright and Licence
% \begin{macrocode}
\NewDocumentCommand \ziju { m }
{ \exp_args:Nx \ctex_ziju:n {#1} \tex_ignorespaces:D }
-\cs_new_protected_nopar:Npn \ctex_ziju:n #1
+\cs_new_protected:Npn \ctex_ziju:n #1
{
\tl_set:Nx \l_@@_ziju_tl { \fp_eval:n {#1} }
\ctex_select_size:
@@ -6779,7 +7180,7 @@ Copyright and Licence
% 更新字距。若字距不大于 $-1$,即 \tn{ccwd} 为非正值,则不计算伸缩值。
% 否则,首先假定汉字的宽度为正常宽度加上字距,看一行上能正常放下多少个汉字。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_update_ziju:
+\cs_new_protected:Npn \ctex_update_ziju:
{
\ctex_update_em_unit:
\dim_set:Nn \l_@@_ziju_dim { \l_@@_ziju_tl \ccwd }
@@ -6832,14 +7233,15 @@ Copyright and Licence
% \begin{macrocode}
\NewDocumentCommand \CTEXindent { }
{
- \msg_warning:nnnn { ctex } { deprecated-command } { \CTEXindent }
- { \parindent is~ set~ to~ 2\ccwd. }
- \ctex_update_ccwd: \dim_set:Nn \parindent { 2 \ccwd }
+ \ctex_deprecated_command:Nn \CTEXindent
+ { \parindent is~set~to~2\ccwd. }
+ \ctex_update_ccwd:
+ \dim_set:Nn \parindent { 2 \ccwd }
}
\NewDocumentCommand \CTEXnoindent { }
{
- \msg_warning:nnnn { ctex } { deprecated-command } { \CTEXnoindent }
- { \parindent is~ set~ to~ 0pt. }
+ \ctex_deprecated_command:Nn \CTEXnoindent
+ { \parindent is~set~to~0pt. }
\dim_zero:N \parindent
}
% \end{macrocode}
@@ -6848,14 +7250,14 @@ Copyright and Licence
% \subsection{中文数字与日期}
%
% \begin{macrocode}
-\PassOptionsToPackage { encoding = \l_@@_encoding_tl } { zhnumber }
+\PassOptionsToPackage { encoding = \g_@@_encoding_tl } { zhnumber }
\RequirePackage { zhnumber }
% \end{macrocode}
%
% \begin{macro}{\chinese}
% \changes{v2.4.1}{2016/05/01}{支持 \tn{pagenumbering}。}
% \begin{macrocode}
-\cs_new_nopar:Npn \chinese { \zhnum_counter:n }
+\cs_new:Npn \chinese { \zhnum_counter:n }
\cs_new_eq:NN \@chinese \@zhnum
\cs_new_eq:NN \Chinese \chinese
\cs_new_eq:NN \CTEXcounter \use_none:n
@@ -6890,7 +7292,7 @@ Copyright and Licence
% \begin{macro}{today}
% \begin{macrocode}
\cs_set_eq:NN \CTEX@todayold \today
-\keys_define:nn { ctex }
+\ctex_define:n
{
today .choice: ,
today / old .code:n =
@@ -6914,7 +7316,7 @@ Copyright and Licence
% \end{macrocode}
% \end{macro}
%
-% \subsection{其它中文标题定义}
+% \subsection{其他中文标题定义}
%
% \changes{v2.0}{2014/03/08}{将标题汉化功能加入 \pkg{ctex.sty}。}
% \changes{v2.4.3}{2016/08/18}{确保 \tn{proofname} 非空。}
@@ -6931,7 +7333,7 @@ Copyright and Licence
% \end{macro}
%
% \begin{macrocode}
-\keys_define:nn { ctex }
+\ctex_define:n
{
contentsname .tl_set:N = \contentsname ,
listfigurename .tl_set:N = \listfigurename ,
@@ -6962,7 +7364,7 @@ Copyright and Licence
}
\tl_if_exist:NTF \insertcontinuationtext
{
- \keys_define:nn { ctex }
+ \ctex_define:n
{
algorithmname .tl_set:N = \algorithmname ,
bibname .tl_set:N = \bibname ,
@@ -6972,13 +7374,13 @@ Copyright and Licence
}
{
\tl_if_exist:NTF \bibname
- { \keys_define:nn { ctex } { bibname .tl_set:N = \bibname } }
+ { \ctex_define:n { bibname .tl_set:N = \bibname } }
{
\tl_if_exist:NTF \refname
- { \keys_define:nn { ctex } { bibname .tl_set:N = \refname } }
+ { \ctex_define:n { bibname .tl_set:N = \refname } }
{
\msg_warning:nn { ctex } { ctexbibname }
- \keys_define:nn { ctex } { bibname .tl_set:N = \ctexbibname }
+ \ctex_define:n { bibname .tl_set:N = \ctexbibname }
}
}
}
@@ -7028,7 +7430,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_initial_heading:n}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_initial_heading:n #1
+\cs_new_protected:Npn \@@_initial_heading:n #1
{
\tl_new:c { CTEX@pre#1 }
\tl_new:c { CTEX@post#1 }
@@ -7078,7 +7480,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_def_heading_keys:n}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_def_heading_keys:n #1
+\cs_new_protected:Npn \@@_def_heading_keys:n #1
{
\tl_put_right:Nx \l_@@_tmp_tl
{
@@ -7103,11 +7505,8 @@ Copyright and Licence
#1 / hang .bool_set:N = \exp_not:c { CTEX@#1@hang } ,
#1 / hang .initial:n = true ,
#1 / runin .bool_set:N = \exp_not:c { CTEX@#1@runin } ,
- #1 / tocline .code:n =
- {
- \cs_set:Npn \exp_not:c { CTEX@#1@tocline}
- \exp_not:n { ####1####2 } { ####1 }
- } ,
+ #1 / tocline .cs_set:Np = \exp_not:c { CTEX@#1@tocline}
+ \exp_not:n { ##1##2 } ,
\@@_plus_key_aux:nn {#1} { break } ,
%</article|book|report>
\@@_plus_key_aux:nn {#1} { format } ,
@@ -7118,7 +7517,7 @@ Copyright and Licence
\@@_plus_key_aux:nn {#1} { aftertitle } ,
}
}
-\cs_new_nopar:Npn \@@_plus_key_aux:nn #1#2
+\cs_new:Npn \@@_plus_key_aux:nn #1#2
{
#1 / #2 .tl_set:N = \exp_not:c { CTEX@#1@#2 } ,
#1 / #2 + .code:n =
@@ -7143,7 +7542,7 @@ Copyright and Licence
\cs_new_protected:Npn \@@_assign_heading_name:nnn #1#2#3
{
\tl_set:cn { CTEX@pre#1 } {#2}
- \IfNoValueTF {#3}
+ \tl_if_novalue:nTF {#3}
{ \tl_clear:c { CTEX@post#1 } }
{ \tl_set:cn { CTEX@post#1 } {#3} }
}
@@ -7189,24 +7588,54 @@ Copyright and Licence
\@@_initial_heading:n {#1}
\@@_def_heading_keys:n {#1}
}
-\use:x
+\exp_args:NNo \group_end: \ctex_define:n { \l_@@_tmp_tl }
+% \end{macrocode}
+%
+% \changes{v2.5}{2020/04/23}{重构标题选项 \opt{indent} 和 \opt{hang}。}
+%
+% \begin{macro}[int]{\CTEX@heading@format@initial}
+% 标题格式的一些初始设置,包括恢复默认字体,并禁用自动调整首行缩进,禁止在标题中分页。
+% 同时用 \tn{noindent} 抑制首行缩进并进入水平模式。
+% 统一在各级标题的 \opt{format} 选项之前使用。
+% \begin{macrocode}
+\cs_new_protected:Npn \CTEX@heading@format@initial
{
- \group_end:
- \keys_define:nn { ctex } { \exp_not:o { \l_@@_tmp_tl } }
+ \normalfont
+ \tl_clear:N \l_@@_autoindent_tl
+ \int_set:Nn \tex_interlinepenalty:D { 10 000 }
+ \tex_noindent:D
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}[int]{\ctex_indent_box:n}
+% 设置 \tn{parindent},并插入用于产生缩进的盒子,如果缩进为 |0|,就不插入。
% \begin{macrocode}
-%<*article|book|report>
+\cs_new_protected:Npn \ctex_indent_box:n #1
+ {
+ \dim_set:Nn \tex_parindent:D {#1}
+ \@@_insert_indent:
+ }
+\cs_new_protected:Npn \@@_insert_indent:
+ {
+ \dim_compare:nNnF \tex_parindent:D = \c_zero_dim
+ { \tex_indent:D }
+ }
+\cs_new_eq:NN \CTEX@indentbox \ctex_indent_box:n
% \end{macrocode}
+% \end{macro}
%
% \subsubsection{标准标题命令的修改}
%
+% \begin{macrocode}
+%<*article|book|report>
+% \end{macrocode}
+%
% \begin{macro}[int]{\CTEX@fixtopskip}
% 修正 \cls{book} 和 \cls{report} 类的 \tn{part} 和 \tn{chapter} 标题之前的多余空行。
% \begin{macrocode}
%<*book|report>
-\cs_new_protected_nopar:Npn \CTEX@fixtopskip
+\cs_new_protected:Npn \CTEX@fixtopskip
{
\CTEX@fixheadingskip
\dim_compare:nNnF \tex_pagegoal:D < \c_max_dim
@@ -7222,14 +7651,14 @@ Copyright and Licence
% \TeX{} 就不会加上 \tn{parskip}。这时候就需要用户把 \tn{parskip} 加到 \opt{beforeskip}
% 或者 \opt{afterskip} 作为修正。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \CTEX@fixheadingskip
+\cs_new_protected:Npn \CTEX@fixheadingskip
{
\par
\dim_set:Nn \tex_prevdepth:D { -1000pt }
\skip_sub:Nn \l_@@_heading_skip { \tex_parskip:D }
}
\skip_new:N \l_@@_heading_skip
-\cs_new_protected_nopar:Npn \CTEX@setheadingskip
+\cs_new_protected:Npn \CTEX@setheadingskip
{ \skip_set:Nn \l_@@_heading_skip }
\cs_new_eq:NN \CTEX@headingskip \l_@@_heading_skip
% \end{macrocode}
@@ -7251,9 +7680,9 @@ Copyright and Licence
% 用于判断当前标题是否有编号。
% \begin{macrocode}
\cs_new_eq:NN \CTEXifname \use_ii:nn
-\cs_new_protected_nopar:Npn \CTEX@ifnametrue
+\cs_new_protected:Npn \CTEX@ifnametrue
{ \cs_set_eq:NN \CTEXifname \use_i:nn }
-\cs_new_protected_nopar:Npn \CTEX@ifnamefalse
+\cs_new_protected:Npn \CTEX@ifnamefalse
{ \cs_set_eq:NN \CTEXifname \use_ii:nn }
% \end{macrocode}
% \end{macro}
@@ -7263,7 +7692,7 @@ Copyright and Licence
% 往插图和表格目录中加入额外间距。如果间距为零,则不加入。
% \begin{macrocode}
%<*book|report>
-\cs_new_protected_nopar:Npn \CTEX@addloflotskip #1
+\cs_new_protected:Npn \CTEX@addloflotskip #1
{
\skip_set:Nn \l_@@_heading_skip { \use:c { CTEX@#1@lofskip } }
\skip_if_eq:nnF { \l_@@_heading_skip } { \c_zero_skip }
@@ -7289,14 +7718,6 @@ Copyright and Licence
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[int]{\CTEX@disableautoindent}
-% 禁用自动调整首行缩进。
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \CTEX@disableautoindent
- { \tl_clear:N \l_@@_autoindent_tl }
-% \end{macrocode}
-% \end{macro}
-%
% \changes{v2.2}{2015/06/27}{\opt{beforeskip}、\opt{afterskip} 和 \opt{indent}
% 选项支持表达式。}
% \changes{v2.4.15}{2019/03/31}{修正 \opt{part/indent} 和 \opt{chapter/indent} 的实现方法。}
@@ -7304,11 +7725,9 @@ Copyright and Licence
% \changes{v2.4.16}{2019/05/11}{修正 \opt{part/indent} 和 \opt{chapter/indent}
% 的实现方法,在其标题内部禁用 \opt{autoindent}。}
%
-% \paragraph{part 的标题}
+% \changes{v2.5}{2020/04/22}{标题选项 \opt{format} 也可以接受参数。}
%
-% \begin{macrocode}
-%<@@=>
-% \end{macrocode}
+% \paragraph{part 的标题}
%
% \changes{v2.2}{2015/06/27}{非 \cls{ctexart} 类的 \opt{part/beforeskip} 和
% \opt{part/afterskip} 选项有意义。}
@@ -7317,19 +7736,19 @@ Copyright and Licence
% \begin{macrocode}
%<*article>
\renewcommand\part{%
- \if@noskipsec \leavevmode \fi
- \par
- \CTEX@part@break
-% \addvspace{4ex}%
- \CTEX@setheadingskip \CTEX@part@beforeskip
- \ifodd \CTEX@part@fixskip \CTEX@fixheadingskip \fi
- \addvspace \CTEX@headingskip
- \ifodd \CTEX@part@afterindent
- \@afterindenttrue
- \else
- \@afterindentfalse
- \fi
- \secdef\@part\@spart}
+ \if@noskipsec \leavevmode \fi
+ \par
+ \CTEX@part@break
+% \addvspace{4ex}%
+ \CTEX@setheadingskip \CTEX@part@beforeskip
+ \ifodd \CTEX@part@fixskip \CTEX@fixheadingskip \fi
+ \addvspace \CTEX@headingskip
+ \ifodd \CTEX@part@afterindent
+ \@afterindenttrue
+ \else
+ \@afterindentfalse
+ \fi
+ \secdef\@part\@spart}
%</article>
%<*book|report>
\renewcommand\part{%
@@ -7377,20 +7796,21 @@ Copyright and Licence
\fi
\CTEX@gettitle{#1}%
\CTEX@addtocline{part}{#1}%
- {\interlinepenalty \@M
-% \normalfont \parindent \z@ \raggedright
- \CTEX@disableautoindent
- \normalfont \CTEX@part@format
-% \ifnum \c@secnumdepth >\m@ne
-% \Large\bfseries\partname\nobreakspace\thepart\par\nobreak
-% \fi
- \CTEX@hangindent{part}%
- {\CTEXifname{\CTEX@partname\CTEX@part@aftername}{}}%
-% \huge\bfseries #2%
- \CTEX@part@titleformat{#2}%
-% \markboth{}{}%
- \partmark{#1}%
- \CTEX@part@aftertitle}%
+ \partmark{#1}%
+ \begingroup
+% \parindent \z@ \raggedright \interlinepenalty \@M \normalfont
+ \CTEX@heading@format@initial
+ \CTEX@part@format{%
+% \ifnum \c@secnumdepth >\m@ne
+% \Large\bfseries\partname\nobreakspace\thepart\par\nobreak
+% \fi
+ \CTEX@headinghang{part}%
+ {\CTEXifname{\CTEX@partname\CTEX@part@aftername}{}}%
+% \huge\bfseries #2%
+ \CTEX@part@titleformat{#2}%
+% \markboth{}{}\par
+ \CTEX@part@aftertitle}\par
+ \endgroup
\nobreak
% \vskip 3ex
\CTEX@setheadingskip \CTEX@part@afterskip
@@ -7418,19 +7838,20 @@ Copyright and Licence
\CTEX@gettitle{#1}%
\CTEX@addtocline{part}{#1}%
% \markboth{}{}%
- \partmark{#1}%
- {\interlinepenalty \@M
-% \normalfont \centering
- \CTEX@disableautoindent
- \normalfont \CTEX@part@format
-% \ifnum \c@secnumdepth >-2\relax
-% \huge\bfseries\partname\nobreakspace\thepart\par\vskip 20\p@
-% \fi
- \CTEX@hangindent{part}%
- {\CTEXifname{\CTEX@partname\CTEX@part@aftername}{}}%
-% \Huge\bfseries #2\par}%
- \CTEX@part@titleformat{#2}%
- \CTEX@part@aftertitle}%
+ \partmark{#1}%
+ \begingroup
+% \centering \interlinepenalty \@M \normalfont
+ \CTEX@heading@format@initial
+ \CTEX@part@format{%
+% \ifnum \c@secnumdepth >-2\relax
+% \huge\bfseries\partname\nobreakspace\thepart\par\vskip 20\p@
+% \fi
+ \CTEX@headinghang{part}%
+ {\CTEXifname{\CTEX@partname\CTEX@part@aftername}{}}%
+% \Huge\bfseries #2\par
+ \CTEX@part@titleformat{#2}%
+ \CTEX@part@aftertitle}\par
+ \endgroup
\@endpart}
%</book|report>
% \end{macrocode}
@@ -7440,38 +7861,40 @@ Copyright and Licence
% \begin{macrocode}
%<*article>
\def\@spart#1{%
- \CTEX@ifnamefalse
- \CTEX@makeanchor@spart{part*}%
- \CTEX@gettitle{#1}%
- {\interlinepenalty \@M
-% \normalfont \parindent \z@ \raggedright
- \CTEX@disableautoindent
- \normalfont \CTEX@part@format
- \CTEX@hangindent{part}{}%
-% \huge \bfseries #1\par}%
- \CTEX@part@titleformat{#1}%
- \CTEX@part@aftertitle}%
- \nobreak
-% \vskip 3ex
- \CTEX@setheadingskip \CTEX@part@afterskip
- \ifodd \CTEX@part@fixskip \CTEX@fixheadingskip \fi
- \vskip \CTEX@headingskip
- \@afterheading}
+ \CTEX@ifnamefalse
+ \CTEX@makeanchor@spart{part*}%
+ \CTEX@gettitle{#1}%
+ \begingroup
+% \parindent \z@ \raggedright \interlinepenalty \@M \normalfont
+ \CTEX@heading@format@initial
+ \CTEX@part@format{%
+ \CTEX@headinghang{part}{}%
+% \huge \bfseries #1\par
+ \CTEX@part@titleformat{#1}%
+ \CTEX@part@aftertitle}\par
+ \endgroup
+ \nobreak
+% \vskip 3ex
+ \CTEX@setheadingskip \CTEX@part@afterskip
+ \ifodd \CTEX@part@fixskip \CTEX@fixheadingskip \fi
+ \vskip \CTEX@headingskip
+ \@afterheading}
%</article>
%<*book|report>
\def\@spart#1{%
- \CTEX@ifnamefalse
- \CTEX@makeanchor@spart{part*}%
- \CTEX@gettitle{#1}%
- {\interlinepenalty \@M
-% \normalfont \centering
- \CTEX@disableautoindent
- \normalfont \CTEX@part@format
- \CTEX@hangindent{part}{}%
-% \Huge \bfseries #1\par}%
- \CTEX@part@titleformat{#1}%
- \CTEX@part@aftertitle}%
- \@endpart}
+ \CTEX@ifnamefalse
+ \CTEX@makeanchor@spart{part*}%
+ \CTEX@gettitle{#1}%
+ \begingroup
+% \centering \interlinepenalty \@M \normalfont
+ \CTEX@heading@format@initial
+ \CTEX@part@format{%
+ \CTEX@headinghang{part}{}%
+% \Huge \bfseries #1\par%
+ \CTEX@part@titleformat{#1}%
+ \CTEX@part@aftertitle}\par
+ \endgroup
+ \@endpart}
%</book|report>
% \end{macrocode}
% \end{macro}
@@ -7480,21 +7903,21 @@ Copyright and Licence
% \begin{macrocode}
%<*book|report>
\def\@endpart{%
-% \vfil
- \CTEX@setheadingskip \CTEX@part@afterskip
- \ifodd \CTEX@part@fixskip \CTEX@fixheadingskip \fi
- \vskip \CTEX@headingskip
- \newpage
- \if@twoside
- \if@openright
- \null
- \thispagestyle{empty}%
- \newpage
- \fi
- \fi
- \if@tempswa
- \twocolumn
- \fi}
+% \vfil
+ \CTEX@setheadingskip \CTEX@part@afterskip
+ \ifodd \CTEX@part@fixskip \CTEX@fixheadingskip \fi
+ \vskip \CTEX@headingskip
+ \newpage
+ \if@twoside
+ \if@openright
+ \null
+ \thispagestyle{empty}%
+ \newpage
+ \fi
+ \fi
+ \if@tempswa
+ \twocolumn
+ \fi}
%</book|report>
% \end{macrocode}
% \end{macro}
@@ -7508,18 +7931,18 @@ Copyright and Licence
% \begin{macro}[int]{\chapter}
% \begin{macrocode}
\renewcommand\chapter{%
-% \if@openright\cleardoublepage\else\clearpage\fi
-% \thispagestyle{plain}%
- \CTEX@chapter@break
- \thispagestyle{\CTEX@chapter@pagestyle}%
- \global\@topnum\z@
-% \@afterindentfalse
- \ifodd \CTEX@chapter@afterindent
- \@afterindenttrue
- \else
- \@afterindentfalse
- \fi
- \secdef\@chapter\@schapter}
+% \if@openright\cleardoublepage\else\clearpage\fi
+% \thispagestyle{plain}%
+ \CTEX@chapter@break
+ \thispagestyle{\CTEX@chapter@pagestyle}%
+ \global\@topnum\z@
+% \@afterindentfalse
+ \ifodd \CTEX@chapter@afterindent
+ \@afterindenttrue
+ \else
+ \@afterindentfalse
+ \fi
+ \secdef\@chapter\@schapter}
% \end{macrocode}
% \end{macro}
%
@@ -7591,26 +8014,26 @@ Copyright and Licence
\CTEX@setheadingskip \CTEX@chapter@beforeskip
\ifodd \CTEX@chapter@fixskip \CTEX@fixtopskip \fi
\vspace*{\CTEX@headingskip}%
-% {\normalfont \parindent \z@ \raggedright
- {\CTEX@disableautoindent
- \normalfont \CTEX@chapter@format
- \interlinepenalty\@M
-% \ifnum \c@secnumdepth >\m@ne
-% \if@mainmatter
-% \huge\bfseries\@chapapp\space\thechapter\par\nobreak\vskip 20\p@
-% \fi
-% \fi
- \CTEX@hangindent{chapter}%
- {\CTEXifname{\CTEX@chaptername\CTEX@chapter@aftername}{}}%
-% \Huge \bfseries #1\par\nobreak
- \CTEX@chapter@titleformat{#1}%
- \CTEX@chapter@aftertitle
- \nobreak
+ \begingroup
+% \parindent \z@ \raggedright \normalfont
+ \CTEX@heading@format@initial
+ \CTEX@chapter@format{%
+% \ifnum \c@secnumdepth >\m@ne
+% \if@mainmatter
+% \huge\bfseries\@chapapp\space\thechapter\par\nobreak\vskip 20\p@
+% \fi
+% \fi
+ \CTEX@headinghang{chapter}%
+ {\CTEXifname{\CTEX@chaptername\CTEX@chapter@aftername}{}}%
+% \Huge \bfseries #1\par\nobreak
+ \CTEX@chapter@titleformat{#1}%
+ \CTEX@chapter@aftertitle}\par
+ \endgroup
+ \nobreak
% \vskip 40\p@
- \CTEX@setheadingskip \CTEX@chapter@afterskip
- \ifodd \CTEX@chapter@fixskip \CTEX@fixheadingskip \fi
- \vskip \CTEX@headingskip
- }}
+ \CTEX@setheadingskip \CTEX@chapter@afterskip
+ \ifodd \CTEX@chapter@fixskip \CTEX@fixheadingskip \fi
+ \vskip \CTEX@headingskip}
% \end{macrocode}
% \end{macro}
%
@@ -7621,20 +8044,20 @@ Copyright and Licence
\CTEX@setheadingskip \CTEX@chapter@beforeskip
\ifodd \CTEX@chapter@fixskip \CTEX@fixtopskip \fi
\vspace*{\CTEX@headingskip}%
-% {\normalfont \parindent \z@ \raggedright
- {\CTEX@disableautoindent
- \normalfont \CTEX@chapter@format
- \interlinepenalty\@M
- \CTEX@hangindent{chapter}{}%
-% \Huge \bfseries #1\par\nobreak
- \CTEX@chapter@titleformat{#1}%
- \CTEX@chapter@aftertitle
- \nobreak
-% \vskip 40\p@
- \CTEX@setheadingskip \CTEX@chapter@afterskip
- \ifodd \CTEX@chapter@fixskip \CTEX@fixheadingskip \fi
- \vskip \CTEX@headingskip
- }}
+ \begingroup
+% \parindent \z@ \raggedright \normalfont \interlinepenalty\@M
+ \CTEX@heading@format@initial
+ \CTEX@chapter@format{%
+ \CTEX@headinghang{chapter}{}%
+% \Huge \bfseries #1\par\nobreak
+ \CTEX@chapter@titleformat{#1}%
+ \CTEX@chapter@aftertitle}\par
+ \endgroup
+ \nobreak
+% \vskip 40\p@
+ \CTEX@setheadingskip \CTEX@chapter@afterskip
+ \ifodd \CTEX@chapter@fixskip \CTEX@fixheadingskip \fi
+ \vskip \CTEX@headingskip}
% \end{macrocode}
% \end{macro}
%
@@ -7645,6 +8068,11 @@ Copyright and Licence
% \paragraph{section 类的标题}
%
% \begin{macro}[int]{\@startsection}
+% \LaTeX 的标准参数是:
+% \begin{quote}\small
+% \Arg{name}\Arg{level}\Arg{indent}\Arg{beforeskip}\Arg{afterskip}^^A
+% \Arg{style}|*|\oarg{altheading}\Arg{heading}
+% \end{quote}
% \begin{macrocode}
\def\@startsection#1#2#3#4#5#6{%
\if@noskipsec \leavevmode \fi
@@ -7707,12 +8135,13 @@ Copyright and Licence
% \ifdim \@tempskipa>\z@
\unless \ifodd \CTEX@runin
\begingroup
+ \CTEX@heading@format@initial
#6{%
- \CTEX@hangfrom{\hskip\glueexpr #3\relax\@svsec}%
-% \interlinepenalty \@M #8\@@par}%
- \interlinepenalty \@M
+% \@hangfrom{\hskip #3\relax\@svsec}%
+% \interlinepenalty \@M #8\@@@@par
+ \CTEX@sectionhang{#3}{\@svsec}%
\csname CTEX@#1@titleformat\endcsname{#8}%
- \csname CTEX@#1@aftertitle\endcsname}%
+ \csname CTEX@#1@aftertitle\endcsname}\par
\endgroup
\csname #1mark\endcsname{#7}%
% \addcontentsline{toc}{#1}{%
@@ -7723,18 +8152,18 @@ Copyright and Licence
\CTEX@addtocline{#1}{#7}%
\else
\def\@svsechd{%
- #6{\hskip\glueexpr #3\relax
-% \@svsec #8}%
- \@svsec
- \csname CTEX@#1@titleformat\endcsname{#8}%
- \csname CTEX@#1@aftertitle\endcsname}%
- \csname #1mark\endcsname{#7}%
-% \addcontentsline{toc}{#1}{%
-% \ifnum #2>\c@secnumdepth \else
-% \protect\numberline{\csname the#1\endcsname}%
-% \fi
-% #7}%
- \CTEX@addtocline{#1}{#7}}%
+ #6{%
+% \hskip #3\relax \@svsec #8
+ {\CTEX@indentbox{#3}}\@svsec
+ \csname CTEX@#1@titleformat\endcsname{#8}%
+ \csname CTEX@#1@aftertitle\endcsname}%
+ \csname #1mark\endcsname{#7}%
+% \addcontentsline{toc}{#1}{%
+% \ifnum #2>\c@secnumdepth \else
+% \protect\numberline{\csname the#1\endcsname}%
+% \fi
+% #7}%
+ \CTEX@addtocline{#1}{#7}}%
\fi
\@xsect{#5}}
% \end{macrocode}
@@ -7749,17 +8178,18 @@ Copyright and Licence
% \ifdim \@tempskipa>\z@
\unless \ifodd \CTEX@runin
\begingroup
+ \CTEX@heading@format@initial
#4{%
- \CTEX@hangfrom{\hskip\glueexpr #1\relax}%
-% \interlinepenalty \@M #5\@@par}%
- \interlinepenalty \@M
+% \@hangfrom{\hskip #1}%
+% \interlinepenalty \@M #5\@@par
+ \CTEX@sectionhang{#1}{}%
\CTEX@titleformat@n{#5}%
- \CTEX@aftertitle}%
+ \CTEX@aftertitle}\par
\endgroup
\else
-% \def\@svsechd{#4{\hskip\glueexpr #1\relax #5}}%
- \def\@svsechd{#4{\hskip\glueexpr #1\relax
- \CTEX@titleformat@n{#5}\CTEX@aftertitle}}%
+% \def\@svsechd{#4{\hskip #1\relax #5}}%
+ \def\@svsechd{#4{{\CTEX@indentbox{#1}}%
+ \CTEX@titleformat@n{#5}\CTEX@aftertitle}}%
\fi
\@xsect{#3}}
% \end{macrocode}
@@ -7789,7 +8219,7 @@ Copyright and Licence
\unskip
% \@tempskipa #1\relax
% \hskip -\@tempskipa
- \hskip\glueexpr #1\relax
+ \CTEX@heading@glue{#1}%
\else
\clubpenalty \@clubpenalty
\everypar{}%
@@ -7799,44 +8229,62 @@ Copyright and Licence
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[int]{\CTEX@headinghang,\CTEX@sectionhang}
+% 分别用于用于实现 \tn{part}/\tn{chapter} 和 \tn{section} 类标题的
+% \opt{indent} 和 \opt{hang} 选项。
% \begin{macrocode}
-%<@@=ctex>
+\cs_new_protected:Npn \CTEX@headinghang #1
+ {
+ \ctex_heading_hang:cnn
+ { CTEX@#1@hang }
+ { \use:c { CTEX@#1@indent } }
+ }
+\cs_new_protected:Npn \CTEX@sectionhang
+ { \ctex_heading_hang:Nnn \CTEX@hang }
% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}[int]{\CTEX@hangindent}
-% 用于实现 \tn{part} 和 \tn{chapter} 标题的 \opt{indent} 和 \opt{hang} 选项。
+% \begin{macro}[int]{\ctex_heading_hang:Nnn,\ctex_hang_from:n}
+% \opt{hang} 选项控制是否采用悬挂缩进,同时设置 \tn{parindent}。
% \begin{macrocode}
-\cs_new_protected:Npn \CTEX@hangindent #1#2
+\cs_new_protected:Npn \ctex_heading_hang:Nnn #1#2#3
{
- \dim_set:Nn \parindent { \use:c { CTEX@#1@indent } }
- \bool_if:cTF { CTEX@#1@hang }
- { \@hangfrom { \@@_indent_aux: #2 } }
- {#2}
+ \dim_set:Nn \tex_parindent:D {#2}
+ \bool_if:NTF #1
+ { \ctex_hang_from:n }
+ { \use:n }
+ { \@@_insert_indent: #3 }
}
-\cs_new_protected_nopar:Npn \@@_indent_aux:
+\cs_new_protected:Npn \ctex_hang_from:n #1
{
- \dim_compare:nNnF \parindent = \c_zero_dim
- { \skip_horizontal:n { \parindent } }
+ \tex_noindent:D
+ \hbox_set:Nn \l_@@_tmp_box {#1}
+ \tex_hangindent:D = \box_wd:N \l_@@_tmp_box
+ \box_use_drop:N \l_@@_tmp_box
}
+\cs_generate_variant:Nn \ctex_heading_hang:Nnn { c }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[int]{\CTEX@hangfrom}
-% \opt{hang} 选项控制是否采用悬挂缩进。
+% \begin{macro}[int]{\ctex_heading_glue:n,\CTEX@heading@glue}
+% 如果缩进 |#1| 长度为零,就不插入水平间距。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \CTEX@hangfrom
+\cs_new_protected:Npn \ctex_heading_glue:n #1
{
- \bool_if:NTF \CTEX@hang
- { \@hangfrom }
- { \noindent \use:n }
+ \group_begin:
+ \skip_set:Nn \l_@@_heading_skip {#1}
+ \dim_compare:nNnF \l_@@_heading_skip = \c_zero_dim
+ { \skip_horizontal:N \l_@@_heading_skip }
+ \group_end:
}
+\cs_new_eq:NN \CTEX@heading@glue \ctex_heading_glue:n
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\CTEX@update@sectionformat@n}
% 在 \tn{@startsection} 中设置 \tn{CTEX@titleformat@n} 等为相应函数。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \CTEX@update@sectionformat@n #1
+\cs_new_protected:Npn \CTEX@update@sectionformat@n #1
{
\cs_set_eq:Nc \CTEX@titleformat@n { CTEX@#1@titleformat }
\cs_set_eq:Nc \CTEX@aftertitle { CTEX@#1@aftertitle }
@@ -7877,7 +8325,7 @@ Copyright and Licence
%
% \begin{macro}[int]{\CTEXnumberline}
% \begin{macrocode}
-\cs_new_nopar:Npn \CTEXnumberline #1
+\cs_new:Npn \CTEXnumberline #1
{
\CTEXifname
{ \protect \numberline { \use:c { CTEXthe #1 } } }
@@ -7891,7 +8339,7 @@ Copyright and Licence
\seq_map_inline:Nn \c_@@_section_headings_seq
{
\int_incr:N \l_@@_tmp_int
- \cs_gset_protected_nopar:cpx {#1}
+ \cs_gset_protected:cpx {#1}
{
\exp_not:N \@startsection {#1}
{ \int_use:N \l_@@_tmp_int }
@@ -7909,7 +8357,7 @@ Copyright and Licence
%
% \begin{macro}[int]{appendix/name,appendix/number,appendix/numbering}
% \begin{macrocode}
-\keys_define:nn { ctex }
+\ctex_define:n
{
appendix .meta:nn = { ctex / appendix } {#1} ,
appendix / name .code:n =
@@ -7926,7 +8374,7 @@ Copyright and Licence
% \begin{macro}[int]{\appendix}
% \begin{macrocode}
\cs_new_eq:NN \CTEX@save@appendix \appendix
-\cs_gset_protected_nopar:Npn \appendix
+\cs_gset_protected:Npn \appendix
{
\CTEX@save@appendix
%<*article>
@@ -7952,7 +8400,7 @@ Copyright and Licence
% \begin{macro}[int]{\CTEX@makeanchor}
% 设置超链接跳转锚点,在 \pkg{hyperref} 载入后才有意义。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \CTEX@makeanchor #1
+\cs_new_protected:Npn \CTEX@makeanchor #1
{ }
% \end{macrocode}
% \end{macro}
@@ -7976,7 +8424,7 @@ Copyright and Licence
% \opt{implicit} 选项的控制)。我们在上面对标题命令的修改已经包含这一功能,如果这些标题命令在
% \pkg{hyperref} 载入之前没有被修改过,则恢复 \CTeX{} 的定义。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \CTEX@hyperheadinghook
+\cs_new_protected:Npn \CTEX@hyperheadinghook
{
\group_begin:
\ifHy@implicit
@@ -8001,7 +8449,7 @@ Copyright and Licence
% \begin{macrocode}
\ctex_at_end_package:nn { hyperref }
{
- \cs_gset_protected_nopar:Npn \CTEX@makeanchor #1
+ \cs_gset_protected:Npn \CTEX@makeanchor #1
{
\Hy@MakeCurrentHrefAuto {#1}
\Hy@raisedlink
@@ -8025,7 +8473,7 @@ Copyright and Licence
{ }
\ctex_at_end_package:nn { nameref }
{
- \cs_gset_protected_nopar:Npn \CTEX@gettitle { \NR@gettitle }
+ \cs_gset_protected:Npn \CTEX@gettitle { \NR@gettitle }
\seq_map_inline:Nn \c_@@_headings_cs_seq
{
\cs_if_eq:ccT { NR@ #1 } { CTEX@ #1 }
@@ -8062,7 +8510,7 @@ Copyright and Licence
% 如果使用了 \pkg{titlesec} 的 \opt{indentafter} 等选项,也不需要调整
% |\ttls@|\meta{section}。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_titlesec_hook:
+\cs_new_protected:Npn \ctex_titlesec_hook:
{
\@ifpackagewith { titlesec } { explicit }
{
@@ -8082,17 +8530,17 @@ Copyright and Licence
}
\seq_map_function:NN \c_@@_section_headings_seq \@@_titlesec_hook:n
}
-\cs_new_protected_nopar:Npn \@@_titlesec_hook:n #1
+\cs_new_protected:Npn \@@_titlesec_hook:n #1
{
\@@_titlesec_format:n {#1}
\exp_args:Nc \@@_titlesec_spacing:Nn { ttls@#1 } {#1}
}
-\cs_new_protected_nopar:Npn \@@_titlesec_format:n #1
+\cs_new_protected:Npn \@@_titlesec_format:n #1
{
\cs_if_free:cF { ttlf@#1 }
{ \exp_args:Nc \@@_titlesec_format:Nn { ttlf@#1 } {#1} }
}
-\cs_new_protected_nopar:Npn \@@_titlesec_format:Nn #1#2
+\cs_new_protected:Npn \@@_titlesec_format:Nn #1#2
{
\tl_set:Nx #1
{
@@ -8102,7 +8550,7 @@ Copyright and Licence
\tl_tail:N #1
}
}
-\cs_new_protected_nopar:Npn \@@_titlesec_format_explicit:Nn #1#2
+\cs_new_protected:Npn \@@_titlesec_format_explicit:Nn #1#2
{
\cs_set_nopar:Npx #1 ##1
{
@@ -8112,7 +8560,7 @@ Copyright and Licence
\exp_args:No \tl_tail:n { #1 { } }
}
}
-\cs_new_protected_nopar:Npn \@@_titlesec_spacing:Nn #1#2
+\cs_new_protected:Npn \@@_titlesec_spacing:Nn #1#2
{ \tl_set:Nx #1 { \exp_after:wN \@@_titlesec_spacing:nnnnnn #1 {#2} } }
\cs_new:Npn \@@_titlesec_spacing:nnnnnn #1#2#3#4#5#6
{
@@ -8145,14 +8593,14 @@ Copyright and Licence
%</book|report>
\cs_if_free:NF \ttl@tocpart
{
- \cs_set_protected_nopar:Npn \ttl@tocpart
+ \cs_set_protected:Npn \ttl@tocpart
{ \tl_set:Nn \ttl@a { \CTEXthepart \hspace { 1em } } }
}
\seq_map_inline:Nn \c_@@_headings_seq
{
\cs_if_exist:cF { ttl@toc #1 }
{
- \cs_new_protected_nopar:cpx { ttl@toc #1 }
+ \cs_new_protected:cpx { ttl@toc #1 }
{
\tl_set:Nn \exp_not:N \ttl@a
{
@@ -8178,7 +8626,7 @@ Copyright and Licence
% \begin{macrocode}
\group_begin:
\char_set_catcode_other:N \#
-\cs_new_protected_nopar:Npn \ctex_titleps_hook:
+\cs_new_protected:Npn \ctex_titleps_hook:
{
\ctex_patch_cmd:Nnn \ttl@settopmark
{ \protect \@namedef { the#1 } { \@nameuse { the#1 } } }
@@ -8207,12 +8655,12 @@ Copyright and Licence
% 这两个函数要在随后被 \tn{xdef} 展开来获得 |\CTEXtheXXX| 的内容,不应该用
% \tn{protected} 来定义。
% \begin{macrocode}
-\cs_new_nopar:Npn \CTEX@titlepslabel@set #1
+\cs_new:Npn \CTEX@titlepslabel@set #1
{
\cs_if_free:cF { CTEXthe#1 }
{ \protect \@namedef { CTEXthe#1 } { \@nameuse { CTEXthe#1 } } }
}
-\cs_new_nopar:Npn \CTEX@titlepslabel@clear #1
+\cs_new:Npn \CTEX@titlepslabel@clear #1
{
\cs_if_free:cF { CTEXthe#1 }
{ \protect \@namedef { CTEXthe#1 } { } }
@@ -8240,9 +8688,9 @@ Copyright and Licence
% \begin{macrocode}
\ctex_at_end_package:nn { titleps }
{
- \cs_set_protected_nopar:Npn \ttl@setifthe #1
+ \cs_set_protected:Npn \ttl@setifthe #1
{
- \exp_args:Nco \cs_set_nopar:Npn { ifthe #1 }
+ \exp_args:Nco \cs_set:Npn { ifthe #1 }
{
\CTEXifname
{ \protect \@firstoftwo }
@@ -8257,7 +8705,7 @@ Copyright and Licence
%
% \subsubsection{目录标签的宽度}
%
-% \begin{macro}[int]{\numberline}
+% \begin{macro}{\CTEX@toc@width@n}
% \begin{macrocode}
\cs_new_protected:Npn \CTEX@toc@width@n #1
{
@@ -8268,6 +8716,17 @@ Copyright and Licence
{ \box_wd:N \l_@@_tmp_box + \f@size \p@ / 2 }
}
}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.5}{2020/01/11}{兼容 \pkg{titletoc} 宏包。}
+%
+% \begin{macro}{\numberline,\@@_patch_toc_width:n}
+% 为 \tn{numberline} 命令打补丁,并兼容 \pkg{tocloft} 和 \pkg{titletoc} 宏包。
+%
+% 这里需要替换 |#| 本身,因此需要先切换为 other 类。表示参数的 |#| 用
+% \cs{c_parameter_token} 代替。
+% \begin{macrocode}
\group_begin:
\char_set_catcode_other:N \#
\use:n
@@ -8277,19 +8736,24 @@ Copyright and Licence
{ \CTEX@toc@width@n {#1} }
{ }
{ \ctex_patch_failure:N \numberline }
- \@ifpackageloaded { tocloft }
- { }
+ \cs_new_protected:Npn \@@_patch_toc_width:n \c_parameter_token 1
{
- \ctex_at_end_package:nn { tocloft }
+ \@ifpackageloaded { \c_parameter_token 1 }
+ { }
{
- \ctex_preto_cmd:NnnTF \numberline
- { \char_set_catcode_letter:n { 64 } }
- { \CTEX@toc@width@n {#1} }
- { }
- { \ctex_patch_failure:N \numberline }
+ \ctex_at_end_package:nn { \c_parameter_token 1 }
+ {
+ \ctex_preto_cmd:NnnTF \numberline
+ { \char_set_catcode_letter:n { 64 } }
+ { \CTEX@toc@width@n {#1} }
+ { }
+ { \ctex_patch_failure:N \numberline }
+ }
}
}
}
+\@@_patch_toc_width:n { tocloft }
+\@@_patch_toc_width:n { titletoc }
% \end{macrocode}
% \end{macro}
%
@@ -8385,72 +8849,69 @@ Copyright and Licence
% \begin{macrocode}
\defbeamertemplate*{part page}{CTEX}[1][]{%
\begingroup
- \CTEX@disableautoindent
% \centering
% {\usebeamerfont{part name}%
% \usebeamercolor[fg]{part name}\partname~\insertromanpartnumber}
% \vskip1em\par
\par \addvspace{\glueexpr\CTEX@part@beforeskip\relax}%
- \CTEX@part@format
- \parindent \dimexpr \CTEX@part@indent \relax
- \ifodd \CTEX@part@numbering
- \CTEX@partname \CTEX@part@aftername
- \fi
- \begin{beamercolorbox}[sep=16pt,center,#1]{part title}
-% \usebeamerfont{part title}\insertpart\par
- \CTEX@part@titleformat \insertpart \CTEX@part@aftertitle
- \end{beamercolorbox}%
+ \CTEX@heading@format@initial
+ \CTEX@part@format{%
+ \CTEX@indentbox{\CTEX@part@indent}%
+ \ifodd \CTEX@part@numbering
+ \CTEX@partname \CTEX@part@aftername
+ \fi
+ \begin{beamercolorbox}[sep=16pt,center,#1]{part title}
+% \usebeamerfont{part title}\insertpart\par
+ \CTEX@part@titleformat \insertpart \CTEX@part@aftertitle
+ \end{beamercolorbox}}%
\par \addvspace{\glueexpr\CTEX@part@afterskip\relax}%
- \endgroup
-}
+ \endgroup}
% \end{macrocode}
%
% 对应 \tn{sectionpage}。
% \begin{macrocode}
\defbeamertemplate*{section page}{CTEX}[1][]{%
\begingroup
- \CTEX@disableautoindent
% \centering
% {\usebeamerfont{section name}%
% \usebeamercolor[fg]{section name}\sectionname~\insertsectionnumber}
% \vskip1em\par
\par \addvspace{\glueexpr\CTEX@section@beforeskip\relax}%
- \CTEX@section@format
- \parindent \dimexpr \CTEX@section@indent \relax
- \ifodd \CTEX@section@numbering
- \CTEX@sectionname \CTEX@section@aftername
- \fi
- \begin{beamercolorbox}[sep=12pt,center,#1]{part title}
-% \usebeamerfont{section title}\insertsection\par
- \CTEX@section@titleformat \insertsection \CTEX@section@aftertitle
- \end{beamercolorbox}%
+ \CTEX@heading@format@initial
+ \CTEX@section@format{%
+ \CTEX@indentbox{\CTEX@section@indent}%
+ \ifodd \CTEX@section@numbering
+ \CTEX@sectionname \CTEX@section@aftername
+ \fi
+ \begin{beamercolorbox}[sep=12pt,center,#1]{part title}
+% \usebeamerfont{section title}\insertsection\par
+ \CTEX@section@titleformat \insertsection \CTEX@section@aftertitle
+ \end{beamercolorbox}}%
\par \addvspace{\glueexpr\CTEX@section@afterskip\relax}%
- \endgroup
-}
+ \endgroup}
% \end{macrocode}
%
% 对应 \tn{subsectionpage}。
% \begin{macrocode}
\defbeamertemplate*{subsection page}{CTEX}[1][]{%
\begingroup
- \CTEX@disableautoindent
% \centering
% {\usebeamerfont{subsection name}%
% \usebeamercolor[fg]{subsection name}\subsectionname~\insertsubsectionnumber}
% \vskip1em\par
\par \addvspace{\glueexpr\CTEX@subsection@beforeskip\relax}%
- \CTEX@subsection@format
- \parindent \dimexpr \CTEX@subsection@indent \relax
- \ifodd \CTEX@subsection@numbering
- \CTEX@subsectionname \CTEX@subsection@aftername
- \fi
- \begin{beamercolorbox}[sep=8pt,center,#1]{part title}
-% \usebeamerfont{subsection title}\insertsubsection\par
- \CTEX@subsection@titleformat \insertsubsection \CTEX@subsection@aftertitle
- \end{beamercolorbox}%
+ \CTEX@heading@format@initial
+ \CTEX@subsection@format{%
+ \CTEX@indentbox{\CTEX@subsection@indent}%
+ \ifodd \CTEX@subsection@numbering
+ \CTEX@subsectionname \CTEX@subsection@aftername
+ \fi
+ \begin{beamercolorbox}[sep=8pt,center,#1]{part title}
+% \usebeamerfont{subsection title}\insertsubsection\par
+ \CTEX@subsection@titleformat \insertsubsection \CTEX@subsection@aftertitle
+ \end{beamercolorbox}}%
\par \addvspace{\glueexpr\CTEX@subsection@afterskip\relax}%
- \endgroup
-}
+ \endgroup}
% \end{macrocode}
%
% 将 \cls{beamer} 的默认模板重定向为 \texttt{CTEX} 模板。
@@ -8468,12 +8929,65 @@ Copyright and Licence
%</beamer>
% \end{macrocode}
%
+% \subsubsection{标题编号和目录的层次设置}
+%
+% \changes{v2.5.2}{2020/05/06}{新增标题选项 \opt{secnumdepth} 和 \opt{tocdepth}。}
+%
+% \begin{macro}{secnumdepth, tocdepth}
+% \opt{secnumdepth} 在 \cls{beamer} 下无意义。
+% \begin{macrocode}
+\ctex_define:n
+ {
+%<*!beamer>
+ secnumdepth .code:n = \ctex_heading_depth:ne { secnumdepth } {#1} ,
+ secnumdepth .value_required:n = true ,
+%</!beamer>
+ tocdepth .code:n = \ctex_heading_depth:ne { tocdepth } {#1} ,
+ tocdepth .value_required:n = true
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_heading_depth:nn}
+% 注意此处 \tn{setcounter} 的赋值是全局的。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_heading_depth:nn #1#2
+ {
+ \prop_get:NnNTF \c_@@_heading_level_prop {#2} \l_@@_tmp_tl
+ { \setcounter {#1} { \l_@@_tmp_tl } }
+ { \setcounter {#1} { \int_eval:n {#2} } }
+ }
+\cs_generate_variant:Nn \ctex_heading_depth:nn { ne }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}[int]{\c_@@_heading_level_prop}
+% 章节层次与名称的对应表。
+% \begin{macrocode}
+\prop_const_from_keyval:Nn \c_@@_heading_level_prop
+ {
+%<*article|beamer>
+ part = 0 ,
+%</article|beamer>
+%<*book|report>
+ part = -1 ,
+ chapter = 0 ,
+%</book|report>
+ section = 1 ,
+ subsection = 2 ,
+ subsubsection = 3 ,
+ paragraph = 4 ,
+ subparagraph = 5
+ }
+% \end{macrocode}
+% \end{variable}
+%
% \subsubsection{标签引用数字的汉化}
%
% \begin{macro}[int]{\refstepcounter}
% 对标题进行引用时,设置标签为通过 \opt{number} 选项设置的形式。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \CTEX@setcurrentlabel@n #1
+\cs_new_protected:Npn \CTEX@setcurrentlabel@n #1
{
\protected@edef \@currentlabel
{
@@ -8490,16 +9004,18 @@ Copyright and Licence
% \pkg{hyperref} 宏包都会保存之前的定义,并且它们都要求尽可能晚的被载入,所以
% 对我们上述的修改影响不大。需要注意的是 \pkg{varioref} 宏包,如果它在
% \CTeX{} 之后被载入,我们之前的修改将会被覆盖。
+% 较新版 \LaTeX \ 内核已经包含 \tn{labelformat},可以直接使用。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_varioref_hook:
+\cs_new_protected:Npn \ctex_varioref_hook:
{
\seq_map_inline:Nn \c_@@_headings_seq
{ \ctex_fix_varioref_label:n { ##1 } }
+ \ctex_at_end_package:nn { cleveref } { \ctex_cleveref_hook: }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_fix_varioref_label:n}
+% \begin{macro}{\ctex_fix_varioref_label:n}
% \pkg{varioref} 宏包的 \tn{labelformat} 实际上是定义一个以 |\the<#1>| 为参数的宏
% |\p@<#1>|。\LaTeX{} 在定义计数器 |<#1>| 时,都会将 |\p@<#1>| 初始化为 \tn{@empty}。
% 如果这个宏非空,说明用户自定义了标签格式,我们就不再修改。这里不能使用
@@ -8510,17 +9026,49 @@ Copyright and Licence
% \end{verbatim}
% 它的第二个参数必须放在花括号内,否则将会被作为宏的定界符号。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_fix_varioref_label:n #1
+\cs_new_protected:Npn \ctex_fix_varioref_label:n #1
{
\tl_if_empty:cT { p@#1 }
- { \exp_args:Nno \labelformat {#1} { \cs:w CTEX@the#1 \cs_end: } }
+ { \exp_args:Nnx \labelformat {#1} { \exp_not:c { CTEX@the#1 } } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.5.3}{2020/06/04}{兼容 \pkg{cleveref}。}
+% \changes{v2.5.4}{2020/06/17}{同时兼容 \pkg{cleveref} 和 \pkg{hyperref}。}
+% \begin{macro}{\ctex_cleveref_hook:,\@@_cleveref_hook_aux:N}
+% 需要将\pkg{cleveref} 包对应命令中 |\p@|\meta{counter} 的参数及时展开,以兼容 \tn{labelformat}。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_cleveref_hook:
+ {
+ \@ifpackageloaded { hyperref }
+ { \@@_cleveref_hook_aux:N \H@refstepcounter }
+ {
+ \@@_cleveref_hook_aux:N \refstepcounter@noarg
+ \@@_cleveref_hook_aux:N \refstepcounter@optarg
+ }
+ \@@_cleveref_hook_aux:N \appendix
+ }
+\cs_new_protected:Npn \@@_cleveref_hook_aux:N #1
+ {
+ \ctex_patch_cmd_all:NnnnTF #1
+ {
+ \ExplSyntaxOff
+ \char_set_catcode_letter:n { 64 }
+ }
+ { \endcsname \csname the }
+ { \expandafter \endcsname \csname the }
+ { }
+ { \ctex_patch_failure:N #1 }
}
% \end{macrocode}
% \end{macro}
%
+% \changes{v2.5}{2020/04/19}{应用新内核中的 \tn{labelformat}。}
+%
% 如果 \pkg{varioref} 已经被载入,则使用它来设置。
% \begin{macrocode}
-\@ifpackageloaded { varioref }
+\cs_if_exist:NTF \labelformat
{ \ctex_varioref_hook: }
{
\cs_new_eq:NN \CTEX@save@refstepcounter \refstepcounter
@@ -8558,7 +9106,7 @@ Copyright and Licence
% 标题的 \opt{nameformat} 和 \opt{titleformat} 选项的初值合并到 \opt{format} 中。}
%
% \begin{macrocode}
-\keys_set:nn { ctex / part }
+\ctex_set:nn { part }
{
aftertitle = \par ,
%<*article|book|report>
@@ -8619,7 +9167,7 @@ Copyright and Licence
%
% \begin{macrocode}
%<*book|report>
-\keys_set:nn { ctex / chapter }
+\ctex_set:nn { chapter }
{
pagestyle = plain ,
aftertitle = \par ,
@@ -8650,16 +9198,12 @@ Copyright and Licence
% \end{macrocode}
%
% \begin{macrocode}
-%<@@=>
-% \end{macrocode}
-%
-% \begin{macrocode}
-\keys_set:nn { ctex / section }
+\ctex_set:nn { section }
{
%<*article|book|report>
number = \thesection ,
aftername = \quad ,
- aftertitle = \@@par ,
+ aftertitle = \@@@@par ,
beforeskip = 3.5ex \@plus 1ex \@minus .2ex ,
afterskip = 2.3ex \@plus .2ex ,
runin = false ,
@@ -8689,13 +9233,13 @@ Copyright and Licence
% \end{macrocode}
%
% \begin{macrocode}
-\keys_set:nn { ctex / subsection }
+\ctex_set:nn { subsection }
{
%<*article|book|report>
number = \thesubsection ,
format = \large \bfseries ,
aftername = \quad ,
- aftertitle = \@@par ,
+ aftertitle = \@@@@par ,
beforeskip = 3.25ex \@plus 1ex \@minus .2ex ,
afterskip = 1.5ex \@plus .2ex ,
runin = false ,
@@ -8730,12 +9274,12 @@ Copyright and Licence
% \end{macrocode}
%
% \begin{macrocode}
-\keys_set:nn { ctex / subsubsection }
+\ctex_set:nn { subsubsection }
{
number = \thesubsubsection ,
format = \normalsize \bfseries ,
aftername = \quad ,
- aftertitle = \@@par ,
+ aftertitle = \@@@@par ,
beforeskip = 3.25ex \@plus 1ex \@minus .2ex ,
afterskip = 1.5ex \@plus .2ex ,
runin = false ,
@@ -8750,7 +9294,7 @@ Copyright and Licence
% \end{macrocode}
%
% \begin{macrocode}
-\keys_set:nn { ctex / paragraph }
+\ctex_set:nn { paragraph }
{
number = \theparagraph ,
format = \normalsize \bfseries ,
@@ -8767,7 +9311,7 @@ Copyright and Licence
% \end{macrocode}
%
% \begin{macrocode}
-\keys_set:nn { ctex / subparagraph }
+\ctex_set:nn { subparagraph }
{
number = \thesubparagraph ,
format = \normalsize \bfseries ,
@@ -8785,50 +9329,46 @@ Copyright and Licence
%
% 处理 \opt{sub3section} 与 \opt{sub4section} 的格式。
% \begin{macrocode}
-\int_compare:nNnTF \g__ctex_section_depth_int > 2
+\int_compare:nNnTF \g_@@_section_depth_int > 2
{
- \keys_set:nn { ctex / paragraph }
+ \ctex_set:nn { paragraph }
{
- aftertitle = \@@par ,
+ aftertitle = \@@@@par ,
afterskip = 1ex \@plus .2ex ,
runin = false
}
}
{
- \keys_set:nn { ctex / paragraph }
+ \ctex_set:nn { paragraph }
{
afterskip = 1em ,
runin = true
}
}
-\int_compare:nNnTF \g__ctex_section_depth_int > 3
+\int_compare:nNnTF \g_@@_section_depth_int > 3
{
- \keys_set:nn { ctex / subparagraph }
+ \ctex_set:nn { subparagraph }
{
- aftertitle = \@@par ,
+ aftertitle = \@@@@par ,
afterskip = 1ex \@plus .2ex ,
runin = false
}
}
{
- \keys_set:nn { ctex / subparagraph }
+ \ctex_set:nn { subparagraph }
{
afterskip = 1em ,
runin = true
}
}
-\int_compare:nNnTF \g__ctex_section_depth_int > 2
- { \keys_set:nn { ctex / subparagraph } { indent = \c_zero_dim } }
- { \keys_set:nn { ctex / subparagraph } { indent = \parindent } }
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=ctex>
+\int_compare:nNnTF \g_@@_section_depth_int > 2
+ { \ctex_set:nn { subparagraph } { indent = \c_zero_dim } }
+ { \ctex_set:nn { subparagraph } { indent = \parindent } }
% \end{macrocode}
%
% 处理附录的格式。
% \begin{macrocode}
-\keys_set:nn { ctex / appendix }
+\ctex_set:nn { appendix }
%<*article>
{ number = \@Alph \c@section }
%</article>
@@ -8890,7 +9430,7 @@ Copyright and Licence
{ \tl_const:Nn \c_@@_class_tl { article } }
\msg_warning:nnx { ctex } { not-standard-class } { \c_@@_class_tl }
}
- \ctex_file_input:n { ctex- \c_@@_class_tl .def }
+ \ctex_file_input:n { ctex-heading- \c_@@_class_tl .def }
}
%<ctex> { \ctex_scheme_input:o { \l_@@_scheme_tl } }
% \end{macrocode}
@@ -8943,19 +9483,19 @@ Copyright and Licence
%
% 日期格式。
% \begin{macrocode}
-\keys_set:nn { ctex } { today = small }
+\ctex_set:n { today = small }
% \end{macrocode}
%
% 若用户未设置宏包选项 \opt{autoindent},则自动调整首行缩进。
% \begin{macrocode}
\ctex_if_autoindent_touched:F
- { \keys_set:nn { ctex } { autoindent = true } }
+ { \ctex_set:n { autoindent = true } }
% \end{macrocode}
%
% 使用标题定义时的设置。首先是命题名字汉化。\cls{beamer} 需要汉化定理名称。
% \begin{macrocode}
%<*!generic>
-\str_if_eq:onTF { \l_@@_encoding_tl } { GBK }
+\str_if_eq:onTF { \g_@@_encoding_tl } { GBK }
%<*beamer>
{
\uselanguage { ChineseGBK }
@@ -8989,19 +9529,19 @@ Copyright and Licence
% 对 \cls{beamer} 以外的文档类,若用户未设置宏包选项 \opt{linespread},则设置行
% 距初始值为 $1.3\times 1.2=1.56$ 倍字体大小。\cls{beamer} 不调整行距。
% \begin{macrocode}
-\fp_compare:nNnT { \l_@@_line_spread_fp } ? { \c_zero_fp }
+\fp_if_nan:nT { \l_@@_line_spread_fp }
{ \fp_set:Nn \l_@@_line_spread_fp { 1.3 } }
%</!beamer>
%</!generic>
% \end{macrocode}
%
-% 不使用标题定义时的通用设置。
+% 不使用标题定义时的通用设置,注意此处 \cs{c_@@_std_class_tl} 可能没有定义。
% \begin{macrocode}
%<*generic>
\tl_set:Nn \l_@@_tmp_tl { beamer }
\tl_if_eq:NNTF \c_@@_std_class_tl \l_@@_tmp_tl
{
- \str_if_eq:onTF { \l_@@_encoding_tl } { GBK }
+ \str_if_eq:onTF { \g_@@_encoding_tl } { GBK }
{
\uselanguage { ChineseGBK }
\languagealias { chinese } { ChineseGBK }
@@ -9015,12 +9555,12 @@ Copyright and Licence
\clist_put_left:Nn \trans@languagepath { chinese }
}
{
- \str_if_eq:onTF { \l_@@_encoding_tl } { GBK }
+ \str_if_eq:onTF { \g_@@_encoding_tl } { GBK }
{ \ctex_file_input:n { ctex-name-gbk.cfg } }
{ \ctex_file_input:n { ctex-name-utf8.cfg } }
\int_compare:nNnF \g_@@_font_size_int > { -1 }
{ \int_gset:Nn \g_@@_font_size_int { 0 } }
- \fp_compare:nNnT { \l_@@_line_spread_fp } ? { \c_zero_fp }
+ \fp_if_nan:nT { \l_@@_line_spread_fp }
{ \fp_set:Nn \l_@@_line_spread_fp { 1.3 } }
% \end{macrocode}
% \changes{v2.0.2}{2015/05/16}{修复加载 \pkg{ctex} 宏包后章节标题后第一段
@@ -9055,7 +9595,7 @@ Copyright and Licence
%
% \begin{macro}[int]{\ctex_zihao:n}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_zihao:n #1
+\cs_new_protected:Npn \ctex_zihao:n #1
{
\prop_get:NnNTF \c_@@_font_size_prop {#1} \l_@@_font_size_tl
{ \exp_after:wN \fontsize \l_@@_font_size_tl \selectfont }
@@ -9083,7 +9623,7 @@ Copyright and Licence
% \begin{macrocode}
\prop_new:N \c_@@_font_size_prop
\seq_new:N \c_@@_font_size_seq
-\cs_new_protected_nopar:Npn \@@_save_font_size:nn #1#2
+\cs_new_protected:Npn \@@_save_font_size:nn #1#2
{
\use:x
{
@@ -9121,7 +9661,7 @@ Copyright and Licence
%
% \begin{macro}[int]{\ctex_declare_math_sizes:nnnn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_declare_math_sizes:nnnn #1#2#3#4
+\cs_new_protected:Npn \ctex_declare_math_sizes:nnnn #1#2#3#4
{
\@@_get_font_sizes:Nn \l_@@_font_size_tl { {#1} {#2} {#3} {#4} }
\exp_after:wN \DeclareMathSizes \l_@@_font_size_tl
@@ -9131,7 +9671,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_get_font_sizes:Nn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_get_font_sizes:Nn #1#2
+\cs_new_protected:Npn \@@_get_font_sizes:Nn #1#2
{
\tl_clear:N #1
\tl_map_inline:nn {#2}
@@ -9178,16 +9718,16 @@ Copyright and Licence
{ \msg_error:nnn { ctex } { fontsize } {#2} }
}
\cs_new_protected:Npn \@@_set_font_size:nnNn #1#2#3#4
- { \cs_set_protected_nopar:Npn #3 { \@setfontsize #3 {#1} {#2} #4 } }
+ { \cs_set_protected:Npn #3 { \@setfontsize #3 {#1} {#2} #4 } }
% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
-\if_case:w \g_@@_font_size_int
- \ctex_file_input:n { ctex-c5size.clo }
-\or:
- \ctex_file_input:n { ctex-cs4size.clo }
-\fi:
+\int_case:nn { \g_@@_font_size_int }
+ {
+ { 0 } { \ctex_file_input:n { ctex-c5size.clo } }
+ { 1 } { \ctex_file_input:n { ctex-cs4size.clo } }
+ }
% \end{macrocode}
%
% \begin{macrocode}
@@ -9287,7 +9827,7 @@ Copyright and Licence
%
% \cs{l_@@_line_spread_fp} 被设置了才有必要更新行距和 \tn{footnotesep}。
% \begin{macrocode}
-\fp_compare:nNnF { \l_@@_line_spread_fp } ? { \c_zero_fp }
+\fp_if_nan:nF { \l_@@_line_spread_fp }
{
\exp_args:Nx \linespread { \fp_use:N \l_@@_line_spread_fp }
% \end{macrocode}
@@ -9310,7 +9850,7 @@ Copyright and Licence
\normalsize
% \end{macrocode}
%
-% \subsection{其它功能}
+% \subsection{其他功能}
%
% \begin{macro}{\CTeX}
% \changes{v2.4.12}{2017/12/05}{不依赖 \tn{ifincsname}。}
@@ -9332,11 +9872,11 @@ Copyright and Licence
% \begin{macro}{captiondelimiter}
% 过时选项。
% \begin{macrocode}
-\keys_define:nn { ctex }
+\ctex_define:n
{
captiondelimiter .code:n =
{
- \msg_warning:nnn { ctex } { deprecated-option }
+ \ctex_deprecated_option:n
{ You~can~load~the~package~`caption'~to~get~its~functionality. }
}
}
@@ -9368,56 +9908,113 @@ Copyright and Licence
% {解决 \pkg{etoolbox} 与 \pkg{breqn} 关于 \tn{end} 的冲突。}
% \changes{v2.2}{2015/06/23}{删去 \pkg{etoolbox} 与 \pkg{breqn} 的兼容补丁。}
%
-% \subsection{载入中文字体}
+% \subsection{载入中文字库}
%
% \begin{macro}[int]{\ctex_fontset_error:n}
% 字库不可用时给出紧急错误信息,停止读取定义文件。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_fontset_error:n #1
+\cs_new_protected:Npn \ctex_fontset_error:n #1
{ \msg_critical:nnn { ctex } { fontset-unavailable } {#1} }
\msg_new:nnn { ctex } { fontset-unavailable }
{ CTeX~fontset~`#1'~is~unavailable~in~current~mode. }
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[int]{\ctex_fontset_case:nnn}
+% $3$ 个参数依次为 \pdfTeX、\upTeX\ 和 \XeTeX/\LuaTeX。
+% \begin{macrocode}
+\cs_new:Npx \ctex_fontset_case:nnn #1#2#3
+ {
+ \sys_if_engine_pdftex:TF
+ {#1}
+ { \sys_if_engine_uptex:TF {#2} {#3} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_fontset_case:nnnn}
+% $4$ 个参数依次为 \pdfTeX(生成 PDF)、\pdfTeX(生成 DVI)、\upTeX 和
+% \XeTeX/\LuaTeX。
+% \begin{macrocode}
+\cs_new:Npx \ctex_fontset_case:nnnn #1#2#3#4
+ {
+ \sys_if_engine_pdftex:TF
+ { \sys_if_output_pdf:TF {#1} {#2} }
+ { \sys_if_engine_uptex:TF {#3} {#4} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_detect_platform:}
+% 根据操作系统判断默认字体配置。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_detect_platform:
+ {
+ \sys_if_platform_windows:TF
+ { \tl_gset:Nn \g_@@_fontset_tl { windows } }
+ {
+ \ctex_if_platform_macos:TF
+ { \tl_gset:Nn \g_@@_fontset_tl { mac } }
+ { \tl_gset:Nn \g_@@_fontset_tl { fandol } }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_if_platform_macos:TF}
+% \changes{v2.1}{2015/06/17}{改用 \file{/Library/Fonts/Songti.ttc} 为特征文件。}
+% \changes{v2.5}{2019/10/25}{改用 \file{/System/Library/Fonts/Menlo.ttc}
+% 为特征文件。}
+% 以特定字体判断 macOS 系统。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_if_platform_macos:TF
+ { \file_if_exist:nTF { /System/Library/Fonts/Menlo.ttc } }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[int]{\ctex_load_fontset:}
% 如果用户没有指定字体,则探测操作系统,载入相应的字体配置。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_load_fontset:
+\cs_new_protected:Npn \ctex_load_fontset:
{
\tl_if_empty:NTF \g_@@_fontset_tl
+ { \ctex_detect_platform: }
{
- \ctex_detected_platform:
- \ctex_file_input:n { ctex-fontset- \g_@@_fontset_tl .def }
- }
- {
- \file_if_exist:nTF { ctex-fontset- \g_@@_fontset_tl .def }
- { \ctex_file_input:n { ctex-fontset- \g_@@_fontset_tl .def } }
+ \bool_lazy_or:nnTF
+ { \str_if_eq_p:on { \g_@@_fontset_tl } { windowsnew } }
+ { \str_if_eq_p:on { \g_@@_fontset_tl } { windowsold } }
{
- \use:x
+ \msg_warning:nnxx { ctex } { deprecated-fontset }
+ { \g_@@_fontset_tl } { windows }
+ \tl_gset:Nn \g_@@_fontset_tl { windows }
+ }
+ {
+ \file_if_exist:nF { ctex-fontset- \g_@@_fontset_tl .def }
{
- \ctex_detected_platform:
- \msg_error:nnxx { ctex } { fontset-not-found }
- { \g_@@_fontset_tl } { \exp_not:N \g_@@_fontset_tl }
+ \use:x
+ {
+ \ctex_detect_platform:
+ \msg_error:nnxx { ctex } { fontset-not-found }
+ { \g_@@_fontset_tl } { \exp_not:N \g_@@_fontset_tl }
+ }
}
- \ctex_file_input:n { ctex-fontset- \g_@@_fontset_tl .def }
}
}
+ \ctex_file_input:n { ctex-fontset- \g_@@_fontset_tl .def }
}
-\@onlypreamble \ctex_load_fontset:
+\msg_new:nnn { ctex } { deprecated-fontset }
+ { CTeX~fontset~`#1'~is~deprecated.\\ Fontset~`#2'~will~be~used~instead. }
\msg_new:nnnn { ctex } { fontset-not-found }
- {
- CTeX~fontset~`#1'~could~not~be~found.\\
- Fontset~`#2'~will~be~used~instead.
- }
+ { CTeX~fontset~`#1'~could~not~be~found.\\ Fontset~`#2'~will~be~used~instead. }
{ You~may~run~`mktexlsr'~firstly. }
+\@onlypreamble \ctex_load_fontset:
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{fontset}
% 在导言区通过 \tn{ctexset} 载入中文字库的选项。
% \begin{macrocode}
-\keys_define:nn { ctex }
+\ctex_define:n
{
fontset .code:n =
{
@@ -9447,9 +10044,7 @@ Copyright and Licence
}
{ Only~one~fontset~can~be~loaded~in~the~preamble. }
\msg_new:nnn { ctex } { fontset-only-preamble }
- {
- The~ `fontset'~ option~ can~ be~ used~ only~ in~ preamble.
- }
+ { The~`fontset'~option~can~be~used~only~in~preamble. }
% \end{macrocode}
% \end{macro}
%
@@ -9479,11 +10074,11 @@ Copyright and Licence
%
% \subsubsection{\pkg{ctexopts.cfg}}
%
-% 这里仅为配置文件示例:使用 Windows Vista 或以后版本的字体设置。
+% 这里仅为配置文件示例:使用 Windows 下的字体设置。
% \begin{macrocode}
%<*ctexopts>
%%
-%% \keys_set:nn { ctex / option } { fontset = windowsnew }
+%% \ctex_set:nn { option } { fontset = windows }
%</ctexopts>
% \end{macrocode}
%
@@ -9555,11 +10150,13 @@ Copyright and Licence
%<*jy2>
\DeclareFontShape{JY2}{zhrm}{m}{n}{<-> upzhserif-h}{}
\DeclareFontShape{JY2}{zhrm}{m}{it}{<-> upzhserifit-h}{}
+\DeclareFontShape{JY2}{zhrm}{b}{n}{<-> upzhserifb-h}{}
\DeclareFontShape{JY2}{zhrm}{bx}{n}{<-> upzhserifb-h}{}
%</jy2>
%<*jt2>
\DeclareFontShape{JT2}{zhrm}{m}{n}{<-> upzhserif-v}{}
\DeclareFontShape{JT2}{zhrm}{m}{it}{<-> upzhserifit-v}{}
+\DeclareFontShape{JT2}{zhrm}{b}{n}{<-> upzhserifb-v}{}
\DeclareFontShape{JT2}{zhrm}{bx}{n}{<-> upzhserifb-v}{}
%</jt2>
%</rm>
@@ -9591,10 +10188,12 @@ Copyright and Licence
%</c70>
%<*jy2>
\DeclareFontShape{JY2}{zhsf}{m}{n}{<-> upzhsans-h}{}
+\DeclareFontShape{JY2}{zhsf}{b}{n}{<-> upzhsansb-h}{}
\DeclareFontShape{JY2}{zhsf}{bx}{n}{<-> upzhsansb-h}{}
%</jy2>
%<*jt2>
\DeclareFontShape{JT2}{zhsf}{m}{n}{<-> upzhsans-v}{}
+\DeclareFontShape{JT2}{zhsf}{b}{n}{<-> upzhsansb-v}{}
\DeclareFontShape{JT2}{zhsf}{bx}{n}{<-> upzhsansb-v}{}
%</jt2>
%</sf>
@@ -9633,307 +10232,241 @@ Copyright and Licence
%</tt>
% \end{macrocode}
%
+% \subsubsection{预定义字库}
+%
% \begin{macrocode}
%<*fontset>
% \end{macrocode}
%
-% \subsubsection{\pkg{ctex-fontset-windows.def} 等}
-%
-% \changes{v2.4.1}{2016/05/14}{使用 \file{bootfont.bin} 判断 Windows XP 以避免
-% 权限问题。}
-% \pkg{ctex} 包利用 |C:\bootfont.bin| 文件的存在性来判断是否使用 Windows XP 版
-% 本,分别载入新旧字体设置。(注:\pkg{ctex} 包不支持 Windows 2000 以前使用
-% \file{simsun.ttf} 的旧宋体文件名。)
-% \begin{macrocode}
-%<*windows>
-\file_if_exist:nTF { C:/bootfont.bin }
- { \ctex_file_input:n { ctex-fontset-windowsold.def } }
- { \ctex_file_input:n { ctex-fontset-windowsnew.def } }
-%</windows>
-% \end{macrocode}
+% \paragraph{\opt{adobe}}
%
-% 旧的 Windows 字体设置使用黑体作为无衬线体,楷体和仿宋是 GB2312 编码;新的
-% Windows 字体设置使用微软雅黑作为无衬线体,楷体和仿宋是大字库。
-% Windows 8 以后,微软雅黑由原来的 \file{.ttf} 后缀改为 \file{.ttc} 后缀,需要
-% 加以区分。
+% \tn{pdfmapline} 不支持 OpenType 字体,因而 \opt{adobe} 字体集在 pdf 模式下
+% 就没有定义。\opt{fandol} 的情况类似。
% \begin{macrocode}
-%<*windowsnew>
-\tl_new:N \l_@@_msyh_suffix_tl
-\tl_set:Nn \l_@@_msyh_suffix_tl { .ttc }
-\file_if_exist:nF { C:/Windows/Fonts/msyh.ttc }
- {
- \file_if_exist:nF { msyh.ttc }
- { \tl_set:Nn \l_@@_msyh_suffix_tl { .ttf } }
- }
-%</windowsnew>
-%<*windowsnew|windowsold>
-\sys_if_engine_pdftex:TF
+%<*adobe>
+\ctex_fontset_case:nnnn
+ { \ctex_fontset_error:n { adobe } }
{
\ctex_zhmap_case:nnn
{
- \ctex_punct_set:n { windows }
- \setCJKmainfont
- [ BoldFont = simhei.ttf , ItalicFont = simkai.ttf ] { simsun.ttc }
-%<*windowsold>
- \setCJKsansfont { simhei.ttf }
- \ctex_punct_map_family:nn { \CJKsfdefault } { zhhei }
-%</windowsold>
-%<*windowsnew>
- \setCJKsansfont
- [ BoldFont = msyhbd\l_@@_msyh_suffix_tl ] { msyh\l_@@_msyh_suffix_tl }
- \setCJKfamilyfont { zhyahei }
- [ BoldFont = msyhbd\l_@@_msyh_suffix_tl ] { msyh\l_@@_msyh_suffix_tl }
- \ctex_punct_map_family:nn { \CJKsfdefault } { zhyahei }
- \ctex_punct_map_bfseries:nn { \CJKsfdefault , zhyahei } { zhyaheib }
-%</windowsnew>
- \setCJKmonofont { simfang.ttf }
- \setCJKfamilyfont { zhkai } { simkai.ttf }
- \setCJKfamilyfont { zhfs } { simfang.ttf }
- \setCJKfamilyfont { zhsong } { simsun.ttc }
- \setCJKfamilyfont { zhhei } { simhei.ttf }
- \setCJKfamilyfont { zhli } { simli.ttf }
- \setCJKfamilyfont { zhyou } { simyou.ttf }
- \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
- \ctex_punct_map_family:nn { \CJKttdefault } { zhfs }
- \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
- \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
- }
- {
- \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { zhwindowsfonts }
- \ctex_punct_set:n { windows }
- \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
- \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
- \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
- }
- {
- \tl_set:Nn \CJKrmdefault { rm }
- \tl_set:Nn \CJKsfdefault { sf }
- \tl_set:Nn \CJKttdefault { tt }
+ \setCJKmainfont { AdobeSongStd-Light.otf }
+ [
+ cmap = UniGB-UTF16-H,
+ BoldFont = AdobeHeitiStd-Regular.otf,
+ ItalicFont = AdobeKaitiStd-Regular.otf
+ ]
+ \setCJKsansfont { AdobeHeitiStd-Regular.otf }
+ [ cmap = UniGB-UTF16-H ]
+ \setCJKmonofont { AdobeFangsongStd-Regular.otf }
+ [ cmap = UniGB-UTF16-H ]
+ \setCJKfamilyfont { zhsong } { AdobeSongStd-Light.otf }
+ [ cmap = UniGB-UTF16-H ]
+ \setCJKfamilyfont { zhhei } { AdobeHeitiStd-Regular.otf }
+ [ cmap = UniGB-UTF16-H ]
+ \setCJKfamilyfont { zhkai } { AdobeKaitiStd-Regular.otf }
+ [ cmap = UniGB-UTF16-H ]
+ \setCJKfamilyfont { zhfs } { AdobeFangsongStd-Regular.otf }
+ [ cmap = UniGB-UTF16-H ]
+ \ctex_punct_set:n { adobe }
+ \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
+ \ctex_punct_map_family:nn { \CJKsfdefault } { zhhei }
+ \ctex_punct_map_family:nn { \CJKttdefault } { zhfs }
+ \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
+ \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
+ }
+ {
+ \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { adobe }
+ \ctex_punct_set:n { adobe }
+ \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
+ \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
+ \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
}
+ { \ctex_fontset_error:n { adobe } }
}
{
- \sys_if_engine_uptex:TF
- {
- \ctex_set_upfonts:nnnnnn
- {simsun.ttc} {simhei.ttf} {simkai.ttf}
-%<windowsnew> {msyh\l_@@_msyh_suffix_tl} {msyhbd\l_@@_msyh_suffix_tl}
-%<windowsold> {simhei.ttf} {simhei.ttf}
- {simfang.ttf}
- \ctex_set_upfamily:nnn { zhsong } { upzhserif } {}
- \ctex_set_upfamily:nnn { zhhei } { upzhserifb } {}
- \ctex_set_upfamily:nnn { zhfs } { upzhmono} {}
- \ctex_set_upfamily:nnn { zhkai } { upzhserifit } {}
-%<windowsnew> \ctex_set_upfamily:nnn { zhyahei } { upzhsans } { upzhsansb }
- \ctex_set_upfamily:nnn { zhli } { upschrm } {}
- \ctex_set_upmap:nnn { upstsl } { simli.ttf } {}
- \ctex_set_upfamily:nnn { zhyou } { upschgt } {}
- \ctex_set_upmap:nnn { upstht } { simyou.ttf } {}
- }
- {
-%<*windowsold>
- \setCJKmainfont
- [ BoldFont = SimHei , ItalicFont = KaiTi_GB2312 ] { SimSun }
- \setCJKsansfont { SimHei }
- \setCJKmonofont { FangSong_GB2312 }
- \setCJKfamilyfont { zhkai } { KaiTi_GB2312 }
- \setCJKfamilyfont { zhfs } { FangSong_GB2312 }
-%</windowsold>
-%<*windowsnew>
- \setCJKmainfont
- [ BoldFont = SimHei , ItalicFont = KaiTi ] { SimSun }
- \setCJKsansfont
- [ BoldFont = { *~Bold } ] { Microsoft~YaHei }
- \setCJKmonofont { FangSong }
- \setCJKfamilyfont { zhkai } { KaiTi }
- \setCJKfamilyfont { zhfs } { FangSong }
-%</windowsnew>
- \setCJKfamilyfont { zhsong } { SimSun }
- \setCJKfamilyfont { zhhei } { SimHei }
- \setCJKfamilyfont { zhli } { LiSu }
- \setCJKfamilyfont { zhyou } { YouYuan }
-%<*windowsnew>
- \setCJKfamilyfont { zhyahei }
- [ BoldFont = { *~Bold } ] { Microsoft~YaHei }
-%</windowsnew>
- }
+ \ctex_set_upfonts:nnnnnn
+ { AdobeSongStd-Light.otf }
+ { AdobeHeitiStd-Regular.otf }
+ { AdobeKaitiStd-Regular.otf }
+ { AdobeHeitiStd-Regular.otf }
+ { AdobeHeitiStd-Regular.otf }
+ { AdobeFangsongStd-Regular.otf }
+ \ctex_set_upfamily:nnn { zhsong } { upzhserif } {}
+ \ctex_set_upfamily:nnn { zhhei } { upzhsans } {}
+ \ctex_set_upfamily:nnn { zhfs } { upzhmono } {}
+ \ctex_set_upfamily:nnn { zhkai } { upzhserifit } {}
+ }
+ {
+ \setCJKmainfont { AdobeSongStd-Light }
+ [ BoldFont = AdobeHeitiStd-Regular, ItalicFont = AdobeKaitiStd-Regular ]
+ \setCJKsansfont { AdobeHeitiStd-Regular }
+ \setCJKmonofont { AdobeFangsongStd-Regular }
+ \setCJKfamilyfont { zhsong } { AdobeSongStd-Light }
+ \setCJKfamilyfont { zhhei } { AdobeHeitiStd-Regular }
+ \setCJKfamilyfont { zhfs } { AdobeFangsongStd-Regular }
+ \setCJKfamilyfont { zhkai } { AdobeKaitiStd-Regular }
}
-%</windowsnew|windowsold>
+%</adobe>
% \end{macrocode}
%
-% \subsubsection{\pkg{ctex-fontset-adobe.def}}
-%
-% \begin{macrocode}
-%<*adobe>
-% \end{macrocode}
+% \paragraph{\opt{fandol}}
%
-% \tn{pdfmapline} 不支持 OpenType 字体,因而 \opt{adobe} 字体集在 pdf 模式下
-% 就没有定义。\opt{fandol} 的情况类似。
% \begin{macrocode}
-\sys_if_engine_pdftex:TF
+%<*fandol>
+\ctex_fontset_case:nnnn
+ { \ctex_fontset_error:n { fandol } }
{
- \sys_if_output_pdf:TF
- { \ctex_fontset_error:n { adobe } }
+ \ctex_zhmap_case:nnn
{
- \ctex_zhmap_case:nnn
- {
- \setCJKmainfont
- [
- cmap = UniGB-UTF16-H ,
- BoldFont = AdobeHeitiStd-Regular.otf ,
- ItalicFont = AdobeKaitiStd-Regular.otf
- ] { AdobeSongStd-Light.otf }
- \setCJKsansfont [ cmap = UniGB-UTF16-H ] { AdobeHeitiStd-Regular.otf }
- \setCJKmonofont [ cmap = UniGB-UTF16-H ] { AdobeFangsongStd-Regular.otf }
- \setCJKfamilyfont { zhsong }
- [ cmap = UniGB-UTF16-H ] { AdobeSongStd-Light.otf }
- \setCJKfamilyfont { zhhei }
- [ cmap = UniGB-UTF16-H ] { AdobeHeitiStd-Regular.otf }
- \setCJKfamilyfont { zhkai }
- [ cmap = UniGB-UTF16-H ] { AdobeKaitiStd-Regular.otf }
- \setCJKfamilyfont { zhfs }
- [ cmap = UniGB-UTF16-H ] { AdobeFangsongStd-Regular.otf }
- \ctex_punct_set:n { adobe }
- \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
- \ctex_punct_map_family:nn { \CJKsfdefault } { zhhei }
- \ctex_punct_map_family:nn { \CJKttdefault } { zhfs }
- \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
- \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
- }
- {
- \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { zhadobefonts }
- \ctex_punct_set:n { adobe }
- \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
- \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
- \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
- }
- { \ctex_fontset_error:n { adobe } }
+ \setCJKmainfont { FandolSong-Regular.otf }
+ [
+ cmap = UniGB-UTF16-H,
+ BoldFont = FandolSong-Bold.otf,
+ ItalicFont = FandolKai-Regular.otf
+ ]
+ \setCJKsansfont { FandolHei-Regular.otf }
+ [ cmap = UniGB-UTF16-H, BoldFont = FandolHei-Bold.otf ]
+ \setCJKmonofont { FandolFang-Regular.otf }
+ [ cmap = UniGB-UTF16-H ]
+ \setCJKfamilyfont { zhsong } { FandolSong-Regular.otf }
+ [ cmap = UniGB-UTF16-H, BoldFont = FandolSong-Bold.otf ]
+ \setCJKfamilyfont { zhhei } { FandolHei-Regular.otf }
+ [ cmap = UniGB-UTF16-H, BoldFont = FandolHei-Bold.otf ]
+ \setCJKfamilyfont { zhfs } { FandolFang-Regular.otf }
+ [ cmap = UniGB-UTF16-H ]
+ \setCJKfamilyfont { zhkai } { FandolKai-Regular.otf }
+ [ cmap = UniGB-UTF16-H ]
+ \ctex_punct_set:n { fandol }
+ \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
+ \ctex_punct_map_family:nn { \CJKsfdefault } { zhhei }
+ \ctex_punct_map_family:nn { \CJKttdefault } { zhfs }
+ \ctex_punct_map_bfseries:nn { \CJKrmdefault, zhsong } { zhsongb }
+ \ctex_punct_map_bfseries:nn { \CJKsfdefault, zhhei } { zhheib }
+ \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
+ }
+ {
+ \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { fandol }
+ \ctex_punct_set:n { fandol }
+ \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
+ \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
+ \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
}
+ { \ctex_fontset_error:n { fandol } }
}
{
- \sys_if_engine_uptex:TF
- {
- \ctex_set_upfonts:nnnnnn
- {AdobeSongStd-Light.otf} {AdobeHeitiStd-Regular.otf} {AdobeKaitiStd-Regular.otf}
- {AdobeHeitiStd-Regular.otf} {AdobeHeitiStd-Regular.otf}
- {AdobeFangsongStd-Regular.otf}
- \ctex_set_upfamily:nnn { zhsong } { upzhserif } {}
- \ctex_set_upfamily:nnn { zhhei } { upzhsans } {}
- \ctex_set_upfamily:nnn { zhfs } { upzhmono} {}
- \ctex_set_upfamily:nnn { zhkai } { upzhserifit } {}
- }
- {
- \setCJKmainfont
- [
- BoldFont = AdobeHeitiStd-Regular ,
- ItalicFont = AdobeKaitiStd-Regular
- ] { AdobeSongStd-Light }
- \setCJKsansfont { AdobeHeitiStd-Regular}
- \setCJKmonofont { AdobeFangsongStd-Regular}
- \setCJKfamilyfont { zhsong } { AdobeSongStd-Light }
- \setCJKfamilyfont { zhhei } { AdobeHeitiStd-Regular }
- \setCJKfamilyfont { zhfs } { AdobeFangsongStd-Regular }
- \setCJKfamilyfont { zhkai } { AdobeKaitiStd-Regular }
- }
+ \ctex_set_upfonts:nnnnnn
+ { FandolSong-Regular.otf }
+ { FandolSong-Bold.otf }
+ { FandolKai-Regular.otf }
+ { FandolHei-Regular.otf }
+ { FandolHei-Bold.otf }
+ { FandolFang-Regular.otf }
+ \ctex_set_upfamily:nnn { zhsong } { upzhserif } { upzhserifb }
+ \ctex_set_upfamily:nnn { zhhei } { upzhsans } { upzhsansb }
+ \ctex_set_upfamily:nnn { zhfs } { upzhmono } {}
+ \ctex_set_upfamily:nnn { zhkai } { upzhserifit } {}
+ }
+ {
+ \setCJKmainfont { FandolSong-Regular }
+ [
+ Extension = .otf,
+ BoldFont = FandolSong-Bold,
+ ItalicFont = FandolKai-Regular
+ ]
+ \setCJKsansfont { FandolHei-Regular }
+ [ Extension = .otf, BoldFont = FandolHei-Bold ]
+ \setCJKmonofont { FandolFang-Regular }
+ [ Extension = .otf ]
+ \setCJKfamilyfont { zhsong } { FandolSong-Regular }
+ [ Extension = .otf, BoldFont = FandolSong-Bold ]
+ \setCJKfamilyfont { zhhei } { FandolHei-Regular }
+ [ Extension = .otf, BoldFont = FandolHei-Bold ]
+ \setCJKfamilyfont { zhfs } { FandolFang-Regular }
+ [ Extension = .otf ]
+ \setCJKfamilyfont { zhkai } { FandolKai-Regular }
+ [ Extension = .otf ]
}
+%</fandol>
% \end{macrocode}
%
-% \begin{macrocode}
-%</adobe>
-%<*fandol>
-% \end{macrocode}
+% \paragraph{\opt{founder}}
%
-% \subsubsection{\pkg{ctex-fontset-fandol.def}}
+% \changes{v2.4.15}{2019/03/28}{统一“方正细黑一\_GBK”的名称为 \texttt{FZXiHeiI-Z08}。}
%
% \begin{macrocode}
-\sys_if_engine_pdftex:TF
- {
- \sys_if_output_pdf:TF
- { \ctex_fontset_error:n { fandol } }
- {
- \ctex_zhmap_case:nnn
- {
- \setCJKmainfont
- [
- cmap = UniGB-UTF16-H ,
- BoldFont = FandolSong-Bold.otf ,
- ItalicFont = FandolKai-Regular.otf
- ] { FandolSong-Regular.otf }
- \setCJKsansfont
- [
- cmap = UniGB-UTF16-H ,
- BoldFont = FandolHei-Bold.otf
- ] { FandolHei-Regular.otf }
- \setCJKmonofont [ cmap = UniGB-UTF16-H ] { FandolFang-Regular.otf }
- \setCJKfamilyfont { zhsong }
- [
- cmap = UniGB-UTF16-H ,
- BoldFont = FandolSong-Bold.otf
- ] { FandolSong-Regular.otf }
- \setCJKfamilyfont { zhhei }
- [
- cmap = UniGB-UTF16-H ,
- BoldFont = FandolHei-Bold.otf
- ] { FandolHei-Regular.otf }
- \setCJKfamilyfont { zhfs }
- [ cmap = UniGB-UTF16-H ] { FandolFang-Regular.otf }
- \setCJKfamilyfont { zhkai }
- [ cmap = UniGB-UTF16-H ] { FandolKai-Regular.otf }
- \ctex_punct_set:n { fandol }
- \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
- \ctex_punct_map_family:nn { \CJKsfdefault } { zhhei }
- \ctex_punct_map_family:nn { \CJKttdefault } { zhfs }
- \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
- \ctex_punct_map_bfseries:nn { \CJKrmdefault , zhsong } { zhsongb }
- \ctex_punct_map_bfseries:nn { \CJKsfdefault , zhhei } { zhheib }
- }
- {
- \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { zhfandolfonts }
- \ctex_punct_set:n { fandol }
- \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
- \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
- \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
- }
- { \ctex_fontset_error:n { fandol } }
- }
- }
+%<*founder>
+\ctex_fontset_case:nnn
{
- \sys_if_engine_uptex:TF
+ \ctex_zhmap_case:nnn
{
- \ctex_set_upfonts:nnnnnn
- {FandolSong-Regular.otf} {FandolSong-Bold.otf} {FandolKai-Regular.otf}
- {FandolHei-Regular.otf} {FandolHei-Bold.otf}
- {FandolFang-Regular.otf}
- \ctex_set_upfamily:nnn { zhsong } { upzhserif } { upzhserifb }
- \ctex_set_upfamily:nnn { zhhei } { upzhsans } { upzhsansb }
- \ctex_set_upfamily:nnn { zhfs } { upzhmono} {}
- \ctex_set_upfamily:nnn { zhkai } { upzhserifit } {}
+ \setCJKmainfont { FZSSK.TTF }
+ [ BoldFont = FZXBSK.TTF, ItalicFont = FZKTK.TTF ]
+ \setCJKsansfont { FZXH1K.TTF } [ BoldFont = FZHTK.TTF ]
+ \setCJKmonofont { FZFSK.TTF }
+ \setCJKfamilyfont { zhsong } { FZSSK.TTF } [ BoldFont = FZXBSK.TTF ]
+ \setCJKfamilyfont { zhhei } { FZHTK.TTF }
+ \setCJKfamilyfont { zhkai } { FZKTK.TTF }
+ \setCJKfamilyfont { zhfs } { FZFSK.TTF }
+ \setCJKfamilyfont { zhli } { FZLSK.TTF }
+ \setCJKfamilyfont { zhyou } { FZY1K.TTF } [ BoldFont = FZY3K.TTF ]
+ \ctex_punct_set:n { founder }
+ \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
+ \ctex_punct_map_family:nn { \CJKsfdefault } { zhheil }
+ \ctex_punct_map_family:nn { \CJKttdefault } { zhfs }
+ \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
+ \ctex_punct_map_bfseries:nn { \CJKrmdefault, zhsong } { zhsongb }
+ \ctex_punct_map_bfseries:nn { \CJKsfdefault } { zhhei }
+ \ctex_punct_map_bfseries:nn { zhyou } { zhyoub }
}
{
- \setCJKmainfont
- [
- Extension = .otf ,
- BoldFont = FandolSong-Bold , ItalicFont = FandolKai-Regular
- ]
- { FandolSong-Regular }
- \setCJKsansfont
- [ Extension = .otf , BoldFont = FandolHei-Bold ] { FandolHei-Regular }
- \setCJKmonofont [ Extension = .otf ] { FandolFang-Regular }
- \setCJKfamilyfont { zhsong }
- [ Extension = .otf , BoldFont = FandolSong-Bold ] { FandolSong-Regular }
- \setCJKfamilyfont { zhhei }
- [ Extension = .otf , BoldFont = FandolHei-Bold ] { FandolHei-Regular }
- \setCJKfamilyfont { zhfs } [ Extension = .otf ] { FandolFang-Regular }
- \setCJKfamilyfont { zhkai } [ Extension = .otf ] { FandolKai-Regular }
+ \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { founder }
+ \ctex_punct_set:n { founder }
+ \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
+ \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
+ \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
}
+ { \ctex_fontset_error:n { founder } }
+ }
+ {
+ \ctex_set_upfonts:nnnnnn
+ { FZSSK.TTF }
+ { FZXBSK.TTF }
+ { FZKTK.TTF }
+ { FZXH1K.TTF }
+ { FZHTK.TTF }
+ { FZFSK.TTF }
+ \ctex_set_upfamily:nnn { zhsong } { upzhserif } { upzhserifb }
+ \ctex_set_upfamily:nnn { zhhei } { upzhsans } { upzhsansb }
+ \ctex_set_upfamily:nnn { zhfs } { upzhmono } {}
+ \ctex_set_upfamily:nnn { zhkai } { upzhserifit } {}
+ \ctex_set_upfamily:nnn { zhli } { upschrm } {}
+ \ctex_set_upfamily:nnn { zhyou } { upschgt } {}
+ \ctex_set_upmap:nnn { upstsl } { FZLSK.TTF } {}
+ \ctex_set_upmap:nnn { upstht } { FZY1K.TTF } {}
+ }
+ {
+ \setCJKmainfont { FZShuSong-Z01 }
+ [ BoldFont = FZXiaoBiaoSong-B05, ItalicFont = FZKai-Z03 ]
+ \setCJKsansfont { FZXiHeiI-Z08 } [ BoldFont = FZHei-B01 ]
+ \setCJKmonofont { FZFangSong-Z02 }
+ \setCJKfamilyfont { zhsong } { FZShuSong-Z01 }
+ [ BoldFont = FZXiaoBiaoSong-B05 ]
+ \setCJKfamilyfont { zhhei } { FZHei-B01 }
+ \setCJKfamilyfont { zhkai } { FZKai-Z03 }
+ \setCJKfamilyfont { zhfs } { FZFangSong-Z02 }
+ \setCJKfamilyfont { zhli } { FZLiShu-S01 }
+ \setCJKfamilyfont { zhyou } { FZXiYuan-M01 }
+ [ BoldFont = FZZhunYuan-M02 ]
}
+%</founder>
% \end{macrocode}
%
-% \begin{macrocode}
-%</fandol>
-% \end{macrocode}
+% \changes{v2.5.2}{2020/05/06}
+% {修正 \opt{macnew} 和 \opt{ubuntu} 字库的 \pkg{CJKpunct} 标点信息。}
%
-% \subsubsection{\pkg{ctex-fontset-mac.def} 等}
-% \changes{v2.4.14}{2018/05/01}{区分 \texttt{macold} 及 \texttt{macnew}。}
+% \paragraph{\opt{mac} 相关}
+%
+% \changes{v2.4.14}{2018/05/01}{区分 \opt{macold} 及 \opt{macnew}。}
%
% 按 \href{https://github.com/CTeX-org/ctex-kit/issues/351}{Issue 351}
% 的讨论,以 El Capitan 为分界,分别设置 |macold|(El Capitan 之前)
@@ -9948,273 +10481,321 @@ Copyright and Licence
%</mac>
% \end{macrocode}
%
-% |macold| 的设置参考了 ^^A
-% \href{https://github.com/CTeX-org/ctex-kit/wiki/OS-X-Mavericks-(10.9)-\%E9\%A2\%84\%E8\%A3\%85\%E7\%9A\%84\%E4\%B8\%BB\%E8\%A6\%81\%E7\%AE\%80\%E4\%BD\%93\%E4\%B8\%AD\%E6\%96\%87\%E5\%AD\%97\%E4\%BD\%93}^^A
-% {OS X Mavericks (10.9) 预装的主要简体中文字体列表}。
-%
-% 在 \dvipdfmx{} 下,可以通过下述方式使用华文宋体和华文楷体:
-% \begin{verbatim}
-% \special{pdf:mapline unisong@Unicode@ unicode :4:Songti.ttc}
-% \special{pdf:mapline unikai@Unicode@ unicode :4:Kaiti.ttc}
-% \end{verbatim}
-% 而 \tn{pdfmapline} 似乎不支持带索引的 \texttt{ttc} 字体,\file{Songti.ttc} 默认
-% 使用的是 Songti SC Black,\file{Kaiti.ttc} 默认使用的是 Kaiti SC Black。
-% 华文黑体不能通过这种方式使用:
-% \begin{verbatim}
-% \special{pdf:mapline unihei@Unicode@ unicode \detokenize{华文黑体}.ttf}
-% \end{verbatim}
-% \dvipdfmx{} 不能生成 PDF,报下述错误:
-% \begin{verbatim}
-% ** WARNING ** UCS-4 TrueType cmap table...
-% ** ERROR ** Unable to read OpenType/TrueType Unicode cmap table.
-% \end{verbatim}
-% 如果将 CMap 改为 UniGB-UTF16-H,错误信息是
-% \begin{verbatim}
-% ** WARNING ** No usable TrueType cmap table found for font "华文黑体.ttf".
-% ** WARNING ** CID character collection for this font is set to "Adobe-GB1"
-% ** ERROR ** Cannot continue without this...
-% \end{verbatim}
-% 在 \pdfTeX{} 下生成的 PDF 只有方框^^A
-% \footnote{\url{http://www.newsmth.net/bbscon.php?bid=460&id=312640}}。
-% 华文细黑和华文仿宋的情况类似。
-% 这确认为 \dvipdfmx{} 的 bug^^A
-% \begingroup\makeatletter\@makeother\#\@firstofone{\endgroup
-% \footnote{\url{https://github.com/clerkma/ptex-ng/blob/master/texk/libdpx/cidtype2.c#L597}}}。
+% \changes{v2.4.14}{2018/05/01}{配置 \opt{macnew} 的默认字体设置。}
+% \changes{v2.5}{2019/11/05}{为 \opt{macnew} 增加粗楷体、隶书和圆体的定义。}
+% \changes{v2.5}{2019/11/07}{允许 \opt{macnew} 在 \LaTeX{} 和 \upLaTeX{} 下使用。}
%
-% \changes{v2.4.14}{2018/05/01}{配置 \texttt{macnew} 的默认字体设置。}
+% |macold| 的设置参考了
+% \href{https://github.com/CTeX-org/ctex-kit/wiki/OS-X-Mavericks-(10.9)-预装的主要简体中文字体}^^A
+% {OS X Mavericks (10.9) 预装的主要简体中文字体列表}。
%
% |macnew| 在默认字体设置方面,引入了多字重的宋体作为罗马字族,
% 以及引入了苹方黑体作为无衬线字族。
-%
% 由于 Songti SC Light 的字重与 STSong 及 Windows 上的 SimSun 更接近,故默认字重
-% 使用 Songti SC Light,而不带后缀的正常字重事实上没有使用。下方关于 |zhsong| 的字族
-% 设置也有同样的情况。
+% 使用 Songti SC Light,而不带后缀的正常字重事实上没有使用。黑体、圆体等设置
+% 也有类似的情况。
%
% \begin{macrocode}
%<*macold|macnew>
-\sys_if_engine_pdftex:TF
+\ctex_fontset_case:nnnn
{ \ctex_fontset_error:n { mac } }
- {
- \sys_if_engine_uptex:TF
- { \ctex_fontset_error:n { mac } }
- {
%<*macold>
- \setCJKmainfont [ BoldFont = STHeiti , ItalicFont = STKaiti ] { STSong }
- \setCJKsansfont [ BoldFont = STHeiti ] { STXihei }
+ { \ctex_fontset_error:n { macold } }
+ { \ctex_fontset_error:n { macold } }
%</macold>
%<*macnew>
- \setCJKmainfont
+ {
+ \ctex_zhmap_case:nnn
+ {
+ \setCJKmainfont { :3:Songti.ttc }
[
- UprightFont = *~Light ,
- BoldFont = *~Bold ,
- ItalicFont = Kaiti~SC ,
- BoldItalicFont = Kaiti~SC~Bold
- ] { Songti~SC }
- \setCJKsansfont { PingFang~SC }
+ BoldFont = :1:Songti.ttc,
+ ItalicFont = :0:Kaiti.ttc,
+ BoldItalicFont = :3:Kaiti.ttc,
+ ]
+ \setCJKsansfont { :2:PingFang.ttc } [ BoldFont = :8:PingFang.ttc ]
+ \setCJKmonofont { STFANGSO.ttf }
+ \setCJKfamilyfont { zhsong } { :3:Songti.ttc } [ BoldFont = :1:Songti.ttc ]
+ \setCJKfamilyfont { zhhei } { :2:PingFang.ttc } [ BoldFont = :8:PingFang.ttc ]
+ \setCJKfamilyfont { zhkai } { :0:Kaiti.ttc } [ BoldFont = :3:Kaiti.ttc ]
+ \setCJKfamilyfont { zhfs } { STFANGSO.ttf }
+ \setCJKfamilyfont { zhli } { :0:Baoli.ttc }
+ \setCJKfamilyfont { zhyou } { :4:Yuanti.ttc } [ BoldFont = :0:Yuanti.ttc ]
+ \ctex_punct_set:n { mac }
+ \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
+ \ctex_punct_map_family:nn { \CJKsfdefault } { zhpf }
+ \ctex_punct_map_family:nn { \CJKttdefault } { zhfs }
+ \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
+ \ctex_punct_map_bfseries:nn { \CJKrmdefault, zhsong } { zhsongb }
+ \ctex_punct_map_bfseries:nn { \CJKsfdefault, zhhei } { zhpfb }
+ \ctex_punct_map_bfseries:nn { zhyou } { zhyoub }
+ }
+ {
+ \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { mac }
+ \ctex_punct_set:n { mac }
+ \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
+ \ctex_punct_map_family:nn { \CJKsfdefault } { zhpf }
+ \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhpf }
+ \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
+ }
+ { \ctex_fontset_error:n { macnew } }
+ }
+ {
+ \ctex_set_upmap:nnn { upserif } { :3:Songti.ttc } { :1:Songti.ttc }
+ \ctex_set_upmap:nnn { upserifit } { :0:Kaiti.ttc } { }
+ \ctex_set_upmap:nnn { upstsl } { :0:Baoli.ttc } { }
+ \ctex_set_upmap:nnn { upstht } { :4:Yuanti.ttc } { }
+ \ctex_set_upmap_unicode:nnn { upsans } { :2:PingFang.ttc } { :8:PingFang.ttc }
+ \ctex_set_upmap_unicode:nnn { upmono } { STFANGSO.ttf } { }
+ \ctex_set_upfamily:nnn { zhsong } { upzhserif } { upzhserifb }
+ \ctex_set_upfamily:nnn { zhhei } { upzhsans } { upzhsansb }
+ \ctex_set_upfamily:nnn { zhfs } { upzhmono } { }
+ \ctex_set_upfamily:nnn { zhkai } { upzhserifit } { }
+ \ctex_set_upfamily:nnn { zhli } { upschrm } { }
+ \ctex_set_upfamily:nnn { zhyou } { upschgt } { }
+ }
%</macnew>
- \setCJKmonofont { STFangsong }
+ {
%<*macold>
- \setCJKfamilyfont { zhsong } { STSong }
- \setCJKfamilyfont { zhhei } { STHeiti }
+ \setCJKmainfont { STSong }
+ [ BoldFont = STHeiti, ItalicFont = STKaiti ]
+ \setCJKsansfont { STXihei } [ BoldFont = STHeiti ]
+ \setCJKmonofont { STFangsong }
+ \setCJKfamilyfont { zhsong } { STSong }
+ \setCJKfamilyfont { zhhei } { STHeiti }
+ \setCJKfamilyfont { zhfs } { STFangsong }
+ \setCJKfamilyfont { zhkai } { STKaiti }
%</macold>
%<*macnew>
- \setCJKfamilyfont { zhsong }
- [
- UprightFont = *~Light ,
- BoldFont = *~Bold ,
- ] { Songti~SC }
- \setCJKfamilyfont { zhhei } { Heiti~SC }
- \setCJKfamilyfont { zhpf } { PingFang~SC }
+ \setCJKmainfont { Songti~SC~Light }
+ [
+ BoldFont = Songti~SC~Bold,
+ ItalicFont = Kaiti~SC,
+ BoldItalicFont = Kaiti~SC~Bold
+ ]
+ \setCJKsansfont { PingFang~SC }
+ \setCJKmonofont { STFangsong }
+ \setCJKfamilyfont { zhsong } { Songti~SC~Light } [ BoldFont = Songti~SC~Bold ]
+ \setCJKfamilyfont { zhhei } { Heiti~SC~Light } [ BoldFont = Heiti~SC~Medium ]
+ \setCJKfamilyfont { zhpf } { PingFang~SC }
+ \setCJKfamilyfont { zhfs } { STFangsong }
+ \setCJKfamilyfont { zhkai } { Kaiti~SC } [ BoldFont = Kaiti~SC~Bold ]
+ \setCJKfamilyfont { zhli } { Baoli~SC }
+ \setCJKfamilyfont { zhyou } { Yuanti~SC~Light } [ BoldFont = Yuanti~SC~Regular ]
%</macnew>
- \setCJKfamilyfont { zhfs } { STFangsong }
-%<macold>\setCJKfamilyfont { zhkai } { STKaiti }
-%<macnew>\setCJKfamilyfont { zhkai } { Kaiti~SC }
- }
}
%</macold|macnew>
% \end{macrocode}
%
-% \subsubsection{\pkg{ctex-fontset-founder.def}}
+% \paragraph{\opt{ubuntu}}
%
-% \begin{macrocode}
-%<*founder>
-% \end{macrocode}
-%
-% \changes{v2.4.15}{2019/03/28}{统一“方正细黑一\_GBK”的名称为 \texttt{FZXiHeiI-Z08}。}
+% \changes{v2.5}{2019/11/07}{\opt{ubuntu} 改用思源(Noto CJK)和文鼎字库,不再
+% 支持使用 \pdfLaTeX{} 编译。}
%
% \begin{macrocode}
-\sys_if_engine_pdftex:TF
+%<*ubuntu>
+\ctex_fontset_case:nnnn
+ { \ctex_fontset_error:n { ubuntu } }
{
\ctex_zhmap_case:nnn
{
- \setCJKmainfont
- [ BoldFont = FZXBSK.TTF , ItalicFont = FZKTK.TTF ] { FZSSK.TTF }
- \setCJKsansfont [ BoldFont = FZHTK.TTF ] { FZXH1K.TTF }
- \setCJKmonofont { FZFSK.TTF }
- \setCJKfamilyfont { zhsong } [ BoldFont = FZXBSK.TTF ] { FZSSK.TTF }
- \setCJKfamilyfont { zhhei } { FZHTK.TTF }
- \setCJKfamilyfont { zhkai } { FZKTK.TTF }
- \setCJKfamilyfont { zhfs } { FZFSK.TTF }
- \setCJKfamilyfont { zhli } { FZLSK.TTF }
- \setCJKfamilyfont { zhyou } [ BoldFont = FZY3K.TTF ] { FZY1K.TTF }
- \ctex_punct_set:n { founder }
- \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
- \ctex_punct_map_family:nn { \CJKsfdefault } { zhheil }
- \ctex_punct_map_family:nn { \CJKttdefault } { zhfs }
- \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
- \ctex_punct_map_bfseries:nn { \CJKrmdefault , zhsong } { zhsongb }
- \ctex_punct_map_bfseries:nn { \CJKsfdefault } { zhhei }
- \ctex_punct_map_bfseries:nn { zhyou } { zhyoub }
+ \setCJKmainfont { :2:NotoSerifCJK-Regular.ttc }
+ [ BoldFont = :2:NotoSerifCJK-Bold.ttc, ItalicFont = gkai00mp.ttf ]
+ \setCJKsansfont { :2:NotoSansCJK-Regular.ttc }
+ [ BoldFont = :2:NotoSansCJK-Bold.ttc ]
+ \setCJKmonofont { :2:NotoSerifCJK-Regular.ttc }
+ [ BoldFont = :2:NotoSerifCJK-Bold.ttc ]
+ \setCJKfamilyfont { zhsong } { :2:NotoSerifCJK-Regular.ttc }
+ [ BoldFont = :2:NotoSerifCJK-Bold.ttc ]
+ \setCJKfamilyfont { zhhei } { :2:NotoSansCJK-Regular.ttc }
+ [ BoldFont = :2:NotoSansCJK-Bold.ttc ]
+ \setCJKfamilyfont { zhkai } { gkai00mp.ttf }
+ \ctex_punct_set:n { ubuntu }
+ \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
+ \ctex_punct_map_family:nn { \CJKsfdefault } { zhhei }
+ \ctex_punct_map_family:nn { \CJKttdefault } { zhsong }
+ \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
+ \ctex_punct_map_bfseries:nn { \CJKsfdefault, zhhei } { zhheib }
+ \ctex_punct_map_bfseries:nn
+ { \CJKrmdefault, \CJKttdefault, zhsong }
+ { zhsongb }
}
{
- \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { zhfounderfonts }
- \ctex_punct_set:n { founder }
- \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
- \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
- \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
+ \ctex_load_zhmap:nnnn { rm } { zhhei } { zhsong } { ubuntu }
+ \ctex_punct_set:n { ubuntu }
+ \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
+ \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
+ \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
}
- { \ctex_fontset_error:n { founder } }
+ { \ctex_fontset_error:n { ubuntu } }
}
{
- \sys_if_engine_uptex:TF
- {
- \ctex_set_upfonts:nnnnnn
- { FZSSK.TTF } { FZXBSK.TTF } { FZKTK.TTF }
- { FZXH1K.TTF } { FZHTK.TTF }
- { FZFSK.TTF }
- \ctex_set_upfamily:nnn { zhsong } { upzhserif } { upzhserifb }
- \ctex_set_upfamily:nnn { zhhei } { upzhsans } { upzhsansb }
- \ctex_set_upfamily:nnn { zhfs } { upzhmono} {}
- \ctex_set_upfamily:nnn { zhkai } { upzhserifit } {}
- \ctex_set_upfamily:nnn { zhli } { upschrm } {}
- \ctex_set_upmap:nnn { upstsl } { FZLSK.TTF } {}
- \ctex_set_upfamily:nnn { zhyou } { upschgt } {}
- \ctex_set_upmap:nnn { upstht } { FZY1K.TTF } {}
- }
- {
- \setCJKmainfont
- [ BoldFont = FZXiaoBiaoSong-B05 , ItalicFont = FZKai-Z03 ] { FZShuSong-Z01 }
- \setCJKsansfont [ BoldFont = FZHei-B01 ] { FZXiHeiI-Z08 }
- \setCJKmonofont { FZFangSong-Z02 }
- \setCJKfamilyfont { zhsong } [ BoldFont = FZXiaoBiaoSong-B05 ] { FZShuSong-Z01 }
- \setCJKfamilyfont { zhhei } { FZHei-B01 }
- \setCJKfamilyfont { zhkai } { FZKai-Z03 }
- \setCJKfamilyfont { zhfs } { FZFangSong-Z02 }
- \setCJKfamilyfont { zhli } { FZLiShu-S01 }
- \setCJKfamilyfont { zhyou } [ BoldFont = FZZhunYuan-M02 ] { FZXiYuan-M01 }
- }
+ \ctex_set_upmap_unicode:nnn { upserif }
+ { :2:NotoSerifCJK-Regular.ttc } { :2:NotoSerifCJK-Bold.ttc }
+ \ctex_set_upmap_unicode:nnn { upsans }
+ { :2:NotoSansCJK-Regular.ttc } { :2:NotoSansCJK-Bold.ttc }
+ \ctex_set_upmap_unicode:nnn { upmono }
+ { :2:NotoSerifCJK-Regular.ttc } { }
+ \ctex_set_upmap:nnn { upserifit } { gkai00mp.ttf } { }
+ \ctex_set_upfamily:nnn { zhsong } { upzhserif } { upzhserifb }
+ \ctex_set_upfamily:nnn { zhhei } { upzhsans } { upzhsansb }
+ \ctex_set_upfamily:nnn { zhkai } { upzhserifit } { }
}
+ {
+ \setCJKmainfont { Noto~Serif~CJK~SC } [ ItalicFont = AR~PL~KaitiM~GB ]
+ \setCJKsansfont { Noto~Sans~CJK~SC }
+ \setCJKmonofont { Noto~Serif~CJK~SC }
+ \setCJKfamilyfont { zhsong } { Noto~Serif~CJK~SC }
+ \setCJKfamilyfont { zhhei } { Noto~Sans~CJK~SC }
+ \setCJKfamilyfont { zhkai } { AR~PL~KaitiM~GB }
+ }
+%</ubuntu>
% \end{macrocode}
%
+% \paragraph{\opt{windows}}
+%
+% \changes{v2.4.1}{2016/05/14}{使用 \file{bootfont.bin} 判断 Windows XP 以避免
+% 权限问题。}
+% \changes{v2.5}{2019/11/04}{使用环境变量代替绝对路径查找字体。}
+% \changes{v2.5}{2019/11/05}{不再支持 Windows XP 系统,\opt{windowsold} 和
+% \opt{windowsnew} 成为过时字库选项。}
+%
+% \begin{variable}{ \c_@@_msyh_suffix_tl}
+% Windows 8 以后,微软雅黑由原来的 \file{.ttf} 后缀改为 \file{.ttc} 后缀,需要
+% 加以区分。
% \begin{macrocode}
-%</founder>
-%<*ubuntu>
+%<*windows>
+\file_if_exist:nTF { \c_dollar_str WINDIR/Fonts/msyh.ttc }
+ { \tl_const:Nn \c_@@_msyh_suffix_tl { ttc } }
+ {
+ \file_if_exist:nTF { msyh.ttc }
+ { \tl_const:Nn \c_@@_msyh_suffix_tl { ttc } }
+ { \tl_const:Nn \c_@@_msyh_suffix_tl { ttf } }
+ }
% \end{macrocode}
+% \end{variable}
%
-% \subsubsection{\pkg{ctex-fontset-ubuntu.def}}
-%
-% 以下根据 Ubuntu 12.04 的中文字体情况设置。CMap 不清楚应该是什么,指定为
-% UniGB-UTF16-H 还是有警告:
-% \begin{verbatim}
-% ** WARNING ** UCS-4 TrueType cmap table...
-% \end{verbatim}
-% 需要注意的是 \file{uming.ttc} 和 \file{ukai.ttc} 看起来像有四种字形的样子,但
-% 其实只有“令”和“骨”这区区两个字有新字形,其余都取旧字形^^A
-% \footnote{\url{http://www.freedesktop.org/wiki/Software/CJKUnifonts/Download/}}。
% \begin{macrocode}
-\sys_if_engine_pdftex:TF
+\ctex_fontset_case:nnn
{
\ctex_zhmap_case:nnn
{
- \setCJKmainfont
- [ BoldFont = wqy-zenhei.ttc , ItalicFont = ukai.ttc ] { uming.ttc }
- \setCJKsansfont { wqy-zenhei.ttc }
- \setCJKmonofont { uming.ttc }
- \setCJKfamilyfont { zhsong } { uming.ttc }
- \setCJKfamilyfont { zhhei } { wqy-zenhei.ttc }
- \setCJKfamilyfont { zhkai } { ukai.ttc }
- \ctex_punct_set:n { ubuntu }
- \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
- \ctex_punct_map_family:nn { \CJKsfdefault } { zhhei }
- \ctex_punct_map_family:nn { \CJKttdefault } { zhsong }
- \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
- \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
- }
- {
- \ctex_load_zhmap:nnnn { rm } { zhhei } { zhsong } { zhubuntufonts }
- \ctex_punct_set:n { ubuntu }
- \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
- \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
- \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
+ \ctex_punct_set:n { windows }
+ \setCJKmainfont { simsun.ttc }
+ [ BoldFont = simhei.ttf, ItalicFont = simkai.ttf ]
+ \setCJKsansfont { msyh.\c_@@_msyh_suffix_tl }
+ [ BoldFont = msyhbd.\c_@@_msyh_suffix_tl ]
+ \setCJKmonofont { simfang.ttf }
+ \setCJKfamilyfont { zhsong } { simsun.ttc }
+ \setCJKfamilyfont { zhhei } { simhei.ttf }
+ \setCJKfamilyfont { zhfs } { simfang.ttf }
+ \setCJKfamilyfont { zhkai } { simkai.ttf }
+ \setCJKfamilyfont { zhyahei } { msyh.\c_@@_msyh_suffix_tl }
+ [ BoldFont = msyhbd.\c_@@_msyh_suffix_tl ]
+ \setCJKfamilyfont { zhli } { simli.ttf }
+ \setCJKfamilyfont { zhyou } { simyou.ttf }
+ \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
+ \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
+ \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
+ \ctex_punct_map_family:nn { \CJKsfdefault } { zhyahei }
+ \ctex_punct_map_bfseries:nn { \CJKsfdefault, zhyahei } { zhyaheib }
+ \ctex_punct_map_family:nn { \CJKttdefault } { zhfs }
+ }
+ {
+ \ctex_load_zhmap:nnnn { rm } { zhhei } { zhfs } { windows }
+ \ctex_punct_set:n { windows }
+ \ctex_punct_map_family:nn { \CJKrmdefault } { zhsong }
+ \ctex_punct_map_bfseries:nn { \CJKrmdefault } { zhhei }
+ \ctex_punct_map_itshape:nn { \CJKrmdefault } { zhkai }
}
- { \ctex_fontset_error:n { ubuntu } }
+ { }
}
{
- \sys_if_engine_uptex:TF
- {
- \ctex_set_upfonts:nnnnnn
- { uming.ttc } { wqy-zenhei.ttc } { ukai.ttc }
- { wqy-zenhei.ttc } { wqy-zenhei.ttc }
- { uming.ttc }
- \ctex_set_upfamily:nnn { zhsong } { upzhserif } {}
- \ctex_set_upfamily:nnn { zhhei } { upzhsans } {}
- \ctex_set_upfamily:nnn { zhkai } { upzhserifit } {}
- }
- {
- \setCJKmainfont
- [ BoldFont = WenQuanYi~Zen~Hei , ItalicFont = AR~PL~UKai~CN ] { AR~PL~UMing~CN }
- \setCJKsansfont { WenQuanYi~Zen~Hei }
- \setCJKmonofont { AR~PL~UMing~CN }
- \setCJKfamilyfont { zhsong } { AR~PL~UMing~CN }
- \setCJKfamilyfont { zhhei } { WenQuanYi~Zen~Hei }
- \setCJKfamilyfont { zhkai } { AR~PL~UKai~CN }
- }
+ \ctex_set_upfonts:nnnnnn
+ { simsun.ttc }
+ { simhei.ttf }
+ { simkai.ttf }
+ { msyh.\c_@@_msyh_suffix_tl }
+ { msyhbd.\c_@@_msyh_suffix_tl }
+ { simfang.ttf }
+ \ctex_set_upfamily:nnn { zhsong } { upzhserif } {}
+ \ctex_set_upfamily:nnn { zhhei } { upzhserifb } {}
+ \ctex_set_upfamily:nnn { zhfs } { upzhmono } {}
+ \ctex_set_upfamily:nnn { zhkai } { upzhserifit } {}
+ \ctex_set_upfamily:nnn { zhyahei } { upzhsans } { upzhsansb }
+ \ctex_set_upfamily:nnn { zhli } { upschrm } {}
+ \ctex_set_upfamily:nnn { zhyou } { upschgt } {}
+ \ctex_set_upmap:nnn { upstsl } { simli.ttf } {}
+ \ctex_set_upmap:nnn { upstht } { simyou.ttf } {}
+ }
+ {
+ \setCJKmainfont { SimSun } [ BoldFont = SimHei , ItalicFont = KaiTi ]
+ \setCJKsansfont { Microsoft~YaHei } [ BoldFont = *~Bold ]
+ \setCJKmonofont { FangSong }
+ \setCJKfamilyfont { zhsong } { SimSun }
+ \setCJKfamilyfont { zhhei } { SimHei }
+ \setCJKfamilyfont { zhfs } { FangSong }
+ \setCJKfamilyfont { zhkai } { KaiTi }
+ \setCJKfamilyfont { zhyahei } { Microsoft~YaHei } [ BoldFont = *~Bold ]
+ \setCJKfamilyfont { zhli } { LiSu }
+ \setCJKfamilyfont { zhyou } { YouYuan }
}
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</ubuntu>
+%</windows>
% \end{macrocode}
%
% \subsubsection{中文字体命令}
-% \changes{v2.4.14}{2018/05/01}{为 \texttt{macnew} 配置字体命令。}
-%
-% \begin{macrocode}
-%<*!windows&!mac>
-% \end{macrocode}
-%
-% \begin{macrocode}
-\NewDocumentCommand \songti { } { \CJKfamily { zhsong } }
-\NewDocumentCommand \heiti { } { \CJKfamily { zhhei } }
-%<!ubuntu>\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs } }
-\NewDocumentCommand \kaishu { } { \CJKfamily { zhkai } }
-%<*windowsnew|windowsold|founder>
-\NewDocumentCommand \lishu { } { \CJKfamily { zhli } }
-\NewDocumentCommand \youyuan { } { \CJKfamily { zhyou } }
-%</windowsnew|windowsold|founder>
-%<windowsnew>\NewDocumentCommand \yahei { } { \CJKfamily { zhyahei } }
+% \changes{v2.4.14}{2018/05/01}{为 \opt{macnew} 配置字体命令。}
+%
+% \begin{macro}{\songti,\heiti,\fangsong,\kaishu,\lishu,\youyuan,\yahei,\pingfang}
+% 使用 \upLaTeX{} 编译时,\opt{macnew} 字库中由于传统黑体(黑体-简)无法使用,
+% 我们用苹方来代替。同时 \tn{yahei}、\tn{pingfang} 命令被设置为与 \tn{heiti} 相同。
+% \begin{macrocode}
+%<*!mac>
+\NewDocumentCommand \songti { } { \CJKfamily { zhsong } }
+\NewDocumentCommand \heiti { } { \CJKfamily { zhhei } }
+%<!ubuntu>\NewDocumentCommand \fangsong { } { \CJKfamily { zhfs } }
+\NewDocumentCommand \kaishu { } { \CJKfamily { zhkai } }
+%<*windows|founder|macnew>
+\NewDocumentCommand \lishu { } { \CJKfamily { zhli } }
+\NewDocumentCommand \youyuan { } { \CJKfamily { zhyou } }
+%</windows|founder|macnew>
+%<windows>\NewDocumentCommand \yahei { } { \CJKfamily { zhyahei } }
%<*macnew>
-\NewDocumentCommand \yahei { } { \CJKfamily { zhpf } }
-\NewDocumentCommand \pingfang { } { \CJKfamily { zhpf } }
+\bool_lazy_or:nnTF
+ { \sys_if_engine_pdftex_p: }
+ { \sys_if_engine_uptex_p: }
+ {
+ \cs_new_eq:NN \yahei \heiti
+ \cs_new_eq:NN \pingfang \heiti
+ }
+ {
+ \NewDocumentCommand \yahei { } { \CJKfamily { zhpf } }
+ \NewDocumentCommand \pingfang { } { \CJKfamily { zhpf } }
+ }
%</macnew>
+%</!mac>
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
-%</!windows&!mac>
%</fontset>
-%<*zhmap>
% \end{macrocode}
%
% \subsubsection{\pkg{zhmetrics} 的字体映射}
%
+% \changes{v2.5.2}{2020/05/05}{\file{zhadobefonts.tex} 等字体映射文件更名为
+% \file{ctex-zhmap-*.tex}。}
+%
% 确认 \tn{catcode},没有重复载入检查。
% \begin{macrocode}
+%<*zhmap>
\begingroup\catcode61\catcode48\catcode32=10\relax%
- \catcode 35=6 % #
- \catcode123=1 % {
- \catcode125=2 % }
+ \catcode 35=6 % #
+ \catcode 45=12 % -
+ \catcode123=1 % {
+ \catcode125=2 % }
\toks0{\endlinechar=\the\endlinechar\relax}%
- \toks2{\endlinechar=13 }%
+ \toks2{\endlinechar=-1 }%
\def\x#1 #2 {%
\toks0\expandafter{\the\toks0 \catcode#1=\the\catcode#1\relax}%
\toks2\expandafter{\the\toks2 \catcode#1=#2 }}%
@@ -10244,6 +10825,7 @@ Copyright and Licence
\expandafter\x\csname ctex@zhmap@endinput\endcsname
% \end{macrocode}
%
+% \begin{macro}[int]{\ifzhmappdf}
% \begin{macrocode}
\begingroup\expandafter\endgroup
\expandafter\let\csname ifzhmappdf\expandafter\endcsname\csname
@@ -10253,7 +10835,9 @@ Copyright and Licence
\else ifctexpdf\fi
\endcsname
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}[int]{\ProvidesFile}
% 提供非 \LaTeX{} 格式下的 \tn{ProvidesFile}。
% \begin{macrocode}
\begingroup
@@ -10266,292 +10850,284 @@ Copyright and Licence
\fi
\endgroup
% \end{macrocode}
+% \end{macro}
%
-% \paragraph{\pkg{zhwindowsfonts.tex}}
-%
+% 文件标识信息。
% \begin{macrocode}
-%<*windows>
-\ProvidesFile{zhwindowsfonts.tex}%
- [2019/05/29 v2.4.16 Windows font map loader for pdfTeX and DVIPDFMx (CTEX)]
-
-\ifzhmappdf
- \pdfmapline{=gbk@UGBK@ <simsun.ttc}
- \pdfmapline{=gbksong@UGBK@ <simsun.ttc}
- \pdfmapline{=gbkkai@UGBK@ <simkai.ttf}
- \pdfmapline{=gbkhei@UGBK@ <simhei.ttf}
- \pdfmapline{=gbkfs@UGBK@ <simfang.ttf}
- \pdfmapline{=gbkli@UGBK@ <simli.ttf}
- \pdfmapline{=gbkyou@UGBK@ <simyou.ttf}
-
- \pdfmapline{=cyberb@Unicode@ <simsun.ttc}
- \pdfmapline{=unisong@Unicode@ <simsun.ttc}
- \pdfmapline{=unikai@Unicode@ <simkai.ttf}
- \pdfmapline{=unihei@Unicode@ <simhei.ttf}
- \pdfmapline{=unifs@Unicode@ <simfang.ttf}
- \pdfmapline{=unili@Unicode@ <simli.ttf}
- \pdfmapline{=uniyou@Unicode@ <simyou.ttf}
-
- \pdfmapline{=gbksongsl@UGBK@ <simsun.ttc}
- \pdfmapline{=gbkkaisl@UGBK@ <simkai.ttf}
- \pdfmapline{=gbkheisl@UGBK@ <simhei.ttf}
- \pdfmapline{=gbkfssl@UGBK@ <simfang.ttf}
- \pdfmapline{=gbklisl@UGBK@ <simli.ttf}
- \pdfmapline{=gbkyousl@UGBK@ <simyou.ttf}
-
- \pdfmapline{=unisongsl@Unicode@ <simsun.ttc}
- \pdfmapline{=unikaisl@Unicode@ <simkai.ttf}
- \pdfmapline{=uniheisl@Unicode@ <simhei.ttf}
- \pdfmapline{=unifssl@Unicode@ <simfang.ttf}
- \pdfmapline{=unilisl@Unicode@ <simli.ttf}
- \pdfmapline{=uniyousl@Unicode@ <simyou.ttf}
-
-\else
- \special{pdf:mapline gbk@UGBK@ unicode :0:simsun.ttc -v 50}
- \special{pdf:mapline gbksong@UGBK@ unicode :0:simsun.ttc -v 50}
- \special{pdf:mapline gbkkai@UGBK@ unicode simkai.ttf -v 70}
- \special{pdf:mapline gbkhei@UGBK@ unicode simhei.ttf -v 150}
- \special{pdf:mapline gbkfs@UGBK@ unicode simfang.ttf -v 50}
- \special{pdf:mapline gbkli@UGBK@ unicode simli.ttf -v 150}
- \special{pdf:mapline gbkyou@UGBK@ unicode simyou.ttf -v 60}
-
- \special{pdf:mapline cyberb@Unicode@ unicode :0:simsun.ttc -v 50}
- \special{pdf:mapline unisong@Unicode@ unicode :0:simsun.ttc -v 50}
- \special{pdf:mapline unikai@Unicode@ unicode simkai.ttf -v 70}
- \special{pdf:mapline unihei@Unicode@ unicode simhei.ttf -v 150}
- \special{pdf:mapline unifs@Unicode@ unicode simfang.ttf -v 50}
- \special{pdf:mapline unili@Unicode@ unicode simli.ttf -v 150}
- \special{pdf:mapline uniyou@Unicode@ unicode simyou.ttf -v 60}
-
- \special{pdf:mapline gbksongsl@UGBK@ unicode :0:simsun.ttc -s .167 -v 50}
- \special{pdf:mapline gbkkaisl@UGBK@ unicode simkai.ttf -s .167 -v 70}
- \special{pdf:mapline gbkheisl@UGBK@ unicode simhei.ttf -s .167 -v 150}
- \special{pdf:mapline gbkfssl@UGBK@ unicode simfang.ttf -s .167 -v 50}
- \special{pdf:mapline gbklisl@UGBK@ unicode simli.ttf -s .167 -v 150}
- \special{pdf:mapline gbkyousl@UGBK@ unicode simyou.ttf -s .167 -v 60}
-
- \special{pdf:mapline unisongsl@Unicode@ unicode :0:simsun.ttc -s .167 -v 50}
- \special{pdf:mapline unikaisl@Unicode@ unicode simkai.ttf -s .167 -v 70}
- \special{pdf:mapline uniheisl@Unicode@ unicode simhei.ttf -s .167 -v 150}
- \special{pdf:mapline unifssl@Unicode@ unicode simfang.ttf -s .167 -v 50}
- \special{pdf:mapline unilisl@Unicode@ unicode simli.ttf -s .167 -v 150}
- \special{pdf:mapline uniyousl@Unicode@ unicode simyou.ttf -s .167 -v 60}
-
-%</windows>
+%<adobe>\ProvidesFile{ctex-zhmap-adobe.tex}%
+%<adobe> [2020/10/19 v2.5.5 Adobe font map loader for DVIPDFMx (CTEX)]
+%<fandol>\ProvidesFile{ctex-zhmap-fandol.tex}%
+%<fandol> [2020/10/19 v2.5.5 Fandol font map loader for DVIPDFMx (CTEX)]
+%<founder>\ProvidesFile{ctex-zhmap-founder.tex}%
+%<founder> [2020/10/19 v2.5.5 Founder font map loader for pdfTeX and DVIPDFMx (CTEX)]
+%<mac>\ProvidesFile{ctex-zhmap-mac.tex}%
+%<mac> [2020/10/19 v2.5.5 Mac font map loader for DVIPDFMx (CTEX)]
+%<ubuntu>\ProvidesFile{ctex-zhmap-ubuntu.tex}%
+%<ubuntu> [2020/10/19 v2.5.5 Ubuntu font map loader for DVIPDFMx (CTEX)]
+%<windows>\ProvidesFile{ctex-zhmap-windows.tex}%
+%<windows> [2020/10/19 v2.5.5 Windows font map loader for pdfTeX and DVIPDFMx (CTEX)]
% \end{macrocode}
%
-% \paragraph{\pkg{zhadobefonts.tex}}
+% \paragraph{\pkg{ctex-zhmap-adobe.tex}}
%
% \begin{macrocode}
%<*adobe>
-\ProvidesFile{zhadobefonts.tex}%
- [2019/05/29 v2.4.16 Adobe font map loader for DVIPDFMx (CTEX)]
-
\ifzhmappdf
%% pdfTeX does not support OTF fonts
-
\else
- \special{pdf:mapline gbk@UGBK@ UniGB-UTF16-H AdobeSongStd-Light.otf}
- \special{pdf:mapline gbksong@UGBK@ UniGB-UTF16-H AdobeSongStd-Light.otf}
- \special{pdf:mapline gbkkai@UGBK@ UniGB-UTF16-H AdobeKaitiStd-Regular.otf}
- \special{pdf:mapline gbkhei@UGBK@ UniGB-UTF16-H AdobeHeitiStd-Regular.otf}
- \special{pdf:mapline gbkfs@UGBK@ UniGB-UTF16-H AdobeFangsongStd-Regular.otf}
-
- \special{pdf:mapline cyberb@Unicode@ UniGB-UTF16-H AdobeSongStd-Light.otf}
- \special{pdf:mapline unisong@Unicode@ UniGB-UTF16-H AdobeSongStd-Light.otf}
- \special{pdf:mapline unikai@Unicode@ UniGB-UTF16-H AdobeKaitiStd-Regular.otf}
- \special{pdf:mapline unihei@Unicode@ UniGB-UTF16-H AdobeHeitiStd-Regular.otf}
- \special{pdf:mapline unifs@Unicode@ UniGB-UTF16-H AdobeFangsongStd-Regular.otf}
-
- \special{pdf:mapline gbksongsl@UGBK@ UniGB-UTF16-H AdobeSongStd-Light.otf -s .167}
- \special{pdf:mapline gbkkaisl@UGBK@ UniGB-UTF16-H AdobeKaitiStd-Regular.otf -s .167}
- \special{pdf:mapline gbkheisl@UGBK@ UniGB-UTF16-H AdobeHeitiStd-Regular.otf -s .167}
- \special{pdf:mapline gbkfssl@UGBK@ UniGB-UTF16-H AdobeFangsongStd-Regular.otf -s .167}
-
- \special{pdf:mapline unisongsl@Unicode@ UniGB-UTF16-H AdobeSongStd-Light.otf -s .167}
- \special{pdf:mapline unikaisl@Unicode@ UniGB-UTF16-H AdobeKaitiStd-Regular.otf -s .167}
- \special{pdf:mapline uniheisl@Unicode@ UniGB-UTF16-H AdobeHeitiStd-Regular.otf -s .167}
+ \special{pdf:mapline gbk@UGBK@ UniGB-UTF16-H AdobeSongStd-Light.otf}
+ \special{pdf:mapline gbksong@UGBK@ UniGB-UTF16-H AdobeSongStd-Light.otf}
+ \special{pdf:mapline gbkkai@UGBK@ UniGB-UTF16-H AdobeKaitiStd-Regular.otf}
+ \special{pdf:mapline gbkhei@UGBK@ UniGB-UTF16-H AdobeHeitiStd-Regular.otf}
+ \special{pdf:mapline gbkfs@UGBK@ UniGB-UTF16-H AdobeFangsongStd-Regular.otf}
+ \special{pdf:mapline cyberb@Unicode@ UniGB-UTF16-H AdobeSongStd-Light.otf}
+ \special{pdf:mapline unisong@Unicode@ UniGB-UTF16-H AdobeSongStd-Light.otf}
+ \special{pdf:mapline unikai@Unicode@ UniGB-UTF16-H AdobeKaitiStd-Regular.otf}
+ \special{pdf:mapline unihei@Unicode@ UniGB-UTF16-H AdobeHeitiStd-Regular.otf}
+ \special{pdf:mapline unifs@Unicode@ UniGB-UTF16-H AdobeFangsongStd-Regular.otf}
+ \special{pdf:mapline gbksongsl@UGBK@ UniGB-UTF16-H AdobeSongStd-Light.otf -s .167}
+ \special{pdf:mapline gbkkaisl@UGBK@ UniGB-UTF16-H AdobeKaitiStd-Regular.otf -s .167}
+ \special{pdf:mapline gbkheisl@UGBK@ UniGB-UTF16-H AdobeHeitiStd-Regular.otf -s .167}
+ \special{pdf:mapline gbkfssl@UGBK@ UniGB-UTF16-H AdobeFangsongStd-Regular.otf -s .167}
+ \special{pdf:mapline unisongsl@Unicode@ UniGB-UTF16-H AdobeSongStd-Light.otf -s .167}
+ \special{pdf:mapline unikaisl@Unicode@ UniGB-UTF16-H AdobeKaitiStd-Regular.otf -s .167}
+ \special{pdf:mapline uniheisl@Unicode@ UniGB-UTF16-H AdobeHeitiStd-Regular.otf -s .167}
\special{pdf:mapline unifssl@Unicode@ UniGB-UTF16-H AdobeFangsongStd-Regular.otf -s .167}
-
+\fi
%</adobe>
% \end{macrocode}
%
-% \paragraph{\pkg{zhfandolfonts.tex}}
+% \paragraph{\pkg{ctex-zhmap-fandol.tex}}
%
% \begin{macrocode}
%<*fandol>
-\ProvidesFile{zhfandolfonts.tex}%
- [2019/05/29 v2.4.16 Fandol font map loader for DVIPDFMx (CTEX)]
-
\ifzhmappdf
%% pdfTeX does not support OTF fonts
-
\else
- \special{pdf:mapline gbk@UGBK@ UniGB-UTF16-H FandolSong-Regular.otf}
- \special{pdf:mapline gbksong@UGBK@ UniGB-UTF16-H FandolSong-Regular.otf}
- \special{pdf:mapline gbkkai@UGBK@ UniGB-UTF16-H FandolKai-Regular.otf}
- \special{pdf:mapline gbkhei@UGBK@ UniGB-UTF16-H FandolHei-Regular.otf}
- \special{pdf:mapline gbkfs@UGBK@ UniGB-UTF16-H FandolFang-Regular.otf}
-
- \special{pdf:mapline cyberb@Unicode@ UniGB-UTF16-H FandolSong-Regular.otf}
- \special{pdf:mapline unisong@Unicode@ UniGB-UTF16-H FandolSong-Regular.otf}
- \special{pdf:mapline unikai@Unicode@ UniGB-UTF16-H FandolKai-Regular.otf}
- \special{pdf:mapline unihei@Unicode@ UniGB-UTF16-H FandolHei-Regular.otf}
- \special{pdf:mapline unifs@Unicode@ UniGB-UTF16-H FandolFang-Regular.otf}
-
- \special{pdf:mapline gbksongsl@UGBK@ UniGB-UTF16-H FandolSong-Regular.otf -s .167}
- \special{pdf:mapline gbkkaisl@UGBK@ UniGB-UTF16-H FandolKai-Regular.otf -s .167}
- \special{pdf:mapline gbkheisl@UGBK@ UniGB-UTF16-H FandolHei-Regular.otf -s .167}
- \special{pdf:mapline gbkfssl@UGBK@ UniGB-UTF16-H FandolFang-Regular.otf -s .167}
-
+ \special{pdf:mapline gbk@UGBK@ UniGB-UTF16-H FandolSong-Regular.otf}
+ \special{pdf:mapline gbksong@UGBK@ UniGB-UTF16-H FandolSong-Regular.otf}
+ \special{pdf:mapline gbkkai@UGBK@ UniGB-UTF16-H FandolKai-Regular.otf}
+ \special{pdf:mapline gbkhei@UGBK@ UniGB-UTF16-H FandolHei-Regular.otf}
+ \special{pdf:mapline gbkfs@UGBK@ UniGB-UTF16-H FandolFang-Regular.otf}
+ \special{pdf:mapline cyberb@Unicode@ UniGB-UTF16-H FandolSong-Regular.otf}
+ \special{pdf:mapline unisong@Unicode@ UniGB-UTF16-H FandolSong-Regular.otf}
+ \special{pdf:mapline unikai@Unicode@ UniGB-UTF16-H FandolKai-Regular.otf}
+ \special{pdf:mapline unihei@Unicode@ UniGB-UTF16-H FandolHei-Regular.otf}
+ \special{pdf:mapline unifs@Unicode@ UniGB-UTF16-H FandolFang-Regular.otf}
+ \special{pdf:mapline gbksongsl@UGBK@ UniGB-UTF16-H FandolSong-Regular.otf -s .167}
+ \special{pdf:mapline gbkkaisl@UGBK@ UniGB-UTF16-H FandolKai-Regular.otf -s .167}
+ \special{pdf:mapline gbkheisl@UGBK@ UniGB-UTF16-H FandolHei-Regular.otf -s .167}
+ \special{pdf:mapline gbkfssl@UGBK@ UniGB-UTF16-H FandolFang-Regular.otf -s .167}
\special{pdf:mapline unisongsl@Unicode@ UniGB-UTF16-H FandolSong-Regular.otf -s .167}
- \special{pdf:mapline unikaisl@Unicode@ UniGB-UTF16-H FandolKai-Regular.otf -s .167}
- \special{pdf:mapline uniheisl@Unicode@ UniGB-UTF16-H FandolHei-Regular.otf -s .167}
+ \special{pdf:mapline unikaisl@Unicode@ UniGB-UTF16-H FandolKai-Regular.otf -s .167}
+ \special{pdf:mapline uniheisl@Unicode@ UniGB-UTF16-H FandolHei-Regular.otf -s .167}
\special{pdf:mapline unifssl@Unicode@ UniGB-UTF16-H FandolFang-Regular.otf -s .167}
-
+\fi
%</fandol>
% \end{macrocode}
%
-% \paragraph{\pkg{zhfounderfonts.tex}}
+% \paragraph{\pkg{ctex-zhmap-founder.tex}}
%
% \begin{macrocode}
%<*founder>
-\ProvidesFile{zhfounderfonts.tex}%
- [2019/05/29 v2.4.16 Founder font map loader for pdfTeX and DVIPDFMx (CTEX)]
-
\ifzhmappdf
- \pdfmapline{=gbk@UGBK@ <FZSSK.TTF}
- \pdfmapline{=gbksong@UGBK@ <FZSSK.TTF}
- \pdfmapline{=gbkkai@UGBK@ <FZKTK.TTF}
- \pdfmapline{=gbkhei@UGBK@ <FZHTK.TTF}
- \pdfmapline{=gbkfs@UGBK@ <FZFSK.TTF}
- \pdfmapline{=gbkli@UGBK@ <FZLSK.TTF}
- \pdfmapline{=gbkyou@UGBK@ <FZY1K.TTF}
-
- \pdfmapline{=cyberb@Unicode@ <FZSSK.TTF}
- \pdfmapline{=unisong@Unicode@ <FZSSK.TTF}
- \pdfmapline{=unikai@Unicode@ <FZKTK.TTF}
- \pdfmapline{=unihei@Unicode@ <FZHTK.TTF}
- \pdfmapline{=unifs@Unicode@ <FZFSK.TTF}
- \pdfmapline{=unili@Unicode@ <FZLSK.TTF}
- \pdfmapline{=uniyou@Unicode@ <FZY1K.TTF}
-
- \pdfmapline{=gbksongsl@UGBK@ <FZSSK.TTF}
- \pdfmapline{=gbkkaisl@UGBK@ <FZKTK.TTF}
- \pdfmapline{=gbkheisl@UGBK@ <FZHTK.TTF}
- \pdfmapline{=gbkfssl@UGBK@ <FZFSK.TTF}
- \pdfmapline{=gbklisl@UGBK@ <FZLSK.TTF}
- \pdfmapline{=gbkyousl@UGBK@ <FZY1K.TTF}
-
+ \pdfmapline{=gbk@UGBK@ <FZSSK.TTF}
+ \pdfmapline{=gbksong@UGBK@ <FZSSK.TTF}
+ \pdfmapline{=gbkkai@UGBK@ <FZKTK.TTF}
+ \pdfmapline{=gbkhei@UGBK@ <FZHTK.TTF}
+ \pdfmapline{=gbkfs@UGBK@ <FZFSK.TTF}
+ \pdfmapline{=gbkli@UGBK@ <FZLSK.TTF}
+ \pdfmapline{=gbkyou@UGBK@ <FZY1K.TTF}
+ \pdfmapline{=cyberb@Unicode@ <FZSSK.TTF}
+ \pdfmapline{=unisong@Unicode@ <FZSSK.TTF}
+ \pdfmapline{=unikai@Unicode@ <FZKTK.TTF}
+ \pdfmapline{=unihei@Unicode@ <FZHTK.TTF}
+ \pdfmapline{=unifs@Unicode@ <FZFSK.TTF}
+ \pdfmapline{=unili@Unicode@ <FZLSK.TTF}
+ \pdfmapline{=uniyou@Unicode@ <FZY1K.TTF}
+ \pdfmapline{=gbksongsl@UGBK@ <FZSSK.TTF}
+ \pdfmapline{=gbkkaisl@UGBK@ <FZKTK.TTF}
+ \pdfmapline{=gbkheisl@UGBK@ <FZHTK.TTF}
+ \pdfmapline{=gbkfssl@UGBK@ <FZFSK.TTF}
+ \pdfmapline{=gbklisl@UGBK@ <FZLSK.TTF}
+ \pdfmapline{=gbkyousl@UGBK@ <FZY1K.TTF}
\pdfmapline{=unisongsl@Unicode@ <FZSSK.TTF}
\pdfmapline{=unikaisl@Unicode@ <FZKTK.TTF}
\pdfmapline{=uniheisl@Unicode@ <FZHTK.TTF}
\pdfmapline{=unifssl@Unicode@ <FZFSK.TTF}
\pdfmapline{=unilisl@Unicode@ <FZLSK.TTF}
\pdfmapline{=uniyousl@Unicode@ <FZY1K.TTF}
-
\else
- \special{pdf:mapline gbk@UGBK@ unicode FZSSK.TTF}
- \special{pdf:mapline gbksong@UGBK@ unicode FZSSK.TTF}
- \special{pdf:mapline gbkkai@UGBK@ unicode FZKTK.TTF}
- \special{pdf:mapline gbkhei@UGBK@ unicode FZHTK.TTF}
- \special{pdf:mapline gbkfs@UGBK@ unicode FZFSK.TTF}
- \special{pdf:mapline gbkli@UGBK@ unicode FZLSK.TTF}
- \special{pdf:mapline gbkyou@UGBK@ unicode FZY1K.TTF}
-
- \special{pdf:mapline cyberb@Unicode@ unicode FZSSK.TTF}
- \special{pdf:mapline unisong@Unicode@ unicode FZSSK.TTF}
- \special{pdf:mapline unikai@Unicode@ unicode FZKTK.TTF}
- \special{pdf:mapline unihei@Unicode@ unicode FZHTK.TTF}
- \special{pdf:mapline unifs@Unicode@ unicode FZFSK.TTF}
- \special{pdf:mapline unili@Unicode@ unicode FZLSK.TTF}
- \special{pdf:mapline uniyou@Unicode@ unicode FZY1K.TTF}
-
- \special{pdf:mapline gbksongsl@UGBK@ unicode FZSSK.TTF -s .167}
- \special{pdf:mapline gbkkaisl@UGBK@ unicode FZKTK.TTF -s .167}
- \special{pdf:mapline gbkheisl@UGBK@ unicode FZHTK.TTF -s .167}
- \special{pdf:mapline gbkfssl@UGBK@ unicode FZFSK.TTF -s .167}
- \special{pdf:mapline gbklisl@UGBK@ unicode FZLSK.TTF -s .167}
- \special{pdf:mapline gbkyousl@UGBK@ unicode FZY1K.TTF -s .167}
-
+ \special{pdf:mapline gbk@UGBK@ unicode FZSSK.TTF}
+ \special{pdf:mapline gbksong@UGBK@ unicode FZSSK.TTF}
+ \special{pdf:mapline gbkkai@UGBK@ unicode FZKTK.TTF}
+ \special{pdf:mapline gbkhei@UGBK@ unicode FZHTK.TTF}
+ \special{pdf:mapline gbkfs@UGBK@ unicode FZFSK.TTF}
+ \special{pdf:mapline gbkli@UGBK@ unicode FZLSK.TTF}
+ \special{pdf:mapline gbkyou@UGBK@ unicode FZY1K.TTF}
+ \special{pdf:mapline cyberb@Unicode@ unicode FZSSK.TTF}
+ \special{pdf:mapline unisong@Unicode@ unicode FZSSK.TTF}
+ \special{pdf:mapline unikai@Unicode@ unicode FZKTK.TTF}
+ \special{pdf:mapline unihei@Unicode@ unicode FZHTK.TTF}
+ \special{pdf:mapline unifs@Unicode@ unicode FZFSK.TTF}
+ \special{pdf:mapline unili@Unicode@ unicode FZLSK.TTF}
+ \special{pdf:mapline uniyou@Unicode@ unicode FZY1K.TTF}
+ \special{pdf:mapline gbksongsl@UGBK@ unicode FZSSK.TTF -s .167}
+ \special{pdf:mapline gbkkaisl@UGBK@ unicode FZKTK.TTF -s .167}
+ \special{pdf:mapline gbkheisl@UGBK@ unicode FZHTK.TTF -s .167}
+ \special{pdf:mapline gbkfssl@UGBK@ unicode FZFSK.TTF -s .167}
+ \special{pdf:mapline gbklisl@UGBK@ unicode FZLSK.TTF -s .167}
+ \special{pdf:mapline gbkyousl@UGBK@ unicode FZY1K.TTF -s .167}
\special{pdf:mapline unisongsl@Unicode@ unicode FZSSK.TTF -s .167}
\special{pdf:mapline unikaisl@Unicode@ unicode FZKTK.TTF -s .167}
\special{pdf:mapline uniheisl@Unicode@ unicode FZHTK.TTF -s .167}
\special{pdf:mapline unifssl@Unicode@ unicode FZFSK.TTF -s .167}
\special{pdf:mapline unilisl@Unicode@ unicode FZLSK.TTF -s .167}
\special{pdf:mapline uniyousl@Unicode@ unicode FZY1K.TTF -s .167}
-
+\fi
%</founder>
% \end{macrocode}
%
-% \paragraph{\pkg{zhubuntufonts.tex}}
+% \paragraph{\pkg{ctex-zhmap-mac.tex}}
+%
+% \changes{v2.5}{2020/01/15}{增加字体映射文件 \file{zhmacfonts.tex}。}
+%
+% \begin{macrocode}
+%<*mac>
+\ifzhmappdf
+%% pdfTeX does not support OTF fonts
+\else
+ \special{pdf:mapline gbk@UGBK@ UniGB-UTF16-H :3:Songti.ttc}
+ \special{pdf:mapline gbksong@UGBK@ UniGB-UTF16-H :3:Songti.ttc}
+ \special{pdf:mapline gbkkai@UGBK@ UniGB-UTF16-H :0:Kaiti.ttc}
+ \special{pdf:mapline gbkhei@UGBK@ unicode :2:PingFang.ttc}
+ \special{pdf:mapline gbkfs@UGBK@ unicode STFANGSO.ttf}
+ \special{pdf:mapline gbkli@UGBK@ UniGB-UTF16-H :0:Baoli.ttc}
+ \special{pdf:mapline gbkyou@UGBK@ UniGB-UTF16-H :4:Yuanti.ttc}
+ \special{pdf:mapline cyberb@Unicode@ UniGB-UTF16-H :3:Songti.ttc}
+ \special{pdf:mapline unisong@Unicode@ UniGB-UTF16-H :3:Songti.ttc}
+ \special{pdf:mapline unikai@Unicode@ UniGB-UTF16-H :0:Kaiti.ttc}
+ \special{pdf:mapline unihei@Unicode@ unicode :2:PingFang.ttc}
+ \special{pdf:mapline unifs@Unicode@ unicode STFANGSO.ttf}
+ \special{pdf:mapline unili@Unicode@ UniGB-UTF16-H :0:Baoli.ttc}
+ \special{pdf:mapline uniyou@Unicode@ UniGB-UTF16-H :4:Yuanti.ttc}
+ \special{pdf:mapline gbksongsl@UGBK@ UniGB-UTF16-H :3:Songti.ttc -s .167}
+ \special{pdf:mapline gbkkaisl@UGBK@ UniGB-UTF16-H :0:Kaiti.ttc -s .167}
+ \special{pdf:mapline gbkheisl@UGBK@ unicode :2:PingFang.ttc -s .167}
+ \special{pdf:mapline gbkfssl@UGBK@ unicode STFANGSO.ttf -s .167}
+ \special{pdf:mapline gbklisl@UGBK@ UniGB-UTF16-H :0:Baoli.ttc -s .167}
+ \special{pdf:mapline gbkyousl@UGBK@ UniGB-UTF16-H :4:Yuanti.ttc -s .167}
+ \special{pdf:mapline unisongsl@Unicode@ UniGB-UTF16-H :3:Songti.ttc -s .167}
+ \special{pdf:mapline unikaisl@Unicode@ UniGB-UTF16-H :0:Kaiti.ttc -s .167}
+ \special{pdf:mapline uniheisl@Unicode@ unicode :2:PingFang.ttc -s .167}
+ \special{pdf:mapline unifssl@Unicode@ unicode STFANGSO.ttf -s .167}
+ \special{pdf:mapline unilisl@Unicode@ UniGB-UTF16-H :0:Baoli.ttc -s .167}
+ \special{pdf:mapline uniyousl@Unicode@ UniGB-UTF16-H :4:Yuanti.ttc -s .167}
+\fi
+%</mac>
+% \end{macrocode}
+%
+% \paragraph{\pkg{ctex-zhmap-ubuntu.tex}}
%
% \begin{macrocode}
%<*ubuntu>
-\ProvidesFile{zhubuntufonts.tex}%
- [2019/05/29 v2.4.16 Ubuntu font map loader for pdfTeX and DVIPDFMx (CTEX)]
-
\ifzhmappdf
- \pdfmapline{=gbk@UGBK@ <uming.ttc}
- \pdfmapline{=gbksong@UGBK@ <uming.ttc}
- \pdfmapline{=gbkkai@UGBK@ <ukai.ttc}
- \pdfmapline{=gbkhei@UGBK@ <wqy-zenhei.ttc}
- \pdfmapline{=gbkfs@UGBK@ <uming.ttc}
- \pdfmapline{=gbkyou@UGBK@ <wqy-zenhei.ttc}
-
- \pdfmapline{=cyberb@Unicode@ <uming.ttc}
- \pdfmapline{=unisong@Unicode@ <uming.ttc}
- \pdfmapline{=unikai@Unicode@ <ukai.ttc}
- \pdfmapline{=unihei@Unicode@ <wqy-zenhei.ttc}
- \pdfmapline{=unifs@Unicode@ <uming.ttc}
- \pdfmapline{=uniyou@Unicode@ <wqy-zenhei.ttc}
-
- \pdfmapline{=gbksongsl@UGBK@ <uming.ttc}
- \pdfmapline{=gbkkaisl@UGBK@ <ukai.ttc}
- \pdfmapline{=gbkheisl@UGBK@ <wqy-zenhei.ttc}
- \pdfmapline{=gbkfssl@UGBK@ <uming.ttc}
- \pdfmapline{=gbkyousl@UGBK@ <wqy-zenhei.ttc}
-
- \pdfmapline{=unisongsl@Unicode@ <uming.ttc}
- \pdfmapline{=unikaisl@Unicode@ <ukai.ttc}
- \pdfmapline{=uniheisl@Unicode@ <wqy-zenhei.ttc}
- \pdfmapline{=unifssl@Unicode@ <uming.ttc}
- \pdfmapline{=uniyousl@Unicode@ <wqy-zenhei.ttc}
-
+%% pdfTeX does not support OTF fonts
\else
- \special{pdf:mapline gbk@UGBK@ unicode :0:uming.ttc}
- \special{pdf:mapline gbksong@UGBK@ unicode :0:uming.ttc}
- \special{pdf:mapline gbkkai@UGBK@ unicode :0:ukai.ttc}
- \special{pdf:mapline gbkhei@UGBK@ unicode :0:wqy-zenhei.ttc}
- \special{pdf:mapline gbkfs@UGBK@ unicode :0:uming.ttc}
-
- \special{pdf:mapline cyberb@Unicode@ unicode :0:uming.ttc}
- \special{pdf:mapline unisong@Unicode@ unicode :0:uming.ttc}
- \special{pdf:mapline unikai@Unicode@ unicode :0:ukai.ttc}
- \special{pdf:mapline unihei@Unicode@ unicode :0:wqy-zenhei.ttc}
- \special{pdf:mapline unifs@Unicode@ unicode :0:uming.ttc}
-
- \special{pdf:mapline gbksongsl@UGBK@ unicode :0:uming.ttc -s .167}
- \special{pdf:mapline gbkkaisl@UGBK@ unicode :0:ukai.ttc -s .167}
- \special{pdf:mapline gbkheisl@UGBK@ unicode :0:wqy-zenhei.ttc -s .167}
- \special{pdf:mapline gbkfssl@UGBK@ unicode :0:uming.ttc -s .167}
-
- \special{pdf:mapline unisongsl@Unicode@ unicode :0:uming.ttc -s .167}
- \special{pdf:mapline unikaisl@Unicode@ unicode :0:ukai.ttc -s .167}
- \special{pdf:mapline uniheisl@Unicode@ unicode :0:wqy-zenhei.ttc -s .167}
- \special{pdf:mapline unifssl@Unicode@ unicode :0:uming.ttc -s .167}
-
+ \special{pdf:mapline gbk@UGBK@ unicode :2:NotoSerifCJK-Regular.ttc}
+ \special{pdf:mapline gbksong@UGBK@ unicode :2:NotoSerifCJK-Regular.ttc}
+ \special{pdf:mapline gbkkai@UGBK@ unicode gkai00mp.ttf}
+ \special{pdf:mapline gbkhei@UGBK@ unicode :2:NotoSansCJK-Regular.ttc}
+ \special{pdf:mapline gbkfs@UGBK@ unicode :2:NotoSerifCJK-Regular.ttc}
+ \special{pdf:mapline cyberb@Unicode@ unicode :2:NotoSerifCJK-Regular.ttc}
+ \special{pdf:mapline unisong@Unicode@ unicode :2:NotoSerifCJK-Regular.ttc}
+ \special{pdf:mapline unikai@Unicode@ unicode gkai00mp.ttf}
+ \special{pdf:mapline unihei@Unicode@ unicode :2:NotoSansCJK-Regular.ttc}
+ \special{pdf:mapline unifs@Unicode@ unicode :2:NotoSerifCJK-Regular.ttc}
+ \special{pdf:mapline gbksongsl@UGBK@ unicode :2:NotoSerifCJK-Regular.ttc -s .167}
+ \special{pdf:mapline gbkkaisl@UGBK@ unicode gkai00mp.ttf -s .167}
+ \special{pdf:mapline gbkheisl@UGBK@ unicode :2:NotoSansCJK-Regular.ttc -s .167}
+ \special{pdf:mapline gbkfssl@UGBK@ unicode :2:NotoSerifCJK-Regular.ttc -s .167}
+ \special{pdf:mapline unisongsl@Unicode@ unicode :2:NotoSerifCJK-Regular.ttc -s .167}
+ \special{pdf:mapline unikaisl@Unicode@ unicode gkai00mp.ttf -s .167}
+ \special{pdf:mapline uniheisl@Unicode@ unicode :2:NotoSansCJK-Regular.ttc -s .167}
+ \special{pdf:mapline unifssl@Unicode@ unicode :2:NotoSerifCJK-Regular.ttc -s .167}
+\fi
%</ubuntu>
% \end{macrocode}
%
+% \paragraph{\pkg{ctex-zhmap-windows.tex}}
+%
% \begin{macrocode}
+%<*windows>
+\ifzhmappdf
+ \pdfmapline{=gbk@UGBK@ <simsun.ttc}
+ \pdfmapline{=gbksong@UGBK@ <simsun.ttc}
+ \pdfmapline{=gbkkai@UGBK@ <simkai.ttf}
+ \pdfmapline{=gbkhei@UGBK@ <simhei.ttf}
+ \pdfmapline{=gbkfs@UGBK@ <simfang.ttf}
+ \pdfmapline{=gbkli@UGBK@ <simli.ttf}
+ \pdfmapline{=gbkyou@UGBK@ <simyou.ttf}
+ \pdfmapline{=cyberb@Unicode@ <simsun.ttc}
+ \pdfmapline{=unisong@Unicode@ <simsun.ttc}
+ \pdfmapline{=unikai@Unicode@ <simkai.ttf}
+ \pdfmapline{=unihei@Unicode@ <simhei.ttf}
+ \pdfmapline{=unifs@Unicode@ <simfang.ttf}
+ \pdfmapline{=unili@Unicode@ <simli.ttf}
+ \pdfmapline{=uniyou@Unicode@ <simyou.ttf}
+ \pdfmapline{=gbksongsl@UGBK@ <simsun.ttc}
+ \pdfmapline{=gbkkaisl@UGBK@ <simkai.ttf}
+ \pdfmapline{=gbkheisl@UGBK@ <simhei.ttf}
+ \pdfmapline{=gbkfssl@UGBK@ <simfang.ttf}
+ \pdfmapline{=gbklisl@UGBK@ <simli.ttf}
+ \pdfmapline{=gbkyousl@UGBK@ <simyou.ttf}
+ \pdfmapline{=unisongsl@Unicode@ <simsun.ttc}
+ \pdfmapline{=unikaisl@Unicode@ <simkai.ttf}
+ \pdfmapline{=uniheisl@Unicode@ <simhei.ttf}
+ \pdfmapline{=unifssl@Unicode@ <simfang.ttf}
+ \pdfmapline{=unilisl@Unicode@ <simli.ttf}
+ \pdfmapline{=uniyousl@Unicode@ <simyou.ttf}
+\else
+ \special{pdf:mapline gbk@UGBK@ unicode :0:simsun.ttc -v 50}
+ \special{pdf:mapline gbksong@UGBK@ unicode :0:simsun.ttc -v 50}
+ \special{pdf:mapline gbkkai@UGBK@ unicode simkai.ttf -v 70}
+ \special{pdf:mapline gbkhei@UGBK@ unicode simhei.ttf -v 150}
+ \special{pdf:mapline gbkfs@UGBK@ unicode simfang.ttf -v 50}
+ \special{pdf:mapline gbkli@UGBK@ unicode simli.ttf -v 150}
+ \special{pdf:mapline gbkyou@UGBK@ unicode simyou.ttf -v 60}
+ \special{pdf:mapline cyberb@Unicode@ unicode :0:simsun.ttc -v 50}
+ \special{pdf:mapline unisong@Unicode@ unicode :0:simsun.ttc -v 50}
+ \special{pdf:mapline unikai@Unicode@ unicode simkai.ttf -v 70}
+ \special{pdf:mapline unihei@Unicode@ unicode simhei.ttf -v 150}
+ \special{pdf:mapline unifs@Unicode@ unicode simfang.ttf -v 50}
+ \special{pdf:mapline unili@Unicode@ unicode simli.ttf -v 150}
+ \special{pdf:mapline uniyou@Unicode@ unicode simyou.ttf -v 60}
+ \special{pdf:mapline gbksongsl@UGBK@ unicode :0:simsun.ttc -v 50 -s .167}
+ \special{pdf:mapline gbkkaisl@UGBK@ unicode simkai.ttf -v 70 -s .167}
+ \special{pdf:mapline gbkheisl@UGBK@ unicode simhei.ttf -v 150 -s .167}
+ \special{pdf:mapline gbkfssl@UGBK@ unicode simfang.ttf -v 50 -s .167}
+ \special{pdf:mapline gbklisl@UGBK@ unicode simli.ttf -v 150 -s .167}
+ \special{pdf:mapline gbkyousl@UGBK@ unicode simyou.ttf -v 60 -s .167}
+ \special{pdf:mapline unisongsl@Unicode@ unicode :0:simsun.ttc -v 50 -s .167}
+ \special{pdf:mapline unikaisl@Unicode@ unicode simkai.ttf -v 70 -s .167}
+ \special{pdf:mapline uniheisl@Unicode@ unicode simhei.ttf -v 150 -s .167}
+ \special{pdf:mapline unifssl@Unicode@ unicode simfang.ttf -v 50 -s .167}
+ \special{pdf:mapline unilisl@Unicode@ unicode simli.ttf -v 150 -s .167}
+ \special{pdf:mapline uniyousl@Unicode@ unicode simyou.ttf -v 60 -s .167}
\fi
-
+%</windows>
+% \end{macrocode}
+%
+% \begin{macrocode}
\ctex@zhmap@endinput
%</zhmap>
% \end{macrocode}
%
% \subsubsection{制作 \texttt{spa} 文件}
%
+% \changes{v2.5.2}{2020/05/05}{\file{ctexmakespa.tex} 更名为 \file{ctex-spa-make.tex}。}
+% \changes{v2.5.2}{2020/05/05}{\file{ctexspamacro.tex} 更名为 \file{ctex-spa-macro.tex}。}
+%
% 我们通过 \XeTeX{} 的 \tn{XeTeXglyphbounds} 取得字体中标点符号的边界信息,为
% \pkg{CJKpunct} 宏包制作 \file{spa}。
%
@@ -10562,7 +11138,7 @@ Copyright and Licence
\ExplSyntaxOn
\sys_if_engine_xetex:F
{
- \msg_new:nn { ctex } { xetex }
+ \msg_new:nnn { ctex } { xetex }
{ XeTeX~is~required~to~compile~this~document! }
\msg_fatal:nn { ctex } { xetex }
}
@@ -10588,7 +11164,7 @@ Copyright and Licence
% \begin{macro}[int]{\ctex_make_spa:nn}
% |#1| 是 \file{spa} 文件名,|#2| 是由 CJK 族名与字体构成的逗号列表。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_make_spa:nn #1#2
+\cs_new_protected:Npn \ctex_make_spa:nn #1#2
{
\iow_open:Nn \g_@@_spa_iow {#1}
\clist_map_inline:nn {#2}
@@ -10619,7 +11195,7 @@ Copyright and Licence
}
\group_end:
}
-\cs_new_protected_nopar:Npn \@@_save_bounds:n #1
+\cs_new_protected:Npn \@@_save_bounds:n #1
{
\clist_put_right:Nx \l_@@_punct_bounds_clist
{
@@ -10632,7 +11208,7 @@ Copyright and Licence
%
% \pkg{CJKpunct} 要求的格式是边界空白宽度与 1\,em 的比值的一百倍。
% \begin{macrocode}
-\cs_new_nopar:Npn \@@_calc_bounds:nn #1#2
+\cs_new:Npn \@@_calc_bounds:nn #1#2
{
\fp_eval:n
{
@@ -10651,20 +11227,21 @@ Copyright and Licence
% 下面是 \CTeX{} 定义的一些字体。
% \begin{macrocode}
%<*make>
-\input ctexspamacro %
-
+\input ctex-spa-macro %
\MAKESPA {ctexpunct.spa}
{
{adobezhsong} {AdobeSongStd-Light} ,
{adobezhhei} {AdobeHeitiStd-Regular} ,
{adobezhkai} {AdobeKaitiStd-Regular} ,
{adobezhfs} {AdobeFangsongStd-Regular} ,
+%
{fandolzhsong} {FandolSong} ,
{fandolzhsongb} {FandolSong-Bold} ,
{fandolzhhei} {FandolHei} ,
{fandolzhheib} {FandolHei-Bold} ,
{fandolzhkai} {FandolKai} ,
{fandolzhfs} {FandolFang} ,
+%
{founderzhsong} {FZShuSong-Z01} ,
{founderzhsongb} {FZXiaoBiaoSong-B05} ,
{founderzhhei} {FZHei-B01} ,
@@ -10674,9 +11251,26 @@ Copyright and Licence
{founderzhli} {FZLiShu-S01} ,
{founderzhyou} {FZXiYuan-M01} ,
{founderzhyoub} {FZZhunYuan-M02} ,
- {ubuntuzhsong} {AR PL UMing CN} ,
- {ubuntuzhhei} {WenQuanYi Zen Hei} ,
- {ubuntuzhkai} {AR PL UKai CN} ,
+%
+ {maczhsong} {Songti SC Light} ,
+ {maczhsongb} {Songti SC Bold} ,
+ {maczhhei} {Heiti SC Medium} ,
+ {maczhheil} {Heiti SC Light} ,
+ {maczhkai} {Kaiti SC} ,
+ {maczhkaib} {Kaiti SC Bold} ,
+ {maczhfs} {STFangsong} ,
+ {maczhli} {Baoli SC} ,
+ {maczhyou} {Yuanti SC Light} ,
+ {maczhyoub} {Yuanti SC Regular} ,
+ {maczhpf} {PingFang SC} ,
+ {maczhpfb} {PingFang SC Semibold} ,
+%
+ {ubuntuzhsong} {Noto Serif CJK SC} ,
+ {ubuntuzhsongb} {Noto Serif CJK SC Bold} ,
+ {ubuntuzhhei} {Noto Sans CJK SC} ,
+ {ubuntuzhheib} {Noto Sans CJK SC Bold} ,
+ {ubuntuzhkai} {AR PL KaitiM GB} ,
+%
{windowszhsong} {SimSun} ,
{windowszhhei} {SimHei} ,
{windowszhkai} {KaiTi} ,
@@ -10686,7 +11280,6 @@ Copyright and Licence
{windowszhyahei} {Microsoft YaHei} ,
{windowszhyaheib} {Microsoft YaHei Bold}
}
-
\primitive\end
%</make>
%</spa>
@@ -10827,21 +11420,74 @@ Copyright and Licence
% \subsection{\pkg{ctexhook} 宏包}
%
% \changes{v2.2}{2015/06/26}{将文档开头和宏包末尾钩子提取到 \pkg{ctexhook} 宏包中。}
+% \changes{v2.5}{2020/04/21}{增加宏包开头钩子。}
+% \changes{v2.5.4}{2020/08/02}{兼容 \LaTeX \ 2020/10/01 的钩子机制。}
%
% \begin{macrocode}
%<*ctexhook>
% \end{macrocode}
%
+% \begin{macro}[int]{\ctex_at_begin_package:nn}
+% 如果宏包已经被载入,则钩子无效,给出警告。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_at_begin_package:nn #1
+ {
+ \@ifpackageloaded {#1}
+ { \@@_package_loaded_warning:nn {#1} }
+ { \ctex_gadd_package_hook:nnn { before } {#1} }
+ }
+\cs_new_protected:Npn \@@_package_loaded_warning:nn #1#2
+ { \msg_warning:nnx { ctex } { invalid-hook } {#1} }
+\msg_new:nnn { ctex } { invalid-hook }
+ {
+ Package~`#1'~is~loaded. \\
+ \token_to_str:N \ctex_at_begin_package:nn \{#1\}\{...\}~is~invalid.
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\ctex_at_end_package:nn}
+% 与 \pkg{filehook} 的 \tn{AtEndOfPackageFile*} 类似,如果原来没有在载入宏包则
+% 在宏包末尾执行语句,否则立即执行。
+% \begin{macrocode}
+\cs_new_protected:Npn \ctex_at_end_package:nn #1
+ {
+ \@ifpackageloaded {#1}
+ { \use:n }
+ { \ctex_gadd_package_hook:nnn { after } {#1} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \LaTeX \ 2020/10/01 开始提供常用钩子管理机制。在新机制下,我们只需要做简单的包装。
+% \begin{macrocode}
+\@ifl@t@r \fmtversion { 2020/10/01 }
+ {
+ \cs_new_protected:Npx \ctex_gadd_ltxhook:nn #1
+ { \hook_gput_code:nnn {#1} { \c_novalue_tl } }
+ \cs_new_protected:Npn \ctex_at_end_preamble:n
+ { \ctex_gadd_ltxhook:nn { env/document/before } }
+ \cs_new_protected:Npn \ctex_after_end_preamble:n
+ { \ctex_gadd_ltxhook:nn { begindocument/end } }
+ \cs_new_protected:Npn \ctex_gadd_package_hook:nnn #1#2
+ { \ctex_gadd_ltxhook:nn { package/#1/#2 } }
+ \file_input_stop:
+ }
+ { }
+% \end{macrocode}
+%
+% 对于 \LaTeX \ 2020/10/01 之前的版本,需要自行补丁。
+%
% \begin{macro}[int]{\ctex_at_end_preamble:n,\ctex_after_end_preamble:n}
% 实现 \pkg{etoolbox} 宏包的 \tn{AtEndPreamble} 和 \tn{AfterEndPreamble}。
% \begin{macrocode}
-\cs_new_protected:Npn \ctex_at_end_preamble:n #1
- { \tl_gput_right:Nn \g_@@_end_preamble_hook_tl {#1} }
-\cs_new_protected:Npn \ctex_after_end_preamble:n #1
- { \tl_gput_right:Nn \g_@@_after_end_preamble_hook_tl {#1} }
-\cs_new_protected_nopar:Npn \CTEX@document@left@hook
+\cs_new_protected:Npn \ctex_at_end_preamble:n
+ { \tl_gput_right:Nn \g_@@_end_preamble_hook_tl }
+\cs_new_protected:Npn \ctex_after_end_preamble:n
+ { \tl_gput_right:Nn \g_@@_after_end_preamble_hook_tl }
+\cs_new_protected:Npn \CTEX@document@left@hook
{ \group_end: \g_@@_end_preamble_hook_tl \group_begin: }
-\cs_new_protected_nopar:Npn \CTEX@document@right@hook
+\cs_new_protected:Npn \CTEX@document@right@hook
{ \scan_stop: \g_@@_after_end_preamble_hook_tl \tex_ignorespaces:D }
\cs_set_nopar:Npx \document
{
@@ -10854,51 +11500,59 @@ Copyright and Licence
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[int]{\ctex_at_end_package:nn}
-% 与 \pkg{filehook} 的 \tn{AtEndOfPackageFile*} 类似,如果原来没有在载入宏包则
-% 在宏包末尾执行语句,否则立即执行。
+% \begin{macro}[int]{\ctex_gadd_package_hook:nnn,
+% \ctex_gadd_hook:Nn, \ctex_gadd_hook:cn}
+% 给钩子附加内容。
% \begin{macrocode}
-\cs_new_protected:Npn \ctex_at_end_package:nn #1#2
+\cs_new_protected:Npn \ctex_gadd_package_hook:nnn #1#2
+ { \ctex_gadd_hook:cn { g_@@_at_ #1 _ #2 _hook_tl } }
+\cs_new_protected:Npn \ctex_gadd_hook:Nn #1
{
- \@ifpackageloaded {#1}
- {#2}
- { \ctex_gadd_hook:cn { g_@@_at_end_ #1 _hook_tl } {#2} }
+ \tl_if_exist:NF #1 { \tl_new:N #1 }
+ \tl_gput_right:Nn #1
}
+\cs_generate_variant:Nn \ctex_gadd_hook:Nn { c }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[int]{\ctex_gadd_hook:Nn, \ctex_gadd_hook:cn}
-% 给钩子附加内容。
+% \begin{macro}[int]{\ctex_use_package_hook:nn}
+% 宏包钩子,只执行一次,用后清除。
% \begin{macrocode}
-\cs_new_protected:Npn \ctex_gadd_hook:Nn #1#2
+\cs_new_protected:Npn \ctex_use_package_hook:nn #1#2
{
- \tl_if_exist:NF #1 { \tl_new:N #1 }
- \tl_gput_right:Nn #1 {#2}
+ \group_begin: \exp_args:NNc \group_end:
+ \@@_use_package_hook_aux:N { g_@@_at_ #1 _ #2 _hook_tl }
}
-\cs_generate_variant:Nn \ctex_gadd_hook:Nn { c }
+\cs_new_protected:Npn \@@_use_package_hook_aux:N #1
+ { \cs_if_exist_use:NT #1 { \cs_undefine:N #1 } }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[int]{\ctex_package_end_hook:n, \ctex_package_end_hook:o}
-% 宏包末尾钩子,只执行一次,用后清除。
+% \begin{macro}[int]{\@reset@ptions,\CTEX@reset@ptions@hook}
+% \tn{@pushfilename} 内部的 \tn{@currname} 和 \tn{@currext} 保存的是
+% 前一个宏包的状态,不能使用。需要对其后的 \tn{@reset@ptions} 做补丁来实现
+% \cs{ctex_at_begin_package:nn} 的功能。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \ctex_package_end_hook:n #1
+\tl_put_right:Nn \@reset@ptions { \CTEX@reset@ptions@hook }
+\cs_new_protected:Npn \CTEX@reset@ptions@hook
{
- \cs_if_exist_use:cT { g_@@_at_end_ #1 _hook_tl }
- { \cs_undefine:c { g_@@_at_end_ #1 _hook_tl } }
+ \cs_if_eq:NNT \@currext \@pkgextension
+ { \ctex_use_package_hook:nn { before } { \@currname } }
}
-\cs_generate_variant:Nn \ctex_package_end_hook:n { o }
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[int]{\@popfilename,\CTEX@popfilename@hook}
% 对 \tn{@popfilename} 做补丁来实现 \cs{ctex_at_end_package:nn} 的功能。
% \begin{macrocode}
-\tl_put_left:Nn \@popfilename
+\tl_put_left:Nn \@popfilename { \CTEX@popfilename@hook }
+\cs_new_protected:Npn \CTEX@popfilename@hook
{
\cs_if_eq:NNT \@currext \@pkgextension
- { \ctex_package_end_hook:o { \@currname } }
+ { \ctex_use_package_hook:nn { after } { \@currname } }
}
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
%</ctexhook>
@@ -10913,10 +11567,6 @@ Copyright and Licence
%<*ctexpatch>
% \end{macrocode}
%
-% \begin{macrocode}
-\cs_if_exist:NF \str_new:N { \RequirePackage { l3str } }
-% \end{macrocode}
-%
% \begin{macro}[int]{\ctex_patch_cmd_once:NnnnTF}
% 只进行第一次匹配进行替换。参数 |#2| 是宏重建时的 \tn{catcode} 设置。
% \begin{macrocode}
@@ -10988,14 +11638,14 @@ Copyright and Licence
% \begin{macrocode}
\cs_new_protected:Npn \ctex_patch_boot:NNnnTF #1#2#3#4#5#6
{
- \tl_set:Nn \@@_patch_true:w {#5}
- \tl_set:Nn \@@_patch_false:w {#6}
+ \cs_set_protected:Npx \@@_patch_true:w { \exp_not:n {#5} }
+ \cs_set_protected:Npx \@@_patch_false:w { \exp_not:n {#6} }
\group_begin:
\char_set_catcode_other:n { 35 }
\ctex_parse_name:NN #1 #2 {#3} {#4}
}
-\tl_new:N \@@_patch_true:w
-\tl_new:N \@@_patch_false:w
+\cs_new_eq:NN \@@_patch_true:w \use_i:nn
+\cs_new_eq:NN \@@_patch_false:w \use_ii:nn
% \end{macrocode}
% \end{macro}
%
@@ -11040,7 +11690,7 @@ Copyright and Licence
\exp_not:N ##2
\exp_not:c { ##3 ~ }
\exp_not:c { #1##3 }
- } {##3} ##1
+ } { ##3 } ##1
}
{ ##1##2 }
}
@@ -11057,8 +11707,8 @@ Copyright and Licence
\str_if_eq:eeTF
{ \exp_not:n { #1@protected@ ##3 #1##3 } }
{
- \exp_last_unbraced:Nf \@@_parse_name:w
- \cs_replacement_spec:N ##3 #3 ~ #2 \q_stop
+ \exp_last_unbraced:Ne \@@_parse_name:w
+ { \cs_replacement_spec:N ##3 } #3 ~ #2 \q_stop
}
{ #1##5 ~ } { ##5 ~ }
}
@@ -11270,903 +11920,4 @@ Copyright and Licence
%
% \Finale
%
-% \endinput
-%
-% \DisableImplementation
-%
-% \begin{implementation}
-%
-% \subsection{\cls{ctxdoc}}
-%
-% \begin{macrocode}
-%<*ctxdoc>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=ctxdoc>
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ExplSyntaxOff
-\let\pdfmdfivesum\mdfivesum
-\DeclareOption*{\PassOptionsToClass{\CurrentOption}{l3doc}}
-\PassOptionsToClass{a4paper,full}{l3doc}
-\ProcessOptions
-\@namedef{ver@thumbpdf.sty}{9999/99/99}
-\LoadClass{l3doc}
-\RequirePackage[UTF8, punct = kaiming, heading, fontset = none,
- linespread = 1.2, sub3section]{ctex}
-\ifxetex
- \xeCJKsetup{AutoFakeBold=false}
-\fi
-\ctexset{
- fontset,
- abstractname = 简介,
- indexname = 代码索引,
- section = {
- format = \Large\bfseries\raggedright,
- name = {第,节},
- },
-}
-\RequirePackage[toc]{multitoc}
-\RequirePackage{geometry}
-\RequirePackage{tabularx}
-\RequirePackage{makecell}
-\RequirePackage{threeparttable}
-\RequirePackage{siunitx}
-\RequirePackage{unicode-math}
-\RequirePackage{xcolor}
-\RequirePackage{caption}
-\RequirePackage{fancyvrb-ex}
-\RequirePackage{zref-base}
-\geometry{includemp,hmargin={0mm,15mm},vmargin={25mm,15mm},footskip=7mm}
-\hypersetup{pdfstartview=FitH,bookmarksdepth=subparagraph}
-\setcounter{secnumdepth}{4}
-\setcounter{tocdepth}{2}
-\newcommand*\email{\nolinkurl}
-\setmainfont{TeX Gyre Pagella}
-\setsansfont{TeX Gyre Heros}
-\setmonofont[
- HyphenChar = None ,
- UprightFont=* Light, BoldFont=* Bold,
- SlantedFont=* Light Oblique]{CMU Typewriter Text}
-\setmathfont{texgyrepagella-math.otf}
-\captionsetup{strut=off, labelsep=quad, labelfont+=bf}
-%% <--- http://tex.stackexchange.com/a/40896
-\patchcmd{\@addtocurcol}%
- {\vskip \intextsep}%
- {\edef\save@first@penalty{\the\lastpenalty}\unpenalty
- \ifnum \lastpenalty = \@M % hopefully the OR penalty
- \unpenalty
- \else
- \penalty \save@first@penalty \relax % put it back
- \fi
- \ifnum\outputpenalty <-\@Mii
- \addvspace\intextsep
- \vskip\parskip
- \else
- \addvspace\intextsep
- \fi}%
- {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}
-\patchcmd{\@addtocurcol}%
- {\vskip\intextsep \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi}%
- {\ifnum\outputpenalty <-\@Mii
- \aftergroup\vskip\aftergroup\intextsep
- \aftergroup\nointerlineskip
- \else
- \vskip\intextsep
- \fi}%
- {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}
-\patchcmd{\@getpen}{\@M}{\@Mi}
- {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}
-%% --->
-%% 不对代码实现的 \section 以下标题编目录。
-\AtBeginEnvironment{implementation}{%
- \ifnum\value{tocdepth}>\@ne
- \addtocontents{toc}{\protect\value{tocdepth}=1\relax}%
- \fi}
-\ifxetex
- \let\ctexdocverbaddon\xeCJKVerbAddon
- \def\ctexdisableecglue{\xeCJKsetup{CJKecglue}}
- \def\ctexplainps{\xeCJKsetup{PunctStyle=plain}}
- \appto\meta@font@select{\ifinner\ctexdisableecglue\fi}
-\else
- \let\ctexdocverbaddon\relax
- \let\ctexplainps\relax
- \def\ctexdisableecglue{\ltjsetparameter{autoxspacing=false}}
- \appto\meta@font@select{\ctexdisableecglue}
-\fi
-\setlist{noitemsep,topsep=\smallskipamount}
-\setlist[1]{labelindent=\parindent}
-\setlist[enumerate]{leftmargin=*}
-\setlist[itemize]{leftmargin=*}
-\newlist{optdesc}{description}{3}
-%% 设置间距为 \marginparsep,与 l3doc 一致
-\setlist[optdesc]{%
- font=\mdseries\small\ttfamily,align=right,listparindent=\parindent,
- labelsep=\marginparsep,labelindent=-\marginparsep,leftmargin=*}
-%% 重新定义 threeparttable 包的 tablenotes 环境
-\renewlist{tablenotes}{description}{1}
-\setlist[tablenotes]{%
- format=\normalfont\tnote@item,align=right,listparindent=\parindent,
- labelindent=\tabcolsep,leftmargin=*,rightmargin=\tabcolsep,
- after=\@noparlisttrue}
-\AtBeginEnvironment{tablenotes}{%
- \setlength\parindent{2\ccwd}%
- \normalfont\footnotesize}
-\AtBeginEnvironment{threeparttable}{%
- \stepcounter{tpt@id}%
- \edef\curr@tpt@id{tpt@\arabic{tpt@id}}}
-\newcounter{tpt@id}
-\def\tnote@item#1{%
- \Hy@raisedlink{\hyper@anchor{\curr@tpt@id-#1}}#1}
-\def\TPTtagStyle#1{\hyperlink{\curr@tpt@id-#1}{#1}}
-\fvset{
- fontsize=\small,baselinestretch=1,numbersep=5pt,
- formatcom=\ctexdocverbaddon,
- listparameters=\setlength\topsep{\MacrocodeTopsep}}
-\DefineVerbatimEnvironment{frameverb}{Verbatim}{%
- gobble=4,
- frame=single,framesep=8pt,
- listparameters=
- \setlength\topsep{\medskipamount}%
- \appto\FV@EndList{\nointerlineskip}}
-\DefineVerbatimEnvironment{ctexexam}{Verbatim}{%
- gobble=4,
- frame=single,framesep=10pt,
- label=\rule{0pt}{12pt}\textnormal{\bfseries 例 \arabic{ctexexam}},
- listparameters=
- \setlength\topsep{\bigskipamount}%
- \refstepcounter{ctexexam}\ctexexamlabelref
- \appto\FV@EndList{\nointerlineskip}}
-\define@key{FV}{labelref}{\def\ctexexamlabelref{\label{#1}}}
-\let\ctexexamlabelref\empty
-\newcounter{ctexexam}
-\BeforeBeginEnvironment{function}{\par\nointerlineskip}
-\AtEndEnvironment{function}{%
- \par\xdef\ctexfixprevdepth{\prevdepth=\the\prevdepth\space}}
-\AfterEndEnvironment{function}{\ctexfixprevdepth}
-\AtBeginEnvironment{syntax}{\linespread{1}\ctexplainps\ctexdisableecglue}
-\BeforeBeginEnvironment{SideBySideExample}{\par\addvspace{\medskipamount}}
-\newcommand*\exptarget{\Hy@raisedlink{\hypertarget{expstar}{}}}
-\newcommand*\rexptarget{\Hy@raisedlink{\hypertarget{rexpstar}{}}}
-\newcommand*\expstar{\hyperlink{expstar}{$\star$}}
-\newcommand*\rexpstar{\hyperlink{rexpstar}{\ding{73}}}
-\ExplSyntaxOn
-%% l3doc 会设置列表环境中 \listparindent=\z@,我们在这里恢复它。
-\cs_set_eq:NN \list \__codedoc_oldlist:nn
-\cs_new_nopar:Npn \zihaopt #1
- {
- \exp_last_unbraced:Nf \tl_head:w
- { \prop_item:Nn \c__ctex_font_size_prop {#1} } { } \q_stop
- }
-%% 抑制首段的 \parskip
-\ctex_patch_cmd_once:NnnnTF \__codedoc_function_descr_start:w
- { }
- { \noindent }
- { \skip_vertical:n { -\parskip } \noindent }
- { \iow_term:n { *** ~ SUCCESS ~ *** } }
- { \iow_term:n { *** ~ FAIL ~ *** } }
-%% l3doc 会在 function 环境的 syntax 和 descr 盒子中间加上 \medskipamount 的距离。
-%% 但是若 syntax 盒子为空(未使用 syntax 环境),就会显得不好看。
-%% 此时我们通过将 \medskipamount 设置为零来修正。若盒子非空,则将 \parskip 还回去。
-\ctex_preto_cmd:NnnTF \__codedoc_function_assemble:
- { }
- { \ctex_doc_fix_yoffset: }
- { \iow_term:n { *** ~ SUCCESS ~ *** } }
- { \iow_term:n { *** ~ FAIL ~ *** } }
-\cs_new_protected_nopar:Npn \ctex_doc_fix_yoffset:
- {
- \box_if_empty:NTF \g__codedoc_syntax_box
- { \skip_zero:N \medskipamount }
- { \skip_add:Nn \medskipamount { \parskip } }
- }
-%% 左侧边注的函数列表采用单倍行距
-\ctex_preto_cmd:NnnTF \__codedoc_typeset_functions:
- { }
- { \MacroFont }
- { \iow_term:n { *** ~ SUCCESS ~ *** } }
- { \iow_term:n { *** ~ FAIL ~ *** } }
-\ctex_patch_cmd_once:NnnnTF \__codedoc_macro_init:
- { }
- { \hbox:n }
- { \MacroFont \hbox:n }
- { \iow_term:n { *** ~ SUCCESS ~ *** } }
- { \iow_term:n { *** ~ FAIL ~ *** } }
-\ctex_patch_cmd_once:NnnnTF \__codedoc_macro_dump:
- { }
- { \hbox_unpack_drop:N }
- { \MacroFont \hbox_unpack_drop:N }
- { \iow_term:n { *** ~ SUCCESS ~ *** } }
- { \iow_term:n { *** ~ FAIL ~ *** } }
-\cs_set_eq:NN \__codedoc_macro_end_style:n \use_none:n
-\cs_set_protected:Npn \__codedoc_macro_typeset_one:nN #1#2
- {
- \vbox_set:Nn \l__codedoc_macro_box
- {
- \MacroFont
- \vbox_unpack_drop:N \l__codedoc_macro_box
- \hbox_set:Nn \l_tmpa_box
- { \__codedoc_print_macroname:nN {#1} #2 }
- \dim_set:Nn \l_tmpa_dim { \marginparwidth - \labelsep }
- \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l_tmpa_dim
- {
- \box_resize_to_wd_and_ht:Nnn \l_tmpa_box
- { \l_tmpa_dim }
- { \box_ht:N \l_tmpa_box }
- }
- \hbox_overlap_left:n
- {
- \box_use:N \l_tmpa_box
- \skip_horizontal:n { \marginparsep - \labelsep }
- }
- }
- \int_incr:N \l__codedoc_macro_int
- }
-\cs_set_protected:Npn \__codedoc_print_macroname:nN #1#2
- {
- \strut
- \__codedoc_get_hyper_target:xN
- {
- \exp_not:n {#1}
- \bool_if:NT #2 { \tl_to_str:n {TF} }
- }
- \l__codedoc_tmpa_tl
- \cs_if_exist:cTF { r@ \l__codedoc_tmpa_tl }
- { \exp_args:NNo \label@hyperref [ \l__codedoc_tmpa_tl ] }
- { \use:n }
- {
- \tl_set:Nn \l__codedoc_tmpa_tl {#1}
- \tl_replace_all:Non \l__codedoc_tmpa_tl
- { \c_catcode_other_space_tl }
- { \fontspec_visible_space: }
- \__codedoc_macroname_prefix:o \l__codedoc_tmpa_tl
- \__codedoc_macroname_suffix:N #2
- }
- }
-\AtBeginEnvironment { syntax }
- {
- \char_set_catcode_active:N \|
- \char_set_active_eq:NN \| \orbar
- \char_set_catcode_active:N \(
- \char_set_active_eq:NN \( \defaultvalaux
- }
-%% 不对目录中出现的 \cs 和 \tn 等编索引
-\DeclareDocumentCommand \StopSpecialIndexModule { }
- { \cs_set_eq:NN \__codedoc_special_index_module:nnnnN \use_none:nnnnn }
-\tl_map_inline:nn { \actualchar \encapchar \levelchar }
- { \exp_args:Nx \DoNotIndex { \bslash \tl_to_str:N #1 } }
-\DeclareDocumentCommand \package { o m }
- {
- \exp_args:Nx \href
- {
- http \c_colon_str //www.ctan.org/pkg/
- \IfNoValueTF {#1} { \str_fold_case:n {#2} } {#1}
- }
- { \pkg {#2} }
- }
-\DeclareDocumentCommand \GetFileId { m }
- {
- \GetFileInfo {#1}
- \file_get:nnNTF { \c_sys_jobname_str .id }
- { \int_set:Nn \tex_endlinechar:D { -1 } } \l_@@_tmp_tl
- { \exp_after:wN \GetIdInfo \l_@@_tmp_tl }
- { \GetIdInfo $Id$ }
- { \fileinfo }
- }
-\cs_new_eq:NN \@@_ltx_changes:nnn \changes@
-\cs_set_protected:Npn \changes@ #1#2
- {
- \@@_save_version_date:nn {#1} {#2}
- \tl_if_empty:nTF {#1}
- { \@@_ltx_changes:nnn }
- { \@@_version_zfill:wnnn #1 \q_stop }
- {#1} {#2}
- }
-\cs_new_protected:Npn \@@_version_zfill:wnnn #1#2 \q_stop
- {
- \str_if_eq:nnTF {#1} { v }
- { \@@_version_zfill:nnnn {#2} }
- { \@@_ltx_changes:nnn }
- }
-\cs_new_protected:Npn \@@_version_zfill:nnnn #1#2
- {
- \tl_clear:N \l_@@_tmp_tl
- \int_zero:N \l_tmpa_int
- \seq_set_split:Nnn \l_tmpa_seq { . } {#1}
- \seq_map_function:NN \l_tmpa_seq \@@_version_zfill:n
- \int_compare:nNnF \l_tmpa_int > 2
- {
- \tl_put_right:Nx \l_@@_tmp_tl
- { \prg_replicate:nn { 3 - \l_tmpa_int } { 00000 } }
- }
- \@@_ltx_changes:nnn { \l_@@_tmp_tl \actualchar #2 }
- }
-\tl_new:N \l_@@_tmp_tl
-\cs_new_protected:Npn \@@_version_zfill:n #1
- {
- \int_incr:N \l_tmpa_int
- \tl_put_right:Nx \l_@@_tmp_tl
- {
- \prg_replicate:nn
- { \int_max:nn { 0 } { 5 - \tl_count:n {#1} } } { 0 }
- \exp_not:n {#1}
- }
- }
-\cs_new_protected:Npn \@@_save_version_date:nn #1#2
- {
- \prop_get:NnNTF \g_@@_version_date_prop {#1} \l_@@_tmp_tl
- { \exp_after:wN \@@_save_version_date:nnnn \l_@@_tmp_tl {#2} {#1} }
- { \@@_save_version_date:nnn {#1} {#2} {#2} }
- }
-\cs_new_protected:Npn \@@_save_version_date:nnnn #1#2#3#4
- {
- \@@_if_date_later:nnTF {#1} {#3}
- { \@@_save_version_date:nnn {#4} {#3} {#2} }
- {
- \@@_if_date_later:nnT {#3} {#2}
- { \@@_save_version_date:nnn {#4} {#1} {#3} }
- }
- }
-\prg_new_conditional:Npnn \@@_if_date_later:nn #1#2 { TF , T }
- {
- \if_int_compare:w \@@_parse_date:w #1 / / / 0 \q_stop >
- \@@_parse_date:w #2 / / / 0 \q_stop \exp_stop_f:
- \prg_return_true: \else: \prg_return_false: \fi:
- }
-\cs_new:Npn \@@_parse_date:w #1/#2/#3/ #4 \q_stop
- { #1#2#3 }
-\cs_new_protected:Npn \@@_save_version_date:nnn #1#2#3
- { \prop_gput:Nnn \g_@@_version_date_prop {#1} { {#2} {#3} } }
-\cs_new_protected:Npn \CTEX@versionitem #1 \efill
- {
- \@idxitem
- \prop_get:NnNTF \g_@@_version_date_prop {#1} \l_@@_tmp_tl
- { \exp_after:wN \@@_version_item:nnn \l_@@_tmp_tl {#1} }
- { \BOOM }
- }
-\cs_new_protected:Npn \@@_version_item:nnn #1#2#3
- {
- \noindent
- \Hy@raisedlink { \belowpdfbookmark {#3} { HD.#3 } }
- \textbf {#3} \hfill
- \hbox:n
- {
- \footnotesize
- \str_if_eq:nnTF {#1} {#2}
- { ( #1 ) }
- { ( #1 ~ -- ~ #2 ) }
- }
- \par \nopagebreak
- }
-\prop_new:N \g_@@_version_date_prop
-\ctex_patch_cmd:Nnn \HDorg@theglossary
- { \let \item \@idxitem }
- { \let \item \CTEX@versionitem }
-\ctex_patch_cmd:Nnn \l@section { 2.5em } { 1.5em }
-\ctex_patch_cmd:Nnn \l@subsection { 2.5em } { 1.5em }
-\ctex_patch_cmd:Nnn \@wrglossary
- { hdpindex }
- {
- \ifnum \c@HD@hypercount = \z@
- hdpindex
- \else
- hdclindex { \the \c@HD@hypercount }
- \fi
- }
-%% 重定义 macrocode 环境的实现,逐行处理
-\cs_set_protected_nopar:Npn \xmacro@code
- { \@@_marco_code:w }
-\cs_set_protected_nopar:Npn \sxmacro@code
- {
- \fontspec_print_visible_spaces:
- \xmacro@code
- }
-\cs_new_protected_nopar:Npn \@@_marco_code:w
- {
- \ifcodeline@index
- \@@_marco_every_par:n { \@@_code_line_no: }
- \else:
- \@@_marco_every_par:n { }
- \fi:
- \exp_args:Nx \@@_make_finish_tag:n { \@currenvir }
- \@@_verbatim_start:w
- }
-\cs_new_protected:Npn \@@_marco_every_par:n #1
- {
- \everypar
- {
- \everypar {#1}
- \if@inlabel
- \global \@inlabelfalse
- \@noparlistfalse
- \llap { \box \@labels \hskip \leftskip }
- \fi
- #1
- }
- }
-\ctex_patch_cmd:Nnn \macro@code
- { \if@inlabel \leavevmode \fi }
- { \partopsep \z@skip }
-\group_begin:
- \int_set:Nn \tex_endlinechar:D { -1 }
- \use:n
- {
- \char_set_catcode_active:n { 32 }
- \tl_const:Nn \c_@@_active_space_tl
- }
- { }
-\group_end:
-\group_begin:
- \char_set_catcode_active:n { 13 }
- \cs_new_protected:Npx \@@_make_finish_tag:n #1
- {
- \tl_set:Nn \exp_not:N \l_@@_verbatim_finish_tl
- {
- \c_percent_str
- \prg_replicate:nn { 4 }
- { \exp_not:o { \c_@@_active_space_tl } }
- \exp_not:o { \active@escape@char } end
- \c_left_brace_str #1 \c_right_brace_str
- \exp_not:N ^^M
- }
- }
- \cs_new_protected:Npn \@@_verbatim_start:w #1
- {
- \str_if_eq:nnTF {#1} { ^^M }
- { \@@_verbatim_read_line:w }
- { \@@_verbatim_read_line:w #1 }
- }
- \cs_new_protected:Npn \@@_verbatim_read_line:w #1 ^^M
- {
- \tl_set:Nn \l_@@_verbatim_line_tl { #1 ^^M }
- \tl_if_eq:NNTF \l_@@_verbatim_line_tl \l_@@_verbatim_finish_tl
- { \exp_args:Nx \end { \@currenvir } }
- {
- \@@_verbatim_process_line:
- \@@_verbatim_read_line:w
- }
- }
- \cs_new_protected:Npn \@@_swap_cr:
- { \exp_after:wN \@@_swap_cr:w \l_@@_verbatim_line_tl }
- \cs_new_protected:Npn \@@_swap_cr:w #1 ^^M
- {
- \group_insert_after:N ^^M
- \tl_set:Nn \l_@@_verbatim_line_tl {#1}
- }
- \tl_const:Nn \c_@@_active_cr_tl { ^^M }
-\group_end:
-\tl_new:N \l_@@_verbatim_line_tl
-\tl_new:N \l_@@_verbatim_finish_tl
-\tl_new:N \g_@@_verbatim_verb_stop_tl
-\cs_new_protected_nopar:Npn \@@_process_normal_line:
- {
- \str_if_eq:eeTF
- { \str_head:N \l_@@_verbatim_line_tl } { \c_percent_str }
- { \@@_check_angle:x { \tl_tail:N \l_@@_verbatim_line_tl } }
- { \@@_output_line: }
- }
-\cs_new_protected_nopar:Npn \@@_process_verb_line:
- {
- \tl_if_eq:NNTF \l_@@_verbatim_line_tl \g_@@_verbatim_verb_stop_tl
- {
- \tl_gclear:N \g_@@_verbatim_verb_stop_tl
- \cs_gset_eq:NN \@@_verbatim_process_line: \@@_process_normal_line:
- \@@_output_module:nn
- { \color { verb@guard } }
- {
- \@@_swap_cr:
- \@@_module_pop:n { \l_@@_verbatim_line_tl }
- }
- }
- { \tl_use:N \l_@@_verbatim_line_tl }
- }
-\cs_new_eq:NN \@@_verbatim_process_line: \@@_process_normal_line:
-\DeclareDocumentCommand \CheckModules { }
- { \cs_set_eq:NN \@@_verbatim_process_line: \@@_process_normal_line: }
-\DeclareDocumentCommand \DontCheckModules { }
- { \cs_set_eq:NN \@@_verbatim_process_line: \@@_output_line: }
-\cs_new_protected:Npn \@@_check_angle:n #1
- {
- \str_if_eq:eeTF { \str_head:n {#1} } { < }
- { \@@_check_module:x { \tl_tail:n {#1} } }
- { \@@_output_percent_line: }
- }
-\cs_generate_variant:Nn \@@_check_angle:n { x }
-\cs_new_protected:Npn \@@_check_module:n #1
- {
- \exp_args:Nx \str_case:nnF { \str_head:n {#1} }
- {
- { * } { \@@_module_star:w }
- { / } { \@@_module_slash:w }
- { @ } { \@@_module_at:w }
- { < } { \@@_module_verb:w }
- }
- { \@@_module_pm:w }
- #1 \q_stop
- }
-\cs_generate_variant:Nn \@@_check_module:n { x }
-\group_begin:
- \char_set_catcode_active:N \>
- \cs_new_protected:Npn \@@_module_star:w #1 > #2 \q_stop
- {
- \@@_output_module:nn
- { \@@_star_color: }
- { \@@_module_push:n { \@@_module_angle:n {#1} } }
- \@@_output_line:n {#2}
- \@@_star_format:
- }
- \cs_new_protected:Npn \@@_module_slash:w #1 > #2 \q_stop
- {
- \@@_output_module:nn
- { \@@_slash_color: }
- { \@@_module_pop:n { \@@_module_angle:n {#1} } }
- \@@_output_line:n {#2}
- \@@_slash_format:
- }
- \cs_new_protected:Npn \@@_module_at:w @ @ = #1 > #2 \q_stop
- {
- \@@_output_module:nn
- { \color { at@guard } }
- { \@@_module_angle:n { @ @ = #1 } }
- \tl_gset:Nn \g__codedoc_module_name_tl {#1}
- \@@_output_line:n {#2}
- }
- \cs_new_protected:Npn \@@_module_pm:w #1 > #2 \q_stop
- {
- \tex_noindent:D
- \hbox_overlap_left:n
- {
- \@@_output_module:nn
- { \@@_pm_color: }
- { \@@_module_angle:n {#1} }
- \skip_horizontal:n { \leftskip + \smallskipamount }
- }
- \group_begin:
- \@@_pm_format:
- \@@_output_line:n {#2}
- \group_end:
- }
- \cs_new_protected:Npn \@@_module_verb:w #1 \q_stop
- {
- \cs_gset_eq:NN \@@_verbatim_process_line: \@@_process_verb_line:
- \tl_gset:Nx \g_@@_verbatim_verb_stop_tl
- { \c_percent_str \tl_tail:n {#1} }
- \@@_output_module:nn
- { \color { verb@guard } }
- {
- \@@_swap_cr:
- \@@_module_push:n { \l_@@_verbatim_line_tl }
- }
- }
-\group_end:
-\cs_new_protected_nopar:Npn \@@_output_line:
- {
- \tex_noindent:D
- \@@_replace_at_at:N \l_@@_verbatim_line_tl
- \tl_use:N \l_@@_verbatim_line_tl
- }
-\cs_new_protected:Npn \@@_replace_at_at:N #1
- {
- \tl_if_empty:NF \g__codedoc_module_name_tl
- {
- \exp_args:NNo \@@_replace_at_at_aux:Nn
- #1 \g__codedoc_module_name_tl
- }
- }
-\cs_new_protected:Npn \@@_replace_at_at_aux:Nn #1#2
- {
- \tl_replace_all:Nnn #1 { _ @ @ } { _ _ #2 }
- \tl_replace_all:Nnn #1 { @ @ } { _ _ #2 }
- }
-\cs_new_protected:Npn \@@_output_line:n #1
- {
- \tl_set:Nn \l_@@_verbatim_line_tl {#1}
- \tl_if_eq:NNTF \l_@@_verbatim_line_tl \c_@@_active_cr_tl
- { \tl_use:N \l_@@_verbatim_line_tl }
- {
- \str_if_eq:eeTF
- { \str_head:N \l_@@_verbatim_line_tl }
- { \c_percent_str }
- { \@@_output_percent_line: }
- { \@@_output_line: }
- }
- }
-\cs_new_protected:Npn \@@_output_percent_line:
- {
- \tex_noindent:D
- \group_begin:
- \color { code@gray }
- \@@_swap_cr:
- \str_if_eq:eeTF { \f@shape } { \updefault }
- { \slshape }
- { \upshape }
- \@@_output_line:
- \group_end:
- }
-\cs_new_protected_nopar:Npn \@@_module_push:n
- { \exp_args:No \@@_module_push_aux:nn { \int_use:N \c@HD@hypercount } }
-\cs_new_protected:Npn \@@_module_push_aux:nn #1
- {
- \seq_gpush:Nn \g_@@_module_dest_seq {#1}
- \hypersetup { hidelinks }
- \exp_args:Nx \hdclindex
- { \zref@extractdefault { HD.#1 } { guard@end } { 1 } } { }
- }
-\cs_new_protected_nopar:Npn \@@_module_pop:n
- {
- \seq_gpop:NNTF \g_@@_module_dest_seq \l_@@_tmp_tl
- { \exp_args:No \@@_module_pop_aux:nn { \l_@@_tmp_tl } }
- { \BOOM \use:n }
- }
-\cs_new_protected:Npn \@@_module_pop_aux:nn #1
- {
- \zref@labelbylist { HD.#1 } { ctxdoc }
- \hypersetup { hidelinks }
- \hdclindex {#1} { }
- }
-\seq_new:N \g_@@_module_dest_seq
-\zref@newlist { ctxdoc }
-\zref@newprop { guard@end } [ 1 ]
- { \int_eval:n { \c@HD@hypercount - 1 } }
-\zref@addprop { ctxdoc } { guard@end }
-\cs_new_protected_nopar:Npn \@@_star_format:
- {
- \seq_gpush:No \g_@@_slash_format_seq { \macro@font }
- \seq_gpop:NNF \g_@@_star_format_seq \l_@@_format_tl
- { \@@_pop_format: }
- \@@_select_format:
- }
-\cs_new_protected_nopar:Npn \@@_slash_format:
- {
- \seq_gpop:NNTF \g_@@_slash_format_seq \l_@@_format_tl
- {
- \seq_gpush:No \g_@@_star_format_seq { \macro@font }
- \@@_select_format:
- }
- { \BOOM }
- }
-\cs_new_protected_nopar:Npn \@@_pm_format:
- {
- \seq_get:NNF \g_@@_star_format_seq \l_@@_format_tl
- {
- \@@_pop_format:
- \seq_gpush:No \g_@@_star_format_seq { \l_@@_format_tl }
- }
- \cs_if_eq:NNF \macro@font \l_@@_format_tl
- { \l_@@_format_tl }
- }
-\cs_new_protected_nopar:Npn \@@_pop_format:
- {
- \seq_gpop_left:NN \g_@@_format_seq \l_@@_format_tl
- \seq_gput_right:No \g_@@_format_seq { \l_@@_format_tl }
- }
-\cs_new_protected_nopar:Npn \@@_select_format:
- {
- \cs_if_eq:NNF \macro@font \l_@@_format_tl
- {
- \cs_gset_eq:NN \macro@font \l_@@_format_tl
- \macro@font
- }
- }
-\tl_new:N \l_@@_format_tl
-\seq_new:N \g_@@_format_seq
-\seq_new:N \g_@@_star_format_seq
-\seq_new:N \g_@@_slash_format_seq
-\seq_gput_right:Nn \g_@@_format_seq { \MacroFont }
-\seq_gput_right:Nn \g_@@_format_seq { \AltMacroFont }
-\cs_set_protected:Npn \MacroFont
- {
- \linespread { 1 }
- \small
- \fontseries { \mddefault }
- \fontshape { \updefault }
- \ttfamily
- \ctexdocverbaddon
- }
-\cs_set_protected:Npn \AltMacroFont
- {
- \linespread { 1 }
- \small
- \fontseries { \mddefault }
- \fontshape { \sldefault }
- \ttfamily
- \ctexdocverbaddon
- }
-\AtBeginDocument
- {
- \tl_gset:Nx \macro@font
- { \seq_item:Nn \g_@@_format_seq { 1 } }
- }
-\cs_new_protected:Npn \@@_output_module:nn #1#2
- {
- \tex_noindent:D
- \group_begin:
- #1
- \footnotesize \normalfont \sffamily #2
- \group_end:
- }
-\cs_new_protected_nopar:Npn \@@_star_color:
- {
- \seq_gpop:NNTF \g_@@_star_color_seq \current@color
- { \set@color }
- { \@@_select_color: }
- \seq_gpush:No \g_@@_slash_color_seq { \current@color }
- }
-\cs_new_protected_nopar:Npn \@@_slash_color:
- {
- \seq_gpop:NNTF \g_@@_slash_color_seq \current@color
- {
- \set@color
- \seq_gpush:No \g_@@_star_color_seq { \current@color }
- }
- { \BOOM }
- }
-\cs_new_protected_nopar:Npn \@@_pm_color:
- {
- \seq_get:NNTF \g_@@_star_color_seq \current@color
- { \set@color }
- {
- \@@_select_color:
- \seq_gpush:No \g_@@_star_color_seq { \current@color }
- }
- }
-\seq_new:N \g_@@_star_color_seq
-\seq_new:N \g_@@_slash_color_seq
-\cs_new_protected_nopar:Npn \@@_select_color:
- { \color { guard@series!!+ } }
-\definecolorseries { guard@series }
- { cmyk } { last } { blue } { purple }
-\resetcolorseries [ 3 ] { guard@series }
-\definecolor { verb@guard } { rgb } { 0.5 , 0.5 , 0 }
-\definecolor { at@guard } { rgb } { 0.5 , 0 , 0.5 }
-\definecolor { code@gray } { gray } { 0.5 }
-\cs_new_protected:Npn \@@_module_angle:n #1
- { \textlangle #1 \textrangle }
-\cs_new_protected_nopar:Npn \@@_code_line_no:
- {
- \int_gincr:N \c@CodelineNo
- \hbox_overlap_left:n
- {
- \hbox_to_wd:nn
- { \MacroIndent }
- {
- \HD@target
- \tex_hss:D
- \@@_code_line_no_style:
- \theCodelineNo \enspace
- }
- \tex_kern:D \@totalleftmargin
- }
- }
-\tl_set:Nn \theCodelineNo
- { \arabic { CodelineNo } }
-\cs_new_protected_nopar:Npn \@@_code_line_no_style:
- { \color { code@gray } \normalfont \sffamily \tiny }
-\cs_set_protected:Npn \HD@SetMacroIndent #1
- {
- \group_begin:
- \settowidth \MacroIndent
- {
- \@@_code_line_no_style:
- \prg_replicate:nn { \tl_count:n {#1} } { 0 }
- \enspace
- }
- \dim_gset_eq:NN \MacroIndent \MacroIndent
- \group_end:
- }
-\ExplSyntaxOff
-\AtBeginDocument{\addtocontents{toc}{\StopSpecialIndexModule}}
-\pdfstringdefDisableCommands{%
- \let\path\meta
- \let\opt\@firstofone}
-\preto\@thehead{\cslet{MakeUppercase\space}{\@iden}}
-\def\orbar{\textup{\textbar}}
-\def\defaultval#1{\textbf{\textup{#1}}}
-\def\defaultvalaux#1){\defaultval{#1}}
-\def\TF{true\orbar false}
-\def\TTF{\defaultval{true}\orbar false}
-\def\TFF{true\orbar\defaultval{false}}
-\protected\def\opt{\texttt}
-\def\pdfTeX{\hologo{pdfTeX}}
-\def\XeTeX{\hologo{XeTeX}}
-\def\XeLaTeX{\hologo{XeLaTeX}}
-\def\LuaLaTeX{\hologo{LuaLaTeX}}
-\def\pdfLaTeX{\hologo{pdfLaTeX}}
-\def\LaTeX{\hologo{LaTeX}}
-\def\LaTeXe{\hologo{LaTeX2e}}
-\def\LaTeXiii{\hologo{LaTeX3}}
-\def\dvipdfmx{DVIPDFM\textit{x}}
-\def\TeX{\hologo{TeX}}
-\def\ApTeX{Ap\TeX}
-\def\ApLaTeX{Ap\LaTeX}
-\def\upTeX{up\TeX}
-\def\upLaTeX{up\LaTeX}
-\def\bashcmd{\texttt}
-\def\TeXLive{\TeX\ Live}
-\def\MiKTeX{\hologo{MiKTeX}}
-\def\BSTACK{\begin{tabular}[t]{@{}l@{}}}
-\def\ESTACK{\end{tabular}}
-\newenvironment{defaultcapconfig}{%
- \MakePercentComment
- \input{ctex-name-utf8.cfg}%
- \ExplSyntaxOff
- \MakePercentIgnore}{}
-\def\ctexkit{\href{https://github.com/CTeX-org/ctex-kit/}{\texttt{ctex-kit}}}
-\def\ctexkitrev#1{%
- \href{https://github.com/CTeX-org/ctex-kit/commit/#1}{\texttt{ctex-kit} rev. #1}}
-\appto\GlossaryParms{%
- \raggedcolumns
- \let\Hy@writebookmark\HDorg@writebookmark
- \def\@idxitem{\par\hangindent 2em }%
- \def\subitem{\@idxitem\hspace*{1em}}%
- \def\subsubitem{\@idxitem\hspace*{2em}}}
-\def\glossaryname{版本历史}
-\GlossaryPrologue{\section{\glossaryname}}
-\IndexPrologue{%
- \section{\indexname}
- \textit{意大利体的数字表示描述对应索引项的页码;
- 带下划线的数字表示定义对应索引项的代码行号;
- 罗马字体的数字表示使用对应索引项的代码行号。}}
-\def\IndexLayout{%
- \newgeometry{hmargin=15mm,vmargin={25mm,15mm},footskip=7mm}%
- \setlength\IndexMin{.5\textheight}%
- \ctexset{section/numbering=false}%
- \StopSpecialIndexModule}
-\EnableCrossrefs
-\CodelineIndex
-\RecordChanges
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</ctxdoc>
-% \end{macrocode}
-%
-% \subsection{\pkg{ctxdocstrip}}
-%
-% \begin{macrocode}
-%<*docstrip>
-\csname ctxdocstriploaded\endcsname
-\let\ctxdocstriploaded\endinput
-\input l3docstrip %
-\edef\ctxresetcatcode{%
- \catcode\number`\$=\the\catcode`\$\relax}
-\makeOther\$
-\def\plusOption+#1>#2$#3$\endLine{%
- \maybeMsg{<+#1 . >}%
- \Evaluate{#1}%
- \def\ctxCMD{#2}%
- \def\ctxID{$#3$}%
- \def\do##1##2##3{%
- \if1\Expr{##2}%
- \readIDFile
- \StreamPut##1{\inLine}%
- \fi
- }%
- \activefiles
-}
-\def\readIDFile{%
- \openin\inputcheck=\jobname.id\relax
- \ifeof\inputcheck\else
- \read \inputcheck to \inLine
- \closein\inputcheck
- \ifx\inLine\empty\else
- \let\ctxID\inLine
- \fi
- \fi
- \maybeMsg{^^J\ctxID^^J}%
- \def\inLine{\ctxCMD\ctxID}%
-}
-\keepsilent
-\askforoverwritefalse
-\declarepreamble\emptypreamble
-\endpreamble
-\declarepostamble\emptypostamble
-\endpostamble
-\ctxresetcatcode
-%</docstrip>
-% \end{macrocode}
-%
-% \end{implementation}
-%
\endinput
diff --git a/Master/texmf-dist/source/latex/ctex/ctex.ins b/Master/texmf-dist/source/latex/ctex/ctex.ins
new file mode 100644
index 00000000000..4f8f45aa5ec
--- /dev/null
+++ b/Master/texmf-dist/source/latex/ctex/ctex.ins
@@ -0,0 +1,299 @@
+%%
+%% This is file `ctex.ins',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% ctex.dtx (with options: `install')
+%%
+%% Copyright (C) 2003--2020
+%% CTEX.ORG and any individual authors listed in the documentation.
+%% ---------------------------------------------------------------------
+%%
+%% 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. This version of this license is in
+%% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%% and the latest version of this license is in
+%% http://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".
+%%
+%% ---------------------------------------------------------------------
+%%
+
+\input ctxdocstrip %
+
+\preamble
+
+ Copyright (C) 2003--2020
+ CTEX.ORG and any individual authors listed in the documentation.
+---------------------------------------------------------------------
+
+ 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. This version of this license is in
+ http://www.latex-project.org/lppl/lppl-1-3c.txt
+ and the latest version of this license is in
+ http://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".
+
+---------------------------------------------------------------------
+
+\endpreamble
+\postamble
+
+ This package consists of the files ctex.dtx,
+ ctxdoc.cls,
+ ctxdocstrip.tex,
+ ctex-zhconv.lua,
+ ctex-zhconv-make.lua,
+ and the derived files ctex.pdf,
+ ctex.ins,
+ ctex.sty,
+ ctexsize.sty,
+ ctexheading.sty,
+ ctexart.cls,
+ ctexbook.cls,
+ ctexrep.cls,
+ ctexbeamer.cls,
+ ctexcap.sty,
+ ctexhook.sty,
+ ctexpatch.sty,
+ ctex-c5size.clo,
+ ctex-cs4size.clo,
+ ctex-heading-article.def,
+ ctex-heading-book.def,
+ ctex-heading-report.def,
+ ctex-heading-beamer.def,
+ ctex-scheme-plain.def,
+ ctex-scheme-plain-article.def,
+ ctex-scheme-plain-book.def,
+ ctex-scheme-plain-report.def,
+ ctex-scheme-plain-beamer.def,
+ ctex-scheme-chinese.def,
+ ctex-scheme-chinese-article.def,
+ ctex-scheme-chinese-book.def,
+ ctex-scheme-chinese-report.def,
+ ctex-scheme-chinese-beamer.def,
+ ctex-name-gbk.cfg,
+ ctex-name-utf8.cfg,
+ ctex.cfg,
+ ctexopts.cfg,
+ ctexbackend.cfg,
+ ctex-engine-pdftex.def,
+ ctex-engine-xetex.def,
+ ctex-engine-luatex.def,
+ ctex-engine-aptex.def,
+ ctex-engine-uptex.def,
+ c19rm.fd,
+ c19sf.fd,
+ c19tt.fd,
+ c70rm.fd,
+ c70sf.fd,
+ c70tt.fd,
+ jy2zhrm.fd,
+ jy2zhsf.fd,
+ jy2zhtt.fd,
+ jt2zhrm.fd,
+ jt2zhsf.fd,
+ jt2zhtt.fd,
+ ctex-fontset-adobe.def,
+ ctex-fontset-fandol.def,
+ ctex-fontset-founder.def,
+ ctex-fontset-mac.def,
+ ctex-fontset-macnew.def,
+ ctex-fontset-macold.def,
+ ctex-fontset-ubuntu.def,
+ ctex-fontset-windows.def,
+ ctexspa.def,
+ ctexpunct.spa,
+ ctex-spa-make.tex,
+ ctex-spa-macro.tex,
+ ctex-zhmap-adobe.tex,
+ ctex-zhmap-fandol.tex,
+ ctex-zhmap-founder.tex,
+ ctex-zhmap-mac.tex,
+ ctex-zhmap-ubuntu.tex,
+ ctex-zhmap-windows.tex,
+ ctex-zhconv-index.lua,
+ translator-theorem-dictionary-ChineseGBK.dict,
+ translator-theorem-dictionary-ChineseUTF8.dict, and
+ README.md.
+\endpostamble
+
+\generate
+ {
+ \usedir{tex/latex/ctex}
+ \file{ctex.sty} {\from{\jobname.dtx}{style,ctex}}
+ \file{ctexsize.sty} {\from{\jobname.dtx}{style,ctexsize}}
+ \file{ctexheading.sty} {\from{\jobname.dtx}{style,ctexheading}}
+ \file{ctexart.cls} {\from{\jobname.dtx}{class,article}}
+ \file{ctexbook.cls} {\from{\jobname.dtx}{class,book}}
+ \file{ctexrep.cls} {\from{\jobname.dtx}{class,report}}
+ \file{ctexbeamer.cls} {\from{\jobname.dtx}{class,beamer}}
+ \usepostamble\emptypostamble
+ \file{ctexcap.sty} {\from{\jobname.dtx}{ctexcap}}
+ \file{ctexhook.sty} {\from{\jobname.dtx}{ctexhook}}
+ \file{ctexpatch.sty} {\from{\jobname.dtx}{ctexpatch}}
+ \file{ctex-c5size.clo} {\from{\jobname.dtx}{c5size}}
+ \file{ctex-cs4size.clo} {\from{\jobname.dtx}{cs4size}}
+ \file{ctex-heading-article.def} {\from{\jobname.dtx}{heading,article}}
+ \file{ctex-heading-book.def} {\from{\jobname.dtx}{heading,book}}
+ \file{ctex-heading-report.def} {\from{\jobname.dtx}{heading,report}}
+ \file{ctex-heading-beamer.def} {\from{\jobname.dtx}{heading,beamer}}
+ \file{ctex-scheme-plain.def} {\from{\jobname.dtx}{scheme,generic,plain}}
+ \file{ctex-scheme-plain-article.def} {\from{\jobname.dtx}{scheme,article,plain}}
+ \file{ctex-scheme-plain-book.def} {\from{\jobname.dtx}{scheme,book,plain}}
+ \file{ctex-scheme-plain-report.def} {\from{\jobname.dtx}{scheme,report,plain}}
+ \file{ctex-scheme-plain-beamer.def} {\from{\jobname.dtx}{scheme,beamer,plain}}
+ \file{ctex-scheme-chinese.def} {\from{\jobname.dtx}{scheme,generic,chinese}}
+ \file{ctex-scheme-chinese-article.def} {\from{\jobname.dtx}{scheme,article,chinese}}
+ \file{ctex-scheme-chinese-book.def} {\from{\jobname.dtx}{scheme,book,chinese}}
+ \file{ctex-scheme-chinese-report.def} {\from{\jobname.dtx}{scheme,report,chinese}}
+ \file{ctex-scheme-chinese-beamer.def} {\from{\jobname.dtx}{scheme,beamer,chinese}}
+ \ctxfile{GBK}{ctex-name-gbk.cfg} {\from{\jobname.dtx}{name,GBK}}
+ \file{ctex-name-utf8.cfg} {\from{\jobname.dtx}{name,UTF8}}
+ \file{ctex.cfg} {\from{\jobname.dtx}{config}}
+ \file{ctexopts.cfg} {\from{\jobname.dtx}{ctexopts}}
+ \file{ctexbackend.cfg} {\from{\jobname.dtx}{backend}}
+ \file{ctex-engine-pdftex.def} {\from{\jobname.dtx}{pdftex}}
+ \file{ctex-engine-xetex.def} {\from{\jobname.dtx}{xetex}}
+ \file{ctex-engine-luatex.def} {\from{\jobname.dtx}{luatex}}
+ \file{ctex-engine-aptex.def} {\from{\jobname.dtx}{aptex}}
+ \file{ctex-engine-uptex.def} {\from{\jobname.dtx}{uptex}}
+ \file{c19rm.fd} {\from{\jobname.dtx}{fd,rm,c19}}
+ \file{c19sf.fd} {\from{\jobname.dtx}{fd,sf,c19}}
+ \file{c19tt.fd} {\from{\jobname.dtx}{fd,tt,c19}}
+ \file{c70rm.fd} {\from{\jobname.dtx}{fd,rm,c70}}
+ \file{c70sf.fd} {\from{\jobname.dtx}{fd,sf,c70}}
+ \file{c70tt.fd} {\from{\jobname.dtx}{fd,tt,c70}}
+ \file{jy2zhrm.fd} {\from{\jobname.dtx}{fd,rm,jy2}}
+ \file{jy2zhsf.fd} {\from{\jobname.dtx}{fd,sf,jy2}}
+ \file{jy2zhtt.fd} {\from{\jobname.dtx}{fd,tt,jy2}}
+ \file{jt2zhrm.fd} {\from{\jobname.dtx}{fd,rm,jt2}}
+ \file{jt2zhsf.fd} {\from{\jobname.dtx}{fd,sf,jt2}}
+ \file{jt2zhtt.fd} {\from{\jobname.dtx}{fd,tt,jt2}}
+ \file{ctex-fontset-adobe.def} {\from{\jobname.dtx}{fontset,adobe}}
+ \file{ctex-fontset-fandol.def} {\from{\jobname.dtx}{fontset,fandol}}
+ \file{ctex-fontset-founder.def} {\from{\jobname.dtx}{fontset,founder}}
+ \file{ctex-fontset-mac.def} {\from{\jobname.dtx}{fontset,mac}}
+ \file{ctex-fontset-macnew.def} {\from{\jobname.dtx}{fontset,macnew}}
+ \file{ctex-fontset-macold.def} {\from{\jobname.dtx}{fontset,macold}}
+ \file{ctex-fontset-ubuntu.def} {\from{\jobname.dtx}{fontset,ubuntu}}
+ \file{ctex-fontset-windows.def} {\from{\jobname.dtx}{fontset,windows}}
+ \ctxfile{GBK}{translator-theorem-dictionary-ChineseGBK.dict}
+ {\from{\jobname.dtx}{dict,theorem,GBK}}
+ \file{translator-theorem-dictionary-ChineseUTF8.dict}
+ {\from{\jobname.dtx}{dict,theorem,UTF8}}
+ \file{ctexspa.def} {\from{\jobname.dtx}{ctexspa}
+ \from{ctexpunct.spa}{}}
+ \usedir{tex/generic/ctex}
+ \file{ctex-spa-make.tex} {\from{\jobname.dtx}{spa,make}}
+ \file{ctex-spa-macro.tex} {\from{\jobname.dtx}{spa,macro}}
+ \file{ctex-zhmap-adobe.tex} {\from{\jobname.dtx}{zhmap,adobe}}
+ \file{ctex-zhmap-fandol.tex} {\from{\jobname.dtx}{zhmap,fandol}}
+ \file{ctex-zhmap-founder.tex} {\from{\jobname.dtx}{zhmap,founder}}
+ \file{ctex-zhmap-mac.tex} {\from{\jobname.dtx}{zhmap,mac}}
+ \file{ctex-zhmap-ubuntu.tex} {\from{\jobname.dtx}{zhmap,ubuntu}}
+ \file{ctex-zhmap-windows.tex} {\from{\jobname.dtx}{zhmap,windows}}
+ \nopreamble\nopostamble
+ \usedir{doc/latex/ctex}
+ \file{README.md} {\from{\jobname.dtx}{readme}}
+ }
+
+\catcode32=12\space
+
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* file into proper directories searched by TeX: *}
+\Msg{* *}
+\Msg{* The recommended directory is TDS:tex/latex/ctex *}
+\Msg{* *}
+\Msg{* ctex.sty *}
+\Msg{* ctexsize.sty *}
+\Msg{* ctexheading.sty *}
+\Msg{* ctexart.cls *}
+\Msg{* ctexbook.cls *}
+\Msg{* ctexrep.cls *}
+\Msg{* ctexbeamer.cls *}
+\Msg{* ctexcap.sty *}
+\Msg{* ctexhook.sty *}
+\Msg{* ctexpatch.sty *}
+\Msg{* ctex-c5size.clo *}
+\Msg{* ctex-cs4size.clo *}
+\Msg{* ctex-heading-article.def *}
+\Msg{* ctex-heading-book.def *}
+\Msg{* ctex-heading-report.def *}
+\Msg{* ctex-heading-beamer.def *}
+\Msg{* ctex-scheme-plain.def *}
+\Msg{* ctex-scheme-plain-article.def *}
+\Msg{* ctex-scheme-plain-book.def *}
+\Msg{* ctex-scheme-plain-report.def *}
+\Msg{* ctex-scheme-plain-beamer.def *}
+\Msg{* ctex-scheme-chinese.def *}
+\Msg{* ctex-scheme-chinese-article.def *}
+\Msg{* ctex-scheme-chinese-book.def *}
+\Msg{* ctex-scheme-chinese-report.def *}
+\Msg{* ctex-scheme-chinese-beamer.def *}
+\Msg{* ctex-name-gbk.cfg *}
+\Msg{* ctex-name-utf8.cfg *}
+\Msg{* ctex.cfg *}
+\Msg{* ctexopts.cfg *}
+\Msg{* ctexbackend.cfg *}
+\Msg{* ctex-engine-pdftex.def *}
+\Msg{* ctex-engine-xetex.def *}
+\Msg{* ctex-engine-luatex.def *}
+\Msg{* ctex-engine-aptex.def *}
+\Msg{* ctex-engine-uptex.def *}
+\Msg{* c19rm.fd *}
+\Msg{* c19sf.fd *}
+\Msg{* c19tt.fd *}
+\Msg{* c70rm.fd *}
+\Msg{* c70sf.fd *}
+\Msg{* c70tt.fd *}
+\Msg{* jy2zhrm.fd *}
+\Msg{* jy2zhsf.fd *}
+\Msg{* jy2zhtt.fd *}
+\Msg{* jt2zhrm.fd *}
+\Msg{* jt2zhsf.fd *}
+\Msg{* jt2zhtt.fd *}
+\Msg{* ctex-fontset-adobe.def *}
+\Msg{* ctex-fontset-fandol.def *}
+\Msg{* ctex-fontset-founder.def *}
+\Msg{* ctex-fontset-mac.def *}
+\Msg{* ctex-fontset-macnew.def *}
+\Msg{* ctex-fontset-macold.def *}
+\Msg{* ctex-fontset-ubuntu.def *}
+\Msg{* ctex-fontset-windows.def *}
+\Msg{* ctexspa.def *}
+\Msg{* ctex-spa-make.tex *}
+\Msg{* ctex-spa-macro.tex *}
+\Msg{* ctex-zhmap-adobe.tex *}
+\Msg{* ctex-zhmap-fandol.tex *}
+\Msg{* ctex-zhmap-founder.tex *}
+\Msg{* ctex-zhmap-mac.tex *}
+\Msg{* ctex-zhmap-ubuntu.tex *}
+\Msg{* ctex-zhmap-windows.tex *}
+\Msg{* translator-theorem-dictionary-ChineseGBK.dict *}
+\Msg{* translator-theorem-dictionary-ChineseUTF8.dict *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file ctex.dtx *}
+\Msg{* through XeLaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\endbatchfile
+%%
+%%
+%% End of file `ctex.ins'.
diff --git a/Master/texmf-dist/source/latex/ctex/ctexpunct.spa b/Master/texmf-dist/source/latex/ctex/ctexpunct.spa
index 2c6e37c4970..a535be5ed75 100644
--- a/Master/texmf-dist/source/latex/ctex/ctexpunct.spa
+++ b/Master/texmf-dist/source/latex/ctex/ctexpunct.spa
@@ -17,9 +17,23 @@
\ctexspadef{founderzhli}{69,19,58,9,48,21,45,27,48,25,47,32,48,27,48,39,48,21,43,17,47,33,47,33,0,0,11,11,11,61,13,63,17,66,7,80,20,70,19,68,20,70,3,54,9,9,25,48,32,47,27,48,40,48,21,48,17,43,33,47,33,47,19,69,9,58,21,48,27,45,,,}
\ctexspadef{founderzhyou}{67,16,61,11,48,11,45,14,48,20,48,17,48,16,48,39,48,12,42,16,48,30,48,30,0,0,12,11,11,61,9,59,17,67,11,83,20,70,18,69,21,70,4,54,12,12,20,48,17,48,16,48,39,48,12,48,16,41,30,48,29,48,16,67,11,61,11,48,14,45,,,}
\ctexspadef{founderzhyoub}{69,18,60,10,46,13,43,16,46,17,45,20,46,18,46,31,45,13,38,14,44,29,46,30,-3,0,10,9,9,61,9,59,19,69,7,82,18,68,18,67,20,69,2,52,17,17,17,46,20,45,18,46,32,46,13,45,14,38,29,44,30,46,19,69,10,60,14,46,17,43,,,}
-\ctexspadef{ubuntuzhsong}{66,21,58,7,58,8,55,11,59,18,71,7,71,2,40,38,58,13,52,4,64,6,58,14,7,7,11,10,38,38,38,38,17,73,21,70,13,78,13,75,27,63,4,52,4,5,18,59,7,71,2,71,38,40,13,58,4,51,6,64,14,58,16,70,8,56,10,58,11,54,,,}
-\ctexspadef{ubuntuzhhei}{6,6,4,4,60,10,61,11,62,12,65,15,67,15,62,15,63,13,57,6,19,52,63,13,-0,0,11,11,10,70,10,68,44,44,45,44,44,44,44,44,43,45,27,27,19,16,12,62,15,65,15,67,15,62,13,63,6,56,3,68,13,63,6,6,4,4,10,60,11,61,,,}
-\ctexspadef{ubuntuzhkai}{68,20,58,9,58,8,55,11,59,18,59,20,59,18,53,23,58,13,52,4,58,8,58,14,7,7,11,10,38,38,38,38,40,42,43,43,43,43,43,43,43,43,25,28,10,11,18,59,20,59,18,59,24,53,13,58,4,51,8,58,14,58,17,70,9,58,10,58,11,54,,,}
+\ctexspadef{maczhsong}{4,4,4,4,63,14,59,7,63,13,64,13,70,12,59,13,61,12,47,7,56,7,58,8,0,0,11,11,10,68,13,63,17,68,20,70,20,70,18,68,20,70,12,59,18,18,14,62,10,66,12,69,9,64,12,61,7,47,7,56,8,58,4,4,4,4,14,63,7,59,,,}
+\ctexspadef{maczhsongb}{4,4,4,4,62,13,49,13,62,10,65,10,59,13,62,14,61,12,43,9,56,4,56,14,0,0,11,10,7,67,13,62,15,66,18,67,18,69,16,66,18,69,10,60,14,10,10,62,10,64,12,60,14,62,12,61,9,43,4,56,14,56,4,4,4,4,12,62,12,50,,,}
+\ctexspadef{maczhhei}{68,15,58,4,62,13,56,6,61,11,65,12,66,16,63,12,59,14,51,5,55,5,60,10,0,0,8,11,13,60,13,62,20,70,20,70,20,70,20,70,20,70,3,54,9,10,10,62,12,65,16,65,9,66,14,60,7,48,5,55,10,60,14,68,4,58,13,62,6,56,,,}
+\ctexspadef{maczhheil}{71,17,65,7,60,11,56,6,59,9,67,10,66,15,64,13,58,14,51,6,53,6,60,8,0,0,9,10,10,61,12,62,20,70,20,70,20,70,20,70,21,71,4,55,9,9,9,59,10,67,15,66,13,64,14,58,6,51,6,53,8,60,17,71,7,65,11,60,6,56,,,}
+\ctexspadef{maczhkai}{5,5,6,3,63,14,59,7,63,13,62,12,60,11,61,15,61,12,47,7,56,7,58,8,0,0,12,11,10,68,13,63,18,67,20,69,19,69,17,67,19,70,14,57,15,10,14,62,10,65,10,60,13,63,12,61,7,47,7,56,8,58,4,4,4,5,14,63,7,59,,,}
+\ctexspadef{maczhkaib}{5,6,4,4,65,10,54,8,62,14,63,9,65,10,60,14,61,13,50,8,58,10,60,10,0,0,10,10,11,68,13,63,17,68,18,68,18,68,17,68,19,69,11,59,15,12,13,62,9,63,9,66,13,60,13,61,8,50,10,58,10,61,6,5,4,4,9,65,8,55,,,}
+\ctexspadef{maczhfs}{71,14,62,8,63,14,59,7,63,13,62,12,60,11,61,15,61,12,47,7,56,7,58,8,0,0,12,11,10,68,13,63,18,67,20,69,19,69,17,67,19,70,7,58,15,10,14,62,10,65,10,60,13,63,12,61,7,47,7,56,8,58,15,68,8,60,14,63,7,59,,,}
+\ctexspadef{maczhli}{4,2,7,4,69,2,61,4,65,6,62,6,48,2,46,1,67,5,52,4,61,3,65,3,0,-0,10,7,10,64,11,66,18,67,43,41,18,67,15,67,19,67,11,57,14,13,4,67,6,63,2,47,1,50,5,67,4,52,3,61,3,65,4,2,7,4,6,67,4,61,,,}
+\ctexspadef{maczhyou}{5,5,5,9,71,4,58,4,71,4,75,6,75,6,69,5,73,4,57,4,59,4,63,4,0,0,12,12,12,64,13,66,19,70,15,75,19,72,18,71,19,72,5,58,11,11,4,71,6,75,6,75,5,69,4,73,4,57,4,59,4,63,5,5,7,10,4,71,4,58,,,}
+\ctexspadef{maczhyoub}{3,3,4,7,69,2,57,2,70,2,74,4,74,6,67,3,71,2,55,2,58,4,63,4,0,0,10,10,9,62,12,62,17,68,13,72,17,68,16,68,18,68,4,56,10,10,2,70,4,74,6,74,3,67,2,71,2,55,4,58,4,63,3,4,5,7,2,69,2,57,,,}
+\ctexspadef{maczhpf}{12,8,12,8,65,3,62,3,67,3,70,8,72,4,67,4,65,8,51,6,63,3,66,5,0,0,11,11,13,63,12,62,12,74,12,76,19,69,18,68,19,69,3,53,8,8,3,67,8,70,4,72,4,67,8,65,6,51,3,63,5,66,8,12,8,12,3,65,3,62,,,}
+\ctexspadef{maczhpfb}{12,8,12,8,64,3,61,3,66,3,67,8,70,4,65,4,63,8,47,6,61,3,64,5,0,0,9,9,11,61,11,61,11,71,11,73,17,67,17,66,17,67,2,52,7,7,3,66,8,67,4,70,4,65,8,63,6,47,3,61,5,64,8,12,8,12,3,64,3,61,,,}
+\ctexspadef{ubuntuzhsong}{77,8,57,8,66,4,60,4,71,4,65,6,71,4,58,3,53,4,52,4,61,4,62,4,4,4,11,11,4,71,4,68,8,77,9,78,17,70,15,70,19,69,6,55,9,9,4,71,6,65,4,71,3,58,4,53,4,52,4,61,4,62,8,77,8,57,4,66,4,60,,,}
+\ctexspadef{ubuntuzhsongb}{75,8,53,8,65,3,62,3,72,3,64,6,72,3,57,3,53,3,53,3,62,3,63,3,4,4,11,11,3,69,4,68,5,77,6,77,18,65,18,65,17,67,4,54,7,7,3,72,6,64,3,72,3,57,3,53,3,53,3,62,3,63,8,75,8,53,3,65,3,62,,,}
+\ctexspadef{ubuntuzhhei}{81,5,62,4,65,3,60,3,71,4,70,5,71,3,70,4,59,5,53,4,62,3,67,3,5,5,10,10,5,66,4,65,14,67,16,68,18,67,15,66,19,69,3,54,8,8,4,71,5,70,3,71,4,70,5,59,4,53,3,62,3,67,5,81,4,62,3,65,3,60,,,}
+\ctexspadef{ubuntuzhheib}{80,4,60,2,64,3,60,3,69,2,66,4,71,3,68,3,56,5,52,3,63,3,66,3,5,5,9,9,4,64,3,64,16,61,18,62,16,66,13,64,16,66,3,53,5,5,2,69,4,66,3,71,3,68,5,56,3,52,3,63,3,66,4,80,2,60,3,64,3,60,,,}
+\ctexspadef{ubuntuzhkai}{53,33,53,19,58,8,59,9,61,11,60,10,62,12,60,10,56,6,54,4,58,8,58,8,7,7,15,15,26,53,29,53,19,67,22,68,30,60,27,59,26,63,7,57,25,23,11,61,10,60,12,62,10,60,6,56,3,54,8,58,8,58,32,54,19,53,8,58,9,59,,,}
\ctexspadef{windowszhsong}{67,13,46,13,62,14,61,14,65,17,57,14,55,14,53,18,64,11,54,10,47,11,49,14,3,3,10,10,11,64,14,64,11,71,13,73,12,73,12,73,23,63,14,52,15,13,16,66,14,57,14,55,19,52,11,66,9,54,11,48,14,51,14,68,13,48,14,62,14,61,,,}
\ctexspadef{windowszhhei}{78,9,56,9,50,20,50,20,50,23,61,11,54,14,50,26,50,16,50,7,47,11,49,14,0,0,9,11,14,64,13,63,14,72,14,73,19,68,18,68,25,64,15,48,12,12,22,50,11,60,14,55,25,50,16,50,7,50,11,48,14,51,8,79,8,56,18,50,18,50,,,}
\ctexspadef{windowszhkai}{67,13,46,13,50,20,50,20,50,23,61,11,54,14,50,26,50,16,50,7,47,11,49,14,0,0,10,10,11,64,13,63,11,71,13,73,17,68,17,68,23,63,15,48,12,12,22,50,11,60,14,55,25,50,16,50,7,50,11,48,14,51,14,68,13,48,18,50,18,50,,,}
diff --git a/Master/texmf-dist/source/latex/currfile/currfile.dtx b/Master/texmf-dist/source/latex/currfile/currfile.dtx
index de45aa88537..5f677130a09 100644
--- a/Master/texmf-dist/source/latex/currfile/currfile.dtx
+++ b/Master/texmf-dist/source/latex/currfile/currfile.dtx
@@ -1,8 +1,8 @@
% \iffalse meta-comment
%<=*COPYRIGHT>
%%
-%% Copyright (c) 2010-2011 by Martin Scharrer <martin@scharrer.me>
-%% ---------------------------------------------------------------
+%% Copyright (c) 2010-2020 by Martin Scharrer <martin@scharrer-online.de>
+%% ----------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -29,10 +29,10 @@
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesFile{currfile.dtx}[%
%<=*DATE>
- 2015/04/23
+ 2020/09/29
%<=/DATE>
%<=*VERSION>
- v0.7c
+ v0.7d
%<=/VERSION>
DTX file for currfile package]
@@ -90,6 +90,8 @@
% \changes{v0.7a}{2012/10/28}{Fixed issue with \pkg{enumitem} package which redefines \cs{value}.}
% \changes{v0.7b}{2013/02/01}{Support for \cs{\subinput*} etc.\ from the \pkg{import} package which requires a different path search order.}
% \changes{v0.7c}{2015/04/23}{Removed stack underflow warning if loaded by other package. Set default file name in this case to main file name.}
+% \changes{v0.7d}{2020/09/29}{Updated documentation for 2020/10/01 \LaTeX\ release.}
+%
%
% \GetFileInfo{currfile.dtx}
%
@@ -102,7 +104,7 @@
%
% \author{Martin Scharrer}
% \email{martin@scharrer-online.de}
-% \repository{https://bitbucket.org/martin_scharrer/currfile/}
+% \repository{https://sourceforge.net/projects/currfile/}
% \maketitle
%
% \begin{abstract}
@@ -113,6 +115,17 @@
%
% \tableofcontents
%
+% \section{Direct filename support in \LaTeX\ 2020/10/01}
+% With the \LaTeX\ release 2020/10/01 the core now provides own filehooks and access to the current filename and path.
+% This package still uses the authors \pkg{filehook} package to collect the filenames but there the core implementation is now used internally.
+% Due to this users could see changes in the output in some special cases.
+%
+% For new documents users might want to use the new core macros \Macro\CurrentFile and \Macro\CurrentFilePath discribed in
+% \href{http://mirrors.ctan.org/macros/latex-dev/base/ltfilehook-doc.pdf}{\texttt{ltfilehook-doc}}
+% directly and use this package only if the advanced features -- like parent or absolute file names - are required.
+% Note that \Macro\CurrentFile is empty for the main document which filename can be accessed usually over \Macro\jobname.
+%
+%
% \section{Important notice}
% This package relies heavily on the package \pkg{filehook} by the same author and installs at-begin and at-end hooks for all files.
% The provided macros for the file names \emph{will only work for files loaded \emph{after} the package}.
diff --git a/Master/texmf-dist/source/latex/curve2e/curve2e.dtx b/Master/texmf-dist/source/latex/curve2e/curve2e.dtx
index 2c4d727bda7..396d8e60006 100644
--- a/Master/texmf-dist/source/latex/curve2e/curve2e.dtx
+++ b/Master/texmf-dist/source/latex/curve2e/curve2e.dtx
@@ -6,7 +6,7 @@
\keepsilent
\preamble
- Copyright (C) 2005--2020 Claudio Beccari all rights reserved.
+ Copyright (C) 2005--2021 Claudio Beccari all rights reserved.
License information appended
\endpreamble
@@ -27,7 +27,7 @@ README.txt and curve2e-v161.sty.
\askforoverwritefalse
\generate{\file{curve2e.sty}{\from{curve2e.dtx}{package}}}
-\generate{\file{README.txt}{\from{curve2e.dtx}{readme}}}
+%\generate{\file{README.txt}{\from{curve2e.dtx}{readme}}}
\generate{\file{curve2e-v161.sty}{\from{curve2e.dtx}{v161}}}
\def\tmpa{plain}
@@ -46,7 +46,7 @@ README.txt and curve2e-v161.sty.
%<+package>\ProvidesPackage{curve2e}%
%<+readme>File README.txt for package curve2e
%<*package|readme>
- [2020-02-28 v.2.2.3 Extension package for pict2e]
+ [2021-01-12 v.2.2.15 Extension package for pict2e]
%</package|readme>
%<*driver>
\documentclass{ltxdoc}\errorcontextlines=9
@@ -54,7 +54,7 @@ README.txt and curve2e-v161.sty.
\usepackage[utf8]{inputenc}
\usepackage{lmodern,textcomp}
\usepackage{mflogo}
-\usepackage{multicol,amsmath,fancyvrb,graphics,verbatim,trace}
+\usepackage{multicol,amsmath,fancyvrb,graphicx,verbatim,trace}
\usepackage{xcolor,curve2e}
\GetFileInfo{curve2e.dtx}
\title{The extension package \textsf{curve2e}}
@@ -79,20 +79,8 @@ README.txt and curve2e-v161.sty.
\renewcommand\Parg[1]{\texttt{(#1)}}
\providecommand\eTeX{}
\renewcommand\eTeX{\lower0.5ex\hbox{$\varepsilon\!$}\TeX}
-
-\providecommand\Pbox{}
-\RenewDocumentCommand\Pbox{D(){0,0} O{cc} m O{0.5ex}}{%
-\put(#1){%
-\dimendef\Dim=2566\relax
-\settowidth\Dim{#2}%
-\edef\Rapp{\fpeval{\Dim/{1ex}}}%
-\fptest{\Rapp > 1.5}{\fboxsep=0.5ex}{\fboxsep=0.75ex}%
-\fboxrule=0pt
-\fptest{#4 = 0sp}{\makebox(0,0)[#2]{\fbox{$\relax#3\relax$}}}%
-{\edef\Diam{\fpeval{#4/\unitlength}}%
-\makebox(0,0){\circle*{\Diam}}%
-\makebox(0,0)[#2]{\fbox{$\relax\mathsf#3\relax$}}}%
-}\ignorespaces}
+\providecommand\pack{}
+\renewcommand\pack[1]{{\normalfont\texttt{#1}}}
\def\LissajousCoefs#1,#2,#3,#4,#5,#6!{%
\edef\LAu{#1}\edef\LNu{#2}\edef\LFu{#3}%
@@ -117,14 +105,6 @@ README.txt and curve2e-v161.sty.
\NewDocumentCommand\Pall{O{1.5} R(){0,0}}{\put(#2){\circle*{#1}}}
-\def\legenda(#1)#2{\put(#1){\setbox3333\hbox{$#2$}%
- \dimen3333\dimexpr\wd3333*\p@/\unitlength +3\p@\relax
- \edef\@tempA{\strip@pt\dimen3333}%
- \framebox(\@tempA,7){\box3333}}}
-
-\NewDocumentCommand\Zbox{R(){0,0} O{cc} m O{1}}{%
-\put(#1){\makebox(0,0)[#2]{\fboxrule=0pt\fboxsep=3pt\fbox{$#3$}}\makebox(0,0)[cc]{\circle*{#4}}}}
-
\providecommand\setfontsize{}
\DeclareRobustCommand\setfontsize[2][1.2]{%
@@ -181,7 +161,7 @@ README.txt and curve2e-v161.sty.
%</driver>
% \fi
%
-% \CheckSum{5581}
+% \CheckSum{5584}
% \begin{abstract}
% This file documents the |curve2e| extension package to the |pict2e|
% bundle implementation; the latter was described by Lamport
@@ -486,6 +466,11 @@ README.txt and curve2e-v161.sty.
% necessary any more, but it's true that it became imperative when older
% versions were used.
%
+% Some others users spotted other “features” that did not produce the
+% desired results; they have been acknowledged by footnotes in
+% correspondence with the corrections that were made tanks their
+% contribution.
+%
% \StopEventually{%
% \begin{thebibliography}{9}
% \bibitem{pict2e} Gäßlein H., Niepraschk R., and Tkadlec J.
@@ -506,10 +491,10 @@ README.txt and curve2e-v161.sty.
% \subsection{Some preliminary extensions to the \texttt{pict2e} package}
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% The necessary preliminary code has already been introduced. Here we
-% require the \texttt{color} package and the \texttt{pict2e} one; for the
-% latter one we make sure that a sufficiently recent version is used.
-% If you want to use package \texttt{xcolor}, load it \emph{after}
-% \texttt{curve2e}.
+% require the \texttt{color} and \texttt{graphicx} packages plus
+% the \texttt{pict2e} one; for the latter we make sure that a
+% sufficiently recent version is used. If you want to use package
+% \texttt{xcolor}, load it \emph{after} \texttt{curve2e}.
%
% Here we load also the |xparse| and |xfp| packages because we use their
% functionalities; but we do load them only if they are not already
@@ -526,30 +511,30 @@ README.txt and curve2e-v161.sty.
%\fi
% \begin{macrocode}
\IfFileExists{xfp.sty}{%
- \RequirePackage{color}
+ \RequirePackage{graphicx,color}
\RequirePackageWithOptions{pict2e}[2014/01/01]
\@ifl@aded{sty}{xparse}{}{\RequirePackage{xparse}}
\@ifl@aded{sty}{xfp}{}{\RequirePackage{xfp}}%
}{%
- \RequirePackage{curve2e-v161}%
- \PackageWarningNoLine{curve2e}{%
- Package xfp is required, but apparently\MessageBreak%
- such package cannot be found in this \MessageBreak%
- TeX system installation\MessageBreak%
- Either your installation is not complete \MessageBreak%
- or it is older than 2018-10-17.\MessageBreak%
- \MessageBreak%
- ***************************************\MessageBreak%
- Version 1.61 of curve2e has been loaded\MessageBreak%
- instead of the current version\MessageBreak%
- ***************************************\MessageBreak}%
- \endinput
+ \RequirePackage{curve2e-v161}%
+ \PackageWarningNoLine{curve2e}{%
+ Package xfp is required, but apparently\MessageBreak%
+ such package cannot be found in this \MessageBreak%
+ TeX system installation\MessageBreak%
+ Either your installation is not complete \MessageBreak%
+ or it is older than 2018-10-17.\MessageBreak%
+ \MessageBreak%
+ ***************************************\MessageBreak%
+ Version 1.61 of curve2e has been loaded\MessageBreak%
+ instead of the current version\MessageBreak%
+ ***************************************\MessageBreak}%
+ \endinput
}
% \end{macrocode}
% Since we already loaded package|xfp| or at least we explicitly load it
-% in our preamble, we add, if not already defined by the package, the two
-% new commands that allow to make floating point tests, and to implement
-% a “while” cycle\footnote{Thanks to Brian Dunn who spotted a bug in
+% in our preamble, we add, if not already defined by the package, three
+% new commands that allow to make floating point tests, and two
+% “while” cycles\footnote{Thanks to Brian Dunn who spotted a bug in
% the previous 2.0.x version definitions.}
% \begin{macrocode}
%
@@ -559,10 +544,14 @@ README.txt and curve2e-v161.sty.
\fp_compare:nTF{#1}{#2}{#3}}
\ProvideExpandableDocumentCommand\fpdowhile{m m}{%
\fp_do_while:nn{#1}{#2}}
+\ProvideExpandableDocumentCommand\fpwhiledo{m m}{%
+ \fp_while_do:nn{#1}{#2}}
}
\ExplSyntaxOff
% \end{macrocode}
+% The while cycles differ in the order of what they do; see the
+% |interface3.pdf| documentation file for details.
%
% The next macros are just for debugging. With the \texttt{trace} package
% it would probably be better to define other macros, but this is not for
@@ -982,7 +971,9 @@ README.txt and curve2e-v161.sty.
% original macros, but now the increments are computed within the while
% loop, but outside the argument of the inner |\put| command. If the
% optional \meta{handler} is specified the increments are computed
-% from the macros specified by the user.
+% from the macros specified by the user. Another new feature: the fourth
+% argument, that contains the number of objects to be put in place,
+% may be an integer expression such as for example |3*\N+1|.
%
% The two increments components inside the optional argument may be set
% by means of mathematical expressions operated upon by the |\fpeval|
@@ -1000,18 +991,18 @@ README.txt and curve2e-v161.sty.
{\IfNoValueTF{#3}{\PackageError{curve2e}
{\string\multiput\space Increment components missing}%
{Nothing done}
- }
+ }%
{\put(#1){\let\c@multicnt\@multicnt
\CopyVect #2 to \R
\CopyVect#3 to\D
- \@multicnt=#4\relax
+ \@multicnt=\inteval{#4}\relax
\@whilenum \@multicnt > \z@\do{%
\put(\R){#5}%
\IfValueTF{#6}{#6}{\AddVect#3 and\R to \R}%
\advance\@multicnt\m@ne
- }
- }
- }
+ }%
+ }%
+ }%
}\ignorespaces
}
% \end{macrocode}
@@ -1080,89 +1071,21 @@ README.txt and curve2e-v161.sty.
% for straight lines.
%
% We start with the redefinition of |\vector| and we use the machinery
-% for vectors (as complex numbers) we used for |\line|.
-% \begin{macrocode}
- \def\vector(#1)#2{%
- \begingroup
- \GetCoord(#1)\d@mX\d@mY
- \@linelen#2\unitlength
-% \end{macrocode}
-% As in \texttt{pict2e} we avoid tracing vectors if the slope parameters
-% are both zero.
+% for vectors (as complex numbers) we used for |\line|. The actual point
+% is to let |\vector| accept the slope parameters also in polar form.
+% Therefore it suffices to save the original definition of |\vector|
+% as defined in |pict2e| and and use it as a fallback after redefining
+% |\vector| in a “vector” format.\footnote{The previous version 2.2.9
+% of this package contained a glitch that was visible only with line
+% widths larger than 1.5\.pt. I thank very much Ashish Kumar Das who
+% spotted this glitch and kindly informed me.}
% \begin{macrocode}
- \ifdim\d@mX\p@=\z@\ifdim\d@mY\p@=\z@\@badlinearg\fi\fi
-% \end{macrocode}
-% But we check only for the positive nature of the $l_x$ component; if it
-% is negative, we simply change sign instead of blocking the typesetting
-% process. This is useful also for macros |\Vector|, |\VECTOR|, and
-% |\VVECTOR| to be defined in a while.
-% \begin{macrocode}
- \ifdim\@linelen<\z@ \@linelen=-\@linelen\fi
-% \end{macrocode}
-% We now make a vector with the given slope coefficients even if one or
-% the other is zero and we determine its direction; the real and
-% imaginary parts of the direction vector are also the values we need for
-% the subsequent rotation.
-% \begin{macrocode}
- \MakeVectorFrom\d@mX\d@mY to\@Vect
- \DirOfVect\@Vect to\Dir@Vect
-% \end{macrocode}
-% In order to be compatible with the original \texttt{pict2e} we need to
-% transform the components of the vector direction into lengths with the
-% specific names |\@xdim| and |\@ydim|^^A--------! Really necessary?
-% \begin{macrocode}
- \YpartOfVect\Dir@Vect to\@ynum \@ydim=\@ynum\p@
- \XpartOfVect\Dir@Vect to\@xnum \@xdim=\@xnum\p@
-% \end{macrocode}
-% If the vector is really sloping we need to scale the $l_x$ component in
-% order to get the vector total length; we have to divide by the cosine
-% of the vector inclination which is the real part of the vector
-% direction.
-% We use the floating point division function; since it yields a
-% “factor” that we directly use to scale the length of the vector.
-% We finally memorise the true vector length in the internal dimension
-% |@tdB|
-% \begin{macrocode}
- \ifdim\d@mX\p@=\z@
- \else\ifdim\d@mY\p@=\z@
- \else
- \edef\sc@lelen{\fpeval{1 / abs(\@xnum)}}\relax
- \@linelen=\sc@lelen\@linelen
- \fi
- \fi
- \@tdB=\@linelen
-% \end{macrocode}
-% The remaining code is definitely similar to that of |pict2e|;
-% the real difference consists in the fact that the arrow is designed by
-% itself without the stem; but it is placed at the vector end; therefore
-% the first statement is just the transformation matrix used by the
-% output driver to rotate the arrow tip and to displace it the right
-% amount. But in order to draw only the arrow tip we have to set the
-% |\@linelen| length to zero.
-% \begin{macrocode}
-\pIIe@concat\@xdim\@ydim{-\@ydim}\@xdim{\@xnum\@linelen}{\@ynum\@linelen}%
- \@linelen\z@
- \pIIe@vector
- \fillpath
-% \end{macrocode}
-% Now we can restore the stem length that must be shortened by the
-% dimension of the arrow; by examining the documentation of
-% |pict2e| we discover that we have to shorten it by an
-% approximate amount of $AL$ (with the notations of \texttt{pict2e},
-% figs~10 and~11); the arrow tip parameters are stored in certain
-% variables with which we can determine the amount of the stem
-% shortening; if the stem was too short and the new length is negative,
-% we avoid designing such a stem.
-% \begin{macrocode}
- \@linelen=\@tdB
- \@tdA=\pIIe@FAW\@wholewidth
- \@tdA=\pIIe@FAL\@tdA
- \advance\@linelen-\@tdA
- \ifdim\@linelen>\z@
- \moveto(0,0)
- \pIIe@lineto{\@xnum\@linelen}{\@ynum\@linelen}%
- \strokepath\fi
- \endgroup}
+\let\original@vector\vector
+\def\vector(#1)#2{%
+ \begingroup
+ \GetCoord(#1)\d@mX\d@mY
+ \original@vector(\d@mX,\d@mY){\fpeval{round(abs(#2),6)}}%
+ \endgroup}%
% \end{macrocode}
%
% We define the macro that does not require the specification of the
@@ -1216,7 +1139,7 @@ README.txt and curve2e-v161.sty.
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% We now define the polygonal line macro; its syntax is very simple:
% \begin{flushleft}\ttfamily
-% \cs{polygonal}\oarg{join}\parg{$P_0$}\parg{$P_1$}\parg{$P_2$}...^^A
+% \cs{polyline}\oarg{join}\parg{$P_0$}\parg{$P_1$}\parg{$P_2$}...^^A
%\parg{$P_n$}
% \end{flushleft}
% Remember: |\polyline| has been incorporated into |pict2e| 2009, but we
@@ -1431,6 +1354,117 @@ README.txt and curve2e-v161.sty.
% \end{macrocode}
%
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Labelling the graphical elements}
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% While drawing any thing with the \pack{curve2e} package, it might be
+% necessary to identify some graphical objects with some sort of “label”.^^A
+%\footnote{Do not confuse this identifier label with the \cs{label}
+% command.}
+%
+% Some commands such as \cs{legenda} (legend), \cs{Zbox}, and \cs{Pbox}
+% have been always used in the documentation of this package and its
+% siblings; but we used them in many other documents; therefore we thought
+% it was useful to have them available with the general user of
+% \pack{curve2e}.
+%
+%Their commands follow the following syntax.
+%\begin{flushleft}\ttfamily\obeylines
+%|\Pbox|\parg{coordinates}\oarg{position}\marg{text}\oarg{dot diameter}\meta{\texttt{*}}\aarg{angle}
+%|\Zbox|\parg{coordinates}\oarg{position}\marg{formula}\oarg{dot diameter}
+%|\legenda|\parg{coordinates}\marg{formula}
+%\end{flushleft}
+%
+% These commands have similar but different functionalities; the most
+% general one si |\Pbox|, while the others are simplified versions that
+% have a simpler syntax, and a subset of the |\Pbox| functionalities.
+% While we describe the arguments of |\Pbox| we emphasise the small
+% differences with the other two commands.
+%\begin{description}
+%\item[\meta{coordinates}] are the coordinates (explicit, or in vector
+% form) of the reference point of the “label”; for |\legenda| it is the
+% lower left corner of the framed legend contents. They are delimited
+% with the usual matched parentheses, and their default value is
+% \texttt{(0,0)}, therefore either the user specifies other coordinates,
+% or uses the |\put| command to place the legend where he prefers.
+%%
+%\item[\meta{position}] is the optional position of the “label” contents
+% relative the the reference point; the default is \texttt{cc} so that
+% the “label” is vertically and horizontally centred at the reference
+% point; actually these position parameters should always specified if
+% the dot diameter is positive (therefore visible), otherwise the
+% “label” and the dot overwrite eachother.
+%%
+%\item[\meta{text} \textnormal{or} \meta{formula}] may be almost
+% anything; where the argument is called \meta{formula} math mode
+% is the default; otherwise it is plain \meta{text}; in any case
+% it can be replaced by a box or a parbox, so that actually this
+% mandatory argument may contain almost anything.
+%%
+%\item[\meta{dot diameter}] the dot diameter default value is positive;
+% for |\Zbox| this parameter equals |1\unitlength|, while for |\Pbox|
+% it equals \texttt{0.5ex}; the user should be careful in
+% modifying this value; but if the dot diameter is set to zero, the
+% dot is absent and the |\Zbox| command behaves almost as an unframed
+% legend. The small difference is that |\Zbox| accepts a \meta{position}
+% parameter while the |\legend| command does not.
+%%
+%\item[\meta{\texttt{*}}] is an optional star; if specified the
+% “label” is framed with a visible border, otherwise it is framed
+% with an invisible one but with a blank gap that tries to
+% adjust its thickness so that the “label” is always at the same distance
+% from the reference point; if this reference point corresponds to
+% a box corner it thickness is reduced by approximately a factor equal to
+% $\sqrt{0.5}$, in oder to take into account the diagonal of the
+% blank gap angle.
+%%
+%\item[\meta{angle}] is the rotation angle (in degrees) of the “label”
+% about its reference point; sometimes such “labels” have to be
+% rotated 90° anticlockwise; sometimes they need a positive or
+% negative rotation angle in order to match the general direction of
+% the “labelled” object, be it an oblique line, an axis, or whatever.
+% We found it very useful also to label the cartesian axes, but
+% also in other situations. For example, in order to label the $x$ axis
+% the |\Pbox| command might have the arrow tip coordinates for the
+% reference point and have \texttt{tr} for the \meta{position};
+% for the $y$ axis, the reference point is again the arrow tip,
+% and the position would be again \texttt{tr} if the “label”
+% sits on the left of the axis.
+%\end{description}
+%
+% \begin{macrocode}
+\providecommand\Pbox{}
+\newlength\PbDim
+\RenewDocumentCommand\Pbox{D(){0,0} O{cc} m O{0.5ex} s D<>{0}}{%
+\put(#1){\rotatebox{#6}{\makebox(0,0){%
+\settowidth\PbDim{#2}%
+\edef\Rapp{\fpeval{\PbDim/{1ex}}}%
+\fptest{\Rapp > 1.5}{\fboxsep=0.5ex}{\fboxsep=0.75ex}%
+\IfBooleanTF{#5}{\fboxrule=0.4pt}{\fboxrule=0pt}%
+\fptest{#4 = 0sp}%
+ {\makebox(0,0)[#2]{\fbox{$\relax#3\relax$}}}%
+ {\edef\Diam{\fpeval{(#4)/\unitlength}}%
+ \makebox(0,0){\circle*{\Diam}}%
+ \makebox(0,0)[#2]{\fbox{$\relax\mathsf#3\relax$}}%
+ }}}%
+}\ignorespaces}
+
+\providecommand\Zbox{}
+\RenewDocumentCommand\Zbox{R(){0,0} O{cc} m O{1}}{%
+\put(#1){\makebox(0,0)[#2]{\fboxrule=0pt\fboxsep=3pt\fbox{$#3$}}\makebox(0,0)[cc]{\circle*{#4}}}\ignorespaces}
+
+\providecommand\legenda{}
+\RenewDocumentCommand\legenda{ D(){0,0} m}{\put(#1){\setbox3333\hbox{$#2$}%
+ \dimen3333\dimexpr\wd3333*\p@/\unitlength +3\p@\relax
+ \edef\@tempA{\strip@pt\dimen3333}%
+ \framebox(\@tempA,7){\box3333}}\ignorespaces}
+
+% \end{macrocode}
+
+% With the above labelling facilities and with use of the \pack{xfp}
+% functionalities it is not difficult to create diagrams with linear
+% or logarithmic axes. In effects the \pack{graphpaper} class uses
+% these labelling macros and several other ones.
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \section{Math operations on fractional operands}
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This is not the place to complain about the fact that all programs of
@@ -1479,8 +1513,8 @@ README.txt and curve2e-v161.sty.
% of the usual \texttt{>}, \texttt{=}, and \texttt{<} operators that may
% be negated with the “not’ operator \texttt{!}; furthermore the logical
% results of these comparisons may be acted upon with the “and” operator
-% \texttt{\&\&} and the “or” operator \texttt{||}. The \meta{true
-% code}, and \meta{code} are executed if or while the
+% \texttt{\&\&} and the “or” operator \texttt{\string|\string|}.
+% The \meta{true code}, and \meta{code} are executed if or while the
% \meta{logical expression} is true, while the \meta{false code} is
% executed if the \meta{logical expression} is false
%
@@ -1619,7 +1653,7 @@ README.txt and curve2e-v161.sty.
% \end{macrocode}
%
%
-% Sometimes tie argument of a complex number is necessary; therefore with
+% Sometimes the argument of a complex number is necessary; therefore with
% macro \verb|\ArgOfVect| we calculate the four quadrant arctangent (in
% degrees) of the given vector taking into account the sings of the
% vector components. We use the |xfp| |atand| with two arguments, so
@@ -1637,7 +1671,7 @@ README.txt and curve2e-v161.sty.
% \begin{macrocode}
\def\ArgOfVect#1to#2{\GetCoord(#1){\t@X}{\t@Y}%
\fptest{\t@X=\z@ && \t@Y=\z@}{\edef#2{0}%
-\PackageWarning{curve2e}{Null vector}{Check your data\Messagebreak
+\PackageWarning{curve2e}{Null vector}{Check your data\MessageBreak
Computations go on, but the results may be meaningless}}{%
\edef#2{\fpeval{round(atand(\t@Y,\t@X),6)}}}\ignorespaces}
% \end{macrocode}
@@ -2690,10 +2724,22 @@ Computations go on, but the results may be meaningless}}{%
% the distances of the control points from the adjacent nodes using the
% half chord length, not the full length. We also distinguish between the
% computations relative to the arc starting point and those relative to
-% the end point.
+% the end point. Notice that if the directions of two successive nodes are
+% identical, it is necessary to draw a line, not a third order
+% spline\footnote{Many thanks to John Hillas who spotted this bug, that
+% passed unnoticed fora long time, because it is a very unusual situation.};
+% therefore it is necessary to make a suitable test that is more
+% comfortable to do after the chord has been rotated to be horizontal;
+% in facts, if the two directions are equal, the vertical componente
+% of the directions are both vanishing values; probably, instead of
+% testing with respect to zero, it might be advisable to test the
+% absolute value with respect to a small number such as, for example,
+% “1.e-6.”
%
% \begin{macrocode}
-\ifdim\@DXpzero\p@=\z@
+\fptest{\@DYpuno=0 && \@DYpzero=0}{\GetCoord(\@Puno)\@tX\@tY
+ \pIIe@lineto{\@tX\unitlength}{\@tY\unitlength}}%
+{\ifdim\@DXpzero\p@=\z@
\@tdA=1.333333\p@
\Numero\@KCzero{\@semichord\@tdA}%
\fi
@@ -2757,7 +2803,7 @@ Computations go on, but the results may be meaningless}}{%
\GetCoord(\@CPuno)\@XCPuno\@YCPuno
\pIIe@curveto{\@XCPzero\unitlength}{\@YCPzero\unitlength}%
{\@XCPuno\unitlength}{\@YCPuno\unitlength}%
- {\@XPuno\unitlength}{\@YPuno\unitlength}\egroup
+ {\@XPuno\unitlength}{\@YPuno\unitlength}}\egroup
% \end{macrocode}
% It does not have to stroke the curve because other Bézier splines
% might still be added to the path. On the opposite it memorises the
@@ -2774,7 +2820,10 @@ Computations go on, but the results may be meaningless}}{%
% selected color, while the latter just strokes the path. Both
% recursively examine an arbitrary list of nodes and directions; node
% coordinates are grouped within round parentheses while direction
-% components are grouped within angle brackets. The first call of the
+% components are grouped within angle brackets. Before testing for a
+% possible star, this initial command kills any space or glue that
+% might precede it\footnote{Thanks to John Hillas who spotted the
+% effects of this missing glue elimination.} The first call of the
% macro initialises the drawing process and checks for the next node and
% direction; if a second node is missing, it issues a warning message and
% does not draw anything. It does not check for a change in direction,
@@ -2791,7 +2840,7 @@ Computations go on, but the results may be meaningless}}{%
% regular |\ChangeDir| macro, but also for recursing again by recalling
% |\@Curve|.
% \begin{macrocode}
-\def\Curve{\@ifstar{\let\fillstroke\fillpath\Curve@}%
+\def\Curve{\@killglue\@ifstar{\let\fillstroke\fillpath\Curve@}%
{\let\fillstroke\strokepath\Curve@}}
\def\Curve@(#1)<#2>{%
@@ -3125,8 +3174,9 @@ curve2e.pdf
curve2e-manual.pdf
README.txt
+If you install curve2e without using your TeX system package handler,
Compile curve2e.dtx and curve2e-manual.tex two or three times until
-all labels and citation keys are completely resolved.
+all labels and citation keys are completely resolved. Then move the primary and derived files as follows:
Move curve2e.dtx and curve2e-manual.tex to ROOT/source/latex/curve2e/
Move curve2e.pdf and curve2e-manual.pdf to ROOT/doc/latex/curve2e/
@@ -3134,21 +3184,23 @@ Move curve2e.sty and curve2e-v161.sty to ROOT/tex/latex/curve2e/
Move README.txt to ROOT/doc/latex/curve2e/
curve2e.dtx is the documented TeX source file of the derived files
-curve2e.sty, curve2e-v161.sty and README.txt.
+curve2e.sty, curve2e.pdf, curve2e-v161.sty and README.txt.
You get curve2e.sty, curve2e.pdf, curve2e-v161.sty, and README.txt
by running pdflatex on curve2e.dtx.
The curve2e-manual files contains the user manual; in
-this way the long preliminary descriptive part has been transferred to
-a shorter dedicated file, and the “normal” user should have enough
-information to use the package. Th curve2e.pdf file, extracted from
-the .dtx one, contains the code documentation and is intended for the
-developers, or for the curious advanced users. For what concerns
-curve2e-v161.sty is a previous version of this package; see below why
-the older version might become necessary to the end user.
+this way the long preliminary descriptive part of the previous versions
+curve2e.pdf file has been transferred to shorter dedicated file, and the
+"normal" user should have enough information to use the package. The
+curve2e.pdf file, extracted from the .dtx one, contains the code
+documentation and is intended for the developers, or for the curious
+advanced users. For what concerns curve2e-v161.sty, it is a previous
+version of this package; see below why the older version might become
+necessary to the end user.
README.txt, this file, contains general information.
+
This bundle contains also package curve2e-v161.sty, a roll-back
version needed in certain rare cases.
@@ -3157,15 +3209,15 @@ standard picture LaTeX environment according to what Leslie Lamport
specified in the second edition of his LaTeX manual (1994).
This further extension curve2e.sty to pict2e.sty allows to draw lines
-and vectorsith any non integer slope parameters, to draw dashed and dotted
-lines of any slope, to draw arcs and curved vectors, to draw curves where
-just the interpolating nodes are specified together with the slopes at
-such nodes; closed paths of any shape can be filled with color; all
-coordinates are treated as ordered pairs, i.e. 'complex numbers';
-coordinates may be expressed also in polar form. Coordinates may be
-specified with macros, so that editing any drawing is rendered much
-simpler: any point specified with a macro is modified only once in
-its macro definition.
+and vectors with any non integer slope parameters, to draw dashed and
+dotted lines of any slope, to draw arcs and curved vectors, to draw
+curves where just the interpolating nodes are specified together with
+the slopes at such nodes; closed paths of any shape can be filled with
+color; all coordinates are treated as ordered pairs, i.e. "complex
+numbers"; coordinates may be expressed also in polar form. Coordinates
+may be specified with macros, so that editing any drawing is rendered
+much simpler: any point specified with a macro is modified only once
+in its macro definition.
Some of these features have been incorporated in the 2009 version of
pict2e; therefore this package avoids any modification to the original
pict2e commands. In any case the version of curve2e is compatible with
@@ -3193,7 +3245,7 @@ If you specify
the package pict2e is automatically invoked with the specified options.
The -almost fully compatible- phrase is necessary to explain that this
-version of curve2e uses some `functions' of the LaTeX3 language that were
+version of curve2e uses some "functions" of the LaTeX3 language that were
made available to the LaTeX developers by mid October 2018. Should the user
have an older or a basic/incomplete installation of the TeX system,
such L3 functions might not be available. This is why this
diff --git a/Master/texmf-dist/source/latex/datax/datax.dtx b/Master/texmf-dist/source/latex/datax/datax.dtx
new file mode 100644
index 00000000000..198745020b0
--- /dev/null
+++ b/Master/texmf-dist/source/latex/datax/datax.dtx
@@ -0,0 +1,220 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2020 by David Gustavsson
+%
+% This file 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:
+%
+% http://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.
+%
+% \fi
+%
+% \iffalse
+%<package>\NeedsTeXFormat{LaTeX2e}[2020/02/02]
+%<package>\ProvidesPackage{datax}
+%<package> [2020/11/29 v1.1.1 data import into LaTeX]
+%<package>\RequirePackage{pgfkeys}
+%<package>\RequirePackage{pgfopts}
+%
+%<*driver>
+\begin{filecontents}[overwrite]{datax-example-data.tex}
+ \pgfkeyssetvalue{/datax/s}{A literal string}
+ \pgfkeyssetvalue{/datax/x}{\num{2.4}}
+ \pgfkeyssetvalue{/datax/c}{\SI{3e8}{\meter\per\second}}
+\end{filecontents}
+\begin{filecontents*}[overwrite]{datax-example-script.jl}
+ #!julia
+ using LaTeXDatax, Unitful
+
+ s = "A literal string";
+ x = 2.4;
+ c = 3e8u"m/s";
+
+ @datax s x c
+\end{filecontents*}
+\documentclass{ltxdoc}
+\usepackage[dataxfile=datax-example-data.tex]{datax}
+\usepackage{booktabs}
+\usepackage{siunitx}
+\usepackage[hidelinks]{hyperref}
+\usepackage{tikz}
+\usepackage{float}
+\usepackage{listings}
+\usepackage{microtype}
+
+\newfloat{lstfloat}{htbp}{lop}
+\floatname{lstfloat}{Listing}
+\def\lstfloatautorefname{Listing}
+
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+\DocInput{datax.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%\CheckSum{19}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+% \changes{v1.0}{2020/11/15}{Initial version}
+% \changes{v1.1}{2020/11/17}{Polishing for release}
+% \changes{v1.1.1}{2020/11/29}{Renaming the plugins, adding Python support}
+%
+% \GetFileInfo{datax.sty}
+% \DoNotIndex{}
+%
+% \title{The \textsf{datax} package\thanks{This document corresponds to
+% \textsf{datax}~\fileversion, dated~\filedate.}} \author{David Gustavsson
+% \href{mailto:david.e.gustavsson@gmail.com}{\texttt{david.e.gustavsson@gmail.com}}}
+%
+% \maketitle {\centering\input{datax-logo.tikz}\\}
+%
+% \section{Motivation}
+% \textsf{datax} allows you to export data from your scripts, and import them
+% as literal strings or \textsf{siunitx} commands. If the scripts or the data
+% on which they operate change, the printed data will update as well. This is
+% analogous to how the author uses \textsf{graphicx} to programmatically
+% generate graphics and include in a document.
+%
+% An alternative is to simply print |\def|s, which scales poorly (but is
+% similar to how this package works under the hood). Or using something like
+% \textsf{csvread}, which seems overkill for individual data points, and can be
+% quite difficult to index into.
+%
+% \textsf{datax} is intended to work as an extension of your variable name
+% space from scripts to your document: you should simply be able to call your
+% variables by the same name in \LaTeX{} as in your scripts.
+%
+% \section{Installation}
+% If you have a \LaTeX{} package manager, like texlive or miktex, use it to
+% download the package from ctan. Otherwise, download the repository and place
+% |datax.sty| in a place where \LaTeX{} can find it (often
+% |~/texmf/tex/latex/datax/datax.sty|). Run |texhash| if needed.
+%
+% \section{Usage}
+% The package is loaded with |\usepackage[dataxfile=|\meta{data.tex}|]{datax}|,
+% which reads the file specified as \meta{dataxfile}. From then on data can be
+% inserted as |\datax|\marg{tag}\DescribeMacro{\datax}. If, for instance, the
+% file |data.tex| contains references to a string \(s\), a number \(x\) and a
+% physical constant \(c\), then the macro produces the output in
+% table~\ref{tab:outputs}.
+%
+% I highly recommend using \textsf{siunitx} (in general, but with
+% \textsf{datax} in particular). It is of course possible to use the literal
+% string function to circumvent siunitx and make \textsf{datax} print numbers
+% without |\num| and |\SI|, which is why \textsf{siunitx} is not loaded as a
+% prerequisite, but I have deliberately chosen to use these commands per
+% default when printing numbers and quantities because it looks much better.
+%
+% \begin{table}
+% \centering
+% \caption{Outputs from the \texttt{\textbackslash{}datax}
+% command}\label{tab:outputs}
+% \begin{tabular}{rl}\toprule
+% Input & Output \\\midrule
+% |\datax{s}| & \datax{s} \\
+% |\datax{x}| & \datax{x} \\
+% |\datax{c}| & \datax{c} \\
+% |\datax{undefined}| & \datax{undefined} \\
+% \bottomrule
+% \end{tabular}
+% \end{table}
+%
+% \section{Interactions}
+% Technically, \textsf{datax} only needs a data file consisting of a number of
+% assignments: |\pgfkeyssetvalue{/datax/|\meta{tag}|}{|\meta{value}|}| but of
+% course the entire point of the package is automation. For this, you need an
+% interaction plugin for your script language. If your language is not listed
+% in table~\ref{tab:plugins}, you might need to write this plugin for yourself,
+% or request it.
+%
+% Installation instructions and usage documentation is available at the
+% respective repositories. In general these plugins are installed using the
+% language's default plugin manager.
+%
+% \begin{table}
+% \centering
+% \caption{Implemented language plugins}\label{tab:plugins}
+% \begin{tabular}{rlp{5cm}}\toprule
+% Language & Plugin & Comments\\\midrule
+% |julia| & \href{https://github.com/Datax-package/LaTeXDatax.jl}{LaTeXDatax.jl} & By the present author \\
+% |Matlab| & \href{https://github.com/Datax-package/LaTeXDatax.m}{LaTeXDatax.m} & By the present author \\
+% |Python| & \href{https://github.com/Datax-package/LaTeXDatax.py}{LaTeXDatax.py} & By the present author \\
+% \bottomrule
+% \end{tabular}
+% \end{table}
+%
+% Taking julia as an example, the variables in table~\ref{tab:outputs} could
+% have been generated with the script in listing~\ref{list:julia}.
+
+% \begin{lstfloat}
+% \lstinputlisting[label=list:julia,caption={Example julia script to generate the outputs in table~\ref{tab:outputs}},
+% language=python,frame=single,xleftmargin=.2\textwidth,xrightmargin=.2\textwidth]{datax-example-script.jl}
+% \end{lstfloat}
+%
+%
+% \StopEventually{\PrintIndex}
+% \section{Implementation}
+% Default data file name: \texttt{data.tex}
+% \begin{macrocode}
+\pgfkeys{ /packageoptions/dataxfile/.initial=data.tex, }
+% \end{macrocode}
+% Read any given options into family \texttt{/packageoptions/}. Then introduce
+% family \texttt{/datax/} where all the variables will be stored.
+% \begin{macrocode}
+\ProcessPgfPackageOptions{/packageoptions}
+
+\pgfkeys{ /datax/.is family, datax, %
+ .unknown/.code={ \pgfkeyssetvalue{ %
+ \pgfkeyscurrentpath/\pgfkeyscurrentname %
+ }{ #1 } },
+}
+
+% \end{macrocode}
+% If data file exists, source it (storing all the variables in
+% \texttt{/datax/}). Otherwise, throw a warning.
+% \begin{macrocode}
+\def\dataxfile{./\pgfkeysvalueof{/packageoptions/dataxfile}}
+\InputIfFileExists{%
+ \dataxfile
+ }{}{
+ \PackageWarning{datax}{Cannot read file `\dataxfile'}
+}
+% \end{macrocode}
+% \begin{macro}{\datax}
+% Include datum. If the supplied tag is unused, print bold question marks (like
+% |\ref|), and throw a warning.
+% \begin{macrocode}
+\newcommand{\datax}[1]{
+ \pgfkeysifdefined{/datax/#1}{ %
+ \pgfkeysvalueof{/datax/#1} %
+ }{ %
+ \PackageWarning{datax}{Data value `#1' undefined}\textbf{??} %
+ } %
+}
+% \end{macrocode}
+% \end{macro}
+% \Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/datax/datax.ins b/Master/texmf-dist/source/latex/datax/datax.ins
new file mode 100644
index 00000000000..7e27b7a6f63
--- /dev/null
+++ b/Master/texmf-dist/source/latex/datax/datax.ins
@@ -0,0 +1,54 @@
+%%
+%% Copyright (C) 2020 by David Gustavsson
+%%
+%% This file 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:
+%%
+%% http://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.
+%%
+
+\input docstrip.tex
+\keepsilent
+\usedir{tex/latex/datax}
+
+\preamble
+This is a generated file.
+
+Copyright (C) 2020 by David Gustavsson
+
+This file 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:
+
+ http://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.
+
+\endpreamble
+
+
+\generate{\file{datax.sty}{\from{datax.dtx}{package}}}
+
+\obeyspaces
+\Msg{****************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the *}
+\Msg{* following file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* datax.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file *}
+\Msg{* datax.dtx through LaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{****************************************************}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/datetime2-french/datetime2-french.dtx b/Master/texmf-dist/source/latex/datetime2-french/datetime2-french.dtx
index ffcce39e15d..fe0a0ab63e9 100644
--- a/Master/texmf-dist/source/latex/datetime2-french/datetime2-french.dtx
+++ b/Master/texmf-dist/source/latex/datetime2-french/datetime2-french.dtx
@@ -19,8 +19,8 @@
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
-% Copyright (C) 2015 Nicola Talbot, all rights reserved.
-% Copyright (C) 2017 Paul A. Patience <pap@papatience.com>, all rights reserved.
+% Copyright (C) 2015-2020 Nicola Talbot, all rights reserved.
+% Copyright (C) 2017-2020 Paul A. Patience <pap@papatience.com>, all rights reserved.
% \fi
% \iffalse
%<*driver>
@@ -62,7 +62,7 @@
%\title{French Module for datetime2 Package}
%\author{Nicola L. C. Talbot (inactive) \\
% Paul A. Patience\thanks{E-mail: pap@papatience.com}}
-%\date{2017-04-08 (v1.02)}
+%\date{2020-09-21 (v1.03)}
%\maketitle
%
%\begin{abstract}
@@ -98,7 +98,7 @@
%\changes{1.0}{2015-03-27}{Initial release}
% Identify module
% \begin{macrocode}
-\ProvidesDateTimeModule{french-utf8}[2017/04/08 v1.02]
+\ProvidesDateTimeModule{french-utf8}[2020/09/21 v1.03]
% \end{macrocode}
%\begin{macro}{\DTMfrenchordinal}
% \begin{macrocode}
@@ -428,7 +428,7 @@
%\changes{1.0}{2015-03-27}{Initial release}
% Identify module
% \begin{macrocode}
-\ProvidesDateTimeModule{french-ascii}[2017/04/08 v1.02]
+\ProvidesDateTimeModule{french-ascii}[2020/09/21 v1.03]
% \end{macrocode}
%
%\begin{macro}{\DTMfrenchordinal}
@@ -755,7 +755,7 @@
%
% Identify Module
% \begin{macrocode}
-\ProvidesDateTimeModule{french}[2017/04/08 v1.02]
+\ProvidesDateTimeModule{french}[2020/09/21 v1.03]
% \end{macrocode}
% Need to find out if XeTeX or LuaTeX are being used.
% \begin{macrocode}
@@ -1112,6 +1112,7 @@
% Redefine \cs{datefrench} (or \cs{date}\meta{dialect}) to prevent
% \sty{babel} from resetting \cs{today}. (For this to work,
% \sty{babel} must already have been loaded if it's required.)
+%\changes{1.03}{2020-09-21}{removed spurious space}
% \begin{macrocode}
\ifcsundef{date\CurrentTrackedDialect}
{%
@@ -1132,7 +1133,7 @@
\DTMifcaseregional
{}% do nothing
{\DTMsetstyle{french}}%
- {\DTMsetstyle{french-numeric}}
+ {\DTMsetstyle{french-numeric}}%
}%
}%
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/datetime2-french/datetime2-french.ins b/Master/texmf-dist/source/latex/datetime2-french/datetime2-french.ins
index d685a6f8f22..2a6dba5cea3 100644
--- a/Master/texmf-dist/source/latex/datetime2-french/datetime2-french.ins
+++ b/Master/texmf-dist/source/latex/datetime2-french/datetime2-french.ins
@@ -3,8 +3,8 @@
\preamble
datetime2-french.dtx
- Copyright 2015 Nicola Talbot
- Copyright 2017 Paul A. Patience <pap@papatience.com>
+ Copyright 2015-2020 Nicola Talbot (inactive)
+ Copyright 2017-2020 Paul A. Patience <pap@papatience.com>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
diff --git a/Master/texmf-dist/source/latex/datetime2-romanian/datetime2-romanian.dtx b/Master/texmf-dist/source/latex/datetime2-romanian/datetime2-romanian.dtx
index a923e58338d..d133c5a623e 100644
--- a/Master/texmf-dist/source/latex/datetime2-romanian/datetime2-romanian.dtx
+++ b/Master/texmf-dist/source/latex/datetime2-romanian/datetime2-romanian.dtx
@@ -19,8 +19,8 @@
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
-% Copyright (C) 2015 Nicola Talbot, all rights reserved.
-% Copyright (C) 2017 Paul A. Patience <pap@papatience.com>, all rights reserved.
+% Copyright (C) 2015-2020 Nicola Talbot, all rights reserved.
+% Copyright (C) 2017-2020 Paul A. Patience <pap@papatience.com>, all rights reserved.
% \fi
% \iffalse
%<*driver>
@@ -63,7 +63,7 @@
%\title{Romanian Module for datetime2 Package}
%\author{Nicola L. C. Talbot (inactive) \\
% Paul A. Patience\thanks{E-mail: pap@papatience.com}}
-%\date{2017-04-08 (v1.01)}
+%\date{2020-09-21 (v1.02)}
%\maketitle
%
%\begin{abstract}
@@ -99,7 +99,7 @@
%\changes{1.0}{2015-03-31}{Initial release}
% Identify module
% \begin{macrocode}
-\ProvidesDateTimeModule{romanian-utf8}[2017/04/08 v1.01]
+\ProvidesDateTimeModule{romanian-utf8}[2020/09/21 v1.02]
% \end{macrocode}
%\begin{macro}{\DTMromanianordinal}
% \begin{macrocode}
@@ -361,7 +361,7 @@
%\changes{1.0}{2015-03-31}{Initial release}
% Identify module
% \begin{macrocode}
-\ProvidesDateTimeModule{romanian-ascii}[2017/04/08 v1.01]
+\ProvidesDateTimeModule{romanian-ascii}[2020/09/21 v1.02]
% \end{macrocode}
%
%\begin{macro}{\DTMromanianordinal}
@@ -619,7 +619,7 @@
%
% Identify Module
% \begin{macrocode}
-\ProvidesDateTimeModule{romanian}[2017/04/08 v1.01]
+\ProvidesDateTimeModule{romanian}[2020/09/21 v1.02]
% \end{macrocode}
% Need to find out if XeTeX or LuaTeX are being used.
% \begin{macrocode}
@@ -980,6 +980,7 @@
% Redefine \cs{dateromanian} (or \cs{date}\meta{dialect}) to prevent
% \sty{babel} from resetting \cs{today}. (For this to work,
% \sty{babel} must already have been loaded if it's required.)
+%\changes{1.02}{2020-09-21}{removed spurious space}
% \begin{macrocode}
\ifcsundef{date\CurrentTrackedDialect}
{%
@@ -1000,7 +1001,7 @@
\DTMifcaseregional
{}% do nothing
{\DTMsetstyle{romanian}}%
- {\DTMsetstyle{romanian-numeric}}
+ {\DTMsetstyle{romanian-numeric}}%
}%
}%
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/datetime2-romanian/datetime2-romanian.ins b/Master/texmf-dist/source/latex/datetime2-romanian/datetime2-romanian.ins
index 38bf1d54a7c..26664517e21 100644
--- a/Master/texmf-dist/source/latex/datetime2-romanian/datetime2-romanian.ins
+++ b/Master/texmf-dist/source/latex/datetime2-romanian/datetime2-romanian.ins
@@ -3,8 +3,8 @@
\preamble
datetime2-romanian.dtx
- Copyright 2015 Nicola Talbot
- Copyright 2017 Paul A. Patience <pap@papatience.com>
+ Copyright 2015-2020 Nicola Talbot (inactive)
+ Copyright 2017-2020 Paul A. Patience <pap@papatience.com>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
diff --git a/Master/texmf-dist/source/latex/dccpaper/dccpaper.dtx b/Master/texmf-dist/source/latex/dccpaper/dccpaper.dtx
index ea2d028ce83..a1ff536d795 100644
--- a/Master/texmf-dist/source/latex/dccpaper/dccpaper.dtx
+++ b/Master/texmf-dist/source/latex/dccpaper/dccpaper.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%<*internal|ijdc9|ijdc14|idcc|base>
-\def\Version{2020/01/15 v2.0}
+\def\Version{2021/01/25 v2.1}
%</internal|ijdc9|ijdc14|idcc|base>
%<*internal>
\iffalse
@@ -247,7 +247,7 @@ See: http://www.latex-project.org/lppl.txt
\endpreamble
\postamble
-Copyright (C) 2020 Digital Curation Centre, University of Edinburgh
+Copyright (C) 2021 Digital Curation Centre, University of Edinburgh
<info@dcc.ac.uk>
\endpostamble
@@ -540,8 +540,8 @@ The class is loaded in the usual way with
\lstinline|\documentclass[$\meta{options}$]{idcc}|.
Two types of option are available. The first relates to the conference to which the submission will be made:
\begin{description}[font=\normalfont]
- \item[\key{15}, \key{16}, \key{17}, \key{18}, \key{19}, \key{20}]
- Use this to select the year of the conference, e.g.\@ \key{20} for 2020.
+ \item[\key{15}, \key{16}, \key{17}, \key{18}, \key{19}, \key{20}, \key{21}]
+ Use this to select the year of the conference, e.g.\@ \key{21} for 2021.
\end{description}
The second relates to the type of submission:
@@ -554,16 +554,16 @@ Use this for full research papers.
Use this for full practice papers. This becomes the default if you select one of the options for the 2015 to 2018 conferences inclusive.
\item[lightning]
Use this for lightning talk proposals.
-\item[data]
-(Legacy.) Use this for data paper abstracts and full data papers.
\item[poster]
Use this for poster proposals.
\item[demo]
-Use this for demonstration proposals.
+(Legacy.) Use this for demonstration proposals.
\item[bof]
(Legacy.) Use this for Birds of a Feather session proposals.
\item[workshop]
-Use this for workshop proposals.
+(Legacy.) Use this for workshop proposals.
+\item[data]
+(Legacy.) Use this for data paper abstracts and full data papers.
\end{description}
\section{Preamble Commands}
@@ -856,8 +856,10 @@ Any acknowledgements should be placed in a section immediately before the refere
\section{Appendix A: Change History}
\begin{description}
+\item[v2.1] 2021-01-25\\
+Added details of IDCC 2021.
\item[v2.0] 2020-01-15\\
-Added new formatting for IJDC volume 14 and IDCC 20.
+Added new formatting for IJDC volume 14 and IDCC 2020.
\item[v1.8.1] 2019-10-07\\
Updated to work with changed \LaTeX\ internals.
\item[v1.8] 2019-03-08\\
@@ -1070,7 +1072,7 @@ Fully funded, part funded (subsidised) or delegate fee.
%<readme>## Licence
%<readme>
%<*driver|readme>
-Copyright 2020 Digital Curation Centre, University of Edinburgh.
+Copyright 2021 Digital Curation Centre, University of Edinburgh.
This work consists of the image files dccpaper-by.eps and
dccpaper-by.pdf, the documented LaTeX file dccpaper.dtx and a Makefile.
@@ -1429,6 +1431,12 @@ the University of Edinburgh on behalf of the Digital Curation Centre. ISSN:
2020 in Dublin. URL: \url{http://www.dcc.ac.uk/events/idcc20/}}
\def\dccp@subject{15th \dccp@publ@long, 2020}
}
+\DeclareOption{21}{%
+ \def\dccp@publ@short{IDCC}
+ \def\dccp@publ@msg{The 16th \dccp@publ@long\ takes place on 19 April
+ 2021, Edinburgh, Scotland.\par\bigskip URL: \url{https://dcc.ac.uk/events/idcc2021}}
+ \def\dccp@subject{16th \dccp@publ@long, 2021}
+}
\ProcessOptions\relax
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/dccpaper/dccpaper.ins b/Master/texmf-dist/source/latex/dccpaper/dccpaper.ins
deleted file mode 100644
index 4810d15365f..00000000000
--- a/Master/texmf-dist/source/latex/dccpaper/dccpaper.ins
+++ /dev/null
@@ -1,49 +0,0 @@
-%%
-%% This is file `dccpaper.ins',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% dccpaper.dtx (with options: `install')
-%%
-%% ----------------------------------------------------------------
-%% The dccpaper bundle: Classes for submissions to IJDC and IDCC
-%% Author: Alex Ball
-%% E-mail: a.ball@ukoln.ac.uk
-%% License: Released under the LaTeX Project Public License v1.3c or later
-%% See: http://www.latex-project.org/lppl.txt
-%% ----------------------------------------------------------------
-%%
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-\preamble
-
-----------------------------------------------------------------
-The dccpaper bundle: Classes for submissions to IJDC and IDCC
-Author: Alex Ball
-E-mail: a.ball@ukoln.ac.uk
-License: Released under the LaTeX Project Public License v1.3c or later
-See: http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
-\endpreamble
-\postamble
-
-Copyright (C) 2020 Digital Curation Centre, University of Edinburgh
-<info@dcc.ac.uk>
-\endpostamble
-
-\usedir{tex/latex/dccpaper}
-\generate{
- \file{ijdc-v9.cls}{\from{\jobname.dtx}{ijdc9}}
- \file{ijdc-v14.cls}{\from{\jobname.dtx}{ijdc14}}
- \file{idcc.cls}{\from{\jobname.dtx}{idcc}}
- \file{dccpaper-base.sty}{\from{\jobname.dtx}{base}}
-}
-\endbatchfile
-%%
-%% Copyright (C) 2020 Digital Curation Centre, University of Edinburgh
-%% <info@dcc.ac.uk>
-%%
-%% End of file `dccpaper.ins'.
diff --git a/Master/texmf-dist/source/latex/decision-table/decision-table.dtx b/Master/texmf-dist/source/latex/decision-table/decision-table.dtx
new file mode 100644
index 00000000000..ba9eada069a
--- /dev/null
+++ b/Master/texmf-dist/source/latex/decision-table/decision-table.dtx
@@ -0,0 +1,474 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2020 by S. Vandevelde, F. Pantigny
+% ------------------------------------------------
+%
+% This file 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:
+%
+% 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.
+%
+% \fi
+% \iffalse
+%
+\def\dmnfileversion{0.0.3}
+\def\dmnfiledate{2020/12/08}
+%
+%<*batchfile>
+\begingroup
+\input l3docstrip.tex
+\keepsilent
+\usedir{tex/latex/cascade}
+\preamble
+
+Copyright (C) 2020 by S.Vandevelde, F. Pantigny
+-----------------------------------
+
+This file 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:
+
+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.
+
+\endpreamble
+\askforoverwritefalse
+\endgroup
+%</batchfile>
+%
+%<@@=cascade>
+%<*driver>
+\documentclass[dvipsnames]{l3doc}% option dvipsnames is for xcolor (loaded by tikz)
+\usepackage{xltxtra}
+\usepackage{geometry}
+\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
+\setlength{\fboxsep}{0pt}
+\usepackage{tikz}
+\usepackage{hyperref}
+\usepackage{listings}
+\usepackage{float}
+\usetikzlibrary{calc}
+\usepackage{decision-table}
+\hfuzz=5cm
+\def\interitem{\vskip 7mm plus 2 mm minus 3mm}
+\def\emphase{\bgroup\color{RoyalPurple}\let\next=}
+\fvset{commandchars=\~\#\@,formatcom={\color{gray}}}
+\parindent 0pt
+\skip\footins = 2\bigskipamount
+
+
+
+\begin{document}
+\DocInput{decision-table.dtx}
+\end{document}
+%</driver>
+% \fi
+% \title{The package \pkg{decision-table}\thanks{This document corresponds to the
+% version~\dmnfileversion\space of \pkg{decision-table}, at the date of~\dmnfiledate.}}
+% \author{S. Vandevelde, F. Pantigny \\ \texttt{s.vandevelde@kuleuven.be} \\ \texttt{fpantigny@wanadoo.fr}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% The LaTeX package \pkg{decision-table} provides a command |\dmntable|, which allows for an easy way to generate decision tables in the Decision Model and Notation (DMN) format. (See Fig. \ref{ex1})
+% This package ensures consistency in the tables (i.e. fontsize), and is thus a better alternative to inserting tables via images.
+% \end{abstract}
+%
+%
+%
+% \vspace{1cm}
+% \section{Description}
+%
+% The \texttt{decision-table} package allows for an easy way to generate decision tables in the Decision Model and Notation (DMN) format. (See Fig. \ref{ex1})
+% This package ensures consistency in the tables (i.e. fontsize), and is thus a better alternative to inserting tables via images.
+%
+% \begin{figure}[H]
+% \centering
+% \dmntable{Calculate BMI}{U}{Weight(kgs),Length(m)}{BMI}{ % ---,---,weight/length*length}
+% \caption{Example of a DMN table}
+% \label{ex1}
+% \end{figure}
+% \section{How to use}
+%
+% The \texttt{decision-table} package adds the \texttt{dmntable} command, with which tables can be created.
+% This command expands into a \texttt{tabular}, so it can be used within a \texttt{table} or \texttt{figure} environment.
+% Furthermore, this allows labels and captions to be added seamlessly.
+% It is also possible to place multiple DMN tables in one \texttt{table}/\texttt{figure} environment.
+%
+% The \texttt{dmntable} command has the following inputs:
+% \begin{itemize}
+% \item title
+% \item hit policy
+% \item input column headers
+% \item output column headers
+% \item the table values
+% \end{itemize}
+% The command is used as follows:
+% \begin{lstlisting}[language=tex, frame=single]
+% \dmntable{title}{hitpolicy}{input}{output}{values}
+% \end{lstlisting}
+%
+% The input, output and cell values are split by a comma.
+% It is not necessary to include the row numbers for the cell values.
+% For example, \ref{ex1} is generated by the following code:
+% \begin{lstlisting}[language=tex, frame=single, basicstyle=\small]
+% \begin{figure}[H]
+% \centering
+% \dmntable{Calculate BMI}{U} % Title and HP
+% {Weight(kgs),Length(m)}{BMI} % Input, output
+% {---,---,weight/length*length} % Cell values
+% \caption{Example of a DMN table}
+% \label{ex1}
+% \end{figure}
+% \end{lstlisting}
+%
+% If a cell value contains multiple values (e.g. multiple string values), then accolades should be written around them.
+% See the example \ref{ex2}.
+%
+%
+% \section{Examples}
+% This section contains some example code and their resulting tables.
+%
+% \begin{lstlisting}[language=tex, frame=single, basicstyle=\small]
+% \begin{figure}[H]
+% \centering
+% \dmntable{Calculate BMI}{U} % Title and HP
+% {Weight(kgs),Length(m)}{BMI} % Input, output
+% {---,---,weight/length*length} % Cell values
+% \caption{Example of a DMN table}
+% \end{figure}
+% \end{lstlisting}
+% \begin{figure}[H]
+% \centering
+% \dmntable{Calculate BMI}{U}
+% {Weight(kgs),Length(m)}{BMI}
+% {---,---,weight/length*length}
+% \caption{Example of a DMN table}
+% \end{figure}
+%
+%
+% \begin{lstlisting}[language=tex, frame=single, basicstyle=\small]
+% \begin{ligure}[H]
+% \centering
+% \dmntable{Decide BMI Level}{U}
+% {BMI}{BMI Level, Risk Level}
+% {$< 18.5$, Underweight, Increased,
+% $[18.5..24.9]$, Normal, Low,
+% $[25..29.9]$, overweight, Increased,
+% $[30..34.9]$, Obese I, High,
+% $[35..39.9]$, Obese II, Very High,
+% $> 39.9$, Extreme Obesity, Extremely High}
+% \caption{Example of a DMN table}
+% \end{figure}
+% \end{lstlisting}
+% \begin{figure}[H]
+% \centering
+% \dmntable{Decide BMI Level}{U}
+% {BMI}{BMI Level, Risk Level}
+% {$< 18.5$, Underweight, Increased,
+% $[18.5..24.9]$, Normal, Low,
+% $[25..29.9]$, overweight, Increased,
+% $[30..34.9]$, Obese I, High,
+% $[35..39.9]$, Obese II, Very High,
+% $> 39.9$, Extreme Obesity, Extremely High}
+% \caption{Example of a larger DMN table}
+% \end{figure}
+%
+% \begin{lstlisting}[language=tex, frame=single, basicstyle=\tiny]
+% \begin{figure}[H]
+% \centering
+% \dmntable{Decide Risk Level}{U}
+% {BMI level, Waist(cm)}{Risk Level}
+% {Overweight, $<=88$, Increased,
+% Overweight, $ > 88$, High,
+% Obese I,$ <= 88$, High,
+% Obese II, ---, Very High,
+% Extreme Obesity, ---, Extremely High,
+% {not(Overweight, Obese I, Obese II, Extreme Obesity)}, ---, Low
+% }
+% \caption{Example of cell with multiple values}
+% \label{ex2}
+% \end{figure}
+% \end{lstlisting}
+%
+% \begin{figure}[H]
+% \centering
+% \dmntable{Decide Risk Level}{U}
+% {BMI level, Waist(cm)}{Risk Level}
+% {Overweight, $<=88$, Increased,
+% Overweight, $ > 88$, High,
+% Obese I,$ <= 88$, High,
+% Obese II, ---, Very High,
+% Extreme Obesity, ---, Extremely High,
+% {not(Overweight, Obese I, Obese II, Extreme Obesity)}, ---, Low
+% }
+% \caption{Example of cell with multiple values}
+% \label{ex2}
+% \end{figure}
+%
+% \begin{lstlisting}[language=tex, frame=single, basicstyle=\tiny]
+% \begin{figure}[H]
+% \centering
+% \dmntable{Rule 1}{U}
+% {Age, Service Years}{Eligible1}
+% {$\leq18$, ---, Yes,
+% $\geq60$, ---, Yes,
+% {$[18, 60]$}, $\geq 30$, Yes
+% }
+% \dmntable{Rule 2}{U}
+% {Age, Service Years}{Eligible2}
+% {---,$\geq30$, Yes,
+% $\geq60$,$<30$, Yes
+% }
+% \dmntable{Rule 3}{U}
+% {Age, Service Years}{Eligible3}
+% {$< 45$, {$[15, 30)$}, Yes,
+% $> 45$, ---, Yes
+% }
+% \dmntable{Vacation days}{C+}
+% {Eligible1, Eligible2, Eligble3}{Vacation Days}
+% {---, ---, ---, 22,
+% Yes, ---, ---, 5,
+% ---, Yes, ---, 3,
+% No, ---, Yes, 2
+% }
+% \caption{dmn table example for the Vacation Days}
+% \end{figure}
+% \end{lstlisting}
+% \begin{figure}[H]
+% \centering
+% \dmntable{Rule 1}{U}
+% {Age, Service Years}{Eligible1}
+% {$\leq18$, ---, Yes,
+% $\geq60$, ---, Yes,
+% {$[18, 60]$}, $\geq 30$, Yes
+% }
+% \dmntable{Rule 2}{U}
+% {Age, Service Years}{Eligible2}
+% {---,$\geq30$, Yes,
+% $\geq60$,$<30$, Yes
+% }
+% \dmntable{Rule 3}{U}
+% {Age, Service Years}{Eligible3}
+% {$< 45$, {$[15, 30)$}, Yes,
+% $> 45$, ---, Yes
+% }
+% \dmntable{Vacation days}{C+}
+% {Eligible1, Eligible2, Eligble3}{Vacation Days}
+% {---, ---, ---, 22,
+% Yes, ---, ---, 5,
+% ---, Yes, ---, 3,
+% No, ---, Yes, 2
+% }
+% \caption{DMN table example for the Vacation Days}
+% \end{figure}
+%
+%
+% \section{Contributing}
+%
+% Contributions are always welcome.
+% The project is hosted at \url{https://gitlab.com/Vadevesi/dmn-tex}
+
+%
+% \newgeometry{left=4cm}
+%
+% \section{Implementation}
+%
+%<@@=dmn>
+%
+% \bigskip
+%
+%
+% We give the traditional declaration of a package written with |expl3|:
+% \begin{macrocode}
+\RequirePackage{l3keys2e}
+\ProvidesExplPackage
+ {decision-table}
+ {\dmnfiledate}
+ {\dmnfileversion}
+ {Table of decision}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage { nicematrix }
+% \end{macrocode}
+%
+% \bigskip
+% We define the command |\dmntable| with the tools of \pkg{xparse} (in 2020
+% October, \pkg{xparse} will be included in the LaTeX kernel).
+% \begin{macrocode}
+\NewDocumentCommand \dmntable { m m m m m }
+ {
+% \end{macrocode}
+% The clist (\emph{commad separated list}) |\l_@@_input_clist| is for the list
+% of the names of the input fields.
+% \begin{macrocode}
+ \clist_clear_new:N \l_@@_input_clist
+ \clist_set:Nn \l_@@_input_clist { #3 }
+% \end{macrocode}
+%
+% \bigskip
+% The clist |\l_@@_output_clist| is for the list of the names of the output fields.
+% \begin{macrocode}
+ \clist_clear_new:N \l_@@_output_clist
+ \clist_set:Nn \l_@@_output_clist { #4 }
+% \end{macrocode}
+%
+% \bigskip
+% The integer |\l_@@_input_int| is the number of the input fields.
+% \begin{macrocode}
+ \int_zero_new:N \l_@@_input_int
+ \int_set:Nn \l_@@_input_int { \clist_count:N \l_@@_input_clist }
+% \end{macrocode}
+%
+% \bigskip
+% The integer |\l_@@_output_int| is the number of the output fields.
+% \begin{macrocode}
+ \int_zero_new:N \l_@@_output_int
+ \int_set:Nn \l_@@_output_int { \clist_count:N \l_@@_output_clist }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The sequence |\l_@@_cells_seq| is the sequence of all the cells of the
+% ``body'' of the tabular.
+% \begin{macrocode}
+ \seq_clear_new:N \l_@@_cells_seq
+ \seq_set_split:Nnn \l_@@_cells_seq { , } { #5 }
+% \end{macrocode}
+%
+%
+% \vspace{1cm}
+% Now, we will begin the construction of the tabular (a |{NiceTabular}| of
+% \pkg{nicematrix}).
+%
+% \bigskip
+% The command |\use:x| will expand its argument. Indeed, the preamble of the
+% |{NiceTabular}| (which has the same format as a preamble of |{tabular}| must
+% be computed before the execution of the |\begin{NiceTabular}|.
+% \begin{macrocode}
+ \use:x
+ {
+ \exp_not:N \begin { NiceTabular }
+% \end{macrocode}
+% Here is the preamble of the tabular. The command |\prg_replicate:nn| is
+% expandable and hence will be expanded by the |use:x|.
+% \begin{macrocode}
+ { r \prg_replicate:nn { \l_@@_input_int + \l_@@_output_int } l }
+% \end{macrocode}
+% Here is the list of options of the |{NiceTabular}| (a standard tabular of
+% |{array}| don't have such list of options. Once again, we have to compute some
+% quantities in this list of options before the execution of |\begin{NiceTabular}|.
+% \begin{macrocode}
+ [
+% \end{macrocode}
+% The key |hvlines-except-corners| will draw all the rules of the tabular,
+% excepted in the (upper right) corner.
+% \begin{macrocode}
+ hvlines-except-corners ,
+% \end{macrocode}
+% The key |code-before| of |{NiceTabular}| contains instructions to color the
+% cells \emph{before} the rules (doing so, the resulting \textsc{pdf} gives
+% better results in the \textsc{pdf} viewers).
+% \begin{macrocode}
+ code-before =
+% \end{macrocode}
+% First, a |\rectanglecolor| for the labels of the ``input'' fields. The command
+% |\int_eval:n| is expandable and, hence, will be expanded by the |\use:x|. On
+% the other side, we have to prevent the expansion of |\rectanglecolor| which,
+% in fact, at that point is not defined (it will be defined by \pkg{nicematrix}
+% after the construction of the array).
+% \begin{macrocode}
+ \exp_not:N \rectanglecolor
+ { blue!10!green!60!black!30 }
+ { 2 - 2 }
+ { 2 - \int_eval:n { \l_@@_input_int + 1 } }
+% \end{macrocode}
+% A |\rectanglecolor| for the labels of the ``output'' fields.
+% \begin{macrocode}
+ \exp_not:N \rectanglecolor
+ { green!30!blue!15 }
+ { 2 - \int_eval:n { \l_@@_input_int + 2 } }
+ { 2 - \int_eval:n { \l_@@_input_int + \l_@@_output_int + 1 } }
+ ]
+ }
+% \end{macrocode}
+% Now, we begin the body of the tabular (the environment |{NiceTabular}|).
+%
+% \medskip
+% The body begins by a |\multicolumn| for the title. However, we have to compute
+% the number of cells of that |\multicolumn|. That's why we have to expand the
+% first argument of the |\multicolumn| before executing the |\multicolumn|.
+% However, we have to do that in an expandable way in order to prevent the
+% functionnality of the |\multicolumn| (which internally give a |\omit| of TeX).
+% That's why we have to use |\exp_args:Ne| (|\exp_args:Nx| would not do the job).
+% \begin{macrocode}
+ \exp_args:Ne \multicolumn
+ { \int_eval:n { \l_@@_input_int + 1 } }
+ { l }
+ { #1 } \\
+% \end{macrocode}
+% |#2| is the \emph{hit policy}.
+% \begin{macrocode}
+ #2 &
+% \end{macrocode}
+% Now, the fields (``input fields'' and ``output fields''). By using
+% |\clist_use:Nn|, we replace the commas by ampersands (|&|).
+% \begin{macrocode}
+ \clist_use:Nn \l_@@_input_clist { & } &
+ \clist_use:Nn \l_@@_output_clist { & } \\
+% \end{macrocode}
+% Now, all the rows corresponding to the rules. We begin a loop over all the
+% cells with |\seq_map_inline:Nn|.
+% \begin{macrocode}
+ 1 &
+ \seq_map_inline:Nn \l_@@_cells_seq
+ {
+% \end{macrocode}
+% |\c@jCol| and |\c@iRow| are counters provided by |{NiceTabular}| for the
+% current column and the current row. If you are in the first column, we insert
+% the number of rule.
+% \begin{macrocode}
+ \int_compare:nT { \c@jCol = 0 } { \int_eval:n { \c@iRow - 1 } & }
+% \end{macrocode}
+% Now, we add one composante of |\l_@@_cells_seq|.
+% \begin{macrocode}
+ ##1
+% \end{macrocode}
+% Before the following cell, we have, of course, to add |\\| (if we are at the
+% end of the row) or |&| (elsewhere).
+% \begin{macrocode}
+ \int_compare:nTF { \c@jCol = \l_@@_input_int + \l_@@_output_int + 1 }
+ { \\ }
+ { & }
+ }
+ \end { NiceTabular }
+ }
+% \end{macrocode}
+%
+%
+%
+% \tableofcontents
+%
+% \end{document}
+%
+% Local Variables:
+% TeX-fold-mode: t
+% TeX-fold-preserve-comments: nil
+% flyspell-mode: nil
+% fill-column: 80
+% End:
+
+
+
+
+
+
diff --git a/Master/texmf-dist/source/latex/decision-table/decision-table.ins b/Master/texmf-dist/source/latex/decision-table/decision-table.ins
new file mode 100644
index 00000000000..e6e24bff6f9
--- /dev/null
+++ b/Master/texmf-dist/source/latex/decision-table/decision-table.ins
@@ -0,0 +1,47 @@
+%%
+%% Copyright (C) 2020 by S. Vandevelde and F. Pantigny
+%%
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3c of this license or (at your option) any later
+%% version. 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.
+%%
+\input l3docstrip.tex
+\keepsilent
+\usedir{tex/latex/decision-table}
+\preamble
+
+Copyright (C) 2020 by S. Vandevelde, F. Pantigny
+
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3c of this license or (at your option) any later
+version. 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.
+
+\endpreamble
+\generate{\file{decision-table.sty}{\from{decision-table.dtx}{package}}}
+\Msg{*********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space decision-table.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file decision-table.dtx}
+\Msg{* through XeLaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*********************************************************}
+\endbatchfile
+
diff --git a/Master/texmf-dist/source/latex/decorule/decorule.dtx b/Master/texmf-dist/source/latex/decorule/decorule.dtx
index 80f70bd597e..b7dbb680099 100644
--- a/Master/texmf-dist/source/latex/decorule/decorule.dtx
+++ b/Master/texmf-dist/source/latex/decorule/decorule.dtx
@@ -1,7 +1,9 @@
% \iffalse meta-comment
%
-%% decorule.dtx
-%% Copyright © 2010-2011 by Peter Flynn <peter@silmaril.ie>
+% Transformed from decorule.xml by ClassPack db2dtx.xsl
+% version 1.19 (2020-05-19) on Thursday 21 May 2020 at 11:04:52
+%
+% decorule.dtx is copyright © 2010-2020 by Peter Flynn <peter@silmaril.ie>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -13,38 +15,404 @@
% 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'.
+% This work has the LPPL maintenance status ‘maintained’.
%
% The current maintainer of this work is Peter Flynn <peter@silmaril.ie>
%
-% This work consists of the files decorule.dtx and decorule.ins
-% and the derived file decorule.sty.
+% This work consists of the files decorule.dtx and decorule.ins,
+% the derived file ,
+% and any other ancillary files listed in the MANIFEST.
%
% \fi
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[2009/09/24]
-%<package>\ProvidesPackage{decorule}[2011/08/02 v0.6 The decorule LaTeX2e package]
-%<package>\RequirePackage{graphicx}
-%<package>\RequirePackage{fix-cm}
+%<package>\ProvidesPackage{decorule}[2020/04/01 v0.7
+%<package> A decorative swelled rule for LaTeX]
%<*driver>
+\RequirePackage{fix-cm}% included by default.
+\PassOptionsToPackage{svgnames}{xcolor}% xcolor/dox/hyperref implied
\documentclass[12pt]{ltxdoc}
-\usepackage{decorule}
-\usepackage[utf8x]{inputenc}
-\usepackage[T1]{fontenc}
-\usepackage{fancyvrb}
-\usepackage{mflogo}
-\usepackage{chicago}
-\usepackage{url}
-\usepackage{nicefrac}
-\usepackage{lmodern}
-\usepackage[a4paper,margin=3cm]{geometry}
-\usepackage{parskip}
-\usepackage{varioref}
-\usepackage{listings}
-\usepackage{textcomp}
-\newcommand{\classorpackage}{package}
-\newcommand{\ConTeXt}{%
- C\kern-.0333emon\-\kern-.0667em\TeX\kern-.0333emt}
+%%
+%% Packages added for documentation
+%%
+\usepackage{dox}% used by default. (0)%
+ \makeatletter
+ \doxitem[idxtype=attribute]{Attribute}{CPK@attribute}{attributes}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=attributevalue]{AttributeValue}{CPK@attributevalue}{attribute values}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=class]{Class}{CPK@class}{classes}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=colour]{Colour}{CPK@colour}{colours}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=counter]{Counter}{CPK@counter}{counters}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=DTD]{DTD}{CPK@dtd}{DTDs/Schemas}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=element]{Element}{CPK@element}{element types}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=entity]{Entity}{CPK@entity}{entities}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=error]{Error}{CPK@error}{errors}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=field]{Field}{CPK@field}{fields}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=file]{File}{CPK@file}{files}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=font]{Font}{CPK@font}{fonts}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=function]{Function}{CPK@function}{functions}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=language]{Language}{CPK@language}{languages}
+ \makeatother
+ \makeatletter
+ \doxitem[macrolike,idxtype=length]{Length}{CPK@length}{lengths}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=mode]{Mode}{CPK@mode}{modes}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=option]{Option}{CPK@option}{options}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=package]{Package}{CPK@package}{packages}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=variable]{Variable}{CPK@variable}{variables}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=parameter]{Parameter}{CPK@parameter}{parameters}
+ \makeatother
+ \makeatletter
+ \doxitem[macrolike,idxtype=switch]{Switch}{CPK@switch}{switches}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=template]{Template}{CPK@template}{templates}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=typeface]{Typeface}{CPK@typeface}{typefaces}
+ \makeatother
+ \makeatletter
+ \doxitem[macrolike,idxtype=box]{Box}{CPK@box}{boxes}
+ \makeatother
+ \newcommand{\LabelFont}[2][\relax]{\strut
+ {\fontencoding\encodingdefault
+ \fontfamily{lmtt}\fontseries{lc}#1\selectfont#2}\space}
+ \makeatletter
+ \let\CPK@macro\macro\let\CPK@endmacro\endmacro
+ \makeatother
+ \makeatletter
+ \let\CPK@environment\environment\let\CPK@endenvironment\endenvironment
+ \makeatother
+ \makeatletter
+ \def\PrintAttributeName#1{\LabelFont{@#1}}
+ \makeatother
+ \def\PrintAttributeValueName#1{\LabelFont{"#1"}}
+ \def\PrintClassName#1{\LabelFont[\fontfamily{lmss}]{#1}}
+ \def\PrintColourName#1{\LabelFont[\color{#1}]{#1}}
+ \def\PrintCounterName#1{\LabelFont{#1}}
+ \def\PrintDTDName#1{\LabelFont{#1}}
+ \def\PrintElementName#1{\LabelFont{<#1>}}
+ \def\PrintEntityName#1{\LabelFont{\&#1;}}
+ \def\PrintEnvironmentName#1{\LabelFont[\fontfamily{lmss}]{#1}}
+ \def\PrintErrorName#1{\LabelFont[\color{Red}!]{#1}}
+ \def\PrintFunctionName#1{\LabelFont[\bfseries\itshape]{#1}}
+ \def\PrintLanguageName#1{\LabelFont{#1}}
+ \def\PrintLengthName#1{\LabelFont{#1}}
+ \def\PrintMacroName#1{\LabelFont{#1}}
+ \def\PrintModeName#1{\LabelFont[\sffamily]{\textlangle#1\textrangle}}
+ \def\PrintOptionName#1{\LabelFont[\bfseries]{#1}}
+ \def\PrintPackageName#1{\LabelFont[\fontfamily{lmss}]{#1}}
+ \def\PrintSwitchName#1{\LabelFont{#1}}
+ \def\PrintTemplateName#1{\LabelFont[\bfseries]{#1}}
+ \def\PrintVariableName#1{\LabelFont[\ttfamily]{#1}}
+ \def\PrintParameterName#1{\LabelFont[\ttfamily]{#1}}
+ \def\PrintFieldName#1{\LabelFont[\ttfamily]{#1}}
+\usepackage[T1]{fontenc}% used by default. (3)%
+ \let\SavedShow\show
+ \let\SavedShow\show
+\usepackage[utf8]{inputenc}[2008/03/30]% requested by author (6)%
+\usepackage{mflogo}% used by default. (35)%
+\usepackage[british]{babel}% used by default. (40)%
+\usepackage[backend=biber,doi=true,
+ isbn=true,url=true,uniquename=false,style=apa]{biblatex}% bibliography/@arch=biblatex detected. (41)%
+ \makeatletter
+ \AtBeginDocument{%
+ \setlength{\bibitemsep}{1ex}%
+ \setlength{\bibnamesep}{1.5\itemsep}%
+ \defbibheading{shortbib}[References]%
+ {\section{#1}}}
+ \@ifpackagewith{babel}{british}{%
+ \DeclareLanguageMapping{british}%
+ {british-apa}}{\relax}
+ \makeatother
+ \makeatletter
+ \providetoggle{blx@skipbiblist}
+ \makeatother
+\usepackage{csquotes}% bibliography/@arch=biblatex detected. (43)%
+\usepackage{array}% use of 'tgroup' detected (46)%
+\usepackage{calc}% used by default. (49)%
+ \makeatletter
+ {\scriptsize
+ \global\advance\@totalleftmargin by1em
+ \global\advance\MacroIndent by.5em}
+ \makeatother
+\usepackage{ccaption}% used by default. (52)%
+ \captionnamefont{\bfseries}
+ \captionstyle{\raggedright}
+\usepackage[inline]{enumitem}% use of 'variablelist' detected (56)%
+ \setlist[description]{style=unboxed}
+ \setlist[itemize]{leftmargin=2em}
+ \setlist[enumerate]{leftmargin=2em}
+ \newlist{inlineenum}{enumerate*}{1}
+ \setlist[inlineenum,1]{label=\emph{\alph*}),
+ itemjoin={{; }},itemjoin*={{; and }}}
+\usepackage{fancybox}% use of 'note' detected (57)%
+\usepackage{fancyvrb}% use of 'bibliography' detected (60)%
+\usepackage{relsize}% use of 'acronym' detected (64)%
+\usepackage{textcase}% used by default. (67)%
+\usepackage{float}% used by default. (69)%
+ \renewcommand{\topfraction}{.85}
+ \renewcommand{\bottomfraction}{.7}
+ \renewcommand{\textfraction}{.15}
+ \renewcommand{\floatpagefraction}{.66}
+ \renewcommand{\dbltopfraction}{.66}
+ \renewcommand{\dblfloatpagefraction}{.66}
+ \setcounter{topnumber}{9}
+ \setcounter{bottomnumber}{9}
+ \setcounter{totalnumber}{20}
+ \setcounter{dbltopnumber}{9}
+\usepackage[a4paper,left=30mm,top=25mm,
+ textwidth=150mm,textheight=225mm,headheight=15pt]{geometry}% used by default. (71)%
+\usepackage{listings}% use of 'programlisting' detected (83)%
+ \lstdefinelanguage{dummy}
+ {morekeywords={dummy}}
+ \lstdefinelanguage{Makefile}
+ {otherkeywords={.PHONY,.DEFAULT},%
+ morekeywords={PHONY,DEFAULT,shell,ifeq,else,endif},%
+ keywordsprefix={.},%
+ moredelim=[l][\color{Green}]{:},%
+ morecomment=[l]{\#},%
+ moredelim=[s][\color{Blue}]{\$(}{)}%
+ }
+ \lstdefinelanguage{DocBook}[]{XML}
+ {morekeywords={abstract,address,affiliation,annotation,arg,
+ author,book,chapter,classname,cmdsynopsis,command,
+ constraintdef,contrib,copyright,cover,date,email,emphasis,
+ envar,filename,firstname,footnote,guibutton,guilabel,
+ guimenu,guimenuitem,guisubmenu,holder,info,itemizedlist,
+ listitem,literal,member,option,orderedlist,orgdiv,orgname,
+ package,para,parameter,part,personname,phrase,procedure,
+ productname,programlisting,quote,refsection,remark,
+ constructorsynopsis,methodparan,modifier,funcparams,olink,
+ bibliography,biblioentry,biblioset,subtitle,artpagenums,
+ volumenum,issuenum,DOCTYPE,SYSTEM,xml:id,releaseinfo,
+ replaceable,revdescription,revhistory,revision,sect1,sect2,
+ sect3,sect4,seg,seglistitem,segmentedlist,segtitle,
+ simplelist,step,surname,systemitem,tag,term,title,uri,
+ userinput,variablelist,varlistentry,wordasword,xref,year,
+ xlink:href}}
+
+ \makeatletter
+ \lstdefinelanguage{bash}
+ {morestring=[s]{[]},morekeywords={exit,logout,yes,no,@,
+ password,ssh,URL,cd,dvips,latex,ls,makeindex,man,mkdir,
+ pdflatex,sudo,texconfig,texdoc,updmap,xelatex,biber,
+ latexmk,bibtex}}
+
+ \makeatother
+ \lstdefinelanguage{APA}[]{XML}
+ {morekeywords={TTL}}
+
+ \lstdefinelanguage{OOXML}[]{XML}
+ {morekeywords={w:p,w:pPr,w:pStyle,w:rPr,w:rFonts,
+ w:r,w:t,w:lang}}
+
+ \lstdefinelanguage{SGML}[]{XML}
+ {morekeywords={sec,ttl}}
+
+ \lstdefinelanguage{DTD}[]{XML}
+ {morekeywords={ELEMENT,ENTITY,ATTLIST,CDATA,ID,REQUIRED,
+ IMPLIED,PCDATA}}
+
+ \lstdefinelanguage{Runoff}
+ {morekeywords={h1}}
+
+ \lstdefinelanguage{GML}
+ {morekeywords={h1}}
+
+ \lstdefinelanguage{Scribe}
+ {morekeywords={Heading},morestring=[s]{[]}}
+
+ \lstdefinelanguage{RTF}[]{TeX}
+ {moretexcs={rtf,ansi,deff,adeflang,fonttbl,f,froman,fprq,
+ fcharset,f1,fswiss,falt,fnil,colortbl,red,green,blue,
+ stylesheet,s,snext,nowidctlpar,hyphen,hyphlead,hyphtrail,
+ hyphmax,cf,kerning,dbch,af,langfe,afs,alang,loch,fs,
+ pgndec,pard,plain,qc,sb,sa,keepn,b,ab,rtlch,ltrch,par}}
+
+ \lstdefinelanguage{TEI}[]{XML}
+ {morekeywords={TEI,TEI.2,teiHeader,fileDesc,sourceDesc,
+ titleStmt,title,author,editor,respStmt,resp,name,
+ editionStmt,edition,text,body,publicationStmt,publisher,
+ div,div1,placeName,lg,l,s,cl,phr,w,list,distinct,p,pb,
+ mls,div2,head,num,val,app,lem,rdg,q,sup,uncl,note,
+ DOCTYPE,SYSTEM,xml:id}}[keywords,comments,strings]
+
+ \lstdefinelanguage{XSLT2}[]{XML}
+ {morekeywords={xsl:stylesheet,xsl:transform,
+ xsl:apply-imports,xsl:attribute-set,xsl:decimal-format,
+ xsl:import,xsl:include,xsl:key,xsl:namespace-alias,
+ xsl:output,xsl:param,
+ xsl:preserve-space,xsl:strip-space,xsl:template,
+ xsl:variable,xsl:character-map,xsl:function,
+ xsl:import-schema,xsl:param,xsl:variable,
+ xsl:apply-imports,xsl:apply-templates,xsl:attribute,
+ xsl:call-template,xsl:choose,xsl:comment,xsl:copy,
+ xsl:copy-of,xsl:element,xsl:fallback,xsl:for-each,
+ xsl:if,xsl:message,xsl:number,xsl:otherwise,
+ xsl:processing-instruction,xsl:text,xsl:value-of,
+ xsl:variable,xsl:when,xsl:with-param,xsl:sort,
+ xsl:for-each-group,xsl:next-match,xsl:analyze-string,
+ xsl:namespace,xsl:result-document,xsl:copy,
+ xsl:fallback,xsl:document,xsl:sequence,
+ xsl:matching-substring,xsl:non-matching-substring,
+ xsl:perform-sort,xsl:output-character},
+ alsodigit={-}}
+
+ \lstdefinelanguage{LaTeXe}[LaTeX]{TeX}
+ {morekeywords = {selectlanguage,foreignlanguage,
+ textbrokenbar,textlangle,textrangle,subsection,url,
+ chapter,tableofcontents,part,subsubsection,paragraph,
+ subparagraph,maketitle,setlength,listoffigures,
+ listoftables,color,arraybackslash,includegraphics,
+ textcite,parencite,graphicspath,lstinline,
+ DeclareLanguageMapping,textcolor,definecolor,colorbox,
+ fcolorbox,RequirePackage,PassOptionsToPackage}}
+
+ \lstdefinelanguage{BIBTeX}{
+ morekeywords = {title,author,edition,publisher,year,
+ address},
+ morestring=[b]",
+ }
+
+ \lstdefinelanguage{Email}{
+ morekeywords={From,Subject,To,Date},
+ }
+
+ \lstset{defaultdialect=LaTeXe,frame=single,
+ framesep=.5em,backgroundcolor=\color{AliceBlue},
+ rulecolor=\color{LightSteelBlue},framerule=1pt}
+
+ \lstloadlanguages{LaTeXe,DocBook,XML,XSLT2,bash}
+ \lstdefinelanguage{XMLFRAG}{tag=**[s]<>}[html]
+ \lstnewenvironment{listingsdoc}
+ {\lstset{language={[LaTeX]TeX}}}
+ {}
+ \newcommand\basicdefault[1]{\footnotesize
+ \color{Black}\ttfamily#1}
+
+ \lstset{basicstyle=\basicdefault{\spaceskip.5em}}
+ \lstset{literate=
+ {§}{{\S}}1
+ {©}{{\raisebox{.125ex}{\copyright}\enspace}}1
+ {«}{{\guillemotleft}}1
+ {»}{{\guillemotright}}1
+ {Á}{{\'A}}1
+ {Ä}{{\"A}}1
+ {É}{{\'E}}1
+ {Í}{{\'I}}1
+ {Ó}{{\'O}}1
+ {Ö}{{\"O}}1
+ {Ú}{{\'U}}1
+ {Ü}{{\"U}}1
+ {ß}{{\ss}}2
+ {à}{{\`a}}1
+ {á}{{\'a}}1
+ {ä}{{\"a}}1
+ {é}{{\'e}}1
+ {í}{{\'i}}1
+ {ó}{{\'o}}1
+ {ö}{{\"o}}1
+ {ú}{{\'u}}1
+ {ü}{{\"u}}1
+ {¹}{{\textsuperscript1}}1
+ {²}{{\textsuperscript2}}1
+ {³}{{\textsuperscript3}}1
+ {ı}{{\i}}1
+ {—}{{---}}1
+ {’}{{'}}1
+ {…}{{\dots}}1
+ {➝}{{$leftarrow$}}1
+ {⮠}{{$\hookleftarrow$}}1
+ {␣}{{\textvisiblespace}}1,
+ keywordstyle=\color{DarkGreen}\bfseries,
+ identifierstyle=\color{DarkRed},
+ commentstyle=\color{Gray}\upshape,
+ stringstyle=\color{DarkBlue}\upshape,
+ emphstyle=\color{Chocolate}\upshape,
+ showstringspaces=false,
+ columns=fullflexible,
+ keepspaces=true}
+\usepackage{makeidx}% used by default. (85)%
+ \makeindex
+\usepackage{nicefrac}% used by default. (91)%
+ \def\textonehalf{\ensuremath{\nicefrac12}}
+\usepackage{parskip}% used by default. (93)%
+\usepackage{sectsty}% used by default. (96)%
+ \allsectionsfont{\sffamily\raggedright}
+ \renewcommand*{\descriptionlabel}[1]{\hspace\labelsep
+ \sffamily\bfseries #1}
+\usepackage[normalem]{ulem}% use of 'link' detected (103)%
+\usepackage{url}% use of 'ulink' detected (104)%
+ \AtBeginDocument{\urlstyle{tt}}
+\usepackage{varioref}% use of 'xref' detected (107)%
+ \vrefwarning
+ \labelformat{appendix}{Appendix~#1}
+ \makeatletter
+ \labelformat{chapter}{\@chapapp~#1}
+ \makeatother
+ \labelformat{section}{section~#1}
+ \labelformat{subsection}{section~#1}
+ \labelformat{subsubsection}{section~#1}
+ \labelformat{paragraph}{section~#1}
+ \labelformat{figure}{Figure~#1}
+ \labelformat{table}{Table~#1}
+ \labelformat{item}{item~#1}
+ \renewcommand{\reftextcurrent}{elsewhere on this
+ page}
+ \def\reftextafter{on the
+ \reftextvario{next}{following} page}
+\usepackage{xcolor}% used by default. (115)%
+ \makeatletter
+ \@ifundefined{T}{%
+ \newcommand{\T}[2]{{\fontencoding{T1}%
+ \selectfont#2}}}{}
+ \makeatother
+\usepackage{menukeys}% use of 'guimenu' detected (118)%
+ \renewmenumacro{\menu}[>]{roundedmenus}
+ \renewmenumacro{\directory}[/]{hyphenatepathswithfolder}
+ \renewmenumacro{\keys}{shadowedroundedkeys}
+\usepackage{classpack}[2020/05/19]% used by default. (120)%
+\usepackage{decorule}[2020/04/01]% added by spec
+\addbibresource{decorule.bib}
+%
+%%
+%% Settings for docstrip and ltxdoc
+%%
\EnableCrossrefs
\CodelineIndex
\RecordChanges
@@ -54,114 +422,166 @@
%</driver>
% \fi
%
-% \CheckSum{142}
+% \CheckSum{145}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
%
-% \changes{v0.6}{2011/08/02}{Fix for the DVI-related display bug: Heiko Overdiek kindly identified the problem with the c@sym@rotate counter, that it isn't expandable. The graphics package only uses edef, but in the special, the explicit number is needed, because PostScript or GhostScript don't know \TeX{}. The result now works in Postscript output but DVI viewers may still display incorrectly..}
-% \changes{v0.5}{2011/07/28}{Fixes after release: Added par breaks and centering. Attempted to identify why it fails when creating DVI but works for PDF (section on Bugs created)..}
-% \changes{v0.4}{2011/06/13}{Bugs fixed on first release: 1) Added missing packages (graphicx and fix-cm); 2) Removed bogus change record from .sty file.}
-% \changes{v0.3}{2011/06/11}{Revised for .dtx file: 1) Rewrote documentation; 2) Generated .dtx.}
-% \changes{v0.2}{2010/07/14}{Updated to package format: Wrote .dtx file by hand.}
-% \changes{v0.1}{2010/03/20}{Written for TUGboat: Developed by hand.}
+% \changes{v0.7}{2020/04/01}{Regression release: 1) Updated to use ClassPack 1.19; 2) Switched all conformance attributes on revision dates to YYYY-MM-DD; 3) The jump in versions is because the previously submitted version was misnumbered as 0.6 when it should have been 0.06. Thanks to Erik Braun at CTAN for spotting this..}
+% \changes{v0.34}{2020/04/01}{Regression release: 1) Recreated package with latest version (1.18) of ClassPack; 2) Fixed bug in using the angle counter that was preventing \XeLaTeX{} generating output.}
+% \changes{v0.33}{2019/03/03}{Regression release: Recreated package with latest version (1.13) of ClassPack.}
+% \changes{v0.32}{2017/01/10}{Regression release: Recreated package with latest version (1.06) of ClassPack.}
+% \changes{v0.31}{2017/02/10}{Regression release: Recreated package with latest version (1.04) of ClassPack.}
+% \changes{v0.30}{2016/06/19}{Regression release: Recreated package with latest version (1.01) of ClassPack.}
+% \changes{v0.29}{2016/05/10}{Regenerated: Recreated package with new classpack code to create zip file to the CTAN standard.}
+% \changes{v0.28}{2014/04/01}{Maintenance release: Added PNG image for conversion to EPUB3.}
+% \changes{v0.27}{2013/03/27}{Maintenance release: Regression test for ClassPack v0.75 (autopackage with multifile).}
+% \changes{v0.26}{2013/02/23}{Internal update: Regression test for ClassPack v0.74 (autopackage).}
+% \changes{v0.25}{2012/06/15}{Internal update: Reworded final paragraph of documentation since the package is now available on CTAN. Removed palatino..}
+% \changes{v0.24}{2012/03/23}{Internal update: Updated header, replaced docmfp with dox package, checked conformance with latest version of classpack, added packages calc, listings, and palatino.}
+% \changes{v0.23}{2011/08/15}{Maintenance release: Updated documentation with docmfp, varioref, and geometry.}
+% \changes{v0.22}{2011/06/13}{Bugs fixed on first release: 1) Added missing packages (graphicx and fix-cm); 2) Removed bogus change record from .sty file.}
+% \changes{v0.21}{2011/06/11}{Revised for .dtx file: 1) Rewrote documentation; 2) Generated .dtx.}
+% \changes{v0.20}{2010/07/14}{Updated to package format: Wrote .dtx file by hand.}
+% \changes{v0.11}{2010/03/20}{Written for TUGboat: Developed by hand.}
%
% \GetFileInfo{decorule.dtx}
%
% \DoNotIndex{\@,\@@par,\@beginparpenalty,\@empty}
-% \DoNotIndex{\@flushglue,\@gobble,\@input}
-% \DoNotIndex{\@makefnmark,\@makeother,\@maketitle}
-% \DoNotIndex{\@namedef,\@ne,\@spaces,\@tempa}
-% \DoNotIndex{\@tempb,\@tempswafalse,\@tempswatrue}
-% \DoNotIndex{\@thanks,\@thefnmark,\@topnum}
-% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa,\@totalleftmargin}
-% \DoNotIndex{\",\/,\@ifundefined,\@nil,\@verbatim,\@vobeyspaces}
-% \DoNotIndex{\|,\~,\ ,\active,\advance,\aftergroup,\begingroup,\bgroup}
-% \DoNotIndex{\mathcal,\csname,\def,\documentstyle,\dospecials,\edef}
-% \DoNotIndex{\egroup}
-% \DoNotIndex{\else,\endcsname,\endgroup,\endinput,\endtrivlist}
-% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef,\global}
-% \DoNotIndex{\hbox,\hss,\if,\if@inlabel,\if@tempswa,\if@twocolumn}
-% \DoNotIndex{\ifcase}
-% \DoNotIndex{\ifcat,\iffalse,\ifx,\ignorespaces,\index,\input,\item}
-% \DoNotIndex{\jobname,\kern,\leavevmode,\leftskip,\let,\llap,\lower}
-% \DoNotIndex{\m@ne,\next,\newpage,\nobreak,\noexpand,\nonfrenchspacing}
-% \DoNotIndex{\obeylines,\or,\protect,\raggedleft,\rightskip,\rm,\sc}
-% \DoNotIndex{\setbox,\setcounter,\small,\space,\string,\strut}
-% \DoNotIndex{\strutbox}
-% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin,\trivlist,\tt}
-% \DoNotIndex{\twocolumn,\typeout,\vss,\vtop,\xdef,\z@}
-% \DoNotIndex{\,,\@bsphack,\@esphack,\@noligs,\@vobeyspaces,\@xverbatim}
-% \DoNotIndex{\`,\catcode,\end,\escapechar,\frenchspacing,\glossary}
-% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht,\it,\langle}
-% \DoNotIndex{\leaders,\long,\makelabel,\marginpar,\markboth,\mathcode}
-% \DoNotIndex{\mathsurround,\mbox,\newcount,\newdimen,\newskip}
-% \DoNotIndex{\nopagebreak}
-% \DoNotIndex{\parfillskip,\parindent,\parskip,\penalty,\raise,\rangle}
-% \DoNotIndex{\section,\setlength,\TeX,\topsep,\underline,\unskip,\verb}
-% \DoNotIndex{\vskip,\vspace,\widetilde,\\,\%,\@date,\@defpar}
-% \DoNotIndex{\[,\{,\},\]}
-% \DoNotIndex{\count@,\ifnum,\loop,\today,\uppercase,\uccode}
-% \DoNotIndex{\baselineskip,\begin,\tw@}
-% \DoNotIndex{\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k,\l,\m,\n,\o,\p,\q}
-% \DoNotIndex{\r,\s,\t,\u,\v,\w,\x,\y,\z,\A,\B,\C,\D,\E,\F,\G,\H}
-% \DoNotIndex{\I,\J,\K,\L,\M,\N,\O,\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z}
-% \DoNotIndex{\1,\2,\3,\4,\5,\6,\7,\8,\9,\0}
-% \DoNotIndex{\!,\#,\$,\&,\',\(,\),\+,\.,\:,\;,\<,\=,\>,\?,\_}
-% \DoNotIndex{\discretionary,\immediate,\makeatletter,\makeatother}
-% \DoNotIndex{\meaning,\newenvironment,\par,\relax,\renewenvironment}
-% \DoNotIndex{\repeat,\scriptsize,\selectfont,\the,\undefined}
-% \DoNotIndex{\arabic,\do,\makeindex,\null,\number,\show,\write,\@ehc}
-% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title,\everypar}
-% \DoNotIndex{\if@minipage,\if@restonecol,\ifeof,\ifmmode}
-% \DoNotIndex{\lccode,\newtoks,\onecolumn,\openin,\p@,\SelfDocumenting}
-% \DoNotIndex{\settowidth,\@resetonecoltrue,\@resetonecolfalse,\bf}
-% \DoNotIndex{\clearpage,\closein,\lowercase,\@inlabelfalse}
-% \DoNotIndex{\selectfont,\mathcode,\newmathalphabet,\rmdefault}
-% \DoNotIndex{\bfdefault}
+% \DoNotIndex{\@flushglue,\@gobble,\@input,\@makefnmark}
+% \DoNotIndex{\@makeother,\@maketitle,\@namedef,\@ne}
+% \DoNotIndex{\@spaces,\@tempa,\@tempb,\@tempswafalse}
+% \DoNotIndex{\@tempswatrue,\@thanks,\@thefnmark,\@topnum}
+% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa}
+% \DoNotIndex{\@totalleftmargin,\",\/,\@ifundefined,\@nil}
+% \DoNotIndex{\@verbatim,\@vobeyspaces,\|,\~,\ ,\active}
+% \DoNotIndex{\advance,\aftergroup,\begingroup,\bgroup}
+% \DoNotIndex{\mathcal,\csname,\def,\documentstyle}
+% \DoNotIndex{\dospecials,\edef,\egroup,\else,\endcsname}
+% \DoNotIndex{\endgroup,\endinput,\endtrivlist}
+% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef}
+% \DoNotIndex{\global,\hbox,\hss,\if,\if@inlabel}
+% \DoNotIndex{\if@tempswa,\if@twocolumn,\ifcase,\ifcat}
+% \DoNotIndex{\iffalse,\ifx,\ignorespaces,\index,\input}
+% \DoNotIndex{\item,\jobname,\kern,\leavevmode,\leftskip}
+% \DoNotIndex{\let,\llap,\lower,\m@ne,\next,\newpage}
+% \DoNotIndex{\nobreak,\noexpand,\nonfrenchspacing}
+% \DoNotIndex{\obeylines,\or,\protect,\raggedleft}
+% \DoNotIndex{\rightskip,\rm,\sc,\setbox,\setcounter}
+% \DoNotIndex{\small,\space,\string,\strut,\strutbox}
+% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin}
+% \DoNotIndex{\trivlist,\tt,\twocolumn,\typeout,\vss,\vtop}
+% \DoNotIndex{\xdef,\z@,\,,\@bsphack,\@esphack,\@noligs}
+% \DoNotIndex{\@vobeyspaces,\@xverbatim,\`,\catcode,\end}
+% \DoNotIndex{\escapechar,\frenchspacing,\glossary}
+% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht}
+% \DoNotIndex{\it,\langle,\leaders,\long,\makelabel}
+% \DoNotIndex{\marginpar,\markboth,\mathcode,\mathsurround}
+% \DoNotIndex{\mbox,\newcount,\newdimen,\newskip}
+% \DoNotIndex{\nopagebreak,\parfillskip,\parindent}
+% \DoNotIndex{\parskip,\penalty,\raise,\rangle,\section}
+% \DoNotIndex{\setlength,\TeX,\topsep,\underline,\unskip}
+% \DoNotIndex{\verb,\vskip,\vspace,\widetilde,\\,\%,\@date}
+% \DoNotIndex{\@defpar,\[,\{,\},\],\count@,\ifnum,\loop}
+% \DoNotIndex{\today,\uppercase,\uccode,\baselineskip}
+% \DoNotIndex{\begin,\tw@,\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k}
+% \DoNotIndex{\l,\m,\n,\o,\p,\q,\r,\s,\t,\u,\v,\w,\x,\y,\z}
+% \DoNotIndex{\A,\B,\C,\D,\E,\F,\G,\H,\I,\J,\K,\L,\M,\N,\O}
+% \DoNotIndex{\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z,\1,\2,\3,\4}
+% \DoNotIndex{\5,\6,\7,\8,\9,\0,\!,\#,\$,\&,\',\(,\)}
+% \DoNotIndex{\+,\.,\:,\;,\<,\=,\>,\?,\_,\discretionary}
+% \DoNotIndex{\immediate,\makeatletter,\makeatother}
+% \DoNotIndex{\meaning,\newenvironment,\par,\relax}
+% \DoNotIndex{\renewenvironment,\repeat,\scriptsize}
+% \DoNotIndex{\selectfont,\the,\undefined,\arabic,\do}
+% \DoNotIndex{\makeindex,\null,\number,\show,\write,\@ehc}
+% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title}
+% \DoNotIndex{\everypar,\if@minipage,\if@restonecol,\ifeof}
+% \DoNotIndex{\ifmmode,\lccode,\newtoks,\onecolumn,\openin}
+% \DoNotIndex{\p@,\SelfDocumenting,\settowidth}
+% \DoNotIndex{\@resetonecoltrue,\@resetonecolfalse,\bf}
+% \DoNotIndex{\clearpage,\closein,\lowercase}
+% \DoNotIndex{\@inlabelfalse,\selectfont,\mathcode}
+% \DoNotIndex{\newmathalphabet,\rmdefault,\bfdefault}
+% \DoNotIndex{\DeclareRobustCommand}
+% \DoNotIndex{\sim}
+% \DoNotIndex{\decorule}
+% \DoNotIndex{\hbox}
+% \DoNotIndex{\hss}
%
-% \def\fileversion{0.6}
-% \def\filedate{2011/08/02}
-% \title{The \textsf{decorule} LaTeX2e package\thanks{%
+% \def\fileversion{0.7}
+% \def\filedate{2020/04/01}
+% \title{The \textsf{decorule} \LaTeXe\ package\thanks{%
% This document corresponds to \textsf{decorule}
-% \textit{v.}\ \fileversion, dated \filedate.}
-% \\[1ex]\Large
-% A decorative swelled rule}
-% \author{Peter Flynn\\\normalsize
-% Silmaril Consultants\\[-4pt]\normalsize
-% Textual Therapy Division\\\normalsize
-% (\texttt{peter@silmaril.ie})}
+% \textit{v.}\ \fileversion p, dated \filedate.}
+% \\[1em]\Large
+% A decorative swelled rule for
+% \LaTeX{}}
+% \author{Peter Flynn\\\normalsize Silmaril Consultants\\[-.25ex]\normalsize Textual Therapy Division\\\normalsize(\url{peter@silmaril.ie})}
% \maketitle
% \renewcommand{\abstractname}{Summary}\thispagestyle{empty}
-% \begin{abstract}\noindent
+% \begin{abstract}
+% \parskip=0.5\baselineskip
+% \advance\parskip by 0pt plus 2pt
+% \parindent=0pt% \noindent
% This package implements a decorative swelled rule using
% only a symbol from a font installed with all distributions of
% \TeX{}, so it works independently, without the need to install
% any additional software or fonts.\par
% This is the packaged version of the macro which was
% originally published in the `Typographers' Inn'
-% column in TUGboat \cite{tb97}.\par
-% This version fixes the bug caused by failing to supply the
-% correct values for DVI drivers for rendering glyph rotation.
-% The result now works in Postscript output but DVI viewers may
-% still display incorrectly.\par
+% column in TUGboat \parencite{tb97}.\par
% \end{abstract}
% \clearpage
% \tableofcontents
% \clearpage
+% \section*{Latest changes}
+% \subsection*{v.0.7 (2020-04-01)}
+% \paragraph*{Regression release}
+% \begin{itemize}
+% \item Updated to use ClassPack 1.19\par
+% \item Switched all conformance attributes on revision
+% dates to YYYY-MM-DD\par
+% \item The jump in versions is because the previously
+% submitted version was misnumbered as 0.6 when it
+% should have been 0.06. Thanks to Erik Braun at CTAN
+% for spotting this.\par
+% \end{itemize}
+% \subsection*{v.0.34 (2020-04-01)}
+% \paragraph*{Regression release}
+% \begin{itemize}
+% \item Recreated package with latest version (1.18) of
+% \emph{ClassPack}\par
+% \item Fixed bug in using the angle counter that was
+% preventing \XeLaTeX{} generating output\par
+% \end{itemize}
+% \subsection*{v.0.33 (2019-03-03)}
+% \paragraph*{Regression release}
+% \begin{itemize}
+% \item Recreated package with latest version (1.13) of
+% \emph{ClassPack}\par
+% \end{itemize}
+% \subsection*{v.0.31 (2017-02-10)}
+% \paragraph*{Regression release}
+% \begin{itemize}
+% \item Recreated package with latest version (1.04) of
+% \emph{ClassPack}\par
+% \end{itemize}
+% See p.\thinspace\pageref{} for earlier changes.
+% \clearpage
% \section{Swelled rules}
% Swelled rules were a popular device in 19th century
% typesetting, and were usually done as special sorts from a
@@ -174,228 +594,234 @@
% feature is not implemented in this version and is left as an
% exercise to the user).\par
% \subsection{Other work}
-% As discussed in the original article \cite{tb97} there is an \textsf{swrule} package
-% by Tobias Dussa \cite{dussa} which builds a
+% As discussed in the original article \parencite{tb97} there is an \textsf{swrule} package
+% by Tobias Dussa \parencite{dussa} which builds a
% geometric lozenge from very fine lines, and there is a paper
-% by Steve Peter \cite{peter} which describes
+% by Steve Peter \parencite{peter} which describes
% a more extensible method using \MP{} for
-% \ConTeXt{}.\par
+% Con\TeX t{}.\par
% \subsection{This solution}
% However, it is also possible to produce one using just a
% character from a font, combined with some looping in a macro
% with careful positioning and kerning. This example was
-% constructed from the swung dash (\DescribeMacro{\sim}\verb`\sim`)
+% constructed from the swung dash ({\ttfamily{}\textbackslash{}sim})
% character in math mode, rotated and scaled to fit in an
-% asending and then descending series.\par
-% This package is available from your nearest CTAN
-% respository in the directory \url{}. The original
-% example is available at
-% \url{http://latex.silmaril.ie/packages/decorule}.
-% All suggestions for improving and extending it are
-% welcome.\par
-% \decorule{}\par
-% \subsection{Bugs}
-% Rainer adS and Herbert Schulz kindly pointed out on
-% \url{comp.text.tex}\footnote{%
-% \url{<j0sco9$emv$1@news.albasani.net>}
-% and
-% \url{<herbs-038AC9.15151428072011@news.wowway.com>}} that it failed when using standard (DVI)
-% \LaTeX{}, although it was correct when using
-% \emph{pdflatex}.\par
-% Attempts to render the DVI with (eg)
-% \emph{dvipdf} were failing with a
-% Ghostscript error: \verb`/undefined in \c@sym@rotate`.\par
-% Heiko Overdiek kindly identified the problem with the
-% \DescribeMacro{\c@sym@rotate}\verb`\c@sym@rotate` counter, that `it
-% isn't expandable. The graphics package only uses \texttt{edef}, but in the \texttt{special}, the explicit number is
-% needed, because PostScript or GhostScript don't know
-% \TeX{}.'\par
-% The result now works in Postscript output but DVI
-% viewers may still display incorrectly.\par
+% ascending and then descending series.\par
+% {\bigskip\centering{}\decorule{}\par}
+% \changes{v0.25}{2012/06/15}{Changed order of paragraphs and added space}
+% {\par\medskip{}The package is available on
+% {\smaller CTAN} in
+% \url{http://ctan.org/pkg/decorule}, and the development
+% files will be available at
+% \url{http://latex.silmaril.ie/packages} when the
+% \textsf{classpack} toolkit is released.
+% Suggestions for improving and extending this package are
+% welcome.\par}
% \clearpage
% \raggedright
-% \addtocontents{toc}{\medskip}
-% \addcontentsline{toc}{section}{\refname}
-% \bibliography{decorule}
-% \bibliographystyle{chicago}
-% \begin{VerbatimOut}{decorule.bib}
-%<*ignore>
-@article{tb97,
-author = {Peter Flynn},
-shortauthor = {Flynn},
-title = {{Typographers' Inn: Where have all the flowers gone?}},
-pages = {21-22},
-journal = {{TUGboat}},
-volume = {31},
-number = {1},
-year = {2010}
-}
-@article{peter,
-author = {Steve Peter},
-shortauthor = {Peter},
-title = {{Swelled rules and \MP{}}},
-pages = {193-195},
-journal = {{TUGboat}},
-volume = {26},
-number = {3},
-year = {2005}
-}
-@misc{dussa,
-author = {Tobias Dussa},
-shortauthor = {Dussa},
-title = {{swrule.sty}},
-year = {2001},
-month = {Oct},
-howpublished = {CTAN: \TeX{} Users Group},
-url = {http://mirror.ctan.org/macros/generic/misc/swrule.sty}
-}
-%</ignore>
-% \end{VerbatimOut}
-% \StopEventually{%
+% \raggedright\printbibliography
+% \StopEventually{\label{endcode}%
% \clearpage
-% \newgeometry{left=3cm}
+% \newgeometry{left=3cm}%
+% \addcontentsline{toc}{section}{Change History}%
+% \label{}%
% \PrintChanges
% \clearpage
+% \label{codeindex}%
+% \addcontentsline{toc}{section}{Index}%
% \PrintIndex}
-% \newgeometry{left=5cm}
+% \addtolength{\CPKrevmarg}{\widthof{\LabelFont{DCR@rotate}}}
+% \newgeometry{left=\CPKrevmarg}
+% \message{Margin reset to \the\CPKrevmarg, to fit <DCR@rotate>}
+% \iffalse
+%<*package>
+% \fi
% \clearpage
% \section{Implementation}
-% The package consists of a single main macro \texttt{decorule}, which cycles through sizes
+% The package consists of a single main macro {\ttfamily{}\textbackslash{}decorule}, which cycles through sizes
% of the symbol from minimum to maximum, rotating and scaling
% according to values preset here; and then from the maximum
% back down to the minimum.\par
-% \subsection{Preliminary declarations}
-% \begin{macro}{\sym@min}
+% \subsection{Auto-initialisation}\label{:autoinit}
+% This section is added automatically by \textit{ClassPack}
+% as a preamble to all classes and style packages.
+% The \textsf{fixltx2e} package, which used to be included
+% automatically, is no longer preloaded, as its
+% features are now a part of the latest \LaTeXe\ kernel.\par
+% The code starts with identity and requirements which are
+% generated automatically as needed by the Doc\TeX\ system.
+% For details see the \textsf{ltxdoc} package documentation.
+% \par\smallskip
+% \begingroup\color{DarkRed}\tabcolsep3pt\footnotesize
+% \begin{tabular}{>{\refstepcounter{CodelineNo}\tiny\theCodelineNo}r@{\enspace}l}
+% &\verb`\NeedsTeXFormat{LaTeX2e}[2009/09/24]`\\
+% &\verb`\ProvidesPackage{decorule}[2020/04/01 v0.7`\\
+% &\verb` A decorative swelled rule for \LaTeX{}]`
+% \end{tabular}\endgroup
+% \setcounter{CodelineNo}{3}
+%\iffalse
+%%
+%% Packages required for the class or package
+%%
+% \fi
+% \subsection{Packages required}\label{stypackages}
+% \begin{CPK@package}{fix-cm}
+% Allow infinitely-variable font scaling.
+% \iffalse
+%% Allow infinitely-variable font scaling.
+% \fi
+% \begin{macrocode}
+\RequirePackage{fix-cm}%
+% \end{macrocode}
+% \end{CPK@package}
+% \begin{CPK@package}{graphicx}
+% Provide for graphics (PNG, JPG, or PDF format (only) for
+% pdflatex; EPS format (only) for standard \LaTeX{}).
+% \iffalse
+%% Provide for graphics (PNG, JPG, or PDF format (only) for pdflatex; EPS format (only) for standard \LaTeX{}).
+% \fi
+% \begin{macrocode}
+\RequirePackage{graphicx}%
+% \end{macrocode}
+% \end{CPK@package}
+%
+% \subsection{Preliminary declarations}\label{packages-here}
+% \iffalse
+%%
+%% ******************************************************************
+%%
+%% Preliminary declarations
+% \fi
+% \begin{CPK@counter}{DCR@min}\label{counter--DCR@min}
% Define a counter and a minimum point size to start and
% end with. This value is an integer, hence a counter is
% used.\par
% \begin{macrocode}
-\newcounter{sym@min}
-\setcounter{sym@min}{1}
+\newcounter{DCR@min}
+\setcounter{DCR@min}{1}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\sym@max}
+% \end{CPK@counter}
+% \begin{CPK@counter}{DCR@max}\label{counter--DCR@max}
% Do the same for the maximum point size that the rule
% will get to in the middle.\par
% \begin{macrocode}
-\newcounter{sym@max}
-\setcounter{sym@max}{20}
+\newcounter{DCR@max}
+\setcounter{DCR@max}{20}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\sym@step}
+% \end{CPK@counter}
+% \begin{CPK@counter}{DCR@step}\label{counter--DCR@step}
% Set the step size or the increments of the glyph in
% whole points.\par
% \begin{macrocode}
-\newcounter{sym@step}
-\setcounter{sym@step}{1}
+\newcounter{DCR@step}
+\setcounter{DCR@step}{1}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\sym@rotate}
+% \end{CPK@counter}
+% \begin{CPK@counter}{DCR@rotate}\label{counter--DCR@rotate}
% Specify the amount in (whole) degrees by which we will
% need to rotate the symbol to make each glyph mesh with the
-% previous one. The use of the
-% \DescribeMacro{\thesym@rotate}\verb`\thesym@rotate` form is a bugfix due to
-% Heiko Oberdiek in \url{news:comp.text.tex} at \textlangle\verb`j0sonk$q9v$1@dont-email.me`\textrangle{}.\par
-% \changes{v0.6}{2011/08/02}{Added fix from Heiko for sym@rotate}
+% previous one.\par
% \begin{macrocode}
-\newcounter{sym@rotate}
-\renewcommand*{\thesym@rotate}{\the\c@sym@rotate}%
-\setcounter{sym@rotate}{45}
+\newcounter{DCR@rotate}
+\setcounter{DCR@rotate}{45}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\sym@size}
+% \end{CPK@counter}
+% \begin{CPK@counter}{DCR@size}\label{counter--DCR@size}
% Define a counter to hold the current (calculated) size
% as we loop through the sizes.\par
% \begin{macrocode}
-\newcounter{sym@size}
+\newcounter{DCR@size}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\sym@raise}
+% \end{CPK@counter}
+% \begin{CPK@length}{\DCR@raise}\label{length--DCR@raise}
% Define a length to hold the amount calculated at each
% step to raise/lower each glyph by (because we rotate them as
% we go).\par
% \begin{macrocode}
-\newlength{\sym@raise}
+\newlength{\DCR@raise}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\sym@skip}
+% \end{CPK@length}
+% \begin{CPK@length}{\DCR@skip}\label{length--DCR@skip}
% Define another length to hold the amount calculated to
% backspace between successive glyphs to make sure they
% touch.\par
% \begin{macrocode}
-\newlength{\sym@skip}
+\newlength{\DCR@skip}
% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\sym@symbol}
+% \end{CPK@length}
+% \begin{CPK@macro}{\DCR@symbol}\label{macro--DCR@symbol}
% Lastly, define the font character to use as the glyph.
% For the swelled rule we use the swung dash.\par
% \begin{macrocode}
-\newcommand{\sym@symbol}{$\sim$}
+\newcommand{\DCR@symbol}{\ensuremath{\sim}}
% \end{macrocode}
-% \end{macro}
+% \end{CPK@macro}
% \subsection{The main macro}
-% \begin{macro}{\decorule}
+% \iffalse
+%%
+%% ******************************************************************
+%%
+%% The main macro
+% \fi
+% \begin{CPK@macro}{\decorule}\label{macro--decorule}
% Now we can define the macro that does the actual
% work.\par
-% \changes{v0.3}{2011/06/11}{Rearranged spacing to suit the .dtx layout}
-% \changes{v0.5}{2011/07/28}{Added par breaks and centering}
+% \changes{v0.21}{2011/06/06}{Rearranged spacing to suit the .dtx layout}
% \begin{macrocode}
-\newcommand{\decorule}{\par\begingroup\centering
+\newcommand{\decorule}{%
% \end{macrocode}
% Start by setting the initial size to the minimum size
% declared above:\par
% \begin{macrocode}
-\setcounter{sym@size}{\c@sym@min}
+ \begingroup\fontencoding{OT1}\fontfamily{cmr}\selectfont%
+ \setcounter{DCR@size}{\c@DCR@min}%
% \end{macrocode}
-% Go through the steps up to, but not including, the
-% maximum size:\par
+% Loop through the steps up to, but not including, the
+% maximum size (this loop ends on line 28):\par
% \begin{macrocode}
-\loop
+ \loop
% \end{macrocode}
-% Raise each glyph above the baseline by half the
-% point size that we will use:\par
+% We want to raise each glyph above the baseline by half the
+% point size that we will use, so set the amount to the
+% current size and then divide by two:\par
% \begin{macrocode}
-\setlength{\sym@raise}{\c@sym@size pt}%
- \divide\sym@raise by2
+ \setlength{\DCR@raise}{\c@DCR@size pt}%
+ \divide\DCR@raise by2
% \end{macrocode}
% Raise, rotate, and (in this case of
-% \DescribeMacro{\sim}\verb`\sim`) reflect the glyph in a \texttt{hbox} of its own point size,
-% using \texttt{hss} to prevent
-% \TeX{} squawking. Heiko Oberdiek also identified the fix of
-% using \DescribeMacro{\thesym@rotate}\verb`\thesym@rotate` instead of
-% \DescribeMacro{\c@sym@rotate}\verb`\c@sym@rotate` for the box rotation, here
-% and elsewhere below.\par
-% \changes{v0.6}{2011/08/02}{Changed c@sym@rotate to thesym@rotate}
+% {\ttfamily{}\textbackslash{}sim}) reflect the glyph in a
+% {\ttfamily{}\textbackslash{}hbox} of its own point size, using
+% {\ttfamily{}\textbackslash{}hss} as
+% infinitely-flexible space to prevent \TeX{} squawking if
+% the glyph is slightly oversized:\par
% \begin{macrocode}
-\raisebox{-\sym@raise}{%
- \fontsize{\c@sym@size}{0}\selectfont
- \rotatebox{\thesym@rotate}{\reflectbox{\hbox
- to\c@sym@size pt{\hss\sym@symbol\hss}}}}%
+ \raisebox{-\DCR@raise}{\fontsize{\c@DCR@size}{0}\selectfont
+ \rotatebox{\the\c@DCR@rotate}{%
+ \reflectbox{\hbox to\c@DCR@size pt{\hss\DCR@symbol\hss}}}}%
% \end{macrocode}
% Calculate the amount to backspace as \nicefrac23 of the
% current size:\par
% \begin{macrocode}
-\setlength{\sym@skip}{\c@sym@size pt}%
- \divide\sym@skip by3
- \multiply\sym@skip by2
- \kern-\sym@skip
+ \setlength{\DCR@skip}{\c@DCR@size pt}%
+ \divide\DCR@skip by3
+ \multiply\DCR@skip by2
+ \kern-\DCR@skip
% \end{macrocode}
% Increment the counter and repeat:\par
% \begin{macrocode}
-\addtocounter{sym@size}{\c@sym@step}%
- \ifnum\c@sym@size<\c@sym@max
+ \addtocounter{DCR@size}{\c@DCR@step}%
+ \ifnum\c@DCR@size<\c@DCR@max
\repeat
% \end{macrocode}
% Now do the same for the sole occurrence of the maximum
-% size:\par
-% \changes{v0.6}{2011/08/02}{Changed c@sym@rotate to thesym@rotate}
+% size: this marks the mid-point of the rule:\par
% \begin{macrocode}
-\setlength{\sym@raise}{\c@sym@max pt}%
- \divide\sym@raise by2
- \raisebox{-\sym@raise}{%
- \fontsize{\c@sym@max}{0}\selectfont
- \rotatebox{\thesym@rotate}{\reflectbox{\hbox
- to\c@sym@max pt{\hss\sym@symbol\hss}}}}%
+ \setlength{\DCR@raise}{\c@DCR@max pt}%
+ \divide\DCR@raise by2
+ \raisebox{-\DCR@raise}{%
+ \fontsize{\c@DCR@max}{0}\selectfont
+ \rotatebox{\the\c@DCR@rotate}{\reflectbox{\hbox
+ to\c@DCR@max pt{\hss\DCR@symbol\hss}}}}%
% \end{macrocode}
% Start back down following the exact same pattern in
% reverse, using the current size (one step less than the
@@ -403,49 +829,52 @@ url = {http://mirror.ctan.org/macros/generic/misc/swrule.sty}
% from the last loop of the outward journey. This time,
% however, do the kerning \emph{before} the
% glyph.\par
-% \changes{v0.6}{2011/08/02}{Changed c@sym@rotate to thesym@rotate}
% \begin{macrocode}
-\loop
- \setlength{\sym@skip}{\c@sym@size pt}%
- \divide\sym@skip by3
- \multiply\sym@skip by2
- \kern-\sym@skip
- \setlength{\sym@raise}{\c@sym@size pt}%
- \divide\sym@raise by2
- \raisebox{-\sym@raise}{%
- \fontsize{\c@sym@size}{0}\selectfont
- \rotatebox{\thesym@rotate}{\reflectbox{\hbox
- to\c@sym@size pt{\hss\sym@symbol\hss}}}}%
- \addtocounter{sym@size}{-\c@sym@step}%
- \ifnum\c@sym@size>\c@sym@min
+ \loop
+ \setlength{\DCR@skip}{\c@DCR@size pt}%
+ \divide\DCR@skip by3
+ \multiply\DCR@skip by2
+ \kern-\DCR@skip
+ \setlength{\DCR@raise}{\c@DCR@size pt}%
+ \divide\DCR@raise by2
+ \raisebox{-\DCR@raise}{%
+ \fontsize{\c@DCR@size}{0}\selectfont
+ \rotatebox{\the\c@DCR@rotate}{\reflectbox{\hbox
+ to\c@DCR@size pt{\hss\DCR@symbol\hss}}}}%
+ \addtocounter{DCR@size}{-\c@DCR@step}%
+ \ifnum\c@DCR@size>\c@DCR@min
\repeat
% \end{macrocode}
% Finally, do the minimum size:\par
-% \changes{v0.6}{2011/08/02}{Changed c@sym@rotate to thesym@rotate}
% \begin{macrocode}
-\setlength{\sym@skip}{\c@sym@min pt}%
- \divide\sym@skip by3
- \multiply\sym@skip by2
- \kern-\sym@skip
- \setlength{\sym@raise}{\c@sym@min pt}%
- \divide\sym@raise by2
- \raisebox{-\sym@raise}{%
- \fontsize{\c@sym@min}{0}\selectfont
- \rotatebox{\thesym@rotate}{\reflectbox{\hbox
- to\c@sym@min pt{\hss\sym@symbol\hss}}}}%
-\par\endgroup}
+ \setlength{\DCR@skip}{\c@DCR@min pt}%
+ \divide\DCR@skip by3
+ \multiply\DCR@skip by2
+ \kern-\DCR@skip
+ \setlength{\DCR@raise}{\c@DCR@min pt}%
+ \divide\DCR@raise by2
+ \raisebox{-\DCR@raise}{%
+ \fontsize{\c@DCR@min}{0}\selectfont
+ \rotatebox{\the\c@DCR@rotate}{\reflectbox{\hbox
+ to\c@DCR@min pt{\hss\DCR@symbol\hss}}}}%
+ \endgroup}
% \end{macrocode}
-% \end{macro}
+% \end{CPK@macro}
+% \iffalse
+%</package>
+% \fi
% \appendix
-% \newgeometry{left=3cm}
+% \newgeometry{left=3cm}
% \clearpage
-% \section{The \LaTeX{} Project Public License}\label{LPPL:LPPL}
-% \begin{quotation}\small\noindent
+% \section{The \LaTeX{} Project Public License (v\thinspace{}1.3c)}\label{LPPL}
+% \begin{quotation}\small\sffamily\parindent0pt
+% \parskip.5\baselineskip
+% \color{DarkBlue}\noindent
% Everyone is allowed to distribute verbatim copies of this
-% license document, but modification of it is not allowed.
+% license document, but modification of it is not allowed.\par
% \end{quotation}
-% \subsection{Preamble}\label{LPPL:Preamble}
-% The \LaTeX{} Project Public License (\textsc{lppl})
+% \subsection{Preamble}\label{Preamble}
+% The \LaTeX{} Project Public License ({\smaller LPPL})
% is the primary license under which the \LaTeX{} kernel and the
% base \LaTeX{} packages are distributed.\par
% You may use this license for any work of which you hold the
@@ -453,8 +882,8 @@ url = {http://mirror.ctan.org/macros/generic/misc/swrule.sty}
% 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{}.\par
-% The section \emph{Whether and How to Distribute Works under This
-% License}, below, gives instructions, examples, and
+% 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.\par
% This license gives conditions under which a work may be
@@ -466,42 +895,41 @@ url = {http://mirror.ctan.org/macros/generic/misc/swrule.sty}
% 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
-% \url{cfgguide.tex} and \url{modguide.tex} in the base \LaTeX{}
+% {\ttfamily{}cfgguide.tex} and {\ttfamily{}modguide.tex} in the base \LaTeX{}
% distribution for suggestions.\par
-% \subsection{Definitions}\label{LPPL:Definitions}
+% \subsection{Definitions}\label{Definitions}
% In this license document the following terms are used:\par
-% \begingroup\raggedright
-% \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
+% \begin{description}[style=unboxed]
+% \item[Work\thinspace:]Any work being distributed under this License.\par
+% \item[Derived Work\thinspace:]Any work that under any applicable law is derived from
+% the Work.\par
+% \item[Modification\thinspace:]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
+% language.\par
+% \item[Modify\thinspace:]To apply any procedure that produces a Derived Work
+% under any applicable law.\par
+% \item[Distribution\thinspace:]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
+% {\smaller FTP} or {\smaller 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
+% ({\smaller NFS}).\par
+% \item[Compiled Work\thinspace:]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.
+% the Work constitutes modification of the Work.\par
+% \item[Current Maintainer\thinspace:]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
+% law.\par
+% \item[Base Interpreter\thinspace:]A program or process that is normally needed for
% running or interpreting a part or the whole of the
% Work.\par
% A Base Interpreter may depend on external components
@@ -512,45 +940,45 @@ url = {http://mirror.ctan.org/macros/generic/misc/swrule.sty}
% 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}\endgroup
-% \subsection{Conditions on Distribution and Modification}\label{LPPL:Conditions}
+% implementing the `\TeX{} language'.\par
+% \end{description}
+% \subsection{Conditions on Distribution and Modification}\label{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
+% concerning any offers of support for the Work.\par
+% \item \label{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.
+% terms of this clause.\par
% \item You may distribute a Compiled Work that has been
% generated from a complete, unmodified copy of the Work as
-% distributed under Clause~\vref{LPPL:item:distribute} above, as
+% distributed under Clause~item~\ref{item-distribute} above 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,
+% Compiled Work directly from the Work.\par
+% \item \label{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.
+% versions of the Work.\par
% \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
+% creating a Compiled Work based on the Derived Work.\par
+% \item \label{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.
+% a component of the Work.\par
% \begin{enumerate}
% \item If a component of this Derived Work can be a direct
% replacement for a component of the Work when that
@@ -560,22 +988,22 @@ url = {http://mirror.ctan.org/macros/generic/misc/swrule.sty}
% 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.
+% interactively with that Base Interpreter.\par
% \item 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.
+% changes.\par
% \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.
+% provide such support for the Derived Work.\par
% \item You distribute at least one of the following with
-% the Derived Work:
+% the Derived Work:\par
% \begin{enumerate}
% \item A complete, unmodified copy of the Work; if your
% distribution of a modified component is made by
@@ -584,50 +1012,50 @@ url = {http://mirror.ctan.org/macros/generic/misc/swrule.sty}
% 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;
+% modified component;\par
% \item Information that is sufficient to obtain a
-% complete, unmodified copy of the Work.
+% complete, unmodified copy of the Work.\par
% \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~\vref{LPPL:item:conditions}, above, are met
-% with regard to the Derived Work.
+% conditions of Clause~item~\ref{item-conditions} above, above, are met
+% with regard to the Derived Work.\par
% \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~\vref{LPPL:item:currmaint}, above.
+% by the Current Maintainer under Clause~item~\ref{item-currmaint} above, above.\par
% \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.
+% process.\par
% \item % \begin{enumerate}
% \item A Derived Work may be distributed under a different
% license provided that license itself honors the
-% conditions listed in Clause~\vref{LPPL:item:conditions} above, in
+% conditions listed in Clause~item~\ref{item-conditions} in the list on p.\thinspace\pageref{item-conditions} above, in
% regard to the Work, though it does not have to honor the
-% rest of the conditions in this license.
+% rest of the conditions in this license.\par
% \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~\vref{LPPL:item:conditions} above, concerning
-% changes from the Work.
+% Clause~item~\ref{item-conditions} in the list on p.\thinspace\pageref{item-conditions} above, concerning
+% changes from the Work.\par
% \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.
+% means.\par
% \item Nothing in this license is intended to, or may be used
% to, prevent complete compliance by all parties with all
-% applicable laws.
+% applicable laws.\par
% \end{enumerate}
-% \subsection{No Warranty}\label{LPPL:Warranty}
+% \subsection{No Warranty}\label{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
@@ -649,7 +1077,7 @@ url = {http://mirror.ctan.org/macros/generic/misc/swrule.sty}
% 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.\par
-% \subsection{Maintenance of The Work}\label{LPPL:Maintenance}
+% \subsection{Maintenance of The Work}\label{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
@@ -675,80 +1103,80 @@ url = {http://mirror.ctan.org/macros/generic/misc/swrule.sty}
% \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.
+% through the means of an Internet or similar search.\par
% \item If this search is successful, then enquire whether the
-% Work is still maintained.
+% Work is still maintained.\par
% \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
+% month.\par
+% \item \label{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 \url{news:comp.text.tex}.)
+% posting to \url{news:comp.text.tex}.)\par
% \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
+% effect immediately upon announcement.\par
+% \item \label{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.
+% announcement.\par
% \end{enumerate}
-% \item \label{LPPL:item:change}If you make an `intention announcement'
-% as described in~\vref{LPPL:item:intention} above and after three
+% \item \label{item-change}If you make an `intention announcement'
+% as described in~item~\ref{item-intention} in the list on p.\thinspace\pageref{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.
+% name you as the (new) Current Maintainer.\par
% \item If the previously unreachable Current Maintainer becomes
% reachable once more within three months of a change
-% completed under the terms of~\vref{LPPL:item:announce}
-% or~\vref{LPPL:item:change}, then that
+% completed under the terms of~item~\ref{item-announce} in the list on p.\thinspace\pageref{item-announce}
+% or~item~\ref{item-change} above, then that
% Current
% Maintainer must become or remain the Current Maintainer upon
% request provided they then update their communication data
-% within one month.
+% within one month.\par
% \end{enumerate}
% A change in the Current Maintainer does not, of itself,
% alter the fact that the Work is distributed under the
-% \textsc{lppl} license.\par
+% {\smaller LPPL} license.\par
% 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~\vref{LPPL:item:intention}
+% community as in~item~\ref{item-intention} in the list on p.\thinspace\pageref{item-intention}
% above.\par
% \subsection{Whether and How to Distribute Works under This
-% License}\label{LPPL:Distribute}
+% License}\label{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.\par
-% \subsubsection{Choosing This License or Another License}\label{LPPL:Choosing}
+% \subsubsection{Choosing This License or Another License}\label{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 \textsc{lppl} or otherwise
+% should not refer to the {\smaller LPPL} or otherwise
% give the impression that your work is distributed under the
-% \textsc{lppl}.\par
-% The document \url{modguide.tex} in the base \LaTeX{}
+% {\smaller LPPL}.\par
+% The document {\ttfamily{}modguide.tex} 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.
+% \LaTeX{} under the {\smaller GNU} General Public
+% License ({\smaller GPL}) was considered inappropriate.
% Even if your work is unrelated to \LaTeX{}, the discussion in
-% \url{modguide.tex} may still be
+% {\ttfamily{}modguide.tex} may still be
% relevant, and authors intending to distribute their works
% under any license are encouraged to read it.\par
% \subsubsection{A Recommendation on Modification Without
-% Distribution}\label{LPPL:WithoutDistribution}
+% Distribution}\label{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
@@ -763,7 +1191,7 @@ url = {http://mirror.ctan.org/macros/generic/misc/swrule.sty}
% 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.\par
-% \subsubsection{How to Use This License}\label{LPPL:HowTo}
+% \subsubsection{How to Use This License}\label{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
@@ -771,7 +1199,10 @@ url = {http://mirror.ctan.org/macros/generic/misc/swrule.sty}
% distribution and/or modification of that component is
% constrained by the conditions in this license.\par
% Here is an example of such a notice and statement:\par
-% \begin{verbatim}
+% \iffalse
+%<*ignore>
+% \fi
+\begin{lstlisting}[language={[LaTeX]TeX}]
%%% pig.dtx
%%% Copyright 2005 M. Y. Name
%%
@@ -789,27 +1220,30 @@ url = {http://mirror.ctan.org/macros/generic/misc/swrule.sty}
%%
%% This work consists of the files pig.dtx and pig.ins
%% and the derived file pig.sty.
-% \end{verbatim}
+\end{lstlisting}
+% \iffalse
+%</ignore>
+% \fi
% 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
-% \url{pig.dtx}, \url{pig.ins}, and \url{pig.sty} (the last being generated
-% from \url{pig.dtx} using \url{pig.ins}), the `Base
+% {\ttfamily{}pig.dtx}, {\ttfamily{}pig.ins}, and {\ttfamily{}pig.sty} (the last being generated
+% from {\ttfamily{}pig.dtx} using {\ttfamily{}pig.ins}), the `Base
% Interpreter' referring to any
% `\LaTeX{}-Format', and both `Copyright
% Holder' and `Current Maintainer'
% referring to the person
-% M.~Y.~Name\index{M.~Y.~Name}.\par
+% M.~Y.~Name\index{!}.\par
% If you do not want the Maintenance section of
-% \textsc{lppl} to apply to your Work, change
+% {\smaller 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.\par
-% \subsubsection{Derived Works That Are Not Replacements}\label{LPPL:NotReplacements}
-% Several clauses of the \textsc{lppl} specify
+% \subsubsection{Derived Works That Are Not Replacements}\label{NotReplacements}
+% Several clauses of the {\smaller 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
@@ -817,22 +1251,28 @@ url = {http://mirror.ctan.org/macros/generic/misc/swrule.sty}
% the case (e.g., if a few lines of code are reused for a
% completely different task), then clauses 6b and 6d shall not
% apply.\par
-% \subsubsection{Important Recommendations}\label{LPPL:Recommendations}
-% \paragraph{Defining What Constitutes the Work}
-% The \textsc{lppl} requires that distributions
+% \subsubsection{Important Recommendations}\label{Recommendations}
+% \paragraph[Defining What Constitutes the Work]{Defining What Constitutes the Work :}
+% The {\smaller 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:\par
-% \begin{verbatim}
+% \iffalse
+%<*ignore>
+% \fi
+\begin{lstlisting}[language={[LaTeX]TeX}]
%% This work consists of all files listed in manifest.txt.
-% \end{verbatim}
+\end{lstlisting}
+% \iffalse
+%</ignore>
+% \fi
% 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.\par
% \Finale
-\endinput
+
diff --git a/Master/texmf-dist/source/latex/decorule/decorule.ins b/Master/texmf-dist/source/latex/decorule/decorule.ins
index b6080f87537..90332568282 100644
--- a/Master/texmf-dist/source/latex/decorule/decorule.ins
+++ b/Master/texmf-dist/source/latex/decorule/decorule.ins
@@ -1,5 +1,7 @@
-%%% decorule.ins
-%% Copyright © 2010-2011 by Peter Flynn <peter@silmaril.ie>
+% Transformed from decorule.xml by ClassPack db2dtx.xsl
+% version 1.19 (2020-05-19) on Thursday 21 May 2020 at 11:04:52
+%
+% decorule.ins is copyright © 2010-2020 by Peter Flynn <peter@silmaril.ie>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -11,26 +13,44 @@
% 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'.
+% This work has the LPPL maintenance status ‘maintained’.
%
% The current maintainer of this work is Peter Flynn <peter@silmaril.ie>
%
-% This work consists of the files decorule.dtx and decorule.ins
-% and the derived file decorule.sty.
+% This work consists of the files decorule.dtx and decorule.ins,
+% the derived file
+% and any other ancillary files listed in the MANIFEST.
%
\input docstrip.tex
\keepsilent
\usedir{tex/latex/decorule}
\preamble
+
+This is a generated file.
+
+Copyright © 2010 by Peter Flynn
+
This file was generated from an XML master source.
Amendments and corrections should be notified to the maintiner
for inclusion in future versions.
+
\endpreamble
-\generate{\file{decorule.sty}{\from{decorule.dtx}{package}}}
+\generate{\file{decorule.sty}{\from{decorule.dtx}{package}}
+}
\obeyspaces
\Msg{********************************************************}
\Msg{** **}
-\Msg{** Read the documentation before using this package. **}
+\Msg{** Read the documentation before using this package. **}
+\Msg{** **}
+\Msg{** To finish the installation you have to move the **}
+\Msg{** following file into a directory searched by TeX: **}
+\Msg{** **}
+\Msg{** **}
+\Msg{** **}
+\Msg{** To produce the documentation run the file **}
+\Msg{** decorule.dtx through pdfLaTeX and BiBTeX **}
+\Msg{** **}
+\Msg{** Happy LaTeXing! **}
\Msg{** **}
\Msg{********************************************************}
\endbatchfile
diff --git a/Master/texmf-dist/source/latex/denisbdoc/denisbdoc.dtx b/Master/texmf-dist/source/latex/denisbdoc/denisbdoc.dtx
index 0607fdcc228..af502881fe8 100644
--- a/Master/texmf-dist/source/latex/denisbdoc/denisbdoc.dtx
+++ b/Master/texmf-dist/source/latex/denisbdoc/denisbdoc.dtx
@@ -3,11 +3,11 @@
\iffalse
%</internal>
%<*readme>
-denisbdoc - A personal package for documenting classes and packages, v. 0.8
-===========================================================================
+denisbdoc - A personal package for documenting classes and packages, v. 0.9.1
+=============================================================================
**The sole purpose of this (quick 'n dirty) `denisbdoc` package is for
-documenting the classes written by its author (Denis Bitouz'e).**
+documenting the classes written by their author (Denis Bitouzé).**
The class is supplied in `.dtx` format. If you want to unpack the `.dtx`
yourself, running:
@@ -31,9 +31,9 @@ This package is currently not documented.
\preamble
-----------------------------------------------------------------------------
denisbdoc --- A personal dirty package for documenting personal classes,
- version 0.8
+ version 0.9.1
-Maintained by Denis Bitouz'e
+Maintained by Denis Bitouzé
E-mail: denis.bitouze@univ-littoral.fr
Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
@@ -42,7 +42,7 @@ See http://www.latex-project.org/lppl.txt
\endpreamble
\postamble
Copyright (C) 2015-2020 by
- Denis Bitouz'e <denis.bitouze@univ-littoral.fr>
+ Denis Bitouzé <denis.bitouze@univ-littoral.fr>
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -51,7 +51,7 @@ version of this license is in the file:
http://www.latex-project.org/lppl.txt
This work is "maintained" (as per LPPL maintenance status) by
- Denis Bitouz'e.
+ Denis Bitouzé.
This work consists of the file denisbdoc.dtx
denisbdoc.sty and
@@ -106,7 +106,7 @@ This work consists of the file denisbdoc.dtx
% }^^A
%}
%\author{^^A
-% Denis Bitouz'e\thanks
+% Denis Bitouzé\thanks
% {^^A
% E-mail: \href{mailto:denis.bitouze@univ-littoral.fr}
% {\texttt{denis.bitouze@univ-littoral.fr}}^^A
@@ -124,6 +124,8 @@ This work consists of the file denisbdoc.dtx
%\changes{v0.6}{2016/12/08}{Sixth CTAN version}
%\changes{v0.7}{2017/01/01}{Seventh CTAN version}
%\changes{v0.8}{2020/03/27}{Eighth CTAN version}
+%\changes{v0.9}{2020/05/31}{Nineth CTAN version}
+%\changes{v0.9.1}{2020/10/14}{Further CTAN version}
%
%\begin{abstract}
% ...
@@ -194,7 +196,7 @@ This work consists of the file denisbdoc.dtx
%
% The usual preliminaries.
% \begin{macrocode}
-\ProvidesExplPackage {denisbdoc} {2020/03/27} {0.8}
+\ProvidesExplPackage {denisbdoc} {2020/10/14} {0.9.1}
{A personal package for documenting packages}
% \end{macrocode}
%
@@ -241,9 +243,16 @@ This work consists of the file denisbdoc.dtx
% \begin{macrocode}
\sys_if_engine_pdftex:TF
{
- \RequirePackage{cmap}
+ % \RequirePackage{cmap}
\RequirePackage[T1]{fontenc}
\RequirePackage[utf8]{inputenc}
+% \end{macrocode}
+%
+% In order to get rid of the warning "PDF inclusion: multiple pdfs with page
+% group included in a single page" (see
+% \url{http://tex.stackexchange.com/q/183149/18401}).
+% \begin{macrocode}
+ \pdfsuppresswarningpagegroup=1
}{
\RequirePackage{fontspec}
}
@@ -339,14 +348,19 @@ This work consists of the file denisbdoc.dtx
% \begin{macrocode}
\let\_@@_printbibliography_ORI\printbibliography%
\renewcommand{\printbibliography}[1][]{%
- \pagestyle{biblio}%
- \_@@_printbibliography_ORI[heading=bibintoc,#1]%
- \pagestyle{ordinary}%
+ \@ifpackageloaded{setspace}{%
+ \singlespacing%
+ }{%
+ }
+ \chapter*{\bibname}%
+ \_@@_printbibliography_ORI[heading=none,#1]%
}%
}%
}%
}{%
- \RequirePackage[backend=biber,style=authortitle,autopunct=false,useprefix=true,backref,dashed=false]{biblatex}%
+ \RequirePackage[%backend=biber%
+ ,style=authortitle,dashed=false
+ ,autopunct=false,useprefix=true,backref]{biblatex}%
}%
% \end{macrocode}
%
@@ -359,8 +373,8 @@ This work consists of the file denisbdoc.dtx
% \begin{macrocode}
\RequirePackage{morewrites}%
\RequirePackage{babel}%
-% \RequirePackage[useregional]{datetime2}%
-\RequirePackage[nodayofweek]{datetime}%
+\RequirePackage[useregional]{datetime2}%
+% \RequirePackage[nodayofweek]{datetime}%
% \RequirePackage{floatrow}%
\RequirePackage{subcaption}%
%
@@ -403,7 +417,6 @@ This work consists of the file denisbdoc.dtx
}%
\@ifpackageloaded{glossaries}{%
}{%
- % \RequirePackage{glossaries}%
\RequirePackage[xindy,hyperfirst=false,toc=false]{glossaries-extra}%
\makeglossaries%
\newglossaryentry{zip}{%
@@ -416,7 +429,7 @@ This work consists of the file denisbdoc.dtx
text={zip}%
}%
\setglossarystyle{indexhypergroup}%
- \setabbreviationstyle[acronym]{long-short-sc}%
+ \setabbreviationstyle{long-short-sc}%
\newcommand*{\formatfont}[1]{\textsc{#1}}%
\glssetcategoryattribute{format}{glossnamefont}{formatfont}%
\glssetcategoryattribute{format}{font}{formatfont}%
@@ -454,7 +467,10 @@ This work consists of the file denisbdoc.dtx
% \end{macrocode}
%
% \begin{macrocode}
-\renewcommand{\acrpluralsuffix}{}
+\@ifpackageloaded{glossaries-extra}{%
+ \renewcommand*{\glsxtrabbrvpluralsuffix}{}
+}{%
+}
% \end{macrocode}
%
% % Some hacks to avoid issues of \pkg{hypdoc} reported by me at
@@ -712,30 +728,30 @@ This work consists of the file denisbdoc.dtx
}{}{\aaa}%
% \end{macrocode}
%
-% We create a boolean which tests if the letter in the navigation bar is the 1st
-% one or not (in the latter case, a newline is added).
-% \begin{macrocode}
- \newif\if@DBD@no@first@letter@
- \@DBD@no@first@letter@false
-% \end{macrocode}
-%
% \begin{macrocode}
\newcommand*{\indexheading}[2]{%
\hypertarget{#2:#1}{\textbf{#1}}%
\protected@write\@auxout{}{\string\DBD@indexgroup{#1}{#2}}%
}
+% \end{macrocode}
+%
+% We create a boolean which tests whether the letter in the navigation bar is
+% the 1st one or not (in the latter case, a newline is added).
+% \begin{macrocode}
+\newtoggle{@DBD@no@first@letter}
\newcommand*{\DBD@indexgroup}[2]{%
\csgappto{DBD@indexnavigation@#2}{%
- \if@DBD@no@first@letter@
- \,\textbar\,%
- % \\
- \else
- \noindent
- \@DBD@no@first@letter@true
- \fi
+ \iftoggle{@DBD@no@first@letter}{%
+ \,\textbar\,%
+ % \\
+ }{%
+ \toggletrue{@DBD@no@first@letter}%
+ \noindent%
+ }%
\hyperlink{#2:#1}{\textbf{#1}}%
}%
}%
+\fi
% \end{macrocode}
%
% \begin{macrocode}
@@ -901,7 +917,7 @@ This work consists of the file denisbdoc.dtx
user1,user2,user3,user4,user5,user6,hyper,style,xindy,toc,title,%
useri,userii,useriii,useriv,userv,uservi%
},%
- % Mots-clés de niveau 3 : arguments optionnels valeurs de clés dans clé=valeur
+ % Mots-clés de niveau 3 : arguments optionnels clés dans clé=valeur
morekeywords=[3]{%
listgroup,listhypergroup,%
% textrm,textit,textsf,textsl,texttt,textup,textbf,textsc,textmd,emph,%
@@ -1023,7 +1039,7 @@ This work consists of the file denisbdoc.dtx
morekeywords=[2]{%
% title,
},%
- % Mots-clés de niveau 3 : arguments optionnels valeurs de clés dans clé=valeur
+ % Mots-clés de niveau 3 : arguments optionnels clés dans clé=valeur
morekeywords=[3]{%
skipbib%
},%
@@ -1050,7 +1066,7 @@ This work consists of the file denisbdoc.dtx
morekeywords=[2]{%
colophon,
},%
- % Mots-clés de niveau 3 : arguments optionnels valeurs de clés dans clé=valeur
+ % Mots-clés de niveau 3 : arguments optionnels clés dans clé=valeur
morekeywords=[3]{%
titlestyle,titlesize,aftertitle,pagestyle,titlealign,%
parstyle,parsize,parlead,nofirstindent,nofullpage,noclrdblpg,%
@@ -1066,7 +1082,7 @@ This work consists of the file denisbdoc.dtx
{%
% Séquences de contrôles (communément appelées commandes ou macros)
moretexcs={%
- tcbset,tcbuselibrary%
+ tcbset,tcbuselibrary,tcbsetforeverylayer%
},%
% Mots-clés de niveau 1 : arguments optionnels
morekeywords={%
@@ -1075,10 +1091,11 @@ This work consists of the file denisbdoc.dtx
morekeywords=[2]{%
colback,beamer,skins,listing,only,options,and,text%
},%
- % Mots-clés de niveau 3 : arguments optionnels valeurs de clés dans clé=valeur
+ % Mots-clés de niveau 3 : arguments optionnels clés dans clé=valeur
morekeywords=[3]{%
- lightgray,red!50!white%
+ lightgray,red!50!white,autoparskip,beforeafter,skip,balanced%
},%
+ alsoletter={ \ },%
sensitive,%
}[keywords,tex,comments]%
%
@@ -1124,7 +1141,7 @@ This work consists of the file denisbdoc.dtx
morekeywords=[2]{%
lightgray,red,blue,brown,purple,magenta,green,black,cyan,yellow,%
},%
- % Mots-clés de niveau 3 : arguments optionnels valeurs de clés dans clé=valeur
+ % Mots-clés de niveau 3 : arguments optionnels clés dans clé=valeur
morekeywords=[3]{%
%
},%
@@ -1146,7 +1163,7 @@ This work consists of the file denisbdoc.dtx
breaklinks,colorlinks,bookmarks,pdfborderstyle,pdfborder,all,pdfencoding,final,%
hidelinks,linktoc,%
},%
- % Mots-clés de niveau 3 : arguments optionnels valeurs de clés dans clé=valeur
+ % Mots-clés de niveau 3 : arguments optionnels clés dans clé=valeur
morekeywords=[3]{%
unicode%
},%
@@ -1163,7 +1180,7 @@ This work consists of the file denisbdoc.dtx
laboratory,dedication,frontepigraph,keywords,subject,expression,tableofcontents,submissiondate,%
maketitle,makedisclaimer,makekeywords,makelaboratory,makeabstract,makededications,%
makefrontepigraphs,makebackcover,ordernumber,chapter*,disclaimer,newglssymbol,yadsetup,%
- comue,newcorporation%
+ comue,newcorporation,NoCaseChange%
% acknowledgements,frenchabstract,foreword,preface,caution,
},%
% Environments' names
@@ -1216,7 +1233,7 @@ This work consists of the file denisbdoc.dtx
moretexcs={% Control sequences' names
editorinchief,editor,president,classdesigner,classmaintainer,fontdesigner,%
graphicdesigner,issuesetup,journalsetup,interviewee,academicsignature,%
- subtitle,editorial,gzttableofcontents,minitoc,presidentmessage,%
+ subtitle,editorial,gzttableofcontents,gztlocaltableofcontents,minitoc,presidentmessage,%
acknowledgements,printminibios,aboutfrontcover,rubric,mathematics,%
dossier,community,interview,teaching,parity,tellme,information,%
rearviewmirror,tribute,books,email,question,smf,cad,Cad,gzt,%
@@ -1305,7 +1322,7 @@ This work consists of the file denisbdoc.dtx
% \begin{macrocode}
\lstdefinelanguage[studentreport]{TeX}[LaTeX]{TeX}{%
moretexcs={% Control sequences' names
- reportsetup,daterange,professionaladvisor,academicadvisor,companylogo%
+ reportsetup,daterange,companytutor,academictutor,companylogo%
},%
% Mandatory arguments (other than environments' names)
morekeywords={%
@@ -1314,11 +1331,11 @@ This work consists of the file denisbdoc.dtx
},%
morekeywords=[2]{% Keys of key-value lists
institute,subinstitute,subsubinstitute,year,10pt,11pt,12pt,internship,project,layout,%
- strings,pretitle,company,advisor,advisors,before~start~date,before~end~date,date,%
- logos,logosheights,,%
+ strings,pretitle,company,tutor,tutors,before~start~date,before~end~date,date,%
+ logos,logosheights,keywords,subject,%
},%
morekeywords=[3]{% Values of key-value lists
- ulco,iutlco,gte,gim,%
+ ulco,iutlco,gtelco,gimlco,%
},%
alsoletter={!-*1234560}%
}%
@@ -1404,148 +1421,6 @@ This work consists of the file denisbdoc.dtx
% % prebreak={\c_space_tl\Righttorque},
% % postbreak={\c_space_tl\Lefttorque}
% }%
-\lstdefinestyle{pre-dbtex}{%
- escapechar=",
- language=[LaTeX]TeX,
- alsolanguage=[extLaTeX]TeX,
- % alsolanguage=[glossaries]TeX,
- % alsolanguage=[biblatex]TeX,
- alsolanguage=[csquotes]TeX,
- % alsolanguage=[tcolorbox]TeX,
- % alsolanguage=[listings]TeX,
- % alsolanguage=[xcolor]TeX,
- % alsolanguage=[hyperref]TeX,
- texcsstyle=*\color{texcs},
- breaklines=true,
- basicstyle=\normalfont\ttfamily,
- commentstyle=\color{comment}\itshape,
- directivestyle={\color{directive}},
- keywordstyle={\color{red}},
- keywordstyle={[1]\color{environment}},
- keywordstyle={[2]\color{key}},
- keywordstyle={[3]\color{value}},
- keywordstyle={[4]\color{keyword4}},
- keywordstyle={[5]\color{keyword5}},
- moredelim=*[s][\color{math}\ttfamily]{\\[}{\\]},
- moredelim=*[s][\color{math}\ttfamily]{$}{$},
- stringstyle=\color{string},
- columns=flexible,
- keepspaces,
- numberstyle=\small,
- inputencoding=utf8/latin1,
- aboveskip=\c_@@_listings_aboveskip_skip,
- belowskip=\c_@@_listings_belowskip_skip
-}%
-\bool_if:nT {\g_@@_yad_bool} {%
- \lstdefinestyle{dbtex}{%
- style=pre-dbtex,%
- alsolanguage=[yad]TeX,%
- alsolanguage=[colophon]TeX,%
- moretexcs={printbibliography,autocite},%
- }
-}
-\bool_if:nT {\g_@@_gzt_bool} {%
- \lstdefinestyle{dbtex}{%
- style=pre-dbtex,%
- alsolanguage=[gzt]TeX,%
- }
-}
-\bool_if:nT {\g_@@_nwejm_bool} {%
- \lstdefinestyle{dbtex}{%
- style=pre-dbtex,%
- alsolanguage=[nwejm]TeX,%
- }
-}
-\bool_if:nT {\g_@@_studentreport_bool} {%
- \lstdefinestyle{dbtex}{%
- style=pre-dbtex,%
- alsolanguage=[studentreport]TeX,%
- }
-}
-\lstset{style=dbtex}
-\sys_if_engine_pdftex:TF
-{
- \ExplSyntaxOff
- \lstMakeShortInline[style=dbtex]|
- \ExplSyntaxOn
-}{
- \lstMakeShortInline[style=dbtex]×
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\tcbset{dbtcb/.style={%
- breakable,
- fonttitle=\bfseries,
- enlarge~top~by=1mm,
- separator~sign~dash,
- label~separator=-,
- before~title={%
- \hypersetup{hidelinks}%
- \tcbset{%
- color~definition=white,
- color~hyperlink=white,
- }%
- }%
- }%
-}%
-%
-\tcbset{%
- doc~head={%
- % boxsep=4pt,arc=4pt,boxrule=0.6pt,%
- % frame~style=fill,%
- % colframe=red!50!black,%
- interior~style={%
- fill,%
- color=yellow!10!white,%
- }%
- }%
-}
-\tcbset{%
- /tcb/doclang/environment~content=contenu~de~l'environnement,
- /tcb/doclang/color=~(couleur),
- /tcb/doclang/colors=Couleurs,
- /tcb/doclang/environments=Environnements,
- /tcb/doclang/keys=Clés,
- /tcb/doclang/values=Valeurs,
- /tcb/doclang/pageshort=p.,
- /tcb/documentation~listing~style=dbtex,
- /tcb/color~command=texcs,
- /tcb/color~environment=environment,
- /tcb/color~key=key,
- /tcb/color~value=value,
- % index~format=pgfchapter,
- index~format=off,
- index~colorize,
- index~annotate=false,
- enhanced,
- listing~style=dbtex,
- every~box/.style={documentation~listing~style=dbtex},
-% index~actual={},
-% doc~left~indent=-15mm,
-% doc~right~indent=-15mm+2em
- codes/.style={%
- listing~only,
- enlarge~top~by=\medskipamount,
- colframe=ExampleFrame,
- colback=ExampleBack,
- fonttitle=\bfseries,
- fontupper=\small,
- split=0.5,
- enhanced,
- breakable,
- listing~style=dbtex,
- }%
-}%
-\tcbset{samples/.style={%
- codes,
- % listing~options={rangebeginprefix=\\,rangeendsuffix=\}}
- }%
-}%
-\renewcommand*{\tcbdocnew}[1]{\scriptsize\sffamily\textcolor{green!50!black}{\bfseries
-Nouv.~:}~#1}
-\renewcommand*{\tcbdocupdated}[1]{\scriptsize\sffamily\textcolor{blue!75!black}{\bfseries
-\textsc{m.-à-j.}~:}~#1}
% \end{macrocode}
%
% Suppression du gras dans la commande ×\docAuxCommand× :
@@ -1731,7 +1606,7 @@ Nouv.~:}~#1}
%
% This saves the url with all characters catcode other:
% \begin{macrocode}
-\tl_const:Nx \c_@@_standard_url_tl { \tl_to_str:n { http://ctan.org/pkg/ } }
+\tl_const:Nx \c_@@_standard_url_tl { \tl_to_str:n { https://ctan.org/pkg/ } }
% \end{macrocode}
% Separate formatting:
% #1: package or class name
@@ -2177,13 +2052,6 @@ Nouv.~:}~#1}
}
% \end{macrocode}
%
-% In order to get rid of the warning "PDF inclusion: multiple pdfs with page
-% group included in a single page" (see
-% \url{http://tex.stackexchange.com/q/183149/18401}).
-% \begin{macrocode}
-\pdfsuppresswarningpagegroup=1
-% \end{macrocode}
-%
% We want to make the angle brackets generated by ×\meta× to be copied and
% pasted as they are, and not replaced by "h" and "i"
% (cf. \url{https://tex.stackexchange.com/q/18146/18401}).
@@ -2217,6 +2085,12 @@ Nouv.~:}~#1}
drop~lifted~shadow,
#1%
}
+\NewTCBListing{preamblecode*}{ !O{} }{%
+ codes,%
+ enlarge~top~by=\c_zero_dim,
+ drop~lifted~shadow,
+ #1%
+}
\NewTCBListing{bodycode}{ !O{} }{%
codes,%
#1%
@@ -2282,13 +2156,11 @@ Nouv.~:}~#1}
colframe=red!75!black,
dbtcb
}{wa}
-%
\newtcbtheorem[list~inside=dbexamplelist,number~within=\g_@@_number_within_tl,crefname={exemple}{exemples}]{dbexample}{Exemple}{%
colback=lime!5!white,
colframe=lime!75!black,
- dbtcb
+ dbtcb,
}{ex}
-%
\newtcbtheorem[list~inside=dbremarklist,number~within=\g_@@_number_within_tl,crefname={remarque}{remarques}]{dbremark}{Remarque}{%
colback=cyan!5!white,
colframe=cyan!75!black,
@@ -2297,7 +2169,7 @@ Nouv.~:}~#1}
\newtcbtheorem[list~inside=dbfaqlist,number~within=\g_@@_number_within_tl,crefname={question}{questions}]{dbfaq}{Question}{%
colback=lightgray!5!white,
colframe=lightgray!75!black,
- fontupper=\itshape,
+ % fontupper=\itshape,
dbtcb
}{faq}
\newtcbtheorem[list~inside=dbtabularlist,number~within=\g_@@_number_within_tl,crefname={tableau}{tableaux}]{dbtab}{Tableau}{%
@@ -2476,7 +2348,6 @@ Nouv.~:}~#1}
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
%
% \subsection{\Class{nwejm}}
%
@@ -2512,8 +2383,194 @@ Nouv.~:}~#1}
% \end{macrocode}
% \end{macro}
% \end{macro}
+%
+% \subsection{\Class{studentreport}}
+%
+% \begin{macrocode}
+\tl_const:Nn \c_@@_studentreport_class_name_tl {studentreport}
+% \end{macrocode}
+%
+% \begin{macro}{\studentreportcl}
+% \begin{macrocode}
+\ProvideDocumentCommand \studentreportcl { }
+{%
+ \Class{\c_@@_studentreport_class_name_tl}
+}
+\NewDocumentCommand \studentreportauthor { }
+{%
+ \class[\c_@@_standard_url_tl\c_@@_studentreport_class_name_tl]{\c_@@_studentreportauthor_class_name_tl}
+}
+\NewDocumentCommand \studentreportauthorcl { }
+{%
+ \Class[\c_@@_standard_url_tl\c_@@_studentreport_class_name_tl]{\c_@@_studentreportauthor_class_name_tl}
+}
+% \end{macrocode}
% \end{macro}
%
+% \begin{macrocode}
+\lstdefinestyle{pre-dbtex}{%
+ escapechar=",%"
+ language=[LaTeX]TeX,
+ alsolanguage=[extLaTeX]TeX,
+ % alsolanguage=[glossaries]TeX,
+ % alsolanguage=[biblatex]TeX,
+ alsolanguage=[csquotes]TeX,
+ % alsolanguage=[tcolorbox]TeX,
+ % alsolanguage=[listings]TeX,
+ % alsolanguage=[xcolor]TeX,
+ % alsolanguage=[hyperref]TeX,
+ texcsstyle=*\color{texcs},
+ breaklines=true,
+ basicstyle=\normalfont\ttfamily,
+ commentstyle=\color{comment}\itshape,
+ directivestyle={\color{directive}},
+ keywordstyle={\color{red}},
+ keywordstyle={[1]\color{environment}},
+ keywordstyle={[2]\color{key}},
+ keywordstyle={[3]\color{value}},
+ keywordstyle={[4]\color{keyword4}},
+ keywordstyle={[5]\color{keyword5}},
+ moredelim=*[s][\color{math}\ttfamily]{\\[}{\\]},
+ moredelim=*[s][\color{math}\ttfamily]{$}{$},
+ stringstyle=\color{string},
+ columns=flexible,
+ keepspaces,
+ numberstyle=\small,
+ inputencoding=utf8/latin1,
+ aboveskip=\c_@@_listings_aboveskip_skip,
+ belowskip=\c_@@_listings_belowskip_skip
+}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\tl_gclear:N \g_tmpa_tl
+\bool_if:nT {\g_@@_yad_bool} {%
+ \lstdefinestyle{dbtex}{%
+ style=pre-dbtex,%
+ alsolanguage=[yad]TeX,%
+ alsolanguage=[colophon]TeX,%
+ moretexcs={printbibliography,autocite},%
+ morekeywords=[2]{%
+ colback,refsegment%
+ },%
+ morekeywords=[2]{%
+ red,white%
+ },%
+ }%
+ \tl_gset:Nx \g_tmpa_tl {\c_@@_yat_class_name_tl}
+}
+\bool_if:nT {\g_@@_gzt_bool} {%
+ \lstdefinestyle{dbtex}{%
+ style=pre-dbtex,%
+ alsolanguage=[gzt]TeX,%
+ }%
+ \tl_gset:Nx \g_tmpa_tl {\c_@@_gzt_class_name_tl}
+}
+\bool_if:nT {\g_@@_nwejm_bool} {%
+ \lstdefinestyle{dbtex}{%
+ style=pre-dbtex,%
+ alsolanguage=[nwejm]TeX,%
+ }%
+ \tl_gset:Nx \g_tmpa_tl {\c_@@_nwejm_class_name_tl}
+}
+\bool_if:nT {\g_@@_studentreport_bool} {%
+ \lstdefinestyle{dbtex}{%
+ style=pre-dbtex,%
+ alsolanguage=[studentreport]TeX,%
+ }%
+ \tl_gset:Nx \g_tmpa_tl {\c_@@_studentreport_class_name_tl}
+}
+\NewDocumentCommand{\currentclass}{}{\g_tmpa_tl}
+\NewExpandableDocumentCommand{\currenturl}{}{\c_@@_standard_url_tl\g_tmpa_tl}
+\NewDocumentCommand{\thisclass}{}{\class{\g_tmpa_tl}}
+\NewDocumentCommand{\Thisclass}{}{\Class{\g_tmpa_tl}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\tcbset{dbtcb/.style={%
+ breakable,
+ fonttitle=\bfseries,
+ enlarge~top~by=1mm,
+ separator~sign~dash,
+ label~separator=-,
+ before~title={%
+ \hypersetup{hidelinks}%
+ \tcbset{%
+ color~definition=white,
+ color~hyperlink=white,
+ }%
+ }%
+ }%
+}%
+%
+\tcbset{%
+ doc~head={%
+ % boxsep=4pt,arc=4pt,boxrule=0.6pt,%
+ % frame~style=fill,%
+ % colframe=red!50!black,%
+ interior~style={%
+ fill,%
+ color=yellow!10!white,%
+ }%
+ }%
+}
+\tcbset{%
+ /tcb/doclang/environment~content=contenu~de~l'environnement,
+ /tcb/doclang/color=~(couleur),
+ /tcb/doclang/colors=Couleurs,
+ /tcb/doclang/environments=Environnements,
+ /tcb/doclang/keys=Clés,
+ /tcb/doclang/values=Valeurs,
+ /tcb/doclang/pageshort=p.,
+ /tcb/documentation~listing~style=dbtex,
+ /tcb/color~command=texcs,
+ /tcb/color~environment=environment,
+ /tcb/color~key=key,
+ /tcb/color~value=value,
+ % index~format=pgfchapter,
+ index~format=off,
+ index~colorize,
+ index~annotate=false,
+ enhanced,
+ listing~style=dbtex,
+ every~box/.style={documentation~listing~style=dbtex},
+% index~actual={},
+% doc~left~indent=-15mm,
+% doc~right~indent=-15mm+2em
+ codes/.style={%
+ listing~only,
+ enlarge~top~by=\medskipamount,
+ colframe=ExampleFrame,
+ colback=ExampleBack,
+ fonttitle=\bfseries,
+ fontupper=\small,
+ split=0.5,
+ enhanced,
+ breakable,
+ listing~style=dbtex,
+ }%
+}%
+\tcbset{samples/.style={%
+ codes,
+ % listing~options={rangebeginprefix=\\,rangeendsuffix=\}}
+ }%
+}%
+\renewcommand*{\tcbdocnew}[1]{\scriptsize\sffamily\textcolor{green!50!black}{\bfseries
+Nouv.~:}~#1}
+\renewcommand*{\tcbdocupdated}[1]{\scriptsize\sffamily\textcolor{blue!75!black}{\bfseries
+\textsc{m.-à-j.}~:}~#1}
+%
+\lstset{style=dbtex}
+\sys_if_engine_pdftex:TF
+{
+ \ExplSyntaxOff
+ \lstMakeShortInline[style=dbtex]|
+ \ExplSyntaxOn
+}{
+ \lstMakeShortInline[style=dbtex]×
+}
+% \end{macrocode}
+%
% We PDFdisable some commands in order to avoid troubles in bookmarks.
% \begin{macrocode}
\pdfstringdefDisableCommands{%
diff --git a/Master/texmf-dist/source/latex/denisbdoc/denisbdoc.ins b/Master/texmf-dist/source/latex/denisbdoc/denisbdoc.ins
deleted file mode 100644
index f8f5570c513..00000000000
--- a/Master/texmf-dist/source/latex/denisbdoc/denisbdoc.ins
+++ /dev/null
@@ -1,41 +0,0 @@
-\input l3docstrip.tex
-\askforoverwritefalse
-\preamble
------------------------------------------------------------------------------
-denisbdoc --- A personal dirty package for documenting personal classes,
- version 0.8
-
-Maintained by Denis Bitouz'e
-E-mail: denis.bitouze@univ-littoral.fr
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
------------------------------------------------------------------------------
-
-\endpreamble
-\postamble
-Copyright (C) 2015-2020 by
- Denis Bitouz'e <denis.bitouze@univ-littoral.fr>
-
-It may be distributed and/or modified under the conditions of
-the LaTeX Project Public License (LPPL), either version 1.3c of
-this license or (at your option) any later version. The latest
-version of this license is in the file:
- http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
- Denis Bitouz'e.
-
-This work consists of the file denisbdoc.dtx
- denisbdoc.sty and
- denisbdoc.ins.
-\endpostamble
-\usedir{tex/latex/denisbdoc}
-\generate{
- \file{\jobname.sty}{\from{\jobname.dtx}{package}}
-}
-\nopreamble\nopostamble
-\generate{
- \file{\jobname.xdy}{\from{\jobname.dtx}{xindy-style}}
- \file{\jobname-chng.xdy}{\from{\jobname.dtx}{xindy-style-chng}}
-}
-\endbatchfile
diff --git a/Master/texmf-dist/source/latex/doclicense/doclicense.dtx b/Master/texmf-dist/source/latex/doclicense/doclicense.dtx
index df2b141bf11..75e34f64a82 100644
--- a/Master/texmf-dist/source/latex/doclicense/doclicense.dtx
+++ b/Master/texmf-dist/source/latex/doclicense/doclicense.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2015-2019 by Robin Schneider <ypid@riseup.net>
+% Copyright (C) 2015-2020 by Robin Schneider <ypid@riseup.net>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -27,7 +27,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1998/12/01]
%<package>\ProvidesPackage{doclicense}
%<*package>
- [2019/06/05 v1.10.0 Support for putting documents under a license]
+ [2020/09/25 v2.2.1 Support for putting documents under a license]
%</package>
%
%<*driver>
@@ -40,7 +40,7 @@
\newcommand{\PackageName}{\PrintPackage{doclicense}}
\newcommand{\PrintPackage}[1]{\textsf{#1}}
\newcommand{\PrintOptionF}[1]{\emph{#1}} %% ^^A This macro is used for
-%% ^^A explaining any parameter when they first come up in the documentation.
+%% ^^A explaining any parameter when they first come up in the manual.
\newcommand{\DescribePara}[1]{\marginpar{\raggedleft\strut\MacroFont\string#1}}
\usepackage[
hyphens,
@@ -51,15 +51,18 @@
babel,
csquotes,
xcolor,
- hyperxmp,
hypdoc,
nameref,
- xspace,
eqlist,
}
+\usepackage[iso]{isodate}
%% ^^A https://tex.stackexchange.com/a/95893/32320
\setlength\IndexMin{100pt}
\usepackage[
+ type={CC},
+ modifier={by-sa},
+ version={4.0},
+ % imagemodifier={-80x15},% chktex 29
hyphenation={RaggedRight},
]{doclicense}
\GetFileInfo{doclicense.dtx}
@@ -73,10 +76,11 @@
}
\title{The \PackageName{} package\thanks{This document
-corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
+corresponds to \PackageName\nobreakspace\fileversion, dated \printdateTeX{\filedate}.}}
+
\author{\PackageAuthor\\
\texttt{\href{mailto:\PackageAuthorEmail?subject=LaTeX package doclicense%
- \&body=Dear Robin Schneider,}%
+ \&body=Hey Robin,}%
{\PackageAuthorEmail}%
}%
}
@@ -111,15 +115,15 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
% Grave accent \` Left brace \{ Vertical bar \|
% Right brace \} Tilde \~}
%
-% \changes{0.07}{2015/02/05}{Initial version}
+% \changes{0.07}{2015/02/05}{Initial version.}
% \changes{0.08}{2015/02/06}{Added support for CC-zero and CC-pd and small improvements}
% \changes{0.09}{2015/02/07}{Added list of supported licenses to docu and added option imagemodifier.
-% Also renamed macro \cmd{\doclicenseLicense} to \cmd{\doclicenseThis}}
-% \changes{0.10}{2015/02/13}{Added support for hyperxmp}
-% \changes{1.0}{2015/03/30}{Removed space before quotes (Example: \enquote{CC } $\rightarrow$ \enquote{CC})}
-% \changes{1.1}{2015/04/06}{Added support for Creative Commons 4.0 and added \cmd{\doclicenseImageFileName}}
+% Also renamed macro \cmd{\doclicenseLicense} to \cmd{\doclicenseThis}.}
+% \changes{0.10}{2015/02/13}{Added support for hyperxmp.}
+% \changes{1.0}{2015/03/30}{Removed space before quotes (Example: \enquote{CC } $\rightarrow$ \enquote{CC}).}
+% \changes{1.1}{2015/04/06}{Added support for Creative Commons 4.0 and added \cmd{\doclicenseImageFileName}.}
% \changes{1.2}{2015/04/06}{Allow \cmd{\doclicenseModifier} to be used with hyperref. Fixed \cmd{\doclicenseIcon} macro, added missing image and wrote test framework. Added notes about how to add translations. Added Spanish translation.}
-% \changes{1.4.0}{2015/12/13}{Added \cmd{\doclicensePlainFullText} and \cmd{\doclicenseFullText} macros Thanks to \href{https://github.com/siefkenj}{siefkenj} for the help.}
+% \changes{1.4.0}{2015/12/13}{Added \cmd{\doclicensePlainFullText} and \cmd{\doclicenseFullText} macros. Thanks to \href{https://github.com/siefkenj}{siefkenj} for the help.}
% \changes{1.4.1}{2016/04/10}{Translation fixes for: fr, en-gb. Included missing CC-by-nc-nd icon (US dollar).}
% \changes{1.5.0}{2016/04/24}{Allow to change the way text is typeset by \cmd{\doclicenseThis}.}
% \changes{1.6.0}{2017/10/07}{Added Russian and Italian translation. Added `imageposition` and `imagedistance` parameters.}
@@ -128,6 +132,15 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
% \changes{1.8.0}{2018/06/10}{Added Polish translation.}
% \changes{1.9.0}{2019/04/07}{Added Catalan, Galician, Chinese and Portuguese translation. Detect and give hint when enquote macro is already defined. Fix LaTeX Error: Too deeply nested.}
% \changes{1.10.0}{2019/06/05}{Added Brazilian translation. Update Chinese and Portuguese translation. Do not use enumitem for list label customization (beamer compatibility).}
+% \changes{1.10.1}{2020/04/12}{Fix image for CC-BY-NC EU. Fix URL for CC-PDDC. Improve wording for catalan language.}
+% \changes{2.0.0}{2020/05/27}{Add 80x15 version of CC images which can be used with the imagemodifier option. Fix slight color offset for all CC images caused by bad image conversion. Thanks to rodrigoalcarazdelaosa for reporting. Fix \cmd{\doclicenseThis} support for twocolumn layouts. Thanks to Nao Pross. Soft require package options "type", "modifier" and "version" now. Defaults are deprecated. This will become a package error in an upcoming major version of the package, with the earliest release in 2021-07 to give people time to migrate. Remove Creative Commons PD which has been replaced by CC-zero as of 2010-10-11. Update example license used for examples in manual to CC-BY-SA-4.0.}
+% \changes{2.0.1}{2020/06/26}{Fix backwards compatibility by still accepting imagemodifier={-eu} and imagemodifier={-us}. Thanks to Jürgen Spitzmüller for reporting. Fix ability to modify currency of \cmd{\doclicenseIcon} macro using imagemodifier to Japan currency JP without breaking \cmd{\doclicenseImage}.}
+% \changes{2.1.0}{2020/07/26}{Fix regression: Proper language default image variants (Euro variants for example) was broken and the US variant was always used. This bug was introduced in v2.0.0. Documentation fixes. Added Marathi translation.}
+% \changes{2.2.0}{2020/09/18}{Add Japanese and Bulgarian translation. Add hint how to use Chinese to docs. Load hyperxmp by default when it is installed. Before, doclicense just suggested to load it and made use of the package when the user did.}
+% \changes{2.2.1}{2020/09/25}{Fix compatibility issue with newer versions of hyperxmp (bug confirmed with Tex Live 2020) resulting in an compile error by loading hyperxmp and hyperref in the order the packages expect it.}
+%
+%
+
%
%% ^^A nag warned about the center environment and it really messes up spacing.
%
@@ -157,44 +170,39 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
% \tableofcontents
%
% \section{Introduction}
-% The \PrintPackage{doclicense} package allows you to put your document under a
+% The \PackageName{} package allows you to put your document under a
% license and include a link to read about the license or include an icon or
% image of the license. Currently, only \doclicenseLongType is supported but this
% package is designed to handle all kinds of licenses. See \nameref{sec:contributing}.
%
% \section{Usage}
-% Just load the package(s) placing
-% \begin{quote}
-% |\usepackage{| \\
-% |% babel,| \\
-% |% hyperref,| \\
-% |% hyperxmp,| \\
-% | doclicense,| \\
-% |}|
-% \end{quote}
-% in the preamble of your \LaTeXe{} source file. This will select the default
-% license which is \doclicenseNameRef, currently. Please always set your
-% license explicitly as package options like so:
+% Just load the package by placing something like this:
%
% \begin{quote}
% |\usepackage{| \\
-% |% babel,| \\
-% |% hyperref,| \\
-% |% hyperxmp,| \\
+% | babel,| \\
% |}| \\
% |\usepackage[| \\
% | type={CC},| \\
% | modifier={by-sa},| \\
-% | version={3.0},| \\
+% | version={4.0},| \\
% |]{doclicense}|
% \end{quote}
+% in the preamble of your \LaTeXe{} source file and change the package options
+% to the license you want to put the document under.
%
% This will explicitly set the license to \doclicenseNameRef.
%
-% If the \PrintPackage{hyperxmp} package is loaded, then the options
+% If the \PrintPackage{hyperxmp} package is installed, it will be loaded and the options
% \PrintOptionF{pdflicenseurl} and \PrintOptionF{pdfcopyright} will be set
-% by \PrintPackage{doclicense} to the corresponding values
+% by \PackageName{} to the corresponding values
% (\enquote{\url{\doclicenseURL}} and \enquote{\doclicenseLongText{}}).
+% This embeds license metadata into the PDF which proper PDF readers can show.
+% For example Evince shows it in the \enquote{Document License} tab under
+% \enquote{Properties}. You may check this manual for how your PDF reader
+% handles such metadata.
+% If the package is not installed, a warning will be emitted to allow you to
+% install the package as needed.
%
% \section{Package options}
%
@@ -203,12 +211,12 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
% \enquote{CC} to cover all the \doclicenseLongType licenses.
% Please make sure that the type is all uppercase. See the \nameref{sec:supported-licenses} section for a complete list.
%
-% Allows to
+% Allows to \DescribePara{modifier}
% select different subclasses of a license. In the
% example it is \enquote{by-sa}.
% Please make sure that the type is all lowercase. See the \nameref{sec:supported-licenses} section for a complete list.
%
-% As \DescribePara{version} there can be more than one version of a license, the version can also be set.
+% As \DescribePara{version} there can be more than one version of a license, the version also needs to be set.
%
% This package can output some texts like the long license name.
% \DescribePara{lang}
@@ -221,21 +229,20 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
% ^^A Sorted alphabetically.
% \begin{eqlist}
% \item[Brazilian] Added by \href{https://github.com/iagows}{Iago}.
+% \item[Bulgarian] Added by \href{https://github.com/hristo-d-hristov}{hristo-d-hristov}.
% \item[Catalan] Added by \href{https://github.com/elancha98}{Ernesto Lanchares}.
-% \item[Chinese] Added by \href{https://github.com/sd44}{sd44}.
-% \item[English] Added by \href{https://github.com/ypid}{Robin Schneider}.
+% \item[Chinese] Added by \href{https://github.com/sd44}{sd44}. Note that you might need to pass \verb+lang={chinese-utf8}+ or \verb+chinese-gbk+.
+% \item[English] Added by \href{https://me.ypid.de/}{Robin Schneider}.
% \item[French] Added by \href{https://github.com/ericguirbal}{\'Eric Guirbal}.
% \item[Galician] Submitted by Email.
-% \item[German] Added by \href{https://github.com/ypid}{Robin Schneider}.
+% \item[German] Added by \href{https://me.ypid.de/}{Robin Schneider}.
% \item[Italian] Added by \href{https://github.com/rig8f}{Filippo Rigotto}.
+% \item[Japanese] Added by \href{https://github.com/cmplstofB}{cmplstofB}.
+% \item[Marathi] Added by \href{https://github.com/NiranjanTambe}{Niranjan}. Note that Niranjan also translated the images which are considered unofficial by the package. Creative Commons has no plans to support additional currencies.
% \item[Polish] Added by \href{https://github.com/jsbien}{jsbien}.
% \item[Portuguese] Added by \href{https://github.com/alexandre1985}{Daniel Alexandre Cerqueira Santos}.
% \item[Russian] Added by \href{https://github.com/bergentroll}{Anton Karmanov}.
% \item[Spanish] Added by \href{https://github.com/elsudano}{Carlos}. Updated by \href{https://github.com/IgnacioFDM}{IgnacioFDM}.
-%
-%
-%
-%
% \end{eqlist}
%
% Image position for \cmd{\doclicenseThis}: right (default) or left.
@@ -243,26 +250,44 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
%
% Default image width for the license image.
% \DescribePara{imagewidth}
+% Defaults to 10em.
%
% Distance between text and image in \cmd{\doclicenseThis}.
% \DescribePara{imagedistance}
+% Defaults to 2em.
% Select different variations of license images.
% \DescribePara{imagemodifier}
-% For example, Creative Commons provides sometimes more than one image for one version.
+% For example, Creative Commons provides more than one image for one version.
% See the \href{https://creativecommons.org/about/downloads}{download page}.
-% You will note that there are by-nc.eu and by-nc which only differ in the money unit.
-% By default the by-nc image would be used but you can change this with:
+% You will note that there are by-nc.eu and by-nc which only differ in the currency.
+% Based on the loaded language, the currency is set to a suitable default. You can change this with:
% \begin{quote}
% |\usepackage[| \\
-% | imagemodifier={-eu},| \\
+% | type={CC},| \\
+% | modifier={by-nc},| \\
+% | version={4.0},| \\
+% | imagemodifier={-eu-88x31},| \\
+% |]{doclicense}|
+% \end{quote}
+%
+% Also, there is 80x15 which uses letters instead of icons for the modifiers in the image.
+% \begin{quote}
+% |\usepackage[| \\
+% | type={CC},| \\
+% | modifier={by-nc},| \\
+% | version={4.0},| \\
+% | imagemodifier={-eu-80x15},| \\
% |]{doclicense}|
% \end{quote}
%
-% Note that if French or German is set as language then \enquote{-eu} will be used as
-% default for this option.
+% If this is not given, we default to 88x31.
+%
+% Note that imagemodifier needs to assemble into a valid filename. Check
+% what files the package ships with to understand what combinations can be
+% used.
%
-% Currently supported are \enquote{-eu} and \enquote{-us}.
+% For backwards compatibility, \enquote{-eu} is interpreted as \enquote{-eu-88x31}.
%
% This option allows you to specify
% \DescribePara{hyphenation}
@@ -281,9 +306,9 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
% usually one or two full line and one half full line so avoiding hyphenations
% might look better compared to justified text.
%
-% \enquote{RaggedRight} is also the setting used for this documentation.
+% \enquote{RaggedRight} is also the setting used for this manual.
% \cmd{\doclicenseThis} did not produce a hyphenation in case of this
-% documentation but \TeX{} did fill up the first text line to it’s full width
+% manual but \TeX{} did fill up the first text line to it’s full width
% by adding additional space between words. This has been be avoided by setting
% the following option for this document:
%
@@ -352,34 +377,35 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
% \DescribeMacro{\doclicensePlainFullText}
% Verbatim prints the full license text.
%
-% ^^A Don’t ask why I inserted that line break … (LaTeX made the \doclicensePlainFullText red)
+% ^^A Don’t ask why I inserted that line break … (LaTeX made the \doclicensePlainFullText red).
%
% An example can be found in the \nameref{sec:plain_license_text} section.
%
% \DescribeMacro{\doclicensePlainFullTextFileName}
-% \hspace{2.5em}Expands to the file name which the \cmd{\doclicensePlainFullTextFileName} macro uses to \cmd{\input} the license text file.
+% \hspace{2.5em}Expands to the file name which the \cmd{\doclicensePlainFullTextFileName} macro uses to \cmd{\verbatiminput} the license text file.
+% Example: \enquote{\doclicensePlainFullTextFileName{}}
%
% \DescribeMacro{\doclicenseFullText}
-% Nicely prints the full license text.
+% Pretty prints the full license text.
%
-% ^^A Don’t ask why I inserted that line break … (LaTeX made the \doclicenseFullText red)
+% ^^A Don’t ask why I inserted that line break … (LaTeX made the \doclicenseFullText red).
%
% An example can be found in the \nameref{sec:pretty_license_text} section.
%
% \DescribeMacro{\doclicenseFullTextFileName}
% Expands to the file name which the \cmd{\doclicenseFullText} macro uses to \cmd{\input} the license text file.
+% Example: \enquote{\doclicenseFullTextFileName}
%
+% \DescribeMacro{\doclicenseTypeIcon}
+% Expands to an icon of the license type. Example:
+% \enquote{\doclicenseTypeIcon{}}. This macro is based on the
+% \PrintPackage{ccicons} package.
%
% \DescribeMacro{\doclicenseIcon}
-% Expands to a icon of the license. Example:
+% Expands to an icon of the license. Example:
% \enquote{\doclicenseIcon{}}. This macro is based on the
% \PrintPackage{ccicons} package.
%
-% \DescribeMacro{\doclicenseTypeIcon}
-% Expands to a icon of the license type. Example:
-% \enquote{\doclicenseTypeIcon{}}. This macro is based on the
-% \PrintPackage{ccicons} package.
-%
% \DescribeMacro{\doclicenseImage}
% This is kind of similar to \cmd{\doclicenseIcon} but it will typeset an
% bigger pictogram of the license. Example:
@@ -406,33 +432,74 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
% You do not have to worry about the file path. Normally your \LaTeX{} environment
% will find the image for you.
%
+% The file extension is omitted which is good practice together with
+% \cmd{\includegraphics} as it will pick the proper one itself.
+%
% \DescribeMacro{\doclicenseThis}
% And last but not least there is the \cmd{\doclicenseThis} macro which will
% typeset the \cmd{\doclicenseText} next to the \cmd{\doclicenseImage} in a
-% \enquote{minipage} environment. This will look like the following:
+% \enquote{minipage} environment.
+% This will look like the following:
+%
+% \doclicenseThis
+%
+% \makeatletter
+% \renewcommand{\doclicense@imagemodifier}{-80x15}
+% And here is how it looks with the imagemodifier option set to \enquote{\doclicense@imagemodifier}:
%
% \doclicenseThis
+% \renewcommand{\doclicense@imagemodifier}{-88x31}
+% \makeatother
%
% \section{Supported licenses}
% \label{sec:supported-licenses}
-% \subsection{CC (Creative commons)}
+%
+% Currently only Creative Commons is supported.
+% The license type, modifier and version should be based on
+% \href{https://spdx.org/licenses/}{SPDX license identifiers}. Direct support
+% for SPDX license identifiers should be considered when supporting new
+% licenses.
+%
+% \subsection{CC (Creative Commons)}
%
% \makeatletter
+% ^^A Reverse sorted.
% \begin{eqlist}
-% \item[zero@1.0] \@nameuse{doclicense@lang@lic@CC@zero@1.0}
-% \item[pd@1.0] \@nameuse{doclicense@lang@lic@CC@pd@1.0}
-% \item[by@3.0] \@nameuse{doclicense@lang@lic@CC@by@3.0}
-% \item[by-sa@3.0] \@nameuse{doclicense@lang@lic@CC@by-sa@3.0}
-% \item[by-nd@3.0] \@nameuse{doclicense@lang@lic@CC@by-nd@3.0}
-% \item[by-nc@3.0] \@nameuse{doclicense@lang@lic@CC@by-nc@3.0}
-% \item[by-nc-sa@3.0] \@nameuse{doclicense@lang@lic@CC@by-nc-sa@3.0}
-% \item[by-nc-nd@3.0] \@nameuse{doclicense@lang@lic@CC@by-nc-nd@3.0}
-% \item[by@4.0] \@nameuse{doclicense@lang@lic@CC@by@4.0}
-% \item[by-sa@4.0] \@nameuse{doclicense@lang@lic@CC@by-sa@4.0}
-% \item[by-nd@4.0] \@nameuse{doclicense@lang@lic@CC@by-nd@4.0}
-% \item[by-nc@4.0] \@nameuse{doclicense@lang@lic@CC@by-nc@4.0}
-% \item[by-nc-sa@4.0] \@nameuse{doclicense@lang@lic@CC@by-nc-sa@4.0}
-% \item[by-nc-nd@4.0] \@nameuse{doclicense@lang@lic@CC@by-nc-nd@4.0}
+% \item[CC0-1.0] \@nameuse{doclicense@lang@lic@CC@zero@1.0}
+% \item[CC-BY-4.0] \@nameuse{doclicense@lang@lic@CC@by@4.0}
+% \item[CC-BY-3.0] \@nameuse{doclicense@lang@lic@CC@by@3.0}
+% \item[CC-BY-SA-4.0] \@nameuse{doclicense@lang@lic@CC@by-sa@4.0}
+% \item[CC-BY-SA-3.0] \@nameuse{doclicense@lang@lic@CC@by-sa@3.0}
+% \item[CC-BY-ND-4.0] \@nameuse{doclicense@lang@lic@CC@by-nd@4.0}
+% \item[CC-BY-ND-3.0] \@nameuse{doclicense@lang@lic@CC@by-nd@3.0}
+% \item[CC-BY-NC-4.0] \@nameuse{doclicense@lang@lic@CC@by-nc@4.0}
+% \item[CC-BY-NC-3.0] \@nameuse{doclicense@lang@lic@CC@by-nc@3.0}
+% \item[CC-BY-NC-SA-4.0] \@nameuse{doclicense@lang@lic@CC@by-nc-sa@4.0}
+% \item[CC-BY-NC-SA-3.0] \@nameuse{doclicense@lang@lic@CC@by-nc-sa@3.0}
+% \item[CC-BY-NC-ND-4.0] \@nameuse{doclicense@lang@lic@CC@by-nc-nd@4.0}
+% \item[CC-BY-NC-ND-3.0] \@nameuse{doclicense@lang@lic@CC@by-nc-nd@3.0}
+% \end{eqlist}
+% \makeatother
+%
+% \section{Retired licenses}
+%
+% Licenses get updated and sometimes fully replaced.
+% This section clarifies how \PackageName{} handles this.
+%
+% If there is consensus that the old license has no valid use case anymore and
+% it is possible and allowed for everyone compiling a document to update the
+% license, then the old license will be removed from \PackageName{} in the next
+% major version.
+%
+% Otherwise, \PackageName{} will keep supporting it to ensure that documents
+% using those licenses can still be compiled in the future.
+%
+% List of retired licenses:
+%
+% \makeatletter
+% ^^A Reverse sorted.
+% \begin{eqlist}
+% \item[CC-PDDC] Copyright-Only Dedication
% \end{eqlist}
% \makeatother
%
@@ -480,11 +547,11 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
% \begin{macrocode}
%% Parameters (((
\RequirePackage{kvoptions}
-\DeclareStringOption[CC]{type}
-\DeclareStringOption[by-sa]{modifier}
+\DeclareStringOption{type}
+\DeclareStringOption{modifier}
\DeclareStringOption{version}
\DeclareStringOption{lang}
-\DeclareStringOption{imagemodifier}
+\DeclareStringOption[-88x31]{imagemodifier}% chktex 29
\DeclareStringOption[right]{imageposition}
\DeclareStringOption[10em]{imagewidth}
\DeclareStringOption[2em]{imagedistance}
@@ -503,13 +570,13 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
% \begin{macrocode}
%% Dependencies (((
\RequirePackage{xifthen}
+\RequirePackage{xstring}
\RequirePackage{etoolbox} %% \ifcsdef
\RequirePackage{xspace}
\RequirePackage{verbatim}
-%% )))
%% Custom enumerate list with adjusted labels
-%% that match the license text convetions
+%% that match the license text conventions
\newenvironment{doclicense@enumerate}{%
\begin{enumerate}
\renewcommand{\labelenumi}{(\alph{enumi})}%
@@ -555,7 +622,7 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
\@ifpackageloaded{graphicx}{}{\RequirePackage{graphicx}}
%% For \doclicenseImage
\@ifpackageloaded{hyperref}{}{\RequirePackage{hyperref}}
- \@ifpackageloaded{hyperxmp}{%
+ \@ifpackageloaded{hyperxmp}{
%% The following options are only defined when the hyperxmp package was loaded.
\hypersetup{
pdfcopyright = {\doclicenseLongText},
@@ -563,12 +630,61 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
}
}{}
}
+\IfFileExists{hyperxmp.sty}{
+ \@ifpackageloaded{hyperxmp}{}{\RequirePackage{hyperxmp}}
+}{
+ \PackageWarning{doclicense}{%
+ The hyperxmp package is missing so no license metadata can be embedded
+ into the PDF. Consider installing hyperxmp.% chktex 13
+ }
+}
+%% )))
+
+% \end{macrocode}
+% \subsection{Deprecation handling}
+% \begin{macrocode}
+%% Deprecation handling (((
+\ifthenelse{
+ \equal{\doclicense@type}{}
+}{
+ \PackageWarning{doclicense}{%
+ "type" package option missing. % chktex 18
+ This option is now required and the fallback to "CC" is deprecated. % chktex 18
+ In an upcoming major version of doclicense, this will be a package error.
+ Please explicitly pick a license of your choosing.
+ }
+ \renewcommand{\doclicense@type}{CC}
+}{}
+
+\ifthenelse{
+ \equal{\doclicense@modifier}{}
+}{
+ \PackageWarning{doclicense}{%
+ "modifier" package option missing. % chktex 18
+ This option is now required and the fallback to "by-sa" is deprecated. % chktex 18
+ In an upcoming major version of doclicense, this will be a package error.
+ Please explicitly pick a license of your choosing.
+ }
+ \renewcommand{\doclicense@modifier}{by-sa}
+}{}
+
+\ifthenelse{
+ \equal{\doclicense@version}{}
+}{
+ \PackageWarning{doclicense}{%
+ "version" package option missing. % chktex 18
+ This option is now required and the fallback is deprecated. % chktex 18
+ In an upcoming major version of doclicense, this will be a package error.
+ Please explicitly pick a license of your choosing.
+ }
+}{}
%% )))
% \end{macrocode}
% \subsection{Declare variables and macros}
% \begin{macrocode}
%% Declare variables (((
+\@namedef{doclicense@lang@lic@CC}{Creative Commons}%
\newcommand{\doclicense@baseUrlCC}{https://creativecommons.org}
\newcommand{\doclicense@versionFallback}{}
\newcommand{\doclicense@versionUsed}{}
@@ -580,7 +696,7 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
}
\newcommand{\doclicense@icon}{%
\PackageError{doclicense}{Icon not defined}
- {Please check the documentation of doclicense to see what you can do about it.}%
+ {Please check the manual of doclicense to see what you can do about it.}%
}
\newcommand{\doclicense@modifier@uppercase}{\texorpdfstring{%
\MakeUppercase{\doclicense@modifier}%
@@ -630,18 +746,18 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
}
\newcommand{\doclicensePlainFullTextFileName}{%
doclicense-\doclicense@type-\doclicense@modifier%
- -\doclicense@versionUsed-plaintext
+ -\doclicense@versionUsed-plaintext%
}
\newcommand{\doclicensePlainFullText}{%
\verbatiminput{\doclicensePlainFullTextFileName}
}
\newcommand{\doclicenseFullTextFileName}{%
doclicense-\doclicense@type-\doclicense@modifier-\doclicense@versionUsed-latex}
-\newcommand{\doclicenseFullText}{\input{\doclicenseFullTextFileName}}
+\newcommand{\doclicenseFullText}{\input{\doclicenseFullTextFileName}}% chktex 27
\newcommand{\doclicenseLicense}{\doclicenseThis} %% legacy support
\newcommand{\doclicenseThis}{%
- \setlength{\doclicense@hsize}{\textwidth-\doclicense@imagewidth-\doclicense@imagedistance}%
+ \setlength{\doclicense@hsize}{\linewidth-\doclicense@imagewidth-\doclicense@imagedistance}%
\ifthenelse{\equal{\doclicense@imageposition}{left}}{%
\begin{center}
\begin{minipage}{\doclicense@imagewidth}
@@ -689,16 +805,17 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
\ifthenelse{\equal{\doclicense@lang}{}}{%
\renewcommand{\doclicense@lang}{\languagename}}{}
\IfFileExists{doclicense-\doclicense@lang.ldf}{%
- \input{doclicense-\doclicense@lang.ldf}
+ \input{doclicense-\doclicense@lang.ldf}% chktex 27
}{%
\PackageWarning{doclicense}{%
No language definition for \doclicense@lang found.
- Please add one and submit a patch. Using English as fallback.}
+ Please add one and submit a patch. Using English as fallback.
+ }
\renewcommand{\doclicense@lang}{english}
- \input{doclicense-\doclicense@lang.ldf}
+ \input{doclicense-\doclicense@lang.ldf}% chktex 27
}
\ifthenelse{\equal{\doclicense@imagemodifier}{-us}}{%
- \@namedef{doclicense@imagemodifier}{}
+ \@namedef{doclicense@imagemodifier}{-88x31}% chktex 29
}{}
%% )))
@@ -720,7 +837,7 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
\newcommand{\doclicense@set}{%
%% CC (((
\ifthenelse{\equal{\doclicense@type}{CC}}{%
- \renewcommand{\doclicenseLongType}{Creative Commons\xspace}
+ \renewcommand{\doclicenseLongType}{\doclicense@lang@lic@CC\xspace}
\renewcommand{\doclicenseTypeIcon}{\ccLogo\xspace}
\doclicense@setVersion[3.0]
@@ -743,47 +860,42 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
}
\ifthenelse{\equal{\doclicense@modifier}{by}}{%
\renewcommand{\doclicense@icon}{\ccby}
- \renewcommand{\doclicense@imagemodifier}{}
}{}
\ifthenelse{\equal{\doclicense@modifier}{by-sa}}{%
\renewcommand{\doclicense@icon}{\ccbysa}
- \renewcommand{\doclicense@imagemodifier}{}
}{}
\ifthenelse{\equal{\doclicense@modifier}{by-nd}}{%
\renewcommand{\doclicense@icon}{\ccbynd}
- \renewcommand{\doclicense@imagemodifier}{}
}{}
\ifthenelse{\equal{\doclicense@modifier}{by-nc}}{%
\renewcommand{\doclicense@icon}{\ccbync}
- \ifthenelse{\equal{\doclicense@imagemodifier}{-eu}}{%
+ \IfBeginWith{\doclicense@imagemodifier}{-eu}{%
\renewcommand{\doclicense@icon}{\ccbynceu}
}{}
- \ifthenelse{\equal{\doclicense@imagemodifier}{-jp}}{%
+ \IfBeginWith{\doclicense@imagemodifier}{-jp}{%
\renewcommand{\doclicense@icon}{\ccbyncjp}
+ \renewcommand{\doclicense@imagemodifier}{-88x31}% chktex 29
}{}
- \renewcommand{\doclicense@imagemodifier}{}
}{}
\ifthenelse{\equal{\doclicense@modifier}{by-nc-sa}}{
\renewcommand{\doclicense@icon}{\ccbyncsa}
- \ifthenelse{\equal{\doclicense@imagemodifier}{-eu}}{%
+ \IfBeginWith{\doclicense@imagemodifier}{-eu}{%
\renewcommand{\doclicense@icon}{\ccbyncsaeu}
}{}
- \ifthenelse{\equal{\doclicense@imagemodifier}{-jp}}{%
+ \IfBeginWith{\doclicense@imagemodifier}{-jp}{%
\renewcommand{\doclicense@icon}{\ccbyncsajp}
+ \renewcommand{\doclicense@imagemodifier}{-88x31}% chktex 29
}{}
}{}
\ifthenelse{\equal{\doclicense@modifier}{by-nc-nd}}{
\renewcommand{\doclicense@icon}{\ccbyncnd}
- \ifthenelse{\equal{\doclicense@imagemodifier}{-eu}}{%
- \renewcommand{\doclicense@icon}{\ccbyncndeu}
- }{}
- \ifthenelse{\equal{\doclicense@imagemodifier}{-jp}}{%
+ \IfBeginWith{\doclicense@imagemodifier}{-jp}{%
\renewcommand{\doclicense@icon}{\ccbyncndjp}
+ \renewcommand{\doclicense@imagemodifier}{-88x31}% chktex 29
}{}
}{}
\ifthenelse{\equal{\doclicense@modifier}{zero}}{%
\renewcommand{\doclicense@icon}{\cczero}
- \renewcommand{\doclicense@imagemodifier}{}
\doclicense@setVersion[1.0]
\edef\doclicenseURL{%
\doclicense@baseUrlCC/%
@@ -792,33 +904,37 @@ corresponds to \PackageName\nobreakspace\fileversion, dated \filedate.}}
\doclicense@versionUsed\doclicense@UrlLangPart}
}{}
\ifthenelse{\equal{\doclicense@modifier}{pd}}{
- \renewcommand{\doclicense@icon}{\ccpd}
- \renewcommand{\doclicense@imagemodifier}{}
- \doclicense@setVersion[1.0]
- \edef\doclicenseURL{%
- \doclicense@baseUrlCC/%
- licenses/publicdomain/%
- \doclicense@versionUsed\doclicense@UrlLangPart}
+ \PackageError{doclicense}{CC PD license removed as of version 2.0.0}{
+ Creative Commons PD has been replaced by CC-zero.
+ Please update your license choice.
+ }%
+ }{}
+ \IfSubStr{\doclicense@modifier}{nc}{}{
+ %% eu (Euro) does only exist for nc (non commercial) so if not nc then reset -eu.
+ \IfBeginWith{\doclicense@imagemodifier}{-eu}{%
+ \renewcommand{\doclicense@imagemodifier}{-88x31}% chktex 29
+ }{}
+ }
+ \ifthenelse{\equal{\doclicense@imagemodifier}{-eu}}{%
+ \renewcommand{\doclicense@imagemodifier}{-eu-88x31}% chktex 29
}{}
\ifcsdef{doclicense@lang@lic@\doclicense@type%
@\doclicense@modifier @\doclicense@versionUsed}{}{%
- \PackageError{doclicense}{License long name not defined}%
- {%
- Please check the documentation of doclicense
- to see what you can do about it.%
- }%
+ \PackageError{doclicense}{License long name not defined}{%
+ Please check the manual of doclicense
+ to see what you can do about it.%
+ }%
}
\setboolean{doclicense@licenseKnown}{true}
}{}%% )))
\ifthenelse{\not\boolean{doclicense@licenseKnown}}{%
- \PackageError{doclicense}{License unknown}%
- {%
- Please check the documentation of doclicense
- to see what you can do about it.%
- }%
+ \PackageError{doclicense}{License unknown}{%
+ Please check the manual of doclicense
+ to see what you can do about it.%
+ }%
}{}%
}
%% )))
diff --git a/Master/texmf-dist/source/latex/draftwatermark/draftwatermark.dtx b/Master/texmf-dist/source/latex/draftwatermark/draftwatermark.dtx
index 2cd35a1bbd5..216fd1072cd 100644
--- a/Master/texmf-dist/source/latex/draftwatermark/draftwatermark.dtx
+++ b/Master/texmf-dist/source/latex/draftwatermark/draftwatermark.dtx
@@ -8,15 +8,16 @@
% a contribution to the LaTeX2e system.
% ---------------------------------------------
%
-% It may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License, either version 1.3 of this licence, or
-% any later version. The latest version of this license is at
-% http://www.latex-project.org/lppl.txt and version 1.3 is part
-% of all distributions of LaTeX version 2003/06/01 or later.
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, version 1.3c.
+% This license is in
+% https://www.latex-project.org/lppl/lppl-1-3c/
+% and is part of all distributions of LaTeX later than
+% 2008-05-04.
%
-% This work has the LPPL maintenance status "author-maintained".
+% This work has the LPPL maintenance status "maintained".
%
-% This program consists of the files listed in the README file
+% This program consists of the files listed in the README.md file
% included in the package.
%
%<*driver>
@@ -28,39 +29,8 @@
\usepackage{textcomp}
\usepackage{url}
\EnableCrossrefs
-
-\setcounter{IndexColumns}{2}
-\setlength{\IndexMin}{3cm}
-
-\DoNotIndex{\begin, \end, \begingroup, \endgroup}
-\DoNotIndex{\csname, \endcsname}
-\DoNotIndex{\if, \else, \fi}
-\DoNotIndex{\ifx, \fi}
-\DoNotIndex{\ifodd, \fi}
-\DoNotIndex{\@car, \@empty, \@ifnextchar, \@nil, \@onelevel@sanitize,
- \@tempboxa, \@tempdima, \@tempdimb, \@tfor}
-\DoNotIndex{\AddEverypageHook, \AddThispageHook, \addtolength, \author}
-\DoNotIndex{\bfseries, \box}
-\DoNotIndex{\color}
-\DoNotIndex{\DeclareBoolOption, \DeclareComplementaryOption,
- \DeclareStringOption, \def, \define@key, \dimexpr, \DisableKeyvalOption,
- \do, \documentclass, \dp}
-\DoNotIndex{\expandafter}
-\DoNotIndex{\fbox, \fontsize}
-\DoNotIndex{\hbox, \hspace, \hss, \ht}
-\DoNotIndex{\let, \lipsum}
-\DoNotIndex{\maketitle, \MyWM}
-\DoNotIndex{\newcommand, \newsavebox, \NeedsTeXFormat}
-\DoNotIndex{\PackageError, \paperheight, \paperwidth,
- \ProcessKeyvalOptions, \ProvidesPackage}
-\DoNotIndex{\relax, \RequirePackage, \rotatebox}
-\DoNotIndex{\savebox, \sbox, \scalebox, \section, \selectfont, \setkeys,
- \setlength, \sffamily}
-\DoNotIndex{\thepage, \title}
-\DoNotIndex{\usebox, \usepackage}
-\DoNotIndex{\vbox, \vspace, \vss}
-\DoNotIndex{\wd, \wmbox}
-
+\CodelineIndex
+\RecordChanges
\CodelineIndex
%\RecordChanges
\begin{document}
@@ -70,12 +40,47 @@
%
% \fi
%
-% \CheckSum{288}
+% \CheckSum{576}
%
% \def\filename{draftwatermark.dtx}
-% \def\fileversion{2.0}
-% \def\filedate{2020/03/14}
-% \def\docdate{2020/03/14}
+% \def\fileversion{3.0}
+% \def\filedate{2020/12/08}
+% \def\docdate{2020/12/08}
+%
+% \DoNotIndex{\\}
+% \DoNotIndex{\begin, \end, \begingroup, \endgroup}
+% \DoNotIndex{\csname, \endcsname}
+% \DoNotIndex{\if, \else, \fi}
+% \DoNotIndex{\ifx, \fi}
+% \DoNotIndex{\ifodd, \fi}
+% \DoNotIndex{\@car, \@empty, \@ifnextchar, \@ifundefined, \@nil,
+% \@onelevel@sanitize, \@tempboxa, \@tempdima, \@tempdimb, \@tfor}
+% \DoNotIndex{\AddEverypageHook, \AddThispageHook, \AddToHook, \AddToHookNext,
+% \addtolength, \author}
+% \DoNotIndex{\bfseries, \box}
+% \DoNotIndex{\color}
+% \DoNotIndex{\DeclareBoolOption, \DeclareComplementaryOption,
+% \DeclareStringOption, \def, \define@key, \depth, \dimexpr,
+% \DisableKeyvalOption, \do, \documentclass, \dp}
+% \DoNotIndex{\edef, \endinput, \expandafter}
+% \DoNotIndex{\fbox, \fontsize}
+% \DoNotIndex{\hbox, \hspace, \hss, \ht}
+% \DoNotIndex{\let, \lipsum}
+% \DoNotIndex{\maketitle, \MyWM, \MessageBreak}
+% \DoNotIndex{\newcommand, \newsavebox, \NeedsTeXFormat}
+% \DoNotIndex{\PackageError, \PackageWarningNoLine, \paperheight,
+% \paperwidth, \ProcessKeyvalOptions, \ProvidesPackage, \put}
+% \DoNotIndex{\raisebox, \relax, \RequirePackage, \RequirePackageWithOptions,
+% \rotatebox}
+% \DoNotIndex{\savebox, \sbox, \scalebox, \section, \selectfont, \setkeys,
+% \SetupKeyvalOptions, \setlength, \sffamily, \shortstack}
+% \DoNotIndex{\thepage, \title}
+% \DoNotIndex{\usebox, \usepackage}
+% \DoNotIndex{\vbox, \vspace, \vss}
+% \DoNotIndex{\wd, \wmbox}
+%
+% \setcounter{IndexColumns}{2}
+% \setlength{\IndexMin}{3cm}
%
% \newcommand*{\Lpack}[1]{\textsf {#1}} ^^A typeset a package
% \newcommand*{\Lopt}[1]{\texttt {#1}} ^^A typeset an option
@@ -97,28 +102,30 @@
% \maketitle
%
% \begin{abstract}
-% The \Lpack{draftwatermark} package extends \LaTeX\ providing a means
-% to add a watermark (typically textual and light gray, but possibly
-% more sophisticated) on the pages of a document (either on every page,
-% on the first page, or on selected pages). Typical usage may consist in
-% writing words such as ``DRAFT'' or ``CONFIDENTIAL'' across the
-% pages. The package may remind in some sense \Lpack{draftcopy} by
-% Dr.~Juergen Vollmer, but its implementation is lighter (as the reduced
-% code footprint shows) and does not rely on postscript specials, making
-% the package fully compatible with \hologo{pdfLaTeX}, \hologo{XeLaTeX}
-% and \hologo{LuaLaTeX}. The \Lpack{draftwatermark} package depends on
-% \Lpack{everypage} by the same author. Its feature set is somehow
-% restricted because the emphasis is on the simplicity of the
-% interface. For complex layouts, \Lpack{scrlayer.sty} from the
-% \emph{KOMA script} bundle may represent a valuable alternative.
+% The \Lpack{draftwatermark} package extends \hologo{LaTeX} providing a
+% means to add a watermark (typically textual and light gray, but
+% possibly more sophisticated) on the pages of a document (either on
+% every page, on the first page, or on selected pages). Typical usage
+% may consist in writing words such as ``DRAFT'' or ``CONFIDENTIAL''
+% across the pages. The package may remind in some sense
+% \Lpack{draftcopy} by Dr.~Juergen Vollmer, but its implementation is
+% lighter (as the reduced code footprint shows) and does not rely on
+% postscript specials, making the package fully compatible with
+% \hologo{pdfLaTeX}, \hologo{XeLaTeX} and \hologo{LuaLaTeX}. Its feature
+% set is somehow restricted because the emphasis is on the simplicity of
+% the interface. For complex layouts, consider \Lpack{scrlayer.sty} from
+% the \emph{KOMA script} bundle or directly using the new \hologo{LaTeX}
+% shipout hooks.
% \end{abstract}
%
% \section{Introduction}
-%
-% This package extends \LaTeX\ providing a means to add a textual, usually
-% light gray (but possibly colored) watermark on every page, the first
-% page, or selected pages of a document. Typical usage may consist in
-% writing words such as ``DRAFT'' or ``CONFIDENTIAL'' across document
+%
+% \changes{R1.0}{2006/06/30}{Initial release.}%
+% \changes{R1.1}{2012/01/06}{Many small fixes in the documentation.}
+% This package extends \hologo{LaTeX} providing a means to add a textual,
+% usually light gray (but possibly colored) watermark on every page, the
+% first page, or selected pages of a document. Typical usage may consist
+% in writing words such as ``DRAFT'' or ``CONFIDENTIAL'' across document
% pages.
%
% The package may remind in some sense \Lpack{draftcopy} by Dr.~Juergen
@@ -162,11 +169,10 @@
% other packages affecting the page building, e.g., with respect to the
% stacking order of the objects on the page. For any complex layout, or
% when the Z-ordering is important, the recommendation is to look at the
-% \Lpack{scrlayer} package in the \emph{KOMA script} bundle.
+% \Lpack{scrlayer} package in the \emph{KOMA script} bundle or to rely
+% directly on the new shipout hook mechanism provided by \hologo{LaTeX}.
+%
%
-% For the actual page building \Lpack{draftwatermark} depends on the
-% \Lpack{everypage} package by the same author.
-%
% \section{User interface}
% When loaded, \Lpack{draftwatermark} sets up a number of defaults
% (detailed later and modifiable by specific commands) and immediately
@@ -185,7 +191,8 @@
% |\usepackage[<options>]{draftwatermark}|
% \end{quote}
%
-% \DescribeMacro{\DraftwatermarkOptions}
+% \DescribeMacro{\DraftwatermarkOptions}
+% \changes{R2.0}{2020/03/08}{Introduction of a keyval option mechanism.}
% The package behavior can also be dynamically changed \emph{after the
% package is loaded} by the command |\DraftwatermarkOptions{<options>}|
% that can be used anywhere in the document source. In either case,
@@ -198,11 +205,13 @@
% command is a bit quirky, hence when specifying options with the
% |<key>=<value>| syntax, some values that are accepted by
% |\DraftwatermarkOptions| may cause issues when specifying options with
-% |\usepackage|.
-% \medskip
+% |\usepackage|. \medskip
%
% The available options are:
% \begin{itemize}
+% \changes{R1.1}{2012/01/06}{Introduce the ``stamp'', ``nostamp'' and
+% ``final'' options to control whether the watermark should actually
+% be printed.}^^A
% \item \verb!firstpageonly=true|false!\\
% If no value is provided, |true| is assumed. Default is |false|.\\
% Instructs \Lpack{draftwatermark} to only apply the watermark on the
@@ -245,8 +254,8 @@
% Defines the horizontal position of the watermark anchor
% point. Specifically, |l| stands for \emph{left}, |c| for \emph{center}
% and |r| for \emph{right}. See also the |anchor| option.
-% \item \verb!hanchor=t|m|b!\\
-% Default is |c|.\\
+% \item \verb!vanchor=t|m|b!\\
+% Default is |m|.\\
% Defines the vertical position of the watermark anchor
% point. Specifically, |t| stands for \emph{top}, |m| for \emph{middle}
% and |b| for \emph{bottom}. See also the |anchor| option.
@@ -258,6 +267,11 @@
% for the |hanchor| and |vanchor| options. For instance, if the anchor
% specification is |lt|, then the top left corner of the watermark is
% placed at the position specified by the |hpos| and |vpos| options.
+% \item \verb!alignment=l|c|r!\\
+% Default is |c|.\\
+% Defines the alignment for the watermark text in case it contains line
+% breaks. Specifically, |l| aligns left, |c| aligns at the center and
+% |r| aligns right.
% \item |colormodel=<color model>|\\
% Defaults to |gray|.\\
% Defines the color model for the specification of the color of the
@@ -317,21 +331,21 @@
% fact, sufficiently large to get the word ``DRAFT'', rotated at
% 45\textdegree, take about half of the page width.
%
-% Nonetheless asking for a large font may not work, if \LaTeX\ has not
-% been set up to use \emph{scalable} fonts. For this reason, the
-% recommendation is to always use \Lpack{draftwatermark} on \LaTeX\ or
-% \hologo{pdfLaTeX} together with other packages that trigger the usage of
-% fully scalable fonts (practical examples may be \Lpack{newtx} or
+% Nonetheless asking for a large font may not work, if \hologo{LaTeX} has
+% not been set up to use \emph{scalable} fonts. For this reason, the
+% recommendation is to always use \Lpack{draftwatermark} on \hologo{LaTeX}
+% or \hologo{pdfLaTeX} together with other packages that trigger the usage
+% of fully scalable fonts (practical examples may be \Lpack{newtx} or
% \Lpack{mathptmx}, etc.). An even better alternative is to use modern
% \TeX\ engines, as in \hologo{XeLaTeX} or \hologo{LuaLaTeX} with
% \Lpack{fontspec}. In any case, recall that even with scalable fonts,
-% \LaTeX\ may be unable to deal with extremely large font sizes (e.g.,
-% $\gg 5\,\mathrm{cm}$). If really large letters are required for the
-% watermark, a suitable combination of |fontsize| and |scale| may be
+% \hologo{LaTeX} may be unable to deal with extremely large font sizes
+% (e.g., $\gg 5\,\mathrm{cm}$). If really large letters are required for
+% the watermark, a suitable combination of |fontsize| and |scale| may be
% needed.
%
-% One can immediately realize when \LaTeX\ is unable to deal with the
-% package default or selected |fontsize| from two things: (i) a font
+% One can immediately realize when \hologo{LaTeX} is unable to deal with
+% the package default or selected |fontsize| from two things: (i) a font
% warning from \LaTeX; and (ii) a tiny watermark text whose size seems not
% to react to the |fontsize| option. In this case, either switch to
% scalable fonts or select a small |fontsize| (e.g., |12pt|) together with
@@ -345,21 +359,23 @@
% a plain string. Conversely, it may include formatting marks, such as
% line break commands (e.g., |\\|) or commands to select font variants
% (e.g., |\bfseries|). In fact, it is also possible to use a command to
-% include an image as the text. A word of caution is necessary, though. To
-% use \LaTeX\ commands in the watermark text, please configure the latter
-% via the |\DraftwatermarkOptions| command. Trying to do so by passing
-% options to the \Lpack{draftwatermark} package via the |\usepackage|
-% mechanism may fail due to how \LaTeX\ parses option strings. Also note
-% that the text may need to be surrounded by braces.
+% include an image as the text. In case line breaks are present, the text
+% is left, right, center aligned according to the |alignment| option. A
+% word of caution is necessary, though. To use \hologo{LaTeX} commands in
+% the watermark text, please configure the latter via the
+% |\DraftwatermarkOptions| command. Trying to do so by passing options to
+% the \Lpack{draftwatermark} package via the |\usepackage| mechanism may
+% fail due to how \hologo{LaTeX} parses option strings. Also note that the
+% text may need to be surrounded by braces.
%
% If the watermark text includes line breaks, \Lpack{draftwatermark} will
-% use a default interline space set to 1.2 times the font size. Consider
-% that multiline texts with alignment, taking up their natural width can
-% easily be obtained with the |\shortstack| command.
+% use a very thin interline space, according to the fact that the
+% multi-line text is managed by surrounding the it with a \hologo{LaTeX}
+% |shortstack| command.
%
-% Also, note that the watermark typesetting happens inside a \TeX\
-% group, to make sure that any parameter setting you do in the |text|
-% token list can stay local.
+% Also, note that the watermark typesetting happens inside a \TeX\ group,
+% to make sure that any parameter setting you do in the |text| token list
+% can stay local.
%
% As a further remark, observe that in order to only put a watermark on
% selected pages, an alternative to changing the |stamp| configuration
@@ -384,14 +400,26 @@
% anchoring.
%
% As a final remark, observe that the specification of the positioning
-% coordinates can be based on \LaTeX\ macros. For instance, one can set
-% the horizontal position at |0.5\paperwidth| (for centering) or at
-% |\dimexpr\paperwidth-5mm| (for placement at the right hand side of the
-% page). Interestingly, \Lpack{draftwatermark} re-evaluates the
+% coordinates can be based on \hologo{LaTeX} macros. For instance, one can
+% set the horizontal position |hpos| at |0.5\paperwidth| (for centering)
+% or at |\dimexpr\paperwidth-5mm| (for placement at the right hand side of
+% the page). Interestingly, \Lpack{draftwatermark} re-evaluates the
% positioning coordinates on every page. This means that positions based
% on |\paperwidth| or |\paperheight| should dynamically adjust if the page
% size is changed through the document.
-%
+% \changes{R2.1}{2020/05/11}{Let anchor directives be re-evaluated on
+% every page.}^^A
+% To some extent, this is also true
+% of the anchor options. For instance, one may set the horizontal anchor
+% |hanchor| at |\ifodd\thepage r\else l\fi| causing the anchor point to
+% alternate between |r| and |l| at every new page. In conjunction with a
+% similarly conditional |hpos| setting, for instance
+% |\ifodd\thepage \dimexpr\paperwidth-5mm \else 5mm\fi|, this enables
+% interesting effects, like placing the watermark close to the right side
+% of the page on odd pages and to the left side of the page on even
+% pages. Obviously, this kind of setting is only applicable with the
+% |hanchor| and |vanchor| options, and not with the |anchor| shorthand.
+%
% \section{The standard watermark and ways of overriding it}
% \label{sec:markcmd}
%
@@ -426,9 +454,33 @@
%
% \end{sloppy}
%
-% \section{Compatibility notes for version 2.0 of the package and later
-% versions}
+% \section{Compatibility notes}
+%
+% \subsection{Compatibility notes for package version 3.0 and later}
+%
+% \changes{R3.0}{2020/12/08}{Remove dependency on package
+% \Lpack{everypage}.}^^A
+% Version 3.0 of the package takes advantage of the new functionalities
+% introduced in \hologo{LaTeX} with the Fall 2020 release and gets rid of
+% its dependency on \Lpack{everypage}. In principle, this could result in
+% behavioral differences in corner cases.
+%
+% \changes{R3.0}{2020/12/08}{Automatically load legacy code for older
+% \hologo{LaTeX} formats.}^^A
+% For users of versions of \hologo{LaTeX} before Fall 2020,
+% \Lpack{draftwatermarks} falls back to its own legacy code base, now
+% packaged as \Lpack{draftwatermark-2x}.
+%
+% It is worth remarking that there is no advantage in trying to explicitly
+% load \Lpack{draftwatermark-2x} on a modern \hologo{LaTeX} to try to get
+% the past behavior. In fact, even if the old code base uses
+% \Lpack{everypage}, on modern \hologo{LaTeX} formats, the latter tries
+% itself to rely on the new \hologo{LaTeX} functionalities rather than its
+% own legacy mechanisms.
%
+% \subsection{Compatibility notes for package version 2.0 and later}
+%
+% \changes{R2.0}{2020/03/08}{Complete package overhaul.}
% Version 2.0 of the package is an almost complete rewrite with respect to
% version 1.2. Specifically, all the configuration mechanism has been
% overhauled, by moving to an interface based on configuration keys and
@@ -450,6 +502,8 @@
% Command |\SetWatermarkAngle{<real>}| is the same as\\
% |\DraftwatermarkOptions{angle=<real>}|.
% \item \DescribeMacro{\SetWatermarkColor}^^A
+% \changes{R1.1}{2012/01/06}{Add support for specifying color
+% of textual watermark.}^^A
% Command |\SetWatermarkColor[<model>]{<color spec>}| is the same as\\
% |\DraftwatermarkOptions{color={[<model>]{<color spec>}}}|.
% \item \DescribeMacro{\SetWatermarkLightness}^^A
@@ -463,20 +517,25 @@
% Command |\SetWatermarkScale{<real>}| is the same as\\
% |\DraftwatermarkOptions{scale=<real>}|.
% \item \DescribeMacro{\SetWatermarkHorCenter}^^A
+% \changes{R1.2}{2015/02/19}{Add support for specifying the watermark
+% horizontal position.}^^A
% Command |\SetWatermarkHorCenter{<length>}| is the same as\\
% |\DraftwatermarkOptions{hpos=<length>, hanchor=c}|.
% \item \DescribeMacro{\SetWatermarkVerCenter}^^A
+% \changes{R1.2}{2015/02/19}{Add support for specifying the watermark
+% vertical position.}^^A
% Command |\SetWatermarkVerCenter{<length>}| is the same as\\
% |\DraftwatermarkOptions{vpos=<length>, vanchor=m}|.
% \item \DescribeMacro{\SetWatermarkText}^^A
% Command |\SetWatermarkText{<text>}| is the same as\\
-% |\DraftwatermarkOptions{text=<text>}|.
+% |\DraftwatermarkOptions{text={<text>}}|.
% \end{itemize}
%
% Note that the legacy interface supports only a subset of what is
% possible with the modern interface.
%
% \section{Examples}
+% \label{sec:examples}
%
% \subsection{Plain case, using the modern package interface}
%
@@ -487,9 +546,10 @@
% \fi
% \begin{macrocode}
\documentclass{article}
-\usepackage[named]{xcolor}
+\usepackage[svgnames]{xcolor}
\usepackage[T1]{fontenc}
-\usepackage[firstpageonly, color={[gray]{0.5}}]{draftwatermark}
+\usepackage[firstpageonly, color={[gray]{0.5}},
+ text=DRAFT\\COPY]{draftwatermark}
\usepackage{mathptmx}
\usepackage{lipsum}
\title{Sample document for the draftwatermark package}
@@ -509,7 +569,6 @@
% \iffalse
%</samplecode-modern>
% \fi
-% \makeatletter \c@CodelineNo\z@ \makeatother
%
% This produces a two pages document with placeholder content, putting a
% page-centered watermark on the first page only. The watermark is made a
@@ -524,13 +583,14 @@
% \fi
% \begin{macrocode}
\documentclass{article}
-\usepackage[named]{xcolor}
+\usepackage[svgnames]{xcolor}
\usepackage[T1]{fontenc}
\usepackage[firstpage]{draftwatermark}
\usepackage{mathptmx}
\usepackage{lipsum}
\SetWatermarkLightness{0.5}
+\SetWatermarkText{DRAFT\\COPY}
\title{Sample document for the draftwatermark package}
\author{}
@@ -549,7 +609,6 @@
% \iffalse
%</samplecode-legacy>
% \fi
-% \makeatletter \c@CodelineNo\z@ \makeatother
%
% \subsection{Things that cannot be done with the legacy interface}
%
@@ -563,7 +622,7 @@
% \fi
% \begin{macrocode}
\documentclass{article}
-\usepackage[named]{xcolor}
+\usepackage[svgnames]{xcolor}
\usepackage[T1]{fontenc}
\usepackage[firstpage, anchor=tr, color=red,
pos={\dimexpr\paperwidth-5mm, 5mm},
@@ -588,20 +647,61 @@
% \iffalse
%</samplecode-anchor>
% \fi
-% \makeatletter \c@CodelineNo\z@ \makeatother
+%
+% Another interesting possibility of the modern interface derives from the
+% fact that the positioning and anchoring options are re-evaluated for
+% every page. This allows the positioning to dynamically change following
+% other parameters (for instance the |\paperwidth|) or to take advantage
+% of conditionals to achieve effects such as differentiating the watermark
+% for odd and even pages, as shown in the following code:
+% \iffalse
+%<*samplecode-dynamic>
+% \fi
+% \begin{macrocode}
+\documentclass{article}
+\usepackage[svgnames]{xcolor}
+\usepackage[T1]{fontenc}
+\usepackage[color=red, fontsize=32pt]{draftwatermark}
+\usepackage{mathptmx}
+\usepackage{lipsum}
+\title{Sample document for the draftwatermark package}
+\author{}
+
+\DraftwatermarkOptions{%
+ angle=0,
+ text={\ifodd\thepage ODD\else EVEN\fi},
+ hpos={\ifodd\thepage \dimexpr\paperwidth-5mm\else 5mm\fi},
+ vpos=5mm,
+ vanchor=t,
+ hanchor={\ifodd\thepage r\else l\fi}
+}
+
+\begin{document}
+\maketitle
+
+\section{One}
+\lipsum[1-3]
+
+\section{Two}
+\lipsum[4-6]
+
+\end{document}
+% \end{macrocode}
+% \iffalse
+%</samplecode-dynamic>
+% \fi
%
% \subsection{Maximum freedom with a custom watermarking command}
%
-% As a final example, see how maximum freedom can be obtained with a
-% custom watermarking command. The following document source lets one have
-% a watermark on the top right corner of odd pages and on the top left
-% corner of even pages.
-% \iffalse
+% Maximum freedom can be obtained with a custom watermarking command. The
+% following example shows how it can be used, once again differentiating
+% the watermark for odd and even pages.
+%\iffalse
%<*samplecode-custom>
% \fi
% \begin{macrocode}
\documentclass{article}
-\usepackage[named]{xcolor}
+\usepackage[svgnames]{xcolor}
\usepackage[T1]{fontenc}
\usepackage{draftwatermark}
\usepackage{mathptmx}
@@ -636,7 +736,6 @@
% \iffalse
%</samplecode-custom>
% \fi
-% \makeatletter \c@CodelineNo\z@ \makeatother
%
%
% \section{Development and support}
@@ -650,20 +749,10 @@
% requests that, from the present document, would evidently require moving
% against some fundamental design decisions.
%
-% \section{Changelog}
-%
-% \begin{description}
-% \item[1.0 - 2006/06/30] Initial version.
-% \item[1.1 - 2012/01/06] Add support for colored watermarks; options to
-% disable watermarking; many small fixes in the documentation.
-% \item[1.2 - 2015/02/19] Add support for watermark position.
-% \item[2.0 - 2020/03/08] Configuration management overhaul; introduction
-% of a legacy interface for compatibility.
-% \end{description}
-%
% \StopEventually {}
%
% \section{Implementation}
+% \subsection{Implementation of \Lpack{draftwatermark}}
%
% Announce the name and version of the package, which requires
% \LaTeXe.
@@ -673,7 +762,277 @@
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{draftwatermark}%
- [2020/03/14 2.0 Put a gray textual watermark on document pages]
+ [2020/12/08 3.0 Put a gray textual watermark on document pages]
+% \end{macrocode}
+% \changes{R3.0}{2020/12/08}{Automatically load legacy code for older
+% \hologo{LaTeX} formats.}^^A
+% Depending on the actual functionalities provided by \hologo{LaTeX}
+% consider loading \Lpack{draftwatermark-2x}. If so doing, warn about this,
+% and hand over the operation to that package.
+% \begin{macrocode}
+\@ifundefined{AddToHook}{%
+ \PackageWarningNoLine{draftwatermark}{%
+ You appear to be running a version of LaTeX\MessageBreak
+ unsupported by current draftwatermark.\MessageBreak
+ Forcing fallback to `draftwatermark-2x` that\MessageBreak
+ uses an older code base}%
+ \RequirePackageWithOptions{draftwatermark-2x}%
+ \endinput}{}
+% \end{macrocode}
+%
+% Require the needed packages.
+% \begin{macrocode}
+\RequirePackage{kvoptions}
+\RequirePackage{graphicx}
+\RequirePackage{color}
+% \end{macrocode}
+%
+% Define the configuration options and default values.
+% \begin{macrocode}
+\DeclareBoolOption[false]{firstpageonly}
+\define@key{draftwatermark}{firstpage}[true]{%
+ \csname draftwatermark@firstpageonly#1\endcsname}
+\DeclareBoolOption[true]{stamp}
+\DeclareComplementaryOption{nostamp}{stamp}
+\DeclareComplementaryOption{final}{stamp}
+\DeclareStringOption[45]{angle}
+\DeclareStringOption[1]{scale}
+\DeclareStringOption[DRAFT]{text}
+\DeclareStringOption[0.5\paperwidth]{hpos}
+\DeclareStringOption[0.5\paperheight]{vpos}
+\DeclareStringOption[0.25\paperwidth]{fontsize}
+\DeclareStringOption[gray]{colormodel}
+\DeclareStringOption[0.8]{colorspec}
+\DeclareStringOption[c]{hanchor}
+\DeclareStringOption[m]{vanchor}
+\DeclareStringOption[c]{alignment}
+\DeclareStringOption[\DraftwatermarkStdMark]{markcmd}
+\define@key{draftwatermark}{pos}{%
+ \draftwatermark@processpos #1\@nil}
+\define@key{draftwatermark}{anchor}{%
+ \draftwatermark@processanchor{#1}}
+\define@key{draftwatermark}{color}{%
+ \draftwatermark@processcolor #1\@nil}
+% \end{macrocode}
+%
+% Set up some helper marcros to process the options. These should be
+% rather self-explanatory.
+% \begin{macrocode}
+\def\draftwatermark@processpos#1,#2\@nil{%
+ \def\draftwatermark@hpos{#1}%
+ \def\draftwatermark@vpos{#2}}
+
+\def\draftwatermark@processanchor#1{%
+ \def\draftwatermark@tempa{#1}
+ \@onelevel@sanitize \draftwatermark@tempa
+ \expandafter \@tfor \expandafter \draftwatermark@tempb
+ \expandafter :\expandafter =\draftwatermark@tempa
+ \do
+ {%
+ \if \draftwatermark@tempb l%
+ \def \draftwatermark@hanchor{l}%
+ \else \if \draftwatermark@tempb c%
+ \def \draftwatermark@hanchor{c}%
+ \else \if \draftwatermark@tempb r%
+ \def \draftwatermark@hanchor{r}%
+ \else \if \draftwatermark@tempb t%
+ \def \draftwatermark@vanchor{t}%
+ \else \if \draftwatermark@tempb m%
+ \def \draftwatermark@vanchor{m}%
+ \else \if \draftwatermark@tempb b%
+ \def \draftwatermark@vanchor{b}
+ \else
+ \PackageError{draftwatermark}{%
+ Illegal anchor directive `\draftwatermark@tempb'}%
+ {Directive has been ingnored.}%
+ \fi\fi\fi\fi\fi\fi
+ }}
+
+\def\draftwatermark@processcolor{%
+ \@ifnextchar[
+ \draftwatermark@processcolor@ii\draftwatermark@processcolor@i}
+
+\def\draftwatermark@processcolor@i#1\@nil{%
+ \def\draftwatermark@colormodel{}%
+ \def\draftwatermark@colorspec{#1}}
+
+\def\draftwatermark@processcolor@ii[#1]#2\@nil{%
+ \def\draftwatermark@colormodel{#1}%
+ \def\draftwatermark@colorspec{#2}}
+
+% \end{macrocode}
+%
+% Process the package options\dots
+% \begin{macrocode}
+\ProcessKeyvalOptions*
+% \end{macrocode}
+%
+% \dots\, and then disable the |firstpageonly| and |firstpage| options,
+% that can only be used at the package loading time.
+% \begin{macrocode}
+\DisableKeyvalOption{draftwatermark}{firstpageonly}
+\DisableKeyvalOption{draftwatermark}{firstpage}
+
+% \end{macrocode}
+%
+% \begin{macro}{\DraftwatermarkOptions}
+% Set up a command to modify the configuration as needed.
+% \begin{macrocode}
+\newcommand\DraftwatermarkOptions[1]{\setkeys{draftwatermark}{#1}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% Introduce the legacy interface.
+% \begin{macro}{\SetWatermarkAngle}
+% Legacy command to set the rotation angle for the standard watermark
+% \begin{macrocode}
+\newcommand\SetWatermarkAngle[1]{\DraftwatermarkOptions{angle=#1}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SetWatermarkFontSize}
+% Legacy command to set the font size for the standard watermark
+% \begin{macrocode}
+\newcommand\SetWatermarkFontSize[1]{\DraftwatermarkOptions{fontsize=#1}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SetWatermarkScale}
+% Legacy command to set the scale for the standard watermark
+% \begin{macrocode}
+\newcommand\SetWatermarkScale[1]{\DraftwatermarkOptions{scale=#1}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SetWatermarkHorCenter}
+% \begin{macro}{\SetWatermarkVerCenter}
+% Legacy commands to set the horizontal and vertical position for the
+% standard watermark, also forcing it to be centered there.
+% \begin{macrocode}
+\newcommand\SetWatermarkHorCenter[1]{%
+ \DraftwatermarkOptions{hpos=#1, hanchor=c}}
+\newcommand\SetWatermarkVerCenter[1]{%
+ \DraftwatermarkOptions{vpos=#1, vanchor=m}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\SetWatermarkText}
+% \changes{R2.3}{2020/12/06}{Fix legacy interface to accept
+% text including commas.}^^A
+% Legacy command to set the text of the standard watermark
+% \begin{macrocode}
+\newcommand\SetWatermarkText[1]{\DraftwatermarkOptions{text={#1}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SetWatermarColor}
+% \begin{macro}{\SetWatermarkLightness}
+% Legacy commands to set the color for the
+% standard watermark.
+% \begin{macrocode}
+\newcommand\SetWatermarkColor[2][]{%
+ \DraftwatermarkOptions{colormodel=#1, colorspec=#2}}
+\newcommand\SetWatermarkLightness[1]{%
+ \DraftwatermarkOptions{colormodel=gray, colorspec=#1}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\DraftwatermarkStdMark}
+% The command to generate the standard watermark
+% \changes{R2.2}{2020/06/29}{Wrap watermark text in a shortstack to make
+% line breaks possible.}
+% \begin{macrocode}
+\newcommand\DraftwatermarkStdMark{%
+ \rotatebox{\draftwatermark@angle}{%
+ \scalebox{\draftwatermark@scale}{%
+ \begingroup
+ \ifx\draftwatermark@colormodel\@empty
+ \color{\draftwatermark@colorspec}%
+ \else
+ \color[\draftwatermark@colormodel]{\draftwatermark@colorspec}%
+ \fi
+ \setlength{\@tempdima}{\draftwatermark@fontsize}%
+ \fontsize{\@tempdima}{1.2\@tempdima}\selectfont
+ \shortstack[\draftwatermark@alignment]{\draftwatermark@text}%
+ \endgroup}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% The code to actually print the watermark
+% \begin{macrocode}
+\newcommand\draftwatermark@printwm[1]{%
+ \sbox\@tempboxa{\raisebox{\depth}{#1}}%
+ \setlength{\@tempdima}{\draftwatermark@hpos}%
+ \setlength{\@tempdimb}{-\draftwatermark@vpos}%
+ \edef \draftwatermark@tempa{\draftwatermark@hanchor}%
+ \@onelevel@sanitize \draftwatermark@tempa
+ \expandafter\def\expandafter\draftwatermark@tempb
+ \expandafter{\expandafter\@car \draftwatermark@tempa\@nil}%
+ \if \draftwatermark@tempb r%
+ \addtolength\@tempdima{-\wd\@tempboxa}%
+ \else\if \draftwatermark@tempb c%
+ \addtolength\@tempdima{-0.5\wd\@tempboxa}%
+ \else\if \draftwatermark@tempb l%
+ \relax
+ \else
+ \PackageError{draftwatermark}{%
+ Illegal anchor directive `\draftwatermark@tempb'}%
+ {Anchoring to left side.}%
+ \fi\fi\fi
+ \edef \draftwatermark@tempa{\draftwatermark@vanchor}%
+ \@onelevel@sanitize \draftwatermark@tempa
+ \expandafter\def\expandafter\draftwatermark@tempb
+ \expandafter{\expandafter\@car \draftwatermark@tempa\@nil}%
+ \if \draftwatermark@tempb b%
+ \relax
+ \else\if \draftwatermark@tempb m%
+ \addtolength\@tempdimb{-0.5\ht\@tempboxa}%
+ \else\if \draftwatermark@tempb t%
+ \addtolength\@tempdimb{-\ht\@tempboxa}%
+ \else
+ \PackageError{draftwatermark}{%
+ Illegal anchor directive `\draftwatermark@tempb'}%
+ {Anchoring to top side.}%
+ \fi\fi\fi
+ \put(\@tempdima,\@tempdimb){\usebox\@tempboxa}%
+}
+
+% \end{macrocode}
+%
+% A wrapper to make the watermark printing conditional
+% \begin{macrocode}
+\newcommand\draftwatermark@print[1]{%
+ \ifdraftwatermark@stamp
+ \draftwatermark@printwm{#1}%
+ \fi}
+% \end{macrocode}
+%
+% \dots\, and finally the code to set up the \Lpack{everypage} hooks to
+% assure that the watermark printing commands are called when needed
+% \begin{macrocode}
+\ifdraftwatermark@firstpageonly
+ \AddToHookNext{shipout/background}{%
+ \draftwatermark@print{\draftwatermark@markcmd}}%
+\else
+ \AddToHook{shipout/background}{%
+ \draftwatermark@print{\draftwatermark@markcmd}}%
+\fi
+% \end{macrocode}
+% \iffalse
+%</draftwatermark>
+% \fi
+%
+% \subsection{Implementation of \Lpack{draftwatermark-2x}}
+%
+% Announce the name and version of the package, which requires
+% \LaTeXe.
+% \iffalse
+%<*draftwatermark-2x>
+% \fi
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{draftwatermark}%
+ [2020/12/06 2.3 Put a gray textual watermark on document pages]
% \end{macrocode}
%
@@ -685,6 +1044,11 @@
\RequirePackage{color}
% \end{macrocode}
+% Set up options and assumptions for the \Lpack{kvoptions} package
+% \begin{macrocode}
+\SetupKeyvalOptions{family=draftwatermark, prefix=draftwatermark@}
+
+% \end{macrocode}
%
% Define the configuration options and default values.
% \begin{macrocode}
@@ -704,6 +1068,7 @@
\DeclareStringOption[0.8]{colorspec}
\DeclareStringOption[c]{hanchor}
\DeclareStringOption[m]{vanchor}
+\DeclareStringOption[c]{alignment}
\DeclareStringOption[\DraftwatermarkStdMark]{markcmd}
\define@key{draftwatermark}{pos}{%
\draftwatermark@processpos #1\@nil}
@@ -814,9 +1179,11 @@
% \end{macro}
% \end{macro}
% \begin{macro}{\SetWatermarkText}
+% \changes{R2.3}{2020/12/06}{Fix legacy interface to accept
+% text including commas.}^^A
% Legacy command to set the text of the standard watermark
% \begin{macrocode}
-\newcommand\SetWatermarkText[1]{\DraftwatermarkOptions{text=#1}}
+\newcommand\SetWatermarkText[1]{\DraftwatermarkOptions{text={#1}}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\SetWatermarColor}
@@ -847,7 +1214,7 @@
\fi
\setlength{\@tempdima}{\draftwatermark@fontsize}%
\fontsize{\@tempdima}{1.2\@tempdima}\selectfont
- \draftwatermark@text
+ \shortstack[\draftwatermark@alignment]{\draftwatermark@text}%
\endgroup}}}
% \end{macrocode}
@@ -859,10 +1226,10 @@
\sbox\@tempboxa{#1}%
\setlength{\@tempdima}{\draftwatermark@hpos}%
\setlength{\@tempdimb}{\draftwatermark@vpos}%
- \let \draftwatermark@tempa \draftwatermark@hanchor
+ \edef \draftwatermark@tempa{\draftwatermark@hanchor}%
\@onelevel@sanitize \draftwatermark@tempa
\expandafter\def\expandafter\draftwatermark@tempb
- \expandafter{\expandafter\@car \draftwatermark@tempa\@nil}
+ \expandafter{\expandafter\@car \draftwatermark@tempa\@nil}%
\if \draftwatermark@tempb r%
\addtolength\@tempdima{-\wd\@tempboxa}%
\else\if \draftwatermark@tempb c%
@@ -874,10 +1241,10 @@
Illegal anchor directive `\draftwatermark@tempb'}%
{Anchoring to left side.}%
\fi\fi\fi
- \let \draftwatermark@tempa \draftwatermark@vanchor
+ \edef \draftwatermark@tempa{\draftwatermark@vanchor}%
\@onelevel@sanitize \draftwatermark@tempa
\expandafter\def\expandafter\draftwatermark@tempb
- \expandafter{\expandafter\@car \draftwatermark@tempa\@nil}
+ \expandafter{\expandafter\@car \draftwatermark@tempa\@nil}%
\if \draftwatermark@tempb b%
\addtolength\@tempdimb{-\ht\@tempboxa}%
\addtolength\@tempdimb{-\dp\@tempboxa}%
@@ -891,7 +1258,7 @@
Illegal anchor directive `\draftwatermark@tempb'}%
{Anchoring to top side.}%
\fi\fi\fi
- \vbox to 0pt {
+ \vbox to 0pt {%
\vspace*{-1in}%
\vspace*{\@tempdimb}%
\hbox to 0pt {%
@@ -920,30 +1287,31 @@
\AddEverypageHook{\draftwatermark@print{\draftwatermark@markcmd}}
\fi
% \end{macrocode}
-
-
% \iffalse
-%</draftwatermark>
+%</draftwatermark-2x>
% \fi
%
+%
% \Finale
+% \PrintChanges
+% \pagebreak[1]
% \PrintIndex
%
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
\endinput
%%% Local Variables:
diff --git a/Master/texmf-dist/source/latex/draftwatermark/draftwatermark.ins b/Master/texmf-dist/source/latex/draftwatermark/draftwatermark.ins
index f1ec2f8ded5..151fcec0a01 100644
--- a/Master/texmf-dist/source/latex/draftwatermark/draftwatermark.ins
+++ b/Master/texmf-dist/source/latex/draftwatermark/draftwatermark.ins
@@ -1,5 +1,5 @@
%% draftwatermark.ins
-%% Copyright 2006
+%% Copyright 2006-2020
%% Sergio Callegari <sergio.callegari@gmail.com>
%%
%% ---------------------------------------------
@@ -7,15 +7,16 @@
%% a contribution to the LaTeX2e system.
%% ---------------------------------------------
%%
-%% It may be distributed and/or modified under the conditions of the
-%% LaTeX Project Public License, either version 1.3 of this licence, or
-%% any later version. The latest version of this license is at
-%% http://www.latex-project.org/lppl.txt and version 1.3 is part
-%% of all distributions of LaTeX version 2003/06/01 or later.
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, version 1.3c.
+%% This license is in
+%% https://www.latex-project.org/lppl/lppl-1-3c/
+%% and is part of all distributions of LaTeX later than
+%% 2008-05-04.
%%
-%% This work has the LPPL maintenance status "author-maintained".
+%% This work has the LPPL maintenance status "maintained".
%%
-%% This program consists of the files listed in the README file
+%% This program consists of the files listed in the README.md file
%% included in the package.
%%
%% This file will generate fast loadable files and documentation
@@ -36,42 +37,47 @@
Copyright 2006, 2020
Sergio Callegari <sergio.callegari@gmail.com>
----------------------------------------------
+------------------------------------------------
This file is part of the draftwatermark package,
a contribution to the LaTeX2e system.
----------------------------------------------
+------------------------------------------------
-This program consists of the files listed in the README file included
+This program consists of the files listed in the README.md file included
in the package.
Any modified versions of this file must be renamed with new filenames
-distinct from draftwatermark.sty.
+distinct from \outFileName.
-For distribution of the original source see the terms
-for copying and modification in the file draftwatermark.dtx.
+For distribution of the original source see the terms for copying and
+modification in the file \inFileName.
-This generated file may be distributed as long as the
-original source files, as listed above, are part of the
-same distribution. (The sources need not necessarily be
-in the same archive or directory.)
+This generated file may be distributed as long as the original source files,
+as listed above, are part of the same distribution. (The sources need not
+necessarily be in the same archive or directory.)
\endpreamble
\Msg{*** Generating the LaTeX2e package files ***}
+\usedir{tex/latex/draftwatermark}
\generate{\file{draftwatermark.sty}{%
- \from{draftwatermark.dtx}{draftwatermark}}}
+ \from{draftwatermark.dtx}{draftwatermark}}}
+\generate{\file{draftwatermark-2x.sty}{%
+ \from{draftwatermark.dtx}{draftwatermark-2x}}}
\preamble
\endpreamble
\Msg{*** Generating the example files ***}
-\generate{\file{test_draftwatermark1.tex}{%
+\usedir{doc/latex/draftwatermark/examples}
+\generate{\file{test_draftwatermark-1.tex}{%
\from{draftwatermark.dtx}{samplecode-modern}}}
-\generate{\file{test_draftwatermark2.tex}{%
+\generate{\file{test_draftwatermark-2.tex}{%
\from{draftwatermark.dtx}{samplecode-legacy}}}
-\generate{\file{test_draftwatermark3.tex}{%
+\generate{\file{test_draftwatermark-3.tex}{%
\from{draftwatermark.dtx}{samplecode-anchor}}}
-\generate{\file{test_draftwatermark4.tex}{%
+\generate{\file{test_draftwatermark-4.tex}{%
+ \from{draftwatermark.dtx}{samplecode-dynamic}}}
+\generate{\file{test_draftwatermark-5.tex}{%
\from{draftwatermark.dtx}{samplecode-custom}}}
%\ReportTotals
@@ -84,14 +90,18 @@ in the same archive or directory.)
\Msg{* \space\space draftwatermark.sty}
\Msg{*}
\Msg{*}
-\Msg{* To produce the documentation run draftwatermark.dtx}
-\Msg{* through LaTeX (or maybe pdfLaTeX).}
+\Msg{* To produce the documentation:
+run draftwatermark.dtx}
+\Msg{* - run draftwatermark.dtx through LaTeX}
\Msg{* Process draftwatermark.idx file by:}
\Msg{* \space\space\space\space makeindex -s gind.ist draftwatermark}
-%\Msg{* Process draftwatermark.glo file by:}
-%\Msg{* \space\space\space\space makeindex -s gglo.ist -o draftwatermark.gls
-% draftwatermark.glo}
+\Msg{* Process draftwatermark.glo file by:}
+\Msg{* \space\space\space\space makeindex -s gglo.ist -o draftwatermark.gls
+ draftwatermark.glo}
\Msg{* Re run through LaTeX the draftwatermark.dtx file as necessary}
+\Msg{* You may then want to move the test_draftwatermark*.tex files produced by}
+\Msg{* processing this ins file together with the documentation (e.g., in an}
+\Msg{* examples subdirectory}
\Msg{*}
\Msg{***********************************************************}
diff --git a/Master/texmf-dist/source/latex/ducksay/ducksay.dtx b/Master/texmf-dist/source/latex/ducksay/ducksay.dtx
index 9dbc8945628..0c2704d8da6 100644
--- a/Master/texmf-dist/source/latex/ducksay/ducksay.dtx
+++ b/Master/texmf-dist/source/latex/ducksay/ducksay.dtx
@@ -202,8 +202,8 @@ and the derived files ducksay.pdf
\NeedsTeXFormat{LaTeX2e}
\RequirePackage{xparse,l3keys2e}
-\def\ducksay@version{2.5}
-\def\ducksay@date{2020-02-01}
+\def\ducksay@version{2.5a}
+\def\ducksay@date{2020-10-29}
\ProvidesExplPackage
{ducksay} {\ducksay@date}
@@ -249,6 +249,24 @@ and the derived files ducksay.pdf
% \tiny
% \hfill
% \ducksay
+% [sheep,MSG=\footnotesize,t,body-align=c,msg-align=c,body-mirrored]
+% {Give credit\\where credit is due!}
+% }^^A=<<
+% \section{Acknowledgements}%
+% \begingroup
+% \scriptsize
+% \DucksayOptions{MSG=\normalsize}
+% \ducksay[sheep]{I was created by Plergux!\footnotemark}
+% \footnotetext
+% {\url{https://chat.stackexchange.com/transcript/message/55986902\#55986902}}
+% \endgroup
+% \clearpage
+%
+% \marginpar^^A>>=
+% {
+% \tiny
+% \hfill
+% \ducksay
% [knight,MSG=\footnotesize,t,body-align=r,msg-align=c]
% {Just beest mod'rn,\\thee peasant!}
% }^^A=<<
@@ -936,14 +954,8 @@ and the derived files ducksay.pdf
% {%
% \tiny
% \hfill
-% \ducksay[snake,MSG=\footnotesize]{I'm zsse\\new one.}\\[\medskipamount]
-% \duckthink[cat,MSG=\footnotesize,body-mirrored,body-to-msg=hc,msg-align=c]
-% {I sneaked\\in, too.}\\[\medskipamount]
-% \duckthink[sleepy-cat,MSG=\footnotesize,msg-align=c]
-% {Better make a quick\\catnap, sneaking is\\tiring.}\\[\medskipamount]
-% \rlap{\kern-1em\ducksay[schroedinger-alive,no-bubble,body-mirrored,b]{}}
-% \ducksay[schroedinger-dead,MSG=\footnotesize,msg-align=c,body-align=r,b]
-% {Hadn't you opened\\the documentation!}
+% \ducksay[sheep,MSG=\footnotesize,msg-align=c]
+% {I'm woolly,\\I'm fluffy,\\and I'm all new!}
% }
% The following animals are provided by this package. I did not create them (but
% altered some), they belong to their original creators.
@@ -970,6 +982,7 @@ and the derived files ducksay.pdf
% ,hedgehog^^A
% ,kangaroo^^A
% ,dog^^A
+% ,sheep^^A
% ,rabbit^^A
% ,snail^^A
% ,whale^^A
@@ -2690,6 +2703,17 @@ and the derived files ducksay.pdf
\ \ , / |
|| |-_\__ /
((_/`(____,-'}
+%^^A provided by Plergux
+%^^A (https://chat.stackexchange.com/transcript/message/55986902#55986902)
+\AddAnimal{sheep}
+{ \ _,_,_,_,_,
+ \ .:( ,) ),
+ (__, (, ),
+ / o ( ,) ,) )>
+ (___(, (, ,)
+ (, ,) ,)
+ `-_,---_,-'
+ || ||}
%</animals>
% \end{macrocode}^^A=<<
%^^A%^^A https://www.asciiart.eu/mythology/fairies
diff --git a/Master/texmf-dist/source/latex/easyfloats/easyfloats.dtx b/Master/texmf-dist/source/latex/easyfloats/easyfloats.dtx
new file mode 100644
index 00000000000..eea9932e40c
--- /dev/null
+++ b/Master/texmf-dist/source/latex/easyfloats/easyfloats.dtx
@@ -0,0 +1,1897 @@
+% easyfloats.dtx
+% Copyright 2020 E. Zöllner
+%
+% 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
+% http://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 E. Zöllner.
+%
+% This work consists of the files listed in easyfloats-file-list.txt.
+% The official git repository is https://gitlab.com/erzo/latex-easyfloats
+
+
+% dtx files (documented tex files) allow "to put the user documentation,
+% code documentation and code itself in one place."
+% https://www.texdev.net/2009/10/05/the-dtx-format/
+% see also
+% https://www.texdev.net/2009/10/06/a-model-dtx-file/
+% https://ctan.org/pkg/dtxtut
+%
+% This file is a lot simpler, it contains nothing but the package code with comments.
+% Technically it could be used instead of the sty file.
+% easyfloats.ins reads this file, strips comments and indentation using docstrip
+% and writes the result to the sty file in order to make it faster.
+
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{easyfloats}[2020/12/20 v1.0.0]
+
+
+% ========== options ==========
+
+% load either graphicx or graphbox
+\newif\ifesf@loadgraphics
+% load graphbox
+\newif\ifesf@loadgraphbox
+% load longtable
+\newif\ifesf@loadlongtable
+% load array
+\newif\ifesf@loadarray
+% load booktabs
+\newif\ifesf@loadbooktabs
+% print a warning if figure or table is used directly
+\newif\ifesf@warnstandardfloats
+\esf@warnstandardfloatstrue
+
+\DeclareOption{graphicx}{%
+ \esf@loadgraphicstrue
+ \esf@loadgraphboxfalse
+}
+\DeclareOption{graphbox}{%
+ \esf@loadgraphicstrue
+ \esf@loadgraphboxtrue
+}
+\DeclareOption{nographic}{%
+ \esf@loadgraphicsfalse
+ \esf@loadgraphboxfalse
+}
+
+\DeclareOption{longtable}{%
+ \esf@loadlongtabletrue
+}
+\DeclareOption{nolongtable}{%
+ \esf@loadlongtablefalse
+}
+
+\DeclareOption{booktabs}{%
+ \esf@loadbooktabstrue
+}
+\DeclareOption{nobooktabs}{%
+ \esf@loadbooktabsfalse
+}
+
+\DeclareOption{array}{%
+ \esf@loadarraytrue
+}
+\DeclareOption{noarray}{%
+ \esf@loadarrayfalse
+}
+
+% If I spell this with spaces LaTeX complains:
+% > Unknown option `allowstandardfloats'
+% It seems spaces are ignored by \usepackage
+% but not by \DeclareOption.
+% clsguide says:
+% > Note that the name of an option should contain
+% > only those characters allowed in a ‘LaTeX name’
+% So maybe it's better to not rely on that behaviour.
+\DeclareOption{allowstandardfloats}{%
+ \esf@warnstandardfloatsfalse
+}
+
+%\DeclareOption*{\objectset{\CurrentOption}}
+
+
+\ExecuteOptions{graphicx, array, booktabs}
+
+% \relax is in definition order, starred is in specification order
+\ProcessOptions\relax
+
+
+% ========== required packages ==========
+
+\RequirePackage{etoolbox}
+\RequirePackage{pgfkeys}
+
+% The float package defines the placement option H so that I don't need to
+% provide a separate inline/floating option and deal with spacing and captions
+% of inline objects. I can just use the usual environments like always.
+% It also defines float styles which move the caption to the top or bottom of
+% the object. It makes things easier for me because I can just insert the
+% caption somewhere independent of the object type.
+% I am *not* making use of it's capability to define new float types.
+% Please note that \floatplacement is overridden if the placement option is non-empty.
+\RequirePackage{float}
+
+% By default there is no space between a table and it's caption (at least with
+% the standard document classes). The caption package fixes this.
+% The caption package defines the \phantomcaption command (see object environment).
+% The caption package is required by the subcaption package.
+% It also gives the possibility to customize the layout of captions. But I am
+% leaving it to the user to do this if desired.
+\RequirePackage{caption}
+
+% subobjects
+\RequirePackage{environ}
+
+% "Die Pakete subfigure.sty und subfig.sty werden nicht mehr weiterentwickelt
+% und sind inkompatibel zu einigen aktuelleren Paketen wie hyperref.sty.
+% Als Ersatz bei Kompatibilitätsproblemen empfiehlt sich subcaption.sty."
+% (l2tabu, Version 2.4 vom 3. Februar 2016, Seite 16)
+\RequirePackage{subcaption}
+
+% \includegraphics
+\ifesf@loadgraphics
+ \ifesf@loadgraphbox
+ % extension for graphicx
+ \RequirePackage{graphbox}
+ \else
+ \RequirePackage{graphicx}
+ \fi
+\fi
+
+% Set long tables which are not floating
+% but can span across page breaks.
+% Requires several runs.
+\ifesf@loadlongtable
+ \RequirePackage{longtable}
+\fi
+
+% Additional features in column specification like <, >, !.
+% Changes also the behaviour of rules but that is irrelevant if you use booktabs.
+\ifesf@loadarray
+ \RequirePackage{array}
+\fi
+
+% Macros for formating tables.
+\ifesf@loadbooktabs
+ \RequirePackage{booktabs}
+\fi
+
+
+% ========== init ==========
+
+\newif\ifobject@directkeys
+\object@directkeystrue
+
+\newif\if@inobject
+\newif\if@firstsubobject
+\newif\if@containssubobjects
+
+\floatstyle{plaintop}
+\restylefloat{table}
+\floatstyle{plain}
+\restylefloat{figure}
+
+
+% ========== hooks ==========
+
+\newif\ifobject@isgraphic
+
+\newcommand{\object@hook}{}
+\newcommand{\subobject@hook}{}
+\newcommand{\object@graphic@hook}{}
+
+\newrobustcmd{\AtBeginObject}[1]{\appto\object@hook{#1}}
+\newrobustcmd{\AtBeginSubobject}[1]{\appto\subobject@hook{#1}}
+\newrobustcmd{\AtBeginGraphicObject}[1]{\appto\object@graphic@hook{#1}}
+
+
+% ========== key management ==========
+
+\newcommand{\esf@ifpgfkeyhasvalue}[1]{% #1: key, #2: executed if #1 is set, #3: executed if #1 has not been set
+ % WARNING: Trying to get the value defines the key to \relax if it
+ % was undefined (because of \csname). Setting the key to \relax is
+ % discouraged because it causes inconsistent behaviour [TikZ & PGF
+ % Manual v3.1.5b page 976 \pgfkeysifdefined].
+ % With eTeX: \pgfkeysifdefined will report the key as *defined*.
+ % Without eTeX: \pgfkeysifdefined will report the key as *un*defined.
+ % Therefore don't use this macro with undefined keys. If you do use
+ % it with an undefined key it will be treated as if it has been set [!].
+ \pgfkeysgetvalue{#1}{\esf@tmp@value}%
+ \ifx \pgfkeysnovalue@text \esf@tmp@value
+ \expandafter \@secondoftwo
+ \else
+ \expandafter \@firstoftwo
+ \fi
+}
+
+\newcommand{\esf@ifpgfkeyexists}[3]{%
+ % I cannot use \@firstoftwo and \@secondoftwo because \pgfkeysifdefined
+ % does not close the if statement before expanding the 2nd and 3rd argument
+ \pgfkeysifdefined{#1}
+ {#2}
+ {\pgfkeysifdefined{#1/.@cmd}{#2}{#3}}%
+}
+\newcommand{\esf@ifpgfkeyrequiresvalue}[3]{% #1: key, #2: then block, #3: else block
+ \pgfkeysifdefined{#1/.@def}{%
+ \pgfkeysgetvalue{#1/.@def}{\esf@tmp@value}%
+ \ifx \esf@tmp@value \pgfkeysvaluerequired
+ #2%
+ \else
+ #3%
+ \fi
+ }{%
+ #3%
+ }%
+}
+
+\newcommand{\esf@ifkeyvalkeyexists}[4]{% #1: family, #2: key, #3: then block, #4: else block
+ % \ifcsdef would treat \relax as defined, \ifcsundef does not
+ \ifcsundef{KV@#1@#2}{#4}{#3}%
+}
+\newcommand{\esf@ifkeyvalkeyrequiresvalue}[2]{% #1: family, #2: key, #3: then block, #4: else block
+ % \ifcsdef would treat \relax as defined, \ifcsundef does not
+ \ifcsundef{KV@#1@#2@default}%
+}
+
+\newcommand{\esf@pgfkeyscopyvalue}[2]{% #1: key to be set, #2 key to take the value from
+ % WARNING: the order of arguments is opposite of the shell command cp
+ % because all pgf macros take the key they operate on as first argument.
+ \pgfkeysgetvalue{#2}{\esf@tmp@value}%
+ \pgfkeyslet{#1}{\esf@tmp@value}%
+}
+\newcommand{\esf@pgfkeysvalueappend}[2]{% #1: key to be set, #2 value to be appended
+ \pgfkeysgetvalue{#1}{\esf@tmp@value}%
+ \appto\esf@tmp@value{#2}%
+ \pgfkeyslet{#1}{\esf@tmp@value}%
+}
+
+\pgfqkeys{/handlers}{%
+ % ------- recommended -------
+ .esf@recommended/.code={%
+ \esf@ifpgfkeyhasvalue{\pgfkeyscurrentpath}{%
+ % do nothing
+ }{%
+ \edef\esf@tmp@path{\pgfkeyscurrentpath}%
+ \PackageWarning{easyfloats}{Recommended key '\strippath\esf@tmp@path' not given. #1\ifx\pgfkeysnovalue#1\@empty\else. \fi This warning occured}%
+ }%
+ },
+ %
+ % ------- mandatory -------
+ .esf@mandatory/.code={%
+ \esf@ifpgfkeyhasvalue{\pgfkeyscurrentpath}{%
+ % do nothing
+ }{%
+ \edef\esf@tmp@path{\pgfkeyscurrentpath}%
+ \PackageError{easyfloats}{Mandatory key '\strippath\esf@tmp@path' not given\ifx\pgfkeysnovalue#1\@empty\else. \fi #1}{}%
+ }%
+ },
+ %
+ %
+ % ------- save unknown -------
+ % I can't use /pgf/keyfilters/defined with /pgf/key filter handlers/append filtered to
+ % because that appends full keys which are incompatible with keyval.
+ .esf@exec on unknown/.code={% #1: control sequence taking two args: key and value
+ \pgfkeysalso{\pgfkeyscurrentpath/.unknown/.code=% ##1: value
+ #1{\pgfkeyscurrentname}{##1}%
+ }%
+ },
+ %
+ % ------- also from -------
+ .esf@also from/.code={% #1: expandable control sequence containing options
+ \pgfkeysalsofrom{#1}%
+ },
+ %
+ % ------- debugging -------
+ .show boolean/.code={%
+ \begingroup
+ \renewcommand\pgfkeys@handle@boolean[2]{% ##1: if name, ##2: value
+ \expandafter \show \csname if##1\endcsname
+ }%
+ \edef\esf@tmp@path{\pgfkeyscurrentpath}%
+ \pgfkeysalso{\esf@tmp@path}%
+ \endgroup
+ },
+ .show boolean/.value forbidden,
+}
+
+\newcommand{\AppendToOptionsList}[3]{% #1: macro to append to, #2: key, #3: value
+ \ifdefvoid#1%
+ {}%
+ {\appto#1{, }}%
+ \eappto#1{#2}%
+ \ifx \pgfkeysnovalue #3\relax
+ % do nothing
+ \else
+ \appto#1{={#3}}%
+ \fi
+}
+
+\newcommand{\strippath}[1]{%
+ \expandafter\strippath@do#1/\pgfeov
+}
+\def\strippath@do#1/#2\pgfeov{%
+ \if\relax\detokenize{#2}\relax
+ #1%
+ \else
+ \strippath@do#2\pgfeov
+ \fi
+}
+
+
+% ========== other helper ==========
+
+\newcommand{\IfEnvironmentExistsOrIsEmpty}[1]{% #1: environment name, #2: then block, #3: else block
+ \ifstrempty{#1}{%
+ \let\IfEnvironmentExistsOrIsEmpty@do=\@firstoftwo
+ }{\IfEnvironmentExists{#1}{%
+ \let\IfEnvironmentExistsOrIsEmpty@do=\@firstoftwo
+ }{%
+ \let\IfEnvironmentExistsOrIsEmpty@do=\@secondoftwo
+ }}%
+ \IfEnvironmentExistsOrIsEmpty@do
+}
+
+\newcommand{\IfEnvironmentExists}[3]{% #1: environment name, #2: then block, #3: else block
+ \ifcsmacro{#1}{%
+ % I am not checking the existence of end#1 because for tabularx that is \relax.
+ #2%
+ }{%
+ #3%
+ }%
+}
+
+
+% \patchcmd replaces the first occurence only.
+% therefore I am recursing as long as patching was successful
+% to make sure that each occurrence was replaced.
+% it is important to replace with \textunderscore instead of \_
+% because otherwise it would replace \_ by \\_ and loop infinitely.
+\newcommand{\PatchUnderscore}[1]{% #1: macro
+ \patchcmd{#1}
+ {_}{\textunderscore}
+ {\PatchUnderscore#1}{}%
+}
+
+
+% ========== object ==========
+
+\newif\ifobject@warnotherenv
+\newif\ifobject@warnnolabel
+\newif\ifobject@warnnocaption
+\newif\ifobject@showenv
+
+% ---------- set object options ----------
+
+\newrobustcmd{\objectset}{% #1: options
+ \@ifnextchar [%]
+ \objectset@appendtostyles
+ \objectset@direct
+}
+
+\newcommand{\objectset@direct}{% #1: options
+ \pgfqkeys{/object}%
+}
+
+\newcommand{\GobbleLeadingSpaceIn}[1]{\edef#1{\expandafter\@firstofone#1}}
+
+\def\objectset@appendtostyles[#1]#2{% #1: style #2: options
+ \pgfkeyssetvalue{/object.check/env}{}%
+ \pgfqkeys{/object.check}{%
+ .esf@exec on unknown=\AppendOptionToObjectStyleGroups{#1},
+ #2%
+ }%
+}
+
+% ---------- check object options ----------
+
+\newcommand{\CheckObjectOption}[2]{% #1: key, #2: value, #3: executed if valid
+ % if #3 is *not* executed an error message is printed
+ %
+ % It is important to reset it at the beginning
+ % because the \Check* macros do not expand any
+ % of the two arguments if they throw an error.
+ \let\CheckObjectOption@handleArg=\@gobble
+ \esf@ifpgfkeyexists{/object/#1}{%
+ \esf@ifpgfkeyrequiresvalue{/object/#1}{%
+ \ifx \pgfkeysnovalue #2\relax
+ \PackageError{easyfloats}{The key '#1' requires a value. I am going to ignore this key}{}%
+ \else
+ \let\CheckObjectOption@handleArg=\@firstofone
+ \fi
+ }{%
+ \let\CheckObjectOption@handleArg=\@firstofone
+ }%
+ }{\CheckObjectGraphicOption{#1}{#2}{%
+ \let\CheckObjectOption@handleArg=\@firstofone
+ }{\CheckObjectEnvArgs{#1}{#2}{%
+ \let\CheckObjectOption@handleArg=\@firstofone
+ }{%
+ \PackageError{easyfloats}{I do not know the key '#1' and I am going to ignore it. Perhaps you misspelled it}{}%
+ }}}%
+ \CheckObjectOption@handleArg
+}
+
+
+% ---------- available object options ----------
+
+\pgfqkeys{/object}{%
+ %
+ % ------- mandatory -------
+ %
+ % The environment to use (figure|table)
+ % An empty value is allowed for longtable
+ % but that is intentionally left undocumented.
+ type/.initial,
+ type/.value required,
+ type/.code=\@ifundefined{fps@#1}
+ {\PackageError{easyfloats}{Invalid value for key 'type': '#1'. I am going to ignore this option}{}}
+ {\pgfkeyssetvalue{/object/type}{#1}},
+ %
+ % Where to place the caption, see float package (plain|plaintop|ruled|boxed)
+ % If empty do *not* perform a restyle.
+ % This is ignored if type is empty.
+ float style/.initial=,
+ float style/.value required,
+ %
+ %
+ % ------- recommended -------
+ %
+ % The caption displayed above or below the content (depending on the float style).
+ % There is *no* dot added automatically behind it.
+ caption/.initial,
+ caption/.value required,
+ caption/.prefix code={%
+ \esf@ifpgfkeyhasvalue{/object/caption}{%
+ \PackageWarning{easyfloats}{Overwriting existing value for caption with "#1"}%
+ }{%
+ % ok
+ }%
+ },
+ %
+ % A label which can be referenced by e.g. \ref{label} or \refpage{label}
+ label/.initial,
+ label/.value required,
+ label/.prefix code={%
+ \esf@ifpgfkeyhasvalue{/object/label}{%
+ \PackageWarning{easyfloats}{Overwriting existing value for label with "#1"}%
+ }{%
+ % ok
+ }%
+ },
+ %
+ %
+ % ------- optional -------
+ %
+ % Where to put the float on the page ([htbp]+ | H | <empty>)
+ % (empty means to *not* pass the optional placement argument to the foating environment)
+ % This is more powerful than \floatplacement because it allows H.
+ placement/.initial=,
+ placement/.value required,
+ %
+ % The caption used in the list of figures/list of tables
+ list caption/.initial,
+ list caption/.value required,
+ %
+ % An addition to the caption (at the object only, not in a list)
+ details/.initial=,
+ details/.value required,
+ %
+ details sep/.initial=.\space,
+ details sep/.value required,
+ %
+ % An additional label which can be used synonymously to label.
+ % If this key is given several times, only the last one will have an effect.
+ add label/.initial,
+ add label/.value required,
+ %
+ % TeX code which is inserted at the beginning of the type environment
+ align/.initial=\centering,
+ align/.value required,
+ %
+ % TeX code which is inserted at the beginning of the type environment (before align)
+ exec/.initial=,
+ exec/.value required,
+ exec +/.code=\esf@pgfkeysvalueappend{/object/exec}{#1},
+ exec +/.value required,
+ exec+/.forward to=/object/exec +,
+ exec+/.value required,
+ %
+ % An additional inner environment to wrap the content in like tabular, tabularx, tikzpicture
+ env/.code=\IfEnvironmentExistsOrIsEmpty{#1}
+ {\pgfkeyssetvalue{/object/env}{#1}}%
+ {\PackageError{easyfloats}{Environment #1 which you passed to the key 'env' does not exist}{}},
+ env/.value required,
+ env=,
+ %
+ % Specify that this object contains subobjects.
+ % This means that if env has a non-empty value
+ % this value is used for subobject env
+ % and env is set to an empty value.
+ sub/.forward to=/object/contains subobjects,
+ contains subobjects/.is if = @containssubobjects,
+ %
+ %
+ % ------- tables -------
+ % first head and last foot are optional but if they are given they have priority.
+ % head and foot always need to have a value even if it's just empty.
+ %
+ first head/.initial,
+ first head/.value required,
+ %
+ head/.initial=,
+ head/.value required,
+ %
+ foot/.initial=,
+ foot/.value required,
+ %
+ last foot/.initial,
+ last foot/.value required,
+ %
+ table head style/.code=\pgfkeysdef{/object/table head}{\pgfqkeys{/object}{#1}},
+ table head style/.value required,
+ table head style={%
+ first head =
+ \toprule
+ #1 \\
+ \midrule,
+ head =
+ #1 \\
+ \midrule,
+ foot =
+ \midrule
+ \ifx\object@tableBreakText\@empty
+ \else
+ \multicolumn{\the\LT@cols}{r@\relax}{\object@tableBreakText}%
+ \fi,
+ last foot =
+ \bottomrule,
+ },
+ %
+ % text displayed in the non-last foot of a table
+ table break text/.code=\def\object@tableBreakText{#1},
+ table break text/.value required,
+ table break text = (to be continued),
+ %
+ %
+ % ------- warnings -------
+ %
+ warn no caption/.is if=object@warnnocaption,
+ warn no caption=true,
+ %
+ warn no label/.is if=object@warnnolabel,
+ warn no label=true,
+ %
+ warn other env/.is if=object@warnotherenv,
+ warn other env=false,
+ %
+ %
+ % ------- debugging -------
+ %
+ show env args/.is if=object@showenv,
+ show env args=false,
+ %
+ %
+ % ------- subobject -------
+ % .value required is code duplication but
+ % it is necessary for \esf@ifpgfkeyrequiresvalue.
+ % It also changes the error message to report
+ % this key instead of the linked key.
+ %
+ subobject linewidth/.forward to=/subobject/linewidth,
+ subobject linewidth/.value required,
+ subobject env/.forward to=/subobject/env,
+ subobject env/.value required,
+ %
+ subcaptionbox/.forward to=/subobject/subcaptionbox,
+ subcaptionbox/.value forbidden,
+ subpage/.forward to=/subobject/subpage,
+ subpage/.value forbidden,
+ %
+ subcaptionbox inner pos/.forward to=/subobject/subcaptionbox inner pos,
+ subcaptionbox inner pos/.value required,
+ %
+ subpage inner pos/.forward to=/subobject/subpage inner pos,
+ subpage inner pos/.value required,
+ subpage height/.forward to=/subobject/subpage height,
+ subpage height/.value required,
+ subpage outer pos/.forward to=/subobject/subpage outer pos,
+ subpage outer pos/.value required,
+ subpage align/.forward to=/subobject/subpage align,
+ subpage align/.value required,
+ %
+ subobject sep/.forward to=/subobject/sep,
+ subobject sep/.value required,
+ %
+ subobject hor/.forward to=/subobject/hor,
+ %subobject hor/ value is allowed but not necessary
+ subobject hor sep/.forward to=/subobject/hor sep,
+ subobject hor sep/.value required,
+ subobject hor sep+/.forward to=/subobject/hor sep+,
+ subobject hor sep+/.value required,
+ subobject hor sep +/.forward to=/subobject/hor sep +,
+ subobject hor sep +/.value required,
+ %
+ subobject ver/.forward to=/subobject/ver,
+ %subobject ver/ value is allowed but not necessary
+ subobject ver sep/.forward to=/subobject/ver sep,
+ subobject ver sep/.value required,
+ subobject ver sep+/.forward to=/subobject/ver sep+,
+ subobject ver sep+/.value required,
+ subobject ver sep +/.forward to=/subobject/ver sep +,
+ subobject ver sep +/.value required,
+ %
+ subobject exec/.forward to=/subobject/exec,
+ subobject exec/.value required,
+ subobject exec+/.forward to=/subobject/exec+,
+ subobject exec+/.value required,
+ subobject exec +/.forward to=/subobject/exec +,
+ subobject exec +/.value required,
+ %
+ subobject warn no caption/.forward to=/subobject/warn no caption,
+ %value is allowed but not necessary
+ subobject warn no label/.forward to=/subobject/warn no label,
+ %value is allowed but not necessary
+ %
+ %
+ % ------- unknown handler / key patterns -------
+ %
+ % Two key patterns are defined to automatically pass arguments to the environments specified by the env option if the environment name matches.
+ % `<envname> arg` is for a single mandatory (undelimited) argument. It is wrapped in braces.
+ % `<envname> args` is not wrapped in braces and can be used for several arguments or an optional argument.
+ % It cannot be used for a single mandatory argument because \pgfkeys strips several levels of braces.
+ .unknown/.code={%
+ \ObjectProcessKeyPattern{\pgfkeyscurrentname}{#1}{%
+ \pgfkeysgetvalue{/object/.really unknown/.@cmd}{\esf@tmp@err}%
+ \esf@tmp@err#1\pgfeov
+ }%
+ },
+ % Setting an unknown key handler shall not override env args but set an additional unknown handler.
+ .unknown/.code/.code={%
+ \pgfkeysdef{/object/.really unknown}{#1}%
+ },
+ .really unknown/.code={%
+ \edef\do{\noexpand\pgfkeys{/errors/unknown key={\pgfkeyscurrentkey}{\unexpanded{#1}}}}%
+ \do
+ },
+}
+
+\pgfqkeys{/object.check}{%
+ env/.initial=,
+ env/.code={%
+ \ifx \pgfkeysnovalue #1\relax
+ \PackageError{easyfloats}{The key 'env' requires a value. I am going to ignore this key}{}%
+ \else
+ \IfEnvironmentExistsOrIsEmpty{#1}{%
+ % set env so that I can use the value to check args
+ \pgfkeyssetvalue{/object.check/env}{#1}%
+ % call the unknown handler which appends it to the style
+ % unlike '/errors/unknown key' '.unknown' does not take the key as argument
+ % but it may require \pgfkeyscurrentpath and \pgfkeyscurrentname to be set
+ \pgfkeys@split@path
+ \pgfkeysvalueof{\pgfkeyscurrentpath/.unknown/.@cmd}#1\pgfeov
+ }{%
+ \PackageError{easyfloats}{Environment #1 which you passed to the key 'env' does not exist}{}%
+ }%
+ \fi
+ },
+ type/.code={%
+ % set type so that I can use the value in \NewObjectStyleGroup
+ \pgfkeyssetvalue{/object.check/type}{#1}%
+ % call the unknown handler which appends it to the style
+ % unlike '/errors/unknown key' '.unknown' does not take the key as argument
+ % but it may require \pgfkeyscurrentpath and \pgfkeyscurrentname to be set
+ \pgfkeys@split@path
+ % Without the braces I got "Undefined control sequence. [...] \pgfeov"
+ % \pgfkeys strips several levels of braces around an argument.
+ % (I have already experienced that while experimenting with <env> args.
+ % That is the reason why I defined two separate keys arg and args.)
+ % I am assuming that because of that the \pgfeov ended the argument of some
+ % pgfkeys internal macro too early causing undefined behavior.
+ % I am preventing this from happening by hiding \pgfeov inside of braces
+ % which are inside of the argument so they won't get stripped.
+ % I put \@firstofone in front of them so that they do not function as a group.
+ \@firstofone{\pgfkeysvalueof{\pgfkeyscurrentpath/.unknown/.@cmd}#1\pgfeov}%
+ },
+}
+
+% ---------- process key patterns ----------
+
+\newcommand{\ObjectProcessKeyPattern}[2]{% #1: key, #2: value, #3: else
+ \expandafter\ObjectProcessKeyPattern@expandedkey\expandafter{#1}{#2}%
+}
+
+\newcommand{\ObjectProcessKeyPattern@expandedkey}[2]{% #1: key, #2: value, #3: else
+ \ObjectProcessGraphicOption@expandedkey{#1}{#2}{%
+ \@gobble
+ }{%
+ \ObjectProcessArgs@expandedkey{#1}{#2}\relax
+ }%
+}
+
+% ---------- process graphic options ----------
+
+\ifesf@loadgraphics
+
+% do not confuse this with \CheckGraphicobjectOption
+\newcommand{\CheckObjectGraphicOption}[2]{% #1: key, #2: value
+ % #3: executed if valid, #4: executed if *not* a graphic option
+ % Please note that if the option looks like a graphic option
+ % but is not valid neither #3 nor #4 is executed.
+ % Instead an appropriate error message is printed.
+ \begingroup
+ \let\ObjectCheckGraphicOption@aftergroup=\@gobbletwo
+ \renewcommand{\AppendToOptionsList}[3]{%
+ \let\ObjectCheckGraphicOption@aftergroup=\@firstoftwo
+ }%
+ \ObjectProcessGraphicOption{#1}{#2}{%
+ \let\ObjectCheckGraphicOption@aftergroup=\@secondoftwo
+ }%
+ \expandafter
+ \endgroup
+ \ObjectCheckGraphicOption@aftergroup
+}
+
+\newcommand{\ObjectProcessGraphicOption}[2]{% #1: key, #2: value
+ % #3: executed if *not* a graphic option
+ \expandafter\ObjectProcessGraphicOption@expandedkey\expandafter{#1}{#2}\relax
+}
+\newcommand{\ObjectProcessGraphicOption@expandedkey}[2]{% #1: key, #2: value
+ % #3: executed if graphic option, #4: executed if *not* a graphic option
+ \ObjectProcessGraphicOption@checkoption#1graphic \pgfeov{#2}%
+}
+\long\def\ObjectProcessGraphicOption@checkoption#1graphic #2\pgfeov#3{% #1: empty if graphic option, #2: key, #3: value
+ % #4: executed if graphic option, #5: executed if *not* a graphic option
+ \def\esf@tmp@arg{#1}%
+ \ifx \esf@tmp@arg \@empty
+ \edef\esf@opgoco@key{\StripGraphicSpace#2\pgfeov}%
+ \CheckGraphicobjectOption{\esf@opgoco@key}{#3}{%
+ \AppendGraphicobjectOption{\esf@opgoco@key}{#3}%
+ }%
+ \expandafter \@firstoftwo
+ \else
+ \expandafter \@secondoftwo
+ \fi
+}
+
+\def\StripGraphicSpace#1graphic \pgfeov{#1}
+
+\else %\ifesf@loadgraphics
+
+\newcommand{\CheckObjectGraphicOption}[2]{% #1: key, #2: value
+ % #3: executed if valid, #4: executed if *not* a graphic option
+ \@secondoftwo
+}
+
+\newcommand{\ObjectProcessGraphicOption@expandedkey}[2]{% #1: key, #2: value
+ % #3: executed if graphic option, #4: executed if *not* a graphic option
+ \@secondoftwo
+}
+
+\fi %\ifesf@loadgraphics
+
+% ---------- process env args ----------
+
+\newcommand{\@object@envkey}{/object/env}
+\newcommand{\CheckObjectEnvArgs}[2]{% #1: key, #2: value
+ % #3: executed if valid, #4: executed if *not* an <env> arg
+ % Please note that if the option looks like an <env> arg
+ % but is not valid neither #3 nor #4 is executed.
+ % Instead an appropriate error message is printed.
+ \begingroup
+ \edef\ObjectCheckArgs@key{#1}%
+ \let\ObjectCheckArgs@aftergroup=\@gobbletwo
+ \pgfkeysgetvalue{/object.check/env}{\esf@tmp@env}%
+ \pgfkeys{\@object@envkey/.expand once=\esf@tmp@env}%
+ \renewcommand{\ObjectDefineEnvargs}[2]{% ##1: env name, ##2: arguments
+ \let\ObjectCheckArgs@aftergroup=\@firstoftwo
+ }%
+ \ObjectProcessArgs{\ObjectCheckArgs@key}{#2}{%
+ \let\ObjectCheckArgs@aftergroup=\@secondoftwo
+ }%
+ \expandafter
+ \endgroup
+ \ObjectCheckArgs@aftergroup
+}
+
+
+\newcommand{\ObjectProcessArgs}[2]{% #1: key, #2: value, #3: else
+ \expandafter\ObjectProcessArgs@expandedkey\expandafter{#1}{#2}\relax
+}
+
+\newcommand{\ObjectProcessArgs@expandedkey}[2]{% #1: key, #2: value, #3: then, #4: else
+ \IfEndsOnSpacePlus{#1}{%
+ \let\ObjectProcessArgs@csdef=\csappto
+ \expandafter\ObjectProcessArgs@checkArgs\expandafter{\StripSpacePlus#1\pgfeov}{#2}%
+ }{\IfEndsOnPlus{#1}{%
+ \let\ObjectProcessArgs@csdef=\csappto
+ \expandafter\ObjectProcessArgs@checkArgs\expandafter{\StripPlus#1\pgfeov}{#2}%
+ }{%
+ \let\ObjectProcessArgs@csdef=\csdef
+ \ObjectProcessArgs@checkArgs{#1}{#2}%
+ }}%
+}
+
+\newrobustcmd{\IfEndsOn}[2]{% #1: end character, #2: text
+ \def\IfEndsOn@do##1#1##2\pgfeov{%
+ \ifstrequal{##2}{}{%
+ \let\do=\@secondoftwo
+ }{\ifstrequal{##2}{#1}{%
+ \let\do=\@firstoftwo
+ }{%
+ \def\do{\IfEndsOn@do##2\pgfeov}%
+ }}%
+ \do
+ }%
+ \IfEndsOn@do#2#1\pgfeov
+}
+\newcommand{\IfEndsOnPlus}{\IfEndsOn+}
+\newcommand{\IfEndsOnSpacePlus}{\IfEndsOn{ +}}
+
+\def\StripSpacePlus#1 +\pgfeov{#1}
+\def\StripPlus#1+\pgfeov{#1}
+
+
+\newcommand{\ObjectProcessArgs@checkArgs}[2]{% #1: key, #2: value, #3: then, #4: else
+ \ObjectProcessArgs@do#1 args\pgfeov{#2}%
+}
+\long\def\ObjectProcessArgs@do#1 arg#2\pgfeov#3{% #1: env name, #2: test value, #3: arguments, #4: then, #5: else
+ \let\ObjectProcessArgs@do@after=\@firstoftwo
+ \ifstrequal{#2}{ args}{%
+ \ObjectDefineEnvargsCheckName{#1}{{#3}}%
+ }{\ifstrequal{#2}{s args}{%
+ \ObjectDefineEnvargsCheckName{#1}{#3}%
+ }{\ifstrequal{#2}{s}{%
+ \ifstrequal{#1}{arg}{%
+ \ObjectDefineEnvargsAuto{{#3}}%
+ }{\ifstrequal{#1}{args}{%
+ \ObjectDefineEnvargsAuto{#3}%
+ }{%
+ \let\ObjectProcessArgs@do@after=\@secondoftwo
+ }}%
+ }{%
+ \let\ObjectProcessArgs@do@after=\@secondoftwo
+ }}}%
+ \ObjectProcessArgs@do@after
+}
+\newcommand{\ObjectDefineEnvargsCheckName}[2]{% #1: env name, #2: arguments
+ \ifobject@directkeys
+ \pgfkeysgetvalue{\@object@envkey}{\esf@tmp@env}%
+ \ifdefvoid{\esf@tmp@env}{%
+ }{\ifdefstring{\esf@tmp@env}{#1}{%
+ }{%
+ \ifobject@warnotherenv
+ \PackageWarning{easyfloats}{Defining 'arg(s)' for #1 but 'env=\esf@tmp@env'}%
+ \fi
+ }}%
+ \fi
+ \IfEnvironmentExists{#1}
+ {\ObjectDefineEnvargs{#1}{#2}}
+ {\PackageError{easyfloats}{Environment #1 for which you set 'arg(s)' does not exist}{}}%
+}
+\newcommand{\ObjectDefineEnvargsAuto}[1]{% #1: arguments
+ \pgfkeysgetvalue{\@object@envkey}{\esf@tmp@env}%
+ \ifx \esf@tmp@env \@empty
+ \PackageError{easyfloats}{'env' for 'arg(s)' is not defined}{}%
+ \else
+ \ObjectDefineEnvargs{\esf@tmp@env}{#1}%
+ \fi
+}
+\newcommand{\ObjectDefineEnvargs}[2]{% #1: env name, #2: arguments
+ \ObjectProcessArgs@csdef{object@#1 env@args}{#2}%
+}
+
+
+\newcommand{\ObjectAppendEnvargs}[1]{% #1: macro
+ \ifcsname object@\pgfkeysvalueof{\@object@envkey} env@args\endcsname
+ \eappto#1{\csexpandonce{object@\pgfkeysvalueof{\@object@envkey} env@args}}%
+ \fi
+}
+
+
+% ---------- object environment ----------
+
+\newcommand{\object@head}{}
+\newcommand{\object@foot}{}
+\newcommand{\object@restorestandardfloats}{}
+
+\newcommand{\object@label}[1]{%
+ \pgfkeys{/object/label={#1}}%
+}%
+\newcommand{\object@caption}[2][\pgfkeysnovalue]{%
+ \pgfkeys{/object/caption={#2}}%
+ \ifx \pgfkeysnovalue #1\relax
+ \pgfkeys{/object/list caption={#2}}%
+ \else
+ \pgfkeys{/object/list caption={#1}}%
+ \fi
+}
+\newcommand{\object@longtable@label}[1]{%
+ \ObjectDefineEnvargs{longtable}{\label{#1}}%
+}%
+\newcommand{\object@longtable@caption}[2][\pgfkeysnovalue]{%
+ \ifx \pgfkeysnovalue #1\relax
+ \ObjectDefineEnvargs{longtable}{\caption{#2}}%
+ \else
+ \ObjectDefineEnvargs{longtable}{\caption[#1]{#2}}%
+ \fi
+ \def\object@longtable@caption@sep{\ObjectDefineEnvargs{longtable}{\\}}%
+}
+
+\newenvironment{object}[1]{% #1: options
+ \if@inobject
+ \PackageError{easyfloats}{object environment may not be nested}{Did you mean to use the subobject environment instead?}%
+ \fi
+ \@inobjecttrue
+ %
+ \object@restorestandardfloats
+ %
+ \object@hook
+ \ifobject@isgraphic
+ \object@graphic@hook
+ \global\object@isgraphicfalse
+ \fi
+ %
+ % ---------- options ---------
+ %
+ \pgfqkeys{/object}{%
+ #1,
+ %
+ % ------- mandatory -------
+ type/.esf@mandatory=It should be the name of a floating environment like figure or table,
+ float style/.esf@mandatory={It should be one of plain, plaintop, ruled or boxed. See float package},
+ env/.esf@mandatory=It should be the name of an environment like tabular or empty,
+ }%
+ %
+ % ------- contains subobjects -------
+ \if@containssubobjects
+ \pgfkeysgetvalue{/object/env}{\esf@tmp@env}%
+ \ifx \esf@tmp@env \@empty
+ \else
+ \pgfkeys{/subobject/env/.expand once=\esf@tmp@env}%
+ \pgfkeyssetvalue{/object/env}{}%
+ \fi
+ \fi
+ %
+ % ---------- prepare ---------
+ %
+ \pgfkeysgetvalue{/object/env}{\esf@tmp@env}%
+ \ifdefstring\esf@tmp@env{longtable}{%
+ \object@longtable@prepare
+ }{%
+ \esf@ifpgfkeyhasvalue{/object/first head}{%
+ \pgfkeysgetvalue{/object/first head}{\object@head}%
+ }{%
+ \pgfkeysgetvalue{/object/head}{\object@head}%
+ }%
+ \esf@ifpgfkeyhasvalue{/object/last foot}{%
+ \pgfkeysgetvalue{/object/last foot}{\object@foot}%
+ }{%
+ \pgfkeysgetvalue{/object/foot}{\object@foot}%
+ }%
+ }%
+ %
+ \pgfkeysgetvalue{/object/type}{\esf@tmp@type}%
+ \ifx\esf@tmp@type\@empty
+ \let\object@floatenv@begin=\relax
+ \let\object@floatenv@end=\relax
+ \else
+ \pgfkeysgetvalue{/object/float style}{\esf@tmp@floatstyle}%
+ \ifx \esf@tmp@floatstyle \@empty
+ \else
+ \floatstyle{\esf@tmp@floatstyle}%
+ \restylefloat{\esf@tmp@type}%
+ \fi
+ \edef\object@floatenv@begin{\expandonce{\csname\esf@tmp@type\endcsname}}%
+ \edef\object@floatenv@end{\expandonce{\csname end\esf@tmp@type\endcsname}}%
+ \pgfkeysgetvalue{/object/placement}{\esf@tmp@placement}%
+ \ifx \esf@tmp@placement \@empty
+ % do nothing
+ \else
+ \eappto\object@floatenv@begin{[\esf@tmp@placement]}%
+ \fi
+ \fi
+ %
+ \pgfkeysgetvalue{/object/details}{\object@details}%
+ \ifx \object@details \@empty
+ % do nothing
+ \else
+ \preto\object@details{\pgfkeysvalueof{/object/details sep}}%
+ \fi
+ %
+ \pgfkeysgetvalue{/object/env}{\esf@tmp@env}%
+ \ifx \esf@tmp@env \@empty
+ % if you change this remember to update \object@lookahead@beforesubobject
+ \def\object@innerenv@begin{\object@head\ignorespaces}%
+ \def\object@innerenv@end{\unskip\object@foot}%
+ \else
+ \edef\object@innerenv@begin{\expandonce{\csname\esf@tmp@env\endcsname}}%
+ \edef\object@innerenv@end{\expandonce{\csname end\esf@tmp@env\endcsname}}%
+ \ObjectAppendEnvargs{\object@innerenv@begin}%
+ \eappto\object@innerenv@begin{\expandonce{\object@head}}%
+ \epreto\object@innerenv@end{\expandonce{\object@foot}}%
+ \let\object@lookahead@begin=\object@innerenv@begin
+ \ifobject@showenv
+ \show\object@innerenv@begin
+ \fi
+ \let\object@innerenv@begin=\object@lookahead
+ \fi
+ %
+ \global \@firstsubobjecttrue
+ %
+ % ---------- execute ---------
+ %
+ \object@floatenv@begin
+ \let\esf@original@label=\label
+ \let\esf@original@caption=\caption
+ \let\label=\object@label
+ \let\caption=\object@caption
+ \pgfkeysvalueof{/object/exec}%
+ \pgfkeysvalueof{/object/align}%
+ \object@innerenv@begin
+}{%
+ \object@innerenv@end
+ \if@containssubobjects
+ \if@firstsubobject
+ \PackageWarning{easyfloats}{'contains subobjects' is true but the object does not contain any subobjects.}%
+ \fi
+ \fi
+ \let\label=\esf@original@label
+ \let\caption=\esf@original@caption
+ \object@processCaptionAndLabel
+ \object@floatenv@end
+}
+
+\newcommand{\object@processCaptionAndLabel}{%
+ % position of caption (above/below) is handled by float package (see float style)
+ \esf@ifpgfkeyhasvalue{/object/caption}{%
+ \esf@ifpgfkeyhasvalue{/object/list caption}%
+ {\pgfkeysgetvalue{/object/list caption}{\esf@tmp@caption@short}}%
+ {\pgfkeysgetvalue{/object/caption}{\esf@tmp@caption@short}}%
+ \caption[\esf@tmp@caption@short]{\pgfkeysvalueof{/object/caption}\object@details}%
+ }{%
+ \ifobject@warnnocaption
+ \PackageWarning{easyfloats}{%
+ No caption given.
+ This object will not show up in the list of figures/tables/whatsoever.
+ If captions for subfigures are given they will be placed incorrectly in the list of figures.
+ If you are using hyperref links to this figure may turn out wrong.
+ This warning occured%
+ }%
+ \fi
+ % Generate an anchor for a \label.
+ % \phantomcaption is defined in the caption-package but
+ % documented in subcaption for the subfigure environment.
+ % It appears that here (without a subfigure but within a figure)
+ % references are output correctly but links created by hyperref
+ % which should be pointing to this object point to the previous caption.
+ \phantomcaption
+ }%
+ % ------- label -------
+ \esf@ifpgfkeyhasvalue{/object/label}{%
+ \label{\pgfkeysvalueof{/object/label}}%
+ }{%
+ \ifobject@warnnolabel
+ \PackageWarning{easyfloats}{%
+ No label given.
+ Without a label you cannot reference this object.
+ This warning occured%
+ }%
+ \fi
+ }%
+ \esf@ifpgfkeyhasvalue{/object/add label}%
+ {\label{\pgfkeysvalueof{/object/add label}}}%
+ {}%
+}
+
+\newcommand{\object@longtable@prepare}{%
+ \pgfkeyssetvalue{/object/type}{}%
+ \pgfkeyssetvalue{/object/align}{}%
+ \let\object@label=\label
+ \let\object@caption=\caption
+ \let\ObjectProcessArgs@csdef=\csappto
+ %
+ \let\esf@original@label=\label
+ \let\esf@original@caption=\caption
+ \let\label=\object@longtable@label
+ \let\caption=\object@longtable@caption
+ \let\object@longtable@caption@sep=\relax
+ % it seems possible to have a label without a caption in a longtable
+ % which actually makes sense because \caption may appear several times
+ % so it makes sense to increase the counter somewhere else.
+ \let\phantomcaption=\relax
+ \object@processCaptionAndLabel
+ \let\object@processCaptionAndLabel=\relax
+ \object@longtable@caption@sep
+ \let\label=\esf@original@label
+ \let\caption=\esf@original@caption
+ %
+ \esf@ifpgfkeyhasvalue{/object/first head}{%
+ \ObjectDefineEnvargs{longtable}{\pgfkeysvalueof{/object/first head}}%
+ }{%
+ \ObjectDefineEnvargs{longtable}{\pgfkeysvalueof{/object/head}}%
+ }%
+ \ObjectDefineEnvargs{longtable}{%
+ \endfirsthead
+ \pgfkeysvalueof{/object/head}%
+ \endhead
+ \pgfkeysvalueof{/object/foot}%
+ \endfoot
+ }%
+ \esf@ifpgfkeyhasvalue{/object/last foot}{%
+ \ObjectDefineEnvargs{longtable}{\pgfkeysvalueof{/object/last foot}}%
+ }{%
+ \ObjectDefineEnvargs{longtable}{\pgfkeysvalueof{/object/foot}}%
+ }%
+ \ObjectDefineEnvargs{longtable}{%
+ \endlastfoot
+ }%
+}
+
+
+% ---------- lookahead for subobjects ----------
+
+\newcommand{\object@lookahead@nosubobject}{%
+ \object@lookahead@begin
+}
+\newcommand{\object@lookahead@beforesubobject}{%
+ \PackageWarning{easyfloats}{It seems you have forgotten to specify 'contains subobjects'. I am using the value of 'env' for the subobjects instead of for \@currenvir.}%
+ \pgfkeysgetvalue{/object/env}{\esf@tmp@env}%
+ \pgfkeys{/subobject/env/.expand once=\esf@tmp@env}%
+ \pgfkeyssetvalue{/object/env}{}%
+ \let\object@innerenv@end=\unskip
+ %\ignorespaces unnecessary because I just checked
+ %that the next token is the start of a subobject
+}
+
+\newcommand{\object@lookahead}{%
+ \futurelet \next \object@lookahead@checknext
+}
+\newcommand{\object@lookahead@checknext}{%
+ \ifx \next \@implicitspace
+ \let\object@lookahead@gobble=\@gobblespace
+ \let\object@lookahead@do=\object@lookahead
+ \else\ifx \next \par
+ \let\object@lookahead@gobble=\@gobble
+ \let\object@lookahead@do=\object@lookahead
+ \else\ifx \next \begin
+ \let\object@lookahead@gobble=\@empty
+ \let\object@lookahead@do=\object@lookahead@checkbegin
+ \else\ifx \next \includegraphicsubobject
+ \let\object@lookahead@gobble=\@empty
+ \let\object@lookahead@do=\object@lookahead@beforesubobject
+ \else
+ \let\object@lookahead@gobble=\@empty
+ \let\object@lookahead@do=\object@lookahead@nosubobject
+ \fi \fi \fi \fi
+ \expandafter \object@lookahead@do \object@lookahead@gobble
+}
+\newcommand{\object@lookahead@checkbegin}[2]{% #1: \begin, #2: environment name
+ \ifstrequal{#2}{subobject}
+ \object@lookahead@beforesubobject
+ \object@lookahead@nosubobject
+ #1{#2}%
+}
+
+\@firstofone{\let\@implicitspace= }
+\@firstofone{\def\@gobblespace} {}
+
+
+% ========== object styles ==========
+
+\newcommand{\IfObjectStyleExists}[1]{% #1: style name or group name, #2: then block, #3: else block
+ \ifcsmacro{object@style@#1}%
+}
+\newcommand{\IfObjectStyleNotGroup}[1]{% #1: style name, #2: then block, #3: else block
+ \IfObjectStyleExists{#1}
+ {\edef\esf@tmp@do{\ifcsstring{object@stylegroup@#1}{{#1}}}\esf@tmp@do}%
+ \@secondoftwo
+}
+
+\newcommand{\objectstyle@init}[1]{% #1: style name or group name
+ \expandafter \newcommand \csname object@style@#1\endcsname{/utils/exec=\object@directkeysfalse}%
+ \expandafter \newcommand \csname object@stylegroup@#1\endcsname{}%
+}
+
+\newrobustcmd{\AddObjectStyleToGroup}[2]{% #1: group name, #2: style name
+ \IfObjectStyleExists{#1}{%
+ \IfObjectStyleNotGroup{#2}{%
+ \AddObjectStyleToGroup@do{#1}{#2}%
+ }{%
+ \PackageError{easyfloats}{Undefined object style: #2}{In this case you cannot use a style group instead of a group.}%
+ }}{%
+ \PackageError{easyfloats}{Undefined object style group: #1}{}%
+ }%
+}
+\newrobustcmd{\AddObjectStyleToGroup@do}[2]{% #1: group name, #2: style name
+ \expandafter\eappto\csname object@stylegroup@#1\endcsname{{#2}}%
+}
+\newrobustcmd{\ShowObjectStylesInGroup}[1]{%
+ \expandafter\show\csname object@stylegroup@#1\endcsname
+}
+
+\newcommand{\AppendOptionToObjectStyleGroups}[3]{% #1: list of style groups, #2: key, #3: value
+ \CheckObjectOption{#2}{#3}{%
+ \@for\esf@aotosg@group:=#1\do{%
+ \GobbleLeadingSpaceIn\esf@aotosg@group
+ \AppendOptionToObjectStyleGroup\esf@aotosg@group{#2}{#3}%
+ }%
+ }%
+}
+\newcommand{\AppendOptionToObjectStyleGroup}[3]{% #1: style group, #2: key, #3: value
+ \IfObjectStyleExists{#1}{%
+ \expandafter \let \expandafter \esf@tmp@listofstyles \csname object@stylegroup@#1\endcsname
+ \def\esf@tmp@loop{\@tfor\esf@aotosg@style:=}%
+ \expandafter\esf@tmp@loop\esf@tmp@listofstyles \do {%
+ \AppendOptionToObjectStyle\esf@aotosg@style{#2}{#3}%
+ }%
+ }{%
+ \PackageError{easyfloats}{Undefined object style: '#1'}{}%
+ }%
+}
+\newcommand{\AppendOptionToObjectStyle}[3]{% #1: style, #2: key, #3: value
+ \expandafter\AppendToOptionsList\csname object@style@#1\endcsname{#2}{#3}%
+}
+\newrobustcmd{\ShowObjectStyleOptions}[1]{%
+ \IfObjectStyleNotGroup{#1}
+ {\expandafter\show\csname object@style@#1\endcsname}%
+ {\PackageError{easyfloats}{Undefined object style: '#1'}{}}%
+}
+
+
+% ---------- style groups ----------
+
+\newrobustcmd{\NewObjectStyleGroup}[2]{% #1: group name, #2: list of style names
+ \IfObjectStyleExists{#1}{%
+ \PackageError{easyfloats}{Style or style group with the name '#1' exists already}{}%
+ }{%
+ \objectstyle@init{#1}%
+ \@for\esf@nosg@style:=#2\do{%
+ \GobbleLeadingSpaceIn\esf@nosg@style
+ \AddObjectStyleToGroup{#1}{\esf@nosg@style}%
+ }%
+ }%
+}
+
+% ---------- object styles ----------
+
+\newrobustcmd{\NewObjectStyle}[2]{% #1: name, #2: options
+ \IfObjectStyleExists{#1}{%
+ \PackageError{easyfloats}{Style or style group with the name '#1' exists already}{}%
+ }{%
+ \objectstyle@init{#1}%
+ \AddObjectStyleToGroup@do{#1}{#1}%
+ %hack into \objectset[#1] to retrieve the value of type
+ \pgfkeyssetvalue{/object.check/type}{\pgfkeysnovalue}%
+ \objectset[#1]{#2}%
+ \esf@ifpgfkeyhasvalue{/object.check/type}{%
+ \edef\@do{\noexpand\DeprecateStandardFloatObject{\pgfkeysvalueof{/object.check/type}}{#1object}}%
+ \@do
+ }{%
+ \PackageError{easyfloats}{Missing required key 'type'}%
+ }%
+ %
+ \AddObjectStyleToGroup{all}{#1}%
+ %
+ \newenvironment{#1object}[1]{% #1: options
+ \object{%
+ .esf@also from/.expand once=\csname object@style@#1\endcsname,
+ /utils/exec=\object@directkeystrue,
+ ##1,
+ }%
+ }{%
+ \endobject
+ }%
+ \pgfkeysgetvalue{/object.check/type}{\NewObjectStyle@type}%
+ \edef\@do{\noexpand\AfterPreamble{%
+ \noexpand\IfEnvironmentExists{sub\NewObjectStyle@type}{%
+ \noexpand\PackageInfo{easyfloats}{environment 'sub\NewObjectStyle@type' exists already}%
+ }{\NewObjectStyle@IfCaptionNewEnough{%
+ \noexpand\PackageInfo{easyfloats}{declaring new caption subtype 'sub\NewObjectStyle@type'}%
+ \noexpand\DeclareCaptionSubType{\NewObjectStyle@type}%
+ }{%
+ \noexpand\PackageWarning{easyfloats}{The caption package is too old for me to define the subtype automatically. Please insert `\string\AtBeginDocument{\string\DeclareCaptionSubType{\NewObjectStyle@type}}' before loading this package}%
+ }%
+ }%
+ }}\@do
+ }%
+}
+
+\@ifpackagelater{caption}{2020/08/30}
+ {\let\NewObjectStyle@IfCaptionNewEnough=\@firstoftwo}
+ {\let\NewObjectStyle@IfCaptionNewEnough=\@secondoftwo}
+
+
+\newcommand{\DeprecateStandardFloatObject}[2]{% #1: float environment, #2: alternative object environment
+ \ifesf@warnstandardfloats
+ \ifcsmacro{esf@#1@alternatives}{%
+ \expandafter \appto \csname esf@#1@alternatives\endcsname{ or #2}%
+ }{%
+ \AtBeginDocument{%
+ \csletcs{esf@original#1}{#1}%
+ \expandafter \preto\csname#1\endcsname{\PackageWarning{easyfloats}{In order to profit from the advantages of the easyfloats package please use \csname esf@#1@alternatives\endcsname\space instead}}%
+ }%
+ \expandafter \def \csname esf@#1@alternatives\endcsname{#2}%
+ \ifesf@loadgraphics
+ \ifstrequal{#1}{table}{%
+ % do nothing
+ }{%
+ \expandafter \appto \csname esf@#1@alternatives\endcsname{ or \string\includegraphicobject}%
+ }%
+ \fi
+ \eappto\object@restorestandardfloats{\let\expandonce{\csname #1\endcsname}=\expandonce{\csname esf@original#1\endcsname}}%
+ }%
+ \fi
+}
+
+
+% ---------- default styles ----------
+
+\NewObjectStyleGroup{all}{}
+
+\NewObjectStyle{table}{type=table}
+\NewObjectStyle{figure}{type=figure}
+
+
+% ========== include graphic object ==========
+
+\newif\ifgraphicobject@autocaption
+\newif\ifgraphicobject@autolabel
+\newif\ifgraphicobject@autocaption@strippath
+\newif\ifgraphicobject@autolabel@strippath
+\newif\ifgraphicobject@warnenv
+\newif\ifgraphicobject@noenv
+
+\ifesf@loadgraphics
+
+\newcommand\object@graphic@env{figureobject}
+\newcommand\object@graphic@path{/object}
+\newcommand\object@graphic@options{}
+
+\newrobustcmd{\graphicobjectstyle}[1]{%
+ \IfObjectStyleNotGroup{#1}{%
+ \def\object@graphic@env{#1object}%
+ }{%
+ \PackageError{easyfloats}{Undefined object style: '#1'}{}%
+ }%
+}
+
+% do not confuse this with \CheckObjectGraphicOption
+% this corresponds to \CheckObjectOption
+\newcommand{\CheckGraphicobjectOption}[2]{% #1: key, #2: value, #3: executed if valid
+ % if #3 is *not* executed an error message is printed
+ \let\CheckGraphicobjectOption@handleArg=\@gobble
+ \esf@ifpgfkeyexists{/graphicobject/#1}{%
+ \esf@ifpgfkeyrequiresvalue{/graphicobject/#1}{%
+ \ifx \pgfkeysnovalue #2\relax
+ \PackageError{easyfloats}{The key '#1' requires a value. I am going to ignore this key}{}%
+ \else
+ \let\CheckGraphicobjectOption@handleArg=\@firstofone
+ \fi
+ }{%
+ \let\CheckGraphicobjectOption@handleArg=\@firstofone
+ }%
+ }{\esf@ifkeyvalkeyexists{Gin}{#1}{%
+ \esf@ifkeyvalkeyrequiresvalue{Gin}{#1}{%
+ \ifx \pgfkeysnovalue #2\relax
+ \PackageError{easyfloats}{The key '#1' requires a value. I am going to ignore this key}{}%
+ \else
+ \let\CheckGraphicobjectOption@handleArg=\@firstofone
+ \fi
+ }{%
+ \let\CheckGraphicobjectOption@handleArg=\@firstofone
+ }%
+ }{%
+ \PackageError{easyfloats}{'#1' is not a valid graphic option key}
+ {If you intended to use a graphbox option please make sure that you loaded this package with the option 'graphbox'.}%
+ }}%
+ \CheckGraphicobjectOption@handleArg
+}
+
+\newcommand{\AppendGraphicobjectOption}[2]{% #1: key, #2: value
+ \AppendToOptionsList{\object@graphic@options}{#1}{#2}%
+}
+\newcommand{\includegraphicobject@SetGraphicobjectOption}[2]{% #1: key, #2: value
+ \pgfkeysalso{#1={#2}}%
+}
+
+% available options
+\pgfqkeys{/graphicobject}{%
+ auto caption/.is if=graphicobject@autocaption,
+ auto caption=true,
+ %
+ auto label/.is if=graphicobject@autolabel,
+ auto label=true,
+ %
+ auto caption strip path/.is if=graphicobject@autocaption@strippath,
+ auto caption strip path=false,
+ %
+ auto label strip path/.is if=graphicobject@autolabel@strippath,
+ auto label strip path=false,
+ %
+ warn env/.is if=graphicobject@warnenv,
+ warn env=true,
+ %
+ no env/.is if=graphicobject@noenv,
+ no env=true,
+}
+
+\newrobustcmd{\includegraphicobject}{% [#1: graphicstyle], [#2: options], #3: graphic filename without extension
+ \let\includegraphicobject@after=\@empty
+ \@ifnextchar [%
+ \includegraphicobject@firstarg
+ \includegraphicobject@parseoptions
+}
+\def\includegraphicobject@firstarg[#1]{%
+ \begingroup
+ \@ifnextchar [%
+ {%
+ \begingroup
+ \let\includegraphicobject@after=\endgroup
+ \graphicobjectstyle{#1}%
+ \includegraphicobject@parseoptions
+ }%
+ {%
+ \includegraphicobject@parseoptions[#1]%
+ }%
+}
+
+\newcommand{\includegraphicobject@parseoptions}{% [#1: options], #2: graphic filename without extension
+ % expanding \object@graphic@env before is important for subcaptionbox
+ % otherwise I get the error \begin{subobject} ended by \end{subobject}
+ \@ifnextchar [
+ {\expandafter\includegraphicobject@do\expandafter{\object@graphic@env}}
+ {\expandafter\includegraphicobject@do\expandafter{\object@graphic@env}[]}%
+}
+\def\includegraphicobject@do#1[#2]#3{% #1: environment name, #2: options, #3: graphic filename without extension
+ \global\object@isgraphictrue
+ \begin{#1}{%
+ /utils/exec=\def\object@graphic@options@tmp{}%
+ \let\AppendGraphicobjectOption\includegraphicobject@SetGraphicobjectOption,
+ .unknown/.code={%
+ \esf@ifkeyvalkeyexists{Gin}{\pgfkeyscurrentname}{%
+ \AppendToOptionsList{\object@graphic@options@tmp}{\pgfkeyscurrentname}{##1}%
+ }{%
+ \let\pgfkeys@searchalso@name=\pgfkeyscurrentname
+ \pgfkeysalso{%
+ /graphicobject/\pgfkeys@searchalso@name={##1},
+ }%
+ }%
+ },
+ .esf@also from=\object@graphic@options,
+ #2,
+ /utils/exec=
+ \ifgraphicobject@autocaption
+ \esf@ifpgfkeyhasvalue{\object@graphic@path/caption}{%
+ % do nothing
+ }{%
+ \def\graphicobject@caption{#3}%
+ \PatchUnderscore\graphicobject@caption
+ \ifgraphicobject@autocaption@strippath
+ \protected@edef\graphicobject@caption{\strippath\graphicobject@caption}%
+ \fi
+ \pgfkeyslet{\object@graphic@path/caption}{\graphicobject@caption}%
+ }%
+ \fi
+ \ifgraphicobject@autolabel
+ \esf@ifpgfkeyhasvalue{\object@graphic@path/label}{%
+ % do nothing
+ }{%
+ \def\graphicobject@label{#3}%
+ \ifgraphicobject@autolabel@strippath
+ \protected@edef\graphicobject@label{\strippath\graphicobject@label}%
+ \fi
+ \pgfkeyslet{\object@graphic@path/label}{\graphicobject@label}%
+ }%
+ \fi
+ \ifgraphicobject@warnenv
+ \pgfkeysalso{env/.get=\esf@tmp@env}%
+ \ifx \esf@tmp@env \@empty
+ \else
+ \ifdefstring{\object@graphic@env}{subobject}
+ {\edef\esf@tmp@name{\string\includegraphicsubobject}}
+ {\edef\esf@tmp@name{\string\includegraphicobject}}%
+ \ifgraphicobject@noenv
+ \PackageWarning{easyfloats}{I am ignoring 'env=\esf@tmp@env' in \esf@tmp@name}%
+ \else
+ \PackageWarning{easyfloats}{'env=\esf@tmp@env' in \esf@tmp@name. Is that intended?}%
+ \fi
+ \fi
+ \fi
+ \ifgraphicobject@noenv
+ \pgfkeysalso{env=}%
+ \fi
+ ,
+ }
+ \expandafter\includegraphics\expandafter[\object@graphic@options@tmp]{#3}%
+ \end{#1}%
+ % if this is \@empty it should not interfere with \ignorespacesafterend (\ignorespaces) or \@endparenv (\@doendpe)
+ \includegraphicobject@after
+}
+
+\newrobustcmd{\includegraphicsubobject}{%
+ \begingroup
+ \def\object@graphic@env{subobject}%
+ \def\object@graphic@path{/subobject}%
+ \def\includegraphicobject@after{\endgroup\ignorespaces}%
+ \includegraphicobject@parseoptions
+}
+
+
+\fi %\ifesf@loadgraphics
+
+
+% ========== sub object ==========
+
+\newif\ifsubobject@warnnolabel
+\newif\ifsubobject@warnnocaption
+
+% available options
+\pgfqkeys{/subobject}{%
+ % A label for the left/right part of the content
+ label/.initial,
+ label/.value required,
+ %
+ % A caption displayed above or below the sub content
+ % (depending on the float style).
+ % There is *no* dot added automatically behind it.
+ caption/.initial,
+ caption/.value required,
+ %
+ % A caption used in the list of figures/tables/...
+ % for the left/right part of the content.
+ list caption/.initial,
+ list caption/.value required,
+ %
+ % An addition to the caption (at the object only, not in a list)
+ details/.initial=,
+ details/.value required,
+ %
+ details sep/.initial=.\space,
+ details sep/.value required,
+ %
+ % TeX code which is inserted before env
+ exec/.initial=,
+ exec/.value required,
+ exec +/.code=\esf@pgfkeysvalueappend{/subobject/exec}{#1},
+ exec +/.value required,
+ exec+/.forward to=/subobject/exec +,
+ exec+/.value required,
+ %
+ % The width argument of \subcaptionbox or subfigure.
+ % For \subcaptionbox an empty value is allowed
+ % meaning that the argument is not passed so that
+ % \subcaptionbox takes the width of the content.
+ linewidth/.initial=.5\linewidth,
+ linewidth/.value required,
+ %
+ % Use the \subcaptionbox command.
+ % Aligns the captions.
+ % Does not allow verbatim content.
+ % Is *not* compatible with env=tabularx.
+ subcaptionbox/.code=
+ \let\subobject@begin\subobject@subcaptionbox
+ \let\subobject@end\endsubobject@subcaptionbox,
+ subcaptionbox/.value forbidden,
+ % Use the subfigure/subtable environment.
+ % Requires linewidth.
+ subpage/.code=
+ \let\subobject@begin\subobject@subpage
+ \let\subobject@end\endsubobject@subpage,
+ subpage/.value forbidden,
+ %
+ % ------- subcaptionbox options -------
+ % Horizontal position of the content in the box.
+ % Allowed values: c, l, r, s, <empty> or any
+ % justification defined with \DeclareCaptionJustification
+ % (see the caption package documentation).
+ % An empty value means that this optional argument is
+ % *not* passed to the \subcaptionbox command.
+ % This option has no effect if linewidth is empty.
+ % I discourage using this option because it destroys
+ % the alignment of (sub)object and (sub)caption.
+ subcaptionbox inner pos/.initial=,
+ subcaptionbox inner pos/.value required,
+ %
+ % ------- subfigure/subtable options -------
+ % The subfigure/subtable environments are minipages
+ % and take the same arguments.
+ % http://tug.org/texinfohtml/latex2e.html#minipage
+ %
+ % The vertical position of the minipage on the baseline.
+ % Allowed values: c, t, b, auto, <empty>.
+ % auto means t if the caption is displayed at the top
+ % or b if the caption is displayed at the bottom
+ % so that the captions are aligned if the minipages
+ % have the same height.
+ % <empty> is equivalent to c.
+ subpage outer pos/.initial=auto,
+ subpage outer pos/.value required,
+ %
+ % The height of the minipage.
+ % An empty value means that this optional argument is
+ % *not* passed to the subfigure/subtable environment.
+ subpage height/.initial=,
+ subpage height/.value required=,
+ %
+ % The vertical position of the content on the minipage.
+ % Allowed values: t, c, b, s, <empty>.
+ % <empty> means that this optional argument is
+ % *not* passed to the subfigure/subtable environment.
+ % This option has no effect if subpage height is <empty>.
+ subpage inner pos/.initial=,
+ subpage inner pos/.value required,
+ %
+ % TeX code which is inserted at the beginning of the subfigure/subtable environment
+ subpage align/.initial=\centering,
+ subpage align/.value required,
+ %
+ % ------- separator options -------
+ % Insert a separator in front of each subobject
+ % except for the first subobject.
+ sep/.initial=,
+ sep/.value required,
+ %
+ % Place the subobjects side by side.
+ hor/.code=
+ \esf@pgfkeyscopyvalue{/subobject/sep}{/subobject/hor sep}%
+ \esf@pgfkeysvalueappend{/subobject/sep}{#1},
+ hor/.default=,
+ %
+ % The separator to be used when the subobjects
+ % shall be placed side by side.
+ hor sep/.initial=,
+ hor sep/.value required,
+ hor sep+/.forward to=/subobject/hor sep +,
+ hor sep+/.value required,
+ hor sep +/.code=\esf@pgfkeysvalueappend{/subobject/hor sep}{#1},
+ hor sep +/.value required,
+ %
+ % Place the subobjects below each other.
+ ver/.code=
+ \esf@pgfkeyscopyvalue{/subobject/sep}{/subobject/ver sep}%
+ \esf@pgfkeysvalueappend{/subobject/sep}{#1},
+ ver/.default=,
+ %
+ % The separator to be used when the subobjects
+ % shall be placed below eachother.
+ ver sep/.initial=\par\bigskip,
+ ver sep/.value required,
+ ver sep+/.forward to=/subobject/ver sep +,
+ ver sep+/.value required,
+ ver sep +/.code=\esf@pgfkeysvalueappend{/subobject/ver sep}{#1},
+ ver sep +/.value required,
+ %
+ %
+ % ------- warnings -------
+ %
+ warn no caption/.is if=subobject@warnnocaption,
+ warn no caption=true,
+ %
+ warn no label/.is if=subobject@warnnolabel,
+ warn no label=false,
+ %
+ warn other env/.forward to=/object/warn other env,
+ %value is allowed but not necessary
+ %
+ %
+ % ------- debugging -------
+ %
+ show env args/.forward to=/object/show env args,
+ %
+ %
+ % ------- inner environment -------
+ %
+ % An additional inner environment to wrap the content in like tabular, tabularx, tikzpicture
+ env/.code=\IfEnvironmentExistsOrIsEmpty{#1}{%
+ \ifstrequal{#1}{longtable}{%
+ \PackageError{easyfloats}{You cannot use 'env=longtable' in a subobject}
+ {Either use 'env=tabular' instead or combine the subobjects into one longtable.}%
+ \pgfkeyssetvalue{/subobject/env}{tabular}%
+ }{%
+ \pgfkeyssetvalue{/subobject/env}{#1}%
+ }%
+ }{%
+ \PackageError{easyfloats}{Environment #1 which you passed to the key 'env' does not exist}{}%
+ },
+ env/.value required,
+ env=,
+ %
+ % ------- unknown handler / env args -------
+ %
+ % see /object
+ %
+ .unknown/.code={%
+ % Using \ObjectProcessKeyPattern instead of \ObjectProcessArgs
+ % means that keys like `graphic width` can be used in subobjects as well.
+ % For a directly used subobject this should not be allowed.
+ % But I am leaving it in for \includegraphicsubobject so that the same key
+ % which works in \objectset and \includegraphicobject also works there.
+ \ObjectProcessKeyPattern{\pgfkeyscurrentname}{#1}{%
+ \pgfkeysgetvalue{/subobject/.really unknown/.@cmd}{\esf@tmp@err}%
+ \esf@tmp@err#1\pgfeov
+ }%
+ },
+ % Setting an unknown key handler shall not override env args but set an additional unknown handler.
+ .unknown/.code/.code={%
+ \pgfkeysdef{/subobject/.really unknown}{#1}%
+ },
+ .really unknown/.code={%
+ \edef\do{\noexpand\pgfkeys{/errors/unknown key={\pgfkeyscurrentkey}{\unexpanded{#1}}}}%
+ \do
+ },
+}%
+
+\newenvironment{subobject}[1]{% #1: options
+ \if@inobject
+ \else
+ \PackageError{easyfloats}{subobject environment may not be used outside of an object}{Did you mean to use the object environment instead?}%
+ \fi
+ %
+ \subobject@hook
+ \ifobject@isgraphic
+ \object@graphic@hook
+ \global\object@isgraphicfalse
+ \fi
+ %
+ \let\label=\esf@original@label
+ \let\caption=\esf@original@caption
+ %
+ % ------- options -------
+ %
+ \renewcommand\@object@envkey{/subobject/env}%
+ \pgfqkeys{/subobject}{#1}%
+ \ifsubobject@warnnocaption
+ \pgfkeys{/subobject/caption/.esf@recommended}%
+ \fi
+ \ifsubobject@warnnolabel
+ \pgfkeys{/subobject/label/.esf@recommended}%
+ \fi
+ %
+ \esf@ifpgfkeyhasvalue{/subobject/list caption}%
+ {\pgfkeys{/subobject/list caption/.get=\subobject@caption@short}}%
+ {\pgfkeys{/subobject/caption/.get=\subobject@caption@short}}%
+ \pgfkeysgetvalue{/subobject/linewidth}{\subobject@linewidth}%
+ %
+ \pgfkeysgetvalue{/subobject/details}{\subobject@details}%
+ \ifx \subobject@details \@empty
+ % do nothing
+ \else
+ \preto\subobject@details{\pgfkeysvalueof{/subobject/details sep}}%
+ \fi
+ %
+ \pgfkeysgetvalue{/subobject/env}{\esf@tmp@env}%
+ \ifx \esf@tmp@env \@empty
+ \def\subobject@innerenv@begin{\ignorespaces}%
+ \def\subobject@innerenv@end{\unskip}%
+ \else
+ \edef\subobject@innerenv@begin{\expandonce{\csname\esf@tmp@env\endcsname}}%
+ \edef\subobject@innerenv@end{\expandonce{\csname end\esf@tmp@env\endcsname}}%
+ \ObjectAppendEnvargs{\subobject@innerenv@begin}%
+ \ifobject@showenv
+ \show\subobject@innerenv@begin
+ \fi
+ \fi
+ %
+ % ------- execute -------
+ %
+ \if@firstsubobject
+ \else
+ % No need to worry about \parskip.
+ % Inside of a floating environment it appears to be always zero.
+ \pgfkeysvalueof{/subobject/sep}%
+ \fi
+ \subobject@begin
+}{%
+ \subobject@end
+ \global \@firstsubobjectfalse
+}
+
+\NewEnviron{subobject@subcaptionbox}{%
+ \def\subobject@box{%
+ \subcaptionbox[% list caption
+ \subobject@caption@short
+ ]{% caption
+ \pgfkeysvalueof{/subobject/caption}%
+ \subobject@details
+ \esf@ifpgfkeyhasvalue{/subobject/label}
+ {\label{\pgfkeysvalueof{/subobject/label}}}
+ {}%
+ }%
+ }%
+ \ifdefvoid\subobject@linewidth{%
+ % do nothing
+ }{%
+ \appto\subobject@box{[\subobject@linewidth]}%
+ \pgfkeysgetvalue{/subobject/subcaptionbox inner pos}{\subobject@innerpos}%
+ \ifx \subobject@innerpos \@empty
+ % do nothing
+ \else
+ \eappto\subobject@box{[\subobject@innerpos]}%
+ \fi
+ }%
+ \subobject@box{% content
+ \begingroup
+ \renewcommand{\label}[1]{\PackageError{easyfloats}{\string\label\space is not allowed in subobject. Please use the 'label' option instead}{}}%
+ \renewcommand{\caption}[2][]{\PackageError{easyfloats}{\string\caption\space is not allowed in subobject. Please use the 'caption' option instead}{}}%
+ \pgfkeysvalueof{/subobject/exec}%
+ \subobject@innerenv@begin
+ \BODY
+ \subobject@innerenv@end
+ \endgroup
+ }%
+}
+
+\newenvironment{subobject@subpage}{%
+ \ifx \subobject@linewidth \@empty
+ \PackageError{easyfloats}{'linewidth' may not be empty when using the 'subpage' backend}{}%
+ \fi
+ \edef\subobject@subpage@envname{sub\pgfkeysvalueof{/object/type}}%
+ \def\subobject@subpage@begin{\csname\subobject@subpage@envname\endcsname}%
+ \def\subobject@subpage@end{\csname end\subobject@subpage@envname\endcsname}%
+ %
+ \pgfkeysgetvalue{/subobject/subpage outer pos}{\subobject@outerpos}%
+ \ifx \subobject@outerpos \@empty
+ \appto\subobject@subpage@begin{[c]}%
+ \else \ifdefstring \subobject@outerpos {auto}{%
+ \caption@iftop
+ {\eappto\subobject@subpage@begin{[t]}}%
+ {\eappto\subobject@subpage@begin{[b]}}%
+ }{\ifdefstring \subobject@outerpos {Auto}{%
+ \caption@iftop
+ {\eappto\subobject@subpage@begin{[T]}}%
+ {\eappto\subobject@subpage@begin{[B]}}%
+ }{%
+ \eappto\subobject@subpage@begin{[\subobject@outerpos]}%
+ }}\fi
+ \pgfkeysgetvalue{/subobject/subpage height}{\subobject@height}%
+ \ifx \subobject@height \@empty
+ \else
+ \appto\subobject@subpage@begin{[\subobject@height]}%
+ \pgfkeysgetvalue{/subobject/subpage inner pos}{\subobject@innerpos}%
+ \ifx \subobject@innerpos \@empty
+ \else
+ \eappto\subobject@subpage@begin{[\subobject@innerpos]}%
+ \fi
+ \fi
+ %
+ \subobject@subpage@begin{\subobject@linewidth}%
+ \pgfkeysvalueof{/subobject/subpage align}%
+ % \caption@iftop is defined by caption package
+ \caption@iftop{\subobject@subpage@captionAndLabel}{}%
+ \begingroup
+ \renewcommand{\label}[1]{\PackageError{easyfloats}{\string\label\space is not allowed in subobject. Please use the 'label' option instead}{}}%
+ \renewcommand{\caption}[2][]{\PackageError{easyfloats}{\string\caption\space is not allowed in subobject. Please use the 'caption' option instead}{}}%
+ \pgfkeysvalueof{/subobject/exec}%
+ \subobject@innerenv@begin
+}{%
+ \subobject@innerenv@end
+ \endgroup
+ \caption@iftop{}{\subobject@subpage@captionAndLabel}%
+ \subobject@subpage@end
+ \ignorespacesafterend
+}
+\newcommand{\subobject@subpage@captionAndLabel}{%
+ % ------- caption -------
+ % position of caption (above/below) is handled by float package (see float style)
+ \esf@ifpgfkeyhasvalue{/subobject/caption}{%
+ \caption[\subobject@caption@short]{\pgfkeysvalueof{/subobject/caption}\subobject@details}%
+ }{%
+ % Generate an anchor for a \label.
+ \phantomcaption
+ }%
+ % ------- label -------
+ \esf@ifpgfkeyhasvalue{/subobject/label}%
+ {\label{\pgfkeysvalueof{/subobject/label}}}%
+ {}%
+}
+
+\pgfqkeys{/subobject}{subpage}
diff --git a/Master/texmf-dist/source/latex/easyfloats/easyfloats.ins b/Master/texmf-dist/source/latex/easyfloats/easyfloats.ins
new file mode 100644
index 00000000000..c3f1020483b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/easyfloats/easyfloats.ins
@@ -0,0 +1,82 @@
+% !TeX program = tex
+
+%% easyfloats.ins
+%% Copyright 2020 E. Zöllner
+%
+% 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
+% http://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 E. Zöllner.
+%
+% This work consists of the files listed in easyfloats-file-list.txt.
+% The official git repository is https://gitlab.com/erzo/latex-easyfloats
+
+
+% Make easyfloats.dtx faster by stripping comments and indentation
+% and write the result to easyfloats.sty.
+
+\input docstrip.tex
+
+\preamble
+
+Copyright 2020 E. Z\string\"ollner
+
+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
+ http://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.
+Additionally to the rights granted by the LaTeX Project Public License
+you have permission to freely distribute unmodified copies
+of the files \jobname.sty and doc/easyfloats.pdf without other files of this work.
+The other files of this work can be found at:
+https://gitlab.com/erzo/latex-easyfloats
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is E. Z\string\"ollner.
+
+This work consists of the files listed in easyfloats-file-list.txt.
+\endpreamble
+
+\askforoverwritefalse
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+
+\def\lnout{}
+\count0=0
+\def\append#1{\advance\count0 by 1 \expandafter\def\expandafter\lnout\expandafter{\lnout#1}}
+\def\appendmany#1{\ifx\relax#1\else\append{#1}\expandafter\appendmany\fi}
+\obeyspaces
+\appendmany \relax
+\expandafter\appendmany\jobname.sty\relax
+\loop\append{ }\ifnum\count0<48\repeat
+\Msg{****************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the *}
+\Msg{* following file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* \lnout *}
+\Msg{* *}
+\Msg{* To produce the documentation run: *}
+\Msg{* $ cd doc *}
+\Msg{* $ pdflatex easyfloats.tex *}
+\Msg{* $ biber easyfloats *}
+\Msg{* $ pdflatex easyfloats.tex *}
+\Msg{* $ pdflatex easyfloats.tex *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{****************************************************}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/ebproof/ebproof.dtx b/Master/texmf-dist/source/latex/ebproof/ebproof.dtx
new file mode 100644
index 00000000000..df4f11f0cab
--- /dev/null
+++ b/Master/texmf-dist/source/latex/ebproof/ebproof.dtx
@@ -0,0 +1,1644 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2015-2021 by Emmanuel Beffara
+%
+% This file 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:
+%
+% http://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.
+%
+%<*driver>
+\documentclass[full]{l3doc}
+\usepackage{ebproof}
+\usepackage{multicol}
+\usepackage{tikz}
+\usetikzlibrary{decorations.pathmorphing}
+\EnableCrossrefs
+\newenvironment{example}{%
+ \VerbatimEnvironment
+ \begin{VerbatimOut}{example.tex}}{%
+ \end{VerbatimOut}
+ \begin{center}
+ \begin{minipage}{.4\textwidth}
+ \input{example.tex}
+ \end{minipage}%
+ \begin{minipage}{.6\textwidth}
+ \small\VerbatimInput[gobble=0]{example.tex}
+ \end{minipage}%
+ \end{center}
+}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% The \pkg{ebproof} package \\
+% Formal proofs in the style of sequent calculus^^A
+% }
+%
+% \author{^^A
+% Emmanuel Beffara\thanks
+% {^^A
+% E-mail: \href{mailto:manu@beffara.org}{manu@beffara.org}^^A
+% }^^A
+% }
+%
+% \date{Version 2.1.1 -- Released 2021-01-28}
+%
+% \maketitle
+%
+% \setcounter{tocdepth}{2}
+% \begin{multicols}{2}
+% \tableofcontents
+% \end{multicols}
+%
+% \begin{documentation}
+%
+% \section{Introduction}
+%
+% The \pkg{ebproof} package provides commands to typeset proof trees, in the
+% style of sequent calculus and related systems:
+%
+% \begin{example}
+% \begin{prooftree}
+% \hypo{ \Gamma, A &\vdash B }
+% \infer1[abs]{ \Gamma &\vdash A\to B }
+% \hypo{ \Gamma \vdash A }
+% \infer2[app]{ \Gamma \vdash B }
+% \end{prooftree}
+% \end{example}
+%
+% The structure is very much inspired by the
+% \href{http://math.ucsd.edu/~sbuss/ResearchWeb/bussproofs/}{\pkg{bussproofs}}
+% package, in particular for the postfix notation.
+% I actually wrote \pkg{ebproof} because there were some limitations in
+% \pkg{bussproofs} that I did not know how to lift, and also because I did
+% not like some choices in that package (and also because it was fun to write).
+%
+% Any feedback is welcome, in the form of bug reports, feature requests or
+% suggestions, through the web page of the project at \url{https://framagit.org/manu/ebproof}.
+%
+% \section{Environments}
+%
+% \begin{function}{prooftree,prooftree*}
+% \begin{syntax}
+% \verb|\begin{prooftree}|\oarg{options}
+% ~ \meta{statements}
+% \verb|\end{prooftree}|
+% \end{syntax}
+% The package provides the \env{prooftree} environment, in standard and
+% starred variants.
+% This typesets the proof tree described by the \meta{statements}, as
+% described in section~\ref{sec:statements}.
+% The \meta{options} provide default formatting options for the proof tree,
+% available options are described in section~\ref{sec:options}.
+%
+% Following the conventions of \pkg{amsmath} for alignment environments, the
+% non-starred version produces a proof tree at the current position in the
+% text flow (it can be used in math mode or text mode) while the starred
+% version typesets the proof on a line of its own, like a displayed formula.
+% \end{function}
+%
+% \begin{example}
+% \[
+% \begin{prooftree}
+% \infer0{ \vdash A }
+% \hypo{ \vdash B } \infer1{ \vdash B, C }
+% \infer2{ \vdash A\wedge B, C }
+% \end{prooftree}
+% \quad \rightsquigarrow \quad
+% \begin{prooftree}
+% \infer0{ \vdash A } \hypo{ \vdash B }
+% \infer2{ \vdash A\wedge B }
+% \infer1{ \vdash A\wedge B, C }
+% \end{prooftree}
+% \]
+% \end{example}
+%
+% \section{Statements}
+% \label{sec:statements}
+%
+% Statements describe proofs in postfix notation: when typesetting a proof tree
+% whose last rule has, say, two premisses, you will first write statements for
+% the subtree of the first premiss, then statements for the subtree of the
+% second premiss, then a statement like \cs{infer2}\{\meta{conclusion}\} to
+% build an inference with these two subtrees as premisses and the given text as
+% conclusion.
+%
+% Hence statements operate on a stack of proof trees.
+% At the beginning of a \env{prooftree} environment, the stack is empty.
+% At the end, it must contain exactly one tree, which is the one that will be
+% printed.
+%
+% Note that the commands defined in this section only exist right inside
+% \env{prooftree} environments.
+% If you have a macro with the same name as one of the statements, for instance
+% \cs{hypo}, then this macro will keep its meaning outside \env{prooftree}
+% environments as well as inside the arguments of a statement.
+% If you really need to access the statements in another context, you can can
+% always call them by prefixing their names with \texttt{ebproof}, for instance as
+% \cs{ebproofhypo}.
+%
+% \subsection{Basic statements}
+%
+% The basic statements for building proofs are the following, where
+% \meta{options} stands for arbitrary options as described in
+% section~\ref{sec:options}.
+%
+% \begin{function}{\hypo}
+% \begin{syntax}
+% \cs{hypo}\oarg{options}\marg{text}
+% \end{syntax}
+% The statement \cs{hypo} pushes a new proof tree consisting only in one
+% conclusion line, with no premiss and no line above, in other words a tree
+% with only a leaf (\cs{hypo} stands for \emph{hypothesis}).
+% \end{function}
+%
+% \begin{function}{\infer}
+% \begin{syntax}
+% \cs{infer}\oarg{options}\meta{arity}\oarg{label}\marg{text}
+% \end{syntax}
+% The statement \cs{infer} builds an inference step by taking some proof
+% trees from the top of the stack, assembling them with a rule joining their
+% conclusions and putting a new conclusion below.
+% The \meta{arity} is the number of sub-proofs, it may be any number
+% including 0 (in this case there will be a line above the conclusion but no
+% sub-proof).
+% If \meta{label} is present, it is used as the label on the right of the
+% inference line; it is equivalent to using the \cmd{right label} option.
+% \end{function}
+%
+% \medskip
+%
+% The \meta{text} in these statements is the contents of the conclusion at the
+% root of the tree that the statements create.
+% It is typeset in math mode by default but any kind of formatting can be used
+% instead, using the \cmd{template} option.
+% The \meta{label} text is formatted in horizontal text mode by default.
+%
+% Each proof tree has a vertical axis, used for alignment of successive steps.
+% The position of the axis is deduced from the text of the conclusion at the
+% root of the tree: if \meta{text} contains the alignment character \verb|&|
+% then the axis is set at that position, otherwise the axis is set at the center
+% of the conclusion text.
+% The \cs{infer} statement makes sure that the axis of the premiss is at the
+% same position as the axis of the conclusion.
+% If there are several premisses, it places the axis at the center between the
+% left of the leftmost conclusion and the right of the rightmost conclusion:
+%
+% \begin{example}
+% \begin{prooftree}
+% \hypo{ &\vdash A, B, C }
+% \infer1{ A &\vdash B, C }
+% \infer1{ A, B &\vdash C }
+% \hypo{ D &\vdash E }
+% \infer2{ A, B, D &\vdash C, E }
+% \infer1{ A, B &\vdash C, D, E }
+% \infer1{ A &\vdash B, C, D, E }
+% \end{prooftree}
+% \end{example}
+%
+% \begin{function}{\ellipsis}
+% \begin{syntax}
+% \cs{ellipsis}\marg{label}\marg{text}
+% \end{syntax}
+% The statement \cs{ellipsis} typesets vertical dots, with a label on the right,
+% and a new conclusion. No inference lines are inserted.
+% \end{function}
+%
+% \begin{example}
+% \begin{prooftree}
+% \hypo{ \Gamma &\vdash A }
+% \ellipsis{foo}{ \Gamma &\vdash A, B }
+% \end{prooftree}
+% \end{example}
+%
+%
+% \subsection{Modifying proof trees}
+%
+% The following additional statements may be used to affect the format of the
+% last proof tree on the stack.
+%
+% \begin{function}{\rewrite}
+% \begin{syntax}
+% \cs{rewrite}\marg{code}
+% \end{syntax}
+% The statement \cs{rewrite} is used to modify the proof of the stack while
+% preserving its size and alignment.
+% The \meta{code} is typeset in horizontal mode, with the following control
+% sequences defined:
+% \begin{itemize}
+% \item \cs{treebox} is a box register that contains the original material,
+% \item \cs{treemark}\marg{name} expands as the position of a given mark with
+% respect to the left of the box.
+% \end{itemize}
+% \end{function}
+%
+% A simple use of this statement is to change the color of a proof tree:
+% \begin{example}
+% \begin{prooftree}
+% \hypo{ \Gamma, A &\vdash B }
+% \infer1[abs]{ \Gamma &\vdash A\to B }
+% \rewrite{\color{red}\box\treebox}
+% \hypo{ \Gamma \vdash A }
+% \infer2[app]{ \Gamma \vdash B }
+% \end{prooftree}
+% \end{example}
+% Note the absence of spaces inside the call to \cs{rewrite}, because spaces
+% would affect the position of the tree box.
+% Note also that explicit use of \cs{treebox} is required to actually draw the
+% subtree.
+% Not using it will effectively not render the subtree, while still reserving
+% its space in the enclosing tree:
+% \begin{example}
+% \begin{prooftree}
+% \hypo{ \Gamma, A &\vdash B }
+% \infer1[abs]{ \Gamma &\vdash A\to B }
+% \rewrite{}
+% \hypo{ \Gamma \vdash A }
+% \infer2[app]{ \Gamma \vdash B }
+% \end{prooftree}
+% \end{example}
+% This kind of manipulation is useful for instance in conjunction with the
+% \pkg{beamer} package to allow revealing subtrees of a proof tree
+% progressively in successive slides of a given frame.
+%
+% \begin{function}{\delims}
+% \begin{syntax}
+% \cs{delims}\marg{left}\marg{right}
+% \end{syntax}
+% The statement \cs{delims} puts left and right delimiters around the whole
+% sub-proof, without changing the alignment (the spacing is affected by the
+% delimiters, however).
+% The \meta{left} text must contain an opening occurrence of \cs{left} and
+% the \meta{right} text must contain a matching occurrence of \cs{right}.
+% For instance, \verb|\delims{\left(}{\right)}| will put the sub-proof
+% between parentheses.
+% \end{function}
+%
+% \begin{example}
+% \begin{prooftree}
+% \hypo{ A_1 \vee \cdots \vee A_n }
+% \hypo{ [A_i] }
+% \ellipsis{}{ B }
+% \delims{ \left( }{ \right)_{1\leq i\leq n} }
+% \infer2{ B }
+% \end{prooftree}
+% \end{example}
+%
+% \begin{function}{\overlay}
+% \begin{syntax}
+% \cs{overlay}
+% \end{syntax}
+% The statement \cs{overlay} combines the last two proofs on the stack into
+% a single one, so that their conclusions are placed at the same point.
+% \end{function}
+%
+% \begin{example}
+% \begin{prooftree}
+% \hypo{Z}
+% \hypo{A} \hypo{B} \infer2{C} \hypo{D} \infer2{D}
+% \rewrite{\color{blue}\box\treebox}
+% \hypo{E} \hypo{F} \hypo{G} \infer2{H} \infer2{I}
+% \rewrite{\color{red}\box\treebox}
+% \overlay \hypo{J} \infer3{K}
+% \end{prooftree}
+% \end{example}
+%
+% The primary use of this feature is for building animated presentations where
+% a subtree in a proof has to be modified without affecting the general
+% alignment of the surrounding proof. For instance, the example above could be
+% used in Beamer to build successive slides in a given frame with two
+% different subtrees:
+%
+% \begin{verbatim}
+% \begin{prooftree}
+% \hypo{Z}
+% \hypo{A} \hypo{B} \infer2{C} \hypo{D} \infer2{D}
+% \only<2>{\rewrite{}} % erases this version on slide 2
+% \hypo{E} \hypo{F} \hypo{G} \infer2{H} \infer2{I}
+% \only<1>{\rewrite{}} % erases this version on slide 1
+% \overlay \hypo{J} \infer3{K}
+% \end{prooftree}
+% \end{verbatim}
+%
+% \section{Options}
+% \label{sec:options}
+%
+% The formatting of trees, conclusion texts and inference rules is affected by
+% options, specified using the \LaTeX3 key-value system.
+% All options are in the \texttt{ebproof} module in the key tree.
+% They can be set locally for a proof tree or for a single statement using
+% optional arguments in the associated commands.
+%
+% \begin{function}{\ebproofset,\set}
+% \begin{syntax}
+% \cs{ebproofset}\marg{options}
+% \end{syntax}
+% The statement \cs{ebproofset} is used to set some options. When used
+% inside a \env{prooftree} environment, it can written \cs{set}.
+% The options will apply in the current scope; using this in preamble will
+% effectively set options globally.
+% Specific options may also be specified for each proof tree and for each
+% statement in a proof tree, using optional arguments.
+% \end{function}
+%
+% \subsection{General shape}
+%
+% The options in this section only make sense at the global level and at the
+% proof level.
+% Changing the proof style inside a \env{proof} environment has undefined
+% behaviour.
+%
+% \begin{variable}{proof style}
+% The option \cmd{proof style} sets the general shape for representing proofs.
+% The following styles are provided:
+% \begin{description}
+% \item[upwards]
+% This is the default style.
+% Proof trees grow upwards, with conclusions below and premisses above.
+% \item[downwards]
+% Proof trees grow downwards, with conclusions above and premisses below.
+% \fvset{gobble=6}
+% \begin{example}
+% \begin{prooftree}[proof style=downwards]
+% \hypo{ \Gamma, A &\vdash B }
+% \infer1[abs]{ \Gamma &\vdash A\to B }
+% \hypo{ \Gamma \vdash A }
+% \infer2[app]{ \Gamma \vdash B }
+% \end{prooftree}
+% \end{example}
+% \end{description}
+% \end{variable}
+%
+% In the optional argument of \env{prooftree} environments, proof styles can
+% be specified directly, without prefixing the name by ``\texttt{proof style=}''.
+% For instance, the first line of the example above could be written
+% \verb|\begin{prooftree}| equivalently.
+%
+% \begin{variable}{center}
+% The option \cmd{center} toggles vertical centering of typeset proofs.
+% If set to \texttt{true}, the tree produced by the \env{prooftree}
+% environment will be vertically centered around the text line.
+% If set to \texttt{false}, the base line of the tree will be the base line
+% of the conclusion.
+% The default value is \texttt{true}.
+% \end{variable}
+%
+% \begin{example}
+% \begin{prooftree}[center=false]
+% \infer0{ A \vdash A }
+% \end{prooftree}
+% \qquad
+% \begin{prooftree}[center=false]
+% \hypo{ \Gamma, A \vdash B }
+% \infer1{ \Gamma \vdash A \to B }
+% \end{prooftree}
+% \end{example}
+%
+% \subsection{Spacing}
+%
+% \begin{variable}{separation}
+% Horizontal separation between sub-proofs in an inference is defined by the
+% option \cmd{separation}.
+% The default value is \texttt{1.5em}.
+% \end{variable}
+%
+% \begin{example}
+% \begin{prooftree}[separation=0.5em]
+% \hypo{ A } \hypo{ B } \infer2{ C }
+% \hypo{ D } \hypo{ E } \hypo{ F } \infer3{ G }
+% \hypo{ H } \infer[separation=3em]3{ K }
+% \end{prooftree}
+% \end{example}
+%
+% \begin{variable}{rule margin}
+% The spacing above and below inference lines is defined by the option
+% \cmd{rule margin}.
+% The default value is \texttt{0.7ex}.
+% \end{variable}
+%
+% \begin{example}
+% \begin{prooftree}[rule margin=2ex]
+% \hypo{ \Gamma, A &\vdash B }
+% \infer1[abs]{ \Gamma &\vdash A\to B }
+% \hypo{ \Gamma \vdash A }
+% \infer2[app]{ \Gamma \vdash B }
+% \end{prooftree}
+% \end{example}
+%
+% \subsection{Shape of inference lines}
+%
+% \begin{variable}{rule style}
+% The shape of inference lines is set by the option \cmd{rule style}.
+% The following values are provided:
+% \begin{center}
+% \begin{tabular}{@{}l@{\qquad}l@{}}
+% \toprule
+% \cmd{simple} & a simple line (this is the default style) \\
+% \cmd{no rule} & no rule, only a single space of length \texttt{rule margin} \\
+% \cmd{double} & a double line \\
+% \cmd{dashed} & a single dashed line \\
+% \bottomrule
+% \end{tabular}
+% \end{center}
+% \end{variable}
+%
+% The precise rendering is influenced by parameters specified below.
+% Arbitrary new shapes can defined using the \cs{ebproofnewrulestyle} command
+% described in section~\ref{sec:styles}, using \texttt{rule code} option
+% described below.
+%
+% In the optional argument of the \cs{infer} statement, rule styles can be
+% specified directly, without prefixing the style name by ``\texttt{rule style=}''.
+% For instance, \verb|\infer[dashed]| is equivalent to
+% \verb|\infer[rule style=dashed]|.
+%
+% \begin{example}
+% \begin{prooftree}
+% \hypo{ \Gamma &\vdash A \to B }
+% \infer[no rule]1{ \Gamma &\vdash {!A} \multimap B }
+% \hypo{ \Delta &\vdash A }
+% \infer[rule thickness=2pt]1{ \Delta &\vdash {!A} }
+% \infer0{ B \vdash B }
+% \infer[dashed]2{ \Delta, {!A}\multimap B \vdash B }
+% \infer2{ \Gamma, \Delta &\vdash B }
+% \infer[double]1{ \Gamma \cup \Delta &\vdash B }
+% \end{prooftree}
+% \end{example}
+%
+% \begin{variable}{rule thickness,rule separation}
+% The thickness of inference lines is defined by option \cmd{rule
+% thickness}, it is \texttt{0.4pt} by default.
+% The distance between the two lines in the \texttt{double} rule style is
+% defined by the \cmd{rule separation} option.
+% It is \texttt{2pt} by default.
+% \end{variable}
+% \begin{variable}{rule dash length,rule dash space}
+% For dashed rules, the length of dashes is defined by the option
+% \cmd{rule dash length} and the space between dashes is defined by the
+% option \cmd{rule dash space}.
+% The default values are \texttt{0.2em} and \texttt{0.3em} respectively.
+% \end{variable}
+%
+% \begin{variable}{rule code}
+% Arbitrary rule shapes can be optained using the \cmd{rule code} option.
+% The argument is code is used to render the rule, it is executed in
+% vertical mode in a \cs{vbox} whose \cs{hsize} is set to the width of the
+% rule.
+% Margins above and below are inserted automatically (they can be removed by
+% setting \texttt{rule margin} to \texttt{0pt}).
+% \end{variable}
+%
+% \begin{example}
+% \begin{prooftree}[rule code={\hbox{\tikz
+% \draw[decorate,decoration={snake,amplitude=.3ex}]
+% (0,0) -- (\hsize,0);}}]
+% \hypo{ \Gamma &\vdash A }
+% \infer1{ \Gamma &\vdash A, \ldots, A }
+% \hypo{ \Delta, A, \ldots, A \vdash \Theta }
+% \infer2{ \Gamma, \Delta \vdash \Theta }
+% \end{prooftree}
+% \end{example}
+% Note that this example requires the \pkg{tikz} package, with the
+% \pkg{decorations.pathmorphing} library for the \texttt{snake} decoration.
+%
+% \subsection{Format of conclusions and labels}
+%
+% \begin{variable}{template,left template,right template}
+% The format of text in inferences is defined by templates.
+% The option \cmd{template} is used for text with no alignment mark, the
+% options \cmd{left template} and \cmd{right template} are used for the left
+% and right side of the alignment mark when it is present.
+% The value of these options is arbitrary \TeX\ code, composed in horizontal mode.
+% The macro \cs{inserttext} is used to insert the actual text passed to the
+% \cs{hypo} and \cs{infer} statements.
+% The default value for \cmd{template} is simply \verb|$\inserttext$|, so
+% that conclusions are set in math mode.
+% The default values for \cmd{left template} and \cmd{right template} are
+% similar, with spacing assuming that a relation symbol is put near the
+% alignment mark, so that \verb|\infer1{A &\vdash B}| is spaced correctly.
+% \end{variable}
+%
+% \begin{example}
+% \begin{prooftree}[template=(\textbf\inserttext)]
+% \hypo{ foo }
+% \hypo{ bar }
+% \infer1{ baz }
+% \infer2{ quux }
+% \end{prooftree}
+% \end{example}
+%
+% \begin{variable}{left label,right label}
+% The text to use as the labels of the rules, on the left and on the right
+% of the inference line, is defined by the options \cmd{left label} and
+% \cmd{right label}.
+% Using the second optional argument in \cs{infer} is equivalent to setting
+% the \env{right label} option with the value of that argument.
+% \end{variable}
+%
+% \begin{example}
+% \begin{prooftree}
+% \hypo{ \Gamma, A &\vdash B }
+% \infer[left label=$\lambda$]1[abs]
+% { \Gamma &\vdash A\to B }
+% \hypo{ \Gamma \vdash A }
+% \infer[left label=@]2[app]{ \Gamma \vdash B }
+% \end{prooftree}
+% \end{example}
+%
+% \begin{variable}{left label template,right label template}
+% Similarly to conclusions, labels are formatted according to templates.
+% The code is arbitrary \TeX\ code, composed in horizontal mode, where the
+% macro \cs{inserttext} can be used to insert the actual label text.
+% The default values are simply \cs{inserttext} so that labels are set in
+% plain text mode.
+% \end{variable}
+% \begin{variable}{label separation}
+% The spacing between an inference line and its labels is defined by the
+% option \cmd{label separation}, the default value is \texttt{0.5em}.
+% The height of the horizontal axis used for aligning the labels with the
+% rules is defined by the option \cmd{label axis}, the default value is
+% \texttt{0.5ex}.
+% \end{variable}
+%
+%
+% \subsection{Style macros}
+% \label{sec:styles}
+%
+% The following commands allow for the definition of custom styles using the
+% basic style options, in a way similar to PGF's ``styles'' and \LaTeX3's
+% ``meta-keys''.
+% This allows setting a bunch of options with the same values in many proofs
+% using a single definition.
+%
+% \begin{function}{\ebproofnewstyle}
+% \begin{syntax}
+% \cs{ebproofnewstyle}\marg{name}\marg{options}
+% \end{syntax}
+% The statement \cs{ebproofnewstyle} defines a new style option with some
+% \meta{name} that sets a given set of \meta{options}.
+% \end{function}
+% For instance, the following code defines a new option \cmd{small} that sets
+% various parameters so that proofs are rendered smaller.
+% \begin{example}
+% \ebproofnewstyle{small}{
+% separation = 1em, rule margin = .5ex,
+% template = \footnotesize$\inserttext$ }
+% \begin{prooftree}[small]
+% \hypo{ \Gamma, A \vdash B }
+% \infer1{ \Gamma \vdash A\to B }
+% \hypo{ \Gamma \vdash A } \infer2{ \Gamma \vdash B }
+% \end{prooftree}
+% \end{example}
+%
+% \begin{function}{\ebproofnewrulestyle}
+% \begin{syntax}
+% \cs{ebproofnewrulestyle}\marg{name}\marg{options}
+% \end{syntax}
+% The statement \cs{ebproofnewrulestyle} does the same for rule styles.
+% The \meta{options} part includes options used to set how to draw rules in
+% the new style.
+% \end{function}
+%
+% The option \cmd{rule code} is useful in this command as it allows to
+% define arbitrary rule styles.
+% For instance, the squiggly rule example above could be turned into a new
+% rule style \texttt{zigzag} with the following code:
+% \begin{example}
+% \ebproofnewrulestyle{zigzag}{
+% rule code = {\hbox{\tikz
+% \draw[decorate,decoration={snake,amplitude=.3ex}]
+% (0,0) -- (\hsize,0);}}}
+% \begin{prooftree}
+% \hypo{ \Gamma &\vdash A }
+% \infer1{ \Gamma &\vdash A, \ldots, A }
+% \hypo{ \Delta, A, \ldots, A \vdash \Theta }
+% \infer[zigzag]2{ \Gamma, \Delta \vdash \Theta }
+% \end{prooftree}
+% \end{example}
+%
+%
+% \section{License}
+%
+% 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
+% \begin{center}
+% \url{http://www.latex-project.org/lppl.txt}
+% \end{center}
+% 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 Emmanuel Beffara.
+%
+% This work consists of the files \texttt{ebproof.sty} and \texttt{ebproof.tex}.
+%
+% \section{History}
+%
+% This section lists the principal evolutions of the package, in reverse
+% chronological order.
+% \begin{description}
+% \item[Version 2.1.1 (2021-01-28)]
+% Bugfix release, no changes in the user interface.
+% \begin{itemize}
+% \item Fixes a deprecation issue with \LaTeX3 release 2021-01-09 and
+% various warnings that appear in \LaTeX3 debugging mode.
+% \item Fixes \cmd{proof style=downwards}.
+% \end{itemize}
+% \item[Version 2.1 (2020-08-19)]
+% Mostly a bugfix release.
+% \begin{itemize}
+% \item Makes the \env{prooftree} environment robust to use in tabular
+% contexts.
+% \item Adds the \cs{overlay} statement.
+% \item Fixes a compatibility issue with \LaTeX\ release 2020-10-01.
+% \end{itemize}
+% \item[Version 2.0 (2017-05-17)]
+% A complete rewrite of the code using the \LaTeX3 programming environment.
+% The incompatible changes from the user's point of view are the following:
+% \begin{itemize}
+% \item Proof statements are now writtten in lowercase ({i.e.} \cs{Infer} is
+% now written \cs{infer} etc.) but the syntax is otherwise unchanged.
+% The old uppercase commands still work but produce a deprecation warning,
+% they will be removed in a future version.
+% \item New styles are now defined using \cs{ebproofnewstyle} and
+% \cs{ebproofnewrulestyle}. The previous method using PGF styles does not
+% work anymore (because PGF is not used anymore).
+% \end{itemize}
+% The new commands and options are the following:
+% \begin{itemize}
+% \item The statement \cs{rewrite} generalizes \cs{Alter},
+% \item The option \cmd{label axis} controls vertical alignment of labels.
+% \end{itemize}
+% \item[Version 1.1 (2015-03-13)]
+% A bugfix release.
+% In \cmd{template} options, one now uses \cs{inserttext} instead of \verb|#1|
+% for the text arguments, which improves robustness.
+% \item[Version 1.0 (2015-02-04)]
+% The first public release.
+% \end{description}
+%
+% \end{documentation}
+%
+% \clearpage \appendix
+%
+% \begin{implementation}
+%
+% \section{Implementation}
+%
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{expl3}
+\RequirePackage{xparse}
+\ProvidesExplPackage{ebproof}{2021/01/28}{2.1.1}{EB's proof trees}
+%<@@=ebproof>
+% \end{macrocode}
+%
+% \subsection{Parameters}
+%
+% We first declare all options. For the meaning of options, see
+% section~\ref{sec:options}.
+%
+% \begin{macrocode}
+\bool_new:N \l_@@_updown_bool
+\keys_define:nn { ebproof } {
+center .bool_set:N = \l_@@_center_bool,
+proof~style .choice: ,
+proof~style / upwards .code:n = \bool_set_false:N \l_@@_updown_bool,
+proof~style / downwards .code:n = \bool_set_true:N \l_@@_updown_bool,
+separation .dim_set:N = \l_@@_separation_dim,
+rule~margin .dim_set:N = \l_@@_rule_margin_dim,
+rule~thickness .dim_set:N = \l_@@_rule_thickness_dim,
+rule~separation .dim_set:N = \l_@@_rule_separation_dim,
+rule~dash~length .dim_set:N = \l_@@_rule_dash_length_dim,
+rule~dash~space .dim_set:N = \l_@@_rule_dash_space_dim,
+rule~code .tl_set:N = \l_@@_rule_code_tl,
+rule~style .choice:,
+template .tl_set:N = \l_@@_template_tl,
+left~template .tl_set:N = \l_@@_left_template_tl,
+right~template .tl_set:N = \l_@@_right_template_tl,
+left~label .tl_set:N = \l_@@_left_label_tl,
+right~label .tl_set:N = \l_@@_right_label_tl,
+left~label~template .tl_set:N = \l_@@_left_label_template_tl,
+right~label~template .tl_set:N = \l_@@_right_label_template_tl,
+label~separation .dim_set:N = \l_@@_label_separation_dim,
+label~axis .dim_set:N = \l_@@_label_axis_dim,
+}
+% \end{macrocode}
+%
+% \begin{macro}{\ebproofnewrulestyle}
+% We then define the document-level macro \cs{ebproofnewrulestyle} and use
+% it to define the default styles. This simply consists in defining a
+% meta-key.
+% \begin{macrocode}
+\NewDocumentCommand \ebproofnewrulestyle { mm } {
+ \keys_define:nn { ebproof } {
+ rule~style / #1 .meta:nn = { ebproof } { #2 }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% The styles |simple|, |no rule| and |double| are defined in a straightforward
+% way.
+%
+% \begin{macrocode}
+\ebproofnewrulestyle { simple } {
+ rule~code = { \tex_hrule:D height \l_@@_rule_thickness_dim }
+}
+\ebproofnewrulestyle { no~rule } {
+ rule~code =
+}
+\ebproofnewrulestyle { double } {
+ rule~code = {
+ \tex_hrule:D height \l_@@_rule_thickness_dim
+ \skip_vertical:N \l_@@_rule_separation_dim
+ \tex_hrule:D height \l_@@_rule_thickness_dim
+ }
+}
+% \end{macrocode}
+%
+% The |dashed| style uses leaders and filling for repeating a single dash. We
+% use \TeX\ primitives that have no \LaTeX3 counterpart for this.
+%
+% \begin{macrocode}
+\ebproofnewrulestyle { dashed } {
+ rule~code = {
+ \hbox_to_wd:nn { \tex_hsize:D } {
+ \dim_set:Nn \l_tmpa_dim { \l_@@_rule_dash_space_dim / 2 }
+ \skip_horizontal:n { -\l_tmpa_dim }
+ \tex_cleaders:D \hbox:n {
+ \skip_horizontal:N \l_tmpa_dim
+ \tex_vrule:D
+ height \l_@@_rule_thickness_dim
+ width \l_@@_rule_dash_length_dim
+ \skip_horizontal:N \l_tmpa_dim
+ } \tex_hfill:D
+ \skip_horizontal:n { -\l_tmpa_dim }
+ }
+ }
+}
+% \end{macrocode}
+%
+% Now we can define the default values, including the default rule style.
+%
+% \begin{macrocode}
+\keys_set:nn { ebproof } {
+ center = true,
+ proof~style = upwards,
+ separation = 1.5em,
+ rule~margin = .7ex,
+ rule~thickness = .4pt,
+ rule~separation = 2pt,
+ rule~dash~length = .2em,
+ rule~dash~space = .3em,
+ rule~style = simple,
+ template = $\inserttext$,
+ left~template = $\inserttext\mathrel{}$,
+ right~template = $\mathrel{}\inserttext$,
+ left~label = ,
+ right~label = ,
+ left~label~template = \inserttext,
+ right~label~template = \inserttext,
+ label~separation = 0.5em,
+ label~axis = 0.5ex
+}
+% \end{macrocode}
+%
+% \begin{macro}{\ebproofnewstyle}
+% Defining a style simply means defining a meta-key.
+% \begin{macrocode}
+\NewDocumentCommand \ebproofnewstyle { mm } {
+ \keys_define:nn { ebproof } { #1 .meta:n = { #2 } }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Proof boxes}
+%
+% \TeX\ does not actually provide data structures, so we have to encode things.
+% We provide an allocator for ``registers'' holding boxes with attributes. Such
+% a register consists in a box register and a property list for marks, which
+% maps mark names to values as explicit dimensions with units.
+%
+% \begin{macro}{\@@_new:N}
+% Using only public interfaces forces a convoluted approach to allocation:
+% we use a global counter \cs{g_ebproof_register_int} to number registers,
+% then each allocation creates registers named \cs{S_ebproof_K_N} where
+% S is the scope of the register (local or global, deduced from the argument),
+% K is the kind of component (box or marks) and N is the identifier of the
+% register. The proof box register itself only contains the identifier used
+% for indirection.
+% \begin{macrocode}
+\int_new:N \g_@@_register_int
+\cs_new:Nn \@@_box:N {
+ \str_item:nn { #1 } { 2 } __ebproof_ \tl_use:N #1 _box
+}
+\cs_new:Nn \@@_marks:N {
+ \str_item:nn { #1 } { 2 } __ebproof_ \tl_use:N #1 _prop
+}
+\cs_new:Nn \@@_new:N {
+ \tl_new:N #1
+ \int_gincr:N \g_@@_register_int
+ \str_if_eq:eeTF { \str_item:nn { #1 } { 2 } } { g }
+ { \tl_gset:Nx #1 { \int_to_arabic:n { \g_@@_register_int } } }
+ { \tl_set:Nx #1 { \int_to_arabic:n { \g_@@_register_int } } }
+ \box_new:c { \@@_box:N #1 }
+ \prop_new:c { \@@_marks:N #1 }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_clear:N}
+% The box is cleared by setting it to an empty hbox.
+% Using \cs{box_clear:N} instead would not work because trying to push this
+% box on the stack would not actually append any box.
+% \begin{macrocode}
+\cs_new:Nn \@@_clear:N {
+ \hbox_set:cn { \@@_box:N #1 } {}
+ \prop_clear:c { \@@_marks:N #1 }
+ \@@_set_mark:Nnn #1 { left } { 0pt }
+ \@@_set_mark:Nnn #1 { right } { 0pt }
+ \@@_set_mark:Nnn #1 { axis } { 0pt }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Mark operations}
+%
+% \begin{macro}{\@@_set_mark:Nnn}
+% Setting the value of a mark uses a temporary register to evaluate the
+% dimension expression because values are stored textually in a property
+% list.
+% \begin{macrocode}
+\dim_new:N \l_@@_transit_dim
+\cs_new:Nn \@@_set_mark:Nnn {
+ \dim_set:Nn \l_@@_transit_dim { #3 }
+ \prop_put:cnV { \@@_marks:N #1 } { #2 }
+ \l_@@_transit_dim
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_mark:Nn}
+% Getting the value of a mark simply consists in getting an item in a
+% property list.
+% \begin{macrocode}
+\cs_new:Nn \@@_mark:Nn {
+ \prop_item:cn { \@@_marks:N #1 } { #2 }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_shift_x:Nn}
+% This function shifts the marks by a specified amount, without modifying
+% the box.
+% \begin{macrocode}
+\cs_new:Nn \@@_shift_x:Nn {
+ \prop_map_inline:cn { \@@_marks:N #1 } {
+ \@@_set_mark:Nnn #1 { ##1 } { ##2 + #2 }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_enlarge_conclusion:NN}
+% This function moves the left and right marks of the first tree so that
+% they are at least as far from the axis as they are in the second tree.
+% For instance we get the following:
+% \begin{center}
+% \begin{tikzpicture}[y=-3ex]
+% \node (L1) at (1,0) {L}; \node (A1) at (2,0) {A}; \node (R1) at (4,0) {R};
+% \node (L2) at (0,1) {L}; \node (A2) at (2,1) {A}; \node (R2) at (3,1) {R};
+% \node (L3) at (0,2) {L}; \node (A3) at (2,2) {A}; \node (R3) at (4,2) {R};
+% \draw (L1) -- (A1) -- (R1);
+% \draw (L2) -- (A2) -- (R2);
+% \draw (L3) -- (A3) -- (R3);
+% \node[anchor=west] at (5,0) {box 1 before};
+% \node[anchor=west] at (5,1) {box 2 before};
+% \node[anchor=west] at (5,2) {box 1 after};
+% \end{tikzpicture}
+% \end{center}
+% The contents of the trees are unchanged.
+% \begin{macrocode}
+\cs_new:Nn \@@_enlarge_conclusion:NN {
+ \dim_set:Nn \l_tmpa_dim { \@@_mark:Nn #1 {axis}
+ + \@@_mark:Nn #2 {left} - \@@_mark:Nn #2 {axis} }
+ \dim_compare:nNnT { \l_tmpa_dim } < { \@@_mark:Nn #1 {left} } {
+ \@@_set_mark:Nnn #1 {left} { \l_tmpa_dim } }
+ \dim_set:Nn \l_tmpa_dim { \@@_mark:Nn #1 {axis}
+ + \@@_mark:Nn #2 {right} - \@@_mark:Nn #2 {axis} }
+ \dim_compare:nNnT { \l_tmpa_dim } > { \@@_mark:Nn #1 {right} } {
+ \@@_set_mark:Nnn #1 {right} { \l_tmpa_dim } }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Building blocks}
+%
+% \begin{macro}{\@@_make_simple:Nn}
+% Make a tree with explicit material in horizontal mode. Set the left and
+% right marks to extremal positions and set the axis in the middle.
+% \begin{macrocode}
+\cs_new:Nn \@@_make_simple:Nn {
+ \hbox_set:cn { \@@_box:N #1 } { #2 }
+ \@@_set_mark:Nnn #1 { left } { 0pt }
+ \@@_set_mark:Nnn #1 { axis } { \box_wd:c { \@@_box:N #1 } / 2 }
+ \@@_set_mark:Nnn #1 { right } { \box_wd:c { \@@_box:N #1 } }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_make_split:Nnn}
+% Make a tree with explicit material in horizontal mode, split in two parts.
+% Set the left and right marks to extremal positions and set the axis
+% between the two parts.
+% \begin{macrocode}
+\cs_new:Nn \@@_make_split:Nnn {
+ \@@_set_mark:Nnn #1 { left } { 0pt }
+ \hbox_set:cn { \@@_box:N #1 } { #2 }
+ \@@_set_mark:Nnn #1 { axis } { \box_wd:c { \@@_box:N #1 } }
+ \hbox_set:cn { \@@_box:N #1 } { \hbox_unpack:c { \@@_box:N #1 } #3 }
+ \@@_set_mark:Nnn #1 { right } { \box_wd:c { \@@_box:N #1 } }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_make_vertical:Nnnn}
+% Make a tree with explicit material in vertical mode, using an explicit
+% width and axis.
+% \begin{macrocode}
+\cs_new:Nn \@@_make_vertical:Nnnn {
+ \@@_set_mark:Nnn #1 { left } { 0pt }
+ \@@_set_mark:Nnn #1 { axis } { #2 }
+ \@@_set_mark:Nnn #1 { right } { #3 }
+ \vbox_set:cn { \@@_box:N #1 } {
+ \dim_set:Nn \tex_hsize:D { \@@_mark:Nn #1 {right} }
+ #4
+ }
+ \box_set_wd:cn { \@@_box:N #1 } { \@@_mark:Nn #1 {right} }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Assembling boxes}
+%
+% \begin{macro}{\@@_extend:Nnnnn}
+% Extend a tree box. The marks are shifted so that alignment is preserved.
+% The arguments are dimensions for the left, top, right and bottom sides
+% respectively.
+% \begin{macrocode}
+\cs_new:Nn \@@_extend:Nnnnn {
+ \dim_compare:nNnF { #2 } = { 0pt } {
+ \hbox_set:cn { \@@_box:N #1 } {
+ \skip_horizontal:n { #2 }
+ \box_use:c { \@@_box:N #1 }
+ }
+ \@@_shift_x:Nn #1 { #2 }
+ }
+ \box_set_ht:Nn #1 { \box_ht:c { \@@_box:N #1 } + #3 }
+ \box_set_wd:Nn #1 { \box_wd:c { \@@_box:N #1 } + #4 }
+ \box_set_dp:Nn #1 { \box_dp:c { \@@_box:N #1 } + #5 }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_append_right:NnN}
+% Append the contents of the second tree to the first one on the right, with
+% matching baselines. The marks of both trees are preserved. The middle
+% argument specifies the space to insert between boxes.
+% \begin{macrocode}
+\cs_new:Nn \@@_append_right:NnN {
+ \hbox_set:cn { \@@_box:N #1 } {
+ \box_use:c { \@@_box:N #1 }
+ \dim_compare:nNnF { #2 } = { 0pt } { \skip_horizontal:n { #2 } }
+ \box_use:c { \@@_box:N #3 }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_append_left:NnN}
+% Append the contents of the second tree to the first one on the left, with
+% matching baselines. The marks of the first tree are shifted accordingly.
+% The middle argument specifies the space to insert between boxes.
+% \begin{macrocode}
+\cs_new:Nn \@@_append_left:NnN {
+ \@@_shift_x:Nn #1 { \box_wd:c { \@@_box:N #3 } + #2 }
+ \hbox_set:cn { \@@_box:N #1 } {
+ \box_use:c { \@@_box:N #3 }
+ \dim_compare:nNnF { #2 } = { 0pt } { \skip_horizontal:n { #2 } }
+ \box_use:c { \@@_box:N #1 }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_align:NN}
+% Shift one of two trees to the right so that their axes match. The marks of
+% the one that is shifted are updated accordingly.
+% \begin{macrocode}
+\cs_new:Nn \@@_align:NN {
+ \dim_set:Nn \l_tmpa_dim
+ { \@@_mark:Nn #2 {axis} - \@@_mark:Nn #1 {axis} }
+ \dim_compare:nNnTF \l_tmpa_dim < { 0pt } {
+ \@@_extend:Nnnnn #2 { -\l_tmpa_dim } { 0pt } { 0pt } { 0pt }
+ } {
+ \@@_extend:Nnnnn #1 { \l_tmpa_dim } { 0pt } { 0pt } { 0pt }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_append_above:NN}
+% Append the contents of the second tree above the first one, with matching
+% axes. The marks of the first tree are preserved.
+% \begin{macrocode}
+\cs_new:Nn \@@_append_above:NN {
+ \@@_align:NN #1 #2
+ \vbox_set:cn { \@@_box:N #1 } {
+ \box_use:c { \@@_box:N #2 }
+ \tex_prevdepth:D -1000pt
+ \box_use:c { \@@_box:N #1 }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_append_below:NN}
+% Append the contents of the second tree below the first one, with matching
+% axes. The marks of the first tree are preserved.
+% \begin{macrocode}
+\cs_new:Nn \@@_append_below:NN {
+ \@@_align:NN #1 #2
+ \vbox_set_top:cn { \@@_box:N #1 } {
+ \box_use:c { \@@_box:N #1 }
+ \tex_prevdepth:D -1000pt
+ \box_use:c { \@@_box:N #2 }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_overlay:NN}
+% Append the second tree as an overlay over the first one, so that the
+% baselines and axes match. The bounding box of the result adjusts to
+% contain both trees.
+% \begin{macrocode}
+\cs_new:Nn \@@_overlay:NN {
+ \@@_align:NN #1 #2
+ \hbox_set:cn { \@@_box:N #1 } {
+ \hbox_overlap_right:n { \box_use:c { \@@_box:N #1 } }
+ \box_use:c { \@@_box:N #2 }
+ \dim_compare:nNnT
+ { \box_wd:c { \@@_box:N #2 } } < { \box_wd:c { \@@_box:N #1 } }
+ { \skip_horizontal:n
+ { \box_wd:c { \@@_box:N #1 } - \box_wd:c { \@@_box:N #2 } } }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_vcenter:N}
+% Shift the material in a tree vertically so that the height and depth are
+% equal (like \TeX's \cs{vcenter} but around the baseline).
+% \begin{macrocode}
+\cs_new:Nn \@@_vcenter:N {
+ \dim_set:Nn \l_tmpa_dim
+ { ( \box_ht:c { \@@_box:N #1 } - \box_dp:c { \@@_box:N #1 } ) / 2 }
+ \box_set_eq:Nc \l_tmpa_box { \@@_box:N #1 }
+ \hbox_set:cn { \@@_box:N #1 }
+ { \box_move_down:nn { \l_tmpa_dim } { \box_use:N \l_tmpa_box } }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Making inferences}
+%
+% The following commands use the parameters defined at the beginning of the
+% package for actually building proof trees using the commands defined above.
+%
+% \begin{macro}{\@@_append_vertical:NN}
+% Append the contents of the second tree above or below the first one,
+% depending on current settings. Axes are aligned and the marks of the first
+% tree are preserved.
+% \begin{macrocode}
+\cs_new:Nn \@@_append_vertical:NN {
+ \bool_if:NTF \l_@@_updown_bool
+ { \@@_append_below:NN #1 #2 }
+ { \@@_append_above:NN #1 #2 }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_make_rule_for:NNN}
+% Make a box containing an inference rule with labels, using the current
+% settings. The width and axis position are taken as those of the conclusion
+% of another tree box. The third argument is used as a temporary register
+% for building labels.
+% \begin{macrocode}
+\cs_new:Nn \@@_make_rule_for:NNN {
+% \end{macrocode}
+% Build the rule.
+% \begin{macrocode}
+ \@@_make_vertical:Nnnn #1
+ { \@@_mark:Nn #2 {axis} - \@@_mark:Nn #2 {left} }
+ { \@@_mark:Nn #2 {right} - \@@_mark:Nn #2 {left} }
+ {
+ \skip_vertical:N \l_@@_rule_margin_dim
+ \tl_if_empty:NF { \l_@@_rule_code_tl } {
+ \tl_use:N \l_@@_rule_code_tl
+ \skip_vertical:N \l_@@_rule_margin_dim
+ }
+ }
+ \@@_vcenter:N #1
+% \end{macrocode}
+% Append the left label.
+% \begin{macrocode}
+ \tl_if_blank:VF \l_@@_left_label_tl {
+ \@@_make_simple:Nn #3 {
+ \box_move_down:nn { \l_@@_label_axis_dim } { \hbox:n {
+ \cs_set_eq:NN \inserttext \l_@@_left_label_tl
+ \tl_use:N \l_@@_left_label_template_tl
+ } }
+ }
+ \box_set_ht:cn { \@@_box:N #3 } { 0pt }
+ \box_set_dp:cn { \@@_box:N #3 } { 0pt }
+ \@@_append_left:NnN
+ \l_@@_c_box \l_@@_label_separation_dim \l_@@_d_box
+ }
+% \end{macrocode}
+% Append the right label.
+% \begin{macrocode}
+ \tl_if_blank:VF \l_@@_right_label_tl {
+ \@@_make_simple:Nn #3 {
+ \box_move_down:nn { \l_@@_label_axis_dim } { \hbox:n {
+ \cs_set_eq:NN \inserttext \l_@@_right_label_tl
+ \tl_use:N \l_@@_right_label_template_tl
+ } }
+ }
+ \box_set_ht:cn { \@@_box:N #3 } { 0pt }
+ \box_set_dp:cn { \@@_box:N #3 } { 0pt }
+ \@@_append_right:NnN
+ \l_@@_c_box \l_@@_label_separation_dim \l_@@_d_box
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Stack-based interface}
+%
+% \subsubsection{The stack}
+%
+% Logically, box structures are stored on a stack. However, \TeX\ does not
+% provide data structures for that and the grouping mechanism is not flexible
+% enough, so we encode them using what we actually have. A stack for boxes is
+% implemented using a global hbox \cs{g_@@_stack_box} that contains all the
+% boxes successively. A sequence \cs{g_@@_stack_seq} is used to store the
+% dimensions property lists textually. We maintain a counter
+% \cs{g_@@_level_int} with the number of elements on the stack, for
+% consistency checks.
+% \begin{macrocode}
+\int_new:N \g_@@_level_int
+\box_new:N \g_@@_stack_box
+\seq_new:N \g_@@_stack_seq
+% \end{macrocode}
+%
+% \begin{macro}{\@@_clear_stack:}
+% Clear the stack.
+% \begin{macrocode}
+\cs_new:Nn \@@_clear_stack: {
+ \int_gset:Nn \g_@@_level_int { 0 }
+ \hbox_gset:Nn \g_@@_stack_box { }
+ \seq_gclear:N \g_@@_stack_seq
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_push:N}
+% Push the contents of a register on the stack.
+% \begin{macrocode}
+\cs_new:Nn \@@_push:N {
+ \int_gincr:N \g_@@_level_int
+ \hbox_gset:Nn \g_@@_stack_box
+ { \hbox_unpack:N \g_@@_stack_box \box_use:c { \@@_box:N #1 } }
+ \seq_gput_left:Nv \g_@@_stack_seq
+ { \@@_marks:N #1 }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_pop:N}
+% Pop the value from the top of the stack into a register.
+% \begin{macrocode}
+\cs_new:Nn \@@_pop:N {
+ \int_compare:nNnTF { \g_@@_level_int } > { 0 } {
+ \int_gdecr:N \g_@@_level_int
+ \hbox_gset:Nn \g_@@_stack_box {
+ \hbox_unpack:N \g_@@_stack_box
+ \box_gset_to_last:N \g_tmpa_box
+ }
+ \box_set_eq_drop:cN { \@@_box:N #1 } \g_tmpa_box
+ \seq_gpop_left:NN \g_@@_stack_seq \l_tmpa_tl
+ \tl_set_eq:cN { \@@_marks:N #1 } \l_tmpa_tl
+ } {
+ \PackageError{ebproof}{Missing~premiss~in~a~proof~tree}{}
+ \@@_clear:N #1
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Assembling trees}
+%
+% \begin{macrocode}
+\@@_new:N \l_@@_a_box
+\@@_new:N \l_@@_b_box
+\@@_new:N \l_@@_c_box
+\@@_new:N \l_@@_d_box
+% \end{macrocode}
+%
+% \begin{macro}{\@@_join_horizontal:n}
+% Join horizontally a number of elements at the top of the stack. If several
+% trees are joined, use the left mark of the left tree, the right mark of
+% the right tree and set the axis in the middle of these marks.
+% \begin{macrocode}
+\cs_new:Nn \@@_join_horizontal:n {
+ \int_case:nnF { #1 } {
+ { 0 } {
+ \group_begin:
+ \@@_clear:N \l_@@_a_box
+ \@@_push:N \l_@@_a_box
+ \group_end:
+ }
+ { 1 } { }
+ } {
+ \group_begin:
+ \@@_pop:N \l_@@_a_box
+ \prg_replicate:nn { #1 - 1 } {
+ \@@_pop:N \l_@@_b_box
+ \@@_append_left:NnN
+ \l_@@_a_box \l_@@_separation_dim \l_@@_b_box
+ }
+ \@@_set_mark:Nnn \l_@@_a_box { left }
+ { \@@_mark:Nn \l_@@_b_box { left } }
+ \@@_set_mark:Nnn \l_@@_a_box { axis }
+ { ( \@@_mark:Nn \l_@@_a_box { left }
+ + \@@_mark:Nn \l_@@_a_box { right } ) / 2 }
+ \@@_push:N \l_@@_a_box
+ \group_end:
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_join_vertical:}
+% Join vertically the two elements at the top of the stack, with a
+% horizontal rule of the appropriate size.
+% \begin{macrocode}
+\cs_new:Nn \@@_join_vertical: {
+ \group_begin:
+ \@@_pop:N \l_@@_a_box
+ \@@_pop:N \l_@@_b_box
+ \@@_enlarge_conclusion:NN \l_@@_b_box \l_@@_a_box
+ \@@_make_rule_for:NNN \l_@@_c_box \l_@@_b_box
+ \l_@@_d_box
+ \@@_append_vertical:NN \l_@@_a_box \l_@@_c_box
+ \@@_append_vertical:NN \l_@@_a_box \l_@@_b_box
+ \@@_push:N \l_@@_a_box
+ \group_end:
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{High-level commands}
+%
+% \begin{macro}{\@@_statement_parse:w}
+% An auxiliary function for parsing the argument in
+% \cs{@@_push_statement:n}.
+% \begin{macrocode}
+\cs_new:Npn \@@_statement_parse:w #1 & #2 & #3 \q_stop {
+ \tl_if_empty:nTF { #3 } {
+ \@@_make_simple:Nn \l_@@_a_box
+ { \cs_set:Npn \inserttext { #1 } \tl_use:N \l_@@_template_tl }
+ } {
+ \@@_make_split:Nnn \l_@@_a_box
+ { \cs_set:Npn \inserttext { #1 } \tl_use:N \l_@@_left_template_tl }
+ { \cs_set:Npn \inserttext { #2 } \tl_use:N \l_@@_right_template_tl }
+ }
+ \@@_push:N \l_@@_a_box
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_push_statement:n}
+% Push a box with default formatting, using explicit alignment if the code
+% contains a |&| character
+% \begin{macrocode}
+\cs_new:Nn \@@_push_statement:n {
+ \@@_statement_parse:w #1 & & \q_stop
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Document interface}
+%
+% \subsubsection{Functions to define statements}
+%
+% The \cs{g_@@_statements_seq} variable contains the list of all defined
+% statements. For each statement |X|, there is a document command \cs{ebproofX}
+% and the alias \cs{X} is defined when entering a |prooftree| environment.
+% \begin{macrocode}
+\seq_new:N \g_@@_statements_seq
+% \end{macrocode}
+%
+% \begin{macro}{\@@_setup_statements:}
+% Install the aliases for statements, saving the original value of the control
+% sequences.
+% \begin{macrocode}
+\cs_new:Nn \@@_setup_statements: {
+ \seq_map_inline:Nn \g_@@_statements_seq {
+ \cs_set_eq:cc { ebproof_saved_ ##1 } { ##1 }
+ \cs_set_eq:cc { ##1 } { ebproof ##1 }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_restore_statements:}
+% Restore the saved meanings of the control sequences. This is useful when
+% interpreting user-provided code in statement arguments. The meanings are
+% automatically restored when leaving a |prooftree| environment because of
+% grouping.
+% \begin{macrocode}
+\cs_new:Nn \@@_restore_statements: {
+ \seq_map_inline:Nn \g_@@_statements_seq {
+ \cs_set_eq:cc { ##1 } { ebproof_saved_ ##1 }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_new_statement:nnn}
+% Define a new statement. The first argument is the name, the second one is
+% an argument specifier as used by |xparse| and the third one is the body of
+% the command.
+% \begin{macrocode}
+\cs_new:Nn \@@_new_statement:nnn {
+ \exp_args:Nc \NewDocumentCommand { ebproof#1 }{ #2 } { #3 }
+ \seq_gput_right:Nn \g_@@_statements_seq { #1 }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_new_deprecated_statement:nnnn}
+% Define a deprecated statement. The syntax is the same as above except that
+% an extra argument in third position indicates what should be used instead.
+% The effect is the same except that a warning message is issued the first
+% time the statement is used.
+% \begin{macrocode}
+\cs_new:Nn \@@_new_deprecated_statement:nnnn {
+ \cs_new:cpn { ebproof_#1_warning: } {
+ \PackageWarning { ebproof } { \token_to_str:c{#1}~is~deprecated,~#3 }
+ \cs_gset:cn { ebproof_#1_warning: } { }
+ }
+ \@@_new_statement:nnn { #1 } { #2 }
+ { \use:c { ebproof_#1_warning: } #4 }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Basic commands}
+%
+% \begin{macro}{\ebproofset,\set}
+% This is a simple wrapper around \cs{keys_set:nn}.
+% \begin{macrocode}
+\@@_new_statement:nnn { set } { m } {
+ \keys_set:nn { ebproof } { #1 }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hypo}
+% This is mostly a wrapper around \cs{ebproof_push_statement:n}, with
+% material to handle options and the statements macros.
+% \begin{macrocode}
+\@@_new_statement:nnn { hypo } { O{} m } {
+ \group_begin:
+ \@@_restore_statements:
+ \keys_set:nn { ebproof } { #1 }
+ \@@_push_statement:n { #2 }
+ \group_end:
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\infer}
+% This is a bit more involved than \cs{hypo} because we have to handle rule
+% style options and joining.
+% \begin{macrocode}
+\@@_new_statement:nnn { infer } { O{} m O{} m } {
+ \group_begin:
+ \@@_restore_statements:
+ \keys_set_known:nnN { ebproof / rule~style } { #1 } \l_tmpa_tl
+ \keys_set:nV { ebproof } \l_tmpa_tl
+ \tl_set:Nn \l_@@_right_label_tl { #3 }
+ \@@_join_horizontal:n { #2 }
+ \@@_push_statement:n { #4 }
+ \@@_join_vertical:
+ \group_end:
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ellipsis}
+% An ellipsis is made by hand using vertical leaders to render the dots
+% after rendering the label.
+% \begin{macrocode}
+\@@_new_statement:nnn { ellipsis } { m m } {
+ \group_begin:
+ \@@_restore_statements:
+ \tl_clear:N \l_@@_rule_code_tl
+ \@@_make_split:Nnn \l_@@_a_box { } {
+ \vbox_set:Nn \l_tmpa_box {
+ \skip_vertical:n { 1.2ex }
+ \hbox:n { \tex_ignorespaces:D #1 }
+ \skip_vertical:n { 1.2ex }
+ }
+ \vbox_to_ht:nn { \box_ht:N \l_tmpa_box } {
+ \tex_xleaders:D \vbox_to_ht:nn { .8ex }
+ { \tex_vss:D \hbox:n { . } \tex_vss:D }
+ \tex_vfill:D
+ }
+ \hbox_overlap_right:n { ~ \box_use:N \l_tmpa_box }
+ }
+ \@@_push:N \l_@@_a_box
+ \@@_join_vertical:
+ \@@_push_statement:n {#2}
+ \@@_join_vertical:
+ \group_end:
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Modifying trees}
+%
+% \begin{macro}{\rewrite}
+% Rewrite the box at the top of the stack while preserving its dimensions an
+% marks. The code is typeset in horizontal mode, with control sequences to
+% access the original box and its marks.
+% \begin{macrocode}
+\@@_new_statement:nnn { rewrite } { m } {
+ \group_begin:
+ \@@_restore_statements:
+ \@@_pop:N \l_@@_a_box
+ \box_set_eq:Nc \l_tmpa_box { \@@_box:N \l_@@_a_box }
+ \hbox_set:Nn \l_tmpb_box {
+ \cs_set_eq:NN \treebox \l_tmpa_box
+ \cs_set:Npn \treemark { \@@_mark:Nn \l_@@_a_box }
+ { #1 }
+ }
+ \box_set_wd:Nn \l_tmpb_box { \box_wd:c { \@@_box:N \l_@@_a_box } }
+ \box_set_ht:Nn \l_tmpb_box { \box_ht:c { \@@_box:N \l_@@_a_box } }
+ \box_set_dp:Nn \l_tmpb_box { \box_dp:c { \@@_box:N \l_@@_a_box } }
+ \box_set_eq:cN { \@@_box:N \l_@@_a_box } \l_tmpb_box
+ \@@_push:N \l_@@_a_box
+ \group_end:
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\delims}
+% Insert \cs{left} and \cs{right} delimiters without changing the alignment.
+% \begin{macrocode}
+\@@_new_statement:nnn { delims } { m m } {
+ \group_begin:
+ \@@_restore_statements:
+ \@@_pop:N \l_@@_a_box
+ \hbox_set:Nn \l_tmpa_box
+ { $ \tex_vcenter:D { \box_use:c { \@@_box:N \l_@@_a_box } } $ }
+ \dim_set:Nn \l_tmpa_dim
+ { \box_ht:N \l_tmpa_box - \box_ht:c { \@@_box:N \l_@@_a_box } }
+ \hbox_set:cn { \@@_box:N \l_@@_a_box } {
+ $ #1 \tex_vrule:D
+ height \box_ht:N \l_tmpa_box depth \box_dp:N \l_tmpa_box width 0pt
+ \tex_right:D . $
+ }
+ \@@_shift_x:Nn \l_@@_a_box
+ { \box_wd:c { \@@_box:N \l_@@_a_box } }
+ \hbox_set:cn { \@@_box:N \l_@@_a_box } {
+ \hbox_unpack:c { \@@_box:N \l_@@_a_box }
+ $ \tex_left:D . \box_use:N \l_tmpa_box #2 $
+ }
+ \hbox_set:cn { \@@_box:N \l_@@_a_box }
+ { \box_move_down:nn { \l_tmpa_dim }
+ { \box_use:c { \@@_box:N \l_@@_a_box } } }
+ \@@_push:N \l_@@_a_box
+ \group_end:
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\overlay}
+% Pop two trees and append the second tree as an overlay over the first one,
+% so that the baselines and axes match. The bounding box of the result
+% adjusts to contain both trees.
+% \begin{macrocode}
+\@@_new_statement:nnn { overlay } { } {
+ \group_begin:
+ \@@_pop:N \l_@@_a_box
+ \@@_pop:N \l_@@_b_box
+ \@@_overlay:NN \l_@@_a_box \l_@@_b_box
+ \@@_push:N \l_@@_a_box
+ \group_end:
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Deprecated statements}
+%
+% These statements were defined in versions 1.x of the package, they are
+% preserved for temporary upwards compatibility and will be removed in a
+% future version.
+% \begin{macrocode}
+\@@_new_deprecated_statement:nnnn { Alter } { m }
+ { use~\token_to_str:c{rewrite}~instead } { \ebproofrewrite{ #1 \box\treebox } }
+\@@_new_deprecated_statement:nnnn { Delims } { }
+ { use~\token_to_str:c{delims}~instead } { \ebproofdelims }
+\@@_new_deprecated_statement:nnnn { Ellipsis } { }
+ { use~\token_to_str:c{ellipsis}~instead } { \ebproofellipsis }
+\@@_new_deprecated_statement:nnnn { Hypo } { }
+ { use~\token_to_str:c{hypo}~instead } { \ebproofhypo }
+\@@_new_deprecated_statement:nnnn { Infer } { }
+ { use~\token_to_str:c{infer}~instead } { \ebproofinfer }
+% \end{macrocode}
+%
+%
+% \subsubsection{Environment interface}
+%
+% The stack is initialised globally. The \env{prooftree} environment does not
+% clear the stack, instead it saves the initial level in order to check that
+% statements are properly balanced. This allows for nested uses of the
+% environment, if it ever happens to be useful.
+%
+% \begin{macrocode}
+\@@_clear_stack:
+\tl_new:N \l_@@_start_level_tl
+% \end{macrocode}
+%
+% \begin{macro}{prooftree,prooftree*}
+% The \env{prooftree} environment.
+% \begin{macrocode}
+\NewDocumentEnvironment { prooftree } { s O{} } {
+ \group_align_safe_begin:
+ \keys_set_known:nnN { ebproof / proof~style } { #2 } \l_tmpa_tl
+ \keys_set:nV { ebproof } \l_tmpa_tl
+ \tl_set:Nx \l_@@_start_level_tl { \int_use:N \g_@@_level_int }
+ \vbox_set:Nw \l_tmpa_box
+ \@@_setup_statements:
+} {
+ \vbox_set_end:
+ \@@_pop:N \l_@@_a_box
+ \int_compare:nNnF { \g_@@_level_int } = { \tl_use:N \l_@@_start_level_tl } {
+ \PackageError{ebproof}{Malformed~proof~tree}{
+ Some~hypotheses~were~declared~but~not~used~in~this~tree.}
+ }
+ \IfBooleanTF { #1 } {
+ \[ \box_use:c { \@@_box:N \l_@@_a_box } \]
+ \ignorespacesafterend
+ } {
+ \hbox_unpack:N \c_empty_box
+ \bool_if:NTF \l_@@_center_bool {
+ \hbox:n { $ \tex_vcenter:D { \box_use:c { \@@_box:N \l_@@_a_box } } $ }
+ } {
+ \box_use:c { \@@_box:N \l_@@_a_box }
+ }
+ }
+ \group_align_safe_end:
+}
+% \end{macrocode}
+% A trick for the starred version:
+% \begin{macrocode}
+\cs_new:cpn { prooftree* } { \prooftree* }
+\cs_new:cpn { endprooftree* } { \endprooftree }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/ebproof/ebproof.ins b/Master/texmf-dist/source/latex/ebproof/ebproof.ins
new file mode 100644
index 00000000000..2a62d0abae9
--- /dev/null
+++ b/Master/texmf-dist/source/latex/ebproof/ebproof.ins
@@ -0,0 +1,15 @@
+%% Copyright (C) 2015-2021 by Emmanuel Beffara
+%%
+%% This file 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:
+%%
+%% http://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.
+
+\input l3docstrip.tex
+\keepsilent \askforoverwritefalse
+\generate{\file{ebproof.sty}{\from{ebproof.dtx}{package}}}
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/ejpecp/ejpecp.dtx b/Master/texmf-dist/source/latex/ejpecp/ejpecp.dtx
index ca4cb819ea3..8e9d67c4e17 100644
--- a/Master/texmf-dist/source/latex/ejpecp/ejpecp.dtx
+++ b/Master/texmf-dist/source/latex/ejpecp/ejpecp.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (c) 2019 by Edgaras SAKURAS, VTeX, Lithuania for EJP-ECP
+% Copyright (c) 2019-2020 by Edgaras SAKURAS, VTeX, Lithuania for EJP-ECP
% Copyright (c) 2018 by Deimantas GALCIUS, VTeX, Lithuania
% Copyright (c) 2016-2017 by Eimantas GUMBAKIS, VTeX, Lithuania for EJP-ECP
% Copyright (c), 2011-2015 by Krzysztof BURDZY and Djalil CHAFAI for EJP-ECP
@@ -11,7 +11,7 @@
% of this license or (at your option) any later version.
% The latest version of this license is in:
%
-% http://www.latex-project.org/lppl.txt
+% https://www.latex-project.org/lppl.txt
%
% and version 1.2 or later is part of all distributions of LaTeX
% version 1999/12/01 or later.
@@ -26,9 +26,9 @@
%<class>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<class>\ProvidesClass{ejpecp}
%<*class>
- [2019/04/04 v1.7 class for EJP and ECP journals]
+ [2020/10/21 v1.9.0 class for EJP and ECP journals]
%</class>
-%<class>\ClassInfo{ejpecp}{Copyright (c) 2019 Edgaras SAKURAS, VTeX, Lithuania.}
+%<class>\ClassInfo{ejpecp}{Copyright (c) 2019-2020 Edgaras SAKURAS, VTeX, Lithuania.}
%<class>\ClassInfo{ejpecp}{Copyright (c) 2018 Deimantas GALCIUS, VTeX, Lithuania.}
%<class>\ClassInfo{ejpecp}{Copyright (c) 2016-2017 Eimantas GUMBAKIS, VTeX, Lithuania for EJP-ECP.}
%<class>\ClassInfo{ejpecp}{Copyright (c), 2011-2015 BURDZY and CHAFAI for EJP-ECP.}
@@ -47,7 +47,7 @@
%</driver>
% \fi
%
-% \CheckSum{785}
+% \CheckSum{845}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -79,13 +79,16 @@
% \changes{v1.5}{2016/09/06}{hypertexnames=false configuration for hyperref package}
% \changes{v1.6}{2019/03/28}{full url doi, package maintaining and shorttitle info}
% \changes{v1.7}{2019/04/04}{merged with production version: fixltx2e removed, natbib setup with afterpackage, etc}
+% \changes{v1.8.2}{2020/07/30}{no. prefix updated and msc2020}
+% \changes{v1.8.3}{2020/08/26}{Update URLs}
+% \changes{v1.9.0}{2020/10/21}{Supplement envirnment}
% \GetFileInfo{ejpecp.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment}
%
% \title{The ejpecp class\thanks{\fileinfo\ \fileversion\ dated \filedate.}%
% \thanks{Current maintainer of class file is
-% \href{http://www.vtex.lt}{VTeX, Lithuania}. Please send all queries to
+% \href{https://vtex.lt}{VTeX, Lithuania}. Please send all queries to
% \href{mailto:latex-support@vtex.lt}{\texttt{latex-support@vtex.lt}}.}}
%
% \author{K. Burdzy\and \href{http://djalil.chafai.net/}{D. Chafa\"\i}}
@@ -132,6 +135,7 @@
\newcommand{\@JOURNALL}{Electronic Journal of Probability}
\newcommand{\@ISSN}{1083-6489}
\newcommand{\@URL}{www.imstat.org/ejp}
+ \newcommand{\@FULLURL}{https://imstat.org/journals-and-publications/electronic-journal-of-probability/}
}
\DeclareOption{ECP}{%
\newcommand{\@ECP}{}
@@ -140,6 +144,7 @@
\newcommand{\@JOURNALL}{Electronic Communications in Probability}
\newcommand{\@ISSN}{1083-589X}
\newcommand{\@URL}{www.imstat.org/ecp}
+ \newcommand{\@FULLURL}{https://imstat.org/journals-and-publications/electronic-communications-in-probability/}
}
\DeclareOption{NOAMS}{% prevents the load of AMS packages
\newcommand{\@NOAMS}{}
@@ -287,9 +292,11 @@
}%ECPLOGO
\def\@doiprefix{https://doi.org/}
\def\printdoi{\texttt{\href{\@doiprefix\@DOI}{\@doiprefix\@DOI}}}
+\def\msc@url{https://ams.org/mathscinet/msc/msc2020.html}
%% make title long
\renewcommand\title[1]{\gdef\@title{#1}}
%% Macro handling the first page
+\def\papernum@name{no.}
\newcommand{\FIRSTPAGE}{%
\setcounter{page}{\@PAGESTART}%
\title{\small
@@ -297,8 +304,8 @@
\@EJPLOGO
\bigskip
\centerline{\@JOURNALA\ \textbf{\@VOLUME} (\@YEAR),\
- no. \@PAPERNUM, \,\@PAGESTART--\@PAGEEND.}%
- \centerline{ISSN:\ \texttt{\href{http://\@URL/}{\@ISSN}} %
+ \papernum@name\ \@PAPERNUM, \,\@PAGESTART--\@PAGEEND.}%
+ \centerline{ISSN:\ \texttt{\href{\@FULLURL}{\@ISSN}} %
\ifx\@DOI\undefined\else
\ \printdoi
\fi}%
@@ -310,12 +317,12 @@
\else
\parbox[t]{9cm}{%
\@JOURNALA\ \textbf{\@VOLUME} (\@YEAR),
- no. \@PAPERNUM, \@PAGESTART--\@PAGEEND.\\
+ \papernum@name\ \@PAPERNUM, \@PAGESTART--\@PAGEEND.\\
\ifx\@DOI\undefined
\else
\ \printdoi
\fi \\
- ISSN:\ \texttt{\href{http://\@URL/}{\@ISSN}}%
+ ISSN:\ \texttt{\href{\@FULLURL}{\@ISSN}}%
}%
\hfill
\@ECPLOGO\\
@@ -336,7 +343,7 @@
\@ABSTRACT\par\vskip 1em\relax
{\footnotesize
\noindent\textbf{Keywords: }\@KEYWORDS.\par
- \noindent\textbf{AMS MSC 2010: }%
+ \noindent\href\msc@url{\textbf{MSC2020 subject classifications: }}%
\ifx\@AMSSUBJSECONDARY\undefined
\noindent
\@AMSSUBJ.\par
@@ -351,13 +358,13 @@
\else
\noindent
Supersedes
- \texttt{\href{http://arXiv.org/abs/\@ARXIVID}{arXiv:\@ARXIVID}}.%
+ \texttt{\href{https://arXiv.org/abs/\@ARXIVID}{arXiv:\@ARXIVID}}.%
\fi\par
\ifx\@HALID\undefined
\else
\noindent
Supersedes
- \texttt{\href{http://hal.archives-ouvertes.fr/\@HALID}{HAL:\@HALID}}.%
+ \texttt{\href{https://hal.archives-ouvertes.fr/\@HALID}{HAL:\@HALID}}.%
\fi\par
}%footnotesize
\end{abstract}
@@ -368,20 +375,40 @@
%% Macro setting the PDF title
\newcommand{\PDFFIELDS}{%
\hypersetup{%
- pdftitle={\@JOURNALA\ \@VOLUME\ (\@YEAR), no. \@PAPERNUM, \@doiprefix\@DOI}}%
+ pdftitle={\@JOURNALA\ \@VOLUME\ (\@YEAR), \papernum@name\ \@PAPERNUM, \@doiprefix\@DOI}}%
\hypersetup{pdfkeywords={\@KEYWORDS}}%
- \hypersetup{pdfproducer={\@JOURNAL\ Managing Editor http://\@URL/}}%
- \hypersetup{pdfcreator={LaTeX with ejpecp.cls v1.4}}%
+ \hypersetup{pdfproducer={\@JOURNAL\ Managing Editor https://\@URL}}%
+ \hypersetup{pdfcreator={LaTeX with ejpecp.cls v1.8.2}}%
\hypersetup{pdfsubject={Probability Theory}}%
\hypersetup{pdfauthor={Please see \@doiprefix\@DOI}}%
}%END-PDFFIELDS
+%% Supplement
+\def\supplement@name{Supplementary Material}
+\def\stitle#1{\def\@stitle{#1}}
+\def\stitle@fmt#1{\textbf{#1.}\ }
+\def\sdescription#1{\def\@sdescription{#1}}
+\def\suppsection@fmt{\section*{\supplement@name}}
+\long\def\supplement{\@ifnextchar[{\@supplement}{\@supplement[]}}
+\long\def\@supplement[#1]{%
+ \suppsection@fmt
+ \global\let\suppsection@fmt\smallskip
+ }
+\def\endsupplement{%
+ \@ifundefined{@stitle}%
+ {}%
+ {\stitle@fmt{\@stitle}}%
+ %
+ \@ifundefined{@sdescription}{}{\@sdescription}%
+ \par
+ }
+
%% Bibliography
\def\@MRExtract#1 #2!{#1} % thanks, Martin!
\newcommand{\MR}[1]{% we need to strip the "(...)"
\xdef\@MRSTRIP{\@MRExtract#1 !}%
- \href{http://www.ams.org/mathscinet-getitem?mr=\@MRSTRIP}{MR-\@MRSTRIP}}
-\newcommand{\ARXIV}[1]{\href{http://arXiv.org/abs/#1}{arXiv:#1}}
+ \href{https://mathscinet.ams.org/mathscinet-getitem?mr=\@MRSTRIP}{MR-\@MRSTRIP}}
+\newcommand{\ARXIV}[1]{\href{https://arXiv.org/abs/#1}{arXiv:#1}}
\def\bibliography@size{\small}
\renewenvironment{thebibliography}[1]
{%
@@ -484,7 +511,7 @@
\renewcommand{\@evenfoot}{%
\normalfont\footnotesize\@HBLOB\hfil
\small\raisebox{-1em}{Page \thepage/\@PAGEEND}\hfil
- \footnotesize\href{http://\@URL/}{http://\@URL/}}
+ \footnotesize\href{\@FULLURL}{https://\@URL}}
\renewcommand{\@oddfoot}{\@evenfoot}
\renewcommand{\@evenhead}{\hfil\@SHORTTITLE\hfil}
\renewcommand{\@oddhead}{\@evenhead}
@@ -530,7 +557,10 @@
\fi
}%
}%
-\InputIfFileExists{ejpecp.cfg}{}{}
+\def\amp{&}%
+\InputIfFileExists{ejpecp.cfg}
+ {}
+ {\def\papernum@name{article no.}}
%% Macros
\AtBeginDocument{\FIRSTPAGE\PDFFIELDS}
\AtEndDocument{\vfill}
diff --git a/Master/texmf-dist/source/latex/ejpecp/ejpecp.ins b/Master/texmf-dist/source/latex/ejpecp/ejpecp.ins
index fb44b8d82c5..43a1cf1c3b3 100644
--- a/Master/texmf-dist/source/latex/ejpecp/ejpecp.ins
+++ b/Master/texmf-dist/source/latex/ejpecp/ejpecp.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (c) 2019 by Edgaras SAKURAS, VTeX, Lithuania for EJP-ECP
+%% Copyright (c) 2019-2020 by Edgaras SAKURAS, VTeX, Lithuania for EJP-ECP
%% Copyright (c) 2018 by Deimantas GALCIUS, VTeX, Lithuania for EJP-ECP
%% Copyright (c) 2016-2017 by Eimantas GUMBAKIS, VTeX, Lithuania for EJP-ECP
%% Copyright (c), 2011-2015 by Krzysztof BURDZY and Djalil CHAFAI for EJP-ECP
@@ -9,7 +9,7 @@
%% or (at your option) any later version. The latest version of this
%% license is in:
%%
-%% http://www.latex-project.org/lppl.txt
+%% https://www.latex-project.org/lppl.txt
%%
%% and version 1.2 or later is part of all distributions of LaTeX version
%% 1999/12/01 or later.
@@ -24,7 +24,7 @@
This is a generated file.
-Copyright (c) 2019 by Edgaras SAKURAS, VTeX, Lithuania for EJP-ECP
+Copyright (c) 2019-2020 by Edgaras SAKURAS, VTeX, Lithuania for EJP-ECP
Copyright (c) 2018 by Deimantas GALCIUS, VTeX, Lithuania for EJP-ECP
Copyright (c) 2016-2017 by Eimantas GUMBAKIS, VTeX, Lithuania for EJP-ECP
Copyright (c), 2011-2015 by Krzysztof BURDZY and Djalil CHAFAI for EJP-ECP
@@ -34,7 +34,7 @@ the LaTeX Project Public License, either version 1.2 of this license
or (at your option) any later version. The latest version of this
license is in:
- http://www.latex-project.org/lppl.txt
+ https://www.latex-project.org/lppl.txt
and version 1.2 or later is part of all distributions of LaTeX version
1999/12/01 or later.
diff --git a/Master/texmf-dist/source/latex/ellipsis/ellipsis.dtx b/Master/texmf-dist/source/latex/ellipsis/ellipsis.dtx
index 4db66a1410b..6cdc6c0994e 100644
--- a/Master/texmf-dist/source/latex/ellipsis/ellipsis.dtx
+++ b/Master/texmf-dist/source/latex/ellipsis/ellipsis.dtx
@@ -1,29 +1,79 @@
% \iffalse meta-comment
+%<*package>
+%%
+%% Copyright (C) 2003-2020 by Peter Heslin <p.j.heslin@dur.ac.uk>
+%% ---------------------------------------------------------------------
+%%
+%% This work may be distributed and/or modified under the conditions
+%% of the LaTeX Project Public License, version 1.3c of the license
+%% or (at your option) any later version. The latest version of this
+%% license is in:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3c or later is part of all distributions of
+%% LaTeX version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status "author-maintained".
+%%
+%% The current maintainer and author of this work is Peter Heslin.
+%%
+%</package>
+% \fi
%
-% Copyright (C) 2003 by Peter J. Heslin <p.j.heslin@dur.ac.uk>
-% --------------------------------------------------
-%
-% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, either version 1.2 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.2 or later is part of all distributions of LaTeX
-% version 1999/12/01 or later.
-%
+% \iffalse
+%<*batch>
+\ifx\documentclass\undefined
+
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\usedir{tex/latex/ellipsis}
+
+\preamble
+
+ellipsis -- fixes spacing around ellipses (three dots)
+
+\endpreamble
+
+\generate{\file{ellipsis.sty}{\from{ellipsis.dtx}{package}}}
+
+\obeyspaces
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* ellipsis.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file ellipsis.dtx *}
+\Msg{* through LaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\else
+
+\let\endbatchfile\relax
+
+\fi
+\endbatchfile
+%</batch>
% \fi
%
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}
-%<package>\ProvidesPackage{ellipsis}
-%<package> [2004/9/28 v1.6 ellipsis: fixes spacing around \dots]
-%
+%<*driver>
+\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
+\ProvidesFile{ellipsis.dtx}%
+%</driver>
+%<package>\ProvidesPackage{ellipsis}%
+ [2020/05/22 v1.8 fixes spacing around ellipses (three dots)]
%<*driver>
\documentclass{ltxdoc}
\usepackage{ellipsis}
-\EnableCrossrefs
+\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
@@ -32,7 +82,7 @@
%</driver>
% \fi
%
-% \CheckSum{135}
+% \CheckSum{153}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -65,198 +115,192 @@
% from being gobbled.}
% \changes{v1.5}{2004/9/24}{Added the xspace option.}
% \changes{v1.6}{2004/9/28}{Fixed incompatibility with French Babel.}
+% \changes{v1.7}{2020/5/22}{Fixed incompatilbility with amsmath; fixed fragile
+% command; fixed spacing when \cs{nofrenchspacing}; all fixes thanks to Frank
+% Mittelbach. Added ref to xellipsis package.}
+% \changes{v1.8}{2004/9/28}{Code cleanups contributed by Falk Hanisch.}
%
% \GetFileInfo{ellipsis.sty}
%
% \title{The \textsf{ellipsis} package\thanks{This document
% corresponds to \textsf{ellipsis}~\fileversion, dated \filedate.
% Many thanks to Frank Mittelbach, who made numerous suggestions
-% that greatly improved this package.}}
-% \author{Peter J. Heslin \\ \texttt{p.j.heslin@dur.ac.uk}}
+% and bugfixes that greatly improved this package.}}
+% \author{^^A
+% Peter J. Heslin\\^^A
+% \texttt{p.j.heslin@dur.ac.uk}\\^^A
+% \texttt{https://github.com/pjheslin/ellipsis}}
%
% \maketitle
%
% \section{Introduction}
%
-% There is an unevenness in the way \LaTeX\ puts space around ellipses
-% (|\dots|) in text mode. It is a small problem, but it is a serious
-% matter for those who care about such things. This package attempts
-% to fix that bug, and this documentation offers an explanation of the
-% bug and offers advice on how to use ellipses in your text. This
-% document should not be taken as offering guidance on the use of
-% ellipses in mathematical formulas or non-English language text.
-%
-% The standard definition of |\dots| in \LaTeX\ takes the inter-word
-% stretch for the current font and puts that amount of space in
-% between three normal dots; it then also adds that amount of space
-% \emph{after} the final dot. The documentation of the \LaTeX\ code
-% acknowledges that this is a `kludge' in that the interword stretch
-% is being used for a purpose it was not meant for. There is another
-% problem with this definition, however: the extra space after the
-% final dot of the ellipsis. Thus there is always more space after
-% the ellipsis than before it, so that it is not properly centered
-% between the text on either side.
-%
-% That extra space is there for a good reason. When the ellipsis is
-% followed by another dot, as at the end of a sentence, it is
-% important that all four dots should be evenly spaced, otherwise the
-% final dot is much closer than the others and the result is hideous.
-% The same holds true for commas, exclamation marks and other
-% punctuation on the baseline. So the extra space is necessary when
-% an ellipsis is followed by certain punctuation characters, and the
-% bug consists in the fact that \LaTeX\ always adds it, regardless of
-% what text follows.
-%
-% This package implements a simple fix. It redefines the |\dots| and
-% |\textellipsis| commands so that they can look ahead at the next
-% character and change their behavior accordingly: if the next
-% character is one of .,;:?! the extra space is added, if not, no
-% extra space is added (if you load a package that makes any of these
-% characters active, you may want to reload this list; see the section
-% below on see below on |\ellipsispunctuation| and compatibility).
-% This particular list of punctuation marks was not chosen
-% arbitrarily: it includes all marks with a dot on the baseline (or a
-% comma, which is like a dot with a tail). These marks produce a
-% series of four dots which must be spaced evenly~-- no other
-% punctuation mark would normally benefit from having the extra space
-% added.
-%
-% The solution can be brittle~-- for example, if you write |\dots{}.|
-% then the extra space will \emph{not} be added, since the braces come
-% between the command and the dot; the result will be very ugly. The
-% solution to this is to enter ellipses carefully and consistently in
-% your source text. If you use ellipses as recommended below, then
-% the potential problem of evenly spacing an ellipsis that comes
-% immediately after a baseline punctuation mark does not arise, since
-% that combination of characters will not normally be used.
-%
-% There is another package, \textsf{lips.sty}, that addresses the
-% problem of text ellipses in \LaTeX. It strictly follows the advice
-% of the \emph{Chicago Manual of Style} in putting full word spaces
-% between the dots of the ellipsis, and does not provide the
-% possibility of more a tightly set ellipsis like the normal \LaTeX\
-% default. It imposes its own set of rules for the spacing before and
-% after an ellipsis. Many typographers, however, firmly reject the
-% Chicago style of setting ellipses, and rightly so; see Jan
-% Tschichold, \emph{The Form of the Book: Essays on the Morality of
-% Good Design} (Hartley \& Marks, 1991), pp~130f, or Robert
+% There is an unevenness in the way \LaTeX\ puts space around ellipses (|\dots|)
+% in text mode. This package attempts to fix that bug, and this documentation
+% offers an explanation of the bug and offers advice on how to use ellipses in
+% your text. This document does not offer guidance on the use of ellipses in
+% mathematical formulas or non-English language text.
+%
+% The standard definition of |\dots| in \LaTeX\ takes the inter-word stretch for
+% the current font and puts that amount of space in between three normal dots;
+% it then also adds that amount of space \emph{after} the final dot. The
+% documentation of the \LaTeX\ code acknowledges that this is a `kludge' in that
+% the interword stretch is being used for a purpose it was not meant for. There
+% is another problem with this definition, however: the extra space after the
+% final dot of the ellipsis. There is always more space after the ellipsis
+% than before it, so that it is not properly centered between the text on either
+% side.
+%
+% That extra space is there for a good reason. When the ellipsis is followed by
+% another dot, as at the end of a sentence, it is important that all four dots
+% should be evenly spaced, otherwise the final dot is much closer than the
+% others and the result is hideous. The same holds true for commas, exclamation
+% marks and other punctuation on the baseline. So the extra space is necessary
+% when an ellipsis is followed by certain punctuation characters, and the bug
+% consists in the fact that \LaTeX\ always adds it, regardless of what text
+% follows.
+%
+% This package implements a simple fix. It redefines the commands |\dots| and
+% |\textellipsis| so that they can look ahead at the next character and change
+% their behavior accordingly: if the next character is one of \texttt{.,;:?!}
+% the extra space is added, if not, no extra space is added (if you load a
+% package that makes any of these characters active, you may want to reload
+% this list; see the section below on see below on |\ellipsispunctuation| and
+% compatibility). This particular list of punctuation marks was not chosen
+% arbitrarily: it includes all marks with a dot on the baseline (or a comma,
+% which is like a dot with a tail). These marks produce a series of four dots
+% which must be spaced evenly~-- no other punctuation mark would normally
+% benefit from having the extra space added.
+%
+% The solution can be brittle~-- for example, if you write |\dots{}.| then the
+% extra space will \emph{not} be added, since the braces come between the
+% command and the dot; the result will be very ugly. The solution to this is to
+% enter ellipses carefully and consistently in your source text. If you use
+% ellipses as recommended below, then the potential problem of evenly spacing an
+% ellipsis that comes immediately after a baseline punctuation mark does not
+% arise, since that combination of characters will not normally be used.
+%
+% There are two other packages, \textsf{lips} and \textsf{xellipsis}, that
+% address the problem of text ellipses in \LaTeX. The former strictly follows
+% the advice of the \emph{Chicago Manual of Style} in putting full word spaces
+% between the dots of the ellipsis, and does not provide the possibility of more
+% a tightly set ellipsis like the normal \LaTeX\ default. It also imposes its
+% own set of rules for the spacing before and after an ellipsis. The latter
+% offers more flexibility, but also tends to prefer the Chicago/MLA style. The
+% Chicago and MLA manuals are good guides for preparing a typescript that will
+% be typeset by someone else; but for fine typography, they are the wrong
+% authorities to follow.
+%
+% Traditional typographers firmly reject the Chicago style of setting ellipses,
+% and rightly so; see Jan Tschichold, \emph{The Form of the Book: Essays on the
+% Morality of Good Design} (Hartley \& Marks, 1991), pp~130f, or Robert
% Bringhurst, \emph{The Elements of Typographic Style}
% (2\textsuperscript{nd}~ed, Hartley \& Marks, 1997) pp~82f.
+%
% \DescribeMacro{chicago} If you nevertheless want or have to use the
-% Chicago-style, widely spaced ellipsis with this package, you can
-% pass it the option |chicago|, like so:
-% |\usepackage[chicago]{ellipsis}|. If, on the other hand, you want
-% to adhere to the full recommendations of the Chicago manual, then
-% you should probably use \textsf{lips.sty} instead of this package.
-% \DescribeMacro{mla} \textsf{Ellipsis.sty} also has an |mla| package
-% option, modeled on the same feature of \textsf{lips.sty}, which
-% automatically puts square brackets around all ellipses.
-%
-% A different solution to the general problem would be to install a
-% font which includes a precomposed ellipsis glyph, and to redefine
-% |\dots| simply to insert this character. In that case, you do not
-% need this package at all, but you should make sure that the ellipsis
-% character kerns properly, especially with following .,:;!?
+% Chicago-style, widely spaced ellipsis with this package, you can pass it the
+% package option |chicago|. \DescribeMacro{mla} There is also package option
+% |mla|, modeled on the same feature of \textsf{lips.sty}, which automatically
+% puts square brackets around all ellipses. If, on the other hand, you want to
+% adhere to the full recommendations of the Chicago manual, then you should
+% consider using \textsf{lips} or \textsf{xellipsis} instead of this package.
+%
+% In conclusion, the best solution to the problem of typesetting ellipses is not
+% to use this package at all, but to use XeTeX. You can put the Unicode
+% character for ``horizontal ellipsis'' into your source, and use a font with a
+% precomposed ellipsis glyph. If you use a professional-quality OpenType font,
+% it will have an ellipsis glyph created by the type designer to fit with the
+% typeface and with proper kerning for punctuation afterward. Not all fonts do
+% this, so make sure that the ellipsis character kerns properly with
+% \texttt{.,;:?!} following.
%
% \section{Usage}
-%
-% Install the package and put |\usepackage{ellipsis}| in your
-% preamble. As noted above, you should be consistent in the way you
-% enter ellipses in your text. For English text, Bringhurst (loc.\
-% cit.) recommends putting a space before and after an ellipsis that
-% appears between two words, but no space before an ellipsis that
-% appears before a punctuation mark such as a period, comma, etc.
-% Then there is the question of breaking or non-breaking space. I
-% think it is odd to find an ellipsis at the beginning of a line, so
-% normally I would enter text like this: |uh~\dots\ oh|. If setting
-% text in narrow columns you may prefer to allow line breaks before
-% the ellipsis as well as after. Before punctuation, you would enter
-% ellipses without a space before or after, like so:
-% |one, two, three\dots, ten\dots.| Note, however, that some
-% publishers do not like to see an ellipsis combined with a period or
-% comma, and would rather a simple ellipsis at the end of a sentence
-% and so forth.
-%
-% One problem with using the |\dots| command is that it does not take
-% an argument. So there is no brace to terminate it, and if you want
-% a space to follow the ellipsis, you need to take care that it does
-% not disappear, and so to write it like this:
-% |\dots\|\textvisiblespace\ or |{\dots}|\textvisiblespace\ or
-% |\dots{}|\textvisiblespace. If you forget to do this, the space
-% will disappear, gobbled up by the macro. I frequently find myself
-% making this mistake, so I have added another option to help with
-% it. \DescribeMacro{xspace} If you pass the option |xspace| to
-% \textsf{ellipsis.sty}, an |\xspace| macro will be added after every
-% |\dots| macro. See the \emph{\LaTeX\ Companion} for full
-% information on that package, but in short, it adds a space except
-% when followed by certain punctuation characters (a superset of the
-% |\ellipsispunctuation| list mentioned above). So you automatically
-% get space after the ellipsis, unless it is immediately followed by
-% punctuation, even if you write it like this:
-% |one~\dots|\textvisiblespace|two|. If there are a few places where
-% you don't want a space after |\dots|, then write it like this:
-% |\dots{}|, and the space will be suppressed.
-%
-% \DescribeMacro{\ellipsisgap}
-% You may wish to redefine the command |\ellipsisgap|, which is the
-% space between the dots of the ellipsis. If you do this, you must do
-% it in your preamble, \emph{after} the |\usepackage| line. The
-% default value is the interword stretch of the current font, which is
-% the normal \LaTeX\ definition. If you are using a font other than
-% Computer Modern and if you are obsessive, you might wish to examine
-% the ellipsis that the font designer included in your font and
-% recreate it by defining the |\ellipsisgap| to an appropriate value,
+%
+% Install the package and put |\usepackage{ellipsis}| in your preamble. As
+% noted above, you should be consistent in the way you enter ellipses in your
+% text. For English text, Bringhurst (loc.\ cit.) recommends putting a space
+% before and after an ellipsis that appears between two words, but no space
+% before an ellipsis that appears before a punctuation mark such as a period,
+% comma, etc. Then there is the question of breaking or non-breaking space. I
+% think it is odd to find an ellipsis at the beginning of a line, so normally I
+% would enter text like this: |uh~\dots\ oh|. If setting text in narrow columns
+% you may prefer to allow line breaks before the ellipsis as well as after.
+% Before punctuation, you would enter ellipses without a space before or after,
+% like so: |one, two, three\dots, ten\dots.| Note, however, that some
+% publishers do not like to see an ellipsis combined with a period or comma, and
+% would rather a simple ellipsis at the end of a sentence and so forth.
+%
+% One problem with using the |\dots| command is that it does not take an
+% argument. So there is no brace to terminate it, and if you want a space to
+% follow the ellipsis, you need to take care that it does not disappear, and so
+% to write it like this: |\dots\|\textvisiblespace\ or
+% |{\dots}|\textvisiblespace\ or |\dots{}|\textvisiblespace. If you forget to
+% do this, the space will disappear, gobbled up by the macro. I frequently find
+% myself making this mistake, so I have added another option to help with it.
+% \DescribeMacro{xspace} If you pass the option |xspace| to
+% \textsf{ellipsis.sty}, an |\xspace| macro will be added after every |\dots|
+% macro. See the \emph{\LaTeX\ Companion} for full information on that package,
+% but in short, it adds a space except when followed by certain punctuation
+% characters (a superset of the |\ellipsispunctuation| list mentioned above).
+% So you automatically get space after the ellipsis, unless it is immediately
+% followed by punctuation, even if you write it like this:
+% |one~\dots|\textvisiblespace|two|. If there are a few places where you don't
+% want a space after |\dots|, then write it like this: |\dots{}|, and the space
+% will be suppressed.
+%
+% \DescribeMacro{\ellipsisgap}
+% You may wish to redefine the command |\ellipsisgap|, which is the space
+% between the dots of the ellipsis. If you do this, you must do it in your
+% preamble, \emph{after} the |\usepackage| line. The default value is the
+% interword stretch of the current font, which is the normal \LaTeX\ definition.
+% If you are using a font other than Computer Modern and if you are obsessive,
+% you might wish to examine the ellipsis that the font designer included in your
+% font and recreate it by defining the |\ellipsisgap| to an appropriate value,
% like so:
% \begin{verbatim}
-% \usepackage{ellipsis}
-% This value seems right for the native ellipsis in Adobe Caslon:
+% \usepackage{ellipsis}
+% This value seems right for the native ellipsis in Adobe Caslon:
% \renewcommand{\ellipsisgap}{0.1em}
-% \end{verbatim}
-% You should probably define this in font-size dependent units, such
-% as the em. See Bringhurst (loc.\ cit.) for further thoughts on the
-% construction of ellipses.
+% \end{verbatim}
+% You should probably define this in font-size dependent units, such as the em.
+% See Bringhurst (loc.\ cit.) for further thoughts on the construction of
+% ellipses.
%
% \section{Compatibility}
%
-% It was mentioned above that if certain punctuation characters are
-% made active, it will interfere with the ability of this package to
-% recognize them. One important example of that practice is in the
-% French option of Babel, which makes certain `double punctuation'
-% characters active, in order to put a bit of space before them. In
-% this particular case, however, you do \emph{not} want to redefine
-% the |\ellipsispunctuation| list to make this package aware of these
-% characters. If you were to do so, extra kerning would be added
-% after an ellipsis in addition to thin space before the following
-% punctuation, resulting in about twice as much space as needed. If
-% you leave the default value of |\ellipsispunctuation|, then these
-% active characters will not be recognized, and no extra kern will be
-% added. Instead, the ellipsis will be separated from any following
-% double punctuation by a thin space. This may not be quite the same
-% as the space between dots of the ellipsis, but it may be close
-% enough that no one will notice the difference. In any case, that's
-% what French Babel does.
-%
-% Whether Babel is here following some sophisticated French
-% typographical rule, or it's just a fudge, I don't know. Because
-% Babel French removes the extra space from after |\dots|, but only
-% adds space before `double punctuation', there is no space between an
-% ellipsis and `single punctuation', which looks ugly to my
-% (non-French) eyes. In these cases, using |ellipsis.sty| will add
-% the extra space whereas French Babel on its own does not. This may
-% be the wrong thing to do; if you are typesetting a text in French,
-% you should familiarize yourself with the relevant norms, and
-% possibly refrain from using this package. I have not familiarized
-% myself with the rules for typesetting ellipses in languages other
-% than English. If you are loading the French option of Babel because
-% you are quoting French text in a document whose main language is not
-% French, then you should not worry about these issues. Because
-% French Babel wants to redefine |\dots|, you must load |ellipsis.sty|
-% \emph{after} Babel if you are using the French option (even if you
-% have no French text in your document).
-%
-% The Spanish option of Babel has its own way of setting an
-% ellipsis,but it uses a different command (|\...|), so that doesn't
-% interfere with the working of this package.
+% It was mentioned above that if certain punctuation characters are made active,
+% it will interfere with the ability of this package to recognize them. One
+% important example of that practice is in the French option of Babel, which
+% makes certain `double punctuation' characters active, in order to put a bit of
+% space before them. In this particular case, however, you do \emph{not} want
+% to redefine the |\ellipsispunctuation| list to make this package aware of
+% these characters. If you were to do so, extra kerning would be added after an
+% ellipsis in addition to thin space before the following punctuation, resulting
+% in about twice as much space as needed. If you leave the default value of
+% |\ellipsispunctuation|, then these active characters will not be recognized,
+% and no extra kern will be added. Instead, the ellipsis will be separated from
+% any following double punctuation by a thin space. This may not be quite the
+% same as the space between dots of the ellipsis, but it may be close enough
+% that no one will notice the difference. In any case, that's what French Babel
+% does.
+%
+% Whether Babel is here following some sophisticated French typographical rule,
+% or it's just a fudge, I don't know. Because Babel French removes the extra
+% space from after |\dots|, but only adds space before `double punctuation',
+% there is no space between an ellipsis and `single punctuation', which looks
+% ugly to my (non-French) eyes. In these cases, using |ellipsis.sty| will add
+% the extra space whereas French Babel on its own does not. This may be the
+% wrong thing to do; if you are typesetting a text in French, you should
+% familiarize yourself with the relevant norms, and possibly refrain from using
+% this package. If you are loading the French option of Babel because you are
+% quoting French text in a document whose main language is not French, then you
+% should not worry about these issues. Because French Babel wants to redefine
+% |\dots|, you must load |ellipsis.sty| \emph{after} Babel if you are using the
+% French option (even if you have no French text in your document).
+%
+% The Spanish option of Babel has its own way of setting an ellipsis,but it uses
+% a different command (|\...|), so that doesn't interfere with the working of
+% this package.
%
% \StopEventually{\PrintChanges}
%
@@ -274,8 +318,8 @@
% \begin{macro}{\ellipsis@before}
% \begin{macro}{\ellipsis@after}
% We provide the hooks \cs{ellipsis@before} and \cs{ellipsis@after} to
-% allow the production of automatically bracketed ellipses.
-%
+% allow the production of automatically bracketed ellipses.
+%
% \DescribeMacro{mla}
% The \textsf{mla} package option sets these so as to produce ellipses
% like this: [...] If you do this, you never want the extra space
@@ -306,25 +350,25 @@
%
% \begin{macro}{\ellipsis@default}
% This is the LaTeX default definition, which is necessary to use
-% when punctuation such as .,:;!? follows.
+% when punctuation such as \texttt{.,;:?!} follows.
% \begin{macrocode}
\newcommand{\ellipsis@default}{%
- \ellipsis@before
- .\kern\ellipsisgap
+ \ellipsis@before
.\kern\ellipsisgap
.\kern\ellipsisgap
+ .\@\kern\ellipsisgap
\ellipsis@after\relax}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ellipsis@centered}
-% This is our new ellipsis \emph{without} the extra space after it.
+% This is our new ellipsis \emph{without} the extra space after it.
% \begin{macrocode}
\newcommand{\ellipsis@centered}{%
\ellipsis@before
.\kern\ellipsisgap
.\kern\ellipsisgap
- .\ellipsis@after\relax}
+ .\@\ellipsis@after\relax}
% \end{macrocode}
% \end{macro}
%
@@ -338,7 +382,8 @@
% then explicitly reset the list. Otherwise the changed character
% will no longer be recognized.' (quote from \textsf{ltfntcmd.dtx})
% In such a case, just repeat the line below, substituting
-% \cs{renewcommand} for \cs{newcommand}.
+% \cs{renewcommand} for \cs{newcommand}, and putting it after
+% |\begin{document}|
% \begin{macrocode}
\newcommand\ellipsispunctuation{,.:;!?}
% \end{macrocode}
@@ -358,7 +403,7 @@
\def\ellipsis@two{#2}% the remainder of the string
\ifx\ellipsis@token\ellipsis@one
\ellipsis@default
- \else
+ \else
\ifx\ellipsis@two\empty
\ellipsis@centered
\else
@@ -367,7 +412,7 @@
\fi}
% \end{macrocode}
%
-% Here is the macro that looks ahead at the next token, put it in
+% Here is the actual macro that looks ahead at the next token, stores it in
% \cs{ellipsis@token}, and invokes the code to scan for it in the
% punctuation list.
%
@@ -377,6 +422,7 @@
\ifellipsis@alwayscenter\ellipsis@centered\else
\ellipsis@scan%
\fi\ellipsis@xspace}%
+\DeclareRobustCommand\textellipsis {\futurelet\ellipsis@token\@textellipsis}
% \end{macrocode}
% \end{macro}
%
@@ -398,13 +444,21 @@
\ifx\bbl@frenchdots\@undefined\else
\PackageError{ellipsis}{Babel French loaded after ellipsis.sty}%
{If you load Babel with the French option, do it before ellipsis.sty}%
- \fi
- \fi
- \DeclareRobustCommand{\dots}{%
- \ifmmode\mathellipsis\else\expandafter\textellipsis\fi}}
+ \fi
+ \fi
+ \@ifpackageloaded{amsmath}%
+ {%
+ \DeclareRobustCommand\dots{%
+ \ifmmode \@xp \mdots@ \else \@xp \textellipsis \fi}%
+ }%
+ {%
+ \DeclareRobustCommand\dots{%
+ \ifmmode \mathellipsis \else \expandafter \textellipsis\fi}%
+ }%
+}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\midwordellipsis}
% An extra command: this may be useful for the rare time when you want
% an ellipsis in the very middle of a word or whenever you just want a
@@ -415,7 +469,7 @@
\kern\ellipsisgap
.\kern\ellipsisgap
.\kern\ellipsisgap
- .\kern\ellipsisgap\relax}
+ .\@\kern\ellipsisgap\relax}
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex/elsarticle/elsarticle.dtx b/Master/texmf-dist/source/latex/elsarticle/elsarticle.dtx
index 187b6d5b0c6..a5a0a0b3b52 100644
--- a/Master/texmf-dist/source/latex/elsarticle/elsarticle.dtx
+++ b/Master/texmf-dist/source/latex/elsarticle/elsarticle.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2007-2019 by Elsevier Ltd
+% Copyright (C) 2007-2020 by Elsevier Ltd
% -----------------------------------------------
%
% This file may be distributed and/or modified under the
@@ -14,10 +14,10 @@
% version 1999/12/01 or later.
%
% \fi
-% \CheckSum{2634}
+% \CheckSum{3243}
%
-% $Id: elsarticle.dtx 167 2019-02-25 07:12:21Z apu.v $
-% $URL: http://lenova.river-valley.com/svn/elsarticle/trunk/elsarticle.dtx $
+% $Id: elsarticle.dtx 190 2020-11-23 11:12:32Z rishi $
+% $URL: https://lenova.river-valley.com/svn/elsarticle/trunk/elsarticle.dtx $
% \iffalse
%<*driver>
\documentclass{ltxdoc}
@@ -58,6 +58,11 @@
% with amsref.sty, fncylab.sty have been fixed. Some bugs related
% to author/affiliation part have been fixed.}
%
+%
+% \changes{v3.3}{2020/11/20}{Defined \string\affiliation command for structured
+% address tagging.}
+%
+%
% \GetFileInfo{elsarticle.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment}
@@ -78,8 +83,8 @@
%%
%%
\def\RCSfile{elsarticle}%
- \def\RCSversion{3.2}%
- \def\RCSdate{2019/02/25}%
+ \def\RCSversion{3.3}%
+ \def\RCSdate{2020/11/20}%
\def\@shortjnl{\relax}
\def\@journal{Elsevier Ltd}
\def\@company{Elsevier Ltd}
@@ -94,6 +99,16 @@
\newif\ifnopreprintline \nopreprintlinefalse
\newif\ifdoubleblind \doubleblindfalse
+\newif\ifuseexplthreefunctions \useexplthreefunctionsfalse
+
+\IfFileExists{expl3.sty}{%
+ \global\useexplthreefunctionstrue%
+ \RequirePackage{expl3}}{}
+\ifuseexplthreefunctions\relax%
+ \IfFileExists{xparse.sty}{\RequirePackage{xparse}}{}
+ \IfFileExists{etoolbox.sty}{\RequirePackage{etoolbox}}{}
+\fi
+
\def\@blstr{1}
\newdimen\@bls
\@bls=\baselineskip
@@ -339,7 +354,6 @@
\def\elsaddress{}
\def\addsep{\par\vskip6pt}
-\def\address{\@ifnextchar[{\@@address}{\@address}}
\def\@alph#1{%
\ifcase#1\or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or
@@ -371,6 +385,322 @@
\newcounter{affn}
\renewcommand\theaffn{\alph{affn}}
+\ifuseexplthreefunctions\relax%
+ \ExplSyntaxOn
+ \def\ca_affitem_postskip{\mbox{~}\unskip\ignorespaces}
+ %%Author Address
+ \DeclareDocumentCommand \ca_organization { O{,} m }
+ {
+ % #2 #1\mbox{~}\unskip\ignorespaces
+ \csgappto { ca_affiliation_values } { #2 #1\ca_affitem_postskip }
+ }
+ \DeclareDocumentCommand \ca_postal_code { O{,} m }
+ {
+ % #2 #1\mbox{~}\unskip\ignorespaces
+ \csgappto { ca_affiliation_values } { #2 #1\ca_affitem_postskip }
+ }
+ \DeclareDocumentCommand \ca_aff_city { O{,} m }
+ {
+ % #2 #1\mbox{~}\unskip\ignorespaces
+ \csgappto { ca_affiliation_values } { #2 #1\ca_affitem_postskip }
+ }
+ \DeclareDocumentCommand \ca_address_line { O{,}m }
+ {
+ % #2 #1\mbox{~}\unskip\ignorespaces
+ \csgappto { ca_affiliation_values } { #2 #1\ca_affitem_postskip }
+ }
+ \DeclareDocumentCommand \ca_state { O{,} m }
+ {
+ % #2 #1\mbox{~}\unskip\ignorespaces
+ \csgappto { ca_affiliation_values } { #2 #1\ca_affitem_postskip }
+ }
+ \DeclareDocumentCommand \ca_country { O{ } m }
+ {
+ % #2 #1
+ \csgappto { ca_affiliation_values } { #2 #1 }
+ }
+
+ \DeclareDocumentCommand \ca_stm_organization { O{,} m }
+ {
+ #2 #1\ca_affitem_postskip
+ }
+ \DeclareDocumentCommand \ca_stm_postal_code { O{,} m }
+ {
+ #2 #1\ca_affitem_postskip
+ }
+ \DeclareDocumentCommand \ca_stm_aff_city { O{,} m }
+ {
+ #2 #1\ca_affitem_postskip
+ }
+ \DeclareDocumentCommand \ca_stm_aff_address_line { O{,}m }
+ {
+ #2 #1\ca_affitem_postskip
+ }
+ \DeclareDocumentCommand \ca_stm_state { O{,} m }
+ {
+ #2 #1\ca_affitem_postskip
+ }
+ \DeclareDocumentCommand \ca_stm_country { O{ } m }
+ {
+ #2 #1
+ }
+
+ \keys_define:nn { stm / affiliation }
+ {
+ op .tl_set_x:N = \l_organization_punc_tl,
+ oraganizationsep .tl_set_x:N = \l_organization_punc_tl,
+ ap .tl_set_x:N = \l_address_line_punc_tl,
+ addresslinesep .tl_set_x:N = \l_address_line_punc_tl,
+ cp .tl_set_x:N = \l_city_punc_tl,
+ citysep .tl_set_x:N = \l_city_punc_tl,
+ pp .tl_set_x:N = \l_postal_code_punc_tl,
+ postcodesep .tl_set_x:N = \l_postal_code_punc_tl,
+ sp .tl_set_x:N = \l_state_punc_tl,
+ statesep .tl_set_x:N = \l_state_punc_tl,
+ o .code:n = { \ca_organization[\l_organization_punc_tl]{#1} },
+ organization .code:n = { \ca_organization[\l_organization_punc_tl]{#1} },
+ a .code:n = { \ca_address_line[\l_address_line_punc_tl]{#1} },
+ addressline .code:n = { \ca_address_line[\l_address_line_punc_tl]{#1} },
+ c .code:n = { \ca_aff_city[\l_city_punc_tl]{#1} },
+ city .code:n = { \ca_aff_city[\l_city_punc_tl]{#1} },
+ p .code:n = { \ca_postal_code[\l_postal_code_punc_tl]{#1} },
+ postcode .code:n = { \ca_postal_code[\l_postal_code_punc_tl]{#1} },
+ s .code:n = { \ca_state[\l_state_punc_tl]{#1} },
+ state .code:n = { \ca_state[\l_state_punc_tl]{#1} },
+ orp .tl_set_x:N = \l_organization_punc_tl,
+ adp .tl_set_x:N = \l_address_line_punc_tl,
+ cip .tl_set_x:N = \l_city_punc_tl,
+ pcp .tl_set_x:N = \l_postal_code_punc_tl,
+ stp .tl_set_x:N = \l_state_punc_tl,
+ cyp .tl_set_x:N = \l_country_punc_tl,
+ or .code:n = { \ca_organization[\l_organization_punc_tl]{#1} },
+ ad .code:n = { \ca_address_line[\l_address_line_punc_tl]{#1} },
+ ci .code:n = { \ca_aff_city[\l_city_punc_tl]{#1} },
+ pc .code:n = { \ca_postal_code[\l_postal_code_punc_tl]{#1} },
+ st .code:n = { \ca_state[\l_state_punc_tl]{#1} },
+ cy .code:n = { \ca_country[\l_country_punc_tl]{#1} },
+ country .code:n = { \ca_country[\l_country_punc_tl]{#1} },
+ unknown .code:n = {
+ \ifstrempty { #1 } {
+ \csxappto { ca_affiliation_values }
+ { {\l_keys_key_tl}~ }
+ } {
+ \csxappto { ca_affiliation_values }
+ { {#1}~ }
+ }
+ }
+ }
+
+ \cs_set:Npn \__reset_affiliation:
+ {
+ \tl_gset:Nn \l_organization_punc_tl { , }
+ \tl_gset:Nn \l_address_line_punc_tl { , }
+ \tl_gset:Nn \l_city_punc_tl { , }
+ \tl_gset:Nn \l_postal_code_punc_tl { , }
+ \tl_gset:Nn \l_state_punc_tl { , }
+ \tl_gset:Nn \l_country_punc_tl { }
+ }
+
+ \DeclareDocumentCommand\affiliation{ o m }{
+ \__reset_affiliation:
+ \csgdef { ca_affiliation_values } { }
+ \IfNoValueTF { #2 }
+ { }
+ {
+ \keys_set:nn { stm / affiliation } { #2 }
+ }
+ \csgappto{elsaddress}{
+ \def\baselinestretch{1}%
+ \refstepcounter{affn}
+ \xdef\@currentlabel{\theaffn}
+ \IfNoValueTF { #1 }
+ { }
+ { \elsLabel{#1} }
+ \textsuperscript{\theaffn}}
+ \csxappto{elsaddress}{
+ \csuse { ca_affiliation_values }
+ \par
+ }
+ }
+ \ExplSyntaxOff
+ \else%
+ \def\caaffitempostskip{\space}
+
+ \DeclareRobustCommand\caorganization[2][,]{%
+ \g@addto@macro\caaffiliationvalues{#2#1\caaffitempostskip}%
+ }
+ \DeclareRobustCommand\capostalcode[2][,]{%
+ \g@addto@macro\caaffiliationvalues{#2#1\caaffitempostskip}%
+ }
+ \DeclareRobustCommand\caaffcity[2][,]{%
+ \g@addto@macro\caaffiliationvalues{#2#1\caaffitempostskip}%
+ }
+ \DeclareRobustCommand\caaddressline[2][,]{%
+ \g@addto@macro\caaffiliationvalues{#2#1\caaffitempostskip}%
+ }
+ \DeclareRobustCommand\castate[2][,]{%
+ \g@addto@macro\caaffiliationvalues{#2#1\caaffitempostskip}%
+ }
+ \DeclareRobustCommand\cacountry[2][,]{%
+ \g@addto@macro\caaffiliationvalues{#2#1\caaffitempostskip}%
+ }
+ \DeclareRobustCommand\castmorganization[2][,]{%
+ #2#1\caaffitempostskip%
+ }
+ \DeclareRobustCommand\castmpostalcode[2][,]{%
+ #2#1\caaffitempostskip%
+ }
+ \DeclareRobustCommand\castmaffcity[2][,]{%
+ #2#1\caaffitempostskip%
+ }
+ \DeclareRobustCommand\castmaddressline[2][,]{%
+ #2#1\caaffitempostskip%
+ }
+ \DeclareRobustCommand\castmstate[2][,]{%
+ #2#1\caaffitempostskip%
+ }
+ \DeclareRobustCommand\castmcountry[2][,]{%
+ #2#1\caaffitempostskip%
+ }
+
+ \define@key{affiliation}{op}{\xdef\@organizationpunc{#1}}
+ \define@key{affiliation}{orp}{\xdef\@organizationpunc{#1}}
+ \define@key{affiliation}{organizationsep}{\xdef\@organizationpunc{#1}}
+ \define@key{affiliation}{ap}{\xdef\@addresslinepunc{#1}}
+ \define@key{affiliation}{adp}{\xdef\@addresslinepunc{#1}}
+ \define@key{affiliation}{addresslinesep}{\xdef\@addresslinepunc{#1}}
+ \define@key{affiliation}{cp}{\xdef\@citypunc{#1}}
+ \define@key{affiliation}{cip}{\xdef\@citypunc{#1}}
+ \define@key{affiliation}{cyp}{\xdef\@countrypunc{#1}}
+ \define@key{affiliation}{citysep}{\xdef\@citypunc{#1}}
+ \define@key{affiliation}{pp}{\xdef\@postcodepunc{#1}}
+ \define@key{affiliation}{pop}{\xdef\@postcodepunc{#1}}
+ \define@key{affiliation}{postcodesep}{\xdef\@postcodepunc{#1}}
+ \define@key{affiliation}{sp}{\xdef\@statepunc{#1}}
+ \define@key{affiliation}{stp}{\xdef\@statepunc{#1}}
+ \define@key{affiliation}{statesep}{\xdef\@statepunc{#1}}
+ \define@key{affiliation}{countrysep}{\xdef\@countrypunc{#1}}
+
+ \define@key{affiliation}{organization}{%
+ \caorganization[\@organizationpunc]{#1}}
+ \define@key{affiliation}{addressline}{%
+ \caaddressline[\@addresslinepunc]{#1}}
+ \define@key{affiliation}{city}{%
+ \caaffcity[\@citypunc]{#1}}
+ \define@key{affiliation}{postcode}{%
+ \capostalcode[\@postcodepunc]{#1}}
+ \define@key{affiliation}{state}{%
+ \castate[\@statepunc]{#1}}
+ \define@key{affiliation}{or}{%
+ \caorganization[\@organizationpunc]{#1}}
+ \define@key{affiliation}{ad}{%
+ \caaddressline[\@addresslinepunc]{#1}}
+ \define@key{affiliation}{ci}{%
+ \caaffcity[\@citypunc]{#1}}
+ \define@key{affiliation}{po}{%
+ \capostalcode[\@postcodepunc]{#1}}
+ \define@key{affiliation}{st}{%
+ \castate[\@statepunc]{#1}}
+ \define@key{affiliation}{o}{%
+ \caorganization[\@organizationpunc]{#1}}
+ \define@key{affiliation}{a}{%
+ \caaddressline[\@addresslinepunc]{#1}}
+ \define@key{affiliation}{c}{%
+ \cacity[\@citypunc]{#1}}
+ \define@key{affiliation}{p}{%
+ \capostcode[\@postcodepunc]{#1}}
+ \define@key{affiliation}{s}{%
+ \castate[\@statepunc]{#1}}
+ \define@key{affiliation}{cy}{%
+ \cacountry[\@countrypunc]{#1}}
+ \define@key{affiliation}{country}{%
+ \cacountry[\@countrypunc]{#1}}
+
+
+ \gdef\@resetaffiliation{%
+ \gdef\@organizationpunc{,}%
+ \gdef\@addresslinepunc{,}%
+ \gdef\@citypunc{,}%
+ \gdef\@statepunc{,}%
+ \gdef\@postcodepunc{,}%
+ \gdef\@countrypunc{}%
+ }
+
+ \def\affiliation{\@ifnextchar[{\@@affiliation}{\@affiliation}}
+
+ \newcommand*{\newstmrobustcmd}{}
+ \protected\def\newstmrobustcmd{\@star@or@long\stmetb@new@command}
+
+ \def\stmetb@new@command#1{\@testopt{\stmetb@newcommand#1}0}
+
+ \def\stmetb@newcommand#1[#2]{%
+ \@ifnextchar[%]
+ {\stmetb@xargdef#1[#2]}
+ {\ifx\l@ngrel@x\relax
+ \let\l@ngrel@x\protected
+ \else
+ \protected\def\l@ngrel@x{\protected\long}%
+ \fi
+ \@argdef#1[#2]}}
+
+ \long\def\stmetb@xargdef#1[#2][#3]#4{%
+ \@ifdefinable#1{%
+ \expandafter\protected
+ \expandafter\def
+ \expandafter#1%
+ \expandafter{%
+ \expandafter\@testopt
+ \csname\string#1\endcsname{#3}}%
+ \expandafter\@yargdef\csname\string#1\endcsname\tw@{#2}{#4}}}
+ %
+ \newcommand{\ifstmundef}[1]{%
+ \ifdefined#1%
+ \ifx#1\relax
+ \expandafter\expandafter
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\expandafter
+ \expandafter\@secondoftwo
+ \fi
+ \else
+ \expandafter\@firstoftwo
+ \fi}
+ \newcommand{\stmexpandonce}[1]{%
+ \unexpanded\expandafter{#1}}
+ \newstmrobustcmd{\gstmappto}[2]{%
+ \ifundef{#1}
+ {\xdef#1{\unexpanded{#2}}}
+ {\xdef#1{\stmexpandonce#1\unexpanded{#2}}}}
+ \newstmrobustcmd{\xstmappto}[2]{%
+ \ifstmundef{#1}
+ {\xdef#1{#2}}
+ {\xdef#1{\stmexpandonce#1#2}}}
+
+
+ \long\def\@@affiliation[#1]#2{%
+ \@resetaffiliation%
+ \gdef\caaffiliationvalues{}%
+ \elsLabel{#1}%
+ \setkeys{affiliation}{#2}%
+ \g@addto@macro\elsaddress{%
+ \def\baselinestretch{1}%
+ \refstepcounter{affn}%
+ \xdef\@currentlabel{\theaffn}%
+ \elsLabel{#1}%
+ \textsuperscript{\theaffn}}
+ \xstmappto\elsaddress{\caaffiliationvalues\par}}
+
+ \long\def\@affiliation#1{%
+ \@resetaffiliation%
+ \gdef\caaffiliationvalues{}%
+ \setkeys{affiliation}{#1}%
+ \g@addto@macro\elsauthors{%
+ \def\baselinestretch{1}}%
+ \xstmappto\elsaddress{\caaffiliationvalues\par}}
+\fi
+
+\def\address{\@ifnextchar[{\@@address}{\@address}}
+
\long\def\@@address[#1]#2{\g@addto@macro\elsaddress{%
\def\baselinestretch{1}%
\refstepcounter{affn}
diff --git a/Master/texmf-dist/source/latex/elsarticle/elsarticle.ins b/Master/texmf-dist/source/latex/elsarticle/elsarticle.ins
index a70fae6161e..53ea4ac19bc 100644
--- a/Master/texmf-dist/source/latex/elsarticle/elsarticle.ins
+++ b/Master/texmf-dist/source/latex/elsarticle/elsarticle.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 2007-2019 Elsevier Ltd
+%% Copyright 2007-2020 Elsevier Ltd
%%
%% This file is part of the 'Elsarticle Bundle'.
%% ---------------------------------------------
@@ -18,7 +18,7 @@
%% The list of all files belonging to the 'Elsarticle Bundle' is
%% given in the file 'manifest.txt'.
%%
-%% $Id: elsarticle.ins 164 2019-01-14 09:57:55Z rishi $
+%% $Id: elsarticle.ins 191 2020-11-23 11:13:24Z rishi $
%%
%%
\input docstrip.tex
@@ -26,7 +26,7 @@
\preamble
-Copyright 2007-2019 Elsevier Ltd
+Copyright 2007-2020 Elsevier Ltd
This file is part of the 'Elsarticle Bundle'.
-------------------------------------------
diff --git a/Master/texmf-dist/source/latex/embedfile/embedfile.dtx b/Master/texmf-dist/source/latex/embedfile/embedfile.dtx
index 1fb0ed84b68..aed35ec7600 100644
--- a/Master/texmf-dist/source/latex/embedfile/embedfile.dtx
+++ b/Master/texmf-dist/source/latex/embedfile/embedfile.dtx
@@ -1,12 +1,12 @@
% \iffalse meta-comment
%
% File: embedfile.dtx
-% Version: 2019/12/03 v2.9
+% Version: 2020-04-24 v2.11
% Info: Embed files into PDF
%
% Copyright (C)
% 2006-2011 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
+% 2016-2020 Oberdiek Package Support Group
% https://github.com/ho-tex/embedfile/issues
%
% This work may be distributed and/or modified under the
@@ -89,7 +89,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: embedfile 2019/12/03 v2.9 Embed files into PDF (HO)}
+\Msg{* Package: embedfile 2020-04-24 v2.11 Embed files into PDF (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -101,11 +101,11 @@
This is a generated file.
Project: embedfile
-Version: 2019/12/03 v2.9
+Version: 2020-04-24 v2.11
Copyright (C)
2006-2011 Heiko Oberdiek
- 2016-2019 Oberdiek Package Support Group
+ 2016-2020 Oberdiek Package Support Group
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -179,7 +179,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{embedfile.drv}%
- [2019/12/03 v2.9 Embed files into PDF (HO)]%
+ [2020-04-24 v2.11 Embed files into PDF (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}[2011/11/22]
\begin{document}
@@ -193,7 +193,7 @@ and the derived files
% \GetFileInfo{embedfile.drv}
%
% \title{The \xpackage{embedfile} package}
-% \date{2019/12/03 v2.9}
+% \date{2020-04-24 v2.11}
% \author{Heiko Oberdiek\thanks
% {Please report any issues at \url{https://github.com/ho-tex/embedfile/issues}}}
%
@@ -201,7 +201,7 @@ and the derived files
%
% \begin{abstract}
% This package embeds files to a PDF document.
-% Currently the only supported driver is \pdfTeX\ $>=$ 1.30 in PDF mode.
+% Currently the only supported drivers are \pdfTeX\ $>=$ 1.30 and lua\TeX\ in PDF mode.
% \end{abstract}
%
% \tableofcontents
@@ -302,6 +302,9 @@ and the derived files
% for a list of officially registered types.
% \item[\xoption{desc}]
% The description for the file.
+% \item[\xoption{afrelationship}]
+% This adds the /AFRelationship key to the filespec dicrectory. The value is
+% a pdf name with or without the leading slash.%
% \item[\xoption{stringmethod}]
% The package must convert the values of the keys \xoption{ucfilespec}
% and \xoption{desc} into a PDF string (before version 2.4: \xoption{filespec}
@@ -620,7 +623,7 @@ You need Acrobat Reader 8 or higher.
%<*dtxattach>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{dtx-attach}
- [2019/12/03 v2.9 Embed \string\jobname.dtx (HO)]%
+ [2020-04-24 v2.11 Embed \string\jobname.dtx (HO)]%
\RequirePackage{embedfile}[2019/12/03]
\embedfile[%
stringmethod=escape,%
@@ -711,7 +714,7 @@ You need Acrobat Reader 8 or higher.
\fi
\expandafter\x\csname ver@embedfile.sty\endcsname
\ProvidesPackage{embedfile}%
- [2019/12/03 v2.9 Embed files into PDF (HO)]%
+ [2020-04-24 v2.11 Embed files into PDF (HO)]%
% \end{macrocode}
%
% \subsection{Catcodes}
@@ -1187,7 +1190,7 @@ You need Acrobat Reader 8 or higher.
\else\ifx\EmFi@type\EmFi@S@creationdate CreationDate%
\else\ifx\EmFi@type\EmFi@S@size Size%
\else S%
- \fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi
/N(\EmFi@title)%
\EmFi@@order{\EmFi@order}%
\ifEmFi@visible
@@ -1376,6 +1379,7 @@ You need Acrobat Reader 8 or higher.
% \end{macro}
% \begin{macro}{\EmFi@embedfile}
% \begin{macrocode}
+\def\EmFi@removeslash#1{\if/#1\else#1\fi}%
\def\EmFi@embedfile[#1]#2{%
\ifEmFi@finished
\EmFi@Error{%
@@ -1412,7 +1416,8 @@ You need Acrobat Reader 8 or higher.
\ifx\EmFi@afrelationship\ltx@empty
\let\EmFi@@afrelationship\ltx@empty
\else
- \EmFi@convert\EmFi@afrelationship\EmFi@@afrelationship
+ \expandafter\edef\expandafter\EmFi@@afrelationship\expandafter
+ {\expandafter\EmFi@removeslash\EmFi@afrelationship}
\fi
\ifEmFi@item
\let\do\EmFi@do
@@ -1454,7 +1459,7 @@ You need Acrobat Reader 8 or higher.
\fi
\ifx\EmFi@@afrelationship\ltx@empty
\else
- /AFRelationship\EmFi@@afrelationship%
+ /AFRelationship/\pdf@escapename{\EmFi@@afrelationship}%
\fi
/EF<<%
/F \the\pdflastobj\ltx@space 0 R%
@@ -1947,7 +1952,7 @@ You need Acrobat Reader 8 or higher.
% \end{Version}
% \begin{Version}{2018/11/01 v2.8}
% \item
-% Remove luatex85 package depenency.
+% Remove luatex85 package dependency.
% \end{Version}
% \begin{Version}{2019/12/03 v2.9}
% \item
@@ -1957,6 +1962,13 @@ You need Acrobat Reader 8 or higher.
% \item
% update to use \xpackage{iftex}
% \end{Version}
+% \begin{Version}{2020-04-14 v2.10}
+% \item Fix issue \#4, the value of afrelationship should not be
+% converted but name escaped.
+% \end{Version}
+% \begin{Version}{2020-04-24 v2.11}
+% \item Added a missing fi.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/emisa/emisa.dtx b/Master/texmf-dist/source/latex/emisa/emisa.dtx
index 4f14d19bddd..6f39eae7c69 100644
--- a/Master/texmf-dist/source/latex/emisa/emisa.dtx
+++ b/Master/texmf-dist/source/latex/emisa/emisa.dtx
@@ -3,7 +3,7 @@
%
% Copyright (C) 2009-2012 by Martin Wilhelm Leidig
% <mwl@moss.in-berlin.de>
-% Copyright (C) 2015-2018 by Enterprise Modelling and Information
+% Copyright (C) 2015-2020 by Enterprise Modelling and Information
% Systems Architectures -- International Journal of Conceptual
% Modeling (EMISAJ)
% --------------------------------------------------------------------
@@ -47,7 +47,7 @@
%<class>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<class>\ProvidesClass{emisa}%
%<*class>
-[2018/02/24 2.2.0 LaTeX class EMISA]
+[2020/11/26 2.3.0 LaTeX class EMISA]
%</class>
%
%<*driver>
@@ -60,7 +60,6 @@
% \askforoverwritetrue
\askonceonly
%<batchfile>\showprogress
-%<batchfile>\askforoverwritetrue
% \usedir{tex/latex/\jobname}
%%%
% this is for biblatex files:
@@ -88,9 +87,9 @@ it as you see fit.
If you absolutely have to change \outFileName, please
do so in \jobname.dtx (after altering the name, of course!).
-Copyright (C) 2009,2010,2011,2012 by Martin Wilhelm Leidig
+Copyright (C) 2009-2012 by Martin Wilhelm Leidig
<mwl@moss.in-berlin.de>
-Copyright (C) 2015,2016,2017,2018 by Enterprise Modelling and Information
+Copyright (C) 2015-2020 by Enterprise Modelling and Information
Systems Architectures -- International Journal of Conceptual Modeling
(EMISAJ)
------------------------------------------------------------------------
@@ -180,7 +179,6 @@ This work consists of all files listed in manifest.txt.
backgroundcolor={\color{yellow!30}},
language=[LaTeX]TeX,
basicstyle=\MacroFont,
- %%%keywordstyle={},
keywordstyle=\MacroFont\bfseries,
morekeywords={editor,received,accepted,volume,issue,%
specialissuetitle,CCBYNCSAFour,CCBYNCSAThree,license,%
@@ -192,7 +190,6 @@ This work consists of all files listed in manifest.txt.
breaklines,
emptylines=1,
gobble=2,
- %%% texcsstyle=*{\footnotesize\ttfamily\color{Blue}},%
}
\lstnewenvironment{examplecode}[1][]
{\lstset{#1}}
@@ -200,7 +197,6 @@ This work consists of all files listed in manifest.txt.
\usepackage{algorithm,algorithmic}
\usepackage[onehalfspacing]{setspace}
\usepackage[dvipsnames]{xcolor}
-%\usepackage{hologo}
\usepackage{graphicx}
\usepackage[alwaysadjust,flushright]{paralist}
\setdefaultleftmargin{1.2em}{1.2em}{1.2em}{1.2em}{1.2em}{1.2em}%
@@ -982,8 +978,7 @@ This work consists of all files listed in manifest.txt.
% pages}
% \changes{v2.1.0}{2016/03/31}{Fix incompatible changes introduced by biblatex
% >3.3}
-% \changes{v2.1.0}{2016/03/31}{Changed \cs{ifblank} to
-% \cs{ifempty}
+% \changes{v2.1.0}{2016/03/31}{Changed \cs{ifblank} to \cs{ifempty}
% because of wrong interpretations. Not sure, whether this is needed of older
% versions}
% \changes{v2.1.0}{2016/04/01}{Returned to \cs{ifblank} for the old
@@ -994,7 +989,15 @@ This work consists of all files listed in manifest.txt.
% on even pages}
% \changes{v2.2.0}{2018/02/15}{Changed: Author Instructions. Babel default
% option changed to \texttt{american} (from \texttt{british})}
-%
+% \changes{v2.3.0}{2020/11/02}{Change load order of \texttt{newtxmath},
+% \texttt{amsmath} and \texttt{amssymb} to fix problem with definition of
+% \cs{Bbbk}}
+% \changes{v2.3.0}{2020/11/02}{Add explicit options to \texttt{doclicense},
+% because the fallbacks are deprecated}
+% \changes{v2.3.0}{2020/11/02}{New option \texttt{cleveref} (default) and
+% `nocleveref` to support `cleveref` package}
+% \changes{v2.3.0}{2020/11/26}{Remove package \texttt{latexrelease} as
+% suggested by Frank Mittelbach}
%
% \section{Introduction}
% Enterprise Modelling and Information Systems Architectures
@@ -1804,7 +1807,17 @@ This work consists of all files listed in manifest.txt.
% \end{option}
% \end{option}
% \end{option}
-%
+% \begin{option}{cleveref}
+% \begin{option}{nocleveref}
+% \begin{switch}{@usecleveref}
+% \begin{macrocode}
+\newif\if@usecleveref
+\DeclareOption{cleveref}{\@useclevereftrue}
+\DeclareOption{nocleveref}{\@useclevereffalse}
+% \end{macrocode}
+% \end{switch}
+% \end{option}
+% \end{option}
% \begin{option}{cover}
% \begin{option}{nocover}
% \begin{macro}{\coveron}
@@ -1836,18 +1849,12 @@ This work consists of all files listed in manifest.txt.
% \begin{macrocode}
\PassOptionsToClass{a4paper,twoside,11pt}{article}%
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}%
-\ExecuteOptions{american,final,noreferee,nocover,oneside,openany}%
+\ExecuteOptions{american,final,noreferee,nocover,cleveref,oneside,openany}%
\ProcessOptions*\relax%
% \end{macrocode}
-%
-% \begin{macrocode}
-\IfFileExists{latexrelease.sty}%
- {\RequirePackage[latest]{latexrelease}}%
- {\RequirePackage{fixltx2e}}%
-% \end{macrocode}
-%
+%
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
+%
% \subsection{Loading the base class and packages}
% \label{sec:code:cls+pkg}
%
@@ -2123,13 +2130,13 @@ This work consists of all files listed in manifest.txt.
%
% These macros are imported from \pkg{paralist}, setting standard
% enumeration marks and list indentations.
-% \changes{0.95i}{2011/04/06}{Default left margin in all levels of
+% \changes{v0.95i}{2011/04/06}{Default left margin in all levels of
% all list environments set to 1.25em.}
-% \changes{0.95l}{2012/12/11}{Default left margin setting changed back to old
+% \changes{v0.95l}{2012/12/11}{Default left margin setting changed back to old
% setting after production-level \file{emisa.cfg}:
% 1em/0.9em/0.7em/0.5em/0.4em/0.3em.}
-% \changes{2.0}{2015/12/21}{No more config files}
-% \changes{2.0}{2015/12/21}{pltopsep changed}
+% \changes{v2.0}{2015/12/21}{No more config files}
+% \changes{v2.0}{2015/12/21}{pltopsep changed}
% \begin{macrocode}
\setdefaultenum{1.}{a)}{i.}{A}%
\setdefaultleftmargin{1em}{0.9em}{0.7em}{0.5em}{0.4em}{0.3em}%
@@ -2189,8 +2196,11 @@ This work consists of all files listed in manifest.txt.
%
% \subsubsection{Scripts, fonts, and maps}
%
+% \changes{v2.3.0}{2020/11/02}{\cs{Bbbk} is defined by newtxmath and amssymb}
% \begin{macrocode}
\RequirePackage{newtxtext}
+\RequirePackage{amsmath}
+\RequirePackage{amssymb}
\RequirePackage{newtxmath}
\RequirePackage[zerostyle=b,straightquotes]{newtxtt}
\if@microtype
@@ -2228,7 +2238,6 @@ This work consists of all files listed in manifest.txt.
\lstnewenvironment{sourcecode*}[1][]
{\lstset{float=htbp,#1}}
{}
- \RequirePackage{amsmath}
\RequirePackage[amsmath,standard,hyperref]{ntheorem}
% \end{macrocode}
%
@@ -2256,9 +2265,27 @@ This work consists of all files listed in manifest.txt.
hyperfootnotes=false
]{hyperref}%
% \end{macrocode}
-%
+% \changes{v2.3.0}{2020/11/02}{Add support for cleveref}
+% \begin{macrocode}
+\if@usecleveref%
+ \RequirePackage[capitalise,nameinlink]{cleveref}
+ \crefname{section}{Sec.}{Sec.}
+ \Crefname{section}{Sec.}{Sec.}
+ \crefname{figure}{\figurename}{\figurename}
+ \Crefname{figure}{\figurename}{\figurename}
+ \crefname{listing}{\lstlistingname}{\lstlistingname}
+ \Crefname{listing}{\lstlistingname}{\lstlistingname}
+ \crefname{table}{\tablename}{\tablename}
+ \Crefname{table}{\tablename}{\tablename}
+\fi%
+% \end{macrocode}
+% \changes{v2.3.0}{2020/11/02}{Package now needs explicit options}
% \begin{macrocode}
-\RequirePackage{doclicense}
+\RequirePackage[%
+ type={CC},%
+ modifier={by-nc-sa},%
+ version={4.0}%
+]{doclicense}
% \end{macrocode}
%
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -2604,11 +2631,11 @@ This work consists of all files listed in manifest.txt.
% \end{macro}
%
% \begin{macro}{\specialissuetitle}
-% \changes{0.92n}{2010/05/18}{Fixed missing \cs{space} after
+% \changes{v0.92n}{2010/05/18}{Fixed missing \cs{space} after
% non-empty Special Issue title
% prefix.}
% \begin{macro}{\specialissuetitle*}
-% \changes{0.92n}{2010/05/18}{New.}
+% \changes{v0.92n}{2010/05/18}{New.}
% \begin{macro}{\specialissuetitleprefix}
% If the current issue is a \emph{special issue}, the respective
% title goes here.
@@ -3091,7 +3118,7 @@ This work consists of all files listed in manifest.txt.
%
% \begin{macro}{\headmarkstyle}
% \begin{macro}{\markhead}
-% \changes{0.92d}{2010/01/20}{\cs{markboth} had to be renamed to
+% \changes{v0.92d}{2010/01/20}{\cs{markboth} had to be renamed to
% \cs{markhead} to avoid \pkg{biblatex}'s \cs{printbibliography}
% putting ``REFERENCES'' into the page head.}
% \begin{macro}{\markarticle}
@@ -3736,7 +3763,7 @@ This work consists of all files listed in manifest.txt.
% \end{macrocode}
%
%
-% \changes{0.95i}{2011/04/06}{Affiliation adress for Reinhard Jung
+% \changes{v0.95i}{2011/04/06}{Affiliation adress for Reinhard Jung
% changed from \emph{University of Duisburg-Essen} to \emph{University
% of St.\,Gallen}.}
% \begin{macrocode}
@@ -5945,7 +5972,7 @@ This work consists of all files listed in manifest.txt.
% The macros in this subsection will supersede any previous definition
% by the same name(s).
%
-% \changes{2010-06-21}{v0.93}{Modified to use EMISA name format.}
+% \changes{v0.93}{2010/06/21}{Modified to use EMISA name format.}
% \begin{bibmacro}{author}
% \begin{macrocode}
\renewbibmacro*{author}{%
@@ -5971,7 +5998,7 @@ This work consists of all files listed in manifest.txt.
% \end{bibmacro}
%
%
-% \changes{2010-06-21}{v0.93}{Modified to use EMISA name format.}
+% \changes{v0.93}{2010/06/21}{Modified to use EMISA name format.}
% \begin{bibmacro}{bbx:editor}
% \begin{macrocode}
\renewbibmacro*{bbx:editor}[1]{%
@@ -5998,7 +6025,7 @@ This work consists of all files listed in manifest.txt.
%
%
%
-% \changes{2010-06-21}{v0.93}{Modified to use EMISA name format.}
+% \changes{v0.93}{2010/06/21}{Modified to use EMISA name format.}
% \begin{bibmacro}{bbx:translator}
% \begin{macrocode}
\renewbibmacro*{bbx:translator}[1]{%
diff --git a/Master/texmf-dist/source/latex/emisa/emisa.ins b/Master/texmf-dist/source/latex/emisa/emisa.ins
index 84aed9da5de..523730559d1 100644
--- a/Master/texmf-dist/source/latex/emisa/emisa.ins
+++ b/Master/texmf-dist/source/latex/emisa/emisa.ins
@@ -9,9 +9,9 @@
%% If you absolutely have to change emisa.ins, please
%% do so in emisa.dtx (after altering the name, of course!).
%%
-%% Copyright (C) 2009,2010,2011,2012 by Martin Wilhelm Leidig
+%% Copyright (C) 2009-2012 by Martin Wilhelm Leidig
%% <mwl@moss.in-berlin.de>
-%% Copyright (C) 2015,2016,2017,2018 by Enterprise Modelling and Information
+%% Copyright (C) 2015-2020 by Enterprise Modelling and Information
%% Systems Architectures -- International Journal of Conceptual Modeling
%% (EMISAJ)
%% ------------------------------------------------------------------------
@@ -35,7 +35,6 @@
\askforoverwritefalse
\askonceonly
\showprogress
-\askforoverwritetrue
%%%
\declarepreamble\biblatexpre
@@ -59,9 +58,9 @@ it as you see fit.
If you absolutely have to change \outFileName, please
do so in \jobname.dtx (after altering the name, of course!).
-Copyright (C) 2009,2010,2011,2012 by Martin Wilhelm Leidig
+Copyright (C) 2009-2012 by Martin Wilhelm Leidig
<mwl@moss.in-berlin.de>
-Copyright (C) 2015,2016,2017,2018 by Enterprise Modelling and Information
+Copyright (C) 2015-2020 by Enterprise Modelling and Information
Systems Architectures -- International Journal of Conceptual Modeling
(EMISAJ)
------------------------------------------------------------------------
diff --git a/Master/texmf-dist/source/latex/endnotes-hy/endnotes-hy.dtx b/Master/texmf-dist/source/latex/endnotes-hy/endnotes-hy.dtx
new file mode 100644
index 00000000000..3f69d7a642e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/endnotes-hy/endnotes-hy.dtx
@@ -0,0 +1,249 @@
+% \iffalse
+% makeindex -s gglo.ist -o endnotes-hy.gls endnotes-hy.glo
+% makeindex -s gind.ist -o endnotes-hy.ind endnotes-hy.idx
+%<*copyright>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% endnotes-hy.sty package, %%
+%% Copyright (C) 2020 %%
+%% dpstory@uakron.edu dpstory@acrotex.net %%
+%% %%
+%% This program can redistributed and/or modified under %%
+%% the terms of the LaTeX Project Public License %%
+%% Distributed from CTAN archives in directory %%
+%% macros/latex/base/lppl.txt; either version 1.2 of the %%
+%% License, or (at your option) any later version. %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%</copyright>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{endnotes-hy}
+%<package> [2020/04/08 v0.1 Enables hypertext links for endnotes]
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[colorlinks,hyperindex=false,linktocpage,bookmarksnumbered]{hyperref}
+\usepackage{calc}
+\usepackage{endnotes-hy}
+%\def\texorpdfstring#1#2{#1}
+%\pdfstringdefDisableCommands{\let\\\textbackslash}
+\OnlyDescription % comment out for implementation details
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\gdef\brpr#1{\texttt{\char123\relax#1\char125\relax}}
+\let\darg\brpr
+\let\env\texttt
+\let\opt\texttt
+\let\app\textsf
+\let\pkg\textsf
+\def\EXCL{!}
+\def\visispace{\symbol{32}}
+\def\ameta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}}
+\def\meta#1{\textsl{\texttt{#1}}}
+\def\SUB#1{\ensuremath{{}_{\mbox{\scriptsize\ttfamily#1}}}}
+\def\CMD#1{\textbackslash#1}
+\makeatletter
+\renewcommand\theparagraph{\texorpdfstring{\protect\P\protect\ }{\textparagraph}}
+\renewcommand\thesubparagraph{\texorpdfstring{\protect\P\protect\P\protect\ }{\textparagraph\textparagraph}}
+\renewcommand{\section}
+ {\renewcommand{\@seccntformat}[1]{\thesection\quad}%
+ \@startsection {section}{1}{\z@}%
+ {-3.5ex \@plus -1ex \@minus -.2ex}%
+ {2.3ex \@plus.2ex}%
+ {\normalfont\Large\bfseries}}
+\renewcommand{\paragraph}
+ {\renewcommand{\@seccntformat}[1]{\theparagraph\unskip\,}%
+ \@startsection{paragraph}{4}{0pt}{6pt}{-3pt}{\bfseries}}
+\renewcommand{\subparagraph}
+ {\renewcommand{\@seccntformat}[1]{\thesubparagraph\unskip\,}%
+ \@startsection{subparagraph}{5}{\parindent}{6pt}{-3pt}{\bfseries}}
+\makeatother
+\newbox\enbox
+\InputIfFileExists{aebdocfmt.def}{\PackageWarning{endnotes-hy}{Inputting aebdocfmt.def}}
+ {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax
+ \PackageInfo{endnotes-hy}{aebdocfmt.def cannot be found}}
+\begin{document}
+\addtolength{\marginparwidth}{3pt}
+ \GetFileInfo{endnotes-hy.sty}
+ \title{The \textsf{endnotes-hy} Package}
+ \author{D. P. Story\\
+ Email: \texttt{dpstory@uakron.edu}}
+ \date{processed \today}
+ \maketitle
+\setcounter{secnumdepth}{5}
+\setcounter{tocdepth}{5}
+\bgroup
+\value{secnumdepth}=3
+\value{tocdepth}=3
+ \tableofcontents
+\egroup
+ \DocInput{endnotes-hy.dtx}
+\IfFileExists{\jobname.ind}{\newpage\setupFullwidth\par\PrintIndex}{\paragraph*{Index} The index goes here. Execute
+ \begin{quote}\texttt{makeindex -s gind.ist -o endnotes-hy.ind endnotes-hy.idx}\end{quote}
+ on the command line and recompile
+ \texttt{endnotes-hy.dtx}.}
+\IfFileExists{\jobname.gls}{\PrintChanges}{\paragraph*{Change History} The list of changes goes here. Execute
+ \begin{quote}
+ \texttt{makeindex -s gglo.ist -o endnotes-hy.gls endnotes-hy.glo}
+ \end{quote}
+ on the command line and recompile \texttt{endnotes-hy.dtx}.}
+\end{document}
+%</driver>
+% \fi
+% \MakeShortVerb{|}
+% \InputIfFileExists{aebdonotindex.def}{\PackageInfo{web}{Inputting aebdonotindex.def}}
+% {\PackageInfo{web}{cannot find aebdonotindex.def}}
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+% \section{Introduction}
+% This package is an extension of \href{https://ctan.org/pkg/endnotes}{\pkg{endnotes}}.
+% \changes{v0.1}{2020/04/08}{First published version of this package.}
+%
+% \paragraph*{Background:} A colleague---a dedicated user of the
+% \href{https://ctan.org/pkg/endnotes}{\pkg{endnotes}} package---complained to me
+% (for some reason) that links created by \pkg{hyperref} do not point to the
+% endnotes at the end of the file; for example, if we say
+%\begin{quote}\ttfamily
+% \string\endnote\darg{\string\label\darg{\ameta{name}}\ameta{text}}
+%\end{quote}
+% then any link, such as
+% \cs{hyperref[\ameta{name}]\darg{endnote\string~\string\ref*\darg{\ameta{name}}}} jumps
+% to the most recent anchor (\texttt{Doc-Start}, for example); no hypertext
+% anchor is created where the endnote is inserted into the document. This short
+% package is an attempt to rectify this problem.
+%
+%\paragraph*{Syntax:}
+% The \cs{endnote} command has been modified to conform to the following syntax:
+%\begin{quote}
+% \cs{endnote*[\ameta{num}]\darg{\ameta{text}}\string\label\darg{\ameta{name}}}
+%\end{quote}
+% Refer to the documentation of the \href{https://ctan.org/pkg/endnotes}{\pkg{endnotes}} package for a description of the \cs{endnote}
+% command and its \ameta{num} and \ameta{text} arguments.
+% If the \texttt*-option (new syntax) is used, the endnote mark is not placed, but the endnote
+% is written to the \texttt{ENT} file.\endnote*{An endnote created with \texttt*-option}\label{en:en*}
+% Such a ``secret'' endnote can be referred to using standard \pkg{hyperref} commands,
+% see the \autoref{en:en*} on page~\pageref{en:en*} for more information. The placement of the \cs{label} has
+% changed for this package as well. To define an endnote label, place \cs{label\darg{name}} following
+% the \cs{endnote} command, a more traditional location. This was done to get access to the \ameta{name}, if it exist.
+% This enables the package to place a hypertext link around the endnote mark.\endnote{This is normal endnote}\label{en:normal}
+% The optional \ameta{num} can be used
+% to write special endnotes.{\def\theendnote{N\arabic{endnote}}\endnote[1]{This is special endnote}\label{en:specen}}
+% As a side benefit to this new syntax, you can place verbatim text into an
+% endnote.\setbox\enbox\hbox{\verb!%^$^&$%^&!}\edef\VertTxti{\unhbox\enbox}\endnote{Some verbatim text \VertTxti}\label{en:verb}
+% If there is no \cs{label} following \cs{endnote}, no hypertext link is created.\endnote{No hypertext link created}
+%
+% \paragraph*{Note:} This package will work correctly without the \pkg{hyperref} package (of course, no links).
+% The advantage of using \pkg{endnotes-hy} without \pkg{hyperref} is to use the extended syntax:
+% \cs{endnote*[\ameta{num}]\darg{\ameta{text}}\string\label\darg{\ameta{name}}}
+%
+% \section{Required packages}
+%
+% \begin{macrocode}
+\RequirePackage{endnotes}
+% \end{macrocode}
+% Require \pkg{etoolbox} because we redefine several commands using \cs{patchcmd}; this is not
+% really necessary, we could have redefined the whole command instead.
+% \begin{macrocode}
+\RequirePackage{etoolbox}
+% \end{macrocode}
+% \section{Package code}
+% We allow the author not to use \pkg{hyperref}; this enables the use of the extended
+% syntax of the \cs{endnote} command.
+% \begin{macrocode}
+\newcommand\hyperref@nohy[2][]{#2}
+\AtBeginDocument{\@ifundefined{hyperref}{\let\hyperref@en\hyperref@nohy
+ \let\phantomendnote\relax}
+ {\let\hyperref@en\hyperref}}
+% \end{macrocode}
+% \begin{macro}{\phantomendnote}
+% The key is to create an hyperref anchor to reference; this definition is based on
+% \cs{phantomsection} of \pkg{hyperref}. This is used internally.
+% \begin{macrocode}
+\def\phantomendnote{%
+ \Hy@MakeCurrentHrefAuto{endnote}%
+ \Hy@raisedlink
+ {\hyper@anchorstart{endnote.\@theenmark}\hyper@anchorend}}
+\def\endnoteautorefname{endnote}
+% \end{macrocode}
+% \end{macro}
+% Redefinition of \DescribeMacro{\theendnotes}\cs{theendnotes}
+% \begin{macrocode}
+\patchcmd{\theendnotes}{\enoteformat}
+ {\phantomendnote\def\@currentHref{endnote.\@theenmark}%
+ \enoteformat}{}{}
+% \end{macrocode}
+% Redefine \DescribeMacro\endnote\cs{endnote} to take an optional \texttt{*}, if this option is used, the mark does not appear
+% in the text. This enables us to easily define an endnote and refer to it even with multiple paragraphs.
+% I didn't like the syntax of inserting the \cs{label} within the argument of \cs{endnote}, this seems to have
+% problems. The new syntax is as follows:\begin{quote}
+% Syntax: \cs{endnote*[\ameta{num}]\darg{\ameta{text}}\string\label\darg{\ameta{name}}}\end{quote}
+% This new syntax could be a problem if an author has already used \pkg{endnotes} and then converts
+% to \pkg{endnotes-hy}. In \pkg{endnotes} the \texttt*-option is note defined and the \cs{label}
+% command is typically placed within the argument of the \darg{\ameta{text}}. Labels would have to be moved
+% to a position following \darg{\ameta{text}}.
+%
+% To obtain this syntax, we need several stages of parsing. The major problem is to get the
+% label name in time to build a hyperref link around \cs{@endnotemark}.
+% \begin{macrocode}
+\newtoks\@entoks
+\def\endnote{\let\@encurrlabelname\@empty
+ \@ifstar{\let\@noMrk1\endnote@i}{\let\@noMrk0\endnote@i}}
+\def\endnote@i{\@ifnextchar[%]
+ {\@xendnote}
+ {\stepcounter{endnote}%
+ \protected@xdef\@theenmark{\theendnote}%
+% \end{macrocode}
+% We placed the \darg{text} argument into a token register, this removes
+% that argument from the input stream, and allows us to see of the next token
+% is \cs{label}, if so, we get the label name argument.
+% \begin{macrocode}
+ \afterassignment\endnote@ii\@entoks}}
+% \end{macrocode}
+% If the next token is \cs{label}, get the label name with \cs{endnote@iii},
+% otherwise, move on to \cs{endnote@iv}, the final step.
+% \begin{macrocode}
+\def\endnote@ii{\@ifnextchar\label{\endnote@iii}{\endnote@iv}}
+\def\endnote@iii\label#1{\def\@encurrlabelname{#1}\endnote@iv}
+% \end{macrocode}
+% If the flag \cs{@noMrk} is 0 (mark is typeset), and if there
+% is a label name, we make an hypertext link.
+% \begin{macrocode}
+\def\endnote@iv{%
+ \if\@noMrk0\relax
+ \ifx\@encurrlabelname\@empty
+ \@endnotemark
+ \else
+ \hyperref@en[\@encurrlabelname]{\@endnotemark}%
+ \fi
+ \fi
+% \end{macrocode}
+% Finish by expanding \cs{@endnotetext} with its argument
+% that was saved in the \cs{@entoks} register.
+% \begin{macrocode}
+ \expandafter\@endnotetext\expandafter{\the\@entoks}}
+% \end{macrocode}
+% We patch into \DescribeMacro\@endnotetext\cs{@endnotetext} just after \verb~\def\next{#1}~.
+% If there was a \cs{label}, we insert it back into the argument
+% of \cs{endnote}.
+% \begin{macrocode}
+\patchcmd{\@endnotetext}
+ {\def\next{#1}}
+ {\ifx\@encurrlabelname\@empty
+ \def\next{#1}\else
+ \edef\x{\noexpand\label{\@encurrlabelname}}%
+ \expandafter\def\expandafter\next\expandafter{\x#1}\fi}{}{}
+% \end{macrocode}
+% If \cs{endnote} has an optional argument, the flow passes to
+% \DescribeMacro\xendnote\cs{xendnote}. We replace
+% \verb~\@endnotemark\@endnotetext~ by redirecting flow to
+% to \cs{endnote@ii}, after saving the argument in \cs{@entoks}.
+% \begin{macrocode}
+\patchcmd{\@xendnote}
+ {\@endnotemark\@endnotetext}
+ {\afterassignment\endnote@ii\@entoks}
+ {}{}
+% \end{macrocode}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%\theendnotes
+%\Finale
diff --git a/Master/texmf-dist/source/latex/endnotes-hy/endnotes-hy.ins b/Master/texmf-dist/source/latex/endnotes-hy/endnotes-hy.ins
new file mode 100644
index 00000000000..b1104ffe1ad
--- /dev/null
+++ b/Master/texmf-dist/source/latex/endnotes-hy/endnotes-hy.ins
@@ -0,0 +1,60 @@
+%%
+%% 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 1999-2012 D. P. Story
+%%
+%% This file is part of the `AcroTeX eDucation Bundle'.
+%% -------------------------------------------
+%%
+%% It may be distributed under the conditions of the LaTeX Project Public
+%% License, either version 1.2 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.2 or later is part of all distributions of LaTeX
+%% version 1999/12/01 or later.
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\def\filedate{2020/04/08}
+\def\batchfile{endnotes-hy.ins}
+
+\input docstrip
+\ifx\generate\undefined
+ \Msg{**********************************************}
+ \Msg{*}
+ \Msg{* This installation requires docstrip}
+ \Msg{* version 2.4 or later.}
+ \Msg{*}
+ \Msg{* An older version of docstrip has been input}
+ \Msg{*}
+ \Msg{**********************************************}
+ \errhelp{Move or rename old docstrip.tex and get a newer one.}
+ \errmessage{Old docstrip in input path}
+ \batchmode
+ \csname @@end\endcsname\end
+\fi
+
+\keepsilent
+\askforoverwritefalse
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\preamble
+\endpreamble
+
+\generate
+{%
+ \file{endnotes-hy.sty}{\from{endnotes-hy.dtx}{copyright,package}}
+}
+
+\Msg{***************************************************************}
+\Msg{*}
+\Msg{* \space To finish the installation you have to copy the files }
+\Msg{*}
+\Msg{* \space *.sty, *.cfg and *.def into a directory searched by TeX}
+\Msg{*}
+\Msg{***************************************************************}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
diff --git a/Master/texmf-dist/source/latex/eq-pin2corr/eq-pin2corr.dtx b/Master/texmf-dist/source/latex/eq-pin2corr/eq-pin2corr.dtx
new file mode 100644
index 00000000000..091ba8a94f4
--- /dev/null
+++ b/Master/texmf-dist/source/latex/eq-pin2corr/eq-pin2corr.dtx
@@ -0,0 +1,281 @@
+% \iffalse
+% makeindex -s gglo.ist -o eq-pin2corr.gls eq-pin2corr.glo
+% makeindex -s gind.ist -o eq-pin2corr.ind eq-pin2corr.idx
+%<*copyright>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% eq-pin2corr.sty package, %%
+%% Copyright (C) 2021 D. P. Story %%
+%% dpstory@uakron.edu dpstory@acrotex.net %%
+%% %%
+%% This program can redistributed and/or modified under %%
+%% the terms of the LaTeX Project Public License %%
+%% Distributed from CTAN archives in directory %%
+%% macros/latex/base/lppl.txt; either version 1.2 of the %%
+%% License, or (at your option) any later version. %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%</copyright>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{eq-pin2corr}
+%<package> [2021/02/20 v1.0 Applies PIN security to quizzes]
+%<*driver>
+\documentclass{ltxdoc}
+%\usepackage[colorlinks,hyperindex=false,linktocpage,bookmarksnumbered]{hyperref}
+\usepackage[colorlinks,hyperindex=false]{hyperref}
+\usepackage{fancyvrb}
+\usepackage{calc}
+%\usepackage{eq-pin2corr}
+%\def\texorpdfstring#1#2{#1}
+%\pdfstringdefDisableCommands{\let\\\textbackslash}
+\OnlyDescription % comment out for implementation details
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\gdef\brpr#1{\texttt{\char123\relax#1\char125\relax}}
+\let\darg\brpr
+\let\env\texttt
+\let\opt\texttt
+\let\app\textsf
+\let\pkg\textsf
+\let\uif\textsf
+\def\EXCL{!}
+\def\visispace{\symbol{32}}
+\def\ameta#1{\ensuremath{\langle\textit{\texttt{#1}}\rangle}}
+\def\meta#1{\textsl{\texttt{#1}}}
+\def\SUB#1{\ensuremath{{}_{\mbox{\scriptsize\ttfamily#1}}}}
+\def\CMD#1{\textbackslash#1}
+\makeatletter
+\renewcommand\theparagraph{\texorpdfstring{\protect\P\protect\ }{\textparagraph}}
+\renewcommand\thesubparagraph{\texorpdfstring{\protect\P\protect\P\protect\ }{\textparagraph\textparagraph}}
+\renewcommand{\section}
+ {\renewcommand{\@seccntformat}[1]{\thesection\quad}%
+ \@startsection {section}{1}{\z@}%
+ {-3.5ex \@plus -1ex \@minus -.2ex}%
+ {2.3ex \@plus.2ex}%
+ {\normalfont\Large\bfseries}}
+\renewcommand{\paragraph}
+ {\renewcommand{\@seccntformat}[1]{\theparagraph\unskip\,}%
+ \@startsection{paragraph}{4}{0pt}{6pt}{-3pt}{\bfseries}}
+\renewcommand{\subparagraph}
+ {\renewcommand{\@seccntformat}[1]{\thesubparagraph\unskip\,}%
+ \@startsection{subparagraph}{5}{\parindent}{6pt}{-3pt}{\bfseries}}
+\edef\amtIndent{\the\parindent}
+\newenvironment{aebQuote}
+ {\list{}{\leftmargin\amtIndent}%
+ \item\relax}
+ {\endlist}
+\makeatother
+\InputIfFileExists{aebdocfmt.def}{\PackageWarning{eq-pin2corr}{Inputting aebdocfmt.def}}
+ {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax
+ \PackageInfo{eq-pin2corr}{aebdocfmt.def cannot be found}}
+\begin{document}
+\addtolength{\marginparwidth}{3pt}
+ \GetFileInfo{eq-pin2corr.sty}
+ \title{The \textsf{eq-pin2corr} Package}
+ \author{D. P. Story\\
+ Email: \texttt{dpstory@uakron.edu}}
+ \date{processed \today}
+ \maketitle
+\setcounter{secnumdepth}{5}
+\setcounter{tocdepth}{5}
+\bgroup
+\value{secnumdepth}=3
+\value{tocdepth}=3
+ \tableofcontents
+\egroup
+ \DocInput{eq-pin2corr.dtx}
+\IfFileExists{\jobname.ind}{\newpage\setupFullwidth\par\PrintIndex}{\paragraph*{Index} The index goes here. Execute
+ \begin{quote}\texttt{makeindex -s gind.ist -o eq-pin2corr.ind eq-pin2corr.idx}\end{quote}
+ on the command line and recompile
+ \texttt{eq-pin2corr.dtx}.}
+\IfFileExists{\jobname.gls}{\PrintChanges}{\paragraph*{Change History} The list of changes goes here. Execute
+ \begin{quote}
+ \texttt{makeindex -s gglo.ist -o eq-pin2corr.gls eq-pin2corr.glo}
+ \end{quote}
+ on the command line and recompile \texttt{eq-pin2corr.dtx}.}
+\end{document}
+%</driver>
+% \fi
+% \MakeShortVerb{|}
+% \InputIfFileExists{aebdonotindex.def}{\PackageInfo{web}{Inputting aebdonotindex.def}}
+% {\PackageInfo{web}{cannot find aebdonotindex.def}}
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \section{Introduction}
+% This package is an add-on to the \env{quiz} environment of the \pkg{exerquiz} package. It uses
+% the \pkg{eq-save} package. To correct a quiz, the document consumer must press
+% the \uif{Correct} button of a quiz and successfully enter the correct PIN number.
+%
+% \changes{v1.0}{2021/02/20}{Completed documentation, publish package for first time}
+%
+% \paragraph*{Purpose.} This package adds PIN security to a quiz created by
+% the \env{quiz} environment. This package is designed for the educational
+% sector, for instructors who use the quizzes of \pkg{exerquiz} to assess their
+% students understanding of the course material.
+%
+% \paragraph*{PDF Viewers.} Discussion of PDF viewers for document author and document consumer.
+% \begin{aebQuote}
+% \begin{description}
+% \item[Instructor] Any PDF viewer may be used as a PDF previewer, \app{sumatraPDF}, for instance,
+% can be used, but it has not functionality. To test the newly created document
+% to see if it is functioning correctly, must use \app{Adobe Reader DC} or \app{Acrobat DC}.\footnote
+% {We use DC here to refer to actually any Adobe AA/AR application. Earlier versions of these applications
+% will work.}
+% \item[Document consumers (students)] The \pkg{exerquiz} and \pkg{eq-pin2tocorr} extensively
+% use JavaScript to perform many background tasks. For the student to have any success in this
+% workflow, he/she must use \app{Adobe Reader}.
+% \end{description}
+% \end{aebQuote}
+% \paragraph*{Workflow.} The package is designed for the following workflow:
+% \begin{enumerate}
+% \item The instructor creates the quiz using the \pkg{exerquiz} and
+% \pkg{eq-pin2corr} packages.
+% \item The instructor delivers the ``PDF quiz'' to each student. (System drive or email)
+% \item The student takes the quiz. The student can press the \uif{Correct}
+% but, unless he/she knows the PIN, the quiz is not marked up.
+% \item The student saves the PDF quiz in \app{Adobe Reader DC}.
+% \item The student returns the PDF to the instructor. (System drive or email)
+% \item The instructor presses the \uif{Correct} button to mark up the quiz
+% and record the grade of the student. The instructor saves the quiz.
+% \item The instructor returns the PDF, at some point, to the student.
+% \item Both instructor and student happily go on with their lives.
+% \end{enumerate}
+% \section{Options and package requirements}
+% \begin{macrocode}
+\newif\ifPINshowScore \PINshowScorefalse
+\DeclareOption{showscore}{\PINshowScoretrue}
+\DeclareOption{!showscore}{\PINshowScorefalse}
+\ProcessOptions\relax
+\RequirePackage{exerquiz}[2021/02/17]
+\RequirePackage{eq-save}[2021/02/17]
+% \end{macrocode}
+% \section{Package commands}
+% Implement local versions\DescribeMacro{\showScoreOn}\DescribeMacro{\showScoreOff}{} of the package options \opt{showscore} and \opt{!showscore},
+% these are \cs{showScoreOn} and \cs{showScoreOff}.
+% \begin{macrocode}
+\def\showScoreOn{\PINshowScoretrue}
+\def\showScoreOff{\PINshowScorefalse}
+% \end{macrocode}
+% Define \DescribeMacro{\SaveAndSendMsg} a message that appears on the console when the PIN entered is not correct.
+% \begin{macrocode}
+\flJSStr[noquotes]{\SaveAndSendMsg}{Success! %
+Now save and send to the instructor}
+% \end{macrocode}
+% Make changes to the \uif{End Quiz} control and to the \uif{Correct} control.
+% Begin by modifying the \DescribeMacro{\postSubmitQuiz}\cs{postSubmitQuiz} command, which is a hook within the executing
+% code of the \uif{End Quiz} control.
+% \begin{macrocode}
+\begin{defineJS*}[\makeesc\@\makecmt\%]{\postSubmitQuiz}
+// Begin post submit quiz code%
+@ifPINSecurity%
+@ifPINshowScore@else
+ var f = this.getField("ScoreField.@oField");
+ if ( f!=null ) {
+ f.textSize=0;
+ f.value = "@SaveAndSendMsg";
+ } else {
+ var f = this.getField("PointsField.@oField");
+ if (f!=null) {
+ f.textSize=0;
+ f.value = "Success! Now save and send to instructor";
+ }
+ }@fi@fi
+ oRecordOfQuizData["ScoreData.@oField"]=%
+[1*Score,1*NQuestions,1*ptScore,1*NPointTotal];
+ oRecordOfQuizData["RightWrong.@oField"]=%
+eval(RightWrong.toSource());
+ oRecordOfQuizData["ProbDist.@oField"]=%
+eval(ProbDist.toSource());
+ cntCorrectResponses();
+\end{defineJS*}
+% \end{macrocode}
+% The command name for the action of the \uif{End Quiz} control is
+% \DescribeMacro{\eQzBtnActns}\cs{eQzBtnActns}.
+% We save this and pre-pend a single code line, as needed.
+% \begin{macrocode}
+\let\eQzBtnActnsSave\eQzBtnActns
+\def\eQzBtnActns{\ifPINshowScore\else
+ var bDisplaySilent=true;\r\fi
+ \eQzBtnActnsSave
+}
+% \end{macrocode}
+% The command name for the action of the \uif{Correct} control is \cs{CorrBtnActionsJS}
+% we save this and later modify it.
+% \begin{macrocode}
+\let\CorrBtnActionsJSSave\CorrBtnActionsJS
+% \end{macrocode}
+% We can turn on and off the PIN feature by expanding \DescribeMacro{\usePINCorrBtn}
+% \cs{usePINCorrBtn} and \DescribeMacro{\restoreCorrBtn}\cs{restoreCorrBtn}.
+% \begin{macrocode}
+\newif\ifPINSecurity \PINSecurityfalse
+\def\usePINCorrBtn{\PINSecuritytrue
+ \let\CorrBtnActionsJS\CorrBtnActionsPwdJS}
+\def\restoreCorrBtn{\PINshowScoretrue\PINSecurityfalse
+ \let\CorrBtnActionsJS\CorrBtnActionsJSSave}
+% \end{macrocode}
+% The instructor can tediously press the \uif{Correction} button, or place
+% an entry,
+%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small,
+%commandchars={!()},codes={\catcode`\%=9}]
+%var _PinCode1 = "02JRVZdRgYgCA-Rtje8VkD";
+%\end{Verbatim}
+%in the file \texttt{config.js}. If such a variable exists and its value
+%matches the PIN hash string, the instructor clicks the \uif{Correction} button
+%to get the quiz markup. Conceivably, the instructor might want different PIN names
+%and string hash values. The \DescribeMacro\classPINVar\cs{classPINVar} is a convenient
+%way of declaring the PIN variable name; eg, if |\classPINVar{_PinCode1}| is declared
+%prior to the \env{quiz} environment, the instructor need not manually enter the PIN.
+% \begin{macrocode}
+\def\classPINVar#1{\def\PINclassPV{#1}}
+\let\PINclassPV\@empty
+% \end{macrocode}
+% The modified action for the \uif{Correct} button.
+% we save this and later modify it.
+% \begin{macrocode}
+\begin{defineJS*}[\makeesc\!\makecmt\%]{\CorrBtnActionsPwdJS}
+!ifx!PINclassPV!@empty%
+var userPIN = "";!else%
+var userPIN = "!PINclassPV";!fi
+if (userPIN == "" ) userPIN = undefined;
+try {
+ if ( typeof eval(userPIN) == "undefined") userPIN = undefined;
+} catch(e) { userPIN = undefined; }
+if (typeof userPIN == "undefined") {
+ var resp=app.response({
+ cQuestion: "Enter the PIN number",
+ cTitle: "View Answers",
+ bPassword: true
+ });
+ var _resp=Collab.hashString(resp);
+ var _bQzResults = ( _resp ==_PinCode );
+} else var _bQzResults = ( eval(userPIN) ==_PinCode );
+if (_bQzResults) {
+ RightWrong=eval("RightWrong.!currQuiz");
+ ProbDist=eval("ProbDist.!currQuiz");
+ correctQuiz("!currQuiz",3);
+ DisplayQuizResults("!currQuiz",3,3);
+ if (typeof correctSumryTbl == "function")
+ correctSumryTbl("!currQuiz",3);
+} else {
+ console.println("Something went wrong, \\
+you entered an incorrect PIN Id, \\
+or the class PIN Id (\\\\classPINVar) was incorrect or undefined");
+ console.show();
+}
+\end{defineJS*}
+% \end{macrocode}
+% \DescribeMacro\declPINId\hskip-\marginparsep\texttt{\darg{\ameta{PIN-Id}}\darg{\ameta{hash-str}}}
+% Set the basic parameters of this PIN security scheme: the pin-id and its corresponding hash-string.
+% \begin{macrocode}
+\def\declPINId#1#2{\def\numPINId{#1}\def\hashPINId{#2}}
+\@onlypreamble\declPINId
+\declPINId{5243}{02JRVZdRgYgCA-Rtje8VkD} % PIN Id, hash-str
+\begin{insDLJS}{pin}{Pin Code}
+var _PinCode = "\hashPINId";
+\end{insDLJS}
+% \end{macrocode}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%\Finale
diff --git a/Master/texmf-dist/source/latex/eq-pin2corr/eq-pin2corr.ins b/Master/texmf-dist/source/latex/eq-pin2corr/eq-pin2corr.ins
new file mode 100644
index 00000000000..b759729ac93
--- /dev/null
+++ b/Master/texmf-dist/source/latex/eq-pin2corr/eq-pin2corr.ins
@@ -0,0 +1,60 @@
+%%
+%% 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 2021 D. P. Story
+%%
+%% This file is part of the `AcroTeX eDucation Bundle'.
+%% -------------------------------------------
+%%
+%% It may be distributed under the conditions of the LaTeX Project Public
+%% License, either version 1.2 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.2 or later is part of all distributions of LaTeX
+%% version 1999/12/01 or later.
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\def\filedate{2018/09/21}
+\def\batchfile{eq-pin2corr.ins}
+
+\input docstrip
+\ifx\generate\undefined
+ \Msg{**********************************************}
+ \Msg{*}
+ \Msg{* This installation requires docstrip}
+ \Msg{* version 2.4 or later.}
+ \Msg{*}
+ \Msg{* An older version of docstrip has been input}
+ \Msg{*}
+ \Msg{**********************************************}
+ \errhelp{Move or rename old docstrip.tex and get a newer one.}
+ \errmessage{Old docstrip in input path}
+ \batchmode
+ \csname @@end\endcsname\end
+\fi
+
+\keepsilent
+\askforoverwritefalse
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\preamble
+\endpreamble
+
+\generate
+{%
+ \file{eq-pin2corr.sty}{\from{eq-pin2corr.dtx}{copyright,package}}
+}
+
+\Msg{***************************************************************}
+\Msg{*}
+\Msg{* \space To finish the installation you have to copy the files }
+\Msg{*}
+\Msg{* \space *.sty, *.cfg and *.def into a directory searched by TeX}
+\Msg{*}
+\Msg{***************************************************************}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
diff --git a/Master/texmf-dist/source/latex/erw-l3/erw-l3.dtx b/Master/texmf-dist/source/latex/erw-l3/erw-l3.dtx
index b538f3dd77d..eb504d5bbb6 100644
--- a/Master/texmf-dist/source/latex/erw-l3/erw-l3.dtx
+++ b/Master/texmf-dist/source/latex/erw-l3/erw-l3.dtx
@@ -1,39 +1,39 @@
% \iffalse meta-comment
% !TEX program = pdfLaTeX
-%<*internal>
+%<*internal>
\iffalse
-%</internal>
-%<*readme>
-----------------------------------------------------------------
-erw-l3 --- Utilities built around expl3
-Source repository: https://github.com/rogard/erw-l3
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
+%</internal>
+%<*readme>
+-----------------------------------------------------------------
+##### erw-l3 --- Utilities for LaTeX3 programming
+- Source repository: https://github.com/rogard/erw-l3
+- Released under the LaTeX Project Public License v1.3c or later
+- See http://www.latex-project.org/lppl.txt
+-----------------------------------------------------------------
-%</readme>
-%<*internal>
+%</readme>
+%<*internal>
\fi
\def\nameofplainTeX{plain}
\ifx\fmtname\nameofplainTeX\else
- \expandafter\begingroup
+\expandafter\begingroup
\fi
-%</internal>
-%<*install>
-\input docstrip.tex
+%</internal>
+%<*install>
+\input l3docstrip.tex
\keepsilent
\askforoverwritefalse
\preamble
-----------------------------------------------------------------
-erw-l3 Utilities built around expl3
+----------------------------------------------------------------------------
+erw-l3 --- Utilities for LaTeX3 programming
Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
+----------------------------------------------------------------------------
\endpreamble
\postamble
-Copyright (C) 2018 by Erwann Rogard
+Copyright (C) 2018-2020 by Erwann Rogard
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License (LPPL), either
@@ -45,1172 +45,1743 @@ http://www.latex-project.org/lppl.txt
This work is "maintained" (as per LPPL maintenance status) by
Erwann Rogard.
-This work consists of the file erw-l3.dtx
-and the derived files erw-l3.ins,
- erw-l3.pdf and
- erw-l3.sty.
+This work consists of the file erw-l3.dtx and the derived files:
+erw-l3.sty, and erw-l3.pdf.
\endpostamble
\generate{
\file{\jobname.sty}{\from{\jobname.dtx}{package}}
}
-%</install>
-%<install>\endbatchfile
-%<*internal>
+%</install>
+%<install> \endbatchfile
+%<*internal>
\generate{
\file{\jobname.ins}{\from{\jobname.dtx}{install}}
}
\nopreamble\nopostamble
\generate{
- \file{README.txt}{\from{\jobname.dtx}{readme}}
+ \file{README.md}{\from{\jobname.dtx}{readme}}
}
\ifx\fmtname\nameofplainTeX
- \expandafter\endbatchfile
+\expandafter\endbatchfile
\else
- \expandafter\endgroup
+\expandafter\endgroup
\fi
-%</internal>
-%<package>\RequirePackage{expl3}[2018/06/01]
-%<package>\RequirePackage{xparse}[2018/02/01]
-%<package>\RequirePackage{l3keys2e}
-%<package>\ProvidesExplPackage
-%<package> {erw-l3} % Package name
-%<package> {2020/02/05} % Release date
-%<package> {0.1.6} % Release version
-%<package> {Utilities built around expl3} % Description
-%
-%<*driver>
+%</internal>
+%<package> \NeedsTeXFormat{LaTeX2e}[2020/02/02]
+%<package> \RequirePackage{etoolbox}[2019/09/21]
+%<package> \RequirePackage{l3keys2e}[2020/03/06]
+%<package> \RequirePackage{xparse}[2020/03/06]
+%<package> \ProvidesExplPackage
+%<package> {erw-l3} % Package name
+%<package> {2020/06/04} % Release date
+%<package> {3.1} % Release version
+%<package> {erw-l3 --- Utilities for LaTeX3 programming } % Description
+%
+%<*driver>
+\RequirePackage{fvextra}%^^A\NB{done}{Warning:csquotes should be loaded after fvextra->nope}
\documentclass[full]{l3doc}
+\listfiles
+\usepackage[english]{babel}
+\AtBeginDocument{\selectlanguage{english}}
+\usepackage{bookmark}
+\usepackage[T1]{fontenc}
\usepackage{erw-l3}
-\usepackage{float}
+\usepackage{microtype}
+\usepackage{nolbreaks}
\usepackage{tabto}
-\usepackage{cleveref}
-\ExplSyntaxOn
-\tl_gset:Nn \partname {Part}
-\ExplSyntaxOff
+\usepackage{tcolorbox}
+\tcbuselibrary{listings, breakable}
+\usepackage{xparse}
+\usepackage{hyperref}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
-% \AtEndDocument { \PrintChanges \PrintIndex } % TODO
+% ^^A\AtEndDocument { \PrintChanges \PrintIndex }
+\makeatletter
+\newcommand*{\docsetnameref}{\def\@currentlabelname}%https://tex.stackexchange.com/questions/537751
+\makeatother
+\ExplSyntaxOn
+\tl_gset:Nn \partname {Part}
+\newenvironment{docabstract}[1]%https://latex.org/forum/viewtopic.php?t=12156
+{\renewcommand{\abstractname}{#1}\begin{abstract}}
+ {\end{abstract}}
+\cs_new:Nn \__erw_docu:n{\MakeUppercase #1}
+\ProvideDocumentCommand\DocPhantomSection{smmm}
+{
+ \leavevmode
+ \refstepcounter{#2}
+ \IfBooleanT{#1}
+ {
+ \addcontentsline{toc}{#2}{\protect\numberline{\use:c{the#2}}#3}
+ }
+ \docsetnameref{#3}
+ \label{#4}
+}
+\providecommand\docU[1]{\exp_args:Nx \__erw_docu:n{#1}}
+\ExplSyntaxOff
+% ^^A Sort--->
+\providecommand\docarg[1]{\texttt{#1}} % fun[param] (macro) vs fun[arg] (eval)
+\providecommand\docargnoval{\c_novalue_tl}
+\providecommand\docassign[2]{#1~$\leftarrow$~#2}
+\providecommand\docccept[1]{\textit{#1}}
+\providecommand\doccceptargspec{arg~spec}
+\providecommand\doccceptbool{boolean}
+\providecommand\doccceptcont{container}
+\providecommand\doccceptclist{clist}
+\providecommand\doccceptcode{code}
+\providecommand\doccceptcsname{cs name}
+\providecommand\doccceptcsorcode{cs~or~code}
+\providecommand\doccceptcs{cs}
+\providecommand\doccceptempty{empty}
+\providecommand\doccceptgroup{local~group}
+\providecommand\doccceptint{integer}
+\providecommand\doccceptitems{items}
+\providecommand\doccceptkey{key}
+\providecommand\doccceptkvl{keyval~list}
+\providecommand\doccceptopt{option}
+\providecommand\doccceptpath{path}
+\providecommand\doccceptplaceh{placeholder}
+\providecommand\doccceptpre{preamble}
+\providecommand\doccceptprop{prop}
+\providecommand\doccceptsep{separators}
+\providecommand\doccceptseq{seq}
+\providecommand\docccepttlvar{tl~var}
+\providecommand\docccepttl{token~list}
+\providecommand\docccepttok{token}
+\providecommand\doccceptval{val}
+\providecommand\docconv[1]{convention~\autoref{conv:#1}}
+\providecommand\docdefaultfor{default~for~}
+\providecommand\docenvdoc{\env{document}}
+\providecommand\doceval[1]{\texttt{\char`\{}#1\texttt{\char`\}}}
+\providecommand\docexpand[2]{#1~$\rightarrow$~#2}
+\providecommand\docfillblank{\begin{minipage}[t]{\linewidth}\end{minipage}}
+\providecommand\docissuedont{Don't: }
+\providecommand\docissuedo{Do: }
+\providecommand\docissuesymp{Symptom: }
+\providecommand\doclist[1]{Listing~\ref{listing:#1}}
+\providecommand\docnb{\noindent\textbf{NB}:~}
+\providecommand\docoptd[1]{\texttt{\textless}#1\texttt{\textgreater}}
+\providecommand\docopte[2]{\texttt{#1}\doceval{#2}}
+\providecommand\docopto[1]{\texttt{[}#1\texttt{]}}
+\providecommand\docpipe{\textbar}
+\providecommand\doccs[1]{\texttt{\textbackslash{}#1}}
+\providecommand\docreflist[1]{Listing~\ref{listing:#1}}
+\providecommand\docsee{See:~}
+\providecommand\docstep[1]{step~\ref{step:#1}}
+\providecommand\doctip{\noindent\textbf{Tip}:~}
+\providecommand\docvers[2]{v#1.#2}
+\providecommand\docwarn{\noindent\textbf{Warning}:~}
+\providecommand\docxparsed[1][~argument]{`d'-type~#1}
+\providecommand\docxparsee[1][~argument]{`e'-type~#1}
+\providecommand\docxparsem[1][~argument]{`m'-type~#1}
+\providecommand\docxparseo[1][~argument]{`o'-type~#1}
+\providecommand\pkgkey{key$_{i}$}
+\providecommand\pkgobj[1]{object identified by #1}
+\providecommand\pkgoptex{\docarg{Expans}}
+\providecommand\pkgoptfi{\docarg{File}}
+\providecommand\pkgoptin{\docarg{Inner}}
+\providecommand\pkgoptions{kvl0}
+\providecommand\pkgoptou{\docarg{Outer}}
+\providecommand\pkgoptpad{\docarg{Default}}%default
+\providecommand\pkgoptpa{\docarg{Param}}
+\providecommand\pkgoptse{\docarg{Separ}}
+\providecommand\pkgoptwr{\docarg{Write}}
+\providecommand\pkgparap{\texttt{+}}%append
+\providecommand\pkgparex{\texttt{*}}%expand
+\providecommand\pkgparhe{tl$_{1}$}%head
+\providecommand\pkgparin{code$_{1}$}%inner
+\providecommand\pkgparkvlnxt{kvl$_{2}$}
+\providecommand\pkgparkvl{kvl$_{1}$}
+\providecommand\pkgparou{code$_{2}$}%outer
+\providecommand\pkgparpa{tl$_{2}$}%param
+\providecommand\pkgparsiii{tl$_{5}$}
+\providecommand\pkgparsii{tl$_{4}$}
+\providecommand\pkgparsi{tl$_{3}$}
+\providecommand\pkgpars{\Arg{\pkgparsi}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\Arg{\pkgparsiii}}%separ
+\providecommand\pkgparta{tl$_{6}$}%tail
+\providecommand\pkgsep[1]{\Arg{#1}}
+\providecommand\pkgval{val$_{i}$}
+% ^^A Sort<---
\begin{document}
- \DocInput{\jobname.dtx}
+\DocInput{\jobname.dtx}
\end{document}
-%</driver>
+%</driver>
% \fi
-%
+%
% \GetFileInfo{\jobname.sty}
-%
-%
-%\title{^^A
-% \textsf{erw-l3}\thanks{^^A
-% This file describes version \fileversion, last revised \filedate.^^A
-% }^^A
-%}
-%\author{Erwann Rogard\thanks{firstname dot lastname AusTria gmail dot com}}
-%
-%
-%\date{Released \filedate}
-%
-%\maketitle
-%
-%\begin{abstract}\LaTeX3 package defining commands built around \pkg{expl3}\cite{interface3}.
-% For example, \cs{erw_compose} implements the mathematical concept $f_1 \circ f_2 \dots \circ f_n$.
-%\end{abstract}
-%
-% \tableofcontents
-%
-% \section*{Conventions}
-%
-% The naming conventions are (loosely) those of \LaTeX3.
-% For example, \meta{cs} stands for \emph{control sequence}, which is described in \cite[Part~\pkg{l3basics}]{interface3}.
-%
-% \section*{Requirement}
-%
-% Have \file{erw-l3.sty} is in the path of the \LaTeX~engine.
-%
-% \part{Usage}\label{part:usage}
-%
-% In the preamble of \cs{documentclass}, put:
-% \begin{center}
-% \cs{usepackage}\oarg{options}|{|\pkg{erw-l3}|}|\linebreak
-% \end{center}
-%
-% \section{\textsf{compose}}
-%
-% \subsection{\textsf{backend}}
-%
-% \begin{function}{\erw_compose:nV,\erw_compose:nn}
-% \begin{syntax}
-% \cs{erw_compose:nV}\marg{cs list}\meta{var}
-% \end{syntax} Implements the mathematical concept $f_1 \circ f_2 \dots \circ f_n$.
-% See Listing~\autoref{listng:compose}
-% \end{function}
-%
-% \begin{function}{\erw_compose_c:nV,\erw_compose_c:nn}
-% \begin{syntax}
-% \cs{erw_compose_c:nV}\marg{cs names}\meta{var}
-% \end{syntax}
-% See Listing~\autoref{listng:compose:c}
-% \end{function}
-%
-% \begin{function}{\erw_compose_seq:nV}
-% \begin{syntax}
-% \cs{erw_compose_seq:nV}\marg{cs list}\meta{seq}
-% \end{syntax} Same as \cs{erw_compose:nV}, but saves each intermediary step
-% See Listing~\autoref{listng:compose:seq}
-% \end{function}
-%
-% \begin{function}{\erw_compose_seq_c:nV}
-% \begin{syntax}
-% \cs{erw_compose_seq_c:nV}\marg{cs names}\meta{seq}
-% \end{syntax}
-% See Listing~\autoref{listng:compose:seq:c}
-% \end{function}
-%
-% \begin{function}{\erw_compose_vers:nV,\erw_compose_vers:nn}
-% \begin{syntax}
-% \cs{erw_compose_vers:nV}\marg{list of cs or code}\meta{var}
-% \end{syntax}
-% See Listing~\autoref{listng:compose:vers}.
-% Only the |nn| version is implemented
-% \end{function}
-%
-% \begin{function}{\erw_compose_seq_vers:nV,\erw_compose_seq_vers:nn}
-% \begin{syntax}
-% \cs{erw_compose_seq_vers:nV}\marg{list of cs or code}\meta{seq}
-% \end{syntax}
-% {\color{red}Not implemented}
-% \end{function}
-%
-% \section{\textsf{csutil}}
-%
-% \subsection{\textsf{backend}}
-%
-% \begin{function}{\erw_accum:nn}
-% \begin{syntax}{\cs{erw_accum:nn}}\marg{token list}\marg{item}
-% \end{syntax}Expands to a token list comprising the items of \meta{token list} and \meta{item}
-% \end{function}
-%
-% \begin{function}{\erw_apply:Nn, \erw_apply:cn, \erw_apply:Nnn, \erw_apply:Nnnn, \erw_apply:Nnnnn}
-% \begin{syntax}{\cs{erw_apply:Nn}}\meta{cs}\marg{arg}
-% \end{syntax}Expands to \meta{cs}\marg{arg}
-% \end{function}
-%
-% \begin{function}{\erw_cs_set_eq:NN, \erw_cs_set_eq:cN,\erw_cs_gset_eq:NN, \erw_cs_gset_eq:cN}
-% \begin{syntax}{\cs{erw_cs_set_eq:NN}}\meta{cs1}\meta{cs2}
-% \end{syntax}\meta{cs1}\textleftarrow\meta{cs2}
-% \end{function}
-%
-% \begin{function}{\erw_cs_set_inline:Nn, \erw_cs_set_inline:cn,\erw_cs_gset_inline:Nn, \erw_cs_gset_inline:cn}
-% \begin{syntax}{\cs{erw_cs_set_inline:Nn}}\meta{cs}\marg{code}
+% \begin{documentation}
+% \title{The \pkg{erw-l3} package \thanks{^^A
+% This file describes version \fileversion, last revised \filedate.^^A
+% }^^A
+% }
+% \author{Erwann Rogard\thanks{firstname dot lastname AusTria gmail dot com}}
+%
+% \date{Released \filedate}
+%
+% \maketitle
+% \begingroup
+% \selectlanguage{english}
+% \begin{docabstract}{Abstract}
+% Utilities for \LaTeX3 programming\cite{interface3}.
+% \end{docabstract}
+% \endgroup
+%
+% \tableofcontents
+%
+% \part{Usage}\label{part:usage}
+% ^^A \VerbatimFootnotes
+%
+% \DocPhantomSection*{section}{Loading the package}{usage:load}
+% \begin{function}{\usepackage}
+% \begin{syntax}
+% \cs{usepackage}\doceval{\pkg{\jobname}}
% \end{syntax}
-% \end{function}
-%
-% \begin{function}{\erw_identity:n}
-% \begin{syntax}{\cs{erw_identity:n}}\marg{arg}
-% \end{syntax} Expands to \meta{arg}
-% \end{function}
-%
-% \begin{function}{\erw_is_matrix_p:n,\erw_is_matrix:nTF}
-% \begin{syntax}{\cs{erw_is_matrix_p:n}}\marg{token list}
-% \end{syntax} Checks if \meta{token list} is a (square) matrix.
-% \end{function}
-%
-% \begin{function}{\erw_fold:NV, \erw_fold:cV}
-% \begin{syntax}{\cs{erw_fold:NV}}\meta{cs}\meta{var}
-% \end{syntax}\meta{var}\textleftarrow \cs{erw_apply:NV}\meta{cs}\meta{var}.
-% See Listing~\autoref{listng:fold}.
-% \end{function}
-%
-% \begin{function}{\erw_last_item:nn}
-% \begin{syntax}{\cs{erw_last_item:nn}}\marg{int}\marg{token list}
-% \end{syntax} ^^ASee Listing~\autoref{listng:items}
-% \end{function}
-%
-% \begin{function}{\erw_merge:nn}
-% \begin{syntax}{\cs{erw_merge:nn}}\marg{tl 1}\marg{tl 2}
-% \end{syntax}Merges \meta{tl 1}\meta{tl 2}
-% \end{function}
-%
-% \begin{function}{\erw_repeat:nn}
-% \begin{syntax}{\cs{erw_repeat:nn}}\marg{int}\marg{value}
-% \end{syntax}
-% See Listing~\autoref{listng:repeat}
-% \end{function}
-%
-% \begin{function}{\erw_split:nn}
-% \begin{syntax}{\cs{erw_split:nn}}\marg{token list}\marg{delimiter}
-% \end{syntax} See Listing~\autoref{listng:split}
-% \end{function}
-%
-% \section{\textsf{int}}
-%
-% \subsection{\textsf{backend}}
-%
-% \begin{function}{\erw_int_range:nn}
-% \begin{syntax}{\cs{erw_int_range:nn}}\marg{first}{last}
-% \end{syntax} Returns a range of integers. Implementation different than \cs{int_step_inline}
-% \end{function}
-%
-% \begin{function}{\erw_int_range:n}
-% \begin{syntax}{\cs{erw_int_range:n}}\marg{count}
-% \end{syntax} Returns a range of integers. Implementation different than \cs{int_step_inline}. See Listing~\autoref{listng:int:range}
-% \end{function}
-%
-% \section{\textsf{map}}
-%
-% \subsection{\textsf{backend}}
-%
-% \begin{function}{\erw_set_map:N,\erw_gset_map:N}
-% \begin{syntax}{\cs{erw_set_map:N}}\meta{cs}
-% \end{syntax} Sets the function used by \cs{erw_map:n}.
-% \end{function}
-%
-% \begin{function}{\erw_set_map_inline:n,\erw_gset_map_inline:n}
-% \begin{syntax}{\cs{erw_set_map_inline:n}}\marg{code}
-% \end{syntax} Sets the function used by \cs{erw_map:n}.
-% \end{function}
-%
-% \begin{function}{\erw_map:n}
-% \begin{syntax}{\cs{erw_map:n}}\marg{token list}
-% \end{syntax} Applies the stored \meta{cs} to each item in \meta{token list}. An application is \cs{erw_is_matrix}
-% \end{function}
-%
-% \begin{function}{\erw_map:Nn}
-% \begin{syntax}{\cs{erw_map:Nn}}\meta{cs}\marg{token list}
+% \begin{description}
+% \item[Requirement]\docfillblank
+% \begin{enumerate}
+% \item \file{\jobname.sty} and its dependencies are in the path of the \LaTeX~engine. See \autoref{part:other}, \autoref{other:support}.
+% \item Goes in the~\docccept{\doccceptpre}
+% \end{enumerate}
+% \end{description}
+% \end{function}
+%
+% \section{\textsf{cs}}\label{usage:cs}
+% \begin{function}{\erw_cs_compose:NnN}
+% \begin{syntax}
+% \cs{erw_cs_compose:NnN}\meta{\doccceptcs}\Arg{\doccceptitems}\meta{\docccepttlvar}
% \end{syntax}
-% See Listing~\autoref{listng:map}.
-% Redundant with \cs{tl_map_function:nN}
-% \end{function}
-%
-% \begin{function}{\erw_map_inline:nn}
-% \begin{syntax}{\cs{erw_map_inline:nn}}\marg{code}\marg{args}
+% \end{function}
+% \begin{function}{\erw_cs_identity:n}
+% \begin{syntax}
+% \cs{erw_cs_identity:n}\Arg{arg}
% \end{syntax}
-% See Listing~\autoref{listng:mapinl}
-% \end{function}
-%
-% \begin{function}{\erw_map_indexed:Nnn}
-% \begin{syntax}{\cs{erw_map_indexed:Nnn}}\meta{cs}\marg{int}\marg{matrix of tokens}
-% \end{syntax} {\color{red} Not implemented}. See Listing~\autoref{listng:mapindexed}.
-% \end{function}
-%
-% \begin{function}{\erw_map_thread:Nn}
-% \begin{syntax}{\cs{erw_map_thread:Nn}}\meta{cs}\marg{matrix of tokens}
-% \end{syntax} Threads \meta{cs} over the columns, where the arity of \meta{cs} must be equal to the number of rows.
-% See Listing~\autoref{listng:thread}
-% \end{function}
-%
-% \begin{function}{\erw_map_thread_at:Nnn}
-% \begin{syntax}{\cs{erw_map_thread_at:Nnn}}\meta{cs}\marg{matrix of tokens}
-% \end{syntax}
-% \end{function}
-%
-% \section{\textsf{numbrdcs}}
-%
-% \subsection{backend}
-%
-% \begin{function}{\erw_numbrd_cs_reset:}
-% \begin{syntax}\cs{erw_numbrd_cs_reset:}|{}|
-% \end{syntax} See Listing~\ref{listng:numbrdcs:names}
-% \end{function}
-%
-% \begin{function}{ \erw_numbrd_cs_new:n}
-% \begin{syntax}\cs{erw_numbrd_cs_new:n} \marg{cs or code}
-% \end{syntax} Use it as the first arg to \cs{tl_function_map:Nn}
-% \end{function}
-%
-% \begin{function}{ \erw_numbrd_cs:nn}
-% \begin{syntax}\cs{erw_numbrd_cs:nn} \marg{cs or code}
-% \end{syntax}
-% \end{function}
-%
-% \begin{function}{\erw_numbrd_cs_names_braced:nnn}
-% \begin{syntax}\cs{erw_numbrd_cs_names_braced:nnn}\marg{first}\marg{step}\marg{last}
-% \end{syntax}See Listing~\ref{listng:numbrdcs:names}
-% \end{function}
-%
-% \subsection{frontend}
-%
-% \begin{function}{\numbrdcsnew,\numbrdcsnew*}
-% \begin{syntax}\cs{numbrdcsnew}\marg{list of cs or code}
-% \end{syntax} Creates numbered control sequences. The starred version does not reset. See Listing~\ref{listng:numbrdcs}
-% \end{function}
-%
-% \begin{function}{\numbrdcs}
-% \begin{syntax}\cs{numbrdcs}\marg{int}\marg{arg}
-% \end{syntax} Evaluates control sequence numbered \meta{int} with argument \meta{arg}. See Listing~\ref{listng:numbrdcs}
-% \end{function}
-%
-% \clearpage
-%
-% \part{Listings}\label{part:listng}
-%
-% \floatstyle{ruled}
-% \newfloat{Listing}{H}{lop}
-% \NewDocumentCommand{\erwtab}{O{0.5}}{\tabto{#1\linewidth}}
-%
-% \section{compose}
-%
-% \subsection{\textsf{backend}}
-%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\ExplSyntaxOn|\ExplSyntaxOn
-% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\erwtab\cs_set:Npn \__foo #1 {f(#1)}
-% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\erwtab\cs_set:Npn \__bar #1 {g[#1]}
-% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\erwtab\cs_set:Npn \__baz #1 {h\{#1\}}
-% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\erwtab\tl_set:Nn \l_tmpa_tl{X}
-% \\\verb|\erw_compose:nV{|
-% \\\verb| {\__baz}{\__bar}{\__foo}}|
-% \\\verb| \l_tmpa_tl|\erwtab\erw_compose:nV{{\__baz}{\__bar}{\__foo}}\l_tmpa_tl
-% \\\verb|\l_tmpa_tl|\erwtab\l_tmpa_tl
-% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\tl_set:Nn \l_tmpa_tl{X}
-% \\\verb|\erw_compose:nn{|
-% \\\verb| {\__baz}{\__bar}{\__foo}}|
-% \\\verb| {X}|\erwtab\erw_compose:nn{{\__baz}{\__bar}{\__foo}}{X}
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{ }\label{listng:compose}
-% \end{Listing}
-%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\ExplSyntaxOn|\ExplSyntaxOn
-% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
-% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
-% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
-% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\tl_set:Nn \l_tmpa_tl{X}
-% \\\verb|\erw_compose_c:nV{|
-% \\\verb| {__baz}{__bar}{__foo}}|
-% \\\verb| \l_tmpa_tl|\erwtab\erw_compose_c:nV{{__baz}{__bar}{__foo}}\l_tmpa_tl
-% \\\verb|\l_tmpa_tl|\erwtab\l_tmpa_tl
-% \\\verb|\erw_compose_c:nn{|
-% \\\verb| {__baz}{__bar}{__foo}}|
-% \\\verb| {X}|\erwtab\erw_compose_c:nn{{__baz}{__bar}{__foo}}{X}
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{ }\label{listng:compose:c}
-% \end{Listing}
-%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\ExplSyntaxOn|\ExplSyntaxOn
-% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
-% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
-% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
-% \\\verb|\seq_new:N\l_tmp_seq|\erwtab\seq_new:N \l_tmp_seq
-% \\\verb|\seq_put_right:Nn\l_tmp_seq{X}|\erwtab\seq_put_right:Nn \l_tmp_seq{X}
-% \\\verb| \erw_compose_seq:nV{|
-% \\\verb| {\__baz}{\__bar}{\__foo}}|
-% \\\verb| \l_tmp_seq|\erwtab \erw_compose_seq:nV{{\__baz}{\__bar}{\__foo}}\l_tmp_seq
-% \\\verb|\seq_item:Nn\l_tmp_seq{1}|\erwtab \seq_item:Nn \l_tmp_seq{1}
-% \\\verb|\seq_item:Nn\l_tmp_seq{2}|\erwtab \seq_item:Nn \l_tmp_seq{2}
-% \\\verb|\seq_item:Nn\l_tmp_seq{3}|\erwtab \seq_item:Nn \l_tmp_seq{3}
-% \\\verb|\seq_item:Nn\l_tmp_seq{4}|\erwtab \seq_item:Nn \l_tmp_seq{4}
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{}\label{listng:compose:seq}
-% \end{Listing}
-%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\ExplSyntaxOn|\ExplSyntaxOn
-% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
-% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
-% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
-% \\\verb|\seq_new:N\l_tmp_seq|
-% \\\verb|\seq_put_right:Nn\l_tmp_seq{X}|\erwtab\seq_put_right:Nn \l_tmp_seq{X}
-% \\\verb|\erw_compose_seq_c:nV{|
-% \\\verb| {__baz}{__bar}{__foo}}|
-% \\\verb| \l_tmp_seq|\erwtab \erw_compose_seq_c:nV{{__baz}{__bar}{__foo}}\l_tmp_seq
-% \\\verb|\seq_item:Nn\l_tmp_seq{1}|\erwtab \seq_item:Nn \l_tmp_seq{1}
-% \\\verb|\seq_item:Nn\l_tmp_seq{2}|\erwtab \seq_item:Nn \l_tmp_seq{2}
-% \\\verb|\seq_item:Nn\l_tmp_seq{3}|\erwtab \seq_item:Nn \l_tmp_seq{3}
-% \\\verb|\seq_item:Nn\l_tmp_seq{4}|\erwtab \seq_item:Nn \l_tmp_seq{4}
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{}\label{listng:compose:seq:c}
-% \end{Listing}
-%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\ExplSyntaxOn|\ExplSyntaxOn
-% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
-% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
-% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
-% \\\verb|\erw_compose_vers:nn{|
-% \\\verb| {\__baz}{g[#1]}{\__foo}}|
-% \\\verb| {X}|\erwtab\erw_compose_vers:nn{{\__baz}{g[#1]}{\__foo}}{X}
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{}\label{listng:compose:vers}
-% \end{Listing}
-%
-% \section{csutil}
-%
-% \subsection{\textsf{backend}}
-%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\erwtab\cs_set:Npn \__foo #1 {f(#1)}
-% \\\verb|\erw_apply:Nn\__foo{X}|\erwtab\erw_apply:Nn\__foo{X}
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{ }\label{listng:apply}
-% \end{Listing}
-%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
-% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\erwtab\tl_set:Nn \l_tmpa_tl{X}
-% \\\verb|\erw_fold_set_par:n{Nf}|\erw_fold_set_par:n{Nf}
-% \\\verb|\erw_fold_apply_par:n{Nf}|\erw_fold_apply_par:n{Nf}
-% \\\verb|\erw_fold:NV\__foo\l_tmpa_tl|\erwtab\erw_fold:NV\__foo\l_tmpa_tl
-% \\\verb|\l_tmpa_tl|\erwtab\l_tmpa_tl
-% \\\verb|\cs_set:Npn\__bar #1 {g[#1]}|\erwtab\cs_set:Npn \__bar #1 {g[#1]}
-% \\\verb|\erw_fold:cV{__bar}\l_tmpa_tl|\erwtab\erw_fold:cV {__bar}\l_tmpa_tl
-% \\\verb|\l_tmpa_tl|\erwtab\l_tmpa_tl
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{ }\label{listng:fold}
-% \end{Listing}
-%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-% \\\verb|\erw_is_matrix:nTF|
-% \\\verb|{|
-% \\\verb| { {a}{b}{c} }|
-% \\\verb| { {k}{l}{m} }|
-% \\\verb| { {x}{y}{z} }|
-% \\\verb|}{T}{F}|\erwtab\erw_is_matrix:nTF
-% {
-% { {a}{b}{c} }
-% { {k}{l}{m} }
-% { {x}{y}{z} }
-% }{T}{F}
-% \\\verb|\erw_is_matrix:nTF|
-% \\\verb|{|
-% \\\verb| { {a}{c} }|
-% \\\verb| { {k} }|
-% \\\verb| { {x}{y}{z} }|
-% \\\verb|}{T}{F}|\erwtab
-% \erw_is_matrix:nTF
-% {
-% { {a}{c} }
-% { {k} }
-% { {x}{y}{z} }
-% }{T}{F}
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{ }\label{listng:ismatrix}
-% \end{Listing}
-%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-% \\\verb|\erw_repeat:nn|
-% \\\verb| {3}{abracad}abra| \erwtab \erw_repeat:nn{3}{abracad}abra
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{ }\label{listng:repeat}
-% \end{Listing}
-%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-% \\\verb|\erw_split:nn|
-% \\\verb| {{a}{b}{c}}{==}| \erwtab \erw_split:nn{{a}{b}{c}}{==}
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{ }\label{listng:split}
-% \end{Listing}
-%
+% \end{function}
+% \begin{function}{\erw_cs_set_inline:Nn, \erw_cs_set_inline:cn, \erw_cs_gset_inline:Nn, \erw_cs_set_inline:cn}
+% \begin{syntax}
+% \cs{erw_cs_set_inline:Nn}\meta{\doccceptcs}\Arg{\doccceptcode}
+% \end{syntax}
+% \end{function}
+%
+% \section{\textsf{csint}}
+% \begin{function}{\erw_csint:nn}
+% \begin{syntax}
+% \cs{erw_csint:nn}\Arg{\doccceptint}\Arg{arg}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_csint_name:n}
+% \begin{syntax}
+% \cs{erw_csint_name:n}\Arg{\doccceptint}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_csint_names_braced:, \erw_csint_names_braced:n, \erw_csint_names_braced:nnn}
+% \end{function}
+% \begin{function}{\erw_csint_new:n}
+% \begin{syntax}
+% \cs{erw_csint_new:n}\Arg{\doccceptint}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_csint_reset:}
+% \begin{syntax}
+% \cs{erw_csint_reset:}
+% \end{syntax}
+% \end{function}
+%
+% \section{\textsf{int}} \label{usage:int}
+% \begin{function}{\erw_int_range:n, \erw_int_range:nn}
+% \begin{syntax}
+% \cs{erw_int_range:n}\Arg{\doccceptint}
+% \end{syntax}
+% \end{function}
+%
+% \section{\textsf{keys}} \label{usage:keys}
+% \begin{function}{\erw_keyval_parse:NNNn}
+% \begin{syntax}
+% \cs{erw_keyval_parse:NNNn} \meta{\doccceptcont}\meta{\doccceptcs_1}\meta{\doccceptcs_2}\doceval{\doceval{\meta\docccepttl_1}\dots}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_keyval_error:Nn, \erw_keyval_error:Nnn}
+% \begin{syntax}
+% \cs{erw_keyval_error:Nn}\meta{\docccepttok}\Arg{\doccceptkvl}\\
+% \cs{erw_keyval_error:Nnn}\meta{\docccepttok}\Arg{\doccceptclist}
+% \end{syntax}
+% \end{function}
+%
+% \section{\textsf{lambda}} \label{usage:lambda}
+% \begin{function}{\erw_lambda:nnn}
+% \begin{syntax}
+% \cs{erw_lambda:nnn}\meta{\docccepttok}\Arg{\doccceptargspec}\Arg{\doccceptcode}
+% \end{syntax}
+% \end{function}
+%
+% \section{\textsf{option}}\label{usage:option}
+% \begin{function}{\erw_option:n}
+% \begin{syntax}
+% \cs{erw_option:n}\Arg{\doccceptkvl}
+% \end{syntax}
+% \end{function}
+%
+% \DescribeOption{tl / fold_set_par}
+% \DescribeOption{tl / fold_apply_par}
+% \DescribeOption{sys / timestamp_delim}
+%
+% \section{\textsf{prop}}\label{usage:prop}
+% All functions that modify a \meta{\doccceptprop} first create it if not exist.
+%
+% \begin{function}{\erw_prop_keyval_parse:NNNn}
+% \begin{syntax}
+% \cs{erw_prop_keyval_parse:NNNn}\meta{\doccceptprop}\meta{\doccceptcs_1}\meta{\doccceptcs_2}\Arg{\doccceptkvl}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_prop_map_item:NNN}
+% \begin{syntax}
+% \cs{erw_prop_map_item:NNN}\meta{\doccceptcs}\meta{\doccceptprop_1}\meta{\doccceptprop_2}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_prop_to_clist:Nn}
+% \begin{syntax}
+% \cs{erw_prop_to_clist:Nn}\meta{\doccceptprop}\doceval{\meta{\doccceptkey_1},\dots}
+% \end{syntax}
+% \end{function}
+%
+%
+% \section{\textsf{seq}}\label{usage:seq}
+% All functions that modify a \meta{\doccceptseq} first create it if not exists.
+% \begin{function}{\erw_seq_fold:NN,\erw_seq_fold:cN}
+% \begin{syntax}
+% \cs{erw_seq_fold:NN}\Arg{\Arg{\doccceptcs_1}\dots}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_seq_put_right_clist:Nn, \erw_seq_put_right_clist:cn}
+% \begin{syntax}
+% \cs{erw_seq_put_right_clist:Nn}\meta{\doccceptseq}\Arg{\doccceptclist}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_seq_put_right_prop:NNn}
+% \begin{syntax}
+% \cs{erw_seq_put_right_prop:NNn}\meta{\doccceptseq}\meta{\doccceptprop}\Arg{\doccceptclist}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_seq_use:Nn}
+% \begin{syntax}
+% \cs{erw_seq_use:Nn}\meta{\doccceptseq}\Arg{\doccceptitems}
+% \end{syntax}
+% \begin{description}
+% \item[Also see] \cite[Section 8 of \pkg{l3seq}]{interface3}
+% \item[Semantics] \cs{seq_use:Nnnn}\meta{\doccceptseq}\nameref{usage:tl:sep}\Arg{\doccceptitems}
+% \end{description}
+% \end{function}
+%
+% \section{\textsf{sys}}\label{usage:sys}
+% \begin{function}{\erw_sys_jobnametimestamp:nn,\erw_sys_jobnametimestamp:}
+% \begin{syntax}
+% \cs{erw_sys_jobnametimestamp:nn}\doceval{date\docpipe{}time\docpipe{}datetime}\doceval{10\docpipe{}16}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_sys_timestamp:nn,\erw_sys_timestamp:}
+% \begin{syntax}
+% \cs{erw_sys_timestamp:nn}\doceval{date\docpipe{}time\docpipe{}datetime}\doceval{10\docpipe{}16}
+% \end{syntax}
+% \begin{description}
+% \item[Semantics] Timestamp in base 10 or 16
+% \end{description}
+% \end{function}
+% \begin{function}{\erw_sys_timestamp_delimiter:}
+% \begin{syntax}
+% \cs{erw_sys_timestamp_delimiter:}
+% \end{syntax}
+% \end{function}
+%
+% \section{\textsf{tl}}
+% All functions that modify a \meta{\docccepttl} first create it if not exist.
+% \begin{function}{\erw_tl_append_item:nn}
+% \begin{syntax}
+% \cs{erw_tl_append_item:nn}\Arg{arg list}\Arg{arg}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_tl_fold:NN, \erw_tl_fold:cN}
+% \begin{syntax}
+% \cs{erw_tl_fold:NN}\meta{\doccceptcs}\meta{\docccepttlvar}
+% \end{syntax}
+% \end{function}
+% \DocPhantomSection{subsection}{\cs{erw_tl_gset_function:n}}{usage:tl:function}
+% \begin{function}{\erw_tl_gset_function:N, \erw_tl_gset_function:n}
+% \begin{syntax}
+% \cs{erw_tl_gset_function:n}\Arg{\doccceptcode}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_tl_join:nn, \erw_tl_join:nnn, \erw_tl_join:nnnn, \erw_tl_join:nnnnn}
+% \begin{syntax}
+% \cs{erw_tl_join:nn}\Arg{\docccepttl_{1}}\Arg{\docccepttl_{2}}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_tl_last_item:n}
+% \begin{syntax}
+% \cs{erw_tl_last_item:n}\Arg{\docccepttl}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_tl_map:n, \erw_tl_map:Nn}
+% \begin{syntax}
+% \cs{erw_tl_map:n}\Arg{\doccceptitems}
+% \end{syntax}
+% \begin{description}
+% \item[Semantics] Maps over \meta{\doccceptitems} using the internal function set by \nameref{usage:tl:function}
+% \end{description}
+% \end{function}
+% \begin{function}{\erw_tl_map_inline:nn }
+% \begin{syntax}
+% \cs{erw_tl_map_inline:nn}\Arg{\doccceptcode}\Arg{\doccceptitems}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_tl_map_thread:Nn}
+% \begin{syntax}
+% \cs{erw_tl_math_thread:Nn}\meta{\doccceptcs}\doceval{\meta{\doccceptitems}}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_tl_map_thread_at:Nnn}
+% \begin{syntax}
+% \cs{erw_tl_math_thread_at:Nnn}\Arg{\doccceptint{}}\Arg{\docccepttl}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_tl_repeat:nn}
+% \begin{syntax}
+% \cs{erw_tl_repeat:nn}\Arg{\doccceptint{}}\Arg{\docccepttl}
+% \end{syntax}
+% \end{function}
+% \begin{function}{\erw_tl_split:nnn, \erw_tl_split:nn}
+% \begin{syntax}
+% \cs{erw_tl_split:nn}\Arg{\doccceptitems}\Arg{delimiter}
+% \end{syntax}
+% \end{function}
+% \DocPhantomSection{subsection}{\cs{erw_tl_separators:n}}{usage:tl:sep}
+% \begin{function}{\erw_tl_separators:n}
+% \begin{syntax}
+% \cs{erw_tl_separators:n}\Arg{\doccceptitems}
+% \end{syntax}
+% \begin{description}
+% \item[Semantics] According to the count of \meta{\doccceptitems}:
+% \begin{enumerate}[label=\emph{\arabic*)}]
+% \item \Arg{\docccepttl_1}\Arg{\docccepttl_1}\Arg{\docccepttl_1}
+% \item \Arg{\docccepttl_1}\Arg{\docccepttl_2}\Arg{\docccepttl_1\docccepttl_2}
+% \item \Arg{\docccepttl_1}\Arg{\docccepttl_2}\Arg{\docccepttl_3}
+% \end{enumerate}
+% \end{description}
+% \end{function}
+% \clearpage
+%
+% \part{Listing}\label{part:listing}
+%
+% \newtcblisting[auto counter]
+% {listing}[2][]{
+% noparskip,
+% breakable,
+% colback=white,
+% colframe=black,
+% opacitybacktitle=.8,%
+% fonttitle=\bfseries,
+% title={Listing~\thetcbcounter. #1},
+% arc=0pt,
+% outer arc=0pt,
+% boxrule=1pt,
+% listing and text,
+% #2}
+%
+% \section{\textsf{constants}}
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:const}.}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:const, listing and text}
+ \ExplSyntaxOn
+ \seq_const_from_clist:Nn \foo_seq{ A, B, C }
+ \prop_const_from_keyval:Nn \foo_prop{ A = a, B = b, C = c }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \section{\textsf{cs}}
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:cs:compose}. }
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:cs:compose, listing and text}
+ \ExplSyntaxOn
+ \cs_set:Nn \__foo:n { f(#1) }
+ \cs_set:Nn \__bar:n { g[#1] }
+ \cs_set:Nn \__baz:n { h\{#1\} }
+ \tl_set:Nn \l_tmpa_tl{ X }
+ \erw_cs_compose:NnN \erw_tl_fold:NN{ {\__baz:n}{\__bar:n}{\__foo:n} }\l_tmpa_tl
+ \tl_use:N \l_tmpa_tl
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:cs:compose:c}. }
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:cs:compose:c, listing and text}
+ \ExplSyntaxOn
+ \tl_map_function:nN { {f(#1)} {g[#1]} {h\{#1\}} }\erw_csint_new:n
+ \tl_set:Nn \l_tmpa_tl{X}
+ \exp_args:NNx
+ \erw_cs_compose:NnN \erw_tl_fold:cN
+ {\erw_csint_names_braced:nnn{ 1 }{ 1 }{ 3 }}
+ \l_tmpa_tl
+ \tl_use:N \l_tmpa_tl
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \section{\textsf{csint}}
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:csint}.}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:csint, listing and text}
+ \ExplSyntaxOn
+ \cs_set:Nn\__foo:n{ f(#1) }
+ \cs_set:Nn\__baz:n{ h\{#1\} }
+ \tl_map_function:nN { {\__foo:n} {g[#1]} {\__baz:n} }\erw_csint_new:n
+ \erw_csint:nn{1}{X},\
+ \erw_csint:nn{2}{X},\
+ \erw_csint:nn{3}{X}.
+ \erw_csint_reset:
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
% \section{\textsf{int}}
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:int:range}.}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:int:range, listing and text}
+ \ExplSyntaxOn
+ \erw_int_range:nn{ 2 }{ 5 }\\
+ \erw_int_range:n{ 5 }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \section{\textsf{lambda}}
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:lambda}.}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:lambda, listing and text}
+ \ExplSyntaxOn
+ \tl_set:Nn \l_tmpa_tl
+ {
+ \erw_lambda:nnn \DeclareDocumentCommand{ m }{ Hello,~#1! }
+ }
+ \l_tmpa_tl{ world }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \section{\textsf{prop}}
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:prop:map}.}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:prop:map, listing and text}
+ \ExplSyntaxOn
+ \erw_prop_map_item:NNN \prop_put:Nnx \baz_prop \foo_prop
+ \prop_if_exist:NTF\baz_prop{T}{F}\\
+ \prop_item:Nn \baz_prop{ A }
+ ,\prop_item:Nn \baz_prop{ B }
+ ,\prop_item:Nn \baz_prop{ C }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:prop:put:keyval}.}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:prop:put:keyval, listing and text}
+ \ExplSyntaxOn
+ \erw_prop_keyval_parse:NNNn
+ \foo_prop
+ \erw_keyval_error:Nn
+ \prop_put:Nnn{ X = x, Y = y, Z = z}
+ \prop_item:Nn \foo_prop{ X }
+ ,\prop_item:Nn \foo_prop{ Y }
+ ,\prop_item:Nn \foo_prop{ Z }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \phantomsection\addcontentsline{toc}{subsection}{\ref{listing:prop:clist}.}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:prop:clist, listing and text}
+ \ExplSyntaxOn
+ \erw_prop_to_clist:Nn \foo_prop{ A, B, C }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \section{\textsf{seq}}
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:seq:fold}.}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:seq:fold, listing and text}
+ \ExplSyntaxOn
+ \cs_set:Nn \__foo:n { f(#1) }
+ \cs_set:Nn \__bar:n { g[#1] }
+ \cs_set:Nn \__baz:n { h\{#1\} }
+ \seq_new:N \l_tmp_seq
+ \seq_put_right:Nn \l_tmp_seq{X}
+ \erw_cs_compose:NnN \erw_seq_fold:NN{ {\__baz:n}{\__bar:n}{\__foo:n} }\l_tmp_seq
+ \seq_item:Nn \l_tmp_seq{ 1 }\\
+ \seq_item:Nn \l_tmp_seq{ 2 }\\
+ \seq_item:Nn \l_tmp_seq{ 3 }\\
+ \seq_item:Nn \l_tmp_seq{ 4 }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:seq:fold:c}. }
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:seq:fold:c, listing and text}
+ \ExplSyntaxOn
+ \cs_set:Nn \__foo:n { f(#1) }
+ \cs_set:Nn \__bar:n { g[#1] }
+ \cs_set:Nn \__baz:n { h\{#1\} }
+ \seq_put_right:Nn \l_tmpa_seq{X}
+ \erw_cs_compose:NnN \erw_seq_fold:cN{ {__baz:n}{__bar:n}{__foo:n} }\l_tmpa_seq
+ \seq_item:Nn \l_tmpa_seq{ 1 }\\
+ \seq_item:Nn \l_tmpa_seq{ 2 }\\
+ \seq_item:Nn \l_tmpa_seq{ 3 }\\
+ \seq_item:Nn \l_tmpa_seq{ 4 }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:seq:prop}.}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:seq:prop, listing and text}
+ \ExplSyntaxOn
+ \erw_seq_put_right_prop:NNn \bar_seq\foo_prop{ A, B, C }
+ \seq_use:Nn\bar_seq{,}
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:seq:use}. }
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:seq:use, listing and text}
+ \ExplSyntaxOn
+ \seq_put_right:Nn\l_tmpa_seq{ A }
+ \seq_put_right:Nn\l_tmpa_seq{ B }
+ \erw_seq_use:Nn \l_tmpa_seq{ {~and~} }\\
+ \erw_seq_use:Nn \l_tmpa_seq{ {,\ }{~and~} }\\
+ \erw_seq_use:Nn \l_tmpa_seq{ {~and~}{,\ }{,~and~} }\\[1em]
+ \seq_put_right:Nn\l_tmpa_seq{ C }
+ \erw_seq_use:Nn \l_tmpa_seq{ {~and~} }\\
+ \erw_seq_use:Nn \l_tmpa_seq{ {,\ }{and~} }\\
+ \erw_seq_use:Nn \l_tmpa_seq{ {~and~}{,\ }{,~and~} }\\
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \section{\textsf{sys}}
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:sys:alone}.}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:sys:alone, listing and text}
+ \ExplSyntaxOn
+ \noindent\erw_sys_timestamp:nn{date}{10}{-}
+ \noindent\erw_sys_timestamp:nn{time}{10}\\
+ \noindent\erw_sys_timestamp:nn{datetime}{10}\\
+ \erw_sys_timestamp:nn{date}{16}{\%}
+ \erw_sys_timestamp:nn{time}{16}\\
+ \erw_option:n{ sys / timestamp_delim = {\%} }
+ \erw_sys_timestamp:nn{datetime}{16}\\
+ \erw_sys_jobnametimestamp:
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:sys:iow}.}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:sys:iow, listing and text}
+ \ExplSyntaxOn
+ \erw_option:n{ sys / timestamp_delim = \c_empty_tl }
+ \iow_new:N \foo_iow
+ \tl_set:Nx \foo_dec { \erw_sys_timestamp:nn{datetime}{10} }
+ \tl_set:Nx \foo_hex { \erw_sys_timestamp: }
+ \iow_open:Nn \foo_iow{ \foo_hex }
+ \iow_now:Nn\foo_iow{ Hello,\ world! }
+ \iow_close:N \foo_iow
+ D:\foo_dec\\
+ \file_timestamp:n{ \foo_hex }\\
+ \file_input:n{ \foo_hex }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \section{\textsf{tl}}
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:tl:fold}. }
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:tl:fold, listing and text}
+ \ExplSyntaxOn
+ \cs_set:Nn \__foo:n { f(#1) }
+ \tl_set:Nn \l_tmpa_tl{ X }
+ \erw_tl_fold:NN\__foo:n\l_tmpa_tl
+ \l_tmpa_tl\\
+ \cs_set:Nn \__bar:n { g[#1] }
+ \erw_tl_fold:cN {__bar:n}\l_tmpa_tl
+ \l_tmpa_tl
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:tl:repeat}. }
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:tl:repeat, listing and text}
+ \ExplSyntaxOn
+ \erw_tl_repeat:nn{ 3 }{ x }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:tl:split}. }
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:tl:split, listing and text}
+ \ExplSyntaxOn
+ \erw_tl_split:nn{ {a} {b} {c} }{ == }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:tl:map}.}
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:tl:map, listing and text}
+ \ExplSyntaxOn
+ \cs_set:Nn \__foo:n { (#1) }
+ \erw_tl_map:Nn \__foo:n{ {a}{b}{c} }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:tl:map:thread}. }
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:tl:map:thread, listing and text}
+ \ExplSyntaxOn
+ \cs_set:Nn \__foo:n { (#1) }
+ \erw_tl_map_thread:Nn \__foo:n
+ {
+ { {a}{b}{c}{d}{e}{f} }
+ }\\
+ \cs_set:Nn\__foo:nn { (#1+#2) }
+ \erw_tl_map_thread:Nn \__foo:nn
+ {
+ { {a}{b}{c}{d}{e}{f} }
+ { {A}{B}{C}{D}{E}{F} }
+ }\\
+ \cs_set:Nn \__foo:nnn { (#1+#2+#3) }
+ \erw_tl_map_thread:Nn \__foo:nnn
+ {
+ { {a}{b}{c}{d}{e}{f} }
+ { {A}{B}{C}{D}{E}{F} }
+ { {k}{l}{m}{n}{o}{p} }
+ }\\
+ \cs_set:Nn \__foo:nnnn { (#1+#2+#3+#4) }
+ \erw_tl_map_thread:Nn \__foo:nnnn
+ {
+ { {a}{b}{c}{d}{e}{f} }
+ { {A}{B}{C}{D}{E}{F} }
+ { {k}{l}{m}{n}{o}{p} }
+ { {K}{L}{M}{N}{O}{P} }
+ }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+% \phantomsection\addcontentsline{toc}{subsection}
+% {\ref{listing:tl:map:thread:at}. }
+% \iffalse
+%<*guardlisting>
+% \fi
+\begin{listing}[]
+ {label=listing:tl:map:thread:at, listing and text}
+ \ExplSyntaxOn
+ \cs_set:Nn\__foo:nn { (#1+#2) }
+ \erw_tl_map_thread_at:Nnn \__foo:nn{ 2 }
+ {
+ { {a}{b}{c}{d}{e}{f} }
+ { {A}{B}{C}{D}{E}{F} }
+ }
+ \ExplSyntaxOff
+\end{listing}
+% \iffalse
+%</guardlisting>
+% \fi
+%
+% \clearpage
+% \part{Other}\label{part:other}
+%
+% \section{Acknowledgment}\label{other:acknowl}
+%
+% This work has benefited from Q\&A's from the \LaTeX community\cite{user-erw}. \nameref{usage:lambda} originally appeared in \cite{a-188053}.
+%
+% \section{Install}\label{other:install}
+% \begin{enumerate}[label=\emph{\arabic*)}]
+% \item Compile \file{\jobname.dtx} (under Unix, \texttt{\$tex timestamp.dtx})
+% \item Put the generated \file{\jobname.sty} in the search path of the \LaTeX engine
+% \end{enumerate}
+%
+% \section{Support}\label{other:support}
+%
+% This package is available from \url{https://www.ctan.org/pkg/\jobname} and \url{https://github.com/rogard/\jobname}.
+%
+% \subsection{Platform}
+% \begin{enumerate}[label=\emph{\roman*)}]
+% \item
+% ^^A uname -a
+% \begin{Verbatim}[breaklines=true]
+% Linux laptop 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
+% \end{Verbatim}
+% \label{plat:lin}
+% \end{enumerate}
+%
+% \subsection{Engine}
+% \begin{enumerate}[label=\emph{\alph*)}]
+% \item
+% \begin{Verbatim}[breaklines=true]
+% pdfTeX 3.14159265-2.6-1.40.20 (TeX Live 2019)
+% \end{Verbatim}
+% \label{eng:tlxviiii:pdf}
+% \item
+% \begin{Verbatim}[breaklines=true]
+% pdfTeX 3.14159265-2.6-1.40.21 (TeX Live 2020)
+% \end{Verbatim}
+% \label{eng:tlxx:pdf}
+% \item
+% \begin{Verbatim}[breaklines=true]
+% LuaHBTeX, Version 1.12.0 (TeX Live 2020)
+% \end{Verbatim}
+% \label{eng:tlxx:lua}
+% \item
+% \begin{Verbatim}[breaklines=true]
+% XeTeX 3.14159265-2.6-0.999992 (TeX Live 2020)
+% \end{Verbatim}
+% \label{eng:tlxx:xe}
+% \end{enumerate}
+%
+% \subsection{Results}
+%
+% \begin{enumerate}[label=\emph{\arabic*)}]
+% \item \pkg{\jobname} \docvers{2}{0} compiles satisfactorily on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf}, \ref{eng:tlxx:lua}, and \ref{eng:tlxx:xe}
+% \end{enumerate}
+%
+% \DocPhantomSection*{section}{References}{other:bib}
+% \begin{thebibliography}{1}
+% \bibitem{interface3} The \LaTeX3 Project Team {\em The \LaTeX3 interfaces}, 2019,
+% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}
+% \bibitem{l3build} The \LaTeX3 Project Team {\em The \pkg{l3build} package}, 2020,
+% \url{http://mirror.utexas.edu/ctan/macros/latex/contrib/l3build/l3build.pdf}
+% \bibitem{a-188053} \href{https://tex.stackexchange.com/users/17423/sean-allred}{@{}sean-allred}'s answer to
+% ``How to create lambda expressions?'', \url{https://tex.stackexchange.com/a/188053/112708}
+% \bibitem{user-erw} \url{https://tex.stackexchange.com/users/112708/erwann?tab=questions}
+% \end{thebibliography}
%
-% \subsection{\textsf{backend}}
-%
-% \begin{Listing}
-% \verb|\ExplSyntaxOn|\ExplSyntaxOn
-% \\\verb|\erw_int_range:nn{2}{5}|\erwtab\erw_int_range:nn{2}{5}
-% \\\verb|\erw_int_range:n{5}|\erwtab\erw_int_range:n{5}
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{ }\label{listng:int:range}
-% \end{Listing}
-%
-% \section{\textsf{map}}
-%
-% \subsection{\textsf{backend}}
+% \section{To do}
%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-% \\\verb|\cs_set:Npn \__foo #1 {(#1)}|\cs_set:Npn \__foo #1 {(#1)}
-% \\\verb|\erw_map:Nn \__foo{{a}{b}{c}}|\erwtab\erw_map:Nn \__foo{{a}{b}{c}}
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{ }\label{listng:map}
-% \end{Listing}
+% \begin{enumerate}[label=\emph{\alph*)}]
+% \item Regression testing using \cite[Section 3.2—Specifying expectations]{l3build}. \label{todo:regtest}
+% \end{enumerate}
+% Also see:
+% \begin{enumerate}[label=\emph{\alph*)}]
+% \setcounter{enumi}{1}
+% \item \env{NOTE} or \cs{NB} tagged \texttt{abandon\docpipe{}done\docpipe{}todo} inside \jobname|.dtx|
+% \end{enumerate}
%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-% \\\verb|\cs_set:Npn \__foo #1 {(#1)}|\cs_set:Npn \__foo #1 {(#1)}
-% \\\verb|\erw_map_inline:nn{|
-% \\\verb| (#1)}{{a}{b}{c}}| \erwtab\erw_map_inline:nn{(#1)}{{a}{b}{c}}
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{ }\label{listng:mapinl}
-% \end{Listing}
-%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\ExplSyntaxOn|\ExplSyntaxOn
-% \\\verb|\cs_set:Npn \__foo:n #1 {(#1)}|\cs_set:Npn \__foo:n #1 {(#1)}
-% \\\verb|\erw_map_thread:Nn \__foo:n|
-% \\\verb|{|
-% \\\verb| {{a}{b}{c}{d}{e}{f}}|
-% \\\verb|}|\erwtab\erw_map_thread:Nn \__foo:n
-% {
-% {{a}{b}{c}{d}{e}{f}}
-% }
-% \\\verb|\cs_set:Npn \__foo:nn #1 #2|
-% \\\verb| {(#1+#2)}|\cs_set:Npn \__foo:nn #1 #2 {(#1+#2)}
-% \\\verb|\erw_map_thread:Nn \__foo:nn|
-% \\\verb|{|
-% \\\verb| {{a}{b}{c}{d}{e}{f}}|
-% \\\verb| {{A}{B}{C}{D}{E}{F}}|
-% \\\verb|}|\erwtab\erw_map_thread:Nn \__foo:nn
-% {
-% {{a}{b}{c}{d}{e}{f}}
-% {{A}{B}{C}{D}{E}{F}}
+% \changes{\docvers{1}{1}}{2018/05/23}{Brought all the modules under one file; renamed \pkg{l3erw} to \pkg{erw-l3};}
+% \changes{\docvers{1}{1}}{2018/05/23}{\cs{numbrdcsnew} changed to \cs{newnumbrdcs} and made 'disambiguable'}
+% \changes{\docvers{1}{1}}{2018/05/23}{\pkg{disambig}/backend: changes to the key, added \cs{ProcessPackageKeysOption};}
+% \changes{\docvers{1}{2}}{2018/06/21}{Add: \cs{erw_items_to}}
+% \changes{\docvers{1}{2}}{2018/06/21}{Add: \cs{erw_last_item}}
+% \changes{\docvers{1}{2}}{2018/06/21}{Add: \cs{erw_repeat}}
+% \changes{\docvers{1}{2}}{2018/06/21}{Add: \cs{erw_split}}
+% \changes{\docvers{1}{2}}{2018/06/21}{Add: \cs{map_thread}}
+% \changes{\docvers{1}{2}}{2018/06/21}{Front end cmds no longer generated with module \pkg{disambig}; Option of the same name deleted;}
+% \changes{\docvers{1}{2}}{2018/06/21}{Rearrange: the doc to clearly separate frontend from backend}
+% \changes{\docvers{1}{2}}{2018/06/21}{Modify: \cs{erw_compose}, order in which functions composed ($g\circ f$ means $f$ comes before $g$)}
+% \changes{\docvers{1}{2}}{2018/06/21}{\pkg{disambig}: pushed the code inside \cs{keys_define};}
+% \changes{\docvers{1}{2}}{2018/06/21}{\pkg{disambig}: \cs{disambignewcmd} no longer takes a token name as arg, rather a token.}
+% \changes{\docvers{1}{3}}{2018/06/22}{Replace: versioning, should have been 0.1.2}
+% \changes{\docvers{1}{4}}{2018/06/22}{Add: \cs{erw_accum}}
+% \changes{\docvers{1}{4}}{2018/06/22}{Add: \cs{erw_int_range}}
+% \changes{\docvers{1}{4}}{2018/06/22}{Add: \cs{erw_is_matrix} (to check arg of \cs{erw_tl_map_thread:Nn})}
+% \changes{\docvers{1}{4}}{2018/06/22}{Add: \cs{erw_merge}}
+% \changes{\docvers{1}{4}}{2018/06/22}{Add: \cs{erw_set_map_inline}}
+% \changes{\docvers{1}{4}}{2018/06/22}{Add: \cs{erw_set_map}}
+% \changes{\docvers{1}{4}}{2018/06/22}{Remove: \doccs{erw_items_to} (redundant with \cs{tl_range:nnn})}
+% \changes{\docvers{1}{5}}{2019/12/12}{Modify: source repository}
+% \changes{\docvers{1}{5}}{2019/12/12}{Rearrange: frontend/backend sections}
+% \changes{\docvers{1}{5}}{2019/12/12}{Remove: \pkg{disambig}}
+% \changes{\docvers{1}{5}}{2019/12/12}{Split Section Preliminaries into Conventions and Requirement.}
+% \changes{\docvers{1}{6}}{2020/02/05}{Fix: critical bug preventing \pkg{erw-l3} from working without explicit inclusion of \pkg{expl3}}
+% \changes{\docvers{1}{7}}{2020/04/24}{Add: \nameref{impl:option}}
+% \changes{\docvers{1}{7}}{2020/04/24}{Add: \nameref{impl:sys}}
+% \changes{\docvers{1}{7}}{2020/04/24}{Move: \cs{erw_fold_apply_par:n}}
+% \changes{\docvers{1}{7}}{2020/04/24}{Move: \cs{erw_fold_set_par:n}}
+% \changes{\docvers{1}{7}}{2020/04/24}{(deleted)}
+% \changes{\docvers{1}{7}}{2020/04/24}{Remove: \doccs{numbrdcsnew}, \doccs{numbrdcs}}
+% \changes{\docvers{1}{7}}{2020/04/24}{Rename: variables with suffix |tl| get 'private mode' prexif in pl. of |\__erw| }
+% \changes{\docvers{1}{7}}{2020/04/24}{Rename: |csnum| to |csint| }
+% \changes{\docvers{1}{7}}{2020/04/24}{Rename: |numbrd_cs| to |csnum| }
+% \changes{\docvers{1}{7}}{2020/04/24}{Replace: listing's implem with that of \pkg{tocloft}}
+% \changes{\docvers{1}{7}}{2020/04/24}{Replace: vers. numb. from 3 to 2 digits}
+% \changes{\docvers{1}{8}}{2020/04/24}{Add: \env{function} for all frontend functions.}
+% \changes{\docvers{1}{8}}{2020/04/30}{Remove: \doccs{erw_cs_set_eq:NN} and variants}
+% \changes{\docvers{1}{8}}{2020/04/30}{Remove: \doccs{erw_is_matrix:n} (predicate must be expandable)}
+% \changes{\docvers{1}{8}}{2020/04/30}{Rename: all cs prefixes to agree with heading under which they come, e.g. \cs{erw_identity:n} by \cs{erw_cs_identity:n} }
+% \changes{\docvers{1}{8}}{2020/04/30}{(deleted)}
+% \changes{\docvers{1}{8}}{2020/04/30}{Replace: \cs{erw_seq_fold:NN} by \cs{erw_oper_fold_seq:NN} and likewise for variants}
+% \changes{\docvers{1}{8}}{2020/04/30}{(deleted)}
+% \changes{\docvers{1}{9}}{2020/05/01}{Add: \cs{erw_sys_timestamp_delimiter:}}
+% \changes{\docvers{1}{9}}{2020/05/01}{Add: \cs{erw_tl_join:nn} and variants}
+% \changes{\docvers{1}{9}}{2020/05/01}{Rename: \cs{erw_append_arg:nn} to \cs{erw_tl_append_item:nn}}
+% \changes{\docvers{1}{9}}{2020/05/01}{Rename: \cs{erw_oper_gset_function:N} to \cs{erw_tl_gset_function:N} (and variants)}
+% \changes{\docvers{1}{9}}{2020/05/01}{Rename: prefix |timestamp| by |sys|}
+% \changes{\docvers{2}{0}}{2020/05/01}{Add: \cs{erw_jobnametimestamp:nn} and variants}
+% \changes{\docvers{2}{0}}{2020/05/01}{Remove: \doccs{merge:nn} (redundant with \cs{erw_join:nn})}
+% \changes{\docvers{2}{0}}{2020/05/01}{Rename: \docvers{0}{0} to \docvers{1}{0}, etc.}
+% \changes{\docvers{2}{1}}{2020/05/09}{Add: \cs{erw_prop_to_clist:Nn}, \cs{erw_prop_put:NN}, and \cs{erw_prop_put:Nnn}}
+% \changes{\docvers{2}{1}}{2020/05/09}{Add: \cs{erw_seq_from_clist:Nn}, \cs{erw_seq_from_prop:NNn}, and \cs{erw_seq_put_right:Nn}}
+% \changes{\docvers{2}{1}}{2020/05/09}{(delete)}
+% \changes{\docvers{2}{1}}{2020/05/09}{Replace: \cs{erw_seq_fold:NN} by \cs{__erw_seq_fold:NN}}
+% \changes{\docvers{2}{2}}{2020/05/18}{Add: \cs{erw_seq_use:Nn}}
+% \changes{\docvers{2}{2}}{2020/05/18}{Add: \cs{erw_tl_separators:n}}
+% \changes{\docvers{2}{3}}{2020/05/20}{Add: \cs{msg_new:nnn}\doceval{erw}\doceval{csnset}}
+% \changes{\docvers{2}{3}}{2020/05/20}{Add: \cs{msg_new:nnn}\doceval{erw}\doceval{keyval/\dots}}
+% \changes{\docvers{2}{3}}{2020/05/20}{Fix: 'mark as private code' (hiherto unnoticed)}
+% \changes{\docvers{2}{3}}{2020/05/20}{Modify: behavior of \cs{erw_seq_use:Nn}}
+% \changes{\docvers{2}{3}}{2020/05/20}{Move: all \cs{msg_new:Nnnn} statements under same heading}
+% \changes{\docvers{2}{4}}{2020/05/21}{Add: \cs{erw_lambda:nnn}}
+% \changes{\docvers{2}{5}}{2020/05/22}{Add: \cs{erw_prop_put_keyval:Nn}}
+% \changes{\docvers{2}{6}}{2020/05/22}{Add: \cs{erw_keyval_parse:NNNn}}
+% \changes{\docvers{2}{6}}{2020/05/23}{Add: \cs{erw_cs_error:nn}}
+% \changes{\docvers{2}{6}}{2020/05/23}{Add: \cs{erw_cs_error:n}}
+% \changes{\docvers{2}{6}}{2020/05/23}{Add: \cs{erw_prop_keyval_parse:NNNn}}
+% \changes{\docvers{2}{6}}{2020/05/23}{Add: \cs{erw_prop_map_item:NNN} }
+% \changes{\docvers{2}{6}}{2020/05/23}{Add: \cs{msg_new:nnn}\doceval{erw}\doceval{varnset}}
+% \changes{\docvers{2}{6}}{2020/05/23}{Remove: \doccs{erw_cs_apply}}
+% \changes{\docvers{2}{6}}{2020/05/23}{Remove: \doccs{erw_prop_put:NN} }
+% \changes{\docvers{2}{6}}{2020/05/23}{Remove: \doccs{erw_prop_put_keyval:Nn} }
+% \changes{\docvers{2}{6}}{2020/05/23}{Remove: \cs{msg_new:nnn}, module \texttt{erw}, messages: \texttt{keyval/\dots}}
+% \changes{\docvers{2}{6}}{2020/05/23}{Rename: \textsf{basics} to \nameref{usage:cs}}
+% \changes{\docvers{2}{6}}{2020/05/23}{Replace: \cs{erw_seq_from_clist} by \cs{erw_seq_put_right_clist}}
+% \changes{\docvers{2}{6}}{2020/05/23}{Replace: \cs{erw_seq_from_prop} by \cs{erw_seq_put_right_prop}}
+% \changes{\docvers{2}{7}}{2020/05/23}{Remove: \doccs{erw_cs_error:n} }
+% \changes{\docvers{2}{7}}{2020/05/23}{Remove: \doccs{erw_cs_error:nn} }
+% \changes{\docvers{2}{7}}{2020/05/23}{Add: \cs{erw_keyval_error:Nn} }
+% \changes{\docvers{2}{7}}{2020/05/23}{Add: \cs{erw_keyval_error:Nnn} }
+% \changes{\docvers{2}{8}}{2020/05/24}{Add: \cs{msg_new:nnn}\doceval{erw}\doceval{notset}}
+% \changes{\docvers{2}{8}}{2020/05/24}{Remove: \cs{msg_new:nnn}\doceval{erw}\doceval{csnset}}
+% \changes{\docvers{2}{8}}{2020/05/24}{Remove: \cs{msg_new:nnn}\doceval{erw}\doceval{varnset}}
+% \changes{\docvers{2}{9}}{2020/05/27}{Add: \cs{erw_seq_fold:NN}, \cs{erw_seq_fold:cN}}
+% \changes{\docvers{2}{9}}{2020/05/27}{Add: \cs{erw_cs_compose:NnN}}
+% \changes{\docvers{2}{9}}{2020/05/27}{Remove: \doccs{erw_seq_compose:nN},\doccs{erw_seq_compose_c:nN},\doccs{erw_seq_compose_vers:nN}}
+% \changes{\docvers{2}{9}}{2020/05/27}{Remove:
+% \doccs{erw_tl_compose:nN},
+% \doccs{erw_tl_compose:Nnn},
+% \doccs{erw_tl_compose:nn},
+% \doccs{erw_tl_compose_c:nN},
+% \doccs{erw_tl_compose_c:nn},
+% \doccs{erw_tl_compose_vers:nN},
+% \doccs{erw_tl_compose_vers:nn}
% }
-% \\\verb|\cs_set:Npn \__foo:nnn|
-% \\\verb| #1 #2 #3 |
-% \\\verb| {(#1+#2+#3)}|\cs_set:Npn \__foo:nnn #1 #2 #3 {(#1+#2+#3)}
-% \\\verb|\erw_map_thread:Nn \__foo:nnn|
-% \\\verb|{|
-% \\\verb| {{a}{b}{c}{d}{e}{f}}|
-% \\\verb| {{A}{B}{C}{D}{E}{F}}|
-% \\\verb| {{k}{l}{m}{n}{o}{p}}|
-% \\\verb|}|\erwtab[0.3]\erw_map_thread:Nn \__foo:nnn
-% {
-% {{a}{b}{c}{d}{e}{f}}
-% {{A}{B}{C}{D}{E}{F}}
-% {{k}{l}{m}{n}{o}{p}}
-% }
-% \\\verb|\cs_set:Npn \__foo:nnnn|
-% \\\verb| #1 #2 #3 #4 |
-% \\\verb| {(#1+#2+#3+#4)}|\cs_set:Npn \__foo:nnnn #1 #2 #3 #4 {(#1+#2+#3+#4)}
-% \\\verb|\erw_map_thread:Nn \__foo:nnnn|
-% \\\verb|{|
-% \\\verb| {{a}{b}{c}{d}{e}{f}}|
-% \\\verb| {{A}{B}{C}{D}{E}{F}}|
-% \\\verb| {{k}{l}{m}{n}{o}{p}}|
-% \\\verb| {{K}{L}{M}{N}{O}{P}}|
-% \\\verb|}|\erwtab[0.1]\erw_map_thread:Nn \__foo:nnnn
-% {
-% {{a}{b}{c}{d}{e}{f}}
-% {{A}{B}{C}{D}{E}{F}}
-% {{k}{l}{m}{n}{o}{p}}
-% {{K}{L}{M}{N}{O}{P}}
+% \changes{\docvers{2}{9}}{2020/05/27}{Rename: \texttt{oper / fold_set_par} to \texttt{tl / fold_set_par} }
+% \changes{\docvers{2}{9}}{2020/05/27}{Rename: \texttt{oper / fold_apply_par} to \texttt{tl / fold_apply_par} }
+% \changes{\docvers{3}{0}}{2020/06/03}{Fix: warning \pkg{csquotes}+\pkg{fvextra} }
+% \changes{\docvers{3}{1}}{2020/06/04}{Miscellaneous}
+% \PrintChanges
+% \PrintIndex
+% \clearpage
+% \StopEventually{
+% ^^A \PrintChanges
+% ^^A \PrintIndex
% }
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{ }\label{listng:thread}
-% \end{Listing}
-%
-% \begin{Listing}
-% \verb|\ExplSyntaxOn|\ExplSyntaxOn
-% \\\verb|\cs_set_protected:Npn \__foo:nn #1 #2|
-% \\\verb| {(#1+#2)}| \cs_set_protected:Npn \__foo:nn #1 #2 {(#1+#2)}
-% \\\verb|\erw_map_thread:Nn|
-% \\\verb| \__foo:nn |
-% \\\verb| { |
-% \\\verb| {{1}{2}{3}} |
-% \\\verb| {{a}{b}{c}}|
-% \\\verb| }|\erwtab\erw_map_thread:Nn
-% \__foo:nn
-% {
-% {{1}{2}{3}}
-% {{a}{b}{c}}
-% }
-% \\\verb|\exp_last_unbraced:Nx|
-% \\\verb|\erw_map_thread:Nn|
-% \\\verb|{|
-% \\\verb| \__foo:nn |
-% \\\verb| { |
-% \\\verb| {\erw_int_range:n{3}} |
-% \\\verb| {{a}{b}{c}}|
-% \\\verb| }|
-% \\\verb|}| \erwtab
-% \exp_last_unbraced:Nx
-% \erw_map_thread:Nn
-% {
-% \__foo:nn
-% {
-% {\erw_int_range:n{3}}
-% {{a}{b}{c}}
-% }
-% }\erwtab[0.7]{\color{red} (does~not~thread!)}
-% \\\verb|\exp_last_unbraced:Nx|
-% \\\verb|\erw_map_thread:Nn|
-% \\\verb|{|
-% \\\verb| \__foo:nn |
-% \\\verb| { |
-% \\\verb| {\int_step_inline:nn{3}{#1}} |
-% \\\verb| {{a}{b}{c}}|
-% \\\verb| }|
-% \\\verb|}|
-% \erwtab[0.2]{\color{red} \verb|Illegal parameter number in definition of \l__exp_internal_tl!|}
-% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
-% \caption{Debugging~for~\cs{erw_map_indexed}}\label{listng:mapindexed}
-% \end{Listing}
-%
-% \section{\textsf{numbrdcs}}
-%
-% \subsection{\textsf{backend}}
-%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\NewDocumentCommand{\myfoo}{m}{f(#1)}|\NewDocumentCommand{\myfoo}{m}{f(#1)}
-% \\\verb|\NewDocumentCommand{\mybar}{m}{g[#1]}|\NewDocumentCommand{\mybar}{m}{g[#1]}
-% \\\verb|\NewDocumentCommand{\mybaz}{m}{h\{#1\}}|\NewDocumentCommand{\mybaz}{m}{h\{#1\}}
-% \\\verb|\numbrdcsnew{{\mybaz}{g[#1]}{\myfoo}}|\numbrdcsnew{{\mybaz}{g[#1]}{\myfoo}}
-% \\\verb|\ExplSyntaxOn|
-% \\\verb|\exp_last_unbraced:Nx|
-% \\\verb| \erw_compose_c:nn|
-% \\\verb| {|
-% \\\verb| {\erw_numbrd_cs_names_braced:|
-% \\\verb| nnn{1}{1}{3}}|
-% \\\verb| {X}|
-% \\\verb| }|
-% \\\verb|\ExplSyntaxOff|\erwtab
-% \ExplSyntaxOn
-% \exp_last_unbraced:Nx
-% \erw_compose_c:nn
-% {{\erw_numbrd_cs_names_braced:nnn{1}{1}{3}}
-% {X}}
-% \ExplSyntaxOff
-% \caption{ }\label{listng:numbrdcs:names}
-% \end{Listing}
-%
-% \subsection{frontend}
-%
-% \vspace*{\fill}
-% \begin{Listing}
-% \verb|\NewDocumentCommand{\thefoo}{m}{f(#1)}|\NewDocumentCommand{\thefoo}{m}{f(#1)}
-% \\\verb|\NewDocumentCommand{\thebar}{m}{g[#1]}|\NewDocumentCommand{\thebar}{m}{g[#1]}
-% \\\verb|\NewDocumentCommand{\thebaz}{m}{h\{#1\}}|\NewDocumentCommand{\thebaz}{m}{h\{#1\}}
-% \\\verb|\numbrdcsnew{|
-% \\\verb| {\thefoo}|
-% \\\verb| {g[#1]}|
-% \\\verb| {\thebaz}}|\erwtab\numbrdcsnew{{\thefoo}{g[#1]}{\thebaz}}
-% \\\verb|\numbrdcs{1}{X}|\erwtab\numbrdcs{1}{X}
-% \\\verb|\numbrdcs{2}{X}|\erwtab\numbrdcs{2}{X}
-% \\\verb|\numbrdcs{3}{X}|\erwtab\numbrdcs{3}{X}
-% \\\verb|\numbrdcsnew*{|
-% \\\verb| {\thefoo}|
-% \\\verb| {g[#1]}|
-% \\\verb| {\thebaz}}|\erwtab\numbrdcsnew*{{\thefoo}{g[#1]}{\thebaz}}
-% \\\verb|\numbrdcs{4}{X}|\erwtab\numbrdcs{4}{X}
-% \\\verb|\numbrdcs{5}{X}|\erwtab\numbrdcs{5}{X}
-% \\\verb|\numbrdcs{6}{X}|\erwtab\numbrdcs{6}{X}
-% \caption{ }\label{listng:numbrdcs}
-% \end{Listing}
-%
-%
-%\StopEventually{^^A
-% \PrintChanges
-% \PrintIndex
-%}
-%
-% \part{Implementation}\label{part:impl}
-%
-% \iffalse
-%<*package>
-% \fi
+% \end{documentation}
+% \begin{implementation}
+% \part{Implementation}\label{part:impl}
+%
+% \section{Opening}
% \begin{macrocode}
-\NeedsTeXFormat{LaTeX2e}
-\ExplSyntaxOn
-\msg_new:nnn{erw}{generic}{#1}
+%<*package>
+%<@@=erw>
+% \ExplSyntaxOn
+% \end{macrocode}
+% \section{\textsf{cs}}
+% \label{impl:cs}
+% \subsection{backend}
+% \begin{macrocode}
+\cs_new:Nn \@@_cs_name:N
+{
+ \exp_last_unbraced:Nf \use_i:nnn {\cs_split_function:N #1}
+}
% \end{macrocode}
-% \section{\textsf{compose}}
-% \subsection{backend}
+% \subsection{frontend}\label{basics:frontend}
+% \begin{macro}{\erw_cs_compose:NnN}
% \begin{macrocode}
-\cs_set:Npn \erw_compose:NnV
- #1 % method
- #2 % funs
- #3 % var
+\cs_new:Nn \erw_cs_compose:NnN
{
- \erw_fold_set_par:n{Nf}
- \erw_fold_apply_par:n{Nf}
- \erw_cs_set_inline:Nn \__erw_map:n
+ \erw_cs_set_inline:Nn \g@@_tl_function:n
{
- #1{##1}#3
+ #1{##1}#3
}
- \exp_args:Nf\erw_map:n
+ \exp_args:Nf\erw_tl_map:n
{
- \tl_reverse:n{#2}
+ \tl_reverse:n{#2}
}
}
-\cs_set:Npn \erw_compose:nV #1 #2
-{
- \erw_compose:NnV \erw_fold:NV {#1} #2
-}
-\cs_set:Npn \erw_compose_c:nV #1 #2
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\erw_cs_identity:n}
+% \begin{macrocode}
+\cs_set:Npn \erw_cs_identity:n #1{#1}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\erw_cs_set_inline:Nn, \erw_cs_gset_inline:Nn}
+% \begin{macrocode}
+\cs_new_protected:Nn \erw_cs_set_inline:Nn
{
- \erw_compose:NnV \erw_fold:cV {#1} #2
+ \cs_set:Npn #1 ##1{#2}
}
-\tl_new:N \__erw_compose_tl
-\cs_set:Npn \erw_compose:nn #1 #2
+\cs_generate_variant:Nn \erw_cs_set_inline:Nn {cn}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\erw_cs_gset_inline:Nn}
+% \begin{macrocode}
+\cs_new:Nn \erw_cs_gset_inline:Nn
{
- \tl_set:Nn \__erw_compose_tl {#2}
- \erw_compose:nV{#1}\__erw_compose_tl
- \__erw_compose_tl
+ \cs_gset:Npn #1 ##1{#2}
}
-\cs_set:Npn \erw_compose_c:nn #1 #2
+\cs_generate_variant:Nn \erw_cs_gset_inline:Nn {cn}
+% \end{macrocode}
+% \end{macro}
+% \section{\textsf{csint}}
+% \label{impl:csint}
+% \subsection{backend}
+% \begin{macrocode}
+\int_new:N \g@@_csint_int
+\cs_new:Nn \@@_csint_name: {\erw_csint_name:n{\g@@_csint_int}}
+% \end{macrocode}
+% \subsection{frontend}
+% \begin{macro}{\erw_csint:nn}
+% \begin{macrocode}
+\cs_new:Nn \erw_csint:nn
{
- \tl_set:Nn \__erw_compose_tl {#2}
- \erw_compose_c:nV{#1}\__erw_compose_tl
- \__erw_compose_tl
+ \exp_args:No \use:c{\erw_csint_name:n{#1}}{#2}
}
-\cs_set:Npn \erw_compose_seq:nV #1 #2
-{
- \erw_compose:NnV \erw_fold_seq:NV {#1} #2
+% \end{macrocode}
+% \end{macro}
+%^^A% \begin{macro}{\erw_csint_list:nnn}%^^A TODO
+%^^A% \begin{macrocode}
+%^^A\cs_new:Nn \erw_csint_list:nnn
+%^^A{
+%^^A \int_step_inline:nnnn { #1 }{ #2 }{ #3 }
+%^^A {
+%^^A { \exp_args:No \use:c{\erw_csint_name:n{##1}} }
+%^^A }
+%^^A}
+%^^A% \end{macrocode}
+%^^A% \end{macro}
+% \begin{macro}{\erw_csint_name:n}
+% \begin{macrocode}
+\cs_new:Nn \erw_csint_name:n {@@_csint_\int_to_alph:n{#1}:n}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\erw_csint_new:n}
+% \begin{macrocode}
+\cs_new_protected:Nn \erw_csint_new:n
+{
+ \int_incr:N \g@@_csint_int
+ \exp_args:No
+ \erw_cs_set_inline:cn{\@@_csint_name:}
+ {
+ \token_if_cs:NTF
+ {#1}
+ {#1{##1}}
+ {#1}
+ }
}
-\cs_set:Npn \erw_compose_seq_c:nV
- #1 % funs
- #2 % seq
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\erw_csint_names_braced:nnn,\erw_csint_names_braced:n,\erw_csint_names_braced:}
+% \begin{macrocode}
+\cs_new:Nn \erw_csint_names_braced:nnn
{
- \erw_compose:NnV \erw_fold_seq:cV {#1} #2
+ \int_step_function:nnnN { #1 }{ #2 }{ #3 } \erw_csint_names_braced:n
+ % TODO \tl_range_braced:nnn?
}
-\cs_set:Npn \erw_compose_vers:nV #1 #2
+\cs_new:Nn \erw_csint_names_braced:n {{\erw_csint_name:n{#1}}}
+\cs_new:Nn \erw_csint_names_braced:
{
- \msg_error:nnn{erw}{generic}{erw_compose_vers:nV~yet-to~be~implemented}
+ \erw_csint_names_braced:nnn{1}{1}{\g@@_csint_int}
}
-\cs_set:Npn \erw_compose_seq_vers:nV #1 #2
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\erw_csint_reset:}
+% \begin{macrocode}
+\cs_new_protected:Nn \erw_csint_reset:
{
- \msg_error:nnn{erw}{generic}{erw_compose_vers:nV~yet-to~be~implemented}
+ \int_zero:N \g@@_csint_int
+ \tl_set:Nn \@@_csint_ext_tl{}%^^A TODO remove?
}
-\cs_set:Npn \erw_compose_vers:nn #1 #2
+% \end{macrocode}
+% \end{macro}
+% \section{\textsf{int}}
+% \label{impl:int}
+% \subsection{backend}
+% \begin{macrocode}
+\cs_set:Npn \@@_int_range:nnn #1 #2 #3
{
- \erw_numbrd_cs_reset:{}
- \tl_map_function:nN{#1}\erw_numbrd_cs_new:n
- \exp_last_unbraced:Nx
- \erw_compose_c:nn
- {{\erw_numbrd_cs_names_braced:{}}}
- {#2}
+ \int_compare:nNnTF
+ {
+ \int_eval:n{#2+1}
+ }>{#3}
+ {
+ {#1}
+ }
+ {
+ \@@_int_range:nnn
+ {
+ \exp_args:Nx\erw_tl_append_item:nn{#1}
+ {
+ \int_eval:n{#2+1}
+ }
+ }
+ {\int_eval:n{#2+1}}
+ {#3}
+ }
}
% \end{macrocode}
-% \section{\textsf{csutil}}
-% \subsection{\textsf{backend}}
+% \subsection{frontend}
+% \begin{macro}{\erw_int_range:nn, \erw_int_range:n }
% \begin{macrocode}
-\cs_set:Npn \erw_accum:nn #1 #2
+\cs_new:Nn \erw_int_range:nn
{
- {#1{#2}}
+ \@@_int_range:nnn {{#1}}{#1}{#2}
}
-\cs_set:Npn \__erw_cs_name:N #1
+\cs_new:Nn \erw_int_range:n
{
- \exp_last_unbraced:Nf \use_i:nnn {\cs_split_function:N #1}
+ \@@_int_range:nnn {}{0}{#1}
+% ^^A Alt to:
+% ^^A \int_step_inline:nn {#1}{##1}
}
-\cs_set:Npn \erw_apply:Nn
- #1 % fun
- #2 % tl
+% \end{macrocode}
+% \end{macro}
+% \section{\textsf{keys}}
+% \subsection{frontend}
+% \begin{macro}{\erw_keyval_error:Nn,\erw_keyval_error:Nnn}
+% \begin{macrocode}
+\cs_new:Nn \erw_keyval_error:Nn{\msg_error:nnnnn{@@}{keyval/n}{\erw_keyval_error:Nn}{#1}{#2}}
+\cs_new:Nn \erw_keyval_error:Nnn{\msg_error:nnnnnn{@@}{keyval/nn}{\erw_keyval_error:Nnn}{#1}{#2}{#3}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\erw_keyval_parse:NNNn}
+% \begin{macrocode}
+\cs_new_protected:Nn\erw_keyval_parse:NNNn
{
- #1{#2}
+ \cs_set_protected:Nn \@@_keyval_function:n {#2 #1{##1}}
+ \cs_set_protected:Nn \@@_keyval_function:nn {#3 #1{##1}{##2}}
+ \keyval_parse:NNn
+ \@@_keyval_function:n
+ \@@_keyval_function:nn
+ {#4}
}
-\cs_generate_variant:Nn \erw_apply:Nn {No, Nf, Nx, c}
-\cs_set:Npn \erw_cs_set_eq:NN #1 #2
+% \end{macrocode}
+% \end{macro}
+% \section{\texttt{lambda}}
+% \begin{macro}{\erw_lambda:nnn}
+% \begin{macrocode}
+\cs_new_protected:Npn \erw_lambda:nnn #1 #2 #3
{
- \cs_set:Npn #1 ##1{#2{##1}}
+ \exp_args:NNx
+ #1 \@@_lambda_expression
+ {#2}
+ {#3}
+ \@@_lambda_expression
}
-\cs_generate_variant:Nn \erw_cs_set_eq:NN {cN}
-\cs_set:Npn \erw_cs_gset_eq:NN #1 #2
+% \end{macrocode}
+% \end{macro}
+% \section{\textsf{msg}}
+% \label{impl:msg}
+% \subsection{backend}
+% \begin{macrocode}
+\msg_new:nnn{@@}{generic}{#1}
+\msg_new:nnn{@@}{keyval/nn}{#1#2{#3}{#4};~encountered~key=val~where~only~key~required}
+\msg_new:nnn{@@}{keyval/n}{#1#2{#3};~encountered~key~~where~only~key=val~required}
+\msg_new:nnn{@@}{separ}{#1~expects~1~to~3~items,~#2}
+\msg_new:nnn{@@}{timestamp / base}{Calling~#1,~arg~must~be~'dec|hex'}
+\msg_new:nnn{@@}{timestamp / period}{Calling~#1,~arg~must~be~'date|time|datetime'}
+% \end{macrocode}
+% \subsection{frontend}
+% \begin{macrocode}
+\msg_new:nnn{erw}{notset}{#1~not~set}
+% \end{macrocode}
+% \section{\textsf{prop}}
+% \subsection{backend}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_prop_map_item:NNN
{
- \cs_gset:Npn #1 ##1{#2{##1}}
+ \cs_set_protected:Nn \@@_function:nn
+ {
+ #1 #2 {##1}{##2}
+ }
+ \prop_map_function:NN #3 \@@_function:nn
}
-\cs_generate_variant:Nn \erw_cs_gset_eq:NN {cN}
-\cs_set:Npn \erw_cs_set_inline:Nn #1 #2
+% \end{macrocode}
+% \subsection{frontend}
+% \begin{macro}{\erw_prop_to_clist:Nn}
+% \begin{macrocode}
+\cs_new_protected:Nn \erw_prop_to_clist:Nn
{
- \cs_set:Npn #1 ##1{#2}
+ \cs_set:Nn \@@_keyval_function:n {,\prop_item:Nn#1{##1}}
+ \exp_args:Nf
+ \tl_tail:n
+ {
+ \keyval_parse:NNn
+ \@@_keyval_function:n
+ \erw_keyval_error:Nnn
+ {#2}
+ }
}
-\cs_generate_variant:Nn \erw_cs_set_inline:Nn {cn}
-\cs_set:Npn \erw_cs_gset_inline:Nn #1 #2
+\cs_generate_variant:Nn \erw_prop_to_clist:Nn { c }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\erw_prop_map_item:NNN}
+% \begin{macrocode}
+\cs_new_protected:Nn \erw_prop_map_item:NNN
{
- \cs_gset:Npn #1 ##1{#2}
+ \prop_if_exist:NTF #2
+ {\@@_prop_map_item:NNN #1#2#3}
+ {
+ \prop_new:N #2
+ \erw_prop_map_item:NNN #1#2#3
+ }
}
-\cs_generate_variant:Nn \erw_cs_gset_inline:Nn {cn}
-\tl_set:Nn \__erw_fold_set_par_tl{\c_novalue_tl}
-\tl_set:Nn \__erw_fold_apply_par_tl{\c_novalue_tl}
-\cs_set:Npn \erw_fold_set_par:n #1
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\erw_prop_keyval_parse:NNNn}
+% \begin{macrocode}
+\cs_new_protected:Nn\erw_prop_keyval_parse:NNNn
{
- \tl_set:Nn \__erw_fold_set_par_tl{#1}
+ \prop_if_exist:NTF#1
+ {\erw_keyval_parse:NNNn #1#2#3{#4}}
+ {
+ \prop_new:N #1
+ \erw_prop_keyval_parse:NNNn#1#2#3{#4}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \section{\textsf{oper}}
+% \label{impl:oper}
+% \subsection{backend}
+% \subsection{frontend}
+% \begin{macrocode}
+\keys_define:nn{@@}
+{
+ tl/fold_set_par.tl_gset:N = \g@@_tl_fold_set_par_tl,
+ tl/fold_set_par.value_required:n = true,
+ tl/fold_set_par.default:n = {Nf},
+ tl/fold_set_par.initial:n = {Nf},
+ tl/fold_apply_par.tl_gset:N = \g@@_tl_fold_apply_par_tl,
+ tl/fold_apply_par.value_required:n = true,
+ tl/fold_apply_par.default:n = {Nf},
+ tl/fold_apply_par.initial:n = {Nf}
}
-\cs_set:Npn \erw_fold_apply_par:n #1
+% \end{macrocode}
+% \section{option}
+% \label{impl:option}
+% \begin{macrocode}
+\cs_new_protected:Nn\erw_option:n
{
- \tl_set:Nn \__erw_fold_apply_par_tl{#1}
+ \keys_set:nn{@@}{#1}
}
-\cs_set:Npn \erw_fold:NV
- #1 % fun
- #2 % var
+% \end{macrocode}
+% \section{\textsf{seq}}
+% \label{impl:seq}
+% \subsection{backend}
+% \begin{macrocode}
+\tl_new:N \g@@_seq_fold_item_tl
+\cs_new_protected:Nn\@@_seq_put_right_clist:Nn
{
- \use:c{tl_set:\__erw_fold_set_par_tl}
- #2
- {\use:c{erw_apply:\__erw_fold_apply_par_tl}{#1}{#2}}
+ \cs_set_protected:Nn \@@_function:n
+ {
+ \seq_put_right:Nn #1{##1}
+ }
+ \keyval_parse:NNn
+ \@@_function:n
+ \erw_keyval_keyonly:nn
+ {#2}
}
-\cs_generate_variant:Nn \erw_fold:NV {cV}
-\tl_new:N \__erw_fold_seq_item_tl
-\cs_set:Npn \erw_fold_seq:NV
- #1 % fun
- #2 % seq
+\cs_generate_variant:Nn \@@_seq_put_right_clist:Nn { c }
+\cs_new_protected:Nn\@@_seq_put_right_prop:NNn
{
- \seq_get_right:NN #2 \__erw_fold_seq_item_tl
- \erw_fold:NV #1 \__erw_fold_seq_item_tl
- \seq_put_right:No #2 {\__erw_fold_seq_item_tl}
+ \@@_seq_put_right_clist:Nn #1
+ {\erw_prop_to_clist:Nn #2 {#3}}
}
-\cs_generate_variant:Nn \erw_fold_seq:NV {cV}
-\cs_set:Npn \erw_identity:n #1{#1}
-\prg_set_conditional:Npnn \erw_is_matrix:n #1 { p, TF }
+\cs_generate_variant:Nn \@@_seq_put_right_prop:NNn { cc }
+% \end{macrocode}
+% \subsection{frontend}
+% ^^A TODO see if can replace compose with just oper
+% \begin{macrocode}
+\cs_new_protected:Nn\erw_seq_put_right_clist:Nn
{
- \erw_gset_map_inline:n{==\tl_count:n{##1}}
- \int_compare:nTF
- {
- \exp_args:Nf\tl_count:n{\tl_head:n{#1}}
- \exp_args:Nf \erw_map:n
- {
- \tl_tail:n{#1}
- }
- }
- {\prg_return_true:}
- {\prg_return_false:}
+ \seq_if_exist:NTF#1
+ {\@@_seq_put_right_clist:Nn#1{#2}}
+ {\seq_new:N#1\erw_seq_put_right_clist:Nn#1{#2}}
}
-% Deprecated in v0.1.4 after realizing \cs{tl_range:n} does the job
-%\cs_set:Npn\__erw_items_to:nnn #1 #2 #3
-%{
-% \int_compare:nNnTF
-% {#1}>{#2}
-% {
-% \exp_args:Nf \tl_head:n{#3}
-% \__erw_items_to:nnn
-% {#1}
-% {\int_eval:n{#2+1}}
-% {\exp_args:Nf \tl_tail:n{#3}}
-% }
-% {
-% \exp_args:Nf \tl_head:n{#3}
-% }
-%}
-%\cs_set:Npn \erw_items_to:nn #1 #2
-%{
-% \__erw_items_to:nnn
-% {#1}
-% {1}
-% {#2}
-%}
-\cs_set:Npn \erw_last_item:n #1
+\cs_generate_variant:Nn \erw_seq_put_right_clist:Nn { c }
+\cs_new_protected:Nn\erw_seq_put_right_prop:NNn
{
- \exp_args:Nof \tl_item:nn
- {#1}
- {
- \tl_count:n{#1}
- }
+ \seq_if_exist:NTF#1
+ {\@@_seq_put_right_prop:NNn#1#2{#3}}
+ {\seq_new:N#1\erw_seq_put_right_prop:NNn#1#2{#3}}
}
-\cs_set:Npn \erw_merge:nn #1 #2
+\cs_generate_variant:Nn \erw_seq_put_right_prop:NNn { cc }
+\cs_new_protected:Nn \erw_seq_fold:NN
{
- {#1#2}
+ \seq_get_right:NN #2 \g@@_seq_fold_item_tl
+ \erw_tl_fold:NN #1 \g@@_seq_fold_item_tl
+ \seq_put_right:No #2 {\g@@_seq_fold_item_tl}
}
-\cs_set:Npn \erw_repeat:nn #1 #2
+\cs_generate_variant:Nn \erw_seq_fold:NN {cN}
+\cs_new:Nn \erw_seq_use:Nn
{
- \int_step_inline:nnnn{1}{1}{#1}{#2}
+ \exp_last_unbraced:NNf
+ \seq_use:Nnnn #1
+ \erw_tl_separators:n{#2}
}
-\cs_set:Npn \erw_split:nnn #1 #2 #3
+% \end{macrocode}
+% \section{\textsf{sys}}
+% \label{impl:sys}
+% \subsection{backend}
+% \begin{macrocode}
+% \end{macrocode}
+% \begin{macro}{\@@_sys_date:N, \@@_sys_date_dec:, \@@_sys_date_hex:}
+% \begin{macrocode}
+\cs_new:Nn \@@_sys_date_dec:
{
- \tl_head:n{#1}
- \use:c{exp_args:#3} \tl_map_inline:nn
- {
- \tl_tail:n
- {
- #1
- }
- }{#2##1}
+ \int_eval:n
+ {
+ \c_sys_year_int * 10000
+ +\c_sys_month_int * 100
+ +\c_sys_day_int * 1
+ }
}
-\cs_set:Npn \erw_split:nn #1 #2
+\cs_new:Nn \@@_sys_date:N{\int_to_hex:n{\@@_sys_date_dec:}}
+\cs_new:Nn \@@_sys_date_hex:{\int_to_hex:n{\@@_sys_date_dec:}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_sys_time_dec:, \@@_sys_time_hex}
+% \begin{macrocode}
+\cs_new:Nn \@@_sys_time_dec:
{
- \erw_split:nnn{#1}{#2}{Nf}
+ \int_eval:n
+ {
+ \c_sys_hour_int * 100
+ +\c_sys_minute_int * 1
+ }
}
+\cs_new:Nn\@@_sys_time_hex:{\int_to_hex:n{\@@_sys_time_dec:}}
% \end{macrocode}
-% \section{\textsf{map}}
-% \subsection{\textsf{backend}}
+% \end{macro}
+% \begin{macro}{\@@_sys_datetime_base:n, \@@_sys_datetime_dec:n, \@@_sys_datetime_join:nn, \@@_sys_datetime_hex:n, \@@_sys_datetime_period:n }
% \begin{macrocode}
-\cs_set:Npn \__erw_int_range:nnn #1 #2 #3
+\cs_new:Nn\@@_sys_datetime_base:n
{
- \int_compare:nNnTF
- {
- \int_eval:n{#2+1}
- }>{#3}
- {
- {#1}
- }
- {
- \__erw_int_range:nnn
- {
- \exp_args:Nx\erw_accum:nn{#1}
- {
- \int_eval:n{#2+1}
- }
- }
- {\int_eval:n{#2+1}}
- {#3}
- }
+ \int_case:nnTF{#1}
+ {
+ {10}{dec}
+ {16}{hex}
+ }
+ {\c_empty_tl}
+ {\msg_error:nnn{@@}{timestamp / base}{\@@_sys_datetime_base:n{#1}}}
}
-\cs_set:Npn \erw_int_range:nn #1 #2
+\cs_new:Nn\@@_sys_datetime_join:nn{\erw_tl_join:nnn{#1}{\g@@_sys_timestamp_delim_str}{#2}}
+\cs_new:Nn\@@_sys_datetime_period:n
{
- \__erw_int_range:nnn {{#1}}{#1}{#2}
+ \str_case:nnTF{#1}
+ {
+ {date}{date}
+ {time}{time}
+ {datetime}{datetime}
+ }
+ {\c_empty_tl}
+ {\msg_error:nnn{@@}{ timestamp / period }{\@@_sys_datetime_period:n{#1}}}
}
-\cs_set:Npn \erw_int_range:n #1
+\cs_new:Nn\@@_sys_datetime_dec: {\@@_sys_datetime_join:nn{\@@_sys_date_dec:}{\@@_sys_time_dec:}}
+\cs_new:Nn\@@_sys_datetime_hex: {\@@_sys_datetime_join:nn{\@@_sys_date_hex:}{\@@_sys_time_hex:}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_sys_jobnametimestamp_prefix:}
+% \begin{macrocode}
+\cs_new:Nn\@@_sys_jobnametimestamp_prefix:
{
- \__erw_int_range:nnn {}{0}{#1}
-% Alt to:
-% \int_step_inline:nn {#1}{##1}
+ \erw_tl_join:nn
+ {\c_sys_jobname_str}
+ {\g@@_sys_timestamp_delim_str}
}
% \end{macrocode}
-% \section{\textsf{map}}
-% \subsection{\textsf{backend}}
+% \end{macro}
+% \begin{macro}{\@@_sys_jobnametimestamp:n, \@@_sys_jobnametimestamp:}
% \begin{macrocode}
-\cs_set:Npn \erw_gset_map:N #1
+\cs_new:Nn\@@_sys_jobnametimestamp:nn
{
- \erw_cs_gset_eq:NN \__erw_map:n #1
+ \erw_tl_join:nn
+ {\@@_sys_jobnametimestamp_prefix:}
+ {\erw_sys_timestamp:nn{#1}{#2}}
}
-\cs_set:Npn \erw_gset_map_inline:n #1
+\cs_new:Nn\@@_sys_jobnametimestamp:
{
- \erw_cs_gset_inline:Nn \__erw_map:n {#1}
+ \erw_tl_join:nn
+ {\@@_sys_jobnametimestamp_prefix:}
+ {\erw_sys_timestamp:}
}
-\cs_set:Npn \erw_map:n #1
-{
- \__erw_map:nn#1\q_recursion_tail\q_recursion_stop\q_recursion_tail\q_recursion_stop
-}
-\cs_set:Npn \__erw_map:nn #1 #2
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_sys_timestamp:nn}
+% \begin{macrocode}
+\cs_new:Nn\@@_sys_timestamp:nn
{
- \quark_if_recursion_tail_stop:n{#1}
- \__erw_map:n{#1} \__erw_map:nn{#2}
+ \exp_args:No
+ \use:c{@@_sys_\@@_sys_datetime_period:n{#1}_\@@_sys_datetime_base:n{#2}:}
}
-\cs_new:Npn \__erw_map:n #1
+\cs_new_protected:Nn \@@_sys_set_delim:nn
{
- \msg_error:nnn
- {erw}
- {generic}
- {__erw_map:n~not~set}
+ \use:c{tl_gset:N#1}
+ \g@@_sys_timestamp_delim_str{#2}
}
-\cs_set:Npn \erw_map:Nn
- #1 % fun
- #2 % tl
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\keys_define:nn{@@}
+{
+ sys / timestamp_delim .code:n =
+ {
+ \exp_last_unbraced:No
+ \@@_sys_set_delim:nn{n}{#1}
+ },
+ sys / timestamp_delim .value_required:n = true,
+ sys / timestamp_delim .default:n = {-},
+ sys / timestamp_delim .initial:n = {-}
+}
+% \subsection{frontend}
+% \begin{macrocode}
+\cs_new:Nn\erw_sys_jobnametimestamp:nn{\@@_sys_jobnametimestamp:nn{#1}{#2}}
+\cs_new:Nn\erw_sys_jobnametimestamp:{\@@_sys_jobnametimestamp:}
+\cs_new:Nn\erw_sys_timestamp_delimiter:
{
- \erw_cs_set_eq:NN \__erw_map:n #1
- \erw_map:n{#2}
+ \use:N \g@@_sys_timestamp_delim_str
}
-\cs_set:Npn \erw_map_inline:nn
- #1 % inl
- #2 % tl
+\cs_new:Nn\erw_sys_timestamp:nn
{
- \erw_cs_set_inline:Nn \__erw_map:n {#1}
- \erw_map:n{#2}
+ \@@_sys_timestamp:nn{#1}{#2}
}
-\cs_set:Npn \erw_apply:Nnn #1 #2 #3
+\cs_new:Nn\erw_sys_timestamp:
{
- #1{#2}{#3}
+ \@@_sys_timestamp:nn{datetime}{16}
}
-\cs_set:Npn \erw_apply:Nnnn #1 #2 #3 #4
+% \end{macrocode}
+% \section{\textsf{tl}}
+% \label{impl:tl}
+% \subsection{backend}
+% \begin{macrocode}
+\tl_new:N \g@@_tl_compose_tl
+% \end{macrocode}
+% \begin{macro}{\g@@_tl_function:n}
+% \begin{macrocode}
+\cs_new_protected:Nn \g@@_tl_function:n
{
- #1{#2}{#3}{#4}
+ \msg_error:nnn
+ {erw}
+ {notset}
+ {\g@@_tl_function:n}
}
-\cs_set:Npn \erw_apply:Nnnnn #1 #2 #3 #4 #5
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_tl_map:nn}
+% \begin{macrocode}
+\cs_set_protected:Nn \@@_tl_map:nn
{
- #1{#2}{#3}{#4}{#5}
+ \quark_if_recursion_tail_stop:n{#1}
+ \g@@_tl_function:n{#1} \@@_tl_map:nn{#2}
}
-\cs_set:Npn \__erw_map_thread_at:Nnn #1 #2 #3
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_tl_map_thread_at:Nnn, \@@_tl_map_thread_at:Nnnn, \@@_tl_map_thread_at:Nnnnn, \@@_tl_map_thread_at:Nnnnnn}
+% \begin{macrocode}
+\cs_set_protected:Nn \@@_tl_map_thread_at:Nnn
{
- \erw_apply:Nn #1
- {\exp_args:Nf\tl_item:nn {#3} {#2} }
+ #1
+ {\exp_args:Nf\tl_item:nn {#3} {#2} }
}
-\cs_set:Npn \__erw_map_thread_at:Nnnn #1 #2 #3 #4
+\cs_set_protected:Nn \@@_tl_map_thread_at:Nnnn
{
- \erw_apply:Nnn #1
- {\exp_args:Nf\tl_item:nn {#3} {#2} }
- {\exp_args:Nf\tl_item:nn {#4} {#2} }
+ #1
+ {\exp_args:Nf\tl_item:nn {#3} {#2} }
+ {\exp_args:Nf\tl_item:nn {#4} {#2} }
}
-\cs_set:Npn \__erw_map_thread_at:Nnnnn #1 #2 #3 #4 #5
+\cs_set_protected:Nn \@@_tl_map_thread_at:Nnnnn
{
- \erw_apply:Nnnn #1
- {\exp_args:Nf\tl_item:nn {#3} {#2} }
- {\exp_args:Nf\tl_item:nn {#4} {#2} }
- {\exp_args:Nf\tl_item:nn {#5} {#2} }
+ #1
+ {\exp_args:Nf\tl_item:nn {#3} {#2} }
+ {\exp_args:Nf\tl_item:nn {#4} {#2} }
+ {\exp_args:Nf\tl_item:nn {#5} {#2} }
}
-\cs_set:Npn \__erw_map_thread_at:Nnnnnn #1 #2 #3 #4 #5 #6
+\cs_set_protected:Nn \@@_tl_map_thread_at:Nnnnnn
{
- \erw_apply:Nnnnn #1
- {\exp_args:Nf\tl_item:nn {#3} {#2} }
- {\exp_args:Nf\tl_item:nn {#4} {#2} }
- {\exp_args:Nf\tl_item:nn {#5} {#2} }
- {\exp_args:Nf\tl_item:nn {#6} {#2} }
+ #1
+ {\exp_args:Nf\tl_item:nn {#3} {#2} }
+ {\exp_args:Nf\tl_item:nn {#4} {#2} }
+ {\exp_args:Nf\tl_item:nn {#5} {#2} }
+ {\exp_args:Nf\tl_item:nn {#6} {#2} }
}
-\cs_set:Npn \erw_map_thread_at:Nnn #1 #2 #3
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_tl_separators:nn}
+% \begin{arguments}
+% \item \meta{ int }
+% \item \meta{ items }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Nn \@@_tl_separators:nn
{
- \exp_args:Nf\int_case:nnTF
- {
- \tl_count:n{#3}
- }
- {
- {1}{ \__erw_map_thread_at:Nnn #1{#2}#3 }
- {2}{ \__erw_map_thread_at:Nnnn #1{#2}#3 }
- {3}{ \__erw_map_thread_at:Nnnnn #1{#2}#3 }
- {4}{ \__erw_map_thread_at:Nnnnnn #1{#2}#3 }
- }
- {
- % Do nothing
- }
+ \int_case:nnTF {#1}
+ {
+ {1}
+ { \prg_replicate:nn{ 3 }{#2} }
+ {2}
{
- \msg_error:nnn{erw}
- {generic}
- {erw_map_thread_at:~count~of~#3~not~withing~1~to~4}
+ { \use_ii:nn #2 }
+ { \use_i:nn #2 }
+ { \use_i:nn #2 \use_ii:nn #2 }
}
+ {3}{#2}
+ }
+ { \c_empty_tl }
+ {
+ \msg_error:nnnn { @@ }
+ { separ }
+ { \@@_tl_separators:nn }
+ {#2}
+ }
}
-\cs_set:Npn \erw_map_thread:Nn #1 #2
+\cs_generate_variant:Nn \@@_tl_separators:nn { e }
+% \end{macrocode}
+% \end{macro}
+% \subsection{frontend}
+% ^^A TODO see if can replace compose with just oper
+% \begin{macrocode}
+\cs_new:Nn \erw_tl_append_item:nn
{
- % TODO check that #2 is a matrix
- \int_step_inline:nn
- {
- \exp_args:Nf \tl_count:n{ \tl_head:n{#2} }
- }
- {
- \erw_map_thread_at:Nnn #1 {##1} {#2}
- }
+ {#1{#2}}
}
+\cs_new:Nn \erw_tl_fold:NN
+{
+ \use:c{tl_set:\g@@_tl_fold_set_par_tl}
+ #2
+ {
+ \use:c{exp_args:\g@@_tl_fold_apply_par_tl}{#1}{#2}
+ }
+}
+\cs_generate_variant:Nn \erw_tl_fold:NN {cN}
+\cs_new:Nn \erw_tl_gset_function:N
+{
+ \erw_cs_gset_eq:NN \g@@_tl_function:n #1
+}
+\cs_new:Nn \erw_tl_gset_function:n
+{
+ \erw_cs_gset_inline:Nn \g@@_tl_function:n {#1}
+}
+\cs_new:Nn \erw_tl_last_item:n
+{
+ \exp_args:Nof \tl_item:nn
+ {#1}
+ {
+ \tl_count:n{#1}
+ }
+}
+% \end{macrocode}
+% \begin{macro}{\erw_tl_join:nn, \erw_tl_join:nnn, \erw_tl_join:nnnn, \erw_tl_join:nnnnn}
+% \begin{macrocode}
+\cs_new:Nn \erw_tl_join:nn{#1#2}
+\cs_new:Nn \erw_tl_join:nnn{#1#2#3}
+\cs_new:Nn \erw_tl_join:nnnn{#1#2#3#4}
+\cs_new:Nn \erw_tl_join:nnnnn{#1#2#3#4#5}
% \end{macrocode}
-% \section{\textsf{numbrdcs}}
-% \subsection{\textsf{backend}}
+% \end{macro}
% \begin{macrocode}
-\int_new:N \__erw_numbrd_cs_int
-\cs_set:Npn \erw_numbrd_cs_name:n #1{__erw_numbrd_cs_\int_to_alph:n{#1}:n}
-\cs_set:Npn \erw_numbrd_cs_name_braced:n #1{{\erw_numbrd_cs_name:n{#1}}}
-\tl_set:Nn \__erw_numbrd_cs_name_tl {\erw_numbrd_cs_name:n{\__erw_numbrd_cs_int}}
-\cs_set:Npn \erw_numbrd_cs:nn #1 #2
+\cs_new_protected:Nn \erw_tl_map:n
+{
+ \@@_tl_map:nn#1\q_recursion_tail\q_recursion_stop\q_recursion_tail\q_recursion_stop
+}
+\cs_new_protected:Nn \erw_tl_map:Nn
{
- \erw_apply:cn{__erw_numbrd_cs_\int_to_alph:n{#1}:n}{#2}
+ \cs_set_eq:NN \g@@_tl_function:n #1
+ \erw_tl_map:n{#2}
}
-\cs_new_protected:Npn \erw_numbrd_cs_reset:
+\cs_new_protected:Nn \erw_tl_map_inline:nn
{
- \int_zero:N \__erw_numbrd_cs_int
- \tl_set:Nn \__erw_numbrd_cs_ext_tl{}
+ \erw_cs_set_inline:Nn \g@@_tl_function:n {#1}
+ \erw_tl_map:n{#2}
}
-\cs_new_protected:Npn \erw_numbrd_cs_new:n #1
-{
- \int_incr:N \__erw_numbrd_cs_int
- \erw_cs_set_inline:cn{\__erw_numbrd_cs_name_tl}
- {
- \token_if_cs:NTF
- {#1}
- {#1{##1}}
- {#1}
- }
+\cs_new:Nn \erw_tl_repeat:nn
+{
+ \int_step_inline:nnnn{1}{1}{#1}{#2}
}
-\cs_new:Npn \erw_numbrd_cs_names:nnn #1 #2 #3
+\cs_new:Nn \erw_tl_split:nnn
{
- \int_step_function:nnnN { #1 }{ #2 }{ #3 } \erw_numbrd_cs_name:n
+ \tl_head:n{#1}
+ \use:c{exp_args:#3} \tl_map_inline:nn
+ {
+ \tl_tail:n
+ {
+ #1
+ }
+ }{#2##1}
}
-\cs_new:Npn \erw_numbrd_cs_names_braced:nnn #1 #2 #3
+\cs_new:Nn \erw_tl_split:nn
{
- \int_step_function:nnnN { #1 }{ #2 }{ #3 } \erw_numbrd_cs_name_braced:n
- % TODO \tl_range_braced:nnn?
+ \erw_tl_split:nnn{#1}{#2}{Nf}
}
-\cs_new:Npn \erw_numbrd_cs_names_braced:
+\cs_new_protected:Nn \erw_tl_map_thread_at:Nnn
{
- \erw_numbrd_cs_names_braced:nnn{1}{1}{\__erw_numbrd_cs_int}
+ \exp_args:Nf\int_case:nnTF
+ {
+ \tl_count:n{#3}
+ }
+ {
+ {1}{ \@@_tl_map_thread_at:Nnn #1{#2}#3 }
+ {2}{ \@@_tl_map_thread_at:Nnnn #1{#2}#3 }
+ {3}{ \@@_tl_map_thread_at:Nnnnn #1{#2}#3 }
+ {4}{ \@@_tl_map_thread_at:Nnnnnn #1{#2}#3 }
+ }
+ {
+ % Do nothing
+ }
+ {
+ \msg_error:nnn{@@}
+ {generic}
+ {erw_tl_map_thread_at:~count~of~#3~not~withing~1~to~4}
+ }
}
-% \end{macrocode}
-% \subsection{\textsf{frontend}}
-% \begin{macrocode}
-\NewDocumentCommand{\numbrdcsnew}{ s m }
+\cs_new_protected:Nn \erw_tl_map_thread:Nn
{
- \IfBooleanTF{#1}
- {}
- { \erw_numbrd_cs_reset:{}}
- \tl_map_function:nN {#2}\erw_numbrd_cs_new:n
+ \int_step_inline:nn
+ {
+ \exp_args:Nf \tl_count:n{ \tl_head:n{#2} }
+ }
+ {
+ \erw_tl_map_thread_at:Nnn #1 {##1} {#2}
+ }
}
-\NewDocumentCommand{\numbrdcs}{ m m }
+\cs_new:Nn \erw_tl_separators:n
{
- \erw_numbrd_cs:nn{#1}{#2}
+ \@@_tl_separators:en{ \tl_count:n{#1} }{#1}
}
-% \ProcessKeysPackageOptions{ erw }
+% \end{macrocode}
+% \section{Closing}
+% \label{impl:closing}
+%
+% \begin{macrocode}
\ExplSyntaxOff
+%</package>
% \end{macrocode}
-% \part{Other}\label{part:other}
-%
-% \section{Support}\label{support}
-%
-% This package is available from \url{https://www.ctan.org/pkg/erw-l3} (release) or \url{https://github.com/rogard/erw-l3} (development) where you can report issues.
-%
-% \section{To do}\label{todo}
-%
-% \begin{itemize}
-% \item Missing variants of \cs{erw_compose}
-% \item \cs{erw_map_indexed}. See Listing~\autoref{listng:mapindexed}
-% \item Need to give some thought to `protected'
-% \end{itemize}
-%
-% \section{Acknowledgment}
-% I thank those that have answered my questions on forums pertaining to \LaTeX3. See here: \url{https://tex.stackexchange.com/users/112708/erwann?tab=questions}
-% and here: \url{https://latex.org/forum/memberlist.php?mode=viewprofile&u=61329}
-%
-% ^^A \section{Change history}
-% ^^A TODO Bring the change history under this section
-% ^^A The versions showns are of those of the development stage, some may have been skipped in the release.
-% ^^A \iffalse
-% ^^A : changes
-% ^^A \fi
-%
-% \changes{0.1}{2018/05/20}{Initial version}
-% \changes{0.1.1}{2018/05/23}{}
-% \changes{0.1.1}{2018/05/23}{Brought all the modules under one file; renamed \pkg{l3erw} to \pkg{erw-l3};}
-% \changes{0.1.1}{2018/05/23}{\pkg{disambig}/backend: changes to the key, added \cs{ProcessPackageKeysOption};}
-% \changes{0.1.1}{2018/05/23}{\cs{numbrdcsnew} changed to \cs{newnumbrdcs} and made 'disambiguable'}
-% \changes{0.1.2}{2018/06/21}{}
-% \changes{0.1.2}{2018/06/21}{\cs{erw_compose} reversed order in which the functions are composed, such that it now conforms to
-% the mathematical convention ($g\circ f$ means $f$ comes before $g$)}
-%\changes{0.1.2}{2018/06/21}{Front end cmds no longer generated with module \pkg{disambig}; Option of the same name deleted;}
-%\changes{0.1.2}{2018/06/21}{\pkg{disambig}: pushed the code inside \cs{keys_define};\cs{disambignewcmd} no longer takes a token name as arg, rather a token.}
-%\changes{0.1.2}{2018/06/21}{Added \cs{erw_repeat}}
-%\changes{0.1.2}{2018/06/21}{Added \cs{erw_split}}
-%\changes{0.1.2}{2018/06/21}{Added \cs{erw_last_item}}
-%\changes{0.1.2}{2018/06/21}{Added \cs{erw_items_to}}
-%\changes{0.1.2}{2018/06/21}{Added \cs{map_thread}}
-%\changes{0.1.2}{2018/06/21}{Re-arranged the doc to clearly separate frontend from backend}
-%\changes{0.1.3}{2018/06/22}{Wrong versioning, should have been 0.1.2}
-%\changes{0.1.4}{2018/06/22}{}
-%\changes{0.1.4}{2018/06/22}{Removed \cs{erw_items_to} (redundant with \cs{tl_range:nnn})}
-%\changes{0.1.4}{2018/06/22}{Added \cs{erw_accum}}
-%\changes{0.1.4}{2018/06/22}{Added \cs{erw_merge}}
-%\changes{0.1.4}{2018/06/22}{Added \cs{erw_int_range}}
-%\changes{0.1.4}{2018/06/22}{Added \cs{erw_set_map}}
-%\changes{0.1.4}{2018/06/22}{Added \cs{erw_set_map_inline}}
-%\changes{0.1.4}{2018/06/22}{Added \cs{erw_is_matrix}}
-%\changes{0.1.5}{2019/12/12}{Modified source repository}
-%\changes{0.1.5}{2019/12/12}{Rearranged frontend/backend sections}
-%\changes{0.1.5}{2019/12/12}{Split Section Preliminaries into Conventions and Requirement.}
-%\changes{0.1.5}{2019/12/12}{Removed \pkg{disambig}}
-%\changes{0.1.6}{2020/02/05}{Fixed critical bug preventing \pkg{erw-l3} from working without explicit inclusion of \pkg{expl3}}
%
-% % \begin{thebibliography}{1}
-%
-% ^^A\bibitem{expl3} The \LaTeX3 Project Team {\em The \pkg{expl3} package and \LaTeX3 programming}
-% ^^A\url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/expl3.pdf}
-%
-% \bibitem{interface3} The \LaTeX3 Project Team {\em The \LaTeX3 interfaces}
-% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}
-%
-% \bibitem{xparse} The \LaTeX3 Project Team {\em The \pkg{xparse} package}
-% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3packages/xparse.pdf}
-%
-% ^^A \bibitem{l3pckg} The \LaTeX3 Project Team {\em l3packages} \url{http://mirror.ctan.org/macros/latex/contrib/l3packages/}
-%
-% ^^A \bibitem{tex.stack:431046} \url{https://tex.stackexchange.com/questions/431046/calling-expl3s-usec-on-an-expression-expanding-to-a-cs-name-causes-error}
-%
-% ^^A \bibitem{tex.stack:432171} \url{https://tex.stackexchange.com/questions/432171/expl3-making-arguments-from-a-loop}
-%
-% \end{thebibliography}
-%
-%
-% \iffalse
-%</package>
-% \fi
+% \end{implementation}
+% ^^A% \iffalse
+% ^^A%</package>
+% ^^A% \fi
% \Finale
\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/erw-l3/erw-l3.ins b/Master/texmf-dist/source/latex/erw-l3/erw-l3.ins
deleted file mode 100644
index 9ce820375b6..00000000000
--- a/Master/texmf-dist/source/latex/erw-l3/erw-l3.ins
+++ /dev/null
@@ -1,68 +0,0 @@
-%%
-%% This is file `erw-l3.ins',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% erw-l3.dtx (with options: `install')
-%% ----------------------------------------------------------------
-%% erw-l3 Utilities built around expl3
-%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
-%% ----------------------------------------------------------------
-%%
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-\preamble
-----------------------------------------------------------------
-erw-l3 Utilities built around expl3
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
-\endpreamble
-\postamble
-
-Copyright (C) 2018 by Erwann Rogard
-
-This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License (LPPL), either
-version 1.3c of this license or (at your option) any later
-version. The latest version of this license is in the file:
-
-http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
-Erwann Rogard.
-
-This work consists of the file erw-l3.dtx
-and the derived files erw-l3.ins,
- erw-l3.pdf and
- erw-l3.sty.
-
-\endpostamble
-\generate{
- \file{\jobname.sty}{\from{\jobname.dtx}{package}}
-}
-\endbatchfile
-%%
-%% Copyright (C) 2018 by Erwann Rogard
-%%
-%% This work may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License (LPPL), either
-%% version 1.3c of this license or (at your option) any later
-%% version. The latest version of this license is in the file:
-%%
-%% http://www.latex-project.org/lppl.txt
-%%
-%% This work is "maintained" (as per LPPL maintenance status) by
-%% Erwann Rogard.
-%%
-%% This work consists of the file erw-l3.dtx
-%% and the derived files erw-l3.ins,
-%% erw-l3.pdf and
-%% erw-l3.sty.
-%%
-%%
-%% End of file `erw-l3.ins'.
diff --git a/Master/texmf-dist/source/latex/eso-pic/eso-pic.dtx b/Master/texmf-dist/source/latex/eso-pic/eso-pic.dtx
index 5c7ec360c54..5cdf9141cd7 100644
--- a/Master/texmf-dist/source/latex/eso-pic/eso-pic.dtx
+++ b/Master/texmf-dist/source/latex/eso-pic/eso-pic.dtx
@@ -23,9 +23,9 @@
% \fi
%
% \iffalse
-%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<package>\NeedsTeXFormat{LaTeX2e}[2020-10-01]
%<package>\ProvidesPackage{eso-pic}
-%<package> [2018/04/12 v2.0h eso-pic (RN)]
+%<package> [2020/10/14 v3.0a eso-pic (RN)]
%
%<*driver>
\documentclass[a4paper]{ltxdoc}
@@ -37,7 +37,7 @@
%</driver>
% \fi
%
-% \CheckSum{778}
+% \CheckSum{750}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -151,9 +151,10 @@
% \cs{ClearShipoutPictureFG}
% clears the contents of \cs{ESO@HookIFG}.
%
-% \DescribeMacro{\LenToUnit} Allows a length as parameter to a picture
-% command. Note that this macro is no more necessary when using
-% |\usepackage{picture}|.
+% \DescribeMacro{\LenToUnit} [Allows a length as parameter to a picture
+% command.] Note that this macro exist only for compatibility to older
+% versions of this package. A recent \LaTeX\ version allows dimensions
+% in picture commands.
%
% \DescribeMacro{\gridSetup}
% \cmd{\gridSetup}\oarg{gridunitname}\marg{gridunit}\marg{labelfactor}^^A
@@ -208,18 +209,21 @@
%
% \subsection{The main functionality}
%
-% \begin{macrocode}
-\RequirePackage{atbegshi}
-% \end{macrocode}
% \begin{macro}{\LenToUnit}
% \changes{v1.0d}{2006/07/14}{Using \cmd{\providecommand} instead of
% \cmd{\newcommand} for \cmd{\LenToUnit}}
% \changes{v2.0f}{2015/07/14}{Changed definition for better compatibility
% with package \pkgname{curve2e} suggested by Claudio Beccari.}
+% Only for compatibility
+% \changes{v3.0a}{2020/10/14}{No more used. (RN).}
% \begin{macrocode}
-\providecommand*\LenToUnit[1]{\strip@pt\dimexpr#1*\p@/\unitlength}
+\providecommand*\LenToUnit[1]{#1}
% \end{macrocode}
% \end{macro}
+% \begin{macrocode}
+\newdimen\ESO@tempdima
+\newdimen\ESO@tempdimb
+% \end{macrocode}
% \begin{macro}{\ESO@isMEMOIR}
% Support for the \clsname{memoir} class.
% \begin{macrocode}
@@ -230,20 +234,20 @@
% \begin{macro}{\AtPageUpperLeft}
% \begin{macrocode}
\newcommand\AtPageUpperLeft[1]{%
- \put(0,\LenToUnit{-\ESO@yoffsetI}){#1}%
+ \put(0,-\ESO@yoffsetI){#1}%
}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\AtPageLowerLeft}
% \begin{macrocode}
\newcommand\AtPageLowerLeft[1]{\AtPageUpperLeft{%
- \put(0,\LenToUnit{-\paperheight}){#1}}}
+ \put(0,-\paperheight){#1}}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\AtPageCenter}
% \begin{macrocode}
\newcommand\AtPageCenter[1]{\AtPageUpperLeft{%
- \put(\LenToUnit{.5\paperwidth},\LenToUnit{-.5\paperheight}){#1}}%
+ \put(.5\paperwidth,-.5\paperheight){#1}}%
}
% \end{macrocode}
% \end{macro}
@@ -254,17 +258,17 @@
\ESO@isMEMOIR{%
\renewcommand\AtStockLowerLeft[1]{%
\begingroup
- \@tempdima=-\stockwidth
- \advance\@tempdima\trimedge
- \advance\@tempdima\paperwidth
+ \ESO@tempdima=-\stockwidth
+ \advance\ESO@tempdima\trimedge
+ \advance\ESO@tempdima\paperwidth
\if@twoside\ifodd\c@page\else
- \@tempdima=-\trimedge
+ \ESO@tempdima=-\trimedge
\fi\fi
- \@tempdimb=-\stockheight
- \advance\@tempdimb\paperheight
- \advance\@tempdimb\trimtop
+ \ESO@tempdimb=-\stockheight
+ \advance\ESO@tempdimb\paperheight
+ \advance\ESO@tempdimb\trimtop
\AtPageLowerLeft{%
- \put(\LenToUnit{\@tempdima},\LenToUnit{\@tempdimb}){#1}%
+ \put(\ESO@tempdima,\ESO@tempdimb){#1}%
}%
\endgroup
}
@@ -280,7 +284,7 @@
\ESO@isMEMOIR{%
\renewcommand\AtStockUpperLeft[1]{%
\AtStockLowerLeft{%
- \put(0,\LenToUnit{\stockheight}){#1}%
+ \put(0,\stockheight){#1}%
}%
}%
}{%
@@ -295,7 +299,7 @@
\ESO@isMEMOIR{%
\renewcommand\AtStockCenter[1]{%
\AtStockLowerLeft{%
- \put(\LenToUnit{.5\stockwidth},\LenToUnit{.5\stockheight}){#1}%
+ \put(.5\stockwidth,.5\stockheight){#1}%
}%
}%
}{%
@@ -311,37 +315,37 @@
\newcommand\AtTextUpperLeft[1]{%
\begingroup
\ifodd\c@page
- \@tempdima=\spinemargin
+ \ESO@tempdima=\spinemargin
\else
- \@tempdima=\paperwidth
- \advance\@tempdima-\textwidth
- \advance\@tempdima-\spinemargin
+ \ESO@tempdima=\paperwidth
+ \advance\ESO@tempdima-\textwidth
+ \advance\ESO@tempdima-\spinemargin
\fi
- \@tempdimb=-\uppermargin
+ \ESO@tempdimb=-\uppermargin
\AtPageUpperLeft{%
- \put(\LenToUnit{\@tempdima},\LenToUnit{\@tempdimb}){#1}%
+ \put(\ESO@tempdima,\ESO@tempdimb){#1}%
}%
\endgroup
}
}{%
\newcommand\AtTextUpperLeft[1]{%
\begingroup
- \@tempdima=1in\relax
+ \ESO@tempdima=1in\relax
\if@twoside
\ifodd\c@page
- \advance\@tempdima\oddsidemargin
+ \advance\ESO@tempdima\oddsidemargin
\else
- \advance\@tempdima\evensidemargin
+ \advance\ESO@tempdima\evensidemargin
\fi
\else
- \advance\@tempdima\oddsidemargin
+ \advance\ESO@tempdima\oddsidemargin
\fi
- \@tempdimb=-1in\relax
- \advance\@tempdimb-\topmargin
- \advance\@tempdimb-\headheight
- \advance\@tempdimb-\headsep
+ \ESO@tempdimb=-1in\relax
+ \advance\ESO@tempdimb-\topmargin
+ \advance\ESO@tempdimb-\headheight
+ \advance\ESO@tempdimb-\headsep
\AtPageUpperLeft{%
- \put(\LenToUnit{\@tempdima},\LenToUnit{\@tempdimb}){#1}%
+ \put(\ESO@tempdima,\ESO@tempdimb){#1}%
}%
\endgroup
}
@@ -351,13 +355,13 @@
% \begin{macro}{\AtTextLowerLeft}
% \begin{macrocode}
\newcommand\AtTextLowerLeft[1]{\AtTextUpperLeft{%
- \put(0,\LenToUnit{-\textheight}){#1}}}
+ \put(0,-\textheight){#1}}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\AtTextCenter}
% \begin{macrocode}
\newcommand\AtTextCenter[1]{\AtTextUpperLeft{%
- \put(\LenToUnit{.5\textwidth},\LenToUnit{-.5\textheight}){#1}}}
+ \put(.5\textwidth,-.5\textheight){#1}}}
% \end{macrocode}
% \end{macro}
% \DescribeMacro{\ESO@HookIBG}\DescribeMacro{\ESO@HookIIBG}
@@ -395,6 +399,7 @@
\@ifstar{\g@addto@macro\ESO@HookIIFG}{\g@addto@macro\ESO@HookIFG}}
% \end{macrocode}
% \end{macro}
+% \changes{v3.0a}{2020/10/14}{LaTeX's shipout hooks instead of `atbegshi' (RN).}
% \begin{macro}{\ClearShipoutPictureBG}
% \begin{macro}{\ClearShipoutPicture}
% \begin{macro}{\ClearShipoutPictureFG}
@@ -409,60 +414,53 @@
% \end{macro}
% \end{macro}
% \end{macro}
-% \begin{macro}{\AtBeginShipout}
-% \begin{macro}{\AtBeginShipoutUpperLeft}
-% \begin{macro}{\AtBeginShipoutUpperLeftForeground}
-% (see package \pkgname{atbegshi})
% \changes{v2.0c}{2010/10/06}{bugfix for memoir class
% (reported by YI Hoze)}
% \begin{macrocode}
\ESO@isMEMOIR{%
- \AtBeginShipout{%
- \@tempdima=-\trimedge
- \advance\@tempdima-\paperwidth
- \advance\@tempdima\stockwidth
+ \newcommand*\ESO@MEMOIR@corr{%
+ \ESO@tempdima=-\trimedge
+ \advance\ESO@tempdima-\paperwidth
+ \advance\ESO@tempdima\stockwidth
\if@twoside\ifodd\c@page\else
- \advance\@tempdima2\trimedge
- \advance\@tempdima\paperwidth
- \advance\@tempdima-\stockwidth
+ \advance\ESO@tempdima2\trimedge
+ \advance\ESO@tempdima\paperwidth
+ \advance\ESO@tempdima-\stockwidth
\fi\fi
- \@tempdimb=\ESO@yoffsetI
- \advance\@tempdimb-\trimtop
- \nointerlineskip
- \AtBeginShipoutUpperLeft{%
- \put(\LenToUnit{\@tempdima},\LenToUnit{\@tempdimb}){%
- \ESO@HookIIIBG\ESO@HookIBG\ESO@HookIIBG
- \global\let\ESO@HookIIBG\@empty
- }%
+ \ESO@tempdimb=\ESO@yoffsetI
+ \advance\ESO@tempdimb-\trimtop
+ }
+ \nointerlineskip
+ \AddToHook{shipout/background}{%
+ \ESO@MEMOIR@corr
+ \put(\ESO@tempdima,\ESO@tempdimb){%
+ \ESO@HookIIIBG\ESO@HookIBG\ESO@HookIIBG
+ \global\let\ESO@HookIIBG\@empty
}%
- \AtBeginShipoutUpperLeftForeground{%
- \put(\LenToUnit{\@tempdima},\LenToUnit{\@tempdimb}){%
- \ESO@HookIFG\ESO@HookIIFG\ESO@HookIIIFG
- \global\let\ESO@HookIIFG\@empty
- }%
+ }%
+ \AddToHook{shipout/foreground}{%
+ \ESO@MEMOIR@corr
+ \put(\ESO@tempdima,\ESO@tempdimb){%
+ \ESO@HookIFG\ESO@HookIIFG\ESO@HookIIIFG
+ \global\let\ESO@HookIIFG\@empty
}%
- }
+ }%
}{%
- \AtBeginShipout{%
- \nointerlineskip
- \AtBeginShipoutUpperLeft{%
- \put(0,\LenToUnit{\ESO@yoffsetI}){%
- \ESO@HookIIIBG\ESO@HookIBG\ESO@HookIIBG
- \global\let\ESO@HookIIBG\@empty
- }%
+ \nointerlineskip
+ \AddToHook{shipout/background}{%
+ \put(0,\ESO@yoffsetI){%
+ \ESO@HookIIIBG\ESO@HookIBG\ESO@HookIIBG
+ \global\let\ESO@HookIIBG\@empty
}%
- \AtBeginShipoutUpperLeftForeground{%
- \put(0,\LenToUnit{\ESO@yoffsetI}){%
- \ESO@HookIFG\ESO@HookIIFG\ESO@HookIIIFG
- \global\let\ESO@HookIIFG\@empty
- }%
+ }%
+ \AddToHook{shipout/foreground}{%
+ \put(0,\ESO@yoffsetI){%
+ \ESO@HookIFG\ESO@HookIIFG\ESO@HookIIIFG
+ \global\let\ESO@HookIIFG\@empty
}%
- }
+ }%
}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
% \subsection{The background grid}
% \begin{macrocode}
\RequirePackage{keyval}
@@ -566,9 +564,9 @@
% Result is in \cmd{\@tempcnta}.
% \begin{macrocode}
\newcommand\ESO@div[2]{%
- \@tempdima=#1\relax\@tempdimb=\ESO@gridunit\relax
- \@tempdimb=#2\@tempdimb\divide\@tempdima by \@tempdimb
- \@tempcnta\@tempdima\advance\@tempcnta\@ne}
+ \ESO@tempdima=#1\relax\ESO@tempdimb=\ESO@gridunit\relax
+ \ESO@tempdimb=#2\ESO@tempdimb\divide\ESO@tempdima by \ESO@tempdimb
+ \@tempcnta\ESO@tempdima\advance\@tempcnta\@ne}
% \end{macrocode}
% \end{macro}
% \changes{v1.1c}{2005/12/24}{Remove the disadvantageous check of
@@ -603,7 +601,7 @@
\fi
}%
\ifESO@dvips\def\@tempb{eepic}\else\def\@tempb{epic}\fi
- \def\@tempa{dotted}%\def\ESO@gap{\LenToUnit{6\@wholewidth}}%
+ \def\@tempa{dotted}%\def\ESO@gap{6\@wholewidth}%
\ifx\@tempa\ESO@subgridstyle
\IfFileExists{\@tempb.sty}%
{%
@@ -638,26 +636,26 @@
% \begin{macrocode}
\ESO@div{\paperheight}{\ESO@griddelta}%
\multiput(0,0)(0,\ESO@griddeltaY){\@tempcnta}%
- {\ESO@hline{\LenToUnit{\paperwidth}}}%
+ {\ESO@hline{\paperwidth}}%
% \end{macrocode}
% --- vertical subgrid lines ---
% \begin{macrocode}
\ESO@div{\paperwidth}{\ESO@griddelta}%
- \multiput(0,\LenToUnit{\ESO@yoffsetII})(\ESO@griddelta,0){\@tempcnta}%
- {\ESO@vline{\LenToUnit{\paperheight}}}%
+ \multiput(0,\ESO@yoffsetII)(\ESO@griddelta,0){\@tempcnta}%
+ {\ESO@vline{\paperheight}}%
\ESO@color{\ESO@gridcolor}%
% \end{macrocode}
% --- horizontal grid lines ---
% \begin{macrocode}
\ESO@div{\paperheight}{\ESO@gridDelta}%
\multiput(0,0)(0,\ESO@gridDeltaY){\@tempcnta}%
- {\ESO@Hline{\LenToUnit{\paperwidth}}}%
+ {\ESO@Hline{\paperwidth}}%
% \end{macrocode}
% --- vertical grid lines ---
% \begin{macrocode}
\ESO@div{\paperwidth}{\ESO@gridDelta}%
- \multiput(0,\LenToUnit{\ESO@yoffsetII})(\ESO@gridDelta,0){\@tempcnta}%
- {\ESO@Vline{\LenToUnit{\paperheight}}}%
+ \multiput(0,\ESO@yoffsetII)(\ESO@gridDelta,0){\@tempcnta}%
+ {\ESO@Vline{\paperheight}}%
% \end{macrocode}
% --- horizontal numbers ---
% \changes{v1.1a}{2002/11/09}{Font setting added.}
@@ -668,8 +666,8 @@
\@tempcntb=\@tempcnta\advance\@tempcntb-\@multicnt
\ifnum\@tempcntb>1\relax
\multiply\@tempcntb by \ESO@gridDelta\relax
- \@tempdima=\@tempcntb sp\@tempdima=\ESO@labelfactor\@tempdima
- \@tempcntb=\@tempdima%
+ \ESO@tempdima=\@tempcntb sp\ESO@tempdima=\ESO@labelfactor\ESO@tempdima
+ \@tempcntb=\ESO@tempdima%
\makebox(0,0)[c]{\ESO@colorbox{white}{\the\@tempcntb}}%
\fi}%
% \end{macrocode}
@@ -681,8 +679,8 @@
\@tempcntb=\@tempcnta\advance\@tempcntb-\@multicnt%
\ifnum\@tempcntb>\@tempa\relax
\multiply\@tempcntb by \ESO@gridDelta\relax%
- \@tempdima=\@tempcntb sp\@tempdima=\ESO@labelfactor\@tempdima
- \@tempcntb=\@tempdima
+ \ESO@tempdima=\@tempcntb sp\ESO@tempdima=\ESO@labelfactor\ESO@tempdima
+ \@tempcntb=\ESO@tempdima
\makebox(0,0)[c]{\ESO@colorbox{white}{\the\@tempcntb}}%
\fi
}%
diff --git a/Master/texmf-dist/source/latex/etoc/etoc.dtx b/Master/texmf-dist/source/latex/etoc/etoc.dtx
index a500a3b01de..6809655d298 100644
--- a/Master/texmf-dist/source/latex/etoc/etoc.dtx
+++ b/Master/texmf-dist/source/latex/etoc/etoc.dtx
@@ -2,27 +2,27 @@
% N.B.: this dtx file is NOT for use with \DocInput. The latex source of the
% user manual is not prefixed with percent signs.
%<*none>
-\def\etocdtxtimestamp {Time-stamp: <17-11-2019 at 13:36:39 CET>}%
+\def\etocdtxtimestamp {Time-stamp: <15-05-2020 at 19:18:31 CEST>}%
%</none>
%<*!readme>
%%
%% Package: etoc
-%% Version: 1.09b-2019/11/17
+%% Version: 1.09c-2020/05/15
%% License: LPPL 1.3c
-%% Copyright (C) 2012-2019 Jean-Francois Burnol
+%% Copyright (C) 2012-2020 Jean-Francois Burnol
%% <jfbu at free dot fr>
-%% Copyright (C) 2014-2019 Christine Roemer
+%% Copyright (C) 2014-2020 Christine Roemer
%% <Christine_Roemer at t-online dot de>
%% and collaborators for the translation into German of the documentation
%%
%</!readme>
%<*none>
-\def\etocpkgdate {2019/11/17}
-\def\etocdocdate {2019/11/17}
-\def\etocpkgversion {v1.09b}
+\def\etocpkgdate {2020/05/15}
+\def\etocdocdate {2020/05/15}
+\def\etocpkgversion {v1.09c}
\def\etocpkgdescription {Completely customisable TOCs (JFB)}
-\def\etocDEpkgdate {17.11.2019}% METTRE À JOUR À CHAQUE BUMP!
-\def\etocDEdocdate {17.11.2019}
+\def\etocDEpkgdate {15.05.2020}% METTRE À JOUR À CHAQUE BUMP!
+\def\etocDEdocdate {15.05.2020}
\def\etocDEDEdocdate {09.04.2015}%
\def\etocDEDEpkgversion {v1.08d}%
% Definition of \etocLicense
@@ -33,10 +33,10 @@
\catcode32=13\catcode`\\=12^^Brelax^^A
^^Bfirstofone{^^Bendgroup^^Bdef^^BetocLicense^^A
{% Package: etoc
-% Version: 1.09b-2019/11/17
+% Version: 1.09c-2020/05/15
% License: LPPL 1.3c
-% Copyright (C) 2012-2019 Jean-Francois Burnol <jfbu at free dot fr>
-% Copyright (C) 2014-2019 Christine Roemer <Christine_Roemer at t-online dot de>
+% Copyright (C) 2012-2020 Jean-Francois Burnol <jfbu at free dot fr>
+% Copyright (C) 2014-2020 Christine Roemer <Christine_Roemer at t-online dot de>
% and collaborators for the translation into German of the documentation
%
% This Work may be distributed and/or modified under the
@@ -67,13 +67,13 @@
%<*readme>
<!-- -->
- Source: etoc.dtx (v1.09b-2019/11/17)
+ Source: etoc.dtx (v1.09c-2020/05/15)
Author: Jean-Francois Burnol
Author: Christine Roemer et al. (German tranlation)
Info: Completely customisable TOCs
License: LPPL 1.3c
- Copyright (C) 2012-2019 Jean-Francois Burnol.
- Copyright (C) 2014-2019 Christine Roemer and collaborators for
+ Copyright (C) 2012-2020 Jean-Francois Burnol.
+ Copyright (C) 2014-2020 Christine Roemer and collaborators for
the translation into German of the documentation.
<jfbu at free dot fr> <Christine_Roemer at t-online dot de>
@@ -174,6 +174,11 @@ etoc.pdf, etoc-DE.pdf, etoc.dvi, etoc-DE.dvi.
RECENT CHANGES
==============
+v1.09c \[2020/05/05\]
+---------------------
+
+Syncs with KOMA-script deprecation of `\iftocfeature`.
+
v1.09a, v1.09b \[2019/11/17\]
-----------------------------
@@ -10719,7 +10724,11 @@ Dokumentation erzeugt von der Quelldatei mit dem Stempel
\begin{multicols}{2}
\begin{jfverbatim}
-v1.09a, v1.09b [2019/11/17]^
+v1.09c [2020/05/05]^
+
+ Syncs with KOMA-script deprecation of \iftocfeature.
+
+~v1.09a, v1.09b [2019/11/17]^
Sync with memoir v3.7i which has a better location of the TOC
hyperref anchor. The \etocaftertitlehook can now freely be
@@ -13383,14 +13392,17 @@ v1.09a, v1.09b [2019/11/17]^
\parskip \cftparskip \@nameuse {cfttocbeforelisthook}}
{\@nameuse {cfttocafterlisthook}\endgroup\restorefromonecol}}
% \end{macrocode}
-% placeholder for comments
+% |1.09c| (|2020/05/15|) does an update as KOMA-script has deprecated
+% |\iftocfeature|. Thanks to Bilel Omrani for report. I did not check
+% if cloning of KOMA code required some further updates.
% \begin{macrocode}
+\ifdefined\Iftocfeature\def\etoc@Iftocfeature{\Iftocfeature}\else\def\etoc@Iftocfeature{\iftocfeature}\fi
\def\etocscrartclstyle{%
\etocsettocstyle
{\let\if@dynlist\if@tocleft
\def\@currext{toc}% added 1.07m 2015/01/23
- \iftocfeature {toc}{onecolumn}
- {\iftocfeature {toc}{leveldown}
+ \etoc@Iftocfeature {toc}{onecolumn}
+ {\etoc@Iftocfeature {toc}{leveldown}
{}
{\if@twocolumn \aftergroup \twocolumn \onecolumn \fi }}
{}%
@@ -13398,14 +13410,14 @@ v1.09a, v1.09b [2019/11/17]^
% |1.07k|: next line to do as within current |scrartcl 2013/12/19 v3.12|
% KOMA-Script article class.
% \begin{macrocode}
- \iftocfeature {toc}{numberline}{\def \nonumberline {\numberline {}}}{}%
+ \etoc@Iftocfeature {toc}{numberline}{\def \nonumberline {\numberline {}}}{}%
\tocbasic@listhead {\listoftocname}%
\begingroup \expandafter \expandafter \expandafter
\endgroup \expandafter
\ifx
\csname microtypesetup\endcsname \relax
\else
- \iftocfeature {toc}{noprotrusion}{}
+ \etoc@Iftocfeature {toc}{noprotrusion}{}
{\microtypesetup {protrusion=false}%
\PackageInfo {tocbasic}%
{character protrusion at toc deactivated}}%
@@ -13772,7 +13784,7 @@ v1.09a, v1.09b [2019/11/17]^
Grave accent \` Left brace \{ Vertical bar \|
Right brace \} Tilde \~}
-\CheckSum{3506}%
+\CheckSum{3516}%
\csname check@checksum\endcsname
\Finale
diff --git a/Master/texmf-dist/source/latex/euclideangeometry/euclideangeometry.dtx b/Master/texmf-dist/source/latex/euclideangeometry/euclideangeometry.dtx
index 5710287c700..af615d4b55e 100644
--- a/Master/texmf-dist/source/latex/euclideangeometry/euclideangeometry.dtx
+++ b/Master/texmf-dist/source/latex/euclideangeometry/euclideangeometry.dtx
@@ -45,7 +45,7 @@ This work consists of files:
%<package>\ProvidesPackage{euclideangeometry}%
%<readme>File README.txt for package euclideangeometry
%<*package|readme>
- [2020-02-12 v.0.1.5 Extension package for curve2e]
+ [2020-04-15 v.0.1.8 Extension package for curve2e]
%</package|readme>
%<*driver>
\documentclass{ltxdoc}\errorcontextlines=100
@@ -154,7 +154,7 @@ g\raisebox{-0.715ex}{\kern-0.26em u}\kern-0.13em\I\kern-0.14em t}\xspace}
% installed with your updated complete \TeX system installation.
% Please refer to the user manual before using this package.
-% \CheckSum{1108}
+% \CheckSum{1296}
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\StopEventually{}
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -215,7 +215,8 @@ g\raisebox{-0.715ex}{\kern-0.26em u}\kern-0.13em\I\kern-0.14em t}\xspace}
% is |\Pbox| and it produces a box containing the label in math format. By
% default the point label is typeset with the math font variant produced
% by command |\mathsf|, but the macro is sufficiently versatile to allow
-% other settings; It accepts several optional arguments, therefore it syntax is particular:
+% other settings; it accepts several optional arguments, therefore it
+% syntax is particular:
%\begin{ttsyntax}
%\cs{Pbox}\parg{coordinates}\oarg{alignment}\marg{label}\oarg{diameter}\meta{$\star$}\aarg{angle}
%\end{ttsyntax}
@@ -228,7 +229,9 @@ g\raisebox{-0.715ex}{\kern-0.26em u}\kern-0.13em\I\kern-0.14em t}\xspace}
% specification, the couple \texttt{cc} is assumed; most often than
% not, the label position becomes such that when the user reviews the
% document drafts, s/he understands immediately that s/he forgot to specify
-% some reasonable \meta{alignment} codes. Think of the \meta{alignment}
+% some reasonable \meta{alignment} codes; in any case the \texttt{cc} code
+% works fine to just put the dot of a specified diameter but with an empty
+% label. Think of the \meta{alignment}
% letters as the position of the reference point with respect to the
% the \meta{label} optical center. The optional \meta{angle} argument
% produces a rotation of the whole label by that angle; it may be used
@@ -238,23 +241,27 @@ g\raisebox{-0.715ex}{\kern-0.26em u}\kern-0.13em\I\kern-0.14em t}\xspace}
%
% The optional asterisk draws a frame around the \emph{label}. Notice that
% the separator between the visible or the invisible frame and the box
-% contents varies according the the fact the the \meta{alignment}
+% contents varies according the the fact that the \meta{alignment}
% specification contains just one or two letter codes; this is useful,
% because the diagonal position of the label should be optically equal
-% to the gap that exists between the reference point and the \meta{label}
+% to the gap that exists between the reference point and the \meta{label}
% box.
%
% If the \meta{diameter} is zero, no dot is drawn, the whole \meta{label}
% is typeset with the |\mathit| math font; otherwise only the first symbol
-% of a math expression si typeset in sans serif. The presence of subscripts
+% of a math expression is typeset in sans serif. The presence of subscripts
% makes the labels appear more distant from their reference point; the same
% is true when math symbols, even without subscripts, are used, because
-% of the oblique nature of the math letters alphabet.
+% of the oblique nature of the math ‘letters’ alphabet.
%
% If some text has to be printed as a label, it suffices to surround it
% with dollar signs, that switch back to text mode when the default mode
% is the math one. With this kind of textual labels it might be convenient
% to use the optional asterisk to frame the text.
+% The final optional argument \meta{angle} (to be delimited with the
+% \texttt{<~>} signs) specifies the inclination of the label with respect
+% to the horizontal line; it is useful, for example to set a label along
+% a sloping line.
% \begin{macrocode}
\providecommand\Pbox{}
\newlength\PbDim
@@ -577,6 +584,241 @@ g\raisebox{-0.715ex}{\kern-0.26em u}\kern-0.13em\I\kern-0.14em t}\xspace}
\let\MiddlePointOf\SegmentCenter
% \end{macrocode}
%
+% Some other macros are needed to solve certain triangle problems;
+% one of such macros is the one allows to determine the length of one
+% leg of a right triangle by knowing the lengths of the hypothenuse
+% and the other leg. The syntax is the following:
+%\begin{ttsyntax}
+%\cs{LegFromHypotenuse}\meta{hypothenuse} AndOtherLeg\meta{leg1} to\meta{leg2}
+%\end{ttsyntax}
+% where the three parameters may be macros, especially the last one;
+% all of them contina scalar values.
+%
+% \begin{macrocode}
+\def\LegFromHypotenuse#1AndOtherLeg#2to#3{%
+ \edef#3{\fpeval{sqrt(#1**2-#2**2)}}}
+% \end{macrocode}
+%
+% Another useful macro determines the two intersections of a line with
+% a circumference if they exist; otherwise it issues a warning and sets
+% both output values to vector \texttt{0,0}, which, of course, is wrong,
+% but it allows to go on with typesetting, although with non sense results.
+% Warnings do not stop the compilation program, therefore their message
+% goes to the \file{.log} file and the user might not notice it; but
+% since the results are probably absurd, s/he certainly notices this
+% fact and looks for messages; the user, therefore, who has carefully
+% read this user manual, immediately looks onto the \file{.log} file
+% and realises the reason of the wrong results. A similar approach
+% is used for the macro that determines the intersection of two circles;
+% see below
+% The syntax of this macro is the following:
+%\begin{ttsyntax}
+%\cs{IntersectionsOfLine}\parg{point}\parg{direction} WithCircle\parg{center}\marg{radius} to\meta{int1} and\meta{int2}
+%\end{ttsyntax}
+% where \meta{point} and \meta{direction} are the line parameters
+% that can be explicit complex values or macros; \meta{center} is
+% the circumference explicit complex value, or a macro, containing
+% the center coordinates; \meta{radius} is the scalar explicit or
+% macro radius length; The intersection points \meta{int1} and
+% \meta{ind2} are supposed to be macros that get defined with the
+% intersection point coordinates; \meta{int1} is the first intersection
+% that is determined along the line \emph{direction}. Please notice the
+% different first part of the macro name \texttt{IntersectionsOfLine}
+% compared to the macro that determines the intersection of two lines
+% \texttt{IntersectionOfLines}: two intersections and one line vs. one
+% intersection with two lines.
+% \begin{macrocode}
+\def\IntersectionsOfLine(#1)(#2)WithCircle(#3)#4to#5and#6{%
+\CopyVect#3 to\C \edef\R{#4}
+\CopyVect#1to\Pu \CopyVect#2to\Pd
+\Circlewithcenter\C radius\R
+\segment(\Pu)(\Pd)\SegmentArg(\Pu)(\Pd)to\Diru
+\edef\Dird{\fpeval{\Diru+90}}\Pbox(\C)[b]{C}[2]
+\IntersectionOfLines(\Pu)(\Diru:1)and(\C)(\Dird:1)to\Int
+\SegmentLength(\C)(\Int)to\A
+\fptest{\A > \R}{\PackageError{euclideangeometry}%
+{Distance of line \A\space larger than radius \R. No intersections}%
+{Check your data; correct and retry}}{%
+\LegFromHypotenuse\R AndOtherLeg\A to\B
+\AddVect\Int and\Diru:-\B to\Pt \edef#5{\Pt}
+\SymmetricalPointOf\Pt respect\Int to\Pq \edef#6{\Pq}
+}}
+% \end{macrocode}
+%
+% Another useful macro determines the point \meta{p2} symmetric
+% to a given point \meta{p1} with respect to a given segment the
+% end points of which are \meta{Segm1} and \meta{Segm2}:
+%\begin{ttsyntax}
+%\cs{Segment}\parg{Segm1}\parg{Segm2}SymmetricPointOf\marg{p1} to\meta{p2}
+%\end{ttsyntax}
+% where, as usual, the input data may be explicit or macro defined
+% coordinates, while the output result should be a macro name.
+% \begin{macrocode}
+\def\Segment(#1)(#2)SymmetricPointOf#3to#4{%
+\SegmentArg(#1)(#2)to\Sanguno\edef\Sangdue{\fpeval{\Sanguno+90}}
+\IntersectionOfLines(#1)(\Sanguno:1)and(#3)(\Sangdue:1)to\Smed
+\SymmetricalPointOf#3respect\Smed to#4\ignorespaces}
+% \end{macrocode}
+%
+% This useful macro draws a circle given its \meta{center} and the
+% coordinates of the \meta{point} which the circumference should pass
+% through. The syntax is:
+%\begin{ttsyntax}
+%\cs{CircleThrough}\parg{[point}WithCenter\marg{center}
+%\end{ttsyntax}
+% As usual, the parameters are all explicit or macro defined complex
+% numbers.
+% \begin{macrocode}
+\def\CircleThrough#1WithCenter#2{%
+\SegmentLength(#1)(#2)to\Radius
+\Circlewithcenter#2radius\Radius}
+% \end{macrocode}
+% The above macro is the building block for a simple macro that draws
+% two circles that cross at a given point; but it is so simple that
+% it is not worth defining a macro: if the user wants to try his/her
+% ability, s/he may define:
+%\begin{flushleft}\obeylines
+%| \NewDocumentCommand{r() r() r()}{%|
+%| \CircleThrough#3 WithCenter{#1}|
+%| \CircleThrough#3 WithCenter{#2}\ignorespaces}|
+%\end{flushleft}
+% where \cs{ignorespaces} may be superfluous, but is always a safety action
+% when defining commands to be used within the \amb{picture} environment.
+% In any case see example~15 in \file{euclideangeometry-man.pdf}
+%^^A\ref{fig:two-intersecting-circles}.
+%
+% If it is necessary to find the intersections of two circles that
+% do not share a previously known point; we can use the following
+% macro. Analytically given the equations of two circumferences,
+% it is necessary to solve a system of two second degree equations
+% the processing of which ends up with a second degree polynomial
+% that might have real roots (the coordinates of the intersection
+% points), or two coincident roots (the circles are tangent), or
+% complex roots (the circles do not intersect), or they may be
+% indefinite (the two circles heve the same center and the same
+% radii). Let us exclude the last case, although it would be trivial
+% to create the macro with a test that controls such situation. But
+% even the analysis of the discriminant of the second degree equation
+% requires a complicated code.
+%
+% On the opposite a simple drawing of the two circles, with centers
+% $C_1$ and $C_2$ and radii $R_1$ and $R_2$, with the centers distance
+% of $ a= |C_1-C_2|$, allows to understand that in order to have
+% intersections: $(\alpha)$ if $a\leq \max(R_1,R_2)$ (the center
+% of a circle is contained within the other one) then it must be
+% $ a \geq |R_1 - R_2|$, where the ‘equals’ sign applies when the
+% circles are internally tangent; $(\beta)$ otherwise
+% $a \geq \max(R_1,R_2)$ and it must be $a \leq R_1+R_2$ , where
+% the ‘equals’ sign applies when the circles are externally tangent.
+% In conclusion in any case il the range $|R_1-R_2|\leq a\leq R_1+R_2$
+% is where the two circles intersect, while outside this distance
+% range the circles do not intersect.
+%
+% For simplicity let us assume that $R_1 \geq R_2$; the macro can
+% receive the circle data in any order, but the macro very easily
+% switches their data so that circle number~1 is the one with larger
+% radius. If the distance $a$ is outside the allowed range, there
+% are no intersections, therefore a warning message is output and the
+% intersection point coordinates are both set to \texttt{0,0}, so that
+% processing continues with non sense data; the remaining geometric
+% construction based on such intersection points might continue with
+% other error messages or to absurd results; a string message to the
+% user who, having read the documentation, understand the problem and
+% provides for.
+%
+% The new macro has the following syntax:
+%\begin{ttsyntax}
+%\cs{TwoCirclesIntersections}\parg{C1}\parg{C2}withradii\marg{R1} and\marg{R2} to\meta{P1} and\meta{P2}
+%\end{ttsyntax}
+% where the symbols in input may be macros or explicit numerical
+% values; the output point coordinates \meta{P1} and \meta{P2}
+% should be definable single tokens, therefore the surrounding
+% braces are not necessary.
+% \begin{macrocode}
+\def\TwoCirclesIntersections(#1)(#2)withradii#3and#4to#5and#6{%
+ \fptest{#3 >=#4}{%
+ \edef\Cuno{#1}\edef\Cdue{#2}%
+ \edef\Runo{#3}\edef\Rdue{#4}%
+ }{%
+ \edef\Cdue{#2}\edef\Cuno{#2}%
+ \edef\Rdue{#3}\edef\Runo{#4}%
+ }
+% \end{macrocode}
+% Above we switched the circle data so as to be sure that symbols relating
+% to circle ‘one’ refer to the circle with larger (or equal) radius.
+% Now we define the centers distance in macro \cs{A}; the test if \cs{A}
+% lays in the correct range, otherwise we output a warning message.
+% \begin{macrocode}
+ \SegmentLength(\Cuno)(\Cdue)to\A
+ \edef\TCIdiffR{\fpeval{\Runo-\Rdue}}\edef\TCIsumR{\fpeval{\Runo+\Rdue}}
+ \fptest{\TCIdiffR > \A || \A > \TCIsumR}{%
+ \edef#5{0,0}\edef#6{0,0}% Valori assurdi se i cerchi non si intersecano
+ \PackageWarning{TestFP}{%
+ ***********************************\MessageBreak
+ Circles do not intersect \MessageBreak
+ Check centers and radii and retry \MessageBreak
+ Both intersection point are set to \MessageBreak
+ (0,0) therefore expect errors \MessageBreak
+ ***********************************\MessageBreak}%
+ }{%
+% \end{macrocode}
+% Here we are within the correct range and we proceed with the
+% calculations. We take as a temporary reference the segment
+% that joins the centers. The common chord that joins the
+% intersection points is perpendicular to such a segment crossing
+% it by a distance $c$ form $C_1$, and, therefore by a distance
+% $a-c$ from $C_2$; this chord forms two isosceles triangles with the
+% centers; the above segment bisects such triangles, forming four right
+% triangles; their hypotenuses equal the radii of the respective
+% circles; their bases $h$ are all equal to half the chord; Pythagoras'
+% theorem allows us to write:
+%\[
+%\left\{
+% \begin{aligned}
+% h^2 &= R_1^2 - c^2\\
+% h^2 &= R_2^2 - (a-c)^2
+% \end{aligned}
+%\right.
+%\]
+% Solving for $c$, we get:
+%\[\left\{
+%\begin{aligned}
+%c &= \frac{R_1^2 - R_2^2 + a^2 }{2a}\\
+%h &= \sqrt{R_1^2 -c^2}
+%\end{aligned}
+%\right.
+%\]
+% \begin{macrocode}
+ \SegmentArg(\Cuno)(\Cdue)to\Acompl
+ \SubVect\Cuno from\Cdue to \Cdue
+ \edef\CI{\fpeval{(\Runo^2 - \Rdue^2 +\A^2)/(2*\A)}}
+ \edef\H{\fpeval{sqrt(\Runo^2 - \CI^2)}}
+ \CopyVect\CI,-\H to\Puno
+ \CopyVect\CI,\H to\Pdue
+% \end{macrocode}
+% Now we do not need anymore the chord intersection distance \cs{CI}
+% any more, so we can use for other tasks, and we create a vector with
+% absolute coordinates; We then add the rotated vector corresponding
+% to the base \cs{H} so as to get the absolute chord extrema \cs{PPuno}
+% and \cs{PPdue}.
+% \begin{macrocode}
+ \MultVect\CI,0 by\Acompl:1 to\CI
+ \AddVect\Cuno and\CI to\CI
+ \MultVect\Puno by\Acompl:1 to\PPunorot
+ \AddVect\PPunorot and \Cuno to \PPuno
+ \MultVect\Pdue by\Acompl:1 to\PPduerot
+ \AddVect\PPduerot and \Cuno to \PPdue
+ \edef#5{\PPuno}\edef#6{\PPdue}%
+ }%
+}
+% \end{macrocode}
+% It may be noticed that the first intersection point, assigned to
+% parameter |#5| is the one found along the orthogonal direction
+% to the vector form $C_1$ to $C_2$, obtained by a rotation of
+% $90^\circ$ counterclockwise.
+% The whole construction of the geometry described above is shown
+% in figure~16 in the user manual \file{euclideangeometry-man.pdf}.
+%
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Triangle special points}
%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1195,7 +1437,7 @@ g\raisebox{-0.715ex}{\kern-0.26em u}\kern-0.13em\I\kern-0.14em t}\xspace}
% The overall macro that executes all the passages described in
% the above enumeration follows; the reader can easily recognise
% the various steps, since the names of the macros are self
-% explanatory; the $G_i$ point names are the symmetrical ones
+% explanatory; the $S_i$ point names are the symmetrical ones
% to the first focus $F$; the $M_i$ points are the centers of
% symmetry; the $F'$ point is the second focus; the $T_i$ points
% are the tangency points. The macro |\EllipseWithFOcus| has the
@@ -1225,26 +1467,26 @@ g\raisebox{-0.715ex}{\kern-0.26em u}\kern-0.13em\I\kern-0.14em t}\xspace}
\IntersectionOfLines(\Pd)(\Au:1)and(\F)(\fpeval{\Au+90}:1)to\Mu
\IfBooleanTF{#1}{\Pbox(\Mt)[br]{M_3}[1.5pt]\Pbox(\Md)[t]{M_2}[1.5pt]
\Pbox(\Mu)[b]{M_1}[1.5pt]}{}
-\SymmetricalPointOf\F respect\Mu to\Gu
-\IfBooleanTF{#1}{\Pbox(\Gu)[l]{G_1}[1.5pt]}{}
-\SymmetricalPointOf\F respect \Md to\Gd
-\IfBooleanTF{#1}{\Pbox(\Gd)[t]{G_2}[1.5pt]}{}
-\SymmetricalPointOf\F respect \Mt to\Gt
-\IfBooleanTF{#1}{\Pbox(\Gt)[r]{G_3}[1.5pt]}{}
-\IfBooleanTF{#1}{\ThreePointCircle*(\Gu)(\Gd)(\Gt)}%
- {\ThreePointCircle(\Gu)(\Gd)(\Gt)}
+\SymmetricalPointOf\F respect\Mu to\Su
+\IfBooleanTF{#1}{\Pbox(\Su)[l]{S_1}[1.5pt]}{}
+\SymmetricalPointOf\F respect \Md to\Sd
+\IfBooleanTF{#1}{\Pbox(\Sd)[t]{S_2}[1.5pt]}{}
+\SymmetricalPointOf\F respect \Mt to\St
+\IfBooleanTF{#1}{\Pbox(\St)[r]{S_3}[1.5pt]}{}
+\IfBooleanTF{#1}{\ThreePointCircle*(\Su)(\Sd)(\St)}%
+ {\ThreePointCircle(\Su)(\Sd)(\St)}
\CopyVect\C to\Fp \Pbox(\Fp)[l]{F'}[1.5pt]
\IfBooleanTF{#1}{%
-\Dotline(\F)(\Gt){2}[1.5pt]
-\Dotline(\F)(\Gd){2}[1.5pt]
-\Dotline(\F)(\Gu){2}[1.5pt]}{}
-\IntersectionOfSegments(\Pu)(\Pt)and(\Fp)(\Gt)to\Tt
-\IntersectionOfSegments(\Pu)(\Pd)and(\Fp)(\Gd)to\Td
-\IntersectionOfSegments(\Pd)(\Pt)and(\Fp)(\Gu)to\Tu
+\Dotline(\F)(\St){2}[1.5pt]
+\Dotline(\F)(\Sd){2}[1.5pt]
+\Dotline(\F)(\Su){2}[1.5pt]}{}
+\IntersectionOfSegments(\Pu)(\Pt)and(\Fp)(\St)to\Tt
+\IntersectionOfSegments(\Pu)(\Pd)and(\Fp)(\Sd)to\Td
+\IntersectionOfSegments(\Pd)(\Pt)and(\Fp)(\Su)to\Tu
\IfBooleanTF{#1}{\Pbox(\Tu)[l]{T_1}[1.5pt]
\Pbox(\Td)[b]{T_2}[1.5pt]
\Pbox(\Tt)[tl]{T_3}[1.5pt]
-\Dashline(\Fp)(\Gu){1}\Dashline(\Fp)(\Gd){1}\Dashline(\Fp)(\Gt){1}}{}
+\Dashline(\Fp)(\Su){1}\Dashline(\Fp)(\Sd){1}\Dashline(\Fp)(\St){1}}{}
\DistanceAndDirOfVect\Fp minus\Tt to\DFp and\AFu
\DistanceAndDirOfVect\F minus\Tt to\DF and\AF
\SegmentCenter(\F)(\Fp)to\CE \Pbox(\CE)[b]{C}[1.5pt]
diff --git a/Master/texmf-dist/source/latex/euflag/euflag.dtx b/Master/texmf-dist/source/latex/euflag/euflag.dtx
index 83dfd31f136..07281f8ec7b 100644
--- a/Master/texmf-dist/source/latex/euflag/euflag.dtx
+++ b/Master/texmf-dist/source/latex/euflag/euflag.dtx
@@ -1,9 +1,9 @@
% \iffalse meta-comment
%
% Transformed from euflag.xml by ClassPack db2dtx.xsl
-% version 1.10 (2019-01-22) on Sunday 3 February 2019 at 21:19:20
+% version 1.19 (2020-05-19) on Friday 22 May 2020 at 23:43:47
%
-% euflag.dtx is copyright © 2019 by Peter Flynn <peter@silmaril.ie>
+% euflag.dtx is copyright © 2019-2020 by Peter Flynn <peter@silmaril.ie>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -26,16 +26,16 @@
% \fi
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[2016/02/01]
-%<package>\ProvidesPackage{euflag}[2019/02/02 v0.4
-%<package> European Union Flag]
+%<package>\ProvidesPackage{euflag}[2020/05/22 v0.8
+%<package> European Union Flag]
%<*driver>
\RequirePackage{fix-cm}% included by default.
-\PassOptionsToPackage{svgnames}{xcolor}% xcolor or hyperref in use
+\PassOptionsToPackage{svgnames}{xcolor}% xcolor/dox/hyperref implied
\documentclass[12pt]{ltxdoc}
%%
%% Packages added for documentation
%%
-\usepackage{dox}% included by default. (0)
+\usepackage{dox}% used by default. (0)%
\makeatletter
\doxitem[idxtype=attribute]{Attribute}{CPK@attribute}{attributes}
\makeatother
@@ -64,9 +64,15 @@
\doxitem[idxtype=error]{Error}{CPK@error}{errors}
\makeatother
\makeatletter
+ \doxitem[idxtype=field]{Field}{CPK@field}{fields}
+ \makeatother
+ \makeatletter
\doxitem[idxtype=file]{File}{CPK@file}{files}
\makeatother
\makeatletter
+ \doxitem[idxtype=font]{Font}{CPK@font}{fonts}
+ \makeatother
+ \makeatletter
\doxitem[idxtype=function]{Function}{CPK@function}{functions}
\makeatother
\makeatletter
@@ -85,7 +91,10 @@
\doxitem[idxtype=package]{Package}{CPK@package}{packages}
\makeatother
\makeatletter
- \doxitem[idxtype=progvar]{Prog}{CPK@prog}{progvars}
+ \doxitem[idxtype=variable]{Variable}{CPK@variable}{variables}
+ \makeatother
+ \makeatletter
+ \doxitem[idxtype=parameter]{Parameter}{CPK@parameter}{parameters}
\makeatother
\makeatletter
\doxitem[macrolike,idxtype=switch]{Switch}{CPK@switch}{switches}
@@ -97,14 +106,11 @@
\doxitem[idxtype=typeface]{Typeface}{CPK@typeface}{typefaces}
\makeatother
\makeatletter
- \doxitem[idxtype=font]{Font}{CPK@font}{fonts}
- \makeatother
- \makeatletter
\doxitem[macrolike,idxtype=box]{Box}{CPK@box}{boxes}
\makeatother
\newcommand{\LabelFont}[2][\relax]{\strut
{\fontencoding\encodingdefault
- \fontfamily{lmtt}\fontseries{lc}#1\selectfont#2}\space}
+ \fontfamily{lmtt}\fontseries{lc}#1\selectfont#2}\space}
\makeatletter
\let\CPK@macro\macro\let\CPK@endmacro\endmacro
\makeatother
@@ -132,51 +138,65 @@
\def\PrintPackageName#1{\LabelFont[\fontfamily{lmss}]{#1}}
\def\PrintSwitchName#1{\LabelFont{#1}}
\def\PrintTemplateName#1{\LabelFont[\bfseries]{#1}}
-%% fontenc omitted: conflicts with fontspec (3)
-%% inputenc omitted: conflicts with fontspec (5)
-\usepackage{fontspec}% a part/@conformance='xelatex' was detected. (6)
-\usepackage{libertine}% requested by author (26)
-\usepackage[scaled=0.9]{raleway}% requested by author (27)
+ \def\PrintVariableName#1{\LabelFont[\ttfamily]{#1}}
+ \def\PrintParameterName#1{\LabelFont[\ttfamily]{#1}}
+ \def\PrintFieldName#1{\LabelFont[\ttfamily]{#1}}
+%% fontenc omit: conflict: fontspec (3)
+%% inputenc omit: conflict: fontspec (6)
+\usepackage{fontspec}% part/@conformance=xelatex detected. (7)%
+\usepackage{libertine}% requested by author (27)%
+\usepackage[scaled=0.9]{raleway}% requested by author (28)%
\renewcommand{\textsc}[1]{{\smaller\MakeTextUppercase{#1}}}
-\usepackage{mflogo}% included by default. (34)
-\usepackage[british]{babel}% included by default. (39)
+\usepackage{mflogo}% used by default. (35)%
+\usepackage[british]{babel}% used by default. (40)%
\usepackage[backend=biber,doi=true,
- isbn=true,url=true,uniquename=false,style=apa]{biblatex}% a bibliography/@arch='biblatex' was detected. (40)
+ isbn=true,url=true,uniquename=false,style=apa]{biblatex}% bibliography/@arch=biblatex detected. (41)%
\makeatletter
- \@ifpackagewith{babel}{british}{%
- \DeclareLanguageMapping{british}{british-apa}}{\relax}
+ \AtBeginDocument{%
+ \setlength{\bibitemsep}{1ex}%
+ \setlength{\bibnamesep}{1.5\itemsep}%
+ \defbibheading{shortbib}[References]%
+ {\section{#1}}}
+ \@ifpackagewith{babel}{british}{%
+ \DeclareLanguageMapping{british}%
+ {british-apa}}{\relax}
\makeatother
- \setlength{\bibnamesep}{1.5\itemsep}
\makeatletter
\providetoggle{blx@skipbiblist}
\makeatother
-\usepackage{csquotes}% a bibliography/@arch='biblatex' was detected. (41)
-\usepackage{array}% requested by author (44)
-\usepackage{calc}% included by default. (47)
+\usepackage{array}% requested by author (46)%
+\usepackage{calc}% used by default. (49)%
\makeatletter
{\scriptsize
\global\advance\@totalleftmargin by1em
\global\advance\MacroIndent by.5em}
\makeatother
-\usepackage{ccaption}% included by default. (49)
+\usepackage{ccaption}% used by default. (52)%
\captionnamefont{\bfseries}
\captionstyle{\raggedright}
-\usepackage{draftwatermark}% requested by author (52)
-\usepackage[inline]{enumitem}% requested by author (53)
+\usepackage[inline]{enumitem}% requested by author (56)%
\setlist[description]{style=unboxed}
\setlist[itemize]{leftmargin=2em}
\setlist[enumerate]{leftmargin=2em}
\newlist{inlineenum}{enumerate*}{1}
\setlist[inlineenum,1]{label=\emph{\alph*}),
- itemjoin={{; }},itemjoin*={{, and }}}
-\usepackage{fancybox}% use of 'note' was detected (54)
-\usepackage{fancyvrb}% use of 'bibliography' was detected (57)
-\usepackage{relsize}% use of 'acronym' was detected (61)
-\usepackage{textcase}% included by default. (64)
+ itemjoin={{; }},itemjoin*={{; and }}}
+\usepackage{relsize}% use of 'acronym' detected (64)%
+\usepackage{textcase}% used by default. (67)%
+\usepackage{float}% used by default. (69)%
+ \renewcommand{\topfraction}{.85}
+ \renewcommand{\bottomfraction}{.7}
+ \renewcommand{\textfraction}{.15}
+ \renewcommand{\floatpagefraction}{.66}
+ \renewcommand{\dbltopfraction}{.66}
+ \renewcommand{\dblfloatpagefraction}{.66}
+ \setcounter{topnumber}{9}
+ \setcounter{bottomnumber}{9}
+ \setcounter{totalnumber}{20}
+ \setcounter{dbltopnumber}{9}
\usepackage[a4paper,left=30mm,top=25mm,
- textwidth=150mm,textheight=225mm]{geometry}% included by default. (67)
-\usepackage{graphicx}% a part/@conformance='xelatex' was detected. (71)
-\usepackage{listings}% use of 'programlisting' was detected (78)
+ textwidth=150mm,textheight=225mm,headheight=15pt]{geometry}% used by default. (71)%
+\usepackage{listings}% use of 'programlisting' detected (83)%
\lstdefinelanguage{dummy}
{morekeywords={dummy}}
\lstdefinelanguage{Makefile}
@@ -209,7 +229,8 @@
\lstdefinelanguage{bash}
{morestring=[s]{[]},morekeywords={exit,logout,yes,no,@,
password,ssh,URL,cd,dvips,latex,ls,makeindex,man,mkdir,
- pdflatex,sudo,texconfig,texdoc,updmap,xelatex}}
+ pdflatex,sudo,texconfig,texdoc,updmap,xelatex,biber,
+ latexmk,bibtex}}
\makeatother
\lstdefinelanguage{APA}[]{XML}
@@ -334,6 +355,7 @@
{—}{{---}}1
{’}{{'}}1
{…}{{\dots}}1
+ {➝}{{$leftarrow$}}1
{⮠}{{$\hookleftarrow$}}1
{␣}{{\textvisiblespace}}1,
keywordstyle=\color{DarkGreen}\bfseries,
@@ -344,19 +366,19 @@
showstringspaces=false,
columns=fullflexible,
keepspaces=true}
-\usepackage{makeidx}% included by default. (80)
+\usepackage{makeidx}% used by default. (85)%
\makeindex
-\usepackage{nicefrac}% requested by author (85)
+\usepackage{nicefrac}% requested by author (91)%
\def\textonehalf{\ensuremath{\nicefrac12}}
-\usepackage{parskip}% requested by author (87)
-\usepackage{sectsty}% requested by author (91)
- \allsectionsfont{\sffamily}
+\usepackage{parskip}% requested by author (93)%
+\usepackage{sectsty}% requested by author (97)%
+ \allsectionsfont{\sffamily\raggedright}
\renewcommand*{\descriptionlabel}[1]{\hspace\labelsep
\sffamily\bfseries #1}
-\usepackage[normalem]{ulem}% use of 'link' was detected (97)
-\usepackage{url}% requested by author (98)
+\usepackage[normalem]{ulem}% use of 'link' detected (103)%
+\usepackage{url}% requested by author (104)%
\AtBeginDocument{\urlstyle{tt}}
-\usepackage{varioref}% use of 'xref' was detected (101)
+\usepackage{varioref}% use of 'xref' detected (107)%
\vrefwarning
\labelformat{appendix}{Appendix~#1}
\makeatletter
@@ -373,24 +395,22 @@
page}
\def\reftextafter{on the
\reftextvario{next}{following} page}
-\usepackage{xcolor}% included by default. (109)
+\usepackage{xcolor}% used by default. (115)%
\makeatletter
\@ifundefined{T}{%
- \newcommand{\T}[2]{{\fontencoding{T1}\selectfont#2}}}{}
+ \newcommand{\T}[2]{{\fontencoding{T1}%
+ \selectfont#2}}}{}
\makeatother
-\usepackage{menukeys}% use of 'guimenu' was detected (112)
- \renewmenumacro{\menu}[>]{roundedmenus}
- \renewmenumacro{\directory}[/]{hyphenatepathswithfolder}
- \renewmenumacro{\keys}{shadowedroundedkeys}
-\usepackage{classpack}% included by default. (114)
-\usepackage{euflag}[2019/02/02]% added by specification
+\usepackage{classpack}[2020/05/19]% used by default. (120)%
+\usepackage{guit}% requested by author (9999)%
+\usepackage{euflag}[2020/05/22]% added by spec
\newcommand{\classorpackage}{package}
\addbibresource{euflag.bib}
\setmonofont[Scale=MatchLowercase]{zcoN}
\allsectionsfont{\sffamily}
%
%%
-%% Settings for docstrip and latexdoc
+%% Settings for docstrip and ltxdoc
%%
\EnableCrossrefs
\CodelineIndex
@@ -401,24 +421,28 @@
%</driver>
% \fi
%
-% \CheckSum{78}
+% \CheckSum{94}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
%
+% \changes{v0.8}{2020/05/22}{Reference update: Added missing reference to Claudio's paper.}
+% \changes{v0.7}{2020/05/16}{Regression release: 1) Updated to use ClassPack 1.19; 2) Switched all conformance attributes on revision dates to YYYY-MM-DD.}
+% \changes{v0.6}{2020/04/01}{Maintenance release: 1) Updated to ClassPack 1.18; 2) Switched all conformance attributes on revision dates to YYYY-MM-DD.}
+% \changes{v0.5}{2019/07/24}{Separated stars from flag and added baseline option: 1) Made the ring of stars a separate macro so that they can be used on their own as well as in the flag.; 2) Added a baseline package option to align the bottom star with the text, and a command option to do it on a per-command basis..}
% \changes{v0.4}{2019/02/02}{Changed the star: Changed from the bbdingFiveStar to the amssymbbigstar command..}
% \changes{v0.3}{2019/02/02}{Mods to ClassPack: Added switch in db2dtx.xsl to detect the use of a package in its own documentation (as here) and code around the PassOptionsToPackage for svgnames on xcolor, which was causing an Option Clash error..}
% \changes{v0.2}{2019/02/01}{Works in table cells: Fixed bug (a vfill) that was crashing (well, locking up) \LaTeX{} when euflag was used in a table cell..}
@@ -427,63 +451,69 @@
% \GetFileInfo{euflag.dtx}
%
% \DoNotIndex{\@,\@@par,\@beginparpenalty,\@empty}
-% \DoNotIndex{\@flushglue,\@gobble,\@input}
-% \DoNotIndex{\@makefnmark,\@makeother,\@maketitle}
-% \DoNotIndex{\@namedef,\@ne,\@spaces,\@tempa}
-% \DoNotIndex{\@tempb,\@tempswafalse,\@tempswatrue}
-% \DoNotIndex{\@thanks,\@thefnmark,\@topnum}
-% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa,\@totalleftmargin}
-% \DoNotIndex{\",\/,\@ifundefined,\@nil,\@verbatim,\@vobeyspaces}
-% \DoNotIndex{\|,\~,\ ,\active,\advance,\aftergroup,\begingroup,\bgroup}
-% \DoNotIndex{\mathcal,\csname,\def,\documentstyle,\dospecials,\edef}
-% \DoNotIndex{\egroup}
-% \DoNotIndex{\else,\endcsname,\endgroup,\endinput,\endtrivlist}
-% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef,\global}
-% \DoNotIndex{\hbox,\hss,\if,\if@inlabel,\if@tempswa,\if@twocolumn}
-% \DoNotIndex{\ifcase}
-% \DoNotIndex{\ifcat,\iffalse,\ifx,\ignorespaces,\index,\input,\item}
-% \DoNotIndex{\jobname,\kern,\leavevmode,\leftskip,\let,\llap,\lower}
-% \DoNotIndex{\m@ne,\next,\newpage,\nobreak,\noexpand,\nonfrenchspacing}
-% \DoNotIndex{\obeylines,\or,\protect,\raggedleft,\rightskip,\rm,\sc}
-% \DoNotIndex{\setbox,\setcounter,\small,\space,\string,\strut}
-% \DoNotIndex{\strutbox}
-% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin,\trivlist,\tt}
-% \DoNotIndex{\twocolumn,\typeout,\vss,\vtop,\xdef,\z@}
-% \DoNotIndex{\,,\@bsphack,\@esphack,\@noligs,\@vobeyspaces,\@xverbatim}
-% \DoNotIndex{\`,\catcode,\end,\escapechar,\frenchspacing,\glossary}
-% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht,\it,\langle}
-% \DoNotIndex{\leaders,\long,\makelabel,\marginpar,\markboth,\mathcode}
-% \DoNotIndex{\mathsurround,\mbox,\newcount,\newdimen,\newskip}
-% \DoNotIndex{\nopagebreak}
-% \DoNotIndex{\parfillskip,\parindent,\parskip,\penalty,\raise,\rangle}
-% \DoNotIndex{\section,\setlength,\TeX,\topsep,\underline,\unskip,\verb}
-% \DoNotIndex{\vskip,\vspace,\widetilde,\\,\%,\@date,\@defpar}
-% \DoNotIndex{\[,\{,\},\]}
-% \DoNotIndex{\count@,\ifnum,\loop,\today,\uppercase,\uccode}
-% \DoNotIndex{\baselineskip,\begin,\tw@}
-% \DoNotIndex{\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k,\l,\m,\n,\o,\p,\q}
-% \DoNotIndex{\r,\s,\t,\u,\v,\w,\x,\y,\z,\A,\B,\C,\D,\E,\F,\G,\H}
-% \DoNotIndex{\I,\J,\K,\L,\M,\N,\O,\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z}
-% \DoNotIndex{\1,\2,\3,\4,\5,\6,\7,\8,\9,\0}
-% \DoNotIndex{\!,\#,\$,\&,\',\(,\),\+,\.,\:,\;,\<,\=,\>,\?,\_}
-% \DoNotIndex{\discretionary,\immediate,\makeatletter,\makeatother}
-% \DoNotIndex{\meaning,\newenvironment,\par,\relax,\renewenvironment}
-% \DoNotIndex{\repeat,\scriptsize,\selectfont,\the,\undefined}
-% \DoNotIndex{\arabic,\do,\makeindex,\null,\number,\show,\write,\@ehc}
-% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title,\everypar}
-% \DoNotIndex{\if@minipage,\if@restonecol,\ifeof,\ifmmode}
-% \DoNotIndex{\lccode,\newtoks,\onecolumn,\openin,\p@,\SelfDocumenting}
-% \DoNotIndex{\settowidth,\@resetonecoltrue,\@resetonecolfalse,\bf}
-% \DoNotIndex{\clearpage,\closein,\lowercase,\@inlabelfalse}
-% \DoNotIndex{\selectfont,\mathcode,\newmathalphabet,\rmdefault}
-% \DoNotIndex{\bfdefault,\DeclareRobustCommand}
+% \DoNotIndex{\@flushglue,\@gobble,\@input,\@makefnmark}
+% \DoNotIndex{\@makeother,\@maketitle,\@namedef,\@ne}
+% \DoNotIndex{\@spaces,\@tempa,\@tempb,\@tempswafalse}
+% \DoNotIndex{\@tempswatrue,\@thanks,\@thefnmark,\@topnum}
+% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa}
+% \DoNotIndex{\@totalleftmargin,\",\/,\@ifundefined,\@nil}
+% \DoNotIndex{\@verbatim,\@vobeyspaces,\|,\~,\ ,\active}
+% \DoNotIndex{\advance,\aftergroup,\begingroup,\bgroup}
+% \DoNotIndex{\mathcal,\csname,\def,\documentstyle}
+% \DoNotIndex{\dospecials,\edef,\egroup,\else,\endcsname}
+% \DoNotIndex{\endgroup,\endinput,\endtrivlist}
+% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef}
+% \DoNotIndex{\global,\hbox,\hss,\if,\if@inlabel}
+% \DoNotIndex{\if@tempswa,\if@twocolumn,\ifcase,\ifcat}
+% \DoNotIndex{\iffalse,\ifx,\ignorespaces,\index,\input}
+% \DoNotIndex{\item,\jobname,\kern,\leavevmode,\leftskip}
+% \DoNotIndex{\let,\llap,\lower,\m@ne,\next,\newpage}
+% \DoNotIndex{\nobreak,\noexpand,\nonfrenchspacing}
+% \DoNotIndex{\obeylines,\or,\protect,\raggedleft}
+% \DoNotIndex{\rightskip,\rm,\sc,\setbox,\setcounter}
+% \DoNotIndex{\small,\space,\string,\strut,\strutbox}
+% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin}
+% \DoNotIndex{\trivlist,\tt,\twocolumn,\typeout,\vss,\vtop}
+% \DoNotIndex{\xdef,\z@,\,,\@bsphack,\@esphack,\@noligs}
+% \DoNotIndex{\@vobeyspaces,\@xverbatim,\`,\catcode,\end}
+% \DoNotIndex{\escapechar,\frenchspacing,\glossary}
+% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht}
+% \DoNotIndex{\it,\langle,\leaders,\long,\makelabel}
+% \DoNotIndex{\marginpar,\markboth,\mathcode,\mathsurround}
+% \DoNotIndex{\mbox,\newcount,\newdimen,\newskip}
+% \DoNotIndex{\nopagebreak,\parfillskip,\parindent}
+% \DoNotIndex{\parskip,\penalty,\raise,\rangle,\section}
+% \DoNotIndex{\setlength,\TeX,\topsep,\underline,\unskip}
+% \DoNotIndex{\verb,\vskip,\vspace,\widetilde,\\,\%,\@date}
+% \DoNotIndex{\@defpar,\[,\{,\},\],\count@,\ifnum,\loop}
+% \DoNotIndex{\today,\uppercase,\uccode,\baselineskip}
+% \DoNotIndex{\begin,\tw@,\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k}
+% \DoNotIndex{\l,\m,\n,\o,\p,\q,\r,\s,\t,\u,\v,\w,\x,\y,\z}
+% \DoNotIndex{\A,\B,\C,\D,\E,\F,\G,\H,\I,\J,\K,\L,\M,\N,\O}
+% \DoNotIndex{\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z,\1,\2,\3,\4}
+% \DoNotIndex{\5,\6,\7,\8,\9,\0,\!,\#,\$,\&,\',\(,\)}
+% \DoNotIndex{\+,\.,\:,\;,\<,\=,\>,\?,\_,\discretionary}
+% \DoNotIndex{\immediate,\makeatletter,\makeatother}
+% \DoNotIndex{\meaning,\newenvironment,\par,\relax}
+% \DoNotIndex{\renewenvironment,\repeat,\scriptsize}
+% \DoNotIndex{\selectfont,\the,\undefined,\arabic,\do}
+% \DoNotIndex{\makeindex,\null,\number,\show,\write,\@ehc}
+% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title}
+% \DoNotIndex{\everypar,\if@minipage,\if@restonecol,\ifeof}
+% \DoNotIndex{\ifmmode,\lccode,\newtoks,\onecolumn,\openin}
+% \DoNotIndex{\p@,\SelfDocumenting,\settowidth}
+% \DoNotIndex{\@resetonecoltrue,\@resetonecolfalse,\bf}
+% \DoNotIndex{\clearpage,\closein,\lowercase,\@tempdima}
+% \DoNotIndex{\@inlabelfalse,\selectfont,\mathcode}
+% \DoNotIndex{\newmathalphabet,\rmdefault,\bfdefault}
+% \DoNotIndex{\DeclareRobustCommand,\@ifpackagewith}
% \DoNotIndex{\classorpackage}
% \DoNotIndex{\euflag}
% \DoNotIndex{\FiveStar}
% \DoNotIndex{\bigstar}
% \DoNotIndex{\PassOptionsToPackage}
% \DoNotIndex{\vfill}
-% \DoNotIndex{\raisebox}
+% \DoNotIndex{\euflag[-.167em]}
% \DoNotIndex{\scalebox}
% \DoNotIndex{\colorbox}
% \DoNotIndex{\fboxsep}
@@ -494,8 +524,8 @@
% \def\@@doxdescribe#1#2{\endgroup \ifdox@noprint\else\marginpar{\raggedleft \textcolor{DarkRed}{\@nameuse{PrintDescribe#1}{#2}}}\fi \ifdox@noindex\else\@nameuse{Special#1Index}{#2}\fi \endgroup\@esphack\ignorespaces}
% \makeatother
%
-% \def\fileversion{0.4}
-% \def\filedate{2019/02/02}
+% \def\fileversion{0.8}
+% \def\filedate{2020/05/22}
% \title{The \textsf{euflag} \LaTeXe\ package\thanks{%
% This document corresponds to \textsf{euflag}
% \textit{v.}\ \fileversion $\beta$, dated \filedate.}
@@ -510,58 +540,59 @@
% \parindent=0pt% \noindent
% This package implements a single command
% {\ttfamily{}\textbackslash{}euflag} which reproduces the official flag
-% of the European Union ({\smaller EU})\index{European Union|see{EU}}\index{EU|textbf} using
+% of the European Union ({\smaller EU})\index{EU|see{European Union}}\index{European Union|textbf} using
% just the built-in \texttt{picture} environment, with the
% \textsf{xcolor} and \textsf{graphicx}
% packages and the \textsf{amssymb} font.\par
% The flag is reproduced at 1em high based on the current
% font size, so it can be scaled arbitrarily by changing the
-% font size (see examples in the table \vpageref{examples}).\par
+% font size locally (see examples in the table \vpageref{examples}). An option allows for the flag to be
+% aligned on the bottom star.\par
% \begingroup\centering\fontsize{230}{0}\selectfont\euflag\par\endgroup\par
% \end{abstract}
% \clearpage
% \tableofcontents
% \clearpage
% \section*{Latest changes}
-% \subsection*{v.0.4 (2019-02-02)}
-% \paragraph*{Changed the star}
+% \subsection*{v.0.8 (2020-05-22)}
+% \paragraph*{Reference update}
% \begin{itemize}
-% \item Changed from the \textsf{bbding} {\ttfamily{}\textbackslash{}FiveStar} to the
-% \textsf{amssymb} {\ttfamily{}\textbackslash{}bigstar}
-% command.\par
+% \item Added missing reference to Claudio's
+% paper\par
% \end{itemize}
-% \subsection*{v.0.3 (2019-02-02)}
-% \paragraph*{Mods to ClassPack}
+% \subsection*{v.0.7 (2020-05-16)}
+% \paragraph*{Regression release}
% \begin{itemize}
-% \item Added switch in {\ttfamily{}db2dtx.xsl} to
-% detect the use of a package in its own documentation
-% (as here) and code around the
-% {\ttfamily{}\textbackslash{}PassOptionsToPackage} for
-% \textbf{\texttt{svgnames}} on
-% \textsf{xcolor}, which was causing an Option
-% Clash error.\par
+% \item Updated to use
+% \emph{ClassPack} 1.19\par
+% \item Switched all \texttt{@conformance} attributes on
+% revision dates to \texttt{@YYYY-MM-DD}\par
% \end{itemize}
-% \subsection*{v.0.2 (2019-02-01)}
-% \paragraph*{Works in table cells}
+% \subsection*{v.0.6 (2020-04-01)}
+% \paragraph*{Maintenance release}
% \begin{itemize}
-% \item Fixed bug (a {\ttfamily{}\textbackslash{}vfill}) that was
-% crashing (well, locking up) \LaTeX{} when
-% {\ttfamily{}\textbackslash{}euflag} was used in a table
-% cell.\par
+% \item Updated to ClassPack 1.18\par
+% \item Switched all conformance attributes on revision
+% dates to YYYY-MM-DD\par
% \end{itemize}
-% \subsection*{v.0.1 (2019-01-31)}
-% \paragraph*{First version}
+% \subsection*{v.0.5 (2019-07-24)}
+% \paragraph*{Separated stars from flag and added baseline option}
% \begin{itemize}
-% \item Simple picture mode is all that is needed, plus a
-% decent star.\par
+% \item Made the ring of stars a separate macro so that
+% they can be used on their own as well as in the flag.\par
+% \item Added a \textbf{\texttt{baseline}} package option
+% to align the bottom star with the text, and a command
+% option to do it on a per-command basis.\par
% \end{itemize}
-% See p.\thinspace\pageref{changehistory} for details of earlier changes.
+% See p.\thinspace\pageref{changehistory} for earlier changes.
% \clearpage
% \section{Background}
% This package provides a command {\ttfamily{}\textbackslash{}euflag}
% for reproducing the flag of the European Union. It follows
-% exactly the official specification. The EU’s web site says:\par
-% \begin{quotation}\small\sffamily\parindent0pt\parskip.5\baselineskip\color{DarkBlue}\noindent
+% exactly the official specification \parencite{emblem}. The EU’s web site says:\par
+% \begin{quotation}\small\sffamily\parindent0pt
+% \parskip.5\baselineskip
+% \color{DarkBlue}\noindent
% The European flag symbolises both the European Union
% and, more broadly, the identity and unity of Europe.\par
% \textbf{It features a circle of 12 gold
@@ -583,18 +614,32 @@
% official emblem of the European Communities, later to become
% the European Union. In addition, all European institutions
% now have their own emblems.\par
-% \hfill\begingroup\scriptsize\color{Black}\url{https://europa.eu/european-union/about-eu/symbols/flag_en}\parfillskip=0pt\par\endgroup
+% \hfill\begingroup
+% \scriptsize\color{Black}\url{https://europa.eu/european-union/about-eu/symbols/flag_en}\parfillskip=0pt\par\endgroup
% \end{quotation}
% The {\ttfamily{}\textbackslash{}euflag} command provides a simple
-% way to use the flag in any \LaTeX{} document. Details of
-% construction and spacing are taken from the official
-% specification in \url{http://publications.europa.eu/code/en/en-5000100.htm}\par
+% way to use the flag in any \LaTeX{} document. Details of
+% construction and spacing are taken from the official
+% specification in the {\color{blue}\uline{Graphics
+% guide to the European emblem}}\footnote{\protect\url{http://publications.europa.eu/code/en/en-5000100.htm}}.\par
+% Since the publication of v0.4 of this package in
+% February 2019, Claudio Beccari has investigated ways
+% to produce the flag using only \LaTeX{}'s drawing
+% facilities and the \textsf{xfp} package.
+% He has written a very comprehensive paper about this
+% in \emph{\citefield{beccari2019}{journaltitle}}, the
+% journal of the Gruppo Utilizzatori Italiani di
+% \TeX{} (\guit)\index{GUIT|see{Gruppo Utilizzatori Italiani di \TeX{}}}\index{Gruppo Utilizzatori Italiani di \TeX{}|textbf}, explaining how he did it
+% \parencite{beccari2019}.\par
% \clearpage
% \section{Usage}\label{usage}
% The flag is reproduced at 1em high, with the bottom edge
% at the current baseline like this:
% \euflag\ using the
-% {\ttfamily{}\textbackslash{}euflag} command.\par
+% {\ttfamily{}\textbackslash{}euflag} command.
+% The \textbf{\texttt{baseline}} package option or an optional
+% length argument to the {\ttfamily{}\textbackslash{}euflag} command can
+% be used to change this (see below).\par
% The font size of the enclosing environment can be changed
% to make the flag appear at any size. In the examples below,
% the code and the flags are in {\ttfamily{}m}-type
@@ -605,11 +650,11 @@
% \begingroup
% \centering
% \begin{tabular}{@{}%
-% >{\raggedright{}\prestrut\arraybackslash}m{0.5\columnwidth}<{\poststrut\arraybackslash}%
-% >{\raggedright{}\prestrut\arraybackslash}m{0.5\columnwidth}<{\poststrut\arraybackslash}%
+% >{\raggedright{}\CPKprestrut}m{0.5\columnwidth}<{\CPKpoststrut\arraybackslash}%
+% >{\raggedright{}\CPKprestrut\arraybackslash}m{0.5\columnwidth}<{\CPKpoststrut\arraybackslash}%
% @{}}
% \hline
-% \vstrut
+% \CPKvstrut
% \verb|{\tiny\euflag}|&\tiny\euflag\vrule height2em width0pt\\
% \verb|{\scriptsize\euflag}|&\scriptsize\euflag\\
% \verb|{\footnotesize\euflag}|&\footnotesize\euflag\\
@@ -625,11 +670,24 @@
% \par\endgroup
% }
% To move the flag down so that the bottom star's baseline
-% becomes the flag's baseline, use the
-% {\ttfamily{}\textbackslash{}raisebox} command to lower the flag by
-% \nicefrac16em:
-% \raisebox{-.167em}{\euflag}, eg
-% \verb|\raisebox{-.167em}{\euflag}|\par
+% becomes the flag's baseline, like this:
+% \euflag[-.167em], load
+% the package with the \textbf{\texttt{baseline}} option:\par
+% \iffalse
+%<*ignore>
+% \fi
+\begin{lstlisting}[language={[LaTeX]TeX}]
+\usepackage[baseline]{euflag}
+\end{lstlisting}
+% \iffalse
+%</ignore>
+% \fi
+% (that will affect all {\ttfamily{}\textbackslash{}euflag} commands).
+% Alternatively, use the optional argument to {\ttfamily{}\textbackslash{}euflag}
+% to lower the flag by \nicefrac16em or whatever amount you wish, eg
+% {\ttfamily{}\textbackslash{}euflag[-.167em]}\par
+% \def\SILtst#1{\if#1\hfil
+% Non-printing\hfil\else#1\fi}%
% \StopEventually{\label{endcode}%
% \clearpage
% \newgeometry{left=3cm}%
@@ -640,8 +698,9 @@
% \label{codeindex}%
% \addcontentsline{toc}{section}{Index}%
% \PrintIndex}
-% \addtolength{\revmarg}{\widthof{\LabelFont{PantoneReflexBlue}}}
-% \newgeometry{left=\revmarg}
+% \addtolength{\CPKrevmarg}{\widthof{\LabelFont{PantoneReflexBlue}}}
+% \newgeometry{left=\CPKrevmarg}
+% \message{Margin reset to \the\CPKrevmarg, to fit <PantoneReflexBlue>}
% \iffalse
%<*package>
% \fi
@@ -651,31 +710,35 @@
% \subsection{Auto-initialisation}\label{:autoinit}
% This section is added automatically by \textit{ClassPack}
% as a preamble to all classes and style packages.
-% The \textsf{fixltx2e} package is no longer preloaded, as its
-% features are now a part of the latest \LaTeX\ kernel.\par
-% The code starts with identity and requirements which are generated
-% automatically as needed by the Doc\TeX\ system.
+% The \textsf{fixltx2e} package, which used to be included
+% automatically, is no longer preloaded, as its
+% features are now a part of the latest \LaTeXe\ kernel.\par
+% The code starts with identity and requirements which are
+% generated automatically as needed by the Doc\TeX\ system.
% For details see the \textsf{ltxdoc} package documentation.
% \par\smallskip
% \begingroup\color{DarkRed}\tabcolsep3pt\footnotesize
% \begin{tabular}{>{\refstepcounter{CodelineNo}\tiny\theCodelineNo}r@{\enspace}l}
% &\verb`\NeedsTeXFormat{LaTeX2e}[2016/02/01]`\\
-% &\verb`\ProvidesPackage{euflag}[2019/02/02 v0.4`\\
-% &\verb` European Union Flag]`
+% &\verb`\ProvidesPackage{euflag}[2020/05/22 v0.8`\\
+% &\verb` European Union Flag]`
% \end{tabular}\endgroup
% \setcounter{CodelineNo}{3}
% \begin{CPK@option}{svgnames}
-% Pass the \textbf{\texttt{svgnames}} option to the \textsf{xcolor}
-% package if that gets loaded later. This avoids a conflict with
-% any other packages (eg \textsf{hyperref}) which use their own
-% default is when they load \textsf{xcolor}.\par
-% However, we have to make an exception
-% in this case because the package is used in its own documentation,
-% which would cause a duplicate \verb+\PassOptionsToPackage+, so we
-% code around it by testing the current package name against the
-% job name of the calling \verb+.dtx+ file~--- if they are the same,
-% then this is the case in point, and the \verb+\PassOptionsToPackage+
-% command is \emph{not} executed; otherwise it it OK to do so.\par
+% Pass the \textbf{\texttt{svgnames}} option to the
+% \textsf{xcolor} package if that gets loaded later.
+% This avoids a conflict with any other packages
+% (eg \textsf{hyperref}) which use their own default
+% is when they load \textsf{xcolor}.\par
+% However, we have to make
+% an exception in this case because the package gets
+% used in its own documentation, which would cause a
+% duplicate \verb+\PassOptionsToPackage+, so we code
+% around it by testing the current package name against
+% the job name of the calling \verb+.dtx+ file~--- if
+% they are the same, then this is the case in point,
+% and the \verb+\PassOptionsToPackage+ command is
+% \emph{not} executed; otherwise it it OK to include it.\par
% \begin{macrocode}
\def\CPK@thispackage{euflag}
\edef\CPK@thispackage{\meaning\CPK@thispackage}
@@ -683,22 +746,46 @@
\edef\CPK@thisjob{\meaning\CPK@thisjob}
\ifx\CPK@thispackage\CPK@thisjob
%% this is the documentation: omit PassOptionsToPackage
-\message{Option svgnames not being passed to package xcolor}
+ \message{Option svgnames not passed to package xcolor}
\else
%% this is a user job: include PassOptionsToPackage
-\message{Option svgnames being passed to package xcolor}
+ \message{Option svgnames passed to package xcolor}
% \end{macrocode}
% \begin{macrocode}
-\PassOptionsToPackage{svgnames}{xcolor}
+ \PassOptionsToPackage{svgnames}{xcolor}
% \end{macrocode}
% \begin{macrocode}
\fi
% \end{macrocode}
-% Thanks to zeroth at \url{https://tex.stackexchange.com/questions/44499/how-to-test-jobname-compilation-option-within-latex-file/54895} for this switch.
% \end{CPK@option}
+% \subsection{Options}\label{options}
+% \iffalse
+%%
+%% ******************************************************************
+%%
+%% Options
+% \fi
+% \begin{CPK@length}{\EUF@baseline}\label{length--EUF@baseline}
+% Define an option to set the default position to align
+% the lowest star with the text baseline of the surrounding
+% text. The default is zero, meaning the bottom of the flag
+% aligns with the text baseline; setting this option will
+% lower the flag so that the lowest star aligns with the
+% text baseline.\par
+% \begin{macrocode}
+\newlength{\EUF@baseline}
+\setlength{\EUF@baseline}{0pt}
+\DeclareOption{baseline}{\setlength\EUF@baseline{-.167em}}
+\DeclareOption*{%
+ \PackageWarning{euflag}{Unknown option
+ ‘\CurrentOption’; please Read The Fine Manual}%
+}
+\ProcessOptions
+% \end{macrocode}
+% \end{CPK@length}
%\iffalse
%%
-%% Packages required
+%% Packages required for the class or package
%%
% \fi
% \subsection{Packages required for the package}\label{stypackages}
@@ -708,9 +795,10 @@
%% Provide color.
% \fi
% \begin{macrocode}
-\RequirePackage[svgnames]{xcolor}
+\RequirePackage[svgnames]{xcolor}%
\@ifundefined{T}{%
- \newcommand{\T}[2]{{\fontencoding{T1}\selectfont#2}}}{}
+ \newcommand{\T}[2]{{\fontencoding{T1}%
+ \selectfont#2}}}{}
% \end{macrocode}
% There seems to be a bug in the T1 encoding of some package
% (unidentified, but possibly \textsf{xcolor}) which
@@ -718,7 +806,7 @@
% impossibility (no digits allowed in command names). So we fake
% it here to stop \LaTeX{} complaining, by dropping the first
% argument on the floor.
-% \end{CPK@package}
+% \end{CPK@package}
% \begin{CPK@package}{graphicx}
% Provide for graphics (PNG, JPG, or PDF format (only) for
% pdflatex; EPS format (only) for standard \LaTeX{}).
@@ -726,9 +814,9 @@
%% Provide for graphics (PNG, JPG, or PDF format (only) for pdflatex; EPS format (only) for standard \LaTeX{}).
% \fi
% \begin{macrocode}
-\RequirePackage{graphicx}
+\RequirePackage{graphicx}%
% \end{macrocode}
-% \end{CPK@package}
+% \end{CPK@package}
% \begin{CPK@package}{amssymb}
% Provide for the American Mathematical Society's symbols
% (see their documentation for details).
@@ -736,11 +824,17 @@
%% Provide for the American Mathematical Society's symbols (see their documentation for details).
% \fi
% \begin{macrocode}
-\RequirePackage{amssymb}
+\RequirePackage{amssymb}%
% \end{macrocode}
-% \end{CPK@package}
+% \end{CPK@package}
%
% \subsection{Changes to package defaults}\label{packagemods}
+% \iffalse
+%%
+%% ******************************************************************
+%%
+%% Changes to package defaults
+% \fi
% The only changes are to implement the blue and yellow
% according to the specification. Note that exact Pantone®
% colour codes are not available, so the
@@ -749,7 +843,7 @@
% {\smaller CMYK} values are commented out in the
% code; they are available for users to test.\par
% \definecolor{PantoneReflexBlue}{HTML}{003399}
-% \begin{CPK@colour}{PantoneReflexBlue}\label{ann-PantoneReflexBlue}
+% \begin{CPK@colour}{PantoneReflexBlue}\label{colour--PantoneReflexBlue}
% As specified.\par
% \begin{macrocode}
\definecolor{PantoneReflexBlue}{HTML}{003399}
@@ -757,7 +851,7 @@
% \end{macrocode}
% \end{CPK@colour}
% \definecolor{PantoneYellow}{HTML}{FFCC00}
-% \begin{CPK@colour}{PantoneYellow}\label{ann-PantoneYellow}
+% \begin{CPK@colour}{PantoneYellow}\label{colour--PantoneYellow}
% As specified.\par
% \begin{macrocode}
\definecolor{PantoneYellow}{HTML}{FFCC00}
@@ -768,12 +862,18 @@
% better to be explicit.\par
% \end{CPK@colour}
% \subsection{The flag}
+% \iffalse
+%%
+%% ******************************************************************
+%%
+%% The flag
+% \fi
% We now use the {\ttfamily{}\textbackslash{}bigstar} command from the
% \textsf{amssymb} package (earlier versions used
% the {\ttfamily{}\textbackslash{}FiveStar} command from the
% \textsf{bbding} package, but that did not reliably
% scale beyond about 100pt).\par
-% \begin{CPK@macro}{\eustar}\label{ann-eustar}
+% \begin{CPK@macro}{\eustar}\label{macro--eustar}
% It needs to scale, so we implement it as a command
% using {\ttfamily{}\textbackslash{}scalebox}.\par
% \begin{macrocode}
@@ -789,14 +889,54 @@
% The command itself is a blue {\ttfamily{}\textbackslash{}colorbox}
% containing the stars set at the clock-points of a circle in
% a \LaTeX{} \texttt{picture} environment.\par
-% \begin{CPK@macro}{\euflag}\label{ann-euflag}
+% \begin{CPK@macro}{\makestars}\label{macro--makestars}
+% Separate the making of the ring of stars from the flag
+% itself so that the ring of stars can be used
+% separately.\par
+% For the \texttt{picture} environment, set the
+% unit to 1em and then divide it by 18. This enables us
+% conveniently to use six units for the axes behind the circle
+% of stars, because the specification says it must have a
+% radius of \nicefrac13 of the height (ie \nicefrac6{18}). The
+% positioning argument was found by trial and error.\par
+% \begin{macrocode}
+\newcommand{\makestars}{%
+ \color{PantoneYellow}%
+ \setlength{\unitlength}{1em}
+ \divide\unitlength by18
+ \begin{picture}(6,6)(-2,3.5)
+ \put(6,0){\eustar}
+ \put(5.196,3){\eustar}
+ \put(3,5.196){\eustar}
+ \put(0,6){\eustar}
+ \put(-3,5.196){\eustar}
+ \put(-5.196,3){\eustar}
+ \put(-6,0){\eustar}
+ \put(-5.196,-3){\eustar}
+ \put(-3,-5.196){\eustar}
+ \put(0,-6){\eustar}
+ \put(3,-5.196){\eustar}
+ \put(5.196,-3){\eustar}
+ \end{picture}%
+}
+% \end{macrocode}
+% The positioning of the individual stars was found with
+% simple trigonometry. It would have been possible to
+% construct this from a loop cycling through the 12
+% positions, but it is simpler to do it like this.\par
+% \end{CPK@macro}
+% \begin{CPK@macro}{\euflag}\label{macro--euflag}
% Before the {\ttfamily{}\textbackslash{}colorbox} is used, set
% the {\ttfamily{}\textbackslash{}fboxsep} length to
-% zero so that there is no border around the box.\par
+% zero so that there is no border around the box, and then
+% raise (lower) the box by the value of \DescribeLength{EUF@baseline}{\ttfamily{}EUF@baseline} as set by the
+% \textbf{\texttt{baseline}} option.\par
% \begin{macrocode}
-\newcommand{\euflag}{{%
+\newcommand{\euflag}[1][\EUF@baseline]{%
+ {%
\fboxsep0pt
- \colorbox{PantoneReflexBlue}{%
+ \raisebox{#1}{%
+ \colorbox{PantoneReflexBlue}{%
% \end{macrocode}
% The rectangle itself is formed from a
% {\ttfamily{}\textbackslash{}vbox} 1em high and 1.5em wide. The
@@ -809,45 +949,15 @@
\parskip0pt
\parindent0pt
\centering
- \color{PantoneYellow}%
-% \end{macrocode}
-% For the \texttt{picture} environment, set the
-% unit to 1em and then divide it by 18. This enables us
-% conveniently to use six units for the axes behind the circle
-% of stars, because the specification says it must have a
-% radius of \nicefrac13 of the height (ie \nicefrac6{18}). The
-% positioning argument was found by trial and error.\par
-% \begin{macrocode}
- \setlength{\unitlength}{1em}
- \divide\unitlength by18
- \begin{picture}(6,6)(-2,3.5)
-% \end{macrocode}
-% The positioning of the individual stars was found with
-% simple trigonometry. It would have been possible to
-% construct this from a loop cycling through the 12
-% positions, but it is simpler to do it like this.\par
-% \begin{macrocode}
- \put(6,0){\eustar}
- \put(5.196,3){\eustar}
- \put(3,5.196){\eustar}
- \put(0,6){\eustar}
- \put(-3,5.196){\eustar}
- \put(-5.196,3){\eustar}
- \put(-6,0){\eustar}
- \put(-5.196,-3){\eustar}
- \put(-3,-5.196){\eustar}
- \put(0,-6){\eustar}
- \put(3,-5.196){\eustar}
- \put(5.196,-3){\eustar}
+ \makestars
% \end{macrocode}
-% Finally, close off the \texttt{picture}
-% environment, and close the containing
+% Finally, close off the containing
% {\ttfamily{}\textbackslash{}vbox} and other containers.\par
% \begin{macrocode}
- \end{picture}%
- }% end vbox
- }% end colorbox
- }% end environment
+ }% end vbox
+ }% end colorbox
+ }% end raisebox
+ }% end encapsulation
}% end command
% \end{macrocode}
% \end{CPK@macro}
@@ -855,7 +965,6 @@
% \iffalse
%</package>
% \fi
-% \nocite{*}
% \clearpage
% \raggedright
% \raggedright\printbibliography
@@ -863,7 +972,9 @@
% \newgeometry{left=3cm}
% \clearpage
% \section{The \LaTeX{} Project Public License (v\thinspace{}1.3c)}\label{LPPL}
-% \begin{quotation}\small\sffamily\parindent0pt\parskip.5\baselineskip\color{DarkBlue}\noindent
+% \begin{quotation}\small\sffamily\parindent0pt
+% \parskip.5\baselineskip
+% \color{DarkBlue}\noindent
% Everyone is allowed to distribute verbatim copies of this
% license document, but modification of it is not allowed.\par
% \end{quotation}
@@ -1031,14 +1142,14 @@
% \item % \begin{enumerate}
% \item A Derived Work may be distributed under a different
% license provided that license itself honors the
-% conditions listed in Clause~item~\ref{item-conditions} above above, in
+% conditions listed in Clause~item~\ref{item-conditions} in the list on p.\thinspace\pageref{item-conditions} above, in
% regard to the Work, though it does not have to honor the
% rest of the conditions in this license.\par
% \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~item~\ref{item-conditions} above above, concerning
+% Clause~item~\ref{item-conditions} in the list on p.\thinspace\pageref{item-conditions} above, concerning
% changes from the Work.\par
% \end{enumerate}
% \item This license places no restrictions on works that are
@@ -1121,14 +1232,14 @@
% announcement.\par
% \end{enumerate}
% \item \label{item-change}If you make an `intention announcement'
-% as described in~item~\ref{item-intention} above above and after three
+% as described in~item~\ref{item-intention} in the list on p.\thinspace\pageref{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.\par
% \item If the previously unreachable Current Maintainer becomes
% reachable once more within three months of a change
-% completed under the terms of~item~\ref{item-announce} above
+% completed under the terms of~item~\ref{item-announce} in the list on p.\thinspace\pageref{item-announce}
% or~item~\ref{item-change} above, then that
% Current
% Maintainer must become or remain the Current Maintainer upon
@@ -1142,7 +1253,7 @@
% 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~item~\ref{item-intention} above
+% community as in~item~\ref{item-intention} in the list on p.\thinspace\pageref{item-intention}
% above.\par
% \subsection{Whether and How to Distribute Works under This
% License}\label{Distribute}
@@ -1246,7 +1357,7 @@
% completely different task), then clauses 6b and 6d shall not
% apply.\par
% \subsubsection{Important Recommendations}\label{Recommendations}
-% \paragraph[Defining What Constitutes the Work]{Defining What Constitutes the Work  •}
+% \paragraph[Defining What Constitutes the Work]{Defining What Constitutes the Work :}
% The {\smaller 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
diff --git a/Master/texmf-dist/source/latex/euflag/euflag.ins b/Master/texmf-dist/source/latex/euflag/euflag.ins
index db2675e0966..00085a7c365 100644
--- a/Master/texmf-dist/source/latex/euflag/euflag.ins
+++ b/Master/texmf-dist/source/latex/euflag/euflag.ins
@@ -1,7 +1,7 @@
% Transformed from euflag.xml by ClassPack db2dtx.xsl
-% version 1.10 (2019-01-22) on Sunday 3 February 2019 at 21:19:20
+% version 1.19 (2020-05-19) on Friday 22 May 2020 at 23:43:47
%
-% euflag.ins is copyright © 2019 by Peter Flynn <peter@silmaril.ie>
+% euflag.ins is copyright © 2019-2020 by Peter Flynn <peter@silmaril.ie>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
diff --git a/Master/texmf-dist/source/latex/everypage/everypage.dtx b/Master/texmf-dist/source/latex/everypage/everypage.dtx
index 02cf2149a38..d23b6284b9c 100644
--- a/Master/texmf-dist/source/latex/everypage/everypage.dtx
+++ b/Master/texmf-dist/source/latex/everypage/everypage.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 2006-2007
+% Copyright 2006-2007, 2020
% Sergio Callegari <sergio.callegari@gmail.com>
%
% ---------------------------------------------
@@ -8,23 +8,26 @@
% a contribution to the LaTeX2e system.
% ---------------------------------------------
%
-% It may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License, either version 1.3 of this licence, or
-% any later version. The latest version of this license is at
-% http://www.latex-project.org/lppl.txt and version 1.3 is part
-% of all distributions of LaTeX version 2003/06/01 or later.
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, version 1.3c.
+% This license is in
+% https://www.latex-project.org/lppl/lppl-1-3c/
+% and is part of all distributions of LaTeX later than
+% 2008-05-04.
%
-% This work has the LPPL maintenance status "author-maintained".
+% This work has the LPPL maintenance status "maintained".
%
% This program consists of the files listed in the README file
% included in the package.
%
%<*driver>
\documentclass{ltxdoc}
-\usepackage{mathptmx, helvet, courier}
+\usepackage{mathptmx}
+\usepackage[T1]{fontenc}
+\usepackage[scaled=0.92]{helvet}
+% \usepackage{courier}
+\usepackage{hologo}
\EnableCrossrefs
-\DoNotIndex{\def,\gdef,\let,\NeedsTeXFormat,\newcommand}
-\DoNotIndex{\ProvidesPackage,\endinput}
\CodelineIndex
\RecordChanges
\begin{document}
@@ -34,12 +37,19 @@
%
% \fi
%
-% \CheckSum{44}
+% \DoNotIndex{\@ifundefined, \g@addto@macro}
+% \DoNotIndex{\def, \gdef, \let, \newcommand}
+% \DoNotIndex{\MessageBreak, \PackageWarningNoLine, \NeedsTeXFormat}
+% \DoNotIndex{\ProvidesPackage, \RequirePackage}
+% \DoNotIndex{\put}
+% \DoNotIndex{\endinput}
+%
+% \CheckSum{71}
%
% \def\filename{everypage.dtx}
-% \def\fileversion{1.1}
-% \def\filedate{2007/06/20}
-% \def\docdate{2007/06/20}
+% \def\fileversion{2.0b}
+% \def\filedate{2020/10/17}
+% \def\docdate{2020/10/17}
%
% \newcommand*{\Lpack}[1]{\textsf {#1}} ^^A typeset a package
% \newcommand*{\Lopt}[1]{\textsf {#1}} ^^A typeset an option
@@ -60,99 +70,324 @@
%
% \maketitle
%
+% \changes{R2.0b}{2020/10/17}{Fix statement about maintenance state.}
+%
+% \section*{WARNING}
+% \changes{R2.0}{2020/10/11}{Package is now in a `legacy' status.}
+%
+% This package is now in \emph{legacy status}. Functionality similar to
+% that provided by this package has been directly implemented in \LaTeX\
+% since its 2020 Fall release. Do not use \Lpack{everypage} in new
+% documents and do not rely on it in new packages or classes of
+% yours.
+%
+% \smallskip
+% When running on a pre-2020-10-01 version of \LaTeX, \Lpack{everypage}
+% will now fall back to \Lpack{everypage-1x}, its own past
+% code base.\smallskip
+%
+% When running on a modern \LaTeX, \Lpack{everypage} will strive to
+% provide its legacy interfaces by using the newer \LaTeX\ facilities.
+% However, full equivalence is not possible and breakage may occur. When
+% truly needed, try loading \Lpack{everypage-1x} in place of
+% \Lpack{everypage} to force usage of the old code base. This is expected
+% to keep working for a few more \LaTeX\ release cycles after Fall 2020.
+%
+% \bigskip\bigskip
+%
% \begin{abstract}
-% The \Lpack{everypage} package extends \LaTeX\ providing hooks to do
-% actions on every page or on the current page. Specifically, actions
-% are performed \emph{before} the page is shipped, so they can be
-% used to put watermarks \emph{in the background} of a page, or to
-% set the page layout. The package reminds in some sense
-% \Lpack{bobhook} by Karsten Tinnefeld, but it differs in the way in
-% which the hooks are implemented, as detailed in the following.
-% In some sense it may also be related to the package
-% \Lpack{everyshi} by Martin Schroeder, but again the implementation
-% is different.
+% The \Lpack{everypage} package was meant to extend \LaTeX\ providing
+% hooks to do actions on every page or on the current page. Currently,
+% similar functionality is directly provided by \LaTeX. Specifically,
+% \Lpack{everypage} supports actions performed \emph{before} the page is
+% shipped, so they can be used to put watermarks \emph{in the
+% background} of a page, or to set the page layout. The package is in
+% many ways similar to \Lpack{bobhook} by Karsten Tinnefeld, but it
+% differs in the way in which the hooks are implemented. In some sense,
+% it may also be related to package \Lpack{everyshi} by Martin
+% Schroeder, but again the implementation is different.
% \end{abstract}
%
% \section{Introduction}
-%
-% This program adds two \LaTeX\ hooks that get run when document
-% pages are finalized and output to the dvi or pdf
+%
+% Until a recent past, \LaTeX\ provided no explicit hooks to be run as
+% documents pages were finalized and output to the dvi or pdf
+% file. Consequently, many solutions were developed to work around this
+% limitation and to offer features (e.g., watermarks) that would otherwise
+% be impossible. These solution included packages such as
+% \Lpack{everyshi}, \Lpack{bobhook} and \Lpack{watermark}. Package
+% \Lpack{everypage} was a solution providing plumbing that could be used
+% in higher level packages such as \Lpack{draftwatermark} (watermarking)
+% and \Lpack{flippdf} (print preprocessing) to mention a couple of them.
+%
+% All of these extensions relied on applying modifications to some \LaTeX\
+% internals and as such were prone to subtle interactions with other
+% packages and breakage. The situation has been cleared by the 2020 Fall
+% \LaTeX\ release where an official and generic support for hooks has been
+% introduced.
+%
+% As of today, \Lpack{everypage} can be considered obsolete. It needs to
+% remain around because older releases of \LaTeX\ are still in use and
+% legacy code exist that is based on the interfaces it exposes. However,
+% no new document, class or package should be based on it. Furthermore, it
+% can be expected that existing packages that use \Lpack{everypage} will
+% progressively learn to rely directly on the new \LaTeX\ hook mechanism.
+%
+% This manual is meant to aid the transition by showing how
+% \Lpack{everypage} is now being updated to cater both for older and newer
+% \LaTeX\ kernels. Specifically, it illustrates:
+% \begin{enumerate}
+% \item how \Lpack{everypage} is now actually split in two packages:
+% \Lpack{everypage-1x}, providing the old code base; and
+% \Lpack{everypage} itself, that strives to implement the legacy
+% interface on top of the new mechanisms offered by \LaTeX;
+% \item how \Lpack{everypage} can automatically import the old code base
+% as needed, how loading of the latter can be forced (if absolutely
+% needed or for comparison) and for how long the old code can be
+% expected to keep working with newer releases of \LaTeX;
+% \item how the legacy interface of \Lpack{everypage}, once
+% implemented/emulated on top of the new \LaTeX\ facilities actually
+% differs from its nominal behavior.
+% \end{enumerate}
+%
+% \section{The original code base}
+% \label{sec:original}
+% \changes{R1.0}{2006/06/30}{%
+% Initial release.}
+%
+% The original implementation of \Lpack{everypage}, now available as
+% \Lpack{everypage-1x}, adds two \LaTeX\ hooks that get
+% run when document pages are finalized and output to the dvi or pdf
% file. Specifically, one hook gets executed on every page, while the
% other is executed for the current page. Hook actions are are performed
-% \emph{before} the page is output on the medium, and this is
-% important to be able to play with the page layout or to put things
-% \emph{behind} the page contents (e.g., watermarks such as an image,
-% framing, the ``DRAFT'' word, and the like).
-%
-% The package reminds in some sense \Lpack{bobhook} by Karsten
-% Tinnefeld, but it differs in the way in which the hooks are
-% implemented:
+% \emph{before} the page is output on the medium, and this is important to
+% be able to play with the page layout or to put things \emph{behind} the
+% page contents (e.g., watermarks).
+%
+% \subsection{User interface}
+% \label{ssec:ui}
%
+% \DescribeMacro{\AddEverypageHook} The |\AddEverypageHook| command
+% accepts one argument and adds it to the list of hooks that are run
+% before every page is output. Similarly, the
+% \DescribeMacro{\AddThispageHook}|\AddThispageHook| command accepts one
+% argument, however it adds it to the list of hooks that are run before
+% the \emph{current} page is output.
+%
+% The following rules apply:
+%
% \begin{enumerate}
-% \item there is no formatting inherent in the hooks. If one wants to
-% put some watermark on a page, it is his own duty to put in the
-% hook the code to place the watermark in the right position. Also
-% note that the hooks code should \emph{eat up no space} in the
-% page. Again, if the hooks are meant to place some material on the
-% page, it is the duty of the hook programmer to put code in the
-% hooks to pretend that the material has zero width and zero height.
-% The implementation is \emph{lighter} than the \Lpack{bobhook} one,
-% and possibly more flexible, since one is not limited by any
-% pre-coded formatting for the hooks. On the other hand it is
-% possibly more difficult to use. Nonetheless, it is easy to think
-% of other packages relying on \Lpack{everypage} to deliver more
-% user-friendly and \emph{task specific} interfaces. Already there
-% are a couple of them: the package \Lpack{flippdf} produces
-% mirrored pages in a PDF document and \Lpack{draftwatermark}
-% watermarks document pages.
-% \item similarly to \Lpack{bobhook} and \Lpack{watermark}, the
-% package relies on the manipolatoin of the internal \LaTeX\ macro
-% |\@begindvi| to do the job. However, the redefinition of
-% |\@begindvi| is here postponed as much as possible, striving to
-% avoid interference with other packages using |\AtBeginDvi| or
-% anyway manipulating |\@begindvi|. Specifically \Lpack{everypage}
-% makes no special assumption on the initial code that |\@begindvi|
-% might contain.
+% \item once hooks are introduced and stacked in a series, there is no way
+% to unstack them, nor to clear them;
+% \item in order to have hooks that get run only when specific conditions
+% are met, conditionals must be included in the hooks;
+% \item \label{itm:formatting}%
+% there is no formatting inherent in the hooks. If one wants to put some
+% watermark on a page, it is his own duty to put in the hook the code to
+% place the watermark in the right position and with the appropriate
+% appearance and style. When the hooks are run, the page is still empty,
+% so that one begins filling it at point (1\,inch, 1\,inch) from the top
+% left corner;
+% \item \label{itm:nospace}%
+% the hook code should \emph{eat up no space}. This means that hooks
+% meant to place some material on the page, need to have the material
+% placed in a box with zero width and height beforehand.
+% \item no particular assumption is made on the \LaTeX\ output
+% driver, so \Lpack{everypage} should work equally well with \LaTeX,
+% \hologo{pdfLaTeX}, \hologo{LuaLaTeX}, or \hologo{XeLaTeX}. Similarly,
+% the package should work equally well with dvi, dvips, etc.\@ output
+% drivers. Obviously, the final compatibility with the different output
+% drivers depends on the actual code that is placed in the hooks.
% \end{enumerate}
%
-% Also in some sense \Lpack{everypage} can be related to package
-% \Lpack{everyshi} by Martin Schroeder, but it differs radically from
-% it in the implementation. In fact,\Lpack{everypage} operates by
-% manipulation of the |\@begindvi| macro, rather than at the
-% lower level |\shipout| macro.
-%
-% \section{User interface}
-% \DescribeMacro{\AddEverypageHook}\DescribeMacro{\AddThispageHook}
-% The |\AddEverypageHook| accepts one argument and adds it to the list
-% of hooks that are run before every page is output. The
-% |\AddThispageHook| accepts one argument and adds it to the list of
-% hooks that are run before the current page is output.
-%
-% Note that once hooks are stacked, there is no way to unstack them,
-% nor to clear them. In order to have hooks that get run only when
-% specific conditions are met, conditionals must be included in the
-% hooks.
-%
-% Also note that no particular assumption is made on the \LaTeX\
-% output driver, so \Lpack{everypage} should work equally well with
-% \LaTeX\ and pdf\LaTeX. Furthermore, the package should work equally
-% well with dvi, dvips, etc.\@ output drivers. Obviously, the final
-% compatibility with the different output drivers depends on the
-% actual code that is placed in the hooks.
-%
-% For usage examples, please see the \Lpack{flippdf} and
-% \Lpack{draftwatermark} packages.
+% \subsection{Comparison with other packages}
%
+% The purpose of the original code base is better understood by comparing
+% it to other packages that were meant to solve related problems at the
+% time when \LaTeX\ had no hook mechanism of its own:
+%
+% \begin{itemize}
+% \item In comparison with \Lpack{bobhook} by Karsten Tinnefeld,
+% Lpack{everypage} (in its legacy incarnation) used to differ in purpose
+% and in the hook implementation. Package \Lpack{everypage} was meant to
+% make no assumption on what one could want to do on every page, whether
+% to add text, images, or some low-level instruction for the output
+% driver, or even to perform some accounting task. This made the package
+% lighter and more flexible at the cost of being more difficult to
+% use. In other words, \Lpack{everypage} was meant to be more of a
+% plumbing to be employed in higher level packages;
+% \item in comparison with \Lpack{watermark} by Alexander I.~Rozhenko,
+% similar considerations could me made. Specifically, \Lpack{watermark}
+% is explicitly targeted at making it easy to put watermarks on document
+% pages, while \Lpack{everypage} is lower level.
+% \item in comparison to both \Lpack{bobhook} and \Lpack{watermark},
+% \Lpack{everypage} used to employ a similar low level mechanism, by
+% manipulation of the internal \LaTeX\ macro |\@begindvi| to do the
+% job. However, the redefinition of |\@begindvi| in \Lpack{everypage}
+% was postponed as much as possible, striving to avoid interference with
+% other packages using |\AtBeginDvi| or anyway manipulating
+% |\@begindvi|. Furthermore, \Lpack{everypage} made no special
+% assumption on the initial code that |\@begindvi| might contain.
+% \item in comparison with \Lpack{everyshi} by Martin Schroeder,
+% \Lpack{everypage} used to be similarly low level, but relied on
+% changing the |\@begindvi| macro, rather than the even lower-level
+% |\shipout| macro.
+% \end{itemize}
+%
+% \subsection{Known applications of the \Lpack{everypage} code}
+%
+% Package \Lpack{everypage} has historically found application in at least
+% two higher level packages, namely:
+% \begin{itemize}
+% \item \Lpack{draftwatermark}, meant at providing extended facilities for
+% page watermarking on all \LaTeX\ engines and output drivers; and
+% \item \Lpack{flippdf}, meant at catering for a frequent preprint
+% requirement, where publisher may require a document with
+% \emph{mirrored} pages to get the best results out of a photographic
+% printout process.
+% \end{itemize}
+%
+% \section{The new code base}
+% \changes{R2.0}{2020/10/11}{%
+% Complete package rewrite to take advantage of the new
+% LaTeX hook mechanisms introduced in the Fall 2020 release.}
+%
+% The new code base differs from the old one because it does not touch
+% any \LaTeX\ internals. Conversely it relies on the hook mechanism that
+% is officially provided by \LaTeX\ since its 2020 fall release.
+% Obviously, this has no other purpose than to provide back
+% compatibility for older \LaTeX\ code written before such \LaTeX\
+% release and relying on the original \Lpack{everypage} interfaces.
+%
+% To this aim, the new code base does the following:
+% \begin{enumerate}
+% \item complains out loud, reminding that new code should not be based on
+% \Lpack{everypage}, but rather make direct usage of the new \LaTeX\
+% interfaces;
+% \item checks whether the new \LaTeX\ interfaces are actually
+% available. If this is not the case, it resorts to loading
+% \Lpack{everypage-1x} that provides the old code base;
+% \item \label{itm:addtohook}%
+% implements/emulates the |\AddEverypageHook| and |\AddThispageHook|
+% commands on top of the new |\AddToHook| and |\AddToHookNext| \LaTeX\
+% commands.
+% \end{enumerate}
+%
+% With specific reference to point \ref{itm:addtohook} above, note that
+% the new hook mechanism provided by \LaTeX\ is extensively documented in
+% issue 32 of \emph{\LaTeX\ News} and in file
+% |lthooks-doc.pdf|. Furthermore, consider that \Lpack{everypage} employs
+% hooks in the \emph{shipout} class, which are documented in file
+% |ltshipout-doc.pdf|.
+%
+% \subsection{Compatibility of the new code with the original \Lpack{everypage}
+% interface}
+%
+% Because the implementation is different and due to choices (in fact,
+% quite reasonable ones) by the \LaTeX\ developers, the new implementation
+% of \Lpack{everypage} cannot be exactly equivalent to the original one
+% (hence, please, do not open bugs for this!).
+%
+% The main difference is the hook code provided by the user now gets
+% wrapped in a |\put| command, inside a |picture| environment with
+% |\unitlength| at 1\,pt. This is because \Lpack{everypage} relies on a
+% |shipout/background| type hook. The |\put| command typesets material at
+% (1\,in, -1\,in) to emulate the original coordinate system of
+% \Lpack{everypage}. This means that some of the points about the
+% interface in section~\ref{ssec:ui} do not apply anymore (or at least do
+% not apply in the same way). Specifically, point \ref{itm:formatting}
+% about lack of any pre-canned formatting is not completely true anymore,
+% because of the implicit picture environment. Furthermore, point
+% \ref{itm:nospace} about the need not to eat up space can now be
+% completely ignored.
+%
+% While the changes described above seem to go in the direction of less
+% rules and less concern, this might not be always true and subtle
+% breakage of legacy code may happen in corner cases.
+%
+% \section{Forcing usage of the older code base}
+%
+% The usage of the older code base of \Lpack{everypage} can be forced by
+% simply substituting |\usepackage{everypage-1x}| for
+% |\usepackage{everypage}|. In this case, no warning about the package
+% obsolescence is emitted, because it is assumed that the user knows what
+% he/she is doing. However, explicitly requiring \Lpack{everypage-1x}
+% is obviously discouraged.
+%
+% The old code base actually works just fine with the Fall 2020 \LaTeX\
+% release and it will probably keep to do so for a few more \LaTeX\
+% release cycles. This is mostly up to the \LaTeX\ developers and their
+% will to maintain untouched some internal deprecated interfaces. In any case,
+% |\usepackage{everypage-1x}| will eventually stop working and is now
+% declared in an \emph{unmaintained state}.
+%
+%
% \StopEventually {}
-%
% \section{Implementation}
-%
+% \subsection{Implementation of \Lpack{everypage}}
+% \iffalse
+%<*everypage>
+% \fi
% Announce the name and version of the package, which requires
% \LaTeXe.
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{everypage}%
- [2007/06/20 1.1 Hooks to run on every page]
+ [2020/10/17 R2.0b Hooks to run on every page]
+% \end{macrocode}
+% Complain out loud about the package being obsolete.
+% \begin{macrocode}
+\PackageWarningNoLine{everypage}{%
+ Functionality similar to this package has recently\MessageBreak
+ been implemented in LaTeX. This package is now in\MessageBreak
+ legacy status.\MessageBreak
+ Please, don't use it in new documents and packages}
+% \end{macrocode}
+% Depending on the actual functionalities provided by \LaTeX\ consider
+% loading \Lpack{everypage-1x}. If so doing, warn about this too and
+% stop. Otherwise give some more warnings.
+% \begin{macrocode}
+\@ifundefined{AddToHook}{%
+ \PackageWarningNoLine{everypage}{%
+ You appear to be running a version of LaTeX\MessageBreak
+ too old to provide the new functionality.\MessageBreak
+ Forcing fallback to `everypage-1x` that\MessageBreak
+ uses an older code base}
+ \RequirePackage{everypage-1x}
+ \endinput}{%
+ \PackageWarningNoLine{everypage}{%
+ You appear to be running a version of LaTeX\MessageBreak
+ providing the new functionality.\MessageBreak
+ Doing the best to deliver the original `everypage`\MessageBreak
+ interface on top of it. Strict equivalence is\MessageBreak
+ not possible, breakage may occur.\MessageBreak
+ If truly needed, Use `everypage-1x` to force the\MessageBreak
+ loading of an older code base}}
+% \end{macrocode}
+% \begin{macro}{\AddEverypageHook}\begin{macro}{\AddThispageHook}%
+% Finally, implement the \Lpack{everypage} interface on top of the \LaTeX\
+% |shipout/background| hooks.
+% \begin{macrocode}
+\newcommand*{\AddEverypageHook}[1]{%
+ \AddToHook{shipout/background}{\put(1in,-1in){#1}}}
+\newcommand*{\AddThispageHook}[1]{%
+ \AddToHookNext{shipout/background}{\put(1in,-1in){#1}}}
+% \end{macrocode}
+% \end{macro}\end{macro}
+% \iffalse
+%</everypage>
+% \fi
+%
+% \subsection{Implementation of \Lpack{everypage-1x}}
+% \iffalse
+%<*everypage-1x>
+% \fi
+% Announce the name and version of the package, which requires
+% \LaTeXe.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{everypage-1x}%
+ [2020/10/10 1.2 Hooks to run on every page]
% \end{macrocode}
%
% \begin{macro}{\sc@everypage@hook}\begin{macro}{\sc@everypage@hook}
@@ -191,6 +426,11 @@
% \end{macro}
%
% \begin{macro}{\sc@op@preamble}
+% \changes{R1.1}{2007/06/20}{%
+% Fix an out of memory condition.}
+% \changes{R1.2}{2020/10/10}{%
+% Reorder operations to take care of code to execute at the beginning of
+% the output before the `everypage' hooks.}
% The outputpage preamble contains instructions to redefine the
% |\@begindvi| macro that is called at every page output by the
% original |\@outputpage| code.
@@ -201,10 +441,10 @@
\newcommand*{\sc@op@preamble}{%
\let\sc@begindvi\@begindvi
\def\@begindvi{%
+ \sc@begindvi
\sc@everypage@hook
\sc@thispage@hook
- \gdef\sc@thispage@hook{}
- \sc@begindvi}}
+ \gdef\sc@thispage@hook{}}}
% \end{macrocode}
% \end{macro}
%
@@ -230,31 +470,33 @@
% other packages are loaded.
% \begin{macrocode}
\AtBeginDocument{\sc@ep@init}
-\endinput
% \end{macrocode}
+% \iffalse
+%</everypage-1x>
+% \fi
%
% \Finale
+% \PrintChanges
% \PrintIndex
%
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
\endinput
-%%% Local Variables:
-%%% mode: doctex
-%%% TeX-master: t
-%%% End:
-
+% %% Local Variables:
+% %% mode: doctex
+% %% TeX-master: t
+% %% End: \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/everypage/everypage.ins b/Master/texmf-dist/source/latex/everypage/everypage.ins
index 9131ac42697..ea78f10b522 100644
--- a/Master/texmf-dist/source/latex/everypage/everypage.ins
+++ b/Master/texmf-dist/source/latex/everypage/everypage.ins
@@ -1,5 +1,5 @@
%% everypage.ins
-%% Copyright 2006
+%% Copyright 2006-2007, 2020
%% Sergio Callegari <sergio.callegari@gmail.com>
%%
%% ---------------------------------------------
@@ -7,13 +7,12 @@
%% a contribution to the LaTeX2e system.
%% ---------------------------------------------
%%
-%% It may be distributed and/or modified under the conditions of the
-%% LaTeX Project Public License, either version 1.3 of this licence, or
-%% any later version. The latest version of this license is at
-%% http://www.latex-project.org/lppl.txt and version 1.3 is part
-%% of all distributions of LaTeX version 2003/06/01 or later.
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, version 1.3c.
+%% This license is in
+%% https://www.latex-project.org/lppl/lppl-1-3c/
%%
-%% This work has the LPPL maintenance status "author-maintained".
+%% This work has the LPPL maintenance status "maintained".
%%
%% This program consists of the files listed in the README file
%% included in the package.
@@ -25,17 +24,14 @@
%% --------------- start of docstrip commands ------------------
%%
\input docstrip.tex
-\preamble
-This is file `everypage.sty',
-generated with the docstrip utility.
-The original source files were:
+\usedir{tex/latex/everypage}
-everypage.dtx
+\preamble
- IMPORTANT NOTICE:
+IMPORTANT NOTICE:
-Copyright 2006
+Copyright 2006-2007, 2020
Sergio Callegari <sergio.callegari@gmail.com>
---------------------------------------------
@@ -43,25 +39,27 @@ This file is part of the everypage package,
a contribution to the LaTeX2e system.
---------------------------------------------
-This program consists of the files listed in the README file included
-in the package.
+This program consists of the files listed in the README.md file included in
+the package.
Any modified versions of this file must be renamed with new filenames
-distinct from everypage.sty.
+distinct from \outFileName.
-For distribution of the original source see the terms
-for copying and modification in the file everypage.dtx.
+For distribution of the original source see the terms for copying and
+modification in the file \inFileName.
-This generated file may be distributed as long as the
-original source files, as listed above, are part of the
-same distribution. (The sources need not necessarily be
-in the same archive or directory.)
+This generated file may be distributed as long as the original source files,
+as listed above, are part of the same distribution. (The sources need not
+necessarily be in the same archive or directory.)
\endpreamble
\keepsilent
\Msg{*** Generating the LaTeX2e package files ***}
-\generate{\file{everypage.sty}{\from{everypage.dtx}{}}}
+
+\generate{\file{everypage.sty}{\from{everypage.dtx}{everypage}}}
+\generate{\file{everypage-1x.sty}{\from{everypage.dtx}{everypage-1x}}}
+
\ReportTotals
\Msg{***********************************************************}
@@ -70,15 +68,17 @@ in the same archive or directory.)
\Msg{* file(s) into a directory searched by TeX:}
\Msg{*}
\Msg{* \space\space everypage.sty}
+\Msg{* \space\space everypage-070620.sty}
\Msg{*}
\Msg{*}
-\Msg{* To produce the documentation run the files ending with}
-\Msg{* `.dtx' through LaTeX (or maybe pdfLaTeX).}
-\Msg{* Process any name.idx file by:}
-\Msg{* \space\space\space\space makeindex -s gind.ist name}
-\Msg{* Process any name.glo file by:}
-\Msg{* \space\space\space\space makeindex -s gglo.ist -o name.gls name.glo}
-\Msg{* Re run through LaTeX the .dtx files as necessary}
+\Msg{* To produce the documentation:}
+\Msg{* - run everypage.dtx through LaTeX}
+\Msg{* - Process everypage.idx by:}
+\Msg{* \space\space\space\space makeindex -s gind.ist everypage}
+\Msg{* - Process any everypage.glo by:}
+\Msg{* \space\space\space\space
+ makeindex -s gglo.ist -o everypage.gls everypage.glo}
+\Msg{* Re run through LaTeX everypage.dtx as necessary}
\Msg{*}
\Msg{***********************************************************}
diff --git a/Master/texmf-dist/source/latex/ms/everysel.dtx b/Master/texmf-dist/source/latex/everysel/everysel.dtx
index 7e415dfa40d..9047ae43cfa 100644
--- a/Master/texmf-dist/source/latex/ms/everysel.dtx
+++ b/Master/texmf-dist/source/latex/everysel/everysel.dtx
@@ -1,17 +1,46 @@
+% \iffalse meta-comment
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Copyright (C) Martin Schröder, 1994–2001
+% Marei Peischl (peiTeX) <marei@peitex.de>, 2021
+%
+% 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
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is
+% Marei Peischl <marei@peitex.de>.
+%
+% This work consists of the files
+% README.md
+% everysel.dtx
+% everysel.ins
+% and the derived files
+% everysel.sty
+% everysel-2011/10/28.sty
+% everysel.pdf
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \fi
% \iffalse
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+%<package|fallback>\NeedsTeXFormat{LaTeX2e}[1995/12/01]
%<package>\ProvidesPackage{everysel}
-%<package> [2011/10/28 v1.2 EverySelectfont Package (MS)]
+%<package> [2021/01/20 v2.1 EverySelectfont Package (MS)]
%
%<*driver>
-\ProvidesFile{everysel.drv}
- [2009/05/30 v1.1 Driver for EverySelectfont Package (MS)]
\documentclass[a4paper]{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage{url}
\usepackage[toc]{multitoc}
-\usepackage{lmodern,microtype,svn}
-\usepackage{hypdoc}
+\usepackage{lmodern,microtype}
\usepackage{geometry}
\usepackage{everysel}
\GetFileInfo{everysel.sty}
@@ -21,14 +50,14 @@
\CodelineIndex % Index code by line number
%\OnlyDescription % comment out for implementation details
%%\OldMakeIndex % use if your MakeIndex is pre-v2.9
-\setcounter{IndexColumns}{2}
+\setcounter{IndexColumns}{1}
% onecolumn glossary
-\makeatletter
- \renewenvironment{theglossary}{%
- \glossary@prologue
- \setlength\emergencystretch{5em}
- \GlossaryParms \let\item\@idxitem \ignorespaces}{}
-\makeatother
+%% \makeatletter
+%% \renewenvironment{theglossary}{%
+%% \glossary@prologue
+%% \setlength\emergencystretch{5em}
+%% \GlossaryParms \let\item\@idxitem \ignorespaces}{}
+%% \makeatother
\setlength{\IndexMin}{40ex}
\setlength{\columnseprule}{.4pt}
\addtolength{\oddsidemargin}{2cm}
@@ -36,34 +65,14 @@
\raggedright % otherwise we get over/underfull hboxes
\begin{document}
\DocInput{everysel.dtx}
- \PrintIndex\PrintChanges
+ \PrintChanges
% Make sure that the index is not printed twice
% (ltxdoc.cfg might have a second \PrintIndex command)
\let\PrintChanges\relax
\end{document}
%</driver>
-%
-% Copyright (C) [1996..2011] by Martin Schr\"oder.
-%
-% 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
-% http://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 Martin Schröder
-%
-% This work consists of the files everysel.dtx and everysel.ins
-% and the derived files everysel.sty
-%
% \fi
-%
-% \CheckSum{156}
-%
+% \CheckSum{189}
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
@@ -80,9 +89,6 @@
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
%
-% \SVN $Rev: 1712 $
-% \SVNdate $Date: 2011-10-28 23:10:13 +0200 (Fr, 28. Okt 2011) $
-%
% \changes{v1.00}{1996-05-24}{New}
% \changes{v1.02}{1998-04-11}{Minor documentation enhancements}
% \changes{v1.02}{1998-08-09}{Minor documentation enhancements}
@@ -103,29 +109,29 @@
%
% \changes{v1.01}{1997-03-09}{Fixed use of \cs{newline} in title.}
% \title{\unskip
-% The \package{EverySel} package^^A
+% The obsolete \package{EverySel} package^^A
% \thanks{^^A
-% The version number of this file is \fileversion, subversion
-% revision~\#\SVNRev, last revised \protect\SVNDate.\protect\newline
+% The version umber of this file is \fileversion.\protect\newline
% The name \textsf{EverySel} is a tribute to the $8+3$ file-naming
% convention of certain ``operating systems'' and their ``file systems'';
% strictly speaking it should be \textsf{EverySelectfont}.}^^A
% }
-% \author{Martin Schr\"oder\\[0.5ex]
-% \normalsize Unterstra\ss{}e 31\\
-% \normalsize 47051 Duisburg\\
-% \normalsize Germany\\
-% \normalsize \href{mailto:martin@oneiros.de}{\texttt{martin@oneiros.de}}}
+% \author{Martin Schröder\thanks{maintained by Marei Peischl}}
% \maketitle
%
%
% ^^A -----------------------------
-%
-%
+% \changes{v2.0}{2021/01/17}{Information on new kernel methods}
+% \renewcommand*{\abstractname}{Why you should no longer use this package:}
% \begin{abstract}
% This packages provides hooks into the NFSS-command
% \cs{selectfont} called \cs{EverySelectfont} and
% \cs{AtNextSelectfont} analogous to \cs{AtBeginDocument}.
+% In January 2021 the hook management \LaTeX{} provides since autumn 2020 the kernel directly contains these hooks. Information on their usage can be found in the the corresponding documentation for
+% \package{lthooks}\cite{lthooks-doc} and look for Hooks provided in NFSS command.
+% We only provide this package to allow backwards compatibility.
+% For current versions of \LaTeX{} it's only mapping the hooks to the original \package{everysel} macros.
+% In case you use an older \LaTeX{} format, \package{everysel} will automatically fallback to its' old implementation by loading \package{everysel-2011/10/28.sty}.
% \end{abstract}
%
% \pagestyle{headings}
@@ -201,21 +207,27 @@
% ^^A
% David Carlisle provided the solution for my problems with \cs{CheckCommand}.
%
+% Thanks to the \LaTeX-Project-Team for creating solutions which made this an obsolete package. Special thanks to Ulrike Fischer to keep the maintainer up to date.
+%
%
% ^^A -----------------------------
%
% \begin{thebibliography}{1}
% \raggedright
+% \bibitem{lthooks-doc}
+% Frank Mittelbach.
+% \newblock The \package{ltshipout} package.
+% \newblock \url{http://mirrors.ctan.org/macros/latex/base/lthooks-doc.pdf}
% \bibitem{package:tracefnt}
% Frank Mittelbach and Rainer Sch\"opf.
% \newblock The \package{tracefnt} package for use with the new
% font selection scheme.
-% \newblock \url{CTAN: tex-archive/macros/latex/base/ltfsstrc.dtx}.
+% \newblock \url{http://mirrors.ctan.org/macros/latex/base/ltfsstrc.dtx}.
% \newblock \LaTeXe{} package.
% \bibitem{package:ragged2e}
% Martin Schr\"oder.
% \newblock The \package{ragged2e} package.
-% \newblock \url{CTAN: tex-archive/macros/latex/contrib/supported/ms/ragged2e.dtx}.
+% \newblock \url{http://mirrors.ctan.org/macros/latex/contrib/supported/ms/ragged2e.dtx}.
% \newblock \LaTeXe{} package.
% \end{thebibliography}
%
@@ -224,16 +236,50 @@
%
% ^^A -----------------------------
%
-% \section{The implementation}
+% \section{The Implementation}
% ^^A
-% \begin{macrocode}
+% \changes{v2.0}{2021/01/17}{Emulate everysel if the kernel is new enough.}
+% \iffalse
%<*package>
+% \fi
+% \begin{macrocode}
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+\IfFormatAtLeastTF{2021/01/05}{}{\input{everysel-2011-10-28.sty}}
+\IfFormatAtLeastTF{2021/01/05}{}{\endinput}
+\newcommand*{\EverySelectfont}[1]{\AddToHook{selectfont}{#1}}
+\newcommand*{\AtNextSelectfont}[1]{\AddToHookNext{selectfont}{#1}}
% \end{macrocode}
-%
-%
+% \changes{v2.1}{2021-01-20}{Add \textbackslash{}@EverySelectfont@Legacy + conditional warning}
+% Some packages are using the intial hook of everysel internally (see also \url{https://github.com/latex3/latex2e/issues/474}).
+% So Version 2.1 provides these macros to ensure compatibility.
+% In case someone is changing the inital hook everysel will now show a warning to inform package authors to switch to lthooks instead.
+% A future release is planned to always trigger this warning.
+% \begin{macrocode}
+\newcommand*\@EverySelectfont@Legacy{\let\@EverySelectfont@Init\undefined}
+\newcommand*{\@EverySelectfont@Init}{\@EverySelectfont@Legacy}
+\AddToHook{begindocument}{%
+ \expandafter\ifx\@EverySelectfont@Init\@EverySelectfont@Legacy\else
+ \PackageWarningNoLine{everysel}{%
+ Everysel is no longer required.,\MessageBreak
+ The LaTeX kernel is now providing the same functionality itself.,\MessageBreak
+ See the package documentation or lthooks-doc for further information.
+ }%
+ \fi
+ \@EverySelectfont@Init
+}
+% \end{macrocode}
+% \iffalse
+%</package>
+% \fi
% ^^A -----------------------------
-%
-% \subsection{Allocations}
+% \subsection{The original implementation by Martin Schröder}
+% To provide compatibility for older \LaTeX{} formats we wrap the
+% original implementation of \package{everysel} version 1.2 into
+% the fallback package \package{everyshi-2011-01-10}.
+% \iffalse
+%<*fallback>
+% \fi
+% \subsubsection{Allocations}
% ^^A
% First we allocate the hooks
% \begin{macro}{\@EverySelectfont@EveryHook}
@@ -254,7 +300,7 @@
%
% ^^A -----------------------------
%
-% \subsection{The user-visible commands}
+% \subsubsection{The user-visible commands}
% ^^A
% \begin{macro}{\EverySelectfont}
% \begin{macro}{\AtNextSelectfont}
@@ -271,7 +317,7 @@
%
% ^^A -----------------------------
%
-% \subsection{Inserting the hooks}
+% \subsubsection{Inserting the hooks}
% ^^A
% The hooks are placed \emph{inside} \cs{selectfont}.
% Unfortunately for us there are \emph{two} versions of
@@ -406,13 +452,12 @@
%
%
% ^^A -----------------------------
-%
-% \begin{macrocode}
-%</package>
-% \end{macrocode}
+% \iffalse
+%</fallback>
+% \fi
%
%
% ^^A -----------------------------
%
% \Finale
-% ^^A vim:tw=70:ts=2
+% ^^A
diff --git a/Master/texmf-dist/source/latex/everysel/everysel.ins b/Master/texmf-dist/source/latex/everysel/everysel.ins
new file mode 100644
index 00000000000..472e18a802c
--- /dev/null
+++ b/Master/texmf-dist/source/latex/everysel/everysel.ins
@@ -0,0 +1,49 @@
+\input docstrip.tex
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{everysel.ins}
+ [2020/01/20 v2.1 Installation script for EverySelectfont Package]
+
+\preamble
+Copyright (C) 1996–2009 Martin Schröder, 2020 Marei Peischl (peiTeX) <marei@peitex.de>
+
+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
+http://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is
+ Marei Peischl <marei@peitex.de>.
+
+This work consists of the files everysel.dtx and everysel.ins
+and the derived files everysel.sty and everysel-2011-10-28.sty.
+
+\endpreamble
+\keepsilent
+\askforoverwritefalse
+\generate{%
+ \file{everysel.sty}{\from{everysel.dtx}{package}}
+ \file{everysel-2011-10-28.sty}{\from{everysel.dtx}{fallback,origpackage}}
+}
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* style files into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space everysel.sty}
+\Msg{* \space\space everysel-2011-10-28.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file everysel.dtx}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing}
+\Msg{***********************************************************}
+\endbatchfile
+%%
+%% End of file `everysel.ins'.
diff --git a/Master/texmf-dist/source/latex/ms/everyshi.dtx b/Master/texmf-dist/source/latex/everyshi/everyshi.dtx
index b630b34946f..5bae127c175 100644
--- a/Master/texmf-dist/source/latex/ms/everyshi.dtx
+++ b/Master/texmf-dist/source/latex/everyshi/everyshi.dtx
@@ -1,24 +1,50 @@
+% \iffalse meta-comment
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Copyright (C) Martin Schröder, 1994–2001
+% Marei Peischl (peiTeX) <marei@peitex.de>, 2020
+%
+% 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
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is
+% Marei Peischl <marei@peitex.de>.
+%
+% This work consists of the files
+% README.md
+% everyshi.dtx
+% everyshi.ins
+% and the derived files
+% everyshi.sty
+% everyshi-2001-05-15.sty
+% everyshi.pdf
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \fi
% \iffalse
-%% File: everyshi.dtx Copyright (C) 2001 Martin Schr\"oder
%
-%<package>\NeedsTeXFormat{LaTeX2e}
+%<package|fallback>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{everyshi}
-%<package> [2001/05/15 v3.00 EveryShipout Package (MS)]
+%<package> [2020/11/18 v4.00 EveryShipout Package]
%
%<*driver>
-\ProvidesFile{everyshi.drv}
- [1999/06/08 v2.03 Driver for EveryShipout Package (MS)]
\documentclass{ltxdoc}
\usepackage{url}
-\usepackage[toc]{multitoc}
\usepackage{everyshi}
\GetFileInfo{everyshi.sty}
\setcounter{IndexColumns}{2}
\EnableCrossrefs
-%%\DisableCrossrefs% Say \DisableCrossrefs if index is ready
\CodelineIndex % Index code by line number
-\OnlyDescription % comment out for implementation details
-%%\OldMakeIndex % use if your MakeIndex is pre-v2.9
+%\OnlyDescription % comment out for implementation details
\setcounter{IndexColumns}{2}
\setlength{\IndexMin}{30ex}
\setlength{\columnseprule}{.4pt}
@@ -26,22 +52,9 @@
\DocInput{everyshi.dtx}
\end{document}
%</driver>
-%
-% Copyright (C) 2001 by Martin Schr\"oder. All rights reserved.
-%
-% This program may be redistributed and/or modified under the terms
-% of the LaTeX Project Public License, either version 1.0 of this
-% license, or (at your option) any later version.
-% The latest version of this license is in
-% CTAN:macros/latex/base/lppl.txt.
-%
-% Happy users are requested to send me a postcard. :-)
-%
-% For error reports in case of UNCHANGED versions see everyshi.ins
-%
% \fi
+% \CheckSum{68}
%
-% \CheckSum{51}
%
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -59,38 +72,7 @@
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
%%
-%% \iffalse meta-comment
-%% ===================================================================
-%% @LaTeX-package-file{
-%% author = {Martin Schr\"oder},
-%% version = "3.00",
-%% date = "15 May 2001",
-%% filename = "everyshi.sty",
-%% address = {Martin Schr\"oder
-%% Cr\"usemannallee 3
-%% 28213 Bremen
-%% Germany},
-%% telephone = "+49-421-2239425",
-%% email = "martin@oneiros.de",
-%% pgp-Key = "2048 bit / KeyID 292814E5",
-%% pgp-fingerprint = "7E86 6EC8 97FA 2995 82C3 FEA5 2719 090E",
-% checksum = "51832 357 1434 12417",
-% codetable = "ISO/ASCII",
-% keywords = "LaTeX2e, \shipout",
-% supported = "yes",
-%% docstring = "LaTeX package which provides hooks into
-%% \cs{shipout}.
-%
-% 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."
-%% }
-%% ===================================================================
-%% \fi
-%
+% \newcommand*{\package}[1]{\textnormal{\sffamily#1}}
% \changes{v1.00}{1994/12/04}{New}
% \changes{v1.02}{1994/12/07}{Name changed from \textsf{atshipou} to
% \textsf{everyshi}}
@@ -99,17 +81,13 @@
% \changes{v2.02}{1998/08/09}{Documentation improved}
% \changes{v2.03}{1999/06/08}{Moved to LPPL}
% \changes{v3.00}{2001/05/15}{\cs{AtNextShipout} added}
-%
-% \newcommand*{\package}[1]{\textnormal{\sffamily#1}}
-% \newcommand*{\NEWfeature}[1]{%
-% \hskip 1sp \marginpar{\small\sffamily\raggedright
-% New feature\\#1}}
+% \changes{v4.00}{2020/11/18}{Mark \package{everyshi} as obsolete and use the kernel methods}
%
% ^^A -----------------------------
%
% \changes{v2.01}{1997-03-09}{Fixed use of \cs{newline} in title.}
% \title{\unskip
-% The \package{everyshi} package^^A
+% The obsolete \package{everyshi} package^^A
% \thanks{^^A
% The version umber of this file is \fileversion,
% last revised \filedate.\protect\newline
@@ -118,23 +96,23 @@
% systems''; strictly speaking it should be
% \textsf{everyshipout}.}^^A
% }
-% \author{Martin Schr\"oder\\[0.5ex]
-% \normalsize Cr\"usemannallee 3\\
-% \normalsize 28213 Bremen\\
-% \normalsize Germany\\
-% \normalsize martin@oneiros.de\\
-% \scriptsize \texttt{PGP-Key: 2048 bit / KeyID 292814E5}\\[-0.5em]
-% \scriptsize \texttt{7E86 6EC8 97FA 2995~~82C3 FEA5 2719 090E}}
+% \author{Martin Schröder\thanks{maintained by Marei Peischl}}
% \date{\filedate}
% \maketitle
%
% ^^A -----------------------------
-%
-%
+% \renewcommand*{\abstractname}{Why you should no longer use this package:}
% \begin{abstract}
-% This packages provides hooks into \cs{sshipout}
+% This packages provides hooks into \cs{sshipout}
% called \cs{EveryShipout} and \cs{AtNextShipout} analogous to
% \cs{AtBeginDocument}.
+%
+% With the introduction of the \LaTeX{} hook management this package became obsolete in 2020.
+% Information on their usage can be found in the the corresponding documentation for
+% \package{lthooks}\cite{lthooks-doc} and \package{ltshipout}\cite{ltshipout-doc}.
+% We only provide this package to allow backwards compatibility.
+% For current versions of \LaTeX{} it's only mapping the hooks to the original \package{everyshi} macros.
+% In case you use an older \LaTeX{} format, \package{everyshi} will automatically fallback to its' old implementation by loading \package{everyshi-2001-05-15}.
% \end{abstract}
%
% \pagestyle{headings}
@@ -147,19 +125,12 @@
%
% \section{Introduction}
%
+% \changes{v4.00}{2020/11/18}{Information on new kernel methods}
% This package provides the hooks \cs{EveryShipout} and
% \cs{AtNextShipout} whose arguments are executed after the output
% routine has constructed \cs{box255}, and before \cs{shipout} is
% called.
-%
-% An example application for this package would be a package for
-% adding text to the bottom of each page.
-% Such a package does exist: \package{prelim2e}\cite{package:prelim2e}.
-%
-% \changes{v3.00}{2001/05/15}{Reference to \package{eso-pic} added}
-% Another application is a package for adding pictures to every page:
-% \package{eso-pic}\cite{package:eso-pic}.
-%
+% \changes{v4.00}{2020/11/18}{Remove example applications.}
% ^^A -----------------------------
%
% \section{Usage}
@@ -172,7 +143,6 @@
% globally; there is currently no way to remove it.
%
% \DescribeMacro{\AtNextShipout}
-% \NEWfeature{2001/05/15}
% \cs{AtNextShipout}\marg{code} declares
% \mbox{$\langle$\emph{code}$\rangle$} that is saved internally
% and executed just before \emph{only the next} \cs{shipout}.
@@ -202,12 +172,23 @@
%
% ^^A -----------------------------
%
+% \begin{thebibliography}{1}
+% \bibitem{lthooks-doc}
+% Frank Mittelbach.
+% \newblock The \package{ltshipout} package.
+% \newblock \url{http://mirrors.ctan.org/macros/latex/base/lthooks-doc.pdf}
+% \bibitem{ltshipout-doc}
+% Frank Mittelbach.
+% \newblock The \package{ltshipout} package.
+% \newblock \url{http://mirrors.ctan.org/macros/latex/base/ltshipout-doc.pdf}
+% \end{thebibliography}
+%
% \StopEventually{^^A
-
% ^^A -----------------------------
%
% \section{Acknowledgements}
% ^^A
+% Thanks to Ulrike Fischer for the advice during preparation of Version 4.00.
% Version 2.0 of \package{everyshi} borrows heavily from
% \textsf{quire.tex} of the \textsf{Midnight Macros} by Marcel R.~van
% der Goot (\texttt{marcel@cs.caltech.edu}).
@@ -216,39 +197,34 @@
% As usual Rebecca Stiels improved the quality of this documentation.
%
%
-% ^^A -----------------------------
-%
-% \begin{thebibliography}{1}
-% \raggedright
-% \bibitem{package:eso-pic}
-% Rolf Niepraschk.
-% \newblock The \package{eso-pic} package.
-% \newblock \url{CTAN: tex-archive/macros/latex/contrib/supported/ms/contrib/eso-pic.dtx}.
-% \newblock \LaTeXe{} package.
-% \bibitem{package:prelim2e}
-% Martin Schr\"oder.
-% \newblock The \package{prelim2e} package.
-% \newblock \url{CTAN: tex-archive/macros/latex/contrib/supported/ms/prelim2e.dtx}.
-% \newblock \LaTeXe{} package.
-% \end{thebibliography}
-%
-% }
-%
+% \PrintChanges
+% }
% ^^A -----------------------------
%
% \section{The implementation}
+% \changes{v4.00}{2020/11/18}{Emulate everyshi if the kernel is new enough.}
% \raggedright
-%
% \begin{macrocode}
%<*package>
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}{}{\input{everyshi-2001-05-15.sty}}
+\IfFormatAtLeastTF{2020/10/01}{}{\endinput}
+\protected \def \EveryShipout {\AddToHook{shipout/before}}
+\protected \def \AtNextShipout {\AddToHookNext{shipout/before}}
+%</package>
+% \end{macrocode}
+% \subsection{The original implementation by Martin Schröder}
+% To provide compatibility for older \LaTeX{} formats we wrap the
+% original implementation of \package{everyshi} version 3.00 into
+% the fallback package \package{everyshi-2001-05-15}.
+% \begin{macrocode}
+%<*fallback>
+\ProvidesPackage{everyshi-2001-05-15}
+ [2020/11/18 v4.00 EveryShipout Package (fallback mechanism)]
% \end{macrocode}
-%
-%
-%
-% ^^A -----------------------------
%
% \subsection{Allocations}
-% ^^A
+%
% First we allocate the hooks
% \begin{macro}{\@EveryShipout@Hook}
% \changes{v2.00}{1995/01/25}{Name changed from \cs{@shipouthook} to
@@ -391,7 +367,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</package>
+%</fallback>
% \end{macrocode}
%
%
@@ -399,8 +375,3 @@
%
% \Finale
%
-% \PrintIndex\PrintChanges
-% ^^A Make sure that the index is not printed twice
-% ^^A (ltxdoc.cfg might have a second \PrintIndex command)
-% \let\PrintChanges\relax
-% \let\PrintIndex\relax
diff --git a/Master/texmf-dist/source/latex/everyshi/everyshi.ins b/Master/texmf-dist/source/latex/everyshi/everyshi.ins
new file mode 100644
index 00000000000..c1db76a10ef
--- /dev/null
+++ b/Master/texmf-dist/source/latex/everyshi/everyshi.ins
@@ -0,0 +1,49 @@
+\input docstrip.tex
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{everyshi.ins}
+ [2020/11/18 v4.0 Installation script for EveryShipout Package]
+
+\preamble
+Copyright (C) 1994–2001 Martin Schröder, 2020 Marei Peischl (peiTeX) <marei@peitex.de>
+
+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
+http://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is
+ Marei Peischl <marei@peitex.de>.
+
+This work consists of the files everyshi.dtx and everyshi.ins
+and the derived files everyshi.sty and everyshi-2001-05-15.sty.
+
+\endpreamble
+\keepsilent
+\askforoverwritefalse
+\generate{
+ \file{everyshi.sty}{\from{everyshi.dtx}{package}}
+ \file{everyshi-2001-05-15.sty}{\from{everyshi.dtx}{fallback,origpackage}}
+}
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* style files into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space everyshi.sty}
+\Msg{* \space\space everyshi-2001-05-15.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file everysel.dtx}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing}
+\Msg{***********************************************************}
+\endbatchfile
+%%
+%% End of file `everyshi.ins'.
diff --git a/Master/texmf-dist/source/latex/exercises/exercises.dtx b/Master/texmf-dist/source/latex/exercises/exercises.dtx
index d818e495e6d..4ec2313f34e 100644
--- a/Master/texmf-dist/source/latex/exercises/exercises.dtx
+++ b/Master/texmf-dist/source/latex/exercises/exercises.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2015 by Roger Jud <rogerjud@outlook.com>
+% Copyright (C) 2000 by Roger Jud <rogerjud@outlook.com>
% -------------------------------------------------------
%
% This file may be distributed and/or modified under the
@@ -17,7 +17,7 @@
%
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-%<package>\ProvidesPackage{exercises}[2015/09/19 v1.0 .dtx exercises file]
+%<package>\ProvidesPackage{exercises}[2000/05/17 v1.1 .dtx exercises file]
%
%<*driver>
\documentclass[a4paper]{ltxdoc}
@@ -29,7 +29,7 @@ filecolor=black,%
linkcolor=black,%
urlcolor=black,%
}
-\usepackage[printsolution=true]{exercises}[2015/09/19]
+\usepackage[printsolution=true]{exercises}[2000/05/17]
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{amsmath}
@@ -71,6 +71,7 @@ urlcolor=black,%
%
%
% \changes{v1.0}{2015/09/19}{Initial version}
+% \changes{v1.1}{2000/05/17}{Add the command ifsolutionthenelse}
%
% \GetFileInfo{exercises.sty}
%
@@ -312,11 +313,55 @@ Sum of points: \totalpoints
%
%
%
+% \subsection{Print text depending on wether the solution is printed or not}
+% With the command |\ifsolutionthenelse{}{}| you can print text depending on wether the solution is printed or not.
%
-%
+% \iffalse
+%<*example>
+% \fi
+\begin{latexcode}
+\usepackage[printsolution=true]{exercises}
+\ifsolutionthenelse{%
+ \subsection*{This is the header for the solutions}%
+ }%
+ {%
+ \subsection*{This is the header for the exercises}%
+ }
+\end{latexcode}
+% \iffalse
+%</example>
+% \fi
+%
+% \emph{produces}
+%
+% \subsection*{This is the header for the solutions}
+%
+%
+% \emph{while}
%
%
%
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{latexcode}
+\usepackage[printsolution=false]{exercises}
+\ifsolutionthenelse{%
+ \subsection*{This is the header for the solutions}%
+ }%
+ {%
+ \subsection*{This is the header for the exercises}%
+ }
+\end{latexcode}
+% \iffalse
+%</example>
+% \fi
+%
+% \emph{produces}
+%
+% \subsection*{This is the header for the exercises}
+%
% \StopEventually{\PrintChanges}
%
% \section[Implementation]{Implementation -- how I've done it (only in German)}
@@ -923,7 +968,7 @@ Sum of points: \totalpoints
%
% \begin{macro}{\exercisenewpage}
% \begin{macro}{\solutionnewpage}
-% Die Befehle |exercisenewpage| und |solutionnewpage| erlauben es, einen Seitenumbruch in abhängigkeit der Lösungsausgabe einzufügen.
+% Die Befehle |exercisenewpage| und |solutionnewpage| erlauben es, einen Seitenumbruch in Abhängigkeit der Lösungsausgabe einzufügen.
% \begin{macrocode}
\newcommand{\exercisenewpage}{\ifthenelse{\boolean{exercises@printsolution}}{}{\newpage}}
% \end{macrocode}
@@ -934,5 +979,18 @@ Sum of points: \totalpoints
% \end{macro}
% \end{macro}
%
+%
+%
+% \subsection{Befehl für die bedingte Textausgabe}
+%
+% \begin{macro}{\ifsolutionthenelse}
+% Der Befehl |ifsolutionthenelse{}{}| erlaubt es, Text in Abhängigkeit der Lösungsausgabe auszugeben.
+% \begin{macrocode}
+\newcommand{\ifsolutionthenelse}[2]{\ifthenelse{\boolean{exercises@printsolution}}{#1}{#2}}
+% \end{macrocode}
+%
+% \end{macro}
+
+%
% \Finale
\endinput
diff --git a/Master/texmf-dist/source/latex/exercises/exercises.ins b/Master/texmf-dist/source/latex/exercises/exercises.ins
index 355319f2e6c..114e9e6cf0f 100644
--- a/Master/texmf-dist/source/latex/exercises/exercises.ins
+++ b/Master/texmf-dist/source/latex/exercises/exercises.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2015 by Roger Jud <rogerjud@outlook.com>
+%% Copyright (C) 2020 by Roger Jud <rogerjud@outlook.com>
%%
%% This file may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.2 of this license
@@ -21,7 +21,7 @@
This is a generated file.
-Copyright (C) 2015 by Roger Jud <rogerjud@outlook.com>
+Copyright (C) 2020 by Roger Jud <rogerjud@outlook.com>
This file may be distributed and/or modified under the conditions of
the LaTeX Project Public License, either version 1.2 of this license
diff --git a/Master/texmf-dist/source/latex/exesheet/exesheet.dtx b/Master/texmf-dist/source/latex/exesheet/exesheet.dtx
new file mode 100644
index 00000000000..c703f6434bd
--- /dev/null
+++ b/Master/texmf-dist/source/latex/exesheet/exesheet.dtx
@@ -0,0 +1,1489 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+% ----------------------------------------------------------------------
+%
+% This file 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:
+%
+% http://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.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{exesheet.dtx}
+%</driver>
+%<class|package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+%<class>\ProvidesClass{exesheet}
+%<package>\ProvidesPackage{exesheet}
+%<*class|package>
+ [2020/07/22 v1.0 .dtx exesheet file]
+%</class|package>
+%
+%<*driver>
+\documentclass{ltxdoc}
+% uncomment the following lines if you want to use the exesheet class instead of ltxdoc
+%\usepackage{doc}
+%\AtBeginDocument{\MakeShortVerb{\|}}
+%\providecommand\marg[1]{{\ttfamily\{}\meta{#1}{\ttfamily\}}}
+%\providecommand\oarg[1]{{\ttfamily[}\meta{#1}{\ttfamily]}}
+\usepackage[notoc]{exesheet}
+\usepackage{schooldocs}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage[english]{babel}
+\usepackage{lmodern}
+\usepackage{multicol}
+\usepackage{hyperref}
+\usepackage{sectsty}
+\usepackage{pstricks}
+\psset{unit=1cm}
+\geometry{textwidth=355pt,vmarginratio=1:1,hmarginratio=3:2}
+% altered by schoodocs, now very close from the default geometry used by ltxdoc
+
+\newcommand{\ds}{\displaystyle}
+\newcommand{\bs}{\textbackslash}
+\newcommand{\TODO}{\textcolor{green}{TODO}}
+
+\definecolor{darkbrown}{rgb}{0.5,0.1,0.1}
+\allsectionsfont{\sffamily\color{darkbrown}}
+\renewcommand{\labelexercisestyle}{\rmfamily\color{black}}
+\renewcommand{\labelsubpartstyle}{\rmfamily\color{black}}
+\renewcommand{\annexstyle}{\rmfamily\color{black}\MakeUppercase}
+\renewcommand{\correctionstyle}{\rmfamily\color{correctioncolor}}
+
+\displaypts
+%\diplaynotes gives a non desired margin ratio here
+% following instructions simulate \displaynotes without altering the margin ratio
+\setlength{\marginparwidth}{\oddsidemargin}
+\addtolength{\marginparwidth}{1in}
+\addtolength{\marginparwidth}{-\marginparsep}
+\setlength{\marginparwidth}{0.8\marginparwidth}
+\setboolean{marginpoints}{true}
+\setboolean{marginfullnotes}{true}
+
+\DisableCrossrefs
+%\CodelineIndex
+%\RecordChanges
+
+\title{The \textsf{exesheet} class and package}%\thanks{This document
+% corresponds to \textsf{exesheet}~\fileversion, dated \filedate.}}
+%\author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
+\subject{Antoine Missier \\
+ \texttt{antoine.missier@ac-toulouse.fr}}
+\date{July 22, 2020, \fileversion}
+\hypersetup{%
+ colorlinks,
+ linkcolor=blue,
+ pdftitle={exesheet},
+ pdfsubject={LaTeX class and package},
+ pdfauthor={Antoine Missier}
+ }
+\begin{document}
+ \DocInput{exesheet.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{637}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% \changes{v0.0}{2010/09/01}{Initial personal version}
+% \changes{v0.9}{2020/01/02}{Initial documentation in french}
+% \changes{v1.0}{2020/07/22}{Initial public version with documentation in english}
+%
+% \GetFileInfo{exesheet.dtx}
+%
+% \maketitle
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% The \textsf{exesheet} \emph{package} is used for typesetting exercise or exam sheets.
+% In addition, the \textsf{exesheet} \emph{class} loads the \textsf{schooldocs} package.
+% This one makes adjustments for margins and title and defines various layout styles
+% with particular header and footer, appropriate for exercise sheets (among others).
+% See the \textsf{schooldocs} documentation for more details.
+% The \textsf{exesheet} \emph{class} is based on \textsf{article}
+% and has the same options.
+%
+% Many other packages are dedicated to exercise sheets.
+% Most propose to encapsulate each exercise in an environment
+% while \textsf{exesheet} begins each exercise with the |\exercise| command,
+% which works like a subsection (with same features)
+% and is suitable for documents consisting exclusively of exercises.
+% The package provides also alternative formatting,
+% more relevant for short exercises.
+%
+% Another specificity of the \textsf{exesheet} package is specific settings
+% for enumeration lists, different from \LaTeX\ standard settings,
+% usefull for the numbering of questions or answers inside an exercise.
+%
+% Other packages provide often more or less elaborate mechanisms
+% to manage the placement of answers.
+% \textsf{exesheet} has no such ambitions:
+% for all exercises of the sheet, we can display subject only,
+% answer anly or both, but always at the place they are inserted
+% in the source file. On the other hand this choice may be very flexible:
+% we can do a correct version for all exercises together, or a correct version per exercise,
+% per part (subpart of exercise), per question, per sub-question.
+%
+% Finally the original fonctionality of this package is the display of a detailed marking scheme,
+% with optional explanations, in the margin of exercise answers.
+%
+% There are two possible options: \texttt{notoc} (see \ref{par:notoc})
+% and \texttt{nosetlist} (see \ref{par:nosetlist}).
+%
+%\medskip
+% In the current document, a frame is used to highlight
+% examples beside the rest of the documentation.
+%
+% \section{Titles}
+% \subsection{The \texttt{\bs exercise} command}
+
+% \DescribeMacro{\exercise}
+% Each exercise begins with the |\exercise|\oarg{opt} command.
+% This command typesets \textbf{\exercisename}, as a document
+% subsection, followed by automatic numbering,
+% unique for the whole document.
+% The optional parameter \meta{opt} is used to put additional text
+% on the same title line, for example to precise a subject or a marking scheme.
+% |\exercise[ (to begin)]| yields:
+%
+% \exercise[ (to begin)]
+% \psframe(-0.25,1.3)(12.75,-0.4)
+% Try to use this first command now, it's easy.
+%
+% \bigskip
+% To bring additional text closer to the exercise number,
+% we can use the |\unskip| command
+% which eliminates preceding space, see the following example, obtained with
+% |\exercise[\unskip : calculation]|:
+% \exercise[\unskip: calculation]
+% \psframe(-0.25,1.3)(12.75,-0.4)
+% Calculate $1+1$.
+%
+% \bigskip
+% \DescribeMacro{\exercisename}
+% The word \emph{\exercisename} has automatic translation in a few languages\footnote{Translation
+% is currently integrated into the package for the following languages: French,
+% German, Spanish, Italian, Portuguese.}
+% when the \textsf{babel} package is loaded.
+% It can be redefined, with |\renewcommand|, which should be placed
+% after |\begin{document}|, or else we can use macros from the \textsf{babel} package (allowing dynamic language change), e.g.\\
+% |\addto\captionssweedish{\def\exercisename{\"Ovning}}| (in the preamble).
+%
+% \DescribeMacro{\labelexercise}
+% This command calls |\exercisename| following by the exercise number.
+% It can be redefined. For example, to add a period after the exercise number:
+% |\renewcommand{\labelexercise}{\exercisename~\theexercise.}|
+%
+% \DescribeMacro{\theexercise}
+% To change only the numbering type, redefine
+% the |\theexercise| command, based on the |exercise| counter.
+%
+% \DescribeMacro{\labelexercisestyle}
+% This macro (which is empty by default) allows to define a particular style
+% for exercise titles. In the present document, we defined in the preamble:
+% |\renewcommand{\labelexercisestyle}{\rmfamily\color{black}}|\footnote{In the
+% present document, to highlight real sections and subsections titles,
+% their color and font have been modified with the
+% \texttt{\bs allsectionsfont} macro from the \textsf{sectsty} package.}.
+%
+% \bigskip
+% \DescribeMacro{\exercise*}
+% The starred version |\exercise*|\oarg{opt}\marg{label}
+% allows to choose another \meta{label} for a particular exercise
+% and removes the numbering. For instance:
+% |\exercise*[(Fermat theorem)]{Problem}| yields:
+%
+% \exercise*[(Fermat theorem)]{Problem}
+% \psframe(-0.25,1.3)(12.75,-0.7)
+% Proove that there are no positive integers $x, y, z$ such that $x^n+y^n=z^n$
+% for any integer $n$ greater than 2.
+%
+% \subsection{The \texttt{\bs subpart} command}
+%
+% \DescribeMacro{\subpart}
+% An exercise may contain several parts that we obtain
+% with the |\subpart|\oarg{opt} command, typeset like a subsubsection.
+% \exercise
+% \subpart[(preliminary)]
+% \psframe(-0.25,1.95)(12.75,-1.9)
+% First of all, prepare your cup of tea.
+% \subpart
+% Now you are ready to make the current exercise.
+%
+% \bigskip
+% \DescribeMacro{\thesubpart}
+% By default, the subpart numbering uses letters : A, B, C, etc.
+% This numbering type can be redefined with the |\thesubpart| command based on
+% the |subpart| counter, for instance |\renewcommand\thesubpart{\arabic{subpart}}|.
+%
+% \DescribeMacro{\subpartname} \DescribeMacro{\labelsubpart}
+% \DescribeMacro{\labelsubpartstyle}
+% As for |\exercise|, the |\subpart| command
+% uses |\subpartname| (with automatic translation in a few languages
+% if \textsf{babel} is loaded),
+% |\labelsubpart| and |\labelsubpartstyle|, which are editable.
+% \pagebreak
+%
+% \DescribeMacro{\subpart*}
+% Like |\exercise*|, the starred version |\subpart*|\oarg{opt}\marg{label}
+% allows to freely typeset the subpart \marg{label}, for instance
+% |\subpart*{First part}|.
+%
+% \subsection{The \texttt{\bs annex} command}
+% \DescribeMacro{\annex}
+% The |\annex|\oarg{opt} command typesets the title \textbf{ANNEX}, in uppercase letters, centred
+% and in the subsection style,
+% with an optional parameter, added on the same line.
+%
+% \vspace{-\baselineskip}
+% \noindent\psframe(-0.25,-0.25)(12.75,-1.25)
+% \annex[(to return)]
+%
+% \DescribeMacro{\annexname}
+% The word \emph{\annexname} has automatic translation in a few languages
+% if \textsf{babel} package is loaded.
+% It can be extended to other languages or modified by redifining |\annexname|.
+%
+% \DescribeMacro{\annexstyle}
+% The annex title style is set by the |\annexstyle| macro,
+% defined as follows: |\newcommand\annexstyle{\MakeUppercase}|.
+% This command may be redefined as one wants.
+%
+% \subsection{Exercise titles in table of contents
+% (notoc package option)} \label{par:notoc}
+% \DescribeMacro{notoc}
+% By default, the titles \emph{\exercisename}, \emph{\subpartname} or \emph{\annexname},
+% appear in the table of contents
+% (or in the pdf file summary when \textsf{hyperref} package is used).
+% To avoid this, you can set the boolean \texttt{notoc} to \texttt{true}
+% or call the \textsf{exesheet} package (or class) with \texttt{notoc} option.
+% But notice that title optional arguments will always be ignored in the table of contents.
+%
+% \subsection{Short exercises: the \texttt{\bs exe} command}
+% \DescribeMacro{\exe}
+% The |\exe| command starts an exercise by the abbreviation \textbf{\exname}.\ followed by the exercise number,
+% without using sectioning commands, and the exercise body begins on the same
+% line. An exercise starts a new paragraph without indentation.
+%
+% \exe This is a short exercise who
+% can contain several paragraphs or questions however.
+%
+% \noindent\psframe(-0.25,1.4)(12.75,-1.2)
+% \indent Here for example starts a new paragraph.
+% \exe This is another short exercise.
+%
+% \bigskip
+% \DescribeMacro{\exname} \DescribeMacro{\exlabel} \DescribeMacro{\exsepmark}
+% The abbreviation \emph{\exname} may be changed by
+% redefining |\exname|.
+% The |\exlabel| macro calls |\exname| following by a period then the exercise number,
+% and |\exsepmark| typesets a long dash.
+% We may change these features by redefining these commands.
+%
+% \bigskip
+% \DescribeMacro{\exe*}
+% The starred version prints no separator as shown below:
+%
+% \vspace{-\baselineskip}
+% \noindent\psframe(-0.25,-0.35)(12.75,-1.2)
+% \exe* Another short exercise without separator.
+%
+% \subsection{The \texttt{\bs points} command}
+% \DescribeMacro{\points}
+% The |\points|\marg{pts} command displays the number of points awarded to an exercise.
+% It is intended to be entered in the optional argument of the
+% |\exercise| command\footnote{This command which has to be used
+% in the optional argument of \texttt{\bs exercise}, as several others presented below, is incompatible with
+% the \textsf{memoir} class which redefines section commands.}.
+% |\exercise[\points{5}]| yields:
+% \exercise[\points{5}]
+% \psframe(-0.25,1.3)(12.75,-0.4)
+% Try to read this whole document without drinking tea and you get five points.
+%
+% \bigskip
+% \DescribeMacro{\pointsname} \DescribeMacro{\pointname}
+% Like before, the words \emph{points} and in the singular \emph{point}
+% (if \meta{pts} is inferior to 2)
+% get automatic translation (with \textsf{babel}) in a few languages
+% and are modifiables.
+%
+% \DescribeMacro{\pointsstyle} \DescribeMacro{pointscolor}
+% The style used by the |\points| command may be redefined with |\pointsstyle|.
+% The color is set by |pointscolor| with the |\definecolor| command
+% (from the \textsf{xcolor} package by Uwe Kern, loaded by \textsf{exesheet}),
+% for instance: \\ |\definecolor{pointscolor}{named}{blue}|.
+%
+%
+% \section{Enumerations and lists}
+%
+% \subsection{List settings (nosetlist package option)} \label{par:nosetlist}
+% Enumeration lists are intended to represent questions and sub-questions
+% inside exercises. For a good highlight,
+% labels are typeset in bold.
+% Moreover, they are left aligned, at the start of the line,
+% without indentation, and the vertical space between items
+% is increased compared with \LaTeX\ standard lists.
+% These settings are done by the |\setlist| command\footnote{Labels
+% may also be changed by the \texttt{\bs labelenumi} and \texttt{\bs labelenumii} commands.}
+% from the \textsf{enumitem} package by Javier Bezos.
+% Lists with \texttt{itemize} environment are kept in their default configuration\footnote{The
+% \texttt{french} otion of the \textsf{babel} package
+% alters \texttt{itemize} lists behavior and uses long dash
+% as labels for each list level.
+% This behavior is problematic when mathematics follows the dash
+% symbol because the latter may be confused wih the minus sign.
+% Modifications of the \texttt{french} option (which supersedes \texttt{frenchb}
+% of \textsf{babel}) are canceled to restore \LaTeX\ default settings.}.
+%
+% \vspace{-\baselineskip}
+% \noindent\psframe(-0.25,-0.35)(12.75,-3.9)
+% \exercise
+% \begin{enumerate}
+% \item First question
+% \begin{enumerate}
+% \item First sub-question
+% \item Second sub-question
+% \end{enumerate}
+% \item Second question
+% \end{enumerate}
+%
+% \DescribeMacro{nosetlist}
+% We can avoid enumeration list modifications and restore the \LaTeX\ default settings by passing the option
+% \texttt{nosetlist} to the \texttt{exesheet} class or package.
+%
+% \subsection{List of exercises : the \texttt{exenumerate} environment}
+% \DescribeEnv{exenumerate}
+% When an exercise sheet is made of short independant exercises,
+% it would be ill-advised to display the complete title \emph{\exercisename} for each.
+% In addition to the |\exe| command, previously presented,
+% we provide an even lighter solution with the |exenumerate| environment, which is only an enumeration list in which
+% spaces between items are further increased compared with those of \texttt{enumerate}.
+% Here is an example (the main list is an \texttt{exenumerate} environment but
+% sublists are produced with regular \texttt{enumerate} environments):
+%
+% \vspace{-\baselineskip}
+% \noindent\psframe(-0.25,-0.3)(12.75,-7.05)
+% \begin{exenumerate}
+% \item Translate the following sentences in english:
+% \begin{enumerate}
+% \item Nam dui ligula, fringilla a, euismod sodales, sollicitudin vel, wisi.
+% \item Nam lacus libero, pretium at, lobortis vitae, ultricies et, tellus.
+% \end{enumerate}
+% \item Translate the following sentence in german:
+% \par Donec aliquet, tortor sed accumsan bibendum, erat ligula aliquet magna,
+% vitae ornare odio metus a mi.
+% \item Translate the following sentences in french:
+% \begin{enumerate}
+% \item Cum sociis natoque penatibus
+% et magnis dis parturient montes, nascetur ridiculus mus.
+% \item Nulla ullamcorper vestibulum turpis.
+% \end{enumerate}
+% \end{exenumerate}
+% The environment takes an optional parameter, like \texttt{enumerate}, which enables, among others,
+% to typeset alternative list labels, e.g.
+% |\begin{exenumerate}[A.]|.
+% There are many other options (see the \textsf{enumitem} package documentation).
+%
+% \subsection{Items aligned by lines: \texttt{tablenum}}
+% \DescribeEnv{tablenum}
+% \DescribeEnv{tablenuma}
+% \DescribeEnv{tablitem}
+% These three environments are used to typeset short questions (\texttt{tablenum}),
+% sub-questions (\texttt{tablenuma}) or \texttt{itemize} lists (\texttt{tablitem})
+% on the same line. They have the same syntax:
+% |\begin{tablenum}|\oarg{opt}|(|\meta{cols}|)|.
+% The \meta{cols} parameter is the number of columns used by the environment. It must be
+% \emph{in parentheses}. This parameter can be omitted, then its value is 2.
+% As for classic lists, each item begins with the |\item| command.
+%
+% These three environments are defined by the
+% |\NewTasks| macro, from the \textsf{tasks} package by Clemens Niederberger.
+% They take an optional argument \meta{opt}
+% explained in the documentation of this package,
+% e.g.\ |counter-format=tsk[r])| gives a roman numbering
+% following by a closing parenthesis.
+% There are also many possibilities to place items in an original way,
+% for instance, the |\item*| command allows to
+% specify the number of columns the item is supposed to span.
+% In the following example,
+% the five |\item| are placed in order between
+% |\begin{tablenum}(3)| and |\end{tablenum}|.
+% Notice that numbering is made line by line.
+%
+% \exercise
+% \psframe(-0.25,1.3)(12.75,-2.7)
+% Give the derivative of the following functions:
+% \begin{tablenum}(3)
+% \item $\ds f(x) = \frac{1-x^2}{\mathrm{e}^x +\mathrm{e}^{-x}}$,
+% \item $\ds g(x) = \ln \left( \frac{1-x}{1+x^2}\right)$,
+% \item $\ds h(x) = \int_{0}^{1}\mathrm{e}^{xy}\, \mathrm{d}y$,
+% \item $\ds k(x) = \sum_{i=1}^{\infty}\frac{1}{x^i}$,
+% \item $\ds l(x) = \int_{\frac{1}{x}}^{x}\frac{1}{\ln t}\, \mathrm{d}t$.
+% \end{tablenum}
+%
+% For \texttt{tablenuma}, labels are
+% letters (a, b, c, \ldots) surrounded
+% by parentheses. This cannot be modified globally
+% (except by redefining the environment with |\RenewTasks|).
+% If the \textsf{exesheet} package is called with option \texttt{nosetlist},
+% labels of \texttt{tablenum} and \texttt{tablenuma} environments
+% are displayed in normal font with indentation, as for
+% \texttt{enumerate}.
+%
+% \subsection{Items aligned by columns: \texttt{colsenum}}
+% \DescribeEnv{colsenum}
+% To get numbering of items by columns, we have the
+% \texttt{colsenum} environment: |\begin{colsenum}|\oarg{opt}\marg{cols}.
+% The mandatory parameter is the number of columns
+% and the optional one will be passed to \texttt{enumerate},
+% allowing, for example, to change the type of numbering (a, A, etc.).
+% To use this environment, we have to load the
+% \textsf{multicol} package in the preamble.
+%
+% \exercise
+% \psframe(-0.25,1.3)(12.75,-2.65)
+% Give the derivative of the following functions:
+% \begin{colsenum}{3}
+% \item $\ds f(x) = \frac{1-x^2}{\mathrm{e}^x +\mathrm{e}^{-x}}$,
+% \item $\ds g(x) = \ln \left( \frac{1-x}{1+x^2}\right)$,
+% \item $\ds h(x) = \int_{0}^{1}\mathrm{e}^{xy}\, \mathrm{d}y$,
+% \item $\ds k(x) = \sum_{i=1}^{\infty}\frac{1}{x^i}$,
+% \item $\ds l(x) = \int_{\frac{1}{x}}^{x}\frac{1}{\ln t}\, \mathrm{d}t$.
+% \end{colsenum}
+% \DescribeEnv{colsenum*}
+% We will notice that, on each line, items are not necessarily well
+% aligned, what can produce inelegant effects.
+% On the other hand, the \texttt{colsenum} environment doesn't try to align columns
+% from the bottom by adjusting space between items.
+% If we want to get this
+% (which is the default option in \textsf{multicol}) we have the
+% \texttt{colsenum*} environment (same syntax than \texttt{colsenum}).
+% Here what we get in that case, with the same exercise.
+%
+% \exercise
+% \psframe(-0.25,1.3)(12.75,-2.65)
+% Give the derivative of the following functions:
+% \begin{colsenum*}{3}
+% \item $\ds f(x) = \frac{1-x^2}{\mathrm{e}^x +\mathrm{e}^{-x}}$,
+% \item $\ds g(x) = \ln \left( \frac{1-x}{1+x^2}\right)$,
+% \item $\ds h(x) = \int_{0}^{1}\mathrm{e}^{xy}\, \mathrm{d}y$,
+% \item $\ds k(x) = \sum_{i=1}^{\infty}\frac{1}{x^i}$,
+% \item $\ds l(x) = \int_{\frac{1}{x}}^{x}\frac{1}{\ln t}\, \mathrm{d}t$.
+% \end{colsenum*}
+% We can see that these alignments are less good than those
+% obtained by numbering of items by line. The numbering of items by columns
+% may nevertheless be preferable when there are many items with variable heights,
+% and a number of items which can be different from one column to the other.
+% Moreover, an advantage of \texttt{colsenum} is that the choice of labels
+% is automatic depending on the list level (and the language),
+% unlike \texttt{tablenum} or \texttt{tablenuma}.
+%
+% \DescribeEnv{colsitem}
+% \DescribeEnv{colsitem*}
+% For \texttt{itemize} lists, the environment \texttt{colsitem}
+% produces items aligned by columns rather than by lines as for
+% \texttt{tablitem}:
+% |\begin{colsitem}|\oarg{opt}\marg{cols}. The optional parameter,
+% which is passed to the underlying \texttt{itemize} environment, allows to change the item label (bullet by default).
+% And, as for \texttt{colsenum*}, the \texttt{colsitem*} environment
+% produces an alignment of columns from the bottom.
+%
+% \section{Questions and solutions}
+%
+% \subsection{The \texttt{questions} and \texttt{answers} environments}
+% \DescribeEnv{questions} \DescribeEnv{answers}
+% The package provides the two environments \texttt{questions} and \texttt{answers}
+% to make appear or disappear questions and answers of exercises.
+% Display is controlled by two booleans: \texttt{questions} and \texttt{answers}.
+% Their default value is \texttt{true}.
+%
+% \DescribeMacro{\questionsonly} \DescribeMacro{\answersonly}
+% The |\questionsonly| command allows to display the questions without the answers
+% and |\answersonly| displays the solutions without the questions\footnote{Of course
+% we can also assign the booleans \texttt{questions} and \texttt{answers}
+% directly with the \LaTeX\ command \texttt{\bs setboolean}.}.
+%
+% \bigskip
+% \DescribeMacro{\correctionstyle} \DescribeMacro{correctioncolor}
+% \DescribeMacro{\correctionname}
+% In the case (by default) where questions and answers are displayed both,
+% answers are then typeset in the style
+% |\correctionstyle|, which uses the color \texttt{correctioncolor}.
+% This color may be choosen with the |\definecolor| macro
+% (by default |\definecolor{correctioncolor}{rgb}{0,0.2,0.6}| = kind of dark blue).
+% Moreover, in that case,
+% the title \textbf{\correctionname} is displayed at the beginning
+% of the \texttt{answers} environment.
+% It is defined by the |\correctionname| macro (with translation in a few languages
+% and that we can change:\footnote{Except for English, if you want to change package keywords you have to do it \emph{after} \texttt{\bs begin\{document\}}
+% because \textsf{babel} will modify these definitions at the end of the preamble.}
+% for example we may prefer \emph{Solution}
+% than \emph{\correctionname}).
+% The style defined by |\correctionstyle| will apply to the title
+% but also to the whole environment.
+% Here an example.
+%
+% \vspace{-\baselineskip}
+% \noindent\psframe(-0.25,-0.25)(12.75,-6.6)
+% \exercise[\points{3}] \label{points}
+% \begin{questions}
+% \begin{enumerate}
+% \item Is the \textsf{exesheet} package useful ?
+% \item Ins't there any other packages that deal with exercises ?
+% \end{enumerate}
+% \end{questions}
+% \begin{answers}
+% \begin{enumerate}
+% \item Yes, the \textsf{exesheet} package is very useful.
+% \item There are many other packages that deal with exercices, and
+% give the ability to produce separatly questions and solutions, for example
+% \textsf{exercise} by Paul Pichaureau, \textsf{exercises} by Roger Jud,
+% \textsf{exsheets} (superseded by \textsf{xsim}) by Clemens Niederberger,
+% \textsf{exframe} by Niklas Beisert,
+% \textsf{exam} by Philip Hirschhorn,
+% \textsf{answers} by Mike Piff and Joseph Wright,
+% \textsf{probsoln} by Nicola Talbot, etc.
+% \end{enumerate}
+% \end{answers}
+%
+% \DescribeMacro{\points}
+% When only answers are displayed, the text color remains black,
+% the word \emph{\correctionname} is not displayed and the
+% |\points| macro is patched to suppress the display of points.
+% An extended solution for a variable display of points will be disussed
+% in section \ref{totalpoints} with the |\totalpoints| macro.
+%
+% \subsection{More about \texttt{answers} environment}
+% Internally, we have used the |\comment| and |\endcomment| macros
+% from the \textsf{versions} package by Uwe Lück.
+% Other excellent packages allow to manage
+% selectively piece of code. Let us mention
+% \textsf{verbatim} by Rainer Schöpf, \textsf{comment} by Victor Eijkhout,
+% \textsf{version} by Donald Arseneau and Stephen Bellantoni,
+% \textsf{optional} by Donald Arseneau
+% and \textsf{codesection} by Matthias Pospiech.
+%
+% The \textsf{versions} package used provides furthermore
+% the |\includeversion|\marg{env} and
+% |\excludeversion|\marg{env} macros who allow to make appear or disappear
+% any environment \meta{env} and these optional environments
+% may be nested\footnote{The \textsf{codesection} package also allows
+% such nesting, including in the preamble,
+% as well as the \textsf{optional} package, but the latter only manages short optional code.}.
+%
+% However the \texttt{questions} and \texttt{answers} environments
+% perform another task, not only making appear or disappear piece of text.
+% Indeed, there is a problem with the title \emph{\correctionname}.
+% In which format to typeset it and at which level to put it in the table of contents
+% (or in the summary of the pdf file)?
+% In fact it depends on which level the environment has been nested.
+% We can make a single \texttt{answers} environment for all the
+% exercises of the sheet or an \texttt{answers} environment
+% for each exercise, for each exercise part, for each question or sub-question.
+% In fact, the typeset of the title \emph{\correctionname}
+% and his level in the table of contents will be adjusted automatically.
+%
+% \DescribeEnv{\oarg{level}}
+% Nevertheless, we can imagine twisted situations in which
+% the title level will not be correctly calculated.
+% It is then possible to force the level of the title \emph{\correctionname}
+% with |\begin{answers}|\oarg{level}.
+% The optional \meta{level} parameter is defined as follows:
+% 1 for section level titles,
+% 2 for subsections (like \emph{\exercisename}),
+% 3 for subsubsections (like \emph{\partname}),
+% another number for lower levels
+% (then they will not appear in the table of contents).
+%
+% \bigskip
+% \DescribeMacro{answers*}
+% The starred version \texttt{answers*} allows to make the title
+% \textbf{\correctionname} completely disappear.
+%
+% \subsection{The \texttt{\bs question} command}
+% \DescribeMacro{\question}
+% Instead of the \texttt{questions} and \texttt{answers} environments,
+% we can also use the simple |\question|\marg{ques}\marg{ans} macro
+% in which display of \meta{ques} and \meta{ans} arguments
+% is controlled by the same previous commands |\questionsonly| and |\answersonly|.
+% It can be more readable (in the source code) when questions and answers are short.
+% In the case of displaying both questions and answers,
+% the \emph{\correctionname} title will appear on a new line, in bold,
+% as for levels lower than subsubsection in the \texttt{answers} environment
+% (and without entries in the table of contents).
+% But this command doesn't work with \texttt{verbatim} inside.
+%
+% \section{Marginal notes for marking scheme}
+%
+% The \textsf{exesheet} package allows the display of a marking
+% scheme with comments and explanations for answers.
+%
+% \pagebreak
+% \subsection{The \texttt{\bs pts} command}
+% \DescribeMacro{\pts}
+% When exercises are typeset with the |\exe| macro,
+% or as a list with the \texttt{exenumerate} environment,
+% the marking scheme is displayed in the margin, on the line where
+% we put the |\pts|\marg{num} command (in general the first line of the exercise).
+% The \meta{num} parameter is the number of points assigned to the exercise.
+%
+% \vspace{-\baselineskip}
+% \noindent\psframe(-3.5,-0.25)(12.75,-2)
+% \exe \pts{3} The first exercise with marking sheme.
+% \exe \pts{1.5} The second one.
+%
+% \bigskip
+% \DescribeMacro{\ptsname} \DescribeMacro{\ptname}
+% \DescribeMacro{ptscolor} \DescribeMacro{\ptsstyle}
+% The abbreviation \textsf{\ptsname} (or \textsf{\ptname}
+% when the number of points is inferior to 2)
+% is automatically added thanks to the macro |\ptsname| or |\ptname|
+% (translated in a few languages if \textsf{babel} is loaded).
+% The display color of the points is defined by \texttt{ptscolor} which can be changed
+% with |\definecolor|: by default |\definecolor{ptscolor}{named}{red}|.
+% The display style is defined by |\ptsstyle|.
+%
+% \DescribeMacro{\displaypts}
+% The display of the marking scheme, as above, is internally controlled by the
+% \texttt{marginpts} boolean.
+% The |\displaypts| command, which has to be placed in the preamble, defines \texttt{marginpts} to \texttt{true},
+% places marginal notes to the left (and not to the right which
+% is the default behavior of \LaTeX)
+% and shifts the text body right to increase the left margin compared
+% with the right one, with a ratio 3:2,
+% as it is in the present document.
+% This ratio is defined by the
+% |geometry| macro from the \textsf{geometry} package (by Hideo Umeki) and is valid for the whole document.
+%
+% \subsection{The \texttt{\bs totalexe}, \texttt{\bs note} and \texttt{\bs totalpoints} commands}
+% \label{totalpoints}
+% \DescribeMacro{\totalexe}
+% \DescribeMacro{\note}
+% To give a more detailed marking sheme, the \textsf{exesheet} package
+% provides some extended commands:
+% |\totalexe|\marg{num} to display the total number of points of an exercise
+% and especially |\note|\oarg{pts}\marg{comment},
+% to indicate some marking detail in answers.
+% The optional parameter \meta{pts} is the number of points of the question
+% and the mandatory parameter \meta{comment} is used to give details about the marking scheme.
+% Below the title has been obtained with |\exercise[\totalexe{4}]|
+% and the first comment with \\
+% |\note[1]{0,5 for the anti-derivative\\0,5 for simplification of $\ln$}|.
+%
+% \exercise[\totalexe{4}] \label{totalexe}
+% \begin{questions}
+% \psframe(-3.5,1.3)(12.75,-3.1)
+% For each following question, say if the assertion is true or false.
+% Justify the answer carefully.
+% \begin{tablenum}
+% \item $\ds \int_{0}^{\sqrt{3}}\frac{1}{x+\sqrt{3}} \,\mathrm{d}x = \ln 2$,
+% \item $\ds \int_{2}^{\mathrm{e}} \frac{1}{x\ln x} \,\mathrm{d}x = -\ln 2$,
+% \item* The function $F$ defined on $\mathbf{R}$ by
+% $F(x) = \ds \int_{0}^{x}\frac{1}{,t^2+t+1}\,\mathrm{d} t$, is increasing on $\mathbf{R}$.
+% \end{tablenum}
+% \end{questions}
+%
+% \begin{answers}
+% \vspace{-\baselineskip}
+% \noindent\psframe(-4.7,0.9)(12.75,-10.25)
+% \begin{enumerate}
+% \item \note[1]{0,5 for the anti-derivative\\0,5 for simplification of $\ln$}
+% We calculate:
+% \[ \int_{0}^{\sqrt{3}}\frac{1}{x+\sqrt{3}}\,\mathrm{d}x
+% = \bigg[ \ln\left(x+\sqrt{3}\right) \bigg]_0^{\sqrt{3}}
+% = \ln\left(2\sqrt{3}\right)-\ln \sqrt{3}
+% = \ln\left(\frac{2 \sqrt{3}}{\sqrt{3}}\right)
+% =\ln 2.
+% \]
+% \textbf{TRUE}.
+%
+% \item \note[1.5]{1 for the anti-derivative \\0.5 for the integral value \\[2ex]
+% we could also see that $\frac{1}{x \ln x} >0$ on $[2, \mathrm{e}]$
+% while $-\ln2<0$
+% }
+% We have $\ds\frac{1}{x \ln x}= \frac{\frac{1}{x}}{\ln x}= \frac{u'(x)}{u(x)}$
+% with $u(x)=\ln x$, which is positive on $[2, \mathrm{e}]$. Hence
+%
+% \[ \int_{2}^{\mathrm{e}}\frac{1}{x \ln x}\,\mathrm{d}x
+% = \Big[ \ln(\ln x) \Big]_2^\mathrm{e}
+% = \ln(\ln \mathrm{e})-\ln(\ln2)= \ln1 -\ln(\ln2)=-\ln(\ln2).
+% \]
+% \textbf{FALSE}.
+%
+% \item \note*{1.5}
+% The function $F$ defined on $\mathbf{R}$ by
+% \[ F(x)= \int_{0}^{x}\frac{1}{t^2+t+1}\, \mathrm{d}t \]
+% is derivable on $\mathbf{R}$ and its derivative is such that
+% $F'(x)=\frac{1}{x^2+x+1}$.
+% \note{0.5 for $F'$\\1 for the sign of $F'$ and conclusion}
+% The denominator is a quadratic polynomial, always positive because its discriminant is
+% $\Delta=-3 <0$.
+% Thus $F$ is increasing on $\mathbf{R}$. \\
+% \textbf{TRUE}.
+% \end{enumerate}
+% \end{answers}
+% In the comment of answer 2, a wider vertical space is produced at line break
+% with the optional argument |\\[2ex]|\footnote{When a marginal note at the end of a page,
+% is followed by another one at the top of the next page,
+% the latter is shifted down.
+% We can raise this note, by adding at the line break
+% a negative vertical space : \texttt{\bs note*\{\bs\bs[-5ex] 2\}}.}.
+% The last comment, not placed beside the number of points of answer 3,
+% has been produced by placing on the first line after the formula:
+% |\note{0.5 for $F'$\\1 for the sign of $F'$ and conclusion}|.
+%
+% \DescribeMacro{\note*}
+% If we don't want to add comment, we have the
+% |\note*|\marg{pts} command (better thant |\note|\oarg{pts}|{}|),
+% used here in answer 3: |\note*{1.5}|.
+%
+% \DescribeMacro{markingcolor} \DescribeMacro{\markingstyle} \DescribeMacro{\ptsboxlength}
+% The display color of the points, in |\totalexe| and |\note|,
+% is defined by \texttt{markingcolor}
+% and the style by |\markingstyle|, which are modifiables.
+% The oval box produced by |\totalexe| is obtained with the |\ovalbox| command
+% of the \textsf{fancybox} package by Timothy Van Zandt,
+% with corner arcs set by |\cornersize{1}|.
+% The box length is not adjusted to content but depends of the value
+% of |\ptsboxlength| in order to keep a uniform appearance
+% from one exercise to the other.
+%
+% \DescribeMacro{notecolor} \DescribeMacro{\notestyle} \DescribeMacro{\noteragged}
+% Comment notes are typeset by default in a dark green color
+% defined by |\definecolor{notecolor}{rgb}{0.0,0.4,0.0}|.
+% The style of the comment is set by the |\notestyle| macro and itself uses the
+% |\noteragged| macro. The latter is set by default as |\raggedleft|
+% to obtain a \emph{right} alignment (what is customary for notes
+% in the left margin).
+%
+% \DescribeMacro{\displaypoints}
+% Display of points and comments is optional. It is internally controlled by the booleans
+% \texttt{marginpoints} and \texttt{marginfullnotes}.
+% The |\displaypoints| macro, to place in the preamble, sets \texttt{marginpoints}
+% to \texttt{true}, chooses the left margin for display marginal notes
+% and sets the ratio between left and right margins to 3:2\footnote{So
+% that the effect on the margin ratio is correct, the
+% \texttt{\bs displaypoints} macro must be placed after other commands that could alter the page geometry, for example the \texttt{\bs pagestyle}
+% of the \textsf{schooldocs} package.}.
+% Points will then be displayed without the comments.
+%
+% \DescribeMacro{\displaynotes}
+% The |\displaynotes|\oarg{align} macro, to be placed also in the preamble,
+% defines both booleans to \texttt{true} and allows then the complete display of points and comments.
+% The ratio between left/right margins is then set to 5/1\footnote{The
+% present document kept a ratio of 3/2 because
+% the \textsf{ltxdoc} class, used here, leaves large enough margins
+% and previous examples are not concerned with display of comments.}.
+% The optional parameter \meta{align} is used to define alignment:
+% |\raggedleft| by default, but we could use |\centering| or
+% |\raggedright| (not recommended in left margin).
+%
+% \DescribeMacro{\displaynotesright}
+% The |\displaynotesright|\oarg{align} macro displays a detailed marking scheme
+% with comments in the right margin, with the same type of settings
+% as |\displaynotes| but an optional parameter \meta{align} set by default
+% to |\raggedleft|.
+%
+% \bigskip
+% \DescribeMacro{\totalpoints}
+% The |\totalpoints|\marg{num} macro is intended
+% to replace |\points| when using a detailed marking scheme.
+% When the scale is not displayed (\texttt{marginpoints} boolean to \texttt{false}),
+% it uses |\points| and when the scale is displayed,
+% it uses |\totalexe|.
+% For example, in the exercise \ref{totalexe}, we should use
+% |\totalpoints| rather than |\totalexe|,
+% because, when the detailed marking scheme is not displayed, the total points will be typeset
+% as in the exercise \ref{points} rather than in the margin.
+%
+%
+%
+% \StopEventually{}
+%
+% \section{Implementation}
+%
+% \subsection{Class and package basic instructions}
+% The \texttt{exesheet} class is based on the \texttt{article} class
+% and gives it all its options, except explicit options
+% \texttt{notoc} and \texttt{nosetlist}.
+%
+% \begin{macrocode}
+%<*class>
+\DeclareOption{notoc}{\PassOptionsToPackage{notoc}{exesheet}}
+\DeclareOption{nosetlist}{\PassOptionsToPackage{nosetlist}{exesheet}}
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+\ProcessOptions \relax
+\LoadClass{article}
+\RequirePackage{exesheet}
+\RequirePackage{schooldocs}
+%</class>
+% \end{macrocode}
+%
+% Then we define initialization instructions of the \textsf{exesheet} package.
+%
+% \medskip
+% The \texttt{shortlabel} option in the \textsf{enumitem} package allows to use labels like in
+% the \textsf{enumerate} package e.g. 1., a), A. etc.
+%
+% \begin{macrocode}
+%<*package>
+\RequirePackage{ifthen}
+\newboolean{notoc}
+\newboolean{nosetlist}
+\DeclareOption{notoc}{\setboolean{notoc}{true}}
+\DeclareOption{nosetlist}{\setboolean{nosetlist}{true}}
+\ProcessOptions \relax
+\RequirePackage{xcolor}
+\RequirePackage[shortlabels]{enumitem}
+\RequirePackage{tasks}
+\RequirePackage{versions}
+%\@ifpackageloaded{doc}{}{\RequirePackage{verbatim}}
+\RequirePackage{geometry}
+\RequirePackage{fancybox}
+
+% \end{macrocode}
+%
+% \subsection{Internationalization}
+% Here we define the keywords and their translation in French, German, Spanish
+% Italian, Portuguese, thanks to the |\addto\captions|\meta{language} macro
+% of the \textsf{babel} package.
+%
+% Translations are placed in a macro |\exetranslate| because, if
+% \textsf{exesheet} is called before \textsf{babel} (this is necessarily the case for the
+% \textsf{exesheet} class), then these translations should only happen
+% after having loaded the \textsf{babel} package, therefore the |\AtBeginDocument|.
+% On the other hand, if the package is loaded \emph{after} \textsf{babel},
+% |AtBeginDocument{\exetranslate}| doesn't work, curiously.
+% But calling immediately |\exetranslate| works in that case.
+%
+% Accented characters cannot be used here because they are not recognized
+% if \textsf{inputenc} is loaded after \textsf{exesheet},
+% despite the |\AtBeginDocument|. So we have used the basic \LaTeX\ commands to produce them.
+%
+% \TODO: give the choice to use \textsf{polyglossia} instead of \textsf{babel};
+% see the \textsf{translations} or \textsf{multilang} packages.
+%
+% \begin{macrocode}
+\def\exercisename{Exercise}
+\def\subpartname{Part}
+\def\annexname{Annex}
+\def\exname{Ex}
+\def\pointsname{points}
+\def\pointname{point}
+\def\correctionname{Correction}
+\def\ptsname{pts}
+\def\ptname{pt}
+
+\newcommand\exetranslate{%
+ \@ifpackageloaded{babel}{%
+ \addto\captionsfrench{%
+ \def\exercisename{Exercice}
+ \def\subpartname{Partie}
+ \def\annexname{Annexe}
+ \def\exname{Ex}
+ \def\pointsname{points}
+ \def\pointname{point}
+ \def\correctionname{Correction}
+ \def\ptsname{pts}
+ \def\ptname{pt}
+ }
+ \addto\captionsgerman{%
+ \def\exercisename{\"Ubung}
+ \def\subpartname{Teil}
+ \def\annexname{Anhang}
+ \def\exname{\"Ub}
+ \def\pointsname{Punkte}
+ \def\pointname{Punkt}
+ \def\correctionname{Verbesserung}
+ \def\ptsname{Pkte}
+ \def\ptname{Pkt}
+ }
+ \addto\captionsspanish{%
+ \def\exercisename{Ejercicio}
+ \def\subpartname{Parte}
+ \def\annexname{Anexo}
+ \def\exname{Ej}
+ \def\pointsname{puntos}
+ \def\pointname{punto}
+ \def\correctionname{Correcci\'on}
+ \def\ptsname{ptos}
+ \def\ptname{pot}
+ }
+ \addto\captionsitalian{%
+ \def\exercisename{Esercizio}
+ \def\subpartname{Parte}
+ \def\annexname{Ansesso}
+ \def\exname{Es}
+ \def\pointsname{punti}
+ \def\pointname{punto}
+ \def\correctionname{Correzione}
+ \def\ptsname{pti}
+ \def\ptname{pt}
+ }
+ \addto\captionsportuges{%
+ \def\exercisename{Exerc\'icio}
+ \def\subpartname{Parte}
+ \def\annexname{Anexo}
+ \def\exname{Ex}
+ \def\pointsname{pontos}
+ \def\pointname{ponto}
+ \def\correctionname{Corre\c c\~ao}
+ \def\ptsname{pts}
+ \def\ptname{pt}
+ }
+ }{}
+ }
+
+\AtBeginDocument{\exetranslate} % if loaded before babel
+\exetranslate % necessary when loaded after babel
+
+% \end{macrocode}
+%
+% \subsection{Colors}
+% The color \texttt{pointscolor} is used by the macro |\points|
+% and \texttt{markingcolor} by the macros |\totalexe|, |\note*|
+% and also for the optional argument of |\note|;
+% \texttt{notecolor} is used by the mandatory argument of |\note|.
+%
+% \begin{macrocode}
+\definecolor{pointscolor}{named}{red}
+\definecolor{ptscolor}{named}{red}
+\definecolor{markingcolor}{named}{red}
+\definecolor{notecolor}{rgb}{0.0, 0.4, 0.0} % kind of dark green
+\definecolor{correctioncolor}{rgb}{0,0.2,0.6} % kind of dark blue
+
+% \end{macrocode}
+%
+% \medskip
+% \subsection{Titles}
+% The \texttt{exercise} counter numbers exercises for the whole document
+% regardless of any section.
+% To reset the counter at some point, just write |\setcounter{exercise}{0}|
+% and if we want an automatic reset at each section,
+% add in the preamble \\
+% |\makeatletter \@addtoreset{exercise}{section} \makeatother|.
+%
+% The parts counter depends on \texttt{exercise} and is reset
+% at each new exercise.
+%
+% The |\labelexercisestyle| and |\labelsubpartstyle| commands
+% are empty, but allow to customize the style, for instance:\\
+% |\renewcommand\labelexercisestyle{\sffamily}|.
+%
+% By default, the table of contents displays the titles of exercises and parts.
+% The \texttt{notoc} boolean is used to modify this behavior.
+% If we want to display only exercise titles but not parts,
+% we can place in the preamble |\setcounter{tocdepth}{2}|.
+%
+% \begin{macro}{\exercise}
+% \begin{macrocode}
+\newcounter{exercise}
+
+\newcommand{\labelexercise}{\exercisename~\theexercise}
+\newcommand{\labelexercisestyle}{}
+\newcommand*{\@exercise}[1][]{%
+ \refstepcounter{exercise}
+ \subsection*{\labelexercisestyle\labelexercise\ #1}
+ \ifthenelse{\boolean{notoc}}{}{
+ \addcontentsline{toc}{subsection}{\labelexercise}
+ }
+ }
+\newcommand*{\@@exercise}[2][]{%
+ \subsection*{\labelexercisestyle #2 #1}
+ \setcounter{subpart}{0} % resets the parts counter
+ \ifthenelse{\boolean{notoc}}{}{
+ \addcontentsline{toc}{subsection}{#2}
+ }
+ }
+\newcommand{\exercise}{\@ifstar{\@@exercise}{\@exercise}}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\subpart}
+% \begin{macrocode}
+\newcounter{subpart}[exercise] %
+\renewcommand{\thesubpart}{\Alph{subpart}}
+
+\newcommand{\labelsubpart}{\subpartname~\thesubpart}
+\newcommand{\labelsubpartstyle}{}
+\newcommand*{\@subpart}[1][]{%
+ \refstepcounter{subpart}%
+ \subsubsection*{\labelsubpartstyle\labelsubpart\ #1}
+ \ifthenelse{\boolean{notoc}}{}{
+ \addcontentsline{toc}{subsubsection}{\labelsubpart}
+ }
+ }
+\newcommand*{\@@subpart}[2][]{%
+ \subsubsection*{\labelsubpartstyle #2 #1}
+ \ifthenelse{\boolean{notoc}}{}{
+ \addcontentsline{toc}{subsubsection}{#2}
+ }
+ }
+\newcommand{\subpart}{\@ifstar{\@@subpart}{\@subpart}}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\annex}
+% \begin{macrocode}
+\newcommand{\annexstyle}{\MakeUppercase}
+\newcommand*{\annex}[1][]{%
+ \subsection*{\mbox{}\hfill\annexstyle{\annexname} #1\hfill\mbox{}}
+ \ifthenelse{\boolean{notoc}}{}{
+ \addcontentsline{toc}{subsection}{\annexname}
+ }
+ }
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\exe}
+% \begin{macrocode}
+\newcommand{\exlabel}{\exname.~\theexercise}
+\newcommand{\exsepmark}{---}
+\newcommand{\@exe}{\textbf{\exlabel~\exsepmark}~}
+\newcommand{\@@exe}{\textbf{\exlabel}~}
+\newcommand{\exe}{\bigskip\par\noindent\refstepcounter{exercise}
+ \@ifstar{\@@exe}{\@exe}
+ }
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\points (ini)}
+% \begin{macrocode}
+\newcommand{\pointsstyle}{%
+ \small\mdseries\sffamily\color{pointscolor}\fbox}
+\newcommand*{\points}[1]{\hfill
+ \pointsstyle{#1~%
+ \ifthenelse{\lengthtest{#1 cm < 2cm}}{\pointname}{\pointsname}%
+ }
+ }
+
+% \end{macrocode}
+% Percent symbols are necessary to avoid spaces between the
+% |\fbox| and its inner text.
+% Note that, without |\lengthtest|, the test |#1 < 2| doesn't work with decimal numbers.
+% % \end{macro}
+%
+% \subsection{Enumerations and lists}
+%
+% When using \textsf{babel} with the \texttt{french} option\footnote{The \texttt{french} option
+% of \textsf{babel} superseeds the \texttt{frenchb} option.},
+% \texttt{itemize} lists are modified with the same dash label for each list level. These modifications are cancelled here to restore default \LaTeX\ \texttt{itemize} lists (labels and spaces).
+% As for |\exetranslate|,
+% we have create the |\standardfrenchlists| command who must be called into
+% |AtBeginDocument| or not, depending on whether
+% \textsf{exesheet} is loaded before \textsf{babel} or after.
+%
+% The |\setlist| command comes from the \textsf{enumitem} package
+% (|\setenumerate| is deprecated). By default |itemsep=1ex| for lists of first level,
+% and |leftmargin=1.5em| allows to align labels on the start of lines.
+%
+% \begin{macrocode}
+\newcommand\standardfrenchlists{%
+ \@ifpackagewith{babel}{frenchb}{
+ \frenchbsetup{StandardLists=true}}{}
+ \@ifpackagewith{babel}{french}{
+ \@ifundefined{frenchsetup}{
+ \frenchbsetup{StandardLists=true}}{
+ \frenchsetup{StandardLists=True}}
+ }{}
+ }
+\ifthenelse{\boolean{nosetlist}}{}{
+ \AtBeginDocument{% if loaded before babel package
+ \standardfrenchlists}
+ \standardfrenchlists % necessary when loaded after babel
+ \setlist[enumerate]{font=\bfseries}
+ \setlist[enumerate,1]{topsep=1.5ex plus 1ex minus 1ex,leftmargin=1.5em}
+ }
+
+% \end{macrocode}
+% \begin{macro}{\exenumerate}
+% \begin{macrocode}
+\newenvironment{exenumerate}[1][]{%
+ \setlist[enumerate]{font=\bfseries}
+ \setlist[enumerate,1]{leftmargin=1.5em,
+ itemsep=3ex plus 1ex minus 1ex,topsep=3ex plus 1ex minus 1ex}
+ \setlist[enumerate,3]{noitemsep,nolistsep}
+ \setlist[itemize]{noitemsep,nolistsep}
+ \begin{enumerate}[#1]
+ }{\end{enumerate}}
+
+% \end{macrocode}
+% \end{macro}
+% \DescribeEnv{tablenum} \DescribeEnv{tablenuma}
+% The |\NewTasks| command comes from the \textsf{tasks} package.
+% It allows to define the environments \texttt{tablenum}, \texttt{tablenuma}
+% and \texttt{tablitem}.
+% The horizontal spaces are adjusted to get a good alignment with
+% items of other \texttt{enumerate} (or \texttt{itemize}) environments.
+%
+% \begin{macrocode}
+\ifthenelse{\boolean{nosetlist}}{
+ \NewTasks[counter-format=tsk[1].,
+ column-sep=1em,
+ after-item-skip=0.5ex plus 0.5ex minus 0.5ex]{tablenum}[\item](2)
+ \NewTasks[counter-format=(tsk[a]),
+ column-sep=1em,label-align=right,
+ item-indent=2.15em,label-width=1.6em,label-offset=0.5em,
+ after-item-skip=0.5ex plus 0.5ex minus 0.5ex]{tablenuma}[\item](2)
+ }{% by default
+ \NewTasks[counter-format=tsk[1].,label-format=\bfseries,
+ column-sep=1em,label-align=right,
+ item-indent=1.5em,label-width=1em,label-offset=0.5em,
+ after-item-skip=0.5ex plus 0.5ex minus 0.5ex]{tablenum}[\item](2)
+ \NewTasks[counter-format=(tsk[a]),label-format=\bfseries,
+ column-sep=1em,label-align=right,
+ item-indent=2.15em,label-width=1.6em,label-offset=0.5em,
+ after-item-skip=0.5ex plus 0.5ex minus 0.5ex]{tablenuma}[\item](2)
+ }
+
+% \end{macrocode}
+% \DescribeEnv{tablitem}
+% \begin{macrocode}
+\NewTasks[label=\labelitemi,
+ label-align=right,
+ item-indent=2.3333em,label-offset=0.5em,
+ after-item-skip=0.5ex plus 0.5ex minus 0.5ex]{tablitem}[\item](2)
+
+% \end{macrocode}
+% \DescribeEnv{colsenum} \DescribeEnv{colsenum*}
+% \begin{macrocode}
+\newenvironment{colsenum}[2][]{%
+ \setlength{\multicolsep}{2ex}
+ \raggedcolumns % default is \flushcolumns
+ \begin{multicols}{#2} % #2 = number of columns
+ \begin{enumerate}[#1] % #1 = options of enumerate
+ }{
+ \end{enumerate}
+ \end{multicols}
+}
+
+\newenvironment{colsenum*}[2][]{%
+ \setlength{\multicolsep}{2ex}
+ \begin{multicols}{#2} % #2 = number of columns
+ \begin{enumerate}[#1] % #1 = options of enumerate
+ }{
+ \end{enumerate}
+ \end{multicols}
+}
+
+% \end{macrocode}
+% \DescribeEnv{colsitem} \DescribeEnv{colsitem*}
+% \begin{macrocode}
+\newenvironment{colsitem}[2][]{%
+ \setlength{\multicolsep}{2ex}
+ \raggedcolumns
+ \begin{multicols}{#2}
+ \begin{itemize}[#1]
+ }{
+ \end{itemize}
+ \end{multicols}
+}
+
+\newenvironment{colsitem*}[2][]{%
+ \setlength{\multicolsep}{2ex}
+ \begin{multicols}{#2}
+ \begin{itemize}[#1]
+ }{
+ \end{itemize}
+ \end{multicols}
+}
+
+% \end{macrocode}
+%
+% \subsection{Questions and answers}
+%
+% \DescribeMacro{\questionsonly} \DescribeMacro{\answersonly}
+% The \texttt{questions} and \texttt{answers} booleans
+% control the display of corresponding environments.
+% When created, a boolean has the \texttt{false} value by default,
+% but we define them to \texttt{true}.
+% The |\questionsonly| and |\answersonly| macros are used as user interface
+% to display only one of the two environments.
+% \begin{macrocode}
+\newboolean{questions}
+\newboolean{answers}
+\setboolean{questions}{true}
+\setboolean{answers}{true}
+\newcommand{\questionsonly}{
+ \setboolean{questions}{true}\setboolean{answers}{false}}
+\newcommand{\answersonly}{
+ \setboolean{questions}{false}\setboolean{answers}{true}}
+
+% \end{macrocode}
+%
+% \begin{environment}{questions}
+% It is the |\comment| and |\endcomment| macros, provided by the \textsf{versions} package,
+% that allow the magic of conditional displays (we can also find them in the \textsf{verbatim} or \textsf{version} packages).
+% The noteworthy \textsf{codesection} package, allows to encapsulate
+% optional code between the macros |\BeginCodeSection|\marg{skip} and |\EndCodeSection|\marg{skip},
+% both in the text body and in the preamble,
+% but these macros cannot be used inside an environment
+% as we did here for |\comment| and |\endcomment|.
+% \begin{macrocode}
+\newcounter{exe@ini}
+\newcounter{subpart@ini}
+
+\newenvironment{questions}{
+ \ifthenelse{\boolean{questions}}{
+ \setcounter{exe@ini}{\value{exercise}}
+ \setcounter{subpart@ini}{\value{subpart}}
+ }{\comment}}%
+ {\ifthenelse{\boolean{questions}}{}{\endcomment}}
+
+% \end{macrocode}
+% \end{environment}
+% \begin{environment}{answers}
+% The internal macro |\set@toclevel| calculates the title level
+% of the word \emph{\correctionname} to display at the start of an
+% \texttt{answers} environment (when \texttt{questions} and \texttt{answers} are
+% displayed together). The principle is to compare the state of the counters
+% \texttt{exercise} and \texttt{subpart} with those saved at the time of
+% the call of \texttt{questions}. The |\@enumdepth| counter indicates the
+% \texttt{enumerate} list level in which we are (0 = out of lists).
+% The optional parameter of the \texttt{answers} environment allows to force this title level.
+% \begin{macrocode}
+\newcounter{@toclevel}
+\newcommand{\set@toclevel}[1][]{
+ \ifthenelse{\equal{#1}{}}{
+ \ifthenelse{\value{exercise} > \value{exe@ini}}{
+ \setcounter{@toclevel}{1}
+ }{\ifthenelse{\equal{\the\@enumdepth}{0}}{
+ % we're not in an enumerate environment
+ \ifthenelse{\(\value{subpart} > \value{subpart@ini}\)
+ \or \(\value{subpart} = 0\)}{
+ \setcounter{@toclevel}{2}
+ }{\setcounter{@toclevel}{3}}
+ }{\setcounter{@toclevel}{4}}}
+ }{\setcounter{@toclevel}{#1}}}
+
+\newcommand{\correctionstyle}{\color{correctioncolor}}
+
+\newenvironment{answers}[1][]{% #1 is the optional level
+ \ifthenelse{\boolean{answers}}{%
+ \ifthenelse{\boolean{questions}}{%
+ \set@toclevel[#1]
+ \ifthenelse{\value{@toclevel} = 1}{
+ \section*{\correctionstyle\correctionname}
+ \ifthenelse{\boolean{notoc}}{}{
+ \addcontentsline{toc}{section}{\correctionname}}
+ \setcounter{exercise}{0}
+ }{\ifthenelse{\value{@toclevel} = 2}{%
+ \subsection*{\correctionstyle\correctionname}
+ \ifthenelse{\boolean{notoc}}{}{
+ \addcontentsline{toc}{subsection}{\correctionname}}
+ \setcounter{subpart}{0}
+ }{\ifthenelse{\value{@toclevel} = 3}{%
+ \subsubsection*{\correctionstyle\correctionname}
+ \ifthenelse{\boolean{notoc}}{}{
+ \addcontentsline{toc}{subsubsection}{
+ \correctionname}}
+ }{\par\textbf{\correctionstyle\correctionname}\par
+ }%
+ }%
+ }%
+ \correctionstyle%
+ }{}%
+ }{\comment}
+}{\ifthenelse{\boolean{answers}}{}{\endcomment}}
+
+\newenvironment{answers*}{\ifthenelse{\boolean{answers}}{}{\comment}}%
+ {\ifthenelse{\boolean{answers}}{}{\endcomment}}
+
+% \end{macrocode}
+% In the \texttt{answers} environment, if we place |\correctionstyle|
+% before |\subsubsection|, the preceding vertical space may be too wide.
+%
+% \end{environment}
+% \begin{macro}{\question}
+% \begin{macrocode}
+\newcommand{\question}[2]{%
+ \ifthenelse{\boolean{questions}}{#1}{}
+ \bgroup
+ \ifthenelse{\boolean{answers}}{
+ \ifthenelse{\boolean{questions}}{
+ \ifx#2\empty\else
+ \par\correctionstyle\textbf{\correctionname}\par
+ \fi
+ }{}
+ #2}{}
+ \egroup
+ }
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\points (patched)}
+% \begin{macrocode}
+\let\@oldpoints\points
+\renewcommand*{\points}[1]{%
+ \ifthenelse{\boolean{questions}}{\@oldpoints{#1}}{}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Marginal notes}
+%
+% The commands |\displaypts|, |\displaypoints| and |\displaynotes|
+% change the ratio between left and right margins\footnote{So
+% that the effect on the margin ratio is correct, these
+% macros must be called, in the preamble, after other commands that also could alter the page geometry.}.
+%
+% \DescribeMacro{\pts} \DescribeMacro{\displaypts}
+% \begin{macrocode}
+\newboolean{marginpts}
+\newcommand*{\pointmark}[1]{%
+ \ifthenelse{\lengthtest{#1 cm < 2cm}}{#1 \ptname}{#1 \ptsname}}
+\newcommand{\ptsstyle}[1]{%
+ \footnotesize\centering\sffamily\color{ptscolor} (#1)}
+\newcommand*{\pts}[1]{%
+ \ifthenelse{\boolean{marginpts}}{%
+ \mbox{}%
+ \marginpar{\hspace{0pt}%
+ \ptsstyle{\pointmark{#1}}}%
+ }{}%
+ \ignorespaces
+ }
+\newcommand{\displaypts}{%
+ \reversemarginpar
+ \geometry{hmarginratio=3:2}
+ \setboolean{marginpts}{true}
+ }
+
+% \end{macrocode}
+%
+% \begin{macro}{\totalexe}
+% In the following macros using
+% |\marginpar|, percent symbols and |\ignorespaces| are necessary to avoid too much space in the text (or the margin)
+% where these macros are inserted.
+% \begin{macrocode}
+\newlength{\ptsboxlength}
+\setlength{\ptsboxlength}{3.1em}
+\cornersize{1}
+\newcommand*{\totalexe}[1]{%
+ \ifthenelse{\boolean{marginpoints}}{%
+ \mbox{}%
+ \marginpar{\markingstyle{\ovalbox{%
+ \makebox[\ptsboxlength]{\pointmark{#1}}}%
+ }}%
+ }{}%
+ \ignorespaces
+ }
+
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\note}
+% The booleans \texttt{marginpoints} and \texttt{marginfullnotes} control
+% the display of marginal notes. If \texttt{marginpoints} is \texttt{false},
+% \texttt{marginfullnotes} will be ignored.
+% The |\noteragged| command is initialized outside |\displaynotes|
+% such that we can use the |\note| command without |\displaynotes| (see further).
+% \begin{macrocode}
+\newboolean{marginpoints}
+\newboolean{marginfullnotes}
+
+\newcommand{\markingstyle}[1]{\hspace{0pt}\footnotesize\sffamily%
+ \centering\color{markingcolor}\textbf{#1}}
+\newcommand{\noteragged}{\raggedleft}
+\newcommand{\notestyle}[1]{\hspace{0pt}\footnotesize\sffamily%
+ \noteragged\noindent\color{notecolor} #1}
+\newcommand{\@note}[2][]{%
+ \ifthenelse{\boolean{marginpoints}}{%
+ \mbox{}%
+ \marginpar{%
+ \ifthenelse{\equal{#1}{}}{}{\markingstyle{#1}\\}%
+ \ifthenelse{\boolean{marginfullnotes}}{\notestyle #2}{}%
+ }%
+ }{}%
+ \ignorespaces
+ }
+\newcommand{\@@note}[1]{%
+ \ifthenelse{\boolean{marginpoints}}{%
+ \mbox{}%
+ \marginpar{\markingstyle{#1}}%
+ }{}%
+ \ignorespaces
+ }
+\newcommand{\note}{\@ifstar{\@@note}{\@note}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \DescribeMacro{\displaypoints} \DescribeMacro{\displaynotes}
+%\DescribeMacro{\displaynotesright}
+% In |\displaynotes|, the additional length \texttt{1\,in} matches
+% the default free space to the left of |\oddsidemargin|.
+%
+% \begin{macrocode}
+\newcommand{\displaypoints}{%
+ \reversemarginpar
+ \geometry{hmarginratio=3:2}
+ \setboolean{marginpoints}{true}
+ }
+
+\newcommand*{\displaynotes}[1][\raggedleft]{%
+ \reversemarginpar
+ \renewcommand{\noteragged}{#1}
+ \geometry{hmarginratio=5:1}
+ \setlength{\marginparwidth}{\oddsidemargin}
+ \addtolength{\marginparwidth}{1in}
+ \addtolength{\marginparwidth}{-\marginparsep}
+ \setlength{\marginparwidth}{0.8\marginparwidth}
+ \setboolean{marginpoints}{true}
+ \setboolean{marginfullnotes}{true}
+ }
+
+\newcommand*{\displaynotesright}[1][\raggedright]{%
+ \normalmarginpar
+ \renewcommand{\noteragged}{#1}
+ \geometry{hmarginratio=1:5}
+ \setlength{\marginparwidth}{\paperwidth}
+ \addtolength{\marginparwidth}{-\textwidth}
+ \addtolength{\marginparwidth}{-\oddsidemargin}
+ \addtolength{\marginparwidth}{-\marginparsep}
+ \addtolength{\marginparwidth}{-1in}
+ \setlength{\marginparwidth}{0.8\marginparwidth}
+ \setboolean{marginpoints}{true}
+ \setboolean{marginfullnotes}{true}
+ }
+% \end{macrocode}
+% The formatting of marginal notes can possibly be made more regular
+% with the \textsf{ragged2e} package, not loaded by \textsf{exesheet}.
+% We will then have to enter, as an optional parameter of |\displaypoints|:
+% |\RaggedLeft|, |\Centering|, |\RaggedRight| or |justifying|.
+%
+% \begin{macro}{\totalpoints}
+% \begin{macrocode}
+\newcommand{\totalpoints}{%
+ \ifthenelse{\boolean{marginpoints}}{\totalexe}{\points}}
+%</package>
+% \end{macrocode}
+% \end{macro}
+%
+% \Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/exesheet/exesheet.ins b/Master/texmf-dist/source/latex/exesheet/exesheet.ins
new file mode 100644
index 00000000000..37b10a48482
--- /dev/null
+++ b/Master/texmf-dist/source/latex/exesheet/exesheet.ins
@@ -0,0 +1,56 @@
+%%
+%% Copyright (C) 2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+%%
+%% This file 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:
+%%
+%% http://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.
+%%
+
+\input docstrip.tex
+\keepsilent
+
+\usedir{tex/latex/exesheet}
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+
+This file 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:
+
+ http://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.
+
+\endpreamble
+
+\generate{\file{exesheet.cls}{\from{exesheet.dtx}{class}}
+ \file{exesheet.sty}{\from{exesheet.dtx}{package}}}
+
+\obeyspaces
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* files into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* exesheet.cls exesheet.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file exesheet.dtx *}
+\Msg{* through LaTeX + dvips + ps2pdf *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/expkv-cs/expkv-cs.dtx b/Master/texmf-dist/source/latex/expkv-cs/expkv-cs.dtx
new file mode 100644
index 00000000000..7dd4c6aad6f
--- /dev/null
+++ b/Master/texmf-dist/source/latex/expkv-cs/expkv-cs.dtx
@@ -0,0 +1,1792 @@
+% \iffalse meta-comment
+%
+% File: expkv-cs.dtx Copyright (C) 2020 Jonathan P. Spratte
+%
+% This work may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this license or
+% (at your option) any later version. The latest version of this license is in
+% the file:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% ------------------------------------------------------------------------------
+%
+%<*driver>^^A>>=
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+ \expandafter\begingroup
+\fi
+\input l3docstrip.tex
+\askforoverwritefalse
+\preamble
+
+--------------------------------------------------------------
+expkv-cs -- define expandable key=val macros using expkv
+E-mail: jspratte@yahoo.de
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+--------------------------------------------------------------
+
+Copyright (C) 2020 Jonathan P. Spratte
+
+This work may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this license or
+(at your option) any later version. The latest version of this license is in
+the file:
+
+ http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+ Jonathan P. Spratte.
+
+This work consists of the file expkv-cs.dtx
+and the derived files expkv-cs.pdf
+ expkv-cs.sty
+ expkv-cs.tex
+
+\endpreamble
+% stop docstrip adding \endinput
+\postamble
+\endpostamble
+\generate{\file{expkv-cs.sty}{\from{expkv-cs.dtx}{pkg}}}
+\generate{\file{expkv-cs.tex}{\from{expkv-cs.dtx}{tex}}}
+\ifx\fmtname\nameofplainTeX
+ \expandafter\endbatchfile
+\else
+ \expandafter\endgroup
+\fi
+%
+\IfFileExists{expkv-cs.tex}{\input{expkv-cs.tex}}{}
+\ProvidesFile{expkv-cs.dtx}
+ [\csname ekvcDate\endcsname\ define expandable key=val macros using expkv]
+\PassOptionsToPackage{full}{textcomp}
+\documentclass{l3doc}
+\RequirePackage[oldstylenums,nott]{kpfonts}
+\input{glyphtounicode}
+\pdfgentounicode=1
+\RequirePackage{listings}
+\RequirePackage{booktabs}
+\RequirePackage{array}
+\RequirePackage{collcell}
+\RequirePackage{siunitx}
+\RequirePackage{xcolor}
+\RequirePackage{caption}
+\RequirePackage{microtype}
+\RequirePackage{accsupp}
+\lstset
+ {
+ ,flexiblecolumns=false
+ ,basewidth=.53em
+ ,gobble=2
+ ,basicstyle=\fontfamily{jkp}\itshape
+ ,morekeywords=^^A
+ {^^A
+ \ekvcSplit,\ekvcSplitAndForward,\ekvcSplitAndUse
+ \ekvcHash,\ekvcHashAndForward,\ekvcHashAndUse
+ \ekvcValue,\ekvcValueFast,
+ \ekvcSecondaryKeys
+ }
+ ,morecomment=[l]\%
+ ,commentstyle=\color[gray]{0.4}
+ ,literate={\{}{{\CodeSymbol\{}}{1}
+ {\}}{{\CodeSymbol\}}}{1}
+ ^^A,literate=*{<key>}{\key}{4}{<set>}{\set}{4}
+ }
+\newcommand*\CodeSymbol[1]{\kern-1pt\textbf{#1}\kern1pt}
+\RequirePackage{randtext}
+\let\metaORIG\meta
+\protected\def\meta #1{\texttt{\metaORIG{#1}}}
+\renewcommand*\thefootnote{\fnsymbol{footnote}}
+\definecolor{expkvred}{HTML}{9F393D}
+\colorlet{expkvgrey}{black!75}
+\makeatletter
+\newcommand*\expkv
+ {^^A
+ \texorpdfstring
+ {^^A
+ \mbox
+ {^^A
+ \BeginAccSupp{ActualText=expkv}^^A
+ \href{https://github.com/Skillmon/tex_expkv}
+ {^^A
+ \rmfamily
+ \bfseries
+ {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
+ \lower.493ex
+ \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
+ \kern-.18em{\color{expkvred}v}^^A
+ }^^A
+ \EndAccSupp{}^^A
+ }^^A
+ }
+ {expkv}^^A
+ }
+\newcommand*\expkvpkg[1]
+ {^^A
+ \texorpdfstring
+ {^^A
+ \mbox
+ {^^A
+ \BeginAccSupp{ActualText=expkv-#1}^^A
+ \href{https://github.com/Skillmon/tex_expkv-#1}
+ {^^A
+ \rmfamily
+ \bfseries
+ {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
+ \lower.493ex
+ \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
+ \kern-.18em{\color{expkvred}v}^^A
+ {\color{expkvgrey}^^A
+ \kern.05em\rule[-.1ex]{.08em}{1.2ex}\kern.05em\textsc{#1}^^A
+ }^^A
+ }^^A
+ \EndAccSupp{}^^A
+ }^^A
+ }
+ {expkv-#1}^^A
+ }
+\newcommand*\expkvd{\expkvpkg{def}}
+\newcommand*\expkvc{\expkvpkg{cs}}
+\newcommand\kv{\meta{key}=\meta{value}}
+\newcommand\key{\meta{key}}
+\newcommand\val{\meta{value}}
+\newcommand\set{\meta{set}}
+\newcommand\enflong{\textcolor{black}{long}}
+\newcommand\alllong{\textcolor{gray}{long}}
+\newcommand\notlong{\textcolor{red!80!black}{long}}
+\newcommand\prefixes[1]
+ {^^A
+ \hfill
+ \ifcase\numexpr#1\relax\or
+ \enflong\or
+ \alllong\or
+ \notlong\fi
+ }
+\hypersetup{linkcolor=red!80!black,urlcolor=purple!80!black}
+\DoNotIndex{\def,\edef,\,,\=,\begingroup,\catcode,\chardef,\csname,\endcsname}
+\DoNotIndex{\endgroup,\endinput,\errmessage,\expandafter,\input,\let,\long}
+\DoNotIndex{\protected,\ProvidesFile,\ProvidesPackage,\relax,\space,\advance}
+\DoNotIndex{\@,\unexpanded,\string,\expanded,\dimexpr,\global,\glueexpr,\hbox}
+\DoNotIndex{\numexpr,\RequirePackage,\setbox,\the,\unless,\xdef,\gdef,\newcount}
+\DoNotIndex{\romannumeral,\^,\@firstofone,\@firstoftwo,\@gobble}
+\DoNotIndex{\ifcsname}
+\DoNotIndex{\ifx}
+\DoNotIndex{\ifnum}
+\DoNotIndex{\ifdefined}
+\DoNotIndex{\iffalse}
+\DoNotIndex{\iftrue}
+\DoNotIndex{\else}
+\DoNotIndex{\fi}
+\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
+\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
+\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
+\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
+\@gobble\fi ^^A ignoring \ifx, \ifcsname, etc., but only one \fi
+\@ifdefinable\gobbledocstriptag{\def\gobbledocstriptag#1>{}}
+\makeatother
+\begin{document}
+ \title
+ {^^A
+ \texorpdfstring
+ {^^A
+ \huge\expkvc
+ \\[\medskipamount]
+ \Large define expandable \kv\ macros using \expkv
+ }{expkv-cs - define expandable key=val macros using expkv}^^A
+ }
+ \date{\ekvcDate\space v\ekvcVersion}
+ \author{Jonathan P. Spratte\thanks{\protect\randomize{jspratte@yahoo.de}}}
+ \DocInput{expkv-cs.dtx}
+\end{document}
+%</driver>^^A=<<
+% \fi
+%
+% \maketitle
+% \renewcommand*\thefootnote{\arabic{footnote}}
+%
+% \begin{abstract}
+% \noindent\parfillskip=0pt
+% \expkvc\ provides two small interfaces to define expandable \kv\ macros using
+% \expkv. It therefore lowers the entrance boundary to expandable \kv\ macros.
+% The stylised name is \expkvc\ but the files use \file{expkv-cs}, this is due
+% to CTAN-rules which don't allow \string| in package names since that is the
+% pipe symbol in *nix shells.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \begin{documentation}^^A>>=
+%
+% \section{Documentation}
+%
+% The \expkv\ package enables the new possibility of creating \kv\ macros which
+% are fully expandable. The creation of such macros is however cumbersome for
+% the average user. \expkvc\ tries to step in here. It provides interfaces to
+% define \kv\ macros without worrying too much about the implementation. In case
+% you're wondering now, the |cs| in \expkvc\ stands for control sequence,
+% because |def| was already taken by \expkvd\ and ``control sequence'' is the
+% term D.\,E.\,Knuth used in his \TeX book for named commands hence macros
+% (though he also used the term ``macro''). So \expkvc\ defines control
+% sequences for and with \expkv.
+%
+% There are two different approaches supported by this package. The first is
+% splitting the keys up into individual arguments, the second is providing all
+% the keys as a single argument to the underlying macro and getting an
+% individual \val\ by using a hash. Well, actually there is no real hash, just
+% some markers which are parsed, but this shouldn't be apparent to the user, the
+% behaviour matches that of a hash-table.
+%
+% In addition to these two methods of defining a macro with primary keys a way
+% to define secondary keys, which can reference the primary ones, is provided.
+% These secondary keys don't correspond to an argument or an entry in the hash
+% table directly but might come in handy for the average use case. Each macro
+% has its own set of primary and secondary keys.
+%
+% A word of advice you should consider: If your macro doesn't have to be
+% expandable (and often it doesn't) don't use \expkvc. The interface has some
+% overhead (though it still can be considered fast -- check \autoref{sec:speed})
+% and the approach has its limits in versatility. If you don't need to be
+% expandable, you should consider either defining your keys manually using
+% \expkv\ or using \expkvd\ for convenience. Or you resort to another \kv\
+% interface.
+%
+% \expkvc\ is usable as generic code and as a \LaTeX\ package. It'll
+% automatically load \expkv\ in the same mode as well. To use it, just use one
+% of
+% \begin{lstlisting}
+% \usepackage{expkv-cs} % LaTeX
+% \input expkv-cs % plainTeX
+% \end{lstlisting}
+%
+%
+% \subsection{Define Macros and Primary Keys}
+%
+% All macros defined with \expkvc\ have to be previously undefined or have the
+% |\meaning| of |\relax|. This is necessary as there is no way to undefine keys
+% once they are set up (neither \expkv\ nor \expkvc\ keep track of defined
+% keys) -- so to make sure there are no conflicts only new definitions are
+% allowed (that's not the case for individual keys, only for frontend macros).
+%
+%
+% \subsubsection{Primary Keys}\label{sec:primaries}
+%
+% In the following descriptions there will be one argument named \meta{primary
+% keys}. This argument should be a \kv\ list where each \key\ will be one
+% primary key and \val\ the associated initial value. By default all keys are
+% defined short, but you can define long keys by prefixing \key\ with |long|
+% (\emph{e.g.}, \texttt{long name=Jonathan P. Spratte}). You only need |long| if
+% the key should be able to take a |\par| token. Note however that |long| keys
+% are a microscopic grain faster (due to some internals of \expkvc). Only if at
+% least one of the keys was |long| the \meta{cs} in the following defining
+% macros will be |\long|. For obvious reasons there is no possibility to define
+% a macro or key as |\protected|.
+%
+% At the moment \expkvc\ doesn't require any internal keys, but I can't foresee
+% whether this will be the case in the future as well, as it might turn out that
+% some features I deem useful can't be implemented without such internal keys.
+% Because of this, please don't use key names starting with
+% \texttt{EKVC\string|} as that should be the private name space.
+%
+%
+% \subsubsection{Split}
+%
+% The split variants will provide the key values as separate arguments. This
+% limits the number of keys for which this is truly useful.
+%
+% \begin{function}{\ekvcSplit}
+% \begin{syntax}
+% \cs{ekvcSplit}\meta{cs}\marg{primary keys}\marg{definition}
+% \end{syntax}
+% This defines \meta{cs} to be a macro taking one mandatory argument which
+% should contain a \kv\ list. The \meta{primary keys} will be defined for this
+% macro (see \autoref{sec:primaries}). The \meta{definition} is the code that
+% will be executed. You can access the \val\ of a \key\ by using a macro
+% parameter from |#1| to |#9|. The order of the macro parameters will be the
+% order provided in the \meta{primary keys} list (so |#1| is the \val\ of the
+% key defined first). With |\ekvcSplit| you can define macros using at most
+% nine primary keys.
+% \end{function}
+%
+% \begin{function}{\ekvcSplitAndForward}
+% \begin{syntax}
+% \cs{ekvcSplitAndForward}\meta{cs}\marg{after}\marg{primary keys}
+% \end{syntax}
+% This defines \meta{cs} to be a macro taking one mandatory argument which
+% should contain a \kv\ list. You can use as many primary keys as you want
+% with this. The primary keys will be forwarded to \meta{after} as braced
+% arguments (as many as necessary for your primary keys). The order of the
+% braced arguments will be the order of your primary key definitions. In
+% \meta{after} you can use just a single control sequence, or some arbitrary
+% stuff which will be left in the input stream before your braced values (with
+% one set of braces stripped from \meta{after}), so both of the following
+% would be fine:
+% \begin{lstlisting}
+% \ekvcSplitAndForward\foo\foo@aux{keyA = A, keyB = B}
+% \ekvcSplitAndForward\foo{\foo@aux{more args}}{keyA = A, keyB = B}
+% \end{lstlisting}
+% \end{function}
+%
+% \begin{function}{\ekvcSplitAndUse}
+% \begin{syntax}
+% \cs{ekvcSplitAndUse}\meta{cs}\marg{primary keys}
+% \end{syntax}
+% This will roughly do the same as |\ekvcSplitAndForward|, but instead of
+% specifying what will be used after splitting the keys, \meta{cs} will use
+% what follows the \kv\ list. So its syntax will be
+% \end{function}
+% \begin{syntax}
+% \meta{cs}\{\key=\val, \ldots\}\marg{after}
+% \end{syntax}
+%
+% \subsubsection{Hash}
+%
+% The hash variants will provide the key values as a single argument in which
+% you can access specific values using a special macro. The implementation might
+% be more convenient and scale better, \emph{but} it is much slower (for a
+% primitive macro with a single key benchmarking was almost $1.7$ times slower,
+% the root of which being the key access with |\ekvcValue|, not the parsing, and
+% for a key access using |\ekvcValueFast| it was still about $1.2$ times
+% slower). So if your macro uses less than ten primary keys, you should most
+% likely use the split approach.
+%
+% \begin{function}{\ekvcHash}
+% \begin{syntax}
+% \cs{ekvcHash}\meta{cs}\marg{primary keys}\marg{definition}
+% \end{syntax}
+% This defines \meta{cs} to be a macro taking one mandatory argument which
+% should contain a \kv\ list. You can use as many primary keys as you want.
+% The primary keys will be forwarded as a single argument containing every key
+% to the underlying macro. The underlying macro is defined as
+% \meta{definition}, in which you can access the \val\ of a \key\ by using
+% \texttt{\cs[no-index]{ekvcValue}\{\key\}\{\#1\}}.
+% \end{function}
+%
+% \begin{function}{\ekvcHashAndForward}
+% \begin{syntax}
+% \cs{ekvcHashAndForward}\meta{cs}\marg{after}\marg{primary keys}
+% \end{syntax}
+% This defines \meta{cs} to be a macro taking one mandatory argument which
+% should contain a \kv\ list. You can use as many primary keys as you want.
+% The primary keys will be forwarded as a single argument containing every key
+% to \meta{after}. You can use a single macro for \meta{after} or use some
+% arbitrary stuff, which will be left in the input stream before the hashed
+% \kv\ list with one set of braces stripped. In the
+% macro called in \meta{after} you can access the \val\ of a \key\ by using
+% \texttt{\cs[no-index]{ekvcValue}\{\key\}\{\#1\}} (or whichever argument the
+% hashed \kv\ list will be).
+% \end{function}
+%
+% \begin{function}{\ekvcHashAndUse}
+% \begin{syntax}
+% \cs{ekvcHashAndUse}\meta{cs}\marg{primary keys}
+% \end{syntax}
+% This will roughly do the same as |\ekvcHashAndForward|, but instead of
+% specifying what will be used after hashing the keys, \meta{cs} will use what
+% follows the \kv\ list. So its syntax will be
+% \end{function}
+% \begin{syntax}
+% \meta{cs}\{\key=\val, \ldots\}\marg{after}
+% \end{syntax}
+%
+% \begin{function}{\ekvcValue}
+% \begin{syntax}
+% \cs{ekvcValue}\{\key\}\marg{key list}
+% \end{syntax}
+% This is a safe (but slow) way to access your keys in a hash variant. \key\
+% is the key which's \val\ you want to use out of the \meta{key list}.
+% \meta{key list} should be the key list argument forwarded to your underlying
+% macro by |\ekvcHash|, |\ekvcHashAndForward|, or |\ekvcHashAndUse|. It will
+% be tested whether the hash function to access that \key\ exists, the \key\
+% argument is not empty, and that the \meta{key list} really contains a \val\
+% of that \key. This macro needs exactly two steps of expansion.
+% \end{function}
+%
+% \begin{function}{\ekvcValueFast}
+% \begin{syntax}
+% \cs{ekvcValueFast}\{\key\}\marg{key list}
+% \end{syntax}
+% This behaves just like |\ekvcValue|, but \emph{without any} safety tests. As
+% a result this is about $1.4$ times faster \emph{but} will throw low level
+% \TeX\ errors eventually if the hash function isn't defined or the \key\
+% isn't part of the \meta{key list} (\emph{e.g.}, because it was defined as a
+% key for another macro -- all macros share the same hash function per \key).
+% Use it if you know what you're doing. This macro needs exactly three steps
+% of expansion in the no-errors case.
+% \end{function}
+%
+% \begin{function}{\ekvcValueSplit}
+% \begin{syntax}
+% \cs{ekvcValueSplit}\{\key\}\marg{key list}\marg{next}
+% \end{syntax}
+% If you need a specific \key\ from a \meta{key list} more than once, it'll
+% be a good idea to only extract it once and from then on keep it as a
+% separate argument. Hence the macro \cs{ekvcValueSplit} will extract one
+% specific \key's value from the list and forward the remainder of the list
+% as the first and the \key's value as the second argument to \meta{next}, so
+% the result of this will be \meta{next}\marg{key list'}\marg{value} with
+% \meta{key list'} the remaining list. This is almost as fast as |\ekvcValue|
+% and runs the same tests. Keep in mind that you can't fetch for the same
+% \key\ again from \meta{key list'} as it got removed.
+% \end{function}
+%
+% \begin{function}{\ekvcValueSplitFast}
+% \begin{syntax}
+% \cs{ekvcValueSplitFast}\{\key\}\marg{key list}\marg{next}
+% \end{syntax}
+% This behaves just like |\ekvcValueSplit|, but it won't run the same tests,
+% hence it is faster but more error prone, just like the relation between
+% |\ekvcValue| and |\ekvcValueFast|.
+% \end{function}
+%
+%
+% \subsection{Secondary Keys}
+%
+% To remove some of the limitations with the approach that each primary key
+% matches an argument or hash entry, you can define secondary keys. Those have
+% to be defined for each macro but it doesn't matter whether that macro was a
+% split or a hash variant. If a secondary key references another key it doesn't
+% matter whether that other key is primary or secondary.
+%
+% Secondary keys can have a prefix (like |long|) which are called |p|-type
+% prefix and must have a type (like |meta|) which are called |t|-type prefix.
+% Some types might require some |p|-prefixes, while others might forbid those.
+%
+% Please keep in mind that key names shouldn't start with \texttt{EKVC\string|}.
+%
+% \begin{function}{\ekvcSecondaryKeys}
+% \begin{syntax}
+% \cs{ekvcSecondaryKeys}\meta{cs}\{\kv, \ldots\}
+% \end{syntax}
+% This is the front facing macro to define secondary keys. For the macro
+% \meta{cs} define \key\ to have definition \val. The general syntax for \key\
+% should be
+% \begin{quote}\ttfamily\small
+% \meta{prefix} \meta{name}
+% \end{quote}
+% Where \meta{prefix} is a space separated list of optional |p|-type prefixes
+% followed by one |t|-type prefix. The syntax of \val\ is dependent on the
+% used |t|-prefix.
+% \end{function}
+%
+%
+% \subsubsection{\texttt{p}-type Prefixes}
+%
+% There is only one |p|-prefix available, which is |long|.
+%
+% \begin{function}{long}
+% The following key will be defined |\long|.
+% \end{function}
+%
+%
+% \subsubsection{\texttt{t}-type Prefixes}
+%
+% If you're familiar with \expkvd\ you'll notice that the |t|-type prefixes
+% provided here are much fewer. The expansion only concept doesn't allow for
+% great variety in the auto-defined keys.
+%
+% The syntax examples of the |t|-prefixes will show which |p|-prefix will be
+% automatically used by printing those black (\texttt{\enflong}), which
+% will be available in grey (\texttt{\alllong}), and which will be disallowed in
+% red (\texttt{\notlong}). This will be put flush right next to the syntax line.
+%
+% \begin{function}{meta}
+% \begin{syntax}
+% meta \key\ = \{\kv, \ldots\} \prefixes2
+% \end{syntax}
+% With a |meta| key you can set other keys. Whenever \key\ is used the keys in
+% the \kv\ list will be set to the values given there. You can use the \val\
+% given to \key\ by using |#1| in the \kv\ list. The keys in the \kv\ list can
+% be primary and secondary ones.
+% \end{function}
+%
+% \begin{function}{nmeta}
+% \begin{syntax}
+% nmeta \key\ = \{\kv, \ldots\} \prefixes3
+% \end{syntax}
+% An |nmeta| key is like a |meta| key, but it doesn't take a value, so the
+% \kv\ list is static.
+% \end{function}
+%
+% \begin{function}{alias}
+% \begin{syntax}
+% alias \key\ = \meta{key_2} \prefixes3
+% \end{syntax}
+% This assigns the definition of \meta{key_2} to \key. As a result \key\ is an
+% alias for \meta{key_2} behaving just the same. Both the value taking and the
+% |NoVal| version (that's \expkv\ slang for a key not accepting a value) will
+% be copied if they are defined when |alias| is used. Of course, \meta{key_2}
+% has to be defined, be it as a primary or secondary one.
+% \end{function}
+%
+% \begin{function}{default}
+% \begin{syntax}
+% default \key\ = \marg{default} \prefixes3
+% \end{syntax}
+% If \key\ is a defined value taking key, you can define a |NoVal| version
+% with this that will behave as if \key\ was given \meta{default} as its
+% \val. Note that this doesn't change the initial values of primary keys set
+% at definition time in |\ekvcSplit| and friends. \key\ can be a primary or
+% secondary key.
+% \end{function}
+%
+%
+% \subsection{Example}
+%
+% How could a documentation be a good documentation without some basic examples?
+% Say we want to define a small macro expanding to some character description
+% (who knows why this has to be expandable?). A character description will not
+% have too many items to it, so we use |\ekvcSplit|.
+% \begin{lstlisting}
+% \ekvcSplit\character
+% {
+% name=John Doe,
+% age=any,
+% nationality=the Universe,
+% hobby=to exist,
+% type=Mister,
+% pronoun=He,
+% possessive=his,
+% }
+% {%
+% #1 is a #5 from #3. #6 is of #2 age and #7 hobby is #4.\par
+% }
+% \end{lstlisting}
+% Also we want to give some short cuts so that it's easier to describe several
+% persons.
+% \begin{lstlisting}
+% \ekvcSecondaryKeys\character
+% {
+% alias pro = pronoun,
+% alias pos = possessive,
+% nmeta me =
+% {
+% name=Jonathan P. Spratte,
+% age=a young,
+% nationality=Germany,
+% hobby=\TeX\ coding,
+% },
+% meta lady =
+% {type=Lady, pronoun=She, possessive=her, name=Jane Doe, #1},
+% nmeta paulo =
+% {
+% name=Paulo,
+% type=duck,
+% age=a young,
+% nationality=Brazil,
+% hobby=to quack,
+% }
+% }
+% \end{lstlisting}
+% Now we can describe people using
+% \begin{lstlisting}
+% \character{}
+% \character{me}
+% \character{paulo}
+% \character
+% {lady={name=Evelyn,nationality=Ireland,age=the best,hobby=reading}}
+% \character
+% {
+% name=Our sun, type=star, nationality=our solar system, pro=It,
+% age=an old, pos=its, hobby=shining
+% }
+% \end{lstlisting}
+% As one might see, the |lady| key could actually have been an |nmeta| key as
+% well, as all that is done with the argument is using it as a \kv\ list.
+%
+% Using \pkg{xparse} and forwarding arguments one can easily define \kv\ macros
+% with actual optional and mandatory arguments as well. A small nonsense example
+% (which should perhaps use |\ekvcSplitAndForward| instead of
+% |\ekvcHashAndForward| since it only uses four keys and one other argument --
+% and isn't expandable since it uses a \env{tabular} environment):
+% \begin{lstlisting}
+% \usepackage{xparse}
+% \makeatletter
+% \NewExpandableDocumentCommand\nonsense{O{} m}{\nonsense@a{#1}{#2}}
+% \ekvcHashAndForward\nonsense@a\nonsense@b
+% {
+% keyA = A,
+% keyB = B,
+% keyC = c,
+% keyD = d,
+% }
+% \newcommand*\nonsense@b[2]
+% {%
+% \begin{tabular}{lll}
+% key & A & \ekvcValue{keyA}{#1} \\
+% & B & \ekvcValue{keyB}{#1} \\
+% & C & \ekvcValue{keyC}{#1} \\
+% & D & \ekvcValue{keyD}{#1} \\
+% \multicolumn{2}{l}{mandatory} & #2 \\
+% \end{tabular}\par
+% }
+% \makeatother
+% \end{lstlisting}
+% And then we would be able to do some nonsense:
+% \begin{lstlisting}
+% \nonsense{}
+% \nonsense[keyA=hihi]{haha}
+% \nonsense[keyA=hihi, keyB=A]{hehe}
+% \nonsense[keyC=huhu, keyA=hihi, keyB=A]{haha}
+% \end{lstlisting}
+%
+%
+% \subsection{Speed Considerations}\label{sec:speed}
+%
+% As already mentioned in the introduction there are some speed considerations
+% implied if you choose to define macros via \expkvc. However the overhead isn't
+% the factor which should hinder you to use \expkvc\ if you found a reasonable
+% use case. The key-parsing is still faster than with most other \kv\ packages
+% (see the ``Comparisons'' subsection in the \expkv\ documentation).
+%
+% The speed considerations in this subsection use the first example in this
+% documentation as the benchmark. So we have seven keys and a short sentence
+% which should be typeset. For comparisons I use the following equivalent
+% \expkvd\ definitions. Each result is the average between changing no keys from
+% their initial values and altering four. Furthermore I'll compare three
+% variants of \expkvc\ with the \expkvd\ definitions, namely the split example
+% from above, a hash variant using |\ekvcValue| and a hash variant using
+% |\ekvcValueFast|.
+% \begin{lstlisting}
+% \usepackage{expkv-def}
+% \ekvdefinekeys{keys}
+% {%
+% ,store name = \KEYSname
+% ,initial name = John Doe
+% ,store age = \KEYSage
+% ,initial age = any
+% ,store nationality = \KEYSnationality
+% ,initial nationality = the Universe
+% ,store hobby = \KEYShobby
+% ,initial hobby = to exist
+% ,store type = \KEYStype
+% ,initial type = Mister
+% ,store pronoun = \KEYSpronoun
+% ,initial pronoun = He
+% ,store possessive = \KEYSpossessive
+% ,initial possessive = his
+% }
+% \newcommand*\KEYS[1]
+% {%
+% \begingroup
+% \ekvset{keys}{#1}%
+% \KEYSname\ is a \KEYStype\ from \KEYSnationality. \KEYSpronoun\ is
+% of \KEYSage\ age and \KEYSpossessive\ hobby is \KEYShobby.%
+% \endgroup
+% }
+% \end{lstlisting}
+%
+% The first comparison removes the typesetting part from all the definitions, so
+% that only the key parsing is compared. In this comparison the |\ekvcValue|
+% and |\ekvcValueFast| variants will not differ, as they are exactly the same
+% until the key usage. We find that the split approach is $1.4$ times slower
+% than the \expkvd\ setup and the hash variants end up in the middle at $1.17$
+% times slower.
+%
+% Next we put the typesetting part back in. Every call of the macros will
+% typeset the sentences into a box register in horizontal mode. With the
+% typesetting part (which includes the accessing of values) the fastest remains
+% the \expkvd\ definitions, but split is close at $1.16$ times slower, followed
+% by the hash variant with fast accesses at $1.36$ times slower, and the safe
+% hash access variant ranks in the slowest $1.8$ times slower than \expkvd.
+%
+% Just in case you're wondering now, a simple macro taking seven arguments is
+% $30$ to $40$ times faster than any of those in the argument grabbing and \kv\
+% parsing part and only $1.5$ to $2.8$ times faster if the typesetting part is
+% factored in. So the real choke isn't the parsing.
+%
+% So to summarize this, if you have a reasonable use case for expandable \kv\
+% parsing macros you should go on and define them using \expkvc. If you have a
+% reasonable use case for \kv\ parsing macros but defining them expandable isn't
+% necessary for your use you should take advantage of the greater flexibility of
+% non-expandable \kv\ setups (but if you're after maximum speed there aren't
+% that many \kv\ parsers beating \expkvc). And if you are after maximum
+% performance maybe ditching the \kv\ interface altogether is a good idea, but
+% depending on the number of arguments your interface might get convoluted.
+%
+%
+% \subsection{Useless Macros}
+%
+% Perhaps these macros aren't completely useless, but I figured from a user's
+% point of view I wouldn't know what I should do with these.
+%
+% \begin{function}{\ekvcDate,\ekvcVersion}
+% These two macros store the version and the date of the package/generic code.
+% \end{function}
+%
+%
+% \subsection{Bugs}
+%
+% Of course I don't think there are any bugs (who would knowingly distribute
+% buggy software as long as he isn't a multi-million dollar corporation?). But
+% if you find some please let me know. For this one might find my email address
+% on the first page or file an issue on Github:
+% \url{https://github.com/Skillmon/tex_expkv-cs}
+%
+%
+% \subsection{License}
+%
+% Copyright \textcopyright\ 2020\unless\ifnum\year=2020--\the\year\fi\
+% Jonathan P. Spratte
+%
+% \medskip\noindent
+% This work may be distributed and/or modified under the conditions of the
+% \LaTeX\ Project Public License (LPPL), either version 1.3c of this license or
+% (at your option) any later version. The latest version of this license is in
+% the file:
+%
+% \url{http://www.latex-project.org/lppl.txt}
+%
+% \noindent
+% This work is ``maintained'' (as per LPPL maintenance status) by
+%
+% \mbox{Jonathan P. Spratte}.
+%
+% \end{documentation}^^A=<<
+%
+% \begin{implementation}^^A>>=
+%
+% \clearpage
+%
+% \section{Implementation}^^A>>=
+%^^A the LaTeX package >>=
+% \subsection{The \LaTeX\ Package}
+% Just like for \expkv\ we provide a small \LaTeX\ package that sets up things
+% such that we behave nicely on \LaTeX\ packages and files system. It'll
+% |\input| the generic code which implements the functionality.
+% \gobbledocstriptag
+%<*pkg>
+% \begin{macrocode}
+\RequirePackage{expkv}
+\def\ekvc@tmp
+ {%
+ \ProvidesFile{expkv-cs.tex}%
+ [%
+ \ekvcDate\space v\ekvcVersion\space
+ define expandable key=val macros using expkv%
+ ]%
+ }
+\input{expkv-cs.tex}
+\ProvidesPackage{expkv-cs}%
+ [%
+ \ekvcDate\space v\ekvcVersion\space
+ define expandable key=val macros using expkv%
+ ]
+% \end{macrocode}
+% \gobbledocstriptag
+%</pkg>
+%^^A=<<
+%^^A main file >>=
+% \subsection{The Generic Code}
+% The rest of this implementation will be the generic code.
+% \gobbledocstriptag
+%<*tex>
+%
+% Load \expkv\ if the package didn't already do so -- since \expkv\ has
+% safeguards against being loaded twice this does no harm and the overhead
+% isn't that big. Also we reuse some of the internals of \expkv\ to save us from
+% retyping them.
+% \begin{macrocode}
+\input expkv
+% \end{macrocode}
+%
+% We make sure that \file{expkv-cs.tex} is only input once:
+% \begin{macrocode}
+\expandafter\ifx\csname ekvcVersion\endcsname\relax
+\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \begin{macro}{\ekvcVersion,\ekvcDate}
+% We're on our first input, so lets store the version and date in a macro.
+% \begin{macrocode}
+\def\ekvcVersion{0.6}
+\def\ekvcDate{2020-10-18}
+% \end{macrocode}
+% \end{macro}
+%
+% If the \LaTeX\ format is loaded we want to be a good file and report back who
+% we are, for this the package will have defined |\ekvc@tmp| to use
+% |\ProvidesFile|, else this will expand to a |\relax| and do no harm.
+% \begin{macrocode}
+\csname ekvc@tmp\endcsname
+% \end{macrocode}
+%
+% Store the category code of |@| to later be able to reset it and change it to
+% 11 for now.
+% \begin{macrocode}
+\expandafter\chardef\csname ekvc@tmp\endcsname=\catcode`\@
+\catcode`\@=11
+% \end{macrocode}
+% |\ekvc@tmp| will be reused later, but we don't need it to ever store
+% information long-term after \expkvc\ was initialized.
+%
+% \begin{macro}[internal]{\ekvc@zero}
+% There are different ways to define a |\romannumeral| expansion. If the
+% control is never given to user input, the fastest way is to just execute
+% your code and use a |\chardef|ed zero to end it afterwards. If the control
+% is given to user input (so user input should be expanded) the fastest and
+% best way is to use |\romannumeral`\^^@|, this will expand the user input
+% until something unexpandable is found or a space (which would then be
+% gobbled). However, we want to use the former approach since we don't want to
+% expand any user input, just make sure own code is expanded in two steps.
+% Since we want to use the |\chardef| variant, we have to actually provide
+% such a token.
+% \begin{macrocode}
+\chardef\ekvc@zero0
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvc@keycount}
+% We'll need to keep count how many keys must be defined for each macro in the
+% |split| variants.
+% \begin{macrocode}
+\newcount\ekvc@keycount
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvc@long,\ekvc@any@long}
+% Some macros will have to be defined long. These two will be let to |\long|
+% when this should be the case.
+% \begin{macrocode}
+\def\ekvc@long{}
+\def\ekvc@any@long{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]
+% {
+% \ekvc@ekvset@per@expander,
+% \ekvc@ekvset@per@expander@a,
+% \ekvc@ekvset@per@expander@b
+% }
+% This macro expands |\ekvset| twice so that the first two steps of expansion
+% don't have to be made every time the \expkvc\ macros are used. We have to do
+% a little magic trick to get the macro parameter |#1| for the macro
+% definition this is used in, even though we're calling |\unexpanded|. We do
+% that by splitting the expanded |\ekvset| at some marks and place |##1| in
+% between.
+% \begin{macrocode}
+\def\ekvc@ekvset@pre@expander#1%
+ {%
+ \expandafter\ekvc@ekvset@pre@expander@a\ekvset{#1}\ekvc@stop\ekvc@stop
+ }
+\def\ekvc@ekvset@pre@expander@a
+ {%
+ \expandafter\ekvc@ekvset@pre@expander@b
+ }
+\def\ekvc@ekvset@pre@expander@b#1\ekvc@stop#2\ekvc@stop
+ {%
+ \unexpanded{#1}##1\unexpanded{#2}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ekvcSplitAndUse}
+% The first user macro we want to set up can be reused for
+% \cs[no-index]{ekvcSplitAndForward} and \cs[no-index]{ekvcSplit}. We'll split
+% this one up so that the test whether the macro is already defined doesn't
+% run twice.
+% \begin{macrocode}
+\protected\long\def\ekvcSplitAndUse#1#2%
+ {%
+ \let\ekvc@helpers@needed\@firstoftwo
+ \ekv@ifdefined{\expandafter\@gobble\string#1}%
+ {\ekvc@err@already@defined#1}%
+ {\ekvcSplitAndUse@#1{}{#2}}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvcSplitAndUse@}
+% The actual macro setting up things. We need to set some variables, forward
+% the key list to |\ekvc@SetupSplitKeys|, and afterwards define the front
+% facing macro to call |\ekvset| and put the initials and the argument sorting
+% macro behind it. The internals |\ekvc@any@long|, |\ekvc@initials| and
+% |\ekvc@keycount| will be set correctly by |\ekvc@SetupSplitKeys|.
+% \begin{macrocode}
+\protected\long\def\ekvcSplitAndUse@#1#2#3%
+ {%
+ \edef\ekvc@set{\string#1}%
+ \ekvc@SetupSplitKeys{#3}%
+ \ekvc@helpers@needed
+ {%
+ \ekvc@any@long\edef#1##1%
+ {%
+ \expandafter\ekvc@ekvset@pre@expander\expandafter{\ekvc@set}%
+ \unexpanded\expandafter
+ {\csname ekvc@split@\the\ekvc@keycount\endcsname}%
+ \unexpanded\expandafter{\ekvc@initials{}#2}%
+ }%
+ }%
+ {%
+ \ekvc@any@long\edef#1##1%
+ {%
+ \expandafter\ekvc@ekvset@pre@expander\expandafter{\ekvc@set}%
+ \unexpanded{#2}%
+ \unexpanded\expandafter{\ekvc@initials}%
+ }%
+ }%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\ekvcSplitAndForward}
+% This just reuses |\ekvcSplitAndUse@| with a non-empty second argument,
+% resulting in that argument to be called after the splitting.
+% \begin{macrocode}
+\protected\long\def\ekvcSplitAndForward#1#2#3%
+ {%
+ \let\ekvc@helpers@needed\@firstoftwo
+ \ekv@ifdefined{\expandafter\@gobble\string#1}%
+ {\ekvc@err@already@defined#1}%
+ {\ekvcSplitAndUse@#1{{#2}}{#3}}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ekvcSplit}
+% The first half is just |\ekvcSplitAndForward| then we define the macro to
+% which the parsed key list is forwarded. There we need to allow for up to
+% nine arguments.
+% \begin{macrocode}
+\protected\long\def\ekvcSplit#1#2#3%
+ {%
+ \let\ekvc@helpers@needed\@secondoftwo
+ \ekv@ifdefined{\expandafter\@gobble\string#1}%
+ {\ekvc@err@already@defined#1}%
+ {%
+ \expandafter
+ \ekvcSplitAndUse@\expandafter#1\csname ekvc@\string#1\endcsname{#2}%
+ \ifnum\ekvc@keycount<1
+ \ekvc@any@long\expandafter\def\csname ekvc@\string#1\endcsname{#3}%
+ \else
+ \ifnum\ekvc@keycount>9
+ \ekvc@err@toomany{#1}%
+ \let#1\ekvc@undefined
+ \else
+ \ekvcSplit@build@argspec
+ \ekvc@any@long\expandafter
+ \def\csname ekvc@\string#1\expandafter\endcsname\ekvc@tmp{#3}%
+ \fi
+ \fi
+ }%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvcSplit@build@argspec,\ekvcSplit@build@argspec@}
+% \begin{macrocode}
+\protected\def\ekvcSplit@build@argspec
+ {%
+ \begingroup
+ \edef\ekvc@tmp
+ {\endgroup\def\unexpanded{\ekvc@tmp}{\ekvcSplit@build@argspec@{1}}}%
+ \ekvc@tmp
+ }
+\def\ekvcSplit@build@argspec@#1%
+ {%
+ \ifnum#1>\ekvc@keycount
+ \ekv@fi@gobble
+ \fi
+ \@firstofone
+ {%
+ \unexpanded\expandafter{\csname ekvc@splitmark@#1\endcsname####}#1%
+ \expandafter\ekvcSplit@build@argspec@\expandafter{\the\numexpr#1+1}%
+ }%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]
+% {
+% \ekvc@SetupSplitKeys, \ekvc@SetupSplitKeys@a, \ekvc@SetupSplitKeys@b,
+% \ekvc@SetupSplitKeys@c
+% }
+% These macros parse the list of keys and set up the key macros. First we need
+% to initialise some macros and start |\ekvparse|.
+% \begin{macrocode}
+\protected\long\def\ekvc@SetupSplitKeys
+ {%
+ \ekvc@keycount=0
+ \def\ekvc@any@long{}%
+ \def\ekvc@initials{}%
+ \ekvparse\ekvc@err@value@required\ekvc@SetupSplitKeys@a
+ }
+% \end{macrocode}
+% Then we need to step the key counter for each key. Also we have to check
+% whether this key has a |long| prefix so we initialise |\ekvc@long|.
+% \begin{macrocode}
+\protected\def\ekvc@SetupSplitKeys@a#1%
+ {%
+ \advance\ekvc@keycount1
+ \def\ekvc@long{}%
+ \ekvc@ifspace{#1}%
+ {\ekvc@SetupSplitKeys@b#1\ekvc@stop}%
+ {\ekvc@SetupSplitKeys@c{#1}}%
+ }
+% \end{macrocode}
+% If there was a space, there might be a prefix. If so call the prefix macro,
+% else call the next step |\ekvc@SetupSplitKeys@c| which will define the key
+% macro and add the key's value to the initials list.
+% \begin{macrocode}
+\protected\def\ekvc@SetupSplitKeys@b#1 #2\ekvc@stop
+ {%
+ \ekv@ifdefined{ekvc@split@p@#1}%
+ {\csname ekvc@split@p@#1\endcsname{#2}}%
+ {\ekvc@SetupSplitKeys@c{#1 #2}}%
+ }
+% \end{macrocode}
+% The inner definition is grouped, because we don't want to actually define
+% the marks we build with |\csname|. We have to append the value to the
+% |\ekvc@initials| list here with the correct split mark. The key macro will
+% read everything up to those split marks and change the value following it to
+% the value given to the key. Additionally we'll need a sorting macro for each
+% key count in use so we set it up with |\ekvc@setup@splitmacro|.
+% \begin{macrocode}
+\protected\long\def\ekvc@SetupSplitKeys@c#1#2%
+ {%
+ \begingroup
+ \edef\ekvc@tmp
+ {%
+ \endgroup
+ \long\def\unexpanded{\ekvc@tmp}####1####2%
+ \unexpanded\expandafter
+ {\csname ekvc@splitmark@\the\ekvc@keycount\endcsname}####3%
+ {%
+ ####2%
+ \unexpanded\expandafter
+ {\csname ekvc@splitmark@\the\ekvc@keycount\endcsname}{####1}%
+ }%
+% \end{macrocode}
+% The short variant needs a bit of special treatment. The key macro will be
+% short to throw the correct error, but since there might be long macros
+% somewhere the reordering of arguments needs to be long, so for short keys we
+% use a two step approach, first grabbing only the short argument, then
+% reordering.
+% \begin{macrocode}
+ \unless\ifx\ekvc@long\long
+ \let\unexpanded\expandafter
+ {\csname ekvc@\ekvc@set(#1)\endcsname\ekvc@tmp}%
+ \def\unexpanded{\ekvc@tmp}####1%
+ {%
+ \unexpanded\expandafter{\csname ekvc@\ekvc@set(#1)\endcsname}%
+ {####1}%
+ }%
+ \fi
+ \def\unexpanded{\ekvc@initials}%
+ {%
+ \unexpanded\expandafter{\ekvc@initials}%
+ \unexpanded\expandafter
+ {\csname ekvc@splitmark@\the\ekvc@keycount\endcsname{#2}}%
+ }%
+ }%
+ \ekvc@tmp
+ \ekvlet\ekvc@set{#1}\ekvc@tmp
+ \ekvc@helpers@needed
+ {\expandafter\ekvc@setup@splitmacro\expandafter{\the\ekvc@keycount}}%
+ {}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvc@split@p@long}
+% The |long| prefix lets the internals |\ekvc@long| and |\ekvc@any@long| to
+% |\long| so that the key macro will be long.
+% \begin{macrocode}
+\protected\def\ekvc@split@p@long
+ {%
+ \let\ekvc@long\long
+ \let\ekvc@any@long\long
+ \ekvc@SetupSplitKeys@c
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvc@defarggobbler}
+% This is needed to define a macro with 1-9 parameters programmatically.
+% \LaTeX's \cs[no-index]{newcommand} does something similar for example.
+% \begin{macrocode}
+\protected\def\ekvc@defarggobbler#1{\def\ekvc@tmp##1#1##2##{##1#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]
+% {
+% \ekvc@setup@splitmacro,
+% \ekvc@split@1, \ekvc@split@2, \ekvc@split@3,
+% \ekvc@split@4, \ekvc@split@5, \ekvc@split@6,
+% \ekvc@split@7
+% }
+% Since the first few split macros are different from the others we manually
+% set those up now. All the others will be defined as needed (always
+% globally). The split macros just read up until the correct split mark, move
+% that argument into a list and reinsert the rest, calling the next split
+% macro afterwards.
+% \begin{macrocode}
+\begingroup
+\edef\ekvc@tmp
+ {%
+ \long\gdef\unexpanded\expandafter{\csname ekvc@split@1\endcsname}%
+ \unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}%
+ ##1##2##3%
+ {##3{##1}##2}%
+ \long\gdef\unexpanded\expandafter{\csname ekvc@split@2\endcsname}%
+ \unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}##1%
+ \unexpanded\expandafter{\csname ekvc@splitmark@2\endcsname}##2%
+ ##3##4%
+ {##4{##1}{##2}##3}%
+ \long\gdef\unexpanded\expandafter{\csname ekvc@split@3\endcsname}%
+ \unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}##1%
+ \unexpanded\expandafter{\csname ekvc@splitmark@2\endcsname}##2%
+ \unexpanded\expandafter{\csname ekvc@splitmark@3\endcsname}##3%
+ ##4##5%
+ {##5{##1}{##2}{##3}##4}%
+ \long\gdef\unexpanded\expandafter{\csname ekvc@split@4\endcsname}%
+ \unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}##1%
+ \unexpanded\expandafter{\csname ekvc@splitmark@2\endcsname}##2%
+ \unexpanded\expandafter{\csname ekvc@splitmark@3\endcsname}##3%
+ \unexpanded\expandafter{\csname ekvc@splitmark@4\endcsname}##4%
+ ##5##6%
+ {##6{##1}{##2}{##3}{##4}##5}%
+ \long\gdef\unexpanded\expandafter{\csname ekvc@split@5\endcsname}%
+ \unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}##1%
+ \unexpanded\expandafter{\csname ekvc@splitmark@2\endcsname}##2%
+ \unexpanded\expandafter{\csname ekvc@splitmark@3\endcsname}##3%
+ \unexpanded\expandafter{\csname ekvc@splitmark@4\endcsname}##4%
+ \unexpanded\expandafter{\csname ekvc@splitmark@5\endcsname}##5%
+ ##6##7%
+ {##7{##1}{##2}{##3}{##4}{##5}##6}%
+ \long\gdef\unexpanded\expandafter{\csname ekvc@split@6\endcsname}%
+ \unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}##1%
+ \unexpanded\expandafter{\csname ekvc@splitmark@2\endcsname}##2%
+ \unexpanded\expandafter{\csname ekvc@splitmark@3\endcsname}##3%
+ \unexpanded\expandafter{\csname ekvc@splitmark@4\endcsname}##4%
+ \unexpanded\expandafter{\csname ekvc@splitmark@5\endcsname}##5%
+ \unexpanded\expandafter{\csname ekvc@splitmark@6\endcsname}##6%
+ ##7##8%
+ {##8{##1}{##2}{##3}{##4}{##5}{##6}##7}%
+ \long\gdef\unexpanded\expandafter{\csname ekvc@split@7\endcsname}%
+ \unexpanded\expandafter{\csname ekvc@splitmark@1\endcsname}##1%
+ \unexpanded\expandafter{\csname ekvc@splitmark@2\endcsname}##2%
+ \unexpanded\expandafter{\csname ekvc@splitmark@3\endcsname}##3%
+ \unexpanded\expandafter{\csname ekvc@splitmark@4\endcsname}##4%
+ \unexpanded\expandafter{\csname ekvc@splitmark@5\endcsname}##5%
+ \unexpanded\expandafter{\csname ekvc@splitmark@6\endcsname}##6%
+ \unexpanded\expandafter{\csname ekvc@splitmark@7\endcsname}##7%
+ ##8##9%
+ {##9{##1}{##2}{##3}{##4}{##5}{##6}{##7}##8}%
+ }
+\ekvc@tmp
+\endgroup
+\protected\def\ekvc@setup@splitmacro#1%
+ {%
+ \ekv@ifdefined{ekvc@split@#1}{}%
+ {%
+ \begingroup
+ \edef\ekvc@tmp
+ {%
+ \long\gdef
+ \unexpanded\expandafter{\csname ekvc@split@#1\endcsname}%
+ ####1%
+ \unexpanded\expandafter{\csname ekvc@splitmark@#1\endcsname}%
+ ####2####3%
+ {%
+ \unexpanded\expandafter
+ {\csname ekvc@split@\the\numexpr#1-1\relax\endcsname}%
+ ####1{{####2}####3}%
+ }%
+ }%
+ \ekvc@tmp
+ \endgroup
+ }%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ekvcHashAndUse}
+% |\ekvcHashAndUse| works just like |\ekvcSplitAndUse|.
+% \begin{macrocode}
+\protected\long\def\ekvcHashAndUse#1#2%
+ {%
+ \let\ekvc@helpers@needed\@firstoftwo
+ \ekv@ifdefined{\expandafter\@gobble\string#1}%
+ {\ekvc@err@already@defined#1}%
+ {\ekvcHashAndUse@#1{}{#2}}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvcHashAndUse@}
+% This is more or less the same as |\ekvcSplitAndUse@|. Instead of an empty
+% group we place a marker after the initials, we don't use the sorting macros
+% of |split|, but instead pack all the values in one argument.
+% \begin{macrocode}
+\protected\long\def\ekvcHashAndUse@#1#2#3%
+ {%
+ \edef\ekvc@set{\string#1}%
+ \ekvc@SetupHashKeys{#3}%
+ \ekvc@helpers@needed
+ {%
+ \ekvc@any@long\edef#1##1%
+ {%
+ \expandafter\ekvc@ekvset@pre@expander\expandafter{\ekvc@set}%
+ \unexpanded{\ekvc@hash@pack@argument}%
+ \unexpanded\expandafter{\ekvc@initials\ekvc@stop#2}%
+ }%
+ }%
+ {%
+ \ekvc@any@long\edef#1##1%
+ {%
+ \expandafter\ekvc@ekvset@pre@expander\expandafter{\ekvc@set}%
+ \unexpanded{#2}%
+ \unexpanded\expandafter{\ekvc@initials\ekvc@stop}%
+ }%
+ }%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ekvcHashAndForward}
+% |\ekvcHashAndForward| works just like |\ekvcSplitAndForward|.
+% \begin{macrocode}
+\protected\long\def\ekvcHashAndForward#1#2#3%
+ {%
+ \let\ekvc@helpers@needed\@firstoftwo
+ \ekv@ifdefined{\expandafter\@gobble\string#1}%
+ {\ekvc@err@already@defined#1}%
+ {\ekvcHashAndUse@#1{{#2}}{#3}}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ekvcHash}
+% |\ekvcHash| does the same as |\ekvcSplit|, but has the advantage of not
+% needing to count arguments, so the definition of the internal macro is a bit
+% more straight forward.
+% \begin{macrocode}
+\protected\long\def\ekvcHash#1#2#3%
+ {%
+ \let\ekvc@helpers@needed\@secondoftwo
+ \ekv@ifdefined{\expandafter\@gobble\string#1}%
+ {\ekvc@err@already@defined#1}%
+ {%
+ \expandafter
+ \ekvcHashAndUse@\expandafter#1\csname ekvc@\string#1\endcsname{#2}%
+ \ekvc@any@long\expandafter\def\csname ekvc@\string#1\endcsname
+ ##1\ekvc@stop
+ {#3}%
+ }%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvc@hash@pack@argument}
+% All this macro does is pack the values into one argument and forward that to
+% the next macro.
+% \begin{macrocode}
+\long\def\ekvc@hash@pack@argument#1\ekvc@stop#2{#2{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]
+% {\ekvc@SetupHashKeys,\ekvc@SetupHashKeys@a,\ekvc@SetupHashKeys@b}
+% This should look awfully familiar as well, since it's just the same as for
+% the split keys with a few other names here and there.
+% \begin{macrocode}
+\protected\long\def\ekvc@SetupHashKeys#1%
+ {%
+ \def\ekvc@any@long{}%
+ \def\ekvc@initials{}%
+ \ekvparse\ekvc@err@value@required\ekvc@SetupHashKeys@a{#1}%
+ }
+\protected\def\ekvc@SetupHashKeys@a#1%
+ {%
+ \def\ekvc@long{}%
+ \ekvc@ifspace{#1}%
+ {\ekvc@SetupHashKeys@b#1\ekvc@stop}%
+ {\ekvc@SetupHashKeys@c{#1}}%
+ }
+\protected\def\ekvc@SetupHashKeys@b#1 #2\ekvc@stop
+ {%
+ \ekv@ifdefined{ekvc@hash@p@#1}%
+ {\csname ekvc@hash@p@#1\endcsname{#2}}%
+ {\ekvc@SetupHashKeys@c{#1 #2}}%
+ }
+% \end{macrocode}
+% Yes, even the defining macro looks awfully familiar. Instead of numbered we
+% have named marks. Still the key macros grab everything up to their
+% respective mark and reorder the arguments. The same quirk is applied for
+% short keys. And instead of the |\ekvc@setup@splitmacro| we use
+% |\ekvc@setup@hashmacro|.
+% \begin{macrocode}
+\protected\long\def\ekvc@SetupHashKeys@c#1#2%
+ {%
+ \begingroup
+ \edef\ekvc@tmp
+ {%
+ \endgroup
+ \long\def\unexpanded{\ekvc@tmp}####1####2%
+ \unexpanded\expandafter{\csname ekvc@hashmark@#1\endcsname}####3%
+ {%
+ ####2%
+ \unexpanded\expandafter{\csname ekvc@hashmark@#1\endcsname}{####1}%
+ }%
+ \unless\ifx\ekvc@long\long
+ \let\unexpanded\expandafter
+ {\csname ekvc@\ekvc@set(#1)\endcsname\ekvc@tmp}%
+ \def\unexpanded{\ekvc@tmp}####1%
+ {%
+ \unexpanded\expandafter{\csname ekvc@\ekvc@set(#1)\endcsname}%
+ {####1}%
+ }%
+ \fi
+ \def\unexpanded{\ekvc@initials}%
+ {%
+ \unexpanded\expandafter{\ekvc@initials}%
+ \unexpanded\expandafter{\csname ekvc@hashmark@#1\endcsname{#2}}%
+ }%
+ }%
+ \ekvc@tmp
+ \ekvlet\ekvc@set{#1}\ekvc@tmp
+ \ekvc@setup@hashmacro{#1}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvc@hash@p@long}
+% Nothing astonishing here either.
+% \begin{macrocode}
+\protected\def\ekvc@hash@p@long
+ {%
+ \let\ekvc@long\long
+ \let\ekvc@any@long\long
+ \ekvc@SetupHashKeys@c
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvc@setup@hashmacro}
+% The safe hash macros will be executed inside of a |\romannumeral| expansion
+% context, so they have to insert a stop mark for that once they are done.
+% Most of the tests which have to be executed will already be done, but we
+% have to play safe if the hash doesn't show up in the hash list. Therefore we
+% use some |\ekvc@mark|s and |\ekvc@stop| to throw errors if the hash isn't
+% found in the right place. The fast variants have an easier life and just
+% return the correct value.
+% \begin{macrocode}
+\protected\def\ekvc@setup@hashmacro#1%
+ {%
+ \ekv@ifdefined{ekvc@hash@#1}{}%
+ {%
+ \begingroup
+ \edef\ekvc@tmp
+ {%
+ \long\gdef
+ \unexpanded\expandafter{\csname ekvc@fasthash@#1\endcsname}%
+ ####1%
+ \unexpanded\expandafter{\csname ekvc@hashmark@#1\endcsname}%
+ ####2####3\unexpanded{\ekvc@stop}%
+ {####2}%
+ \long\gdef
+ \unexpanded\expandafter{\csname ekvc@safehash@#1\endcsname}%
+ ####1%
+ {%
+ \unexpanded\expandafter{\csname ekvc@@safehash@#1\endcsname}%
+ ####1\unexpanded{\ekvc@mark\ekvc@zero}%
+ \unexpanded\expandafter
+ {%
+ \csname ekvc@hashmark@#1\endcsname\ekvc@zero
+ \ekvc@mark{\ekvc@err@missing@hash{#1}}\ekvc@stop
+ }%
+ }%
+ \long\gdef
+ \unexpanded\expandafter{\csname ekvc@@safehash@#1\endcsname}%
+ ####1%
+ \unexpanded\expandafter{\csname ekvc@hashmark@#1\endcsname}%
+ ####2####3\unexpanded{\ekvc@mark}####4####5%
+ \unexpanded{\ekvc@stop}%
+ {%
+ ####4####2%
+ }%
+ \long\gdef\unexpanded\expandafter
+ {\csname ekvc@fastsplithash@#1\endcsname}%
+ ####1%
+ \unexpanded\expandafter{\csname ekvc@hashmark@#1\endcsname}%
+ ####2####3\unexpanded{\ekvc@stop}####4%
+ {%
+ ####4{####1####3}{####2}%
+ }%
+ \long\gdef\unexpanded\expandafter
+ {\csname ekvc@safesplithash@#1\endcsname}####1%
+ {%
+ \unexpanded\expandafter
+ {\csname ekvc@@safesplithash@#1\endcsname}%
+ ####1\unexpanded{\ekvc@mark\ekvc@safe@found@hash}%
+ \unexpanded\expandafter
+ {%
+ \csname ekvc@hashmark@#1\endcsname{}%
+ \ekvc@mark{\ekvc@err@missing@hash{#1}\ekvc@safe@no@hash}%
+ \ekvc@stop
+ }%
+ }%
+ \long\gdef\unexpanded\expandafter
+ {\csname ekvc@@safesplithash@#1\endcsname}%
+ ####1%
+ \unexpanded\expandafter{\csname ekvc@hashmark@#1\endcsname}%
+ ####2####3\unexpanded{\ekvc@mark}####4####5%
+ \unexpanded{\ekvc@stop}%
+ {%
+ ####4{####2}####1####3\unexpanded{\ekvc@stop}%
+ }%
+ }%
+ \ekvc@tmp
+ \endgroup
+ }%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ekvcValue}
+% All this does is a few consistency checks on the first argument (not empty,
+% hash macro exists) and then call that hash-grabbing macro that will also
+% test whether the hash is inside of |#2| or not.
+% \begin{macrocode}
+\long\def\ekvcValue#1%
+ {%
+ \romannumeral
+ \ekv@ifdefined{ekvc@safehash@#1}%
+ {\csname ekvc@safehash@#1\endcsname}%
+ {\ekvc@err@unknown@hash{#1}\@firstoftwo\ekvc@zero}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ekvcValueFast}
+% To be as fast as possible, this doesn't test for anything, assuming the user
+% knows best.
+% \begin{macrocode}
+\long\def\ekvcValueFast#1#2{\csname ekvc@fasthash@#1\endcsname#2\ekvc@stop}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ekvcValueSplit,\ekvcValueSplit@recover}
+% This splits off a single value.
+% \begin{macrocode}
+\long\def\ekvcValueSplit#1%
+ {%
+ \ekv@ifdefined{ekvc@safesplithash@#1}%
+ {\csname ekvc@safesplithash@#1\endcsname}%
+ {\ekvc@err@unknown@hash{#1}\ekvcValueSplit@recover}%
+ }
+\long\def\ekvcValueSplit@recover#1#2%
+ {%
+ #2{#1}{}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvc@safe@found@hash, \ekvc@safe@no@hash}
+% \begin{macrocode}
+\long\def\ekvc@safe@found@hash#1#2\ekvc@stop#3%
+ {%
+ #3{#2}{#1}%
+ }
+\long\def\ekvc@safe@no@hash#1#2\ekvc@mark\ekvc@safe@found@hash\ekvc@stop#3%
+ {%
+ #3{#2}{}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ekvcValueSplitFast}
+% Again a fast approach which doesn't provide too many safety measurements.
+% This needs to build the hash function and expand it before passing the
+% results to the next control sequence. The first step only builds the control
+% sequence.
+% \begin{macrocode}
+\long\def\ekvcValueSplitFast#1#2%
+ {%
+ \csname ekvc@fastsplithash@#1\endcsname#2\ekvc@stop
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]
+% {
+% \ekvc@safehash@,\ekvc@fasthash@,
+% \ekvc@safesplithash@,\ekvc@fastsplithash@
+% }
+% At least in the empty hash case we can provide a meaningful error message
+% without affecting performance by just defining the macro that would be build
+% in that case. There is of course a downside to this, the error will not be
+% thrown by |\ekvcValueFast| in three expansion steps. The safe hash variant
+% has to also stop the |\romannumeral| expansion.
+% \begin{macrocode}
+\long\def\ekvc@safehash@#1{\ekvc@err@empty@hash\ekvc@zero}
+\long\def\ekvc@fasthash@#1\ekvc@stop{\ekvc@err@empty@hash}
+\long\def\ekvc@safesplithash@#1#2{\ekvc@err@empty@hash#2{#1}{}}
+\long\def\ekvc@fastsplithash@#1\ekvc@stop#2{\ekvc@err@empty@hash#2{#1}{}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ekvcSecondaryKeys}
+% The secondary keys are defined pretty similar to the way the originals are,
+% but here we also introduce some key types (those have a |@t@| in their name)
+% additionally to the prefixes.
+% \begin{macrocode}
+\protected\long\def\ekvcSecondaryKeys#1#2%
+ {%
+ \edef\ekvc@set{\string#1}%
+ \ekvparse\ekvc@err@value@required\ekvcSecondaryKeys@a{#2}%
+ }
+\protected\def\ekvcSecondaryKeys@a#1%
+ {%
+ \def\ekvc@long{}%
+ \ekvc@ifspace{#1}%
+ {\ekvcSecondaryKeys@b#1\ekvc@stop}%
+ {\ekvc@err@missing@type{#1}\@gobble}%
+ }
+\protected\def\ekvcSecondaryKeys@b#1 #2\ekvc@stop
+ {%
+ \ekv@ifdefined{ekvc@p@#1}%
+ {\csname ekvc@p@#1\endcsname}%
+ {%
+ \ekv@ifdefined{ekvc@t@#1}%
+ {\csname ekvc@t@#1\endcsname}%
+ {\ekvc@err@unknown@keytype{#1}\@firstoftwo\@gobble}%
+ }%
+ {#2}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Secondary Key Types}
+%
+% \begin{macro}[internal]{\ekvc@p@long,\ekvc@after@ptype}
+% The prefixes are pretty straight forward again. Just set |\ekvc@long| and
+% forward to the |@t@| type.
+% \begin{macrocode}
+\protected\def\ekvc@p@long#1%
+ {%
+ \ekvc@ifspace{#1}%
+ {%
+ \let\ekvc@long\long
+ \ekvc@after@ptype#1\ekvc@stop
+ }%
+ {\ekvc@err@missing@type{long #1}\@gobble}%
+ }
+\protected\def\ekvc@after@ptype#1 #2\ekvc@stop
+ {%
+ \ekv@ifdefined{ekvc@t@#1}%
+ {\csname ekvc@t@#1\endcsname{#2}}%
+ {\ekvc@err@unknown@keytype{#1}\@gobble}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]
+% {
+% \ekvc@t@meta, \ekvc@t@nmeta,
+% \ekvc@type@meta, \ekvc@type@meta@a, \ekvc@type@meta@b
+% }
+% The |meta| and |nmeta| key types use a nested |\ekvset| to set other keys in
+% the same macro's \set.
+% \begin{macrocode}
+\protected\def\ekvc@t@meta
+ {%
+ \edef\ekvc@tmp{\ekvc@set}%
+ \expandafter\ekvc@type@meta\expandafter{\ekvc@tmp}\ekvc@long{##1}\ekvlet
+ }
+\protected\def\ekvc@t@nmeta#1%
+ {%
+ \ekvc@assert@not@long{nmeta #1}%
+ \edef\ekvc@tmp{\ekvc@set}%
+ \expandafter\ekvc@type@meta\expandafter{\ekvc@tmp}{}{}\ekvletNoVal{#1}%
+ }
+\protected\long\def\ekvc@type@meta#1#2#3#4#5#6%
+ {%
+ \expandafter\ekvc@type@meta@a\expandafter{\ekvset{#1}{#6}}{#2}{#3}%
+ #4\ekvc@set{#5}\ekvc@tmp
+ }
+\protected\def\ekvc@type@meta@a
+ {%
+ \expandafter\ekvc@type@meta@b\expandafter
+ }
+\protected\long\def\ekvc@type@meta@b#1#2#3%
+ {%
+ #2\def\ekvc@tmp#3{#1}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvc@t@alias}
+% |alias| just checks whether there is a key and/or |NoVal| key defined with
+% the target name and |\let| the key to those.
+% \begin{macrocode}
+\protected\def\ekvc@t@alias#1#2%
+ {%
+ \ekvc@assert@not@long{alias #1}%
+ \let\ekvc@tmp\@firstofone
+ \ekvifdefined\ekvc@set{#2}%
+ {%
+ \ekvletkv\ekvc@set{#1}\ekvc@set{#2}%
+ \let\ekvc@tmp\@gobble
+ }%
+ {}%
+ \ekvifdefinedNoVal\ekvc@set{#2}%
+ {%
+ \ekvletkvNoVal\ekvc@set{#1}\ekvc@set{#2}%
+ \let\ekvc@tmp\@gobble
+ }%
+ {}%
+ \ekvc@tmp{\ekvc@err@unknown@key{#2}}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvc@t@default}
+% The |default| key can be used to set a |NoVal| key for an existing key. It
+% will just pass the \val\ to the key macro of that other key.
+% \begin{macrocode}
+\protected\long\def\ekvc@t@default#1#2%
+ {%
+ \ekvifdefined\ekvc@set{#1}%
+ {%
+ \ekvc@assert@not@long{default #1}%
+ \edef\ekvc@tmp
+ {%
+ \unexpanded\expandafter
+ {\csname\ekv@name\ekvc@set{#1}\endcsname{#2}}%
+ }%
+ \ekvletNoVal\ekvc@set{#1}\ekvc@tmp
+ }%
+ {\ekvc@err@unknown@key{#1}}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Helper Macros}
+%
+% \begin{macro}[internal]{\ekvc@ifspace,\ekvc@ifspace@}
+% A test which can be reduced to an if-empty by gobbling everything up to the
+% first space.
+% \begin{macrocode}
+\long\def\ekvc@ifspace#1%
+ {%
+ \ekvc@ifspace@#1 \ekv@ifempty@B
+ \ekv@ifempty@false\ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
+ }
+\long\def\ekvc@ifspace@#1 % keep this space
+ {%
+ \ekv@ifempty@\ekv@ifempty@A
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Assertions}
+% \begin{macro}[internal]{\ekvc@assert@not@long}
+% Some keys don't want to be |long| and we have to educate the user, so let's
+% throw an error if someone wanted these to be long.
+% \begin{macrocode}
+\long\def\ekvc@assert@not@long#1{\ifx\ekvc@long\long\ekvc@err@no@long{#1}\fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Messages}
+%
+% \begin{macro}[internal]
+% {
+% \ekvc@err@toomany,\ekvc@err@value@required,\ekvc@err@missing@type,
+% \ekvc@err@already@defined
+% }
+% Boring unexpandable error messages.
+% \begin{macrocode}
+\protected\def\ekvc@err@toomany#1%
+ {%
+ \errmessage{expkv-cs Error: Too many keys for macro `\string#1'}%
+ }
+\protected\def\ekvc@err@value@required#1%
+ {%
+ \errmessage{expkv-cs Error: Missing value for key `\unexpanded{#1}'}%
+ }
+\protected\def\ekvc@err@missing@type#1%
+ {%
+ \errmessage
+ {expkv-cs Error: Missing type for secondary key `\unexpanded{#1}'}%
+ }
+\protected\def\ekvc@err@no@long#1%
+ {%
+ \errmessage
+ {expkv-cs Error: prefix `long' not accepted for `\unexpanded{#1}'}%
+ }
+\protected\def\ekvc@err@already@defined#1%
+ {%
+ \errmessage{expkv-cs Error: Macro `\string#1' already defined}%
+ }
+\protected\def\ekvc@err@unknown@keytype#1%
+ {%
+ \errmessage{expkv-cs Error: Unknown key type `\unexpanded{#1}'}%
+ }
+\protected\def\ekvc@err@unknown@key#1%
+ {%
+ \errmessage
+ {expkv-cs Error: Unknown key `\unexpanded{#1}' for macro `\ekvc@set'}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvc@err,\ekvc@err@}
+% We need a way to throw error messages expandably in some contexts.
+% \begin{macrocode}
+\begingroup
+\edef\ekvc@err
+ {%
+ \endgroup
+ \unexpanded{\long\def\ekvc@err}##1%
+ {%
+ \unexpanded{\expandafter\ekvc@err@\@firstofone}%
+ {\unexpanded\expandafter{\csname ! expkv-cs Error:\endcsname}##1.}%
+ \unexpanded{\ekv@stop}%
+ }%
+ }
+\ekvc@err
+\def\ekvc@err@{\expandafter\ekv@gobbleto@stop}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]
+% {\ekvc@err@unknown@hash,\ekvc@err@empty@hash,\ekvc@err@missing@hash}
+% And here are the expandable error messages.
+% \begin{macrocode}
+\long\def\ekvc@err@unknown@hash#1{\ekvc@err{unknown hash `#1'}}
+\long\def\ekvc@err@missing@hash#1{\ekvc@err{hash `#1' not found}}
+\long\def\ekvc@err@empty@hash{\ekvc@err{empty hash}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% Now everything that's left is to reset the category code of |@|.
+% \begin{macrocode}
+\catcode`\@=\ekvc@tmp
+% \end{macrocode}
+%
+% \gobbledocstriptag
+%</tex>
+%^^A=<<
+%
+%^^A=<<
+%
+% \end{implementation}^^A=<<
+%
+% \clearpage
+% \PrintIndex
+%
+\endinput
+%
+^^A vim: ft=tex fdm=marker fmr=>>=,=<<
diff --git a/Master/texmf-dist/source/latex/expkv-def/expkv-def.dtx b/Master/texmf-dist/source/latex/expkv-def/expkv-def.dtx
index 4fbde86d2cb..5edf48780c5 100644
--- a/Master/texmf-dist/source/latex/expkv-def/expkv-def.dtx
+++ b/Master/texmf-dist/source/latex/expkv-def/expkv-def.dtx
@@ -146,30 +146,32 @@ and the derived files expkv-def.pdf
\newcommand\key{\meta{key}}
\newcommand\val{\meta{value}}
\newcommand\set{\meta{set}}
-\newcommand\enfprot{\textcolor{black}{protected}}
-\newcommand\allprot{\textcolor{gray}{protected}}
-\newcommand\notprot{\textcolor{red!80!black}{protected}}
-\newcommand\enflong{\textcolor{black}{long}}
-\newcommand\alllong{\textcolor{gray}{long}}
-\newcommand\notlong{\textcolor{red!80!black}{long}}
-\newcommand\prefixes[2]
+\newcommand\enfprefix{\textcolor{black}}
+\newcommand\allprefix{\textcolor{gray}}
+\newcommand\notprefix{\textcolor{red!80!black}}
+\newcommand\printprefix[2]
{^^A
- \hfill
\ifcase\numexpr#1\relax\or
- \enfprot\or
- \allprot\or
- \notprot\fi\space
- \ifcase\numexpr#2\relax\or
- \enflong\or
- \alllong\or
- \notlong\fi
+ \enfprefix{#2}\or
+ \allprefix{#2}\or
+ \notprefix{#2}\fi
+ }
+\newcommand\prefixes[4]
+ {^^A
+ \hfill
+ \printprefix{#1}{new}
+ \printprefix{#2}{also}
+ \printprefix{#3}{protected}
+ \printprefix{#4}{long}^^A
}
\hypersetup{linkcolor=red!80!black,urlcolor=purple!80!black}
\DoNotIndex{\def,\edef,\,,\=,\begingroup,\catcode,\chardef,\csname,\endcsname}
\DoNotIndex{\endgroup,\endinput,\errmessage,\expandafter,\input,\let,\long}
-\DoNotIndex{\noexpand,\protected,\ProvidesFile,\ProvidesPackage,\relax,\space}
+\DoNotIndex{\protected,\ProvidesFile,\ProvidesPackage,\relax,\space}
\DoNotIndex{\@,\unexpanded,\string,\expanded,\dimexpr,\global,\glueexpr,\hbox}
-\DoNotIndex{\numexpr,\RequirePackage,\setbox,\the,\unless,\xdef}
+\DoNotIndex{\numexpr,\RequirePackage,\setbox,\the,\unless,\xdef,\@firstofone}
+\DoNotIndex{\@firstoftwo,\@gobble,\@secondoftwo,\meaning,\detokenize}
+\DoNotIndex{\romannumeral,\^}
\DoNotIndex{\ifcsname}
\DoNotIndex{\ifx}
\DoNotIndex{\ifdefined}
@@ -271,10 +273,45 @@ and the derived files expkv-def.pdf
% is allowed for all |t|-prefixes.
%
% \subsubsection{\texttt{p}-Prefixes}\label{sec:prefix:p}
-% The |p|-type prefixes are pretty simple by nature, so their description is
-% pretty simple. They affect the \key\ at use-time, so omitting |long| doesn't
-% mean that a \meta{definition} can't contain a |\par| token, only that the
-% \key\ will not accept a |\par| in \val.
+% The two |p|-type prefixes |long| and |protected| are pretty simple by nature,
+% so their description is pretty simple. They affect the \key\ at use-time, so
+% omitting |long| doesn't mean that a \meta{definition} can't contain a |\par|
+% token, only that the \key\ will not accept a |\par| in \val. On the other
+% hand |new| and |also| might be simple on first sight as well, but their rules
+% are a bit more complicated.
+%
+% \begin{function}{also}
+% The following key type will be \emph{added} to an existing \key's
+% definition. You can't add a type taking an argument at use time to an
+% existing key which doesn't take an argument and vice versa. Also you'll get
+% an error if you try to add an action which isn't allowed to be either |long|
+% or |protected| to a key which already is |long| or |protected| (the opposite
+% order would be suboptimal as well, but can't be really captured with the
+% current code).
+%
+% A key already defined as |long| or |protected| will stay |long| or
+% |protected|, but you can as well add |long| or |protected| with the |also|
+% definition.
+%
+% As a small example, suppose you want to create a boolean key, but
+% additionally to setting a boolean value you want to execute some more code
+% as well, you can use the following
+% \begin{lstlisting}
+% \ekvdefinekeys{also-example}
+% {
+% bool key = \ifmybool
+% ,also code key = \domystuff{#1}
+% }
+% \end{lstlisting}
+%
+% If you use |also| on a |choice|, |bool|, |invbool|, or |boolpair| key it is
+% tried to determine if the key already is of one of those types. If this test
+% is true the declared choices will be added to the possible choices but the
+% key's definition will not be changed other than that. If that wouldn't have
+% been done, the callbacks of the different choices could get called multiple
+% times.
+% \end{function}
+%
% \begin{function}{protected,protect}
% The following key will be defined |\protected|. Note that key-types which
% can't be defined expandable will always use |\protected|.
@@ -284,17 +321,33 @@ and the derived files expkv-def.pdf
% The following key will be defined |\long|.
% \end{function}
%
+% \begin{function}{new}
+% The following key must be new (so previously undefined). An error is thrown
+% if it is already defined and the new definition is ignored. |new| only
+% asserts that there are no conflicts between |NoVal| keys and other |NoVal|
+% keys or value taking keys and other value taking keys. For example you can
+% use the following without an error:
+% \begin{lstlisting}
+% \ekvdefinekeys{new-example}
+% {
+% code key = \domystuffwitharg{#1}
+% ,new noval key = \domystuffwithoutarg
+% }
+% \end{lstlisting}
+% \end{function}
+%
% \subsubsection{\texttt{t}-Prefixes}\label{sec:prefix:t}
% Since the |p|-type prefixes apply to some of the |t|-prefixes automatically
% but sometimes one might be disallowed we need some way to highlight this
% behaviour. In the following an enforced prefix will be printed black
-% (\texttt{\enfprot}), allowed prefixes will be grey (\texttt{\allprot}), and
-% disallowed prefixes will be red (\texttt{\notprot}). This will be put
-% flush-right in the syntax showing line.
+% (\texttt{\enfprefix{protected}}), allowed prefixes will be grey
+% (\texttt{\allprefix{protected}}), and disallowed prefixes will be red
+% (\texttt{\notprefix{protected}}). This will be put flush-right in the syntax
+% showing line.
%
% \begin{function}{code,ecode}
% \begin{syntax}
-% code \key\ = \marg{definition} \prefixes22
+% code \key\ = \marg{definition} \prefixes2222
% \end{syntax}
% Define \key\ to expand to \meta{definition}. The \key\ will require a \val\
% for which you can use |#1| inside \meta{definition}. The |ecode| variant
@@ -303,36 +356,49 @@ and the derived files expkv-def.pdf
%
% \begin{function}{noval,enoval}
% \begin{syntax}
-% noval \key\ = \marg{definition} \prefixes23
+% noval \key\ = \marg{definition} \prefixes2223
% \end{syntax}
% The |noval| type defines \key\ to expand to \meta{definition}. The \key\
% will not take a \val. |enoval| fully expands \meta{definition} inside an
% |\edef|.
% \end{function}
%
-% \begin{function}{default,qdefault,edefault}
+% \begin{function}{default,qdefault,odefault,fdefault,edefault}
% \begin{syntax}
-% default \key\ = \marg{definition} \prefixes23
+% default \key\ = \marg{definition} \prefixes3223
% \end{syntax}
% This serves to place a default \val\ for a \key\ that takes an argument, the
% \key\ can be of any argument-grabbing kind, and when used without a \val\
% it will be passed \meta{definition} instead. The |qdefault| variant will
% expand the \key's code once, so will be slightly quicker, but not change if
-% you redefine \key. The |edefault| on the other hand fully expands the
-% \key-code with \meta{definition} as its argument inside of an |\edef|.
+% you redefine \key. |odefault| is just another name for |qdefault|. The
+% |fdefault| version will expand the key code until a non-expandable token or
+% a space is found, a space would be gobbled.\footnotemark{} The |edefault| on the other hand fully expands
+% the \key-code with \meta{definition} as its argument inside of an |\edef|.
% \end{function}
+% \footnotetext
+% {^^A
+% For those familiar with \TeX-coding: This uses a
+% \cs[no-index]{romannumeral}-expansion.
+% }
%
-% \begin{function}{initial}
+% \begin{function}{initial,oinitial,finitial,einitial}
% \begin{syntax}
-% initial \key\ = \{\val\} \prefixes33
+% initial \key\ = \{\val\} \prefixes3333
% \end{syntax}
% With |initial| you can set an initial \val\ for an already defined argument
-% taking \key. It'll just call the key-macro of \key\ and pass it \val.
+% taking \key. It'll just call the key-macro of \key\ and pass it \val. The
+% |einitial| variant will expand \val\ using an |\edef| expansion prior to
+% passing it to the key-macro and the |oinitial| variant will expand the first
+% token in \val\ once. |finitial| will expand \val\ until a non-expandable
+% token or a space is found, a space would be
+% gobbled.\footnotemark
% \end{function}
+% \footnotetext{Again using \cs[no-index]{romannumeral}.}
%
% \begin{function}{bool,gbool,boolTF,gboolTF}
% \begin{syntax}
-% bool \key\ = \meta{cs} \prefixes23
+% bool \key\ = \meta{cs} \prefixes2223
% \end{syntax}
% The \meta{cs} should be a single control sequence, such as |\iffoo|.
% This will define \key\ to be a boolean key, which only takes the values
@@ -350,12 +416,33 @@ and the derived files expkv-def.pdf
% commands which execute the |true| or |false| choice will be, so the usage
% should be safe in an expansion context (\emph{e.g.}, you can use
% \texttt{edefault \key\ = false} without an issue to change the default
-% behaviour to execute the |false| choice).
+% behaviour to execute the |false| choice). Internally a |bool| \key\ is the
+% same as a |choice| key which is set up to handle |true| and |false| as
+% choices.
+% \end{function}
+%
+% \begin{function}{invbool,ginvbool,invboolTF,ginvboolTF}
+% \begin{syntax}
+% bool \key\ = \meta{cs} \prefixes2223
+% \end{syntax}
+% These are inverse boolean keys, they behave like |bool| and friends but set
+% the opposite meaning to the macro \meta{cs} in each case. So if
+% \texttt{key=true} is used |invbool| will set \meta{cs} to |\iffalse| and
+% vice versa.
+% \end{function}
+%
+% \begin{function}{boolpair,gboolpair,boolpairTF,gboolpairTF}
+% \begin{syntax}
+% boolpair \key\ = \meta{cs_1}\meta{cs_2} \prefixes2223
+% \end{syntax}
+% The |boolpair| key type behaves like both |bool| and |invbool|, the
+% \meta{cs_1} will be set to the meaning according to the rules of |bool|, and
+% \meta{cs_2} will be set to the opposite.
% \end{function}
%
% \begin{function}{store,estore,gstore,xstore}
% \begin{syntax}
-% store \key\ = \meta{cs} \prefixes12
+% store \key\ = \meta{cs} \prefixes2212
% \end{syntax}
% The \meta{cs} should be a single control sequence, such as |\foo|.
% This will define \key\ to store \val\ inside of the control sequence. If
@@ -365,9 +452,35 @@ and the derived files expkv-def.pdf
% parameters inside of them by using |\unexpanded|.
% \end{function}
%
+% \begin{function}{data,edata,gdata,xdata}
+% \begin{syntax}
+% data \key\ = \meta{cs} \prefixes2212
+% \end{syntax}
+% The \meta{cs} should be a single control sequence, such as |\foo|. This will
+% define \key\ to store \val\ inside of the control sequence. But unlike the
+% |store| type, the macro \meta{cs} will be a switch at the same time, it'll
+% take two arguments and if \key\ was used expands to the first argument
+% followed by \val\ in braces, if \key\ was not used \meta{cs} will expand to
+% the second argument (so behave like |\@secondoftwo|). The idea is that with
+% this type you can define a key which should be typeset formatted. The
+% |edata| and |xdata| variants will fully expand \val, the |gdata| and |xdata|
+% variants will store \val\ inside \meta{cs} globally. The |p|-prefixes will
+% only affect the key-macro, \meta{cs} will always be expandable and |\long|.
+% \end{function}
+%
+% \begin{function}{dataT,edataT,gdataT,xdataT}
+% \begin{syntax}
+% dataT \key\ = \meta{cs} \prefixes2212
+% \end{syntax}
+% Just like |data|, but instead of \meta{cs} grabbing two arguments it'll only
+% grab one, so by default it'll behave like |\@gobble|, and if a \val\ was
+% given to \key\ the \meta{cs} will behave like |\@firstofone| appended by
+% \marg{value}.
+% \end{function}
+%
% \begin{function}{int,eint,gint,xint}
% \begin{syntax}
-% int \key\ = \meta{cs} \prefixes12
+% int \key\ = \meta{cs} \prefixes2212
% \end{syntax}
% The \meta{cs} should be a single control sequence, such as |\foo|.
% An |int| key will be a \TeX-count register. If \meta{cs} isn't defined yet,
@@ -378,7 +491,7 @@ and the derived files expkv-def.pdf
%
% \begin{function}{dimen,edimen,gdimen,xdimen}
% \begin{syntax}
-% dimen \key\ = \meta{cs} \prefixes12
+% dimen \key\ = \meta{cs} \prefixes2212
% \end{syntax}
% The \meta{cs} should be a single control sequence, such as |\foo|.
% This is just like |int| but uses a dimen register, |\newdimen| and
@@ -387,7 +500,7 @@ and the derived files expkv-def.pdf
%
% \begin{function}{skip,eskip,gskip,xskip}
% \begin{syntax}
-% skip \key\ = \meta{cs} \prefixes12
+% skip \key\ = \meta{cs} \prefixes2212
% \end{syntax}
% The \meta{cs} should be a single control sequence, such as |\foo|.
% This is just like |int| but uses a skip register, |\newskip| and |\glueexpr|
@@ -396,7 +509,7 @@ and the derived files expkv-def.pdf
%
% \begin{function}{toks,gtoks,apptoks,gapptoks}
% \begin{syntax}
-% toks \key\ = \meta{cs} \prefixes12
+% toks \key\ = \meta{cs} \prefixes2212
% \end{syntax}
% The \meta{cs} should be a single control sequence, such as |\foo|.
% Store \val\ inside of a toks-register. The |g| variants use |\global|, the
@@ -406,7 +519,7 @@ and the derived files expkv-def.pdf
%
% \begin{function}{box,gbox}
% \begin{syntax}
-% box \key\ = \meta{cs} \prefixes12
+% box \key\ = \meta{cs} \prefixes2212
% \end{syntax}
% The \meta{cs} should be a single control sequence, such as |\foo|.
% Typesets \val\ into a |\hbox| and stores the result in a box register. The
@@ -415,17 +528,18 @@ and the derived files expkv-def.pdf
%
% \begin{function}{meta}
% \begin{syntax}
-% meta \key\ = \{\kv, \ldots\} \prefixes22
+% meta \key\ = \{\kv, \ldots\} \prefixes2222
% \end{syntax}
% This key type can set other keys, you can access the \val\ which was passed
% to \key\ inside the \kv\ list with |#1|. It works by calling a sub-|\ekvset|
% on the \kv\ list, so a |set| key will only affect that \kv\ list and not the
-% current |\ekvset|.
+% current |\ekvset|. Since it runs in a separate |\ekvset| you can't use
+% |\ekvsneak| using keys or similar macros in the way you normally could.
% \end{function}
%
% \begin{function}{nmeta}
% \begin{syntax}
-% nmeta \key\ = \{\kv, \ldots\} \prefixes23
+% nmeta \key\ = \{\kv, \ldots\} \prefixes2223
% \end{syntax}
% This key type can set other keys, the difference to |meta| is, that this key
% doesn't take a value, so the \kv\ list is static.
@@ -433,7 +547,7 @@ and the derived files expkv-def.pdf
%
% \begin{function}{smeta}
% \begin{syntax}
-% smeta \key\ = \marg{set}\{\kv, \ldots\} \prefixes22
+% smeta \key\ = \marg{set}\{\kv, \ldots\} \prefixes2222
% \end{syntax}
% Yet another |meta| variant. An |smeta| key will take a \val\ which you can
% access using |#1|, but it sets the \kv\ list inside of \set, so is equal to
@@ -442,7 +556,7 @@ and the derived files expkv-def.pdf
%
% \begin{function}{snmeta}
% \begin{syntax}
-% snmeta \key\ = \marg{set}\{\kv, \ldots\} \prefixes23
+% snmeta \key\ = \marg{set}\{\kv, \ldots\} \prefixes2223
% \end{syntax}
% And the last |meta| variant. |snmeta| is a combination of |smeta| and
% |nmeta|. It doesn't take an argument and sets the \kv\ list inside of \set.
@@ -450,7 +564,7 @@ and the derived files expkv-def.pdf
%
% \begin{function}{set}
% \begin{syntax}
-% set \key\ = \marg{set} \prefixes33
+% set \key\ = \marg{set} \prefixes2233
% \end{syntax}
% This will define \key\ to change the set of the current |\ekvset|
% invocation to \set. You can omit \set\ (including the equals sign),
@@ -462,7 +576,7 @@ and the derived files expkv-def.pdf
%
% \begin{function}{choice}
% \begin{syntax}
-% choice \key\ = \{\val=\meta{definition}, \ldots\} \prefixes23
+% choice \key\ = \{\val=\meta{definition}, \ldots\} \prefixes2223
% \end{syntax}
% Defines \key\ to be a |choice| key, meaning it will only accept a limited
% set of values. You should define each possible \val\ inside of the
@@ -470,7 +584,20 @@ and the derived files expkv-def.pdf
% \meta{definition} will be left in the input stream. You can make
% individual values |protected| inside the \val=\meta{definition} list. By
% default a |choice| key is expandable, an undefined \val\ will throw an error
-% in an expandable way.
+% in an expandable way (but see the |unknown-choice| prefix). You can add
+% additional choices after the \key\ was created by using |choice| again for
+% the same \key, redefining choices is possible the same way, but there is no
+% interface to remove certain choices.
+% \end{function}
+%
+% \begin{function}{unknown-choice}
+% \begin{syntax}
+% unknown-choice \key\ = \marg{definition} \prefixes2323
+% \end{syntax}
+% By default an unknown \val\ passed to a |choice| or |bool| key will throw an
+% error. However, with this prefix you can define an alternative action which
+% should be executed if \key\ received an unknown choice. In \meta{definition}
+% you can refer to the choice which was passed in with |#1|.
% \end{function}
%
% \subsection{Bugs}
@@ -486,31 +613,87 @@ and the derived files expkv-def.pdf
% \begin{lstlisting}
% \ekvdefinekeys{example}
% {
-% ,long code keyA = #1
+% long code keyA = #1
% ,noval keyA = NoVal given
% ,bool keyB = \keyB
% ,boolTF keyC = \keyC
% ,store keyD = \keyD
-% ,int keyE = \keyE
-% ,dimen keyF = \keyF
-% ,skip keyG = \keyG
-% ,toks keyH = \keyH
-% ,default keyH = \empty test
-% ,box keyI = \keyI
-% ,qdefault keyI = text
-% ,choice keyJ =
+% ,data keyE = \keyE
+% ,dataT keyF = \keyF
+% ,int keyG = \keyG
+% ,dimen keyH = \keyH
+% ,skip keyI = \keyI
+% ,toks keyJ = \keyJ
+% ,default keyJ = \empty test
+% ,new box keyK = \keyK
+% ,qdefault keyK = K
+% ,choice keyL =
% {
-% ,protected 1 = \texttt{a}
+% protected 1 = \texttt{a}
% ,2 = b
% ,3 = c
% ,4 = d
% ,5 = e
% }
-% ,edefault keyJ = 2
-% ,meta keyK = {keyA={#1},keyB=false}
-% ,set setB = B
+% ,edefault keyL = 2
+% ,meta keyM = {keyA={#1},keyB=false}
+% ,invbool keyN = \keyN
+% ,boolpair keyO = \keyOa\keyOb
+% }
+% \end{lstlisting}
+%
+% \bigskip
+% Since the |data| type might be a bit strange, here is another usage example
+% for it.
+% \begin{lstlisting}
+% \ekvdefinekeys{ex}
+% {
+% data name = \Pname
+% ,data age = \Page
+% ,dataT hobby = \Phobby
% }
+% \newcommand\Person[1]
+% {%
+% \begingroup
+% \ekvset{ex}{#1}%
+% \begin{description}
+% \item[\Pname{}{\errmessage{A person requires a name}}]
+% \item[Age] \Page{\textit}{\errmessage{A person requires an age}}
+% \Phobby{\item[Hobbies]}
+% \end{description}
+% \endgroup
+% }
+% \Person{name=Jonathan P. Spratte, age=young, hobby=\TeX\ coding}
+% \Person{name=Some User, age=unknown, hobby=Reading Documentation}
+% \Person{name=Anybody, age=any}
% \end{lstlisting}
+% In this example a person should have a name and an age, but doesn't have to
+% have hobbies. The name will be displayed as the description item and the age
+% in Italics. If a person has no hobbies the description item will be silently
+% left out. The result of the above code looks like this:
+%
+% \begingroup
+% \ekvdefinekeys{ex}
+% {
+% data name = \Pname
+% ,data age = \Page
+% ,dataT hobby = \Phobby
+% }
+% \newcommand\Person[1]
+% {%
+% \begingroup
+% \ekvset{ex}{#1}%
+% \begin{description}
+% \item[\Pname{}{\errmessage{A person requires a name}}]
+% \item[Age] \Page{\textit}{\errmessage{A person requires an age}}
+% \Phobby{\item[Hobbies]}
+% \end{description}
+% \endgroup
+% }
+% \Person{name=Jonathan P. Spratte, age=young, hobby=\TeX\ coding}
+% \Person{name=Some User, age=unknown, hobby=Reading Documentation}
+% \Person{name=Anybody, age=any}
+% \endgroup
%
% \subsection{License}
%
@@ -583,8 +766,8 @@ and the derived files expkv-def.pdf
% \begin{macro}{\ekvdVersion,\ekvdDate}
% We're on our first input, so lets store the version and date in a macro.
% \begin{macrocode}
-\def\ekvdVersion{0.1a}
-\def\ekvdDate{2020-02-29}
+\def\ekvdVersion{0.7}
+\def\ekvdDate{2020-12-28}
% \end{macrocode}
% \end{macro}
%
@@ -606,16 +789,20 @@ and the derived files expkv-def.pdf
% \expkvd\ was initialized.
%
% \begin{macro}[internal]
-% {\ekvd@long,\ekvd@prot,\ekvd@clear@prefixes,\ekvd@empty}
-% \expkvd\ will use |\ekvd@long| and |\ekvd@prot| to store whether a key should
-% be defined as |\long| or |\protected|, and we have to clear them for every new
-% key. By default they'll just be empty.
+% {\ekvd@long,\ekvd@prot,\ekvd@clear@prefixes,\ekvd@empty,\ekvd@ifalso}
+% \expkvd\ will use |\ekvd@long|, |\ekvd@prot|, and |\ekvd@ifalso| to store
+% whether a key should be defined as |\long| or |\protected| or adds an action
+% to an existing key, and we have to clear them for every new key. By default
+% |long| and |protected| will just be empty, |ifalso| will be
+% |\@secondoftwo|, and |ifnew| will just use its third argument.
% \begin{macrocode}
\def\ekvd@empty{}
\protected\def\ekvd@clear@prefixes
{%
\let\ekvd@long\ekvd@empty
\let\ekvd@prot\ekvd@empty
+ \let\ekvd@ifalso\@secondoftwo
+ \long\def\ekvd@ifnew##1##2##3{##3}%
}
\ekvd@clear@prefixes
% \end{macrocode}
@@ -630,23 +817,34 @@ and the derived files expkv-def.pdf
\protected\def\ekvdefinekeys#1%
{%
\def\ekvd@set{#1}%
- \ekvparse\ekvd@noarg\ekvd@
+ \ekvparse\ekvd@noarg\ekvd@arg
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\ekvd@noarg,\ekvd@}
-% |\ekvd@noarg| just places a special marker and gives control to |\ekvd@|.
-% |\ekvd@| has to test whether there is a space inside the key and if so calls
-% the prefix grabbing routine, else we throw an error and ignore the key.
+% \begin{macro}[internal]{\ekvd@noarg,\ekvd@arg,\ekvd@handle}
+% |\ekvd@noarg| and |\ekvd@arg| store whether there was a value in the \kv\
+% pair. |\ekvd@handle| has to test whether there is a space inside the key and
+% if so calls the prefix grabbing routine, else we throw an error and ignore the
+% key.
% \begin{macrocode}
-\protected\def\ekvd@noarg#1{\ekvd@{#1}\ekvd@noarg@mark}
-\protected\long\def\ekvd@#1#2%
+\protected\def\ekvd@noarg#1%
+ {%
+ \let\ekvd@ifnoarg\@firstoftwo
+ \ekvd@handle{#1}{}%
+ }
+\protected\def\ekvd@arg
+ {%
+ \let\ekvd@ifnoarg\@secondoftwo
+ \ekvd@handle
+ }
+\protected\long\def\ekvd@handle#1#2%
{%
\ekvd@clear@prefixes
+ \edef\ekvd@cur{\detokenize{#1}}%
\ekvd@ifspace{#1}%
{\ekvd@prefix\ekv@mark#1\ekv@stop{#2}}%
- {\ekvd@err@missing@prefix{#1}}%
+ \ekvd@err@missing@type
}
% \end{macrocode}
% \end{macro}
@@ -666,7 +864,7 @@ and the derived files expkv-def.pdf
{\ekv@strip{#2}{\csname ekvd@t@#1\endcsname}}%
{%
\ekv@ifdefined{ekvd@p@#1}%
- {\csname ekvd@p@#1\endcsname{#2}}%
+ {\csname ekvd@p@#1\endcsname\ekvd@prefix@after@p{#2}}%
{\ekvd@err@undefined@prefix{#1}\@gobble}%
}%
}
@@ -682,42 +880,55 @@ and the derived files expkv-def.pdf
{%
\ekvd@ifspace{#1}%
{\ekvd@prefix#1\ekv@stop}%
- {%
- \expandafter\ekvd@err@missing@prefix\expandafter{\ekv@gobble@mark#1}%
- \@gobble
- }%
+ {\ekvd@err@missing@type\@gobble}%
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\ekvd@p@long,\ekvd@p@protected,\ekvd@p@protect}
+% \begin{macro}[internal]
+% {\ekvd@p@long,\ekvd@p@protected,\ekvd@p@protect,\ekvd@p@also,\ekvd@p@new}
% Define the |@p@| type prefixes, they all just store some information in a
-% temporary macro and call |\ekvd@prefix@after@p|.
+% temporary macro.
% \begin{macrocode}
-\protected\def\ekvd@p@long{\let\ekvd@long\long\ekvd@prefix@after@p}
-\protected\def\ekvd@p@protected{\let\ekvd@prot\protected\ekvd@prefix@after@p}
+\protected\def\ekvd@p@long{\let\ekvd@long\long}
+\protected\def\ekvd@p@protected{\let\ekvd@prot\protected}
\let\ekvd@p@protect\ekvd@p@protected
+\protected\def\ekvd@p@also{\let\ekvd@ifalso\@firstoftwo}
+\protected\def\ekvd@p@new{\let\ekvd@ifnew\ekvd@assert@new}
% \end{macrocode}
% \end{macro}
%
% \subsubsection{Key Types}
%
-% \begin{macro}[internal]{\ekvd@t@set}
+% \begin{macro}[internal]{\ekvd@type@set,\ekvd@t@set}
% The |set| type is quite straight forward, just define a |NoVal| key to call
% |\ekvchangeset|.
% \begin{macrocode}
-\protected\def\ekvd@t@set#1#2%
+\protected\def\ekvd@type@set#1#2%
{%
- \ekvd@assert@not@long{set #1}%
- \ekvd@assert@not@protected{set #1}%
- \ekvd@ifnoarg{#2}%
- {\ekvdefNoVal\ekvd@set{#1}{\ekvchangeset{#1}}}%
+ \ekvd@assert@not@long
+ \ekvd@assert@not@protected
+ \ekvd@ifnew{NoVal}{#1}%
{%
\ekv@ifempty{#2}%
- {\ekvd@err@missing@definition{set #1}}%
- {\ekvdefNoVal\ekvd@set{#1}{\ekvchangeset{#2}}}%
+ {\ekvd@err@missing@definition}%
+ {%
+ \ekvd@ifalso
+ {%
+ \ekv@expargtwice{\ekvd@add@noval{#1}}%
+ {\ekvchangeset{#2}}%
+ \ekvd@assert@not@protected@also
+ }%
+ {\ekv@expargtwice{\ekvdefNoVal\ekvd@set{#1}}{\ekvchangeset{#2}}}%
+ }%
}%
}
+\protected\def\ekvd@t@set#1#2%
+ {%
+ \ekvd@ifnoarg
+ {\ekvd@type@set{#1}{#1}}%
+ {\ekvd@type@set{#1}{#2}}%
+ }
% \end{macrocode}
% \end{macro}
%
@@ -729,17 +940,22 @@ and the derived files expkv-def.pdf
% |@type@|. |noval| and |enoval| are so similar that we can use such a |@type@|
% macro, even if we could've done |noval| in a slightly faster way without it.
% \begin{macrocode}
-\protected\long\def\ekvd@type@noval#1#2#3#4%
+\protected\long\def\ekvd@type@noval#1#2#3%
{%
- \ekvd@assert@arg{#1noval #3}{#4}%
+ \ekvd@ifnew{NoVal}{#2}%
{%
- \ekvd@assert@not@long{#1noval #3}%
- \ekvd@prot#2\ekvd@tmp{#4}%
- \ekvletNoVal\ekvd@set{#3}\ekvd@tmp
+ \ekvd@assert@arg
+ {%
+ \ekvd@assert@not@long
+ \ekvd@prot#1\ekvd@tmp{#3}%
+ \ekvd@ifalso
+ {\ekv@exparg{\ekvd@add@noval{#2}}\ekvd@tmp{}}%
+ {\ekvletNoVal\ekvd@set{#2}\ekvd@tmp}%
+ }%
}%
}
-\protected\def\ekvd@t@noval{\ekvd@type@noval{}\def}
-\protected\def\ekvd@t@enoval{\ekvd@type@noval e\edef}
+\protected\def\ekvd@t@noval{\ekvd@type@noval\def}
+\protected\def\ekvd@t@enoval{\ekvd@type@noval\edef}
% \end{macrocode}
% \end{macro}
%
@@ -747,20 +963,29 @@ and the derived files expkv-def.pdf
% |code| is simple as well, |ecode| has to use |\edef| on a temporary macro,
% since \expkv\ doesn't provide an |\ekvedef|.
% \begin{macrocode}
-\protected\long\def\ekvd@type@code#1#2#3#4%
+\protected\long\def\ekvd@type@code#1#2#3%
{%
- \ekvd@assert@arg{#1code #3}{#4}
+ \ekvd@ifnew{}{#2}%
{%
- \ekvd@prot\ekvd@long#2\ekvd@tmp##1{#4}%
- \ekvlet\ekvd@set{#3}\ekvd@tmp
+ \ekvd@assert@arg
+ {%
+ \ekvd@prot\ekvd@long#1\ekvd@tmp##1{#3}%
+ \ekvd@ifalso
+ {\ekv@exparg{\ekvd@add@val{#2}}{\ekvd@tmp{##1}}{}}%
+ {\ekvlet\ekvd@set{#2}\ekvd@tmp}%
+ }%
}%
}
-\protected\def\ekvd@t@code{\ekvd@type@code{}\def}
-\protected\def\ekvd@t@ecode{\ekvd@type@code e\edef}
+\protected\def\ekvd@t@code{\ekvd@type@code\def}
+\protected\def\ekvd@t@ecode{\ekvd@type@code\edef}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\ekvd@type@default,\ekvd@t@default,\ekvd@t@qdefault}
+% \begin{macro}[internal]
+% {
+% \ekvd@type@default,\ekvd@t@default,\ekvd@t@qdefault,\ekvd@t@odefault,
+% \ekvd@t@fdefault
+% }
% |\ekvd@type@default| asserts there was an argument, also the key for which one
% wants to set a default has to be already defined (this is not so important for
% |default|, but |qdefault| requires is). If everything is good, |\edef| a
@@ -769,23 +994,28 @@ and the derived files expkv-def.pdf
% \begin{macrocode}
\protected\long\def\ekvd@type@default#1#2#3#4%
{%
- \ekvd@assert@arg{#1default #3}{#4}%
+ \ekvd@assert@arg
{%
\ekvifdefined\ekvd@set{#3}%
{%
- \ekvd@assert@not@long{#1default #3}%
+ \ekvd@assert@not@new
+ \ekvd@assert@not@long
\ekvd@prot\edef\ekvd@tmp
{%
- \unexpanded\expandafter#2%
- {\csname\ekv@name\ekvd@set{#3}\endcsname{#4}}%
+ \unexpanded\expandafter#1%
+ {#2\csname\ekv@name\ekvd@set{#3}\endcsname{#4}}%
}%
- \ekvletNoVal\ekvd@set{#3}\ekvd@tmp
+ \ekvd@ifalso
+ {\ekv@exparg{\ekvd@add@noval{#3}}\ekvd@tmp{}}%
+ {\ekvletNoVal\ekvd@set{#3}\ekvd@tmp}%
}%
{\ekvd@err@undefined@key{#3}}%
}%
}
\protected\def\ekvd@t@default{\ekvd@type@default{}{}}
-\protected\def\ekvd@t@qdefault{\ekvd@type@default q{\expandafter\expandafter}}
+\protected\def\ekvd@t@qdefault{\ekvd@type@default{\expandafter\expandafter}{}}
+\let\ekvd@t@odefault\ekvd@t@qdefault
+\protected\def\ekvd@t@fdefault{\ekvd@type@default{}{\romannumeral`\^^@}}
% \end{macrocode}
% \end{macro}
%
@@ -795,14 +1025,17 @@ and the derived files expkv-def.pdf
% \begin{macrocode}
\protected\long\def\ekvd@t@edefault#1#2%
{%
- \ekvd@assert@arg{edefault #1}{#2}%
+ \ekvd@assert@arg
{%
\ekvifdefined\ekvd@set{#1}%
{%
- \ekvd@assert@not@long{edefault #1}%
+ \ekvd@assert@not@new
+ \ekvd@assert@not@long
\ekvd@prot\edef\ekvd@tmp
{\csname\ekv@name\ekvd@set{#1}\endcsname{#2}}%
- \ekvletNoVal\ekvd@set{#1}\ekvd@tmp
+ \ekvd@ifalso
+ {\ekv@exparg{\ekvd@add@noval{#1}}\ekvd@tmp{}}%
+ {\ekvletNoVal\ekvd@set{#1}\ekvd@tmp}%
}%
{\ekvd@err@undefined@key{#1}}%
}%
@@ -810,51 +1043,155 @@ and the derived files expkv-def.pdf
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\ekvd@t@initial}
+% \begin{macro}[internal]
+% {\ekvd@t@initial,\ekvd@t@oinitial,\ekvd@t@finitial,\ekvd@t@einitial}
% \begin{macrocode}
-\long\def\ekvd@t@initial#1#2%
+\long\def\ekvd@type@initial#1#2#3#4%
{%
- \ekvd@assert@arg{initial #1}{#2}%
+ \ekvd@assert@arg
{%
- \ekvifdefined\ekvd@set{#1}%
+ \ekvifdefined\ekvd@set{#3}%
{%
- \ekvd@assert@not@long{initial #1}%
- \ekvd@assert@not@protected{initial #1}%
- \csname\ekv@name\ekvd@set{#1}\endcsname{#2}%
+ \ekvd@assert@not@new
+ \ekvd@assert@not@also
+ \ekvd@assert@not@long
+ \ekvd@assert@not@protected
+ #1{#2#4}%
+ \csname\ekv@name\ekvd@set{#3}\expandafter\endcsname\expandafter
+ {\ekvd@tmp}%
}%
- {\ekvd@err@undefined@key{#1}}%
+ {\ekvd@err@undefined@key{#3}}%
}%
}
+\def\ekvd@t@initial{\ekvd@type@initial{\def\ekvd@tmp}{}}
+\def\ekvd@t@oinitial{\ekvd@type@initial{\ekv@exparg{\def\ekvd@tmp}}{}}
+\def\ekvd@t@einitial{\ekvd@type@initial{\edef\ekvd@tmp}{}}
+\def\ekvd@t@finitial
+ {\ekvd@type@initial{\ekv@exparg{\def\ekvd@tmp}}{\romannumeral`\^^@}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[internal]
-% {\ekvd@type@bool,\ekvd@t@bool,\ekvd@t@gbool,\ekvd@t@boolTF,\ekvd@t@gboolTF}
+% {
+% \ekvd@type@bool,\ekvd@t@bool,\ekvd@t@gbool,\ekvd@t@boolTF,\ekvd@t@gboolTF,
+% \ekvd@t@invbool,\ekvd@t@ginvbool,\ekvd@t@invboolTF,\ekvd@t@ginvboolTF,
+% }
% The boolean types are a quicker version of a |choice| that accept |true| and
% |false|, and set up the |NoVal| action to be identical to \texttt{\key=true}.
% The |true| and |false| actions are always just |\let|ting the macro in |#7| to
% some other macro (\emph{e.g.}, \cs[no-index]{iftrue}).
% \begin{macrocode}
-\protected\def\ekvd@type@bool#1#2#3#4#5#6#7%
+\protected\def\ekvd@type@bool#1#2#3#4#5%
+ {%
+ \ekvd@ifnew{}{#4}%
+ {%
+ \ekvd@ifnew{NoVal}{#4}%
+ {%
+ \ekvd@assert@filledarg{#5}%
+ {%
+ \ekvd@newlet#5#3%
+ \ekvd@type@choice{#4}%
+ \protected\ekvdefNoVal\ekvd@set{#4}{#1\let#5#2}%
+ \protected\expandafter\def
+ \csname\ekvd@choice@name\ekvd@set{#4}{true}\endcsname
+ {#1\let#5#2}%
+ \protected\expandafter\def
+ \csname\ekvd@choice@name\ekvd@set{#4}{false}\endcsname
+ {#1\let#5#3}%
+ }%
+ }%
+ }%
+ }
+\protected\def\ekvd@t@bool{\ekvd@type@bool{}\iftrue\iffalse}
+\protected\def\ekvd@t@gbool{\ekvd@type@bool\global\iftrue\iffalse}
+\protected\def\ekvd@t@boolTF{\ekvd@type@bool{}\@firstoftwo\@secondoftwo}
+\protected\def\ekvd@t@gboolTF{\ekvd@type@bool\global\@firstoftwo\@secondoftwo}
+\protected\def\ekvd@t@invbool{\ekvd@type@bool{}\iffalse\iftrue}
+\protected\def\ekvd@t@ginvbool{\ekvd@type@bool\global\iffalse\iftrue}
+\protected\def\ekvd@t@invboolTF{\ekvd@type@bool{}\@secondoftwo\@firstoftwo}
+\protected\def\ekvd@t@ginvboolTF
+ {\ekvd@type@bool\global\@secondoftwo\@firstoftwo}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]
+% {
+% \ekvd@type@boolpair,
+% \ekvd@t@boolpair,\ekvd@t@gboolpair,\ekvd@t@boolpairTF,\ekvd@t@gboolpairTF
+% }
+% The boolean pair types are essentially the same as the boolean types, but set
+% two macros instead of one.
+% \begin{macrocode}
+\protected\def\ekvd@type@boolpair#1#2#3#4#5#6%
+ {%
+ \ekvd@ifnew{}{#4}%
+ {%
+ \ekvd@ifnew{NoVal}{#4}%
+ {%
+ \ekvd@newlet#5#3%
+ \ekvd@newlet#6#2%
+ \ekvd@type@choice{#4}%
+ \protected\ekvdefNoVal\ekvd@set{#4}{#1\let#5#2#1\let#6#3}%
+ \protected\expandafter\def
+ \csname\ekvd@choice@name\ekvd@set{#4}{true}\endcsname
+ {#1\let#5#2#1\let#6#3}%
+ \protected\expandafter\def
+ \csname\ekvd@choice@name\ekvd@set{#4}{false}\endcsname
+ {#1\let#5#3#1\let#6#2}%
+ }%
+ }%
+ }
+\protected\def\ekvd@t@boolpair#1#2%
+ {\ekvd@assert@twoargs{#2}{\ekvd@type@boolpair{}\iftrue\iffalse{#1}#2}}
+\protected\def\ekvd@t@gboolpair#1#2%
+ {\ekvd@assert@twoargs{#2}{\ekvd@type@boolpair\global\iftrue\iffalse{#1}#2}}
+\protected\def\ekvd@t@boolpairTF#1#2%
+ {%
+ \ekvd@assert@twoargs{#2}%
+ {\ekvd@type@boolpair{}\@firstoftwo\@secondoftwo{#1}#2}%
+ }
+\protected\def\ekvd@t@gboolpairTF#1#2%
+ {%
+ \ekvd@assert@twoargs{#2}%
+ {\ekvd@type@boolpair\global\@firstoftwo\@secondoftwo{#1}#2}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]
+% {
+% \ekvd@type@data,\ekvd@t@data,\ekvd@t@gdata,\ekvd@t@dataT,\ekvd@t@gdataT
+% }
+% \begin{macrocode}
+\protected\def\ekvd@type@data#1#2#3#4#5#6%
{%
- \ekvd@assert@filledarg{#1bool#2 #6}{#7}%
+ \ekvd@ifnew{}{#5}%
{%
- \ekvd@newlet#7#5%
- \ekvd@type@choice{#1bool#2}{#6}%
- \protected\ekvdefNoVal\ekvd@set{#6}{#3\let#7#4}%
- \protected\expandafter\def
- \csname\ekvd@choice@name\ekvd@set{#6}{true}\endcsname
- {#3\let#7#4}%
- \protected\expandafter\def
- \csname\ekvd@choice@name\ekvd@set{#6}{false}\endcsname
- {#3\let#7#5}%
+ \ekvd@assert@filledarg{#6}%
+ {%
+ \ekvd@newlet#6#1%
+ \ekvd@ifalso
+ {%
+ \let\ekvd@prot\protected
+ \ekvd@add@val{#5}{\long#2#6####1#3{####1{#4}}}{}%
+ }%
+ {%
+ \protected\ekvd@long\ekvdef\ekvd@set{#5}%
+ {\long#2#6####1#3{####1{#4}}}%
+ }%
+ }%
}%
}
-\protected\def\ekvd@t@bool{\ekvd@type@bool{}{}{}\iftrue\iffalse}
-\protected\def\ekvd@t@gbool{\ekvd@type@bool g{}\global\iftrue\iffalse}
-\protected\def\ekvd@t@boolTF{\ekvd@type@bool{}{TF}{}\@firstoftwo\@secondoftwo}
-\protected\def\ekvd@t@gboolTF
- {\ekvd@type@bool g{TF}\global\@firstoftwo\@secondoftwo}
+\protected\def\ekvd@t@data
+ {\ekvd@type@data\@secondoftwo\edef{####2}{\unexpanded{##1}}}
+\protected\def\ekvd@t@edata{\ekvd@type@data\@secondoftwo\edef{####2}{##1}}
+\protected\def\ekvd@t@gdata
+ {\ekvd@type@data\@secondoftwo\xdef{####2}{\unexpanded{##1}}}
+\protected\def\ekvd@t@xdata{\ekvd@type@data\@secondoftwo\xdef{####2}{##1}}
+\protected\def\ekvd@t@dataT{\ekvd@type@data\@gobble\edef{}{\unexpanded{##1}}}
+\protected\def\ekvd@t@edataT{\ekvd@type@data\@gobble\edef{}{##1}}
+\protected\def\ekvd@t@gdataT{\ekvd@type@data\@gobble\xdef{}{\unexpanded{##1}}}
+\protected\def\ekvd@t@xdataT{\ekvd@type@data\@gobble\xdef{}{##1}}
% \end{macrocode}
% \end{macro}
%
@@ -865,33 +1202,51 @@ and the derived files expkv-def.pdf
% whether the first argument is defined and if not does
% |\csname new#2\endcsname#1|.
% \begin{macrocode}
-\protected\def\ekvd@type@box#1#2#3#4%
+\protected\def\ekvd@type@box#1#2#3%
{%
- \ekvd@assert@filledarg{#1box #3}{#4}%
+ \ekvd@ifnew{}{#2}%
{%
- \ekvd@newreg#4{box}%
- \protected\ekvd@long\ekvdef\ekvd@set{#3}%
- {#2\setbox#4\hbox{\begingroup##1\endgroup}}%
+ \ekvd@assert@filledarg{#3}%
+ {%
+ \ekvd@newreg#3{box}%
+ \ekvd@ifalso
+ {%
+ \let\ekvd@prot\protected
+ \ekvd@add@val{#2}{#1\setbox#3\hbox{\begingroup##1\endgroup}}{}%
+ }%
+ {%
+ \protected\ekvd@long\ekvdef\ekvd@set{#2}%
+ {#1\setbox#3\hbox{\begingroup##1\endgroup}}%
+ }%
+ }%
}%
}
-\protected\def\ekvd@t@box{\ekvd@type@box{}{}}
-\protected\def\ekvd@t@gbox{\ekvd@type@box g\global}
+\protected\def\ekvd@t@box{\ekvd@type@box{}}
+\protected\def\ekvd@t@gbox{\ekvd@type@box\global}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[internal]{\ekvd@type@toks,\ekvd@t@toks,\ekvd@t@gtoks}
% Similar to |box|, but set the |toks|.
% \begin{macrocode}
-\protected\def\ekvd@type@toks#1#2#3#4%
+\protected\def\ekvd@type@toks#1#2#3%
{%
- \ekvd@assert@filledarg{#1toks #3}{#4}%
+ \ekvd@ifnew{}{#2}%
{%
- \ekvd@newreg#4{toks}%
- \protected\ekvd@long\ekvdef\ekvd@set{#3}{#2#4{##1}}%
+ \ekvd@assert@filledarg{#3}%
+ {%
+ \ekvd@newreg#3{toks}%
+ \ekvd@ifalso
+ {%
+ \let\ekvd@prot\protected
+ \ekvd@add@val{#2}{#1#3{##1}}{}%
+ }%
+ {\protected\ekvd@long\ekvdef\ekvd@set{#2}{#1#3{##1}}}%
+ }%
}%
}
-\protected\def\ekvd@t@toks{\ekvd@type@toks{}{}}
-\protected\def\ekvd@t@gtoks{\ekvd@type@toks{g}\global}
+\protected\def\ekvd@t@toks{\ekvd@type@toks{}}
+\protected\def\ekvd@t@gtoks{\ekvd@type@toks\global}
% \end{macrocode}
% \end{macro}
%
@@ -899,16 +1254,27 @@ and the derived files expkv-def.pdf
% Just like |toks|, but expand the current contents of the |toks| register to
% append the new contents.
% \begin{macrocode}
-\protected\def\ekvd@type@apptoks#1#2#3#4%
+\protected\def\ekvd@type@apptoks#1#2#3%
{%
- \ekvd@assert@filledarg{#1apptoks #3}{#4}%
+ \ekvd@ifnew{}{#2}%
{%
- \ekvd@newreg#4{toks}%
- \protected\ekvd@long\ekvdef\ekvd@set{#3}{#2#4\expandafter{\the#4##1}}%
+ \ekvd@assert@filledarg{#3}%
+ {%
+ \ekvd@newreg#3{toks}%
+ \ekvd@ifalso
+ {%
+ \let\ekvd@prot\protected
+ \ekvd@add@val{#2}{#1#3\expandafter{\the#3##1}}{}%
+ }%
+ {%
+ \protected\ekvd@long\ekvdef\ekvd@set{#2}%
+ {#1#3\expandafter{\the#3##1}}%
+ }%
+ }%
}%
}
-\protected\def\ekvd@t@apptoks{\ekvd@type@apptoks{}{}}
-\protected\def\ekvd@t@gapptoks{\ekvd@type@apptoks{g}\global}
+\protected\def\ekvd@t@apptoks{\ekvd@type@apptoks{}}
+\protected\def\ekvd@t@gapptoks{\ekvd@type@apptoks\global}
% \end{macrocode}
% \end{macro}
%
@@ -921,26 +1287,34 @@ and the derived files expkv-def.pdf
% The |\ekvd@type@reg| can handle all the types for which the assignment will
% just be \texttt{\meta{register}=\meta{value}}.
% \begin{macrocode}
-\protected\def\ekvd@type@reg#1#2#3#4#5#6#7%
+\protected\def\ekvd@type@reg#1#2#3#4#5#6%
{%
- \ekvd@assert@filledarg{#1 #6}{#7}%
+ \ekvd@ifnew{}{#5}%
{%
- \ekvd@newreg#7{#2}%
- \protected\ekvd@long\ekvdef\ekvd@set{#6}{#3#7=#4##1#5\relax}%
+ \ekvd@assert@filledarg{#6}%
+ {%
+ \ekvd@newreg#6{#1}%
+ \ekvd@ifalso
+ {%
+ \let\evkd@prot\protected
+ \ekvd@add@val{#5}{#2#6=#3##1#4\relax}{}%
+ }%
+ {\protected\ekvd@long\ekvdef\ekvd@set{#5}{#2#6=#3##1#4\relax}}%
+ }%
}%
}
-\protected\def\ekvd@t@int{\ekvd@type@reg{int}{count}{}{}{}}
-\protected\def\ekvd@t@eint{\ekvd@type@reg{eint}{count}{}\numexpr\relax}
-\protected\def\ekvd@t@gint{\ekvd@type@reg{gint}{count}\global{}{}}
-\protected\def\ekvd@t@xint{\ekvd@type@reg{xint}{count}\global\numexpr\relax}
-\protected\def\ekvd@t@dimen{\ekvd@type@reg{dimen}{dimen}{}{}{}}
-\protected\def\ekvd@t@edimen{\ekvd@type@reg{edimen}{dimen}{}\dimexpr\relax}
-\protected\def\ekvd@t@gdimen{\ekvd@type@reg{gdimen}{dimen}\global{}{}}
-\protected\def\ekvd@t@xdimen{\ekvd@type@reg{xdimen}{dimen}\global\dimexpr\relax}
-\protected\def\ekvd@t@skip{\ekvd@type@reg{skip}{skip}{}{}{}}
-\protected\def\ekvd@t@eskip{\ekvd@type@reg{eskip}{skip}{}\glueexpr\relax}
-\protected\def\ekvd@t@gskip{\ekvd@type@reg{gskip}{skip}\global{}{}}
-\protected\def\ekvd@t@xskip{\ekvd@type@reg{xskip}{skip}\global\glueexpr\relax}
+\protected\def\ekvd@t@int{\ekvd@type@reg{count}{}{}{}}
+\protected\def\ekvd@t@eint{\ekvd@type@reg{count}{}\numexpr\relax}
+\protected\def\ekvd@t@gint{\ekvd@type@reg{count}\global{}{}}
+\protected\def\ekvd@t@xint{\ekvd@type@reg{count}\global\numexpr\relax}
+\protected\def\ekvd@t@dimen{\ekvd@type@reg{dimen}{}{}{}}
+\protected\def\ekvd@t@edimen{\ekvd@type@reg{dimen}{}\dimexpr\relax}
+\protected\def\ekvd@t@gdimen{\ekvd@type@reg{dimen}\global{}{}}
+\protected\def\ekvd@t@xdimen{\ekvd@type@reg{dimen}\global\dimexpr\relax}
+\protected\def\ekvd@t@skip{\ekvd@type@reg{skip}{}{}{}}
+\protected\def\ekvd@t@eskip{\ekvd@type@reg{skip}{}\glueexpr\relax}
+\protected\def\ekvd@t@gskip{\ekvd@type@reg{skip}\global{}{}}
+\protected\def\ekvd@t@xskip{\ekvd@type@reg{skip}\global\glueexpr\relax}
% \end{macrocode}
% \end{macro}
%
@@ -950,56 +1324,66 @@ and the derived files expkv-def.pdf
% \begin{macrocode}
\protected\def\ekvd@type@store#1#2#3#4%
{%
- \ekvd@assert@filledarg{#1store #3}{#4}%
+ \ekvd@ifnew{}{#3}%
{%
- \unless\ifdefined#4\let#4\ekvd@empty\fi
- \protected\ekvd@long\ekvdef\ekvd@set{#3}{#2#4{\unexpanded{##1}}}%
- }%
- }
-\protected\def\ekvd@t@store{\ekvd@type@store{}\edef}
-\protected\def\ekvd@t@gstore{\ekvd@type@store{g}\xdef}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekvd@type@estore,\ekvd@t@estore,\ekvd@t@xstore}
-% And the straight forward |estore| types.
-% \begin{macrocode}
-\protected\def\ekvd@type@estore#1#2#3#4%
- {%
- \ekvd@assert@filledarg{#1store #3}{#4}%
- {%
- \ekvd@newlet#4\ekvd@empty
- \protected\ekvd@long\ekvdef\ekvd@set{#3}{#2#4{##1}}%
+ \ekvd@assert@filledarg{#4}%
+ {%
+ \ekvd@newlet#4\ekvd@empty
+ \ekvd@ifalso
+ {%
+ \let\ekvd@prot\protected
+ \ekvd@add@val{#3}{#1#4{#2}}{}%
+ }%
+ {\protected\ekvd@long\ekvdef\ekvd@set{#3}{#1#4{#2}}}%
+ }%
}%
}
-\protected\def\ekvd@t@estore{\ekvd@type@estore{e}\edef}
-\protected\def\ekvd@t@xstore{\ekvd@type@estore{x}\xdef}
+\protected\def\ekvd@t@store{\ekvd@type@store\edef{\unexpanded{##1}}}
+\protected\def\ekvd@t@gstore{\ekvd@type@store\xdef{\unexpanded{##1}}}
+\protected\def\ekvd@t@estore{\ekvd@type@store\edef{##1}}
+\protected\def\ekvd@t@xstore{\ekvd@type@store\xdef{##1}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[internal]
-% {\ekvd@type@meta,\ekvd@type@meta@,\ekvd@t@meta,\ekvd@t@nmeta}
+% {
+% \ekvd@type@meta,\ekvd@type@meta@a,\ekvd@type@meta@b,\ekvd@type@meta@c,
+% \ekvd@t@meta,\ekvd@t@nmeta
+% }
% |meta| sets up things such that another instance of |\ekvset| will be run on
% the argument, with the same \set.
% \begin{macrocode}
-\protected\long\def\ekvd@type@meta#1#2#3#4#5%
+\protected\long\def\ekvd@type@meta#1#2#3#4#5#6#7%
{%
- \ekvd@assert@filledarg{#1meta #4}{#5}%
+ \ekvd@ifnew{#1}{#6}%
{%
- \edef\ekvd@tmp{\ekvd@set}%
- \expandafter\ekvd@type@meta@\expandafter{\ekvd@tmp}{#3}{#5}%
- #2\ekvd@set{#4}\ekvd@tmp
+ \ekvd@assert@filledarg{#7}%
+ {%
+ \edef\ekvd@tmp{\ekvd@set}%
+ \expandafter\ekvd@type@meta@a\expandafter{\ekvd@tmp}{#7}{#2}%
+ \ekvd@ifalso
+ {\ekv@exparg{#3{#6}}{\ekvd@tmp#4}{#5}}%
+ {\csname ekvlet#1\endcsname\ekvd@set{#6}\ekvd@tmp}%
+ }%
}%
}
-\protected\long\def\ekvd@type@meta@#1#2#3%
+\protected\long\def\ekvd@type@meta@a#1#2%
+ {%
+ \expandafter\ekvd@type@meta@b\expandafter{\ekvset{#1}{#2}}%
+ }
+\protected\def\ekvd@type@meta@b
{%
- \ekvd@prot\ekvd@long\def\ekvd@tmp#2{\ekvset{#1}{#3}}%
+ \expandafter\ekvd@type@meta@c\expandafter
}
-\protected\def\ekvd@t@meta{\ekvd@type@meta{}\ekvlet{##1}}
-\protected\long\def\ekvd@t@nmeta#1#2%
+\protected\long\def\ekvd@type@meta@c#1#2%
{%
- \ekvd@assert@not@long{nmeta #1}%
- \ekvd@type@meta n\ekvletNoVal{}{#1}{#2}%
+ \ekvd@prot\ekvd@long\def\ekvd@tmp#2{#1}%
+ }
+\protected\def\ekvd@t@meta{\ekvd@type@meta{}{##1}\ekvd@add@val{{##1}}{}}
+\protected\def\ekvd@t@nmeta
+ {%
+ \ekvd@assert@not@long
+ \ekvd@type@meta{NoVal}{}\ekvd@add@noval{}\ekvd@assert@not@long@also
}
% \end{macrocode}
% \end{macro}
@@ -1010,23 +1394,24 @@ and the derived files expkv-def.pdf
% such that the first is the \set\ for which the sub-|\ekvset| and the second is
% the \kv\ list.
% \begin{macrocode}
-\protected\long\def\ekvd@type@smeta#1#2#3#4#5%
+\protected\long\def\ekvd@type@smeta#1#2#3#4#5#6#7%
{%
- \ekvd@assert@twoargs{s#1meta #4}{#5}%
+ \ekvd@ifnew{#1}{#6}%
{%
- \expandafter\ekvd@type@smeta@\expandafter{\@secondoftwo#5}{#5}{#3}
- #2\ekvd@set{#4}\ekvd@tmp
+ \ekvd@assert@twoargs{#7}%
+ {%
+ \ekvd@type@meta@a#7{#2}%
+ \ekvd@ifalso
+ {\ekv@exparg{#3{#6}}{\ekvd@tmp#4}{#5}}%
+ {\csname ekvlet#1\endcsname\ekvd@set{#6}\ekvd@tmp}%
+ }%
}%
}
-\protected\long\def\ekvd@type@smeta@#1#2#3%
+\protected\def\ekvd@t@smeta{\ekvd@type@smeta{}{##1}\ekvd@add@val{{##1}}{}}
+\protected\def\ekvd@t@snmeta
{%
- \expandafter\ekvd@type@meta@\expandafter{\@firstoftwo#2}{#3}{#1}%
- }
-\protected\def\ekvd@t@smeta{\ekvd@type@smeta{}\ekvlet{##1}}
-\protected\long\def\ekvd@t@snmeta#1#2%
- {%
- \ekvd@assert@not@long{snmeta #1}%
- \ekvd@type@smeta n\ekvletNoVal{}{#1}{#2}%
+ \ekvd@assert@not@long
+ \ekvd@type@smeta{NoVal}{}\ekvd@add@noval{}\ekvd@assert@not@long@also
}
% \end{macrocode}
% \end{macro}
@@ -1044,14 +1429,28 @@ and the derived files expkv-def.pdf
% allowed to be long). |\ekvd@type@choice| will just define the choice-key, the
% handling of the choices definition will be done by |\ekvd@populate@choice|.
% \begin{macrocode}
-\protected\def\ekvd@type@choice#1#2%
+\protected\def\ekvd@type@choice#1%
{%
- \ekvd@assert@not@long{#1 #2}%
+ \ekvd@assert@not@long
\ekvd@prot\edef\ekvd@tmp##1%
+ {\unexpanded{\ekvd@h@choice}{\ekvd@choice@name\ekvd@set{#1}{##1}}}%
+ \ekvd@ifalso
{%
- \unexpanded{\ekvd@h@choice}{\ekvd@choice@name\ekvd@set{#2}{##1}}%
+ \ekvd@assert@val{#1}%
+ {%
+ \ekvd@if@not@already@choice{#1}%
+ {%
+ \ekv@exparg
+ {%
+ \expandafter\ekvd@add@aux
+ \csname\ekv@name\ekvd@set{#1}\endcsname{{##1}}{#1}%
+ }%
+ {\ekvd@tmp{##1}}%
+ {\ekvd@long\ekvdef}\ekvd@assert@not@long@also
+ }%
+ }%
}%
- \ekvlet\ekvd@set{#2}\ekvd@tmp
+ {\ekvlet\ekvd@set{#1}\ekvd@tmp}%
}
% \end{macrocode}
% |\ekvd@populate@choice| just uses |\ekvparse| and then gives control to
@@ -1064,7 +1463,7 @@ and the derived files expkv-def.pdf
}
\protected\long\def\ekvd@populate@choice@noarg#1%
{%
- \expandafter\ekvd@err@missing@definition\expandafter{\ekvd@set@choice : #1}%
+ \expandafter\ekvd@err@missing@definition@msg\expandafter{\ekvd@cur : #1}%
}
% \end{macrocode}
% |\ekvd@populate@choice@| runs the prefix-test, if there is none we can
@@ -1076,7 +1475,7 @@ and the derived files expkv-def.pdf
\protected\long\def\ekvd@populate@choice@#1#2%
{%
\ekvd@clear@prefixes
- \expandafter\ekvd@assert@arg\expandafter{\ekvd@set@choice : #1}{#2}%
+ \expandafter\ekvd@assert@arg@msg\expandafter{\ekvd@cur : #1}%
{%
\ekvd@ifspace{#1}%
{\ekvd@choice@prefix\ekv@mark#1\ekv@stop}%
@@ -1109,27 +1508,55 @@ and the derived files expkv-def.pdf
}
\protected\def\ekvd@choice@p@protected{\let\ekvd@prot\protected}
\let\ekvd@choice@p@protect\ekvd@choice@p@protected
-\protected\def\ekvd@choice@p@long\ekvd@ifspace#1%
+\protected\def\ekvd@choice@invalid@p#1\ekvd@ifspace#2%
{%
- \expandafter\ekvd@choice@p@long@\expandafter{\ekv@gobble@mark#1}%
- \ekvd@ifspace{#1}%
+ \expandafter\ekvd@choice@invalid@p@\expandafter{\ekv@gobble@mark#2}{#1}%
+ \ekvd@ifspace{#2}%
}
-\protected\def\ekvd@choice@p@long@#1%
+\protected\def\ekvd@choice@invalid@p@#1#2%
{%
- \expandafter\ekvd@err@no@long\expandafter
- {\ekvd@set@choice : long #1}%
+ \expandafter\ekvd@err@no@prefix@msg\expandafter{\ekvd@cur : #2 #1}{#2}%
}
+\protected\def\ekvd@choice@p@long{\ekvd@choice@invalid@p{long}}%
+\protected\def\ekvd@choice@p@also{\ekvd@choice@invalid@p{also}}%
+\protected\def\ekvd@choice@p@new{\ekvd@choice@invalid@p{new}}%
% \end{macrocode}
% Finally we're able to set up the |@t@choice| macro, which has to store the
% current choice-key's name, define the key, and parse the available choices.
% \begin{macrocode}
\protected\long\def\ekvd@t@choice#1#2%
{%
- \ekvd@assert@arg{choice #1}{#2}%
+ \ekvd@ifnew{}{#1}%
+ {%
+ \ekvd@assert@arg
+ {%
+ \ekvd@type@choice{#1}%
+ \def\ekvd@set@choice{#1}%
+ \ekvd@populate@choice{#2}%
+ }%
+ }%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvd@t@unknown-choice}
+% \begin{macrocode}
+\protected\long\expandafter\def\csname ekvd@t@unknown-choice\endcsname#1#2%
+ {%
+ \ifx\ekvd@ifnew\ekvd@assert@new
+ \ekv@fi@firstoftwo
+ \fi
+ \@secondoftwo
+ {\ekv@ifdefined{\ekvd@unknown@choice@name\ekvd@set{#1}}\ekvd@err@not@new}%
+ \@firstofone
{%
- \ekvd@type@choice{choice}{#1}%
- \def\ekvd@set@choice{#1}%
- \ekvd@populate@choice{#2}%
+ \ekvd@assert@arg
+ {%
+ \ekvd@assert@not@long
+ \ekvd@assert@not@also
+ \ekvd@prot\expandafter
+ \def\csname\ekvd@unknown@choice@name\ekvd@set{#1}\endcsname##1{#2}%
+ }%
}%
}
% \end{macrocode}
@@ -1162,36 +1589,106 @@ and the derived files expkv-def.pdf
% \end{macrocode}
% \end{macro}
%
-% \subsubsection{Tests}
%
-% \begin{macro}[internal]{\ekvd@noarg@mark}
-% This macro serves as a flag for the case that no \val\ was specified for a
-% key. As such it is not a test, but exists only for some tests.
+% \subsubsection{Handling \texttt{also}}
+%
+% \begin{macro}[internal]
+% {\ekvd@add@val,\ekvd@add@noval,\ekvd@add@aux,\ekvd@add@aux@}
% \begin{macrocode}
-\def\ekvd@noarg@mark{\ekvd@noarg@mark}
+\protected\long\def\ekvd@add@val#1#2#3%
+ {%
+ \ekvd@assert@val{#1}%
+ {%
+ \expandafter\ekvd@add@aux\csname\ekv@name\ekvd@set{#1}\endcsname{{##1}}%
+ {#1}{#2}{\ekvd@long\ekvdef}{#3}%
+ }%
+ }
+\protected\long\def\ekvd@add@noval#1#2#3%
+ {%
+ \ekvd@assert@noval{#1}%
+ {%
+ \expandafter\ekvd@add@aux\csname\ekv@name\ekvd@set{#1}N\endcsname{}%
+ {#1}{#2}\ekvdefNoVal{#3}%
+ }%
+ }
+\protected\long\def\ekvd@add@aux#1#2%
+ {%
+ \ekvd@extract@prefixes#1%
+ \expandafter\ekvd@add@aux@\expandafter{#1#2}%
+ }
+\protected\long\def\ekvd@add@aux@#1#2#3#4#5%
+ {%
+ #5%
+ \ekvd@prot#4\ekvd@set{#2}{#1#3}%
+ }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\ekvd@fi@firstoftwo}
-% While we can reuse many of the internals of \expkv\ the specific case for this
-% branch wasn't needed by \expkv\ and hence isn't defined. We'll need it, so we
-% define it.
+% \begin{macro}[internal]
+% {
+% \ekvd@extract@prefixes,\ekvd@extract@prefixes@,
+% \ekvd@extract@prefixes@long,\ekvd@extract@prefixes@prot
+% }
+% This macro checks which prefixes were used for the definition of a macro and
+% sets |\ekvd@long| and |\ekvd@prot| accordingly.
+% \begin{macrocode}
+\protected\def\ekvd@extract@prefixes#1%
+ {%
+ \expandafter\ekvd@extract@prefixes@\meaning#1\ekvd@stop
+ }
+% \end{macrocode}
+% In the following definition |#1| will get replaced by |macro:|, |#2| by
+% |\long| and |#3| by |\protected| (in each, all tokens will have category
+% other). This allows us to parse the |\meaning| of a macro for those strings.
+% \begin{macrocode}
+\protected\def\ekvd@extract@prefixes@#1#2#3%
+ {%
+ \protected\def\ekvd@extract@prefixes@##1#1##2\ekvd@stop
+ {%
+ \ekvd@extract@prefixes@long
+ ##1\ekvd@mark\@firstofone#2\ekvd@mark\@gobble\ekvd@stop
+ {\let\ekvd@long\long}%
+ \ekvd@extract@prefixes@prot
+ ##1\ekvd@mark\@firstofone#3\ekvd@mark\@gobble\ekvd@stop
+ {\let\ekvd@prot\protected}%
+ }%
+ \protected\def\ekvd@extract@prefixes@long##1#2##2\ekvd@mark##3##4\ekvd@stop
+ {##3}%
+ \protected\def\ekvd@extract@prefixes@prot##1#3##2\ekvd@mark##3##4\ekvd@stop
+ {##3}%
+ }
+% \end{macrocode}
+% We use a temporary macro to expand the three arguments of
+% |\ekvd@extract@prefixes@|, which will set up the real meaning of itself and
+% the parsing for |\long| and |\protected|.
% \begin{macrocode}
-\long\def\ekvd@fi@firstoftwo\fi\@secondoftwo#1#2{\fi#1}
+\begingroup
+\edef\ekvd@tmp
+ {%
+ \endgroup
+ \ekvd@extract@prefixes@
+ {\detokenize{macro:}}%
+ {\string\long}%
+ {\string\protected}%
+ }
+\ekvd@tmp
% \end{macrocode}
% \end{macro}
%
+%
+% \subsubsection{Tests}
+%
% \begin{macro}[internal]{\ekvd@newlet,\ekvd@newreg}
% These macros test whether a control sequence is defined, if it isn't they
% define it, either via |\let| or via the correct \cs[no-index]{new\meta{reg}}.
% \begin{macrocode}
\protected\def\ekvd@newlet#1#2%
{%
- \unless\ifdefined#1\let#1#2\fi
+ \ifdefined#1\ekv@fi@gobble\fi\@firstofone{\let#1#2}%
}
\protected\def\ekvd@newreg#1#2%
{%
- \unless\ifdefined#1\csname new#2\endcsname#1\fi
+ \ifdefined#1\ekv@fi@gobble\fi\@firstofone{\csname new#2\endcsname#1}%
}
% \end{macrocode}
% \end{macro}
@@ -1203,10 +1700,9 @@ and the derived files expkv-def.pdf
% only macros will be gobbled that are needed for the true branch, which doesn't
% hurt, and if there are more this will not be empty.
% \begin{macrocode}
-\long\def\ekvd@assert@twoargs#1#2%
+\long\def\ekvd@assert@twoargs#1%
{%
- \ekvd@ifnottwoargs{#2}%
- {\ekvd@err@missing@definition{#1}}%
+ \ekvd@ifnottwoargs{#1}{\ekvd@err@missing@definition}%
}
\long\def\ekvd@ifnottwoargs#1%
{%
@@ -1217,52 +1713,137 @@ and the derived files expkv-def.pdf
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\ekvd@assert@arg,\ekvd@ifnoarg}
-% The test for an argument is just an |\ifx| comparison with our |noarg@mark|.
+% \begin{macro}[internal]
+% {
+% \ekvd@assert@val,\ekvd@assert@val@,\ekvd@assert@noval,\ekvd@assert@noval@,
+% \ekvd@extract@args,\ekvd@extracted@args,\ekvd@one@arg@string
+% }
+% Assert that a given key is defined as a value taking key or a |NoVal| key with
+% the correct argument structure, respectively.
% \begin{macrocode}
-\long\def\ekvd@assert@arg#1#2%
+\protected\def\ekvd@assert@val#1%
{%
- \ekvd@ifnoarg{#2}%
- {\ekvd@err@missing@definition{#1}}%
+ \ekvifdefined\ekvd@set{#1}%
+ {\expandafter\ekvd@assert@val@\csname\ekv@name\ekvd@set{#1}\endcsname}%
+ {%
+ \ekvifdefinedNoVal\ekvd@set{#1}%
+ \ekvd@err@add@val@on@noval
+ {\ekvd@err@undefined@key{#1}}%
+ \@gobble
+ }%
}
-\long\def\ekvd@ifnoarg#1%
+\protected\def\ekvd@assert@val@#1%
{%
- \ifx\ekvd@noarg@mark#1%
- \ekvd@fi@firstoftwo
+ \expandafter\ekvd@extract@args\meaning#1\ekvd@stop
+ \unless\ifx\ekvd@extracted@args\ekvd@one@arg@string
+ \ekvd@err@unsupported@arg
\fi
- \@secondoftwo
+ \@firstofone
+ }%
+\protected\def\ekvd@assert@noval#1%
+ {%
+ \ekvifdefinedNoVal\ekvd@set{#1}%
+ {\expandafter\ekvd@assert@noval@\csname\ekv@name\ekvd@set{#1}N\endcsname}%
+ {%
+ \ekvifdefined\ekvd@set{#1}%
+ \ekvd@err@add@noval@on@val
+ {\ekvd@err@undefined@key{#1}}%
+ \@gobble
+ }%
+ }
+\protected\def\ekvd@assert@noval@#1%
+ {%
+ \expandafter\ekvd@extract@args\meaning#1\ekvd@stop
+ \unless\ifx\ekvd@extracted@args\ekvd@empty
+ \ekvd@err@unsupported@arg
+ \fi
+ \@firstofone
+ }
+\protected\def\ekvd@extract@args#1%
+ {%
+ \protected\def\ekvd@extract@args##1#1##2->##3\ekvd@stop
+ {\def\ekvd@extracted@args{##2}}%
+ }
+\expandafter\ekvd@extract@args\expandafter{\detokenize{macro:}}
+\edef\ekvd@one@arg@string{\string#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekvd@assert@arg,\ekvd@assert@arg@msg,\ekvd@ifnoarg}
+% There is no need to actually define |\ekvd@ifnoarg| here, as it will be set by
+% either |\ekvd@arg| or |\ekvd@noarg|.
+% \begin{macrocode}
+\def\ekvd@assert@arg{\ekvd@ifnoarg\ekvd@err@missing@definition}
+\long\def\ekvd@assert@arg@msg#1%
+ {%
+ \ekvd@ifnoarg{\ekvd@err@missing@definition@msg{#1}}%
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[internal]{\ekvd@assert@filledarg,\ekvd@ifnoarg@or@empty}
% \begin{macrocode}
-\long\def\ekvd@assert@filledarg#1#2%
+\long\def\ekvd@assert@filledarg#1%
{%
- \ekvd@ifnoarg@or@empty{#2}%
- {\ekvd@err@missing@definition{#1}}%
+ \ekvd@ifnoarg@or@empty{#1}\ekvd@err@missing@definition
}
\long\def\ekvd@ifnoarg@or@empty#1%
{%
- \ekvd@ifnoarg{#1}%
+ \ekvd@ifnoarg
\@firstoftwo
{\ekv@ifempty{#1}}%
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\ekvd@assert@not@long,\ekvd@assert@not@protected}
-% Some key-types don't want to be |\long| or |\protected|, so we provide macros
-% to test this and throw an error, this could be silently ignored but now users
-% will learn to not use unnecessary stuff which slows the compilation down.
+% \begin{macro}[internal]
+% {
+% \ekvd@assert@not@long,\ekvd@assert@not@protected,\ekvd@assert@not@also
+% \ekvd@assert@not@long@also,\ekvd@assert@not@protected@also,
+% \ekvd@assert@new,\ekvd@assert@not@new
+% }
+% Some key-types don't want to be |also|, |\long| or |\protected|, so we provide
+% macros to test this and throw an error, this could be silently ignored but now
+% users will learn to not use unnecessary stuff which slows the compilation
+% down.
+% \begin{macrocode}
+\def\ekvd@assert@not@long{\ifx\ekvd@long\long\ekvd@err@no@prefix{long}\fi}
+\def\ekvd@assert@not@protected
+ {\ifx\ekvd@prot\protected\ekvd@err@no@prefix{protected}\fi}
+\def\ekvd@assert@not@also{\ekvd@ifalso{\ekvd@err@no@prefix{also}}{}}
+\def\ekvd@assert@not@long@also
+ {\ifx\ekvd@long\long\ekvd@err@no@prefix@also{long}\fi}
+\def\ekvd@assert@not@protected@also
+ {\ifx\ekvd@prot\protected\ekvd@err@no@prefix@also{protected}\fi}
+\def\ekvd@assert@new#1#2%
+ {\csname ekvifdefined#1\endcsname\ekvd@set{#2}{\ekvd@err@not@new}}
+\def\ekvd@assert@not@new
+ {\ifx\ekvd@ifnew\ekvd@assert@new\ekvd@err@no@prefix{new}\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]
+% {
+% \ekvd@if@not@already@choice, \ekvd@if@not@already@choice@a,
+% \ekvd@if@not@already@choice@b
+% }
+% It is bad to use |also| on a key that already contains a |choice|, as both
+% choices would share the same valid values and thus lead to each callback being
+% used twice. The following is a rudimentary test against this.
% \begin{macrocode}
-\long\def\ekvd@assert@not@long#1%
+\protected\def\ekvd@if@not@already@choice#1%
+ {%
+ \expandafter\ekvd@if@not@already@choice@a
+ \csname\ekv@name\ekvd@set{#1}\endcsname
+ {}\ekvd@h@choice\ekvd@stop
+ }
+\protected\def\ekvd@if@not@already@choice@a
{%
- \ifx\ekvd@long\long\ekvd@err@no@long{#1}\fi
+ \expandafter\ekvd@if@not@already@choice@b
}
-\long\def\ekvd@assert@not@protected#1%
+\long\protected\def\ekvd@if@not@already@choice@b#1\ekvd@h@choice#2\ekvd@stop
{%
- \ifx\ekvd@prot\protected\ekvd@err@no@protected{#1}\fi
+ \ekv@ifempty{#2}\@firstofone\@gobble
}
% \end{macrocode}
% \end{macro}
@@ -1290,37 +1871,59 @@ and the derived files expkv-def.pdf
%
% \begin{macro}[internal]
% {
-% \ekvd@err@missing@definition,\ekvd@err@missing@prefix,
-% \ekvd@err@undefined@prefix,\ekvd@err@undefined@key,\ekvd@err@no@protected,
-% \ekvd@err@no@long
+% \ekvd@errm,\ekvd@err@missing@definition,\ekvd@err@missing@definition@msg,
+% \ekvd@err@missing@type,\ekvd@err@undefined@prefix,\ekvd@err@undefined@key,
+% \ekvd@err@no@prefix,\ekvd@err@no@prefix@msg,\ekvd@err@no@prefix@also,
+% \ekvd@err@add@val@on@noval,\ekvd@err@add@noval@on@val,
+% \ekvd@err@unsupported@arg,\ekvd@err@not@new
% }
% The non-expandable error messages are boring, so here they are:
% \begin{macrocode}
-\protected\def\ekvd@err@missing@definition#1%
- {\errmessage{expkv-def Error: Missing definition for key `\unexpanded{#1}'}}
-\protected\def\ekvd@err@missing@prefix#1%
- {\errmessage{expkv-def Error: Missing prefix for key `\unexpanded{#1}'}}
+\protected\def\ekvd@errm#1{\errmessage{expkv-def Error: #1}}
+\protected\def\ekvd@err@missing@definition
+ {\ekvd@errm{Missing definition for key `\ekvd@cur'}}
+\protected\def\ekvd@err@missing@definition@msg#1%
+ {\ekvd@errm{Missing definition for key `\unexpanded{#1}'}}
+\protected\def\ekvd@err@missing@type
+ {\ekvd@errm{Missing type prefix for key `\ekvd@cur'}}
\protected\def\ekvd@err@undefined@prefix#1%
- {\errmessage{expkv-def Error: Undefined prefix `\unexpanded{#1}'}}
+ {%
+ \ekvd@errm
+ {Undefined prefix `\unexpanded{#1}' found while processing `\ekvd@cur'}%
+ }
\protected\def\ekvd@err@undefined@key#1%
- {\errmessage{expkv-def Error: Undefined key `\unexpanded{#1}'}}
-\protected\def\ekvd@err@no@protected#1%
{%
- \errmessage
- {expkv-def Error: prefix `protected' not accepted for `\unexpanded{#1}'}%
+ \ekvd@errm
+ {Undefined key `\unexpanded{#1}' found while processing `\ekvd@cur'}%
}
-\protected\def\ekvd@err@no@long#1%
+\protected\def\ekvd@err@no@prefix#1%
+ {\ekvd@errm{prefix `#1' not accepted in `\ekvd@cur'}}
+\protected\def\ekvd@err@no@prefix@msg#1#2%
+ {\ekvd@errm{prefix `#2' not accepted in `\unexpanded{#1}'}}
+\protected\def\ekvd@err@no@prefix@also#1%
+ {\ekvd@errm{`\ekvd@cur' not allowed with a `#1' key}}
+\protected\def\ekvd@err@add@val@on@noval
+ {\ekvd@errm{`\ekvd@cur' not allowed with a NoVal key}}
+\protected\def\ekvd@err@add@noval@on@val
+ {\ekvd@errm{`\ekvd@cur' not allowed with a value taking key}}
+\protected\def\ekvd@err@unsupported@arg\fi\@firstofone#1%
{%
- \errmessage
- {expkv-def Error: prefix `long' not accepted for `\unexpanded{#1}'}%
+ \fi
+ \ekvd@errm
+ {%
+ Existing key-macro has the unsupported argument string
+ `\ekvd@extracted@args' for key `\ekvd@cur'%
+ }%
}
+\protected\def\ekvd@err@not@new
+ {\ekvd@errm{The key for `\ekvd@cur' is already defined}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[internal]
% {
% \ekvd@err@choice@invalid,\ekvd@err@choice@invalid@,\ekvd@choice@name,
-% \ekvd@err
+% \ekvd@unknown@choice@name,\ekvd@err
% }
% The expandable error messages use |\ekvd@err|, which is just like |\ekv@err|
% from \expkv\ or the way \pkg{expl3} throws expandable error messages. It uses
@@ -1342,9 +1945,15 @@ and the derived files expkv-def.pdf
{%
ekvd#1(#2)#3%
}
+\def\ekvd@unknown@choice@name#1#2%
+ {%
+ ekvd:u:#1(#2)%
+ }
\def\ekvd@err@choice@invalid@ ekvd#1(#2)#3\ekv@stop%
{%
- \ekvd@err{invalid choice `#3' (`#2', set `#1')}%
+ \ekv@ifdefined{\ekvd@unknown@choice@name{#1}{#2}}%
+ {\csname\ekvd@unknown@choice@name{#1}{#2}\endcsname{#3}}%
+ {\ekvd@err{invalid choice `#3' (`#2', set `#1')}}%
}
}
\begingroup
@@ -1354,7 +1963,7 @@ and the derived files expkv-def.pdf
\unexpanded{\long\def\ekvd@err}##1%
{%
\unexpanded{\expandafter\ekv@err@\@firstofone}%
- {\expandafter\noexpand\csname ! expkv-def Error:\endcsname ##1.}%
+ {\unexpanded\expandafter{\csname ! expkv-def Error:\endcsname}##1.}%
\unexpanded{\ekv@stop}%
}%
}
diff --git a/Master/texmf-dist/source/latex/expkv/expkv.dtx b/Master/texmf-dist/source/latex/expkv/expkv.dtx
index 0f0491164e6..d3fc414f393 100644
--- a/Master/texmf-dist/source/latex/expkv/expkv.dtx
+++ b/Master/texmf-dist/source/latex/expkv/expkv.dtx
@@ -70,10 +70,12 @@ and the derived files expkv.pdf
\RequirePackage{array}
\RequirePackage{collcell}
\RequirePackage{siunitx}
+\DeclareSIUnit\ops{ops}
\RequirePackage{xcolor}
\RequirePackage{caption}
\RequirePackage{microtype}
\RequirePackage{accsupp}
+\RequirePackage{enumitem}
\lstset
{
,flexiblecolumns=false
@@ -101,6 +103,19 @@ and the derived files expkv.pdf
\definecolor{expkvred}{HTML}{9F393D}
\colorlet{expkvgrey}{black!75}
\makeatletter
+\newcommand*\expFormat
+ {^^A
+ {^^A
+ \rmfamily
+ \bfseries
+ {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
+ \lower.493ex\hbox{{\color{expkvgrey}P}}^^A
+ }^^A
+ }
+\newcommand*\kvstyle
+ {^^A
+ \normalfont\rmfamily\bfseries\color{expkvred}^^A
+ }
\newcommand*\expkv
{^^A
\texorpdfstring
@@ -122,27 +137,33 @@ and the derived files expkv.pdf
}
{expkv}^^A
}
-\newcommand*\expkvd
+\newcommand*\expkvpkg[1]
{^^A
\texorpdfstring
{^^A
\mbox
{^^A
- \BeginAccSupp{ActualText=expkv-def}^^A
- \rmfamily
- \bfseries
- {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
- \lower.493ex
- \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
- \kern-.18em{\color{expkvred}v}^^A
- {\color{expkvgrey}^^A
- \kern.05em\rule[-.1ex]{.08em}{1.2ex}\kern.05em\textsc{def}^^A
- }^^A
+ \BeginAccSupp{ActualText=expkv-#1}^^A
+ \href{https://github.com/Skillmon/tex_expkv-#1}
+ {^^A
+ \rmfamily
+ \bfseries
+ {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
+ \lower.493ex
+ \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
+ \kern-.18em{\color{expkvred}v}^^A
+ {\color{expkvgrey}^^A
+ \kern.05em\rule[-.1ex]{.08em}{1.2ex}\kern.05em\textsc{#1}^^A
+ }^^A
+ }^^A
\EndAccSupp{}^^A
}^^A
}
- {expkv-def}^^A
+ {expkv-#1}^^A
}
+\newcommand*\expkvd{\expkvpkg{def}}
+\newcommand*\expkvc{\expkvpkg{cs}}
+\newcommand*\expkvo{\expkvpkg{opt}}
\newcommand\kv{\meta{key}=\meta{value}}
\newcommand\key{\meta{key}}
\newcommand\val{\meta{value}}
@@ -150,8 +171,8 @@ and the derived files expkv.pdf
\hypersetup{linkcolor=red!80!black,urlcolor=purple!80!black}
\DoNotIndex{\def,\edef,\,,\=,\begingroup,\catcode,\chardef,\csname,\endcsname}
\DoNotIndex{\endgroup,\endinput,\errmessage,\expandafter,\input,\let,\long}
-\DoNotIndex{\noexpand,\protected,\ProvidesFile,\ProvidesPackage,\relax,\space}
-\DoNotIndex{\@,\unexpanded,\string,\expanded}
+\DoNotIndex{\protected,\ProvidesFile,\ProvidesPackage,\relax,\space}
+\DoNotIndex{\@,\unexpanded,\string,\expanded,\detokenize,\meaning,\lastnamedcs}
\DoNotIndex{\ifcsname}
\DoNotIndex{\ifx}
\DoNotIndex{\else}
@@ -175,7 +196,10 @@ and the derived files expkv.pdf
{^^A
\huge\expkv
\\[\medskipamount]
- \Large an expandable \kv\ implementation^^A
+ \Large an {\expFormat}andable
+ \meta{{\kvstyle k}\kern-.05em ey}=^^A
+ \meta{{\kvstyle v}\kern-.05em alue}
+ implementation^^A
}{expkv - an expandable <key>=<value> implementation}^^A
}
\date{\ekvDate\space v\ekvVersion}
@@ -191,10 +215,10 @@ and the derived files expkv.pdf
% \begin{abstract}
% \noindent\parfillskip=0pt
% \expkv\ provides a small interface for \kv\ parsing. The parsing macro is
-% fully expandable, the \meta{code} of your keys might be not. \expkv\ is pretty
-% fast, but not the fastest available \kv\ solution (\pkg{keyval} for instance
-% is thrice as fast, but not expandable and it might strip braces it shouldn't
-% have stripped).
+% \emph{fully expandable}, the \meta{code} of your keys might be not. \expkv\ is
+% \emph{swift}, close to the fastest \kv\ implementation. However it is the
+% fastest which copes with active commas and equal signs and doesn't strip
+% braces accidentally.
% \end{abstract}
%
% \tableofcontents
@@ -220,13 +244,24 @@ and the derived files expkv.pdf
% |\ProvidesPackage| and setting things up such that \file{expkv.tex} will use
% |\ProvidesFile|.
%
+% In the \expkv\ family are other packages contained which provide additional
+% functionality. Those packages currently are:
+% \begin{description}[format=\expkvpkg]
+% \item[def]
+% a key-defining frontend for \expkv\ using a \kv\ syntax
+% \item[cs]
+% define expandable \kv\ macros using \expkv
+% \item[opt]
+% parse package and class options with \expkv
+% \end{description}
+% Note that while the package names are stylised with a vertical rule, their
+% names are all lower case with a hyphen (\emph{e.g.}, \file{expkv-def}).
+%
% \subsection{Setting up Keys}\label{sec:define}
% \expkv\ provides a rather simple approach to setting up keys, similar to
-% \pkg{keyval}. However there is an auxiliary package named
-% \href{https://github.com/Skillmon/tex_expkv-def}{\expkvd} (the files use
-% \file{expkv-def} instead because \string| isn't allowed in package names by
-% CTAN) which provides a more sophisticated interface, similar to well
-% established packages like \pkg{pgfkeys} or \pkg{l3keys}.
+% \pkg{keyval}. However there is an auxiliary package named \expkvd\ which
+% provides a more sophisticated interface, similar to well established packages
+% like \pkg{pgfkeys} or \pkg{l3keys}.
%
% Keys in \expkv\ (as in almost all other \kv\ implementations) belong to a
% \emph{set} such that different sets can contain keys of the same name. Unlike
@@ -236,11 +271,12 @@ and the derived files expkv.pdf
% user level).
%
% The following macros are available to define new keys. Those macros containing
-% ``|def|'' in their name can be prefixed by anything allowed to prefix |\def|,
+% ``|def|'' in their name can be prefixed by anything allowed to prefix |\def|
+% (but \emph{don't} use |\outer|, keys defined with it won't ever be usable),
% prefixes allowed for |\let| can prefix those with ``|let|'' in their name,
-% accordingly. Neither \set\ nor \key\ are allowed to be empty for new keys and
-% must not contain a |\par| or tokens that expand to it -- they must be legal
-% inside of |\csname ...\endcsname|.
+% accordingly. Neither \set\ nor \key\ are allowed to be empty for new keys.
+% \set\ will be used as is inside of |\csname ...\endcsname| and \key\ will get
+% |\detokenize|d.
%
% \begin{function}{\ekvdef}
% \begin{syntax}
@@ -278,7 +314,8 @@ and the derived files expkv.pdf
% \cs{ekvletkv}\marg{set}\marg{key}\marg{set2}\marg{key2}
% \end{syntax}
% Let the \key\ in \set\ to \meta{key2} in \meta{set2}, it is not checked
-% whether that second key exists.
+% whether that second key exists (but take a look at
+% \cs[no-index]{ekvifdefined}).
% \end{function}
%
% \begin{function}{\ekvletkvNoVal}
@@ -286,7 +323,30 @@ and the derived files expkv.pdf
% \cs{ekvletkvNoVal}\marg{set}\marg{key}\marg{set2}\marg{key2}
% \end{syntax}
% Let the \key\ in \set\ to \meta{key2} in \meta{set2}, it is not checked
-% whether that second key exists.
+% whether that second key exists (but take a look at
+% \cs[no-index]{ekvifdefinedNoVal}).
+% \end{function}
+%
+% \begin{function}{\ekvdefunknown}
+% \begin{syntax}
+% \cs{ekvdefunknown}\marg{set}\marg{code}
+% \end{syntax}
+% By default an error will be thrown if an unknown \key\ is encountered. With
+% this macro you can define \meta{code} that will be executed for a given
+% \set\ when an unknown \key\ with a \val\ was encountered instead of throwing
+% an error. You can refer to the given \val\ with |#1| and to the unknown
+% \key's name with |#2| in \meta{code}.\footnotemark
+% \end{function}
+% \footnotetext{That order is correct, this way the code is faster.}
+%
+% \begin{function}{\ekvdefunknownNoVal}
+% \begin{syntax}
+% \cs{ekvdefunknownNoVal}\marg{set}\marg{code}
+% \end{syntax}
+% As already explained for \cs[no-index]{ekvdefunknown}, \expkv\ would throw
+% an error when encountering an unknown \key. With this you can instead let it
+% execute \meta{code} if an unknown |NoVal| \key\ was encountered. You can
+% refer to the given \key\ with |#1| in \meta{code}.
% \end{function}
%
% \subsection{Parsing Keys}
@@ -308,31 +368,95 @@ and the derived files expkv.pdf
% |\ekvset| should be nestable.
% \end{function}
%
+% \begin{function}{\ekvsetSneaked}
+% \begin{syntax}
+% \cs{ekvsetSneaked}\marg{set}\marg{sneak}\{\kv,\ldots\}
+% \end{syntax}
+% Just like \cs[no-index]{ekvset}, this macro parses the \kv\ pairs within the
+% given \set. But \cs[no-index]{ekvsetSneaked} will behave as if
+% \cs[no-index]{ekvsneak} has been called with \meta{sneak} as its argument as
+% the first action.
+% \end{function}
+%
+% \begin{function}{\ekvsetdef}
+% \begin{syntax}
+% \cs{ekvsetdef}\meta{cs}\marg{set}
+% \end{syntax}
+% With this function you can define a shorthand macro \meta{cs} to parse keys
+% of a specified \set. It is always defined |\long|, but if you need to you
+% can also prefix it with |\global|. The resulting macro is faster than but
+% else equivalent to the idiomatic definition:\par
+% \texttt
+% {\string\long\string\def\meta{cs}\#1\{\string\ekvset\marg{set}\{\#1\}\}}
+% \end{function}
+%
+% \begin{function}{\ekvsetSneakeddef}
+% \begin{syntax}
+% \cs{ekvsetSneakeddef}\meta{cs}\marg{set}
+% \end{syntax}
+% Just like \cs[no-index]{ekvsetdef} this defines a shorthand macro \meta{cs},
+% but this macro will make it a shorthand for \cs[no-index]{ekvsetSneaked},
+% meaning that \meta{cs} will take two arguments, the first being stuff that
+% should be given to \cs[no-index]{ekvsneak} and the second the \kv\ list. The
+% resulting macro is faster than but else equivalent to the idiomatic
+% definition:\par
+% \texttt
+% {%
+% \string\long\string\def\meta{cs}\#1\#2\{^^A
+% \string\ekvsetSneaked\marg{set}\{\#1\}\{\#2\}\}^^A
+% }
+% \end{function}
+%
+% \begin{function}{\ekvsetdefSneaked}
+% \begin{syntax}
+% \cs{ekvsetSneakeddef}\meta{cs}\marg{set}\marg{sneaked}
+% \end{syntax}
+% And this one behaves like \cs[no-index]{ekvsetSneakeddef} but with a fixed
+% \meta{sneaked} argument. So the resulting macro is faster than but else
+% equivalent to the idiomatic definition:\par
+% \texttt
+% {%
+% \string\long\string\def\meta{cs}\#1\{^^A
+% \string\ekvsetSneaked\marg{set}\marg{sneaked}\{\#1\}\}^^A
+% }
+% \end{function}
+%
% \begin{function}{\ekvparse}
% \begin{syntax}
-% \cs{ekvparse}\meta{cs1}\meta{cs2}\{\kv,\ldots\}
+% \cs{ekvparse}\marg{code1}\marg{code2}\{\kv,\ldots\}
% \end{syntax}
% This macro parses the \kv\ pairs and provides those list elements which are
-% only keys as the argument to \meta{cs1}, and those which are a \kv\ pair to
-% \meta{cs2} as two arguments. It is fully expandable as well and returns the
-% parsed list in |\unexpanded|, which has no effect outside of an |\expanded|
-% or |\edef| context\footnotemark.
+% only keys as an argument to \meta{code1}, and those which are a \kv\ pair
+% to \meta{code2} as two arguments. It is fully expandable as well and returns
+% each element of the parsed list in |\unexpanded|, which has no effect
+% outside of an |\expanded| or |\edef| context\footnotemark.
% If you need control over the necessary steps of expansion you
-% can use |\expanded| around it.
+% can use |\expanded| around it. You can use multiple tokens in \meta{code1}
+% and \meta{code2} or just a single control sequence name. In both cases the
+% found \key\ and \val\ are provided as a brace group following them.
%
% |\ekvbreak|, |\ekvsneak|, and |\ekvchangeset| and their relatives don't work
% in |\ekvparse|. It is analogue to \pkg{expl3}'s |\keyval_parse:NNn|, but
% not with the same parsing rules -- |\keyval_parse:NNn| throws an error on
% multiple equal signs per \kv\ pair and on empty \key\ names in a \kv\ pair,
% both of which |\ekvparse| doesn't deal with.
+% \end{function}
+% \footnotetext
+% {^^A
+% This is a change in behaviour, previously (v0.3 and before) \cs{ekvparse}
+% would expand in exactly two steps. This isn't always necessary, but makes
+% the parsing considerably slower. If this is necessary for your application
+% you can put an \cs[no-index]{expanded} around it and will still be faster
+% since you need only a single \cs[no-index]{expandafter} this way.^^A
+% }
%
% As a small example:
% \begin{lstlisting}
-% \ekvparse\handlekey\handlekeyval{foo = bar, key, baz={zzz}}
+% \ekvparse{\handlekey{S}}{\handlekeyval{S}}{foo = bar, key, baz={zzz}}
% \end{lstlisting}
-% would expand to
+% would be equivalent to
% \begin{lstlisting}
-% \handlekeyval{foo}{bar}\handlekey{key}\handlekeyval{baz}{zzz}
+% \handlekeyval{S}{foo}{bar}\handlekey{S}{key}\handlekeyval{S}{baz}{zzz}
% \end{lstlisting}
% and afterwards |\handlekey| and |\handlekeyval| would have to further handle
% the \key. There are no macros like these two contained in \expkv, you have
@@ -347,15 +471,6 @@ and the derived files expkv.pdf
% \begin{lstlisting}
% \handle\kv{foo}{bar}\k{key}\kv{baz}{zzz}
% \end{lstlisting}
-% \end{function}
-% \footnotetext
-% {^^A
-% This is a change in behaviour, previously (v0.3 and before) \cs{ekvparse}
-% would expand in exactly two steps. This isn't always necessary, but makes
-% the parsing considerably slower. If this is necessary for your application
-% you can put an \cs[no-index]{expanded} around it and will still be faster
-% since you need only a single \cs[no-index]{expandafter} this way.^^A
-% }.
%
% \subsection{Miscellaneous}
%
@@ -376,6 +491,14 @@ and the derived files expkv.pdf
% |\relax|.
% \end{function}
%
+% \begin{function}{\ekvifdefinedset}
+% \begin{syntax}
+% \cs{ekvifdefinedset}\marg{set}\marg{true}\marg{false}
+% \end{syntax}
+% This macro tests whether \set\ is defined (which it is if at least one key
+% was defined for it). If it is \meta{true} will be run, else \meta{false}.
+% \end{function}
+%
% \begin{function}{\ekvbreak,\ekvbreakPreSneak,\ekvbreakPostSneak}
% \begin{syntax}
% \cs{ekvbreak}\marg{after}
@@ -396,8 +519,9 @@ and the derived files expkv.pdf
% \meta{after} after any other tokens which might have been sneaked before,
% while |\ekvsneakPre| will put \meta{after} before other smuggled stuff.
% This reads and reinserts the remainder of the current |\ekvset| macro and
-% its argument list to do its job. A small usage example is shown in
-% \autoref{sec:sneakex}.
+% its argument list to do its job. After |\ekvset| has parsed the entire \kv\
+% list everything that has been |\ekvsneak|ed will be left in the input
+% stream. A small usage example is shown in \autoref{sec:sneakex}.
% \end{function}
%
% \begin{function}{\ekvchangeset}
@@ -420,16 +544,17 @@ and the derived files expkv.pdf
% \cs{ekv@name@key}\marg{key}
% \end{syntax}
% The names of the macros that correspond to a key in a set are build with
-% these macros. The default definition of |\ekv@name@set| is
-% ``\texttt{\csname ekv@name@set\endcsname{\set}}'' and the default of
-% |\ekv@name@key| is ``\texttt{\csname ekv@name@key\endcsname{\key}}''.
-% The complete name is build using |\ekv@name| which is equivalent to
-% \texttt{\cs[no-index]{ekv@name@set}\marg{set}\cs{ekv@name@key}\marg{key}}.
+% these macros. The name is built from two blocks, one that is formatting the
+% \set\ name (|\ekv@name@set|) and one for formatting the \key\ name
+% (|\ekv@name@key|). To get the actual name the argument to |\ekv@name@key|
+% must be |\detokenize|d. Both blocks are put together (with the necessary
+% |\detokenize|) by |\ekv@name|.
% For |NoVal| keys an additional |N| gets appended irrespective of these
% macros' definition, so their name is
-% \cs[no-index]{\csname ekv@name\endcsname{\set}{\key}N}. You might redefine
-% |\ekv@name@set| and |\ekv@name@key| locally but \emph{don't redefine}
-% |\ekv@name|!
+% \texttt{\cs[no-index]{ekv@name}\marg{set}\marg{key}N}.\par
+% You can use these macros to implement additional functionality or access key
+% macros outside of \expkv, but \emph{don't} change them! \expkv\ relies on
+% their exact definitions internally.
% \end{function}
%
% \subsubsection{Bugs}
@@ -445,7 +570,8 @@ and the derived files expkv.pdf
% \pkg{l3benchmark} package. The key and its usage should be equivalent to
% \begin{lstlisting}
% \protected\ekvdef{test}{height}{\def\myheight{#1}}
-% \ekvset{test}{ height = 6 }
+% \ekvsetdef\expkvtest{test}
+% \expkvtest{ height = 6 }
% \end{lstlisting}
% and only the usage of the key, not its definition, is benchmarked. For the
% impatient, the essence of these comparisons regarding speed and buggy
@@ -462,14 +588,17 @@ and the derived files expkv.pdf
% contained, as most other packages don't provide equivalent features to my
% knowledge. |\ekvparse| is slightly faster than |\ekvset|, but keep in mind
% that it does less. The same is true for |\keyval_parse:NNn| compared to
-% |\keys_set:nn| of \pkg{expl3} (where the difference is much bigger).
-%
-% \paragraph{\pkg{keyval}} is about two times faster and has a comparable
-% feature set just a slightly different way how it handles keys without values.
-% That might be considered a drawback, as it limits the versatility, but also as
-% an advantage, as it might reduce doubled code. Keep in mind that as soon as
-% someone loads \pkg{xkeyval} the performance of \pkg{keyval} gets replaced by
-% \pkg{xkeyval}'s.
+% |\keys_set:nn| of \pkg{expl3} (where the difference is much bigger). Comparing
+% just the two, |\ekvparse| is a tad faster than |\keyval_parse:NNn| because of
+% the two tests (for empty key names and only a single equal sign) which are
+% omitted.
+%
+% \paragraph{\pkg{keyval}} is about \SIrange{30}{40}{\percent} faster and has a
+% comparable feature set just a slightly different way how it handles keys
+% without values. That might be considered a drawback, as it limits the
+% versatility, but also as an advantage, as it might reduce doubled code. Keep
+% in mind that as soon as someone loads \pkg{xkeyval} the performance of
+% \pkg{keyval} gets replaced by \pkg{xkeyval}'s.
%
% Also \pkg{keyval} has a bug, which unfortunately can't really be resolved
% without breaking backwards compatibility for \emph{many} documents, namely it
@@ -480,64 +609,74 @@ and the derived files expkv.pdf
% \begin{lstlisting}[belowskip=0pt]
% \setkeys{foo}{bar=baz}
% \setkeys{foo}{bar= {baz}}
-% \setkeys{foo}{bar={ baz}}
-% \setkeys{foo}{bar={{baz}}}
+% \setkeys{foo}{bar={ baz}} % should be ` baz'
+% \setkeys{foo}{bar={{baz}}} % should be `{baz}'
% \end{lstlisting}
%
-% \paragraph{\pkg{xkeyval}} is roughly fourteen times slower, but it provides
-% more functionality, e.g., it has choice keys, boolean keys, and so on. It
-% contains the same bug as \pkg{keyval} as it has to be compatible with it by
-% design (it replaces \pkg{keyval}'s frontend), but also adds even more cases in
-% which braces are stripped that shouldn't be stripped, worsening the situation.
-%
-% \paragraph{\pkg{ltxkeys}} is over 300 times slower -- which is funny, because
-% it aims to be ``[\ldots] faster than these earlier packages [referring to
-% \pkg{keyval} and \pkg{xkeyval}].'' Since it aims to have a bigger feature set
-% than \pkg{xkeyval}, it most definitely also has a bigger feature set than
-% \expkv. Also, it can't parse |\long| input, so as soon as your values contain
-% a |\par|, it'll throw errors. Furthermore, \pkg{ltxkeys} doesn't strip outer
-% braces at all by design, which, imho, is a weird design choice. In addition
-% \pkg{ltxkeys} loads \pkg{catoptions} which is known to introduce bugs (e.g.,
-% see \url{https://tex.stackexchange.com/questions/461783}).
-%
-% \paragraph{\pkg{l3keys}} is almost five times slower, but has an, imho, great
-% interface to define keys. It strips \emph{all} outer spaces, even if somehow
-% multiple spaces ended up on either end. It offers more features, but is pretty
-% much bound to \pkg{expl3} code. Whether that's a drawback is up to you.
-%
-% \paragraph{\pkg{pgfkeys}} is a bit more than two times slower for one key,
-% but has an \emph{enormous} feature set. However, since adding additional keys
-% doesn't add as much needed time for \pkg{pgfkeys} compared to \expkv, it gets
-% faster than \expkv\ at around eight \kv\ pairs.
+% \paragraph{\pkg{xkeyval}} is roughly twenty times slower, but it provides more
+% functionality, e.g., it has choice keys, boolean keys, and so on. It contains
+% the same bug as \pkg{keyval} as it has to be compatible with it by design (it
+% replaces \pkg{keyval}'s frontend), but also adds even more cases in which
+% braces are stripped that shouldn't be stripped, worsening the situation.
+%
+% \paragraph{\pkg{ltxkeys}} is no longer compatible with the \LaTeX\ kernel
+% starting with the release 2020-10-01. It is over 380 times slower -- which is
+% funny, because it aims to be ``[\ldots] faster [\ldots] than these earlier
+% packages [referring to \pkg{keyval} and \pkg{xkeyval}].'' It needs more time
+% to parse zero~keys than five of the packages in this comparison need to parse
+% 100~keys. Since it aims to have a bigger feature set than \pkg{xkeyval}, it
+% most definitely also has a bigger feature set than \expkv. Also, it can't
+% parse |\long| input, so as soon as your values contain a |\par|, it'll throw
+% errors. Furthermore, \pkg{ltxkeys} doesn't strip outer braces at all by
+% design, which, imho, is a weird design choice. In addition \pkg{ltxkeys} loads
+% \pkg{catoptions} which is known to introduce bugs (e.g., see
+% \url{https://tex.stackexchange.com/questions/461783}). Because it is no longer
+% compatible with the kernel, I stop benchmarking it (so the numbers listed here
+% and in \autoref{tab:comp} regarding \pkg{ltxkeys} were last updated on
+% 2020-10-05).
+%
+% \paragraph{\pkg{l3keys}} is around four and a half times slower, but has an,
+% imho, great interface to define keys. It strips \emph{all} outer spaces, even
+% if somehow multiple spaces ended up on either end. It offers more features,
+% but is pretty much bound to \pkg{expl3} code. Whether that's a drawback is up
+% to you.
+%
+% \paragraph{\pkg{pgfkeys}} is around \num{2.7} times slower for one key if one
+% uses the |/|\meta{path}|/.cd| syntax and almost \SI{20}{\percent} slower if
+% one uses |\pgfqkeys|, but has an \emph{enormous} feature set.
+% To get the best performance |\pgfqkeys| was used in the benchmark. This
+% reduces the overhead for setting the base directory of the benchmark keys by
+% about \SI{43}{\ops} (so both $p_0$ and $T_0$ would be about \SI{43}{\ops}
+% bigger if |\pgfkeys{|\meta{path}|/.cd,|\meta{keys}|}| was used instead).
% It has the same or a very similar bug \pkg{keyval} has. The brace bug (and
% also the category fragility) can be fixed by \pkg{pgfkeyx}, but this package
-% was last updated in 2012 and it slows down |\pgfkeys| by factor~$8$. Also I
-% don't know whether this might introduce new bugs.
+% was last updated in 2012 and it slows down |\pgfkeys| by factor~\num{8}. Also
+% \pkg{pgfkeyx} is no longer compatible with versions of \pkg{pgfkeys} newer
+% than 2020-05-25.
%
-% \paragraph{\pkg{kvsetkeys} with \pkg{kvdefinekeys}} is about three times
+% \paragraph{\pkg{kvsetkeys} with \pkg{kvdefinekeys}} is about \num{4.4} times
% slower, but it works even if commas and equals have category codes different
% from 12 (just as some other packages in this list). Else the features of the
% keys are equal to those of \pkg{keyval}, the parser has more features, though.
%
-% \paragraph{\pkg{options}} is a bit slower for only a single value, but gets a
-% tad faster than \expkv\ at around 10 \kv\ pairs. It has a much bigger feature
-% set. Unfortunately it also suffers from the premature unbracing bug
-% \pkg{keyval} has.
+% \paragraph{\pkg{options}} is \num{1.7} times slower for only a single value.
+% It has a much bigger feature set. Unfortunately it also suffers from the
+% premature unbracing bug \pkg{keyval} has.
%
% \paragraph{\pkg{simplekv}} is hard to compare because I don't speak French (so
-% I don't understand the documentation) and from what I can see, there is no
-% direct way to define the equivalent test key. Nevertheless, I tested the
-% closest possible equivalent of my test key while siding for \pkg{simplekv}'s
-% design not forcing something into it it doesn't seem to be designed for. It is
-% more than five times slower and has hard to predict behaviour regarding brace
-% and space stripping, similar to \pkg{keyval}. The tested definition was:
-% \begin{lstlisting}[belowskip=0pt]
-% \usepackage{simplekv}
-% \setKVdefault[simplekv]{height={ abc}} % key setup
-% \setKV[simplekv]{ height = 6 } % benchmarked
-% \end{lstlisting}
-%
-% \paragraph{\pkg{yax}} is over eighteen times slower. It has a pretty strange
+% I don't understand the documentation). There was an update released on
+% 2020-04-27 which greatly improved the package's performance and adds
+% functionality so that it can be used more like most of the other \kv\
+% packages. It has problems with stripping braces and spaces in a hard to
+% predict manner just like \pkg{keyval}. Also, while it tries to be robust
+% against category code changes of commas and equal signs, the used mechanism
+% fails if the \kv\ list already got tokenised. Regarding unknown keys it got a
+% very interesting behaviour. It doesn't throw an error, but stores the \val\ in
+% a new entry accessible with \cs[no-index]{useKV}. Also if you omit \val\ it
+% stores |true| for that \key. For up to three keys, \expkv\ is a bit faster,
+% for more keys \pkg{simplekv} takes the lead.
+%
+% \paragraph{\pkg{yax}} is over twenty times slower. It has a pretty strange
% syntax, imho, and again a direct equivalent is hard to define. It has the
% premature unbracing bug, too. Also somehow loading \pkg{yax} broke
% \pkg{options} for me. The tested definition was:
@@ -575,16 +714,16 @@ and the derived files expkv.pdf
% \toprule
% \rmfamily Package & {$p_1$} & {$p_0$} & {$T_0$}& BB & CF & Date \\
% \midrule
-% keyval & 13.539 & 1.844 & 6.969 & \yes & \yes & 2014-10-28 \\
-% \expkv & 26.411 & 2.391 & 12.610 & \no & \no & 2020-02-22 \\
-% options & 25.532 & 10.518 & 21.393 & \yes & \yes & 2015-03-01 \\
-% pgfkeys & 26.444 & 40.939 & 55.790 & \yes & \yes & 2020-01-08 \\
-% kvsetkeys & {\fnsym} & {\fnsym} & 41.620 & \no & \no & 2019-12-15 \\
-% l3keys & 114.456 & 35.357 & 52.667 & \no & \no & 2020-02-14 \\
-% simplekv & 160.523 & 10.809 & 8.698 & \yes & \yes & 2017-08-08 \\
-% xkeyval & 260.872 & 180.435 & 164.167 & \yes & \yes & 2014-12-03 \\
-% yax & 507.643 & 62.863 & 123.533 & \yes & \yes & 2010-01-22 \\
-% ltxkeys & 3932.759 & 4737.818 & 5883.000 & \no & \no & 2012-11-17 \\
+% keyval & 13.742 & 1.486 & 7.254 & \yes & \yes & 2014-10-28 \\
+% \expkv & 19.701 & 2.169 & 6.592 & \no & \no & 2020-10-10 \\
+% simplekv & 18.334 & 6.971 & 17.710 & \yes & \yes & 2020-04-27 \\
+% pgfkeys & 24.274 & 1.725 & 10.650 & \yes & \yes & 2020-09-05 \\
+% options & 23.600 & 15.638 & 20.830 & \yes & \yes & 2015-03-01 \\
+% kvsetkeys & {\fnsym} & {\fnsym} & 40.290 & \no & \no & 2019-12-15 \\
+% l3keys & 71.309 & 33.131 & 31.590 & \no & \no & 2020-09-24 \\
+% xkeyval & 253.563 & 202.246 & 168.300 & \yes & \yes & 2014-12-03 \\
+% yax & 421.853 & 157.003 & 114.700 & \yes & \yes & 2010-01-22 \\
+% ltxkeys & 3400.142 & 4737.958 & 5368.000 & \no & \no & 2012-11-17 \\
% \bottomrule
% \end{tabular}
% \par
@@ -593,13 +732,12 @@ and the derived files expkv.pdf
% \fnsym For \pkg{kvsetkeys} the linear model used for the other
% packages is a poor fit, \pkg{kvsetkeys} seems to have approximately
% quadratic run-time, the coefficients of the second degree polynomial fit are
-% $p_2=\num{9.911}$, $p_1=\num{40.523}$, and $p_0=\num{61.500}$. Of course the
+% $p_2=\num{8.240}$, $p_1=\num{44.862}$, and $p_0=\num{60.793}$. Of course the
% other packages might not really have linear run-time, but at least from 1~to
-% 20~keys the fits don't seem too bad (the maximum ratio $p_2/p_1$
-% for the other packages is \num{9.697e-3}). If one extrapolates the fits
-% for 100 \kv\ pairs one finds that most of them match pretty well, the
-% exception being \pkg{ltxkeys}, which behaves quadratic as well with
-% $p_2=\num{31.685}$, $p_1=\num{3267.368}$, and $p_0=\num{7177.582}$.
+% 20~keys the fits don't seem too bad. If one extrapolates the fits for 100
+% \kv\ pairs one finds that most of them match pretty well, the exception
+% being \pkg{ltxkeys}, which behaves quadratic as well with
+% $p_2=\num{23.500}$, $p_1=\num{2906.634}$, and $p_0=\num{6547.489}$.
% \end{table}
%
% \subsection{Examples}
@@ -608,7 +746,7 @@ and the derived files expkv.pdf
%
% Say we have a macro for which we want to create a \kv\ interface. The macro
% has a parameter, which is stored in the dimension |\ourdim| having a default
-% value from its initialization. Now we want to be able to change that dimension
+% value from its initialisation. Now we want to be able to change that dimension
% with the |width| key to some specified value. For that we'd do
% \begin{lstlisting}
% \newdimen\ourdim
@@ -683,7 +821,7 @@ and the derived files expkv.pdf
% To ignore duplicates will be easy if the value of the key used last will be
% put first in the list, so the following will use |\ekvsneakPre| for the
% user-level keys. If we wanted some key for which the first usage should be the
-% the binding one we would use |\ekvsneak| instead for that key.
+% binding one we would use |\ekvsneak| instead for that key.
%
% Providing default values can be done in different ways, we'll use a simple
% approach in which we'll just put the outcome of our keys if they were used
@@ -777,6 +915,30 @@ and the derived files expkv.pdf
% \edef\myval{\sine{f=tan}{1}}\texttt{\meaning\myval}
% \end{minipage}
%
+% \paragraph{The same macro using \protect\expkvc}
+% Using \expkvc\ we can set up something equivalent with a bit less code. The
+% implementation chosen in \expkvc\ is more efficient than the example above and
+% way easier to code for the user.
+% \begin{lstlisting}
+% \makeatletter
+% \ekvcSplitAndForward\sine\sine@
+% {
+% f=sin,
+% unit=d,
+% round=3,
+% }
+% \ekvcSecondaryKeys\sine
+% {
+% nmeta degree={unit=d},
+% nmeta radian={unit={}},
+% }
+% \newcommand*\sine@[4]{\fpeval{round(#1#2(#4),#3)}}
+% \makeatother
+% \end{lstlisting}
+% The resulting macro will behave just like the one previously defined, but will
+% have an additional |unit| key, since in \expkvc\ every argument must have a
+% value taking key which defines it.
+%
%
% \subsection{Error Messages}
%
@@ -902,27 +1064,28 @@ and the derived files expkv.pdf
% \gobbledocstriptag
%<*tex>
%
-% Check whether \eTeX\ is available -- \expkv\ requires \eTeX.
+% We make sure that it's only input once:
% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname numexpr\endcsname\relax
- \errmessage{expkv requires e-TeX}
+\expandafter\ifx\csname ekvVersion\endcsname\relax
+\else
\expandafter\endinput
\fi
% \end{macrocode}
%
-% We make sure that it's only input once:
+% Check whether \eTeX\ is available -- \expkv\ requires \eTeX.
% \begin{macrocode}
-\expandafter\ifx\csname ekvVersion\endcsname\relax
-\else
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname numexpr\endcsname\relax
+ \errmessage{expkv requires e-TeX}
\expandafter\endinput
\fi
% \end{macrocode}
+%
% \begin{macro}{\ekvVersion,\ekvDate}
% We're on our first input, so lets store the version and date in a macro.
% \begin{macrocode}
-\def\ekvVersion{0.5a}
-\def\ekvDate{2020-02-27}
+\def\ekvVersion{1.6}
+\def\ekvDate{2020-12-28}
% \end{macrocode}
% \end{macro}
%
@@ -945,23 +1108,58 @@ and the derived files expkv.pdf
% restore it at the end of the file, we never care for the actual definition of
% it.
%
+% \begin{macro}[internal]{\ekv@if@lastnamedcs}
+% If the primitive |\lastnamedcs| is available, we can be a bit faster than
+% without it. So we test for this and save the test's result in this macro.
+% \begin{macrocode}
+\begingroup
+ \edef\ekv@tmpa{\string \lastnamedcs}
+ \edef\ekv@tmpb{\meaning\lastnamedcs}
+ \ifx\ekv@tmpa\ekv@tmpb
+ \def\ekv@if@lastnamedcs{\long\def\ekv@if@lastnamedcs##1##2{##1}}
+ \else
+ \def\ekv@if@lastnamedcs{\long\def\ekv@if@lastnamedcs##1##2{##2}}
+ \fi
+ \expandafter
+\endgroup
+\ekv@if@lastnamedcs
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekv@empty}
+% Sometimes we have to introduce a token to prevent accidental brace stripping.
+% This token would then need to be removed by |\@gobble| or similar. Instead we
+% can use |\ekv@empty| which will just expand to nothing, that is faster than
+% gobbling an argument.
+% \begin{macrocode}
+\def\ekv@empty{}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[internal]
% {
% \@gobble,\@firstofone,\@firstoftwo,\@secondoftwo,
-% \ekv@gobbleto@stop,\ekv@fi@secondoftwo,\ekv@gobble@mark
+% \ekv@gobbleto@stop,\ekv@fi@gobble,\ekv@fi@firstoftwo,\ekv@fi@secondoftwo,
+% \ekv@gobble@mark,\ekv@gobble@from@mark@to@stop
% }
% Since branching tests are often more versatile than |\if...\else...\fi|
% constructs, we define helpers that are branching pretty fast. Also here are
% some other utility functions that just grab some tokens. The ones that are
-% also contained in \LaTeX\ don't use the |ekv| prefix.
+% also contained in \LaTeX\ don't use the |ekv| prefix. Not all of the ones
+% defined here are really needed by \expkv\ but are provided because packages
+% like \expkvd\ or \expkvo\ need them (and I don't want to define them in each
+% package which might need them).
% \begin{macrocode}
\long\def\@gobble#1{}
\long\def\@firstofone#1{#1}
\long\def\@firstoftwo#1#2{#1}
\long\def\@secondoftwo#1#2{#2}
+\long\def\ekv@fi@gobble\fi\@firstofone#1{\fi}
+\long\def\ekv@fi@firstoftwo\fi\@secondoftwo#1#2{\fi#1}
\long\def\ekv@fi@secondoftwo\fi\@firstoftwo#1#2{\fi#2}
\long\def\ekv@gobbleto@stop#1\ekv@stop{}
\def\ekv@gobble@mark\ekv@mark{}
+\long\def\ekv@gobble@from@mark@to@stop\ekv@mark#1\ekv@stop{}
% \end{macrocode}
% \end{macro}
% As you can see |\ekv@gobbleto@stop| uses a special marker |\ekv@stop|. The
@@ -974,7 +1172,8 @@ and the derived files expkv.pdf
% \begin{macro}[internal]
% {
% \ekv@ifempty,\ekv@ifempty@,\ekv@ifempty@true,\ekv@ifempty@false,
-% \ekv@ifempty@true@F
+% \ekv@ifempty@true@F,\ekv@ifempty@true@F@gobble,
+% \ekv@ifempty@true@F@gobbletwo
% }
% We can test for a lot of things building on an if-empty test, so lets define a
% really fast one. Since some tests might have reversed logic (true if something
@@ -989,93 +1188,123 @@ and the derived files expkv.pdf
\long\def\ekv@ifempty@true\ekv@ifempty@A\ekv@ifempty@B\@secondoftwo#1#2{#1}
\long\def\ekv@ifempty@false\ekv@ifempty@A\ekv@ifempty@B\@firstoftwo#1#2{#2}
\long\def\ekv@ifempty@true@F\ekv@ifempty@A\ekv@ifempty@B\@firstofone#1{}
+\long\def\ekv@ifempty@true@F@gobble\ekv@ifempty@A\ekv@ifempty@B\@firstofone#1#2%
+ {}
+\long\def\ekv@ifempty@true@F@gobbletwo
+ \ekv@ifempty@A\ekv@ifempty@B\@firstofone#1#2#3%
+ {}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\ekv@ifblank@}
+% \begin{macro}[internal]{\ekv@ifblank,\ekv@ifblank@}
% The obvious test that can be based on an if-empty is if-blank, meaning a test
% checking whether the argument is empty or consists only of spaces. Our version
% here will be tweaked a bit, as we want to check this, but with one leading
-% |\ekv@mark| token that is to be ignored.
+% |\ekv@mark| token that is to be ignored. The wrapper |\ekv@ifblank| will not
+% be used by \expkv\ for speed reasons but \expkvo\ uses it.
% \begin{macrocode}
+\long\def\ekv@ifblank#1%
+ {%
+ \ekv@ifblank@#1\ekv@nil\ekv@ifempty@B\ekv@ifempty@true
+ \ekv@ifempty@A\ekv@ifempty@B\@secondoftwo
+ }
\long\def\ekv@ifblank@\ekv@mark#1{\ekv@ifempty@\ekv@ifempty@A}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[internal]{\ekv@ifdefined}
% We'll need to check whether something is defined quite frequently, so why not
-% define a macro that does this. The following test is expandable, slower than
-% the typical expandable test for undefined control sequences, but faster for
-% defined ones. Since we want to be as fast as possible for correct input, this
-% is to be preferred.
+% define a macro that does this. The following test is expandable and pretty
+% fast. The version with |\lastnamedcs| is the fastest version to test for an
+% undefined macro I know of (that considers both undefined macros and those with
+% the meaning |\relax|).
% \begin{macrocode}
-\def\ekv@ifdefined#1%
+\ekv@if@lastnamedcs
{%
- \expandafter
- \ifx\csname\ifcsname #1\endcsname #1\else relax\fi\endcsname\relax
- \ekv@fi@secondoftwo
- \fi
- \@firstoftwo
- }
-% \end{macrocode}
-% \end{macro}
- % \begin{macro}[internal]
-% {
-% \ekv@ifdefined@pair,\ekv@ifdefined@pair@,\ekv@ifdefined@key,
-% \ekv@ifdefined@key@
-% }
-% Since we can save some time if we only have to create the control sequence
-% once when we know beforehand how we want to use it, we build some other macros
-% for those cases (which we'll have quite often, once per key usage).
-% \begin{macrocode}
-\def\ekv@ifdefined@pair#1#2%
- {%
- \expandafter\ekv@ifdefined@pair@
- \csname
- \ifcsname #1{#2}\endcsname
- #1{#2}%
- \else
- relax%
+ \def\ekv@ifdefined#1{\ifcsname#1\endcsname\ekv@ifdef@\fi\@secondoftwo}
+ \def\ekv@ifdef@\fi\@secondoftwo
+ {%
\fi
- \endcsname
- }
-\def\ekv@ifdefined@pair@#1%
- {%
- \ifx#1\relax
- \ekv@fi@secondoftwo
- \fi
- \@firstoftwo
- {\ekv@set@pair@#1\ekv@mark}%
+ \expandafter\ifx\lastnamedcs\relax
+ \ekv@fi@secondoftwo
+ \fi
+ \@firstoftwo
+ }
}
-\def\ekv@ifdefined@key#1#2%
{%
- \expandafter\ekv@ifdefined@key@
- \csname
- \ifcsname #1{#2}N\endcsname
- #1{#2}N%
- \else
- relax%
+ \def\ekv@ifdefined#1%
+ {%
+ \ifcsname#1\endcsname\ekv@ifdef@\fi\ekv@ifdef@false#1\endcsname\relax
+ \ekv@fi@secondoftwo
\fi
- \endcsname
+ \@firstoftwo
+ }
+ \def\ekv@ifdef@\fi\ekv@ifdef@false{\fi\expandafter\ifx\csname}
+ \long\def\ekv@ifdef@false
+ #1\endcsname\relax\ekv@fi@secondoftwo\fi\@firstoftwo#2#3%
+ {#3}
}
-\def\ekv@ifdefined@key@#1%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekv@strip,\ekv@strip@a,\ekv@strip@b,\ekv@strip@c}
+% We borrow some ideas of \pkg{expl3}'s \pkg{l3tl} to strip spaces
+% from keys and values. This |\ekv@strip| also strips one level of outer braces
+% \emph{after} stripping spaces, so an input of | {abc} | becomes |abc| after
+% stripping. It should be used with |#1| prefixed by |\ekv@mark|. Also this
+% implementation at most strips \emph{one} space from both sides (which should
+% be fine most of the time, since \TeX\ reads consecutive spaces as a single one
+% during tokenisation).
+% \begin{macrocode}
+\def\ekv@strip#1%
{%
- \ifx#1\relax
- \ekv@fi@secondoftwo
- \fi
- \@firstoftwo#1%
+ \long\def\ekv@strip##1%
+ {%
+ \ekv@strip@a
+ ##1\ekv@nil
+ \ekv@mark#1%
+ #1\ekv@nil
+ }%
+ \long\def\ekv@strip@a##1\ekv@mark#1{\ekv@strip@b##1\ekv@mark}%
}
+\ekv@strip{ }
+\long\def\ekv@strip@b#1 \ekv@nil{\ekv@strip@c#1\ekv@nil}
+\long\def\ekv@strip@c\ekv@mark#1\ekv@nil\ekv@mark#2\ekv@nil#3{#3{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]
+% {\ekv@exparg,\ekv@exparg@,\ekv@expargtwice,\ekv@expargtwice@,\ekv@zero}
+% To reduce some code doublets while gaining some speed (and also as convenience
+% for other packages in the family), it is often useful to expand the first
+% token in a definition once. Let's define a wrapper for this.
+%
+% Also, to end a |\romannumeral| expansion, we want to use |\z@|, which is
+% contained in both plain \TeX\ and \LaTeX, but we use a private name for it to
+% make it easier to spot and hence easier to manage.
+% \begin{macrocode}
+\let\ekv@zero\z@
+\long\def\ekv@exparg#1#2{\expandafter\ekv@exparg@\expandafter{#2}{#1}}
+\long\def\ekv@exparg@#1#2{#2{#1}}%
+\long\def\ekv@expargtwice#1#2{\expandafter\ekv@expargtwice@\expandafter{#2}{#1}}
+\def\ekv@expargtwice@{\expandafter\ekv@exparg@\expandafter}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ekv@name,\ekv@name@set,\ekv@name@key}
% The keys will all follow the same naming scheme, so we define it here.
% \begin{macrocode}
-\def\ekv@name#1#2{\ekv@name@set{#1}\ekv@name@key{#2}}
\def\ekv@name@set#1{ekv#1(}
\def\ekv@name@key#1{#1)}
+\edef\ekv@name
+ {%
+ \unexpanded\expandafter{\ekv@name@set{#1}}%
+ \unexpanded\expandafter{\ekv@name@key{\detokenize{#2}}}%
+ }
+\ekv@exparg{\def\ekv@name#1#2}{\ekv@name}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}[internal]{\ekv@undefined@set}
% We can misuse the macro name we use to expandably store the set-name in a
% single token -- since this increases performance drastically, especially for
@@ -1088,124 +1317,169 @@ and the derived files expkv.pdf
\def\ekv@undefined@set#1{! expkv Error: Set `#1' undefined.}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}[internal]{\ekv@checkvalid}
% We place some restrictions on the allowed names, though, namely sets and
% keys are not allowed to be empty -- blanks are fine (meaning \mbox{set-
-% or} key-names consisting of spaces).
+% or} key-names consisting of spaces). The |\def\ekv@tmp| gobbles any \TeX\
+% prefixes which would otherwise throw errors. This will, however, break the
+% package if an |\outer| has been gobbled this way. I consider that good,
+% because keys shouldn't be defined |\outer| anyways.
% \begin{macrocode}
-\protected\def\ekv@checkvalid#1#2%
+\edef\ekv@checkvalid
{%
- \ekv@ifempty{#1}%
- {%
+ \unexpanded\expandafter{\ekv@ifempty{#1}}%
+ \unexpanded
+ {{%
\def\ekv@tmp{}%
\errmessage{expkv Error: empty set name not allowed}%
- }%
+ }}%
{%
- \ekv@ifempty{#2}%
+ \unexpanded\expandafter{\ekv@ifempty{#2}}%
+ \unexpanded
{%
- \def\ekv@tmp{}%
- \errmessage{expkv Error: empty key name not allowed}%
+ {%
+ \def\ekv@tmp{}%
+ \errmessage{expkv Error: empty key name not allowed}%
+ }%
+ \@secondoftwo
}%
- \@secondoftwo
}%
- \@gobble
+ \unexpanded{\@gobble}%
}
+\ekv@exparg{\protected\def\ekv@checkvalid#1#2}{\ekv@checkvalid}%
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}{\ekvifdefined,\ekvifdefinedNoVal}
% And provide user-level macros to test whether a key is defined.
% \begin{macrocode}
-\def\ekvifdefined#1#2{\ekv@ifdefined{\ekv@name{#1}{#2}}}
-\def\ekvifdefinedNoVal#1#2{\ekv@ifdefined{\ekv@name{#1}{#2}N}}
+\ekv@expargtwice{\def\ekvifdefined#1#2}%
+ {\expandafter\ekv@ifdefined\expandafter{\ekv@name{#1}{#2}}}
+\ekv@expargtwice{\def\ekvifdefinedNoVal#1#2}%
+ {\expandafter\ekv@ifdefined\expandafter{\ekv@name{#1}{#2}N}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}
-% {\ekvdef,\ekvdefNoVal,\ekvlet,\ekvletNoVal,\ekvletkv,\ekvletkvNoVal}
-% Set up the key defining macros |\ekvdef| etc.
+% {
+% \ekvdef,\ekvdefNoVal,\ekvlet,\ekvletNoVal,\ekvletkv,\ekvletkvNoVal,
+% \ekvdefunknown,\ekvdefunknownNoVal
+% }
+% Set up the key defining macros |\ekvdef| etc. We use temporary macros to set
+% these up with a few expansions already done.
% \begin{macrocode}
-\protected\long\def\ekvdef#1#2#3%
+\def\ekvdef#1#2#3#4%
{%
- \ekv@checkvalid{#1}{#2}%
+ \protected\long\def\ekvdef##1##2##3%
+ {#1{\expandafter\def\csname#2\endcsname####1{##3}#3}}%
+ \protected\long\def\ekvdefNoVal##1##2##3%
+ {#1{\expandafter\def\csname#2N\endcsname{##3}#3}}%
+ \protected\def\ekvlet##1##2##3%
+ {#1{\expandafter\let\csname#2\endcsname##3#3}}%
+ \protected\def\ekvletNoVal##1##2##3%
+ {#1{\expandafter\let\csname#2N\endcsname##3#3}}%
+ \ekv@expargtwice{\protected\long\def\ekvdefunknown##1##2}%
{%
- \expandafter\def\csname\ekv@name{#1}{#2}\endcsname##1{#3}%
- \ekv@defset{#1}%
- }%
- }
-\protected\long\def\ekvdefNoVal#1#2#3%
- {%
- \ekv@checkvalid{#1}{#2}%
- {%
- \expandafter\def\csname\ekv@name{#1}{#2}N\endcsname{#3}%
- \ekv@defset{#1}%
+ \romannumeral
+ \expandafter\ekv@exparg@\expandafter
+ {%
+ \expandafter\expandafter\expandafter
+ \def\expandafter\csname\ekv@name{##1}{}u\endcsname####1####2{##2}%
+ #3%
+ }%
+ {\ekv@zero\ekv@checkvalid{##1}.}%
}%
- }
-\protected\def\ekvlet#1#2#3%
- {%
- \ekv@checkvalid{#1}{#2}%
+ \ekv@expargtwice{\protected\long\def\ekvdefunknownNoVal##1##2}%
{%
- \expandafter\let\csname\ekv@name{#1}{#2}\endcsname#3%
- \ekv@defset{#1}%
+ \romannumeral
+ \expandafter\ekv@exparg@\expandafter
+ {%
+ \expandafter\expandafter\expandafter
+ \def\expandafter\csname\ekv@name{##1}{}uN\endcsname####1{##2}%
+ #3%
+ }%
+ {\ekv@zero\ekv@checkvalid{##1}.}%
}%
- }
-\protected\def\ekvletNoVal#1#2#3%
- {%
- \ekv@checkvalid{#1}{#2}%
+ \protected\def\ekvletkv##1##2##3##4%
{%
- \expandafter\let\csname\ekv@name{#1}{#2}N\endcsname#3%
- \ekv@defset{#1}%
+ #1%
+ {%
+ \expandafter\let\csname#2\expandafter\endcsname
+ \csname#4\endcsname
+ #3%
+ }%
}%
- }
-\protected\def\ekvletkv#1#2#3#4%
- {%
- \ekv@checkvalid{#1}{#2}%
+ \protected\def\ekvletkvNoVal##1##2##3##4%
{%
- \expandafter\let\csname\ekv@name{#1}{#2}\expandafter\endcsname
- \csname\ekv@name{#3}{#4}\endcsname
- \ekv@defset{#1}%
+ #1%
+ {%
+ \expandafter\let\csname#2N\expandafter\endcsname
+ \csname#4N\endcsname
+ #3%
+ }%
}%
}
-\protected\def\ekvletkvNoVal#1#2#3#4%
+\edef\ekvdefNoVal
{%
- \ekv@checkvalid{#1}{#2}%
- {%
- \expandafter\let\csname\ekv@name{#1}{#2}N\expandafter\endcsname
- \csname\ekv@name{#3}{#4}N\endcsname
- \ekv@defset{#1}%
- }%
- }
+ {\unexpanded\expandafter{\ekv@checkvalid{#1}{#2}}}%
+ {\unexpanded\expandafter{\ekv@name{#1}{#2}}}%
+ {%
+ \unexpanded{\expandafter\ekv@defsetmacro\csname}%
+ \unexpanded\expandafter{\ekv@undefined@set{#1}\endcsname{#1}}%
+ }%
+ {\unexpanded\expandafter{\ekv@name{#3}{#4}}}%
+ }%
+\expandafter\ekvdef\ekvdefNoVal
% \end{macrocode}
% \end{macro}
-% \begin{macro}[internal]{\ekv@defset}
+%
+% \begin{macro}[internal]{\ekv@defsetmacro}
% In order to enhance the speed the set name given to |\ekvset| will be turned
% into a control sequence pretty early, so we have to define that control
% sequence.
% \begin{macrocode}
-\protected\def\ekv@defset#1%
+\edef\ekv@defsetmacro
{%
- \expandafter\edef\csname\ekv@undefined@set{#1}\endcsname##1%
- {\ekv@name@set{#1}\ekv@name@key{##1}}%
+ \unexpanded{\ifx#1\relax\edef#1##1}%
+ {%
+ \unexpanded\expandafter{\ekv@name@set{#2}}%
+ \unexpanded\expandafter{\ekv@name@key{##1}}%
+ }%
+ \unexpanded{\fi}%
}
+\ekv@exparg{\protected\def\ekv@defsetmacro#1#2}{\ekv@defsetmacro}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ekvifdefinedset}
+% \begin{macrocode}
+\ekv@expargtwice{\def\ekvifdefinedset#1}%
+ {\expandafter\ekv@ifdefined\expandafter{\ekv@undefined@set{#1}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ekvset}
% Set up |\ekvset|, which should not be affected by active commas and equal
% signs. The equal signs are a bit harder to cope with and we'll do that later,
-% but replacing the active commas with commas of category other can be done
-% beforehand. That's why we define |\ekvset| here with a temporary meaning just
-% to set up the things with two different category codes. |#1| will be a
-% \texttt{,\textsubscript{13}} and |#2| will be a \texttt{=\textsubscript{13}}.
+% but the active commas can be handled by just doing two comma-splitting loops
+% one at actives one at others. That's why we define |\ekvset| here with a
+% temporary meaning just to set up the things with two different category codes.
+% |#1| will be a \texttt{,\textsubscript{13}} and |#2| will be a
+% \texttt{=\textsubscript{13}}.
% \begin{macrocode}
+\begingroup
\def\ekvset#1#2{%
\endgroup
-\long\def\ekvset##1##2%
+\ekv@exparg{\long\def\ekvset##1##2}%
{%
- \expandafter\ekv@set\csname\ekv@undefined@set{##1}\endcsname
+ \expandafter\expandafter\expandafter
+ \ekv@set\expandafter\csname\ekv@undefined@set{##1}\endcsname
\ekv@mark##2#1\ekv@stop#1{}%
}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}[internal]{\ekv@set}
% |\ekv@set| will split the \kv\ list at active commas. Then it has to check
% whether there were unprotected other commas and resplit there.
@@ -1215,95 +1489,174 @@ and the derived files expkv.pdf
% \end{macrocode}
% Test whether we're at the end, if so invoke |\ekv@endset|,
% \begin{macrocode}
- \ekv@gobbleto@markstop##2\ekv@endset\ekv@mark\ekv@stop
+ \ekv@gobble@from@mark@to@stop##2\ekv@endset\ekv@stop
% \end{macrocode}
-% else go on with other commas,
+% else go on with other commas.
% \begin{macrocode}
\ekv@set@other##1##2,\ekv@stop,%
-% \end{macrocode}
-% and get the next active comma delimited \kv\ pair.
-% \begin{macrocode}
- \ekv@set##1\ekv@mark
}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}[internal]{\ekv@endset}
% |\ekv@endset| is a hungry little macro. It will eat everything that remains
% of |\ekv@set| and unbrace the sneaked stuff.
% \begin{macrocode}
\long\def\ekv@endset
- \ekv@mark\ekv@stop\ekv@set@other##1,\ekv@stop,\ekv@set##2\ekv@mark
- ##3%
- {##3}
+ \ekv@stop\ekv@set@other##1\ekv@mark\ekv@stop,\ekv@stop,##2%
+ {##2}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekv@eq@other,\ekv@eq@active}
+% Splitting at equal signs will be done in a way that checks whether there is
+% an equal sign and splits at the same time. This gets quite messy and the
+% code might look complicated, but this is pretty fast (faster than first
+% checking for an equal sign and splitting if one is found). The splitting
+% code will be adapted for |\ekvset| and |\ekvparse| to get the most speed,
+% but some of these macros don't require such adaptions. |\ekv@eq@other| and
+% |\ekv@eq@active| will split the argument at the first equal sign and insert
+% the macro which comes after the first following |\ekv@mark|. This allows for
+% fast branching based on \TeX's argument grabbing rules and we don't have to
+% split after the branching if the equal sign was there.
+% \begin{macrocode}
+\long\def\ekv@eq@other##1=##2\ekv@mark##3{##3##1\ekv@stop\ekv@mark##2}
+\long\def\ekv@eq@active##1#2##2\ekv@mark##3{##3##1\ekv@stop\ekv@mark##2}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}[internal]{\ekv@set@other}
-% The macro |\ekv@set@other| is guaranteed to get only single \kv\ pairs.
-% First we test whether we're done, if not split at equal signs. It is faster to
-% first split at category 12 equal signs and only after that on actives.
-% If there is no equal sign, we need to test whether we got a blank argument and
-% if not this is a |NoVal| key.
+% The macro |\ekv@set@other| is guaranteed to get only single \kv\ pairs.
% \begin{macrocode}
\long\def\ekv@set@other##1##2,%
{%
- \ekv@gobbleto@markstop##2\ekv@endset@other\ekv@mark\ekv@stop
- \ekv@ifhas@eq@other##2=\ekv@ifempty@B\ekv@ifempty@false
- \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
- {\ekv@set@eq@other##1##2\ekv@stop}%
- {%
- \ekv@ifhas@eq@active##2#2\ekv@ifempty@B\ekv@ifempty@false
- \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
- {\ekv@set@eq@active##1##2\ekv@stop}%
- {%
- \ekv@ifblank@##2\ekv@nil\ekv@ifempty@B\ekv@ifempty@true@F
- \ekv@ifempty@A\ekv@ifempty@B\@firstofone
- {\ekv@strip{##2}\ekv@set@key##1}%
- }%
- }%
- \ekv@set@other##1\ekv@mark%
+% \end{macrocode}
+% First we test whether we're done.
+% \begin{macrocode}
+ \ekv@gobble@from@mark@to@stop##2\ekv@endset@other\ekv@stop
+% \end{macrocode}
+% If not we split at the equal sign of category other.
+% \begin{macrocode}
+ \ekv@eq@other##2\ekv@nil\ekv@mark\ekv@set@eq@other@a
+ =\ekv@mark\ekv@set@eq@active
+% \end{macrocode}
+% And insert the set name for the next recursion step of |\ekv@set@other|.
+% \begin{macrocode}
+ ##1%
+ \ekv@mark
}
% \end{macrocode}
% \end{macro}
-% \begin{macro}[internal]{\ekv@set@eq@other}
-% |\ekv@set@eq@other| might not be the correct break point, there might be an
-% active equal sign in the currently parsed key-name. If so, we have to resplit.
-% If the split is correct strip the key-name of outer spaces and braces and feed
-% it to |\ekv@set@pair|.
+%
+% \begin{macro}[internal]{\ekv@set@eq@other@a, \ekv@set@eq@other@b}
+% The first of these two macros runs the split-test for equal signs of
+% category active. It will only be inserted if the \kv\ pair contained at
+% least one equal sign of category other and |##1| will contain everything up
+% to that equal sign.
% \begin{macrocode}
-\long\def\ekv@set@eq@other##1##2=%
+\long\def\ekv@set@eq@other@a##1\ekv@stop
{%
- \ekv@ifhas@eq@active##2#2\ekv@ifempty@B\ekv@ifempty@false
- \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
- {\ekv@set@eq@active##1##2=}%
- {\ekv@strip{##2}\ekv@set@pair##1}%
+ \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@set@eq@other@active
+ #2\ekv@mark\ekv@set@eq@other@b
}
% \end{macrocode}
+% The second macro will have been called by |\ekv@eq@active| if no active
+% equal sign was found. All it does is remove the excess tokens of that
+% test and forward the \kv\ pair to |\ekv@set@pair|. Normally we would have to
+% also gobble an additional |\ekv@mark| after |\ekv@stop|, but this mark is
+% needed to delimit |\ekv@set@pair|'s argument anyway, so we just leave it
+% there.
+% \begin{macrocode}
+\ekv@exparg
+ {%
+ \long\def\ekv@set@eq@other@b
+ ##1\ekv@nil\ekv@mark\ekv@set@eq@other@active\ekv@stop\ekv@mark
+ ##2\ekv@nil=\ekv@mark\ekv@set@eq@active
+ }%
+ {\ekv@strip{##1}{\expandafter\ekv@set@pair\detokenize}\ekv@mark##2\ekv@nil}
+% \end{macrocode}
% \end{macro}
-% \begin{macro}[internal]{\ekv@set@eq@active}
-% We need to handle the active equal signs.
+%
+% \begin{macro}[internal]{\ekv@set@eq@other@active}
+% |\ekv@set@eq@other@active| will be called if the \kv\ pair was wrongly
+% split on an equal sign of category other but has an earlier equal sign of
+% category active. |##1| will be the contents up to the active equal sign and
+% |##2| everything that remains until the first found other equal sign. It has
+% to reinsert the equal sign and forward things to |\ekv@set@pair|.
% \begin{macrocode}
-\long\def\ekv@set@eq@active##1##2#2%
+\ekv@exparg
{%
- \ekv@strip{##2}\ekv@set@pair##1%
+ \long\def\ekv@set@eq@other@active
+ ##1\ekv@stop##2\ekv@nil#2\ekv@mark
+ \ekv@set@eq@other@b\ekv@mark##3=\ekv@mark\ekv@set@eq@active
+ }%
+ {\ekv@strip{##1}{\expandafter\ekv@set@pair\detokenize}\ekv@mark##2=##3}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekv@set@eq@active, \ekv@set@eq@active@}
+% |\ekv@set@eq@active| will be called when there was no equal sign of category
+% other in the \kv\ pair. It removes the excess tokens of the prior test and
+% split-checks for an active equal sign.
+% \begin{macrocode}
+\long\def\ekv@set@eq@active
+ ##1\ekv@nil\ekv@mark\ekv@set@eq@other@a\ekv@stop\ekv@mark
+ {%
+ \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@set@eq@active@
+ #2\ekv@mark\ekv@set@noeq
}
% \end{macrocode}
+% If an active equal sign was found in |\ekv@set@eq@active| we'll have to pass
+% the now split \kv\ pair on to |\ekv@set@pair|.
+% \begin{macrocode}
+\ekv@exparg
+ {\long\def\ekv@set@eq@active@##1\ekv@stop##2\ekv@nil#2\ekv@mark\ekv@set@noeq}%
+ {\ekv@strip{##1}{\expandafter\ekv@set@pair\detokenize}\ekv@mark##2\ekv@nil}
+% \end{macrocode}
% \end{macro}
-% \begin{macro}[internal]
-% {\ekv@ifhas@eq@other,\ekv@ifhas@eq@active,\ekv@endset@other}
-% And we have to set up the testing macros for our equal signs and
-% |\ekv@endset@other|.
+%
+% \begin{macro}[internal]{\ekv@set@noeq}
+% If no active equal sign was found by |\ekv@set@eq@active| there is no equal
+% sign contained in the parsed list entry. In that case we have to check
+% whether the entry is blank in order to ignore it (in which case we'll have
+% to gobble the set-name which was put after these tests by |\ekv@set@other|).
+% Else this is a |NoVal| key and the entry is passed on to |\ekv@set@key|.
+% \begin{macrocode}
+\edef\ekv@set@noeq
+ {%
+ \unexpanded
+ {%
+ \ekv@ifblank@##1\ekv@nil\ekv@ifempty@B\ekv@set@was@blank
+ \ekv@ifempty@A\ekv@ifempty@B
+ }%
+ \unexpanded\expandafter
+ {\ekv@strip{##1}{\expandafter\ekv@set@key\detokenize}\ekv@mark}%
+ }
+\ekv@exparg
+ {%
+ \long\def\ekv@set@noeq
+ ##1\ekv@nil\ekv@mark\ekv@set@eq@active@\ekv@stop\ekv@mark
+ }%
+ {\ekv@set@noeq}
+\expandafter\def\expandafter\ekv@set@was@blank
+ \expandafter\ekv@ifempty@A\expandafter\ekv@ifempty@B
+ \ekv@strip{\ekv@mark##1}##2\ekv@mark
+ {\ekv@set@other}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekv@endset@other}
+% All that's left for |\ekv@set@other| is the macro which breaks the recursion
+% loop at the end. This is done by gobbling all the remaining tokens.
% \begin{macrocode}
-\long\def\ekv@ifhas@eq@other\ekv@mark##1={\ekv@ifempty@\ekv@ifempty@A}
-\long\def\ekv@ifhas@eq@active\ekv@mark##1#2{\ekv@ifempty@\ekv@ifempty@A}
\long\def\ekv@endset@other
- \ekv@mark\ekv@stop
- \ekv@ifhas@eq@other##1=\ekv@ifempty@B\ekv@ifempty@false
- \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
- ##2%
- \ekv@set@other##3\ekv@mark
- {}
+ \ekv@stop
+ \ekv@eq@other\ekv@mark\ekv@stop\ekv@nil\ekv@mark\ekv@set@eq@other@a
+ =\ekv@mark\ekv@set@eq@active
+ {\ekv@set}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}{\ekvbreak,\ekvbreakPreSneak,\ekvbreakPostSneak}
% Provide macros that can completely stop the parsing of |\ekvset|, who knows
% what it'll be useful for.
@@ -1313,18 +1666,13 @@ and the derived files expkv.pdf
\long\def\ekvbreakPostSneak##1##2\ekv@stop#1##3{##3##1}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}{\ekvsneak,\ekvsneakPre}
% One last thing we want to do for |\ekvset| is to provide macros that just
% smuggle stuff after |\ekvset|'s effects.
% \begin{macrocode}
-\long\def\ekvsneak##1##2\ekv@stop#1##3%
- {%
- ##2\ekv@stop#1{##3##1}%
- }
-\long\def\ekvsneakPre##1##2\ekv@stop#1##3%
- {%
- ##2\ekv@stop#1{##1##3}%
- }
+\long\def\ekvsneak##1##2\ekv@stop#1##3{##2\ekv@stop#1{##3##1}}
+\long\def\ekvsneakPre##1##2\ekv@stop#1##3{##2\ekv@stop#1{##1##3}}
% \end{macrocode}
% \end{macro}
%
@@ -1335,98 +1683,136 @@ and the derived files expkv.pdf
% |\unexpanded| here and there instead of other macros to stop the |\expanded|
% on our output.
% \begin{macrocode}
-\long\def\ekvparse##1##2##3%
- {%
- \ekv@parse##1##2\ekv@mark##3#1\ekv@stop#1%
- }
+\long\def\ekvparse##1##2##3{\ekv@parse{##1}{##2}\ekv@mark##3#1\ekv@stop#1}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}[internal]{\ekv@parse}
% \begin{macrocode}
\long\def\ekv@parse##1##2##3#1%
{%
- \ekv@gobbleto@markstop##3\ekv@endparse\ekv@mark\ekv@stop
- \ekv@parse@other##1##2##3,\ekv@stop,%
- \ekv@parse##1##2\ekv@mark
+ \ekv@gobble@from@mark@to@stop##3\ekv@endparse\ekv@stop
+ \ekv@parse@other{##1}{##2}##3,\ekv@stop,%
}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}[internal]{\ekv@endparse}
% \begin{macrocode}
\long\def\ekv@endparse
- \ekv@mark\ekv@stop\ekv@parse@other##1,\ekv@stop,\ekv@parse##2\ekv@mark
+ \ekv@stop\ekv@parse@other##1\ekv@mark\ekv@stop,\ekv@stop,%
{}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}[internal]{\ekv@parse@other}
% \begin{macrocode}
\long\def\ekv@parse@other##1##2##3,%
{%
- \ekv@gobbleto@markstop##3\ekv@endparse@other\ekv@mark\ekv@stop
- \ekv@ifhas@eq@other##3=\ekv@ifempty@B\ekv@ifempty@false
- \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
- {\ekv@parse@eq@other##3\ekv@stop##2}%
- {%
- \ekv@ifhas@eq@active##3#2\ekv@ifempty@B\ekv@ifempty@false
- \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
- {\ekv@parse@eq@active##3\ekv@stop##2}%
- {%
- \ekv@ifblank@##3\ekv@nil\ekv@ifempty@B\ekv@ifempty@true@F
- \ekv@ifempty@A\ekv@ifempty@B\@firstofone
- {\ekv@strip{##3}\ekv@parse@key##1}%
- }%
- }%
- \ekv@parse@other##1##2\ekv@mark
+ \ekv@gobble@from@mark@to@stop##3\ekv@endparse@other\ekv@stop
+ \ekv@eq@other##3\ekv@nil\ekv@mark\ekv@parse@eq@other@a
+ =\ekv@mark\ekv@parse@eq@active
+ {##1}{##2}%
+ \ekv@mark
}
% \end{macrocode}
% \end{macro}
-% \begin{macro}[internal]{\ekv@parse@eq@other}
+%
+% \begin{macro}[internal]{\ekv@parse@eq@other@a,\ekv@parse@eq@other@b}
% \begin{macrocode}
-\long\def\ekv@parse@eq@other##1=%
+\long\def\ekv@parse@eq@other@a##1\ekv@stop
{%
- \ekv@ifhas@eq@active##1#2\ekv@ifempty@B\ekv@ifempty@false
- \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
- {\ekv@parse@eq@active##1=}%
- {\ekv@strip{##1}\ekv@parse@pair\ekv@mark}%
+ \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@parse@eq@other@active
+ #2\ekv@mark\ekv@parse@eq@other@b
}
+\ekv@exparg
+ {%
+ \long\def\ekv@parse@eq@other@b
+ ##1\ekv@nil\ekv@mark\ekv@parse@eq@other@active\ekv@stop\ekv@mark
+ ##2\ekv@nil=\ekv@mark\ekv@parse@eq@active
+ }%
+ {\ekv@strip{##1}\ekv@parse@pair##2\ekv@nil}
% \end{macrocode}
% \end{macro}
-% \begin{macro}[internal]{\ekv@parse@eq@active}
+%
+% \begin{macro}[internal]{\ekv@parse@eq@other@active}
% \begin{macrocode}
-\long\def\ekv@parse@eq@active##1#2%
+\ekv@exparg
{%
- \ekv@strip{##1}\ekv@parse@pair\ekv@mark
+ \long\def\ekv@parse@eq@other@active
+ ##1\ekv@stop##2\ekv@nil#2\ekv@mark
+ \ekv@parse@eq@other@b\ekv@mark##3=\ekv@mark\ekv@parse@eq@active
+ }%
+ {\ekv@strip{##1}\ekv@parse@pair##2=##3}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\ekv@parse@eq@active,\ekv@parse@eq@active@}
+% \begin{macrocode}
+\long\def\ekv@parse@eq@active
+ ##1\ekv@nil\ekv@mark\ekv@parse@eq@other@a\ekv@stop\ekv@mark
+ {%
+ \ekv@eq@active##1\ekv@nil\ekv@mark\ekv@parse@eq@active@
+ #2\ekv@mark\ekv@parse@noeq
}
+\ekv@exparg
+ {\long\def\ekv@parse@eq@active@##1\ekv@stop##2#2\ekv@mark\ekv@parse@noeq}%
+ {\ekv@strip{##1}\ekv@parse@pair##2}
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}[internal]{\ekv@parse@noeq}
+% \begin{macrocode}
+\edef\ekv@parse@noeq
+ {%
+ \unexpanded
+ {%
+ \ekv@ifblank@##1\ekv@nil\ekv@ifempty@B\ekv@parse@was@blank
+ \ekv@ifempty@A\ekv@ifempty@B
+ }%
+ \unexpanded\expandafter{\ekv@strip{##1}\ekv@parse@key}%
+ }
+\ekv@exparg
+ {%
+ \long\def\ekv@parse@noeq
+ ##1\ekv@nil\ekv@mark\ekv@parse@eq@active@\ekv@stop\ekv@mark
+ }%
+ {\ekv@parse@noeq}
+\expandafter\def\expandafter\ekv@parse@was@blank
+ \expandafter\ekv@ifempty@A\expandafter\ekv@ifempty@B
+ \ekv@strip{\ekv@mark##1}\ekv@parse@key
+ {\ekv@parse@other}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[internal]{\ekv@endparse@other}
% \begin{macrocode}
\long\def\ekv@endparse@other
- \ekv@mark\ekv@stop
- \ekv@ifhas@eq@other##1=\ekv@ifempty@B\ekv@ifempty@false
- \ekv@ifempty@A\ekv@ifempty@B\@firstoftwo
- ##2%
- \ekv@parse@other##3\ekv@mark
- {}
+ \ekv@stop
+ \ekv@eq@other\ekv@mark\ekv@stop\ekv@nil\ekv@mark\ekv@parse@eq@other@a
+ =\ekv@mark\ekv@parse@eq@active
+ {\ekv@parse}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}[internal]{\ekv@parse@pair,\ekv@parse@pair@}
% \begin{macrocode}
-\long\def\ekv@parse@pair##1##2\ekv@stop
+\ekv@exparg{\long\def\ekv@parse@pair##1##2\ekv@nil}%
+ {\ekv@strip{##2}\ekv@parse@pair@{##1}}
+\long\def\ekv@parse@pair@##1##2##3##4%
{%
- \ekv@strip{##2}\ekv@parse@pair@{##1}%
- }
-\long\def\ekv@parse@pair@##1##2##3%
- {%
- \unexpanded{##3{##2}{##1}}%
+ \unexpanded{##4{##2}{##1}}%
+ \ekv@parse@other{##3}{##4}%
}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}[internal]{\ekv@parse@key}
% \begin{macrocode}
\long\def\ekv@parse@key##1##2%
{%
\unexpanded{##2{##1}}%
+ \ekv@parse@other{##2}%
}
% \end{macrocode}
% \end{macro}
@@ -1434,12 +1820,25 @@ and the derived files expkv.pdf
% Finally really setting things up with |\ekvset|'s temporary meaning:
% \begin{macrocode}
}
-\begingroup
\catcode`\,=13
\catcode`\==13
\ekvset,=
% \end{macrocode}
%
+% \begin{macro}{\ekvsetSneaked}
+% This macro can be defined just by expanding |\ekvsneak| once after expanding
+% |\ekvset|. To expand everything as much as possible early on we use a
+% temporary definition.
+% \begin{macrocode}
+\edef\ekvsetSneaked
+ {%
+ \unexpanded{\ekvsneak{#2}}%
+ \unexpanded\expandafter{\ekvset{#1}{#3}}%
+ }
+\ekv@expargtwice{\long\def\ekvsetSneaked#1#2#3}{\ekvsetSneaked}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\ekvchangeset}
% Provide a macro that is able to switch out the current \set\ in |\ekvset|.
% This operation is slow (by comparison, it should be slightly faster than
@@ -1449,83 +1848,183 @@ and the derived files expkv.pdf
% switch out the set expandably, so this works similar to the |\ekvsneak| macros
% reading and reinserting the remainder of the \kv\ list.
% \begin{macrocode}
-\def\ekvchangeset#1%
+\ekv@exparg{\def\ekvchangeset#1}%
{%
- \expandafter\ekv@changeset\csname\ekv@undefined@set{#1}\endcsname\ekv@mark
+ \expandafter\expandafter\expandafter
+ \ekv@changeset\expandafter\csname\ekv@undefined@set{#1}\endcsname\ekv@empty
}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}[internal]{\ekv@changeset}
-% This macro does the real change-out of |\ekvchangeset|. We introduced an
-% |\ekv@mark| to not accidentally remove some braces which we have to remove
-% again.
+% This macro does the real change-out of |\ekvchangeset|. |#2| will have a
+% leading |\ekv@empty| so that braces aren't stripped accidentally, but that
+% will not hurt and just expand to nothing in one step.
% \begin{macrocode}
-\long\def\ekv@changeset#1#2\ekv@set@other#3#4\ekv@set#5%
- {%
- \ekv@gobble@mark#2\ekv@set@other#1#4\ekv@set#1%
- }
+\long\def\ekv@changeset#1#2\ekv@set@other#3{#2\ekv@set@other#1}
% \end{macrocode}
% \end{macro}
%
%
-% \begin{macro}[internal]{\ekv@gobbleto@markstop}
-% The |\ekv@gobbleto@markstop| can be used to test for |\ekv@stop| similar to
-% our if-empty test, but instead of using tokens which are used nowhere else
-% (|\ekv@ifempty@A| and |\ekv@ifempty@B|) it uses |\ekv@mark| and |\ekv@stop|.
+% \begin{macro}[internal]
+% {
+% \ekv@set@pair,\ekv@set@pair@a,\ekv@set@pair@b,\ekv@set@pair@c,
+% \ekv@set@pair@d,\ekv@set@pair@e
+% }
+% |\ekv@set@pair| gets invoked with the space and brace stripped and
+% |\detokenize|d key-name as its first, the value as the second, and the set
+% name as the third argument. It provides tests for the key-macros and
+% everything to be able to throw meaningful error messages if it isn't
+% defined. We have two routes here, one if |\lastnamedcs| is defined and one
+% if it isn't. The big difference is that if it is we can omit a |\csname| and
+% instead just expand |\lastnamedcs| once to get the control sequence.
+% If the macro is defined the value will be space and brace stripped and the
+% key-macro called. Else branch into the error handling provided by
+% |\ekv@set@pair|.
% \begin{macrocode}
-\long\def\ekv@gobbleto@markstop#1\ekv@mark\ekv@stop{}
+\ekv@if@lastnamedcs
+ {%
+ \long\def\ekv@set@pair#1\ekv@mark#2\ekv@nil#3%
+ {%
+ \ifcsname #3{#1}\endcsname\ekv@set@pair@a\fi\@secondoftwo
+ {#2}%
+ {%
+ \ifcsname #3{}u\endcsname\ekv@set@pair@a\fi\@secondoftwo
+ {#2}%
+ {%
+ \ekv@ifdefined{#3{#1}N}%
+ \ekv@err@noarg
+ \ekv@err@unknown
+ #3%
+ }%
+ {#1}%
+ }%
+ \ekv@set@other#3%
+ }
+ \def\ekv@set@pair@a\fi\@secondoftwo
+ {\fi\expandafter\ekv@set@pair@b\lastnamedcs}
+ }
+ {%
+ \long\def\ekv@set@pair#1\ekv@mark#2\ekv@nil#3%
+ {%
+ \ifcsname #3{#1}\endcsname
+ \ekv@set@pair@a\fi\ekv@set@pair@c#3{#1}\endcsname
+ {#2}%
+ {%
+ \ifcsname #3{}u\endcsname
+ \ekv@set@pair@a\fi\ekv@set@pair@c#3{}u\endcsname
+ {#2}%
+ {%
+ \ekv@ifdefined{#3{#1}N}%
+ \ekv@err@noarg
+ \ekv@err@unknown
+ #3%
+ }%
+ {#1}%
+ }%
+ \ekv@set@other#3%
+ }
+ \def\ekv@set@pair@a\fi\ekv@set@pair@c{\fi\expandafter\ekv@set@pair@b\csname}
+ \long\def\ekv@set@pair@c#1\endcsname#2#3{#3}
+ }
+\long\def\ekv@set@pair@b#1%
+ {%
+ \ifx#1\relax
+ \ekv@set@pair@e
+ \fi
+ \ekv@set@pair@d#1%
+ }
+\ekv@exparg{\long\def\ekv@set@pair@d#1#2#3}{\ekv@strip{#2}#1}
+\long\def\ekv@set@pair@e\fi\ekv@set@pair@d#1#2#3{\fi#3}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\ekv@set@pair,\ekv@set@pair@}
-% |\ekv@set@pair| gets invoked with the space and brace stripped key-name as its
-% first argument, the set-macro as the second argument, and following that is
-% the key-value right delimited by an |\ekv@stop|.
+% \begin{macro}[internal]
+% {\ekv@set@key,\ekv@set@key@a,\ekv@set@key@b,\ekv@set@key@c}
+% Analogous to |\ekv@set@pair|, |\ekv@set@key| builds the |NoVal| key-macro and
+% provides an error-branch. |\ekv@set@key@| will test whether the key-macro is
+% defined and if so call it, else the errors are thrown.
% \begin{macrocode}
-\long\def\ekv@set@pair#1#2%
+\ekv@if@lastnamedcs
{%
- \ekv@ifdefined@pair#2{#1}%
+ \long\def\ekv@set@key#1\ekv@mark#2%
{%
-% \end{macrocode}
-% This branch will be executed if the key is not defined as an argument grabbing
-% one. If so test whether there is a |NoVal| key of the same name or whether the
-% key is unknown. Throw a meaningful error message and gobble the value.
-% \begin{macrocode}
- \ekv@ifdefined{#2{#1}N}%
- \ekv@err@noarg
- \ekv@err@unknown
- #2{#1}%
- \ekv@gobbleto@stop
- }%
+ \ifcsname #2{#1}N\endcsname\ekv@set@key@a\fi\@firstofone
+ {%
+ \ifcsname #2{}uN\endcsname\ekv@set@key@a\fi\@firstofone
+ {%
+ \ekv@ifdefined{#2{#1}}%
+ \ekv@err@reqval
+ \ekv@err@unknown
+ #2%
+ }%
+ {#1}%
+ }%
+ \ekv@set@other#2%
+ }
+ \def\ekv@set@key@a\fi\@firstofone{\fi\expandafter\ekv@set@key@b\lastnamedcs}
+ }
+ {%
+ \long\def\ekv@set@key#1\ekv@mark#2%
+ {%
+ \ifcsname #2{#1}N\endcsname
+ \ekv@set@key@a\fi\ekv@set@key@c#2{#1}N\endcsname
+ {%
+ \ifcsname #2{}uN\endcsname
+ \ekv@set@key@a\fi\ekv@set@key@c#2{}uN\endcsname
+ {%
+ \ekv@ifdefined{#2{#1}}%
+ \ekv@err@reqval
+ \ekv@err@unknown
+ #2%
+ }%
+ {#1}%
+ }%
+ \ekv@set@other#2%
+ }
+ \def\ekv@set@key@a\fi\ekv@set@key@c{\fi\expandafter\ekv@set@key@b\csname}
+ \long\def\ekv@set@key@c#1N\endcsname#2{#2}
+ }
+\long\def\ekv@set@key@b#1%
+ {%
+ \ifx#1\relax
+ \ekv@fi@secondoftwo
+ \fi
+ \@firstoftwo#1%
}
% \end{macrocode}
-% |\ekv@ifdefined@pair| will call |\ekv@set@pair@| if the key is correctly
-% defined. This will then grab the value, strip outer spaces and braces from it
-% and feed it to the key-macro. Afterwards |\ekv@set@other| will take control
-% again.
+% \end{macro}
+%
+% \begin{macro}{\ekvsetdef}
+% Provide a macro to define a shorthand to use |\ekvset| on a specified \set.
+% To gain the maximum speed |\ekvset| is expanded twice by
+% |\ekv@exparg| so that during runtime the macro storing the set name
+% is already built and one |\expandafter| doesn't have to be used.
% \begin{macrocode}
-\long\def\ekv@set@pair@#1#2\ekv@stop
+\ekv@expargtwice{\protected\def\ekvsetdef#1#2}%
{%
- \ekv@strip{#2}#1%
+ \romannumeral
+ \ekv@exparg{\ekv@zero\ekv@exparg{\long\def#1##1}}%
+ {\ekvset{#2}{##1}}%
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\ekv@set@key}
-% Analogous to |\ekv@set@pair|, |\ekv@set@key| lets |\ekv@ifdefined@key| test
-% whether a |NoVal| key is defined, else it'll throw a meaningful error message.
-% Since we don't have to grab any value |\ekv@ifdefined@key| will invoke the
-% key-macro and we're done here, |\ekv@set@other| will take over again.
+% \begin{macro}{\ekvsetSneakeddef,\ekvsetdefSneaked}
+% And do the same for |\ekvsetSneaked| in the two possible ways, with a fixed
+% sneaked argument and with a flexible one.
% \begin{macrocode}
-\long\def\ekv@set@key#1#2%
+\ekv@expargtwice{\protected\def\ekvsetSneakeddef#1#2}%
{%
- \ekv@ifdefined@key#2{#1}%
- {%
- \ekv@ifdefined{#2{#1}}%
- \ekv@err@reqval
- \ekv@err@unknown
- #2{#1}%
- }%
+ \romannumeral
+ \ekv@exparg{\ekv@zero\ekv@exparg{\long\def#1##1##2}}%
+ {\ekvsetSneaked{#2}{##1}{##2}}%
+ }
+\ekv@expargtwice{\protected\def\ekvsetdefSneaked#1#2#3}%
+ {%
+ \romannumeral
+ \ekv@exparg{\ekv@zero\ekv@exparg{\long\def#1##1}}%
+ {\ekvsetSneaked{#2}{#3}{##1}}%
}
% \end{macrocode}
% \end{macro}
@@ -1542,7 +2041,7 @@ and the derived files expkv.pdf
\unexpanded{\long\def\ekv@err}##1%
{%
\unexpanded{\expandafter\ekv@err@\@firstofone}%
- {\expandafter\noexpand\csname ! expkv Error:\endcsname ##1.}%
+ {\unexpanded\expandafter{\csname ! expkv Error:\endcsname}##1.}%
\unexpanded{\ekv@stop}%
}%
}
@@ -1550,6 +2049,7 @@ and the derived files expkv.pdf
\def\ekv@err@{\expandafter\ekv@gobbleto@stop}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}[internal]
% {
% \ekv@err@common,\ekv@err@common@,
@@ -1560,44 +2060,9 @@ and the derived files expkv.pdf
% \begin{macrocode}
\long\def\ekv@err@common #1#2{\expandafter\ekv@err@common@\string#2{#1}}
\long\def\ekv@err@common@#1`#2' #3.#4#5{\ekv@err{#4 (`#5', set `#2')}}
-\long\def\ekv@err@unknown#1#2{\ekv@err@common{unknown key}#1{#2}}
-\long\def\ekv@err@noarg #1#2{\ekv@err@common{value forbidden}#1{#2}}
-\long\def\ekv@err@reqval #1#2{\ekv@err@common{value required}#1{#2}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[internal]{\ekv@strip,\ekv@strip@a,\ekv@strip@b,\ekv@strip@c}
-% Finally we borrow some ideas of \pkg{expl3}'s \pkg{l3tl} to strip spaces
-% from keys and values. This |\ekv@strip| also strips one level of outer braces
-% \emph{after} stripping spaces, so an input of | {abc} | becomes |abc| after
-% stripping. It should be used with |#1| prefixed by |\ekv@mark|. Also this
-% implementation at most strips \emph{one} space from both sides.
-% \begin{macrocode}
-\def\ekv@strip#1%
- {%
- \long\def\ekv@strip##1%
- {%
- \ekv@strip@a
- ##1%
- \ekv@nil
- \ekv@mark#1%
- #1\ekv@nil{}%
- \ekv@stop
- }%
- \long\def\ekv@strip@a##1\ekv@mark#1##2\ekv@nil##3%
- {%
- \ekv@strip@b##3##1##2\ekv@nil
- }%
- \long\def\ekv@strip@b##1#1\ekv@nil
- {%
- \ekv@strip@c##1\ekv@nil
- }%
- \long\def\ekv@strip@c\ekv@mark##1\ekv@nil##2\ekv@stop##3%
- {%
- ##3{##1}%
- }%
- }
-\ekv@strip{ }
+\ekv@exparg{\long\def\ekv@err@unknown#1}{\ekv@err@common{unknown key}{#1}}
+\ekv@exparg{\long\def\ekv@err@noarg #1}{\ekv@err@common{value forbidden}{#1}}
+\ekv@exparg{\long\def\ekv@err@reqval #1}{\ekv@err@common{value required}{#1}}
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex/factura/factura.dtx b/Master/texmf-dist/source/latex/factura/factura.dtx
index 64b75962b58..526d28d75ad 100644
--- a/Master/texmf-dist/source/latex/factura/factura.dtx
+++ b/Master/texmf-dist/source/latex/factura/factura.dtx
@@ -1,7 +1,7 @@
%\iffalse meta-comment
%
% factura.dtx
-% Copyright 2019 Emilio Augusto Lazo Zaia <emiliolazozaia@gmail.com>
+% Copyright 2020 Emilio Augusto Lazo Zaia <emiliolazozaia@gmail.com>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -27,6 +27,7 @@
% factura-ejemplo-factura05.tex, factura-ejemplo-factura06.tex,
% factura-ejemplo-factura07.tex, factura-ejemplo-factura08.tex,
% factura-ejemplo-factura09.tex, factura-ejemplo-factura10.tex,
+% factura-ejemplo-notadecredito.tex, factura-ejemplo-notadedebito.tex,
% factura-ejemplo-reporte1.tex, factura-ejemplo-reporte2.tex,
% factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<*internalbatchfile>
@@ -40,7 +41,7 @@
\input docstrip.tex
\preamble
-Copyright 2019 Emilio Augusto Lazo Zaia <emiliolazozaia@gmail.com>
+Copyright 2020 Emilio Augusto Lazo Zaia <emiliolazozaia@gmail.com>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -66,6 +67,7 @@ factura-ejemplo-factura03.tex, factura-ejemplo-factura04.tex,
factura-ejemplo-factura05.tex, factura-ejemplo-factura06.tex,
factura-ejemplo-factura07.tex, factura-ejemplo-factura08.tex,
factura-ejemplo-factura09.tex, factura-ejemplo-factura10.tex,
+factura-ejemplo-notadecredito.tex, factura-ejemplo-notadedebito.tex,
factura-ejemplo-reporte1.tex, factura-ejemplo-reporte2.tex,
factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
@@ -102,6 +104,8 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\def\repdos{factura-ejemplo-reporte2.tex}
\def\reptres{factura-ejemplo-reporte3.tex}
\def\cotiza{factura-ejemplo-cotizacion.tex}
+\def\notadecredito{factura-ejemplo-notadecredito.tex}
+\def\notadedebito{factura-ejemplo-notadedebito.tex}
\def\prefac{factura-ejemplo-prefactura.tex}
\def\beispiel{factura-beispiel-rechnung.tex}
\def\auxejemplo{factura-ejemplo-aux.tex}
@@ -122,6 +126,8 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\generate{\file{\repdos}{\from{\jobname.dtx}{repdos}}}
\generate{\file{\reptres}{\from{\jobname.dtx}{reptres}}}
\generate{\file{\cotiza}{\from{\jobname.dtx}{cotiza}}}
+\generate{\file{\notadecredito}{\from{\jobname.dtx}{notadecredito}}}
+\generate{\file{\notadedebito}{\from{\jobname.dtx}{notadedebito}}}
\generate{\file{\prefac}{\from{\jobname.dtx}{prefac}}}
\generate{\file{\beispiel}{\from{\jobname.dtx}{beispiel}}}
\generate{\file{\auxejemplo}{\from{\jobname.dtx}{aux}}}
@@ -173,7 +179,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<class>\ProvidesClass{factura}
%<def>\ProvidesFile{factura.def}
%<*class|def>
-[2019/08/16 v3.70
+[2020/11/15 v4.00
%<class>Clase para elaborar facturas legales
%<class>en la Repu'blica Bolivariana de Venezuela.
%<def>Archivo de valores iniciales y condiciones de borde para factura.cls
@@ -343,8 +349,13 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
{\protect\ttfamily#1}\encapchar usage}\@esphack}
\def\es@yearl{l año}
+\def\DescribeMacro{\noindent\leavevmode\@bsphack
+ \begingroup\MakePrivateLetters\Describe@Macro}
+
+\def\PrintDescribeMacro#1{\setstretch{1}\strut \MacroFont \color{black}\string #1\ }
+
% Definimos el comando para describir opciones, que inexplicablemente falta en doc.sty:
- \def\DescribeOption{\leavevmode\@bsphack\begingroup\MakePrivateLetters
+ \def\DescribeOption{\noindent\leavevmode\@bsphack\begingroup\MakePrivateLetters
\Describe@Option}
\def\Describe@Option#1{\endgroup
\marginpar{\raggedleft\PrintDescribeOption{#1}}%
@@ -354,7 +365,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
(opción)\encapchar usage}%
\index{opciones:\levelchar#1\actualchar{\protect\ttfamily#1}\encapchar
usage}\@esphack}
- \def\PrintDescribeOption#1{\strut \MacroFont #1\ }
+ \def\PrintDescribeOption#1{\setstretch{1}\strut \MacroFont \color{black}#1\ }
% Redefinimos el comando del encabezado del índice:
\def\index@prologue{%
@@ -390,6 +401,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\author{Emilio Augusto Lazo Zaia\\ \texttt{<emiliolazozaia at gmail.com>}}
\GetFileInfo{\jobname.dtx}
+\DoNotIndex{}
\begin{document}
\maketitle
@@ -398,7 +410,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\phantomsection
\addcontentsline{toc}{section}{\todoname}
\todos
- \section*{Información específica de esta versión + Reconversión Monetaria}
+ \section*{Información específica de esta versión}
% v2.82 Desde la versión v2.82 de esta clase, para poder compilar con \LuaLaTeX{} es necesaria la versión v2.26 del paquete |zref|, de fecha 2016/05/21, y la versión v1.18 de |atbegshi| de fecha 2016/06/09.
% v2.82 -> Esta versión de |factura| se sacó principalmente para corregir un error introducido en la versión anterior v2.72 en cuanto a las referencias, para agregar la opción |numitem| que enumera los ítems en la factura y para que la línea diagonal (opción |linea|) funcione correctamente siempre.
@@ -441,25 +453,39 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% v3.57 -> Esta será la última versión que sacamos solamente para corregir fechas de la Reconversión Monetaria; si el Gobierno Nacional cambia las fechas nuevamente, el usuario tendrá que hacer uso de la interfaz del paquete |datetime2| para ajustar el funcionamiento de esta clase a los nuevos plazos; para esto aclaramos que el identificador para la entrada de la Reconversión Monetaria se llama {\slshape FechaBsS}\footnote{recordemos que antes de esta fecha, los montos se expresan en Bolívares Fuertes y la nota automática aclara cuánto es en Bolívares Soberanos, y después de esta fecha es al contrario.} y el identificador para el momento (que aún no se ha dicho) desde el cual la moneda vuelve a llamarse Bolívar es {\slshape FechaBs}. Para ajustarlos se usa el comando \cs{DTMsavedate} y las fechas se dan en formato {\slshape yyyy-mm-dd}. Damos como ejemplo lo que actualmente está programado en esta clase:
- Desde el 15/02/2019 la moneda nacional se vuelve a llamar “Bolívar” abreviado “Bs” sin “soberano”; esto según Gaceta Oficial 41.587. Quitamos toda referencia a la Reconversión Monetaria.
+ % v3.70 -> Desde el 15/02/2019 la moneda nacional se vuelve a llamar “Bolívar” abreviado “Bs” sin “soberano”; esto según Gaceta Oficial 41.587. Quitamos toda referencia a la Reconversión Monetaria.
- También en esta versión establecemos la tasa de IVA general como 16\% tal como ya está vigente desde agosto del año 2018.
+ % v3.70 -> También en esta versión establecemos la tasa de IVA general como 16\% tal como ya está vigente desde agosto del año 2018.
- Ya no está activa la opción |electro| para descuentos en pagos por medios electrónicos porque ya no está vigente el decreto.
+ % v3.70 -> Ya no está activa la opción |electro| para descuentos en pagos por medios electrónicos porque ya no está vigente el decreto.
- Ahora en los totales aparece el signo monetario siempre a menos de que se pida en la clase la opción |sinmonedatotales|.
+ % v3.70 -> Ahora en los totales aparece el signo monetario siempre a menos de que se pida en la clase la opción |sinmonedatotales|.
- En esta misma versión se agregó un “gancho” llamado \cs{BeforeEndPreamble} para usos muy específicos.
+ % v3.70 -> En esta misma versión se agregó un “gancho” llamado \cs{BeforeEndPreamble} para usos muy específicos.
- Las “condiciones del documento” ya no son “condiciones” sino que ahora lo llamamos “nota final” porque es otra nota más aparte de las demás, y va al final del documento; no tiene sentido hablar de condiciones del documento para referirse a ese espacio. Con eso se renombran los 5 comandos, pero dejando por compatibilidad unos alias a los viejos; los nuevos son: \cs{NotaFinal}, \cs{PosNotaFinal}, \cs{SepNotaFinal}, \cs{LineaNotaFinal}, \cs{LetraNotaFinal}.
+ % v3.70 -> Las “condiciones del documento” ya no son “condiciones” sino que ahora lo llamamos “nota final” porque es otra nota más aparte de las demás, y va al final del documento; no tiene sentido hablar de condiciones del documento para referirse a ese espacio. Con eso se renombran los 5 comandos, pero dejando por compatibilidad unos alias a los viejos; los nuevos son: \cs{NotaFinal}, \cs{PosNotaFinal}, \cs{SepNotaFinal}, \cs{LineaNotaFinal}, \cs{LetraNotaFinal}.
- La macro \cs{PosNotaFinal} se comporta ahora como \cs{PosFirmas}, es decir, acepta un valor inicial en “x” y uno final.
+ % v3.70 -> La macro \cs{PosNotaFinal} se comporta ahora como \cs{PosFirmas}, es decir, acepta un valor inicial en “x” y uno final.
+ \begin{itemize}
+ \item La tasa de IVA adicional se ajustó a su valor actualizado (31\%).
+ \item Los comandos \cs{NotaPrevia}. \cs{NotaInterna}. \cs{NotaExterna} y \cs{NotaFinal} aceptan uno o dos asteriscos. Sin asteriscos, una segunda invocación del comando para la nota hace que se sustituya la primera nota especificada; con un asterisco, agrega al final de la nota ya existente ({\slshape append}), y con dos asteriscos, agrega lo nuevo al principio de la nota ya existente ({\slshape prepend}).
+ \item Desaparece la opción |denom| en favor de la nueva opción |sindenom|. Lo predeterminado ahora es que la clase escriba la denominación “FACTURA” del documento y su número, porque ese es el formato apropiado de las formas libres.
+ \item Corregidas las cajas hechas con \tikz para que no se superpusieran al fondo establecido con \cs{FondoFactura}.
+ \item Agregamos el texto “FORMA LIBRE” en las {\slshape prefacturas} en una posición ajustable con el comando correspondiente.
+ \item Corregido el número de dígitos de la numeración del documento. Estaba en 5 dígitos y son 6 dígitos según la legislación.
+ \item Se hizo un pequeño ajuste en el margen superior de la factura y en la posición del texto de la denominación y de la fecha.
+ \item Agregadas las opciones |sinencabezadofactura| y |sinencabezadoreporte| para no imprimir el encabezado de la factura con los datos del cliente, y para no imprimir el encabezado del reporte, respectivamente.
+ \item La macro \cs{EstiloPagReporte} fue renombrada a \cs{EstiloPagina} y permanecerá un tiempo funcionando también bajo \cs{EstiloPagReporte} de manera transicional.
+ \item Las macros relativas a las “condiciones” ya no son aceptadas mas; esto en favor de la “nota final”. A esta región de la hoja le cambiaron el nombre en la versión v3.70 del 2019/08/17 y dejamos un período de migración con la advertencia en la compilación si se usan las macros viejas.
+ \item Nuevas opciones |notadecredito| y |notadedebito| para producir notas de crédito y notas de débito. Las macros correspondientes a este nuevo modo son \cs{NotaNum} y \cs{NotaFecha} para hacer la referencia a la factura que la nota está corrigiendo.
+ \end{itemize}
+
\section*{Agradecimientos}
Por pruebas y sugerencias que dieron lugar a mejoras agradezco a Ritguey%
\ifmotorunicode\footnote{\setmainfont{Symbola}🐧}\else\message{^^J^^JLaTeX Warning: Compila con XeLaTeX.^^J}\fi{}
- Flores Esteves y a Alberto Mijares. Por contribuciones a través de \texttt{StackExchange} agradezco a Alan Munn, cfr, David Carlisle, egreg, Gustavo Mezzetti, Heiko Oberdiek, jfbu, Joseph Wright, Werner y wipet. El motivo por el que se da cada agradecimiento está como comentario en el archivo |.cls| o en el |.dtx|.
+ Flores Esteves y a Alberto Mijares. Por contribuciones a través de \texttt{StackExchange} agradezco a Alan Munn, cfr, David Carlisle, egreg, Gustavo Mezzetti, Heiko Oberdiek, jfbu, Joseph Wright, Schrödinger's cat, Werner y wipet. El motivo por el que se da cada agradecimiento está como comentario en el archivo |.cls| o en el |.dtx|.
\addcontentsline{toc}{section}{\changesname}
{\makeatletter\def\pfill{\unskip\hfill\@gobble}\makeatother
@@ -599,7 +625,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% \changes{v3.40}{2017/12/11}{Nueva opción \texttt{iva} para agregar una columna adicional que muestra el IVA de cada item.}
% \changes{v3.40}{2017/12/11}{Modificada la macro interna \cs{@DescripcionAuxCmd} por problemas que daba en algunos casos.}
% \changes{v3.40}{2017/12/11}{Se renombró la opción \texttt{exparriba} por \texttt{expandecuadro}.}
-% \DoNotIndex{}
% \changes{v3.40}{2017/12/11}{Modificada la definición de \cs{ItemX} para que maneje la descripción especial para el archivo \texttt{csv}.}
% \changes{v3.40}{2017/12/11}{Nuevo comando \cs{ivaref} para referenciar el IVA del ítem etiquetado.}
% \changes{v3.40}{2017/12/11}{Se cambiaron unos \cs{AtEndDocument} por \cs{AtBeginShipoutNext}. Se hizo necesario siempre el paquete \texttt{eso-pic}.}
@@ -637,22 +662,33 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% \changes{v3.70}{2019/08/17}{Corregido el posicionamiento en “x” de la nota final.}
% \changes{v3.70}{2019/08/17}{Ahora la macro \cs{PosNotaFinal} acepta un intervalo en “x” para posicionar la nota final, es decir que funciona como \cs{PosFirmas}.}
% \changes{v3.70}{2019/08/17}{Mejorada la macro interna que escribe la fecha en la metadata; ya no usa \texttt{xstring} sino \LaTeX3. Quitado código espúreo de \texttt{xstring} en las macros que permiten fijar las posiciones de los elementos fijos.}
-%
+% \changes{v3.73}{2020/04/18}{Cuando se definen dos entornos de factura ya no advierte sino que ignora el segundo.}
+% \changes{v3.73}{2020/04/18}{Asteriscos para las notas previa, interna, externa y final. Sin asteriscos, sustituye la nota, con un asterisco agrega la nueva nota al final de la nota previamente definida y con dos asteriscos agrega la nueva nota al principio de la nota previamente definida.}
+% \changes{v3.73}{2020/04/18}{Corrección en la metadata luego de que el paquete \texttt{oberdiek} fuera actualizado.}
+% \changes{v3.73}{2020/04/18}{Corregido error en referencia a macro interna \cs{@TamFinalEncabezadoado} introducido en versión v3.11.}
+% \changes{v3.73}{2020/04/18}{Actualizada la tasa de IVA adicional correcta en 31\%.}
+% \changes{v4.00}{2020/11/15}{Ahora lo predeterminado es que salga escrita la denominación y el número del documento factura, por lo que la opción \texttt{denom} ya no existe y se agregó \texttt{sindenom} para evitar que salga la denominación y el número; esto para los talonarios de formas libres más comunes que son aquellos que no tienen la denominación ni el número.}
+% \changes{v4.00}{2020/11/15}{Se corrigieron las cajas hechas con \tikz para que no se superpusieran al fondo de factura establecido con \cs{FondoFactura}.}
+% \changes{v4.00}{2020/11/15}{Ahora las {\slshape prefacturas} imprimen también el texto “FORMA LIBRE”, necesario según la legislación, y se agregaron los comando para ubicar su posición en la hoja y para cambiar la tipografía.}
+% \changes{v4.00}{2020/11/15}{Lo hacemos otra vez compatible con Lua\LaTeX{} y la metadata vuelve a aparecer en pdf\LaTeX{} y en Lua\LaTeX{} luego de que \texttt{hyperref} la sobreescribiera.}
+% \changes{v4.00}{2020/07/15}{Se corrigió la cantidad de dígitos en la numeración de 5 a 6 para estar de acuerdo a la legislación.}
+% \changes{v4.00}{2020/11/15}{Nuevas opciones \texttt{sinencabezadofactura} y \texttt{sinencabezadoreporte} para evitar que el encabezado de la factura o del reporte se impriman.}
+% \changes{v4.00}{2020/11/15}{Renombrada la macro \cs{EstiloPagReporte} a \cs{EstiloPagina}, y quedan funcionando ambas por un tiempo.}
+% \changes{v4.00}{2020/11/15}{Ya no sirven las macros obsoletas \cs{Condiciones}, \cs{PosCondiciones}, \cs{SepCondiciones} ni \cs{LetraCondiciones} en favor de sus correspondientes para la nota final que es el nuevo nombre de esta parte de la página.}
+% \changes{v4.00}{2020/11/15}{Agregada la macro \cs{@EstiloParrafoReporte} dentro del archivo \texttt{.def} para controlar las opciones de párrafo del reporte.}
%
% \tableofcontents
%
%
+% \newpage
% \section*{Brief description in english}
%
% |factura| is the spanish word for `invoice', so this is a \LaTeX{} class for typesetting and calculating invoices, made taking into account requirements of {\slshape SENIAT} legislation (tax collector entity on the Bolivarian Republic of Venezuela), but its use is not restricted to Venezuela because all variables and displayed text can be redefined by invoking commands or editing.
%
-% \newpage
% \setstretch{1.4}
-%
-%
% \section{Introducción}
%
-% La clase de \LaTeX{} |factura| está diseñada para su uso en la República Bolivariana de Venezuela, conforme a los requerimientos fijados por las providencias del {\slshape SENIAT} 0591, 0257, 0071 y 0048, válidas éstas para agosto del año 2019.
+% La clase de \LaTeX{} |factura| está diseñada para su uso en la República Bolivariana de Venezuela, conforme a los requerimientos fijados por las providencias del {\slshape SENIAT} 0591, 0257, 0071 y 0048, válidas éstas para abril del año 2020.
%
% Con |factura| se pueden elaborar facturas en formas libres fiscales\footnote{En cuanto a las formas libres, cada hoja del talonario de facturas legales tiene un encabezado con los datos del emisor de la factura y un pie de página con la información de identificación de la imprenta, en tamaño de hoja carta entera; esto es lo que se llama “forma libre”.}, cotizaciones y reportes de servicios, dejando todos los cálculos a \TeX{}.
%
@@ -707,7 +743,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% \item {\color{RoyalBlue}|pdflatex factura-ejemplo-prefactura.tex|}
%
-% De esta forma como compilamos {\ttfamily factura-ejemplo-prefactura} compilamos todos los demás ejemplos: la cotización, las facturas del 1 hasta la última, el reporte del 1 hasta el último, y finalmente la factura para otra legislación.\footnote{Podemos también compilar con \LuaLaTeX{} o con \XeLaTeX{}.}
+% De esta forma como compilamos {\ttfamily factura-ejemplo-prefactura} compilamos todos los demás ejemplos: la cotización, las facturas del 1 hasta la última, el reporte del 1 hasta el último, la nota de crédito, la nota de débito, y finalmente la factura para otra legislación.\footnote{Podemos también compilar con \LuaLaTeX{} o con \XeLaTeX{}.}
%
% Al tener todo esto hecho volvemos a compilar |factura.dtx| para producir esta documentación, puesto que el |.dtx| necesita ser compilado más de una vez para que la documentación quede correctamente elaborada:
%
@@ -733,12 +769,14 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% |factura.pdf| & Esta documentación, \\
% |README| & Archivo con la descripción corta, \\
% |factura-ejemplo-firma.tex| & Ejemplo de firma digitalizada, \\
-% |factura-ejemplo-fondo.tex| & Elemplo de una forma libre fiscal digitalizada, \\
+% |factura-ejemplo-fondo.tex| & Ejemplo de una forma libre fiscal digital, \\
% |factura-ejemplo-membrete.tex| & Ejemplo de membrete para los reportes, \\
% |factura-ejemplo-aux.tex| & Archivo auxiliar que se incluye en todos los ejemplos y \\
% & sirve para que cada ejemplo conste de su descripción, \\
% |factura-ejemplo-prefactura.tex| & Ejemplo de “{\slshape prefactura}”, \\
% |factura-ejemplo-cotizacion.tex| & Ejemplo de cotización, \\
+% |factura-ejemplo-notadecredito.tex| & Ejemplo de nota de crédito, \\
+% |factura-ejemplo-notadedebito.tex| & Ejemplo de nota de débito, \\
% |factura-ejemplo-factura*.tex| & Ejemplos de facturas, \\
% |factura-ejemplo-reporte*.tex| & Ejemplos de reportes, \\
% |factura-beispiel-rechnung.tex| & Un ejemplo de una factura adaptada a otra legislación. \\ \hline
@@ -766,11 +804,11 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% El margen inferior de |geometry| empieza donde termina la descripción del servicio -o el fin del cuadro de la factura, en caso de que no se agregue un texto de descripción larga-, hasta el final del papel.
%
-% Para aclarar lo anterior es necesario decir que hay textos con posiciones fijas que están fuera de estos márgenes, como la fecha de emisión, la “denominación” del documento (que es “FACTURA”, “COTIZACIÓN” u otro especificable), el número de la factura, el número de control (cuando aplica), las nota final y los espacios para las firmas; todas estas partes del documento están fijas en posiciones arbitrarias fuera de los márgenes dejados por |geometry|. Estos textos son fijos para darles posiciones que no dependan del contenido particular de cada factura sino del diseño del talonario que ya tenemos impreso, que siempre será igual, y para el cual estamos adaptando esta clase |factura|.
+% Para aclarar lo anterior es necesario decir que hay textos con posiciones fijas que están fuera de estos márgenes, como la fecha de emisión, la “denominación” del documento (que es “FACTURA”, “NOTA DE CRÉDITO”, “NOTA DE DÉBITO”, “COTIZACIÓN” u otro especificable), el número de la factura, el número de control (cuando aplica), las nota final y los espacios para las firmas; todas estas partes del documento están fijas en posiciones arbitrarias fuera de los márgenes dejados por |geometry|. Estos textos son fijos para darles posiciones que no dependan del contenido particular de cada factura sino del diseño del talonario que ya tenemos impreso, que siempre será igual, y para el cual estamos adaptando esta clase |factura|.
%
% Las ubicaciones de los textos fijos también tienen valores predefinidos dentro de |factura.def|. Cualquiera de esos valores puede cambiarse mediante comandos, tal como se fijan los valores predeterminados en dicho archivo |.def|; esto significa que se puede personalizar a cualquier diseño del talonario entregado por la imprenta, basta con entender qué hace cada comando (explicado en este documento), consultar el |.def| o ver los ejemplos.
%
-% En algunos casos las formas libres tienen impreso el número de la factura y no es controlable esto por el emisor (como ocurre con el número de control que la legislación obliga a que siempre venga impreso en cada hoja del talonario). En otros casos el emisor tiene la libertad de escribir el número de la factura y controlarlo él mismo. Se puede hacer funcionar la clase según cualquiera de estas dos formas con una opción en |\documentclass|, es decir, podemos imprimir el número de la factura donde queramos, o también podemos asumirlo impreso en el talonario, según sea el caso del talonario que tengamos.
+% En algunos casos las formas libres tienen impreso el número de la factura y no es controlable esto por el emisor (como ocurre con el número de control que la legislación obliga a que siempre venga impreso en cada hoja del talonario). Se puede hacer funcionar la clase para imprimir el número de la factura donde queramos, o también podemos asumirlo impreso en el talonario, según sea el caso del talonario que tengamos.
%
% Al usarse esta clase se deben primero hacer medidas en las facturas que la imprenta nos entrega para fijar los márgenes y determinar dónde poner los textos fijos que se deseen cambiar de la posición que viene predeterminada.
%
@@ -791,13 +829,13 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% También el usuario tiene la posibilidad de producir una {\slshape “prefactura”}; así le llamamos a un documento sin validez legal pero que puede ser enviado por fax o por correo electrónico. Este documento tiene el mismo aspecto de la factura fiscal si se digitaliza la forma libre vacía\footnote{Quitándole las numeraciones obviamente. También puede diseñarse en un |.tex| una forma libre vacía idéntica a la que se tiene, así como se hace en el ejemplo incluído.}, se incluye la imagen como fondo de la página y se definen las posiciones fijas de las numeraciones impresas en el talonario, es decir el número de factura y el número de control, de los que hablamos previamente.
%
-% Con esta misma clase tiene se la posibilidad de imprimir un información en el reverso de la hoja de la factura que saldrá escrita utilizando toda la hoja (los márgenes son ajustables). Esa información se encierra en un ambiente destinado para ese fin (|\begin{reverso}...\end{reverso}|),
+% Con esta misma clase tiene se la posibilidad de imprimir un información en el reverso de la hoja de la factura que saldrá escrita utilizando toda la hoja (los márgenes son ajustables). Esa información se encierra en un ambiente destinado para ese fin
% \DescribeEnv{reverso}
-% y al momento de la compilación puede decidirse si se imprime esa parte o no.
+% (|\begin{reverso}...\end{reverso}|), y al momento de la compilación puede decidirse si se imprime esa parte o no.
%
-% Otra posibilidad que da esta clase es la de escribir un reporte largo asociado a la factura\footnote{Si lo hubiera, así como también se puede usar estar clase para elaborar un reporte sin asociarlo a una factura en particular.}. Tal reporte se escribe dentro de un ambiente en el mismo documento en el que se escribe la factura asociada a él (|\begin{reporte}...\end{reporte}|),
+% Otra posibilidad que da esta clase es la de escribir un documento de reporte de varias páginas (no parte del documento fiscal) asociado a la factura\footnote{Si lo hubiera, así como también se puede usar estar clase para elaborar un reporte sin asociarlo a una factura en particular.}. Tal reporte se escribe dentro de un ambiente en el mismo documento en el que se escribe la factura asociada a él
% \DescribeEnv{reporte}
-% y con dar una opción al inicio se puede hacer que se impirma el reporte en las páginas siguientes a la factura, o también se puede hacer que se imprima sólo el reporte ignorando todo lo que no constituye el reporte, de la misma manera como también se puede hacer que se imprima sólo la factura ignorando el entorno |reporte|. Esto permite tener todo en un mismo documento e imprimir lo que se desee en el momento, o todo a la vez.
+% (|\begin{reporte}...\end{reporte}|), y con dar una opción al inicio se puede hacer que se impirma el reporte en las páginas siguientes a la factura, o también se puede hacer que se imprima sólo el reporte ignorando todo lo que no constituye el reporte, de la misma manera como también se puede hacer que se imprima sólo la factura ignorando el entorno |reporte|. Esto permite tener todo en un mismo documento e imprimir lo que se desee en el momento, o todo a la vez.
%
%
% \section{Compilación de un documento\label{sec:compila}}
@@ -816,14 +854,20 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% \subsection{Sobre el tipo de documento a producir}
%
-% {\setlength{\parindent}{0pt}
+% {
%
% \DescribeOption{prefactura}
-% La {\slshape “prefactura”} es un documento no legal, preliminar, que no se imprime sobre papel de factura sino que está concebido para enviarse por correo o fax. Para eso se define la imagen que contiene el diseño de la factura con el comando |\FondoFactura|, luego la clase escribe la denominación “FACTURA” con su número\footnote{Lo predeterminado cuando no es una {\slshape “prefactura”} sino una factura final es no escribir la denominación ni el número, ya que eso generalmente viene impreso en cada hoja del talonario.}. Esta opción implica la opción |sinfirmas|, ya que si es un documento preliminar sin validez legal, las firmas no son necesarias; sin embargo se puede cambiar este comportamiento con las opciones |dosfirmas| y |unafirma|.
+% La {\slshape “prefactura”} es un documento no legal, preliminar, que no se imprime sobre papel de factura sino que está concebido para enviarse por correo o fax. Para eso se define la imagen que contiene el diseño de la factura con el comando |\FondoFactura|, luego la clase escribe la denominación “FACTURA” con su número. Esta opción implica la opción |sinfirmas|, ya que si es un documento preliminar sin validez legal, las firmas no son necesarias; sin embargo se puede cambiar este comportamiento con las opciones |dosfirmas| y |unafirma|.
%
% \DescribeOption{cotizacion}
% La cotización es un documento similar a una factura pero no es un documento legal en el sentido de que no se imprime sobre talonario fiscal alguno, así que no lleva número de control y puede o no tener su propia numeración, que es cosa del emisor de la cotización. Esta opción implica la opción |unafirma|, para que firme el emisor de la factura, y si su nombre no se especifica saldrá “Por el emisor” debajo de la línea para firmar. También puede cambiarse esto con la opción |dosfirmas| o con |sinfirmas|.
%
+% \DescribeOption{notadecredito}
+% Produce una nota de crédito para corregir alguna factura previamente hecha, dentro del mismo período fiscal. Hay que usar |\NotaNum| y |\NotaFecha| para especificar el número y la fecha de la factura a corregir; aparecerá escrito un texto en el que se hace referencia a la factura con el error dinerario que se está corrigiendo con la nota.
+%
+% \DescribeOption{notadedebito}
+% Produce una nota de débito, también para corregir alguna factura previa con algún error. Aplican los mismos comentarios anteriores sobre la nota de crédito.
+%
% \DescribeOption{sinreverso}
% No escribe la información -opcional- que se escribió dentro del entorno |reverso| a salir en el reverso de la factura.
%
@@ -906,6 +950,9 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% \subsection{Elementos a mostrar o no mostrar en la factura}
%
+% \DescribeOption{sinencabezadofactura}
+% Esta opción permite que el usuario escriba antes del entorno de la factura, la identificación de él como emisor y los datos del cliente en el formato que desee sin que aparezca el cuadro prediseñado con esta información. Para hacer eso, el usuario tendría que escribir su diseño tan pronto escriba |\begin{document}| antes de |\begin{factura}|.
+%
% \DescribeOption{sinmarcas}
% Con |sinmarcas| evitamos que el carácter de fin de línea aparezca cuando la descripción ocupa más que una línea; ese carácter indica que la línea continúa abajo, y predeterminadamente es la flecha “\flechaCR”. También con esta opción no aparece el carácter “$\cdot$” en las celdas vacías en este mismo caso.
%
@@ -924,8 +971,8 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% \DescribeOption{vencimiento}
% Cuando establecemos los días del crédito de la factura, se imprime una línea también con la fecha de vencimiento de la factura. Con esta opción podemos pedir que la fecha de vencimiento salga siempre en la facturas, inclusive cuando no sean facturas a crédito.
%
-% \DescribeOption{denom}
-% Con esta opción escribimos también el texto “FACTURA” con el número. La razón de esta opción es que hay formas libres que tienen la numeración de la factura y otras que solamente tienen el número de control; para las que tienen sólo el número de control existe esta opción que también escribe el número en cada factura impresa, en la posición que se defina.
+% \DescribeOption{sindenom}
+% Con esta opción no escribimos el texto “FACTURA” ni el número de la factura, suponiendo que venga escrito en el talonario. Las formas libres no deberían traer la denominación “FACTURA” ni el número, pero hay formas libres que sí tienen el texto y la numeración de la factura, cuando lo normal es que solamente tengan el número de control. Para los talonarios que tienen la numeración de cada factura existe esta opción.
%
% \DescribeOption{sinnumero}
% Escribe el texto de la denominación del documento en su posición (e.g. “COTIZACIÓN”) pero sin escribir el número; por ejemplo para las cotizaciones que no son documentos que legalmente lleven número, aunque el número puede ser para control interno. Esta opción implica la opción anterior |denom|.
@@ -960,6 +1007,9 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% \subsection{Otras opciones}
%
+% \DescribeOption{sinencabezadoreporte}
+% Con esta opción de la clase, el reporte no empieza con el texto indicativo del proveedor, el cliente y la persona de contacto.
+%
% \DescribeOption{nospanish}
% No carga |babel| en castellano\footnote{Por ejemplo para cargar {\ttfamily polyglossia} en su lugar.}, ni la codificación |T1| de las letras en el caso de compilar con pdf\LaTeX. Si no se especifica esta opción se cargan ambos paquetes.
%
@@ -969,14 +1019,13 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% \DescribeOption{csv}
% Escribe un archivo csv con la información numérica de la factura.
%
+%
% \subsection{Activación y desactivación de opciones desde comandos\label{subsec:condicionales}}
%
% Cualquiera de estas opciones también se puede activar o desactivar en el preámbulo y así poder incluirlas dentro de archivos que vayan a ser cargados con |\input| o |\include| como se explicará en la subsección \ref{subsec:aux}. Esto significa que podremos desactivar una opción que hayamos dado en |\documentclass| o activar alguna que no hayamos activado allí.
%
% Para hacer eso debemos usar el condicional que cada opción maneja y activarlo o desactivarlo de la forma como se hace en \TeX{}. El condicional de cada opción tiene el mismo nombre de la opción. Por ejemplo, para quitar las líneas verticales (|sinlineasv|) usaríamos |\sinlineasvtrue| en el preámbulo, o para desactivar la creación del archivo |.csv|, previamente activada en |\documentclass|, usaríamos |\csvfalse|.
%
-% }
-%
%
% \section{Comandos que la clase provee\label{sec:comandos}}
%
@@ -988,8 +1037,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% Como explicamos en la sección \ref{sec:geohoja}, a la hoja de la factura se le deben establecer los márgenes apropiadamente, y esos márgenes no tienen en cuanta ciertos textos que llamamos “fijos”, para los cuales también debemos establecer sus posiciones en la hoja, y eso lo veremos en esta parte.
%
%
-% {\setlength{\parindent}{0pt}
-%
% \DescribeMacro{\GeometriaFactura}{\macrooptcolor|\GeometriaFactura|\marg{geometría}}
%
% En el argumento de este comando van los parámetros relativos al paquete |geometry| que van a afectar la manera como la factura es generada. Como dijimos al principio, deberá especificarse el tipo de papel (e.g. |letterpaper|, |legalpaper|, |executive|, |a4paper|, ...) y los márgenes verticales y horizontales.
@@ -1007,8 +1054,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% Lo que recomendamos es digitalizar la forma libre o pedir a la imprenta un archivo digital con el diseño y así incluir esa imagen con este comando cuando se vayan a producir “prefacturas” o cotizaciones, así las prefacturas tienen el mismo diseño que las facturas. Si se puede lograr el diseño en un código como se hace con el ejemplo del fondo, pues mejor aún.
%
%
-% }
-%
%
% \subsubsection{Elementos fijos y sus ubicaciones}
%
@@ -1018,7 +1063,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% Por ejemplo, si queremos que la fecha aparezca desde el margen izquierdo y |5cm| contados desde arriba hacia abajo, haríamos: |\PosFecha{0cm}{5cm},| y si queremos que salga |1cm| desde la derecha y |4cm| contados desde abajo haríamos |\PosFecha{-1cm}{-4cm}|. A continuación todas las macros para fijar las posiciones en el papel:
%
-% {\setlength{\parindent}{0pt}
%
% \DescribeMacro{\PosFecha}{\macrooptcolor|\PosFecha|\marg{pos. x}\marg{pos. y}}
%
@@ -1026,7 +1070,17 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% \DescribeMacro{\PosFecha*}{\macrooptcolor|\PosFecha*|\marg{pos. x}\marg{pos. y}}
%
-% Con esta variante con “*”, es decir, |\PosFecha*|, logramos que la caja de la fecha abra hacia arriba desde la posición especificada en el eje vertical, de manera que estaríamos especificando una coordenada “|y|” final del texto y no una posición inicial, esto significa que el texto se despliega hacia arriba desde la posición dada y no hacia abajo. Por ejemplo, sin “*”, si especificamos |\PosFecha{-0cm}{5cm}|, las fechas empiezan 5cm desde el tope superior de la hoja, y si especificamos |\PosFecha*{-0cm}{5cm}| ellas terminarán en los 5cm de la hoja. Esto es útil cuando se especifica también |\Credito| que produce una fecha de vencimiento que aparecerá abajo de la fecha de emisión; al ocupar las fechas más de una línea podemos querer que la última fecha (la de vencimiento) quede alineada en cierta posición vertical, la misma posición donde saldría la fecha de emisión en el caso en el que no haya fecha de vencimiento por no especificar la factura a crédito.
+% Con esta variante con “|*|”, es decir, |\PosFecha*|, logramos que la caja de la fecha abra hacia arriba desde la posición especificada en el eje vertical, de manera que estaríamos especificando una coordenada “|y|” final del texto y no una posición inicial, esto significa que el texto se despliega hacia arriba desde la posición dada y no hacia abajo.
+%
+% Por ejemplo, sin “|*|”, si especificamos |\PosFecha{-0cm}{5cm}|, las fechas empiezan 5cm desde el tope superior de la hoja, y si especificamos |\PosFecha*{-0cm}{5cm}| ellas terminarán en los 5cm de la hoja. Esto es útil cuando se especifica también |\Credito| que produce una fecha de vencimiento que aparecerá abajo de la fecha de emisión; al ocupar las fechas más de una línea podemos querer que la última fecha (la de vencimiento) quede alineada en cierta posición vertical, la misma posición donde saldría la fecha de emisión en el caso en el que no haya fecha de vencimiento por no especificar la factura a crédito.
+%
+% \DescribeMacro{\PosFormalibre}{\macrooptcolor|\PosFormalibre|\marg{pos. x}\marg{pos. y}}
+%
+% El comando |\PosFormalibre| nos permite ubicar el texto “FORMA LIBRE” que viene impreso en las formas libres fiscales, de manera que sólo saldrá si se pide una {\slshape prefactura}.
+%
+% \DescribeMacro{\PosFormalibre*}{\macrooptcolor|\PosFormalibre*|\marg{pos. x}\marg{pos. y}}
+%
+% Al igual que con |\PosFecha*| podemos especificar la posición final en “|y|” de la caja para el texto “FORMA LIBRE”, así el texto se despliega hacia arriba y no hacia abajo.
%
% \DescribeMacro{\PosDenom}{\macrooptcolor|\PosDenom|\marg{pos. x}\marg{pos. y}}
%
@@ -1034,15 +1088,15 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% \DescribeMacro{\PosDenom*}{\macrooptcolor|\PosDenom*|\marg{pos. x}\marg{pos. y}}
%
-% Al igual que con |\PosFecha*| podemos especificar la posición final en “|y|” de la caja para la denominación, así el texto se despliega hacia arriba y no hacia abajo.
+% Al igual que con |\PosFecha*| y |\PosFormalibre*| podemos especificar la posición final en “|y|” de la caja para la denominación, así el texto se despliega hacia arriba y no hacia abajo.
%
% \DescribeMacro{\PosControl}{\macrooptcolor|\PosControl|\marg{pos. x}\marg{pos. y}}
%
-% Con |\PosControl| controlamos dónde se ubica la caja que imprime el número de control con la serie.
+% Con |\PosControl| controlamos dónde se ubica la caja que imprime el número de control con la serie, sólo para {\slshape prefacturas} porque ese texto está impreso en las hojas fiscales.
%
% \DescribeMacro{\PosControl*}{\macrooptcolor|\PosControl*|\marg{pos. x}\marg{pos. y}}
%
-% También podemos pedir que la caja del número de control abra hacia arriba, es decir que la posición vertical sea tomada como la posición vertical final; para eso |\PosControl*|, igual que con |\PosFecha*| y |\PosDenom*|.
+% También podemos pedir que la caja del número de control abra hacia arriba, es decir que la posición vertical sea tomada como la posición vertical final; para eso |\PosControl*|, igual que con |\PosFecha*|, |\PosFormalibre*| y |\PosDenom*|.
%
% \DescribeMacro{\PosNotaFinal}{\macrooptcolor|\PosNotaFinal|\marg{pos. x-inicial}\marg{pos x-final}\marg{pos. y}}
%
@@ -1062,18 +1116,15 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% En este caso, las coordenadas |X| tampoco aceptan valores negativos ni versión con asterisco |*|.
%
-% }
-%
%
% \subsubsection{Espaciado entre distintas partes. Estilo de los recuadros\label{subsec:espacioslineas}}
%
% Podemos cambiar distintos valores del espaciado interno en la factura, así como también la estética de la línea para firmar y los recuadros que encierran los datos del cliente, la descripción, las “notas”, pudiendo ajustarle estos recuadros o cajas el grosor de la línea, la curvatura y la sombra. Los argumentos de todos estos comandos son dimensiones de \LaTeX{}:
%
-% {\setlength{\parindent}{0pt}
%
% \DescribeMacro{\SepVertical}{\macrooptcolor|\SepVertical|\marg{sep. vertical entre elementos}}
%
-% Las distintas partes de la factura (a saber: el encabezado con los datos, la -opcional- nota previa, el cuadro de la factura, la -opcional- nota externa y la -opcional- descripción) también están separadas entre sí una distancia que puede ser cambiada.
+% Las distintas partes con posiciones no fijas de la factura (a saber: el encabezado con los datos, la -opcional- nota previa, el cuadro de la factura, la -opcional- nota externa y la -opcional- descripción) también están separadas entre sí una distancia que puede ser cambiada.
%
% La separación que se fija con este comando es la separación vertical mínima que queremos garantizar entre cada elemento a escribir en la factura, y puede ser ajustada automáticamente por la clase aumentándola cuando no hay relleno automático de espacios sobrantes (es decir, sin usar la opción |sinexpandir|). Cuando la descripción larga o el cuadro de la factura (usando la opción |expandecuadro|) toman su tamaño máximo, entonces la separación vertical entre cada elemento de la hoja es la dada con |\SepVertical|, o sea, la que queremos garantizar como la mínima separación entre esas partes.
%
@@ -1082,12 +1133,12 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% Esta macro nos proporciona una forma de cambiar la separación entre los recuadros o cajas donde van los datos del cliente y el resumen que sale a su lado. Naturalmente, si no se escribe un resumen saldría únicamente la caja de los datos del cliente, y esta separación no tendría efecto.
%
% \DescribeMacro{\SepEncabezado}
+% {\macrooptcolor|\SepEncabezado|\marg{sep. interna texto}}\\
% \DescribeMacro{\SepNotaPrevia}
+% {\macrooptcolor|\SepNotaPrevia|\marg{sep. interna texto}}\\
% \DescribeMacro{\SepDescripcion}
+% {\macrooptcolor|\SepDescripcion|\marg{sep. interna texto}}\\
% \DescribeMacro{\SepNotaFinal}
-% {\macrooptcolor|\SepEncabezado|\marg{sep. interna texto}}\newline
-% {\macrooptcolor|\SepNotaPrevia|\marg{sep. interna texto}}\newline
-% {\macrooptcolor|\SepDescripcion|\marg{sep. interna texto}}\newline
% {\macrooptcolor|\SepNotaFinal|\marg{sep. interna texto}}
%
% Con estas macros podemos controlar la distancia entre la línea del recuadro y el texto que hay en el recuadro, es decir, un margen interno entre el contorno de la caja y el texto para que no salga pegado a la línea que lo encierra. Esto es parte del diseño de \tikz de estos recuadros. Como puede verse, dicho margen para los datos del cliente y para el resumen se cambia con |\SepEncabezado|, los de la nota previa con |\SepNotaPrevia|, los de la descripción larga con |\SepDescripcion|, y los de la nota final con |\SepNotaFinal|.
@@ -1107,12 +1158,12 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% El segundo argumento de |\SepFilas| es la separación vertical entre las distintas líneas de la totalización en filas.
%
% \DescribeMacro{\LineaEncabezado}
+% {\macrooptcolor|\LineaEncabezado|\marg{grosor}\marg{curvatura esquinas}\marg{tamaño sombra}}\\
% \DescribeMacro{\LineaNotaPrevia}
+% {\macrooptcolor|\LineaNotaPrevia|\marg{grosor}\marg{curvatura esquinas}\marg{tamaño sombra}}\\
% \DescribeMacro{\LineaDescripcion}
+% {\macrooptcolor|\LineaDescripcion|\marg{grosor}\marg{curvatura esquinas}\marg{tamaño sombra}}\\
% \DescribeMacro{\LineaNotaFinal}
-% {\macrooptcolor|\LineaEncabezado|\marg{grosor}\marg{curvatura esquinas}\marg{tamaño sombra}}\newline
-% {\macrooptcolor|\LineaNotaPrevia|\marg{grosor}\marg{curvatura esquinas}\marg{tamaño sombra}}\newline
-% {\macrooptcolor|\LineaDescripcion|\marg{grosor}\marg{curvatura esquinas}\marg{tamaño sombra}}\newline
% {\macrooptcolor|\LineaNotaFinal|\marg{grosor}\marg{curvatura esquinas}\marg{tamaño sombra}}
%
% La información del encabezado (datos del cliente y resumen), así como la nota previa, la descripción y la nota final puede o no tener el diseño \tikz, el cual viene prehecho en el archivo |.def| y consiste en una línea curva, en algunos casos sombreada a la derecha y abajo, y en otros casos no. Esa línea puede ser alterada en su grosor, el tamaño de la sombra, y la distancia entre la línea y la información, es decir un margen interno. Para eso estos comandos, que se comportan igual todos ellos.
@@ -1239,7 +1290,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% Con |\FormatoFecha|, al tener todos sus argumentos opcionales, el usuario podrá especificar solamente el primero (que va entre corchetes), solamente el segundo (entre llaves), pero para especificar el tercero que también está entre llaves debe especificar el segundo, ya que ambos son opcionales pero se dan igualmente entre llaves. Naturalmente podrá especificar dos de estos argumentos o los tres.
%
-% Por ejemplo: |\FormatoFecha[mm-dd-aaaa]{mmddyyyy}{.}| serviría para que el usuario pueda dar la fecha así: |\Fecha{12-31-2019}| y que salga igualmente según el formato |mm-dd-aaaa| pero separado por puntos. También puede usarse |\FormatoFecha[aaaa-mm-dd]| para dar luego la fecha de esta forma: |\Fecha{2019-12-31}| pero esta saldrá igual impresa en la factura así: “|31-12-2019|”, ya que no cambiamos el formato de salida. También puede hacer |\FormatoFecha{mmddyyyy}{/}| y dar la fecha por ejemplo así: |\Fecha*{2019}{12}{31}| y saldrá impresa así: “|12/31/2019|”.
+% Por ejemplo: |\FormatoFecha[mm-dd-aaaa]{mmddyyyy}{.}| serviría para que el usuario pueda dar la fecha así: |\Fecha{12-31-2020}| y que salga igualmente según el formato |mm-dd-aaaa| pero separado por puntos. También puede usarse |\FormatoFecha[aaaa-mm-dd]| para dar luego la fecha de esta forma: |\Fecha{2020-12-31}| pero esta saldrá igual impresa en la factura así: “|31-12-2020|”, ya que no cambiamos el formato de salida. También puede hacer |\FormatoFecha{mmddyyyy}{/}| y dar la fecha por ejemplo así: |\Fecha*{2020}{12}{31}| y saldrá impresa así: “|12/31/2020|”.
%
% Los valores predeterminados cambiables con |\FormatoFecha| están definidos, como siempre, en el archivo |factura.def|.
%
@@ -1249,14 +1300,11 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% La fecha calculada automáticamente se guarda en el identificador “\texttt{FechaVencimiento}” perteneciente al paquete \texttt{datetime2}, de manera que el usuario podrá hacer uso de esta fecha con los comandos que este paquete provee.
%
-% }
-%
%
% \subsection{Descuentos en la totalización\label{subsec:dctototales}}
%
-% Podemos efectuar un descuento\footnote{Estas opciones de descuento en el subtotal no son compatibles con la opción de totalización en modo de |filas|, explicada en la sección \ref{sec:opciones}, y muy probablemente más adelante seguirán sin serlo.} sobre cualquiera de los subtotales; ese descuento puede ser porcentual (versión sin *) o dado en un monto fijo a sustraer del subtotal (variante con *). Podemos aplicar un descuento que aplique por igual a cualquier tipo de ítem con cualquier gravamen, o discriminado dependiendo del tipo de impuesto se aplica un descuento u otro.
+% Podemos efectuar un descuento\footnote{Estas opciones de descuento en el subtotal no son compatibles con la opción de totalización en modo de |filas|, explicada en la sección \ref{sec:opciones}, y muy probablemente más adelante seguirán sin serlo.} sobre cualquiera de los subtotales; ese descuento puede ser porcentual (versión sin “|*|”) o dado en un monto fijo a sustraer del subtotal (variante con “|*|”). Podemos aplicar un descuento que aplique por igual a cualquier tipo de ítem con cualquier gravamen, o discriminado dependiendo del tipo de impuesto se aplica un descuento u otro.
%
-% {\setlength{\parindent}{0pt}
%
% \DescribeMacro{\Descuento}{\macrooptcolor|\Descuento|\marg{porcentaje}}\\
% \DescribeMacro{\Descuento*}{\macrooptcolor|\Descuento*|\marg{monto}}
@@ -1290,22 +1338,46 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% Pone un resumen que va en una caja a la derecha de los datos del cliente, separado de esta en una distancia ajustable con el comando |\SepEncabezado|, que se describirá más adelante. Este resumen es opcional.
%
-% \DescribeMacro{\NotaPrevia}{\macrooptcolor|\NotaPrevia|\marg{texto}}
+% \DescribeMacro{\NotaPrevia}
+% {\macrooptcolor|\NotaPrevia|\marg{texto}}\\
+% \DescribeMacro{\NotaPrevia*}
+% {\macrooptcolor|\NotaPrevia*|\marg{texto}}\\
+% \DescribeMacro{\NotaPrevia**}
+% {\macrooptcolor|\NotaPrevia**|\marg{texto}}
%
% La nota previa es una nota que puede ponerse antes del cuadro de la factura. Sin especificarla no sale nota alguna. Dicha nota va en un recuadro \tikz cuyo aspecto puede cambiarse, como ya se mencionó en la sección \ref{subsec:espacioslineas} donde se explican las líneas o contornos.
%
-% \DescribeMacro{\NotaInterna}{\macrooptcolor|\NotaInterna|\marg{texto}}
+% \DescribeMacro{\NotaInterna}
+% {\macrooptcolor|\NotaInterna|\marg{texto}}\\
+% \DescribeMacro{\NotaInterna*}
+% {\macrooptcolor|\NotaInterna*|\marg{texto}}\\
+% \DescribeMacro{\NotaInterna**}
+% {\macrooptcolor|\NotaInterna**|\marg{texto}}
%
% La nota interna es una coletilla que aparece dentro del cuadro de la factura, por eso la llamamos interna (es interna al cuadro), por ejemplo si aplicamos un descuento podemos decir allí cerca de los totales a qué corresponde tal descuento, o para hacer alguna aclaratoria sobre lo que precede inmediatamente como algún ítem de la factura.
%
-% \DescribeMacro{\NotaExterna}{\macrooptcolor|\NotaExterna|\marg{texto}}
+% \DescribeMacro{\NotaExterna}
+% {\macrooptcolor|\NotaExterna|\marg{texto}}\\
+% \DescribeMacro{\NotaExterna*}
+% {\macrooptcolor|\NotaExterna*|\marg{texto}}\\
+% \DescribeMacro{\NotaExterna**}
+% {\macrooptcolor|\NotaExterna**|\marg{texto}}
%
% La nota externa es otro texto opcional que el usuario puede introducir y saldrá al terminar el cuadro de la factura, antes de la opcional descripción larga (comando |\Descripcion|). {\itshape La nota externa no tiene formato \tikz.}
%
-% \DescribeMacro{\NotaFinal}{\macrooptcolor|\NotaFinal|\marg{texto}}
+% \DescribeMacro{\NotaFinal}
+% {\macrooptcolor|\NotaFinal|\marg{texto}}\\
+% \DescribeMacro{\NotaFinal*}
+% {\macrooptcolor|\NotaFinal*|\marg{texto}}\\
+% \DescribeMacro{\NotaFinal**}
+% {\macrooptcolor|\NotaFinal**|\marg{texto}}
%
% Con este comando se establece el texto para la nota final\footnote{Antiguas condiciones de la factura, por ejemplo, para las condiciones de pago si se trata de una factura, o para las condiciones de una cotización.}. Es opcional; si no se define no sale texto alguno. También se puede destinar este espacio para un diseño (que haría el usuario) en el que se agreguen también algunas casillas para especificar la forma de pago.
%
+% Las cuatro notas diferentes (previa, interna, externa y final) aceptan dos asteriscos opcionales. Sin asteriscos, cualquier invocación al comando elimina la invocación previa de ese mismo comando, es decir, sustituye la nota, sólo tiene efecto la última vez que se ejecutó ese comando. Si se especifica un asterisco, el texto para esa nota queda al final del texto para esa misma nota en la invocación anterior. Si se especifican dos asteriscos, agrega el texto al principio del texto previamente especificado para esa nota.
+%
+% Por ejemplo, escribir \cs{NotaPrevia\{1234\}}\cs{NotaPrevia\{5678\}} hace que el resultante sea como escribir solamente \cs{NotaPrevia\{5678\}}. Por otra parte, hacer \cs{NotaPrevia\{1234\}}\cs{NotaPrevia*\{5678\}} resulta en que la nota previa quede como si se utilizara \cs{NotaPrevia\{12345678\}}. Finalmente, hacer \cs{NotaPrevia\{1234\}}\cs{NotaPrevia**\{5678\}} es lo mismo que hacer \cs{NotaPrevia\{56781234\}}.
+%
%
% \subsection{Estableciendo los parámetros relativos al reporte}
%
@@ -1323,7 +1395,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% Esta variante de |\FondoReporte| es para que la imagen esté visible {\bfseries en todas las páginas} y no solamente en la primera como con el comando anterior. Usando esta variante del fondo del reporte no es necesario usar |\InicioReporte| sino solamente establecer los márgenes del reporte de acuerdo a dicho fondo.
%
-% \DescribeMacro{\EstiloPagReporte}{\macrooptcolor|\EstiloPagReporte|\oarg{estilo primera página}\marg{estilo páginas restantes}}
+% \DescribeMacro{\EstiloPagina}{\macrooptcolor|\EstiloPagina|\oarg{estilo primera página}\marg{estilo páginas restantes}}
%
% Con este comando definimos el estilo de página para el reporte (véase el comando |\InfoPagina| y la subsección \ref{subsec:pagestyle}). El estilo de página es lo que cambiamos en \LaTeX{} con |\pagestyle|, o sea, lo relativo a las cabeceras y pies de página.
%
@@ -1335,7 +1407,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% La información que aparece como cabecera o como pie de página es la que damos con el comando |\InfoPagina|, explicado más adelante.
%
-% La clase provee varios estilos de página, que también se explicarán en la subsección \ref{subsec:pagestyle}. En los ejemplos de reportes se puede ver el comportamiento del comando |\EstiloPagReporte|.
+% La clase provee varios estilos de página, que también se explicarán en la subsección \ref{subsec:pagestyle}. En los ejemplos de reportes se puede ver el comportamiento del comando |\EstiloPagina|.
%
% \DescribeMacro{\InicioReporte}{\macrooptcolor|\InicioReporte|\marg{longitud}}
%
@@ -1368,9 +1440,47 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% Establece el texto que aparece en la cabecera o pie de página del reporte.
%
-% {\itshape Si se quiere usar esta opción debe hacerse luego de definir el título del reporte porque si no el comando |\TituloReporte*| establece de nuevo la variable que |\InfoPagina| cambia.}
+% {\itshape Si se quiere usar esta opción debe hacerse luego de definir el título del reporte porque si no el comando |\TituloReporte*| establece de nuevo la variable que |\InfoPagina| cambia.}
+%
+% En |factura.def| hay dos definiciones relativas a la información que aparece en las cabeceras o pies de página: aquella que pone el título en la cabecera/pié y aquella que no lo hace.
%
-% En |factura.def| hay dos definiciones relativas a la información que aparece en las cabeceras o pies de página: aquella que escribe el título y aquella que no, es decir, la que aplica con |\TituloReporte*| y la que aplica con |\TituloReporte|, que también el usuario podrá redefinir si lo necesita, pero lo más práctico sería usar esta macro para fijar el texto que se desee, y |\EstiloPagReporte| para fijarlo donde se quiera.
+% Recordemos que con |\TituloReporte| establecemos un título de un reporte, pero ese título de reporte sólo aparecerá centrado al principio sin ser parte de las cabeceras/piés de página, es decir, que al usar |\TituloReporte| o sin especificar un título de reporte, la información que aparece en las cabeceras y piés de página no referencia a un reporte sino a la factura asociada a él. Al usar |\TituloReporte*|, el título del reporte sí forma parte de estas regiones de la página. Cualquiera que sea la forma predeterminada según cuál variante se use para establecer el título del reporte, se puede cambiar la información de las cabeceras y piés de página con esta macro |\InfoPagina|, y se puede usar |\EstiloPagina| para fijarlo donde se quiera.
+%
+% Predeterminadamente, cuando no se tiene título en las cabeceras/piés, esta macro |\InfoPagina| toma la siguiente forma:
+%
+% \noindent\hfill{\footnotesize |\@LetraInfoPagina Reporte correspondiente a la factura número \@Num \space de fecha \@Fecha| \hfill\mbox{}}
+%
+% Y cuando se tiene título en las cabeceras o piés de página, la macro |\InfoPagina| toma la siguiente forma:
+%
+% \noindent\hfill{\footnotesize |\@LetraInfoPagina \@TituloReporte \space - \@Proveedor \space - \@Fecha| \hfill\mbox{}}
+%
+%
+% \subsection{Estableciendo los parámetros relativos a la notas de crédito o débito}
+%
+% \DescribeMacro{\NotaNum}{\macrooptcolor|\NotaNum|\marg{núm}}
+%
+% Establece el número de la factura que la nota de crédito o débito está corrigiendo por errores que repercuten en los montos monetarios. Esta macro establece el número de esa factura (anterior) que se está corrigiendo\footnote{Debe hacerse dentro del mismo período impositivo.}. Es necesario usar esta macro porque las notas de crédito y débito tienen una leyenda que debe indicar cuál es la factura (y su fecha) sobre la cual se elabora una nota de crédito o de débito. Ese texto está alojado en la macro |\TextoNotaDeCredito| para la nota de crédito y |\TextoNotaDeDebito| para la nota de débito y aparece como “nota interna” en el documento fiscal. Más adelante en la explicación de estas dos macros hay indicaciones sobre cómo cambiar el texto y cómo cambiar su ubicación.
+%
+% \DescribeMacro{\NotaFecha}{\macrooptcolor|\NotaFecha|\marg{fecha}}
+%
+% Con esta macro establecemos la fecha de la factura a corregir con la nota de crédito o débito. Aplican los mismos comentarios que para el comando anterior |\NotaNum|. El formato en el que esta fecha se presenta en la leyenda será el mismo formato en el que se presenta la fecha de emisión del documento, que puede cambiarse con |\FormatoFecha|. Lo predeterminado es el formato venezolano |dd-mm-aaaa|.
+%
+% Esta fecha de la factura a corregir con la nota se guarda el identificador “\texttt{NotaFecha}” del paquete \texttt{datetime2} y podrá ser usado en cualquier parte del documento de la manera como se manipulan las fechas en este paquete.
+%
+% \DescribeMacro{\NotaFecha*}{\macrooptcolor|\NotaFecha*|\marg{aaaa}\marg{mm}\marg{dd}}
+%
+% Con |\NotaFecha*|, al igual que con |\Fecha*|, podemos dar la fecha en formato ISO: primero el año, luego el mes y luego el dia, gracias a la interfaz de \texttt{datetime2}. Esto no afecta la presentación de la fecha en el documento sino la forma como se la suministramos a la clase.
+%
+% \DescribeMacro{\TextoNotaDeCredito}
+% \DescribeMacro{\TextoNotaDeDebito}
+%% En las notas de crédito y débito, la leyenda aclaratoria de a cuál factura se hace referencia está alojada en estas macros, definidas en |factura.def|. Estas macros |\TextoNotaDeCredito| y |\TextoNotaDeDebito| están definidas de la siguiente forma:
+%
+% \begin{center}
+% |Nota de crédito sobre la factura \NotaNum \space de fecha \NotaFecha.| \par
+% |Nota de débito sobre la factura \NotaNum \space de fecha \NotaFecha.|
+% \end{center}
+%
+% respectivamente. Se pueden redefinir con |\renewcommand| para cambiar el texto. Por otra parte, si se quiere que se imprima ese texto en otra ubicación y no como nota interna, habría que anular la nota interna con |\AtEndPreamble{\NotaInterna{}}| y luego establecer el texto en otra ubicación. Es necesario anular la nota interna con |\AtEndPreamble| por la forma como la leyenda se establece en la clase, y se puede fijar la leyenda en cualquier otra parte como la nota externa, la nota final, la nota previa o la descripción, por ejemplo así |\NotaExterna{\TextoNotaDeCredito}|.
%
%
% \subsection{Definiciones en archivos separados \label{subsec:aux}}
@@ -1381,8 +1491,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% La macro |\Cliente| incluye un archivo cuya extensión debe ser |.def| o |.tex|, de la misma forma como se hace con |\input|; es simplemente un atajo que además lee archivos |.def|.
%
-% }
-%
%
% \section{La factura\label{sec:factura}}
%
@@ -1408,12 +1516,11 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% \subsection{Agregando elementos a la factura}
%
-% \noindent
-% {\macromandcolor|\Item|\marg{cantidad}\marg{descripción}\oarg{descripción para csv}\marg{precio unitario}\oarg{descripción sólo para \\ \mbox{}\hfill referencias}}
% \DescribeMacro{\Item}
% \DescribeMacro{\ItemR}
% \DescribeMacro{\ItemA}
% \DescribeMacro{\ItemE}
+% {\macromandcolor|\Item|\marg{cantidad}\marg{descripción}\oarg{descripción para csv}\marg{precio unitario}\oarg{descripción \\ \mbox{}\hfill sólo para referencias}}
%
% Con estos comandos agregamos elementos a la factura propiamente dicha. Con |\Item| agregamos un elemento gravado con IVA general (actualmente 12\%); con |\ItemR| agregamos uno con IVA reducido (8\%), con |\ItemA| uno con IVA adicional (27\%), y con |\ItemE| agregamos un elemento exento de impuesto al valor agregado.
%
@@ -1423,25 +1530,22 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% También tenemos la posibilidad de agregar un ítem al que no le ponemos precio, por ejemplo por ser parte de un total, y sus argumentos son la cantidad y la descripción nada más.
%
-% \noindent
% \DescribeMacro{\ItemX}{\macrooptcolor|\ItemX|\marg{cantidad}\marg{descripción}\oarg{descripción para csv}\oarg{descripción sólo para referencias}}
%
%
% \subsubsection{Opción `{\ttfamily descuentos}'\label{subsec:descuentos}}
%
-% \noindent
-% {\macromandcolor|\Item|\marg{cantidad}\marg{descripción}\oarg{descripción para csv}\marg{precio unitario}\marg{\% descuento} \\ \mbox{}\hfill \oarg{descripción sólo para referencias}}
% \DescribeMacro{\Item}
% \DescribeMacro{\ItemR}
% \DescribeMacro{\ItemA}
% \DescribeMacro{\ItemE}
+% {\macromandcolor|\Item|\marg{cantidad}\marg{descripción}\oarg{descripción para csv}\marg{precio unitario}\marg{\% descuento} \\ \mbox{}\hfill \oarg{descripción sólo para referencias}}
%
% Cuando pedimos descuentos individuales (opción |descuentos| al cargar la clase), todas las macros |\Item| tienen un posible\footnote{Es un argumento opcional, aunque va entre llaves como todos los demás.} argumento más al final que es el descuento porcentual. No especificarlo da el mismo resultado que un descuento de 0\% sobre ese ítem:
%
%
% \subsubsection{Opción `{\ttfamily sincantidad}'\label{subsec:sincantidad}}
%
-% \noindent
% \DescribeMacro{\Item}
% \DescribeMacro{\ItemR}
% \DescribeMacro{\ItemA}
@@ -1452,7 +1556,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% Por otra parte, si se usa la opción |sincantidad| al cargar la clase, todos los comandos |\Item| aceptan un argumento menos, que es el de la cantidad; eso significa que sin usar la opción |descuentos|, la sintaxis de |\Item| queda como lo indica la primera línea, y usando |descuentos|, queda como lo indica la segunda línea.
%
-% \noindent
% \DescribeMacro{\ItemX}{\macrooptcolor|\ItemX|\marg{descripción}\oarg{descripción para csv}\oarg{descripción sólo para referencias}}
%
% Puesto que |\ItemX| se usa para elementos sin precio, al usar |sincantidad| quedará aceptando sólo un argumento obligatorio que es la descripción y dos opcionales para la descripción en el archivo |.csv| y la descripción larga para referenciar luego. Cuando se activa la opción |descuentos|, |\ItemX| queda igual puesto que esta macro no lleva precio, entonces tampoco acepta descuentos.
@@ -1464,7 +1567,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% Una vez terminado el entorno de la factura se puede escribir una descripción larga que saldrá en una caja -cuyo estilo puede cambiarse-\footnote{El diseño de esta descripción consiste en su linea de contorno, cambiable como ya explicamos en la subsección \ref{subsec:espacioslineas}, específicamente con la macro \cs{LineaDescripcion}.} debajo del cuadro de la factura, esto va dentro de un |\parbox| en la implementación de la caja. Si esta descripción no se escribe, simplemente no va a aparecer nada debajo del cuadro de la factura.
%
-% \noindent \DescribeMacro{\Descripcion}
+% \DescribeMacro{\Descripcion}
% {\macrooptcolor|\Descripcion|\marg{texto en formato de párrafos}}
%
% {\itshape Como podemos ver, |\Descripcion| es otro de los pocos comandos que no se usan en el preámbulo sino dentro del documento, jústamente al terminar el ambiente} |factura|.
@@ -1529,7 +1632,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% \subsection{Estilos de página para el reporte\label{subsec:pagestyle}}
%
-% La clase define varios estilos de página\footnote{Usables en el reporte únicamente.} de \LaTeX{}, cambiables con los comandos usuales: |\pagestyle| y |\thispagestyle| dentro del entorno del reporte, pero es mejor definir el estilo de página en el preámbulo del documento, con |\EstiloPagReporte|.
+% La clase define varios estilos de página\footnote{Usables en el reporte únicamente.} de \LaTeX{}, cambiables con los comandos usuales: |\pagestyle| y |\thispagestyle| dentro del entorno del reporte, pero es mejor definir el estilo de página en el preámbulo del documento, con |\EstiloPagina|.
%
% Estos estilos de página están definidos con el paquete |fancyhdr|, y son: \begin{inparaenum}[\bfseries i)]\item |plain|, \item |empty|, \item |soloarriba|, \item |soloabajo|, y \item |solonumpag|\end{inparaenum}.
%
@@ -1537,11 +1640,11 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% El formato con la información a poner en estas partes de las páginas del reporte es cambiable con |\InfoPagina|, descrito anteriormente.
%
-% Cuando se usa |\FondoReporte*|, como se supone que se usa para un membrete en todas las páginas, el estilo de página predeterminado del reporte será |soloabajo|, para todas las páginas, porque no tendría sentido tener un membrete en todas las páginas y una cabecera como la descrita anteriormente. Si el comando |\FondoReporte*| se está usando para algo distinto de un membrete, por ejemplo una marca de agua, entonces es probable querer cambiar los estilos de página con |\EstiloPagReporte|.
+% Cuando se usa |\FondoReporte*|, como se supone que se usa para un membrete en todas las páginas, el estilo de página predeterminado del reporte será |soloabajo|, para todas las páginas, porque no tendría sentido tener un membrete en todas las páginas y una cabecera como la descrita anteriormente. Si el comando |\FondoReporte*| se está usando para algo distinto de un membrete, por ejemplo una marca de agua, entonces es probable querer cambiar los estilos de página con |\EstiloPagina|.
%
% Si se usa |\FondoReporte|, el estilo predeterminado para la primera página será |solonumpag|, y |plain| para el resto de las páginas, y si se no se especifica fondo alguno, entonces el estilo de página predeterminado para todas las páginas será |plain|.
%
-% El usuario podrá definir más estilos de página adicionales para colocar el texto que se quiera en el lugar que se quiera, y usar esos estilos de página con |\EstiloPagReporte|. Para eso puede leer la documentación del paquete |fancyhdr|, que es lo que esta clase usa para los estilos de página. También puede consultar |factura.def|, que es donde están predefinidos los estilos que trae la clase.
+% El usuario podrá definir más estilos de página adicionales para colocar el texto que se quiera en el lugar que se quiera, y usar esos estilos de página con |\EstiloPagina|. Para eso puede leer la documentación del paquete |fancyhdr|, que es lo que esta clase usa para los estilos de página. También puede consultar |factura.def|, que es donde están predefinidos los estilos que trae la clase.
%
% El grosor de la línea decorativa que coloca el paquete |fancyhdr| está definido en el archivo |.def|, y es cambiable en la macro |\@GrosorLineaInfoPag| como podrá verse en dicho archivo; no definimos un comando para ello por no ser algo relevante pero igual podrá cambiarse con |\renewcommand| por ejemplo, como se hace en dicho |.def|.
%
@@ -1552,7 +1655,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% Cuando en lo sucesivo nos referiremos a tipografía, tipo de letra, o letra, nos estaremos refiriendo a cualquier cambio en la tipografía que pueda significar el nombre de la letra, su tamaño o atributos como negritas, es decir, mediante cualquiera de estos comandos podemos cambiar cualquier aspecto de la tipografía. Mirando el archivo |.def| pueden verse todos los valores predeterminados, que la mayoría de ellos son simplemente cambios en el tamaño (macro |\fontsize| de \LaTeX{}), y en algunos casos negritas.
%
-% {\setlength{\parindent}{0pt}
+%
% \DescribeMacro{\LetraItems}{\macrooptcolor|\LetraItems|\marg{tipo de letra}}
%
% Con este comando cambiamos la tipografía utilizada en los ítems o elementos que están en el cuadro de la factura, de manera que {\itshape cambiar la longitud \cs{baselineskip} con el segundo argumento de \cs{fontsize} hará que la tabla tenga una altura distinta de las celdas.}
@@ -1623,9 +1726,13 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% Para cambiar la tipografía de la nota final se hace con este comando. (Aplica el mismo comentario que para la descripción y el resumen).
%
+% \DescribeMacro{\LetraFormalibre}{\macrooptcolor|\LetraFormalibre|\marg{tipo de letra}}
+%
+% Con este comando podemos cambiar la tipografía del texto “FORMA LIBRE” que debe salir solamente en las prefacturas puesto que ese texto va impreso en todas las hojas fiscales.
+%
% \DescribeMacro{\LetraDenom}{\macrooptcolor|\LetraDenom|\marg{tipo de letra}}
%
-% La tipografía asociada a la denominación del documento, es decir, al lado del número (e.g. “FACTURA” o “COTIZACIÓN”), y la asociada al texto “No. CONTROL” se cambia con |\LetraDenom|.
+% La tipografía asociada a la denominación del documento, es decir, al lado del número (e.g. “FACTURA” o “COTIZACIÓN”), y la asociada al texto “No. CONTROL” (este último para prefacturas) se cambia con |\LetraDenom|.
%
% \DescribeMacro{\LetraNumeracion}{\macrooptcolor|\LetraNumeracion|\marg{tipo de letra}}
%
@@ -1651,14 +1758,12 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% Finalmente, para cambiar la tipografía con la que se inicia el reporte tenemos este comando. Obviamente también luego se puede hacer cualquier cambio dentro del ambiente |reporte|.
%
-% }
-%
%
% \section{Etiquetas y referencias a ítems de la factura\label{sec:etiquetas}}
%
% Esta clase |factura| soporta agregar etiquetas a cada elemento de la factura que luego en el reporte o en casi cualquier otra parte queramos referenciar; {\slshape no se pueden referenciar etiquetas solamente en la nota previa ni en el resumen.}
%
-% \noindent \DescribeMacro{\label}{\macrooptcolor|\label|\marg{etiqueta}}
+% \DescribeMacro{\label}{\macrooptcolor|\label|\marg{etiqueta}}
%
% Para ello usamos la conocida macro |\label| de \LaTeX{} justamente después del ítem que nos interese luego referenciar, por ejemplo (usando descuentos individuales):
%
@@ -1682,15 +1787,15 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% De esta forma creamos una etiqueta llamada “el-otro” para el segundo elemento, que luego podremos citar por ejemplo en la descripción larga o en el reporte con comandos similares a los que \LaTeX{} provee para referenciar etiquetas.
%
-% \noindent \DescribeMacro{\itemref}{\macrooptcolor|\itemref|\marg{etiqueta}}\\
-% \noindent \DescribeMacro{\cantref}{\macrooptcolor|\cantref|\marg{etiqueta}}\\
-% \noindent \DescribeMacro{\descref}{\macrooptcolor|\descref|\marg{etiqueta}}\\
-% \noindent \DescribeMacro{\puref}{\macrooptcolor|\puref|\marg{etiqueta}}\\
-% \noindent \DescribeMacro{\subtref}{\macrooptcolor|\subtref|\marg{etiqueta}}\\
-% \noindent \DescribeMacro{\dctoref}{\macrooptcolor|\dctoref|\marg{etiqueta}}\\
-% \noindent \DescribeMacro{\ivaref}{\macrooptcolor|\ivaref|\marg{etiqueta}}\\
-% \noindent \DescribeMacro{\ptref}{\macrooptcolor|\ptref|\marg{etiqueta}}\\
-% \noindent \DescribeMacro{\ldescref}{\macrooptcolor|\ldescref|\marg{etiqueta}}\par
+% \DescribeMacro{\itemref}{\macrooptcolor|\itemref|\marg{etiqueta}}\\
+% \DescribeMacro{\cantref}{\macrooptcolor|\cantref|\marg{etiqueta}}\\
+% \DescribeMacro{\descref}{\macrooptcolor|\descref|\marg{etiqueta}}\\
+% \DescribeMacro{\puref}{\macrooptcolor|\puref|\marg{etiqueta}}\\
+% \DescribeMacro{\subtref}{\macrooptcolor|\subtref|\marg{etiqueta}}\\
+% \DescribeMacro{\dctoref}{\macrooptcolor|\dctoref|\marg{etiqueta}}\\
+% \DescribeMacro{\ivaref}{\macrooptcolor|\ivaref|\marg{etiqueta}}\\
+% \DescribeMacro{\ptref}{\macrooptcolor|\ptref|\marg{etiqueta}}\\
+% \DescribeMacro{\ldescref}{\macrooptcolor|\ldescref|\marg{etiqueta}}\par
%
% Si se quiere mostrar el número de la línea que ocupa el ítem en la lista lo hacemos con |\itemref|, que en el ejemplo aparecería el número “|2|” indicando que es el segundo ítem de la factura\footnote{Cuando se usa \cs{itemref} conviene enumerar los ítems en la factura con la opción \texttt{numitem}.}. Con |\cantref| escribimos la cantidad del elemento citado mediante la etiqueta, en nuestro ejemplo sería “|3|”. Para la descripción del ítem usamos |\descref|, que en el caso del ejemplo sería el texto “|Otro artículo gravado con IVA general|”. Para el precio unitario usamos |\puref|, en el ejemplo “|1.500,00|”. El subtotal lo mostraríamos con |\subtref|; en nuestro caso “|4.500,00|”. Si se quiere mostrar el porcentaje del descuento del ítem citado usamos |\dctoref|, que para el ejemplo sería “|10|”. Para el porcentaje del IVA, usamos |\ivaref|, en nuestro caso escribiría “|12|”. Por último, para mostrar el precio total usamos |\ptref|, y en nuestro ejemplo eso escribiría “|4.050,00|” puesto que aplicamos un descuento del 10\%.
%
@@ -1702,12 +1807,11 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% Con la asignación de estas etiquetas y su uso mediante las referencias podemos de manera conveniente citar cualquier ítem que se haya facturado, de manera dinámica sin tener que reescribir en la descripción larga o en el reporte aquello que ya se escribió en el cuadro de la factura. Para estas referencias se escogieron nombres de las macros que terminan en “\texttt{ref}” por compatibilidad con comandos de \LaTeX{} como |\pageref|.
%
%
-%
% \section{Referenciar los valores establecidos en el preámbulo y los totales\label{sec:ref}}
%
-% En el preámbulo el usuario definió distintas macros, es decir, estableció la razón social del cliente, el R.I.F. y la dirección, entre otras cosas. Cualquiera de esas definiciones hechas en el preámbulo puede usarse luego en otra parte del documento con el mismo comando que se usó para su definición. Lo anterior significa que tenemos las siguientes macros posibles para usar dentro del cuerpo del documento (factura, reporte o reverso): |\Moneda|, |\RazonSocial|, |\RIF|, |\Direccion|, |\Telefono|, |\Email|, |\Contacto|, |\Emisor|, |\Conforme|, |\Proveedor|, |\Fecha|, |\FechaVencimiento|\footnote{La fecha de vencimiento no se establece en el preámbulo explícitamente sino a través de \cs{Credito} pero la clase dispone de esta interfaz para acceder a ella así como también con la interfaz dada por \texttt{datetime2}.}, |\Credito|, |\Num|, |\NumControl|, |\NumSerieControl|, |\Resumen|, |\NotaPrevia|, |\NotaInterna|, |\NotaExterna|, |\NotaFinal|, |\TituloReporte|.
+% En el preámbulo el usuario definió distintas macros, es decir, estableció la razón social del cliente, el R.I.F. y la dirección, entre otras cosas. Cualquiera de esas definiciones hechas en el preámbulo puede usarse luego en otra parte del documento con el mismo comando que se usó para su definición. Lo anterior significa que tenemos las siguientes macros posibles: |\Moneda|, |\RazonSocial|, |\RIF|, |\Direccion|, |\Telefono|, |\Email|, |\Contacto|, |\Emisor|, |\Conforme|, |\Proveedor|, |\Fecha|, |\NotaFecha|, |\FechaVencimiento|\footnote{La fecha de vencimiento no se establece en el preámbulo explícitamente sino a través de \cs{Credito} pero la clase dispone de esta interfaz para acceder a ella así como también con la interfaz dada por \texttt{datetime2}.}, |\Credito|, |\Num|, |\NumControl|, |\NumSerieControl|, |\NotaNum|, |\Resumen|, |\NotaPrevia|, |\NotaInterna|, |\NotaExterna|, |\NotaFinal|, |\TituloReporte|. Cualquiera de estas macros se puede usar cualquier parte del documento, ya no con la misma función para definir valores como en el preámbulo.
%
-% Esas macros, en el preámbulo funcionan para definir valores y textos, pero si ya no estamos en el preámbulos sino dentro del cuerpo del documento y escribimos una de esas macros\footnote{Dentro del cuerpo del documento estas macros obviamente no aceptan argumentos.}, lo que nos va a escribir será lo que está definido bajo esa macro, así sea con macros que no llegamos a utilizar explícitamente pero que tienen un valor predefinido como |\Moneda|.
+% Esas macros, en el preámbulo funcionan para definir valores y textos, pero si ya no estamos en el preámbulo sino dentro del cuerpo del documento y escribimos una de esas macros\footnote{Dentro del cuerpo del documento estas macros obviamente no aceptan argumentos.}, nos va a servir para escribir lo que se definió en el preámbulo bajo esa macro, así sea con macros que no llegamos a utilizar explícitamente pero que tienen un valor predefinido como |\Moneda|.
%
% Por otra parte, en el documento el usuario también podrá referirse a cualquiera de los totales de la siguiente tabla\footnote{Las macros de la tabla, para representarlas en el mismo formato que en la factura, debemos usar la macro \cs{numprint}.}:
%
@@ -1723,7 +1827,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% \hline
% \end{tabular}
%
-% También ya mencionamos que la fecha de emisión y vencimiento se pueden acceder con la interfaz dada por el paquete |datetime2|, por ejemplo, para mostrar la fecha de emisión, podremos usar tanto |\Fecha| como |\DTMusedate{FechaEmision}|, y para la fecha de vencimiento, tanto |\FechaVencimiento| como |\DTMusedate{FechaVencimiento}|.
+% También ya mencionamos que la fecha de emisión y vencimiento se pueden acceder con la interfaz dada por el paquete |datetime2|, por ejemplo, para mostrar la fecha de emisión, podremos usar tanto |\Fecha| como |\DTMusedate{FechaEmision}|. Para la fecha de vencimiento, tanto |\FechaVencimiento| como |\DTMusedate{FechaVencimiento}|, y para la fecha de la factura a la que la nota de crédito/débito hace referencia, |\NotaFecha| o |\UDMusedate{NotaFecha}|.
%
% La cantidad de ítems en la factura la podemos acceder via el contador |NumItem|, por ejemplo así |\arabic{NumItem}|.
%
@@ -1732,7 +1836,8 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% \section{Más personalizaciones}
%
-% \DescribeMacro{\@BeforeEndPreamble}
+% \DescribeMacro{\BeforeEndPreamble}{\macrooptcolor|\BeforeEndPreamble|\marg{código \TeX}}
+%
% La clase provee de un “gancho” llamado \cs{BeforeEndPreamble}. Lo que allí se agregue (es acumulativo, se puede ejecutar mas de una vez) será ejecutado por la clase |factura| luego de que hayan sido evaluadas las opciones de la clase y tomadas todas las decisiones en cuanto a opciones que impliquen otras opciones o que sean incompatibles con otras opciones; una vez que todas esas decisiones fueron tomadas y todo queda establecido, se ejecuta \cs{BeforeEndPreamble}, esto con el propósito de que el usuario pueda personalizar más el comportamiento de sus archivos |.tex|. Por ejemplo si el usuario hace lo siguiente, no funcionará:
%
% \iffalse
@@ -1777,8 +1882,17 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
% De esta forma, el condicional se evaluará después de que se hayan establecido todas las opciones (en este caso, |cotizacion|) y el usuario podrá inclusive apagar opciones y encenderlas nuevamente usando los condicionales (como se explicó en la subsección \ref{subsec:condicionales} porque después de ejecutar este gancho, automáticamente se volverán a evaluar las opciones y a tomar todas las decisiones de implicaciones y compatibilidades.
%
-% \newpage
+% \DescribeMacro{\BeforeEndPreamble*}{\macrooptcolor|\BeforeEndPreamble*|\marg{código \TeX}}
+%
+% Con esta versión de \cs{BeforeEndPreamble}, cualquier invocación previa de esta macro queda eliminada, deja de funcionar en modo “{\slshape append}”.
+%
+% \DescribeMacro{\BeforeEndPreamble**}{\macrooptcolor|\BeforeEndPreamble**|\marg{código \TeX}}
+%
+% Con esta versión de \cs{BeforeEndPreamble}, lo agregado pasa a ocupar el primer lugar, es decir, las invocaciones previas de esta macro quedan después, funcionando así en modo “{\slshape prepend}”.
+%
+%
% \DescribeMacro{\@PosicionaFechas}
+% \DescribeMacro{\@PosicionaFormalibre}
% \DescribeMacro{\@PosicionaDenom}
% \DescribeMacro{\@PosicionaNumControl}
% \DescribeMacro{\@PosicionaNotaFinal}
@@ -1789,38 +1903,39 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% \DescribeMacro{\@EscribeNotaFinal}
% \DescribeMacro{\@EscribeNotaPrevia}
% \DescribeMacro{\@DibujaLinea}
+% \indent También es posible darle aspecto distinto a muchas de las partes que conforman la factura. Internamente en la clase, cada parte es ubicada en la hoja con un comando y su contenido es escrito en el papel con otro comando. Los comandos que más probablemente son sujetos a ser cambiados por el usuario son los comandos que escriben el texto más que aquellos que lo ubican en la hoja, por tal razón, los comandos que posicionan aquello que va a escribirse lo definimos dentro del archivo |.cls|, y los que propiamente escriben cada parte de la hoja están definidos en el |.def|. Ambas fuentes las podrán consultar los usuarios para mayor comprensión, y para la total personalización. Recomendamos empezar por el archivo de definiciones |factura.def|.
+%
% \DescribeMacro{\@EscribeItemsEnCSV}
% \DescribeMacro{\@EscribeTotalesEnCSV}
% \DescribeMacro{\@EncabezadoFactura}
% \DescribeMacro{\@EncabezadoReporte}
-% También es posible darle aspecto distinto a muchas de las partes que conforman la factura. Internamente en la clase, cada parte es ubicada en la hoja con un comando y su contenido es escrito en el papel con otro comando. Los comandos que más probablemente son sujetos a ser cambiados por el usuario son los comandos que escriben el texto más que aquellos que lo ubican en la hoja, por tal razón, los comandos que posicionan aquello que va a escribirse lo definimos dentro del archivo |.cls|, y los que propiamente escriben cada parte de la hoja están definidos en el |.def|. Ambas fuentes las podrán consultar los usuarios para mayor comprensión, y para la total personalización. Recomendamos empezar por el archivo de definiciones |factura.def|.
-%
-% Estas macros son internas y sirven para, como dijimos antes, que \LaTeX{} se prepare para escribir el texto en la hoja; todas empiezan con |\@Posiciona| y no debe ser común necesitar cambiarlas.
+% \indent Estas macros son internas y sirven para, como dijimos antes, que \LaTeX{} se prepare para escribir el texto en la hoja; todas empiezan con |\@Posiciona| y no debe ser común necesitar cambiarlas.
%
% Todas estas macros llaman a su correspondiente macro con el estilo del elemento a escribir, que comienza con |\@Estilo|, y con cambiar su contenido podemos cambiar la forma como es escrita esa parte de la factura en la hoja.
%
% \DescribeMacro{\@EstiloFechas}
+% \DescribeMacro{\@EstiloFormalibre}
% \DescribeMacro{\@EstiloDenom}
% \DescribeMacro{\@EstiloNumControl}
% \DescribeMacro{\@EstiloNotaPrevia}
% \DescribeMacro{\@EstiloNotaFinal}
% \DescribeMacro{\@EstiloFirmas}
+% \DescribeMacro{\@EstiloParrafoReporte}
+% \indent Estas últimas son las que están definidas dentro de |factura.def|, y que eventualmente puede desearse cambiarlas.
+%
+% Adicionalmente están las macros que se encargan de distintas partes de la factura y del reporte como los datos del cliente, el resumen, la nota previa, la nota final, los encabezados, la información en el archivo |.csv|, y la macro que dibuja la línea que inutiliza el espacio en blanco. Todas estas son macros internas que no deben ser llamadas por el usuario, y no consideramos que pueda sea necesario cambiarlas.
+%
% \DescribeMacro{\@DatosTIKZ}
% \DescribeMacro{\@NotaPreviaTIKZ}
% \DescribeMacro{\@DescripcionTIKZ}
% \DescribeMacro{\@NotaFinalTIKZ}
-% Estas últimas son las que están definidas dentro de |factura.def|, y que eventualmente puede desearse cambiarlas.
-%
-% Adicionalmente están las macros que se encargan de distintas partes de la factura y del reporte como los datos del cliente, el resumen, la nota previa, la nota final, los encabezados, la información en el archivo |.csv|, y la macro que dibuja la línea que inutiliza el espacio en blanco. Todas estas son macros internas que no deben ser llamadas por el usuario, y no consideramos que pueda sea necesario cambiarlas.
-%
-% Por último, las macros que alojan el diseño \tikz de los datos del cliente, la nota previa, la descripción larga y la nota final son |\@DatosTIKZ|, |\@NotaPreviaTIKZ|, |\@DescripcionTIKZ| y |\@NotaFinalTIKZ|; están definidas en el archivo |factura.def|.
+% \indent Por último, las macros que alojan el diseño \tikz de los datos del cliente, la nota previa, la descripción larga y la nota final son |\@DatosTIKZ|, |\@NotaPreviaTIKZ|, |\@DescripcionTIKZ| y |\@NotaFinalTIKZ|; están también definidas en el archivo |factura.def|.
%
% Cualquiera de estas macros que se quiera redefinir habría que hacerlo en el preámbulo del |.tex| y encerrándolas entre |\makeatletter| y |\makeatother| para poder redefinir una macro que contiene un símbolo “|@|”.
%
% {\bfseries \itshape Finalmente, como dijimos en la sección \ref{subsec:aux}, una vez adecuada la clase al diseño que se quiere, se podrán escribir todos los comandos que hacen estos ajustes en un} |.tex| {\itshape o} |.def| {\itshape y cargarlo con} |\input|, |\include| {\itshape o con} |\Cliente|, pudiendo discriminar por clientes dicha personalización.
%
%
-%
% \newpage
% \setstretch{1}
% \section{Tabla con todas las opciones}
@@ -1834,10 +1949,9 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% centrado & Centra los totales en el modo de filas. \\
% conlineasha & Dibuja una línea separando los artículos entre sí. \\
% conreporte & Produce la factura y el reporte. \\
-% cotización & Imprime una cotización. \\
+% cotizacion & Produce una cotización. \\
% csv & Genera un archivo |.csv| con la información numérica de la factura. \\
% dcu & Descripción, cantidad, precio unitario. \\
-% denom & Explicita la denominación del documento. \\
% descuentos & A cada artículo se le puede asignar un descuento individual. \\
% dosfirmas & Incluye los dos espacios para firmar. \\
% duc & Descripción, precio unitario, cantidad. \\
@@ -1849,9 +1963,19 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% iva & Expresa en otra columna el porcentaje de IVA para cada elemento a facturar. \\
% linea & Dibuja una línea que inutiliza el espacio en blanco en el cuadro de la factura. \\
% nospanish & No carga |babel| ni |fontenc|. \\
-% numitem & Enumera los ítems en la factura en otra columna extra al principio. \\
-% prefactura & Imprime una prefactura. \\
+% numitem & Enumera los ítems en la factura bajo otra columna extra al principio. \\
+% notadecredito & Produce una nota de crédito. \\
+% notadedebito & Produce una nota de débito. \\
+% prefactura & Produce una prefactura. \\
+% \end{tabular}
+% \newpage
+% \noindent \begin{tabular}{>{\ttfamily}ll}
+% \rmfamily \bfseries Opción & \bfseries Significado \\ \hline
% sincantidad & Los artículos van sin expresar su cantidad. \\
+% sindenom & No escribe la denominación del documento ni el número. \\
+% \footnotesize sinencabezadofactura & No escribe los datos del cliente al inicio de la factura. \\
+% \footnotesize sinencabezadoreporte & No escribe la identificación del cliente y el proveedor \\
+% & al inicio del reporte. \\
% sinexpandir & No expande elementos en la factura. \\
% sinfirmas & No incluye espacios para firmar. \\
% siniva & No incluye IVA, pero lo deja expresado. \\
@@ -1868,7 +1992,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% sinmarcas & No escribe el carácter de fin de línea ni el carácter en las celdas vacías \\
% & cuando la descripción ocupa más que una línea. \\
% sinmonedatotales & Quita el signo monetario de las totalizaciones. \\
-% sinnumero & No pone el número cuando se usa |denom|. \\
+% sinnumero & No pone el número del documento, cuando no se usa |sindenom|. \\
% sintotales & No escribe los totales al final del cuadro; para cotizaciones. \\
% sinreverso & No compila el reverso de la factura así se haya escrito. \\
% soloreporte & Produce únicamente el reporte. \\
@@ -1890,7 +2014,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% |\cantref| & Muestra la cantidad del ítem referenciado. \\
% |\CI| & Cédula de identidad del cliente. \\
% |\Cliente| & Carga un archivo |.def| o |.tex| con personalizaciones. \\
-% |\NotaFinal| & Establece la nota final. \\
% |\Conforme| & Nombre de quien recibe la factura, para el espacio de la firma. \\
% |\Contacto| & Persona de contacto. \\
% |\Credito| & Establece la cantidad de días para el crédito de la factura. \\
@@ -1905,9 +2028,11 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% |\Direccion| & Dirección del cliente. \\
% |\Email| & E-mail del cliente. \\
% |\Emisor| & Nombre de quien emite la factura, para el espacio de la firma. \\
-% |\EstiloPagReporte| & Establece el estilo de página del reporte. \\
+% |\EstiloPagina| & Establece el estilo de página del reporte. \\
% |\Fecha| & Establece la fecha de emisión de la factura en formato predeterminado. \\
% |\Fecha*| & Establece la fecha de emisión de la factura en formato ISO. \\
+% |\NotaFecha| & Fecha de la factura a corregir con una nota de crédito o débito. \\
+% |\NotaFecha*| & Fecha (formato ISO) de la factura a corregir con una nota de crédito o débito. \\
% |\FirmaFactura| & Carga la imagen de la firma en la factura. \\
% |\FirmaReporte| & Carga la imagen de la firma en el reporte\footnote{El comando \cs{FirmaReporte} se escribe dentro del ambiente \texttt{reporte} y no en el preámbulo.}. \\
% |\FondoFactura| & Carga la imagen del fondo de la factura. \\
@@ -1934,6 +2059,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% |\LetraEncReporte| & Tipografía para la información del encabezado del reporte. \\
% |\LetraFecha| & Tipografía para la fecha de emisión. \\
% |\LetraFirmas| & Tipografía para los nombres de quienes firman la factura. \\
+% |\LetraFormalibre| & Tipografía para el texto “FORMA LIBRE”. \\
% |\LetraInfoPagina| & Tipografía para las cabeceras o pies de página del reporte. \\
% |\LetraItems| & Tipografía para los ítems en la factura. \\
% |\LetraNotaExterna| & Tipografía para la nota externa al cuadro de la factura. \\
@@ -1966,15 +2092,24 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% \rmfamily \bfseries Comando & \bfseries Significado \\ \hline
% |\Moneda| & Cambia el signo monetario a mostrar. \\
% |\Nombre| & Establece el nombre del cliente. \\
-% |\NotaInterna| & Escribe una nota interna al cuadro de la factura. \\
% |\NotaExterna| & Escribe una nota extra externa al cuadro de la factura. \\
+% |\NotaExterna* **| & Con |*| agrega la nota externa después de la anterior; con |**|, al principio. \\
+% |\NotaFinal| & Establece la nota final. \\
+% |\NotaFinal* **| & Con |*| agrega la nota final después de la anterior; con |**|, al principio. \\
+% |\NotaInterna| & Escribe una nota interna al cuadro de la factura. \\
+% |\NotaInterna* **| & Con |*| agrega la nota interna después de la anterior; con |**|, al principio. \\
% |\NotaPrevia| & Escribe una nota antes del cuadro de la factura. \\
+% |\NotaPrevia* **| & Con |*| agrega la nota previa después de la anterior; con |**|, al principio. \\
+% |\NotaNum| & Número de la factura a corregir con una nota de crédito o débito. \\
% |\Num| & Número de la factura. \\
% |\NumControl| & Número de control de la factura. \\
% |\NumSerieControl| & Número de serie de control de la factura. \\
% |\PosNotaFinal| & Posición $(x_o,x_f,y)$ del párrafo con la nota final. \\
% |\PosNotaFinal*| & Posición $(x_o,x_f,y)$ del párrafo con la nota final \\
% & (el texto se despliega hacia arriba). \\
+% |\PosFormalibre| & Posición $(x,y)$ del texto “FORMA LIBRE”. \\
+% |\PosFormalibre*| & Posición $(x,y)$ del texto “FORMA LIBRE”. \\
+% & (el texto se despliega hacia arriba). \\
% |\PosControl| & Posición $(x,y)$ del número de control. \\
% |\PosControl*| & Posición $(x,y)$ del número de control \\
% & (el texto se despliega hacia arriba). \\
@@ -2042,6 +2177,9 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% \Ejemplo[0.49]{ejemplo-factura10}*{2}
% \Ejemplo*{ejemplo-factura10}*
% \newpage
+% \Ejemplo{ejemplo-notadecredito}
+% \Ejemplo{ejemplo-notadedebito}
+% \newpage
% \Ejemplo*[0.49]{ejemplo-reporte1}
% \Ejemplo[0.49]{ejemplo-reporte1}*{2}
% \Ejemplo[0.49]{ejemplo-reporte1}{4}[\slshape Por espacio se omitió la página 2 en esta representación.]
@@ -2094,6 +2232,9 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\newbool{ControlXnegativo}
\newbool{ControlYarriba}
\newbool{ControlYnegativo}
+\newbool{FormalibreXnegativo}
+\newbool{FormalibreYarriba}
+\newbool{FormalibreYnegativo}
\newbool{DenomXnegativo}
\newbool{DenomYarriba}
\newbool{DenomYnegativo}
@@ -2111,7 +2252,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\newif\ifcotizacion
\newif\ifcsv
\newif\ifdcu
-\newif\ifdenom
\newif\ifdescuentos
\newif\ifdosfirmas
\newif\ifduc
@@ -2124,9 +2264,14 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\newif\ifiva
\newif\iflinea
\newif\ifnospanish
+\newif\ifnotadecredito
+\newif\ifnotadedebito
\newif\ifnumitem
\newif\ifprefactura
\newif\ifsincantidad
+\newif\ifsindenom
+\newif\ifsinencabezadofactura
+\newif\ifsinencabezadoreporte
\newif\ifsinexpandir
\newif\ifsinfirmas
\newif\ifsiniva
@@ -2224,6 +2369,8 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\newlength{\@PosNotaFinalY}
\newlength{\@PosControlX}
\newlength{\@PosControlY}
+\newlength{\@PosFormalibreX}
+\newlength{\@PosFormalibreY}
\newlength{\@EspacioVacioInicial}
\newlength{\@EspacioVacioFinal}
\newlength{\@EspacioSignoMonetario}
@@ -2261,6 +2408,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\newbox{\@CajaFecha}
\newbox{\@CajaDenom}
\newbox{\@CajaControl}
+\newbox{\@CajaFormalibre}
\newbox{\@CajaNotaFinal}
\newbox{\@CajaEspacioVacio}
\newbox{\@CajaPrueba}
@@ -2287,7 +2435,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\DeclareOption{cotizacion}{\cotizaciontrue}% Cambia la denominación a 'COTIZACIÓN' y no 'FACTURA'.
\DeclareOption{csv}{\csvtrue}% Para la salida en modo csv también.
\DeclareOption{dcu}{\dcutrue}% Descripción, luego cantidad y luego precio unitario.
-\DeclareOption{denom}{\denomtrue}% Agrega el texto con la denominación del documento, para las formas libres que no tienen el número de factura.
+\DeclareOption{sindenom}{\sindenomtrue}% No agrega el texto con la denominación del documento, para las formas libres que tienen el número de la factura ya impreso.
\DeclareOption{descuentos}{\descuentostrue}% Para los descuentos individuales.
\DeclareOption{dosfirmas}{\dosfirmastrue}% Pone las dos firmas para firmar.
\DeclareOption{duc}{\ductrue}% Descripción, luego precio unitario y luego cantidad.
@@ -2299,9 +2447,13 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\DeclareOption{iva}{\ivatrue}% Para la columna del IVA.
\DeclareOption{linea}{\lineatrue}% Para la línea que inutiliza el espacio en blanco.
\DeclareOption{nospanish}{\nospanishtrue}% No carga babel en castellano ni la codificación T1 de las letras.
+\DeclareOption{notadecredito}{\notadecreditotrue}% Produce una nota de crédito.
+\DeclareOption{notadedebito}{\notadedebitotrue}% Produce una nota de débito.
\DeclareOption{numitem}{\numitemtrue}% Para poner una columna extra al principio con el número del ítem.
\DeclareOption{prefactura}{\prefacturatrue}% La prefactura; con el diseño de la forma libre... para enviar por correo electrónico, fax o imprimir preliminarmente.
\DeclareOption{sincantidad}{\sincantidadtrue}% Para no poner el campo de la cantidad.
+\DeclareOption{sinencabezadofactura}{\sinencabezadofacturatrue}% Para no poner los datos del cliente y que el emisor haga ese diseño.
+\DeclareOption{sinencabezadoreporte}{\sinencabezadoreportetrue}% Para no poner el encabezado del reporte.
\DeclareOption{sinexpandir}{\sinexpandirtrue}% No expande ninguna de las dos partes de la factura.
\DeclareOption{sinfirmas}{\sinfirmastrue}% No agrega los espacios para firmar.
\DeclareOption{sinivaexpresado}{\sinivaexpresadotrue}% Cuando no se cobra IVA y tampoco se quiere que aparezca la totalización del IVA.
@@ -2341,6 +2493,10 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\RequirePackage{numprint}% Con 'numprint' expresamos los totales en el formato requerido.
\RequirePackage{tikz}% Para los recuadros del encabezado de la factura,
\usetikzlibrary{shadows}% y para el de la descripción.
+ \tikzset{reuse path/.code={\pgfsyssoftpath@setcurrentpath{#1}}}
+ \tikzset{even odd clip/.code={\pgfseteorule}, protect/.code={
+ \clip[overlay,even odd clip,reuse path=#1]
+ (-2383.99999pt,-2383.99999pt) rectangle (2383.99999pt,2383.99999pt);}}
\RequirePackage{tabularx}% Con 'tabularx' hacemos la tabla.
\RequirePackage{environ}% Con 'environ' podemos usar tabularx dentro del ambiente de la factura y escribir texto en el enddef.
\RequirePackage{fancyhdr}% Las cabeceras fancy; así se use solamente en reporte, hay que cargarlo siempre.
@@ -2385,11 +2541,18 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\ifxetex
\special{pdf: docinfo << /Subject (\@factura@ver) >>}
\else
- \ifluatex
- \pdfextension info{/Subject (\@factura@ver)}
- \else
- \pdfinfo{/Subject (\@factura@ver)}
- \fi
+ \AfterEndDocument{% AfterEndDocument y no AtEndDocument porque si no hyperref sustituye la metadata.
+ \ifluatex
+ \pdfextension info{/Subject (\@factura@ver)}
+ \else
+ \pdfinfo{/Subject (\@factura@ver)}
+ \fi}
+\fi
+
+%% Lo hacemos compatible otra vez con LuaLaTeX
+\ifluatex
+ \let\pdfsavepos\savepos
+ \let\pdflastypos\lastypos
\fi
\def\@EstableceOpciones{%
@@ -2397,16 +2560,36 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\DTMsetstyle{\@FormatoFecha}\DTMsetup{datesep=\@FechaSeparadores}\gdef\DTMinformat{\@FormatoFechaEntrada}
% Tomamos las acciones pertinentes dependiendo de las opciones de la clase (o condicionales activados en el preámbulo que cambian las opciones de la clase)
+ \ifnotadedebito
+ \ifnotadecredito
+ \CLASSERROR{Las opciones 'notadedebito' y 'notadecredito' no son compatibles. Sin efecto ambas opciones}
+ \notadecreditofalse
+ \notadedebitofalse
+ \else
+ \ifcotizacion
+ \CLASSERROR{Las opciones 'notadedebito' y 'cotizacion' no son compatibles. Sin efecto ambas opciones}
+ \notadedebitofalse
+ \cotizacionfalse
+ \fi
+ \fi
+ \fi
+ \ifnotadecredito
+ \ifcotizacion
+ \CLASSERROR{Las opciones 'notadecredito' y 'cotizacion' no son compatibles. Sin efecto ambas opciones}
+ \notadecreditofalse
+ \cotizacionfalse
+ \fi
+ \fi
\ifprefactura
\ifcotizacion
\prefacturafalse
\cotizacionfalse
\CLASSWARNING{Las opciones 'prefactura' y 'cotizacion' no son compatibles. Sin efecto ambas opciones}
\else
- \denomtrue\setcounter{@Firmas}{0}
+ \setcounter{@Firmas}{0}
\fi
\fi
- \ifcotizacion\denomtrue\setcounter{@Firmas}{1}\fi
+ \ifcotizacion\setcounter{@Firmas}{1}\fi
\ifsinlineasv\booltrue{SinLineasVertExt}\booltrue{SinLineasVertInt}\fi
\ifsinlineasvi\booltrue{SinLineasVertInt}\fi
@@ -2425,6 +2608,17 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\fi
\ifsinlineashe\booltrue{SinLineasHoriExt}\fi
+ \ifsindenom
+ \else
+ \ifcotizacion
+ \else
+ \ifsinnumero
+ \CLASSERROR{La opcio'n para no poner el nu'mero so'lo es compatible con las cotizaciones. Sin efecto opcio'n 'sinnumero'}%
+ \sinnumerofalse
+ \fi
+ \fi
+ \fi
+
\ifdosfirmas
\setcounter{@Firmas}{2}
\ifunafirma
@@ -2488,7 +2682,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\fi
\fi
- \ifsinnumero\denomtrue\fi
\ifsintotales
\iffilas
\filasfalse
@@ -2526,6 +2719,15 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% \fi
% \fi
+ % Se establece el texto de la nota de crédito o débito como nota interna. Para cambiarlo hay que anular el texto con \AtEndPreamble{\NotaInterna{}}
+ \ifnotadecredito
+ \NotaInterna{\TextoNotaDeCredito}
+ \CLASSINFO{Se establecio' el texto aclaratorio de la nota de cre'dito como 'nota interna'}
+ \fi
+ \ifnotadedebito
+ \NotaInterna{\TextoNotaDeDebito}
+ \CLASSINFO{Se establecio' el texto aclaratorio de la nota de de'bito como 'nota interna'}
+ \fi
\iftodosiva \@BIRtrue \@BIAtrue \@Exentotrue \Gtrue \fi
\ifsiniva\AtBeginDocument{\gdef\@ImpuestoG{0}\gdef\@ImpuestoR{0}\gdef\@ImpuestoA{0}}\fi
\ifsinivaexpresado
@@ -2594,11 +2796,13 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\@twosidefalse\@mparswitchfalse
\fi}
+%% Antes de que se acabe el preámbulo. Sin *, hace append, con un * sustituye, con **, hace prepend.
\NewDocumentCommand{\BeforeEndPreamble}{s s +m}{
\IfBooleanTF{#2}
{\gpreto{\@BeforeEndPreamble}{#3}}
{\IfBooleanTF{#1}{\long\gdef\@BeforeEndPreamble{#3}}{\gappto{\@BeforeEndPreamble}{#3}}}}
+%% Primer \AtEndPreamble: ejecuta \@EstableceOpciones, luego \@BeforeEndPreamble y luego otra vez \@EstableceOpciones.
\AtEndPreamble{
\@EstableceOpciones
\ifx\@undefined\@BeforeEndPreamble\else\@BeforeEndPreamble\@EstableceOpciones\fi
@@ -2612,7 +2816,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\ifcotizacion \CLASSINFO{Opcio'n cargada: cotizacion}\fi
\ifcsv \CLASSINFO{Opcio'n cargada: csv}\fi
\ifdcu \CLASSINFO{Opcio'n cargada: dcu}\fi
- \ifdenom \CLASSINFO{Opcio'n cargada: denom}\fi
\ifdescuentos \CLASSINFO{Opcio'n cargada: descuentos}\fi
\ifdosfirmas \CLASSINFO{Opcio'n cargada: dosfirmas}\fi
\ifduc \CLASSINFO{Opcio'n cargada: duc}\fi
@@ -2625,9 +2828,14 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\ifiva \CLASSINFO{Opcio'n cargada: iva}\fi
\iflinea \CLASSINFO{Opcio'n cargada: linea}\fi
\ifnospanish \CLASSINFO{Opcio'n cargada: nospanish}\fi
+ \ifnotadecredito \CLASSINFO{Opcio'n cargada: notadecredito}\fi
+ \ifnotadedebito \CLASSINFO{Opcio'n cargada: notadedebito}\fi
\ifnumitem \CLASSINFO{Opcio'n cargada: numitem}\fi
\ifprefactura \CLASSINFO{Opcio'n cargada: prefactura}\fi
\ifsincantidad \CLASSINFO{Opcio'n cargada: sincantidad}\fi
+ \ifsindenom \CLASSINFO{Opcio'n cargada: sindenom}\fi
+ \ifsinencabezadofactura \CLASSINFO{Opcio'n cargada: sinencabezadofactura}\fi
+ \ifsinencabezadoreporte \CLASSINFO{Opcio'n cargada: sinencabezadoreporte}\fi
\ifsinexpandir \CLASSINFO{Opcio'n cargada: sinexpandir}\fi
\ifsinfirmas \CLASSINFO{Opcio'n cargada: sinfirmas}\fi
\ifsiniva \CLASSINFO{Opcio'n cargada: siniva}\fi
@@ -2658,6 +2866,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%% Escribimos el total como comentario en el .log.
\AtEndDocument{%
+ \ifx\undefined\Total\else\immediate\write\@auxout{\gdef\noexpand\TotalX{\Total}}\fi
\ifsintotales
\else
\if@factura\CLASSINFO{\@@Total: \space\space\space \Moneda \Total}\fi
@@ -2672,7 +2881,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<class>\def\GeometriaFactura#1{\gdef\@GeometriaFactura{#1}}
%<class>\def\GeometriaReverso#1{\gdef\@GeometriaReverso{#1}}
%<class>\def\GeometriaReporte#1{\gdef\@GeometriaReporte{#1}}
-%<def>\GeometriaFactura{letterpaper,vmargin={5.2cm,5.5cm},hmargin={1cm,1cm},footskip=0pt, headsep=0pt, headheight=0pt}
+%<def>\GeometriaFactura{letterpaper,vmargin={4.7cm,5.5cm},hmargin={1cm,1cm},footskip=0pt, headsep=0pt, headheight=0pt}
%<def>\GeometriaReverso{letterpaper,vmargin={1cm,1cm}, hmargin={1cm,1cm},footskip=0cm, headsep=0pt, headheight=0pt}
%<def>\GeometriaReporte{letterpaper,vmargin={2.8cm,2.5cm},hmargin={3cm,2cm},footskip=1.2cm,headsep=0.777cm,headheight=1.5cm}
@@ -2687,7 +2896,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<def> % \def\@AlicuotaGDescAlto{0.05}
%<def> % \def\@AlicuotaGDescLimite{2000000}
%<def>\def\@AlicuotaR{0.08}
-%<def>\def\@AlicuotaA{0.27}
+%<def>\def\@AlicuotaA{0.31}
%<def>
%</class|def>
%<*def>
@@ -2696,7 +2905,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\npdecimalsign{,}
\def\@DigitosMoneda{2}
\def\@DigitosPorc{2}
-\def\@DigitosNumeracion{5}
+\def\@DigitosNumeracion{6}
\def\@FormatoFecha{ddmmyyyy}
\def\@FormatoFechaEntrada{dd-mm-yyyy}
\def\@FechaSeparadores{-}
@@ -2720,18 +2929,17 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\def\@DenomAlicuotaA{A}
\def\@DenomAlicuotaE{(E)}
-%% (quitado por no vigente)
-%% Texto predeterminado para la nota interna por el descuento presidencial.
- % \def\@TextoDescuentoPresidencial{Se aplica un descuento del \@AlicuotaGDescPorc\% al IVA General seg\'un Decreto Presidencial 3.085 en Gaceta Oficial 41.239.}
-
%% Macros que guardan textos que corresponden a nombres de campos:
\def\@@Fecha{Fecha de emisi\'on:}
\def\@@FechaVencimiento{Fecha de vencimiento:}
+\def\@@Formalibre{FORMA LIBRE}
\def\@@Control{N\textordmasculine\space CONTROL}
\def\@@Datos{Datos del cliente}
\def\@@Resumen{Resumen del servicio}
\def\@@DenomFactura{FACTURA}
\def\@@DenomCotiza{COTIZACI\'ON}
+\def\@@DenomNotaDeCredito{NOTA DE CR\'EDITO}
+\def\@@DenomNotaDeDebito{NOTA DE D\'EBITO}
\def\@@RazonSocial{Raz\'on social:}
\def\@@Nombre{Nombre:}
\def\@@RIF{R.I.F.:}
@@ -2773,6 +2981,18 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\def\@@SubtotalA{Subtotal A}
\def\@@SubtotalE{Subtotal E}
+%% (quitado por no vigente)
+%% Texto predeterminado para la nota interna por el descuento presidencial.
+ % \def\@TextoDescuentoPresidencial{Se aplica un descuento del \@AlicuotaGDescPorc\% al IVA General seg\'un Decreto Presidencial 3.085 en Gaceta Oficial 41.239.}
+
+%% Texto a mostrar en la nota de crédito o débito referenciando la factura a corregir.
+\def\TextoNotaDeCredito{Nota de cr\'edito sobre la factura \NotaNum \space de fecha \NotaFecha.}
+\def\TextoNotaDeDebito{Nota de d\'ebito sobre la factura \NotaNum \space de fecha \NotaFecha.}
+
+%% Texto a mostrar como cabecera o pie de página en los reportes, dependiente de si el reporte no tiene título declarado o sí lo tiene.
+\def\@InfoPaginaNoTitulo{\@LetraInfoPagina Reporte correspondiente a la factura n\'umero \@Num \space de fecha \@Fecha}
+\def\@InfoPaginaTitulo{\@LetraInfoPagina \@TituloReporte \space - \@Proveedor \space - \@Fecha}
+
%% i) carácter para separar el teléfono del e-mail del cliente,
%% ii) carácter para los campos vacíos cuando se usa \ItemX,
%% iii) carácter para las celdas vacías cuando la descripción del ítem ocupa más que una línea.
@@ -2820,13 +3040,19 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\def\@DescuentoEnum{0}
\FPset\PrecioUtempx{1}
-%% \Fecha, \FormatoFecha, \Credito, \Moneda, \RazonSocial, \Nombre, \RIF, \CI, \Contacto, \Dirección, \Telefono, \Email, \Conforme, \Emisor, \Proveedor.
+%% \Fecha, \NotaFecha, \FormatoFecha, \Credito, \Moneda, \RazonSocial, \Nombre, \RIF, \CI, \Contacto, \Dirección, \Telefono, \Email, \Conforme, \Emisor, \Proveedor.
\NewDocumentCommand{\Fecha}{s m g g}{%
\IfBooleanTF{#1}
{\AtEndPreamble{\DTMsavedate{FechaEmision}{#2-#3-#4}}}
{\AtEndPreamble{\DTMsavedatex{FechaEmision}{#2}}}}
\def\@Fecha{\DTMusedate{FechaEmision}}
+\NewDocumentCommand{\NotaFecha}{s m g g}{%
+ \IfBooleanTF{#1}
+ {\AtEndPreamble{\DTMsavedate{NotaFecha}{#2-#3-#4}}}
+ {\AtEndPreamble{\DTMsavedatex{NotaFecha}{#2}}}}
+\def\@NotaFecha{\DTMusedate{NotaFecha}}
+
\NewDocumentCommand{\FormatoFecha}{o g g}{%
\IfValueT{#1}{\gdef\@FormatoFechaEntrada{#1}}\IfValueT{#2}{\gdef\@FormatoFecha{#2}}\IfValueT{#3}{\gdef\@FechaSeparadores{#3}}}
@@ -2869,33 +3095,42 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\IfBooleanTF{#1}{\@DescEnumtrue\gdef\@DescuentoEnum{#2}}{\@DescEnumfalse\gdef\@DescuentoEporc{#2}}%
\@DescEtrue\@DescuentoTotaltrue}
-\def\Denom#1{\gdef\@Denominacion{#1}}% La denominación puede ser 'FACTURA', 'COTIZACIÓN' u otra. Se predetermina una de estas dos según las opciones de la clase.
+\def\Denom#1{\gdef\@Denominacion{#1}}% La denominación puede ser 'FACTURA', 'COTIZACIÓN', 'NOTA DE CRÉDITO', 'NOTA DE DÉBITO' u otra. Se predetermina alguna de estas opciones según las opciones con las que se carga la clase.
%% Número de la factura con \Num, número de control con \NumControl, y número de serie de control \NumSerieControl.
\def\Num#1{\gdef\@Num{\nplpadding{\@DigitosNumeracion}\npthousandsep{}\numprint{#1}}}
\def\NumControl#1{\gdef\@NumControl{\nplpadding{\@DigitosNumeracion}\npthousandsep{}\numprint{#1}}}% Si el número de control no se especifica, toma el mismo que el de la factura
\def\NumSerieControl#1{\gdef\@NumSerieControl{#1}}% Si el número de serie de control no se especifica, toma '00'.
+% Número de la factura a la que en la nota de crédito o débito se hace referencia.
+\def\NotaNum#1{\gdef\@NotaNum{\nplpadding{\@DigitosNumeracion}\npthousandsep{}\numprint{#1}}}
+
%% Información de página: cabeceras de páginas o pies de página.
\def\InfoPagina#1{\gdef\@InfoPagina{#1}}
-%% Texto para la nota final.
-\NewDocumentCommand{\NotaFinal}{+m}{\gdef\@NotaFinal{#1}}
-\NewDocumentCommand{\Condiciones}{+m}{\gdef\@NotaFinal{#1}\@ClassWarningCondiciones}
-
-%% Advertencia para la migración de cualquier comando para condiciones a nota final.
-\def\@ClassWarningCondiciones{\CLASSWARNING{Ya no son condiciones sino nota final, debe hacerse la migración a los nuevos comandos}}
-
%% Resumen opcional que va a la derecha de los datos del cliente.
\NewDocumentCommand{\Resumen}{+m}{\gdef\@Resumen{#1}}
-\NewDocumentCommand{\NotaPrevia}{+m}{\gdef\@NotaPrevia{#1}}
+%% Nota previa (al cuadro), nota interna (del cuadro), nota externa (luego del cuadro) y nota final (luego de la descripción).
+\NewDocumentCommand{\NotaPrevia}{s s +m}{%
+ \IfBooleanTF{#2}
+ {\gpreto{\@NotaPrevia}{#3}}
+ {\IfBooleanTF{#1}{\gappto{\@NotaPrevia}{#3}}{\gdef\@NotaPrevia{#3}}}}
+
+\NewDocumentCommand{\NotaInterna}{s s +m}{%
+ \IfBooleanTF{#2}
+ {\gpreto{\@NotaInterna}{#3}}
+ {\IfBooleanTF{#1}{\gappto{\@NotaInterna}{#3}}{\gdef\@NotaInterna{#3}}}}
+
+\NewDocumentCommand{\NotaExterna}{s s +m}{%
+ \IfBooleanTF{#2}
+ {\gpreto{\@NotaExterna}{#3}}
+ {\IfBooleanTF{#1}{\gappto{\@NotaExterna}{#3}}{\gdef\@NotaExterna{#3}}}}
-%% Nota interna al cuadro de la factura y nota externa a él (que sale antes de \Descripcion).
-\NewDocumentCommand{\NotaInterna}{+m}{%
- \ifdefvoid{\@NotaInterna}{}{\CLASSWARNING{Se sobreescribio' la nota interna previamente definida}}%
- \gdef\@NotaInterna{#1}}
-\NewDocumentCommand{\NotaExterna}{+m}{\gdef\@NotaExterna{#1}}
+\NewDocumentCommand{\NotaFinal}{s s +m}{%
+ \IfBooleanTF{#2}
+ {\gpreto{\@NotaFinal}{#3}}
+ {\IfBooleanTF{#1}{\gappto{\@NotaFinal}{#3}}{\gdef\@NotaFinal{#3}}}}
\AtBeginDocument{%
% Si no se especificó fecha, tomamos la de hoy. Además, advertimos cuando el documento se está compilando en una fecha distinta de la fecha establecida en el encabezado.
@@ -2931,43 +3166,75 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
% \fi
% \fi
- % Efectuamos distintos chequeos para dar errores o advertencias si faltó algo.
- \ifdefvoid{\@RazonSocial}{\CLASSERROR{Hay que definir la razo'n social}}{}%
+ % Efectuamos distintos chequeos para dar errores o advertencias si faltó algún dato por especificar.
\if@reporte
- \ifdefvoid{\@Num}{\CLASSWARNING{No se especifico' el nu'mero de la factura. Puede dar error si el ti'tulo del reporte no se especifica que aparezca en las cabeceras}}{}%
+ \ifsinencabezadoreporte
+ \ifdefvoid{\@RazonSocial}{\CLASSWARNING{No se especifico' la razo'n social. Puede dar error}}{}%
+ \else
+ \ifdefvoid{\@RazonSocial}{\CLASSERROR{Hay que definir la razo'n social}}{}%
+ \fi
+ \ifdefvoid{\@Num}{\CLASSWARNING{No se especifico' el nu'mero de la factura. Puede dar error}}{}%
\ifdefvoid{\@Proveedor}{%
\ifdefvoid{\@Emisor}
- {\CLASSERROR{Hay que definir el nombre del proveedor cuando se emite un reporte}}%
+ {\ifsinencabezadoreporte
+ \CLASSWARNING{No se especifico' el proveedor. Puede dar error}%
+ \else
+ \CLASSERROR{Hay que definir el nombre del proveedor cuando se emite un reporte}%
+ \fi}%
{\CLASSWARNING{Se toma el emisor como el proveedor por no haberse especificado este u'ltimo}%
\let\@Proveedor=\@Emisor}}
{}%
\fi
\if@factura
- \ifdefvoid{\@RIF}{\CLASSERROR{Hay que definir el R.I.F}}{}%
- \ifdefvoid{\@Direccion}{\CLASSERROR{Hay que definir la direccio'n fiscal}}{}%
- \ifdefvoid{\@Telefono}{\CLASSWARNING{Pudiera definirse un nu'mero telefo'nico}}{}%
+ \ifnotadecredito
+ \ifdefvoid{\@NotaNum}{\CLASSERROR{Debe definirse el nu'mero de la factura a corregir con una nota de cre'dito}}{}
+ \DTMifsaveddate{NotaFecha}{}{\CLASSERROR{Debe definirse la fecha de la factura a corregir con una nota de cre'dito}}
+ \fi
+ \ifnotadedebito
+ \ifdefvoid{\@NotaNum}{\CLASSERROR{Debe definirse el nu'mero de la factura a corregir con una nota de de'bito}}{}
+ \DTMifsaveddate{NotaFecha}{}{\CLASSERROR{Debe definirse la fecha de la factura a corregir con una nota de de'bito}}
+ \fi
+ \ifsinencabezadofactura
+ \CLASSWARNING{Se pidio la opcio'n 'sinencabezadofactura'; no se esta' verificando si esta'n definidos algunos datos del cliente}
+ \else
+ \ifdefvoid{\@RazonSocial}{\CLASSERROR{Hay que definir la razo'n social}}{}%
+ \ifdefvoid{\@RIF}{\CLASSERROR{Hay que definir el R.I.F}}{}%
+ \ifdefvoid{\@Direccion}{\CLASSERROR{Hay que definir la direccio'n fiscal}}{}%
+ \ifdefvoid{\@Telefono}{\CLASSWARNING{Pudiera definirse un nu'mero telefo'nico}}{}%
+ \fi
+ \ifdefvoid{\@Contacto}{\if@Nombre\else\CLASSWARNING{Pudiera definirse una persona de contacto}\fi}{}%
\ifdefvoid{\@Email}{\CLASSWARNING{Pudiera definirse una direccio'n de correo electro'nico}}{}%
\ifdefvoid{\@NotaFinal}{\CLASSWARNING{Pudiera definirse una nota final}}{}%
- \ifcotizacion
- \ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opcio'n para cotizacion se recomienda agregar el fondo}}{}%
- \fi
\ifprefactura
\ifdefvoid{\@FondoFactura}{\CLASSWARNING{En la opcio'n para prefactura se recomienda agregar el fondo}}{}%
\fi
- \ifsinnumero
+ % Fijamos la denominación del documento paras las cotizaciones, facturas o notas de crédito o débito, que son casos particulares del modo 'factura'.
+ \ifdefvoid{\@Denominacion}{%
\ifcotizacion
+ \Denom{\@@DenomCotiza}%
\else
- \CLASSERROR{La opcio'n para no poner el nu'mero so'lo es compatible con las cotizaciones}%
- \fi
- \fi
- \ifdenom
- \ifsinnumero
+ \ifnotadecredito
+ \Denom{\@@DenomNotaDeCredito}%
+ \else
+ \ifnotadedebito
+ \Denom{\@@DenomNotaDeDebito}%
+ \else
+ \Denom{\@@DenomFactura}%
+ \fi
+ \fi
+ \fi}{}%
+ \ifsindenom
+ \else
+ \ifcotizacion
\else
- \ifdefvoid{\@Num}{\CLASSERROR{Hay que definir el nu'mero de la factura}}{}%
+ \ifsinnumero
+ \CLASSERROR{La opcio'n para no poner el nu'mero so'lo es compatible con las cotizaciones}%
+ \else
+ \ifdefvoid{\@Num}{\CLASSERROR{Hay que definir el nu'mero del documento a producir}}{}%
+ \fi
\fi
\fi
\fi
- \ifdefvoid{\@Contacto}{\if@Nombre\else\CLASSWARNING{Pudiera definirse una persona de contacto}\fi}{}%
% El cálculo de la fecha de vencimiento para cuando haya crédito o fecha de vencimiento explícita.
\ifdefvoid{\@Credito}
@@ -3007,10 +3274,12 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\def\Proveedor{\@Proveedor}%
\def\Fecha{\@Fecha}%
\def\FechaVencimiento{\@FechaVencimiento}%
+ \def\NotaFecha{\@NotaFecha}%
\def\Credito{\@Credito}%
\def\Num{\@Num}%
\def\NumSerieControl{\@NumSerieControl}%
\def\NumControl{\@NumControl}%
+ \def\NotaNum{\@NotaNum}%
\def\NotaFinal{\@NotaFinal}%
\def\Resumen{\@Resumen}%
\def\NotaPrevia{\@NotaPrevia}%
@@ -3020,7 +3289,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%</class>
%<*class|def>
-%% Posiciones (X,Y) de los objetos: i) fecha, ii) denominación, iii) nota final, iv) número de control, v) firmas.
+%% Posiciones (X,Y) de los objetos: i) fecha, ii) forma libre, iii) número de control, vi) denominación, v) nota final, vi) firmas.
%<*class>
\NewDocumentCommand{\PosFecha}{s m m}{
\setlength{\@PosFechaX}{#2}
@@ -3028,37 +3297,46 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\IfBooleanTF{#1}{\booltrue{FechaYarriba}}{\boolfalse{FechaYarriba}}
\IfBeginWith{#2}{-}{\booltrue{FechaXnegativo}}{\boolfalse{FechaXnegativo}}
\IfBeginWith{#3}{-}{\booltrue{FechaYnegativo}}{\boolfalse{FechaYnegativo}}}
-
%</class>
-%<def>\PosFecha*{-0cm}{5cm}
+%<def>\PosFecha*{-0cm}{4.5cm}
%<*class>
-\NewDocumentCommand{\PosDenom}{s m m}{
- \setlength{\@PosDenomX}{#2}
- \setlength{\@PosDenomY}{#3}
- \IfBooleanTF{#1}{\booltrue{DenomYarriba}}{\boolfalse{DenomYarriba}}
- \IfBeginWith{#2}{-}{\booltrue{DenomXnegativo}}{\boolfalse{DenomXnegativo}}
- \IfBeginWith{#3}{-}{\booltrue{DenomYnegativo}}{\boolfalse{DenomYnegativo}}}
+\NewDocumentCommand{\PosFormalibre}{s m m}{
+ \setlength{\@PosFormalibreX}{#2}
+ \setlength{\@PosFormalibreY}{#3}
+ \IfBooleanTF{#1}{\booltrue{FormalibreYarriba}}{\boolfalse{FormalibreYarriba}}
+ \IfBeginWith{#2}{-}{\booltrue{FormalibreXnegativo}}{\boolfalse{FormalibreXnegativo}}
+ \IfBeginWith{#3}{-}{\booltrue{FormalibreYnegativo}}{\boolfalse{FormalibreYnegativo}}}
%</class>
-%<def>\PosDenom*{0cm}{5cm}
+%<def>\PosFormalibre*{0cm}{-3.5cm}
%<*class>
+
\NewDocumentCommand{\PosControl}{s m m}{
\setlength{\@PosControlX}{#2}
\setlength{\@PosControlY}{#3}
\IfBooleanTF{#1}{\booltrue{ControlYarriba}}{\boolfalse{ControlYarriba}}
\IfBeginWith{#2}{-}{\booltrue{ControlXnegativo}}{\boolfalse{ControlXnegativo}}
\IfBeginWith{#3}{-}{\booltrue{ControlYnegativo}}{\boolfalse{ControlYnegativo}}}
-
%</class>
%<def>\PosControl*{0cm}{-2.4cm}
%<*class>
+
+\NewDocumentCommand{\PosDenom}{s m m}{
+ \setlength{\@PosDenomX}{#2}
+ \setlength{\@PosDenomY}{#3}
+ \IfBooleanTF{#1}{\booltrue{DenomYarriba}}{\boolfalse{DenomYarriba}}
+ \IfBeginWith{#2}{-}{\booltrue{DenomXnegativo}}{\boolfalse{DenomXnegativo}}
+ \IfBeginWith{#3}{-}{\booltrue{DenomYnegativo}}{\boolfalse{DenomYnegativo}}}
+%</class>
+%<def>\PosDenom*{0cm}{4.5cm}
+%<*class>
+
\NewDocumentCommand{\PosNotaFinal}{s m m m}{
\setlength{\@PosNotaFinalXuno}{#2}
\setlength{\@PosNotaFinalXdos}{#3}
\setlength{\@PosNotaFinalY}{#4}
\IfBooleanTF{#1}{\booltrue{NotaFinalYarriba}}{\boolfalse{NotaFinalYarriba}}
\IfBeginWith{#4}{-}{\booltrue{NotaFinalYnegativo}}{\boolfalse{NotaFinalYnegativo}}}
-\let\PosCondiciones\PosNotaFinal
%</class>
%<def>\PosNotaFinal{0cm}{0cm}{-5.3cm}
%% La nota final se define con un X_inicial, un X_final y un Y_inicial (Xo,Xf,Y)
@@ -3110,7 +3388,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<def>\SepDescripcion{6pt}
%<class>\def\SepNotaFinal#1{\setlength{\@SeparaInternaNotaFinal}{#1}}
-%<class>\let\SepCondiciones\SepNotaFinal
%<def>\SepNotaFinal{5pt}
%% Grosor de la línea de las cajas del encabezado, curvatura de la esquina y sombra.
@@ -3143,7 +3420,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<class> \setlength{\@GrosorLineaNotaFinal}{#1}
%<class> \IfValueT{#2}{\setlength{\@EsquinaLineaNotaFinal}{#2}}
%<class> \IfValueT{#3}{\setlength{\@SombraNotaFinal}{#3}}}
-%<class>\let\LineaCondiciones\LineaNotaFinal
%<def>\LineaNotaFinal{0pt}{0pt}{0pt}
%% El espacio vertical que hay que avanzar sólo en la primera página del reporte antes de empezar a escribir sobre él. Usable cuando la primera página tiene un membrete y las demás no, es decir, cuando se usa \FondoReporte y no \FondoReporte*.
@@ -3217,13 +3493,16 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%% Tipo de letra para la nota final.
%<class>\def\LetraNotaFinal#1{\gdef\@LetraNotaFinal{#1\selectfont}}
-%<class>\let\LetraCondiciones\LetraNotaFinal
%<def>\LetraNotaFinal{\fontsize{12}{12}}
-%% Letra para la denominación del documento ('FACTURA', 'COTIZACIÓN',...).
+%% Letra para la denominación del documento ('FACTURA', 'NOTA DE CRÉDITO', 'NOTA DE DÉBITO', 'COTIZACIÓN',...).
%<class>\def\LetraDenom#1{\gdef\@LetraDenom{#1\selectfont}}
%<def>\LetraDenom{\fontsize{14}{14}\bfseries}
+%% Letra para el texto 'FORMA LIBRE'
+%<class>\def\LetraFormalibre#1{\gdef\@LetraFormalibre{#1\selectfont}}
+%<def>\LetraFormalibre{\fontsize{14}{14}\bfseries\color{blue}}
+
%% Letra para la numeración de la factura.
%<class>\def\LetraNumeracion#1{\gdef\@LetraNumeracion{#1\selectfont}}
%<def>\LetraNumeracion{\fontsize{14}{14}\bfseries\color{red}}
@@ -3330,9 +3609,10 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\fi}}
%% Comando para establecer desde el preámbulo el estilo de página (\pagestyle) del reporte, tanto para la primera página como para las siguientes.
-\NewDocumentCommand{\EstiloPagReporte}{o m}{
- \gdef\@EstiloPagReporteResto{#2}
- \IfValueTF{#1}{\gdef\@EstiloPagReporteUno{#1}}{\gdef\@EstiloPagReporteUno{\@EstiloPagReporteResto}}}
+\NewDocumentCommand{\EstiloPagina}{o m}{
+ \gdef\@EstiloPaginaResto{#2}
+ \IfValueTF{#1}{\gdef\@EstiloPaginaUno{#1}}{\gdef\@EstiloPaginaUno{\@EstiloPaginaResto}}}
+\let\EstiloPagReporte\EstiloPagina
%% El título para el reporte.
\NewDocumentCommand{\TituloReporte}{s m}{
@@ -3351,9 +3631,11 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%% Comando para escribir el encabezado en la factura.
\newcommand\@EncabezadoFactura{%
- \ifdefvoid{\@Resumen}{\@EscribeDatos}{\@EscribeDatosResumen}%
- \vspace*{\@SeparaVertical}%
- \ifexpandecuadro\else\vfill\fi}
+ \ifsinencabezadofactura
+ \ifdefvoid{\@Resumen}{}{\CLASSWARNING{La opcio'n 'sinencabezadofactura' no es compatible con escribir un resumen. No aparecera' el resumen.}}
+ \else
+ \ifdefvoid{\@Resumen}{\@EscribeDatos}{\@EscribeDatosResumen}%
+ \fi}
%% Comando para escribir el encabezado en el reporte.
\newcommand\@EncabezadoReporte{%
@@ -3364,15 +3646,21 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\vspace*{\@InicioReporte}%
\fi
\fi
- \@EscribeDatosReporte
+ \ifsinencabezadoreporte\else\@EscribeDatosReporte\vskip\baselineskip\fi
\@LetraReporte}
%% El ambiente 'factura', usando el paquete 'environ' para su definición, y el comando auxiliar \@FacturaAuxCmd.
%% Gracias a Heiko Oberdiek y a David Carlisle (Thanks to Heiko Oberdiek and David Carlisle).
%% http://tex.stackexchange.com/questions/108565/know-the-cell-width-with-tabular-or-include-a-paragraph-box-without-specifying
\NewEnviron{factura}{%
- \expandafter\@FacturaAuxCmd\expandafter{\BODY}%
- \ifnum\value{page}=1\else\CLASSERROR{La factura ocupa mas que una pagina}\fi}
+ \vspace*{\@SeparaVertical}%
+ \ifsinexpandir\vfill\fi
+ \@EscribeNotaPrevia
+ \ifx\undefined\Total
+ \expandafter\@FacturaAuxCmd\expandafter{\BODY}%
+ \ifnum\value{page}=1\else\CLASSERROR{La factura ocupa mas que una pagina}\fi
+ \else
+ \CLASSERROR{Ya se uso' un entorno de factura, ignorando}\fi}
\NewEnviron{reverso}{%
\if@factura
@@ -3880,7 +4168,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\ifdim \ht\@CajaEspacioVacio=0pt \global\lineafalse \else \@ExpandeCuadrotrue \fi
\fi
- \ifx\undefined\Total\relax\else\CLASSERROR{Parece ya haberse usado un entorno de factura}\fi
%
% Comandos \David@SavePos, \David@XStart, \David@XEnd, \David@XPad, \David@XLeft y \David@XRight para poder manejar el salto de línea en las columnas adyacentes a la columna 'X' del tabularx (la descripción), cuando esta ocupa más que una línea.
% Gracias a David Carlisle (Thanks to David Carlisle).
@@ -4136,7 +4423,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\iffilas
\@LetraNumTotales
\vspace*{\@SeparaVertical}\par
- \ifexpandecuadro\else\vfill\fi
+ \ifsinexpandir\vfill\fi
\@GeneraCajasTotalesFilas
\newbox{\@CajaTotal}%
\savebox{\@CajaTotal}{{\@LetraTitTotal\@@Total:} \@LetraNumTotal\@SignoMonetarioAux\numprint{\Total}}%
@@ -4203,7 +4490,8 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\vfill
\ifexpandecuadro\zsaveposy{EspacioVacioFinal}\fi
\vspace*{\@SeparaVertical}\par
- \ifdefvoid{\@NotaExterna}{}{\parbox[t]{\linewidth}{\@LetraNotaExterna\@NotaExterna}\vspace*{\@SeparaVertical}\par}}
+ \ifdefvoid{\@NotaExterna}{}{%
+ \parbox[t]{\linewidth}{\@LetraNotaExterna\@NotaExterna}\vspace*{\@SeparaVertical}\ifsinexpandir\vfill\fi}}
\ifbool{SinCantidad}
% Definamos todos los comandos \Item***. El descuento es opcional; por eso usamos G{0} en \NewDocumentCommand.
@@ -4264,11 +4552,11 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\else
\RenewEnviron{reverso}{}
\fi
- \ifcotizacion\def\@Denominacion{\@@DenomCotiza}\else\def\@Denominacion{\@@DenomFactura}\fi% Fijamos la denominación del documento paras las cotizaciones o facturas, que son casos particulares del modo 'factura'.
\expandafter\geometry\expandafter{\@GeometriaFactura}% La geometría debe aplicarse aquí.
\AfterEndPreamble{%
\addtolength{\@PosFechaX}{\oddsidemargin+1in}% Le sumamos el margen izquierdo a las posiciones de las cosas; es importante que se haga en un \AfterEndPreamble antes de que empiecen a escribirse otras cosas en la página.
\addtolength{\@PosDenomX}{\oddsidemargin+1in}%
+ \addtolength{\@PosFormalibreX}{\oddsidemargin+1in}%
\addtolength{\@PosControlX}{\oddsidemargin+1in}%
\addtolength{\@PosNotaFinalXuno}{\oddsidemargin+1in}%
\addtolength{\@PosFirmasXuno}{\oddsidemargin+1in}%
@@ -4278,13 +4566,12 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\expandafter\setlength{\@SepTotales}{\the\@SeparaMinTotales plus 1fill}% \@SeparaMinTotales es el mínimo espacio entre los totales en el modo 'filas', y SepTotales es una dimensión interna, estirable, con ese como su mínimo.
\thispagestyle{empty}%
\pagenumbering{roman}%
- \@EncabezadoFactura
- \@EscribeNotaPrevia}
+ \@EncabezadoFactura}
\AtBeginShipoutNext{% Antes abría aquí un \AtBeginShipoutNext cuando había reporte y un \AtEndDocument cuando no. No es necesario eso. También lo modifiqué en \FirmaFactura.
\@CargaFondoFactura
\@PosicionaFechas
- \ifdenom\@PosicionaDenom\fi
- \ifprefactura\@PosicionaNumControl\fi
+ \ifsindenom\else\@PosicionaDenom\fi
+ \ifprefactura\@PosicionaNumControl\@PosicionaFormalibre\fi
\ifnum\value{@Firmas}=0\else\@PosicionaFirmas\fi
\ifdefvoid{\@NotaFinal}{}{\@PosicionaNotaFinal}}
\iflinea
@@ -4309,21 +4596,45 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\setlength{\@SeparaInternaDescripcion}{0pt}\setlength{\@EsquinaLineaDescripcion}{0pt}\setlength{\@SombraDescripcion}{0pt}%
\renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}%
\fi
- \begin{tikzpicture}
- % Expandimos después para poderle pasar el contenido de la macro como argumento opcional a \node.
- \expandafter\node\expandafter[\@DescripcionTIKZ]{%
- \ifbool{ExpAbajo}
- {\parbox[t][\textheight-\pagetotal-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion]
- {\textwidth-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion}}%
- {\parbox[t]{\textwidth-\@SombraDescripcion-2\@SeparaInternaDescripcion-2\@GrosorLineaDescripcion}}%
- {\setlength{\parindent}{0.5cm}%
- \setlength{\parskip}{2pt plus 8pt}%
- \ifbool{ExpAbajo}{\vfill}{}%
- #1%
- \ifbool{ExpAbajo}{\vfill}{}}}%
- \ifdim\@GrosorLineaDescripcion=0pt\else ;\fi% El fin del nodo va cuando hay el entorno tikzpicture original.
- \end{tikzpicture}
+ \@DibujaDescripcion{#1}%
\par\vspace*{\@SombraDescripcion}}}%
+%</class>
+%<*def>
+%% Diseño hecho en TikZ para la descripción, los datos del cliente, el resumen, la nota previa y la nota final.
+\long\def\@DibujaDescripcion#1{%
+%^^A Thanks to Schrödinger's cat for this hack on tikzpicture.
+%^^A Gracias a Schrödinger's cat por este hack en tikzpicture.
+%^^A (https://tex.stackexchange.com/questions/544594/tikz-copy-shadow-with-watermark-issue)
+ \begin{tikzpicture}
+ \node[draw=black, fill=white, fill opacity=0, text opacity=1, save path=\tmprotect, inner sep=\@SeparaInternaDescripcion, line width=\@GrosorLineaDescripcion, rounded corners=\@EsquinaLineaDescripcion]{%
+ \ifbool{ExpAbajo}
+ {\parbox[t][\textheight-\pagetotal-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion]
+ {\textwidth-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion}}%
+ {\parbox[t]{\textwidth-\@SombraDescripcion-2\@SeparaInternaDescripcion-2\@GrosorLineaDescripcion}}%
+ {\setlength{\parindent}{0.5cm}%
+ \setlength{\parskip}{2pt plus 8pt}%
+ \ifbool{ExpAbajo}{\vfill}{}%
+ #1%
+ \ifbool{ExpAbajo}{\vfill}{}}}%
+ \ifdim\@GrosorLineaDescripcion=0pt%
+ \else
+ ;
+ \tikzset{protect=\tmprotect}%
+ \node[draw=black, fill=white, inner sep=\@SeparaInternaDescripcion, line width=\@GrosorLineaDescripcion, rounded corners=\@EsquinaLineaDescripcion, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraDescripcion, shadow yshift=-\@SombraDescripcion}]{%
+ \ifbool{ExpAbajo}
+ {\parbox[t][\textheight-\pagetotal-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion]
+ {\textwidth-2\@SeparaInternaDescripcion-\@GrosorLineaDescripcion-\@SombraDescripcion}}%
+ {\parbox[t]{\textwidth-\@SombraDescripcion-2\@SeparaInternaDescripcion-2\@GrosorLineaDescripcion}}%
+ {\setlength{\parindent}{0.5cm}%
+ \setlength{\parskip}{2pt plus 8pt}%
+ \ifbool{ExpAbajo}{\vfill}{}%
+ #1%
+ \ifbool{ExpAbajo}{\vfill}{}}};%
+ \fi% El fin del nodo va cuando hay el entorno tikzpicture original.
+ \end{tikzpicture}\global\let\tmprotect\undefined}
+
+%</def>
+%<*class>
\else
\RenewEnviron{factura}{%
\@ZERO
@@ -4348,25 +4659,23 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\let\headwidth\textwidth
\@CargaFondoReporte
\@EncabezadoReporte
- \ifdefvoid{\@EstiloPagReporteResto}{%
- \if@FondoReporteStar% Si no usamos \EstiloPagReporte entonces se fijará 'soloabajo' cuando se use \FondoReporte* para que sólo use marcas de pie de página, y si no se usó \FondoReporte* entonces se fijará 'plain' que usa cabeceras y pies de página.
+ \ifdefvoid{\@EstiloPaginaResto}{%
+ \if@FondoReporteStar% Si no usamos \EstiloPagina entonces se fijará 'soloabajo' cuando se use \FondoReporte* para que sólo use marcas de pie de página, y si no se usó \FondoReporte* entonces se fijará 'plain' que usa cabeceras y pies de página.
\pagestyle{soloabajo}%
\else
\pagestyle{plain}%
\fi}
- {\pagestyle{\@EstiloPagReporteResto}}% Si usamos \EstiloPagReporte en su argumento obligatorio entonces fijamos ese estilo de página.
- \ifdefvoid{\@EstiloPagReporteUno}{%
- \if@FondoReporte% Si no le damos a \EstiloPagReporte su argumento opcional, entonces se fijará 'solonumpag' como el estilo de página para la primera página, pero solamente si usamos \FondoReporte, ya que el estilo de página predeterminado al usar \FondoReporte* ya se acaba de fijar y no necesita el caso especial de la primera hoja (\thispagestyle).
+ {\pagestyle{\@EstiloPaginaResto}}% Si usamos \EstiloPagina en su argumento obligatorio entonces fijamos ese estilo de página.
+ \ifdefvoid{\@EstiloPaginaUno}{%
+ \if@FondoReporte% Si no le damos a \EstiloPagina su argumento opcional, entonces se fijará 'solonumpag' como el estilo de página para la primera página, pero solamente si usamos \FondoReporte, ya que el estilo de página predeterminado al usar \FondoReporte* ya se acaba de fijar y no necesita el caso especial de la primera hoja (\thispagestyle).
\if@FondoReporteStar
\else
\thispagestyle{solonumpag}%
\fi
\fi}
- {\thispagestyle{\@EstiloPagReporteUno}}% Si usamoe el argumento opcional de \EstiloPagReporte establecemos ese estilo de página.
+ {\thispagestyle{\@EstiloPaginaUno}}% Si usamoe el argumento opcional de \EstiloPagina establecemos ese estilo de página.
\pagenumbering{arabic}%
- \setlength{\parindent}{0.666cm}%
- \setlength{\parskip}{4pt plus 6pt minus 2pt}% separación entre párrafos en el reporte.
- \vskip\baselineskip
+ \@EstiloParrafoReporte
\BODY\clearpage}% espacio antes de empezar con el reporte, después del título -si lo hubiera-.
\else
\NewEnviron{reporte}{}
@@ -4411,6 +4720,16 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\usebox{\@CajaNotaFinal}%
\end{textblock*}}
+%% Comando que coloca el texto 'FORMA LIBRE'.
+\newcommand{\@PosicionaFormalibre}{%
+ \savebox{\@CajaFormalibre}{\@EstiloFormalibre}%
+ \ifbool{FormalibreXnegativo}{\addtolength{\@PosFormalibreX}{\textwidth-\wd\@CajaFormalibre}}{}%
+ \ifbool{FormalibreYnegativo}{\addtolength{\@PosFormalibreY}{\paperheight}}{}%
+ \ifbool{FormalibreYarriba}{\addtolength{\@PosFormalibreY}{-\ht\@CajaFormalibre-\dp\@CajaFormalibre}}{}%
+ \begin{textblock*}{\wd\@CajaFormalibre}(\@PosFormalibreX,\@PosFormalibreY)%
+ \usebox{\@CajaFormalibre}%
+ \end{textblock*}}
+
%% Comando que coloca el número de control.
\newcommand{\@PosicionaNumControl}{%
\savebox{\@CajaControl}{\@EstiloNumControl}%
@@ -4457,13 +4776,26 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\setlength{\@SeparaInternaEncabezado}{0pt}\setlength{\@EsquinaLineaEncabezado}{0pt}\setlength{\@SombraEncabezado}{0pt}%
\renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}%
\fi
- \begin{tikzpicture}%
- \expandafter\node\expandafter[\@DatosTIKZ]{%
- \parbox{\textwidth-\@SombraEncabezado-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado}{\@DatosAux}}%
- \ifdim\@GrosorLineaEncabezado=0pt\else ;\fi
- \end{tikzpicture}%
+ \@DibujaDatos
\par\vspace*{\@SombraEncabezado}}}% Para que textblock* esté en modo vertical.
+%</class>
+%<*def>
+\def\@DibujaDatos{%
+ \begin{tikzpicture}
+ \node[draw=black, fill=white, fill opacity=0, text opacity=1, save path=\tmprotect, inner sep=\@SeparaInternaEncabezado, line width=\@GrosorLineaEncabezado, rounded corners=\@EsquinaLineaEncabezado]{%
+ \parbox{\textwidth-\@SombraEncabezado-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado}{\@DatosAux}}%
+ \ifdim\@GrosorLineaEncabezado=0pt%
+ \else
+ ;
+ \tikzset{protect=\tmprotect}%
+ \node[draw=black, fill=white, inner sep=\@SeparaInternaEncabezado, line width=\@GrosorLineaEncabezado, rounded corners=\@EsquinaLineaEncabezado, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraEncabezado, shadow yshift=-\@SombraEncabezado}]{%
+ \parbox{\textwidth-\@SombraEncabezado-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado}{\@DatosAux}};%
+ \fi
+ \end{tikzpicture}\global\let\tmprotect\undefined}
+
+%</def>
+%<*class>
\newcommand{\@EscribeDatosResumen}{%
{\@LetraEncFactura% Abrimos un nuevo grupo para que el cambio de tipografía y la redefinición del entorno 'tikzpicture' sean locales.
\ifdim\@GrosorLineaEncabezado=0pt%
@@ -4479,23 +4811,40 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\ifdim\@TamDatos>\@TamResumen
\setlength{\@TamFinalEncabezado}{\@TamDatos}%
\else
- \setlength{\@TamFinalEncabezadoado}{\@TamResumen}%
+ \setlength{\@TamFinalEncabezado}{\@TamResumen}%
\fi
- \begin{tikzpicture}%
- \expandafter\node\expandafter[\@DatosTIKZ]{%
- \parbox[t][\@TamFinalEncabezado]{\textwidth/2-\@SeparaDatosResumen/2-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado-\@SombraEncabezado}{%
- \@DatosAux*}}%
- \ifdim\@GrosorLineaEncabezado=0pt\else ;\fi
- \end{tikzpicture}%
- \hspace*{\@SeparaDatosResumen}\hspace*{\@SombraEncabezado}%
- \begin{tikzpicture}%
- \expandafter\node\expandafter[\@ResumenTIKZ]{%
- \parbox[t][\@TamFinalEncabezado]{\textwidth/2-\@SeparaDatosResumen/2-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado-\@SombraEncabezado}{%
- \@ResumenAux}}%
- \ifdim\@GrosorLineaEncabezado=0pt\else ;\fi
- \end{tikzpicture}%
+ \@DibujaDatosResumen
\par\vspace*{\@SombraEncabezado}}}% El \par es para que textblock* esté en modo vertical.
+%</class>
+%<*def>
+\def\@DibujaDatosResumen{%
+ \begin{tikzpicture}%
+ \node[draw=black, fill=white, fill opacity=0, text opacity=1, save path=\tmprotect, inner sep=\@SeparaInternaEncabezado, line width=\@GrosorLineaEncabezado, rounded corners=\@EsquinaLineaEncabezado]{%
+ \parbox[t][\@TamFinalEncabezado]{\textwidth/2-\@SeparaDatosResumen/2-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado-\@SombraEncabezado}{\@DatosAux*}}%
+ \ifdim\@GrosorLineaEncabezado=0pt%
+ \else
+ ;
+ \tikzset{protect=\tmprotect}%
+ \node[draw=black, fill=white, inner sep=\@SeparaInternaEncabezado, line width=\@GrosorLineaEncabezado, rounded corners=\@EsquinaLineaEncabezado, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraEncabezado, shadow yshift=-\@SombraEncabezado}]{%
+ \parbox[t][\@TamFinalEncabezado]{\textwidth/2-\@SeparaDatosResumen/2-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado-\@SombraEncabezado}{\@DatosAux*}};%
+ \fi
+ \end{tikzpicture}%
+ \hspace*{\@SeparaDatosResumen}\hspace*{\@SombraEncabezado}%
+ \begin{tikzpicture}%
+ \node[draw=black, fill=white, fill opacity=0, text opacity=1, save path=\tmprotect, inner sep=\@SeparaInternaEncabezado, line width=\@GrosorLineaEncabezado, rounded corners=\@EsquinaLineaEncabezado]{%
+ \parbox[t][\@TamFinalEncabezado]{\textwidth/2-\@SeparaDatosResumen/2-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado-\@SombraEncabezado}{\@ResumenAux}}%
+ \ifdim\@GrosorLineaEncabezado=0pt%
+ \else
+ ;
+ \tikzset{protect=\tmprotect}%
+ \node[draw=black, fill=white, inner sep=\@SeparaInternaEncabezado, line width=\@GrosorLineaEncabezado, rounded corners=\@EsquinaLineaEncabezado, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraEncabezado, shadow yshift=-\@SombraEncabezado}]{%
+ \parbox[t][\@TamFinalEncabezado]{\textwidth/2-\@SeparaDatosResumen/2-2\@SeparaInternaEncabezado-\@GrosorLineaEncabezado-\@SombraEncabezado}{\@ResumenAux}};%
+ \fi
+ \end{tikzpicture}\global\let\tmprotect\undefined}
+
+%</def>
+%<*class>
%% Comando que coloca la caja para la nota previa, con la posibilidad de TikZ.
\newcommand{\@EscribeNotaPrevia}{%
{% Abrimos un nuevo grupo para que la redefinición del entorno 'tikzpicture' sea local.
@@ -4505,14 +4854,27 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\setlength{\@SeparaInternaNotaPrevia}{0pt}\setlength{\@EsquinaLineaNotaPrevia}{0pt}\setlength{\@SombraNotaPrevia}{0pt}%
\renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}%
\fi
- \begin{tikzpicture}%
- \expandafter\node\expandafter[\@NotaPreviaTIKZ]{%
- \parbox{\textwidth-\@SombraNotaPrevia-2\@SeparaInternaNotaPrevia-\@GrosorLineaNotaPrevia}{\@EstiloNotaPrevia}}%
- \ifdim\@GrosorLineaNotaPrevia=0pt\else ;\fi
- \end{tikzpicture}%
+ \@DibujaNotaPrevia
\par\vspace*{\@SombraNotaPrevia}\vspace*{\@SeparaVertical}%
- \ifexpandecuadro\else\vfill\fi}}}
+ \ifsinexpandir\vfill\fi}}}
+%</class>
+%<*def>
+\def\@DibujaNotaPrevia{%
+ \begin{tikzpicture}%
+ \node[draw=black, fill=white, fill opacity=0, text opacity=1, save path=\tmprotect, inner sep=\@SeparaInternaNotaPrevia, line width=\@GrosorLineaNotaPrevia, rounded corners=\@EsquinaLineaNotaPrevia]{%
+ \parbox{\textwidth-\@SombraNotaPrevia-2\@SeparaInternaNotaPrevia-\@GrosorLineaNotaPrevia}{\@EstiloNotaPrevia}}%
+ \ifdim\@GrosorLineaNotaPrevia=0pt%
+ \else
+ ;
+ \tikzset{protect=\tmprotect}%
+ \node[draw=black, fill=white, inner sep=\@SeparaInternaNotaPrevia, line width=\@GrosorLineaNotaPrevia, rounded corners=\@EsquinaLineaNotaPrevia, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraNotaPrevia, shadow yshift=-\@SombraNotaPrevia}]{%
+ \parbox{\textwidth-\@SombraNotaPrevia-2\@SeparaInternaNotaPrevia-\@GrosorLineaNotaPrevia}{\@EstiloNotaPrevia}};%
+ \fi
+ \end{tikzpicture}\global\let\tmprotect\undefined}
+
+%</def>
+%<*class>
%% Comando que coloca la caja para la nota final, con la posibilidad de TikZ.
\newcommand{\@EscribeNotaFinal}{%
{% Abrimos un nuevo grupo para que la redefinición del entorno 'tikzpicture' sea local.
@@ -4520,13 +4882,26 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\setlength{\@SeparaInternaNotaFinal}{0pt}\setlength{\@EsquinaLineaNotaFinal}{0pt}\setlength{\@SombraNotaFinal}{0pt}%
\renewenvironment{tikzpicture}{\NewDocumentCommand{\node}{o +m}{####2}}{}%
\fi
- \begin{tikzpicture}%
- \expandafter\node\expandafter[\@NotaFinalTIKZ]{%
- \parbox{\textwidth-\@PosNotaFinalXuno-\@PosNotaFinalXdos+\oddsidemargin+1in-\@SombraNotaFinal-2\@SeparaInternaNotaFinal-\@GrosorLineaNotaFinal}{\@EstiloNotaFinal}}%
- \ifdim\@GrosorLineaNotaFinal=0pt\else ;\fi
- \end{tikzpicture}%
+ \@DibujaNotaFinal
\par\vspace*{\@SombraNotaFinal}}}
+%</class>
+%<*def>
+\def\@DibujaNotaFinal{%
+ \begin{tikzpicture}
+ \node[draw=black, fill=white, fill opacity=0, text opacity=1, save path=\tmprotect, inner sep=\@SeparaInternaNotaFinal, line width=\@GrosorLineaNotaFinal, rounded corners=\@EsquinaLineaNotaFinal]{%
+ \parbox{\textwidth-\@PosNotaFinalXuno-\@PosNotaFinalXdos+\oddsidemargin+1in-\@SombraNotaFinal-2\@SeparaInternaNotaFinal-\@GrosorLineaNotaFinal}{\@EstiloNotaFinal}}%
+ \ifdim\@GrosorLineaNotaFinal=0pt%
+ \else
+ ;
+ \tikzset{protect=\tmprotect}%
+ \node[draw=black, fill=white, inner sep=\@SeparaInternaNotaFinal, line width=\@GrosorLineaNotaFinal, rounded corners=\@EsquinaLineaNotaFinal, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraNotaFinal, shadow yshift=-\@SombraNotaFinal}]{%
+ \parbox{\textwidth-\@PosNotaFinalXuno-\@PosNotaFinalXdos+\oddsidemargin+1in-\@SombraNotaFinal-2\@SeparaInternaNotaFinal-\@GrosorLineaNotaFinal}{\@EstiloNotaFinal}};%
+ \fi
+ \end{tikzpicture}\global\let\tmprotect\undefined}
+
+%</def>
+%<*class>
%% Comandos auxiliares para los datos y el resumen.
%% En el caso de los datos, la versión \@DatosAux se ejecuta cuando no hay resumen, y la versión \@DatosAux* se ejecuta cuando hay resumen.
\NewDocumentCommand{\@DatosAux}{s}{%
@@ -4640,20 +5015,11 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%</class>
%<*def>
-%% Diseño hecho en TikZ para los datos del cliente, el resumen, la nota previa, la descripción y la nota final.
-\def\@DatosTIKZ{%
- draw=black, fill=white, inner sep=\@SeparaInternaEncabezado, line width=\@GrosorLineaEncabezado, rounded corners=\@EsquinaLineaEncabezado, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraEncabezado, shadow yshift=-\@SombraEncabezado}}
-
-\let\@ResumenTIKZ\@DatosTIKZ
-
-\def\@NotaPreviaTIKZ{%
- draw=black, fill=white, inner sep=\@SeparaInternaNotaPrevia, line width=\@GrosorLineaNotaPrevia, rounded corners=\@EsquinaLineaNotaPrevia, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraNotaPrevia, shadow yshift=-\@SombraNotaPrevia}}
-
-\def\@DescripcionTIKZ{%
- draw=black, fill=white, inner sep=\@SeparaInternaDescripcion, line width=\@GrosorLineaDescripcion, rounded corners=\@EsquinaLineaDescripcion, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraDescripcion, shadow yshift=-\@SombraDescripcion}}
-
-\def\@NotaFinalTIKZ{%
- draw=black, fill=white, inner sep=\@SeparaInternaNotaFinal, line width=\@GrosorLineaNotaFinal, rounded corners=\@EsquinaLineaNotaFinal, copy shadow={top color=black, bottom color=black, shadow xshift=\@SombraNotaFinal, shadow yshift=-\@SombraNotaFinal}}
+%% Macro para el estilo de párrafo del reporte.
+\newcommand{\@EstiloParrafoReporte}{%
+ \setlength{\parindent}{0.666cm}% sangría para el reporte.
+ \setlength{\parskip}{4pt plus 6pt minus 2pt}% separación entre párrafos en el reporte.
+}
%% El diseño de las distintas partes de la hoja.
\newcommand{\@EstiloFirmas}{
@@ -4673,6 +5039,8 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\newcommand{\@EstiloNotaFinal}{\@LetraNotaFinal \@NotaFinal}
+\newcommand{\@EstiloFormalibre}{\@LetraFormalibre \@@Formalibre}
+
\newcommand{\@EstiloNumControl}{%
\renewcommand{\baselinestretch}{0}\selectfont
\begin{tabular}{@{\extracolsep{0pt}}l}
@@ -4695,10 +5063,6 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
\ifvencimiento \@@FechaVencimiento & \ttfamily\@FechaVencimiento \\ \else \vspace*{-.3em}\fi
\end{tabular}}
-\newcommand{\@InfoPaginaNoTitulo}{\@LetraInfoPagina Reporte correspondiente a la factura n\'umero \@Num \space de fecha \@Fecha}
-
-\newcommand{\@InfoPaginaTitulo}{\@LetraInfoPagina \@TituloReporte \space - \@Proveedor \space - \@Fecha}
-
%% Estilos de página: normal, sólo cabeceras, sólo pies de página y sólo número de página al pie.
\fancypagestyle{plain}{%
\expandafter\ps@fancy
@@ -4746,6 +5110,8 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<factnueve|factdiez|repuno>%% Escribimos en el reverso de la factura
%<prefac|beispiel>%% (prefactura) Escribimos una prefactura
%<cotiza>%% (cotizacion) Escribimos una cotización
+%<notadecredito>%% (notadecredito) Escribimos una nota de crédito
+%<notadedebito>%% (notadedebito) Escribimos una nota de débito
%<repuno|repdos|reptres>%% Escribimos un reporte
%<repuno>%% (sinreverso) Escribimos el reverso de la factura pero sólo producimos su anverso
%<repuno>%% (conreporte) Generamos factura y reporte
@@ -4755,10 +5121,12 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
%<factdiez>%% Establecemos algunas opciones de la clase a través de comandos
%
-%<factuno>%% Hacemos una factura básica con todo en sus valores por omisión, no ajustamos nada
+%<factuno|notadecredito|notadedebito>%% Hacemos una factura básica con todo en sus valores por omisión, no ajustamos nada
%
%<reptres>%% (twoside) El reporte se imprime en las dos caras del papel
%
+%<factnueve>%% (sinencabezadofactura) Pedimos que la factura no tenga encabezado
+%<repdos>%% (sinencabezadoreporte) Pedimos que el reporte no tenga encabezado
%<factcinco>%% (sincantidad) Cuadro de la factura sin la columna de cantidades
%<factdos|factseis>%% (numitem) Con la columna para enumerar los ítems
%<factdos|factseis>%% (descuentos) Con la columna para descuentos individuales
@@ -4771,7 +5139,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%
%<factdos>%% (dcu) Primero la descripción, luego la cantidad, luego el precio unitario
%<factcuatro>%% (duc) Primero la descripción, luego el precio unitario, luego la cantidad
-%<factcinco|factseis|factsiete>%% (denom) Escribe la denominación (“FACTURA”) y el número
+%<factcinco|factseis>%% (sindenom) No escribe la denominación (“FACTURA”) ni el número
%<cotiza>%% (sinnumero) Escribe la denominación (“COTIZACIÓN”) pero sin número
%<cotiza>%% (sintotales) No totaliza, para que el cliente tenga un presupuesto por distintos ítems que luego elegirá entre ellos, es decir, una lista de precios
%
@@ -4782,7 +5150,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<factcuatro>%% (sinlineahtit) Sin línea horizontal interna después del título de las columnas
%<factseis>%% (sinlineashi) Sin líneas horizontales internas
%<factsiete>%% (sinlineashe) Sin líneas horizontales externas
-%<factnueve>%% (sinlineahni) Sin línea horizontal interna después de la nota interna.
+%<factnueve>%% (sinlineahni) Sin línea horizontal interna que va antes de la nota interna
%<factdiez>%% (sinlineash) Sin líneas horizontales
%<facttres|factcinco>%% (conlineasha) Separado cada ítem con una línea horizontal
%
@@ -4813,9 +5181,9 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<repuno>%% Sin especificar el proveedor, así toma el emisor de la factura como el nombre del proveedor
%<repdos|reptres>%% (\Proveedor) Especificando el nombre del proveedor para el encabezado del reporte
%
-%<facttres>%% Sin especificar fecha para que tome la fecha del día.
-% %<factnueve>%% Con nota interna automática por el descuento en pagos electrónicos.
-% %<factdiez>%% Con nota interna automática con el monto en Bs.F dada la fecha de emisión de la factura antes de que a la moneda se le quitara el adjetivo “soberano”.
+%<facttres>%% Sin especificar fecha para que tome la fecha del día
+% %<factnueve>%% Con nota interna automática por el descuento en pagos electrónicos
+% %<factdiez>%% Con nota interna automática con el monto en Bs.F dada la fecha de emisión de la factura antes de que a la moneda se le quitara el adjetivo “soberano”
%
%<factcuatro>%% (\Fecha*) Suministrando la fecha según formato de datetime2 sin alterar cómo sale escrita
%<facttres>%% (\FormatoFecha) Cambiando el separador de la fecha para que salga escrita dd/mm/yyyy
@@ -4841,7 +5209,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<repuno|reptres>%% (\TituloReporte) Establecemos el título del reporte sin que salga en las cabeceras ni pies de página
%<repdos>%% (\TituloReporte*) Establecemos el título del reporte para que salga en las cabeceras o pies de página
%<reptres>%% (\InfoPagina) Personalizamos la información de la cabecera del reporte y mostramos el nombre del proveedor allí
-%<reptres>%% (\EstiloPagReporte) Cambiamos el estilo de página para que la información del reporte aparezca como pie de página
+%<reptres>%% (\EstiloPagina) Cambiamos el estilo de página para que la información del reporte aparezca como pie de página
%<cotiza>%% (\FirmaFactura) Agregando la firma escaneada en la factura, es decir, en la cotización
%
%<factdos|facttres|factsiete>%% (\SepVertical) Alterando la separación mínima vertical entre los elementos
@@ -4862,13 +5230,16 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<factcuatro|factocho>%% (\Letra***) Cambiando varias de las tipografías
%
%<!factcuatro&!reptres>%% (\NotaFinal) Con nota final
-%<factnueve>%% Haciendo mención a las fechas y al crédito en la nota final
%<factcuatro>%% Sin nota final
%<factuno|factdos|factcinco|factocho>%% (\Resumen) Con resumen
%<facttres|factcuatro|factseis|factsiete|prefac|cotiza|repuno|repdos>%% Sin resumen
%<factcuatro|factnueve|factdiez>%% (\NotaPrevia) Con nota previa
+%<factnueve>%% (\NotaPrevia*) Con nota previa agregada al final de la nota previa anterior
%<factocho|factnueve>%% (\NotaInterna) Con nota interna
+%<notadedebito>%% Anulando la nota interna establecida de manera predeterminada por usar la opción de la nota de débito
+%<notadedebito>%% (\NotaExterna) Con nota externa para el texto referencial de la factura a corregir, en lugar de colocarlo como nota interna
%<factnueve>%% (\NotaExterna) Con nota externa
+%<factnueve>%% (\NotaExterna**) Con nota externa agregada al principio de la nota externa anterior
%
%<factdos|facttres>%% Con artículos gravados con todos los IVA
%<factseis|factsiete|factocho>%% Escribimos un ítem cuya descripción ocupa más que una línea
@@ -4878,6 +5249,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<facttres|reptres>%% Sin descripción larga
%
%<factseis|repdos>%% Con etiquetas y referencias
+%<factseis|factnueve|notadecredito|notadedebito|repdos>%% Haciendo mención en el documento a valores establecidos en el preámbulo
%
%<repuno>%% (\FirmaReporte) Agregando en el reporte la línea para firmar a mano
%<factocho|repdos|reptres>%% (\FirmaReporte) Agregando la firma escaneada en el reporte
@@ -4890,11 +5262,15 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<!factuno>\documentclass[
%<prefac|beispiel>prefactura,
%<cotiza>cotizacion,
+%<notadecredito>notadecredito,
+%<notadedebito>notadedebito,
%<repuno>sinreverso,
%<repuno>conreporte,
%<repdos|reptres>soloreporte,
%<beispiel>nospanish,
%<reptres>twoside,
+%<factnueve>sinencabezadofactura,
+%<repdos>sinencabezadoreporte,
%<factcinco>sincantidad,
%<factdos|factseis>numitem,
%<factdos|factseis>descuentos,
@@ -4904,7 +5280,7 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<factdiez>filas, % luego queda sin efecto con \filasfalse en el preámbulo
%<factsiete>centrado,
%<facttres>agrupado,
-%<factcinco|factseis|factsiete>denom,
+%<factcinco|factseis>sindenom,
%<cotiza>sinnumero, % sin esta opción aparecerá el número de la cotización.
%<cotiza>sintotales,
%<factdos>dcu,
@@ -4982,30 +5358,34 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<beispiel>
%<beispiel>\renewcommand{\@EstiloDenom}{\@LetraDenom\@Denominacion-\ifsinnumero\else\@LetraNumeracion Nr:\space\@Num\fi}
%<beispiel>\renewcommand{\@EstiloNumControl}{}
+%<beispiel>\renewcommand{\@EstiloFormalibre}{}
%<beispiel>\makeatother
-%<factcinco|factseis|factsiete|cotiza|prefac|repuno|repdos|beispiel>\Num{1}
+%<!factcinco&!factseis&!reptres&!notadecredito&!notadedebito>\Num{1}
+%<notadecredito|notadedebito>\Num{2}
+%<notadecredito|notadedebito>\NotaNum{1}
%<prefac>% \NumControl{1001}
%<prefac>% \NumSerieControl{9}
-%<!factdos&!factcuatro&!beispiel>\RazonSocial{Ayala San Vicente Usureros}
+%<!factdos&!factcuatro&!factnueve&!beispiel>\RazonSocial{Ayala San Vicente Usureros}
%<factdos|factcuatro|beispiel>\Nombre{Jacinto de Ayala y San Vicente}
-%<!factdos&!factcuatro&!beispiel&!reptres>\RIF{Y-12.345.678-9}
+%<!factdos&!factcuatro&!factnueve&!beispiel&!reptres>\RIF{Y-12.345.678-9}
%<factdos|factcuatro|beispiel>\CI{V-987.654.321}
-%<!factdos&!factcuatro&!reptres&!beispiel>\Contacto{Jacinto de Ayala}
-%<!reptres>\Direccion{Av. Ayala, Galpón San Vicente, Sector Arauca, Apure, Venezuela}
-%<!factcinco&!factseis&!reptres>\Telefono{+58 (987) 654.32.10}
-%<!factcuatro&!factseis&!reptres>\Email{jacinto@ayala.sv}
+%<!factdos&!factcuatro&!factnueve&!reptres&!beispiel>\Contacto{Jacinto de Ayala}
+%<!factnueve&!reptres>\Direccion{Av. Ayala, Galpón San Vicente, Sector Arauca, Apure, Venezuela}
+%<!factcinco&!factseis&!factnueve&!reptres>\Telefono{+58 (987) 654.32.10}
+%<!factcuatro&!factseis&!factnueve&!reptres>\Email{jacinto@ayala.sv}
%<factcinco|repuno>\Emisor{Lázaro de la Vega}
%<factcinco>\Conforme{\Contacto}
%<factseis>\Conforme{Ramela San Vicente}
%<repdos|reptres>\Proveedor{Lázaro de la Vega y San Román}
-
+%<!factnueve>
%<factcinco>\FormatoFecha[yyyymmdd]{ddmmyyyy}{.}
%<facttres>\FormatoFecha{ddmmyyyy}{/}
%<factseis>\FormatoFecha{default}{/}
-%<!facttres&!factcuatro&!factcinco>\Fecha{06-11-2019}
-%<factcuatro>\Fecha*{2019}{06}{11}
-%<factcinco>\Fecha{20191106}
+%<!facttres&!factcuatro&!factcinco>\Fecha{02-07-2020}
+%<factcuatro>\Fecha*{2020}{07}{02}
+%<factcinco>\Fecha{20200702}
+%<notadecredito|notadedebito>\NotaFecha{01-07-2020}
%<factsiete|factocho>
%<factsiete|factocho>\makeatletter
%<factocho> \renewcommand{\@@Fecha}{\slshape FECHA:}
@@ -5029,19 +5409,19 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<repuno|reptres>\TituloReporte{El título del reporte}
%<repdos>\TituloReporte*{El título del reporte}
%<reptres>\InfoPagina{La cabecera o pie del reporte - \Proveedor}
-%<repuno|reptres>% \EstiloPagReporte{soloabajo}
-%<repuno|reptres>% \EstiloPagReporte[soloabajo]{plain}
-%<repuno|reptres>% \EstiloPagReporte[empty]{plain}
-%<repdos|reptres>% \EstiloPagReporte[empty]{soloabajo}
-%<reptres>% \EstiloPagReporte{plain}
-%<repuno|repdos|reptres>% \EstiloPagReporte{solonumpag}
-%<repdos>% \EstiloPagReporte{soloabajo}
-%<repuno|reptres>% \EstiloPagReporte[solonumpag]{plain}
-%<repuno|reptres>% \EstiloPagReporte[solonumpag]{soloarriba}
-%<reptres>\EstiloPagReporte[solonumpag]{soloabajo}
-%<repuno>% \EstiloPagReporte[solonumpag]{soloabajo}
-%<repuno|reptres>% \EstiloPagReporte[empty]{soloarriba}
-%<repuno|reptres>% \EstiloPagReporte{soloarriba}
+%<repuno|reptres>% \EstiloPagina{soloabajo}
+%<repuno|reptres>% \EstiloPagina[soloabajo]{plain}
+%<repuno|reptres>% \EstiloPagina[empty]{plain}
+%<repdos|reptres>% \EstiloPagina[empty]{soloabajo}
+%<reptres>% \EstiloPagina{plain}
+%<repuno|repdos|reptres>% \EstiloPagina{solonumpag}
+%<repdos>% \EstiloPagina{soloabajo}
+%<repuno|reptres>% \EstiloPagina[solonumpag]{plain}
+%<repuno|reptres>% \EstiloPagina[solonumpag]{soloarriba}
+%<reptres>\EstiloPagina[solonumpag]{soloabajo}
+%<repuno>% \EstiloPagina[solonumpag]{soloabajo}
+%<repuno|reptres>% \EstiloPagina[empty]{soloarriba}
+%<repuno|reptres>% \EstiloPagina{soloarriba}
%<cotiza>\FirmaFactura{\includegraphics[width=4.5cm]{factura-ejemplo-firma}}[0pt][17pt]
%<factdos|facttres|factsiete>\SepVertical{0.75cm}
%<factdos|factcinco>\SepDatosResumen{1cm}
@@ -5056,7 +5436,13 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<factdos|factsiete>\LineaDescripcion{1pt}{20pt}{3pt}
%<factnueve>\LineaNotaFinal{0.4pt}{4pt}{3pt}
%<factsiete>\LineaFirmas{6.5cm}{2pt}
-%<factsiete>% Puede usarse \PosFecha* o \PosDenom*, \PosControl* o \PosNotaFinal* para que el texto se despliegue en la posición 'Y' dada pero hacia arriba y no hacia abajo. \PosFirmas no acepta eso.
+%<prefac>
+%<prefac>% Puede usarse \PosControl y \PosFormalibre para cambiar la posición del número de control y del texto “FORMA LIBRE”, y sus versiones con “*” para que el texto se despliegue en la posición 'Y' dada pero hacia arriba y no hacia abajo.
+%<prefac>% \PosControl{}{}
+%<prefac>% \PosFirmalibre{}{}
+%<prefac>
+%<factsiete>% Puede usarse \PosFecha* o \PosDenom* para que el texto se despliegue en la posición 'Y' dada pero hacia arriba y no hacia abajo. \PosFirmas no acepta eso.
+%<factnueve>% Puede usarse \PosNotaFinal* para que el texto se despliegue en la posición 'Y' dada pero hacia arriba y no hacia abajo.
%<factnueve>\PosNotaFinal{.9cm}{.9cm}{-5.3cm}
%<factsiete>\PosFecha{-0cm}{-1.5cm}
%<factsiete>\PosFirmas{1cm}{1cm}{-3cm}
@@ -5074,21 +5460,30 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<factocho>\LetraTitTotal{\fontsize{20}{30}\bfseries\slshape}
%<factocho>\LetraNumTotal{\fontsize{20}{30}\bfseries}
%<factocho>\tabcolsep7pt
-%<!factuno&!factcinco&!prefac&!reptres>
+%<!factuno&!factcinco&!notadecredito&!notadedebito&!prefac&!reptres>
%<cotiza>% \Denom{PRESUPUESTO} % También podemos cambiar el nombre del documento.
%<!factcuatro&!factnueve&!beispiel&!reptres>\NotaFinal{La nota final...}
%<factnueve>\NotaFinal{La factura se emitió el \Fecha{} con crédito de \Credito{} dias, siendo su vencimiento el \FechaVencimiento.}
%<beispiel>\NotaFinal{Die Zahlungsbedingungen}
%<factuno|factdos|factcinco|factocho>\Resumen{El resumen opcional}
%<beispiel>\Resumen{Zusammenfassung}
-%<factcuatro|factnueve|factdiez>\NotaPrevia{\hfill LA NOTA PREVIA}
+%<factcuatro|factdiez>\NotaPrevia{\hfill LA NOTA PREVIA}
+%<factnueve>\NotaPrevia{\hfill LA NOTA PREVIA}
+%<factnueve>\NotaPrevia*{- SEGUNDA PARTE DE LA NOTA PREVIA}
%<factocho|factnueve>\NotaInterna{LA NOTA INTERNA}
%<factnueve>\NotaExterna{LA NOTA EXTERNA}
+%<factnueve>\NotaExterna**{PRIMERA PARTE DE LA NOTA EXTERNA - }
+%<notadedebito>\AtEndPreamble{\NotaInterna{}}
+%<notadedebito>\NotaExterna{\TextoNotaDeDebito}
\begin{document}
%<!reptres>
+%<factnueve>\noindent \framebox{\parbox{\linewidth-2\fboxsep-2\fboxrule}{\hfill Aquí el usuario puede diseñar su encabezado de la factura \hfill\mbox{}}}
+%<factnueve>
%<!reptres>\begin{factura}
-%<!factdos&!factcinco&!factseis&!repdos&!reptres&!beispiel> \Item{1}{ítem con IVA general}{1000}
+%<!notadecredito&!notadedebito&!factdos&!factcinco&!factseis&!repdos&!reptres&!beispiel> \Item{1}{ítem con IVA general}{1000}
+%<notadecredito> \Item{1}{Diferencia por error en factura}{1000}
+%<notadedebito> \Item{1}{Diferencia por error en factura}{1000}
%<factseis|repdos> \Item{2}{ítem con IVA general, viene con descuento}{1000}{8}[Un ítem que ofrecemos a precio de costo y que está gravado con IVA general]\label{primeritem}
%<factuno|factcuatro|repdos> \Item{4}{otro ítem con IVA general}{100}
%<cotiza> \Item{1}{otro ítem con IVA general}{1100}
@@ -5110,7 +5505,8 @@ factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
%<beispiel> \ItemE{1}{Artikel mit kein MwSt}{100}
%<!reptres>\end{factura}
%<!facttres&!reptres>
-%<!facttres&!factseis&!reptres&!beispiel>\Descripcion{La descripción larga}
+%<!facttres&!factseis&!reptres&!notadecredito&!notadedebito&!beispiel>\Descripcion{La descripción larga}
+%<notadecredito|notadedebito>\Descripcion{Con esta nota queda saldado el error cometido en la factura número \NotaNum{} de fecha \NotaFecha.}
%<factseis>\Descripcion{
%<factseis>
%<beispiel>\Descripcion{Lange Beschreibung.}
diff --git a/Master/texmf-dist/source/latex/factura/factura.ins b/Master/texmf-dist/source/latex/factura/factura.ins
deleted file mode 100644
index c1c785cd2e3..00000000000
--- a/Master/texmf-dist/source/latex/factura/factura.ins
+++ /dev/null
@@ -1,155 +0,0 @@
-%%
-%% This is file `factura.ins',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% factura.dtx (with options: `batchfile')
-%%
-%% Copyright 2019 Emilio Augusto Lazo Zaia <emiliolazozaia@gmail.com>
-%%
-%% 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. This version of this license is in
-%% http://www.latex-project.org/lppl/lppl-1-3c.{html|txt|tex|pdf}
-%% and 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/05/04 or later.
-%%
-%% This work has the LPPL maintenance status `maintained'.
-%%
-%% The Current Maintainer of this work is Emilio Augusto Lazo Zaia.
-%%
-%% This work consists of the files README and factura.dtx
-%% with its derived files factura.ins, factura.cls, factura.def,
-%% factura-ejemplo-aux.tex, factura-ejemplo-firma.tex,
-%% factura-ejemplo-fondo.tex, factura-ejemplo-membrete.tex,
-%% factura-ejemplo-cotizacion.tex, factura-ejemplo-prefactura.tex,
-%% factura-ejemplo-factura01.tex, factura-ejemplo-factura02.tex,
-%% factura-ejemplo-factura03.tex, factura-ejemplo-factura04.tex,
-%% factura-ejemplo-factura05.tex, factura-ejemplo-factura06.tex,
-%% factura-ejemplo-factura07.tex, factura-ejemplo-factura08.tex,
-%% factura-ejemplo-factura09.tex, factura-ejemplo-factura10.tex,
-%% factura-ejemplo-reporte1.tex, factura-ejemplo-reporte2.tex,
-%% factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
-%%
-\input docstrip.tex
-\preamble
-
-Copyright 2019 Emilio Augusto Lazo Zaia <emiliolazozaia@gmail.com>
-
-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. This version of this license is in
- http://www.latex-project.org/lppl/lppl-1-3c.{html|txt|tex|pdf}
-and 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/05/04 or later.
-
-This work has the LPPL maintenance status `maintained'.
-
-The Current Maintainer of this work is Emilio Augusto Lazo Zaia.
-
-This work consists of the files README and factura.dtx
-with its derived files factura.ins, factura.cls, factura.def,
-factura-ejemplo-aux.tex, factura-ejemplo-firma.tex,
-factura-ejemplo-fondo.tex, factura-ejemplo-membrete.tex,
-factura-ejemplo-cotizacion.tex, factura-ejemplo-prefactura.tex,
-factura-ejemplo-factura01.tex, factura-ejemplo-factura02.tex,
-factura-ejemplo-factura03.tex, factura-ejemplo-factura04.tex,
-factura-ejemplo-factura05.tex, factura-ejemplo-factura06.tex,
-factura-ejemplo-factura07.tex, factura-ejemplo-factura08.tex,
-factura-ejemplo-factura09.tex, factura-ejemplo-factura10.tex,
-factura-ejemplo-reporte1.tex, factura-ejemplo-reporte2.tex,
-factura-ejemplo-reporte3.tex and factura-beispiel-rechnung.tex.
-
-\endpreamble
-\keepsilent
-\askforoverwritefalse
-\obeyspaces
-\Msg{*****************************************************************}
-\Msg{**************************** factura ****************************}
-\Msg{*****************************************************************}
-\generate{\file{\jobname.cls}{\from{\jobname.dtx}{class}}}
-\generate{\file{\jobname.def}{\from{\jobname.dtx}{def}}}
-\Msg{\jobname.cls and \jobname.def written.}
-\Msg{}
-\postamble
-\endpostamble
-\def\factuno{factura-ejemplo-factura01.tex}
-\def\factdos{factura-ejemplo-factura02.tex}
-\def\facttres{factura-ejemplo-factura03.tex}
-\def\factcuatro{factura-ejemplo-factura04.tex}
-\def\factcinco{factura-ejemplo-factura05.tex}
-\def\factseis{factura-ejemplo-factura06.tex}
-\def\factsiete{factura-ejemplo-factura07.tex}
-\def\factocho{factura-ejemplo-factura08.tex}
-\def\factnueve{factura-ejemplo-factura09.tex}
-\def\factdiez{factura-ejemplo-factura10.tex}
-\def\repuno{factura-ejemplo-reporte1.tex}
-\def\repdos{factura-ejemplo-reporte2.tex}
-\def\reptres{factura-ejemplo-reporte3.tex}
-\def\cotiza{factura-ejemplo-cotizacion.tex}
-\def\prefac{factura-ejemplo-prefactura.tex}
-\def\beispiel{factura-beispiel-rechnung.tex}
-\def\auxejemplo{factura-ejemplo-aux.tex}
-\def\firma{factura-ejemplo-firma.tex}
-\def\fondo{factura-ejemplo-fondo.tex}
-\def\membrete{factura-ejemplo-membrete.tex}
-\generate{\file{\factuno}{\from{\jobname.dtx}{factuno}}}
-\generate{\file{\factdos}{\from{\jobname.dtx}{factdos}}}
-\generate{\file{\facttres}{\from{\jobname.dtx}{facttres}}}
-\generate{\file{\factcuatro}{\from{\jobname.dtx}{factcuatro}}}
-\generate{\file{\factcinco}{\from{\jobname.dtx}{factcinco}}}
-\generate{\file{\factseis}{\from{\jobname.dtx}{factseis}}}
-\generate{\file{\factsiete}{\from{\jobname.dtx}{factsiete}}}
-\generate{\file{\factocho}{\from{\jobname.dtx}{factocho}}}
-\generate{\file{\factnueve}{\from{\jobname.dtx}{factnueve}}}
-\generate{\file{\factdiez}{\from{\jobname.dtx}{factdiez}}}
-\generate{\file{\repuno}{\from{\jobname.dtx}{repuno}}}
-\generate{\file{\repdos}{\from{\jobname.dtx}{repdos}}}
-\generate{\file{\reptres}{\from{\jobname.dtx}{reptres}}}
-\generate{\file{\cotiza}{\from{\jobname.dtx}{cotiza}}}
-\generate{\file{\prefac}{\from{\jobname.dtx}{prefac}}}
-\generate{\file{\beispiel}{\from{\jobname.dtx}{beispiel}}}
-\generate{\file{\auxejemplo}{\from{\jobname.dtx}{aux}}}
-\generate{\file{\firma}{\from{\jobname.dtx}{firma}}}
-\generate{\file{\fondo}{\from{\jobname.dtx}{fondo}}}
-\generate{\file{\membrete}{\from{\jobname.dtx}{membrete}}}
-\Msg{.tex examples written.}
-\Msg{}
-\Msg{*****************************************************************}
-\immediate\write18{makeindex -s gind.ist -o \jobname.ind \jobname.idx}
-\immediate\write18{makeindex -s gglo.ist -o \jobname.gls \jobname.glo}
-\Msg{}
-\Msg{Change history and index updated.}
-\Msg{*****************************************************************}
-\Msg{To produce only package files, type}
-\Msg{ pdftex \jobname.dtx}
-\Msg{To produce package files and pdf documentation, type}
-\Msg{ xelatex \jobname.dtx}
-\Msg{ pdflatex factura-ejemplo-fondo.tex}
-\Msg{ pdflatex factura-ejemplo-membrete.tex}
-\Msg{ xelatex factura-ejemplo-firma.tex}
-\Msg{}
-\Msg{Also compile all other examples and recompile \jobname.dtx.}
-\Msg{(factura-ejemplo-aux.tex is not an example!)}
-\Msg{}
-\Msg{To manual update index and changelog, type}
-\Msg{ makeindex -s gind.ist -o \jobname.ind \jobname.idx}
-\Msg{ makeindex -s gglo.ist -o \jobname.gls \jobname.glo}
-\Msg{}
-\Msg{More information (in spanish) about compiling on README and documentation.}
-\Msg{}
-\Msg{*****************************************************************}
-\Msg{**************************** factura ****************************}
-\Msg{*****************************************************************}
-\Msg{}
-\endbatchfile
-%%
-%%
-%% End of file `factura.ins'.
diff --git a/Master/texmf-dist/source/latex/fancyhdr/fancyhdr.dtx b/Master/texmf-dist/source/latex/fancyhdr/fancyhdr.dtx
index 7c4da85a050..d2a6dc96119 100644
--- a/Master/texmf-dist/source/latex/fancyhdr/fancyhdr.dtx
+++ b/Master/texmf-dist/source/latex/fancyhdr/fancyhdr.dtx
@@ -1,8 +1,8 @@
% \iffalse meta-comment
%
-% Copyright (C) 2016 by Piet van Oostrum <piet@vanoostrum.org>
+% Copyright (C) 1994-2021 by Pieter van Oostrum <pieter@vanoostrum.org>
% -------------------------------------------------------
-%
+%
% This file 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.
@@ -10,7 +10,7 @@
%
% http://www.latex-project.org/lppl.txt
%
-% and version 1.3 or later is part of all distributions of LaTeX
+% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% \fi
@@ -26,11 +26,11 @@
%<fancyhdr>\ProvidesPackage{fancyhdr}%
%<fancyheadings>\ProvidesPackage{fancyheadings}
%<extramarks>\ProvidesPackage{extramarks}
-%<fancyhdr|fancyheadings|extramarks> [2019/01/31 v3.10
+%<fancyhdr|fancyheadings|extramarks> [2021/01/28 v4.0.1
%<fancyhdr> Extensive control of page headers and footers]%
%<fancyheadings> Legacy package to call fancyhdr]
%<extramarks> Extra marks for LaTeX]
-%<fancyhdr|extramarks>% Copyright (C) 1994-2019 by Piet van Oostrum <piet@vanoostrum.org>
+%<fancyhdr|extramarks>% Copyright (C) 1994-2021 by Pieter van Oostrum <pieter@vanoostrum.org>
%<fancyheadings>% Public domain
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \end{macrocode}
@@ -48,6 +48,8 @@
\usepackage[T1]{fontenc}
\usepackage{url}
\usepackage[fit]{truncate}
+\usepackage[colorlinks,linktocpage]{hyperref}
+\usepackage{ifthen}
\usepackage{fancyhdr}
\GetFileInfo{fancyhdr.sty}
\def\latex/{\protect\LaTeX{}}
@@ -59,8 +61,8 @@
\newcommand{\PSNFSS}{{\sf
PSNFSS}}
\newcommand{\bs}{\symbol{'134}}
-\let\environment\texttt
-\let\Package\textsf
+\newcommand{\env}[1]{\texttt{#1}}
+\newcommand{\Package}[1]{\textsf{#1}}
\renewcommand{\partname}{Part}
\DisableCrossrefs
\CodelineIndex
@@ -70,6 +72,7 @@
\newcommand{\CmdIndex}[1]{\index{#1=\string\texttt{\bs#1}}}
\newcommand{\TTindex}[1]{\index{#1=\string\texttt{#1}}}
\newcommand{\PSindex}[1]{\index{page style>#1=\string\texttt{#1}}}
+\newcommand{\OPTindex}[1]{\index{option>#1=\string\texttt{#1}}}
\renewcommand{\topfraction}{0.9}
\renewcommand{\bottomfraction}{0.9}
\renewcommand{\textfraction}{0.05}
@@ -84,6 +87,96 @@
\newenvironment{xvspace}{\vspace{1ex}}{{\vspace{1ex}}}
\setcounter{tocdepth}{1}
+% Compare section numbers in references
+\usepackage{refcount}
+\newcounter{secnum}
+% #1=current section label #2=ref section label
+\newcommand{\smartref}[2]{%
+ \setcounterref{secnum}{#1}%
+ \addtocounter{secnum}{-1}%
+ \ifnum\value{secnum}=\getrefnumber{#2}
+ the previous section%
+ \else
+ \addtocounter{secnum}{2}%
+ \ifnum\value{secnum}=\getrefnumber{#2}
+ the next section%
+ \else
+ section~\ref{#2}%
+ \fi
+ \fi
+}
+
+% Our own page style:
+\pagestyle{fancy}
+\addtolength{\headwidth}{\marginparsep}
+\addtolength{\headwidth}{0.5\marginparwidth}
+\fancyhf{}
+\fancyhead[L]{\rightmark}
+\fancyhead[R]{\textbf{\thepage}}
+\renewcommand{\sectionmark}[1]{\markright{\thesection\quad#1}}
+
+% Page style for demonstrating struts, \headruleskip and \footruleskip.
+
+\newcommand{\strutheader}{%
+ \texttt{\textbackslash strut}:
+ \rule[-0.3\normalbaselineskip]{10pt}{0.3\normalbaselineskip}%
+ \rule{10pt}{0.7\normalbaselineskip}
+ \texttt{\textbackslash headruleskip}$\searrow$
+ \raisebox{-0.3\normalbaselineskip}[0pt][0pt]%
+ {\ifdim \headruleskip>0pt
+ \rule[-\headruleskip]{10pt}{\headruleskip}
+ \else
+ \rule{10pt}{-\headruleskip}
+ \fi}
+}
+\newcommand{\strutfooter}{%
+ \raisebox{0pt}[0pt][0pt]{%
+ \texttt{\textbackslash strut}:
+ \rule[-0.3\normalbaselineskip]{10pt}{0.3\normalbaselineskip}%
+ \rule{10pt}{0.7\normalbaselineskip}
+ \texttt{\textbackslash footruleskip} $\nearrow$
+ \rule[0.7\normalbaselineskip]{10pt}{\footruleskip}}%
+}
+\fancypagestyle{showstruts}{%
+ \fancyhead[L]{%
+ \ifthenelse{\value{page}=\pageref{showstruts}}%
+ {\strutheader}%
+ {\rightmark}%
+ }
+ \fancyfoot[L]{%
+ \ifthenelse{\value{page}=\pageref{showstruts}}%
+ {\strutfooter}%
+ {}%
+ }
+ \fancyheadinit{%
+ \ifthenelse{\value{page}=\pageref{showstruts}}%
+ {\renewcommand{\headruleskip}{4pt}}%
+ {\renewcommand{\headruleskip}{0pt}}%
+ }
+ \fancyfootinit{%
+ \ifthenelse{\value{page}=\pageref{showstruts}}%
+ {\renewcommand{\footrulewidth}{0.4pt}}%
+ {\renewcommand{\footrulewidth}{0pt}}%
+ }
+}
+% Change \MacroFont to have verbatim in normal size
+\renewcommand{\MacroFont}%
+ {\fontencoding\encodingdefault
+ \fontfamily\ttdefault
+ \fontseries\mddefault
+ \fontshape\shapedefault
+ \normalsize}
+
+\newcounter{example}
+\newcommand{\Example}{%
+ \refstepcounter{example}%
+ \marginpar{\vspace{\baselineskip}\hfill Example \theexample\quad\quad}%
+}
+\newcommand{\FExample}{%
+ \refstepcounter{example}%
+ \makebox[0pt][r]{{Example \theexample}\quad\quad}%
+}
+
\begin{document}
\DeleteShortVerb{\|}
\DocInput{\jobname.dtx}
@@ -91,7 +184,7 @@
%</driver>
% \fi
%
-% \CheckSum{1045}
+% \CheckSum{0}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -116,7 +209,7 @@
%
% \title{The \Package{fancyhdr} and \Package{extramarks}
% packages\\{\normalsize version \fileversion.}}
-% \author{Piet van Oostrum\thanks{A considerable part of this documentation was
+% \author{Pieter van Oostrum\thanks{A considerable part of this documentation was
% written by George
% Gr\"atzer (University of Manitoba) in \emph{Notices Amer. Math. Soc.}
% Thanks, George!}\\
@@ -127,22 +220,25 @@
% \maketitle
% \begin{abstract}
% This document describes how to customize the page layout of your LaTeX
-% documents, i.e how to change page margings and sizes,
+% documents, i.e how to change page margings and sizes,
% headers and footers, and the
% proper placement of figures and tables (collectively called floats) on
-% the page.
-%
-% This documentation describes version 3.10 or later of the
+% the page.
+%
+% This documentation describes version 4.0 or later of the
% \Package{fancyhdr} and \Package{extramarks} packages. The user
% documentation is valid for the versions 3.8 or later of the
-% \Package{fancyhdr} package and version 2.1 or later of the
+% \Package{fancyhdr} package (except for the changes mentioned in
+% section~\ref{sec:version-4}), and version 2.1 or later of the
% \Package{extramarks} package.
-%
+%
% \end{abstract}
+%
% \tableofcontents
+% \markright{Contents}
%
%\part{Introduction}
-%
+%
% This document contains four parts:
%
% Part I is a short documentation on
@@ -156,21 +252,54 @@
%
% Part IV contains the annotated implementation.
%
+% This document describes version 4 of \Package{fancyhdr}. This version
+% is also described in the forthcoming edition 3 of \textit{The \latex/ Companion},
+% whereas the previous editions describe version 3 of \Package{fancyhdr}.
+% There are some significant differences between these versions. These
+% are summarized in section~\ref{sec:version-4} on page~\pageref{sec:version-4}.
+% Throughout this documentation it is mentioned when a specific feature
+% is only available in version 4, or when there are differences between
+% version 3 and 4.
+%
% \section{Installation}
% \label{sec:installation}
-%
+%
% The preferred way to install this package is with a package installer.
% If you want to install it by hand, then first run the command
% \verb+tex fancyhdr.ins+ and then move the files \texttt{fancyhdr.sty},
% \texttt{extramarks.sty} and \texttt{fancyheadings.sty} to a place
% where \latex/ can find it, preferably in a directory similar to
% \texttt{.../texmf/tex/latex/fancyhdr/} in your \tex/ directory tree.
-%
+%
% \section{Using \Package{fancyhdr}}
%
% The package \Package{fancyhdr} gives you several commands to define
% headers and footers of the pages in a \latex/ document.
-%
+% You load the package with the following command in the preamble:
+% \begin{quote}
+% \verb|\usepackage|\oarg{options}\verb|{fancyhdr}|
+% \end{quote}
+% (Options are available since version~4.0)
+% The following options are supported:
+% \begin{center}
+% \begin{tabular}{ l l }
+% \toprule
+% Option & Meaning \\
+% \midrule
+% \texttt{nocheck} & do not check the heights of the header and footer \\
+% & (see section~\ref{sec:warning} on page~\pageref{page:warning})\\
+% \texttt{compatV3} & keep some behaviour (now considered undesirable) as in version~3 \\
+% & (see section~\ref{sec:options} and section~\ref{sec:warning} on
+% page~\pageref{page:warning}) \\
+% \texttt{headings} & redefine the \texttt{headings} page style to be fancy-based \\
+% \texttt{myheadings} & redefine the \texttt{myheadings} page style to be fancy-based \\
+% \bottomrule
+% \end{tabular}
+% \end{center}
+% \OPTindex{nocheck}
+% \OPTindex{compatV3}
+% \OPTindex{headings}
+% \OPTindex{myheadings}
% \DescribeMacro{\fancyhead}
% \DescribeMacro{\fancyfoot}
% \DescribeMacro{\fancyhf}
@@ -199,60 +328,65 @@
% These define offsets to let the headers stick into the margin (or to
% the inside if negative). Places cannot contain the \texttt{C}
% specifier. See section~\ref{sec:book-examples} for more details.
-%
-% \DescribeMacro{\headrulewidth}
+%
% \DescribeMacro{\headrulewidth}
+% \DescribeMacro{\footrulewidth}
+% \DescribeMacro{\headruleskip}
+% \DescribeMacro{\footruleskip}
% \DescribeMacro{\headrule}
% \DescribeMacro{\footrule}
% \DescribeMacro{\headwidth}
-% \begin{verbatim}
-% \headrulewidth
-% \footrulewidth
-% \headrule
-% \footrule
-% \headwidth
-% \end{verbatim}
%
-% \cs{headrulewidth} and \cs{headrulewidth} are macros to define the
+% \cs{headrulewidth} and \cs{footrulewidth} are macros to define the
% thickness of a line under the header and above the footer.
-% \cs{headrule} and \cs{footrule} are macros to completely redefines
+% \cs{headruleskip} and \cs{footruleskip} are macros that define the
+% distance between the lines and the header and footer text,
+% respectively. (But \cs{headruleskip} is only available since version~4.0.)
+% \cs{headrule} and \cs{footrule} are macros to completely redefine
% these lines. And \cs{headwidth} is a length parameter that defines the
-% total width of the headers and footers. See sections~\ref{sec:simple},
-% \ref{sec:fancy} and \ref{sec:book-examples} for more details.
+% total width of the headers and footers. See section~\ref{sec:book-examples} for more details.
+%
+% \DescribeMacro{\fancyheadinit}
+% \DescribeMacro{\fancyfootinit}
+% \DescribeMacro{\fancyhfinit}
+%
+% \cs{fancyheadinit} and \cs{fancyfootinit} can be used to define
+% initialisation code for the header and footer, respectively, and
+% \cs{fancyhfinit} defines both of these. These commands are only
+% available in fancyhdr version~4.0 and later. See section~\ref{sec:change}.
+%
+% \DescribeMacro{\fancycenter}
+% (Only in version~4.0 and later.) The command \cs{fancycenter} packs 3
+% header fields into a full-width header. See section~\ref{sec:fancycenter}.
%
% \DescribeMacro{\iftopfloat}
% \DescribeMacro{\ifbotfloat}
% \DescribeMacro{\iffloatpage}
% \DescribeMacro{\iffootnote}
-% \begin{verbatim}
-% \iftopfloat
-% \ifbotfloat
-% \iffloatpage
-% \iffootnote
-% \end{verbatim}
%
-% These are macros to detect if there is a float on the top or the bottom
-% of the page, or the page is a float page, or if there is a footnote at
-% the bottom of the page. These can be used to choose different headers
-% and/or footers if these conditions are met. See
+% The macros \cs{iftopfloat}, \cs{ifbotfloat}, \cs{iffloatpage} and
+% \cs{iffootnote} are used to detect if there is a float on the top or
+% the bottom of the page, or the page is a float page, or if there is
+% a footnote at the bottom of the page. These can be used to choose
+% different headers and/or footers if these conditions are met. See
% section~\ref{sec:float} for more details.
-%
+%
+% \begin{quote}
% \DescribeMacro{\fancypagestyle}
-% \begin{verbatim}
-% \fancypagestyle{pagestyle}{commands}
-% \end{verbatim}
+% \verb|\fancypagestyle|\marg{style-name}\oarg{base-style}\marg{definitions}
+% \end{quote}
% This command lets you (re)define page styles for use in special
-% situations. See section~\ref{sec:pagestyle-plain} for more details.
+% situations. See section~\ref{sec:fancypagestyle} for more details.
%
-% \section{Using extramarks}
+% \section{Using \Package{extramarks}}
% \label{sec:using-extramarks}
-%
+%
% The \Package{extramarks} gives you some extra marks in \latex/,
% besides the normal \cs{leftmark} and \cs{rightmark}, that are defined
% by the \cs{markboth} and \cs{markright} commands.
%
% \DescribeMacro{\firstleftmark}
-% \DescribeMacro{\firstleftmark}
+% \DescribeMacro{\lastrightmark}
% \DescribeMacro{\firstrightmark}
% \DescribeMacro{\lastleftmark}
% \begin{verbatim}
@@ -292,9 +426,9 @@
%
% \section{Introduction}
% \label{sec:intro}
-%
+%
% A page in a \LaTeX{} document is built from various elements as shown in
-% figure \ref{fig:layout}.
+% figure \ref{fig:layout}.
% \begin{figure}[htbp]
% \begin{center}
% \leavevmode
@@ -306,53 +440,53 @@
% \end{figure}
% \thispagestyle{plain}
% The body contains the main text of the document
-% together with the so called floats (tables and figures).
-%
+% together with the so called floats (tables and figures).
+%
% The pages are constructed by \LaTeX's output routine, which is quite
% complicated and should therefore not be modified. Some of the packages
% described in this paper contains small modifications to the output routine
% to accomplish things that cannot be done in another way. You should use
% these packages to get the desired result rather than fiddling with the
% output routine yourself.
-%
+%
% There are a number of things that you must be aware of:
% \begin{enumerate}
% \item The margins on the left are not called \cs{leftmargin}, but
% \cs{evensidemargin} (on even-numbered pages) and \cs{oddsidemargin}
-% (on odd-numbered pages). In one-sided documents
+% (on odd-numbered pages). In one-sided documents
% \cs{oddsidemargin} is used for either. \cs{leftmargin} is also a valid
% \latex/ parameter but it has a different use (namely the indentation of
-% lists).
+% lists).
% \item Most of the parameters should not be changed in the middle of a
% document. Some changes might work at a pagebreak. If you want to change
% the height of a single page, you can use the \cs{enlargethispage}
-% command.
+% command.
% \end{enumerate}
-%
+%
% The margin notes
% area contains small pieces of information created by the \cs{marginpar}
% command. On twosided documents the margin notes appear on the left and right
% alternatively. The margin notes are not on fixed places with respect to the
% paper but at approximately the same height as the paragraph in which they
% appear. Due to the algorithm used to decide the placement of margin notes,
-% in a twosided document unfortunately
+% in a twosided document unfortunately
% they may appear on the wrong side if they are close
% to a page break.
% If you want to put information on fixed places in the margins you may use
% the technique described in sections \ref{sec:movie} and \ref{sec:thumb}.
-%
+%
% The first part of this paper describes how to change the header and footer
% areas. The last part describes how to get your floats at the desired place.
-%
+%
% \section{Page headers and footers}
-%
+%
% The page headers and footers in \LaTeX{} are defined by the
% \cs{pagestyle} and \cs{pagenumbering} commands. \cs{pagestyle}
% defines the general contents of the headers and footers (e.g. where the
% page number will be printed), while
% \cs{pagenumbering} defines the format of the page number.
% \LaTeX{} has four standard page styles:
-%
+%
% \begin{center}
% \noindent
% \begin{tabular}{>{\tt}lp{9cm}}
@@ -366,13 +500,13 @@
% \bottomrule
% \end{tabular}
% \end{center}
-%
+%
% Although these are useful styles, they are quite limited. Additional page
% styles can be defined by defining commands of the form \cs{ps@xxx}. This
% command is executed when a \Cmd{pagestyle\{xxx\}} is given in the document.
-% The \cs{ps@xxx} command should define the following
+% The \cs{ps@xxx} command should define the following
% commands for the contents of the headers and footers:
-%
+%
% \begin{center}
% \noindent
% \begin{tabular}{lp{9cm}}
@@ -386,16 +520,16 @@
% \bottomrule
% \end{tabular}
% \end{center}
-%
+%
% These are not user commands, but rather ``variables'' that are used by
% \latex/'s output routine.
% As the command names contain the character '\texttt{@}', they should
% be defined in a package file, or otherwise be sandwiched between the commands
% \cs{makeatletter} and \cs{makeatother}.
-%
+%
% The \cs{pagenumbering} command defines the layout of the page number. It
% has a parameter from the following list:
-%
+%
% \begin{center}
% \begin{tabular}{>{\tt}ll}
% \toprule
@@ -407,19 +541,19 @@
% \bottomrule
% \end{tabular}
% \end{center}
-%
+%
% The \Cmd{pagenumbering\{xxx\}} defines the command \cs{thepage} to be the
-% expansion of the page number in the given notation \texttt{xxx}.
+% expansion of the page number in the given notation \texttt{xxx}.
% The pagestyle command
% then would include \cs{thepage} in the appropriate place. Additionally
% the \cs{pagenumbering} command resets the page number to~1.
% The \cs{pagestyle} and \cs{pagenumbering} apply to the page that is
% being constructed, so they should be used at a location where it is clear
% to what page they apply (see section \ref{sec:change}).
-%
-%
+%
+%
% \section{What is \Package{fancyhdr}}
-%
+%
% The \Package{fancyhdr} macro package allows you to customize
% in \latex/ your page headers and footers in an easy way. You can
% define:
@@ -432,25 +566,25 @@
% \item different headers and footers for chapter pages
% \item different headers and footer on pages with floats
% \end{itemize}
-%
+%
% Of course, you also have complete control over fonts, uppercase
% and lowercase displays, etc.
-%
+%
% \section{Simple use of \Package{fancyhdr}} To use this package
% install it is a place where \latex/ can find it (see
% section~\ref{sec:installation})\footnote{In most modern \tex/
% installation the package is already included.}, and include in the preamble of your document
-% the commands:
-%
+% the commands:
+%
% \PSindex{fancy}
% \begin{verbatim}
% \usepackage{fancyhdr}
% \pagestyle{fancy}
% \end{verbatim}
-%
+%
% We can visualize the page layout we can create with \Package{fancyhdr}
% as follows:
-%
+%
% \begin{fblock}
% \noindent\makebox[\textwidth]{LeftHeader\hfill
% CenteredHeader\hfill RightHeader}\showrule
@@ -459,33 +593,34 @@
% \noindent\makebox[\textwidth]{LeftFooter\hfill
% CenteredFooter\hfill RightFooter}
% \end{fblock}
-%
+%
% The LeftHeader and LeftFooter are left justified; the
% CenteredHeader and CenteredFooter are centered; the
% RightHeader and RightFooter are right justified.
-%
+%
% We define each of the six ``fields'' and the two decorative lines
% separately.
-%
+%
% \section{A simple example}
% \label{sec:simple}
-%
+%
% K. Grant is writing a report to Dean
% A. Smith, on ``The performance of new graduates'' with the
% following page layout:
-%
+%
% \begin{fblock}
% \noindent\makebox[\textwidth]{\hfill\textbf{The performance of new
% graduates}}\showrule
% \noindent\makebox[\textwidth]{\hfill page body\hfill}\\[\baselineskip]
-% \noindent\makebox[\textwidth]{\hrulefill}
+% \noindent\makebox[\textwidth]{\rule{\textwidth}{2pt}}
% \noindent\makebox[\textwidth]{From: K. Grant\phantom{3}\hfill
% To: Dean A. Smith\hfill \phantom{From: K. Grant}3}
% \end{fblock}
-%
+%
% \noindent where ``3'' is the page number. The title: ``The
-% performance of new graduates'' is bold.
-%
+% performance of new graduates'' is bold. The rule above the footer is a
+% bit thicker (2pt).
+%
% This is accomplished by these commands following
% \Cmd{pagestyle\{fancy\}}\footnote{Note that version 1 of fancyheadings
% used the \cs{setlength} command to change the \texttt{\bs...rulewidth} parameters.}:
@@ -500,15 +635,15 @@
% \fancyfoot[C]{To: Dean A. Smith}
% \fancyfoot[R]{\thepage}
% \renewcommand{\headrulewidth}{0.4pt}
-% \renewcommand{\footrulewidth}{0.4pt}
+% \renewcommand{\footrulewidth}{2pt}
% \end{verbatim}
% (The \cs{thepage} macro displays the current page number.
% \cs{textbf} puts it in bold face.)
-%
+%
% This is now fine, except that the first page does not need
% all these headers and footers. To eliminate all but the
% centered page number, issue the command
-%
+%
% \CmdIndex{thispagestyle}
% \begin{verbatim}
% \thispagestyle{plain}
@@ -519,44 +654,103 @@
% \CmdIndex{maketitle}
% \cs{maketitle}
% commands.
-%
+%
% Alternatively, issue
% \begin{verbatim}
% \thispagestyle{empty}
% \end{verbatim}
% if you do not want any headers or footers.
-%
+%
% In fact the standard \latex/ classes have the command \cs{maketitle}
% defined in such a way that a \Cmd{thispagestyle\{plain\}} is automatically
% issued. So if you \emph{do} want the fancy layout on a page containing
% \cs{maketitle} you must issue a \Cmd{thispagestyle\{fancy\}} after the
% \cs{maketitle}.
-%
+%
+% \section{Fancy Centering}
+% \label{sec:fancycenter}
+%
+% \textbf{Note:} This section only applies to \Package{fancyhdr} version~4.0
+% and later\footnote{This comes from the \Package{nccfancyhdr}
+% package by Alexander I. Rozhenko.}.
+%
+% The marks in a fancy header and footer are prepared using \cs{parbox}
+% command. So, you can use multiline marks. In the header, they are
+% aligned to the bottom line, but, in the footer, they are aligned to
+% the top line. The maximum width of every mark is equal to the
+% \cs{headwidth}. This can lead to overlapping of neighbouring marks.
+%
+% \DescribeMacro{\fancycenter}
+% If you want to prepare marks in more traditional way in a line
+% not exceeding the \cs{headwidth}, you can use
+% the following command in any mark command:
+% \begin{quote}
+% \cs{fancycenter}\oarg{distance}\oarg{stretch}\\
+% \verb| |\marg{left-mark}\marg{center-mark}\marg{right-mark}
+% \end{quote}
+% \CmdIndex{fancycenter}
+% This command works like
+% \begin{center}
+% \verb|\hbox to\linewidth{|\marg{left-mark}\cs{hfil}\marg{center-mark}\cs{hfil}\marg{right-mark}\verb|}|
+% \end{center}
+% but does this more carefully trying to exactly center the central part of
+% the text if possible. The solution for exact centering
+% is applied if the width of \meta{center-mark} is less than
+% \begin{quote}
+% \verb|\linewidth - 2*(|\meta{stretch}\verb|*|\meta{distance}\verb| +|\\
+% \verb| max(width(|\meta{left-mark}\verb|), width(|\meta{right-mark}\verb|)))|.
+% \end{quote}
+% Otherwise the \meta{center-mark} will slightly migrate to a shorter item
+% (\meta{left-mark} or \meta{right-mark}), but at least \meta{distance}
+% space between all parts of line is provided.
+% The default values of \meta{distance} and \meta{stretch}
+% are 1em and 3.
+%
+% If the \meta{center-mark} is empty, the \cs{fancycenter} is equivalent to
+% the following command:
+% \begin{center}
+% \verb|\hbox to\linewidth {|\marg{left-mark}\verb|\hfil |\marg{right-mark}\verb|}|
+% \end{center}
+%
+% You would use this in a header for example with
+% \begin{quote}
+% \verb|\fancyhead[C]{|\cs{fancycenter}\oarg{distance}\oarg{stretch}\\
+% \verb| |\marg{left-mark}\marg{center-mark}\marg{right-mark}\verb|}|
+% \end{quote}
+% and leave the \texttt{[L,R]} parts empty.
+%
+% \textbf{Note 1}: If the whole of the \cs{fancycenter} is wider than
+% \cs{headwidth} it will stick out on the right. See
+% section~\ref{sec:longtitles} for possible solutions.
+%
+% \textbf{Note 2}: The usage of \cs{fancycenter} command is not limited to the
+% argument of header/footer marks. You can use it anywhere in your document.
+%
% \section{An example of two-sided printing}\label{two-sided}
-%
+%
% \TTindex{twoside}
% Some document classes, such as \verb|book.cls|, print two-sided by default: the even
% pages and the odd pages have different layouts; other document classes
% use the \verb|twoside| option to print two-sided.
-%
+%
% Now let us print the report two-sided. Let the above page
% layout be used for the odd (right-side) pages, and the
% following for the even (left-side) pages:
-%
+%
% \begin{fblock}
-%
+%
% \noindent\makebox[\textwidth]{\textbf{The performance of new
% graduates}\hfill}\showrule
% \noindent\makebox[\textwidth]{\hfill page body\hfill}\\[\baselineskip]
% \noindent\makebox[\textwidth]{\hrulefill}
% \noindent\makebox[\textwidth]{4\phantom{To: Dean A. Smith}\hfill
% From: K. Grant\hfill \phantom{4}To: Dean A. Smith}
-%
+%
% \end{fblock}
% \noindent where ``4'' is the page number.
-%
+%
% Here are the commands:
-%
+%
% \begin{verbatim}
% \fancyhead{} % clear all header fields
% \fancyhead[RO,LE]{\textbf{The performance of new graduates}}
@@ -567,13 +761,13 @@
% \renewcommand{\headrulewidth}{0.4pt}
% \renewcommand{\footrulewidth}{0.4pt}
% \end{verbatim}
-%
+%
% \CmdIndex{fancyhead}
% \CmdIndex{fancyfoot}
% The commands \cs{fancyhead} and \cs{fancyfoot}
% have an additional parameter between square brackets that specifies
% for which pages and/or parts of the header/footer they apply. The first
-% \cs{fancyhead} command omits this parameter, and thus applies to all
+% \cs{fancyhead} command above omits this parameter, and thus applies to all
% header fields. In general this is only useful to get rid of the defaults or
% a previous definition, as is done here. Similar the \cs{fancyfoot} command
% without square brackets clears all footer fields. In this particular
@@ -583,7 +777,7 @@
% \Cmd{fancyhead[LE,RO]\{text\}}
% will define the field for both the left header on even pages and the right
% header on odd pages. If you don't give an \texttt{E} or \texttt{O} the definition applies to
-% both. Similar for \texttt{LRC}.
+% both. Similar for \texttt{LRC}.
% The selectors may be given as uppercase or lowercase letters.
% \begin{figure}[htb]
% \begin{center}
@@ -605,20 +799,20 @@
% \caption{Selectors}
% \label{fig:sel}
% \end{figure}
-%
+%
% \CmdIndex{fancyhf}
% There is also a more general command \cs{fancyhf} that you can use to
% combine the specifications for headers and footers. This allows additional
% selectors \texttt{H} (header) and \texttt{F} (footer). In fact \cs{fancyhead} and
% \cs{fancyfoot} are just \cs{fancyhf} with \texttt{H} and \texttt{F} pre-specified, respectively.
-%
+%
% Again, you may
% use \Cmd{thispagestyle\{plain\}} for a simple page layout for
% page~1.
-%
+%
% \section{Redefining page style \texttt{plain}}
% \label{sec:pagestyle-plain}
-%
+%
% Some \latex/ commands, like \cs{chapter}, use the \cs{thispagestyle}
% command to automatically switch to the \texttt{plain} page style, thus
% ignoring the page style currently in effect.
@@ -637,8 +831,8 @@
% \cs{ps@plain} command, but \Package{fancyhdr} gives you an easier way
% with the \cs{fancypagestyle} command. This command can be used to
% redefine existing page styles (like \texttt{plain}) or to define new ones,
-% e.g. if part of your document is to use a different page style. This command
-% has two parameters: the first one is the name of the page style to be defined, the
+% e.g. if part of your document needs a different page style. This command
+% has two mandatory parameters: the first one is the name of the page style to be defined, the
% second consists of commands that change the headers and/or footers, i.e.
% \verb|fancyhead| etc. Also allowed are changes to \cs{headrulewidth} and
% \cs{footrulewidth} or even \cs{headrule} and \cs{footrule}.
@@ -657,55 +851,206 @@
% \end{verbatim}
% Now when these special pages use the \texttt{plain} page style, they use your redefined version.
%
-% As another example, let us
+% As another example, let us
% redefine the \texttt{plain} style for the report in Section~\ref{two-sided} by
-% making the page number bold.
+% making the page number bold and enclosing it in en-dashes without any rules.
% \PSindex{plain}
-%
+%
% \begin{verbatim}
% \fancypagestyle{plain}{%
-% \fancyhf{} % clear all header and footer fields
-% \fancyfoot[C]{\textbf{\thepage}} % except the center
-% \renewcommand{\headrulewidth}{0pt}
-% \renewcommand{\footrulewidth}{0pt}}
-% \end{verbatim}
-%
-%
-% \section{The default layout}\label{default}
+% \fancyhf{}% clear all header and footer fields
+% \fancyfoot[C]{\textbf{--~\thepage~--}} % except the center
+% \renewcommand{\headrulewidth}{0pt}%
+% \renewcommand{\footrulewidth}{0pt}%
+% }
+% \end{verbatim}
+%
+%
+% \section{Defining other page styles}
+% \label{sec:fancypagestyle}
+%
+% Just like redefining the \texttt{plain} page style in the previous
+% section, you can define or redefine other page styles based on page
+% style \texttt{fancy}. This is also done with the \cs{fancypagestyle}
+% command. The general form of this command is:
+% \begin{quote}
+% \CmdIndex{fancypagestyle}
+% \verb|\fancypagestyle|\marg{style-name}\oarg{base-style}\marg{definitions}
+% \end{quote}
+% As you see, there is an optional argument between the two mandatory arguments.
+%
+% For example:
+% \begin{verbatim}
+% \fancypagestyle{toc}{%
+% \fancyhf{}%
+% \fancyhead[RO]{\thepage}%
+% \fancyhead[RO]{\textsl{TABLE OF CONTENTS}}%
+% \fancyfoot[C]{\thepage}
+% }
+% \end{verbatim}
+% This defines a special page style \texttt{toc} for use in the table
+% of contents with \Cmd{pagestyle\{toc\}}.
+% Inside the definition you can define the headers and/or footers,
+% change the header and footer rules, and redefine commands like
+% \cs{chaptermark} (see section~\ref{sec:options} for an example). The
+% headers and footers and marks that are not redefined inside the
+% \cs{fancypagestyle} definition, are taken from the global page style
+% \texttt{fancy} values.
+%
+% You can also give an optional base page style to the
+% \cs{fancypagestyle} command. Then the new page style will be based on
+% the base style. This base style must be a \texttt{fancyhdr}-defined
+% style. Also you should take care not to
+% create circular dependencies. In this case the order of picking up the
+% definitions (headers, footers, marks) is:
+% \begin{enumerate}
+% \item The definitions from the base style are taken.
+% \item The definitions given in the \cs{fancypagestyle} command
+% override and/or augment these.
+% \item Any definitions that are not given by the two above, are taken
+% from the environment at the time the new page style is used.
+% \end{enumerate}
+% Only the first two parts are embedded in the page style.
+% When no base style is given, part 1 is null.
+%
+% The optional base style argument is only available since version~4.0. In
+% this version it is also possible to redefine page style \texttt{fancy}
+% in this way. In version~3.x and earlier this was not possible.
+%
+% If you want to restore the original default definitions
+% from page style \texttt{fancy} as described in section~\ref{sec:default}, you can use
+% \begin{verbatim}
+% \fancypagestyle{myfancy}[fancydefault]{
+% . . . override some here
+% }
+% \end{verbatim}
+% \PSindex{fancydefault}
+% Page style \texttt{fancydefault} is the version of page style
+% \texttt{fancy} that has all the initialisation embedded. Contrary to
+% this, page style \texttt{fancy} as defined in the package uses the
+% same defaults, but doesn't have them embedded. It picks them up from
+% the environment. So if the environment changes, because you redefine
+% headers, footers, mark commands, etc, the functioning of page style
+% \texttt{fancy} changes with it. The page style \texttt{fancydefault}
+% does not change, however. However, \texttt{fancydefault} is only available
+% since fancyhdr version~4.0.
+%
+% \section{Package options}
+% \label{sec:options}
+%
+% \textbf{NOTE:} This section applies to fancyhdr version~4.0 and later.
+%
+% You can supply options to the \cs{usepackage} command:
+% \begin{quote}
+% \verb|\usepackage|\oarg{options}\verb|{fancyhdr}|
+% \end{quote}
+% % The following options are supported:
+% \begin{center}
+% \OPTindex{nocheck}\OPTindex{compatV3}\OPTindex{headings}\OPTindex{myheadings}
+% \begin{tabular}{ l l }
+% \toprule
+% Option & Meaning \\
+% \midrule
+% \texttt{nocheck} & do not check the heights of the header and footer \\
+% \texttt{compatV3} & keep some behaviour (now considered undesirable) as in version~3 \\
+% \texttt{headings} & redefine the \texttt{headings} page style to be fancy-based \\
+% \texttt{myheadings} & redefine the \texttt{myheadings} page style to be fancy-based \\
+% \bottomrule
+% \end{tabular}
+% \end{center}
+%
+% \begin{itemize}
+% \item \OPTindex{nocheck}Option \texttt{nocheck} is described in section~\ref{sec:warning} on
+% page~\pageref{page:warning}.
+%
+% \item \OPTindex{compatV3}Option \texttt{compatV3} keeps two fancyhdr
+% version~3.x (or earlier) features that are now considered undesirable.
+% \begin{enumerate}
+% \item The automatic adjustment of \cs{headheight} or \cs{footskip}
+% when these are too small. This causes the page layout to become
+% inconsistent. See section~\ref{sec:warning} on
+% page~\pageref{page:warning}.
+% \item In these previous versions the changes to the
+% \Package{fancyhdr} headers and footers (including those by
+% \cs{fancyhead}, \cs{fancyheadoffset} and similar commands) are
+% made globally, except within a page style defined by
+% \cs{fancypagestyle}. That is, when these commands are given inside
+% a \LaTeX{} group, they affect the whole document, not only the
+% group. If your document depends on this behaviour, you can give
+% the \texttt{compatV3} package option. However, this is only
+% considered a short-time solution. You should change your document
+% as soon as possible to work around this problem. In version~4.0 and
+% later, without this option, the changes are always local.
+% \end{enumerate}
+% The option is scheduled to disappear in version~5 of
+% \Package{fancyhdr}.
+%
+% \item \PSindex{headings}\PSindex{myheadings}\OPTindex{headings}\OPTindex{myheadings}
+% The options \texttt{headings} and \texttt{myheadings} redefine the
+% corresponding page style with fancyhdr commands (including a
+% decorative line under the header), so that you can later select this
+% page style as the page style for (part of) the
+% document\footnote{These options were copied from the
+% \texttt{nccfancyhdr} package, but contrary to that package, they are
+% not automatically selected.}.
+% \end{itemize}
+%
+% \PSindex{headings}
+% The page style \texttt{headings} is in some aspects similar to the default page
+% style \texttt{fancy} settings. In the \texttt{fancy} page style, the
+% page number is in the footer, but in the \texttt{headings}
+% page style it is in the header. The header fields look similar, however.
+%
+% Please note that these page styles redefine the \cs{chaptermark} and/or
+% \cs{[sub]sectionmark} commands (see section~\ref{sec:scoop}), as do the
+% standard \latex/ page styles. The consequence is, that if you select
+% e.g.\ \Cmd{pagestyle\{headings\}}, the definitions of
+% \Cmd{pagestyle\{fancy\}} are overridden.
+% Also when you change the headers and/or footers
+% while such a page style is in effect, and you then switch back to this
+% page style, for
+% example with \verb|\pagestyle{headings}|, they revert to the built-in
+% settings. Therefore it is not advisable to change the headers or
+% footers in this way, but instead define your
+% own page style, as explained in section~\ref{sec:fancypagestyle}.
+%
+% \section{The default layout}
+% \label{sec:default}
% Let us use the \verb|book.cls| documentclass and the default settings for
-% \Package{fancyhdr}; so we only issue the commands
-%
+% \Package{fancyhdr}; so we don't use any of the page style options in
+% the \Cmd{usepackage\{fancyhdr\}} command, and we don't redefine any
+% headers or footers. So just:
% \begin{verbatim}
% \usepackage{fancyhdr}
% \pagestyle{fancy}
% \end{verbatim}
-% and let \Package{fancyhdr} take care of everything. On the
-% pages where new chapters start, we get a centered page number in
-% the footer; there is no header, and there are no decorative lines.
-%
+% and let \Package{fancyhdr} take care of everything. As mentioned
+% before, we get a layout that is very similar to the page style \texttt{headings}.
+%
+% On the pages where new chapters start, we get a centered page number
+% in the footer; there is no header, and there are no decorative lines.
+%
% On an even page, we get the layout:
-%
+%
% \begin{fblock}
% \noindent\makebox[\textwidth]{\textsl{1.2 EVALUATION}\hfill
% \textsl{CHAPTER 1. INTRODUCTION}}\showrule
-% \noindent\makebox[\textwidth]{\hfill page body\hfill}\\[\baselineskip]
-% \noindent\makebox[\textwidth]{\hrulefill}
-% \noindent\makebox[\textwidth]{\hfill4\hfill}
+% \noindent\makebox[\textwidth]{\hfill page body\hfill}\\[2\baselineskip]
+% \noindent\makebox[\textwidth]{\hfill2\hfill}
% \end{fblock}
-%
+%
% On an odd page, we get the layout:
-%
+%
% \begin{fblock}
% \noindent\makebox[\textwidth]{\textsl{CHAPTER 1. INTRODUCTION}\hfill
% \textsl{1.2 EVALUATION}}\showrule
-% \noindent\makebox[\textwidth]{\hfill page body\hfill}\\[\baselineskip]
-% \noindent\makebox[\textwidth]{\hrulefill}
+% \noindent\makebox[\textwidth]{\hfill page body\hfill}\\[2\baselineskip]
% \noindent\makebox[\textwidth]{\hfill
% 3\hfill }
% \end{fblock}
-%
+%
% \noindent where the header text is slanted uppercase.
-%
+%
% This default layout is produced by the following commands:
% \CmdIndex{rightmark}
% \CmdIndex{leftmark}
@@ -714,45 +1059,52 @@
% \fancyhead[LO,RE]{\textsl{\leftmark}}
% \fancyfoot[C]{\thepage}
% \end{verbatim}
-%
+%
% The following settings are used for the decorative lines:
-%
+%
% \begin{tabbing}
% \CmdIndex{headrulewidth}
% \noindent \cs{headrulewidth}\qquad \qquad \qquad \=0.4\=pt\\
% \CmdIndex{footrulewidth}
% \Cmd{footrulewidth}\>0\>pt
% \end{tabbing}
-%
-% The header text is turned into all uppercase in \verb|book.cls|.
-%
-% \section{The scoop on \latex/'s marks}\label{sec:custom}
+%
+% The header text is turned into all uppercase by the standard \LaTeX{}
+% code in \verb|book.cls|.
+%
+% \section{The scoop on \latex/'s marks}
% \label{sec:scoop}
-%
+%
% Usually, for documents of class \verb|book| and \verb|report|, you may
% want to use chapter and section information in the headings (chapter only
% for one-sided printing), and for documents of class \verb|article|,
% section and subsection information (section only for one-sided
% printing). \latex/ uses a marker mechanism to remember the chapter and
% section (section and subsection) information for a page; this is
-% discussed in detail in \textit{The \latex/ Companion}, Section 4.3.1, or
+% discussed in detail in \textit{The \latex/ Companion}, Section 4.3.1, or
% \textit{The \latex/ Companion, Second Edition}, Section 4.3.4.
-%
+%
% There are two ways you can use and change the higher- and lower-level
% sectioning information available to you. The macros:
% \CmdIndex{rightmark}
% \CmdIndex{leftmark}
% \cs{leftmark}
% (higher-level) and \cs{rightmark} (lower-level) contain the information
-% processed by \latex/, and you can use them directly as shown in
-% Section~\ref{default}.
-%
+% processed by \latex/, and you can use them directly as shown in
+% section~\ref{sec:default}.
+%
+% These marks are set by the commands
+% \Cmd{markboth\{leftmark\}\{rightmark\}} and \Cmd{markright\{rightmark\}}.
+% These commands are usually used inside commands like \cs{chaptermark}
+% and \cs{sectionmark} but they can be also be given directly in your
+% document, although this not very usual.
+%
% The \cs{leftmark} contains the \textbf{L}eft argument of the \emph{\textbf{L}ast}
% \cs{markboth} on the page, the \cs{rightmark} contains the \textbf{R}ight
% argument of the \emph{fi\textbf{R}st} \cs{markboth} or the only argument of the
% \emph{fi\textbf{R}st} \cs{markright} on the page. If no marks are present on a
% page they are ``inherited'' from the previous page.
-%
+%
% You can influence how chapter, section, and subsection
% information (only two of them!) is displayed by redefining the
% \CmdIndex{chaptermark}
@@ -764,7 +1116,7 @@
% they are seldom used.}. You must put the redefinition
% after the first call of \Cmd{pagestyle\{fancy\}} as this
% sets up the defaults.
-%
+%
% Let us illustrate this with chapter info. It is made up of three parts:
% \begin{itemize}
% \CmdIndex{thechapter}
@@ -773,19 +1125,53 @@
% \CmdIndex{chaptername}
% \cs{chaptername}
% \item the title, contained in the argument of
-% \cs{chaptermark}.
+% \cs{chapter}.
% \end{itemize}
-%
-% Figure~\ref{fig:markers} shows some variants for ``Chapter 2.\ Do it now''
-% (the last example is appropriate in some non-English languages). The \%
+% We combine these below with \cs{markboth} in \cs{chaptermark}.
+%
+% For the lower-level sectioning information, we do the same with
+% \cs{markright} in \cs{sectionmark}.
+%
+% So if ``2. Implementation'' is the current chapter
+% and ``2.1.\ First steps'' is the current section, then
+%
+% ^^A \Example
+% \begin{verbatim}
+% \renewcommand{\chaptermark}[1]{%
+% \markboth{\chaptername\ \thechapter.\ #1}{}}
+% \renewcommand{\sectionmark}[1]{\markright{\thesection.\ #1}}
+% \end{verbatim}
+% will give
+% ``Chapter 2. Implementation'' and ``2.1.\ First steps''
+%
+% Redefining the \cs{chaptermark} and \cs{sectionmark} commands may
+% not eliminate all uppercaseness. E.g.\ the bibliography will have a title
+% \CmdIndex{uppercase}
+% \index{BIBLIOGRAPHY}
+% of \textsc{bibliography} in the header, as the \cs{MakeUppercase} is
+% explicitly given in the definition of \cs{thebibliography}. Similar for
+% \index{INDEX}
+% \textsc{index} etc.\ If you don't want to redefine these commands, you can
+% use the \cs{nouppercase} command that \Package{fancyhdr} makes available in the header
+% and footer fields. Note that this may screw other things, like uppercase
+% roman numerals in your headers, so it should be used with care. Essentially
+% this command typesets its argument in an environment where
+% \cs{MakeUppercase} and \cs{uppercase} are changed into do-nothing operations.
+%
+% ^^A \Example
+% \begin{verbatim}
+% \fancyhead[L]{\nouppercase{\rightmark}}
+% \fancyhead[R]{\nouppercase{\leftmark}}
+% \end{verbatim}
+%
+% Figure~\ref{fig:markers} shows some variants for ``Chapter 2.\ Implementation''
+% (the last example is appropriate in some non-English languages). The \texttt{\%}
% signs at the end of the lines are to prevent unwanted space. Normally you
-% would continue the lines and remove these \% signs\footnote{the \texttt{\bs
+% would continue the lines and remove these \texttt{\%} signs\footnote{The \texttt{\bs
% MakeUppercase} command is used in \latex/ to generate uppercase text,
-% while in \LaTeX{} 2.09 \cs{uppercase} is used. The difference is
-% that \cs{MakeUppercase} also deals with non-ASCII letters.
-% Fancyhdr defines \cs{MakeUppercase} to be an alias for
-% \cs{uppercase} if it isn't defined.}.
-%
+% while \cs{uppercase} is the plain \TeX{} command for this. The difference is
+% that \cs{MakeUppercase} also deals with non-ASCII letters.}.
+%
% \begin{figure}[tb]
% \CmdIndex{chaptermark}
% \CmdIndex{uppercase}
@@ -819,93 +1205,70 @@
% \verb| \ \chaptername.\ #1}{}}|\\
% Prints:\\
% \mbox{}\\
-% Chapter 2.\ Do it now\\
+% Chapter 2.\ Implementation\\
% \mbox{}\\
% \mbox{}\\
% \mbox{}\\
-% CHAPTER 2.\ Do it now\\
+% CHAPTER 2.\ Implementation\\
% \mbox{}\\
% \mbox{}\\
% \mbox{}\\
% \mbox{}\\
-% CHAPTER 2.\ DO IT NOW\\
+% CHAPTER 2.\ IMPLEMENTATION\\
% \mbox{}\\
% \mbox{}\\
% \mbox{}\\
% \mbox{}\\
-% Do it now\\
+% Implementation\\
% \mbox{}\\
% \mbox{}\\
-% 2.\ Do it now\\
+% 2.\ Implementation\\
% \mbox{}\\
% \mbox{}\\
-% 2.\ Chapter.\ Do it now\\
+% 2.\ Chapter.\ Implementation\\
% \mbox{}\\
% \end{multicols}
% \caption{Marker variants}\label{fig:markers}
% \end{figure}
-%
-%
-% For the lower-level sectioning information, do the same with
-% \cs{markright}.
-%
-% So if ``Section 2.2.\ First steps'' is the current section,
-% then
-%
-% \begin{verbatim}
-% \renewcommand{\sectionmark}[1]{\markright{\thesection.\ #1}}
-% \end{verbatim}
-% will give
-% ``2.2.\ First steps''
-%
-% Redefining the \cs{chaptermark} and \cs{sectionmark} commands may
-% not eliminate all uppercaseness. E.g.\ the bibliography will have a title
-% \CmdIndex{uppercase}
-% \index{BIBLIOGRAPHY}
-% of \textsc{bibliography} in the header, as the \cs{MakeUppercase} is
-% explicitly given in the definition of \cs{thebibliography}. Similar for
-% \index{INDEX}
-% \textsc{index} etc.\ If you don't want to redefine these commands, you can
-% use the \cs{nouppercase} command that \Package{fancyhdr} makes available in the header
-% and footer fields. Note that this may screw other things, like uppercase
-% roman numerals in your headers, so it should be used with care. Essentially
-% this command typesets its argument in an environment where
-% \cs{MakeUppercase} and \cs{uppercase} are changed into do-nothing operations.
-%
-%
-% \begin{verbatim}
-% \fancyhead[L]{\nouppercase{\rightmark}}
-% \fancyhead[R]{\nouppercase{\leftmark}}
-% \end{verbatim}
-%
-%
+%
% It should be noted that the \latex/ marking mechanism works fine with
% chapters (which always start on a new page) and sections (which are
% reasonably long). It does not work quite as well with short sections and
% subsections. This is a problem with \latex/, not with
% \Package{fancyhdr}.
-%
+%
% As an example let's take a page layout where the leftmarks are generated by
% the sections and the rightmarks by the subsections (as is default in the
-% \texttt{article} class). Take a page with some short sections, e.g.
-%
+% \texttt{article} class). Take a page with some short sections, e.g.
+%
% \begin{samepage}
% \noindent Section 1.\\
% subsection 1.1\\
% subsection 1.2\\
-% Section 2.
+% Section 2.
% \end{samepage}
-%
+%
% As the leftmark contains the \emph{last} mark of the page it will be
% ``Section 2.'', and the rightmark will be ``subsection 1.1'' as it will be
-% the \emph{first} mark of the page. So the page header info will combine
+% the \emph{first} mark of the page. So the page header info will combine
% section 2 with subsection 1.1 which isn't very nice.
-% The best you can do in these cases is use only the \cs{rightmark}s and
-% redefine \cs{sectionmark} accordingly. A \latex/ command
+% One thing you can do in these cases is use only the \cs{rightmark}s and
+% redefine \cs{sectionmark} accordingly.
+%
+% However, the \Package{extramarks} package described in section~\ref{sec:xmarks}
+% contains a command
% \CmdIndex{firstleftmark}
-% \cs{firstleftmark} would also be a nice addition (see the
-% \Package{extramarks} package in section~\ref{sec:xmarks}).
-%
+% \cs{firstleftmark} that can be used to get the first of the leftmarks
+% on the page in the header. This might be the best solution in this
+% situation. Now the header will contain ``Section 1.'' in the situation
+% described above.
+% ^^A \Example
+% \begin{verbatim}
+% \usepackage{extramarks}
+% . . .
+% \fancyhead[R]{\firstleftmark}
+% \end{verbatim}
+%
% Another problem with the marks in the standard \latex/ classes is that the
% higher level sectioning commands (e.g. \cs{chapter}) call
% \cs{markboth} with an empty right argument. This means that on the first
@@ -918,49 +1281,26 @@
% \cs{markright} commands or redefine the \cs{chaptermark}
% (\cs{sectionmark}) commands to issue a \cs{markboth} command with
% two decent parameters.
-%
+%
% As a final remark you should also note that the \verb|*| forms of the
% \cs{chapter} etc.\ commands do \emph{not} call the mark commands. So if
% you want your preface to set the header info but not be numbered nor be put in
% the table of contents, you must issue the \cs{markboth} command
% yourself, e.g.
-%
+%
% \begin{verbatim}
-% \chapter*{Preface\markboth{Preface}{}}
+% \chapter*{Preface}
+% \markboth{Preface}{}
% \end{verbatim}
-%
-% Entering the \cs{markboth} command inside the \cs{chapter*} insures
-% that the mark will not be separated from the title by a page break. Of
-% course with \cs{chapter*} this wouldn't be a problem if you put the mark
-% command after the chapter title, as the \cs{chapter*} command starts at a
-% new page. However with a \cs{section*} it could be dangerous to say:
-%
+%
+% Or in a documentclass without chapters:
% \begin{verbatim}
% \section*{Preface}
% \markboth{Preface}{}
% \end{verbatim}
-% as a page break may occur between the two commands. Therefore to be
-% safe, put the \cs{mark...} command inside the \cs{section} command.
-%
-% You have to be careful, however, if you do this with a non-starred
-% sectioning command. These will be put in the Table of Contents (if you
-% have one), and this means the entries are ``moving'' (they move to the
-% Table of Contents). The \cs{mark...} commands are ``fragile'',
-% which means they will break when moved. Therefore they must be
-% \DescribeMacro{\protect}
-% \CmdIndex{protect}
-% protected with the \cs{protect} command, for example
-%
-% \begin{verbatim}
-% \chapter{Preface\protect\markboth{Preface}{Preface}}
-% \end{verbatim}
-% In this example we give \cs{markboth} two non-empty arguments
-% otherwise it would make no sense to use the \cs{markboth} command
-% inside the \cs{chapter} command. It is harmless to use the
-% \cs{protect} command when it is not really necessary.
-%
+%
% \section{Dictionary style headers}
-%
+%
% \index{dictionary}
% \index{concordance}
% Dictionaries and concordances usually have a header containing the first
@@ -970,16 +1310,16 @@
% style headers, you cannot use them for chapter and section information, so
% if there are also chapters and sections present, you must redefine the
% \cs{chaptermark} and \cs{sectionmark} to make them harmless:
-%
+%
% \begin{verbatim}
% \renewcommand{\chaptermark}[1]{}
% \renewcommand{\sectionmark}[1]{}
% \end{verbatim}
-%
+%
% Now you do a \Cmd{markboth\{\#1\}\{\#1\}} for each dictionary or concordance
% entry \verb|#1| and use \cs{rightmark} for the first entry defined on
% the page and \cs{leftmark} for the last one.
-%
+%
% If you want to use a header entry of the form \textsf{firstword--lastword}
% it would be nice if this would be reduced to just the form
% \textsf{firstword} if both are the same. This could happen if there is just
@@ -988,7 +1328,7 @@
% cannot be compared out of the box with the plain \tex/ \cs{if} commands.
% \TTindex{ifthen}
% Fortunately the \Package{ifthen} package works well:
-%
+%
% \begin{verbatim}
% \newcommand{\mymarks}{
% \ifthenelse{\equal{\leftmark}{\rightmark}}
@@ -997,10 +1337,10 @@
% \fancyhead[LE,RO]{\mymarks}
% \fancyhead[LO,RE]{\thepage}
% \end{verbatim}
-%
+%
% \section{Fancy layouts}
-% \label{sec:fancy}
-%
+% \label{sec:fancy}\label{sec:warning}
+%
% \index{multi-line}
% You can make a multi-line field with the \bsbs{} command. It is also
% possible to put extra space in a field with the \cs{vspace} command.
@@ -1012,13 +1352,14 @@
% otherwise you may get error messages ``Overfull \cs{vbox} \ldots has
% occurred while \cs{output} is active''^^A
% \footnote{If you use \texttt{11pt} or \texttt{12pt} you will probably also
-% have to do this, because \LaTeX's defaults are quite small}.
-% See Section 4.1 of the \latex/ \emph{Companion} for detail.
-%
+% have to do this, because \LaTeX's defaults are quite small}. See the
+% warning below.
+% See also Section 4.1 of the \latex/ \emph{Companion} for detail.
+%
% For instance, the following code will place the section title and the
% subsection title of an article in two lines in the upper right hand
% corner:
-%
+%
% \begin{verbatim}
% \documentclass{article}
% \usepackage{fancyhdr}
@@ -1028,10 +1369,10 @@
% \renewcommand{\subsectionmark}[1]{\markright{#1}}
% \fancyhead[R]{\leftmark\\\rightmark}
% \end{verbatim}
-%
+%
% You can also customize the decorative lines. You can make the decorative
% line in the header quite thick with
-%
+%
% \CmdIndex{headrulewidth}
% \begin{verbatim}
% \renewcommand{\headrulewidth}{0.6pt}
@@ -1041,34 +1382,55 @@
% \begin{verbatim}
% \renewcommand{\footrulewidth}{0pt}
% \end{verbatim}
-%
+%
% The decorative lines, themselves, are defined in the two macros
% \cs{headrule} and \cs{footrule}. For instance,
% if you want a dotted line rather than a solid line in the header,
% redefine the command \cs{headrule}:
-%
+%
% \begin{verbatim}
-% \renewcommand{\headrule}{\vbox to 0pt{\hbox
-% to\headwidth{\dotfill}\vss}}
+% \renewcommand{\headrule}{\vbox to 0pt
+% {\makebox[\headwidth]{\dotfill}\vss}}
% \end{verbatim}
%
% The redefined \cs{headrule} should preferably take up no vertical space, as in the example above, and as in the standard definition. If it does take vertical space, the header may come too close to the text, or even intrude in the text. In that case \Package{fancyhdr} will give you a warning that \cs{headheight} is too small. Like
% \begin{verbatim}
-% Package Fancyhdr Warning: \headheight is too small (12.0pt):
-% Make it at least 14.0pt.
-% We now make it that large for the rest of the document.
-% This may cause the page layout to be inconsistent, however.
+% Package fancyhdr Warning: \headheight is too small (12.0pt):
+% (fancyhdr) Make it at least 14.0pt, for example:
+% (fancyhdr) \setlength{\headheight}{14.0pt}.
+% (fancyhdr) You might also make \topmargin smaller to compensate:
+% (fancyhdr) \addtolength{\topmargin}{-2.0pt}.
% \end{verbatim}
-% As the warning says, \Package{fancyhdr} will change the
-% \cs{headheight} itself, but this is too late for the current page. For
-% subsequent pages it will have effect, but now the text on these pages
-% will come out lower than on this page. So you are strongly advised to
+% \label{page:warning}\index{Warning}
+% You will probably get this warning on every page.
+% \textbf{Note:} Before version 4.0, \Package{fancyhdr} would change the
+% \cs{headheight} itself, causing the text on the following pages
+% to come out lower than on this page. This appeared to be confusing, so
+% since version~4.0 this is no longer done (except when you give the
+% \OPTindex{compatV3}%
+% \texttt{compatV3} package option. You should not give this as a
+% permanent solution, however, but solve the problem). Therefore you are strongly advised to
% redefine \cs{headheight} in the preamble, like this:
% \begin{verbatim}
-% \setlength\headheight{14pt}
+% \setlength{\headheight}{14pt}
+% \end{verbatim}
+% This would cause the main text to be put 2pt lower on the page, which
+% might be undesirable. You can compensate this by making \cs{topmargin}
+% correspondingly smaller, for example
+% \begin{verbatim}
+% \addtolength{\topmargin}{-2pt}
% \end{verbatim}
% A similar change would be necessary for \cs{footskip} if the footer comes out too tall.
%
+% You can also eliminate this check completely by using the
+% \OPTindex{nocheck}
+% \texttt{nocheck} option of the package. But this may risk unwanted
+% run-ins of the header or footer with other text. So this is generally
+% discouraged. It is better to change \cs{headheight}, \cs{footskip},
+% and/or \cs{topmargin}. But in cases where you generate the \latex/
+% code automatically, and the software does not know how tall the header
+% or footer will be, this may be handy.
+%
% As an alternative to changing \cs{headrulewidth} to 0 to have the rule
% disappear, you can also make it empty with
% \begin{verbatim}
@@ -1076,7 +1438,7 @@
% \end{verbatim}
% Visually this makes no difference, but it is more difficult to restore
% it later to its default value.
-%
+%
% Finally, let us make a real `decorative' line\footnote{Based upon an idea by Wayne Chan.}.
% \begin{verbatim}
% \usepackage{fourier-orns}
@@ -1088,7 +1450,7 @@
% \hrulefill}
% \end{verbatim}
% This gives us the following headrule:
-%
+%
% \noindent\makebox[\textwidth]{\hrulefill
% \raisebox{-2.1pt}[10pt][10pt]{\quad\decofourleft\decotwo\decofourright\quad}\hrulefill}
%
@@ -1117,15 +1479,41 @@
% of the footer text line. By default it is set to 30\% of the normal line
% distance. You may want to adjust it if you use unusally large or small
% fonts in the footer. Change it with \cs{renewcommand}.
-%
+%
+% You can also change the distance between the baseline of the header text and the
+% decorative line in the header. Normally this distance is determined by
+% the maximum depth of possible descenders in the text, which is 30\% of
+% the normal line distance. You can increase or decrease this distance
+% \CmdIndex{headruleskip}
+% \DescribeMacro{\headruleskip}
+% by defining the macro \cs{headruleskip}, similar to \cs{footruleskip}
+% \footnote{(But \cs{headruleskip} is only available since version~4.0.)}.
+% This defines the extra distance. The default value is 0pt, and
+% positive values make the distance larger, and negative values make the
+% distance shorter.
+% Please note that this does not change the position
+% of the decorative line with respect to the page, but it shifts the
+% header text. If you want to keep the header text fixed, but move the
+% decorative line, then you must also change the parameter \cs{headsep}
+% (see figure~\ref{fig:layout}). \strut
+%
+% \pagestyle{showstruts}
+% \noindent\begin{minipage}{\textwidth}
+% \phantomsection\label{showstruts}
+% \indent The header and footer in this page
+% show the \emph{strut} (the amount of space in the text area above and
+% below the baseline), and the \cs{headruleskip} and \cs{footruleskip}.
+% For this page \cs{headruleskip} is 4pt.
+% \end{minipage}
+%
% \section{Two book examples}
% \label{sec:book-examples}
-%
+%
% The following definitions give an approximation of the style
% used in L. Lamport's \latex/ book.
-%
+%
% Lamport's header overhangs the outside margin. This is done as follows.
-%
+%
% The width of headers and footers is \cs{headwidth}, which by default
% equals the width of the text: \cs{textwidth}. You can make the width
% \CmdIndex{headwidth}
@@ -1136,22 +1524,27 @@
% \CmdIndex{marginparwidth}
% printed, add both \cs{marginparsep} and \cs{marginparwidth} to
% \cs{headwidth} with the commands:
-%
+%
% \begin{verbatim}
% \addtolength{\headwidth}{\marginparsep}
% \addtolength{\headwidth}{\marginparwidth}
% \end{verbatim}
-%
+%
% \begin{flushleft}
-% You must issue these commands \emph{after} the first
-% \Cmd{pagestyle\{fancy\}} command as this
-% will establish the default for \cs{headwidth}\footnote{In version 2 or
-% later of \Package{fancyhdr} it is usually safe to do it before, but it is still
-% advised to do after.}.
+% It is safest to issue these commands \emph{after} the first
+% \Cmd{pagestyle\{fancy\}} command.
% \end{flushleft}
-%
-% And now a complete definition of Lamport's book style:
-%
+%
+% And now a complete definition of Lamport's book style. The header has
+% the width of the text plus the marginpar area. The header on even
+% pages has the page number on the left, and the chapter title on the
+% right. On odd pages it has the section title preceded by the section
+% number on the left and the page number on the right. All in boldface.
+% There is no footer. The \texttt{plain} style is redefined to have no
+% header and no footer. (In the \LaTeX{} book this makes sense because
+% each chapter begins with a page that contains only a drawing. In most
+% other cases you probably would want a page number on the page.)
+%
% \begin{verbatim}
% \documentclass{book}
% \usepackage{fancyhdr}
@@ -1170,15 +1563,15 @@
% }
% \end{verbatim}
% \PSindex{plain}
-%
+%
% Notice that the \cs{chaptermark} and \cs{sectionmark} commands have
% been redefined to eliminate the chapter numbers and the uppercaseness.
-%
+%
% For more control about the horizontal position of the headers and/or
% footers, \Package{fancyhdr} has additional commands to specify the
% offset of the header and/or footer elements. Use
-% \Cmd{fancyhfoffset[place]\{length\}}
-% \CmdIndex{fancyhfoffset}
+% \Cmd{fancyhfoffset[place]\{length\}}
+% \CmdIndex{fancyhfoffset}
% to offset one or more elements. The \texttt{place} parameter is like
% the optional parameter of \cs{fancyhf}, like \texttt{L R E O}, except
% that \texttt{C} cannot be used. It specifies for which elements the
@@ -1186,70 +1579,71 @@
% actual offset. Positive values move the element outward (into the
% margin), negative values inward. There are also specialised commands
% \cs{fancyheadoffset} and \cs{fancyfootoffset}, which have the
-% \texttt{H} and \texttt{F} parameter pre-applied, respectively.
-% \CmdIndex{fancyheadoffset}
-% \CmdIndex{fancyfootoffset}
-%
+% \texttt{H} and \texttt{F} parameter pre-applied, respectively.
+% \CmdIndex{fancyheadoffset}
+% \CmdIndex{fancyfootoffset}
+%
% When you use these commands, \latex/ will recalculate \cs{headwidth},
-% based on the given parameters.
-%
+% based on the given parameters.
+%
% So the above example could also have been done with (N.B. You can only
% use such an expression as a length parameter if the \Package{calc}
-% package is used):
-%
+% package is used):
+%
% \begin{verbatim}
% \fancyheadoffset[LE,RO]{\marginparsep+\marginparwidth}
% \end{verbatim}
-%
+%
% For the second example, we take the \amslatex/ book\footnote{George Gratzer,
% \textit{Math into LaTeX, An Introduction to \LaTeX{} and \amslatex/}, Birkhauser, Boston.}.
-%
+%
% Chapter pages have no headers or footers. So we declare
-%
+%
% \begin{verbatim}
% \thispagestyle{empty}
% \end{verbatim}
% for every chapter page, and we do not need to redefine plain.
-%
-% Chapter and section titles appear in the form: 2.\ DO IT NOW, so we have
+%
+% Chapter and section titles appear in the form: 2.\ IMPLEMENTATION, so we have
% to redefine \cs{chaptermark} and \cs{sectionmark} as follows (see
-% Section~\ref{sec:custom}):
-%
+% Section~\ref{sec:scoop}):
+%
% \begin{verbatim}
% \renewcommand{\chaptermark}[1]%
% {\markboth{\MakeUppercase{\thechapter.\ #1}}{}}
% \renewcommand{\sectionmark}[1]%
% {\markright{\MakeUppercase{\thesection.\ #1}}}
% \end{verbatim}
-%
-% In an even-header, the page number is printed as the LeftHeader and
-% the chapter info as the RightHeader; in an odd-header, the section info
-% is printed as the LeftHeader and the page number as the RightHeader. The
-% CenteredHeaders are empty. There are no footers.
-%
+%
+% On an even page, the page number is printed as the left header and
+% the chapter info as the right header; on an odd page, the section info
+% is printed as the left header and the page number as the right header. The
+% center headers are empty. There are no footers.
+%
% There is a decorative line in the header. It is 0.5pt wide, so we need
% the commands:
-%
+%
% \begin{verbatim}
% \renewcommand{\headrulewidth}{0.5pt}
% \renewcommand{\footrulewidth}{0pt}
% \end{verbatim}
-%
+%
% The font used in the headers is 9 pt bold Helvetica. The \PSNFSS\ system
% by Sebastian Rahtz uses the short (Karl Berry) name \verb|phv| for
% Helvetica, so this font is selected with the commands:
% \begin{verbatim}
% \fontfamily{phv}\fontseries{b}\fontsize{9}{11}\selectfont
% \end{verbatim}
-% (See Sections 7.6.1 and 11.9.1 of the \latex/ \emph{Companion}.)
+% (See Sections 7.6.1 and 11.9.1 of the \latex/ \emph{Companion} or
+% Sections 7.6 and 7.9.1 of \emph{The \latex/ Companion, Second Edition}.)
% Let us define a shorthand for this:
% \begin{verbatim}
% \newcommand{\helv}{%
% \fontfamily{phv}\fontseries{b}\fontsize{9}{11}\selectfont}
% \end{verbatim}
-%
+%
% Now we are ready for the page layout:
-%
+%
% \begin{verbatim}
% \documentclass{book}
% \usepackage{fancyhdr}
@@ -1267,11 +1661,11 @@
% \fancyhead[LO]{\helv \rightmark}
% \fancyhead[RE]{\helv \leftmark}
% \end{verbatim}
-%
-%
+%
+%
% \section{Special page layout for float pages}
% \label{sec:float}
-%
+%
% \index{float page}
% Some people want to have a special layout for float pages (pages only
% containing floats). As these pages
@@ -1280,44 +1674,50 @@
% of the page style will at least also affect the page before the float page.
% With \Package{fancyhdr}, however, you can specify in each of
% the header- or footer fields
-%
-% \Cmd{iffloatpage\{}value for float page\verb|}{|value for other pages\verb|}|
-%
+%
+% \medskip
+% \Cmd{iffloatpage\{}\meta{value for float page}\verb|}{|\meta{value for other pages}\verb|}|
+% \medskip
+%
% You can even use this to get rid of the decorative line on float pages only
% by defining:
-%
+%
% \begin{verbatim}
% \renewcommand{\headrulewidth}{\iffloatpage{0pt}{0.4pt}}
% \end{verbatim}
-%
+%
% Sometimes you may want to change the layout also for pages that contain a
% float on the top of the page, a float on the bottom of the page or a footnote on the bottom of the page.
-%
+%
% \Package{fancyhdr} gives you the commands \cs{iftopfloat}, \cs{ifbotfloat} and \cs{iffootnote}
-% similar to \cs{iffloatpage}.
-%
+% similar to \cs{iffloatpage}. For example:
+% \begin{verbatim}
+% \fancyhead[R]{\iftopfloat{This page has a topfloat}
+% {There is no topfloat here}}
+% \end{verbatim}
+%
% Note: Marks in floats will not be visible in \latex/'s output routine, so
% it is not useful to put marks in floats. So there is currently no way to
% let a float (e.g.\ a figure caption) influence the page header or footer.
-%
+%
% \section{Those blank pages}
% \label{sec:blank}
-%
+%
% In the \texttt{book} class when the \texttt{openany} option is not given or
% in the \texttt{report} class when the \texttt{openright} option is given,
% chapters start at odd-numbered pages, half of the time causing a blank page
-% to be inserted. Some people prefer this page to be completely empty, i.e.\
+% to be inserted. Some people prefer this page to be completely empty, i.e.\
% without headers and footers. This cannot be done with \cs{thispagestyle}
% as this command would have to be issued on the \emph{previous} page. There
% is, however, no magic necessary to get this done:
-%
+%
% \PSindex{empty}
% \CmdIndex{clearpage}
% \CmdIndex{cleardoublepage}
% \begin{verbatim}
-% \clearpage{\pagestyle{empty}\cleardoublepage}
+% \clearpage\begingroup\pagestyle{empty}\cleardoublepage\endgroup
% \end{verbatim}
-%
+%
% As the \Cmd{pagestyle\{empty\}} is enclosed in a group it only affects the
% page that may be generated by the \cs{cleardoublepage}. You can of
% course put the above in a private command. If you want to have this done
@@ -1327,7 +1727,8 @@
% \begin{verbatim}
% \makeatletter
% \def\cleardoublepage{\clearpage\if@twoside \ifodd\c@page\else
-% \hbox{}
+% \begingroup
+% \mbox{}
% \vspace*{\fill}
% \begin{center}
% This page intentionally contains only this sentence.
@@ -1335,18 +1736,19 @@
% \vspace{\fill}
% \thispagestyle{empty}
% \newpage
-% \if@twocolumn\hbox{}\newpage\fi\fi\fi}
+% \if@twocolumn\mbox{}\newpage\fi
+% \endgroup\fi\fi}
% \makeatother
% \end{verbatim}
-%
+%
% \section{\textsf{N} of \textsf{M} style page numbers}
% \label{sec:nofm}
-%
+%
% Some document writers prefer the pages to be numbered as \textsf{n} of
% \textsf{m} where \textsf{m} is the number of pages in the document.
% There is a package \Package{lastpage}
% available which you can use with \Package{fancyhdr} as follows:
-%
+%
% \begin{verbatim}
% \usepackage{lastpage}
% ...
@@ -1360,13 +1762,13 @@
% \end{verbatim}
% We clear all the headers including its rule. The footer will be
% ``inherited'' from the pagestyle \texttt{fancy}.
-%
+%
% The value of the \texttt{LastPage} label can be used to
% make different headers or footers on the last page of a document. E.g.\ if
% you want the footer of every odd page, except if it is the last one, to
% contain the text ``please turn over'', this can be done as
% follows:
-%
+%
% \begin{verbatim}
% \usepackage{lastpage}
% \usepackage{ifthen}
@@ -1374,33 +1776,37 @@
% \fancyfoot[R]{\ifthenelse{\isodd{\value{page}} \and \not
% \(\value{page}=\pageref{LastPage}\)}{please turn over}{}}
% \end{verbatim}
-%
+%
+% In order to get the number of pages correctly used, you usually have
+% to do one additional \LaTeX{} run.
+%
+%
% \section{Chapter or section related page numbers}
-%
+%
% In technical documentation very often page numbers are used of the form
% 2-10 where the first number is the chapter number and the second is the
% pagenumber relative to the chapter. Sometimes section is used rather than
-% chapter. The package \Package{chappg} can be used to get this format.
-%
-% Basically this package redefines \cs{thepage} as
+% chapter. The package \Package{chappg} can be used to get this format.
+%
+% Basically this package redefines \cs{thepage} as
% \cs{thechapter}\cs{chappgsep}\Cmd{arabic\{page\}}, where
% \cs{chappgsep} by default is `-'. If you want do use a different
% separator, you must redefine \cs{chappgsep}, for example to use an
% en-dash:
-%
+%
% \begin{verbatim}
% \renewcommand{\chappgsep}{--}
% \end{verbatim}
-%
+%
% To use a different prefix, for example the section number, use the
% \Cmd{pagenumbering\{bychapter\}} command with an optional argument
% specifying the prefix.
% \CmdIndex{pagenumbering}
-%
+%
% \begin{verbatim}
% \pagenumbering[\thesection]{bychapter}
% \end{verbatim}
-%
+%
% What the package also does is reset the page number to 1 at the beginning
% of each chapter.
%
@@ -1419,12 +1825,12 @@
% \pagenumbering{bychapter}
% \chapter{Introduction}
% \end{verbatim}
-%
+%
% There is a caveat when you have appendices in your document. Before the
% \cs{appendix} command you should give a \cs{clearpage} or
% \cs{cleardoublepage}. See the \Package{chappg} documentation for
% details.
-%
+%
% There is a fundamental difference between the page numbering of the style
% ``\emph{m} of \emph{n}'' as described in the previous section and the
% current one. The \emph{m} of \emph{n} style is only used in the page header
@@ -1432,37 +1838,83 @@
% ``\emph{See page \emph{xx}}''. Therefore it does not change the command
% \cs{thepage}. The page numbering style ``2-10'', however should be used
% in all references to the page number, therefore it must be done by redefining
-% \cs{thepage}.
-%
-%
+% \cs{thepage}.
+%
+% \section{Switching page styles}
+% \label{sec:switching}
+%
+% Page style \texttt{fancy}, if not redefined, does not have the definitions of the
+% headers and footers built-in, but they are defined in the document,
+% globally, or locally in a group. This also applies to the definitions of the
+% \cs{chaptermark} and/or \cs{[sub]sectionmark} commands. So if you want
+% to switch from another page style to the \texttt{fancy} page style
+% later in the document, and that other page style has changed for
+% example the \cs{chaptermark} and/or \cs{[sub]sectionmark} commands,
+% you will have to redefine these yourself and maybe also
+% the definitions of the headers and footers, at that point.
+% For example
+% \begin{verbatim}
+% \pagestyle{fancy}
+% \renewcommand{\chaptermark}[1]{\markboth{Chapter \thechapter. ##1}{}}
+% \renewcommand{\sectionmark}[1]{\markright{\thesection\ ##1}}
+% \end{verbatim}
+% Please note that you have to double the \verb|#| signs, because the
+% definitions are inside a macro.
+%
+% If the previous page style was one of the standard \LaTeX{} page
+% styles, or some page style that is not based on \Package{fancyhdr},
+% then the definitions of \cs{fancyhead} or \cs{fancyfoot} are not
+% affected. So strictly you don't have to include them. But if it was
+% based on \Package{fancyhdr} and had different definitions, you will
+% get the wrong headers and/or footers when you switch back to page
+% style \texttt{fancy}. So it is safer to include them anyway.
+%
+% A better possibility is to define your own page style, and include
+% these definitions in that page style:
+% \begin{verbatim}
+% \fancypagestyle{myfancy}{
+% \renewcommand{\chaptermark}[1]{\markboth{Chapter \thechapter. ##1}{}}
+% \renewcommand{\sectionmark}[1]{\markright{\thesection\ ##1}}
+% \fancyhead{...}
+% }
+% ...
+% \pagestyle{myfancy}
+% \end{verbatim}
+%
+% In general, when you use only one page style \texttt{fancy} in your
+% document, with the occasional \cs{thispagestyle} excursion to page
+% style \texttt{plain} or \texttt{empty}, you can just keep the
+% definitions globally in your document, but as soon as you use more
+% than one page style, and swicth between them, it is highly advisable
+% to define them (including page style \texttt{fancy}) with
+% \cs{fancypagestyle} and put all the relevant definitions inside them.
+%
+% There is another caveat, when switching page styles, if they have
+% different definitions of \cs{chaptermark} in the \texttt{book} or
+% \texttt{report} document class or similar ones. When you put the
+% \cs{pagestyle} command \emph{after} the \cs{chapter} command, then the
+% \cs{chapter} command calls the \cs{chaptermark} of the previous page
+% style, which is probably not what you intended. So you must issue the
+% \cs{pagestyle} command \emph{before} the \cs{chapter} command. But
+% this would probably change the page style of the previous page, which
+% is too early. Therefore you would have to give a \cs{newpage},
+% \cs{clearpage} or \cs{cleardoublepage} command
+% before the \cs{pagestyle} command, so that the last page will be
+% finished with the previous page style. I.e., the proper sequence is:
+% \begin{verbatim}
+% \newpage % (or \clearpage or \cleardoublepage)
+% \pagestyle{newstyle}
+% \chapter{My New Chapter}
+% \end{verbatim}
+%
% \section{When to change the headers and footers?}
% \label{sec:change}
-%
-% Sometimes you want to change the header or footer layout in the course of a
-% document. Some of these changes can be accomplished by using the mark
-% mechanism as may be seen in section~\ref{sec:custom} and \ref{sec:xmarks}.
-% However, sometimes we want a more drastic change, e.g.\ to change the page
-% numbering from roman to arabic (with \cs{pagenumbering}), to change one of
-% \index{page style>changes}
-% the \Package{fancyhdr} fields or to change to another page style.
-% Sometimes you may be surprised to find the change to occur too early. In
-% general the above mentioned changes take effect immediately, i.e.\ on the
-% page that is currently being built. If you want the change to take effect
-% at the next page you must make sure that the current page is finished. In
-% \CmdIndex{clearpage}
-% most cases this can be done by issuing a \cs{newpage} or \cs{clearpage} command before
-% any of the above mentioned changes. If this is not possible you can use the
-% \TTindex{afterpage.sty}
-% \Package{afterpage} package with:\\
-% \Cmd{afterpage\{}\Cmd{fancyhead[L]\{new value\}\}} or
-% \CmdIndex{pagenumbering}
-% \Cmd{afterpage\{}\Cmd{pagenumbering\{roman\}\}}. You cannot use \cs{afterpage}
-% to change the \cs{pagestyle} as the commands issued by \cs{afterpage}
-% are local in a group, and the \cs{pagestyle} command makes only local
-% changes. The \cs{pagenumbering} and the \Package{fancyhdr} commands
-% make global changes so they will work, as will the \cs{thispagestyle}
-% command.
-%
+%
+% In \smartref{sec:change}{sec:switching} we switched page styles at a
+% point that has a clear page break (the beginning of a chapter).
+% Sometimes you want to change only a header or footer without changing
+% the whole page style.
+%
% It should be noted that although the \Package{fancyhdr} commands like
% \cs{fancyhead} take effect immediately, this does not mean that any
% ``variables'' used in these commands get the value they have at the place
@@ -1470,37 +1922,285 @@
% the page number that will be inserted in the footer is not the page number
% of the page where this command is given, but rather the page number of
% the actual page where the footer is constructed. Of course for the page
-% number this is what you expect, but it is also true for other commands.
-%
-% So if you have a book where each chapter is written by a different author
-% and you want the name of the author in the lower left-hand corner you can
-% use the following commands:
-%
+% number this is what you expect, but it is also true for other
+% commands. There is a difference, however. The page number is
+% incremented \emph{after} the page has been constructed. When we have
+% our own ``variables'', however, these are usually changed in the
+% middle of our text.
+%
+% As an example we take a book where each chapter is written by a different author.
+% If we want the name of the author in the header opposite the chapter
+% title, we can use the following commands:
+%
% \begin{verbatim}
% \newcommand{\TheAuthor}{}
% \newcommand{\Author}[1]{\renewcommand{\TheAuthor}{#1}}
-% \fancyfoot[L]{\TheAuthor}
+% \fancyhead[LE,RO]{\TheAuthor}
% \end{verbatim}
-%
-% \noindent and start each chapter with the command
+%
+% \noindent and start each chapter with the command
% \Cmd{Author\{Real Name\}}.
-% If however, the author name would be changed before a page is
-% completed the wrong author could come in the footer. This would be the case
+% If, however, the author name would be changed before a page is
+% completed the wrong author could come in the header. This would be the case
% if you gave the above command \emph{before} the \cs{chapter} command
-% rather than after it.
+% rather than after it. So we give the \cs{Author} command after the
+% \cs{chapter} command:
+% \begin{verbatim}
+% \chapter{Chapter Title}
+% \Author{Author Name}
+% \end{verbatim}
+% As a chapter starts on a new page, we can be sure that the \cs{Author}
+% command comes at the same page as the chapter start.
+%
% Another source of problems is the fact that \tex/'s output routine processes
% commands ahead, so it may already have processed some commands that produce
-% text that will appear on the next page. See the next section for an example.
-%
+% text that will appear on the next page. So if our book was not divided
+% into chapters, but into sections, we cannot use the similar system:
+% \begin{verbatim}
+% %%% NOTE: This may not work %%%%
+% \section{Chapter Title}
+% \Author{Author Name}
+% \end{verbatim}
+% because in this case, when this command comes at the end of a page,
+% the ``variable'' \cs{TheAuthor} could be set at that page, but then
+% \TeX{} could decide to move the section title to the next page. And
+% then the author name would appear one page too early. This problem can
+% be solved using marks. In fact this is the whole reason the mark
+% mechanism was developed in \TeX. See section~\ref{sec:xmarks}.
+%
+% The same applies to other changes in the middle of a page, e.g.\ to change the page
+% numbering from roman to arabic (with \cs{pagenumbering}). For the same
+% reason \Cmd{thispagestyle\{mystyle\}} will not always work in the
+% middle of a page.
+%
+% Some of these changes can be accomplished by using the mark
+% mechanism as may be seen in \smartref{sec:change}{sec:scoop} and
+% \smartref{sec:change}{sec:xmarks}.
+%
+% In the remainder of this section we look at two different cases of
+% changing the page style in the middle of a page: changing the style of
+% the current page and changing the style of the next page.
+%
+% \subsection{Changing the page style of the current page}
+%
+% So now we are giving an example how to change the headers and footers,
+% only on the current page. In some cases this can be done by the
+% \CmdIndex{thispagestyle}%
+% \cs{thispagestyle} command. This changes the page style for the
+% ``current'' page only. But then we may be hit by the problem mentioned
+% above. \LaTeX{} may have a different idea about
+% the ``current'' page than you. The use of \cs{thispagestyle} is OK if
+% you can be sure that the text where the command \cs{thispagestyle} is
+% executed is the same page as where the surrounding text appears. So
+% for example directly after a \cs{chapter} command, or after a
+% \cs{newpage}. However, when the command is given near the end of a
+% page, \LaTeX{} may execute the command, and then decide that the page
+% is full and move the text that contains the command to the next page.
+% So now the page style is changed on one page earlier than was intended.
+%
+% A good solution to this problem is to put a label, like
+% \Cmd{label\{otherpagestyle\}} in the text where you want the different
+% page style, and then in the header and/or footer definitions compare
+% the page number with the label page number and choose the proper
+% value. For example, if we want to replace the section title on the
+% special page with ``MYFANCY SECTION'', like in
+% \begin{verbatim}
+% \fancypagestyle{myfancy}{
+% \fancyhead[LE,RO]{MYFANCY SECTION}
+% }
+% \end{verbatim}
+% ^^A\Example
+% we define a new pagestyle that makes the choice:
+% \begin{verbatim}
+% \usepackage{ifthen}
+% . . .
+% \fancypagestyle{switch}{
+% \fancyhead[LE,RO]{%
+% \ifthenelse{\value{page}=\pageref{otherpagestyle}}
+% {MYFANCY SECTION}
+% {\textsl{\rightmark}}}
+% }
+% \end{verbatim}
+% \CmdIndex{ifthenelse}
+% where \verb|\textsl{\rightmark}| is the normal value of the header
+% field from \Cmd{pagestyle\{fancy\}}.
+% Now we choose \Cmd{pagestyle\{switch\}} before our text, or even for
+% the whole document.
+%
+% There can still be some ambiguity on which page gets the different
+% header. For example, if the text says:
+% \begin{quote}
+% This page gets a different header than the surrounding pages.
+% \end{quote}
+% where do you put the \cs{label}? \LaTeX{} could break the page between
+% ``This'' and ``page'', and then would you want the special heading on
+% the page where ``This'' appears, or on the page where ``page''
+% appears. It depends on the positioning of the \cs{label} command.
+% Probably it is safer to make sure the sentence isn't broken. This can
+% be dome by putting the text in a \cs{parbox} or \texttt{minipage} environment.
+% \begin{verbatim}
+% \noindent
+% \begin{minipage}{\textwidth}
+% This page should have a different header than the surrounding pages.
+% \label{otherpagestyle}
+% It is done with the \verb|\pagestyle{switch}| command, that
+% has tests in the header field definitions. This chooses the actual
+% header depending on the page number.
+% \end{minipage}
+% \end{verbatim}
+% The \cs{noindent} is necessary, otherwise the whole \texttt{minipage}
+% will be shifted right by the paragraph indentation.
+%
+% Note that you cannot reset the page style immediately after this code,
+% as this may still influence the current page. If you want to reset it,
+% for example to \Cmd{pagestyle\{fancy\}}, you must be sure that it
+% happens on a following page. But in this case it isn't even necessary,
+% as the special page style acts as the default on all pages except the
+% special page.
+%
+% The special header and footer in page~\pageref{showstruts}, which
+% show the struts are done in a similar way, although the header and
+% footer are a bit more elaborated there.
+% Also there is another complication there, as we also want to make both
+% \cs{headruleskip} and \cs{footrulewidth} dependent on the page number.
+% Unfortunately, this cannot be done with a simple \cs{ifthenelse}
+% \CmdIndex{ifthenelse}
+% command.
+% Both \cs{headruleskip} and \cs{footrulewidth} are eventually
+% used as length parameters, and this requires that they are
+% \emph{expandable}. However, the \cs{ifthenelse} construct is not
+% expandable, so you will get strange error messages if you use
+% something like
+% \begin{verbatim}
+% %%% NOTE: This does not work %%%%
+% \renewcommand{\footrulewidth}{%
+% \ifthenelse{\value{page}=\pageref{otherpagestyle}}{0.4pt}{0pt}%
+% }
+% \end{verbatim}
+% For cases like this \Package{fancyhdr} version~4.0 and later has some
+% new commands \cs{fancyheadinit}, \cs{fancyfootinit} and \cs{fancyhfinit}.
+% \DescribeMacro{\fancyheadinit}
+% With \Cmd{fancyheadinit\{\meta{code}\}} you can define some code that will be executed
+% just before the construction of the header. As it is executed in the
+% header, it can test the correct page number, because the counter
+% \texttt{page} is guaranteed to have the correct value in the headers
+% and footers. Similarly, the code in \Cmd{fancyfootinit\{\meta{code}\}} is executed in
+% \DescribeMacro{\fancyfootinit}
+% the footer. And \Cmd{fancyhfinit\{\meta{code}\}} sets its code for both the header
+% \DescribeMacro{\fancyhfinit}
+% and the footer. Now we can set for example \cs{headruleskip} or
+% \cs{footrulewidth} depending on the page number. So instead of putting
+% the test inside the definition of \cs{headruleskip}, we can put it
+% outside, and then we can use the command \cs{ifthenelse}. So we put
+% the following in \Cmd{pagestyle\{switch\}}:
+% \begin{verbatim}
+% \fancyheadinit{%
+% \ifthenelse{\value{page}=\pageref{otherpagestyle}}
+% {\renewcommand{\headruleskip}{4pt}}
+% {\renewcommand{\headruleskip}{0pt}}
+% }
+% \fancyfootinit{%
+% \ifthenelse{\value{page}=\pageref{otherpagestyle}}
+% {\renewcommand{\footrulewidth}{0.4pt}}
+% {\renewcommand{\footrulewidth}{0pt}}
+% }
+% \end{verbatim}
+% Now here is the definition of the page style used for page~\pageref{showstruts}.
+% \begin{verbatim}
+% \fancypagestyle{showstruts}{%
+% \fancyhead[L]{%
+% \ifthenelse{\value{page}=\pageref{showstruts}}%
+% {\strutheader}%
+% {\rightmark}%
+% }
+% \fancyfoot[L]{%
+% \ifthenelse{\value{page}=\pageref{showstruts}}%
+% {\strutfooter}%
+% {}%
+% }
+% \fancyheadinit{%
+% \ifthenelse{\value{page}=\pageref{showstruts}}%
+% {\renewcommand{\headruleskip}{4pt}}%
+% {\renewcommand{\headruleskip}{0pt}}%
+% }
+% \fancyfootinit{%
+% \ifthenelse{\value{page}=\pageref{showstruts}}%
+% {\renewcommand{\footrulewidth}{0.4pt}}%
+% {\renewcommand{\footrulewidth}{0pt}}%
+% }
+% }
+% \end{verbatim}
+% The label used on that page is \texttt{showstruts}. \cs{strutheader}
+% and \cs{strutfooter} are macros that contain the code to draw these
+% pictures. In this example the values for \cs{headruleskip} and
+% \cs{footrulewidth} in the \emph{else} case are the same as the global
+% values. So we could have left these \emph{else} parts empty. Then they
+% would keep the global values.
+% However, often explicit is better than implicit.
+%
+% These initialisation commands cannot be used to make global changes to
+% the page, for example to \cs{headheight}. Neither can you use them to
+% change \cs{fancyhead} or \cs{fancyfoot}, because these have already
+% been set up. But you can use it to set the color and font of the
+% header and/or footer, for example to get large, red text in the
+% headers and footers on this specific page:
+% \begin{verbatim}
+% \fancyhfinit{%
+% \ifthenelse{\value{page}=\pageref{otherpagestyle}}
+% {\color{red}\Large}
+% {}
+% }
+% \end{verbatim}
+%
+% \subsection{Changing the page style of the next page}
+%
+% If you want the change of the page style to take effect
+% at the next page you must make sure that the current page is finished. In
+% most cases this can be done by issuing a
+% \CmdIndex{clearpage}\CmdIndex{newpage}%
+% \cs{newpage} or \cs{clearpage} command before % any changes. However,
+% this will immediately end the current page, possibly leaving you with a
+% half-empty page, which may be undesirable.
+%
+% If this is not what you want, you can use the
+% \TTindex{afterpage.sty}%
+% \Package{afterpage} package with:\\[1ex]
+% \CmdIndex{afterpage}\Cmd{afterpage\{}\Cmd{fancyhead[L]\{new value\}\}} or\\
+% \CmdIndex{pagenumbering}\Cmd{afterpage\{}\Cmd{pagenumbering\{roman\}\}}.
+% \\[1ex]
+% You cannot use \cs{afterpage}
+% to change the \cs{pagestyle} as the commands issued by \cs{afterpage}
+% are local in a group, and the \cs{pagestyle} command makes only local
+% changes. The \cs{pagenumbering} and the \cs{thispagestyle}
+% command make global changes, as well as changes to \LaTeX's counters,
+% such as \cs{setcounter} and \cs{addtocounter}.
+% So these can be used\footnote{In \Package{fancyhdr} version~3 and
+% earlier the commands like \cs{fancyhead} and \cs{fancyfoot} also made
+% global changes. This is no longer the case in version~4.0 and later.}.
+% Here is an example to change the page style of the next page with \cs{afterpage}:
+% ^^A \Example
+% \begin{verbatim}
+% \usepackage{afterpage}
+% \usepackage{fancyhdr}
+% \fancypagestyle{myfancy}{
+% \fancyhead[LE,RO]{\textbf{MYFANCY SECTION}}
+% \fancyhead[LO,RE]{\textbf{MYFANCY CHAPTER}}
+% \fancyfoot[C]{\textbf{--~\thepage~--}}
+% }
+% . . .
+% \afterpage{\thispagestyle{myfancy}}
+% \end{verbatim}
+% Then the page after this code will have the page style \texttt{myfancy}.
+%
% \section{Headers and footers induced by the text}
% \label{sec:xmarks}
-%
+%
% We have seen how we can use \LaTeX's marks to get information from the
% document contents to the headers and footers. The marks mechanism is the
% only reliable mechanism that you can use to get changing information to the
% headers or footers. This is because \latex/ may be processing your document
-% ahead before deciding to break the page.
-%
+% ahead before deciding to break the page.
+%
% Sometimes the two marks that \latex/ offers are not enough. An example is
% the following:
% \begin{quote}
@@ -1509,34 +2209,42 @@
% \index{Continued\ldots}
% first page and ``(Continued\ldots)'' at the top in the margin of the next page.
% \end{quote}
-%
+%
% You cannot use \latex/'s mark mechanisms for this if you also want to use
% chapter and section information.
-%
+%
% The \Package{extramarks} package gives you
% two extra marks that can be used in this situation.
% Here is a way to use this package:
-%
+%
% \begin{verbatim}
% \usepackage{extramarks}
% ...
% \pagestyle{fancy}
% \fancyhead[L]{\firstxmark}
% \fancyfoot[R]{\lastxmark}
+% \fancypagestyle{plain}{\fancyhead{}\renewcommand{\headrule}{}}
+% ...
+% \extramarks{}{}% 1
+% \extramarks{Continued\ldots}{Continued on next page\ldots}% 2
% ...
-% \extramarks{}{Continued on next page\ldots} %1
% Some text that may or may not cross a page boundary...
-% \extramarks{Continued\ldots}{} %2
-% \extramarks{}{} %3
+% ...
+% \extramarks{Continued\ldots}{}% 3
+% \extramarks{}{}% 4
% \end{verbatim}
-%
+%
% \CmdIndex{extramarks}
-% Note that the \cs{extramarks} command must be close to the text, i.e no
+% Note that we redefine the \texttt{plain} page style, so that on the
+% first page of a chapter also the footer will be given if necessary. We
+% assume that a `Continued' block will not cross chapter boundaries, so no
+% header will be necessary on these pages.
+% Also the \cs{extramarks} command must be close to the text, i.e no
% empty lines (paragraph boundaries) should intervene. Otherwise the page may
% be broken at that boundary and the extramarks would come on the wrong page.
% The final \verb+\extramarks{}{}+ is to prevent the `Continued\ldots'
% header to appear on the following pages.
-%
+%
% Explanation: There are two new marks that can be used in the page layout with this
% package: If commands of the form
% \verb|\extramarks{|$m_1$\verb|}{|$m_2$\verb|}| are given
@@ -1546,17 +2254,25 @@
% \cs{lastxmark} gives you the last $m_2$ value
% of the current page. In the above example, when the complete block
% falls on the same page, the \cs{firstxmark} will be the empty
-% parameter of the first \cs{extramarks} command (indicated by \texttt{\%1}), and
+% parameter of the first \cs{extramarks} command (indicated by \texttt{\%~1}), and
% the \cs{lastxmark} will be the empty parameter from the last
-% \cs{extramarks} command (indicated by \texttt{\%3}).
-%
-% However, when the page break falls in the block, the mark generated by
-% \%1 will be the last one on the first page. Therefore on that page
-% \cs{lastxmark} will be `Continued on next page\ldots'. On the second
-% page, the first mark will be \texttt{\%2}, therefore \cs{firstxmark} will be `Continued\ldots'.
-% On all the following pages the values of \texttt{\%3} will be used,
-% i.e. empty ones. Of course in real life you would leave out the \texttt{\%} indicators.
-%
+% \cs{extramarks} command (indicated by \texttt{\%~4}).
+%
+% However, when the page break falls inside the block, the mark generated by
+% \texttt{\%~2} will be the last one on the first page. Therefore on that page
+% \cs{lastxmark} will be `Continued on next page\ldots'. On the following
+% pages, there are two possibilities: (1) when the block ends
+% on that page the first mark will be \texttt{\%~3}, therefore
+% \cs{firstxmark} will be `Continued\ldots'; (2) the block ends at a
+% later page, therefore it does not contribute any marks to that page,
+% and the marks are `inherited' from the last values of the previous page,
+% i.e. those from \texttt{\%~2}.
+% On all of the pages after the block the values of \texttt{\%~4} will be used,
+% i.e. empty ones.
+% This final \verb+\extramarks{}{}+ is to prevent the `Continued\ldots'
+% header to spill over to the following pages.
+% Of course in real life you would leave out the numbers.
+%
% In case you want the last $m_1$ value or the first $m_2$ value, you
% can use the \cs{lastleftxmark} or \cs{firstrightxmark}, respectively.
% For symmetry reasons there are also commands \cs{firstleftxmark}
@@ -1569,17 +2285,17 @@
% \CmdIndex{lastrightxmark}
% \CmdIndex{topleftxmark}
% \CmdIndex{toprightxmark}
-%
+%
% The package also gives you the \cs{firstleftmark} and \cs{lastrightmark}
% commands that complement the standard \latex/ marks.
% \CmdIndex{firstleftmark}
% \CmdIndex{lastrightmark}
-%
+%
% To stress the point that marks are the correct way to do this, let me
% give you a ``solution'' that will not work\footnote{Actually there is
% another way but it requires two \latex/ passes: you can put \cs{label}
% commands before and after the text and compare the \cs{pageref}s.}:
-%
+%
% \begin{verbatim}
% \fancyhead[L]{Continued}
% \fancyfoot[R]{Continued on next page\ldots}
@@ -1587,7 +2303,7 @@
% \fancyhead[L]{}
% \fancyfoot[R]{}
% \end{verbatim}
-%
+%
% You may be tempted to think that the first \cs{fancyhead} and \cs{fancyfoot}
% will be in effect when \tex/ breaks the page in the middle of the text,
% and the last ones when the page breaks after the text. This is not true as
@@ -1600,101 +2316,112 @@
% the first definitions to be in effect when \tex/ decides to break the page
% exactly at this boundary. Actually the marks mechanism was invented to get
% rid of these kinds of problems.
-%
+%
% In the above example the text ``Continued'' appears in the page header. It
% \index{margin}
% may be nicer to put it in the margin. This can be easily
% accomplished by positioning it at a fixed place relative to the page header.
% In plain \tex/ you would use a concoction of \Cmd{hbox to 0pt},
% \Cmd{vbox to 0pt}, \cs{hskip},\cs{vskip}, \cs{hss} and
-% \cs{vss} but fortunately
+% \cs{vss} but fortunately
% \latex/'s \texttt{picture} environment gives a much cleaner way to do this.
% In order not to disturb the normal header layout we put the text in a zero-sized
% \texttt{picture}. Generally this is the best way to position things on fixed
% places on the page. You can then also use the normal headings. See also
-% section~\ref{sec:thumb} for another example of
+% section~\ref{sec:thumb} for another example of
% this technique.
-%
+%
% \TTindex{picture}
% \begin{verbatim}
% \fancyhead[L]{\setlength{\unitlength}{\baselineskip}%
% \begin{picture}(0,0)
% \put(-2,-3){\makebox(0,0)[r]{\firstxmark}}
-% \end{picture}\leftmark}
+% \end{picture}\rightmark} % \rightmark = section title
% \end{verbatim}
-%
+%
% This solution can of course also be used for the footer. Make sure you put the
% \texttt{picture} as the first thing in left-handside entries and last in right-handside
% ones.
-%
+%
% Finally you may want to put ``(Continued\ldots)'' in the \emph{text}
% rather than in the header or the margin. Then you have to use the
% \TTindex{afterpage.sty}
% \Package{afterpage} package. We also decide to make a separate
% environment for it.
-%
+%
% \begin{verbatim}
% \newenvironment{continued}{\par
-% \extramarks{}{Continued on next page\ldots}
-% \afterpage{\noindent\firstxmark\vspace{1ex}}
-% }{\extramarks{(Continued\ldots)}{}\par}
+% \extramarks{}{}%
+% \extramarks{(Continued\ldots)}{Continued on next page\ldots}%
+% \afterpage{\noindent\firstxmark\vspace{1ex}}%
+% }{\extramarks{(Continued\ldots)}{}%
+% \extramarks{}{}\par
+% }
% \end{verbatim}
-%
+%
% It is a bit dangerous to use \cs{firstxmark} outside the page layout
% routine, but apparently with \cs{afterpage} this works. If you would
% need the information further on in the page you must remember the state of
% the marks in your own variable. You can set this in one of the
% \Package{fancyhdr} fields. For example if you want to add something
% \emph{after} the broken piece of text you can use the following:
-%
+%
% \begin{verbatim}
% \newcommand{\mysaved}{}
-%
+%
% \newenvironment{continued}{\par
-% \extramarks{}{Continued on next page\ldots}
-% }{\extramarks{(Continued\ldots)}{}\par\vspace{1ex}\mysaved}
+% \extramarks{}{}%
+% \extramarks{(Continued\ldots)}{Continued on next page\ldots}%
+% }{\extramarks{(Continued\ldots)}{}%
+% \extramarks{}{}\par\vspace{1ex}\mysaved}%
+% }
% \fancyhead[L]{\leftmark}
% \fancyhead[C]{\ifthenelse{\equal{\lastxmark}{}}
% {\gdef\mysaved{}}
% {\gdef\mysaved{\noindent[Continued from previous page]}}}
% \end{verbatim}
-%
+%
% If you want to include one of the marks or other varying information in the
% saved text, you must use \cs{xdef} rather than \cs{gdef}.
-%
-%
+%
+%
% \section{A movie}
% \label{sec:movie}
-%
+%
% \index{movie}
% \TTindex{picture}
% If you put at each page on the same place a picture that slightly changes
% from page to page you can get a movie-like effect by flipping through the
% pages. You can create such a movie easily with fancyhdr. For
-% simplicity we assume that each picture is in a postscript (EPS) file called
-% \texttt{pic}$\langle n\rangle$.\texttt{ps} where $\langle n\rangle$ is the page number and that we use
-% the \Package{graphics} or \Package{graphicx} package\footnote{If you use an older version of
-% \LaTeX{} you could use the \Package{epsf} or \Package{epsfig} package.}.
+% simplicity we assume that we use a PDF-producing \LaTeX{} (such as
+% \texttt{pdflatex}) and each picture is in a PNG file called
+% \texttt{pic}$\langle n\rangle$.\texttt{png}%
+% \footnote{With \texttt{pdflatex} we could also use PDF or JPG
+% pictures. With a DVI based \texttt{latex} we could use PS or EPS
+% pictures. Or any other supported image format.}
+% where $\langle n\rangle$ is
+% the page number and that we use the \Package{graphics} or \Package{graphicx} package.
% \TTindex{graphics}
% \TTindex{graphicx}
-% \TTindex{epsf}
-% \TTindex{epsfig}
% To put the movie in the righthandside bottom corner the following will work:
-%
+%
% \begin{verbatim}
% \fancyfoot[R]{\setlength{\unitlength}{1mm}
% \begin{picture}(0,0)
-% \put(5,0){\includegraphics{pic\thepage.ps}}
+% \put(5,-20){\includegraphics[width=1cm]{pic\thepage}}
% \end{picture}}
% \end{verbatim}
-%
+%
+% If the document is two-sided, it would be better to put them only on
+% the odd pages, by specifying \verb|\fancyfoot[RO]|.
+%
% Notice that the \cs{unitlength} parameter should
% be set locally in the fancyhdr field in order to avoid unwanted
% interference with its value in the text.
-%
+%
% \section{Thumb-indexes}
% \label{sec:thumb}
-%
+%
% \index{bible}
% Some railroad guides and expensive bibles have so called
% \index{thumb-index}
@@ -1705,7 +2432,7 @@
% independent of the contents of the page, we print these blobs as part of
% the header in a zero-sized \texttt{picture} as described in the previous
% section.
-%
+%
% Of course we have to take care of two-sided printing, and we may want to
% have an index page with all the blobs in the correct position. The solution
% requires some hand-tuning to get the blobs nicely spaced out vertically.
@@ -1715,26 +2442,26 @@
% \cs{unitlength} set to 18~mm. Page numbers are set in the headers at the
% outer sides, and the blobs are attached to these. In this example the
% section numbers are used to position the blobs, but you can replace this
-% with any numeric value.
+% with any numeric value.
% See figure~\ref{fig:overview} for the resulting
% overview page and figure~\ref{fig:thumb} for the code.
-%
+%
% \begin{figure}[htbp]
% \setlength{\unitlength}{9mm}
% \newcommand{\blob}{\rule[-.2\unitlength]{1\unitlength}{.5\unitlength}}
% \newcounter{line}
-% \newcommand{\secname}[1]{\addtocounter{line}{1}^^A
+% \newcommand{\secname}[1]{\addtocounter{line}{1}%
% \put(1,-\value{line}){\blob}
% \put(-7.5,-\value{line}){\arabic{line}}
% \put(-7,-\value{line}){#1}}
-%
+%
% \newcommand{\overview}{1
% \begin{picture}(0,0)
% \secname{Introduction}
% \secname{The first year}
% \secname{Specialisation}
% \end{picture}}
-%
+%
% \begin{center}
% \leavevmode
% \begin{picture}(11.3,5)
@@ -1749,27 +2476,27 @@
% \begin{verbatim}
% \setlength{\unitlength}{18mm}
% \newcommand{\blob}{\rule[-.2\unitlength]{2\unitlength}{.5\unitlength}}
-%
+%
% \newcommand\rblob{\thepage
% \begin{picture}(0,0)
% \put(1,-\value{section}){\blob}
% \end{picture}}
-%
-% \newcommand\lblob{^^A
+%
+% \newcommand\lblob{%
% \begin{picture}(0,0)
% \put(-3,-\value{section}){\blob}
-% \end{picture}^^A
+% \end{picture}%
% \thepage}
-%
+%
% \pagestyle{fancy}
% \fancyfoot[C]{}
-%
+%
% \newcounter{line}
-% \newcommand{\secname}[1]{\addtocounter{line}{1}^^A
+% \newcommand{\secname}[1]{\addtocounter{line}{1}%
% \put(1,-\value{line}){\blob}
% \put(-7.5,-\value{line}){\Large \arabic{line}}
% \put(-7,-\value{line}){\Large #1}}
-%
+%
% \newcommand{\overview}{\thepage
% \begin{picture}(0,0)
% \secname{Introduction}
@@ -1777,7 +2504,7 @@
% \secname{Specialisation}
% ...etc...
% \end{picture}}
-%
+%
% \begin{document}
% \fancyhead[R]{\overview}\mbox{}\newpage % This produces the overview page
% \fancyhead[R]{} % Front matter may follow here
@@ -1791,9 +2518,9 @@
% \caption{Thumb-index code}
% \label{fig:thumb}
% \end{figure}
-%
+%
% \section{Float placement}
-%
+%
% Floats are page elements that float with respect to the rest of the
% document. Standard floats are tables and figures, but with the
% \Package{float} package you can easily make new ones, like algorithms. Most
@@ -1803,7 +2530,7 @@
% however be some pathological cases where it is impossible to convince
% \LaTeX{} to do things your way. In the following we will use figures as an
% example but everything applies to other floats as well.
-%
+%
% The most encountered problems with floats are:
% \begin{enumerate}
% \item You want a float at a certain position in the text, but \LaTeX{}
@@ -1812,7 +2539,7 @@
% the document or the end of a chapter.
% \item \LaTeX{} complains about ``Too many floats''.
% \end{enumerate}
-%
+%
% In the first two cases you must first check if you have given the correct
% ``placement'' parameter to you float, e.g. \Cmd{begin\{figure\}[htp]}
% specifies that your figure may be placed either: Here (i.e. in the text
@@ -1821,7 +2548,7 @@
% could also have specified ``b'' for Bottom of the page. The order of the
% letters is insignificant, you cannot force \LaTeX{} to try Bottom first
% and then Top by specifying \texttt{[bt]}.
-%
+%
% If \LaTeX{} doesn't put the float at the place where you expected it, it is
% usually caused by the following:
% \begin{enumerate}
@@ -1858,13 +2585,13 @@
% \bs bottomfraction & max fraction of page for floats at bottom & 0.3 \\
% \bs textfraction & min fraction of page for text & 0.2 \\
% \bs floatpagefraction & min fraction of floatpage that should have
-% floats & 0.5 \\
+% floats & 0.5 \\
% \bottomrule
% \end{tabular}
% \end{center}
-%
+%
% There are also some others for double column floats in two-column documents.
-%
+%
% The values in the righthand column are the defaults for the standard
% \latex/ classes. Other classes could use different defaults. As you see
% with the default values a float will not be put in the bottom of a page if
@@ -1883,18 +2610,18 @@
% \end{verbatim}
% You may want to be careful not to make \cs{floatpagefraction} too small,
% otherwise you may get too many small floatpages.
-%
+%
% You can force \latex/ to ignore most of the parameters for one specific float
% occurrence by
% including an exclamation mark (!) in the placement parameters, e.g.
% \begin{verbatim}
% \begin{figure}[!htb]
% \end{verbatim}
-%
+%
% Floats which contain a ``\texttt{t}'' in the position parameter could be
% placed before the place where they are referenced (but on the same page).
% This is normal behaviour for \latex/ but some people just don't like it.
-% There are a number of ways to prevent this:
+% There are a number of ways to prevent this:
% \begin{enumerate}
% \item Of course deleting the ``\texttt{t}'' will help, but in general this is
% undesirable, as you may want the float to be placed at the top of the
@@ -1906,20 +2633,20 @@
% moved to the next page. This can also be done with \texttt{[b]} or
% without parameter for all floats on this page.
% \end{enumerate}
-%
+%
% If in spite of all your attempts \latex/ still moves your floats to the end
% of the document or the end of a chapter, you can insert a \cs{clearpage}
% command. This will start a new page and insert all pending floats before
% continueing. If it is undesirable to have a pagebreak you can use the
% \Package{afterpage} package and the following command:
% \begin{verbatim}
-% \afterpage{clearpage}
+% \afterpage{\clearpage}
% \end{verbatim}
-%
+%
% This will wait until the current page is finished and then flush all
% outstanding floats. In some pathological circumstances \Package{afterpage}
% may give strange results, however.
-%
+%
% Finally, if you want a float only at the place where you define it, without
% \latex/ moving it whatsoever, you can use the \Package{float} package and
% give the command:
@@ -1935,7 +2662,7 @@
% \begin{verbatim}
% \afterpage{\clearpage \begin{figure}[H] ... \end{figure}}
% \end{verbatim}
-%
+%
% Complaints from \latex/ about ``Too many floats'' are usually caused by one
% of the above problems: floats not being able to be placed and \latex/
% collecting too many of them. The solutions given above, especially those
@@ -1945,9 +2672,9 @@
% this number. If you need still more then you must edit a private copy of
% this file, but even then there will be some limit that you cannot pass.
% Then your only resort will be to change your document.
-%
+%
% \section{Multipage Floats}
-%
+%
% \LaTeX's floats cannot be split across pages. Sometimes, however, you want
% to have a table or figure that doesn't fit on one page. The easiest way is
% to split these into multiple table or figure environments, but this has a
@@ -1958,12 +2685,12 @@
% \item How do you keep them together?
% \item You don't want more than one entry in the list of figures/tables.
% \end{itemize}
-%
+%
% Although these problems are not fully solvable in all cases, here are a
% couple of suggestions:
-%
+%
% \subsection{Tables}
-%
+%
% For tables longer than a page you can use the \Package{longtable} package.
% \TTindex{longtable}
% This package defines a \texttt{longtable} environment that is a kind of
@@ -1990,16 +2717,16 @@
% \end{verbatim}
% The last form has the additional advantage that most of the outstanding
% floats will be printed first.
-%
-%
+%
+%
% \subsection{Figures}
-%
+%
% There isn't an equivalent \texttt{longfigure} solution, so for figures you
% will usually have to split it yourself. In general this is less of a
% problem. However, the problem you get now is how to keep them together,
% i.e. how to get the parts on subsequent pages, and how to get a single
% entry in the list of figures.
-%
+%
% You will have to split the figure into pieces and put each part
% in a separate \texttt{figure} environment. To keep them together it is best
% to use only the \texttt{[p]} placement, so that they will be put on
@@ -2027,13 +2754,13 @@
% \end{center}
% \end{figure}
% \end{verbatim}
-%
+%
% You have to make sure that the last part is big enough, otherwise \LaTeX{}
% could decide to postpone it until it has collected some more floats. This
% can be done either by making the figure big enough (e.g. by adding some
-% \cs{vspace}), or by tweaking the \cs{floatpagefraction}
+% \cs{vspace}), or by tweaking the \cs{floatpagefraction}
% \CmdIndex{floatpagefraction} parameter.
-%
+%
% If you want your multipage figure to start at a lefthand-side
% (even-numbered) page you can use a test in the \cs{afterpage} command
% (using the \Package{ifthen} package):
@@ -2044,18 +2771,18 @@
% \end{verbatim}
% If there are too many floats on the skipped page, this may still fail to
% start your multipage figure on an even page, however.
-%
+%
% \section{Deprecated commands}
% \label{sec:depr}
-%
+%
% This section contains the description of deprecated commands. These
% were parts of the original implementation of \Package{fancyheadings}.
-% They continue to work for compatibility reasons,
+% They continue to work for compatibility reasons,
% but it is recommended not to use them anymore. This description is
% given so that you know what they mean and how to convert them to the
% standard commands. To be honest, I use these sometimes myself in quick
% examples, because \cs{lhead} is less typing than \Cmd{fancyhead[L]}.
-%
+%
% These commands for specifying the header or footer fields and their translation to
% the modern commands are given in table~\ref{tab:depr}.
%
@@ -2108,7 +2835,7 @@
% The \cs{fancyplain} command is only useful within the pagestyle \texttt{fancyplain}.
% Nowadays you would just redefine pagestyle \texttt{plain} with the
% \Cmd{fancypagestyle\{plain\}\{xxxx\}} command (see section~\ref{sec:pagestyle-plain}).
-%
+%
% \CmdIndex{plainheadrulewidth}
% \CmdIndex{plainfootrulewidth}
% There are also \cs{plainheadrulewidth} and \cs{plainfootrulewidth}
@@ -2118,15 +2845,22 @@
% redefine pagestyle \texttt{plain} with the \cs{fancypagestyle} command.
%
% \section{Contact information}
-%
-% Piet van Oostrum\\
-% E-mail: piet@vanoostrum.org \\
-% WWW: http://piet.vanoostrum.org
-%
+%
+% Pieter van Oostrum\\
+% E-mail: pieter@vanoostrum.org \\
+% WWW: http://pieter.vanoostrum.org
+% \\[1ex]
+% The source code can be found on Github:\\
+% \url{https://github.com/pietvo/fancyhdr}\\
+% Bugs and suggestions for improvements can be reported at\\
+% \url{https://github.com/pietvo/fancyhdr/issues}\\
+% Example files can be found at\\
+% \url{https://github.com/pietvo/fancyhdr/tree/Examples}
+%
% \section{Version information}
% \begin{itemize}
-% \item Version 1.0. March 11, 2003. This is the version that was distributed for a
-% long time on CTAN. Version history before this has been lost.
+% \item Version 1.0. March 11, 2003. This is the version that was distributed for a
+% long time on CTAN. Version history before this has been lost.
% \item Version 2.0. August 27, 2016:
% \begin{itemize}
% \item Removed references to fixmarks.sty as that is no longer used.
@@ -2171,6 +2905,49 @@
% vertical space outside of the definition of \cs{footrule}.
% \end{itemize}
% \end{itemize}
+% \subsection{Changes in version 4}
+% \label{sec:version-4}
+% Version 4 is a significant rewrite of the package. It also introduces
+% a number of new features.
+% \begin{itemize}
+% \item Version 4.0, March 15, 2019--Jan 04, 2021
+% \begin{itemize}
+% \item Options introduced on the \cs{usepackage} command.
+% \item The check whether the header or footer fits in
+% \cs{headheight} and \cs{footskip}, respectively, no longer
+% adjusts these values for the following pages. This appeared to be too
+% confusing. However, when the package option \texttt{compatV3} is given, the old
+% behaviour is kept. \\
+% The \texttt{nocheck} option now eliminates these checks completely, on
+% your own risk. (See section~\ref{sec:warning} on page~\pageref{page:warning}.)
+% \item Eliminated global definitions. All definitions are now local.
+% The \cs{global} case was originally so that you could do definitions in
+% a group and they would be applied globally. This was a mistake. If
+% you make them locally they should stay local. And it caused
+% problems with switching page styles, because then the global style
+% would be changed, which you generally don't want.\\
+% However, when the package option \texttt{compatV3} is given, the old
+% behaviour is kept. (See section~\ref{sec:options}.)
+% \item The page style \texttt{fancydefault}.
+% \item The \cs{headruleskip} parameter.
+% \item The \cs{fancyheadinit}, \cs{fancyfootinit}, and
+% \cs{fancyhfinit} commands.
+% \item[] \textbf{Note:} The following changes were mostly copied from the
+% \texttt{nccfancyhdr} package by Alexander I. Rozhenko.
+% \item The \cs{fancycenter} command (section~\ref{sec:fancycenter}).
+% \item The \texttt{headings} and \texttt{myheadings} package options
+% (see section~\ref{sec:options}).
+% \item The \cs{fancypagestyle} command has an optional parameter \oarg{base-style}.
+%
+% \end{itemize}
+%
+% \item Version 4.0.1, Jan 28, 2021
+% \begin{itemize}
+% \item Some documentation corrections, especially in sections
+% \ref{sec:xmarks} and \ref{sec:movie}.
+% \end{itemize}
+% \end{itemize}
+%
%
% \StopEventually{%
% \PrintChanges
@@ -2185,6 +2962,7 @@
%
%
% \section{Large chapter/section titles}
+% \label{sec:longtitles}
%
% \index{long titles}
% Sometimes a chapter or section title is too large to fit in the header
@@ -2379,69 +3157,69 @@
%
%<*fancyhdr>
% \changes{fancyhdr v1.4}{1994/09/16}{Correction for use with \cs{reversemarginpar}}
-%
+%
% \changes{fancyhdr v1.5}{1994/09/29}{Added the \cs{iftopfloat},
% \cs{ifbotfloat} and \cs{iffloatpage} commands}
-%
+%
% \changes{fancyhdr v1.6}{1994/10/04}{Reset single spacing in headers/footers for use with
% \Package{setspace.sty} or \Package{doublespace.sty}}
-%
+%
% \changes{fancyhdr v1.7}{1994/10/04}{Changed \cs{let}\cs{@mkboth}\cs{markboth} to
% \texttt{\cs{def}\cs{@mkboth}\{\cs{protect}\cs{markboth}\}} to make it more robust.}
-%
+%
% \changes{fancyhdr v1.8}{1994/12/05}{corrections for
% \Package{amsbook}/\Package{amsart}: define \cs{@chapapp} and (more
% importantly) use the \cs{chapter/sectionmark} definitions from \texttt{ps@headings} if
% they exist (which should be true for all standard classes).}
-%
-% \changes{fancyhdr v1.9}{1995/03/31}{The proposed
+%
+% \changes{fancyhdr v1.9}{1995/03/31}{The proposed
% \texttt{\cs{renewcommand}\{\cs{headrulewidth}\}} \texttt{\{\cs{iffloatpage}\ldots}
% construction in the doc did not work properly with the \texttt{fancyplain} style.}
-%
-% \changes{fancyhdr v1.91}{1995/06/01}{The definition of \cs{@mkboth} wasn't
+%
+% \changes{fancyhdr v1.91}{1995/06/01}{The definition of \cs{@mkboth} wasn't
% restored on subsequent \texttt{\cs{pagestyle}\{fancy\}}'s.}
-%
+%
% \changes{fancyhdr v1.92}{1995/06/01}{The sequence
% \texttt{\cs{pagestyle}\{fancyplain\} \cs{pagestyle}\{plain\}
% \cs{pagestyle}\{fancy\}} would erroneously select the plain version.}
-%
+%
% \changes{fancyhdr v1.93}{1995/06/01}{\cs{fancypagestyle} command added.}
-%
+%
% \changes{fancyhdr v1.94}{1995/12/11}{(suggested by Conrad Hughes
% \texttt{<chughes@maths.tcd.ie!>}): added \cs{footruleskip} to allow control over footrule
% position (old hardcoded value of .3\cs{normalbaselineskip} is far too high
% when used with very small footer fonts).}
-%
-% \changes{fancyhdr v1.95}{1996/01/31}{call \cs{@normalsize} in the reset code if that is defined,
+%
+% \changes{fancyhdr v1.95}{1996/01/31}{call \cs{@normalsize} in the reset code if that is defined,
% otherwise \cs{normalsize}. This is to solve a problem with
% \Package{ucthesis.cls}, as this doesn't define \cs{@currsize}.
% Unfortunately for latex209 calling \cs{normalsize} doesn't
% work as this is optimized to do very little, so there \cs{@normalsize} should
% be called. Hopefully this code works for all versions of LaTeX known to
% mankind.}
-%
-% \changes{fancyhdr v1.96}{1996/04/25}{Initialize \cs{headwidth} to a
+%
+% \changes{fancyhdr v1.96}{1996/04/25}{Initialise \cs{headwidth} to a
% magic (negative) value to catch most common cases that people change
-% it before calling \texttt{\cs{pagestyle}\{fancy\}}.
-% Note it can't be initialized when reading in this file, because
+% it before calling \texttt{\cs{pagestyle}\{fancy\}}.
+% Note it can't be initialised when reading in this file, because
% \cs{textwidth} could be changed afterwards. This is quite probable.
% We also switch to \cs{MakeUppercase} rather than \cs{uppercase} and introduce a
% \cs{nouppercase} command for use in headers. and footers.}
-%
+%
% \changes{fancyhdr v1.97}{1996/05/03}{Two changes: \\
% 1. Undo the change in version 1.8
-% (using the \texttt{\cs{pagestyle}\{headings\}} defaults
+% (using the \texttt{\cs{pagestyle}\{headings\}} defaults
% for the chapter and section marks). The current version of amsbook and
% amsart classes don't seem to need them anymore. Moreover the standard
% \LaTeX{} classes don't use \cs{markboth} if twoside isn't selected, and this is
% confusing as \cs{leftmark} doesn't work as expected.\\
% 2. Include a call to \cs{ps@empty}
-% in \cs{ps@@fancy}. This is to solve a problem
+% in \cs{ps@@fancy}. This is to solve a problem
% in the amsbook and amsart classes, that make global changes to \cs{topskip},
% which are reset in \cs{ps@empty}. Hopefully this doesn't break other things.}
-%
+%
% \changes{fancyhdr v1.98}{1996/05/07}{Added \% after the line \cs{def}\cs{nouppercase}}
-%
+%
% \changes{fancyhdr v1.99}{1996/05/07}{This is the alpha version of fancyhdr 2.0\\
% Introduced the new commands \cs{fancyhead}, \cs{fancyfoot}, and \cs{fancyhf}.
% Changed \cs{headrulewidth}, \cs{footrulewidth}, \cs{footruleskip} to
@@ -2450,31 +3228,31 @@
% to have them as length registers unless you want to do calculations with
% them, which is unlikely. Note that this may make some uses of them
% incompatible (i.e. if you have a file that uses \cs{setlength} or \cs{xxxx}!=)}
-%
+%
% \changes{fancyhdr v1.99a}{1996/05/10}{Added a few more \% signs.}
-%
+%
% \changes{fancyhdr v1.99b}{1996/05/10}{Changed the syntax of
% \cs{f@nch@for} to be resistent to catcode changes of \texttt{:!=}.\protect\\
% Removed the \texttt{[1]} from the defs of \cs{lhead} etc. because the parameter is
% consumed by the \cs{@[xy]lhead} etc. macros.}
-%
+%
% \changes{fancyhdr v1.99c}{1997/06/24}{Corrected \cs{nouppercase} to
-% also include the protected form of \cs{MakeUppercase}.\\
+% also include the protected form of \cs{MakeUppercase}.\\
% \cs{global} added to manipulation of \cs{headwidth}.\\
% \cs{iffootnote} command added.\\
% Some comments added about \cs{f@nch@head} and \cs{f@nch@foot}.}
-%
+%
% \changes{fancyhdr v1.99d}{1998/08/24}{Changed the default
% \cs{ps@empty} to \cs{ps@@empty} in order to allow
% \texttt{\cs{fancypagestyle}\{empty\}} redefinition.}
-%
+%
% \changes{fancyhdr v2.0}{2000/10/11}{Added LPPL license clause.\\
% A check for \cs{headheight} is added. An errormessage is given (once) if the
% header is too large. Empty headers don't generate the error even if
% \cs{headheight} is very small or even 0pt. \\
% Warning added for the use of '\texttt{E}' option when twoside option is not used.
% In this case the '\texttt{E}' fields will never be used.}
-%
+%
% \changes{fancyhdr v2.1beta}{2002/03/10}{New command:
% \texttt{\cs{fancyhfoffset}[place]\{length\}} defines offsets to be applied to
% the header/footer to let it stick into the margins (if length $!>$ 0).
@@ -2483,9 +3261,9 @@
% area.
% \cs{headwidth} will be dynamically calculated in the headers/footers when
% this is used.}
-%
+%
% \changes{fancyhdr v2.1beta2}{2002/03/26}{\cs{fancyhfoffset} now also
-% takes \texttt{H,F} as possible letters in the argument to
+% takes \texttt{H,F} as possible letters in the argument to
% allow the header and footer widths to be different.\\
% New commands \cs{fancyheadoffset} and \cs{fancyfootoffset} added comparable to
% \cs{fancyhead} and \cs{fancyfoot}.\\
@@ -2501,29 +3279,29 @@
%
% \changes{fancyhdr v3.1}{2004/10/07}{Added '\texttt{\cs{endlinechar}!=13}' to
% \cs{f@nch@reset} to prevent problems with \cs{includegraphics} in
-% header/footer when \environment{verbatiminput} is active.}
-%
+% header/footer when \env{verbatiminput} is active.}
+%
% \changes{fancyhdr v3.2}{2005/03/22}{Reset \cs{everypar} (the real one)
% in \cs{f@nch@reset} because spanish.ldf does strange things with
% \cs{everypar} between \guillemotleft\ and \guillemotright.}
-%
+%
% \changes{fancyhdr v3.3}{2016/08/20}{Replace
-% `\texttt{\cs{@ifundefined}\{chapter\}}' with `\cs{ifx}\cs{chapter}\cs{@undefined}'
+% `\texttt{\cs{@ifundefined}\{chapter\}}' with `\cs{ifx}\cs{chapter}\cs{@undefined}'
% because the former subtly makes \cs{chapter} equal to \cs{relax}, which may be
% undesirable in some cases.}
-%
+%
% \changes{fancyhdr v3.4}{2016/08/21}{Replace \cs{rm} by
% \cs{normalfont}\cs{rmfamily} and \cs{sl} by \cs{normalfont}\cs{slshape}.}
-%
+%
% \changes{fancyhdr v3.5}{2016/08/21}{Don't define \cs{footruleskip} if it is already defined.}
-%
+%
% \changes{fancyhdr v3.6}{2016/08/27}{Added a \cs{ProvidesPackage} line.\\
% Updated contact information.}
-%
+%
% \changes{fancyhdr v3.7}{2016/08/28}{Removed \cs{normalfont} from default values, as every field
% is already initialised with \cs{normalfont}.\\
% Set \cs{hsize} to \cs{headwidth} in header/footer.}
-%
+%
% \changes{fancyhdr v3.8}{2016/09/06}{Reset \bsbs, \cs{raggedleft},
% \cs{raggedright} and \cs{centering} to their default values to avoid a
% clash with the tabu package.\\
@@ -2538,25 +3316,57 @@
% \begin{macro}{\if@nch@mpty}
% This macro tests if its argument is empty.
% \begin{macrocode}
-\def\if@nch@mpty#1{\def\temp@a{#1}\ifx\temp@a\@empty}
+\newcommand\if@nch@mpty[1]{\def\temp@a{#1}\ifx\temp@a\@empty}
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\f@nch@def}
-% This macro defines another macro (usually a header or footer field).
-% Depending on the value of \cs{f@nch@gbl} the definition will be
-% global or local (the latter case is used in \cs{fancypagestyle}). If
-% the value (argument 2) is empty, a \cs{leavevmode} will be substituted.
-% If it is not empty, a \cs{strut} will be added.
+%
+% \begin{macro}{\iff@nch@check}
+% Boolean for the \texttt{nocheck} option.
+% \changes{fancyhdr v4.0}{2019/03/15}{Implement the \texttt{nocheck} option}
+% \OPTindex{nocheck}
% \begin{macrocode}
-\def\f@nch@def#1#2{\if@nch@mpty{#2}\f@nch@gbl\def#1{\leavevmode}\else
- \f@nch@gbl\def#1{#2\strut}\fi}
+\newif\iff@nch@check
+\f@nch@checktrue
+\DeclareOption{nocheck}{%
+ \f@nch@checkfalse
+}
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{\iff@nch@compatViii}
+% Define \cs{iff@nch@compatViii} to track the \texttt{compatV3} option.
+% \begin{macrocode}
+\newif\iff@nch@compatViii
+% \end{macrocode}
% \begin{macro}{\f@nch@gbl}
-% Initialize \cs{f@nch@gbl} to \cs{global}.
+% Initialise \cs{f@nch@gbl} to do nothing (except with the \texttt{compatV3}
+% option).
+% \changes{fancyhdr v4.0}{2019/03/19}{Remove the \cs{global} in definitions}
+% \changes{fancyhdr v4.0}{2019/03/16}{Implement the \texttt{compatV3} option}
+% \begin{macrocode}
+\let\f@nch@gbl\relax
+\DeclareOption{compatV3}{%
+ \let\f@nch@gbl\global
+ \f@nch@compatViiitrue
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\f@nch@def}
+% This macro defines another macro (usually a header or footer field).
+% Depending on the value of \cs{f@nch@gbl} the definition will be
+% global or local.
+% Default it is always local. But with the \texttt{compatV3} option it
+% is \cs{global} in the normal definitions, and local in \cs{fancypagestyle}.
+% The \cs{global} case is now considered a bug (or at least undesirable).
+%
+% If the value (argument 2) is empty, a \cs{leavevmode} will be substituted.
+% If it is not empty, a \cs{strut} will be added.
+%
% \begin{macrocode}
-\let\f@nch@gbl\global
+\newcommand\f@nch@def[2]{\if@nch@mpty{#2}\f@nch@gbl\def#1{\leavevmode}\else
+ \f@nch@gbl\def#1{#2\strut}\fi}
% \end{macrocode}
% \end{macro}
%
@@ -2584,22 +3394,148 @@
% \end{macrocode}
% \end{macro}
%
+% \changes{fancyhdr v4.0}{2019/03/17}{Added \texttt{headings} and
+% \texttt{myheadings} options.}
+% Standard styles are redefined optionally. These definitions are
+% borrowed from the \Package{nccfancyhdr} package by by Alexander I. Rozhenko.
+%
+% \begin{macro}{\ps@myheadings}
+% The redefinition of the \texttt{myheadings} style is conditional.
+% We test the existence of the \cs{chapter} command and redefine the
+% style accordingly.
+%
+% \OPTindex{myheadings}\PSindex{myheadings}
+% \begin{macrocode}
+\DeclareOption{myheadings}{%
+ \f@nch@ifundefined{chapter}{%
+% \end{macrocode}
+% An article-like class without chapters:
+% \begin{macrocode}
+ \def\ps@myheadings{\ps@f@nch@fancyproto \let\@mkboth\@gobbletwo
+ \fancyhf{}
+ \fancyhead[LE,RO]{\thepage}%
+ \fancyhead[RE]{\slshape\leftmark}%
+ \fancyhead[LO]{\slshape\rightmark}%
+ \let\sectionmark\@gobble
+ \let\subsectionmark\@gobble
+ }%
+ }%
+% \end{macrocode}
+% A book/report-like class with chapters:
+% \begin{macrocode}
+ {\def\ps@myheadings{\ps@f@nch@fancyproto \let\@mkboth\@gobbletwo
+ \fancyhf{}
+ \fancyhead[LE,RO]{\thepage}%
+ \fancyhead[RE]{\slshape\leftmark}%
+ \fancyhead[LO]{\slshape\rightmark}%
+ \let\chaptermark\@gobble
+ \let\sectionmark\@gobble
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ps@headings}
+% The redefinition of the \texttt{headings} style also differs for
+% book-like and article-like classes. It also differs for
+% one-side and two-side modes.
+% \begin{macrocode}
+\DeclareOption{headings}{%
+ \f@nch@ifundefined{chapter}{%
+ \if@twoside
+% \end{macrocode}
+% An article in two-side mode:
+% \begin{macrocode}
+ \def\ps@headings{\ps@f@nch@fancyproto \let\@mkboth\markboth
+ \fancyhf{}
+ \fancyhead[LE,RO]{\thepage}%
+ \fancyhead[RE]{\slshape\leftmark}%
+ \fancyhead[LO]{\slshape\rightmark}%
+ \def\sectionmark##1{%
+ \markboth{\MakeUppercase{%
+ \ifnum \c@secnumdepth >\z@ \thesection\quad \fi##1}}{}}%
+ \def\subsectionmark##1{%
+ \markright{%
+ \ifnum \c@secnumdepth >\@ne \thesubsection\quad \fi##1}}%
+ }%
+ \else
+% \end{macrocode}
+% An article in one-side mode:
+% \begin{macrocode}
+ \def\ps@headings{\ps@f@nch@fancyproto \let\@mkboth\markboth
+ \fancyhf{}
+ \fancyhead[LE,RO]{\thepage}%
+ \fancyhead[RE]{\slshape\leftmark}%
+ \fancyhead[LO]{\slshape\rightmark}%
+ \def\sectionmark##1{%
+ \markright {\MakeUppercase{%
+ \ifnum \c@secnumdepth >\z@ \thesection\quad \fi##1}}}%
+ \let\subsectionmark\@gobble % Not needed but inserted for safety
+ }%
+ \fi
+ }{\if@twoside
+% \end{macrocode}
+% A book in two-side mode:
+% \begin{macrocode}
+ \def\ps@headings{\ps@f@nch@fancyproto \let\@mkboth\markboth
+ \fancyhf{}
+ \fancyhead[LE,RO]{\thepage}%
+ \fancyhead[RE]{\slshape\leftmark}%
+ \fancyhead[LO]{\slshape\rightmark}%
+ \def\chaptermark##1{%
+ \markboth{\MakeUppercase{%
+ \ifnum \c@secnumdepth >\m@ne \if@mainmatter
+ \@chapapp\ \thechapter. \ \fi\fi##1}}{}}%
+ \def\sectionmark##1{%
+ \markright {\MakeUppercase{%
+ \ifnum \c@secnumdepth >\z@ \thesection. \ \fi##1}}}%
+ }%
+ \else
+% \end{macrocode}
+% A book in one-side mode:
+% \begin{macrocode}
+ \def\ps@headings{\ps@f@nch@fancyproto \let\@mkboth\markboth
+ \fancyhf{}
+ \fancyhead[LE,RO]{\thepage}%
+ \fancyhead[RE]{\slshape\leftmark}%
+ \fancyhead[LO]{\slshape\rightmark}%
+ \def\chaptermark##1{%
+ \markright{\MakeUppercase{%
+ \ifnum \c@secnumdepth >\m@ne \if@mainmatter
+ \@chapapp\ \thechapter. \ \fi\fi##1}}}%
+ \let\sectionmark\@gobble % Not needed but inserted for safety
+ }%
+ \fi
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Process the options.
+% \changes{fancyhdr v4.0}{2019/03/15}{Process package options.}
+% \SpecialUsageIndex{\ProcessOptions}
+% \begin{macrocode}
+\ProcessOptions*
+% \end{macrocode}
+%
% \begin{macro}{\f@nch@errmsg}
% This macro generates an error message.
-% \changes{fancyhdr v3.10}{2019/01/25}{Use \cs{\f@nch@ifundefined} instead of \cs{ifx}.}
+% \changes{fancyhdr v3.10}{2019/01/25}{Use \cs{f@nch@ifundefined} instead of \cs{ifx}.}
% \changes{fancyhdr v3.10}{2019/01/25}{Use \cs{newcommand} instead of \cs{def}.}
% \begin{macrocode}
\newcommand\f@nch@errmsg[1]{%
- \f@nch@ifundefined{PackageError}{\errmessage{#1}}{\PackageError{Fancyhdr}{#1}{}}}
+ \f@nch@ifundefined{PackageError}{\errmessage{#1}}{\PackageError{fancyhdr}{#1}{}}}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}{\f@nch@warning}
% This macro generates a warning.
% \changes{fancyhdr v3.10}{2019/01/25}{Use \cs{f@nch@ifundefined} instead of \cs{ifx}.}
% \changes{fancyhdr v3.10}{2019/01/25}{Use \cs{newcommand} instead of \cs{def}.}
% \begin{macrocode}
\newcommand\f@nch@warning[1]{%
- \f@nch@ifundefined{PackageWarning}{\errmessage{#1}}{\PackageWarning{Fancyhdr}{#1}{}}}
+ \f@nch@ifundefined{PackageWarning}{\errmessage{#1}}{\PackageWarning{fancyhdr}{#1}{}}}
% \end{macrocode}
% \end{macro}
%
@@ -2610,10 +3546,10 @@
% This is similar to \LaTeX's \cs{@tfor}, but it expands the \texttt{charstring}.
% \begin{macrocode}
% \changes{fancyhdr v3.10}{2019/01/25}{Use \cs{newcommand} instead of \cs{def}.}
-\newcommand{\f@nch@forc}[3]{\expandafter\f@rc\expandafter#1\expandafter{#2}{#3}}
-\newcommand{\f@rc}[3]{\def\temp@ty{#2}\ifx\@empty\temp@ty\else
+\newcommand{\f@nch@forc}[3]{\expandafter\f@nchf@rc\expandafter#1\expandafter{#2}{#3}}
+\newcommand{\f@nchf@rc}[3]{\def\temp@ty{#2}\ifx\@empty\temp@ty\else
\f@nch@rc#1#2\f@nch@rc{#3}\fi}
-\def\f@nch@rc#1#2#3\f@nch@rc#4{\def#1{#2}#4\f@rc#1{#3}{#4}}
+\def\f@nch@rc#1#2#3\f@nch@rc#4{\def#1{#2}#4\f@nchf@rc#1{#3}{#4}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\f@nch@for}
@@ -2641,7 +3577,7 @@
\ifx\@empty#1\def#1{#2}\fi}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\f@nch@ifin}
% Usage: \cs{f@nch@ifin} \meta{char} \meta{set} \meta{truecase} \meta{falsecase} \\
% If \meta{char} is in \meta{set}, then \meta{truecase} else \meta{falsecase}.
@@ -2718,14 +3654,14 @@
e\f@nch@warning {\string#1's `E' option without twoside option is
useless}\fi\fi \f@nch@default\f@nch@@lcr{lcr}\temp@c
\f@nch@default\f@nch@@hf{hf}{#2\temp@c}%
- \f@nch@forc\f@nch@eo\f@nch@@eo
- {\f@nch@forc\f@nch@lcr\f@nch@@lcr
+ \f@nch@forc\f@nch@eo\f@nch@@eo
+ {\f@nch@forc\f@nch@lcr\f@nch@@lcr
{\f@nch@forc\f@nch@hf\f@nch@@hf
{\expandafter\f@nch@def\csname
f@nch@\f@nch@eo\f@nch@lcr\f@nch@hf\endcsname {#4}}}}}}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\f@nch@fancyhfoffs}
% This macro interprets the parameters for the header and footer
% offsets.\\
@@ -2739,7 +3675,7 @@
% The header and footer offsets are stored in command sequences with
% names of the form: \cs{f@nch@O@}\meta{x}\meta{y}\meta{z} with \meta{x} from
% \texttt{[eo]}, \meta{y} from \texttt{[lr]} and \meta{z} from \texttt{[hf]}.
-%
+%
% \begin{macrocode}
\def\f@nch@fancyhfoffs#1#2[#3]#4{%
\def\temp@c{}%
@@ -2753,7 +3689,7 @@
e\f@nch@warning {\string#1's `E' option without twoside option is
useless}\fi\fi \f@nch@default\f@nch@@lcr{lr}\temp@c
\f@nch@default\f@nch@@hf{hf}{#2\temp@c}%
- \f@nch@forc\f@nch@eo\f@nch@@eo
+ \f@nch@forc\f@nch@eo\f@nch@@eo
{\f@nch@forc\f@nch@lcr\f@nch@@lcr
{\f@nch@forc\f@nch@hf\f@nch@@hf
{\expandafter\setlength\csname
@@ -2821,28 +3757,28 @@
% \begin{macro}{\f@nch@headwidth}
% Length parameter to be used for \cs{headwidth}. We use this rather
% than defining \cs{headwidth} as a length paramater directly to protect
-% ourself to someone saying: \verb+\let\headwidth\textwidth+.
+% ourself to someone saying: \verb+\let\headwidth\textwidth+.
% \begin{macrocode}
\newlength{\f@nch@headwidth} \let\headwidth\f@nch@headwidth
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\f@nch@O@elh}
-% \begin{macro}{\f@nch@O@erh}
+% \begin{macro}{\f@nch@O@elh}
+% \begin{macro}{\f@nch@O@erh}
% \begin{macro}{\f@nch@O@olh}
-% \begin{macro}{\f@nch@O@orh}
-% \begin{macro}{\f@nch@O@elf}
+% \begin{macro}{\f@nch@O@orh}
+% \begin{macro}{\f@nch@O@elf}
% \begin{macro}{\f@nch@O@erf}
-% \begin{macro}{\f@nch@O@olf}
+% \begin{macro}{\f@nch@O@olf}
% \begin{macro}{\f@nch@O@orf}
% Length parameters for the offsets.
% \begin{macrocode}
-\newlength{\f@nch@O@elh}
-\newlength{\f@nch@O@erh}
+\newlength{\f@nch@O@elh}
+\newlength{\f@nch@O@erh}
\newlength{\f@nch@O@olh}
-\newlength{\f@nch@O@orh}
-\newlength{\f@nch@O@elf}
+\newlength{\f@nch@O@orh}
+\newlength{\f@nch@O@elf}
\newlength{\f@nch@O@erf}
-\newlength{\f@nch@O@olf}
+\newlength{\f@nch@O@olf}
\newlength{\f@nch@O@orf}
% \end{macrocode}
% \end{macro}
@@ -2853,16 +3789,25 @@
% \end{macro}
% \end{macro}
% \end{macro}
-%
+%
% \begin{macro}{\headrulewidth}
% \begin{macro}{\footrulewidth}
% \begin{macrocode}
-\newcommand{\headrulewidth}{0.4pt}
+\newcommand{\headrulewidth}{0.4pt}
\newcommand{\footrulewidth}{0pt}
% \end{macrocode}
% \end{macro}
% \end{macro}
-%
+%
+% \begin{macro}{\headruleskip}
+% Don't define \cs{headruleskip} if it is already defined.
+% \changes{fancyhdr v4.0}{2019/03/22}{Parameter \cs{headruleskip}.}
+% \begin{macrocode}
+\f@nch@ifundefined{headruleskip}%
+ {\newcommand{\headruleskip}{0pt}}{}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\footruleskip}
% Memoir also defines \cs{footruleskip}.
% Don't define \cs{footruleskip} if it is already defined.
@@ -2871,7 +3816,7 @@
{\newcommand{\footruleskip}{.3\normalbaselineskip}}{}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\plainheadrulewidth}
% \begin{macro}{\plainfootrulewidth}
% Fancyplain stuff shouldn't be used anymore (rather
@@ -2884,14 +3829,14 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
-%
+%
% \begin{macro}{\if@fancyplain}
% Boolean for the implementation of \cs{fancyplain}
% \begin{macrocode}
\newif\if@fancyplain \@fancyplainfalse
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\fancyplain}
% Deprecated macro
% \begin{macrocode}
@@ -2900,7 +3845,7 @@
% \end{macro}
%
% \begin{macro}{\headwidth}
-% Initialize \cs{headwidth} with a magic constant.
+% Initialise \cs{headwidth} with a magic constant.
% \begin{macrocode}
\headwidth=-123456789sp
% \end{macrocode}
@@ -2915,7 +3860,7 @@
% typesetting the headers and footers. Some packages change these to
% incompatible values.
% \begin{macrocode}
-\let\f@nch@raggedleft\raggedleft
+\let\f@nch@raggedleft\raggedleft
\let\f@nch@raggedright\raggedright
\let\f@nch@centering\centering
\let\f@nch@everypar\everypar
@@ -2952,22 +3897,122 @@
% \end{macrocode}
% \end{macro}
%
-% Initialization of the head and foot text.
+% \begin{macro}{\fancycenter}
+% \changes{fancyhdr v4.0}{2019/03/15}{Macro \cs{fancycenter} added}
+% \cs{fancycenter}\oarg{dist}\oarg{stretch}\marg{left-mark}\marg{center-mark}\marg{right-mark}
+% \begin{macrocode}
+\newcommand*{\fancycenter}[1][1em]{%
+ \@ifnextchar[{\f@nch@center{#1}}{\f@nch@center{#1}[3]}%
+}
+\def\f@nch@center#1[#2]#3#4#5{%
+% \end{macrocode}
+% At first, we execute the case when the \meta{center-mark} is empty:
+% \begin{macrocode}
+ \def\@tempa{#4}\ifx\@tempa\@empty
+ \hbox to\linewidth{\color@begingroup{#3}\hfil {#5}\color@endgroup}%
+ \else
+% \end{macrocode}
+% All we need to do is to calculate skips inserted before and after
+% \meta{center-mark}. We will calculate them in the |\@tempskipa|
+% and |\@tempskipb|. At first:
+% \begin{quote}
+% \verb|\@tempdima:=|\meta{dist};\\
+% \verb|\@tempdimb:=|\meta{dist}\verb|*|\meta{stretch};\\
+% \verb|\@tempdimc:=|\meta{dist}\verb|*|\meta{stretch}\verb|-|\meta{dist};\\
+% \verb|\@tempskipa:=\@tempskipb:=\@tempdimb + 1fil - \@tempdimc|;
+% \end{quote}
+% \begin{macrocode}
+ \setlength\@tempdima{#1}%
+ \setlength{\@tempdimb}{#2\@tempdima}%
+ \@tempdimc \@tempdimb \advance\@tempdimc -\@tempdima
+ \setlength\@tempskipa{\@tempdimb \@plus 1fil \@minus \@tempdimc}%
+ \@tempskipb\@tempskipa
+% \end{macrocode}
+% At this point, the \cs{@tempskipa} and \cs{@tempskipb} registers
+% have the natural size \meta{dist}\verb|*|\meta{stretch},
+% unlimited stretchability, and the minimum size \meta{dist}.
+% Now we decrease the minimum size of \cs{@tempskipa} to zero if
+% the \meta{left-mark} is empty:
+% \begin{macrocode}
+ \def\@tempa{#3}\ifx\@tempa\@empty
+ \addtolength\@tempskipa{\z@ \@minus \@tempdima}%
+ \fi
+% \end{macrocode}
+% Do the same things with the \cs{@tempskipb} register if the
+% \meta{right-mark} is empty:
+% \begin{macrocode}
+ \def\@tempa{#5}\ifx\@tempa\@empty % empty right
+ \addtolength\@tempskipb{\z@ \@minus \@tempdima}%
+ \fi
+% \end{macrocode}
+% Finally, we correct the left and right glues taking into
+% account the difference between lengths of \meta{left-mark}
+% and \meta{right-mark}. We calculate which mark is shorter
+% and increase the natural size of the corresponding register
+% by the difference between their lengths.
+% \begin{macrocode}
+ \settowidth{\@tempdimb}{#3}%
+ \settowidth{\@tempdimc}{#5}%
+ \ifdim\@tempdimb>\@tempdimc
+ \advance\@tempdimb -\@tempdimc
+ \addtolength\@tempskipb{\@tempdimb \@minus \@tempdimb}%
+ \else
+ \advance\@tempdimc -\@tempdimb
+ \addtolength\@tempskipa{\@tempdimc \@minus \@tempdimc}%
+ \fi
+% \end{macrocode}
+% The \cs{@tempskipa} and \cs{@tempskipb} have been calculated.
+% Put everything in the box.
+% \begin{macrocode}
+ \hbox to\linewidth{\color@begingroup{#3}\hskip \@tempskipa
+ {#4}\hskip \@tempskipb {#5}\color@endgroup}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
%
-% The default values still contain \cs{fancyplain} for compatibility:
-% lefthead empty on ``plain'' pages, \cs{rightmark} on even, \cs{leftmark} on odd pages;
-% evenhead empty on ``plain'' pages, \cs{leftmark} on even, \cs{rightmark} on odd pages.
+% \begin{macro}{\fancyheadinit}
+% This macro can be used to define initialisation code that will be run
+% before the construction of the header. It can for example set the
+% color or the font, or change \cs{headrulewidth} or \cs{headruleskip}.
+% It cannot make global changes, just changes for the header.
+% \begin{macro}{\f@nch@headinit}
+% Storage for the header initialisation code.
% \begin{macrocode}
-\fancyhf{}
-\if@twoside
- \fancyhead[el,or]{\fancyplain{}{\slshape\rightmark}}
- \fancyhead[er,ol]{\fancyplain{}{\slshape\leftmark}}
-\else
- \fancyhead[l]{\fancyplain{}{\slshape\rightmark}}
- \fancyhead[r]{\fancyplain{}{\slshape\leftmark}}
-\fi
-\fancyfoot[c]{\rmfamily\thepage} % page number
+\newcommand{\f@nch@headinit}{}
+\newcommand{\fancyheadinit}[1]{%
+ \def\f@nch@headinit{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fancyfootinit}
+% This macro can be used to define initialisation code that will be run
+% before the construction of the footer. It can for example set the
+% color or the font, or change \cs{footrulewidth} or \cs{footruleskip}.
+% It cannot make global changes, just changes for the footer.
+% \begin{macro}{\f@nch@footinit}
+% Storage for the footer initialisation code.
+% \begin{macrocode}
+\newcommand{\f@nch@footinit}{}
+\newcommand{\fancyfootinit}[1]{%
+ \def\f@nch@footinit{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fancyhfinit}
+% This macro sets both the header and the footer initialisation codes to
+% the same value.
+% \begin{macrocode}
+\newcommand{\fancyhfinit}[1]{%
+ \def\f@nch@headinit{#1}%
+ \def\f@nch@footinit{#1}%
+}
% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\f@nch@vbox}
% Make a \cs{vbox} with the header or footer. Check whether there is
@@ -2980,26 +4025,46 @@
%
% \changes{fancyhdr v3.10}{2019/01/25}{Don't use \cs{global}\cs{setlength}.}
% \changes{fancyhdr v3.10}{2019/01/26}{Use \cs{newcommand} instead of \cs{def}.}
+% \changes{fancyhdr v4.0}{2019/03/15}{Don't adjust the
+% \cs{headheight}/\cs{footskip}, except when the \texttt{compatV3} option is given.}
+% \changes{fancyhdr v4.0}{2019/03/15}{Don't check when the \texttt{nocheck} option is given.}
% \begin{macrocode}
\newcommand\f@nch@vbox[2]{%
\setbox0\vbox{#2}%
\ifdim\ht0>#1\relax
- \f@nch@warning{%
- \string#1 is too small (\the#1): ^^J%
- Make it at least \the\ht0.^^J%
- We now make it that large for the rest of the document.^^J%
- This may cause the page layout to be inconsistent, however\@gobble
- }%
- \dimen0=#1\relax
- \global#1=\ht0\relax
- \ht0=\dimen0 %
+ \iff@nch@check
+ \dimen0=#1\advance\dimen0-\ht0
+ \f@nch@warning{%
+ \string#1 is too small (\the#1): \MessageBreak
+ Make it at least \the\ht0, for example:\MessageBreak
+ \string\setlength{\string#1}{\the\ht0}%
+ \iff@nch@compatViii .\MessageBreak
+ We now make it that large for the rest of the document.\MessageBreak
+ This may cause the page layout to be inconsistent, however
+ \fi
+ \ifx#1\headheight .\MessageBreak
+ You might also make \topmargin smaller to compensate:\MessageBreak
+ \string\addtolength{\string\topmargin}{\the\dimen0}%
+ \fi
+ \@gobble
+ }%
+ \fi
+ \iff@nch@compatViii
+ \dimen0=#1\relax
+ \global#1=\ht0\relax
+ \ht0=\dimen0 %
+ \else
+ \ht0=#1%
+ \fi
\fi
\box0}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\f@nch@head}
-% \begin{macro}{\f@nch@foot}
+% \changes{fancyhdr v4.0}{2019/03/22}{Parameter \cs{headruleskip}.}
+% \changes{fancyhdr v4.0}{2019/03/25}{\cs{fancyheadinit} initialisation
+% code added and \cs{f@nch@reset} moved up.}
% Put together a header or footer given the left, center and right
% text, fillers at left and right and a rule. The \cs{xlap} commands put
% the text into an hbox of zero size, so overlapping text does not
@@ -3015,12 +4080,15 @@
% This is the right component. \\
% 5. RIGHTSIDE BEARING. This is always \cs{relax} or \cs{hss}
% (after expansion).
-%
+% Before constructing the header or footer, the environment is reset to
+% a known state, and then the corresponding initialisation code as given
+% in \cs{fancyheadinit} or \cs{fancyfootinit}, respectively, is run.
% \begin{macrocode}
\newcommand\f@nch@head[5]{%
+ \f@nch@reset
+ \f@nch@headinit\relax
#1%
\hbox to\headwidth{%
- \f@nch@reset
\f@nch@vbox\headheight{%
\hbox{%
\rlap{\parbox[b]{\headwidth}{\raggedright#2}}%
@@ -3029,6 +4097,7 @@
\hfill
\llap{\parbox[b]{\headwidth}{\raggedleft#4}}%
}%
+ \vskip\headruleskip\relax
\headrule
}%
}%
@@ -3036,12 +4105,15 @@
}
% \end{macrocode}
%
+% \begin{macro}{\f@nch@foot}
% \changes{fancyhdr v3.10}{2019/01/26}{Put \cs{footrule} in a \cs{vbox}
% to accommodate for flexible footrules.}
% \changes{fancyhdr v3.10}{2019/01/28}{Use \cs{unvbox} on the footrule \cs{vbox}
% to preserve vertical spacing.}
% \changes{fancyhdr v3.10}{2019/01/28}{Move \cs{footruleskip} outside of the \cs{footrule}
% definition.}
+% \changes{fancyhdr v4.0}{2019/03/25}{\cs{fancyfootinit} initialisation
+% code added and \cs{f@nch@reset} moved up.}
% We put the \cs{footrule} in a \cs{vbox} to accommodate for flexible
% footrules (e.g. using \cs{hrulefill}), so that the \cs{headwidth} will
% be used as the line width. But to preserve the vertical spacing we
@@ -3049,9 +4121,10 @@
%
% \begin{macrocode}
\newcommand\f@nch@foot[5]{%
+ \f@nch@reset
+ \f@nch@footinit\relax
#1%
\hbox to\headwidth{%
- \f@nch@reset
\f@nch@vbox\footskip{%
\setbox0=\vbox{\footrule}\unvbox0
\vskip\footruleskip
@@ -3070,113 +4143,179 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\headrule}
-% \begin{macrocode}
-\def\headrule{{\if@fancyplain\let\headrulewidth\plainheadrulewidth\fi
- \hrule\@height\headrulewidth\@width\headwidth
- \vskip-\headrulewidth}}
-% \end{macrocode}
-% \end{macro}
+% \begin{macro}{\MakeUppercase}
+% Define \MakeUppercase for old \LaTeX{}en. Note: we used \cs{def} rather
+% than \cs{let}, so that \verb+\let\uppercase\relax+ (from the version 1
+% documentation) will still work.
%
-% \begin{macro}{\footrule}
-% \changes{fancyhdr v3.10}{2019/01/28}{Move \cs{footruleskip} outside of the \cs{footrule}
-% definition and remove useless \cs{vskip} at the top.}
% \begin{macrocode}
-\def\footrule{{\if@fancyplain\let\footrulewidth\plainfootrulewidth\fi
- \hrule\@width\headwidth\@height\footrulewidth}}
+\f@nch@ifundefined{MakeUppercase}{\def\MakeUppercase{\uppercase}}{}%
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\ps@fancy}
-% Pagestyle \texttt{fancy}
+% \begin{macro}{\@chapapp}
+% Define \cs{@chapapp} for classes that don't have it, e.g. amsbook
% \begin{macrocode}
-\def\ps@fancy{%
- \f@nch@ifundefined{@chapapp}{\let\@chapapp\chaptername}{}% for amsbook
+\f@nch@ifundefined{@chapapp}{\let\@chapapp\chaptername}{}%
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\MakeUppercase}
-% Define \MakeUppercase for old \LaTeX{}en. Note: we used \cs{def} rather
-% than \cs{let}, so that \verb+\let\uppercase\relax+ (from the version 1
-% documentation) will still work.
-%
+% \begin{macro}{\f@nch@initialise}
+% \changes{fancyhdr v4.0}{2019/03/21}{Put all the initialisation code in
+% \cs{f@nch@initialise}}
+% This macro initialises the headers and footers and \cs{chaptermark}
+% and/or \cs{[sub]sectionmark} for pagestyle \texttt{fancy}
% \begin{macrocode}
-\f@nch@ifundefined{MakeUppercase}{\def\MakeUppercase{\uppercase}}{}%
+\def\f@nch@initialise{%
% \end{macrocode}
-% \end{macro}
-%
+%
% \begin{macro}{\chaptermark}
% \begin{macro}{\sectionmark}
% \begin{macro}{\subsectionmark}
% Standard definitions for \cs{chaptermark}, \cs{sectionmark} and \cs{subsectionmark}.
-%
-% \begin{macrocode}
-\f@nch@ifundefined{chapter}%
- {\def\sectionmark##1{\markboth{\MakeUppercase{\ifnum \c@secnumdepth>\z@
- \thesection\hskip 1em\relax
- \fi ##1}}{}}%
- \def\subsectionmark##1{\markright {\ifnum \c@secnumdepth >\@ne
- \thesubsection\hskip 1em\relax \fi ##1}}}%
- {\def\chaptermark##1{\markboth {\MakeUppercase{\ifnum
- \c@secnumdepth>\m@ne \@chapapp\ \thechapter. \ \fi ##1}}{}}%
-\def\sectionmark##1{\markright{\MakeUppercase{\ifnum \c@secnumdepth >\z@
- \thesection. \ \fi ##1}}}%
-}
+%
+% \begin{macrocode}
+ \f@nch@ifundefined{chapter}%
+ {\def\sectionmark##1{\markboth{\MakeUppercase{\ifnum \c@secnumdepth>\z@
+ \thesection\hskip 1em\relax
+ \fi ##1}}{}}%
+ \def\subsectionmark##1{\markright {\ifnum \c@secnumdepth >\@ne
+ \thesubsection\hskip 1em\relax \fi ##1}}}%
+ {\def\chaptermark##1{\markboth {\MakeUppercase{\ifnum
+ \c@secnumdepth>\m@ne \@chapapp\ \thechapter. \ \fi ##1}}{}}%
+ \def\sectionmark##1{\markright{\MakeUppercase{\ifnum \c@secnumdepth >\z@
+ \thesection. \ \fi ##1}}}%
+ }%
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
-%
-% \begin{macro}{\ps@fancy}
-% Pagestyle \texttt{fancy}. \cs{ps@@fancy} is the real pagestyle
-% \texttt{fancy}, i.e. the non-plain one.
+%
+% \begin{macro}{\headrule}
+% \begin{macrocode}
+ \def\headrule{{\if@fancyplain\let\headrulewidth\plainheadrulewidth\fi
+ \hrule\@height\headrulewidth\@width\headwidth
+ \vskip-\headrulewidth}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\footrule}
+% \changes{fancyhdr v3.10}{2019/01/28}{Move \cs{footruleskip} outside of the \cs{footrule}
+% definition and remove useless \cs{vskip} at the top.}
+% \begin{macrocode}
+ \def\footrule{{\if@fancyplain\let\footrulewidth\plainfootrulewidth\fi
+ \hrule\@width\headwidth\@height\footrulewidth}}%
+% \end{macrocode}
+% \end{macro}
+%
+% Default values for \cs{headrulewidth}, \cs{footrulewidth},
+% \cs{headruleskip} and \cs{footruleskip}.
+% \begin{macrocode}
+ \def\headrulewidth{0.4pt}%
+ \def\footrulewidth{0pt}%
+ \def\headruleskip{0pt}%
+ \def\footruleskip{0.3\normalbaselineskip}%
+% \end{macrocode}
+% Initialisation of the head and foot text.
+%
+% The default values still contain \cs{fancyplain} for compatibility:
+% lefthead empty on ``plain'' pages, \cs{rightmark} on even, \cs{leftmark} on odd pages;
+% evenhead empty on ``plain'' pages, \cs{leftmark} on even, \cs{rightmark} on odd pages.
+% \begin{macrocode}
+ \fancyhf{}%
+ \if@twoside
+ \fancyhead[el,or]{\fancyplain{}{\slshape\rightmark}}%
+ \fancyhead[er,ol]{\fancyplain{}{\slshape\leftmark}}%
+ \else
+ \fancyhead[l]{\fancyplain{}{\slshape\rightmark}}%
+ \fancyhead[r]{\fancyplain{}{\slshape\leftmark}}%
+ \fi
+ \fancyfoot[c]{\rmfamily\thepage}% page number
+}
+% \end{macrocode}
+% Call the initialisation
% \begin{macrocode}
-\ps@@fancy
-\gdef\ps@fancy{\@fancyplainfalse\ps@@fancy}%
+\f@nch@initialise
% \end{macrocode}
% \end{macro}
-%
-% Initialize \cs{headwidth} if the user didn't. If \cs{headwidth} ${}< 0$,
-% then the user did not initialize it, or they just added something to
+%
+% \begin{macro}{\ps@f@nch@fancyproto}
+% \cs{ps@f@nch@fancyproto} is the
+% initial value for pagestyle \texttt{fancy}. The real page style
+% is \cs{ps@f@nch@fancycore} but \cs{ps@f@nch@fancyproto} for the first use
+% of \Cmd{pagestyle\{fancy\}} or any of its derivatives. It
+% initialises \cs{headwidth}, and then resets itself to
+% \cs{ps@f@nch@fancycore}. For backwards compatibility it still
+% contains \cs{@fancyplainfalse}.
+% The reason we have \cs{ps@f@nch@fancyproto} is so that page style
+% \texttt{fancy} can be redefined.
+% \changes{fancyhdr v4.0}{2019/03/21}{Reorganise \cs{ps@fancy}}
+% \begin{macrocode}
+\def\ps@f@nch@fancyproto{%
+% \end{macrocode}
+% Initialise \cs{headwidth} if the user didn't. If \cs{headwidth} ${}< 0$,
+% then the user did not initialise it, or they just added something to
% it in the expectation that
-% it was initialized to \cs{textwidth}. We compensate this now. This loses if
+% it was initialised to \cs{textwidth}. We compensate this now. This loses if
% the user intended to multiply it by a factor. But that case is more
-% likely done by saying something like \verb+\setlength{\headwidth}{1.2\textwidth}+.
-% The documentation says you have to change \cs{headwidth} after the first call to
+% likely done by saying something like \verb+\setlength{\headwidth}{1.2\textwidth}+.
+% The documentation advises to change \cs{headwidth} after the first call to
% \verb+\pagestyle{fancy}+. This code is just to catch the most common cases were
-% that requirement is violated.
-%
+% that is not the case.
% \begin{macrocode}
-\ifdim\headwidth<0sp
+ \ifdim\headwidth<0sp
\global\advance\headwidth123456789sp\global\advance\headwidth\textwidth
-\fi}
+ \fi
+% \end{macrocode}
+% Now we reset \cs{ps@f@nch@fancyproto} to \cs{ps@f@nch@fancycore} with \cs{@fancyplainfalse}
+% and call that version.
+% \begin{macrocode}
+ \gdef\ps@f@nch@fancyproto{\@fancyplainfalse\ps@f@nch@fancycore}%
+ \@fancyplainfalse\ps@f@nch@fancycore
+}%
% \end{macrocode}
+% Let the system know this is a \texttt{fancyhdr} pagestyle.
+% \begin{macrocode}
+\@namedef{f@nch@ps@f@nch@fancyproto-is-fancyhdr}{}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{ps@fancy}
+% Define \cs{ps@fancy} just to call \cs{ps@f@nch@fancyproto}.
+% \begin{macrocode}
+\def\ps@fancy{\ps@f@nch@fancyproto}
+\@namedef{f@nch@ps@fancy-is-fancyhdr}{}
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\ps@fancyplain}
% The pagestyle \texttt{fancyplain} (deprecated).
-%
+% After initializing by calling \cs{ps@f@nch@fancyproto} it sets page style
+% \texttt{plain} to our version \cs{ps@plain@fancy}, which just sets
+% \cs{@fancyplaintrue} and then calls the page style fancy implementation.
+%
% \begin{macrocode}
-\def\ps@fancyplain{\ps@fancy \let\ps@plain\ps@plain@fancy}
-\def\ps@plain@fancy{\@fancyplaintrue\ps@@fancy}
+\def\ps@fancyplain{\ps@f@nch@fancyproto \let\ps@plain\ps@plain@fancy}
+\def\ps@plain@fancy{\@fancyplaintrue\ps@f@nch@fancycore}
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\ps@@empty}
+%
+% \begin{macro}{\f@nch@ps@empty}
% Save the definition of \cs{ps@empty} (pagestyle \texttt{empty}).
-%
+% \changes{fancyhdr v4.0}{2019/03/21}{Rename \cs{ps@@empty} to \cs{f@nch@ps@empty}}
+%
% \begin{macrocode}
-\let\ps@@empty\ps@empty
+\let\f@nch@ps@empty\ps@empty
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\ps@@fancy}
-% The actual pagestyle \texttt{fancy}. For amsbook/amsart, which do
-% strange things with \cs{topskip}, we start with \cs{ps@@empty}. We
+%
+% \begin{macro}{\ps@f@nch@fancycore}
+% \changes{fancyhdr v4.0}{2019/03/21}{Rename \cs{ps@@fancy} to \cs{ps@f@nch@fancycore}}
+% The actual implementation of pagestyle \texttt{fancy}. For amsbook/amsart, which do
+% strange things with \cs{topskip}, we start with \cs{f@nch@ps@empty}. We
% construct the even and odd headers and footers from all the parts that
% we have collected.
% \begin{macrocode}
-\def\ps@@fancy{%
- \ps@@empty
+\def\ps@f@nch@fancycore{%
+ \f@nch@ps@empty
\def\@mkboth{\protect\markboth}%
\def\@oddhead{\f@nch@head\f@nch@Oolh\f@nch@olh\f@nch@och\f@nch@orh\f@nch@Oorh}%
\def\@oddfoot{\f@nch@foot\f@nch@Oolf\f@nch@olf\f@nch@ocf\f@nch@orf\f@nch@Oorf}%
@@ -3185,7 +4324,22 @@
}
% \end{macrocode}
% \end{macro}
-%
+% \begin{macro}{ps@fancydefault}
+% \changes{fancyhdr v4.0}{2019/03/21}{Added \cs{ps@fancydefault}}
+% This is page style \texttt{fancydefault}. It is in fact page style
+% \texttt{fancy} with all the defaults embedded. In contrast with page
+% style \texttt{fancy} that gets all its settings from the environment.
+% It reruns all initialisations and then calls \cs{ps@f@nch@fancyproto}.
+% \begin{macrocode}
+\def\ps@fancydefault{%
+ \f@nch@initialise
+ \ps@f@nch@fancyproto
+}
+\@namedef{f@nch@ps@fancydefault-is-fancyhdr}{}
+% \end{macrocode}
+%
+% \end{macro}
+%
% \begin{macro}{\f@nch@Oolh}
% \begin{macro}{\f@nch@Oorh}
% \begin{macro}{\f@nch@Oelh}
@@ -3201,7 +4355,7 @@
% \begin{macrocode}
\def\f@nch@Oolh{\if@reversemargin\hss\else\relax\fi}
\def\f@nch@Oorh{\if@reversemargin\relax\else\hss\fi}
-\let\f@nch@Oelh\f@nch@Oorh
+\let\f@nch@Oelh\f@nch@Oorh
\let\f@nch@Oerh\f@nch@Oolh
\let\f@nch@Oolf\f@nch@Oolh
\let\f@nch@Oorf\f@nch@Oorh
@@ -3236,7 +4390,7 @@
% \begin{macro}{\f@nch@offsolh}
% \begin{macro}{\f@nch@offselh}
% The same for the footer.
-%
+%
% \begin{macrocode}
\def\f@nch@offsolf{\headwidth=\textwidth\advance\headwidth\f@nch@O@olf
\advance\headwidth\f@nch@O@orf\hskip-\f@nch@O@olf}
@@ -3273,7 +4427,7 @@
% We need a boolean \cs{iff@nch@footnote} to capture if there was a footnote.
%
% \begin{macrocode}
-\newif\iff@nch@footnote
+\newif\iff@nch@footnote
\AtBeginDocument{%
\let\latex@makecol\@makecol
\def\@makecol{\ifvoid\footins\f@nch@footnotefalse\else\f@nch@footnotetrue\fi
@@ -3282,7 +4436,7 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
-%
+%
% \begin{macro}{\iftopfloat}
% \begin{macro}{\ifbotfloat}
% \begin{macro}{\iffloatpage}
@@ -3301,9 +4455,33 @@
% \end{macro}
%
% \begin{macro}{\fancypagestyle}
+% Define a new page style. The optional second argument is the base page style.
+% It defaults to \cs{ps@f@nch@fancyproto}.
+% \changes{fancyhdr v4.0}{2019/03/21}{Added optional base style argument.}
+% \begin{macrocode}
+\newcommand{\fancypagestyle}[1]{%
+ \@ifnextchar[{\f@nch@pagestyle{#1}}{\f@nch@pagestyle{#1}[f@nch@fancyproto]}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\f@nch@pagestyle}
+% The actual code for \cs{fancypagestyle}. Build the page style body.
+% Declare it as a fancyhdr page style.
+% \changes{fancyhdr v4.0}{2019/09/05}{Make the definition of \cs{f@nch@pagestyle} \cs{long}.}
% \begin{macrocode}
-\newcommand{\fancypagestyle}[2]{%
- \@namedef{ps@#1}{\let\f@nch@gbl\relax#2\relax\ps@fancy}}
+\long\def\f@nch@pagestyle#1[#2]#3{%
+ \f@nch@ifundefined{ps@#2}{%
+ \f@nch@errmsg{\string\fancypagestyle: Unknown base page style `#2'}%
+ }{%
+ \f@nch@ifundefined{f@nch@ps@#2-is-fancyhdr}{%
+ \f@nch@errmsg{\string\fancypagestyle: Base page style `#2' is not fancyhdr-based}%
+ }%
+ {%
+ \@namedef{ps@#1}{\let\f@nch@gbl\relax\@nameuse{ps@#2}#3\relax}%
+ \@namedef{f@nch@ps@#1-is-fancyhdr}{}%
+ }%
+ }%
+}%
% \end{macrocode}
% \end{macro}
%</fancyhdr>
@@ -3323,7 +4501,7 @@
% \changes{extramarks v2.1}{2016/08/27}{Added a \cs{ProvidesPackage} line.\\
% Updated contact information.}
% \changes{extramarks v3.9}{2016/10/12}{Unify version number with \Package{fancyhdr.sty}.}
-%
+%
% \changes{extramarks v3.9a}{2017/06/30}{Restore \cs{newtoks}\cs{@temptokenb}}
% \begin{macro}{\@temptokenb}
% A token register to store some marks information
@@ -3339,7 +4517,7 @@
\let\protect\@unexpandable@protect \xdef}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\markboth}
% Our own definition of \cs{markboth}, mainly because \cs{@markboth}
% gets more parameters.
@@ -3357,7 +4535,7 @@
% \begin{macro}{\markright}
% We use the standard definition of \cs{markright}. No use to duplicate here.
% \end{macro}
-%
+%
% \begin{macro}{\@markboth}
% Note: put \texttt{\#3\#4} in toks register.
% \begin{macrocode}
@@ -3365,7 +4543,7 @@
\unrestored@protected@xdef\@themark{{#5}{#6}\the\@temptokena}}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\@markright}
% Note: put \texttt{\#1} and \texttt{\#3\#4} in toks registers.
% Maybe I can get rid of the extra \cs{@temptokenb} by doing the expansion
@@ -3381,7 +4559,7 @@
% \begin{macro}{\@rightmark}
% Internal macros to get the standard marks.
% \begin{macrocode}
-\def\@leftmark#1#2#3#4{#1}
+\def\@leftmark#1#2#3#4{#1}
\def\@rightmark#1#2#3#4{#2}
% \end{macrocode}
% \end{macro}
@@ -3433,7 +4611,7 @@
\if@nobreak\ifvmode\nobreak\fi\fi}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\@markextra}
% Internal macro to store the extra marks in the marks storage.\\
% Note: Put \texttt{\#1\#2} in toks register.
@@ -3442,7 +4620,7 @@
\unrestored@protected@xdef\@themark{\the\@temptokena{#5}{#6}}}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\firstleftxmark}
% \begin{macro}{\firstrightxmark}
% \begin{macro}{\topleftxmark}
@@ -3479,7 +4657,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
-%
+%
% \begin{macro}{\@tleftxmark}
% \begin{macro}{\@rightxmark}
% Internal macros to extract the extra marks out of the marks storage.
@@ -3489,7 +4667,7 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
-%
+%
%</extramarks>
%
% \section{fancyheadings.sty}
@@ -3521,7 +4699,7 @@
\MessageBreak
fancyhdr is 99 percent compatible with\MessageBreak
fancyheadings. The only incompatibility is\MessageBreak
- that \protect\headrulewidth\space and \protect\footrulewidth\space
+ that \protect\headrulewidth\space and \protect\footrulewidth\space
and\MessageBreak
their \protect\plain... versions are no longer length\MessageBreak
parameters, but normal macros (to be changed\MessageBreak
diff --git a/Master/texmf-dist/source/latex/fancyhdr/fancyhdr.ins b/Master/texmf-dist/source/latex/fancyhdr/fancyhdr.ins
index e3f68035daa..c6013955926 100644
--- a/Master/texmf-dist/source/latex/fancyhdr/fancyhdr.ins
+++ b/Master/texmf-dist/source/latex/fancyhdr/fancyhdr.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2016 by Piet van Oostrum <piet@vanoostrum.org>
+%% Copyright (C) 2016-2019 by Pieter van Oostrum <pieter@vanoostrum.org>
%%
%% This file may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.3 of this license
diff --git a/Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx b/Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx
index 5dcef07b612..41bee63cf1a 100644
--- a/Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx
+++ b/Master/texmf-dist/source/latex/fcolumn/fcolumn.dtx
@@ -1,5 +1,5 @@
% \iffalse meta-comment
-% Copyright (C) 2015--2019 by Edgar Olthof
+% Copyright (C) 2015--2021 by Edgar Olthof
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -14,11 +14,12 @@
% \fi
% \iffalse
%<package>\ProvidesPackage{fcolumn}
-%<package> [2019/04/24 v1.2 Automatic Currency Package (EHTO)]
+%<package> [2021/01/14 v1.3 Automatic Currency Package (EHTO)]
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\RequirePackage{array}[v2.4k]
%<*driver>
\documentclass{ltxdoc}
+\usepackage{longtable}
\usepackage{fcolumn}
\usepackage{booktabs}
\usepackage[tableposition=top,aboveskip=0pt]{caption}
@@ -30,15 +31,16 @@ indention=0pt,labelsep=colon,justification=raggedright}
\usepackage{url}
\usepackage[hyperfootnotes=false,hidelinks]{hyperref}
\usepackage{eurosym}
+\usepackage{color}
\EnableCrossrefs
\CodelineIndex
-\RecordChanges
\begin{document}
\DocInput{fcolumn.dtx}
\end{document}
%</driver>
% \fi
-% \CheckSum{1078}
+% \RecordChanges
+% \CheckSum{1287}
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
@@ -64,24 +66,32 @@ indention=0pt,labelsep=colon,justification=raggedright}
% counts and resetting of column counter done in a nicer way.}
% \changes{v1.1.1}{2015/09/27}{Installation procedure changed from .ins-in-.dtx to separate
% .ins and .dtx after discussion with Karl Berry as well as some minor code improvements.}
-% \changes{v1.1.2}{2015/09/29}{Some inconsistencies between explanatory text
-% and actual code removed.}
+% \changes{v1.1.2}{2015/09/29}{Some inconsistencies between explanatory text and actual
+% code removed.}
% \changes{v1.2}{2019/03/06}{Input parsing changed after comment from Frank
% Mittelbach. He (Frank) also gave various suggestions for improving robustness
% or user friendlyness of this package. This version is only backwards compatible
% when zero decimal digits were and are specified as modifier.}
+% \changes{v1.3}{2021/01/03}{Christian Hoff requested the possibility to provide extra formatting
+% information to a column, e.g., colouring. That was implemented by having an extra parameter
+% to the generic F-column. The current solution is not very robust, as font and/or size change
+% in math environment are very tricky, but providing colour information works, see the example
+% in the main text. This version is now compatible with package longtable. Version~1.3 is
+% backwards compatible to~1.2: it only adds functionality.}
% \GetFileInfo{fcolumn.sty}
-% \DoNotIndex{\@arstrut,\@arstrutbox,\@depth,\@firstampfalse,\@firstamptrue,\@gobble,\@halignto}
-% \DoNotIndex{\@height,\@mkpream,\@ne,\@nextchar,\@preamble,\@sharp,\@tempdima,\@tempswafalse}
-% \DoNotIndex{\@tempswatrue,\@\temptokena,\@tfor,\@whilesw,\@width,\advance,\arraystretch,\baselineskip}
-% \DoNotIndex{\begingroup,\bgroup,\count,\count@,\cr,\csname,\def,\divide,\do,\dp,\edef,\egroup}
-% \DoNotIndex{\else,\endcsname,\endgroup,\expandafter,\extrarowheight,\fi,\gdef,\halignto,\hbox}
-% \DoNotIndex{\hfil,\ht,\if,\if@firstamp,\if@tempswa,\ifcase,\lineskip,\loop,\m@ne,\m@th,\message}
-% \DoNotIndex{\multiply,\or,\par,\prepnext@tok,\protect,\repeat,\setbox,\space,\string,\strutbox}
-% \DoNotIndex{\tabskip,\tabularnewline,\the,\the@toks,\thr@@,\tw@,\unhbox,\vbox,\vcenter,\vrule}
+% \DoNotIndex{\@@endpbox,\@@startpbox,\@acol,\@arstrut,\@arstrutbox,\@classiv,\@classz,\@depth}
+% \DoNotIndex{\@firstampfalse,\@firstamptrue,\@gobble,\@halignto,\@height,\@mkpream,\@ne,\@nextchar}
+% \DoNotIndex{\@preamble,\@sharp,\@tempdima,\@tempswafalse,\@tempswatrue,\@\temptokena,\@tfor}
+% \DoNotIndex{\@whilesw,\@width,\advance,\arraystretch,\baselineskip,\begingroup,\bgroup,\count}
+% \DoNotIndex{\count@,\cr,\csname,\def,\divide,\do,\dp,\edef,\egroup,\hfil,\hline,\ht,\if,\if@firstamp}
+% \DoNotIndex{\if@tempswa,\ifcase,\kill,\lineskip,\LT@@hl,\LT@@tabarray,\LT@bchunk,\LT@caption,\LT@endpbox}
+% \DoNotIndex{\LT@hline,\LT@kill,\LT@LL@FM@cr,\LT@make@row,\LT@mcol,\LT@no@pgbk,\LT@nofcols,\LT@rows}
+% \DoNotIndex{\LT@setprevdepth,\LT@startpbox,\LT@tabularcr,\LTleft,\LTright,\loop,\m@ne,\m@th,\message}
+% \DoNotIndex{\multiply,\or,\par,\prepnext@tok,\protect,\refstepcounter,\repeat,\setbox,\space,\string}
+% \DoNotIndex{\strutbox,\tabskip,\tabularnewline,\the,\the@toks,\thr@@,\tw@,\unhbox,\vbox,\vcenter,\vrule}
% \DoNotIndex{\vskip,\vtop,\wd,\xdef,\z@,\z@skip}
-% \title{The \textsf{fcolumn} package\thanks{This file has version
-% number \fileversion, last revised \filedate.}}
+% \title{The \textsf{fcolumn} package\thanks{This file has version number \fileversion, last
+% revised \filedate.}}
% \author{Edgar Olthof\\
% \texttt{edgar <dot> olthof <at> inter <dot> nl <dot> net}}
% \date{Printed \today}
@@ -98,16 +108,16 @@ indention=0pt,labelsep=colon,justification=raggedright}
% The package |fcolumn| provides the macros for an extra tabular specifier
% that makes creating financial tables easy. The column specifier |f|
% itself is rather simple; it is the predefined version of a generic
-% column |F|. The generic version expects three arguments: 1)~grouping
+% column |F|. The generic version expects four arguments: 1)~grouping
% character of the integer part on output, 2)~decimal mark used on output,
-% and 3)~compact additional information on input/output characteristics,
-% see below.
+% 3)~compact additional information on input/output characteristics, and
+% 4)~anything, but primarily used for providing formatting information, see below.
%
% The f-column in the current version of the package is defined for the
-% continental European standard: |\newcolumntype{f}{F{.}{,}{3,2}}|. This
+% continental European standard: |\newcolumntype{f}{F{.}{,}{3,2}{}}|. This
% means that a number like 12345,67 will be typeset as $12{.}345{,}67$.
% People in the Anglo-saxon world would rather code
-% |\newcolumntype{f}{F{,}{.}{3,2}}| for the same input, yielding
+% |\newcolumntype{f}{F{,}{.}{3,2}{}}| for the same input, yielding
% $12{,}345{.}67$ as output for the number given above. The default
% value for |#3| is |3,2|, indicating
% that grouping of the integer part is by three digits, that a comma is
@@ -116,7 +126,7 @@ indention=0pt,labelsep=colon,justification=raggedright}
% If however, in your country or company grouping is done with a thinspace every
% four digits, that the separator in the source should be the character |p|,
% and there are three digits after the decimal mark---that happens to be a
-% |\cdot|---, then simply specify |\newcolumntype{f}{F{\,}{\cdot}{4p3}}| in
+% |\cdot|---, then simply specify |\newcolumntype{f}{F{\,}{\cdot}{4p3}{}}| in
% that case. The input could be 12345p678 then, yielding $1{\,}2345{\cdot}678$
% as output.
%
@@ -125,6 +135,11 @@ indention=0pt,labelsep=colon,justification=raggedright}
% mark) you have to explicitly specify |x,0|. If you want no grouping
% character, specify |0,x|.
%
+% As the fourth parameter you can insert anything just before the typesetting
+% of an amount in a column takes place. Its purpose is to add additional
+% formatting information, e.g., |\color{red}| to have the contents of a column
+% coloured red, but it can be misused, so use with care. And it can't do all!
+%
% This package requires and loads the |array| package~\cite{array}. To
% show where and how the |F|-column is used, let's look at some typical
% financial information as shown in Table~\ref{tab:ex1}
@@ -138,7 +153,7 @@ indention=0pt,labelsep=colon,justification=raggedright}
% \midrule
% house & 200000 & equity capital& 50000 \\
% bank account & -603,23 & mortgage & 150000 \\
-% savings & 28000 & & \\
+% savings & 28000 \\
% cash & 145,85 & profit & 27542,62 \\
% \sumline
% \bottomrule
@@ -146,7 +161,7 @@ indention=0pt,labelsep=colon,justification=raggedright}
% \end{table}
% and how this is entered in \LaTeX\ (Table~\ref{tab:ex2}).
% \begin{table}[htb]
-% \caption{Verbatim version of Example Table.}
+% \caption{Verbatim version of Example Table~\ref{tab:ex1}.}
% \label{tab:ex2}
% \begin{verbatim}
%\begin{table}[htb]
@@ -159,7 +174,7 @@ indention=0pt,labelsep=colon,justification=raggedright}
%\midrule
%house & 200000 & equity capital& 50000 \\
%bank account & -603,23 & mortgage & 150000 \\
-%savings & 28000 & & \\
+%savings & 28000 \\
%cash & 145,85 & profit & 27542,62 \\
%\sumline
%\bottomrule
@@ -176,17 +191,143 @@ indention=0pt,labelsep=colon,justification=raggedright}
%
% This package is heavily inspired by the |dcolumn| package by
% David Carlisle~\cite{dcolumn}, some constructions are more or less
-% copied from that package. Version~1.2 (this version) uses a few ideas
-% from, and incorporates quite some suggestions by, Frank Mittelbach.
+% copied from that package. Version~1.3 (this version) incorporates the idea
+% of Christian Hoff of providing additional (formatting) information per column.
+% A rather contrived example is given in Table~\ref{tab:ex3}, combining colour and fonts.
+% \newcolumntype{q}[1]{F{.}{,}{3,2}{#1}}
+% \begin{table}[htb]
+% \caption{Example Table with column formatting.}
+% \label{tab:ex3}
+% \begin{tabular}{@{}lq{\color{red}\mathsf,{}\mathbf}lq{\color{green}}@{}}
+% \multicolumn4c{\bfseries Balance sheet}\\
+% \toprule
+% properties & \leeg{31 dec 2014} & debts & \leeg{31 dec 2014}\\
+% \midrule
+% house & 200000 & equity capital& 50000 \\
+% bank account & -603,23 & mortgage & 150000 \\
+% savings & 28000 \\
+% cash & 145,85 & profit & 27542,62 \\
+% \sumline
+% \bottomrule
+% \end{tabular}
+% \end{table}
+% How this is entered in \LaTeX\ is shown in Table~\ref{tab:ex4}.
+% \begin{table}[htb]
+% \caption{Almost verbatim version of Example Table~\ref{tab:ex3}.}
+% \label{tab:ex4}
+% \begin{verbatim}
+%\newcolumntype{q}[1]{F{.}{,}{3,2}{#1}}
+%\begin{table}[htb]
+%\caption{Example Table with column formatting.}
+%\label{tab:ex3}
+%\begin{tabular}{@{}lq{\color{red}\mathsf,{}\mathbf}lq{\color{green}}@{}}
+%\multicolumn4c{\bfseries Balance sheet}\\
+%...
+%...(same financial contents as in Table 1)
+%...
+%\end{tabular}
+%\end{table}
+% \end{verbatim}
+% \end{table}
+% The font changing commands like |\mathsf| and |\mathbf| act on an argument, hence require
+% braces, but these are already provided internally for this purpose. For that reason this
+% type of commands must be given last, without braces (and if you don't specify a font
+% changing command, these extra internal braces are just redundant). The argument to
+% the new columntype may consist of two parts,
+% separated by a comma. In that case, the part to the left of the comma is applied to the
+% whole column and the right part is applied in addition to the result. The example in
+% Table~\ref{tab:ex3} shows this: the bold font is only used in the |\sumline| and the
+% effect of |\mathsf| is annulled by the brace pair before |\mathbf|. You may even change
+% the colour for the |\sumline|, e.g., blue by ``|,{}\color{blue}\mathbf|'', since colour
+% settings do not require braces and the last setting overrides a previous one. If you want
+% bold font for the whole column, leave out the comma (and the |\mathsf{}|).
+%
+% Note that changes in font size, e.g., ``|\huge|'' in ``|\huge\color{red}\mathbf|''
+% as parameter to column type |q| are ignored by \LaTeX, since the formatting
+% information is used in math environment, which has its own way of handling this.
+% This isn't bad, as size changes in one column, without overall changes to the
+% table look terrible. If you want something huge, make a |\huge| table.
+%
+% This package now also works with |longtable|~\cite{longtable}, provided
+% |longtable| is loaded before |fcolumn|; it checks for that. For a change,
+% the raw formatting of the multipage table is shown first, in Table~\ref{tab:ex5}.
+% For more information on how to handle |\endhead| and related commands, see the
+% documentation of |longtable|~\cite{longtable}.
+% \begin{table}[htb]
+% \caption{Almost verbatim version of Example Table~\ref{tab:ex6}.}
+% \label{tab:ex5}
+% \begin{verbatim}
+%\begin{longtable}[l]{@{}lflf@{}}
+%\caption{\label{tab:ex6}Table showing compatibility of fcolumn and
+% longtable.}\\
+%\multicolumn4c{\bfseries Balance sheet}\\
+%\toprule
+%properties & \leeg{31 dec 2014} & debts & \leeg{31 dec 2014}\\
+%\midrule
+%\endfirsthead
+%\caption[]{\textit{(continued from previous page)\/}}\\
+%\midrule
+%properties & \leeg{31 dec 2014} & debts & \leeg{31 dec 2014}\\
+%\midrule
+%\endhead
+%\midrule
+%\multicolumn4{r@{}}{\textit{(Table continues on next page)\/}}\\
+%\endfoot
+%\bottomrule
+%\endlastfoot
+%...
+%...(somewhat altered financial contents as in Table 1)
+%...
+%\end{longtable}
+% \end{verbatim}
+% \end{table}
%
+% \noindent And here is the result (it's ugly, but it had to be that long to
+% demonstrate the page break). Not shown here are the new |fcolumn|
+% formatting possibilities (like new fonts and/or colours), but it has been
+% checked they do work in combination with |longtable|.
+% \begin{longtable}[l]{@{}lflf@{}}
+% \caption{\label{tab:ex6}Table showing compatibility of fcolumn and
+% longtable.}\\
+% \multicolumn4c{\bfseries Balance sheet}\\
+% \toprule
+% properties & \leeg{31 dec 2014} & debts & \leeg{31 dec 2014}\\
+% \midrule
+% \endfirsthead
+% \caption[]{\textit{(continued from previous page)\/}}\\
+% \midrule
+% properties & \leeg{31 dec 2014} & debts & \leeg{31 dec 2014}\\
+% \midrule
+% \endhead
+% \midrule
+% \multicolumn4{r@{}}{\textit{(Table continues on next page)\/}}\\
+% \endfoot
+% \bottomrule
+% \endlastfoot
+% house & 200000 & equity capital& 50000 \\
+% bank account & -603,23 & mortgage & 150000 \\
+% savings 1 & 2800 \\
+% savings 2 & 2800 \\
+% savings 3 & 2800 \\
+% savings 4 & 2800 \\
+% savings 5 & 2800 \\
+% savings 6 & 2800 \\
+% savings 7 & 2800 \\
+% savings 8 & 2800 \\
+% savings 9 & 2800 \\
+% savings 10 & 2800 \\
+% cash & 145,85 & profit & 27542,62 \\
+% \sumline
+% \end{longtable}
+
% \section{Commands}
% The user only needs to know six commands or constructions. These six are given here.
% \begin{macro}{F}
% In the tabular the column specifier |F| can be given with arguments, or
-% the predefined version~|f|, where the three arguments of |F| are |{.}|,
-% |{,}|, and |{3,2}|. If you want |g| to be your own definition like the
+% the predefined version~|f|, where the four arguments of |F| are |{.}|,
+% |{,}|, |{3,2}|, and |{}|. If you want |g| to be your own definition like the
% curious one given in Section~\ref{intro}, then specify
-% |\newcolumntype{g}{F{\,}{\cdot}{4p3}}| prior to using |g| in a tabular.
+% |\newcolumntype{g}{F{\,}{\cdot}{4p3}{}}| prior to using |g| in a tabular.
%
% Entries in an F-column are, from that moment on, treated as numbers unless
% explicitly escaped by |\leeg|, see below. The numbers are typeset
@@ -196,7 +337,7 @@ indention=0pt,labelsep=colon,justification=raggedright}
% character is the dot, except when the dot is specified as input decimal
% mark; in that case the comma is acting as input grouping character. With
% this convention the continental Europe and Anglo-saxon part of the world
-% is served.
+% is served. And using input grouping markers is optional.
% \end{macro}
% \begin{macro}{\sumline}
% The numbers in an |F|-column are typeset as a financial amount, but the real
@@ -207,7 +348,7 @@ indention=0pt,labelsep=colon,justification=raggedright}
% \item It generates a rule with width calculated in the first item;
% \item It checks the columns that are supposed to balance whether or not they
% actually do. If so, nothing happens. If not, a |\PackageWarning| is given
-% that column $i$ and $j$ do not balance, where $i$ and $j$ are the relevant
+% that column~$i$ and~$j$ do not balance, where $i$ and $j$ are the relevant
% columns. This is only done if the total number of |F|-columns is even,
% e.g., if there are six |F|-columns, then~1 is checked against~4, 2 against~5,
% and 3 against~6. If the number of |F|-columns is odd then anything could be
@@ -217,18 +358,21 @@ indention=0pt,labelsep=colon,justification=raggedright}
% By default the vertical separation between the rule and the total is
% 2\thinspace pt, but this can be changed by the optional argument to
% |\sumline|. Give, e.g., |\sumline[10pt]|, in case you want this spacing
-% to be 10\thinspace pt.
+% to be 10\thinspace pt. And you may even give two options, like in
+% |\sumline[10pt][5pt]|, in which the second option is the extra space below
+% the summary row. In fact that second option is the option to |\\| that is
+% implicit in |\sumline|.
% \end{macro}
% \begin{macro}{\resetsumline}
% Suppose you want to typeset one tabular with the profit-and-loss of many
% projects individually. The layout of those tabulars is the same and it
% were nice if all columns were aligned. This can be done by making it one
% big tabular with a fresh start for each project. The macro
-% |\resetsumlines| is used for that: it resets all totals and all column
-% widths, see for example Table~\ref{tab:ex3}.
+% |\resetsumline| is used for that: it resets all totals and all column
+% widths, see for example Table~\ref{tab:ex7}.
% \begin{table}[htb]
% \caption{Example: multiple projects.}
-% \label{tab:ex3}
+% \label{tab:ex7}
% \begin{tabular}{@{}lfflff@{}}
% \multicolumn6c{\bfseries Project~1}\\
% \toprule
@@ -256,10 +400,10 @@ indention=0pt,labelsep=colon,justification=raggedright}
% Note that the rules in the first and third |F|-columns of project~1 cover
% $1{.}200{,}00$ whereas in project~2 those rules are narrower since they
% only cover $430{,}00$; still the columns are aligned. The verbatim way
-% of setting up Table~\ref{tab:ex3} is given in Table~\ref{tab:ex4}.
+% of setting up Table~\ref{tab:ex7} is given in Table~\ref{tab:ex6}.
% \begin{table}[htb]
-% \caption{Verbatim version of Table~\ref{tab:ex3}.}
-% \label{tab:ex4}
+% \caption{Verbatim version of Table~\ref{tab:ex7}.}
+% \label{tab:ex8}
% \begin{verbatim}
%\begin{table}[htb]
%\caption{Example: multiple projects.}
@@ -317,7 +461,9 @@ indention=0pt,labelsep=colon,justification=raggedright}
% even other ways. By default (for aesthetic reasons) |fcolumn| typesets
% it with a minus~sign, but strict accounting prescibes that the number
% should be put between parentheses. The latter can be accomplished by
-% setting |\strict@ccountingtrue|.
+% setting |\strict@ccountingtrue|. But since this contains a non-letter,
+% it is also possible to invoke |fcolumn| with the option |strict|, i.e.,
+% |\usepackage[strict]{fcolumn}|, which sets this flag.
% \end{macro}
% \StopEventually{\PrintChanges\PrintIndex}
% \section{The macros}
@@ -339,8 +485,8 @@ indention=0pt,labelsep=colon,justification=raggedright}
% column type |f| does not use private macros (no~|@|), so overriding its
% definition is easy for a user.
% \begin{macrocode}
-\newcolumntype{F}[3]{>{\b@fi{#1}{#2}{#3}}r<{\e@fi}}
-\newcolumntype{f}{F{.}{,}{3,2}}
+\newcolumntype{F}[4]{>{\b@fi{#1}{#2}{#3}{#4}}r<{\e@fi}}
+\newcolumntype{f}{F{.}{,}{3,2}{}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -374,21 +520,25 @@ indention=0pt,labelsep=colon,justification=raggedright}
% \end{macrocode}
% Actually |\geldm@cro| is only a wrapper around |\g@ldm@cro|.
% \begin{macrocode}
-\def\geldm@cro#1#2{\withs@pfalse
+\def\geldm@cro#1#2{\withs@pfalse
\afterassignment\g@ldm@cro\count@#1\relax{#2}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\g@ldm@cro}
-% This macro starts by looking at the sign of |#2|: if it is negative, it prints
+% After setting the environment for formatting, this macro starts by looking
+% at the sign of |#2|: if it is negative, it prints
% the correct indicator (a parenthesis or a minus sign), assigns the absolute value
% of~|#2| to |\count2| and goes on. Note that |\geldm@cro| and therefore |\g@ldm@cro|
% are always used within |$|s, so it is really a minus sign that is printed, not a hyphen.
% All calculations are done with |\count0|, |\count1|, etc.\ i.e., without |F|-column-specific
% \meta{count}s because it is all done locally. Leaving the tabular environment will
-% restore their values.
+% restore their values. This is also true for the effect of |\FCform@t|, so that formatting
+% information is local to this column. The reason for inserting the opening brace between
+% |\FCform@t| and |\ifnum| (and the accompanying closing brace after |\fi|) is to facilitate
+% the possible use of |\mathbf| or any other font changing command as the last item in |\FCform@t|.
% \begin{macrocode}
-\def\g@ldm@cro#1\relax#2{\ifnum#2<0 \ifstrict@ccounting (\else -\fi
- \count2=-#2 \else\count2=#2
+\def\g@ldm@cro#1\relax#2{\FCform@t{\ifnum#2<0 \ifstrict@ccounting (\else
+ -\fi \count2=-#2 \else\count2=#2
\fi
% \end{macrocode}
% Calculate the entire currency units: this is the result of $x/a$ as integer
@@ -450,7 +600,7 @@ indention=0pt,labelsep=colon,justification=raggedright}
\rlap{)~!}\else\rlap{~!}\fi\else\ifstrict@ccounting
\rlap{\phantom{)}~!}\else\rlap{~!}\fi\fi
\else \ifnum#2<0 \ifstrict@ccounting\rlap{)}\fi\fi
-\fi}
+\fi}}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\g@ldens}
@@ -470,7 +620,7 @@ indention=0pt,labelsep=colon,justification=raggedright}
% about 100 times the current world economy~\cite{world_economy}. Yet
% another method is to used Heiko Oberdiek's package |bigintcalc|:
% then only memory restrictions apply. This, however, requires a major
-% rewrite of |fcolumn|. For now, version~1.2 sticks to the moderate amounts.
+% rewrite of |fcolumn|. For now, version~1.3 sticks to the moderate amounts.
%
% There is no straightforward interpretation of |#1| being zero or
% negative, therefore this is used as an indicator that no grouping
@@ -551,7 +701,7 @@ indention=0pt,labelsep=colon,justification=raggedright}
% First it checks whether there is a risk of overflow in this step. If
% $A$ and $B$ are two \TeX-registers and $B$ is to be added to $A$,
% overflow will not occur if one is (or both are) zero or if $A$ and~$B$
-% have different signs. Otherwise, be careful. Note that \TeX\ does not
+% have different signs. Otherwise, be careful. Note that \TeX\ does not
% check for overflow when performing an |\advance| (done in section~1238
% of Ref.~\cite{CandTB}), in contrast to |\multiply|, see section~105.
% \begin{macrocode}
@@ -568,13 +718,13 @@ indention=0pt,labelsep=colon,justification=raggedright}
\global\advance\csname FCtot@\romannumeral\FCsc@l\endcsname by \count0
\ifx\FCs@gn\m@ne
% \end{macrocode}
-% They had the same sign: risk of overflow. Record the sign
+% They had the same sign: risk of overflow. Record the sign
% of |\count0| (and of the original total of this column; they were
-% the same) in |\FCs@gn|. Table~\ref{tab:ex5}
+% the same) in |\FCs@gn|. Table~\ref{tab:ex9}
% \begin{table}[htb]
-% \def\PackageError#1#2#3{\PackageWarning{#1}{#2}}
+% \def\PackageError#1#2#3{\PackageWarning{#1}{#2: #3}}
% \caption{Examples on overflow.}
-% \label{tab:ex5}
+% \label{tab:ex9}
% \begin{tabular}{@{}lfff@{}}
% \multicolumn4c{\bfseries Projects}\\
% \toprule
@@ -605,7 +755,9 @@ indention=0pt,labelsep=colon,justification=raggedright}
\ifnum\count0<0
\let\FCs@gn=\m@ne
\PackageError{fcolumn}{Register overflow}{Overflow occurred
- in fcolumn \number\FCsc@l. Check your table.}%
+ in fcolumn \number\FCsc@l. You can press <enter> now and I'll
+ proceed,\MessageBreak but check your table. The offending entry is
+ indicated with an exclamation\MessageBreak mark in the output.}%
\else\let\FCs@gn=\@ne
\fi
\fi
@@ -618,29 +770,34 @@ indention=0pt,labelsep=colon,justification=raggedright}
\fi\unhbox0}
% \end{macrocode}
% \end{macro}
+%
+% The \meta{count}s |\FC@l| captures the part to the left of the decimal
+% mark, |\FC@r| that to the right.
+% \begin{macrocode}
+\newcount\FC@l \newcount\FC@r
+% \end{macrocode}
+% Some auxiliary definitions for capturing compacted information.
+% \begin{macrocode}
+\def\setucc@de#1#2\relax{\uccode`\~=`#1 }
+\def\assignform@t#1,#2,#3\end{\def\FCform@t{#1}\def\FCform@tt{#1#2}}
+% \end{macrocode}
% \def\<#1>{\leavevmode\hbox{$\langle$#1\/$\rangle$}}
% \begin{macro}{\b@fi}
% The macro |\b@fi| provides the beginning of the financial column. It
-% will be inserted in the column to capture the number entered by the user
+% will be inserted in the column to capture the number entered by the user.
% The separator and decimal mark are within a math environment, so you
% can indeed specify |\,| instead of |\thinspace|, but there is an extra
% brace around, so it doesn't affect the spacing between the digits
% (trick copied from |dcolumn|, Ref.~\cite{dcolumn}).
-%
-% The \meta{count}s |\FC@l| captures the part to the left of the decimal
-% marker, |\FC@r| that to the right.
% \begin{macrocode}
-\newcount\FC@l \newcount\FC@r
-\def\FC@chklist{}
-\def\setucc@de#1#2\relax{\uccode`\~=`#1 }
-\def\b@fi#1#2#3{%
+\def\b@fi#1#2#3#4{%
% \end{macrocode}
% An intermediate macro |\sep@xt| to extract the first character
% of |#1|, which in most cases will be the only character.
% \begin{macrocode}
\def\sep@xt##1##2\end{\def\sep@rator{{##1}}}%
\sep@xt#1\end\def\decim@lmark{{#2}}%
-\def\sp@l{#3}\global\advance\FCsc@l by \@ne
+\def\sp@l{#3}\assignform@t#4,,\end \global\advance\FCsc@l by \@ne
\global\FC@l=0 \global\FC@r=1
% \end{macrocode}
% The value specified by the user is then captured by |\FC@l| and
@@ -651,23 +808,23 @@ indention=0pt,labelsep=colon,justification=raggedright}
% There are four parts to an |F|-column entry, all parts optional,
% making 16 combinations. The sequence is
% (in the Backus--Naur notation of Ref.~\cite{CandTA}):
-% \<sign> \<integer constant> \<decimal marker>
+% \<sign> \<integer constant> \<decimal mark>
% \<integer constant>. Here \<sign> is a plus or minus character with
% category code~12, \<integer constant> is a sequence of zero
-% or more (decimal) \<digit>s, and \<decimal marker> is the middel
+% or more (decimal) \<digit>s, and \<decimal mark> is the middel
% part of |#3|, i.e., the comma in |3,2| or the period in |3.2|.
-% If the \<decimal marker> is absent with no space characters between
+% If the \<decimal mark> is absent with no space characters between
% the two \<integer constant> terms, these merge, making four redundant
-% entries. One of the
-% combinations is \<empty>, a sequence of exactly zero non-space tokens:
-% this is the only combination that doesn't put anything in an |F|-column.
+% entries. One of the combinations is \<empty>, a sequence of exactly
+% zero non-space tokens: this is the only combination that doesn't put
+% anything in an |F|-column---and was the most difficult part to handle.
%
% The minus sign must be captured separately, because in an entry like
% |-0,07| the 7~cents are negative, but this cannot be seen from the
-% integer part, since $-0$ is $0$ in \TeX\ (in fact in most computer
-% languages, but not in~MIX~\cite{TAOCP1}), so |\ifnum-0<0| yields false.
-% |\FCs@gn| is a general purpose flag. Its first use is to capture
-% the sign.
+% part to the left of the decimal mark, since $-0$ is~$0$ in \TeX\ (in
+% fact in most computer languages, but not in~MIX~\cite{TAOCP1}), so
+% |\ifnum-0<0| yields |false|. |\FCs@gn| is a general purpose flag. Its
+% first use is to capture the sign.
% \begin{macrocode}
\let\FCs@gn=\@ne\relax \setbox0\hbox\bgroup$%
% \end{macrocode}
@@ -726,7 +883,7 @@ indention=0pt,labelsep=colon,justification=raggedright}
\ifnum\count@=\mathcode`- \expandafter\global\FC@l=\the\FC@l
\else \expandafter\global\FC@r=\the\FC@r\fi}%
% \end{macrocode}
-% The signs are relatively simply: record the sign, restore |\mathcode|s if
+% The signs are relatively simple: record the sign, restore |\mathcode|s if
% needed (it should be: a minus sign between digits screws up everything),
% and start scanning the number.
% \begin{macrocode}
@@ -744,7 +901,7 @@ indention=0pt,labelsep=colon,justification=raggedright}
\mathcode`-="8000 \mathcode`+=\mathcode`- \mathcode`.=\mathcode`-
% \end{macrocode}
% These three remain active until the |$| in |\e@fi| is encountered.
-% The following ones will, in the general case, have their activeness
+% The following ones will, except in the \<empty> case, have their activeness
% turned off at some time.
% \begin{macrocode}
\def\actdecm@rk##1##2\relax{\ifx##1.\relax \mathcode`,=\mathcode`-
@@ -765,21 +922,24 @@ indention=0pt,labelsep=colon,justification=raggedright}
% globally to a negative value. This doesn't harm, because it didn't
% contain relevant information anyway. Outside the group, the sign
% of |\FC@r| can then be tested. This is a slight misuse of this
-% |\count|, but now it's documented.
-%
-% If there was no decimal sign or if there was a decimal sign but no
-% decimal part, |\FC@r| will still be~1, which doesn't parse well with
-% |\secd@xt|, so a zero is appended.
+% |\count|, but now it's documented. In effect, |\FC@r| can only be~|-1|,
+% |1|, or at least~|10|, so the comparison |\ifnum\FC@r>0| does not mis~0.
% \begin{macrocode}
\def\e@fi{\ifnum\mathcode`\0=\mathcode`- \global\FC@r=\m@ne\fi$\egroup
\ifnum\FC@r>0
- \ifnum\FC@r<10 \multiply\FC@r by 10 \fi
% \end{macrocode}
-% Next is a loop for bringing the decimal part in the correct way to the
+% If there was no decimal mark or if there was a decimal mark but no
+% decimal part, |\FC@r| will still be~1, which doesn't parse well with
+% |\secd@xt|, so a zero is appended, i.e., yielding~|10|.
+% \begin{macrocode}
+ \ifnum\FC@r<10 \FC@r=10 \fi
+% \end{macrocode}
+% Next is a loop for bringing the decimal part in the correct way to
% the integer part. The loop is performed the number of decimal
% digits to be printed (the~2 in |3,2| of the default setting). This also
-% means that if you specified more decimal digits than this, the excess
-% digit(s) will not be handled and a |\PackageWarning| will be given.
+% means that if you provided more decimal digits than this, the excess
+% digit(s) will not be handled and a |\PackageWarning| will be given,
+% showing these excess digits. This is truncation, not rounding!
% \begin{macrocode}
\def\i@ts##1##2{\count0=##2}
\afterassignment\i@ts\count@\sp@l
@@ -896,22 +1056,23 @@ indention=0pt,labelsep=colon,justification=raggedright}
\let\@@array=\@array
% \end{macrocode}
% \end{macro}
+% Much of the techniques here are repeated in |\LT@array|.
% \subsection{The sumline, close to a postamble}
% \begin{macro}{\@mksumline}
% The construction of the sumline is much easier than that of the preamble
% for several reasons. It may be safely assumed that the preamble specifier
% is grammatically correct because it has already been screened by |\@mkpream|.
-% Furthermore most entries will simply add nothing to |\s@ml@ne|, e.g., |@|, |!|,
+% Furthermore, most entries will simply add nothing to |\s@ml@ne|, e.g., |@|, |!|,
% and \verb+|+ can be fully ignored. Ampersands are only inserted by |c|, |l|, |r|,
% |p|, |m|, and |b|. So a specifier like |@{}lflf@{}| will yield the sumline
% |&\a&&\a\\|, (where |\a| is a macro that prints the desired result of the column,
-% see later). Had the specifier been \verb+l|f||@{ }l|f+, then the same sumline must
+% see below). Had the specifier been \verb+l|f||@{ }l|f+, then the same sumline must
% be constructed: all difficulties are already picked up and solved in the creation
% of the preamble.
%
% In reality the sumline must be constructed from the expanded form of the
% specifier, so |@{}lf@{}| will expand as
-% |@{}l>{\b@fi{.}{,}{3,2}}r<{\e@fi}@{}|. The rules for constructing the
+% |@{}l>{\b@fi{.}{,}{3,2}{}}r<{\e@fi}@{}|. The rules for constructing the
% sumline are now very simple:
% \begin{compactitem}[$\bullet$]
% \item add an ampersand when |c|, |l|, |r|, |p|, |m|, or |b| is found,
@@ -925,7 +1086,7 @@ indention=0pt,labelsep=colon,justification=raggedright}
% be written, but that is not necessary: |\@testpach| can do all the work,
% although much of it will be discarded. Here speed is sacrificed for space
% and this can be afforded because the creation of the sumline is done only
-% once per |\tabular|.
+% once per |\tabular| or |\longtable|.
%
% The start is copied from |\@mkpream|.
% \begin{macrocode}
@@ -939,12 +1100,9 @@ indention=0pt,labelsep=colon,justification=raggedright}
% \end{macrocode}
% Then |\@mkpream| is picked up again.
% \begin{macrocode}
-\@temptokena{#1}
-\@tempswatrue
+\@temptokena{#1}\@tempswatrue
\@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}%
-\count0\m@ne
-\let\the@toks\relax
-\prepnext@tok
+\count0\m@ne\let\the@toks\relax\prepnext@tok
% \end{macrocode}
% Next is the loop over all tokens in the expanded form of the specifier. The change
% with respect to |\@mkpream| is that the body of the loop is now only dealing
@@ -955,10 +1113,8 @@ indention=0pt,labelsep=colon,justification=raggedright}
\expandafter \@tfor \expandafter \@nextchar
\expandafter :\expandafter =\the\@temptokena \do
{\@testpach
- \ifcase \@chclass \@classfz
- \or \or \@classfii \or
- \or \or \or \or \or \or \or \@classfx \fi
- \@lastchclass\@chclass}%
+ \ifcase \@chclass \@classfz \or \or \@classfii \or \or \or \or \or
+ \or \or \or \@classfx \fi\@lastchclass\@chclass}%
% \end{macrocode}
% And the macro is finished by applying the |\aut@check| and appending the
% |\\| to the sumline. Note that the |\aut@check| is performed {\itshape
@@ -1006,7 +1162,8 @@ indention=0pt,labelsep=colon,justification=raggedright}
\edef\t@stn{\string\e@fi}
\ifx\t@stm\t@stn
% \end{macrocode}
-% If both tests yield |true| then add the macro to typeset everything.
+% If both tests yield |true|, i.e., we encountered a |<{\e@fi}| where we expect one to
+% find, then add the macro to typeset everything.
% \begin{macrocode}
\@addtosumline{\prr@sult}
% \end{macrocode}
@@ -1074,12 +1231,14 @@ indention=0pt,labelsep=colon,justification=raggedright}
\def\sumline{\@ifnextchar[\s@mline{\s@mline[2pt]}}
\def\s@mline[#1]{\global\s@mlinesep=#1 \s@ml@ne}
% \end{macrocode}
+% In the introduction it was stated that |\sumline| has two options, but in
+% reality that second option is the option to |\\| that is issued by |\s@ml@ne|.
% \end{macro}
% \begin{macro}{\prr@sult}
% The macro |\prr@sult| actually puts the information together. It starts
% like |\leeg|.
% \begin{macrocode}
-\def\prr@sult{$\egroup \let\e@fi=\relax
+\def\prr@sult{$\egroup \let\e@fi=\relax \let\FCform@t=\FCform@tt
% \end{macrocode}
% Then the information for the last line is computed. It is not sufficient
% to calculate the width of the result (in points) to use that as the width
@@ -1126,7 +1285,7 @@ FCtot@\romannumeral\FCsc@l\endcsname}$}%
% table but it doesn't increase the totals of that column by~3 (assuming
% |3,2| coding for the separations). But you won't cheat, won't you?
% It may affect the width, so be careful: don't insert the unabridged
-% version of Romeo and Julia here.
+% version of Romeo and Juliet~\cite{RJ} here.
% \end{macro}
% \begin{macro}{\res@tsumline}
% Since all changes to the totals and widths of the columns are global,
@@ -1168,6 +1327,7 @@ FCtot@\romannumeral\FCsc@l\endcsname}$}%
% If the list |\FC@chklist| is empty, the list for the automatic check is
% generated (which will remain empty if |\FCsc@l| is odd).
% \begin{macrocode}
+\def\FC@chklist{}
\def\aut@check{\ifx\@empty\FC@chklist\relax
\ifodd\FCsc@l\else
\count0=\@ne \count1=\FCsc@l
@@ -1217,12 +1377,84 @@ FCtot@\romannumeral\FCsc@l\endcsname}$}%
\def\checkfcolumns#1#2{\noalign{\xdef\FC@chklist{\FC@chklist #1,#2;}}}
% \end{macrocode}
% \end{macro}
+% \subsection{Support for package longtable}
+% Package |longtable| is used for tables that may span multiple pages. |fcolumn| and
+% |longtable| work together as long as |longtable| is loaded first, so that |fcolumn|
+% can adapt one definition of |longtable|. If |longtable| is not loaded, that definition
+% is just that: a definition. If |longtable| is loaded before |fcolumn|, it is a
+% redefinition, and it should be. For that reason the user is warned (not loading
+% |longtable| is not an error if you don't use it) if |fcolumn| is loaded without prior
+% loading of |longtable|.
+% \begin{macrocode}
+\ifx\longtable\@undefined
+ \PackageWarning{fcolumn}{fcolumn is loaded without longtable. That's
+ OK, but\MessageBreak if you want to load longtable as well, make sure
+ \MessageBreak it is done before loading fcolumn}
+\fi
+% \end{macrocode}
+% \begin{macro}{\LT@array}
+% And here is the only definition of |longtable| that needs to be adapted a bit, to make
+% |fcolumn| work with that package.
+% \begin{macrocode}
+\def\LT@array[#1]#2{%
+ \refstepcounter{table}\stepcounter{LT@tables}%
+ \if l#1 \LTleft\z@\LTright\fill
+ \else\if r#1 \LTleft\fill\LTright\z@
+ \else\if c#1 \LTleft\fill\LTright\fill
+ \fi\fi\fi
+ \let\LT@mcol\multicolumn\let\LT@@tabarray\@tabarray\let\LT@@hl\hline
+ \def\@tabarray{\let\hline\LT@@hl \LT@@tabarray}%
+ \let\\\LT@tabularcr\let\tabularnewline\\%
+ \def\newpage{\noalign{\break}}%
+ \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}%
+ \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}%
+ \let\hline\LT@hline\let\kill\LT@kill\let\caption\LT@caption
+ \@tempdima\ht\strutbox\let\@endpbox\LT@endpbox
+ \ifx\extrarowheight\@undefined
+ \let\@acol\@tabacol\let\@classz\@tabclassz\let\@classiv\@tabclassiv
+ \def\@startpbox{\vtop\LT@startpbox}\let\@@startpbox
+ \@startpbox\let\@@endpbox\@endpbox\let\LT@LL@FM@cr\@tabularcr
+ \else
+ \advance\@tempdima\extrarowheight \col@sep\tabcolsep
+ \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr
+ \fi
+ \setbox\@arstrutbox\hbox{\vrule\@height\arraystretch\@tempdima
+ \@depth\arraystretch\dp\strutbox\@width\z@}%
+ \let\@sharp##\let\protect\relax
+ \begingroup
+ \@mkpream{#2}%
+ \xdef\LT@bchunk{%
+ \global\advance\c@LT@chunks\@ne\global\LT@rows\z@
+ \setbox\z@\vbox\bgroup\LT@setprevdepth\tabskip\LTleft
+ \noexpand\halign to\hsize\bgroup\tabskip\z@\@arstrut
+ \@preamble\tabskip\LTright\cr}%
+ \endgroup
+% \end{macrocode}
+% Until this line it was just the code for |\LT@array| from package |longtable|.
+% The five lines of the next chunk are new to |\LT@array|. Their
+% purpose is the same as in |\@array| above.
+% \begin{macrocode}
+ \begingroup
+ \@mksumline{#2}%
+ \endgroup
+ \res@tsumline
+ \everycr{\noalign{\global\FCsc@l=0 }}%
+% \end{macrocode}
+% From here on |\LT@array| is picked up again.
+% \begin{macrocode}
+ \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols
+ \LT@make@row\m@th\let\par\@empty
+ \lineskip\z@\baselineskip\z@\LT@bchunk}
+% \end{macrocode}
+% \end{macro}
% That's it!
% \section*{Acknowledgement}
% Thanks to Karl Berry for valuable comments regarding the consistency of
% the installation procedure of this version. Frank Mittelbach gave
% various useful suggestions for improving the input parsing as well as
-% hints to make the package more \LaTeX-like.
+% hints to make the package more \LaTeX-like. He also challenged me to make |fcolumn|
+% compatible with |longtable|. Christian Hoff's request on column formatting triggered
+% many happy hours of coding.
% \bibliographystyle{plain}
% \begin{thebibliography}{9}
% \itemsep0pt
@@ -1232,10 +1464,12 @@ FCtot@\romannumeral\FCsc@l\endcsname}$}%
% A new implementation of \LaTeX's |tabular| and |array| environment.
% \bibitem{booktabs} Simon Fear. Publication quality tables in \LaTeX.
% \bibitem{dcolumn} David Carlisle. The |dcolumn| package.
+% \bibitem{longtable} David Carlisle. The |longtable| package.
% \bibitem{world_economy} According to the IMF \url{www.imf.org}.
% \bibitem{CandTB} Donald Knuth, Computers \& Typesetting/B, \TeX: the program.
% \bibitem{CandTA} Donald Knuth, Computers \& Typesetting/A, The \TeX book.
% \bibitem{TAOCP1} Donald Knuth, The Art of Computers Programming, volume~1.
+% \bibitem{RJ} William Shakespeare, Romeo and Juliet, a tragedy (1597).
% \end{thebibliography}
% \Finale
\endinput
diff --git a/Master/texmf-dist/source/latex/fcolumn/fcolumn.ins b/Master/texmf-dist/source/latex/fcolumn/fcolumn.ins
index fcfed706ee0..5c2e3e7d481 100644
--- a/Master/texmf-dist/source/latex/fcolumn/fcolumn.ins
+++ b/Master/texmf-dist/source/latex/fcolumn/fcolumn.ins
@@ -17,7 +17,7 @@
This is a generated file.
-Copyright (C) 2015--2019 by Edgar Olthof
+Copyright (C) 2015--2021 by Edgar Olthof
This file may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -42,9 +42,9 @@ LaTeX version 1999/12/01 or later.
\Msg{* fcolumn.sty *}
\Msg{* *}
\Msg{* into a directory searched by TeX. *}
-\Msg{* To produce the documentation, run the file *}
-\Msg{* fcolumn.dtx through LaTeX. Make sure to update *}
-\Msg{* the glossary and index by makeindex: *}
+\Msg{* To produce the documentation, type ``make'' or *}
+\Msg{* run the file fcolumn.dtx through LaTeX. Make sure *}
+\Msg{* to update the glossary and index by makeindex: *}
\Msg{* *}
\Msg{* makeindex -s gglo.ist -o fcolumn.gls fcolumn.glo *}
\Msg{* makeindex -s gglo.ist -o fcolumn.ind fcolumn.idx *}
diff --git a/Master/texmf-dist/source/latex/fduthesis/fduthesis-doc.dtx b/Master/texmf-dist/source/latex/fduthesis/fduthesis-doc.dtx
index 6952003bcaa..9bc77b78216 100644
--- a/Master/texmf-dist/source/latex/fduthesis/fduthesis-doc.dtx
+++ b/Master/texmf-dist/source/latex/fduthesis/fduthesis-doc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2017--2019 by Xiangdong Zeng <xdzeng96@gmail.com>
+% Copyright (C) 2017--2020 by Xiangdong Zeng <xdzeng96@gmail.com>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -350,7 +350,7 @@
%
% \changes{v0.4}{2017/08/09}{[\pkg{fdudoc}] 修复 \cls{ctxdoc}
% 文档类 v2.4.10 之前版本中行距偏小的问题,见 ctex-kit
-% \href{https://github.com/CTeX-org/ctex-kit/issues/303}{\#~303}。}
+% \href{https://github.com/CTeX-org/ctex-kit/issues/303}{\#303}。}
%
% \begin{macro}{\@@_swap_cr:,\@@_swap_cr_aux:w}
% 把 \cs{l_@@_macro_code_line_tl} 中的回车符 |^^M| 挪到外面。
@@ -1722,12 +1722,12 @@
% 西文字体。为兼容 macOS,系统字体需使用字体名,而 \TeXLive{}
% 中的字体需使用文件名。
% \begin{macrocode}
-\setmainfont{libertinusserif}[%
+\setmainfont{LibertinusSerif}[%
Extension = .otf,
- UprightFont = *-regular,
- BoldFont = *-bold,
- ItalicFont = *-italic,
- BoldItalicFont = *-bolditalic,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+ ItalicFont = *-Italic,
+ BoldItalicFont = *-BoldItalic,
Scale = 1.1]
\setsansfont{IBMPlexSansCondensed}[%
Extension = .otf,
@@ -1739,7 +1739,7 @@
UprightFont = * Light,
BoldFont = * Semibold,
Scale = MatchLowercase]
-\setmathfont{libertinusmath-regular.otf}
+\setmathfont{LibertinusMath-Regular.otf}
% \end{macrocode}
%
% 中文字体。
diff --git a/Master/texmf-dist/source/latex/fduthesis/fduthesis-logo.dtx b/Master/texmf-dist/source/latex/fduthesis/fduthesis-logo.dtx
index 46edb6afca2..fc8735f1a2a 100644
--- a/Master/texmf-dist/source/latex/fduthesis/fduthesis-logo.dtx
+++ b/Master/texmf-dist/source/latex/fduthesis/fduthesis-logo.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2017--2019 by Xiangdong Zeng <xdzeng96@gmail.com>
+% Copyright (C) 2017--2020 by Xiangdong Zeng <xdzeng96@gmail.com>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
diff --git a/Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx b/Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx
index cd50a39ec62..6f536377da4 100644
--- a/Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx
+++ b/Master/texmf-dist/source/latex/fduthesis/fduthesis.dtx
@@ -2,7 +2,7 @@
% !TeX program = XeLaTeX
% !TeX encoding = UTF-8
%
-% Copyright (C) 2017--2019 by Xiangdong Zeng <xdzeng96@gmail.com>
+% Copyright (C) 2017--2020 by Xiangdong Zeng <xdzeng96@gmail.com>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -47,7 +47,7 @@
The `fduthesis` Class
=====================
-*LaTeX thesis template for Fudan University, v0.7d*
+*LaTeX thesis template for Fudan University, v0.7e*
Overview
--------
@@ -124,7 +124,7 @@ version.
-----
-Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
+Copyright (C) 2017&ndash;2020 by Xiangdong Zeng <xdzeng96@gmail.com>.
%</readme>
%
%<*internal>
@@ -142,7 +142,7 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
\preamble
- Copyright (C) 2017--2019 by Xiangdong Zeng <xdzeng96@gmail.com>
+ Copyright (C) 2017--2020 by Xiangdong Zeng <xdzeng96@gmail.com>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -236,7 +236,7 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
%<class|class-en|doc|logo>\NeedsTeXFormat{LaTeX2e}
%<class|class-en|doc|logo>\RequirePackage{expl3}
%<*!(driver|install|ex-logo|cover)>
-%<!readme>\GetIdInfo $Id: fduthesis.dtx 0.7d 2019-04-03 12:00:00Z Xiangdong Zeng <xdzeng96@gmail.com> $
+%<!readme>\GetIdInfo $Id: fduthesis.dtx 0.7e 2020-08-30 12:00:00Z Xiangdong Zeng <xdzeng96@gmail.com> $
%<class> {Thesis template for Fudan University}
%<class>\ProvidesExplClass{\ExplFileName}
%<class-en> {Thesis template for Fudan University (English version)}
@@ -252,7 +252,7 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
%<*driver>
% \PassOptionsToPackage{showframe}{geometry}
\documentclass{fdudoc}
-\usepackage{multirow,xpinyin}
+\usepackage{multirow,xeCJKfntef,xpinyin}
\hypersetup{
pdftitle = {fduthesis: 复旦大学论文模板},
pdfauthor = {曾祥东}}
@@ -261,8 +261,6 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
\def\FSFW{“{\xeCJKsetup{PunctStyle=banjiao}.}”} % U+FF0E
\def\COFW{“{\xeCJKsetup{PunctStyle=banjiao}:}”} % U+FF1A
\def\SCFW{“{\xeCJKsetup{PunctStyle=banjiao};}”} % U+FF1B
-% Libertinus Math 字体不包含 `\QED`,暂时使用 `\blacksquare` 代替
-\AtBeginDocument{\def\QED{\blacksquare}}
%^^A! \PassOptionsToPackage{scheme=plain, linespread=1.1}{ctex}
%^^A! \documentclass{fdudoc}
%^^A! \hypersetup{
@@ -274,19 +272,18 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
%^^A! \pagestyle{headings}
%^^A! \def\FSID{{\xeCJKsetup{PunctStyle=banjiao}。}}
%^^A! \def\FSFW{{\xeCJKsetup{PunctStyle=banjiao}.}}
-%^^A! \AtBeginDocument{\def\QED{\blacksquare}}
%^^A!
\title{\textcolor{MaterialIndigo800}{%
- \textbf{fduthesis: 复旦大学论文\xpinyin[font=\sffamily]{模}{mu2}板}}}
+ \textbf{fduthesis: 复旦大学论文\xpinyin[font=\sffamily,format=\color{MaterialIndigo800}]{模}{mu2}板}}}
\author{曾祥东}
-\date{2019/04/03\quad v0.7d%
+\date{2020/08/30\quad v0.7e%
\thanks{\url{https://github.com/stone-zeng/fduthesis}.}}
%^^A! \title{\textcolor{MaterialIndigo800}{%
%^^A! \textbf{The \textsf{fduthesis} Class \\
%^^A! \LaTeX{} Thesis Template for Fudan University}}}
%^^A! \author{Xiangdong Zeng}
-%^^A! \date{2019/04/03\quad v0.7d%
+%^^A! \date{2020/08/30\quad v0.7e%
%^^A! \thanks{\url{https://github.com/stone-zeng/fduthesis}.}}
%^^A!
@@ -1844,12 +1841,17 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
%^^A! main matter.
%^^A!
%
-% \begin{function}{\tableofcontents}
-% 生成目录。为了生成完整、正确的目录,您至少需要编译\emph{两次}。
+% \begin{function}{\tableofcontents,\listoffigures,\listoftables}
+% 生成目录。为了生成完整、正确的目录,您至少需要编译\emph{两次}。对于图表
+% 较多的论文,也可以使用 \cs{listoffigures} 和 \cs{listoftables} 生成单独的
+% 插图、表格目录。
% \end{function}
%^^A! \begin{function}{\tableofcontents}
%^^A! Generate the table of contents (TOC). You need to compile
%^^A! the source file at least \emph{twice} to get the correct TOC.
+%^^A! If your thesis contains many figures or tables, you may also
+%^^A! use \cs{listoffigures} or \cs{listoftables} to generate a list
+%^^A! of them.
%^^A! \end{function}
%^^A!
%
@@ -2384,14 +2386,14 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \bibitem{clreq}
% W3C.
% \newblock \textit{中文排版需求(Requirements for Chinese Text Layout)} [EB/OL].
-% \newblock (2019-03-13)
+% \newblock (2020-08-17)
% \urlprefix\url{https://w3c.github.io/clreq/}
%
% \bibitem{复旦大学论文规范}
% 复旦大学图书馆, 复旦大学研究生院.
% \newblock \textit{复旦大学博士、硕士学位论文规范} [EB/OL].
% \newblock 2017 年 3 月修订版.
-% \newblock (2017-03-27)
+% \newblock (2017-03-27)
% \urlprefix\url{http://www.gs.fudan.edu.cn/_upload/article/4c/a8/a82545ef443b9c057c14ba13782c/c883c6f3-6d7f-410c-8f30-d8bde6fcb990.doc}
%
% \subsection{宏包、模版}
@@ -2399,23 +2401,23 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \bibitem{source2e}
% \textsc{Braams J}, \textsc{Carlisle D}, \textsc{Jeffrey A}, et al.
% \newblock \textit{The \LaTeXe{} Sources} [CP/OL].
-% \newblock (2018-12-01)
+% \newblock (2020-02-02)
% \urlprefix\url{https://ctan.org/pkg/latex}
% \urlprefix\CTANurl[源代码:]{macros/latex/base/source2e.pdf}
%
% \bibitem{CTeX}
% \textsc{CTEX.ORG}.
% \newblock \textit{\CTeX{} 宏集手册} [EB/OL].
-% \newblock version 2.4.14,
-% \newblock (2018-05-02)
+% \newblock version 2.5.4,
+% \newblock (2020-08-23)
% \urlprefix\url{https://ctan.org/pkg/ctex}
% \urlprefix\CTANurl[文档及源代码:]{language/chinese/ctex/ctex.pdf}
%
% \bibitem{xeCJK}
% \textsc{CTEX.ORG}.
% \newblock \textit{\pkg{xeCJK} 宏包} [EB/OL].
-% \newblock version 3.7.1,
-% \newblock (2018-04-30)
+% \newblock version 3.8.5,
+% \newblock (2020-08-23)
% \urlprefix\url{https://ctan.org/pkg/xecjk}
% \urlprefix\CTANurl[文档及源代码:]{macros/xetex/latex/xecjk/xeCJK.pdf}
%
@@ -2423,22 +2425,22 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \textsc{Daly P W}.
% \newblock \textit{Natural Sciences Citations and References} [EB/OL].
% \newblock version 8.31b,
-% \newblock (2010-09-13)
+% \newblock (2010-09-13)
% \urlprefix\url{https://ctan.org/pkg/natbib}
% \urlprefix\CTANurl[文档及源代码:]{macros/latex/contrib/natbib/natbib.pdf}
%
% \bibitem{source3}
% \textsc{The \LaTeX3 Project}.
% \newblock \textit{The \LaTeX3 Sources} [CP/OL].
-% \newblock (2019-03-05)
+% \newblock (2020-08-07)
% \urlprefix\url{https://ctan.org/pkg/l3kernel}
% \urlprefix\CTANurl[源代码:]{macros/latex/contrib/l3kernel/source3.pdf}
%
% \bibitem{biblatex}
% \textsc{Lehman P}, \textsc{Kime P}, \textsc{Boruvka A}, et al.
% \newblock \textit{The \pkg{biblatex} Package} [EB/OL].
-% \newblock version 3.12,
-% \newblock (2018-10-18)
+% \newblock version 3.15a,
+% \newblock (2020-08-23)
% \urlprefix\url{https://ctan.org/pkg/biblatex}
% \urlprefix\CTANurl[文档:]{macros/latex/contrib/biblatex/doc/biblatex.pdf}
%
@@ -2446,48 +2448,48 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \textsc{Oetiker T}, \textsc{Partl H}, \textsc{Hyna I}, et al.
% \newblock \textit{The Not So Short Introduction to \LaTeXe{}: Or \LaTeXe{} in 139 minutes} [EB/OL].
% \newblock version 6.2,
-% \newblock (2018-02-28)
+% \newblock (2018-02-28)
% \urlprefix\url{https://ctan.org/pkg/lshort-english}
% \urlprefix\CTANurl[文档:]{info/lshort/english/lshort.pdf}
%
% \bibitem{lshort-zh-cn}
% \textsc{Oetiker T}, \textsc{Partl H}, \textsc{Hyna I}, et al.
-% \newblock \textit{一份不太简短的 \LaTeXe{} 介绍: 或 106 分钟了解 \LaTeXe{}} [EB/OL].
+% \newblock \textit{一份(不太)简短的 \LaTeXe{} 介绍: 或 112 分钟了解 \LaTeXe{}} [EB/OL].
% \newblock \CTeX{} 开发小组, 译.
-% \newblock 原版版本 version 6.2, 中文版本 version 6.0,
-% \newblock (2018-09-01)
+% \newblock 原版版本 version 6.2, 中文版本 version 6.02,
+% \newblock (2020-08-03)
% \urlprefix\url{https://ctan.org/pkg/lshort-zh-cn}
% \urlprefix\CTANurl[文档:]{info/lshort/chinese/lshort-zh-cn.pdf}
%
% \bibitem{biblatex-gb7714-2015}
% 胡振震.
% \newblock \textit{符合 GB/T 7714-2015 标准的 biblatex 参考文献样式} [EB/OL].
-% \newblock version 1.0q,
-% \newblock (2019-02-11)
+% \newblock version 1.0v,
+% \newblock (2020-07-21)
% \urlprefix\url{https://ctan.org/pkg/biblatex-gb7714-2015}
% \urlprefix\CTANurl[文档:]{biblatex-contrib/biblatex-gb7714-2015/biblatex-gb7714-2015.pdf}
%
% \bibitem{gbt7714}
% 李泽平(\textsc{Zeping L}).
% \newblock \textit{GB/T 7714-2015 \BibTeX{} Style} [EB/OL].
-% \newblock version 1.0.9,
-% \newblock (2018-08-05)
+% \newblock version 2.0.2,
+% \newblock (2020-06-08)
% \urlprefix\url{https://ctan.org/pkg/gbt7714}
% \urlprefix\CTANurl[文档:]{biblio/bibtex/contrib/gbt7714/gbt7714.pdf}
%
% \bibitem{cquthesis}
% 李振楠.
% \newblock \textit{\textsc{CquThesis}:重庆大学毕业论文 \LaTeX{} 模板} [EB/OL].
-% \newblock version 1.30,
-% \newblock (2018-02-23)
+% \newblock version 1.50,
+% \newblock (2020-06-23)
% \urlprefix\url{https://ctan.org/pkg/cquthesis}
% \urlprefix\CTANurl[文档及源代码:]{macros/latex/contrib/cquthesis/cquthesis.pdf}
%
% \bibitem{thuthesis}
-% 薛瑞尼.
+% 清华大学 TUNA 协会.
% \newblock \textit{\textsc{ThuThesis}:清华大学学位论文模板} [EB/OL].
-% \newblock version 5.4.5,
-% \newblock (2018-05-17)
+% \newblock version 6.1.3,
+% \newblock (2020-07-09)
% \urlprefix\url{https://ctan.org/pkg/thuthesis}
% \urlprefix\CTANurl[文档及源代码:]{macros/latex/contrib/thuthesis/thuthesis.pdf}
%
@@ -2495,22 +2497,23 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
%
% \bibitem{sjtuthesis}
% \textsc{SJTUG}.
-% \newblock \textit{上海交通大学 \XeLaTeX{} 学位论文及课程论文模板} [EB/OL].
-% \newblock version 0.10.2,
-% \newblock (2018-11-05)
+% \newblock \textit{上海交通大学学位论文模板} [EB/OL].
+% \newblock version 1.0.0rc7,
+% \newblock (2020-07-31)
% \urlprefix\url{https://github.com/sjtug/SJTUThesis}
+% \urlprefix\url[源代码仓库:]{https://github.com/sjtug/SJTUTeX}
%
% \bibitem{ustcthesis}
% \textsc{USTC \TeX{} User Group}.
% \newblock \textit{中国科学技术大学学位论文 \LaTeX{} 模板} [EB/OL].
-% \newblock version 3.1.03,
-% \newblock (2019-01-01)
+% \newblock version 3.2.1,
+% \newblock (2020-04-03)
% \urlprefix\url{https://github.com/ustctug/ustcthesis}
%
% \bibitem{ucasthesis}
% \textsc{mohuangrui}.
% \newblock \textit{\pkg{ucasthesis} 国科大学位论文 \LaTeX{} 模板} [EB/OL].
-% \newblock (2019-03-14)
+% \newblock (2020-07-28)
% \urlprefix\url{https://github.com/mohuangrui/ucasthesis}
%
% \emph{以下模版现已停止更新。}
@@ -2518,13 +2521,13 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \bibitem{pandoxie2014fduthesislatex}
% \textsc{Pandoxie}.
% \newblock \textit{Fudan University-Latex Template} [EB/OL].
-% \newblock (2014-06-07)
+% \newblock (2014-06-07)
% \urlprefix\url{https://github.com/Pandoxie/FDU-Thesis-Latex}
%
% \bibitem{richard2016fudanthesis}
% \textsc{richard}.
% \newblock \textit{复旦大学硕士学位论文模板} [EB/OL].
-% \newblock (2016-01-31)
+% \newblock (2016-01-31)
% \urlprefix\url{https://github.com/richarddzh/fudan-thesis}
%
% \bibitem{数院毕业论文格式}
@@ -2542,7 +2545,7 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \bibitem{wright2009dtxfile}
% \textsc{Wright J}.
% \newblock \textit{A model dtx file} [EB/OL].
-% \newblock (2009-10-06)
+% \newblock (2009-10-06)
% \urlprefix\url{https://www.texdev.net/2009/10/06/a-model-dtx-file/}
%
% \bibitem{孔雀计划}
@@ -2829,7 +2832,7 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \begin{macrocode}
type .choice:,
type .value_required:n = true,
- type .choices:nn =
+ type .choices:nn =
{ doctor, master, bachelor }
{ \int_set_eq:NN \g_@@_thesis_type_int \l_keys_choice_int },
type .initial:n = bachelor,
@@ -3032,11 +3035,11 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
%
% \changes{v0.7c}{2019/03/05}{重构字体配置,并兼容 macOS。}
%
-% \begin{variable}{\g_@@_font_set_tl, \g_@@_cjk_font_set_tl}
+% \begin{variable}{\g_@@_fontset_tl, \g_@@_cjk_fontset_tl}
% 存放字体选项值。
% \begin{macrocode}
-\tl_new:N \g_@@_font_set_tl
-%<class>\tl_new:N \g_@@_cjk_font_set_tl
+\tl_new:N \g_@@_fontset_tl
+%<class>\tl_new:N \g_@@_cjk_fontset_tl
% \end{macrocode}
% \end{variable}
%
@@ -3048,7 +3051,7 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
{
font .choices:nn =
{ garamond, libertinus, lm, palatino, times, times*, none }
- { \tl_set_eq:NN \g_@@_font_set_tl \l_keys_choice_tl }
+ { \tl_set_eq:NN \g_@@_fontset_tl \l_keys_choice_tl }
}
% \end{macrocode}
% \end{macro}
@@ -3062,7 +3065,7 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
{
cjk-font .choices:nn =
{ adobe, fandol, founder, mac, sinotype, sourcehan, windows, none }
- { \tl_set_eq:NN \g_@@_cjk_font_set_tl \l_keys_choice_tl }
+ { \tl_set_eq:NN \g_@@_cjk_fontset_tl \l_keys_choice_tl }
}
% \end{macrocode}
%</class>
@@ -3180,6 +3183,97 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \end{macrocode}
% \end{macro}
%
+% \changes{v0.7e}{2019/04/10}{兼容 Libertinus 和 XITS 字体的文件名变动。}
+% \begin{macro}{
+% \g_@@_font_family_libertinus_serif_tl,
+% \g_@@_font_family_libertinus_sans_tl,
+% \g_@@_font_style_libertinus_rm_tl,
+% \g_@@_font_style_libertinus_bf_tl,
+% \g_@@_font_style_libertinus_it_tl,
+% \g_@@_font_style_libertinus_bfit_tl,
+% \g_@@_font_style_libertinus_bfsl_tl,
+% \g_@@_font_family_xits_tl,
+% \g_@@_font_style_xits_rm_tl,
+% \g_@@_font_style_xits_bf_tl,
+% \g_@@_font_style_xits_it_tl,
+% \g_@@_font_style_xits_bfit_tl,
+% \g_@@_font_name_libertinus_serif_tl,
+% \g_@@_font_name_libertinus_sans_tl,
+% \g_@@_font_name_libertinus_math_tl,
+% \g_@@_font_name_xits_tl,
+% \g_@@_font_name_xits_math_rm_tl,
+% \g_@@_font_name_xits_math_bf_tl}
+% Libertinus 和 XITS 字体的文件名做过变动,需要特殊处理。
+% \begin{macrocode}
+\tl_new:N \g_@@_font_family_libertinus_serif_tl
+\tl_new:N \g_@@_font_family_libertinus_sans_tl
+\tl_new:N \g_@@_font_style_libertinus_rm_tl
+\tl_new:N \g_@@_font_style_libertinus_bf_tl
+\tl_new:N \g_@@_font_style_libertinus_it_tl
+\tl_new:N \g_@@_font_style_libertinus_bfit_tl
+\tl_new:N \g_@@_font_style_libertinus_bfsl_tl
+\tl_new:N \g_@@_font_family_xits_tl
+\tl_new:N \g_@@_font_style_xits_rm_tl
+\tl_new:N \g_@@_font_style_xits_bf_tl
+\tl_new:N \g_@@_font_style_xits_it_tl
+\tl_new:N \g_@@_font_style_xits_bfit_tl
+\tl_new:N \g_@@_font_name_libertinus_serif_tl
+\tl_new:N \g_@@_font_name_libertinus_sans_tl
+\tl_new:N \g_@@_font_name_libertinus_math_tl
+\tl_new:N \g_@@_font_name_xits_tl
+\tl_new:N \g_@@_font_name_xits_math_rm_tl
+\tl_new:N \g_@@_font_name_xits_math_bf_tl
+\fontspec_font_if_exist:nTF { LibertinusSerif-Regular.otf }
+ {
+ \tl_set:Nn \g_@@_font_family_libertinus_serif_tl { LibertinusSerif }
+ \tl_set:Nn \g_@@_font_family_libertinus_sans_tl { LibertinusSans }
+ \tl_set:Nn \g_@@_font_family_libertinus_math_tl { LibertinusMath }
+ \tl_set:Nn \g_@@_font_style_libertinus_rm_tl { Regular }
+ \tl_set:Nn \g_@@_font_style_libertinus_bf_tl { Bold }
+ \tl_set:Nn \g_@@_font_style_libertinus_it_tl { Italic }
+ \tl_set:Nn \g_@@_font_style_libertinus_bfit_tl { BoldItalic }
+ \tl_set:Nn \g_@@_font_style_libertinus_bfsl_tl { BoldOblique }
+ }
+ {
+ \tl_set:Nn \g_@@_font_family_libertinus_serif_tl { libertinusserif }
+ \tl_set:Nn \g_@@_font_family_libertinus_sans_tl { libertinussans }
+ \tl_set:Nn \g_@@_font_family_libertinus_math_tl { libertinusmath }
+ \tl_set:Nn \g_@@_font_style_libertinus_rm_tl { regular }
+ \tl_set:Nn \g_@@_font_style_libertinus_bf_tl { bold }
+ \tl_set:Nn \g_@@_font_style_libertinus_it_tl { italic }
+ \tl_set:Nn \g_@@_font_style_libertinus_bfit_tl { bolditalic }
+ \tl_set:Nn \g_@@_font_style_libertinus_bfsl_tl { bolditalic }
+ }
+\fontspec_font_if_exist:nTF { XITS-Regular.otf }
+ {
+ \tl_set:Nn \g_@@_font_family_xits_tl { XITS }
+ \tl_set:Nn \g_@@_font_style_xits_rm_tl { Regular }
+ \tl_set:Nn \g_@@_font_style_xits_bf_tl { Bold }
+ \tl_set:Nn \g_@@_font_style_xits_it_tl { Italic }
+ \tl_set:Nn \g_@@_font_style_xits_bfit_tl { BoldItalic }
+ \tl_set:Nn \g_@@_font_name_xits_math_rm_tl { XITSMath-Regular }
+ \tl_set:Nn \g_@@_font_name_xits_math_bf_tl { XITSMath-Bold }
+ }
+ {
+ \tl_set:Nn \g_@@_font_family_xits_tl { xits }
+ \tl_set:Nn \g_@@_font_style_xits_rm_tl { regular }
+ \tl_set:Nn \g_@@_font_style_xits_bf_tl { bold }
+ \tl_set:Nn \g_@@_font_style_xits_it_tl { italic }
+ \tl_set:Nn \g_@@_font_style_xits_bfit_tl { bolditalic }
+ \tl_set:Nn \g_@@_font_name_xits_math_rm_tl { xits-math }
+ \tl_set:Nn \g_@@_font_name_xits_math_bf_tl { xits-mathbold }
+ }
+\tl_set:Nx \g_@@_font_name_libertinus_serif_tl
+ { \g_@@_font_family_libertinus_serif_tl - \g_@@_font_style_libertinus_rm_tl }
+\tl_set:Nx \g_@@_font_name_libertinus_sans_tl
+ { \g_@@_font_family_libertinus_sans_tl - \g_@@_font_style_libertinus_rm_tl }
+\tl_set:Nx \g_@@_font_name_libertinus_math_tl
+ { \g_@@_font_family_libertinus_math_tl - \g_@@_font_style_libertinus_rm_tl }
+\tl_set:Nx \g_@@_font_name_xits_tl
+ { \g_@@_font_family_xits_tl - \g_@@_font_style_xits_rm_tl }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_load_font_garamond:}
% EB Garamond 系列。
% \begin{macrocode}
@@ -3193,13 +3287,13 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
ItalicFont = *-Italic,
BoldItalicFont = *-BoldItalic
}
- \@@_setsansfont:nn { libertinussans }
+ \@@_setsansfont:nn { \g_@@_font_family_libertinus_sans_tl }
{
Extension = .otf,
- UprightFont = *-regular,
- BoldFont = *-bold,
- ItalicFont = *-italic,
- BoldItalicFont = *-bolditalic
+ UprightFont = *-\g_@@_font_style_libertinus_rm_tl,
+ BoldFont = *-\g_@@_font_style_libertinus_bf_tl,
+ ItalicFont = *-\g_@@_font_style_libertinus_it_tl,
+ BoldItalicFont = *-\g_@@_font_style_libertinus_bfsl_tl
}
\@@_setmonofont:nn { lmmonolt10 }
{
@@ -3219,21 +3313,21 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \begin{macrocode}
\cs_new_protected:Npn \@@_load_font_libertinus:
{
- \@@_setmainfont:nn { libertinusserif }
+ \@@_setmainfont:nn { \g_@@_font_family_libertinus_serif_tl }
{
Extension = .otf,
- UprightFont = *-regular,
- BoldFont = *-bold,
- ItalicFont = *-italic,
- BoldItalicFont = *-bolditalic
+ UprightFont = *-\g_@@_font_style_libertinus_rm_tl,
+ BoldFont = *-\g_@@_font_style_libertinus_bf_tl,
+ ItalicFont = *-\g_@@_font_style_libertinus_it_tl,
+ BoldItalicFont = *-\g_@@_font_style_libertinus_bfit_tl
}
- \@@_setsansfont:nn { libertinussans }
+ \@@_setsansfont:nn { \g_@@_font_family_libertinus_sans_tl }
{
Extension = .otf,
- UprightFont = *-regular,
- BoldFont = *-bold,
- ItalicFont = *-italic,
- BoldItalicFont = *-bolditalic
+ UprightFont = *-\g_@@_font_style_libertinus_rm_tl,
+ BoldFont = *-\g_@@_font_style_libertinus_bf_tl,
+ ItalicFont = *-\g_@@_font_style_libertinus_it_tl,
+ BoldItalicFont = *-\g_@@_font_style_libertinus_bfsl_tl
}
\@@_setmonofont:nn { lmmonolt10 }
{
@@ -3243,7 +3337,7 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
ItalicFont = *-oblique,
BoldItalicFont = *-boldoblique
}
- \@@_setmathfont:nn { libertinusmath-regular.otf } { }
+ \@@_setmathfont:nn { \g_@@_font_name_libertinus_math_tl .otf } { }
}
% \end{macrocode}
% \end{macro}
@@ -3270,13 +3364,13 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
ItalicFont = *-italic,
BoldItalicFont = *-bolditalic
}
- \@@_setsansfont:nn { libertinussans }
+ \@@_setsansfont:nn { \g_@@_font_family_libertinus_sans_tl }
{
Extension = .otf,
- UprightFont = *-regular,
- BoldFont = *-bold,
- ItalicFont = *-italic,
- BoldItalicFont = *-bolditalic,
+ UprightFont = *-\g_@@_font_style_libertinus_rm_tl,
+ BoldFont = *-\g_@@_font_style_libertinus_bf_tl,
+ ItalicFont = *-\g_@@_font_style_libertinus_it_tl,
+ BoldItalicFont = *-\g_@@_font_style_libertinus_bfsl_tl,
Scale = MatchUppercase
}
\@@_setmonofont:nn { lmmonolt10 }
@@ -3297,17 +3391,13 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \begin{macrocode}
\cs_new_protected:Npn \@@_load_font_times:
{
- \@@_setmainfont:nn { XITS }
+ \@@_setmainfont:nn { \g_@@_font_family_xits_tl }
{
Extension = .otf,
- UprightFont = *-Regular,
- BoldFont = *-Bold,
- ItalicFont = *-Italic,
- BoldItalicFont = *-BoldItalic,
- UprightFeatures = { SmallCapsFont = *-Regular },
- BoldFeatures = { SmallCapsFont = *-Bold },
- ItalicFeatures = { SmallCapsFont = *-Italic },
- BoldItalicFeatures = { SmallCapsFont = *-BoldItalic }
+ UprightFont = *-\g_@@_font_style_xits_rm_tl,
+ BoldFont = *-\g_@@_font_style_xits_bf_tl,
+ ItalicFont = *-\g_@@_font_style_xits_it_tl,
+ BoldItalicFont = *-\g_@@_font_style_xits_bfit_tl
}
\@@_setsansfont:nn { texgyreheros }
{
@@ -3326,20 +3416,22 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
BoldItalicFont = *-bolditalic,
Ligatures = CommonOff
}
- \@@_setmathfont:nn { XITSMath-Regular.otf }{ BoldFont = XITSMath-Bold.otf }
+ \@@_setmathfont:nn { \g_@@_font_name_xits_math_rm_tl .otf }
+ { BoldFont = \g_@@_font_name_xits_math_bf_tl .otf }
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_load_font_times*:}
-% Times* 系列,出数学部分外采用系统字体。
+% Times* 系列,除数学部分外采用系统字体。
% \begin{macrocode}
\cs_new_protected:cpn { @@_load_font_ times* : }
{
\@@_setmainfont:nn { Times~ New~ Roman } { }
\@@_setsansfont:nn { Arial } { }
\@@_setmonofont:nn { Courier~ New } { }
- \@@_setmathfont:nn { XITSMath-Regular.otf }{ BoldFont = XITSMath-Bold.otf }
+ \@@_setmathfont:nn { \g_@@_font_name_xits_math_rm_tl .otf }
+ { BoldFont = \g_@@_font_name_xits_math_bf_tl .otf }
}
% \end{macrocode}
% \end{macro}
@@ -3499,8 +3591,8 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \begin{macrocode}
\cs_new_protected:Npn \@@_load_font:
{
- \use:c { @@_load_font_ \g_@@_font_set_tl : }
-%<class> \use:c { @@_load_cjk_font_ \g_@@_cjk_font_set_tl : }
+ \use:c { @@_load_font_ \g_@@_fontset_tl : }
+%<class> \use:c { @@_load_cjk_font_ \g_@@_cjk_fontset_tl : }
}
\ctex_at_end_preamble:n { \@@_load_font: }
% \end{macrocode}
@@ -3915,8 +4007,7 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \begin{macro}{\@@_fn_symbol_libertinus_sans:n}
% \opt{libertinus} 阳文无衬线版。符号排列与普通版相同。
% \begin{macrocode}
-\cs_new_eq:NN \@@_fn_symbol_libertinus_sans:n
- \@@_fn_symbol_libertinus:n
+\cs_new_eq:NN \@@_fn_symbol_libertinus_sans:n \@@_fn_symbol_libertinus:n
% \end{macrocode}
% \end{macro}
%
@@ -4011,17 +4102,17 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \begin{macrocode}
\c_@@_fn_style_libertinus_tl
{
- \fontspec { libertinusserif-regular.otf }
+ \fontspec { \g_@@_font_name_libertinus_serif_tl .otf }
\@@_fn_symbol_libertinus:n {#1}
}
\c_@@_fn_style_libertinus_neg_tl
{
- \fontspec { libertinusserif-regular.otf }
+ \fontspec { \g_@@_font_name_libertinus_serif_tl .otf }
\@@_fn_symbol_libertinus_neg:n {#1}
}
\c_@@_fn_style_libertinus_sans_tl
{
- \fontspec { libertinussans-regular.otf }
+ \fontspec { \g_@@_font_name_libertinus_sans_tl .otf }
\@@_fn_symbol_libertinus_sans:n {#1}
}
% \end{macrocode}
@@ -4040,17 +4131,17 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \begin{macrocode}
\c_@@_fn_style_xits_tl
{
- \fontspec { XITS-Regular.otf }
+ \fontspec { \g_@@_font_name_xits_tl .otf }
\@@_fn_symbol_xits:n {#1}
}
\c_@@_fn_style_xits_sans_tl
{
- \fontspec { XITS-Regular.otf }
+ \fontspec { \g_@@_font_name_xits_tl .otf }
\@@_fn_symbol_xits_sans:n {#1}
}
\c_@@_fn_style_xits_sans_neg_tl
{
- \fontspec { XITS-Regular.otf }
+ \fontspec { \g_@@_font_name_xits_tl .otf }
\@@_fn_symbol_xits_sans_neg:n {#1}
}
}
@@ -5094,9 +5185,9 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
authorization-decl-sig / content =
\@@_cover_signature:N \c_@@_auth_decl_sign_clist,
originality-decl-name / format =
- \@@_line_spread:n { 1.2 } \zihao { -2 } \sffamily,
+ \@@_line_spread:n { 1.2 } \zihao { -2 } \bfseries,
authorization-decl-name / format =
- \@@_line_spread:n { 1.2 } \zihao { -2 } \sffamily,
+ \@@_line_spread:n { 1.2 } \zihao { -2 } \bfseries,
originality-decl-name / bottom-skip = 0.4 cm,
originality-decl-text / bottom-skip = 0.4 cm,
originality-decl-sig / bottom-skip = 0 pt plus 2.5 fill,
@@ -5148,8 +5239,9 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \begin{macrocode}
\keys_set:nn { ctex }
{
-%<class> contentsname = \c_@@_name_toc_tl,
-%<class-en> contentsname = \c_@@_name_toc_en_tl,
+%<class> contentsname = \c_@@_name_toc_tl,
+%<class> listfigurename = \c_@@_name_lof_tl,
+%<class> listtablename = \c_@@_name_lot_tl,
% \end{macrocode}
%
% 设置目录中章节标题的样式。
@@ -5173,17 +5265,36 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
}
% \end{macrocode}
%
-% \begin{macro}{\tableofcontents}
-% 修改 \cs{tableofcontents} 的定义,使得页眉正确显示,并出现在目录中。原代码
-% 来自于 \LaTeXe{} 标准文档类 \file{book.cls}。
+% \changes{v0.7e}{2019/05/12}{增加对插图、表格目录的处理。}
+%
+% \begin{macro}{\tableofcontents,\listoffigures,\listoftables}
+% 修改 \cs{tableofcontents}、\cs{listoffigures} 和 \cs{listoftables} 的定义,
+% 使得页眉正确显示,并出现在目录及 PDF 书签中。来自于 \LaTeXe{} 标准文档类
+% \file{book.cls}
+% \footnote{原代码中只有 \cs{tableofcontents} 的 \cs{@mkboth} 出现在
+% \cs{chapter*} 内部,这是出于兼容性的考虑而非 typo。}。
% \begin{macrocode}
\@@_patch_cmd:Nnn \tableofcontents
{
\chapter*{\contentsname
- \@mkboth{%
- \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
+ \@mkboth{\MakeUppercase\contentsname}
+ {\MakeUppercase\contentsname}}
}
{ \@@_chapter_no_toc:V \contentsname }
+\@@_patch_cmd:Nnn \listoffigures
+ {
+ \chapter*{\listfigurename}
+ \@mkboth{\MakeUppercase\listfigurename}
+ {\MakeUppercase\listfigurename}
+ }
+ { \@@_chapter:V \listfigurename }
+\@@_patch_cmd:Nnn \listoftables
+ {
+ \chapter*{\listtablename}
+ \@mkboth{\MakeUppercase\listtablename}
+ {\MakeUppercase\listtablename}
+ }
+ { \@@_chapter:V \listtablename }
% \end{macrocode}
% \end{macro}
%
@@ -5440,6 +5551,7 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \changes{v0.7}{2018/01/25}{统一使用 \cs{printbibliography} 命令
% 生成参考文献列表。}
% \changes{v0.7d}{2019/03/23}{使参考文献在目录中正常显示。}
+% \changes{v0.7e}{2020/08/30}{同步 \pkg{gbt7714} v2.0。}
%
% \begin{macro}{\@@_bibtex_setup:,\bibsection,\printbibliography}
% \BibTeX{} 相关设置。
@@ -5450,13 +5562,13 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
{
\tl_if_eq:VnTF \l_@@_bib_gb_style_tl { numerical }
{
- \bibliographystyle { gbt7714-unsrt }
+ \bibliographystyle { gbt7714-numerical }
\@@_set_cite_style_numerical:
}
{
\tl_if_eq:VnT \l_@@_bib_gb_style_tl { author-year }
{
- \bibliographystyle { gbt7714-plain }
+ \bibliographystyle { gbt7714-author-year }
\@@_set_cite_style_author_year:
\cs_set_eq:NN \cite \citep
}
@@ -5697,6 +5809,8 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \end{macrocode}
% \end{variable}
%
+% \changes{v0.7e}{2019/04/23}{处理 \pkg{hyperref} 与 \pkg{unicode-math} 的兼容性问题。}
+%
% 在导言区末尾引入 \pkg{hyperref} 宏包。
% \begin{macrocode}
\ctex_at_end_preamble:n
@@ -5708,6 +5822,8 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
\hypersetup
{
bookmarksnumbered = true,
+ psdextra = true,
+ unicode = true,
% \end{macrocode}
% 填写 PDF 元信息。
% \begin{macrocode}
@@ -5984,6 +6100,9 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
{ author_sign } { 作者签名 },
{ supervisor_sign } { 导师签名 },
{ sign_date } { 日期 },
+ { toc } { 目 \quad 录 },
+ { lof } { 插图目录 },
+ { lot } { 表格目录 },
{ bib_en } { Bibliography },
{ pdf_creator } { LaTeX~ with~ fduthesis~ class },
{ orig_decl } { \c_@@_name_simp_tl \\ 学位论文独创性声明 },
@@ -5995,7 +6114,6 @@ Copyright (C) 2017&ndash;2019 by Xiangdong Zeng <xdzeng96@gmail.com>.
{ abstract } { 摘 \quad 要 } { Abstract },
{ keywords } { 关键字 } { Keywords: },
{ clc } { 中图分类号 } { CLC~ number: },
- { toc } { 目 \quad 录 } { Contents },
{ notation } { 符号表 } { List~ of~ Symbols }
}
{ \@@_define_name:nnn #1 }
diff --git a/Master/texmf-dist/source/latex/fduthesis/fduthesis.ins b/Master/texmf-dist/source/latex/fduthesis/fduthesis.ins
index e6e7be5840b..ecaeaee4709 100644
--- a/Master/texmf-dist/source/latex/fduthesis/fduthesis.ins
+++ b/Master/texmf-dist/source/latex/fduthesis/fduthesis.ins
@@ -6,7 +6,7 @@
%%
%% fduthesis.dtx (with options: `install')
%%
-%% Copyright (C) 2017--2019 by Xiangdong Zeng <xdzeng96@gmail.com>
+%% Copyright (C) 2017--2020 by Xiangdong Zeng <xdzeng96@gmail.com>
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
@@ -49,7 +49,7 @@
\preamble
- Copyright (C) 2017--2019 by Xiangdong Zeng <xdzeng96@gmail.com>
+ Copyright (C) 2017--2020 by Xiangdong Zeng <xdzeng96@gmail.com>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
diff --git a/Master/texmf-dist/source/latex/fei/fei.dtx b/Master/texmf-dist/source/latex/fei/fei.dtx
index 1225ee097a2..0b684339270 100644
--- a/Master/texmf-dist/source/latex/fei/fei.dtx
+++ b/Master/texmf-dist/source/latex/fei/fei.dtx
@@ -49,7 +49,7 @@ See http://www.latex-project.org/lppl.txt
\endpreamble
\postamble
-Copyright (C) 2019 by Douglas De Rizzo Meneghetti <douglasrizzo@fei.edu.br>
+Copyright (C) 2020 by Douglas De Rizzo Meneghetti <douglasrizzo@fei.edu.br>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License (LPPL), either
@@ -94,7 +94,7 @@ fei.cls.
\begin{filecontents*}{\jobname.xmpdata}
\Title {Classe LaTeX FEI}
\Author {Douglas De Rizzo Meneghetti}
-\Copyright {Copyright \copyright\ 2019 "Douglas De Rizzo Meneghetti"}
+\Copyright {Copyright \copyright\ 2020 "Douglas De Rizzo Meneghetti"}
\Keywords {manual\sep latex\sep tipografia}
\Publisher {Baking International}
\Language {pt-BR}
@@ -128,7 +128,7 @@ literate=
\author{Douglas De Rizzo Meneghetti}
\title{Classe \LaTeX{} da FEI para criação de trabalhos acadêmicos}
-\subtitulo{de acordo com o guia de 2016 da biblioteca}
+\subtitulo{de acordo com os guias de março de 2020 da biblioteca}
% \advisor{Donald Knuth}
% \curso{Formatação e Tipografia}
@@ -165,7 +165,7 @@ literate=
\maketitle
\begin{folhaderosto}
- Classe \LaTeX{} da FEI para criação de trabalhos acadêmicos de acordo com o guia de 2016 da biblioteca
+ Manual da classe \LaTeX{} da FEI apresentado como pré-requisito para que seus usuários saibam como utilizá-la.
\end{folhaderosto}
\fichacatalografica
\folhadeaprovacao
@@ -202,7 +202,7 @@ literate=
\glsaddall
-Inspirado nas diversas normas da \index{ABNT}\gls{abnt} para produção de trabalhos acadêmicos, a biblioteca do Centro Universitário \index{FEI}\gls{fei} criou um guia, cuja última versão data de 2016, o qual dita as regras que os alunos devem seguir na formatação de suas monografias, dissertações e teses. Através deste guia (e algumas dúzias de trabalhos corrigidos pelas bibliotecárias), nasceu a classe \LaTeX{} da \gls{fei}, especializada na criação de trabalhos acadêmicos sob as normas da biblioteca da \gls{fei}. Com ela, os alunos podem utilizar seus conhecimentos em \LaTeX{} para criar seus documentos, deixando a maior parte da formatação complexa do documento a cargo da classe.
+Inspirado nas diversas normas da \index{ABNT}\gls{abnt} para produção de trabalhos acadêmicos, a biblioteca do Centro Universitário \index{FEI}\gls{fei} criou um guia que dita as regras que os alunos devem seguir na formatação de suas monografias, dissertações e teses. Através deste guia (e algumas dúzias de trabalhos corrigidos pelas bibliotecárias), nasceu a classe \LaTeX{} da \gls{fei}, especializada na criação de trabalhos acadêmicos sob as normas da biblioteca da \gls{fei}. Com ela, os alunos podem utilizar seus conhecimentos em \LaTeX{} para criar seus documentos, deixando a maior parte da formatação complexa do documento a cargo da classe.
A escrita da classe que formata o texto foi realizada tendo-se como referência principal o guia disponível pela biblioteca. Trabalhos corrigidos e reuniões subsequentes com as bibliotecárias também serviram de referencial para refinar algumas funcionalidades da classe, assim como realizar adições não cobertas pelo guia, como algoritmos e teoremas.
@@ -314,7 +314,7 @@ Para que o arquivo PDF seja gerado com os metadados relevantes, um arquivo com o
\begin{filecontents*}{\jobname.xmpdata}
\Title {Minha tese-dissertação-monografia}
\Author {Meu Nome\sep Nome Do Outro Integrante\sep Nome do Terceiro}
-\Copyright {Copyright \copyright\ 2019 "Douglas De Rizzo Meneghetti"}
+\Copyright {Copyright \copyright\ 2020 "Douglas De Rizzo Meneghetti"}
\Keywords {manual\sep latex\sep tipografia}
\Language {pt-BR}
\Subject {Resumo vai aqui em uma única linha corrida.}
@@ -345,6 +345,7 @@ A classe da FEI pode receber as seguintes opções:
\item \texttt{twoside}: a atualização de 2015 do guia da biblioteca recomenda que trabalhos acadêmicos com mais de 100 páginas sejam impressos em formato \index{frente-e-verso}frente-e-verso. Por ser derivada da classe \texttt{memoir}, a classe da FEI pode receber algumas opções nativas de \texttt{memoir}. Um exemplo de opção que pode ser útil é \texttt{twoside}, a qual alterna o tamanho das margens direita e esquerda das páginas, assim como a posição da numeração, permitindo realizar uma impressão frente-e-verso de melhor qualidade. Alterações adicionais foram realizadas para que todos os elementos pré-textuais sejam corretamente iniciados nas páginas ímpares, como recomenda o guia e a norma. É importante reparar, contudo, que a utilização de \texttt{twoside} acarreta no aumento do número de páginas, uma vez que os versos de algumas páginas no pré-texto podem ser deixados em branco em prol da norma.
\item \texttt{acronym}: passado para o pacote \texttt{glossaries-extra}, sinaliza o uso de abreviaturas no trabalho;
\item \texttt{symbols}: passado para o pacote \texttt{glossaries-extra}, sinaliza o uso de símbolos no trabalho;
+ \item \texttt{backrefs}: passa a opção \texttt{backref} ao pacote \texttt{biblatex}, para que ele imprima as páginas nas quais cada trabalho foi citado nas referências bibliográficas. Repare que esta não é uma características prevista no guia de formatação de referências da biblioteca, então use-o somente sob sua conta e risco;
\item \texttt{record}: passado para o pacote \texttt{glossaries-extra}, sinaliza o uso de um arquivo \texttt{.bib} para definição de símbolos e abreviaturas, a ser compilado pelo programa \index{bib2gls@\texttt{bib2gls}}\texttt{bib2gls}.
\end{enumerate}
@@ -670,7 +671,7 @@ Segundo o padrão da biblioteca, ``se houver necessidade de enumerar diversos as
\item Primeiro sub-item;
\item Segundo sub-item.
\end{enumerate}
- \item Terceiro item extremamente grande utilizado para testar se as linhas das alíneas são alinhadas verticalmente no início, como demanda o guia de 2016.
+ \item Terceiro item extremamente grande utilizado para testar se as linhas das alíneas são alinhadas verticalmente no início, como demanda o guia de 2020.
\end{enumerate}
\section{PÓS-TEXTO}\label{sec:postexto}
@@ -967,7 +968,7 @@ Manuais complementares da Classe \LaTeX{} da FEI de possível interesse para usu
\appendix
-\chapter{\emph{HACKS} ÚTEIS}
+\chapter{\emph{HACKS} ÚTEIS} \label{app:hacks}
Existem alguns casos específicos nos quais técnicas de formatação avançadas ou redefinições de comandos são requeridas. Não existe forma simples de disponibilizar os recursos listados neste apêndice aos usuários da classe, então o apêndice ensinará os usuários a realizar personalizações básicas na classe, assim como fazer formatações menos convencionais que sejam necessárias para aderir as padrões da biblioteca.
@@ -1053,7 +1054,7 @@ Para criar uma nova categoria de \emph{float}, a qual será listada na lista de
\setfloatlocations{mapa}{hbtp} % configurando posicionamento padrão
\end{lstlisting}
-\chapter{ARQUIVOS CRIADOS PELO PROCESSO DE COMPILAÇÃO} \label{chap:arquivos}
+\chapter{ARQUIVOS CRIADOS PELO PROCESSO DE COMPILAÇÃO} \label{app:arquivos}
A seguir, as descrições dos arquivos auxiliares gerados durante o processo de compilação de um documento utilizando a classe \LaTeX{} da FEI e todos os seus recursos.
@@ -1088,7 +1089,7 @@ A seguir, as descrições dos arquivos auxiliares gerados durante o processo de
\end{enumerate}
\end{enumerate}
-\chapter{REFERÊNCIA DE SÍMBOLOS \TeX{}} \label{chap:simbolos}
+\chapter{REFERÊNCIA DE SÍMBOLOS \TeX{}} \label{app:simbolos}
\section{LETRAS GREGAS}
\begin{multicols}{3}
@@ -1312,7 +1313,7 @@ A seguir, as descrições dos arquivos auxiliares gerados durante o processo de
% \fi
%<*class>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{fei}[2020/03/03 4.8 Modelo da FEI]
+\ProvidesClass{fei}[2020/07/26 4.10.1 Modelo da FEI]
% passa a opção draft para a classe
\DeclareOption{draft}{
@@ -1347,7 +1348,6 @@ A seguir, as descrições dos arquivos auxiliares gerados durante o processo de
\sublistfalse
\DeclareOption{sublist}{\sublisttrue}
%---------------------------------------------------------------
-
% opção deposito controla a exibição da folha
% de aprovação e ficha catalográfica
\newif\ifdeposito
@@ -1366,6 +1366,10 @@ A seguir, as descrições dos arquivos auxiliares gerados durante o processo de
\DeclareOption{oneside}{\onesidetrue}
\DeclareOption{twoside}{\onesidefalse}
+\DeclareOption{backrefs}{%
+ \PassOptionsToPackage{backref}{biblatex}%
+}
+
\DeclareOption{algo-as-figure}{\PassOptionsToPackage{figure}{algorithm2e}}%
% opção para configurar a lista de símbolos
@@ -1888,7 +1892,7 @@ A seguir, as descrições dos arquivos auxiliares gerados durante o processo de
\oldprintindex%
}%
-% antigamente, aqui era carregado o pacote hyperref
+% antigamente, aqui era carregado o pacote hyperref.
% como, a partir de 2017, a biblioteca exige que os documentos sejam gerados sob o padrão
% PDF/A, o pacote pdfx é usado no lugar do hyperref por padrão
% em teoria, o pacote hyperref deveria ser o último a ser carregado, porém
@@ -2005,11 +2009,15 @@ A seguir, as descrições dos arquivos auxiliares gerados durante o processo de
\RequirePackage[backend=biber,
safeinputenc=true,
uniquelist=false,
+ doi=true,
+ repeatfields=true,
style=abnt-numeric]{biblatex}
\else
\RequirePackage[backend=biber,
safeinputenc=true,
uniquelist=false,
+ doi=true,
+ repeatfields=true,
style=abnt]{biblatex}
\fi
diff --git a/Master/texmf-dist/source/latex/fei/fei.ins b/Master/texmf-dist/source/latex/fei/fei.ins
deleted file mode 100644
index 1f31675c1a8..00000000000
--- a/Master/texmf-dist/source/latex/fei/fei.ins
+++ /dev/null
@@ -1,71 +0,0 @@
-%%
-%% This is file `fei.ins',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% fei.dtx (with options: `install')
-%% -----------------------------------------------------------------------------------------------------
-%% fei --- Class for the creation of academic works under the typographic rules of FEI University Center
-%% Author: Douglas De Rizzo Meneghetti
-%% E-mail: douglasrizzo@fei.edu.br
-%%
-%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
-%% -----------------------------------------------------------------------------------------------------
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-\preamble
------------------------------------------------------------------------------------------------------
-fei --- Class for the creation of academic works under the typographic rules of FEI University Center
-Author: Douglas De Rizzo Meneghetti
-E-mail: douglasrizzo@fei.edu.br
-
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
------------------------------------------------------------------------------------------------------
-\endpreamble
-\postamble
-
-Copyright (C) 2019 by Douglas De Rizzo Meneghetti <douglasrizzo@fei.edu.br>
-
-This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License (LPPL), either
-version 1.3c of this license or (at your option) any later
-version. The latest version of this license is in the file:
-
-http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
-Douglas De Rizzo Meneghetti.
-
-This work consists of the file fei.dtx,
-and the derived files fei.pdf and
-fei.cls.
-
-\endpostamble
-\usedir{tex/latex/fei}
-\generate{
-\file{\jobname.cls}{\from{\jobname.dtx}{class}}
-}
-\endbatchfile
-%%
-%% Copyright (C) 2019 by Douglas De Rizzo Meneghetti <douglasrizzo@fei.edu.br>
-%%
-%% This work may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License (LPPL), either
-%% version 1.3c of this license or (at your option) any later
-%% version. The latest version of this license is in the file:
-%%
-%% http://www.latex-project.org/lppl.txt
-%%
-%% This work is "maintained" (as per LPPL maintenance status) by
-%% Douglas De Rizzo Meneghetti.
-%%
-%% This work consists of the file fei.dtx,
-%% and the derived files fei.pdf and
-%% fei.cls.
-%%
-%%
-%% End of file `fei.ins'.
diff --git a/Master/texmf-dist/source/latex/fgruler/fgruler.dtx b/Master/texmf-dist/source/latex/fgruler/fgruler.dtx
index 18d16a62602..855e1411a6b 100644
--- a/Master/texmf-dist/source/latex/fgruler/fgruler.dtx
+++ b/Master/texmf-dist/source/latex/fgruler/fgruler.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 2017- by Tibor Tomacs
+% Copyright 2017-2020 by Tibor Tomacs
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -20,14 +20,16 @@
%<*driver>
\ProvidesFile{fgruler.dtx}
%</driver>
-%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-%<package>\ProvidesPackage{fgruler}[2017/01/16 v1.0 Package for drawing rulers on the foreground or in the text]
+%<package>\NeedsTeXFormat{LaTeX2e}[2020/10/01]
+%<package>\ProvidesPackage{fgruler}[2020/11/04 v1.3 Package for drawing rulers on the foreground or in the text]
%
%<*driver>
\documentclass{ltxdoc}
\OnlyDescription
\usepackage[a4paper,margin=25mm,marginparwidth=19mm,marginparsep=5mm,headsep=5mm,headheight=4mm,footskip=10mm]{geometry}
\usepackage[pdfstartview=FitH,colorlinks,allcolors=black,bookmarksnumbered,hyperfootnotes=false]{hyperref}
+\usepackage[T1]{fontenc}
+\usepackage{lmodern}
\usepackage[english]{babel}
\usepackage{listings,fontawesome,fancyvrb}
\usepackage[type=none,color=red!80!black]{fgruler}
@@ -42,7 +44,11 @@ gobble=2,
belowskip=\bigskipamount,
basicstyle=\ttfamily,
backgroundcolor=\color{black!10},
+frame=trbl,
+framesep=3pt,
columns=fullflexible,
+xleftmargin=3.4pt,
+xrightmargin=3.4pt,
keepspaces}}{}
\newcommand{\commandinline}{\lstinline[
@@ -60,7 +66,7 @@ keepspaces]}
%
% \GetFileInfo{fgruler.sty}
%
-% \title{The {\bfseries\sffamily fgruler} package\\{\large v1.0 (2017/01/16)}}
+% \title{The {\bfseries\sffamily fgruler} package\\{\large v1.3 (2020/11/04)}}
% \author{Tibor T\'{o}m\'{a}cs\\{\normalsize\url{tomacs.tibor@uni-eszterhazy.hu}}}
% \date{}
% \maketitle
@@ -98,56 +104,59 @@ keepspaces]}
% By default, the \texttt{fgruler} package draws a square ruler on the foreground of every page. The following package options set the parameters of these rulers.
% \begin{description}
% \item\commandinline|unit=!<unit>!|\\
-% Ruler unit.
+% Ruler unit. The \commandinline|!<unit>!| legal values:
% \begin{description}
-% \item\commandinline|!<unit>!| values:\\
-% \commandinline|cm| Metric ruler (centimeter). Default value.\\
-% \commandinline|in| English ruler (inch).
+% \item\commandinline|cm| Metric ruler (centimeter). Default value.
+% \item\commandinline|in| English ruler (inch).
% \end{description}
%
% \item\commandinline|type=!<type name>!|\\
-% Origin and directions.
+% Origin, directions and lengths of the ruler. The \commandinline|!<type name>!| legal values:
% \begin{description}
-% \item\commandinline|!<type name>!| values:\\
-% \commandinline|upperleft | Origin: upper left corner. Directions: down and right. Default value.\\
-% \commandinline|upperright| Origin: upper right corner. Directions: down and left.\\
-% \commandinline|lowerleft | Origin: lower left corner. Directions: up and right.\\
-% \commandinline|lowerright| Origin: lower right corner. Directions: up and left.\\
-% \commandinline|none | Not drawing ruler.
+% \item\commandinline|upperleft | Default value. Origin: upper left corner of the paper. Directions: down and right. Lengths: paper sizes.
+% \item\commandinline|upperright | Origin: upper right corner of the paper. Directions: down and left. Lengths: paper sizes.
+% \item\commandinline|lowerleft | Origin: lower left corner of the paper. Directions: up and right. Lengths: paper sizes.
+% \item\commandinline|lowerright | Origin: lower right corner of the paper. Directions: up and left. Lengths: paper sizes.
+% \item\commandinline|upperleftT | Origin: upper left corner of the text area. Directions: down and right. Lengths: text area sizes.
+% \item\commandinline|upperrightT| Origin: upper right corner of the text area. Directions: down and left. Lengths: text area sizes.
+% \item\commandinline|lowerleftT | Origin: lower left corner of the text area. Directions: up and right. Lengths: text area sizes.
+% \item\commandinline|lowerrightT| Origin: lower right corner of the text area. Directions: up and left. Lengths: text area sizes.
+% \item\commandinline|none| Not drawing ruler.
+% \item\commandinline|user| Each \commandinline|!<unit>!|--\commandinline|!<type name>!| pair activates an \commandinline|\fgruler@!<unit>!@!<type name>!@fg| command, which is equivalent to \commandinline|\fgrulertype{!<unit>!}{!<type name>!}|.\\
+% You can control the effect of this option by redefining the \commandinline|\fgruler@!<unit>!@user@fg| commands, which are empty in the default case.\\
+% \commandinline|\def\fgruler@cm@user@fg{!<code>!}| is equivalent to \commandinline|\fgrulerdefusercm{!<code>!}|.\\
+% Similarly, \commandinline|\def\fgruler@in@user@fg{!<code>!}| is equivalent to \commandinline|\fgrulerdefuserin{!<code>!}|.\\
+% See \ref{example:user-first}--\ref{example:user-last} examples.
% \end{description}
%
% \item\commandinline|hshift=!<length>!|\\
-% Horizontal shift.
-% The shift direction is right, if the \commandinline|!<type name>!| is \verb|upperleft| or \verb|lowerleft|, otherwise it is left.
-% Default: \verb|hshift=0cm|
+% Horizontal shift of the ruler, if the \commandinline|!<type name>!| is \verb|upperleft|, \verb|lowerleft|, \verb|upperright| or \verb|lowerright|.
+% The shift direction is right, if the \commandinline|!<type name>!| is \verb|upperleft| or \verb|lowerleft|.
+% The shift direction is left, if the \commandinline|!<type name>!| is \verb|upperright| or \verb|lowerright|.
+% Default: \verb|hshift=0cm|.
%
% \item\commandinline|vshift=!<length>!|\\
-% Vertical shift.
-% The shift direction is down, if the \commandinline|!<type name>!| is \verb|upperleft| or \verb|upperright|, otherwise it is up.
-% Default: \verb|vshift=0cm|
+% Vertical shift of the ruler, if the \commandinline|!<type name>!| is \verb|upperleft|, \verb|lowerleft|, \verb|upperright| or \verb|lowerright|.
+% The shift direction is down, if the \commandinline|!<type name>!| is \verb|upperleft| or \verb|upperright|.
+% The shift direction is up, if the \commandinline|!<type name>!| is \verb|lowerleft| or \verb|lowerright|.
+% Default: \verb|vshift=0cm|.
%
% \item\commandinline|color=!<color name>!|\\
-% Ruler color (see \texttt{xcolor} package).
-% Default: \verb|color=black|
+% Ruler color (see \texttt{xcolor} package). Default: \verb|color=black|.
%
% \item\commandinline|numsep=!<length>!|\\
-% Separation between number and ruler.
-% Default: \verb|numsep=3pt|
+% Separation between number and ruler. Default: \verb|numsep=3pt|.
%
% \item\commandinline|markthick=!<length>!|\\
-% Mark thickness.
-% Default: \verb|markthick=0.4pt|
+% Mark thickness. Default: \verb|markthick=0.4pt|.
%
% \item\commandinline|marklength=!<length>!|\\
-% Mark length at integer units:
-% {\fgrulernoborderline\fgrulercaptioncm{}\fgrulerthickcm{}{}{1pt}\fgrulercolorcm{}{}{red}\ruler{rightup}{3cm}}\quad
-% Default: \verb|marklength=2mm|\\
-% See the length of the other marks in Section \ref{sec:additional}.
+% Mark length at integer units (see the red marks):
+% {\fgrulernoborderline\fgrulercaptioncm{}\fgrulerthickcm{}{}{1pt}\fgrulercolorcm{}{}{red}\ruler{rightup}{3cm}}
+% Default: \verb|marklength=2mm|. See the length of the other marks in Section \ref{sec:additional}.
%
% \item\commandinline|numfont=!<font type>!|\\
-% Number font type.
-% You can use this option only in \verb|\setfgruler| command.\\
-% Default: \verb|numfont=\scriptsize\sffamily|
+% Number font type. Default: \verb|numfont=\scriptsize\sffamily|. You can use this option only in \verb|\setfgruler| command.
%
% \item\commandinline|showframe| or \commandinline|showframe=true|\\
% It draws visible frames for the text and margin area, and lines for the head and foot.
@@ -292,15 +301,15 @@ keepspaces]}
% \item For example, \verb|\rulerparams{}{}{red}{}{}| changes the ruler color to red.
% \end{description}
%
+% \item\commandinline|\rulerparamsfromfg|\\
+% It sets the ruler parameters from the actual foreground ruler parameters.
+%
% \item\commandinline|\rulernorotatenum|\\
% By default, the numbers of the vertical rulers (which were generated by \verb|\ruler| or \verb|\squareruler|) are rotated by 90$^\circ$.
% It kills this action.
% This command is usable only in \texttt{document} environment.
%
-% Example: \verb|\ruler{upright}{1cm}| \ruler{upright}{1cm}\\
-% but
-% \verb|{\rulernorotatenum\ruler{upright}{1cm}}|
-% {\rulernorotatenum\ruler{upright}{1cm}}
+% Example: \verb|{\rulernorotatenum\ruler{upright}{1cm}}| {\rulernorotatenum\ruler{upright}{1cm}}
%
% \item\commandinline|\rulerrotatenum|\\
% After \verb|\rulernorotatenum|, it reactivates the number rotating.
@@ -311,19 +320,28 @@ keepspaces]}
% The following commands can work on all of the rulers, which are drawn by \texttt{fgruler} package.
% \begin{description}
% \item\commandinline|\fgrulerstartnum{!<num>!}|\\
-% The \commandinline|!<num>!| is a nonnegative integer, which will be the starting number on the ruler.
+% The \commandinline|!<num>!| is a nonnegative integer, which will be the starting number on the horizontal and vertical rulers.
% Default: \verb|\fgrulerstartnum{0}|
%
-% Example: \verb|{\fgrulerstartnum{5}\ruler{rightup}{3cm}}| {\fgrulerstartnum{5}\ruler{rightup}{3cm}}
+% Example: \verb|{\fgrulerstartnum{5}\squareruler{lowerleft}{3cm}{1cm}}| {\fgrulerstartnum{5}\squareruler{lowerleft}{3cm}{1cm}}
+%
+% \item\commandinline|\fgrulerstartnumh{!<num>!}|\\
+% The \commandinline|!<num>!| is a nonnegative integer, which will be the starting number on the horizontal rulers.
+% Default: \verb|\fgrulerstartnumh{0}|
+%
+% Example: \verb|{\fgrulerstartnumh{5}\squareruler{lowerleft}{3cm}{1cm}}| {\fgrulerstartnumh{5}\squareruler{lowerleft}{3cm}{1cm}}
+%
+% \item\commandinline|\fgrulerstartnumv{!<num>!}|\\
+% The \commandinline|!<num>!| is a nonnegative integer, which will be the starting number on the vertical rulers.
+% Default: \verb|\fgrulerstartnumv{0}|
+%
+% Example: \verb|{\fgrulerstartnumv{5}\squareruler{lowerleft}{3cm}{1cm}}| {\fgrulerstartnumv{5}\squareruler{lowerleft}{3cm}{1cm}}
%
% \item\commandinline|\fgrulernoborderline|\\
% By default, there is a borderline on one side of the ruler.
% It disappears by this command.
%
-% Example: \verb|\ruler{rightup}{3cm}| \ruler{rightup}{3cm}\\
-% but
-% \verb|{\fgrulernoborderline\ruler{rightup}{3cm}}|
-% {\fgrulernoborderline\ruler{rightup}{3cm}}
+% Example: \verb|{\fgrulernoborderline\ruler{rightup}{3cm}}| {\fgrulernoborderline\ruler{rightup}{3cm}}
%
% \item\commandinline|\fgrulerborderline|\\
% After \verb|\fgrulernoborderline|, it reactivates the previous default effect.
@@ -332,10 +350,7 @@ keepspaces]}
% Unit caption in metric ruler.
% Default: \verb|\fgrulercaptioncm{cm}|
%
-% Example: \verb|\ruler{rightup}{3cm}| \ruler{rightup}{3cm}\\
-% but
-% \verb|{\fgrulercaptioncm{}\ruler{rightup}{3cm}}|
-% {\fgrulercaptioncm{}\ruler{rightup}{3cm}}
+% Example: \verb|{\fgrulercaptioncm{}\ruler{rightup}{3cm}}| {\fgrulercaptioncm{}\ruler{rightup}{3cm}}
%
% \item\commandinline|\fgrulercaptionin{!<caption>!}|\\
% Unit caption in English ruler.
@@ -346,9 +361,7 @@ keepspaces]}
% Its current value is printed by the \commandinline|\thefgrulernum|.
% Its default definition is \verb|\def\thefgrulernum{\arabic{fgrulernum}}|, which is equivalent to \verb|\fgrulerdefnum{\arabic{fgrulernum}}|.
%
-% Example:\\
-% \verb|{\fgrulerdefnum{}\fgrulercaptioncm{}\ruler{rightdown}{2cm}}|
-% {\fgrulerdefnum{}\fgrulercaptioncm{}\ruler{rightdown}{2cm}}
+% Example: \verb|{\fgrulerdefnum{}\fgrulercaptioncm{}\ruler{rightdown}{2cm}}| {\fgrulerdefnum{}\fgrulercaptioncm{}\ruler{rightdown}{2cm}}
%
% \item\commandinline|\fgrulerratiocm{!<ratio1>!}{!<ratio2>!}|\\
% Mark length ratios in metric rulers.
@@ -511,76 +524,204 @@ keepspaces]}
% \end{description}
%
% \medskip\noindent\textcolor{red}{\faWarning}
-% All setting commands\footnote{Namely \verb|\setfgruler|, \verb|\rulerparams|, \verb|\rulernorotatenum|, \verb|\rulerrotatenum|, furthermore all commands in this section.} obey the normal scoping rules, i.e.\ if you use them inside a group, then the changing of the parameters is not valid outside the group.
+% All setting commands obey the normal scoping rules, i.e.\ if you use them inside a group, then the changing of the parameters is not valid outside the group.
%
% \newpage\fgrulerreset
% \section{Examples}
% \subsection{Deafult case}
-% The output of the following code is the ruler in this page. It is the default case.
+% The output of the following example is the ruler in this page. It is the default case.
% \begin{examplelst}
% \documentclass{article}
% \usepackage{fgruler}
% \begin{document}
-% % ...
+% ...
% \end{document}
% \end{examplelst}
%
% \newpage\fgrulerreset
-% \subsection{The showframe option}
+% \subsection{The \texttt{showframe} and \texttt{color} options}
% \setfgruler{color=red,showframe}
% \begin{examplelst}
% \documentclass{article}
% \usepackage[color=red,showframe]{fgruler}
% \begin{document}
-% % ...
+% ...
% \end{document}
% \end{examplelst}
%
% \newpage\fgrulerreset
-% \subsection{Shifting}
+% \subsection{Shift in default case}
% \setfgruler{hshift=1cm,vshift=2cm}
% \begin{examplelst}
% \documentclass{article}
% \usepackage[hshift=1cm,vshift=2cm]{fgruler}
% \begin{document}
-% % ...
+% ...
% \end{document}
% \end{examplelst}
%
% \newpage\fgrulerreset
-% \subsection{Shifting in case type=upperright}
+% \subsection{Shift in case \texttt{type=upperright} option}
% \setfgruler{type=upperright,hshift=1cm,vshift=2cm}
% \begin{examplelst}
% \documentclass{article}
% \usepackage[type=upperright,hshift=1cm,vshift=2cm]{fgruler}
% \begin{document}
-% % ...
+% ...
% \end{document}
% \end{examplelst}
%
% \newpage\fgrulerreset
-% \subsection{Shifting in case type=lowerleft}
+% \subsection{Shift in case \texttt{type=lowerleft} option}
% \setfgruler{type=lowerleft,hshift=1cm,vshift=2cm}
% \begin{examplelst}
% \documentclass{article}
% \usepackage[type=lowerleft,hshift=1cm,vshift=2cm]{fgruler}
% \begin{document}
-% % ...
+% ...
% \end{document}
% \end{examplelst}
%
% \newpage\fgrulerreset
-% \subsection{Shifting in case type=lowerright}
+% \subsection{Shift in case \texttt{type=lowerright} option}
% \setfgruler{type=lowerright,hshift=1cm,vshift=2cm}
% \begin{examplelst}
% \documentclass{article}
% \usepackage[type=lowerright,hshift=1cm,vshift=2cm]{fgruler}
% \begin{document}
-% % ...
+% ...
+% \end{document}
+% \end{examplelst}
+%
+% \newpage\fgrulerreset
+% \subsection{The \texttt{type=upperleftT} option}
+% \setfgruler{type=upperleftT}
+% \begin{examplelst}
+% \documentclass{article}
+% \usepackage[type=upperleftT]{fgruler}
+% \begin{document}
+% ...
+% \end{document}
+% \end{examplelst}
+%
+% \newpage\fgrulerreset
+% \subsection{Setting the \texttt{type=user} option}\label{example:user-first}
+% In the next example the \texttt{type=user} option activates \texttt{type=upperright} or \texttt{type=upperleft}, depending on the page number is odd or even.
+% \setfgruler{type=none}
+% \begin{examplelst}
+% \documentclass{article}
+% \usepackage[type=user]{fgruler}
+% \fgrulerdefusercm{%
+% \ifodd\value{page}\fgrulertype{cm}{upperright}%
+% \else\fgrulertype{cm}{upperleft}\fi}
+% \fgrulerdefuserin{%
+% \ifodd\value{page}\fgrulertype{in}{upperright}%
+% \else\fgrulertype{in}{upperleft}\fi}
+% \begin{document}
+% ...
+% \end{document}
+% \end{examplelst}
+%
+% \newpage\fgrulerreset
+% \subsection{Setting the \texttt{type=user} option}
+% In the next example the \texttt{type=user} option combines the effect of \texttt{type=upperleft} and \texttt{type=upperleftT}.
+% \setfgruler{type=user}
+% \fgrulerdefusercm{\fgrulertype{cm}{upperleft}\fgrulertype{cm}{upperleftT}}
+% \begin{examplelst}
+% \documentclass{article}
+% \usepackage[type=user]{fgruler}
+% \fgrulerdefusercm{\fgrulertype{cm}{upperleft}\fgrulertype{cm}{upperleftT}}
+% \fgrulerdefuserin{\fgrulertype{in}{upperleft}\fgrulertype{in}{upperleftT}}
+% \begin{document}
+% ...
+% \end{document}
+% \end{examplelst}
+%
+% \newpage\fgrulerreset
+% \subsection{Setting the \texttt{type=user} option}
+% In this example the \texttt{type=user} option combines the effect of \texttt{type=upperleftT} and \texttt{type=lowerrightT}.
+% \setfgruler{type=user}
+% \fgrulerdefusercm{\fgrulertype{cm}{upperleftT}\fgrulertype{cm}{lowerrightT}}
+% \begin{examplelst}
+% \documentclass{article}
+% \usepackage[type=user]{fgruler}
+% \fgrulerdefusercm{\fgrulertype{cm}{upperleftT}\fgrulertype{cm}{lowerrightT}}
+% \fgrulerdefuserin{\fgrulertype{in}{upperleftT}\fgrulertype{in}{lowerrightT}}
+% \begin{document}
+% ...
+% \end{document}
+% \end{examplelst}
+%
+% \newpage\fgrulerreset
+% \subsection{Setting the \texttt{type=user} option}
+% In the next example the \texttt{type=user} option places a vertical ruler at the left border of the text area.
+% \setfgruler{type=user}
+%\fgrulerdefusercm{\AtTextLowerLeft{\ignorespaces\rulerparamsfromfg\llap{\ruler{downleft}{\textheight}}}}
+% \begin{examplelst}
+% \documentclass{article}
+% \usepackage[type=user]{fgruler}
+% \newcommand{\fgruleruser}[1]{%
+% \AtTextLowerLeft{% See eso-pic package!
+% \rulerparamsfromfg%
+% \llap{\ruler[#1]{downleft}{\textheight}}%
+% }%
+% }
+% \fgrulerdefusercm{\fgruleruser{cm}}
+% \fgrulerdefuserin{\fgruleruser{in}}
+% \begin{document}
+% ...
+% \end{document}
+% \end{examplelst}
+%
+% \newpage\fgrulerreset
+% \subsection{Setting the \texttt{type=user} option}
+% In the next example the \texttt{type=user} option places rulers at the right and bottom borders of the text area.
+% \setfgruler{type=user}
+%\fgrulerdefusercm{\AtTextLowerLeft{\ignorespaces\rulerparamsfromfg\rulernorotatenum\llap{\ruler{downleft}{\textheight}}\ruler*{rightdown}{\textwidth}}}
+% \begin{examplelst}
+% \documentclass{article}
+% \usepackage[type=user]{fgruler}
+% \newcommand{\fgruleruser}[1]{%
+% \AtTextLowerLeft{% See eso-pic package!
+% \rulerparamsfromfg%
+% \rulernorotatenum%
+% \llap{\ruler[#1]{downleft}{\textheight}}%
+% \ruler*[#1]{rightdown}{\textwidth}%
+% }%
+% }
+% \fgrulerdefusercm{\fgruleruser{cm}}
+% \fgrulerdefuserin{\fgruleruser{in}}
+% \begin{document}
+% ...
% \end{document}
% \end{examplelst}
%
% \newpage\fgrulerreset
+% \subsection{Setting the \texttt{type=user} option}\label{example:user-last}
+% In the next example the \texttt{type=user} option places rulers at the right and top borders of the text area.
+% \setfgruler{type=user}
+%\fgrulerdefusercm{\AtTextUpperLeft{\ignorespaces%
+%\rulerparamsfromfg\ruler{rightup}{\textwidth}\ignorespaces%
+%\rulernorotatenum\fgrulercaptioncm{}\ignorespaces\ruler*{downright}{\textheight}}}
+% \begin{examplelst}
+% \documentclass{article}
+% \usepackage[type=user]{fgruler}
+% \newcommand{\fgruleruser}[1]{%
+% \AtTextUpperLeft{% See eso-pic package!
+% \rulerparamsfromfg%
+% \ruler[#1]{rightup}{\textwidth}%
+% \rulernorotatenum\fgrulercaptioncm{}\fgrulercaptionin{}%
+% \ruler*[#1]{downright}{\textheight}%
+% }%
+% }
+% \fgrulerdefusercm{\fgruleruser{cm}}
+% \fgrulerdefuserin{\fgruleruser{in}}
+% \begin{document}
+% ...
+% \end{document}
+% \end{examplelst}
+%
+% \newpage\fgrulerreset
% \subsection{Rulers on the foreground of a given page, and in text}
% \setfgruler{color=blue}
% \fgruler{upperleft}{1cm}{1.5cm}
@@ -606,10 +747,10 @@ keepspaces]}
% text
% \ruler*{rightdown}{3cm}
% text
-% \rotatebox[origin=tl]{30}{\ruler*{rightdown}{3cm}}
+% \rotatebox[origin=tl]{30}{\ruler*{rightdown}{3cm}}
+% % \rotatebox is defined in graphicx package
% \end{document}
% \end{examplelst}
-% \emph{Remark.} The \verb|\rotatebox| command is defined in the \texttt{graphicx} package!
%
% \newpage\fgrulerreset
% \subsection{Ruler types in text}
@@ -768,6 +909,24 @@ keepspaces]}
% \end{document}
% \end{examplelst}
%
+% \newpage\fgrulerreset
+% \subsection{A new square ruler type}
+% \setfgruler{type=none}
+% {\rulernorotatenum\fgrulercaptioncm{}\ruler*{downleft}{5cm}}\ruler{rightup}{3cm}
+%
+% \bigskip
+% \begin{examplelst}
+% \documentclass{article}
+% \usepackage[type=none]{fgruler}
+% \newcommand{\usersquareruler}[2]{%
+% {\rulernorotatenum\fgrulercaptioncm{}\ruler*{downleft}{#2}}%
+% \ruler{rightup}{#1}%
+% }
+% \begin{document}
+% \usersquareruler{3cm}{5cm}
+% \end{document}
+% \end{examplelst}
+%
% \StopEventually
%
% \begin{macrocode}
@@ -817,6 +976,8 @@ keepspaces]}
\rulerparams{.4pt}{\scriptsize\sffamily}{black}{2mm}{3pt}
+\def\rulerparamsfromfg{\rulerparams{\fgruler@markthick}{\fgruler@numfont}{\fgruler@color}{\fgruler@marklength}{\fgruler@numsep}}
+
\def\fgruler@fgsetting{%
\fgruler@set{\fgruler@markthick}{\fgruler@numfont}{\fgruler@color}{\fgruler@marklength}{\fgruler@numsep}%
\rulernorotatenum}
@@ -827,13 +988,24 @@ keepspaces]}
\def\fgruler@activate@type{%
\def\fgruler@check{cm}\ifx\fgruler@unit\fgruler@check\else%
\def\fgruler@check{in}\ifx\fgruler@unit\fgruler@check\else%
-\@latexerr{Undefined unit: \fgruler@unit\space(Defined units: cm, in)}{}\fi\fi%
+\PackageError{fgruler}{\fgruler@unit\space is invalid unit}{Valid units: cm, in}%
+\fi\fi%
\def\fgruler@check{upperleft}\ifx\fgruler@type\fgruler@check\else%
\def\fgruler@check{upperright}\ifx\fgruler@type\fgruler@check\else%
\def\fgruler@check{lowerleft}\ifx\fgruler@type\fgruler@check\else%
\def\fgruler@check{lowerright}\ifx\fgruler@type\fgruler@check\else%
+\def\fgruler@check{upperleftT}\ifx\fgruler@type\fgruler@check\else%
+\def\fgruler@check{upperrightT}\ifx\fgruler@type\fgruler@check\else%
+\def\fgruler@check{lowerleftT}\ifx\fgruler@type\fgruler@check\else%
+\def\fgruler@check{lowerrightT}\ifx\fgruler@type\fgruler@check\else%
\def\fgruler@check{none}\ifx\fgruler@type\fgruler@check\else%
-\@latexerr{Undefined type: \fgruler@type\space(Defined types: upperleft, upperright, lowerleft, lowerright, none)}{}\fi\fi\fi\fi\fi%
+\def\fgruler@check{user}\ifx\fgruler@type\fgruler@check\else%
+\PackageError{fgruler}{\fgruler@type\space is invalid type}%
+{Valid types:\MessageBreak
+upperleft, upperright, lowerleft, lowerright,\MessageBreak
+upperleftT, upperrightT, lowerleftT, lowerrightT,\MessageBreak
+user, none}%
+\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi%
\def\fgruler@output{\csname fgruler@\fgruler@unit @\fgruler@type @fg\endcsname}}
\def\fgrulerratiocm#1#2{%
@@ -902,16 +1074,19 @@ keepspaces]}
\def\setfgruler#1{\setkeys{fgruler}{#1}\fgruler@activate@type\ignorespaces}
+\newdimen\fgruler@tempdima
+\newdimen\fgruler@tempdimb
+
\newcommand\fgruler@div[2]{%
-\@tempdima=#1\relax\@tempdimb=\unitlength\relax
-\@tempdimb=#2\@tempdimb\divide\@tempdima by \@tempdimb
-\@tempcnta\@tempdima\advance\@tempcnta\@ne}
+\fgruler@tempdima=#1\relax\fgruler@tempdimb=\unitlength\relax
+\fgruler@tempdimb=#2\fgruler@tempdimb\divide\fgruler@tempdima by \fgruler@tempdimb
+\@tempcnta\fgruler@tempdima\advance\@tempcnta\@ne}
\def\fgruler@check@param#1#2{%
\def\fgruler@param{#1}%
\def\fgruler@check{cm}\ifx\fgruler@param\fgruler@check\else%
\def\fgruler@check{in}\ifx\fgruler@param\fgruler@check\else%
-\@latexerr{Invalid parameter: \fgruler@param\space(Defined parameters: cm, in)}{}%
+\PackageError{fgruler}{\fgruler@param\space is invalid parameter}{Valid parameters: cm, in}%
\fi\fi%
\def\fgruler@param{#2}%
\def\fgruler@check{rightdown}\ifx\fgruler@param\fgruler@check\else%
@@ -922,21 +1097,26 @@ keepspaces]}
\def\fgruler@check{downleft}\ifx\fgruler@param\fgruler@check\else%
\def\fgruler@check{upright}\ifx\fgruler@param\fgruler@check\else%
\def\fgruler@check{upleft}\ifx\fgruler@param\fgruler@check\else%
-\@latexerr{Invalid parameter: \fgruler@param\space(Defined parameters: rightdown, rightup, leftdown, leftup, downright, downleft, upright, upleft)}{}%
+\PackageError{fgruler}{\fgruler@param\space is invalid parameter}%
+{Valid parameters:\MessageBreak
+rightdown, rightup, leftdown, leftup,\MessageBreak
+downright, downleft, upright, upleft}%
\fi\fi\fi\fi\fi\fi\fi\fi}
\def\fgruler@check@param@#1#2{%
\def\fgruler@param{#1}%
\def\fgruler@check{cm}\ifx\fgruler@param\fgruler@check\else%
\def\fgruler@check{in}\ifx\fgruler@param\fgruler@check\else%
-\@latexerr{Invalid parameter: \fgruler@param\space(Defined parameters: cm, in)}{}%
+\PackageError{fgruler}{\fgruler@param\space is invalid parameter}{Valid parameters: cm, in}%
\fi\fi%
\def\fgruler@param{#2}%
\def\fgruler@check{upperleft}\ifx\fgruler@param\fgruler@check\else%
\def\fgruler@check{upperright}\ifx\fgruler@param\fgruler@check\else%
\def\fgruler@check{lowerleft}\ifx\fgruler@param\fgruler@check\else%
\def\fgruler@check{lowerright}\ifx\fgruler@param\fgruler@check\else%
-\@latexerr{Invalid parameter: \fgruler@param\space(Defined parameters: upperleft, upperright, lowerleft, lowerright)}{}%
+\PackageError{fgruler}{\fgruler@param\space is invalid parameter}%
+{Valid parameters:\MessageBreak
+upperleft, upperright, lowerleft, lowerright}%
\fi\fi\fi\fi}
\newcommand{\fgruler@ruler}[3][cm]{\fgruler@check@param{#1}{#2}\fgruler@intextsetting\csname fgruler@#1@#2@\endcsname{#3}}
@@ -970,10 +1150,11 @@ keepspaces]}
\def\fgruler@ifodd#1{\ifodd\value{fgrulernum}#1\fi\stepcounter{fgrulernum}}
-\def\fgruler@lentounit#1{\strip@pt\dimexpr#1*\p@/\unitlength}
-
-\def\fgrulerstartnum#1{\def\fgruler@startnum{#1}\ignorespaces}
-\def\fgruler@startnum{0}
+\def\fgrulerstartnum#1{\def\fgruler@startnumh{#1}\def\fgruler@startnumv{#1}\ignorespaces}
+\def\fgrulerstartnumh#1{\def\fgruler@startnumh{#1}\ignorespaces}
+\def\fgrulerstartnumv#1{\def\fgruler@startnumv{#1}\ignorespaces}
+\def\fgruler@startnumh{0}
+\def\fgruler@startnumv{0}
\def\fgrulerdefnum#1{\def\thefgrulernum{#1}\ignorespaces}
@@ -982,13 +1163,13 @@ keepspaces]}
\def\rulernorotatenum{%
\ifx\@onlypreamble\@notprerr%
\def\fgruler@rotatebox##1##2{##2}%
-\else\@latexerr{Don't use \protect\rulernorotatenum\space in preamble!}{}\fi%
+\else\PackageError{fgruler}{Don't use \protect\rulernorotatenum\space in preamble!}{}\fi%
\ignorespaces}
\def\rulerrotatenum{%
\ifx\@onlypreamble\@notprerr%
\def\fgruler@rotatebox##1##2{\rotatebox{##1}{##2}}%
-\else\@latexerr{Don't use \protect\rulerrotatenum\space in preamble!}{}\fi%
+\else\PackageError{fgruler}{Don't use \protect\rulerrotatenum\space in preamble!}{}\fi%
\ignorespaces}
\def\fgrulerreset{%
@@ -1033,10 +1214,11 @@ keepspaces]}
\def\thefgrulernum{\arabic{fgrulernum}}%
\def\fgruler@caption@cm{cm}%
\def\fgruler@caption@in{inch}%
-\def\fgruler@startnum{0}%
+\def\fgruler@startnumh{0}%
+\def\fgruler@startnumv{0}%
\fgruler@borderlinetrue%
\fgruler@showframefalse%
-\else\@latexerr{Don't use \protect\fgrulerreset\space in preamble!}{}\fi%
+\else\PackageError{fgruler}{Don't use \protect\fgrulerreset\space in preamble!}{}\fi%
\ignorespaces}
\AtEndPreamble{
@@ -1048,12 +1230,11 @@ keepspaces]}
\iffgruler@nonefgrulers
-\renewcommand{\fgruler}[4][cm]{}
-\providecommand{\AtPageLowerLeft}[1]{#1}
+\renewcommand{\fgruler}[4][]{}
\else
-\@ifpackageloaded{eso-pic}{}{\RequirePackage{eso-pic}}
+\@ifpackageloaded{eso-pic}{}{\RequirePackage{eso-pic}[2020/10/14]}
\def\fgruler@frame{%
\begingroup
@@ -1061,54 +1242,49 @@ keepspaces]}
\fgruler@rulercolor%
\fgruler@markthickness%
\AtPageLowerLeft{%
- \framebox(\fgruler@lentounit{\paperwidth},\fgruler@lentounit{\paperheight}){}}%
+ \framebox(\paperwidth,\paperheight){}}%
\AtTextLowerLeft{%
- \framebox(\fgruler@lentounit{\textwidth},\fgruler@lentounit{\textheight}){}}%
+ \framebox(\textwidth,\textheight){}}%
\AtTextUpperLeft{%
- \put(0,\fgruler@lentounit{\headsep}){%
- \framebox(\fgruler@lentounit{\textwidth},\fgruler@lentounit{\headheight}){}}}%
+ \put(0,\headsep){%
+ \framebox(\textwidth,\headheight){}}}%
\AtTextLowerLeft{%
- \put(0,\fgruler@lentounit{-\footskip}){%
- \line(1,0){\fgruler@lentounit{\textwidth}}}}%
+ \put(0,-\footskip){%
+ \line(1,0){\textwidth}}}%
\AtTextLowerLeft{%
- \@tempdima=\textwidth\advance\@tempdima\marginparsep%
+ \fgruler@tempdima=\textwidth\advance\fgruler@tempdima\marginparsep%
\if@twoside
\ifodd\c@page\else
\if@mparswitch
- \@tempdima=-\marginparsep\advance\@tempdima-\marginparwidth
+ \fgruler@tempdima=-\marginparsep\advance\fgruler@tempdima-\marginparwidth
\fi
\fi
\fi
- \put(\fgruler@lentounit{\@tempdima},0)%
- {\framebox(\fgruler@lentounit{\marginparwidth},\fgruler@lentounit{\textheight}){}}%
+ \put(\fgruler@tempdima,0)%
+ {\framebox(\marginparwidth,\textheight){}}%
}%
\endgroup
}
-\let\fgruler@shipout\AtBeginShipoutUpperLeftForeground
\def\fgruler@output@{}
+
\ESO@isMEMOIR{%
-\def\AtBeginShipoutUpperLeftForeground#1{%
- \fgruler@shipout{#1%
- \put(\fgruler@lentounit{\@tempdima},\fgruler@lentounit{\@tempdimb}){%
- \iffgruler@showframe\fgruler@frame\fi%
- \fgruler@output%
- \fgruler@output@%
- \global\let\fgruler@output@\@empty%
- }%
- }%
+ \AddToHook{shipout/foreground}{%
+ \ESO@MEMOIR@corr
+ \put(\ESO@tempdima,\ESO@tempdimb){%
+ \iffgruler@showframe\fgruler@frame\fi%
+ \fgruler@output\fgruler@output@%
+ \global\let\fgruler@output@\@empty%
}%
+ }%
}{%
-\def\AtBeginShipoutUpperLeftForeground#1{%
- \fgruler@shipout{#1%
- \put(0,\fgruler@lentounit{\ESO@yoffsetI}){%
- \iffgruler@showframe\fgruler@frame\fi%
- \fgruler@output%
- \fgruler@output@%
- \global\let\fgruler@output@\@empty%
- }%
- }%
+ \AddToHook{shipout/foreground}{%
+ \put(0,\ESO@yoffsetI){%
+ \iffgruler@showframe\fgruler@frame\fi%
+ \fgruler@output\fgruler@output@%
+ \global\let\fgruler@output@\@empty%
}%
+ }%
}
\fgruler@activate@type
@@ -1122,23 +1298,23 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(1,0){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(0,-1){\fgruler@lentounit{\fgruler@cm@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(1,0){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(0,-1){\fgruler@cm@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{5}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(5,0){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(0,-1){\fgruler@lentounit{\fgruler@cm@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(5,0){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(0,-1){\fgruler@cm@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{10}%
-\multiput(0,0)(10,0){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(0,-1){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(1,0){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(10,-\fgruler@lentounit{\fgruler@sep})(10,0){\@tempdima}{\makebox(0,0)[t]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
+\multiput(0,0)(10,0){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(0,-1){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(1,0){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}\stepcounter{fgrulernum}%
+\multiput(10,-\fgruler@sep)(10,0){\fgruler@tempdima}{\makebox(0,0)[t]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
\def\fgruler@cm@rightdown@#1{%
\setlength{\unitlength}{1mm}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{\fgruler@width})(0,-\fgruler@lentounit{\fgruler@width})%
+\begin{picture}(#1,\fgruler@width)(0,-\fgruler@width)%
\fgruler@cm@rightdown{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(0,-\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[t]{\fgruler@font@\thefgrulernum}}%
-\ifdim#1>.5cm\put(5,-\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@cm}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\thefgrulernum}}%
+\ifdim#1>.5cm\put(5,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@cm}}\fi%
\end{picture}}
\def\fgruler@cm@rightdown@@#1{\leavevmode\hbox{}\lower\fgruler@width\hbox{\fgruler@cm@rightdown@{#1}}}
@@ -1149,29 +1325,29 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(1,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(0,-1){\fgruler@lentounit{\fgruler@in@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(1,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(0,-1){\fgruler@in@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{2}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(2,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(0,-1){\fgruler@lentounit{\fgruler@in@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(2,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(0,-1){\fgruler@in@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{4}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(4,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(0,-1){\fgruler@lentounit{\fgruler@in@ratio@iii\fgruler@marklth}}}}%
+\multiput(0,0)(4,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(0,-1){\fgruler@in@ratio@iii\fgruler@marklth}}}%
\fgruler@div{#1}{8}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(8,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(0,-1){\fgruler@lentounit{\fgruler@in@ratio@iv\fgruler@marklth}}}}%
+\multiput(0,0)(8,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(0,-1){\fgruler@in@ratio@iv\fgruler@marklth}}}%
\fgruler@div{#1}{16}%
-\multiput(0,0)(16,0){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(0,-1){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(1,0){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(16,-\fgruler@lentounit{\fgruler@sep})(16,0){\@tempdima}{\makebox(0,0)[t]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
+\multiput(0,0)(16,0){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(0,-1){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(1,0){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}\stepcounter{fgrulernum}%
+\multiput(16,-\fgruler@sep)(16,0){\fgruler@tempdima}{\makebox(0,0)[t]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
\def\fgruler@in@rightdown@#1{%
\setlength{\unitlength}{.0625in}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{\fgruler@width})(0,-\fgruler@lentounit{\fgruler@width})%
+\begin{picture}(#1,\fgruler@width)(0,-\fgruler@width)%
\fgruler@in@rightdown{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(0,-\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[t]{\fgruler@font@\thefgrulernum}}%
-\ifdim#1>.5in\put(8,-\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@in}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\thefgrulernum}}%
+\ifdim#1>.5in\put(8,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@in}}\fi%
\end{picture}}
\def\fgruler@in@rightdown@@#1{\leavevmode\hbox{}\lower\fgruler@width\hbox{\fgruler@in@rightdown@{#1}}}
@@ -1182,23 +1358,23 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(1,0){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(0,1){\fgruler@lentounit{\fgruler@cm@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(1,0){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(0,1){\fgruler@cm@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{5}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(5,0){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(0,1){\fgruler@lentounit{\fgruler@cm@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(5,0){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(0,1){\fgruler@cm@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{10}%
-\multiput(0,0)(10,0){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(0,1){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(1,0){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(10,\fgruler@lentounit{\fgruler@sep})(10,0){\@tempdima}{\makebox(0,0)[b]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
+\multiput(0,0)(10,0){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(0,1){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(1,0){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}\stepcounter{fgrulernum}%
+\multiput(10,\fgruler@sep)(10,0){\fgruler@tempdima}{\makebox(0,0)[b]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
\def\fgruler@cm@rightup@#1{%
\setlength{\unitlength}{1mm}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{\fgruler@width})%
+\begin{picture}(#1,\fgruler@width)%
\fgruler@cm@rightup{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(0,\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[b]{\fgruler@font@\thefgrulernum}}%
-\ifdim#1>.5cm\put(5,\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@cm}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\thefgrulernum}}%
+\ifdim#1>.5cm\put(5,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@cm}}\fi%
\end{picture}}
\def\fgruler@cm@rightup@@#1{\leavevmode\hbox{}\lower\fgruler@width\hbox{\fgruler@cm@rightup@{#1}}}
@@ -1209,29 +1385,29 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(1,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(0,1){\fgruler@lentounit{\fgruler@in@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(1,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(0,1){\fgruler@in@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{2}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(2,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(0,1){\fgruler@lentounit{\fgruler@in@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(2,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(0,1){\fgruler@in@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{4}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(4,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(0,1){\fgruler@lentounit{\fgruler@in@ratio@iii\fgruler@marklth}}}}%
+\multiput(0,0)(4,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(0,1){\fgruler@in@ratio@iii\fgruler@marklth}}}%
\fgruler@div{#1}{8}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(8,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(0,1){\fgruler@lentounit{\fgruler@in@ratio@iv\fgruler@marklth}}}}%
+\multiput(0,0)(8,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(0,1){\fgruler@in@ratio@iv\fgruler@marklth}}}%
\fgruler@div{#1}{16}%
-\multiput(0,0)(16,0){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(0,1){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(1,0){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(16,\fgruler@lentounit{\fgruler@sep})(16,0){\@tempdima}{\makebox(0,0)[b]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
+\multiput(0,0)(16,0){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(0,1){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(1,0){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}\stepcounter{fgrulernum}%
+\multiput(16,\fgruler@sep)(16,0){\fgruler@tempdima}{\makebox(0,0)[b]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
\def\fgruler@in@rightup@#1{%
\setlength{\unitlength}{.0625in}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{\fgruler@width})%
+\begin{picture}(#1,\fgruler@width)%
\fgruler@in@rightup{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(0,\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[b]{\fgruler@font@\thefgrulernum}}%
-\ifdim#1>.5in\put(8,\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@in}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\thefgrulernum}}%
+\ifdim#1>.5in\put(8,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@in}}\fi%
\end{picture}}
\def\fgruler@in@rightup@@#1{\leavevmode\hbox{}\lower\fgruler@width\hbox{\fgruler@in@rightup@{#1}}}
@@ -1242,23 +1418,23 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(-1,0){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(0,-1){\fgruler@lentounit{\fgruler@cm@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(-1,0){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(0,-1){\fgruler@cm@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{5}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(-5,0){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(0,-1){\fgruler@lentounit{\fgruler@cm@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(-5,0){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(0,-1){\fgruler@cm@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{10}%
-\multiput(0,0)(-10,0){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(0,-1){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(-1,0){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(-10,-\fgruler@lentounit{\fgruler@sep})(-10,0){\@tempdima}{\makebox(0,0)[t]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
+\multiput(0,0)(-10,0){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(0,-1){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(-1,0){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}\stepcounter{fgrulernum}%
+\multiput(-10,-\fgruler@sep)(-10,0){\fgruler@tempdima}{\makebox(0,0)[t]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
\def\fgruler@cm@leftdown@#1{%
\setlength{\unitlength}{1mm}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{\fgruler@width})(-\fgruler@lentounit{#1},-\fgruler@lentounit{\fgruler@width})%
+\begin{picture}(#1,\fgruler@width)(-#1,-\fgruler@width)%
\fgruler@cm@leftdown{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(0,-\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[t]{\fgruler@font@\thefgrulernum}}%
-\ifdim#1>.5cm\put(-5,-\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@cm}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\thefgrulernum}}%
+\ifdim#1>.5cm\put(-5,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@cm}}\fi%
\end{picture}}
\def\fgruler@cm@leftdown@@#1{\leavevmode\hbox{}\lower\fgruler@width\hbox{\fgruler@cm@leftdown@{#1}}}
@@ -1269,29 +1445,29 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(-1,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(0,-1){\fgruler@lentounit{\fgruler@in@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(-1,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(0,-1){\fgruler@in@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{2}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(-2,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(0,-1){\fgruler@lentounit{\fgruler@in@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(-2,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(0,-1){\fgruler@in@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{4}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(-4,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(0,-1){\fgruler@lentounit{\fgruler@in@ratio@iii\fgruler@marklth}}}}%
+\multiput(0,0)(-4,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(0,-1){\fgruler@in@ratio@iii\fgruler@marklth}}}%
\fgruler@div{#1}{8}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(-8,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(0,-1){\fgruler@lentounit{\fgruler@in@ratio@iv\fgruler@marklth}}}}%
+\multiput(0,0)(-8,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(0,-1){\fgruler@in@ratio@iv\fgruler@marklth}}}%
\fgruler@div{#1}{16}%
-\multiput(0,0)(-16,0){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(0,-1){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(-1,0){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(-16,-\fgruler@lentounit{\fgruler@sep})(-16,0){\@tempdima}{\makebox(0,0)[t]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
+\multiput(0,0)(-16,0){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(0,-1){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(-1,0){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}\stepcounter{fgrulernum}%
+\multiput(-16,-\fgruler@sep)(-16,0){\fgruler@tempdima}{\makebox(0,0)[t]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
\def\fgruler@in@leftdown@#1{%
\setlength{\unitlength}{.0625in}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{\fgruler@width})(-\fgruler@lentounit{#1},-\fgruler@lentounit{\fgruler@width})%
+\begin{picture}(#1,\fgruler@width)(-#1,-\fgruler@width)%
\fgruler@in@leftdown{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(0,-\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[t]{\fgruler@font@\thefgrulernum}}%
-\ifdim#1>.5in\put(-8,-\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@in}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\thefgrulernum}}%
+\ifdim#1>.5in\put(-8,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@in}}\fi%
\end{picture}}
\def\fgruler@in@leftdown@@#1{\leavevmode\hbox{}\lower\fgruler@width\hbox{\fgruler@in@leftdown@{#1}}}
@@ -1302,23 +1478,23 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(-1,0){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(0,1){\fgruler@lentounit{\fgruler@cm@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(-1,0){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(0,1){\fgruler@cm@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{5}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(-5,0){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(0,1){\fgruler@lentounit{\fgruler@cm@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(-5,0){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(0,1){\fgruler@cm@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{10}%
-\multiput(0,0)(-10,0){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(0,1){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(-1,0){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(-10,\fgruler@lentounit{\fgruler@sep})(-10,0){\@tempdima}{\makebox(0,0)[b]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
+\multiput(0,0)(-10,0){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(0,1){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(-1,0){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}\stepcounter{fgrulernum}%
+\multiput(-10,\fgruler@sep)(-10,0){\fgruler@tempdima}{\makebox(0,0)[b]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
\def\fgruler@cm@leftup@#1{%
\setlength{\unitlength}{1mm}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{\fgruler@width})(-\fgruler@lentounit{#1},0)%
+\begin{picture}(#1,\fgruler@width)(-#1,0)%
\fgruler@cm@leftup{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(0,\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[b]{\fgruler@font@\thefgrulernum}}%
-\ifdim#1>.5cm\put(-5,\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@cm}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\thefgrulernum}}%
+\ifdim#1>.5cm\put(-5,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@cm}}\fi%
\end{picture}}
\def\fgruler@cm@leftup@@#1{\leavevmode\hbox{}\lower\fgruler@width\hbox{\fgruler@cm@leftup@{#1}}}
@@ -1329,29 +1505,29 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(-1,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(0,1){\fgruler@lentounit{\fgruler@in@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(-1,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(0,1){\fgruler@in@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{2}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(-2,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(0,1){\fgruler@lentounit{\fgruler@in@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(-2,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(0,1){\fgruler@in@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{4}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(-4,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(0,1){\fgruler@lentounit{\fgruler@in@ratio@iii\fgruler@marklth}}}}%
+\multiput(0,0)(-4,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(0,1){\fgruler@in@ratio@iii\fgruler@marklth}}}%
\fgruler@div{#1}{8}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(-8,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(0,1){\fgruler@lentounit{\fgruler@in@ratio@iv\fgruler@marklth}}}}%
+\multiput(0,0)(-8,0){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(0,1){\fgruler@in@ratio@iv\fgruler@marklth}}}%
\fgruler@div{#1}{16}%
-\multiput(0,0)(-16,0){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(0,1){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(-1,0){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(-16,\fgruler@lentounit{\fgruler@sep})(-16,0){\@tempdima}{\makebox(0,0)[b]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
+\multiput(0,0)(-16,0){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(0,1){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(-1,0){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}\stepcounter{fgrulernum}%
+\multiput(-16,\fgruler@sep)(-16,0){\fgruler@tempdima}{\makebox(0,0)[b]{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}
\def\fgruler@in@leftup@#1{%
\setlength{\unitlength}{.0625in}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{\fgruler@width})(-\fgruler@lentounit{#1},0)%
+\begin{picture}(#1,\fgruler@width)(-#1,0)%
\fgruler@in@leftup{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(0,\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[b]{\fgruler@font@\thefgrulernum}}%
-\ifdim#1>.5in\put(-8,\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@in}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\thefgrulernum}}%
+\ifdim#1>.5in\put(-8,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@in}}\fi%
\end{picture}}
\def\fgruler@in@leftup@@#1{\leavevmode\hbox{}\lower\fgruler@width\hbox{\fgruler@in@leftup@{#1}}}
@@ -1362,23 +1538,23 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,-1){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(1,0){\fgruler@lentounit{\fgruler@cm@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(0,-1){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(1,0){\fgruler@cm@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{5}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,-5){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(1,0){\fgruler@lentounit{\fgruler@cm@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(0,-5){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(1,0){\fgruler@cm@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{10}%
-\multiput(0,0)(0,-10){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(1,0){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(0,-1){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(\fgruler@lentounit{\fgruler@sep},-10)(0,-10){\@tempdima}{\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
+\multiput(0,0)(0,-10){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(1,0){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(0,-1){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}\stepcounter{fgrulernum}%
+\multiput(\fgruler@sep,-10)(0,-10){\fgruler@tempdima}{\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
\def\fgruler@cm@downright@#1{%
\setlength{\unitlength}{1mm}%
-\begin{picture}(\fgruler@lentounit{\fgruler@width},\fgruler@lentounit{#1})(0,-\fgruler@lentounit{#1})%
+\begin{picture}(\fgruler@width,#1)(0,-#1)%
\fgruler@cm@downright{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(\fgruler@lentounit{\fgruler@sep},0){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum}}}%
-\ifdim#1>.5cm\put(\fgruler@lentounit{\fgruler@sep},-5){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\fgruler@caption@cm}}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(\fgruler@sep,0){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum}}}%
+\ifdim#1>.5cm\put(\fgruler@sep,-5){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\fgruler@caption@cm}}}\fi%
\end{picture}}
\def\fgruler@cm@downright@@#1{\leavevmode\hbox{}\lower#1\hbox{\fgruler@cm@downright@{#1}}}
@@ -1389,29 +1565,29 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,-1){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(1,0){\fgruler@lentounit{\fgruler@in@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(0,-1){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(1,0){\fgruler@in@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{2}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,-2){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(1,0){\fgruler@lentounit{\fgruler@in@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(0,-2){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(1,0){\fgruler@in@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{4}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,-4){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(1,0){\fgruler@lentounit{\fgruler@in@ratio@iii\fgruler@marklth}}}}%
+\multiput(0,0)(0,-4){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(1,0){\fgruler@in@ratio@iii\fgruler@marklth}}}%
\fgruler@div{#1}{8}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,-8){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(1,0){\fgruler@lentounit{\fgruler@in@ratio@iv\fgruler@marklth}}}}%
+\multiput(0,0)(0,-8){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(1,0){\fgruler@in@ratio@iv\fgruler@marklth}}}%
\fgruler@div{#1}{16}%
-\multiput(0,0)(0,-16){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(1,0){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(0,-1){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(\fgruler@lentounit{\fgruler@sep},-16)(0,-16){\@tempdima}{\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
+\multiput(0,0)(0,-16){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(1,0){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(0,-1){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}\stepcounter{fgrulernum}%
+\multiput(\fgruler@sep,-16)(0,-16){\fgruler@tempdima}{\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
\def\fgruler@in@downright@#1{%
\setlength{\unitlength}{.0625in}%
-\begin{picture}(\fgruler@lentounit{\fgruler@width},\fgruler@lentounit{#1})(0,-\fgruler@lentounit{#1})%
+\begin{picture}(\fgruler@width,#1)(0,-#1)%
\fgruler@in@downright{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(\fgruler@lentounit{\fgruler@sep},0){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum}}}%
-\ifdim#1>.5in\put(\fgruler@lentounit{\fgruler@sep},-8){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\fgruler@caption@in}}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(\fgruler@sep,0){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum}}}%
+\ifdim#1>.5in\put(\fgruler@sep,-8){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\fgruler@caption@in}}}\fi%
\end{picture}}
\def\fgruler@in@downright@@#1{\leavevmode\hbox{}\lower#1\hbox{\fgruler@in@downright@{#1}}}
@@ -1422,23 +1598,23 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,-1){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(-1,0){\fgruler@lentounit{\fgruler@cm@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(0,-1){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(-1,0){\fgruler@cm@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{5}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,-5){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(-1,0){\fgruler@lentounit{\fgruler@cm@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(0,-5){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(-1,0){\fgruler@cm@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{10}%
-\multiput(0,0)(0,-10){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(-1,0){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(0,-1){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(-\fgruler@lentounit{\fgruler@sep},-10)(0,-10){\@tempdima}{\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
+\multiput(0,0)(0,-10){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(-1,0){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(0,-1){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}\stepcounter{fgrulernum}%
+\multiput(-\fgruler@sep,-10)(0,-10){\fgruler@tempdima}{\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
\def\fgruler@cm@downleft@#1{%
\setlength{\unitlength}{1mm}%
-\begin{picture}(\fgruler@lentounit{\fgruler@width},\fgruler@lentounit{#1})(-\fgruler@lentounit{\fgruler@width},-\fgruler@lentounit{#1})%
+\begin{picture}(\fgruler@width,#1)(-\fgruler@width,-#1)%
\fgruler@cm@downleft{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(-\fgruler@lentounit{\fgruler@sep},0){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum}}}%
-\ifdim#1>.5cm\put(-\fgruler@lentounit{\fgruler@sep},-5){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\fgruler@caption@cm}}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(-\fgruler@sep,0){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum}}}%
+\ifdim#1>.5cm\put(-\fgruler@sep,-5){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\fgruler@caption@cm}}}\fi%
\end{picture}}
\def\fgruler@cm@downleft@@#1{\leavevmode\hbox{}\lower#1\hbox{\fgruler@cm@downleft@{#1}}}
@@ -1449,29 +1625,29 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,-1){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(-1,0){\fgruler@lentounit{\fgruler@in@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(0,-1){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(-1,0){\fgruler@in@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{2}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,-2){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(-1,0){\fgruler@lentounit{\fgruler@in@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(0,-2){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(-1,0){\fgruler@in@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{4}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,-4){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(-1,0){\fgruler@lentounit{\fgruler@in@ratio@iii\fgruler@marklth}}}}%
+\multiput(0,0)(0,-4){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(-1,0){\fgruler@in@ratio@iii\fgruler@marklth}}}%
\fgruler@div{#1}{8}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,-8){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(-1,0){\fgruler@lentounit{\fgruler@in@ratio@iv\fgruler@marklth}}}}%
+\multiput(0,0)(0,-8){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(-1,0){\fgruler@in@ratio@iv\fgruler@marklth}}}%
\fgruler@div{#1}{16}%
-\multiput(0,0)(0,-16){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(-1,0){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(0,-1){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(-\fgruler@lentounit{\fgruler@sep},-16)(0,-16){\@tempdima}{\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
+\multiput(0,0)(0,-16){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(-1,0){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(0,-1){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}\stepcounter{fgrulernum}%
+\multiput(-\fgruler@sep,-16)(0,-16){\fgruler@tempdima}{\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
\def\fgruler@in@downleft@#1{%
\setlength{\unitlength}{.0625in}%
-\begin{picture}(\fgruler@lentounit{\fgruler@width},\fgruler@lentounit{#1})(-\fgruler@lentounit{\fgruler@width},-\fgruler@lentounit{#1})%
+\begin{picture}(\fgruler@width,#1)(-\fgruler@width,-#1)%
\fgruler@in@downleft{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(-\fgruler@lentounit{\fgruler@sep},0){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum}}}%
-\ifdim#1>.5in\put(-\fgruler@lentounit{\fgruler@sep},-8){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\fgruler@caption@in}}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(-\fgruler@sep,0){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum}}}%
+\ifdim#1>.5in\put(-\fgruler@sep,-8){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\fgruler@caption@in}}}\fi%
\end{picture}}
\def\fgruler@in@downleft@@#1{\leavevmode\hbox{}\lower#1\hbox{\fgruler@in@downleft@{#1}}}
@@ -1482,23 +1658,23 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,1){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(1,0){\fgruler@lentounit{\fgruler@cm@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(0,1){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(1,0){\fgruler@cm@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{5}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,5){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(1,0){\fgruler@lentounit{\fgruler@cm@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(0,5){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(1,0){\fgruler@cm@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{10}%
-\multiput(0,0)(0,10){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(1,0){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(0,1){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(\fgruler@lentounit{\fgruler@sep},10)(0,10){\@tempdima}{\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
+\multiput(0,0)(0,10){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(1,0){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(0,1){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}\stepcounter{fgrulernum}%
+\multiput(\fgruler@sep,10)(0,10){\fgruler@tempdima}{\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
\def\fgruler@cm@upright@#1{%
\setlength{\unitlength}{1mm}%
-\begin{picture}(\fgruler@lentounit{\fgruler@width},\fgruler@lentounit{#1})%
+\begin{picture}(\fgruler@width,#1)%
\fgruler@cm@upright{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(\fgruler@lentounit{\fgruler@sep},0){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum}}}%
-\ifdim#1>.5cm\put(\fgruler@lentounit{\fgruler@sep},5){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\fgruler@caption@cm}}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(\fgruler@sep,0){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum}}}%
+\ifdim#1>.5cm\put(\fgruler@sep,5){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\fgruler@caption@cm}}}\fi%
\end{picture}}
\def\fgruler@cm@upright@@#1{\leavevmode\hbox{}\lower#1\hbox{\fgruler@cm@upright@{#1}}}
@@ -1509,29 +1685,29 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,1){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(1,0){\fgruler@lentounit{\fgruler@in@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(0,1){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(1,0){\fgruler@in@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{2}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,2){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(1,0){\fgruler@lentounit{\fgruler@in@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(0,2){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(1,0){\fgruler@in@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{4}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,4){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(1,0){\fgruler@lentounit{\fgruler@in@ratio@iii\fgruler@marklth}}}}%
+\multiput(0,0)(0,4){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(1,0){\fgruler@in@ratio@iii\fgruler@marklth}}}%
\fgruler@div{#1}{8}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,8){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(1,0){\fgruler@lentounit{\fgruler@in@ratio@iv\fgruler@marklth}}}}%
+\multiput(0,0)(0,8){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(1,0){\fgruler@in@ratio@iv\fgruler@marklth}}}%
\fgruler@div{#1}{16}%
-\multiput(0,0)(0,16){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(1,0){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(0,1){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(\fgruler@lentounit{\fgruler@sep},16)(0,16){\@tempdima}{\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
+\multiput(0,0)(0,16){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(1,0){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(0,1){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}\stepcounter{fgrulernum}%
+\multiput(\fgruler@sep,16)(0,16){\fgruler@tempdima}{\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
\def\fgruler@in@upright@#1{%
\setlength{\unitlength}{.0625in}%
-\begin{picture}(\fgruler@lentounit{\fgruler@width},\fgruler@lentounit{#1})%
+\begin{picture}(\fgruler@width,#1)%
\fgruler@in@upright{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(\fgruler@lentounit{\fgruler@sep},0){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum}}}%
-\ifdim#1>.5in\put(\fgruler@lentounit{\fgruler@sep},8){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\fgruler@caption@in}}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(\fgruler@sep,0){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\thefgrulernum}}}%
+\ifdim#1>.5in\put(\fgruler@sep,8){\makebox(0,0)[l]{\fgruler@rotatebox{90}{\fgruler@font@\fgruler@caption@in}}}\fi%
\end{picture}}
\def\fgruler@in@upright@@#1{\leavevmode\hbox{}\lower#1\hbox{\fgruler@in@upright@{#1}}}
@@ -1542,23 +1718,23 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,1){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(-1,0){\fgruler@lentounit{\fgruler@cm@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(0,1){\@tempcnta}{\fgruler@ifnot@divisible@five{\fgruler@cm@thick@i\fgruler@cm@color@i\line(-1,0){\fgruler@cm@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{5}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,5){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(-1,0){\fgruler@lentounit{\fgruler@cm@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(0,5){\@tempcnta}{\fgruler@ifodd{\fgruler@cm@thick@ii\fgruler@cm@color@ii\line(-1,0){\fgruler@cm@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{10}%
-\multiput(0,0)(0,10){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(-1,0){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(0,1){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(-\fgruler@lentounit{\fgruler@sep},10)(0,10){\@tempdima}{\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
+\multiput(0,0)(0,10){\@tempcnta}{\fgruler@cm@thick@iii\fgruler@cm@color@iii\line(-1,0){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(0,1){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}\stepcounter{fgrulernum}%
+\multiput(-\fgruler@sep,10)(0,10){\fgruler@tempdima}{\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
\def\fgruler@cm@upleft@#1{%
\setlength{\unitlength}{1mm}%
-\begin{picture}(\fgruler@lentounit{\fgruler@width},\fgruler@lentounit{#1})(-\fgruler@lentounit{\fgruler@width},0)%
+\begin{picture}(\fgruler@width,#1)(-\fgruler@width,0)%
\fgruler@cm@upleft{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(-\fgruler@lentounit{\fgruler@sep},0){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum}}}%
-\ifdim#1>.5cm\put(-\fgruler@lentounit{\fgruler@sep},5){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\fgruler@caption@cm}}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(-\fgruler@sep,0){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum}}}%
+\ifdim#1>.5cm\put(-\fgruler@sep,5){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\fgruler@caption@cm}}}\fi%
\end{picture}}
\def\fgruler@cm@upleft@@#1{\leavevmode\hbox{}\lower#1\hbox{\fgruler@cm@upleft@{#1}}}
@@ -1569,29 +1745,29 @@ keepspaces]}
\fgruler@markthickness%
\fgruler@div{#1}{1}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,1){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(-1,0){\fgruler@lentounit{\fgruler@in@ratio@i\fgruler@marklth}}}}%
+\multiput(0,0)(0,1){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@i\fgruler@in@color@i\line(-1,0){\fgruler@in@ratio@i\fgruler@marklth}}}%
\fgruler@div{#1}{2}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,2){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(-1,0){\fgruler@lentounit{\fgruler@in@ratio@ii\fgruler@marklth}}}}%
+\multiput(0,0)(0,2){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@ii\fgruler@in@color@ii\line(-1,0){\fgruler@in@ratio@ii\fgruler@marklth}}}%
\fgruler@div{#1}{4}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,4){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(-1,0){\fgruler@lentounit{\fgruler@in@ratio@iii\fgruler@marklth}}}}%
+\multiput(0,0)(0,4){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iii\fgruler@in@color@iii\line(-1,0){\fgruler@in@ratio@iii\fgruler@marklth}}}%
\fgruler@div{#1}{8}%
\setcounter{fgrulernum}{0}%
-\multiput(0,0)(0,8){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(-1,0){\fgruler@lentounit{\fgruler@in@ratio@iv\fgruler@marklth}}}}%
+\multiput(0,0)(0,8){\@tempcnta}{\fgruler@ifodd{\fgruler@in@thick@iv\fgruler@in@color@iv\line(-1,0){\fgruler@in@ratio@iv\fgruler@marklth}}}%
\fgruler@div{#1}{16}%
-\multiput(0,0)(0,16){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(-1,0){\fgruler@lentounit{\fgruler@marklth}}}%
-\iffgruler@borderline\put(0,0){\line(0,1){\fgruler@lentounit{#1}}}\fi%
-\setcounter{fgrulernum}{\fgruler@startnum}\stepcounter{fgrulernum}%
-\multiput(-\fgruler@lentounit{\fgruler@sep},16)(0,16){\@tempdima}{\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
+\multiput(0,0)(0,16){\@tempcnta}{\fgruler@in@thick@v\fgruler@in@color@v\line(-1,0){\fgruler@marklth}}%
+\iffgruler@borderline\put(0,0){\line(0,1){#1}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}\stepcounter{fgrulernum}%
+\multiput(-\fgruler@sep,16)(0,16){\fgruler@tempdima}{\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum\stepcounter{fgrulernum}}}}}
\def\fgruler@in@upleft@#1{%
\setlength{\unitlength}{.0625in}%
-\begin{picture}(\fgruler@lentounit{\fgruler@width},\fgruler@lentounit{#1})(-\fgruler@lentounit{\fgruler@width},0)%
+\begin{picture}(\fgruler@width,#1)(-\fgruler@width,0)%
\fgruler@in@upleft{#1}%
-\setcounter{fgrulernum}{\fgruler@startnum}%
-\put(-\fgruler@lentounit{\fgruler@sep},0){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum}}}%
-\ifdim#1>.5in\put(-\fgruler@lentounit{\fgruler@sep},8){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\fgruler@caption@in}}}\fi%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(-\fgruler@sep,0){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\thefgrulernum}}}%
+\ifdim#1>.5in\put(-\fgruler@sep,8){\makebox(0,0)[r]{\fgruler@rotatebox{-90}{\fgruler@font@\fgruler@caption@in}}}\fi%
\end{picture}}
\def\fgruler@in@upleft@@#1{\leavevmode\hbox{}\lower#1\hbox{\fgruler@in@upleft@{#1}}}
@@ -1599,10 +1775,10 @@ keepspaces]}
%% UPPERLEFT CM
\def\fgruler@cm@upperleft@#1#2{%
\setlength{\unitlength}{1mm}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{#2})(0,-\fgruler@lentounit{#2})%
+\begin{picture}(#1,#2)(0,-#2)%
\fgruler@cm@rightdown{#1}%
\fgruler@cm@downright{#2}%
-\ifdim#1>.5cm\put(5,-\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@cm}}\fi%
+\ifdim#1>.5cm\put(5,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@cm}}\fi%
\end{picture}}
\def\fgruler@cm@upperleft@@#1#2{\leavevmode\hbox{}\lower#2\hbox{\fgruler@cm@upperleft@{#1}{#2}}}
@@ -1614,7 +1790,7 @@ keepspaces]}
\setlength{\fgruler@fg@height}{\paperheight}%
\addtolength{\fgruler@fg@height}{-#2}%
\fgruler@fgsetting%
-\AtPageLowerLeft{\put(\fgruler@lentounit{#1},0){%
+\AtPageLowerLeft{\put(#1,0){%
\fgruler@cm@upperleft@{\fgruler@fg@width}{\fgruler@fg@height}}}%
\endgroup}
@@ -1623,10 +1799,10 @@ keepspaces]}
%% UPPERLEFT IN
\def\fgruler@in@upperleft@#1#2{%
\setlength{\unitlength}{.0625in}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{#2})(0,-\fgruler@lentounit{#2})%
+\begin{picture}(#1,#2)(0,-#2)%
\fgruler@in@rightdown{#1}%
\fgruler@in@downright{#2}%
-\ifdim#1>.5in\put(8,-\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@in}}\fi%
+\ifdim#1>.5in\put(8,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@in}}\fi%
\end{picture}}
\def\fgruler@in@upperleft@@#1#2{\leavevmode\hbox{}\lower#2\hbox{\fgruler@in@upperleft@{#1}{#2}}}
@@ -1638,7 +1814,7 @@ keepspaces]}
\setlength{\fgruler@fg@height}{\paperheight}%
\addtolength{\fgruler@fg@height}{-#2}%
\fgruler@fgsetting%
-\AtPageLowerLeft{\put(\fgruler@lentounit{#1},0){%
+\AtPageLowerLeft{\put(#1,0){%
\fgruler@in@upperleft@{\fgruler@fg@width}{\fgruler@fg@height}}}%
\endgroup}
@@ -1647,10 +1823,10 @@ keepspaces]}
%% UPPERRIGHT CM
\def\fgruler@cm@upperright@#1#2{%
\setlength{\unitlength}{1mm}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{#2})(-\fgruler@lentounit{#1},-\fgruler@lentounit{#2})%
+\begin{picture}(#1,#2)(-#1,-#2)%
\fgruler@cm@leftdown{#1}%
\fgruler@cm@downleft{#2}%
-\ifdim#1>.5cm\put(-5,-\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@cm}}\fi%
+\ifdim#1>.5cm\put(-5,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@cm}}\fi%
\end{picture}}
\def\fgruler@cm@upperright@@#1#2{\leavevmode\hbox{}\lower#2\hbox{\fgruler@cm@upperright@{#1}{#2}}}
@@ -1670,10 +1846,10 @@ keepspaces]}
%% UPPERRIGHT IN
\def\fgruler@in@upperright@#1#2{%
\setlength{\unitlength}{.0625in}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{#2})(-\fgruler@lentounit{#1},-\fgruler@lentounit{#2})%
+\begin{picture}(#1,#2)(-#1,-#2)%
\fgruler@in@leftdown{#1}%
\fgruler@in@downleft{#2}%
-\ifdim#1>.5in\put(-8,-\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@in}}\fi%
+\ifdim#1>.5in\put(-8,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@in}}\fi%
\end{picture}}
\def\fgruler@in@upperright@@#1#2{\leavevmode\hbox{}\lower#2\hbox{\fgruler@in@upperright@{#1}{#2}}}
@@ -1693,10 +1869,10 @@ keepspaces]}
%% LOWERLEFT CM
\def\fgruler@cm@lowerleft@#1#2{%
\setlength{\unitlength}{1mm}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{#2})%
+\begin{picture}(#1,#2)%
\fgruler@cm@rightup{#1}%
\fgruler@cm@upright{#2}%
-\ifdim#1>.5cm\put(5,\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@cm}}\fi%
+\ifdim#1>.5cm\put(5,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@cm}}\fi%
\end{picture}}
\def\fgruler@cm@lowerleft@@#1#2{\leavevmode\hbox{}\lower#2\hbox{\fgruler@cm@lowerleft@{#1}{#2}}}
@@ -1708,7 +1884,7 @@ keepspaces]}
\setlength{\fgruler@fg@height}{\paperheight}%
\addtolength{\fgruler@fg@height}{-#2}%
\fgruler@fgsetting%
-\AtPageLowerLeft{\put(\fgruler@lentounit{#1},\fgruler@lentounit{#2}){%
+\AtPageLowerLeft{\put(#1,#2){%
\fgruler@cm@lowerleft@{\fgruler@fg@width}{\fgruler@fg@height}}}%
\endgroup}
@@ -1717,10 +1893,10 @@ keepspaces]}
%% LOWERLEFT IN
\def\fgruler@in@lowerleft@#1#2{%
\setlength{\unitlength}{.0625in}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{#2})%
+\begin{picture}(#1,#2)%
\fgruler@in@rightup{#1}%
\fgruler@in@upright{#2}%
-\ifdim#1>.5in\put(8,\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@in}}\fi%
+\ifdim#1>.5in\put(8,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@in}}\fi%
\end{picture}}
\def\fgruler@in@lowerleft@@#1#2{\leavevmode\hbox{}\lower#2\hbox{\fgruler@in@lowerleft@{#1}{#2}}}
@@ -1732,7 +1908,7 @@ keepspaces]}
\setlength{\fgruler@fg@height}{\paperheight}%
\addtolength{\fgruler@fg@height}{-#2}%
\fgruler@fgsetting%
-\AtPageLowerLeft{\put(\fgruler@lentounit{#1},\fgruler@lentounit{#2}){%
+\AtPageLowerLeft{\put(#1,#2){%
\fgruler@in@lowerleft@{\fgruler@fg@width}{\fgruler@fg@height}}}%
\endgroup}
@@ -1741,10 +1917,10 @@ keepspaces]}
%% LOWERRIGHT CM
\def\fgruler@cm@lowerright@#1#2{%
\setlength{\unitlength}{1mm}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{#2})(-\fgruler@lentounit{#1},0)%
+\begin{picture}(#1,#2)(-#1,0)%
\fgruler@cm@leftup{#1}%
\fgruler@cm@upleft{#2}%
-\ifdim#1>.5cm\put(-5,\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@cm}}\fi%
+\ifdim#1>.5cm\put(-5,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@cm}}\fi%
\end{picture}}
\def\fgruler@cm@lowerright@@#1#2{\leavevmode\hbox{}\lower#2\hbox{\fgruler@cm@lowerright@{#1}{#2}}}
@@ -1756,7 +1932,7 @@ keepspaces]}
\setlength{\fgruler@fg@height}{\paperheight}%
\addtolength{\fgruler@fg@height}{-#2}%
\fgruler@fgsetting%
-\AtPageLowerLeft{\put(0,\fgruler@lentounit{#2}){%
+\AtPageLowerLeft{\put(0,#2){%
\fgruler@cm@lowerright@{\fgruler@fg@width}{\fgruler@fg@height}}}%
\endgroup}
@@ -1765,10 +1941,10 @@ keepspaces]}
%% LOWERRIGHT IN
\def\fgruler@in@lowerright@#1#2{%
\setlength{\unitlength}{.0625in}%
-\begin{picture}(\fgruler@lentounit{#1},\fgruler@lentounit{#2})(-\fgruler@lentounit{#1},0)%
+\begin{picture}(#1,#2)(-#1,0)%
\fgruler@in@leftup{#1}%
\fgruler@in@upleft{#2}%
-\ifdim#1>.5in\put(-8,\fgruler@lentounit{\fgruler@sep}){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@in}}\fi%
+\ifdim#1>.5in\put(-8,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@in}}\fi%
\end{picture}}
\def\fgruler@in@lowerright@@#1#2{\leavevmode\hbox{}\lower#2\hbox{\fgruler@in@lowerright@{#1}{#2}}}
@@ -1780,11 +1956,138 @@ keepspaces]}
\setlength{\fgruler@fg@height}{\paperheight}%
\addtolength{\fgruler@fg@height}{-#2}%
\fgruler@fgsetting%
-\AtPageLowerLeft{\put(0,\fgruler@lentounit{#2}){%
+\AtPageLowerLeft{\put(0,#2){%
\fgruler@in@lowerright@{\fgruler@fg@width}{\fgruler@fg@height}}}%
\endgroup}
\def\fgruler@in@lowerright@fg{\fgruler@in@lowerright@fg@{\fgruler@hshift}{\fgruler@vshift}}
+
+%% UPPERLEFTT CM
+\def\fgruler@cm@upperleftT@fg{%
+\AtTextLowerLeft{%
+\setlength{\unitlength}{1mm}%
+\fgruler@fgsetting%
+\begin{picture}(\textwidth,\textheight)(0,-\textheight)%
+\fgruler@cm@rightup{\textwidth}%
+\fgruler@cm@downleft{\textheight}%
+\put(5,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@cm}}%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\thefgrulernum}}%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(-\fgruler@sep,0){\makebox(0,0)[r]{\fgruler@font@\thefgrulernum}}%
+\end{picture}}}
+
+%% UPPERLEFTT IN
+\def\fgruler@in@upperleftT@fg{%
+\AtTextLowerLeft{%
+\setlength{\unitlength}{.0625in}%
+\fgruler@fgsetting%
+\begin{picture}(\textwidth,\textheight)(0,-\textheight)%
+\fgruler@in@rightup{\textwidth}%
+\fgruler@in@downleft{\textheight}%
+\put(8,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@in}}%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\thefgrulernum}}%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(-\fgruler@sep,0){\makebox(0,0)[r]{\fgruler@font@\thefgrulernum}}%
+\end{picture}}}
+
+%% UPPERRIGHTT CM
+\def\fgruler@cm@upperrightT@fg{%
+\AtTextLowerLeft{%
+\setlength{\unitlength}{1mm}%
+\fgruler@fgsetting%
+\begin{picture}(\textwidth,\textheight)(-\textwidth,-\textheight)%
+\fgruler@cm@leftup{\textwidth}%
+\fgruler@cm@downright{\textheight}%
+\put(-5,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@cm}}%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\thefgrulernum}}%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(\fgruler@sep,0){\makebox(0,0)[l]{\fgruler@font@\thefgrulernum}}%
+\end{picture}}}
+
+%% UPPERRIGHTT IN
+\def\fgruler@in@upperrightT@fg{%
+\AtTextLowerLeft{%
+\setlength{\unitlength}{.0625in}%
+\fgruler@fgsetting%
+\begin{picture}(\textwidth,\textheight)(-\textwidth,-\textheight)%
+\fgruler@in@leftup{\textwidth}%
+\fgruler@in@downright{\textheight}%
+\put(-8,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\fgruler@caption@in}}%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,\fgruler@sep){\makebox(0,0)[b]{\fgruler@font@\thefgrulernum}}%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(\fgruler@sep,0){\makebox(0,0)[l]{\fgruler@font@\thefgrulernum}}%
+\end{picture}}}
+
+%% LOWERLEFTT CM
+\def\fgruler@cm@lowerleftT@fg{%
+\AtTextLowerLeft{%
+\setlength{\unitlength}{1mm}%
+\fgruler@fgsetting%
+\begin{picture}(\textwidth,\textheight)(0,0)%
+\fgruler@cm@rightdown{\textwidth}%
+\fgruler@cm@upleft{\textheight}%
+\put(5,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@cm}}%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\thefgrulernum}}%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(-\fgruler@sep,0){\makebox(0,0)[r]{\fgruler@font@\thefgrulernum}}%
+\end{picture}}}
+
+%% LOWERLEFTT IN
+\def\fgruler@in@lowerleftT@fg{%
+\AtTextLowerLeft{%
+\setlength{\unitlength}{.0625in}%
+\fgruler@fgsetting%
+\begin{picture}(\textwidth,\textheight)(0,0)%
+\fgruler@in@rightdown{\textwidth}%
+\fgruler@in@upleft{\textheight}%
+\put(8,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@in}}%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\thefgrulernum}}%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(-\fgruler@sep,0){\makebox(0,0)[r]{\fgruler@font@\thefgrulernum}}%
+\end{picture}}}
+
+%% LOWERRIGHTT CM
+\def\fgruler@cm@lowerrightT@fg{%
+\AtTextLowerLeft{%
+\setlength{\unitlength}{1mm}%
+\fgruler@fgsetting%
+\begin{picture}(\textwidth,\textheight)(-\textwidth,0)%
+\fgruler@cm@leftdown{\textwidth}%
+\fgruler@cm@upright{\textheight}%
+\put(-5,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@cm}}%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\thefgrulernum}}%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(\fgruler@sep,0){\makebox(0,0)[l]{\fgruler@font@\thefgrulernum}}%
+\end{picture}}}
+
+%% LOWERRIGHTT IN
+\def\fgruler@in@lowerrightT@fg{%
+\AtTextLowerLeft{%
+\setlength{\unitlength}{.0625in}%
+\fgruler@fgsetting%
+\begin{picture}(\textwidth,\textheight)(-\textwidth,0)%
+\fgruler@in@leftdown{\textwidth}%
+\fgruler@in@upright{\textheight}%
+\put(-8,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\fgruler@caption@in}}%
+\setcounter{fgrulernum}{\fgruler@startnumh}%
+\put(0,-\fgruler@sep){\makebox(0,0)[t]{\fgruler@font@\thefgrulernum}}%
+\setcounter{fgrulernum}{\fgruler@startnumv}%
+\put(\fgruler@sep,0){\makebox(0,0)[l]{\fgruler@font@\thefgrulernum}}%
+\end{picture}}}
+
+%% USER
+\def\fgruler@cm@user@fg{}
+\def\fgruler@in@user@fg{}
+\def\fgrulertype#1#2{\csname fgruler@#1@#2@fg\endcsname}
+\def\fgrulerdefusercm#1{\def\fgruler@cm@user@fg{#1}}
+\def\fgrulerdefuserin#1{\def\fgruler@in@user@fg{#1}}
% \end{macrocode}
% \Finale
\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/fgruler/fgruler.ins b/Master/texmf-dist/source/latex/fgruler/fgruler.ins
index 13ea6a1a4b0..38cac59ba0a 100644
--- a/Master/texmf-dist/source/latex/fgruler/fgruler.ins
+++ b/Master/texmf-dist/source/latex/fgruler/fgruler.ins
@@ -1,5 +1,5 @@
-% Copyright 2017- by Tibor Tomacs
+% Copyright 2017-2020 by Tibor Tomacs
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -19,7 +19,7 @@
\preamble
This is a generated file.
-Copyright 2017- by Tibor Tomacs
+Copyright 2017-2020 by Tibor Tomacs
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
diff --git a/Master/texmf-dist/source/latex/filehook/filehook.dtx b/Master/texmf-dist/source/latex/filehook/filehook.dtx
index 0cd0f633541..eee04bd9afd 100644
--- a/Master/texmf-dist/source/latex/filehook/filehook.dtx
+++ b/Master/texmf-dist/source/latex/filehook/filehook.dtx
@@ -26,15 +26,17 @@
%<*driver>
\ProvidesFile{filehook.dtx}[%
%<=*DATE>
- 2020/02/03
+ 2020/09/29
%<=/DATE>
%<=*VERSION>
- v0.7
+ v0.8a
%<=/VERSION>
Hooks for input files]
\documentclass{ydoc}
\GetFileInfo{filehook.dtx}
\usepackage{filehook}[\filedate]
+\usepackage[utf8]{inputenc}
+\usepackage[TS1,T1]{fontenc}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
@@ -55,7 +57,7 @@
%</driver>
% \fi
%
-% \CheckSum{1011}
+% \CheckSum{1494}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -98,6 +100,8 @@
% \changes{v0.5e}{2019/08/19}{Fix for new LaTeX format.}
% \changes{v0.6}{2019/10/03}{Fix for InputIfFileExists for LaTeX format 2019/10/01.}
% \changes{v0.7}{2020/02/03}{Further fixes for InputIfFileExists for LaTeX format 2019/10/01.}
+% \changes{v0.8}{2020/09/27}{Support for LaTeX format 2020/10/01.}
+% \changes{v0.8a}{2020/09/29}{Further fixes for LaTeX format 2020/10/01.}
%
% \GetFileInfo{filehook.dtx}
%
@@ -112,9 +116,24 @@
% execute code at begin or the end of specific or all input files.
% \end{abstract}
%
+% \section{Changes due to new \LaTeX\ core hooks}
+% With the \LaTeX\ release 2020/10/01 file hooks are now provided by the \LaTeX\ core. This package has been adjusted to use these hooks
+% while trying to provide the same interface and behaviour than before. Simpler usages should work without any differences but advanced
+% usages which rely on the exact hook order and position might see some unwanted changes.
+% Users should try to use the \LaTeX\ hooks instead for new documents.
+% Please see \LaTeX\ core filehook documentation
+% \href{http://mirrors.ctan.org/macros/latex-dev/base/ltfilehook-doc.pdf}{\texttt{ltfilehook-doc}} for
+% the new hook system.
+%
+% Support of other hooking systems in other packages and classes has been dropped as this package no longer installs own hooks.
+%
+% If this package is run under a \LaTeX\ release prior to 2020/10/01 the old implementation will be loaded.
+% For this switch two sub-packages \pkg{filehook-2019} and \pkg{filehook-2020} are used and loaded according to the \LaTeX\ release version.
+% Please do not load these packages directly as they might be changes or disappear on later releases.
+%
%
% \section{Introduction}
-% These package changes some internal \LaTeX{} macros used to load input files so that they include `hooks'.
+% These package (under \LaTeX\ prior 2020/10/01) changes some internal \LaTeX{} macros used to load input files so that they include `hooks'.
% A hook is an (internal) macro executed at specific points. Normally it is initially empty, but can be extended using
% an user level macro. The most common hook in \LaTeX{} is the `At-Begin-Document' hook. Code can be added to this hook
% using \Macro\AtBeginDocument{<\TeX\ code>}.
@@ -526,6 +545,37 @@
%
% \subsection{Options}
% \begin{macrocode}
+\DeclareOption{force}{\PassOptionsToPackage{force}{filehook-2019}}
+\ProcessOptions\relax
+% \end{macrocode}
+%
+% \subsection{Load actual package}
+% \begin{macrocode}
+\@ifl@t@r\fmtversion{2020/10/01}{\RequirePackage{filehook-2020}}{\RequirePackage{filehook-2019}}
+% \end{macrocode}
+%
+% \iffalse
+%</filehook.sty>
+% \fi
+%
+% \iffalse
+%<*filehook-2019.sty>
+% \fi
+% \begin{macrocode}
+%<!COPYRIGHT>
+\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+\ProvidesPackage{filehook-2019}[% filehook subpackage, do not load directly
+%<!DATE>
+%<!VERSION>
+%<*DRIVER>
+ 2099/01/01 develop
+%</DRIVER>
+ Hooks for input files]
+% \end{macrocode}
+%
+%
+% \subsection{Options}
+% \begin{macrocode}
\newif\iffilehook@force
\DeclareOption{force}{\filehook@forcetrue}
\ProcessOptions\relax
@@ -1311,7 +1361,673 @@
% \end{macrocode}
%
% \iffalse
-%</filehook.sty>
+%</filehook-2019.sty>
+% \fi
+%
+% \iffalse
+%<*filehook-2020.sty>
+% \fi
+% \begin{macrocode}
+%<!COPYRIGHT>
+\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+\ProvidesPackage{filehook-2020}[% filehook subpackage, do not load directly
+%<!DATE>
+%<!VERSION>
+%<*DRIVER>
+ 2099/01/01 develop
+%</DRIVER>
+ Hooks for input files]
+% \end{macrocode}
+%
+%
+% \subsection{Options}
+% \begin{macrocode}
+\DeclareOption{force}{}
+\ProcessOptions\relax
+% \end{macrocode}
+%
+% \subsection{General stuff}
+%
+% \subsection{Initialisation of Hooks}
+% The general hooks are initialised to call the file specific hooks.
+%
+% \begin{macro}{\filehook@csuse}
+% \begin{macrocode}
+\begingroup
+\gdef\filehook@csuse#1{\ifcsname #1\endcsname\csname #1\expandafter\endcsname\fi}
+\expandafter\ifx\csname csuse\endcsname\relax
+ \expandafter\ifx\csname ifcsname\endcsname\relax
+ \gdef\filehook@csuse#1{\expandafter\ifx\csname #1\endcsname\relax\else\csname #1\expandafter\endcsname\fi}
+ \fi
+\else
+ \global\let\filehook@csuse\csuse
+\fi
+\endgroup
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@include@atbegin}
+% \begin{macrocode}
+\def\filehook@include@atbegin#1{%
+ \filehook@csuse{\filehook@include@atbegin@#1}%
+ \filehook@include@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@include@@atbegin}
+% \begin{macrocode}
+\def\filehook@include@@atbegin{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@include@atend}
+% \begin{macrocode}
+\def\filehook@include@atend#1{%
+ \filehook@include@@atend
+ \filehook@csuse{\filehook@include@atend@#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@include@@atend}
+% \begin{macrocode}
+\def\filehook@include@@atend{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@include@after}
+% \begin{macrocode}
+\def\filehook@include@after#1{%
+ \filehook@include@@after
+ \filehook@csuse{\filehook@include@after@#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@include@@after}
+% \begin{macrocode}
+\def\filehook@include@@after{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@input@atbegin}
+% \begin{macrocode}
+\def\filehook@input@atbegin#1{%
+ \filehook@csuse{\filehook@input@atbegin@\filehook@ensureext{#1}}%
+ \filehook@input@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@input@@atbegin}
+% \begin{macrocode}
+\def\filehook@input@@atbegin{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@input@atend}
+% \begin{macrocode}
+\def\filehook@input@atend#1{%
+ \filehook@input@@atend
+ \filehook@csuse{\filehook@input@atend@\filehook@ensureext{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@input@@atend}
+% \begin{macrocode}
+\def\filehook@input@@atend{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@atbegin}
+% \begin{macrocode}
+\def\filehook@atbegin#1{%
+ \filehook@csuse{\filehook@atbegin@\filehook@ensureext{#1}}%
+ \filehook@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@@atbegin}
+% \begin{macrocode}
+\def\filehook@@atbegin{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@atend}
+% \begin{macrocode}
+\def\filehook@atend#1{%
+ \filehook@@atend
+ \filehook@csuse{\filehook@atend@\filehook@ensureext{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@@atend}
+% \begin{macrocode}
+\def\filehook@@atend{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@every@atbegin}
+% \begin{macrocode}
+\def\filehook@every@atbegin#1{%
+ \filehook@every@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@every@@atbegin}
+% \begin{macrocode}
+\def\filehook@every@@atbegin{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@every@atend}
+% \begin{macrocode}
+\def\filehook@every@atend#1{%
+ \filehook@every@@atend
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@every@@atend}
+% \begin{macrocode}
+\def\filehook@every@@atend{}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{Hook Modification Macros}
+% The following macros are used to modify the hooks, i.e.\ to prefix or append code to them.
+%
+%
+% \subsubsection*{Internal Macros}
+%
+% The macro prefixes for the file specific hooks are stored in macros to reduce the number of
+% tokens in the following macro definitions.
+% \begin{macrocode}
+\def\filehook@include@atbegin@{filehook@include@atbegin@}
+\def\filehook@include@atend@{filehook@include@atend@}
+\def\filehook@include@after@{filehook@include@after@}
+\def\filehook@input@atbegin@{filehook@input@atbegin@}
+\def\filehook@input@atend@{filehook@input@atend@}
+\def\filehook@input@after@{filehook@input@after@}
+\def\filehook@atbegin@{filehook@atbegin@}
+\def\filehook@atend@{filehook@atend@}
+\def\filehook@after@{filehook@after@}
+% \end{macrocode}
+%
+%
+% \begin{macro}{\filehook@append}
+% Uses default \LaTeX{} macro.
+% \begin{macrocode}
+\def\filehook@append{\g@addto@macro}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@appendwarg}
+% Appends code with one macro argument. The |\@tempa| intermediate step is required because of the
+% included |##1| which wouldn't correctly expand otherwise.
+% \begin{macrocode}
+\long\def\filehook@appendwarg#1#2{%
+ \begingroup
+ \toks@\expandafter{#1{##1}#2}%
+ \edef\@tempa{\the\toks@}%
+ \expandafter\gdef\expandafter#1\expandafter##\expandafter1\expandafter{\@tempa}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@prefix}
+% Prefixes code to a hook.
+% \begin{macrocode}
+\long\def\filehook@prefix#1#2{%
+ \begingroup
+ \@temptokena{#2}%
+ \toks@\expandafter{#1}%
+ \xdef#1{\the\@temptokena\the\toks@}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@prefixwarg}
+% Prefixes code with an argument to a hook.
+% \begin{macrocode}
+\long\def\filehook@prefixwarg#1#2{%
+ \begingroup
+ \@temptokena{#2}%
+ \toks@\expandafter{#1{##1}}%
+ \edef\@tempa{\the\@temptokena\the\toks@}%
+ \expandafter\gdef\expandafter#1\expandafter##\expandafter1\expandafter{\@tempa}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@addtohook}[3]{Macro which should be used to add the material to the hook}{Macro name prefix}{End of macro name (file name)}
+% The macro first expands the file name (|#3|) to flatten all included macros. An extension is added if missing, as well as the prefix.
+% All modifications of |\@tempa| are made inside a group to keep them local.
+% \begin{macrocode}
+\def\filehook@addtohook#1#2#3{%
+ \begingroup
+ \edef\@tempa{#3}%
+ \edef\@tempa{#2\filehook@ensureext{\@tempa}}%
+ \@ifundefined{\@tempa}{\global\@namedef{\@tempa}{}}{}%
+ \expandafter\endgroup
+ \expandafter#1\csname\@tempa\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection*{User Level Macros}
+% The user level macros simple use the above defined macros on the appropriate hook.
+%
+% \begin{macro}{\AtBeginOfIncludes}
+% \begin{macrocode}
+\newcommand*\AtBeginOfIncludes{%
+ \filehook@append\filehook@include@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfIncludes}
+% \begin{macrocode}
+\newcommand*\AtEndOfIncludes{%
+ \filehook@prefix\filehook@include@@atend
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AfterIncludes}
+% \begin{macrocode}
+\newcommand*\AfterIncludes{%
+ \filehook@prefix\filehook@include@@after
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfIncludeFile}
+% \begin{macrocode}
+\newcommand*\AtBeginOfIncludeFile[1]{%
+ \filehook@addtohook\filehook@append\filehook@include@atbegin@{\filehook@ensuretex{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfIncludeFile}
+% \begin{macrocode}
+\newcommand*\AtEndOfIncludeFile[1]{%
+ \filehook@addtohook\filehook@prefix\filehook@include@atend@{\filehook@ensuretex{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AfterIncludeFile}
+% \begin{macrocode}
+\newcommand*\AfterIncludeFile[1]{%
+ \filehook@addtohook\filehook@prefix\filehook@include@after@{\filehook@ensuretex{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfInputs}
+% \begin{macrocode}
+\newcommand*\AtBeginOfInputs{%
+ \filehook@append\filehook@input@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfInputs}
+% \begin{macrocode}
+\newcommand*\AtEndOfInputs{%
+ \filehook@prefix\filehook@input@@atend
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfInputFile}
+% \begin{macrocode}
+\newcommand*\AtBeginOfInputFile{%
+ \filehook@addtohook\filehook@append\filehook@input@atbegin@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfInputFile}
+% \begin{macrocode}
+\newcommand*\AtEndOfInputFile{%
+ \filehook@addtohook\filehook@prefix\filehook@input@atend@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfFiles}
+% \begin{macrocode}
+\newcommand*\AtBeginOfFiles{%
+ \filehook@append\filehook@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfFiles}
+% \begin{macrocode}
+\newcommand*\AtEndOfFiles{%
+ \filehook@prefix\filehook@@atend
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfEveryFile}
+% \begin{macrocode}
+\newcommand*\AtBeginOfEveryFile{%
+ \filehook@append\filehook@every@@atbegin
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfEveryFile}
+% \begin{macrocode}
+\newcommand*\AtEndOfEveryFile{%
+ \filehook@prefix\filehook@every@@atend
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfFile}
+% \begin{macrocode}
+\newcommand*\AtBeginOfFile{%
+ \filehook@addtohook\filehook@append\filehook@atbegin@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfFile}
+% \begin{macrocode}
+\newcommand*\AtEndOfFile{%
+ \filehook@addtohook\filehook@prefix\filehook@atend@
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\AtBeginOfClassFile}
+% \begin{macrocode}
+\newcommand*\AtBeginOfClassFile{%
+ \@ifnextchar*
+ {\AtBeginOfXFile@star\@clsextension}%
+ {\AtBeginOfXFile@normal\@clsextension}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfPackageFile}
+% \begin{macrocode}
+\newcommand*\AtBeginOfPackageFile{%
+ \@ifnextchar*
+ {\AtBeginOfXFile@star\@pkgextension}%
+ {\AtBeginOfXFile@normal\@pkgextension}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfXFile@star}[2]{extension}{name}
+% If the class or package is already loaded the code is executed right away.
+% Otherwise it is installed normally.
+% \begin{macrocode}
+\def\AtBeginOfXFile@star#1*#2{%
+ \@ifl@aded{#1}{#2}%
+ {\@firstofone}%
+ {\AtBeginOfXFile@normal{#1}{#2}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtBeginOfXFile@normal}[2]{extension}{name}
+% \begin{macrocode}
+\def\AtBeginOfXFile@normal#1#2{%
+ \AtBeginOfFile{#2.#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\AtEndOfClassFile}
+% \begin{macrocode}
+\newcommand*\AtEndOfClassFile{%
+ \@ifnextchar*
+ {\AtEndOfXFile@star\@clsextension}%
+ {\AtEndOfXFile@normal\@clsextension}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfPackageFile}
+% \begin{macrocode}
+\newcommand*\AtEndOfPackageFile{%
+ \@ifnextchar*
+ {\AtEndOfXFile@star\@pkgextension}%
+ {\AtEndOfXFile@normal\@pkgextension}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\AtEndOfXFile@star}[2]{extension}{name}
+% If the class or package is already loaded the code is executed right away.
+% Otherwise it is installed normally.
+% \begin{macrocode}
+\def\AtEndOfXFile@star#1*#2{%
+ \@ifl@aded{#1}{#2}%
+ {\@firstofone}%
+ {\AtEndOfXFile@normal{#1}{#2}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AtEndOfXFile@normal}[2]{extension}{name}
+% Note that \Macro\AtEndOfClass is identical to \Macro\AtEndOfPackage, so no
+% differentiation between classes and packages is needed here.
+% \begin{macrocode}
+\long\def\AtEndOfXFile@normal#1#2#3{%
+ \AtEndOfFile{#2.#1}{\AtEndOfPackage{#3}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClearHook}
+% Clears the hook by temporary redefining the prefix and append macros
+% to do a simple definition to empty.
+% \begin{macrocode}
+\newcommand*\ClearHook{%
+ \begingroup
+ \def\filehook@prefix##1##2{%
+ \gdef##1{}%
+ \endgroup
+ }%
+ \let\filehook@append\filehook@prefix
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{Installation of Hooks}
+% The \Macro\@input@ and \Macro\@iinput macros from |latex.ltx| are redefined to install the hooks.
+%
+% \begin{macro}{\@input@}
+% This macro is redefined for the \Macro\include file hooks.
+% Checks if the next command is \Macro\clearpage which indicates that we are inside \Macro\@include.
+% If so the hooks are installed, otherwise the original macro is used unchanged.
+% For the `after' hook an own \Macro\clearpage is inserted and the original one is gobbled.
+%
+% \begin{macrocode}
+\def\DEPRECATED@input@#1{%
+ \@ifnextchar\clearpage
+ {%
+ \filehook@every@atbegin{#1}%
+ \filehook@include@atbegin{#1}%
+ \filehook@orig@@input@{#1}%
+ \filehook@include@atend{#1}%
+ \clearpage
+ \filehook@include@after{#1}%
+ \filehook@every@atend{#1}%
+ \@gobble
+ }%
+ {\filehook@orig@@input@{#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@iinput}
+% This macro is redefined for the \Macro\input file hooks.
+% it simply surrounds the original macro with the hooks.
+% \begin{macrocode}
+\def\filehook@@iinput#1{%
+ \filehook@every@atbegin{#1}%
+ \filehook@input@atbegin{#1}%
+ \filehook@orig@@iinput{#1}%
+ \filehook@input@atend{#1}%
+ \filehook@every@atend{#1}%
+}
+%\let\@iinput\filehook@@iinput
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@ensureext}
+% This macro ensures the existence of a file name extension. If non is given `|.tex|' is
+% added.
+% \begin{macrocode}
+\def\filehook@ensureext#1{%
+ \expandafter\filehook@@ensureext#1\empty.tex\empty\empty
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@@ensureext}
+% \begin{macrocode}
+\def\filehook@@ensureext#1.#2\empty#3\empty{#1.#2}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\filehook@ensuretex}
+% Ensures a `|.tex|' extension, i.e. adds it if missing, even if there is a different one.
+% \begin{macrocode}
+\def\filehook@ensuretex#1{%
+ \expandafter\filehook@@ensuretex#1\empty.tex\empty\empty
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@@ensuretex}
+% \begin{macrocode}
+\def\filehook@@ensuretex#1.tex\empty#2\empty{#1.tex}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@set@CurrentFile}
+% \begin{macrocode}
+\def\filehook@set@CurrentFile{%
+ \edef\filehook@CurrentFile{%
+ \ifx\CurrentFilePath\empty
+ \else
+ \CurrentFilePath/%
+ \fi
+ \CurrentFile
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Hook}
+% \begin{macrocode}
+\AddToHook{include/before}{%
+ \filehook@set@CurrentFile
+ \filehook@include@atbegin{\filehook@CurrentFile}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Hook}
+% \begin{macrocode}
+\AddToHook{include/end}{%
+ \filehook@set@CurrentFile
+ \filehook@include@atend{\filehook@CurrentFile}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Hook}
+% \begin{macrocode}
+\AddToHook{include/after}{%
+ \filehook@set@CurrentFile
+ \filehook@include@after{\filehook@CurrentFile}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@istexfile}
+% \begin{macrocode}
+\begingroup
+\edef\dottex{\expandafter\expandafter\expandafter\@gobble\expandafter\string\csname.tex\endcsname}
+\expandafter
+\gdef\expandafter\filehook@istexfile\expandafter#\expandafter1\expandafter{%
+ \expandafter\expandafter\expandafter\filehook@istexfile@\expandafter#\expandafter1\expandafter\empty\dottex\empty\empty\@nil
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\filehook@istexfile@}
+% \begin{macrocode}
+\expandafter\gdef\expandafter\filehook@istexfile@\expandafter#\expandafter1\dottex\empty#2\empty#3\@nil{%
+ \begingroup
+ \def\@tempa{#2}%
+ \ifx\@tempa\empty
+ \endgroup
+ \expandafter\@secondoftwo
+ \else
+ \endgroup
+ \expandafter\@firstoftwo
+ \fi
+}
+\endgroup
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\Hook}
+% \begin{macrocode}
+\AddToHook{file/before}{%
+ \filehook@set@CurrentFile
+ \filehook@every@atbegin{\filehook@CurrentFile}%
+ \filehook@istexfile\filehook@CurrentFile{\filehook@input@atbegin{\filehook@CurrentFile}}{}%
+ \filehook@atbegin{\filehook@CurrentFile}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Hook}
+% \begin{macrocode}
+\AddToHook{file/after}{%
+ \filehook@set@CurrentFile
+ \filehook@atend{\filehook@CurrentFile}%
+ \filehook@istexfile\filehook@CurrentFile{\filehook@input@atend{\filehook@CurrentFile}}{}%
+ \filehook@every@atend{\filehook@CurrentFile}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \iffalse
+%</filehook-2020.sty>
% \fi
%
% \iffalse
diff --git a/Master/texmf-dist/source/latex/filehook/filehook.ins b/Master/texmf-dist/source/latex/filehook/filehook.ins
index 0d381c3b77a..baead816375 100644
--- a/Master/texmf-dist/source/latex/filehook/filehook.ins
+++ b/Master/texmf-dist/source/latex/filehook/filehook.ins
@@ -5,6 +5,8 @@
\askforoverwritefalse
\generate{%
\file{filehook.sty}{\nopreamble\from{filehook.dtx}{filehook.sty}}%
+ \file{filehook-2019.sty}{\nopreamble\from{filehook.dtx}{filehook-2019.sty}}%
+ \file{filehook-2020.sty}{\nopreamble\from{filehook.dtx}{filehook-2020.sty}}%
\file{filehook-scrlfile.sty}{\nopreamble\from{filehook.dtx}{filehook-scrlfile.sty}}%
\file{filehook-memoir.sty}{\nopreamble\from{filehook.dtx}{filehook-memoir.sty}}%
\file{filehook-listings.sty}{\nopreamble\from{filehook.dtx}{filehook-listings.sty}}%
diff --git a/Master/texmf-dist/source/latex/firstaid/firstaid.ins b/Master/texmf-dist/source/latex/firstaid/firstaid.ins
new file mode 100644
index 00000000000..9965480f207
--- /dev/null
+++ b/Master/texmf-dist/source/latex/firstaid/firstaid.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) 2020
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file is part of the Standard LaTeX `First Aid 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 `First Aid Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\input docstrip
+
+\keepsilent
+
+\usedir{tex/latex/firstaid}
+
+\preamble
+
+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) 2020
+The LaTeX3 Project and any individual authors listed elsewhere
+in this file.
+
+This file was generated from file(s) of the Standard LaTeX `First Aid 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
+`First Aid Bundle'. You may however distribute the LaTeX `First Aid Bundle'
+without such generated files.
+
+\endpreamble
+
+
+\generate{\file{latex2e-first-aid-for-external-files.ltx}
+ {\from{latex2e-first-aid-for-external-files.dtx}{kernel}}}
+
+\generate{\file{filehook-ltx.sty}
+ {\from{latex2e-first-aid-for-external-files.dtx}{filehook}}}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/firstaid/latex2e-first-aid-for-external-files.dtx b/Master/texmf-dist/source/latex/firstaid/latex2e-first-aid-for-external-files.dtx
new file mode 100644
index 00000000000..9dcedaf4359
--- /dev/null
+++ b/Master/texmf-dist/source/latex/firstaid/latex2e-first-aid-for-external-files.dtx
@@ -0,0 +1,411 @@
+% \iffalse meta-comment
+%
+%% File: latex2e-first-aid-for-external-files.dtx (C) Copyright 2020
+%% The LaTeX Project and any individual authors listed elsewhere
+%% in this file.
+%
+% 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".
+%
+%
+%
+%<*driver>
+\documentclass{ltxdoc}
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{latex2e-first-aid-for-external-files.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \providecommand\pkg[1]{\texttt{#1}}
+%
+% \title{First aid for external files and packages that need updating}
+% \author{Frank Mittelbach, \LaTeX{} Project}
+%
+% \maketitle
+%
+%
+% \begin{abstract}
+% This file contains some first aid for packages or classes that
+% require updates because of internal changes to \LaTeX{} but that
+% aren't yet reflected in the package/class code.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% Over the years package writers have hooked into
+% various parts of internal \LaTeX{} commands (largely because
+% proper interfaces were missing in important places) and if
+% we are now gradually adding such interfaces these internal
+% commands do change and as a result patching into them stops
+% working.
+%
+% As part of making such internal changes the \LaTeX{} Project team
+% attempts to check for such usage in packages, alert the package
+% maintainers and ensures that the packages get updated alongside
+% the core \LaTeX{} system. However it is not always possible to
+% get packages that will fail with a new kernel updated in time and
+% if that is the case we try to provide a temporary fix in this
+% file for them.
+% Once the package gets updated the fix will then be removed again.
+%
+% For that reason, it is put into a separate bundle so that we can
+% update it easily without requiring the CTAN maintainers to
+% install a new full LaTeX system just because we take out (or add)
+% a fix for a package here.
+%
+% In the best case scenario the file documented here should be
+% empty. In practice it will probably always contain one or the
+% other fix while we are waiting for the package to get updated.
+%
+% \begin{quote} \textbf{Important notice:} The fixes provided here
+% are not meant to be a permanent solution, but are only provided
+% to support the transition period. They are (usually) neither
+% complete nor necessarily the best solution! Furthermore, as they
+% are done from the ``outside'', they usually add some burden and
+% slow down \LaTeX{} processing, even if the package/class is not
+% used in the document.
+%
+% We will therefore remove such code as soon as possible
+% again. In practice this means that if some package never gets
+% updated/corrected, then it will eventually fail to work, because
+% after one or at most two \LaTeX{} releases we will take out the
+% transition code to ensure that this ``first aid patching''
+% doesn't get out of bounds.
+% \end{quote}
+%
+% \subsection{Minor kernel fixes}
+%
+% If we encounter issues with the kernel code that should get fixed
+% before the next main release we normally generate a patch release
+% for \LaTeX{}. However, depending on the complexity of the fix we
+% might first add the fix here and generate a full patch release
+% only when a number of such issues have accumulated. This way we
+% lessen the impact on CTAN maintainers because for each tach
+% release we have to make and distribute also a matching
+% development release.
+%
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+%
+% This file is meant to be loaded during format generation which is
+% why we give it the extension \texttt{.ltx}.
+% \begin{macrocode}
+%<*kernel>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\LaTeXFirstAidDate{2020/12/14}
+\def\LaTeXFirstAidVersion{v1.0i}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ProvidesFile{latex2e-first-aid-for-external-files.ltx}
+ [\LaTeXFirstAidDate\space \LaTeXFirstAidVersion\space
+ LaTeX kernel fixes to external files and packages]
+% \end{macrocode}
+ %
+
+% \begin{macro}{\FirstAidNeededT}
+% This is a very simple help to ensure that we only apply first aid
+% to an unmodified package or class. It only works in the case the
+% file has already been loaded and the csname \cs{ver@\#1.\#2} got
+% defined (holding the current date, version, and short description
+% info). We then compare its content to a frozen string and make
+% the modification \verb=#3= only if both agree. If they differ we
+% assume that the package/class in question got updated by its
+% maintainer.
+% \begin{macrocode}
+\ExplSyntaxOn
+\cs_new:Npn\FirstAidNeededT#1#2#3{
+ \exp_args:Nc\str_if_eq:onT{ver@#1.#2}{#3}
+}
+\ExplSyntaxOff
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</kernel>
+% \end{macrocode}
+%
+%
+% \subsection{The \pkg{filehook} package first aid}
+%
+% The \pkg{filehook} package implements hooks into file loading
+% commands. These days this is already provided by the kernel
+% albeit not with the same user interface. Until that package gets
+% updated (to use the kernel interfaces) we provide a
+% substitution. This does not offer all hooks from \pkg{filehook}
+% but all that have been used in packages available in \TeX{} Live.
+%
+% Note that this doesn't fix \pkg{currfile} because that package
+% uses \pkg{filehook} but relies on the internals of the old
+% implementation.
+%
+% The package has now got an update so we aren't activating the
+% first aid. However, at the moment it basically bypasses the new
+% hook mechanism and puts the old hooks in thereby disabling, for
+% example, the possibility to re-order code through rules.
+%
+% We therefore keep \texttt{filehook-ltx.sty} around as a guideline
+% for further updates.
+%
+% Replacing \pkg{filehook} with a leaner version would then work
+% like this:
+% \begin{macrocode}
+%<*kernel>
+%\declare@file@substitution{filehook.sty}{filehook-ltx.sty}
+%</kernel>
+% \end{macrocode}
+%
+% What follows is a simplified (partial) implementation of the \pkg{filehook}
+% interfaces.
+% Not implemented are:
+%\begin{verbatim}
+% \AtBeginOfFiles \AtEndOfFiles
+% \AtBeginOfInputs \AtEndOfInputs
+% \AtBeginOfInputFile \AtEndOfInputFile
+%\end{verbatim}
+%
+% \begin{macrocode}
+%<*filehook>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtBeginOfEveryFile [1]
+ {\AddToHook{file/before}{#1}}
+\newcommand\AtEndOfEveryFile [1]
+ {\AddToHook{file/after}{#1}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtBeginOfIncludes [1]
+ {\AddToHook{include/before}{#1}}
+\newcommand\AtEndOfIncludes [1]
+ {\AddToHook{include/end}{#1}}
+\newcommand\AfterIncludes [1]
+ {\AddToHook{include/after}{#1}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtBeginOfPackages [1]
+ {\AddToHook{package/before}{#1}}
+\newcommand\AtEndOfPackages [1]
+ {\AddToHook{package/after}{#1}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtBeginOfClasses [1]
+ {\AddToHook{class/before}{#1}}
+\newcommand\AtEndOfClasses [1]
+ {\AddToHook{class/after}{#1}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtBeginOfFile [2]
+ {\AddToHook{file/before/#1}{#2}}
+\newcommand\AtEndOfFile [2]
+ {\AddToHook{file/after/#1}{#2}}
+% \end{macrocode}
+%
+% Some commands offered a starred form
+% \begin{macrocode}
+\DeclareDocumentCommand \AtBeginOfPackageFile {smm}
+ {\IfBooleanTF{#1}%
+ {\@ifpackageloaded{#2}%
+ {#3}%
+ {\AddToHook{package/before/#2}{#3}}}%
+ {\AddToHook{package/before/#2}{#3}}%
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareDocumentCommand \AtEndOfPackageFile {smm}
+ {\IfBooleanTF{#1}%
+ {\@ifpackageloaded{#2}%
+ {#3}%
+ {\AddToHook{package/after/#2}{#3}}}%
+ {\AddToHook{package/after/#2}{#3}}%
+ }
+% \end{macrocode}
+%
+% Are the * forms here of any use? I know they are use 3--4 times
+% on CTAN but I wonder if those are real or mistaken usages.
+% \begin{macrocode}
+\DeclareDocumentCommand \AtBeginOfClassFile {smm}
+ {\IfBooleanTF{#1}%
+ {\@ifclassloaded{#2}%
+ {#3}%
+ {\AddToHook{class/before/#2}{#3}}}%
+ {\AddToHook{class/before/#2}{#3}}%
+ }
+\DeclareDocumentCommand \AtEndOfClassFile {smm}
+ {\IfBooleanTF{#1}%
+ {\@ifclassloaded{#2}%
+ {#3}%
+ {\AddToHook{class/after/#2}{#3}}}%
+ {\AddToHook{class/after/#2}{#3}}%
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtBeginOfIncludeFile [2]
+ {\AddToHook{include/before/#1}{#2}}
+\newcommand\AtEndOfIncludeFile [2]
+ {\AddToHook{include/end/#1}{#2}}
+\newcommand\AfterIncludeFile [2]
+ {\AddToHook{include/after/#1}{#2}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</filehook>
+% \end{macrocode}
+%
+%
+%
+%
+% \subsection{The \pkg{bidi} package first aid}
+%
+% The \pkg{bidi} package adds a lot of hooks in various places and
+% those added to \cs{document} and \cs{enddocument} are now no
+% longer necessary as the kernel already provides the right hooks
+% there.
+%
+% However, we aren't trying to change that but instead only make
+% sure that the existing patches still work by adding some first
+% aid after \pkg{biditools} has been loaded.
+%
+% If the package gets updated one can easily take that out simply
+% through
+%\begin{verbatim}
+% \RemoveFromHook{file/after/biditools.sty}[firstaid]
+%\end{verbatim}
+% This makes it easy to test new bidi code while the first aid code
+% is still in the kernel.
+%
+% \begin{macrocode}
+%<*kernel>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\AddToHook{file/after/biditools.sty}[firstaid]{%
+ \FirstAidNeededT{biditools}{sty}%
+ {2020/05/13 v2 Programming tools for bidi package}%
+ {
+% \end{macrocode}
+% \pkg{bidi} adds some code to the beginning of \cs{document} which
+% contains \cs{endgroup} and \cs{begingroup} which is no longer
+% correct.
+%
+% Patching \cs{document} using \cs{bidi@patchcmd} doesn't work so
+% we take the extra groups out by hand:
+% \begin{macrocode}
+ \def\firstaid@bidi@document@patch
+ \endgroup#1\begingroup#2\firstaid@bidi@document@patch
+ {\unexpanded{#1#2}}%
+ \edef\document{\expandafter\firstaid@bidi@document@patch\document
+ \firstaid@bidi@document@patch}%
+% \end{macrocode}
+% There are also some patches into \cs{enddocument}, some continue
+% to go in but one fails, so we add that now into the right place.
+% \begin{macrocode}
+ \AddToHook{enddocument/info}%
+ {\let\bidi@AfterEndDocumentCheckLabelsRerun\@firstofone
+ \bidi@afterenddocumentchecklabelsrerunhook}%
+ }
+}
+% \end{macrocode}
+%
+%
+%
+% \subsection{The \pkg{dinbrief} class first aid}
+%
+% Again a case of a no longer correct \cs{endgroup} in document.
+% Here the fix is simply though.
+% \begin{macrocode}
+\AddToHook{file/after/dinbrief.cls}[firstaid]{%
+ \FirstAidNeededT{dinbrief}{cls}{2000/03/02 LaTeX2e class}%
+ {\AddToHook{env/document/begin}{\begingroup}}%
+}
+% \end{macrocode}
+%
+%
+%
+%
+% \subsection{The \pkg{pgfpages} and \pkg{pgfmorepages} first aid}
+%
+% \pkg{pgfpages} alters the \cs{shipout} primitive to support
+% multiple page up scenarios. If used together with \pkg{atbegshi}
+% that worked because the alterations done by \pkg{atbegshi} came
+% later and so used the new definition provide by
+% \pkg{pgfpages}. Now that the code from \pkg{atbegshi} is already
+% in the kernel this further redefinition doesn't happen with the
+% result that the change to \cs{shipout} comes to late and
+% breaks the kernel processes.
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+\AddToHook{file/after/pgfpages.sty}[firstaid]{%
+% \end{macrocode}
+% Undo overwriting \cs{shipout}:
+% \begin{macrocode}
+ \cs_gset_eq:NN \shipout \pgfpages@originalshipout
+% \end{macrocode}
+% Instead overwrite the L3 programming layer name of the
+% primitive. This is really an absolute no-go, but for now the
+% simplest solution to keep the original code running.
+%
+% It will be replaced when the ``configuration points'' interface
+% for \LaTeX{} becomes available. At that point the package will be
+% able to set up a different strategy for doing shipouts and
+% without the need to overrite a primitive (which it did in the
+% past and which we do below) and then this code here can be taken
+% out again.
+% \begin{macrocode}
+ \cs_set_eq:NN \pgfpages@originalshipout \tex_shipout:D
+ \cs_set_eq:NN \tex_shipout:D \pgfpages@interceptshipout
+}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% Same issue with \pkg{pgfmorepages} but slightly different implementation (sigh).
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+\AddToHook{file/after/pgfmorepages.sty}[firstaid]{
+ \cs_set_nopar:Npn \pgfhookintoshipout {
+ \cs_set_eq:NN \pgfpages@originalshipout \tex_shipout:D
+ \cs_set_eq:NN \tex_shipout:D \pgfpages@interceptshipout
+ }
+}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+%
+% \subsection[Temporary fixes for the kernel (until the next
+% patch-level release)]
+% {Temporary fixes for the kernel \\
+% (until the next patch-level release)}
+%
+%
+% \begin{macrocode}
+%</kernel>
+% \end{macrocode}
+%
+% \Finale
+%
diff --git a/Master/texmf-dist/source/latex/flippdf/flippdf.dtx b/Master/texmf-dist/source/latex/flippdf/flippdf.dtx
index a285e1b097b..f9cd023d867 100644
--- a/Master/texmf-dist/source/latex/flippdf/flippdf.dtx
+++ b/Master/texmf-dist/source/latex/flippdf/flippdf.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 2006
+% Copyright 2006, 2020
% Sergio Callegari <sergio.callegari@gmail.com>
%
% ---------------------------------------------
@@ -8,25 +8,26 @@
% a contribution to the LaTeX2e system.
% ---------------------------------------------
%
-% It may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License, either version 1.3 of this licence, or
-% any later version. The latest version of this license is at
-% http://www.latex-project.org/lppl.txt and version 1.3 is part
-% of all distributions of LaTeX version 2003/06/01 or later.
-%
-% This work has the LPPL maintenance status "author-maintained".
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, version 1.3c.
+% This license is in
+% https://www.latex-project.org/lppl/lppl-1-3c/
+% and is part of all distributions of LaTeX later than
+% 2008-05-04.
+%
+% This work has the LPPL maintenance status "maintained".
%
-% This program consists of the files listed in the README file
+% This program consists of the files listed in the README.md file
% included in the package.
%
%<*driver>
\documentclass{ltxdoc}
-\usepackage{mathptmx, helvet, courier}
+\usepackage{mathptmx}
+\usepackage[scaled=0.92]{helvet}
+\usepackage{hologo}
+\usepackage[T1]{fontenc}
+\usepackage{hypdoc}
\EnableCrossrefs
-\DoNotIndex{\NeedsTeXFormat,\ProcessOptions}
-\DoNotIndex{\def,\gdef,\let,\newcommand}
-\DoNotIndex{\ProvidesPackage,\RequirePackage,\DeclareOption,\endinput}
-\DoNotIndex{\ifx,\fi,\paperwidth,\space,\strip@pt,\newif}
\CodelineIndex
\RecordChanges
\begin{document}
@@ -36,12 +37,24 @@
%
% \fi
%
-% \CheckSum{23}
+% \DoNotIndex{\NeedsTeXFormat, \documentclass}
+% \DoNotIndex{\begin, \end}
+% \DoNotIndex{\def, \gdef, \let, \newcommand}
+% \DoNotIndex{\ProvidesPackage, \RequirePackage, \usepackage, \PackageError}
+% \DoNotIndex{\DeclareOption, \ProcessOptions}
+% \DoNotIndex{\ifx, \fi, \newif, \else}
+% \DoNotIndex{\paperwidth, \space, \strip@pt}
+% \DoNotIndex{\maketitle, \title, \lipsum}
+% \DoNotIndex{\thispagestyle, \relax, \setcounter, \Large, \clearpage, \bigskip}
+% \DoNotIndex{\@ifundefined, \AtBeginDocument, \endinput, \MessageBreak}
+% \DoNotIndex{\PackageWarningNoLine}
+
+% \CheckSum{86}
%
% \def\filename{flippdf.dtx}
-% \def\fileversion{1.0}
-% \def\filedate{2006/06/30}
-% \def\docdate{2006/06/30}
+% \def\fileversion{2.0b}
+% \def\filedate{2020/10/27}
+% \def\docdate{2020/10/27}
%
% \newcommand*{\Lpack}[1]{\textsf {#1}} ^^A typeset a package
% \newcommand*{\Lopt}[1]{\textsf {#1}} ^^A typeset an option
@@ -63,30 +76,32 @@
% \maketitle
%
% \begin{abstract}
-% The \Lpack{pdfflip} package extends pdf\LaTeX\ making it possible
-% to typeset a ``mirrored'' version of the document. This is
-% sometimes required by publishers who want ``camera-ready''
-% documents to be printable on transparent films, so that one reads
-% the pages correctly by looking \emph{through} the film (i.e., with
-% the \emph{unprinted} side of the film towards his eyes. This
-% package requires \Lpack{everypage} by the same author and works
-% with pdf\LaTeX\ only.
+% The \Lpack{pdfflip} package extends \hologo{pdfLaTeX} and
+% \hologo{LuaLaTeX} making it possible to typeset a ``mirrored'' version
+% of the document. This is sometimes required by publishers who use
+% photographic printing processes that need ``camera-ready'' documents
+% to be printable on transparent films, so that one reads the pages
+% correctly by looking \emph{through} the film with the \emph{unprinted}
+% side of the film towards his eyes. This package requires
+% \Lpack{everypage} by the same author and works exclusively with
+% \hologo{pdfLaTeX} and \hologo{LuaLaTeX} in PDF output mode.
% \end{abstract}
%
% \section{Introduction}
%
-% This \LaTeX\ package makes it possible to typeset a document
-% horizontally flipping its pages. This is sometimes required by
-% publishers who want ``camera-ready'' documents to be printable on
-% transparent films, so that one reads the pages correctly by looking
-% \emph{through} the film (i.e., with the \emph{unprinted} side of the
-% film towards his eyes.
+% This \LaTeX\ package makes it possible to typeset a document flipping
+% its pages horizontally. This is sometimes required by publishers who use
+% photographic printing process that need ``camera-ready'' documents to be
+% printable on transparent films, so that one reads the pages correctly by
+% looking \emph{through} the film (i.e., with the \emph{unprinted} side of
+% the film towards his eyes).
%
% It is also possible to activate the mirroring capability on a page
% by page basis.
%
% This package requires \Lpack{everypage} by the same author and works
-% with pdf\LaTeX\ only.
+% exclusively with \hologo{pdfLaTeX} and \hologo{LuaLaTeX} in PDF output
+% mode.
%
% \section{User interface}
% By default, once loaded as:
@@ -101,29 +116,228 @@
% \end{quote}
% The package is loaded but remains inactive.
%
-% \DescribeMacro{\FlipPDF}\DescribeMacro{\UnFlipPDF}
-% The |\FlipPDF| command lets one switch on page flipping. Conversely,
-% |\UnFlipPDF| switches off page flipping.
-%
+% \DescribeMacro{\FlipPDF} The |\FlipPDF| command lets one switch on page
+% flipping. Conversely, \DescribeMacro{\UnFlipPDF}|\UnFlipPDF| switches
+% off page flipping.
+%
+%
+% \section{Examples}
+% \subsection{Plain case}
+% In this example, every page of the document is flipped, relying on the
+% automatic operation mode of the package.
+% \iffalse
+%<*test-1>
+% \fi
+% \begin{macrocode}
+\documentclass[a4paper]{article}
+\usepackage{flippdf}
+\usepackage{lipsum}
+
+\title{Test document for the flippdf package}
+
+\begin{document}
+\maketitle
+\lipsum[1-5]
+\end{document}
+% \end{macrocode}
+% \iffalse
+%</test-1>
+% \fi
+%
+% \subsection{Case with activation and deactivation}
+% In this example, the page flipping is manually activated and deactivated.
+% \iffalse
+%<*test-2>
+% \fi
+% \begin{macrocode}
+\documentclass[a4paper]{article}
+\usepackage[off]{flippdf}
+\usepackage{lipsum}
+
+\title{Test document for the flippdf package}
+
+\begin{document}
+
+\thispagestyle{empty}
+{\Large Some non-mirrored initial info}
+
+\bigskip
+
+\lipsum[1]
+
+\maketitle
+\setcounter{page}{1}
+\FlipPDF
+\lipsum[2-6]
+
+\clearpage
+\UnFlipPDF
+\thispagestyle{empty}
+{\Large Some non-mirrored final info}
+
+\bigskip
+
+\lipsum[7]
+\end{document}
+% \end{macrocode}
+% \iffalse
+%</test-2>
+% \fi
+%
+% \section{Package redesign}
+%
+% Until Fall 2020, \Lpack{flippdf} relied on package \Lpack{everypage} for
+% its operation. Recently, functionalities similar to those offered by
+% \Lpack{everypage} have been incorporated into \hologo{LaTeX} and
+% \Lpack{everypage} has been deprecated, maintaining support for it just
+% in view of compatibility for legacy packages still relying on it. As a
+% consequence, \Lpack{flippdf} has been redesigned to take advantage of the
+% new \hologo{LaTeX} features and to drop the dependence on
+% \Lpack{everypage}.
+%
+% Version 2.0 of \Lpack{flippdf} is the result of the redesign. Version
+% 1.x remains availabe las \Lpack{flippdf-1x} and modern \Lpack{flippdf}
+% knows how to fallback on it when used on a \hologo{LaTeX} format missing
+% the new features.
+%
% \StopEventually {}
-%
+%
% \section{Implementation}
%
-% Announce the name and version of the package, which requires
-% \LaTeXe (actually pdfLaTeX).
+% \subsection{Implementation of \Lpack{flippdf}}
+%
+% \iffalse
+%<*flippdf>
+% \fi
+% \changes{R2.0}{2020/10/18}{Use modern \hologo{LaTeX} features.}%
+% Announce the name and version of the package, that requires
+% \hologo{LaTeX2e} (actually \hologo{pdfLaTeX} or \hologo{LuaLaTeX}).
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{flippdf}%
- [2006/06/30 1.0 Horizontal flipping of pages with pdfLaTeX]
+ [2020/10/27 R2.0b Horizontal flipping of pages with pdfLaTeX]
% \end{macrocode}
-%
-% Reminds the dependence on \Lpack{everypage}.
+% \changes{R2.0b}{2020/10/27}{Assure that options are passed to
+% \Lpack{flippdf-1x} when the old code is used.}
+% Depending on the actual functionalities provided by \hologo{LaTeX}
+% consider loading \Lpack{flippdf-1x}. If so doing, warn about this,
+% and hand over the operation to that package.
+% \begin{macrocode}
+\@ifundefined{AddToHook}{%
+ \PackageWarningNoLine{flippdf}{%
+ You appear to be running a version of LaTeX\MessageBreak
+ unsupported by current flippdf.\MessageBreak
+ Forcing fallback to `flippdf-1x` that\MessageBreak
+ uses an older code base}%
+ \RequirePackageWithOptions{flippdf-1x}%
+ \endinput}{}
+% \end{macrocode}
+% State package requirements, including \Lpack{iftex}
+% \begin{macrocode}
+\RequirePackage{iftex}
+% \end{macrocode}
+% Error out if not working in PDF mode
% \begin{macrocode}
-\RequirePackage{everypage}
+\AtBeginDocument{%
+ \ifpdf
+ \relax
+ \else
+ \PackageError{flippdf}{%
+ package only works in pdf output mode.}%
+ \fi}
% \end{macrocode}
+%
% \begin{macro}{\if@sc@flippdf}
+% Define a boolean variable to remember if pages are to be flipped or
+% not.
+% \begin{macrocode}
+\newif\if@sc@flippdf
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\FlipPDF}\begin{macro}{\UnFlipPDF}
+% Define the commands used to switch on and off the horizontal
+% flipping of the document pages.
+% \begin{macrocode}
+\newcommand\FlipPDF{\@sc@flippdftrue}
+\newcommand\UnFlipPDF{\@sc@flippdffalse}
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% By default activate the flipping:
+% \begin{macrocode}
+\FlipPDF
+% \end{macrocode}
+%
+% Set up the processing of options:
+% \begin{macrocode}
+\DeclareOption{off}{\UnFlipPDF}
+\ProcessOptions
+% \end{macrocode}
%
-% Defines a boolean variable to remember if pages are to be flipped or
+% And eventually, tell \hologo{LaTeX} to flip every page, by using the
+% \Lpack{everypage} hook. First consider the case when running in
+% \hologo{pdfLaTeX}
+% \begin{macrocode}
+\ifpdftex
+ \AddToHook{shipout/background}{%
+ \if@sc@flippdf
+ \pdfliteral direct {-1 0 0 1 \strip@pt\paperwidth\space 0 cm}%
+ \fi}%
+\fi
+% \end{macrocode}
+% Then consider the case when running in \hologo{LuaLaTeX}
+% \changes{R1.1}{2020/10/17}{Extend package to work also with
+% \hologo{LuaLaTeX}.}
+% \begin{macrocode}
+\ifluatex
+ \AddToHook{shipout/background}{%
+ \if@sc@flippdf
+ \pdfextension literal direct {%
+ -1 0 0 1 \strip@pt\paperwidth\space 0 cm}%
+ \fi}%
+\fi
+% \end{macrocode}
+% \iffalse
+%</flippdf>
+% \fi
+
+
+% \subsection{Implementation of \Lpack{flippdf-1x}}
+% \iffalse
+%<*flippdf-1x>
+% \fi
+% Announce the name and version of the package, that requires
+% \hologo{LaTeX2e} (actually \hologo{pdfLaTeX} or \hologo{LuaLaTeX}).
+% \changes{R1.0b}{2020/10/11}{%
+% Require \Lpack{everypage} package to be at least at its 2007/06/20 (R1.1)
+% release.}
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{flippdf-1x}%
+ [2020/10/17 1.1 Horizontal flipping of pages with pdfLaTeX]
+% \end{macrocode}
+%
+% Assure that the dependence on \Lpack{everypage} is satisfied.
+% \begin{macrocode}
+\RequirePackage{everypage}[2007/06/20]
+% \end{macrocode}
+%
+% Depend on \Lpack{iftex} and error out if not working in PDF mode
+% \changes{R1.1}{2020/10/17}{Error out if output mode is not PDF.}%
+% \begin{macrocode}
+\RequirePackage{iftex}
+\AtBeginDocument{%
+ \ifpdf
+ \relax
+ \else
+ \PackageError{flippdf}{%
+ package only works in pdf output mode}%
+ \fi}
+% \end{macrocode}
+%
+% \begin{macro}{\if@sc@flippdf}
+% Define a boolean variable to remember if pages are to be flipped or
% not.
% \begin{macrocode}
\newif\if@sc@flippdf
@@ -151,36 +365,54 @@
% \end{macrocode}
%
% And eventually, tell \LaTeX\ to flip every page, by using the
-% \Lpack{everypage} hook:
+% \Lpack{everypage} hook. First consider the case when running in
+% \hologo{pdfLaTeX}
% \begin{macrocode}
-\AddEverypageHook{%
- \if@sc@flippdf
- \pdfliteral direct {-1 0 0 1 \strip@pt\paperwidth\space 0 cm}
- \fi}
-\endinput
+\ifpdftex
+ \AddEverypageHook{%
+ \if@sc@flippdf
+ \pdfliteral direct {-1 0 0 1 \strip@pt\paperwidth\space 0 cm}%
+ \fi}%
+\fi
% \end{macrocode}
+% Then consider the case when running in \hologo{LuaLaTeX}
+% \changes{R1.1}{2020/10/17}{Extend package to work also with
+% \hologo{LuaLaTeX}.}
+% \begin{macrocode}
+\ifluatex
+ \AddEverypageHook{%
+ \if@sc@flippdf
+ \pdfextension literal direct {%
+ -1 0 0 1 \strip@pt\paperwidth\space 0 cm}%
+ \fi}%
+\fi
+% \end{macrocode}
+% \iffalse
+%</flippdf-1x>
+% \fi
%
% \Finale
+% \PrintChanges
% \PrintIndex
%
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
\endinput
-%%% Local Variables:
-%%% mode: doctex
-%%% TeX-master: t
-%%% End:
+% %% Local Variables:
+% %% mode: doctex
+% %% TeX-master: t
+% %% End:
diff --git a/Master/texmf-dist/source/latex/flippdf/flippdf.ins b/Master/texmf-dist/source/latex/flippdf/flippdf.ins
index 97cd63c3ff7..b48705a2f89 100644
--- a/Master/texmf-dist/source/latex/flippdf/flippdf.ins
+++ b/Master/texmf-dist/source/latex/flippdf/flippdf.ins
@@ -1,5 +1,5 @@
%% flippdf.ins
-%% Copyright 2006
+%% Copyright 2006, 2020
%% Sergio Callegari <sergio.callegari@gmail.com>
%%
%% ---------------------------------------------
@@ -7,15 +7,16 @@
%% a contribution to the LaTeX2e system.
%% ---------------------------------------------
%%
-%% It may be distributed and/or modified under the conditions of the
-%% LaTeX Project Public License, either version 1.3 of this licence, or
-%% any later version. The latest version of this license is at
-%% http://www.latex-project.org/lppl.txt and version 1.3 is part
-%% of all distributions of LaTeX version 2003/06/01 or later.
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, version 1.3c.
+%% This license is in
+%% https://www.latex-project.org/lppl/lppl-1-3c/
+%% and is part of all distributions of LaTeX later than
+%% 2008-05-04.
%%
-%% This work has the LPPL maintenance status "author-maintained".
+%% This work has the LPPL maintenance status "maintained".
%%
-%% This program consists of the files listed in the README file
+%% This program consists of the files listed in the README.md file
%% included in the package.
%%
%% This file will generate fast loadable files and documentation
@@ -25,17 +26,12 @@
%% --------------- start of docstrip commands ------------------
%%
\input docstrip.tex
-\preamble
-This is file `flippdf.sty',
-generated with the docstrip utility.
-
-The original source files were:
-flippdf.dtx
+\preamble
IMPORTANT NOTICE:
-Copyright 2006
+Copyright 2006, 2020
Sergio Callegari <sergio.callegari@gmail.com>
---------------------------------------------
@@ -47,21 +43,31 @@ This program consists of the files listed in the README file included
in the package.
Any modified versions of this file must be renamed with new filenames
-distinct from flippdf.sty.
+distinct from \outFileName.
-For distribution of the original source see the terms
-for copying and modification in the file flippdf.dtx.
+For distribution of the original source see the terms for copying and
+modification in the file \inFileName.
-This generated file may be distributed as long as the
-original source files, as listed above, are part of the
-same distribution. (The sources need not necessarily be
-in the same archive or directory.)
+This generated file may be distributed as long as the original source files, as
+listed above, are part of the same distribution. (The sources need not
+necessarily be in the same archive or directory.)
\endpreamble
\keepsilent
\Msg{*** Generating the LaTeX2e package files ***}
-\generate{\file{flippdf.sty}{\from{flippdf.dtx}{}}}
+\usedir{tex/latex/flippdf}
+\generate{\file{flippdf.sty}{\from{flippdf.dtx}{flippdf}}}
+\generate{\file{flippdf-1x.sty}{\from{flippdf.dtx}{flippdf-1x}}}
+
+\preamble
+\endpreamble
+
+\Msg{*** Generating the LaTeX2e test/example files ***}
+\usedir{doc/latex/flippdf/examples}
+\generate{\file{test-flippdf-1}{\from{flippdf.dtx}{test-1}}}
+\generate{\file{test-flippdf-2}{\from{flippdf.dtx}{test-2}}}
+
\ReportTotals
\Msg{***********************************************************}
@@ -72,13 +78,16 @@ in the same archive or directory.)
\Msg{* \space\space flippdf.sty}
\Msg{*}
\Msg{*}
-\Msg{* To produce the documentation run the files ending with}
-\Msg{* `.dtx' through LaTeX (or maybe pdfLaTeX).}
-\Msg{* Process any name.idx file by:}
-\Msg{* \space\space\space\space makeindex -s gind.ist name}
-\Msg{* Process any name.glo file by:}
-\Msg{* \space\space\space\space makeindex -s gglo.ist -o name.gls name.glo}
-\Msg{* Re run through LaTeX the .dtx files as necessary}
+\Msg{* To produce the documentation:}
+\Msg{* - run flippdf.dtx through LaTeX}
+\Msg{* - process flippdf.idx by:}
+\Msg{* \space\space\space\space makeindex -s gind.ist flippdf}
+\Msg{* - process flippdf.glo by:}
+\Msg{* \space\space\space\space makeindex -s gglo.ist -o flippdf.gls flippdf.glo}
+\Msg{* - re run through LaTeX the flippdf.dtx as necessary}
+\Msg{* You may then want to move the test-flippdf*.tex files produced by}
+\Msg{* processing this ins file together with the documentation (e.g., in an}
+\Msg{* examples subdirectory}
\Msg{*}
\Msg{***********************************************************}
diff --git a/Master/texmf-dist/source/latex/fontaxes/fontaxes.dtx b/Master/texmf-dist/source/latex/fontaxes/fontaxes.dtx
index d39353339f7..232ff98a775 100644
--- a/Master/texmf-dist/source/latex/fontaxes/fontaxes.dtx
+++ b/Master/texmf-dist/source/latex/fontaxes/fontaxes.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
% Copyright (c) 2007 by Andreas B\"uhmann
-% Copyright (c) 2014 by Michael Ummels <michael.ummels@rwth-aachen.de>
+% Copyright (c) 2020 by Michael Ummels <michael.ummels@rwth-aachen.de>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -22,10 +22,10 @@
%
%\iffalse
%<*driver>
-\ProvidesFile{fontaxes.dtx}[2014/03/23 v1.0d Font selection axes]
+\ProvidesFile{fontaxes.dtx}[2020/07/21 v1.0e Font selection axes]
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}
-%<package>\ProvidesPackage{fontaxes}[2014/03/23 v1.0d Font selection axes]
+%<package>\ProvidesPackage{fontaxes}[2020/07/21 v1.0e Font selection axes]
%<*driver>
\documentclass{ltxdoc}
@@ -57,7 +57,7 @@
%</driver>
%\fi
%
-% \CheckSum{738}
+% \CheckSum{746}
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
@@ -701,17 +701,22 @@
}
% \end{macrocode}
% Try different naming conventions.
+% \changes{v1.0e}{2020/07/21}{Add another fallback for fonts with only one figure version}
% \begin{macrocode}
\newcommand*\fontaxes@encode@family@default{%
\fontaxes@encode@figures
\edef\fontaxes@code{\fontaxes@family@base-\fontaxes@code}%
\fontaxes@check@family\fontaxes@code
\iffontaxes@exists\else
- \fontaxes@encode@figuresalt
- \edef\fontaxes@code{\fontaxes@family@base\fontaxes@code}%
+ \edef\fontaxes@code{\fontaxes@family@base-LF}%
\fontaxes@check@family\fontaxes@code
\iffontaxes@exists\else
- \edef\fontaxes@code{\fontaxes@family@base}%
+ \fontaxes@encode@figuresalt
+ \edef\fontaxes@code{\fontaxes@family@base\fontaxes@code}%
+ \fontaxes@check@family\fontaxes@code
+ \iffontaxes@exists\else
+ \edef\fontaxes@code{\fontaxes@family@base}%
+ \fi
\fi
\fi
}
diff --git a/Master/texmf-dist/source/latex/fontaxes/fontaxes.ins b/Master/texmf-dist/source/latex/fontaxes/fontaxes.ins
index c6ff8090ed2..69ad880bedf 100644
--- a/Master/texmf-dist/source/latex/fontaxes/fontaxes.ins
+++ b/Master/texmf-dist/source/latex/fontaxes/fontaxes.ins
@@ -1,6 +1,6 @@
%
% Copyright (c) 2007 by Andreas B\"uhmann
-% Copyright (c) 2014 by Michael Ummels <michael.ummels@rwth-aachen.de>
+% Copyright (c) 2020 by Michael Ummels <michael.ummels@rwth-aachen.de>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -23,7 +23,7 @@
\preamble
Copyright (c) 2007 by Andreas Buehmann
-Copyright (c) 2014 by Michael Ummels <michael.ummels@rwth-aachen.de>
+Copyright (c) 2020 by Michael Ummels <michael.ummels@rwth-aachen.de>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/Master/texmf-dist/source/latex/fontsize/fontsize.dtx b/Master/texmf-dist/source/latex/fontsize/fontsize.dtx
index aba6194a187..b13a571f555 100644
--- a/Master/texmf-dist/source/latex/fontsize/fontsize.dtx
+++ b/Master/texmf-dist/source/latex/fontsize/fontsize.dtx
@@ -4,25 +4,33 @@
\input docstrip
\preamble
-Copyright 2020 Ivan Valbusa
+The 'fontsize' package
+Copyright (C) 2020-2021 Ivan Valbusa
+<ivan dot valbusa at gmail dot com>
-This program is provided under the terms of the
-LaTeX Project Public License distributed from CTAN
-archives in directory macros/latex/base/lppl.txt.
+All rights reserved.
-Author: Ivan Valbusa
-Ivan dot Valbusa at gmail dot com
+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
+ http://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 consists of all files listed in README
This work has the LPPL maintenance status "author-maintained".
\endpreamble
-
\keepsilent
\askforoverwritefalse
-\Msg{*** Generating the package files ***}
-\generate{\file{fontsize.sty}{\from{fontsize.dtx}{package}}%
-}
+\Msg{*** Generating the package file ***}
+\generate{
+ \file{fontsize.sty}{\from{fontsize.dtx}{package}}
+ \nopreamble\nopostamble
+ \file{fontsize.bib}{\from{fontsize.dtx}{bib}}}
\Msg{***********************************************************}
\Msg{*}
@@ -40,23 +48,7 @@ This work has the LPPL maintenance status "author-maintained".
\Msg{***********************************************************}
\endgroup
%</internal>
-%
-% Copyright (C) 2020 by Ivan Valbusa
-% <Ivan dot Valbusa at gmail dot com>
-% -------------------------------------------------------
-%
-% 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
-% http://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 consists of all files listed in README
-%
% \fi
-%
% \iffalse
%<*driver>
\ProvidesFile{fontsize.dtx}
@@ -64,22 +56,135 @@ This work has the LPPL maintenance status "author-maintained".
%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
%<package>\ProvidesPackage{fontsize}
%<*package>
- [2020/02/20 v0.1 'fontsize' package. Set main font sizes (Ivan Valbusa)]
+ [2021/02/10 v0.7 'fontsize' package. Set main font sizes (Ivan Valbusa)]
%</package>
%<*driver>
-\PassOptionsToClass{a4paper}{article}
-\documentclass{ltxdoc}
-\let\cmd\relax
-\let\cs\relax
+\documentclass[12pt]{ltxdoc}
\usepackage[T1]{fontenc}
+\usepackage[utf8]{inputenc}
+\usepackage[fontsize=12pt]{fontsize}
+\usepackage{array,booktabs,siunitx,tabu}
+\usepackage{multicol}
+%--------------------------------------------------------
+% GRAPHICS
+%--------------------------------------------------------
+\usepackage[svgnames,table]{xcolor}
+\definecolor{philA}{named}{DarkRed}
+\definecolor{philB}{named}{NavyBlue}
+\definecolor{sufred}{rgb}{0.5,0,0}
+\definecolor{sufgray}{rgb}{0.5,0.5,0.5}
+\usepackage{tikz}
+\usetikzlibrary{shadows}
+\usepackage[framemethod=TikZ]{mdframed}
+\mdfsetup{roundcorner=3pt,linecolor=white,backgroundcolor=gray!10}
+%--------------------------------------------------------
+% DOC FACILITIES
+%--------------------------------------------------------
+\usepackage{metalogo,hologo}
+\usepackage{guit}% before ltxdockit but after xcolor!
+\usepackage[final]{microtype}
+\let\cs\relax
+\let\cmd\relax
\usepackage{ltxdockit}
-\usepackage[fontsize=10.5]{fontsize}
-
+%--------------------------------------------------------
+% FONTS
+%--------------------------------------------------------
+\usepackage{cochineal}
+\usepackage[varqu,varl,var0]{inconsolata}
+\usepackage{biolinum}
+\usepackage{amsthm}
+\usepackage[cochineal,bigdelims,cmintegrals,vvarbb]{newtxmath}
+\usepackage[cal=boondoxo]{mathalfa}
+\usepackage{manfnt}
+%--------------------------------------------------------
+% LAYOUT
+%--------------------------------------------------------
+\usepackage[skip=1.5ex]{parskip}
+\setcounter{tocdepth}{3}
+\usepackage{geometry}
+\geometry{
+ a4paper,
+ margin=3cm,
+ headheight=15pt,
+ ignoreall,
+ heightrounded}
+\usepackage{sectsty}
+\allsectionsfont{\sffamily}
+% --------------------------------------------------------
+% OTHER PACKAGES
+% --------------------------------------------------------
+\usepackage[autostyle]{csquotes}
+\usepackage[style=philosophy-classic]{biblatex}
+\addbibresource{fontsize.bib}
+%--------------------------------------------------------
+% COMMANDS AND ENVIRONMENTS
+%--------------------------------------------------------
+\newcommand{\new}{\marginpar{\textcolor{red}{\textbf{NEW!}}}}
+\newcommand{\argstyle}{\itshape}
+\DeclareRobustCommand*{\ar}[1]{\texttt{\char`\{}\textrm{\argstyle#1}\texttt{\char`\}}}
+\DeclareRobustCommand*{\oar}[1]{\texttt{[}\textrm{\argstyle#1}\texttt{]}}
+\DeclareRobustCommand*{\meta}[1]{%
+ $\langle${\argstyle\rmfamily#1\kern0.12em}$\rangle$}
+\DeclareRobustCommand*{\arm}[1]{\ar{\meta{\argstyle#1}}}
+\DeclareRobustCommand*{\oarm}[1]{\oar{\meta{\argstyle#1}}}
+\newcommand*{\OR}{${}\mid{}$}
\makeatletter
-\newcommand{\mysize}[1]{%
- \bgroup\noindent\csname#1\endcsname The \cmd{#1} size is: \textbf{\csname#1\endcsname\f@size\,pt}.\\The \cmd{baselineskip} is \the\baselineskip\par\vskip2mm\egroup}
+\newlength\CLett
+\newcommand*\alert{
+ \par\noindent
+ \setbox\z@\hbox{\textdbend}\CLett=\wd\z@%
+ \raisebox{-1.05\baselineskip}[0pt][0pt]{%
+ \llap{\box\z@\kern6pt}}}
\makeatother
-
+%
+% New environments
+%
+\newenvironment{ttquote}{%
+ \begin{mdframed}\ttfamily\microtypesetup{activate=false}}{\end{mdframed}}
+\newenvironment{latexcode}{\begin{mdframed}}{\end{mdframed}}
+\makeatletter
+% Customizing option and value list:
+\patchcmd{\ltxsyntax}{\marglistwidth}{0pt}{}{}
+\patchcmd{\ltd@option@i}{=}{\ = }{}{}
+\patchcmd{\ltd@option@ii}{=}{\ = }{}{}
+% New color for items
+\renewcommand*{\optionlistfont}{%
+ \color{philA}\sffamily\displayverbfont}
+\renewcommand*{\ltxsyntaxlabelfont}{%
+ \color{philA}\sffamily\displayverbfont}
+\renewcommand*{\marglistfont}{%
+ \color{philA}\sffamily\displayverbfont}
+%
+% Table of contents
+%
+\renewcommand\tableofcontents{%
+ \setlength{\columnsep}{1cm}
+ {\centering
+ \section*{\contentsname}%
+ \@mkboth{\contentsname}{\contentsname}}
+ \thispagestyle{empty}
+ \begin{multicols}{2}
+ \@starttoc{toc}%
+\end{multicols}}
+\makeatother
+%
+% Commands for code
+%
+\def\baddition{\color{DarkBlue}}
+\def\eaddition{\color{black}}
+% --------------------------------------------------------
+% HYPERREF SETUP
+% --------------------------------------------------------
+\usepackage{hyperref}
+\hypersetup{%
+ hidelinks,
+ pdftitle={User's guide to \textsf{fontsize}},
+ pdfsubject={A small package to change the font size},
+ pdfauthor={Ivan Valbusa},
+ pdfkeywords={latex, fonts}}
+% --------------------------------------------------------
+% FINAL SETTINGS
+% --------------------------------------------------------
\EnableCrossrefs
\CodelineIndex
\RecordChanges
@@ -90,7 +195,7 @@ This work has the LPPL maintenance status "author-maintained".
%</driver>
% \fi
%
-% \CheckSum{787}
+% \CheckSum{3128}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -108,6 +213,13 @@ This work has the LPPL maintenance status "author-maintained".
% Grave accent \` Left brace \{ Vertical bar \|
% Right brace \} Tilde \~}
%
+%
+% \changes{v0.7}{2021/02/10}{New font sizing commands \cmd{HUGE}, \cmd{HUGEr}, \cmd{HUGErr}, \cmd{HUGErrr}. Changed default name for the \file{.clo} file to \opt{fontsize}. Updated documentation.}
+% \changes{v0.6}{2021/02/06}{New font sizing commands from \cmd{small} down. Updated documentation.}
+% \changes{v0.5}{2021/01/31}{New font sizing commands from \cmd{normalsize} up. New command \cmd{printsamples}. Updated documentation.}
+% \changes{v0.4}{2021/01/25}{Maintenance release. Updated documentation.}
+% \changes{v0.3}{2020/12/19}{Added definitions of some lengths omitted from KOMA-script files: \cmd{smallskiamount}, \cmd{medskiamount}, \cmd{bigskiamount}. Redefined \cmd{parindent} and \cmd{headheight}.}
+% \changes{v0.2}{2020/05/24}{Updated documentation and code comments.}
% \changes{v0.1}{2020/02/20}{First public release}
% \GetFileInfo{fontsize.dtx}
%
@@ -134,65 +246,387 @@ This work has the LPPL maintenance status "author-maintained".
% \DoNotIndex{\eTeXversion,\hbox,\hsize,\includegraphics,\newlinechar}
% \DoNotIndex{\titlepage,\vss,\vtop,\xdef,\@gobbletwo,\color,\dimexpr}
% \DoNotIndex{\huge,\large,\makebox,\ProcessOptions,\renewcommand}
+%
+% \thispagestyle{empty}
+% \begin{tikzpicture}[overlay,remember picture]
+% \draw[circular drop shadow,draw=none,fill=white] (current page.center) circle (6cm) node[align=center,anchor=center] {%
+% Ivan Valbusa\\[1cm]
%
-
+%\Huge\color{gray}\bfseries \parbox{10cm}{\centering The \\{{\color{philA}\fontsize{30}{32}\textsf{fontsize}}\\ package}}\\[1cm]
+% \color{black!60!Goldenrod}
+%
+%\normalsize \fileversion{} -- \filedate
%
+%};
+% \end{tikzpicture}
+% \clearpage\thispagestyle{empty}
+%
+% \null\vfill
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section*{Legalese}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% \noindent Copyright \copyright\ 2020-\the\year\ Ivan Valbusa
+% \smallskip
+%
+% \noindent This package is author-maintained.
+% Permission is granted to copy, distribute and/or modify this software
+% under the terms of the \LaTeX{} Project Public License, version 1.3 or
+% later (\url{http://latex-project.org/lppl}).
+% This software is provided ``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.
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section*{Feedback}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% \title{The \textsf{fontsize} package\\ \normalsize \textit{A small package to change the font size}}
-% \author{Ivan Valbusa \\
-% \texttt{Ivan dot Valbusa at gmail dot com}}
-% \date{\fileversion{} -- \filedate}
+% If you have any questions, feedback or requests please email
+% me at \texttt{ivan dot valbusa at gmail dot com}. If you need specific
+% features not already implemented, remember to attach the example files.
%
-% \maketitle
+% \clearpage
%
-%\noindent The \sty{fontsize} package allows you to set arbitrary sizes for the main font of the document, through the \opt{fontsize=\meta{size}} option. The value for the \meta{size} can be given in any unit recognized by TeX (for example: \opt{6mm}, \opt{1ex}, \opt{11.5pt}). If the unit is not declared it defaults to \texttt{pt}. So \opt{fontsize=11} is the same as \opt{fontsize=11pt}. See the example below.
+% \begin{center}
+% {\color{philA}\bfseries\sffamily
+% \huge User's guide to \texttt{fontsize}\\[3mm]}
+% {\large\bfseries\sffamily A small package to change the font size}
+% \vspace{.8cm}
%
-% \section*{Caveat}
+% \normalsize\fileversion{} -- \filedate
+% \vspace{.7cm}
+%
+% Ivan Valbusa\\[2mm]
+% \footnotesize\texttt{ivan dot valbusa at gmail dot com}
+% \vspace{1cm}
+% \end{center}
+%
+% \begin{abstract}
+% \noindent The \sty{fontsize} package allows you to set arbitrary sizes
+% for the main font of the document and to adjust the line spacing accordingly.
+% It also provides new font sizing commands and lets you generate your own \file{.clo} file for better tuning.
+% \end{abstract}
%
-% Although effective with any value for the \meta{size} (as long as the font is scalable!), the package is meant for small font size changes. For truly optimal results you should not use this package at all. Rather, a \file{.clo} file should be defined for each main size, even if this is pretty hard work. Particularly, you should define \cmd{parindent} accordingly to the used size.
+% \tableofcontents
%
+%^^A---------------------------------------------------------------------
% \section*{Credits}
+%^^A---------------------------------------------------------------------
%
-% The code is a a minimal part of the \sty{scrextend}, with few minor changes to make it completely independent of the Koma bundle (see \cite{koma}).
+% The code is an excerpt of the \sty{scrextend} and
+% \sty{scrfontsizes} packages \parencite{koma}, with few minor
+% changes to make it completely independent of the KOMA-script bundle and with a couple of new features. The package is updated to version |3390 2019-11-18 17:09:35Z| of the \file{scrkernel-fonts.dtx} file.
%
-% \section*{An example}
+%^^A---------------------------------------------------------------------
+% \section*{Caveat}
+%^^A---------------------------------------------------------------------
%
-% \verb!\usepackage[fontsize=10.5]{fontsize}!\bigskip
+% Although effective with any value of the font size (as long as the font
+% is scalable), the package is meant for small font size changes.
+% For truly optimal results you should (re)define your own \file{.clo} file.
+% In fact note that the file generated with \cmd{generateclofile}, as well as the macros redefined via \cmd{changefontsize}, are a subset of the standard \file{.clo} files.
+%^^A---------------------------------------------------------------------
+% \section{Usage}
+%^^A---------------------------------------------------------------------
+% \enlargethispage{\baselineskip}
%
+% The package can be loaded, as usual, with:
+% \begin{ttquote}
+% \noindent\cmd{usepackage}\oarg{options}|{fontsize}|
+% \end{ttquote}
+%
+%^^A The \sty{geometry} package and the settings to change the page layout
+%^^A must follow \sty{fontsize} to avoid errors in the layout
%
-%\mysize{tiny}
-%\mysize{scriptsize}
-%\mysize{footnotesize}
-%\mysize{small}
-%\mysize{normalsize}
-%\mysize{large}
-%\mysize{Large}
-%\mysize{LARGE}
-%\mysize{huge}
-%\mysize{Huge}
+%^^A---------------------------------------------------------------------
+% \subsection{Options}
+%^^A---------------------------------------------------------------------
%
-% \begin{thebibliography}{label}
-% \bibitem{koma} Frank Neukam, Markus Kohm, Axel Kielhorn, \textit{KOMA -- Script. A versatile \LaTeXe{} bundle}. \url{https://www.ctan.org/pkg/koma-script}
-% \bibitem{xkeyval} Hendri Adriaens, \textit{The \sty{xkeyval} package}, \url{https://www.ctan.org/pkg/xkeyval}.
-% \bibitem{etoolbox} Philipp Lehman, Joseph Wright, \textit{The \sty{etoolbox} Package. An e-\TeX{} Toolbox for Class and Package Authors}, \url{https://www.ctan.org/pkg/etoolbox}.
-
-% \end{thebibliography}
+% \begin{optionlist*}
%
-% \StopEventually{\PrintChanges\PrintIndex}
+% \optitem[10pt]{fontsize}{\meta{fontsize}}
%
-% \section{The Code}
+% Sets the normal size to \meta{fontsize} and the normal line spacing
+% to 1.2\meta{fontsize}. The other sizes (\cmd{tiny}, \cmd{scriptsize},
+% \cmd{small}, ecc.) and line spacings are set proportionally.
+% You can use any unit recognized by \TeX\ and you can
+% omit the unit as well (in which case it defaults to \texttt{pt}).
+%
+% \optitem[fontsize]{cloname}{\meta{name}}
+%
+% If declared \textit{before} \opt{fontsize}, it loads the file named
+% \file{\meta{name}\meta{fontsize}.clo} to setup the font sizes.
+% This file can be generated through the \cmd{generateclofile}
+% command (see below).
+%
+% \end{optionlist*}
+%
+%^^A---------------------------------------------------------------------
+% \subsection{Commands}\label{sec:commands}
+%^^A---------------------------------------------------------------------
+%
+% \begin{ltxsyntax}
+%
+% \cmditem{changefontsize}[baselineskip]{fontsize} \hfill iff \meta{baselineskip} $\geq$\meta{fontsize}
+%
+% Sets the normal size to \meta{fontsize} and the normal line spacing to
+% \meta{baselineskip}. The other sizes (\cmd{tiny}, \cmd{scriptsize},
+% \cmd{small}, ecc.) and line spacings are set proportionally.
+% If the first optional argument is omitted, the command has the same effect
+% of the \opt{fontsize} option. You can use any unit recognized by \TeX\ and
+% you can omit the unit as well (in which case it defaults to \texttt{pt}).
+% For example:
+%\begin{latexcode}
+%\begin{verbatim}
+%\changefontsize[13.5pt]{11.5pt}
+%\end{verbatim}
+%\end{latexcode}
+%
+% \cmditem{generateclofile}{name}[baselineskip]{fontsize} \hfill iff \meta{baselineskip} $\geq$\meta{fontsize}
+%
+% Generates a file named \file{\meta{name}\meta{fontsize}.clo} in which the
+% normal size is \meta{fontsize} and the normal line spacing is \meta{baselineskip}.
+% The other sizes (\cmd{tiny}, \cmd{scriptsize},
+% \cmd{small}, ecc.) and line spacings are set proportionally.
+% You can use any unit recognized
+% by \TeX\ and you can omit the unit as well (in which case it defaults
+% to \texttt{pt}).
+% If \opt{cloname=\meta{name}} \textit{and} \opt{fontsize=\meta{fontsize}},
+% the generated file will be automatically used to setup the main sizes.
+%
+% \alert \emph{In fact the \file{.clo} file is only needed if you intend to modify it.
+% In this case remember to comment the command, otherwise the edited
+% file will be overwritten.}
+%
+%\begin{latexcode}
+%\begin{verbatim}
+%\usepackage[cloname=fs,fontsize=11.5]{fontsize} % loads fs11.5.clo
+% \generateclofile{fs}[13.5]{11.5} % creates fs11.5.clo
+%\end{verbatim}
+%\end{latexcode}
+%
+% \cmditem{printsamples}{baselineskip}{fontsize}[sizes] \hfill iff \meta{baselineskip} $\geq$\meta{fontsize}
+%
+% A command thought to test the \sty{fontsize} settings.
+% It prints a text sample for every size given in the third optional argument.
+% If this argument is omitted, it prints a sample for each available size.
+% See the examples on page \pageref{sec:example}.
+%
+%\begin{latexcode}
+%\begin{verbatim}
+%\printsamples{13pt}{11pt}[normalsizer,normalsizerr,normalsizerrr]
+%\printsamples{13.5pt}{12pt}
+%\end{verbatim}
+%\end{latexcode}
+%
+%^^A \cmditem{sampletext}{text}
+%
+%^^A Defines the \meta{text} to be used by \cmd{printsamples}.
+%
+% \end{ltxsyntax}
+%^^A---------------------------------------------------------------------
+% \section{New font sizing commands}\label{sec:sizingcmd}
+%^^A--------------------------------------------------------------------
+% The package provides three additional font sizing commands for each standard size:
+% \medskip
+%
+%\def\fshw{Lipsum}
+%\newcommand{\tcmd}[1]{\textcolor{philA}{\cmd{#1}}}
+% \centerline{
+% \begin{tabular}[b]{ll}
+% \cmd{tiny} & \tiny \fshw \\
+% \tcmd{tinyr} & \tinyr \fshw \\
+% \tcmd{tinyrr} & \tinyrr \fshw \\
+% \tcmd{tinyrrr} & \tinyrrr \fshw \\
+% \cmd{scriptsize} & \scriptsize \fshw \\
+% \tcmd{scriptsizer} & \scriptsizer \fshw \\
+% \tcmd{scriptsizerr} & \scriptsizerr \fshw \\
+% \tcmd{scriptsizerrr} & \scriptsizerrr \fshw \\
+% \cmd{footnotesize} & \footnotesize \fshw \\
+% \tcmd{footnotesizer} & \footnotesizer \fshw \\
+% \tcmd{footnotesizerr} & \footnotesizerr \fshw \\
+% \tcmd{footnotesizerrr} & \footnotesizerrr \fshw \\
+% \cmd{small} & \small \fshw \\
+% \tcmd{smallr} & \smallr \fshw \\
+% \tcmd{smallrr} & \smallrr \fshw \\
+% \tcmd{smallrrr} & \smallrrr \fshw \\
+% \cmd{normalsize} & \normalsize \fshw \\
+% \tcmd{normalsizer} & \normalsizer \fshw \\
+% \tcmd{normalsizerr} & \normalsizerr \fshw \\
+% \tcmd{normalsizerrr} & \normalsizerrr \fshw \\
+% \cmd{large} & \large \fshw \\
+% \tcmd{larger} & \larger \fshw \\
+% \tcmd{largerr} & \largerr \fshw \\
+% \tcmd{largerrr} & \largerrr \fshw \\
+% \cmd{Large} & \Large \fshw \\
+% \tcmd{Larger} & \Larger \fshw \\
+% \tcmd{Largerr} & \Largerr \fshw \\
+% \tcmd{Largerrr} & \Largerrr \fshw
+% \end{tabular}
+% \begin{tabular}[b]{ll}
+% \cmd{LARGE} & \LARGE \fshw \\
+% \tcmd{LARGEr} & \LARGEr \fshw \\
+% \tcmd{LARGErr} & \LARGErr \fshw \\
+% \tcmd{LARGErrr} & \LARGErrr \fshw \\
+% \cmd{huge} & \huge \fshw \\
+% \tcmd{huger} & \huger \fshw \\
+% \tcmd{huger} & \hugerr \fshw \\
+% \tcmd{huger} & \hugerrr \fshw \\
+% \cmd{Huge} & \Huge \fshw \\
+% \tcmd{Huger} & \Huger \fshw \\
+% \tcmd{Hugerr} & \Hugerr \fshw \\
+% \tcmd{Hugerr} & \Hugerrr \fshw \\
+% \cmd{HUGE} & \HUGE \fshw \\
+% \tcmd{HUGEr} & \HUGEr \fshw \\
+% \tcmd{HUGErr} & \HUGErr \fshw \\
+% \tcmd{HUGErrr} & \HUGErrr \fshw
+% \end{tabular}
+% }
+%\medskip
+%
+% \begin{normalsize}
+%\alert If you want these commands to work as expected, the font must be
+% smoothly scalable. This is the case of many Type 1 and Open Type fonts.
+% Anyway, if the font has optical sizes, unusual things can happen:
+% some larger sizes may appear smaller. For example, with the Latin Modern 12\,pt typeface a similar situation can be encountered:\medskip
+%
+% \begingroup
+% \centering
+% \fontfamily{lmr}\selectfont
+%\begin{minipage}[b]{8cm}
+% \begin{tabular}[b]{lll}
+% \tcmd{largerr} & \texttlf{15.84\,pt} &\largerr Hello world \\
+% \tcmd{larger} & \texttlf{15.12\,pt} &\larger Hello world \\
+% \tcmd{large} & \texttlf{14.40\,pt} &\large Hello world
+% \end{tabular}
+%\end{minipage}
+% \tikz[overlay]{\draw[->,draw=red,thick,dashed] (0.19,1.25) -- (3.7,1.4);}
+% \scalebox{3}{\large H} \scalebox{3}{\larger H} \scalebox{3}{\largerr H}
+%
+% \endgroup
+% \end{normalsize}
+% \medskip
+%
+% In fact the font used for the \cmd{larger} `Hello world' is bigger than
+% that used for the \cmd{large} one. This optical effect is due to the minor
+% thickness of the stems, which makes the words appear shorter and clearer,
+% but not less high (as you can see in the figure on the
+% right which shows the letter H appropriately scaled to see the
+% differences better).
+%
+% \clearpage\thispagestyle{empty}
+% \def\ivalbmidrule{\arrayrulecolor{black!40}\midrule\rowfont{\color{philA}}}
+% \begin{table}
+%\vspace*{-1cm}
+% \centering
+% \centerline{%
+% \begin{tabu}{lSSSSSSSSS}
+%\toprule
+% \tcmd{tiny} & 4.00 & 4.25 & 4.50 & 4.75 & 5.00 & 5.25 & 5.50 & 5.75 & 6.00 \\
+% \cmd{tinyr} & 4.33 & 4.60 & 4.88 & 5.15 & 5.42 & 5.69 & 5.96 & 6.23 & 6.50 \\
+% \cmd{tinyrr} & 4.67 & 4.96 & 5.25 & 5.54 & 5.83 & 6.12 & 6.42 & 6.71 & 7.00 \\
+% \cmd{tinyrrr} & 5.00 & 5.31 & 5.62 & 5.94 & 6.25 & 6.56 & 6.88 & 7.19 & 7.50 \\
+%\ivalbmidrule
+% \tcmd{scriptsize} & 5.33 & 5.67 & 6.00 & 6.33 & 6.67 & 7.00 & 7.33 & 7.67 & 8.00 \\
+% \cmd{scriptsizer} & 5.67 & 6.02 & 6.38 & 6.73 & 7.08 & 7.44 & 7.79 & 8.15 & 8.50 \\
+% \cmd{scriptsizerr} & 6.00 & 6.38 & 6.75 & 7.12 & 7.50 & 7.88 & 8.25 & 8.62 & 9.00 \\
+% \cmd{scriptsizerrr} & 6.33 & 6.73 & 7.13 & 7.52 & 7.92 & 8.31 & 8.71 & 9.10 & 9.50 \\
+%\ivalbmidrule
+% \tcmd{footnotesize} & 6.67 & 7.08 & 7.50 & 7.92 & 8.33 & 8.75 & 9.17 & 9.58 & 10.00 \\
+% \cmd{footnotesizer} & 6.83 & 7.25 & 7.68 & 8.10 & 8.53 & 8.96 & 9.38 & 9.81 & 10.24 \\
+% \cmd{footnotesizerr} & 6.98 & 7.42 & 7.86 & 8.29 & 8.73 & 9.17 & 9.60 & 10.04 & 10.48 \\
+% \cmd{footnotesizerrr} & 7.14 & 7.59 & 8.03 & 8.48 & 8.93 & 9.37 & 9.82 & 10.27 & 10.71 \\
+%\ivalbmidrule
+% \tcmd{small} & 7.30 & 7.76 & 8.21 & 8.67 & 9.13 & 9.58 & 10.04 & 10.49 & 10.95 \\
+% \cmd{smallr} & 7.47 & 7.94 & 8.41 & 8.88 & 9.34 & 9.81 & 10.28 & 10.75 & 11.21 \\
+% \cmd{smallrr} & 7.65 & 8.13 & 8.61 & 9.08 & 9.56 & 10.04 & 10.52 & 11.00 & 11.48 \\
+% \cmd{smallrrr} & 7.82 & 8.31 & 8.80 & 9.29 & 9.78 & 10.27 & 10.76 & 11.25 & 11.74 \\
+%\ivalbmidrule
+% \tcmd{normalsize} & 8.00 & 8.50 & 9.00 & 9.50 & 10.00 & 10.50 & 11.00 & 11.50 & 12.00 \\
+% \cmd{normalsizer} & 8.40 & 8.93 & 9.45 & 9.98 & 10.50 & 11.03 & 11.55 & 12.08 & 12.60 \\
+% \cmd{normalsizerr} & 8.80 & 9.35 & 9.90 & 10.45 & 11.00 & 11.55 & 12.10 & 12.65 & 13.20 \\
+% \cmd{normalsizerrr} & 9.20 & 9.77 & 10.35 & 10.92 & 11.50 & 12.07 & 12.65 & 13.22 & 13.80 \\
+%\ivalbmidrule
+% \tcmd{large} & 9.60 & 10.20 & 10.80 & 11.40 & 12.00 & 12.60 & 13.20 & 13.80 & 14.40 \\
+% \cmd{larger} & 10.08 & 10.71 & 11.34 & 11.97 & 12.60 & 13.23 & 13.86 & 14.49 & 15.12 \\
+% \cmd{largerr} & 10.56 & 11.22 & 11.88 & 12.54 & 13.20 & 13.86 & 14.52 & 15.18 & 15.84 \\
+% \cmd{largerrr} & 11.04 & 11.73 & 12.42 & 13.11 & 13.80 & 14.49 & 15.18 & 15.87 & 16.56 \\
+%\ivalbmidrule
+% \tcmd{Large} & 11.52 & 12.24 & 12.96 & 13.68 & 14.40 & 15.12 & 15.84 & 16.56 & 17.28 \\
+% \cmd{Larger} & 12.10 & 12.85 & 13.61 & 14.36 & 15.12 & 15.88 & 16.63 & 17.39 & 18.14 \\
+% \cmd{Largerr} & 12.67 & 13.46 & 14.26 & 15.05 & 15.84 & 16.63 & 17.42 & 18.22 & 19.01 \\
+% \cmd{Largerrr} & 13.25 & 14.08 & 14.90 & 15.73 & 16.56 & 17.39 & 18.22 & 19.04 & 19.87 \\
+%\ivalbmidrule
+% \tcmd{LARGE} & 13.82 & 14.69 & 15.55 & 16.42 & 17.28 & 18.14 & 19.01 & 19.87 & 20.74 \\
+% \cmd{LARGEr} & 14.52 & 15.42 & 16.33 & 17.24 & 18.14 & 19.05 & 19.96 & 20.87 & 21.77 \\
+% \cmd{LARGErr} & 15.21 & 16.16 & 17.11 & 18.06 & 19.01 & 19.96 & 20.91 & 21.86 & 22.81 \\
+% \cmd{LARGErrr} & 15.90 & 16.89 & 17.89 & 18.88 & 19.88 & 20.87 & 21.86 & 22.86 & 23.85 \\
+%\ivalbmidrule
+% \tcmd{huge} & 16.59 & 17.63 & 18.67 & 19.70 & 20.74 & 21.78 & 22.81 & 23.85 & 24.89 \\
+% \cmd{huger} & 17.42 & 18.51 & 19.6 & 20.69 & 21.78 & 22.86 & 23.95 & 25.04 & 26.13 \\
+% \cmd{hugerr} & 18.25 & 19.39 & 20.53 & 21.67 & 22.81 & 23.95 & 25.09 & 26.23 & 27.37 \\
+% \cmd{hugerrr} & 19.08 & 20.27 & 21.46 & 22.65 & 23.85 & 25.04 & 26.23 & 27.42 & 28.61 \\
+%\ivalbmidrule
+% \tcmd{Huge} & 19.90 & 21.15 & 22.39 & 23.64 & 24.88 & 26.12 & 27.37 & 28.61 & 29.86 \\
+% \cmd{Huger} & 20.89 & 22.19 & 23.50 & 24.80 & 26.11 & 27.42 & 28.72 & 30.03 & 31.33 \\
+% \cmd{Hugerr} & 21.87 & 23.24 & 24.61 & 25.97 & 27.34 & 28.71 & 30.07 & 31.44 & 32.81 \\
+% \cmd{Hugerrr} & 22.86 & 24.28 & 25.71 & 27.14 & 28.57 & 30.00 & 31.43 & 32.86 & 34.28 \\
+%\ivalbmidrule
+% \tcmd{HUGE} & 24.05 & 25.55 & 27.05 & 28.56 & 30.06 & 31.56 & 33.07 & 34.57 & 36.07 \\
+% \cmd{HUGEr} & 25.24 & 26.82 & 28.39 & 29.97 & 31.55 & 33.13 & 34.70 & 36.28 & 37.86 \\
+% \cmd{HUGErr} & 26.43 & 28.08 & 29.74 & 31.39 & 33.04 & 34.69 & 36.34 & 38.00 & 39.65 \\
+% \cmd{HUGErrr} & 27.62 & 29.35 & 31.08 & 32.80 & 34.53 & 36.26 & 37.98 & 39.71 & 41.44 \\
+% \arrayrulecolor{black}\bottomrule
+%\end{tabu}
+%}
+% \caption{The value of all available sizes (rounded to the second decimal place) relative to \cmd{normalsize} ranging from 8\,pt to 12\,pt with an increment of 0.5\,pt}\label{tab:sizes}
+%\end{table}
+%\clearpage\thispagestyle{plain}
+%
+%^^A---------------------------------------------------------------------
+% \section{Some text samples}\label{sec:example}
+%
+%^^A--------------------------------------------------------------------
+% The following examples are obtained with the \cmd{printsamples} command (see section \ref{sec:commands}).
+%
+%^^A Below you can see some text samples scaled proportionally
+%^^A to match the different values of the selected normal size and line spacing.
+%
+% \printsamples{13.2pt}{11.2pt}[normalsizer,normalsizerr,normalsizerrr,large,larger]
+% \printsamples{13.4pt}{11.7pt}[normalsizer,normalsizerr,normalsizerrr,large,larger]
+%
+% \nocite{xkeyval,etoolbox}
+%
+% \StopEventually{%
+% \printbibliography[heading=bibintoc]
+% \PrintChanges\PrintIndex}
%
% \iffalse
%<*package>
% \fi
+%^^A---------------------------------------------------------------------
+% \section{The Code}
+%^^A---------------------------------------------------------------------
+%\textcolor{DarkBlue}{The parts added to the basic code of \file{scrextend} and \file{scrfontsizes} are highlighted in blue.}
+%
+%\noindent All the options of the package are defined via \sty{xkeyval}.
+% \baddition
% \begin{macrocode}
\@ifpackageloaded{xkeyval}{}{\RequirePackage{xkeyval}}
-\@ifpackageloaded{etoolbox}{}{\RequirePackage{etoolbox}}
+\DeclareOptionX{cloname}[fontsize]{\def\@fontsizefilebase{#1}}
% \end{macrocode}
-% Here begins the \sty{scrextend} code. Only a few names have changed.
-% The value for \cmd{@fontsizefilebase} is set to \texttt{custom} instead of \texttt{scrsize}.
+% \eaddition
+%
+% \paragraph{Excerpt from \file{scrextend.sty}}
+%
+% Here the \sty{scrextend} code begins. Only a few names have been changed.
+% The value of \cmd{|@|fontsizefilebase} is set to \texttt{fontsize} instead of \texttt{scrsize}.
% \begin{macrocode}
-\providecommand*{\@fontsizefilebase}{custom}
\DeclareOptionX{fontsize}[10]{%
\expandafter\@defaultunits\expandafter\@tempdima#1 pt\relax\@nnil
\edef\@tempa{#1}%
@@ -202,21 +636,32 @@ This work has the LPPL maintenance status "author-maintained".
\edef\@ptsize{\strip@pt\@tempdimb}%
\edef\@tempa{%
\noexpand\makeatletter
- \noexpand\InputIfFileExists{\@fontsizefilebase\@tempa.clo}{%
- \noexpand\PackageInfo{fontsize}{%
- File `\@fontsizefilebase\@tempa.clo' used to setup font sizes}%
- }{%
- \noexpand\changefontsize{#1}%
- }%
- \noexpand\catcode`\noexpand\@=\the\catcode`\@
+ \noexpand\InputIfFileExists{\@fontsizefilebase\@tempa.clo}{%
+ \noexpand\PackageInfo{fontsize}{%
+ File `\@fontsizefilebase\@tempa.clo' used to setup font sizes}%
+ }{%
+ \noexpand\InputIfFileExists{\@fontsizefilebase\@tempb pt.clo}{%
+ \noexpand\PackageInfo{fontsize}{%
+ File `\@fontsizefilebase\@tempb pt.clo' used instead of%
+ \noexpand\MessageBreak
+ file `\@fontsizefilebase\@tempa.clo' to setup font sizes}%
+ }{%
+ \noexpand\changefontsize{#1}%
+ }%
}%
+ \noexpand\catcode`\noexpand\@=\the\catcode`\@
+ }%
\expandafter\AtEndOfPackage\expandafter{\@tempa}%
}
% \end{macrocode}
+% Now we can execute and process the new options defined above. As \opt{cloname} is responsible for defining \cmd{|@|fontsizefilebase} it must precede \opt{fontsize} which uses this command.
+% The \cmd{ctm@setlength} and \cmd{changefontsize} commands are simply new names, respectively, for \cmd{scr@setlength} and \cmd{changefontsizes} used in \file{scrextend.sty}.
+% \baddition
% \begin{macrocode}
+\ExecuteOptionsX{cloname,fontsize}
\ProcessOptionsX*\relax
% \end{macrocode}
-% The comamnd \cmd{ctm@setlength} has the same definition as \cmd{scr@setlength} of \file{scrextend.sty}.
+% \eaddition
% \begin{macrocode}
\newcommand*\ctm@setlength[4]{%
\ifdim #2<\ifdim #2=\z@ \z@ \else \p@\fi
@@ -249,9 +694,6 @@ This work has the LPPL maintenance status "author-maintained".
\fi
\fi
}
-% \end{macrocode}
-% The comamnd \cmd{changefontsize} has the same definition as \cmd{changefontsizes} of \file{scrextend.sty}.
-% \begin{macrocode}
\providecommand*{\changefontsize}[2][1.2\@tempdima]{%
\@defaultunits\@tempdima#2pt\relax\@nnil
\setlength{\@tempdimc}{\@tempdima}%
@@ -303,7 +745,7 @@ This work has the LPPL maintenance status "author-maintained".
\ctm@setlength{\belowdisplayshortskip}%
{.5\@tempdimb}{.25\@tempdimb}{.25\@tempdimb}%
\setlength{\belowdisplayskip}{\abovedisplayskip}%
- \edef\footnotesize{%
+ \edef\footnotesize{%
\noexpand\@setfontsize\noexpand\footnotesize
{\the\@tempdima}{\the\@tempdimb}%
\abovedisplayskip \the\abovedisplayskip
@@ -354,7 +796,346 @@ This work has the LPPL maintenance status "author-maintained".
\noexpand\@setfontsize\noexpand\Huge
{\the\@tempdima}{\the\@tempdimb}%
}%
- \normalsize
+% \end{macrocode}
+% We will now define some new font sizing commands. There are three variants
+% for each standard command:
+% \cmd{\meta{cmd}r} > \cmd{\meta{cmd}rr} > \cmd{\meta{cmd}rrr}.
+% Every level is scaled proportionally in order to preserve the default
+% value of the corresponding standard command.
+% \baddition
+% \begin{macrocode}
+ \def\fontsize@pre{%
+ \ctm@setlength{\abovedisplayskip}%
+ {.8333\@tempdimb}{.1667\@tempdimb}{.5\@tempdimb}%
+ \ctm@setlength{\abovedisplayshortskip}{\z@}{.25\@tempdimb}{\z@}%
+ \ctm@setlength{\belowdisplayshortskip}%
+ {.5\@tempdimb}{.25\@tempdimb}{.25\@tempdimb}%
+ \setlength{\belowdisplayskip}{\abovedisplayskip}%
+ }
+ \def\fontsize@app{%
+ \abovedisplayskip \the\abovedisplayskip%
+ \abovedisplayshortskip \the\abovedisplayshortskip%
+ \belowdisplayskip \the\belowdisplayskip%
+ \belowdisplayshortskip \the\belowdisplayshortskip%
+ }
+% \end{macrocode}
+% {\color{black}Definition of \cmd{smallr}, \cmd{smallrr}, \cmd{smallrrr}.\\
+% Scale factor: 0,021875.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{0.934375\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \fontsize@pre
+ \edef\smallr{%
+ \noexpand\@setfontsize\noexpand\smallr
+ {\the\@tempdima}{\the\@tempdimb}%
+ \fontsize@app
+ \let\noexpand\@listi\noexpand\@listi@small
+ }%
+ \setlength{\@tempdima}{0.95625\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \fontsize@pre
+ \edef\smallrr{%
+ \noexpand\@setfontsize\noexpand\smallrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ \fontsize@app
+ \let\noexpand\@listi\noexpand\@listi@small
+ }%
+ \setlength{\@tempdima}{0.978125\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \fontsize@pre
+ \edef\smallrrr{%
+ \noexpand\@setfontsize\noexpand\smallrrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ \fontsize@app
+ \let\noexpand\@listi\noexpand\@listi@small
+ }%
+% \end{macrocode}
+% {\color{black}Definition of \cmd{footnotesizer}, \cmd{footnotesizerr}, \cmd{footnotesizerrr}.\\
+% Scale factor: 0.01979.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{0.85313\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \fontsize@pre
+ \edef\footnotesizer{%
+ \noexpand\@setfontsize\noexpand\footnotesizer
+ {\the\@tempdima}{\the\@tempdimb}%
+ \fontsize@app
+ \let\noexpand\@listi\noexpand\@listi@footnotesize
+ }%
+ \setlength{\@tempdima}{0.87292\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \fontsize@pre
+ \edef\footnotesizerr{%
+ \noexpand\@setfontsize\noexpand\footnotesizerr
+ {\the\@tempdima}{\the\@tempdimb}%
+ \fontsize@app
+ \let\noexpand\@listi\noexpand\@listi@footnotesize
+ }%
+ \setlength{\@tempdima}{0.89271\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \fontsize@pre
+ \edef\footnotesizerrr{%
+ \noexpand\@setfontsize\noexpand\footnotesizerrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ \fontsize@app
+ \let\noexpand\@listi\noexpand\@listi@footnotesize
+ }%
+% \end{macrocode}
+% {\color{black}Definition of \cmd{scriptsizer}, \cmd{scriptsizerr}, \cmd{scriptsizerrr}.\\
+% Scale factor: 0,0416675.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{0.7083375\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\scriptsizer{%
+ \noexpand\@setfontsize\noexpand\scriptsizer
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{0.750005\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\scriptsizerr{%
+ \noexpand\@setfontsize\noexpand\scriptsizerr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{0.7916725\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\scriptsizerrr{%
+ \noexpand\@setfontsize\noexpand\scriptsizerrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% {\color{black}Definition of \cmd{tinyr}, \cmd{tinyrr}, \cmd{tinyrrr}.\\
+% Scale factor: 0.0416675.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{0.5416675\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\tinyr{%
+ \noexpand\@setfontsize\noexpand\tinyr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{0.583335\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\tinyrr{%
+ \noexpand\@setfontsize\noexpand\tinyrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{0.6250025\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\tinyrrr{%
+ \noexpand\@setfontsize\noexpand\tinyrrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% {\color{black}Definition of \cmd{normalsizer}, \cmd{normalsizerr}, \cmd{normalsizerrr}.\\
+% Scale factor: 0.05.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{1.05\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \fontsize@pre
+ \edef\normalsizer{%
+ \noexpand\@setfontsize\noexpand\normalsizer
+ {\the\@tempdima}{\the\@tempdimb}%
+ \fontsize@app
+ \let\noexpand\@listi\noexpand\@listI
+ }%
+ \setlength{\@tempdima}{1.1\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \fontsize@pre
+ \edef\normalsizerr{%
+ \noexpand\@setfontsize\noexpand\normalsizerr
+ {\the\@tempdima}{\the\@tempdimb}%
+ \fontsize@app
+ \let\noexpand\@listi\noexpand\@listI
+ }%
+ \setlength{\@tempdima}{1.15\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \fontsize@pre
+ \edef\normalsizerrr{%
+ \noexpand\@setfontsize\noexpand\normalsizerrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ \fontsize@app
+ \let\noexpand\@listi\noexpand\@listI
+ }%
+% \end{macrocode}
+% {\color{black}Definition of \cmd{larger}, \cmd{largerr}, \cmd{largerrr}.\\
+% Scale factor: 0,06.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{1.26\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\larger{%
+ \noexpand\@setfontsize\noexpand\larger
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.32\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\largerr{%
+ \noexpand\@setfontsize\noexpand\largerr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.38\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\largerrr{%
+ \noexpand\@setfontsize\noexpand\largerrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% {\color{black}Definition of \cmd{Larger}, \cmd{Largerr}, \cmd{Largerrr}.\\
+% Scale factor: 0,072.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{1.512\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\Larger{%
+ \noexpand\@setfontsize\noexpand\Larger
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.584\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\Largerr{%
+ \noexpand\@setfontsize\noexpand\Largerr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.656\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\Largerrr{%
+ \noexpand\@setfontsize\noexpand\Largerrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% {\color{black}Definition of \cmd{LARGEr}, \cmd{LARGErr}, \cmd{LARGErrr}.\\
+% Scale factor: 0,0865.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{1.8145\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\LARGEr{%
+ \noexpand\@setfontsize\noexpand\LARGEr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.901\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\LARGErr{%
+ \noexpand\@setfontsize\noexpand\LARGErr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{1.9875\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\LARGErrr{%
+ \noexpand\@setfontsize\noexpand\LARGErrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% {\color{black}Definition of \cmd{huger}, \cmd{hugerr}, \cmd{hugerrr}.\\
+% Scale factor: 0,1035.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{2.1775\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\huger{%
+ \noexpand\@setfontsize\noexpand\huger
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{2.281\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\hugerr{%
+ \noexpand\@setfontsize\noexpand\hugerr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{2.3845\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\hugerrr{%
+ \noexpand\@setfontsize\noexpand\hugerrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% {\color{black}Definition of \cmd{Huger}, \cmd{Hugerr}, \cmd{Hugerrr}.\\
+% Scale factor: 0.123.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{2.611\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\Huger{%
+ \noexpand\@setfontsize\noexpand\Huger
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{2.734\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\Hugerr{%
+ \noexpand\@setfontsize\noexpand\Hugerr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{2.857\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\Hugerrr{%
+ \noexpand\@setfontsize\noexpand\Hugerrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% {\color{black}Definition of \cmd{HUGE}, \cmd{HUGER}, \cmd{HUGERR}, \cmd{HUGERRR}.\\
+% Scale factor: 0,149.}
+% \begin{macrocode}
+ \setlength{\@tempdima}{3.006\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\HUGE{%
+ \noexpand\@setfontsize\noexpand\HUGE
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{3,155\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\HUGEr{%
+ \noexpand\@setfontsize\noexpand\HUGEr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{3,304\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\HUGErr{%
+ \noexpand\@setfontsize\noexpand\HUGErr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+ \setlength{\@tempdima}{3,453\@tempdimc}%
+ \setlength{\@tempdimb}{\@tempb\@tempdima}%
+ \edef\HUGErrr{%
+ \noexpand\@setfontsize\noexpand\HUGErrr
+ {\the\@tempdima}{\the\@tempdimb}%
+ }%
+% \end{macrocode}
+% \eaddition
+% \begin{macrocode}
+ \normalsize%
+% \end{macrocode}
+% The KOMA files do not define \cmd{parindent} and other lengths related to the page dimensions (\cmd{textheight}, \cmd{headheight}, \cmd{headsep}, etc.) Anyway, I think that some of these lengths are strictly linked to the font rather than to the dimensions of the page and the text, particularly \cmd{headheight}, whose value may cause a well known warning if \sty{fancyhdr} is loaded. So we define the following new lengths:
+% \baddition
+% \begin{macrocode}
+\setlength\parindent{\@tempdimb}%
+\setlength\headheight{\dimexpr(\@tempdimb+2pt)}%
+% \end{macrocode}
+% \eaddition
+% For the following lengths, all values are calculated proportionally to the main font. I took the \file{bk11.clo} file as a reference point. Note that the differences of these lengths in the files \file{bk10.clo} \file{bk11.clo} and \file{bk12.clo} only affect \cmd{headsep}, \cmd{topskip} and \cmd{footskip}, which are not redefined here.
+% \baddition
+% \begin{macrocode}
+\setlength\smallskipamount{\dimexpr(1.1\@tempdimb/4) \@plus 1\p@ \@minus 1\p@}%
+\setlength\medskipamount{\dimexpr(1.1\@tempdimb/2) \@plus 2\p@ \@minus 2\p@}%
+\setlength\bigskipamount{\dimexpr(1.1\@tempdimb) \@plus 4\p@ \@minus 4\p@}%
+% \end{macrocode}
+% \eaddition
+% The following table shows the values of some specific lengths
+% defined by the package, in relation to some significant settings
+% of the main font and line spacing. The values are expressed in pt
+% and rounded to the second decimal place.\medskip
+%
+% \begin{footnotesize}
+% \newcolumntype{Y}{@{}S[table-column-width=1.04cm]}
+% \centerline{%
+% \noindent\begin{tabular}{@{}m{3.7cm}@{\hskip2mm}YYYYYYYYYYY@{}}
+%\toprule
+% Normal size & 10.00 & 10.10 & 10.20 & 10.30 & 10.40 & 10.50 & 10.60 & 10.70 & 10.80 & 10.90 & 11.00 \\
+% Line spacing & 12.00 & 12.12 & 12.24 & 12.36 & 12.48 & 12.60 & 12.72 & 12.84 & 12.96 & 13.08 & 13.20 \\
+% \midrule
+% \cmd{headheight} & 12.00 & 12.10 & 12.20 & 12.30 & 12.40 & 12.50 & 12.60 & 12.70 & 12.80 & 12.90 & 13.00 \\
+% \cmd{parindent} & 10.00 & 10.10 & 10.20 & 10.30 & 10.40 & 10.50 & 10.60 & 10.70 & 10.80 & 10.90 & 11.00 \\
+% \cmd{smallskipamount}\ \hfill$\pm$\SI{1}{pt} & 2.75 & 2.78 & 2.81 & 2.83 & 2.86 & 2.89 & 2.92 & 2.94 & 2.97 & 3.00 & 3.03 \\
+% \cmd{medskipamount}\ \hfill$\pm$\SI{2}{pt} & 5.50 & 5.56 & 5.61 & 5.67 & 5.72 & 5.78 & 5.83 & 5.89 & 5.94 & 6.00 & 6.05 \\
+% \cmd{bigskipamount}\ \hfill$\pm$\SI{4}{pt} & 11.00 & 11.11 & 11.22 & 11.33 & 11.44 & 11.55 & 11.66 & 11.77 & 11.88 & 11.99 & 12.10 \\
+% \bottomrule
+% \end{tabular}
+% }
+% \end{footnotesize}
+% \begin{macrocode}
\setlength{\@tempdimb}{\f@baselineskip}%
\ctm@setlength{\parsep}%
{.3333\@tempdimb}{.1667\@tempdimb}{.0833\@tempdimb}%
@@ -481,9 +1262,695 @@ This work has the LPPL maintenance status "author-maintained".
\setlength{\@dblfpbot}{\@fptop}%
\ctm@setlength{\partopsep}{.2\@tempdimb}{.1\@tempdimb}{.1\@tempdimb}%
}
-\endinput
% \end{macrocode}
+%
+% \paragraph{Excerpt from \file{scrfontsizes.sty}}
+%
+% Here is a portion of the \sty{scrfontsizes} package. It simply provides the \cmd{generateclofile} command, without the KOMA-related definitions. There are no reserved names for the \file{.clo} files. The command name is a new name for the KOMA \cmd{generatefontfile}. In fact what the command generates is a \file{.clo} file.
+% \begin{macrocode}
+\newcommand*{\generateclofile}[1]{%
+ \kernel@ifnextchar [{\@generatefontfile{#1}}{\@@generatefontfile{#1}}%
+}
+\newcommand*{\@generatefontfile}{}
+\def\@generatefontfile#1[#2]#3{%
+ \begingroup
+% \end{macrocode}
+% At least starting from version 3.31 of \sty{scrfontsizes},
+% the code of the \cmd{@generatefontfile} and \cmd{@@generatefontfile}
+% commands sets the \cmd{parskip} value to |0pt|. We also use |[#2]|
+% in place of |[{#2}]| for the optional argument of \cmd{changefontsize}
+% used immediately below.
+% \begin{macrocode}
+ \setlength{\parskip}{0pt}%
+ \changefontsize[#2]{#3}%
+ \generate@fontfile{#1}{#3}%
+ \endgroup
+}
+\newcommand\@@generatefontfile[2]{%
+ \begingroup
+ \setlength{\parskip}{0pt}%
+ \changefontsize{#2}%
+ \generate@fontfile{#1}{#2}%
+ \endgroup
+}
+\newcommand*{\@@@generatefontfile}[2][]{}
+\newcommand*{\@fontfile}{}
+\let\@fontfile\@mainaux
+\newcommand*{\generate@fontfile}[2]{%
+ \def\@ind{\space\space}%
+ \immediate\openout\@fontfile #1#2.clo
+ \immediate\write\@fontfile{\@percentchar^^J%
+ \@percentchar\space This is file `#1#2.clo', generated with^^J%
+% \end{macrocode}
+% In the next three lines we only replace `scrfontsizes' with `fontsize'
+% and `Markus Kohm' with `Ivan Valbusa', in order to get the correct information
+% in the .log file.
+% \begin{macrocode}
+ \@percentchar\space fontsize
+ \csname ver@fontsize.\@pkgextension\endcsname,^^J%
+ \@percentchar\space Copyright (c) Ivan Valbusa.^^J%
+ \@percentchar^^J%
+ \string\ProvidesFile{#1#2.clo}[%
+ \the\year/\ifnum\month<10 0\fi\the\month/\ifnum\day<10 0\fi\the\day%
+ \space generated font size class option (#2)]}%
+ \immediate\write\@fontfile{%
+ \string\def\string\normalsize{\@percentchar^^J%
+ \@ind\string\@setfontsize\string\normalsize{\f@size}{\f@baselineskip}%
+ \@percentchar^^J%
+ \@ind\string\abovedisplayskip\space \the\abovedisplayskip^^J%
+ \@ind\string\abovedisplayshortskip\space \the\abovedisplayshortskip^^J%
+ \@ind\string\belowdisplayskip\space \the\belowdisplayskip^^J%
+ \@ind\string\belowdisplayshortskip\space \the\belowdisplayshortskip^^J%
+ \@ind\string\let\string\@listi\string\@listI^^J%
+ }\@percentchar%
+ }%
+ \begingroup\small\@listi
+ \immediate\write\@fontfile{%
+ \string\def\string\small{\@percentchar^^J%
+ \@ind\string\@setfontsize\string\small{\f@size}{\f@baselineskip}%
+ \@percentchar^^J%
+ \@ind\string\abovedisplayskip\space \the\abovedisplayskip^^J%
+ \@ind\string\abovedisplayshortskip\space \the\abovedisplayshortskip^^J%
+ \@ind\string\belowdisplayskip\space \the\belowdisplayskip^^J%
+ \@ind\string\belowdisplayshortskip\space \the\belowdisplayshortskip^^J%
+ \@ind\string\def\string\@listi{\@percentchar^^J%
+ \@ind\@ind\string\leftmargin\string\leftmargini^^J%
+ \@ind\@ind\string\topsep \the\topsep^^J%
+ \@ind\@ind\string\parsep \the\parsep^^J%
+ \@ind\@ind\string\itemsep \string\parsep^^J%
+ \@ind}\@percentchar^^J%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\footnotesize\@listi
+ \immediate\write\@fontfile{%
+ \string\def\string\footnotesize{\@percentchar^^J%
+ \@ind\string\@setfontsize\string\footnotesize{\f@size}{\f@baselineskip}%
+ \@percentchar^^J%
+ \@ind\string\abovedisplayskip\space \the\abovedisplayskip^^J%
+ \@ind\string\abovedisplayshortskip\space \the\abovedisplayshortskip^^J%
+ \@ind\string\belowdisplayskip\space \the\belowdisplayskip^^J%
+ \@ind\string\belowdisplayshortskip\space \the\belowdisplayshortskip^^J%
+ \@ind\string\def\string\@listi{\@percentchar^^J%
+ \@ind\@ind\string\leftmargin\string\leftmargini^^J%
+ \@ind\@ind\string\topsep \the\topsep^^J%
+ \@ind\@ind\string\parsep \the\parsep^^J%
+ \@ind\@ind\string\itemsep \string\parsep^^J%
+ \@ind}\@percentchar^^J%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\scriptsize
+ \immediate\write\@fontfile{%
+ \string\def\string\scriptsize{%
+ \string\@setfontsize\string\scriptsize{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\tiny
+ \immediate\write\@fontfile{%
+ \string\def\string\tiny{%
+ \string\@setfontsize\string\tiny{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\large
+ \immediate\write\@fontfile{%
+ \string\def\string\large{%
+ \string\@setfontsize\string\large{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Large
+ \immediate\write\@fontfile{%
+ \string\def\string\Large{%
+ \string\@setfontsize\string\Large{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\LARGE
+ \immediate\write\@fontfile{%
+ \string\def\string\LARGE{%
+ \string\@setfontsize\string\LARGE{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\huge
+ \immediate\write\@fontfile{%
+ \string\def\string\huge{%
+ \string\@setfontsize\string\huge{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Huge
+ \immediate\write\@fontfile{%
+ \string\def\string\Huge{%
+ \string\@setfontsize\string\Huge{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+% \end{macrocode}
+% The new sizing commands previously defined are recalled here and
+% written in the .clo file if the \cmd{generateclofile} command is used.
+% \baddition
+% \begin{macrocode}
+ \begingroup\tinyr
+\immediate\write\@fontfile{%
+ \string\def\string\tinyr{%
+ \string\@setfontsize\string\tinyr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+}%
+\endgroup
+\begingroup\tinyrr
+\immediate\write\@fontfile{%
+ \string\def\string\tinyrr{%
+ \string\@setfontsize\string\tinyrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+}%
+\endgroup
+\begingroup\tinyrrr
+\immediate\write\@fontfile{%
+ \string\def\string\tinyrrr{%
+ \string\@setfontsize\string\tinyrrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+}%
+ \endgroup
+ \begingroup\scriptsizer
+ \immediate\write\@fontfile{%
+ \string\def\string\scriptsizer{%
+ \string\@setfontsize\string\scriptsizer{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\scriptsizerr
+ \immediate\write\@fontfile{%
+ \string\def\string\scriptsizerr{%
+ \string\@setfontsize\string\scriptsizerr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+\endgroup
+ \begingroup\scriptsizerrr
+ \immediate\write\@fontfile{%
+ \string\def\string\scriptsizerrr{%
+ \string\@setfontsize\string\scriptsizerrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+\def\fs@appnormal{
+ \@percentchar^^J%
+ \@ind\string\abovedisplayskip\space \the\abovedisplayskip^^J%
+ \@ind\string\abovedisplayshortskip\space \the\abovedisplayshortskip^^J%
+ \@ind\string\belowdisplayskip\space \the\belowdisplayskip^^J%
+ \@ind\string\belowdisplayshortskip\space \the\belowdisplayshortskip^^J%
+ \@ind\string\let\string\@listi\string\@listI^^J%
+}
+\def\fs@appsmall{%
+ \@percentchar^^J%
+ \@ind\string\abovedisplayskip\space \the\abovedisplayskip^^J%
+ \@ind\string\abovedisplayshortskip\space \the\abovedisplayshortskip^^J%
+ \@ind\string\belowdisplayskip\space \the\belowdisplayskip^^J%
+ \@ind\string\belowdisplayshortskip\space \the\belowdisplayshortskip^^J%
+ \@ind\string\def\string\@listi{\@percentchar^^J%
+ \@ind\@ind\string\leftmargin\string\leftmargini^^J%
+ \@ind\@ind\string\topsep \the\topsep^^J%
+ \@ind\@ind\string\parsep \the\parsep^^J%
+ \@ind\@ind\string\itemsep \string\parsep^^J%
+ \@ind}\@percentchar^^J%
+}
+ \begingroup\smallr\@listi
+ \immediate\write\@fontfile{%
+ \string\def\string\smallr{\@percentchar^^J%
+ \@ind\string\@setfontsize\string\smallr{\f@size}{\f@baselineskip}%
+ \fs@appsmall%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\smallrr\@listi
+ \immediate\write\@fontfile{%
+ \string\def\string\smallrr{\@percentchar^^J%
+ \@ind\string\@setfontsize\string\smallrr{\f@size}{\f@baselineskip}%
+ \fs@appsmall%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\smallrrr\@listi
+ \immediate\write\@fontfile{%
+ \string\def\string\smallrrr{\@percentchar^^J%
+ \@ind\string\@setfontsize\string\smallrrr{\f@size}{\f@baselineskip}%
+ \fs@appsmall%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\footnotesizer\@listi
+ \immediate\write\@fontfile{%
+ \string\def\string\footnotesizer{\@percentchar^^J%
+ \@ind\string\@setfontsize\string\footnotesizer{\f@size}{\f@baselineskip}%
+ \fs@appsmall%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\footnotesizerr\@listi
+ \immediate\write\@fontfile{%
+ \string\def\string\footnotesizerr{\@percentchar^^J%
+ \@ind\string\@setfontsize\string\footnotesizerr{\f@size}{\f@baselineskip}%
+ \fs@appsmall%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\footnotesizerrr\@listi
+ \immediate\write\@fontfile{%
+ \string\def\string\footnotesizerrr{\@percentchar^^J%
+ \@ind\string\@setfontsize\string\footnotesizerrr{\f@size}{\f@baselineskip}%
+ \fs@appsmall%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\normalsizer
+ \immediate\write\@fontfile{%
+ \string\def\string\normalsizer{\@percentchar^^J%
+ \@ind\string\@setfontsize\string\normalsizer{\f@size}{\f@baselineskip}%
+ \fs@appnormal%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\normalsizerr
+ \immediate\write\@fontfile{%
+ \string\def\string\normalsizerr{\@percentchar^^J%
+ \@ind\string\@setfontsize\string\normalsizerr{\f@size}{\f@baselineskip}%
+ \fs@appnormal%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\normalsizerrr
+ \immediate\write\@fontfile{%
+ \string\def\string\normalsizerrr{\@percentchar^^J%
+ \@ind\string\@setfontsize\string\normalsizerrr{\f@size}{\f@baselineskip}%
+ \fs@appnormal%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\larger
+ \immediate\write\@fontfile{%
+ \string\def\string\larger{%
+ \string\@setfontsize\string\larger{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\largerr
+ \immediate\write\@fontfile{%
+ \string\def\string\largerr{%
+ \string\@setfontsize\string\largerr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\largerrr
+ \immediate\write\@fontfile{%
+ \string\def\string\largerrr{%
+ \string\@setfontsize\string\largerrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Large
+ \immediate\write\@fontfile{%
+ \string\def\string\Large{%
+ \string\@setfontsize\string\Large{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Larger
+ \immediate\write\@fontfile{%
+ \string\def\string\Larger{%
+ \string\@setfontsize\string\Larger{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Largerr
+ \immediate\write\@fontfile{%
+ \string\def\string\Largerr{%
+ \string\@setfontsize\string\Largerr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Largerrr
+ \immediate\write\@fontfile{%
+ \string\def\string\Largerrr{%
+ \string\@setfontsize\string\Largerrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+\endgroup
+ \begingroup\LARGEr
+ \immediate\write\@fontfile{%
+ \string\def\string\LARGEr{%
+ \string\@setfontsize\string\LARGEr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\LARGErr
+ \immediate\write\@fontfile{%
+ \string\def\string\LARGErr{%
+ \string\@setfontsize\string\LARGErr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\LARGErrr
+ \immediate\write\@fontfile{%
+ \string\def\string\LARGErrr{%
+ \string\@setfontsize\string\LARGErrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+\endgroup
+ \begingroup\huger
+ \immediate\write\@fontfile{%
+ \string\def\string\huger{%
+ \string\@setfontsize\string\huger{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\hugerr
+ \immediate\write\@fontfile{%
+ \string\def\string\hugerr{%
+ \string\@setfontsize\string\hugerr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\hugerrr
+ \immediate\write\@fontfile{%
+ \string\def\string\hugerrr{%
+ \string\@setfontsize\string\hugerrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+\endgroup
+ \begingroup\Huger
+ \immediate\write\@fontfile{%
+ \string\def\string\Huger{%
+ \string\@setfontsize\string\Huger{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Hugerr
+ \immediate\write\@fontfile{%
+ \string\def\string\Hugerr{%
+ \string\@setfontsize\string\Hugerr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\Hugerrr
+ \immediate\write\@fontfile{%
+ \string\def\string\Hugerrr{%
+ \string\@setfontsize\string\Hugerrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+\endgroup
+ \begingroup\HUGE
+ \immediate\write\@fontfile{%
+ \string\def\string\HUGE{%
+ \string\@setfontsize\string\HUGE{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\HUGEr
+ \immediate\write\@fontfile{%
+ \string\def\string\HUGEr{%
+ \string\@setfontsize\string\HUGEr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\HUGErr
+ \immediate\write\@fontfile{%
+ \string\def\string\HUGErr{%
+ \string\@setfontsize\string\HUGErr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+ \endgroup
+ \begingroup\HUGErrr
+ \immediate\write\@fontfile{%
+ \string\def\string\HUGErrr{%
+ \string\@setfontsize\string\HUGErrr{\f@size}{\f@baselineskip}%
+ }\@percentchar%
+ }%
+\endgroup
+% \end{macrocode}
+% \eaddition
+% \begin{macrocode}
+ \immediate\write\@fontfile{\string\normalsize}%
+% \end{macrocode}
+% The new lengths previously defined are recalled here and written in the .clo file
+% if the \cmd{generateclofile} command is used.
+% \baddition
+% \begin{macrocode}
+\begingroup
+\immediate\write\@fontfile{%
+ \string\setlength{\string\parindent}{\the\parindent}^^J%
+ \string\setlength{\string\headheight}{\the\headheight}^^J%
+ \string\setlength{\string\smallskipamount}{\the\smallskipamount}^^J%
+ \string\setlength{\string\medskipamount}{\the\medskipamount}^^J%
+ \string\setlength{\string\bigskipamount}{\the\bigskipamount}^^J%
+}%
+\endgroup
+% \end{macrocode}
+% \eaddition
+% \begin{macrocode}
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\footnotesep}{\the\footnotesep}\@percentchar
+ }%
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\skip\string\footins}{\the\skip\footins}\@percentchar
+ }%
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\floatsep}{\the\floatsep}\@percentchar
+ }%
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\textfloatsep}{\the\textfloatsep}\@percentchar
+ }%
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\intextsep}{\the\intextsep}\@percentchar
+ }%
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\dblfloatsep}{\the\dblfloatsep}\@percentchar
+ }%
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\dbltextfloatsep}{\the\dbltextfloatsep}\@percentchar
+ }%
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\@fptop}{\the\@fptop}\@percentchar
+ }%
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\@fpsep}{\the\@fpsep}\@percentchar
+ }%
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\@fpbot}{\the\@fpbot}\@percentchar
+ }%
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\@dblfptop}{\the\@dblfptop}\@percentchar
+ }%
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\@dblfpsep}{\the\@dblfpsep}\@percentchar
+ }%
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\@dblfpbot}{\the\@dblfpbot}\@percentchar
+ }%
+ \immediate\write\@fontfile{%
+ \string\setlength{\string\partopsep}{\the\partopsep}\@percentchar
+ }%
+ \begingroup
+ \@listi
+ \immediate\write\@fontfile{%
+ \string\def\string\@listi{\@percentchar^^J%
+ \@ind\string\leftmargin\string\leftmargini^^J%
+ \@ind\string\topsep \the\topsep^^J%
+ \@ind\string\parsep \the\parsep^^J%
+ \@ind\string\itemsep \string\parsep^^J%
+ }\@percentchar
+ }%
+ \endgroup
+ \immediate\write\@fontfile{%
+ \string\let\string\@listI\string\@listi
+ }%
+ \begingroup
+ \@listii
+ \immediate\write\@fontfile{%
+ \string\def\string\@listii{\@percentchar^^J%
+ \@ind\string\leftmargin\string\leftmarginii^^J%
+ \@ind\string\labelwidth\string\leftmarginii^^J%
+ \@ind\string\advance\string\labelwidth-\string\labelsep^^J%
+ \@ind\string\topsep \the\topsep^^J%
+ \@ind\string\parsep \the\parsep^^J%
+ \@ind\string\itemsep \string\parsep^^J%
+ }\@percentchar
+ }%
+ \endgroup
+ \begingroup
+ \@listiii
+ \immediate\write\@fontfile{%
+ \string\def\string\@listiii{\@percentchar^^J%
+ \@ind\string\leftmargin\string\leftmarginiii^^J%
+ \@ind\string\labelwidth\string\leftmarginiii^^J%
+ \@ind\string\advance\string\labelwidth-\string\labelsep^^J%
+ \@ind\string\topsep \the\topsep^^J%
+ \@ind\string\parsep \the\parsep^^J%
+ \@ind\string\partopsep \the\partopsep^^J%
+ \@ind\string\itemsep \string\topsep^^J%
+ }\@percentchar
+ }%
+ \endgroup
+ \begingroup
+ \@listiv
+ \immediate\write\@fontfile{%
+ \string\def\string\@listiv{\@percentchar^^J%
+ \@ind\string\leftmargin\string\leftmarginiv^^J%
+ \@ind\string\labelwidth\string\leftmarginiv^^J%
+ \@ind\string\advance\string\labelwidth-\string\labelsep^^J%
+ }\@percentchar
+ }%
+ \endgroup
+ \begingroup
+ \@listv
+ \immediate\write\@fontfile{%
+ \string\def\string\@listv{\@percentchar^^J%
+ \@ind\string\leftmargin\string\leftmarginv^^J%
+ \@ind\string\labelwidth\string\leftmarginv^^J%
+ \@ind\string\advance\string\labelwidth-\string\labelsep^^J%
+ }\@percentchar
+ }%
+ \endgroup
+ \begingroup
+ \@listvi
+ \immediate\write\@fontfile{%
+ \string\def\string\@listvi{\@percentchar^^J%
+ \@ind\string\leftmargin\string\leftmarginvi^^J%
+ \@ind\string\labelwidth\string\leftmarginvi^^J%
+ \@ind\string\advance\string\labelwidth-\string\labelsep^^J%
+ }\@percentchar
+ }%
+ \endgroup
+ \immediate\write\@fontfile{%
+ \string\@ifundefined{@list@extra}{}{\@percentchar^^J%
+ \string\expandafter\string\ifnum\string\scr@v@is@ge{3.17}%
+ \string\par@updaterelative\string\fi^^J%
+ \@ind\string\l@addto@macro{\string\@listi}{\string\@list@extra}%
+ \@percentchar^^J%
+ \@ind\string\let\string\@listI=\string\@listi^^J%
+ \@ind\string\l@addto@macro{\string\@listii}{\string\@list@extra}%
+ \@percentchar^^J%
+ \@ind\string\l@addto@macro{\string\@listiii}{\string\@list@extra}%
+ \@percentchar^^J%
+ \@ind\string\l@addto@macro{\string\footnotesize}{\string\protect
+ \string\add@extra@listi{ftns}}\@percentchar^^J%
+ \@ind\string\l@addto@macro{\string\small}{\string\protect
+ \string\add@extra@listi{sml}}\@percentchar^^J%
+ }\@percentchar^^J%
+ \string\@listi^^J%
+ \string\endinput^^J%
+ \@percentchar^^J%
+ \@percentchar\space End of file `#1#2.clo'.
+ }
+ \immediate\closeout\@fontfile
+}
+\@onlypreamble\generateclofile
+% \end{macrocode}
+% We will now define some internal commands to test the package functions.
+% Since version 0.6 I have been using the \LaTeX 3 solution provided by
+% Enrico Gregorio in place of the previous macros based on \sty{etoolbox}.
+% \baddition
+% \begin{macrocode}
+\def\fontsizelipsum{%
+ As any dedicated reader can clearly see, the Ideal of practical reason is a
+ representation of, as far as I know, the things in themselves; as I have shown
+ elsewhere, the phenomena should only be used as a canon for our understanding.
+ The paralogisms of practical reason are what first give rise to the
+ architectonic of practical reason. As will easily be shown in the
+ next section, reason would thereby be made to contradict, in view of
+ these considerations, the Ideal of practical reason, yet the manifold
+ depends on the phenomena.}
+
+\ExplSyntaxOn
+
+\NewDocumentCommand{\printsamples}
+{
+ m
+ m
+ O{tiny,tinyr,tinyrr,tinyrrr,
+ scriptsize,scriptsizer,scriptsizerr,scriptsizerrr,
+ footnotesize,footnotesizer,footnotesizerr,footnotesizerrr,
+ small,smallr,smallrr,smallrrr,
+ normalsize,normalsizer,normalsizerr,normalsizerrr,
+ large,larger,largerr,largerrr,
+ Large,Larger,Largerr,Largerrr,
+ LARGE,LARGEr,LARGErr,LARGErrr,
+ huge,huger,hugerr,hugerrr,
+ Huge,Huger,Hugerr,Hugerrr,
+ HGE,HUGEr,HUGErr,HUGErrr,
+ }
+}
+{
+ \fontsize_printsamples:nnn { #1 } { #2 } { #3 }
+}
+
+% helper function to print the rounded sizes
+\cs_new:Nn \__fontsize_round_f:n
+{
+ \fp_eval:n { round(\use:c{f@#1},1) } pt
+}
+
+% the main function
+\cs_new_protected:Nn \fontsize_printsamples:nnn
+{
+ % group to bound the font changes
+ \group_begin:
+ % set the size
+ \changefontsize[#1]{#2}\selectfont
+ % header
+ \subsubsection*{Text~samples~for~\symbol{92}normalsize~#2~on~#1}
+ % map through the desired sizes
+ \clist_map_inline:nn { #3 }
+ {
+ \use:c{##1} % set the font size
+ \noindent\texttt{\symbol{92}##1}:~ % print the font size command
+ \__fontsize_round_f:n {size}~on~ % print the size in points
+ \__fontsize_round_f:n {baselineskip}.~ % print the baseline skip in points
+ \fontsizelipsum % sample text
+ \par\addvspace{\medskipamount} % finish up
+ }
+ % close the group
+ \group_end:
+}
+\ExplSyntaxOff
+% \end{macrocode}
+% \eaddition
% \iffalse
%</package>
% \fi
+%
+% \iffalse
+%<*bib>
+@manual{xkeyval,
+ title = {The \textsf{xkeyval} package},
+ subtitle = {Extension of the keyval package},
+ author = {Adriaens, Hendri},
+ url = {http://www.ctan.org/pkg/xkeyval},
+ urldate = {2020-07-05},
+ date = {2014-03-12},
+ version = {2.7a}
+}
+
+@manual{etoolbox,
+ title = {The \sty{etoolbox} Package. An e-\TeX{} Toolbox
+ for Class and Package Authors},
+ author = {Philipp Lehman and Joseph Wright},
+ url = {http://www.ctan.org/pkg/etoolbox},
+ urldate = {2020-07-05},
+ date = {2019-09-21},
+ version = {2.5h}
+}
+
+@manual{koma,
+ title = {KOMA -- Script. A versatile \LaTeXe{} bundle},
+ author = {Frank Neukam and Markus Kohm and Axel Kielhorn},
+ url = {http://www.ctan.org/pkg/koma-script},
+ urldate = {2020-07-05},
+ date = {2020-04-19},
+ version = {3.30}
+}
+%</bib>
+% \fi
% \Finale
diff --git a/Master/texmf-dist/source/latex/footnotehyper/footnotehyper.dtx b/Master/texmf-dist/source/latex/footnotehyper/footnotehyper.dtx
index 204c40a2bcd..b42e003c2b1 100644
--- a/Master/texmf-dist/source/latex/footnotehyper/footnotehyper.dtx
+++ b/Master/texmf-dist/source/latex/footnotehyper/footnotehyper.dtx
@@ -1,20 +1,20 @@
% -*- coding: utf-8; time-stamp-format: "%02d-%02m-%:y at %02H:%02M:%02S %Z" -*-
%<*none>
-\def\dtxtimestamp {Time-stamp: <07-11-2019 at 17:09:56 CET>}
+\def\dtxtimestamp {Time-stamp: <04-02-2021 at 12:57:09 CET>}
%</none>
%<*!readme>
%%
%% Package: footnotehyper
-%% Version: 1.1a (2019/11/07)
+%% Version: 1.1d (2021/02/04)
%% License: LPPL 1.3c
-%% Copyright (C) 2016-2019 Jean-Francois Burnol <jfbu at free dot fr>.
+%% Copyright (C) 2016-2021 Jean-Francois Burnol <jfbu at free dot fr>.
%%
%</!readme>
%<*tex>
\def\pkgname {footnotehyper}
-\def\pkgdate {2019/11/07}
-\def\docdate {2019/11/07}
-\def\pkgversion {v1.1a}
+\def\pkgdate {2021/02/04}
+\def\docdate {2021/02/04}
+\def\pkgversion {v1.1d}
\def\pkgdescription {hyperref aware footnote.sty (JFB)}
%</tex>
%<*none>
@@ -25,9 +25,9 @@
\catcode32=13\catcode`\\=12^^Brelax^^A
^^Bfirstofone{^^Bendgroup^^Bdef^^BpkgLicense^^A
{% Package: footnotehyper
-% Version: 1.1a (2019/11/07)
+% Version: 1.1d (2021/02/04)
% License: LPPL 1.3c
-% Copyright (C) 2016-2019 Jean-Francois Burnol <jfbu at free dot fr>.
+% Copyright (C) 2016-2021 Jean-Francois Burnol <jfbu at free dot fr>.
%
% This Work may be distributed and/or modified under the conditions
% of the LaTeX Project Public License, version 1.3c. This version of
@@ -54,11 +54,11 @@
%<*readme>
<!-- -->
- Source: footnotehyper.dtx (v1.1a 2019/11/07)
+ Source: footnotehyper.dtx (v1.1d 2021/02/04)
Author: Jean-Francois Burnol
Info: hyperref aware footnote.sty
License: LPPL 1.3c
- Copyright (C) 2016-2019 Jean-Francois Burnol <jfbu at free dot fr>.
+ Copyright (C) 2016-2021 Jean-Francois Burnol <jfbu at free dot fr>.
ABSTRACT
@@ -249,7 +249,8 @@ footnotehyper.pdf, footnotehyper.dvi.
\PassOptionsToPackage{dvipdfm}{geometry}
\PassOptionsToPackage{bookmarks=true}{hyperref}
\PassOptionsToPackage{dvipdfmx-outline-open}{hyperref}
- \PassOptionsToPackage{dvipdfmx-outline-open}{bookmark}
+% obsolète
+% \PassOptionsToPackage{dvipdfmx-outline-open}{bookmark}
%
\def\pgfsysdriver{pgfsys-dvipdfm.def}
\else
@@ -353,39 +354,161 @@ loaded with its `hyperfootnotes=false` option. The order of loading of
\obeyspaces\obeylines %
\pkgLicense\endgroup
-\section{Usage}
+\section{Changes}
+
+\begin{description}
+\item[v0.9c (2016/04/19)] First release: adapt original package to be
+ |hyperref| and |color/xcolor| compatible.
+
+\item[v0.9e (2016/04/30)] Abort in absence of |hyperref|. Compatibility with
+ |babel-french|.
-Since |v0.99|, \fnh does not
-load package
-|footnote.sty|\footnote{\url{http://ctan.org/pkg/footnote}}
-anymore, and is even incompatible with it at it uses the same user
-interface.
+\item[v0.99 (2017/02/16)] Do not load package
+ |footnote.sty|\footnote{\url{http://ctan.org/pkg/footnote}} anymore.
-Since |v1.0|, \fnh is usable also in absence of |hyperref| or when
-the latter was passed |hyperfootnotes=false| option.
+ From then on \fnh is
+ incompatible with it at it uses the same user interface.
-Version |v1.1| fixes a bug which arose when |savenotes| environment was used
-\emph{inside} a minipage: footnotes were disappearing!%
+\item[v1.0 (2017/03/07)] Be usable also in absence of |hyperref| or when the
+ latter was passed |hyperfootnotes=false| option.
+
+\item[v1.1 (2018/01/23)] Fix bug which arose when |savenotes| environment was used
+ \emph{inside} a minipage: footnotes were disappearing!%
%
-\footnote{Thanks to François Pantigny for reporting the bug.
- A later suggestion of the same is to let the package do nothing under
- Beamer class, and this is what |v1.1a 2019/11/07| does.}
+\footnote{Thanks to François Pantigny for reporting the bug. A later
+ suggestion of the same is to let the package do nothing under Beamer class,
+ and this is what |v1.1a 2019/11/07| does.}
%
See related remarks at end of \autoref{sec:notes}.
-The package thus provides:
-\begin{itemize}
-\item a |savenotes| environment which re-routes footnotes and delivers them at
- the end (there is also the |\savenotes/\spewnotes| syntax; it does create a
- group like the environment),
-\item |footnote| and |footnotetext| environments to allow footnotes
- with verbatim material.
-\end{itemize}
+\item[v1.1a (2019/11/07)] Abort under |beamer| (difficulty with |@makefntext|
+ and suspicion |beamer| does not need \fnh).
+
+\item[v1.1b (2021/01/26)] Fix incompatibility with the combination |memoir| +
+ |babel-french|.
+
+\item[v1.1c (2021/01/29)] Fix legacy bug of original package interfering with
+ \LaTeX2e mechanism to suppress indentation after mid-paragraph lists (when
+ |savenotes| environment directly wraps the enclosed list environment,
+ mid-paragraph).
+
+\item[v1.1d (2021/02/04)] Fix regression at |v1.1b| which caused a build crash
+ whenever \fnh decided to raise a warning relative to |\@makefntext|.%
+%
+\footnote{Thanks to Leon K. for reporting the bug.}
-But the constructability of the |footnote/footnotetext| environments depends
-on how |\@makefntext| has been customized by the class or other packages; a
-warning is issued if the situation appears to be desperate.\footnote{original
- |footnote.sty| could end up in a low level \TeX\ error.}
+ Refactor analysis of \cs{@makefntext} for simpler and better support of
+ |babel-french|.%
+\footnote{Only basic
+ context has been tested with |babel-french|: standard classes, |KOMA|-script,
+ |memoir|. Extra packages may make the \fnh environments cause breakage.}
+%
+ Better support
+ contexts such as presence of package |cleveref|.%
+
+ Add \verb=\iffootnotehyperparse= and \verb=\iffootnotehyperwarn= booleans.
+
+\end{description}
+\section{Usage}
+
+As summarized in the abstract, the package provides:
+\begin{savenotes}% juste pour vérifier le fix à 1.1c
+ \begin{itemize}
+ \item a |savenotes| environment which re-routes footnotes and delivers them
+ at the end (there is also the |\savenotes/\spewnotes| syntax; which does
+ create a group like the environment),
+ \item |footnote| and |footnotetext| environments to allow footnotes with
+ verbatim material.
+ \end{itemize}
+\end{savenotes}
+Setting-up the environments proceeds from an analysis of the pre-existing
+internal \LaTeX\ macro |\@makefntext|. The next section discusses problems
+which may arise.
+
+\subsection{Potential difficulties with the footnote and footnotetext
+ environments}
+
+ What is discussed here only affects the \emph{environments} |footnote| and
+ |footnotetext| not the macros \cs{footnote} and \cs{footnotetext}.
+
+ \fnh inherits from |footnote| original package the aim to
+ convert |\@makefntext| into two parts, the first one to be inserted
+ at the start of a footnote in environment form, the second one (usually
+ empty) at its end.%
+%
+\begin{footnote}
+ \LaTeX\ inserts some stuff before and after the footnote text, even before
+ handing it over as argument to \cs{@makefntext}. These tokens are currently
+ hardcoded into the \fnh environments for footnotes.
+\end{footnote}
+%
+ It thus hopes that the replacement text of |\@makefntext| contains only once
+ its parameter token |#1|, and that it is used there unbraced. This is the case
+ with the |article| class.
+
+ Known bug (may be promoted to feature at some point): the analysis is done
+ only once at begin document, whereas the |article.cls|'s redefines
+ |\@makefntext| during execution of |\maketitle|. However, it does not look
+ really urgent to support at all costs usage of the environment |footnote| in
+ the |\author| etc... data which contributes to the |\maketitle| expansion.%
+%
+ \begin{footnote}
+\phantomsection\label{fn:texperts}%
+ \TeX perts note: |\def\FNH@prefntext{\@makefntext{}}| would make the
+ footnote environment dynamically adjust to circumstances, when
+ |\@makefntext| only adds some prefix and no postfix. In fact, this is
+ (in a more complicated form for compatibility with |KOMA|-script and to
+ obey the |FBFrenchFootnotes| setting and the additional extra stuff
+ inserted by |babel-french| before and after) basically what is done by
+ \fnh to handle
+ |babel-french|.
+
+ As it may cause instability if extra packages fiddle
+ with |\@makefntext|, or |\@makefntext| is radically re-defined in some
+ environments provided by the class, \fnh does not use this when its
+ begin document analysis concluded the argument was used unbraced and at
+ last position in replacement text of |\@makefntext|, but it freezes the
+ found prefix. However, when it is concluded that probably |\@makefntext|
+ has been redefined in an |<extra tokens>\old@makefntext| way (for
+ example, this is the case with |cleveref| package), then the
+ |\def\FNH@prefntext{\@makefntext{}}| approach is taken, despite the
+ risks inherent to it.
+
+ You can provide your own definitions of
+ \cs{FNH@prefntext} and \cs{FNH@postfntext}. Then add
+ \cs{footnotehyperparsefalse} to the preamble.
+ \end{footnote}
+
+ Some seemingly innocent redefinitions such as the one
+ of |beamer| which was last time I checked (that was in 2019):
+\begin{verbatim}
+macro:#1->\def \insertfootnotetext {#1}\def \insertfootnotemark
+{\@makefnmark }
+\usebeamertemplate ***{footnote}
+\end{verbatim}
+ are not (easily) compatible with environment forms for footnotes
+ allowing verbatim material, as they require fetching the footnote
+ contents.%
+ \footnote{%\phantomsection\label{fn:beamer}% test, ça marche!
+ Since |v1.1a|, \fnh simply aborts under |beamer| class.}
+
+ In case of such a problematic |\@makefntext| \fnh raises a warning, to
+ explain that footnotes typeset using the environment forms will be
+ dysfunctional (the footnote marker at bottom of page will be missing,
+ probably). Footnotes using |\footnote| are not impacted by this.
+
+ % See \ref{fn:beamer} % test, ça marche, aussi avec environnement
+
+ Also \fnh emits some info message if |\@makefntext| was not as simple as
+ expected but nevertheless there is some hope that the |footnote| and
+ |footnotetext| environments will be fully functional. This is currently the
+ case in presence of package |cleveref| (see the \TeX perts
+ footnote \ref{fn:texperts}).
+
+ You can turn off these messages by adding \cs{footnotehyperwarnfalse}
+ to the document preamble.
+
+\subsection{Other potential or actual limitations}
It should be recalled that in case of |\footnotemark[N]| and
|\footnotetext[N]{...}| mark-up |hyperref| creates no hyperlink. This is not
@@ -403,6 +526,8 @@ Environments typesetting multiple times their contents are the most hostile to
footnotes. Currently, \fnh only handles especially the |amsmath|
environments (as in |footnote.sty|.)
+\subsection{A legacy macro from the original package, usage not recommended}
+
Finally there is a |\makesavenoteenv| command which takes as
argument an environment name and patches it to do the
|\savenotes/\spewnotes| automatically.%
@@ -417,21 +542,22 @@ one never knows what happens with such patches: for example the |[H]|
specifier provided by the |float| package overwrites the |\end{table}|
definition during the execution of |\begin{table}|\dots !
+\subsection{Example of use}
\begin{savenotes}
\begin{framed}
\DeleteShortVerb{\|}\MakeShortVerb{\*}%
{\centering
\begin{tabular}{|c|c|}
\hline
- \strut Inside\footnote{Notice that as frame
- extended to the next page,
- the end of the *savenotes* environment delivered its
- footnotes only here.} a & tabular\begin{footnote}Alternatively a
+ \strut Inside\footnote{If the frame
+ extends to the next page,
+ the end of the *savenotes* environment delivers its intercepted
+ footnotes only there.} a & tabular\begin{footnote}Alternatively a
*\savenotes/\spewnotes* pair
could have been used.\end{footnote}\\\hline
\end{tabular}\par}
\DeleteShortVerb{\*}\MakeShortVerb{\|}%
-An example:
+Here is an illustrative example of usage of the |savenotes| environment:
\begin{verbatim}
\begin{savenotes}
\begin{framed}
@@ -439,15 +565,16 @@ An example:
\footnote{\url{http://ctan.org/pkg/footnote}}
Particularly you may check its |savenotes| environment.%
- \footnote{It doesn't bring any
+ \footnote{\phantomsection\label{fn:floats}It doesn't bring any
feature to especially handle the issues related to footnotes in floating
environments, though.}
\end{framed}
\end{savenotes}
+Here is a link to an interesting footnote: \ref{fn:floats}.
\end{verbatim}
and the present frame has \cs{footnote}'s from inside a |tabular| and is
inside a |savenotes| environment.%
-\begin{footnote}
+\begin{footnote}\phantomsection\label{fn:minipage}
Here is an issue which has nothing (as I finally figured out) to
do with |footnote|, and only indirectly with \LaTeX: if you embed
a \emph{full-width} minipage (with initial \cs{noindent}) in any
@@ -520,20 +647,19 @@ No hyperfootnote link was inserted.%
|\footnotemark[N]/\footnotetext[N]{<foo>}| case. It does when
the |[N]| is absent or when it is used with a |\footnote| command
(or a |footnote| environment.)
-
- By the way, \fnh |v0.9f|'s |\footnotetext[N]| and |\begin{footnotetext}[N]|
- each had a bug and they were unusable \emph{inside} the |savenotes|
- environment. There was no issue \emph{outside}.
\end{footnotetext}
And a final footnote, done with |\begin{footnote}[57]|%
-\begin{footnote}[57]\csname @minipagetrue\endcsname % to reduce
- % framed inserted vertical spacing
- \begin{framed}
- \noindent\fnh works since |v1.0| also in absence of |hyperref| or when the
+\begin{footnote}[57]%\csname @minipagetrue\endcsname % to reduce
+% % framed inserted vertical spacing
+% \begin{framed}
+% \noindent
+ \fnh works since |v1.0| also in absence of |hyperref| or when the
latter was passed |hyperfootnotes=false| option.
- \end{framed}
+% \end{framed}
\end{footnote}.
-There is no problem with the hyperlink, then.
+There is no problem with the hyperlink, then. Oh, and don't forget to read
+this interesting footnote: \ref{fn:minipage} (just in case you skipped on
+first reading).
\section{Notes}\label{sec:notes}
@@ -568,6 +694,8 @@ A few items worth of mention:
\fi\fi
}%
\end{verbatim}
+On |2021/01/29| the interference (lost of some |babel-french| customization)
+is still there, as I checked now. This has nothing to do with \fnh.
% \endgroup
\item some environments typeset multiple times their contents,
which causes issues; \fnh takes provisions only to handle the
@@ -633,8 +761,10 @@ A few items worth of mention:
%</none>
%<*package>
% \begin{macro}{no options}
-% The package has no options.
+% The package has no options. I am too lazy.
% \begin{macrocode}
+\newif\iffootnotehyperparse\footnotehyperparsetrue
+\newif\iffootnotehyperwarn \footnotehyperwarntrue
\DeclareOption*%
{\PackageWarning{footnotehyper}{Option `\CurrentOption' is unknown}}%
\ProcessOptions\relax
@@ -669,6 +799,7 @@ A few items worth of mention:
% \begin{macrocode}
\newbox\FNH@notes
\newdimen\FNH@width
+\newtoks\FNH@toks % 1.1c
\let\FNH@colwidth\columnwidth
\newif\ifFNH@savingnotes
\AtBeginDocument {%
@@ -810,9 +941,37 @@ A few items worth of mention:
% |v1.1| fixes the bug about disappearing footnotes if |savenotes| environment
% is used inside a minipage. I had never really considered such usage, hence
% missed realizing there was a bug.
+%
+% |v1.1c 2021/01/29| fixes a legacy bug from |footnote| package: if used
+% to enclose a list environment inside a paragraph, it broke the
+% mechanism which suppresses indentation following the list.
+%
+% Now, situation would be far simpler here if we did not have this extra
+% |\begingroup| |\endgroup| pair in |\FNH@savenotes/\FNG@spewnotes|.
+%
+% A priori, as far as I understand, testing the |\if@endpe| flag should be
+% enough, but let's be extra cautious and check that |\par| is not |\@@par|.
+% Attention here that this is not necessarily followed by |\end{savenotes}| and
+% we have to support the |\savenotes/\spewnotes| syntax. The complication is
+% added from it creating a group without being a genuine \LaTeX2e environment.
% \begin{macrocode}
\def\FNH@spewnotes {%
- \endgroup
+ \if@endpe\ifx\par\@@par\FNH@toks{}\else
+ \FNH@toks\expandafter{\expandafter
+ \def\expandafter\par\expandafter{\par}\@endpetrue}%
+ \expandafter\expandafter\expandafter
+ \FNH@toks
+ \expandafter\expandafter\expandafter
+ {\expandafter\the\expandafter\FNH@toks
+ \expandafter\def\expandafter\@par\expandafter{\@par}}%
+ \expandafter\expandafter\expandafter
+ \FNH@toks
+ \expandafter\expandafter\expandafter
+ {\expandafter\the\expandafter\FNH@toks
+ \expandafter\everypar\expandafter{\the\everypar}}\fi
+ \else\FNH@toks{}\fi
+ \expandafter
+ \endgroup\the\FNH@toks
\ifFNH@savingnotes\else
\ifvoid\FNH@notes\else
\begingroup
@@ -945,6 +1104,7 @@ A few items worth of mention:
% \begin{macro}{\@makefntext}
% \begin{macro}{\FNH@prefntext}
% \begin{macro}{\FNH@postfntext}
+% \begin{macro}{\FNH@check}
% The definitions of |\FNH@prefntext| and |\FNH@postfntext| (which are needed
% for the |footnote| environment, |\FNH@startfntext| and |\FNH@endfntext|)
% are extracted from a somewhat daring analysis of |\@makefntext|.
@@ -954,34 +1114,172 @@ A few items worth of mention:
% of |\@makefntext| is not visible at top level in its meaning or is used
% there multiple times. We also insert here some code to handle especially
% the case of |babel-frenchb|.
+%
+% Refactoring at |v1.1d|. This will make \fnh compatible with |cleveref| for
+% example, if nothing else interferes. Not all combinations of classes and
+% packages can be handled and we can not hardcode a pre-analysis for all
+% possible cases. Of course, one can not expect \fnh to be compatible with
+% other footnote dedicated packages, but at best only with slight
+% modifications of \LaTeX's defaults. At |v1.1d| the |babel-french| context
+% is handled especially (to support it better with KOMAscript classes and
+% simplify handling the |memoir| situation); there was no real other way
+% than hardcode it more or less, but it can possibly break in presence of
+% additional footnote packages.
+%
+% Also the \cs{iffootnotehyperparse} and \cs{iffootnotehyperwarn} booleans
+% were added.
+%
+% Provide at least some definitions for \cs{FNH@prefntext} and
+% \cs{FNH@postfntext} in case of \cs{footnotehyperparsefalse} in preamble.
+% \begin{macrocode}
+\let\FNH@prefntext\@empty
+\let\FNH@postfntext\@empty
+\AtBeginDocument{\iffootnotehyperparse\expandafter\FNH@check\fi}%
+% \end{macrocode}
+%
+% As |\ifFBFrenchFootnotes| is not a \TeX\ boolean if |babel-frenchb| isn't
+% loaded, we have to work around this for |\if..\fi| pairs.
+%
+% |v1.1d| fixes a |v1.1b| bug: any situation in |\FNH@check@a| causing the
+% |\FNH@bad@makefntext@alert| branch to be chosen crashed the build due
+% precisely to this problem with |\ifFBFrenchFootnotes| status. I had taken
+% precautions for the |\else| branch but not for the ``warning'' branch.
+%
+% So let's fix this, and do it in such a way (with \cs{FNH@safeif}) that the
+% \TeX\ |\if..\fi| balancing count does not perturbate enclosing the package
+% loading in a \TeX\ conditional. Why I am bothering, I don't know.
+%
+% Finally, I refactored entirely the way |frenchb| context is handled,
+% (using multiple times \cs{FNH@safeif} although now only for the artistic
+% aim of balanced conditionals, as all |frenchb|-related stuff being in
+% their dedicated macro, direct usage of |\ifFB...| is possible).
+%
+% As long as nothing else interferes |babel-french| should be ok with
+% standard classes, KOMA and memoir.
+%
% \begin{macrocode}
-\AtBeginDocument{\let\FNH@@makefntext\@makefntext
- \ifx\@makefntextFB\undefined
- \expandafter\@gobble\else\expandafter\@firstofone\fi
- {\ifFBFrenchFootnotes \let\FNH@@makefntext\@makefntextFB \else
- \let\FNH@@makefntext\@makefntextORI\fi}%
- \expandafter\FNH@check@a\FNH@@makefntext{1.2!3?4,}%
- \FNH@@@1.2!3?4,\FNH@@@\relax
+\def\FNH@safeif#1{%
+ \iftrue\csname if#1\endcsname\csname fi\endcsname\expandafter\@firstoftwo
+ \else\csname fi\endcsname\expandafter\@secondoftwo
+ \fi
+}%
+\def\FNH@check{%
+ \ifx\@makefntextFB\@undefined\expandafter\FNH@check@
+ \else\expandafter\FNH@frenchb@
+ \fi
+}%
+\def\FNH@frenchb@{%
+ \def\FNH@prefntext{%
+ \localleftbox{}%
+ \let\FBeverypar@save\FBeverypar@quote
+ \let\FBeverypar@quote\relax
+ \FNH@safeif{FB@koma}%
+ {\FNH@safeif{FBFrenchFootnotes}%
+ {\ifx\footnote\thanks
+ \let\@@makefnmark\@@makefnmarkTH
+ \@makefntextTH{} % space as in french.ldf
+ \else
+ \let\@@makefnmark\@@makefnmarkFB
+ \@makefntextFB{} % space as in french.ldf
+ \fi
+ }{\let\@@makefnmark\@@makefnmarkORI
+ \@makefntextORI{}% no space as in french.ldf
+ }%
+ }%
+ {\FNH@safeif{FBFrenchFootnotes}%
+ {\@makefntextFB{}}%
+ {\@makefntextORI{}}%
+ }%
+ }%
+ \def\FNH@postfntext{%
+ \let\FBeverypar@quote\FBeverypar@save
+ \localleftbox{\FBeveryline@quote}%
+ }%
+ \iffootnotehyperwarn
+ \PackageInfo{footnotehyper}%
+ {frenchb compatibility patch activated.^^J It will not work in
+ all circumstances.^^J In case of problems with the `footnote' or
+ `footnotetext' environments,^^J please send to the author a small
+ file demonstrating the problem.^^J To turn off this message, add
+ \string\footnotehyperwarnfalse\space to the preamble.^^J}%
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+% ``Daring analysis'' is un understatement. At |v1.1b| we added a dangerous
+% twist to fix a memoir + frenchb triggered issue: if the
+% |\@makefntext|, as in memoir + frenchb situation, uses |\def| syntax to
+% define a macro with parameter we had a problem with the |#| token not
+% being doubled in the replacement fetched by
+% |\FNH@check@a|. As expedient work-around we fixed this by adding a
+% |\scantokens| wrapper.
+%
+% At |v1.1d| I refactored the |babel-french| situation, moving it to an
+% entirely dedicated \cs{FNH@frenchb@}, and dropped the |v1.1b| usage of
+% |\scantokens|.
+%
+% |v1.1d| adds \cs{FNH@checkagain@} which will identify circumstances likely
+% to be safe for the approach via |\def\FNH@prefntext{\@makefntext{}}|. For
+% example this is what will happen with |cleveref| (if not modified by other
+% packages).
+% \begin{macrocode}
+\def\FNH@check@{%
+ \expandafter\FNH@check@a\@makefntext{1.2!3?4,}%
+ \FNH@@@1.2!3?4,\FNH@@@\relax
}%
\long\def\FNH@check@a #11.2!3?4,#2\FNH@@@#3{%
- \ifx\relax#3\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
- \FNH@bad@makefntext@alert
- {\def\FNH@prefntext{#1}\def\FNH@postfntext{#2}\FNH@check@b}%
+ \ifx\relax#3\expandafter\FNH@checkagain@
+ \else
+ \def\FNH@prefntext{#1}\def\FNH@postfntext{#2}%
+ \expandafter\FNH@check@b
+ \fi
}%
+% \end{macrocode}
+% The argument was not seen unbraced at top. Maybe it is not fetched, or it was
+% but was left at the end, braced. If this is the case we use the fallback
+% |\def\FNH@prefntext{\@makefntext{}}|, which may work.
+% \begin{macrocode}
+\def\FNH@checkagain@{%
+ \expandafter\FNH@checkagain@a
+ \detokenize\expandafter{\@makefntext{1.2!3?4,}}\relax\FNH@@@
+}%
+\edef\FNH@temp{\noexpand\FNH@checkagain@a ##1\string{1.2!3?4,\string}}%
+\expandafter\def\FNH@temp#2#3\FNH@@@{%
+ \ifx\relax#2%
+ \def\FNH@prefntext{\@makefntext{}}%
+ \iffootnotehyperwarn
+ \PackageInfo{footnotehyper}%
+ {using \string\@makefntext{} approach.^^J
+ In case of problems with the footnote environments, please send^^J
+ to the author a small document source illustrating them. To turn^^J
+ off this message, add
+ \string\footnotehyperwarnfalse\space to preamble.^^J}%
+ \fi
+ \else\FNH@bad@makefntext@alert
+ \fi
+}%
+% \end{macrocode}
+% Back to non |babel-french| context. Let's check that |pre| and |post| do not
+% contain some weird stuff from original |\@makefntext{#1}| containing
+% multiple times |#1|.
+% \begin{macrocode}
\def\FNH@check@b #1\relax{%
\expandafter\expandafter\expandafter\FNH@check@c
\expandafter\meaning\expandafter\FNH@prefntext
\meaning\FNH@postfntext1.2!3?4,\FNH@check@c\relax
}%
\def\FNH@check@c #11.2!3?4,#2#3\relax{%
- \ifx\FNH@check@c#2\expandafter\@gobble\fi\FNH@bad@makefntext@alert
+ \ifx\FNH@check@c#2\else\FNH@bad@makefntext@alert\fi
}%
\def\FNH@bad@makefntext@alert{%
+ \iffootnotehyperwarn
\PackageWarningNoLine{footnotehyper}%
- {^^J The footnote environment will not be fully functional, sorry.^^J
+ {^^J The footnote environments will probably lack footnote numbers at^^J
+ bottom of pages, sorry.^^J
You may try to email the author this meaning of \string\@makefntext:^^J
\meaning\@makefntext^^J
- together with the used preamble}%
+ together with the document preamble}%
+ \fi
\let\FNH@prefntext\@empty\let\FNH@postfntext\@empty
}%
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/apparence-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/apparence-diapos.tex
index 8a6ad457129..e234474e78f 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/apparence-diapos.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/apparence-diapos.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -11,8 +11,6 @@
\section{Apparence et disposition du texte}
-\subsection{Police et style}
-
\begin{frame}
\frametitle{Police de caractères}
@@ -26,57 +24,30 @@
mathématiques
\item Commandes pour modifier les \alert{attributs} de la police
(famille, forme, graisse)
- \item Commandes pour modifier la \alert{taille} du texte (de
- \cs{tiny} à \cs{Huge})
+ \item Commandes pour modifier la \alert{taille} du texte
\end{itemize}
\end{frame}
-\begin{frame}[fragile]
+\begin{frame}[fragile=singleslide]
\frametitle{Italique}
\begin{itemize}
- \item<1-> Une des propriétés les \emph{plus utilisées} dans le texte
- \vfill
- \item<1-> Commande sémantique:
+ \item Une des propriétés les plus utilisées dans le texte
+ \item Commande sémantique:
\begin{lstlisting}
\emph`\marg{texte}'
\end{lstlisting}
- \vfill
- \item<2-> Par défaut: texte en italique dans texte droit et vice versa
- \begin{demo}
- \small
- \begin{texample}[0.48\linewidth]
-\begin{lstlisting}
-C'était un peu \emph{rough}
-par moments
-\end{lstlisting}
- \producing
- C'était un peu \emph{rough} par moments
- \end{texample}
-
- \begin{texample}[0.48\linewidth]
-\begin{lstlisting}
-Il m'a dit: «\emph{Enough
-\emph{poutine} for the
-week!}»
-\end{lstlisting}
- \producing
- Il m'a dit: «\emph{Enough \emph{poutine} for the week!}»
- \end{texample}
- \end{demo}
- \item<3-> Pas de commande pour souligner en {\LaTeX\dots} et ce n'est
+ \item Pas de commande pour souligner en {\LaTeX\dots} et ce n'est
pas une omission!
\end{itemize}
\end{frame}
-\subsection{Disposition du texte}
-
\begin{frame}[fragile]
\frametitle{Listes}
\begin{itemize}
\item Deux principales sortes de listes:
\begin{enumerate}
- \item \alert{à puce} avec environnement \texttt{itemize}
- \item \alert{numérotée} avec environnement \texttt{enumerate}
+ \item \alert{à puce} avec environnement \code{itemize}
+ \item \alert{numérotée} avec environnement \code{enumerate}
\end{enumerate}
\item Possible de les imbriquer les unes dans les autres
\item Marqueurs adaptés automatiquement jusqu'à 4 niveaux
@@ -111,7 +82,7 @@ week!}»
\begin{frame}[fragile=singleslide]
\frametitle{Code source}
\begin{itemize}
- \item Environnement \texttt{verbatim}
+ \item Environnement \code{verbatim}
\begin{lstlisting}
\begin{verbatim}
Texte disposé exactement tel qu'il est tapé
@@ -122,24 +93,22 @@ dans une police à largeur fixe
\end{itemize}
\end{frame}
-\subsection{[~Exercice~]}
-
\begin{exercice}
Utiliser le fichier \fichier{exercice\_complet.tex}.
\begin{enumerate}
\item Étudier le code source du fichier, puis le compiler.
- \item Supprimer l'option \texttt{article} au chargement de la classe
+ \item Supprimer l'option \code{article} au chargement de la classe
et compiler de nouveau le document. Observer l'effet de cette
option.
\item Effectuer les modifications suivantes au document.
\begin{enumerate}[a)]
\item Dernier paragraphe de la première section, placer toute la
- phrase débutant par \texttt{«De simple dérivé»} à l'intérieur
+ phrase débutant par \code{«De simple dérivé»} à l'intérieur
d'une commande \cs{emph}.
- \item Changer la puce des listes en spécifiant le symbole
- \texttt{\$>\$} pour \texttt{ItemLabeli} dans la commande
- \cs{frenchbsetup} du préambule.
+ \item Changer la puce des listes pour le symbole \code{\$>\$} en
+ activant la commande \cs{frenchbsetup\{ItemLabeli=\$>\$\}} dans
+ le préambule.
\end{enumerate}
\end{enumerate}
\end{exercice}
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/apparence.tex b/Master/texmf-dist/source/latex/formation-latex-ul/apparence.tex
index 4c35253f0f7..3563a66ec61 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/apparence.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/apparence.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/bases-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/bases-diapos.tex
index 2b3bbbe66bb..75d8ea35778 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/bases-diapos.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/bases-diapos.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -11,9 +11,7 @@
\section{Principes de base}
-\subsection{Règles de saisie}
-
-\begin{frame}[fragile=singleslide]
+\begin{frame}
\frametitle{Rédaction}
L'apparence du document est prise en charge par {\LaTeX} et
@@ -22,12 +20,6 @@
\begin{itemize}
\item On se concentre sur le \alert{contenu} et la \alert{structure} du
document
- \bigskip
- \begin{tabbing}
- titre de section \qquad\= \faArrowRight \qquad\= \verb|\section{titre}| \\[6pt]
- emphase \> \faArrowRight \> \verb|\emph{texte}|
- \end{tabbing}
- \bigskip
\item Mots séparés par une ou plusieurs \alert{espaces}
\item Paragraphes séparés par une ou plusieurs \alert{lignes blanches}
\item Utilisation de \alert{commandes} pour indiquer la structure du texte
@@ -40,10 +32,9 @@
\begin{itemize}
\item Caractères réservés par {\TeX}:
\begin{quote}
- \verb=# $ & ~ _ ^ % { }=
+ \code{\#~\$~\&~\string~~\_~\string^~\%~\{~\}}
\end{quote}
- \item Pour les utiliser, précéder par \bs
- \item On écrira donc
+ \item Pour les utiliser, précéder par «\bs»
\begin{demo}
\begin{texample}
\begin{lstlisting}
@@ -59,25 +50,23 @@ de 5~\%.
\end{itemize}
\end{frame}
-\subsection{Structure d'un fichier}
-
\begin{frame}[fragile]
\frametitle{Structure d'un document {\LaTeX}}
Un fichier source {\LaTeX} est toujours composé de deux parties.
\begin{minipage}{0.2\linewidth}
- \color{alert}
+ %\color{alert}
\onslide<2->{
\begin{minipage}{\linewidth}
\hfill préambule \quad
- \rule[-10mm]{2pt}{21mm}
+ \rule[-10mm]{1pt}{21mm}
\end{minipage} \\[5mm]
}
\onslide<3->{
\begin{minipage}{\linewidth}
\hfill corps \quad
- \rule[-15mm]{2pt}{30mm}
+ \rule[-15mm]{1pt}{30mm}
\end{minipage}
}
\end{minipage}
@@ -101,12 +90,10 @@ vitae ipsum vel, fermentum pellentesque orci.
\end{minipage}
\end{frame}
-\subsection{Commandes et environnements}
-
\begin{frame}[fragile=singleslide]
\frametitle{Commandes}
\begin{itemize}
- \item Débutent toujours par \bs
+ \item Débutent toujours par «\bs»
\item Exemples de syntaxe
\begin{lstlisting}
\LaTeX % aucun argument
@@ -116,7 +103,7 @@ vitae ipsum vel, fermentum pellentesque orci.
\end{lstlisting}
\item Commande sans argument: le nom se termine par tout
caractère qui n'est \alert{pas une lettre} (y compris l'espace!)
- \item Portée d'une commande limitée à la zone entre \verb={ }=
+ \item Portée d'une commande limitée à la zone entre \code{\{~\}}
\end{itemize}
\end{frame}
@@ -135,18 +122,6 @@ vitae ipsum vel, fermentum pellentesque orci.
\end{itemize}
\end{frame}
-\subsection{[~Exercice~]}
-
-\begin{exercice}
- Modifier le fichier \fichier{exercice\_commandes.tex} afin de
- produire le texte ci-dessous.
-
- \bigskip
- \centering
- \fbox{\includegraphics[viewport=108 551 502 665,%
- clip=true,width=0.9\linewidth]{auxdoc/exercice_commandes-solution}}
-\end{exercice}
-
\begin{frame}[fragile]
\frametitle{{\LaTeX} en français}
@@ -162,6 +137,16 @@ vitae ipsum vel, fermentum pellentesque orci.
\end{itemize}
\end{frame}
+\begin{exercice}
+ Modifier le fichier \fichier{exercice\_commandes.tex} afin de
+ produire le texte ci-dessous.
+
+ \bigskip
+ \centering
+ \fbox{\includegraphics[viewport=108 551 502 665,%
+ clip=true,width=0.9\linewidth]{auxdoc/exercice_commandes-solution}}
+\end{exercice}
+
%%% Local Variables:
%%% TeX-master: "formation-latex-ul-diapos"
%%% TeX-engine: xetex
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/bases.tex b/Master/texmf-dist/source/latex/formation-latex-ul/bases.tex
index c87729d1f96..0986d2a8674 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/bases.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/bases.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -826,7 +826,7 @@ l'action de la touche %
%% simili touche de clavier faite main à partir; utilisation de
%% \ooalign tirée de comprehensive.pdf, section 10.3
\raisebox{-2pt}{%
- \ooalign{\hfil\Large\faSquareO\hfil\cr\hfil\ttfamily\textquotedbl\hfil}} %
+ \ooalign{\hfil\Large\faSquare[regular]\hfil\cr\hfil\ttfamily\textquotedbl\hfil}} %
du clavier pour insérer les symboles appropriés selon la langue du
document.
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/bibliographie.tex b/Master/texmf-dist/source/latex/formation-latex-ul/bibliographie.tex
index f900df3b28b..1af57d5f231 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/bibliographie.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/bibliographie.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -564,7 +564,7 @@ pdf{\LaTeX} ou {\XeLaTeX}:
\sffamily
\begin{minipage}[t]{0.12\linewidth}
\centering
- {\LARGE\faFileTextO} \\ \medskip
+ {\LARGE\faFile[regular]} \\ \medskip
code source
\end{minipage}
\quad\faArrowRight\quad
@@ -576,7 +576,7 @@ pdf{\LaTeX} ou {\XeLaTeX}:
\quad\faArrowRight\quad
\begin{minipage}[t]{0.12\linewidth}
\centering
- {\LARGE\faFilePdfO} \\ \medskip
+ {\LARGE\faFilePdf[regular]} \\ \medskip
fichier PDF
\end{minipage}
\end{center}
@@ -587,7 +587,7 @@ une étape de compilation du document avec {\BibTeX}:
\sffamily
\begin{minipage}[t]{0.12\linewidth}
\centering
- {\LARGE\faFileTextO} \\ \medskip
+ {\LARGE\faFile[regular]} \\ \medskip
code source
\end{minipage}
\quad\faArrowRight\quad
@@ -606,13 +606,13 @@ une étape de compilation du document avec {\BibTeX}:
\begin{minipage}[t]{0.12\linewidth}
\centering
{\LARGE\faCogs}\;
- \raisebox{-2pt}{\parbox[b]{1em}{\centering\large\faRepeat\tiny\\ $\times 2$}} \\ \medskip
+ \raisebox{-2pt}{\parbox[b]{1em}{\centering\large\faRedo\tiny\\ $\times 2$}} \\ \medskip
\code{pdflatex} \\ \code{xelatex}
\end{minipage}
\quad\faArrowRight\quad
\begin{minipage}[t]{0.12\linewidth}
\centering
- {\LARGE\faFilePdfO} \\ \medskip
+ {\LARGE\faFilePdf[regular]} \\ \medskip
fichier PDF
\end{minipage}
\end{center}
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/boites.tex b/Master/texmf-dist/source/latex/formation-latex-ul/boites.tex
index e11dee2e58a..93a985760fb 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/boites.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/boites.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/colophon-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/colophon-diapos.tex
index b19fd123bda..d8c4c3c52c4 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/colophon-diapos.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/colophon-diapos.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/colophon.tex b/Master/texmf-dist/source/latex/formation-latex-ul/colophon.tex
index 56b213c3e2c..b562bfb6b4c 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/colophon.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/colophon.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2019 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/commandes.tex b/Master/texmf-dist/source/latex/formation-latex-ul/commandes.tex
index 7d2464334dd..d8b8a9549cf 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/commandes.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/commandes.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -41,7 +41,7 @@ trois raisons suivantes:
\begin{enumerate}
\item Une nouvelle commande \cmdprint{\doc} facilite et systématise
l'insertion de liens vers la documentation. D'un seul appel, elle
- crée un hyperlien dans le texte suivi de l'icône {\faExternalLink}
+ crée un hyperlien dans le texte suivi de l'icône {\faExternalLink*}
et elle ajoute le nom du fichier de documentation dans la marge
précédé de l'icône {\faBookmark}.
\item Une nouvelle commande sémantique \cmdprint{\pkg} sert pour la
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/couverture-arriere-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/couverture-arriere-diapos.tex
index 4b7003ee6df..6812e5522af 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/couverture-arriere-diapos.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/couverture-arriere-diapos.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2019 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/couverture-arriere.tex b/Master/texmf-dist/source/latex/formation-latex-ul/couverture-arriere.tex
index a24d65bf770..8bef39daf89 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/couverture-arriere.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/couverture-arriere.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/couverture-avant-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/couverture-avant-diapos.tex
index bca073983da..b38ecbe8946 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/couverture-avant-diapos.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/couverture-avant-diapos.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2019 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -89,7 +89,7 @@
%% image de fond
\begin{textblock*}{\paperwidth}(0mm,0mm)
- \includegraphics[height=\imageheight,width=\paperwidth]{images/Meerkat_stare-diapos}
+ \includegraphics[height=\imageheight,width=\paperwidth]{images/Suricates_Namibia-2-diapos}
\end{textblock*}
%% titre
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/couverture-avant.tex b/Master/texmf-dist/source/latex/formation-latex-ul/couverture-avant.tex
index 8df0bd2616f..6d53214d8ed 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/couverture-avant.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/couverture-avant.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2019 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -86,7 +86,7 @@
%% image de fond
\begin{textblock*}{\paperwidth}(0mm,0mm)
- \includegraphics[height=\imageheight,keepaspectratio=true]{images/Meerkat_stare.jpg}
+ \includegraphics[height=\imageheight,keepaspectratio=true]{images/Suricates_Namibia-2}
\end{textblock*}
%% titre
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul-diapos.tex
index 02ad816e1df..fae8a1fe708 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul-diapos.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul-diapos.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2019 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -16,7 +16,7 @@
\usepackage{changepage} % page licence
\usepackage{tabularx} % page licence
\usepackage{booktabs} % beaux tableaux
- \usepackage{fontawesome} % icônes
+ \usepackage{fontawesome5} % icônes
\usepackage{awesomebox} % \tipbox et autres
\usepackage{listings} % code source
\usepackage[export]{adjustbox} % cadre autour image
@@ -27,8 +27,8 @@
%% Informations de publication
%% (titre et al. dans couverture-avant.tex)
%% ==========================================
- \renewcommand{\year}{2019}
- \renewcommand{\month}{03}
+ \renewcommand{\year}{2020}
+ \renewcommand{\month}{10}
\newcommand{\ctanurl}{https://ctan.org/pkg/formation-latex-ul/}
\newcommand{\reposurl}{https://gitlab.com/vigou3/formation-latex-ul/}
@@ -76,14 +76,15 @@
BoldItalicFont = {Fira Sans SemiBold Italic}]{Fira Sans Book}
%% Couleurs
- \definecolor{comments}{rgb}{0.7,0,0} % commentaires
- \definecolor{link}{rgb}{0,0.4,0.6} % liens internes
- \definecolor{url}{rgb}{0.6,0,0} % liens externes
- \definecolor{codebg}{named}{LightYellow1} % fond code source
- \definecolor{rouge}{rgb}{0.85,0,0.07} % rouge bandeau identitaire
- \definecolor{or}{rgb}{1,0.8,0} % or bandeau identitaire
- \colorlet{alert}{mLightBrown} % alias pour couleur Metropolis
- \colorlet{dark}{mDarkTeal} % alias pour couleur Metropolis
+ \definecolor{comments}{rgb}{0.5,0.55,0.6} % commentaires
+ \definecolor{link}{rgb}{0,0.4,0.6} % liens internes
+ \definecolor{url}{rgb}{0.6,0,0} % liens externes
+ \colorlet{codebg}{LightYellow1} % fond code R
+ \definecolor{rouge}{rgb}{0.9,0,0.1} % bandeau rouge UL
+ \definecolor{or}{rgb}{1,0.8,0} % bandeau or UL
+ \colorlet{alert}{mLightBrown} % alias de couleur Metropolis
+ \colorlet{dark}{mDarkTeal} % alias de couleur Metropolis
+ \colorlet{code}{mLightGreen} % alias de couleur Metropolis
\colorlet{shadecolor}{codebg}
%% Hyperliens
@@ -178,34 +179,28 @@
%% Exercices
\newenvironment{exercice}{%
\begin{frame}[fragile=singleslide]
- \frametitle{Exercice}}{\end{frame}}
-
- %% Rubriques conseil du TeXpert
- \newenvironment{conseil}{%
- \begin{frame}[standout,fragile=singleslide]
- \textcolor{alert}{Conseil du {\TeX}pert}\normalsize
- \begin{block}{}}%
- {\end{block}\end{frame}}
+ \frametitle{\faCogs\; Exercice}}{\end{frame}}
%% =====================
%% Nouvelles commandes
%% =====================
%% Noms de fonctions, code, environnement, etc.
- \newcommand{\fichier}[1]{\texttt{#1}}
+ \newcommand{\code}[1]{\textcolor{code}{\texttt{#1}}}
+ \newcommand{\fichier}[1]{\code{#1}}
\newcommand{\class}[1]{\textbf{#1}}
\newcommand{\pkg}[1]{\textbf{#1}}
- \newcommand{\link}[2]{\href{#1}{#2~\raisebox{-0.2ex}{\faExternalLink}}}
+ \newcommand{\link}[2]{\href{#1}{#2~\raisebox{-0.2ex}{\faExternalLink*}}}
%% Pour documenter des commandes LaTeX; dérivé de memoir.cls
- \def\bs{\texttt{\char`\\}}
+ \def\bs{\code{\char`\\}}
\newcommand{\meta}[1]{%
\ensuremath\langle{\normalfont\itshape #1\/}\ensuremath\rangle}
\newcommand{\marg}[1]{%
{\ttfamily\char`\{}\meta{#1}{\ttfamily\char`\}}}
\newcommand{\oarg}[1]{%
{\ttfamily\char`\[}\meta{#1}{\ttfamily\char`\]}}
- \newcommand{\cs}[1]{\texttt{\char`\\#1}}
+ \newcommand{\cs}[1]{\code{\char`\\#1}}
%% Lien vers Gitlab dans la page de notices
\newcommand{\viewsource}[1]{%
@@ -234,8 +229,6 @@
\include{apparence-diapos}
\include{tableaux-diapos}
\include{mathematiques-diapos}
-\include{sweave-diapos}
-\include{ulthese-diapos}
\include{suite-diapos}
\include{colophon-diapos}
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul.bib b/Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul.bib
index d82a9f06935..ef315ba28b3 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul.bib
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul.bib
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul.tex b/Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul.tex
index 0ad9f1cd4cf..618ceb786c5 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/formation-latex-ul.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2019 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -20,7 +20,8 @@
\usepackage{dirtree} % arbre pour exercice sur \include
\usepackage{metalogo} % logo de \XeLaTeX
\usepackage{mflogo} % logo de Metafont
- \usepackage{fontawesome} % plusieurs icônes
+ \usepackage{relsize} % \smaller et al.
+ \usepackage{fontawesome5} % plusieurs icônes
\usepackage{awesomebox} % boites info, important, etc.
\usepackage{applekeys} % touches Mac
\usepackage{answers} % exercices et solutions
@@ -35,8 +36,8 @@
%%% =============================
\title{Rédaction avec \LaTeX}
\author{Vincent Goulet}
- \renewcommand{\year}{2019}
- \renewcommand{\month}{03}
+ \renewcommand{\year}{2020}
+ \renewcommand{\month}{10}
\newcommand{\ctanurl}{https://ctan.org/pkg/formation-latex-ul/}
\newcommand{\reposurl}{https://gitlab.com/vigou3/formation-latex-ul/}
@@ -89,13 +90,13 @@
%% Couleurs
\usepackage{xcolor}
- \definecolor{comments}{rgb}{0.7,0,0} % rouge foncé
- \definecolor{link}{rgb}{0,0.4,0.6} % ~RoyalBlue de dvips
- \definecolor{url}{rgb}{0.6,0,0} % rouge-brun
- \definecolor{citation}{rgb}{0,0.5,0} % vert foncé
- \definecolor{ULlinkcolor}{rgb}{0,0,0.3} % de ulthese.cls
- \definecolor{rouge}{rgb}{0.85,0,0.07} % rouge bandeau identitaire
- \definecolor{or}{rgb}{1,0.8,0} % or bandeau identitaire
+ \definecolor{comments}{rgb}{0.5,0.55,0.6} % commentaires
+ \definecolor{link}{rgb}{0,0.4,0.6} % liens internes
+ \definecolor{url}{rgb}{0.6,0,0} % liens externes
+ \definecolor{citation}{rgb}{0,0.5,0} % citations
+ \definecolor{ULlinkcolor}{rgb}{0,0,0.3} % de ulthese.cls
+ \definecolor{rouge}{rgb}{0.90,0,0.1} % rouge bandeau UL
+ \definecolor{or}{rgb}{1,0.8,0} % or bandeau UL
%% Hyperliens
\usepackage{hyperref}
@@ -365,10 +366,10 @@
%% Boite additionnelle (basée sur awesomebox.sty) pour liens vers
%% des vidéos
\newcommand{\videobox}[1]{%
- \awesomebox{\faYoutubePlay}{\aweboxrulewidth}{url}{#1}}
+ \awesomebox{\aweboxrulewidth}{\faYoutube}{url}{#1}}
%% Hyperlien avec symbole de lien externe juste après
- \newcommand{\link}[2]{\href{#1}{#2~\raisebox{-0.2ex}{\faExternalLink}}}
+ \newcommand{\link}[2]{\href{#1}{#2~\smaller\faExternalLink*}}
%% Lien vers documentation dans la marge
%% usage: \doc[documentation]{nom_fichier}{url}
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/images/Meerkat_stare-diapos.jpg b/Master/texmf-dist/source/latex/formation-latex-ul/images/Meerkat_stare-diapos.jpg
deleted file mode 100644
index 80ef47482ee..00000000000
--- a/Master/texmf-dist/source/latex/formation-latex-ul/images/Meerkat_stare-diapos.jpg
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/images/Meerkat_stare.jpg b/Master/texmf-dist/source/latex/formation-latex-ul/images/Meerkat_stare.jpg
deleted file mode 100644
index ca33487d9de..00000000000
--- a/Master/texmf-dist/source/latex/formation-latex-ul/images/Meerkat_stare.jpg
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/images/Suricates_Namibia-2-diapos.jpeg b/Master/texmf-dist/source/latex/formation-latex-ul/images/Suricates_Namibia-2-diapos.jpeg
new file mode 100644
index 00000000000..7b538dd1a04
--- /dev/null
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/images/Suricates_Namibia-2-diapos.jpeg
Binary files differ
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/images/Suricates_Namibia-2.jpeg b/Master/texmf-dist/source/latex/formation-latex-ul/images/Suricates_Namibia-2.jpeg
new file mode 100644
index 00000000000..404fffcc7ad
--- /dev/null
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/images/Suricates_Namibia-2.jpeg
Binary files differ
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/images/formation-latex-ul.png b/Master/texmf-dist/source/latex/formation-latex-ul/images/formation-latex-ul.png
index 2ba654ffb07..912c12de61d 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/images/formation-latex-ul.png
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/images/formation-latex-ul.png
Binary files differ
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/introduction.tex b/Master/texmf-dist/source/latex/formation-latex-ul/introduction.tex
index 8454a22f1db..ee60b130b87 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/introduction.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/introduction.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -52,7 +52,7 @@ plusieurs fonctionnalités interactives.
la bibliographie. Ces intraliens sont marqués par la couleur
\textcolor{citation}{\rule{1.5em}{1.2ex}}.
\item Hyperliens vers des ressources externes marqués par le symbole
- {\faExternalLink} et la couleur
+ {\faExternalLink*} et la couleur
\textcolor{url}{\rule{1.5em}{1.2ex}}.
\item Table des matières, liste des tableaux et liste des figures
permettant d'accéder rapidement à des ressources du document.
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/mathematiques-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/mathematiques-diapos.tex
index 0c1986380a2..956bcb57bc2 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/mathematiques-diapos.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/mathematiques-diapos.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -55,16 +55,15 @@ comme $(a + b)^2 = a^2 + 2ab + b^2$
\end{enumerate}
\end{frame}
+\begin{frame}[plain]
+ \tipbox{En ligne ou hors paragraphe, les équations font partie intégrante de
+ la phrase.
-\begin{conseil}
- En ligne ou hors paragraphe, les équations font partie intégrante de
- la phrase.
+ Les règles de ponctuation usuelles s'appliquent donc aux
+ équations. \newline
- Les règles de ponctuation usuelles s'appliquent donc aux équations.
-
- \bigskip
- \fbox{\includegraphics[width=0.95\linewidth]{images/ponctuation}}
-\end{conseil}
+ \fbox{\includegraphics[width=0.95\linewidth]{images/ponctuation}}}
+\end{frame}
\begin{frame}[fragile]
\frametitle{Quelques règles de base}
@@ -154,8 +153,6 @@ $x = 0 \text{ si } y < 2$
\end{equation*}
\end{frame}
-\subsection{[~Exercice~]}
-
\begin{exercice}
Utiliser le fichier \fichier{exercice\_mathematiques.tex}.
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/mathematiques.tex b/Master/texmf-dist/source/latex/formation-latex-ul/mathematiques.tex
index ae522b61999..8c7ca765047 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/mathematiques.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/mathematiques.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/notices-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/notices-diapos.tex
index b9920b01653..c3feab071c0 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/notices-diapos.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/notices-diapos.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2019 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -53,16 +53,14 @@
\viewsource{\reposurl}
\textbf{Couverture} \\
- Suricate (\emph{Suricata suricatta}), parfois surnommé «sentinelle
- du désert» (ici un spécimen du zoo de Newquay, en Cornouailles).
- Ce petit carnivore vit dans le sud-ouest de l'Afrique. Très
- prolifique, le suricate vit en grands groupes familiaux au sein
- d'une colonie.
-
- Crédit photo: {\textcopyright} Francis C.~Franklin
- \href{https://creativecommons.org/licenses/by-sa/3.0/deed.fr}{CC
- BY-SA 3.0} via
- \href{https://commons.wikimedia.org/w/index.php?curid=31209438}{%
+ Suricates (\emph{Suricata suricatta}) en Namibie. Parfois surnommé
+ «sentinelle du désert», ce petit carnivore vit dans le sud-ouest
+ de l'Afrique. Très prolifique, le suricate vit en grands groupes
+ familiaux au sein d'une colonie. Crédit photo: {\textcopyright}
+ Sara\&Joachim\&Mebe,
+ \href{https://creativecommons.org/licenses/by-sa/2.0/deed.fr}{CC
+ BY-SA 2.0} via
+ \href{https://commons.wikimedia.org/w/index.php?curid=15305478}{%
Wikimedia Commons}.
Concept original du titre: Marie-Ève Guérard.
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/notices.tex b/Master/texmf-dist/source/latex/formation-latex-ul/notices.tex
index 195c767f13f..38c45ebe7fd 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/notices.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/notices.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2019 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -54,15 +54,14 @@
\viewsource{\reposurl}
\textbf{Couverture} \\
- Suricate (\emph{Suricata suricatta}), parfois surnommé «sentinelle
- du désert» (ici un spécimen du zoo de Newquay, en Cornouailles). Ce
- petit carnivore vit dans le sud-ouest de l'Afrique. Très prolifique,
- le suricate vit en grands groupes familiaux au sein d'une colonie.
-
- Crédit photo: {\textcopyright} Francis C.~Franklin
- \href{https://creativecommons.org/licenses/by-sa/3.0/deed.fr}{CC
- BY-SA 3.0} via
- \href{https://commons.wikimedia.org/w/index.php?curid=31209438}{%
+ Suricates (\emph{Suricata suricatta}) en Namibie. Parfois surnommé
+ «sentinelle du désert», ce petit carnivore vit dans le sud-ouest de
+ l'Afrique. Très prolifique, le suricate vit en grands groupes
+ familiaux au sein d'une colonie. Crédit photo: {\textcopyright}
+ Sara\&Joachim\&Mebe,
+ \href{https://creativecommons.org/licenses/by-sa/2.0/deed.fr}{CC
+ BY-SA 2.0} via
+ \href{https://commons.wikimedia.org/w/index.php?curid=15305478}{%
Wikimedia Commons}.
Concept original du titre: Marie-Ève Guérard.
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/organisation-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/organisation-diapos.tex
index e798d71efbb..99abbd69e78 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/organisation-diapos.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/organisation-diapos.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -11,12 +11,10 @@
\section{Organisation d'un document}
-\begin{conseil}
- Utilisez impérativement les commandes {\LaTeX} pour identifier les
- différentes parties (la structure) d'un document.
-\end{conseil}
-
-\subsection{Parties d'un document}
+\begin{frame}[plain]
+ \tipbox{Utilisez impérativement les commandes {\LaTeX} pour
+ identifier les différentes parties (la structure) d'un document.}
+\end{frame}
\begin{frame}[fragile]
\frametitle{Titre et page de titre}
@@ -96,8 +94,6 @@
\end{itemize}
\end{frame}
-\subsection{Renvois automatiques}
-
\begin{frame}
\frametitle{Étiquettes et renvois automatiques}
@@ -105,8 +101,8 @@
d'équation, de tableau, etc.
\begin{itemize}
- \item «Nommer» un élément avec \cs{label}
- \item Faire référence par son nom avec \cs{ref}
+ \item Étiquetter un élément avec \cs{label}
+ \item Faire référence par son étiquette avec \cs{ref}
\item Requiert 2 à 3 compilations
\end{itemize}
\end{frame}
@@ -135,14 +131,12 @@ on a...
\fbox{\includegraphics[viewport=124 550 484 664,clip=true,width=0.98\linewidth]{auxdoc/exemple-renvoi}}
\end{frame}
-\subsection{[~Exercice~]}
-
\begin{exercice}
Utiliser le fichier \fichier{exercice\_renvois.tex}.
\begin{enumerate}
\item Insérer dans le texte un renvoi au numéro d'une section.
\item Activer le paquetage \pkg{hyperref} avec l'option
- \texttt{colorlinks} et comparer l'effet d'utiliser \cs{ref} ou
+ \code{colorlinks} et comparer l'effet d'utiliser \cs{ref} ou
\cs{autoref} pour le renvoi.
\end{enumerate}
\end{exercice}
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/organisation.tex b/Master/texmf-dist/source/latex/formation-latex-ul/organisation.tex
index a62f2693ed9..6c940820215 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/organisation.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/organisation.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/prerequis-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/prerequis-diapos.tex
index cc8b916bccb..eab6d24b2d9 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/prerequis-diapos.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/prerequis-diapos.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -10,29 +10,13 @@
%%% https://creativecommons.org/licenses/by-sa/4.0/
\begin{frame}
- \frametitle{Fichiers d'accompagnement}
-
- \begin{adjustwidth}{10mm}{10mm}
- Ce document devrait être accompagné des fichiers nécessaires pour
- compléter les exercices.
-
- Si vous n'avez pas obtenu ces fichiers avec le document, vous
- pouvez les récupérer dans le site \emph{Comprehensive TeX Archive
- Network} (CTAN).
-
- \begin{center}
- \link{\ctanurl}{Accéder aux fichiers dans CTAN}
- \end{center}
- \end{adjustwidth}
-\end{frame}
-
-\begin{frame}
\frametitle{Prérequis à cette formation}
\begin{adjustwidth}{8mm}{10mm}
\begin{enumerate}
\item Installer une distribution {\LaTeX} sur votre poste de
- travail; nous recommandons la distribution {\TeX}~Live
+ travail; je recommande la distribution
+ \link{https://tug.org/texlive/}{{\TeX}~Live}
\begin{itemize}
\item \link{https://youtu.be/uJFbhQkDbU8}{%
Vidéo d'installation sur macOS}
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/presentation-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/presentation-diapos.tex
index d08e4727d4f..4ed973f6510 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/presentation-diapos.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/presentation-diapos.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -11,8 +11,6 @@
\section{Présentation de {\TeX} et {\LaTeX}}
-\subsection{Description sommaire}
-
\begin{frame}
\frametitle{Ce que c'est}
\begin{columns}
@@ -68,49 +66,48 @@
\end{itemize}
\end{frame}
-\subsection{Processus de création}
+\begin{frame}[fragile=singleslide]
+ \frametitle{Faits amusants}
+ \begin{itemize}
+ \item {\TeX} est aujourd'hui considéré exempt de bogue
+ \item Récompense si vous en trouvez un!
+ \item Numéro de version de {\TeX} converge vers $\pi$:
+\begin{lstlisting}
+$ tex --version
+TeX `\textbf{3.14159265}' (TeX Live 2020)
+kpathsea version 6.3.2
+Copyright 2020 D.E. Knuth.
+[...]
+\end{lstlisting} %$
+ \end{itemize}
+\end{frame}
\begin{frame}
\frametitle{Processus de création d'un document {\LaTeX}}
\Huge
- \begin{minipage}[t]{0.6\linewidth}
- \begin{minipage}[t]{0.4\textwidth}
- \centering
- \faFileTextO \\ \bigskip
- \footnotesize
- rédaction du texte et balisage avec un \emph{éditeur de texte}
- \end{minipage}
- \hfill\faArrowRight\hfill
- \begin{minipage}[t]{0.4\textwidth}
- \centering
- \faCogs \\ \bigskip
- \footnotesize
- compilation avec un \emph{moteur} {\TeX} depuis la ligne de commande
- \end{minipage} \\ \bigskip
-
- \onslide<2>{%
- \color{alert}
- \rule[6pt]{\linewidth}{2pt} \\
- \footnotesize\centering
- facilité par l'utilisation d'un \\
- logiciel intégré de rédaction \\
- (Texmaker, TeXShop, Emacs, \dots)
- }
+ \begin{minipage}[t]{0.25\textwidth}
+ \centering
+ \faFile*[regular] \\ \bigskip
+ \small
+ rédaction du texte et balisage avec un \alert{éditeur de texte}
\end{minipage}
- \begin{minipage}[t]{0.35\linewidth}
- \hfill\faArrowRight\hfill
- \begin{minipage}[t]{0.7\textwidth}
- \centering
- \faFilePdfO \\ \bigskip
- \footnotesize
- visualisation avec visionneuse externe (Aperçu,
- SumatraPDF, etc.)
- \end{minipage}
+ \hfill\faArrowRight\hfill
+ \begin{minipage}[t]{0.25\textwidth}
+ \centering
+ \faCogs \\ \bigskip
+ \small
+ compilation avec un \alert{moteur} {\TeX} depuis la ligne de commande
+ \end{minipage}
+ \hfill\faArrowRight\hfill
+ \begin{minipage}[t]{0.3\textwidth}
+ \centering
+ \faFilePdf[regular] \\ \bigskip
+ \small
+ visualisation avec une visionneuse PDF (Aperçu,
+ SumatraPDF, etc.)
\end{minipage}
\end{frame}
-\subsection{[~Exercice~]}
-
\begin{exercice}
Démarrer le logiciel \alert{Texmaker} (Windows), \alert{TeXShop}
(macOS) ou tout autre éditeur ou logiciel intégré de rédaction de
@@ -123,55 +120,13 @@
\end{enumerate}
\end{exercice}
-\subsection{Outils de production}
-
-\begin{frame}
- \frametitle{Moteurs et formats}
- \centering
-
- \begin{tabular}{r}
- \\ \addlinespace[8pt] \\ \\
- \color{alert}\faArrowRight \\
- \color{alert}\faArrowRight
- \end{tabular}
- \hspace{-4mm}
- \begin{tabularx}{0.7\linewidth}{Xlc}
- \toprule[2pt]
- Moteur & Format & Fichier de sortie \\
- \midrule
- \texttt{tex} & plain \TeX & DVI \\
- \texttt{tex} (\texttt{latex}) & \LaTeX & DVI \\
- \texttt{pdftex} (\texttt{pdflatex}) & pdf\LaTeX & PDF \\
- \texttt{xetex} (\texttt{xelatex}) & \XeLaTeX & PDF \\
- \bottomrule[2pt]
- \end{tabularx}
-\end{frame}
-
-\begin{frame}[fragile=singleslide]
- \frametitle{Faits amusants}
- \begin{itemize}
- \item {\TeX} est aujourd'hui considéré exempt de bogue
- \item Récompense si vous en trouvez un!
- \item Numéro de version de {\TeX} converge vers $\pi$:
-\begin{lstlisting}
-$ tex --version
-TeX `\textbf{3.14159265}' (TeX Live 2018)
-kpathsea version 6.3.0
-Copyright 2018 D.E. Knuth.
-[...]
-\end{lstlisting} %$
- \end{itemize}
-\end{frame}
-
-\subsection{[~Exercice~]}
-
\begin{exercice}
Question de voir ce que {\LaTeX} peut faire, compiler le document
élaboré \fichier{exercice\_demo.tex} de la manière suivante:
\begin{enumerate}[i)]
- \item une fois avec \texttt{LaTeX};
- \item une fois avec \texttt{BibTeX};
- \item deux à trois fois avec \texttt{LaTeX}.
+ \item une fois avec \code{LaTeX};
+ \item une fois avec \code{BibTeX};
+ \item deux à trois fois avec \code{LaTeX}.
\end{enumerate}
\end{exercice}
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/presentation.tex b/Master/texmf-dist/source/latex/formation-latex-ul/presentation.tex
index 067ec32683e..d51fc7896ea 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/presentation.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/presentation.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
@@ -56,7 +56,7 @@ distinguer le système de mise en page du matériau élastique.
\notebox{L'histoire courte \emph{Paul apprenti typographe} publiée
dans \citet{Rabagliati:1999:campagne} explique formidablement bien
- le processus de composation d'un texte avec la Linotype. Quelques
+ le processus de composition d'un texte avec la Linotype. Quelques
séquences du très recommandable film \emph{The Post} (2017)
illustrent également la composition d'une page de journal.}
@@ -180,7 +180,7 @@ ainsi:
\begin{center}
\begin{minipage}[t]{0.25\linewidth}
\centering
- {\Huge\faFileTextO} \\ \medskip
+ {\Huge\faFile*[regular]} \\ \medskip
rédaction du texte et balisage avec un \emph{éditeur de texte}
\end{minipage}
\quad{\Large\faArrowRight}\quad
@@ -192,7 +192,7 @@ ainsi:
\quad{\Large\faArrowRight}\quad
\begin{minipage}[t]{0.25\linewidth}
\centering
- {\Huge\faFilePdfO} \\ \medskip
+ {\Huge\faFilePdf[regular]} \\ \medskip
visualisation avec une visionneuse externe (Aperçu,
SumatraPDF, etc.)
\end{minipage}
@@ -331,7 +331,7 @@ demeure également très populaire sur Windows.
\begin{exercice}[nosol]
Composer un premier document très simple de type \emph{Hello World!}
tel qu'expliqué dans les vidéos mentionnées à la
- \autoref{sec:presentation:outils}.
+ \autoref{sec:presentation:processus}.
\end{exercice}
\begin{exercice}[nosol]
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/solutions.tex b/Master/texmf-dist/source/latex/formation-latex-ul/solutions.tex
index 17ebe301c2f..b6714a5e3cd 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/solutions.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/solutions.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/suite-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/suite-diapos.tex
index e5dfa5aa4be..e108f49480b 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/suite-diapos.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/suite-diapos.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/sweave-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/sweave-diapos.tex
deleted file mode 100644
index a18245ae26b..00000000000
--- a/Master/texmf-dist/source/latex/formation-latex-ul/sweave-diapos.tex
+++ /dev/null
@@ -1,63 +0,0 @@
-%%% Copyright (C) 2018 Vincent Goulet
-%%%
-%%% Ce fichier fait partie du projet
-%%% «Rédaction avec LaTeX»
-%%% https://gitlab.com/vigou3/formation-latex-ul
-%%%
-%%% Cette création est mise à disposition sous licence
-%%% Attribution-Partage dans les mêmes conditions 4.0
-%%% International de Creative Commons.
-%%% https://creativecommons.org/licenses/by-sa/4.0/
-
-\section{Programmation lettrée}
-
-\begin{frame}[fragile=singleslide]
- \frametitle{Document source combinant {\LaTeX} et code R}
-
- \fichier{fichier.Rnw}
-\begin{lstlisting}[emph={Sexpr}]
-...
-
-L'utilisateur de R interagit avec l'interprète en entrant
-des commandes à l'invite de commande:
-<<echo=TRUE>>=
-2 + 3
-@
-La commande \verb=exp(1)= donne \Sexpr{exp(1)},
-la valeur du nombre $e$.
-
-...
-\end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile=singleslide]
- \frametitle{Après traitement par Sweave dans R}
-
- \texttt{Sweave("fichier.Rnw")}
- $\rightarrow$ \fichier{fichier.tex}
-\begin{lstlisting}[emph={Schunk,Sinput,Soutput}]
-...
-
-L'utilisateur de R interagit avec l'interprète en entrant
-des commandes à l'invite de commande:
-\begin{Schunk}
-\begin{Sinput}
-> 2 + 3
-\end{Sinput}
-\begin{Soutput}
-[1] 5
-\end{Soutput}
-\end{Schunk}
-La commande \verb=exp(1)= donne 2.71828182845905,
-la valeur du nombre $e$.
-
-...
-\end{lstlisting}
-
-\end{frame}
-
-%%% Local Variables:
-%%% TeX-master: "formation-latex-ul-diapos"
-%%% TeX-engine: xetex
-%%% coding: utf-8
-%%% End:
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/tableaux+figures.tex b/Master/texmf-dist/source/latex/formation-latex-ul/tableaux+figures.tex
index 8e8157db3e5..f73d51329ab 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/tableaux+figures.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/tableaux+figures.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/tableaux-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/tableaux-diapos.tex
index 03bc0c78d45..88487b9a3b4 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/tableaux-diapos.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/tableaux-diapos.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/trucs+astuces.tex b/Master/texmf-dist/source/latex/formation-latex-ul/trucs+astuces.tex
index ba1d74450d8..2938c1403c9 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/trucs+astuces.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/trucs+astuces.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/ulthese-diapos.tex b/Master/texmf-dist/source/latex/formation-latex-ul/ulthese-diapos.tex
deleted file mode 100644
index 5845fed19e5..00000000000
--- a/Master/texmf-dist/source/latex/formation-latex-ul/ulthese-diapos.tex
+++ /dev/null
@@ -1,57 +0,0 @@
-%%% Copyright (C) 2018 Vincent Goulet
-%%%
-%%% Ce fichier fait partie du projet
-%%% «Rédaction avec LaTeX»
-%%% https://gitlab.com/vigou3/formation-latex-ul
-%%%
-%%% Cette création est mise à disposition sous licence
-%%% Attribution-Partage dans les mêmes conditions 4.0
-%%% International de Creative Commons.
-%%% https://creativecommons.org/licenses/by-sa/4.0/
-
-\section{Classe ulthese}
-
-\begin{frame}
- \frametitle{Un document conforme en un tournemain}
-
- \begin{itemize}
- \item \class{ulthese} livrée dans {\TeX}~Live donc déjà
- installée sur votre ordinateur
- \item Mise en page conforme aux règles de présentation de la FESP
- \item Basée sur la classe \class{memoir}
- \item Quelques nouvelles commandes pour la création de la page de
- titre
- \item Partir d'un gabarit (classés avec la documentation dans
- {\TeX}~Live)
- \item Utiliser des fichiers séparés pour chaque chapitre de la thèse
- ou du mémoire
- \end{itemize}
-\end{frame}
-
-\subsection{[~Exercice~]}
-
-\begin{exercice}
- Utiliser le fichier \fichier{exercice\_ulthese.tex} --- qui est basé
- sur le gabarit \texttt{gabarit-doctorat.tex} livré avec
- \class{ulthese}.
-
- Ce fichier insère \fichier{b-a-ba-math.tex} dans le document avec la
- commande \cs{include}.
- \begin{enumerate}
- \item Étudier le code source des deux fichiers et identifier à quel
- endroit \texttt{b-a-ba-math.tex} est chargé dans le document.
- \item Activer les paquetages \pkg{amsmath} et \pkg{icomma}, puis
- compiler \texttt{exercice\_ulthese.tex}.
- \item Modifier un environnement \texttt{align*} pour \texttt{align}
- dans \texttt{b-a-ba-math.tex} et observer le résultat dans la
- compilation de \texttt{exercice\_ulthese.tex}.
- \item Compiler de nouveau le fichier en utilisant une police
- différente.
- \end{enumerate}
-\end{exercice}
-
-%%% Local Variables:
-%%% TeX-master: "formation-latex-ul-diapos"
-%%% TeX-engine: xetex
-%%% coding: utf-8
-%%% End:
diff --git a/Master/texmf-dist/source/latex/formation-latex-ul/ulthese.tex b/Master/texmf-dist/source/latex/formation-latex-ul/ulthese.tex
index 2646c61c03a..d7590f8b420 100644
--- a/Master/texmf-dist/source/latex/formation-latex-ul/ulthese.tex
+++ b/Master/texmf-dist/source/latex/formation-latex-ul/ulthese.tex
@@ -1,4 +1,4 @@
-%%% Copyright (C) 2018 Vincent Goulet
+%%% Copyright (C) 2020 Vincent Goulet
%%%
%%% Ce fichier fait partie du projet
%%% «Rédaction avec LaTeX»
diff --git a/Master/texmf-dist/source/latex/frenchmath/frenchmath.dtx b/Master/texmf-dist/source/latex/frenchmath/frenchmath.dtx
index f9f413d6478..14118159e07 100644
--- a/Master/texmf-dist/source/latex/frenchmath/frenchmath.dtx
+++ b/Master/texmf-dist/source/latex/frenchmath/frenchmath.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+% Copyright (C) 2019-2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
%
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3 of this license
@@ -20,7 +20,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{frenchmath}
- [2019/05/22 v1.4 .dtx frenchmath file]
+ [2020/11/02 v1.5 .dtx frenchmath file]
%</package>
%<*driver>
\documentclass{ltxdoc}
@@ -51,7 +51,7 @@
%</driver>
% \fi
%
-% \CheckSum{692}
+% \CheckSum{249}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -82,13 +82,15 @@
% changements dans la documentation}
% \changes{v1.4}{2019/05/22}{Changement de la définition de fonte up -> UpSh,
% car incompatibilité avec l'extension unicode-math}
+% \changes{v1.5}{2020/11/02}{Ajout des macros étoilées pour les repères du plan et de l'espace
+% et la base (i,j,k)}
%
% \GetFileInfo{frenchmath.sty}
%
% \title{L'extension \textsf{frenchmath}\thanks{Ce document
-% correspond à \textsf{frenchmath}~\fileversion, dernière modification le 22/05/2019.}}
+% correspond à \textsf{frenchmath}~\fileversion, dernière modification le 02/11/2020.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
-% \date{22 mai 2019}
+% \date{2 novembre 2020}
% \maketitle
%
% \section{Introduction}
@@ -265,14 +267,6 @@
% ce que permet la commande |\cmod| en respectant le bon espacement
% propre au modulo : $ 5 \equiv 53 \cmod{12}$.
%
-% \medskip
-% \DescribeMacro{\Oij} \DescribeMacro{\Oijk}
-% Les repères classiques du plan ou de l'espace seront composés
-% avec des hauteurs de flèches homogénéisées :
-% |\Oij| compose \Oij, |\Oijk| compose \Oijk et |\Ouv| compose \Ouv
-% (utilisé dans le plan complexe). \DescribeMacro{\Ouv}
-% On peut écrire ces commandes en mode texte, sans les délimiteurs du mode mathématique.
-%
% \subsection{Identifiants de \og fonctions\fg classiques}
%
% \DescribeMacro{\pgcd} \DescribeMacro{\ppcm}
@@ -281,10 +275,10 @@
% \footnote{Cette dernière n'est pas implémentée en standard dans \LaTeX\
% (mais dans \textsf{mismath}).}.
%
-% \medskip
-% \DescribeMacro{\Card} \DescribeMacro{\card}
-% Pour le cardinal d'un ensemble, nous proposons |\Card|, cité dans~\cite{RTIN},
-% ou |\card|, cité dans~\cite{AA}.
+% \newpage
+% \DescribeMacro{\card} \DescribeMacro{\Card}
+% Pour le cardinal d'un ensemble, nous proposons |\card|, cité dans~\cite{RTIN} et \cite{AA},
+% ou |\Card|, d'usage courant (cf. Wikipedia).
%
% \medskip
% \DescribeMacro{\Ker} \DescribeMacro{\Hom}
@@ -311,6 +305,27 @@
% On les obtient avec les commandes |\ch|, |\sh| et |\tgh|
% \footnote{La commande \texttt{\bslash th} existe déjà et produit $\th$.}.
%
+% \subsection{Bases et repères}
+%
+% \DescribeMacro{\Oij} \DescribeMacro{\Oijk}
+% Les repères classiques du plan ou de l'espace seront composés
+% avec des hauteurs de flèches homogénéisées :
+% |\Oij| compose \Oij, |\Oijk| compose \Oijk et |\Ouv| compose \Ouv
+% (utilisé dans le plan complexe). \DescribeMacro{\Ouv}
+% On peut écrire ces commandes en mode texte, sans les délimiteurs du mode mathématique.
+%
+% \DescribeMacro{\Oij*} \DescribeMacro{\Oijk*} \DescribeMacro{\Ouv*}
+% Les versions étoilées utilisent le point-virgule et non la virgule
+% comme séparateur après le point O, comme mentionné dans \cite{RTIN}.
+% On obtient \Oij*, \Oijk*, \Ouv*.
+%
+% \DescribeMacro{\ij} \DescribeMacro{\ijk}
+% Enfin les macros |\ij| et |\ijk| composent la base du plan \ij
+% et de l'espace \ijk, en homogénéisant la hauteur des flèches.
+% Notons que la macro |\ij| existait déjà (ligature entre i et j pour le hollandais)
+% et a été redéfinie.
+%
+% \StopEventually{}
%
% \section{Le code}
%
@@ -372,18 +387,6 @@
\newcommand\paral{\mathrel{/\!\!/}} % \parallel existe déjà : ||
\newcommand\ssi{si, et seulement si,\xspace}
\newcommand*\cmod[1]{\quad[#1]}
-\newcommand\Oij{\ensuremath{
- \left(O, \vec{\imath}, \vec{\jmath}\,\right)
- }\xspace
-}
-\newcommand\Oijk{\ensuremath{
- \left(O, \vec{\vphantom{t}\imath}, \vec{\vphantom{t}\jmath},
- \vec{\vphantom{t}\smash{k}}\,\right)
- }\xspace
-}
-\newcommand\Ouv{\ensuremath{
- \left(O, \vec{u}, \vec{v}\,\right)}\xspace
-}
\DeclareMathOperator{\pgcd}{pgcd}
\DeclareMathOperator{\ppcm}{ppcm}
@@ -396,6 +399,47 @@
\DeclareMathOperator{\ch}{ch}
\DeclareMathOperator{\sh}{sh}
\DeclareMathOperator{\tgh}{th} %\th existe déjà
+
+\newcommand\@Oij{\ensuremath{
+ \left(O, \vec{\imath}, \vec{\jmath}\,\right)
+ }\xspace
+}
+\newcommand\@@Oij{\ensuremath{
+ \left(O ; \vec{\imath}, \vec{\jmath}\,\right)
+ }\xspace
+}
+\newcommand\Oij{\@ifstar{\@@Oij}{\@Oij}}
+
+\newcommand\@Oijk{\ensuremath{
+ \left(O, \vec{\vphantom{t}\imath}, \vec{\vphantom{t}\jmath},
+ \vec{\vphantom{t}\smash{k}}\,\right)
+ }\xspace
+}
+\newcommand\@@Oijk{\ensuremath{
+ \left(O ; \vec{\vphantom{t}\imath}, \vec{\vphantom{t}\jmath},
+ \vec{\vphantom{t}\smash{k}}\,\right)
+ }\xspace
+}
+\newcommand\Oijk{\@ifstar{\@@Oijk}{\@Oijk}}
+
+\newcommand\@Ouv{\ensuremath{
+ \left(O, \vec{u}, \vec{v}\,\right)}\xspace
+}
+\newcommand\@@Ouv{\ensuremath{
+ \left(O ; \vec{u}, \vec{v}\,\right)}\xspace
+}
+\newcommand\Ouv{\@ifstar{\@@Ouv}{\@Ouv}}
+
+\AtBeginDocument{\renewcommand\ij{\ensuremath{
+ \left(\vec{\imath}, \vec{\jmath}\,\right)
+ }\xspace
+}}
+\newcommand\ijk{\ensuremath{
+ \left(\vec{\vphantom{t}\imath}, \vec{\vphantom{t}\jmath},
+ \vec{\vphantom{t}\smash{k}}\,\right)
+ }\xspace
+}
+
% \end{macrocode}
%
% \begin{thebibliography}{19}
diff --git a/Master/texmf-dist/source/latex/frenchmath/frenchmath.ins b/Master/texmf-dist/source/latex/frenchmath/frenchmath.ins
index 5df632c9fba..54462b10dc9 100644
--- a/Master/texmf-dist/source/latex/frenchmath/frenchmath.ins
+++ b/Master/texmf-dist/source/latex/frenchmath/frenchmath.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2019 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+%% Copyright (C) 2019-2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
%%
%% This file may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.3 of this license
@@ -21,7 +21,7 @@
This is a generated file.
-Copyright (C) 2019 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+Copyright (C) 2019-2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
This file may be distributed and/or modified under the conditions of
the LaTeX Project Public License, either version 1.3 of this license
diff --git a/Master/texmf-dist/source/latex/froufrou/froufrou.dtx b/Master/texmf-dist/source/latex/froufrou/froufrou.dtx
new file mode 100644
index 00000000000..bce65ae0760
--- /dev/null
+++ b/Master/texmf-dist/source/latex/froufrou/froufrou.dtx
@@ -0,0 +1,316 @@
+% \iffalse meta-comment
+% Copyright 2020 Nelson Lago <lago@ime.usp.br>
+%
+% 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 can be
+% found at http://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 Nelson Lago <lago@ime.usp.br>.
+%
+% \fi
+% \iffalse
+%
+%<package>\NeedsTeXFormat{LaTeX2e}[2015/01/01]
+%<package>\ProvidesPackage{froufrou}[2020/12/22 1.2 Visual section separator]
+%
+%<*driver>
+
+\documentclass{ltxdoc}
+
+\usepackage[hyperref,svgnames,x11names,table]{xcolor}
+\usepackage{url}
+\urlstyle{sf}
+\usepackage{hyperref}
+\hypersetup{
+ pdfborder={0 0 .6},
+ pdfborderstyle={/S/U/W .6},
+ urlbordercolor=DodgerBlue,
+ citebordercolor=White,
+ linkbordercolor=White,
+ filebordercolor=White,
+}
+
+\usepackage{froufrou}
+
+\usepackage{libertinus}
+\usepackage[scale=.85]{sourcecodepro}
+
+%%\EnableCrossrefs
+%%\CodelineIndex
+\RecordChanges
+
+\OnlyDescription
+
+\begin{document}
+\DocInput{froufrou.dtx}
+\end{document}
+
+%</driver>
+%
+% \fi
+%
+% \CheckSum{0}
+%
+% \changes{v1.0}{2019/04/24}{Prerelease}
+% \changes{v1.1}{2020/02/03}{Prerelease}
+% \changes{v1.2}{2020/12/22}{First public version}
+%
+% \GetFileInfo{froufrou.sty}
+%
+% \title{The \textsf{froufrou} package\thanks{This document
+% corresponds to \textsf{froufrou}~\fileversion, dated~\filedate.}}
+%
+% \author{
+% Nelson Lago\\
+% \texttt{lago@ime.usp.br}\\
+% ~\\
+% \url{https://gitlab.com/lago/froufrou}
+% }
+%
+% \maketitle
+%
+% \begin{abstract}
+%
+% This package provides fancy separators, which are visual cues that
+% indicate a change of subject or context without actually starting
+% a new chapter or section.
+%
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% This package allows the user to create fancy separators that visually
+% indicate text subdivisions without a title, i.e., they are similar to
+% \verb|\section| but do not provide a name to the new section. Apparently,
+% there is no definite name for such separators; they may be regarded as
+% thought breaks or anonymous sections, but often borrow their name from
+% the ornament that embodies them, such as asterism, fleuron, or dinkus.
+% An example:
+%
+% \froufrou
+%
+% Such separators never appear at the top of the page (that would be
+% confusing), but may appear at the bottom. They should work equally
+% well with one or two-column text and with single or doublespacing.
+% The package offers a few predefined ornaments to be used as separators,
+% but the user may create others.
+%
+% \section{Usage}
+%
+% After \verb|\usepackage{froufrou}|, just call \verb|\froufrou| to create
+% a subdivision. By default, the separator behaves like \verb|\section|,
+% suppressing indentation in the following paragraph. With \verb|\froufrou*|,
+% this feature is disabled and the following paragraph is indented normally.
+%
+% You may select a different separator appearance either by
+% supplying the name of a predefined ornament as a package
+% option (\verb|\usepackage[ornament]{froufrou}|) or by calling
+% \verb|\setfroufrou{ornament}| anywhere in the document. You may
+% also use \verb|\froufrou[ornament]| to only affect that specific
+% separator. \verb|ornament| is one of:
+%
+% \makeatletter
+% \begin{description}
+%
+% \item[fleuron,] the default\footnote{From the \verb|fancyhdr| docs.}: \quad\@froufrouFleuron
+%
+% \item[simplefleuron,] similar to the default, but without the side lines: \quad\@froufrouSimpleFleuron
+%
+% \item[asterism,] three asterisks forming a triangle\footnote{
+% From \verb|symbols-a4| (search for ``asterism'').}: \quad\@froufrouAsterism
+%
+% \item[tightasterism,] similar, but with tighter spacing: \quad\@froufrouTightAsterism
+%
+% \item[trueasterism,] also similar, but using unicode character
+% U+2042\footnote{This only works with a unicode engine
+% (luatex, xetex) and with a font that actually provides the
+% glyph (such as libertinus or libertine).}: \quad\@froufrouTrueAsterism
+%
+% \item[dinkus,] three asterisks forming a line: \quad\@froufrouDinkus
+%
+% \end{description}
+% \makeatother
+%
+% Beyond the predefined ornaments, you may also use
+% \verb|\setfroufrou{SOMETHING}| or \verb|\froufrou[SOMETHING]|
+% to make \verb|SOMETHING| be the separator. However, please note
+% that \verb|\usepackage[SOMETHING]{froufrou}| does \emph{not} work!
+%
+% \section{See also}
+%
+% \begin{itemize}
+% \item \url{http://tug.org/TUGboat/tb32-2/tb101glister.pdf} ;
+% \item The \verb|pgfornament| package, which may aid in creating separators;
+% \item The \verb|novel| class, which offers the somewhat similar \verb|\ChapterDeco| command;
+% \item The \verb|memoir| class, which offers the somewhat similar \verb|\fancybreak| command;
+% \end{itemize}
+%
+% \StopEventually{\PrintChanges}
+%
+% \section{The implementation}
+%
+% \begin{macrocode}
+
+\RequirePackage{etoolbox}
+\RequirePackage{expl3}
+
+% .1\textwidth works well for one and two-column text.
+\RequirePackage{fourier-orns}
+\newcommand\@froufrouFleuron{%
+ \bgroup
+ \footnotesize
+ \rule[.7mm]{.1\textwidth}{0.5pt}%
+ \enspace\,%
+ \decofourleft\decotwo\decofourright
+ \enspace\,%
+ \rule[.7mm]{.1\textwidth}{0.5pt}%
+ \egroup
+}
+
+\newcommand\@froufrouSimpleFleuron{%
+ \bgroup
+ \footnotesize
+ \decofourleft\decotwo\decofourright
+ \egroup
+}
+
+\newcommand{\@froufrouTightAsterism}{%
+ \bgroup
+ \smash{%
+ \raisebox{-.5ex}{%
+ \setlength{\tabcolsep}{-.5pt}%
+ \begin{tabular}{@{}cc@{}}%
+ \multicolumn2c*\\[-2ex]*&*%
+ \end{tabular}%
+ }%
+ }%
+ \egroup
+}
+
+\newcommand{\@froufrouAsterism}{%
+ \bgroup
+ \smash{%
+ \raisebox{-.5ex}{%
+ \setlength{\tabcolsep}{0pt}%
+ \begin{tabular}{@{}cc@{}}%
+ \multicolumn2c*\\[-1.8ex]*&*%
+ \end{tabular}%
+ }%
+ }%
+ \egroup
+}
+
+% Unicode character U+2042 (\char"2042), only with a unicode engine
+% (luatex/xetex) and a font that has this glyph (such as libertinus
+% or libertine)
+\newcommand\@froufrouTrueAsterism{⁂}
+
+\newcommand{\@froufrouDinkus}{\relax*\quad*\quad*}
+
+\ExplSyntaxOn
+\newcommand\setfroufrou[1]{%
+ \str_case:nnF{#1}{
+ {}{\relax}
+ {fleuron}{\def\@froufrouOrnament{\@froufrouFleuron}}
+ {simplefleuron}{\def\@froufrouOrnament{\@froufrouSimpleFleuron}}
+ {asterism}{\def\@froufrouOrnament{\@froufrouAsterism}}
+ {tightasterism}{\def\@froufrouOrnament{\@froufrouTightAsterism}}
+ {trueasterism}{\def\@froufrouOrnament{\@froufrouTrueAsterism}}
+ {dinkus}{\def\@froufrouOrnament{\@froufrouDinkus}}%
+ }{\def\@froufrouOrnament{#1}}%
+}
+\ExplSyntaxOff
+
+% I see no reason to make these different, but feel free to change this :)
+\def\@froufrouspacebefore{\vskip 22pt plus 7pt minus 5pt}
+\def\@froufrouspaceafter{\@froufrouspacebefore}
+
+% The starred form means "indent the first line of the next paragraph"
+% (\if@afterindent is read by \@afterheading)
+\newcommand{\froufrou}{%
+ \@ifstar{\@afterindenttrue\@realfroufrou}{\@afterindentfalse\@realfroufrou}%
+}
+
+% For compatibility with older versions of this package
+\newcommand\frufru{\froufrou}
+
+\newcommand{\@realfroufrou}[1][]{%
+ % Make sure we left horizontal mode.
+ \nopagebreak[4]\par
+
+ \nopagebreak[4]\@froufrouspacebefore\nopagebreak[4]
+
+ % Start a new group to (1) reset \doublespacing, \parskip, and
+ % \baselineskip, so spacing is independent from the previous text
+ % settings and (2) so that using #1 to change the ornament only
+ % affects the current call. Then, start yet another group only
+ % for the ornament because font size changes in it should not
+ % affect spacing either.
+ \bgroup
+ \setfroufrou{#1}%
+ \normalsize
+ \ifdefvoid{\setstretch}{}{\setstretch{\setspace@singlespace}}% normally 1
+ \setlength{\parskip}{0pt}
+ \noindent\centering\bgroup\@froufrouOrnament\egroup\par
+ \egroup
+
+ \nopagebreak[4]\@froufrouspaceafter\nopagebreak[4]
+
+ % Next paragraph's \doublespacing, \baselineskip, and \parskip
+ % should not affect spacing.
+ \@froufrouFixSpacingAfter
+
+ % Breaking after the separator is acceptable as a last resort. Since
+ % we use a lot of vertical space before/after it, not allowing this
+ % break might lead to poor results in some cases.
+ \nopagebreak[3]
+
+ % Emulate the behavior of \section, \subsection etc: prevent
+ % the first line of the next paragraph from being indented
+ % and absolutely forbid a club line in the next paragraph.
+ \@afterheading
+}
+
+\newcommand\@froufrouFixSpacingAfter{
+ % The next \par will add \parskip and \baselineskip. We want to
+ % (1) eliminate \parskip so that spacing does not change if it
+ % is nonzero and (2) add the "normal" \baselineskip, even if the
+ % text is set using \doublespacing. These adjustments may be off
+ % if font size, \parskip or \baselineskip are changed before the
+ % next paragraph.
+
+ \nopagebreak[4]\vskip -\parskip
+
+ \ifdefvoid{\setstretch}
+ {}
+ {
+ \bgroup
+ % \singlespacing may add an extra \baselineskip; let's
+ % avoid surprises and use \setstrech instead.
+ \setstretch {\setspace@singlespace}% normally 1
+ \nopagebreak[4]\vskip \baselineskip
+ \egroup
+
+ \nopagebreak[4]\vskip -\baselineskip
+ }
+}
+
+% Trying to accept a custom ornament as a package option is not such a
+% great idea: first, it has to be expandable; second, this may become
+% a problem if we want to add more options to the class in the future.
+\DeclareOption{fleuron}{\setfroufrou{fleuron}}
+\DeclareOption{simplefleuron}{\setfroufrou{simplefleuron}}
+\DeclareOption{asterism}{\setfroufrou{asterism}}
+\DeclareOption{tightasterism}{\setfroufrou{tightasterism}}
+\DeclareOption{trueasterism}{\setfroufrou{trueasterism}}
+\DeclareOption{dinkus}{\setfroufrou{dinkus}}
+\DeclareOption*{\PackageWarning{froufrou}{Unknown option `\CurrentOption'}}
+\ExecuteOptions{fleuron}
+\ProcessOptions\relax
+
+% \end{macrocode}
+% \Finale
diff --git a/Master/texmf-dist/source/latex/froufrou/froufrou.ins b/Master/texmf-dist/source/latex/froufrou/froufrou.ins
new file mode 100644
index 00000000000..153a5a04fc1
--- /dev/null
+++ b/Master/texmf-dist/source/latex/froufrou/froufrou.ins
@@ -0,0 +1,50 @@
+%% Copyright 2020 Nelson Lago <lago@ime.usp.br>
+%%
+%% 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 can be
+%% found at http://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 Nelson Lago <lago@ime.usp.br>.
+
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\usedir{tex/latex/froufrou}
+
+\preamble
+Copyright 2020 Nelson Lago <lago@ime.usp.br>
+
+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 can be
+found at http://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 Nelson Lago <lago@ime.usp.br>.
+
+\endpreamble
+
+\generate{\file{froufrou.sty}{\from{froufrou.dtx}{package}}}
+
+\obeyspaces
+\Msg{****************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the *}
+\Msg{* following file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* froufrou.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file *}
+\Msg{* froufrou.dtx through LaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{****************************************************}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/gentombow/Makefile b/Master/texmf-dist/source/latex/gentombow/Makefile
deleted file mode 100644
index f376d1ade0b..00000000000
--- a/Master/texmf-dist/source/latex/gentombow/Makefile
+++ /dev/null
@@ -1,36 +0,0 @@
-KANJI = -kanji=utf8
-FONTMAP = -f ipaex.map -f ptex-ipaex.map
-TEXMF = $(shell kpsewhich -var-value=TEXMFHOME)
-
-all: bounddvi.pdf bounddvi-en.pdf \
- gentombow.pdf gentombow-ja.pdf #pxgentombow.pdf
-
-.SUFFIXES: .tex .dvi .pdf
-.tex.dvi:
- platex $(KANJI) $<
- platex $(KANJI) $<
- rm *.aux *.log
-.dvi.pdf:
- dvipdfmx $(FONTMAP) $<
-
-bounddvi-en.dvi: bounddvi-en.tex
- latex $<
- latex $<
- rm *.aux *.log
-gentombow.pdf: gentombow.tex
- pdflatex $<
- pdflatex $<
- rm *.aux *.log
-
-.PHONY: install clean
-install:
- mkdir -p ${TEXMF}/doc/latex/gentombow
- cp ./Makefile ${TEXMF}/doc/latex/gentombow/
- cp ./LICENSE ${TEXMF}/doc/latex/gentombow/
- cp ./README.md ${TEXMF}/doc/latex/gentombow/
- cp ./*.pdf ${TEXMF}/doc/latex/gentombow/
- cp ./*.tex ${TEXMF}/doc/latex/gentombow/
- mkdir -p ${TEXMF}/tex/latex/gentombow
- cp ./*.sty ${TEXMF}/tex/latex/gentombow/
-clean:
- rm -f *.dvi *.pdf
diff --git a/Master/texmf-dist/source/latex/glossaries-extra/glossaries-extra.dtx b/Master/texmf-dist/source/latex/glossaries-extra/glossaries-extra.dtx
index c2dcfe0ecb8..b9f90f6ca85 100644
--- a/Master/texmf-dist/source/latex/glossaries-extra/glossaries-extra.dtx
+++ b/Master/texmf-dist/source/latex/glossaries-extra/glossaries-extra.dtx
@@ -1,6 +1,12 @@
%\iffalse
% glossaries-extra.dtx generated using makedtx version 1.2 (c) Nicola Talbot
% Command line args:
+% -setambles ".*\.bib=>\nopreamble\nopostamble"
+% -section "chapter"
+% -doc "glossaries-extra-codedoc.tex"
+% -author "Nicola Talbot"
+% -macrocode ".*\.tex"
+% -macrocode ".*\.bib"
% -src "glossaries-extra.sty\Z=>glossaries-extra.sty"
% -src "glossaries-extra-bib2gls.sty\Z=>glossaries-extra-bib2gls.sty"
% -src "glossaries-extra-stylemods.sty\Z=>glossaries-extra-stylemods.sty"
@@ -9,17 +15,11 @@
% -src "glossary-topic.sty\Z=>glossary-topic.sty"
% -src "(example-glossaries-.+\.tex)\Z=>\1"
% -src "(example-glossaries-.+\.bib)\Z=>\1"
-% -doc "glossaries-extra-codedoc.tex"
-% -section "chapter"
-% -setambles ".*\.bib=>\nopreamble\nopostamble"
% -comment ".*\.tex"
% -comment ".*\.bib"
% -codetitle "Main Package Code (\\styfmt{glossaries-extra.sty})"
-% -author "Nicola Talbot"
-% -macrocode ".*\.tex"
-% -macrocode ".*\.bib"
% glossaries-extra
-% Created on 2020/3/23 20:29
+% Created on 2020/4/1 13:56
%\fi
%\iffalse
%<*package>
@@ -142,7 +142,7 @@ governed by the \gloskey{first} and \gloskey{firstplural} keys of
\setcounter{IndexColumns}{2}
-\CheckSum{27175}
+\CheckSum{27181}
\newcommand*{\ifirstuse}{\iterm{first use}}
\newcommand*{\firstuse}{\gls{firstuse}}
@@ -182,13 +182,13 @@ governed by the \gloskey{first} and \gloskey{firstplural} keys of
\raggedright
}
-\title{glossaries-extra.sty v1.44:
+\title{glossaries-extra.sty v1.45:
documented code}
\author{Nicola L.C. Talbot\\[10pt]
Dickimaw Books\\
\url{http://www.dickimaw-books.com/}}
-\date{2020-03-23}
+\date{2020-04-01}
\begin{document}
\DocInput{glossaries-extra.dtx}
@@ -233,7 +233,7 @@ Dickimaw Books\\
%\section{Package Initialisation and Options}
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{glossaries-extra}[2020/03/23 v1.44 (NLCT)]
+\ProvidesPackage{glossaries-extra}[2020/04/01 v1.45 (NLCT)]
% \end{macrocode}
% Requires \sty{xkeyval} to define package options.
% \begin{macrocode}
@@ -25645,7 +25645,7 @@ defined}{}%
%automatically loaded by the record option.
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{glossaries-extra-bib2gls}[2020/03/23 v1.44 (NLCT)]
+\ProvidesPackage{glossaries-extra-bib2gls}[2020/04/01 v1.45 (NLCT)]
% \end{macrocode}
%Provide convenient shortcut commands for predefined glossary types.
%\begin{macro}{\printunsrtacronyms}
@@ -28730,7 +28730,7 @@ defined}{}%
% First identify package:
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{glossaries-extra-stylemods}[2020/03/23 v1.44 (NLCT)]
+\ProvidesPackage{glossaries-extra-stylemods}[2020/04/01 v1.45 (NLCT)]
% \end{macrocode}
% Provide package options to automatically load required predefined
% styles. The simplest method is to just test for the existence of
@@ -29800,6 +29800,14 @@ defined}{}%
}%
% \end{macrocode}
%\end{macro}
+%\begin{macro}{\glstreenonameDescLoc}
+%\changes{1.45}{2020-04-01}{new}
+% \begin{macrocode}
+ \newcommand{\glstreenonameDescLoc}[2]{%
+ \glstreenonamedesc{#1}\glstreeprelocation#2%
+ }
+% \end{macrocode}
+%\end{macro}
%\begin{macro}{\glstreenonamechilddesc}
%\changes{1.31}{2018-05-09}{new}
%The child entry doesn't have the pre-description separator as the
@@ -29810,6 +29818,14 @@ defined}{}%
}%
% \end{macrocode}
%\end{macro}
+%\begin{macro}{\glstreenonameChildDescLoc}
+%\changes{1.45}{2020-04-01}{new}
+% \begin{macrocode}
+ \newcommand{\glstreenonameChildDescLoc}[2]{%
+ \glstreenonamechilddesc{#1}\glstreechildprelocation#2%
+ }
+% \end{macrocode}
+%\end{macro}
% \begin{macrocode}
\renewglossarystyle{treenoname}{%
\renewenvironment{theglossary}%
@@ -29823,8 +29839,10 @@ defined}{}%
\parindent0pt\relax
\glsentryitem{##1}\glstreenamefmt{\glstarget{##1}{\glossentryname{##1}}}%
\glstreenonamesymbol{##1}%
- \glstreenonamedesc{##1}%
- \glstreeDescLoc{##1}{##2}\par
+% \end{macrocode}
+%\changes{1.45}{2020-04-01}{removed duplicate description}
+% \begin{macrocode}
+ \glstreenonameDescLoc{##1}{##2}\par
}%
\renewcommand{\subglossentry}[3]{%
\hangindent##1\glstreeindent\relax
@@ -29833,8 +29851,7 @@ defined}{}%
\glssubentryitem{##2}%
\fi
\glstarget{##2}{\strut}%
- \glstreenonamechilddesc{##2}%
- \glstreechildprelocation##3\par
+ \glstreenonameChildDescLoc{##2}{##3}\par
}%
\renewcommand*{\glsgroupskip}{\ifglsnogroupskip\else\glstreegroupskip\fi}%
}
@@ -31036,7 +31053,7 @@ defined}{}%
%\section{Package Initialisation and Options}
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{glossary-bookindex}[2020/03/23 v1.44 (NLCT)]
+\ProvidesPackage{glossary-bookindex}[2020/04/01 v1.45 (NLCT)]
% \end{macrocode}
%Load required packages.
% \begin{macrocode}
@@ -31532,7 +31549,7 @@ defined}{}%
%Provides additional long styles.
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{glossary-longextra}[2020/03/23 v1.44 (NLCT)]
+\ProvidesPackage{glossary-longextra}[2020/04/01 v1.45 (NLCT)]
% \end{macrocode}
%Load required packages.
% \begin{macrocode}
@@ -32961,7 +32978,7 @@ defined}{}%
%topic.
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{glossary-topic}[2020/03/23 v1.44 (NLCT)]
+\ProvidesPackage{glossary-topic}[2020/04/01 v1.45 (NLCT)]
% \end{macrocode}
%Load required package.
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/glossaries-extra/glossaries-extra.ins b/Master/texmf-dist/source/latex/glossaries-extra/glossaries-extra.ins
index f1a3cb82b09..cc2f94010cb 100644
--- a/Master/texmf-dist/source/latex/glossaries-extra/glossaries-extra.ins
+++ b/Master/texmf-dist/source/latex/glossaries-extra/glossaries-extra.ins
@@ -1,4 +1,4 @@
-% glossaries-extra.ins generated using makedtx version 1.2 2020/3/23 20:29
+% glossaries-extra.ins generated using makedtx version 1.2 2020/4/1 13:56
\input docstrip
\preamble
diff --git a/Master/texmf-dist/source/latex/glossaries-nynorsk/glossaries-nynorsk.dtx b/Master/texmf-dist/source/latex/glossaries-nynorsk/glossaries-nynorsk.dtx
new file mode 100644
index 00000000000..71c8898bfa3
--- /dev/null
+++ b/Master/texmf-dist/source/latex/glossaries-nynorsk/glossaries-nynorsk.dtx
@@ -0,0 +1,162 @@
+%\iffalse
+% glossaries-nynorsk.dtx generated using makedtx version 1.1 (c) Eirik Haustveit
+% Command line args:
+% -src "(.*.ldf)=>\1"
+% -src "(.*.dict)=>\1"
+% -doc "glossaries-module.tex"
+% -author "Eirik Haustveit"
+% glossaries-nynorsk
+% Created on 2020/05/16 14:20
+%\fi
+%\iffalse
+%<*package>
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%</package>
+%\fi
+% \iffalse
+% Doc-Source file to use with LaTeX2e
+% Copyright (C) 2020 Eirik Haustveit, all rights reserved.
+% \fi
+% \iffalse
+%<*driver>
+\documentclass{nlctdoc}
+
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+
+\title{Glossaries Language Module: glossaries-nynorsk}
+\author{Eirik Haustveit}
+\date{version 1.0 (2020-05-16)}
+
+\begin{document}
+\DocInput{glossaries-nynorsk.dtx}
+\end{document}
+%</driver>
+%\fi
+%\maketitle
+%
+%This language module simply needs to be installed. The \sty{glossaries}
+%package will automatically load it if required.
+%
+%
+%
+%\StopEventually{}
+%\section{The Code}
+%\iffalse
+% \begin{macrocode}
+%<*glossaries-nynorsk.ldf>
+% \end{macrocode}
+%\fi
+%\subsection{glossaries-nynorsk.ldf}
+% \begin{macrocode}
+\ProvidesGlossariesLang{nynorsk}[2020/05/16 v1.0]
+
+\glsifusedtranslatordict{Nynorsk}
+{%
+ \addglossarytocaptions{\CurrentTrackedLanguage}%
+ \addglossarytocaptions{\CurrentTrackedDialect}%
+}
+{%
+ \@ifpackageloaded{polyglossia}%
+ {%
+ \newcommand*{\glossariescaptionsnynorsk}{%
+ \renewcommand*{\glossaryname}{\textnynorsk{Ordforklaringar}}%
+ \renewcommand*{\acronymname}{\textnynorsk{Forkortingar}}%
+ \renewcommand*{\entryname}{\textnynorsk{Notasjon}}%
+ \renewcommand*{\descriptionname}{\textnynorsk{Beskriving}}%
+ \renewcommand*{\symbolname}{\textnynorsk{Symbol}}%
+ \renewcommand*{\pagelistname}{\textnynorsk{Side}}%
+ \renewcommand*{\glssymbolsgroupname}{\textnynorsk{Symbol}}%
+ \renewcommand*{\glsnumbersgroupname}{\textnynorsk{Tal}}%
+ }%
+ }%
+ {%
+ \newcommand*{\glossariescaptionsnynorsk}{%
+ \renewcommand*{\glossaryname}{Ordforklaringar}%
+ \renewcommand*{\acronymname}{Forkortingar}%
+ \renewcommand*{\entryname}{Notasjon}%
+ \renewcommand*{\descriptionname}{Beskriving}%
+ \renewcommand*{\symbolname}{Symbol}%
+ \renewcommand*{\pagelistname}{Side}%
+ \renewcommand*{\glssymbolsgroupname}{Symbol}%
+ \renewcommand*{\glsnumbersgroupname}{Tal}%
+ }%
+ }%
+ \ifcsdef{captions\CurrentTrackedDialect}
+ {%
+ \csappto{captions\CurrentTrackedDialect}%
+ {%
+ \glossariescaptionsnynorsk
+ }%
+ }%
+ {%
+ \ifcsdef{captions\CurrentTrackedLanguage}
+ {
+ \csappto{captions\CurrentTrackedLanguage}%
+ {%
+ \glossariescaptionsnynorsk
+ }%
+ }%
+ {%
+ }%
+ }%
+ \glossariescaptionsnynorsk
+}
+% \end{macrocode}
+% General default plural suffix:
+% \begin{macrocode}
+\renewcommand*{\glspluralsuffix}{s}
+% \end{macrocode}
+% Acronym default plural suffix:
+% \begin{macrocode}
+\renewcommand*{\glsacrpluralsuffix}{\glspluralsuffix}
+% \end{macrocode}
+% Acronym in \cs{textsc} default plural suffix
+% (\cs{glstextup} is used to cancel the effect of \cs{textsc}):
+% \begin{macrocode}
+\renewcommand*{\glsupacrpluralsuffix}{\glstextup{\glsacrpluralsuffix}}
+% \end{macrocode}
+%\iffalse
+% \begin{macrocode}
+%</glossaries-nynorsk.ldf>
+% \end{macrocode}
+%\fi
+%\iffalse
+% \begin{macrocode}
+%<*glossaries-dictionary-Nynorsk.dict>
+% \end{macrocode}
+%\fi
+%\subsection{glossaries-dictionary-Nynorsk.dict}
+% \begin{macrocode}
+\ProvidesDictionary{glossaries-dictionary}{Nynorsk}
+
+\providetranslation{Glossary}{Ordforklaring}
+\providetranslation{Acronyms}{Forkortingar}
+\providetranslation{Notation (glossaries)}{Symbolliste}
+\providetranslation{Description (glossaries)}{Beskriving}
+\providetranslation{Symbol (glossaries)}{Symbol}
+\providetranslation{Page List (glossaries)}{Side}
+\providetranslation{Symbols (glossaries)}{Symbol}
+\providetranslation{Numbers (glossaries)}{Tal}
+% \end{macrocode}
+%\iffalse
+% \begin{macrocode}
+%</glossaries-dictionary-Nynorsk.dict>
+% \end{macrocode}
+%\fi
+%\Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/glossaries-nynorsk/glossaries-nynorsk.ins b/Master/texmf-dist/source/latex/glossaries-nynorsk/glossaries-nynorsk.ins
new file mode 100644
index 00000000000..ab784f1c282
--- /dev/null
+++ b/Master/texmf-dist/source/latex/glossaries-nynorsk/glossaries-nynorsk.ins
@@ -0,0 +1,36 @@
+% glossaries-english.ins generated using makedtx version 1.1 2014/11/24 18:20
+\input docstrip
+
+\preamble
+
+ glossaries-nynorsk.dtx
+ Copyright 2020 Eirik Haustveit
+
+
+ Based on package by Nicola Talbot
+
+ This work may be distributed and/or modified under the
+ conditions of the LaTeX Project Public License, either version 1.3
+ of this license of (at your option) any later version.
+ The latest version of this license is in
+ http://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 Eirik Haustveit.
+
+ This work consists of the files glossaries-nynorsk.dtx and glossaries-nynorsk.ins and the derived files glossaries-nynorsk.ldf, glossaries-dictionary-Nynorsk.dict.
+
+\endpreamble
+
+\askforoverwritefalse
+
+\generate{\file{glossaries-nynorsk.ldf}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{glossaries-nynorsk.dtx}{glossaries-nynorsk.ldf,package}}
+\file{glossaries-dictionary-Nynorsk.dict}{\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble\from{glossaries-nynorsk.dtx}{glossaries-dictionary-Nynorsk.dict,package}}
+}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/gnuplottex/gnuplottex.dtx b/Master/texmf-dist/source/latex/gnuplottex/gnuplottex.dtx
index 8cb288f83dd..35d3da96e28 100644
--- a/Master/texmf-dist/source/latex/gnuplottex/gnuplottex.dtx
+++ b/Master/texmf-dist/source/latex/gnuplottex/gnuplottex.dtx
@@ -42,7 +42,7 @@
%<package> \NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package> \ProvidesPackage{gnuplottex}
%<*package>
- [2019/12/22 v0.9.4 gnuplot graphs in LaTeX]
+ [2020/03/19 v0.9.5 gnuplot graphs in LaTeX]
\RequirePackage{graphicx,moreverb,keyval,ifthen,catchfile}
%</package>
%
@@ -67,7 +67,7 @@
%</driver>
% \fi
%
-% \CheckSum{457}
+% \CheckSum{465}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -108,6 +108,7 @@
% \changes{v0.9.2}{2016/08/21}{Misc bugfixes (thanks fostermaier, Enrico Gregorio, Jan-Benedict Glaw).}
% \changes{v0.9.3}{2019/09/22}{Whitespace fixes (thanks Johannes Hielscher).}
% \changes{v0.9.4}{2019/12/22}{Whitespace fixes (thanks Johannes Hielscher).}
+% \changes{v0.9.5}{2020/03/19}{Make subfolder creation test conditional on shell escape being enabled (thanks Alex Serenko).}
%
% \GetFileInfo{gnuplottex.dtx}
%
@@ -562,7 +563,7 @@
% \fi
\begin{figure}%
\centering%
- \begin{gnuplot}[terminal=tikz, terminaloptions={color dashed providevars a,c}]
+ \begin{gnuplot}[terminal=tikz, terminaloptions={color providevars a,c}]
set key box top left
set key width -0.9
set key height 0.25
@@ -596,7 +597,7 @@
%~\\
%\verb+\begin{figure}%+\\
%\verb+ \centering%+\\
-%\verb+ \begin{gnuplot}[terminal=tikz, terminaloptions={color dashed providevars a,c}]+\\
+%\verb+ \begin{gnuplot}[terminal=tikz, terminaloptions={color providevars a,c}]+\\
%\verb+ set key box top left+\\
%\verb+ set key width -0.9+\\
%\verb+ set key height 0.25+\\
@@ -639,7 +640,7 @@
% \verb+ \centering%+\\
% \verb+ \tikzsetnextfilename{ThisIsASinus}+\\
% \verb+ \begin{tikzpicture}[gnuplot]+\\
-% \verb+ \begin{gnuplot}[terminal=tikz, terminaloptions=color dashed nopicenvironment]+\\
+% \verb+ \begin{gnuplot}[terminal=tikz, terminaloptions=color nopicenvironment]+\\
%\verb+ set grid xtics mxtics lt 0 ls 0+\\
%\verb+ set grid ytics mytics lt 0 ls 0+\\
%\verb+ set key box top left+\\
@@ -698,7 +699,7 @@
\immediate\write18{touch \tmpfile}
\fi
\ifmiktex
- \IfFileExists{\tmpfile.}{\ShellEscapetrue}{\ShellEscapefalse}
+ \IfFileExists{\tmpfile}{\ShellEscapetrue}{\ShellEscapefalse}
\immediate\write18{del "\tmpfile"}
\else
\IfFileExists{\tmpfile}{\ShellEscapetrue}{\ShellEscapefalse}
@@ -708,38 +709,40 @@
\fi
\ifusesubfolder
- \ifmiktex
- \immediate\write18{mkdir gnuplottex}
- \immediate\write18{echo test > "gnuplottex/\tmpfile"}
- \else
- \immediate\write18{mkdir -p "gnuplottex"}
- \immediate\write18{touch "gnuplottex/\tmpfile"}
- \fi
- \IfFileExists{gnuplottex/\tmpfile}{
+ \def\subfolder{gnuplottex}
+ \ifShellEscape
\ifmiktex
- \immediate\write18{del "gnuplottex\@backslashchar\tmpfile"}
+ \immediate\write18{mkdir \subfolder}
+ \immediate\write18{echo test > "\subfolder/\tmpfile"}
\else
- \immediate\write18{rm -f "gnuplottex/\tmpfile"}
+ \immediate\write18{mkdir -p "\subfolder"}
+ \immediate\write18{touch "\subfolder/\tmpfile"}
\fi
- \def\subfolder{gnuplottex/}
- }{
- \PackageWarningNoLine{gnuplottex}
- {Creation of subfolder failed.\MessageBreak
- You'll need to create the folder yourself}
- \def\subfolder{}
- }
+ \IfFileExists{gnuplottex/\tmpfile}{
+ \ifmiktex
+ \immediate\write18{del "\subfolder\@backslashchar\tmpfile"}
+ \else
+ \immediate\write18{rm -f "\subfolder/\tmpfile"}
+ \fi
+ }{
+ \PackageWarningNoLine{gnuplottex}
+ {Creation of subfolder failed.\MessageBreak
+ You'll need to create the folder yourself}
+ \def\subfolder{}
+ }
+ \fi
\else
- \def\subfolder{}
+ \def\subfolder{.}
\fi
\ifShellEscape
\PackageInfo{gnuplottex}
- {Automatically converting gnuplot files.}
+ {Automatically converting gnuplot files}
\else
\PackageWarningNoLine{gnuplottex}
{Shell escape not enabled.\MessageBreak
- You'll need to convert the graphs yourself.}
+ You'll need to convert the graphs yourself}
\fi
\newcounter{fignum}
% \end{macrocode}
@@ -754,7 +757,7 @@
\def\BeforeStream
{\message{Opening gnuplot stream #1}%
\immediate\write\verbatim@out{\string set terminal \gnuplotterminal \gnuplotterminaloptions}%
- \immediate\write\verbatim@out{\string set output '\subfolder\figname.\gnuplottexextension{\gnuplotterminal}'}%
+ \immediate\write\verbatim@out{\string set output '\subfolder/\figname.\gnuplottexextension{\gnuplotterminal}'}%
\ifusesiunitx
\ifthenelse{\equal{\extension}{\string tex}}{\usesiunitxingnuplot}{\PackageWarningNoLine{gnuplottex}{Axis numbers not written in \noexpand\num{}. Use a terminal that allows TeX output to enable this feature.}}
\else
@@ -808,7 +811,7 @@
\def\gnuplotterminaloptions{}%%
\def\gnuplotscale{1}%%
\setkeys{pic}{#1}%%
- \xdef\gnuplotCutFile{\subfolder\figname.gnuplot}%%
+ \xdef\gnuplotCutFile{\subfolder/\figname.gnuplot}%%
\gnuplotverbatimwrite{\gnuplotCutFile}}
{\endgnuplotverbatimwrite%
\gnuplotgraphicsprocess%
@@ -820,24 +823,24 @@
\def\extension{\gnuplottexextension{\gnuplotterminal}}
\long\gdef\gnuplotgraphicsprocess{%
\ifShellEscape%
- \IfFileExists{\subfolder\figname.gnuplot}{%
+ \IfFileExists{\subfolder/\figname.gnuplot}{%
\ifmiktex
- \immediate\write18{\gnuplotexe\space \subfolder\figname.gnuplot}%
+ \immediate\write18{\gnuplotexe\space \subfolder/\figname.gnuplot}%
\else
- \immediate\write18{\gnuplotexe\space \subfolder\figname.gnuplot\space 2>>\jobname.gnuploterrors}%
+ \immediate\write18{\gnuplotexe\space \subfolder/\figname.gnuplot\space 2>>\jobname.gnuploterrors}%
\fi%
- \IfFileExists{\subfolder\figname.\extension}{%
- \PackageInfo{gnuplottex}{\subfolder\figname.gnuplot converted}%
+ \IfFileExists{\subfolder/\figname.\extension}{%
+ \PackageInfo{gnuplottex}{\subfolder/\figname.gnuplot converted}%
\ifcleanup
\ifmiktex
- \immediate\write18{del "\subfolder\figname.gnuplot"}%
+ \immediate\write18{del "\subfolder/\figname.gnuplot"}%
\else
- \immediate\write18{rm -f "\subfolder\figname.gnuplot"}%
+ \immediate\write18{rm -f "\subfolder/\figname.gnuplot"}%
\fi%
\fi%
}
{\PackageWarningNoLine{gnuplottex}
- {Conversion of \subfolder\figname.gnuplot failed}}}{}%
+ {Conversion of \subfolder/\figname.gnuplot failed}}}{}%
\fi}
\long\def\gnuploterrors@eatpar#1#2\@nil{\def\gnuploterrors@{#2}}
\AtEndDocument{%
@@ -858,13 +861,13 @@
% \subsection{Graph inclusion}
% \begin{macrocode}
\long\gdef\gnuplotgraphicsinclude{%
- \IfFileExists{\subfolder\figname.\extension}{%
+ \IfFileExists{\subfolder/\figname.\extension}{%
\ifthenelse{\equal{\extension}{\string tex}}
- {\scalebox{\gnuplotscale}{\input{\subfolder\figname.\extension}}}
- {\includegraphics[scale=\gnuplotscale]{\subfolder\figname.\extension}}
+ {\scalebox{\gnuplotscale}{\input{\subfolder/\figname.\extension}}}
+ {\includegraphics[scale=\gnuplotscale]{\subfolder/\figname.\extension}}
}
{\PackageWarningNoLine{gnuplottex}
- {Please convert \subfolder\figname.gnuplot manually}}
+ {Please convert \subfolder/\figname.gnuplot manually}}
}
% \end{macrocode}
%
@@ -874,7 +877,7 @@
\immediate\openout \verbatim@out #1%
\message{Opening gnuplot stream #1}%
\immediate\write\verbatim@out{\string set terminal \gnuplotterminal \gnuplotterminaloptions}%
- \immediate\write\verbatim@out{\string set output '\subfolder\figname.\gnuplottexextension{\gnuplotterminal}'}%
+ \immediate\write\verbatim@out{\string set output '\subfolder/\figname.\gnuplottexextension{\gnuplotterminal}'}%
\ifusesiunitx
\ifthenelse{\equal{\extension}{\string tex}}{\usesiunitxingnuplot}{\PackageWarningNoLine{gnuplottex}{Axis numbers not written in \noexpand\num{}. Use a terminal that allows TeX output to enable this feature.}}
\else
@@ -897,7 +900,7 @@
\def\gnuplotterminaloptions{}
\def\gnuplotscale{1}
\setkeys{pic}{#1}
- \xdef\gnuplotCutFile{\subfolder\figname.gnuplot}
+ \xdef\gnuplotCutFile{\subfolder/\figname.gnuplot}
\gnuplotloadfilewrite{\gnuplotCutFile}{#2}
\gnuplotgraphicsprocess%
\gnuplotgraphicsinclude
diff --git a/Master/texmf-dist/source/latex/grant/grant.dtx b/Master/texmf-dist/source/latex/grant/grant.dtx
index 6c8a96d5f4a..153a3d780e8 100644
--- a/Master/texmf-dist/source/latex/grant/grant.dtx
+++ b/Master/texmf-dist/source/latex/grant/grant.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2016 Jonathan Karr <karr@mssm.edu>
+% Copyright (C) 2016-2019 Jonathan Karr <karr@mssm.edu>
% -----------------------------------------------------------
%
% This file may be distributed and/or modified under the conditions of
@@ -18,7 +18,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[2003/12/01]
%<package>\ProvidesPackage{grant}
%<*package>
- [2016/08/22 v0.0.3 Grant package for formatting federal grant applications]
+ [2019/02/26 v0.0.5 Grant package for formatting federal grant applications]
%</package>
%
%
@@ -53,7 +53,11 @@
%% Right brace \} Tilde \~}
-% \changes{v0.0.2}{2016/08/17}{Initial version}
+% \changes{v0.0.5}{2019/02/26}{Adding examples}
+% \changes{v0.0.4}{2016/09/26}{Debugging class renaming and .dtx file for pdf compilation}
+% \changes{v0.0.3}{2016/08/22}{Rename classes to grant-*.cls}
+% \changes{v0.0.2}{2016/08/17}{Packaging with ins, dtx files}
+% \changes{v0.0.1}{2016/08/17}{Initial version}
%
% \GetFileInfo{grant.dtx}
%
@@ -69,7 +73,8 @@
%
% This package provides LaTeX classes to format grant applications for the following federal agencies:
% \begin{description}[labelindent=0.25in]
-% \item[\texttt{grant-arl}]: Army Research Laboratory
+% \item[\texttt{grant-afosr}]: Air Force Office of Scientific Research
+% \item[\texttt{grant-aro}]: Army Research Office
% \item[\texttt{grant-darpa}]: Defense Advanced Research Projects Agency
% \item[\texttt{grant-doe}]: Department of Energy
% \item[\texttt{grant-nih}]: National Institutes of Health
@@ -109,7 +114,7 @@
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{grant}[2016/01/12 grant class]
+\ProvidesClass{grant}[2019/02/26 grant class]
%%%%%%%%%%%%%%%%%%%%%%
%% options
@@ -128,14 +133,21 @@
{\booltrue{isdraft}}
\DeclareOption{isnotdraft}
{\boolfalse{isdraft}}
-
+
+\newbool{iswhitepaper}
+\boolfalse{iswhitepaper}
+\DeclareOption{iswhitepaper}
+ {\booltrue{iswhitepaper}}
+\DeclareOption{isnotwhitepaper}
+ {\boolfalse{iswhitepaper}}
+
\newbool{issectioncompact}
\boolfalse{issectioncompact}
\DeclareOption{issectioncompact}
{\booltrue{issectioncompact}}
\DeclareOption{isnotsectioncompact}
{\boolfalse{issectioncompact}}
-
+
\newbool{isbibcompact}
\boolfalse{isbibcompact}
\DeclareOption{isbibcompact}
@@ -143,7 +155,7 @@
\DeclareOption{isnotbibcompact}
{\boolfalse{isbibcompact}}
-\ExecuteOptions{isdraft, isnotdraft, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
+\ExecuteOptions{isdraft, isnotdraft, iswhitepaper, isnotwhitepaper, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
\ProcessOptions
%%%%%%%%%%%%%%%%%%%%%%
@@ -165,6 +177,16 @@
%underline
\usepackage[normalem]{ulem}
\usepackage{soul}
+\soulregister\cite7
+
+%highlighting
+\usepackage{xcolor}
+\usepackage{framed}
+\definecolor{hlcolor}{rgb}{1, 1, 0}
+\sethlcolor{hlcolor}
+\colorlet{shadecolor}{hlcolor}
+\setlength{\fboxsep}{0.05ex}
+\setlength{\OuterFrameSep}{-\fboxsep}
%spacing
\usepackage{setspace}
@@ -241,13 +263,18 @@
\subsubsection*{#2}%
}
+\ifbool{iswhitepaper}{
+ \titleformat{\section}[runin]{\bfseries}{\uline{\thesection.~}}{0ex}{\uline{#1}}[:]
+}{
+ \usepackage[auto]{chappg}
+}
+
\ifbool{issectioncompact}{
\titleformat{\section}[runin]{\bfseries}{\uline{\thesection.~}}{0ex}{\uline{#1}}[.]
\titlespacing*{\section}{0pt}{*0.0}{*0.5}
}{}
%page numbering
-\usepackage[auto]{chappg}
%header/footer
\usepackage{fancyhdr}
@@ -262,6 +289,12 @@
\rfoot{\small\thepage}
}{}
+\ifbool{iswhitepaper}{
+ \lfoot{}
+ \rfoot{}
+ \cfoot{\small\thepage}
+}{}
+
%lists
\usepackage{paralist}
\usepackage{enumitem}
@@ -314,10 +347,17 @@
\renewcommand{\bibfont}{\footnotesize}
\ExecuteBibliographyOptions{maxbibnames=1,minbibnames=1}
+
\DeclareFieldFormat[article]{title}{}
\DeclareFieldFormat[article]{pages}{}
\DeclareFieldFormat[article]{volume}{}
\DeclareFieldFormat[article]{number}{}
+
+ \DeclareFieldFormat[inproceedings]{title}{}
+ \DeclareFieldFormat[inproceedings]{pages}{}
+ \DeclareFieldFormat[inproceedings]{volume}{}
+ \DeclareFieldFormat[inproceedings]{number}{}
+
\DeclareFieldFormat[online]{url}{}
\DeclareFieldFormat[online]{urldate}{}
@@ -474,6 +514,8 @@
\newcommand{\PoEmail}{}
\newcommand{\PoPhone}{}
+\newcommand{\FundingIdTitle}{\FundingId\ifdefempty{\FundingTitle}{}{: \FundingTitle}}
+
\newcommand{\makecoverpage}{
{\LARGE\bfseries
@@ -483,7 +525,7 @@
\vskip1ex
\uline{Funding opportunity}
\\\FundingAgency
- \\{\FundingTitle} (\href{\FundingUrl}{\FundingId})
+ \\\FundingIdTitle (\href{\FundingUrl}{\FundingId})
\\\FundingDeadline
\uline{Applicant}
@@ -503,12 +545,36 @@
\\\PoPhone
}
+\newcommand{\AbstractName}{Abstract}
+\newcommand{\AbstractOtherPersonnelName}{Other key personnel and primary subcontractors}
+\providetoggle{AbstractIsCentered}
+\providetoggle{AbstractShowAdminPOC}
+\providetoggle{AbstractShowLeadOrg}
+\providetoggle{AbstractShowOtherPersonnel}
+\providetoggle{AbstractShowDuration}
+\providetoggle{AbstractShowCost}
+\settoggle{AbstractIsCentered}{false}
+\settoggle{AbstractShowAdminPOC}{true}
+\settoggle{AbstractShowLeadOrg}{true}
+\settoggle{AbstractShowOtherPersonnel}{true}
+\settoggle{AbstractShowDuration}{true}
+\settoggle{AbstractShowCost}{true}
+
+
\newcommand{\makeabstractcoverpage}{
- \begin{center}\LARGE\textbf{
- ABSTRACT\\[0.5ex]
- \FundingId: \FundingTitle\\[0.5ex]
- \ProposalTitle
+ {\setlength{\parskip}{12pt}
+
+ \iftoggle{AbstractIsCentered}{
+ \centering
+ }{}
+
+ \begin{center}\textbf{
+ \LARGE{\MakeUppercase{\AbstractName}}\\[18pt]
+ \LARGE{\FundingId}\\
+ \large{\FundingTitle}\\[18pt]
+ \LARGE{\ProposalTitle}
}\end{center}
+ \vskip-8pt
\textbf{Technical point of contact: \PiName}\\
\PiTitle\\
@@ -517,25 +583,32 @@
\PiAddress\\
Tel: \PiPhone, Fax: \PiFax, Email: \href{mailto:\PiEmail}{\PiEmail}, Web: \href{http://www.\PiUrl}{\PiUrl}
+ \iftoggle{AbstractShowAdminPOC}{
\textbf{Administrative point of contact: \AdminName}\\
\AdminTitle\\
\AdminAddress\\
\AdminInstitution\\
Tel: \AdminPhone, Fax: \AdminFax, Email: \href{mailto:\AdminEmail}{\AdminEmail}
+ }{}
+ \iftoggle{AbstractShowLeadOrg}{
\textbf{Lead organization: \LeadOrganizationName}\\
\LeadOrganizationAddress\\
DUNS number: \LeadOrganizationDUNS\\
Taxpayer identification number: \LeadOrganizationTIN\\
CAGE code: \LeadOrganizationCAGE
+ }{}
- \textbf{Other key personnel and primary subcontractors}\\
+ \iftoggle{AbstractShowOtherPersonnel}{
+ \textbf{\AbstractOtherPersonnelName}\\
\OtherKeyPersonnel
+ }{}
- \textbf{Duration: {\ProposalDurationInYears} years}
+ \iftoggle{AbstractShowDuration}{\textbf{Duration: {\ProposalDurationInYears} years}}{}
- \textbf{Estimated cost: \${\ProposalCostInMillions} million in total costs}
+ \iftoggle{AbstractShowCost}{\textbf{Estimated cost: \${\ProposalCostInMillions} million in total costs}}{}
+ }
\clearpage
}
@@ -544,18 +617,88 @@
%</grant>
% \end{macrocode}
+% \begin{macrocode}
+%<*grant-afosr>
+% \end{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesClass{grant-afosr}[2019/02/26 AFOSR class]
+
+\newcommand{\draftstatus}{isnotdraft}
+\DeclareOption{isdraft}{\renewcommand{\draftstatus}{isdraft}}
+\DeclareOption{isnotdraft}{\renewcommand{\draftstatus}{isnotdraft}}
+
+\newcommand{\whitepaperstatus}{isnotwhitepaper}
+\DeclareOption{iswhitepaper}{\renewcommand{\whitepaperstatus}{iswhitepaper}}
+\DeclareOption{isnotwhitepaper}{\renewcommand{\whitepaperstatus}{isnotwhitepaper}}
+
+\newcommand{\sectioncompactstatus}{isnotsectioncompact}
+\DeclareOption{issectioncompact}{\renewcommand{\sectioncompactstatus}{issectioncompact}}
+\DeclareOption{isnotsectioncompact}{\renewcommand{\sectioncompactstatus}{isnotsectioncompact}}
+
+\newcommand{\bibcompactstatus}{isnotbibcompact}
+\DeclareOption{isbibcompact}{\renewcommand{\bibcompactstatus}{isbibcompact}}
+\DeclareOption{isnotbibcompact}{\renewcommand{\bibcompactstatus}{isnotbibcompact}}
+
+\ExecuteOptions{isdraft, isnotdraft, iswhitepaper, isnotwhitepaper, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
+\ProcessOptions
+
+\LoadClass[12pt, \draftstatus, \whitepaperstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
+
+%%%%%%%%%%%%%%%%%%%%%%
+%% formatting
+%%%%%%%%%%%%%%%%%%%%%%
+
+%geometry
+\geometry{margin=1in}
+
+%font
+\usepackage{times}
+\renewcommand{\familydefault}{\rmdefault}
+
+%paragraph skip
+\setlength{\parskip}{4pt}
+
+%%%%%%%%%%%%%%%%%%%%%%
+%% abstract
+%%%%%%%%%%%%%%%%%%%%%%
+\renewcommand{\AbstractName}{White paper}
+\settoggle{AbstractIsCentered}{true}
+\settoggle{AbstractShowAdminPOC}{false}
+\settoggle{AbstractShowLeadOrg}{false}
+\settoggle{AbstractShowOtherPersonnel}{false}
+\settoggle{AbstractShowDuration}{false}
+\settoggle{AbstractShowCost}{false}
+
+\ifbool{iswhitepaper}{
+ \titleformat{\section}[block]{\bfseries}{\uline{\thesection.~}}{0ex}{\uline{#1}}[]
+ \titleformat{\subsection}[runin]{\bfseries}{\thesubsection.~}{0ex}{#1}[.]
+ \titleformat{\subsubsection}[runin]{}{\uline{\thesubsubsection.~}}{0ex}{\uline{#1}}[.]
+
+ \titlespacing*{\section}{0pt}{*0.0}{*-1}
+
+ \renewcommand{\bibfont}{\normalsize}
+}{}
+
% \begin{macrocode}
-%<*grant-arl>
+%</grant-afosr>
% \end{macrocode}
+
+% \begin{macrocode}
+%<*grant-aro>
+% \end{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{grant-arl}[2016/01/19 ARL class]
+\ProvidesClass{grant-aro}[2019/02/26 ARO class]
\newcommand{\draftstatus}{isnotdraft}
\DeclareOption{isdraft}{\renewcommand{\draftstatus}{isdraft}}
\DeclareOption{isnotdraft}{\renewcommand{\draftstatus}{isnotdraft}}
+\newcommand{\whitepaperstatus}{isnotwhitepaper}
+\DeclareOption{iswhitepaper}{\renewcommand{\whitepaperstatus}{iswhitepaper}}
+\DeclareOption{isnotwhitepaper}{\renewcommand{\whitepaperstatus}{isnotwhitepaper}}
+
\newcommand{\sectioncompactstatus}{isnotsectioncompact}
\DeclareOption{issectioncompact}{\renewcommand{\sectioncompactstatus}{issectioncompact}}
\DeclareOption{isnotsectioncompact}{\renewcommand{\sectioncompactstatus}{isnotsectioncompact}}
@@ -564,10 +707,10 @@
\DeclareOption{isbibcompact}{\renewcommand{\bibcompactstatus}{isbibcompact}}
\DeclareOption{isnotbibcompact}{\renewcommand{\bibcompactstatus}{isnotbibcompact}}
-\ExecuteOptions{isdraft, isnotdraft, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
+\ExecuteOptions{isdraft, isnotdraft, iswhitepaper, isnotwhitepaper, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
\ProcessOptions
-\LoadClass[12pt, \draftstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
+\LoadClass[12pt, \draftstatus, \whitepaperstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
%%%%%%%%%%%%%%%%%%%%%%
%% formatting
@@ -583,8 +726,30 @@
%paragraph skip
\setlength{\parskip}{4pt}
+%%%%%%%%%%%%%%%%%%%%%%
+%% abstract
+%%%%%%%%%%%%%%%%%%%%%%
+\renewcommand{\AbstractName}{White paper}
+\settoggle{AbstractIsCentered}{true}
+\settoggle{AbstractShowAdminPOC}{true}
+\settoggle{AbstractShowLeadOrg}{true}
+\settoggle{AbstractShowOtherPersonnel}{true}
+\settoggle{AbstractShowDuration}{false}
+\settoggle{AbstractShowCost}{false}
+
+\ifbool{iswhitepaper}{
+ \titleformat{\section}[block]{\bfseries}{\uline{\thesection.~}}{0ex}{\uline{#1}}[]
+ \titleformat{\subsection}[runin]{\bfseries}{\thesubsection.~}{0ex}{#1}[.]
+ \titleformat{\subsubsection}[runin]{}{\uline{\thesubsubsection.~}}{0ex}{\uline{#1}}[.]
+
+ \titlespacing*{\section}{0pt}{*0.0}{*-1}
+
+ \renewcommand{\bibfont}{\normalsize}
+}{}
+
+
% \begin{macrocode}
-%</grant-arl>
+%</grant-aro>
% \end{macrocode}
@@ -592,12 +757,16 @@
%<*grant-darpa>
% \end{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{grant-darpa}[2016/01/12 DARPA class]
+\ProvidesClass{grant-darpa}[2019/02/26 DARPA class]
\newcommand{\draftstatus}{isnotdraft}
\DeclareOption{isdraft}{\renewcommand{\draftstatus}{isdraft}}
\DeclareOption{isnotdraft}{\renewcommand{\draftstatus}{isnotdraft}}
+\newcommand{\whitepaperstatus}{isnotwhitepaper}
+\DeclareOption{iswhitepaper}{\renewcommand{\whitepaperstatus}{iswhitepaper}}
+\DeclareOption{isnotwhitepaper}{\renewcommand{\whitepaperstatus}{isnotwhitepaper}}
+
\newcommand{\sectioncompactstatus}{isnotsectioncompact}
\DeclareOption{issectioncompact}{\renewcommand{\sectioncompactstatus}{issectioncompact}}
\DeclareOption{isnotsectioncompact}{\renewcommand{\sectioncompactstatus}{isnotsectioncompact}}
@@ -606,10 +775,10 @@
\DeclareOption{isbibcompact}{\renewcommand{\bibcompactstatus}{isbibcompact}}
\DeclareOption{isnotbibcompact}{\renewcommand{\bibcompactstatus}{isnotbibcompact}}
-\ExecuteOptions{isdraft, isnotdraft, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
+\ExecuteOptions{isdraft, isnotdraft, iswhitepaper, isnotwhitepaper, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
\ProcessOptions
-\LoadClass[12pt, \draftstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
+\LoadClass[12pt, \draftstatus, \whitepaperstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
%%%%%%%%%%%%%%%%%%%%%%
%% formatting
@@ -633,12 +802,16 @@
%<*grant-doe>
% \end{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{grant-doe}[2016/01/12 DOE class]
+\ProvidesClass{grant-doe}[2019/02/26 DOE class]
\newcommand{\draftstatus}{isnotdraft}
\DeclareOption{isdraft}{\renewcommand{\draftstatus}{isdraft}}
\DeclareOption{isnotdraft}{\renewcommand{\draftstatus}{isnotdraft}}
+\newcommand{\whitepaperstatus}{isnotwhitepaper}
+\DeclareOption{iswhitepaper}{\renewcommand{\whitepaperstatus}{iswhitepaper}}
+\DeclareOption{isnotwhitepaper}{\renewcommand{\whitepaperstatus}{isnotwhitepaper}}
+
\newcommand{\sectioncompactstatus}{isnotsectioncompact}
\DeclareOption{issectioncompact}{\renewcommand{\sectioncompactstatus}{issectioncompact}}
\DeclareOption{isnotsectioncompact}{\renewcommand{\sectioncompactstatus}{isnotsectioncompact}}
@@ -647,10 +820,10 @@
\DeclareOption{isbibcompact}{\renewcommand{\bibcompactstatus}{isbibcompact}}
\DeclareOption{isnotbibcompact}{\renewcommand{\bibcompactstatus}{isnotbibcompact}}
-\ExecuteOptions{isdraft, isnotdraft, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
+\ExecuteOptions{isdraft, isnotdraft, iswhitepaper, isnotwhitepaper, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
\ProcessOptions
-\LoadClass[\draftstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
+\LoadClass[11pt, \draftstatus, \whitepaperstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
%%%%%%%%%%%%%%%%%%%%%%
%% formatting
@@ -658,6 +831,26 @@
%geometry
\geometry{margin=1in}
+
+%font
+\usepackage{times}
+\renewcommand{\familydefault}{\rmdefault}
+
+%%%%%%%%%%%%%%%%%%%%%
+%% cover page
+%%%%%%%%%%%%%%%%%%%%%
+\renewcommand{\makeabstractcoverpage}{
+ \titlespacing*{\chapter}{0pt}{-4.4ex}{*-1}
+ {\centering
+ \chapter*{\centerline{\ProposalTitle}}
+ \PiName, \PiTitle\\
+ \PiDepartment, \PiInstitution\\
+ \PiPhone, \href{mailto:\PiEmail}{\PiEmail}, \href{http://www.\PiUrl}{\PiUrl}\\
+ DOE/Office of Science Program Office\\
+ Funding Opportunity Announcement Number: \FundingId\\
+ }
+}
+
% \begin{macrocode}
%</grant-doe>
% \end{macrocode}
@@ -667,12 +860,16 @@
%<*grant-nih>
% \end{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{grant-nih}[2016/01/12 NIH class]
+\ProvidesClass{grant-nih}[2019/02/26 NIH class]
\newcommand{\draftstatus}{isnotdraft}
\DeclareOption{isdraft}{\renewcommand{\draftstatus}{isdraft}}
\DeclareOption{isnotdraft}{\renewcommand{\draftstatus}{isnotdraft}}
+\newcommand{\whitepaperstatus}{isnotwhitepaper}
+\DeclareOption{iswhitepaper}{\renewcommand{\whitepaperstatus}{iswhitepaper}}
+\DeclareOption{isnotwhitepaper}{\renewcommand{\whitepaperstatus}{isnotwhitepaper}}
+
\newcommand{\sectioncompactstatus}{isnotsectioncompact}
\DeclareOption{issectioncompact}{\renewcommand{\sectioncompactstatus}{issectioncompact}}
\DeclareOption{isnotsectioncompact}{\renewcommand{\sectioncompactstatus}{isnotsectioncompact}}
@@ -681,10 +878,10 @@
\DeclareOption{isbibcompact}{\renewcommand{\bibcompactstatus}{isbibcompact}}
\DeclareOption{isnotbibcompact}{\renewcommand{\bibcompactstatus}{isnotbibcompact}}
-\ExecuteOptions{isdraft, isnotdraft, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
+\ExecuteOptions{isdraft, isnotdraft, iswhitepaper, isnotwhitepaper, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
\ProcessOptions
-\LoadClass[\draftstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
+\LoadClass[\draftstatus, \whitepaperstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
%%%%%%%%%%%%%%%%%%%%%%
%% formatting
@@ -702,12 +899,16 @@
%<*grant-nrl>
% \end{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{grant-nrl}[2016/01/19 NRL class]
+\ProvidesClass{grant-nrl}[2019/02/26 NRL class]
\newcommand{\draftstatus}{isnotdraft}
\DeclareOption{isdraft}{\renewcommand{\draftstatus}{isdraft}}
\DeclareOption{isnotdraft}{\renewcommand{\draftstatus}{isnotdraft}}
+\newcommand{\whitepaperstatus}{isnotwhitepaper}
+\DeclareOption{iswhitepaper}{\renewcommand{\whitepaperstatus}{iswhitepaper}}
+\DeclareOption{isnotwhitepaper}{\renewcommand{\whitepaperstatus}{isnotwhitepaper}}
+
\newcommand{\sectioncompactstatus}{isnotsectioncompact}
\DeclareOption{issectioncompact}{\renewcommand{\sectioncompactstatus}{issectioncompact}}
\DeclareOption{isnotsectioncompact}{\renewcommand{\sectioncompactstatus}{isnotsectioncompact}}
@@ -716,10 +917,10 @@
\DeclareOption{isbibcompact}{\renewcommand{\bibcompactstatus}{isbibcompact}}
\DeclareOption{isnotbibcompact}{\renewcommand{\bibcompactstatus}{isnotbibcompact}}
-\ExecuteOptions{isdraft, isnotdraft, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
+\ExecuteOptions{isdraft, isnotdraft, iswhitepaper, isnotwhitepaper, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
\ProcessOptions
-\LoadClass[12pt, \draftstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
+\LoadClass[12pt, \draftstatus, \whitepaperstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
%%%%%%%%%%%%%%%%%%%%%%
%% formatting
@@ -743,12 +944,16 @@
%<*grant-nsf>
% \end{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{grant-nsf}[2016/01/12 NSF class]
+\ProvidesClass{grant-nsf}[2019/02/26 NSF class]
\newcommand{\draftstatus}{isnotdraft}
\DeclareOption{isdraft}{\renewcommand{\draftstatus}{isdraft}}
\DeclareOption{isnotdraft}{\renewcommand{\draftstatus}{isnotdraft}}
+\newcommand{\whitepaperstatus}{isnotwhitepaper}
+\DeclareOption{iswhitepaper}{\renewcommand{\whitepaperstatus}{iswhitepaper}}
+\DeclareOption{isnotwhitepaper}{\renewcommand{\whitepaperstatus}{isnotwhitepaper}}
+
\newcommand{\sectioncompactstatus}{isnotsectioncompact}
\DeclareOption{issectioncompact}{\renewcommand{\sectioncompactstatus}{issectioncompact}}
\DeclareOption{isnotsectioncompact}{\renewcommand{\sectioncompactstatus}{isnotsectioncompact}}
@@ -757,10 +962,10 @@
\DeclareOption{isbibcompact}{\renewcommand{\bibcompactstatus}{isbibcompact}}
\DeclareOption{isnotbibcompact}{\renewcommand{\bibcompactstatus}{isnotbibcompact}}
-\ExecuteOptions{isdraft, isnotdraft, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
+\ExecuteOptions{isdraft, isnotdraft, iswhitepaper, isnotwhitepaper, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
\ProcessOptions
-\LoadClass[10pt, \draftstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
+\LoadClass[10pt, \draftstatus, \whitepaperstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
%%%%%%%%%%%%%%%%%%%%%%
%% formatting
@@ -777,12 +982,16 @@
%<*grant-onr>
% \end{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{grant-onr}[2016/01/19 ONR class]
+\ProvidesClass{grant-onr}[2019/02/26 ONR class]
\newcommand{\draftstatus}{isnotdraft}
\DeclareOption{isdraft}{\renewcommand{\draftstatus}{isdraft}}
\DeclareOption{isnotdraft}{\renewcommand{\draftstatus}{isnotdraft}}
+\newcommand{\whitepaperstatus}{isnotwhitepaper}
+\DeclareOption{iswhitepaper}{\renewcommand{\whitepaperstatus}{iswhitepaper}}
+\DeclareOption{isnotwhitepaper}{\renewcommand{\whitepaperstatus}{isnotwhitepaper}}
+
\newcommand{\sectioncompactstatus}{isnotsectioncompact}
\DeclareOption{issectioncompact}{\renewcommand{\sectioncompactstatus}{issectioncompact}}
\DeclareOption{isnotsectioncompact}{\renewcommand{\sectioncompactstatus}{isnotsectioncompact}}
@@ -791,10 +1000,10 @@
\DeclareOption{isbibcompact}{\renewcommand{\bibcompactstatus}{isbibcompact}}
\DeclareOption{isnotbibcompact}{\renewcommand{\bibcompactstatus}{isnotbibcompact}}
-\ExecuteOptions{isdraft, isnotdraft, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
+\ExecuteOptions{isdraft, isnotdraft, iswhitepaper, isnotwhitepaper, issectioncompact, isnotsectioncompact, isbibcompact, isnotbibcompact}
\ProcessOptions
-\LoadClass[12pt, \draftstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
+\LoadClass[12pt, \draftstatus, \whitepaperstatus, \sectioncompactstatus, \bibcompactstatus]{grant}
%%%%%%%%%%%%%%%%%%%%%%
%% formatting
@@ -809,6 +1018,29 @@
%paragraph skip
\setlength{\parskip}{4pt}
+
+%%%%%%%%%%%%%%%%%%%%%%
+%% abstract
+%%%%%%%%%%%%%%%%%%%%%%
+\renewcommand{\AbstractName}{White paper}
+\settoggle{AbstractIsCentered}{true}
+\settoggle{AbstractShowAdminPOC}{false}
+\settoggle{AbstractShowLeadOrg}{false}
+\settoggle{AbstractShowOtherPersonnel}{false}
+\settoggle{AbstractShowDuration}{false}
+\settoggle{AbstractShowCost}{false}
+
+\ifbool{iswhitepaper}{
+ \titleformat{\section}[block]{\bfseries}{\uline{\thesection.~}}{0ex}{\uline{#1}}[]
+ \titleformat{\subsection}[runin]{\bfseries}{\thesubsection.~}{0ex}{#1}[.]
+ \titleformat{\subsubsection}[runin]{}{\uline{\thesubsubsection.~}}{0ex}{\uline{#1}}[.]
+
+ \titlespacing*{\section}{0pt}{*0.0}{*-1}
+
+ \renewcommand{\bibfont}{\normalsize}
+}{}
+
+
% \begin{macrocode}
%</grant-onr>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/grant/grant.ins b/Master/texmf-dist/source/latex/grant/grant.ins
index 74f5035994a..a726dbff3a7 100644
--- a/Master/texmf-dist/source/latex/grant/grant.ins
+++ b/Master/texmf-dist/source/latex/grant/grant.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2016 Jonathan Karr <karr@mssm.edu>
+%% Copyright (C) 2016-2019 Jonathan Karr <karr@mssm.edu>
%%
%% This file may be distributed and/or modified under the conditions of
%% the MIT License. The latest version of this license is in:
@@ -16,7 +16,7 @@
This is a generated file.
-Copyright (C) 2016 Jonathan Karr <karr@mssm.edu>
+Copyright (C) 2016-2019 Jonathan Karr <karr@mssm.edu>
This file may be distributed and/or modified under the conditions of
the MIT License. The latest version of this license is in:
@@ -26,13 +26,14 @@ the MIT License. The latest version of this license is in:
\endpreamble
\generate{\file{grant.cls}{\from{grant.dtx}{grant}}}
-\generate{\file{grant-arl.cls}{\from{grant.dtx}{arl}}}
-\generate{\file{grant-darpa.cls}{\from{grant.dtx}{darpa}}}
-\generate{\file{grant-doe.cls}{\from{grant.dtx}{doe}}}
-\generate{\file{grant-nih.cls}{\from{grant.dtx}{nih}}}
-\generate{\file{grant-nrl.cls}{\from{grant.dtx}{nrl}}}
-\generate{\file{grant-nsf.cls}{\from{grant.dtx}{nsf}}}
-\generate{\file{grant-onr.cls}{\from{grant.dtx}{onr}}}
+\generate{\file{grant-afosr.cls}{\from{grant.dtx}{grant-afosr}}}
+\generate{\file{grant-aro.cls}{\from{grant.dtx}{grant-aro}}}
+\generate{\file{grant-darpa.cls}{\from{grant.dtx}{grant-darpa}}}
+\generate{\file{grant-doe.cls}{\from{grant.dtx}{grant-doe}}}
+\generate{\file{grant-nih.cls}{\from{grant.dtx}{grant-nih}}}
+\generate{\file{grant-nrl.cls}{\from{grant.dtx}{grant-nrl}}}
+\generate{\file{grant-nsf.cls}{\from{grant.dtx}{grant-nsf}}}
+\generate{\file{grant-onr.cls}{\from{grant.dtx}{grant-onr}}}
\obeyspaces
\Msg{*************************************************************}
@@ -41,7 +42,8 @@ the MIT License. The latest version of this license is in:
\Msg{* files into a directory searched by TeX: *}
\Msg{* *}
\Msg{* grant.cls *}
-\Msg{* grant-arl.cls *}
+\Msg{* grant-afosr.cls *}
+\Msg{* grant-aro.cls *}
\Msg{* grant-darpa.cls *}
\Msg{* grant-doe.cls *}
\Msg{* grant-nih.cls *}
diff --git a/Master/texmf-dist/source/latex/graphics/color.dtx b/Master/texmf-dist/source/latex/graphics/color.dtx
index ad5df89a7ee..cdc2dbe5fed 100644
--- a/Master/texmf-dist/source/latex/graphics/color.dtx
+++ b/Master/texmf-dist/source/latex/graphics/color.dtx
@@ -19,7 +19,7 @@
%<driver> \ProvidesFile{color.drv}
% \fi
% \ProvidesFile{color.dtx}
- [2019/11/23 v1.2a Standard LaTeX Color (DPC)]
+ [2020/02/24 v1.2b Standard LaTeX Color (DPC)]
%
% \iffalse
%<*driver>
@@ -558,6 +558,8 @@
% {usenames option added}
% \changes{v0.3f}{1994/10/04}
% {Give info about redefinitions}
+% \changes{v1.2b}{2020/02/24}
+% {corrected test, see https://www.latex-project.org/cgi-bin/ltxbugs2html?pr=graphics/3635}
%
% Driver files may opt to define a `named' colour model.
% Placing colour names rather than numeric specifications into the dvi
@@ -603,7 +605,7 @@
{\c@lor@error{model `#1'}}%
{\@ifundefined{color@#3}%
{\c@lor@error{model `#3'}}%
- {\@ifundefined{c@lor@#1@#2}{}%
+ {\@ifundefined{col@#2}{}%
{\PackageInfo{color}{Redefining color #2 in named color model}}%
\csname color@#3\endcsname\@tempa{#4}%
\csname define@color@#1\endcsname{#2}\@tempa
diff --git a/Master/texmf-dist/source/latex/graphics/graphics.dtx b/Master/texmf-dist/source/latex/graphics/graphics.dtx
index b88ef1e0666..51ef9a4ee39 100644
--- a/Master/texmf-dist/source/latex/graphics/graphics.dtx
+++ b/Master/texmf-dist/source/latex/graphics/graphics.dtx
@@ -25,7 +25,7 @@
%<driver> \ProvidesFile{graphics.drv}
% \fi
% \ProvidesFile{graphics.dtx}
- [2019/11/30 v1.4a Standard LaTeX Graphics (DPC,SPQR)]
+ [2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR)]
%
% \iffalse
%<*driver>
@@ -1134,30 +1134,40 @@
\else
\Gin@getbase{\Gin@sepdefault\filename@ext}%
% \end{macrocode}
-% At this point try adding an extension, even if the filename has one so
-% that \verb|a.b| may find \verb|a.b.png| if no file is found then revert
-% to the extension as given to get better error reporting.
+% At this point try adding an extension, either if the given file name
+% has none, or if the extension matches no existing graphics inclusion
+% rule, so that \verb|a.b| may find \verb|a.b.png|, if only the latter
+% or if both files exist. If no file is found then revert to the
+% extension as given to get better error reporting.
%
% \changes{v1.3d}{2019/11/01}
-% {Try adding an extension even if the filenam had a dot.}
-% \begin{macrocode}
-\ifx\Gin@ext\relax
-\let\Gin@savedbase\filename@base
-\let\Gin@savedext\filename@ext
- \edef\filename@base{\filename@base\Gin@sepdefault\filename@ext}%
- \let\filename@ext\relax
- \@for\Gin@temp:=\Gin@extensions\do{%
- \ifx\Gin@ext\relax
- \Gin@getbase\Gin@temp
- \fi}%
-% \end{macrocode}
-% Restore if no file found using theknown extensions.
+% {Try adding an extension even if the filename had a dot.}
+% \changes{v1.4c}{2020/08/30}
+% {Try adding an extension even if the filename had a dot AND
+% if the filename without the extension exists (but doesn't have
+% a known extension).}
+% \begin{macrocode}
+ \ifnum0%
+ \ifx\Gin@ext\relax 1%
+ \else \@ifundefined{Gin@rule@\Gin@ext}{1}{0}%
+ \fi >0
+ \let\Gin@ext\relax
+ \let\Gin@savedbase\filename@base
+ \let\Gin@savedext\filename@ext
+ \edef\filename@base{\filename@base\Gin@sepdefault\filename@ext}%
+ \let\filename@ext\relax
+ \@for\Gin@temp:=\Gin@extensions\do{%
+ \ifx\Gin@ext\relax
+ \Gin@getbase\Gin@temp
+ \fi}%
+% \end{macrocode}
+% Restore if no file found using the known extensions.
% \begin{macrocode}
- \ifx\Gin@ext\relax
- \let\filename@base\Gin@savedbase
- \let\filename@ext\Gin@savedext
- \fi
-\fi
+ \ifx\Gin@ext\relax
+ \let\filename@base\Gin@savedbase
+ \let\filename@ext\Gin@savedext
+ \fi
+ \fi
% \end{macrocode}
%
% \begin{macrocode}
@@ -1428,7 +1438,7 @@
% starting with |%%BoundingBox| and returns the result
% by setting four dimension registers
% |\Gin@llx|, |\Gin@lly|, |\Gin@urx| and |\Gin@ury|.
-% \changes{v0.5e}{1994/1l/02}
+% \changes{v0.5e}{1994/11/02}
% {Fix the catcodes of \cs{endlinechar} and ctrl-D}
% \changes{v0.7a}{1995/04/11}
% {Fix more catcodes, for binary headers of eps files}
@@ -1474,9 +1484,12 @@
% {Allow TAB in DSC comments graphics/2587}
% \changes{v1.0i}{1999/01/07}
% {Fix catcode of hyphen. graphics/2846}
+% \changes{v1.4b}{2020/08/09}
+% {Normalise \cs{endlinechar} gh/286}
% \begin{macrocode}
\catcode`\ 10 %
\catcode`\^^I10 %
+ \endlinechar13 %
\catcode\endlinechar5 %
\@makeother\:%
\@makeother\-%
@@ -1574,6 +1587,7 @@
\fi}
% \end{macrocode}
% \end{macro}
+%
% \begin{macro}{\Gread@parse@bb}
% We have |%%BoundingBox| and what follows is not `(atend)' so we
% will parse the rest of the line as a BB with four elements.
@@ -1596,6 +1610,68 @@
% \end{macrocode}
% \end{macro}
%
+% Viewport and trim, originally in |graphicx|.
+%
+% \begin{macro}{\Gin@viewport}
+% \changes{v1.0c}{1996/10/31}{Original bb saved}
+% If a viewport is specified, reset the bounding box coordinates
+% by adding the original origin, |\Gin@llx|, |\Gin@lly| to the new
+% values specified as the viewport. The original Bounding box
+% coordinates are saved in |\Gin@ollx|\ldots\ some drivers
+% might need this information (currently just |tcidvi|).
+% \begin{macrocode}
+\def\Gin@viewport{%
+ \let\Gin@ollx\Gin@llx
+ \let\Gin@olly\Gin@lly
+ \let\Gin@ourx\Gin@urx
+ \let\Gin@oury\Gin@ury
+ \dimen@\Gin@llx\p@\advance\dimen@ \Gin@vurx\p@
+ \edef\Gin@urx{\strip@pt\dimen@}%
+ \dimen@\Gin@lly\p@\advance\dimen@ \Gin@vury\p@
+ \edef\Gin@ury{\strip@pt\dimen@}%
+ \dimen@\Gin@llx\p@\advance\dimen@ \Gin@vllx\p@
+ \edef\Gin@llx{\strip@pt\dimen@}%
+ \dimen@\Gin@lly\p@\advance\dimen@ \Gin@vlly\p@
+ \edef\Gin@lly{\strip@pt\dimen@}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Gin@trim}
+% \changes{v1.0c}{1996/10/31}{Original bb saved}
+% If a trim is specified, reset the bounding box coordinates
+% by trimming the four specified values off each side of the
+% graphic.
+% \begin{macrocode}
+\def\Gin@trim{%
+ \let\Gin@ollx\Gin@llx
+ \let\Gin@olly\Gin@lly
+ \let\Gin@ourx\Gin@urx
+ \let\Gin@oury\Gin@ury
+ \dimen@\Gin@llx\p@\advance\dimen@ \Gin@vllx\p@
+ \edef\Gin@llx{\strip@pt\dimen@}%
+ \dimen@\Gin@lly\p@\advance\dimen@ \Gin@vlly\p@
+ \edef\Gin@lly{\strip@pt\dimen@}%
+ \dimen@\Gin@urx\p@\advance\dimen@ -\Gin@vurx\p@
+ \edef\Gin@urx{\strip@pt\dimen@}%
+ \dimen@\Gin@ury\p@\advance\dimen@ -\Gin@vury\p@
+ \edef\Gin@ury{\strip@pt\dimen@}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Gin@vllx}
+% \begin{macro}{\Gin@vlly}
+% \begin{macro}{\Gin@vurx}
+% \begin{macro}{\Gin@vury}
+% Four macros to hold the modifiers for the bounding box for viewport
+% and trim specifications.
+% \begin{macrocode}
+\let\Gin@vllx\Gin@llx\let\Gin@vlly\Gin@llx
+\let\Gin@vurx\Gin@llx\let\Gin@vury\Gin@llx
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \subsection{Rotation}
%
diff --git a/Master/texmf-dist/source/latex/graphics/graphicx.dtx b/Master/texmf-dist/source/latex/graphics/graphicx.dtx
index 3cf15925d3f..b10c67c7946 100644
--- a/Master/texmf-dist/source/latex/graphics/graphicx.dtx
+++ b/Master/texmf-dist/source/latex/graphics/graphicx.dtx
@@ -17,7 +17,7 @@
%<driver> \ProvidesFile{graphicx.drv}
% \fi
% \ProvidesFile{graphicx.dtx}
- [2019/11/30 v1.2a Enhanced LaTeX Graphics (DPC,SPQR)]
+ [2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR)]
%
% \iffalse
%<*driver>
@@ -342,66 +342,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\Gin@viewport}
-% \changes{v1.0c}{1996/10/31}{Original bb saved}
-% If a viewport is specified, reset the bounding box coordinates
-% by adding the original origin, |\Gin@llx|, |\Gin@lly| to the new
-% values specified as the viewport. The original Bounding box
-% coordinates are saved in |\Gin@ollx|\ldots\ some drivers
-% might need this information (currently just |tcidvi|).
-% \begin{macrocode}
-\def\Gin@viewport{%
- \let\Gin@ollx\Gin@llx
- \let\Gin@olly\Gin@lly
- \let\Gin@ourx\Gin@urx
- \let\Gin@oury\Gin@ury
- \dimen@\Gin@llx\p@\advance\dimen@ \Gin@vurx\p@
- \edef\Gin@urx{\strip@pt\dimen@}%
- \dimen@\Gin@lly\p@\advance\dimen@ \Gin@vury\p@
- \edef\Gin@ury{\strip@pt\dimen@}%
- \dimen@\Gin@llx\p@\advance\dimen@ \Gin@vllx\p@
- \edef\Gin@llx{\strip@pt\dimen@}%
- \dimen@\Gin@lly\p@\advance\dimen@ \Gin@vlly\p@
- \edef\Gin@lly{\strip@pt\dimen@}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\Gin@trim}
-% \changes{v1.0c}{1996/10/31}{Original bb saved}
-% If a trim is specified, reset the bounding box coordinates
-% by trimming the four specified values off each side of the
-% graphic.
-% \begin{macrocode}
-\def\Gin@trim{%
- \let\Gin@ollx\Gin@llx
- \let\Gin@olly\Gin@lly
- \let\Gin@ourx\Gin@urx
- \let\Gin@oury\Gin@ury
- \dimen@\Gin@llx\p@\advance\dimen@ \Gin@vllx\p@
- \edef\Gin@llx{\strip@pt\dimen@}%
- \dimen@\Gin@lly\p@\advance\dimen@ \Gin@vlly\p@
- \edef\Gin@lly{\strip@pt\dimen@}%
- \dimen@\Gin@urx\p@\advance\dimen@ -\Gin@vurx\p@
- \edef\Gin@urx{\strip@pt\dimen@}%
- \dimen@\Gin@ury\p@\advance\dimen@ -\Gin@vury\p@
- \edef\Gin@ury{\strip@pt\dimen@}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\Gin@vllx}
-% \begin{macro}{\Gin@vlly}
-% \begin{macro}{\Gin@vurx}
-% \begin{macro}{\Gin@vury}
-% Four macros to hold the modifiers for the bounding box for viewport
-% and trim specifications.
-% \begin{macrocode}
-\let\Gin@vllx\Gin@llx\let\Gin@vlly\Gin@llx
-\let\Gin@vurx\Gin@llx\let\Gin@vury\Gin@llx
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
%
% \begin{key}{Gin}{angle}
% Specify a rotation. This is just handled by wrapping the
diff --git a/Master/texmf-dist/source/latex/graphics/lscape.dtx b/Master/texmf-dist/source/latex/graphics/lscape.dtx
index e14462c9d42..ac5c16d7c20 100644
--- a/Master/texmf-dist/source/latex/graphics/lscape.dtx
+++ b/Master/texmf-dist/source/latex/graphics/lscape.dtx
@@ -17,7 +17,7 @@
%<driver> \ProvidesFile{lscape.drv}
% \fi
% \ProvidesFile{lscape.dtx}
- [2000/10/22 v3.01 Landscape Pages (DPC)]
+ [2020/05/28 v3.02 Landscape Pages (DPC)]
%
% \iffalse
%<*driver>
@@ -61,6 +61,7 @@
% \changes{v3.00}{1994/10/05}{Update using LaTeX2e graphics package}
% \changes{v3.01}{1999/06/22}{Added better pdfTeX support
% by Scott Pakin, from graphics/3063}
+% \changes{v3.02}{2020/05/28}{delay saving \cs{@makefcolumn} gh340}
%
%
% \begin{macrocode}
@@ -90,8 +91,6 @@
% \end{macrocode}
%
% \begin{macrocode}
-\let\LS@makecol=\@makecol
-\let\LS@makefcolumn=\@makefcolumn
\def\LS@rot{%
\setbox\@outputbox\vbox{\hbox{\rotatebox{90}{\box\@outputbox}}}}
% \end{macrocode}
@@ -99,6 +98,8 @@
% First set up the page size for landscape.
% \begin{macrocode}
\def\landscape{%
+ \let\LS@makecol=\@makecol
+ \let\LS@makefcolumn=\@makefcolumn
\clearpage
\begingroup
\vsize=\textwidth
diff --git a/Master/texmf-dist/source/latex/graphicx-psmin/graphicx-psmin.dtx b/Master/texmf-dist/source/latex/graphicx-psmin/graphicx-psmin.dtx
index ecd5f2f6683..1e09bf4fde6 100644
--- a/Master/texmf-dist/source/latex/graphicx-psmin/graphicx-psmin.dtx
+++ b/Master/texmf-dist/source/latex/graphicx-psmin/graphicx-psmin.dtx
@@ -15,9 +15,9 @@
% file into a directory searched by LaTeX:
% graphicx-psmin.sty
%
-%% ----------------------------------
-%% Copyright (C) 2005 Hendri Adriaens
-%% ----------------------------------
+%% ---------------------------------------
+%% Copyright (C) 2005-2020 Hendri Adriaens
+%% ---------------------------------------
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -68,7 +68,9 @@ The author is grateful to Thomas Greer and Uwe Kern for help and
suggestions. Many thanks to Akira Kakuto for providing a dvips patch
which makes this package possible. The author is greatly indebted to
Karl Berry for support and for providing a test environment for the
-dvips patch on the TUG server.
+dvips patch on the TUG server. Finally a word of thanks for David Carlisle
+for providing a fix to make the package work with the latest \pf{graphicx}
+package.
\PrintChangesX\PrintIndexX
\end{document}
%</driver>
@@ -78,7 +80,7 @@ dvips patch on the TUG server.
%
% \GetFileInfo{graphicx-psmin.sty}
%
-% \CheckSum{301}
+% \CheckSum{310}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -101,7 +103,7 @@ dvips patch on the TUG server.
%\texttt{/macros/latex/contrib/graphicx-psmin}. See \texttt{graphicx-psmin.dtx}
%for information on installing \pf{graphicx-psmin} into your \TeX\ or \LaTeX\
%distribution and for the license of this package.}}
-%\author{\mktitledecor Hendri Adriaens\\\url{http://stuwww.uvt.nl/~hendri}}
+%\author{\mktitledecor Hendri Adriaens}
%\date{\fileversion\ (\filedate)}
%\maketitle
%
@@ -277,7 +279,7 @@ dvips patch on the TUG server.
%<*graphicx-psmin>
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesPackage{graphicx-psmin}
- [2005/09/20 v1.1 single PostScript graphics inclusion (HA)]
+ [2020/11/14 v1.2 single PostScript graphics inclusion (HA)]
\DeclareOption*{\PassOptionsToPackage\CurrentOption{graphicx}}
\ProcessOptions\relax
\RequirePackage{graphicx}
@@ -475,6 +477,7 @@ dvips patch on the TUG server.
% \end{macrocode}
% \end{macro}
% \begin{macro}{\gxpsm@checkfile}
+% \changes{v1.2}{2020/11/14}{Changes to work with the latest \pf{graphicx} package}
% \marg{file}\marg{actions}\\
% This is part of \pf{graphics}' |\Ginclude@graphics| which checks a
% graphic file in the graphics path. We perform \meta{actions} when
@@ -483,7 +486,11 @@ dvips patch on the TUG server.
% \begin{macrocode}
\def\gxpsm@checkfile#1#2{%
\let\input@path\Ginput@path
- \filename@parse{#1}%
+ \ifx\unquote@name\@undefined
+ \filename@parse{#1}%
+ \else
+ \expandafter\filename@parse\expandafter{\detokenize{#1}}%
+ \fi
\ifx\filename@ext\relax
\@for\Gin@temp:=\Gin@extensions\do{%
\ifx\Gin@ext\relax
diff --git a/Master/texmf-dist/source/latex/graphpaper/graphpaper.dtx b/Master/texmf-dist/source/latex/graphpaper/graphpaper.dtx
new file mode 100644
index 00000000000..071f40b1de2
--- /dev/null
+++ b/Master/texmf-dist/source/latex/graphpaper/graphpaper.dtx
@@ -0,0 +1,1048 @@
+%\iffalse
+% !TEX encoding = UTF-8 Unicode
+% !TEX TS-program = pdflatex
+%<*internal>
+\begingroup
+%^^A Load the docstrip package (DO NOT USE \input{...})
+\input docstrip.tex
+\keepsilent
+%^^A\usedir{tex/latex/graphpaper}
+%^^A insert this text at the beginning of the generated file
+\preamble
+ ________________________________________
+ The graphpaper class for generating several types of graph paper
+ Copyright (C) 2020 C. Beccari & F. Biccari
+ All rights reserved
+
+ License information appended
+
+\endpreamble
+%^^A insert this text at the end of the generated file
+\postamble
+Copyright (C) 2020 Claudio Beccari & Francesco Biccari
+
+Distributable under the LaTeX Project Public License,
+version 1.3c or higher (your choice). The latest version of
+this license is at: http://www.latex-project.org/lppl.txt
+
+This work is "author-maintained".
+
+This work consists of this file graphpaper.dtx,
+and the derived files graphpaper.cls and graphpaper.pdf.
+
+\endpostamble
+%^^A
+%^^A DocStrip can silently overwrite an already existing cls file
+\askforoverwritefalse
+%^^A
+%^^A Generates the cls file from the dtx file, stripping out all
+%^^A the documentation. The option "class" tells to DocStrip to
+%^^A extract only the code marked with the "class" tag.
+\generate{\file{graphpaper.cls}{\from{graphpaper.dtx}{class}}}
+%
+\def\tmpa{plain}
+\ifx\tmpa\fmtname\endgroup\expandafter\bye\fi
+\endgroup
+%</internal>
+%\fi
+%^^A %
+%^^A ----------------------------------------------------------------------
+%^^A Here starts the second part
+%^^A ProvidesFile must be (more or less) the first command for a class dtx.
+%^^A It populates the variables \filename, \filedate, and \fileversion
+%^^A
+% \iffalse
+%<*driver>
+\ProvidesFile{graphpaper.dtx}
+%</driver>
+%<class>\NeedsTeXFormat{LaTeX2e}[2018-01-01]
+%<class>\ProvidesClass{graphpaper}%
+%<*class>
+ [2020-10-10 1.0 A LaTeX class to generate several types of graph papers]
+%</class>
+%<*driver>
+\documentclass[11pt,a4paper]{ltxdoc}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{lmodern,textcomp}
+\usepackage[a4paper,lines=50]{geometry}
+\usepackage{multicol}
+\hfuzz 10pt
+\let\originalmeta\meta
+\renewcommand\meta[1]{{\normalfont\originalmeta{#1}}}
+\renewcommand\marg[1]{\texttt{\{\meta{#1}\}}}
+\newcommand\Marg[1]{\texttt{\{#1\}}}
+\newcommand\opz[1]{\texttt{[\meta{#1}]}}
+\newcommand\Opz[1]{\texttt{[#1]}}
+\newcommand\amb[1]{\texttt{\slshape#1}}\let\env\amb
+\renewcommand\cs[1]{{\normalfont\ttfamily\char92#1}}
+\newcommand\Benv[1]{\texttt{\char92begin\{#1\}}}
+\newcommand\Eenv[1]{\texttt{\char92end\{#1\}}}
+\newcommand\eTeX{$\varepsilon$-\TeX}
+\providecommand\prog{}
+\renewcommand\prog[1]{\textsf{#1}}
+\newcommand\pack[1]{\texttt{\itshape#1}}
+\newcommand\class[1]{\texttt{#1}}
+%
+\newenvironment{ttsintassi}{\begin{lrbox}{0}
+\minipage{\dimexpr\linewidth-2\fboxrule-2\fboxsep}\ttfamily\obeylines}%
+{\endminipage\end{lrbox}\center\fbox{\box0}\endcenter}
+\let\ttsyntax\ttsintassi \let\endttsyntax\endttsintassi
+%
+\usepackage{color}
+\definecolor{sfondoblu}{rgb}{0.94,0.97,1}
+\usepackage{listings}
+\lstset{language=[LaTeX]TeX,
+ basicstyle=\footnotesize\ttfamily,
+ keywordstyle=\color{blue}\bfseries,
+ commentstyle=\color{gray},
+ backgroundcolor=\color{sfondoblu},
+ frameround=tttt,
+ frame=tlrb,
+ escapechar=|,
+ morekeywords={bilinear, semilogx, semilogy, loglog, polar, logpolar, smith, setgridcolor, setmajorlinethickness, setmediumlinethickness, setminorlinethickness, setminimumdistance, setxside, setyside, customcode},
+ columns=flexible
+}
+\begin{document}
+\GetFileInfo{graphpaper.dtx}
+\title{Documentation of the \class{graphpaper} \LaTeX\ class}
+\author{Claudio Beccari \and Francesco Biccari\thanks{Corresponding author: biccari@gmail.com}}
+\date{Version number \fileversion; last revised on \filedate.}
+\maketitle
+\setcounter{tocdepth}{2}
+\renewcommand{\columnseprule}{0.4pt}
+\setlength{\columnsep}{1.5cm}
+
+\addtocontents{toc}{\protect\begin{multicols}{2}}
+{\small
+\tableofcontents}
+
+\DocInput{graphpaper.dtx}
+\addtocontents{toc}{\protect\end{multicols}}
+\end{document}
+%</driver>
+% \fi
+%^^A \CheckSum{100}
+%\begin{abstract}
+% This document describes how to use the \LaTeX\ document class \class{graphpaper}.
+% It allows to print several types of graph papers: bilinear,
+% semilogarithmic, bilogarithmic, polar, Smith charts.
+%\end{abstract}
+%
+%\section{Legal terms}
+% This file is part of the |graphpaper| bundle.
+%
+% 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 at:
+% http://www.latex-project.org/lppl.txt
+%
+% This work has the LPPL maintenance status ``maintained''.
+%
+% This work consists of this file graphpaper.dtx,
+% and the derived files graphpaper.cls and graphpaper.pdf.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by the LPPL is contained in the README file.
+%
+%\section{Installation}
+% The simplest way to install \class{graphpaper} is by the package manager of your \TeX\
+% distribution (\TeX\ Live or MiK\TeX). For manual installation see the README file.
+%
+%
+% \newpage
+% \section{How to use graphpaper}
+% \label{sec:howto}
+%
+% \class{Graphpaper} is a \LaTeX\ class and it is loaded as usual:
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\documentclass|\opz{options}|{graphpaper}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% It has three class options to specify the paper format:
+% \texttt{a4paper}, \texttt{a3paper}, \texttt{letterpaper}.
+% The paper orientation cannot be changed and it is always set
+% to landscape.
+%
+% \class{Graphpaper} provides the following commands (to be used
+% inside the body of the document) in order to compose graph papers.
+% At the end of the execution of these commands, a new page
+% is always started.
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\bilinear
+
+\semilogx|\marg{decades along x}|
+
+\semilogy|\marg{decades along y}|
+
+\loglog|\opz{0/1}||\marg{decades along x}||\marg{decades along y}|
+
+\polar
+
+\logpolar|\marg{decades along radius}|
+
+\smith
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% The commands \cs{bilinear}, \cs{semilogx}, and \cs{semilogy} are self
+% explanatory.
+% The optional parameter in the \cs{loglog} command chooses wether the
+% decade length along the abscissa and ordinate axes must have the same
+% dimension. It can assume the value 0 (free dimensions) or 1 (same
+% dimensions), 0 being the default.
+% The commadns \cs{polar}, \cs{logpolar}, \cs{smith} are used to plot
+% polar, logpolar, and Smith chart graph papers. The mandatory argument
+% of \cs{logpolar} specifies the number of decades.
+%
+% There are several commands to change the appearance of the graph papers.
+% They must be inserted before the graph paper command which we want they
+% affect.
+%
+% The following ones are specific to bilinear, semilog and loglog papers
+% only:
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\setxside|\marg{length}|
+
+\setyside|\marg{length}|
+
+\setminimumdistance|\marg{length}|
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+% \cs{setxside} and \cs{setyside} allow to specify the dimensions of the
+% rectangle of the grid. The default values are (260\,mm, 180\,mm) for
+% A4 paper, (250\,mm, 190\,mm) for letter paper, and (380\,mm, 280\,mm)
+% for A3 paper.
+%
+% \cs{setminimumdistance} specifies the minimal optical distance
+% between two lines. Default is 1\,mm. In this way, the number of
+% subdivision is automatically composed.
+%
+% The following commands are instead general settings for all graph
+% papers:
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\setgridcolor|\marg{color}|
+
+\setmajorlinethickness|\marg{length}|
+
+\setmediumlinethickness|\marg{length}|
+
+\setminorlinethickness|\marg{length}|
+
+\customcode|\opz{0/1}\marg{picture environment commands}|
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \cs{setgridcolor} sets the color of the grid. The argument must be a
+% color defined or predefined by the color or |xcolor| package. The
+% default color is the typical red-orange color used in many graph papers,
+% Pantone 2011 U corresponding to RGB (250,153,89).
+%
+% \cs{setmajorlinethickness}, \cs{setmediumlinethickness},
+% \cs{setminorlinethickness} can be used to change the thickness of the
+% lines. The default values are 1\,pt, 0.6\,pt, 0.25\,pt, respectively.
+%
+% \cs{customcode} accepts all the commands accepted by the picture
+% environment. This snippet of code is inserted inside the picture
+% environment used to draw the subsequent graph paper.
+% The origin of the coordinate system in the case of rectangular graph
+% papers is the lower left vertex. The \cs{unitlength} is set to 1\,mm.
+% For circular plots (both polar and Smith) the origin is in the center
+% of the circle and the \cs{unitlength} is set to 1/140 of the paper height
+% currently in use.
+%
+% The \cs{customcode} command can be used, for example, to add a logo
+% or to draw on the graph paper.
+% Its optional argument is by default set to 0. If it is set to 1, the
+% content of the \cs{customcode} is erased after its usage in a
+% graphpaper.
+%
+%
+%\StopEventually{}
+%
+%\iffalse
+%<*class>
+%\fi
+%\clearpage
+%\section{The implementation}
+% This class file has been already identified by the commands extracted
+% by the |DocStrip| package, during the |.dtx| file compilation.
+% Therefore the commands \cs{NeedsTeXFormat} and \cs{ProvidesClass} are
+% already present in the |.cls| file.
+%
+% \subsection{Loaded packages, class options, and initial settings}
+% The |xkeyvalue| package is used in order to define the class options:
+% \begin{macrocode}
+\RequirePackage{xkeyval}
+% \end{macrocode}
+% Three class options are implemented and they allows only to change the
+% paper format (A4, A3, letter). The orientation of the paper is fixed
+% to landscape.
+%
+% \begin{macrocode}
+\def\GP@paper{1}
+\define@key[GRP]{}{a4paper}[]{\PassOptionsToPackage{a4paper}{geometry}}
+\define@key[GRP]{}{letterpaper}[]{\PassOptionsToPackage{letterpaper}{geometry}%
+ \def\GP@paper{2}}
+\define@key[GRP]{}{a3paper}[]{\PassOptionsToPackage{a3paper}{geometry}%
+ \def\GP@paper{3}}
+\DeclareOptionX*{\ClassError{graphpaper}{Option '\CurrentOption'%
+ \MessageBreak is not valid}{Remove '\CurrentOption' %
+ from class options}}
+\ProcessOptionsX[GRP]<>
+% \end{macrocode}
+%
+% The class is based on the \class{article} class. The default paper
+% is A4.
+% \begin{macrocode}
+\LoadClass[a4paper,11pt]{article}
+% \end{macrocode}
+%
+% Some packages are loaded. \pack{euclideangeometry} loads \pack{curve2e}
+% which in turns loads \pack{pict2e}; all of them are \env{picture}
+% environment extensions.
+% \begin{macrocode}
+\RequirePackage[landscape]{geometry}
+\RequirePackage{euclideangeometry,graphicx,xcolor}
+% \end{macrocode}
+%
+% Default line color (Pantone 2011~U).
+% \begin{macrocode}
+\definecolor{gridcolor}{RGB}{250,153,89}
+% \end{macrocode}
+%
+% Default thickness of the lines used for main divisions and subdivisions.
+% The ISO-UNI standards prescribe a geometric progression with $\sqrt{2}$
+% ratio, but it is not respected here.
+% It must be keep in mind also that a safe minimum thickness for an offset
+% monochromatic printer is about 0.25\,pt, whereas a safe minimum
+% thickness for a laser printer is about 0.5\,pt.
+% \begin{macrocode}
+\newlength\lwa
+\setlength{\lwa}{1pt}
+\newlength\lwb
+\setlength{\lwb}{0.6pt}
+\newlength\lwc
+\setlength{\lwc}{0.25pt}
+% \end{macrocode}
+%
+% Minimum distance between two subdivision lines. A necessary parameter
+% for automatic choice of number of subdivisions. Default 1\,mm.
+% \begin{macrocode}
+\newlength\mindistanceunit
+\setlength{\mindistanceunit}{1mm}
+% \end{macrocode}
+%
+% Definition of the width and height of the main rectangle within which
+% the bilinear, semilog and loglog grid is composed.
+% \begin{macrocode}
+\newlength\xsideunit
+\newlength\ysideunit
+\if\GP@paper1
+ \setlength{\xsideunit}{260mm}
+ \setlength{\ysideunit}{180mm}
+\fi
+\if\GP@paper2
+ \setlength{\xsideunit}{250mm}
+ \setlength{\ysideunit}{190mm}
+\fi
+\if\GP@paper3
+ \setlength{\xsideunit}{380mm}
+ \setlength{\ysideunit}{280mm}
+\fi
+% \end{macrocode}
+%
+%\subsection{Rectangular graph papers}
+%
+% As we will see below, the commands to compose the bilinear, semilog
+% and loglog graph papers are just proper calls of the low-level command
+% \cs{carta}.
+%
+%\subsubsection{Service macros for rectangular graph papers}
+%
+% First of all, four macros are defined. They are used by the
+% \cs{carta} service command only.
+%
+% Two of them are simply two identical classical |whiledo| commands:
+% the first cycles on the counter \cs{J} while the second one on the
+% counter \cs{K}.
+% They are two because in this way two nested |whiledo| commands can be
+% implemented.
+% These \cs{WhileDo} commands have four parameters:
+% 1. the incremental step of the counter between cycles (default 1);
+% 2. the initial value of the counter;
+% 3. the final value of the counter;
+% 4. the code to execute at each cycle.
+% \begin{macrocode}
+\newcount\J
+\newcount\K
+
+\newcommand\WhileDoOne[4][1]{%
+ \J=#2 \fpdowhile{\J=<#3 }{#4\advance\J by #1\relax}}
+
+\newcommand\WhileDoTwo[4][1]{%
+ \K=#2 \fpdowhile{\K=<#3 }{#4\advance\K by #1\relax}}
+% \end{macrocode}
+%
+%
+% The other two commands are used to draw a periodic set of equidistant
+% lines in log scale.
+% These two commands are practically identical, the only difference is
+% that they act on different axes.
+% These commands have six parameters:
+% 1. number of lines to draw (distance between these lines is the fifth
+% parameter);
+% 2. value at which the first line must be drawn (x-value for vertical
+% lines, y-value for horizontal lines);
+% 3. thickness;
+% 4. tick length;
+% 5. distance between two lines (typically the length of a decade:
+% y-decade for horizontal lines, x-decade for vertical lines);
+% 6. line length (typically the length of the graph paper sides:
+% x-side for horizontal lines and y-side for vertical lines).
+%
+% \begin{macrocode}
+\newcommand\hlines[6]{%
+\multiput(-#4,\fpeval{ln(#2) * #5 / ln(10)})(0,#5){#1}%
+{\linethickness{#3}\line(1,0){\fpeval{#6 + 2*#4}}}%
+}
+
+\newcommand\vlines[6]{%
+\multiput(\fpeval{ln(#2) * #5 / ln(10)},-#4)(#5,0){#1}%
+{\linethickness{#3}\line(0,1){\fpeval{#6 + 2*#4}}}%
+}
+% \end{macrocode}
+%
+%\subsubsection{Command for rectangular graph papers}
+%
+% Here starts the definition of the \cs{carta} command. Its syntax is
+%\begin{ttsyntax}
+%\cs{carta}\opz{0 or1}\marg{no. x decades}\marg{no. of y decades}
+%\end{ttsyntax}
+% If an axis has zero decades, the scale is linear.
+% For example, \cs{carta}\Marg{0}\Marg{0} composes a bilinear graph
+% paper, \cs{carta}\Marg{2}\Marg{0} composes a semilog graph paper with
+% linear y-axis and two decades along x-axis, and so on.
+% Its optional argument can be 0 or 1. If it is set to 0, and both the
+% numbers of decades are greater than zero (which means the resulting
+% graph paper is loglog), then the length of x-axis and y-axis decades
+% are set to be equal.
+%
+% Declaration of the command and its arguments.
+% \begin{macrocode}
+\NewDocumentCommand{\carta}{O{0} m m}{%
+% \end{macrocode}
+%
+% Typographical settings and definition of the main features of the
+% graphpaper. \cs{xlength} and \cs{ylength} represent the lengths,
+% expressed in mm, of the rectangle dimensions. \cs{minimumdistance}
+% is the minimum distance at which two subdivision lines can be drawn.
+% \begin{macrocode}
+\newpage
+\parindent=0pt
+\pagestyle{empty}%
+\color{gridcolor}%
+\setlength{\unitlength}{1mm}%
+\def\ticklength{2}
+\def\minorticklength{1.2}
+\def\minimumdistance{\fpeval{(\mindistanceunit/1mm)}}
+\def\xlength{\fpeval{round(round(\xsideunit/1cm) * 10)}}
+\def\ylength{\fpeval{round(round(\ysideunit/1cm) * 10)}}
+% \end{macrocode}
+%
+% \cs{xlinsq} and \cs{ylinsq} represent the number of big divisions
+% (cm) on horizontal and vertical axes for linear scales, respectively.
+% \begin{macrocode}
+\def\xlinsq{\inteval{\xlength/10}}
+\def\ylinsq{\inteval{\ylength/10}}
+% \end{macrocode}
+%
+% Implementation of the same decade length between x-axis and y-axis
+% for loglog graph paper. This is obtained properly changing the
+% values of \cs{xlength} and \cs{ylength}, making them equal.
+% \begin{macrocode}
+\edef\decx{#2}% decades along x
+\edef\decy{#3}% decades along y
+\unless\ifnum#2=0 \unless\ifnum#3=0 \ifnum#1=1%
+\fptest{\decx/\decy < \xlength/\ylength}%
+{\def\xlength{\fpeval{\ylength*\decx/\decy}}}
+{\def\ylength{\fpeval{\xlength*\decy/\decx}}}
+\fi\fi\fi
+% \end{macrocode}
+%
+% Using the values of the paper width and height together with the
+% length of the graph paper rectangle sides, the margins are calculated
+% and passed to the geometry package in order to center the grid with
+% respect to the page.
+% \begin{macrocode}
+\ifcsname ml\endcsname\relax\else\newlength\ml\fi
+\ifcsname mr\endcsname\relax\else\newlength\mr\fi
+\ifcsname mt\endcsname\relax\else\newlength\mt\fi
+\ifcsname mb\endcsname\relax\else\newlength\mb\fi
+\unless\ifcsname mr\endcsname\newlength\mr\fi
+\unless\ifcsname mt\endcsname\newlength\mt\fi
+\unless\ifcsname mb\endcsname\newlength\mb\fi
+\setlength{\ml}{\fpeval{(\paperwidth/1mm - \xlength)/2}mm}
+\setlength{\mr}{\fpeval{(\paperwidth/1mm - \xlength)/2}mm}
+\setlength{\mt}{\fpeval{(\paperheight/1mm - \ylength)/2}mm}
+\setlength{\mb}{\fpeval{(\paperheight/1mm - \ylength)/2}mm}
+\newgeometry{left=\ml,right=\mr,top=\mt,bottom=\mb}
+% \end{macrocode}
+%
+% Here starts the drawing of the graph paper by the |picture| environment.
+% \begin{macrocode}
+\begin{picture}(\xlength,\ylength)
+% \end{macrocode}
+%
+% If the horizontal axis is linear, vertical lines are drawn by
+% simple \cs{multiput} commands. Otherwise, if the scale is logarithmic,
+% the vertical lines are drawn by the \cs{vlines} command defined above.
+% \begin{macrocode}
+\ifnum#2=0\relax
+% vertical lines on linear abscissa. Main lines every 10 mm.
+% Second level lines every 5 mm, Third level lines every 1 mm,
+% according to the \minimumdistance value
+ \multiput(0,0)(10,0){\inteval{\xlinsq + 1}}{%
+ \linethickness{\lwa}\squarecap\line(0,1){\ylength}}
+ \ifnum\fpeval{\minimumdistance <= 5}=1
+ \multiput(5,0)(10,0){\xlinsq}{%
+ \linethickness{\lwb}\line(0,1){\ylength}}\fi
+ \ifnum\fpeval{\minimumdistance <= 1}=1
+ \multiput(0,0)(1,0){\xlength}{%
+ \linethickness{\lwc}\line(0,1){\ylength}}\fi
+\else
+ % vertical lines on log abscissa
+ \edef\decxx{\fpeval{\decx + 1}}%
+ \edef\xstep{\fpeval{\xlength / \decx}}
+ % main lines: one for each decade (10) plus one at the end
+ \vlines{\decxx}{1}{\lwa}{\ticklength}{\xstep}{\ylength}
+ % second-level lines: one every unit (1), for each decade
+ \WhileDoOne{2}{9}{\vlines{\decx}{\J}{\lwb}{%
+ \minorticklength}{\xstep}{\ylength}}
+ % third-level lines: for each decade (10) and for each unit (1):
+ % 20, 10, 5, 2 are progressively tested and adopted if the distance
+ % between two subsequent nearest lines is less to \minimumdistance
+ \WhileDoTwo{1}{9}{%
+ \edef\xmindivfloat{%
+ \fpeval{(\K+1)*(1-10^-(\minimumdistance/\xstep))}}
+ % xmindiv corresponds to 1/20 of unit
+ \def\xmindiv{20}
+ % xmindivfloat corresponds to the distance of two
+ % subdivision with respect to the unit
+ \ifnum\fpeval{\xmindivfloat <= 0.5}=1 \def\xmindiv{10}\fi
+ \ifnum\fpeval{\xmindivfloat <= 0.2}=1 \def\xmindiv{4}\fi
+ \ifnum\fpeval{\xmindivfloat <= 0.1}=1 \def\xmindiv{2}\fi
+ \ifnum\fpeval{\xmindivfloat <= 0.05}=1 \def\xmindiv{1}\fi
+ \ifnum\fpeval{\xmindiv == 20}=1\relax
+ \else\WhileDoOne[\xmindiv]{\xmindiv}{19}{%
+ \vlines{\decx}{(\K+\J/20)}{\lwc}{0}{\xstep}{\ylength}}\fi}
+\fi
+% \end{macrocode}
+%
+% If the vertical axis is linear, horizontal lines are drawn by
+% simple \cs{multiput} commands. Otherwise, if the scale is logarithmic,
+% the horizontal lines are drawn by the \cs{hlines} command defined above.
+% \begin{macrocode}
+\ifnum#3=0\relax
+% horizontal lines on linear ordinates. Main lines every 10 mm.
+% Second level lines every 5 mm, Third level lines every 1 mm,
+% according to the \minimumdistance value
+ \multiput(0,0)(0,10){\inteval{\ylinsq + 1}}{%
+ \linethickness{\lwa}\squarecap\line(1,0){\xlength}}
+ \ifnum\fpeval{\minimumdistance <= 5}=1
+ \multiput(0,5)(0,10){\ylinsq}{%
+ \linethickness{\lwb}\line(1,0){\xlength}}\fi
+ \ifnum\fpeval{\minimumdistance <= 1}=1
+ \multiput(0,0)(0,1){\ylength}{%
+ \linethickness{\lwc}\line(1,0){\xlength}}\fi
+\else
+ % horizontal lines on log ordinates
+ \edef\decyy{\fpeval{\decy + 1}}%
+ \edef\ystep{\fpeval{\ylength / \decy}}
+ % main lines: one for each decade (10) plus one at the end
+ \hlines{\decyy}{1}{\lwa}{\ticklength}{\ystep}{\xlength}
+ % second-level lines: one every unit (1), for each decade
+ \WhileDoOne{2}{9}{\hlines{\decy}{\J}{\lwb}{%
+ \minorticklength}{\ystep}{\xlength}}
+ % third-level lines: for each decade (10) and for each unit (1):
+ % 20, 10, 5, 2 are progressively tested and adopted if the distance
+ % between two subsequent nearest lines is less to \minimumdistance
+ \WhileDoTwo{1}{9}{\edef\ymindivfloat{%
+ \fpeval{(\K+1)*(1-10^-(\minimumdistance/\ystep))}}
+ % ymindiv corresponds to 1/20 of unit
+ \def\ymindiv{20}
+ % ymindivfloat corresponds to the distance of two subdivisions
+ % with respect to the unit
+ \ifnum\fpeval{\ymindivfloat <= 0.5}=1 \def\ymindiv{10}\fi
+ \ifnum\fpeval{\ymindivfloat <= 0.2}=1 \def\ymindiv{4}\fi
+ \ifnum\fpeval{\ymindivfloat <= 0.1}=1 \def\ymindiv{2}\fi
+ \ifnum\fpeval{\ymindivfloat <= 0.05}=1 \def\ymindiv{1}\fi
+ \ifnum\fpeval{\ymindiv == 20}=1\relax
+ \else\WhileDoOne[\ymindiv]{\ymindiv}{19}{%
+ \hlines{\decy}{(\K+\J/20)}{\lwc}{0}{\ystep}{\xlength}}\fi}
+\fi
+% \end{macrocode}
+%
+% Custom code provided by the user. After executing the code to compose
+% the rectangular graph paper and the user custom code, the latter is
+% reset if the \cs{GP@customcodereset} is true.
+% \begin{macrocode}
+\GP@custom
+\end{picture}
+\ifGP@customcodereset\def\GP@custom{}\fi}
+% \end{macrocode}
+%
+%
+%
+%\subsection{Circular graph papers}
+%
+% The \class{Graphpaper} class provides commands to draw three different
+% circular graph papers: linear polar chart, log polar chart, Smith chart.
+%
+%\subsubsection{Service macros for Smith charts}
+%
+% Here follows a list of service macros used by circular graph papers.
+%
+% Definition of the counter \cs{I}, used both in polar paper and Smith chart.
+% \begin{macrocode}
+\newcount\I
+% \end{macrocode}
+%
+% |Rbox| composes a tick and a label in a rotated box. It is used to
+% compose the ticks and labels along the external circle of circular
+% graph papers. It accepts three arguments: The first one is
+% optional and represents
+% the angle of rotation (default 0); the second one is optional too,
+% it is inserted by round parentheses, and it represents the position of the
+% box which can be given in cartesian $(x,y)$ or polar coordinates $(\theta:\rho)$
+% (default 0:0); the third one is mandatory and
+% contains the label.
+% \begin{macrocode}
+\NewDocumentCommand\Rbox{O{0} D(){0:0} m}{%
+ \fptest{#1>=0}{\edef\RotLab{\fpeval{#1-90}}}{\edef\RotLab{\fpeval{#1+90}}}%
+ \put(#2){\color{black}\segment(0,0)(#1:1)\put(#1:1){%
+ \rotatebox{\RotLab}{\makebox(0,0)[c]{%
+ \fptest{#1>=0}{\Pbox[b]}{\Pbox[t]}{\scriptstyle#3}[0]}}%
+ }%
+ }\ignorespaces}
+% \end{macrocode}
+%
+% |\Xcircle| macro (used only for Smith charts) assumes that the scale
+% factor |\Scala| ($s$) has already been defined and it takes only one
+% mandatory parameter ($x$). It draws a circle with
+% center $(sx/(x+1),0)$ and radius $s/(x+1)$. ($x$ represents the real
+% part (resistance) of the normalised impedance.)
+% \begin{macrocode}
+\NewDocumentCommand\Xcircle{m}{%
+ \edef\Czero{0,0}\edef\Rzero{\Scala}%
+ \edef\Rdue{\fpeval{1/(#1+1)*\Scala}}%
+ \edef\Cdue{\fpeval{\Rzero-\Rdue},0}%
+ \Circlewithcenter\Cdue radius\Rdue\ignorespaces}
+% \end{macrocode}
+%
+% |\Ycircle| macro (used only for Smith charts) assumes that the scale
+% factor |\Scala| ($s$) has already been defined.
+% It assumes that the circle diameter is 100|\unitlength|s long and it
+% takes only one
+% mandatory parameter ($y$). It draws an arc of a circle with
+% center $(s,s/y)$, starting point at $(s,0)$ (and therefore radius
+% $s/y$) and with an angle calculated in order to have the end point on
+% the external circle. ($y$ represents the imaginary part (reactance)
+% of the normalised impedance.)
+% \begin{macrocode}
+\NewDocumentCommand\Ycircle{m s}{%
+ \edef\Czero{0,0}\edef\Rzero{\Scala}% external circle center and radius
+ \edef\Rdue{\fpeval{\Scala/abs(#1)}}% Small circle radius
+ \edef\Cdue{\Rzero,\fpeval{\Scala/#1}}% Small circle center
+ \edef\Cuno{\Rzero,0}% First intersection point
+ \ModAndAngleOfVect\Cdue to\Mod and\Alfa % Small circle center polar coordinates
+ \IntersectionOfLines(\Czero)(\Cdue)and(\Cuno)(\fpeval{\Alfa+90}:1)to\Inter
+ \SymmetricalPointOf\Cuno respect\Inter to\Idue
+ \ModAndAngleOfVect\Idue to\Mdue and\Adue
+ \SubVect\Cdue from\Idue to\IIdue
+ \ModAndAngleOfVect\IIdue to\Mod and\Alfa
+ \fptest{#1>0}{\edef\Alfa{\fpeval{270-\Alfa}}\Arc(\Cdue)(\Idue){\Alfa}}%
+ {\edef\Alfa{\fpeval{270+\Alfa}}\Arc(\Cdue)(\Cuno){\Alfa}}%
+ \IfBooleanT{#2}{\Rbox[\Adue](\Idue){\color{black}#1}}\relax
+ \ignorespaces}
+% \end{macrocode}
+%
+% The following two macros are used to compose the resistance axis
+% below the Smith chart.
+%
+% |CalcRxx| macro (used only for Smith charts) assumes that the scale
+% factor |Scala| ($s$) has already been defined.
+% First, it calculates the reflection coefficient
+% $\Gamma = s \frac{x-1}{x+1}$ from resistance $x$.
+% A tick and a label are inserted for this value of $x$.
+% \begin{macrocode}
+\newcommand\CalcRxx[1]{%
+ \edef\Rxx{\fpeval{\Scala*(#1 - 1)/(#1 + 1)}}%
+ \segment(\Rxx,\LowResZero)(\Rxx,\LowResUno)\relax
+ \Pbox(\Rxx,\LowResUno)[t]{$\color{black}\scriptsize#1$}[0]\ignorespaces}
+% \end{macrocode}
+%
+% |GradResist| macro (used only for Smith charts)
+% draws the graduated axis for resistance and executes the |CalcRxx|
+% for several values of resistance in order to compose the ticks and
+% the labels.
+% \begin{macrocode}
+\newcommand\GradResist[1]{%
+ \color{black}
+ \edef\LowResZero{-#1}\edef\LowResUno{\fpeval{\LowResZero-1}}%
+ \I=0\edef\Auxx{0}\relax
+ \fpdowhile{\I<=10}{\CalcRxx{\Auxx}%
+ \advance\I by1\edef\Auxx{\fpeval{\Auxx+0.1}}\ignorespaces}
+ \CalcRxx{1.5}\I=2\edef\Auxx{2}\relax
+ \fpdowhile{\I<=9}{\CalcRxx{\Auxx}%
+ \advance\I by1\edef\Auxx{\fpeval{\Auxx+1}}\ignorespaces}
+ \CalcRxx{15}\CalcRxx{30}%
+ \edef\Rxx{\Scala}%
+ {\segment(-\Rxx,\LowResZero)(\Rxx,\LowResZero)%
+ \segment(\Rxx,\LowResZero)(\Rxx,\LowResUno)%
+ \Pbox(\Rxx,\LowResUno)[t]{\infty}[0]}}
+% \end{macrocode}
+%
+% |GradPolar| macro (used only for polar charts)
+% draws the graduated axis for log polar charts.
+% \begin{macrocode}
+\newcommand{\GradPolar}[1]{%
+ \color{black}
+ \edef\yline{\fpeval{-1.2 * \Scala}}
+ \linethickness{\lwa}
+ \segment(-\Scala,\yline)(\Scala,\yline)
+ \edef\ytickstart{\yline}
+ \edef\ytickstop{\fpeval{\yline-2}}
+ \edef\yytickstop{\fpeval{\yline-1}}
+ \segment(\Scala,\ytickstart)(\Scala,\ytickstop)
+ \segment(-\Scala,\ytickstart)(-\Scala,\ytickstop)
+ \fptest{#1=0}{%
+ \segment(0,\ytickstart)(0,\ytickstop)
+ \edef\plstep{\fpeval{\Scala/10}}
+ \linethickness{\lwb}
+ \multiput(\plstep,\yline)(\plstep,0){9}{\line(0,-1){1}}
+ \multiput(-\plstep,\yline)(-\plstep,0){9}{\line(0,-1){1}}%
+ }{%
+ \I=0
+ \fpwhiledo{\I<#1}{%
+ \linethickness{\lwa}
+ \edef\xtick{\fpeval{\I*\Scala/#1}}
+ \segment(\xtick,\ytickstart)(\xtick,\ytickstop)
+ \segment(-\xtick,\ytickstart)(-\xtick,\ytickstop)
+ \J=2
+ \fpwhiledo{\J<=9}{%
+ \linethickness{\lwb}
+ \edef\xtick{\fpeval{\Scala/#1 * (\I + ln(\J)/ln(10))}}
+ \segment(\xtick,\ytickstart)(\xtick,\yytickstop)
+ \segment(-\xtick,\ytickstart)(-\xtick,\yytickstop)
+ \advance\J by1\relax}
+ \advance\I by1\relax}}
+}
+% \end{macrocode}
+%
+%
+%\subsubsection{Polar graph papers}
+%
+% The polar graph papers are composed by the command \cs{PolarChart}.
+% The syntax is
+%\begin{ttsyntax}
+% \cs{PolarChart}\opz{diameter}\marg{decades}
+%\end{ttsyntax}
+% where \meta{diameter} is the dimension (plus some extra space for
+% labels and margins) of the polar chart. Its default value
+% corresponds to the \cs{paperheight} (the minimum dimension of the
+% paper).
+% The mandatory parameter \meta{decades} must be an integer number.
+% Its value corresponds to the number of decades of the radial
+% coordinate for the log polar graph paper.
+% If its value is zero, the chart is linear.
+% The maximum number of allowed decades is set by the macro \cs{NDecMax}:
+% its default value is~2.
+%
+% Declaration of the command and its arguments.
+% \begin{macrocode}
+\NewDocumentCommand\PolarChart{O{\paperheight} m}{%
+% \end{macrocode}
+%
+% Typographical settings and definition of the main features of the graphpaper.
+% \cs{xlength} and \cs{ylength} represent the lengths of the rectangle
+% dimensions in which the polar graph is plot.
+% The origin of the coordinate system is in the center of the page.
+% \begin{macrocode}
+ \newpage
+ \parindent=0pt
+ \pagestyle{empty}%
+ \ifcsname pmargin\endcsname\relax\else\newlength\pmargin\fi
+ \setlength{\pmargin}{20pt}
+ \newgeometry{left=\pmargin,right=\pmargin,top=\pmargin,bottom=\pmargin}
+ \def\factor{140}
+ \unitlength=\fpeval{#1/\factor}pt
+ \def\xlength{\fpeval{(\textwidth-0.01pt)/\unitlength}}
+ \def\ylength{\fpeval{(\textheight-0.01pt)/\unitlength}}
+ \begin{picture}(\xlength,\ylength)%
+ (\fpeval{-\xlength/2},\fpeval{-\ylength/2})%
+ \color{gridcolor}%
+ \edef\Scala{50}% The scale factor
+% \end{macrocode}
+%
+%
+% Circle stroking. In linear scale 10 radial units are present,
+% therefore, 10 circles are drawn with tick lines,
+% medium lines circles every 0.5 unit and thin lines circles every
+% 0.1 unit.
+% \begin{macrocode}
+ \fptest{#2=0}{% start circle linear radius sequence.
+ \I=1
+ \fpdowhile{\I=<100}{\edef\R{\fpeval{0.01*\Scala*\I}}%
+ {\fptest{\fpeval{\I-10(round(\I/10,0))}=0}{\linethickness{\lwa}%
+ }%
+ {\fptest{\fpeval{\I-5(round(\I/5,0))}=0}{\linethickness{\lwb}}%
+ {\linethickness{\lwc}}%
+ }\Circlewithcenter0,0radius\R
+ }\advance\I by1\relax}%
+ }% end circle linear radius sequence
+ {%
+ \edef\LnDieci{\fpeval{ln(10)}}%
+ \edef\ScalaDecade{\fpeval{\Scala/#2}}%
+ \fptest{#2<3}{%
+ \newcount\Dec \Dec=1\relax
+ \fpdowhile{\Dec=<#2}{%
+ \linethickness{\lwa}%
+ \edef\R{\fpeval{\Dec*\ScalaDecade}}%
+ \Circlewithcenter0,0radius\R% Thick circles
+ % First band from 1 to 4 (excluded)
+ \edef\LPLA{1}%
+ \fpdowhile{\LPLA<4}{
+ \edef\Logaritmo{\fpeval{\Dec-1+(ln(\LPLA))/\LnDieci}}%
+ \edef\R{\fpeval{\ScalaDecade*\Logaritmo}}%
+ \fptest{\R>0}{\fptest{\LPLA=round(\LPLA,0)}%
+ {\linethickness{\lwb}}{\linethickness{\lwc}}%
+ \Circlewithcenter0,0radius\R}{}%
+ \edef\LPLA{\fpeval{\LPLA+0.2}}}%
+ % Second band from 4 to 10 included
+ \edef\LPLA{4}%
+ \fpdowhile{\LPLA=<10}{%
+ \edef\Logaritmo{\fpeval{\Dec-1+(ln(\LPLA))/\LnDieci}}%
+ \edef\R{\fpeval{\ScalaDecade*\Logaritmo}}%
+ \fptest{\R>0}{\fptest{\LPLA=round(\LPLA,0)}%
+ {\linethickness{\lwb}}{\linethickness{\lwc}}%
+ \Circlewithcenter0,0radius\R}{}%
+ \edef\LPLA{\fpeval{\LPLA+0.5}}}%
+ \advance\Dec by1\relax}%
+ }{%
+ \ClassWarning{GraphPaper}{Logarithmic polar graph paper:\MessageBreak
+ too many decades: \number#2\space\MessageBreak
+ Reduce their number}%
+ }}% End logarithmic circle radius sequence
+ \ignorespaces
+ %
+% \end{macrocode}
+%
+% Radial lines. \cs{I} represents the angle in degrees and it runs
+% from 0 to 359. Tick lines every 10$^\circ$; medium lines every 5$^\circ$
+% for units 2, 7, 8, 9, 10; thin lines every 2$^\circ$ for units 3, 4, 5, 6;
+% thin lines every 1$^\circ$ for units 7, 8, 9, 10.
+% \begin{macrocode}
+ \I=0\edef\R{\Scala}%
+ \fpdowhile{\I<360}{\edef\A{\fpeval{\I}}%
+ \fptest{\fpeval{\I-10(round(\I/10,0))}=0}%
+ {\linethickness{\lwa}\segment(0,0)(\A:\R)
+ \Rbox[\A](\A:\R){\color{black}\A}}% multiple of 10
+ {\fptest{\fpeval{\I-5(round(\I/5,0))}=0}%
+ {\linethickness{\lwb}%
+ \segment(\A:5)(\A:10)
+ \segment(\A:30)(\A:\R)}% multiple of 5
+ {\linethickness{\lwc}%
+ \fptest{\fpeval{\I-2(round(\I/2,0))}=0}%
+ {\segment(\A:10)(\A:\R)}% multiple of 2
+ {\segment(\A:30)(\A:\R)}% multiple of 1
+ }%
+ }%
+ \advance\I by 1\relax
+ }\ignorespaces
+% \end{macrocode}
+%
+% Graduated axis.
+% \begin{macrocode}
+ \GradPolar{#2}
+% \end{macrocode}
+%
+% Custom code provided by the user. After executing the code to compose
+% the rectangular graph paper and the user custom code, the latter is
+% reset if the \cs{GP@customcodereset} is true.
+% \begin{macrocode}
+ \GP@custom
+ \end{picture}
+\ifGP@customcodereset\def\GP@custom{}\fi}
+% \end{macrocode}
+%
+%
+%\subsubsection{Smith chart graph paper}
+%
+% The Smith chart graph paper is composed by the command \cs{SmithChart}:
+%\begin{ttsyntax}
+% \cs{SmithChart}\oarg{diameter}
+%\end{ttsyntax}
+% where
+% \meta{diameter} is the dimension (plus some extra space for labels and
+% margins) of the Smith chart. Its default value corresponds to the
+% \cs{paperheight} (the minimum dimension of the paper).
+%
+% \begin{macrocode}
+\NewDocumentCommand\SmithChart{O{\paperheight}}{%
+ \newpage
+ \parindent=0pt
+ \pagestyle{empty}%
+ \ifcsname pmargin\endcsname\relax\else\newlength\pmargin\fi
+ \setlength{\pmargin}{20pt}
+ \newgeometry{left=\pmargin,right=\pmargin,top=\pmargin,bottom=\pmargin}
+ \def\factor{140}
+ \unitlength=\fpeval{#1/\factor}pt\relax
+ \def\xlength{\fpeval{(\textwidth-0.01pt)/\unitlength}}
+ \def\ylength{\fpeval{(\textheight-0.01pt)/\unitlength}}
+ \begin{picture}(\xlength,\ylength)%
+ (\fpeval{-\xlength/2},\fpeval{-\ylength/2})%
+ \color{gridcolor}%
+ \edef\Scala{50}% scale factor based on the main circle but valid
+ % for everything inside the graph paper.
+ {\color{black}\Pbox(0,0){}[4]}% Black dot in the origin
+ % images of the vertical cartesian lines
+ \I=0\relax
+ \fpdowhile{\I=<6}{\edef\Aux{\fpeval{\I/20}}{%
+ \fptest{\I=0}{\color{black}}{\color{gridcolor}}\thicklines\Xcircle{\Aux}}%
+ \advance\I by1\edef\Aux{\fpeval{\I/20}}\Xcircle{\Aux}%
+ \advance\I by1\ignorespaces}%fino a 0.4
+ \fpdowhile{\I=<16}{\edef\Aux{\fpeval{\I/20}}\relax
+ {\thicklines\Xcircle{\Aux}}\advance\I by2\edef\Aux{\fpeval{\I/20}}\relax
+ \Xcircle{\Aux}\advance\I by2\ignorespaces}% fino a 1
+ \fpdowhile{\I=<36}{\edef\Aux{\fpeval{\I/20}}\relax
+ {\thicklines\Xcircle{\Aux}}\advance\I by4\edef\Aux{\fpeval{\I/20}}\relax
+ \Xcircle{\Aux}\advance\I by4\ignorespaces}% fino a 2
+ \fpdowhile{\I=<96}{\edef\Aux{\fpeval{\I/20}}\relax
+ {\thicklines\Xcircle{\Aux}}\advance\I by8\edef\Aux{\fpeval{\I/20}}\relax
+ \Xcircle{\Aux}\advance\I by8\ignorespaces}%fino a 5
+ \fpdowhile{\I=<296}{\edef\Aux{\fpeval{\I/20}}\relax
+ {\thicklines\Xcircle{\Aux}}\advance\I by16\edef\Aux{\fpeval{\I/20}}\relax
+ \Xcircle{\Aux}\advance\I by16\ignorespaces}% up to 15
+% Images of the horizontal cartesian semi-lines
+ \Ycircle{1}%
+ {\thicklines\segment(-\Rzero,0)(\Rzero,0)}% diameter
+ \Rbox[180](-\Rzero,0){0}\Rbox[0](\Rzero,0){\infty}
+ \Ycircle{0.05}\Ycircle{-0.05}\I=2% \I=2 is to avoid a division by 0
+ \fpdowhile{\I=<18}{\edef\Aux{\fpeval{\I/20}}\relax
+ {\thicklines\Ycircle{\Aux}*\Ycircle{-\Aux}*}%
+ \advance\I by1\edef\Aux{\fpeval{\I/20}}\relax
+ \Ycircle{\Aux}\Ycircle{-\Aux}\advance\I by 1\ignorespaces}% restarts from 1
+ \fpdowhile{\I<40}{\edef\Aux{\fpeval{\I/20}}\relax
+ {\thicklines\Ycircle{\Aux}*\Ycircle{-\Aux}*}%
+ \advance\I by 2\edef\Aux{\fpeval{\I/20}}\relax
+ \Ycircle{\Aux}\Ycircle{-\Aux}\advance\I by 2\ignorespaces}% restarts from 2
+ \fpdowhile{\I<80}{\edef\Aux{\fpeval{\I/20}}\relax
+ {\thicklines\Ycircle{\Aux}*\Ycircle{-\Aux}*}%
+ \advance\I by 4\edef\Aux{\fpeval{\I/20}}\relax
+ \Ycircle{\Aux}\Ycircle{-\Aux}\advance\I by 4\ignorespaces}% restarts from 4
+ \fpdowhile{\I=<140}{\edef\Aux{\fpeval{\I/20}}\relax
+ {\thicklines\Ycircle{\Aux}*\Ycircle{-\Aux}*}%
+ \advance\I by 10\edef\Aux{\fpeval{\I/20}}\relax
+ \Ycircle{\Aux}\Ycircle{-\Aux}\advance\I by 10\ignorespaces}% stops at 7.5
+ {\thicklines\Ycircle{8}*\Ycircle{-8}*}%
+ % non linear graduation for the abscissas
+ \GradResist{62}%
+ % Polar graduation in normalised wave length percentages
+ \edef\Rout{\fpeval{1.09*\Rzero}}%
+ \edef\RoutCifre{\fpeval{\Rout+2}}%
+ \edef\RoutTak{\fpeval{\Rout+1}}%
+ {\color{black}%
+ \Circlewithcenter 0,0radius\Rout
+ \I=0\fpdowhile{\I<10}%
+ {\edef\LAng{\fpeval{180-\I*36}}\edef\Cifre{\fpeval{\I*5}}%
+ \put(\LAng:\RoutCifre){%
+ \rotatebox{\fpeval{\LAng-90}}{\makebox(0,0)[b]{\scriptsize\Cifre}}}%
+ \advance\I by 1\ignorespaces}
+ \I=0\fpdowhile{\I<50}{%
+ \edef\LAng{\fpeval{180-\I*7.2}}\segment(\LAng:\Rout)(\LAng:\RoutTak)%
+ \advance\I by1\ignorespaces}
+ %
+ % Outside circle encloses everything except the abscissa graduation.
+ % Everything lays inside a square
+ \Circlewithcenter0,0radius{\fpeval{\Scala+9}}}%
+ % Now the user supplied code is executed
+ \GP@custom
+ \end{picture}
+\ifGP@customcodereset\def\GP@custom{}\fi}%
+% \end{macrocode}
+%
+%
+%\subsection{User interface}
+%
+% Here follows the user commands to draw the graph papers, as described in
+% section~\ref{sec:howto}:
+% \begin{macrocode}
+\NewDocumentCommand{\bilinear}{}{\carta{0}{0}}
+\NewDocumentCommand{\semilogx}{m}{\carta{#1}{0}}
+\NewDocumentCommand{\semilogy}{m}{\carta{0}{#1}}
+\NewDocumentCommand{\loglog}{O{0}mm}{\carta[#1]{#2}{#3}}
+\NewDocumentCommand{\polar}{}{\PolarChart{0}}
+\NewDocumentCommand{\logpolar}{m}{\PolarChart{#1}}
+\NewDocumentCommand{\smith}{}{\SmithChart}
+% \end{macrocode}
+%
+% The user commands to customise the appearance of the graph
+% papers is defined. Their syntax was previously described in
+% sectio~\ref{sec:howto}:
+% \begin{macrocode}
+\NewDocumentCommand{\setgridcolor}{m}{\colorlet{gridcolor}{#1}}
+\NewDocumentCommand{\setmajorlinethickness}{m}{\setlength{\lwa}{#1}}
+\NewDocumentCommand{\setmediumlinethickness}{m}{\setlength{\lwa}{#1}}
+\NewDocumentCommand{\setminorlinethickness}{m}{\setlength{\lwa}{#1}}
+\NewDocumentCommand{\setminimumdistance}{m}{\setlength{\mindistanceunit}{#1}}
+\NewDocumentCommand{\setxside}{m}{%
+ \ifnum\fpeval{#1 > \paperwidth}=1 \ClassError{graphpaper}{X side too wide!} \fi
+ \setlength{\xsideunit}{#1}}
+\NewDocumentCommand{\setyside}{m}{%
+ \ifnum\fpeval{#1 > \paperheight}=1 \ClassError{graphpaper}{Y side too wide!} \fi
+ \setlength{\ysideunit}{#1}}
+\def\GP@custom{}
+\newif\ifGP@customcodereset \GP@customcoderesettrue
+\NewDocumentCommand{\customcode}{O{1} m}{%
+ \ifnum#1=\z@ \GP@customcoderesetfalse \fi%
+ \def\GP@custom{#2}}
+% \end{macrocode}
+%
+%
+%\subsection{Class code end}
+%
+% \begin{macrocode}
+%
+\endinput
+% \end{macrocode}
+%
+%\iffalse
+%</class>
+%\fi
+%
+% \Finale
+%^^A \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/greek-fontenc/Makefile b/Master/texmf-dist/source/latex/greek-fontenc/Makefile
index a784a805804..5472c479a92 100644
--- a/Master/texmf-dist/source/latex/greek-fontenc/Makefile
+++ b/Master/texmf-dist/source/latex/greek-fontenc/Makefile
@@ -22,7 +22,7 @@ SH = sh
# programs
PYLIT = pylit # text <-> source converter for literal programming
RST2HTML = rst2html5 # text -> HTML converter, see docutils.sf.net
-RUBBER = rubber -f # wrapper around `latex`, run until references resolved
+RUBBER = rubber -f --pdf -m hyperref # wrapper around `latex`, run until references resolved
LATEX = pdflatex -interaction batchmode
# LaTeX source files
@@ -70,17 +70,13 @@ lgr2licr.lua: lgr2licr.lua.txt
doc: html pdf
+html: greek-fontenc.html lgrenc.def.html puenc-greek.def.html \
+ tuenc-greek.def.html greek-fontenc.def.html \
+ textalpha.sty.html alphabeta.sty.html \
+ alphabeta-tuenc.def.html alphabeta-lgr.def.html lgr2licr.lua.html
-html: README.html tuenc-greek.def.html greek-fontenc.def.html lgrenc.def.html \
- textalpha.sty.html alphabeta.sty.html \
- alphabeta-tuenc.def.html alphabeta-lgr.def.html lgr2licr.lua.html
-
-README.html: README
- $(RST2HTML) README README.html
-
-tuenc-greek.def.html: tuenc-greek.def
- $(PYLIT) tuenc-greek.def
- $(RST2HTML) tuenc-greek.def.txt tuenc-greek.def.html
+greek-fontenc.html: README
+ $(RST2HTML) README greek-fontenc.html
greek-fontenc.def.html: greek-fontenc.def
$(PYLIT) greek-fontenc.def
@@ -90,6 +86,14 @@ lgrenc.def.html: lgrenc.def
$(PYLIT) lgrenc.def
$(RST2HTML) lgrenc.def.txt lgrenc.def.html
+tuenc-greek.def.html: tuenc-greek.def
+ $(PYLIT) tuenc-greek.def
+ $(RST2HTML) tuenc-greek.def.txt tuenc-greek.def.html
+
+puenc-greek.def.html: puenc-greek.def
+ $(PYLIT) puenc-greek.def
+ $(RST2HTML) puenc-greek.def.txt puenc-greek.def.html
+
textalpha.sty.html: textalpha.sty
$(PYLIT) textalpha.sty
$(RST2HTML) textalpha.sty.txt textalpha.sty.html
@@ -100,7 +104,7 @@ alphabeta.sty.html: alphabeta.sty
alphabeta-tuenc.def.html: alphabeta-tuenc.def
$(PYLIT) alphabeta-tuenc.def
- $(RST2HTML) alphabeta-tuenc.def.txt alphabeta-tuenc.html
+ $(RST2HTML) alphabeta-tuenc.def.txt alphabeta-tuenc.def.html
alphabeta-lgr.def.html: alphabeta-lgr.def
$(PYLIT) alphabeta-lgr.def
@@ -113,34 +117,43 @@ lgr2licr.lua.html: lgr2licr.lua
# User documentation
# ==================
-pdf: alphabeta-doc.pdf diacritics.pdf tuenc-greek-doc.pdf greekhyperref.pdf \
- lgrenc-test.pdf textalpha-doc.pdf
+pdf: alphabeta-doc.pdf alphabeta-tu.pdf diacritics.pdf \
+ textalpha-doc.pdf textalpha-tu.pdf hyperref-with-greek.pdf \
+ test-inputenc.pdf test-lgrenc.pdf test-tuenc-greek.pdf
-TEXTALPHA = textalpha.sty greek-fontenc.def
+TEXTALPHA = textalpha.sty greek-fontenc.def lgrenc.def tuenc-greek.def puenc-greek.def
ALPHABETA = $(TEXTALPHA) alphabeta.sty
-lgrenc-test.pdf: lgrenc-test.tex lgrenc.def greek-fontenc.def
- $(LATEX) lgrenc-test.tex
-
-tuenc-greek-doc.pdf: tuenc-greek-doc.tex tuenc-greek.def greek-fontenc.def
- $(RUBBER) -m xelatex tuenc-greek-doc.tex
+alphabeta-doc.pdf: alphabeta-doc.tex $(ALPHABETA)
+ $(RUBBER) alphabeta-doc.tex
-textalpha-doc.pdf: textalpha-doc.tex lgrenc.def $(TEXTALPHA)
- $(LATEX) textalpha-doc.tex
+alphabeta-tu.pdf: alphabeta-doc.tex $(ALPHABETA)
+ $(RUBBER) -m xelatex --jobname=alphabeta-tu alphabeta-doc.tex
-alphabeta-doc.pdf: alphabeta-doc.tex $(ALPHABETA) lgrenc.def
- $(LATEX) alphabeta-doc.tex
+textalpha-doc.pdf: textalpha-doc.tex $(TEXTALPHA)
+ $(RUBBER) textalpha-doc.tex
-alphabeta-doc-tuenc.pdf: alphabeta-doc.tex $(ALPHABETA) tuenc-greek.def
- $(RUBBER) -m xelatex alphabeta-doc.tex
- mv alphabeta-doc.pdf alphabeta-doc-tuenc.pdf
-
-greekhyperref.pdf: greekhyperref.tex $(ALPHABETA) lgrenc.def
- $(LATEX) greekhyperref.tex
+textalpha-tu.pdf: textalpha-doc.tex lgrenc.def $(TEXTALPHA)
+ $(RUBBER) -m xelatex --jobname=textalpha-tu textalpha-doc.tex
diacritics.pdf: diacritics.tex lgrenc.def greek-fontenc.def
$(LATEX) diacritics.tex
+hyperref-with-greek.pdf: hyperref-with-greek.tex $(ALPHABETA)
+ $(RUBBER) hyperref-with-greek.tex
+
+test-lgrenc.pdf: test-lgrenc.tex lgrenc.def greek-fontenc.def
+ $(LATEX) test-lgrenc.tex
+
+test-tuenc-greek.pdf: test-tuenc-greek.tex tuenc-greek.def greek-fontenc.def
+ $(RUBBER) -m xelatex test-tuenc-greek.tex
+
+test-inputenc.pdf: test-inputenc.tex $(TEXTALPHA)
+ $(RUBBER) test-inputenc.tex
+
+test-inputenc-tu.pdf: test-inputenc.tex lgrenc.def $(TEXTALPHA)
+ $(RUBBER) -m lualatex --jobname=test-inputenc-tu test-inputenc.tex
+
# Installation
# ------------
@@ -165,5 +178,5 @@ install-doc: doc
.PHONY: clean
clean:
- rm -f *.aux *.log *.toc *~
+ rm -f *.aux *.log *.toc *.out *~
diff --git a/Master/texmf-dist/source/latex/guitlogo/guit.dtx b/Master/texmf-dist/source/latex/guitlogo/guit.dtx
index 91531dfd5be..dae09f94cc0 100644
--- a/Master/texmf-dist/source/latex/guitlogo/guit.dtx
+++ b/Master/texmf-dist/source/latex/guitlogo/guit.dtx
@@ -1,7 +1,7 @@
% \iffalse
%
% guit.dtx
-% Copyright 2003, 2004, 2005, 2006, 2009, 2012, 2019 Gruppo Utilizzatori
+% Copyright 2003-2006, 2009, 2012, 2019, 2020 Gruppo Utilizzatori
% Italiani di TeX
%
% This work may be distributed and/or modified under the
@@ -48,8 +48,8 @@
Vediamo un po' come si comporta in una footnote\footnote{\guit~\guit\ldots
direi che \`e passabile, no?}. Diamoci\footnote{Un'altra nota:
\fontfamily{pzc}\fontseries{mb}\fontshape{it}\selectfont\guittext} dentro
-con qualche cosa\footnote{Un ultima nota: Copyright 2003, 2004, 2005, 2006,
-2009, 2012, 2019 \guittext} di ``strambo'':
+con qualche cosa\footnote{Un ultima nota: Copyright 2003-2006, 2009, 2012,
+2019, 2020 \guittext} di ``strambo'':
\begin{center}
\itshape\guit~agus \TeX~go br\'ach!\\
@@ -127,7 +127,7 @@ Per finire, un sfilza di \guit:
%
%
%
-% \CheckSum{544}
+% \CheckSum{546}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -795,14 +795,16 @@ Per finire, un sfilza di \guit:
% automaticamente; suggerimento e codice di Enrico Gregorio}
% \changes{v1.0.0}{2019/07/08}{\pacchetto{url} viene caricato con l'opzione
% \altro{hyphens}}
+% \changes{v1.0.0}{2020/07/03}{\pacchetto{url} viene caricato solo se non
+% \`e gi\`a stato fatto}
% Richiediamo espressamente l'uso di \LaTeXe, ci annunciamo al mondo e
% carichiamo tutti i pacchetti necessari.
% \begin{macrocode}
%<*style>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{guit}[2019/07/08 v1.0.0-alpha.3 Logo del GuIT]
+\ProvidesPackage{guit}[2020/07/03 v1.0.0-alpha.4 Logo del GuIT]
\RequirePackage{graphics}
-\RequirePackage[hyphens]{url}
+\@ifpackageloaded{url}{}{\RequirePackage[hyphens]{url}}
\RequirePackage{xcolor}[2004/07/04]
\RequirePackage{xkeyval}[2005/05/07]
% \end{macrocode}
@@ -1516,7 +1518,7 @@ Per finire, un sfilza di \guit:
% accidentalmente.
% \begin{macrocode}
%<*cfg>
-\ProvidesFile{guit.cfg}[2019/07/08 v1.0.0-alpha.3 File di configurazione di guit.sty]
+\ProvidesFile{guit.cfg}[2020/07/03 v1.0.0-alpha.4 File di configurazione di guit.sty]
%% Esempi:
%% \GuITcolor{1, 0, 1, 0.6}
%% \DeclareGuITLogoCommand{lmr}{-0.26em}{0.714ex}{-0.125em}{-0.125em}
diff --git a/Master/texmf-dist/source/latex/guitlogo/guit.ins b/Master/texmf-dist/source/latex/guitlogo/guit.ins
index 04f754069a0..a0b657864ff 100644
--- a/Master/texmf-dist/source/latex/guitlogo/guit.ins
+++ b/Master/texmf-dist/source/latex/guitlogo/guit.ins
@@ -1,6 +1,6 @@
%%
%% guit.ins
-%% Copyright 2003, 2004, 2005, 2006, 2009, 2012, 2019 Gruppo Utilizzatori
+%% Copyright 2003-2006, 2009, 2012, 2019 Gruppo Utilizzatori
%% Italiani di TeX
%%
%% This work may be distributed and/or modified under the
@@ -29,8 +29,8 @@
\input docstrip
\preamble
- Copyright 2003, 2004, 2005, 2006, 2009, 2012, 2019 Gruppo Utilizzatori
- Italiani di TeX
+ Copyright 2003-2006, 2009, 2012, 2019, 2020 Gruppo Utilizzatori Italiani
+ di TeX
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
diff --git a/Master/texmf-dist/source/latex/gzt/gzt.dtx b/Master/texmf-dist/source/latex/gzt/gzt.dtx
index d2513ec9fe3..e490957478d 100644
--- a/Master/texmf-dist/source/latex/gzt/gzt.dtx
+++ b/Master/texmf-dist/source/latex/gzt/gzt.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% File: gzt.dtx Copyright (C) 2014-2020 by
+% File: gzt.dtx Copyright (C) 2014-2021 by
% Denis Bitouz'e <denis.bitouze@univ-littoral.fr>
%
% It may be distributed and/or modified under the conditions of the
@@ -39,21 +39,24 @@ Gazette des Mathématiciens”](https://smf.emath.fr/les-publications/la-gazette
\expandafter\begingroup
\fi
%</internal>
+%<*class|class-article|install>
+\def\gztfileversion{1.0.1}
+\def\gztfiledate{2021-02-14}
+%</class|class-article|install>
%<*install>
\input l3docstrip.tex
% \input docstrip.tex
-\Msg{********************************************************}
+\Msg{**************************************************************}
\Msg{* Installation}
-\Msg{* Class: gzt 2020-03-17 v1.0.0}
-\Msg{* for the French journal}
-\Msg{* "La Gazette des Math'ematiciens" (DB)}
-\Msg{********************************************************}
+\Msg{* Class: gzt \gztfiledate\space v\gztfileversion}
+\Msg{* for the French journal "La Gazette des Math'ematiciens" (DB)}
+\Msg{**************************************************************}
\keepsilent
\askforoverwritefalse
\preamble
-----------------------------------------------------------------------------
gzt --- SMF bundle of classes for the French journal "La Gazette des
- Math'ematiciens", version 1.0.0
+ Math'ematiciens"
E-mail: denis.bitouze@univ-littoral.fr
Released under the LaTeX Project Public License v1.3c or later
@@ -61,7 +64,7 @@ See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------------------
\endpreamble
\postamble
-% Copyright (C) 2014-2020 by Denis Bitouz'e <denis.bitouze@univ-littoral.fr>
+% Copyright (C) 2014-2021 by Denis Bitouz'e <denis.bitouze@univ-littoral.fr>
----------------------------------------------------------------------------
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
@@ -115,6 +118,11 @@ This work consists of the file gzt.dtx
\nopreamble\nopostamble
\file{README.md}{\from{\jobname.dtx}{readme}}
}%
+\usedir{doc/latex/\GZT@classname}
+\generate{
+ \nopreamble\nopostamble
+ \file{CHANGELOG.md}{\from{\jobname.dtx}{changelog}}
+}%
\usedir{doc/latex/\GZT@classname/french}
\generate{
\nopreamble\nopostamble
@@ -141,6 +149,7 @@ This work consists of the file gzt.dtx
% \changes{v0.98}{2018/04/07}{Seventh CTAN version. Implementation of special
% editions.}%
% \changes{v1.0.0}{2020-03-17}{Eighth CTAN version.}%
+% \changes{v1.0.1}{2021-02-14}{Nineth CTAN version.}%
%
% \CheckSum{4413}
%
@@ -667,8 +676,8 @@ This work consists of the file gzt.dtx
\ProvidesExplClass
%<class> {gzt}
%<class-article> {gztarticle}
- {2020-03-17}
- {1.0.0}
+ {\gztfiledate}
+ {\gztfileversion}
{
SMF~class~for~the~French~journal^^J
"La~Gazette~des~Math'ematiciens".
@@ -684,6 +693,7 @@ This work consists of the file gzt.dtx
% \section{Class loading}
%
% \begin{macrocode}
+\bool_new:N \g_@@_moral_report_bool
\bool_new:N \g_@@_special_edition_bool
\bool_new:N \g_@@_for_authors_bool
\bool_new:N \g_@@_for_printer_bool
@@ -696,6 +706,19 @@ This work consists of the file gzt.dtx
%<class-article>\bool_gset_true:N \g_@@_inside_pages_bool%
% \end{macrocode}
%
+% We define some common code to the "moralreport" global option of "gzt" and
+% "gztarticle".
+% \begin{macrocode}
+\tl_gset:Nn \g_@@_moral_report_common_option_tl {%
+ \AddToHook{begindocument/before} {%
+ \bool_gset_true:N \g_@@_moral_report_bool
+ \bool_gset_true:N \g_@@_frontcover_without_minitoc_bool
+ \title[short={\bfseries\c_@@_moralreport_rubric_string_tl}]{}
+ \tl_gset:Nn \g_@@_rubric_title_tl {\c_@@_moralreport_rubric_string_tl}
+ }
+}
+% \end{macrocode}
+%
% \begin{macrocode}
%</class|class-article>
% \end{macrocode}
@@ -780,9 +803,63 @@ This work consists of the file gzt.dtx
specialedition / editorial~author .code:n = {%
\_@@_people:nnnnnnnn {#1}{}{}{}{}{}{editorinchief}{}
},%
+ moralreport .code:n = {
+ \g_@@_moral_report_common_option_tl
+ \AddToHook{begindocument/before} {%
+ \tl_gset:Nn \g_@@_pdftitle_string_tl {\c_@@_moralreport_rubric_string_tl}
+ }
+ },
+}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</class>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*class-article>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\keys_define:nn { gztarticle }
+{
+ editorial .code:n = {%
+ \AddToHook{begindocument}{%
+ \_@@_before_display_editorial:n {}%
+ }
+ \AddToHook{enddocument}{%
+ \_@@_after_display_editorial: {}%
+ }
+ },%
+ presidentmessage .code:n = {%
+ \AddToHook{begindocument}{%
+ \_@@_before_display_presidentmessage: {}%
+ }
+ \AddToHook{enddocument}{%
+ \_@@_after_display_presidentmessage: {}%
+ }
+ },%
+ moralreport .code:n = {
+ \g_@@_moral_report_common_option_tl
+ \keys_set:nn { gztarticle / moralreport } {#1}
+ },
+ moralreport / title .code:n = {%
+ \tl_gset:Nn \g_@@_moral_report_title_tl {#1}
+ },%
+ moralreport / short~title .code:n = {%
+ \tl_gset:Nn \g_@@_moral_report_short_title_tl {#1}
+ },%
}%
% \end{macrocode}
%
+% \begin{macrocode}
+%</class-article>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*class>
+% \end{macrocode}
+%
% If we want to disable the inside backcover.
% \begin{macrocode}
% \bool_gset_true:N \g_@@_no_inside_backcover_bool
@@ -1005,7 +1082,7 @@ This work consists of the file gzt.dtx
%
% \item Hooks to do actions on every page or on the current page:
% \begin{macrocode}
-\RequirePackage{everypage}
+% \RequirePackage{everypage}
% \end{macrocode}
%
% \item For translating words in \LaTeX{}.
@@ -1370,7 +1447,7 @@ This work consists of the file gzt.dtx
% \end{macrocode}
% For the editorial.
% \begin{macrocode}
-\AtEndPreamble{
+\AddToHook{begindocument/before}{
\bool_if:NTF {\g_@@_special_edition_bool} {
\tl_const:Nn \c_@@_editorial_heading_string_tl {Avant-propos}
}{
@@ -1410,7 +1487,7 @@ This work consists of the file gzt.dtx
% \end{macrocode}
% For the front cover header text.
% \begin{macrocode}
-\AtEndPreamble{
+\AddToHook{begindocument/before}{
\tl_const:Nn \c_@@_frontcover_header_string_tl {
\bool_if:NT {\g_@@_special_edition_bool} {
\text_uppercase:n {\c_@@_long_special_edition_string_tl}
@@ -1436,21 +1513,25 @@ This work consists of the file gzt.dtx
% For the pdftitle text.
% \begin{macrocode}
\tl_const:Nn \c_@@_pdftitle_string_tl {
- \c_@@_journal_title_string_tl
- % \c_space_tl
- % \textendash{}
- % \c_space_tl
- % \l_@@_uppercased_date_format{\displaydate{@@_date}}
- \c_space_tl
- \textendash{}
- \c_space_tl
- N°
- \bool_if:NTF {\g_@@_special_edition_bool} {
- \c_@@_special_edition_string_tl
- \c_space_tl
- \g_@@_special_edition_title_tl
+ \bool_if:NTF {\g_@@_moral_report_bool} {
+ \c_@@_moralreport_rubric_string_tl
}{
- \int_use:N\g_@@_issue_number_int
+ \c_@@_journal_title_string_tl
+ % \c_space_tl
+ % \textendash{}
+ % \c_space_tl
+ % \l_@@_uppercased_date_format{\displaydate{@@_date}}
+ \c_space_tl
+ \textendash{}
+ \c_space_tl
+ N°
+ \bool_if:NTF {\g_@@_special_edition_bool} {
+ \c_@@_special_edition_string_tl
+ \c_space_tl
+ \g_@@_special_edition_title_tl
+ }{
+ \int_use:N\g_@@_issue_number_int
+ }
}
}
% \end{macrocode}
@@ -1620,15 +1701,19 @@ This work consists of the file gzt.dtx
\c_space_tl
\textcolor{@@_date_color}{
\textendash{}\c_space_tl
- \text_uppercase:n {\c_@@_journal_short_title_string_tl}
- \bool_if:nF { \g_@@_inside_frontcover_bool || \g_@@_backmatter_bool || {\int_compare_p:nNn {\g_@@_issue_number_int}={0}} }
- {
- \c_space_tl\textendash{}\c_space_tl
- \l_@@_uppercased_date_format\displaydate{@@_date}
- \bool_if:NF {\g_@@_special_edition_bool} {
- \c_space_tl
- \textendash{}\c_space_tl
- \textcolor{@@_smf_number_color}{\No\int_use:N\g_@@_issue_number_int}
+ \bool_if:NTF {\g_@@_moral_report_bool} {
+ \text_uppercase:n { \c_@@_moralreport_rubric_string_tl }
+ }{
+ \text_uppercase:n {\c_@@_journal_short_title_string_tl}
+ \bool_if:nF { \g_@@_inside_frontcover_bool || \g_@@_backmatter_bool || {\int_compare_p:nNn {\g_@@_issue_number_int}={0}} }
+ {
+ \c_space_tl\textendash{}\c_space_tl
+ \l_@@_uppercased_date_format\displaydate{@@_date}
+ \bool_if:NF {\g_@@_special_edition_bool} {
+ \c_space_tl
+ \textendash{}\c_space_tl
+ \textcolor{@@_smf_number_color}{\No\int_use:N\g_@@_issue_number_int}
+ }
}
}
}
@@ -1652,9 +1737,9 @@ This work consists of the file gzt.dtx
% For the prefix of the bibliographic key of each article.
% \begin{macrocode}
\bool_if:NTF {\g_@@_special_edition_bool} {
- \tl_const:Nn \c_@@_issue_bib_key_tl {\int_use:N \g_@@_issue_number_int}
-}{
\tl_const:Nn \c_@@_issue_bib_key_tl {special-edition}
+}{
+ \tl_const:Nn \c_@@_issue_bib_key_tl {\int_use:N \g_@@_issue_number_int}
}
% \end{macrocode}
% For the interview title.
@@ -2778,16 +2863,16 @@ This work consists of the file gzt.dtx
% a flag that will be used to test wheter we are inside such an environment or
% not.
% \begin{macrocode}
-\AtBeginEnvironment{multicols}{
+\AddToHook{env/multicols/begin}{
\bool_gset_true:N \g_@@_multicols_bool
}
-\AtEndEnvironment{multicols}{
+\AddToHook{env/multicols/end}{
\bool_gset_false:N \g_@@_multicols_bool
}
-\AtBeginEnvironment{refsection}{
+\AddToHook{env/refsection/begin}{
\bool_gset_true:N \g_@@_refsection_bool
}
-\AtEndEnvironment{refsection}{
+\AddToHook{env/refsection/end}{
\bool_gset_false:N \g_@@_refsection_bool
}
% \end{macrocode}
@@ -2856,7 +2941,7 @@ This work consists of the file gzt.dtx
\tl_gset:Nn \g_@@_pdfauthor_string_tl {
\g_@@_smf_string_tl
}
-\AtEndPreamble{%
+\AddToHook{begindocument/before}{%
\hypersetup{%
pdftitle=\g_@@_pdftitle_string_tl,
pdfauthor=\g_@@_pdfauthor_string_tl%
@@ -2864,38 +2949,6 @@ This work consists of the file gzt.dtx
}
% \end{macrocode}
%
-% \section{Database for the articles' authors}
-%
-% For this, and thanks to \Pkg{datatool}, we create a database of
-% \enquote{authors} of articles.
-% \begin{macrocode}
-\DTLnewdb{_@@_authors}
-% \end{macrocode}
-%
-% Then we create the internal "\_@@_authors" function that let us populate the
-% "_@@_authors" database. Each people will be identified by some identifiers:
-% \begin{itemize}
-% \item firstname and lastname, that should be at the biblatex name format
-% (\enquote{lastname, firstname}),
-% \item affiliation,
-% \item email,
-% \item minibio,
-% \item photo.
-% \end{itemize}
-%
-% \begin{macrocode}
-\cs_new_protected:Nn \_@@_authors:nnnnnn
- {
- \DTLnewrow{_@@_authors}%
- \DTLnewdbentry{_@@_authors}{first-last-name}{#1}%
- \DTLnewdbentry{_@@_authors}{affiliation}{#2}%
- \DTLnewdbentry{_@@_authors}{email}{#3}%
- \DTLnewdbentry{_@@_authors}{minibio}{#4}%
- \DTLnewdbentry{_@@_authors}{photo}{#5}%
- \DTLnewdbentry{_@@_authors}{webpage}{#6}%
- }
-% \end{macrocode}
-%
% \begin{macrocode}
\cs_new_protected:Nn \_@@_email:n
{
@@ -2903,12 +2956,6 @@ This work consists of the file gzt.dtx
}
% \end{macrocode}
%
-% We create a variant of this control sequence that passes the \emph{values} of the
-% variables involved (see \url{http://tex.stackexchange.com/a/214284/18401}).
-% \begin{macrocode}
-\cs_generate_variant:Nn \_@@_authors:nnnnnn { nVVVVV }
-% \end{macrocode}
-%
% We create a function that displays the author(s) of an article with
% a peticular layout.
% \begin{macrocode}
@@ -2951,39 +2998,6 @@ This work consists of the file gzt.dtx
\cs_generate_variant:Nn \@@_display_author:nnnnn { VVVVV }
% \end{macrocode}
%
-% \section{Database for the interviewees}
-%
-% For this, and thanks to \Pkg{datatool}, we create a database of
-% \enquote{interviewees} of articles.
-% \begin{macrocode}
-\DTLnewdb{_@@_interviewees}
-% \end{macrocode}
-%
-% Then we create the internal "\_@@_interviewees" function that let us populate the
-% "_@@_interviewees" database. Each people will be identified by some identifiers:
-% \begin{itemize}
-% \item firstname and lastname, that should be at the biblatex name format
-% (\enquote{lastname, firstname}),
-% \item minibio,
-% \item photo.
-% \end{itemize}
-%
-% \begin{macrocode}
-\cs_new_protected:Nn \_@@_interviewees:nnn
- {
- \DTLnewrow{_@@_interviewees}%
- \DTLnewdbentry{_@@_interviewees}{first-last-name}{#1}%
- \DTLnewdbentry{_@@_interviewees}{minibio}{#2}%
- \DTLnewdbentry{_@@_interviewees}{photo}{#3}%
- }
-% \end{macrocode}
-%
-% We create a variant of this control sequence that passes the \emph{values} of the
-% variables involved (see \url{http://tex.stackexchange.com/a/214284/18401}).
-% \begin{macrocode}
-\cs_generate_variant:Nn \_@@_interviewees:nnn { nVV }
-% \end{macrocode}
-%
% \section{Functions for specifiying the people involved in the journal}
%
% For this, and thanks to \Pkg{datatool}, we create a database of
@@ -3054,7 +3068,9 @@ This work consists of the file gzt.dtx
\cs_new_protected:Nn \@@_display_academic_signature:n
{
\bigskip
+ \begin{_@@_minibiographies_acknowledgements_tcbox}
#1
+ \end{_@@_minibiographies_acknowledgements_tcbox}
}
% \end{macrocode}
%
@@ -3066,7 +3082,7 @@ This work consists of the file gzt.dtx
\cs_new_protected:Nn \@@_display_people_by_role:n
{
\DTLforeach*[\DTLiseq{\l_@@_people_role_tl}{#1}]{people}{%
- \l_@@_firstlastname=first-last-name%
+ \l_@@_firstlastname_tl=first-last-name%
,\l_@@_people_affiliation_tl=affiliation%
,\l_@@_people_email_tl=email%
,\l_@@_people_minibio_tl=minibio%
@@ -3088,26 +3104,29 @@ This work consists of the file gzt.dtx
\newline%
\href{mailto:\l_@@_people_email_tl}{\nolinkurl{\l_@@_people_email_tl}}%
}
- \DTLiflastrow{%
- }{%
- \medskip%
- }
+ \medskip%
}{
\tl_if_in:NnTF \l_@@_people_role_tl { author } {
- \footnotesize%
- % \noindent%
- \dim_set:Nn \l_@@_minibio_width_dim {\linewidth-1em - \c_@@_authors_photos_box_width_dim}
- \tl_if_empty:NTF \l_@@_people_photo_tl
- {%
- \dim_add:Nn \l_@@_minibio_width_dim {\c_@@_authors_photos_box_width_dim}
- }{%
- \begin{adjustbox}{valign=t,minipage=\c_@@_authors_photos_box_width_dim}
- \includegraphics[width=\c_@@_authors_photos_width_dim]{\l_@@_people_photo_tl}
- \end{adjustbox}%
- \quad%
- }
- \begin{adjustbox}{valign=t,minipage=\l_@@_minibio_width_dim}
- \begin{description}[leftmargin=1em,style=nextline]
+ \tl_if_empty:NF \l_@@_firstlastname_tl {
+ \footnotesize%
+ % \noindent%
+ \DTLiffirstrow{%
+ }{
+ \DTLpar%
+ \medskip%
+ }
+ \dim_set:Nn \l_@@_minibio_width_dim {\linewidth-1em - \c_@@_authors_photos_box_width_dim}
+ \tl_if_empty:NTF \l_@@_people_photo_tl
+ {%
+ \dim_add:Nn \l_@@_minibio_width_dim {\c_@@_authors_photos_box_width_dim}
+ }{%
+ \begin{adjustbox}{valign=t,minipage=\c_@@_authors_photos_box_width_dim}
+ \includegraphics[width=\c_@@_authors_photos_width_dim]{\l_@@_people_photo_tl}
+ \end{adjustbox}%
+ \quad%
+ }
+ \begin{adjustbox}{valign=t,minipage=\l_@@_minibio_width_dim}
+ \begin{description}[leftmargin=1em,style=nextline]
\item[%
\textcolor{@@_people_color}{%
\_@@_citeauthor_no_firstinits:n {\c_@@_issue_bib_key_tl -#1- \exp_not:V\DTLcurrentindex}%
@@ -3138,10 +3157,6 @@ This work consists of the file gzt.dtx
}
\end{description}
\end{adjustbox}
- \DTLiflastrow{%
- }{
- \DTLpar%
- \medskip%
}
}{
\_@@_citeauthor_no_firstinits:n {\c_@@_issue_bib_key_tl -#1-
@@ -3344,7 +3359,7 @@ This work consists of the file gzt.dtx
\bool_if:NT {\g_@@_credit_frontcover_bool} {
\c_space_tl(\c_@@_credit_frontcover_string_tl{}~:~%
\DTLforeach*[\DTLiseq{\l_@@_people_role_tl}{frontcovercredit}]{people}{%
- \l_@@_firstlastname=first-last-name%
+ \l_@@_firstlastname_tl=first-last-name%
,\l_@@_people_role_tl=role%
}{%
\_@@_citeauthor_no_firstinits:n
@@ -3610,6 +3625,18 @@ This work consists of the file gzt.dtx
}
% \end{macrocode}
%
+% \subsection{Moral report setup}
+%
+% \begin{macro}{\moralreportsetup}
+% We define the command that lets the user specify the moral report setup.
+% \begin{macrocode}
+\NewDocumentCommand \moralreportsetup { m } {
+ \bool_gset_true:N \g_@@_moral_report_bool
+ \bool_gset_true:N \g_@@_frontcover_without_minitoc_bool
+ \keys_set:nn { gzt/moralreport } {#1}
+}
+% \end{macrocode}
+%
% \subsection{Journal setup}
%
% \begin{macro}{\journalsetup}
@@ -3735,7 +3762,7 @@ This work consists of the file gzt.dtx
% This can be done only at the beginning of the document, in order to know the
% characteristics of the current issue.
% \begin{macrocode}
-\AtBeginDocument{%
+\AddToHook{begindocument}{%
% \end{macrocode}
%
% We first create a token list containing the date of the current issue formated
@@ -3894,10 +3921,10 @@ This work consists of the file gzt.dtx
% \end{macrocode}
%
% \begin{macrocode}
-\tl_new:N \g_@@_article_acknowledgements_tl%
+\tl_new:N \l_@@_article_acknowledgements_tl%
\cs_new_protected:Nn \@@_article_acknowledgements:n
{
- \tl_gset:Nn \g_@@_article_acknowledgements_tl { #1 }
+ \tl_set:Nn \l_@@_article_acknowledgements_tl { #1 }
}
% \end{macrocode}
%
@@ -4048,6 +4075,30 @@ This work consists of the file gzt.dtx
%<*class|class-article>
% \end{macrocode}
%
+% We create a command for local (to a given article) tables of contents
+% \begin{macrocode}
+\cs_new_protected:Nn \_@@_display_localtoc:
+{
+ \etocsettocstyle{\section*{\contentsname}}{}%
+ \etocsetstyle {section}
+ {}
+ {\leavevmode\leftskip 0cm\relax}
+ {\bfseries\normalsize\makebox[.6cm][l]{\etocnumber}%
+ \etocname\nobreak\hfill\nobreak%
+ \makebox[.5cm][r]{%
+ \etocpage%
+ }%
+ \par%
+ }
+ {\medskip}
+ \localtableofcontentswithrelativedepth{+1}
+}
+\NewDocumentCommand \gztlocaltableofcontents {}
+{
+ \_@@_display_localtoc: {}
+}
+% \end{macrocode}
+%
% We create two token lists that will contain:
% \begin{enumerate}
% \item the unique bibliographic key,
@@ -4544,7 +4595,7 @@ This work consists of the file gzt.dtx
% We load the file where acronyms are defined.
% \begin{macrocode}
\file_if_exist:nT { \c_@@_acronyms_file_string_tl } {%
- \AtEndPreamble{\loadglsentries{\c_@@_acronyms_file_string_tl}}
+ \AddToHook{begindocument/before}{\loadglsentries{\c_@@_acronyms_file_string_tl}}
}
% \end{macrocode}
%
@@ -4563,7 +4614,7 @@ This work consists of the file gzt.dtx
% \begin{macrocode}
\bool_if:nT { \g_@@_for_authors_bool }
{
- \AtEndDocument{%
+ \AddToHook{enddocument}{%
\bool_if:NT {\g_@@_multicols_bool} {
\end{multicols}%
}
@@ -4577,7 +4628,7 @@ This work consists of the file gzt.dtx
% at the end of preamble instead of begin of the document in order some settings
% needed in preamble are taken in account.
% \begin{macrocode}
-\AtEndPreamble{
+\AddToHook{begindocument/before}{
\file_if_exist_input:nF {\c_@@_configuration_file_string_tl}
{
\msg_error:nn { gzt } { configuration-file-missing }
@@ -4757,7 +4808,7 @@ This work consists of the file gzt.dtx
\_@@_citeauthor_no_firstinits:n {\c_@@_issue_bib_key_tl -editorinchief- 1}
}{
\DTLforeach*[\DTLiseq{\l_@@_people_role_tl}{editorinchief}]{people}{%
- \l_@@_firstlastname=first-last-name%
+ \l_@@_firstlastname_tl=first-last-name%
,\l_@@_people_role_tl=role%
}{%
\_@@_citeauthor_no_firstinits:n {\c_@@_issue_bib_key_tl -editorinchief- \exp_not:V\DTLcurrentindex}%
@@ -4775,7 +4826,7 @@ This work consists of the file gzt.dtx
}
\_@@_after_display_editorial: {}
}
-\AtEndPreamble{%
+\AddToHook{begindocument/before}{%
\tl_set_eq:NN \g_@@_editorial_heading_tl \c_@@_editorial_heading_string_tl
\bool_if:NT {\g_@@_special_edition_bool} {
\tl_if_empty:NF \g_@@_special_edition_editorial_heading_tl {%
@@ -4985,7 +5036,7 @@ This work consists of the file gzt.dtx
% \end{itemize}
%
% \begin{macrocode}
-\AtBeginDocument{%
+\AddToHook{begindocument}{%
\graphicspath{{\c_@@_issue_images_path_string_tl//}{../\c_@@_issue_images_path_string_tl//}}
% \glsdisablehyper
\g_@@_mainmatter_switch_tl
@@ -5006,7 +5057,7 @@ This work consists of the file gzt.dtx
% \end{macrocode}
%
% \begin{macrocode}
-\AtBeginDocument{%
+\AddToHook{begindocument}{%
\dim_if_exist:NTF \g_@@_pagegrid_dim {%
\pagegridsetup{%
enable,%
@@ -5040,7 +5091,7 @@ This work consists of the file gzt.dtx
\bool_if:NF {\g_@@_inside_pages_bool} {
\g_@@_display_frontcover_tl
\bool_if:NTF {\g_@@_coverpage_bool} {
- \AfterEndPreamble{\end{document}}
+ \AddToHook{begindocument/end}{\end{document}}
}{
\g_@@_display_inside_frontcover_tl
}
@@ -5603,7 +5654,7 @@ This work consists of the file gzt.dtx
%
% We draw a gray background at the bottom of each page, but the first one.
% \begin{macrocode}
-\AddEverypageHook{%
+\AddToHook{shipout/background}{
%<class> \bool_if:nF { \g_@@_frontcover_bool || \g_@@_backcover_bool }{
\bool_if:NF {\g_@@_advertisement_bool} {
\tikz[remember~picture,overlay] { \g_@@_background_footer_tl }%
@@ -5697,31 +5748,23 @@ This work consists of the file gzt.dtx
\FloatBarrier%
\begin{_@@_minibiographies_acknowledgements_tcbox}
\@@_display_people_by_role:n { author-art-\int_use:N \g_@@_articles_int }
- \tl_if_empty:NF \g_@@_article_acknowledgements_tl
+ \DTLsavelastrowcount{\_@@_authors_number}
+ \tl_if_empty:NF \l_@@_article_acknowledgements_tl
{%
- \par%
- \bigskip%
+ \footnotesize
+ \int_compare:nNnT {\_@@_authors_number}>{0}
+ {
+ \par%
+ \bigskip%
+ }
\begin{adjustbox}{valign=t,minipage=\linewidth}
\color{@@_acknowledgements_color}%
- \g_@@_article_acknowledgements_tl
+ \setlength{\parskip}{\c_@@_mainmatter_parskip_skip}
+ \l_@@_article_acknowledgements_tl
\end{adjustbox}
- }
+ }
+ \bool_gset_true:N \g_@@_previous_article_with_bibliography_or_minibio_bool
\end{_@@_minibiographies_acknowledgements_tcbox}
- \bool_gset_true:N \g_@@_previous_article_with_bibliography_or_minibio_bool
- %
- \tl_gclear:N \g_@@_people_affiliation_tl
- \tl_gclear:N \g_@@_people_email_tl
- \tl_gclear:N \g_@@_people_minibio_tl
- \tl_gclear:N \g_@@_people_photo_tl
- \tl_gclear:N \g_@@_people_webpage_tl
- \tl_gclear:N \g_@@_article_acknowledgements_tl
-% \end{macrocode}
-%
-% We clear the authors database for this new article (XXX: to be moved to the
-% authors' minibiographies area).
-% \begin{macrocode}
- \DTLgcleardb{_@@_authors}
- \DTLgcleardb{_@@_interviewees}
}
% \end{macrocode}
% \end{macro}
@@ -6240,7 +6283,12 @@ This work consists of the file gzt.dtx
inputencoding=utf8/latin1
}%
\DeclareTotalTCBox{\gztverb}{ v }{verbatim,blank,fuzzy~halo=0pt~with~@@_light_generic_dark_color!8}{#1}
-\NewTCBListing{gztcode}{ O{} }{%
+% \end{macrocode}
+%
+% The optional argument declaration must be prefixed with an "!" (see
+% \url{https://github.com/T-F-S/tcolorbox/issues/43}).
+% \begin{macrocode}
+\NewTCBListing{gztcode}{ !O{} }{%
listing~style=@@_lst_style,
listing~only,
enlarge~top~by=\medskipamount,
@@ -6420,6 +6468,12 @@ This work consists of the file gzt.dtx
% "multicols" environments.
% \begin{macrocode}
\NewDocumentCommand \gztinput { m m } {%
+ \tl_gclear:N \g_@@_people_affiliation_tl
+ \tl_gclear:N \g_@@_people_email_tl
+ \tl_gclear:N \g_@@_people_minibio_tl
+ \tl_gclear:N \g_@@_people_photo_tl
+ \tl_gclear:N \g_@@_people_webpage_tl
+ \tl_clear:N \l_@@_article_acknowledgements_tl
\startcustomization%
\bool_if:NF {\g_@@_refsection_bool} {
\begin{refsection}
@@ -6445,12 +6499,13 @@ This work consists of the file gzt.dtx
% If we don't ask the cover page (only), the inside back cover and back cover
% pages are automatically included at the end of the document, the former
% containing some condensed instructions to authors. But, this cannot be done
-% within "\AtEndDocument" and "\preto\@enddocumenthook" should be used instead
-% (see \url{http://tex.stackexchange.com/q/240318/18401}).
+% within "\AddToHook{enddocument}" and "\preto\@enddocumenthook" should be used instead
+% (see \url{http://tex.stackexchange.com/q/240318/18401}). (Update (2021-02-14):
+% we now rely on the new ×\AddToHook{env/document/end}×.)
% \begin{macrocode}
\bool_if:NF {\g_@@_coverpage_bool} {
\bool_if:NF {\g_@@_inside_pages_bool} {
- \preto\@enddocumenthook{
+ \AddToHook{enddocument/end}{
\bool_gset_true:N \g_@@_backmatter_bool
\g_@@_display_inside_backcover_tl
\newpage
@@ -6468,7 +6523,7 @@ This work consists of the file gzt.dtx
\bool_if:NF {\g_@@_coverpage_bool} {
\bool_if:nF { \g_@@_for_authors_bool } {
\bool_if:nT { \g_@@_inside_pages_bool } {
- \AtEndDocument{%
+ \AddToHook{enddocument}{%
\prg_replicate:nn
{ \int_mod:nn { 4 - \int_mod:nn { \getpagerefnumber{LastPage} } { 4 } } { 4 } }
{ \thispagestyle{@@_blank_pages_ps}\null\clearpage }
@@ -6487,33 +6542,11 @@ This work consists of the file gzt.dtx
% \end{macrocode}
%
% \begin{macrocode}
-\keys_define:nn { gztarticle }
-{
- editorial .code:n = {%
- \AtBeginDocument{%
- \_@@_before_display_editorial:n {}%
- }
- \AtEndDocument{%
- \_@@_after_display_editorial: {}%
- }
- },%
- presidentmessage .code:n = {%
- \AtBeginDocument{%
- \_@@_before_display_presidentmessage: {}%
- }
- \AtEndDocument{%
- \_@@_after_display_presidentmessage: {}%
- }
- },%
-}%
-% \end{macrocode}
-%
-% \begin{macrocode}
\ProcessKeysOptions { gztarticle }
% \end{macrocode}
%
% \begin{macrocode}
-\AtEndDocument{%
+\AddToHook{enddocument}{%
\bool_if:NT {\g_@@_multicols_bool} {
\end{multicols}%
}
@@ -6765,7 +6798,7 @@ This work consists of the file gzt.dtx
enlarge~left~by=\c_@@_inside_cover_offset_dim,
}
}
-\AtEndPreamble{%
+\AddToHook{begindocument/before}{%
\bool_if:NTF {\g_@@_special_edition_bool} {
\tcbset{
_@@_tcb_inside_frontcover_style/.append~style={%
@@ -6981,7 +7014,7 @@ This work consists of the file gzt.dtx
\tl_clear:N \l_@@_newtheorem_frenchtitle_tl
\tl_clear:N \l_@@_newtheorem_englishtitle_tl
\tl_set:Nn \l_@@_newtheorem_englishtitle_tl {
- \text_uppercase:n {#2}
+ \text_titlecase:n {#2}
}
\tl_set:Nf \l_@@_newtheorem_frenchtitle_tl {
\l_@@_newtheorem_englishtitle_tl
@@ -7368,6 +7401,72 @@ class will be replace them by a dummy image (borrowed from the `mwe` package).
% \end{macrocode}
%
% \begin{macrocode}
+%<*changelog>
+% \end{macrocode}
+# [Unreleased]
+
+# [1.0.1] - 2021-02-14
+
+## Added
+- Option to create moral reports (`gzt` class only).
+- Local (to a given article) table of contents
+
+## Changed
+- The class now relies on the new LaTeX core hooks.
+- Documentation revised.
+- Various improvements.
+
+## Fixed
+- Superflous uppercases removed (cont.).
+- `gztcode` environments partially gobble their content under certain
+ conditions.
+- Various other small bugs.
+
+# [1.0.0] - 2020-03-17
+
+## Added
+- CHANGELOG file (following https://keepachangelog.com/en/1.0.0/).
+- Semantic versionning (following https://semver.org/).
+
+## Changed
+- Compilation date displayed only if the issue number is not specified
+ (`gztarticle` class only).
+- Prevent column breaks within items of "Comité de rédaction" (at the price of
+ unbalanced columns).
+
+## Fixed
+- Track changes in `expl3`.
+- Superflous uppercases removed.
+- Index directive in `latexmk` config file modernized.
+
+# [0.98] - 2018-04-09
+
+## Changed
+- Support for `biblatex` 3.8 changes.
+- Track changes in `expl3`.
+- Special editions implemented.
+
+## Fixed
+- Several bug fixes.
+
+# [0.96] - 2017-04-07
+
+## Changed
+- Figures and tables:
+ - with recurrent label and number but without any caption,
+ - with caption but without any recurrent label nor numbered,
+ implemented.
+- Frames without any label, number nor caption implemented.
+- Track changes in `expl3`.
+
+# [0.9] - 2015-05-02
+
+- Initial CTAN release of the `gzt` bundle.
+% \begin{macrocode}
+%</changelog>
+% \end{macrocode}
+%
+% \begin{macrocode}
%<*latexmkrc>
% \end{macrocode}
%
@@ -7384,7 +7483,7 @@ sub makeglossaries{
system( "makeglossaries \"$_[0]\"" );
}
-$makeindex = 'texindy -L french;
+$makeindex = 'texindy -L french -C utf8';
push @generated_exts, 'acn', 'acr', 'alg', 'bcf', 'fls', 'gl*', 'sbl*', 'sl*', 'sym*' ;
@@ -7405,8 +7504,7 @@ $quote_filenames = 0;
% \Finale
%%% Local Variables:
-%%% mode: tex
-%%% eval: (doctex-mode)
+%%% mode: doctex
%%% ispell-local-dictionary: "english"
%%% TeX-command-default: "TeX"
%%% TeX-master: t
diff --git a/Master/texmf-dist/source/latex/hausarbeit-jura/hausarbeit-jura.dtx b/Master/texmf-dist/source/latex/hausarbeit-jura/hausarbeit-jura.dtx
index c9f5cd43234..8a45c03f31f 100644
--- a/Master/texmf-dist/source/latex/hausarbeit-jura/hausarbeit-jura.dtx
+++ b/Master/texmf-dist/source/latex/hausarbeit-jura/hausarbeit-jura.dtx
@@ -26,7 +26,7 @@ See http://www.latex-project.org/lppl.txt
\postamble
Originally developed by Martin Sievers (martin.sievers@schoenerpublizieren.de)
-Copyright (C) 2012-2019 by Martin Sievers
+Copyright (C) 2012-2020 by Martin Sievers
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License (LPPL), either
@@ -73,7 +73,7 @@ This work consists of the file hausarbeit-jura.dtx
%</internal>
%<*driver>
\ProvidesFile{hausarbeit-jura.dtx}%
-[2019/04/04 v2.0 A class for writing ``juristische Hausarbeiten'' at German
+[2020/08/06 v2.1 A class for writing ``juristische Hausarbeiten'' at German
universities]
\documentclass[a4paper]{ltxdoc}
\usepackage[english,ngerman]{babel}
@@ -166,6 +166,7 @@ universities]
% \cs{setspaceafterchapter}, \cs{setspacebeforesection} and
% \cs{setspaceaftersection} for an easy modification of spacings.}
% \changes{v2.0}{2018/08/21}{Added options for font size selection}
+% \changes{v2.1}{2020/08/06}{Resolve issue with \pkg{latexrelease} and \pkg{textcomp}}
%
% \GetFileInfo{\jobname.dtx}
% \DoNotIndex{\newcommand,\newenvironment}
@@ -678,7 +679,6 @@ universities (ao, ms)]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{jurabook}}
\ProcessOptions\relax
\RequirePackage{iftex}
-\IfFileExists{latexrelease.sty}{\RequirePackage[2018/01/01]{latexrelease}}{}%
\LoadClass[a4paper,oneside,showpagenumber,classiclayout]{jurabook}%
[2007/11/09 V0.91 (beta) juridical books (AS)]
\if@fontbp
@@ -697,21 +697,21 @@ universities (ao, ms)]
\normalsize
\fi%
\ifPDFTeX
- \RequirePackage{inputenc}
- \RequirePackage[T1]{fontenc}
- \if@texgyre
- \usepackage{tgtermes}
- \usepackage[matchlowercase]{tgheros}
- \usepackage[matchlowercase]{tgcursor}
- \else
- \usepackage{mathptmx}
- \usepackage[scaled=0.91]{helvet}
- \usepackage{courier}
- \fi%
- \RequirePackage{textcomp}
- \RequirePackage{eurosym}
- \let\texteuro\euro
- \DeclareInputText{128}{\,\euro}
+ \RequirePackage{inputenc}
+ \RequirePackage[T1]{fontenc}
+ \if@texgyre
+ \usepackage{tgtermes}
+ \usepackage[matchlowercase]{tgheros}
+ \usepackage[matchlowercase]{tgcursor}
+ \else
+ \usepackage{mathptmx}
+ \usepackage[scaled=0.91]{helvet}
+ \usepackage{courier}
+ \fi%
+ \RequirePackage{textcomp}
+ \RequirePackage{eurosym}
+ \let\texteuro\euro
+ \DeclareUnicodeCharacter{20AC}{\unspace\,\euro}
\else%
\RequirePackage{fontspec}
\setmainfont{Times New Roman}
diff --git a/Master/texmf-dist/source/latex/hausarbeit-jura/hausarbeit-jura.ins b/Master/texmf-dist/source/latex/hausarbeit-jura/hausarbeit-jura.ins
index acd46acec67..ab5a7e730b8 100644
--- a/Master/texmf-dist/source/latex/hausarbeit-jura/hausarbeit-jura.ins
+++ b/Master/texmf-dist/source/latex/hausarbeit-jura/hausarbeit-jura.ins
@@ -14,7 +14,7 @@ See http://www.latex-project.org/lppl.txt
\postamble
Originally developed by Martin Sievers (martin.sievers@schoenerpublizieren.de)
-Copyright (C) 2012-2019 by Martin Sievers
+Copyright (C) 2012-2020 by Martin Sievers
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License (LPPL), either
diff --git a/Master/texmf-dist/source/latex/hecthese/hecthese-en.ins b/Master/texmf-dist/source/latex/hecthese/hecthese-en.ins
index 87da5eee4ca..3d31507f8ce 100644
--- a/Master/texmf-dist/source/latex/hecthese/hecthese-en.ins
+++ b/Master/texmf-dist/source/latex/hecthese/hecthese-en.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright 2017-2019 HEC Montréal
+%% Copyright 2017-2020 HEC Montréal
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -19,7 +19,7 @@
This is a stripped version of the original file.
-Copyright 2017-2019 HEC Montreal
+Copyright 2017-2020 HEC Montreal
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
@@ -85,7 +85,7 @@ and the derived files listed in the README file.
\obeyspaces
\Msg{*********************************************************}
-\Msg{* hecthese document class v1.3.2 *}
+\Msg{* hecthese document class v1.4 *}
\Msg{* *}
\Msg{* hecthese document class has been installed and is *}
\Msg{* ready for use. Read the hecthese.pdf file to learn *}
diff --git a/Master/texmf-dist/source/latex/hecthese/hecthese-fr.ins b/Master/texmf-dist/source/latex/hecthese/hecthese-fr.ins
index 5c72435aeac..4a036fb0c6c 100644
--- a/Master/texmf-dist/source/latex/hecthese/hecthese-fr.ins
+++ b/Master/texmf-dist/source/latex/hecthese/hecthese-fr.ins
@@ -19,7 +19,7 @@
This is a stripped version of the original file.
-Copyright 2017-2019 HEC Montreal
+Copyright 2017-2020 HEC Montreal
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
@@ -85,7 +85,7 @@ and the derived files listed in the README file.
\obeyspaces
\Msg{*********************************************************}
-\Msg{* Classe hecthese v1.3.2 *}
+\Msg{* Classe hecthese v1.4 *}
\Msg{* *}
\Msg{* La classe hecthese est installee et prete a l'emploi. *}
\Msg{* Consultez le document hecthese.pdf afin de prendre *}
diff --git a/Master/texmf-dist/source/latex/hecthese/hecthese.dtx b/Master/texmf-dist/source/latex/hecthese/hecthese.dtx
index 49e80e33f52..c27db40e298 100644
--- a/Master/texmf-dist/source/latex/hecthese/hecthese.dtx
+++ b/Master/texmf-dist/source/latex/hecthese/hecthese.dtx
@@ -1,6 +1,6 @@
% \iffalse
%
-% Copyright 2017-2019 HEC Montreal
+% Copyright 2017-2020 HEC Montreal
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -25,7 +25,7 @@
\ProvidesFile{hecthese.dtx}
%</dtx>
%<class>\NeedsTeXFormat{LaTeX2e}
-%<class>\ProvidesClass{hecthese}[2019/03/25 v1.3.2 Class for dissertations and theses at HEC Montreal]
+%<class>\ProvidesClass{hecthese}[2020/08/24 v1.4 Class for dissertations and theses at HEC Montreal]
%<*driver>
\documentclass[10pt,english,french]{ltxdoc}
\usepackage[utf8]{inputenc}
@@ -66,7 +66,7 @@
colorlinks=true,
allcolors=liens,
pdftitle={Guide d'utilisation de la classe hecthese},
- pdfauthor={Benoit Hamel, HEC Montréal}
+ pdfauthor={Benoit Hamel, HEC Montr\'{e}al}
}
\ifnum\frenchdoc=1
@@ -86,14 +86,14 @@
\newcommand{\non}{\color{red}\faBan}
\newcommand{\hectheseTitre}{%
\ifnum\frenchdoc=1
- {\hecthese} : la classe {\LaTeX} pour les thèses et mémoires de HEC Montréal
+ {\hecthese} : la classe {\LaTeX} pour les th\`{e}ses et m\'{e}moires de HEC Montr\'{e}al
\else
- \hecthese: the \LaTeX\ document class for dissertations and theses at HEC Montréal
+ \hecthese: the \LaTeX\ document class for dissertations and theses at HEC Montr\'{e}al
\fi
}
\newcommand{\biblio}{%
\ifnum\frenchdoc=1
- Bibliothèque
+ Biblioth\`{e}que
\else
Library
\fi
@@ -125,51 +125,53 @@
\end{document}
%</driver>
% \fi
-% \CheckSum{511}
+% \CheckSum{574}
% \DoNotIndex{\RequirePackage,\ExecuteOptions,\ifthenelse,\ProcessOptions}
% \DoNotIndex{\newcommand,\newcommand*,\newboolean,\setboolean}
% \DoNotIndex{\emph,\cite,\LaTeX,\hecthese,\textbf,\item,\footnote}
% \DoNotIndex{\label,\ref,\caption,\hline,\multicolumn,\oui,\non,\cmd}
% \DoNotIndex{\dots,\url,\clearpage,\bibitem}
% \DoNotIndex{\hectheseTitre,\biblio}
+% \changes{1.4}{2020-08-24}{Beaucoup de corrections de bogues et de mises \`{a} jour (voir d\'{e}p\^{o}t Git). /
+% Lots of bug fixes and updates (see Git repository).}
% \changes{1.3.2}{2019-03-25}{Coquille dans la dtx et changement du lien vers le gabarit anglais pour MacOS.}
% \changes{1.3.1}{2019-02-11}{Ajout d'une note pour les utilisateurs de MacOS en ce qui concerne
% l'installation de la classe. / Added a note to MacOS users concerning the class installation.}
-% \changes{1.3}{2018-04-27}{Première version bilingue de la classe / First bilingual version of the class}
-% \changes{1.2}{2017-11-29}{Mise à jour des liens vers les capsules vidéos dans
+% \changes{1.3}{2018-04-27}{Premi\`{e}re version bilingue de la classe / First bilingual version of the class}
+% \changes{1.2}{2017-11-29}{Mise \`{a} jour des liens vers les capsules vid\'{e}os dans
% la documentation.}
% \changes{1.1}{2017-10-20}{Uniformisation de la licence lppl dans tous les fichiers.
-% Ajout de liens vers des capsules vidéos dans la documentation.}
-% \changes{1.0}{2017-10-06}{Première version de production lancée publiquement.
-% Ajout du préfixe HEC à toutes les commandes publiques. Révision,
-% correction et augmentation de la documentation. Ajout des sections non numérotées
-% "mots clés" et "méthodes de recherche" dans le résumé et l'abstract. Prise en charge
-% de l'anglais pour les intitulés de chapitres et sections. Correction du bogue d'affichage
-% des citations "hors articles" dans les thèses et mémoires par articles.}
-% \changes{0.4.1}{2017-06-08}{Ajout d'une condition pour vérifier la présence du sous-titre
+% Ajout de liens vers des capsules vid\'{e}os dans la documentation.}
+% \changes{1.0}{2017-10-06}{Premi\`{e}re version de production lanc\'{e}e publiquement.
+% Ajout du pr\'{e}fixe HEC \`{a} toutes les commandes publiques. R\'{e}vision,
+% correction et augmentation de la documentation. Ajout des sections non num\'{e}rot\'{e}es
+% "mots cl\'{e}s" et "m\'{e}thodes de recherche" dans le r\'{e}sum\'{e} et l'abstract. Prise en charge
+% de l'anglais pour les intitul\'{e}s de chapitres et sections. Correction du bogue d'affichage
+% des citations "hors articles" dans les th\`{e}ses et m\'{e}moires par articles.}
+% \changes{0.4.1}{2017-06-08}{Ajout d'une condition pour v\'{e}rifier la pr\'{e}sence du sous-titre
% dans la mise en forme de la page d'identification du jury.}
% \changes{0.4}{2017-06-01}{Retrait de la section «Mise en garde» de la documentation et
-% ajout de l'encadré «Phase de tests de la version bêta. Lancement du package pour fins
+% ajout de l'encadr\'{e} «Phase de tests de la version b\^{e}ta. Lancement du package pour fins
% de tests.}
% \changes{0.3}{2017-05-29}{Retrait du package +mathptmx+ des packages requis par la classe.
% Ajout du choix de polices entre +mathptmx+ et +mathpazo+ dans les gabarits. Ajout des
-% sections «Rédaction» et «Compilation» dans la documentation.}
-% \changes{0.2}{2017-05-18}{Première version bêta lancée pour les tests usagers}
+% sections «R\'{e}daction» et «Compilation» dans la documentation.}
+% \changes{0.2}{2017-05-18}{Premi\`{e}re version b\^{e}ta lanc\'{e}e pour les tests usagers}
% \title{\hectheseTitre}
-% \author{Benoit Hamel, \biblio, HEC Montréal}
+% \author{Benoit Hamel, \biblio, HEC Montr\'{e}al}
% \date{\today}
% \maketitle
%
% \begin{abstract}
% \ifnum\frenchdoc=1
-% La classe {\LaTeX} {\hecthese} a été conçue pour permettre aux étudiants de HEC Montréal
-% de rédiger leur thèse ou leur mémoire à l'aide du système de préparation de documents tout
-% en se conformant aux règles de présentation en vigueur à l'École. À ce titre, la classe
-% répond en tous points aux normes de présentation énoncées dans le
-% \emph{Guide pour la rédaction d'un travail universitaire de 1er, 2e et 3e cycles}\cite{guideRedaction}, ci-après
-% nommé le \emph{Guide de rédaction}.
+% La classe {\LaTeX} {\hecthese} a \'{e}t\'{e} con\c{c}ue pour permettre aux \'{e}tudiants de HEC Montr\'{e}al
+% de r\'{e}diger leur th\`{e}se ou leur m\'{e}moire \`{a} l'aide du syst\`{e}me de pr\'{e}paration de documents tout
+% en se conformant aux r\`{e}gles de pr\'{e}sentation en vigueur \`{a} l'\'{E}cole. \`{A} ce titre, la classe
+% r\'{e}pond en tous points aux normes de pr\'{e}sentation \'{e}nonc\'{e}es dans le
+% \emph{Guide pour la r\'{e}daction d'un travail universitaire de 1er, 2e et 3e cycles}\cite{guideRedaction}, ci-apr\`{e}s
+% nomm\'{e} le \emph{Guide de r\'{e}daction}.
% \else
-% The \hecthese\ \LaTeX\ document class has been created to allow graduate students at HEC Montréal
+% The \hecthese\ \LaTeX\ document class has been created to allow graduate students at HEC Montr\'{e}al
% to write their dissertation or thesis with the document preparation system while complying to all
% presentation standards required by the University. As such, the class complies entirely with the
% \emph{Guidelines for Writing an Academic Work at a Graduate Level}\cite{guidelines},
@@ -180,7 +182,7 @@
% \ifnum\frenchdoc=1
% \section{Installation de la classe}
%
-% \subsection{Prérequis}
+% \subsection{Pr\'{e}requis}
% \else
% \section{Installing the class}
%
@@ -188,13 +190,14 @@
% \fi
%
% \ifnum\frenchdoc=1
-% L'utilisation de cette classe suppose que vous avez déjà installé une distribution TeX et
-% un éditeur de code intégré. Pour la conception de {\hecthese}, la distribution TeXLive 2016\cite{texlive}
-% et l'éditeur de code TeXStudio\cite{texstudio} ont été utilisés et ses fonctionnalités ont
-% été testées avec les compilateurs +latex+, +pdflatex+, +bibtex+ et +makeindex+. La classe
-% a également été testée avec la distribution MiK\TeX\footnote{Un immense merci à Franck Jeannot pour avoir effectué ces tests!}.
-% Nous vous invitons à la tester avec vos propres distributions TeX et
-% éditeurs de codes et à l'utiliser de la même manière dont vous vous servez de vos outils pour vos
+% L'utilisation de cette classe suppose que vous avez d\'{e}j\`{a} install\'{e} une distribution TeX et
+% un \'{e}diteur de code int\'{e}gr\'{e}. Pour la conception de {\hecthese}, la distribution TeXLive 2016\cite{texlive}
+% et l'\'{e}diteur de code TeXStudio\cite{texstudio} ont \'{e}t\'{e} utilis\'{e}s et ses fonctionnalit\'{e}s ont
+% \'{e}t\'{e} test\'{e}es avec les compilateurs +latex+, +pdflatex+, +bibtex+ et +makeindex+. La classe
+% a \'{e}galement \'{e}t\'{e} test\'{e}e avec la distribution MiK\TeX\footnote{Un immense merci \`{a} Franck Jeannot pour avoir effectu\'{e} ces tests!},
+% de même qu'avec les versions 2017 à 2019 de TeXLive.
+% Nous vous invitons \`{a} la tester avec vos propres distributions TeX et
+% \'{e}diteurs de codes et \`{a} l'utiliser de la m\^{e}me mani\`{e}re dont vous vous servez de vos outils pour vos
% autres travaux en {\LaTeX}.
% \else
% The use of this document class presumes that you have already installed a \TeX\ distribution and
@@ -202,7 +205,7 @@
% and the \TeX Studio code editor\cite{texstudio} were used. Its features were tested with the
% +latex+, +pdflatex+, +bibtex+ and +makeindex+ compilers. The class has also been tested with the
% MiK\TeX\ distribution\footnote{A big ``thank you!'' goes to Franck Jeannot for making the tests.}
-% and WinEdt code editor.
+% and WinEdt code editor, as well as with the 2017 to 2019 versions of TeXLive.
% We invite you to test the class with your own distribution and code editor and to use it like
% you would with any other work you do with \LaTeX.
% \fi
@@ -210,18 +213,23 @@
% \subsection{Installation}
%
% \ifnum\frenchdoc=1
-% \begin{HECwarning}{Utilisateurs de MacOS}
-% Pour une raison encore non résolue, le processus d'installation décrit ci-dessous ne fonctionne
-% pas sous MacOS. Vous devez donc \lien{http://bit.ly/frhecthesemac}{télécharger} une version
-% préinstallée de la classe pour vous en servir.
+% \begin{HECwarning}{Utilisateurs de Overleaf et de MacOS}
+% Pour une raison encore non r\'{e}solue, le processus d'installation d\'{e}crit ci-dessous ne fonctionne
+% pas sous MacOS. Vous devez donc \lien{http://bit.ly/frhecthesemac}{t\'{e}l\'{e}charger} une version
+% pr\'{e}install\'{e}e de la classe pour vous en servir.
+%
+% Si vous \^{e}tes un utilisateur d'Overleaf, utilisez \'{e}galement la version pr\'{e}install\'{e}e mentionn\'{e}e ci-dessus
+% pour d\'{e}marrer un projet.
% \end{HECwarning}
%
-% L'archive +.zip+ que vous avez téléchargée contient les cinq fichiers et répertoire suivants :
+% L'archive +.zip+ que vous avez t\'{e}l\'{e}charg\'{e}e contient les cinq fichiers et r\'{e}pertoire suivants :
% \else
-% \begin{HECwarning}{MacOS users }
+% \begin{HECwarning}{Overleaf and MacOS users}
% For a reason still unresolved, the installation process described hereunder doesn't work on
% MacOS. You must \lien{http://bit.ly/enhecthesemac2}{download} a preinstalled version of the
% class to work with it.
+%
+% If you are an Overleaf user, please use the preinstalled version mentioned above to start a project.
% \end{HECwarning}
%
% The +.zip+ archive you downloaded contains the following files and directory:
@@ -229,12 +237,12 @@
%
% \begin{enumerate}
% \ifnum\frenchdoc=1
-% \item \textbf{hecthese-fr.ins} : le fichier d'installation de la version française de la classe;
+% \item \textbf{hecthese-fr.ins} : le fichier d'installation de la version fran\c{c}aise de la classe;
% \item \textbf{hecthese-en.ins} : le fichier d'installation de la version anglaise de la classe;
-% \item \textbf{hecthese.dtx} : le code source documenté bilingue de la classe;
-% \item \textbf{hecthese.pdf} : la version française de la documentation de la classe;
+% \item \textbf{hecthese.dtx} : le code source document\'{e} bilingue de la classe;
+% \item \textbf{hecthese.pdf} : la version fran\c{c}aise de la documentation de la classe;
% \item \textbf{hecthese-en.pdf} : la version anglaise de la documentation de la classe;
-% \item \textbf{README.md} : le fichier nécessaire à l'affichage de la
+% \item \textbf{README.md} : le fichier n\'{e}cessaire \`{a} l'affichage de la
% description de la classe sur le site ctan.org.
% \else
% \item \textbf{hecthese-fr.ins}: the french class installation file;
@@ -248,8 +256,8 @@
% \end{enumerate}
%
% \ifnum\frenchdoc=1
-% Suivez les étapes suivantes pour installer la classe
-% \footnote{Une vidéo d'installation est aussi disponible au \url{https://www.youtube.com/watch?v=nfTEgcJbufs}.} :
+% Suivez les \'{e}tapes suivantes pour installer la classe
+% \footnote{Une vid\'{e}o d'installation est aussi disponible au \url{https://www.youtube.com/watch?v=nfTEgcJbufs}.} :
% \else
% Follow these steps to install the class
% \footnote{An installation tutorial is available at \url{https://www.youtube.com/watch?v=nfTEgcJbufs} (in French with English subtitles).}:
@@ -257,11 +265,11 @@
%
% \begin{enumerate}
% \ifnum\frenchdoc=1
-% \item Créez-vous un répertoire de travail.
-% \item Décompressez l'archive +.zip+ dans votre répertoire de travail.
-% \item Ouvrez un éditeur de ligne de commande.
-% \item Changez de répertoire pour atteindre votre répertoire de travail.
-% \item Saisissez la commande suivante dans l'éditeur : \\
+% \item Cr\'{e}ez-vous un r\'{e}pertoire de travail.
+% \item D\'{e}compressez l'archive +.zip+ dans votre r\'{e}pertoire de travail.
+% \item Ouvrez un \'{e}diteur de ligne de commande.
+% \item Changez de r\'{e}pertoire pour atteindre votre r\'{e}pertoire de travail.
+% \item Saisissez la commande suivante dans l'\'{e}diteur : \\
% \begin{shaded*}
% +latex hecthese-fr.ins+
% \end{shaded*}
@@ -278,8 +286,8 @@
% \end{enumerate}
%
% \ifnum\frenchdoc=1
-% La commande créera une série de fichiers qui composeront votre travail, et la liste des
-% fichiers que vous aurez à utiliser dépendra du type de travail que vous composerez.
+% La commande cr\'{e}era une s\'{e}rie de fichiers qui composeront votre travail, et la liste des
+% fichiers que vous aurez \`{a} utiliser d\'{e}pendra du type de travail que vous composerez.
% \else
% The command will create a bunch of files that will become your document. The list of files
% needed will depend on the type of document you'll be writing.
@@ -303,10 +311,10 @@
%
% \begin{itemize}
% \ifnum\frenchdoc=1
-% \item \textbf{gabarit-these-classique.tex} : gabarit pour une thèse rédigée de manière classique;
-% \item \textbf{gabarit-these-articles.tex} : gabarit pour une thèse rédigée par articles;
-% \item \textbf{gabarit-memoire-classique.tex} : gabarit pour un mémoire rédigé de manière classique;
-% \item \textbf{gabarit-memoire-articles.tex} : gabarit pour un mémoire rédigé par articles.
+% \item \textbf{gabarit-these-classique.tex} : gabarit pour une th\`{e}se r\'{e}dig\'{e}e de mani\`{e}re classique;
+% \item \textbf{gabarit-these-articles.tex} : gabarit pour une th\`{e}se r\'{e}dig\'{e}e par articles;
+% \item \textbf{gabarit-memoire-classique.tex} : gabarit pour un m\'{e}moire r\'{e}dig\'{e} de mani\`{e}re classique;
+% \item \textbf{gabarit-memoire-articles.tex} : gabarit pour un m\'{e}moire r\'{e}dig\'{e} par articles.
% \else
% \item \textbf{template-phd-classic.tex} : template for writing a dissertation in a classic manner;
% \item \textbf{template-phd-articles.tex} : template for writing a dissertation with articles;
@@ -326,7 +334,7 @@
% \begin{tabular}{l|cc|cc}
% \hline\hline
% \ifnum\frenchdoc=1
-% & \multicolumn{2}{c|}{Thèses} & \multicolumn{2}{c}{Mémoires} \\
+% & \multicolumn{2}{c|}{Th\`{e}ses} & \multicolumn{2}{c}{M\'{e}moires} \\
% \textbf{Fichier} & Classiques & Par articles & Classiques & Par articles \\
% \hline
% gabarit-these-*.tex & \oui & \oui & \non & \non \\
@@ -379,18 +387,18 @@
%
% \ifnum\frenchdoc=1
% Une fois que vous aurez choisi un gabarit, supprimez les trois fichiers gabarits dont vous
-% n'aurez pas besoin. Ce fichier constitue le fichier maître à partir duquel vous lancerez les
-% diverses compilations nécessaires à la génération de votre document final. C'est également dans le
-% gabarit que vous saisirez les métadonnées relatives à votre travail (auteur, titre, etc.) et que
-% vous ajouterez les +packages+, commandes et environnements nécessaires à votre rédaction.
+% n'aurez pas besoin. Ce fichier constitue le fichier ma\^{i}tre \`{a} partir duquel vous lancerez les
+% diverses compilations n\'{e}cessaires \`{a} la g\'{e}n\'{e}ration de votre document final. C'est \'{e}galement dans le
+% gabarit que vous saisirez les m\'{e}tadonn\'{e}es relatives \`{a} votre travail (auteur, titre, etc.) et que
+% vous ajouterez les +packages+, commandes et environnements n\'{e}cessaires \`{a} votre r\'{e}daction.
%
-% La rédaction en tant que telle se fera dans les autres fichiers. Chaque fichier représente une
+% La r\'{e}daction en tant que telle se fera dans les autres fichiers. Chaque fichier repr\'{e}sente une
% section de votre travail. Leur nom est donc, comme on le dit en chinois, \emph{self-explanatory}.
-% Vous pourrez en ajouter ou en supprimer à votre guise. Assurez-vous seulement
-% d'inclure les fichiers ajoutés dans le gabarit avec la commande \cmd{\include}, de supprimer les
-% \cmd{\include} relatifs aux fichiers supprimés, mais surtout, de respecter les règles du
-% \emph{Guide de rédaction} en ce qui concerne les sections obligatoires et
-% l'ordre de présentation des sections.
+% Vous pourrez en ajouter ou en supprimer \`{a} votre guise. Assurez-vous seulement
+% d'inclure les fichiers ajout\'{e}s dans le gabarit avec la commande \cmd{\include}, de supprimer les
+% \cmd{\include} relatifs aux fichiers supprim\'{e}s, mais surtout, de respecter les r\`{e}gles du
+% \emph{Guide de r\'{e}daction} en ce qui concerne les sections obligatoires et
+% l'ordre de pr\'{e}sentation des sections.
% \else
% Once you have chosen a template file, delete the three remaining ones as you won't need them.
% The template file is your document's master file, the one on which you will have to run all
@@ -413,15 +421,15 @@
% \fi
%
% \ifnum\frenchdoc=1
-% La classe {\hecthese} a été conçue pour être la plus simple et la plus flexible possible. Le but premier
-% de la classe étant la mise en forme de votre thèse ou mémoire selon les normes du
-% \emph{Guide de rédaction}, vous aurez tout le loisir d'ajouter toutes les fonctionnalités
-% que vous désirez.
+% La classe {\hecthese} a \'{e}t\'{e} con\c{c}ue pour \^{e}tre la plus simple et la plus flexible possible. Le but premier
+% de la classe \'{e}tant la mise en forme de votre th\`{e}se ou m\'{e}moire selon les normes du
+% \emph{Guide de r\'{e}daction}, vous aurez tout le loisir d'ajouter toutes les fonctionnalit\'{e}s
+% que vous d\'{e}sirez.
%
-% {\hecthese} est basée sur la classe +memoir+\cite{memoir}, qui fournit déjà de très nombreuses
-% fonctionnalités. Avant de programmer de nouvelles commandes ou de nouveaux environnements, nous
-% vous invitons donc à consulter l'imposante documentation de la classe
-% \footnote{L'auteur de la présente classe n'a d'ailleurs pas encore lu la documentation de la classe +memoir+ %
+% {\hecthese} est bas\'{e}e sur la classe +memoir+\cite{memoir}, qui fournit d\'{e}j\`{a} de tr\`{e}s nombreuses
+% fonctionnalit\'{e}s. Avant de programmer de nouvelles commandes ou de nouveaux environnements, nous
+% vous invitons donc \`{a} consulter l'imposante documentation de la classe
+% \footnote{L'auteur de la pr\'{e}sente classe n'a d'ailleurs pas encore lu la documentation de la classe +memoir+ %
% au complet. \emph{Mea culpa}...}.
% \else
% The \hecthese\ document class has been created to be as simple and as flexible as possible. The main
@@ -440,9 +448,9 @@
% \fi
%
% \ifnum\frenchdoc=1
-% La classe comporte très peu d'options de base. Celles-ci ne concernent que la taille de la
-% police de caractères, la langue du document ainsi que le type de document que vous rédigez. Elles se retrouvent toutes
-% à l'intérieur de la commande \cmd{\documentclass}.
+% La classe comporte tr\`{e}s peu d'options de base. Celles-ci ne concernent que la taille de la
+% police de caract\`{e}res, la langue du document ainsi que le type de document que vous r\'{e}digez. Elles se retrouvent toutes
+% \`{a} l'int\'{e}rieur de la commande \cmd{\documentclass}.
% \else
% The class has very few default options. They only concern font size, document language and type.
% They are all enclosed in the \cmd{\documentclass} command.
@@ -450,12 +458,12 @@
%
% \begin{DescribeMacro}{10pt,11pt,12pt}
% \ifnum\frenchdoc=1
-% Le \emph{Guide de rédaction} mentionne à la page 15 que «[la] taille des caractères
-% varie généralement entre 10 et 12 points pour le texte courant»\cite{guideRedaction}. Vous inscrivez
+% Le \emph{Guide de r\'{e}daction} mentionne \`{a} la page 15 que «[la] taille des caract\`{e}res
+% varie g\'{e}n\'{e}ralement entre 10 et 12 points pour le texte courant»\cite{guideRedaction}. Vous inscrivez
% donc l'une des trois options permises, soit +10pt+, +11pt+ ou +12pt+. Si vous n'inscrivez
-% aucune taille de police de caractères dans les options, la classe utilisera l'option
-% +12pt+ par défaut
-% \footnote{À titre d'exemple, cette documentation a été écrite avec la taille +10pt+}.
+% aucune taille de police de caract\`{e}res dans les options, la classe utilisera l'option
+% +12pt+ par d\'{e}faut
+% \footnote{\`{a} titre d'exemple, cette documentation a \'{e}t\'{e} \'{e}crite avec la taille +10pt+}.
% \else
% The french edition of the \emph{Guidelines} mentions that ``font size usually varies between 10 and
% 12 points in the text''\cite[p. 15]{guideRedaction}. You have to choose between one of these three
@@ -467,10 +475,10 @@
%
% \begin{DescribeMacro}{english,frenchb}
% \ifnum\frenchdoc=1
-% Les options +english+ et +frenchb+ sont propres au +package+ +babel+\cite{babel} et servent à indiquer
-% au compilateur la ou les langues utilisées dans le document. La dernière langue de la liste
-% est la langue par défaut du document. Même si ces options sont propres à +babel+, nous
-% les insérons dans les options de la classe pour qu'elles s'appliquent globalement à
+% Les options +english+ et +frenchb+ sont propres au +package+ +babel+\cite{babel} et servent \`{a} indiquer
+% au compilateur la ou les langues utilis\'{e}es dans le document. La derni\`{e}re langue de la liste
+% est la langue par d\'{e}faut du document. M\^{e}me si ces options sont propres \`{a} +babel+, nous
+% les ins\'{e}rons dans les options de la classe pour qu'elles s'appliquent globalement \`{a}
% tous les +packages+ qui pourraient en avoir besoin.
% \else
% +frenchb+ and +english+ options come from the +babel+ package\cite{babel} and they are used to
@@ -489,20 +497,20 @@
% \end{DescribeMacro}
% \begin{DescribeMacro}{mscarticles}
% \ifnum\frenchdoc=1
-% Vous utilisez l'option +phdclassique+ lorsque vous rédigez une thèse de manière classique,
-% +phdarticles+, une thèse par articles, +mscclassique+, un mémoire classique et +mscarticles+ %
-% lorsque vous rédigez un mémoire par articles. Chacune de ces options est inscrite
-% automatiquement dans le fichier gabarit approprié au type de
-% document lorsque vous installez {\hecthese}. La classe considérant par défaut que le travail
-% que vous rédigez est une thèse classique, vous pourriez à la limite supprimer
+% Vous utilisez l'option +phdclassique+ lorsque vous r\'{e}digez une th\`{e}se de mani\`{e}re classique,
+% +phdarticles+, une th\`{e}se par articles, +mscclassique+, un m\'{e}moire classique et +mscarticles+ %
+% lorsque vous r\'{e}digez un m\'{e}moire par articles. Chacune de ces options est inscrite
+% automatiquement dans le fichier gabarit appropri\'{e} au type de
+% document lorsque vous installez {\hecthese}. La classe consid\'{e}rant par d\'{e}faut que le travail
+% que vous r\'{e}digez est une th\`{e}se classique, vous pourriez \`{a} la limite supprimer
% l'option +phdclassique+ de la commande \cmd{\documentclass} du fichier
% \textbf{gabarit-these-classique.tex}, mais nous vous conseillons de
-% la laisser dans la liste afin d'éviter des problèmes.
+% la laisser dans la liste afin d'\'{e}viter des probl\`{e}mes.
%
% En ce qui a trait aux trois autres options de types de document,
% \textbf{ne supprimez pas l'option de la commande \cmd{\documentclass}}! Ce faisant,
-% vous aurez des problèmes lors de la compilation de votre document, notamment pour
-% la génération des bibliographies et des pages titre.
+% vous aurez des probl\`{e}mes lors de la compilation de votre document, notamment pour
+% la g\'{e}n\'{e}ration des bibliographies et des pages titre.
% \else
% You use +phdclassique+ when you write a dissertation in a classic manner, +phdarticles+ when
% you write a dissertation with articles, +mscclassique+ when you write a thesis in a classic
@@ -526,12 +534,12 @@
% \fi
%
% \ifnum\frenchdoc=1
-% La classe {\hecthese} comprend quelques commandes qu'on pourrait répartir en trois catégories :
+% La classe {\hecthese} comprend quelques commandes qu'on pourrait r\'{e}partir en trois cat\'{e}gories :
% \begin{enumerate}
-% \item les métadonnées de votre document (auteur, titre, etc.) servant à générer la (les)
+% \item les m\'{e}tadonn\'{e}es de votre document (auteur, titre, etc.) servant \`{a} g\'{e}n\'{e}rer la (les)
% page(s) titre ;
% \item les commandes de mise en forme du document ;
-% \item les commandes liées aux bibliographies des thèses et mémoires par articles.
+% \item les commandes li\'{e}es aux bibliographies des th\`{e}ses et m\'{e}moires par articles.
% \end{enumerate}
% \else
% The \hecthese\ document class provides commands that can be separated into three categories:
@@ -543,23 +551,23 @@
% \fi
%
% \ifnum\frenchdoc=1
-% \subsubsection{Métadonnées du document}
+% \subsubsection{M\'{e}tadonn\'{e}es du document}
% \else
% \subsubsection{Document metadata}
% \fi
% \label{commandes:meta}
%
% \ifnum\frenchdoc=1
-% Les commandes ci-dessous s'appliquent à tous les types de documents.
+% Les commandes ci-dessous s'appliquent \`{a} tous les types de documents.
% \else
% The following commands are used in all document types.
% \fi
%
% \ifnum\frenchdoc=1
% \begin{DescribeMacro}{\HECtitre}
-% Il s'agit du titre de votre thèse ou mémoire. N'utilisez pas la commande {\LaTeX}
-% \cmd{\title}, car la classe n'en tiendra pas compte. Si votre titre est très long,
-% séparez-le en plusieurs lignes avec la commande \cmd{\\}.
+% Il s'agit du titre de votre th\`{e}se ou m\'{e}moire. N'utilisez pas la commande {\LaTeX}
+% \cmd{\title}, car la classe n'en tiendra pas compte. Si votre titre est tr\`{e}s long,
+% s\'{e}parez-le en plusieurs lignes avec la commande \cmd{\\}.
% \end{DescribeMacro}
% \else
% \begin{DescribeMacro}{\HECtitle}
@@ -571,9 +579,9 @@
%
% \ifnum\frenchdoc=1
% \begin{DescribeMacro}{\HECsoustitre}
-% Il s'agit du sous-titre de votre thèse ou mémoire, s'il y a lieu. Si votre travail
-% comporte un sous-titre, un : séparera automatiquement le titre du sous-titre et ce
-% dernier s'affichera sous le titre sans qu'il soit nécessaire d'insérer la commande
+% Il s'agit du sous-titre de votre th\`{e}se ou m\'{e}moire, s'il y a lieu. Si votre travail
+% comporte un sous-titre, un : s\'{e}parera automatiquement le titre du sous-titre et ce
+% dernier s'affichera sous le titre sans qu'il soit n\'{e}cessaire d'ins\'{e}rer la commande
% \cmd{\\} dans le titre.
% \end{DescribeMacro}
% \else
@@ -586,8 +594,8 @@
%
% \ifnum\frenchdoc=1
% \begin{DescribeMacro}{\HECauteur}
-% L'auteur de la thèse ou du mémoire, c'est vous, à moins que vous n'ayez plagié votre
-% travail\dots Écrivez votre nom sous la forme \emph{Prénom Nom}. N'utilisez pas la commande
+% L'auteur de la th\`{e}se ou du m\'{e}moire, c'est vous, \`{a} moins que vous n'ayez plagi\'{e} votre
+% travail\dots \'{E}crivez votre nom sous la forme \emph{Pr\'{e}nom Nom}. N'utilisez pas la commande
% {\LaTeX} \cmd{\author}, car la classe n'en tiendra pas compte.
% \end{DescribeMacro}
% \else
@@ -600,7 +608,7 @@
%
% \begin{DescribeMacro}{\HECoption}
% \ifnum\frenchdoc=1
-% La commande \cmd{\HECoption} détermine l'option de votre grade de maîtrise ou de doctorat.
+% La commande \cmd{\HECoption} d\'{e}termine l'option de votre grade de ma\^{i}trise ou de doctorat.
% \else
% The \cmd{\HECoption} determines your dissertation's or thesis' option.
% \fi
@@ -610,8 +618,8 @@
% \begin{DescribeMacro}{\HECmoisDepot}
% \end{DescribeMacro}
% \begin{DescribeMacro}{\HECanneeDepot}
-% Les commandes \cmd{\HECmoisDepot} et \cmd{\HECanneeDepot} représentent le mois et l'année du
-% \textbf{dépôt final} de votre travail. Inscrivez le mois en toutes lettres et l'année
+% Les commandes \cmd{\HECmoisDepot} et \cmd{\HECanneeDepot} repr\'{e}sentent le mois et l'ann\'{e}e du
+% \textbf{d\'{e}p\^{o}t final} de votre travail. Inscrivez le mois en toutes lettres et l'ann\'{e}e
% au format AAAA.
% \end{DescribeMacro}
% \else
@@ -628,8 +636,8 @@
% \begin{DescribeMacro}{\HECpdftitre}
% \ifnum\frenchdoc=1
% Ces deux commandes sont des variantes de \cmd{\HECauteur} et \cmd{\HECtitre} et servent
-% exclusivement à l'inclusion de métadonnées dans le document pdf généré. Pour ce
-% faire, elle sont utilisées avec les options +pdftitle+ et +pdfauthor+ de la commande
+% exclusivement \`{a} l'inclusion de m\'{e}tadonn\'{e}es dans le document pdf g\'{e}n\'{e}r\'{e}. Pour ce
+% faire, elle sont utilis\'{e}es avec les options +pdftitle+ et +pdfauthor+ de la commande
% \cmd{\hypersetup} du +package+ +hyperref+\cite{hyperref}.
% \else
% These are variants of the \cmd{\HECauthor} and \cmd{\HECtitle} commands and they are used for
@@ -640,8 +648,8 @@
% \end{DescribeMacro}
%
% \ifnum\frenchdoc=1
-% Les commandes qui suivent ne s'appliquent qu'aux thèses. Si votre travail est un
-% mémoire, vous pouvez passez à la Section \ref{commandes:layout}.
+% Les commandes qui suivent ne s'appliquent qu'aux th\`{e}ses. Si votre travail est un
+% m\'{e}moire, vous pouvez passez \`{a} la Section \ref{commandes:layout}.
% \else
% The following commands are used in dissertations only. If you are writing a thesis, you can
% skip to Section \ref{commandes:layout}.
@@ -657,13 +665,13 @@
% \begin{DescribeMacro}{\HECexaminateurExterne}
% \end{DescribeMacro}
% \begin{DescribeMacro}{\HECrepresentantDirecteur}
-% Chacune de ces commandes représentent un intervenant dans votre travail. Le premier
-% argument est le nom de l'intervenant au format \emph{Prénom Nom}, tandis que le deuxième est le
+% Chacune de ces commandes repr\'{e}sentent un intervenant dans votre travail. Le premier
+% argument est le nom de l'intervenant au format \emph{Pr\'{e}nom Nom}, tandis que le deuxi\`{e}me est le
% genre de l'intervenant, homme (M) ou femme (F). Il est important d'indiquer le genre
-% de chacun des intervenants, car cela va affecter la manière dont sera affiché leur
-% titre sur la page d'identification du jury, et la remise d'une thèse n'est pas tout à
-% fait le bon moment pour heurter les sensibilités de ceux et celles qui vont vous
-% évaluer\dots
+% de chacun des intervenants, car cela va affecter la mani\`{e}re dont sera affich\'{e} leur
+% titre sur la page d'identification du jury, et la remise d'une th\`{e}se n'est pas tout \`{a}
+% fait le bon moment pour heurter les sensibilit\'{e}s de ceux et celles qui vont vous
+% \'{e}valuer\dots
% \end{DescribeMacro}
% \else
% \begin{DescribeMacro}{\HECrapporteurPresident}
@@ -685,10 +693,10 @@
%
% \ifnum\frenchdoc=1
% \begin{DescribeMacro}{\HECmembreJury}
-% Cette commande a la même fonction que les cinq précédentes, c'est-à-dire nommer
-% explicitement un intervenant dans votre thèse, mais elle ne prend qu'un seul
-% argument, le nom au format \emph{Prénom Nom}, car le titre de la fonction est
-% épicène.
+% Cette commande a la m\^{e}me fonction que les cinq pr\'{e}c\'{e}dentes, c'est-\`{a}-dire nommer
+% explicitement un intervenant dans votre th\`{e}se, mais elle ne prend qu'un seul
+% argument, le nom au format \emph{Pr\'{e}nom Nom}, car le titre de la fonction est
+% \'{e}pic\`{e}ne.
% \end{DescribeMacro}
% \else
% \begin{DescribeMacro}{\HECjuryMember}
@@ -703,10 +711,10 @@
% \begin{DescribeMacro}{\HECuniversiteMembreJury}
% \end{DescribeMacro}
% \begin{DescribeMacro}{\HECuniversiteExaminateur}
-% Par défaut, la classe {\hecthese} indique que le codirecteur, le membre du jury ainsi
-% que l'examinateur externe proviennent de HEC Montréal, mais ils pourraient provenir
-% d'une autre université. Modifiez le nom de l'université dans toutes les commandes
-% nécessaires, le cas échéant.
+% Par d\'{e}faut, la classe {\hecthese} indique que le codirecteur, le membre du jury ainsi
+% que l'examinateur externe proviennent de HEC Montr\'{e}al, mais ils pourraient provenir
+% d'une autre universit\'{e}. Modifiez le nom de l'universit\'{e} dans toutes les commandes
+% n\'{e}cessaires, le cas \'{e}ch\'{e}ant.
% \end{DescribeMacro}
% \else
% \begin{DescribeMacro}{\HECcodirectorUniversity}
@@ -715,7 +723,7 @@
% \end{DescribeMacro}
% \begin{DescribeMacro}{\HECexaminatorUniversity}
% By default, your codirector, jury member and external examinator are considered
-% working at HEC Montréal by the \hecthese\ document class, but they could be working
+% working at HEC Montr\'{e}al by the \hecthese\ document class, but they could be working
% at another university. You'll then have to modify the university's name is these commands
% when necessary.
% \end{DescribeMacro}
@@ -730,9 +738,9 @@
%
% \ifnum\frenchdoc=1
% \begin{DescribeMacro}{\HECpagestitre}
-% Les pages titre diffèrent en fonction du type de document, tel qu'il est montré dans
-% les modèles de pages titre du \emph{Guide de rédaction}. De plus, une page d'identification
-% du jury est insérée à la suite de la page titre dans les thèses. La commande
+% Les pages titre diff\`{e}rent en fonction du type de document, tel qu'il est montr\'{e} dans
+% les mod\`{e}les de pages titre du \emph{Guide de r\'{e}daction}. De plus, une page d'identification
+% du jury est ins\'{e}r\'{e}e \`{a} la suite de la page titre dans les th\`{e}ses. La commande
% \cmd{\HECpagestitre} met en forme automatiquement toutes les pages de titre en utilisant
% le contenu des commandes de la Section \ref{commandes:meta}.
% \end{DescribeMacro}
@@ -744,12 +752,12 @@
% generates all title pages using the contents of the commands listes in Section \ref{commandes:meta}.
%
% \begin{HECwhat}{Why are my title pages displayed in French?}
-% The Université de Montréal's \emph{Règlement pédagogique de la faculté des études supérieures et %
+% The Universit\'{e} de Montr\'{e}al's \emph{R\`{e}glement p\'{e}dagogique de la facult\'{e} des \'{e}tudes sup\'{e}rieures et %
% postdoctorales}\cite[art. 88,89,134,135]{udem:reglements} states the language and presentation
% standards that prevail for dissertations and thesis, and refers to the
-% \emph{Guide de présentation des mémoires et des thèses}\cite[p. 22]{udem:guide} where it is
+% \emph{Guide de pr\'{e}sentation des m\'{e}moires et des th\`{e}ses}\cite[p. 22]{udem:guide} where it is
% written that ``\emph{title pages must be written in French even when the dissertation or %
-% thesis is written in English}''. Since HEC Montréal is one of Université de Montréal's
+% thesis is written in English}''. Since HEC Montr\'{e}al is one of Universit\'{e} de Montr\'{e}al's
% affiliate universities, this rule prevails.
% \end{HECwhat}
% \end{DescribeMacro}
@@ -761,13 +769,13 @@
% \end{DescribeMacro}
% \begin{DescribeMacro}{\HECgenererTitres}
% \ifnum\frenchdoc=1
-% Les commandes \cmd{\HECtitreIntroduction} et \cmd{\HECtitreConclusion} sont placées en
-% tant qu'argument des commandes \cmd{\chapter*} situées au début des fichiers
+% Les commandes \cmd{\HECtitreIntroduction} et \cmd{\HECtitreConclusion} sont plac\'{e}es en
+% tant qu'argument des commandes \cmd{\chapter*} situ\'{e}es au d\'{e}but des fichiers
% \textbf{introduction.tex} et \textbf{conclusion.tex} respectivement. Elles servent
-% à indiquer le titre de ces parties de votre travail, titre généré à l'aide de la commande
-% \cmd{\HECgenererTitres}. Si vous rédigez votre thèse ou mémoire de manière classique,
+% \`{a} indiquer le titre de ces parties de votre travail, titre g\'{e}n\'{e}r\'{e} \`{a} l'aide de la commande
+% \cmd{\HECgenererTitres}. Si vous r\'{e}digez votre th\`{e}se ou m\'{e}moire de mani\`{e}re classique,
% les titres seront tout simplement «Introduction» et «Conclusion» ; dans le cas contraire,
-% ces sections seront intitulées «Introduction générale» et «Conclusion générale» pour les
+% ces sections seront intitul\'{e}es «Introduction g\'{e}n\'{e}rale» et «Conclusion g\'{e}n\'{e}rale» pour les
% distinguer des introductions et des conclusions des articles.
% \else
% The \cmd{\HECtitreIntroduction} and \cmd{\HECtitreConclusion} commands are placed as arguments in
@@ -791,14 +799,14 @@
% \end{DescribeMacro}
% \begin{DescribeMacro}{\HECtdmResumeArticle}
% \ifnum\frenchdoc=1
-% Plusieurs parties d'une thèse ou d'un mémoire étant des sections et chapitres «maison»,
+% Plusieurs parties d'une th\`{e}se ou d'un m\'{e}moire \'{e}tant des sections et chapitres «maison»,
% il n'existe pas de traduction anglaise d'office pour celles-ci. La classe {\hecthese} pallie
-% à cette situation en détectant la langue et en générant le titre approprié pour de nombreuses
-% sections du document : l'introduction et la conclusion générales des thèses et mémoires par articles,
-% la liste des abréviations, les remerciements, l'avant-propos, le cadre théorique, la revue de littérature
-% et le résumé de chacun des articles.
+% \`{a} cette situation en d\'{e}tectant la langue et en g\'{e}n\'{e}rant le titre appropri\'{e} pour de nombreuses
+% sections du document : l'introduction et la conclusion g\'{e}n\'{e}rales des th\`{e}ses et m\'{e}moires par articles,
+% la liste des abr\'{e}viations, les remerciements, l'avant-propos, le cadre th\'{e}orique, la revue de litt\'{e}rature
+% et le r\'{e}sum\'{e} de chacun des articles.
% \else
-% Many parts of HEC Montréal's dissertations and theses being ``homemade'' sections and chapters,
+% Many parts of HEC Montr\'{e}al's dissertations and theses being ``homemade'' sections and chapters,
% no official english translations exist for their titles. The \hecthese\ class takes care of the
% problem by automatically detecting the document's default language and by generating the appropriate
% titles for these sections: general introduction and conclusion, acronym list, acknowledgements,
@@ -807,14 +815,14 @@
% \end{DescribeMacro}
%
% \ifnum\frenchdoc=1
-% \subsubsection{Les bibliographies des thèses et mémoires par articles}
+% \subsubsection{Les bibliographies des th\`{e}ses et m\'{e}moires par articles}
% \else
% \subsubsection{By-article dissertations' and theses' bibliographies}
% \fi
%
%\ifnum\frenchdoc=1
-% Dans les thèses et mémoires rédigés par articles, il y a plusieurs bibliographies : une
-% par article et une générale pour l'ensemble du travail. La classe {\hecthese} utilise
+% Dans les th\`{e}ses et m\'{e}moires r\'{e}dig\'{e}s par articles, il y a plusieurs bibliographies : une
+% par article et une g\'{e}n\'{e}rale pour l'ensemble du travail. La classe {\hecthese} utilise
% le +package chapterbib+\cite{chapterbib} pour permettre la publication de ces nombreuses bibliographies.
% \else
% In dissertations and theses written with articles, there are many bibliographies: one specific
@@ -825,11 +833,11 @@
%
% \begin{DescribeMacro}{\HECbibliographieArticle}
% \ifnum\frenchdoc=1
-% Le +package chapterbib+ ne s'accorde cependant pas très bien avec la classe +memoir+ en ce qui
+% Le +package chapterbib+ ne s'accorde cependant pas tr\`{e}s bien avec la classe +memoir+ en ce qui
% concerne la place de chacune des bibliographies dans les divisions du document. La
% commande \cmd{\HECbibliographieArticle} s'assure donc que les bibliographies des articles
-% seront positionnées en tant que section non numérotées à l'intérieur des articles. C'est
-% pourquoi, dans les gabarits par articles, cette commande est placée après la commande
+% seront positionn\'{e}es en tant que section non num\'{e}rot\'{e}es \`{a} l'int\'{e}rieur des articles. C'est
+% pourquoi, dans les gabarits par articles, cette commande est plac\'{e}e apr\`{e}s la commande
% \cmd{\HECpagestitre}.
% \else
% The +chapterbib+ package and +memoir+ class have conflicting issues concerning the bibliographies'
@@ -841,8 +849,8 @@
%
% \begin{DescribeMacro}{\HECbibliographieGenerale}
% \ifnum\frenchdoc=1
-% Cette commande sert à positionner la bibliographie générale du travail en tant
-% que «chapitre» (au sens {\LaTeX} du terme) non numéroté. Cette commande est placée
+% Cette commande sert \`{a} positionner la bibliographie g\'{e}n\'{e}rale du travail en tant
+% que «chapitre» (au sens {\LaTeX} du terme) non num\'{e}rot\'{e}. Cette commande est plac\'{e}e
% tout juste avant la commande \cmd{\bibliographystyle} du gabarit.
% \else
% This command positions the document's general bibliography as an unnumbered ``chapter''
@@ -853,22 +861,22 @@
%
% \begin{DescribeMacro}{\HECreferences}
% \ifnum\frenchdoc=1
-% Le +package chapterbib+ remplit très bien son rôle de création de bibliographies multiples. Le
+% Le +package chapterbib+ remplit tr\`{e}s bien son r\^{o}le de cr\'{e}ation de bibliographies multiples. Le
% hic, c'est qu'il faut inclure la commande \cmd{\bibliography} dans chaque fichier inclus
% dans un document pour que les citations s'affichent correctement. Ce faisant, une bibliographie
-% est générée pour chacun de ces fichiers. Or, dans des sections comme l'introduction,
-% les résumés ou encore la conclusion, la bibliographie ne doit pas être affichée,
-% car elle est incluse dans la bibliographie générale du document. La commande \cmd{\HECreferences}
-% permet d'insérer des citations et de les voir s'afficher correctement sans qu'une bibliographie
-% soit générée dans une section donnée. Sa syntaxe est la suivante :
+% est g\'{e}n\'{e}r\'{e}e pour chacun de ces fichiers. Or, dans des sections comme l'introduction,
+% les r\'{e}sum\'{e}s ou encore la conclusion, la bibliographie ne doit pas \^{e}tre affich\'{e}e,
+% car elle est incluse dans la bibliographie g\'{e}n\'{e}rale du document. La commande \cmd{\HECreferences}
+% permet d'ins\'{e}rer des citations et de les voir s'afficher correctement sans qu'une bibliographie
+% soit g\'{e}n\'{e}r\'{e}e dans une section donn\'{e}e. Sa syntaxe est la suivante :
%
% \begin{shaded*}
% \cmd{\HECreferences\{<style bibliographique>\}\{<fichier.bib>\}}
% \end{shaded*}
%
-% Même si la bibliographie d'une section ne s'affichera pas, il est important d'indiquer comme
-% argument +style bibliographique+ le même style que celui utilisé partout ailleurs dans le
-% document, car les références seront au final incluses dans la bibliographie générale.
+% M\^{e}me si la bibliographie d'une section ne s'affichera pas, il est important d'indiquer comme
+% argument +style bibliographique+ le m\^{e}me style que celui utilis\'{e} partout ailleurs dans le
+% document, car les r\'{e}f\'{e}rences seront au final incluses dans la bibliographie g\'{e}n\'{e}rale.
% \else
% The +chapterbib+ package is pretty good at fulfilling its purpose, which is generating multiple
% bibliographies. The problem is that a \cmd{\bibliography} command must be included in each file
@@ -895,7 +903,7 @@
% \fi
%
% \ifnum\frenchdoc=1
-% Les environnements de la classe {\hecthese} ne servent qu'à la mise en forme de votre
+% Les environnements de la classe {\hecthese} ne servent qu'\`{a} la mise en forme de votre
% travail.
% \else
% The \hecthese\ class' environments all share the same purpose : laying out your work.
@@ -903,9 +911,9 @@
%
% \ifnum\frenchdoc=1
% \begin{DescribeEnv}{HECdedicace}
-% Cet environnement se retrouve dans le fichier \textbf{dedicace.tex}. C'est à l'intérieur de
-% +HECdedicace+ que vous rédigez\dots votre dédicace. Celle-ci, au moment de la compilation,
-% sera centrée verticalement dans la page, justifiée à droite et mise en italiques.
+% Cet environnement se retrouve dans le fichier \textbf{dedicace.tex}. C'est \`{a} l'int\'{e}rieur de
+% +HECdedicace+ que vous r\'{e}digez\dots votre d\'{e}dicace. Celle-ci, au moment de la compilation,
+% sera centr\'{e}e verticalement dans la page, justifi\'{e}e \`{a} droite et mise en italiques.
% \end{DescribeEnv}
% \else
% \begin{DescribeEnv}{HECdedication}
@@ -918,11 +926,11 @@
%
% \ifnum\frenchdoc=1
% \begin{DescribeEnv}{HECabreviations}
-% +HECabreviations+ est une variante de l'environnement +description+. Il sert à rédiger
-% votre liste d'abréviations. L'environnement prend comme argument la plus longue de
-% vos abréviations et se sert de cette longueur pour aligner la liste des abréviations
+% +HECabreviations+ est une variante de l'environnement +description+. Il sert \`{a} r\'{e}diger
+% votre liste d'abr\'{e}viations. L'environnement prend comme argument la plus longue de
+% vos abr\'{e}viations et se sert de cette longueur pour aligner la liste des abr\'{e}viations
% en deux colonnes. Les +packages+ +calc+\cite{calc} et +enumitem+\cite{enumitem}
-% servent à la mise en forme de la liste.
+% servent \`{a} la mise en forme de la liste.
% \end{DescribeEnv}
% \else
% \begin{DescribeEnv}{HECabbreviations}
@@ -934,14 +942,14 @@
% \fi
%
% \ifnum\frenchdoc=1
-% \section{Rédaction de la thèse ou du mémoire}
+% \section{R\'{e}daction de la th\`{e}se ou du m\'{e}moire}
% \else
% \section{Writing your dissertation or thesis}
% \fi
%
% \ifnum\frenchdoc=1
-% Dans cette section, nous vous donnerons quelques conseils concernant la rédaction de votre
-% thèse ou mémoire avec la classe \hecthese.
+% Dans cette section, nous vous donnerons quelques conseils concernant la r\'{e}daction de votre
+% th\`{e}se ou m\'{e}moire avec la classe \hecthese.
% \else
% In this section, we will give you a few hints for writing your dissertation or thesis with
% the \hecthese\ document class.
@@ -954,19 +962,19 @@
% \fi
%
% \ifnum\frenchdoc=1
-% Tel que mentionné à la Section \ref{liste-fichiers}, votre document est réparti dans une multitude
+% Tel que mentionn\'{e} \`{a} la Section \ref{liste-fichiers}, votre document est r\'{e}parti dans une multitude
% de fichiers. Plusieurs objectifs sous-tendent ce choix :
%
% \begin{enumerate}
-% \item Séparer votre code (+packages+, commandes, environnements, etc.) de votre rédaction;
-% \item Alléger les fichiers;
-% \item Faciliter votre repérage dans l'ensemble de votre texte;
-% \item Vous offrir la plus grande flexibilité pour ajouter ou supprimer des sections.
+% \item S\'{e}parer votre code (+packages+, commandes, environnements, etc.) de votre r\'{e}daction;
+% \item All\'{e}ger les fichiers;
+% \item Faciliter votre rep\'{e}rage dans l'ensemble de votre texte;
+% \item Vous offrir la plus grande flexibilit\'{e} pour ajouter ou supprimer des sections.
% \end{enumerate}
%
% Chaque fichier contient des instructions sous forme de commentaires pour vous permettre de les
% utiliser sans commettre d'impairs ou briser la structure de votre document. Lisez-les attentivement tout
-% au long de votre rédaction et supprimez-les au besoin.
+% au long de votre r\'{e}daction et supprimez-les au besoin.
% \else
% As mentioned in Section \ref{liste-fichiers}, your document is divided in many files. A few reasons
% underlie the choice of such a division:
@@ -990,29 +998,29 @@
%
% \ifnum\frenchdoc=1
% Nous vous recommandons fortement d'utiliser le style bibliographique +francais+ pour la compilation de
-% votre (vos) bibliographie(s). Ce style a été conçu par le professeur Vincent Goulet de l'Université
-% Laval\cite{francaisbst} et est celui qui ressemble le plus au style bibliographique HEC Montréal, élaboré
-% par Caroline Archambault\cite{stylehec}. De plus, ce style supporte les citations au format \emph{auteur-année}
-% préconisé dans le \emph{Guide de rédaction}.
+% votre (vos) bibliographie(s). Ce style a \'{e}t\'{e} con\c{c}u par le professeur Vincent Goulet de l'Universit\'{e}
+% Laval\cite{francaisbst} et est celui qui ressemble le plus au style bibliographique HEC Montr\'{e}al, \'{e}labor\'{e}
+% par Caroline Archambault\cite{stylehec}. De plus, ce style supporte les citations au format \emph{auteur-ann\'{e}e}
+% pr\'{e}conis\'{e} dans le \emph{Guide de r\'{e}daction}.
%
-% Si vous rédigez votre thèse ou mémoire en anglais, nous vous recommandons d'utiliser le style bibliographique
-% +apa+ duquel est inspiré le style HEC Montréal.
+% Si vous r\'{e}digez votre th\`{e}se ou m\'{e}moire en anglais, nous vous recommandons d'utiliser le style bibliographique
+% +apa+ duquel est inspir\'{e} le style HEC Montr\'{e}al.
%
-% Afin de vous conformer au format de citation préconisé par le \emph{Guide de rédaction}, nous vous recommandons
+% Afin de vous conformer au format de citation pr\'{e}conis\'{e} par le \emph{Guide de r\'{e}daction}, nous vous recommandons
% enfin d'utiliser la commande \cmd{\citep} lorsque vous citez vos sources.
%
% Si vous choisissez d'utiliser d'autres styles bibliographiques et/ou d'autres formats de citations, assurez-vous
-% qu'ils soient compatibles avec le +package+ +natbib+ qui est chargé avec la classe, à défaut de quoi vous
-% rencontrerez des problèmes lors de la compilation de votre document.
+% qu'ils soient compatibles avec le +package+ +natbib+ qui est charg\'{e} avec la classe, \`{a} d\'{e}faut de quoi vous
+% rencontrerez des probl\`{e}mes lors de la compilation de votre document.
% \else
% If you plan on writing your dissertation or thesis in French, we suggest you use the +francais+ bibliography
-% style when compiling your bibliographies. It has been built by Université Laval's professor Vincent Goulet\cite{francaisbst}
-% and it is the bibliography style resembling the most HEC Montréal's bibliography style, elaborated by
+% style when compiling your bibliographies. It has been built by Universit\'{e} Laval's professor Vincent Goulet\cite{francaisbst}
+% and it is the bibliography style resembling the most HEC Montr\'{e}al's bibliography style, elaborated by
% Caroline Archambault\cite{stylehec}. This style also supports the \emph{author-year} citation format that is
% recommended for use in the \emph{Guidelines}.
%
% If you write your dissertation or thesis in English, we suggest you use the +apa+ bibliography style, which served
-% as inspiration for the HEC Montréal bibliography style.
+% as inspiration for the HEC Montr\'{e}al bibliography style.
%
% In order to fully comply with the \emph{Guidelines}, we recommend you use the \cmd{\citep} command when citing
% your sources.
@@ -1025,13 +1033,19 @@
% \section{Compilation}
%
% \ifnum\frenchdoc=1
+% \begin{HECwarning}{Utilisateurs d'Overleaf}
+% Overleaf ne vous offrant qu'un simple bouton «Compilation», cette section ne vous concerne pas.
+% \end{HECwarning}
% Lorsque viendra le temps de compiler votre document, il ne vous suffira pas seulement de cliquer sur
-% le bouton «Compilation» de votre éditeur de code préféré. Une suite précise de compilations
-% s'avèrent nécessaires si vous voulez que votre document soit généré de manière appropriée, surtout
-% si vous compilez une thèse ou un mémoire par articles
-% \footnote{Un tutoriel vidéo concernant la compilation est disponible à l'adresse
+% le bouton «Compilation» de votre \'{e}diteur de code pr\'{e}f\'{e}r\'{e}. Une suite pr\'{e}cise de compilations
+% s'av\`{e}rent n\'{e}cessaires si vous voulez que votre document soit g\'{e}n\'{e}r\'{e} de mani\`{e}re appropri\'{e}e, surtout
+% si vous compilez une th\`{e}se ou un m\'{e}moire par articles
+% \footnote{Un tutoriel vid\'{e}o concernant la compilation est disponible \`{a} l'adresse
% \url{https://www.youtube.com/watch?v=hS3LMC3H55w}}.
% \else
+% \begin{HECwarning}{Overleaf users}
+% Since Overleaf only has a single ``Compile'' button, this section doesn't concern you.
+% \end{HECwarning}
% When the time comes for compiling your document, simply pressing ``Compile'' in your code editor
% won't suffice. A precise chain of compilations is necessary if you want your document to be
% rendered properly, most of all if you compile a dissertation or thesis written with articles
@@ -1040,16 +1054,16 @@
% \fi
%
% \ifnum\frenchdoc=1
-% \subsection{Thèses et mémoires classiques}
+% \subsection{Th\`{e}ses et m\'{e}moires classiques}
% \else
% \subsection{Classic dissertations and theses}
% \fi
% \label{comp-phd-msc-cl}
%
% \ifnum\frenchdoc=1
-% Voici l'ordre de compilations nécessaires à la production de votre thèse ou mémoire classique,
-% à faire à partir d'un éditeur de code ou d'un éditeur de ligne de commande. Dans la liste
-% ci-dessous, remplacez +*+ par +these+ ou +memoire+ en fonction du document que vous rédigez.
+% Voici l'ordre de compilations n\'{e}cessaires \`{a} la production de votre th\`{e}se ou m\'{e}moire classique,
+% \`{a} faire \`{a} partir d'un \'{e}diteur de code ou d'un \'{e}diteur de ligne de commande. Dans la liste
+% ci-dessous, remplacez +*+ par +these+ ou +memoire+ en fonction du document que vous r\'{e}digez.
% \else
% Here is the compilation chain you need to do in order to generate your classic dissertation or
% thesis. You can perform these compilations from your code editor or from the command line. In the
@@ -1061,7 +1075,7 @@
% \item +pdflatex gabarit-*-classique.tex+
% \item +bibtex gabarit-*-classique.tex+
% \item +makeindex gabarit-*-classique.tex+
-% \footnote{\label{comp-index}Nécessaire seulement si vous avez inséré des entrées d'index
+% \footnote{\label{comp-index}N\'{e}cessaire seulement si vous avez ins\'{e}r\'{e} des entr\'{e}es d'index
% et la commande \cmd{\printindex} dans votre document.}
% \item +pdflatex gabarit-*-classique.tex+
% \item +pdflatex gabarit-*-classique.tex+
@@ -1077,14 +1091,14 @@
% \end{HECcompilation}
%
% \ifnum\frenchdoc=1
-% La compilation d'une thèse ou d'un mémoire classique est assez simple. Toutes les étapes se font
-% à partir de votre fichier gabarit. Vous lancez une première compilation avec +pdflatex+,
-% vous générez votre bibliographie et votre index avec +bibtex+ et +makeindex+, puis vous recompilez
-% au moins deux fois de suite votre fichier gabarit avec +pdflatex+ afin de permettre la génération
-% adéquate de la bibliographie, de l'index et de la table des matières.
+% La compilation d'une th\`{e}se ou d'un m\'{e}moire classique est assez simple. Toutes les \'{e}tapes se font
+% \`{a} partir de votre fichier gabarit. Vous lancez une premi\`{e}re compilation avec +pdflatex+,
+% vous g\'{e}n\'{e}rez votre bibliographie et votre index avec +bibtex+ et +makeindex+, puis vous recompilez
+% au moins deux fois de suite votre fichier gabarit avec +pdflatex+ afin de permettre la g\'{e}n\'{e}ration
+% ad\'{e}quate de la bibliographie, de l'index et de la table des mati\`{e}res.
%
-% Lorsque vous utilisez un éditeur de ligne de commandes, vous n'avez pas à inscrire l'extension du fichier
-% (+.tex+) dans votre commande de compilation. Seul le nom du fichier est nécessaire dans la commande.
+% Lorsque vous utilisez un \'{e}diteur de ligne de commandes, vous n'avez pas \`{a} inscrire l'extension du fichier
+% (+.tex+) dans votre commande de compilation. Seul le nom du fichier est n\'{e}cessaire dans la commande.
% \else
% Compiling a dissertation or thesis is pretty straightforward. All compilation steps are performed on
% your template file. You run a first compilation with +pdflatex+, you generate your bibliography
@@ -1096,14 +1110,14 @@
% \fi
%
% \ifnum\frenchdoc=1
-% \subsection{Thèses et mémoires par articles}
+% \subsection{Th\`{e}ses et m\'{e}moires par articles}
% \else
% \subsection{Dissertations and theses written with articles}
% \fi
%
% \ifnum\frenchdoc=1
-% Voici l'ordre de compilations nécessaires à la production de votre thèse ou mémoire par
-% articles. Comme indiqué à la Section \ref{comp-phd-msc-cl}, remplacez +*+ par +these+ ou +memoire+.
+% Voici l'ordre de compilations n\'{e}cessaires \`{a} la production de votre th\`{e}se ou m\'{e}moire par
+% articles. Comme indiqu\'{e} \`{a} la Section \ref{comp-phd-msc-cl}, remplacez +*+ par +these+ ou +memoire+.
% \else
% Here is the compilation chain you need to do in order to generate your dissertation or thesis
% written with articles. As mentioned in Section \ref{comp-phd-msc-cl}, replace +*+ by +dissertation+
@@ -1131,20 +1145,20 @@
% \end{HECcompilation}
%
% \ifnum\frenchdoc=1
-% La compilation d'une thèse ou d'un mémoire par articles est plus complexe, car vous
-% devez générer chacune des bibliographies individuellement. Vous commencez par une
-% première compilation +pdflatex+ sur le fichier gabarit. Vous lancez ensuite +makeindex+
-% et +bibtex+ sur ce même fichier. Une fois que la première compilation +bibtex+ aura été complétée,
-% ouvrez chacun des fichiers avec l'extension +.aux+ dans lesquels vous avez inséré des citations,
+% La compilation d'une th\`{e}se ou d'un m\'{e}moire par articles est plus complexe, car vous
+% devez g\'{e}n\'{e}rer chacune des bibliographies individuellement. Vous commencez par une
+% premi\`{e}re compilation +pdflatex+ sur le fichier gabarit. Vous lancez ensuite +makeindex+
+% et +bibtex+ sur ce m\^{e}me fichier. Une fois que la premi\`{e}re compilation +bibtex+ aura \'{e}t\'{e} compl\'{e}t\'{e}e,
+% ouvrez chacun des fichiers avec l'extension +.aux+ dans lesquels vous avez ins\'{e}r\'{e} des citations,
% soit \textbf{article-1.aux}, \textbf{article-2.aux}, \textbf{article-3.aux}, etc.
% \footnote{N'ouvrez les fichiers +.aux+ que si vous compilez votre document avec un
-% éditeur de code.}
+% \'{e}diteur de code.}
% Lancez une compilation +bibtex+ sur chacun de ces fichiers. Finalement, lancez au
-% moins deux compilations +pdflatex+ sur votre fichier gabarit afin de générer
-% les bibliographies, l'index et la table des matières.
+% moins deux compilations +pdflatex+ sur votre fichier gabarit afin de g\'{e}n\'{e}rer
+% les bibliographies, l'index et la table des mati\`{e}res.
%
-% Et comme indiqué à la Section \ref{comp-phd-msc-cl}, seuls les noms de fichiers sont
-% nécessaires lorsque vous rédigez vos commandes dans un éditeur de ligne de commandes.
+% Et comme indiqu\'{e} \`{a} la Section \ref{comp-phd-msc-cl}, seuls les noms de fichiers sont
+% n\'{e}cessaires lorsque vous r\'{e}digez vos commandes dans un \'{e}diteur de ligne de commandes.
% \else
% Compiling a dissertation or thesis written with articles is more complex because you have to
% generate each article's bibliography separately. You begin by compiling your template
@@ -1163,85 +1177,85 @@
% \clearpage
% \begin{thebibliography}{99}%
% \bibitem{guideRedaction}
-% Centre d'aide en français et en rédaction universitaire (2015).
-% \emph{Guide pour la rédaction d'un travail universitaire de 1er, 2e et 3e cycles},
-% HEC Montréal. Consulté le 18 mai 2017 à
-% \href{http://www.hec.ca/qualitecomm/caf/guide-redaction-travail-cycles.pdf}%
-% {http://www.hec.ca/qualitecomm/caf/guide-redaction-travail-cycles.pdf}
+% Centre de formation en langues des affaires (2020).
+% \emph{Guide pour la r\'{e}daction d'un travail universitaire de 1er, 2e et 3e cycles},
+% HEC Montr\'{e}al. Consult\'{e} le 24 ao\^{u}t 2020 \`{a}
+% \href{https://www.hec.ca/cfla/francais/document/guide-redaction-travail-cycles.pdf}%
+% {https://www.hec.ca/cfla/francais/document/guide-redaction-travail-cycles.pdf}
% \bibitem{guidelines}
% Centre de formation en langues des affaires (2014).
% \emph{Guidelines for writing and academic work at a graduate level},
-% HEC Montréal. Consulté le 24 avril 2018 à
-% \href{http://www.hec.ca/qualitecomm/anglais/ressources/guide-redaction-depot-memoire-anglais.pdf}%
-% {http://www.hec.ca/qualitecomm/anglais/ressources/guide-redaction-depot-memoire-anglais.pdf}
+% HEC Montr\'{e}al. Consult\'{e} le 24 avril 2018 \`{a}
+% \href{https://www.hec.ca/cfla/anglais/document/guidelines\_academic\_work.pdf}%
+% {https://www.hec.ca/cfla/anglais/document/guidelines\_academic\_work.pdf}
% \bibitem{texlive}
-% \emph{TeX Live}, TeX Users Group. Consulté le 18 mai 2017 à
+% \emph{TeX Live}, TeX Users Group. Consult\'{e} le 18 mai 2017 \`{a}
% \href{https://www.tug.org/texlive/}{https://www.tug.org/texlive/}
% \bibitem{texstudio}
% van der Zander, Benito, Jan Sundermeyer, Daniel Braun et Tim Hoffmann (2017).
-% \emph{TeXstudio : LaTeX made comfortable}, TeXstudio. Consulté le 18 mai 2017 à
+% \emph{TeXstudio : LaTeX made comfortable}, TeXstudio. Consult\'{e} le 18 mai 2017 \`{a}
% \href{http://www.texstudio.org/}{http://www.texstudio.org/}
% \bibitem{memoir}
% Wilson, Peter R., Lars Madsen (2016).
-% \emph{Package memoir}, Comprehensive TeX Archive Network. Consulté le 19 mai 2017
-% à \href{https://www.ctan.org/pkg/memoir}{https://www.ctan.org/pkg/memoir}
+% \emph{Package memoir}, Comprehensive TeX Archive Network. Consult\'{e} le 19 mai 2017
+% \`{a} \href{https://www.ctan.org/pkg/memoir}{https://www.ctan.org/pkg/memoir}
% \bibitem{babel}
% Bezos López, Javier, Johannes L. Braams (2017).
-% \emph{Package babel}, Comprehensive TeX Archive Network. Consulté le 19 mai 2017
-% à \href{https://www.ctan.org/pkg/babel}{https://www.ctan.org/pkg/babel}
+% \emph{Package babel}, Comprehensive TeX Archive Network. Consult\'{e} le 19 mai 2017
+% \`{a} \href{https://www.ctan.org/pkg/babel}{https://www.ctan.org/pkg/babel}
% \bibitem{hyperref}
% Oberdiek, Heiko, Sebastian Rahtz (2017).
-% \emph{Package hyperref}, Comprehensive TeX Archive Network. Consulté le 19 mai 2017
-% à \href{https://www.ctan.org/pkg/hyperref}{https://www.ctan.org/pkg/hyperref}
+% \emph{Package hyperref}, Comprehensive TeX Archive Network. Consult\'{e} le 19 mai 2017
+% \`{a} \href{https://www.ctan.org/pkg/hyperref}{https://www.ctan.org/pkg/hyperref}
% \bibitem{chapterbib}
% Arseneau, Donald (2010).
-% \emph{Package chapterbib}, Comprehensive TeX Archive Network. Consulté le 23 mai 2017
-% à \href{https://www.ctan.org/pkg/chapterbib}{https://www.ctan.org/pkg/chapterbib}
+% \emph{Package chapterbib}, Comprehensive TeX Archive Network. Consult\'{e} le 23 mai 2017
+% \`{a} \href{https://www.ctan.org/pkg/chapterbib}{https://www.ctan.org/pkg/chapterbib}
% \bibitem{calc}
% Thorup, Kresten Krab, Frank Jensen et The {\LaTeX} Team (2007).
-% \emph{Package calc}, Comprehensive TeX Archive Network. Consulté le 23 mai 2017 à
+% \emph{Package calc}, Comprehensive TeX Archive Network. Consult\'{e} le 23 mai 2017 \`{a}
% \href{https://www.ctan.org/pkg/calc}{https://www.ctan.org/pkg/calc}
% \bibitem{enumitem}
% Bezos López, Javier (2009).
-% \emph{Package enumitem}, Comprehensive TeX Archive Network. Consulté le 23 mai 2017 à
+% \emph{Package enumitem}, Comprehensive TeX Archive Network. Consult\'{e} le 23 mai 2017 \`{a}
% \href{https://www.ctan.org/pkg/enumitem}{https://www.ctan.org/pkg/enumitem}
% \bibitem{ifthen}
% Lamport, Leslie, David Carlisle et The {\LaTeX} Team (2014).
-% \emph{Package ifthen}, Comprehensive TeX Archive Network. Consulté le 23 mai 2017 à
+% \emph{Package ifthen}, Comprehensive TeX Archive Network. Consult\'{e} le 23 mai 2017 \`{a}
% \href{https://www.ctan.org/pkg/ifthen}{https://www.ctan.org/pkg/ifthen}
% \bibitem{francaisbst}
% Goulet, Vincent (2012).
-% \emph{Package francais-bst}, Comprehensive TeX Archive Network. Consulté le 23 mai 2017 à
+% \emph{Package francais-bst}, Comprehensive TeX Archive Network. Consult\'{e} le 23 mai 2017 \`{a}
% \href{https://www.ctan.org/pkg/francais-bst}{https://www.ctan.org/pkg/francais-bst}
% \bibitem{natbib}
% Daly, Patrick W., Arthur Ogawa (2009).
-% \emph{Package natbib}, Comprehensive TeX Archive Network. Consulté le 29 mai 2017 à
+% \emph{Package natbib}, Comprehensive TeX Archive Network. Consult\'{e} le 29 mai 2017 \`{a}
% \href{https://www.ctan.org/pkg/natbib}{https://www.ctan.org/pkg/natbib}
% \bibitem{iflang}
% Oberdiek, Heiko (2007).
-% \emph{Package iflang}, Comprehensive TeX Archive Network. Consulté le 25 septembre 2017 à
+% \emph{Package iflang}, Comprehensive TeX Archive Network. Consult\'{e} le 25 septembre 2017 \`{a}
% \href{https://www.ctan.org/pkg/iflang}{https://www.ctan.org/pkg/iflang}
% \bibitem{stylehec}
% Archambault, Caroline (2017).
-% \emph{Bibliographie selon le style HEC Montréal}, Bibliothèque HEC Montréal. Consulté le 5 octobre 2017 à
+% \emph{Bibliographie selon le style HEC Montr\'{e}al}, Biblioth\`{e}que HEC Montr\'{e}al. Consult\'{e} le 5 octobre 2017 \`{a}
% \href{http://libguides.hec.ca/style-hec}{http://libguides.hec.ca/style-hec}
% \bibitem{udem:reglements}
-% Secrétariat général (2018).
-% \emph{Réglement pédagogique de la faculté des études supérieures et postdoctorales},
-% Université de Montréal. Consulté le 23 avril 2018 à
+% Secr\'{e}tariat g\'{e}n\'{e}ral (2018).
+% \emph{R\'{e}glement p\'{e}dagogique de la facult\'{e} des \'{e}tudes sup\'{e}rieures et postdoctorales},
+% Universit\'{e} de Montr\'{e}al. Consult\'{e} le 23 avril 2018 \`{a}
% \href{http://secretariatgeneral.umontreal.ca/documents-officiels/reglements-et-politiques/reglement-pedagogique-de-la-faculte-des-etudes-superieures-et-postdoctorales/}%
% {http://secretariatgeneral.umontreal.ca/documents-officiels/reglements-et-politiques/reglement-pedagogique-de-la-faculte-des-etudes-superieures-et-postdoctorales/}
% \bibitem{udem:guide}
-% Faculté des études supérieures et postdoctorales (2015).
-% \emph{Guide de présentation des mémoires et des thèses de l'Université de Montréal}, Université de Montréal.
-% Consulté le 23 avril 2018 à \href{http://www.fesp.umontreal.ca/fileadmin/fesp/documents/Cheminement/GuidePresentationMemoiresTheses.pdf}%
+% Facult\'{e} des \'{e}tudes sup\'{e}rieures et postdoctorales (2015).
+% \emph{Guide de pr\'{e}sentation des m\'{e}moires et des th\`{e}ses de l'Universit\'{e} de Montr\'{e}al}, Universit\'{e} de Montr\'{e}al.
+% Consult\'{e} le 23 avril 2018 \`{a} \href{http://www.fesp.umontreal.ca/fileadmin/fesp/documents/Cheminement/GuidePresentationMemoiresTheses.pdf}%
% {http://www.fesp.umontreal.ca/fileadmin/fesp/documents/Cheminement/ GuidePresentationMemoiresTheses.pdf}
% \end{thebibliography}
% \clearpage
% \PrintChanges
% }
%
-% ^^A Début du code de la classe
+% ^^A Debut du code de la classe
%
% \appendix
%
@@ -1253,8 +1267,8 @@
%
% \ifnum\frenchdoc=1
% Vous retrouverez dans cette annexe le code source de la classe {\LaTeX} {\hecthese}.
-% Si vous avez envie de voir comment elle est programée, d'aider à la déboguer,
-% à l'améliorer, etc., cette section est pour vous.
+% Si vous avez envie de voir comment elle est program\'{e}e, d'aider \`{a} la d\'{e}boguer,
+% \`{a} l'am\'{e}liorer, etc., cette section est pour vous.
% \else
% You will find in this section the \LaTeX\ \hecthese\ document class' source code.
% If you want to see how it is programmed, help debug or enhance it, etc., this
@@ -1262,17 +1276,17 @@
% \fi
%
% \ifnum\frenchdoc=1
-% \subsection{Tests et valeurs booléennes}
+% \subsection{Tests et valeurs bool\'{e}ennes}
% \else
% \subsection{Boolean tests and values}
% \fi
%
% \ifnum\frenchdoc=1
% Pour effectuer les tests conditionnels, la classe utilise le +package+ +ifthen+\cite{ifthen}.
-% Les variables booléennes servent à déterminer si le travail est une thèse ou un
-% mémoire rédigé de manière classique ou par articles, ainsi qu'à déterminer le
-% genre des intervenants dans la rédaction de la thèse. Une fois les variables créées,
-% des valeurs par défaut leur sont attribuées.
+% Les variables bool\'{e}ennes servent \`{a} d\'{e}terminer si le travail est une th\`{e}se ou un
+% m\'{e}moire r\'{e}dig\'{e} de mani\`{e}re classique ou par articles, ainsi qu'\`{a} d\'{e}terminer le
+% genre des intervenants dans la r\'{e}daction de la th\`{e}se. Une fois les variables cr\'{e}\'{e}es,
+% des valeurs par d\'{e}faut leur sont attribu\'{e}es.
% \else
% To run conditional tests, the class uses the +ifthen+ package\cite{ifthen}. Boolean variables
% are used to determine what kind of document is being written (Ph.D. or M.Sc., classic or by articles)
@@ -1284,16 +1298,16 @@
%<*class>
\RequirePackage{ifthen}
-% Booléens
-\newboolean{HEC@isPhD} % Le travail est une thèse ou non
-\newboolean{HEC@isClassique} % Le travail est rédigé de manière classique ou non
-\newboolean{HEC@isPresRappFemme} % Président rapporteur femme ou non
+% Booleens
+\newboolean{HEC@isPhD} % Le travail est une these ou non
+\newboolean{HEC@isClassique} % Le travail est redige de maniere classique ou non
+\newboolean{HEC@isPresRappFemme} % President rapporteur femme ou non
\newboolean{HEC@isDirRechFemme} % Directeur de la recherche femme ou non
\newboolean{HEC@isCodirRechFemme} % Codirecteur de la recherche femme ou non
\newboolean{HEC@isExamExtFemme} % Examinateur externe femme ou non
-\newboolean{HEC@isRepDirFemme} % Représentant du directeur femme ou non
+\newboolean{HEC@isRepDirFemme} % Representant du directeur femme ou non
-% Valeurs par défaut
+% Valeurs par defaut
\setboolean{HEC@isPhD}{true}
\setboolean{HEC@isClassique}{true}
\setboolean{HEC@isPresRappFemme}{false}
@@ -1310,8 +1324,8 @@
% \fi
%
% \ifnum\frenchdoc=1
-% Les quelques options de la classe sont déclarées ci-dessous. Notez que
-% les options concernant le +package+ +babel+ ne sont pas déclarées ici.
+% Les quelques options de la classe sont d\'{e}clar\'{e}es ci-dessous. Notez que
+% les options concernant le +package+ +babel+ ne sont pas d\'{e}clar\'{e}es ici.
% \else
% The few options available with the class are declared hereunder. Note
% that the +babel+ package's options are not declared here.
@@ -1319,7 +1333,7 @@
%
% \begin{macrocode}
-% Taille de la police de caractère
+% Taille de la police de caractere
\DeclareOption{10pt}{%
\PassOptionsToClass{10pt}{memoir}
}
@@ -1357,10 +1371,10 @@
% \fi
%
% \ifnum\frenchdoc=1
-% La classe est chargée dans le document avec toutes les options
-% déclarées par l'utilisateur. Si une taille de police de caractères
-% n'a pas été spécifiée, la classe utilise la taille +12pt+ par
-% défaut.
+% La classe est charg\'{e}e dans le document avec toutes les options
+% d\'{e}clar\'{e}es par l'utilisateur. Si une taille de police de caract\`{e}res
+% n'a pas \'{e}t\'{e} sp\'{e}cifi\'{e}e, la classe utilise la taille +12pt+ par
+% d\'{e}faut.
% \else
% The class is loaded in the document with all the options declared
% by the end user. If a font size is not specified, the classe loads
@@ -1371,7 +1385,7 @@
% Chargement de la classe
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{memoir}}
-\ExecuteOptions{12pt} % Taille par défaut
+\ExecuteOptions{12pt} % Taille par defaut
\ProcessOptions
\LoadClass{memoir}
@@ -1384,16 +1398,16 @@
% \fi
%
% \ifnum\frenchdoc=1
-% Très peu de +packages+ sont chargés avec la classe afin de vous permettre
-% de rédiger avec la plus grande flexibilité possible.
+% Tr\`{e}s peu de +packages+ sont charg\'{e}s avec la classe afin de vous permettre
+% de r\'{e}diger avec la plus grande flexibilit\'{e} possible.
%
% La classe utilise le +package+ +natbib+\cite{natbib} pour permettre l'utilisation des citations
-% textuelles \emph{auteur-année}. Le +package+ +chapterbib+ n'est chargé que si
-% le travail est rédigé par articles.
+% textuelles \emph{auteur-ann\'{e}e}. Le +package+ +chapterbib+ n'est charg\'{e} que si
+% le travail est r\'{e}dig\'{e} par articles.
%
-% Les autres +packages+ chargés sont typiques de la plupart des documents : encodage
+% Les autres +packages+ charg\'{e}s sont typiques de la plupart des documents : encodage
% des fichiers, gestion des graphiques, des images et des couleurs, utilisation des
-% mathématiques, etc.
+% math\'{e}matiques, etc.
% \else
% Very few packages are loaded in the class so you can write your document
% with a maximum flexibility.
@@ -1408,23 +1422,23 @@
%
% \begin{macrocode}
-\RequirePackage[utf8]{inputenc} % Pour écrire les diacritiques directement
+\RequirePackage[utf8]{inputenc} % Pour ecrire les diacritiques directement
\RequirePackage[T1]{fontenc} % Utilisation des polices T1
-\RequirePackage{natbib} % À inclure avant babel
+\RequirePackage{natbib} % A inclure avant babel
-% Si le document est rédigé par articles, charger chapterbib.
+% Si le document est redige par articles, charger chapterbib.
\ifthenelse{\boolean{HEC@isClassique}}{}{%
\RequirePackage{chapterbib} % Bibliographies multiples pour les articles
}
\RequirePackage{babel} % Support multilingue
\RequirePackage[autolanguage]{numprint}
-\RequirePackage{calc} % Nécessaire pour la liste des abréviations
-\RequirePackage{enumitem} % Nécessaire pour la liste des abréviations
-\RequirePackage{tocvsec2} % Pour déterminer la profondeur de la TDM
+\RequirePackage{calc} % Necessaire pour la liste des abreviations
+\RequirePackage{enumitem} % Necessaire pour la liste des abreviations
+\RequirePackage{tocvsec2} % Pour determiner la profondeur de la TDM
\RequirePackage{graphicx} % Insertion de graphiques et d'images
\RequirePackage{color} % Gestion des couleurs
\RequirePackage{amsmath} % Package obligatoire pour les maths
-\RequirePackage{iflang} % Détection de la langue
+\RequirePackage{iflang} % Detection de la langue
% \end{macrocode}
%
@@ -1435,10 +1449,10 @@
% \fi
%
% \ifnum\frenchdoc=1
-% Toutes les normes de présentation graphiques du \emph{Guide de rédaction} sont
-% établies ci-dessous. À la compilation, {\LaTeX} se plaindra que
-% les entêtes sont trop petites pour son contenu, mais cela ne causera pas de
-% problèmes pour la génération de votre document (le compilateur retourne un avertissement,
+% Toutes les normes de pr\'{e}sentation graphiques du \emph{Guide de r\'{e}daction} sont
+% \'{e}tablies ci-dessous. \`{A} la compilation, {\LaTeX} se plaindra que
+% les ent\^{e}tes sont trop petites pour son contenu, mais cela ne causera pas de
+% probl\`{e}mes pour la g\'{e}n\'{e}ration de votre document (le compilateur retourne un avertissement,
% pas une erreur).
% \else
% All the presentation standards required by the \emph{Guidelines} are programmed
@@ -1448,7 +1462,7 @@
%
% \begin{macrocode}
-\pagestyle{plain} % Numéro de page centré au pied de page
+\pagestyle{plain} % Numero de page centre au pied de page
\renewcommand{\baselinestretch}{1.5} % Interligne et demie
\setlength{\topmargin}{0cm} % Marge du haut
\setlength{\oddsidemargin}{1.5cm} % Marge de gauche des pages impaires
@@ -1456,9 +1470,9 @@
\setlength{\textwidth}{15cm} % Largeur du bloc de texte
\setlength{\textheight}{21.9cm} % Hauteur du bloc de texte
\setlength{\marginparwidth}{0pt} % Suppression des notes de marge
-\setlength{\marginparsep}{0pt} % Suppression du séparateur de marge
-\setlength{\headheight}{0pt} % Suppression de l'entête
-\setlength{\headsep}{0pt} % Suppression du séparateur d'entête
+\setlength{\marginparsep}{0pt} % Suppression du separateur de marge
+\setlength{\headheight}{0pt} % Suppression de l'entete
+\setlength{\headsep}{0pt} % Suppression du separateur d'entete
% \end{macrocode}
%
@@ -1469,21 +1483,21 @@
% \fi
%
% \ifnum\frenchdoc=1
-% \subsubsection{Métadonnées du document}
+% \subsubsection{M\'{e}tadonn\'{e}es du document}
% \else
% \subsubsection{Document metadata}
% \fi
%
% \ifnum\frenchdoc=1
-% Chaque commande relative aux métadonnées du document que vous retrouverez
-% dans le préambule a son équivalent en commande interne. À titre d'exemple, la
-% commande \cmd{\HECtitre} a comme équivalent \cmd{\HEC@titre}. Ce sont les
-% commandes internes qui servent à construire les pages titre et la page
+% Chaque commande relative aux m\'{e}tadonn\'{e}es du document que vous retrouverez
+% dans le pr\'{e}ambule a son \'{e}quivalent en commande interne. \`{A} titre d'exemple, la
+% commande \cmd{\HECtitre} a comme \'{e}quivalent \cmd{\HEC@titre}. Ce sont les
+% commandes internes qui servent \`{a} construire les pages titre et la page
% d'identification du jury.
%
% Plusieurs commandes ont leur traduction anglaise afin de faciliter l'utilisation
% de la classe par les anglophones, mais ces versions anglaises ne sont que des
-% coquilles qui appellent leur équivalent français.
+% coquilles qui appellent leur \'{e}quivalent fran\c{c}ais.
% \else
% Every metadata-related command that you'll find in the document preamble has
% its internal command equivalent. Example given, the \cmd{\HECtitre} has
@@ -1622,15 +1636,15 @@
% \end{macrocode}
%
% \ifnum\frenchdoc=1
-% \subsubsection{Métadonnées du pdf}
+% \subsubsection{M\'{e}tadonn\'{e}es du pdf}
% \else
% \subsubsection{pdf metadata}
% \fi
%
% \ifnum\frenchdoc=1
-% En plus des métadonnées relatives à votre travail, la classe définit
-% des commandes pour insérer des métadonnées dans le fichier +.pdf+ qui
-% sera généré par la compilation de votre thèse ou mémoire. Ces commandes
+% En plus des m\'{e}tadonn\'{e}es relatives \`{a} votre travail, la classe d\'{e}finit
+% des commandes pour ins\'{e}rer des m\'{e}tadonn\'{e}es dans le fichier +.pdf+ qui
+% sera g\'{e}n\'{e}r\'{e} par la compilation de votre th\`{e}se ou m\'{e}moire. Ces commandes
% se retrouvent dans les options du +package+ +hyperref+.
% \else
% Along with the metadata-related commands for your work, the class
@@ -1653,10 +1667,10 @@
% \fi
%
% \ifnum\frenchdoc=1
-% La classe utilise trois commandes internes pour générer les pages titre
+% La classe utilise trois commandes internes pour g\'{e}n\'{e}rer les pages titre
% et la page d'identification du jury. La commande \cmd{\HECpagestitre} est,
-% quant à elle, insérée au début de l'environnement +document+ pour
-% générer la (les) page(s) en fonction du type de document rédigé.
+% quant \`{a} elle, ins\'{e}r\'{e}e au d\'{e}but de l'environnement +document+ pour
+% g\'{e}n\'{e}rer la (les) page(s) en fonction du type de document r\'{e}dig\'{e}.
% \else
% The class uses three internal commands to generate the title page and
% the jury identification page. The \cmd{\HECtitlepages} command is inserted
@@ -1667,23 +1681,23 @@
% \begin{macro}{\HEC@pageTitrePhD}
%
% \ifnum\frenchdoc=1
-% La commande +\HEC@pageTitrePhD+ génère la page titre des thèses. Elle
+% La commande +\HEC@pageTitrePhD+ g\'{e}n\`{e}re la page titre des th\`{e}ses. Elle
% utilise d'abord l'environnement +titlingpage+ de la classe +memoir+, qui
-% permet la création de pages titre personnalisées plus flexibles que la commande
+% permet la cr\'{e}ation de pages titre personnalis\'{e}es plus flexibles que la commande
% {\LaTeX} \cmd{\maketitle}\cite{memoir}. L'environnement +titlingpage+ recommence
-% la numérotation des pages à 1 après la page titre, ce qui permet de numéroter
-% virtuellement cette dernière sans compter la page blanche du verso.
+% la num\'{e}rotation des pages \`{a} 1 apr\`{e}s la page titre, ce qui permet de num\'{e}roter
+% virtuellement cette derni\`{e}re sans compter la page blanche du verso.
%
-% L'insertion automatique du sous-titre se fait en vérifiant la longueur de celui-ci.
-% S'il est vide, on n'insère qu'un saut de ligne ; dans le cas contraire, on insère un
-% : puis le sous-titre à la ligne suivante.
+% L'insertion automatique du sous-titre se fait en v\'{e}rifiant la longueur de celui-ci.
+% S'il est vide, on n'ins\`{e}re qu'un saut de ligne ; dans le cas contraire, on ins\`{e}re un
+% : puis le sous-titre \`{a} la ligne suivante.
%
-% Plutôt que de définir des espacements de grandeur définies entre les différents éléments
+% Plut\^{o}t que de d\'{e}finir des espacements de grandeur d\'{e}finies entre les diff\'{e}rents \'{e}l\'{e}ments
% de la page titre, la commande utilise la commande \cmd{\vfill}, ce qui permet de justifier
-% verticalement les éléments de la page, peu importe la taille de ceux-ci.
+% verticalement les \'{e}l\'{e}ments de la page, peu importe la taille de ceux-ci.
%
-% Référez-vous à l'Annexe F du \emph{Guide de rédaction} pour voir un modèle de page titre
-% de thèse.
+% R\'{e}f\'{e}rez-vous \`{a} l'Annexe F du \emph{Guide de r\'{e}daction} pour voir un mod\`{e}le de page titre
+% de th\`{e}se.
% \else
% The +\HEC@pageTitrePhD+ command generates the dissertations' title page. It uses the
% +memoir+ class' +titlingpage+ environment, which gives more flexibility than \LaTeX's
@@ -1705,8 +1719,8 @@
\begin{titlingpage}
\centering
\begin{SingleSpace}
- {\Large HEC MONTRÉAL}\\
- École affiliée à l'Université de Montréal
+ {\Large HEC MONTR\'{E}AL}\\
+ \'{E}cole affili\'{e}e \`{a} l'Universit\'{e} de Montr\'{e}al
\vfill
{\bfseries\HEC@titre
\ifthenelse{\equal{\HEC@sousTitre}{}}%
@@ -1716,8 +1730,8 @@
par \\
\HEC@auteur}
\vfill
- Thèse présentée en vue de l'obtention du grade de Ph. D. en administration \\
- (option \HEC@optionPhD)
+ Th\`{e}se pr\'{e}sent\'{e}e en vue de l'obtention du grade de Ph. D. en administration \\
+ (sp\'{e}cialisation \HEC@optionPhD)
\vfill
\HEC@moisDepot~\HEC@anneeDepot
\vfill
@@ -1733,14 +1747,14 @@
% \begin{macro}{\HEC@pageIdentificationJury}
%
% \ifnum\frenchdoc=1
-% Cette commande utilise la version étoilée de l'environnement +titlingpage+, car
-% elle ne recommence pas la numérotation des pages à 1, ce qui permet de démarrer le
-% résumé français de la thèse à la page iii.
+% Cette commande utilise la version \'{e}toil\'{e}e de l'environnement +titlingpage+, car
+% elle ne recommence pas la num\'{e}rotation des pages \`{a} 1, ce qui permet de d\'{e}marrer le
+% r\'{e}sum\'{e} fran\c{c}ais de la th\`{e}se \`{a} la page iii.
%
-% La commande accorde aussi en genre tous les titres des intervenants de la thèse en
-% évaluant individuellement les valeurs booléennes des variables +HEC@is*Femme+.
+% La commande accorde aussi en genre tous les titres des intervenants de la th\`{e}se en
+% \'{e}valuant individuellement les valeurs bool\'{e}ennes des variables +HEC@is*Femme+.
%
-% Référez-vous à l'Annexe G du \emph{Guide de rédaction} pour voir un modèle de page
+% R\'{e}f\'{e}rez-vous \`{a} l'Annexe G du \emph{Guide de r\'{e}daction} pour voir un mod\`{e}le de page
% d'identification du jury.
% \else
% This command uses the +titlingpage+ environment's starred version which doesn't reset
@@ -1757,30 +1771,30 @@
\begin{titlingpage*}
\centering
\begin{SingleSpace}
- {\Large HEC MONTRÉAL}\\
- École affiliée à l'Université de Montréal
+ {\Large HEC MONTR\'{E}AL}\\
+ \'{E}cole affili\'{e}e \`{a} l'Universit\'{e} de Montr\'{e}al
\vfill
- Cette thèse intitulée :
+ Cette th\`{e}se intitul\'{e}e :
\vfill
{\bfseries\HEC@titre
\ifthenelse{\equal{\HEC@sousTitre}{}}%
{ \\ }%
{~: \\ \HEC@sousTitre}}
\vfill
- Présentée par :
+ Pr\'{e}sent\'{e}e par :
\vfill %
{\bfseries \HEC@auteur}
\vfill
- a été évaluée par un jury composé des personnes suivantes :
+ a \'{e}t\'{e} \'{e}valu\'{e}e par un jury compos\'{e} des personnes suivantes :
\vfill
\HEC@presidentRapporteur \\
- HEC Montréal \\
+ HEC Montr\'{e}al \\
\ifthenelse{\boolean{HEC@isPresRappFemme}}%
- {Présidente-rapportrice}%
- {Président-rapporteur}
+ {Pr\'{e}sidente-rapportrice}%
+ {Pr\'{e}sident-rapporteur}
\vfill
\HEC@directeurRecherche \\
- HEC Montréal \\
+ HEC Montr\'{e}al \\
\ifthenelse{\boolean{HEC@isDirRechFemme}}%
{Directrice de recherche}%
{Directeur de recherche}
@@ -1802,10 +1816,10 @@
{Examinateur externe}
\vfill
\HEC@representantDirecteur \\
- HEC Montréal \\
+ HEC Montr\'{e}al \\
\ifthenelse{\boolean{HEC@isRepDirFemme}}{%
- Représentante du directeur de HEC Montréal}{%
- Représentant du directeur de HEC Montréal}
+ Repr\'{e}sentante du directeur de HEC Montr\'{e}al}{%
+ Repr\'{e}sentant du directeur de HEC Montr\'{e}al}
\end{SingleSpace}
\end{titlingpage*}
}
@@ -1818,13 +1832,13 @@
%
% \ifnum\frenchdoc=1
% La commande \cmd{\HEC@pageTitreMSc} utilise l'environnement +titlingpage+
-% et insère automatiquement le sous-titre de la même manière que la commande
-% de page titre de thèse.
+% et ins\`{e}re automatiquement le sous-titre de la m\^{e}me mani\`{e}re que la commande
+% de page titre de th\`{e}se.
%
-% Cette commande est le seul endroit où on utilise un espacement défini pour
-% séparer les éléments du bloc titre-sous-titre-auteur de la page, et ce, afin de
-% se conformer aux normes de présentation démontrées à l'Annexe E du
-% \emph{Guide de rédaction}.
+% Cette commande est le seul endroit où on utilise un espacement d\'{e}fini pour
+% s\'{e}parer les \'{e}l\'{e}ments du bloc titre-sous-titre-auteur de la page, et ce, afin de
+% se conformer aux normes de pr\'{e}sentation d\'{e}montr\'{e}es \`{a} l'Annexe E du
+% \emph{Guide de r\'{e}daction}.
% \else
% The \cmd{\HEC@pageTitreMSc} command uses the +titlingpage+ environment
% in the same manner as the dissertations' title page command.
@@ -1840,7 +1854,7 @@
\begin{titlingpage}
\centering
\begin{SingleSpace}
- {\Large HEC MONTRÉAL}
+ {\Large HEC MONTR\'{E}AL}
\vfill
{\bfseries\HEC@titre
\ifthenelse{\equal{\HEC@sousTitre}{}}%
@@ -1848,12 +1862,18 @@
{~: \\ \HEC@sousTitre \\[12pt]}
par \\[12pt]
\HEC@auteur
+ \vfill
+ \HEC@directeurRecherche \\
+ HEC Montr\'{e}al \\
+ \ifthenelse{\boolean{HEC@isDirRechFemme}}%
+ {Directrice de recherche}%
+ {Directeur de recherche}
\vfill %
Sciences de la gestion \\%
- (Option \HEC@optionMSc)}
+ (Sp\'{e}cialisation \HEC@optionMSc)}
\vfill
- \emph{Mémoire présenté en vue de l'obtention \\ %
- du grade de maîtrise ès sciences \\ %
+ \emph{M\'{e}moire pr\'{e}sent\'{e} en vue de l'obtention \\ %
+ du grade de ma\^{i}trise \`{e}s sciences \\ %
(M. Sc.)}
\vfill
\HEC@moisDepot~\HEC@anneeDepot \\ %
@@ -1873,10 +1893,10 @@
% \fi
%
% \ifnum\frenchdoc=1
-% La commande évalue la valeur de la variable booléenne +HEC@isPhD+.
-% Si le type de document est une thèse, la commande insère la page titre
-% de thèse et la page d'identification du jury. Dans le cas contraire,
-% elle insère la page titre d'un mémoire.
+% La commande \'{e}value la valeur de la variable bool\'{e}enne +HEC@isPhD+.
+% Si le type de document est une th\`{e}se, la commande ins\`{e}re la page titre
+% de th\`{e}se et la page d'identification du jury. Dans le cas contraire,
+% elle ins\`{e}re la page titre d'un m\'{e}moire.
% \else
% The command evaluates the +HEC@isPhD+ boolean variable's value.
% If the document is a dissertation, it inserts the dissertation's title
@@ -1907,13 +1927,13 @@
% \fi
%
% \ifnum\frenchdoc=1
-% Dans les thèses et mémoires rédigés par articles, il y a plusieurs
+% Dans les th\`{e}ses et m\'{e}moires r\'{e}dig\'{e}s par articles, il y a plusieurs
% introductions et conclusions, soit une introduction et une conclusion
-% générales pour le travail, et une introduction et une conclusion par article.
-% Pour distinguer les différentes introductions et conclusions, la classe
-% modifie le titre de ces sections pour «Introduction générale» et «Conclusion
-% générale». Elle tient aussi compte de la langue par défaut, comme pour tous
-% les autres titres, comme on le verra en détail à la Section \ref{anglais}.
+% g\'{e}n\'{e}rales pour le travail, et une introduction et une conclusion par article.
+% Pour distinguer les diff\'{e}rentes introductions et conclusions, la classe
+% modifie le titre de ces sections pour «Introduction g\'{e}n\'{e}rale» et «Conclusion
+% g\'{e}n\'{e}rale». Elle tient aussi compte de la langue par d\'{e}faut, comme pour tous
+% les autres titres, comme on le verra en d\'{e}tail \`{a} la Section \ref{anglais}.
% \else
% In dissertations and theses written with articles, there is more than
% one introduction and conclusion : a general introduction and conclusion for the
@@ -1935,8 +1955,8 @@
\renewcommand{\HECtitreIntroduction}{General Introduction}
\renewcommand{\HECtitreConclusion}{General Conclusion}
}{%
- \renewcommand{\HECtitreIntroduction}{Introduction générale}
- \renewcommand{\HECtitreConclusion}{Conclusion générale}
+ \renewcommand{\HECtitreIntroduction}{Introduction g\'{e}n\'{e}rale}
+ \renewcommand{\HECtitreConclusion}{Conclusion g\'{e}n\'{e}rale}
}
}
}
@@ -1944,17 +1964,17 @@
% \end{macrocode}
%
% \ifnum\frenchdoc=1
-% \subsubsection{Prise en charge de l'anglais dans les titres et la table des matières}
+% \subsubsection{Prise en charge de l'anglais dans les titres et la table des mati\`{e}res}
% \else
% \subsubsection{Automatic english translation of titles and table of contents}
% \fi
% \label{anglais}
%
% \ifnum\frenchdoc=1
-% Le +package+ +iflang+\cite{iflang} permet de détecter la langue par défaut d'un document et
-% d'effectuer des actions conditionnelles à la langue détectée. La classe {\hecthese} prend en
-% charge l'anglais et le français et se sert de +iflang+ pour générer les titres des sections
-% «maison» des thèses et mémoires.
+% Le +package+ +iflang+\cite{iflang} permet de d\'{e}tecter la langue par d\'{e}faut d'un document et
+% d'effectuer des actions conditionnelles \`{a} la langue d\'{e}tect\'{e}e. La classe {\hecthese} prend en
+% charge l'anglais et le fran\c{c}ais et se sert de +iflang+ pour g\'{e}n\'{e}rer les titres des sections
+% «maison» des th\`{e}ses et m\'{e}moires.
% \else
% The +iflang+ package\cite{iflang} enables the detection of a document's default language and
% allows the class to carry out conditional actions depending on the language. The \hecthese\
@@ -1965,7 +1985,7 @@
% \begin{macrocode}
\newcommand{\HECtdmAbreviations}{%
- \IfLanguageName{english}{List of acronyms}{Liste des abréviations}
+ \IfLanguageName{english}{List of acronyms}{Liste des abr\'{e}viations}
}
\newcommand{\HECtdmRemerciements}{%
@@ -1977,39 +1997,39 @@
}
\newcommand{\HECtdmCadreTheorique}{%
- \IfLanguageName{english}{Theoretical framework}{Cadre théorique}
+ \IfLanguageName{english}{Theoretical framework}{Cadre th\'{e}orique}
}
\newcommand{\HECtdmRevueLitterature}{%
- \IfLanguageName{english}{Literature review}{Revue de la littérature}
+ \IfLanguageName{english}{Literature review}{Revue de la litt\'{e}rature}
}
\newcommand{\HECtdmResumeArticle}{%
- \IfLanguageName{english}{Abstract}{Résumé}
+ \IfLanguageName{english}{Abstract}{R\'{e}sum\'{e}}
}
% \end{macrocode}
%
% \ifnum\frenchdoc=1
-% \subsubsection{Bibliographies multiples dans les thèses et mémoires par articles}
+% \subsubsection{Bibliographies multiples dans les th\`{e}ses et m\'{e}moires par articles}
% \else
% \subsubsection{Multiple bibliographies in by-articles dissertations and theses}
% \fi
%
% \ifnum\frenchdoc=1
% La classe +memoir+ et le +package+ +chapterbib+ ne s'entendent pas
-% sur la place à accorder aux multiples bibliographies dans un document.
+% sur la place \`{a} accorder aux multiples bibliographies dans un document.
% La commande \cmd{\HECbibliographieArticle} fait en sorte que la
-% bibliographie d'un article soit considérée comme une section non numérotée
-% de cet article et renomme la section «Références».
+% bibliographie d'un article soit consid\'{e}r\'{e}e comme une section non num\'{e}rot\'{e}e
+% de cet article et renomme la section «R\'{e}f\'{e}rences».
%
% La commande \cmd{\HECbibliographieGenerale} remet par la suite la
-% bibliographie à sa place usuelle, soit au même niveau qu'un chapitre, encore
-% une fois sans la numéroter. La commande renomme aussi la bibliographie
-% «Bibliographie générale».
+% bibliographie \`{a} sa place usuelle, soit au m\^{e}me niveau qu'un chapitre, encore
+% une fois sans la num\'{e}roter. La commande renomme aussi la bibliographie
+% «Bibliographie g\'{e}n\'{e}rale».
%
-% Les deux commandes tiennent compte de la langue par défaut du document
-% pour afficher la version anglaise ou française des titres des sections.
+% Les deux commandes tiennent compte de la langue par d\'{e}faut du document
+% pour afficher la version anglaise ou fran\c{c}aise des titres des sections.
% \else
% The +memoir+ class and +chapterbib+ package don't play along very well when the
% time comes when bibliographies have to be placed in a document. The
@@ -2032,7 +2052,7 @@
\IfLanguageName{english}{%
\renewcommand{\bibname}{References}
}{%
- \renewcommand{\bibname}{Références}
+ \renewcommand{\bibname}{R\'{e}f\'{e}rences}
}
\section*{\bibname}
\bibmark
@@ -2048,7 +2068,7 @@
\IfLanguageName{english}{%
\renewcommand{\bibname}{Bibliography}
}{%
- \renewcommand{\bibname}{Bibliographie générale}
+ \renewcommand{\bibname}{Bibliographie g\'{e}n\'{e}rale}
}
\chapter*{\bibname}
\bibmark
@@ -2064,12 +2084,12 @@
% \ifnum\frenchdoc=1
% Pour que les citations s'affichent correctement dans tout le document,
% les commandes \cmd{\bibliographystyle} et \cmd{\bibliography} doivent
-% être insérées dans chaque fichier inclus. Cependant, les bibliographies
-% ne doivent s'afficher que dans les articles et à la fin d'une thèse ou
-% d'un mémoire. La commande \cmd{\HECreferences} insère les deux commandes
-% si le document est une thèse ou mémoire par articles,
+% \^{e}tre ins\'{e}r\'{e}es dans chaque fichier inclus. Cependant, les bibliographies
+% ne doivent s'afficher que dans les articles et \`{a} la fin d'une th\`{e}se ou
+% d'un m\'{e}moire. La commande \cmd{\HECreferences} ins\`{e}re les deux commandes
+% si le document est une th\`{e}se ou m\'{e}moire par articles,
% mais «cache» la bibliographie dans un conteneur, une +savebox+ qui ne
-% sera jamais utilisée.
+% sera jamais utilis\'{e}e.
% \else
% In order to display your citations correctly in all the document,
% the \cmd{\bibliographystyle} and \cmd{\bibliography} command have to
@@ -2099,13 +2119,13 @@
% \fi
%
% \ifnum\frenchdoc=1
-% L'environnement +HECdedicace+ crée un bloc de texte centré verticalement
-% dans la page et justifié à droite, prenant au maximum la moitié de la
-% zone de texte normale d'une page. Le bloc de texte est également mis en italiques.
+% L'environnement +HECdedicace+ cr\'{e}e un bloc de texte centr\'{e} verticalement
+% dans la page et justifi\'{e} \`{a} droite, prenant au maximum la moiti\'{e} de la
+% zone de texte normale d'une page. Le bloc de texte est \'{e}galement mis en italiques.
%
% L'environnement +HECabreviations+ est une variante de +description+
-% et sert à créer une liste d'abréviations en deux colonnes alignées : une pour les abréviations,
-% une autre pour leur définition.
+% et sert \`{a} cr\'{e}er une liste d'abr\'{e}viations en deux colonnes align\'{e}es : une pour les abr\'{e}viations,
+% une autre pour leur d\'{e}finition.
% \else
% The +HECdedication+ environment creates a text block that is vertically centered,
% right-aligned horizontally and that takes only half of the page's regular text width.
@@ -2147,10 +2167,10 @@
% \fi
%
% \ifnum\frenchdoc=1
-% Les traductions françaises de la \emph{List of figures} et de l'index ne
-% correspondent pas aux expressions utilisées dans le \emph{Guide de rédaction}.
-% Les traductions «Liste des figures» et «Index analytique» sont programmées
-% à même la classe pour corriger la situation.
+% Les traductions fran\c{c}aises de la \emph{List of figures} et de l'index ne
+% correspondent pas aux expressions utilis\'{e}es dans le \emph{Guide de r\'{e}daction}.
+% Les traductions «Liste des figures» et «Index analytique» sont programm\'{e}es
+% \`{a} m\^{e}me la classe pour corriger la situation.
% \else
% The official French translations for the list of figures and the index
% don't correspond to those of the \emph{Guidelines}' French version.
@@ -2173,31 +2193,31 @@
% \iffalse
% ^^A Contenu des fichiers gabarits
%<*gabarit>
-%<phd&classique&francais>%% GABARIT POUR UNE THÈSE CLASSIQUE
-%<phd&articles&francais>%% GABARIT POUR UNE THÈSE PAR ARTICLES
-%<msc&classique&francais>%% GABARIT POUR UN MÉMOIRE CLASSIQUE
-%<msc&articles&francais>%% GABARIT POUR UN MÉMOIRE PAR ARTICLES
+%<phd&classique&francais>%% GABARIT POUR UNE THESE CLASSIQUE
+%<phd&articles&francais>%% GABARIT POUR UNE THESE PAR ARTICLES
+%<msc&classique&francais>%% GABARIT POUR UN MEMOIRE CLASSIQUE
+%<msc&articles&francais>%% GABARIT POUR UN MEMOIRE PAR ARTICLES
%<phd&classique&anglais>%% TEMPLATE FOR A CLASSIC DISSERTATION
%<phd&articles&anglais>%% TEMPLATE FOR A DISSERTATION WRITTEN WITH ARTICLES
%<msc&classique&anglais>%% TEMPLATE FOR A CLASSIC THESIS
%<msc&articles&anglais>%% TEMPLATE FOR A THESIS WRITTEN WITH ARTICLES
%%
%<*francais>
-%% Ceci est le fichier maître dans lequel vous inscrivez les métadonnées
-%% relatives à votre travail, vous créez vos commandes et environnements
-%% personnalisés, et à partir duquel vous lancez vos compilations.
+%% Ceci est le fichier maitre dans lequel vous inscrivez les m\'{e}tadonn\'{e}es
+%% relatives \`{a} votre travail, vous cr\'{e}ez vos commandes et environnements
+%% personnalis\'{e}s, et \`{a} partir duquel vous lancez vos compilations.
%%
-%% NE RÉDIGEZ PAS VOTRE THÈSE OU MÉMOIRE DANS CE FICHIER!
+%% NE REDIGEZ PAS VOTRE THESE OU MEMOIRE DANS CE FICHIER!
%%
%% Consultez la documentation de la classe hecthese pour de plus amples
%% informations.
%%
-%% DÉCLARATION DE LA CLASSE DE DOCUMENT
+%% DECLARATION DE LA CLASSE DE DOCUMENT
%%
-%% La classe est déclarée avec le type de document et les langues par
-%% défaut. Inscrivez dans la liste d'options la taille de police de
-%% caractères (10pt, 11pt, 12pt) ou laissez la classe charger la taille
-%% par défaut : 12pt.
+%% La classe est declaree avec le type de document et les langues par
+%% defaut. Inscrivez dans la liste d'options la taille de police de
+%% caracteres (10pt, 11pt, 12pt) ou laissez la classe charger la taille
+%% par defaut : 12pt.
%</francais>
%<*anglais>
%% This is the master file where you write all your work-related metadata,
@@ -2214,30 +2234,48 @@
%% language. Write in the options list the desired font size (10pt, 11pt,12pt)
%% or let the class load the default font size: 12pt.
%</anglais>
-%<phd&classique&francais>\documentclass[phdclassique,english,frenchb]{hecthese}
-%<phd&articles&francais>\documentclass[phdarticles,english,frenchb]{hecthese}
-%<msc&classique&francais>\documentclass[mscclassique,english,frenchb]{hecthese}
-%<msc&articles&francais>\documentclass[mscarticles,english,frenchb]{hecthese}
-%<phd&classique&anglais>\documentclass[phdclassique,frenchb,english]{hecthese}
-%<phd&articles&anglais>\documentclass[phdarticles,frenchb,english]{hecthese}
-%<msc&classique&anglais>\documentclass[mscclassique,frenchb,english]{hecthese}
-%<msc&articles&anglais>\documentclass[mscarticles,frenchb,english]{hecthese}
+%<phd&classique&francais>\documentclass[phdclassique,english,french]{hecthese}
+%<phd&articles&francais>\documentclass[phdarticles,english,french]{hecthese}
+%<msc&classique&francais>\documentclass[mscclassique,english,french]{hecthese}
+%<msc&articles&francais>\documentclass[mscarticles,english,french]{hecthese}
+%<phd&classique&anglais>\documentclass[phdclassique,french,english]{hecthese}
+%<phd&articles&anglais>\documentclass[phdarticles,french,english]{hecthese}
+%<msc&classique&anglais>\documentclass[mscclassique,french,english]{hecthese}
+%<msc&articles&anglais>\documentclass[mscarticles,french,english]{hecthese}
%%
%<*francais>
-%% PACKAGES À CHARGER
+%% PACKAGES DEJA CHARGES
+%%
+%% Voici la liste des packages qui viennent deja charges avec la classe
+%% hecthese. VOUS NE DEVEZ PAS LES RECHARGER A NOUVEAU! Si vous le faites,
+%% vous occasionnerez des bogues.
+%%
+%% Package[utf8]{inputenc}
+%% Package[T1]{fontenc}
+%% Package{natbib}
+%% Package{chapterbib}
+%% Package{babel}
+%% Package[autolanguage]{numprint}
+%% Package{calc}
+%% Package{enumitem}
+%% Package{tocvsec2}
+%% Package{graphicx}
+%% Package{color}
+%% Package{amsmath}
+%% Package{iflang}
+%%
+%% PACKAGES A CHARGER
%%
-%% Ajoutez tous les packages nécessaires à la rédaction de votre travail.
-%% Consultez la documentation de la classe pour connaître la liste des
-%% packages qui sont chargés par défaut. Assurez-vous cependant de suivre
-%% les consignes suivantes :
+%% Ajoutez tous les packages necessaires a la redaction de votre travail.
+%% Assurez-vous cependant de suivre les consignes suivantes :
%%
-%% 1) Le package hyperref doit être chargé EN DERNIER si vous voulez qu'il
+%% 1) Le package hyperref doit etre charge EN DERNIER si vous voulez qu'il
%% fonctionne correctement.
%% 2) Le package geometry est INCOMPATIBLE avec la classe memoir. Vous ne
%% devez pas l'utiliser dans votre travail. Consultez la documentation
%% de la classe memoir pour de plus amples informations.
%%
-%% CHOIX D'UNE POLICE DE CARACTÈRES
+%% CHOIX D'UNE POLICE DE CARACTERES
%%
%% Choisissez le package mathptmx si vous voulez utiliser une police de type
%% Times, avec empattements, et le package mathpazo si vous voulez utiliser
@@ -2245,6 +2283,25 @@
%% l'autre, ou mettez-la en commentaires.
%</francais>
%<*anglais>
+%% PRE-LOADED PACKAGES
+%%
+%% Here is the list of all the packages that come preloaded with the hecthese
+%% class. YOU MUST NOT RELOAD THEM! In doing so, you will create bugs.
+%%
+%% Package[utf8]{inputenc}
+%% Package[T1]{fontenc}
+%% Package{natbib}
+%% Package{chapterbib}
+%% Package{babel}
+%% Package[autolanguage]{numprint}
+%% Package{calc}
+%% Package{enumitem}
+%% Package{tocvsec2}
+%% Package{graphicx}
+%% Package{color}
+%% Package{amsmath}
+%% Package{iflang}
+%%
%% LOADING PACKAGES
%%
%% Add all the packages you need to write your dissertation or thesis.
@@ -2275,9 +2332,9 @@
%<*articles>
%%
%<*francais>
-%% GÉNÉRATION DES TITRES
+%% GENERATION DES TITRES
%%
-%% On change les titres de l'introduction et de la conclusion générales.
+%% On change les titres de l'introduction et de la conclusion generales.
%</francais>
%<*anglais>
%% TITLE GENERATION
@@ -2292,10 +2349,10 @@
%<*francais>
%% STYLE BIBLIOGRAPHIQUE
%%
-%% On utilise par défaut le style bibliographique francais issu du package
+%% On utilise par defaut le style bibliographique francais issu du package
%% francais-bst. L'utilisation de ce style n'est pas obligatoire. Consultez
-%% la documentation pour connaître la liste des styles compatibles avec la
-%% langue de rédaction de votre thèse ou mémoire.
+%% la documentation pour connaitre la liste des styles compatibles avec la
+%% langue de redaction de votre these ou memoire.
%%
\bibliographystyle{francais}
%</francais>
@@ -2311,12 +2368,12 @@
%</classique>
%%
%<*francais>
-%% MISE EN FORME DE LA TABLE DES MATIÈRES
+%% MISE EN FORME DE LA TABLE DES MATIERES
%%
-%% On inclut dans la table des matières toutes les divisions de document
-%% jusqu'aux sous-sections. Si vous désirez avoir une table des matières
-%% plus détaillée, indiquez dans les deux commandes ci-dessous jusqu'à
-%% quel niveau vous voulez voir répertoriés dans la TDM.
+%% On inclut dans la table des matieres toutes les divisions de document
+%% jusqu'aux sous-sections. Si vous desirez avoir une table des matieres
+%% plus detaillee, indiquez dans les deux commandes ci-dessous jusqu'a
+%% quel niveau vous voulez voir repertories dans la TDM.
%</francais>
%<*anglais>
%% All document divisions up to the subsections are included in the table
@@ -2325,25 +2382,25 @@
%% in your TOC.
%</anglais>
%%
-\setsecnumdepth{subsection} % Numérotation des sous-sections / Subsection numbering
+\setsecnumdepth{subsection} % Numerotation des sous-sections / Subsection numbering
\settocdepth{subsection} % Inclusion des sous-sections dans la TDM / Including subsections in the TOC
%%
%<*francais>
-%% MÉTADONNÉES DU DOCUMENT
+%% METADONNEES DU DOCUMENT
%%
%% Le titre de votre travail. Si le titre est long, utilisez la commande \\
%% pour le mettre sur plusieurs lignes.
-\HECtitre{Titre de la thèse ou du mémoire}
+\HECtitre{Titre de la th\`{e}se ou du m\'{e}moire}
%% Le sous-titre de votre travail. S'il ne comporte pas de sous-titre, videz
%% le contenu des accolades.
-\HECsoustitre{Sous-titre de la thèse}
+\HECsoustitre{Sous-titre de la th\`{e}se}
%% L'auteur, c'est vous...
-\HECauteur{Prénom Nom}
+\HECauteur{Pr\'{e}nom Nom}
%% Nom de l'option de votre grade
\HECoption{Nom de l'option}
-%% Mois du dépôt final de votre travail
+%% Mois du depot final de votre travail
\HECmoisDepot{Mai}
-%% Année du dépôt final de votre travail
+%% Annee du depot final de votre travail
\HECanneeDepot{2017}
%</francais>
%<*anglais>
@@ -2366,24 +2423,24 @@
%</anglais>
%<*phd>
%<*francais>
-%% Le nom complet du président rapporteur et son genre (M ou F)
-\HECpresidentRapporteur{Prénom Nom}{M ou F}
+%% Le nom complet du president rapporteur et son genre (M ou F)
+\HECpresidentRapporteur{Pr\'{e}nom Nom}{M ou F}
%% Le nom complet de votre directeur de recherche et son genre (M ou F)
-\HECdirecteurRecherche{Prénom Nom}{M ou F}
+\HECdirecteurRecherche{Pr\'{e}nom Nom}{M ou F}
%% Le nom complet de votre codirecteur de recherche et son genre (M ou F)
-\HECcodirecteurRecherche{Prénom Nom}{M ou F}
-%% L'université de provenance de votre codirecteur de recherche
-\HECuniversiteCodirecteur{HEC Montréal}
+\HECcodirecteurRecherche{Pr\'{e}nom Nom}{M ou F}
+%% L'universite de provenance de votre codirecteur de recherche
+\HECuniversiteCodirecteur{HEC Montr\'{e}al}
%% Le nom complet du membre du jury
-\HECmembreJury{Prénom Nom}
-%% L'université de provenance du membre du jury
-\HECuniversiteMembreJury{HEC Montréal}
+\HECmembreJury{Pr\'{e}nom Nom}
+%% L'universite de provenance du membre du jury
+\HECuniversiteMembreJury{HEC Montr\'{e}al}
%% Le nom complet de l'examinateur externe et son genre (M ou F)
-\HECexaminateurExterne{Prénom Nom}{M ou F}
-%% L'université de provenance de l'examinateur externe
-\HECuniversiteExaminateur{HEC Montréal}
-%% Le nom complet du représentant du directeur et son genre (M ou F)
-\HECrepresentantDirecteur{Prénom Nom}{M ou F}
+\HECexaminateurExterne{Pr\'{e}nom Nom}{M ou F}
+%% L'universite de provenance de l'examinateur externe
+\HECuniversiteExaminateur{HEC Montr\'{e}al}
+%% Le nom complet du representant du directeur et son genre (M ou F)
+\HECrepresentantDirecteur{Pr\'{e}nom Nom}{M ou F}
%</francais>
%<*anglais>
%% The complete name of the "rapporteur president" and her gender (M or F)
@@ -2393,27 +2450,37 @@
%% The complete name of the research codirector and her gender (M or F)
\HECresearchCodirector{FirstName LastName}{M or F}
%% The research codirector's university
-\HECcodirectorUniversity{HEC Montréal}
+\HECcodirectorUniversity{HEC Montr\'{e}al}
%% The complete name of the jury member
\HECjuryMember{FirstName LastName}
%% The jury member's university
-\HECjuryMemberUniversity{HEC Montréal}
+\HECjuryMemberUniversity{HEC Montr\'{e}al}
%% The complete name of the external examinator and her gender (M or F)
\HECexternalExaminator{FirstName LastName}{M or F}
%% The external examinator's university
-\HECexaminatorUniversity{HEC Montréal}
+\HECexaminatorUniversity{HEC Montr\'{e}al}
%% The complete name of the director's representative and her gender (M or F)
\HECdirectorRepresentative{FirstName LastName}{M or F}
%</anglais>
%</phd>
+%<*msc>
+%<*francais>
+%% Le nom complet de votre directeur de recherche et son genre (M ou F)
+\HECdirecteurRecherche{Pr\'{e}nom Nom}{M ou F}
+%</francais>
+%<*anglais>
+%% The complete name of the research director and her gender (M or F)
+\HECresearchDirector{FirstName LastName}{M or F}
+%</anglais>
+%</msc>
%%
%<*francais>
-%% OPTIONS DES PACKAGES CHARGÉS
+%% OPTIONS DES PACKAGES CHARGES
%%
-%% Si vos packages ont des options spécifiques à charger avant le début
+%% Si vos packages ont des options specifiques a charger avant le debut
%% du document, inscrivez-les ci-dessous. Si vous voulez outrepasser les
-%% options des packages chargés par défaut avec la classe hecthese,
-%% consultez la documentation pour en connaître la procédure.
+%% options des packages charges par defaut avec la classe hecthese,
+%% consultez la documentation pour en connaitre la procedure.
%</francais>
%<*anglais>
%% PACKAGE OPTIONS
@@ -2423,7 +2490,7 @@
%% packages' options, read the class documentation to learn how.
%</anglais>
%%
-%% Options du package hyperref (inclure les métadonnées pdf dans les options) /
+%% Options du package hyperref (inclure les metadonnees pdf dans les options) /
%% hyperref package option (including pdf metadata)
\hypersetup{%
colorlinks=true,
@@ -2433,10 +2500,10 @@
}
%% Options de babel / babel options
\frenchbsetup{%
- og=«, fg=» % caractères « et » sont les guillemets
+ og=«, fg=» % caracteres « et » sont les guillemets
}
%%
-%<francais>%% DÉBUT DE LA THÈSE OU DU MÉMOIRE
+%<francais>%% DEBUT DE LA THESE OU DU MEMOIRE
%<anglais>%% BEGINNING OF THE DISSERTATION OR THESIS
%%
\begin{document}
@@ -2459,15 +2526,15 @@
\HECbibliographieArticle
%</articles>
- %% Résumé français / french abstract
+ %% Resume francais / french abstract
%<francais> \include{resume-francais}
%<anglais> \include{abstract-french}
- %% Résumé anglais / english abstract
+ %% Resume anglais / english abstract
%<francais> \include{resume-anglais}
%<anglais> \include{abstract-english}
- %% Table des matières (* pour ne pas inclure la TDM dans la TDM) /
+ %% Table des matieres (* pour ne pas inclure la TDM dans la TDM) /
%% Table of contents (* for excluding the TOC from the TOC)
\tableofcontents*
\cleardoublepage
@@ -2480,12 +2547,12 @@
\listoffigures
\cleardoublepage
- %% Liste des abréviations / acronyms list
+ %% Liste des abreviations / acronyms list
%<francais> \include{liste-abreviations}
%<anglais> \include{acronym-list}
%<*phd>
- %% Dédicace / dedication
+ %% Dedicace / dedication
%<francais> \include{dedicace}
%<anglais> \include{dedication}
@@ -2507,25 +2574,25 @@
%<anglais> \include{acknowledgements}
%</msc>
- %% Partie principale de la thèse ou du mémoire / mainmatter
+ %% Partie principale de la these ou du memoire / mainmatter
\mainmatter
%% Introduction
\include{introduction}
%<*phd&articles>
- %% Cadre théorique / theoretical framework
+ %% Cadre theorique / theoretical framework
%<francais> \include{cadre-theorique}
%<anglais> \include{theoretical-framework}
%</phd&articles>
%<*msc>
- %% Revue de la littérature / literature review
+ %% Revue de la litterature / literature review
%<francais> \include{revue-litterature}
%<anglais> \include{literature-review}
%</msc>
%<*classique>
- %% Chapitres de développement / chapters
+ %% Chapitres de developpement / chapters
%<*francais>
\include{chapitre-1}
\include{chapitre-2}
@@ -2538,7 +2605,7 @@
%</anglais>
%</classique>
%<*articles>
- %% Articles de développement / articles
+ %% Articles de developpement / articles
\include{article-1}
%</articles>
%<*phd&articles>
@@ -2554,7 +2621,7 @@
%% BIBLIOGRAPHIE / BIBLIOGRAPHY
%<*articles>
- %<francais> %% Configuration de la bibliographie générale
+ %<francais> %% Configuration de la bibliographie generale
%<anglais> %% General bibliography configuration
\HECbibliographieGenerale
%<francais>\bibliographystyle{francais}
@@ -2566,7 +2633,7 @@
\backmatter
- %% Retour à la pagination romaine / Back to roman page numbering
+ %% Retour a la pagination romaine / Back to roman page numbering
\pagenumbering{roman}
%% Annexes / appendices
@@ -2581,31 +2648,31 @@
\end{document}
%</gabarit>
%
-% ^^A Résumés français et anglais
+% ^^A Resumes francais et anglais
%<*resumefrancais>
-%<francais>%% Fichier contenant le résumé français, les mots-clés et les méthodes de recherche.
+%<francais>%% Fichier contenant le resume francais, les mots-cles et les methodes de recherche.
%<anglais>%% File containing the french abstract, keywords and research methods.
-\chapter*{Résumé}
-\phantomsection\addcontentsline{toc}{chapter}{Résumé}
-\thispagestyle{empty} % Première page non paginée / Unnumbered first page
+\chapter*{R\'{e}sum\'{e}}
+\phantomsection\addcontentsline{toc}{chapter}{R\'{e}sum\'{e}}
+\thispagestyle{empty} % Premiere page non paginee / Unnumbered first page
-%<francais>%% Rédigez votre résumé français ici (350 à 500 mots).
+%<francais>%% Redigez votre resume francais ici (350 a 500 mots).
%<anglais>%% Write your french abstract here (350 to 500 words).
-\section*{Mots-clés}
+\section*{Mots-cl\'{e}s}
-%<francais>%% Inscrivez vos mots-clés ici (15 maximum, incluant les méthodes de recherche ci-dessous).
+%<francais>%% Inscrivez vos mots-cles ici (15 maximum, incluant les methodes de recherche ci-dessous).
%<anglais>%% Write your french keywords here (15 max, including the research methods).
-\section*{Méthodes de recherche}
+\section*{M\'{e}thodes de recherche}
%<*francais>
-%% Inscrivez vos méthodes de recherche ici.
+%% Inscrivez vos methodes de recherche ici.
-%% THÈSES ET MÉMOIRES PAR ARTICLES SEULEMENT
-%% Si vous avez inséré des citations dans cette section, retirez les signes
+%% THESES ET MEMOIRES PAR ARTICLES SEULEMENT
+%% Si vous avez insere des citations dans cette section, retirez les signes
%% de commentaires (%%) devant la commande ci-dessous et inscrivez le style
-%% bibliographique et le nom du fichier .bib utilisés pour vos références.
+%% bibliographique et le nom du fichier .bib utilises pour vos references.
%</francais>
%<*anglais>
%% Write your research methods here.
@@ -2618,28 +2685,28 @@
%% \HECreferences{style}{nom-du-fichier-file-name}
%</resumefrancais>
%<*resumeanglais>
-%<francais>%% Fichier contenant le résumé anglais, les mots-clés et les méthodes de recherche.
+%<francais>%% Fichier contenant le resume anglais, les mots-cles et les methodes de recherche.
%<anglais>%% File containing the English abstract, keywords and research methods.
\chapter*{Abstract}
\phantomsection\addcontentsline{toc}{chapter}{Abstract}
-%<francais>%% Rédigez votre résumé anglais ici (350 à 500 mots).
+%<francais>%% Redigez votre resume anglais ici (350 a 500 mots).
%<anglais>%% Write your english abstract hereafter (350 to 500 words).
\section*{Keywords}
-%<francais>%% Inscrivez vos mots-clés en anglais ici (15 maximum, incluant les méthodes de recherche ci-dessous).
+%<francais>%% Inscrivez vos mots-cles en anglais ici (15 maximum, incluant les methodes de recherche ci-dessous).
%<anglais>%% Write your english keywords here (15 max, including the research methods)
\section*{Research methods}
%<*francais>
-%% Inscrivez vos méthodes de recherche en anglais ici.
+%% Inscrivez vos methodes de recherche en anglais ici.
-%% THÈSES ET MÉMOIRES PAR ARTICLES SEULEMENT
-%% Si vous avez inséré des citations dans cette section, retirez les signes
+%% THESES ET MEMOIRES PAR ARTICLES SEULEMENT
+%% Si vous avez insere des citations dans cette section, retirez les signes
%% de commentaires (%%) devant la commande ci-dessous et inscrivez le style
-%% bibliographique et le nom du fichier .bib utilisés pour vos références.
+%% bibliographique et le nom du fichier .bib utilises pour vos references.
%</francais>
%<*anglais>
%% Write your research methods here.
@@ -2652,12 +2719,12 @@
%% \HECreferences{style}{nom-du-fichier-file-name}
%</resumeanglais>
%
-% ^^A Liste des abréviations
+% ^^A Liste des abreviations
%<*listeabreviations>
%<*francais>
-%% Fichier contenant la liste des abréviations. Vous retrouverez ci-dessous un exemple
+%% Fichier contenant la liste des abreviations. Vous retrouverez ci-dessous un exemple
%% de liste. L'environnement HECabreviations prend en argument la plus longue des
-%% abréviations. À la compilation, une liste en deux colonnes alignées est générée.
+%% abreviations. A la compilation, une liste en deux colonnes alignees est generee.
%</francais>
%<*anglais>
%% File containing the acronyms list. You'll find below and example list. The
@@ -2669,28 +2736,28 @@
%<francais>\begin{HECabreviations}{ABBR}
%<anglais>\begin{HECabbreviations}{ABBR}
- \item[ABBR] Abréviation
- \item[BAA] Baccalauréat en administration des affaires
- \item[DESS] Diplôme d'études supérieures spécialisées
- \item[HEC] Hautes études commerciales
- \item[MBA] Maîtrise en administration des affaires
- \item[MSc] Maîtrise
+ \item[ABBR] Abr\'{e}viation
+ \item[BAA] Baccalaur\'{e}at en administration des affaires
+ \item[DESS] Dipl\^{o}me d'\'{e}tudes sup\'{e}rieures sp\'{e}cialis\'{e}es
+ \item[HEC] Hautes \'{e}tudes commerciales
+ \item[MBA] Ma\^{i}trise en administration des affaires
+ \item[MSc] Ma\^{i}trise
\item[PhD] Doctorat
%<francais>\end{HECabreviations}
%<anglais>\end{HECabbreviations}
%</listeabreviations>
%
-% ^^A Dédicace
+% ^^A Dedicace
%<*dedicace>
%<*francais>
-%% Fichier contenant la dédicace
+%% Fichier contenant la dedicace
%% N'inscrivez rien entre les accolades de la commande \chapter*{},
-%% sauf si vous voulez voir la dédicace dans la table des matières.
+%% sauf si vous voulez voir la dedicace dans la table des matieres.
\chapter*{}
\begin{HECdedicace}
- %% Rédigez votre dédicace ici.
+ %% Redigez votre dedicace ici.
\end{HECdedicace}
%</francais>
%<*anglais>
@@ -2714,7 +2781,7 @@
\chapter*{\HECtdmRemerciements}
\phantomsection\addcontentsline{toc}{chapter}{\HECtdmRemerciements}
-%<francais>%% Rédigez vos remerciements ici.
+%<francais>%% Redigez vos remerciements ici.
%<anglais>%% Write your acknowledgements here.
%</remerciements>
%
@@ -2726,12 +2793,12 @@
\phantomsection\addcontentsline{toc}{chapter}{\HECtdmAvantPropos}
%<*francais>
-%% Rédigez votre avant-propos ici.
+%% Redigez votre avant-propos ici.
-%% THÈSES ET MÉMOIRES PAR ARTICLES SEULEMENT
-%% Si vous avez inséré des citations dans cette section, retirez les signes
+%% THESES ET MEMOIRES PAR ARTICLES SEULEMENT
+%% Si vous avez insere des citations dans cette section, retirez les signes
%% de commentaires (%%) devant la commande ci-dessous et inscrivez le style
-%% bibliographique et le nom du fichier .bib utilisés pour vos références.
+%% bibliographique et le nom du fichier .bib utilises pour vos references.
%</francais>
%<*anglais>
%% Write your preface here.
@@ -2750,15 +2817,15 @@
%<anglais>%% File containing the introduction
\chapter*{\HECtitreIntroduction}
\phantomsection\addcontentsline{toc}{chapter}{\HECtitreIntroduction}
-\thispagestyle{empty} % Première page non paginée / First page is unnumbered
+\thispagestyle{empty} % Premiere page non paginee / First page is unnumbered
%<*francais>
-%% Rédigez votre introduction ici.
+%% Redigez votre introduction ici.
-%% THÈSES ET MÉMOIRES PAR ARTICLES SEULEMENT
-%% Si vous avez inséré des citations dans cette section, retirez les signes
+%% THESES ET MEMOIRES PAR ARTICLES SEULEMENT
+%% Si vous avez insere des citations dans cette section, retirez les signes
%% de commentaires (%%) devant la commande ci-dessous et inscrivez le style
-%% bibliographique et le nom du fichier .bib utilisés pour vos références.
+%% bibliographique et le nom du fichier .bib utilises pour vos references.
%</francais>
%<*anglais>
%% Write your introduction here.
@@ -2771,21 +2838,21 @@
%% \HECreferences{style}{nom-du-fichier}
%</introduction>
%
-% ^^A Cadre théorique
+% ^^A Cadre theorique
%<*cadretheorique>
-%<francais>%% Fichier contenant le cadre théorique
+%<francais>%% Fichier contenant le cadre theorique
%<anglais>%% File containing the theoretical framework
\chapter*{\HECtdmCadreTheorique}
\phantomsection\addcontentsline{toc}{chapter}{\HECtdmCadreTheorique}
\thispagestyle{empty}
%<*francais>
-%% Rédigez votre cadre théorique ici.
+%% Redigez votre cadre theorique ici.
-%% THÈSES ET MÉMOIRES PAR ARTICLES SEULEMENT
-%% Si vous avez inséré des citations dans cette section, retirez les signes
+%% THESES ET MEMOIRES PAR ARTICLES SEULEMENT
+%% Si vous avez insere des citations dans cette section, retirez les signes
%% de commentaires (%%) devant la commande ci-dessous et inscrivez le style
-%% bibliographique et le nom du fichier .bib utilisés pour vos références.
+%% bibliographique et le nom du fichier .bib utilises pour vos references.
%</francais>
%<*anglais>
%% Write your theoretical framework here.
@@ -2798,21 +2865,21 @@
%% \HECreferences{style}{nom-du-fichier-file-name}
%</cadretheorique>
%
-% ^^A Revue de littérature
+% ^^A Revue de litterature
%<*revuelitterature>
-%<francais>%% Fichier contenant la revue de la littérature
+%<francais>%% Fichier contenant la revue de la litterature
%<anglais>%% File containing the literature review
\chapter*{\HECtdmRevueLitterature}
\phantomsection\addcontentsline{toc}{chapter}{\HECtdmRevueLitterature}
-\thispagestyle{empty} % Première page non paginée / First page unnumbered
+\thispagestyle{empty} % Premiere page non paginee / First page unnumbered
%<*francais>
-%% Rédigez votre revue de littérature ici.
+%% Redigez votre revue de litterature ici.
-%% THÈSES ET MÉMOIRES PAR ARTICLES SEULEMENT
-%% Si vous avez inséré des citations dans cette section, retirez les signes
+%% THESES ET MEMOIRES PAR ARTICLES SEULEMENT
+%% Si vous avez insere des citations dans cette section, retirez les signes
%% de commentaires (%%) devant la commande ci-dessous et inscrivez le style
-%% bibliographique et le nom du fichier .bib utilisés pour vos références.
+%% bibliographique et le nom du fichier .bib utilises pour vos references.
%</francais>
%<*anglais>
%% Write your literature review here.
@@ -2825,11 +2892,11 @@
%% \HECreferences{style}{nom-du-fichier}
%</revuelitterature>
%
-% ^^A Chapitres de développement
+% ^^A Chapitres de developpement
%<*chapitre>
%<*francais>
-%% Fichier contenant un chapitre du développement. La classe génère
-%% trois fichiers de chapitres par défaut. Si vous en avez besoin
+%% Fichier contenant un chapitre du developpement. La classe genere
+%% trois fichiers de chapitres par defaut. Si vous en avez besoin
%% davantage, enregistrez ce fichier sous un autre nom et incluez
%% le nouveau fichier dans votre gabarit avec la commande \include.
%</francais>
@@ -2840,23 +2907,23 @@
%% with the \include command.
%</anglais>
\chapter{Titre du chapitre / Chapter title}
-\thispagestyle{empty} % Première page non paginée / First page is unnumbered
+\thispagestyle{empty} % Premiere page non paginee / First page is unnumbered
-%<francais>%% Écrivez votre chapitre ici.
+%<francais>%% Ecrivez votre chapitre ici.
%<anglais>%% Write your chapter here.
%</chapitre>
%<*articledeveloppement>
%<*francais>
-%% Fichier contenant un article. La classe génère trois fichiers
-%% d'articles par défaut. Une thèse compte généralement trois articles
-%% et un mémoire, un. Si vous en avez besoin davantage,
+%% Fichier contenant un article. La classe genere trois fichiers
+%% d'articles par defaut. Une these compte generalement trois articles
+%% et un memoire, un. Si vous en avez besoin davantage,
%% enregistrez ce fichier sous un autre nom et incluez-le dans
%% votre gabarit avec la commande \include.
%%
-%% Les articles sont structurés tel que vous le voyez ci-dessous :
-%% un résumé non numéroté, une introduction, des sections et une
-%% conclusion numérotées, et une bibliographie. Vous pouvez ajouter
-%% ou supprimer des sections de développement selon vos besoins.
+%% Les articles sont structures tel que vous le voyez ci-dessous :
+%% un resume non numerote, une introduction, des sections et une
+%% conclusion numerotees, et une bibliographie. Vous pouvez ajouter
+%% ou supprimer des sections de developpement selon vos besoins.
%</francais>
%<*anglais>
%% File containing an article. The class generates three articles
@@ -2870,37 +2937,37 @@
%% You can add or delete sections according to your needs.
%</anglais>
\chapter{Titre de l'article / Article title}
-\thispagestyle{empty} % Première page non paginée / First page is unnumbered
+\thispagestyle{empty} % Premiere page non paginee / First page is unnumbered
\section*{\HECtdmResumeArticle}
\phantomsection\addcontentsline{toc}{section}{\HECtdmResumeArticle}
-%<francais>%% Rédigez votre résumé ici.
+%<francais>%% Redigez votre resume ici.
%<anglais>%% Write your article abstract here.
\section{Introduction}
-%<francais>%% Rédigez votre introduction d'article ici.
+%<francais>%% Redigez votre introduction d'article ici.
%<anglais>%% Write your article introduction here.
-\section{Titre de la section de développement 1 / Section 1 title}
+\section{Titre de la section de d\'{e}veloppement 1 / Section 1 title}
-%<francais>%% Rédigez votre section de développement ici.
+%<francais>%% Redigez votre section de developpement ici.
%<anglais>%% Write your section 1 here.
-\section{Titre de la section de développement 2 / Section 2 title}
+\section{Titre de la section de d\'{e}veloppement 2 / Section 2 title}
-%<francais>%% Rédigez votre section de développement ici.
+%<francais>%% Redigez votre section de developpement ici.
%<anglais>%% Write your section 2 here.
-\section{Titre de la section de développement 3 / Section 3 title}
+\section{Titre de la section de d\'{e}veloppement 3 / Section 3 title}
-%<francais>%% Rédigez votre section de développement ici.
+%<francais>%% Redigez votre section de developpement ici.
%<anglais>%% Write your section 3 here.
\section{Conclusion}
-%<francais>%% Rédigez votre conclusion d'article ici.
+%<francais>%% Redigez votre conclusion d'article ici.
%<anglais>%% Write your article conclusion here.
%<*francais>
@@ -2920,15 +2987,15 @@
%<anglais>%% File containing the conclusion
\chapter*{\HECtitreConclusion}
\phantomsection\addcontentsline{toc}{chapter}{\HECtitreConclusion}
-\thispagestyle{empty} % Première page non paginée / First page is unnumbered
+\thispagestyle{empty} % Premiere page non paginee / First page is unnumbered
%<*francais>
-%% Rédigez votre conclusion ici.
+%% Redigez votre conclusion ici.
-%% THÈSES ET MÉMOIRES PAR ARTICLES SEULEMENT
-%% Si vous avez inséré des citations dans cette section, retirez les signes
+%% THESES ET MEMOIRES PAR ARTICLES SEULEMENT
+%% Si vous avez insere des citations dans cette section, retirez les signes
%% de commentaires (%%) devant la commande ci-dessous et inscrivez le style
-%% bibliographique et le nom du fichier .bib utilisés pour vos références.
+%% bibliographique et le nom du fichier .bib utilises pour vos references.
%</francais>
%<*anglais>
%% Write your conclusion here.
@@ -2942,25 +3009,25 @@
%</conclusion>
%<*annexe>
%<*francais>
-%% Fichier contenant une annexe. La classe ne génère qu'un seul
-%% fichier annexe.tex par défaut. Si vous en avez besoin davantage,
+%% Fichier contenant une annexe. La classe ne genere qu'un seul
+%% fichier annexe.tex par defaut. Si vous en avez besoin davantage,
%% enregistrez ce fichier sous un autre nom et incluez-le dans votre
%% gabarit avec la commande \include.
%%
-%% Pour que la bibliographie et la (les) annexe(s) soient paginées
-%% correctement, c'est-à-dire en chiffres arabes pour la bibliographie
-%% et en chiffres romains pour les annexes, ces dernières doivent être
-%% placées après la commande \backmatter. Ce faisant, la numérotation
-%% des annexes s'en trouve désactivée. Vous devrez donc numéroter
-%% vos annexes manuellement à l'intérieur de la commande \chapter.
+%% Pour que la bibliographie et la (les) annexe(s) soient paginees
+%% correctement, c'est-a-dire en chiffres arabes pour la bibliographie
+%% et en chiffres romains pour les annexes, ces dernieres doivent etre
+%% placees apres la commande \backmatter. Ce faisant, la numerotation
+%% des annexes s'en trouve desactivee. Vous devrez donc numeroter
+%% vos annexes manuellement a l'interieur de la commande \chapter.
\chapter{Annexe A -- Titre de l'annexe}
-%% Rédigez votre annexe ici.
+%% Redigez votre annexe ici.
-%% THÈSES ET MÉMOIRES PAR ARTICLES SEULEMENT
-%% Si vous avez inséré des citations dans cette section, retirez les signes
+%% THESES ET MEMOIRES PAR ARTICLES SEULEMENT
+%% Si vous avez insere des citations dans cette section, retirez les signes
%% de commentaires (%%) devant la commande ci-dessous et inscrivez le style
-%% bibliographique et le nom du fichier .bib utilisés pour vos références.
+%% bibliographique et le nom du fichier .bib utilises pour vos references.
%</francais>
%<*anglais>
%% File containing an appendix. The class only generates one appendix by default.
diff --git a/Master/texmf-dist/source/latex/hep-paper/hep-paper-implementation.dtx b/Master/texmf-dist/source/latex/hep-paper/hep-paper-implementation.dtx
new file mode 100644
index 00000000000..ea537d218e1
--- /dev/null
+++ b/Master/texmf-dist/source/latex/hep-paper/hep-paper-implementation.dtx
@@ -0,0 +1,2911 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2019-2020 by Jan Hajer
+% -----------------------------------
+%
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% 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.
+%
+% \fi
+%
+% \iffalse
+
+%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+%<package>\ProvidesPackage{hep-paper}[2020/12/01 v1.6 Publications in High Energy Physics]
+%<datamodel>\ProvidesFile{hep-paper.dbx}[2020/12/01 v1.6 HEP-Paper biblatex data model]
+%<documentation>\ProvidesFile{hep-paper-documentation.tex}[2020/12/01 v1.6 HEP-Paper documentation]
+%
+%<*documentation>
+
+\RequirePackage[l2tabu, orthodox]{nag}
+\documentclass{ltxdoc}
+
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+
+\MacroIndent=1.5em
+
+\usepackage[parskip]{hep-paper}
+
+\bibliography{bibliography}
+
+\acronym{PDF}{portable document format}
+\acronym{URL}{uniform resource locator}
+\acronym{CM}{computer modern}
+\acronym{LM}{latin modern}
+
+\usepackage{hologo}
+\usepackage{fonttable}
+
+\newenvironment{columns}[1][.5]{%
+ \par\vspace{-\bigskipamount}%
+ \begin{minipage}[t]{\linewidth}%
+ \begin{minipage}[t]{#1\linewidth}%
+ \newcommand{\column}{%
+ \end{minipage}%
+ \begin{minipage}[t]{\linewidth-#1\linewidth}%
+ }%
+}{\end{minipage}\end{minipage}\par}
+
+\setlength{\fboxsep}{1pt}
+\AtBeginEnvironment{macrocode}{\renewcommand{\ttdefault}{clmt}}
+%</documentation>
+
+%<*driver>
+\expandafter\newif\csname ifshort\endcsname
+\shortfalse
+\begin{document}
+\DocInput{hep-paper-implementation.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+% \CheckSum{1673}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+% \changes{v1.0}{2019/01/01}{Initial version of the style file.}
+% \changes{v1.1}{2020/01/01}{Transition to documented \hologo{LaTeX} source file.}
+% \changes{v1.2}{2020/03/01}{Introduction of package options.}
+% \changes{v1.3}{2020/05/01}{Inclusion of JHEP and JCAP package options. Fix of incompatibility with recent subcaption package version. Move of biblatex datamodel into its own file}
+% \changes{v1.4}{2020/09/01}{If possible the compatibility options are selected automatically. Inclusion of PubMed IDs in bibliography.}
+% \changes{v1.5}{2020/10/01}{Reduce the numer of math alphabets used in sans serif mode. Add more title options such as a subtitle. Use standard class options.}
+% \changes{v1.6}{2020/12/01}{Implementation of the twocolumn mode.}
+%
+% \ifshort
+%<*documentation>
+% \fi
+%
+\GetFileInfo{hep-paper.sty}
+
+\title{The \textsmaller[1.5]{HEP\raisebox{.25ex}{--}PAPER} package\thanks{This document corresponds to \software{hep-paper}~\fileversion.}}
+\subtitle{Publications in high energy physics}
+\author{Jan Hajer \email{jan.hajer@uclouvain.be}}
+\affiliation{Centre for Cosmology, Particle Physics and Phenomenology, Université catholique de Louvain, Louvain-la-Neuve B-1348, Belgium}
+\preprint{Preprint-Number}
+\date{\filedate}
+
+% \ifshort
+\begin{document}
+% \fi
+
+\maketitle
+
+\begin{abstract}
+The \software{hep-paper} package aims to provide a single style file containing most configurations and macros necessary to write appealing publications in High Energy Physics.
+Instead of reinventing the wheel by introducing newly created macros \software{hep-paper} preferably loads third party packages as long as they are lightweight enough.
+\end{abstract}
+
+\tableofcontents\clearpage
+
+\newgeometry{vscale=.8, vmarginratio=3:4, includeheadfoot, left=11em, marginparwidth=4.6cm, marginparsep=3mm, right=7em}
+
+\section{Introduction}
+
+For usual publications it is enough to load additionally to the |article| class without optional arguments only the \software{hep-paper} package \cite{hep-paper}.
+\begin{verbatim}
+\documentclass{article}
+\usepackage{hep-paper}
+\end{verbatim}
+The most notable changes after loading the \software{hep-paper} package is the change of some \hologo{LaTeX} defaults.
+The paper and font sizes are set to A4 and \unit[11]{pt}, respectively.
+Additionally, the paper geometry is adjusted using the \software{geometry} package \cite{geometry}.
+Furthermore, the font is changed to \LM using the \software{cfr-lm} package \cite{cfr-lm} with \software{microtype} \cite{microtype} optimizations.
+Finally, \PDF hyperlinks are implemented with the \software{hyperref} package \cite{hyperref}.
+
+\subsection{Options}
+
+\DescribeMacro{paper}
+The |paper=|\meta{format} option loads the specified paper format.
+The possible \meta{formats} are:
+|a0|, |a1|, |a2|, |a3|, |a4|, |a5|, |a6|,
+|b0|, |b1|, |b2|, |b3|, |b4|, |b5|, |b6|,
+|c0|, |c1|, |c2|, |c3|, |c4|, |c5|, |c6|,
+|ansia|, |ansib|, |ansic|, |ansid|, |ansie|,
+|letter|, |executive|, |legal|.
+The default is |a4|.
+
+\DescribeMacro{font}
+The |font=|\meta{size} option loads the specified font size.
+The possible \meta{sizes} are:
+|8pt|, |9pt|, |10pt|, |11pt|, |12pt|, |14pt|, |17pt|, |20pt|.
+The default is \unit[11]{pt}.
+
+\DescribeMacro{lang}
+The |lang|=\meta{name} option switches the document language to one of the values values provided by the \software{babel} package \cite{babel}.
+The default is |british|.
+
+\DescribeMacro{sansserif}
+The |sansserif| option switches the document including math to sans serif font shape.
+
+\DescribeMacro{parskip}
+The |parskip| option changes how paragraphs are separated from each other using the \software{parskip} package \cite{parskip}.
+The \hologo{LaTeX} default is separation via indentation the |parskip| option switches to separation via vertical space.
+\footnote{Although the |parskip| option is used for this document, it is recommended only for very few document types such as technical manuals or answers to referees.}
+
+\DescribeMacro{symbols}
+The |symbols|=\meta{family} set the family of the symbol fonts.
+|symbols=ams| loads the two \hologo{AmS} fonts \cite{amsfonts} and the \software{bm} bold fonts.
+The default |symbols=true| replaces additionally the blackboard font with the \software{dsfont} \cite{dsfont}.
+|symbols=minion| switches the symbol fonts to the Adobe MinionPro companion font from the \software{MnSymbol} package \cite{MnSymbol}.
+|symbols=false| deactivates loading any additional symbol fonts.
+
+\subsubsection{Deactivation}
+
+The \software{hep-paper} package loads few bigger packages which have a large impact on the document.
+The deactivation options can prevent such and other adjustments.
+
+\DescribeMacro{defaults}
+The |defaults| option prevents the adjustment of the page geometry and the font size set by the document class.
+
+\DescribeMacro{lining}
+The |lining| option deactivates the use of text- (\texto{123}) in favour of lining- (\textl{123}) figures in text mode.
+
+\DescribeMacro{title}
+The |title=false| option deactivates the title page adjustments.
+
+\DescribeMacro{bibliography}
+The |bibliography|=\meta{key} option prevents the automatic loading of the \software{biblatex} package \cite{biblatex} if \meta{key}=|false|.
+Otherwise the \meta{key} is passed as |style| string to the \software{biblatex} package.
+
+\DescribeMacro{glossaries}
+The |glossaries=false| option deactives acronyms and the use of the \software{glossaries} package \cite{glossaries}.
+
+\DescribeMacro{references}
+The |references=false| option prevents the \software{cleveref} package \cite{cleveref} from being loaded and deactivates further redefinitions of reference macros.
+
+\subsubsection{Compatibility}
+
+The compatibility options activate the compatibility mode for certain classes and packages used for publications in high energy physics.
+They are mostly suitable combinations of options described in the previous section.
+If \software{hep-paper} is able to detect the presence of such a class or package, \ie if it is loaded before the \software{hep-paper} package, the compatibility mode is activated automatically.
+
+\DescribeMacro{beamer}
+The |beamer| option activates the \software{beamer} \cite{beamer} compatibility mode.
+
+\DescribeMacro{jhep}
+The |jhep| option activates the \software{JHEP} \cite{jhep} compatibility mode.
+
+\DescribeMacro{jcap}
+The |jcap| option activates the \software{JCAP} \cite{jcap} compatibility mode.
+
+\DescribeMacro{revtex}
+The |revtex| option activates the REV\hologo{TeX} \cite{revtex} compatibility mode.
+
+\DescribeMacro{pos}
+The |pos| option activates the \software{PoS} compatibility mode.
+
+\DescribeMacro{springer}
+The |springer| option activates the compatibility mode the |svjour| class \cite{svjour}.
+
+\subsubsection{Reactivation}
+
+The \software{hep-paper} package deactivates unrecommended macros, which can be reactivated manually.
+
+\DescribeMacro{manualplacement}
+The |manualplacement| option reactivates manual float placement.
+
+\DescribeMacro{eqnarray}
+The |eqnarray| option reactivates the depreciated |eqnarray| environment.
+
+\section{Macros and environments}
+
+\DescribeMacro{twocolumn}
+\DescribeMacro{abstract*}
+If the global |twocolumn| option is present the page geometry is changed to cover almost the entire page.
+Additionally the |abstract*| environment is defined that generates a one column abstract and takes care of placing the title information.
+
+\subsection{Title page}
+
+\DescribeMacro{\title}
+The \PDF meta information is set according to the |\title|\marg{text} and |\author| \marg{text} information.
+
+\DescribeMacro{\subtitle}
+The |\subtitle|\marg{subtitle} macro is defined using the \software{titling} package \cite{titling}.
+
+\DescribeMacro{\author}
+\DescribeMacro{\affiliation}
+\DescribeMacro{\email}
+In order to facilitate multiple authors with different affiliations the \software{authblk} package \cite{authblk} is loaded.
+The following lines add \eg two authors with different affiliations
+\begin{verbatim}
+\author[1]{Author one \email{email one}}
+\affiliation[1]{Affiliation one}
+\author[2]{Author two \email{email two}}
+\affiliation[1,2]{Affiliation two}
+\end{verbatim}
+
+\DescribeMacro{\preprint}
+The |\preprint|\marg{numer} macro places a pre-print number in the upper right corner of the title page.
+
+\DescribeEnv{abstract}
+The |abstract| environment is adjusted to not start with an indentation.
+
+\DescribeMacro{\titlefont}
+\DescribeMacro{\subtitlefont}
+\DescribeMacro{\authorfont}
+\DescribeMacro{\affiliationfont}
+\DescribeMacro{\preprintfont}
+Various title font macros are defined, allowing to change the appearance of the |\maketitle| output.
+
+\subsection{Text}
+
+Hyphenation is provided by the \software{babel} package \cite{babel} and quotation commands are provided by the \software{csquotes} package \cite{csquotes}.
+\DescribeMacro{\enquote}
+\DescribeMacro{\MakeOuterQuote}
+The latter package provides the convenient macros |\enquote|\marg{text} and |\MakeOuterQuote{"}| allowing to leave the choice of quotation marks to \hologo{LaTeX} and use |"| instead of the pair |``| and |''|, respectively.
+
+\DescribeMacro{\eg}
+\DescribeMacro{\vs}
+The \software{foreign} package \cite{foreign} defines macros such as |\eg|, |\ie|, |\cf|, and |\vs| which are typeset as \eg, \ie, \cf, and \vs.
+
+\DescribeMacro{\no}
+The |\no|\marg{number} macro is typeset as \no{123}.
+
+\DescribeMacro{\software}
+The |\software|\oarg{version}\marg{name} macro is typeset as \software[\fileversion]{HEP-Paper}.
+
+\DescribeMacro{\online}
+The |\online|\marg{url}\marg{text} macro combines the features of the |\href|\marg{url}\allowbreak\marg{text}\allowbreak \cite{hyperref} and the |\url|\marg{text} \cite{url} macros, resulting in \eg \online{https://ctan.org/pkg/hep-paper}{ctan.org/pkg/hep-paper}.
+
+
+\DescribeMacro{inlinelist}
+\DescribeMacro{enumdescript}
+The |inlinelist| and |enumdescript| environments are defined using the \software{enumitem} package \cite{enumitem}.
+\begin{columns}
+\begin{verbatim}
+The three main points are
+\begin{inlinelist}
+ \item one
+ \item two
+ \item three
+\end{inlinelist}
+\end{verbatim}
+\column
+The three main points are
+\begin{inlinelist}
+ \item one
+ \item two
+ \item three
+\end{inlinelist}
+\end{columns}
+\vspace{4ex}
+\begin{columns}[.6]
+\begin{verbatim}
+\begin{enumdescript}[label=\Roman*)]
+ \item{First} one
+ \item{Second} two
+ \item{Third} three
+\end{enumdescript}
+\end{verbatim}
+\column
+\begin{enumdescript}[label=\Roman*)]
+ \item{First} one
+ \item{Second} two
+ \item{Third} three
+\end{enumdescript}
+\end{columns}
+
+\DescribeMacro{\textsc}
+A bold versions \textbf{\textsc{Small Caps}} and a sans serif version of \textsf{\textsc{Small Caps}} based on the \CM font \cite{cm} is provided, the latter using the \software{sansmathfonts} package \cite{sansmathfonts}.
+
+\DescribeMacro{\underline}
+\DescribeMacro{\overline}
+The |\underline| macro is redefined to allow line-breaks using the \software{ulem} package \cite{ulem}.
+The |\overline| macro is extended to also \overline{overline} text outside of math environments.
+
+\DescribeMacro{\useparskip}
+\DescribeMacro{\useparindent}
+If the |parskip| option is activated the |\useparindent| macro switches to the usual parindent mode, while the |\useparskip| macro switches to the parskip mode.
+
+\subsubsection{References and footnotes}
+
+\DescribeMacro{\cref}
+References are extended with the \software{cleveref} package \cite{cleveref}, which allows to \eg just type |\cref|\marg{key} in order to write \enquote{figure 1}.
+Furthermore, the \software{cleveref} package allows to reference multiple objects within one |\cref|\marg{key1,key2}.
+
+\DescribeMacro{\cite}
+Citations are adjusted to not start on a new line in order to avoid the repeated use of |~\cite|\marg{key}.
+
+\DescribeMacro{\ref}
+\DescribeMacro{\eqref}
+\DescribeMacro{\subref}
+References are also adjusted to not start on a new line.
+
+\DescribeMacro{\footnote}
+Footnotes are adjusted to swallow white space before the footnote mark and at the beginning of the footnote text.
+
+\subsubsection{Acronyms}
+
+\DescribeMacro{\acronym}
+\DescribeMacro{\shortacronym}
+\DescribeMacro{\longacronym}
+The |\acronym|\meta{*}\oarg{typeset abbreviation}\marg{abbreviation}\meta{*}\marg{definition}\oarg{plural\linebreak[4]definition} macro generates the singular |\|\meta{abbreviation} and plural |\|\meta{abbreviation}|s| macros.
+The first star prevents the addition of an \enquote{s} to the abbreviation plural.
+The second star restores the \hologo{TeX} default of swallowing subsequent white space.
+The long form is only shown at the first appearance of these macros, later appearances generate the abbreviation with a hyperlink to the long form.
+The long form is never used in math mode.
+Capitalization at the beginning of paragraphs and sentences is (mostly) ensured.
+The |\shortacronym| and |\longacronym| macros are drop-in replacements of the |\acronym| macro showing only the short or long form of their acronym.
+\DescribeMacro{\resetacronym}
+\DescribeMacro{\dummyacronym}
+The first use form of the acronym can be enforced by resetting the acronym counter with |\resetacronym|\marg{key}.
+If the acronym counter equals one at the end of the document the short form of the acronym is not introduced.
+Placing a |\dummyacronym|\marg{key} at the end of the document ensures that the short form is introduced.
+
+\subsection{Math}
+
+The \software{mathtools} \cite{mathtools} and \software{amssymb} \cite{amsfonts} packages are loaded.
+They in turn load the \hologo{AmSLaTeX} \software{amsmath} \cite{amsmath} and \software{amsfonts} \cite{amsfonts} packages.
+\DescribeMacro{\mathbf}
+Bold math, via |\mathbf| is improved by the \software{bm} package \cite{bm}, \ie ($ A b \Gamma \delta \mathbf A \mathbf b \mathbf \Gamma \mathbf \delta$).
+Macros switching to |bfseries| such as |\section|\marg{text} are ensured to also typeset math in bold.
+\DescribeMacro{\text}
+The |\text|\marg{text} macro makes it possible to write text within math mode, \ie ($ \text A \text b \text \Gamma \text \delta \text{\textbf A} \text{\textbf b} \text{\textbf \Gamma} \text{\textbf \delta}$).
+\DescribeMacro{\mathsf}
+The math sans serif alphabet is redefined to be italic sans serif if the main text is serif and italic serif if the main text is sans serif, \ie ($\mathsf A \mathsf b \mathsf \Gamma \mathsf \delta \mathbf{\mathsf A} \mathbf{\mathsf b} \mathbf{\mathsf \Gamma} \mathbf{\mathsf \delta}$).
+\DescribeMacro{\mathscr}
+The |\mathcal| font \ie ($\mathcal{ABCD}$) is accompanied by the |\mathscr| font \ie ($\mathscr{ABCD}$).
+\DescribeMacro{\mathbb}
+The |\mathbb| font is improved by the \software{doublestroke} package \cite{dsfont} and adjusted depending on the |sansserif| option \ie ($\mathbb{Ah1}$).
+\DescribeMacro{\mathfrak}
+Finally, the |\mathfrak| font is also available \ie ($\mathfrak{AaBb12}$).
+Details about the font handling in \hologo{TeX} can be found in \ccite{fntguide}.
+
+\DescribeMacro{\nicefrac}
+\DescribeMacro{\flatfrac}
+\DescribeMacro{\textfrac}
+The |\frac|\marg{number}\marg{number} macro is accompanied by |\nicefrac|\linebreak[1]\marg{number}\linebreak[1]\marg{number}, |\textfrac|\marg{number}\marg{number}, and |\flatfrac|\marg{number}\marg{number} leading to $\frac12$, $\nicefrac12$, \textfrac12, and $\flatfrac12$.
+\DescribeMacro{\diag}
+\DescribeMacro{\sgn}
+Diagonal matrix |\diag| and signum |\sgn| operators are defined.
+
+\DescribeMacro{\mathdef}
+The |\mathdef|\marg{name}\oarg{arguments}\marg{code} macro \prefix{re}{defines} macros only within math mode without changing the text mode definition.
+
+\DescribeMacro{\i}
+\DescribeMacro{\d}
+The imaginary unit $\i$ and the differential $\d$ are defined using this functionality.
+
+\DescribeMacro{\numberwithin}
+For longer paper it can be useful to re-number the equation in accordance with the section numbering |\numberwithin{equation}{section}|.
+\DescribeMacro{subequations}
+In order to further reduce the size the of equation counter it can be useful to wrap |align| environments with multiple rows in a |subequations| environment.
+Both macros are provided by the \software{amsmath} package.
+
+\DescribeMacro{eqnarray}
+The depreciated |eqnarray| environment is undefined as long this behaviour is not prevented by the |eqnarray| package option.
+The |split|, |multline|, |align|, |multlined|, |aligned|, |alignedat|, and |cases| environments of the \software{amsmath} and \software{mathtools} packages should be used instead.
+
+\DescribeMacro{equation}
+Use the |equation| environment for short equations.
+\begin{columns}
+\begin{verbatim}
+\begin{equation}
+ left = right \ .
+\end{equation}
+\end{verbatim}
+\column
+\begin{equation}
+\framebox[2em]{left\strut} = \framebox[7em]{right\strut} \ .
+\end{equation}
+\end{columns}
+
+\DescribeMacro{multline}
+Use the |multline| environment for longer equations.
+\begin{columns}
+\begin{verbatim}
+\begin{multline}
+ left = right 1 \\
+ + right 2 \ .
+\end{multline}
+\end{verbatim}
+\column
+\begin{multline}
+\framebox[2em]{left\strut} = \framebox[7em]{right 1\strut} \\
+\framebox[7em]{+ right 2\strut} \ .
+\end{multline}
+\end{columns}
+
+\DescribeMacro{split}
+Use the |split| sub environment for equations in which multiple equal signs should be aligned.
+\begin{columns}
+\begin{verbatim}
+\begin{equation} \begin{split}
+ left &= right 1 \\
+ &= right 2 \ .
+\end{split} \end{equation}
+\end{verbatim}
+\column
+\begin{equation}
+\begin{split}
+\framebox[2em]{left\strut} &= \framebox[7em]{right 1\strut} \\
+&= \framebox[7em]{right 2\strut} \ .
+\end{split}
+\end{equation}
+\end{columns}
+
+\DescribeMacro{align}
+Use the |align| environment for the vertical alignment and horizontal distribution of multiple equations.
+\begin{columns}
+\begin{verbatim}
+\begin{subequations} \begin{align}
+ left &= right \ , &
+ left &= right \ , \\
+ left &= right \ , &
+ left &= right \ .
+\end{align} \end{subequations}
+\end{verbatim}
+\column
+\begin{subequations}
+\begin{align}
+\framebox[2em]{left\strut} &= \framebox[3em]{right\strut} \ , &
+\framebox[2em]{left\strut} &= \framebox[3em]{right\strut} \ , \\
+\framebox[2em]{left\strut} &= \framebox[3em]{right\strut} \ , &
+\framebox[2em]{left\strut} &= \framebox[3em]{right\strut} \ .
+\end{align}
+\end{subequations}
+\end{columns}
+
+\DescribeMacro{aligned}
+Use the |aligned| environment within a |equation| environment if the aligned equations should be labeled with a single equation number.
+
+\DescribeMacro{multlined}
+Use the |multlined| environment if either |split| or |align| contain very long lines.
+\begin{columns}
+\begin{verbatim}
+\begin{equation} \begin{split}
+ left &= right 1 \\ &=
+ \begin{multlined}[t]
+ right 2 \\ + right 3 \ .
+ \end{multlined}
+\end{split} \end{equation}
+\end{verbatim}
+\column
+\begin{equation}
+\begin{split}
+\framebox[2em]{left\strut} &= \framebox[7em]{right 1\strut} \\ &=
+ \begin{multlined}[t]
+ \framebox[7em]{right 2\strut} \\
+ \framebox[7em]{+ right 3\strut} \ .
+\end{multlined}
+\end{split}
+\end{equation}
+\end{columns}
+
+\DescribeMacro{alignat}
+Use the |alignat| environment together with the |\mathllap| macro for the alignment of multiple equations with vastly different lengths.
+\begin{columns}
+\begin{verbatim}
+\begin{subequations}
+\begin{alignat}{2}
+ left &= long right && \ , \\
+ le. 2 &= ri. 2 \ , &
+ \mathllap{le. 3 = ri. 3} & \ .
+\end{alignat}
+\end{subequations}
+\end{verbatim}
+\column
+\begin{subequations}
+\begin{alignat}{2}
+\framebox[2em]{left\strut} &=
+\framebox[11em]{long right\strut} && \ , \\
+\framebox[2em]{le.\ 2\strut}
+&= \framebox[2.5em]{ri.\ 2\strut} \ , &
+\mathllap{\framebox[2em]{le.\ 3\strut}
+= \framebox[2.5em]{ri.\ 3\strut}} & \ .
+\end{alignat}
+\end{subequations}
+\end{columns}
+
+As a rule of thumb if you have to use |\notag|, |\nonumber|, or perform manual spacing via |\quad| you are probably using the wrong environment.
+
+\subsubsection{Physics}
+
+\DescribeMacro{\unit}
+\DescribeMacro{\inv}
+The correct spacing for units, \cf \cref{eq:greek}, is provided by the macro |\unit|\oarg{value} \marg{unit} from the \software{units} package \cite{units} which can also be used in text mode.
+The macro |\inv|\oarg{power}\marg{text} allows to avoid math mode also for inverse units such as \unit[5]{\inv{fb}} typeset via |\unit[5]{\inv{fb}}|.
+
+Greek letters are adjusted to always be italic and upright in math and text mode, respectively, using the \software{fixmath} \cite{fixmath} and \software{alphabeta} \cite{alphabeta} packages.
+This allows differentiations like
+\begin{align}
+\sigma &= \unit[5]{fb} \ , & &\text{at \unit[5]{\sigma} C.L.} \ , & \mu &= \unit[5]{cm} \ , & l &= \unit[5]{\text \mu m} \ ,
+\label{eq:greek}
+\end{align}
+and \eg to distinguish gauge $\nu$ and mass \nu\ eigenstates in models with massive neutrinos.
+Note that |\mathrm| and therefore |\unit| transform italic greek character to seemingly random upright characters, this can be avoided by using |\unit{\text\mu m}|.
+Additionally, Greek letters can also be directly typed using Unicode.
+
+\DescribeMacro{\ev}
+\DescribeMacro{\pdv}
+\DescribeMacro{\comm}
+\DescribeMacro{\order}
+The \software{physics} package \cite{physics} provides additional macros such as
+\begin{align}
+&\ev{\phi} \ ,
+&&\pdv[n]{f}{x} \ ,
+&&\comm{A}{B} \ ,
+&&\order{x^2} \ ,
+&&\eval{x}_0^\infty \ ,
+&&\det(M)\ .
+\end{align}
+
+\DescribeMacro{\cancel}
+\DescribeMacro{\slashed}
+The |\cancel|\marg{characters} macro from the \software{cancel} package \cite{cancel} and the |\slashed| \marg{character} macro from the \software{slashed} package \cite{slashed} allow to $\cancel{\text{cancel}}$ math and use the Dirac slash notation \ie $\slashed \partial$, respectively.
+
+\DescribeMacro{\overleftright}
+A better looking over left right arrow is defined \ie $\overleftright{\partial}$.
+
+\subsection{Floats}
+
+\DescribeEnv{figure}
+\DescribeEnv{table}
+Automatic float placement is adjusted to place a single float at the top of pages and to reduce the number of float pages, using the \hologo{LaTeX} macros.
+
+|\setcounter{bottomnumber}{0}| \hfill no floats at the bottom of a page (default 1) \\
+|\setcounter{topnumber}{1}| \hfill a single float at the top of a page (default 2) \\
+|\setcounter{dbltopnumber}{1}| \hfill same for full widths floats in two-column mode \\
+|\renewcommand{\textfraction}{.1}| \hfill large floats are allowed (default 0.2)\\
+|\renewcommand{\topfraction}{.9}| \hfill (default 0.7) \\
+|\renewcommand{\dbltopfraction}{.9}| \hfill (default 0.7) \\
+|\renewcommand{\floatpagefraction}{.8}| \hfill float pages must be full (default 0.5)
+
+Additionally, manual float placement is deactivated but can be reactivated using the |manualplacement| package option.
+It is however recommended to archive the desired design by adjusting above macros.
+The most useful float placement is usually archived by placing the float \emph{in front} of the paragraph it is referenced in first.
+\DescribeMacro{\raggedright}
+The float environments have been adjusted to center their content.
+The usual behaviour can be reactivated using |\raggedright|.
+
+\begin{table}
+\begin{panels}{.6}
+\begin{verbatim}
+\begin{panels}{.6}
+ code
+\panel{.4}
+ \begin{tabular}...\end{tabular}
+\end{panels}
+\end{verbatim}
+\caption{Code for this panel environment.}
+\label{tab:panels}
+\panel{.4}
+\begin{tabular}{cccc}
+\toprule
+\multicolumn{2}{c}{one}& \multicolumn{2}{c}{two} \\ \cmidrule(r){1-2} \cmidrule(l){3-4}
+\multirow{2}{*}{a} & b & c & d \\
+ & b & c & d \\
+\bottomrule
+\end{tabular}
+\caption{The \protecting{|booktabs|} and \protecting{|multirow|} features.}
+\label{tab:booktabs}
+\end{panels}
+\caption{Example use of the \protecting{|panels|} environment in Panel \subref{tab:panels} and the features from the \software{booktabs} and \software{multirow} packages in Panel \subref{tab:booktabs}.
+} \label{tab:table}
+\end{table}
+
+\DescribeEnv{panels}
+\DescribeMacro{\panel}
+The |panels| environment makes use of the \software{subcaption} package \cite{subcaption}.
+It provides sub-floats and takes as mandatory argument either the number of sub-floats (default~2) or the width of the first sub-float as fraction of the |\linewidth|.
+Within the |\begin{panels}|\oarg{vertical alignment}\marg{width} environment the |\panel| macro initiates a new sub-float.
+In the case that the width of the first sub-float has been given as an optional argument to the |panels| environment the |\panel|\marg{width} macro takes the width of the next sub-float as mandatory argument.
+The example code is presented in \cref{tab:panels}.
+
+\DescribeEnv{tabular}
+The \software{booktabs} \cite{booktabs} and \software{multirow} \cite{multirow} packages are loaded enabling publication quality tabulars such as in \cref{tab:booktabs}.
+
+\DescribeMacro{\graphic}
+\DescribeMacro{\graphics}
+The \software{graphicx} package \cite{graphicx} is loaded and the |\graphic|\oarg{width}\marg{figure} macro is defined, which is a wrapper for the |\includegraphics|\marg{figure} macro and takes the figure width as fraction of the |\linewidth| as optional argument (default~1).
+If the graphics are located in a sub-folder its path can be indicated by |\graphics|\marg{subfolder}.
+
+\subsection{Bibliography}
+
+\DescribeMacro{\bibliography}
+\DescribeMacro{\printbibliography}
+The \software{biblatex} package \cite{biblatex} is loaded for bibliography management.
+The user has to add the line |\bibliography|\marg{my.bib} to the preamble of the document and |\printbibliography| at the end of the document.
+The bibliography is generated by \software{Biber} \cite{biber}.
+|biblatex| is extended to be able to cope with the |collaboration| and |reportNumber| fields provided by \online{https://inspirehep.net}{inspirehep.net} and a bug in the volume number is fixed.
+Additionally, the PubMed IDs are recognized and \online{https://ctan.org}{ctan.org}, \online{https://github.com}{github.com}, \online{https://gitlab.com}{gitlab.com}, \online{https://bitbucket.org}{bitbucket.org}, \online{https://www.launchpad.net}{launchpad.net}, \online{https://sourceforge.net}{sourceforge.net}, and \online{https://hepforge.org}{hepforge.org} are valid |eprinttype|s.
+\DescribeMacro{erratum}
+Errata can be included using the |related| feature.
+\begin{verbatim}
+\article{key1,
+ ...,
+ relatedtype="erratum",
+ related="key2",
+}
+\article{key2,
+ ...,
+}
+\end{verbatim}
+
+\section{Conclusion}
+
+The \software{hep-paper} package provides a matching selection of preloaded packages and additional macros enabling the user to focus on the content instead of the layout by reducing the amount of manual tasks.
+The majority of the loaded packages are fairly lightweight, the others can be deactivated with package options.
+
+\DescribeMacro{arxiv-collector}
+\nolinkurl{arxiv.org} \cite{arxiv} requires the setup dependent |bbl| files instead of the original |bib| files, which causes trouble if the local \hologo{LaTeX} version differs from the one used by arXiv.
+The \software{arxiv-collector} python script \cite{arxiv-collector} alleviates this problem by collecting all files necessary for publication on arXiv (including figures).
+
+% \ifshort
+\printbibliography
+
+\end{document}
+%
+%</documentation>
+% \fi
+%
+% \StopEventually{
+% \printbibliography
+% \PrintChanges
+% }
+%
+% \addtocontents{toc}{\protect\clearpage}
+% \clearpage
+% \appendix
+%
+% \ifshort
+%<*package>
+% \fi
+%
+% \section{Math alphabet allocation}
+%
+% \bgroup
+% \makeatletter
+% \renewcommand{\arraystretch}{0}
+% \setlength{\tabcolsep}{0pt}
+% \nodecimals
+% \nohexoct
+% \fntcolwidth=0pt
+% \setlength\arrayrulewidth{0pt}
+%
+% \begin{figure}
+% \begin{panels}[t]{.22}
+% \fonttable{rm-\ifhep@serif lmr\else lmss\fi10}
+% \caption{Text}
+% \panel{.22}
+% \fontrange{0}{127}
+% \fonttable{\ifhep@serif lm\else cmbr\fi mi10}
+% \caption{Math}\vspace{2ex}
+% \fonttable{\ifhep@serif lm\else cmbr\fi sy10}
+% \caption{Symbol}
+% \panel{.352}
+% \fontrange{0}{127}
+% \fonttable{\ifhep@serif\else ss\fi msam10}
+% \caption{AMS a}\vspace{2ex}
+% \fonttable{\ifhep@serif\else ss\fi msbm10}
+% \caption{AMS b}
+% \panel{.19}
+% \fontrange{0}{127}
+% \fonttable{eufm10}
+% \caption{Euler fraktur}\vspace{2ex}
+% \fontrange{64}{95}
+% \fonttable{eusm10}
+% \caption{Euler caligraphy}\vspace{2ex}
+% \fonttable{MnSymbolS10}
+% \caption{Minion caligraphy}\vspace{2ex}
+% \fonttable{ds\ifhep@serif rom\else ss\fi10}
+% \caption{Doublestroke}
+% \end{panels}
+% \caption{Basic math fonts}
+% \end{figure}
+%
+% \begin{figure}
+% \hspace*{-2cm}%
+% \begin{panels}[t]{.3}
+% \fontrange{0}{127}
+% \fonttable{cm\ifhep@serif\else ss\fi ex10}
+% \caption{Computer modern}
+% \panel{.22}
+% \fontrange{0}{143}
+% \fonttable{MnSymbolE5}
+% \caption{Mn Symbol E 1}
+% \panel{.6}
+% \fontrange{144}{215}
+% \fonttable{MnSymbolE5}
+% \caption{Mn Symbol E 2}\vspace{2ex}
+% \begin{minipage}{.48\linewidth}
+% \fontrange{0}{127}\fonttable{MnSymbolF10}
+% \caption{Mn Symbols F}
+% \end{minipage}%
+% \begin{minipage}{.5\linewidth}
+% \fontrange{0}{47}\fonttable{\ifhep@serif\else ss\fi esint10}
+% \caption{Extended set of integrals}
+% \end{minipage}
+% \end{panels}
+% \caption{Math extension fonts}
+% \end{figure}
+%
+% \begin{figure}
+% \begin{panels}[t]{.26}
+% \fonttable{MnSymbolA10}
+% \caption{Mn Symbol A}
+% \panel{.26}
+% \fonttable{MnSymbolB10}
+% \caption{Mn Symbol B}
+% \panel{.26}
+% \fonttable{MnSymbolC10}
+% \caption{Mn Symbol C}
+% \panel{.2}
+% \fonttable{MnSymbolD10}
+% \caption{Mn Symbol D}
+% \end{panels}
+% \makeatother
+% \caption{Minion symbol fonts}
+% \end{figure}
+% \egroup
+%
+% Of the 16 available math alphabets, \hologo{TeX} loads four by default
+% \begin{enumdescript}[start=0]
+% \item{OT1} \label{it:math text} Text (latin, upper case greek, numerals, text symbols)
+% \item{OML} \label{it:math italic} Math Italic (latin, greek, numerals, text symbols)
+% \item{OMS} \label{it:math symbol} Symbol (|\mathcal|, operators)
+% \item{OMX} \label{it:math extension} Math Extension (big operators, delimiters)
+% \end{enumdescript}
+% The text font \ref{it:math text}\strut\ of \CM is \textbf{cmr10} |\OT1/cmr/m/n/10|, which is replaced by \LM to be \textbf{rm-lmr10} |\OT1/lmr/m/n/10|, the |sansserif| option uses \textbf{rm-lmss10} |\OT1/lmss/m/n/10|.
+% The italic math font \ref{it:math italic} of \CM is \textbf{cmmi10} |\OML/cmm/m/it/|\allowbreak|10|, and is replaced by \LM to be \textbf{lmmi10} |\OML/lmm/m/it/10|, the |sansserif| options uses \textbf{cmbrmi10} |\OML/cmbrm/m/it/10| from the \software{cmbright} package \cite{cmbright}.
+% The symbol font \ref{it:math symbol}\strut\ of \CM is \textbf{cmsy10} |\OMS/cmsy/m/n/10|, and is replaced by \LM to be \textbf{lmsy10} |\OMS/lmsy/m/n/10|, the |sansserif| options uses \textbf{cmsssy10} |\OMS/cmsssy/m/n/10| from the \software{sansmathfonts} package \cite{sansmathfonts}.
+% The extension font \ref{it:math extension}\strut\ of \CM is \textbf{cmex10} |\OMX/cmex/m/n/5|, and is replaced by the \software{exscale} package \cite{exscale} to be \textbf{cmex10} |\OMX/cmex/m/n/10|, the |sansserif| option loads \textbf{cmssex10} |\OMX/cmssex/m/n/10|.
+% The \software{amssymb} (\software{amsfonts}) packages \cite{amssymb} load two more symbol fonts
+% \begin{enumdescript}[start=4]
+% \item{msam10} \label{it:math ams a} |\U/msa/m/n/10| AMS symbol font A (special math operators)
+% \item{msbm10} \label{it:math ams b} |\U/msb/m/n/10| AMS symbol font B (|\mathbb|, negated operators)
+% \end{enumdescript}
+% The |sansserif| option replaces them with \textbf{ssmsam10} |\U/ssmsa/m/n/10| and \textbf{ssmsbm10} |\U/ssmsb/m/n/10| from the \software{sansmathfonts} package \cite{sansmathfonts}, respectively.
+% The \software{bm} package \cite{bm} loads the bold version for the fonts \labelcref{it:math text,it:math italic,it:math symbol}.
+%
+% Other math alphabets are only loaded on demand, \eg |\mathsf| uses a sans serif font and |\mathbf| without the \software{bm} package uses a bold font.
+% The |\mathscr| macro uses the script font from the \software{mathrsfs} package \cite{mathrsfs}
+% \begin{enumdescript}[start=9]
+% \item{rsfs10} |\U/rsfs/m/n/10| Math script font (capital letters)
+% \end{enumdescript}
+% The |\mathbb| macro loads the double stroke font from the \software{dsfont} package \cite{dsfont}, this can be prevented with the |symbols=ams| option.
+% \begin{enumdescript}[start=10]
+% \item{dsrom10} |\U/dsrom/m/n/10| Double stroke font
+% \end{enumdescript}
+% The |\mathfrak| macro loads the fractur font from the \software{amssymb} package \cite{amssymb}
+% \begin{enumdescript}[start=11]
+% \item{eufm10} |\U/euf/m/n/10| Math fraktur (Basic Latin)
+% \end{enumdescript}
+%
+% The \software{hep-paper} package uses nine of the available 16 math alphabets.
+% This number can be reduced by three using |\newcommand{\bmmax}{0}| from the \software{bm} package \cite{bm} and brought down to the default of four with the option |symbols=false|.
+%
+% The |symbols=minion| options replaces the fonts \labelcref{it:math symbol,it:math extension,it:math ams a,it:math ams b} with corresponding fonts from the \software{MnSymbol} package \cite{MnSymbol}.
+% Additionally, two more symbol alphabets are allocated, the \software{bm} package \cite{bm} loads one more font and now |\mathcal| triggers the use of one additional alphabet.
+% Hence, the minion option uses three to four more math alphabets than a usual setup.
+%
+% \section{Options}
+%
+% Load the \software{pdftexcmds} \cite{pdftexcmds} and \software{kvoptions} \cite{kvoptions} packages and define a |hep| namespace.
+% \begin{macrocode}
+\RequirePackage{pdftexcmds}
+\RequirePackage{kvoptions}
+\SetupKeyvalOptions{
+ family=hep,
+ prefix=hep@
+}
+% \end{macrocode}
+%
+% \begin{macro}{paper}
+% Define a |paper=|\meta{size} option.
+% Make A4 paper the default.
+% \begin{macrocode}
+\DeclareStringOption[a4]{paper}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{font}
+% Define a |figures=|\meta{size} option.
+% Make \unit[11]{pt} the default font size.
+% \begin{macrocode}
+\DeclareStringOption[11pt]{font}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{lang}
+% Define the |lang| option, which takes the values provided by the \software{babel} package \cite{babel}.
+% Make |british| the default language.
+% \begin{macrocode}
+\DeclareStringOption[british]{lang}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{sansserif}
+% Define the option pair |serif| and |sansserif| controling the font shape of the whole document.
+% \begin{macrocode}
+\DeclareBoolOption[true]{serif}
+\DeclareComplementaryOption{sansserif}{serif}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{parskip}
+% Define the option pair |parindent| and |parskip| controlling the separation of paragraphs.
+% \begin{macrocode}
+\DeclareBoolOption[true]{parindent}
+\DeclareComplementaryOption{parskip}{parindent}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{symbols}
+% Provide the |symbols| option allowing to switch the symbol font.
+% \begin{macrocode}
+\DeclareStringOption[true]{symbols}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Deactivation}
+%
+% \begin{macro}{defaults}
+% Define the |defaults| option which deactivates the |paper| and |font| options and prevents the change of the class defaults by this package.
+% \begin{macrocode}
+\DeclareBoolOption[false]{defaults}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{lining}
+% Define the |lining| option deactivating the use of text figures in text mode.
+% \begin{macrocode}
+\DeclareBoolOption[false]{lining}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{title}
+% Provide the |title| option deactivating redefinitions of title macros.
+% \begin{macrocode}
+\DeclareBoolOption[true]{title}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{physics}
+% Provide the |physics| option for deactivating redefinition of physics macros.
+% \begin{macrocode}
+\DeclareBoolOption[true]{physics}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{bibliography}
+% Provide the |bibliography| option for passing a |style| string to the \software{biblatex} package \cite{biblatex} or disabling the automatic loading of |biblatex|.
+% \begin{macrocode}
+\DeclareStringOption[numeric-comp]{bibliography}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{glossaries}
+% Provide the |glossaries| option able to turn of the use of the \software{glossaries} package \cite{glossaries}.
+% \begin{macrocode}
+\DeclareBoolOption[true]{glossaries}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{references}
+% Provide the |references| option for preventing the \software{cleveref} package from being loaded redefinitions of reference macros.
+% \begin{macrocode}
+\DeclareBoolOption[true]{references}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Compatibility}
+%
+% \begin{macro}{beamer}
+% Provide the |beamer| option for \software{beamer} \cite{beamer} compatibility mode.
+% \begin{macrocode}
+\DeclareBoolOption[false]{beamer}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{revtex}
+% Provide the |revtex| option for REV\hologo{TeX} \cite{revtex} compatibility mode.
+% \begin{macrocode}
+\DeclareBoolOption[false]{revtex}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{jhep}
+% Provide the |jhep| option for JHEP \cite{jhep} compatibility mode.
+% \begin{macrocode}
+\DeclareBoolOption[false]{jhep}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{jcap}
+% Provide the |jcap| option for JCAP \cite{jcap} compatibility mode.
+% \begin{macrocode}
+\DeclareBoolOption[false]{jcap}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{pos}
+% Provide the |pos| option for PoS compatibility mode.
+% \begin{macrocode}
+\DeclareBoolOption[false]{pos}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{springer}
+% Provide the |springer| option for Springer compatibility mode.
+% \begin{macrocode}
+\DeclareBoolOption[false]{springer}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Reactivation}
+%
+% \begin{macro}{eqnarray}
+% Provide the |eqnarray| option for reactivating the |eqnarray| environment.
+% \begin{macrocode}
+\DeclareBoolOption[false]{eqnarray}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{manualplacement}
+% Provide the |manualplacement| option for reactivating the manual placement of floats.
+% \begin{macrocode}
+\DeclareBoolOption[false]{manualplacement}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Process options}
+%
+% \begin{macrocode}
+\ProcessKeyvalOptions*
+% \end{macrocode}
+%
+% Read the class options regarding font and paper size.
+% \begin{macrocode}
+\def\hep@get@class#1.cls#2\relax{\def\hep@class{#1}}
+\def\hep@getclass{\expandafter\hep@get@class\@filelist\relax}
+\hep@getclass
+\@ifclasswith{\hep@class}{10pt}{\setkeys{hep}{font=10pt}}{}
+\@ifclasswith{\hep@class}{12pt}{\setkeys{hep}{font=12pt}}{}
+\@ifclasswith{\hep@class}{a5paper}{\setkeys{hep}{paper=a5}}{}
+\@ifclasswith{\hep@class}{b5paper}{\setkeys{hep}{paper=b5}}{}
+\@ifclasswith{\hep@class}{letterpaper}{\setkeys{hep}{paper=letter}}{}
+\@ifclasswith{\hep@class}{legalpaper}{\setkeys{hep}{paper=legal}}{}
+\@ifclasswith{\hep@class}{executivepaper}{%
+ \setkeys{hep}{paper=executive}%
+}{}
+% \end{macrocode}
+%
+% \subsection{Set compatibility}
+%
+% Set the |springer| compatibility options.
+% \begin{macrocode}
+\@ifclassloaded{svjour}{\setkeys{hep}{springer}}{}
+\@ifclassloaded{svjour2}{\setkeys{hep}{springer}}{}
+\@ifclassloaded{svjour3}{\setkeys{hep}{springer}}{}
+\ifhep@springer
+ \setkeys{hep}{defaults, title=false}
+ \let\cl@chapter\undefined
+\fi
+% \end{macrocode}
+%
+% Set the |pos| compatibility options.
+% \begin{macrocode}
+\@ifclassloaded{PoS}{\setkeys{hep}{pos}}{}
+\ifhep@pos
+ \setkeys{hep}{defaults, title=false}
+ \DeclareRobustCommand\boldmath{\@nomath\boldmath\mathversion{bold}}
+\fi
+% \end{macrocode}
+%
+% Set the |beamer| compatibility options.
+% \begin{macrocode}
+\@ifclassloaded{beamer}{\setkeys{hep}{beamer}}{}
+\ifhep@beamer
+ \setkeys{hep}{defaults, title=false, references=false, sansserif}
+ \@ifpackageloaded{beamerbasefont}{\usefonttheme{professionalfonts}}{}
+ \setbeamertemplate{navigation symbols}{}
+\fi
+% \end{macrocode}
+%
+% Set the |revtex| compatibility options.
+% \begin{macrocode}
+\@ifclassloaded{revtex4}{\setkeys{hep}{revtex}}{}
+\@ifclassloaded{revtex4-1}{\setkeys{hep}{revtex}}{}
+\@ifclassloaded{revtex4-2}{\setkeys{hep}{revtex}}{}
+\ifhep@revtex
+ \setkeys{hep}{defaults, title=false, bibliography=false, lang=american}
+\fi
+% \end{macrocode}
+%
+% Define the SISSA conditional.
+% \begin{macrocode}
+\@ifpackageloaded{jheppub}{\setkeys{hep}{jhep}}{}
+\@ifpackageloaded{jcappub}{\setkeys{hep}{jcap}}{}
+\newif\ifhep@sissa
+\ifhep@jhep\hep@sissatrue
+\else
+ \ifhep@jcap\hep@sissatrue
+ \else\hep@sissafalse
+ \fi
+\fi
+% \end{macrocode}
+%
+% Set the SISSA compatibility options.
+% \begin{macrocode}
+\ifhep@sissa
+ \setkeys{hep}{title=false, bibliography=false}
+ \PassOptionsToPackage{
+ colorlinks=true, linktocpage=true, pdfproducer=medialab, pdfa=true,
+ urlcolor=blue, anchorcolor=blue, citecolor=blue, filecolor=blue,
+ linkcolor=blue, menucolor=blue, pagecolor=blue
+ }{hyperref}
+ \PassOptionsToPackage{reset}{geometry}
+ \AtBeginDocument{\renewcommand{\foreignabbrfont}{}}
+\fi
+% \end{macrocode}
+% Set the JHEP compatibility options.
+% \begin{macrocode}
+\ifhep@jhep
+ \voffset 0in
+ \hoffset 0in
+\fi
+% \end{macrocode}
+
+% \section{Text}
+%
+% Set the whole text to sans serif if requested.
+% \begin{macrocode}
+\ifhep@serif\else
+ \renewcommand{\familydefault}{\sfdefault}
+\fi
+% \end{macrocode}
+%
+% \begin{macro}{\ifxetexorluatex}
+% Load the \software{ifluatex} \cite{ifluatex} and \software{ifxetex} \cite{ifxetex} packages.
+% Define the |\ifxetexorluatex| conditional checking if the package is executed by \hologo{LuaLaTeX} or \hologo{XeLaTeX}.
+% \begin{macrocode}
+\RequirePackage{ifluatex}
+\RequirePackage{ifxetex}
+\newif\ifxetexorluatex
+\ifxetex\xetexorluatextrue
+\else
+ \ifluatex\xetexorluatextrue
+ \else\xetexorluatexfalse
+ \fi
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% Pick the correct font encoding depending on the engine used and load the \software{fontenc} package \cite{fontenc} with this encoding.
+% For details of the font encoding see \cite{encguide}.
+% \begin{macrocode}
+\ifxetexorluatex
+ \def\hep@encoding{TU}
+\else
+ \def\hep@encoding{T1}
+\fi
+\RequirePackage[\hep@encoding]{fontenc}
+% \end{macrocode}
+% Fix the remaining \CM fonts \cite{fix-cm}, load the \LM font via \software{cfr-lm} \cite{cfr-lm} supported also by \software{lmodern} \cite{lmodern}, the \software{textcomp} extension \cite{textcomp}, and the \software{microtype} font optimization \cite{microtype}.
+% Adjust the figures according to the |lining| option and ensure that tables always use lining, using the \software{etoolbox} package \cite{etoolbox}.
+% \begin{macrocode}
+\RequirePackage{fix-cm}
+\RequirePackage{microtype}
+\ifhep@lining
+ \RequirePackage[rm={lining},sf={lining},tt={lining}]{cfr-lm}
+\else
+ \RequirePackage{cfr-lm}
+\fi
+\RequirePackage{etoolbox}
+% \AtBeginEnvironment{tabular}{\tlstyle}
+\RequirePackage{textcomp}
+% \end{macrocode}
+%
+% Define bold and sans serif small caps font shapes using the \software{fontspec} package \cite{fontspec}.
+% The font abbreviations are
+% \begin{description}[nosep]
+% \item[lmr] \LM regular font
+% \item[lmss] \LM sans serif font
+% \item[cmss] \CM sans serif font
+% \item[xcmss] Extended \CM sans serif font (from the \software{sansmathfonts} package \cite{sansmathfonts})
+% \item[bx] Bold extended series
+% \item[b] Bold series
+% \item[m] Medium weight and width series
+% \item[c] Medium weight, condensed width series
+% \item[sc] Caps and small caps font shape
+% \end{description}
+% \begin{macrocode}
+\newcommand{\hep@sf@fontshape}[3]{%
+ \DeclareFontShape{\hep@encoding}{\sfdefault}{#1}{#2}{#3}{}%
+}
+\newcommand{\hep@rm@fontshape}[3]{%
+ \DeclareFontShape{\hep@encoding}{\rmdefault}{#1}{#2}{#3}{}%
+}
+\ifxetexorluatex
+ \RequirePackage{fontspec}
+ \setmainfont{Latin Modern Roman}[
+ UprightFeatures={SmallCapsFont={[lmromancaps10-regular.otf]}},
+ BoldFeatures={
+ SmallCapsFeatures={Letters=SmallCaps},
+ SmallCapsFont={[cmunbx.otf]}
+ }
+ ]
+ \hep@sf@fontshape{bx}{sc}{<->cmssbxcsc10}{}
+ \hep@sf@fontshape{b}{sc}{<->cmssbxcsc10}{}
+ \hep@sf@fontshape{m}{scit}{<->cmsscsci10}{}
+ \hep@sf@fontshape{m}{sc}{%
+ <-9>cmsscsc8<9-10>cmsscsc9<10->cmsscsc10%
+ }{}
+\else
+ \rmfamily
+ \hep@rm@fontshape{b}{sc}{<->ssub*cmr/bx/sc}{}
+ \hep@rm@fontshape{bx}{sc}{<->ssub*cmr/bx/sc}{}
+ \sffamily
+ \hep@sf@fontshape{m}{sc}{<->ssub*xcmss/m/sc}{}
+ \hep@sf@fontshape{b}{sc}{<->ssub*xcmss/bx/sc}{}
+ \hep@sf@fontshape{bx}{sc}{<->ssub*xcmss/bx/sc}{}
+ \hep@sf@fontshape{m}{scit}{<->ssub*xcmss/m/scit}{}
+ \hep@sf@fontshape{b}{scit}{<->ssub*xcmss/bx/scit}{}
+ \hep@sf@fontshape{bx}{scit}{<->ssub*xcmss/bx/scit}{}
+\fi
+% \end{macrocode}
+%
+% Load the \software{inputenc} package \cite{inputenc}.
+% \begin{macrocode}
+\ifxetexorluatex\else
+ \RequirePackage[utf8]{inputenc}
+\fi
+% \end{macrocode}
+%
+% Load the \software{babel} package \cite{babel} for hyphenation and the recommended \software{csquotes} package \cite{csquotes}.
+% \begin{macrocode}
+\RequirePackage[\hep@lang]{babel}
+\RequirePackage[autostyle]{csquotes}
+% \end{macrocode}
+%
+% \begin{macro}{\underline}
+% Load the \software{ulem} package \cite{ulem} for hyphenable underlined text.
+% \begin{macrocode}
+\RequirePackage[normalem]{ulem}
+\let\underline\uline
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Font size} \label{sec:font size}
+%
+% Undefine previously defined font sizes and load the \hologo{LaTeX} font size file corresponding to the font size option.
+% \begin{macrocode}
+\ifhep@defaults\else
+ \def\hep@remove@pt#1pt{#1}
+ \edef\hep@pt@size{\expandafter\hep@remove@pt\hep@font}
+ \let\small\relax
+ \let\footnotesize\relax
+ \let\scriptsize\relax
+ \let\tiny\relax
+ \let\large\relax
+ \let\Large\relax
+ \let\LARGE\relax
+ \let\huge\relax
+ \let\Huge\relax
+ \input{size\hep@pt@size.clo}
+\fi
+% \end{macrocode}
+
+% \subsection{Text macros}
+%
+%\begin{macro}{\vs}
+% Load the \software{foreign} package \cite{foreign} in order to highlight abbreviations and vocabularies from foreign languages.
+% Add the missing |\vs| command.
+% \begin{macrocode}
+\ifnum\pdf@strcmp{\hep@lang}{american}=0
+ \newcommand{\hep@lang@foreign}{USenglish}
+\else
+ \ifnum\pdf@strcmp{\hep@lang}{USenglish}=0
+ \newcommand{\hep@lang@foreign}{USenglish}
+ \else
+ \newcommand{\hep@lang@foreign}{british}
+ \fi
+\fi
+\RequirePackage[all, \hep@lang@foreign]{foreign}
+\DeclareRobustCommand\vs{\xperiodafter{{\foreignabbrfont{vs}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% The \software{foreign} package relies on the \software{xspace} package \cite{xspace}.
+% Ensure that |\xspace| is compatible with the |\enquote| macro from the \software{csquote} package.
+% \begin{macrocode}
+\xspaceaddexceptions{\csq@qclose@i}
+% \end{macrocode}
+%
+%\begin{macro}{\no}
+% Define the macro |\no|\marg{number} for the use of \textnumero\ with appropriate spacing.
+% \begin{macrocode}
+\newcommand{\no}[1]{\textnumero~#1}
+% \end{macrocode}
+% \end{macro}
+%
+%\begin{macro}{\software}
+% Define a macro for software with optional version information |\software|\linebreak[1]\oarg{version}\linebreak[1]\marg{name}, using the \software{relsize} package \cite{relsize}.
+% \begin{macrocode}
+\RequirePackage{relsize}
+\newcommand{\software}[2][\hspace{-\fontdimen2\font}]{%
+ {\smaller[.5]\textsc{#2}~#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\online}
+% \begin{macro}{\email}
+% Define the |\online|\marg{text}\marg{url} macro combining the features of the |\href| and the |\url| macros.
+% Define a macro for typesetting emails.
+% \begin{macrocode}
+\newcommand{\online}[2]{\href{#1}{\nolinkurl{#2}}}
+\providecommand{\email}[1]{\online{mailto:#1}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\prefix}
+% Define the |\prefix|\marg{prefix}\marg{word} macro ensuring the correct linebreak in \prefix{prefix}{word}.
+% \begin{macrocode}
+\newcommand{\prefix}[2]{(#1\mbox{-)}\allowbreak #2}
+% \end{macrocode}
+% \end{macro}
+
+% \subsection{Lists}
+%
+% Load the \software{enumitem} package \cite{enumitem}.
+% \begin{macrocode}
+\RequirePackage[inline]{enumitem}
+% \end{macrocode}
+%
+% \begin{environment}{inlinelist}
+% Define an inline list environment.
+% \begin{macrocode}
+\newlist{inlinelist}{enumerate*}{1}
+\setlist*[inlinelist,1]{%
+ label=\roman*), itemjoin={,\ }, itemjoin*={, and\ }, after=.%
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{enumdescript}
+% Define an enumdescript list environment.
+% \begin{macrocode}
+\newlist{enum@descript}{enumerate}{2}
+\setlist[enum@descript]{label=\arabic*.}
+\newenvironment{enumdescript}[1][]{
+\begin{enum@descript}[#1]
+ \let\hep@item\item
+ \renewcommand{\item}[2][]{
+ \ifx&##1&\hep@item\else\hep@item[##1]\fi
+ \textbf{##2}\ifx##2\empty\else~\fi\@ifnextchar\par\@gobble\relax
+ }
+}{\end{enum@descript}}
+% \end{macrocode}
+% \end{environment}
+
+% \section{Geometry}
+%
+% Load the \software{geometry} package \cite{geometry} and adjust the text width and height.
+% This step must happen after readjusting the font size in \cref{sec:font size}.
+% \begin{macrocode}
+\ifhep@defaults\else
+ \RequirePackage{geometry}
+ \geometry{\hep@paper paper, includeheadfoot}
+ \if@twocolumn
+ \geometry{hscale=.85, vscale=.925, vmarginratio=1:1}
+ \geometry{headsep=2ex, footskip=6ex}
+ \setlength{\columnsep}{1.1em}
+ \else
+ \geometry{hscale=.75, vscale=.8, vmarginratio=3:4}
+ \fi
+\fi
+% \end{macrocode}
+%
+%\begin{macro}{\useparskip}
+%\begin{macro}{\useparindent}
+% Load the \software{parskip} package \cite{parskip} if requested and provide two commands switching between the two paragraph modes.
+% \begin{macrocode}
+\ifhep@parindent\else
+\RequirePackage{parskip}
+\newcommand{\useparskip}{%
+ \setlength{\parskip}{.5\baselineskip plus 2pt}%
+ \setlength{\parindent}{0pt}%
+}
+\newcommand{\useparindent}{%
+ \setlength{\parskip}{0pt}%
+ \setlength{\parindent}{15pt}%
+ \if@twocolumn\setlength\parindent{1em}
+ \else\setlength\parindent{1.5em}
+ \fi
+}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+
+% \section{Math}
+%
+% Load the \software{mathtools} package \cite{mathtools} which loads the \software{amsmath} package \cite{amsmath}.
+% Allow page breaks within equations if necessary.
+% \begin{macrocode}
+\RequirePackage{mathtools}
+\allowdisplaybreaks[1]
+% \end{macrocode}
+%
+% \begin{macro}{\diag}
+% \begin{macro}{\sgn}
+% Provide the |\diag| and |\sgn| operators
+% \begin{macrocode}
+\DeclareMathOperator{\diag}{diag}
+\DeclareMathOperator{\sgn}{sgn}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\mathdef}
+% Define the |\mathdef|\marg{name}\oarg{arguments}\marg{macro} macro which \prefix{re}{defines} macros in math mode only.
+% This macro is implemented using the \software{xparse} package \cite{xparse}.
+% \begin{macrocode}
+\RequirePackage{xparse}
+\DeclareDocumentCommand{\mathdef}{mO{0}m}{%
+ \expandafter\let\csname text\string#1\endcsname=#1
+ \expandafter\newcommand\csname math\string#1\endcsname[#2]{#3}
+ \DeclareRobustCommand#1{%
+ \ifmmode
+ \expandafter\let\expandafter\next\csname math\string#1\endcsname
+ \else
+ \expandafter\let\expandafter\next\csname text\string#1\endcsname
+ \fi
+ \next
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\i}
+% Provide an upright imaginary unit in math mode.
+% \begin{macrocode}
+\AtBeginDocument{\mathdef{\i}{\operatorname{i}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\overline}
+% Redefine |\overline| to be a text macro using the \software{ulem} package \cite{ulem}.
+% Extend it as a math macro with the original definition from the \software{amsmath} package \cite{amsmath}.
+% \begin{macrocode}
+\def\overline#1{{\renewcommand{\ULdepth}{-1.9ex}{}\uline{#1}}}
+\DeclareRobustCommand{\over@line}[1]{\@@overline{#1}}
+\mathdef{\overline}{\over@line}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\left}
+% \begin{macro}{\right}
+% Load the \software{mleftright} package \cite{mleftright} and adjust the spacing around |\left| and |\right|.
+% \begin{macrocode}
+\RequirePackage{mleftright}
+\mleftright
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{eqnarray}
+% Undefine the |eqnarray| environment if not prevented by package option.
+% \begin{macrocode}
+\ifhep@eqnarray\else
+ \let\eqnarray\@undefined
+ \let\endeqnarray\@undefined
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Math fonts}
+%
+% Define conditionals based on the |symbols| package option.
+% \begin{macrocode}
+\newif\ifhep@symbols
+\ifnum\pdf@strcmp{\hep@symbols}{false}=0\else\hep@symbolstrue\fi
+\newif\ifhep@ams
+\ifnum\pdf@strcmp{\hep@symbols}{ams}=0 \hep@amstrue\fi
+\newif\ifhep@minion
+\ifnum\pdf@strcmp{\hep@symbols}{minion}=0 \hep@miniontrue\fi
+% \end{macrocode}
+%
+% Load the \software{fixmath} \cite{fixmath} and \software{alphabeta} \cite{alphabeta} packages ensuring that upper Greek letters in math mode are italic and providing upright Greek letters in text mode, respectively.
+% Ensure that this works also after loading other fonts packages such as \software{cfr-lm} using \software{substitutefont} \cite{substitutefont}.
+% \begin{macrocode}
+\ifhep@symbols
+ \RequirePackage{fixmath}
+ \RequirePackage{alphabeta}
+ \RequirePackage{substitutefont}
+ \substitutefont{LGR}{\rmdefault}{lmr}
+ \DeclareFontFamily{LGR}{\rmdefault}{}
+ \DeclareFontShape{LGR}{\rmdefault}{b}{n}{<->ssub*lmr/bx/n}{}
+ \DeclareFontShape{LGR}{\rmdefault}{b}{sc}{<->ssub*lmr/bx/sc}{}
+ \substitutefont{LGR}{\ttdefault}{lmtt}
+ \DeclareFontFamily{LGR}{\ttdefault}{}
+ \DeclareFontShape{LGR}{\ttdefault}{b}{n}{<->ssub*cmtt/bx/n}{}
+ \substitutefont{LGR}{\sfdefault}{lmss}
+ \DeclareFontFamily{LGR}{\sfdefault}{}
+ \DeclareFontShape{LGR}{\sfdefault}{b}{n}{<->ssub*lmss/bx/n}{}
+ \DeclareFontShape{LGR}{\sfdefault}{b}{sc}{<->ssub*lmss/bx/sc}{}
+% \end{macrocode}
+%
+% Either load the \software{MnSymbol} package \cite{MnSymbol} or the the \software{exscale} package in order to fix Latin Modern |lmex| fonts.
+% Additionally, load the \software{amssymb} package \cite{amsfonts} which provides further math symbols and also loads the \software{amsfonts} package \cite{amsfonts}.
+% \begin{macrocode}
+ \ifhep@minion
+ \RequirePackage{MnSymbol}
+ \else
+ \RequirePackage{exscale}
+ \RequirePackage{amssymb}
+ \fi
+\fi
+% \end{macrocode}
+%
+% \begin{macro}{\mathsf}
+% If the |sansserif| package option is active use the \software{cmbright} font \cite{cmbright} and code adjusted from the \software{sansmathfonts} package \cite{sansmathfonts}.
+% Ensure that |\mathsf| is italic as well as sans serif and sans for sans and sans serif documents, respectively.
+% \begin{macrocode}
+\ifhep@serif
+ \newcommand\hep@font@sf{cmbrm}
+ \DeclareMathAlphabet{\mathsf}{OML}{\hep@font@sf}{m}{it}
+ \SetMathAlphabet{\mathsf}{bold}{OML}{\hep@font@sf}{b}{it}
+\else
+ \newcommand\hep@font@sf{lmr}
+ \newcommand\hep@font@text{lmss}
+ \newcommand\hep@font@math{cmbrm}
+ \newcommand\hep@font@symbol{cmsssy}
+ \newcommand\hep@font@extra{cmssex}
+ \newcommand\hep@font@amsa{ssmsa}
+ \newcommand\hep@font@amsb{ssmsb}
+% \end{macrocode}
+% Declare font substitutions.
+% \begin{macrocode}
+ \DeclareFontSubstitution{OML}{\hep@font@math}{m}{it}
+ \ifhep@symbols\ifhep@minion\else
+ \DeclareFontSubstitution{OMS}{\hep@font@symbol}{m}{n}
+ \DeclareFontSubstitution{OMX}{\hep@font@extra}{m}{n}
+ \fi\fi
+% \end{macrocode}
+% Declare the symbol fonts.
+% \begin{macrocode}
+ \DeclareSymbolFont{operators}{OT1}{\hep@font@text}{m}{n}
+ \DeclareSymbolFont{letters}{OML}{\hep@font@math}{m}{it}
+ \ifhep@symbols\ifhep@minion\else
+ \DeclareSymbolFont{symbols}{OMS}{\hep@font@symbol}{m}{n}
+ \DeclareSymbolFont{largesymbols}{OMX}{\hep@font@extra}{m}{n}
+ \fi\fi
+% \end{macrocode}
+% Set bold symbol fonts.
+% \begin{macrocode}
+ \SetSymbolFont{operators}{bold}{OT1}{\hep@font@text}{b}{n}
+ \SetSymbolFont{letters}{bold}{OML}{\hep@font@math}{b}{it}
+ \ifhep@symbols\ifhep@minion\else
+ \SetSymbolFont{symbols}{bold}{OMS}{\hep@font@symbol}{b}{n}
+ \fi\fi
+% \end{macrocode}
+% Adjust the fonts loaded by the \software{amsfonts} \cite{amsfonts} and \software{esint} \cite{esint} packages.
+% \begin{macrocode}
+ \ifhep@symbols\ifhep@minion\else
+ \DeclareSymbolFont{AMSa}{U}{\hep@font@amsa}{m}{n}
+ \DeclareSymbolFont{AMSb}{U}{\hep@font@amsb}{m}{n}
+ \fi\fi
+ \AtBeginDocument{%
+ \@ifpackageloaded{esint}{%
+ \DeclareSymbolFont{largesymbolsA}{U}{ssesint}{m}{n}
+ }{}
+ }
+% \end{macrocode}
+% Declare the symbol font alphabets.
+% \begin{macrocode}
+ \DeclareSymbolFontAlphabet{\mathrm}{operators}
+ \DeclareSymbolFontAlphabet{\mathnormal}{letters}
+ \ifhep@minion\else
+ \DeclareSymbolFontAlphabet{\mathcal}{symbols}
+ \fi
+% \end{macrocode}
+% Declare |\mathit|.
+% \begin{macrocode}
+ \DeclareMathAlphabet{\mathit}{OML}{\hep@font@text}{m}{it}
+ \SetMathAlphabet\mathit{bold}{OML}{\hep@font@text}{bx}{it}
+% \end{macrocode}
+% Declare |\mathtt|.
+% \begin{macrocode}
+ \DeclareMathAlphabet{\mathtt}{OT1}{cmtl}{m}{n}
+% \end{macrocode}
+% \begin{macrocode}
+% \end{macrocode}
+% Declare |\mathsf|.
+% \begin{macrocode}
+ \DeclareMathAlphabet{\mathsf}{OML}{\hep@font@sf}{m}{it}
+ \SetMathAlphabet{\mathsf}{bold}{OML}{\hep@font@sf}{bx}{it}
+% \end{macrocode}
+% \end{macro}
+% End of |sansserif|.
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+%
+% \begin{macro}{\mathbf}
+% Load the \software{bm} package \cite{bm} for superior boldmath.
+% Make math symbols bold whenever they appear in bold macros such as |\section|\marg{text}.
+% \begin{macrocode}
+\ifhep@symbols
+ \RequirePackage{bm}
+ \AtBeginDocument{\let\mathbf\bm}
+ \g@addto@macro\bfseries{\boldmath}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mathscr}
+% Provid the |\mathscr| math script font from the \software{mathrsfs} package \cite{mathrsfs}.
+% \begin{macrocode}
+ \DeclareMathAlphabet{\mathscr}{U}{rsfs}{m}{n}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\mathbb}
+% Redefine the the |\mathbb| math blackboard style font according to the \prefix{sans}{serif} option with the font from the \software{dsfont} package \cite{dsfont}.
+% \begin{macrocode}
+ \ifhep@minion
+ \DeclareMathAlphabet{\mathbb}{U}{%
+ \ifhep@serif dsrom\else dsss\fi%
+ }{m}{n}
+ \else
+ \ifhep@ams\else
+ \SetMathAlphabet{\mathbb}{normal}{U}{%
+ \ifhep@serif dsrom\else dsss\fi%
+ }{m}{n}
+ \fi
+ \fi
+\fi
+% \end{macrocode}
+% \end{macro}
+
+% \subsection{Physics notation}
+%
+% \begin{macro}{\cancel}
+% \begin{macro}{\slashed}
+% \begin{macro}{\unit}
+% Load the \software{physics} package \cite{physics} which provides macros useful for publications in physics.
+% Additionally, load the \software{cancel} \cite{cancel} and \software{slashed} \cite{slashed} packages which provide the |\cancel| and |\slashed| macros.
+% Finally, load the \software{units} package \cite{units} which provides the |\units| and |\nicefrac| macros.
+% \begin{macrocode}
+\ifhep@physics
+\RequirePackage{physics}
+\RequirePackage{cancel}
+\RequirePackage{slashed}
+\RequirePackage{units}
+\newcommand{\textfrac}[2]{\ensuremath{\nicefrac{\text{#1}}{\text{#2}}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\inv}
+% Provide a macro for the inverse, useful in combination with the unit macro in text mode.
+% \begin{macrocode}
+\newcommand{\inv}[2][1]{#2\ensuremath{^{-#1}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\d}
+% Provide a differential |\d|.
+% \begin{macrocode}
+\AtBeginDocument{\mathdef{\d}{\dd}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\oset}
+% Define a new overset macro |\oset|\oarg{offset}\marg{over}\marg{base}
+% \begin{macrocode}
+\newcommand{\oset}[3][-1pt]{%
+ \text{\raisebox{.2ex}{$\mathop{#3}\limits^{%
+ \vbox to#1{\kern-2\ex@\hbox{$\scriptscriptstyle#2$}\vss}%
+ }$}}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\overleftright}
+% Define a over left right arrow |\overleftright|\marg{base}.
+% \begin{macrocode}
+\newcommand{\overleftright}[1]{\oset{\leftrightarrow}{#1}}
+% \end{macrocode}
+% End of |physics| conditional.
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+% \end{macro}
+
+% \section{Floats}
+%
+% Adjust the \hologo{LaTeX} float placement defaults
+% \begin{macrocode}
+\setcounter{bottomnumber}{0} % 1
+\setcounter{topnumber}{1} % 2
+\setcounter{dbltopnumber}{1} % 2
+\renewcommand{\topfraction}{.9} % .7
+\renewcommand{\dbltopfraction}{.9} % .7
+\renewcommand{\textfraction}{.1} % .2
+\renewcommand{\floatpagefraction}{.8} % .5
+% \end{macrocode}
+%
+% \begin{environment}{figure}
+% \begin{environment}{table}
+% Center the content of |figure| and |table| environments.
+% Ignore the manual placement if the |manualplacement| option is set to false.
+% \begin{macrocode}
+\let\@figure@\figure%
+\let\@end@figure@\endfigure%
+\let\@table@\table%
+\let\@end@table@\endtable%
+\ifhep@manualplacement%
+ \renewenvironment{figure}[1][tbp]{%
+ \@figure@[#1]\centering%
+ }{\@end@figure@}%
+ \renewenvironment{table}[1][tbp]{%
+ \@table@[#1]\centering%
+ }{\@end@table@}%
+\else%
+ \renewenvironment{figure}[1][]{%
+ \@figure@\centering%
+ }{\@end@figure@}%
+ \renewenvironment{table}[1][]{%
+ \@table@\centering%
+ }{\@end@table@}
+\fi%
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+
+% \subsection{Sub-floats}
+%
+% \begin{macro}{\ifhep@journal}
+% Define a new journal conditional.
+% \begin{macrocode}
+\newif\ifhep@journal
+\ifhep@sissa\hep@journaltrue
+\else
+ \ifhep@revtex\hep@journaltrue
+ \else
+ \ifhep@pos\hep@journaltrue
+ \else
+ \ifhep@springer\hep@journaltrue
+ \else\hep@journalfalse
+ \fi
+ \fi
+ \fi
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% Prevent the \software{caption} package \cite{caption} from complaining about the journal classes and packages.
+% \begin{macrocode}
+\ifhep@journal
+ \setlength\abovecaptionskip{\f@size\p@}
+ \setlength\belowcaptionskip{0\p@}
+ \long\def\@makecaption#1#2{%
+ \vskip\abovecaptionskip
+ \sbox\@tempboxa{#1: #2}%
+ \ifdim \wd\@tempboxa >\hsize
+ #1: #2\par
+ \else
+ \global \@minipagefalse
+ \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi
+ \vskip\belowcaptionskip%
+ }
+\fi
+% \end{macrocode}
+%
+% Load the \software{subcaption} package \cite{subcaption}.
+% Provide the old |\subcaption@minipage| macro.
+% \begin{macrocode}
+\RequirePackage[subrefformat=parens]{subcaption}
+\captionsetup{font=small}
+\captionsetup[sub]{font=small}
+\providecommand*\subcaption@minipage[2]{%
+ \minipage#1{#2}\setcaptionsubtype\relax%
+}
+% \end{macrocode}
+% \begin{environment}{panels}
+% \begin{macro}{\panel}
+% Define the |panels| environment and the |\panel| macro.
+% \begin{macrocode}
+\newenvironment{panels}[2][b]{%
+% \end{macrocode}
+% Define an internal macro for global behaviour.
+% \begin{macrocode}
+ \newcommand{\begin@subcaption@minipage}[2][b]{%
+ \caption@withoptargs\subcaption@minipage[##1]{##2}%
+ \centering\vskip 0pt%
+ }
+% \end{macrocode}
+% Define the |\panel| macro for the case that the number of panels is given.
+% \begin{macrocode}
+ \ifdim#2pt>1pt%
+ \newcommand{\panel}[1][b]{%
+ \endminipage\hfill\begin@subcaption@minipage[#1]{\linewidth/#2}%
+ }%
+ \begin@subcaption@minipage[#1]{\linewidth/#2}%
+% \end{macrocode}
+% Define the |\panel| macro for the case that the width of the panel is given.
+% \begin{macrocode}
+ \else%
+ \newcommand{\panel}[2][b]{%
+ \endminipage\hfill\begin@subcaption@minipage[#1]{##2\linewidth}%
+ }%
+ \begin@subcaption@minipage[#1]{#2\linewidth}%
+ \fi%
+}{\endminipage}
+% \end{macrocode}
+% \end{macro}
+% \end{environment}
+%
+% Reajust the captions to the revtex class using the \software{ragged2e} package \cite{ragged2e}.
+% \begin{macrocode}
+\ifhep@revtex
+ \RequirePackage{ragged2e}
+ \DeclareCaptionFormat{revtex}{#1#2\justifying{#3}}
+ \captionsetup{font=small, format=revtex}
+ \captionsetup[sub]{font=footnotesize, format=plain}
+ \renewcommand{\figurename}{Figure}
+ \renewcommand{\tablename}{Table}
+\fi
+% \end{macrocode}
+
+% \subsection{Tables}
+%
+% \begin{environment}{tabular}
+% Enhance tabulars with the \software{booktabs} and \software{multirow} packages \cite{booktabs, multirow}.
+% \begin{macrocode}
+\RequirePackage{booktabs}
+\RequirePackage{multirow}
+% \end{macrocode}
+% \end{environment}
+
+% \subsection{Figures}
+%
+% \begin{macro}{\graphic}
+% Provide the |\graphic| macro for the inclusion of figures using the \software{graphicx} package \cite{graphicx}.
+% \begin{macrocode}
+\RequirePackage{graphicx}
+\providecommand{\tikzsetnextfilename}[1]{}
+\newcommand{\graphic}[2][1]{\tikzsetnextfilename{#2}{%
+ \centering\includegraphics[width=#1\linewidth]{#2}\par%
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\graphics}
+% Provide the |\graphics| macro for the inclusion of figures located in a subfolder.
+% \begin{macrocode}
+\newcommand{\graphics}[1]{\graphicspath{{./#1/}}}
+% \end{macrocode}
+% \end{macro}
+
+% \section{Title page}
+%
+% Begin of |title| conditional.
+% \begin{macrocode}
+\ifhep@title
+% \end{macrocode}
+%
+% \begin{macro}{\date}
+% Allow absent date field.
+% \begin{macrocode}
+\date{}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Titles}
+%
+% Extend the title using the \software{titling} package \cite{titling}.
+% \begin{macrocode}
+\RequirePackage{titling}
+% \end{macrocode}
+%
+% \begin{macro}{\preprintfont}
+% \begin{macro}{\titlefont}
+% \begin{macro}{\subtitlefont}
+% \begin{macro}{\authorfont}
+% \begin{macro}{\affiliationfont}
+% \begin{macro}{\datefont}
+% Allow to change the fontface of the individual parts of the title.
+% \begin{macrocode}
+\let\hep@preprint@font\relax
+\newcommand{\preprintfont}[1]{\def\hep@preprint@font{#1}}
+\let\hep@title@font\relax
+\newcommand{\titlefont}[1]{\def\hep@title@font{#1}}
+\let\hep@subtitle@font\relax
+\newcommand{\subtitlefont}[1]{\def\hep@subtitle@font{#1}}
+\let\hep@author@font\relax
+\newcommand{\authorfont}[1]{\def\hep@author@font{#1}}
+\let\hep@affiliation@font\relax
+\newcommand{\affiliationfont}[1]{\def\hep@affiliation@font{#1}}
+\let\hep@date@font\relax
+\newcommand{\datefont}[1]{\def\hep@date@font{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\subtitle}
+% Define a subtitle.
+% \begin{macrocode}
+\newcommand{\presubtitle}[1]{\def\hep@pre@sub@title{#1}}
+\newcommand{\subtitle}[1]{\def\sub@title{#1}}
+\newcommand{\postsubtitle}[1]{\def\hep@post@sub@title{#1}}
+\renewcommand{\maketitlehookb}{%
+ \@ifundefined{sub@title}{}{%
+ \hep@pre@sub@title\sub@title\hep@post@sub@title%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Set standard values mostly taken from the \software{titling} package, add the font hook, and reduce the |date| font size.
+% \begin{macrocode}
+\titlefont{\ifhep@serif\tistyle\else\qtstyle\fi}
+\pretitle{\begin{center}\LARGE\hep@title@font}
+\posttitle{\par\end{center}}
+\subtitlefont{\ifhep@serif\tistyle\else\qtstyle\fi}
+\presubtitle{\begin{center}\Large\hep@subtitle@font}
+\postsubtitle{\par\end{center}}
+\preauthor{%
+ \begin{center}\large\hep@author@font\lineskip.5em\begin{tabular}[t]{c}%
+}
+\postauthor{\end{tabular}\par\end{center}}
+\predate{\begin{center}\hep@date@font}
+\postdate{\par\end{center}}
+% \end{macrocode}
+%
+% \subsection{Authors}
+%
+% \begin{macro}{\author}
+% Allow absent author field.
+% Enable the handling of multiple authors with different affiliations using the \software{authblk} package \cite{authblk}.
+% \begin{macrocode}
+\author{}
+\RequirePackage{authblk}
+\renewcommand{\Affilfont}{\small\hep@affiliation@font}
+\renewcommand\Authfont{\hep@author@font}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\email}
+% Redefine the email macro to place the email address in a footnote if called from within the |\author| macro |\author{|$\langle name\rangle$ |\email{|$\langle email\rangle$|}}|.
+% \begin{macrocode}
+\let\hep@author\author
+\def\author{%
+ \renewcommand{\email}[1]{\unskip\thanks{\online{mailto:##1}{##1}}}%
+ \hep@author
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\affiliation}
+% Define the |\affiliation| macro, ensure that linebreaks happen after a comma.
+% \begin{macrocode}
+\newcommand\hep@penalty{\if@twocolumn85\else50\fi}
+\newcommand\hep@active@comma{,\penalty-\hep@penalty\relax}
+\newcommand\hep@cat@comma@active{\catcode`\,\active}
+{\hep@cat@comma@active\gdef,{\hep@active@comma}}
+\newcommand\hep@affil[1]{%
+ \endgroup\@flushglue=0pt plus .5\linewidth\affil{#1}%
+}
+\def\hep@affil@opt[#1]#2{%
+ \endgroup\@flushglue=0pt plus .5\linewidth\affil[#1]{#2}%
+}
+\DeclareRobustCommand\hep@affiliation{%
+ \@ifnextchar[{\hep@affil@opt}{\hep@affil}%
+}
+\newcommand{\affiliation}{%
+ \begingroup\hep@cat@comma@active\hep@affiliation%
+}
+% \end{macrocode}
+% \end{macro}
+
+% \subsection{Preprint}
+%
+% \begin{macro}{\preprint}
+% Define the |\preprint| macro using the \software{varwidth} package \cite{varwidth}.
+% \begin{macrocode}
+\let\hep@preprint\relax
+\newcommand\preprint[1]{\def\hep@preprint{#1}}
+\RequirePackage{varwidth}
+\newcommand{\hep@preprint@box}{%
+ \begin{varwidth}{\textwidth}%
+ \smaller[.5]\hep@preprint@font\hep@preprint%
+ \end{varwidth}%
+}
+\preprintfont{\scshape}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\placepreprint}
+% Places a preprint number in the top right corner of the title page using the \software{atbegshi} \cite{atbegshi} and \software{picture} \cite{picture} packages.
+% \begin{macrocode}
+\RequirePackage{atbegshi}
+\RequirePackage{picture}
+\newcommand{\placepreprint}{%
+ \AtBeginShipoutFirst{%
+ \put(
+ \textwidth+\oddsidemargin-\widthof{\hep@preprint@box},
+ -2pt-\topmargin-\heightof{\hep@preprint@box}
+ ){\normalfont\hep@preprint@box}
+ }
+}
+\renewcommand{\maketitlehooka}{\placepreprint\vspace{-\bigskipamount}}
+% \end{macrocode}
+% \end{macro}
+
+% \subsection{Abstract}
+%
+% \begin{environment}{abstract}
+% Adjust the |abstract| environment to not start with indentation.
+% \begin{macrocode}
+\@ifundefined{abstract}{}{%
+ \let\hep@abstract\abstract%
+ \renewcommand\abstract{\hep@abstract\noindent\ignorespaces}%
+}
+% \end{macrocode}
+% \end{environment}
+% \begin{environment}{abstract*}
+% Add a |abstract*| environment for two column mode taking also care of placing the title using the \software{environ} \cite{environ} and \software{abstract} \cite{abstract} packages.
+% \begin{macrocode}
+\if@twocolumn
+ \RequirePackage{environ}
+ \RequirePackage{abstract}
+ \renewcommand{\abstitleskip}{-3ex}
+ \NewEnviron{abstract*}{%
+ \twocolumn[\maketitle\vspace{-1.5cm}%
+ \begin{onecolabstract}\noindent\BODY\end{onecolabstract}%
+ \vspace{.5cm}]\saythanks%
+ }
+\else
+ \newenvironment{abstract*}{\maketitle\begin{abstract}}{\end{abstract}}
+\fi
+% \end{macrocode}
+% \end{environment}
+% End of |title| conditional.
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+
+% \section{Bibliography}
+%
+% Check if bibliography management is requested.
+% \begin{macrocode}
+\ifnum\pdf@strcmp{\hep@bibliography}{false}=0\else
+% \end{macrocode}
+%
+% \begin{macro}{\bibliography}
+% Load the \software{biblatex} package \cite{biblatex} with the datamodel defined in \cref{sec:data model}.
+% \begin{macrocode}
+\RequirePackage[style=\hep@bibliography, datamodel=hep-paper]{biblatex}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{hep-paper}
+% Provide the |\DeclareSortingTemplate| macro for older |biblatex| installations.
+% Define a new sorting template that sorts only multi key |\cite| entries according to their date and leaves the rest of the bibliography entries in the order they appear in the text.
+% \begin{macrocode}
+\providecommand{\DeclareSortingTemplate}{\DeclareSortingScheme}
+\DeclareSortingTemplate{hep-paper}{
+ \sort{\citeorder}
+ \sort[final]{\field{sortkey}}
+ \sort{\field{sortyear} \field{year} \literal{9999}}
+ \sort{\field{month}}
+ \sort{\field{eprint} \field{doi}}
+ \sort{\field{sorttitle} \field{title}}
+ \sort{\field{subtitle} \field{volume}}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Use the new sorting scheme and abbreviat all first names.
+% \begin{macrocode}
+\ExecuteBibliographyOptions{
+ sorting=hep-paper,
+ safeinputenc,
+ giveninits=true
+}
+% \end{macrocode}
+%
+%
+% Shrink the biblography in two column mode.
+% \begin{macrocode}
+\ifhep@journal\else
+ \if@twocolumn
+ \AtBeginBibliography{\small}
+ \setlength\biblabelsep{\labelsep}
+ \fi
+\fi
+% \end{macrocode}
+%
+% \begin{macro}{erratum}
+% Add new bibliography string \enquote{Erratum} for the use in the |relatedtype| field.
+% \begin{macrocode}
+\NewBibliographyString{erratum,erratums}
+\DefineBibliographyStrings{english}{erratum={Erratum},erratums={Errata}}
+\providecommand{\relateddelimerratum}{\addsemicolon\space}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\printbibliography}
+% Allow the bibliography to be printed sloppy
+% \begin{macrocode}
+\let\hep@printbibliography\printbibliography
+\renewcommand{\printbibliography}{\sloppy\hep@printbibliography}
+% \end{macrocode}
+% \end{macro}
+
+% \subsection{Sourcemap}
+%
+% \begin{macro}{\reg@exp@one}
+% \begin{macro}{\reg@exp@two}
+% \begin{macro}{\reg@exp@url}
+% \begin{macro}{\reg@exp@pmc}
+% Define regular expressions in order to deal with inconsistent journal title and volume naming as well as \URL protocols and the PMCID.
+% \begin{macrocode}
+\newcommand{\reg@exp@one}{\regexp{\A(\p{L}+)?\d+(\p{L}+)?\Z}}
+\newcommand{\reg@exp@two}{\regexp{\A(\p{L}+)?(\d+)(\p{L}+)?\Z}}
+\newcommand{\reg@exp@url}{\regexp{\A(ht|f)tp(s)?:\/\/}}
+\newcommand{\reg@exp@pmc}{\regexp{\A(PMC)?}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\DeclareSourcemap}
+% Use the |\DeclareSourcemap| feature.
+% \begin{macrocode}
+\DeclareSourcemap{%
+ \maps[datatype=bibtex, overwrite=true]{%
+% \end{macrocode}
+% \begin{macro}{collaboration}
+% Read the collaboration information if present.
+% \begin{macrocode}
+ \map{%
+ \step[fieldsource=Collaboration, final=true]%
+ \step[fieldset=collaboration, origfieldval, final=true]
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{reportnumber}
+% Read the pre-print information if present.
+% \begin{macrocode}
+ \map{%
+ \step[fieldsource=reportNumber, final=true]%
+ \step[fieldset=reportnumber, origfieldval, final=true]
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{journal}
+% Move letters from the volume field to the journal field.
+% \begin{macrocode}
+ \map[overwrite]{
+ \step[fieldsource=volume, match=\reg@exp@one, final]
+ \step[fieldsource=volume, match=\reg@exp@two, replace={$2}]
+ \step[fieldsource=journal, fieldtarget=journaltitle]
+ \step[fieldset=journaltitle, fieldvalue={\space$1$2}, append=true]
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{url}
+% Remove the protocol from \URL.
+% \begin{macrocode}
+ \map{
+ \step[fieldsource=url, final=true]
+ \step[fieldset=protocollessurl, origfieldval, final=true]
+ \step[fieldsource=protocollessurl, match=\reg@exp@url, replace={}]
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{pmc}
+% Remove the PMC from the PMCID.
+% \begin{macrocode}
+ \map{
+ \step[fieldsource=pmcid, final=true]
+ \step[fieldset=pmc, origfieldval, final=true]
+ \step[fieldsource=pmc, match=\reg@exp@pmc, replace={}]
+ }
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\letbibmacro}
+% Provide the |\letbibmacro| macro for old |biblatex| installations.
+% \begin{macrocode}
+\providecommand{\letbibmacro}[2]{\csletcs{abx@macro@#1}{abx@macro@#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{collaboration}
+% Execute the author macro even if only the collaboration information if present and override the author information with collaboration information if present.
+% \begin{macrocode}
+\renewbibmacro*{author/translator+others}{%
+ \ifboolexpr{
+ test \ifuseauthor and (
+ not test {\ifnameundef{author}} or
+ not test {\iffieldundef{collaboration}}
+ )
+ }
+ {\usebibmacro{author}}
+ {\usebibmacro{translator+others}}
+}
+\letbibmacro{hep@bib@author}{author}
+\renewbibmacro*{author}{%
+ \iffieldundef{collaboration}{%
+ \usebibmacro{hep@bib@author}}{\textit{\printfield{collaboration}}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{In:}
+% Remove spurious \enquote{In:} if no journal is present.
+% \begin{macrocode}
+\renewbibmacro*{in:}{%
+ \iffieldundef{journaltitle}{}{\printtext{\bibstring{in}\intitlepunct}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{url}
+% Show \URLs without the protocol.
+% \begin{macrocode}
+\DeclareFieldFormat{url}{%
+ \mkbibacro{URL}\addcolon\space\online{#1}{\thefield{protocollessurl}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bib@online}
+% Private |\bib@online| macro
+% \begin{macrocode}
+\newcommand{\bib@online}[2]{%
+ \ifhyperref{\online{#1}{#2}}{\nolinkurl{#2}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{pmid}
+% \begin{macro}{pmcid}
+% Present PubMed IDs.
+% \begin{macrocode}
+\DeclareFieldFormat{pmid}{%
+ \mkbibacro{PM}\addcolon\space%
+ \bib@online{https://www.ncbi.nlm.nih.gov/pubmed/#1}{#1}%
+}
+\DeclareFieldFormat{pmc}{%
+ \mkbibacro{PMC}\addcolon\space%
+ \bib@online{https://www.ncbi.nlm.nih.gov/pmc/articles/PMC#1}{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{pmcid}
+% \begin{macro}{pmid}
+% \begin{macro}{reportnumber}
+% Add the pre-print and PubMed information if present.
+% \begin{macrocode}
+\letbibmacro{hep-doi+eprint+url}{doi+eprint+url}
+\renewbibmacro*{doi+eprint+url}{%
+ \usebibmacro{hep-doi+eprint+url}
+ \iffieldundef{pmc}{%
+ \iffieldundef{pmid}{}{\printfield{pmid}\newunit}%
+ }{\printfield{pmc}\newunit}
+ \iffieldundef{reportnumber}{}{%
+ \newunitpunct\textnumero\intitlepunct%
+ \textsc{\smaller[.5]\printfield{reportnumber}}%
+ \newunit%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+
+% \subsection{Eprints}
+%
+% \begin{macro}{\new@eprint}
+% Private |\new@eprint| macro
+% \begin{macrocode}
+\NewDocumentCommand{\new@eprint}{smm}{
+ \DeclareFieldFormat{eprint:#2}{%
+ \newcommand{\@path}{\IfBooleanT{#1}{\thefield{eprintclass}/}##1}%
+ #2\addcolon\space\bib@online{#3/\@path}{\@path}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{CTAN}
+% Add CTAN as a eprint option
+% \begin{macrocode}
+\new@eprint{CTAN}{https://ctan.org/pkg}
+\DeclareFieldAlias{eprint:ctan}{eprint:CTAN}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{GitHub}
+% Add GitHub as a eprint option
+% \begin{macrocode}
+\new@eprint*{GitHub}{https://github.com}
+\DeclareFieldAlias{eprint:github}{eprint:GitHub}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{GitLab}
+% Add GitLab as a eprint option
+% \begin{macrocode}
+\new@eprint*{GitLab}{https://gitlab.com}
+\DeclareFieldAlias{eprint:gitlab}{eprint:GitLab}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{Bitbucket}
+% Add Bitbucket as a eprint option
+% \begin{macrocode}
+\new@eprint*{Bitbucket}{https://bitbucket.org}
+\DeclareFieldAlias{eprint:bitbucket}{eprint:Bitbucket}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{Launchpad}
+% Add Launchpad as a eprint option
+% \begin{macrocode}
+\new@eprint{Launchpad}{https://launchpad.net}
+\DeclareFieldAlias{eprint:launchpad}{eprint:Launchpad}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{SourceForge}
+% Add SourceForge as a eprint option
+% \begin{macrocode}
+\new@eprint{SourceForge}{https://sourceforge.net/projects}
+\DeclareFieldAlias{eprint:launchpad}{eprint:SourceForge}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{HEPForge}
+% Add HEPForge as a eprint option
+% \begin{macrocode}
+\DeclareFieldFormat{eprint:hepforge}{%
+ HEPForge\addcolon\space\bib@online{https://#1/hepforge.org}{#1}%
+}
+\DeclareFieldAlias{eprint:HEPForge}{eprint:hepforge}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% End check for bibliography option.
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+
+% \section{Hyperlinks, Footnotes and References} \label{sec:hyperlinks}
+%
+% Load the \software{hyperref} package \cite{hyperref} enable Unicode encoding and hide links.
+%
+% \begin{macrocode}
+\RequirePackage{hyperref}
+\hypersetup{
+ pdfencoding=auto, psdextra,
+ hidelinks, linktoc=all, breaklinks=true,
+ pdfcreator={}, pdfproducer={}
+}
+% \end{macrocode}
+% Set the \PDF meta data according to the paper information and ensure that unnecessary information is suppressed.
+%
+% \begin{macrocode}
+\pdfstringdefDisableCommands{\def\varepsilon{\textepsilon}}
+\AtBeginDocument{
+ \pdfstringdefDisableCommands{\let\ensuremath\@gobble}
+ \pdfstringdefDisableCommands{\let\mathsurround\@gobble}
+ \pdfstringdefDisableCommands{\let\unskip\@gobble}
+ \pdfstringdefDisableCommands{\let\thanks\@gobble}
+ \pdfstringdefDisableCommands{\let\footnote\@gobble}
+ \pdfstringdefDisableCommands{\let\\\@gobble}
+}
+\ifhep@revtex
+ \AtBeginShipout{\hypersetup{pdftitle={\@title}}}
+\else
+ \ifhep@beamer\else
+ \AtBeginDocument{\hypersetup{pdftitle={\@title}}}
+ \fi
+\fi
+\ifhep@title
+ \AtBeginDocument{\hypersetup{pdfauthor=\AB@authlist}}
+\else
+ \ifhep@beamer\else
+ \AtBeginDocument{\hypersetup{pdfauthor={\@author}}}
+ \fi
+\fi
+% \end{macrocode}
+
+% \subsection{Footnotes}
+%
+% Place a hyperlink from the footnote back to its referencing label using the \software{footnotebackref} package \cite{footnotebackref}.
+% \begin{macrocode}
+\def\BackrefFootnoteTag{}
+\RequirePackage{footnotebackref}
+% \end{macrocode}
+%
+% \begin{macro}{\footnote}
+% Ensure that no spaces appear before the footmark or at the beginning of the footnote.
+% \begin{macrocode}
+\let\@foot@note\footnote
+\renewcommand{\footnote}[1]{\unskip\@foot@note{\ignorespaces#1}}
+% \end{macrocode}
+% \end{macro}
+
+% \subsection{References}
+%
+% Begin of |references| conditional
+% \begin{macrocode}
+\ifhep@references
+% \end{macrocode}
+%
+% \begin{macro}{\cref}
+% Improve reference using the \software{cleveref} package \cite{cleveref}.
+%
+% \begin{macrocode}
+\RequirePackage[noabbrev, nameinlink]{cleveref}
+\newcommand{\creflastconjunction}{, and\nobreakspace}
+\crefname{enumi}{point}{points}
+\crefname{inlinelisti}{point}{points}
+% \end{macrocode}
+% \end{macro}
+%
+%\begin{macro}{\no@break@before}
+% Define a macro able to prevent line breaks.
+% \begin{macrocode}
+\newcommand\no@break@before{%
+ \relax\ifvmode\else%
+ \ifhmode%
+ \ifdim\lastskip > 0pt%
+ \relax\unskip\nobreakspace%
+ \fi%
+ \fi%
+ \fi%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ref}
+% Adjust |\ref|\marg{key} in order to prevent preceding line breaks.
+% \begin{macrocode}
+\let\hep@ref\ref
+\AtBeginDocument{\renewcommand\ref{\no@break@before\hep@ref}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\eqref}
+% Adjust |\eqref|\marg{key} in order to prevent preceding line breaks.
+% \begin{macrocode}
+\renewcommand\eqref{\no@break@before\labelcref}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\subref}
+% Adjust |\subref|\marg{key} in order to prevent preceding line breaks.
+% \begin{macrocode}
+\let\hep@subref\subref
+\renewcommand\subref{\no@break@before\hep@subref}
+\renewcommand*\subcaption@ref[2]{\begingroup%
+ \caption@setoptions{sub}%
+ \subcaption@reffmt\p@subref{\hep@ref#1{sub@#2}}%
+\endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\subcref}
+% Provide the |\subcref| macro.
+% \begin{macrocode}
+\newcommand{\subcref}[1]{\cref{sub@#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\eqcrefname}
+% Define the |\eqcrefname| macro for named equation types.
+% \begin{macrocode}
+\NewDocumentCommand{\eqcrefname}{mmo}{
+ \crefname{#1}{#2}{\IfValueTF{#3}{#3}{#2s}}
+ \creflabelformat{#1}{(##2##1##3)}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\labelcrefrange}
+% Define the missing |\labelcrefrange|\marg{key1}\marg{key2} macro.
+% \begin{macrocode}
+\DeclareRobustCommand{\labelcrefrange}[2]{%
+ \@crefrangenostar{labelcref}{#1}{#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% End of |references| conditional
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+
+% \subsection{Citations}
+%
+% \begin{macro}{\cite}
+% Adjust |\cite|\marg{key} in order to prevent preceding line breaks.
+% \begin{macrocode}
+\let\hep@cite\cite
+\renewcommand\cite{\no@break@before\hep@cite}
+% \end{macrocode}
+% \end{macro}
+%
+% Begin of bibliography if.
+% \begin{macrocode}
+\ifnum\pdf@strcmp{\hep@bibliography}{false}=0\else
+% \end{macrocode}
+% Define bibstrings for reference names.
+% \begin{macrocode}
+\NewBibliographyString{refname}
+\NewBibliographyString{refsname}
+\DefineBibliographyStrings{english}{%
+ refname = {reference},
+ refsname = {references}
+}
+% \end{macrocode}
+% \begin{macro}{\ccite}
+% \begin{macro}{\Ccite}
+% Define \emph{clever} citation macros.
+% \begin{macrocode}
+\DeclareCiteCommand{\ccite}{%
+ \ifnum\thecitetotal=1
+ \bibstring{refname}%
+ \else%
+ \bibstring{refsname}%
+ \fi%
+ \addnbspace\bibopenbracket%
+ \usebibmacro{cite:init}\usebibmacro{prenote}%
+}{\usebibmacro{citeindex}\usebibmacro{cite:comp}}{}{%
+ \usebibmacro{cite:dump}\usebibmacro{postnote}%
+ \bibclosebracket%
+}
+
+\newrobustcmd*{\Ccite}{\bibsentence\ccite}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% End of biblatex if.
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+
+% \section{Acronyms}
+%
+% Acronyms are implemented with the \software{glossaries-extra} package \cite{glossaries-extra} which is an extension of the \software{glossaries} package \cite{glossaries} and must be loaded after the \software{hyperref} pacakge in \cref{sec:hyperlinks}.
+% \begin{macrocode}
+\ifhep@glossaries
+\RequirePackage[nostyles]{glossaries-extra}
+% \end{macrocode}
+% The entry count feature is used.
+% \begin{macrocode}
+\glsenableentrycount
+\glssetcategoryattribute{abbreviation}{entrycount}{1}
+% \end{macrocode}
+% Provide macros for older |glossaries-extra| installations.
+% \begin{macrocode}
+\providecommand{\glsxtrusefield}[2]{\@gls@entry@field{#1}{#2}}
+\providecommand{\glsxtrsetfieldifexists}[3]{\glsdoifexists{#1}{#3}}
+\providecommand{\gGlsXtrSetField}[3]{%
+ \glsxtrsetfieldifexists{#1}{#2}{%
+ \csgdef{glo@\glsdetoklabel{#1}@#2}{#3}%
+ }%
+}
+% \end{macrocode}
+% Hyperlinks from the abbreviation to their definition in the text are set.
+% \begin{macrocode}
+\glssetcategoryattribute{abbreviation}{nohyperfirst}{true}
+\renewcommand*{\glsdonohyperlink}[2]{{%
+ \glsxtrprotectlinks\edef\fieldvalue{%
+ \glsxtrusefield{\glslabel}{hastarget}%
+ }%
+ \ifdefstring\fieldvalue{true}{#2}{%
+ \gGlsXtrSetField{\glslabel}{hastarget}{true}%
+ \glsdohypertarget{#1}{#2}%
+ }%
+}}
+% \end{macrocode}
+%
+% \begin{macro}{\begin@sentence}
+% Mark the beginning of a paragraph as if it would follow a full stop using the \software{everyhook} package \cite{everyhook}.
+% \begin{macrocode}
+\RequirePackage[excludeor]{everyhook}
+\newcommand{\begin@sentence}{1001}
+\PushPostHook{par}{{\spacefactor=\begin@sentence}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frenchspacing}
+% Adjust the |\frenchspacing| macro to be compatibel with this idea.
+% \begin{macrocode}
+\def\frenchspacing{%
+ \sfcode`\.\begin@sentence \sfcode`\?\begin@sentence
+ \sfcode`\!\begin@sentence \sfcode`\:\begin@sentence
+ \sfcode`\;\@m \sfcode`\,\@m
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if@begin@of@sentence}
+% Provide a macro checking for the beginning of a sentence by examining the length of the preceeding space.
+% \begin{macrocode}
+\newcommand{\if@begin@of@sentence}[2]{\leavevmode\protecting{%
+ \ifboolexpr{ test {\ifnumcomp{\spacefactor}{=}{3000}} or%
+ test {\ifnumcomp{\spacefactor}{=}{2000}} or%
+ test {\ifnumcomp{\spacefactor}{=}{\begin@sentence}}%
+ }{#1}{#2}%
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\acronym}
+% The |\acronym|\meta{*}\oarg{typeset abbreviation}\marg{abbreviation}\meta{*}\marg{definition}\oarg{plural\linebreak[4] definition} macro is defined.
+% \begin{enumerate}[nosep, label=\#\arabic*]
+% \item star for omitting the \enquote{s} in the short plural
+% \item optional typeset abbreviation
+% \item mandatory abbreviation
+% \item star for restoring the \hologo{TeX} default for space after text macros
+% \item mandatory long form
+% \item optional plural long form
+% \end{enumerate}
+% \begin{macrocode}
+\NewDocumentCommand{\acronym}{somsmo}{
+ \newabbreviation[
+ type=\acronymtype,
+ sort=#3,
+ \glsshortpluralkey=\IfBooleanTF{#1}{#3}{\IfNoValueTF{#2}{#3s}{#2s}},
+ longplural=\IfNoValueTF{#6}{#5s}{#6}
+ ]{#3}{\IfNoValueTF{#2}{#3}{#2}}{#5}
+% \end{macrocode}
+% Provide the singular acronym macro.
+% \begin{macrocode}
+ \expandafter\newcommand\csname#3\endcsname{%
+ \if@begin@of@sentence{%
+ \ifglsused{#3}{\cgls{#3}}{\cGls{#3}}%
+ }{\cgls{#3}}%
+ \ifnum\glsentrycurrcount{#3}>1\relax
+ \IfBooleanTF{#4}{}{\@\xspace}%
+ \else\@\xspace\fi
+ }
+% \end{macrocode}
+% Expand the singular acronym macro in \PDF labels.
+% \begin{macrocode}
+ \pdfstringdefDisableCommands{\expandafter\def\csname#3\endcsname{%
+ \IfNoValueTF{#2}{#3}{#2} }%
+ }
+% \end{macrocode}
+% Provide the singular acronym macro in math mode.
+% \begin{macrocode}
+ \expandafter\mathdef\csname#3\endcsname{%
+ \text{\glsxtrshort{#3}}\@gls@increment@currcount{#3}%
+ }
+% \end{macrocode}
+% Provide the plural acronym macro.
+% \begin{macrocode}
+ \expandafter\newcommand\csname#3s\endcsname{%
+ \if@begin@of@sentence{\cGlspl{#3}}{\cglspl{#3}}%
+ \IfBooleanTF{#4}{}{\@\xspace}%
+ }
+% \end{macrocode}
+% Expand the plural acronym macro in \PDF labels.
+% \begin{macrocode}
+ \pdfstringdefDisableCommands{\expandafter\def\csname#3s\endcsname{%
+ \IfBooleanTF{#1}{#3}{\IfNoValueTF{#2}{#3s}{#2s}} }%
+ }
+% \end{macrocode}
+% Provide the plural acronym macro in math mode.
+% \begin{macrocode}
+ \expandafter\mathdef\csname#3s\endcsname{%
+ \text{\glsxtrshortpl{#3}}\@gls@increment@currcount{#3}%
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\shortacronym}
+% The |\shortacronym| never expands into the long form.
+% \begin{macrocode}
+\NewDocumentCommand{\shortacronym}{somsmo}{
+% \end{macrocode}
+% Provide the singular acronym macro.
+% \begin{macrocode}
+ \expandafter\newcommand\csname#3\endcsname{%
+ \IfNoValueTF{#2}{#3}{#2}\IfBooleanTF{#4}{}{\@\xspace}%
+ }
+% \end{macrocode}
+% Expand the singular acronym macro in \PDF labels.
+% \begin{macrocode}
+ \pdfstringdefDisableCommands{\expandafter\def\csname#3\endcsname{%
+ \IfNoValueTF{#2}{#3}{#2} }%
+ }
+% \end{macrocode}
+% Provide the singular acronym macro in math mode.
+% \begin{macrocode}
+ \expandafter\mathdef\csname#3\endcsname{%
+ \text{\IfNoValueTF{#2}{#3}{#2}}%
+ }
+% \end{macrocode}
+% Provide the plural acronym macro.
+% \begin{macrocode}
+ \expandafter\newcommand\csname#3s\endcsname{%
+ \IfBooleanTF{#1}{#3}{\IfNoValueTF{#2}{#3s}{#2s}}%
+ \IfBooleanTF{#4}{}{\@\xspace}%
+ }
+% \end{macrocode}
+% Expand the plural acronym macro in \PDF labels.
+% \begin{macrocode}
+ \pdfstringdefDisableCommands{\expandafter\def\csname#3s\endcsname{%
+ \IfBooleanTF{#1}{#3}{\IfNoValueTF{#2}{#3s}{#2s}} }%
+ }
+% \end{macrocode}
+% Provide the plural acronym macro in math mode.
+% \begin{macrocode}
+ \expandafter\mathdef\csname#3s\endcsname{%
+ \text{\IfBooleanTF{#1}{#3}{\IfNoValueTF{#2}{#3s}{#2s}}}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\longacronym}
+% The |\longacronym| never shows the abbreviated form.
+% \begin{macrocode}
+\NewDocumentCommand{\longacronym}{somsmo}{
+% \end{macrocode}
+% Provide the singular acronym macro.
+% \begin{macrocode}
+ \expandafter\newcommand\csname#3\endcsname{%
+ \if@begin@of@sentence{\MakeUppercase#5}{#5}%
+ \IfBooleanTF{#4}{}{\@\xspace}%
+ }
+% \end{macrocode}
+% Expand the singular acronym macro in \PDF labels.
+% \begin{macrocode}
+ \pdfstringdefDisableCommands{\expandafter\def\csname#3\endcsname{#5 }}
+% \end{macrocode}
+% Provide the plural acronym macro.
+% \begin{macrocode}
+ \expandafter\newcommand\csname#3s\endcsname{%
+ \if@begin@of@sentence{%
+ \IfNoValueTF{#6}{\MakeUppercase#5s}{\MakeUppercase#6}%
+ }{%
+ \IfNoValueTF{#6}{#5s}{#6}}\IfBooleanTF{#4}{}{\@\xspace}%
+ }
+% \end{macrocode}
+% Expand the plural acronym macro in \PDF labels.
+% \begin{macrocode}
+ \pdfstringdefDisableCommands{\expandafter\def\csname#3s\endcsname{%
+ \IfNoValueTF{#6}{#5s}{#6} }%
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% Silence warning if no acronyms are defined.
+% \begin{macrocode}
+\renewcommand*{\@gls@write@entrycounts}{%
+ \immediate\write\@auxout{%
+ \string\providecommand*{\string\@gls@entry@count}[2]{}
+ }%
+ \count@=0\relax
+ \forallglsentries{\@glsentry}{%
+ \glshasattribute{\@glsentry}{entrycount}{%
+ \ifglsused{\@glsentry}{%
+ \immediate\write\@auxout{%
+ \string\@gls@entry@count{\@glsentry}{%
+ \glsentrycurrcount{\@glsentry}%
+ }
+ }%
+ }{}\advance\count@ by \@ne
+ }{}%
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\resetacronym}
+% \begin{macro}{\dummyacronym}
+% Add two macros for acronym management.
+% \begin{macrocode}
+\newcommand{\resetacronym}[1]{\protect\glsreset{#1}}
+\newcommand{\dummyacronym}[1]{\protect\glsunset{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{abstract}
+% Adjust the |abstract| environment to reset all acronym counters.
+% \begin{macrocode}
+\@ifundefined{endabstract}{}{%
+ \let\end@hep@abstract\endabstract%
+ \renewcommand\endabstract{\glsresetall\end@hep@abstract}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tableofcontents}
+% \begin{macro}{\listoffigures}
+% \begin{macro}{\listoftables}
+% Adjust the |\tableofcontents| macro to never show the long form of acronyms.
+% \begin{macrocode}
+\let\hep@table@of@contents\tableofcontents
+\renewcommand\tableofcontents{%
+ \glsunsetall\hep@table@of@contents\glsresetall%
+}
+\let\hep@list@of@figures\listoffigures
+\renewcommand\listoffigures{%
+ \glsunsetall\hep@list@of@figures\glsresetall%
+}
+\let\hep@list@of@tables\listoftables
+\renewcommand\listoftables{%
+ \glsunsetall\hep@list@of@tables\glsresetall%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\acronyms}
+% Add a possibility to have different groups of acronyms.
+% \begin{macrocode}
+\NewDocumentCommand{\acronyms}{om}{%
+ \IfNoValueTF{#1}{
+ \newglossary{#2}{#2.in}{#2.out}{#2}%
+ \renewcommand{\acronymtype}{#2}%
+ }{
+ \newglossary{#1}{#1.in}{#1.out}{#2}%
+ \renewcommand{\acronymtype}{#1}%
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% End of glossaries if.
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+%
+% \ifshort
+%</package>
+%<*datamodel>
+% \fi
+%
+% \section{Biblatex datamodel file} \label{sec:data model}
+%
+% \begin{macro}{collaboration}
+% \begin{macro}{reportnumber}
+% \begin{macro}{pmid}
+% \begin{macro}{pmcid}
+% \begin{macro}{pmc}
+% \begin{macro}{protocollessurl}
+% Define the |dbx| file containing the |hep-paper| datamodel.
+% \begin{macrocode}
+\DeclareDatamodelFields[type=field, datatype=literal]{
+ collaboration, reportnumber, pmid, pmcid, pmc,
+}
+\DeclareDatamodelFields[type=field, datatype=uri]{protocollessurl}
+\DeclareDatamodelEntryfields{
+ collaboration, reportnumber, pmid, pmcid, pmc, protocollessurl,
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \ifshort
+%</datamodel>
+% \fi
+%
+% \Finale
+
+\endinput
+
+% \PrintIndex
+% makeindex -s gglo.ist -o hep-paper-implementation.gls hep-paper-implementation.glo
+% makeindex -s gglo.ist -o hep-paper-implementation.ind hep-paper-implementation.idx
+
+% \begin{macro}{\refstepcounter@...}
+% Adjust the |cleveref| |\refstepcounter@noarg| and |\refstepcounter@optarg| to use the |\@currentlabel| in order to fix problems with |\subref|.
+% \begin{macrocode}
+% \def\refstepcounter@noarg#1{%
+% \cref@old@refstepcounter{#1}%
+% \cref@constructprefix{#1}{\cref@result}%
+% \@ifundefined{cref@#1@alias}%
+% {\def\@tempa{#1}}%
+% {\def\@tempa{\csname cref@#1@alias\endcsname}}%
+% \protected@edef\cref@currentlabel{%
+% [\@tempa][\arabic{#1}][\cref@result]%
+% \noexpand\@currentlabel%
+% }% changed
+% }
+%
+% \def\refstepcounter@optarg[#1]#2{%
+% \cref@old@refstepcounter{#2}%
+% \cref@constructprefix{#2}{\cref@result}%
+% \@ifundefined{cref@#1@alias}%
+% {\def\@tempa{#1}}%
+% {\def\@tempa{\csname cref@#1@alias\endcsname}}%
+% \protected@edef\cref@currentlabel{%
+% [\@tempa][\arabic{#2}][\cref@result]%
+% \noexpand\@currentlabel% changed
+% }%
+% }
+% % \end{macrocode}
+% % \end{macro}
+%
+%
+% \usepackage{contour}
+% \renewcommand{\ULdepth}{1.8pt}
+% \contourlength{0.8pt}
+% \newcommand{\myuline}[1]{%
+% \uline{\phantom{#1}}\llap{\contour{white}{#1}}%
+% }
+
+% \begin{macro}{\mathpzc}
+% Define the |\mathpzc| math script font based on the Zapf Chancery PostScript font.
+% \begin{macrocode}
+% \DeclareFontFamily{OT1}{pzc}{}
+% \DeclareFontShape{OT1}{pzc}{m}{it}{<-> s * [1.15] pzcmi7t}{}
+% \DeclareMathAlphabet{\mathpzc}{OT1}{pzc}{m}{it}
+% \end{macrocode}
+% \end{macro}
diff --git a/Master/texmf-dist/source/latex/hep-paper/hep-paper.dtx b/Master/texmf-dist/source/latex/hep-paper/hep-paper.dtx
deleted file mode 100644
index 9ba0f10dcd7..00000000000
--- a/Master/texmf-dist/source/latex/hep-paper/hep-paper.dtx
+++ /dev/null
@@ -1,1746 +0,0 @@
-% \iffalse meta-comment
-%
-% Copyright (C) 2019-2020 by Jan Hajer
-% -----------------------------------
-%
-% This file may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3c
-% of this license or (at your option) any later version.
-% 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.
-%
-% \fi
-%
-% \iffalse
-%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
-%<package>\ProvidesPackage{hep-paper}[2020/03/01 v1.2 Publications in High Energy Physics]
-
-%<*driver>
-\documentclass{ltxdoc}
-
-\MacroIndent=1.5em
-
-% \makeatletter
-% \newenvironment{decl}[1][]%
-% {\par\small\addvspace{4.5ex plus 1ex}%
-% \vskip -\parskip
-% \ifx\relax#1\relax
-% \def\@decl@date{}%
-% \else
-% \def\@decl@date{\NEWfeature{#1}}%
-% \fi
-% \noindent\hspace{-\leftmargini}%
-% \begin{tabular}{|l|}\hline\ignorespaces}%
-% {\\\hline\end{tabular}\nobreak\@decl@date\par\nobreak
-% \vspace{2.3ex}\vskip -\parskip}
-% \makeatother
-
-\newenvironment{example}[1][.5]{%
- \begin{minipage}[t]{\linewidth}%
- \begin{minipage}[t]{#1\linewidth}
- \newcommand{\second}{%
- \end{minipage}%
- \begin{minipage}[t]{\linewidth-#1\linewidth}%
- }%
-}{\end{minipage}\end{minipage}}
-
-\usepackage[parskip]{hep-paper}
-
-\bibliography{bibliography}
-
-\acronym{PDF}{portable document format}
-
-\listfiles
-
-\usepackage{titletoc}
-\titlecontents{section}[0em]{\medskip\bfseries}{\thecontentslabel\hspace{.8em}}{}{\hfill\contentspage}
-
-\EnableCrossrefs
-\CodelineIndex
-\RecordChanges
-
-\begin{document}
-\DocInput{hep-paper.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \CheckSum{0}
-%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
-%
-% \changes{v1.0}{2019/01/01}{Initial version of the style file}
-% \changes{v1.1}{2020/01/01}{Transition to documented \LaTeX\ source file}
-% \changes{v1.2}{2020/03/01}{Inclusion of package options}
-%
-% \GetFileInfo{hep-paper.sty}
-%
-% \DoNotIndex{\,,\@}
-% \DoNotIndex{\@affiliation,\@affil@opt,\@affil}
-%
-% \title{The |hep-paper| package\thanks{This document corresponds to \protecting{|hep-paper|}~\fileversion.}}
-% \author{Jan Hajer \email{jan.hajer@uclouvain.be}}
-% \affiliation{Centre for Cosmology, Particle Physics and Phenomenology, Université catholique de Louvain, Louvain-la-Neuve B-1348, Belgium}
-% \preprint{Preprint-Number}
-% \date{\today}
-% \date{\normalsize\filedate}
-%
-% \maketitle
-%
-% \begin{abstract}
-% The |hep-paper| package aims to provide a single style file containing most configurations and macros necessary to write appealing publications in High Energy Physics.
-% Instead of reinventing the wheel by introducing newly created macros |hep-paper| preferably loads third party packages as long as they are lightweight enough.
-% \end{abstract}
-%
-% \clearpage\tableofcontents\clearpage
-%
-% \newgeometry{vscale=.8, vmarginratio=3:4, includeheadfoot, left=11em, marginparwidth=4.6cm, marginparsep=3mm, right=7em}
-%
-% \section{Introduction}
-%
-% For usual publications it is enough to load additionally to the |article| class without optional arguments only the |hep-paper| package \cite{hep-paper}.
-%
-% | \documentclass{article}|\\
-% | \usepackage{hep-paper}|
-%
-% The most notable changes after loading the |hep-paper| package is the change of some \LaTeX\ defaults.
-% The paper and font sizes are set to A4 and \unit[11]{pt}, respectively.
-% Additionally, the paper geometry is set to the values known from the (depreciated) |a4wide| package \cite{a4wide} using the |geometry| package \cite{geometry}.
-% Finally, the font is changed to |lmodern| \cite{lmodern} with |microtype| \cite{microtype} optimizations.
-% \PDF hyperlinks are implemented with the |hyperref| package \cite{hyperref}.
-%
-% \subsection{Options}
-%
-% \DescribeMacro{paper}
-% The |paper=|\meta{format} option loads the specified paper format.
-% The possible \meta{formats} are:
-% |a0|, |a1|, |a2|, |a3|, |a4|, |a5|, |a6|,
-% |b0|, |b1|, |b2|, |b3|, |b4|, |b5|, |b6|,
-% |c0|, |c1|, |c2|, |c3|, |c4|, |c5|, |c6|,
-% |ansia|, |ansib|, |ansic|, |ansid|, |ansie|,
-% |letter|, |executive|, |legal|.
-%
-% \DescribeMacro{font}
-% The |font=|\meta{size} option loads the specified font size.
-% The possible \meta{sizes} are:
-% |8pt|, |9pt|, |10pt|, |11pt|, |12pt|, |14pt|, |17pt|, |20pt|.
-%
-% \DescribeMacro{defaults}
-% The |defaults| option prevents the adjustment of the page geometry and the font size set by the document class.
-%
-% \DescribeMacro{lang}
-% The |lang|=\meta{name} option switches the document language to the chosen value.
-% The possible values are given by the |babel| package \cite{babel}.
-% The default is |british|.
-%
-% \DescribeMacro{parskip}
-% The |parskip| option makes use of the |parskip| package \cite{parskip} and changes how two paragraphs are separated from each other.
-% The \LaTeX\ default is separation via indentation the |parskip| option switches to separation via vertical space.
-% \footnote{The |parskip| option is used for this document.}
-%
-% \DescribeMacro{sansserif}
-% The |sansserif| option switches the document including math to sans serif font shape.
-%
-% \DescribeMacro{title}
-% The |title=false| option deactivates the titlepage adjustments.
-%
-% \DescribeMacro{manualplacement}
-% The |manualplacement| option reactivates manual float placement.
-%
-% \DescribeMacro{bibliography}
-% The |bibliography|=\meta{key} option prevents the automatic loading of the |biblatex| package \cite{biblatex} for \meta{key}=|false| or passes the \meta{key} as |style| string to the |biblatex| package.
-%
-% \DescribeMacro{glossaries}
-% The |glossaries=false| option deactives the use of the |glossaries| package \cite{glossaries, glossaries-extra}.
-%
-% \DescribeMacro{revtex}
-% The |revtex| option switches the |hep-paper| package into a |revtex| \cite{revtex} compatibility mode.
-%
-% \DescribeMacro{eqnarray}
-% The |eqnarray| option reactivates the depreciated |eqnarray| environment.
-%
-% \section{Macros and environments}
-%
-% \subsection{Title page}
-%
-% The \PDF meta information is set according to the |\title|\marg{text} and |\author|\marg{text} information.
-% \DescribeMacro{\author}
-% \DescribeMacro{\affiliation}
-% \DescribeMacro{\email}
-% In order to facilitate multiple authors with different affiliations the |authblk| package \cite{authblk} is loaded.
-% The following lines add \eg two authors with different affiliations
-%
-% | \author[1]{Author one \email{Email one}}|\\
-% | \affiliation[1]{Affiliation one}|\\
-% | \author[2]{Author two \email{Email two}}|\\
-% | \affiliation[1,2]{Affiliation two}|
-%
-% \DescribeMacro{\preprint}
-% The |\preprint|\marg{numer} macro places a pre-print number in the upper right corner of the first page.
-%
-% \DescribeEnv{abstract}
-% The |abstract| environment has been adjusted to not start with an indentation.
-%
-% \subsection{Text}
-%
-% \DescribeMacro{\enquote}
-% Hyphenation is provided by the |babel| package \cite{babel} and quotation commands are provided by the |csquotes| package \cite{csquotes} recommended by the |babel| package.
-% \DescribeMacro{\MakeOuterQuote}
-% The latter package provides the convenient macro |\MakeOuterQuote{"}| allowing to simply use |"| instead of the pair |``| and |''|.
-%
-% \DescribeMacro{\eg}
-% \DescribeMacro{\vs}
-% The |foreign| package \cite{foreign} defines macros such as |\eg|, |\ie|, |\cf|, and |\vs| which are typeset as \eg, \ie, \cf, and \vs.
-%
-% \DescribeMacro{\no}
-% The |\no|\marg{number} macro is typeset as \no{123}.
-%
-% \DescribeMacro{\software}
-% The |\software|\oarg{version}\marg{name} macro is typeset as \software[\fileversion]{HEP-Paper}.
-%
-% \DescribeMacro{\online}
-% The |\online|\marg{url}\marg{text} macro combines the features of the |\href|\marg{url}\marg{text} and the |\url|\marg{text} macros, resulting in \eg \online{https://ctan.org/pkg/hep-paper}{ctan.org/pkg/hep-paper}.
-%
-% \DescribeMacro{inlinelist}
-% Using the |enumitem| package \cite{enumitem} the |inlinelist|
-%
-% \begin{example}
-% |The three main points are|
-%
-% |\begin{inlinelist}|
-%
-% | \item one|
-%
-% | \item two|
-%
-% | \item three|
-%
-% |\end{inlinelist}|
-% \second
-% The three main points are
-% \begin{inlinelist}
-% \item one
-% \item two
-% \item three
-% \end{inlinelist}
-% \end{example}
-%
-% \DescribeMacro{enumdescript}
-% and the |enumdescript| environments are defined
-%
-% \begin{example}[.6]
-% |\begin{enumdescript}[label=\Roman*)]|
-%
-% | \item{First} one|
-%
-% | \item{Second} two|
-%
-% | \item{Third} three|
-%
-% |\end{enumdescript}|
-% \second
-% \begin{enumdescript}[label=\Roman*)]
-% \item{First} one
-% \item{Second} two
-% \item{Third} three
-% \end{enumdescript}
-% \end{example}
-%
-% \DescribeMacro{\textsc}
-% A sans serif version of \textsf{\textsc{Small Caps}} is provided.
-%
-% \DescribeMacro{\useparskip}
-% \DescribeMacro{\useparindent}
-% If the |parskip| option is activated the |\useparindent| macro switches back the usual parindent mode, while the |\useparskip| macro switches to the parskip mode.
-%
-% \subsubsection{References and footnotes}
-%
-% \DescribeMacro{\cref}
-% References are extended with the |cleveref| package \cite{cleveref}, which allows to \eg just type |\cref|\marg{key} in order to write 'Figure 1'.
-% Furthermore, the |cleveref| package allows to reference multiple objects within one |\cref|\marg{key} (similar to the |\cite|\marg{key} macro).
-%
-% \DescribeMacro{\cite}
-% Citations are adjusted to not start on a new line in order to avoid the repeated use of |~\cite|\marg{key}.
-%
-% \DescribeMacro{\ref}
-% \DescribeMacro{\eqref}
-% \DescribeMacro{\subref}
-% References are also adjusted to not start on a new line and are redefined in order to handle multiple references at once.
-%
-% \DescribeMacro{\footnote}
-% Footnotes are adjusted to swallow white space before the footnote mark and at the beginning of the footnote text.
-%
-% \subsubsection{Acronyms}
-%
-% \DescribeMacro{\acronym}
-% \DescribeMacro{\shortacronym}
-% \DescribeMacro{\longacronym}
-% The |\acronym|\meta{*}\oarg{typeset abbreviation}\marg{abbreviation}\marg{definition}\oarg{plural\linebreak[4]definition} macro generates the singluar |\|\meta{abbreviation} and plural |\|\meta{abbreviation}|s| macros.
-% The starred version does not add an \enquote{s} to the abbreviation plural.
-% The long form is only shown at the first appearance of these macros, later appearances generate the abbreviation with a hyperlink to the long form.
-% Capitalization at the beginning of paragraphs and sentences is ensured.
-% The |\shortacronym| and |\longacronym| macros only show the short or long form of their acronym.
-% \DescribeMacro{\resetacronym}
-% \DescribeMacro{\dummyacronym}
-% The first use form of the acronym can be enforced by resetting the acronym counter.
-% If the acronym counter equals one at the end of the document the short form of the acronym is not introduced.
-% Placing a |\dummyacronym|\marg{key} at the end of the document ensures that the short form is introduced.
-%
-% \subsection{Math}
-%
-% The |mathtools| \cite{mathtools} and |amssymb| \cite{amsfonts} packages are loaded.
-% They in turn load the |amsmath| \cite{amsmath} and |amsfonts| \cite{amsfonts} packages.
-% \DescribeMacro{\mathbf}
-% Bold math, including |\mathbf| is provided by the |bm| package \cite{bm}, \ie ($ A b \Gamma \delta \mathbf A \mathbf b \mathbf \Gamma \mathbf \delta$).
-% Macros switching to |bfseries| such as |\section|\marg{text} are ensured to also typeset math in bold.
-% This may cause trouble if bold symbols carry an additional non-implicit meaning.
-% \DescribeMacro{\text}
-% The |\text|\marg{text} macro makes it possible to write text within math mode, \ie ($ \text A \text b \text \Gamma \text \delta \text{\textbf A} \text{\textbf b} \text{\textbf \Gamma} \text{\textbf \delta}$).
-% The often used |\mathrm|\marg{text} and |\rm|\marg{text} macros are \emph{not} the correct tool for this purpose, as they switch to roman font shape.
-% This behaviour conflicts \eg with the |sansserif| package option.
-% \DescribeMacro{\mathsf}
-% The math sans serif alphabet is redefined to be italic sans serif if the main text is serif and italic serif if the main text is sans serif, \ie ($\mathsf A \mathsf b \mathsf \Gamma \mathsf \delta \mathbf{\mathsf A} \mathbf{\mathsf b} \mathbf{\mathsf \Gamma} \mathbf{\mathsf \delta}$).
-% Details about the font handling in \TeX\ can be found in \cite{fntguide}.
-% \DescribeMacro{\mathscr}
-% The |\mathcal| font \ie ($\mathcal{ABCD}$) is accompanied by the |\mathscr| font \ie ($\mathscr{ABCD}$).
-%
-% \DescribeMacro{\nicefrac}
-% \DescribeMacro{\flatfrac}
-% The |\frac|\marg{number}\marg{number} macro is accompanied by |\nicefrac|\linebreak[1]\marg{number}\linebreak[1]\marg{number} and |\flatfrac|\marg{number}\marg{number}
-% \begin{align}
-% \frac12 \ ,&& \nicefrac 12 \ ,&& \flatfrac 12\ .
-% \end{align}
-% \DescribeMacro{\diag}
-% A diagonal matrix operator is defined |\diag|.
-%
-% \DescribeMacro{\mathdef}
-% The |\mathdef|\marg{name}\oarg{arguments}\marg{code} macro (re-)defines macros only within math mode without changing the text mode definition.
-% \DescribeMacro{\i}
-% The imaginary unit $\i$ is defined using this functionality.
-%
-% \DescribeMacro{\numberwithin}
-% For longer paper it can be useful to re-number the equation in accordance with the section numbering |\numberwithin{equation}{section}|.
-% \DescribeMacro{\subequations}
-% In order to further reduce the size the of equation counter it can be useful to wrap |align| environments with multiple rows in a |subequations| environment.
-%
-% \DescribeMacro{eqnarray}
-% The depreciated |eqnarray| environment is undefined as long this behaviour is not prevented by the |eqnarray| package option.
-% The |align| environment should be used instead.
-%
-% \subsubsection{Physics}
-%
-% Greek letters are adjusted to always be italic and upright in math and text mode, respectively, using the |fixmath| \cite{fixmath} and |alphabeta| \cite{alphabeta} packages.
-% This allows differentiations like
-% \begin{align}
-% \sigma &= \unit[5]{fb} \ , & &\text{at \unit[5]{\sigma} C.L.} \ , & \mu &= \unit[5]{cm} \ , & l &= \text{\unit[5]{\mu m}} \ ,
-% \label{eq:greek}
-% \end{align}
-% and \eg to distinguish gauge $\nu$ and mass \nu\ eigenstates in models with massive light neutrinos.
-% Additionally, Greek letters can also be directly typed using Unicode.
-%
-% \DescribeMacro{\ev}
-% \DescribeMacro{\pdv}
-% \DescribeMacro{\comm}
-% \DescribeMacro{\order}
-% The |physics| package \cite{physics} provides additional macros such as
-% \begin{align}
-% &\ev{\phi} \ ,
-% &&\pdv[n]{f}{x} \ ,
-% &&\comm{A}{B} \ ,
-% &&\order{x^2} \ ,
-% &&\eval*{x}_0^\infty \ ,
-% &&\det(M)\ .
-% \end{align}
-%
-% \DescribeMacro{\slashed}
-% The |\slashed|\marg{character} macro from the |slashed| \cite{slashed} package allows to use the Dirac slash notation.
-%
-% \DescribeMacro{\overleftright}
-% A better looking over left right arrow is defined $\overleftright{\partial}$.
-% \DescribeMacro{\unit}
-% \DescribeMacro{\inv}
-% The correct spacing for units, \cf \cref{eq:greek}, is provided by the macro |\unit|\oarg{value}\marg{unit} from the |units| package \cite{units} which can also be used in text mode.
-% The macro |\inv|\oarg{power}\marg{text} allows to avoid math mode also for inverse units such as \unit[5]{\inv{fb}} typeset via |\unit[5]{\inv{fb}}|.
-%
-% \subsection{Floats}
-%
-% \DescribeEnv{figure}
-% \DescribeEnv{table}
-% Automatic float placement is adjusted to place a single float at the top of pages and to reduce the number of float pages.
-% The most useful float placement is usually archived by placing the float \emph{in front} of the paragraph it is referenced in first.
-% Additionally, manual float placement is deactivated but can be reactivated using the |manualplacement| package option.
-% \DescribeMacro{\raggedright}
-% The float environments have been adjusted to center their content.
-% The usual behaviour can be reactivated using |\raggedright|.
-%
-% \begin{table}
-% \begin{panels}{.6}
-% \raggedright
-% |\begin{panels}{.6}|\\
-% |code|\\
-% |\panel{.4}|\\
-% |\begin{tabular}...\end{tabular}|\\
-% |\end{panels}|\\
-% \caption{Code for this panel environment.}
-% \label{tab:panels}
-% \panel{.4}
-% \begin{tabular}{cccc}
-% \toprule
-% \multicolumn{2}{c}{one}& \multicolumn{2}{c}{two} \\ \cmidrule(r){1-2} \cmidrule(l){3-4}
-% \multirow{2}{*}{a} & b & c & d \\
-% & b & c & d \\
-% \bottomrule
-% \end{tabular}
-% % \caption{The \protecting{|booktabs|} and \protecting{|multirow|} features.}
-% \label{tab:booktabs}
-% \end{panels}
-% \caption{Example use of the \protecting{|panels|} environment in Panel \subref{tab:panels} and the features from the \protecting{|booktabs|} and \protecting{|multirow|} packages in Panel \subref{tab:booktabs}.
-% } \label{tab:table}
-% \end{table}
-%
-% \DescribeEnv{panels}
-% \DescribeMacro{\panel}
-% The |panels| environment makes use of the |subcaption| package \cite{subcaption}.
-% It provides sub-floats and takes as mandatory argument either the number of sub-floats (default~2) or the width of the first sub-float as fraction of the |\linewidth|.
-% Within the |\begin{panels}|\oarg{vert}\marg{width} environment the |\panel| macro initiates a new sub-float.
-% In the case that the width of the first sub-float has been given as an optional argument to the |panels| environment the |\panel|\marg{width} macro takes the width of the next sub-float as mandatory argument.
-% The example code is presented in \cref{tab:panels}.
-%
-% \DescribeEnv{tabular}
-% The |booktabs| \cite{booktabs} and |multirow| \cite{multirow} packages are loaded enabling publication quality tabulars such as in \cref{tab:booktabs}.
-%
-% \DescribeMacro{\graphic}
-% \DescribeMacro{\graphics}
-% The |graphicx| package \cite{graphicx} is loaded and the |\graphic|\oarg{width}\marg{figure} macro is defined, which is a wrapper for the |\includegraphics|\marg{figure} macro and takes the figure width as fraction of the |\linewidth| as optional argument (default~1).
-% If the graphics are located in a sub-folder its path can be indicated by |\graphics|\marg{subfolder}.
-%
-% \subsection{Bibliography}
-%
-% \DescribeMacro{\bibliography}
-% \DescribeMacro{\printbibliography}
-% The |biblatex| package \cite{biblatex} is loaded for bibliography management.
-% The user has to add the line |\bibliography|\marg{my.bib} to the preamble of the document and |\printbibliography| at the end of the document.
-% The bibliography is generated by |biber| \cite{biber}.
-% |biblatex| is extended to be able to cope with the |collaboration| and |reportNumber| fields provided by \online{https://inspirehep.net}{inspirehep.net} and a bug in the volume number is fixed.
-% Additionally, \online{https://ctan.org}{ctan.org}, \online{https://github.com}{github.com}, \online{https://gitlab.com}{gitlab.com}, \online{https://sourceforge.net}{sourceforge.net}, and \online{https://hepforge.org}{hepforge.org} are recognized as |eprinttype|s.
-% \DescribeMacro{erratum}
-% Errata can be included using the |related| feature.
-%
-% | \article{|\meta{key1}|,|\\
-% | |\dots|,|\\
-% | relatedtype="erratum",|\\
-% | related="|\meta{key2}|",|\\
-% | }|\\
-% | \article{|\meta{key2}|,|\\
-% | |\dots|,|\\
-% | }|
-%
-% \section{Conclusion}
-%
-% The |hep-paper| package provides a matching selection of preloaded packages and additional macros enabling the user to focus on the content instead of the layout by reducing the amount of manual tasks.
-% The majority of the loaded packages are fairly lightweight, the others can be deactivated with package options.
-%
-% \DescribeMacro{arxiv-collector}
-% ArXiv requires the setup dependent |bbl| files instead of the original |bib| files, which causes trouble if the local \LaTeX\ version differs from the one used by arXiv.
-% The |arxiv-collector| python script \cite{arxiv-collector} alleviates this problem by collecting all files necessary for publication on arXiv (including figures).
-%
-% \StopEventually{
-% \printbibliography
-% \PrintChanges
-% }
-%
-% \appendix
-%
-% \section{Options}
-%
-% Load the |kvoptions| package and define a |hep| namespace.
-% \DoNotIndex{\RequirePackage,\SetupKeyvalOptions}
-% \begin{macrocode}
-\RequirePackage{kvoptions}
-\SetupKeyvalOptions{
- family=hep,
- prefix=hep@
-}
-% \end{macrocode}
-%
-% \begin{macro}{paper}
-% Define a |paper=|\meta{size} option.
-% Make A4 paper the default.
-% \DoNotIndex{\DeclareStringOption}
-% \begin{macrocode}
-\DeclareStringOption[a4]{paper}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{font}
-% Define a |font=|\meta{size} option.
-% Make \unit[11]{pt} the default font size.
-% \begin{macrocode}
-\DeclareStringOption[11pt]{font}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{defaults}
-% Define the |defaults| option which deactivates the |paper| and |font| options and prevents the change of the class defaults by this package.
-% \DoNotIndex{\DeclareBoolOption,\ifhep@defaults}
-% \begin{macrocode}
-\DeclareBoolOption[false]{defaults}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{lang}
-% Define the |lang| option, which takes the values provided by the |babel| package \cite{babel}.
-% Make |british| the default language.
-% \begin{macrocode}
-\DeclareStringOption[british]{lang}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{parskip}
-% Define the option pair |parindent| and |parskip| controlling the separation of paragraphs.
-% \DoNotIndex{\DeclareComplementaryOption,\ifhep@parindent}
-% \begin{macrocode}
-\DeclareBoolOption[true]{parindent}
-\DeclareComplementaryOption{parskip}{parindent}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{sansserif}
-% Define the option pair |serif| and |sansserif| controling the font shape of the whole document.
-% \DoNotIndex{\ifhep@serif}
-% \begin{macrocode}
-\DeclareBoolOption[true]{serif}
-\DeclareComplementaryOption{sansserif}{serif}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{eqnarray}
-% Provide the option |eqnarray| for reactivating the |eqnarray| environment.
-% \DoNotIndex{\ifhep@eqnarray}
-% \begin{macrocode}
-\DeclareBoolOption[false]{eqnarray}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{bibliography}
-% Provide the option |bibliography| for passing a |style| string to the |biblatex| package \cite{biblatex} or disabling the automatic loading of |biblatex|.
-% \begin{macrocode}
-\DeclareStringOption[numeric-comp]{bibliography}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{glossaries}
-% Provide the option |glossaries| able to turn of the use of the |glossaries-extra| package \cite{glossaries-extra}.
-% \DoNotIndex{\ifhep@glossaries}
-% \begin{macrocode}
-\DeclareBoolOption[true]{glossaries}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{manualplacement}
-% Provide the |manualplacement| option for reactivating the manual placement of floats.
-% \DoNotIndex{\ifhep@manualplacement}
-% \begin{macrocode}
-\DeclareBoolOption[false]{manualplacement}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{title}
-% Provide the option |title| for deactivating redefinition of title macros.
-% \DoNotIndex{\ifhep@title}
-% \begin{macrocode}
-\DeclareBoolOption[true]{title}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{revtex}
-% Provide the option |revtex| for |revtex| \cite{revtex} compatibility mode.
-% \begin{macrocode}
-\DeclareBoolOption[false]{revtex}
-% \end{macrocode}
-% \end{macro}
-
-% \subsection{Process options}
-%
-% \begin{macrocode}
-\ProcessKeyvalOptions*
-% \end{macrocode}
-% Set the |revtex| compatibility options.
-% \DoNotIndex{\ifhep@revtex,\setkeys,\fi}
-% \begin{macrocode}
-\ifhep@revtex
- \setkeys{hep}{defaults, title=false, lang=american, bibliography=false}
-\fi
-% \end{macrocode}
-
-
-% \section{Engine}
-%
-% \begin{macro}{\ifxetexorluatex}
-% Load the |ifluatex| \cite{ifluatex} and |ifxetex| \cite{ifxetex} packages.
-% Define the |\ifxetexorluatex| conditional.
-% \DoNotIndex{\newif,\ifxetex,\xetexorluatextrue,\else,\ifluatex,\xetexorluatexfalse,\fi}
-% \begin{macrocode}
-\RequirePackage{ifluatex}
-\RequirePackage{ifxetex}
-\newif\ifxetexorluatex
-\ifxetex\xetexorluatextrue\else
- \ifluatex\xetexorluatextrue
- \else\xetexorluatexfalse
- \fi
-\fi
-% \end{macrocode}
-% \end{macro}
-
-% \section{Text}
-%
-% Load |alphabeta| package \cite{alphabeta} first in order to archive the correct behaviour.
-% The |alphabeta| package provides upright Greek letters in text mode.
-% \begin{macrocode}
-\RequirePackage{alphabeta}
-% \end{macrocode}
-%
-% Pick the correct font encoding depending on the engine used and load the |fontenc| package \cite{fontenc} with this encoding.
-% For details of the font encoding see \cite{encguide}.
-% \DoNotIndex{\def,\@encoding}
-% \begin{macrocode}
-\ifxetexorluatex
- \def\@encoding{TU}
-\else
- \def\@encoding{T1}
-\fi
-\RequirePackage[\@encoding]{fontenc}
-% \end{macrocode}
-% Load the |lmodern| font \cite{lmodern}, the |textcomp| extension \cite{textcomp}, and the |microtype| font optimization \cite{microtype}.
-% \begin{macrocode}
-\RequirePackage{lmodern}
-\RequirePackage{textcomp}
-\RequirePackage{microtype}
-% \end{macrocode}
-
-% Define sans serif small caps font shapes.
-% \DoNotIndex{\DeclareFontShape,\sffamily}
-% \begin{macrocode}
-\ifxetexorluatex
- \DeclareFontShape{\@encoding}{lmss}{bx}{sc}{<->cmssbxcsc10}{}
- \DeclareFontShape{\@encoding}{lmss}{m}{sc}{%
- <-9>cmsscsc8<9-10>cmsscsc9<10->cmsscsc10%
- }{}
-\else
- \sffamily
- \DeclareFontShape{\@encoding}{lmss}{bx}{sc}{<->ssub*xcmss/bx/sc}{}
- \DeclareFontShape{\@encoding}{lmss}{m}{sc}{<->ssub*xcmss/m/sc}{}
-\fi
-% \end{macrocode}
-
-% Load the |inputenc| \cite{inputenc} package.
-% \begin{macrocode}
-\ifxetexorluatex\else
- \RequirePackage[utf8]{inputenc}
-\fi
-% \end{macrocode}
-
-% Load the |babel| \cite{babel} package for hyphenation and the recommended |csquotes| package \cite{csquotes}.
-% \DoNotIndex{\hep@lang}
-% \begin{macrocode}
-\RequirePackage[\hep@lang]{babel}
-\RequirePackage{csquotes}
-% \end{macrocode}
-
-% Set the whole text to sans serif if requested.
-% \DoNotIndex{\ifhep@serif,\renewcommand,\familydefault,\sfdefault}
-% \begin{macrocode}
-\ifhep@serif\else
- \renewcommand\familydefault{\sfdefault}
-\fi
-% \end{macrocode}
-
-% \begin{macro}{\underline}
-% Load the |soul| package \cite{soul} for hyphenable underlined text.
-% \DoNotIndex{\let}
-% \begin{macrocode}
-\RequirePackage{soul}
-\let\underline\ul
-% \end{macrocode}
-% \end{macro}
-
-% \subsection{Font size}
-%
-% Undefine previously defined font sizes and load the \LaTeX\ font size file corresponding to the font size option.
-% \DoNotIndex{\remove@pt,\edef,\@ptsize,\expandafter,\small,\relax,\footnotesize,\scriptsize}
-% \begin{macrocode}
-\ifhep@defaults\else
- \def\remove@pt#1pt{#1}
- \edef\@ptsize{\expandafter\remove@pt\hep@font}
- \let\small\relax
- \let\footnotesize\relax
- \let\scriptsize\relax
- \let\tiny\relax
- \let\large\relax
- \let\Large\relax
- \let\LARGE\relax
- \let\huge\relax
- \let\Huge\relax
- \input{size\@ptsize.clo}
-\fi
-% \end{macrocode}
-
-% \subsection{Text macros}
-%
-%\begin{macro}{\vs}
-% Load the |foreign| package \cite{foreign} in order to highlight abbreviations and vocabularies from foreign languages.
-% Add the missing |\vs| command.
-% \DoNotIndex{\DeclareRobustCommand,\xperiodafter,\foreignabbrfont,\pdf@strcmp,\hep@lang@foreign}
-% \begin{macrocode}
-\RequirePackage{pdftexcmds}
-\newcommand{\hep@lang@foreign}{british}
-\ifnum\pdf@strcmp{\hep@lang}{american}=0%
- \renewcommand{\hep@lang@foreign}{USenglish}%
-\fi
-\ifnum\pdf@strcmp{\hep@lang}{USenglish}=0%
- \renewcommand{\hep@lang@foreign}{USenglish}%
-\fi
-\RequirePackage[all, \hep@lang@foreign]{foreign}
-\DeclareRobustCommand\vs{\xperiodafter{{\foreignabbrfont{vs}}}}
-% \end{macrocode}
-% \end{macro}
-
-%\begin{macro}{\no}
-% Define the macro |\no|\marg{number} for the use of \textnumero\ with appropriate spacing.
-% \begin{macrocode}
-\newcommand{\no}[1]{\textnumero~#1}
-% \end{macrocode}
-% \end{macro}
-
-%\begin{macro}{\software}
-% Define a macro for software with optional version information |\software|\linebreak[1]\oarg{version}\linebreak[1]\marg{name}, using the |relsize| package \cite{relsize}.
-% \DoNotIndex{\hspace,\fontdimen,\font,\smaller,\textsc}
-% \begin{macrocode}
-\RequirePackage{relsize}
-\newcommand{\software}[2][\hspace{-\fontdimen2\font}]{%
- {\smaller\textsc{#2}~#1}%
-}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\online}
-% The |\online|\marg{text}\marg{url} macro combines the features of the |\href| and the |\url| macros.
-% \DoNotIndex{\href,\url}
-% \begin{macrocode}
-\newcommand{\online}[2]{\href{#1}{\url{#2}}}
-% \end{macrocode}
-% \end{macro}
-
-% \subsection{Lists}
-
-% Load the |enumitem| package \cite{enumitem}.
-% \begin{macrocode}
-\RequirePackage[inline]{enumitem}
-% \end{macrocode}
-%
-% \begin{environment}{inlinelist}
-% Define an inline list environment.
-% \DoNotIndex{\newlist,\setlist*,\ }
-% \begin{macrocode}
-\newlist{inlinelist}{enumerate*}{1}
-\setlist*[inlinelist,1]{%
- label=\roman*), itemjoin={,\ }, itemjoin*={, and\ }, after=.%
-}
-% \end{macrocode}
-% \end{environment}
-%
-% \begin{environment}{enumdescript}
-% Define an enumdescript list environment.
-% \DoNotIndex{\arabic*,\old@item,\item,ifx,\textbf,\empty,\@ifnextchar,\par,\@gobble}
-% \begin{macrocode}
-\newlist{enum@descript}{enumerate}{2}
-\setlist[enum@descript]{label=\arabic*.}
-\newenvironment{enumdescript}[1][]{
-\begin{enum@descript}[#1]
- \let\old@item\item
- \renewcommand{\item}[2][]{
- \ifx&##1&\old@item\else\old@item[##1]\fi
- \textbf{##2}\ifx##2\empty\else~\fi\@ifnextchar\par\@gobble\relax
- }
-}{\end{enum@descript}}
-% \end{macrocode}
-% \end{environment}
-
-% \subsection{Footnotes}
-%
-% \begin{macro}{\footnote}
-% Ensure that no spaces appear before the footmark or at the beginning of the footnote.
-% \DoNotIndex{\unskip,\@foot@note,\ignorespaces}
-% \begin{macrocode}
-\let\@foot@note\footnote
-\renewcommand{\footnote}[1]{\unskip\@foot@note{\ignorespaces#1}}
-% \end{macrocode}
-% \end{macro}
-
-% \section{Geometry}
-%
-% Load the |geometry| package \cite{geometry} and adjust the text width and height to the values of the |a4wide| package \cite{a4wide}.
-% \DoNotIndex{\ifhep@defaults,\hep@paper,\geometry}
-% \begin{macrocode}
-\ifhep@defaults\else
- \RequirePackage[\hep@paper paper]{geometry}
- \geometry{hscale=.75, vscale=.8, vmarginratio=3:4, includeheadfoot}
-\fi
-% \end{macrocode}
-
-%\begin{macro}{\useparskip}
-%\begin{macro}{\useparindent}
-% Load the |parskip| package \cite{parskip} and provide two commands switching between the two paragraph modes.
-% \DoNotIndex{\ifhep@parindent,\setlength,\parskip,\baselineskip,\parindent}
-% \begin{macrocode}
-\ifhep@parindent\else
-\RequirePackage{parskip}
-\newcommand{\useparskip}{%
- \setlength{\parskip}{.5\baselineskip plus 2pt}%
- \setlength{\parindent}{0pt}%
-}
-\newcommand{\useparindent}{%
- \setlength{\parskip}{0pt}%
- \setlength{\parindent}{15pt}%
- \if@twocolumn\setlength\parindent{1em}
- \else\setlength\parindent{1.5em}
- \fi
-}
-\fi
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-
-% \section{Math}
-%
-% Load the |mathtools| package \cite{mathtools} which loads the |amsmath| package \cite{amsmath}.
-% Additionally, load the |amssymb| package \cite{amsfonts} which provides further math symbols and also loads the |amsfont| package \cite{amsfonts}.
-% Allow page breaks within equations if necessary.
-% \begin{macrocode}
-\RequirePackage{mathtools}
-\RequirePackage{amssymb}
-\allowdisplaybreaks[1]
-% \end{macrocode}
-
-% \begin{macro}{\diag}
-% Provide a diag operator
-% \begin{macrocode}
-\DeclareMathOperator{\diag}{diag}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\mathdef}
-% Define the |\mathdef|\marg{name}\oarg{arguments}\marg{macro} macro which (re-)defines macros in math mode only.
-% This macro is implemented using the |xparse| package \cite{xparse}.
-% \begin{macrocode}
-\RequirePackage{xparse}
-\DeclareDocumentCommand{\mathdef}{mO{0}m}{%
- \expandafter\let\csname old\string#1\endcsname=#1
- \expandafter\newcommand\csname new\string#1\endcsname[#2]{#3}
- \DeclareRobustCommand#1{%
- \ifmmode
- \expandafter\let\expandafter\next\csname new\string#1\endcsname
- \else
- \expandafter\let\expandafter\next\csname old\string#1\endcsname
- \fi
- \next
- }%
-}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\i}
-% Provide an upright imaginary unit in math mode.
-% \begin{macrocode}
-\AtBeginDocument{\mathdef{\i}{\operatorname{i}}}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{eqnarray}
-% Undefine the |eqnarray| environment.
-% \begin{macrocode}
-\ifhep@eqnarray\else%
- \let\eqnarray\@undefined
- \let\endeqnarray\@undefined
-\fi
-% \end{macrocode}
-% \end{macro}
-
-% \subsection{Math fonts}
-%
-% \begin{macro}{\mathbf}
-% Load the |bm| package \cite{bm} for superior boldmath.
-% Make math symbols bold whenever they appear in bold macros such as |\section|\marg{text}.
-% \begin{macrocode}
-\RequirePackage{bm}
-\let\mathbf\bm
-\g@addto@macro\bfseries{\boldmath}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\mathsf}
-% Load the |fixmath| package \cite{fixmath} which ensures that upper Greek letters in math mode are italic.
-% Ensure that also math mode is sans serif using the |sfmath| package \cite{sfmath} if the option sans serif is passed to the package.
-% Ensure that |\mathsf| is italic as well as sans serif and sans for sans and sans serif documents, respectively.
-% \begin{macrocode}
-\ifhep@serif
- \RequirePackage{fixmath}
- \DeclareMathAlphabet{\mathsf}{OML}{cmbr}{m}{it}
- \SetMathAlphabet{\mathsf}{bold}{OML}{cmbr}{bx}{it}
-\else
- \RequirePackage[slantedGreek]{sfmath}
- \DeclareMathAlphabet{\mathsf}{OML}{cmm}{m}{it}
- \SetMathAlphabet{\mathsf}{bold}{OML}{cmm}{bx}{it}
-\fi
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\mathscr}
-% Load the |mathrsfs| package for the |\mathscr| math script font.
-% \begin{macrocode}
-\RequirePackage{mathrsfs}
-% \end{macrocode}
-% \end{macro}
-
-% \subsection{Physics notation}
-%
-% \begin{macro}{\slashed}
-% \begin{macro}{\units}
-% Load the |physics| package \cite{physics} which provides macros useful for publications in physics.
-% Additionally, load the |slashed| package \cite{slashed} which provides the slashed macro for Dirac notation.
-% Finally, load the |units| package \cite{units} which provides the |\units| and |\nicefrac| macros.
-% \begin{macrocode}
-\RequirePackage{physics}
-\RequirePackage{slashed}
-\RequirePackage{units}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-
-% \begin{macro}{\inv}
-% Provide a macro for the inverse, useful in combination with the unit macro in text mode.
-% \begin{macrocode}
-\newcommand{\inv}[2][1]{#2\ensuremath{^{-#1}}}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\oset}
-% Define a new overset macro |\oset|\oarg{offset}\marg{over}\marg{base}
-% \begin{macrocode}
-\newcommand{\oset}[3][-1pt]{%
- \raisebox{1pt}{\ensuremath{\mathop{#3}\limits^{%
- \vbox to#1{\kern-2\ex@\hbox{$\scriptscriptstyle#2$}\vss}%
- }}}%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\overleftright}
-% Define a over left right arrow |\overleftright|\marg{base}.
-% \begin{macrocode}
-\newcommand{\overleftright}[1]{\oset{\leftrightarrow}{#1}}
-% \end{macrocode}
-% \end{macro}
-
-% \section{Floats}
-%
-% Adjust the \LaTeX\ float placement defaults
-% \begin{macrocode}
-\renewcommand{\textfraction}{0.01}
-\setcounter{topnumber}{1}
-\renewcommand{\topfraction}{.9}
-\setcounter{bottomnumber}{0}
-\renewcommand{\floatpagefraction}{.8}
-% \end{macrocode}
-
-% \begin{environment}{figure}
-% \begin{environment}{table}
-% Center the content of |figure| and |table| environments.
-% Ignore the manual placement if the |manualplacement| option is set to false.
-% \begin{macrocode}
-\let\@figure@\figure%
-\let\@end@figure@\endfigure%
-\let\@table@\table%
-\let\@end@table@\endtable%
-\ifhep@manualplacement%
- \renewenvironment{figure}[1][tbp]{%
- \@figure@[#1]\centering%
- }{\@end@figure@}%
- \renewenvironment{table}[1][tbp]{%
- \@table@[#1]\centering%
- }{\@end@table@}%
-\else%
- \renewenvironment{figure}[1][]{%
- \@figure@\centering%
- }{\@end@figure@}%
- \renewenvironment{table}[1][]{%
- \@table@\centering%
- }{\@end@table@}
-\fi%
-% \end{macrocode}
-% \end{environment}
-% \end{environment}
-
-% \subsection{Sub-floats}
-%
-% Prevent the |caption| package \cite{caption} from complaining about the |revtex| class.
-% \begin{macrocode}
-\ifhep@revtex
- \setlength\abovecaptionskip{\f@size\p@}
- \setlength\belowcaptionskip{0\p@}
- \long\def\@makecaption#1#2{%
- \vskip\abovecaptionskip
- \sbox\@tempboxa{#1: #2}%
- \ifdim \wd\@tempboxa >\hsize
- #1: #2\par
- \else
- \global \@minipagefalse
- \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
- \fi
- \vskip\belowcaptionskip%
- }
-\fi
-% \end{macrocode}
-%
-% Load the |subcaption| package \cite{subcaption}.
-% \begin{macrocode}
-\RequirePackage[subrefformat = parens]{subcaption}
-\captionsetup{font=small}
-\captionsetup[sub]{font=small}
-% \end{macrocode}
-% \begin{environment}{panels}
-% \begin{macro}{\panel}
-% Load the |subcaption| package \cite{subcaption} and define the |panels| environment as well as the |\panel| macro.
-% \begin{macrocode}
-\newenvironment{panels}[2][b]{%
-% \end{macrocode}
-% Define an internal macro for global behaviour.
-% \begin{macrocode}
- \newcommand{\begin@subcaption@minipage}[2][b]{%
- \caption@withoptargs\subcaption@minipage[##1]{##2}%
- \centering\vskip 0pt%
- }
-% \end{macrocode}
-% Define the |\panel| macro for the case that the number of panels is given.
-% \begin{macrocode}
- \ifdim#2pt>1pt%
- \newcommand{\panel}[1][b]{%
- \endminipage\hfill\begin@subcaption@minipage[#1]{\linewidth/#2}%
- }%
- \begin@subcaption@minipage[#1]{\linewidth/#2}%
-% \end{macrocode}
-% Define the |\panel| macro for the case that the width of the panel is given.
-% \begin{macrocode}
- \else%
- \newcommand{\panel}[2][b]{%
- \endminipage\hfill\begin@subcaption@minipage[#1]{##2\linewidth}%
- }%
- \begin@subcaption@minipage[#1]{#2\linewidth}%
- \fi%
-}{\endminipage}
-% \end{macrocode}
-% \end{macro}
-% \end{environment}
-
-% Reajust the captions to the revtex class.
-% \begin{macrocode}
-\ifhep@revtex
- \renewcommand{\figurename}{Figure}
- \renewcommand{\tablename}{Table}
- \RequirePackage{ragged2e}
- \DeclareCaptionFormat{revtex}{#1#2\justifying{#3}}
- \captionsetup{font = small, format = revtex}
- \captionsetup[sub]{font = footnotesize, format = plain}
-\fi
-% \end{macrocode}
-
-% \subsection{Tables}
-%
-% \begin{environment}{tabular}
-% Enhance tabulars with the |booktabs| and |multirow| packages \cite{booktabs, multirow}.
-% \begin{macrocode}
-\RequirePackage{booktabs}
-\RequirePackage{multirow}
-% \end{macrocode}
-% \end{environment}
-
-% \subsection{Figures}
-%
-% \begin{macro}{\graphic}
-% Provide the |\graphic| macro for the inclusion of figures using the |graphicx| package \cite{graphicx}.
-% \begin{macrocode}
-\RequirePackage{graphicx}
-\providecommand{\tikzsetnextfilename}[1]{}
-\newcommand{\graphic}[2][1]{\tikzsetnextfilename{#2}{%
- \centering\includegraphics[width=#1\linewidth]{#2}%
-}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\graphics}
-% Provide the |\graphics| macro for the inclusion of figures located in a subfolder.
-% \begin{macrocode}
-\newcommand{\graphics}[1]{\graphicspath{{./#1/}}}
-% \end{macrocode}
-% \end{macro}
-
-% \section{Title page}
-%
-% \begin{macro}{\date}
-% Allow empty date field.
-% \begin{macrocode}
-\ifhep@title
-\date{}
-% \end{macrocode}
-% \end{macro}
-
-% \subsection{Authors}
-%
-% \begin{macro}{\author}
-% Allow empty author field.
-% \begin{macrocode}
-\author{}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\email}
-% Provide macro for the email of authors used as |\author{|$\langle name\rangle$| \email{|$\langle email\rangle$|}}|.
-% \begin{macrocode}
-\AtEndOfClass{\newcommand{\email}[1]{%
- \unskip\thanks{\online{mailto:#1}{#1}}
-}}
-% \end{macrocode}
-% \end{macro}
-%
-% Enable the handling of multiple authors with different affiliations using the |authblk| package \cite{authblk}.
-% \begin{macrocode}
-\RequirePackage{authblk}
-\renewcommand\Affilfont{\footnotesize}
-% \end{macrocode}
-%
-% \begin{macro}{\affiliation}
-% Define the |\affiliation| macro, ensure that linebreaks happen after a comma.
-% \begin{macrocode}
-\newcommand\active@comma{,\penalty-5\relax}
-\newcommand\cat@comma@active{\catcode`\,\active}
-{\cat@comma@active\gdef,{\active@comma}}
-\newcommand\@affil[1]{%
- \endgroup\@flushglue=0pt plus .5\linewidth\affil{#1}%
-}
-\def\@affil@opt[#1]#2{%
- \endgroup\@flushglue=0pt plus .5\linewidth\affil[#1]{#2}%
-}
-\DeclareRobustCommand\@affiliation{\@ifnextchar[{\@affil@opt}{\@affil}}
-\newcommand{\affiliation}{\begingroup\cat@comma@active\@affiliation}
-% \end{macrocode}
-% \end{macro}
-
-% \subsection{Preprint}
-%
-% \begin{macro}{\preprint}
-% Places a preprint number in the top right corner of the first page.
-% This code uses the |varwidth| \cite{varwidth}, |atbegshi| \cite{atbegshi}, and |picture| \cite{picture} packages.
-% \begin{macrocode}
-\let\@preprint\relax
-\newcommand\preprint[1]{\long\gdef\@preprint{#1}}
-\RequirePackage{varwidth}
-\newcommand{\@preprint@box}{%
- \begin{varwidth}{\textwidth}%
- \textsc{\small\@preprint}%
- \end{varwidth}%
-}
-\RequirePackage{atbegshi}
-\RequirePackage{picture}
-\AtBeginShipoutFirst{%
- \put(
- \textwidth+\oddsidemargin-\widthof{\@preprint@box},
- -2pt-\topmargin-\heightof{\@preprint@box}
- ){\normalfont\@preprint@box}
-}
-% \end{macrocode}
-% \end{macro}
-
-% \subsection{Abstract}
-%
-% \begin{environment}{abstract}
-% Adjust the |abstract| environment to not start with indentation.
-% \begin{macrocode}
-\let\old@abstract\abstract
-\renewcommand\abstract{\old@abstract\noindent\ignorespaces}
-% \end{macrocode}
-% \end{environment}
-% End of check for |title| option.
-% \begin{macrocode}
-\fi
-% \end{macrocode}
-
-% \section{Bibliography}
-%
-% Check if bibliography management is requested using the |pdftexcmds| package \cite{pdftexcmds}.
-% \begin{macrocode}
-\ifnum\pdf@strcmp{\hep@bibliography}{false}=0\else
-% \end{macrocode}
-%
-% \begin{macro}{\bibliography}
-% Load the |biblatex| package \cite{biblatex} with a JHEP like bibliography style.
-% \begin{macrocode}
-\RequirePackage[style=\hep@bibliography]{biblatex}
-\ExecuteBibliographyOptions{
- sorting=none,
- giveninits=true
-}
-% \end{macrocode}
-% \end{macro}
-% Read the collaboration and pre-print information if present.
-% Move letters from the volume field to the journal field.
-% \begin{macrocode}
-\newcommand{\@reg@exp}{\regexp{\A(\p{L}+)?\d+(\p{L}+)?\Z}}
-\newcommand{\@reg@exp@}{\regexp{\A(\p{L}+)?(\d+)(\p{L}+)?\Z}}
-\DeclareSourcemap{%
- \maps[datatype=bibtex,overwrite=true]{%
- \map{%
- \step[fieldsource=Collaboration,final=true]%
- \step[fieldset=usere,origfieldval,final=true]
- }%
- \map{%
- \step[fieldsource=reportNumber,final=true]%
- \step[fieldset=userf,origfieldval,final=true]
- }%
- \map[overwrite]{
- \step[fieldsource=volume, match=\@reg@exp, final]
- \step[fieldsource=volume, match=\@reg@exp@, replace={$2}]
- \step[fieldsource=journal, fieldtarget=journaltitle]
- \step[fieldset=journaltitle, fieldvalue={\space$1$2}, append=true]
- }
- }%
-}
-% \end{macrocode}
-
-% Override the author information with collaboration information if present.
-% \begin{macrocode}
-\renewbibmacro*{author}{%
- \iffieldundef{usere}{\printnames{author}}{\textbf{\printfield{usere}}}%
-}
-% \end{macrocode}
-
-% Remove spurious `In:' if no journal is present.
-% \begin{macrocode}
-\renewbibmacro*{in:}{%
- \iffieldundef{journal}{}{\printtext{\bibstring{in}\intitlepunct}}%
-}
-% \end{macrocode}
-
-% Provide the |\letbibmacro| macro for old |biblatex| installations.
-% \begin{macrocode}
-\providecommand{\letbibmacro}[2]{\csletcs{abx@macro@#1}{abx@macro@#2}}
-% \end{macrocode}
-
-% Add the pre-print information if present.
-% \begin{macrocode}
-\letbibmacro{doi+eprint+url-old}{doi+eprint+url}
-\renewbibmacro*{doi+eprint+url}{%
- \usebibmacro{doi+eprint+url-old}
- \iffieldundef{userf}{}{\textls[0]{%
- \newunitpunct\textnumero\intitlepunct%
- \textsc{\small\printfield{userf}}%
- }}%
-}
-% \end{macrocode}
-
-% Add CTAN as a pre-print option
-% \begin{macrocode}
-\DeclareFieldFormat{eprint:ctan}{%
- CTAN\addcolon\space\ifhyperref{%
- \href{https://ctan.org/pkg/#1}{\nolinkurl{#1}}%
- }{\nolinkurl{#1}}%
-}
-\DeclareFieldAlias{eprint:CTAN}{eprint:ctan}
-% \end{macrocode}
-
-% Add GitHub as a pre-print option
-% \begin{macrocode}
-\DeclareFieldFormat{eprint:github}{%
- GitHub\addcolon\space\ifhyperref{\href{%
- https://github.com/\thefield{eprintclass}/#1%
- }{\nolinkurl{\thefield{eprintclass}/#1}}%
- }{\nolinkurl{\thefield{eprintclass}/#1}}%
-}
-\DeclareFieldAlias{eprint:GitHub}{eprint:github}
-% \end{macrocode}
-
-% Add GitLab as a pre-print option
-% \begin{macrocode}
-\DeclareFieldFormat{eprint:gitlab}{%
- GitLab\addcolon\space\ifhyperref{\href{%
- https://gitlab.com/\thefield{eprintclass}/#1%
- }{\nolinkurl{\thefield{eprintclass}/#1}}%
- }{\nolinkurl{\thefield{eprintclass}/#1}}%
-}
-\DeclareFieldAlias{eprint:GitLab}{eprint:gitlab}
-% \end{macrocode}
-
-% Add SourceForge as a pre-print option
-% \begin{macrocode}
-\DeclareFieldFormat{eprint:sourceforge}{%
- SourceForge\addcolon\space\ifhyperref{%
- \href{https://sourceforge.net/projects/#1}{\nolinkurl{#1}}%
- }{\nolinkurl{#1}}%
-}
-\DeclareFieldAlias{eprint:SourceForge}{eprint:sourceforge}
-% \end{macrocode}
-
-% Add HEPForge as a pre-print option
-% \begin{macrocode}
-\DeclareFieldFormat{eprint:hepforge}{%
- HEPForge\addcolon\space\ifhyperref{%
- \href{https://#1/hepforge.org/}{\nolinkurl{#1}}%
- }{\nolinkurl{#1}}%
-}
-\DeclareFieldAlias{eprint:HEPForge}{eprint:hepforge}
-% \end{macrocode}
-
-% Add new bibliography string \enquote{Erratum} for the use in the |relatedtype| field.
-% \begin{macrocode}
-\NewBibliographyString{erratum}
-\DefineBibliographyStrings{english}{erratum={Erratum:}}
-% \end{macrocode}
-
-% \begin{macro}{\printbibliography}
-% Allow the bibliography to be printed sloppy
-% \begin{macrocode}
-\let\old@printbibliography\printbibliography
-\renewcommand{\printbibliography}{\sloppy\old@printbibliography}
-% \end{macrocode}
-% \end{macro}
-%
-% End check for bibliography option.
-% \begin{macrocode}
-\fi
-% \end{macrocode}
-
-% \section{Hyperlinks and References}
-%
-% Load the |hyperref| package \cite{hyperref} enable Unicode encoding and hide links.
-%
-% \begin{macrocode}
-\RequirePackage{hyperref}
-\hypersetup{
- pdfencoding=auto,
- psdextra,
- hidelinks,
- linktoc=all,
- breaklinks=true,
- pdfcreator={},
- pdfproducer={}
-}
-% \end{macrocode}
-% Set the \PDF meta data according to the paper information and ensure that unnecessary information is suppressed.
-%
-% \begin{macrocode}
-\pdfstringdefDisableCommands{\def\varepsilon{\textepsilon}}
-\AtBeginDocument{
- \pdfstringdefDisableCommands{\let\ensuremath\@gobble}
- \pdfstringdefDisableCommands{\let\mathsurround\@gobble}
- \pdfstringdefDisableCommands{\let\unskip\@gobble}
- \pdfstringdefDisableCommands{\let\thanks\@gobble}
- \pdfstringdefDisableCommands{\let\footnote\@gobble}
- \pdfstringdefDisableCommands{\let\\\@gobble}
-}
-\AtBeginShipout{\hypersetup{pdftitle={\@title}}}
-\ifhep@title
- \AtBeginDocument{\hypersetup{pdfauthor=\AB@authlist}}
-\else
- \AtBeginDocument{\hypersetup{pdfauthor={\@author}}}
-\fi
-% \end{macrocode}
-
-% \begin{macro}{\cref}
-% Improve reference using the |cleveref| package \cite{cleveref}.
-%
-% \begin{macrocode}
-\RequirePackage[noabbrev, capitalize, nameinlink]{cleveref}
-\crefname{enumi}{point}{points}
-\Crefname{enumi}{Point}{Points}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\refstepcounter@...}
-% Adjust the |cleveref| |\refstepcounter@noarg| and |\refstepcounter@optarg| to use the |\@currentlabel| in order to fix problems with |\subref|.
-% \begin{macrocode}
-\def\refstepcounter@noarg#1{%
- \cref@old@refstepcounter{#1}%
- \cref@constructprefix{#1}{\cref@result}%
- \@ifundefined{cref@#1@alias}%
- {\def\@tempa{#1}}%
- {\def\@tempa{\csname cref@#1@alias\endcsname}}%
- \protected@edef\cref@currentlabel{%
- [\@tempa][\arabic{#1}][\cref@result]%
- \noexpand\@currentlabel%
- }% changed
-}
-
-\def\refstepcounter@optarg[#1]#2{%
- \cref@old@refstepcounter{#2}%
- \cref@constructprefix{#2}{\cref@result}%
- \@ifundefined{cref@#1@alias}%
- {\def\@tempa{#1}}%
- {\def\@tempa{\csname cref@#1@alias\endcsname}}%
- \protected@edef\cref@currentlabel{%
- [\@tempa][\arabic{#2}][\cref@result]%
- \noexpand\@currentlabel% changed
- }%
-}
-% \end{macrocode}
-% \end{macro}
-
-%\begin{macro}{\no@break@before}
-% Provide macro able to prevent line breaks.
-% \DoNotIndex{\no@break@before,\ifvmode,\ifhmode,\ifdim,\lastskip,\unskip,\nobreakspace}
-% \begin{macrocode}
-\newcommand\no@break@before{%
- \relax\ifvmode\else%
- \ifhmode%
- \ifdim\lastskip > 0pt%
- \relax\unskip\nobreakspace%
- \fi%
- \fi%
- \fi%
-}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\ref}
-% Adjust |\ref|\marg{key} in order to prevent preceding line breaks and to enable the possibility to reference multiple references at once.
-% \begin{macrocode}
-\let\old@ref\ref
-\AtBeginDocument{\renewcommand\ref{\no@break@before\labelcref}}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\eqref}
-% Adjust |\eqref|\marg{key} in order to prevent preceding line breaks and to enable the possibility to reference multiple equations at once.
-% \begin{macrocode}
-\renewcommand\eqref{\no@break@before\labelcref}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\subref}
-% Adjust |\subref|\marg{key} in order to prevent preceding line breaks.
-% \begin{macrocode}
-\let\old@subref\subref
-\renewcommand\subref{\no@break@before\old@subref}
-\renewcommand*\subcaption@ref[2]{\begingroup%
- \caption@setoptions{sub}%
- \subcaption@reffmt\p@subref{\old@ref#1{sub@#2}}%
-\endgroup}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\subcref}
-% Provide the |\subcref| macro.
-% \begin{macrocode}
-\newcommand{\subcref}[1]{\cref{sub@#1}}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\eqcrefname}
-% Define the |\eqcrefname| macro for named equation types.
-% \begin{macrocode}
-\DeclareDocumentCommand{\eqcrefname}{mmo}{
- \crefname{#1}{#2}{\IfValueTF{#3}{#3}{#2s}}
- \creflabelformat{#1}{(##2##1##3)}
-}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\labelcrefrange}
-% Define the missing |\labelcrefrange|\marg{key1}\marg{key2} macro.
-% \begin{macrocode}
-\DeclareRobustCommand{\labelcrefrange}[2]{%
- \@crefrangenostar{labelcref}{#1}{#2}%
-}
-% \end{macrocode}
-% \end{macro}
-
-% \subsection{Citation macros}
-%
-% \begin{macro}{\cite}
-% Adjust |\cite|\marg{key} in order to prevent preceding line breaks.
-% \begin{macrocode}
-\let\old@cite\cite
-\renewcommand\cite{\no@break@before\old@cite}
-% \end{macrocode}
-% \end{macro}
-
-% Begin of bibliography if.
-% \begin{macrocode}
-\ifnum\pdf@strcmp{\hep@bibliography}{false}=0\else
-% \end{macrocode}
-% Define bibstrings for reference names.
-% \begin{macrocode}
-\NewBibliographyString{refname}
-\NewBibliographyString{refsname}
-\DefineBibliographyStrings{english}{%
- refname = {Reference},
- refsname = {References}
-}
-% \end{macrocode}
-% \begin{macro}{\ccite}
-% \begin{macro}{\Ccite}
-% Define \emph{clever} citation macros.
-% \begin{macrocode}
-\DeclareCiteCommand{\ccite}{%
- \ifnum\thecitetotal=1%
- \bibstring{refname}%
- \else%
- \bibstring{refsname}%
- \fi%
- \addnbspace\bibopenbracket%
- \usebibmacro{cite:init}\usebibmacro{prenote}%
-}{\usebibmacro{citeindex}\usebibmacro{cite:comp}}{}{%
- \usebibmacro{cite:dump}\usebibmacro{postnote}%
- \bibclosebracket%
-}
-
-\newrobustcmd*{\Ccite}{\bibsentence\ccite}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% End of biblatex if.
-% \begin{macrocode}
-\fi
-% \end{macrocode}
-
-% \section{Acronyms}
-%
-% Acronyms are implemented with the |glossaries-extra| package \cite{glossaries-extra} which is an extension of the |glossaries| package \cite{glossaries}.
-% \begin{macrocode}
-\ifhep@glossaries
-\RequirePackage[nostyles]{glossaries-extra}
-% \end{macrocode}
-% The entry count feature is used.
-% \begin{macrocode}
-\glsenableentrycount
-\glssetcategoryattribute{abbreviation}{entrycount}{1}
-% \end{macrocode}
-% Provide macros for older |glossaries-extra| installations.
-% \begin{macrocode}
-\providecommand{\glsxtrusefield}[2]{\@gls@entry@field{#1}{#2}}
-\providecommand{\glsxtrsetfieldifexists}[3]{\glsdoifexists{#1}{#3}}
-\providecommand{\gGlsXtrSetField}[3]{%
- \glsxtrsetfieldifexists{#1}{#2}{%
- \csgdef{glo@\glsdetoklabel{#1}@#2}{#3}%
- }%
-}
-% \end{macrocode}
-% Hyperlinks from the abbreviation to their definition in the text are set.
-% \begin{macrocode}
-\glssetcategoryattribute{abbreviation}{nohyperfirst}{true}
-\renewcommand*{\glsdonohyperlink}[2]{{%
- \glsxtrprotectlinks\edef\fieldvalue{%
- \glsxtrusefield{\glslabel}{hastarget}%
- }%
- \ifdefstring\fieldvalue{true}{#2}{%
- \gGlsXtrSetField{\glslabel}{hastarget}{true}%
- \glsdohypertarget{#1}{#2}%
- }%
-}}
-% \end{macrocode}
-
-% \begin{macro}{\if@begin@of@sentence}
-% Mark the beginning of a paragraph as if it would follow a full stop using the |everyhook| package \cite{everyhook}.
-% Provide a macro checking for the beginning of a sentence by examining the length of the preceeding space. (This breaks if |\frenchspacing| is activated)
-% \begin{macrocode}
-\usepackage[excludeor]{everyhook}
-\PushPostHook{par}{{\spacefactor=3000}}
-\newcommand{\if@begin@of@sentence}[2]{\leavevmode\protecting{%
- \ifboolexpr{ test {\ifnumcomp{\spacefactor}{=}{3000}} or%
- test {\ifnumcomp{\spacefactor}{=}{2000}}%
- }{#1}{#2}%
-}}
-% \end{macrocode}
-% \end{macro}
-
-% \begin{macro}{\acronym}
-% The |\acronym|\meta{*}\oarg{typeset abbreviation}\marg{abbreviation}\marg{definition}\oarg{plural\linebreak[4] definition} macro is defined.
-% \begin{enumerate}[nosep, label=\#\arabic*]
-% \item star for omitting the \enquote{s} in the short plural
-% \item optional typeset abbreviation
-% \item mandatory abbreviation
-% \item mandatory long form
-% \item optional plural long form
-% \end{enumerate}
-% \begin{macrocode}
-\DeclareDocumentCommand{\acronym}{sommo}{
- \newabbreviation[
- longplural=\IfNoValueTF{#5}{#4s}{#5},
- \glsshortpluralkey=\IfBooleanTF{#1}{#3}{\IfNoValueTF{#2}{#3s}{#2s}}
- ]{#3}{\IfNoValueTF{#2}{#3}{#2}}{#4}
-% \end{macrocode}
-% Provide the singular acronym macro.
-% \begin{macrocode}
- \expandafter\newcommand\csname#3\endcsname{%
- \if@begin@of@sentence{\cGls{#3}}{\cgls{#3}}\@\xspace%
- }
-% \end{macrocode}
-% Expand the singular acronym macro in \PDF labels.
-% \begin{macrocode}
- \pdfstringdefDisableCommands{\expandafter\def\csname#3\endcsname{%
- \IfNoValueTF{#2}{#3}{#2} }%
- }
-% \end{macrocode}
-% Provide the singular acronym macro in math mode.
-% \begin{macrocode}
- \expandafter\mathdef\csname#3\endcsname{%
- \text{\glsxtrshort{#3}}\glsunset{#3}%
- }
-% \end{macrocode}
-% Provide the plural acronym macro.
-% \begin{macrocode}
- \expandafter\newcommand\csname#3s\endcsname{%
- \if@begin@of@sentence{\cGlspl{#3}}{\cglspl{#3}}\@\xspace%
- }
-% \end{macrocode}
-% Expand the plural acronym macro in \PDF labels.
-% \begin{macrocode}
- \pdfstringdefDisableCommands{\expandafter\def\csname#3s\endcsname{%
- \IfBooleanTF{#1}{#3}{\IfNoValueTF{#2}{#3s}{#2s}} }%
- }
-% \end{macrocode}
-% Provide the plural acronym macro in math mode.
-% \begin{macrocode}
- \expandafter\mathdef\csname#3s\endcsname{%
- \text{\glsxtrshortpl{#3}}\glsunset{#3}%
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\shortacronym}
-% The |\shortacronym| never expands into the long form.
-% \begin{macrocode}
-\DeclareDocumentCommand{\shortacronym}{somm}{
- \newabbreviation[
- \glsshortpluralkey=\IfBooleanTF{#1}{#3}{\IfNoValueTF{#2}{#3s}{#2s}}
- ]{#3}{\IfNoValueTF{#2}{#3}{#2}}{#4}
-% \end{macrocode}
-% Provide the singular acronym macro.
-% \begin{macrocode}
- \expandafter\newcommand\csname#3\endcsname{\cgls*{#3}\@\xspace}
-% \end{macrocode}
-% Expand the singular acronym macro in \PDF labels.
-% \begin{macrocode}
- \pdfstringdefDisableCommands{\expandafter\def\csname#3\endcsname{%
- \IfNoValueTF{#2}{#3}{#2} }%
- }
-% \end{macrocode}
-% Provide the singular acronym macro in math mode.
-% \begin{macrocode}
- \expandafter\mathdef\csname#3\endcsname{\text{\glsxtrshort*{#3}}}
-% \end{macrocode}
-% Provide the plural acronym macro.
-% \begin{macrocode}
- \expandafter\newcommand\csname#3s\endcsname{\cglspl*{#3}\@\xspace}
-% \end{macrocode}
-% Expand the plural acronym macro in \PDF labels.
-% \begin{macrocode}
- \pdfstringdefDisableCommands{\expandafter\def\csname#3s\endcsname{%
- \IfBooleanTF{#1}{#3}{\IfNoValueTF{#2}{#3s}{#2s}} }%
- }
-% \end{macrocode}
-% Provide the plural acronym macro in math mode.
-% \begin{macrocode}
- \expandafter\mathdef\csname#3s\endcsname{\text{\glsxtrshortpl*{#3}}}%
- \glsunset{#3}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\longacronym}
-% The |\longacronym| never shows the abbreviated form.
-% \begin{macrocode}
-\DeclareDocumentCommand{\longacronym}{sommo}{
-% \end{macrocode}
-% Provide the singular acronym macro.
-% \begin{macrocode}
- \expandafter\newcommand\csname#3\endcsname{%
- \if@begin@of@sentence{\MakeUppercase#4}{#4}\@\xspace%
- }
-% \end{macrocode}
-% Expand the singular acronym macro in \PDF labels.
-% \begin{macrocode}
- \pdfstringdefDisableCommands{\expandafter\def\csname#3\endcsname{#4 }}
-% \end{macrocode}
-% Provide the plural acronym macro.
-% \begin{macrocode}
- \expandafter\newcommand\csname#3s\endcsname{%
- \if@begin@of@sentence{%
- \IfNoValueTF{#5}{\MakeUppercase#4s}{\MakeUppercase#5}%
- }{%
- \IfNoValueTF{#5}{#4s}{#5}}\@\xspace%
- }
-% \end{macrocode}
-% Expand the plural acronym macro in \PDF labels.
-% \begin{macrocode}
- \pdfstringdefDisableCommands{\expandafter\def\csname#3s\endcsname{%
- \IfNoValueTF{#5}{#4s}{#5} }%
- }
-}
-% \end{macrocode}
-% \end{macro}
-% Silence warning if no acronyms are defined.
-% \begin{macrocode}
-\renewcommand*{\@gls@write@entrycounts}{%
- \immediate\write\@auxout{%
- \string\providecommand*{\string\@gls@entry@count}[2]{}
- }%
- \count@=0\relax
- \forallglsentries{\@glsentry}{%
- \glshasattribute{\@glsentry}{entrycount}{%
- \ifglsused{\@glsentry}{%
- \immediate\write\@auxout{%
- \string\@gls@entry@count{\@glsentry}{%
- \glsentrycurrcount{\@glsentry}%
- }
- }%
- }{}\advance\count@ by \@ne
- }{}%
- }%
-}
-% \end{macrocode}
-% \begin{macro}{\resetacronym}
-% \begin{macro}{\dummyacronym}
-% Add two macros for acronym management.
-% \begin{macrocode}
-\newcommand{\resetacronym}[1]{\protect\glsreset{#1}}
-\newcommand{\dummyacronym}[1]{\protect\glsunset{#1}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% End of glossaries if.
-% \begin{macrocode}
-\fi
-% \end{macrocode}
-%
-% \Finale
-
-\endinput
-
-% \PrintIndex
-% makeindex -s gglo.ist -o hep-paper.gls hep-paper.glo
-% makeindex -s gglo.ist -o hep-paper.ind hep-paper.idx
diff --git a/Master/texmf-dist/source/latex/hep-paper/hep-paper.ins b/Master/texmf-dist/source/latex/hep-paper/hep-paper.ins
index b88c8423a57..ab97a338cf2 100644
--- a/Master/texmf-dist/source/latex/hep-paper/hep-paper.ins
+++ b/Master/texmf-dist/source/latex/hep-paper/hep-paper.ins
@@ -1,4 +1,3 @@
-%%
%% Copyright (C) 2019-2020 by Jan Hajer
%%
%% This file may be distributed and/or modified under the
@@ -10,7 +9,6 @@
%%
%% and version 1.3c or later is part of all distributions of
%% LaTeX version 2005/12/01 or later.
-%%
\input docstrip.tex
\keepsilent
@@ -28,7 +26,11 @@ and version 1.3c or later is part of all distributions of
LaTeX version 2005/12/01 or later.
\endpreamble
-\generate{\file{hep-paper.sty}{\from{hep-paper.dtx}{package}}}
+\generate{
+ \file{hep-paper.sty}{\from{hep-paper-implementation.dtx}{package}}
+ \file{hep-paper.dbx}{\from{hep-paper-implementation.dtx}{datamodel}}
+ \file{hep-paper-documentation.tex}{\from{hep-paper-implementation.dtx}{documentation}}
+}
\Msg{*********************************************************}
\Msg{*}
diff --git a/Master/texmf-dist/source/latex/hitszthesis/Makefile b/Master/texmf-dist/source/latex/hitszthesis/Makefile
index 4bba9876b83..4ebf11aee34 100644
--- a/Master/texmf-dist/source/latex/hitszthesis/Makefile
+++ b/Master/texmf-dist/source/latex/hitszthesis/Makefile
@@ -69,13 +69,13 @@ $(THESISMAIN).idx: $(THESISMAIN).bbl
$(THESISMAIN)_china.idx : $(CLSFILES) $(THESISMAIN).bbl $(THESISMAIN).idx
- splitindex $(THESISMAIN) -- -s $(PACKAGE).ist # 自动生成索引
+ splitindex $(THESISMAIN) -- -s $(PACKAGE).ist
$(THESISMAIN)_english.ind $(THESISMAIN)_china.ind $(THESISMAIN)_english.idx : $(THESISMAIN)_china.idx
$(THESISMAIN).pdf: $(CLSFILES) $(THESISCONTENTS) $(THESISMAIN)_china.ind $(THESISMAIN)_china.idx $(THESISMAIN)_english.ind $(THESISMAIN)_english.idx $(THESISMAIN).bbl
$(METHOD) $(THESISMAIN)
- splitindex $(THESISMAIN) -- -s $(PACKAGE).ist # 自动生成索引
+ splitindex $(THESISMAIN) -- -s $(PACKAGE).ist
$(METHOD) $(THESISMAIN)
$(THESISMAIN).bbl: $(BIBFILE)
diff --git a/Master/texmf-dist/source/latex/hitszthesis/compile.bat b/Master/texmf-dist/source/latex/hitszthesis/compile.bat
index 3ef4d414633..3c99e2cb441 100755
--- a/Master/texmf-dist/source/latex/hitszthesis/compile.bat
+++ b/Master/texmf-dist/source/latex/hitszthesis/compile.bat
@@ -10,13 +10,11 @@ if %flag%x == x (
)
if %flag%x == thesisx (
- call :cleanall
call :thesis
if ERRORLEVEL 1 (
echo Error! Please check the 'main.log' for more details...
pause
) else (
- call :clean
echo Finished!
)
goto :EOF
@@ -54,6 +52,13 @@ if %flag%x == wordcountx (
goto :EOF
)
+if %flag%x == devx (
+ call :doc
+ call :thesis
+ call :cleanall
+ goto :EOF
+)
+
:help
echo This is the compile batch script for hitszhesis.
echo Usage:
@@ -72,7 +77,7 @@ goto :EOF
echo Compile thesis...
latex %PACKAGE%.ins
xelatex -shell-escape %THESIS%.tex
- bibtex %THESIS%.tex
+ bibtex %THESIS%
xelatex -shell-escape %THESIS%.tex
xelatex -shell-escape %THESIS%.tex
splitindex %THESIS% -- -s hitszthesis.ist
@@ -99,11 +104,12 @@ goto :EOF
latexmk -c %PACKAGE%.dtx
latexmk -c %THESIS%
del *.xdv *.hd *.aux front\*.aux body\*.aux back\*.aux >nul 2>nul
+ del main-china.idx main-english.idx >nul 2>nul
goto :EOF
:cleanall
- echo Clean pdf files...
- del /Q %PACKAGE%.pdf %THESIS%.pdf >nul 2>nul
+ echo Clean class files...
+ del %PACKAGE%.cls %PACKAGE%.cfg dtx-style.sty >nul 2>nul
goto :clean
goto :EOF
diff --git a/Master/texmf-dist/source/latex/hitszthesis/hitszthesis.dtx b/Master/texmf-dist/source/latex/hitszthesis/hitszthesis.dtx
index feb49f4a6be..5cf1c8adaf0 100644
--- a/Master/texmf-dist/source/latex/hitszthesis/hitszthesis.dtx
+++ b/Master/texmf-dist/source/latex/hitszthesis/hitszthesis.dtx
@@ -8,7 +8,7 @@
% 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.
+% version 2008/05/04 or later.
%
% This work has the LPPL1.3c maintenance status `maintained'.
%
@@ -16,7 +16,7 @@
%
% \iffalse
%<*driver>
-\ProvidesFile{hitszthesis.dtx}[2020/03/10 3.0 Dissertation Template for Harbin Institute of Technology, ShenZhen (HITSZ)]
+\ProvidesFile{hitszthesis.dtx}[2020/06/23 3.2 Dissertation Template for Harbin Institute of Technology, ShenZhen (HITSZ)]
\documentclass{ltxdoc}
\usepackage{dtx-style}
@@ -77,6 +77,7 @@
% \changes{v2.2}{2020/03/04}{Omit sections of appendix in toc}
% \changes{v2.3}{2020/03/05}{Add math font option XITS}
% \changes{v2.3}{2020/03/05}{Add boldcaption option to control the caption font}
+% \changes{v3.0}{2020/03/10}{Add support to master and doctor dissertations}
%
% \def\indexname{索引}
% \def\glossaryname{修改记录}
@@ -93,7 +94,7 @@
%
% \def\abstractname{\Large 摘\quad 要}
% \begin{abstract}\normalsize\vskip0.5cm
-% \hitszthesis 宏包旨在建立一个{\bfseries 规格严格、功夫到家}的哈尔滨工业大学(深圳)学位论文模板,目前包含本硕博毕业设计(论文)模板。模板的构建基于 \pkg{hitszthesis.dtx} 与 \pkg{hitszthesis.ins},在使用本模板之前,请仔细阅读\file{hitszthesis.pdf}(本文件)、\file{main.tex}(撰写示例)及\file{main.pdf}(撰写效果)。
+% \hitszthesis 宏包旨在建立一个{\bfseries 规格严格、功夫到家}的哈尔滨工业大学(深圳)学位论文模板,目前包含本硕博毕业设计(论文)模板。模板的构建基于 \pkg{hitszthesis.dtx} 与 \pkg{hitszthesis.ins},在使用本模板之前,请仔细阅读\file{hitszthesis.pdf}(本文件)、\file{main.tex}(撰写示例)及\file{hitszthesis-bachelor.pdf}、\file{hitszthesis-master.pdf} 与 \file{hitszthesis-doctor.pdf}(撰写效果)。
% \end{abstract}
%
% \vskip1.5cm
@@ -856,9 +857,9 @@
% \DescribeEnv{itemize}
% \DescribeEnv{enumerate}
% \DescribeEnv{description}
-% 为了适合中文习惯,模板将这三个常用的列表环境用 \pkg{enumitem} 进行了纵向间距压
+% 为了适合中文习惯,模板将这三个常用的列表环境用 \env{enumitem} 进行了纵向间距压
% 缩。一方面清除了多余空间,另一方面用户可以自己指定列表环境的样式(如标签符号,
-% 缩进等)。细节请参看 \pkg{enumitem} 文档,此处不再赘述。
+% 缩进等)。细节请参看 \env{enumitem} 文档,此处不再赘述。
% \subsection{后文}
%
% \subsubsection{结论}
@@ -868,7 +869,7 @@
% \lstinputlisting[style=lstStyleLaTeX]{back/conclusion.tex}
%
% \subsubsection{参考文献}
-% 在后文中的参考文献是自动生成的,不需要用户干预,具体命令在\file{main.tex} 中有
+% 在后文中的参考文献是自动生成的,不需要用户干预,具体命令在 \file{main.tex} 中有
% 示例。
%
% \subsubsection{附录}
@@ -881,6 +882,11 @@
% \end{appendix}
% \end{latex}
%
+% 若需要附录从1开始编页码,在第一篇附录的 \cs{chapter} 后面
+% 写上 \cs{SetPageNumberingFromOne} 命令即可。
+% 若要求附录部分不含页码,则在 \env{appendix} 环境之前
+% 写上 \cs{SetAppendixWithOnlyHeadings}命令。
+%
% \subsubsection{所发表文章}
% \DescribeEnv{publication}
% \PGR 与\UGR\ 中都没有明确规定此处的格式,以下仅为示例。
@@ -931,7 +937,7 @@
%<cls>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<cls>\ProvidesClass{hitszthesis}
%<cfg>\ProvidesFile{hitszthesis.cfg}
-%<cls|cfg>[2020/03/10 3.0 Dissertation Template for Harbin Institute of Technology, ShenZhen (HITSZ)]
+%<cls|cfg>[2020/06/23 3.2 Dissertation Template for Harbin Institute of Technology, ShenZhen (HITSZ)]
% \end{macrocode}
%
% \subsection{定义选项}
@@ -1071,6 +1077,11 @@
\DeclareBoolOption[true]{absupper}
% \end{macrocode}
%
+% 本科附录章节编号是否为大写字母
+% \begin{macrocode}
+\DeclareBoolOption[true]{alphappendix}
+% \end{macrocode}
+%
% 此处添加控制本科论文的页码横线选项
% \begin{macrocode}
\DeclareBoolOption[true]{bsmainpagenumberline}
@@ -1476,9 +1487,7 @@ delim_1 "\\hspace*{\\fill}"
% \begin{macrocode}
%<*cls>
\renewcommand\normalsize{%
- \@setfontsize\normalsize{12bp}{ \ifhitsz@glue 20.50398bp \@plus 2.83465bp \@minus 0bp
- \else 19.27374bp
- \fi}%
+ \@setfontsize\normalsize{12bp}{19.27374bp \@plus 2bp \@minus 2bp}%
\abovedisplayskip=8pt
\abovedisplayshortskip=8pt
\belowdisplayskip=\abovedisplayskip
@@ -1585,14 +1594,13 @@ delim_1 "\\hspace*{\\fill}"
% \label{sec:headerfooter}
%
% \begin{macro}{\hitsz@empty}
-% \begin{macro}{\hitsz@plain}
+% \begin{macro}{\hitsz@onlyheadings}
% \begin{macro}{\hitsz@headings}
% 定义三种页眉页脚格式:
% \begin{itemize}
% \item \texttt{hitsz@empty}:页眉页脚都没有
-% \item \texttt{hitsz@plain}:只显示页脚的页码。\cs{chapter} 自动调用
-% \cs{thispagestyle\{hitsz@plain\}}。
-% \item \texttt{hitsz@headings}:页眉页脚同时显示
+% \item \texttt{hitsz@onlyheadings}:只显示页眉。
+% \item \texttt{hitsz@headings}:页眉页脚同时显示。
% \end{itemize}
% \begin{macrocode}
%<*cls>
@@ -1603,9 +1611,15 @@ delim_1 "\\hspace*{\\fill}"
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
}
+\fancypagestyle{hitsz@onlyheadings}{%
+ \fancyhf{}
+ \fancyhead[C]{\songti\xiaowu[0]%
+ \hitsz@cschoolname\hitsz@bachelor@cxuewei\hitsz@bachelor@cthesisname}%
+}
% \end{macrocode}
%
% 此处根据本科生模板的多种版本,提供选项自定义页码、页眉样式。
+% \changes{v3.2}{2020/06/23}{Omit '深圳' in second titlepage, heading and authorization title}
% \begin{macrocode}
\fancypagestyle{hitsz@headings}{%
\fancyhf{}
@@ -1645,7 +1659,7 @@ delim_1 "\\hspace*{\\fill}"
\fi
\ifhitsz@shenzhen
\fancyhead[C]{\songti\xiaowu[0]%
- \hitsz@cschoolname\hitsz@shenzhencampus\hitsz@bachelor@cxuewei\hitsz@bachelor@cthesisname}%
+ \hitsz@cschoolname\hitsz@bachelor@cxuewei\hitsz@bachelor@cthesisname}%
\fi
\ifhitsz@weihai
\fancyhead[C]{\songti\xiaowu[0]%
@@ -2078,7 +2092,7 @@ delim_1 "\\hspace*{\\fill}"
chapter={
afterindent=true,
pagestyle={hitsz@headings},
- beforeskip={24.74658bp},%一个空行 1.57481 × 18
+ beforeskip={18.74658bp},%一个空行 1.57481 × 18
afterskip={24.74658bp},%0.8应该不计算间距 0.8 × 18 + 0.57481×18
aftername=\enspace,
format={\centering\hitsz@title@font\xiaoer[1.57481]},%\center 会影响之后全局
@@ -2326,17 +2340,18 @@ delim_1 "\\hspace*{\\fill}"
\hitsz@def@term{natclassifiedindex} %国内图书分类号
\hitsz@def@term{intclassifiedindex} %国际图书分类号
-\hitsz@def@term{ctitlecover} %中文标题封面
-\hitsz@def@term{ctitle} %中文标题
-\hitsz@def@term{csubtitle} %中文副标题
-\hitsz@def@term{cxueke} %中文学科
-\hitsz@def@term{cauthor} %中文作者
-\hitsz@def@term{csupervisor} %中文导师
-\hitsz@def@term{cassosupervisor} %中文副导师
-\hitsz@def@term{ccosupervisor}%中文联合导师
-\hitsz@def@term{caffil}%中文院系
-\hitsz@def@term{csubject}%中文专业
-\hitsz@def@term{cdate}
+\hitsz@def@term{ctitlecover} % 中文标题封面
+\hitsz@def@term{ctitle} % 中文标题
+\hitsz@def@term{csubtitle} % 中文副标题
+\hitsz@def@term{cxueke} % 中文学科
+\hitsz@def@term{cauthor} % 中文作者
+\hitsz@def@term{csupervisor} % 中文导师
+\hitsz@def@term{cassosupervisor} % 中文副导师
+\hitsz@def@term{ccosupervisor} % 中文联合导师
+\hitsz@def@term{caffil} % 中文院系
+\hitsz@def@term{csubject} % 中文专业
+\hitsz@def@term{cdate} % 封面日期指定
+\hitsz@def@term{cdatesecond} % 第二页日期指定
\hitsz@def@term{cstudentid}%
\hitsz@def@term{cstudenttype}%
@@ -2479,7 +2494,7 @@ delim_1 "\\hspace*{\\fill}"
哈尔滨工业大学本科毕业设计(论文)原创性声明
\else%
\ifhitsz@shenzhen%
- 哈尔滨工业大学(深圳)本科毕业设计(论文)原创性声明
+ 哈尔滨工业大学本科毕业设计(论文)原创性声明
\else%
\ifhitsz@weihai%
哈尔滨工业大学(威海)本科毕业设计(论文)原创性声明
@@ -2491,6 +2506,14 @@ delim_1 "\\hspace*{\\fill}"
本人郑重声明:在哈尔滨工业大学攻读学士学位期间,所提交的毕业设计(论文)《\hitsz@ctitle》,是本人在导师指导下独立进行研究工作所取得的成果。对本文的研究工作做出重要贡献的个人和集体,均已在文中以明确方式注明,其它未注明部分不包含他人已发表或撰写过的研究成果,不存在购买、由他人代写、剽窃和伪造数据等作假行为。
本人愿为此声明承担法律责任。}
+\newcommand{\hitsz@authorizationtext@bachelor@shenzhen}{%
+本人郑重声明:在哈尔滨工业大学(深圳)攻读学士学位期间,所提交的毕业设计(论文)《\hitsz@ctitle》,是本人在导师指导下独立进行研究工作所取得的成果。对本文的研究工作做出重要贡献的个人和集体,均已在文中以明确方式注明,其它未注明部分不包含他人已发表或撰写过的研究成果,不存在购买、由他人代写、剽窃和伪造数据等作假行为。
+
+本人愿为此声明承担法律责任。}
+\newcommand{\hitsz@authorizationtext@bachelor@weihai}{%
+本人郑重声明:在哈尔滨工业大学(威海)攻读学士学位期间,所提交的毕业设计(论文)《\hitsz@ctitle》,是本人在导师指导下独立进行研究工作所取得的成果。对本文的研究工作做出重要贡献的个人和集体,均已在文中以明确方式注明,其它未注明部分不包含他人已发表或撰写过的研究成果,不存在购买、由他人代写、剽窃和伪造数据等作假行为。
+
+本人愿为此声明承担法律责任。}
\newcommand{\hitsz@declarename}{学位论文原创性声明}
\newcommand{\hitsz@declaretext}{%
本人郑重声明:此处所提交的学位论文《\hitsz@ctitle》,是本人在导师指导下,在哈尔滨工业大学攻读学位期间独立进行研究工作所取得的成果,且学位论文中除已标注引用文献的部分外不包含他人完成或已发表的研究成果。对本学位论文的研究工作做出重要贡献的个人和集体,均已在文中以明确方式注明。}
@@ -2507,6 +2530,8 @@ delim_1 "\\hspace*{\\fill}"
% \end{macrocode}
%
% 中英文封面。
+% \changes{v3.0.3}{2020/03/12}{Change titlepage description of master dissertation}
+% \changes{v3.0.4}{2020/03/13}{Change second bachelor titilepage from heiti to songti}
% \begin{macrocode}
%<*cls>
\newlength{\hitsz@title@width}
@@ -2558,7 +2583,7 @@ delim_1 "\\hspace*{\\fill}"
% 此处深圳校区竟然是左对齐。另外,院系名称也有点不一样。
% \begin{macrocode}
\ifhitsz@shenzhen%
- \begin{tabular}{rl}%
+ \begin{tabular}{@{}r@{}@{}l@{\qquad}}%
\else%
\begin{tabular}{rc}%
\fi%
@@ -2578,7 +2603,7 @@ delim_1 "\\hspace*{\\fill}"
{\hitsz@put@title{\hitsz@bachelor@cstudentidtitle}\hitsz@title@csep} & \hitsz@cstudentid
\end{tabular}
\ifhitsz@shenzhen%
- \begin{tabular}{rl}%
+ \begin{tabular}{@{}r@{}@{}l@{}}%
\else%
\begin{tabular}{rc}%
\fi%
@@ -2600,17 +2625,16 @@ delim_1 "\\hspace*{\\fill}"
\newcommand{\hitsz@second@titlepage@bachelor}{
\vspace*{0.8cm}
\ifhitsz@harbin%
- \centering{\includegraphics[width=6.2cm]{hitlogo}}
- \else%
- \ifhitsz@shenzhen%
- \centering{\includegraphics[width=6.2cm]{hitlogo}~~\raisebox{0.2em}{%
- \kaishu\yihao\hitsz@shenzhencampus}}
+ \centering{\includegraphics[width=6.2cm]{hitlogo}}
\else%
- \ifhitsz@weihai%
- \centering{\includegraphics[width=6.2cm]{hitlogo}~~\raisebox{0.2em}{%
- \kaishu\yihao\hitsz@weihaicampus}}
- \fi%
- \fi%
+ \ifhitsz@shenzhen%
+ \centering{\includegraphics[width=6.2cm]{hitlogo}}
+ \else%
+ \ifhitsz@weihai%
+ \centering{\includegraphics[width=6.2cm]{hitlogo}~~\raisebox{0.2em}{%
+ \kaishu\yihao\hitsz@weihaicampus}}
+ \fi%
+ \fi%
\fi%
\vspace{1.3cm}
\begin{center}
@@ -2623,36 +2647,36 @@ delim_1 "\\hspace*{\\fill}"
\ifhitsz@infoleft
\begin{tabular}{l@{\ \ }l}
{\xiaoer \hitsz@put@title{\hitsz@bachelor@cthesistitle}} &
- \underline{\makebox[\infowidth][l]{\hspace*{1em}\xiaoer \hitsz@ctitleone}}\\
- & \underline{\makebox[\infowidth][l]{\hspace*{1em}\xiaoer \hitsz@ctitletwo}}\\
+ \underline{\makebox[\infowidth][l]{\hspace*{1em}\xiaoer\songti\textbf{\hitsz@ctitleone}}}\\
+ & \underline{\makebox[\infowidth][l]{\hspace*{1em}\xiaoer\songti\textbf{\hitsz@ctitletwo}}}\\
& \\
{\hitsz@put@title{\hitsz@bachelor@cmajortitle}} &
- \underline{\makebox[\infowidth][l]{\hspace*{1em}\hitsz@csubject}}\\
+ \underline{\makebox[\infowidth][l]{\hspace*{1em}\songti\textbf{\hitsz@csubject}}}\\
{\hitsz@put@title{\hitsz@bachelor@cstudentidtitle}} &
- \underline{\makebox[\infowidth][l]{\hspace*{1em}\hitsz@cstudentid}}\\
+ \underline{\makebox[\infowidth][l]{\hspace*{1em}\songti\textbf{\hitsz@cstudentid}}}\\
{\hitsz@put@title{\hitsz@bachelor@cstudenttitle}} &
- \underline{\makebox[\infowidth][l]{\hspace*{1em}\hitsz@cauthor}}\\
+ \underline{\makebox[\infowidth][l]{\hspace*{1em}\songti\textbf{\hitsz@cauthor}}}\\
{\hitsz@put@title{\hitsz@bachelor@csupervisortitle}} &
- \underline{\makebox[\infowidth][l]{\hspace*{1em}\hitsz@csupervisor}}\\
+ \underline{\makebox[\infowidth][l]{\hspace*{1em}\songti\textbf{\hitsz@csupervisor}}}\\
{\hitsz@put@title{\hitsz@cdatetitle}} &
- \underline{\makebox[\infowidth][l]{\hspace*{1em}\CJK@todaysmall}}
+ \underline{\makebox[\infowidth][l]{\hspace*{1em}\songti\textbf{\hitsz@cdatesecond}}}
\end{tabular}
\else
\begin{tabular}{l@{\ \ }c}
{\xiaoer \hitsz@put@title{\hitsz@bachelor@cthesistitle}} &
- \underline{\makebox[\infowidth]{\xiaoer \hitsz@ctitleone}}\\
- & \underline{\makebox[\infowidth]{\xiaoer \hitsz@ctitletwo}}\\
+ \underline{\makebox[\infowidth]{\xiaoer\songti\textbf{\hitsz@ctitleone}}}\\
+ & \underline{\makebox[\infowidth]{\xiaoer\songti\textbf{\hitsz@ctitletwo}}}\\
& \\
{\hitsz@put@title{\hitsz@bachelor@cmajortitle}} &
- \underline{\makebox[\infowidth]{\hitsz@csubject}}\\
+ \underline{\makebox[\infowidth]{\songti\textbf{\hitsz@csubject}}}\\
{\hitsz@put@title{\hitsz@bachelor@cstudentidtitle}} &
- \underline{\makebox[\infowidth]{\hitsz@cstudentid}}\\
+ \underline{\makebox[\infowidth]{\songti\textbf{\hitsz@cstudentid}}}\\
{\hitsz@put@title{\hitsz@bachelor@cstudenttitle}} &
- \underline{\makebox[\infowidth]{\hitsz@cauthor}}\\
+ \underline{\makebox[\infowidth]{\songti\textbf{\hitsz@cauthor}}}\\
{\hitsz@put@title{\hitsz@bachelor@csupervisortitle}} &
- \underline{\makebox[\infowidth]{\hitsz@csupervisor}}\\
+ \underline{\makebox[\infowidth]{\songti\textbf{\hitsz@csupervisor}}}\\
{\hitsz@put@title{\hitsz@cdatetitle}} &
- \underline{\makebox[\infowidth]{\CJK@todaysmall}}
+ \underline{\makebox[\infowidth]{\songti\textbf{\hitsz@cdatesecond}}}
\end{tabular}
\fi
\renewcommand{\arraystretch}{1}
@@ -2754,52 +2778,88 @@ delim_1 "\\hspace*{\\fill}"
}
% 英文封面
\newcommand{\emultiline}[2][c]{%
- \renewcommand{\arraystretch}{1}
+ \renewcommand{\arraystretch}{1}%
\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}
\renewcommand{\arraystretch}{1.3}
}
\newcommand{\hitsz@engcover}{
{
\xiaosi[1.667]\noindent Classified Index: \hitsz@natclassifiedindex \\[8pt]
- U.D.C: \hitsz@intclassifiedindex }
+ U.D.C: \hitsz@intclassifiedindex
+ }
\vspace*{1em}
\begin{center}
- \parbox[t][1.6cm][t]{\textwidth}{\begin{center} \end{center} }
- \parbox[t][3.5cm][t]{\textwidth}{\xiaoer[1]
- \begin{center}Dissertation for the {\hitsz@exueweier} Degree in \hitsz@exueke\end{center}
- \ifhitsz@fulltime\relax
- \else%
- \begin{center}
- \hitsz@ebraceleft\hitsz@estudenttype\hitsz@ebraceright
+ \ifhitsz@doctor%博士封面
+ \parbox[t][1.6cm][t]{\textwidth}{\begin{center} \end{center}}
+ \parbox[t][3.5cm][t]{\textwidth}{\xiaoer[1]%
+ \begin{center}%
+ Dissertation for the {\hitsz@exueweier} Degree in \hitsz@exueke
\end{center}
- \fi} %与中文保持一致,删除in {\hitsz@exueke}
+ \ifhitsz@fulltime
+ \relax
+ \else%
+ \begin{center}%
+ \hitsz@ebraceleft\hitsz@estudenttype\hitsz@ebraceright%
+ \end{center}
+ \fi
+ }
+ \else%硕士封面
+ \vspace*{1em}
+ \parbox[t][4.5cm][t]{\textwidth}{\xiaoer[1]%
+ \begin{center}%
+ A dissertation submitted in partial fulfillment of \\[2pt]
+ the requirements for the academic degree of \\[2pt]
+ Master of \hitsz@exueke
+ \end{center}
+ \ifhitsz@fulltime
+ \relax
+ \else%
+ \begin{center}%
+ \hitsz@ebraceleft\hitsz@estudenttype\hitsz@ebraceright%
+ \end{center}
+ \fi
+ }
+ \fi
\parbox[t][7cm][t]{\textwidth}{%
- \begin{center}%
- \settowidth{\hitsz@etitlelength}{%
- \erhao\hitsz@etitle\ifhitsz@subtitle\hitsz@title@esep\hitsz@esubtitle\fi}%
- \ifdim\hitsz@etitlelength>450mm\xiaoer\else\erhao\fi%
- \textbf{\MakeUppercase{\hitsz@etitle}%
-\ifhitsz@subtitle\hitsz@title@esep\MakeUppercase{\hitsz@esubtitle}\fi}\end{center}}
- %★★★★若信息内容不太长,不会引起信息内容分行时,使用tabular环境,否则使用下面的tabularx环境。
+ \begin{center}%
+ \settowidth{\hitsz@etitlelength}{%
+ \erhao\hitsz@etitle%
+ \ifhitsz@subtitle
+ \hitsz@title@esep\hitsz@esubtitle%
+ \fi
+ }%
+ \ifdim\hitsz@etitlelength>450mm\xiaoer\else\erhao\fi%
+ \textbf{\MakeUppercase{\hitsz@etitle}%
+ \ifhitsz@subtitle%
+ \hitsz@title@esep\MakeUppercase{\hitsz@esubtitle}%
+ \fi
+ }
+ \end{center}
+ }
+ % 表格
{\sihao\renewcommand{\arraystretch}{1.3}
\begin{tabular}{@{}l@{~}l@{}}
- \textbf{\hitsz@eauthortitle\hitsz@title@esep} & \hitsz@eauthor\\
- \textbf{\hitsz@esupervisortitle\hitsz@title@esep} & \hitsz@esupervisor\\
- \ifx\hitsz@eassosupervisor\@empty\else%
- \textbf{\hitsz@eassosupervisortitle\hitsz@title@esep} & \hitsz@eassosupervisor\\
- \fi
- \ifx\hitsz@ecosupervisor\@empty\else%
- \textbf{\hitsz@ecosupervisortitle\hitsz@title@esep} & \hitsz@ecosupervisor\\
- \fi
- \textbf{\hitsz@edegreetitle\hitsz@title@esep} & \hitsz@edegree\\
- \textbf{\hitsz@esubjecttitle\hitsz@title@esep} &\hitsz@esubject\\
- \textbf{\hitsz@eaffiltitle\hitsz@title@esep} &\hitsz@eaffil\\
- \textbf{\hitsz@edatetitle\hitsz@title@esep} & \hitsz@edate\\
- \textbf{\hitsz@eschoolnametitle\hitsz@title@esep} & \hitsz@eschoolname
- \end{tabular}\renewcommand{\arraystretch}{1}}
+ \textbf{\hitsz@eauthortitle\hitsz@title@esep} & \hitsz@eauthor\\
+ \textbf{\hitsz@esupervisortitle\hitsz@title@esep} & \hitsz@esupervisor\\
+ \ifx\hitsz@eassosupervisor\@empty%
+ \else%
+ \textbf{\hitsz@eassosupervisortitle\hitsz@title@esep} & \hitsz@eassosupervisor\\
+ \fi
+ \ifx\hitsz@ecosupervisor\@empty%
+ \else%
+ \textbf{\hitsz@ecosupervisortitle\hitsz@title@esep} & \hitsz@ecosupervisor\\
+ \fi
+ \textbf{\hitsz@edegreetitle\hitsz@title@esep} & \hitsz@edegree\\
+ \textbf{\hitsz@esubjecttitle\hitsz@title@esep} &\hitsz@esubject\\
+ \textbf{\hitsz@eaffiltitle\hitsz@title@esep} &\hitsz@eaffil\\
+ \textbf{\hitsz@edatetitle\hitsz@title@esep} & \hitsz@edate\\
+ \textbf{\hitsz@eschoolnametitle\hitsz@title@esep} & \hitsz@eschoolname
+ \end{tabular}
+ \renewcommand{\arraystretch}{1}
+ }
\end{center}
}
-
+% 制作封面
\def\makecover{
\phantomsection
\pdfbookmark[0]{\hitsz@ctitle}{ctitle}
@@ -2976,7 +3036,7 @@ delim_1 "\\hspace*{\\fill}"
% \end{macrocode}
%
% 此处临时更改一下对齐方式。\CTeX\ 似乎无法应对双语目录。
-% 删除增加\cs{hangindent}的方法,其原因是\cs{numberline}多出一个空格
+% 删除增加 \cs{hangindent} 的方法,其原因是 \cs{numberline} 多出一个空格
% \begin{macrocode}
\@starttoc{toe}%
\if@restonecol\twocolumn\fi}
@@ -2986,19 +3046,60 @@ delim_1 "\\hspace*{\\fill}"
% 目录中附录的章号格式。
% \begin{macrocode}
\ctexset{%
- appendix/number=\ifhitsz@bachelor\arabic{chapter}\else\Alph{chapter}\fi,
+ appendix/number=\ifhitsz@bachelor%
+ \ifhitsz@alphappendix%
+ \Alph{chapter}%
+ \else%
+ \arabic{chapter}%
+ \fi%
+ \else%
+ \Alph{chapter}%
+ \fi,%
}
% \end{macrocode}
%
% 设置附录、结论、参考文献等格式。
+% \changes{v3.1}{2020/05/25}{Add support to Alph abstract title for bachelor thesis}
+% \changes{v3.2}{2020/06/23}{Add \env{algorithmen} environment for original english paper}
+% \changes{v3.2}{2020/06/23}{Add \cs{appendixcaption} command for captions in original english paper}
% \begin{macrocode}
\let\hitsz@appendix\appendix
\renewenvironment{appendix}{%
- \let\title\hitsz@appendix@title
- \hitsz@appendix
- \ifhitsz@bachelor\renewcommand{\thechapter}{\arabic{chapter}}\fi
+ \let\title\hitsz@appendix@title%
+ \hitsz@appendix%
+ \ifhitsz@bachelor%
+ \ifhitsz@alphappendix%
+ \renewcommand{\thechapter}{\Alph{chapter}}%
+ \else%
+ \renewcommand{\thechapter}{\arabic{chapter}}%
+ \fi%
+ \fi%
}{%
- \let\title\@gobble}
+ \let\title\@gobble%
+}
+% 支持附录算法英文标题
+\newenvironment{algorithmen}[1][htb]{
+ \renewcommand{\algorithmcfname}{Algorithm}%
+ \begin{algorithm}[#1]%
+}{%
+ \end{algorithm}
+}
+% 支持附录图表编号
+\newcommand{\appendixcaption}[1]{\centering\wuhao#1}
+% \end{macrocode}
+%
+% 附录页码重新编号
+% \changes{v3.2}{2020/06/23}{Add \cs{SetPageNumberingFromOne} command to set page numberging from 1}
+% \changes{v3.2}{2020/06/23}{Add \cs{SetAppendixWithOnlyHeadings} command to set appendix with only headings, i.e., without page number in bottom center}
+% \begin{macrocode}
+\newcommand{\SetPageNumberingFromOne}{\setcounter{page}{1}}
+\newcommand{\SetAppendixWithOnlyHeadings}{
+ \ctexset{
+ chapter/pagestyle = {hitsz@onlyheadings},
+ }
+ \thispagestyle{hitsz@headings}
+ \pagestyle{hitsz@onlyheadings}
+}
\let\title\@gobble
\newcommand{\hitsz@appendix@title}[1]{%
\begin{center}
@@ -3075,11 +3176,19 @@ delim_1 "\\hspace*{\\fill}"
}
\def\hitsz@authorization@bachelor{%
\ifhitsz@openright\cleardoublepage\else\clearpage\fi
- \chapter*{\ifhitsz@harbin\relax\else\sanhao\fi\hitsz@declarename@bachelor}
+ \chapter*{\ifhitsz@weihai\sanhao\fi\hitsz@declarename@bachelor}
\addcontentsline{toc}{chapter}{\hitsz@authorization@bachelor@toc}
- \hitsz@authorizationtext@bachelor
-\vspace{2\baselineskip}
-\par\hspace{6em}\hitsz@authorsig\hfill\hitsz@frontdate\hitsz@datefill
+ \ifhitsz@shenzhen%
+ \hitsz@authorizationtext@bachelor@shenzhen
+ \else%
+ \ifhitsz@weihai%
+ \hitsz@authorizationtext@bachelor@weihai
+ \else%
+ \hitsz@authorizationtext@bachelor
+ \fi%
+ \fi%
+ \vspace{2\baselineskip}
+ \par\hspace{6em}\hitsz@authorsig\hfill\hitsz@frontdate\hitsz@datefill
}
\NewDocumentCommand{\authorization}{o}{%
diff --git a/Master/texmf-dist/source/latex/hitszthesis/hitszthesis.ins b/Master/texmf-dist/source/latex/hitszthesis/hitszthesis.ins
index 7f9842300c5..7ea7581114e 100644
--- a/Master/texmf-dist/source/latex/hitszthesis/hitszthesis.ins
+++ b/Master/texmf-dist/source/latex/hitszthesis/hitszthesis.ins
@@ -1,18 +1,18 @@
%%
-% Copyright (C) 2019-2020 by Jingxuan Yang <yanglatex2e@gmail.com>
+%% Copyright (C) 2019-2020 by Jingxuan Yang <yanglatex2e@gmail.com>
%%
%% This file is part of the hitszthesis package project.
%% ---------------------------------------------------
%%
%% This file may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3a
+%% 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.3a or later is part of all distributions of LaTeX
-%% version 2004/10/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008/05/04 or later.
%%
\input docstrip
@@ -31,14 +31,14 @@ This is a generated file.
Copyright (C) 2019-2020 by Jingxuan Yang <yanglatex2e@gmail.com>
This file may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3a
+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.3a or later is part of all distributions of LaTeX
-version 2004/10/01 or later.
+and version 1.3c or later is part of all distributions of LaTeX
+version 2008/05/04 or later.
To produce the documentation run the original source files ending with `.dtx'
through LaTeX.
@@ -52,14 +52,14 @@ This is a generated file.
Copyright (C) 2019-2020 by Jingxuan Yang <yanglatex2e@gmail.com>
This file may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3a
+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.3a or later is part of all distributions of LaTeX
-version 2004/10/01 or later.
+and version 1.3c or later is part of all distributions of LaTeX
+version 2008/05/04 or later.
This is the configuration file of the hitszthesis package with LaTeX2e.
@@ -71,14 +71,14 @@ This is a generated file.
Copyright (C) 2019-2020 by Jingxuan Yang <yanglatex2e@gmail.com>
This file may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3a
+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.3a or later is part of all distributions of LaTeX
-version 2004/10/01 or later.
+and version 1.3c or later is part of all distributions of LaTeX
+version 2008/05/04 or later.
This is the configuration file of the hitszthesis package with LaTeX2e.
diff --git a/Master/texmf-dist/source/latex/oberdiek/hopatch.dtx b/Master/texmf-dist/source/latex/hopatch/hopatch.dtx
index 17712fc2cc2..8071f7456e5 100644
--- a/Master/texmf-dist/source/latex/oberdiek/hopatch.dtx
+++ b/Master/texmf-dist/source/latex/hopatch/hopatch.dtx
@@ -1,13 +1,13 @@
% \iffalse meta-comment
%
% File: hopatch.dtx
-% Version: 2016/05/16 v1.3
+% Version: 2020-08-01 v1.4
% Info: Wrapper for package hooks
%
% Copyright (C)
% 2011, 2012 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
-% https://github.com/ho-tex/oberdiek/issues
+% 2016-2020 Oberdiek Package Support Group
+% https://github.com/ho-tex/hopatch/issues
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -23,7 +23,7 @@
%
% The Current Maintainers of this work are
% Heiko Oberdiek and the Oberdiek Package Support Group
-% https://github.com/ho-tex/oberdiek/issues
+% https://github.com/ho-tex/hopatch/issues
%
% This work consists of the main source file hopatch.dtx
% and the derived files
@@ -31,8 +31,8 @@
% hopatch-test1.tex, hopatch-test2.tex.
%
% Distribution:
-% CTAN:macros/latex/contrib/oberdiek/hopatch.dtx
-% CTAN:macros/latex/contrib/oberdiek/hopatch.pdf
+% CTAN:macros/latex/contrib/hopatch/hopatch.dtx
+% CTAN:macros/latex/contrib/hopatch/hopatch.pdf
%
% Unpacking:
% (a) If hopatch.ins is present:
@@ -61,9 +61,9 @@
% pdflatex hopatch.dtx
%
% Installation:
-% TDS:tex/latex/oberdiek/hopatch.sty
-% TDS:doc/latex/oberdiek/hopatch.pdf
-% TDS:source/latex/oberdiek/hopatch.dtx
+% TDS:tex/latex/hopatch/hopatch.sty
+% TDS:doc/latex/hopatch/hopatch.pdf
+% TDS:source/latex/hopatch/hopatch.dtx
%
%<*ignore>
\begingroup
@@ -80,7 +80,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: hopatch 2016/05/16 v1.3 Wrapper for package hooks (HO)}
+\Msg{* Package: hopatch 2020-08-01 v1.4 Wrapper for package hooks (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -92,11 +92,11 @@
This is a generated file.
Project: hopatch
-Version: 2016/05/16 v1.3
+Version: 2020-08-01 v1.4
Copyright (C)
2011, 2012 Heiko Oberdiek
- 2016-2019 Oberdiek Package Support Group
+ 2016-2020 Oberdiek Package Support Group
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -112,12 +112,12 @@ This work has the LPPL maintenance status "maintained".
The Current Maintainers of this work are
Heiko Oberdiek and the Oberdiek Package Support Group
-https://github.com/ho-tex/oberdiek/issues
+https://github.com/ho-tex/hopatch/issues
This work consists of the main source file hopatch.dtx
and the derived files
- hopatch.sty, hopatch.pdf, hopatch.ins, hopatch.drv,
+ hopatch.sty, hopatch-2016-05-16.sty, hopatch.pdf, hopatch.ins, hopatch.drv,
hopatch-test1.tex, hopatch-test2.tex.
\endpreamble
@@ -126,9 +126,10 @@ and the derived files
\generate{%
\file{hopatch.ins}{\from{hopatch.dtx}{install}}%
\file{hopatch.drv}{\from{hopatch.dtx}{driver}}%
- \usedir{tex/latex/oberdiek}%
+ \usedir{tex/latex/hopatch}%
+ \file{hopatch-2016-05-16.sty}{\from{hopatch.dtx}{packagefrozen}}%
\file{hopatch.sty}{\from{hopatch.dtx}{package}}%
-% \usedir{doc/latex/oberdiek/test}%
+% \usedir{doc/latex/hopatch/test}%
% \file{hopatch-test1.tex}{\from{hopatch.dtx}{test1}}%
% \file{hopatch-test2.tex}{\from{hopatch.dtx}{test2}}%
}
@@ -157,7 +158,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{hopatch.drv}%
- [2016/05/16 v1.3 Wrapper for package hooks (HO)]%
+ [2020-08-01 v1.4 Wrapper for package hooks (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}[2011/11/22]
\usepackage{caption}
@@ -175,9 +176,9 @@ and the derived files
% \GetFileInfo{hopatch.drv}
%
% \title{The \xpackage{hopatch} package}
-% \date{2016/05/16 v1.3}
+% \date{2020-08-01 v1.4}
% \author{Heiko Oberdiek\thanks
-% {Please report any issues at \url{https://github.com/ho-tex/oberdiek/issues}}}
+% {Please report any issues at \url{https://github.com/ho-tex/hopatch/issues}}}
%
% \maketitle
%
@@ -188,8 +189,22 @@ and the derived files
% \end{abstract}
%
% \tableofcontents
+% \newpage
+% \section{Documentation for version 1.4}
+% Starting with this version
%
-% \section{Documentation}
+% \begin{declcs}{hopatch@AfterPackage} \M{package} \M{patch code}
+% \end{declcs}
+%
+% will use the kernel \texttt{package/after/\meta{package}} hook if a
+% LaTeX format later then 2020/20/01 is detected. This can mean that the
+% hook code is executed earlier than with version 1.3 (but always after the
+% \meta{package}.
+% If \meta{package} is already loaded, the \meta{patch code} is executed
+% immediately. If an older format is detected if will fall back to the code of
+% version 1.3.
+%
+% \section{Documentation for version 1.3}
%
% Sometimes I want to add code right after a package
% has been loaded. Examples are bug fixes, adaptations,
@@ -205,7 +220,7 @@ and the derived files
% that provide hooks that are executed after the package
% is loaded, see table~\ref{tab:hooks}.
%
-% \begin{table}
+% \begin{table}[b]
% \caption{After package hooking}
% \label{tab:hooks}
% \begin{tabular}{ll}
@@ -290,10 +305,34 @@ and the derived files
% }
%
% \section{Implementation}
-%
% \begin{macrocode}
%<*package>
% \end{macrocode}
+% \subsection{v.1.4: New implementation using the LaTeX kernel hooks}
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{hopatch}%
+ [2020-08-01 v1.4 Wrapper for package hooks (HO)]
+% \end{macrocode}
+% \begin{macrocode}
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}{}{\input{hopatch-2016-05-16.sty}}
+\IfFormatAtLeastTF{2020/10/01}{}{\endinput}
+
+\newcommand\hopatch@AfterPackage[1]{%
+ \@ifpackageloaded{#1}{%
+ \@firstofone
+ }{%
+ \AddToHook{package/after/#1}%
+ }}
+
+% \end{macrocode}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+% \begin{macrocode}
+%<*packagefrozen>
+% \end{macrocode}
%
% \subsection{Catcodes and package identification}
%
@@ -344,7 +383,7 @@ and the derived files
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{hopatch}%
- [2016/05/16 v1.3 Wrapper for package hooks (HO)]
+ [2020-08-01 v1.4 Wrapper for package hooks / legacy code (v1.3) (HO)]
% \end{macrocode}
%
% \subsection{Resources}
@@ -494,39 +533,20 @@ and the derived files
\HOpatch@AtEnd%
% \end{macrocode}
% \begin{macrocode}
-%</package>
+%</packagefrozen>
% \end{macrocode}
-%% \section{Installation}
+% \section{Installation}
%
% \subsection{Download}
%
% \paragraph{Package.} This package is available on
% CTAN\footnote{\CTANpkg{hopatch}}:
% \begin{description}
-% \item[\CTAN{macros/latex/contrib/oberdiek/hopatch.dtx}] The source file.
-% \item[\CTAN{macros/latex/contrib/oberdiek/hopatch.pdf}] Documentation.
+% \item[\CTAN{macros/latex/contrib/hopatch/hopatch.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/hopatch/hopatch.pdf}] Documentation.
% \end{description}
%
%
-% \paragraph{Bundle.} All the packages of the bundle `oberdiek'
-% are also available in a TDS compliant ZIP archive. There
-% the packages are already unpacked and the documentation files
-% are generated. The files and directories obey the TDS standard.
-% \begin{description}
-% \item[\CTANinstall{install/macros/latex/contrib/oberdiek.tds.zip}]
-% \end{description}
-% \emph{TDS} refers to the standard ``A Directory Structure
-% for \TeX\ Files'' (\CTANpkg{tds}). Directories
-% with \xfile{texmf} in their name are usually organized this way.
-%
-% \subsection{Bundle installation}
-%
-% \paragraph{Unpacking.} Unpack the \xfile{oberdiek.tds.zip} in the
-% TDS tree (also known as \xfile{texmf} tree) of your choice.
-% Example (linux):
-% \begin{quote}
-% |unzip oberdiek.tds.zip -d ~/texmf|
-% \end{quote}
%
% \subsection{Package installation}
%
@@ -543,9 +563,9 @@ and the derived files
% \begin{quote}
% \def\t{^^A
% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
-% hopatch.sty & tex/latex/oberdiek/hopatch.sty\\
-% hopatch.pdf & doc/latex/oberdiek/hopatch.pdf\\
-% hopatch.dtx & source/latex/oberdiek/hopatch.dtx\\
+% hopatch.sty & tex/latex/hopatch/hopatch.sty\\
+% hopatch.pdf & doc/latex/hopatch/hopatch.pdf\\
+% hopatch.dtx & source/latex/hopatch/hopatch.dtx\\
% \end{tabular}^^A
% }^^A
% \sbox0{\t}^^A
@@ -710,6 +730,10 @@ and the derived files
% \item
% Documentation updates.
% \end{Version}
+% \begin{Version}{2020-08-01 v1.4}
+% \item Starting with this version the package will use the hooks provided
+% by the LaTeX kernel if the format is newer than 2020/10/01.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/horoscop/horoscop.dtx b/Master/texmf-dist/source/latex/horoscop/horoscop.dtx
index 12ea6a98fe5..cc7827e623a 100644
--- a/Master/texmf-dist/source/latex/horoscop/horoscop.dtx
+++ b/Master/texmf-dist/source/latex/horoscop/horoscop.dtx
@@ -2,13 +2,13 @@
%
% This work is hereby released into the Public Domain. To view a
% copy of the public domain dedication, visit
-% http://creativecommons.org/licenses/publicdomain/
+% https://creativecommons.org/licenses/publicdomain/
% or send a letter to Creative Commons, 171 Second Street, Suite 300,
% San Francisco, California, 94105, USA.
%
% Matthew Skala
% mskala@ansuz.sooke.bc.ca
-% http://ansuz.sooke.bc.ca/
+% https://ansuz.sooke.bc.ca/
% August 30, 2008
%
% \fi
@@ -22,8 +22,9 @@
\usepackage{fmtcount}
\usepackage{graphicx}
\usepackage[scaled=0.9]{helvet}
-\usepackage[textsym,wasysym,marvosym,starfont]{horoscop}[2013/05/16]
+\usepackage[textsym,unicode,wasysym,marvosym,starfont]{horoscop}[2020/07/31]
\usepackage{mathpazo}
+\usepackage{metalogo}
\usepackage{titlesec}
\usepackage[letterpaper,breaklinks,bookmarks,plainpages=false,
colorlinks,pagebackref,citecolor=darkgreen,linkcolor=purplish]{hyperref}
@@ -81,7 +82,7 @@
%</driver>
% \fi
%
-% \CheckSum{4087}
+% \CheckSum{4317}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -113,38 +114,40 @@
%
% \title{Typesetting astrology with \textsf{horoscop}}
% \author{Matthew Skala}
-% \date{May 16, 2013}
+% \date{July 31, 2020}
%
-% \begin{titlepage}
-% \phantomsection
-% \mybookmark{section}{Title Page}
-% \centering
-% \vspace{0.75in}
-% {\Huge\scshape Typesetting}
+% \thispagestyle{empty}
+% \phantomsection
+% \mybookmark{section}{Title Page}
+% {\centering
+% \vspace{0.75in}
+% {\Huge\scshape Typesetting}
%
-% \vspace{2pc}
-% {\Huge\scshape Astrology}
+% \vspace{2pc}
+% {\Huge\scshape Astrology}
%
-% \vspace{2pc}
-% {\LARGE\itshape with}
+% \vspace{2pc}
+% {\LARGE\itshape with}
%
-% \vspace{2pc}
-% {\Huge\sffamily horoscop}
+% \vspace{2pc}
+% {\Huge\sffamily horoscop}
%
-% \vspace{3pc}
-% {\Huge\docornament}
+% \vspace{3pc}
+% {\Huge\docornament}
%
-% \vspace{\fill}
-% {\Large{\scshape Matthew Skala}\\
-% \href{mailto:mskala@ansuz.sooke.bc.ca}%
-% {\nolinkurl{mskala@ansuz.sooke.bc.ca}}}
+% \vspace{\fill}
+% {\Large{\scshape Matthew Skala}\\
+% \href{mailto:mskala@ansuz.sooke.bc.ca}%
+% {\nolinkurl{mskala@ansuz.sooke.bc.ca}}}
%
-% \vspace{0.5in}
-% {\Large\itshape Version 0.92, May 16, 2013}
-% \vspace{2.5pc}
-% \end{titlepage}
+% \vspace{0.5in}
+% {\Large\itshape Version 1.01, July 31, 2020}
+% \vspace{2.5pc}
+% \par}
%
% \clearpage
+% \changes{v1.0}{2020/07/20}{Make page after title page page 2 for clearer
+% numbering in PDF}
% \phantomsection
% \mybookmark{section}{Contents}
% \tableofcontents
@@ -153,13 +156,15 @@
%
% \section{Introduction}
%
+% \changes{v1.0}{2020/07/20}{General updates to intro after seven years}
% This document describes the design and use of a \LaTeX\ package named
% \textsf{horoscop}, which supports typesetting of astrological charts.
% Features include:
%
% \begin{itemize}
% \item A unified interface for astrological symbols/glyphs, supporting three
-% different astrological fonts as well as text abbreviations.
+% different astrological fonts as well as text abbreviations and Unicode
+% astrological symbol code points.
% \item Support for invoking Astrolog or Swiss Ephemeris to calculate
% charts. Positions can also be specified manually.
% \item Loading and saving object and cusp positions into \TeX\ macros.
@@ -216,21 +221,60 @@
% whatever comes out of the calculation software but it will be your own
% fault if that is nonsense.
%
-% This 0.92 release is the first one to be submitted to CTAN. I still feel
-% like \textsf{horoscop} is beta software, but it has existed since 2004, it
-% has not changed much in years, the recent switch to \textsf{pict2e} makes
-% it a lot more useful with modern \TeX\ installations, and I think the time
-% has come to share it more widely. Next version will probably be 1.0.
-%
-% This package has a GitHub repository at
-% \url{http://github.com/mskala/horoscop}. Bug reports should be filed
-% there using GitHub's issue tracking system.
-%
+% I presented this package at TUG~2016, with a one-page summary in the
+% conference proceedings: Skala, M. 2016. Astrological
+% charts with \textsf{horoscop} and \textsf{starfont}.
+% \emph{TUGboat,} 37(2):p.\ 182. Proceedings of the 37th Annual Meeting of
+% the TeX Users Group (TUG 2016), Toronto, Ontario, July 25-27, 2016. A PDF
+% of the summary is at \url{https://tug.org/TUGboat/tb37-2/tb116skala.pdf};
+% a PDF of the slides from my talk is at
+% \url{https://tug.org/tug2016/slides/skala.pdf}; and there is video of most
+% of the presentation at
+% \url{http://zeeba.tv/astrological-charts-with-horoscop-and-starfont/}.
+%
+% Version 1.0 represents a mature version of the package.
+% The last release, version 0.92, was called a beta test, but it has
+% been in use seven years now without needing any significant bug fixing or
+% updates. The most serious issue in 0.92 was in the documentation of
+% how to enter manually-calculated object positions; the underlying macros
+% for it worked well.
+%
+% Version 1.0 was primarily an update to the documentation to fix that
+% issue; unfortunately, it still wasn't correct, so 1.01 is meant to fix it for
+% real this time. Version 1.0 made other documentation updates to recognize
+% the fact that the package is mature and fully usable. I also took the
+% opportunity to add the Unicode-symbols feature, to reduce
+% \textsf{horoscop}'s ties to classical \TeX\ and its font systems as users
+% increasingly move toward Unicode engines and Unicode-based font selection;
+% and I have updated such things as Web links and development contacts to
+% reflect the inevitable changes in human institutitons over the years.
+%
+% \changes{v1.0}{2020/07/20}{In memoriam Axel}
+% I encourage readers to think of Axel Harvey, a close friend of mine and
+% a professional astrologer who contributed greatly to the testing of this
+% software and its associated Web service. He died in 2016, and is missed.
+%
+% \changes{v1.0}{2020/07/20}{New links for my own Web sites}
% There is an online chart service demonstrating \textsf{horoscop} at
-% \url{http://ansuz.sooke.bc.ca/astrology/makechart.php}. I also maintain a
-% page pointing to recent versions of this, my \textsf{starfont} package,
-% and any other \LaTeX\ astrology resources I can find, at
-% \url{http://ansuz.sooke.bc.ca/entry/107}.
+% \href{https://edifyingfellowship.org/astro/}{\nolinkurl https://edifying}
+% \href{https://edifyingfellowship.org/astro/}{\nolinkurl fellowship.org/astro/}.
+% I also maintain a page pointing to \LaTeX\ astrology resources, at
+% \url{https://ansuz.sooke.bc.ca/entry/107}.
+%
+% I no longer encourage the use of GitHub and it is unlikely that the
+% existing GitHub repository for \textsf{horoscop} will be updated further.
+% Bug reports and other correspondence related to \textsf{horoscop} should
+% be directed to \href{mailto:mskala@ansuz.sooke.bc.ca}%
+% {\nolinkurl{mskala@ansuz.sooke.bc.ca}}.
+%
+% As of 2016, I am no longer pursuing a career in academic computer science.
+% I have started a business selling modules of my own design for
+% Eurorack modular synthesizers, and kits for building them, through a Web
+% storefront at \url{https://northcoastsynthesis.com/}. If you are
+% interested in electronic music, please consider buying my products; if
+% not, please pass on the link to others. My ability to spend time
+% making free resources to share, such as the \textsf{horoscop} package,
+% depends on the success of my business.
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -249,14 +293,20 @@
% missing or unsuitable.
% Instead of using an astrological font
% at all, the |textsym| option may be used to substitute abbreviations
-% written in \LaTeX's ordinary text font.
+% written in \LaTeX's ordinary text font, which should work in any
+% \LaTeX\ environment; or the |unicode| option may
+% \changes{v1.0}{2020/07/20}{\texttt{unicode} option}
+% be used with \XeLaTeX\ or \LuaLaTeX\@. With |unicode|, \textsf{horoscop}
+% will use Unicode code points for the astrological symbols and leave it up to
+% the Unicode-supporting \TeX\ engine to typeset them in an appropriate font.
%
% Sources for astrological font packages:
% \changes{v0.92}{2013/05/16}{Update links for font packages}
+% \changes{v1.0}{2020/07/20}{Upgrade links to HTTPS}
% \begin{itemize}
-% \item \textsf{marvosym}: \url{http://www.ctan.org/pkg/marvosym}
-% \item \textsf{starfont}: \url{http://www.ctan.org/pkg/starfont}
-% \item \textsf{wasysym}: \url{http://www.ctan.org/pkg/wasysym}
+% \item \textsf{marvosym}: \url{https://ctan.org/pkg/marvosym}
+% \item \textsf{starfont}: \url{https://ctan.org/pkg/starfont}
+% \item \textsf{wasysym}: \url{https://ctan.org/pkg/wasysym}
% \end{itemize}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -285,12 +335,13 @@
% using this feature, by coding all the object locations into the \LaTeX\
% source file instead of having them calculated on the fly.
%
+% \changes{v1.0}{2020/07/20}{Upgrade links to HTTPS}
% Sources for external calculation programs:
% \begin{itemize}
% \item Astrolog:
-% \url{http://www.astrolog.org/astrolog.htm}
+% \url{https://www.astrolog.org/astrolog.htm}
% \item Swiss Ephemeris:
-% \url{http://www.astro.com/swisseph/}
+% \url{https://www.astro.com/swisseph/}
% \end{itemize}
%
% {\em External calculation programs require |\write18| support in \TeX.}
@@ -356,7 +407,8 @@
%
% \subsection{Astrological Symbol Options}
%
-% The options |textsym|, |wasysym|, |marvosym|, and |starfont| control the
+% The options |textsym|, |unicode|, |wasysym|, |marvosym|, and
+% |starfont| control the
% font used for astrological symbols. You may choose more than one of these
% options, in which case more than one set will be available in your
% document. The set in force at the start of the document will be the last
@@ -374,16 +426,28 @@
% The abbreviations are also used to replace missing symbols in the other
% sets.
%
+% \changes{v1.0}{2020/07/20}{\texttt{unicode} option}
+% The |unicode| option is normally only useful in \XeLaTeX\ and \LuaLaTeX;
+% it causes \textsf{horoscop} to use non-ASCII Unicode characters for
+% astrological symbols. It is up to the \TeX\ engine, or the user, to
+% select a font or combination of fonts in which these characters can be
+% typeset. Both \XeLaTeX\ and \LuaLaTeX\ offer relevant font-selection
+% features, and if \textsf{horoscop} detects (using the \textsf{iftex}
+% package) some other engine, it will fall back to a text indication of
+% the desired code points, which looks like $\langle$U+263D$\rangle$.
+%
% \DescribeMacro{\horotextsym}
+% \DescribeMacro{\horounicode}
% \DescribeMacro{\horowasysym}
% \DescribeMacro{\horomarvosym}
% \DescribeMacro{\horostarfont}
-% The macros |\horotextsym|, |\horowasysym|, |\horomarvosym|, and
-% |\horostar|-|font| switch to the corresponding set of astrological symbols,
+% The macros |\horotextsym|, |\horounicode|, |\horowasysym|,
+% |\horomarvosym|, and |\horostarfont| switch to the corresponding set
+% of astrological symbols,
% so that documents can mix the different sets. Any symbols not defined by
% the new set remain in the state left by the old set. To use these macros
% the corresponding symbol sets must have been loaded with the appropriate
-% package options, except |\horotextsym| which is always available.
+% package options, except that |\horotextsym| is always available.
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -583,154 +647,188 @@
% the entire zodiac by redefining |\Zodiac| instead of redefining individual
% symbols.
%
-% \begin{tabular}{lcccc}
-% macro & |textsym| & |wasysym| & |marvosym| & |starfont| \\
+% {\setlength{\tabcolsep}{0.2em}
+% \begin{tabular}{lccccc}
+% macro & |textsym| & |unicode| & |wasysym| & |marvosym| & |starfont| \\
% |\AriesSymbol| & \horotextsym\AriesSymbol
+% & \horounicode\AriesSymbol
% & \horowasysym\AriesSymbol
% & \horomarvosym\AriesSymbol
% & \horostarfont\AriesSymbol \\
% |\TaurusSymbol| & \horotextsym\TaurusSymbol
+% & \horounicode\TaurusSymbol
% & \horowasysym\TaurusSymbol
% & \horomarvosym\TaurusSymbol
% & \horostarfont\TaurusSymbol \\
% |\GeminiSymbol| & \horotextsym\GeminiSymbol
+% & \horounicode\GeminiSymbol
% & \horowasysym\GeminiSymbol
% & \horomarvosym\GeminiSymbol
% & \horostarfont\GeminiSymbol \\
% |\CancerSymbol| & \horotextsym\CancerSymbol
+% & \horounicode\CancerSymbol
% & \horowasysym\CancerSymbol
% & \horomarvosym\CancerSymbol
% & \horostarfont\CancerSymbol \\
% |\LeoSymbol| & \horotextsym\LeoSymbol
+% & \horounicode\LeoSymbol
% & \horowasysym\LeoSymbol
% & \horomarvosym\LeoSymbol
% & \horostarfont\LeoSymbol \\
% |\VirgoSymbol| & \horotextsym\VirgoSymbol
+% & \horounicode\VirgoSymbol
% & \horowasysym\VirgoSymbol
% & \horomarvosym\VirgoSymbol
% & \horostarfont\VirgoSymbol \\
% |\LibraSymbol| & \horotextsym\LibraSymbol
+% & \horounicode\LibraSymbol
% & \horowasysym\LibraSymbol
% & \horomarvosym\LibraSymbol
% & \horostarfont\LibraSymbol \\
% |\ScorpioSymbol| & \horotextsym\ScorpioSymbol
+% & \horounicode\ScorpioSymbol
% & \horowasysym\ScorpioSymbol
% & \horomarvosym\ScorpioSymbol
% & \horostarfont\ScorpioSymbol \\
% |\SagittariusSymbol| & \horotextsym\SagittariusSymbol
+% & \horounicode\SagittariusSymbol
% & \horowasysym\SagittariusSymbol
% & \horomarvosym\SagittariusSymbol
% & \horostarfont\SagittariusSymbol \\
% |\CapricornSymbol| & \horotextsym\CapricornSymbol
+% & \horounicode\CapricornSymbol
% & \horowasysym\CapricornSymbol
% & \horomarvosym\CapricornSymbol
% & \horostarfont\CapricornSymbol \\
% |\AquariusSymbol| & \horotextsym\AquariusSymbol
+% & \horounicode\AquariusSymbol
% & \horowasysym\AquariusSymbol
% & \horomarvosym\AquariusSymbol
% & \horostarfont\AquariusSymbol \\
% |\PiscesSymbol| & \horotextsym\PiscesSymbol
+% & \horounicode\PiscesSymbol
% & \horowasysym\PiscesSymbol
% & \horomarvosym\PiscesSymbol
% & \horostarfont\PiscesSymbol
-% \end{tabular}
+% \end{tabular}}
%
% \subsubsection{Luminaries and traditional planets}
%
% These are well-supported by the various fonts.
%
-% \begin{tabular}{lcccc}
-% macro & |textsym| & |wasysym| & |marvosym| & |starfont| \\
+% {\setlength{\tabcolsep}{0.2em}
+% \begin{tabular}{lccccc}
+% macro & |textsym| & |unicode| & |wasysym| & |marvosym| & |starfont| \\
% |\SunSymbol| & \horotextsym\SunSymbol
+% & \horounicode\SunSymbol
% & \horowasysym\SunSymbol
% & \horomarvosym\SunSymbol
% & \horostarfont\SunSymbol \\
% |\MoonSymbol| & \horotextsym\MoonSymbol
+% & \horounicode\MoonSymbol
% & \horowasysym\MoonSymbol
% & \horomarvosym\MoonSymbol
% & \horostarfont\MoonSymbol \\
% |\MercurySymbol| & \horotextsym\MercurySymbol
+% & \horounicode\MercurySymbol
% & \horowasysym\MercurySymbol
% & \horomarvosym\MercurySymbol
% & \horostarfont\MercurySymbol \\
% |\VenusSymbol| & \horotextsym\VenusSymbol
+% & \horounicode\VenusSymbol
% & \horowasysym\VenusSymbol
% & \horomarvosym\VenusSymbol
% & \horostarfont\VenusSymbol \\
% |\MarsSymbol| & \horotextsym\MarsSymbol
+% & \horounicode\MarsSymbol
% & \horowasysym\MarsSymbol
% & \horomarvosym\MarsSymbol
% & \horostarfont\MarsSymbol \\
% |\JupiterSymbol| & \horotextsym\JupiterSymbol
+% & \horounicode\JupiterSymbol
% & \horowasysym\JupiterSymbol
% & \horomarvosym\JupiterSymbol
% & \horostarfont\JupiterSymbol \\
% |\SaturnSymbol| & \horotextsym\SaturnSymbol
+% & \horounicode\SaturnSymbol
% & \horowasysym\SaturnSymbol
% & \horomarvosym\SaturnSymbol
% & \horostarfont\SaturnSymbol \\
% |\UranusSymbol| & \horotextsym\UranusSymbol
+% & \horounicode\UranusSymbol
% & \horowasysym\UranusSymbol
% & \horomarvosym\UranusSymbol
% & \horostarfont\UranusSymbol \\
% |\NeptuneSymbol| & \horotextsym\NeptuneSymbol
+% & \horounicode\NeptuneSymbol
% & \horowasysym\NeptuneSymbol
% & \horomarvosym\NeptuneSymbol
% & \horostarfont\NeptuneSymbol \\
% |\PlutoSymbol| & \horotextsym\PlutoSymbol
+% & \horounicode\PlutoSymbol
% & \horowasysym\PlutoSymbol
% & \horomarvosym\PlutoSymbol
% & \horostarfont\PlutoSymbol
-% \end{tabular}
+% \end{tabular}}
%
% \subsubsection{Other objects, cusps, and angles}
% The \textsf{starfont} package provides symbols for asteroids, derived
% points, angles, and so on. Without it, these things default to the
-% |textsym| abbreviations. Cusp symbols are listed here too, although they
+% |textsym| abbreviations. The |unicode| option also has code points for
+% these. Cusp symbols are listed in this table, but they
% generally do not appear in the default templates and will seldom be used
% in actual practice.
%
-% \begin{tabular}{lcc}
-% macro & |textsym| & |starfont| \\
+% {\setlength{\tabcolsep}{0.2em}
+% \begin{tabular}{lccc}
+% macro & |textsym| & |unicode| &|starfont| \\
% |\ChironSymbol| & \horotextsym\ChironSymbol
+% & \horounicode\ChironSymbol
% & \horostarfont\ChironSymbol \\
% |\CeresSymbol| & \horotextsym\CeresSymbol
+% & \horounicode\CeresSymbol
% & \horostarfont\CeresSymbol \\
% |\PallasSymbol| & \horotextsym\PallasSymbol
+% & \horounicode\PallasSymbol
% & \horostarfont\PallasSymbol \\
% |\JunoSymbol| & \horotextsym\JunoSymbol
+% & \horounicode\JunoSymbol
% & \horostarfont\JunoSymbol \\
% |\VestaSymbol| & \horotextsym\VestaSymbol
+% & \horounicode\VestaSymbol
% & \horostarfont\VestaSymbol \\
% |\NorthNodeSymbol| & \horotextsym\NorthNodeSymbol
+% & \horounicode\NorthNodeSymbol
% & \horostarfont\NorthNodeSymbol \\
% |\SouthNodeSymbol| & \horotextsym\SouthNodeSymbol
+% & \horounicode\SouthNodeSymbol
% & \horostarfont\SouthNodeSymbol \\
% |\LilithSymbol| & \horotextsym\LilithSymbol
+% & \horounicode\LilithSymbol
% & \horostarfont\LilithSymbol \\
% |\CuspISymbol| & \horotextsym\CuspISymbol
-% & \horostarfont\CuspISymbol \\
+% & & \horostarfont\CuspISymbol \\
% |\CuspIISymbol| & \horotextsym\CuspIISymbol & \\
% |\CuspIIISymbol| & \horotextsym\CuspIIISymbol & \\
% |\CuspIVSymbol| & \horotextsym\CuspIVSymbol
-% & \horostarfont\CuspIVSymbol \\
+% & & \horostarfont\CuspIVSymbol \\
% |\CuspVSymbol| & \horotextsym\CuspVSymbol & \\
% |\CuspVISymbol| & \horotextsym\CuspVISymbol & \\
% |\CuspVIISymbol| & \horotextsym\CuspVIISymbol
-% & \horostarfont\CuspVIISymbol \\
+% & & \horostarfont\CuspVIISymbol \\
% |\CuspVIIISymbol| & \horotextsym\CuspVIIISymbol & \\
% |\CuspIXSymbol| & \horotextsym\CuspIXSymbol & \\
% |\CuspXSymbol| & \horotextsym\CuspXSymbol
-% & \horostarfont\CuspXSymbol \\
+% & & \horostarfont\CuspXSymbol \\
% |\CuspXISymbol| & \horotextsym\CuspXISymbol & \\
% |\CuspXIISymbol| & \horotextsym\CuspXIISymbol & \\
% |\AscendantSymbol| & \horotextsym\AscendantSymbol
-% & \horostarfont\AscendantSymbol \\
+% & & \horostarfont\AscendantSymbol \\
% |\MCSymbol| & \horotextsym\MCSymbol
-% & \horostarfont\MCSymbol \\
+% & & \horostarfont\MCSymbol \\
% |\VertexSymbol| & \horotextsym\VertexSymbol
-% & \horostarfont\VertexSymbol \\
-% \end{tabular}
+% & & \horostarfont\VertexSymbol \\
+% \end{tabular}}
%
% Note that \textsf{wasysym} provides a symbol it calls |\ascnode|, but it's
% actually identical to the symbol it calls |\leo|, and the symbol (\leo)
@@ -770,35 +868,44 @@
% below also shows the default angles and orbs for the aspects; see
% Subsection~\ref{sub:aspect-web}.
%
-% {\renewcommand{\tabcolsep}{0.2em}
-% \begin{tabular}{lcccc}
-% macro & |textsym| & |wasysym| & |starfont| & angle\\
+% \noindent{\setlength{\tabcolsep}{0.1em}
+% \begin{tabular}{lccccc}
+% macro & |textsym| & |unicode| & |wasysym| & |starfont| & angle\\
% |\horoConjunctionSymbol| & \horotextsym\horoConjunctionSymbol
+% & \horounicode\horoConjunctionSymbol
% & \horowasysym\horoConjunctionSymbol
% & \horostarfont\horoConjunctionSymbol & $0\horodegrees\pm6\horodegrees$ \\
% |\horoOppositionSymbol| & \horotextsym\horoOppositionSymbol
+% & \horounicode\horoOppositionSymbol
% & \horowasysym\horoOppositionSymbol
% & \horostarfont\horoOppositionSymbol & $180\horodegrees\pm6\horodegrees$ \\
% |\horoTrineSymbol| & \horotextsym\horoTrineSymbol
+% & \horounicode\horoTrineSymbol
% & \horowasysym\horoTrineSymbol
% & \horostarfont\horoTrineSymbol & $120\horodegrees\pm5\horodegrees$ \\
% |\horoSquareSymbol| & \horotextsym\horoSquareSymbol
+% & \horounicode\horoSquareSymbol
% & \horowasysym\horoSquareSymbol
% & \horostarfont\horoSquareSymbol & $90\horodegrees\pm5\horodegrees$ \\
% |\horoQuintileSymbol| & \horotextsym\horoQuintileSymbol
-% & & \horostarfont\horoQuintileSymbol & $72\horodegrees\pm2\horodegrees$ \\
+% & & & \horostarfont\horoQuintileSymbol & $72\horodegrees\pm2\horodegrees$ \\
% |\horoBiquintileSymbol| & \horotextsym\horoBiquintileSymbol
-% & & \horostarfont\horoBiquintileSymbol & $144\horodegrees\pm2\horodegrees$ \\
+% & & & \horostarfont\horoBiquintileSymbol & $144\horodegrees\pm2\horodegrees$ \\
% |\horoSextileSymbol| & \horotextsym\horoSextileSymbol
+% & \horounicode\horoSextileSymbol
% & \horowasysym\horoSextileSymbol
% & \horostarfont\horoSextileSymbol & $60\horodegrees\pm4\horodegrees$ \\
% |\horoQuincunxSymbol| & \horotextsym\horoQuincunxSymbol
+% & \horounicode\horoQuincunxSymbol
% & & \horostarfont\horoQuincunxSymbol & $150\horodegrees\pm3\horodegrees$ \\
% |\horoSemisextileSymbol| & \horotextsym\horoSemisextileSymbol
+% & \horounicode\horoSemisextileSymbol
% & & \horostarfont\horoSemisextileSymbol & $30\horodegrees\pm3\horodegrees$ \\
% |\horoSemisquareSymbol| & \horotextsym\horoSemisquareSymbol
+% & \horounicode\horoSemisquareSymbol
% & & \horostarfont\horoSemisquareSymbol & $45\horodegrees\pm2\horodegrees$ \\
% |\horoSesquiquadrateSymbol| & \horotextsym\horoSesquiquadrateSymbol
+% & \horounicode\horoSesquiquadrateSymbol
% & & \horostarfont\horoSesquiquadrateSymbol & $135\horodegrees\pm2\horodegrees$
% \end{tabular}}
%
@@ -967,7 +1074,8 @@
% would be better to assign house positions in a way that takes latitude
% into account. See the article ``The Problems of House Division'' by
% Deborah Houlding, available online at
-% \url{http://www.skyscript.co.uk/houprob_print.html}, for more discussion
+% \changes{v1.0}{2020/07/20}{Upgrade links to HTTPS}
+% \url{https://www.skyscript.co.uk/houprob_print.html}, for more discussion
% of this issue. In some future version \textsf{horoscop} may be extended
% to provide more options for handling of this kind of thing.
%
@@ -995,6 +1103,8 @@
% that would be created by |\horocalculate| simply need to be created
% directly, as in the example below.
%
+% \changes{v1.0}{2020/07/20}{Correct macro names for manual position example}
+% \changes{v1.01}{2020/07/31}{Correct macro names for manual position example, again}
% \begin{verbatim}
% \def\horoSunPos{267.5002492}\def\horoSunVel{1.0185515}
% \def\horoMoonPos{229.2067659}\def\horoMoonVel{11.9237313}
@@ -1008,18 +1118,18 @@
% \def\horoPlutoPos{133.0955746}\def\horoPlutoVel{-0.0150157}
% \def\horoNorthNodePos{70.7814892}\def\horoNorthNodeVel{-0.0529425}
% \def\horoLilithPos{265.3475147}\def\horoLilithVel{0.1108368}
-% \def\horoCuspI{207.9120843}
-% \def\horoCuspII{236.5553269}
-% \def\horoCuspIII{267.6976404}
-% \def\horoCuspIV{300.5365877}
-% \def\horoCuspV{332.9973490}
-% \def\horoCuspVI{2.5292853}
-% \def\horoCuspVII{27.9120843}
-% \def\horoCuspVIII{56.5553269}
-% \def\horoCuspIX{87.6976404}
-% \def\horoCuspX{120.5365877}
-% \def\horoCuspXI{152.9973490}
-% \def\horoCuspXII{182.5292853}
+% \def\horoCuspIPos{207.9120843}
+% \def\horoCuspIIPos{236.5553269}
+% \def\horoCuspIIIPos{267.6976404}
+% \def\horoCuspIVPos{300.5365877}
+% \def\horoCuspVPos{332.9973490}
+% \def\horoCuspVIPos{2.5292853}
+% \def\horoCuspVIIPos{27.9120843}
+% \def\horoCuspVIIIPos{56.5553269}
+% \def\horoCuspIXPos{87.6976404}
+% \def\horoCuspXPos{120.5365877}
+% \def\horoCuspXIPos{152.9973490}
+% \def\horoCuspXIIPos{182.5292853}
% \end{verbatim}
%
% A few less obvious macros also need to be set for manually-entered
@@ -1185,6 +1295,20 @@
% |\horowheelVancouver|, as in the birth chart for John Lennon shown in
% Figure~\ref{fig:basic-wheel}.
%
+% \changes{v1.0}{2020/07/21}{Emphasize that template names do not determine
+% geographic locations of charts}
+% Please note that the standard templates are named after Canadian cities,
+% but these names are only \emph{thematic names for the visual styles of the
+% charts}\footnote{I was inspired to use this naming theme by Ruskey and
+% Weston's work on Venn diagrams; see
+% \url{https://www.combinatorics.org/files/Surveys/ds5/ds5v3-2005/VennEJC.html}.}
+% and the names of the templates have no connection with the geographic
+% locations the charts refer to. You can plot a chart for any location in
+% Vancouver style, and you can plot a chart that does happen to be for
+% Vancouver (any of the multiple places in the world with that name) using any
+% template. The geographic location for the chart must be specified by
+% latitude and longitude, independently of the template name.
+%
% \begin{figure}
% \horocalcparms{1940}{10}{9}{17:30:0}{W2:55:0}{N53:25:0}
% \horocalculate
@@ -2081,7 +2205,8 @@
% exist \emph{even in theory}. He was probably joking, but so might I be.
% See \emph{``Real'' Analysis is a Degenerate Case of Discrete Analysis},
% D.~Zeilberger,
-% \url{http://www.math.rutgers.edu/~zeilberg/mamarim/mamarimhtml/real.html}.}
+% \changes{v1.0}{2020/07/20}{Upgrade links to HTTPS}
+% \url{https://sites.math.rutgers.edu/~zeilberg/mamarim/mamarimhtml/real.html}.}
% so the decision on how to represent truly exact cusps seems not to be of
% much practical consequence anyway.
%
@@ -2552,7 +2677,7 @@
%
% Note that the spring strength settings are for adjusting
% the {\em relative} strengths of the different kind of adjustments. It
-% will not work to increase or decrese all three uniformly to make
+% will not work to increase or decrease all three uniformly to make
% the overall layout looser or tighter, because the system will simply make
% more or fewer iterations and end up with substantially the same solution.
% Overall looser-tighter control should instead be exercised by changing
@@ -2863,7 +2988,7 @@
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{horoscop}%
- [2013/05/16 v0.92 Astrological chart macros by Matthew Skala]
+ [2020/07/31 v1.01 Astrological chart macros by Matthew Skala]
% \end{macrocode}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -2878,12 +3003,15 @@
%
% These can all be turned on and off independently.
%
+% \changes{v1.0}{2020/07/20}{\texttt{unicode} option}
% \begin{macrocode}
\newif\ifhoro@textsym\horo@textsymfalse
+\newif\ifhoro@unicode\horo@unicodefalse
\newif\ifhoro@wasysym\horo@wasysymfalse
\newif\ifhoro@marvosym\horo@marvosymfalse
\newif\ifhoro@starfont\horo@starfontfalse
\DeclareOption{textsym}{\horo@textsymtrue}
+\DeclareOption{unicode}{\horo@unicodetrue}
\DeclareOption{wasysym}{\horo@wasysymtrue}
\DeclareOption{marvosym}{\horo@marvosymtrue}
\DeclareOption{starfont}{\horo@starfonttrue}
@@ -2935,14 +3063,25 @@
%
% \begin{macrocode}
\ifhoro@textsym\else
- \ifhoro@wasysym\else
- \ifhoro@marvosym\else
- \horo@starfonttrue
+ \ifhoro@unicode\else
+ \ifhoro@wasysym\else
+ \ifhoro@marvosym\else
+ \horo@starfonttrue
+ \fi
\fi
\fi
\fi
% \end{macrocode}
%
+% Because \textsf{iftex} defines conditionals, we must load it
+% unconditionally. Otherwise the parse of our style file (when it skims
+% over not-taken conditional bodies) fails.
+%
+% \changes{v1.0}{2020/07/02}{Require \textsf{iftex}}
+% \begin{macrocode}
+\RequirePackage{iftex}%
+% \end{macrocode}
+%
% Load other packages as needed by the selected options. Since
% there are some name conflicts between macros defined by in different
% packages and we want to retain access to both versions, we save each
@@ -3150,12 +3289,195 @@
\horotextsym
% \end{macrocode}
%
+% \subsubsection{Unicode astrological symbols}
+%
+% \changes{v1.0}{2020/07/20}{\texttt{unicode} option}
+% As with |textsym|, the actual setting of the symbol macros is all inside a
+% |unicode|-specific macro so that we can switch back to it easily
+% after using other symbol sets. The macro |\horounicode@| contains the
+% actual code points in caret notation, which traditional \TeX\ engines
+% cannot process; this macro is called by |\horounicode| conditionally
+% on its detecting a Unicode-compatible engine.
+%
+% \begin{macro}{\horounicode@}
+% \begin{macrocode}
+\ifhoro@unicode\newcommand{\horounicode@}{%
+% \end{macrocode}
+%
+% Signs of the Zodiac:
+% \begin{macrocode}
+\gdef\AriesSymbol{^^^^2648}%
+\gdef\TaurusSymbol{^^^^2649}%
+\gdef\GeminiSymbol{^^^^264a}%
+\gdef\CancerSymbol{^^^^264b}%
+\gdef\LeoSymbol{^^^^264c}%
+\gdef\VirgoSymbol{^^^^264d}%
+\gdef\LibraSymbol{^^^^264e}%
+\gdef\ScorpioSymbol{^^^^264f}%
+\gdef\SagittariusSymbol{^^^^2650}%
+\gdef\CapricornSymbol{^^^^2651}%
+\gdef\AquariusSymbol{^^^^2652}%
+\gdef\PiscesSymbol{^^^^2653}%
+% \end{macrocode}
+%
+% Traditional planets and luminaries:
+% \begin{macrocode}
+\gdef\SunSymbol{^^^^2609}%
+\gdef\MoonSymbol{^^^^263d}%
+\gdef\MercurySymbol{^^^^263f}%
+\gdef\VenusSymbol{^^^^2640}%
+\gdef\MarsSymbol{^^^^2642}%
+\gdef\JupiterSymbol{^^^^2643}%
+\gdef\SaturnSymbol{^^^^2644}%
+\gdef\UranusSymbol{^^^^2645}%
+\gdef\NeptuneSymbol{^^^^2646}%
+\gdef\PlutoSymbol{^^^^2647}%
+% \end{macrocode}
+%
+% Minor planets:
+% \begin{macrocode}
+\gdef\ChironSymbol{^^^^26b7}%
+\gdef\CeresSymbol{^^^^26b3}%
+\gdef\PallasSymbol{^^^^26b4}%
+\gdef\JunoSymbol{^^^^26b5}%
+\gdef\VestaSymbol{^^^^26b6}%
+% \end{macrocode}
+%
+% Derived points:
+% \begin{macrocode}
+\gdef\NorthNodeSymbol{^^^^260a}%
+\gdef\SouthNodeSymbol{^^^^260b}%
+\gdef\LilithSymbol{^^^^26b8}%
+% \end{macrocode}
+%
+% Direction:
+% \begin{macrocode}
+\gdef\horoRetrogradeSymbol{^^^^211e}%
+% \end{macrocode}
+%
+% Aspects:
+% \begin{macrocode}
+\gdef\horoConjunctionSymbol{^^^^260c}%
+\gdef\horoOppositionSymbol{^^^^260d}%
+\gdef\horoTrineSymbol{^^^^25b3}%
+\gdef\horoSquareSymbol{^^^^25a1}%
+\gdef\horoSextileSymbol{^^^^26b9}%
+\gdef\horoQuincunxSymbol{^^^^26bb}%
+\gdef\horoSemisextileSymbol{^^^^26ba}%
+\gdef\horoSemisquareSymbol{^^^^2220}%
+\gdef\horoSesquiquadrateSymbol{^^^^26bc}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% This helper macro typesets a notation that describes a code point in text:
+%
+% \begin{macro}{\horounicode@point}
+% \begin{macrocode}
+\newcommand{\horounicode@point}[1]{\ensuremath{\langle\mbox{U+#1}\rangle}}
+% \end{macrocode}
+% \end{macro}
+%
+% The |\horounicode| driver can either call |\horounicode@| to really
+% use Unicode, or display text-based descriptions of the Unicode code points
+% it wants, depending on the engine. Factoring |\horounicode@| into a
+% separate macro reduces repetition, since |\horounicode| wants to call it in
+% two different places.
+%
+% \begin{macro}{\horounicode}
+% \changes{v1.0}{2020/07/20}{New macro}
+% \begin{macrocode}
+\newcommand{\horounicode}{%
+% \end{macrocode}
+%
+% Call |\horounicode@| if it is safe to do so:
+% \begin{macrocode}
+\ifxetex\horounicode@\else
+\ifluatex\horounicode@\else
+% \end{macrocode}
+%
+% Now define all the code points, as above, but in text notation.
+%
+% Signs of the Zodiac:
+% \begin{macrocode}
+\gdef\AriesSymbol{\horounicode@point{2648}}%
+\gdef\TaurusSymbol{\horounicode@point{2649}}%
+\gdef\GeminiSymbol{\horounicode@point{264A}}%
+\gdef\CancerSymbol{\horounicode@point{264B}}%
+\gdef\LeoSymbol{\horounicode@point{264C}}%
+\gdef\VirgoSymbol{\horounicode@point{264D}}%
+\gdef\LibraSymbol{\horounicode@point{264E}}%
+\gdef\ScorpioSymbol{\horounicode@point{264F}}%
+\gdef\SagittariusSymbol{\horounicode@point{2650}}%
+\gdef\CapricornSymbol{\horounicode@point{2651}}%
+\gdef\AquariusSymbol{\horounicode@point{2652}}%
+\gdef\PiscesSymbol{\horounicode@point{2653}}%
+% \end{macrocode}
+%
+% Traditional planets and luminaries:
+% \begin{macrocode}
+\gdef\SunSymbol{\horounicode@point{2609}}%
+\gdef\MoonSymbol{\horounicode@point{263D}}%
+\gdef\MercurySymbol{\horounicode@point{263F}}%
+\gdef\VenusSymbol{\horounicode@point{2640}}%
+\gdef\MarsSymbol{\horounicode@point{2642}}%
+\gdef\JupiterSymbol{\horounicode@point{2643}}%
+\gdef\SaturnSymbol{\horounicode@point{2644}}%
+\gdef\UranusSymbol{\horounicode@point{2645}}%
+\gdef\NeptuneSymbol{\horounicode@point{2646}}%
+\gdef\PlutoSymbol{\horounicode@point{2647}}%
+% \end{macrocode}
+%
+% Minor planets:
+% \begin{macrocode}
+\gdef\ChironSymbol{\horounicode@point{26B7}}%
+\gdef\CeresSymbol{\horounicode@point{26B3}}%
+\gdef\PallasSymbol{\horounicode@point{26B4}}%
+\gdef\JunoSymbol{\horounicode@point{26B5}}%
+\gdef\VestaSymbol{\horounicode@point{26B6}}%
+% \end{macrocode}
+%
+% Derived points:
+% \begin{macrocode}
+\gdef\NorthNodeSymbol{\horounicode@point{260A}}%
+\gdef\SouthNodeSymbol{\horounicode@point{260B}}%
+\gdef\LilithSymbol{\horounicode@point{26B8}}%
+% \end{macrocode}
+%
+% Direction:
+% \begin{macrocode}
+\gdef\horoRetrogradeSymbol{\horounicode@point{211E}}%
+% \end{macrocode}
+%
+% Aspects:
+% \begin{macrocode}
+\gdef\horoConjunctionSymbol{\horounicode@point{260C}}%
+\gdef\horoOppositionSymbol{\horounicode@point{260D}}%
+\gdef\horoTrineSymbol{\horounicode@point{25B3}}%
+\gdef\horoSquareSymbol{\horounicode@point{25A1}}%
+\gdef\horoSextileSymbol{\horounicode@point{26B9}}%
+\gdef\horoQuincunxSymbol{\horounicode@point{26BB}}%
+\gdef\horoSemisextileSymbol{\horounicode@point{26BA}}%
+\gdef\horoSemisquareSymbol{\horounicode@point{2220}}%
+\gdef\horoSesquiquadrateSymbol{\horounicode@point{26BC}}%
+\fi\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Now invoke |\horounicode| to make these symbols default at the start of
+% the document, except for the few (house cusps, and quintiles) that
+% don't exist in Unicode.
+% \begin{macrocode}
+\horounicode
+\fi
+% \end{macrocode}
+%
% \subsubsection{Symbols from \textsf{wasysym}}
%
% \begin{macro}{\horowasysym}
-% As with |textsym|, the actual setting of the symbol macros is all inside a
-% \textsf{wasysym}-specific macro so that we can switch back to it easily
-% after using other symbol sets.
+% These, too, are inside a macro specific to the package so that we can
+% switch among multiple symbol sets when more than one is loaded.
% \begin{macrocode}
\ifhoro@wasysym\newcommand{\horowasysym}{%
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/hu-berlin-bundle/hu-berlin-bundle.dtx b/Master/texmf-dist/source/latex/hu-berlin-bundle/hu-berlin-bundle.dtx
deleted file mode 100644
index 4b064957d1c..00000000000
--- a/Master/texmf-dist/source/latex/hu-berlin-bundle/hu-berlin-bundle.dtx
+++ /dev/null
@@ -1,1990 +0,0 @@
-% \iffalse
-%<*internal|cls|sty>
-\def\Version{2019/12/19 v1.0.4}
-%</internal|cls|sty>
-%<*internal>
-\iffalse
-%</internal>
-%<cls|sty>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
-%<*cls&letter>
-\ProvidesClass{hu-berlin-letter}
- [\Version\ Humboldt-Universit"at zu Berlin - letter documentclass]
-\ClassInfo{hu-berlin}{* * * hu-berlin * * *\MessageBreak
- Part of the hu-berlin Bundle }
-%</cls&letter>
-%<*sty>
-%<*style>
-\ProvidesPackage{hu-berlin-bundle-style}
- [\Version\space hu-berlin - package for style the documentation]
- \PackageInfo{hu-berlin}{* * * hu-berlin * * *\MessageBreak
- Part of the hu-berlin Bundle}
-%</style>
-%<*base>
-\ProvidesPackage{hu-berlin-base}
- [\Version\space hu-berlin - package for basic features]
- \PackageInfo{hu-berlin}{* * * hu-berlin * * *\MessageBreak
- Part of the hu-berlin Bundle}
-%</base>
-%</sty>
-%<*driver>
-\catcode9=12
-\ProvidesFile{\jobname.dtx}
- [\Version\space Documentation of the hu-berlin Bundle]
-%</driver>
-% /*
-% ██████ ███████ █████ ██████ ███ ███ ███████
-% ▄ ██ ▄██ ██ ██ ██ ██ ██ ██ ████ ████ ██
-% ████ ██████ █████ ███████ ██ ██ ██ ████ ██ █████
-% ▀ ██ ▀██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
-% ██ ██ ███████ ██ ██ ██████ ██ ██ ███████
-% */
-%<*readme&main>
-hu-berlin-bundle
-================
-
-This package provides files according to the corporate design
-for the Humboldt-Universität zu Berlin.
-It is _no_ official package of the university itself and
-not officially approved by it.
-
-You find more information in the official [corporate design guideline](https://www.hu-berlin.de/de/hu-intern/design/basiselemente/leitfaden-corporate-design-hu.pdf)
-and on the website <https://www.hu-berlin.de/de/hu-intern/design>.
-
-## Documents and Documentations for hu-berlin bundle
-
-
-This bundle provides following files:
-
- * `hu-berlin-bundle.dtx` which is the core file designed with literate programming
- * `hu-berlin-bundle.ins` which is the installation file for all necessary files generated automatically
- * `hu-berlin-bundle.pdf` is documentation of the bundle.
- * `README.md`
- * `makefile`
-
-All other files can and will be generated from the `.dtx` file (see below).
-
-Furthermore there is the folder `img` which contains the necessary image files.
-
-
-This work has the LPPL maintenance status _maintained_.
-The current maintainer of this work is [Lukas C. Bossert](https://github.com/lukascbossert).
-
-
-You find this bundle versioned and available on [Zenodo](https://doi.org/10.5281/zenodo.3251728)
-
-%</readme&main>
-% /*
-% ██ ██████ ███████ █████ ██████ ███ ███ ███████
-% ██ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██
-% ██ ██████ █████ ███████ ██ ██ ██ ████ ██ █████
-% ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
-% ██ ██ ██ ███████ ██ ██ ██████ ██ ██ ███████
-% */
-% /*
-% ██████ ██ ██████
-% ▄ ██ ▄██ ██ ██ ██ ██
-% ████ ██████ ██ ██████
-% ▀ ██ ▀██ ██ ██ ██ ██
-% ██████ ██ ██████
-% */
-%<*bib>
-%%
-%% Encoding: UTF-8
-%%
-@InCollection{Hoare1973,
- author = {Charles Antony Richard Hoare},
- title = {Hints on programming language design},
- editor = {C. Bunyan},
- booktitle = {Computer Systems Reliability},
- series = {State of the Art Report},
- number = {20},
- pages = {193--216},
- date = {1973},
- url={http://flint.cs.yale.edu/cs428/doc/HintsPL.pdf},
- urldate={2018-09-06},
- comment = {\blockcquote[195]{Hoare1973}{Documentation must be regarded as an integral part of the process of design and coding.
- A good programming language will encourage and assist the programmer to write clear,
- self-documenting code,
- and even perhaps to develop
- and display a pleasant style
- of writing.}}
-}
-
-%</bib>
-% /*
-% ██ ██████ ██ ██████
-% ██ ██ ██ ██ ██ ██
-% ██ ██████ ██ ██████
-% ██ ██ ██ ██ ██ ██
-% ██ ██████ ██ ██████
-% */
-%<*internal>
-\fi
-\def\nameofplainTeX{plain}
-\ifx\fmtname\nameofplainTeX\else
- \expandafter\begingroup
-\fi
-%</internal>
-% /*
-% ██ ███ ██ ███████
-% ▄ ██ ▄██ ████ ██ ██
-% ████ ██ ██ ██ ██ ███████
-% ▀ ██ ▀██ ██ ██ ██ ██
-% ██ ██ ████ ███████
-% */
-%<*install>
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
-
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-
-\nopreamble\nopostamble
-
-\usedir{doc/latex/\jobname}
-\generate{
- \file{README.md}{\from{\jobname.dtx}{readme,main}}
- \file{hu-berlin-bundle-bibliography.bib}{\from{\jobname.dtx}{bib}}
- \file{hu-berlin-letter-example-lualatex.tex}{\from{\jobname.dtx}{example,letter}}
- \file{hu-berlin-letter-example-markdown.md}{\from{\jobname.dtx}{example,letter-md}}
-}
-
-\preamble
-----------------------------------------------------------------
-hu-berlin-bundle
-Author: Lukas C. Bossert
-E-mail: lukas@texografie.de
-License: Released under the LaTeX Project Public License v1.3c or later
-See: http://www.latex-project.org/lppl.txt
-Various parts my have a different licence,
-please consider and respect them carefully.
-----------------------------------------------------------------
-
-\endpreamble
-\postamble
-
-Copyright (C) 2019-2020
-\endpostamble
-
-\usedir{tex/latex/\jobname}
-\generate{
- \file{hu-berlin-letter-example-lualatex.tex}{\from{\jobname.dtx}{example,letter}}
- \file{hu-berlin-letter-example.lco}{\from{\jobname.dtx}{example,lco}}
- \file{hu-berlin-letter.cls}{\from{\jobname.dtx}{cls,letter}}
- %
- \file{hu-berlin-base.sty}{\from{\jobname.dtx}{sty,base}}
- \file{hu-berlin-bundle-style.sty}{\from{\jobname.dtx}{sty,style}}
- \file{hu-berlin-letter-template.latex}{\from{\jobname.dtx}{template,letter-md}}
-}
-%</install>
-%<install>\endbatchfile
-%<*internal>
-\usedir{source/latex/\jobname}
-\generate{
- \file{\jobname.ins}{\from{\jobname.dtx}{install}}
-}
-\ifx\fmtname\nameofplainTeX
- \expandafter\endbatchfile
-\else
- \expandafter\endgroup
-\fi
-%</internal>
-% /*
-% ██ ██ ███ ██ ███████
-% ██ ██ ████ ██ ██
-% ██ ██ ██ ██ ██ ███████
-% ██ ██ ██ ██ ██ ██
-% ██ ██ ██ ████ ███████
-% */
-%<*driver>
-\ProvidesFile{\jobname.dtx}
- [\Version\space Documents and documentation for hu-berlin]
-%</driver>
-% /*
-% ██████ ██████ ██████ ██████ ██ █████ ███████ ███████
-% ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
-% ██ ██ ██ ██ ██ ██ ██ ███████ ███████ ███████
-% ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
-% ██████ ██████ ██████ ██████ ███████ ██ ██ ███████ ███████
-% */
-%<*driver>
-\def\huberlinsubject{Guideline}
-\def\huberlinshort{hu-berlin-bundle}
-\def\huberlintitle{%
-Documents and Documentations for \LaTeX\ at the Humboldt-Universität zu Berlin (unofficial)}
-\def\huberlinsubtitle{For Authors and Developers}
-\def\huberlinauthor{Lukas C. Bossert}
-\RequirePackage{scrlfile}
-\PassOptionsToClass{%
- english
- ,oneside
- }{scrbook}
-\ReplaceClass{article}{scrbook}
-\documentclass{ltxdoc}
-\usepackage{hu-berlin-bundle-style}
-\GetFileInfo{\jobname.dtx}
-% /*
-% ██████ ██████ ██████ ██ ██ ███ ███ ███████ ███ ██ ████████
-% ▄ ██ ▄ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ████ ██ ██
-% ████ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ █████ ██ ██ ██ ██
-% ▀ ██ ▀ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
-% ██████ ██████ ██████ ██████ ██ ██ ███████ ██ ████ ██
-% */
-\begin{document}
-\openoutputfile{\jobname.pkglist}{pkglist}
-\pdfbookmark[section]{\contentsname}{toc}
-\tableofcontents
-\clearpage
-\chapter{Introduction}
-\begin{markdown*}{hybrid=true}
-%</driver>
-% /*
-% ██████ ███████ █████ ██████ ███ ███ ███████
-% ▄ ██ ▄██ ██ ██ ██ ██ ██ ██ ████ ████ ██
-% ████ ██████ █████ ███████ ██ ██ ██ ████ ██ █████
-% ▀ ██ ▀██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
-% ██ ██ ███████ ██ ██ ██████ ██ ██ ███████
-% */
-%<*readme,main>
-
-With this (unofficial) bundle you have several documents which are designed according to the corporate design of the Humboldt-Universität zu Berlin.
-
-
-Following documents or documentclasses are available:
-
-* letter (`hu-berlin-letter.cls`); via `.tex` and `.md`
-* base package (`hu-berlin-base.sty`)
-
-
-## Installation of the bundle
-`hu-berlin` is part of the distributions [MiKTeX](http://www.miktex.org)
-and [TeXLive](http://www.tug.org/texlive) -- thus, you
-can easily install it using the respective package manager.
-If you would like to
-install `hu-berlin-bundle` into your local folder manually, do the following:
-Go to your terminal, browse to the folder of this bundle and run
-
-```
-make install
-```
-
-
-If you are using macOS you might be asked for your user account password for the installation.
-
-
-Further options of this makefile are:
-
-* `clean`: deletes all unnecessary files
-* `cleanbundle`: deletes all files except `.dtx`, `.md`. You will get the plain version of this bundle.
-This might be helpful if you send the bundle to someone else.
-* `ctan`: this will create a zip file which can be used to send to CTAN.
-* `files`: will only create the files from the `.dtx`-scratch.
-* `uninstall`: will erase the locally installed files.
-
-
-This bundle is constantly updated. For hints, errors or suggestions use the GitHub repository [https://github.com/LukasCBossert/hu-berlin-bundle](https://github.com/LukasCBossert/hu-berlin-bundle).
-
-## Changelog
-
-All notable changes to this project will be documented in the [README.md](https://github.com/LukasCBossert/hu-berlin-bundle/blob/master/README.md).
-This project **does not** adhere to [Semantic Versioning](http://semver.org/).
-The markdown syntax is inspired by the conventions proposed by [keepachangelog.com](http://keepachangelog.com/).
-
-### v1.0.4 (2019-12-19)
-* Added `hu-berlin-base.sty` as a package which contains all relevant code for documents and documentclasses of the bundle.
-
-### v1.0.3 (2019-06-26)
- * Changed the main font for compatibility with UNIX-systems (TeX Gyre Heros instead of Verdana).
-
-### v1.0.2 (2019-06-22)
- Renaming files for CTAN compatability.
-
-
-### v1.0.1 (2019-06-21)
- Internal changes for publishing. Still one documentclass for a letter.
-
-### v1.0.0 (2019-06-21)
- First release with a documentclass for letter.
-
-## Copyright
-Various parts of this bundle have different copyrights.
-If not otherwise stated the copyright is [The LaTeX project public license (LPPL), version 1.3c](https://www.latex-project.org/lppl/lppl-1-3c/)
-
-
-### Boilerplate / markdown-template
-The template for the markdown conversion,
-forked from the pandoc-templates and [JensErat pandoc-scrlttr2](https://github.com/JensErat/pandoc-scrlttr2) is dual-licensed,
-under both the GPL (v2 or higher, same as pandoc) and the BSD 3-clause license (included below).
-
-----
-
-Copyright (c) 2014, John MacFarlane\\
-Copyright (c) 2014, Jens Erat\\
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-* Neither the name of John MacFarlane nor the names of other contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-%</readme,main>
-% /*
-% ██ ██████ ███████ █████ ██████ ███ ███ ███████
-% ██ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██
-% ██ ██████ █████ ███████ ██ ██ ██ ████ ██ █████
-% ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
-% ██ ██ ██ ███████ ██ ██ ██████ ██ ██ ███████
-% */
-%<*driver>
-\end{markdown*}
-\clearpage
-\chapter{Preambel}
-
-This bundle consists of various files
-which are either generated by the core file (|.dtx|)
-or are part of the basic structure of this bundle.
-You can easily pick up the basic file structure from \cref{hu-berlin:bundle-structure}.
-
-\begin{figure}[!htb]
-\footnotesize
-\dirtree{%
-.1 \huberlinFolder hu-berlin-bundle.
-.2 hu-berlin-bundle.dtx \DTcomment{code and documentation}.
-.2 hu-berlin-bundle.pdf \DTcomment{documentation}.
-.2 hu-berlin-base.sty \DTcomment{basic components of the bundle}.
-.2 hu-berlin-letter-example-lualatex.tex \DTcomment{letter}.
-.2 hu-berlin-letter-example.lco \DTcomment{datafile for letter}.
-.2 hu-berlin-letter-example-lualatex.pdf \DTcomment{letter}.
-.2 hu-berlin-letter-example-markdown.pdf \DTcomment{converted letter from markdown}.
-.2 hu-berlin-letter-example-markdown.md \DTcomment{example markdown file }.
-.2 hu-berlin-letter-template.latex \DTcomment{template for conversion}.
-.2 \huberlinFolder img\DTcomment{folder for images}.
-.3 texografie-logo.png\DTcomment{logo of maintainer}.
-.3 hu-berlin-logo.jpg\DTcomment{logo of HU}.
-.2 makefile\DTcomment{makefile to generate all required files}.
-.2 README.md\DTcomment{README file with information on installation}.
-}
-\caption{Structure of \texttt{hu-berlin} bundle}
-\label{hu-berlin:bundle-structure}
-\end{figure}
-
-When you run the |makefile|
-you get all these various files described above.
-
-
-
-
-\DocInput{\jobname.dtx}
-
-\printbibliography
-
-
-\part{Example files}
-\chapter{Letter}
-\section{From \texttt{.tex}}
-\IfFileExists{hu-berlin-letter-example-lualatex.pdf}
- {\includepdf[%
- pagecommand={\pagestyle{scrheadings}}
- ,link
- ,pages=-
- % ,scale=.5
- ,nup=2x1
- ,frame]{hu-berlin-letter-example-lualatex.pdf}}
- {|hu-berlin-letter-example-lualatex.pdf| missing!}
-
-\section{From \texttt{.md}}
-\IfFileExists{hu-berlin-letter-example-markdown.pdf}
- {\includepdf[%
- pagecommand={\pagestyle{scrheadings}}
- ,link
- ,pages=-
- % ,scale=.5
- ,nup=2x1
- ,frame]{hu-berlin-letter-example-markdown.pdf}}
- {|hu-berlin-letter-example-markdown.pdf| missing!}
-
-
-\end{document}
-%</driver>
-% /*
-% ██ ██████ ██████ ██████ ██ ██ ███ ███ ███████ ███ ██ ████████
-% ██ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ████ ██ ██
-% ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ █████ ██ ██ ██ ██
-% ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
-% ██ ██████ ██████ ██████ ██████ ██ ██ ███████ ██ ████ ██
-% */
-% /*
-% ██████ ██████ ██████ ███████
-% ██ ██ ██ ██ ██ ██
-% █████ ██ ██ ██ ██ ██ █████ █████
-% ██ ██ ██ ██ ██ ██
-% ██████ ██████ ██████ ███████
-% */
-% \fi
-%
-% \part{Guideline for Users}
-% \begin{macrocode}
-%<*example>
-% \end{macrocode}
-% \chapter{Letter}
-% We give an example on how to create a letter.
-%
-% \section{\texttt{.lco}-file}
-% \begin{macrocode}
-%<*lco>
-% \end{macrocode}
-% This is the file you load into your |.tex| letter.
-% The information you provide here do normally not change from letter to letter.
-% That’s why we put it in a separate file.
-%
-% The first line should provide this information.
-% \begin{macrocode}
-\ProvidesFile{hu-berlin-letter-example.lco}
-% \end{macrocode}
-% Now we set up the personal data.
-%
-% We start with the name of the sender.
-% \begin{macrocode}
-\setkomavar{fromname}
-% \end{macrocode}
-% you can also write the position of this person in brackets, this is optional;
-% \oarg{position}
-% \begin{macrocode}
- [Wissenschaftlicher Mitarbeiter]
-% \end{macrocode}
-% But you need to give a name:
-% \begin{macrocode}
- {Dr. Max Mustermann}
-% \end{macrocode}
-% The mail address
-% \begin{macrocode}
-\setkomavar{fromemail}{max.mustermann@hu-berlin.de}
-% \end{macrocode}
-% For phone and fax number you only need to type the last digits.
-% \begin{macrocode}
-\setkomavar{fromphone}{1234}
-% \end{macrocode}
-% If you don’t have a fax (or a phone),
-% leave it empty. Do \emph{not} delete it.
-% \begin{macrocode}
-\setkomavar{fromfax}{5678}
-% \end{macrocode}
-% And finally the URL.
-% \begin{macrocode}
-\setkomavar{fromurl}{www.hu-berlin.de}
-% \end{macrocode}
-% If your backaddress is to long
-% – it will be set up automatically –
-% you can redefine it.
-% \begin{macrocode}
-\setkomavar{backaddress}{HU Berlin\\
-Unter den Linden 6\\
-D-10099 Berlin}
-% \end{macrocode}
-% Selfexplaining: the faculty.
-% \begin{macrocode}
-\setkomavar{faculty}{%
-Philosophische Fakultät
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\setkomavar{institute}{%
- \mbox{Institut für Briefvorlagen}
-}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar{institute.additional}{Here you can add more text.}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar{institute.head}[Dekanin]{Prof. Dr. Maike Musterfrau}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar{institute.head.mail}{maike.musterfrau@hu-berlin.de}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar{local}{%
- Mohrenstraße 40/41\\
- Zimmer X\\
- D-10117 Berlin}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar{connections}{U Bahnhof Hausvogteiplatz (U2)}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar{accessibility}{Hausvogteiplatz}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar{signature}{%
- \usekomavar{institute.head} --
- \usekomavar{fromname}
-}
-% \end{macrocode}
-% \begin{macrocode}
-%</lco>
-% \end{macrocode}
-% \huberlinlisting%
-% [listing options = {%
-% ,linerange={18-48}
-% ,numbers = left
-% ,numbersep = 10pt
-% ,numberstyle =\footnotesize\ttfamily\color{hu-berlin-grey}
-% }]%
-% {hu-berlin-letter-example.lco}
-%
-% \section{\texttt{.tex}-file}
-% \begin{macrocode}
-%<*letter>
-% \end{macrocode}
-% \begin{macrocode}
-\documentclass{hu-berlin-letter}
-% \end{macrocode}
-% Now we load the personal data-file which has the ending |.lco|.
-% \begin{macrocode}
-\LoadLetterOption{hu-berlin-letter-example}
-% \end{macrocode}
-% If you have the HU font installed on your computer,
-% you can load it, too:
-% \begin{macrocode}
-% \setmainfont[%
-% BoldFont=ScalaSans-BoldLF,
-% Numbers=OldStyle]{ScalaSans-RegularLF}
-% \end{macrocode}
-% Now following the reference information
-% \begin{macrocode}
-\setkomavar{myref}{}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar{yourref}{}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar{yourmail}{}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar{customer}{}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar{invoice}{}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar{subject}{Betreff}
-% \end{macrocode}
-% \begin{macrocode}
-\usepackage{blindtext}
-% \end{macrocode}
-% We close the preamble and start the letter
-% \begin{macrocode}
-\begin{document}
-% \end{macrocode}
-% The address is written as \marg{address}
-% \begin{macrocode}
-\begin{letter}{%
-% \end{macrocode}
-% \begin{macrocode}
- Erika Musterfrau\par
- Musterweg 43\par
- 56789 Musterhausen%
-% \end{macrocode}
-% Closing now again.
-% \begin{macrocode}
-}
-% \end{macrocode}
-% \begin{macrocode}
-\opening{Sehr geehrte Frau Musterfrau,}
-% \end{macrocode}
-% This is just some blindtext.
-% \begin{macrocode}
-\blindtext[2]
-\clearpage
-\blindtext
-% \end{macrocode}
-% Closing letter
-% \begin{macrocode}
-\closing{Mit freundlichen Grüßen}
-% \end{macrocode}
-% If you still have something to say/write.
-% \begin{macrocode}
-\ps PS: \dots
-% \end{macrocode}
-% Any amendment.
-% \begin{macrocode}
-\encl{%
- Anlage 1\\
- Anlage 2%
-}
-% \end{macrocode}
-% This is the distribution
-% \begin{macrocode}
-\cc{%
- Verteiler 1\\
- Verteiler 2%
-}
-% \end{macrocode}
-% That’s it. Done.
-% \begin{macrocode}
-\end{letter}
-\end{document}
-% \end{macrocode}
-% And how does a example letter looks like?
-% \huberlinlisting%
-% [listing options = {%
-% ,linerange={18-48}
-% ,numbers = left
-% ,numbersep = 10pt
-% ,numberstyle =\footnotesize\ttfamily\color{hu-berlin-grey}
-% }]%
-% {hu-berlin-letter-example-lualatex.tex}
-% \begin{macrocode}
-%</letter>
-% \end{macrocode}
-% \section{Letter from markdown}
-% \begin{macrocode}
-%<*letter-md>
-% \end{macrocode}
-% You need to have |pandoc| installed on your computer.
-% To create letters via markdown and |pandoc| run from the command line:
-%
-% \begin{warning}pandoc --pdf-engine=lualatex --template hu-berlin-letter-template.latex -o YOUR-FILE.pdf YOUR-FILE.md\end{warning}
-% The |.md| file needs a section with metadata.
-%
-% It starts and ends with three |---|.
-% All necessary metadata information are listed inbetween.
-% \begin{macrocode}
----
-documentclass: hu-berlin-letter
-% \end{macrocode}
-% The following will load the |.lco|-file, you replace that with the name of your |.lco|-file.
-% \begin{macrocode}
-sender: hu-berlin-letter-example
-% \end{macrocode}
-% You should also tell a short subject
-% \begin{macrocode}
-subject: Short description
-% \end{macrocode}
-% The information for the addressee has to be written like this:
-% \begin{macrocode}
-addressee:
- - Alexander von Humboldt
- - Unter den Linden 6
- - 10099 Berlin
-% \end{macrocode}
-% \begin{macrocode}
----
-% \end{macrocode}
-% You find a list with possible options for this metadata information header below.
-%
-% Now the content of your letter
-% \begin{macrocode}
-Thank you very much for your letter.
-% \end{macrocode}
-% Let’s see how this example file looks like:
-% \huberlinlisting%
-% [listing options = {%
-% ,numbers = left
-% ,numbersep = 10pt
-% ,numberstyle =\footnotesize\ttfamily\color{hu-berlin-grey}
-% }]%
-% {hu-berlin-letter-example-markdown.md}
-% \begin{macrocode}
-%</letter-md>
-% \end{macrocode}
-% Here we close the example files.
-% \begin{macrocode}
-%</example>
-% \end{macrocode}
-%\part{Guide for Coders}
-% \begin{macrocode}
-%<*sty>
-% \end{macrocode}
-%\chapter{hu-berlin-base-package}
-% \begin{macrocode}
-%<*base>
-% \end{macrocode}
-% Since we do want to compile with \lualatex,
-% we make sure that it will be compilable only with that.
-% \begin{macrocode}
-\RequirePackage{ifluatex,luatex85}
-% \end{macrocode}
-% Now a fix.\fnurl{https://tex.stackexchange.com/a/75065}
-% \begin{macrocode}
-\ifx\directlua\relax
- \let\directlua\UnDeFiNeD
-\fi
-% \end{macrocode}
-% \begin{macrocode}
-\ifluatex
-\else
-\GenericError{hu-berlin}%
- {Please use `LuaLaTeX' as Compiler.^^J I abort here.}
-\fi
-% \end{macrocode}
-% We do not need many packages.
-% The ones we need are loaded now.
-% \begin{macrocode}
-\RequirePackage[english,ngerman]{babel}
-% \end{macrocode}
-% Common package for handling figures is \pkg{graphicx}.
-% \begin{macrocode}
-\RequirePackage{graphicx}
-% \end{macrocode}
-% For loading fonts.
-% \begin{macrocode}
-\RequirePackage{fontspec}
-% \end{macrocode}
-% Actually the corporate design says
-% that the font Verdana should be used.
-% But since this font is not included in
-% UNIX-systems we use a derivative.
-% \begin{macrocode}
-\setmainfont{TeX Gyre Heros}
-% \end{macrocode}
-% If you have Verdana on your system
-% you can uncomment the following line.
-% \begin{macrocode}
-% \setmainfont{Verdana}
-% \end{macrocode}
-% For the wheelchair symbol we load \pkg{marvosym}
-% \begin{macrocode}
-\RequirePackage{marvosym}
-% \end{macrocode}
-% And we define various colors from the corporate design manual.
-% \begin{macrocode}
-\RequirePackage{xcolor}
-\definecolor{hu-berlin-blue}{RGB}{0,65,137}
-\definecolor{hu-berlin-green}{RGB}{150,190,20}
-\definecolor{hu-berlin-grey}{RGB}{169,169,169}
-\definecolor{hu-berlin-brown}{RGB}{82,79,60}
-\definecolor{hu-berlin-red}{RGB}{180,0,0}
-% \end{macrocode}
-% That’s all for the base package, so we close it.
-% \begin{macrocode}
-%</base>
-% \end{macrocode}
-% \begin{macrocode}
-%</sty>
-% \end{macrocode}
-% \begin{macrocode}
-%<*cls>
-% \end{macrocode}
-%\chapter{Letter}
-% \begin{macrocode}
-%<*letter>
-% \end{macrocode}
-% We load \pkg{scrlttr2} which is the documentclass for letters.
-% Furthermore we set up some options.
-% \begin{macrocode}
-\LoadClass[%
- fontsize=10pt,
- version=last,
-% \end{macrocode}
-% If there is anything to debug, you can enable |visualize|
-% \begin{macrocode}
- % visualize
-% \end{macrocode}
-% \begin{macrocode}
-]{scrlttr2}
-% \end{macrocode}
-% For debugging also uncomment the \cs{showfields}\marg{fields} commanand.
-% \begin{macrocode}
-% \showfields{head,address,location,refline,foot}
-% \end{macrocode}
-% Since all common and basic features of the bundle
-% are located in a separate package we load that first.
-% \begin{macrocode}
-\RequirePackage{hu-berlin-base}
-% \end{macrocode}
-% To get the HU logo on the second and following pages we load \pkg{scrlayer-scrpage}.\fnurl{https://tex.stackexchange.com/a/495258/98739}
-% \begin{macrocode}
-\RequirePackage{scrlayer-scrpage}
-\clearpairofpagestyles
-\DeclareNewLayer[
- foreground,
- voffset=\useplength{firstheadvpos},
- hoffset=\useplength{firstheadhpos},
- width=\useplength{firstheadwidth},
- mode=picture,
- contents=\putUL{\raisebox{-\height}{\usekomavar{firsthead}}}
-]{likefirstpage.head}
-\AddLayersToPageStyle{scrheadings}{likefirstpage.head}
-\DeclareNewLayer[
- foreground,
- align=r,
- voffset=\useplength{locvpos},
- hoffset=\paperwidth-\useplength{lochpos},
- width=\useplength{locwidth},
- height=\useplength{locheight},
- contents=\usekomavar{nextlocation},
- %pretocontents=\layercontentsmeasure% to show the position of the layer
-]{likefirstpage.loc}
-\AddLayersToPageStyle{scrheadings}{likefirstpage.head,likefirstpage.loc}
-% \end{macrocode}
-% Now we apply the code for following pages.
-% \begin{macrocode}
-\newkomavar{nextlocation}
-\setkomavar{nextlocation}{%
- \raggedright
- \fontsize{7}{8.5}\selectfont
- \pagemark
-}
-% \end{macrocode}
-% For better adjustments of the layout we load \pkg{geometry}.
-% \begin{macrocode}
-\RequirePackage{geometry}
-\geometry{%
- a4paper
- ,left =25mm
- ,bottom =16mm
- ,foot =4mm
- ,top =77mm
- ,headheight =15pt
- ,textwidth =117mm
- ,marginparsep =0mm
- ,marginparwidth =0mm
-}
-% \end{macrocode}
-% Main Text and signature should be raggedright.
-% \begin{macrocode}
-\renewcommand*{\raggedsignature}{\raggedright}
-\raggedright
-% \end{macrocode}
-% We also want to put the enclosures at the bottom of the page.\fnurl{https://tex.stackexchange.com/questions/77991/put-the-encl-at-the-bottom-of-the-page-lettre-class}
-% \begin{macrocode}
-\def\stopletter{}
-\let\enclold\encl
-\renewcommand\encl[1]{\vskip0ptplus1filll\enclold{#1}}
-% \end{macrocode}
-% We define new |komavar|s.
-%
-% First the possibility to name the faculty,
-% \begin{macrocode}
-\newkomavar{faculty}
-\newkomafont{faculty}{\bfseries\fontsize{8.5}{10}\selectfont}
-% \end{macrocode}
-% then the institute
-% \begin{macrocode}
-\newkomavar{institute}
-\newkomafont{institute}{\fontsize{8.5}{10}\selectfont}
-% \end{macrocode}
-% and further fields for information.
-% \begin{macrocode}
-\newkomavar{institute.additional}
-% \end{macrocode}
-% We pass the name of the head of the institute.
-% \begin{macrocode}
-\newkomafont{institute.head}{\bfseries}
-\newkomavar{institute.head}%
-% \end{macrocode}
-% Its position will be written as the optional argument.
-%
-% There is even the possibility to print the email-address onto the letter.
-% \begin{macrocode}
-\newkomavar{institute.head.mail}%
-% \end{macrocode}
-% Since there are many buildings with offices we tell where to find the sender
-% \begin{macrocode}
-\newkomavar{local}
-\setkomavar*{local}{Sitz:}
-% \end{macrocode}
-% and how to get there.
-% \begin{macrocode}
-\newkomavar{connections}
-\setkomavar*{connections}{Verkehrsverbindungen:}
-% \end{macrocode}
-% Furthermore we inform about office hours
-% \begin{macrocode}
-\newkomavar{officehours}
-\setkomavar*{officehours}{Sprechzeiten:}
-% \end{macrocode}
-% and if there is accessibility for wheelchairs etc.
-% \begin{macrocode}
-\newkomavar{accessibility}
-\setkomavar*{accessibility}{{\large\reflectbox{\Wheelchair}} Eingang:}
-% \end{macrocode}
-% \begin{macrocode}
-\newkomavar{bank}
-\setkomavar*{bank}{Bankverbindung:}
-\setkomavar{bank}{Deutsche Bank PGK AG}
-\newkomavar{IBAN}
-\setkomavar{IBAN}{\mbox{IBAN DE95 1007 0848 0512 6206 01}}
-\newkomavar{BIC}
-\setkomavar{BIC}{BIC DEUTDEDB110}
-% \end{macrocode}
-% Now we set the location field,
-% which is the section on the right with additional information:
-% \begin{macrocode}
-\setkomavar{location}{%
-% \end{macrocode}
-% First anything regarding the font
-% \begin{macrocode}
- \raggedright
- \fontsize{7}{8.5}\selectfont
-% \begin{macrocode}
-% and for the section of faculty, institute etc. we use \env{minipage}
-% \begin{macrocode}
-\begin{minipage}[t][64mm]{\useplength{locwidth}}
-% \end{macrocode}
-% then the faculty
-% \begin{macrocode}
- {\usekomafont{faculty}%
- \usekomavar{faculty}\\[1\baselineskip]}
-% \end{macrocode}
-% and the institute.
-% \begin{macrocode}
- {\usekomafont{institute}\usekomavar{institute}\\[1\baselineskip]}
-% \end{macrocode}
-% Now anything else regarding the institute.
-% \begin{macrocode}
-\ifkomavarempty{institute.additional}
- {}
- {\usekomavar{institute.additional}\\[1\baselineskip]}
-% \end{macrocode}
-% What follows is the head of institute and its position name.
-% \begin{macrocode}
-\ifkomavarempty{institute.head}
- {}
- {{\usekomafont{institute.head}%
- \usekomavar{institute.head}}\\%
- \usekomavar*{institute.head}}
-% \end{macrocode}
-% We close this section and the minipage.
-% \begin{macrocode}
- \end{minipage}
-% \end{macrocode}
-% Let’s turn to further information.
-%
-% For example date:
-% \begin{macrocode}
- \textbf{\usekomavar*{date}}\\
- \usekomavar{date}\par
-% \end{macrocode}
-% and the sender of the letter.
-% \begin{macrocode}
-\ifkomavarempty{fromname}
- {}
- {\textbf{\usekomavar*{fromname}}\\
- \usekomavar{fromname}\par}
-% \end{macrocode}
-% And the reference of correspondence.
-% \begin{macrocode}
-\ifkomavarempty{myref}
- {}
- {\textbf{\usekomavar*{myref}}\\
- \usekomavar{myref}\par}
-% \end{macrocode}
-% To complete this template we provide the possibility to name further reference fields.
-% \begin{macrocode}
-\ifkomavarempty{yourref}
- {}
- {\textbf{\usekomavar*{yourref}}\\
- \usekomavar{yourref}\par}
-% \end{macrocode}
-% \begin{macrocode}
-\ifkomavarempty{yourmail}
- {}
- {\textbf{\usekomavar*{yourmail}}\\
- \usekomavar{yourmail}\par}
-% \end{macrocode}
-% \begin{macrocode}
-\ifkomavarempty{customer}
- {}
- {\textbf{\usekomavar*{customer}}\\
- \usekomavar{customer}\par}
-% \end{macrocode}
-% \begin{macrocode}
-\ifkomavarempty{invoice}
- {}
- {\textbf{\usekomavar*{invoice}}\\
- \usekomavar{invoice}\par}
-% \end{macrocode}
-% \begin{macrocode}
- \textbf{\usekomavar*{fromaddress}}\\
- \usekomavar{fromaddress}
- \ifkomavarempty{fromphone}
- {\par}
- {\\\usekomavar*{fromphone}\usekomavar{fromphone}
- \ifkomavarempty{fromfax}
- {\par}
- {\\}}
- \ifkomavarempty{fromfax}
- {}
- {\usekomavar*{fromfax}\usekomavar{fromfax}\par}
-% \end{macrocode}
-% Next, emails and url:
-% \begin{macrocode}
-\ifkomavarempty{institute.head.mail}
- {}
- {\usekomavar{institute.head.mail}
- \ifkomavarempty{fromemail}
- {\ifkomavarempty{fromurl}
- {\par}
- {\\}}
- {\\}}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ifkomavarempty{fromemail}
- {}
- {\usekomavar{fromemail}
- \ifkomavarempty{fromurl}
- {\par}
- {\\}}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ifkomavarempty{fromurl}
- {}
- {\usekomavar{fromurl}\par}
-% \end{macrocode}
-% Now the actual location of the sender
-% \begin{macrocode}
-\ifkomavarempty{local}
- {}
- {\textbf{\usekomavar*{local}}\\
- \usekomavar{local}\par}
-% \end{macrocode}
-% The last information section should be pinned to the bottom.
-% \begin{macrocode}
-\vfill
-% \end{macrocode}
-% Inform your addressee about the connection possibilities.
-% \begin{macrocode}
-\ifkomavarempty{connections}
- {}
- {\textbf{\usekomavar*{connections}}\\
- \usekomavar{connections}\par}
-% \end{macrocode}
-% \begin{macrocode}
-\ifkomavarempty{officehours}
- {}
- {\textbf{\usekomavar*{officehours}}\\
- \usekomavar{officehours}\par}
-% \end{macrocode}
-% If there is a barrier free entrance, tell it.
-% \begin{macrocode}
-\ifkomavarempty{accessibility}
- {}
- {\textbf{\usekomavar*{accessibility}}\\
- \usekomavar{accessibility}\par}
-% \end{macrocode}
-% And last the bank connection
-% \begin{macrocode}
-\ifkomavarempty{bank}
- {}
- {\textbf{\usekomavar*{bank}}\\
- \usekomavar{bank}\\
- \usekomavar{IBAN}\\
- \usekomavar{BIC}
- }
-% \end{macrocode}
-% Finally we close \cs{setkomavar}\marg{location}
-% \begin{macrocode}
-}
-% \end{macrocode}
-% To fulfill the Corporate Design rules we adjust a few things.
-% \begin{macrocode}
-\KOMAoptions{%
- numericaldate =true
- ,refline =nodate
- ,backaddress =plain
- ,parskip =half-
-}
-% \end{macrocode}
-% Redefining length.
-% \begin{macrocode}
-\setplength{refvpos}{110mm}
-\setplength{refaftervskip}{0pt}
-\setplength{toaddrhpos}{25mm}
-\setplength{firstheadhpos}{\useplength{toaddrhpos}}
-\setplength{lochpos}{15mm}
-\setplength{locvpos}{\useplength{toaddrvpos}}
-\addtoplength{locvpos}{.75\baselineskip}
-\setplength{locwidth}{45mm}
-\setplength{locheight}{232mm}
-% \end{macrocode}
-% Now resetting or pre-defining some variables.
-%
-% First we set the head of the first page,
-% which is the logo.
-% Be sure that you have the right using it!
-% Everything regarding the logo is defined in
-% the corporate design guidlines.\fnurl{https://www.hu-berlin.de/de/hu-intern/design/basiselemente/leitfaden-corporate-design-hu.pdf}
-% \begin{macrocode}
-\setkomavar{firsthead}{%
- \includegraphics[width=145mm]{hu-berlin-logo}%
-}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\setkomavar{backaddressseparator}{~\textbar~}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\setkomavar{fromphone}{0000}
-\setkomavar*{fromphone}{Telefon +49 [30] 2093–}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\setkomavar{fromfax}{0000}
-\setkomavar*{fromfax}{Telefax +49 [30] 2093–}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\setkomavar*{fromaddress}{Postanschrift:}
-\setkomavar{fromaddress}{%
- Humboldt-Universität zu Berlin\par
- Unter den Linden 6\par
- D-10099 Berlin}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\setkomavar*{date}{Datum:}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\setkomavar*{fromname}{Bearbeiter:}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\setkomavar*{myref}{Geschäftszeichen:}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar*{enclseparator}{Anlage}
-% \end{macrocode}
-% \begin{macrocode}
-\setkomavar*{ccseparator}{Kopie an}
-% \end{macrocode}
-% \begin{macrocode}
-% \RequirePackage{hyperref}
-% \AtBeginDocument{{
-% \usekomavar[\def\author]{fromname}
-% \usekomavar[\def\subject]{subject}
-% \hypersetup{%
-% pdftitle = {\subject},
-% pdfauthor = {\author},
-% pdfsubject = {\subject},
-% pdfkeywords = {\author, \subject},
-% pdflang = de,
-% pdfdisplaydoctitle = true,
-% colorlinks = true,
-% plainpages = false,
-% hypertexnames = false,
-% unicode,
-% }
-% }}
-% \end{macrocode}
-% \begin{macrocode}
-%</letter>
-% \end{macrocode}
-% \begin{macrocode}
-%</cls>
-% \end{macrocode}
-% \begin{macrocode}
-%<*template>
-% \end{macrocode}
-% \chapter{Boilerplate / Template for letters }
-% \begin{macrocode}
-%<*letter-md>
-% \end{macrocode}
-% \begin{macrocode}
-\documentclass{hu-berlin-letter}
-% \end{macrocode}
-% We predefine two variables.
-% \begin{macrocode}
-\newkomavar{opening}
-\newkomavar{closing}
-\setkomavar{opening}{Sehr geehrte Damen und Herren}
-\setkomavar{closing}{Mit freundlichen Grüßen}
-% \end{macrocode}
-% \begin{macrocode}
-$for(letteroption)$
-\LoadLetterOption{$letteroption$}
-$endfor$
-$if(sender)$\LoadLetterOption{$sender$}$endif$
-$if(addresseeimage)$\setkomavar{addresseeimage}{$addresseeimage$}$endif$
-$if(backaddress)$\setkomavar{backaddress}{$backaddress$}\KOMAoptions{backaddress=true}$endif$
-$if(fromalign)$\KOMAoptions{fromalign=$fromalign$}$endif$
-$if(customer)$\setkomavar{customer}{$customer$}$endif$
-$if(date)$\setkomavar{date}{$date$}$endif$
-$if(fromaddress)$\setkomavar{fromaddress}{$fromaddress$}$endif$
-$if(frombank)$\setkomavar{frombank}{$frombank$}$endif$
-$if(fromemail)$\setkomavar{fromemail}{$fromemail$}\KOMAoptions{fromemail=true}$endif$
-$if(fromfax)$\setkomavar{fromfax}{$fromfax$}\KOMAoptions{fromfax=true}$endif$
-$if(fromlogo)$\setkomavar{fromlogo}{$fromlogo$}\KOMAoptions{fromlogo=true}$endif$
-$if(frommobilephone)$\setkomavar{frommobilephone}{$frommobilephone$}\KOMAoptions{frommobilephone=true}$endif$
-$if(fromname)$\setkomavar{fromname}{$fromname$}$endif$
-$if(fromphone)$\setkomavar{fromphone}{$fromphone$}\KOMAoptions{fromphone=true}$endif$
-$if(fromurl)$\setkomavar{fromurl}{$fromurl$}\KOMAoptions{fromurl=true}$endif$
-$if(fromzipcode)$\setkomavar{fromzipcode}{$fromzipcode$}$endif$
-$if(invoice)$\setkomavar{invoice}{$invoice$}$endif$
-$if(location)$\setkomavar{location}{$location$}$endif$
-$if(myref)$\setkomavar{myref}{$myref$}$endif$
-$if(myrefname)$\setkomavar*{myref}{$myrefname$}$endif$
-$if(place)$\setkomavar{place}{$place$}$endif$
-$if(PPcode)$\setkomavar{PPcode}{$PPcode$}$endif$
-$if(signature)$\setkomavar{signature}{$signature$}$endif$
-$if(specialmail)$\setkomavar{specialmail}{$specialmail$}$endif$
-$if(subject)$\setkomavar{subject}{$subject$}$endif$
-$if(title)$\setkomavar{title}{$title$}$endif$
-$if(yourmail)$\setkomavar{yourmail}{$yourmail$}$endif$
-$if(yourref)$\setkomavar{yourref}{$yourref$}$endif$
-$if(opening)$\setkomavar{opening}{$opening$}$endif$
-$if(closing)$\setkomavar{closing}{$closing$}$endif$
-$if(firstfoot)$\setkomavar{firstfoot}{$firstfoot$}$endif$
-% \end{macrocode}
-% Ok, let’s sum up the possible options you can use to pass data to the letter:
-% \begin{itemize} \item addresseeimage \item backaddress \item customer \item date \item fromaddress \item frombank \item fromemail \item fromfax \item fromlogo \item frommobilephone \item fromname \item fromphone \item fromurl \item fromzipcode \item invoice \item location \item myref \item myrefname \item place \item PPcode \item signature \item specialmail \item subject \item title \item yourmail \item yourref \item opening \item closing \item firstfoot \end{itemize}
-% Sometimes you might not have an addressee – we are checking this, too.
-% \begin{macrocode}
-$if(addressee)$
-$else$
-\KOMAoptions{addrfield=false}
-$endif$
-% \end{macrocode}
-% Now the actual content of the letter
-% \begin{macrocode}
-\begin{document}
-\begin{letter}{%
-$for(addressee)$
-$addressee$$sep$\par
-$endfor$
-}
-$for(include-before)$
-$include-before$
-$endfor$
-\opening{\usekomavar{opening}}
-$body$
-\closing{\usekomavar{closing}}
-$if(ps)$\ps{$ps$}$endif$
-$if(encl)$\encl{$encl$}$endif$
-$for(include-after)$$include-after$$endfor$
-\end{letter}
-\end{document}
-% \end{macrocode}
-% \begin{macrocode}
-%</letter-md>
-%</template>
-% \end{macrocode}
-%\chapter{Documentation preamble \param{style}}
-% \begin{macrocode}
-%<*sty>
-%<*style>
-\makeatletter
-\addtolength\marginparwidth{-40pt}
-\addtolength\marginparsep{4mm}
-\addtolength\oddsidemargin{-20pt}
-\addtolength\evensidemargin{-20pt}
-\let\PrintDescribeMacro=\@gobble
-\let\PrintDescribeEnv=\@gobble
-% \def\Describe@Macro#1{\endgroup
-% %\marginnote{\PrintDescribeMacro{#1}}%
-% \SpecialUsageIndex{#1}\@esphack\ignorespaces%
-% }
-%\def\Describe@Env#1{\endgroup
-% %\marginnote{\PrintDescribeEnv{#1}}%
-% \SpecialEnvIndex{#1}\@esphack\ignorespaces%
-% }
-\makeatother
-\AtBeginDocument{\normalmarginpar}
-\setlength\MacrocodeTopsep{.5\baselineskip}
-\setlength\MacroIndent{6mm}
-
-
-\RequirePackage{luatexbase}
-\RequirePackage[ngerman,english]{babel}
-\RequirePackage{calc}
-
-\RequirePackage[
- paper = a4paper, % - use A4 paper size
- foot = 2cm,
- inner = 3cm, % - total body: left margin (odd pages)
- top = 3cm, % - total body: top margin
- outer = 3cm, % - total body: right margin (odd pages)
- bottom = 3cm, % - total body: bottom margin
- marginparwidth = 2cm, % - width for side note
- marginparsep = .5cm, % - space between notes and body text (content)
-% showframe,
-]{geometry}
-
-\newlength\fullwidth
-\setlength\fullwidth{\textwidth+\marginparwidth+\marginparsep}
-
-\KOMAoptions{
- numbers = noenddot,
-}
-\AtBeginDocument{
- \KOMAoptions{
- % headwidth = {\fullwidth},
- % footwidth = {\fullwidth},
- footheight = 20pt,
- headheight = 29pt,
- captions = tableheading,
-}}
-
-
-
-\title{\huberlintitle}
-%\subtitle{\huberlinsubtitle}
-\author{\huberlinauthor}
-\date{\Version}
-
-
-%---- Required Packages
-\RequirePackage{ifluatex,luatex85}
-\ifx\directlua\relax
- \let\directlua\UnDeFiNeD
-\fi
-\ifluatex
-\else
-\GenericError{hu-berlin}%
- {Please use `LuaLaTeX' as Compiler.^^J I abort here.}
-\fi
-% \end{macrocode}
-% For fonts we load the package \pkg{fontspec} which
-% has almost no limits handling font-stuff.
-% \begin{macrocode}
-\RequirePackage{fontspec}
-% \end{macrocode}
-% \begin{macrocode}
-\RequirePackage[mono=false]{libertine}
-\RequirePackage{amssymb}
-
-\defaultfontfeatures{%
- Ligatures = TeX
-}
-% \end{macrocode}
-% For fonts we use the available |TeX Gyre Pagella| as main font.\fnurl{http://www.gust.org.pl/projects/e-foundry/tex-gyre}
-% \begin{macrocode}
-\setmainfont[%
- Ligatures = TeX
- ,Numbers = OldStyle]{TeX Gyre Pagella}
-% \end{macrocode}
-% And we declare also the other fonts, too.
-% \begin{macrocode}
-\setmonofont[%
- Scale=1
-]{TeX Gyre Cursor}
-\setsansfont[%
- ,LetterSpace = .8
-]{TeX Gyre Adventor-Regular}
-\linespread{1.05}
-% \end{macrocode}
-% \begin{macrocode}
-
-
-
-\RequirePackage{marginnote}
-\renewcommand*{\marginfont}{%
- \rule{0pt}{0.7\baselineskip}%
- \footnotesize%
- \color{hu-berlin-brown}}
-
-\RequirePackage[
- german = guillemets,
- style = german,
-]{csquotes}
-
-\RequirePackage{enumitem}
-\setlist{
- nosep,
- % itemindent=1em,
- % labelindent=0.5\parindent,
- leftmargin=*}
-\newlist{tabitemize}{itemize}{2}% neue Listenumgebung
-\setlist[tabitemize]{%
- nosep,
- leftmargin=*
- }
-\setlist[tabitemize,1]{label=\labelitemi}
-\setlist[tabitemize,2]{label=\labelitemii}
-
-
-\clubpenalty=10000 % prevent single lines at the beginning of a paragraph (Schusterjungen)
-\widowpenalty=10000 % prevent single lines at the end of a paragraph (Hurenkinder)
-\displaywidowpenalty=10000 %
-
-\RequirePackage{pdfpages}
-\RequirePackage{biblatex}
-\addbibresource{\jobname-bibliography.bib}
-\addbibresource{\jobname-ctan.bib}
-\RequirePackage{ccicons} %creative commons
-\RequirePackage{xparse}
-\RequirePackage{ragged2e}
-\RequirePackage{microtype}
-\RequirePackage{xspace}
-\RequirePackage{graphicx}
-\graphicspath{{img/}}
-% \end{macrocode}
-% \begin{macrocode}
-\RequirePackage{etoolbox}
-%https://tex.stackexchange.com/a/235881/98739
-\AfterEndPreamble{%
- \maketitle
- \renewcommand\MacroFont{\ttfamily}
- \renewcommand\AltMacroFont{\ttfamily\linespread{.8}}% slanted verbatim
-}
-
-% https://tex.stackexchange.com/a/401466/98739
-\makeatletter
-\renewcommand*{\maketitle}{%
- % taken and shortened from /usr/share/texmf/tex/latex/koma-script/scrartcl.cls
- \begin{titlepage}
- \newgeometry{left=3cm,right=3cm,top=1.5cm,bottom=2cm}
- \global\@topnum=\z@
- \setparsizes{\z@}{\z@}{\z@\@plus 1fil}\par@updaterelative
- \null
- {\large\@author\hfill \href{mailto:lukas@texografie.de}{lukas@texografie.de}\par}
- \vskip 10em%
- {\begin{center}\color{hu-berlin-blue}
- {\fontsize{50}{55}\selectfont\huberlinshort{} \par\vskip .5em%
- \Large\sffamily\@title}\par
- \vskip .5em
- \end{center}}%
- {\ifx\@subtitle\@empty\else\usekomafont{subtitle}\@subtitle\par\fi}%
- \null\vskip 5em%
- \blockcquote[195]{Hoare1973}{Documentation must be regarded as an integral part of the process of design and coding.
- A good programming language will encourage and assist the programmer to write clear,
- self-documenting code,
- and even perhaps to develop
- and display a pleasant style
- of writing.}
- \null\vfill
- {\usekomafont{subtitle}{\@date \hfill
- \includegraphics[width=4cm]{texografie}\\}}%
- \par
- \vskip 0em
- \restoregeometry
- \end{titlepage}
-}%
-\makeatother
-
-\RequirePackage{xcolor}
-\definecolor{hu-berlin-blue}{RGB}{0,65,137} % HEX 004189
-\definecolor{hu-berlin-green}{RGB}{150,190,20} % HEX 93C11A % Topoi
-\definecolor{hu-berlin-grey}{RGB}{169,169,169}
-\definecolor{hu-berlin-brown}{RGB}{82,79,60}
-\definecolor{hu-berlin-red}{RGB}{180,0,0}
-
-
-\RequirePackage{dirtree}
-\renewcommand*\DTstylecomment{%
- \color{hu-berlin-grey}%
- \footnotesize%
- \sffamily}
-\renewcommand*\DTstyle{%
- \ttfamily%
- \small%
- }
-
-\RequirePackage[
- markcase = noupper,
- footsepline = .5pt,
- % headsepline = .5pt,
- autooneside = false,% use left and right marks with a onesided document
- automark,% set \leftmark and \rightmark automatically by *\section and \subsection
- draft = false,
- ]{scrlayer-scrpage}
-
-\pagestyle{scrheadings}
-\clearscrheadfoot
-\rofoot*{\thepage}
-\lofoot*{\textcolor{hu-berlin-blue}{\huberlintitle}\ \vrule\ \textcolor{hu-berlin-brown}{\huberlinsubtitle}}
-\rohead*{hu-berlin-bundle}
-\lohead*{Version: \Version}
-% \end{macrocode}
-% \begin{macrocode}
-% https://tex.stackexchange.com/a/352925/98739
-\newcommand*\partnumber{}
-\DeclareNewLayer[
- background,
- textarea,
- addwidth=\marginparsep+\marginparwidth,
- mode=picture,
- contents={%
- \putC{\makebox[0pt][c]{\raisebox{-.5\height}{\scalebox{50}{\textcolor{black!5}{\partnumber}}}}}\gdef\partnumber{}%
- }
-]{partnumber}
-\DeclareNewPageStyleByLayers{part}{partnumber}
-\renewcommand\partpagestyle{part}
-\renewcommand*{\partformat}{\gdef\partnumber{\thepart}}
-
-% only a dirty workaround for the part title
-\newcommand*\changedpartwidth[1]{%
- \makebox[\linewidth][l]{%
- \parbox{\dimexpr\textwidth+\marginparsep+\marginparwidth\relax}{\raggedpart#1}%
- }%
-}
-% add \changedpartwidth as last command to the settings for font element part
-\addtokomafont{part}{\Huge\changedpartwidth}
-
-
-
-%-https://tex.stackexchange.com/a/339516/98739 | https://tex.stackexchange.com/a/96722/98739
-% footnotes in the footer:
-\deffootnote%
- %[\normalparindent]%<width of mark>
- {0.0cm}%<indent of footnote text>
- {\normalparindent}%<paragraph indent in the footnote text>
- {\makebox[\normalparindent][r]%
- {\thefootnotemark\hspace*{3pt}}}%<definition of mark>
-\newlength{\normalparindent}
-\AtBeginDocument{\setlength{\normalparindent}{\parindent}}
- \setfootnoterule{0pt}% Kein Fußnotenstrich
- %\setfootnoterule[<height>]{<length>}
-
-% \end{macrocode}
-% This will put the numbers of the chapters and sections into the margin.
-% \begin{macrocode}
-\renewcommand\sectionlinesformat[4]{%
- \makebox[0pt][r]{#3}#4%
-}
-% \end{macrocode}
-% \begin{macrocode}
-\RequirePackage{url}
-% \urlstyle{same}
-
-\setkomafont{title}{\sffamily\color{hu-berlin-blue}\flushleft\bfseries}
-\setkomafont{disposition}{\color{hu-berlin-brown}\sffamily\bfseries\large}
-\setkomafont{section}{\usekomafont{disposition}}
-\setkomafont{subsection}{\usekomafont{disposition}}
-\setkomafont{subsubsection}{\usekomafont{disposition}}
-% \setkomafont{paragraph}{\bfseries}
-% \setkomafont{subsubsection}{\sffamilybold}
-\setkomafont{subtitle}{\large\color{hu-berlin-brown}\sffamily\flushleft}
-\setkomafont{pageheadfoot}{\footnotesize\sffamily\color{hu-berlin-grey}}
-\setkomafont{descriptionlabel}{\bfseries}
-\setkomafont{footnotelabel}{\bfseries}
-\addtokomafont{titlehead}{\flushright}
-% \setkomafont{headsepline}{\color{hu-berlin-blue}}
-%\setkomafont{marginnote}{\MakeUppercase\color{hu-berlin-brown}}
-\addtokomafont{caption}{\scriptsize}
-\setkomafont{captionlabel}{\bfseries\sffamily}
-\setkomafont{subject}{\bfseries\sffamily}
-\setcapindent{0pt}
-
-\raggedbottom
-
-\RequirePackage{listings}
-\PassOptionsToPackage{final}{listings}
-\RequirePackage[%
- skins
- ,listings
- ,breakable
- ,xparse
- ,documentation
-]{tcolorbox}
-\lstMakeShortInline[language=TeX,basicstyle=\ttfamily]|
-% \end{macrocode}
-% Following we load \pkg{hyperxmp} and \pkg{hyperref} for \pdf-meta data and interactive linked text.
-% \begin{macrocode}
-\RequirePackage{hyperxmp}
-\RequirePackage{hyperref}
-\hypersetup{% setup the hyperref-package options
- unicode = true,
- pdfauthor = {hu-berlin}, % - author (PDF meta)
- pdfauthortitle = {},
- pdfcopyright = {Copyright (c) \the\year . All rights reserved.},
- pdfhighlight = /N,
- pdfdisplaydoctitle = true,
- pdflang = {},%de en
- pdfcaptionwriter = {Lukas C. Bossert},
- pdfkeywords = {hu-berlin},
- pdfencoding = auto,
- pdfproducer = {hu-berlin with LuaLaTeX},
- bookmarksnumbered = true,
- bookmarksopenlevel = 2,
- bookmarksopen = true,
- bookmarksdepth = 3,
- colorlinks = true, %Colours links instead of ugly boxes
- urlcolor = hu-berlin-blue, %Colour for external hyperlinks
- linkcolor = black, %Colour of internal links
- citecolor = black, %Colour of citations
- linktoc = page,
- pdfborder = {0 0 0},
- breaklinks = true, %allow line break inside links
- final
-}
-\RequirePackage{bookmark}
-
-\RequirePackage[
- sort,
- nameinlink,
- compress,
- ngerman,english
-]{cleveref}
-
-
-%---- newcommands
-\newcommand{\TeXografie}{Lukas C. Bossert
- (www.TeXografie.de)}
-\newcommand\huberlin{\huberlintitle\xspace}
-
-
-\newcommand\huberlinFolder{%
- \begingroup%
- \normalfont%
- \color{hu-berlin-blue}%
- % \faFolderOpen% taken from fontawesome
- \hspace{.3em}%
- \endgroup}
-
-
-
-\RedeclareSectionCommands[
- tocraggedpagenumber,
- toclinefill=\tocpageseparator,
- tocindent=0em,
- tocnumwidth=4em,
- tocpagenumberbox=\tocpagenumberbox% <- added
-% tocpagenumberformat=\textsf,
-]{chapter,section,subsection,subsubsection,paragraph}
-
-\newcommand\tocgobble[1]{}% <- added
-\newcommand\tocpageseparator{\footnotesize\,\mbox{---}\,}
-\newcommand\tocpagenumberbox[1]{\mbox{#1}}% <- added
-\KOMAoptions{toc=indentunnumbered}
-
-\RedeclareSectionCommand[
-% tocbeforeskip=1.25em plus 1pt
- ,tocentryformat=\large\scshape%
- ,tocindent=0em
- ,tocnumwidth=4em
- ,tocpagenumberbox=\tocgobble% <- added
-]{part}
-%\addtokomafont{partentry}{\scshape\sffamily\bfseries}
-
-\RedeclareSectionCommand[%
-% ,beforeskip=1.15em plus 1pt%
- ,tocentryformat=\textbf%
- % ,toclinefill={\TOCLineLeaderFill}%\TOCLineLeaderFill[\textbf{.}]
-]{chapter}
-
-
-
-
-\newtcolorbox{example}[1][]{
- breakable,
- top=5pt,
- bottom=5pt,
- colback=hu-berlin-blue!10,
- colframe=hu-berlin-blue,
- left=5pt,
- right=5pt,
- sharp corners,
- boxrule=0pt,
- bottomrule=2pt,
- toprule=2pt,
- enhanced jigsaw,
- lefttitle=0pt,
- coltitle=white,
- fonttitle=\bfseries,
- fontupper=\small,%\ttfamily,
- % colbacktitle=hu-berlin-blue!20
- #1,
-}
-
-% Replace the squat-u symbol for spaces
-% https://tex.stackexchange.com/a/488123/98739
-\makeatletter
-\def\lst@visiblespace{\lst@ttfamily{\char32}$\textcolor{hu-berlin-grey}{\cdot}$}
-\makeatother
-
-
-\lstset{%
- basicstyle = \linespread{0.7}\ttfamily
- ,breaklines = true
- ,breakatwhitespace
- ,alsoletter=\\\{\}\*\[\]\-
- ,showstringspaces=true
- }
-
-\lstdefinestyle{hu-berlinlistingstyledef}{%
- tabsize = 4,
- breaklines = true,
- breakatwhitespace = true,
- postbreak=\mbox{$\hookrightarrow$},
- %keepspaces = true,
- escapeinside = {(*@}{@*)},
- moredelim = {[is][\ttfamily\bfseries\color{hu-berlin-blue}]{|}{|}},
- moredelim = {[is][\ttfamily\bfseries\color{hu-berlin-blue}]{|1}{1|}},
- moredelim = {[is][\ttfamily\bfseries\color{hu-berlin-red}]{|2}{2|}},
- aboveskip=0pt,
- belowskip=0pt,
- captionpos=b,
- resetmargins=true,
- sensitive=true,
- upquote=true,
- showspaces=true,
- showtabs=true,
- tab=\textcolor{hu-berlin-grey}{\rightarrowfill},
- %numbers=left,
- %numberstyle=\footnotesize\ttfamily\color{hu-berlin-grey},
- comment = [l]{\%},
- commentstyle = \footnotesize\color{hu-berlin-grey}\addfontfeature{LetterSpace=.7},
- % deletecomment = [l]{\%<}
- % morecomment = [l][\nullfont]{\%<},
- % deletecomment = [is]{\%<}{>},
-}
-
-\lstdefinestyle{hu-berlinlistingstyle}{%
- language = {TeX},
- style = {hu-berlinlistingstyledef},
-}
-
-
-
-
-
-
-\tcbset{%
-hu-berlinstyle/.style={%
- enhanced,
- before skip=2mm,
- after skip=3mm,
- boxrule=0.7pt,
- left=2mm,
- right=2mm,
- top=2mm,
- bottom=2mm,
- sharp corners,
- colback=white,
- colbacklower=white,
- % fonttitle=\sffamily\bfseries,
- breakable,
- %before skip=\baselineskip,
- coltitle=white,
- colbacktitle=hu-berlin-blue!50!black,
- fonttitle=\bfseries\sffamily\footnotesize,
- % before upper={\mynote{\thetcbcounter}},
- title={\hfill{Example \thetcbcounter}},
- },
-codecomment/.style={%
- listing outside comment,%
- boxrule=0pt,
- colback=white,
- }
-}
-
-\newtcolorbox{warning}[1][]{
- enhanced,
- before skip=2mm,
- after skip=3mm,
- boxrule=0.7pt,
- left=5mm,
- right=2mm,
- top=2mm,
- bottom=2mm,
- colback=white,
- colframe=yellow!20!black,
- sharp corners,
- rounded corners=southeast,
- arc is angular,
- arc=3mm,
- underlay={%
- \path[fill=hu-berlin-grey!80!black] ([yshift=3mm]interior.south east)--++(-0.4,-0.1)--++(0.1,-0.2);
- \path[draw=hu-berlin-grey,shorten <=-0.05mm,shorten >=-0.05mm] ([yshift=3mm]interior.south east)--++(-0.4,-0.1)--++(0.1,-0.2);
- \path[fill=red!50!black,draw=none] (interior.south west) rectangle node[white]{\Huge\bfseries !} ([xshift=4mm]interior.north west);
- },
- drop fuzzy shadow,
- #1
- }
-
-\newtcblisting[%
- auto counter,
- crefname = {example}{examples},
- Crefname = {Example}{Examples},
-]{codetext}[2][]{%
- hu-berlinstyle,
-% side text,
- rounded corners=northeast,
- arc=6mm,
- listing style=hu-berlinlistingstyle,
- label = #2,
- #1,
- }
-
-\newtcblisting[%
- use counter from=codetext,
- crefname={code example}{code examples},
- Crefname={Code example}{Code examples}%
-]{code}[2][]{%
- hu-berlinstyle,
- rounded corners=southeast,
- arc=6mm,
- listing only,
- listing style=hu-berlinlistingstyle,
- label = #2,
- #1,
-}
-
-
-\DeclareTCBInputListing[%
- use counter from=codetext,
- crefname={code example}{code examples},
- Crefname={Code example}{Code examples}%
-]{\huberlinlisting}{ O{} m }{%
- hu-berlinstyle,
- listing file={#2},
- listing only,
- listing style=hu-berlinlistingstyle,
- #1,
-}
-
-% \end{macrocode}
-% \begin{macrocode}
-\makeatletter
-\newrobustcmd*{\fnurl}[1][]{\hyper@normalise\ltd@fnurl{#1}}
-\def\ltd@fnurl#1#2{\footnote{#1\hyper@linkurl{\Hurl{#2}}{#2}}}
-\makeatother
-% \end{macrocode}
-% The first command is used to refrence packages with:
-% \cmd{\pkg}\marg{package name}.\footnote{Do not forget to
-% insert the name of the package into the makefile
-% in the definition of |PKG|.}
-% The name of the package is linked to its entry on CTAN and
-% refrenced to the bibliography in the end of this documentation.
-% \begin{macrocode}
-\RequirePackage{newfile}
-\newoutputstream{pkglist}
-% \end{macrocode}
-% \begin{macrocode}
-\NewDocumentCommand{\pkg}{om}{%
- \IfNoValueTF{#1}
- {\lowercase{\href{http://www.ctan.org/pkg/#2}}{\textbf{#2}}}
- {\lowercase{\href{http://www.ctan.org/pkg/#1-#2}}{\textbf{#2}}}%
- \space\cite{#2}%
- \addtostream{pkglist}{#2}}
-% \end{macrocode}
-% \begin{macrocode}
-\newrobustcmd*{\lit}[1]{\textsf{#1}}
-\newrobustcmd*{\Code}[1]{\texttt{#1}}
-\newrobustcmd*{\tex}{\TeX}
-\newrobustcmd*{\etex}{\mbox{e-TeX}}
-\newrobustcmd*{\pdftex}{pdf\-\tex}
-\newrobustcmd*{\xetex}{Xe\-\tex}
-\newrobustcmd*{\luatex}{Lua\-\tex}
-\newrobustcmd*{\latex}{\LaTeX}%{La\kern-0.07em TeX}
-\newrobustcmd*{\pdflatex}{pdf\-\latex}
-\newrobustcmd*{\xelatex}{Xe\-\latex}
-\newrobustcmd*{\lualatex}{Lua\-\latex}
-\newrobustcmd*{\miktex}{Mik\-\tex}
-\newrobustcmd*{\texlive}{\tex~live}
-\newrobustcmd*{\bibtex}{Bib\kern-0.07em TeX}
-\newrobustcmd*{\lppl}{\latex{} Project Public License}
-\newrobustcmd*{\pdf}{{PDF}}
-\newrobustcmd*{\md}{{MarkDown}}
-\newrobustcmd*{\utf}{\mbox{{UTF}-8}}
-% no \mbox here, we may have to break things
-\newrobustcmd*{\bibfield}[1]{\Code{#1}}
-\newrobustcmd*{\opt}[1]{\Code{#1}}
-\newrobustcmd*{\bibmacro}[1]{\Code{#1}}
-\newrobustcmd*{\bibtype}[1]{\Code{@#1}}
-%\renewrobustcmd*{\cmd}[1]{\Code{\textbackslash #1}}
-\renewrobustcmd\meta[1]{\normalfont{\textlangle}{\itshape#1\/}{\textrangle}}
-
-% directly taken from ltxdoc.dtx
-\renewrobustcmd\marg[1]{%
- {\ttfamily\textcolor{hu-berlin-red}{\{}}%
- \meta{#1}%
- {\ttfamily\textcolor{hu-berlin-red}{\}}}%
- }
-
-\renewrobustcmd\oarg[1]{%
- {\ttfamily\textcolor{hu-berlin-green}{[}}%
- \meta{#1}%
- {\ttfamily\textcolor{hu-berlin-green}{]}}%
- }
-
-% adapted from listings.dtx (lstdoc.sty)
-\renewrobustcmd\cmd[1]{%
- \texttt{\color{hu-berlin-blue}\textbackslash\string#1}\xspace%
- }
-
-\newrobustcmd\env[2][]{%
- \texttt{%
- \color{hu-berlin-blue}%
- \textbackslash begin\{\string#2\}#1}%
- \ldots
- \texttt{%
- \color{hu-berlin-blue}%
- \textbackslash end\{\string#2\}}%
- \xspace}
-% \end{macrocode}
-% For a common layout of the parameter style to identify code
-% of the different documents, files and packages we use
-% \cmd{param}\marg{name of the parameter}.
-% \begin{macrocode}
-\newcommand\param[1]{%
- \begingroup%
- \normalfont%
- \ttfamily%
- \bfseries%
- \textless%
- #1%
- \ttfamily%
- \bfseries%
- \textgreater%
- \endgroup}
-% \end{macrocode}
-% \begin{macrocode}
-\pdfstringdefDisableCommands{%
- \def\lstinline#1{<#1>}
- \def\tex{TeX}%
- \def\etex{e-TeX}%
- \def\xetex{XeTeX}%
- \def\latex{LaTeX}%
- \def\xelatex{XeLaTeX}%
- \def\bibtex{BibTeX}%
- \def\lppl{LaTeX Project Public License}%
- \def\pdf{PDF}%
- \def\utf{UTF-8}%
- \def\\{}%
- \def\texttt#1{<#1>}%
- \def\marg#1{\{#1\}}%
- \def\oarg#1{[#1]}%
- \def\color#1#2{}%
- \def\env#1{<#1>}
- \def\cmd#1{#1}
-}
-% https://tex.stackexchange.com/a/24067/98739
-\makeatletter
-\patchcmd{\scr@startchapter}{\if@openright\cleardoublepage\else\clearpage\fi}{}{}{}
-\makeatother
-%
-\RequirePackage[tightLists=false]{markdown}
-\markdownSetup{rendererPrototypes={%
- link = {\href{#3}{#1}}%
-}}
-%</style>
-% \end{macrocode}
-% \begin{macrocode}
-%</sty>
-% \end{macrocode} \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/hu-berlin-bundle/hu-berlin-bundle.ins b/Master/texmf-dist/source/latex/hu-berlin-bundle/hu-berlin-bundle.ins
deleted file mode 100644
index 21b553e68a5..00000000000
--- a/Master/texmf-dist/source/latex/hu-berlin-bundle/hu-berlin-bundle.ins
+++ /dev/null
@@ -1,79 +0,0 @@
-%%
-%% This is file `hu-berlin-bundle.ins',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% hu-berlin-bundle.dtx (with options: `install')
-%% ----------------------------------------------------------------
-%% hu-berlin-bundle
-%% Author: Lukas C. Bossert
-%% E-mail: lukas@texografie.de
-%% License: Released under the LaTeX Project Public License v1.3c or later
-%% See: http://www.latex-project.org/lppl.txt
-%% Various parts my have a different licence,
-%% please consider and respect them carefully.
-%% ----------------------------------------------------------------
-%%
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
-
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-
-\nopreamble\nopostamble
-
-\usedir{doc/latex/\jobname}
-\generate{
- \file{README.md}{\from{\jobname.dtx}{readme,main}}
- \file{hu-berlin-bundle-bibliography.bib}{\from{\jobname.dtx}{bib}}
- \file{hu-berlin-letter-example-lualatex.tex}{\from{\jobname.dtx}{example,letter}}
- \file{hu-berlin-letter-example-markdown.md}{\from{\jobname.dtx}{example,letter-md}}
-}
-
-\preamble
-----------------------------------------------------------------
-hu-berlin-bundle
-Author: Lukas C. Bossert
-E-mail: lukas@texografie.de
-License: Released under the LaTeX Project Public License v1.3c or later
-See: http://www.latex-project.org/lppl.txt
-Various parts my have a different licence,
-please consider and respect them carefully.
-----------------------------------------------------------------
-
-\endpreamble
-\postamble
-
-Copyright (C) 2019-2020
-\endpostamble
-
-\usedir{tex/latex/\jobname}
-\generate{
- \file{hu-berlin-letter-example-lualatex.tex}{\from{\jobname.dtx}{example,letter}}
- \file{hu-berlin-letter-example.lco}{\from{\jobname.dtx}{example,lco}}
- \file{hu-berlin-letter.cls}{\from{\jobname.dtx}{cls,letter}}
- %
- \file{hu-berlin-base.sty}{\from{\jobname.dtx}{sty,base}}
- \file{hu-berlin-bundle-style.sty}{\from{\jobname.dtx}{sty,style}}
- \file{hu-berlin-letter-template.latex}{\from{\jobname.dtx}{template,letter-md}}
-}
-\endbatchfile
-%%
-%% Copyright (C) 2019-2020
-%%
-%% End of file `hu-berlin-bundle.ins'.
diff --git a/Master/texmf-dist/source/latex/hulipsum/hulipsum.dtx b/Master/texmf-dist/source/latex/hulipsum/hulipsum.dtx
index 95e46ed78e7..ce3527588b8 100644
--- a/Master/texmf-dist/source/latex/hulipsum/hulipsum.dtx
+++ b/Master/texmf-dist/source/latex/hulipsum/hulipsum.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 2018- by Tibor Tomacs
+% Copyright 2018-2020 by Tibor Tomacs
%
% Hungarian dummy text (Lorum ipse) for demonstrating the textual elements of a document template
% All paragraphs are taken with permission from http://www.lorumipse.hu/.
@@ -25,7 +25,7 @@
\ProvidesFile{hulipsum.dtx}
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-%<package>\ProvidesPackage{hulipsum}[2018/03/03 v1.0 Hungarian dummy text (Lorum ipse)]
+%<package>\ProvidesPackage{hulipsum}[2020/11/03 v1.1 Hungarian dummy text (Lorum ipse)]
%
%<*driver>
\documentclass{ltxdoc}
@@ -60,7 +60,7 @@ keepspaces]}
%
% \GetFileInfo{hulipsum.sty}
%
-% \title{The {\bfseries\sffamily hulipsum} package\\{\large v1.0 (2018/03/03)}}
+% \title{The {\bfseries\sffamily hulipsum} package\\{\large v1.1 (2020/11/03)}}
% \author{Tibor Tómács\\{\normalsize\url{tomacs.tibor@uni-eszterhazy.hu}}}
% \date{}
% \maketitle
@@ -103,6 +103,12 @@ keepspaces]}
% It works like \verbinline|\hulipsumsave|, but the paragraphs will be separated by space in the \verbinline|\hulipsumexp|.
%
% \verbinline|\hulipsumsave*[!<num1>!-!<num2>!]\hulipsumexp| is equivalent to \verbinline|\hulipsum*[!<num1>!-!<num2>!]|.
+%
+% \item\commandinline|\hulipsumdocument|\\
+% It creates a blind document with title, author, date, table of contents, chapter, section, subsection, subsubsection, paragraph, subparagraph, figure, lists and bibliography.
+%
+% \item\commandinline|\hulipsumdocument[part]|\\
+% It works like \verbinline|\hulipsumdocument|, but it creates a part before the chapter and section.
% \end{description}
%
% \StopEventually
@@ -201,6 +207,81 @@ keepspaces]}
\AtEndOfPackage{\hulipsumsave}
+\newif\if@hulipsum@firstexpand@
+\@hulipsum@firstexpand@true
+
+\newcommand{\hulipsumdocument}[1][]{%
+\if@hulipsum@firstexpand@
+\global\@hulipsum@firstexpand@false%
+\def\hulipsum@part{#1}%
+\def\hulipsum@partcheck{part}%
+\@ifundefined{title}{}{\title{L\'{o}rum ipse}}
+\@ifundefined{author}{}{\author{Nyomasek Bob\'{o}}}
+\@ifundefined{maketitle}{}{\maketitle}
+\@ifundefined{tableofcontents}{}{\tableofcontents}
+\@ifundefined{abstract}{}{\begin{abstract}\hulipsum[1]\end{abstract}}
+\ifx\hulipsum@part\hulipsum@partcheck%
+\@ifundefined{part}{}{\part{Borzaszt\'{o}an cog\'{a}lis pat\'{a}s}}
+\fi
+\@ifundefined{chapter}{}{\chapter{Fog\'{a}s n\'{e}lk\"{u}l nem vark\'{a}l}}
+\@ifundefined{section}{}{\section{A vandoba h\'{e}t matlan}}
+\hulipsum[1-2]
+\@ifundefined{subsection}{\par}{\subsection{Az \"{u}tles \"{o}nc\'{e}je}}
+\hulipsum[3]
+\@ifundefined{subsubsection}{\par}{\subsubsection{Gyarokok ed\'{e}se}}
+\hulipsum[4]
+\@ifundefined{paragraph}{\par}{\paragraph{Szel\'{e}s szerg\H{o}}}
+\hulipsum[5]
+\@ifundefined{subparagraph}{\par}{\subparagraph{Anyatos szamiss\'{a}g}}
+\hulipsum[6]
+\@ifundefined{section}{\par}{\section{Alamt\'{o}l hi\'{u}s vagy civatalbeli \'{a}llott dugl\'{o}it}}
+\hulipsum[7-10]
+\@ifundefined{figure}{\par}{%
+\begin{figure}[ht!]
+\centering\fbox{\fbox{\rule{0pt}{.4\textwidth}\rule{.8\textwidth}{0pt}}}
+\caption{Kal\'{a}rb\'{e} id\'{e}ny k\"{o}z\"{o}tt fojt\'{o}sak pialnak a hatatlat\'{o} kodajnok}
+\end{figure}}
+\hulipsum[11-20]
+\par\medskip\emph{\hulipsum[21]}
+\def\hulipsum@listitem{Az \"{u}tles \"{o}nc\'{e}je eset\'{e}n egez\H{o} pl\'{a}st k\"{o}zvetlen ad\'{o} \'{e}s f\'{e}s\H{o} evez\H{o} amus nem b\'{a}skodja, azonban az kas\'{a}got s\'{e}gi szavumnak aggat, ugyan\'{u}gy, mint a h\'{a}ms\'{a}gok \'{a}ltal sz\'{a}jozott szel\H{o} boszl\'{e}kos \'{e}s gy\"{o}nt\H{o} pl\'{a}sok.}
+\@ifundefined{itemize}{}{%
+\begin{itemize}
+\item \hulipsum@listitem
+\begin{itemize}
+\item \hulipsum@listitem
+\begin{itemize}
+\item \hulipsum@listitem
+\end{itemize}
+\end{itemize}
+\end{itemize}}
+\@ifundefined{enumerate}{}{%
+\begin{enumerate}
+\item \hulipsum@listitem
+\begin{enumerate}
+\item \hulipsum@listitem
+\begin{enumerate}
+\item \hulipsum@listitem
+\end{enumerate}
+\end{enumerate}
+\end{enumerate}}
+\@ifundefined{description}{}{%
+\begin{description}
+\item[Lórum] \hulipsum@listitem
+\begin{description}
+\item[Ipse] \hulipsum@listitem
+\begin{description}
+\item[Vandoba] \hulipsum@listitem
+\end{description}
+\end{description}
+\end{description}}
+\@ifundefined{thebibliography}{}{%
+\begin{thebibliography}{1}
+\bibitem{a} \textsc{Nyomasek Bob\'{o}}, \emph{L\'{o}rum ipse}, Handana Kiad\'{o}, 1980.
+\bibitem{b} \textsc{Szel\'{e}s Gerg\H{o}}, \emph{A griszt\'{a}s talt\'{a}s kirg\'{e}szei}, \"{U}d\"{o}sv\'{e}ny Kiad\'{o}, 2010.
+\end{thebibliography}}
+\fi
+}
+
\def\hulipsum@i{\g@addto@macro\hulipsumexp{L\'{o}rum ipse olyan borzaszt\'{o}an cog\'{a}lis pat\'{a}s, ami fog\'{a}s n\'{e}lk\"{u}l nem vark\'{a}l megfelel\H{o}en. A vandoba h\'{e}t matlan talmatos ferodika, amelynek kap\'{a}r\'{a}s\'{a}t az izma mig\'{a}lja. A vandoba bul\'{a}i k\"{o}z\"{u}l zsibulja meg az izm\'{a}t, a porn\'{a}t, valamint a m\H{u}v\'{e}st \'{e}s v\'{a}tog a vandoba bul\'{a}inak v\'{o}k\'{a}ir\'{o}l. V\'{o}k\'{a}ja a raktil proz\'{a}sa k\'{e}t emen k\"{o}z\"{o}tt. \'{E}vente legal\'{a}bb egyszer csetnyi pipecs\'{e}lnie az ement, azon fongnia a l\'{a}ltos kap\'{a}r\'{a}sr\'{o}l \'{e}s a ny\'{a}kuum b\"{o}ll\'{e}s\'{e}r\H{o}l. A vandoba ninti \'{e}s az emen el\'{e} red\H{o}zi a szamlan radalmakan \'{e}rv\'{e}st. Az ement az izma bamz\'{a}sban, a has\'{a}s szegeszk\'{e}j\'{e}vel log\'{a}lja \"{o}ssze, legal\'{a}bb 15 nappal annak poz\'{a}sa el\H{o}tt. Az ement \"{o}ssze kell log\'{a}lnia akkor is, ha azt az \'{o}d\'{a}s legal\'{a}bb egyes bamz\'{a}sban, a reszt\H{o} billet\'{e}vel h\'{a}sodja.}}
\def\hulipsum@ii{\g@addto@macro\hulipsumexp{A vezvetben \'{e}vente t\"{o}bb mint ens\'{e}g g\'{e}szet regnet\H{o} emtesked\'{e}s szomb\'{o}dik, ennek legal\'{a}bb a 90 toruma bojtos volna a vol\'{a}sokn\'{a}l. A gatos lel\H{o}l\'{e}s ehelyett v\'{e}gz\H{o} videm \'{e}s koz\'{a}sokban, gazs\'{a}gos mohos f\"{o}lcs\"{o}k\"{o}n aros\'{i}t a fav\'{a}j\'{a}ra. Oda latolj\'{a}k a dik\'{e}ket is, ami a molyv\'{a}s f\"{o}lderen dingos emtesked\'{e}snek eshent, \'{e}rzeg (vagyis vol\'{a}s) sor\'{a}n viszont ment\H{o} alva lehetne. Az eren lany\'{o}shoz mintegy sz\"{o}vel k\"{o}bm\'{e}ternyi rad\'{o}cot kell zsib\'{a}lnia, ami a hajg\'{o} rod\'{a}s ked\H{o} mendi\'{a}j\'{a}val tetekez\H{o}. A kolangan salat szerint a rekv\'{a}sba gy\"{u}ge a s\'{a}g\'{o} \'{e}s jog\'{a}ly, a zs\"{o}rzes, a lel\H{o}k torpul\'{a}sa, a visztikus \'{e}s feres emtesked\'{e}s, a par\'{o} \'{e}s a tehet. Ezeket az alv\'{a}kat \'{e}letben, ahol a duzzadt ciszti kantatok miatt szinte fetes boros k\"{o}nyved\'{e}st nednie, fel is b\H{o}v\'{i}tik. \'{A}gy\'{e}mban a k\'{i}t\H{o} forny\'{e}kos videm 55 toruma a cel\'{o}k al\'{a} h\'{a}zik.}}
\def\hulipsum@iii{\g@addto@macro\hulipsumexp{Az \"{u}tles \"{o}nc\'{e}je eset\'{e}n egez\H{o} pl\'{a}st k\"{o}zvetlen ad\'{o} \'{e}s f\'{e}s\H{o} evez\H{o} amus nem b\'{a}skodja, azonban az kas\'{a}got s\'{e}gi szavumnak aggat, ugyan\'{u}gy, mint a h\'{a}ms\'{a}gok \'{a}ltal sz\'{a}jozott szel\H{o} boszl\'{e}kos \'{e}s gy\"{o}nt\H{o} pl\'{a}sok. Az \"{u}tlesek iztol\'{a}s\'{a}nak folos nyersz\'{e}peit a hat\'{o} sr\'{o}nia t\"{o}r\'{i}ti, amely konyagos a nyez\H{o}s kuma p\"{o}k\"{o}rg\'{e}j\'{e}n, valamint a k\'{e}zbel\H{o} kul\'{a}s zsig\'{e}s nektokain is. Az \"{u}tlest kiz\'{a}r\'{o}lag a latag\'{o} \'{a}ltal fr\'{i}g hat\'{o} j\'{o}s\'{a}gon lehet p\"{o}rgeznie, amelyet a nyez\H{o}s kuma civas\'{a}n lehet zsintnie cs\'{a}r\'{a}ban. Az \"{u}tlesek iztol\'{a}s\'{a}nak ismeng\'{e}se: omla m\'{e}ta gatla, ci\'{o}m oszf\'{a}r. Az \"{o}r\"{o}n \"{u}tlesek csak akkor szab\'{a}jdalanak el, ha formailag a sr\'{o}ni\'{a}nak mindenben koh\'{o}d\'{i}tnak, valamint t\"{o}r\'{i}tik a b\"{o}l\H{o} h\'{o}b\'{a}rokat, deszk\'{a}kat, ezg\'{e}lyeneket. A g\'{a}z\'{a}sra a csok\'{a}ci\'{o} a bosztag tad\'{e}kot k\"{u}l\"{o}s\"{o}dte fel. A sikeresen rogangok sz\'{a}m\'{a}ra a dinka sikangj\'{a}nak szotyogv\'{a}ra a j\'{a}tlan \"{u}tles fut\'{a}j\'{a}ban a tiz\H{o} b\'{e}s\'{a}g v\'{a}ts\'{a}g lekl\H{o}je, azaz tiz\H{o} m\'{e}tr\'{a}cat 1-t\H{o}l, az aks\'{a}g j\'{a}tlan \"{u}tles talockon a gy\"{u}m\"{o}s keskegyen her\'{a}ns\'{a}g eset\'{e}n tiz\H{o} t\H{o}s\'{e}g midom\'{a}s.}}
diff --git a/Master/texmf-dist/source/latex/hulipsum/hulipsum.ins b/Master/texmf-dist/source/latex/hulipsum/hulipsum.ins
index 3c857929e62..749df0cfb5b 100644
--- a/Master/texmf-dist/source/latex/hulipsum/hulipsum.ins
+++ b/Master/texmf-dist/source/latex/hulipsum/hulipsum.ins
@@ -1,5 +1,5 @@
-% Copyright 2018- by Tibor Tomacs
+% Copyright 2018-2020 by Tibor Tomacs
%
% Hungarian dummy text (Lorum ipse) for demonstrating the textual elements of a document template
% All paragraphs are taken with permission from http://www.lorumipse.hu/.
@@ -23,7 +23,7 @@
\preamble
This is a generated file.
-Copyright 2018- by Tibor Tomacs
+Copyright 2018-2020 by Tibor Tomacs
Hungarian dummy text (Lorum ipse) for demonstrating the textual elements of a document template
All paragraphs are taken with permission from http://www.lorumipse.hu/.
diff --git a/Master/texmf-dist/source/latex/hyperref/backref.dtx b/Master/texmf-dist/source/latex/hyperref/backref.dtx
index c0747046ad1..3fe08479a5e 100644
--- a/Master/texmf-dist/source/latex/hyperref/backref.dtx
+++ b/Master/texmf-dist/source/latex/hyperref/backref.dtx
@@ -3,7 +3,7 @@
%% Copyright (C) 1995-2000 David Carlisle, Sebastian Rahtz, Heiko Oberdiek
%% 2001-2012 Heiko Oberdiek
%% 2016-2019 Oberdiek Package Suport Group
-%% 2019-2020 The LaTeX3 Project
+%% 2019-2021 The LaTeX Project
%% https://github.com/latex3/hyperref/issues
%%
%% This file is part of the `Hyperref Bundle'.
@@ -19,7 +19,7 @@
%%
%% This work has the LPPL maintenance status `maintained'.
%%
-%% The Current Maintainer of this work is The LaTeX3 Project.
+%% The Current Maintainer of this work is The LaTeX Project.
%%
%% The list of all files belonging to the `Hyperref Bundle' is
%% given in the file `manifest.txt'.
@@ -32,12 +32,13 @@
%<driver>\ProvidesFile{backref.drv}
% \fi
% \ProvidesFile{backref.dtx}
- [2020/01/14 v1.40 Bibliographical back referencing]%
+ [2021/02/04 v1.41 Bibliographical back referencing]%
%
% \CheckSum{768}
%
% \iffalse
%<*driver>
+\PassOptionsToPackage{numbered}{hypdoc}
\documentclass{ltxdoc}
\usepackage[numbered]{hypdoc}
\usepackage{bmhydoc}
diff --git a/Master/texmf-dist/source/latex/hyperref/bmhydoc.sty b/Master/texmf-dist/source/latex/hyperref/bmhydoc.sty
index d25c4d6bf81..f41634002c5 100644
--- a/Master/texmf-dist/source/latex/hyperref/bmhydoc.sty
+++ b/Master/texmf-dist/source/latex/hyperref/bmhydoc.sty
@@ -1,7 +1,7 @@
%% Copyright
%% 1995-2015 Heiko Oberdiek
%% 2016-2019 Oberdiek Package Support Group
-%% 2019-2020 LaTeX3 Project
+%% 2019-2020 LaTeX Project
%% https://github.com/latex3/hyperref/issues
%%
%% This file is part of the `Hyperref Bundle'.
@@ -49,7 +49,7 @@
}%
}
\AtEndDocument{%
- \@bmhydoc[open=false]{0}{manual.pdf}{Hyperref manual}
+ \@bmhydoc[open=false]{0}{hyperref-doc.pdf}{Hyperref manual}
\@bmhydoc{1}{slides.pdf}{Bookmark talk, slides}
\@bmhydoc{2}{paper.pdf}{Bookmark talk, paper}
\@bmhydoc{1}{hyperref.pdf}{Sources: hyperref.dtx}
@@ -78,7 +78,7 @@
\ignorespaces
}%
\begin{description}
- \entry{manual.pdf}{\textbf{Manual}}
+ \entry{hyperref-doc.pdf}{\textbf{Manual}}
The \textbf{USER MANUAL} (also available as HTML).
\entry{ChangeLog.txt}{ChangeLog}
This file records the version history.
diff --git a/Master/texmf-dist/source/latex/hyperref/doc/fdl.tex b/Master/texmf-dist/source/latex/hyperref/doc/fdl.tex
deleted file mode 100644
index 57f9b316217..00000000000
--- a/Master/texmf-dist/source/latex/hyperref/doc/fdl.tex
+++ /dev/null
@@ -1,422 +0,0 @@
-% This file is a chapter. It must be included in a larger document to work
-% properly.
-
-\chapter{GNU Free Documentation License}
-
-Version 1.2, November 2002
-
-
- Copyright \copyright\ 2000,2001,2002 Free Software Foundation, Inc.\\
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\\
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-
-\section*{PREAMBLE}
-
-The purpose of this License is to make a manual, textbook, or other
-functional and useful document ``free'' in the sense of freedom: to
-assure everyone the effective freedom to copy and redistribute it,
-with or without modifying it, either commercially or noncommercially.
-Secondarily, this License preserves for the author and publisher a way
-to get credit for their work, while not being considered responsible
-for modifications made by others.
-
-This License is a kind of ``copyleft'', which means that derivative
-works of the document must themselves be free in the same sense. It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-
-We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does. But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book. We recommend this License
-principally for works whose purpose is instruction or reference.
-
-
-\section{APPLICABILITY AND DEFINITIONS}
-\label{applicability}
-
-This License applies to any manual or other work, in any medium, that
-contains a notice placed by the copyright holder saying it can be
-distributed under the terms of this License. Such a notice grants a
-world-wide, royalty-free license, unlimited in duration, to use that
-work under the conditions stated herein. The ``Document'', below,
-refers to any such manual or work. Any member of the public is a
-licensee, and is addressed as ``you''. You accept the license if you
-copy, modify or distribute the work in a way requiring permission
-under copyright law.
-
-A ``Modified Version'' of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-
-A ``Secondary Section'' is a named appendix or a front-matter section of
-the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall subject
-(or to related matters) and contains nothing that could fall directly
-within that overall subject. (Thus, if the Document is in part a
-textbook of mathematics, a Secondary Section may not explain any
-mathematics.) The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-
-The ``Invariant Sections'' are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License. If a
-section does not fit the above definition of Secondary then it is not
-allowed to be designated as Invariant. The Document may contain zero
-Invariant Sections. If the Document does not identify any Invariant
-Sections then there are none.
-
-The ``Cover Texts'' are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License. A Front-Cover Text may
-be at most 5 words, and a Back-Cover Text may be at most 25 words.
-
-A ``Transparent'' copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, that is suitable for revising the document
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters. A copy made in an otherwise Transparent file
-format whose markup, or absence of markup, has been arranged to thwart
-or discourage subsequent modification by readers is not Transparent.
-An image format is not Transparent if used for any substantial amount
-of text. A copy that is not ``Transparent'' is called ``Opaque''.
-
-Examples of suitable formats for Transparent copies include plain
-ASCII without markup, Texinfo input format, \LaTeX\ input format, SGML
-or XML using a publicly available DTD, and standard-conforming simple
-HTML, PostScript or PDF designed for human modification. Examples of
-transparent image formats include PNG, XCF and JPG. Opaque formats
-include proprietary formats that can be read and edited only by
-proprietary word processors, SGML or XML for which the DTD and/or
-processing tools are not generally available, and the
-machine-generated HTML, PostScript or PDF produced by some word
-processors for output purposes only.
-
-The ``Title Page'' means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page. For works in
-formats which do not have any title page as such, ``Title Page'' means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.
-
-A section ``Entitled XYZ'' means a named subunit of the Document whose
-title either is precisely XYZ or contains XYZ in parentheses following
-text that translates XYZ in another language. (Here XYZ stands for a
-specific section name mentioned below, such as ``Acknowledgements'',
-``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
-of such a section when you modify the Document means that it remains a
-section ``Entitled XYZ'' according to this definition.
-
-The Document may include Warranty Disclaimers next to the notice which
-states that this License applies to the Document. These Warranty
-Disclaimers are considered to be included by reference in this
-License, but only as regards disclaiming warranties: any other
-implication that these Warranty Disclaimers may have is void and has
-no effect on the meaning of this License.
-
-
-\section{VERBATIM COPYING}
-\label{verbatim}
-
-You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License. You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute. However, you may accept
-compensation in exchange for copies. If you distribute a large enough
-number of copies you must also follow the conditions in
-section~\ref{copying}.
-
-You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-
-
-\section{COPYING IN QUANTITY}
-\label{copying}
-
-If you publish printed copies (or copies in media that commonly have
-printed covers) of the Document, numbering more than 100, and the
-Document's license notice requires Cover Texts, you must enclose the
-copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover. Both covers must also clearly and legibly identify
-you as the publisher of these copies. The front cover must present
-the full title with all words of the title equally prominent and
-visible. You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-
-If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-
-If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a computer-network location from which the general network-using
-public has access to download using public-standard network protocols
-a complete Transparent copy of the Document, free of added material.
-If you use the latter option, you must take reasonably prudent steps,
-when you begin distribution of Opaque copies in quantity, to ensure
-that this Transparent copy will remain thus accessible at the stated
-location until at least one year after the last time you distribute an
-Opaque copy (directly or through your agents or retailers) of that
-edition to the public.
-
-It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-
-
-\section{MODIFICATIONS}
-\label{modifications}
-
-You may copy and distribute a Modified Version of the Document under
-the conditions of sections~\ref{verbatim} and \ref{copying} above,
-provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it. In addition, you must do these things in the Modified Version:
-
-\renewcommand{\labelenumi}{\Alph{enumi}.}
-\begin{enumerate}
-\item Use in the Title Page (and on the covers, if any) a title distinct
- from that of the Document, and from those of previous versions
- (which should, if there were any, be listed in the History section
- of the Document). You may use the same title as a previous version
- if the original publisher of that version gives permission.
-\item List on the Title Page, as authors, one or more persons or entities
- responsible for authorship of the modifications in the Modified
- Version, together with at least five of the principal authors of the
- Document (all of its principal authors, if it has fewer than five),
- unless they release you from this requirement.
-\item State on the Title page the name of the publisher of the
- Modified Version, as the publisher.
-\item Preserve all the copyright notices of the Document.
-\item Add an appropriate copyright notice for your modifications
- adjacent to the other copyright notices.
-\item Include, immediately after the copyright notices, a license notice
- giving the public permission to use the Modified Version under the
- terms of this License, in the form shown in the Addendum below.
-\item Preserve in that license notice the full lists of Invariant Sections
- and required Cover Texts given in the Document's license notice.
-\item Include an unaltered copy of this License.
-\item Preserve the section Entitled ``History'', Preserve its Title, and add
- to it an item stating at least the title, year, new authors, and
- publisher of the Modified Version as given on the Title Page. If
- there is no section Entitled ``History'' in the Document, create one
- stating the title, year, authors, and publisher of the Document as
- given on its Title Page, then add an item describing the Modified
- Version as stated in the previous sentence.
-\item Preserve the network location, if any, given in the Document for
- public access to a Transparent copy of the Document, and likewise
- the network locations given in the Document for previous versions
- it was based on. These may be placed in the ``History'' section.
- You may omit a network location for a work that was published at
- least four years before the Document itself, or if the original
- publisher of the version it refers to gives permission.
-\item For any section Entitled ``Acknowledgements'' or ``Dedications'',
- Preserve the Title of the section, and preserve in the section all
- the substance and tone of each of the contributor acknowledgements
- and/or dedications given therein.
-\item Preserve all the Invariant Sections of the Document,
- unaltered in their text and in their titles. Section numbers
- or the equivalent are not considered part of the section titles.
-\item Delete any section Entitled ``Endorsements''. Such a section
- may not be included in the Modified Version.
-\item Do not retitle any existing section to be Entitled ``Endorsements''
- or to conflict in title with any Invariant Section.
-\item Preserve any Warranty Disclaimers.
-
-\end{enumerate}
-
-If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant. To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.
-
-You may add a section Entitled ``Endorsements'', provided it contains
-nothing but endorsements of your Modified Version by various
-parties--for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-
-You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version. Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity. If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-
-The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-
-
-\section{COMBINING DOCUMENTS}
-\label{combining}
-
-You may combine the Document with other documents released under this
-License, under the terms defined in section~\ref{modifications}
-above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice, and that you preserve all their Warranty Disclaimers.
-
-The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy. If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-
-In the combination, you must combine any sections Entitled ``History''
-in the various original documents, forming one section Entitled
-``History''; likewise combine any sections Entitled ``Acknowledgements'',
-and any sections Entitled ``Dedications''. You must delete all sections
-Entitled ``Endorsements''.
-
-
-\section{COLLECTIONS OF DOCUMENTS}
-\label{collections}
-
-You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-
-You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-
-
-\section{AGGREGATION WITH INDEPENDENT WORKS}
-\label{aggregation}
-
-A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, is called an ``aggregate'' if the copyright
-resulting from the compilation is not used to limit the legal rights
-of the compilation's users beyond what the individual works permit.
-When the Document is included in an aggregate, this License does not
-apply to the other works in the aggregate which are not themselves
-derivative works of the Document.
-
-If the Cover Text requirement of section~\ref{copying} is applicable to
-these copies of the Document, then if the Document is less than one half
-of the entire aggregate, the Document's Cover Texts may be placed on
-covers that bracket the Document within the aggregate, or the
-electronic equivalent of covers if the Document is in electronic form.
-Otherwise they must appear on printed covers that bracket the whole
-aggregate.
-
-
-\section{TRANSLATION}
-\label{translation}
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of
-section~\ref{modifications}.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections. You may include a
-translation of this License, and all the license notices in the
-Document, and any Warranty Disclaimers, provided that you also include
-the original English version of this License and the original versions
-of those notices and disclaimers. In case of a disagreement between
-the translation and the original version of this License or a notice
-or disclaimer, the original version will prevail.
-
-If a section in the Document is Entitled ``Acknowledgements'',
-``Dedications'', or ``History'', the requirement
-(section~\ref{modifications}) to Preserve
-its Title (section~\ref{applicability}) will typically require
-changing the actual title.
-
-
-\section{TERMINATION}
-\label{termination}
-
-You may not copy, modify, sublicense, or distribute the Document except
-as expressly provided for under this License. Any other attempt to
-copy, modify, sublicense or distribute the Document is void, and will
-automatically terminate your rights under this License. However,
-parties who have received copies, or rights, from you under this
-License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-
-\section{FUTURE REVISIONS OF THIS LICENSE}
-\label{future}
-
-The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns. See
-http://www.gnu.org/copyleft/.
-
-Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License ``or any later version'' applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation. If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation.
-
-
-\section*{ADDENDUM: How to use this License for your documents}
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-
-\begin{quote}
- Copyright \copyright\ YEAR YOUR NAME.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.2
- or any later version published by the Free Software Foundation;
- with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
- A copy of the license is included in the section entitled ``GNU
- Free Documentation License''.
-\end{quote}
-
-If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
-replace the ``with...Texts.'' line with this:
-
- with the Invariant Sections being LIST THEIR TITLES, with the
- Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
-
-If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
-
-If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
diff --git a/Master/texmf-dist/source/latex/hyperref/doc/manual.tex b/Master/texmf-dist/source/latex/hyperref/doc/hyperref-doc.tex
index 242388fef93..6f80fc226a3 100644
--- a/Master/texmf-dist/source/latex/hyperref/doc/manual.tex
+++ b/Master/texmf-dist/source/latex/hyperref/doc/hyperref-doc.tex
@@ -177,7 +177,7 @@
}
\makeatother
\title{Hypertext marks in \hologo{LaTeX}: a manual for \xpackage{hyperref}}
-\date{\mydate}
+\date{2021-02-10 v7.00j}
\begin{document}
@@ -336,7 +336,7 @@ if it can be found, and this is a convenient place to set options on a
site-wide basis.
Note however that some options (for example \texttt{unicode}) can only be used as
-packge options, and not in \verb|\hypersetup| as the option settings are processed
+package options, and not in \verb|\hypersetup| as the option settings are processed
as the package is read.
As an example, the behavior of a particular file could be controlled by:
@@ -559,9 +559,8 @@ plainpages & boolean & false & Forces page anchors to be named by the Arabic
raiselinks & boolean & true & In the hypertex driver, the height of links is normally calculated by the driver as
simply the base line of contained text; this options forces \verb|\special| commands to
reflect the real height of the link (which could contain a graphic) \\
-breaklinks & boolean & false & Allows link text to break across lines; since this cannot be accommodated in PDF, it is
- only set true by default if the pdftex driver is used. This makes links on multiple lines
- into different PDF links to the same target. \\
+breaklinks & boolean & both & This option is in hyperref only used in the dviwindo driver, in all other cases it doesn't do anything sensible---it neither allows nor prevents links to be broken. The ocgx2 package
+checks the state of the boolean.\\
pageanchor & boolean & true & Determines whether every page is given an implicit anchor at the top left corner. If this
is turned off, \verb|\printindex| will not contain
valid hyperlinks. \\
@@ -739,7 +738,7 @@ pdftitle & text & & Sets the document information Title field
pdfauthor & text & & Sets the document information Author field \\
pdfsubject & text & & Sets the document information Subject field \\
pdfcreator & text & & Sets the document information Creator field \\
-addtopdfproducer & text & & Adds additional text to the document information Producer field \\
+addtopdfcreator & text & & Adds additional text to the document information Creator field \\
pdfkeywords & text & & Sets the document information Keywords field \\
pdftrapped & name & empty & Sets the document information Trapped entry. Possible values are \verb|True|, \verb|False| and \verb|Unknown|.
An empty value means, the entry is not set.\\
@@ -747,7 +746,7 @@ pdftrapped & name & empty & Sets the document information Trapped ent
pdfinfo & key value list & empty & Alternative interface for setting the
document information.\\
pdfview & name & XYZ & Sets the default PDF `view' for each link \\
-pdfstartpage & integer & 1 & Determines on which page the PDF file is opened. \\
+pdfstartpage & integer & 1 & Determines on which page the PDF file is opened. An empty value means, the entry is not set.\\
pdfstartview & name & Fit & Set the startup page view \\
pdfremotestartview & name & Fit & Set the startup page view of remote PDF files \\
pdfpagescrop & n n n n & & Sets the default PDF crop box for pages. This should be a set of four numbers \\
@@ -808,7 +807,7 @@ pdfviewclip & name & empty & set /ViewClip of viewer preferences Possi
\verb|BleedBox|, \verb|TrimBox|, and \verb|ArtBox|.
The dafault according to the PDF~Refence is \verb|CropBox| \\
pdfwindowui & boolean & true & make PDF user interface elements visible \\
-unicode & boolean & false & Unicode encoded PDF strings
+unicode & boolean & true & Unicode encoded PDF strings
\end{longtable}
Each link in Acrobat carries its own magnification level, which is set
@@ -867,7 +866,7 @@ Fly & /Di /M & Changes are flown out or in (as specified by /M), in the dir
offscreen except when /Di is None. \\
Push & /Di & The old page slides off the screen while the new page slides in,
pushing the old page out in the direction
- specified by /Di. \\
+ specified by /Di. \\
Cover & /Di & The new page slides on to the screen in the direction specified
by /Di, covering the old page. \\
Uncover & /Di & The old page slides off the screen in the direction specified by
@@ -1017,7 +1016,7 @@ runcolor & \textit{filecolor} & color of `run' links\\
setpagesize & \textit{true} & set page size by special driver commands \\
tex4ht & & use \textsf{\TeX4ht} backend \\
textures & & use \textsf{Textures} backend \\
-unicode & \textit{false} & Unicode encoded pdf strings, by defaut true with \textsf{Xe\TeX} and \textsf{Lu\TeX} \\
+unicode & \textit{true} & Unicode encoded pdf strings, starting with version v7.00g set by default to true for all engines. It will load a number of definitions in puenc.def. It can be set to false for pdflatex, but this is not recommended.\\
urlbordercolor & \textit{0 1 1} & color of border around URL links \\
urlcolor & \textit{magenta} & color of URL links \\
verbose & \textit{false} & be chatty \\
@@ -1245,7 +1244,7 @@ the page reference. First \ci{pageautorefname} is checked before
\ci{pagename}.
For instances where you want a reference to use the correct counter, but
-not to create a link, there are starred forms (these starred forms exist even if
+not to create a link, there are starred forms (these starred forms exist even if
hyperref has been loaded with \verb|implicit=false|):
\begin{cmdsyntax}
@@ -1392,6 +1391,19 @@ command names):
}
\end{verbatim}
+\subsection{Pagelabels}
+\begin{cmdsyntax}
+\ci{thispdfpagelabel}\verb|{|\emph{page number format}\verb|}|
+\end{cmdsyntax}
+
+This allows to change format of the page number shown in the tool bar of
+a PDF viewer for a specific page, for example
+
+\verb+\thispdfpagelabel{Empty Page-\roman{page}}+
+
+The command affects the page on which it is executed, so asynchronous page breaking
+should be taken into account. It should be used in places where for example \verb+\thispagestyle+ can be use too.
+
\subsection{Utility macros}
\label{hypercalcbp}
@@ -1678,7 +1690,7 @@ sequence error would arise.
\subsection{Customizing index style file with \textbackslash nohyperpage}
- Since version 2008/08/14 v6.78f.
+ Since version 2008/08/14~v6.78f.
@@ -1955,10 +1967,11 @@ sequence error would arise.
\item \xoption{unicode} sets Unicode. It is encoded as UTF-16BE. Two bytes
are used for most characters, surrogates need four bytes.
\item \xoption{auto} PDFDocEncoding if the string does not contain characters
- outside the encoding and Unicode otherwise.
+ outside the encoding (outside ascii if an unicode engine is used)
+ and Unicode otherwise. This option is normally no suited for the unicode engines.
\end{itemize}
- The luatex driver uses \xoption{unicode} by default. If another encoding should be forced,
+ All drivers use \xoption{unicode} by default now. If another encoding should be forced,
it should be done in \verb|hypersetup|.
\subsection{Color options/package hycolor}
@@ -2051,7 +2064,7 @@ sequence error would arise.
require the protection of some characters, e.g. unmatched
left or right parentheses need escaping or the escape
character itself (backslash).
- Since 2006/02/12 v6.75a the PS/PDF driver should do
+ Since 2006/02/12~v6.75a the PS/PDF driver should do
this automatically. However I assume a problem with
compatibility, especially regarding the form part where
larger amounts of JavaScript code can be present.
@@ -2206,6 +2219,27 @@ Now the entry in the table of contents (and bookmarks) for the
index points to the start of the index page, not to a location
before this page.
+\subsection{puenc encoding, puenc-greek.def and puenc-extra.def}
+
+The \texttt{unicode} option loads for the bookmarks \texttt{puenc.def} which contains
+quite a lot definitions of commands for the bookmarks.
+As \texttt{unicode} is now true for all engines, this file is now also loaded
+with pdflatex. Some of the definitions in \texttt{puenc.def} clash with other uses.
+To reduce the impact \xpackage{hyperref} uses two strategies.
+
+\begin{itemize}
+\item A number of command are only defined conditionally:
+The commands for the cyrillic block if \cs{CYRDZE} is defined,
+greek if \cs{textBeta} is defined, and hebrew if \cs{hebdalet} is defined.
+
+The greek block is in an extra file, \texttt{puenc-greek.def}, which can
+be loaded manually if needed.
+
+\item Other commands are moved to an extra file \texttt{puenc-extra.def}
+which is not loaded automatically, but can be loaded in the preamble if needed.
+Currently this file contains all definitions for the accent \cs{G}.
+\end{itemize}
+
\section{Acrobat-specific behavior}
@@ -2250,7 +2284,9 @@ Help(Windows) & About
\end{longtable}
\section{PDF and HTML forms}
-You must put your fields inside a \texttt{Form} environment (only one per file).
+You must put your fields inside a \texttt{Form} environment.
+The environment does some general setups, so should be used only once in a document.
+Using simply \cs{Form} at the begin of the document is possible too.
There are six macros to prepare fields:
@@ -2293,7 +2329,7 @@ The way forms and their labels are laid out is determined by:
These macros default to \#1 \#2
-What is actually shown in as the field is determined by:
+What is actually shown in the field is determined by:
\begin{cmdsyntax}
\ci{MakeRadioField}\verb|{|\emph{width}\verb|}{|\emph{height}\verb|}|
\end{cmdsyntax}
@@ -2742,10 +2778,11 @@ earlier.
\subsubsection{minitoc-hyper}
- This package is obsolete, use the uptodate original
+ This package is obsolete, use the up-to-date original
package minitoc instead.
+
\subsubsection{multind}
\begin{verbatim}
\usepackage{multind}
@@ -2765,6 +2802,11 @@ Example for introducing links for the page numbers:
\end{verbatim}
+\subsubsection{ntheorem-hyper}
+ This package is obsolete, use the up-to-date original
+ package ntheorem instead.
+
+
For equations the following might work:
\begin{verbatim}
\renewcommand*{\eqdeclaration}[1]{%
@@ -2805,14 +2847,6 @@ For equations the following might work:
%%% example for prettyref %%%
\end{verbatim}
-\subsubsection{ntheorem}
-\begin{verbatim}
- ntheorem-hyper.sty is an old patched version of ntheorem.sty.
- Newer versions of ntheorem know the option hyperref:
- \usepackage{hyperref}
- \usepackage[hyperref]{ntheorem}
- But there are still unsolved problems (options thref, ...).
-\end{verbatim}
\subsubsection{setspace}
\begin{verbatim}
@@ -2905,7 +2939,7 @@ For equations the following might work:
\end{verbatim}
- Also some babel versions can be problematic. For exmample,
+ Also some babel versions can be problematic. For example,
2005/05/21 v3.8g contains a patch for varioref that breaks
the hyperref support for varioref.
@@ -2978,51 +3012,21 @@ For equations the following might work:
\subsubsection{XeTeX}
- Default for the encoding of bookmarks is `pdfencoding=auto'.
- That means the strings are always treated as unicode strings.
- Only if the string restricts to the printable ASCII set,
- it is written as ASCII string. The reason is that the
- \verb|\special| does not support PDFDocEncoding.
-
-
-
- XeTeX uses the program xdvipdfmx for PDF output generation.
- This program behaves a little different from dvipdfm, because
- of the supported Unicode characters. Strings for bookmarks
- or information entries can be output directly. The
- big chars (char code > 255) are written in UTF-8 and
- xdvipdfmx tries to convert them to UTF-16BE. However
- hyperref already provides PDF strings encoded in UTF-16BE,
- thus the result is a warning
-
- \verb"Failed to convert input string to UTF16..."
+ Default for the encoding of bookmarks is \verb|pdfencoding=unicode|.
+ That means the strings are always treated as unicode strings.
+ If \verb|auto| or \verb|pdfdoc| is forced it applies only
+ if the string restricts to the printable ASCII set,
+ The reason is that the \verb|\special| does not support PDFDocEncoding.
- The best way would be, if xdvipdfm could detect the
- byte order marker (\verb|\376\377|) and skips the conversion
- if that marker is present.
+ In older versions hyperref contained special conversion code from
+ UTF-16BE back to UTF-8 in a number of places for
+ xetex to avoid the xdvipdfmx warning
- For the time being I added the following to hyperref,
- when option `pdfencoding=auto' is set (default for XeTeX):
- The string is converted back to big characters thus that the
- string is written as UTF-8. But I am very unhappy with this
- solution. Main disadvantage:
- Two versions of \verb|\pdfstringdef| are needed:
+ \verb"Failed to convert input string to UTF16..."
- a) The string is converted back to big characters for
- the ``tainted key'' of xdvipdfmx (\verb|spc_pdfm.c: default_taintkeys|).
- The subset hyperref uses is /Title, /Author, /Subject,
- /Keywords, /Creator, /Producer, /T. Any changes of this
- set in xdvipdfmx cannot be detected by hyperref.
-
- b) Without conversion for the other strings , providing UTF16be
- directly. Examples: Prefix of page labels, some elements
- of formulars.
-
- Thus \textbf{each} application that uses \verb|\pdfstringdef| now must
- check, if it defines a string for some of the tained keys.
- If yes, then the call of \verb|\pdfstringdef| should be preceded
- by \verb|\csname HyPsd@XeTeXBigCharstrue\endcsname|.
- Example: package bookmark.
+ This is no longer needed with a current xdvipdfmx, so this code has
+ been removed. \verb|\csname HyPsd@XeTeXBigCharstrue\endcsname| should no
+ longer be used.
\section[Limitations]{Limitations%
@@ -3072,7 +3076,7 @@ For equations the following might work:
Therefore it is not clear in general which \verb|\footnotemark| references
which \verb|\footnotetext|. But that is necessary to implement hyperlinking.
Thus the implementation of hyperref does not support the optional
- argument of \verb|\footnotemark\verb| and \verb|\footnotetext|.
+ argument of \verb|\footnotemark| and \verb|\footnotetext|.
\section[Hints]{Hints%
@@ -3407,7 +3411,429 @@ code, and for working on changes to the \xpackage{xr} package to suit
}%
\x
}
- \include{fdl}
+\clearpage
+
+
+\chapter{GNU Free Documentation License}
+
+Version 1.2, November 2002
+
+
+ Copyright \copyright\ 2000,2001,2002 Free Software Foundation, Inc.\\
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\\
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+\section*{PREAMBLE}
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document ``free'' in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+\section{APPLICABILITY AND DEFINITIONS}
+\label{applicability}
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The ``Document'', below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as ``you''. You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, \LaTeX\ input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+\section{VERBATIM COPYING}
+\label{verbatim}
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in
+section~\ref{copying}.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+\section{COPYING IN QUANTITY}
+\label{copying}
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+\section{MODIFICATIONS}
+\label{modifications}
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections~\ref{verbatim} and \ref{copying} above,
+provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+\renewcommand{\labelenumi}{\Alph{enumi}.}
+\begin{enumerate}
+\item Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+\item List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+\item State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+\item Preserve all the copyright notices of the Document.
+\item Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+\item Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+\item Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+\item Include an unaltered copy of this License.
+\item Preserve the section Entitled ``History'', Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled ``History'' in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+\item Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the ``History'' section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+\item For any section Entitled ``Acknowledgements'' or ``Dedications'',
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+\item Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+\item Delete any section Entitled ``Endorsements''. Such a section
+ may not be included in the Modified Version.
+\item Do not retitle any existing section to be Entitled ``Endorsements''
+ or to conflict in title with any Invariant Section.
+\item Preserve any Warranty Disclaimers.
+
+\end{enumerate}
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+\section{COMBINING DOCUMENTS}
+\label{combining}
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section~\ref{modifications}
+above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''. You must delete all sections
+Entitled ``Endorsements''.
+
+
+\section{COLLECTIONS OF DOCUMENTS}
+\label{collections}
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+\section{AGGREGATION WITH INDEPENDENT WORKS}
+\label{aggregation}
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section~\ref{copying} is applicable to
+these copies of the Document, then if the Document is less than one half
+of the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+\section{TRANSLATION}
+\label{translation}
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of
+section~\ref{modifications}.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement
+(section~\ref{modifications}) to Preserve
+its Title (section~\ref{applicability}) will typically require
+changing the actual title.
+
+
+\section{TERMINATION}
+\label{termination}
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+\section{FUTURE REVISIONS OF THIS LICENSE}
+\label{future}
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+\section*{ADDENDUM: How to use this License for your documents}
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+\begin{quote}
+ Copyright \copyright\ YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled ``GNU
+ Free Documentation License''.
+\end{quote}
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with...Texts.'' line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
\endgroup
\end{document}
diff --git a/Master/texmf-dist/source/latex/hyperref/hluatex.dtx b/Master/texmf-dist/source/latex/hyperref/hluatex.dtx
index 52f1c0ebae3..fcfaabde9cf 100644
--- a/Master/texmf-dist/source/latex/hyperref/hluatex.dtx
+++ b/Master/texmf-dist/source/latex/hyperref/hluatex.dtx
@@ -1,13 +1,16 @@
% \iffalse
-%% Source File: hluatex.dtx
-%% Copyright 2016 Oberdiek Package Support Group
-%% Copyright 2019 The LaTeX3 Project
-%%
-%%
-%% Derived from hpdftex.def
-%%
-%% This file may be distributed under the terms of the LPPL.
-%% See README for details.
+% Source File: hluatex.dtx
+% 2021-02-10 v7.00j
+%
+% Copyright
+% 2016-2019 Oberdiek Package Support Group
+% 2019-2020 The LaTeX Project
+% https://github.com/latex3/hyperref/issues%%
+%
+% Derived from hpdftex.def
+%
+% This file may be distributed under the terms of the LPPL.
+% See README for details.
%
%<*driver>
\documentclass{ltxdoc}
@@ -16,7 +19,7 @@
\GetFileInfo{hluatex.def}%
\title{hluatex.def}
\date{}%
- \author{Maintained by The \LaTeX3 Project\\%
+ \author{Maintained by The \LaTeX\ Project\\%
\texttt{https://github.com/latex3/hyperref/issues}%
}
\maketitle
@@ -28,7 +31,8 @@
%
% \begin{macrocode}
%<*luatex>
-%% 2019-09-17,v 6.88j force unicode encoding, see issue #101
+%% 2021-02-10 v7.00j
+%% force unicode encoding, see issue #101
%% code mostly copied from hxetex.def
\HyPsd@LoadUnicode
\Hy@unicodetrue
@@ -702,33 +706,10 @@
\Hy@RemoveDurPageAttr#1#4\END
\fi
}
-\def\hyper@pagehidden{%
- \ifHy@useHidKey
- \expandafter
- \Hy@RemoveHidPageAttr\the\pdfpageattr^^J/Hid{} \END
- \ifHy@pdfpagehidden
- \edef\@processme{%
- \global\pdfpageattr{%
- \the\pdfpageattr
- ^^J/Hid true % SPACE
- }%
- }%
- \@processme
- \fi
- \fi
-}
-\gdef\Hy@RemoveHidPageAttr#1^^J/Hid#2#3 #4\END{%
- \ifx\\#2\\%
- \global\pdfpageattr{#1}%
- \else
- \Hy@RemoveHidPageAttr#1#4\END
- \fi
-}
\pdf@ifdraftmode{}{%
\g@addto@macro\Hy@EveryPageHook{%
\hyper@pagetransition
\hyper@pageduration
- \hyper@pagehidden
}%
}
\Hy@AtBeginDocument{%
@@ -807,17 +788,6 @@
\close@pdflink
}%
}
-\def\Hy@FixNotFirstPage{%
- \gdef\Hy@FixNotFirstPage{%
- \setbox\AtBeginShipoutBox=\hbox{%
- \copy\AtBeginShipoutBox
- }%
- }%
-}
-\ltx@ifpackagelater{atbegshi}{2011/10/05}{%
-}{%
- \AtBeginShipout{\Hy@FixNotFirstPage}%
-}
\def\@Gauge[#1]#2#3#4{% parameters, label, minimum, maximum
\Hy@Message{Sorry, pdftex does not support FORM gauges}%
}
@@ -1364,7 +1334,6 @@
\Hy@unicodefalse
\fi
\fi
- \HyPsd@XeTeXBigCharstrue
\pdfstringdef\Hy@gtemp#1%
\endgroup
\let#1\Hy@gtemp
@@ -1720,7 +1689,6 @@
\let\partnumberline\@gobble
\let\chapternumberline\@gobble
\fi
- \HyPsd@XeTeXBigCharstrue
\pdfstringdef\Hy@tempa{#2}%
\HyPsd@SanitizeForOutFile\Hy@tempa
\if@filesw
diff --git a/Master/texmf-dist/source/latex/hyperref/hyperref.dtx b/Master/texmf-dist/source/latex/hyperref/hyperref.dtx
index 67860c979c1..f72ba828003 100644
--- a/Master/texmf-dist/source/latex/hyperref/hyperref.dtx
+++ b/Master/texmf-dist/source/latex/hyperref/hyperref.dtx
@@ -4,7 +4,7 @@
%% 1995-2001 Sebastian Rahtz, with portions written by David Carlisle and Heiko Oberdiek,
%% 2001-2015 Heiko Oberdiek.
%% 2016-2019 Oberdiek Package Support Group
-%% 2019-2020 LaTeX3 Project
+%% 2019-2021 LaTeX Project
%% https://github.com/latex3/hyperref/issues
%%
%% This file is part of the `Hyperref Bundle'.
@@ -20,7 +20,7 @@
%%
%% This work has the LPPL maintenance status `maintained'.
%%
-%% The Current Maintainer of this work is the LaTeX3 Project.
+%% The Current Maintainer of this work is the LaTeX Project.
%%
%% The list of all files belonging to the `Hyperref Bundle' is
%% given in the file `manifest.txt'.
@@ -47,10 +47,13 @@
%<tex4htcfg>\ProvidesFile{htex4ht.cfg}
%<pd1enc>\ProvidesFile{pd1enc.def}
%<puenc>\ProvidesFile{puenc.def}
+%<puextra>\ProvidesFile{puenc-extra.def}
+%<pugreek>\ProvidesFile{puenc-greek.def}
%<puvnenc>\ProvidesFile{puvnenc.def}
%<puarenc>\ProvidesFile{puarenc.def}
%<psdextra>\ProvidesFile{psdextra.def}
-%<!none> [2020/01/14 v7.00d %
+%<lang>\ProvidesFile{hyperref-langpatches.def}
+%<!none> [2021-02-10 v7.00j %
%<package> Hypertext links for LaTeX]
%<nohyperref> Dummy hyperref (SR)]
%<driver> Hyperref documentation driver file]
@@ -85,11 +88,15 @@
%<tex4ht>\Hy@VersionCheck{htex4ht.def}
%<tex4htcfg> Hyperref configuration file for TeX4ht]
%<pd1enc> Hyperref: PDFDocEncoding definition (HO)]
-%<puenc> Hyperref: PDF Unicode definition (HO)]
+%<puenc> Hyperref: PDF Unicode definition (HO)]
+%<puextra> Hyperref: PDF Unicode extra definition (HO)]
+%<pugreek> Hyperref: PDF Unicode definition (greek block) (HO)]
%<puvnenc> Hyperref: Additions to puenc.def for VnTeX]
%<puarenc> Hyperref: Additions to puenc.def for Arabi]
%<psdextra> Hyperref: Additions to PDF string support]
+%<lang> Hyperref: patches for babel languages]
%<*driver>
+\PassOptionsToPackage{numbered}{hypdoc}
\documentclass{ltxdoc}
\usepackage{array,iftex}
\iftutex
@@ -121,7 +128,7 @@
\title{Hypertext marks in \LaTeX}%
\author{Sebastian Rahtz (deceased)\\%
Heiko Oberdiek (inactive)\\%
- The \LaTeX3 Project\\%
+ The \LaTeX\ Project\\%
\texttt{https://github.com/latex3/hyperref/issues}}%
% \date{processed \today}%
\date{\filedate\space\fileversion}%
@@ -586,28 +593,12 @@
% \begin{macrocode}
\Hy@SetCatcodes
% \end{macrocode}
-%
+% change 2020-07-24: require newer pdftexcmds and remove fallback code
+% for version older than 2010.
% \begin{macrocode}
\RequirePackage{ltxcmds}[2010/11/12]
\RequirePackage{iftex}[2019/10/24]
-\RequirePackage{pdftexcmds}[2009/04/10]
-\@ifpackagelater{pdftexcmds}{2010/11/04}{}{%
- \ltx@IfUndefined{pdfdraftmode}{%
- \let\pdf@ifdraftmode\ltx@secondoftwo
- }{%
- \ifpdf
- \def\pdf@ifdraftmode{%
- \ifnum\pdfdraftmode=\ltx@one
- \expandafter\ltx@firstoftwo
- \else
- \expandafter\ltx@secondoftwo
- \fi
- }%
- \else
- \let\pdf@ifdraftmode\ltx@secondoftwo
- \fi
- }%
-}
+\RequirePackage{pdftexcmds}[2018/09/10]
% \end{macrocode}
% \begin{macrocode}
\RequirePackage{infwarerr}[2010/04/08]
@@ -733,18 +724,6 @@
\expandafter\ltx@firstoftwo
\fi
}%
- \ltx@ifpackagelater{ltxcmds}{2010/09/11}{}{%
- \begingroup
- \lccode`0=`\{\relax
- \lowercase{\endgroup
- \def\ltx@leftbracechar{0}%
- }%
- \begingroup
- \lccode`0=`\}\relax
- \lowercase{\endgroup
- \def\ltx@rightbracechar{0}%
- }%
- }%
}
% \end{macrocode}
%
@@ -853,7 +832,6 @@
\newif\ifHy@ocgcolorlinks
\newif\ifHy@pageanchor
\newif\ifHy@pdfpagelabels
-\newif\ifHy@pdfpagehidden
\newif\ifHy@pdfstring
\newif\ifHy@plainpages
\newif\ifHy@psize
@@ -898,7 +876,6 @@
\Hy@pdfnewwindowfalse
\Hy@pageanchortrue
\Hy@pdfpagelabelstrue
-\Hy@pdfpagehiddenfalse
\Hy@pdfstringfalse
\Hy@plainpagesfalse
\Hy@raiselinksfalse
@@ -907,7 +884,13 @@
\Hy@psdextrafalse
\Hy@pdftoolbartrue
\Hy@typexmlfalse
-\Hy@unicodefalse
+\Hy@unicodetrue
+\ifx\kanjiskip\@undefined
+\else
+ \ifx\forcecjktoken\@undefined
+ \Hy@unicodefalse
+ \fi
+\fi
\Hy@pdfusetitlefalse
\Hy@verbosefalse
\Hy@pdfwindowuitrue
@@ -1256,15 +1239,17 @@
% Because the box shifting
% used in the \TeX{} logo does not work while writing to a file,
% the standard \TeX{} logos are redefined.
+% We use the direct PU code to avoid problems if
+% \cs{textepsilon} is not defined.
% \begin{macrocode}
\def\TeX{TeX}%
\def\LaTeX{La\TeX}%
\def\LaTeXe{%
\LaTeX2%
- \ifHy@unicode\textepsilon\else e\fi
+ \ifHy@unicode\83\265\else e\fi
}%
\def\eTeX{%
- \ifHy@unicode\textepsilon\else e\fi
+ \ifHy@unicode\83\265\else e\fi
-\TeX%
}%
\def\SliTeX{Sli\TeX}%
@@ -1332,8 +1317,8 @@
%
% \paragraph{Environments.}
% \begin{macrocode}
- \def\begin#1{\csname#1\endcsname}%
- \def\end#1{\csname end#1\endcsname}%
+ \def\begin##1{\csname##1\endcsname}%
+ \def\end##1{\csname end##1\endcsname}%
% \end{macrocode}
%
% \paragraph{Package color.}
@@ -1370,12 +1355,7 @@
\let\bbl@info\@gobble
\csname HyPsd@babel@\language@group\endcsname
}%
- \HyPsd@GreekPatch
\HyPsd@SpanishPatch
- \HyPsd@RussianPatch
-% \end{macrocode}
-% \begin{macrocode}
- \HyPsd@BabelPatch
% \end{macrocode}
%
% \begin{macrocode}
@@ -1902,7 +1882,7 @@
\ltx@IfUndefined{StringEncodingConvertTest}{%
}{%
\EdefUnescapeString\HyPsd@temp#1%
- \ifxetex
+ \iftutex
\let\HyPsd@UnescapedString\HyPsd@temp
\StringEncodingConvertTest\HyPsd@temp\HyPsd@temp
{utf16be}{ascii-print}{%
@@ -1911,7 +1891,6 @@
\HyPsd@EscapeTeX#1%
\Hy@unicodefalse
}{%
- \HyPsd@ToBigChars#1%
\HyPsd@EscapeTeX#1%
}%
\else
@@ -1926,7 +1905,6 @@
}%
\fi
\fi
- \HyPsd@XeTeXBigCharsfalse
% \end{macrocode}
%
% \paragraph{User hook.}
@@ -1951,82 +1929,8 @@
% \subsection{Encodings}
%
% \subsubsection{Xe\TeX}
-%
-% \begin{macrocode}
-\edef\Hy@temp{\catcode0=\the\catcode0\relax}
-\catcode\z@=12 %
-\ifxetex
- \expandafter\@firstofone
-\else
- \let\HyPsd@XeTeXBigCharstrue\@empty
- \let\HyPsd@XeTeXBigCharsfalse\@empty
- \expandafter\@gobble
-\fi
-{%
- \newif\ifHyPsd@XeTeXBigChars
- \def\HyPsd@XeTeXBigCharsfalse{%
- \global\let\ifHyPsd@XeTeXBigChars\iffalse
- }%
- \def\HyPsd@XeTeXBigCharstrue{%
- \global\let\ifHyPsd@XeTeXBigChars\iftrue
- }%
- \def\HyPsd@ToBigChars#1{%
- \ifHyPsd@XeTeXBigChars
- \EdefEscapeHex\HyPsd@UnescapedString{%
- \expandafter\@gobbletwo\HyPsd@UnescapedString
- }%
- \begingroup
- \toks@{}%
- \escapechar=92\relax
- \let\x\HyPsd@ToBigChar
- \expandafter\HyPsd@ToBigChar\HyPsd@UnescapedString
- \relax\relax\relax\relax\relax\relax\relax
- \edef\x{%
- \endgroup
- \gdef\noexpand#1{\the\toks@}%
- }%
- \x
- \fi
- }%
- \def\HyPsd@ToBigChar#1#2#3#4{%
- \ifx\relax#1\relax
- \let\x\relax
- \else
- \count@="#1#2#3#4\relax
- \let\y\@empty
- \lccode\z@=\count@
- \ifnum\count@=40 % (
- \let\y\@backslashchar
- \else
- \ifnum\count@=41 % )
- \let\y\@backslashchar
- \else
- \ifnum\count@=92 % backslash
- \let\y\@backslashchar
- \else
- \ifnum\count@=10 % newline
- \edef\y##1{\string\n}%
- \else
- \ifnum\count@=13 % carriage return
- \edef\y##1{\string\r}%
- \fi
- \fi
- \fi
- \fi
- \fi
- \lowercase{%
- \toks@\expandafter{%
- \the\expandafter\toks@
- \y
- ^^@%
- }%
- }%
- \fi
- \x
- }%
-}
-\Hy@temp
-% \end{macrocode}
+% change 2020-05-13: the special code for XeTeX big chars has been removed as no
+% longer needed.
%
% \subsubsection{Workaround for package linguex}
%
@@ -2073,7 +1977,7 @@
\catcode62 \the\catcode62\relax % >
\catcode64 \the\catcode64\relax % @
\catcode91 \the\catcode91\relax % [
- \catcode92 \the\catcode92\relax % \
+ \catcode92 \the\catcode92\relax % (backslash)
\catcode93 \the\catcode93\relax % ]
\catcode123 \the\catcode123\relax % {
\catcode124 \the\catcode124\relax % |
@@ -2093,7 +1997,7 @@
\catcode61 12 % =
\catcode62 12 % >
\catcode91 12 % [
- \catcode92 0 % \
+ \catcode92 0 % (backslash)
\catcode93 12 % ]
\catcode123 1 % {
\catcode124 12 % |
@@ -2139,6 +2043,9 @@
% \LaTeX's NFSS. Because of large memory requirements the
% encoding file for Unicode support is only loaded, if option
% |unicode| is specified as package option.
+% change 2020-08-14: Starting with version
+% v7.00f the file is always loaded and unicode is the
+% default option.
% \begin{macro}{\HyPsd@LoadUnicode}
% Because the file |puenc.def| takes a lot of memory, the loading
% is defined in the macro \cs{HyPsd@LoadUnicode} called by
@@ -2164,6 +2071,10 @@
\def\HyPsd@LoadExtra{%
\ifHy@psdextra
\ltx@iffileloaded{puenc.def}{%
+ \ltx@iffileloaded{puenc-greek.def}{}{%
+ \Hy@SaveCatcodeSettings{pu}%
+ \input{puenc-greek.def}%
+ \Hy@RestoreCatcodeSettings{pu}}%
\Hy@SaveCatcodeSettings{psdextra}%
\input{psdextra.def}%
\Hy@RestoreCatcodeSettings{psdextra}%
@@ -2314,10 +2225,17 @@
\x
% \end{macrocode}
% \end{macro}
-%
% \subsubsection{Babel languages}
+% change 2020-10-10: moved language patches to its own file as a first step
+% toward removing them completly.
+% \begin{macrocode}
+\newif\ifHy@next
+\input{hyperref-langpatches.def}
+%</package>
+%<*lang>
+% \end{macrocode}
%
-% Since version 2008/03/16 v3.8j babel uses inside \cs{AtBeginDocument}:
+% Since version 2008/03/16 v3.8j babel used inside \cs{AtBeginDocument}:
%\begin{quote}
%\begin{verbatim}
%\pdfstringdefDisableCommands{%
@@ -2325,122 +2243,21 @@
%}
%\end{verbatim}
%\end{quote}
-% As consequence the shorthands are shown in the bookmarks,
-% not its result. Therefore \cs{languageshorthands} is
-% disabled before the user hook. If there is a need to
-% use the command, then \cs{HyOrg@languageshorthands}
-% can be used inside \cs{pdfstringdefDisableCommands}.
-% \begin{macrocode}
-\def\HyPsd@BabelPatch{%
- \let\HyOrg@languageshorthands\languageshorthands
- \let\languageshorthands\HyPsd@LanguageShorthands
-}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname pdf@strcmp\endcsname\relax
- \let\HyPsd@langshort@system\@empty
- \def\HyPsd@LanguageShorthands#1{%
- \expandafter\ifx\csname HyPsd@langshort@#1\endcsname
- \HyPsd@langshort@system
- \expandafter\@gobble
- \else
- \expandafter\@firstofone
- \fi
- {%
- \HyOrg@languageshorthands{#1}%
- }%
- }%
-\else
- \def\HyPsd@LanguageShorthands#1{%
- \ifnum\pdf@strcmp{#1}{system}=\z@
- \expandafter\@gobble
- \else
- \expandafter\@firstofone
- \fi
- {%
- \HyOrg@languageshorthands{#1}%
- }%
- }%
-\fi
-\def\Hy@temp{%
- \@ifpackageloaded{babel}{%
- \@ifpackagelater{babel}{2008/03/16}{%
- \let\Hy@temp\@empty
- }{%
- \def\HyPsd@BabelPatch{%
- \let\HyOrg@languageshorthands\languageshorthands
- }%
- }%
- }{}%
-}
-\Hy@temp
-\expandafter\Hy@AtBeginDocument\expandafter{\Hy@temp}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\newif\ifHy@next
-% \end{macrocode}
+% As consequence the shorthands were shown in the bookmarks, and required
+% a hyperref patch. In version 3.48 babel removed this unneeded code
+% and so the patch could be removed.
%
% Nothing to do for english.
-% \begin{macrocode}
-\ltx@IfUndefined{danish@sh@"@sel}{}{%
- \def\HyPsd@babel@danish{%
- \declare@shorthand{danish}{"|}{}%
- \declare@shorthand{danish}{"~}{-}%
- }%
-}
-\ltx@IfUndefined{dutch@sh@"@sel}{}{%
- \def\HyPsd@babel@dutch{%
- \declare@shorthand{dutch}{"|}{}%
- \declare@shorthand{dutch}{"~}{-}%
- }%
-}
-\ltx@IfUndefined{finnish@sh@"@sel}{}{%
- \def\HyPsd@babel@finnish{%
- \declare@shorthand{finnish}{"|}{}%
- }%
-}
-\ltx@IfUndefined{french@sh@:@sel}{}{%
- \def\HyPsd@babel@frenchb{%
- \def\guill@spacing{ }%
- }%
-}
-\ltx@IfUndefined{german@sh@"@sel}{}{%
- \def\HyPsd@babel@german{%
- \declare@shorthand{german}{"f}{f}%
- \declare@shorthand{german}{"|}{}%
- \declare@shorthand{german}{"~}{-}%
- }%
-}
-\ltx@IfUndefined{macedonian@sh@"@sel}{}{%
- \def\HyPsd@babel@macedonian{%
- \declare@shorthand{macedonian}{"|}{}%
- \declare@shorthand{macedonian}{"~}{-}%
- }%
-}{}
-\ltx@IfUndefined{ngerman@sh@"@sel}{}{%
- \def\HyPsd@babel@ngerman{%
- \declare@shorthand{ngerman}{"|}{}%
- \declare@shorthand{ngerman}{"~}{-}%
- }%
-}
-\ltx@IfUndefined{portuges@sh@"@sel}{}{%
- \def\HyPsd@babel@portuges{%
- \declare@shorthand{portuges}{"|}{}%
- }%
-}
-\ltx@IfUndefined{russian@sh@"@sel}{}{%
- \def\HyPsd@babel@russian{%
- \declare@shorthand{russian}{"|}{}%
- \declare@shorthand{russian}{"~}{-}%
- }%
-}
-\ltx@IfUndefined{slovene@sh@"@sel}{}{%
- \def\HyPsd@babel@slovene{%
- \declare@shorthand{slovene}{"|}{}%
- }%
-}
-% \end{macrocode}
-% Nested quoting environments are not supported (|<<|, |>>|).
+% change 2020/07/16: removed patch for french. No longer needed.
+% change 2020/07/21: removed patches for german, ngerman. Will be done by
+% the language package. https://github.com/jspitz/babel-german/issues/4
+% change 2020/10/10: removed patches for danish, dutch, finnish, portugues,
+% swedish, usorbian, slovene see https://github.com/latex3/babel/issues/84
+% change 2020/10/10: removed patch for macedonian, ukrainian; maintainers notified.
+% change 2020/10/11: removed patch for russian, has been merged into babel-russian
+% see https://github.com/kia999/babel-russian/pull/3
+% change 2021/02/04: removed patches for greek numerals, code is now in babel-greek.
+% spanish: Nested quoting environments are not supported (|<<|, |>>|).
% \begin{macrocode}
\ltx@IfUndefined{spanish@sh@>@sel}{}{%
\def\HyPsd@babel@spanish{%
@@ -2452,164 +2269,6 @@
\declare@shorthand{spanish}{"?}{\textquestiondown}%
}%
}
-\ltx@IfUndefined{swedish@sh@"@sel}{}{%
- \def\HyPsd@babel@swedish{%
- \declare@shorthand{swedish}{"|}{}%
- \declare@shorthand{swedish}{"~}{-}%
- }%
-}
-\ltx@IfUndefined{ukrainian@sh@"@sel}{}{%
- \def\HyPsd@babel@ukrainian{%
- \declare@shorthand{ukrainian}{"|}{}%
- \declare@shorthand{ukrainian}{"~}{-}%
- }%
-}
-\ltx@IfUndefined{usorbian@sh@"@sel}{}{%
- \def\HyPsd@babel@usorbian{%
- \declare@shorthand{usorbian}{"f}{f}%
- \declare@shorthand{usorbian}{"|}{}%
- }%
-}
-% \end{macrocode}
-% \begin{macrocode}
-\ltx@IfUndefined{greek@sh@\string~@sel}{%
- \let\HyPsd@GreekPatch\@empty
-}{%
- \def\HyPsd@GreekPatch{%
- \let\greeknumeral\HyPsd@greeknumeral
- \let\Greeknumeral\HyPsd@Greeknumeral
- }%
-}
-\def\HyPsd@greeknumeral#1{%
- \HyPsd@GreekNum\@firstoftwo{#1}%
-}
-\def\HyPsd@Greeknumeral#1{%
- \HyPsd@GreekNum\@secondoftwo{#1}%
-}
-\def\HyPsd@GreekNum#1#2{%
- \ifHy@unicode
- \ifnum#2<\@ne
- \@arabic{#2}%
- \else
- \ifnum#2<1000000 %
- \HyPsd@@GreekNum#1{#2}%
- \else
- \@arabic{#2}%
- \fi
- \fi
- \else
- \@arabic{#2}%
- \fi
-}
-\def\HyPsd@@GreekNum#1#2{%
- \ifnum#2<\@m
- \ifnum#2<10 %
- \expandafter\HyPsd@GreekNumI
- \expandafter\@gobble\expandafter#1\number#2%
- \else
- \ifnum#2<100 %
- \expandafter\HyPsd@GreekNumII
- \expandafter\@gobble\expandafter#1\number#2%
- \else
- \expandafter\HyPsd@GreekNumIII
- \expandafter\@gobble\expandafter#1\number#2%
- \fi
- \fi
- \ifnum#2>\z@
- \textnumeralsigngreek
- \fi
- \else
- \ifnum#2<\@M
- \expandafter\HyPsd@GreekNumIV\expandafter#1\number#2%
- \else
- \ifnum#2<100000 %
- \expandafter\HyPsd@GreekNumV\expandafter#1\number#2%
- \else
- \expandafter\HyPsd@GreekNumVI\expandafter#1\number#2%
- \fi
- \fi
- \fi
-}
-\def\HyPsd@GreekNumI#1#2#3{%
- #1{%
- \ifnum#3>\z@
- \textnumeralsignlowergreek
- \fi
- }%
- \expandafter#2%
- \ifcase#3 %
- {}{}%
- \or\textalpha\textAlpha
- \or\textbeta\textBeta
- \or\textgamma\textGamma
- \or\textdelta\textDelta
- \or\textepsilon\textEpsilon
- \or\textstigmagreek\textStigmagreek
- \or\textzeta\textZeta
- \or\texteta\textEta
- \or\texttheta\textTheta
- \else
- {}{}%
- \fi
-}
-\def\HyPsd@GreekNumII#1#2#3#4{%
- #1{%
- \ifnum#3>\z@
- \textnumeralsignlowergreek
- \fi
- }%
- \expandafter#2%
- \ifcase#3 %
- {}{}%
- \or\textiota\textIota
- \or\textkappa\textKappa
- \or\textlambda\textLambda
- \or\textmu\textMu
- \or\textnu\textNu
- \or\textxi\textXi
- \or\textomicron\textOmicron
- \or\textpi\textPi
- \or\textkoppagreek\textKoppagreek
- \else
- {}{}%
- \fi
- \HyPsd@GreekNumI#1#2#4%
-}
-\def\HyPsd@GreekNumIII#1#2#3#4#5{%
- #1{%
- \ifnum#3>\z@
- \textnumeralsignlowergreek
- \fi
- }%
- \expandafter#2%
- \ifcase#3 %
- {}{}%
- \or\textrho\textRho
- \or\textsigma\textSigma
- \or\texttau\textTau
- \or\textupsilon\textUpsilon
- \or\textphi\textPhi
- \or\textchi\textChi
- \or\textpsi\textPsi
- \or\textomega\textOmega
- \or\textsampigreek\textSampigreek
- \else
- {}{}%
- \fi
- \HyPsd@GreekNumII#1#2#4#5%
-}
-\def\HyPsd@GreekNumIV#1#2#3#4#5{%
- \HyPsd@GreekNumI\@firstofone#1#2%
- \HyPsd@@GreekNum#1{#3#4#5}%
-}
-\def\HyPsd@GreekNumV#1#2#3#4#5#6{%
- \HyPsd@GreekNumII\@firstofone#1#2#3%
- \HyPsd@@GreekNum#1{#4#5#6}%
-}
-\def\HyPsd@GreekNumVI#1#2#3#4#5#6#7{%
- \HyPsd@GreekNumIII\@firstofone#1#2#3#4%
- \HyPsd@@GreekNum#1{#5#6#7}%
-}
% \end{macrocode}
% \begin{macrocode}
\def\HyPsd@SpanishPatch{%
@@ -2619,15 +2278,9 @@
}%
}
% \end{macrocode}
-% Shorthand |"-| of `russianb.ldf' is not expandable,
-% therefore it is disabled and replaced by |-|.
% \begin{macrocode}
-\def\HyPsd@RussianPatch{%
- \ltx@IfUndefined{russian@sh@"@-@}{%
- }{%
- \@namedef{russian@sh@"@-@}{-}%
- }%
-}
+%</lang>
+%<*package>
% \end{macrocode}
%
% \subsubsection{CJK patch}
@@ -3174,7 +2827,7 @@
% \cs{HyPsd@hyspacetest} replaces the \cs{hspace} by a space, if
% the length is greater than zero.
% \begin{macrocode}
-\def\HyPsd@hspacetest#1{\ifdim#1>\z@\space\fi}
+\def\HyPsd@hspacetest#1{\ifdim\dimexpr#1\relax>\z@\space\fi}
% \end{macrocode}
% \end{macro}
%
@@ -4798,7 +4451,11 @@
\let\Hy@RestoreLastskip\relax
\ifvmode
\ifdim\lastskip=\z@
- \let\Hy@RestoreLastskip\nobreak
+ \ifnum\lastnodetype=11 %
+ \let\Hy@RestoreLastskip\nobreak
+ \else
+ \let\Hy@RestoreLastskip\relax
+ \fi
\else
\begingroup
\skip@=-\lastskip
@@ -5245,7 +4902,11 @@
\def\HyPsd@pdfencoding@auto{auto}
\def\HyPsd@pdfencoding@pdfdoc{pdfdoc}
\def\HyPsd@pdfencoding@unicode{unicode}
-\let\HyPsd@pdfencoding\Hy@pdfencoding@pdfdoc
+% \end{macrocode}
+% change 2020-08-14, use unicode by default:
+% \begin{macrocode}
+\let\HyPsd@pdfencoding\HyPsd@pdfencoding@unicode
+\HyPsd@LoadUnicode
\def\HyPsd@LoadStringEnc{%
\RequirePackage{stringenc}[2009/12/15]%
\let\HyPsd@LoadStringEnc\relax
@@ -5289,7 +4950,7 @@
}%
}
% \end{macrocode}
-% \verb|\Hy@pdfminorversion| already used elsewhere to denote \verb|\pdfminorversion|
+% \verb|\Hy@pdfminorversion| already used elsewhere to denote \verb|\pdfminorversion|
% or \verb|\pdfvariable majorversion}| so introduce new names here.
% \begin{macrocode}
\@namedef{Hy@pdfversion@1.2}{\def\Hy@pdf@majorversion{1}\def\Hy@pdf@minorversion{2}}%
@@ -5312,7 +4973,7 @@
\@ifundefined{pdfminorversion}{}{%
\@ifundefined{pdfmajorversion}{%
\newcount\pdfmajorversion
-\pdfmajorversion=1
+\pdfmajorversion=1
}{}%
}
\ifx\pdfmajorversion\@undefined\else
@@ -5689,13 +5350,13 @@
\def\pageautorefname{page}%
}
\def\HyLang@french{%
- \def\equationautorefname{\'Equation}%
+ \def\equationautorefname{\'equation}%
\def\footnoteautorefname{note}%
\def\itemautorefname{item}%
- \def\figureautorefname{Figure}%
- \def\tableautorefname{Tableau}%
- \def\partautorefname{Partie}%
- \def\appendixautorefname{Appendice}%
+ \def\figureautorefname{figure}%
+ \def\tableautorefname{tableau}%
+ \def\partautorefname{partie}%
+ \def\appendixautorefname{annexe}%
\def\chapterautorefname{chapitre}%
\def\sectionautorefname{section}%
\def\subsectionautorefname{sous-section}%
@@ -5703,7 +5364,7 @@
\def\paragraphautorefname{paragraphe}%
\def\subparagraphautorefname{sous-paragraphe}%
\def\FancyVerbLineautorefname{ligne}%
- \def\theoremautorefname{Th\'eor\`eme}%
+ \def\theoremautorefname{th\'eor\`eme}%
\def\pageautorefname{page}%
}
\def\HyLang@german{%
@@ -6034,6 +5695,42 @@
\def\theoremautorefname{Stelling}%
\def\pageautorefname{pagina}%
}
+\def\HyLang@norsk{%
+ \def\equationautorefname{Ligning}%
+ \def\footnoteautorefname{fotnote}%
+ \def\itemautorefname{element}%
+ \def\figureautorefname{Figur}%
+ \def\tableautorefname{Tabell}%
+ \def\partautorefname{Del}%
+ \def\appendixautorefname{Tillegg}%
+ \def\chapterautorefname{kapittel}%
+ \def\sectionautorefname{seksjon}%
+ \def\subsectionautorefname{underseksjon}%
+ \def\subsubsectionautorefname{under-underseksjon}%
+ \def\paragraphautorefname{avsnitt}%
+ \def\subparagraphautorefname{underavsnitt}%
+ \def\FancyVerbLineautorefname{Linje}%
+ \def\theoremautorefname{Teorem}%
+ \def\pageautorefname{side}%
+}
+\def\HyLang@danish{%
+ \def\equationautorefname{Ligning}%
+ \def\footnoteautorefname{fodnote}%
+ \def\itemautorefname{element}%
+ \def\figureautorefname{Figur}%
+ \def\tableautorefname{Tabel}%
+ \def\partautorefname{Del}%
+ \def\appendixautorefname{Bilag}%
+ \def\chapterautorefname{kapitel}%
+ \def\sectionautorefname{sektion}%
+ \def\subsectionautorefname{under-sektion}%
+ \def\subsubsectionautorefname{under-under-sektion}%
+ \def\paragraphautorefname{afsnit}%
+ \def\subparagraphautorefname{underafsnit}%
+ \def\FancyVerbLineautorefname{linje}%
+ \def\theoremautorefname{Teorem}%
+ \def\pageautorefname{side}%
+}
% \end{macrocode}
%
% Instead of package babel's definition of \cmd{\addto} the
@@ -6112,6 +5809,9 @@
\HyLang@DeclareLang{hungarian}{magyar}{}
\HyLang@DeclareLang{greek}{greek}{}
\HyLang@DeclareLang{dutch}{dutch}{}
+\HyLang@DeclareLang{norsk}{norsk}{}
+\HyLang@DeclareLang{norwegian}{norsk}{}
+\HyLang@DeclareLang{danish}{danish}{}
% \end{macrocode}
% More work is needed in case of options |vietnamese| and |vietnam|.
% \begin{macrocode}
@@ -6373,21 +6073,6 @@
% \end{macrocode}
% \end{macro}
%
-% The entry for the |/Hid| key in the page object is
-% only necessary, if it is used and set to true for
-% at least one time. If it is always false, then
-% the |/Hid| key is not written to the pdf page
-% object in order not to enlarge the pdf file.
-% \begin{macrocode}
-\newif\ifHy@useHidKey
-\Hy@useHidKeyfalse
-\define@key{Hyp}{pdfpagehidden}[true]{%
- \Hy@boolkey{pdfpagehidden}{#1}%
- \ifHy@pdfpagehidden
- \global\Hy@useHidKeytrue
- \fi
-}
-% \end{macrocode}
%
% The value of the |bordercolor| options are not processed
% by the color package. Therefore the value consists of
@@ -6598,31 +6283,26 @@
}
\define@key{Hyp}{pdftitle}{%
\HyXeTeX@CheckUnicode
- \HyPsd@XeTeXBigCharstrue
\HyPsd@PrerenderUnicode{#1}%
\pdfstringdef\@pdftitle{#1}%
}
\define@key{Hyp}{pdfauthor}{%
\HyXeTeX@CheckUnicode
- \HyPsd@XeTeXBigCharstrue
\HyPsd@PrerenderUnicode{#1}%
\pdfstringdef\@pdfauthor{#1}%
}
\define@key{Hyp}{pdfproducer}{%
\HyXeTeX@CheckUnicode
- \HyPsd@XeTeXBigCharstrue
\HyPsd@PrerenderUnicode{#1}%
\pdfstringdef\@pdfproducer{#1}%
}
\define@key{Hyp}{pdfcreator}{%
\HyXeTeX@CheckUnicode
- \HyPsd@XeTeXBigCharstrue
\HyPsd@PrerenderUnicode{#1}%
\pdfstringdef\@pdfcreator{#1}%
}
\define@key{Hyp}{addtopdfcreator}{%
\HyXeTeX@CheckUnicode
- \HyPsd@XeTeXBigCharstrue
\HyPsd@PrerenderUnicode{#1}%
\pdfstringdef\@pdfcreator{\@pdfcreator, #1}%
}
@@ -6640,13 +6320,11 @@
}
\define@key{Hyp}{pdfsubject}{%
\HyXeTeX@CheckUnicode
- \HyPsd@XeTeXBigCharstrue
\HyPsd@PrerenderUnicode{#1}%
\pdfstringdef\@pdfsubject{#1}%
}
\define@key{Hyp}{pdfkeywords}{%
\HyXeTeX@CheckUnicode
- \HyPsd@XeTeXBigCharstrue
\HyPsd@PrerenderUnicode{#1}%
\pdfstringdef\@pdfkeywords{#1}%
}
@@ -6727,7 +6405,6 @@
\def\HyInfo@tmp##1{%
\kv@define@key{pdfinfo}{##1}{%
\HyXeTeX@CheckUnicode
- \HyPsd@XeTeXBigCharstrue
\HyPsd@PrerenderUnicode{####1}%
\pdfstringdef\HyInfo@Value{####1}%
\global\expandafter
@@ -7278,15 +6955,10 @@
% so the NFSS2 definitions of PD1 or PU encoding is not
% compatible. To fix this, \cmd{\texttilde} is defined
% in babel manner.
-% \begin{macrocode}
-\Hy@nextfalse
-\ltx@IfUndefined{spanish@sh@"@sel}{}{\Hy@nexttrue}
-\ltx@IfUndefined{galician@sh@"@sel}{}{\Hy@nexttrue}
-\ltx@IfUndefined{estonian@sh@"@sel}{}{\Hy@nexttrue}
-\ifHy@next
- \let\texttilde\~%
-\fi
-% \end{macrocode}
+%
+% change 2020-10-10: no trace of \cs{texttilde} can be found in the
+% three languages spanish, galician and estonian so the patch has been removed
+% as outdated.
%
% \begin{macrocode}
\def\Hy@wrapper@babel#1#2{%
@@ -10580,7 +10252,13 @@
\endgroup}
%</xetex>
% \end{macrocode}
-%
+% set the pdf version
+% \begin{macrocode}
+%<*dvipdfm|xetex>
+\special{pdf:majorversion \Hy@pdf@majorversion}
+\special{pdf:minorversion \Hy@pdf@minorversion}
+%</dvipdfm|xetex>
+% \end{macrocode}
% \subsubsection{pdfmarkbase, dvipdfm, xetex}
%
% \begin{macrocode}
@@ -11061,17 +10739,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macrocode}
-\@ifpackageloaded{fancyvrb}{%
- \@ifpackagelater{fancyvrb}{1998/05/20}{}{%
- \def\FV@StepLineNo{%
- \FV@SetLineNo
- \def\FV@StepLineNo{\H@refstepcounter{FancyVerbLine}}%
- \FV@StepLineNo
- }%
- }%
-}{}
-% \end{macrocode}
%
% \section{Package lastpage support}
% Package lastpage directly writes the |\newlabel| command to the
@@ -14335,55 +14002,12 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\hyper@pagehidden}
-% The boolean value of the key |/Hid| is stored in switch
-% \cmd{\ifHy@pdfpagehidden}.
-% First previous |/Hid| entries are removed, then the new
-% one is appended, if the value is true (the PDF default
-% is false).
-% \begin{macrocode}
-\def\hyper@pagehidden{%
- \ifHy@useHidKey
- \expandafter
- \Hy@RemoveHidPageAttr\the\pdfpageattr^^J/Hid{} \END
- \ifHy@pdfpagehidden
- \edef\@processme{%
- \global\pdfpageattr{%
- \the\pdfpageattr
- ^^J/Hid true % SPACE
- }%
- }%
- \@processme
- \fi
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\Hy@RemoveHidPageAttr}
-% Macro \cmd{\Hy@RemoveHidPageAttr} removes a |/Hid|
-% entry from \cmd{\pdfpageattr}. It is called with
-% the end marker |^^J/Hid{} \END|. The trick is the
-% empty group that does not appear in legal
-% \cmd{\pdfpageattr} code. It appears in argument
-% |#2| and shows, whether the parameter text
-% catches a really |/Hid| object or the end marker.
-% \begin{macrocode}
-\gdef\Hy@RemoveHidPageAttr#1^^J/Hid#2#3 #4\END{%
- \ifx\\#2\\%
- \global\pdfpageattr{#1}%
- \else
- \Hy@RemoveHidPageAttr#1#4\END
- \fi
-}
-% \end{macrocode}
-% \end{macro}
%
% \begin{macrocode}
\pdf@ifdraftmode{}{%
\g@addto@macro\Hy@EveryPageHook{%
\hyper@pagetransition
\hyper@pageduration
- \hyper@pagehidden
}%
}
% \end{macrocode}
@@ -14490,19 +14114,8 @@
%
% Since version 2011/10/05 v1.16 of package `atbegshi'
% \cs{AtBeginShipoutFirst} does not add a additional box layer.
-% \begin{macrocode}
-\def\Hy@FixNotFirstPage{%
- \gdef\Hy@FixNotFirstPage{%
- \setbox\AtBeginShipoutBox=\hbox{%
- \copy\AtBeginShipoutBox
- }%
- }%
-}
-\ltx@ifpackagelater{atbegshi}{2011/10/05}{%
-}{%
- \AtBeginShipout{\Hy@FixNotFirstPage}%
-}
-% \end{macrocode}
+%
+% change 2020-10-01: the code has been removed as outdated.
%
% \begin{macrocode}
%</pdftex>
@@ -14956,7 +14569,12 @@
% \end{macrocode}
% \subsection{dvipdfm/xetex dvi to PDF converter}
% Provided by Mark Wicks (mwicks@kettering.edu)
+%
+% (x)dvipdfmx replaces destination names by numbers. This makes it impossible
+% to link from an external document with xr-hyper, so from version 7.00j on
+% this is suppressed with a config special.
% \begin{macrocode}
+\special{dvipdfmx:config C 0x0010}
\providecommand*{\XR@ext}{pdf}
\Hy@setbreaklinks{true}
\def\HyPat@ObjRef{%
@@ -15480,22 +15098,10 @@
}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\hyper@pagehidden}
-% \begin{macrocode}
-\def\hyper@pagehidden{%
- \ifHy@useHidKey
- \special{pdf:put @thispage %
- <</Hid \ifHy@pdfpagehidden true\else false\fi>>%
- }%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
% \begin{macrocode}
\g@addto@macro\Hy@EveryPageBoxHook{%
\hyper@pagetransition
\hyper@pageduration
- \hyper@pagehidden
}
% \end{macrocode}
% \begin{macrocode}
@@ -16138,15 +15744,9 @@
\fi
\fi
}%
- \def\hyper@pagehidden{%
- \ifHy@useHidKey
- \special{!hidden\ifHy@pdfpagehidden +\else -\fi}%
- \fi
- }%
\g@addto@macro\Hy@EveryPageBoxHook{%
\hyper@pagetransition
\hyper@pageduration
- \hyper@pagehidden
}%
\fi
% \end{macrocode}
@@ -16540,26 +16140,10 @@
}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\hyper@pagehidden}
-% \begin{macrocode}
-\def\hyper@pagehidden{%
- \ifHy@useHidKey
- \pdfmark{%
- pdfmark=/PUT,%
- Raw={%
- \string{ThisPage\string}%
- <</Hid \ifHy@pdfpagehidden true\else false\fi>>%
- }%
- }%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
% \begin{macrocode}
\g@addto@macro\Hy@EveryPageBoxHook{%
\hyper@pagetransition
\hyper@pageduration
- \hyper@pagehidden
}
% \end{macrocode}
% \begin{macrocode}
@@ -18121,6 +17705,7 @@
%
% \section{Driver-specific form support}
% \subsection{pdfmarks}
+% change 2020-06-20: added /Euro to encoding
% \begin{macrocode}
%<*pdfmark>
\long\def\@Form[#1]{%
@@ -18144,6 +17729,7 @@
/quotedblbase/quotedblleft/quotedblright/quoteleft%
/quoteright/quotesinglbase/trademark/fi/fl/Lslash/OE/Scaron%
/Ydieresis/Zcaron/dotlessi/lslash/oe/scaron/zcaron %
+ 160/Euro %
164/currency %
166/brokenbar %
168/dieresis/copyright/ordfeminine %
@@ -19230,6 +18816,7 @@
/quotedblbase/quotedblleft/quotedblright/quoteleft%
/quoteright/quotesinglbase/trademark/fi/fl/Lslash/OE%
/Scaron/Ydieresis/Zcaron/dotlessi/lslash/oe/scaron/zcaron %
+ 160/Euro %
164/currency %
166/brokenbar %
168/dieresis/copyright/ordfeminine %
@@ -19708,6 +19295,7 @@
/quotedblbase/quotedblleft/quotedblright/quoteleft/quoteright%
/quotesinglbase/trademark/fi/fl/Lslash/OE/Scaron/Ydieresis%
/Zcaron/dotlessi/lslash/oe/scaron/zcaron %
+ 160/Euro %
164/currency %
166/brokenbar %
168/dieresis/copyright/ordfeminine %
@@ -19832,7 +19420,6 @@
\Hy@unicodefalse
\fi
\fi
- \HyPsd@XeTeXBigCharstrue
\pdfstringdef\Hy@gtemp#1%
\endgroup
\let#1\Hy@gtemp
@@ -20324,7 +19911,6 @@
\let\partnumberline\@gobble
\let\chapternumberline\@gobble
\fi
- \HyPsd@XeTeXBigCharstrue
\pdfstringdef\Hy@tempa{#2}%
\HyPsd@SanitizeForOutFile\Hy@tempa
\if@filesw
@@ -21398,7 +20984,9 @@
\DeclareTextCommand{\=}{PU}[1]{#1\83\004}% U+0304
% U+0306 COMBINING BREVE; brevecmb
\DeclareTextCommand{\u}{PU}[1]{#1\83\006}% U+0306
+\ifx\CYRDZE\@undefined \else
\DeclareTextCommand{\U}{PU}[1]{#1\83\006}% U+0306
+\fi
% U+0307 COMBINING DOT ABOVE; dotaccentcmb
\DeclareTextCommand{\.}{PU}[1]{#1\83\007}% U+0307
% U+0308 COMBINING DIAERESIS; dieresiscmb
@@ -21409,9 +20997,13 @@
\DeclareTextCommand{\H}{PU}[1]{#1\83\013}% U+030B
% U+030C COMBINING CARON; caroncmb
\DeclareTextCommand{\v}{PU}[1]{#1\83\014}% U+030C
+%</puenc>
% U+030F COMBINING DOUBLE GRAVE ACCENT; dblgravecmb
-\DeclareTextCommand{\G}{PU}[1]{#1\83\017}% U+030F
+%<puextra>\DeclareTextCommand{\G}{PU}[1]{#1\83\017}% U+030F
+%<*puenc>
+\ifx\CYRDZE\@undefined \else
\DeclareTextCommand{\C}{PU}[1]{#1\83\017}% U+030F
+\fi
% U+0311 COMBINING INVERTED BREVE; breveinvertedcmb
\DeclareTextCommand{\textinvbreve}{PU}[1]{#1\83\021}% U+0311
\DeclareTextCommand{\newtie}{PU}[1]{#1\83\021}% U+0311
@@ -21459,7 +21051,9 @@
\DeclareTextCompositeCommand{\.}{PU}{\@empty}{\textdotaccent}%
\DeclareTextCompositeCommand{\c}{PU}{\@empty}{\textcedilla}%
\DeclareTextCompositeCommand{\u}{PU}{\@empty}{\textasciibreve}%
-\DeclareTextCompositeCommand{\G}{PU}{\@empty}{\textdoublegrave}%
+%</puenc>
+%<puextra>\DeclareTextCompositeCommand{\G}{PU}{\@empty}{\textdoublegrave}%
+%<*puenc>
\DeclareTextCompositeCommand{\=}{PU}{\@empty}{\textasciimacron}%
\DeclareTextCompositeCommand{\H}{PU}{\@empty}{\texthungarumlaut}%
\DeclareTextCompositeCommand{\k}{PU}{\@empty}{\textogonek}%
@@ -21488,7 +21082,9 @@
\DeclareTextCompositeCommand{\.}{PU}{\ }{\textdotaccent}%
\DeclareTextCompositeCommand{\c}{PU}{\ }{\textcedilla}%
\DeclareTextCompositeCommand{\u}{PU}{\ }{\textasciibreve}%
-\DeclareTextCompositeCommand{\G}{PU}{\ }{\textdoublegrave}%
+%</puenc>
+%<puextra>\DeclareTextCompositeCommand{\G}{PU}{\ }{\textdoublegrave}%
+%<*puenc>
\DeclareTextCompositeCommand{\=}{PU}{\ }{\textasciimacron}%
\DeclareTextCompositeCommand{\H}{PU}{\ }{\texthungarumlaut}%
\DeclareTextCompositeCommand{\k}{PU}{\ }{\textogonek}%
@@ -22284,6 +21880,8 @@
% U+01FF LATIN SMALL LETTER O WITH STROKE AND ACUTE;
% *oslashacute, ostrokeacute
\DeclareTextCompositeCommand{\'}{PU}{\o}{\81\377}% U+01FF
+%</puenc>
+%<*puextra>
% U+0200 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE; Adblgrave
\DeclareTextCompositeCommand{\G}{PU}{A}{\82\000}% U+0200
% U+0201 LATIN SMALL LETTER A WITH DOUBLE GRAVE; adblgrave
@@ -22292,28 +21890,40 @@
\DeclareTextCompositeCommand{\G}{PU}{E}{\82\004}% U+0204
% U+0205 LATIN SMALL LETTER E WITH DOUBLE GRAVE; edblgrave
\DeclareTextCompositeCommand{\G}{PU}{e}{\82\005}% U+0205
+%</puextra>
+%<*puenc>
% U+0206 LATIN CAPITAL LETTER E WITH INVERTED BREVE; Einvertedbreve
\DeclareTextCompositeCommand{\textinvbreve}{PU}{E}{\82\006}% U+0206
% U+0207 LATIN SMALL LETTER E WITH INVERTED BREVE; einvertedbreve
\DeclareTextCompositeCommand{\textinvbreve}{PU}{e}{\82\007}% U+0207
+%</puenc>
+%<*puextra>
% U+0208 LATIN CAPITAL LETTER I WITH DOUBLE GRAVE; Idblgrave
\DeclareTextCompositeCommand{\G}{PU}{I}{\82\010}% U+0208
% U+0209 LATIN SMALL LETTER I WITH DOUBLE GRAVE; idblgrave
\DeclareTextCompositeCommand{\G}{PU}{\i}{\82\011}% U+0209
\DeclareTextCompositeCommand{\G}{PU}{i}{\82\011}% U+0209
+%</puextra>
+%<*puenc>
% U+020A LATIN CAPITAL LETTER I WITH INVERTED BREVE; Iinvertedbreve
\DeclareTextCompositeCommand{\textinvbreve}{PU}{I}{\82\012}% U+020A
% U+020B LATIN SMALL LETTER I WITH INVERTED BREVE; iinvertedbreve
\DeclareTextCompositeCommand{\textinvbreve}{PU}{i}{\82\013}% U+020B
\DeclareTextCompositeCommand{\textinvbreve}{PU}{\i}{\82\013}% U+020B
+%</puenc>
+%<*puextra>
% U+020C LATIN CAPITAL LETTER O WITH DOUBLE GRAVE; Odblgrave
\DeclareTextCompositeCommand{\G}{PU}{O}{\82\014}% U+020C
% U+020D LATIN SMALL LETTER O WITH DOUBLE GRAVE; odblgrave
\DeclareTextCompositeCommand{\G}{PU}{o}{\82\015}% U+020D
+%</puextra>
+%<*puenc>
% U+020E LATIN CAPITAL LETTER O WITH INVERTED BREVE; Oinvertedbreve
\DeclareTextCompositeCommand{\textinvbreve}{PU}{O}{\82\016}% U+020E
% U+020F LATIN SMALL LETTER O WITH INVERTED BREVE; oinvertedbreve
\DeclareTextCompositeCommand{\textinvbreve}{PU}{o}{\82\017}% U+020F
+%</puenc>
+%<*puextra>
% U+0210 LATIN CAPITAL LETTER R WITH DOUBLE GRAVE; Rdblgrave
\DeclareTextCompositeCommand{\G}{PU}{R}{\82\020}% U+0210
% U+0211 LATIN SMALL LETTER R WITH DOUBLE GRAVE; rdblgrave
@@ -22322,6 +21932,8 @@
\DeclareTextCompositeCommand{\G}{PU}{U}{\82\024}% U+0214
% U+0215 LATIN SMALL LETTER U WITH DOUBLE GRAVE; udblgrave
\DeclareTextCompositeCommand{\G}{PU}{u}{\82\025}% U+0215
+%</puextra>
+%<*puenc>
% U+0216 LATIN CAPITAL LETTER U WITH INVERTED BREVE; Uinvertedbreve
\DeclareTextCompositeCommand{\textinvbreve}{PU}{U}{\82\026}% U+0216
% U+0217 LATIN SMALL LETTER U WITH INVERTED BREVE; uinvertedbreve
@@ -22750,12 +22362,19 @@
% \end{macrocode}
%
% \subsubsection{Greek and Coptic: U+0370 to U+03FF}
-%
+% Greek is only loaded if \cs{textBeta} is defined.
% \begin{macrocode}
+\ifx\textBeta\@undefined \else
+\input{puenc-greek.def}
+\fi
+%</puenc>
+%<*pugreek>
% U+0374 GREEK NUMERAL SIGN; numeralsigngreek
\DeclareTextCommand{\textnumeralsigngreek}{PU}{\83\164}% U+0374
+\DeclareTextCommand{\textdexiakeraia}{PU}{\83\164}% U+0374
% U+0375 GREEK LOWER NUMERAL SIGN; numeralsignlowergreek
\DeclareTextCommand{\textnumeralsignlowergreek}{PU}{\83\165}% U+0375
+\DeclareTextCommand{\textaristerikeraia}{PU}{\83\165}% U+0375
% U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS; Alphatonos
\DeclareTextCompositeCommand{\'}{PU}{\textAlpha}{\83\206}% U+0386
% U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS; Epsilontonos
@@ -22899,33 +22518,49 @@
\DeclareTextCompositeCommand{\'}{PU}{\textupsilon}{\83\315}% U+03CD
% U+03CE GREEK SMALL LETTER OMEGA WITH TONOS; omegatonos
\DeclareTextCompositeCommand{\'}{PU}{\textomega}{\83\316}% U+03CE
+% U+03D8 GREEK LETTER ARCHAIC KOPPA;
+\DeclareTextCommand{\textQoppa}{PU}{\83\330}% U+03D8
+% U+03D9 GREEK SMALL LETTER ARCHAIC KOPPA;
+\DeclareTextCommand{\textqoppa}{PU}{\83\331}% U+03D9
% U+03DA GREEK LETTER STIGMA; Stigmagreek
\DeclareTextCommand{\textStigmagreek}{PU}{\83\332}% U+03DA
+\DeclareTextCommand{\textStigma}{PU}{\83\332}% U+03DA
% U+03DB GREEK SMALL LETTER STIGMA
\DeclareTextCommand{\textstigmagreek}{PU}{\83\333}% U+03DB
+\DeclareTextCommand{\textstigma}{PU}{\83\333}% U+03DB
% U+03DC GREEK LETTER DIGAMMA; Digammagreek
\DeclareTextCommand{\textDigammagreek}{PU}{\83\334}% U+03DC
+\DeclareTextCommand{\textDigamma}{PU}{\83\334}% U+03DC
% U+03DD GREEK SMALL LETTER DIGAMMA
\DeclareTextCommand{\textdigammagreek}{PU}{\83\335}% U+03DD
+\DeclareTextCommand{\textdigamma}{PU}{\83\335}% U+03DD
%* \textdigammagreek -> \digamma (AmS)
% U+03DE GREEK LETTER KOPPA; Koppagreek
+\DeclareTextCommand{\textKoppa}{PU}{\83\336}% U+03DE
\DeclareTextCommand{\textKoppagreek}{PU}{\83\336}% U+03DE
% U+03DF GREEK SMALL LETTER KOPPA
+\DeclareTextCommand{\textkoppa}{PU}{\83\337}% U+03DF
\DeclareTextCommand{\textkoppagreek}{PU}{\83\337}% U+03DF
% U+03E0 GREEK LETTER SAMPI; Sampigreek
\DeclareTextCommand{\textSampigreek}{PU}{\83\340}% U+03E0
+\DeclareTextCommand{\textSampi}{PU}{\83\340}% U+03E0
% U+03E1 GREEK SMALL LETTER SAMPI
\DeclareTextCommand{\textsampigreek}{PU}{\83\341}% U+03E1
+\DeclareTextCommand{\textsampi}{PU}{\83\341}% U+03E1
% U+03F6 GREEK REVERSED LUNATE EPSILON SYMBOL;
% \backepsilon (AmS)
\DeclareTextCommand{\textbackepsilon}{PU}{\83\366}% U+03F6
+%</pugreek>
% \end{macrocode}
%
% \subsubsection{Cyrillic: U+0400 to U+04FF}
%
% Thanks to Vladimir Volovich (\Email{vvv@vvv.vsu.ru}) for
% the help with the Cyrillic glyph names.
+% Cyrillic only loaded if \cs{CYRDZE} is defined.
% \begin{macrocode}
+%<*puenc>
+\ifx\CYRDZE\@undefined \else
% U+0400 CYRILLIC CAPITAL LETTER IE WITH GRAVE
\DeclareTextCompositeCommand{\`}{PU}{\CYRE}{\84\000}% U+0400
% U+0401 CYRILLIC CAPITAL LETTER IO; Iocyrillic, *afii10023
@@ -23461,6 +23096,7 @@
\DeclareTextCommand{\CYRHHK}{PU}{\84\374}% U+04FC
% U+04FD CYRILLIC SMALL LETTER HA WITH HOOK
\DeclareTextCommand{\cyrhhk}{PU}{\84\375}% U+04FD
+\fi
% \end{macrocode}
% |\84\376|: U+04FE CYRILLIC CAPITAL LETTER HA WITH STROKE\\
% |\84\377|: U+04FF CYRILLIC SMALL LETTER HA WITH STROKE
@@ -23468,7 +23104,9 @@
% \subsubsection{Hebrew: U+0590 to U+05FF}
%
% Macro names are taken from \texttt{he8enc.def}.
+% hebrew is only loaded if \cs{hebdalet} is defined
% \begin{macrocode}
+\ifx\hebdalet\@undefined\else
% U+05C3 HEBREW PUNCTUATION SOF PASUQ
\DeclareTextCommand{\sofpasuq}{PU}{\85\303}% U+05C3
% U+05D0 HEBREW LETTER ALEF
@@ -23532,6 +23170,7 @@
\DeclareTextCommand{\vavyod}{PU}{\85\361}% U+05F1
% U+05F2 HEBREW LIGATURE YIDDISH DOUBLE YOD
\DeclareTextCommand{\doubleyod}{PU}{\85\362}% U+05F2
+\fi
% \end{macrocode}
%
% \subsubsection{Thai: U+0E00 to U+0E7F}
diff --git a/Master/texmf-dist/source/latex/hyperref/hyperref.ins b/Master/texmf-dist/source/latex/hyperref/hyperref.ins
index e313a869b79..a8943829822 100644
--- a/Master/texmf-dist/source/latex/hyperref/hyperref.ins
+++ b/Master/texmf-dist/source/latex/hyperref/hyperref.ins
@@ -7,7 +7,7 @@
%% 1995-2001 Sebastian Rahtz, with portions written by David Carlisle and Heiko Oberdiek
%% 2001-2015 Heiko Oberdiek
%% 2016-2019 Oberdiek Package Support Group
-%% 2019-2020 LaTeX3 Project
+%% 2019-2021 LaTeX Project
%% https://github.com/latex3/hyperref/issues
%%
%% This file is part of the `Hyperref Bundle'.
@@ -22,7 +22,7 @@
%% version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `maintained'.
-%%
+%%
%% The Current Maintainer of this work is Heiko Oberdiek.
%%
%% The list of all files belonging to the `Hyperref Bundle' is
@@ -31,7 +31,7 @@
%%
%% --------------- start of docstrip commands ------------------
%%
-\def\filedate{2020/01/14}
+\def\filedate{2021/02/04}
\def\batchfile{hyperref.ins}
\input docstrip
@@ -83,10 +83,13 @@
\file{hxetex.def}{\from{hyperref.dtx}{xetex,pdfform,outlines}}
\file{pd1enc.def}{\from{hyperref.dtx}{pd1enc}}
\file{puenc.def}{\from{hyperref.dtx}{puenc}}
+ \file{puenc-greek.def}{\from{hyperref.dtx}{pugreek}}
+ \file{puenc-extra.def}{\from{hyperref.dtx}{puextra}}
\file{puvnenc.def}{\from{hyperref.dtx}{puvnenc}}
\file{puarenc.def}{\from{hyperref.dtx}{puarenc}}
\file{psdextra.def}{\from{hyperref.dtx}{psdextra}}
\file{nohyperref.sty}{\from{hyperref.dtx}{nohyperref}}
+ \file{hyperref-langpatches.def}{\from{hyperref.dtx}{lang}}
}
\Msg{***************************************************************}
diff --git a/Master/texmf-dist/source/latex/hyperref/nameref.dtx b/Master/texmf-dist/source/latex/hyperref/nameref.dtx
index f6ea1c856a5..adc41b8fdcb 100644
--- a/Master/texmf-dist/source/latex/hyperref/nameref.dtx
+++ b/Master/texmf-dist/source/latex/hyperref/nameref.dtx
@@ -4,7 +4,7 @@
%% 2000 Sebastian Rahtz, Heiko Oberdiek
%% 2001-2012 Heiko Oberdiek
%% 2016-2019 Oberdiek Package Suport Group
-%% 2019-2020 The LaTeX3 Project
+%% 2019-2021 The LaTeX Project
%% https://github.com/latex3/hyperref/issues
%%
%% This file is part of the `Hyperref Bundle'.
@@ -20,7 +20,7 @@
%%
%% This work has the LPPL maintenance status `maintained'.
%%
-%% The Current Maintainer of this work is The LaTeX3 Project.
+%% The Current Maintainer of this work is The LaTeX Project.
%%
%% The list of all files belonging to the `Hyperref Bundle' is
%% given in the file `manifest.txt'.
@@ -33,11 +33,12 @@
%<driver>\ProvidesFile{nameref.drv}
% \fi
% \ProvidesFile{nameref.dtx}
- [2019/09/16 v2.46 Cross-referencing by name of section]%
+ [2021-04-02 v2.47 Cross-referencing by name of section]%
%
%
% \iffalse
%<*driver>
+\PassOptionsToPackage{numbered}{hypdoc}
\documentclass{ltxdoc}
\usepackage[numbered]{hypdoc}
\usepackage{bmhydoc}
@@ -56,7 +57,7 @@
}%
\author{Sebastian Rahtz (deceased)\\%
Heiko Oberdiek (inactive)\\%
- The \LaTeX3 Project\\%
+ The \LaTeX\ Project\\%
\texttt{https://github.com/latex3/hyperref/issues}}%
\date{\filedate}%
\maketitle
diff --git a/Master/texmf-dist/source/latex/hyperxmp/einstein-xmp.tex b/Master/texmf-dist/source/latex/hyperxmp/einstein-xmp.tex
index 2526cf0ff7c..7fad01f38a7 100644
--- a/Master/texmf-dist/source/latex/hyperxmp/einstein-xmp.tex
+++ b/Master/texmf-dist/source/latex/hyperxmp/einstein-xmp.tex
@@ -6,45 +6,48 @@
\let\todayISO=\hyxmp@today
\makeatother
-\begin{alltt}
+\begin{Verbatim}[fontsize=\small,commandchars=\\\{\}]
<?xpacket begin="\string\357\string\273\string\277" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
- xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
- xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
- xmlns:xmp="http://ns.adobe.com/xap/1.0/"
- xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
- xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
- xmlns:pdfaid="http://www.aiim.org/pdfa/ns/id/"
- xmlns:pdfuaid="http://www.aiim.org/pdfua/ns/id/"
- xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/"
- xmlns:pdfxid="http://www.npes.org/pdfx/ns/id/"
- xmlns:prism="http://prismstandard.org/namespaces/basic/2.1/"
- xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
- xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/"
- xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#"
- xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#"
- xmlns:pdfaType="http://www.aiim.org/pdfa/ns/type#"
- xmlns:pdfaField="http://www.aiim.org/pdfa/ns/field#">
+ xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
+ xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
+ xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+ xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
+ xmlns:pdfaid="http://www.aiim.org/pdfa/ns/id/"
+ xmlns:pdfuaid="http://www.aiim.org/pdfua/ns/id/"
+ xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/"
+ xmlns:pdfxid="http://www.npes.org/pdfx/ns/id/"
+ xmlns:prism="http://prismstandard.org/namespaces/basic/3.0/"
+ xmlns:jav="http://www.niso.org/schemas/jav/1.0/"
+ xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+ xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#"
+ xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
+ xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/"
+ xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema#"
+ xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#"
+ xmlns:pdfaType="http://www.aiim.org/pdfa/ns/type#"
+ xmlns:pdfaField="http://www.aiim.org/pdfa/ns/field#">
<pdfaExtension:schemas>
<rdf:Bag>
-\end{alltt}
+\end{Verbatim}
\begin{center}
$\vdots$\par
\emph{[over 200 lines of boilerplate definitions not shown]}\par
$\vdots$\par
\end{center}
-\begin{alltt}
+\begin{Verbatim}[fontsize=\small,commandchars=\\\{\}]
</rdf:Bag>
</pdfaExtension:schemas>
<pdf:Keywords>
\metavalue{energy quanta, Hertz effect, quantum physics}
</pdf:Keywords>
<pdf:Producer>
- \metavalue{pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian)}
+ \metavalue{LuaHBTeX, Version 1.12.0 (TeX Live 2020)}
</pdf:Producer>
<pdf:PDFVersion>\metavalue{1.5}</pdf:PDFVersion>
<xmpRights:Marked>\metavalue{True}</xmpRights:Marked>
@@ -54,34 +57,28 @@
<dc:format>\metavalue{application/pdf}</dc:format>
<dc:title>
<rdf:Alt>
- <rdf:li xml:lang="en">
- \metavalue{On a heuristic viewpoint concerning the production
- and transformation of light}
- </rdf:li>
<rdf:li xml:lang="x-default">
- \metavalue{On a heuristic viewpoint concerning the production
- and transformation of light}
+ \metavalue{On a heuristic viewpoint concerning the production}
+ \metavalue{and transformation of light}
+ </rdf:li>
+ <rdf:li xml:lang="en">
+ \metavalue{On a heuristic viewpoint concerning the production}
+ \metavalue{and transformation of light}
</rdf:li>
<rdf:li xml:lang="de">
- \metavalue{\"Uber einen die Erzeugung und Verwandlung des Lichtes
- betreffenden heuristischen Gesichtspunkt}
+ \metavalue{\"Uber einen die Erzeugung und Verwandlung des Lichtes}
+ \metavalue{betreffenden heuristischen Gesichtspunkt}
</rdf:li>
</rdf:Alt>
</dc:title>
<dc:description>
<rdf:Alt>
<rdf:li xml:lang="en">\metavalue{photoelectric effect}</rdf:li>
- <rdf:li xml:lang="x-default">\metavalue{photoelectric effect}</rdf:li>
</rdf:Alt>
</dc:description>
<dc:rights>
<rdf:Alt>
- <rdf:li xml:lang="en">
- \metavalue{Copyright (C) 1905, Albert Einstein}
- </rdf:li>
- <rdf:li xml:lang="x-default">
- \metavalue{Copyright (C) 1905, Albert Einstein}
- </rdf:li>
+ <rdf:li xml:lang="en">\metavalue{Copyright (C) 1905, Albert Einstein}</rdf:li>
</rdf:Alt>
</dc:rights>
<dc:publisher>
@@ -117,13 +114,14 @@
</rdf:Bag>
</dc:type>
<dc:source>\metavalue{einstein.tex}</dc:source>
+ <dc:identifier>\metavalue{info:lccn/50013519}</dc:identifier>
<photoshop:AuthorsPosition>
\metavalue{Technical Assistant, Level III}
</photoshop:AuthorsPosition>
<photoshop:CaptionWriter>\metavalue{Scott Pakin}</photoshop:CaptionWriter>
- <xmp:CreateDate>\metavalue{2019-03-16T23:07:38-06:00}</xmp:CreateDate>
- <xmp:ModifyDate>\metavalue{2019-03-16T23:07:38-06:00}</xmp:ModifyDate>
- <xmp:MetadataDate>\metavalue{2019-03-16T23:07:38-06:00}</xmp:MetadataDate>
+ <xmp:CreateDate>\metavalue{2020-07-25T21:37:02-06:00}</xmp:CreateDate>
+ <xmp:ModifyDate>\metavalue{2020-07-25T21:37:02-06:00}</xmp:ModifyDate>
+ <xmp:MetadataDate>\metavalue{2020-07-25T21:37:02-06:00}</xmp:MetadataDate>
<xmp:CreatorTool>\metavalue{LaTeX with hyperref package}</xmp:CreatorTool>
<xmpMM:DocumentID>
\metavalue{uuid:6d1ac9ec-4ff2-515a-954b-648eeb4853b0}
@@ -162,10 +160,76 @@
<prism:url>
\metavalue{http://www.physik.uni-augsburg.de/annalen/history/einstein-papers/190517132-148.pdf}
</prism:url>
- <prism:byteCount>\metavalue{59846}</prism:byteCount>
- <prism:pageCount>\metavalue{17}</prism:pageCount>
+ <prism:byteCount>\metavalue{41197}</prism:byteCount>
+ <prism:pageCount>\metavalue{1}</prism:pageCount>
+ <jav:journal_article_version>\metavalue{VoR}</jav:journal_article_version>
+ <xmpTPg:Fonts>
+ <rdf:Bag>
+ <rdf:li rdf:parseType="Resource">
+ <stFnt:fontFace>\metavalue{LMRoman10-Regular}</stFnt:fontFace>
+ <stFnt:fontFamily>\metavalue{LM Roman 10}</stFnt:fontFamily>
+ <stFnt:fontName>\metavalue{LMRoman10-Regular}</stFnt:fontName>
+ <stFnt:versionString>
+ \metavalue{2.004;PS 2.004;hotconv 1.0.49;makeotf.lib2.0.14853}
+ </stFnt:versionString>
+ <stFnt:fontFileName>\metavalue{lmroman10-regular.otf}</stFnt:fontFileName>
+ <stFnt:fontType>\metavalue{opentype}</stFnt:fontType>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stFnt:fontFace>\metavalue{LMRoman17-Regular}</stFnt:fontFace>
+ <stFnt:fontFamily>\metavalue{LM Roman 17}</stFnt:fontFamily>
+ <stFnt:fontName>\metavalue{LMRoman17-Regular}</stFnt:fontName>
+ <stFnt:versionString>
+ \metavalue{2.004;PS 2.004;hotconv 1.0.49;makeotf.lib2.0.14853}
+ </stFnt:versionString>
+ <stFnt:fontFileName>\metavalue{lmroman17-regular.otf}</stFnt:fontFileName>
+ <stFnt:fontType>\metavalue{opentype}</stFnt:fontType>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stFnt:fontFace>\metavalue{LMRoman12-Regular}</stFnt:fontFace>
+ <stFnt:fontFamily>\metavalue{LM Roman 12}</stFnt:fontFamily>
+ <stFnt:fontName>\metavalue{LMRoman12-Regular}</stFnt:fontName>
+ <stFnt:versionString>
+ \metavalue{2.004;PS 2.004;hotconv 1.0.49;makeotf.lib2.0.14853}
+ </stFnt:versionString>
+ <stFnt:fontFileName>\metavalue{lmroman12-regular.otf}</stFnt:fontFileName>
+ <stFnt:fontType>\metavalue{opentype}</stFnt:fontType>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stFnt:fontName>\metavalue{cmr12}</stFnt:fontName>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stFnt:fontName>\metavalue{cmr8}</stFnt:fontName>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stFnt:fontName>\metavalue{cmr6}</stFnt:fontName>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stFnt:fontName>\metavalue{cmmi12}</stFnt:fontName>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stFnt:fontName>\metavalue{cmmi8}</stFnt:fontName>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stFnt:fontName>\metavalue{cmmi6}</stFnt:fontName>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stFnt:fontName>\metavalue{cmsy10}</stFnt:fontName>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stFnt:fontName>\metavalue{cmsy8}</stFnt:fontName>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stFnt:fontName>\metavalue{cmsy6}</stFnt:fontName>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stFnt:fontName>\metavalue{cmex10}</stFnt:fontName>
+ </rdf:li>
+ </rdf:Bag>
+ </xmpTPg:Fonts>
+ <xmpTPg:NPages>\metavalue{1}</xmpTPg:NPages>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>
-\end{alltt}
+\end{Verbatim}
diff --git a/Master/texmf-dist/source/latex/hyperxmp/hyperxmp-stds.tex b/Master/texmf-dist/source/latex/hyperxmp/hyperxmp-stds.tex
new file mode 100644
index 00000000000..e236b8a6b37
--- /dev/null
+++ b/Master/texmf-dist/source/latex/hyperxmp/hyperxmp-stds.tex
@@ -0,0 +1,96 @@
+%%
+%% This is file `hyperxmp-stds.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% hyperxmp.dtx (with options: `doc-helper')
+%%
+%% This is a generated file.
+%%
+%% Copyright (C) 2011-2020 by Scott Pakin <scott+hyxmp@pakin.org>
+%%
+%% This file may be distributed and/or modified under the conditions of
+%% the LaTeX Project Public License, either version 1.3c of this license
+%% or (at your option) any later version. 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/05/04 or later.
+%%
+\let\next=\endinput
+\IfFileExists{FOGRA29L_uncoated.icc}
+ {\let\next=\relax}
+ {}
+\next
+\let\next=\endinput
+\ifPDFTeX
+ \let\next=\relax
+\else
+ \ifLuaTeX
+ \usepackage{luatex85}
+ \let\next=\relax
+ \fi
+\fi
+\next
+\def\wantpdfstandards{}
+\typeout{Generating PDF/A-1b compliant hyperxmp documentation.}
+\AtBeginDocument{%
+ \hypersetup{%
+ pdfapart=1,
+ pdfaconformance=b
+ }%
+}
+\pdfobjcompresslevel=0
+\immediate\pdfobj stream attr {/N 4} file {FOGRA29L_uncoated.icc}
+\edef\iccobj{\the\pdflastobj}
+\pdfcatalog{%
+ /OutputIntents [
+ <<
+ /Type /OutputIntent
+ /S /GTS_PDFA1
+ /DestOutputProfile \iccobj\space 0 R
+ /OutputConditionIdentifier (Uncoated FOGRA29)
+ /Info (FOGRA29L)
+ >>
+ <<
+ /Type /OutputIntent
+ /S /GTS_PDFX
+ /DestOutputProfile \iccobj\space 0 R
+ /OutputConditionIdentifier (Uncoated FOGRA29)
+ /Info (FOGRA29L)
+ >>
+ ]
+}
+\makeatletter
+\AtBeginDocument{%
+ \let\HyColor@HyperrefBorderColor\HyColor@XZeroOneThreeFour
+}
+\makeatother
+\AtBeginDocument{%
+ \hypersetup{%
+ citebordercolor=green,
+ linkbordercolor=red,
+ urlbordercolor=cyan
+ }%
+}
+\makeatletter
+\@tempdima=0.996264\paperwidth
+\edef\boxwd{\strip@pt\@tempdima}
+\@tempdima=0.996264\paperheight
+\edef\boxht{\strip@pt\@tempdima}
+\makeatother
+\edef\next{%
+ \protect\pdfpageattr{
+ /BleedBox [0.0 0.0 \boxwd\space \boxht]
+ /TrimBox [0.0 0.0 \boxwd\space \boxht]
+ /StructParents 0
+ /Tabs /S
+ }%
+}
+\next
+\endinput
+%%
+%% End of file `hyperxmp-stds.tex'.
diff --git a/Master/texmf-dist/source/latex/hyperxmp/hyperxmp.dtx b/Master/texmf-dist/source/latex/hyperxmp/hyperxmp.dtx
index bad62e4b981..4fad6b29d0a 100644
--- a/Master/texmf-dist/source/latex/hyperxmp/hyperxmp.dtx
+++ b/Master/texmf-dist/source/latex/hyperxmp/hyperxmp.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
-% Copyright (C) 2011--2020 by Scott Pakin <scott+hyxmp@pakin.org>
-% ---------------------------------------------------------------
+% Copyright (C) 2011-2020 by Scott Pakin <scott+hyxmp@pakin.org>
+% --------------------------------------------------------------
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -22,7 +22,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{hyperxmp}
%<*package>
- [2020/03/20 v5.0 Store hyperref metadata in XMP format]
+ [2020/11/22 v5.9 Store hyperref metadata in XMP format]
%</package>
%
%<*driver>
@@ -39,11 +39,15 @@
\usepackage{microtype}
\usepackage{needspace}
\usepackage{varioref}
-\usepackage{alltt}
+\usepackage{fancyvrb}
\usepackage{multicol}
\usepackage{makeidx}
\usepackage{mmap}
\usepackage{enumitem}
+\usepackage{listings}
+\usepackage[labelformat=simple]{subcaption}
+\renewcommand\thesubfigure{(\alph{subfigure})}
+\usepackage{array}
\usepackage{booktabs}
\usepackage{marginfix}
\usepackage{ifmtarg}
@@ -81,6 +85,7 @@
pdflang={en-US},
pdftrapped={False},
pdfstartpage={},
+ pdfsource={hyperxmp.dtx},
pdfurl={http://mirror.ctan.org/macros/latex/contrib/hyperxmp/hyperxmp.pdf},
baseurl={http://mirror.ctan.org/macros/latex/contrib/hyperxmp/}
}
@@ -111,7 +116,7 @@
%</driver>
% \fi
%
-% \CheckSum{2342}
+% \CheckSum{2836}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -168,6 +173,28 @@
% standards, as requested by Robin Schwab}
% \changes{v5.0}{2020/02/26}{Added support for \protect\acro{PDF/X}
% standards, as requested by Robin Schwab}
+% \changes{v5.0}{2020/03/17}{Don't set any document dates (creation,
+% modification, or metadata) from \string\optname{pdfdate}}
+% \changes{v5.2}{2020/04/29}{Introduced the \protect\optname{pdfidentifier}
+% package option, which enables an author to specify a unique identifier
+% for the document}
+% \changes{v5.5}{2020/07/23}{Introduced the \protect\optname{pdfpubstatus}
+% package option, which enables an author to specify the document's
+% publication status. Thanks to Robin Schwab for pointing me to the
+% Journal Article Versions recommendation~\protect\cite{NISO2008:jav}}
+% \changes{v5.5}{2020/07/25}{Automatically assign
+% \protect\optname{pdfnumpages} and \protect\optname{pdfbytes} under
+% \protect\pdfLaTeX\ and \protect\LuaLaTeX}
+% \changes{v5.5}{2020/09/23}{Defer \protect\cs{AtEndPreamble} execution
+% until the end of the document. This enables
+% \protect\pkgname{hyperxmp} itself to be loaded from
+% \protect\cs{AtEndPreamble}, as is done by
+% \protect\pkgname{doclicense}~v2.2.0. Thanks to Tommaso Pecorella
+% for the bug report and help testing}
+% \changes{v5.6}{2020/10/05}{Make conditional the loading of the
+% \protect\pkgname{ifdraft} package. Thanks to Tobias Pape for
+% reporting the incompatibility between \protect\pkgname{hyperxmp} and
+% \protect\pkgname{ifdraft}}
%
% ^^A \GetFileInfo{hyperxmp.dtx}
%
@@ -184,7 +211,16 @@
%
% ^^A Define a few logical styles.
% \DeclareRobustCommand{\term}[1]{#1\SortIndex{#1}{#1}}
-% \DeclareRobustCommand{\pkgname}[1]{\mbox{\textsf{#1}}\SortIndex{#1}{\textsf{#1}}}
+% \DeclareRobustCommand{\pkgname}[1]{^^A
+% \mbox{\textsf{#1}}^^A
+% \SortIndex{#1}{\textsf{#1} (package)}^^A
+% \index{packages&#1=\textsf{#1}}^^A
+% }
+% \DeclareRobustCommand{\clsname}[1]{^^A
+% \mbox{\textsf{#1}}^^A
+% \SortIndex{#1}{\textsf{#1} (class)}^^A
+% \index{classes&#1=\textsf{#1}}^^A
+% }
% \makeatletter
% \DeclareRobustCommand{\xmpprop}[2][]{^^A XMP property
% \def\xmppropopt{#1}^^A
@@ -203,7 +239,11 @@
% }
% \makeatother
% \index{XMP=\acrostyle {XMP}&properties|see{properties, \acrostyle{XMP}}}
-% \DeclareRobustCommand{\pdfterm}[1]{\mbox{\textsf{#1}}\SortIndex{#1}{\textsf{#1}}}
+% \DeclareRobustCommand{\pdfterm}[1]{^^A
+% \mbox{\textsf{#1}}^^A
+% \SortIndex{#1}{\textsf{#1}}^^A
+% \index{PDF=\acrostyle{PDF}&#1=\textsf{#1}}^^A
+% }
% \DeclareRobustCommand{\cmdname}[1]{\mbox{\texttt{#1}}\SortIndex{#1}{\texttt{#1}}}
% \DeclareRobustCommand{\optname}[1]{^^A
% \mbox{\textsf{#1}}^^A
@@ -224,6 +264,8 @@
% \newcounter{note}
% \newcommand{\usagenote}[1]{^^A
% \refstepcounter{note}^^A
+% \Needspace{\baselineskip}^^A
+% \belowpdfbookmark{Note \thenote: #1}{note.\thenote}^^A
% \paragraph{Note~\thenote: #1}%
% }
%
@@ -262,9 +304,21 @@
% \DeclareRobustCommand{\Dvips}{^^A
% \texorpdfstring{Dvips\SortIndex{dvips}{\texttt{dvips}}}{Dvips}^^A
% }
+% \DeclareRobustCommand{\progname}[1]{^^A
+% \mbox{\texttt{#1}}\SortIndex{#1}{\texttt{#1}}^^A
+% }
% \DeclareRobustCommand{\Lua}{^^A
% Lua\index{Lua}^^A
% }
+% \DeclareRobustCommand{\Koma}{^^A
+% Koma^^A
+% \SortIndex{Koma}{Koma (class)}^^A
+% \index{classes&Koma}^^A
+% }
+% \DeclareRobustCommand{\ACMclass}{^^A
+% \acro{ACM}^^A
+% \index{classes&ACM=\acrostyle{ACM}}^^A
+% }
%
% ^^A Define an environment just like macro but for Lua functions.
% \makeatletter
@@ -297,6 +351,44 @@
% }
% \makeatother
%
+% ^^A Index schemata.
+% \DeleteShortVerb{\|}
+% \makeatletter
+% \newenvironment{schemadesc}[2][]{^^A
+% \@ifmtarg{#1}{^^A
+% \index{#2 schema|(}^^A
+% \index{schemata&#2|(}^^A
+% \def\closeschemedesc{^^A
+% \index{schemata&#2|)}^^A
+% \index{#2 schema|)}^^A
+% }^^A
+% }{^^A
+% \index{#1 schema=#2 schema|(}^^A
+% \index{schemata&#1=#2|(}^^A
+% \def\closeschemedesc{^^A
+% \index{schemata&#1=#2|)}^^A
+% \index{#1 schema=#2 schema|)}^^A
+% }^^A
+% }^^A
+% }{^^A
+% \closeschemedesc
+% }
+% \newcommand{\schema}[2][]{^^A
+% \@ifmtarg{#1}{^^A
+% \kern0pt^^A
+% \index{#2 schema}^^A
+% \index{schemata&#2}^^A
+% #2^^A
+% }{^^A
+% \kern0pt^^A
+% \index{#1 schema=#2 schema}^^A
+% \index{schemata&#1=#2}^^A
+% #2^^A
+% }^^A
+% }
+% \makeatother
+% \MakeShortVerb{\|}
+%
% ^^A Pack figures a bit tighter onto the page.
% \renewcommand{\floatpagefraction}{0.8}
%
@@ -352,9 +444,9 @@
% \end{verbatim}
%
% In the preceding code, the |dc| namespace refers to the
-% \href{http://purl.org/DC/}{Dublin Core schema}, a collection of
-% metadata properties. The \xmpprop{dc:creator} property surrounds the
-% list of authors. The \textsf{rdf} namespace is the
+% \href{http://purl.org/DC/}{\schema{Dublin Core} schema}, a collection
+% of metadata properties. The \xmpprop{dc:creator} property surrounds
+% the list of authors. The \textsf{rdf} namespace is the
% \href{http://www.w3.org/RDF/}{Resource Description Framework}, which
% defines \xmpterm{rdf:Seq} as an ordered list of values. Each author
% is represented by an individual list item (\xmpterm{rdf:li}), making
@@ -365,7 +457,8 @@
% is intended to make it easy for computer applications to identify and
% categorize the document.
%
-% \paragraph{What metadata does \textsf{hyperxmp} process?}
+% \subsection{Supported metadata}
+%
% \pkgname{hyperxmp} knows how to embed all of the following types of
% metadata within a document:
%
@@ -391,6 +484,7 @@
% \item \acro{ISBN} (\xmpprop{prism:isbn})
% \item \acro{ISSN}---both print (\xmpprop{prism:issn}) and electronic (\xmpprop{prism:eIssn})
% \item issue number of parent publication (\xmpprop{prism:number})
+% \item journal article version (\xmpprop{jav:journal\_article\_version})
% \item keywords (\xmpprop{pdf:Keywords} and \xmpprop{dc:subject})
% \item language used (\xmpprop{dc:language})
% \item license \acro{URL} (\xmpprop{xmpRights:WebStatement})
@@ -413,6 +507,7 @@
% \item trapping of colors (\xmpprop{pdf:trapped})
% \item type of document (\xmpprop{dc:type})
% \item type of parent publication (\xmpprop{prism:aggregationType})
+% \item unique identifier for the document (\xmpprop{dc:identifier})
% \item \acro{URL} of the document (\xmpprop{prism:url})
% \item \acro{URL}(s) of the primary author (\xmpprop[CiUrlWork]{Iptc4xmpCore:CreatorContactInfo})
% \item \acro{UUID} for the document (\xmpprop{xmpMM:DocumentID})
@@ -425,15 +520,16 @@
% \noindent
% More types of metadata may be added in a future release.
%
-% \paragraph{How does \textsf{hyperxmp} compare to the \textsf{xmpincl}
-% package?}
-% The short answer is that \pkgname{xmpincl} is more flexible but
-% \pkgname{hyperxmp} is easier to use. With \pkgname{xmpincl}, the
-% author manually constructs a file of arbitrary \acro{XMP} data and the
-% package merely embeds it within the generated \acro{PDF} file. With
-% \pkgname{hyperxmp}, the author specifies values for various predefined
-% metadata types and the package formats those values as \acro{XMP} and embeds
-% the result within the generated \acro{PDF} file.
+% \subsection{Comparisons with similar packages}
+%
+% \paragraph{\textsf{xmpincl}}
+% In short, \pkgname{xmpincl} is more flexible but \pkgname{hyperxmp} is
+% easier to use. With \pkgname{xmpincl}, the author manually constructs
+% a file of arbitrary \acro{XMP} data and the package merely embeds it
+% within the generated \acro{PDF} file. With \pkgname{hyperxmp}, the
+% author specifies values for various predefined metadata types and the
+% package formats those values as \acro{XMP} and embeds the result
+% within the generated \acro{PDF} file.
%
% \pkgname{xmpincl} can embed \acro{XMP} only when running under \pdfLaTeX\ and
% only when in \acro{PDF}-generating mode. \pkgname{hyperxmp} additionally
@@ -446,6 +542,96 @@
% \pkgname{hyperxmp}, and use \pkgname{xmpincl} to include the modified
% \acro{XMP} code in the \acro{PDF} file.
%
+% \paragraph{\textsf{pdfx}}
+% The main difference between \pkgname{hyperxmp} and \pkgname{pdfx} is
+% that \pkgname{hyperxmp} tries to integrate as seamlessly as possible
+% into an existing document. It leverages \pkgname{hyperref}'s
+% \cs{hypersetup} command and many of \cs{hypersetup}'s options and
+% defines its own options in a compatible manner. In contrast,
+% \pkgname{pdfx} requires the user to create a separate
+% |\jobname.xmpdata| file containing \pkgname{pdfx}-defined commands for
+% each metadata element.
+%
+% \iffalse
+%<*listings>
+% \fi
+\newsavebox{\pdfxbox}
+\begin{lrbox}{\pdfxbox}
+ \begin{lstlisting}[
+ language=tex,
+ columns=fullflexible,
+ linewidth=14pc,
+ frame=single,
+ basicstyle=\footnotesize,
+ showlines,
+ morekeywords={\Title,\Author,\Language,\Keywords,\Publisher,\sep}
+ ]
+
+\Title{Baking through the ages}
+\Author{A. Baker\sep C. Kneader}
+\Language{en-GB}
+\Keywords{cookies\sep muffins\sep cakes}
+\Publisher{Baking International}
+
+ \end{lstlisting}
+\end{lrbox}
+
+\newsavebox{\hyxmpbox}
+\begin{lrbox}{\hyxmpbox}
+ \begin{lstlisting}[
+ language=tex,
+ columns=fullflexible,
+ linewidth=13pc,
+ frame=single,
+ basicstyle=\footnotesize,
+ morekeywords={\hypersetup}
+ ]
+\hypersetup{%
+ pdftitle={Baking through the ages},
+ pdfauthor={A. Baker, C. Kneader},
+ pdflang={en-GB},
+ pdfkeywords={cookies, muffins, cakes},
+ pdfpublisher={Baking International}
+}
+ \end{lstlisting}
+\end{lrbox}
+% \iffalse
+%</listings>
+% \fi
+%
+% Figure~\ref{fig:pdfx-hyxmp} adapts an example appearing in the
+% \pkgname{pdfx} manual to \pkgname{hyperxmp}.
+% \begin{figure}
+% \centering
+% \subcaptionbox{\pkgname{pdfx} (separate \texttt{.xmpdata} file)
+% \label{fig:ph-pdfx}}{%
+% \usebox{\pdfxbox}%
+% }
+% \hfil
+% \subcaptionbox{\pkgname{hyperxmp} (main document)
+% \label{fig:ph-hyxmp}}{%
+% \usebox{\hyxmpbox}}
+% \caption{Comparison of \pkgname{pdfx} and \pkgname{hyperxmp}}
+% \label{fig:pdfx-hyxmp}
+% \end{figure}
+% The two are comparable line-by-line in terms of how one specifies the
+% title, author, document language, keywords, and publisher. However,
+% \pkgname{hyperxmp} implicitly writes a wealth of additional metadata
+% into the \acro{XMP} packet such as the document date, creation date,
+% creator tool, file format, \acro{PDF} version, and unique document and
+% instance IDs. In fact, if a document omits all of the code shown in
+% Figure~\ref{fig:ph-hyxmp}, it will still store the \cs{title} and
+% \cs{author} data in the \acro{XMP} packet.
+%
+% One can therefore summarize the difference between \pkgname{hyperxmp}
+% and \pkgname{pdfx} as follows: \pkgname{pdfx} requires the author to
+% be fully explicit about the document's metadata while
+% \pkgname{hyperxmp} allows some metadata to be specified implicitly,
+% automatically inferring it when possible. In general,
+% \pkgname{hyperxmp} tries to simplify the author's task as much as
+% possible.
+%
+%
% \section{Usage}
%
% \pkgname{hyperxmp} works by postprocessing some of the package options
@@ -499,6 +685,7 @@
% \item \optname{pdfdocumentid}
% \item \optname{pdfdoi}
% \item \optname{pdfeissn}
+% \item \optname{pdfidentifier}
% \item \optname{pdfinstanceid}
% \item \optname{pdfisbn}
% \item \optname{pdfissn}
@@ -510,6 +697,7 @@
% \item \optname{pdfpagerange}
% \item \optname{pdfpublication}
% \item \optname{pdfpublisher}
+% \item \optname{pdfpubstatus}
% \item \optname{pdfpubtype}
% \item \optname{pdfrendition}
% \item \optname{pdfsource}
@@ -585,10 +773,7 @@
% the same as the document language (\pkgname{hyperref}'s
% \moptname{pdflang} option). If neither \optname{pdfmetalang} nor
% \optname{pdflang} is specified, \pkgname{hyperxmp} uses only
-% ``|x-default|'' as the metadata language. Note that ``|x-default|''
-% metadata are always included in addition to the specified metadata
-% language, as the user reading the document may not have specified a
-% language preference.
+% ``\xmpterm{x-default}'' as the metadata language.
%
% \acro{XMP} can include a universally unique identifier (\acro{UUID})
% for each document and for each instance of a given document. By
@@ -632,6 +817,27 @@
% In contrast, \moptname{baseurl} points one level up and is used to
% resolve relative \acro{URL}s.
%
+% \moptname{pdfidentifier} provides an alternative mechanism to uniquely
+% identify a document. Its advantage relative to \optname{pdfisbn},
+% \optname{pdfissn}, \optname{pdfdoi}, etc.\ is its flexibility; any of
+% a wide variety of identification types can be used.\footnote{See, for
+% example,
+% \url{https://www.iana.org/assignments/urn-namespaces/urn-namespaces.xhtml}
+% for the \texttt{urn:} \acro{URI} scheme and
+% \url{http://info-uri.info/registry/} for the \texttt{info:}
+% \acro{URI} scheme.} \optname{pdfidentifier}'s disadvantage is that
+% it allows only a single identifier per document. For example, a
+% document could use |pdfidentifier=urn:iso:std:32000:ed-1:v1:en| to
+% identify itself as version~1 of English-language \acro{ISO} standard
+% 32000-1, but then this same document could not also use
+% \optname{pdfidentifier} to identify itself by \acro{DOI}
+% (|info:doi/|\dots), \acro{ISBN} (|urn:ISSN:|\dots), etc. (It can
+% still use the options described in the previous paragraph, though.) If
+% \optname{pdfidentifier} is not specified explicitly,
+% \pkgname{hyperxmp} will use the first non-empty value out of the
+% \acro{DOI}, electronic \acro{ISSN}, print \acro{ISSN}, and \acro{ISBN}
+% or skip the identifier entirely if all of those are empty.
+%
% Already-published documents can further be identified by the
% publication in which they appear. \moptname{pdfpublication} specifies
% the title of the journal, magazine, or other parent document. The
@@ -649,25 +855,47 @@
% \moptname{pdfpubtype} indicates the type of publication in which the
% document was published. This should be one of the \acro{PRISM}
% aggregation types~\cite{PRISM2012:cont-voc} such as |book|, |journal|,
-% |magazine|, |manual|, |report|, or |whitepaper|. For publications in
-% journals, magazines, and similar periodicals, a document can specify
-% the volume number with \moptname{pdfvolumenum} and the issue number
-% within the volume with \moptname{pdfissuenum}.
+% |magazine|, |manual|, |report|, or |whitepaper|.
+%
+% For publications in journals, magazines, and similar periodicals, a
+% document can specify the volume number with \moptname{pdfvolumenum}
+% and the issue number within the volume with \moptname{pdfissuenum}.
% \moptname{pdfpagerange} indicates the page numbers at which the
% document appears within the publication. The intention is that this
% be a comma-separated list of dash-separated ranges, as in
% |pdfpagerange={1,4-5}|. See Note~\ref{note:page-counting} on
% page~\pageref{note:page-counting} for advice on how to assign
-% \optname{pdfpagerange} semi-automatically. For books,
-% \moptname{pdfbookedition} names the edition of the book. This is
-% specified as text, not a number. As with \optname{pdfpublication}
-% (above), \optname{pdfbookedition} accepts a bracketed language code,
-% as in |pdfbookedition={[en]Second| |edition}|.
-%
-% The number of pages in the published, print version of the document
-% can be expressed with \moptname{pdfnumpages}.
-% Note~\ref{note:page-counting} on page~\pageref{note:page-counting}
-% explains how to automatically assign a value to \optname{pdfnumpages}.
+% \optname{pdfpagerange} semi-automatically. A journal article's
+% publication status can be indicated with \moptname{pdfpubstatus}.
+% This option expects to take one of the values listed in
+% Table~\ref{tbl:jav}. See the \acro{NISO}/\acro{ALPSP} Journal Article
+% Versions recommendation~\cite{NISO2008:jav} for an explanation of each
+% of those values and when to use them.
+%
+% \begin{table}
+% \centering
+% \caption{Valid arguments for \optname{pdfpubstatus}}
+% \label{tbl:jav}
+% \begin{tabular}{@{}>{\ttfamily}ll@{}}
+% \toprule
+% \multicolumn{1}{@{}l}{Value} & Meaning \\
+% \midrule
+% AO & Author's Original \\
+% SMUR & Submitted Manuscript Under Review \\
+% AM & Accepted Manuscript \\
+% P & Proof \\
+% VoR & Version of Record \\
+% CVoR & Corrected Version of Record \\
+% EVoR & Enhanced Version of Record \\
+% \bottomrule
+% \end{tabular}
+% \end{table}
+%
+% For books, \moptname{pdfbookedition} names the edition of the book.
+% This is specified as text, not a number. As with
+% \optname{pdfpublication} (above), \optname{pdfbookedition} accepts a
+% bracketed language code, as in |pdfbookedition={[en]Second|
+% |edition}|.
%
% \acro{XMP} metadata can include a number of dates (in fact,
% timestamps, as they include both date and time components).
@@ -729,43 +957,29 @@
% |\documentclass|, in which case \pkgname{hyperxmp} defaults to
% |draft|.
%
-% The \moptname{pdfbytes} option expresses the document's file size in
-% bytes. The intention is for this to be used to display an estimate of
-% download time to a user or to serve as a quick check on whether a file
-% was transmitted correctly between systems. This feature is easiest to
-% use in conjunction with \pdfTeX's |\pdffilesize| primitive:
-% ``|pdfbytes={\pdffilesize{\jobname.pdf}}|''. Note that this requires
-% a second run of |pdftex| because it queries the size of the \acro{PDF}
-% file from the \emph{previous} run.
-%
% \pkgname{hyperxmp} honors \pkgname{hyperref}'s \moptname{pdftrapped}
% option. A document can indicate whether it employs
% \href{https://en.wikipedia.org/wiki/Trap_(printing)}{color trapping}
% by specifying \optname{pdftrapped}=|True| or
% \optname{pdftrapped}=|False|. (\optname{pdftrapped}=|Unknown| is also
-% allowed.) A current limitation of \pkgname{hyperxmp} is that if a
-% value other than |False| is provided, a document will additionally
-% need to specify \optname{keeppdfinfo}
-% (page~\pageref{page:keeppdfinfo}) to ensure that the \acro{PDF}
-% \pdfterm{Info} dictionary specifies the correct trapping value.
+% allowed.)
%
% \moptname{pdfapart} and \moptname{pdfaconformance}, are used in
% conjunction with \pkgname{hyperref}'s \optname{pdfa} option to claim a
% particular \acro{PDF/A} standard by which the document abides. They
% default to \optname{pdfapart}=|1| and \optname{pdfaconformance}=|B|,
-% indicating the \PDFstd{A}{1}{b}{} standard. These can be
-% changed (with caution) to assert that the document abides by a
-% different standard (e.g.,~\PDFstd{A}{2}{u}{}). A document that
-% conforms to the \acro{PDF/UA} standard can use \moptname{pdfuapart} to
-% indicate the \acro{PDF/UA} conformance level. For example,
-% \optname{pdfuapart}=|1| asserts that the document respects
-% \PDFstd{UA}{1}{}{}. \moptname{pdfxstandard} indicates
-% the particular \acro{PDF/X} standard by which the document abides.
-% Unlike \optname{pdfpart} and \optname{pdfaconformance}, which accept a
-% number and a letter, respectively, \optname{pdfxstandard} expects a
-% textual identification of a standard name. The following are the
-% \acro{PDF/X} standard names that are considered acceptable at the time
-% of this writing.
+% indicating the \PDFstd{A}{1}{b}{} standard. These can be changed
+% (with caution) to assert that the document abides by a different
+% standard (e.g.,~\PDFstd{A}{2}{u}{}). A document that conforms to the
+% \acro{PDF/UA} standard can use \moptname{pdfuapart} to indicate the
+% \acro{PDF/UA} conformance level. For example, \optname{pdfuapart}=|1|
+% asserts that the document respects \PDFstd{UA}{1}{}{}.
+% \moptname{pdfxstandard} indicates the particular \acro{PDF/X} standard
+% by which the document abides. Unlike \optname{pdfapart} and
+% \optname{pdfaconformance}, which accept a number and a letter,
+% respectively, \optname{pdfxstandard} expects a textual identification
+% of a standard name. The following are the acceptable \acro{PDF/X}
+% standard names as of at the time of this writing.
%
% ^^A This list needs to be kept up-to-date with the standards checked
% ^^A by \@pdfxstandard.
@@ -791,16 +1005,30 @@
% \PDFstd{X}{4}{p}{}, \PDFstd{X}{5}{n}{}, and \PDFstd{X}{5}{pg}{}
% standards has not been tested.
%
-% A rarely needed option, \moptname{pdfsource}, overrides the name of
-% the \LaTeX\ source file. It defaults to |\jobname.tex| but can be
-% replaced by any other string. If \optname{pdfsource} is given an
-% empty argument, no document source will be specified at all.
+% \subsubsection*{Rarely needed options}
+%
+% \moptname{pdfsource} overrides the name of the \LaTeX\ source file.
+% It defaults to |\jobname.tex| but can be replaced by any other string.
+% If \optname{pdfsource} is given an empty argument, no document source
+% will be specified at all.
+%
+% The number of pages in the published, print version of the document
+% can be expressed with \moptname{pdfnumpages}. This is computed
+% automatically when the document is built using either \pdfLaTeX\ or
+% \LuaLaTeX\@.
+%
+% The \moptname{pdfbytes} option expresses the document's file size in
+% bytes. The intention is for this to be used to display an estimate of
+% download time to a user or to serve as a quick check on whether a file
+% was transmitted correctly between systems. \optname{pdfbytes} is
+% computed automatically by both \pdfLaTeX\ and \LuaLaTeX, using the
+% file size from the previous build of the document.
%
% \bigskip
%
-% It is usually more convenient to provide values for the preceding
-% options using \pkgname{hyperref}'s |\hypersetup| command than on the
-% |\usepackage| command line. See
+% It is usually more convenient to provide values for all of the options
+% presented in this section using \pkgname{hyperref}'s |\hypersetup|
+% command than on the |\usepackage| command line. See
% \href{http://mirrors.ctan.org/macros/latex/contrib/hyperref/hyperref.pdf}{the
% \pkgname{hyperref} manual} for more information.
%
@@ -856,14 +1084,14 @@
% pdfvolumenum={322},
% pdfissuenum={6},
% pdfpagerange={132-148},
-% pdfnumpages={17},
% pdfissn={0003-3804},
% pdfeissn={1521-3889},
+% pdfpubstatus={VoR},
% pdflang={en},
% pdfmetalang={en},
% pdfurl={http://www.physik.uni-augsburg.de/annalen/history/einstein-papers/1905_17_132-148.pdf},
% pdfdoi={10.1002/andp.19053220607},
-% pdfbytes={\pdffilesize{\jobname.pdf}} % Requires pdflatex
+% pdfidentifier={info:lccn/50013519}
% }
% \XMPLangAlt{de}{pdftitle={Über einen die Erzeugung und Verwandlung des
% Lichtes betreffenden heuristischen Gesichtspunkt}}
@@ -885,9 +1113,9 @@
% \begin{itemize}
% \item \pdfLaTeX
% \item \LuaLaTeX
+% \item \XeLaTeX
% \item \LaTeX~$+$ Dvipdfm
% \item \LaTeX~$+$ \Dvips~$+$ Adobe Acrobat Distiller
-% \item \XeLaTeX
% \end{itemize}
%
% \noindent
@@ -1100,15 +1328,28 @@
% can include \term{Unicode} characters in its \acro{XMP} fields.
%
% \usagenote{Automatically specified metadata}
-% \optname{pdftitle} defaults to the document's title as specified by
-% |\title{|\dots|}|. \optname{pdfauthor} defaults to the document's
-% author(s) as specified by |\author{|\dots|}|. \optname{pdfdate}
-% defaults to the current date and time. \optname{pdfmetalang}
-% defaults to the same value as \optname{pdflang} if non-empty,
-% ``|x-default|'' otherwise. An implication of automatic
-% metadata specification is that an author can simply include
-% |\usepackage{hyperxmp}| in a document's preamble and benefit from
-% a modicum of \acro{XMP} metadata with no additional effort.
+% \pkgname{hyperxmp} attempts to identify certain metadata
+% automatically. The hope is that in many cases, an author can simply
+% include |\usepackage{hyperxmp}| in a document's preamble and benefit
+% from a modicum of \acro{XMP} metadata with no additional effort.
+%
+% Currently, \optname{pdftitle} defaults to the document's title as
+% specified by |\title{|\dots|}|. \optname{pdfauthor} defaults to the
+% document's author(s) as specified by |\author{|\dots|}|.
+% \optname{pdfdate} defaults to the current date and time.
+% \optname{pdfmetalang} defaults to the same value as \optname{pdflang}
+% if non-empty, ``\xmpterm{x-default}'' otherwise. \pkgname{hyperxmp}
+% recognizes some class-specific metadata as well, such as that provided
+% via the \Koma\ letter classes (e.g.,~\clsname{scrlttr2}) and the
+% \ACMclass\ article class (\clsname{acmart}).
+%
+% If a document uses either the \pkgname{babel} or \pkgname{polyglossia}
+% packages it is recommended that it \emph{not} explicitly set
+% \optname{pdflang}. \optname{pdflang} accepts only a single language
+% name while \pkgname{hyperxmp} can automatically query \pkgname{babel}
+% and \pkgname{polyglossia} for a list of all languages used in the
+% document and include this list in an \acro{XMP} \xmpprop{dc:language}
+% element.
%
% \usagenote{Multilingual metadata}
% \label{note:multilingual}
@@ -1183,26 +1424,18 @@
% package in the output file to ensure that any macros used in arguments
% to \pkgname{hyperxmp} options produced the expected output.
%
-% \usagenote{Automatic page counting}
+% \usagenote{Semi-automatic page ranges}
% \label{note:page-counting}
-% Although \optname{pdfnumpages} and \optname{pdfpagerange} are intended
-% to refer to pages in the final, published version of a document, it
-% would be convenient for them to be generated automatically when
-% producing a standalone \acro{PDF} file that is not intended to be
-% incorporated into a book, journal, or other publication (or if it is
-% known that the pages will not be renumbered for publication). One
-% approach is to use the \pkgname{totpages} package to keep track of the
-% number of pages.
-%
-% \begin{verbatim}
-% \hypersetup{%
-% pdfnumpages={\ref*{TotPages}}
-% }
-% \end{verbatim}
-%
-% \pkgname{totpages} can likewise help generate \optname{pdfpagerange}.
-% For documents numbered from~1 to~$n$, a simple
-%
+% Although \optname{pdfpagerange} is intended to refer to pages in the
+% final, published version of a document, it would be convenient for
+% them to be generated automatically when producing a standalone
+% \acro{PDF} file that is not intended to be incorporated into a book,
+% journal, or other publication (or if it is known that the pages will
+% not be renumbered for publication). One approach is to use the
+% \pkgname{totpages} package help generate \optname{pdfpagerange}. For
+% documents numbered from~1 to~$n$, a simple
+%
+% \Needspace{3\baselineskip}
% \begin{verbatim}
% \hypersetup{%
% pdfpagerange={1-\ref*{TotPages}}
@@ -1229,26 +1462,116 @@
%
% I don't know how unnumbered pages (e.g.,~blank pages and the title
% page) are supposed to be handled. I suppose blank pages can be
-% omitted from \optname{pdfpagerange}, and title page can be either
-% omitted or listed as |title|, for example.
+% omitted from \optname{pdfpagerange}, and the title page can be either
+% omitted or listed as \texttt{title}, for example.
%
% It appears that at least with version~2.00 of \pkgname{totpages}, the
% |TotPages| label is not defined until after the |\begin{document}|.
% Consequently, using |TotPages| within a \cs{hypersetup} invocation in
% the document's preamble will produce ``|??|'' as the page count in the
% \acro{XMP} packet. The solution is either to assign
-% \optname{pdfnumpages} and \optname{pdfpagerange} after the
-% |\begin{document}| or to ask \LaTeX\ to do that on your behalf:
+% \optname{pdfpagerange} after the |\begin{document}| or to ask
+% \LaTeX\ to do that on your behalf:
%
% \begin{verbatim}
% \AtBeginDocument{%
% \hypersetup{%
-% pdfnumpages={\ref*{TotPages}},
% pdfpagerange={1-\ref*{TotPages}}
% }%
% }
% \end{verbatim}
%
+% \usagenote{Automatic computation of the PDF byte count}
+% \label{note:auto-byte-count}
+%
+% The \schema[PRISM Basic Metadata]{\protect\acro{PRISM} Basic Metadata}
+% schema~\cite{PRISM2012:basic-meta} defines a \xmpprop{prism:byteCount}
+% property that indicates the \acro{PDF} file size in bytes.
+% \pkgname{hyperxmp} computes this value automatically when the document
+% is built using \LuaLaTeX\ but not when using any other \TeX\ engine.
+% Note that \pkgname{hyperxmp} uses the file size from the
+% \emph{previous} run of \LuaLaTeX\ because the new \acro{PDF} file is
+% not yet complete. Consequently, one extra compilation is needed for
+% the byte count to converge relative to the the number of compilations
+% that would otherwise be required.
+%
+% Starting with \pkgname{hyperxmp}~v5.9, the \pkgname{hyperxmp}
+% distribution includes a Perl\index{Perl} script called
+% \progname{hyperxmp-add-bytecount} that edits a \acro{PDF} file in
+% place, adding or replacing the \xmpprop{prism:byteCount} property with
+% one that specifies the final file size.\footnote{The script was in
+% fact introduced with \progname{hyperxmp}~v5.8 and was then called
+% \texttt{add\_byteCount}.} Run the script as
+% ``\progname{hyperxmp-add-bytecount} \meta{filename.pdf}''.
+%
+% The \progname{latexmk} build tool can be configured to run
+% \progname{hyperxmp-add-bytecount} automatically every time a \acro{PDF} file
+% is generated. Simply add the code shown in Figure~\ref{fig:latexmkrc}
+% to your \progname{latexmk} configuration file. See
+% \href{http://mirrors.ctan.org/support/latexmk/latexmk.pdf}{the
+% \progname{latexmk} manual} for information on configuration-file
+% naming on different operating systems and explanations of the hook
+% functions used in Figure~\ref{fig:latexmkrc}.
+%
+% \changes{v5.8}{2020/11/18}{Distribute an
+% \protect\progname{add\_byteCount} script and document some sample
+% \protect\progname{latexmk} configuration code that invokes it.
+% Thanks to John Collins for providing both of those}
+% \changes{v5.9}{2020/11/22}{At Karl Berry's request, rename
+% \protect\progname{add\_byteCount} to the less generic-sounding
+% \protect\progname{hyperxmp-add-bytecount}}
+%
+% \iffalse
+%<*listings>
+% \fi
+\newsavebox{\latexmkrcbox}
+\begin{lrbox}{\latexmkrcbox}
+ \begin{lstlisting}[
+ language=perl,
+ columns=fullflexible,
+ linewidth=19pc,
+ frame=single,
+ basicstyle=\footnotesize,
+ showstringspaces=false,
+ upquote=true,
+ literate={-}{-}{1}
+ ]
+foreach my $cmd ( "latex", "lualatex", "pdflatex", "xelatex",
+ "dvipdf", "xdvipdfmx", "ps2pdf" ) {
+ ${$cmd} = "internal mycmd ${$cmd}";
+}
+
+sub mycmd {
+ my $retval = system @_;
+ if ( $$Pdest =~ /\.pdf$/ ) {
+ system 'hyperxmp-add-bytecount', $$Pdest;
+ }
+ return $retval;
+}
+ \end{lstlisting}
+\end{lrbox}
+% \iffalse
+%</listings>
+% \fi
+%
+% \begin{figure}
+% \centering
+% \usebox{\latexmkrcbox}
+% \caption{ \progname{latexmk} configuration-file code for
+% automatically invoking \progname{hyperxmp-add-bytecount} every time a
+% \acro{PDF} file is generated}
+% \label{fig:latexmkrc}
+% \end{figure}
+%
+% Even though \pkgname{hyperxmp} can compute the byte count
+% automatically when run from \LuaLaTeX, users of \progname{latexmk}
+% need to use configuration-file code like that shown in
+% Figure~\ref{fig:latexmkrc}. Otherwise, \progname{latexmk} would
+% compile the document one time too few for the byte count to
+% converge. It is recommended that those who use both \progname{latexmk}
+% and \pkgname{hyperxmp} configure \progname{latexmk} to be
+% \pkgname{hyperxmp}-aware.
+%
%
% \StopEventually{^^A
% \section{Help Wanted}
@@ -1277,6 +1600,17 @@
% \input{einstein-xmp}
%
% \begin{thebibliography}{99}
+% \bibitem{NISO2008:jav}
+% Beverley Acreman, Claire Bird, Catherine Jones, Peter McCracken, Cliff Morgan,
+% John Ober, Evan Owens, T.~Scott Plutchak, Bernie Rous, and Andrew Wray.
+% \newblock {J}ournal {A}rticle {V}ersions ({JAV}): Recommendations of the
+% {NISO}/{ALPSP} {JAV} {T}echnical {W}orking {G}roup.
+% \newblock Recommended practice, National Information Standards Organization,
+% Baltimore, Maryland, USA, April 2008.
+% \newblock ISBN~\mbox{978-1-880124-79-6}.
+% \newblock Available from
+% \url{https://www.niso.org/sites/default/files/2017-08/RP-8-2008.pdf}.
+%
% \bibitem{Adobe2010:pdfmark}
% Adobe Systems, Inc., San Jose, California.
% \newblock \emph{{A}dobe {A}crobat~{X} {SDK} Help, pdfmark Reference}.
@@ -1379,6 +1713,28 @@
% \pkgname{hyperxmp}. Read this section only if you want to learn how
% \pkgname{hyperxmp} is implemented.
%
+% \bigskip
+%
+% One thing to bear in mind when reading the \pkgname{hyperxmp} source
+% code is that different actions occur at different times throughout
+% document processing:
+%
+% \begin{enumerate}
+% \item |\usepackage{hyperxmp}|: \pkgname{hyperxmp} parses package
+% options, defines a number of commands, loads various helper
+% packages, and assigns default values to most \acro{XMP} fields.
+%
+% \item |\begin{document}|: \pkgname{hyperxmp} loads certain packages
+% such as \pkgname{hyperref} and \pkgname{ifdraft} and queries
+% natural-language information from \pkgname{babel} and
+% \pkgname{polyglossia} that becomes available only at the end of
+% the preamble.
+%
+% \item |\end{document}|: \pkgname{hyperxmp} finalizes certain data
+% that are known only at the end of the document, such as the page
+% count, and writes the \acro{XMP} packet to the \acro{PDF} file.
+% \end{enumerate}
+%
% \iffalse
%<*package>
% \fi
@@ -1407,21 +1763,87 @@
% Thanks to Heiko Oberdiek for the bug report and suggested modifications.}
%
% \begin{macro}{\hyxmp@at@end}
-% \begin{macro}{\hyxmp@driver}
% The |\hyxmp@at@end| macro includes code at the end of the document.
-% For \pdfTeX, the standard |\AtEndDocument| works well enough. For all
-% the other backends we use |\AtEndDvi| from the \pkgname{atenddvi}
-% package, which is more robust but requires an addition \LaTeX\ run.
-% \begin{macrocode}
-\def\hyxmp@driver{hpdftex}
-\ifx\hyxmp@driver\Hy@driver
- \let\hyxmp@at@end=\AtEndDocument
-\else
+% When available (as is the case in most modern \tex\ backends),
+% \cs{AtEndDocument} works well enough. Otherwise, we invoke
+% \cs{AtEndDvi} from the \pkgname{atenddvi} package, which is robust but
+% requires an addition \LaTeX\ run.
+% \changes{v5.3}{2020/05/29}{Use \protect\cs{AtEndDocument} in all
+% \protect\tex\ back ends that provide it. Thanks to Nelson Posse
+% Lago for pointing out why \protect\pkgname{atenddvi} is best avoided
+% if possible}
+% \begin{macrocode}
+\@ifundefined{AtEndDocument}{%
\RequirePackage{atenddvi}
\let\hyxmp@at@end=\AtEndDvi
-\fi
+}{%
+ \let\hyxmp@at@end=\AtEndDocument
+}
% \end{macrocode}
% \end{macro}
+%
+% \begin{macro}{\hyxmp@set@jobname}
+% Given an expanded \cs{jobname} followed by \cs{relax}, invoke the
+% \cs{hyxmp@set@jobname@dbl} macro if the job name is surrounded by
+% double quotes and the \cs{hyxmp@set@jobname@plain} macro otherwise.
+% \begin{macrocode}
+\def\hyxmp@set@jobname#1\relax{%
+ \@ifnextchar"{\hyxmp@set@jobname@dbl}{\hyxmp@set@jobname@plain}#1\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hyxmp@set@jobname@dbl}
+% \begin{macro}{\hyxmp@jobname}
+% Set \cs{hyxmp@jobname} to to |#1|, discarding the surrounding double
+% quotes.
+% \begin{macrocode}
+\def\hyxmp@set@jobname@dbl"#1"\relax{\xdef\hyxmp@jobname{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\hyxmp@set@jobname@plain}
+% \begin{macro}{\hyxmp@jobname}
+% Set \cs{hyxmp@jobname} to to |#1|.
+% \begin{macrocode}
+\def\hyxmp@set@jobname@plain#1\relax{\xdef\hyxmp@jobname{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Define \cs{hyxmp@jobname} as a sanitized version of \cs{jobname}. The
+% problem with using \cs{jobname} directly is that it surrounds the
+% filename with double quotes if it contains a space character. For
+% example, a source file named \texttt{my-file.tex} results in a
+% \cs{jobname} of ``\texttt{my-file}'', but a source file named
+% \texttt{my file.tex} results in a \cs{jobname} of ``|"my file"|''.
+% Trying to access |"my file".log| (as is done on
+% page~\pageref{page:jobname-log}) will fail because the filename does
+% not in fact contain literal double quotes.
+% \changes{v5.5}{2020/07/28}{Correctly handle source files with spaces
+% in their name. Thanks to Peter Dyballa for the bug report}
+% \begin{macrocode}
+\expandafter\hyxmp@set@jobname\jobname\relax
+% \end{macrocode}
+%
+% \begin{macro}{\hyxmp@aep@toks}
+% In order for \pkgname{hyperxmp} to be loaded safely during
+% \cs{AtEndPreamble} we need to ensure that we perform no
+% \cs{AtEndPreamble} actions until all top-level macro definitions have
+% been made. The most straightforward approach would be to move all of
+% \pkgname{hyperxmp}'s \cs{AtEndPreamble} stanzas to the end of the
+% package. However, this degrades readability of the source code. For
+% instance, an \cs{AtEndPreamble} stanza related to integration with
+% \pkgname{hyperref} could no longer appear in the ``Integration with
+% \pkgname{hyperref}'' section (Section~\ref{sec:hyperref-int}). Hence,
+% we instead store in a token list, \cs{hyxmp@aep@toks}, each
+% \cs{AtEndPreamble} stanza as we encounter it. This token list is
+% evaluated as one of the package's final actions
+% (Section~\ref{sec:clean-up}).
+% \begin{macrocode}
+\newtoks{\hyxmp@aep@toks}
+% \end{macrocode}
% \end{macro}
%
%
@@ -1464,6 +1886,15 @@
\RequirePackage{ifthen}
% \end{macrocode}
%
+% There are a few places where \pkgname{hyperxmp} can take advantage of
+% \LuaTeX\ features. To simplify the use of \LuaTeX\ we load the
+% \pkgname{luacode} package.
+% \begin{macrocode}
+\ifLuaTeX
+ \RequirePackage{luacode}
+\fi
+% \end{macrocode}
+%
% \begin{macro}{\@ifmtargexp}
% \begin{macro}{\@ifnotmtargexp}
% |\@ifmtarg| and |\@ifnotmtarg| do not expand their first argument.
@@ -1476,6 +1907,20 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\@if@def@and@nonempty}
+% This macro combines \cs{@ifundefined} and \cs{@ifmtargexp}. If the
+% macro named |#1| is both defined and non-empty, evaluate~|#2|.
+% Otherwise, evaluate~|#3|.
+% \changes{v5.3}{2020/06/07}{Added this macro}
+% \begin{macrocode}
+\newcommand*{\@if@def@and@nonempty}[3]{%
+ \@ifundefined{#1}{#3}{%
+ \expandafter\@ifmtargexp\expandafter{\csname#1\endcsname}{#3}{#2}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\hyxmp@pdfstringdef}
% \begin{macro}{\hyxmp@textunderscore}
% Because \pkgname{hyperxmp} uses underscores to represent hard spaces,
@@ -1612,9 +2057,10 @@
% \end{macro}
%
% \begin{macro}{\@pdfapart}
-% Prepare to store the \acro{PDF/A} part ID, which defaults to~``1''.
+% Prepare to store the \acro{PDF/A} part ID, which defaults to~``1''
+% if \optname{pdfa} is passed to \pkgname{hyperref}.
% \begin{macrocode}
-\def\@pdfapart{1}
+\def\@pdfapart{}
\define@key{Hyp}{pdfapart}{%
\afterassignment\hyxmp@no@bad@parts\@tempcnta=0#1\relax
\hyxmp@pdfstringdef\@pdfapart{\the\@tempcnta}%
@@ -1623,9 +2069,11 @@
% \end{macro}
%
% \begin{macro}{\@pdfaconformance}
-% Prepare to store the \acro{PDF/A} conformance ID, which defaults to~``B''.
+% Prepare to store the \acro{PDF/A} conformance ID, which defaults to~``b''
+% if \optname{pdfa} is passed to \pkgname{hyperref} and |\@pdfapart| is
+% empty.
% \begin{macrocode}
-\def\@pdfaconformance{B}
+\def\@pdfaconformance{}
\define@key{Hyp}{pdfaconformance}{%
\uppercase{\hyxmp@pdfstringdef\@pdfaconformance{#1}}%
}
@@ -1740,7 +2188,7 @@
% \changes{v3.3}{2017/07/16}{Added this macro and the corresponding
% \protect\optname{pdfsource} option, at Niklas Beisert's request}
% \begin{macrocode}
-\edef\@pdfsource{\jobname.tex}
+\edef\@pdfsource{\hyxmp@jobname.tex}
\define@key{Hyp}{pdfsource}{\hyxmp@pdfstringdef\@pdfsource{#1}}
% \end{macrocode}
% \end{macro}
@@ -1775,9 +2223,33 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\ifdraft}
+% \begin{macro}{\next}
+% Use the \pkgname{ifdraft} package to determine if this is a draft or
+% final document. The challenge here is that we want to use
+% \pkgname{ifdraft} if it's already loaded, load it if not, and not
+% break any incompatible, author-defined \cs{ifdraft} macros that may
+% occur either before or after the |\usepackage{hyperxmp}|. Our
+% solution begins by defining a new group. Then, if \pkgname{ifdraft}
+% is not yet loaded, we locally undefine \cs{ifdraft} and load the
+% package. In this case, we later ``unload'' the package by setting
+% \cs{ver@ifdraft.sty} to \cs{relax}.
+% \changes{v5.2}{2020/04/18}{Define \protect\cs{ifdraft} only locally, at
+% Niklas Beisert's request}
% \begin{macrocode}
-\RequirePackage{ifdraft}
+\begingroup
+ \@ifpackageloaded{ifdraft}{%
+ \let\next=\relax
+ }{%
+ \let\ifdraft=\relax
+ \RequirePackage{ifdraft}%
+ \def\next{%
+ \expandafter\global\expandafter\let\csname ver@ifdraft.sty\endcsname=\relax
+ }%
+ }%
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}{\@pdfrendition}
% \changes{v5.0}{2020/02/27}{Added the \protect\optname{pdfrendition}
@@ -1788,11 +2260,13 @@
% |\documentclass[draft]|, for which |\@pdfrendition| defaults to
% |draft|.
% \begin{macrocode}
-\ifdraft{%
- \def\@pdfrendition{draft}%
-}{%
- \def\@pdfrendition{default}%
-}
+ \ifdraft{%
+ \gdef\@pdfrendition{draft}%
+ }{%
+ \gdef\@pdfrendition{default}%
+ }
+ \next
+\endgroup
\define@key{Hyp}{pdfrendition}{\hyxmp@pdfstringdef\@pdfrendition{#1}}
% \end{macrocode}
% \end{macro}
@@ -1921,6 +2395,14 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@pdfidentifier}
+% Prepare to store an identifier that uniquely represents the document.
+% \begin{macrocode}
+\def\@pdfidentifier{}
+\define@key{Hyp}{pdfidentifier}{\hyxmp@pdfstringdef\@pdfidentifier{#1}}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@pdfsubtitle}
% Prepare to store the document's subtitle.
% \begin{macrocode}
@@ -1929,6 +2411,14 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@pdfpubstatus}
+% Prepare to store the document's journal article version.
+% \begin{macrocode}
+\def\@pdfpubstatus{}
+\define@key{Hyp}{pdfpubstatus}{\hyxmp@pdfstringdef\@pdfpubstatus{#1}}
+% \end{macrocode}
+% \end{macro}
+%
% The following eight macros---|\@pdfcontactaddress|,
% |\@pdfcontactcity|, |\@pdfcontactregion|, |\@pdfcontactpostcode|,
% |\@pdfcontactcountry|, |\@pdfcontactphone|, |\@pdfcontactemail|, and
@@ -2133,6 +2623,7 @@
}{}%
}%
% \end{macrocode}
+% \Needspace{6\baselineskip}
% \begin{macro}{\KV@Hyp@pdfauthor}
% \begin{macro}{\xmpcomma}
% \begin{macro}{\xmpquote}
@@ -2258,7 +2749,33 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\hyxmp@find@metadata}
+% \begin{macro}{\hyxmp@concated@metadata}
+% \begin{macro}{\hyxmp@aep@toks}
+% Assume that if the document loaded either \pkgname{babel} or
+% \pkgname{polyglossia} it will eventually define one or more languages
+% that \pkgname{hyperxmp} can list within a \xmpprop{dc:language}
+% element. As explained in Section~\ref{sec:initial-prep}, we defer the
+% invocation of \cs{AtEndPreamble} to the end of the file.
+% \begin{macrocode}
+\edef\hyxmp@concated@metadata{}
+\expandafter\hyxmp@aep@toks\expandafter=\expandafter{%
+ \the\hyxmp@aep@toks
+ \AtEndPreamble{%
+ \@ifpackageloaded{babel}{%
+ \edef\hyxmp@concated@metadata{babel}%
+ }{%
+ \@ifpackageloaded{polyglossia}{%
+ \edef\hyxmp@concated@metadata{polyglossia}%
+ }{%
+ }%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\hyxmp@warn@if@no@metadata}
% \begin{macro}{\hyxmp@concated@metadata}
% Issue a warning message if the author failed to specify any metadata
% at all. This excludes metadata that is included automatically such as
@@ -2267,8 +2784,9 @@
% with other information. We also don't examine |\@pdfapart| or
% |\@pdfaconformance| because those have nonempty default values.
% \begin{macrocode}
-\newcommand*{\hyxmp@find@metadata}{%
+\newcommand*{\hyxmp@warn@if@no@metadata}{%
\edef\hyxmp@concated@metadata{%
+ \hyxmp@concated@metadata
\@baseurl
\@pdfauthor
\@pdfauthortitle
@@ -2288,6 +2806,7 @@
\@pdfdatetime
\@pdfdoi
\@pdfeissn
+ \@pdfidentifier
\@pdfisbn
\@pdfissn
\@pdfissuenum
@@ -2310,7 +2829,7 @@
}%
\ifx\hyxmp@concated@metadata\@empty
\PackageWarningNoLine{hyperxmp}{%
- \jobname.tex did not specify any metadata to\MessageBreak
+ \hyxmp@jobname.tex did not specify any metadata to\MessageBreak
include in the XMP packet.\space\space Please see the\MessageBreak
hyperxmp documentation for instructions on how to\MessageBreak
provide metadata values to hyperxmp}%
@@ -2328,12 +2847,29 @@
% \begin{macrocode}
\newcommand*{\hyxmp@check@standards}{%
% \end{macrocode}
+% If the \optname{pdfa} option was passed to \pkgname{hyperref} but
+% |\@pdfapart| is not set, set it to~|1| and |\@pdfaconformance| to~|B|.
+% \begin{macrocode}
+ \ifHy@pdfa
+ \@ifmtargexp{\@pdfapart}{%
+ \PackageWarningNoLine{hyperxmp}{%
+ `pdfa' was passed to hyperref, but `pdfapart' was\MessageBreak
+ not specified.\space\space Setting pdfapart to `1' and\MessageBreak
+ pdfaconformance to `B'%
+ }%
+ \gdef\@pdfapart{1}%
+ \gdef\@pdfaconformance{B}%
+ }%
+ {}%
+ \fi
+% \end{macrocode}
+%
% \begin{macro}{\hyxmp@standards}
% We define |\hyxmp@standards| to be non-empty if \emph{any} \acro{PDF}
% standard is claimed (currently, \acro{PDF/A}, \acro{PDF/X}, or
% \acro{PDF/UA}.
% \begin{macrocode}
- \def\hyxmp@standards{%
+ \edef\hyxmp@standards{%
\@pdfapart
\@pdfxstandard
\@pdfuapart
@@ -2343,47 +2879,89 @@
% \begin{macrocode}
\@ifnotmtargexp{\hyxmp@standards}{%
\@ifmtargexp{\@pdftitle}{%
- \PackageWarning{hyperxmp}{%
+ \PackageWarningNoLine{hyperxmp}{%
Missing pdftitle (required for PDF standards\MessageBreak
compliance)%
}%
}%
+ {}%
}%
}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% Rather than load \pkgname{hyperref} ourself we let the author do it
-% then verify he actually did. This approach gives the author the
-% flexibility to load \pkgname{hyperxmp} and \pkgname{hyperref} in
-% either order and to call |\hypersetup| anywhere in the document's
-% preamble, not just before \pkgname{hyperxmp} is loaded.
+% \begin{macro}{\hyxmp@aep@toks}
+% Right before we reach the |\begin{document}| we check if
+% \pkgname{hyperref} was loaded. In normal usage, the document will
+% already have done a |\usepackage{hyperref}| because otherwise,
+% \cs{hypersetup} will not have been defined, and only a limited amount
+% of metadata will be included. However, in case the author is relying
+% exclusively on \pkgname{hyperxmp}'s automatically detected metadata,
+% we'll need to load \pkgname{hyperref} now. As explained in
+% Section~\ref{sec:initial-prep}, we defer the invocation of
+% \cs{AtEndPreamble} to the end of the file.
+% \changes{v5.5}{2020/06/24}{Load \protect\pkgname{hyperref} automatically
+% if the document does not do so explicitly, as requested by Robin Schwab}
% \begin{macrocode}
-\AtBeginDocument{%
- \@ifpackageloaded{hyperref}{%
+\expandafter\hyxmp@aep@toks\expandafter=\expandafter{%
+ \the\hyxmp@aep@toks
+ \AtEndPreamble{%
+ \RequirePackage{hyperref}%
% \end{macrocode}
-% In older versions of \pkgname{hyperref}, |\@pdflang| is set to
-% |\@empty| if \optname{pdflang} is not specified. In newer versions of
-% \pkgname{hyperref}, |\@pdflang| is set to |\relax| if
-% \optname{pdflang} is not specified. The latter is a bit problematic
-% for \pkgname{hyperxmp} because it makes |\@pdflang| non-expandable,
-% which causes a literal ``|\@pdflang|'' to be written as \acro{XMP}
-% metadata. To avoid that situation we redefine |\@pdflang| as
-% |\@empty| if we see it set to |\relax|.
-% \changes{v2.3a}{2013/04/16}{Bug fix: Redefine \cs{@pdflang} as
-% \cs{@empty} when \protect\pkgname{hyperref} has set
-% it to \cs{relax}}
+% Older versions of \pkgname{hyperref} write the \pdfterm{Info}
+% dictionary to the \acro{PDF} file at the end of the document. Newer
+% versions of \pkgname{hyperref} write the \pdfterm{Info} dictionary to
+% the \acro{PDF} file at the \emph{beginning} of the document. For
+% compatibility with both old and new \pkgname{hyperref} implementations
+% we suppress writing the \pdfterm{Info} dictionary here, at the
+% beginning of the document.
+% \changes{v4.1}{2019/04/02}{Invoke
+% \protect\cs{hyxmp@no@info@lists} at the beginning of the
+% document, for compatibility with both newer and older versions of
+% \protect\pkgname{hyperref}}
% \begin{macrocode}
- \ifx\@pdflang\relax
- \let\@pdflang=\@empty
- \fi
+ \hyxmp@no@info@lists
+% \end{macrocode}
+% If \optname{pdftitle} is undefined but the author invoked \cs{title},
+% we copy the latter to the former. This addresses two problems:
+% (1)~handling \LaTeX\ classes in which \cs{maketitle} clears \cs{title}
+% and (2)~ensuring that \pkgname{hyperref} writes the same title to the
+% \acro{PDF} \pdfterm{Info} dictionary that \pkgname{hyperxmp} writes to
+% the \acro{XMP} packet. We do likewise for \cs{author}~$\rightarrow$
+% \optname{pdfauthor}.
+%
+% One tricky bit is that the standard \LaTeX\ classes do not define
+% \cs{@title} and \cs{@author} as empty strings but rather as calls to
+% \cs{@latex@warning@no@line} that complain about a missing
+% title/author. Hence, we can't simply test if the title and author are
+% empty because they're not. Instead, we first locally redefine
+% \cs{@latex@warning@no@line} to discard its argument then test if any
+% text remains.
+% \changes{v5.5}{2020/07/24}{Copy \protect\cs{title} to
+% \protect\optname{pdftitle} and \protect\cs{author} to
+% \protect\optname{pdfauthor} at the start of the document to improve
+% consistency between \protect\acro{XMP} and \protect\acro{PDF} metadata}
+% \begin{macrocode}
+ \begingroup
+ \let\@latex@warning@no@line=\@gobble
+ \hyxmp@use@first@valid{pdftitle}{\@pdftitle}{%
+ \scr@subject@var,%
+ \@title
+ }%
+ \hyxmp@use@first@valid{pdfauthor}{\@pdfauthor}{%
+ \scr@fromname@var,%
+ \@author
+ }%
+ \endgroup
+ }%
+}
% \end{macrocode}
-% If the author explicitly specified the language to use for the
-% document's metadata, we use that. If not, we use the document
-% language, specified to \pkgname{hyperref} with the \protect\optname{pdflang}
-% option. If the author did not specify a language, we use |x-default|
-% as the metadata language.
+% \end{macro}
+%
+% When we reach the |\end{document}| we need to gather up the metadata
+% specified explicitly by the user, infer additional metadata where
+% possible, and write the \acro{XMP} packet to the \acro{PDF} file.
% \changes{v1.3}{2011/04/25}{Introduced the \protect\optname{pdfmetalang}
% package option, which enables an author to specify the language in which he
% wrote the document's metadata}
@@ -2391,40 +2969,194 @@
% Oberdiek to properly encode \cs{@pdfmetalang}}
% \changes{v3.3}{2017/07/21}{Don't overwrite an existing
% \protect\optname{pdfmetalang} with \protect\optname{pdflang} or
-% \protect\texttt{x-default}. This addresses a bug report by Niklas
+% \protect\xmpterm{x-default}. This addresses a bug report by Niklas
% Beisert}
+% \changes{v5.4}{2020/06/18}{Moved the automatic assignment of
+% \protect\cs{@pdflang} and \protect\cs{@pdfmetalang} from
+% \protect\cs{hyxmp@auto@assign@data} to within a call to
+% \protect\cs{hyxmp@at@end}}
+% \changes{v5.5}{2020/07/21}{Move most of the \protect\cs{AtEndPreamble}
+% code to \protect\cs{hyxmp@at@end}}
% \begin{macrocode}
- \ifx\@pdfmetalang\@empty
- \ifx\@pdflang\@empty
- \let\@pdfmetalang=\hyxmp@x@default
- \else
- \edef\@pdfmetalang{\@pdflang}%
- \fi
+\hyxmp@at@end{%
+% \end{macrocode}
+% Fill in any missing metadata we can using values provided by the author
+% via mechanisms other than the \cs{hypersetup} command.
+% \begin{macrocode}
+ \hyxmp@auto@assign@data
+% \end{macrocode}
+% If the document claims to comply with one or more \acro{PDF}
+% standards, check that all of the requisite metadata are present.
+% \begin{macrocode}
+ \hyxmp@check@standards
+% \end{macrocode}
+% We can finally construct the \acro{XMP} packet and write it to the
+% \acro{PDF} document catalog.
+% \begin{macrocode}
+ \hyxmp@warn@if@no@metadata
+ \hyxmp@embed@packet
+}
+% \end{macrocode}
+%
+%
+% \subsection{Advanced metadata detection}
+%
+% \pkgname{hyperxmp} strives to be as convenient and user-friendly as
+% possible. To that end, we try to automatically detect as much
+% metadata as possible. The author can of course augment or override
+% autodetected metadata by explicitly providing values to
+% \cs{hypersetup}, but the hope is that we can save the author some
+% effort in many cases.
+%
+% In this section, we identify additional metadata we can use. Most of
+% the functionality is class- or package-specific. For example, we
+% check for phone numbers provided to the \Koma\ letter classes via
+% |\setkomavar{fromphone}{|\dots|}| and/or
+% |\setkomavar{frommobilephone}{|\dots|}|, street addresses provided to
+% the \ACMclass\ article class via \cs{affiliation}, and languages
+% the \pkgname{polyglossia} package is instructed to load via
+% \cs{setdefaultlanguage} and \cs{setotherlanguage}.
+%
+% \begin{macro}{\hyxmp@set@koma@phones}
+% \changes{v5.3}{2020/06/07}{Added this macro}
+% \changes{v5.5}{2020/07/08}{Support hyperlinks and other markup in
+% \protect\texttt{frommobilephone} and \protect\texttt{fromphone},
+% as requested by Robin Schwab}
+% \begin{macro}{\hyxmp@koma@phones}
+% Define \cs{hyxmp@koma@phones} as a comma-separated list of the phone
+% numbers provided to a \Koma\ letter class (mobile and landline).
+% \begin{macrocode}
+\newcommand*{\hyxmp@set@koma@phones}{%
+ \begingroup
+ \Hy@unicodefalse
+ \@if@def@and@nonempty{scr@frommobilephone@var}{%
+ \@if@def@and@nonempty{scr@fromphone@var}{%
+ \hyxmp@pdfstringdef\hyxmp@koma@phones{\scr@frommobilephone@var,\scr@fromphone@var}%
+ }{%
+ \hyxmp@pdfstringdef\hyxmp@koma@phones{\scr@frommobilephone@var}%
+ }%
+ }{%
+ \@if@def@and@nonempty{scr@fromphone@var}{%
+ \hyxmp@pdfstringdef\hyxmp@koma@phones{\scr@fromphone@var}%
+ }{%
+ }%
+ }%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\hyxmp@use@first@valid}
+% Given a \pkgname{hyperxmp} option~(|#1|), its current value~(|#2|),
+% and a comma-separated list of option names~(|#3|), if the current
+% value is empy, invoke \cs{hypersetup} to set the option to the first
+% non-empty item in the list. If all items in the list are empty, do
+% nothing.
+% \changes{v5.3}{2020/05/29}{Added this macro}
+% \begin{macrocode}
+\newcommand*{\hyxmp@use@first@valid}[3]{%
+ \@ifmtargexp{#2}{%
+ \hyxmp@use@first@valid@i{#1}#3,!,%
+ }%
+ {}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hyxmp@use@first@valid@i}
+% This macro performs all the work for \cs{hyxmp@use@first@valid}. It
+% loops over a comma-separated list of macros~(|#2|), stopping when it
+% encounters an end-of-list marker~(``|!|''). The first list element
+% that is neither undefined nor empty is assigned to a given option
+% name~(|#1|) using \cs{hypersetup}.
+% \begin{macrocode}
+\def\hyxmp@use@first@valid@i#1#2,{%
+ \def\next{\hyxmp@use@first@valid@i{#1}}%
+ \ifx#2!%
+ \let\next=\relax
+ \else
+ \ifx#2\undefined
+ \else
+ \@ifnotmtargexp{#2}{%
+ \hypersetup{#1={#2}}%
+ \def\next##1!,{}%
+ }%
\fi
- \hyxmp@xmlify\@pdfmetalang
+ \fi
+ \next
+}
% \end{macrocode}
-% \changes{v5.0}{2020/03/17}{Don't set any document dates (creation,
-% modification, or metadata) from \string\optname{pdfdate}}
-% If the author left \optname{pdftitle} blank but specified |\title|,
-% use the title for \optname{pdftitle}. Likewise, if the author left
-% \optname{pdfauthor} blank but specified |\author|, use the author for
-% \optname{pdfauthor}.
+% \end{macro}
+%
+% \begin{macro}{\hyxmp@auto@assign@data}
+% If certain metadata are unspecified, try to specify meaningful values
+% using data provided by author via other means (e.g.,~\cs{title} for
+% the document's title).
+% \begin{macrocode}
+\newcommand*{\hyxmp@auto@assign@data}{%
+% \end{macrocode}
+% If \cs{@pdflang} is not set, see if we can detect the document
+% language via either the \pkgname{babel} or \pkgname{polyglossia}
+% packages.
+% \begin{macrocode}
+ \@if@def@and@nonempty{@pdflang}{%
+ \let\hyxmp@dc@lang=\@pdflang
+ }{%
+ \hyxmp@detect@langs
+ }%
+% \end{macrocode}
+% Replace an empty \cs{@pdfmetalang}. If \cs{@pdflang} is defined, use
+% that as the metadata language. Otherwise, use \xmpterm{x-default}.
+% \begin{macrocode}
+ \ifx\@pdfmetalang\@empty
+ \ifx\@pdflang\@empty
+ \let\@pdfmetalang=\hyxmp@x@default
+ \else
+ \edef\@pdfmetalang{\@pdflang}%
+ \fi
+ \fi
+% \end{macrocode}
+% Identify various author-provided information that can be co-opted
+% for use as \acro{XMP} metadata.
% \changes{v2.7}{2016/02/01}{Automatically use \cs{title} and \cs{author}
% if \protect\optname{pdftitle} and \protect\optname{pdfauthor} are left
% unspecified. Thanks to Maciej Radziejewski for the suggestion}
+% \changes{v5.3}{2020/05/29}{Consider other author-provided sources of
+% metadata. Thanks to Robin Schwab for proposing that
+% \protect\pkgname{hyperxmp} use the \Koma\ letter classes's metadata}
+% \changes{v5.5}{2020/07/24}{Moved the language-detection and
+% \protect\XeTeX\ date-detection code here from the
+% \protect\cs{hyxmp@at@end} block}
+% \changes{v5.5}{2020/07/24}{Use \protect\LuaTeX\ mechanisms, when available,
+% to automatically compute the page count}
+% \changes{v5.5}{2020/07/24}{Moved title and author autodetection to the
+% \protect\cs{AtEndPreamble}}
+% \begin{macrocode}
+ \hyxmp@use@first@valid{pdfcontactemail}{\@pdfcontactemail}{%
+ \scr@fromemail@var
+ }%
+ \hyxmp@set@koma@phones
+ \hyxmp@use@first@valid{pdfcontactphone}{\@pdfcontactphone}{%
+ \hyxmp@koma@phones
+ }%
+ \hyxmp@use@first@valid{pdfcontacturl}{\@pdfcontacturl}{%
+ \scr@fromurl@var
+ }%
+ \hyxmp@use@first@valid{pdfsubtitle}{\@pdfsubtitle}{%
+ \@subtitle
+ }%
+ \hyxmp@use@first@valid{pdfpublisher}{\@pdfpublisher}{%
+ \@publishers
+ }%
+% \end{macrocode}
+% We handle the \clsname{acmart} class specially. \clsname{acmart}
+% stores author-provided contact information in a structured format that
+% we can process fairly easily. Note that if the author is not using
+% the \clsname{acmart} class, \cs{hyxmp@parse@acmart} will have been
+% redefined to do nothing.
% \begin{macrocode}
- \@ifmtargexp{\@pdftitle}{%
- \@ifnotmtargexp{\@title}{%
- \hypersetup{pdftitle={\@title}}%
- }%
- }%
- {}%
- \@ifmtargexp{\@pdfauthor}{%
- \@ifnotmtargexp{\@author}{%
- \hypersetup{pdfauthor={\@author}}%
- }%
- }%
- {}%
+ \hyxmp@parse@acmart
% \end{macrocode}
% Most \acro{PDF} standards dictate that if the same metadata appear in
% both the \acro{XMP} packet and the \acro{PDF} \pdfterm{Info}
@@ -2437,51 +3169,505 @@
% after \pkgname{hyperxmp} has constructed an \xmpprop{xmp:CreateDate}
% for the \acro{XMP} metadata and leading to a metadata mismatch.
% \begin{macrocode}
- \@ifundefined{XeTeXversion}{}{%
- \@ifmtargexp{\@pdfcreationdate}{%
- \let\@pdfcreationdate=\hyxmp@today@pdf
+ \@ifundefined{XeTeXversion}{}{%
+ \@ifmtargexp{\@pdfcreationdate}{%
+ \let\@pdfcreationdate=\hyxmp@today@pdf
+ }%
+ {}%
+ }%
+% \end{macrocode}
+% Query the document currently being built for page and byte counts.
+% \begin{macrocode}
+ \hyxmp@query@self
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \pkgname{hyperxmp} can directly query the page count using
+% \LuaTeX\ features. When any other \TeX\ engine is used,
+% \pkgname{hyperxmp} employs the \pkgname{totpages} package to help
+% tally the total number of pages.
+% \begin{macrocode}
+\ifLuaTeX
+\else
+ \RequirePackage{totpages}
+\fi
+% \end{macrocode}
+%
+% Determine the size of the output file from the \emph{previous} run of
+% \LuaLaTeX\@. This action has to be performed before the
+% |\begin{document}| because at that point the size of the output file
+% is reset to zero. We use |\jobname.pdf| as the name of the output
+% file because |status.output_file_name| is not defined at this point.
+%
+% It's possible to use \pdfLaTeX's \cs{pdffilesize} primitive to query
+% the size of |\jobname.pdf| under \pdfLaTeX\@. Unfortunately, doing so
+% has a side effect of making \progname{latexmk} view the
+% \acro{PDF} file as an input file, which puts \progname{latexmk} in an
+% infinite build loop. (This was the case for \pkgname{hyperxmp} v5.5
+% and v5.6.) See the discussion at
+% \url{https://github.com/borisveytsman/acmart/issues/413} for more
+% information.
+% \changes{v5.7}{2020/11/01}{Do not automatically compute the
+% \protect\acro{PDF} file size under \protect\pdfLaTeX\ because this confuses
+% \protect\progname{latexmk}. Thanks to John Collins, Nelson Posse Lago,
+% Derek Dreyer, and the other contributors to
+% \protect\href{https://github.com/borisveytsman/acmart/issues/413}{\protect\pkgname{acmart} issue \#413},
+% ``Latexmk goes into an infinite loop even on sample files from ACM''}
+% \changes{v5.8}{2020/11/05}{Take
+% \protect\mbox{\protect\texttt{-\kern0pt-output-directory}} into
+% consideration when querying the output file size. Thanks to John
+% Collins for pointing out that the user can change the output
+% directory}
+% \begin{macrocode}
+\ifLuaTeX
+% \end{macrocode}
+% Now that we know we're running \LuaLaTeX\ we define a Lua function,
+% |get_pdf_size|, that takes the base name of the output file and
+% returns the number of bytes in the corresponding \acro{PDF} file. One
+% difficulty is that, at the time of this writing, \LuaTeX\ lacks a
+% mechanism for querying the full name of the output file. Our
+% workaround is a tad kludgy but seems to work. We walk the list of
+% command-line arguments for
+% \mbox{``|-\kern0pt-output-directory=|\meta{dir}''}. (We in fact
+% accept either one or two initial dashes and abbreviations as terse as
+% \mbox{``|-output-d|''}.) Then, we concatenate the output directory
+% (or ``|.|'' if unspecified), a path separator, the given base name of
+% the job, and a ``|.pdf|'' extension. Alas, different operating
+% systems use different path separators so we have to query the
+% operating-system type to select an appropriate separator: ``|\|'' on
+% Windows/\acro{DOS} and ``|/|'' on everything else.
+%
+% |get_pdf_size| is called regardless of whether we're producing
+% \acro{PDF} or \acro{DVI} output. We assume that even if the user
+% specified |--output-format=dvi|, the user's intention is eventually to
+% convert the document to \acro{PDF}.
+% \begin{macrocode}
+ \begin{luacode*}
+function get_pdf_size (bname)
+% \end{macrocode}
+% Search the list of command-line arguments for the output directory.
+% \begin{macrocode}
+ local odir = ""
+ for _, opt in ipairs(arg) do
+ local m = string.match(opt, "%-output%-d.-=(.*)")
+ if m then
+ odir = m
+ end
+ end
+% \end{macrocode}
+% Set the path separator to either ``|/|'' or ``|\|'', depending on the
+% operating system.
+% \begin{macrocode}
+ local sep = "/"
+ if os.type == "windows" or os.type == "msdos" then
+ sep = "\\\\"
+ end
+% \end{macrocode}
+% Concatenate the output directory, path separator, base name, and
+% \texttt{.pdf} extension. Do not insert a path separator if either
+% (1)~no output directory was specified, (2)~the output directory
+% already ends with the path separator, or (3)~the output directory ends
+% in a colon (and is therefore a relative directory) on
+% Windows/\acro{DOS}. As a few examples,
+%
+% \bigskip
+% \noindent
+% \begingroup
+% \let\bs=\textbackslash
+% \begin{tabular}{@{\quad\textbullet~}l@{~+~}l@{~+~}l@{~+~``\texttt{.pdf}''~=~}l@{}}
+% ``'' & ``\texttt{/}'' & ``\texttt{myfile}''
+% & ``\texttt{myfile.pdf}'' \\
+% ``\texttt{/docs}'' & ``\texttt{/}'' & ``\texttt{myfile}''
+% & ``\texttt{/docs/myfile.pdf}'' \\
+% ``\texttt{/docs/}'' & ``\texttt{/}'' & ``\texttt{myfile}''
+% & ``\texttt{/docs/myfile.pdf}'' \\
+% ``\texttt{C:\bs docs}'' & ``\texttt{\bs}'' & ``\texttt{myfile}''
+% & ``\texttt{C:\bs docs\bs myfile.pdf}'' \\
+% ``\texttt{C:\bs docs\bs}'' & ``\texttt{\bs}'' & ``\texttt{myfile}''
+% & ``\texttt{C:\bs docs\bs myfile.pdf}'' \\
+% ``\texttt{C:\bs}'' & ``\texttt{\bs}'' & ``\texttt{myfile}''
+% & ``\texttt{C:\bs myfile.pdf}'' \\
+% ``\texttt{C:}'' & ``\texttt{\bs}'' & ``\texttt{myfile}''
+% & ``\texttt{C:myfile.pdf}'' \\
+% \end{tabular}
+% \endgroup
+% \bigskip
+% \begin{macrocode}
+ local dlast = string.sub(odir, -1)
+ if odir == "" or dlast == sep or (dlast == ":" and sep == "\\\\") then
+ sep = ""
+ end
+ local fname = odir .. sep .. bname .. ".pdf"
+% \end{macrocode}
+% Query the file size and return it.
+% \begin{macrocode}
+ local nbytes = lfs.attributes(fname, "size")
+ return nbytes
+end
+ \end{luacode*}
+% \end{macrocode}
+% Now that we've defined |get_pdf_size| we invoke it, passing it
+% \cs{hyxmp@jobname} as the base name of the job. (Recall that
+% \cs{hyxmp@jobname} is the same as \cs{jobname} but with any
+% surrounding double quotes removed.) We store |get_pdf_size|'s
+% output---which will be empty if the \acro{PDF} file doesn't yet
+% exist---in \cs{hyxmp@prev@pdf@size}.
+% \begin{macrocode}
+ \xdef\hyxmp@prev@pdf@size{%
+ \luadirect{
+nbytes = get_pdf_size("\hyxmp@jobname")
+if nbytes then
+ tex.write(nbytes)
+end
+ }%
+ }%
+\fi
+% \end{macrocode}
+%
+% \begin{macro}{\hyxmp@query@self}
+% Query the document currently being built to acquire page and byte counts.
+% \changes{v5.5}{2020/07/25}{Added this macro}
+% \begin{macrocode}
+\newcommand*{\hyxmp@query@self}{%
+% \end{macrocode}
+% \LuaTeX\ exposes via \texttt{status.total\_pages} the number of pages
+% written. We use this mechanism when available to assign
+% \cs{@pdfnumpages}. To finalize the page count we first issue a
+% \cs{clearpage}.
+% \begin{macrocode}
+ \ifLuaTeX
+ \@if@def@and@nonempty{@pdfnumpages}{%
+ }{%
+ \clearpage
+ \xdef\@pdfnumpages{\luadirect{tex.print(status.total_pages)}}%
+ }%
+ \else
+% \end{macrocode}
+% Without \LuaTeX\ we rely on the \pkgname{totpages} package to help
+% count the number of pages. This may require an additional run of
+% \LaTeX, but the user will be notified in that case.
+% \begin{macrocode}
+ \pdfstringdef\@pdfnumpages{\ref*{TotPages}}%
+ \fi
+% \end{macrocode}
+% If \optname{pdfbytes} hasn't been set, set it to the output file's size
+% from the previous run.
+% \begin{macrocode}
+ \hyxmp@use@first@valid{pdfbytes}{\@pdfbytes}{%
+ \hyxmp@prev@pdf@size
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hyxmp@parse@acmart}
+% The \clsname{acmart} class stores a rich set of author metadata in its
+% \cs{addresses} macro. \cs{hyxmp@parse@acmart} extracts the contact
+% information for the first author and converts that to \acro{XMP}
+% metadata.
+% \changes{v5.3}{2020/05/30}{Added this macro}
+% \begin{macrocode}
+\newcommand*{\hyxmp@parse@acmart}{%
+ \begingroup
+% \end{macrocode}
+% \begin{macro}{\@author}
+% \clsname{acmart} has already invoked
+% |\hypersetup{pdfauthor=|\dots|}| to specify the complete list of
+% authors. At this point, |\@author| is defined to produce a warning
+% message. We locally redefine it to do nothing.
+% \begin{macrocode}
+ \let\@author=\@gobble
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\email}
+% \begin{macro}{\hyxmp@address@val}
+% Within \cs{addresses}, \cs{email} is defined to accept two arguments,
+% the second of which is the author's email address.
+% \begin{macrocode}
+ \def\email##1##2{%
+ \def\hyxmp@address@val{##2}%
+ \hyxmp@use@first@valid{pdfcontactemail}{\@pdfcontactemail}{%
+ \hyxmp@address@val
}%
- {}%
}%
% \end{macrocode}
-% If the document claims to comply with one or more \acro{PDF}
-% standards, check that all of the requisite metadata are present.
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\streetaddress}
+% \begin{macro}{\hyxmp@address@val}
+% \cs{streetaddress} wraps the author's street address.
% \begin{macrocode}
- \hyxmp@check@standards
+ \def\streetaddress##1{%
+ \def\hyxmp@address@val{##1}%
+ \hyxmp@use@first@valid{pdfcontactaddress}{\@pdfcontactaddress}{%
+ \hyxmp@address@val
+ }%
+ }%
% \end{macrocode}
-% Older versions of \pkgname{hyperref} write the \pdfterm{Info}
-% dictionary to the \acro{PDF} file at the end of the document. New
-% versions of \pkgname{hyperref} write the \pdfterm{Info} dictionary to
-% the \acro{PDF} file at the \emph{beginning} of the document. For
-% compatibility with both old and new \pkgname{hyperref} implementations
-% we suppress writing the \pdfterm{Info} dictionary here, at the
-% beginning of the document.
-% \changes{v4.1}{2019/04/02}{Invoke
-% \protect\cs{hyxmp@no@info@lists} at the beginning of the
-% document, for compatibility with both newer and older versions of
-% \protect\pkgname{hyperref}}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\city}
+% \begin{macro}{\hyxmp@address@val}
+% \cs{city} wraps the author's city name.
% \begin{macrocode}
- \hyxmp@no@info@lists
+ \def\city##1{%
+ \def\hyxmp@address@val{##1}%
+ \hyxmp@use@first@valid{pdfcontactcity}{\@pdfcontactcity}{%
+ \hyxmp@address@val
+ }%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\state}
+% \begin{macro}{\hyxmp@address@val}
+% \cs{state} wraps the author's state or region name.
+% \begin{macrocode}
+ \def\state##1{%
+ \def\hyxmp@address@val{##1}%
+ \hyxmp@use@first@valid{pdfcontactregion}{\@pdfcontactregion}{%
+ \hyxmp@address@val
+ }%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\country}
+% \begin{macro}{\hyxmp@address@val}
+% \cs{country} wraps the author's country name.
+% \begin{macrocode}
+ \def\country##1{%
+ \def\hyxmp@address@val{##1}%
+ \hyxmp@use@first@valid{pdfcontactcountry}{\@pdfcontactcountry}{%
+ \hyxmp@address@val
+ }%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\postcode}
+% \begin{macro}{\hyxmp@address@val}
+% \cs{postcode} wraps the author's postal code.
+% \begin{macrocode}
+ \def\postcode##1{%
+ \def\hyxmp@address@val{##1}%
+ \hyxmp@use@first@valid{pdfcontactpostcode}{\@pdfcontactpostcode}{%
+ \hyxmp@address@val
+ }%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\affiliation}
+% We want to produce \acro{XMP} metadata for only a single affiliation.
+% Although \cs{hyxmp@use@first@valid} will ensure that only the first
+% email, city, country, etc.\ encountered is considered, we run the
+% first of one affiliation defining, say, a city and state but no
+% country and a subsequent affiliation defining a country. In that
+% case, the \acro{XMP} would include the first author's city and state
+% and the subsequent author's country. Hence, we define
+% \cs{affiliation} to ``self destruct'' after its first use, discarding
+% all further affiliations.
+% \begin{macrocode}
+ \def\affiliation##1##2{%
+ ##2%
+ \let\affiliation=\@gobbletwo
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% We want to evaluate \cs{addresses} with the preceding local
+% definitions in effect, but we don't want to typeset any text appearing
+% in the string. Hence, we ``typeset'' \cs{addresses} within a box that
+% is subsequently discarded.
+% \begin{macrocode}
+ \setbox0=\hbox{\addresses}%
+ \endgroup
+% \end{macrocode}
+%
+% \clsname{acmart} supports other relevant metadata in addition to the
+% authors' mailing addresses. For instance, papers accepted for
+% publication indicate their \acro{DOI} number. However, papers under
+% review will contain either a placeholder \acro{DOI},
+% ``10.1145/nnnnnnn.nnnnnnn'', or the example \acro{DOI} specified in
+% the \clsname{acmart} example document, ``10.1145/1122445.1122456''.
+% We ignore both of those \acro{DOI}s.
+% \changes{v5.4}{2020/06/16}{Bug fix: Correct a missing ``else'' argument
+% in two invocations of \protect\cs{@if@def@and@nonempty}}
+% \begin{macrocode}
+ \@if@def@and@nonempty{@acmDOI}{%
+ \IfSubStr{\@acmDOI}{10.1145/1122445.1122456}{}{%
+ \IfSubStr{\@acmDOI}{10.1145/nnnnnnn.nnnnnnn}{}{%
+ \hyxmp@use@first@valid{pdfdoi}{\@pdfdoi}{%
+ \@acmDOI
+ }%
+ }%
+ }%
+ }%
+ {}%
+% \end{macrocode}
+% \begin{macro}{\hyxmp@strip@isbn@date}
+% \begin{macro}{\hyxmp@acm@isbn}
+% Papers appearing in conference proceedings specify the proceedings'
+% \acro{ISBN}. As with \cs{@acmDOI} above, we ignore both the
+% placeholder \acro{ISBN}, ``978-x-xxxx-xxxx-x/YY/MM'', and the example
+% \acro{ISBN}, ``978-1-4503-XXXX-X/18/06''. We also strip off the
+% ``\texttt{/}\meta{year}\texttt{/}\meta{month}'' suffix so as to
+% include a true \acro{ISBN} in the \acro{XMP} metadata.
+% \begin{macrocode}
+ \@if@def@and@nonempty{@acmISBN}{%
+ \IfSubStr{\@acmISBN}{XXXX}{}{%
+ \IfSubStr{\@acmISBN}{xxxx}{}{%
+ \def\hyxmp@strip@isbn@date##1/##2!{##1}%
+ \edef\hyxmp@acm@isbn{%
+ \expandafter\hyxmp@strip@isbn@date\@acmISBN/!%
+ }%
+ \hyxmp@use@first@valid{pdfisbn}{\@pdfisbn}{%
+ \hyxmp@acm@isbn
+ }%
+ }%
+ }%
+ }%
+ {}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\hyxmp@acm@publisher}
+% The publisher is of course \acro{ACM}.
+% \begin{macrocode}
+ \def\hyxmp@acm@publisher{Association for Computing Machinery}%
+ \hyxmp@use@first@valid{pdfpublisher}{\@pdfpublisher}{%
+ \hyxmp@acm@publisher
+ }%
+% \end{macrocode}
+% Use the journal name if defined, otherwise the book name (for
+% conference proceedings).
+% \begin{macrocode}
+ \hyxmp@use@first@valid{pdfpublication}{\@pdfpublication}{%
+ \@journalName,%
+ \@acmBooktitle,%
+ \@acmConference
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\hyxmp@acm@pubtype}
+% \clsname{acmart} makes clear whether it's typesetting a journal
+% article. If it's not a journal, we assume it's a book (conference
+% proceedings).
+% \begin{macrocode}
+ \if@ACM@journal
+ \def\hyxmp@acm@pubtype{journal}%
+ \else
+ \def\hyxmp@acm@pubtype{book}%
+ \fi
+ \hyxmp@use@first@valid{pdfpubtype}{\@pdfpubtype}{%
+ \hyxmp@acm@pubtype
+ }%
+% \end{macrocode}
+% \end{macro}
+% Journal articles have a volume and issue number.
+% \begin{macrocode}
+ \hyxmp@use@first@valid{pdfvolumenum}{\@pdfvolumenum}{%
+ \@acmVolume
+ }%
+ \hyxmp@use@first@valid{pdfissuenum}{\@pdfissuenum}{%
+ \@acmNumber
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Nullify \cs{hyxmp@parse@acmart} if the author is not using the
+% \clsname{acmart} class.
+% \begin{macrocode}
+\@ifclassloaded{acmart}{}{\let\hyxmp@parse@acmart=\relax}
% \end{macrocode}
-% We wait until the end of the document to construct the \acro{XMP}
-% packet and write it to the \acro{PDF} document catalog. This gives
-% the author ample opportunity to provide metadata to \pkgname{hyperref}
-% and thereby \pkgname{hyperxmp}.
+%
+% \begin{macro}{\hyxmp@dc@lang}
+% \cs{hyxmp@dc@lang} is a comma-separated list of all languages used in
+% the document.
% \begin{macrocode}
- \hyxmp@at@end{%
- \hyxmp@find@metadata
- \hyxmp@embed@packet
+\let\hyxmp@dc@lang=\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hyxmp@detect@langs}
+% If \optname{pdflang} was not specified, try to determine the document
+% language(s) using either \pkgname{babel}'s or \pkgname{polyglossia}'s
+% definitions.
+% \changes{v5.3}{2020/06/08}{Acquire the default language from the
+% \protect\pkgname{polyglossia} package, if loaded. Thanks to
+% Robin Schwab for bringing that package to my attention}
+% \changes{v5.4}{2020/06/16}{Refactored language detection into a
+% separate command}
+% \changes{v5.5}{2020/07/21}{Set the language(s) immediately instead of
+% deferring them to \protect\cs{hyxmp@set@dc@lang}}
+% \begin{macrocode}
+\newcommand*{\hyxmp@detect@langs}{%
+ \@ifundefined{mainbcp47id}{%
+ \@ifundefined{LocaleForEach}{%
+% \end{macrocode}
+% The document doesn't appear to have loaded either \pkgname{babel} or
+% \pkgname{polyglossia}. In this case we have one small task to do. In
+% older versions of \pkgname{hyperref}, \cs{@pdflang} is set to
+% \cs{@empty} if \optname{pdflang} is not specified. In newer versions
+% of \pkgname{hyperref}, \cs{@pdflang} is set to \cs{relax} if
+% \optname{pdflang} is not specified. The latter is a bit problematic
+% for \pkgname{hyperxmp} because it makes \cs{@pdflang} non-expandable,
+% which causes a literal ``\cs{@pdflang}'' to be written as \acro{XMP}
+% metadata. To avoid that situation we explicitly set \cs{@pdflang} to
+% \cs{@empty} to avoid problems with non-expandable symbols.
+% \changes{v2.3a}{2013/04/16}{Bug fix: Redefine \cs{@pdflang} as
+% \cs{@empty} when \protect\pkgname{hyperref} has set
+% it to \cs{relax}}
+% \begin{macrocode}
+ \let\@pdflang=\@empty
+ }{%
+% \end{macrocode}
+% \changes{v5.4}{2020/06/17}{Added support for \protect\pkgname{babel}}
+% \changes{v5.5}{2020/07/16}{Store the main language in \protect\cs{@pdflang}.
+% Thanks to Javier Bezos for his help with the \protect\pkgname{hyperxmp}
+% code and for modifying \protect\pkgname{babel} for
+% \protect\pkgname{hyperxmp}'s benefit}
+% \begin{macro}{\hyxmp@dc@lang}
+% \begin{macro}{\hyxmp@lang@tag}
+% \begin{macro}{\hyxmp@lang@name}
+% \begin{macro}{\@pdflang}
+% Use \pkgname{babel}'s \cs{LocaleForEach} and \cs{getlocaleproperty} to
+% set \cs{@pdflang} to the document's main language and
+% \cs{hyxmp@dc@lang} to a comma-separated list of all languages used.
+% \begin{macrocode}
+ \BabelEnsureInfo
+ \LocaleForEach{%
+ \getlocaleproperty\hyxmp@lang@tag{##1}{identification/tag.bcp47}%
+ \ifx\hyxmp@dc@lang\@empty
+ \xdef\hyxmp@dc@lang{\hyxmp@lang@tag}%
+ \else
+ \xdef\hyxmp@dc@lang{\hyxmp@dc@lang,\hyxmp@lang@tag}%
+ \fi
+ \def\hyxmp@lang@name{##1}%
+ \ifx\hyxmp@lang@name\bbl@main@language
+ \edef\@pdflang{\hyxmp@lang@tag}%
+ \fi
+ }%
}%
}{%
- \PackageWarningNoLine{hyperxmp}{%
- \jobname.tex failed to include a\MessageBreak
- \string\usepackage\string{hyperref\string}
- in the preamble.\MessageBreak
- Consequently, all hyperxmp functionality will be\MessageBreak
- disabled}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% Use \pkgname{polyglossia}'s \cs{mainbcp47id} as the document's main
+% language and its \cs{xpg@bcp@loaded} as a comma-separated list of all
+% document languages.
+% \begin{macrocode}
+ \xdef\@pdflang{\csname mainbcp47id\endcsname}%
+ \edef\hyxmp@dc@lang{\xpg@bcp@loaded}%
}%
}
% \end{macrocode}
+% \end{macro}
%
%
% \subsection{Manipulating author-supplied data}
@@ -2974,7 +4160,8 @@
\def\hyxmp@try@today#1#2{%
\@ifmtargexp{\hyxmp@today@xmp}{%
\@ifundefined{#1}{}{#2}%
- }{}%
+ }%
+ {}%
}
% \end{macrocode}
% \end{macro}
@@ -3001,12 +4188,19 @@
\edef\hyxmp@today@xmp{\expandafter\hyxmp@pdf@to@xmp@date\pdffeedback creationdate}%
}
% \end{macrocode}
+% \begin{macro}{\hyxmp@timestamp}
% Case 3: |\filemoddate| is defined (\XeLaTeX).
-% In this case, we treat the timestamp of the job's |.aux| file as the
+% In this case, we treat the timestamp of the job's |.log| file as the
% current date/time.
+% \label{page:jobname-log}
+% \changes{v5.1}{2020/04/08}{Don't rely on
+% \string\cs{jobname}\string\texttt{.aux} existing to query the
+% current time under \string\XeLaTeX\string\@. Instead, use
+% \string\cs{jobname}\string\texttt{.log}. Thanks to Ulrike Fischer
+% for the bug report and for her suggestion to use the log file.}
% \begin{macrocode}
\hyxmp@try@today{filemoddate}{%
- \edef\hyxmp@today@xmp{\filemoddate{\jobname.aux}}%
+ \edef\hyxmp@today@xmp{\filemoddate{\hyxmp@jobname.log}}%
\edef\next{%
\edef\noexpand\hyxmp@today@xmp{\noexpand\hyxmp@as@xmp@date{\hyxmp@today@xmp}}%
}%
@@ -3022,6 +4216,7 @@
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\hyxmp@today@pdf}
% Define |\hyxmp@today@pdf| as the current date and (if available) time
@@ -3583,7 +4778,7 @@
% and typesets the text within the \acro{XML} tag.
% \begin{macrocode}
\newcommand*{\hyxmp@add@simple@lang@i}{%
- \@ifnextchar[\hyxmp@add@simple@lang@ii{\hyxmp@add@simple@lang@ii[]}%
+ \@ifnextchar[\hyxmp@add@simple@lang@ii{\hyxmp@add@simple@lang@ii[\@pdfmetalang]}%
}
% \end{macrocode}
% \end{macro}
@@ -3610,6 +4805,29 @@ ______<#3 xml:lang="#1">\hyxmp@xmlified</#3>^^J%
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\hyxmp@add@simple@pfx}
+% Given an \acro{XMP} tag~(|#1|), a---typically hard-wired---prefix
+% string~(|#2|), and a main string~(|#2|), if the main string is
+% nonempty, add a begin tag, both strings, and an end tag to the packet.
+% The ``|simple|'' in the macro name indicates that the string is output
+% without variations for different languages.
+% \changes{v5.2}{2020/04/29}{Added this macro}
+% \begin{macrocode}
+\newcommand*{\hyxmp@add@simple@pfx}[3]{%
+ \@ifnotmtargexp{#3}{%
+ \hyxmp@add@to@xml{\hyxmp@extra@indent______<}%
+ \xdef\hyxmp@xml{\hyxmp@xml#1}%
+ \hyxmp@pdfstringdef\hyxmp@iprefix{#2}%
+ \hyxmp@xmlify{\hyxmp@iprefix}%
+ \hyxmp@add@to@xml{>\hyxmp@xmlified}%
+ \hyxmp@xmlify{#3}%
+ \hyxmp@add@to@xml{\hyxmp@xmlified</}%
+ \xdef\hyxmp@xml{\hyxmp@xml#1>^^J}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
%
% \subsubsection{Providing metadata in multiple languages}
% \label{sec:lang-alt}
@@ -3618,9 +4836,10 @@ ______<#3 xml:lang="#1">\hyxmp@xmlified</#3>^^J%
% \xmpprop{dc:description}, and \xmpprop{dc:rights} (and others? Let me
% know.)---can be expressed in multiple languages. The same text is
% used for both language \optname{pdfmetalang} (default:
-% \optname{pdflang}) and language ``|x-default|''. To express the same
-% metadata in multiple languages, we provide an |\XMPLangAlt| macro to
-% construct a list of alternative forms for a piece of metadata.
+% \optname{pdflang}) and language ``\xmpterm{x-default}''. To express
+% the same metadata in multiple languages, we provide an |\XMPLangAlt|
+% macro to construct a list of alternative forms for a piece of
+% metadata.
%
% \begin{macro}{\hyxmp@alt@title}
% \begin{macro}{\hyxmp@alt@description}
@@ -3888,7 +5107,7 @@ ______<#3 xml:lang="#1">\hyxmp@xmlified</#3>^^J%
% Bug reported by Ga\"etan Leurent}
% \begin{macrocode}
\newcommand*{\hyxmp@def@DocumentID}{%
- \edef\hyxmp@seed@string{\jobname:\@pdftitle:\@pdfauthor:}%
+ \edef\hyxmp@seed@string{\hyxmp@jobname:\@pdftitle:\@pdfauthor:}%
\expandafter\hyxmp@seed@rng\expandafter{\hyxmp@seed@string}%
\edef\hyxmp@rand@num{\the\@tempcnta}%
\hyxmp@create@uuid\hyxmp@DocumentID
@@ -3916,7 +5135,7 @@ ______<#3 xml:lang="#1">\hyxmp@xmlified</#3>^^J%
\newcommand*{\hyxmp@def@InstanceID}{%
\hyxmp@today@xmp@define{\hyxmp@seed@string}%
\edef\hyxmp@seed@string{%
- \jobname:\@pdftitle:\@pdfauthor:\hyxmp@today@xmp:\hyxmp@seed@string
+ \hyxmp@jobname:\@pdftitle:\@pdfauthor:\hyxmp@today@xmp:\hyxmp@seed@string
}%
\expandafter\hyxmp@seed@rng\expandafter{\hyxmp@seed@string}%
\edef\hyxmp@rand@num{\the\@tempcnta}%
@@ -3933,20 +5152,32 @@ ______<#3 xml:lang="#1">\hyxmp@xmlified</#3>^^J%
% An \acro{XMP} packet ``shall consist of the following, in order: a
% header \acro{PI}, the serialized \acro{XMP} data model (the \acro{XMP}
% packet) with optional white-space padding, and a trailer
-% \acro{PI}''~\cite{Adobe2012:XMP}. (``\acro{PI}'' is an abbreviation
-% for ``processing instructions''). The serialized \acro{XMP} includes
-% blocks of \acro{XML} for various \acro{XMP} schemata: Adobe \acro{PDF}
-% (Section~\ref{sec:adobe-pdf}), Dublin Core
-% (Section~\ref{sec:dublin-core}), \acro{XMP} Rights Management
-% (Section~\ref{sec:xmp-rights}), \acro{XMP} Media Management
-% (Section~\ref{sec:xmp-media}), \acro{XMP} Basic
-% (Section~\ref{sec:xmp-basic}), Photoshop
-% (Section~\ref{sec:photoshop}), \acro{IPTC} Photo Metadata
-% (Section~\ref{sec:photo-meta}), and \acro{PDF}\textsc{/*} Identification
-% (Section~\ref{sec:pdfX-id}). The |\hyxmp@construct@packet| macro
-% (Section~\ref{sec:combining-schemata}) constructs the \acro{XMP}
-% packet into |\hyxmp@xml|. It first writes the appropriate \acro{XML}
-% header, then calls the various schema-writing macros, then injects
+% \acro{PI}''~\cite{Adobe2012:XMP}. (``\acro{PI}'' is an abbreviation for
+% ``processing instructions''). The serialized \acro{XMP} includes blocks
+% of \acro{XML} for various \acro{XMP} schemata:
+% ^^A
+% \schema[Adobe PDF]{Adobe \protect\acro{PDF}} (Section~\ref{sec:adobe-pdf}),
+% \schema{Dublin Core} (Section~\ref{sec:dublin-core}),
+% \schema[XMP Rights Management]{\protect\acro{XMP} Rights Management} (Section~\ref{sec:xmp-rights}),
+% \schema[XMP Media Management]{\protect\acro{XMP} Media Management} (Section~\ref{sec:xmp-media}),
+% \schema[XMP Basic]{\protect\acro{XMP} Basic} (Section~\ref{sec:xmp-basic}),
+% \schema{Photoshop} (Section~\ref{sec:photoshop}),
+% \index{PDF/A Identification schema=\acro {PDF/A} Identification schema}
+% \index{PDF/X Identification schema=\acro {PDF/X} Identification schema}
+% \index{PDF/UA Identification schema=\acro {PDF/UA} Identification schema}
+% \index{schemata&PDF/A Identification=\acro {PDF/A} Identification}
+% \index{schemata&PDF/X Identification=\acro {PDF/X} Identification}
+% \index{schemata&PDF/UA Identification=\acro {PDF/UA} Identification}
+% \acro{PDF}\textsc{/*} Identification (Section~\ref{sec:pdfX-id}),
+% \schema[IPTC Photo Metadata]{\protect\acro{IPTC} Photo Metadata} (Section~\ref{sec:photo-meta}),
+% \schema[PRISM Basic Metadata]{\protect\acro{PRISM} Basic Metadata} (Section~\ref{sec:prism-meta}),
+% \schema{Journal Article Versions} (Section~\ref{sec:niso-jav-meta}), and
+% \schema[XMP Paged-Text]{\protect\acro{XMP} Paged-Text} (Section~\ref{sec:xmp-paged-text}).
+% ^^A
+% The |\hyxmp@construct@packet| macro
+% (Section~\ref{sec:combining-schemata}) constructs the \acro{XMP} packet
+% into |\hyxmp@xml|. It first writes the appropriate \acro{XML} header,
+% then calls the various schema-writing macros, then injects
% |\hyxmp@padding| as padding, and finally writes the appropriate
% \acro{XML} trailer.
%
@@ -4021,8 +5252,8 @@ _______________________________________________________________^^J%
% \end{macro}
%
% \begin{macro}{\hyxmp@x@default}
-% Define an |x-default| string that we can use in comparisons with
-% |\@pdfmetalang|.
+% Define an \xmpterm{x-default} string that we can use in comparisons
+% with |\@pdfmetalang|.
% \begin{macrocode}
\newcommand*{\hyxmp@x@default}{x-default}
% \end{macrocode}
@@ -4032,6 +5263,8 @@ _______________________________________________________________^^J%
% \subsubsection{The Adobe PDF schema}
% \label{sec:adobe-pdf}
%
+% \begin{schemadesc}[Adobe PDF]{Adobe \protect\acro{PDF}}
+%
% Older versions of \pkgname{hyperref} defined a default producer; newer
% versions do not. Instead, they let the \tex\ engine define the
% producer itself. This poses a problem for \acro{PDF/A} compliance
@@ -4047,17 +5280,21 @@ _______________________________________________________________^^J%
% Define |\@pdfproducer| using the banner string if available or the
% \tex\ engine's version number if not.
% \changes{v5.0}{2020/03/01}{Added this macro}
+% \changes{v5.1}{2020/04/06}{Check for \string\LuaTeX\ before checking for
+% \string\pdfTeX\ to work around \string\pkgname{luatex85}'s confusing
+% \string\pkgname{iftex} by defining \string\cs{pdftexversion}. Thanks
+% to Robin Schwab for the bug report}
% \begin{macrocode}
\newcommand*{\hyxmp@define@pdfproducer}{%
\gdef\@pdfproducer{TeX}
- \ifPDFTeX
- \expandafter\hyxmp@banner@to@producer\expandafter{\pdftexbanner}
+ \ifLuaTeX
+ \expandafter\hyxmp@banner@to@producer\expandafter{\luatexbanner}%
\else
- \ifLuaTeX
- \expandafter\hyxmp@banner@to@producer\expandafter{\luatexbanner}
+ \ifPDFTeX
+ \expandafter\hyxmp@banner@to@producer\expandafter{\pdftexbanner}%
\else
\ifXeTeX
- \edef\@pdfproducer{XeTeX version \the\XeTeXversion\XeTeXrevision}
+ \edef\@pdfproducer{XeTeX version \the\XeTeXversion\XeTeXrevision}%
\fi
\fi
\fi
@@ -4082,12 +5319,16 @@ _______________________________________________________________^^J%
% removing the initial ``\texttt{This is}'' if possible (specifically,
% when $\varepsilon$-\TeX's\index{e-TeX=$\varepsilon$-\TeX}
% |\scantokens| primitive is available).
+% \changes{v5.1}{2020/04/03}{Prevent the category code of ``@'' from
+% propagating past the \cs{begin}\string\texttt{\{document\}}.
+% Thanks to Robert Schlicht for noticing this catcode ``leak'' and
+% providing a correction}
% \begin{macrocode}
\def\hyxmp@banner@to@producer#1{%
\ifx\scantokens\relax
\gdef\@pdfproducer{#1}%
\else
- \scantokens{\makeatletter\hyxmp@remove@this#1\relax\makeatother}%
+ {\scantokens{\makeatletter\hyxmp@remove@this#1\relax}}%
\fi
}
% \end{macrocode}
@@ -4117,6 +5358,52 @@ _______________________________________________________________^^J%
}
% \end{macrocode}
%
+% \begin{macro}{\hyxmp@assign@major@minor}
+% Assign |\hyxmp@major@minor| to be the \acro{PDF} version targeted by
+% the running \TeX\ engine.
+% \changes{v5.2}{2020/05/10}{Added this macro. \string\pkgname{hyperxmp}
+% now correctly specifies \string\xmpprop{pdf:PDFVersion} when
+% generating \string\acro{PDF}~2.0+. Thanks to Ulrike Fischer for
+% alerting me to \string\acro{PDF}~2.0's availability in the
+% \string\TeX\ ecosystem and informing me how to activate it}
+% \begin{macro}{\hyxmp@major@minor}
+% \begin{macrocode}
+\newcommand*{\hyxmp@assign@major@minor}{%
+ \@ifundefined{pdfvariable}{%
+ \@ifundefined{pdfminorversion}{%
+% \end{macrocode}
+% Case 1: Neither |\pdfvariable| nor |\pdfminorversion| is defined
+% (\XeLaTeX\ and regular \LaTeX).
+% \begin{macrocode}
+ }{%
+% \end{macrocode}
+% Case 2: |\pdfminorversion| is defined (\pdfLaTeX\ and pre-0.85 \LuaLaTeX).
+% \begin{macrocode}
+ \xdef\hyxmp@major@minor{\the\pdfminorversion}%
+ \@ifundefined{pdfmajorversion}{%
+% \end{macrocode}
+% Case 2(a): |\pdfmajorversion| is not defined (older versions of
+% \pdfLaTeX\ and \LuaLaTeX).
+% \begin{macrocode}
+ \xdef\hyxmp@major@minor{1.\hyxmp@major@minor}%
+ }{%
+% \end{macrocode}
+% Case 2(b): |\pdfmajorversion| is defined (\pdfLaTeX~1.40.21+).
+% \begin{macrocode}
+ \xdef\hyxmp@major@minor{\the\pdfmajorversion.\hyxmp@major@minor}%
+ }%
+ }%
+ }{%
+% \end{macrocode}
+% Case 3: |\pdfvariable| is defined (\LuaLaTeX~0.85+).
+% \begin{macrocode}
+ \xdef\hyxmp@major@minor{\the\pdfvariable majorversion.\the\pdfvariable minorversion}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\hyxmp@pdf@schema}
% Add properties defined by the Adobe \acro{PDF} schema to the |\hyxmp@xml|
% macro.
@@ -4147,45 +5434,50 @@ _______________________________________________________________^^J%
\hyxmp@add@simple@var{pdf:Producer}{@pdfproducer}%
\hyxmp@add@simple@var{pdf:Keywords}{@pdfkeywords}%
\hyxmp@add@simple{pdf:Trapped}{\@pdftrapped}%
-% \end{macrocode}
-% Specify the \acro{PDF} version.
-% \begin{macrocode}
- \@ifundefined{pdfvariable}{%
- \@ifundefined{pdfminorversion}{%
-% \end{macrocode}
-% Case 1: Neither |\pdfvariable| nor |\pdfminorversion| is defined
-% (\XeLaTeX\ and regular \LaTeX).
-% \begin{macrocode}
- }{%
-% \end{macrocode}
-% Case 2: |\pdfminorversion| is defined (\pdfLaTeX\ and pre-0.85 \LuaLaTeX).
-% \begin{macrocode}
- \hyxmp@add@simple{pdf:PDFVersion}{1.\the\pdfminorversion}%
- }%
- }{%
-% \end{macrocode}
-% Case 3: |\pdfvariable| is defined (\LuaLaTeX~0.85+).
-% \begin{macrocode}
- \hyxmp@add@simple{pdf:PDFVersion}{1.\the\pdfvariable minorversion}%
- }%
+ \hyxmp@assign@major@minor
+ \hyxmp@add@simple@var{pdf:PDFVersion}{hyxmp@major@minor}%
}
% \end{macrocode}
% \end{macro}
%
+% \end{schemadesc}
+%
%
% \subsubsection{The Dublin Core schema}
% \label{sec:dublin-core}
%
+% \begin{schemadesc}{Dublin Core}
+%
+% \begin{macro}{\ifhyxmp@multi@langs}
+% \begin{macro}{\hyxmp@multi@langstrue}
+% \begin{macro}{\hyxmp@multi@langsfalse}
+% These macros are used locally to \cs{hyxmp@rdf@dc}. If the property
+% being processed has values in different languages,
+% \cs{ifhyxmp@multi@langs} evaluates to \textsc{true}. If it has a
+% value in only a single language, \cs{ifhyxmp@multi@langs} evaluates to
+% \textsc{false}.
+% \begin{macrocode}
+\newif\ifhyxmp@multi@langs
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\hyxmp@rdf@dc}
% Given an optional |\if|\meta{something} statement (|#1|), a Dublin Core
% property~(|#2|) and a macro containing some |\pdfstringdef|-defined
% text~(|#3|), append the appropriate block of \acro{XML} to the |\hyxmp@xml|
% macro.
-% \changes{v1.4}{2011/06/12}{Included metadata in the \texttt{x-default}
+% \changes{v1.4}{2011/06/12}{Included metadata in the \xmpterm{x-default}
% language regardless of the specified metadata language}
% \changes{v3.3}{2017/07/22}{Bug fix: Output the metadata language as
% correct \noexpand\acro{XML} even when \noexpand\pkgname{hyperref} is
% loaded with the \noexpand\optname{unicode} option}
+% \changes{v5.5}{2020/07/17}{List \protect\xmpterm{x-default} alternatives
+% before language-specific alternatives, as dictated by the
+% \protect\acro{XMP} specification~\protect\cite{Adobe2012:XMP}}
+% \changes{v5.5}{2020/07/21}{Rewrite the core part of this macro to
+% divide it into four, cleanly defined cases}
% \begin{macrocode}
\newcommand*{\hyxmp@rdf@dc}[3][\iffalse]{%
% \end{macrocode}
@@ -4211,27 +5503,90 @@ _______________________________________________________________^^J%
______<dc:#2>^^J%
________<rdf:Alt>^^J%
}%
+% \end{macrocode}
+% Record whether property~|#2| has definitions in multiple languages.
+% \begin{macrocode}
+ \@if@def@and@nonempty{hyxmp@alt@#2}{%
+ \hyxmp@multi@langstrue
+ }{%
+ \hyxmp@multi@langsfalse
+ }%
+% \end{macrocode}
+% There are now four cases to consider: the cross product of
+% \{\optname{pdfmetalang}~$=$ ``\xmpterm{x-default}'',
+% \optname{pdfmetalang}~$\neq$ ``\xmpterm{x-default}''\} and
+% \{\cs{XMPLangAlt} was specified, \cs{XMPLangAlt} was not specified\}.
+% We handle each of these in turn.
+% \begin{macrocode}
\ifx\@pdfmetalang\hyxmp@x@default
+ \ifhyxmp@multi@langs
+% \end{macrocode}
+% \textbf{Case~1}: No \optname{pdfmetalang} but \cs{XMPLangAlt}.
+% We consider this an error because the \xmpterm{x-default} language will
+% not have a matching non-default language, in violation of the
+% \acro{XMP} specification's guidance~\cite[p.~23]{Adobe2012:XMP}:
+%
+% \begin{quote}
+% \sffamily
+%
+% An \textbf{xml:lang} value of ``x-default'' may be used to
+% explicitly denote a default item. If used, the ``x-default'' item
+% shall be first in the array and its simple text value should be
+% repeated in another item in which \textbf{xml:lang} specifies its
+% actual language. However, an ``x-default'' item may be the only
+% item, in which case there is only a default value in no defined
+% language.
+% \end{quote}
+% \begin{macrocode}
+ \PackageError{hyperxmp}%
+ {\string\XMPLangAlt\space was used without specifying
+ pdfmetalang\MessageBreak
+ or pdflang}%
+ {Be sure to assign a language code to the pdfmetalang key and/or a
+ document\MessageBreak
+ language to the pdflang key (e.g., \string\hypersetup{pdfmetalang={en}}).}%
+ \else
+% \end{macrocode}
+% \textbf{Case~2}: No \optname{pdfmetalang} and no \cs{XMPLangAlt}.
+% Here we specify only \xmpterm{x-default} as the language, as per the
+% guidance quoted above.
+% \begin{macrocode}
+ \hyxmp@add@to@xml{%
+__________<rdf:li xml:lang="\hyxmp@x@default">\hyxmp@value</rdf:li>^^J%
+ }%
+ \fi
\else
- \hyxmp@xmlify{\@pdfmetalang}%
- \hyxmp@add@to@xml{%
-__________<rdf:li xml:lang="\hyxmp@xmlified">\hyxmp@value</rdf:li>^^J%
- }%
- \fi
- \hyxmp@add@to@xml{%
+ \ifhyxmp@multi@langs
+% \end{macrocode}
+% \textbf{Case~3}: Both \optname{pdfmetalang} and \cs{XMPLangAlt}. In
+% this case, we include an \xmpterm{x-default} followed by the
+% \optname{pdfmetalang} language, followed by all of the language
+% alternatives.
+% \begin{macrocode}
+ \hyxmp@xmlify{\@pdfmetalang}%
+ \hyxmp@add@to@xml{%
__________<rdf:li xml:lang="\hyxmp@x@default">\hyxmp@value</rdf:li>^^J%
- }%
+__________<rdf:li xml:lang="\hyxmp@xmlified">\hyxmp@value</rdf:li>^^J%
+ }%
+ \def\do##1##2{
+ \hyxmp@xmlify{##2}%
+ \hyxmp@add@to@xml{%
+ __________<rdf:li xml:lang="##1">\hyxmp@xmlified</rdf:li>^^J%
+ }%
+ }%
+ \csname hyxmp@alt@#2\endcsname
+ \else
% \end{macrocode}
-% Include variants of the text expressed in other languages, as specified by
-% the author using |\XMPLangAlt| (Section~\ref{sec:lang-alt}).
+% \textbf{Case~4}: \optname{pdfmetalang} but no \cs{XMPLangAlt}. To
+% reduce redundancy we omit the \xmpterm{x-default} and include the
+% single language in which the text appears.
% \begin{macrocode}
- \def\do##1##2{
- \hyxmp@xmlify{##2}%
- \hyxmp@add@to@xml{%
-__________<rdf:li xml:lang="##1">\hyxmp@xmlified</rdf:li>^^J%
- }%
- }%
- \csname hyxmp@alt@#2\endcsname
+ \hyxmp@xmlify{\@pdfmetalang}%
+ \hyxmp@add@to@xml{%
+__________<rdf:li xml:lang="\hyxmp@xmlified">\hyxmp@value</rdf:li>^^J%
+ }%
+ \fi
+ \fi
% \end{macrocode}
% Complete this \acro{XMP} element.
% \begin{macrocode}
@@ -4303,7 +5658,7 @@ ______</dc:#2>^^J%
% \changes{v4.1}{2019/04/05}{Added this macro}
% \begin{macrocode}
\newcommand{\hyxmp@singleton@dc}[3][Bag]{%
- \@ifnotmtarg{#3}{%
+ \@ifnotmtargexp{#3}{%
\hyxmp@xmlify{#3}%
\hyxmp@add@to@xml{%
______<dc:#2>^^J%
@@ -4317,6 +5672,24 @@ ______</dc:#2>^^J%
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\hyxmp@cond@dc@identifier}
+% Conditionally add a \xmpprop{dc:identifier} tag. Given a prefix
+% string~(|#1|) and a main string~(|#2|), wrap these in a
+% \xmpprop{dc:identifier} if the main string is nonempty and
+% |\hyxmp@xmlified| \emph{is} empty (implying the
+% \xmpprop{dc:identifier} has not yet been written).
+% \changes{v5.2}{2020/04/29}{Added this macro}
+% \begin{macrocode}
+\newcommand*{\hyxmp@cond@dc@identifier}[2]{%
+ \ifx\hyxmp@xmlified\@empty
+ \@ifnotmtargexp{#2}{%
+ \hyxmp@add@simple@pfx{dc:identifier}{#1}{#2}%
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\hyxmp@dc@schema}
% Add properties defined by the Dublin Core schema to the |\hyxmp@xml|
% macro. Specifically, we add entries for the \xmpprop{dc:title}
@@ -4326,16 +5699,24 @@ ______</dc:#2>^^J%
% specified a \optname{pdfcopyright}, the \xmpprop{dc:creator} property
% if the author specified a \optname{pdfauthor}, the
% \xmpprop{dc:subject} property if the author specified
-% \optname{pdfkeywords}, and the \xmpprop{dc:language} property if the
-% author specified \optname{pdflang}. We also specify the
-% \xmpprop{dc:date} property using the date the document was run through
-% \LaTeX\ and the \xmpprop{dc:source} property using the base name of
-% the source file with |.tex| appended.
+% \optname{pdfkeywords}, the \xmpprop{dc:language} property if the
+% author specified \optname{pdflang}, the \xmpprop{dc:type} property if
+% the author specified \optname{pdftype}, and the
+% \xmpprop{dc:identifier} if the author specified
+% \optname{pdfidentifier} or if we can derive it from other options. We
+% also specify the \xmpprop{dc:source} property using the base name of
+% the source file with |.tex| appended and the \xmpprop{dc:date}
+% property using the date the document was run through \LaTeX---unless
+% the author specified \optname{pdfdate}, in which case we use that.
% \changes{v2.0}{2012/08/26}{Added support for \xmpprop{dc:language}
% and \xmpprop{dc:source}}
% \changes{v2.4}{2013/12/21}{Made \xmpprop{dc:language} a \xmpterm{Bag}
% instead of an individual item so as to conform to the latest
% \acro{XMP} specifications, a detail identified by Florian Breitwieser}
+% \changes{v5.3}{2020/06/13}{Include all languages used in the document
+% in \protect\xmpprop{dc:language}}
+% \changes{v5.4}{2020/06/18}{Bug fix: Use \protect\cs{hyxmp@today@xmp}
+% as the date only if \protect\cs{@pdfdatetime} is undefined}
% \begin{macrocode}
\newcommand*{\hyxmp@dc@schema}{%
\hyxmp@add@simple{dc:format}{application/pdf}%
@@ -4343,8 +5724,11 @@ ______</dc:#2>^^J%
\hyxmp@rdf@dc[\ifHy@pdfa]{description}{\@pdfsubject}%
\hyxmp@rdf@dc{rights}{\@pdfcopyright}%
\hyxmp@singleton@dc{publisher}{\@pdfpublisher}%
- \hyxmp@singleton@dc[Seq]{date}{\hyxmp@today@xmp}%
- \hyxmp@singleton@dc{language}{\@pdflang}%
+ \@ifmtargexp{\@pdfdatetime}{%
+ \hyxmp@singleton@dc[Seq]{date}{\hyxmp@today@xmp}%
+ }{%
+ \hyxmp@singleton@dc[Seq]{date}{\@pdfdatetime}%
+ }%
\hyxmp@singleton@dc{type}{\@pdftype}%
\hyxmp@list@to@xml[\ifHy@pdfa]{creator}{Seq}{\hyxmp@pdfauthor}%
\hyxmp@list@to@xml{subject}{Bag}{\hyxmp@pdfkeywords}%
@@ -4352,13 +5736,32 @@ ______</dc:#2>^^J%
\else
\hyxmp@add@simple{dc:source}{\@pdfsource}%
\fi
+ \hyxmp@list@to@xml{language}{Bag}{\hyxmp@dc@lang}%
+% If |\@pdfidentifier| is empty, try setting it to each of |\@pdfdoi|,
+% |\@pdfeissn|, |\@pdfissn|, and |\@pdfisbn|, in turn, with proper
+% syntactic adjustments.
+% \begin{macrocode}
+ \@ifmtargexp{\@pdfidentifier}{%
+ \let\hyxmp@xmlified=\@empty
+ \hyxmp@cond@dc@identifier{info:doi/}{\@pdfdoi}%
+ \hyxmp@cond@dc@identifier{urn:ISSN:}{\@pdfeissn}%
+ \hyxmp@cond@dc@identifier{urn:ISSN:}{\@pdfissn}%
+ \hyxmp@cond@dc@identifier{urn:ISBN:}{\@pdfisbn}%
+ }{%
+ \hyxmp@add@simple{dc:identifier}{\@pdfidentifier}%
+ }%
}
% \end{macrocode}
% \end{macro}
%
+% \end{schemadesc}
+%
+%
% \subsubsection{The XMP Rights Management schema}
% \label{sec:xmp-rights}
%
+% \begin{schemadesc}[XMP Rights Management]{\protect\acro{XMP} Rights Management}
+%
% \begin{macro}{\hyxmp@xmpRights@schema}
% Add properties defined by the \acro{XMP} Rights Management schema to the
% |\hyxmp@xml| macro. Currently, these are only the
@@ -4407,10 +5810,36 @@ ______</dc:#2>^^J%
% \end{macro}
% \end{macro}
%
+% \end{schemadesc}
+%
%
% \subsubsection{The XMP Media Management schema}
% \label{sec:xmp-media}
%
+% \begin{schemadesc}[XMP Media Management]{\protect\acro{XMP} Media Management}
+%
+% \begin{macro}{\hyxmp@aep@toks}
+% Once we reach the end of the preamble and know that \cs{@pdftitle} and
+% \cs{@pdfauthor} are no longer expected to change we use those macros
+% (and others) to define one \acro{UUID} for the document
+% (\cs{hyxmp@DocumentID}) and one for the document instance
+% (\cs{hyxmp@InstanceID}). As explained in
+% Section~\ref{sec:initial-prep}, we defer the invocation of
+% \cs{AtEndPreamble} to the end of the file.
+% \changes{v5.7}{2020/10/13}{As requested by Moritz Heckscher, define
+% \protect\cs{hyxmp@DocumentID} and \protect\cs{hyxmp@InstanceID} at
+% the end of the preamble instead of at the end of the document}
+% \begin{macrocode}
+\expandafter\hyxmp@aep@toks\expandafter=\expandafter{%
+ \the\hyxmp@aep@toks
+ \AtEndPreamble{%
+ \@ifmtargexp{\hyxmp@DocumentID}{\hyxmp@def@DocumentID}{}%
+ \@ifmtargexp{\hyxmp@InstanceID}{\hyxmp@def@InstanceID}{}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\hyxmp@mm@schema}
% Add properties defined by the \acro{XMP} Media Management schema to
% the |\hyxmp@xml| macro. According to the \acro{XMP} specification,
@@ -4431,8 +5860,6 @@ ______</dc:#2>^^J%
% the \protect\acro{XMP} packet}
% \begin{macrocode}
\gdef\hyxmp@mm@schema{%
- \@ifmtargexp{\hyxmp@DocumentID}{\hyxmp@def@DocumentID}{}%
- \@ifmtargexp{\hyxmp@InstanceID}{\hyxmp@def@InstanceID}{}%
\hyxmp@add@simple{xmpMM:DocumentID}{\hyxmp@DocumentID}%
\hyxmp@add@simple{xmpMM:InstanceID}{\hyxmp@InstanceID}%
\hyxmp@add@simple{xmpMM:VersionID}{\@pdfversionid}%
@@ -4441,10 +5868,14 @@ ______</dc:#2>^^J%
% \end{macrocode}
% \end{macro}
%
+% \end{schemadesc}
+%
%
% \subsubsection{The XMP Basic schema}
% \label{sec:xmp-basic}
%
+% \begin{schemadesc}[XMP Basic]{\protect\acro{XMP} Basic}
+
% \begin{macro}{\hyxmp@xmp@basic@schema}
% Add properties defined by the \acro{XMP} Basic schema to the
% |\hyxmp@xml| macro. These include a bunch of dates (all set to the
@@ -4503,10 +5934,14 @@ ______</dc:#2>^^J%
% \end{macrocode}
% \end{macro}
%
+% \end{schemadesc}
+%
%
% \subsubsection{The Photoshop schema}
% \label{sec:photoshop}
%
+% \begin{schemadesc}{Photoshop}
+%
% \begin{macro}{\hyxmp@photoshop@schema}
% \changes{v2.0}{2012/08/26}{Simplified using
% \texttt{\string\string\string\hyxmp@add@simple}}
@@ -4525,17 +5960,23 @@ ______</dc:#2>^^J%
% \end{macro}
% \end{macro}
%
+% \end{schemadesc}
+%
%
% \subsubsection{PDF/* Identification schemata}
% \label{sec:pdfX-id}
%
+% \begin{schemadesc}[PDF/A Identification]{\protect\acro{PDF/A} Identification}
+% \begin{schemadesc}[PDF/X Identification]{\protect\acro{PDF/X} Identification}
+% \begin{schemadesc}[PDF/UA Identification]{\protect\acro{PDF/UA} Identification}
+%
% \begin{macro}{\hyxmp@pdfa@id@schema}
% Add properties defined by the \acro{PDF/A} Identification
% schema~\cite{PDFA2008:xmp-props} to the |\hyxmp@xml| macro. These
% properties identify a document as conforming to a particular
% \acro{PDF/A} standard. We default to \PDFstd{A}{1}{b}{} if any
% \acro{PDF/A} compliance is detected but let the author override the
-% ``1'' with \optname{pdfapart} and the ``B'' with
+% ``1'' with \optname{pdfapart} and the ``b'' with
% \optname{pdfaconformance}.
% \changes{v2.4}{2013/12/21}{Added this macro}
% \changes{v2.9}{2016/04/12}{Let the author specify the \protect\acro{PDF/A}
@@ -4588,10 +6029,16 @@ ______</dc:#2>^^J%
% \end{macrocode}
% \end{macro}
%
+% \end{schemadesc}
+% \end{schemadesc}
+% \end{schemadesc}
+%
%
% \subsubsection{The IPTC Photo Metadata schema}
% \label{sec:photo-meta}
%
+% \begin{schemadesc}[IPTC Photo Metadata]{\protect\acro{IPTC} Photo Metadata}
+%
% \begin{macro}{\xmplinesep}
% Lines in multiline fields are separated by |\xmplinesep| in the
% generated \acro{XML}. This defaults to an \acro{LF} (|^^J|) character
@@ -4609,7 +6056,7 @@ ______</dc:#2>^^J%
%
% \begin{macro}{\hyxmp@list@to@lines}
% Given a property~(|#1|) and a macro containing a comma-separated
-% list~(|#2|), replace commas with |\xmplinesep|. Do nothing it the
+% list~(|#2|), replace commas with |\xmplinesep|. Do nothing if the
% list is empty.
% \changes{v2.2}{2012/12/07}{Added this macro}
% \begin{macrocode}
@@ -4724,9 +6171,14 @@ ______</Iptc4xmpCore:CreatorContactInfo>^^J%
% \end{macro}
% \end{macro}
%
+% \end{schemadesc}
+%
+%
% \subsubsection{The PRISM Basic Metadata schema}
% \label{sec:prism-meta}
%
+% \begin{schemadesc}[PRISM Basic Metadata]{\protect\acro{PRISM} Basic Metadata}
+%
% \begin{macro}{\hyxmp@prism@schema}
% \changes{v4.0}{2019/03/10}{Added this macro}
% Add properties defined by the \acro{PRISM} Basic Metadata
@@ -4755,6 +6207,133 @@ ______</Iptc4xmpCore:CreatorContactInfo>^^J%
% \end{macrocode}
% \end{macro}
%
+% \end{schemadesc}
+%
+%
+% \subsubsection{The Journal Article Versions (JAV) schema}
+% \label{sec:niso-jav-meta}
+%
+% \begin{schemadesc}{Journal Article Versions}
+%
+% \begin{macro}{\hyxmp@jav@schema}
+% \changes{v5.5}{2020/07/23}{Added this macro}
+% Add properties defined by the \acro{NISO}/\acro{ALPSP} Journal Article
+% Versions schema~\cite{NISO2008:jav}.
+% \begin{macrocode}
+\newcommand*{\hyxmp@jav@schema}{%
+ \hyxmp@add@simple{jav:journal_article_version}{\@pdfpubstatus}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \end{schemadesc}
+%
+% \subsubsection{The XMP Paged-Text schema}
+% \label{sec:xmp-paged-text}
+%
+% \begin{schemadesc}[XMP Paged-Text]{\protect\acro{XMP} Paged-Text}
+%
+% \begin{macro}{\hyxmp@xmptpg@schema}
+% The \acro{XMP} Paged-Text schema~\cite{Adobe2012:XMP} includes
+% properties related to the construction of the \acro{PDF} file itself.
+% We acquire most of this information through \LuaTeX\ mechanisms and
+% therefore include much less information when run from other \TeX\ engines.
+% \changes{v5.5}{2020/07/25}{Added this macro}
+% \begin{macrocode}
+\newcommand*{\hyxmp@xmptpg@schema}{%
+ \ifLuaTeX
+ \luadirect{write_xmp_font_list(\the\hyxmp@cct)}%
+ \fi
+ \hyxmp@add@simple{xmpTPg:NPages}{\@pdfnumpages}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hyxmp@cct}
+% We store the current category-code table to ensure that
+% |write_xmp_font_list|'s output uses our redefined category codes.
+% \begin{macrocode}
+\ifLuaTeX
+ \newcatcodetable\hyxmp@cct
+ \savecatcodetable\hyxmp@cct
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hyxmp@prot@us}
+% Define an underscore character that's protected from being converted
+% into a space when passed to \cs{hyxmp@add@to@xml}. \cs{hyxmp@prot@us}
+% is used within |write_xmp_font_list| (below) in particular to typeset
+% filenames that may contain underscores.
+% \begin{macrocode}
+\bgroup
+ \catcode`\_=11
+ \gdef\hyxmp@prot@us{_}%
+\egroup
+% \end{macrocode}
+% \end{macro}
+%
+% Here we define a Lua\index{Lua} function, |write_xmp_font_list|, that
+% writes font information to the \acro{XMP} packet.
+% \changes{v5.6}{2020/10/02}{Make \protect\texttt{write\_xmp\_font\_list}
+% robust to fonts loaded using
+% \protect\href{https://en.wikipedia.org/wiki/HarfBuzz}{HarfBuzz}.
+% Thanks to John Lienhard for the bug report}
+% \changes{v5.6}{2020/10/02}{Don't inadvertently replace underscores in
+% filenames when writing font-related metadata}
+% \begin{macrocode}
+\ifLuaTeX
+ \begin{luacode*}
+function write_xmp_font_list (cct)
+ local function show_field(name, ...)
+ for i = 1, select("#", ...) do
+ local val = select(i, ...)
+ if val then
+ local xml = string.gsub(val, "&", "&amp;")
+ xml = string.gsub(xml, "<", "&lt;")
+ xml = string.gsub(xml, ">", "&gt;")
+ xml = string.gsub(xml, "_", "\\hyxmp@prot@us ")
+ tex.print(cct, "____________<stFnt:" .. name .. ">" ..
+ xml .. "</stFnt:" .. name .. ">^^J%")
+ return
+ end
+ end
+ end
+ tex.print(cct, "\\hyxmp@add@to@xml{%")
+ tex.print(cct, "______<xmpTPg:Fonts>^^J%")
+ tex.print(cct, "________<rdf:Bag>^^J%")
+ for i, f in font.each() do
+ tex.print(cct, "__________<rdf:li rdf:parseType=\"Resource\">^^J%")
+ if f.filename then
+ local fname = string.gsub(f.filename, "^harfloaded:(.*)", "%1")
+ local info = fontloader.info(fname)
+ if info then
+ show_field("fontFace", info.fullname)
+ show_field("fontFamily", info.familyname)
+ show_field("fontName", info.fontname)
+ show_field("versionString", info.version)
+ end
+ local baseName = string.gsub(f.filename, ".*[/\\](.*)", "%1")
+ show_field("fontFileName", baseName)
+ else
+ show_field("fontName", f.psname, f.fullname, f.name)
+ end
+ if f.format and f.format ~= "unknown" then
+ show_field("fontType", f.format)
+ end
+ tex.print(cct, "__________</rdf:li>^^J%")
+ end
+ tex.print(cct, "________</rdf:Bag>^^J%")
+ tex.print(cct, "______</xmpTPg:Fonts>^^J%")
+ tex.print(cct, "}")
+end
+ \end{luacode*}
+\fi
+% \end{macrocode}
+%
+% \end{schemadesc}
+%
+%
% \subsubsection{XMP extension schemata}
% \label{sec:extension-schemata}
%
@@ -4767,13 +6346,11 @@ ______</Iptc4xmpCore:CreatorContactInfo>^^J%
% declare only those schemata we actually use.
%
% \begin{macro}{\hyxmp@check@iptc@data}
+% \begin{macro}{\hyxmp@iptc@data}
% Define |\hyxmp@iptc@data| as the concatenation of all \acro{IPTC}
% photo metadata supplied by the document.
% \begin{macrocode}
\newcommand*{\hyxmp@check@iptc@data}{%
-% \end{macrocode}
-% \begin{macro}{\hyxmp@iptc@data}
-% \begin{macrocode}
\edef\hyxmp@iptc@data{%
\@pdfcontactaddress
\@pdfcontactcity
@@ -4790,13 +6367,11 @@ ______</Iptc4xmpCore:CreatorContactInfo>^^J%
% \end{macro}
%
% \begin{macro}{\hyxmp@check@prism@data}
+% \begin{macro}{\hyxmp@prism@data}
% Define |\hyxmp@prism@data| as the concatenation of all \acro{PRISM}
% metadata supplied by the document.
% \begin{macrocode}
\newcommand*{\hyxmp@check@prism@data}{%
-% \end{macrocode}
-% \begin{macro}{\hyxmp@prism@data}
-% \begin{macrocode}
\edef\hyxmp@prism@data{%
\@pdfbookedition
\@pdfbytes
@@ -4818,6 +6393,20 @@ ______</Iptc4xmpCore:CreatorContactInfo>^^J%
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\hyxmp@check@jav@data}
+% \begin{macro}{\hyxmp@jav@data}
+% Define |\hyxmp@jav@data| as the concatenation of all \acro{JAV}
+% metadata supplied by the document.
+% \begin{macrocode}
+\newcommand*{\hyxmp@check@jav@data}{%
+ \edef\hyxmp@jav@data{%
+ \@pdfpubstatus
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\hyxmp@begin@extension@decls}
% Begin a block of \acro{XML} tags that indicates we're declaring one or
% more extension schemata.
@@ -4939,6 +6528,9 @@ ______________________</rdf:li>^^J%
% \begin{macro}{\hyxmp@mm@extensions}
% Declare the \acro{XMP} Media Management schema.
% \changes{v4.0}{2019/03/15}{Added this macro}
+% \changes{v5.5}{2020/07/23}{Corrected the type of
+% \protect\xmpprop{xmpMM:RenditionClass}. Thanks to Thorsten Wi{\ss}mann
+% for the bug report and patch}
% \begin{macrocode}
\newcommand*{\hyxmp@mm@extensions}{%
\hyxmp@begin@ext@decl
@@ -4960,6 +6552,7 @@ ______________________</rdf:li>^^J%
{internal}%
{Document version identifier}%
\hyxmp@declare@property
+ [RenditionClass]%
{RenditionClass}%
{internal}%
{The manner in which a document is rendered}%
@@ -5147,7 +6740,7 @@ __________</rdf:li>^^J%
\hyxmp@begin@ext@decl
{PRISM Basic Metadata}%
{prism}%
- {http://prismstandard.org/namespaces/basic/2.1/}%
+ {http://prismstandard.org/namespaces/basic/3.0/}%
\hyxmp@declare@property
{complianceProfile}%
{internal}%
@@ -5216,6 +6809,29 @@ __________</rdf:li>^^J%
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\hyxmp@jav@extensions}
+% \changes{v5.5}{2020/07/23}{Added this macro}
+% Because \acro{JAV} metadata are not recognized by the \acro{PDF/A}
+% standard, \acro{PDF/A} conversion would normally fail for documents
+% that utilize \acro{JAV} metadata. Declaring the \acro{JAV} metadata
+% we support enables the document to be converted to \acro{PDF/A}
+% format.
+% \begin{macrocode}
+\newcommand*{\hyxmp@jav@extensions}{%
+ \hyxmp@begin@ext@decl
+ {NISO/ALPSP Journal Article Versions}%
+ {jav}%
+ {http://www.niso.org/schemas/jav/1.0/}%
+ \hyxmp@declare@property
+ [Closed Choice of Text]%
+ {journal_article_version}%
+ {external}%
+ {Article status, one of "AO", "SMUR", "AM", "P", "VoR", "CVoR", or "EVoR"}%
+ \hyxmp@end@ext@decl
+}%
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\hyxmp@declare@extensions}
% Declare all \acro{XMP} extension schemata. We'll always have at least
% one, the \acro{XMP} Media Management extensions, because we
@@ -5272,6 +6888,13 @@ __________</rdf:li>^^J%
\hyxmp@prism@extensions
\fi
% \end{macrocode}
+% Conditionally declare \acro{JAV} metadata.
+% \begin{macrocode}
+ \ifx\hyxmp@jav@data\@empty
+ \else
+ \hyxmp@jav@extensions
+ \fi
+% \end{macrocode}
% \begin{macrocode}
\hyxmp@end@extension@decls
}
@@ -5336,7 +6959,10 @@ _____________________xmlns:pdfaid="http://www.aiim.org/pdfa/ns/id/"^^J%
_____________________xmlns:pdfuaid="http://www.aiim.org/pdfua/ns/id/"^^J%
_____________________xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/"^^J%
_____________________xmlns:pdfxid="http://www.npes.org/pdfx/ns/id/"^^J%
-_____________________xmlns:prism="http://prismstandard.org/namespaces/basic/2.1/"^^J%
+_____________________xmlns:prism="http://prismstandard.org/namespaces/basic/3.0/"^^J%
+_____________________xmlns:jav="http://www.niso.org/schemas/jav/1.0/"^^J%
+_____________________xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"^^J%
+_____________________xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font\hyxmp@hash"^^J%
_____________________xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"^^J%
_____________________xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/"^^J%
_____________________xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema\hyxmp@hash"^^J%
@@ -5349,6 +6975,7 @@ _____________________xmlns:pdfaField="http://www.aiim.org/pdfa/ns/field\hyxmp@ha
% \begin{macrocode}
\hyxmp@check@iptc@data
\hyxmp@check@prism@data
+ \hyxmp@check@jav@data
\hyxmp@declare@extensions
% \end{macrocode}
% Insert all the metadata we know how to insert.
@@ -5364,6 +6991,8 @@ _____________________xmlns:pdfaField="http://www.aiim.org/pdfa/ns/field\hyxmp@ha
\hyxmp@mm@schema
\hyxmp@iptc@schema
\hyxmp@prism@schema
+ \hyxmp@jav@schema
+ \hyxmp@xmptpg@schema
\hyxmp@add@to@xml{%
____</rdf:Description>^^J%
__</rdf:RDF>^^J%
@@ -5409,7 +7038,7 @@ __</rdf:RDF>^^J%
\@ifundefined{pdfmark}{%
\PackageWarningNoLine{hyperxmp}{%
Unrecognized hyperref driver `\Hy@driver'.\MessageBreak
- \jobname.tex's XMP metadata will *not* be\MessageBreak
+ \hyxmp@jobname.tex's XMP metadata will *not* be\MessageBreak
embedded in the resulting file}%
}{%
\hyxmp@embed@packet@pdfmark
@@ -5640,6 +7269,15 @@ __</rdf:RDF>^^J%
% \subsection{Final clean-up}
% \label{sec:clean-up}
%
+% As explained in Section~\ref{sec:initial-prep}, all invocations of
+% \cs{AtEndPreamble} have been stored in \cs{hyxmp@aep@toks} rather than
+% executed. Now that \pkgname{hyperxmp} has been initialized
+% completely, it is finally safe to execute the accumulated
+% \cs{AtEndPreamble} stanzas.
+% \begin{macrocode}
+\the\hyxmp@aep@toks
+% \end{macrocode}
+%
% Having saved the category code of
% ``\,{\fontencoding{T1}\selectfont\textquotedbl}\,'' at the start of
% the package code (Section~\ref{sec:initial-prep}), we now restore that
@@ -5675,6 +7313,7 @@ __</rdf:RDF>^^J%
% file, which offers the benefit of live hyperlinks in almost all
% \acro{PDF} readers.
%
+%
% \subsection{Ensuring proper support}
%
% \begin{macro}{\next}
@@ -5719,6 +7358,7 @@ __</rdf:RDF>^^J%
\typeout{Generating PDF/A-1b compliant hyperxmp documentation.}
% \end{macrocode}
%
+%
% \subsection{Complying with the PDF/A-1b standard}
%
% We can't specify \PDFstd{A}{1}{b}{} compliance until after both
diff --git a/Master/texmf-dist/source/latex/hyperxmp/hyperxmp.ins b/Master/texmf-dist/source/latex/hyperxmp/hyperxmp.ins
index 7a819746049..81db9d155a9 100644
--- a/Master/texmf-dist/source/latex/hyperxmp/hyperxmp.ins
+++ b/Master/texmf-dist/source/latex/hyperxmp/hyperxmp.ins
@@ -5,9 +5,9 @@
%% 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/05/04 or later.
%%
diff --git a/Master/texmf-dist/source/latex/intopdf/intopdf.dtx b/Master/texmf-dist/source/latex/intopdf/intopdf.dtx
index 903e295b801..64878391d8d 100644
--- a/Master/texmf-dist/source/latex/intopdf/intopdf.dtx
+++ b/Master/texmf-dist/source/latex/intopdf/intopdf.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% Copyright (C) 2018 by Marcel Krueger
+%% Copyright (C) 2020 by Marcel Krueger
%%
%% This file may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
@@ -20,6 +20,7 @@
%</gobble>
\input l3docstrip.tex
\keepsilent
+\askforoverwritefalse
\preamble
\endpreamble
\generate{\file{intopdf.sty}{\from{intopdf.dtx}{package}}}
@@ -46,7 +47,7 @@
%
% \GetFileInfo{intopdf.dtx}
% \title{The \pkg{intopdf} package\thanks{This document
-% corresponds to \pkg{intopdf}~0.2.1, dated~2019/05/28.}}
+% corresponds to \pkg{intopdf}~0.3.0, dated~2020/03/13.}}
% \author{Marcel Kr\"uger \\ \href{mailto:tex@2krueger.de}{tex@2krueger.de}}
%
% \maketitle
@@ -89,11 +90,11 @@
\RequirePackage{expl3,xparse}
\ProvidesExplPackage
{intopdf}
- {2019/05/28}
- {0.2.1}
+ {2020/03/13}
+ {0.3.0}
{Embed non-PDF files into PDF with hyperlink}
-\RequirePackage{hyperref}
+\RequirePackage{l3pdf,hyperref}
%</package>
% \fi
% \changes{v0.1.0}{2018/03/15}{Added \LuaLaTeX\ support}
@@ -111,79 +112,32 @@
{pdftex}{
\cs_new:Nn\__intopdf_escape_name:n{\pdfescapename{#1}}
\cs_new:Nn\__intopdf_escape_string:n{(\pdfescapestring{#1})}
- \cs_new:Nn\__intopdf_pdfobj:n{
- \tex_immediate:D\pdftex_pdfobj:D{<<#1>>}
- }
- \cs_new:Nn\__intopdf_pdfstream_file:nn{
- \tex_immediate:D\pdftex_pdfobj:D stream attr {#1} file {#2}
- }
- \cs_new:Nn\__intopdf_lastobj_ref:{
- \c_space_tl
- \int_use:N\pdftex_pdflastobj:D
- \c_space_tl
- 0
- \c_space_tl
- R
- }
- \cs_new:Npn\__intopdf_annot:nnw#1#2{
- \leavevmode
- \pdftex_pdfstartlink:D attr{#1} user {#2}
- }
- \cs_new:Nn\__intopdf_annot_end:{
- \pdftex_pdfendlink:D
- }
}
{luatex}{
\RequirePackage{pdftexcmds}
\cs_new:Nn\__intopdf_escape_name:n{\pdf@escapename{#1}}
\cs_new:Nn\__intopdf_escape_string:n{(\pdf@escapestring{#1})}
- \cs_new:Nn\__intopdf_pdfobj:n{
- \tex_immediate:D\luatex_pdfextension:D obj{<<#1>>}
- }
- \cs_new:Nn\__intopdf_pdfstream_file:nn{
- \tex_immediate:D\luatex_pdfextension:D obj stream attr {#1} file {#2}
- }
- \cs_new:Nn\__intopdf_lastobj_ref:{
- \c_space_tl
- \luatex_pdffeedback:D lastobj
- \c_space_tl
- 0
- \c_space_tl
- R
- }
- \cs_new:Npn\__intopdf_annot:nnw#1#2{
- \leavevmode
- \luatex_pdfextension:D startlink attr{#1} user {#2}
- }
- \cs_new:Nn\__intopdf_annot_end:{
- \luatex_pdfextension:D endlink
- \scan_stop:
- }
}
}{
\msg_critical:nn{intopdf}{engine-unsupported}
}
-\cs_new:Nn\__intopdf_annot:nnn{
- \__intopdf_annot:nnw{#1}{#2}
- #3
- \__intopdf_annot_end:
-}
% \end{macrocode}
% \begin{macro}{\attachandlink,\intopdf_attach_link:nnnnn,\intopdf_attach_link:nnnn}
% \changes{v0.2.0}{2019/05/21}{Added filespec support. (The first optional argument) Added \cs{intopdf_attach_link:nnnnn}.}
+% \changes{v0.3.0}{2020/03/13}{Switched to \texttt{l3pdf} instead of using primitives directly. Currently some internal functions from \texttt{l3backend} are needed too for handling links.}
% The main functionality.
% \begin{macrocode}
\cs_new_protected:Nn\intopdf_attach_link:nnnnn{
- \__intopdf_pdfstream_file:nn{
- /Subtype /\__intopdf_escape_name:n{#3}
- }{#2}
- \__intopdf_pdfobj:n{
+ \pdf_object_now:nx {fstream} { {
+ /Subtype /\__intopdf_escape_name:n { #3 }
+ } { #2 } }
+ \pdf_object_now:nx {dict} {
/Type /Filespec
- /F \__intopdf_escape_string:n{#1}
- /EF << /F \__intopdf_lastobj_ref: >>
- /Desc \__intopdf_escape_string:n{#4}
- }%
- \__intopdf_annot:nnn{
+ /F \__intopdf_escape_string:n { #1 }
+ /EF << /F~\pdf_object_last: >>
+ /Desc \__intopdf_escape_string:n { #4 }
+ }
+ \__pdf_backend_link_begin_user:nnw {
\Hy@setpdfborder
\tl_if_empty:NF\@pdfhighlight{
/H\@pdfhighlight
@@ -193,17 +147,17 @@
}
}{
/Subtype /Link
- }{
- \__intopdf_annot:nnn{}{
+ }
+ \__pdf_backend_link_begin_user:nnw { } {
/Subtype /FileAttachment
- /FS \__intopdf_lastobj_ref:
- /F\c_space_tl 416
- /CA\c_space_tl 0
+ /FS~\pdf_object_last:
+ /F~416
+ /CA~0
/Contents \__intopdf_escape_string:n{#4}
- }{
- #5
}
- }
+ #5
+ \__pdf_backend_link_end:
+ \__pdf_backend_link_end:
}
\cs_new_protected:Npn \intopdf_attach_link:nnnn #1{
\intopdf_attach_link:nnnnn{#1}{#1}
diff --git a/Master/texmf-dist/source/latex/isodoc/Makefile b/Master/texmf-dist/source/latex/isodoc/Makefile
new file mode 100644
index 00000000000..bbf08f28900
--- /dev/null
+++ b/Master/texmf-dist/source/latex/isodoc/Makefile
@@ -0,0 +1,71 @@
+NAME = isodoc
+SHELL = bash
+PWD = $(shell pwd)
+VERS = $(shell ltxfileinfo -v $(NAME).dtx|sed -e 's/^v//')
+LOCAL = $(shell kpsewhich --var-value TEXMFLOCAL)
+UTREE = $(shell kpsewhich --var-value TEXMFHOME)
+LTX = lualatex -shell-escape -recorder -interaction=batchmode >/dev/null
+
+$(NAME).pdf: $(NAME).dtx accept.pdf invoice.pdf letter.pdf logoletter.pdf ntgletter.pdf logo1.pdf logo2.pdf
+ $(LTX) $(NAME).dtx
+ if [ -f $(NAME).glo ]; then makeindex -q -s gglo.ist -o $(NAME).gls $(NAME).glo; fi
+ if [ -f $(NAME).idx ]; then makeindex -q -s gind.ist -o $(NAME).ind $(NAME).idx; fi
+ $(LTX) $(NAME).dtx
+ $(LTX) $(NAME).dtx
+accept.pdf: accept.tex accept.sty acceptform.jpg ntgcolor.png
+ chmod 755 *.sh
+ texi2dvi -p -q accept.tex
+invoice.pdf: invoice.tex invoice.sty
+ texi2dvi -p -q invoice.tex
+letter.pdf: letter.tex letter.sty signmarked.png
+ texi2dvi -p -q letter.tex
+logoletter.pdf: logoletter.tex logoletter.sty body.tex shiva-shakti.png signblue.png
+ LATEX=lualatex texi2dvi -q logoletter.tex
+logo1.pdf logo2.pdf: logoletter.pdf
+ pdfseparate -l 2 logoletter.pdf logo%d.pdf
+ntgletter.pdf: ntgletter.tex ntgletter.sty ntgcolor.png signshort.png signlong.png
+ texi2dvi -p -q ntgletter.tex
+iolang ChopinScript.ttf body.tex acceptform.jpg ntgcolor.png shiva-shakti.png sign.png signblue.png signlong.png signmarked.png signshort.png: files.zip
+ unzip -oqDD files.zip
+ mkdir -p ~/.fonts
+ cp -u *.ttf ~/.fonts
+files.zip: files.zip.uue
+ uudecode files.zip.uue
+files.zip.uue accept.tex accept.sty invoice.tex invoice.sty letter.tex letter.sty logoletter.tex logoletter.sty ntgletter.tex ntgletter.sty: isodoc.dtx isodoc.ins
+ luatex isodoc.ins
+clean:
+ ./iolang -i 2> /dev/null
+ echo lang iolang README Makefile files.zip{,.uue} \
+ {Chopin,Fontin}*.ttf acceptform.jpg body.tex listkeys.sh logo[12].pdf \
+ {ntgcolor,shiva-shakti,sign{,blue,long,marked,short}}.png \
+ {accept,invoice,isodoc,{,logo,ntg}letter}.{aux,fls,log,out,pdf,sty,t2d,tex,cls,fls,glo,gls,idx,ilg,ind,sty,toc}|xargs rm -rf
+inst: $(NAME).pdf
+ mkdir -p $(UTREE)/{tex,source,doc}/latex/$(NAME)
+ rm -rf $(UTREE)/{tex,source,doc}/latex/$(NAME)/*
+ cp $(NAME).dtx $(UTREE)/source/latex/$(NAME)
+ cp $(NAME).cls $(UTREE)/tex/latex/$(NAME)
+ cp $(NAME).pdf README.md $(UTREE)/doc/latex/$(NAME)
+install: $(NAME).pdf
+ sudo mkdir -p $(LOCAL)/{tex,source,doc}/latex/$(NAME)
+ sudo rm -rf $(LOCAL)/{tex,source,doc}/latex/$(NAME)/*
+ sudo cp $(NAME).dtx $(LOCAL)/source/latex/$(NAME)
+ sudo cp $(NAME).cls $(LOCAL)/tex/latex/$(NAME)
+ sudo cp $(NAME).pdf README.md $(LOCAL)/doc/latex/$(NAME)
+zip: $(NAME).pdf
+ ln -sf . $(NAME)
+ zip -Drq $(PWD)/$(NAME)-$(VERS).zip $(NAME)/{README.md,$(NAME).{pdf,dtx,ins}}
+ rm $(NAME)
+help:
+ @ echo "make help Print this help"
+ @ echo
+ @ echo "make Create the documentation"
+ @ echo " (note: creates some truetype font files in ~/.fonts)"
+ @ echo
+ @ echo "make inst Install the necessary files in the TEXMFHOME tree"
+ @ echo
+ @ echo "make install Install the necessary files in the TEXMFLOCAL tree"
+ @ echo " (You must have sudo rights)"
+ @ echo
+ @ echo "make zip Create a zip file for upload to CTAN"
+ @ echo
+ @ echo "make clean Remove all regeneratable files, except isodoc-*.zip"
diff --git a/Master/texmf-dist/source/latex/isodoc/isodoc.dtx b/Master/texmf-dist/source/latex/isodoc/isodoc.dtx
index e31f446e19b..777f91404bd 100644
--- a/Master/texmf-dist/source/latex/isodoc/isodoc.dtx
+++ b/Master/texmf-dist/source/latex/isodoc/isodoc.dtx
@@ -19,7 +19,6 @@
% This work consists of the files isodoc.dtx and isodoc.ins
%
% \fi
-% \CheckSum{2968}
%
% \iffalse
%<*driver>
@@ -28,7 +27,7 @@
%<class>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<class>\ProvidesClass{isodoc}%
%<*class>
- [2018/05/29 v1.10 isodoc class for letters and invoices]
+ [2021/02/20 v1.12 isodoc class for letters and invoices]
%</class>
%<*driver>
\documentclass{ltxdoc}
@@ -42,7 +41,6 @@
\newfontfeature{Microtype}{protrusion=default;expansion=default}
\directlua{fonts.protrusions.setups.default.factor=.5}
\setmainfont[Microtype,
- Numbers={OldStyle, Proportional},
Ligatures=TeX,
ItalicFont=Fontin-Italic,
BoldFont=Fontin-Bold,
@@ -68,7 +66,7 @@
\includegraphics[width=.99\textwidth]{#1}\\[-.85ex]
}
}
-\def\transparent{}
+\def\transparent#1{}
\newcommand{\OPTS}[3]{
\smallskip\noindent
\subsubsection*{#1}
@@ -290,6 +288,23 @@
% \changes{v1.10}{2018/05/29}{
% - honor a few luatex modifications
% }
+% \changes{v1.11}{2020/06/11}{
+% - use memoir instead of article class for more flexibility
+% - font in ‘preprinted’ headers can now be set with headfont macro
+% - an empty closing and its closingcomma will not be typeset at all
+% - Swedish terminology revisited (thanks Bo Thidé)
+% - Obsolete language keys removed
+% - Country code in zip code now followed by dash instead of space
+% - daystext was typeset twice
+% - payment data terminology and footer headers all lower case
+% (except for German)
+% }
+% \changes{v1.12}{2021/02/20}{
+% - For some reason letter body now needs to start with par command, can't find
+% out which package causes this.
+% - isodoc.ins syntax did'nt work, probably because of changes in luatex?
+% - small changes because of move from bitbucket to github
+% }
% \DoNotIndex{%
% \,\",\',\@auxout,\AtBeginDocument,\AtEndDocument,\AtEndOfClass,\ClassError,
% \ClassWarning,\CurrentOption,\DeclareOption,\DescribeMacro,\ForEachX,
@@ -427,9 +442,8 @@
% language here, please send me your translations and your language will
% be added.
%
-% The |language| option sets the language, en-GB is used by
-% default.\footnote{The options |dutch, english, american, german,| and
-% |french| still work, but are obsolete and will be removed in a future version.}}{
+% The |language| option sets the language, en-GB is used by default.
+% }{
% \T{language\dts} & sets the interface language to any language defined by
% the class. Currently these are: en-GB, en-US, fr-FR,
% de-DE, nl-NL, nl-BE, it-IT, es-ES, ca-ES, nb-NO, sr-RS;
@@ -494,12 +508,14 @@
% option has been set to) instead of just a 0.\NN
% }
%
-% \OPTS{Address window}{The addressee's address is printed in a window. The
-% width of the window is two columns (70 mm), and its contents are vertically
-% centered in it. There are no limits to the vertical size of the
-% window, other than the physical size of the window in the envelopes you use.
-% The vertical position of the window's center is set with the \T{addresscenter}
-% keyword. Horizontally there are two options: left or right.}{
+% \OPTS{Address window}{The addressee's address is printed in a window.
+% The width of the window is two columns (70 mm), and its contents are
+% vertically centered in it. There are no limits to the vertical size of
+% the window, other than the physical size of the window in the
+% envelopes you use. The vertical position of the window's center is set
+% with the \T{addresscenter} keyword. Horizontally there are two
+% options: left or right.
+% }{
% \T{leftaddress} & Places the window over columns 2 and 3; this is the
% default.\NN
% \T{rightaddress} & Places the window over columns 4 and 5.\NN
@@ -539,14 +555,16 @@
% bullets.\NN
% }
%
-% \OPTS{Header fields}{Under the address window, a header is printed. The
-% page is vertically divided in six columns, one each for the left and right
-% margins, and four which, in the header,
-% say: \textit{Your letter of}, \textit{Your reference}, \textit{Our reference},
-% and \textit{Date}, each with their respective contents under them. If the
-% \T{subject} keyword is used, an extra line starting with \textit{Subject:} will
-% appear, followed by the contents on the same line and over a width of 2.5
-% columns. If needed, extra lines will be used.}{
+% \OPTS{Header fields}{Under the address window, a header is printed.
+% The page is vertically divided in six columns, one each for the
+% left and right margins, and four which, in the header, say:
+% \textit{Your letter of}, \textit{Your reference}, \textit{Our
+% reference}, and \textit{Date}, each with their respective contents
+% under them. If the \T{subject} keyword is used, an extra line
+% starting with \textit{Subject:} will appear, followed by the
+% contents on the same line and over a width of 2.5 columns. If
+% needed, extra lines will be used.
+% }{
% \T{bodyshift\dts} & The header starts 98mm from the top of the paper,
% but it can be shifted with the |bodyshift| option.\NN
% \T{[no]header} & The |noheader| option disables all header fields, the
@@ -579,9 +597,11 @@
% subject text is typeset in bold face.\NN
% }
% \vskipbackhack
-% \OPTS{Opening and Closing}{A letter is started with an opening -- something
-% like «Dear John», and ended with a closing -- something like
-% «Regards,\T{<newline>}Betty», perhaps with an autograph (or white space) in between.}{
+% \OPTS{Opening and Closing}{A letter is started with an opening --
+% something like «Dear John», and ended with a closing -- something
+% like «Regards,\T{<newline>}Betty», perhaps with an autograph (or
+% white space) in between.
+% }{
% \T{opening\dts} & Dear John\NN
% \T{openingcomma\dts} & by default, the opening phrase is followed by a comma, but you
% can change that here.\NN
@@ -622,10 +642,15 @@
% be influenced with the dimen |\copytoskip|, default |\baselineskip|}\NN
% }
%
-% \OPTS{Footer fields}{If the \T{footer} option is used, up to five footer fields are shown
-% in the order defined in the \T{footorder} option; available fields, defined with options of
-% the same name, are currently \T{website}, \T{phone}, \T{cellphone}, \T{fax}, \T{email}. and
-% \T{creditorid}.}{
+% \OPTS{Footer fields}{Footer fields are meant to be used for contact
+% information. Any other information, like a VAT number, should go to a
+% relevant place. The VAT number, for example, could go to the payment
+% information in an invoice. Or it can be incorporated into a user-
+% defined logo.\par If the \T{footer} option is used, up to five footer
+% fields are shown in the order defined in the \T{footorder} option;
+% available fields, defined with options of the same name, are currently
+% \T{website}, \T{phone}, \T{cellphone}, \T{fax} and \T{email}.
+% }{
% \T{[no]footer} & enables or disables printing a page footer; there is room
% for up to four fields, if you set five fields, the last
% one will appear in the right margin.\NN
@@ -649,14 +674,14 @@
% \T{cellphone\dts} & same for cellphone...\NN
% \T{fax\dts} & fax...\NN
% \T{email\dts} & email...\NN
-% \T{website\dts} & website...\NN
-% \T{creditorid\dts} & and creditorid,\NN
+% \T{website\dts} & and website.\NN
% }
%
-% \OPTS{Folding marks}{Folding marks can be useful, particularly if your address
-% window is used to its limits. Correctly folding your letter then prevents
-% parts of the address to become invisible because of the letter loosely filling
-% the envelope.}{
+% \OPTS{Folding marks}{Folding marks can be useful, particularly if your
+% address window is used to its limits. Correctly folding your letter
+% then prevents parts of the address to become invisible because of the
+% letter loosely filling the envelope.
+% }{
% \T{nofold} & Disable folding marks.\NN
% \T{foldleft} & The folding mark is printed in the left margin.\NN
% \T{foldright} & The folding mark is printed in the right margin. This is the default.\NN
@@ -671,12 +696,14 @@
% from the top of the paper.\NN
% }
%
-% \OPTS{Payment data}{In invoices you probably want to make clear where you want
-% your debtor to transfer his money to. You can do so by calling
-% the \C{paymentdata} command, which generates a little table containing these data.
-% The contents of this table can be defined with the keywords below;
-% they are listed in the order presented here, but the order, as well as the selection
-% of data can be modified with the |paymentorder| option. Only non-empty data will be listed.}{
+% \OPTS{Payment data}{In invoices you probably want to make clear where
+% you want your debtor to transfer his money to. You can do so by
+% calling the \C{paymentdata} command, which generates a little table
+% containing these data. The contents of this table can be defined with
+% the keywords below; they are listed in the order presented here, but
+% the order, as well as the selection of data can be modified with the
+% |paymentorder| option. Only non-empty data will be listed.
+% }{
% \T{term\dts} & Payment term in days; default is 30.\NN
% \T{bankname\dts} & The name of your bank, like Barclays.\NN
% \T{bic\dts} & Your bank's \textsc{bic} code in lower case; will be typeset
@@ -694,22 +721,24 @@
% \T{vatno\dts} & Your \textsc{vat} reference number.\NN
% \T{chamber\dts} & Your Chamber of Commerce subscription number.\NN
% \T{paymentorder\dts} & Sets the selection and order of the above data.
-% The argument must be semicolon-separated string containng the names of
-% the data to be listed (if non-empty.) The default for the string is
+% The argument must be semicolon-separated
+% string containg the names of the data to be
+% listed (if non-empty.) The default for the string is
% |term;bankname;bic;routingno;iban;accountno;accountname;|
% |payref;vatno;chamber|.\NN
% \T{currency\dts} & Currency; default is euro. Appears in the invoice table,
% not in the payment data table.\NN
-% \T{creditorid\dts} & The SEPA-related creditor id.\footnote{See also under
-% \textit{Footer fields}. Currently the texts for the |creditorid| and
-% |mandateid| options, which are defined in |\creditoridtext| and
-% |\mandateidtext|, are the same in all languages («Creditor ID» and
-% «Mandate ID») except for the Dutch language. Please inform the
-% author about the correct translation in your language!}\NN
+% \T{creditorid\dts} & The SEPA-related creditor id.\footnote{Currently the texts for the
+% |creditorid| and |mandateid| options, which are defined in
+% |\creditoridtext| and |\mandateidtext|, are the same in all
+% languages («Creditor ID» and «Mandate ID») except for the Dutch
+% language. Please inform the author about the correct translation
+% in your language!}\NN
% \T{mandateid\dts} & The SEPA-related mandate id.\NN
% }
%
-% \OPTS{Accept data}{These keys pertain to data needed for accept forms:}{
+% \OPTS{Accept data}{These keys pertain to data needed for accept forms:
+% }{
% \T{acceptaccount\dts} & Payer's bank account number\NN
% \T{acceptaddress\dts} & Payer's address lines, separated with \C{}\C{}\NN
% \T{accepteuros\dts} & Euro part of the amount to be paid\NN
@@ -1063,9 +1092,9 @@
\ClassError{isodoc}{Compile me with pdflatex, lualatex or xelatex!}{}
\fi
\fi
-\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{memoir}}
\ProcessOptions
-\LoadClass{article}
+\LoadClass{memoir}
% \end{macrocode}
% We use |\ctable| floats here, and we need |ctable|'s commands for decent
% spacing in tables and more. |ctable| also brings us |array|, |tabularx|,
@@ -1081,9 +1110,14 @@
% 35mm each: a left margin, 4 fields, and a right margin.
%
% \begin{macrocode}
-\RequirePackage[head=\baselineskip,foot=\f@size pt]{geometry}
+\setstocksize{297mm}{210mm}
+\settrimmedsize{\stockheight}{\stockwidth}{*}
+\settypeblocksize{237mm}{140mm}{*}
+\setlrmargins{*}{*}{1}
+\setulmargins{35mm}{*}{*}
+\setheadfoot{\baselineskip}{\baselineskip}
+\checkandfixthelayout
\RequirePackage[absolute,overlay]{textpos}
-\geometry{papersize={210mm,297mm},margin=35mm,bottom=25mm}
\TPGrid{210}{297}
% \end{macrocode}
% Several colors can be changed, by using the |\definecolor| command;
@@ -1114,11 +1148,12 @@
\definecolor{isodocpink}{rgb}{1,.7,.7}
\def\Undefined#1{\fboxsep1pt\colorbox{isodocpink}{\strut Undefined #1}}
% \end{macrocode}
+% \DescribeMacro{headfont}
% A small sans serif font is used for header and footer field names and the
% sender's address information. The idea is that this is used for all
-% pre-printed text on the letter paper.
+% pre-printed text on the letter paper.\\
% \begin{macrocode}
-\def\@hft{\footnotesize\sffamily\color{headcolor}}
+\def\headfont{\footnotesize\sffamily\color{headcolor}}
% \end{macrocode}
% \subsection{The options and their defaults}
% \subsubsection{General options}
@@ -1155,25 +1190,9 @@
\define@key{isodoc}{cityzip}[\cityziptrue]{\cityziptrue}
\newif\ifcityzip\cityzipfalse
% \end{macrocode}
-% \DescribeMacro{dutch}
-% \DescribeMacro{english}
-% \DescribeMacro{german}
-% \DescribeMacro{american}
-% \DescribeMacro{french}
% \DescribeMacro{language}
-% The following keys set the language; en-GB, set at the |\EndOfClass| is the
-% default.
+% Set the language; en-GB, set at the |\EndOfClass| is the default.
% \begin{macrocode}
-\define@key{isodoc}{dutch} []{\isodoc@nlNL
- \ClassWarning{isodoc}{the option dutch is obsolete: use language=nl-NL}}
-\define@key{isodoc}{english} []{\isodoc@enGB
- \ClassWarning{isodoc}{the option english is obsolete: use language=en-GB}}
-\define@key{isodoc}{german} []{\isodoc@deDE
- \ClassWarning{isodoc}{the option german is obsolete: use language=de-DE}}
-\define@key{isodoc}{american}[]{\isodoc@enUS
- \ClassWarning{isodoc}{the option american is obsolete: use language=en-US}}
-\define@key{isodoc}{french} []{\isodoc@frFR
- \ClassWarning{isodoc}{the option french is obsolete: use language=fr-FR}}
\define@key{isodoc}{language}{
\StrSubstitute{#1}{-}{}[\@iso]\csname isodoc@\@iso\endcsname}
% \end{macrocode}
@@ -1232,7 +1251,7 @@
\def\countrycode{\Undefined{countrycode}}
\define@key{isodoc}{zip} {\def\zip{#1}}
\def\zip{\Undefined{zip}}
-\def\prezip{\ifforeign\countrycode\else\fi}
+\def\prezip{\ifforeign\countrycode-\else\fi}
% \end{macrocode}
% \subsubsection{Address window}
% \DescribeMacro{leftaddress}
@@ -1317,8 +1336,8 @@
% to print all non-empty values.
% \begin{macrocode}
\define@key{isodoc}{paymentorder} {\def\isodoc@paymentorder{#1}}
-\def\isodoc@paymentorder{term;bankname;bic;routingno;iban;accountno;accountname;%
-payref;vatno;chamber}
+\def\isodoc@paymentorder{term;bankname;bic;routingno;iban;accountno;%
+accountname;payref;vatno;chamber}
% \end{macrocode}
%
% \subsubsection{Footer}
@@ -1527,7 +1546,7 @@ payref;vatno;chamber}
% Invoices need to state some specific data, like account data and term of
% payment:
% \begin{macrocode}
-\define@key{isodoc}{term}[30 \daystext]{\def\term{#1 \daystext}}
+\define@key{isodoc}{term}[30]{\def\term{#1 \daystext}}
\def\term{}
\define@key{isodoc}{accountno} {\def\accountno{#1}}
\def\accountno{}
@@ -1675,10 +1694,12 @@ payref;vatno;chamber}
\def\autograph#1#2#3#4#5#6{%
\iso@isNum{#3}{3}\iso@isNum{#4}{4}\iso@isNum{#5}{5}
\ifnum #1<2
- \ClassError{isodoc}{autograph #1 cannot be changed (first arg must be 2..9)}{}
+ \ClassError{isodoc}
+ {autograph #1 cannot be changed (first arg must be 2..9)}{}
\fi
\ifnum #1>9
- \ClassError{isodoc}{autograph #1 cannot be changed (first arg must be 2..9)}{}
+ \ClassError{isodoc}
+ {autograph #1 cannot be changed (first arg must be 2..9)}{}
\fi
\bgroup
\lccode`2=`A \lccode`6=`E
@@ -1694,7 +1715,9 @@ payref;vatno;chamber}
\hspace*{\iso@outdent}%
\raisebox{\iso@down}[0pt][0pt]{\includegraphics[height=#2]{#6}}%
\\[\baselineskip]%
- \closing\@closingcomma\\[\iso@signpos]\\[-2\baselineskip]%
+ \ifx\closing\empty\else
+ \closing\@closingcomma\\[\iso@signpos]\\[-2\baselineskip]
+ \fi%
\signature%
}
}
@@ -1706,8 +1729,8 @@ payref;vatno;chamber}
% \DescribeMacro{\logo}
% \begin{macrocode}
\newcommand{\zippedcity}{%
- \ifcityzip\city\ \prezip\ \zip\else
- \prezip\ \zip\ \city\fi
+ \ifcityzip\city\ \prezip\zip\else
+ \prezip\zip\ \city\fi
}
\newcommand{\logo}{\if@isodoclogo%
{ \parskip=0pt\parindent=0pt
@@ -1892,7 +1915,8 @@ payref;vatno;chamber}
% hyperref is needed in all docs for the pdfinfo settings
% \begin{macrocode}
\AtEndOfClass{%
- \usepackage{hyperref}
+ \RequirePackage{hyperref}
+ \RequirePackage{memhfixc}
}
% \end{macrocode}
% \DescribeMacro{@isodocheadXX}
@@ -2048,32 +2072,32 @@ payref;vatno;chamber}
\end{textblock}
}
\subjectpos=\headerpos
- \textskip=\headerpos\advance\textskip-12
+ \textskip=\headerpos\advance\textskip-14
\ifx\subject\empty\advance\textskip-10\else\advance\subjectpos10\fi
\openingpos=\subjectpos
\ifheader
\openingpos=\subjectpos\advance\openingpos12
\isodoc@Tbox{35}{\headerpos}{35}{\noindent
- {\@hft\yourlettertext}\\
+ {\headfont\yourlettertext}\\
\yourletter
}
\isodoc@Tbox{70}{\headerpos}{35}{\noindent
- {\@hft\yourreftext}\\
+ {\headfont\yourreftext}\\
\raggedright\yourref
}
\isodoc@Tbox{105}{\headerpos}{35}{\noindent
- {\@hft\ourreftext}\\
+ {\headfont\ourreftext}\\
\raggedright\ourref
}
\isodoc@Tbox{140}{\headerpos}{35}{\noindent
- {\@hft\datetext}\\
+ {\headfont\datetext}\\
\date
}
\ifx\subject\empty\else%
\isodoc@Tbox{35}{\subjectpos}{140}{\noindent
\ifx\subjecttext\empty{\bfseries\subject}\else%
\begin{tabularx}{\hsize}{@{}l>{\raggedright}X@{}}
- \@hft\subjecttext&\subject
+ \headfont\subjecttext:&\subject
\end{tabularx}
\fi
}
@@ -2096,7 +2120,7 @@ payref;vatno;chamber}
\noindent\isodoc@Tbox{35}{\openingpos}{140}{\opening\@openingcomma}
\vspace{\textskip mm}
\thispagestyle{empty}
- \noindent\ignorespaces#2
+ \par\noindent\ignorespaces#2
\ifclosing{\vskip\closingskip\vskip-\baselineskip
\parindent=0pt\parskip=\baselineskip\noindent
\begin{minipage}[t]{\hsize}
@@ -2121,14 +2145,14 @@ payref;vatno;chamber}
\noindent
\begin{minipage}[t]{\hsize}
\setbox1=\vbox{\enclosures}%
- \textbf{\ifdim\ht1>\baselineskip\enclosurestext\else\enclosuretext\fi}\\
+ \textbf{\ifdim\ht1>\baselineskip\enclosurestext\else\enclosuretext\fi:}\\
\enclosures
\end{minipage}
}\fi
\ifx\copyto\empty\else{\\[\copytoskip]
\noindent
\begin{minipage}[t]{\hsize}
- \textbf{\copytotext}\\
+ \textbf{\copytotext:}\\
\copyto
\end{minipage}
}\fi
@@ -2148,7 +2172,7 @@ payref;vatno;chamber}
\setbox0=\hbox{\csname @\thislevelitem\endcsname}
\ifdim\wd0=0pt\else
\isodoc@Tbox{\footcount}{\footerpos}{35}{\noindent
- {\@hft\csname\thislevelitem text\endcsname}\\
+ {\headfont\csname\thislevelitem text\endcsname}\\
\csname @\thislevelitem\endcsname
}
\fi
@@ -2238,43 +2262,49 @@ payref;vatno;chamber}
% Catalan---contributed by Cristian Peraferrer:
% \begin{macrocode}
\def\isodoc@caES{%
- \gdef\paymentdatatext {Detalls del pagament}
- \gdef\accountnametext {a nom de}
- \gdef\accountnotext {N\'um. de compte}
\gdef\amounttext {Quantitat}
- \gdef\banknametext {banc}
- \gdef\bictext {\scshape bic}
- \gdef\cellphonetext {M\`obil}
- \gdef\chambertext {Cambra de comer\c{c}}
- \gdef\copytotext {cc}
- \gdef\creditoridtext {Creditor ID}
+ \gdef\copytotext {CC}
\gdef\datetext {Data}
- \gdef\daystext {dies}
- \gdef\descriptiontext {Descripci\'o}
- \gdef\emailtext {E-mail}
- \gdef\enclosurestext {Annexos:}
- \gdef\enclosuretext {Annex:}
- \gdef\faxtext {Fax}
- \gdef\ibantext {\scshape iban}
+ \gdef\descriptiontext {Descripció}
+ \gdef\enclosurestext {Annexos}
+ \gdef\enclosuretext {Annex}
\gdef\invoicetext {factura}
- \gdef\mandateidtext {Mandate ID}
\gdef\oftext {de}
- \gdef\ourreftext {La nostra refer\`encia}
- \gdef\pagetext {P\`agina}
- \gdef\phonetext {Tel\`efon}
- \gdef\payreftext {Refer\`encia}
- \gdef\routingnotext {Nombre de ruta}
+ \gdef\ourreftext {La nostra referència}
+ \gdef\pagetext {Pàgina}
\gdef\subjecttext {Assumpte}
- \gdef\termtext {Termini del pagament}
\gdef\totaltext {Total}
\gdef\totext {A}
- \gdef\vatnotext {N\'um. IVA}
- \gdef\vattext {IVA}
- \gdef\websitetext {Web}
\gdef\yourlettertext {La seva carta del}
- \gdef\yourreftext {La seva refer\`encia}
+ \gdef\yourreftext {La seva referència}
+% \end{macrocode}
+% payment data entries, all lower case, except the header:
+% \begin{macrocode}
+ \gdef\accountnametext {a nom de}
+ \gdef\accountnotext {núm.~de compte}
+ \gdef\banknametext {banc}
+ \gdef\bictext {\scshape bic}
+ \gdef\chambertext {cambra de comerç}
+ \gdef\creditoridtext {creditor id}
+ \gdef\daystext {dies}
+ \gdef\ibantext {\scshape iban}
+ \gdef\mandateidtext {mandate id}
+ \gdef\paymentdatatext {Detalls del pagament}
+ \gdef\payreftext {referència}
+ \gdef\routingnotext {nombre de ruta}
+ \gdef\termtext {termini del pagament}
+ \gdef\vatnotext {núm.~iva}
+ \gdef\vattext {iva}
+% \end{macrocode}
+% footer fields have lower case headers:
+% \begin{macrocode}
+ \gdef\cellphonetext {mòbil}
+ \gdef\emailtext {e-mail}
+ \gdef\faxtext {fax}
+ \gdef\phonetext {telèfon}
+ \gdef\websitetext {web}
\gdef\@isodate {\number\day\space\ifcase\month\or
- gener\or febrer\or mar\c{c}\or abril\or maig\or juny\or
+ gener\or febrer\or març\or abril\or maig\or juny\or
juliol\or agost\or setembre\or octubre\or novembre\or desembre\fi
\space \number\year
}
@@ -2283,102 +2313,108 @@ payref;vatno;chamber}
% German
% \begin{macrocode}
\def\isodoc@deDE{%
- \gdef\paymentdatatext {Zahlungsdaten}
+ \gdef\amounttext {Betrag}
+ \gdef\copytotext {Kopien an}
+ \gdef\datetext {Datum}
+ \gdef\descriptiontext {Bezeichnung}
+ \gdef\enclosurestext {Anlagen}
+ \gdef\enclosuretext {Anlage}
+ \gdef\invoicetext {Rechnung}
+ \gdef\oftext {von}
+ \gdef\ourreftext {Unser Zeichen}
+ \gdef\pagetext {Seite}
+ \gdef\subjecttext {Betreff}
+ \gdef\totaltext {Insgesamt}
+ \gdef\totext {An}
+ \gdef\yourlettertext {Ihr Brief vom}
+ \gdef\yourreftext {Ihr Zeichen}
+% \end{macrocode}
+% payment data entries, all lower case, except the header:
+% \begin{macrocode}
\gdef\accountnametext {Name}
\gdef\accountnotext {Konto-Nr.}
- \gdef\amounttext {Betrag}
\gdef\banknametext {Bank}
\gdef\bictext {\scshape bic}
- \gdef\cellphonetext {Handy}
\gdef\chambertext {Register-Nr.}
- \gdef\copytotext {Kopien an}
\gdef\creditoridtext {Creditor ID}
- \gdef\datetext {Datum}
\gdef\daystext {Tage}
- \gdef\descriptiontext {Bezeichnung}
- \gdef\emailtext {E-mail}
- \gdef\enclosurestext {Anlagen:}
- \gdef\enclosuretext {Anlage:}
- \gdef\faxtext {Fax}
\gdef\ibantext {\scshape iban}
- \gdef\invoicetext {Rechnung}
\gdef\mandateidtext {Mandate ID}
- \gdef\oftext {von}
- \gdef\ourreftext {Unser Zeichen}
- \gdef\pagetext {Seite}
- \gdef\phonetext {Telefon}
+ \gdef\paymentdatatext {Zahlungsdaten}
\gdef\payreftext {Referenz-Nr.}
\gdef\routingnotext {\scshape blz}
- \gdef\subjecttext {}
\gdef\termtext {Zahlungstermin}
- \gdef\totaltext {Insgesamt}
- \gdef\totext {An}
\gdef\vatnotext {USt-IdNr.}
- \gdef\vattext {MwSt}
+ \gdef\vattext {MwSt}
+% \end{macrocode}
+% footer fields have lower case headers:
+% \begin{macrocode}
+ \gdef\cellphonetext {Handy}
+ \gdef\emailtext {E-mail}
+ \gdef\faxtext {Fax}
+ \gdef\phonetext {Telefon}
\gdef\websitetext {Webseite}
- \gdef\yourlettertext {Ihr Brief vom}
- \gdef\yourreftext {Ihr Zeichen}
\gdef\@isodate {\number\day.\space\ifcase\month\or
- Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or
+ Januar\or Februar\or März\or April\or Mai\or Juni\or
Juli\or August\or September\or Oktober\or November\or Dezember\fi
\space\number\year}
}
-\def\isodoc@german{%
- \isodoc@deDE%
- \ClassWarning{isodoc}{
- language name german is obsolete: use de-DE
- }
-}
% \end{macrocode}
% British English
% \begin{macrocode}
\def\isodoc@enGB{%
- \if@isodocordinalss
- \gdef\@st{\textsuperscript{st}}
- \gdef\@nd{\textsuperscript{nd}}
- \gdef\@rd{\textsuperscript{rd}}
- \gdef\@th{\textsuperscript{th}}
- \else
- \gdef\@st{st}
- \gdef\@nd{nd}
- \gdef\@rd{rd}
- \gdef\@th{th}
- \fi
- \gdef\paymentdatatext {Payment details}
- \gdef\accountnametext {in the name of}
- \gdef\accountnotext {Account no.}
\gdef\amounttext {Amount}
- \gdef\banknametext {bank}
- \gdef\bictext {\scshape bic}
- \gdef\cellphonetext {cellphone}
- \gdef\chambertext {ch.comm.}
\gdef\copytotext {Copy to}
- \gdef\creditoridtext {Creditor ID}
\gdef\datetext {Date}
- \gdef\daystext {days}
\gdef\descriptiontext {Description}
- \gdef\emailtext {email}
- \gdef\enclosurestext {Enclosures:}
- \gdef\enclosuretext {Enclosure:}
- \gdef\faxtext {telefax}
- \gdef\ibantext {\scshape iban}
+ \gdef\enclosurestext {Enclosures}
+ \gdef\enclosuretext {Enclosure}
\gdef\invoicetext {invoice}
- \gdef\mandateidtext {Mandate ID}
\gdef\oftext {of}
\gdef\ourreftext {Our reference}
\gdef\pagetext {Page}
- \gdef\phonetext {telephone}
- \gdef\payreftext {Reference}
- \gdef\routingnotext {Sort code}
- \gdef\subjecttext {Subject:}
- \gdef\termtext {term of payment}
+ \gdef\subjecttext {Subject}
\gdef\totaltext {Total}
\gdef\totext {To}
- \gdef\vatnotext {vat no.}
- \gdef\vattext {Vat}
- \gdef\websitetext {website}
\gdef\yourlettertext {Your letter of}
\gdef\yourreftext {Your reference}
+% \end{macrocode}
+% payment data entries, all lower case, except the header:
+% \begin{macrocode}
+ \gdef\accountnametext {in the name of}
+ \gdef\accountnotext {account no.}
+ \gdef\banknametext {bank}
+ \gdef\bictext {\scshape bic}
+ \gdef\chambertext {ch.comm.}
+ \gdef\creditoridtext {creditor id}
+ \gdef\daystext {days}
+ \gdef\ibantext {\scshape iban}
+ \gdef\mandateidtext {mandate id}
+ \gdef\paymentdatatext {Payment details}
+ \gdef\payreftext {reference}
+ \gdef\routingnotext {sort code}
+ \gdef\termtext {term of payment}
+ \gdef\vatnotext {vat no.}
+ \gdef\vattext {vat}
+% \end{macrocode}
+% footer fields have lower case headers:
+% \begin{macrocode}
+ \gdef\cellphonetext {cellphone}
+ \gdef\emailtext {email}
+ \gdef\faxtext {telefax}
+ \gdef\phonetext {telephone}
+ \gdef\websitetext {website}
+ \if@isodocordinalss
+ \gdef\@st{\textsuperscript{st}}
+ \gdef\@nd{\textsuperscript{nd}}
+ \gdef\@rd{\textsuperscript{rd}}
+ \gdef\@th{\textsuperscript{th}}
+ \else
+ \gdef\@st{st}
+ \gdef\@nd{nd}
+ \gdef\@rd{rd}
+ \gdef\@th{th}
+ \fi
\gdef\@isodate {\ifcase\day\or
1\@st\or 2\@nd\or 3\@rd\or 4\@th\or 5\@th\or
6\@th\or 7\@th\or 8\@th\or 9\@th\or 10\@th\or
@@ -2391,197 +2427,203 @@ payref;vatno;chamber}
July\or August\or September\or October\or November\or December\fi
\space \number\year}
}
-\def\isodoc@english{%
- \isodoc@enGB%
- \ClassWarning{isodoc}{
- language name english is obsolete: use en-GB
- }
-}
% \end{macrocode}
% American English
% \begin{macrocode}
\def\isodoc@enUS{%
- \gdef\paymentdatatext {Payment details}
- \gdef\accountnametext {in the name of}
- \gdef\accountnotext {Account no.}
\gdef\amounttext {Amount}
- \gdef\banknametext {bank}
- \gdef\bictext {\scshape bic}
- \gdef\cellphonetext {cellphone}
- \gdef\chambertext {ch.comm.}
- \gdef\copytotext {cc}
- \gdef\creditoridtext {Creditor ID}
+ \gdef\copytotext {CC}
\gdef\datetext {Date}
- \gdef\daystext {days}
\gdef\descriptiontext {Description}
- \gdef\emailtext {email}
- \gdef\enclosurestext {Enclosures:}
- \gdef\enclosuretext {Enclosure:}
- \gdef\faxtext {telefax}
- \gdef\ibantext {\scshape iban}
+ \gdef\enclosurestext {Enclosures}
+ \gdef\enclosuretext {Enclosure}
\gdef\invoicetext {invoice}
- \gdef\mandateidtext {Mandate ID}
\gdef\oftext {of}
\gdef\ourreftext {Our reference}
\gdef\pagetext {Page}
- \gdef\phonetext {telephone}
- \gdef\payreftext {Reference}
- \gdef\routingnotext {Routing no}
- \gdef\subjecttext {Subject:}
- \gdef\termtext {term of payment}
+ \gdef\subjecttext {Subject}
\gdef\totaltext {Total}
\gdef\totext {To}
- \gdef\vatnotext {vat no.}
- \gdef\vattext {Vat}
- \gdef\websitetext {website}
\gdef\yourlettertext {Your letter of}
\gdef\yourreftext {Your reference}
+% \end{macrocode}
+% payment data entries, all lower case, except the header:
+% \begin{macrocode}
+ \gdef\accountnametext {in the name of}
+ \gdef\accountnotext {account no.}
+ \gdef\banknametext {bank}
+ \gdef\bictext {\scshape bic}
+ \gdef\chambertext {ch.comm.}
+ \gdef\creditoridtext {creditor id}
+ \gdef\daystext {days}
+ \gdef\ibantext {\scshape iban}
+ \gdef\mandateidtext {mandate id}
+ \gdef\paymentdatatext {Payment details}
+ \gdef\payreftext {reference}
+ \gdef\routingnotext {routing no}
+ \gdef\termtext {term of payment}
+ \gdef\vatnotext {vat no.}
+ \gdef\vattext {vat}
+% \end{macrocode}
+% footer fields have lower case headers:
+% \begin{macrocode}
+ \gdef\cellphonetext {cellphone}
+ \gdef\emailtext {email}
+ \gdef\faxtext {telefax}
+ \gdef\phonetext {telephone}
+ \gdef\websitetext {website}
\gdef\@isodate {\ifcase\month\or
January\or February\or March\or April\or May\or June\or
July\or August\or September\or October\or November\or December\fi
\space\number\day, \number\year}
}
-\def\isodoc@american{%
- \isodoc@enUS%
- \ClassWarning{isodoc}{
- language name american is obsolete: use en-US
- }
-}
% \end{macrocode}
% Spanish---contributed by Cristian Peraferrer:
% \begin{macrocode}
\def\isodoc@esES{%
- \def\openingcomma {:}
- \gdef\paymentdatatext {Detalles de pago}
- \gdef\accountnametext {a nombre de}
- \gdef\accountnotext {N\'um. de cuenta}
\gdef\amounttext {Cantidad}
- \gdef\banknametext {banco}
- \gdef\bictext {\scshape bic}
- \gdef\cellphonetext {M\'ovil}
- \gdef\chambertext {C\'amara de comercio}
- \gdef\copytotext {cc}
- \gdef\creditoridtext {Creditor ID}
+ \gdef\copytotext {CC}
\gdef\datetext {Fecha}
- \gdef\daystext {d\'{\i}as}
- \gdef\descriptiontext {Descripci\'on}
- \gdef\emailtext {E-mail}
- \gdef\enclosurestext {Anexos:}
- \gdef\enclosuretext {Anexo:}
- \gdef\faxtext {Fax}
- \gdef\ibantext {\scshape iban}
+ \gdef\descriptiontext {Descripción}
+ \gdef\enclosurestext {Anexos}
+ \gdef\enclosuretext {Anexo}
\gdef\invoicetext {factura}
- \gdef\mandateidtext {Mandate ID}
\gdef\oftext {de}
\gdef\ourreftext {Nuestra referencia}
- \gdef\pagetext {P\'agina}
- \gdef\phonetext {Tel\'efono}
- \gdef\payreftext {Referencia}
- \gdef\routingnotext {n\'umero de ruta}
+ \gdef\pagetext {Página}
\gdef\subjecttext {Asunto}
- \gdef\termtext {Plazo de pago}
\gdef\totaltext {Total}
\gdef\totext {A}
- \gdef\vatnotext {N\'um. IVA}
- \gdef\vattext {IVA}
- \gdef\websitetext {Web}
\gdef\yourlettertext {Su carta de}
\gdef\yourreftext {Su referencia}
+% \end{macrocode}
+% payment data entries, all lower case, except the header:
+% \begin{macrocode}
+ \gdef\accountnametext {a nombre de}
+ \gdef\accountnotext {núm.~de cuenta}
+ \gdef\banknametext {banco}
+ \gdef\bictext {\scshape bic}
+ \gdef\chambertext {cámara de comercio}
+ \gdef\creditoridtext {creditor id}
+ \gdef\daystext {días}
+ \gdef\ibantext {\scshape iban}
+ \gdef\mandateidtext {mandate id}
+ \gdef\paymentdatatext {Detalles de pago}
+ \gdef\payreftext {referencia}
+ \gdef\routingnotext {número de ruta}
+ \gdef\termtext {plazo de pago}
+ \gdef\vatnotext {núm.~iva}
+ \gdef\vattext {iva}
+% \end{macrocode}
+% footer fields have lower case headers:
+% \begin{macrocode}
+ \gdef\cellphonetext {móvil}
+ \gdef\emailtext {e-mail}
+ \gdef\faxtext {fax}
+ \gdef\phonetext {teléfono}
+ \gdef\websitetext {web}
\gdef\@isodate {\number\day\space\ifcase\month\or
enero\or febrero\or marzo\or abril\or mayo\or junio\or
julio\or agosto\or septiembre\or octubre\or noviembre\or diciembre\fi
\space \number\year
}
+ \def\openingcomma {:}
}
% \end{macrocode}
% French
% \begin{macrocode}
\def\isodoc@frFR{%
- \gdef\paymentdatatext {Détails de paiement}
- \gdef\accountnametext {au nom de}
- \gdef\accountnotext {no. compte}
\gdef\amounttext {Montant}
- \gdef\banknametext {banque}
- \gdef\bictext {\scshape bic}
- \gdef\cellphonetext {portable}
- \gdef\chambertext {c.c.i.}
\gdef\copytotext {Copie à}
- \gdef\creditoridtext {Creditor ID}
- \gdef\datetext {Date:}
- \gdef\daystext {jours}
+ \gdef\datetext {Date}
\gdef\descriptiontext {Description}
- \gdef\emailtext {email}
- \gdef\enclosurestext {Pièces jointes:}
- \gdef\enclosuretext {Pièce jointe:}
- \gdef\faxtext {téléfax}
- \gdef\ibantext {\scshape iban}
+ \gdef\enclosurestext {Pièces jointes}
+ \gdef\enclosuretext {Pièce jointe}
\gdef\invoicetext {facture}
- \gdef\mandateidtext {Mandate ID}
\gdef\oftext {de}
- \gdef\ourreftext {Nos références:}
+ \gdef\ourreftext {Nos références}
\gdef\pagetext {Page}
- \gdef\phonetext {téléphone}
- \gdef\payreftext {référence}
- \gdef\routingnotext {numéro d'acheminement}
- \gdef\subjecttext {Objet:}
- \gdef\termtext {terme}
+ \gdef\subjecttext {Objet}
\gdef\totaltext {Total}
\gdef\totext {À l'attention de}
- \gdef\vatnotext {no. T.V.A.}
- \gdef\vattext {T.V.A.}
- \gdef\websitetext {site Web}
\gdef\yourlettertext {Votre lettre du}
- \gdef\yourreftext {Vos références:}
+ \gdef\yourreftext {Vos références}
+% \end{macrocode}
+% payment data entries, all lower case, except the header:
+% \begin{macrocode}
+ \gdef\accountnametext {au nom de}
+ \gdef\accountnotext {no.~compte}
+ \gdef\banknametext {banque}
+ \gdef\bictext {\scshape bic}
+ \gdef\chambertext {c.c.i.}
+ \gdef\creditoridtext {creditor id}
+ \gdef\daystext {jours}
+ \gdef\ibantext {\scshape iban}
+ \gdef\mandateidtext {mandate id}
+ \gdef\paymentdatatext {Détails de paiement}
+ \gdef\payreftext {référence}
+ \gdef\routingnotext {numéro d'acheminement}
+ \gdef\termtext {terme}
+ \gdef\vatnotext {no.~t.v.a.}
+ \gdef\vattext {t.v.a.}
+% \end{macrocode}
+% footer fields have lower case headers:
+% \begin{macrocode}
+ \gdef\cellphonetext {portable}
+ \gdef\emailtext {email}
+ \gdef\faxtext {téléfax}
+ \gdef\phonetext {téléphone}
+ \gdef\websitetext {site web}
\gdef\@isodate {\number\day\ifnum\day=1$^{er}$\fi\space\ifcase\month\or
janvier\or février\or mars\or avril\or mai\or juin\or
- juillet\or ao\^ut\or septembre\or octobre\or
+ juillet\or août\or septembre\or octobre\or
novembre\or décembre\fi \space \number\year}
}
-\def\isodoc@french{%
- \isodoc@frFR%
- \ClassWarning{isodoc}{
- language name french is obsolete: use fr-FR
- }
-}
% \end{macrocode}
% Italian---contributed by Walter Giocoso:
% \begin{macrocode}
\def\isodoc@itIT{%
- \gdef\paymentdatatext {Dettagli di pagamento}
- \gdef\accountnametext {intestato a}
- \gdef\accountnotext {n$^o$~del conto}
\gdef\amounttext {Prezzo}
+ \gdef\copytotext {Per conoscenza a}
+ \gdef\datetext {Data}
+ \gdef\descriptiontext {Descrizione}
+ \gdef\enclosurestext {Allegati}
+ \gdef\enclosuretext {Allegato}
+ \gdef\invoicetext {fattura}
+ \gdef\oftext {di}
+ \gdef\ourreftext {Nostro riferimento}
+ \gdef\pagetext {Pagina}
+ \gdef\subjecttext {Oggetto}
+ \gdef\totaltext {Totale}
+ \gdef\totext {All'attenzione di}
+ \gdef\yourlettertext {Vostra lettera del}
+ \gdef\yourreftext {Vostro riferimento}
+% \end{macrocode}
+% payment data entries, all lower case, except the header:
+% \begin{macrocode}
+ \gdef\accountnametext {intestato a}
+ \gdef\accountnotext {n°~del conto}
\gdef\banknametext {banca}
\gdef\bictext {\scshape bic}
- \gdef\cellphonetext {cellulare:}
\gdef\chambertext {}
- \gdef\copytotext {Per conoscenza a:}
- \gdef\creditoridtext {Creditor ID}
- \gdef\datetext {Data:}
+ \gdef\creditoridtext {creditor id}
\gdef\daystext {giorni}
- \gdef\descriptiontext {Descrizione}
- \gdef\emailtext {e-mail:}
- \gdef\enclosurestext {Allegati:}
- \gdef\enclosuretext {Allegato:}
- \gdef\faxtext {fax:}
\gdef\ibantext {\scshape iban}
- \gdef\invoicetext {fattura}
- \gdef\mandateidtext {Mandate ID}
- \gdef\oftext {di}
- \gdef\ourreftext {Nostro riferimento:}
- \gdef\pagetext {Pagina}
- \gdef\phonetext {telefono:}
+ \gdef\mandateidtext {mandate id}
+ \gdef\paymentdatatext {Dettagli di pagamento}
\gdef\payreftext {riferimento}
\gdef\routingnotext {numero di routing}
- \gdef\subjecttext {Oggetto:}
\gdef\termtext {scadenza}
- \gdef\totaltext {Totale}
- \gdef\totext {All'attenzione di:}
- \gdef\vatnotext {Partita I.V.A.}
- \gdef\vattext {I.V.A.}
- \gdef\websitetext {sito Web:}
- \gdef\yourlettertext {Vostra lettera del:}
- \gdef\yourreftext {Vostro riferimento:}
+ \gdef\vatnotext {partita i.v.a.}
+ \gdef\vattext {i.v.a.}
+% \end{macrocode}
+% footer fields have lower case headers:
+% \begin{macrocode}
+ \gdef\cellphonetext {cellulare}
+ \gdef\emailtext {e-mail}
+ \gdef\faxtext {fax}
+ \gdef\phonetext {telefono}
+ \gdef\websitetext {sito web}
\gdef\@isodate {\number\day\ifnum\day=1\fi
~\ifcase\month\or
Gennaio\or Febbraio\or Marzo\or Aprile\or Maggio\or Giugno\or
@@ -2592,41 +2634,47 @@ payref;vatno;chamber}
% Norwegian---contributed by Sveinung Heggen:
% \begin{macrocode}
\def\isodoc@nbNO{%
- \gdef\paymentdatatext {Betalingsdetaljer}
+ \gdef\amounttext {Beløp}
+ \gdef\copytotext {Kopi til}
+ \gdef\datetext {Dato}
+ \gdef\descriptiontext {Beskrivelse}
+ \gdef\enclosurestext {Vedlegg}
+ \gdef\enclosuretext {Vedlegg}
+ \gdef\invoicetext {faktura}
+ \gdef\oftext {av}
+ \gdef\ourreftext {Vår ref}
+ \gdef\pagetext {Side}
+ \gdef\subjecttext {Vedr}
+ \gdef\totaltext {Total}
+ \gdef\totext {Til}
+ \gdef\yourlettertext {Deres brev av}
+ \gdef\yourreftext {Deres ref}
+% \end{macrocode}
+% payment data entries, all lower case, except the header:
+% \begin{macrocode}
\gdef\accountnametext {til}
\gdef\accountnotext {faktura nr}
- \gdef\amounttext {Bel\o{}p}
\gdef\banknametext {bank}
\gdef\bictext {\scshape bic}
- \gdef\cellphonetext {mobil}
\gdef\chambertext {}
- \gdef\copytotext {kopi til:}
- \gdef\creditoridtext {Creditor ID}
- \gdef\datetext {Dato}
+ \gdef\creditoridtext {creditor id}
\gdef\daystext {dager}
- \gdef\descriptiontext {Beskrivelse}
- \gdef\emailtext {e-post}
- \gdef\enclosurestext {Vedlegg:}
- \gdef\enclosuretext {Vedlegg:}
- \gdef\faxtext {telefaks}
\gdef\ibantext {\scshape iban}
- \gdef\invoicetext {faktura}
- \gdef\mandateidtext {Mandate ID}
- \gdef\oftext {av}
- \gdef\ourreftext {V\aa{}r ref:}
- \gdef\pagetext {Side}
- \gdef\phonetext {telefon}
+ \gdef\mandateidtext {mandate id}
+ \gdef\paymentdatatext {Betalingsdetaljer}
\gdef\payreftext {referanse}
\gdef\routingnotext {routing-nummer}
- \gdef\subjecttext {Vedr:}
\gdef\termtext {betalingsfrist}
- \gdef\totaltext {Total}
- \gdef\totext {Til}
- \gdef\vatnotext {Org. nr.}
- \gdef\vattext {Mva}
+ \gdef\vatnotext {org.~nr.}
+ \gdef\vattext {mva}
+% \end{macrocode}
+% footer fields have lower case headers:
+% \begin{macrocode}
+ \gdef\cellphonetext {mobil}
+ \gdef\emailtext {e-post}
+ \gdef\faxtext {telefaks}
+ \gdef\phonetext {telefon}
\gdef\websitetext {hjemmeside}
- \gdef\yourlettertext {Deres brev av}
- \gdef\yourreftext {Deres ref:}
\gdef\@isodate {\number\day.\space\ifcase\month\or
januar\or februar\or mars\or april\or mai\or juni\or
juli\or august\or september\or oktober\or november\or desember\fi
@@ -2636,41 +2684,47 @@ payref;vatno;chamber}
% Belgian Dutch---contributed by Serge Stroobandt:
% \begin{macrocode}
\def\isodoc@nlBE{%
- \gdef\paymentdatatext {Betaalgegevens}
- \gdef\accountnametext {op naam van}
- \gdef\accountnotext {rekeningnummer}
\gdef\amounttext {Bedrag}
- \gdef\banknametext {bank}
- \gdef\bictext {\scshape bic}
- \gdef\cellphonetext {mobiel}
- \gdef\chambertext {ondernemingsnummer}
- \gdef\copytotext {Kopie aan:}
- \gdef\creditoridtext {Incassant ID}
+ \gdef\copytotext {Kopie aan}
\gdef\datetext {Datum}
- \gdef\daystext {dagen}
\gdef\descriptiontext {Omschrijving}
- \gdef\emailtext {e-mail}
- \gdef\enclosurestext {Bijlagen:}
- \gdef\enclosuretext {Bijlage:}
- \gdef\faxtext {fax}
- \gdef\ibantext {\scshape iban}
+ \gdef\enclosurestext {Bijlagen}
+ \gdef\enclosuretext {Bijlage}
\gdef\invoicetext {factuur}
- \gdef\mandateidtext {Kenmerk machtiging}
\gdef\oftext {van}
\gdef\ourreftext {Ons kenmerk}
\gdef\pagetext {Pagina}
- \gdef\phonetext {telefoon}
+ \gdef\subjecttext {Betreft}
+ \gdef\totaltext {Totaal}
+ \gdef\totext {Aan}
+ \gdef\yourlettertext {Uw brief van}
+ \gdef\yourreftext {Uw kenmerk}
+% \end{macrocode}
+% payment data entries, all lower case, except the header:
+% \begin{macrocode}
+ \gdef\accountnametext {op naam van}
+ \gdef\accountnotext {rekeningnummer}
+ \gdef\banknametext {bank}
+ \gdef\bictext {\scshape bic}
+ \gdef\chambertext {ondernemingsnummer}
+ \gdef\creditoridtext {incassant id}
+ \gdef\daystext {dagen}
+ \gdef\ibantext {\scshape iban}
+ \gdef\mandateidtext {kenmerk machtiging}
+ \gdef\paymentdatatext {Betaalgegevens}
\gdef\payreftext {kenmerk}
\gdef\routingnotext {routenummer}
- \gdef\subjecttext {Betreft:}
\gdef\termtext {betalingstermijn}
- \gdef\totaltext {Totaal}
- \gdef\totext {Aan}
\gdef\vatnotext {ondernemingsnummer}
\gdef\vattext {btw}
+% \end{macrocode}
+% footer fields have lower case headers:
+% \begin{macrocode}
+ \gdef\cellphonetext {mobiel}
+ \gdef\emailtext {e-mail}
+ \gdef\faxtext {fax}
+ \gdef\phonetext {telefoon}
\gdef\websitetext {webstek}
- \gdef\yourlettertext {Uw brief van}
- \gdef\yourreftext {Uw kenmerk}
\gdef\@isodate {\number\day\space\ifcase\month\or
januari\or februari\or maart\or april\or mei\or juni\or juli\or
augustus\or september\or oktober\or november\or december\fi
@@ -2680,91 +2734,97 @@ payref;vatno;chamber}
% Dutch
% \begin{macrocode}
\def\isodoc@nlNL{%
- \gdef\paymentdatatext {Betaalgegevens}
+ \gdef\amounttext {Bedrag}
+ \gdef\copytotext {Kopie aan}
+ \gdef\datetext {Datum}
+ \gdef\descriptiontext {Omschrijving}
+ \gdef\enclosurestext {Bijlagen}
+ \gdef\enclosuretext {Bijlage}
+ \gdef\invoicetext {\scshape rekening}
+ \gdef\oftext {van}
+ \gdef\ourreftext {Ons kenmerk}
+ \gdef\pagetext {Bladnummer}
+ \gdef\subjecttext {Onderwerp}
+ \gdef\totaltext {Totaal}
+ \gdef\totext {Aan}
+ \gdef\yourlettertext {Uw brief van}
+ \gdef\yourreftext {Uw kenmerk}
+% \end{macrocode}
+% payment data entries, all lower case, except the header:
+% \begin{macrocode}
\gdef\accountnametext {ten name van}
\gdef\accountnotext {rekeningnummer}
- \gdef\amounttext {Bedrag}
\gdef\banknametext {bank}
\gdef\bictext {\scshape bic}
- \gdef\cellphonetext {mobiel}
\gdef\chambertext {kvk}
- \gdef\copytotext {Kopie aan:}
- \gdef\creditoridtext {Incassant ID}
- \gdef\datetext {Datum}
+ \gdef\creditoridtext {incassant id}
\gdef\daystext {dagen}
- \gdef\descriptiontext {Omschrijving}
- \gdef\emailtext {e-mail}
- \gdef\enclosurestext {Bijlagen:}
- \gdef\enclosuretext {Bijlage:}
- \gdef\faxtext {fax}
\gdef\ibantext {\scshape iban}
- \gdef\invoicetext {rekening}
- \gdef\mandateidtext {Kenmerk machtiging}
- \gdef\oftext {van}
- \gdef\ourreftext {Ons kenmerk}
- \gdef\pagetext {Bladnummer}
- \gdef\phonetext {telefoon}
+ \gdef\mandateidtext {kenmerk machtiging}
+ \gdef\paymentdatatext {Betaalgegevens}
\gdef\payreftext {kenmerk}
\gdef\routingnotext {banknummer}
- \gdef\subjecttext {Onderwerp:}
\gdef\termtext {betalingstermijn}
- \gdef\totaltext {Totaal}
- \gdef\totext {Aan}
\gdef\vatnotext {btwnummer}
\gdef\vattext {btw}
+% \end{macrocode}
+% footer fields have lower case headers:
+% \begin{macrocode}
+ \gdef\cellphonetext {mobiel}
+ \gdef\emailtext {e-mail}
+ \gdef\faxtext {fax}
+ \gdef\phonetext {telefoon}
\gdef\websitetext {webstek}
- \gdef\yourlettertext {Uw brief van}
- \gdef\yourreftext {Uw kenmerk}
\gdef\@isodate {\number\day\space\ifcase\month\or
januari\or februari\or maart\or april\or mei\or juni\or juli\or
augustus\or september\or oktober\or november\or december\fi
\space \number\year}
}
-\def\isodoc@dutch{%
- \isodoc@nlNL%
- \ClassWarning{isodoc}{
- language name dutch is obsolete: use nl-NL
- }
-}
% \end{macrocode}
% Serbian---contributed by Zoran T. Filipovic:
% \begin{macrocode}
\def\isodoc@srRS{%
- \gdef\paymentdatatext {Podaci o bankarskom sektoru}
- \gdef\accountnametext {na ime}
- \gdef\accountnotext {Ra\v cun br.}
\gdef\amounttext {Iznos}
- \gdef\banknametext {banka}
- \gdef\bictext {undefined}
- \gdef\cellphonetext {Mobilni}
- \gdef\chambertext {Spisak br.}
\gdef\copytotext {Kopije}
- \gdef\creditoridtext {Creditor ID}
\gdef\datetext {Datum}
- \gdef\daystext {dana}
\gdef\descriptiontext {Opis}
- \gdef\emailtext {Email}
- \gdef\enclosurestext {Prilozi:}
- \gdef\enclosuretext {Prilog:}
- \gdef\faxtext {Telefax}
- \gdef\ibantext {\scshape iban}
+ \gdef\enclosurestext {Prilozi}
+ \gdef\enclosuretext {Prilog}
\gdef\invoicetext {faktura}
- \gdef\mandateidtext {Mandate ID}
\gdef\oftext {od}
- \gdef\ourreftext {Na\v s broj}
+ \gdef\ourreftext {Naš broj}
\gdef\pagetext {Strana}
- \gdef\phonetext {Telefon}
- \gdef\payreftext {Dokumet br.}
- \gdef\routingnotext {BLZ}
- \gdef\subjecttext {Predmet:}
- \gdef\termtext {rok pla\' canja}
+ \gdef\subjecttext {Predmet}
\gdef\totaltext {Ukupno}
\gdef\totext {U}
+ \gdef\yourlettertext {Vaše pismo od}
+ \gdef\yourreftext {Vaš broj}
+% \end{macrocode}
+% payment data entries, all lower case, except the header:
+% \begin{macrocode}
+ \gdef\accountnametext {na ime}
+ \gdef\accountnotext {račun br.}
+ \gdef\banknametext {banka}
+ \gdef\bictext {\scshape bic}
+ \gdef\chambertext {spisak br.}
+ \gdef\creditoridtext {creditor id}
+ \gdef\daystext {dana}
+ \gdef\ibantext {\scshape iban}
+ \gdef\mandateidtext {mandate id}
+ \gdef\paymentdatatext {Podaci o bankarskom sektoru}
+ \gdef\payreftext {dokumet br.}
+ \gdef\routingnotext {blz}
+ \gdef\termtext {rok plaćanja}
\gdef\vatnotext {porez br.}
- \gdef\vattext {PDV}
- \gdef\websitetext {Website}
- \gdef\yourlettertext {Va\v se pismo od}
- \gdef\yourreftext {Va\v s broj}
+ \gdef\vattext {pdv}
+% \end{macrocode}
+% footer fields have lower case headers:
+% \begin{macrocode}
+ \gdef\cellphonetext {mobilni}
+ \gdef\emailtext {email}
+ \gdef\faxtext {telefax}
+ \gdef\phonetext {telefon}
+ \gdef\websitetext {website}
\gdef\@isodate {\number\day.~\ifcase\month\or
Januar\or Februar\or Mart\or April\or Maj\or Jun\or
Jul\or Avgust\or Septembar\or Oktobar\or Novembar\or Decembar\fi
@@ -2774,45 +2834,51 @@ payref;vatno;chamber}
% Swedish---contributed by Joakim Verona:
% \begin{macrocode}
\def\isodoc@svSE{%
- \gdef\paymentdatatext {Betalningsdetaljer}
- \gdef\accountnametext {Konto\"agare}
- \gdef\accountnotext {Kontonummer}
\gdef\amounttext {Summa}
- \gdef\banknametext {bank}
- \gdef\bictext {\scshape bic}
- \gdef\cellphonetext {Mobil}
- \gdef\chambertext {ch.comm.}
- \gdef\copytotext {cc}
- \gdef\creditoridtext {Creditor ID}
+ \gdef\copytotext {CC}
\gdef\datetext {Datum}
- \gdef\daystext {dagar}
\gdef\descriptiontext {Beskrivning}
- \gdef\emailtext {email}
- \gdef\enclosurestext {Bifogat:}
- \gdef\enclosuretext {Bifogat:}
- \gdef\faxtext {telefax}
- \gdef\ibantext {\scshape iban}
+ \gdef\enclosurestext {Bifogat}
+ \gdef\enclosuretext {Bifogat}
\gdef\invoicetext {Faktura}
- \gdef\mandateidtext {Mandate ID}
\gdef\oftext {av}
- \gdef\ourreftext {V\r{a}r referens}
+ \gdef\ourreftext {Vår referens}
\gdef\pagetext {Sida}
- \gdef\phonetext {Telefon}
- \gdef\payreftext {Faktura}
- \gdef\routingnotext {Routing no}
- \gdef\subjecttext {\"Arende:}
- \gdef\termtext {Betalningsvillkor}
+ \gdef\subjecttext {Ärende}
\gdef\totaltext {Total}
\gdef\totext {Till}
- \gdef\vatnotext {Momsregistrering.}
- \gdef\vattext {Moms}
- \gdef\websitetext {Web}
- \gdef\yourlettertext {Ert brev}
- \gdef\yourreftext {Er Referens}
- \gdef\@isodate {\ifcase\month\or
- Januari\or Februari\or Mars\or April\or Maj\or Juni\or
- Juli\or Augusti\or September\or Oktober\or November\or December\fi
- \space\number\day, \number\year}
+ \gdef\yourlettertext {Ert~brev}
+ \gdef\yourreftext {Er~Referens}
+% \end{macrocode}
+% payment data entries, all lower case, except the header:
+% \begin{macrocode}
+ \gdef\accountnametext {kontoägare}
+ \gdef\accountnotext {kontonummer}
+ \gdef\banknametext {bank}
+ \gdef\bictext {\scshape bic}
+ \gdef\chambertext {handelskammare}
+ \gdef\creditoridtext {creditor id}
+ \gdef\daystext {dagar}
+ \gdef\ibantext {\scshape iban}
+ \gdef\mandateidtext {mandate id}
+ \gdef\paymentdatatext {Betalningsdetaljer}
+ \gdef\payreftext {faktura}
+ \gdef\routingnotext {routing no}
+ \gdef\termtext {betalningsvillkor}
+ \gdef\vatnotext {org.~nr}
+ \gdef\vattext {moms}
+% \end{macrocode}
+% footer fields have lower case headers:
+% \begin{macrocode}
+ \gdef\cellphonetext {mobil}
+ \gdef\emailtext {e-mail}
+ \gdef\faxtext {telefax}
+ \gdef\phonetext {telefon}
+ \gdef\websitetext {web}
+ \gdef\@isodate {\number\day\space~\ifcase\month\or
+ januari\or februari\or mars\or april\or maj\or juni\or
+ juli\or augusti\or september\or oktober\or november\or december\fi
+ \space\number\year}
}
%</class>
% \end{macrocode}
@@ -2890,7 +2956,7 @@ cityzip
\ifx\undefined\tbfigures\else\tbfigures\fi
\ifx\who\empty\else\who\\\fi
\ifx\who\empty\else\street\\\fi
- \prezip\ \zip\ \city}
+ \prezip\zip\ \city}
\end{textblock}
% not needed for preprinted paper: this is for example only:
\begin{textblock}{210}(0,199.5)
@@ -3099,7 +3165,7 @@ cityzip
\end{center}
\end{textblock}\fi
}
-\setmainfont[Mapping=tex-text]{Fontin}
+\setmainfont[Ligatures=TeX]{Fontin}
\setdefaultlanguage{english}
\setotherlanguage{dutch}
%</logolettersty>
@@ -3181,7 +3247,7 @@ cityzip
\ifx\undefined\tbfigures\else\tbfigures\fi
\ifx\who\empty\else\who\\\fi
\ifx\who\empty\else\street\\\fi
- \prezip\ \zip\ \city}
+ \prezip\zip\ \city}
\end{textblock}
}
%</ntglettersty>
@@ -3202,43 +3268,46 @@ $(NAME).pdf: $(NAME).dtx accept.pdf invoice.pdf letter.pdf logoletter.pdf ntglet
$(LTX) $(NAME).dtx
accept.pdf: accept.tex accept.sty acceptform.jpg ntgcolor.png
chmod 755 *.sh
- texi2dvi -p -q accept.tex
+ texi2dvi -p -q accept.tex
invoice.pdf: invoice.tex invoice.sty
- texi2dvi -p -q invoice.tex
+ texi2dvi -p -q invoice.tex
letter.pdf: letter.tex letter.sty signmarked.png
texi2dvi -p -q letter.tex
logoletter.pdf: logoletter.tex logoletter.sty body.tex shiva-shakti.png signblue.png
- LATEX=lualatex texi2dvi -q logoletter.tex
+ LATEX=lualatex texi2dvi -q logoletter.tex
logo1.pdf logo2.pdf: logoletter.pdf
pdfseparate -l 2 logoletter.pdf logo%d.pdf
ntgletter.pdf: ntgletter.tex ntgletter.sty ntgcolor.png signshort.png signlong.png
- texi2dvi -p -q ntgletter.tex
-ChopinScript.ttf body.tex acceptform.jpg ntgcolor.png shiva-shakti.pngsign.png signblue.png signlong.png signmarked.png signshort.png: images.zip
- unzip -oqDD images.zip
+ texi2dvi -p -q ntgletter.tex
+iolang ChopinScript.ttf body.tex acceptform.jpg ntgcolor.png shiva-shakti.png sign.png signblue.png signlong.png signmarked.png signshort.png: files.zip
+ unzip -oqDD files.zip
mkdir -p ~/.fonts
cp -u *.ttf ~/.fonts
-images.zip: images.zip.uue
- uudecode images.zip.uue
-images.zip.uue accept.tex accept.sty invoice.tex invoice.sty letter.tex letter.sty logoletter.tex logoletter.sty ntgletter.tex ntgletter.sty: isodoc.dtx isodoc.ins
+files.zip: files.zip.uue
+ uudecode files.zip.uue
+files.zip.uue accept.tex accept.sty invoice.tex invoice.sty letter.tex letter.sty logoletter.tex logoletter.sty ntgletter.tex ntgletter.sty: isodoc.dtx isodoc.ins
luatex isodoc.ins
clean:
- rm -f *.{aux,cls,fls,glo,gls,hd,idx,ilg,ind,jpg,log,out,pdf,png,sh,sty,tex,toc,ttf,uue}
- rm -f images.zip README Makefile *.synctex.gz
+ ./iolang -i 2> /dev/null
+ echo lang iolang README Makefile files.zip{,.uue} \
+ {Chopin,Fontin}*.ttf acceptform.jpg body.tex listkeys.sh logo[12].pdf \
+ {ntgcolor,shiva-shakti,sign{,blue,long,marked,short}}.png \
+ {accept,invoice,isodoc,{,logo,ntg}letter}.{aux,fls,log,out,pdf,sty,t2d,tex,cls,fls,glo,gls,idx,ilg,ind,sty,toc}|xargs rm -rf
inst: $(NAME).pdf
mkdir -p $(UTREE)/{tex,source,doc}/latex/$(NAME)
rm -rf $(UTREE)/{tex,source,doc}/latex/$(NAME)/*
cp $(NAME).dtx $(UTREE)/source/latex/$(NAME)
cp $(NAME).cls $(UTREE)/tex/latex/$(NAME)
- cp $(NAME).pdf README $(UTREE)/doc/latex/$(NAME)
+ cp $(NAME).pdf README.md $(UTREE)/doc/latex/$(NAME)
install: $(NAME).pdf
sudo mkdir -p $(LOCAL)/{tex,source,doc}/latex/$(NAME)
sudo rm -rf $(LOCAL)/{tex,source,doc}/latex/$(NAME)/*
sudo cp $(NAME).dtx $(LOCAL)/source/latex/$(NAME)
sudo cp $(NAME).cls $(LOCAL)/tex/latex/$(NAME)
- sudo cp $(NAME).pdf README $(LOCAL)/doc/latex/$(NAME)
+ sudo cp $(NAME).pdf README.md $(LOCAL)/doc/latex/$(NAME)
zip: $(NAME).pdf
ln -sf . $(NAME)
- zip -Drq $(PWD)/$(NAME)-$(VERS).zip $(NAME)/{README,$(NAME).{pdf,dtx,ins}}
+ zip -Drq $(PWD)/$(NAME)-$(VERS).zip $(NAME)/{README.md,$(NAME).{pdf,dtx,ins}}
rm $(NAME)
help:
@ echo "make help Print this help"
@@ -3300,7 +3369,7 @@ if [[ $type == show ]]; then
else
which cols >/dev/null || {
echo "listkeys needs the cols script; you can find that here:"
- echo "https://bitbucket.org/wybodekker/cols/src/7af1a60161bf2ce45a3842582475de7eb621a1cf/cols?at=default"
+ echo "https://github.com/wybodekker/cols"
echo "or here:"
echo "http://www.dekkerdocumenten.nl/unix/cols"
exit 1
@@ -3309,8 +3378,8 @@ else
cols -5 --squeeze --sep=' & ' --suf='\NN' --pre='% '
fi
%</listkeys>
-%<*images>
-begin-base64 644 images.zip
+%<*files>
+begin-base64 644 files.zip
UEsDBBQAAAAIAFlrJkhaxD0OZFoAALCSAAAQABwAQ2hvcGluU2NyaXB0LnR0
ZlVUCQADCgiNVpTIjlZ1eAsAAQToAwAABOgDAADdvQeYJEd9OFrV02Fyzjnn
nGd3dmc255x3b3O8sLeXs6Q73Um60ylnIQmEsIQQIAsQIglMEmBMMDxj0BmD
@@ -3827,22314 +3896,8844 @@ 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
-AAAIAHBoJkjLxkjvAogEAMeoBAAOABwAYWNjZXB0Zm9ybS5qcGdVVAkAA5QC
-jVaUyI5WdXgLAAEE6AMAAAToAwAAnP17PJP9HweOX8xtKpmiO2ozpUIniWrD
-jLpzmDKHTjdC6c6hwpxNM1IprY0oJTaaGXVLB0I5lTLqzthEIafJzFrI5jDb
-fC+f7+mf3x+/32/3H/cju3a936/X9To8n+/36/26lr4uDQG6OCdXJ0BNDQDU
-wP+AJRVw1tjb0f2w8bkzMWeMz0dcvBgRH71y5SGvw47H8F42xqdOGMf9ExUd
-GhFubLXbcs+ZXWGxl85GOIUmGEecN967Z8++PdaWe4yNPWPPXAyNSTTGGB/Y
-t9PY+1JERExIaHgw+O89K5f6gEOAlqYmVPMPLSgUumKF1kpt/dXaq1ZpG67V
-g+kjNiCNEBvgcOMtu02NN+80gcPNDpjv3GNpbW2NNEVjUHvtdltZ712+idqK
-FSu0V2kbrF5tsHcTfNPe/58/S03AGi0N+ornELXNgPoaNcgataX3ABLUxR9q
-//sA/9dHTR2i8YcmVGvFylXgBVW6gLoaBKKuAfnjDw0N8FsS+D2gseaPtZss
-HTX1PM9ANxP096ZmFWmZHHz+dp1X59QWq7NRV1as/HO9geGGrdtMzcy3W+/b
-fwCFtjn012EnZxdXnPex4ydOnvrbJ+jcP+eDQ0LDomNi4+ITEolpV69dT79x
-M+NOds7de7n3H+Q9YhazStilZY9fvKyselVdU/v6XfP7Dy2c1raPPH7Xl+6e
-r996h0cEoz/GhOOiienfM1LZ7Nz8gnxZLjUAovZ/f/4/yrUGlEtdQwOiAV2W
-S009fvmCNRp/bLLUXOvoCT1D0Nu8N1VL/2BW0fO3K0ysvKbWnY3qXPnnFuvh
-rdPLov1Psv/vBLvy/5dk/49g/69cvYA2RA18eJA1ABaYc/9isJg2jlbd3STy
-HP3pL1RvOPu0tdfYRiaSe4oU9SEIbG49FKVKHsQ1FzlwqDVzTFP+lLRwbXJD
-zoPJvu70F2ormtUGl4CDbPkSkO8N85QvksyjKTp7iZ5bfmn7K7EwsbNgCegp
-7l8hbiHOsey8T9Y3QRdmWRgy6wAKki9P4tGFdp5/quVDuAKXevJ9KUvSbnXE
-a6/NYpIylJQ57oIXKEOtuFgGC9pA3oCendXvjVOr6CJv954jw9qzplwA8Kbm
-XLZ1xJnZDYxcaRnMnaEknoVwGvFEsl+qGC/RqF5Dip7n0RnCDChU8/rbR9//
-6HLsiBfMsBTkDUempWKJC/xPDhl393HHH6bUnIwE+BIgE8WrF1MffNgHE1JD
-Xv5weLUFOyr3CqLm1GVluVhSax9HBMJmGD62ZLp5ISVrINdEYe4H9Uq2fmDA
-0szr1wioPxSzBNh1wNBFN5aADSeCJszGzcnt5oWj2kG9udi7pi/09Ox4s+Al
-XjpHdzvjtpZawgJE7v6hxb+JMrZOzeTRX9owqGLaVaI6usnYCI8obcXAEKLy
-r1pkCzIO2vjD+YSgfJsTIc/VVjtyHMso350oXgK6i5moSe5MSfYP3TrJWF5j
-QEtBF4GXlWDanf0N6uibyl8Cyl0aOEtABc6lSWkOBbIP6VyhK9PLkUL9B+2H
-zbF3/wQUZLnU6Hoql1wO5WcUVwUiryFpAifnciRtHwbwHxRmhLI4EKmibLW1
-lv+7DCtezljuX+pkRjmidFIhIplLjNW6c0C50MX6G3TTqhdGMuVeQtqPo9uu
-Wts+K4bSGcowtZHUPmnx4Gu1PjZ/IIcUWt+qEIXE16walHv2ZZjbevumEEc7
-5z2d9f0ghY9oQmfssOtlY1SMUU2xyr/yHIwFwcg7ZnXjmc+KMSEtyQXjE3vG
-MWUhitC9ZhPqFgEzn3dIixF4MW4wJjmH/yXdw7+yeCSV30uZoUrvZekGVyx8
-2DS6BFgQA36bw5JrJg9p6HstATb43+a243uwqgoiypqc7ZZXnnhfqz4knOED
-RYRELAGnd6d2OTYhK6psFSOZMUgW8iM1ZZexONt5hrn5TtwNrRD9A4fy3Mkb
-ymIMhttY1p09vTlZKmv6yAb2mPVYCUWIvbsD+bFAivR0dnQ7Co8VD1BAE3u8
-ce6vXYaKUnEPy1A4UFav+4eZ6Ch3CfDJMTID9cGjgmZfvy0BEeLb/4eIxh/I
-sAG/8/GcSDHjdmfg1r9Tc3MONyuBkFsydKJ5qQx322OzBsRkunT4qFxl/ZPW
-UqY4eGZwIJNCN1NM52mNXdWCuodgSOMagZ5ZB4lAHEv/AVORcRqwHaFQYpni
-w/tlatGfjYWg27sd/J5C7HRltFNo71gX1b2MQLvZZbqg3/POMrGYWbVrbX3m
-KroZB2eTKveidM5ehebhfVCm1EqjP6zVz1IHh51CQ2VB2p6KNx5ahSNFA+/W
-98hYRlLGqBfhswd1xwf5dxVjpEL71N/998snd/8dDJlP6Xs7O9pzvt7JGfMh
-cZB2HwZPOPCjbdH7n/oX+ScfmQn7quLOrj0m+hazbeNz0Hy/OFfYefarKs/X
-9Lw/xRws32ohcEIVYQD871DSG54HdsPJTqDyfDbUWid/5cWdm8ST7lDaRX5y
-5XD3rQlt287P2xyZdh708hSdguk8zJvOzwat4wSR1ys1Z8fDW3cdeLbis1nx
-ZwsycYvUAVEq94pW6Qep0yrVx66E2i7KeXIPQOcY2ecgepZVPHl4MvKg52HT
-5O0RIROWSdHORNSjMqlaQhNLFRNUpAzhQDIO6qik6VJmtQ9Or0t3WN4pcrEl
-b4ctzIHT9e9qdpccxbLWd66G+hwBDWKc+ayoKB09QjdPT6UTRHgNj2q9jQqn
-NH7GXgxKdSwdIeLEtRhVeg5kTxVXfLRUpoucQrFthV8OdGQlMvm8O9Qw328p
-a9rJNj5m7NkUR34v7XcogTvcnU2bErCOfr+/gjvvmT3vqUqujFfVFCVS4tFz
-TCpKnuSlNo6SWutRVA3Shx1Z7EZ4cF4kyrpfheTlwMKV5rJDZ/PhRC8iaA9w
-mbCnmzINhhrR4cltaoN5sAprRgDoHxYCuUeVQTDdppPrriwFA365yHlB3kna
-rZ6i6W4jYy7wYsE4aEljs1aPX7Vgi1z5cl4+cTnOWtGXAGVYRBIQP6c0dwAI
-vIcKuyuk+tDv2JaCpy1A3pHflj1VAFXTnt6lJ2GI3QJ1+okdKyADqTJFKJF6
-90AHIIWTzNdXzLBQnApZsX+jMIN9JgbRL+eBejZlD7vAwHjXnU1ysOoxEU/i
-VnzeBE9THUZew1ZaOllKRAOZdLzYeWP99NxzuYfzgrT41Vq1jljmIBShDEFg
-yOUIW5V9jtSgQZrGEEnc+kowZdAF+8qHakQh1ZY3V8zFdmfbxTye2EQAn7UV
-ZdrFHSqTFRrZBMm9eD/PDFAEEH1G+rDYecS+shr4hSe612BzqyyGaRE4PHsJ
-eJrXK1hfjfPM/+0UahO/BIg9ZQazqqq9304djDNA4sO8UGgFabyVE6CqNwQD
-wxPW6btNh3oGux826dfMCni5irE7AwI1cU/PQJp81lonDZnL0o60Ce7rvtYP
-se/37M/qqTecU5BZ2xwk80QPGfUKQmFSza6yMoDP2dF8kp1A+axuD7qrcr6n
-ruIKxL3UZlphIRXgDCtDNR1k9g2VfkHOTq3inoFiRGOBVZfKv+tnHGdYPHmw
-/6JlCgpV3B4tX+QJeirKjREokdzrxLO0EugPiSMarjpGcgJ1554kKAfgaT0M
-oYNE1NdLiRZz8Tiotyr6iMZi0zSHIMZZTVg5DAVhaSwEIKBIVZWSUi0dB+NI
-YhIp1F09nyIX1G++4iyTsTj4mYy7bxyAc4vyzlSaP3mDO8zAhE6v1FYnkUih
-uzxWiOkkkiihv4HNrrJeIwL1G9luEysRTzp8TW/8rX/u19yvkLcImEBpBshJ
-UBZm57/qtGEBnCBxDn/ADSCiTRQzTu5Yrv7P2qum6DkZWzswEBkRFoFabJza
-ECXsAU3IFbN7P6RWoRy3Q4pd2x2XgM2ZFBlCNVlRv7Xkkc4K0bxXaibZW+xK
-dZ0Ui3HQjyhONTjMfviomuitlKkgeqZSNcnl5kPZcsYPp1zdtLKfCW0yVpNB
-k4jfm1eLGqJF4IneKfgoso/rxFdLyx4Tym9MSHRPiTNxb3TPtLTkmYGIESE+
-2Bmyr6aszX+A3rV/D3FxCahyKSBXlJu3kEjcKX5cVeovlLbUTpBBS7EJDE7F
-g8HySc/AQz4alGm2+AtPA35OCIIxBxEHFP2oqQHoqM/Zce1WUtX2Cycjz3DY
-yYzunCtEJKc7U7tapsqJaWrBOLNWaKG4cAJn0brlLVz6CxMa3YZud1bKXNxJ
-NYsDOfrXtgRV2Dfy8jTjpptMIK9BoBUP5YOPqad2UjkZ5jqOgBqN0kplrLdt
-aEPERn5v5hUSCIo4CcxCE7gwVTzpuDk/8EwCF48nhrboJMo40x7u7nsIysmA
-MNQqvlFzle2pwKQg2iFlr/tKJS8qEdlNKxTyF7ueUOgJ4BSrA40Nz0atIspn
-eA/bNRMMBEpa+XYZkKKlQuKJQdlpFD2qmsp++2s/jU9LANfz8OEZMtfycHA7
-qJnUSuIGStBZOUH22YV4DGd/2C4Ykp9898vJc0FrkhtpYLZNy6f5d6VQtLWT
-iJ4Kmqf4FCZDX41bhC03PTRj5DBKzbk6/VbYIz9+9KD4p03s506NG0HB36Tr
-PGi2lBM/veK6fMu93n10EdS+ub6eLDvrDKiq3p8Sz+ldDmh4diBi642q1fCw
-qNp3v7FWfsLmydXf5j/yFv2n1fdJ3vfsBOJsHSDzibJ9sOuVV6eWgJakNxoP
-6kol9/smL/70UuMM8+rvD5c5Hrv9i/fz3K+fSbs+/Kgq3WU3fdDmx1c1Oc93
-oM/f7ELinWPcU33xQn/DJxeIJ55Pb1Mk3JJEiboZb673bt25SmeVLkYk3/Yk
-iH3ZlX+y+ZHIuu/5iwT6/uNBaRTI33VVZrVo+4ijmiV9mCqZrVnxuTsTf/yD
-CvTT3pBnWxO+d1MeWkslOAcrTzzw/qjpu15rvcHPYfyweB5y29bMUfQkRd5N
-KqcWDSGv9VLZO/S7wr8dcOLYqgVqosVp3nDtrave+byyP/8Qc7Pqkg36Ly9/
-B6qv+v5MTS6vvKxVYw1/CzVdFGAXKh7qo622PnmBtP+JTfidyba4TVy7pPP1
-q4Z3l0XHD5dUvl770gcXRGkt1k3fYhRmiUL+49qOQVyxijjU+eAZSky16iCF
-3eiOmbR+b3FJ8bkPl5hGwOLGVFsKPOa3KWMKxkYl/SZIq91OBFrY1FG7hLhL
-B36+zum5Z9OY5/omdneGVQe1tnxPbVQ5vhd9yjvbncMzMps+XHE95kHE0/11
-N9R0r6sxTOHHLTTm31msC7kVb5Gt8dlke1PFHUDEaDr5IKG5OY6vsHvxhe91
-R+7rokFohX38GFC2LngYee1nwJH097u2vPttfu4wLb61OdwmeVu1/J4RKvy8
-rP6mXz/neQn73JhDbmT1XdVLHXuf/NMHz+itYP5ubb2sqJH3fCLq3EoawRv4
-if6cOxp2x9UE1z9kBmLV4xfn311Y3Ki0ervmu8uu8gyn9r3aFKEtDbMngbm4
-e2XFdvqbRsfXd+yvvur6Gf5Q1//tjmC1tQ6+v59cHNIWAiRBADZB+HbP/A5c
-5Rfrh5/u3t265k3ifShaNHlSESx40pa8UYQNvn/TouccT8fgD4OLpKPnXnxt
-CPhnR4kkUhgyi5cU7As+ZT8Y/o+p2uVORtE6hmBj2UUF8vFpX1xQlvF5Z/9C
-6kjd9Z7hD1Xc5sqeExOeZftqawcCrjeZQgYzHjY3bHnzpUHvwr14K9t+n03q
-f+tEb4S98XFW02pzz3+a/RJq+jjri2Jz9y/ZLk25wLM+8T/vmS2fO+PSFOKO
-8ohLu1suhZ/NBZBZzWtkFTmVg3oDp+bPCw+/2nri95D1Cz3qHk01VazUopmr
-45tAbt4v2bgz94Dnv9n/lWcuGAJJ2l3nT5l5j5VK33T+gT5Q9PXPpi102y+h
-+9y0zu79FK9eQqhptXSL+rt8a+9b9+5m5HDFhvl/hjG2733+UXY/roh9Mcx0
-uZVvPoEPIP4oSr86NNF+4tW1z222Jr1n6Kvuv3+Gu+OULDYJlq3jhp7YQDHa
-1bX7aWxR9IUtwf/cN51LNMkPVozVRABO1tibG1TXNNp38vZ0trg7jBJ6lI9r
-h9k7ptPfb18AfNWZHZcbZJ2yYHdvyj8kPdO8Wcz+kd/dnyF+/YdXzobCzZSh
-gfWVr2/9V11DDXn7gxnoRF45Fd8t/RzMsakc2Lr+wP5ZnkHhq2uGuUDWHSiI
-XFf7+/6tOHwz5o/XR7cvXK5l3tnfWx+Ffqz6z/P2AAj0mkDvP6DSe2gisCyE
-GKoj9z29/PalsnPy9IkfMdrFus3G1AvN6ddigqYzRbDzf3J/0s++hwvjbIT7
-JLpOr15NN68dMcvcntqvlpohbOlk4j7+4dXo5ZSndX/F1mM7I9VQ/aTHGl8q
-F3Z/fuHvW9UEL8zUo/Q8uOxz+1csTbtvoXzDpyjvqPx1GqWoxwFrLq9jjRut
-20C/dzsiPmJz8pRlfxRR9oR9hWXGH8utt9js96NW7BV270/ev9H+jnBq8rFE
-IKL1y91A96mmtP4YLO53QjJSlDsAtbn9yXU/a19F7wZJ/72dJ+OgmO0BmgkZ
-v2BXe04eNXEjnL3zeG2iXxS24MhUJKEeHfusf7Qas/fSiXcDBO2ee9P/OR2s
-S4GTs0+Y3EXE71BnF0HLL88NPxnUPlrcFj2yMalP4hR3PlFjp3L+7bqOBJh/
-PV9hMnLwehCCKtplFJj8SweKxfU+PfmxfP3jONMCGSZKfPxZVVZQTV31zb6X
-rZrJd/fU3GqbOVSRS5nkAqQLTXYHkobf3FrxdF9fUp948cV//xkHr4nu2jBh
-v/7jnKXYZuv7+LWhxdlaD1wGbned4z1JuY366O6LiVFcZ5kWiTin+M/wfZdm
-KwbsQ8Qn/ni/SzffzfDG08k9Bz46d9cd+CD/8+a26kvDjTCfTQ13lwCyje2e
-lOAi4boLnH8qN8JWzwe1P7hIeEgzTw5+C0jl9O33Tq8wK/108uk7r7vffu7v
-bSiItciOSNSgKT9k/on0PLF7d2D10ZmPWU8Juai22Qq16S15eqJO1+EnmIOr
-ndZ7vfh3d8PZmUy8QH7SbXr/yJi4ibjlRbjzvVN5R34cOVc4RG2obHzJjF1X
-2eg488aoJPYSZvef3ysuvec8MtQMizy252K+Hh8uq9jVY28kIiRs9q0RBJU6
-hgdb/bItaGozzXuCvCnbEXDleZgl18Q/bfTWlSjC2BrFE9MrV0cKzGNfveVu
-TaIztr0p2fr21YXFM3vg7Ly9F7KndJ7Ell4Y2EYdG/v7xKryZ0/yH+/2TV04
-EZc2NXO4ZiofT4A9TIzVuvsUrmj9EJ0ZPXEBOVxEMlT8rec29jnMpQ1LDleR
-ceOz+se2m9Ufz6xy/yl7WO/17v3Ir18G5G93HIoXZ048yjPvctW/uVl3z3iU
-VgWjDvskxCfjdJj/1qo3DQ0FbTN//hl723mKQrpQMn+atMVn9iXbcfVXfttM
-ed2osdNepx02tRfPrL/wXf3hRdmBroubT1jErtwOX9uu2TwpwlfXvaqjtF0g
-6Lfl623UVB0X0NdOfS95I7BYu7+4ZcQ26Y7dIxcdtwOeefWsv02vN+xZAs5/
-be38u983V/c6yrsaxRnGndrg2nZ4sc2v9KPPgS7ZW3nnh31oOO1drkLYXVc1
-9XBtjD4vkcVdkI48pJK51vK111iQ/LlJ1zSczRKAezieesu1l/Kb3B4ChZSC
-xNPz7ZysMIUg4WUakVlGaVha+SY1kOnx8WJ3U4XcG7+g3+kSCYfhoCAByjQy
-Q+KbeenPrqlyvOJV9MrG2wgHKHxOxqz+zWwEefPCWArEQdRNA5FsuRMs4mPK
-Sp8jSSrrZKwy7M+mrahkek4HelYVUw9+bfpC01zshGIaYoUZaM7C2MN+DQyI
-XuHT2Y6CRoHz8MF+l5AWcm4VmvMxtHBGSQr9/HEJoJv5Ppfpw9opKx175F70
-gmR29535v3abgeP5ZGOFvGy7JQDvEwiVdw7KOxInqUSeIA/peFPlXIUogyGF
-5UjaiK1HwzZ1Wk/39SEvISVoqhgDXfi8Qb3fIWEJsOPxIJyFkRxGxLvralQY
-m7V5CWAQvVDieZ6ZSSlI+Lx8oQ72/WQcquimfJHICxps9IkobG6UFYLXhaG5
-UqZMVfn62UpbcDY20X09POoSwLsPgPNKU5FEzkdAMF/hjJ/h3a0EPpt6S0Ru
-tDAAqyQatUIUylAo/ocE5ygn4zQJqkT2riYUk0chy8dFvddqVlGhCx+QQn2d
-NAanmzYjfYT5y6yY80Mkcual9oF/Yv9MIdMLQvQrc76qGfUTvaLzR5EBRC+S
-SBN/MYno9RMgc6uQ1zTWTCpDSlSbbvUbqSpjJ7DyLhh72Nkuenm5999Nllyf
-FeBj5yUzeLlQBHYlSXM3iqmxBAQQMWimQmk2biwny0sV2JWwhTmmkXJ8IgUD
-W7AOos18QNgm68dOgncpCm9yl56n/E6cPLy19F02FTSxVqZCyGM4/JldjX+X
-4xU3pLKmt0LjljWdEWEgxX7MMXLehydo2UhZYSF2DKF7mBtBphsDirrBka+Y
-cfuw7w2wPDjEFGT7oP0xf6bU0xY+m5ZyBSInZ6xQP6gBC/NpeGQn4JB/YxKs
-1+IeshdIOt550jM9aOhgd90Mpxi2MeEAdbUgep69bvxWTwmWFTdCTnfruBHe
-JAPn4UkPtQX/L+b16Mdbq3UXUEFWmRLNywUt+c63mzfl4JPEzMx39vHlXirk
-NYQuNGCGl5nc2E5FjeUu21uglWIsv3HUOwl0rSg+WffrhkPORFvvo6dT6htZ
-BmjxfAe2jVV2UI9PU1WZiVSJTLjO0a2wQFhEN1Ww4JmniZVLMZlqSFXF8uK0
-GQYcfU1e/FyK34zSbHlZtlXsFBYLTGCwLFAn9aUco5y/v2pOfzYli0Ru/bz4
-op+WZJiqXt8jOWdg/A+p6liwQs7TAViSz4i/tpHGUVKFuW1HcmUmh2wR4HOo
-RzHtNohlbWp3Fh38dnOlzok8gtitr6YYQ1KaF/+8flXQw/7fMtB8nk2sIiSJ
-4skvtwgLtS8IdXavLQpfXjY2FCimXan4hQ+7VsWpx6tyyPm82HZYcmXdEnB7
-a5J2pB0ow6QSE2oLm8nDEJeAa5t0FKFmwmnpZwAeWzJww1EFXkuWjWNC0Y8X
-HSzCGdesU1VJPKqmrVfgaFeJliVoRt1MCqhLmyDFGIXW3H3tGScqQRm6h8wN
-8/8e0irIlrj+dGlvVCZLfwgakyt5GDIuik6MPvrr+ns0t6KaBQ9iLAGnNQT5
-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
-f3kPWT80ihzoH/Li0D+5Wewsrd83jerF3wANTYFpdZVtSK+OuxWnsbsWWxnc
-KmoL/xXatr5spHG1Yt8Tkb1t4+tG/g+XLX+ruwgmf1zXekJeq4CV9YtPqEw6
-BQfWmlg80J34tx5WI/Fv8E6lCBqreQxa7qvQJSDky6yqM+7l6Zahf7OGiOJ5
-7oh+ZqizU5JB0Kb+PdtTKDPZsqdPPjSuBiPK2/0bkvO9JUQibKdONnz1N8UF
-/pe9tgJrFhQt6ekT4RdxYZ6zF+6aEpJQMrs/Mb4tn4aPTxUTtds2c2bJlUDy
-MVFPobT9QjHPDppUpLD8slPbscrt/fkQprGw41zP4+LAYKP8JGXo5ap+PEoZ
-cu9cb6XJpYgJo/YDwdxe0+ajuCWgKe9K/9f6hiL4wKVSQpopPEOKvCZ5+ra4
-Iftf0YzDLkDXRQAJ5SKvEfXCBRl//STv7E7IbzmV4b73dMxveCCzbHX/eTc0
-08Ntr65+/FOTYffspOKEqN8bF701Sqbv/wl/1oTMXTe4ZjBLaeZxiOz+5bOE
-tSF8VWl/RJlww583S30UJ3tkhv9m9B01WPORQBsWLWwgp0sxB/kj4bVlfo6b
-XtJ1N92nwocTlKuJq566tBDoVcbIbZgn8bezo+K+n0J7ufy2Bv1PPYHh/YaG
-y/bi71uhzRoG6py3SJQXTja/SLjlOx0xS+n2EsntPP9wC31myJ17Tt3ReblO
-gFUG4dY4abpv/0GLxn//8sTPL8s5Rzyb154+7YRd41jiF7afFjFakd1DMHhb
-4V599+muoLsCS9vC805iQxPWqbci17S+anei8gK9waTP0fkx/GyWcMC+c98u
-t/eq9TUvqkKHX9Va7Le8ZhhwX+X0VHGUNxkboeHnc+ogv53n5ODPHhOdLoGW
-zbH6uPrdu92yF4s+UuN6W6KHiv75sY7xc7PFjsXylwZPg94OrKtH6oTHXGjN
-6078jzkW7md0daTeaF9vkqzwqavpNEfKltW27No9B9X/NuqjyapIOOSk+lA/
-9eX7f69+/nVyf3Nk4HfbE8J069XxnlMNFREjK+xqLeYSPUaR5i6TtAqcdBfj
-QGPY8dvE6IzuhEXF9s9vstvW1Y6+XtddNfRmzaP++agxydmoZ359ZjvMtmQx
-cLXst4KNeK2wHv4Ocihu4dWrLcmihHastuq46I3mz/hJp341OVkmqkt+2ukz
-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
-ltDRbS1g9rzWpJOvsk4HSDaLXpQ5uzl1Gvt/wXAnr+aX2RCIkpwx87KS/MDf
-iSxhpEyVkxd3sEanjspgmcSZMPCzZZYtzvbp3akFDMu3kzTR8R1piPxR4TQY
-12akJVcOBCEtRSK3VOr8Z6dqPUgbFIsnHozc6w4lh+FHTGigcxsbekoFWBBq
-t9glUevrQxNa0eKB++upbASX/O7uinYdq/6VOf+mrKd+VeUUU9Om5oo5iITl
-UsgSevT/eiviC2ONCDTxUW8wq3hA1rQJ+0rMvCxb4oTTn01frBoH6OhWDKwc
-FQRVjNz/piDfAn+Csx9/K2khl9sXdaywvQFKIXZXqCr5lVdWoJShCnpOr8YB
-Q2Hj7+U2aWZwMu5Qk5C1Km4PwmaMSt7dpS14FcI1+nKg4yyd8Wkgy6VNKJbg
-OGlyvjPU7vyDHWfwpnIvHXdygE98AMvUDgzZm24kqRq6Yji/mY0mIic1A9Wx
-wfeWzuHumFBaK7aiyjVtXpXT4n//f70l7pxjWClOVyeojE+/hLz663YWbXr1
-o4p53+FLjTetV532CLtucSCS8AxRDFfzvzl9oOlOAr3d9hPikbxvS9kScC+t
-42RWKC9B8M63vPxMY6rOqRaTnQ30+xVPivyPR3YeK37Umb4DfyFPzmgeXD3e
-c563+EF9R8rezvsvU+fjn8o5Ls95qj/9fb+efvjk5Kt7LmM7rixA0RW7eAq9
-EfK6sJELfUl3dZaAevqwC2r2c5KKMTy+s87+9V7IbExa28UlQLePorzAQARk
-OaJnbJ/karV9mAm5zB964AUzDI3CqXxWtOBZJJjAreZSneHjSmpdH+q4KTAa
-mLxvxN50PvjpuE32Ldu/n0peaHv/VWv/jWP85aHFivm+98+V9DnJ828t6Jk2
-Q0GK2thrwh6WT3HY41sHvfL8XqEDVq1W7ea9ij1AiCIi75+sVZz2sEe2G1AW
-Oqdso/2DhpcAIOFOz/vey/xQ72JPv5Zf/ZFF148S597Xb5g8OeX36tUJiZ3q
-7N5HsiZx98sPx0umY3rvdIRZ3Om2ow0DEfN4ExPkRHF78t1fDaavDtjrdTE1
-Crp5aqntkQkVO+aPD6+OcJv2rGvks65/D/pnp0Ajm7/ul71H4PFn8dp7MFpP
-d7a8lncFI7y2r+p/ae8ydXdENLCLH75lq+c2P+Gz0fMNT/c6vRpzytov6ddJ
-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
-qjnzjwW5SGkz6m0qQAgQ8CjIgg+SEBO3XG4e0B2Oj/o8mhLb62ChfATcovpI
-znVQ5xM0z8o9Wo+y6XCZdm3fa9wJujr8S353Os/AzTbVrnhARXxB/W9Z6F+K
-zOuychk/mJb+Oap+YqqRftF4Qi5/ogH94cxrCJKV7BXLL1SND5BaHxJdvLQF
-b5rARjwdhMUyLjaBWPNkayWleXfIw4nDVUeZWzwaHyq0h1F+Zfy1Vx2EoT2t
-o26okcNU9iv28r7/le7tOiveXrw1bmnWeJ//u0ut+ZelUtzT6Hdbu/CZ1R/P
-JR0lRwL81d0CsGYbQEep79FvPtuVp09tEPG21vrUW4zZK3rtLPVk/UhlkSzo
-74sdp9zjL8fuvY7mmhecTOg7dzyP9T3yqMcTaF9lY9tjJ/MDmXSNppZjQZ3M
-HZmurp33JIVvsg0I2GrbRR0+c114JeiEUsxXS4jHeVRSpJ3S3onq9Ma59IAV
-Thv0cXjzXQXey/xyo1v4724fVQV9FUJd6bmiQqIkuMXj0fPIfr399Wz4YxMj
-IRuCYgUNKTT+7uqIBoCgBRWaVK2wKNR6f5+o8tjAcltp2chn3CaFNoBlU7YW
-Vsd2nduW6WLlGK9Bfp4Xj9B4/jhe4/mTHPND65I3HAmUAjr/asOhY/I5oOfJ
-mhfWJWs8bwLarbP5f+mSIyVD7YKFlbzrFJA08oVcQX8qnb733N4dySiNV1+e
-J3u4vdoYgLajP4nfIclrnKxRsH+DvAtCUgoIeA7+K0UKqPzxnVP1xhlK9K4r
-r54na7zaIH8tORL0v/9crCSpjgI1AHaJ5NWmHNRp80J9/XUu9nY9j6sUGPSy
-9u41UK57ovvvKUnQ314Z+LLVl5Ql3uysRf4aSJtOaJ6r3FmaT+xrOaWM88ZE
-rfxQNsHxX5xr3gaC0xCnwQ5otn2HsZ+Afjmjl+CNuNljrlwnFPkr8Jg11ZrS
-DEqgU92SKMBE1iGMMQULdKpnP50lUem5cO3A4JCrkbPTMA0jFn+psBjnxrHG
-QXAItQ/bZFkjvfRE2vo4eRxgycgZGglxAIRvCueLqz4bsV4z+0lEHRlYUuDN
-QWipkF1/7y5V2ZBHRUU1WGMD6piVTPtlCFm98zQGl+sWz0mQRLdjdrMEjDcm
-JHG1Wf6p9LCRngx8tkA2nDzLmBNX1WtcAkl8byaKVboT2cu4yEyRHpfjGCEl
-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
-foPPb289T9U96FbwLp37WtYqWzbVZLPVegy6xSqv2vhn+hu/kugt0F8UleIP
-61cfeQQ3C3HXdGj78UFvkLU/uVdwd3eOhwFQD/L/RXpTkzGz/39ID6wv+bcz
-3n+1NdEcqpvPuHq1y0r+njompJjeefCYcukJY5fczT6bXewQmqo7/jeTSh5A
-j+Y7+8vf7QaQSMlVYLKTrFPIHJN3cbCwOmx1DPR/ixwg+XtP0jOkKLObP89H
-wl9fozl+7GGvfn51y3MNpHrxtag/hyTNMw5pbH0QhEg9Tri5C/lNgfrHK6b0
-0jf4gz8p369E/rnUX7/PKjT82X9H1kBH41WE7se8m59gHgY/Nrv5JcSG6VFd
-8CPJJKQ2e4zTIXLauWp28OeNpSmZi83rZDaxlxk3fm9bbieO3tn3nkfd1Rcg
-3vWaQT5BXbDrqzEsdJ378aRkoJgA+ZXk3fpRfY6Y1MsOu1gThFo0nN3uQY0a
-9zctPu/eL7Xr+JsH6snXO287T7fxJt5n34JSDvdEJ2gORi2VnYjG9IzPH//P
-3Nfhhtnn9Nik3knqY2vxlP/Ex6CbpVvLrClXRaPGse4Deaebos9vPo920JjN
-PW8XVjwwZN6FKOhcPPB6fM6LxLr538GIAeJWfb4Di5JcxG412LfkKTozt8M4
-gKamKdWXRkKQvkiL1QVo+AIjefLYjR09u2wzN4Chdy9H38d94TioiTHnG799
-O03VP6JVW+oYUfdz/1cI2fgZVFAtcCsrvR4TjPb/Hx6K/38/O+sB0+3/hq0E
-Lko/6cH9/u8VzQn3OLxUXDZX4YcynD9JhIUJH4VPbXRQqX1ZOP/tz4pyLWGM
-wTtR7e5T7PBaNF5c671paOCXY5gyfTStq6wrz2LDJXJYb8PuV/W1J4xv0Dw/
-XvuoxY21w+RFO1gZMh5rPTMrdsh5nLeYEffu5IRBv/WobkZyYtPCgNbg6b9a
-X7/r6PWyPf+reBQQIHXbMMtHVsX458aP6pRLww9LMstk2hRXG8vD6n3Cgstd
-wllId+wjvoK5FJuehQ/YFZmvHC1kh4QJSyNM078oywVadHaHhBtoTAZN6uA+
-PUipkbK31Qwq3yEBi4A0F60DhL0JIQF2gMGycb2+i5WyueT67yYAK16WLNL9
-P+D6/0GUl/+/gh2p79JPcpbrvpdVvb9YX4NtJU3+NwhA//dcBn67uMb/HzYE
-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
-X2cCCATl4tnrW/f1ZNotzUrUTfKzk9CTe8PD/E6V63q9DJf9jCk8/Mz727G/
-txqfWgJr+QlPKFOHH21cGW3B4I63PlqHfbpy15XDeh8bz45iZtK5O+4lHhi4
-7YMqDviiFlTvtb7cUfDvofNeIp8R2M9iPukf6YaCbFo5awwMrUOk00Y+PMhq
-a4yKXxVvNMOrgv+v5SgGFxDHvg9nbr68fXjN+7C6eWii/dAYsebxXOOJ287T
-P8Z7TJVBWrUZ4CNwe+a7t8YWbRFRH6PPPdRr0s7+/q6fvq8bo69C/F8zv7he
-pCSav/LqFsm8jKqPba5O/LXxovDvbf3omXCCsAQ7ulTwcZPr4TkUDCn8/aBE
-7HvoXtXRNfvn7W/C658QYGhvhW8FZfOea1Xx7pBZ0nvoaPgrr5fxhnuK9zKB
-ITm1vOVvXQYPaAWMYcZ4fOwK05E1D7259HnKcZK1xFP5ArCF1qUS+9OutZeK
-2aKbPtzr5wYkDnOu3KzgZ7aPSdfCcvrWPDXn0juIS9ediKpiQbqB6X1wodDm
-Y/kr6y2fmL2Bxez/Xlj0oxuO/9y4AII8+m0xfQOkPzaL1aJD0vsDNz80tFjZ
-PIZUmjeiI8auVIuoj3wuTVCnNbSnHQ01O4Yu/+uFCgtkgaujFkC4MG4bM/qq
-rn/Lc7DU3x8rOfVX39u9T/T4n2bs54BXONTfYjJzP/ju0X/i5IfTPTM1Q0La
-94PmeMzjNxm366LylKQYCaCzp063prHNnLr//F63LfL9fdb7dnKvUvjkXuKj
-58t8Dt0bA6WYcxPu/dFx6yll7n8j+nlOuvKH8Evw2TPvxzy+p2wqg/1DS8u4
-Rn6qYLfXPORdyL8PC/UjdsO7fl5wb3gDd54eM78lk7MLsU+Dd67+t+5G6Xkk
-tRcrOaodu2WuRy1VzYkPXTGNQ6Y+tZpntN5xqu6hUacd4wXcmrN23UynJR5e
-oyZsyw0Pb4c8w7hc8Qnj55dGSZQh+VVhc3eZ/1xddPtKMqD8mJJko2Nbb5tV
-2Y4fYoU8s21qFbqdcPhbPDxjT717dFt848cTx/MzWLO8FpTTj90eXiOI0fFD
-Y5UDl/WX4fR+TzIc0JadGeob7iOkH8D0dN9jHs0GBFQAqNvxPZzEDSnz2y7c
-G1s2QA090HXGE73kxYUN5wFtB+w5/ZVXZztBuIKiyH1WIroJ+bgxaMON41pX
-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
-K0c0YjQ8sFxemsUY1MitWODV80d8/Y8vw60637YT9oS0pbW6sqXi8O6PoCcO
-YN4/s/cCpu4Lv9ooHj7Ej+W2FE/Nk+5XW27/9mvSyAPe79nJupi9z7T6xoii
-59KNfkzd9eNRG1+fDpjbfdglaMtRz1VjLI9NliMQy92GdfEdAx9xvzzOR0O9
-P4FW5Vd7phh3b/g67DP/4TNoS7HIM9Yhdhd6YvDHd0Xc8s237bcEPkxXN669
-cy54Y7Dl++gNbq9Bw8NTsv3nPC/XHt192PXoAmin4h5j019rV/5rPWAc78q1
-rynbydpnbWV2Ave9+Dyfve5S21yPpaig5W9PQvHqnKXnbsEyWPdWhtz69kwk
-v7fke//hnDuZGvtPCbay0Fi0rd5najDqqjQwt9bqk2ZRrFPLcHGYLOHkxphR
-t1OSVdUVsTs/pv4ziMPos5ihu8Vn7B1fWtI+9zgnXf/184bRiltrLIWU7MpX
-1fbFTyrEqRWSN3Y7Smw+8r0E70gToR2x+KO490kjX0BvXGn8mINeG7NhNoMI
-29zh7e+Yv3IH/4XumHoc54Lf99zUI9vpyqcDjx89Nco98/c/xCNLN19GGQbs
-suvjct//s3U++qrluXK6uZ7rxXujEf/4r16t//xc2Vx3+MUfu7f7fwW9PgJN
-fL/siH4i7o2/dV/LJRV2ZtcWz9Mby127l6ksu59Vlu/yKM+zDc9R9mz6omf5
-mm+yOeroGdtW5/gtNuPQ2bZXdt9ye1P2jeeGIs1JMXw3pFFszDDISUcEDSQq
-SuNTZUODF03Mcx7Jyy1MVTEIFABf+orKFkAunRzrpZTGaoijwJjTfTVJzMHL
-PAcWB0JqQg+OussGM5ujkfkQxhAmFnP2u72E4jjmhdwSlrQAciyNlo57DByv
-GWx1ZJ/LcJrHWg8TCNg6cs9g8Rqsa4YGwNVhUxTJJKsOllO7HiZgG5S5O0yP
-uY1/J2hBSBpY2eEonSViG84vXwBRENZiBg+3bp23paWom8JxVOHqHvJPAAi1
-uabWSqqG+0BnNNyu2uMr3CQP7N47AFbyxd+knRyBPtBsEPWrvKQjaTmpk1LS
-qJQnaOwNIY0AntSk0xJNEmY7dAlnkaEBn1zv0OITmK2FH/Vixhk8qUxUI7yt
-QdVam0KpGp6ZV9OE/L1Vj+n4eAAiVSbz5wc4jI25ZZjrIo00PNPvjq1pCvaY
-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
-9a6iDl+wH5QcDVATO4budSoszj+A3LzcCw4XoQ1x+77eq+z8/Ab831DVN55V
-tyrHT/TkGZXRq0mLJ4Lq1sH3fSvRPJXXvvY+Rz9m78IwbbL0TPKlwGD0z/rj
-8XM96703l+NJbAL8mOISfgVp98cGptHKc9RKe+AxsVotK+vnbZ+NDW5XBxdO
-1T5wnZiztlvzL/VZCZ9fVYuSva0jdcxpe3/JuseVeJkQEqfEYqVI6s8qP9vh
-1/mUVIcPdfnyZXRZg4UV/BtvDCSps28qZ88jn4+0uCMyHXok2WN9uVd7Hlji
-WmudrlrJR98VzmKtLfl1P3wnOcd7tX8xTmOOaaXNaCn5HIsLMs8enRlVWtRc
-QcQWFJFLLt44/2vplYy4djlEyvto2uoTnrL+/vPfr2bOY+6lCn1C8M3qd+AY
-Y2MUjKdrPaD6MDrTNAniePKJe0mgbXv37o290hHJbF6OfNqUe/Uw4YhosiF8
-rxGY6+RQ1yi8fT9p43LrsRsY+sMY5bxs+J3z2lmzbP3i0S0QSXWipgvXZUDW
-DOebuH7gfTEkCfczruqfnOhwaJ8I4+eG+TKiFfIcDqamomC67PVdN4R7V/jV
-409J+hh+ze8z0X8tTQPvQ/P9I3qXCyDNnx8+UPjU7TbcEq1S/fTvB/EXqCCo
-Muwbc/I5TzVkYgs0O9Uzr+I/4DJ64ULOSH5o5eXI3purrDnrvxNwqRWSsz2p
-weuY2zwt6GmfrFZI1GR0x8nqNPi3KZbdHUWvwQv7N2dRHE+7hatlPgt4zehQ
-v6dTGbczJDhtbfZYOMOt+qA+HevOsK4yhFTWwOaUTnzy9NNL/oD6tYw9Guno
-SH0gj8PHOUYTJDJ/KshIPCDib68l2C/WPvkKM8hqOOpnentz8dztT+SF/nK5
-KycwBfWMuquZCVugbezinJsTt/tmxbJcvAosJzYt+WLI2+VVG1GJR+5GdS5Y
-lJ1Hi/lqbYF2+7Of3zy1pBeJziJl35FOcEvZl+iBbuZ2FT6uwiDZp9GVtkP3
-5rV2VL74+5F6lPi0AWJTOObzzIfy7WiULelJChcR+vpjHivlLVt1NmmhuuMV
-CfKb9tlQ/6vYObgVpzQtSC1KJqZsQiLVH8RFbFCxg4eRIu/y/0PrfO4K+7BQ
-QYN/6hglnIhO9RT2UemK2REae7Dn74eFcKxXiNT1ZyCZkDbt8iX1nmUOIdVT
-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
-I67HmJOcuFfry8l4n5Vf2/fs/j0lq0PGh/F3VvfNVlZkMdV98+yN/li4hyRg
-kjDy2yfEvUcr56VPDVWNeoEh2BqZZbIt4NMnvIKlswnbdDb9OpH7X/XEZ2am
-dlMfRhXehyr5qpsBnq0Ui4PnyBfNRFPEsJ25GPU1u4/7xHZz2LjapcJ92rLV
-j7CV5ZDbYC8U4OtMSjENv32T+eyAptvMH0+Wmt/pY8Rhjj6MKl2FEGpkrE7M
-QqPtMTodCnZQLoWL1HW1FM5fpGaWAh52qmfKDelQJhVrKKbzZ0PgMJAq60Gh
-2lOZssNe+GOPvUzmBvOxEYR+CCUvpA7w6np6J8wZcyZKqdBI5hBKyZBWhoNG
-clPO2ZwtFuqlVyL5NeATWyBVfr0k70u0XRRYnmmMeHckrmGsXI1usAXC69W6
-xcQoJRdCShVdREVAjaQJLNOGM2O+6LAqvUIfzfJEIUJXiua37c2d1uDeygQp
-tloIKo7hSbbaZCNBvx0zDQbmTwTeP6FMVhu2tgq4ah84Zq0FoRcePihtRXju
-rHZJDV7jXg1/e9nH6VGZfNuty2H6V9nIlAYT5B4Di5f6K22t80H1ka9/ST4T
-2Rs2RJYOe/MMWQ47fXh21zja8Yrr5b1hbkHfQ3rwMX/C9Zddmrm9XNkymWGF
-09/f/Dk4ldr/ZubC0cC0UO+/aQu0538hUeJFlRLzpD3YSZB47ubgQJe+dUzR
-8M5a/+58/iw2+xM/bPLuixtvah4Xrt8lHixNvCMe7lys4m5I7J5SH3G5E9y3
-80pypYyy3II2bbMI+xKVPefs9bTaNfz7ZiHpoKcf6axu3nUeeGLOROPE8Qj6
-Th0Dt4I3DzExVx/+aflGGG2tFN290ft70uabR603uWhdhzBkdP7XGwm1D1/G
-t9tZIhErO9YCJ9aGjyxLi7NgbpEd3kkL9CT/gvQho3d744RuwV6Un/zu65cr
-vnOsSHkXjmcpn7tQGZfXfoRb7XtHOTsZEtJ/np6b0joT8ndOaEgpIXG1gv4d
-uw/DtvbBt8rHZ2cXJP+aMd8e0hKEuq8GUs5MCngbPPrl3OtrFVFXv9e7tVdl
-RxnhJVWSvxvckWxTKBVn6bDcHdZuC0+MaB1/GJOnL7beyJxzP2smIb1/KWF5
-n45btFPv6BHIoq1PcgTvc6tWuLxwClmXL22aPPJSuOznQ+TjFZiV306Zcy4Q
-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
-IdBGf8DkpeHbKcRA92RYiZpDyYNTNkFpyaSptIFqTXnxJnylQ2PfcfKne/Xp
-C09OeOnOA7rvFPSQLvn/mP5eo9jHXMcSgCvdUfKZEZQUGWNDvO/HU2+9XZ9H
-XocMNR/ujTzacZRT2xeae/NwmLX+1Kurt12DNVLcVb9ESreP6A+ZmkFD6gEJ
-Q7pFUzG4AVxTf31Aq/MA2uBmQFCAH0qu/nzPZbf0XV3z+Qgx3bKUljyVP9lt
-R0dlGTtTfyKBPa+KCVmNrSu4MztpJfo4v96+zbz43JGobTnWxysMpdseHc9o
-vqVjiHFmlMq2xRowDKr7ncOG1c0C9ANqwrro35N+PDly7Q41+oSuTQ+hSuLl
-eRsNa+AYzo5/eMZdkWFYCX3qZ6COdW8NCDwmHhVpJkxbusaEHvRFAJ/7hUIC
-7K0v9S9L7GQLpTYNlr52c/i36tHTtmn9IGwtTyVribDOl9vU273g138tLeKM
-zWgBoyxfUBt39uyP7KY+XajXZrh49KmBlat8LuJHI47tHlpoD4sV62MNPd/X
-HeKR+eNZS+TZtRflhOS1pZSOirbxYT8dWuhj6dzfIIHMUjKOxzxY5wy8vFzG
-zmxfHfaRia2Uf4sjqLvc+KxtqF8V1VL2/Lv8+fo/XGjJCxMK/3e5F9o0OZAb
-2FrpdeZboX0Gt5HxoXjJCOClQ82yeEt59s8pJM7clYWXWp7BUvDScOsIkbLX
-5UMap5tea6jQE+ZVPyxrPw/b72HZ51d5cj+yqPNOahqbqAN98+H1jtAxraX7
-L6Mvv1t+XVnsm2XlOucc8rfzxOnifzvjx7JGlVa2U7ZMeGL9GUvO97t2xMDX
-Z+c83w78GoqPEwI5nZ1oMCPIXyBN1zy/YWVe+jb17kqHW6KO4YiK1Y5plX9Y
-P2FM+YKUEm7CuMes+zHRsLKZfah9/Rs6+4MLfZfMqlW4xQh0ukijk/viDg2B
-f2Hgsy7T8ba4HXdTVbL6Wdqx5WiMM3FOo856tqIvlkT9ZGjED+0LDuJ4cQZy
-YwwFPv5I1+vO+7zha+p4ZV9caSf0R8Mes50UvAcK6/k0f/Zn6pzr3Rx/S3M6
-eYMkMoXeKDoQkmGwplR5HIOR2ghhz3yJTp4xCKFEe+yCB8HOXLDWalHdoRYu
-XMvEi/TFnoj8Qb+OhuP9zx6x//SyY6+yKyOJY2b/W3PhjrnNO9/DLfHV+anB
-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
-Gz/PwNu/w0eGbn945dR0ud9GuEwk5G9EMf7Uih825+Je05s3OEmrMGHfo5ke
-+/zPlflPv7p7SEhD/Vxh6Ey54WG682tcUeQj91HrQAmR36qvjp7+p7giaabm
-Y129XLe/LwCmGDIxgA5rOjg21+teYVPFWHx0XKjymQ6x1GPZsG5yxOFGjTWC
-+OOrxCHpFUbtFz0Q5379FmBiJzbsLDLhfFBAusFKMOIP/rHh8Uakx7VNv6lV
-l5YHdzeGq0hSoVzVb41H1AaVse+vayRUq71bnE7bHA/p2wKcviRmtBMcYLnx
-HiYxwm51aMTYMZTWHtiBWg/cEZKmYMOgovW+yHM4ZP7I3AV3E9CD/q+vLPQj
-xynvQAMnrxYFPt6opL+z/AqpDTYDGsSGPipfIpcw8VkxuiXsVpe+stBcDQdM
-KEbj648gmQS0ONup13mndpXz2YxK5mhYn92uiGHzELSFFlpNZLnrXPRX5+D0
-jG5X8ANOLAR+LbNuisMZSImBD2idPUex4BMbsoa136bJZgybDgu7EpKYY4e9
-Edb4p2UGxiEnyn7IaKYmvoYpgsb707/8uX4gs4KdPG3vPIvc3ew1EwiVz1DW
-2TAnsvB55woY7l/HWyezXyC82yxWWmUPD+dTlETqwIDIyRl689H1b+lFN0On
-A0bVT1SJOIKnTVwr8YgLM/3EvliSk4+buON9G8OghN/PeCo4iYc3KMI5W4D9
-Md3yXyMmcd+a+uodQzeuNYX5Sz3WYe74BgP6ZhGS67WKvR18SCZhflXm/pkn
-35rtsig9ma4Hr7UauHQNrokoe07JVXIbOMfMPhX+6o9FxO24vzo6XN/3J7yW
-xNfjaQseF9hHW789KZ98Trdys3exONv39mRybo+2HwGIRarsvmfisHoAgtgc
-MITu23vQLqE2NDuozoDeIa/br+nxVOZ+yoPbR6pFFOa6MPVTB/cjrvgnC4nu
-UVTENLgDGffO+RuehJffvHhORqf/IKqhnsIqiswjtDcCq7/8IT49p3TBosp8
-vapPp0c9L1Gk7vQtlT9Ya5N/le+XVjUeFaZ5YWNgDOstwCOmbHSuFuVm3vix
-+25/pU4w2E4mE8hLbg6tr48OAPbg4uUINuY7s1agz74NRiZO9D8ribs2gzkR
-8s8cWuo36jr3O+Y4GfrF/33V2QCp11En/jreCtU69N39hU7DiSGjInKa14cn
-wIIUYqkOFRwpTsDG1CFLGlPveUV4Tj7PLr1q6PXs3p2PA+9mfRsYhKQwVcwT
-mYvY/b9erx/qrBtUUq2b1uX5eKX3aFhlIy+qXM/Ae/5NfwWrNqbDzohdGBd7
-S/TwWXXpvsMw3CfLrEl3Rb7Ykx01Ki4nkJFTFVYjvi5st+JhQomb1nTFzD1P
-1R2SYtE8X+V7Kzmutd/+lvQ4hbvIrxRUXwLCLOFSUOoM/nBvfVRYwPIrzszk
-olP9w+vxJ+7c7PI3tWB234vRZPjj/Cb7yv8sKUUGHB9uDDmUkPywybk6o/tS
-MOy+5ceSpfbazeZwOnkw7rDsa9mmOtqSO7iQnvW6mqF/vS5pJWB+ARpadOzY
-7pZIUPT4wPnGE98YsaUh57CT2qRSo1+nQSxgPGH1A9rhIv9s/cNrha8M35zR
-ORYPfIlqsAYGdgSaefgwPB7LX+g7MeDVq4aXWTl3VUP/oJGHjZ7MGkzHbOer
-nNuOn6nFwgYDRxT362nVypdmdbhT1XVepmSkI6GlxzzjggbesfDCFX2VS88M
-T3+rTnTM+9Fx3vJpFyUPKBdb6Wk8ELYFEGGvQcXmMlPC4PrzIpdfCYFV1bDh
-qPv6N4mjbvrSmxYold8xxgx+CZb+edZZ/YVSYHxOcoZSPjg3wl2WP2B9cFf/
-P7Dtz4B/yRJ5qlT8EdrR39zLR6wRpG6Dzju5X/YuKqT81GKCn8yf08w9Mvhj
-jbE4/fQwfOhEeY/vVaRMqPcl9aoGxOOdQ8H3Bzv/cRFpHPsAXQU/pW8JpBoM
-KBJl+2dEzY9Fq6jxo+h/V99rGlKX0F8fcaWRIf9xcvYTc+QOZ0XrbYTlqVt7
-E/qmmGUI3VCf32G6JKDu6kox5uqOv526RLoNMGcJFKZLW3AHXywvZodQdoZX
-Z71o+ZIb/5ekfm1UvXlNK4Mh3v6tYSnpnMPVujxVP8ilz+hLIhGeSnI25qVH
-rqn0WUDOBun1DPkghR8S0sjVWINbyf6dBGB/vUc7X6s+baIsUat0uHxkdJf4
-cV0xc3tZnfV2azzuaegYAL5G+yB1997ZCAOy3+08I5H3eW6n/kz7fsl1wt+N
-3ts4bllDwW9qPpIvTHFFOW+8pnuktWZWaTurPS0LuKsTnXH/TnYd2vcLGzep
-yq4o3bHSs+h9da6nQ1s1LS4oxcZnC/CFSty96n/S+XpDyv3XN94/6uy5mL/5
-D0SpvB2J6kB4PVv0Hydzv1flB4RLCevS6L0D6YORIQQZ3ts/5yqf+b3zdjYx
-VvWSGvcDgpLa2X4FHnODuS0VfdiKTf2PemWo6IGEjQhWqeLr3y9UqvUrzvnk
-dGnQTmxoEN3/0a/OtbfeRUVznBIiv7ZXZ+GSMSZ6rfBB5Nf0KGPFE4FRclHF
-XLVJepMYu3/MWq9pDZ2rLvH6jOWLkY7oma9R1iYwTLZ7f+/hiG5/atPiRoNA
-h0fxOmopuxhz/0x8XMw0lFcNGkvQNr61q5HXWZuNgnqIoc/ztd0CPO45a836
-3rKW7nDQ/FJ8Raic6pn95yKgJ665yUDaxilAnANtwaZTofg2Zvt6zl2M+x/L
-LBg3mQsX+N6ijyUk1Qfz87sIlgX4sqZx6MG/P8LeLjoHjN57wx0efwhRvZdR
-/WPjz2Bj26ZFOER20itZC7qv7C0vi4HPu6F7DxgoJUCaxQfU1XnPjByRsJ15
-b3Twh9mtYWvPkWJ3sDf//EsPBalMlgz7cqrR3MvwAu/1Ly6DxgeGO6cjhF60
-cfoxtmvpx9eq5i2tLQqjBTrBRVwUjnnQFL7bxed98mstw5QPLaXwlz4XNx85
-5IeNDGQxApLc5b6R/Y416uWsDh0sP3OhXOeWetYc/8hsNSc2M6Ckq8RKq6G9
-5t+Df0NHdSlZHUVi6eeTPrwNCgmTgcgwptGjTo9iWZ4nzQo8k6bq93yMzLZ/
-xYi57H/8r2PzRb+RHCrHyeTD1S7ssJ666DG/F0vo7UuUxML8TOkmDPXaxjxj
-kH7Gv657+i6LnNDDUgh50qOsxYzvwRW/Fx/Mmbcmb+cr8KDZY0XIxrhTj7x4
-Ypv72SzOD4j/pPKdvYtXS4lKUtTBykYwXQbb9LysYt9HGvYx6YruHZtpYF7U
-4cKVRkdSVu/j687yi8Y6LZxocnKcyq4OSAh5sN6q2V2pT7NJaswbUTn1quPX
-nIzpGbtMaMTfpOzLf8LUJGPsGrNk/5k8fndO8eCBRyp7dVgGWV3TX+wjECej
-Mxdcetcc7w+R948gITScLjCwaxba4K46IRfOQSVFhJNGhxsa7w8mt62IS8un
-bwGO+GYyYm6WV1rRny78evnRTPa86yGi9IebobXDUVVORysz0qpmqMkxvh9n
-R3W+ks9QTaoyf4w+FupwAWKw2h2NF/tDYUcH4WuvOqpWTtx7Waz7Uz6E7aTE
-2Hs/4Fm4/NtHKa730yYdE/hH5F7v6TSHQZdkmPDbJZXWlWseo/eHBvrWHwV7
-Xu8xBh0aJqe2gPQY659jFyLH2lKOjLaWDHpXVd8nnXpxdUWlQxsUm5A1fdS9
-drkRD4/A0heKTaekHV8PDbxsHtgZXNID6v7X8MCbDkkplHoZuHeKuXMZft3k
-BJcyNkBzl2Bou9fDDt6EvOhjqA4p7nI6fcEqJOXHx8i6qwPc81XOhd9+rbq6
-GrqIGTkMyKdfPhuQWvuv06aiDmx0aFVioA9h/0qPxdwC+KJZiRNupn5W3wf9
-plvOnqma+/V3Ohs0U9XVrNuhz+B+/JWue5es7fwOdiLYiDjKXCs4IZ/DQYg7
-G9nM5zUkPrA11zEYp4BCsoj5u3UV5fSjeT4XCb90m+dQdUxBtRitSEdjHpuo
-VstG+gelLoyWinoRFzZ+W7yFfsNkHL4ufCdUfJ+K9M4DqNMUs1bUHhby+JE7
-IhZKCfSBhvBgr9vF6hmuea3A/m9ezlitxTpFqcL1Y18qqj9XJJH61UESZX3G
-ZIDjhlywDgSpTEDBSC9qx/k36a5+1SWeFrSWLUAEebQ85trtUx8nXlz6IXYv
-S+SaIhstBij95dUk38BPb655MB7Uh0Cepv0JnZYOv+MzR8iMBHbIWCc+fv+5
-z9+zou6LuOynAv/h6AgtcJzBCKw99hRD1Bb619/ihnZy1JuAeqhafx0S1qIn
-8hGR6eR8V/x8V89wAIXd4HtdVupMBcPXTypJ0l7yOG/stjumf7ZEGxYVEKIk
-EgX+jjkM1/PL4D2eHr5O5r3DiqsA9MaDsmonSojPYlXd6K+9Y1t9xV998XwY
-lJyC1wppztsZz1R9w1pQkeb3L4CCy3a76xKdmfuh5l9IpaTRH6M6inKHRbSD
-Rj9KPC3Y47iGqEU5i6mHW6dVmyl4KUyhUEmrmEdG2X5+P/y2ADa3a0JBYqrk
-HfHz+puORwaR2GeZ869/f7/rt1h8XmpZgzVZc8zjdXJJxNezeAT1eeRHSzJ0
-wkdn4NHLf+6XinQPVz2+TTiFKYLnST0n6IWhU/zOFWj6zVgFf+UmaeTlJLhX
-F886x5YfJBQPmgTGTVuV2YRcJRnoYmfjm75+eld97vzQUUxPHariOC2sodT/
-UfRZ/8iBZwaafCV2Bt75+6bXkz+nnua1nQ7ipLIH3CYCDlhNeuzzmB2QiEJg
-6613psprV50HH54VtqxE863+LhQctalzvhpMQeOWDx8ue4xznjs4Zgw/OPzD
-Iurhiza+49z9A+mKR6osRwscP0UGPAoN2NPlGeSH/7GGeFzw5ccLFevmQ71O
-18aHkOesgW7fSKG0s35vLpwhHvMbV9moLVu1XfZPLBmV/dhwbhR+4+GvnzTn
-cE5YaeX7QeMAGeOK4hdGe43l0x1/HTsbdvSrl/AyGtK4c7g5l9wZvgVA4aBY
-O3b47j8xd8cXwL6KQbQ/bLx1BXnhU/4m5NMe0ZtKPqJCzKLWIufBt8lHyk3J
-uaQF1wDdOST9ZHKKAXcQFWSTh8uKUd3VCPYBLt2PivWApYc4GR4oMzgUWEjV
-tr+LQsWTV8r4BMuv5AWZ0f5Bndt3LBylRGGlZ8ve+uKae2+2gCQO3vjkKWSj
-79jXUdIBR+ICp74a1DX3dwd9YM9ILb84UZY0Ev7KPX9Z+3nFkmhkFNMPPjg4
-R/Li/TQN3ngwhRj4eLnI5WY9adDFRPJrDOmwrXZeG2fgzeWoT7T1anVfvnT2
-tYx7vO6p8yInIYZvy2quPzl+4RvZytfPHN7RL/7EacWn8Tzj7PIuzywTfelA
-85+eNPfPiVO7yjeQg+OxcrMyuS86yj/6hDfde8VH0oGh7ub8sFnlC/kINIT+
-XP1VmBvG09J3uM+uswMq7oG4pRtbT8WXniPpM3pgQQuXSva/0iXC6K5qwS01
-/lzPFMsNOsWDm75PKGdm0BAZG45/Z07jgJ0Zas/lJfpZGOlBd/jawWEjhSte
-yYGPNECx7+sCL9h9PDV26fQpUvn86xqra1GgXY6bhPfJ1/0aK9/Tn/iqWv30
-La9+8LngSXPPHsM/hVW//K746xX1u7fdul8ve205M8lg12RtGEbcaOBIsO6g
-omyjvbHyz4FSG/lXWX760PP+LoVh8mrsa/llzyE9uUf/nXt3+bg5vlWiR92x
-USJy+4PFby3IBc7NUxeLDWqHqXdemkIt2/9wYQzh9v4v8F7vV86FcXsutjml
-fAwtW5/Ax00vo9/qu5mfqK87lnt0MQ4ozNL6Y1fTWzEyjdwlVWu59sWAOnHe
-TWPSHXtP2W/iRLLKnHkq6nuD2aTfpEuM4R+3zpPvd8tutr8BQJ0n6sPG3XzN
-GTcYTk8Kom78OPlKczpjkzEs096vFhPCOKxI2gKUZw3+u3mzz9QuWKPrrJOy
-aemN/pnrpHGyRUcH7rv+cf4+hmhSoWbh+/LZmst8rYTlALOvjYww8kjHFwu/
-I+zfHcZ+f4kT7v8mwPtwT2K0A4rOST+cMQUm3tHFKzPMHnKtJsQPEyfVxDpI
-Lj9VL/4VuRrVctqsKFj5xTUoXHJ+tBgEekC0Y7x+jpvLAzWi13Q6b7xtKxRP
-j2+PwjRHvyXb/vFLAH9dMDOM/2KKOl36iR4LZbRdNrcWszIvbEl78CAuJfjP
-MNupRTt277L7+7Wp7o/We17ulHNV+S7e1qf10+R7cF3A4v57SvpHYqIZMoTW
-I3hf3+PDc/7nFR1y7ob5UPhy7CNbAMc/R9vdFUdOTTqfzFw6Mm8OKe91EgI/
-iXEdrPNxmHXS1hb69WKmzVypzDoCvPyaa2foXPTU0XPa42sOuL8iVPdYl3Vp
-RIRkQOz9lICsydHvXYvnCm/cerav9g5gr37/vSJ8PrtI9bmLVY2a51DVvcsv
-fzQnS9zIk05xYxxN8C/l2gVMWelGfm5SleoEu4ZkrRTXa1BQic5Tq7Nr+LB9
-D+t+RyS6FyiWBpHysdLnfC0g+ofPIefDxg7wQbMv2bFLTuR3LrLZ90b3yn1Q
-H5Iv+hIjQfG7BH4yOP/1B4mIUz6gERx7Ox7zbqbYZz9DiXB+/0U/3dLSu1BD
-z5WMzyFdWrOjUuwAv/ds0yWzGpTBqMrmZQo7iZJy280h/ZrmB/26tB8zQwiQ
-2ne8mDM7z6U72uX4SoD27lP6cf6FqW7gtoAdswmt2lkZDZ+uR4T/bHA+uW+s
-5vBP4wmobIxBv1f25erNsDSWq1fgQgZLvvJcCbjNQ965KPfimzPz/1qCW/2D
-ePMr8MYA3x7sIocfv+SSoVjG1iod9ZU/mqX6z92pCvPzesirnxUHVMka1Zi+
-NVp7iPy+5XR3id6Cz8/qCV1RhRAriR7Ix+JrStJydQO5znZhLuiOpIvOz/+g
-zbhADikvZ32JbnRVePXQIoLEoqyufdLbcSAUyE0SL4LuPY+ygfArEBxE7/lB
-9Txcf35t5RNOv5XLm37ze/afEj9reeaEzqTqg3+OPlY5kTWs5xNcurz6fahF
-RqvW8M3mn0qsd78zpDr1th9I4lDNIynp0kPxaehcnvLw0NeU71Ul7oXzOWXx
-UYDtnsgKO8O2u8bbhgzz4MgQ9uZ1BQWDPBSnL1byFnWsGuJNEFZivDslNECn
-W9+TC+qUgy2TN7hIlUKAGRSGKj1rX5Ny4uEKFMi17z/551pBRV+sd9Htlaqg
-saGslEmxj36UfSPQVo7qvq6YiRNphB8K1GQ+FItAlxTemFt+ii+9U5MMij9O
-BQ4WkCvk1Cz2r8lKnR35tuENPDz36R40/KM769Ml3Lr8PQrSdOwyY/2JF8bQ
-ul7hvPBicmpWEyVFCo5IeTxmTfKP/ROFuK5pHnUW49w06SaytgWYPBcf+toa
-8sjuy9Wpe9HLKHU3m9yJF/LfI2oTrlYlhfSwku8iVW/e8e7QnFZ7djxKNnj+
-8gTyorVsqx7yUffbY49Utd8xy8wmgxcZwMeOBzUielH1OQPYDANH7SNHMv1E
-Mw+YKX5vKfByzTAcywi0awvuX0sp7b5b9krX4yni6mB1/JJC9Yzfh3GxMuAJ
-pzzv/lihtFY7N5+dZuHPnr2H37jwmemBWDcqSE3BV5PKqctVzyCDw13YwQrK
-CfXkEFZZzkWtS+cONqa8O1iUXTvd5BUXo9g/U0XK+i7deVtW3fP0E1dtiKrS
-1c99MXt8CyM/EEKrtMuPuxPQcQP1DTkHXbIjHsuIZe9lEB4g7GWVnftcZCOT
-ZS9t3DMdRqqavN0sdTFlMcXv/ZGHMU4qDGh2y7pXjwQVfYw/rbQsIhfJ/NTt
-TpjgNb5Ku3FlYCCg8k6VxY2KR1uA02uRzI86nxq7JCXONnmv7cctf7ied+j3
-A//97VW5fqDaHobUD4xP6Opuk5P4uur78sRfq1CQ84a83HLoHu9bHhVKi8/v
-vqNME6stF2KPfVRrXbBd2PnI/mivP2jADpJ+9BTUcPeMem5Xg3ELS56l+dkk
-SNhE0/fEg/PXnhhzBgzKMwOb/kUA93OJoP736tx9Fc13N44reC0Fn0bJm6U8
-zgODo6qNNGgr8qp/7n6ufD0w/8XlSv84wFNlJSUfm/W9Pzr0oZV34TP1cjlj
-YTlVkxRL+NBHVGSwouwNI4PDkdgLuz7GNHDC8GfIzOxc2PjHTxJpZ5xE7tn9
-WY46vCh/JUDoRYen4k6JgcFyVvfFaQPtCL/3D6pqlWPyE4Rg1f24fc/twhcX
-Dz1e7NG2ZmcWtE5ER1pgNo0VJLKDpIfLRHQoWLDIXbWJusnmJe1kSwr+R6X9
-T1vG/qq8qtVIk5k/9bkPp/z2/iOe4DC1/sQYLE8PPOFe9Ft6evTCL1JXxVSJ
-DgXCcTJV+vf9UZ9mnZvFw5gBL/f6CC48ZEPgFpMuCHT7a6QaqjSydPaBolhw
-1Nr2a4pRGGE/WAlqIEXB9UTio2MO8yMX3IMmYYnVHGIbBNp2frj5pYtUV3JC
-7cPyALrbDXixxQhTI92lfNh15Lms9GLhdfXvj38odwHE/nRHOk0eeUGRff7c
-xeSV7nvpPedlC+Ur+y125w1/p5xuBY6hTSL7y5ejHb/03+0zOBt7dvfGQ43D
-qvSHer+NHbJ8bH4FzzT87o25SQ59ayARHaTX7H8M0KKgcOGi2Q8I4jrwO6p6
-rkm80nfPvgqdyHwnsPKwLoGS9alpj8FN/NWUSbmI0FsPJWtfUppchdwr89nh
-5FbOFb17rySrn946GHzzaxfUeTbX2wErAx/B1Sh3VU1FElv2m5zRWoCZ1hzX
-xbrm+2Mzi0u3AGhEvQQbMWR9Uygv6rIk8fQuZwbm+80wuXssjPiorCpV/+2F
-ayHofLSxVmZhjGxfWaU5nmtRwvvouaO8zCVS7hlkF5xoQhyqXjmYjPnmTNbc
-l7Cs8+9NyJnX+AunovS/jPPff+Tu7zvjZFL/+cKJiLzYlT0t95q3AMLu317b
-YYsfvX+6tjCoJ5R8K9oplY7ZtTjZN7gFaHXO/Hfy/hnFYFNigRhK9Pr50r19
-03vq3IZxR7KCNBs1546cZ2t9uvsKWmkz6/k0J0e4S3LsiXYq23fiy5hPWdXa
-dOFbbXk3pGF9oKqqFfts8ZiHWfSkn1tZ0stLqhqLa2d8KxiouLS2WKlEk6rM
-+aChbxWRro8BEkkf0t51Fo/Sa5R/Xl83qHNhnPrIcHJyU7V28C1si/hq9RdR
-zr/UkPLdHUyOUcOa4QY3Ym51tiXXeS7JrHTyd819PnIj7LeUosExac54H33Z
-ye3CE8NTIUP6LhDU6IeP80qHd/d0Re09nzXbuEqq96VIGUhjjYut4Gd/BVsq
-buyWMzbgOwoEfzWM8eRJ1ovylWcn7z57elZCvrFvE793aC7vSIpJ32rgkcMv
-cr8t7nvROlpf27iXjrg3lCvedlbUmhw+pcPUh2m90OlNl0n7KleU9zgAnUor
-MczWqn3qcf7WpIG/aocUX/eDoQHGLnsC9Vg+6FSH0ck7sRtDK9TlMtwltvIh
-Wxceys6Xen1kuizWc+BVlBZNrzrxQViuvNuFmVGNfad6ayZ0FA4ztX6zPthO
-o2lhB4tGhuY8YwxlHPlin/3O5z/2FGqWOs3e+LqUtUpEr8A7kGcV9obtGnn1
-6Mi/Dg0286PKcmYb58y8gf6k0pORnkvlp1GgIHb/6/jlwNYP7R8iE+yRphOy
-QZdfYRu6plbtpO2w2g5ZvPiSnxZyW4AE7haAfSUUU6lRsQW4nxKt7Toe6Bt6
-V5xGs35xUUH4s+SimEgk/kJwI/ap7vZtgD/X/zunVCiBsWGyaBbcy3dCdXgq
-23f/6IAtxXHUSwdqxlE2ffVeKT9ehoItDRuUYcYAKlYZhIJZGmcJgbyWC/kH
-7uQhtwClcvokry0APskZaaSOWS7khvC8OymkZCpnErsolILCV56DlFzQvpPO
-6L4B9Lm9vRuAz2xN46k8eJIolqC4zMqP1WEVVJ7V/nIAhcFKUQY4vwdTVrz9
-3JsV5NnruPNrXJUChbVu4AxIXiVM7L3YGLE/M2V1MA3IFUiOkIGV7e0BLuXo
-wkVl4rSV1fxTGJljZ0yzIOhw4e/QBZU7ZTTaDZ9eCvvvCsSwQhY0V/kd7SzA
-ZJOgeVGdsAUoS0Vs2g4n0EdfgW3loETJepL4N3Va+znUaXgdoMLea7WAjK9U
-+pwYzndnBqGZuU25KjQz2wPBiFj59Mb0P0SboL/krwRINNnl86GBUiWEvYpG
-Cnaf3UN+6Jz3ko1cCfOQGDPdc6WgQekLoIBVQEpZgbOEgIhAmrUuUQ5uCpR8
-Pd5OQcNlMqE8xKU9RRU1x8ws4bgdO8jieKpdxI/4fT0qqL02QQT3vgIM1mFY
-mJRsNxoH1y7eLZiBZCHDIoGvWdGfLJwF7cyPTUelXbmevGthNLsDySDlDizT
-rKkGodg122NmxhZ5qNxzKupbgP53izvWuxW4CNJL9dEUqjXXSPLOy6D4oUp9
-uoV/89Up+YqIAsxyPpMK8TaSlNfVRKWZbUg2qxTlog0reqj9mCuayksDXI49
-x5NVKKXgVW3pmuThvUuncG3JVC+PKXMAIEXQLaiU5s4SG3bvhMD1UaehGaD/
-NpFILfZFFFQCPLFH+oxptCxo7lkpyoZ9dFzubMGG/e++XWuFYP4H4yG08qw4
-2ANx5NeltG6FjiUEBOLN1SkI3bGWb4ukiSAN8/rinDVYhT/Gp2LTI2gchzlA
-NId0a40L5TA9cWAbPXvMVRRr1qX8GVqftL6ez5KveDN7PjY9VCgaAN0rCH4Z
-/eh1AsImWHd7W04vMMRcHMIws1FvF2QRvvQi85K4eyMzbKFbYWoqBVepTOdH
-Ff2ZUv+Y7JkVEqrZa3hHMFi5QCzSHRNtpZs5QUbcIM7vZHROxHrhLHITbOl7
-Sy7BaFaPSel/mfcG5EWKJ0Cn+poe797dE6zHwu5IILA59sJE2PeSRfXS5HW6
-K7T9zVRa89HbB8pXFX98oCoG0tx6xrINkHBpY6nTe9d2hpYGsq6d/oB8fPLX
-pyjgEy406GOMVA3Z/pTLW4OOZzckXomZhjA/wXZHDrNVTWt/h1lfWFqQ6OyW
-eoHAXF7IWr/32Fbug0iUgljR27MvPhFn6tUNGrS/JFNIDXujkvztSmSLFq+W
-fJwlHmHbTYxYWvsvtVUHVqh3olM/quxaB7063fS9wdC7PuqD5mcr+cPN5wrF
-G0Ybhn68kLjmuEvqezwp63PHu6SOd9lLBwSM6XAhOJnsMqu1s9SzpVEBvtrF
-uNNNeeJl+urgTceX5019YZTcHLJJ4ZdL882NliWngeDSaA0X0zb1a+f01IUV
-B5/5vc/Y8UVE+H1qTjSZT4K3rHBPt23q/F1pAjt3ju0uVbwxdSfV+HEL0Xj9
-sRct6+Qidvn8v3bZZ2t1jwKDjYIjuar/Tjx223tBxN7wAbrijGX5wl6AHAAc
-/u7+hWR7K6/gXK11jD7boX11tlHi2zLTGfKnI3/GGqMyKCy0nlg8U2l4YNDV
-BMd+durh3TsJQunowDGK+8iaPrK9TWJRSWlaWmlA67SL6dvBD9inXbYivj5v
-c+4WFuwfvLt5ojKgcznlUb+2nY8e95XRbNEY+AL4zRTzwxZgr+bHZ5Wld4BP
-zLk/TY16cICpQN8x0qDm1dOnOQBA+z7fg8KPbGGuQt2HumWp6xE8kRITl86N
-BMuvZAPtD+6D7K+m37J9JQ6dTu3UYU05BS0PDp69fK2h6evyfPjF31d+So5d
-vCGfkIeTz5gPhq8N7NTsNVEUS+4Ug5T8dvlkckTnYUdTmKOn5NxMPXOkoClb
-En4WtpetDTeIvdgUpZBxdH5e6J4CcqK/YSgAiNYnF1SjL96/0Xeo5TRgxNIx
-jeBOkFN9Lv0sbC6kwPzcNc92vq6LFaQ/ZfryiTerQqcL48msUuiztRDtVivH
-JN0TQ2fuFtu7vKNvDJRY+4F+36ZcpypI5ESTeLnOwrIfvqT2mIY4E+Qp80y2
-eSjlB/ffFAeZ07VsGLnz4B7rgiPXHV5PMQ+nLA8ZfeuLAU7uEz9lPl2768C3
-1LRqRXxDdFLzc5miljgdqXF7sx0Kxzz37ukBCCv1l94/q2I6VPd6MvvBRqIx
-v+33wTlC26h8TRZLKj1QSv4vMC/HqZB7uvzQkI9MXG8BObXZ/K//r+ddOsQJ
-9wKtx/XkqJSAQ13JUY+NdZglR05cuXZl79H38S8qw1ahcKAUIVjRWpEK3Tf3
-la1KcH4+Al+3l9536Z0T8PXO+41PXlRfAYkAVtEbmqtw4Vzizge8LrvXWioO
-NeDOLYDldPuk51Mf12+ZUsUf5fczLCFGMVZk/1K/E28n0Rdtk8KrQONe/SVs
-avsqm9RBuPKZVPbKe9p+Iv2VrFQLtxspdPaL/sd0e8epu6JJPn9d9oj+3HnH
-FKzxWDqg49vEW1P1FxOfEMPEv2UceWkKStxtdgsgGmqt+/5+lm5LhuMRXV1I
-YwVR9p8PfpnemueoAflm9D4sWd7QLjmlp2E0Oizm3uGnoIMaSYHVsDNm0wng
-dXN++mu4l5yaIElOkFcNXfvlOzZbjxyg6YkyLAJSKkaios78Zcl9dSurfj86
-h9pVker3YHFt/sQrA7m2YJ3DC0F/Xd5/eXrnGsTILmEhCTHUUWNi+1QEIPz4
-cHC3Q7ozumfSseCDYTRKeniUqxcgdiol1N9e4pBlcfiuncFIdlndOCvBYpxO
-j665qZh13e3TboNk8PcGizN+tjU3FN2oM0JGI/bPQy+vABrHPQ3/5D74fhDX
-tdvFJb2kcAgJyyhjut356fBt+buJSpJV5ZSKAiUuhPyurHUy/FnYO/dZ56Jc
-CUPrmsRQbxtSvifUNWsd9eUS6Zmo1cvze+xSr1QxzLE3D5O/fQaGwXllw+8X
-3o/9Srkn7+7Q1Xg08v6V5bJ3YRGHPn37kHHioZRYYGzOAIY2GJs7UXp98Wd7
-lsFKKr/MBAhChDxUpbXZJvi8LwbtUI+3hd32DTbLFr1qZtS553CuQXeJVZ4e
-NNUeJ58lf3n5xw/ZpgOwYpfIqAelBcMKOa9HiGXIj4JSfdOkcLn22F3T64Sa
-BYf2AJCiz+nHW4C7Qt8K96U2C5PRGV3P2vUqMy7Np0fB8kL3LMUeZX+b97nu
-YOE/6xTj2wL+bvwR4dewBUgxPDnkG/gXJpYbcLz67em8551cjtO3n/d2NR/3
-Pmic8/gekIF98ufYLk8TE+IxU6Gyrhm7iFeJ9cwHjy3gEeUT7lpfagKer507
-Ox3Jpcd8KWn1lFMd2QFK9lR8h3sjkVT+wkr8m2VyqcE5oCKa0l8bJIUPkCxd
-/nh4d7GSJ8FQw1fmCw9j8iUpoPynxCsHmVc3Fse9SF/q90zm6rceCXJuzx9t
-GGk9PWzj8NCCIv9nMfgS+t/d6xDtA3oI+5OfAMLTCoovL4q/rkYb5gTy25sz
-LFRChldgyd/O4MUw+JsdM967L1daKHidhvX2w+Lr1cM+RXq1ZUZ8/pzH1Ax6
-Yi9Vte9u7KmGvy2y78TepbN2eoVd1A81FTISLhfGar39oVlgcdbJds22ztBz
-uedFiS+C/7YQJvrcF66hccQe4PZPkcnz/cz+6VkSxYl5LvmF9kz+YvEJEap+
-09618Ipn966b/0EGipgJCFExc2/nJ3F3HZ/qrNFvJT/fX147H2RneJshGT6Y
-W5kwmyXXXi+x/ys0PTacQvpGfFaV9nMCv28jsHP+82rlHoCfe+OThrabbZ/i
-PY0SPtvF27waVLoronVXzjH+mkH/yvPpwUnHOxn42ufYIQz7yvjzHy+1/wVK
-Jl8MX8cfXpavDptQO+D+b4SWeaFy+OEFid33FFIxOC2m2et8r+172RLnz2u+
-91AxaPm9lpw0XZCcrKjzA3oEq2NSh4FEpplbixMGnL6VvT3Z8zbkWCpAWkoH
-Gl8KEzcr8pVXr3YDt+6AGGqPemXGOsa30NGVizA/0fHC/h8UaJsQsUnzsp9c
-HfjcSY8wwPXVbsn8TLUG/6kPcHXsPiH03y4Wx+nJGHzdjHKn86XFdHb6sX82
-6hVhWkv6ZjhIQ8n7w54171+ZuYpWNwRNBNk8T0Pa2ado1aeI/pk/ByMonzyy
-KrVe4H9NZ7NAyfBtSaz6P1cYHq4GOvgr5r2GzCtDVrTn0LvACafI2SkBuxH9
-DlFCfdqCL1wwCT3Tfvpl5rkfAqUwSHgWc+NzXabV8hxh32dH3b2PvgQWZBH6
-Q60EFXXkK8J10sL0+R8fwhWUcmK+Nz7a1Du/0ScxnJrz+2TF3ZT0g3oHNaoq
-cFnBhFSCdcMVmtlMlFPbLHaAC4QXDxorfvickS6cvjNC/k/AhNdT/gj28vuG
-ZIZWukJUsqF9iHt6FW264p5Ia4urqCPcF2R/SOa0V8k14bDgn0eBiWvn9MNO
-a5IyFh36XlZlIAq9Qs++1GcM1gdMZGT8Qqg9Wx/6kbx8W/olupuvtfijLpJA
-Hiwwf3Xq2HHbPVMAkTllT0iGoZW/rrF2SHuj6A1Xl9G5Ge8TyQ+uBtjrVzot
-d2BCtgD70HMWt16e2kDzClUo/Q0/dOzuejleU2LH0RfMFYyCFW2RRtKHP33V
-7wmubvt00ho+JcgbntiqFQNSVo67NGUNNnSm+oqJBc2pYtnWE7VnNHVZ+968
-vd+oMBG/U5nmnn/LbKeeCLAcsIiVAATF5YuNACHKJW8tQ6+dqNq1s3AqZlN7
-KEacoUe1r/362vvm3ycvLETxS3Rbt+5iXw8JZrddxdDzyLzI5DtXDJRvd+Hf
-nah44rnZaRenu7cZFN3rl56T7kBr3vjosWBOP2ft5zuMuYNxaDVA3g5Taos+
-mjTqZX+ny/FEYNRMNkMWVpc9eTj76d1UyyvvUvcIzxgccp/3oygF2aUOx6+Q
-5Qcv3rIURreJsugOoC4Ts5F/N7CmSs9izJe5y5Hon9cv2rverPA5aSI9heAf
-zp6BO2NZGVUJE+qK1T81ruLkvnmSRxvjI+2vnJ6ThgEV9Us+/2sVMyhOVSfv
-FRkM+rWwL3iu4mi52ROuPfkcLOnMkX0Rd11Cbe327Hti4GTG8CHB63Vxn2z1
-H2WeKd6jS3BX7ev+pnHvpTrx0q5j8S4n427PmdEceIV9JXUxCiVmjiGxu+In
-l++/ftVh1/7tiageww16NZq5NvlS2fawEyAUPIxLJShC++vnMnRnppyvXwbQ
-CdJTEgOjuTnaHoT+zDHoZdqCuRHIr+d8OCe63/d2MgEkKkROqbOzyJEH6nby
-10lFHaYwQZ1D+KC7m4pDZW/Whxa9OWyIumxi1QhbBG/O2jkFXpzefPKOmpLP
-cSQlvysGCB24RRGW/1OKeix9JbBlRwInglU4noAhjD6MXv/k3g6M/VcI4vCs
-pZR0gdKU/sycLYBe3lNhAyZtYPuOyJ5o+1tP6Mw1DmnqABKiUldyXroZ5IWn
-WI1tbL9uCOqJXtdExOb1mYwAEqqg4vwGIIgTWyG2QQSXqmwgL0STABBdA7Ln
-Am1ojG5pauupw1y6xBjAh9AtR2dDJdeJGxx7sYZdO7l/l5ITaBZs+YbTWX27
-CIpp6L6LRnwUz+eSzQQnryOXH5v+elwTOb++YONvcpxH4Wz2/uMi4awaDlpO
-pYbGiebBfxjatUvRMVsANzn5h4ek5Udo6sQH60xsy4LFEE6aZjIIgMSBz+n1
-Jgiqwu2rbXtQROdDybHp+onG+syZx+MR9LFSFZC8TjcgJI9fUfpBKjvqVJYD
-1DVoCzCAE0oj2oz2LZ6PxeReJ92O3i81NHZYOgXywR/GLNQhKC6/i9g5f+WY
-6zkhKZrZa3UyegvA88l8ZYoCI67mjcUz31X1fzqn/ZMr0JHez8yM42FdELMJ
-q4QBVuHS3detdcfVH+5WVGCV7NhfQK5U3n6hMrEeRePSqpZCT3U+snpltAST
-SOlAR4BiQ6chOpxo+zr/hYQHz7vcd4Mv8zVf7FZM5SM/uOZQuFmX8yDRDtYP
-H3inFCEoywU/pKVpNi3CL4OMuviNzILK7/MpP6QNwugw4QFpnBDh3cKCqR6D
-tf7Br+GGdlCpFKHyuKmQjjBk7pKs5J9OKpNZOPSlTy3fM3Vhu1m+VXKZbkHT
-6jq2IyjFpgLTdkwMBbJVCc9BWaoPQFMaDONO6VAZ+VTDLQAWFMSJtg2iEbAn
-AFBLG2rKf51lUGkWfaGcIFL2X090JMF9jIfw0wFvAZxKj3FW6ZdnTwhDX0hR
-NgSVPkE4edOOztkkhQP4brOcXiHixmRK63LRjpS6jiDr29v+EB/of7kFwPik
-V+w8JS4/otL0I0/E+tjOYJRewF1NBYHpWoJS/NPjAqGWgTR+FE5p+OrlMVL6
-zMuXYvqc3wP57weT9UVBtrG0yXg+craFsLL2Xr9ciL5kkQcEStbQCRNGO5FI
-pLfH7j1oMZTMdj+zIJ6ywnbAAzA/choslqw9YhsrGHxTlZ/5b37dbsqQogym
-J9RxV82NCUBGwYKoTQhxuxenmEqwmT9EWYnLIf0VWQAJfFBDxWtOz0F7lD3R
-Y48vbj5us2MRsOeiDJDIWaIuNFc4R2gD4cis2W2qF1Y4qAuikNLR9QKTUHXA
-uZBzR3e5I2k3jWwBHNsG8+NPpm2iWOvYPjfTBSmqUn+yxFiWEBPCoWClZcs5
-DnO2nvlTSdY4Lpyty2+sSOBu2s8e07uTBhAN6c8lbCxZAwV2tJ5/IotMbGoQ
-CkKjOH2149v3veeHtFA5vb37T+9ucUXzK+ZDlowpNfJMIQLsO8ZWNpnFhZio
-NAMVFRvUUKvdagGr7fvChY2oOtRyZoEwOcESWD1hxeLOyawbebvXLvVnDq2s
-FRhEgEnJLMoyq2gNoJgcYgnUXbIYRukBOmkpAZZgI/GAH8mBcGRTV76YSuUS
-AKV3FcUqiQ4t5KI4zAqhoAXWekFTk4+uIlpnaTANyG46fe7TsaCXIjr5sQ08
-5a4tAL0XCl7GrhkpL5hICXz0+4+orS4RAQTsNSZzGVaE7WZh8fvB0VlOJ0IL
-QRdhW4APGbWCSh5bw3mqt9cdRRh9KYYh9qesMksa45SlhCXF3xUSprmzoFUO
-eVMZuCPIRA5KtLRp2G749+iYopw4pO43kWLVt90EjzJAu8x+omAgvprkUVzI
-5MdWHESErjPf+TfbR/ErhPP6cjmxkl559RxS07cd1bDWLBN6kkMOKk8FQGAj
-/gCNvSXBK97CcjVM5jsmYPtoGNAmHYUpBWey7dbiTDbH+jMS5aCcPuUW6sq7
-WvlaHrw0oTgBq9/EKhROWW0H0tj2AUaSe/VQHgjlzu3re0MPSIw17AwyRUJ5
-oZ5KpUo1+22Do6hNDfqfF3gqH87DVpg48dUlx2oEIP2uMM+7hYvK2BntNZgl
-lQTFWKICSjXFUR2Z1ThmYdWhvcrtUlQOKVpB1M4cRaxU2+CQA0YBzR3qbDuz
-JrqJgmioFBFXKdfgTbQR+MkrKegPICjvH6sIlYNw2O6P9hjmMdCPs7F7N1JM
-HeIqz0KJkkJ8pE+2E0AuMcDyKBqnNNCfHsavQGGwpyoPSPCRKucFK21gpPAb
-wJa+gWKCH40F83w8vm8nOuL68A40n1/hiW7i+ahvAeZwvTviO1n8ijtx58+L
-QLGnhJLF6WYTxmD+B2gPnLVtSmexIILH9PYZN6IBEjI717x9Ksy7gDuZ7ndL
-NIhbDDHb6BZm8kPBK8jTDQANAqtIvomEudpsgM6rwH/uvbsFyGMe4iOVt72i
-j8qDNz31TNyQbIDXyje90Jem2T86T1nhKeenxAjiQHxDs7dZYvt0HZenzIXu
-1bNbM4oIWO0Gp1AshrgMS0PMY7krahvtwjhXalOptGRQsl3fJXlBVEH3qvOR
-3lzvOXWkGFyHUAS1tBtKgrWhXuy7r8BVEaICV7FQ6mB8MgXEsZ9V/+9T31WB
-OZw9OtLAVFL8fghilW4jp+cQaNED3Ru4U6wi7PId+aaB/sz8eXWOrUhs04+H
-uwXBCPv+UGNMnl9xVzQYjtp79PuOkDwI9LRH6zKrgMaOJoWwI9YKjPeas7je
-8m+4yoRiyRBMgLN8507iBqvAIEyQYfYsMDXpavgW4BRmUAqT6N5Xj2Dx4JKi
-YVCH/nTqdogCQtDiAktkIZhclVYlzM/RN6bROYgkC/0d8uIAKgNLBaE4JQAu
-T8XMmEuDPhJmEQOcbXKoDCZWUQ7hYGrBz3hwaZ2fl36IsDGDxlhqDOCbKi0/
-ty3C6DSrOERKK+f3GJ48mqYQoUP06MgaFlYEgajJv7lNTBkoZqUAiI7dvrNG
-7/xR2hircDYKuqxGM95sYCwYKYXrc8KxZ1/uSyXHISHKchBU6TECkMUqeKjD
-RZY0NN+eYm0B4sX+KAiDSW8T6uR4KrxilxfPclCYBmODQKN1ZsFOgViSa0yP
-OwCg05ZMcv8mYGCtA6OZSmgU2FkEGJLM0gzBII40S3dEAaLD8+WBTXTTIMI0
-0Vm8SYA0iTVC1EaIgBLVbIDTNFPxalIaSMwGgoT/zBea1RdM2bjTgG+YXgvO
-9PARsMLm1V0cIWaRJ76JbhkYSZWv6JeDUReYhfjb74yJ0luAefhfKg6SyCqU
-psjnhAzQjeW5iHWc1+29AlTD92cvDJE3KyhEOVpB8XY3yHe4W5LJYiLIBm8w
-pomZnyeuJEcMMo0ChSyQcl/d0uQ3Ykbygxub+tMpyxAIv0JegzY2RLOIueoJ
-HOUiOI4vmgHi37PqtQewqgdi8ypCZYevjiM2Ob87xBUFAmekIIcPSoFhhXUo
-y/JNzm6APbQOGI5VgNflIpElkXPWICp5MO0fIPEhAMx7Iczd7D0vUAW/e+Vh
-TdWkUq4RSMyC690yBz0t0NUIfTELyTjgLxFZaH+mYaI8P703WI8yMESz6jHD
-Y/eF7wAt0tgoZ2OCB7E/XZRJo1s83MMzwyotJ0fY6ns2YYVpbATJK3+NIljF
-B4iYKUwz++9li86eoCWzGE8wKT0BIxApY9tflshfa9qZIB4ELjS1GcFPzw/q
-owimk46Itj+QwyD0IeyGuKuWeuI2bb8TiGRMANbwoeimwD+oo1fBiwJvuR40
-BsctGC10EUpVvR+ditoCGPQWoN9sAf55L3FpTospOOkl1gfZA3lBaKQyQbeL
-02s2IN9AC7QQ8DQgXIpQjQXSunjeckCaMQiUZRV+bA+dRbdgB+sjHMpzyBbC
-+AmrSLf0nV54w9GKt3SaIPYFhCugZk/5tws060UFgnE8BmYJ9Ocn9qcpKupi
-hQfwqACs/GUxm6jtDovI8xo006gWQnVTf3IYU8AWzSZLeaaRmi+SV4fw1aRc
-oo2GNX9RnAztf9wH4EE5zA6CK19zTbpTd7v5soMLvhG6V8L86q3wbl2NighI
-A78icadYvUMaa7ub1/v+64f+mhIhRkQPmI9daouwIaY/49vmGrOQMibN8yZN
-HgJthhs2OV8HgXLE2AsWOVMRSzS2LULUawja//rXLgIEKu4MV5SzgaCwav4W
-HSgQKeafoiIUKwe46qkr8Dbe8kUHzKa2eT62YgswAcQ8ILvFEddRzweWiyp3
-qCkjtKdNtKP4m3awDKFqpWHIB6Hc52l5QMNKTUxgn1yiXKJ8BtllwtROMlTg
-FftgGKy1P2GoMRrRq04fS6Pd0Op9ZzbAwNLQo6Ppw9xRHgGrCbpFVaxuuDwr
-XL3j71Q0eBLbOY8CWzI8noMltJrE2K/koObfbhQcAL6UFI04GEnFAa4RH0MP
-Bmht/sxVdcmVmQf0b7jV1W58XdQpq719unjT/UkM5y+rhSgH/YftUCcOjNZf
-njzapnZgNhaaaE32/3NW+o6+8/mIu+NTWQV4OvTwWRk+LyXtnr/z1Q7F7zhX
-NO90QXzxfFklULt3vXl8eTd9CxBDUv+5QOAKD4w2wnsNvBhKbdUalwvHpKeM
-a1vM+8RjTRBXDNX6Y46NX0ZN9hKL3w7q9B0e3mgRRv8lTl/5rHV8IXRol2EV
-RAfEqAPxljx8jJrVAcwF3uDGKMGVnUHBvV6yrrm49pQqtPsFMEa4r08voM3j
-KBvWts8Lb5B5oDD+noVTMWt/H/n1jvfPp+GVvZIYz1lqZ2fHojh4FCstpru0
-3gD5sLvI5elrb2InvUY7KHUQC1QqgjSVBmsuwm9PcZs9l5nr+a90tnsPXH7Y
-zG/oFou1jwLDJgpf5+vq6PKQyi/VQbEe/VlvO5tbmCxck3BTP/pd3wGKoLzT
-yKsP2jYB3iaHYy9/HqqGKtVkPjCCyWks0I10l8aWUJbGY3kQJKTk3xqVlGn8
-1BQqNppukvf/4+nd45l+3z/wSbUOooNyCFMUEhJlDjPyzjEWKuVcKqecz2NG
-QmnMMSU2mhkVUoQcRg7raGyycmZqZk5jc5iZ33y+v9/vHw9/7PV63fd1Xfd1
-PZ/3fd3XFctep8iNe0E9nA+Oh4aQAvt/h0vF7/1Kp1EHE6zkeRxOMeg5V+Fh
-lkFhjtB7v+wX1VeOJ47iA4HFJA9rExEvfotxbmVvWE4GsNL47S6uwL32xbj8
-MI9HYfw1xgj/DyET8Ps9j2BK6UOUzMN/QFOUjKRCnjdxINMLWF9dp5l0FLHd
-6+v3znC+WvG4kPRFRvcgZUEmsuckhD58sqL9PQSKPxehnAHNA4dPhTFZ17Ue
-XwGsPxYlwljWheyF/tWy8q9GmBa//3heg3hFLwtxi/rNZbOQIaFXKOX/IQfq
-syx/K0Egm6pWNSf2ktnxUEry+k2klrU9MwOhBtypMIKuBPOVptUUsUEMSwlj
-HI2SiUEA4+EINcQ54SIMANDJ0nxo5YXoBSzS2ZXD4pZKq6yjrW337h/jsy8V
-YrDJ0gxhtM0MwcAGsn+lZ4T0ID71wtY5pRo51MJwvFCX6cYPLwmBKpBfYCBK
-pg2iGUwrnxSAF18V5CFokRPZ9BUhc1d4V1dERojVeJX1LiCLs1raZtTXf3Ac
-uRlfG8kR5CYJGZB86jp/WsRKsVCiYwBth5Q1HcuxsQIQUyeshFy5SKascXAv
-gwCe45SovwE0tqtAN/38w9r4bwoWV1FSrgN1kDM2jgERnhuRHxhw3hZAqyfH
-jZ3mazCXkR7kF1gV2KhofFHLSJBSz2uxWeI6Z5fVG4QUigvDtkOkED2HKiiz
-8aMv33bgfJ0dPTy+Kyztn/0P5Jxqyu76RXssnvSWOXanVa31rFXjXemfPosR
-MTFdcxfqMqiKDCUV6kBRswjmD8sV+rj1RFnS5PW+lJcXvuu6tD9pve/VK3Ld
-a+1prHel8x9/3nEm2+3iYQ+dYJCzccmtqrvJc0fJl4AQIq+fyGDZ3nDdQThj
-ARzIj3L+m/ZruFcIXkOo6M8JsXdyFBNCfaZPxCIxPvTqdcnUViTI73/NFwAJ
-nlPx1ybaBLV9hRuO+WPVBD+HaTEJj+UukKkwCsrtBhFaZCbRtTu8lKoVah8h
-wJtqf6DpSuFlmb2PkeTKsy+Enp7neI0nABMMI0lCO5zRDDWIl+wN7uhf5eKV
-PeHX7DrVPcMyEBWqI8ryuy/i7h3Jy5455RkcBd55rXPuTmcCDgNjeZxg1YzM
-GJ8ZKAD6ijl812a8TmHxaB+iXbpg1fzT/UV/Wqne/spX/qy/r2jn+38q29t1
-mdCYe58LUfXjBXZnBY1rVwCIz7WxZvb1j2sRlU2OtdJfoa0e+ejKuLnFsc8s
-+nEN58+xjSV72Fa5QaupyMq7fNPFtGhD54ffjjeqWN1ZFoUCG7p85STlLcQD
-rhbi/bFXh1gG936M2tZxa99rr18/5eCyVKEZFPDgIDkmTFKtMCjrIYoX5u4y
-gUyGR2ZFeFWlX2JiAB+y2mSGsg2cJCpG/LBHBIpfCZdDHT7L3DyZs1TqF+wi
-WmEUH5F77l1OAGzkcv0Fwo3Yb9FDHaFfTrr5tbUGO5Hdoc5/DiunVUom/kr9
-Zrrxiz5Y3W57lnm4Kl+ZBZdahSlNHZk2B1dWJw9Cn8RB70Xdq0QP73bcfW/Y
-MamodUTdILfCXK43c7IMfx9uFy2XuKkGj+BXpFnZJ+YMFrVLf+2G/2t0/1JD
-kv6yXcVfFZhD4hSzh1hzlpj/VbjOKOkN4XkPJsSscEuNksiTasgzQcFHCjeE
-VrJ3C2BcGyVcc7xeS9LJ5DeeophUdjGWTKVkIHb7dCNCLExEqYt8phQfa+1w
-7jxy08P6Mos8YWkgDkql8vpI1XSW6XgUr1cczi2ZzUyioqvrpOkgQqW8QRjT
-wr7Hd+iquIUM3xdKpuQXUrwJHn5577p6LGiEFlEat1gOzbAaG03PTGbIawvf
-KFxv7ntWcJKIrNT+7S0UZI+qZLj89MwjFVNzsNAP1Ipjv2UU6yngtveYCiQ8
-AjmggfTnnbs+kIFUysMwVMTcgs1oJvd/RYDx3p5SYNBArjd1sXTOPL6hbOWS
-VD33/6qqGNfCI1bKVgHy8HjJShKyO1OhudChbq+fvHkSCZqP14SSKxWntdcc
-MII89chzXAYb1yLP1CmEO3z4+z++CEH2qPUX+VXtoJ9MRFe3SDMt6lT+l8IE
-BDMt1iWvI4qP8P/lZG0iKkaYhg4w09R1BU5UcbggvPlfRoJk0RYgv0XjtM6m
-n3ubfAWnzyYTCPe/cfqcQjSTxbIrBUVT6Fk8xw9NIsh9VxhMlsW6btTkI5Gf
-cgX2VgJb4wRg4lddMZ59j4/CiBokExhPhMFVF/jTU+i/sDlAFH7OqttwMs1E
-N0IQ318r5um1iNfNjvISoQi5MW+zIhgpq7OdBzSryJCLl4zXTc1C9+QD2a/9
-PcXDTEiS4V2SBYAeZOXOyQzk5yTe1VZFcaK1KgOiCqlZs+/dJUNawpdOqy6Y
-rV1NalHEsyyhIPgDT4tGXLavrw4Wr1kM4Nlj9Pk+X7cAsu79OavPgbRK0LeM
-3ELuZPK7/ZYwRdDnxN47KC9e747lNYfDOhmcWfYV5TtvXu3UXd5UxQtafObM
-1tKOFFL7p/Z5LxEycrOnT+tiiJUqyiEoSoF/+FTIaOLT3qhihwxfNWIyYH74
-qj5+zgL+rO7SPruE+Bc4yevnxP49y0zKItnlIi5rvpK0R3lz8UKVKw0+4niq
-6AuuPWcMFqVd8RRSk5WrXSRJIfLWLSKv/zyg/nhvmxEyXTOMkoPuzlcUB5fw
-TfYPpO5EHeF2Kcox0Ej4DUWOrsbvCFmh9itCEq3GeoWvMNeiWyUJJL0IzDlz
-KI8+kOMMaAHWqaq06lj1sgdQYiJDlJQTEG0bKwFM3tdifaUkzuxQ/Er0T/VD
-GWqvRej1eHAievmnrrz5ksmmELo3r3QjrQHjXosrxZvnIWoA4jc0YzSRK5m0
-UxxMkgvH9+7SJy2V2knIq1mtwySfdoQ59buJfGhCRfzL1AJ91w12kaZTcjmM
-LD5TTPshPGs0Q8ARh8cr9B/JwC2WBAIMYh0O5fC3qx838GHVldLbtXM+AWL3
-aa/bZ1ErT49LECv1/BWPpsq3MCto6w41KoSJOcvm0BiyB1wuAmQaDBVbZlmH
-Yf6UjuQkxHCLxyPkeXcyXknJSVDQ5DFJcSTZ+X/Fdl7b3BD5ykJRDodCoHmK
-pCuecC8unq6/MMzrdxkBsNr5PvM6tBqcEn+lOIqOhjlX/t7PrzAsFK6j0/Mw
-L9ammin5AVzCWjYgoef5NvFoeIBJhrpSEmBl0CLN4GDLLcA+qc6LJ1SMBS0V
-QNhfG5TCcwXsQILOmNApWF24LyX+h8/eVGW06vAc1A5Q65lmITTCqm+NuKJA
-MnJGZzQf04zwLc5I2gL8sjA5OMUxWimx+LvpYySmgGjxRQihp3FvJ4+7MO0j
-DwAly3nGY/ofxd6NkmbZXojU1icvE1Ab95/rB/7hkqyRpl/oVAqhWFuHDEqJ
-vRqP9RDUqQptJYxlGT2FJtRLajwS5c5Z7ra4BCQ6e3QsFrO/QtOP3TABVVe3
-iCp6L+EyJAJxg5kBSmVhPGosSieLihLo4iBfVFoUlYy3AKM4CJj+jlPi/w7o
-QQgStEjz6MTK0+bGxEoZYAlDHqGmKN+DELoYMPiL8Wj/DkCb9IquKIY+zOul
-Nb3bi2nkB6vRwdIsFvMKZDE41rtO/6Y4FOYc4CemjXYwhFO8MAj94qx+LGkg
-8zw9AxhoYN9/VgsZP9qPqydwy+avmszHwqlPVkkt1sPCdW+EWWOa68ttqrp6
-eob89sKrgbcAEJ9pRTrBmBOGRbr3J6CXB/MJVMrLg6NbgG+FQFDPSyxS0KIa
-ktEgyD2QFkZF8SjixthKmZ30ekKlZkihIHyu6rMI9sHqaik0dqy+TpSzBej1
-AUMsJljm+Z7yaPy55U3f8aSsLK4gl9IgbxDJqbBjmznvQB2EKtkZJWUUkSov
-WNA3fW+OIz2sDZKGr3gyjHqhdqP94h0cXGEEmVgJ2X1iHGPcypkPWfhNDelB
-fsGPi2NTuWWtp8XAzAyImv4WAAQX+doTw+UWb2pvqmkkSNhJBEIqKufPQVS/
-cMj1lUoRrLVeXXWJfBZt9JEcg0qouzC07xxYvkUdww56Qkqu1S6PUYg5/2io
-cLcw7rKuU8tmbLINa6wG9bwtYUZLhmhnHZoKu1oOenwoSNYhdTZuFMBh2m4B
-ksdDdXBVYPrPVRalifi+xmkNeUQi6MjvJTAgZGiwqMkoPp5LB9KfBu/O3Ev+
-ETfWDD0z3yxBF5mcM5icHlzfrWYtJpfYBh2oqUyotAq7lpFs/vZeyYC3EQND
-orzMapsB03m92mtw+Ebv3q8M6j/uSpVdyiuuUSFGwD2CSvqykLQ5GG9CF6rw
-j5+e4jvXWPqGgKPRhvZDxnJf5Yv2Ic+cmd/duU2Vj8asB2s7fjE2u+rJJt/G
-mjkPrNnn/kcGQjOgeDWykNPklJ0zfoEHkyA6Pz2/HVFK6tGx9Uoiu4Zt97RY
-xhiwyX4wO2NMv3GSccDa0D4L+ob3oYnSenOjzXlLxlI5/3bZSLRWFy/oSYCJ
-i/8zK8kz42oiZlr0n4FxD/qCguLuldl6+xt1W+4oenxzhzQP4d9ndH3iFNsi
-sSv9G+ij2e41l433u7YAJ1u6bp3a8/3+29vf5v9MEg9G3LwQ9JgXwdFEi2WZ
-tFVfCYRWxiIzHiI/i75ZGJaadQggOUSyC9Y/WPZeyKfNTgQYs35kRLcfOLRu
-Pi8Y8WeSZW8Ou6+BbtQlylphfiXsOe9KTzijvpFX0QVJexjpnRtPZhXBnM9G
-L+F6DJf8PNALISuVpy/COHGGd72f0bldsEV1S+K7XxeiWj5gxP5LK7um3mMH
-p0WwldqrJ8niuscYAf1a/zowoSN7+BUGWSnajRDQ+o6nwRL7XU2L+eo1LWmi
-Z4NvPlkx14/stuTb+Sfm0I2xEZEPNz5/m78V6tZ+m7PzRlRKc1T12r4v0wXd
-qUZ9SoekH1QBjUQf7qny7jzivjbWZRVV5pN/EHUyxi/5U5SRmL3NgcB7jmSX
-7CFfZYS9qPqlZCkf9SVUuPSCQxKJfn0uF//Wb+TSOMqrzk5HSPOW3BmXU7nG
-9EqV2xktHzZ9pOnV9XVa0kZc1oJDlaJrGBPj+5NHUXEnwvyc5MKoEFWXGc3i
-FkiF9IHKQnorFA8Wh5J1nxtFQloqig8nrtF1w8ly9mS428F9Y9QCyVAoTNCi
-LpGLLHR0bAShW/RCwiVXS0VzWAXS/BFhXAmFVEAf30YL6oAlmz6iOxnVy7j6
-iXVHjyMivkUNPWrjUwrgUv0VcuV+TzNL+vpkLooOSpbXFqKkyuJOgsRAji+Z
-SxB/vqkaq+hlQl93TPjCYJfxBK0cdq9jkL02rtrOd+Y8EH+Ou4DiENJE0pVy
-eL1hWLghhxdrn2EQcmkkoRjhq00mMm0EYZbSSG6LqseeA6SffCKPM9FmnDvM
-2G5jUmiwsUIIPpYpJibSpbXTQZxBRMJtE1Kh9O2GJYWx9DTXLQDWWtXj4N6h
-wXwI0lmb1GrQGy10mWocEcNgY+wmXMKMaVPo4L3MxXvuLiNIbwc6+hemrTwS
-26LyjicOFRAFdaJjlcDyTSGkDMQmOw6bxIhSMmI2fUDVlSBYx2D2sGg1rW5n
-MBS/XZ/P9Cvfx0SVF2Z7uzB2u7kplbQuSYG6t3I0TgJzotuhExLszfzHWc+d
-xw4d7VXAgQgAwVGvdl+VJ3G3K9beXxVTNf7pp929+7yQ9kUKlBZ/5afplr0j
-ih08Fx4x88iRoyFO7eC5GtzLPj/UVRholA3PcS+sCeG15He9Wj8kG1nEk1Mo
-eT0jOM0u6knHuZ3Gyj8eOvtXRwlkOnfz47GwwTj3Dx9bfin3q6TpfDKXbj8T
-DSqKgi90bECcbgj6P7Y0vmv23JntctGofcEGzzekcNJvjF176J/alGyppcQI
-Ucr+U5WKelXiP//x49h5xMuWPz1jOD2SoUa71bFbbiMpx7kEvqvZiobUfiyn
-He1Ku62VfPYe+z/3E15ag5OPO48YHSJDKyoubAHEbq1lG15vOS8aoJi3T+5u
-xq+emvBfN23e19jJuvz4VbvTxVzCLcmYH1nRdDdepqxDOuOCPWY3gENQwDIK
-ll/a2XU/XJkOsdbB+AD1BeEhiaSJqx8PEqeuRgOrDPuGaLw+QRjz2iNd73rn
-4KnY+wX6EDCHgF5C+NrcFfPdGOtBEyYsnLb3G7NYsDkxT5FrEd0+D+hGsdSW
-5TWq9QqJOpgNsAvhOXylDrWcjGBsN6rd/nNJ/BXSIL2m1hs8N8etMEAm6ya0
-oe3JLfttRH+v09sje4f5rgMa/y77lB55c4bT7X/eV9NYITrHhaIMnHXqtawp
-ZNcm1W7GOpVFe010l5Ss8Zbdn00OD9n+y/uv5+9wG+oX+gn0wBQ7bQh2l90R
-JXLGZgtwGONPu1kQT82G2ShBveeHKrr5ojuH/Y2Cd7qi39xAkh5IHLs5JT92
-TwaC/gF3Qi5+b5MS7PdfbWpIMwt7J3IsWHs7M6SaLTXRWkKXv09ZGpyXPpEG
-0nhmEtqcU9BzlPn2Gh6xe0LzWsY3it7Lz9NZmfJzJma/7xnSUuLUGp7+t/Y0
-4l65mOXEHA1SeG4LIOphdtMZ8ezz8TjRv68qSGxPrwsMhYtrVz6NlvNa0aFn
-F34vxG3Sgsqn/Y0gN53Dx+y/aTQVr2Xdm5z+i71JiQh6/3vI+SFb/eBN1FQG
-ZKa6HXnQ71Oz84v+KnzT0oud982KmmV/YCe2AJ1udj9uuvu/e3n/2/sPOSTi
-0T98g8WjpIeezbeqbkzM37Lad+6ciJDYvM5+FDyvZ5umu8mqjUpItXsOLCfs
-IsVhnaWKwSQObnGB0sx4ryvJUSiqkKpeXi3mj9FGk+m82KsdxQQoutpPZAXi
-CybZQdSiJDy68361GWJpoygh2y0XAiAwHmLgzeut91QJLLTvQTCRZ3kUL2lp
-IczMSAAWd8ND5i6tbvq6zPPY61Snai6nVB4YhqmVoOQDqYtldBWeEEcqSqEU
-DLh4ebVGOnoLcH1/4bY76Ou/RB/MkV9bXcVDwnhCGi4PtTYQs7MUvvl/qC1X
-NCEWaaDdwDDi9eP7RQtM2+SFQCRfSBH22eFoPGrkXxHf2FiK16Igt1CgkIso
-lso4rxZGgqaLChn19nmtbwgQ+dfCGRZEHXjYpkBMP2CIcoaoiiaY8NUMtgCY
-Wo3n+ymZ3kSGucVfi/4QptVsgsQVL10REgTm7LAHxCgwCRPAHWMTtEZXufg7
-FxfBpYAjqHjJf9IMbkmgvLlwIh4tWtaBFqLyBiGUfOM/glrl+TYhU5fWp7NX
-ca1I5//5W5sJgJDRkQOJ2yf0ZQke1kCYnw7pCiUemq75WZIjCK8d3v6Zc9Ck
-yG4hKJHdPlSDEpiXpMWT+JNJFtJcQS2oCjIt4rsNbsvnKPn8TZ9YgDegjyvE
-xC1AAofQb2bKSkzkV/wplcMgoc76JDmktcE7KWLLKRBDMl6JZfVAG1kkmZDm
-il4eLao96BkvuU91W6samYC5rt2o7fNYbcx2WkEqG5CCShxaLMYKdaSxVwyy
-BfiKlyz0YvIcjqCXBwpGHgczhSoVBj8unkykWwLloRLWME+pOlHmKHqZiyPo
-l8yLCP/j4KqFU6zmliSEbwPynzILpDX7ubRjs9vlTnEDOS0nPKFka7/BhNmr
-aiL07fyGjBahDcMmbohYNJaCGIPo2yROMUgo30qxndAp+9Ekga00rrxrdrsv
-lf1QltABFYsjqyuBiWRRGqXAfflgSwWBnxaJ3LxGFdieenfCdFI4iP9tqojr
-bEJ8E4jJekQuQdZ7vevAA12tdZ5DBK58++gLvn027LhhJi4Q1LIpz0U4hEDA
-vtzTJ1iCmFIGaOChxfrcdpiTv9kW0hsvicRWSiIL4fYrB8VnoT2qfNVSkjtS
-1uBxFN2KtD5ngkMhMb4JC59zUAwUry8zbLvNIfpz9rBp73Z12H1gEAN/6t1u
-Xz3vGp6DQNK7RW+xWGxb9nbFkYLcspxWqBb8ym4FIgUjIY+U9ZW3i+bi2zh8
-Ne5xKUjqX6Y5JJWSGQnN4uLBPT4uNSIsq7V4hdzwuTWHwmDf6kd3Mp4bbfAo
-UWQW09wiSKg+FTbyBMuhU2v76H77Ttxm+cKmWk26Cp/nwBjaJqVfSYRlPJjL
-R6jajIoAXRlYZ0esoB5/EhXJV4OptyvzepPKhSb4LwG5GS6WSKbPWQDoRLyi
-FNralFxPrFQBVTu7j/2AXx19vKttuySuQxRzzZ6zwKOIwQvvvykXbwPq833f
-RpNMoNYSo3Ss3zf27iqe+fNqMXP/iqmbGnTyWCR3Rd6vBOgQeQnu52sVsutT
-km6FNET03HGiQShs5xdZffv8jZk2ND7m45t7/gFRuz7iAkKq/J3sPzznf644
-KFcYKUrJt6F2Ts4gju1PB13/EML48+FYmj1zOGxG/cNM8N9/MMFerE4j8xYg
-vJ3DKV+yEqp8IDKp8nTjK5exs/cv5pzI5DoBxSR6/5X+4r7RANoUCHiXMjuN
-H0TwIf5ZDi/zTzoXhJ06/l6wKLS7kwnXMNtFD2hFxK7nd57O6cnuLpHPeejV
-oLb0jmucR40O6roYr7S4OHAyfbx++Fvc5/PnYgfqgiNuH1WpMaZAbCfbkaSB
-wlK9YkEeIzTO4ciTe9Q4KCLWa2/nh+I2QJSH89gHdl6ekIUNOVMr/zXsg9JH
-LMhZ/YcuXzl680+tHNuHGXr0UwRE9azEJeO6f3pYqez21KE4SLkL7uIIxVOO
-F+Z2+gM9VkPi0of++w8dNWbemD0A9kQBkMZ+jIeVey1Gxn649wVGGD7MiF7h
-4EcwSYvcamPYk+qgiIBjNcWjviurYsdkpvTFYKst6rFd7prvF/NKpaTsvzB1
-MR7zvIrusJ827f2o9YDW9jkl/w8l4sC4DWHwAGGZTPewMLanc7PTkbX4FUOg
-kSvmZViH11GNsS7V80u+nyDczdK4um+nf9GraUc97N/md6yhBzXewo9NCP1O
-jq2mdjsfoX68A6NC5du8qqrwbbyt/OZNxCWDtH+MtYLsUZg4+tXIjP1Qza1T
-6OQvb+kpFWpgUvE67b+ornxQlAqV1ysNQiKdGc06kyPQzoHz5AfvL59VedD7
-xTg8yMx1FnS0stp58vgBhZV/8ypnbpuck0Qe82vF33D4+/e3XN/07XfmyM3r
-thde7o3wrW34dyB2X1B0CN8oDFPUFYaRYnOxT6r+ffD3fbtQyRv6cc5ywVXw
-bKJVz//5HWjfNVD1VxKlLuXQMmzQ917oPfW6QELop5UXxs2DBiOicbgQ2APv
-dfvNljJkQPqRObO5319T5cq7kXmeLmM+uMlrAzaEuV+tP/9dIEsPJWhzu9Ve
-rZoFPUn54TvGvrABfV6PwUmT/lrdHs+tRlRdUCkj2BxrIVhV2uIszum961b2
-+WJULccghDiLno06QqrmVGtS55VS6e6Nyhmvn9zdXyOQ2/kzfBCUEcA3e0u+
-TRi0Ub7qree6Z0ihaNlcac/EYuSlR/PNPU3BSjvD5y7lSSstC7ghzqROG5cD
-12srDT7THZtR8eyA7kjQJb+xlLgg38njTS/3VqrU9GvQwj8ui5twXW8E7b1u
-VjS7r9Sl5lfr8UKBcR6moAcbUmFbZgbWC65inhSdR3sMVO2AKS2u8mio+seT
-vfFnWTp7VBqzrx0iifk/i6QnznXdOC7GWnZ5tdfmmZUCufG6CGSD1/dvh4Tp
-pvrDd2v5ojNs34LWvAj8z4s7799eqr+9NkB6wvfynaj+YLbiG1itmaFYj36z
-GebIdX4d92yY4ACxyzRIMQqNhVNXM7DVlcGR0IOklZHWvLe+Ugbh9baPbxWC
-vTBAeXWLLgz4wyLqmXqUqKXmd4CX4KC24GT+L7/Trz496TEs0v/ywEuUSqmY
-GfyZkexJG3w0ek0xEdP0pErBI43pHXKotbd67q2yokUoi2bc2r+QtvokYnHz
-b+q/NCslRd7dh9rOpF2a0d2x5yI0mxSSDvyIOvi2fD297d7tad/uy171oFR8
-ME3hYu3iv/xS55jDbjNS2uYVQYcYO8Vh+AcsY5X3vboRvy4A2CltlhaaQgBx
-4L/FupMUm5CK7p9FgJBMqIjgl/5z8edCDLRcu1Z6ouDYL93jrP23nkvUgted
-IAfC3ZXYCHQKJzpCLYuQ4n0dfXt8ylt5Ux9/9tTNnxYNLaUBP3qSgkkjfGil
-SILcdiPc5e/EtBoX0koDx3CVGvaz70o8Jm/Q1wBfVldmhvQbevXCbJsGvp7w
-c3DCdJn72Q1ozTsASIHYEZwiUhzR4tdMO3hr8GuY4a4nB2u8qKIDDVbxKuuP
-V28YiJeEleHiaNYNC3wlShrYL0/ry+ECu++Ovd9TjEDdmQd1SBPMm8eMValc
-CfHvVc410UqoL8xhz7voyrCr/JspvD/3qLo2318Zr9mvQkchambAG76DhqKF
-Nx5zLoXq9PPglAykkJ40LohFt5K64P5uQ2ezdIPe37wLOg9arJwCKyoQMg1v
-RKh9K2y86xCV3qXsLS0XySFo9iLCeDSgXifr0Gt35jtfWo6b8zeva+mhrklJ
-HLmoN60gNhfT+PpiPiSvK33RYdSVLiM957Jp/am5MXw4+YZGjPzTo/skQniO
-19vBSosXfqy97F5RkIkOGJQJDBIyI8eAPV9DZhDqZ0iT1w77nbs5w7s++ixQ
-/GT2vfWbvPtlYOv36FpL69Ib2CejHwDF1cacx1uAUTrPSW8ySPrWmvMoyOBi
-Y1PhpGF0o8a8+kny5KWvr52ZvIysGM9Vi2NzqtLIKtWMw7UlPZmxlmO5C3s4
-8jAFLszh19vw2OuN/Zo77XUeiZtOYZLSlsak1xgOdezIlwEBvvDMdv0x2QxN
-fXnIa9iTTx0zxqLvWgooLlayc1Yppt8Sm7CV4R1aOeHrY50WdQE6A/tR2QYR
-PMesDgB8CzD7i3GYb5VN+Xy8enb/uu54MaIUdRdOp3xiSRzyXW2VFwymma3A
-VL8x5KqASixX7rmI2+rhWkUXKt7vkYE0/kuJgBD3LePYBn8rxfESqVVTVCdo
-q5jxNLhHvRzduXJkzd0WDlhyfmvuVhw3HHFUp/1Xkm1lu53hhwfGe0BT1NXy
-nYLWPMZBvqPtpV5b/LQT7Qpw4WHiY6ICty/au2vA/UxN9mSfu/7BXB/8DGG0
-cuJMx2h2r/7kT3kdNyq3JPTsPfEBynO8q5f/DfSLxhj62EAzYWL0jT/+z1qZ
-YMX0aK3Tjx+xDJW0Ob72ZMiki5Um7l3BoNyErHu2xHXckUd5unOLb3aqRHgh
-IHCktQOiNWmggJC33cYYD5FQUWhhZVXaKkyKHRaPJnswreGHUHC0tQ9Uj4i0
-1ttRHJbxSw9k/4fJk3D290R5i5Yh8TLyZBqIguKPcgS9gHE6KJVbzPgLQa74
-iUgrvOD7KCMzDBFqlZqisFEwH9Gae3dKTCyLyqOG1aGZpkYS84Lakylf4t2b
-4Twahu+hHK06LsFlZf2JvjDtcFdtE6FONtY6qrBPzFSIqF+GjG3OzLchmzv6
-04giy8s6XkaORm3Fh9VsgsPsg12AeAQebZSp95NbHb52FjmJ+dQdhcC3upP+
-Oi8mP9Cju88tekTxlVZ/WHwLtEPEz3CqdS56zM4OoLvhBe+UeqOETGUxZjws
-A5MnDQ4MwYwKHZJscPtMvPto3ZK8eK98Rti0FYtbpjCXg56E0JgwSDtrTBT9
-uYCRAQYbIjU5vc89+678hoCWX73+fFF5IxXVr/+tWqEQfo2C6LiK8vQqAxvX
-tQQly3QawtnrFFA1nWlK+suzL5QLwXQMNI7+TYHsRrRApldVhFDW3ALq3lo7
-nBnDYWbkutw+cMLtvcmX+ZAlNuzqeSfABtL5n5EtfeTI5/MdCoSzT89+c77w
-n0YDvDD8rT8M1XoIw/jm/+fEgb6px4kcpovBdZdPdp36lRmr39I94qVCul1E
-sX5XUFVOi6SR8rMRhrYOvzQf/EvzKdyx75wSBll5pXS3tD4ZtvJGtdFwZAvw
-wnda/3rM54wY+loLs22HXbClQItp9e/kw5v0II8V/5x3a1nFfvEnBV21z8yb
-R7++6zb5xjCi/6ZezXFyuvPP4EnAeI5PtP1jo3um6gtX0kZVyV9lH0afMlnn
-0bRBnek7PI5sATw1OlMWv//doWRoA7//qUtRTk5M3GI1PvcfQXqDtqfpTQnj
-70qbEc9BtOecBQRaKd4BvRoMbbEmyDGUILGbZ6LezWtOZCV9XWDNWSPJdeev
-qIuOodAw+KX2hHv68sRBeou6i72re3rGCwgEwZy104eiOVXQG2tPcL4Kaqkm
-DTqIsju44Cuvn4F3lGAn41Ml0qAToIjCkfXJI4++7TAPK6D97tnYj3X8CPzL
-XIM75CwxONyqMx5PPum6n/UQn4z8dP4M8PrxUPNgX8JkCmr0LLojUWXDKuyI
-8fCZiwb7/FCzI8k9kU1oaE+RIOTK6L5CkRnIgZMNLIwO7WiO+8z9x7HZJgw0
-wza9Zj3+Ojn6ZTdPJfnjaXzEe6ep/5I00Fd36XQYG/Y2OyhALk7pTjdqgzsO
-UcGv8/SXKlwu6dP95bUZOVQqj/ImYkEoAFf0Y2Pl6LCO/FffVlZXfxs+u3DW
-sVVc3cuEffrFpKFWnW++1XnvPHmnGUPZU3b2cRTnHdn3XxfmkMeRKfmRFle2
-faPsR7swkgnCdzjAaFzoLCOz3ZdVr4OBmKJNSIXOsjhUAgY3OWcQ9hu+QfH+
-K8emGtdmN0gAmQLdlw09SF7/c2kSzJ5p023gDV3j6r0Td8Qu4qCCT56kbbET
-VBpkOEKWvkfaW5QmWJ8sFD8HhTk/MQcRHElEeeaszqwhZjK1QbtzHMuwJkCI
-Etbe7EztJmr9QG4wnMuc8TnieZOHXLkWyODxrnYGCuL7UXYm0mfh4t0FI6hI
-BFGCZbszSEUui7Yx2g/Q2YztSwApDKOtbfwByQ1k2OazQn06h1t2KBswA/cm
-Ct+JiJniOe6w61iniGbD0UHW9tTRAokSej3EF9CyBkE6X+qI1KES8SBH7grP
-IaMlhmTX/TT2c0MjMKMwvHS7jziPk3r8A8bAu0Vt+45Q0eye7V4re7Y7o3iw
-TMGM+spd+y2JU3CHjNokNInQovduv5A475DQ5/soKVHR3xIXaJTUhqRFPkQV
-xBjNaFnDZSB8ZtqgZAoqNl6yxfY0HH41IZq56Uvgbzh+yKIVOu7p0e7nrJZ+
-vGNiIQ+VcL4PWBirNBJcKoBT/EcuKypgpxzzdwpJO6AN7xpGpg2+dNoNpEHT
-NU58MYq/huOU1h9soPN4VAnYcpchlEF5ObQe+8sico+94LJoBoFdCiT62dM+
-ItROzSc00qk8e2yQoAWwCLXeK6qv67ojzwREVsjtjaFXQmDSZPipXumn6Ztw
-QW2VkE+PTZIZc9YwULKL34qUvT5JaRFH5f/LPFQPrVSDbsLzbj9u1t7eoUHS
-KAWEA7R60Cbc6Tba77B4Ma4VKXtxGbukZuaZOEYpmAf0zBdBmKfC1dOc5FYh
-Lb763ab8y9GBJWxcp5JrE7V288zo/QynywDtO5KYtv5BZPfmpSGHDImDPpOj
-Or9yz79HuyrUDSxGBIRfqpiKvSVfg4HDHQJ2epWvCjTP7FdnxbJuVgVMjYm9
-lpGL2hniKLXznZFXdb38myxCmL3F8XcmokS8SOgmdB+D7/XWr0Avtay5r/LG
-PNt69nFFQBsmGljwt4ofVn2TrxMAn/+p2P/oZRzBAThKR+MD7B6V5TwdTjV0
-5bQk0YwFtakZzUhreuvx6E8LXQI5f9bfdM3D3lfM97gCtPmsKl8pxUA5DqPS
-2yD0aYgXqrqBzwB9H8h5aLDKsnyvHqxD8hDUKUYMX8tqiKz44HuzpHOOzk+7
-3k7iLtjeFxMBCuP12xFvB4PI1PKRriSNlqav5HIH8zM4oNqtvU1K18aTkkhX
-eLGO+zKw+Ghscuvp6A+dBpHvPDP2VldOONVfRu+Lv91k3OxkP4FAdudjjv6q
-uqB+ys38fHx3ugKFISPKLGA+Oxwy8uramFffNUa1HWkglz1GYLoHTRwI63Yc
-YjmupQ2Cnfd0fN7neXe3ijRv39c1D/YRV3ZgU4R3hdFp8Nz34v+Gesb1oemw
-X2WNWE/HJki0gkG8pHcimc664gSQq/9e6A05ILYF0FbM2A17VxXr49Y7aSWv
-jaYk7JnjKNRNwcldP81Z7jmWixnP68lStzyULwKNELG/iDvibjTQ6vL76t5c
-qG3ZmawqvlfeFIgPMjpl2fE82YGnDH+snLMcRQjVh+bjY0BpgrMzF1vV8k0W
-54uO/uy0rSkSeJJkwHLhb8YkBGq2k/LOthK3Pri4WZkddATfMXgoYfbfu7pr
-kh2D/jXM4uV5eCy1HxXBR5xRDMNEL6CZMOB+/htg6dM7DA1UvOQAXY5rFPtL
-w8KxjlK7vlCFvdds0yjEDWeWsPv4Xv1xl+mGiDMux33ezst8fv9sGOBggfQb
-kFQBf3p6R252Nva0DQACtba7SicSKkMw4LVk7/Em1QJLd/83yUEnL4zLeT0z
-LkybapXnX//V7DQZRQ2am6Mce1K6+2B74s6Qr69vOmdga6fFI+M+QuK0A8NI
-lUaeYYLL0asZAuW11MtslLMCOuDB3FkfSatsG216qxoP9sRY1Sr2fv4n29eD
-MlI/cqQNxXX47rmjx6yxhj5xP5uU4QKdoWqWpYiMPn2g+cOkRecGUcy1q9T3
-xgRXJs+1ufC1aFsbd7LRfwvw2ONgnFKEt3HLgeaPOQmXkuUy6EolvF8Wuxx8
-rc7HjHmNDinVG2NyX3yRX2aNvudA3C5UylId0OoHfvifrA7BbPcuTjM2zv8s
-ey345pygtxF8Q+kEMOwmFafWv+Ifilc3Z5TcfRhqLsLC5NIvai8VrC+NWa7l
-lE8/rbaotpa9yZ9K/aGYNwPuBh7tjdNfS3/j/2zw2cvX2bSLH3+esXuzXAgX
-wrjmd7aaPk2rJ745rb6KlQlou/2JY1z7XPGwnTZtsNlwfBXF/RnUJfWsoIif
-f+5p6ITrJkVaHGowtEaeLPIyraGK50WvfHZC/DVmS8v7HRN3/0VpCGt1wVRm
-7LZDVoK9ZFTQzn+bRSuGZzB7KQua/87/PKuf9TvUBfwadPRC06ZE26pUQfi/
-/VknNRd1ElxARV6ymo7XFioCWl2K3kQd7wYGWYcuivQgICwGVMKVb8PenR3h
-Zujine5abCW9w5L00XC1cgsgGuc4INWZ2jF6tj0P+/3Wx4B7SLMM7QW3C+fO
-O/mODmUTtGprIQ2HyEZw6nNBfJ4bIUNSQ+kMQCc7WJtbXtz/IMhp89i8WtvC
-8RQS7Sjp20LoSyeNFEUt4G9G5W7z9nV4xEo1mG2Hpdtgj1lovnh72R9fgqo1
-XCmUaCHB6QL16I5OWS1UQOXZC/qedRfZDRk6/VMMaF6Ew2f9C96fTnytSm32
-7g+NdYgU1O0qbUW8DY0bO/8wjHbhYohrZK3t5bmvJGqdpm8jE92hezeyx5BH
-FSHRdJEG1u6v8j2PFLO2b2cZeXOLOYLw1lxEsQiN5xAltwmZ/qLbomqiyNvO
-TBxjSPba7Ybuc1+fgxXvRp4x3AJA/fR/ntZXKCLyOJg28DK3C5R+OhoSMjaQ
-hH1A9b+m6N7M5XDw2+mDJkitgVzOv9QmEcMN+7UwC2XGEo5AyexGL/l2ENYn
-M0XXKElbgIGyj7sNcspZa31YZ0NK9vtL4rmRLCzLgsC0hArjWqeIIOzy6XkE
-01cdJfJlZzhJZsE2qNIQSnCH5p2mFhz2TAbBPj/LjNetbe15JY4TBs0x+U1V
-HNQ5KFiClAbxYbBxGWoJ/8tFVKNjB1DcFZbFhFWgCAbB3MPkxfbxy/Xn1no/
-ekmh7Md4Vw32AT/6buae2E4exMkxlldwhb3ng2NWSrt3o3rhCmAOruW4IWB+
-bDM+11udZBSyfcVKZPwqDKhL/fVYTXXBqkHEphi4Lmn/VVAb1vbqx53ltPth
-dmQ/X6MCA0XT30I6/+uyaD3zssSk9DyAgdfSHV5esOl3vHR8NKM/SlfW5nYq
-Eg4x2LhqnAtnsEv4impMMt1ap8AwdgVXJxGuqGs/NpqRIGJxVXS725tuvKRX
-i7yJ6/Kag3gSh8zFy+9SqQZ5wA32uOuzLOKJySfmLBSKmJCTVSJoZ+3++HA5
-VBhXCAsmXw4D0GROKUmeCTMjTZhfljeXoxwSznj74ugeOn8ylz2Q3CSiPQ+n
-cIwwvtvHR45px9oUIdprSO40HdPKKYZzFxasOEILse/dpVLgI29A5+KZOULZ
-QzYRPv7/idCg2xeck0g7MhNChnj2bWQky2LQU06cIUmQVzOQW+XiQTBhfBXJ
-3C2xfZHaKgFJ1i2O3URMd8MVfAAKnLDEjKIKbVLcVQMsg2UtmBaRh29nXMhL
-EJk2GAgUr8gwChm+DmkLCmG6rj4ptfGfk535WxMgP6rs1Wdj3g77Z8FwO3Zu
-pLXO0ZGqEYEwsFFv6Pi8ifb6venvfGSqIvKwvlXVxLu1V9VxTFm3m3vmpsLq
-rA5k7+V2hcvG15XN6Dn1/WlAvj9nVai2MRKCGXfSi8X7sT+fjThwesz9g+ss
-YuMU6QGjmqb7scC4Juz+WY3ZSo6GLlvxSdLXk5g3c8wCzr09Vmp6Q7z5u7kf
-tdY07zV+JDY+FhGjLTXfhgd8kYtXFET85N8ePauL1Hmq9VFEq/6KN7f6EnVW
-g8O6GRBw4pBLZ5M98Lj/y7V0jXTio6qXju9j35jfE6/JPI5BSdTdS3mNUSnS
-+FaI+C4VEUaQ2DWa/5+/qU+nuPZqdFdMVfLZd3Firf6XBDHecuH7ifwz6kVK
-HX1rliN6aVoqH5f2u/zRpaeof84aaJJI5llBxSvnqhV/ONaivG4/vFbTFfXt
-N9wJPmiJzrjyj3/qHl10wvAQfsy34u7XPEeZs+f1R1jOYxKKtrtpHg3N/XOB
-h+6PnWlfevzcW2mw7OlEGa4M34XJmjR8aWt8x8bsb8r4CtDoRjYfTMUtFn6S
-PPJTCtM+1UCP1dtwr7tQo4snXEznOPPbHf2vl3z3vUiDHuE7btbEyDz9rxY6
-vVh/0hxYsVpZreB/unvZqu/tWcVGYiOSE9Ug95+FzFF5bMf+of336j6w7UoO
-vMecNAHG19VMBolYVFvcPtevkupQc/VkkzthBuInD3f/4+4+M2Sb+t34WhZD
-AfqBrdGS8vJ0U4WpgVVow0PVlUdg5fHVhXWaDRshsihAS6aeqD4YCAlJulFl
-LDU8k3kpAnlwdOTn3t2H2+6cN2AvkP66aT1pPiX1ZDYggPFi0iXm0e+r4ktA
-2EAFXU2tnVC3UHwm9EMjlv74Dnqip+yh9juTc4TyqfAV/OKBUq+Jf4WHtfPr
-zq7JyU3RTCt92Cz40Z4XuikXGtDfz2tdVe0L9+EgxGk2VrKW4+jvYh3YypCz
-1ity9bQCob/m7xh2G5qPye949kxLxP/VsdtnYGrpJgvvkDq3kBJzRo4qySMc
-l+97KgdvaJ6+dHcUioenpsSdAqZoaGp4vZjPjkFVuYo0KYohwG+PLM7QbVsa
-EKJujdS5ebnmzGSxp1m9Tn7djqGFgXX+4WalnMjWZC0RX70bCio0RmP/2/lA
-hj3jcuCePX+EzCxp4kDtqQsv+O9O6SXrDIuFVxE7jMVqF3/oPMa4PH2Z8ylm
-CqpTiEE6whbrH5UsNkf5Huj4ufLix4+fJPfPNZ136Kq2Fjdmr524j83qenR5
-bdb6tshHw4eou5N4ytegDFmy0tPrJOoqsjIiNPqSCP0C+yRZpeDk0jPNi8Xt
-WwDZcIWD9R/Z6YzHA96+VV6HalWORw992QK0+n4/auc6GmJ5Yndj0L+QxfMg
-tJSSGPB361U4Yz/P4Wve2nSTEPhcmhtLm5X6nNlF12+2XSHoWAGz+zIvJmiP
-LVZpdk+O3VzrD3xQesTsQInjSblHYAiM7rSvpkLmG+jbE5s8/L9QzPkPv4Ja
-T7K+4q37PjmrG7wJ7RPS/oGW4xN5K1lhE2CpK48u9R3+cMnOI97caoXp/C76
-knTc7ahJiQtTseX/2e4FaZ47j2QPJtkuyrc+nWysK7q4dNOrEHT+t8i7wu2Q
-e6OLWmFl9t5Du/tlRgvZYPGRglIzG/R4irJwdhw7d1blSNlkvBfqxsDTUj9f
-9unR5eu/HgiGT57pbSvVKRvVcVPAL855uCA8Lv/S1H1ZEZN3R+aGcen1aono
-E7oId4T7DC/AzKHoUu1SAphjP1j18fzhR6UFv1wCLsvC8b9naGp7e0IwJjP+
-33QTdxKPcz2g35c7PRpAEwtp3MhhpXXzPdOIXcG8/A5Dw814hrMU7arb9ySZ
-x+OdHQ3G3K5Hb/YsVxi6Sal+f2HZvtZpH8ABqStENyk4raaug98Yn6EFHe90
-jk8sHRz6WNb3xPYHE6sRwgdWRV+ouLc4qTUX3h+BsGM4FihtVBsel1rkvjFW
-XZT1h6e3vrlXTr5dbnLxbF/GU7JHzycmreRYicp7+Ho289to1YrRaucARvED
-Oyo5pbGiPZQcKhbv7OX9w0CAzQuKs0sPNLo8Ie3hk159ziwCdH4g10MMNYjH
-VJSznPKjPn7Yaxp3+51pt+G+6YgtwJ6htYerVk0FE5MIA48LlxLMlsQlptS+
-y8AwUrEq9SEberTGZLa7MFLum1/Mc7iO04cYLzJvKpw/DEq6YfgyTDLJV75B
-3r9P+MGGOFjx99Jhy8WuE455gLz2n/b9zcfFCROqnN2N2eA7e0TLZRDPSUtv
-fSaLS8QD02t6pP6tK7iNy+RYsXEWk6fCQsIOb2ZMmi5lhqC8Bz8K1CuHMYqL
-/IPNfmVX3nz9cfsDie6GfWy016va99lBK6PM4VsBS4GOx1OAZuvXBuuTKuu2
-ABJmZX5HvpH3qyvTRTokJivdzz+tlK32jl2PPEWNqwxv7FjDXWa70VILNLyc
-qIc7k8/+O4mH6JdFz4/NbgH21/qHGbieNPK7545e4srMuWAXq7SCMIYI786o
-/GeH3p08UBLXZrAj7GcQa1S8jsZxQVyY8vepHHE+9/xzsrTo0uvoTyGFR2Ij
-zVbgxi8P/Jo7DBV166yQ6XrRDfyOuuH0OQy7wznBVAQrPSNOH/g0VHQhkFNR
-u3q2xkYGlcciwwkTaPGuiSL58O8xzjd7c1qITy90sgjmVwPnV3XtV4e0Bcpf
-w6Q6Ni1mO7Lf/AOthPWo5y2uYCc5i13YlcAS/FMlie+5KgAu8KN/f3X4GveA
-gYt68oGdNbn3ODuddhPFLxw39KZyFg6NtJd9OKyx8tBkIcnFk30uXcF8ltr6
-egsQUmQdRwmKXX9hLPnOANmxcKi85eE0OO9je99x75P18Udc2kEPT0ZcHlOC
-FoSstt4BMl3gHo/OhhMlYK8Gn1kSnmRbZegdHj6MmKGlxBljjvdNUJWyyizr
-D87vNrfz879TYhDq9KtpRe0SeSoYK5F1gr36pAQVsI++z3jB0b20A1MojqMx
-XVeyJlTDA8Icfp1syHYiInoqE4DU5ar0fLD+NNgY84v8tGJfXm5+Jl1KupR8
-Zg0p5hC9BegKOgGr3Y/aAZ8bHlFld5xFHuJfHHjwJmS4enRoYS7t2+JCqvev
-5qDJW5UXZGY1NeZ7Bp4C3yi0/hqcHt3hYuvDMsDzB5+VPHy9BJAUizzKvFFk
-EOE6NDBQU6h0Ons6I7K3K4RdRZ9jpVpC+341baB+VaNejcQZelruHnfTykWA
-odXW080W4y6IyJUh+5R//hqXft9RfwxPnEb4G4NSQ0c8TGOqZ1ZlK+oD+swU
-96X9YSXS8HdqJIssf4X+Cbi9ZD1cjp9skfS/OHg2y8/X+80lkcS7MyRR/bcu
-RUGufREtBmNdzhFFI83ZjzL+XfiuNi7kYm5jT/hSQZPg4vy5wy4eLstHOxEW
-dfdc+EYFsSzDFu9bTf2yP+aTlQG7jAUtr5mTPp/cl9eR7UcI6k0y8XpuAuPF
-LIfEKwR/r8J7yG4s+7HX58jiReyDK0m0NaL1tJHj+ONm65WwzfexNm8sRo53
-ZcCRyTo3FqErq6ka4S02jhjfE7mGrpl6YAZ64NVR5mjuwsf0A58j/X9QMIba
-E3vr15H3LxZOBTsFSVfrLUZ+1NVKKcib6zT3iVuxPBmyJMdOcjs7dkCl4M9Z
-6IQi0U330FN38T4m1nrM+ADV5TOj46uIzcmX0UY5mwtVPunOkjSlKNuRpEd/
-Ywv3d01+R+8ml0P+FmEwfVIbcvZIkTfxksfj949JD/27uDxVfyVU3RqUEmX7
-4Kxms1XsxYLX1z3bpFfI8GldMrCDEH3DFkiOUQy/O2zyZXdV2Zk0q8uzNNMz
-sN4vay4BcvG7a7IkRU+vfGEVdYbdJErsRXfFqwIOPAy8Hk1WyVQnLq4kglI5
-j8OnlX2VUIdaiGiVCzCLxeTW1Dd+eh+Xv/yM2xiK1AapJK4PgG4l5bm0nLpT
-qEkrGR/zbt6ww8Wc/GqcE1R+JGbfRzAZ5MwDmTZTFziGVpwfiCycgkP1cUj6
-fZ/4PTWUAK6PPGZS45KX8hNFOW8h8rFbJD468jk9Qh4/S3G2Ds1sPZeqPO7Y
-Nal2R42Ju0QAHikDCYhwfbJHCaf06rm9c1uADMp4DjVpiDbajLMnJFHR1iJG
-gtIowsGwTd80QtCVWLiDNAEVj+m/CGCAyaam7q2bFqvlShgimqCr0S1a7Y7w
-IcGog7lanucgqvp02jqVai829JVu3Mo5aBEfQqtTA9IUBLmHMDiB6KbP9Hm1
-821eBM9YJ2ycm4QwlJh2Q+kTosg6kh/nvoxc2ALr1qfWJ/eqfr/UuHRIeWdK
-O3jwclDyG9nrXvac0/4Fx4wtQuqr/Z4GkecweZyOOPXFqiXzQlhAq3/YwkDy
-2vUJ0y3AOQEQeYGoWccJ0i9BZAS9aWX8NBSfb2GNtO5X4TvSbMfmlHfARP86
-jwUlY45pbAEUJyEWBcPxdb3T8XLUZkO/gNrfRuVu3997G5JFjTbVn4Je2Fda
-fZZqDH41Oe8jFtDurvNl3neNUQ2W0R1vTsKWcFZwomX643TqaLNuX6/2NZFE
-UpmFtVewpWhGlPgcyd4hEYtELlwLPP82yjNxldg0Z2GvrYdeIZ45Y0Tc1OWX
-v2lIbzSeKNfJGgJPXX9iPPGaf9vOMIR0sq5yEaeaZrXTqzpI0HIaCAnBIHzI
-WwAPIRsNjOG+vXVH/g+43XhT+3pg1eW3+1XylR62m9jnkOV+PbSQcdehUkef
-B49Fi2aRN65VvxJlYNGgpYtMVjbsTwyQMApRrwTtN4K+jj6vNl6zVD1Ve8vh
-v/ugi8PLPfoXSHGRyxbpZ79/MSK+13qGe53+c6Dl2NCkVAqHvMulaeaqbpbz
-q8eioieCW7RplbHnc+myri8jztmeno+pbq8+OOzbesZAd/lcfYPYRYWQk6v8
-xCp6F/TYmM3AkFXf2eP2jai85w8tHQxVRetiGJ8RZ5avsd/4jbqfrL+l7K2+
-9MzTvG/h5+3o0KFbjexHvUza5+9XNTfweR/Hp6bu11ak4s+8z9kCnPC/G6v1
-KF6zquntgePX312U+hFZ5vFXY7pt6cDdjknogcG4G7H7gyTmmnxR9+c8/ok5
-ZQMn/VHvF4tGaKiTOVfZux4V5A/aF/2XXHpnD5RSdPuIREasUZvEkMdZ5MgF
-LQkrtQbIWdnp830f+eHHPydulnWOc6Y41ZfZ0O5DZSxb3PTgg3yavfFnK8Uj
-GQkiOe6371wXXBALJjjeiVLAaldWH167Mbjc7fR+umCzFp7WZN3bNOs5fjc5
-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
-UcRjt3PRTxWnivfvAkSRCPAMi8G9JLuxgSz5j+k/9BToLfIHZ79uXweDQyCx
-jiZGImuxjk1IjA/y4AEjhFqjfhuJ2AJeHmOXThsgueUuqNAMkRX69m6WtlDm
-lziC1loCv+DY5+NJTSqV0kwSdTDj0XYvhwwiuhJ014soUak6Zykhj9xuCqFQ
-a7jn9gxExyKMNZqfQ2axrNAdPMcZbSEA/WUOnDDhbVPBmE3fE3tEFmgtmmCB
-ez8CqmWtQ1r/V1D3yHDdIUpQK14Uw8Ut8lVjTxwgMamDGIMwcnWLzm+h31EF
-y0cLrh14wncX1L7VthorEcpQQUIfj28DQoXCkKOoKEauCObUwLOw+sq9b2oO
-jCeRZJgWyH8IH0YhtjsHPLcGd/DY0wURqshOn86y6UdifAkEDxLlpfTC5Cq3
-VE4kAwIp58gjiJUABZ11Xv/wzgX+JrODRsCf1he05ooIrVpQZ4MwTZgTvphp
-hRUQW1SN17cA/rQCO20mmpLcL1qIJSj0D5AIE3YrpEBMLUUIOUHMS799bvxF
-knUTwo2LIBWdcS1QCevLc2O83o5iuaiv8qTqFlUgLWc0KSEUuVBtDRXzqucS
-+s2g+beZZocExpxDX1YXWDZJaCGd7q33Eke28WIdRGZDuqUaVvG359aQziI9
-4shx99b+Z5+PZ9jFCD85WD5m3JwQMtdllWHFnNsc9BKCQrnCRejTNM8vK3rV
-rMvHj290LL1KlF1CdFyVaCBu1+F7a7V6wGnWOEll4JN6nGrPyS1AznZLRUa/
-N6eUswkpl26nozjcty5Oqvvv0jGvEkYsjPn2GMQmAlGR8DAhEW2agXXGdKiP
-+p373Q752bEePNR9N/J2G8A7Z80pSasbdNDP/WLaYHc0nerdbElHde/97SqW
-Q8tywco2u+ieBok5W9dsvt3dGLcFEAGLsvXJH9W/erlBzdldCSnM+3X1GGD2
-PSPQJxdQhj+t47bX7HBpnVCt1eog6zVGd0201mUbZsDoZIychazWPru9U7Ts
-NY9JwhMuVs53JafnaUBI8MHPRwBqc5hmp7ozzPgTlImG6ylLv99lG00k3O5G
-FsX9mXjiTp/cfPvh9QLC6ukenrcKoc77Ed782qmI142OzrhfxhrRDKfFH5/u
-tWbp5Sh3DTp8kT53PHh3fN2LO/EaI3vuuTRdd5LZHL+qjeHbs1M/8+ZbXvu+
-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
-Jqum7agNUdu+75W3vB8lwzNIx391lnjORZLDRRlsvkX+dQAt3h5io76pzSf5
-daTXt3IOx4GWzJziOtvlSSMngHb5PGfBY5VpIKHH0OQ9yJt7hOq6sSMEu2ZP
-6/viy4rxNkLkEuYvnue411P9qLcwTMrrR7urMZ0uSGeT405h5gi8TQx2fBqy
-ET+4V0AIlK7wITJI/bcL0G6ibyB+TJSZ+93rCHSLGFnAlF4YNFVbT9iP7DM2
-6/BXFHFBljV0L9xmKepo1GRHbv1WCN58/guv+Gs1bR9i5ZetpJnrMk0pcnzK
-wactz1vNfH3tlu+Y81Nlrn6gbGVp32ILm7zC24oiUm42/G+mksT3TFqX9HtQ
-sPwWexHBn2cis4A8j5qzg94g+v5ieFnLvbCqv3dqMTjHOuGHKTfz0ab4HMGX
-6PTkfgPSmVkpeDm4eoeoKeX8lTpQg6hWJwuRWjmPKz10jmLGcJqRvyRLTZkP
-mock9VSEdnf5II6mHqjDjqjmQMnvv46qN964o/7yCLN1KPC9pNet/YP9Ggks
-uBPZoVKxC/yfO9Q7Gy/IUZE1WMROpNQ8UYus5MtZUzeq/VD5Byxaalb26e5A
-brGZw4FloMTO0eJZO2mxCE+KotHuVlyezLd3dTe6Gmo7AWXUPM3JktmJbD+P
-V32k4z7gbtIaPWxLxMp9FTqQRr1uxbzNcGyESkg4Ht5/ubJ7AK0DTh4QTwDl
-NlIQa/vjXpmbLeLzjTzK9T+DKyKDEINiq9TWvc84cOR02I+pUNjRulwBTd9m
-qF7RPCgr4tHMlD8snd+F2qMdLFRGYYv/1AlLv6tzFy0clw4ui1z2cXql1PAl
-xManCOxYv7DWa2H1KChvmmZrL3xRaPfYurzM6aMGVz/3sQHshm/gGb1SB+hS
-Z94KusaSFzg8luECc0qKoa7ZAFMYc7AAWxMzzwU/dUKxr7lCkPb/EkCVWPH4
-yo1jg8EK+gH21zva2aK7R9xONyPjJVdjMCMNX7e37hKTvBYxSFGVTr7rZ25x
-1dkI7pbWTinvEcdXL3qaXfvOcl74sU5isKVKi5Pf22T+gLoa0vXCecIJ4CxN
-mX0q6ihaVSgoBL/cj+TFdyxVMFvbvKwRoMxoqzgO8wJHXgCkpq0VmGev0GAH
-vMnDd5MeXIvZeXOL5G4+b9SxvUMJjBw4AdDs/YdegjF9YvJyep5PeBjHXMBH
-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
-5wdrmw2fud9Ca3zmrk0zJfkIfLr/5mAh0Zf/ep3pwg6ts4/ilXCy3WeIfA8Z
-V9j9raLov29lHAme1jMgipb06pcI5DUIhi004Oa/LOMsCyM3vQcM/t5dKyrz
-5pWg3wrmluuDOBSyVbK7OMXsdqKAzEqWc9yj3FkylL7Jv4jwQXrQ3yYrDhge
-zrjVBpxKwPAEbwQnb2hAXhkTTZGV+on6lWMl3NaZ/icAbSsr1FTCy1AObmpy
-E5gHMnkC2EDFNVapSewzkT0JFXw45dbcH4FW1L7aMRfRnNQJjisfrlXT9dDP
-Rx1cLYLrEakpq/1vvee5WkdEM3qPmZRmi1wxGxZEjj0Prda4Tl2L/Ncbpi/m
-6HA3I2m6nM2ZceyPVk667p84OpClUykxknVsPMkm9o2yzOC//o7qpiu9cSHj
-kM7jy32lO4w11Q+1K2c/Tj/Pao6rX5P7OfjFKLGrYo0NNZ5k6eCWad7Fmfo8
-OGWWa/Tgg6uZ4rfqn2ONmatlJWtTrAcZAYsWb9a1yIRXeQ6vUpKz/aEF/prQ
-W42tw1tqY2+QopcjGkTvjmA3g5wGya+Lu5aAm5Xf7X0uOrh+CC88VpnZP3Q7
-5wm8tnVH16NjKmY8aRZ71W7r2vebAEx9WYGudoEKad4pye4vft3Dv7Xg+5qP
-gtdguFdAZP3+2LvzRq/vLdvJk4JrJgLNW5tqd7e/iWZ1xs9w1QCb3lvHQ0hj
-fb61pOnOq1j4hClPp1uHW+z9aOcqZfG8M42wqFTJWftGudq61DdpxRNPBELj
-8BWsBhmJOwET8i6t7+bDyCIeeU8PD9ML+ldm24NxAoE5gtkMjusr/D3xiapT
-wa9RWK0zW1/UGNg5CP1sAEq2IdmMGZlbwfmSez1gsGRYOQt6c9cy/Idv49yy
-hRObu8PBfnwJy1fnGd7WFAginYbR7S9fL/ZKy9+vXg6R/vf9GRs6BvYn2Ktm
-N31gFdVR5yD1UHX+/YePT9q6GaQz0MrC1XDeKeLHIAkCo8zT5qacSr/wC2vu
-R8EvNx5Vv/2S2JoFWmCvf2Cy5lGXXgMNr+l/uNFhSkbp64pHrTOk/ePS4tgg
-jsPjpOs9wV8aHxR41AvIhH8D9FjBwwzBJW0VTo3OFRFSF5Lv58wMKn99fEEB
-A20x9K17EqSz9O4z1HZvsqZKY7NHG8OM2mf97mYYnZ2u+KWrpuiD1bknJcTS
-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
-V58l7axpbKc0dmQDW0xqqWp63dQTCLzM37ojcu9Z4nhk95mlX+f1piT7Hzos
-vg3s/fjULmkoelpMMJbj+Ve+HpHtj71LV8JXS/ahtbJdPPFOteEJygBU2cgd
-sExurQNBKH4xzp88nqdPu4+8B24rdRzSJ65j/HmrjlD1xL9E3uT8K20jQlqV
-+9v7x/+Y5FQzlXI9cAQbRhbzcl0bV9uh/Zr/wtWnC6SZv1FgdDuf62L7emMt
-lcX4nkVhAJVXUZSf6zmaSQwwlJ41prVNU+8jwMMeW6Y80XXf2ND+zLdjNGXk
-eJst1NVrrZjrQdgJQWabLomN/saOV//GduPkk+UbY6HtlWv88WCeZ1d+9u5v
-OTbmqu/EmX378vn2bybrGw48F0xabI4n/YlzOgQNH/krRGY1ezL81mR4w8SM
-xR4D1/7KLy6Ps9Lb+yfRUNvwyp+xwSfOre0OmDz0/cdO7vJreZWqoI9pG7PP
-gA0VrT4VVJUr15cJT5DaMZw6u8vMHvwnIX/uouhjTlzIio3k1pvPV0M7ziSF
-F7mLiw/CvlY+vJNxv3Rb/SniqeWD76K7l3oiqPyrWylisfmlXwms7Q2Y9Aq5
-ao1ZoDKIn/BrWfjykyvrW1il5I7ZlJLed/Hjm+PfqJUT2hxQOfGAmyYqY+e3
-wfsWHlM24BGC3e6TV0pv/6noKUw/BL32uTJ+8rPvc9RUltPgVO6dFTzjfp+p
-LcGV+qRKl2fH8tYByCl/JX+NIMGyf1ps+8oNsy5xFyeJnmeCwsrvGsbqauNg
-teVVn2145gmu7kNZvfubgB0ha/yJ7RGfyziZu/c+z22+SNpBUU8w3301d7AF
-2NFw9XHLi/CZJrqfywCpep2j2rC3F9dNo6QVh6DjnEmRgDPvS3VK1Dvqoa8P
-b9ygayQvq+bvuteHa/Zee9AABtG5JOrN4WmWNJvSzf86Q93zWiO9fnGu3+qg
-mRZ0sOw2TRnlS59fvO+U6762Rgr3crt3x+7z7cvhLOdKO4dxeNqvzW0JbBqI
-kNgEgiJyFd9S3bnlHpnYAMC6xNfA8NlgZlhZzd7j1it9CMEzRFewaPJJxwY8
-znuYjDnBfOGNVFyQXTHljUnLNdYI5q1whsJxAKP3pVef0v5acvycXmhjR+mP
-rPvrPrVx2hMj17yLasYfPKR3V72u8jtSOl4YuM0ldpELb07ea+12DEd367Hs
-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
-6rnV7x54cTsOdgjiDmzDiLPFYu5EtJqvpAxnvJ9XWJRgd5sxXP2RkSMS9O6R
-7btSBtxq/vEldHHL61ceVGG35R8uDcug0z59t0g6bxz3CEuqwT3ZjMvpkctz
-8EWTqgMFicoSfHHtHWutGfG3u3JRcr9doTr93AqcX3vC4R65Oz6ro63beTyv
-GwbJ7VU11QY/Kal3j89slDS68V7Tp3T1TFSKJl1Ln66Xa7FVbHyw0TUjIW8v
-KfHEYaxYMEbnzNfvEvz7zPgdL4t3Q74WLhgYsuS60J8gbQlPj+F9nlKz5zta
-Jg1PH1sovlbJR8Wf2LXTWEu42CDhfjI+ucSkYly+s+XKdoh6//rwRyc9ZnfZ
-1HT0IuT5W/93ATzo0fene0oeZ9x0iVCYO/C5PEg9vdPse/XU98f/RD7MQCS/
-UPko8THyKnOnHj+bohCM7daN6jqp76OHIO1m7bCTYU9adiyA7OXONhZA/3MI
-+rpqsR6DeQvLR1BhP3yrL303/h18O6moTm1qlIvDbfULZvWFG5aBW8NlMdTj
-8tmykL2plYdU6KrXQ5TpWtTH05zN2p3fy6s8pxsiTa7IcBZL/mZZQQl4+da+
-e64eLhSi+WbtbTnGO9xP+669jFSM+kRazuyzxuZDEIviY/vwm/T+ySfHA6KX
-cCs3nx5zrRh5Poj7XS6y7/R6IGAhmDV72ehRUvC9h95fEosX7GZbULaXLBw7
-JSZNf2kLrGFtuAzvraPNas4db5LxnPQeOL9hHcQwen4agJ0Q5ucmL/Swm6st
-v2zH0WYfb9S8CQ5VGIFrhS6dX1N9K3zJdGozPFacf2hTY5Otln5YRXXOW4Y9
-n+TxPuzkgiNb34X53VNJ2S9qIVKuN38fghwrN/jfZqa6bSOuXPdEy/Io64iI
-2vVkUJnWJmI2o1/mqooZuL1uf9r2dFNdeyi1/iWH1Ubfhlc09VjNan18TQL1
-0q9lO55fe4976LZn680N/vFrDtHeeYKZXj+V0CbhMlggAVPsrxiWmLq65hS4
-8WLhl/D5wvXQyoi14Q62JZ17dkqts3fivB1iJukOPAhrh6DWsxzz43zVg2V0
-r6sj1WRPqfvkZeksqc2w9Et+xtcMnMFJ8Co8e21/IuNaSMBLGUTN8IrfVe3A
-EStzHe3JN+dc2JYWNp9lJEyg9N58yMjtvb+jU+J4LUS3Qi3yjfh83zs/js4d
-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
-z4u7Ec8KQM+UQBvlbAOb4Y+DL+XyxQuz616AVBS6Hptk55reehndil5pF0kI
-7j9/VZrltlBn3h5cKnzlGVrRcXr7LbZv86c39vp0DiGdKTn6AnMP9bxTmPaC
-Q9LOzrtDUF9MKKfeZyrfTBh0Vby2JOTywGath9PQcZjiyezOD3yvA5ccuyIe
-rgb3n51WtZQe/MdYklO9WOVW5a3FjGGBGqsxAm+WbAZ/wimJJtMmvZigY7hr
-HWKCobih32IGp3q+WpSeDG965Z5/N2T4yxL1dDaEKuF+c/2WJMubg/01bMcO
-uydX1C01kbrySrW0qnBOpnCHYWWA0Q135inXmIWgSv+ofj3W3ujP/DqR8b7n
-Yzx6fteqPub1bSyYhdknMj4/uLvhZh02/lq7TLeu9ldYA3dlrr402xOXJAOW
-3t8vy6fa57aSIjYeZRj4N/E82nTk8NjJb10LTPqnmjKrjvWFVoUf/+nRsazN
-vKbVYmCvw0SF3v6SE7KUGJp113325WCknMjv3FsdY0gFG0YLN1GBGj8j8Son
-m99lKzFbE647QXiFeOV3E717/+QvOXrq8u+MtmduDQSW2/4TdXaKXaxiOEJd
-aLPca2Djy8Yem4dWYIsh/Wn3BiwTo0UIxVH/GMXTxmduIgHxUFdqYVhNOf91
-VpriUpwG1W9l6IR9L6n5/HN801pUfHG8C7ZpbS7ijvYtAhtG5ENV/C/s3XMX
-dkM5gkLLI3UhO/5yryiVkLy+VAHeeLqfLF3P8ttID9JTyX5iayO/KT/I2epP
-Hf+c9JcKcioWZF70+Kp9Tu5xKy7ETqRuMJLh11IO6/pZ1hChOuERjzD5eoEA
-ugdRfCf3J1ev1M5Q6lOc5eEMWJvxfGXbpNN3FHvFd3qnl0ZNl0M0SBpXVjpX
-hGw+0amDQoPKbOLC2V7U6dxiPPjuoVsszXQzxFllHr87dK1tIi5Menj/Cub5
-PElUn7dkQpbyQjBPT/PT1RMzkpPuEOWB7UdU8IUh9G3LC/hn6LwFUUtN9V3W
-nOvBw+k7Z612Mu9MQ4hrHD+RC4X2n6w+mKnPCIpXLqo7nwumWO9yjYdzv5yq
-EtxfPP4UqXrLFcSeagOyywh83qyrpnuyZkhb7eW5F9/Vvv5IjsgSbOox8lkP
-lJnOfKhf+XnTDzu6k5SdHM74bOdyGco1c/zGziXTcqp2/Xia+B3eoCtfdX8p
-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
-TETkCh8/37knZj6rFfMJxandpq5ecjtEkaNsPwD5YZv3rEnyd+zEPSUuDdIc
-yUw27tjYz/PxJYVdxEKDPaPY37sjC80TdKfueti4yYN+yuspP9wVvnBbSg8d
-Uo9Iy8G9mXfZeVpXds5Y9RDkhtpOG6nmf2xoz6V8dZ9yTvG9HPMA37x14YxW
-tVjzs/fFX+LGtlwnlrA9RN1b1WOx7c9s3zbKiLRc0rWJ+0eNh2fW87bST3fY
-6t1WaQcr8GmfHwqrHiVm4KhnEYxd+J5P2fB21pwLQdcM5R6XFMuJnS3NFo92
-x2l9kQfFE60VzmsLeEqOpH3k1muJh3uV+f4RCUapy0UZ2UkH2zvznyN4YbxK
-Da36pQZ+in8Fc3w9lrhxIGL+2KIy8PqxM2bfP0/JsghuFR8/1+b8PK3rkV2p
-wrrOJ48VDvTExzmt13rb6esXUc0Z9NPQT6kqHfcEK2RrlO4VJ57zMW30AXmb
-tZu97fcQQst/sLFifz7GyZY9ajZ6snk7iJBtGLMZWG6eryzgprFsz/JVTBOZ
-+ece5l5xSUMFAuPDOdOyRVmk/2N25a5+p/fKBddV35uXAoszePdfJaxyTV1V
-E6nJc7fkxuNEBZzx8c/FCM72ge4UjvPLqj+uab3psbrVPtmVKp3vlt7ZI634
-e9jym+q9INjmbV6d+buX0Mdd5J+P2GfZ7qDHdbR+ut6UGZQIftbAHnPCpfd0
-SmSkyFsj39pt15yBe2xPZvNf29tff3HHfiLrE7U50vfSQJMuQrDj/sXnbIzk
-AcZn0eQz/XZmk7YOUYysx6/gNexyMhV3v30c8HUjV405964IVrzffDbUwF9Z
-OThha6TrwWttYzk0n6ZTY9s7Wl3YfMe54c2llavbyn4SnPbumTy96rMq7Q41
-A5QlG1Wr3HglbzuL5T+mTDkaIiU/hra+iQXjrs6/VV/hJvgL0w0MrLxqw3wb
-TNm5p2NjPtA29blQP16Up903gH/NRjrT6KQ44cIHgw76eDrb+ZeuuzK34tOd
-qgPqe4KHW8y87p4SOJFbHOF68uKeFZOCx8KZ3xYNdGXwrwyiSHa1crR7OiK+
-4qL4io/mgFHsKKKqVn/d3Hhmg1Dbf71qcKreKaSrQ4CJ/JjP4T5Shjd6rbjr
-rdxoz/7wb/Vebja95Yf4+shUneorw3qZfE+9MTd0n98Sz6+5xMuU8tusafv8
-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
-jDvpM/EO+ZGg5pjlSNMgnNxTnFOe1Zxf5FbATcHYrR2Oxwm6a8WO/C59QY0k
-oPno5b2PIP82vc3RJC5F444uC8XKHj5AHVlkKZ5DrDiYiDCRhiU5MYOcM1Cm
-oDiAeGt3t/A9Pl0RLVnkxx2p/xy0uPu7nT205W9tX/i3ceWrh781ISrKprPA
-a1M+kdor/OXsl7Rs1t82+aEiHpz/ohs7sM/juO5Xe6d6WX0aaWEOMzwlp42w
-vJwpzzZ34S0BRRZ4WtwKApEsApE6wnO8AtIkB1B44r4Azts8Dk1QJm994ns2
-l1NL28uugqvTV33OCUj/a4MnTywp7zDnqAmTIVNmipPdAqIQd5WqdbOt9oQv
-VcBBZWxTfM5j4EK3KEACT+Dgd9mBC+7H8fGFuMRnaCrcSFIFHq95HcANcVKb
-UlzpnCGWY7yaNbDVFrIfqRsbSrU/u4n9HKykaB+mgEoJbQfy0ucGYSE5mT/R
-XP4rY62nDU5q0BMbFD8ExU5oBW6oEOSEIX3MZIhb5yC+Z7k8sRKC91u0J/kH
-nKUWHj5+XRxbrNyLdMntiCvx7XKT5+8j/MY7mlPASDtfWFqr83C7F9c/bUmj
-OwZwKmGNERVA0RdrdwQdCRUNRQFTEnFIWTJkF1mJBF/irIXY+16ACksxca8e
-hWfHwyeuZ1/PR8wjvA9dcr4uonz8O/jT2voFer3ZOwWTXxxvzbZDqkFFesEx
-W2BTXTMXJsCvT1A8V1kl59/x7lzC2588nW+zQi0hKqr6o6LinGESl8RwSmxa
-4QejByc1jn/9lIwxY+Up3Nt5unqUSvpZTKVrY1A0B4yIomLDBpdIXgUvLnb3
-PAV1PF5/7PUnGnRqxaUqNfBionKf/ZbUh30NRyfzubMmnxcjm+K3o47wyiPF
-UBmHFd/e/F4Wzem5v+7WhysVPpq6/75pGRjbDpTAcdSx9KZI5lLCbwF7WDmV
-JVX8r7wT+NcEpWFbgpOUhNYAXSpyiCgCJ43Z0r/d7naLQpY7Y583yjtU2P7D
-Dx0/yZC7Bq9uzj3MoRil3+I+y5Y38rqU8Z1E47N/j/f61mXt/yaBEzy54sf4
-+QjxPZwmcj4xTW9m0kmiMDnTdwc+idlIZMURvBsy/1xMWrE+kWI8ohZfgsmM
-eBuvs5xXYCHHMV66aSN14wTVIp1/4ipnn7PlpjZWhp7RHPhT2CL2g2xjA0CK
-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
-VGoLt4KPMgXRKZUhHJ+onsqCfaIi5BidXVwkvzZeRwPNjV2WFgwLhWhiqLth
-CBVpUxF7568L422TzWpKjTICXx9zJu3jDohM+oQs3DwSnMM7xNvgKSl12Kmm
-xi5ham5qWZr/eCV4kx19qFBzc43D01dJv0vmKFyB821ziovHCTcZqDc1Syhl
-aOOrOtjlfzEh6/Re0DBQ1lyQQ5dOh2v9jkiQ1JXib7wI1BdPx8WRzgfK1xvT
-B192y+JJM+E35SJrQ7iY0cDuLSN+31oTGxfi6Z741maaI6nIN7otu2r06trS
-dr+y4Ps6YS6klokQkH4IHRIMvUKLQq7mpBSTU8Ni0KiOVmf8Ri9dvu9SDLka
-Py4SNTa8kX39ffemlHBq0yZI6voA6nnNh7I/+d7OmtJ/21amvDnbfNydvPM7
-2zAM9Lzte45JMua1IbEuCzmCXo02JS2texWLZL9svIZGcvtCUkYYTAyv1+hh
-4S7jzKvedcDNElhoFiyBOU5wZrGwatjcMLa2H1Osqn7d0WvcsKZlKc1X8SS4
-0gwoNDuDy+6kVNTgYsufpIyt8JR3EZIaxnyXKZIcku2IDe9eMbnxawpA3d4V
-/5loELoxd1oVdzapTD9hVBuF9hhAsTAz+8ghx0PI/zJzFJ3cjTPfzStgyF3E
-gmNt2zXkl3lJe0ePeW9WU1/f9Pg44tBmJtXZf8t+3oC5j4BU6pgyPn/m01sr
-l9bXbXqg5quRrX8b3Qec8JEJyfYBSmVnfsomHQGNHQedxkpJsMTRa3r4KmVy
-Sp9tZ8prLfhITsV+ZDHJNxgUraLZMMXEykFQlKNmQ2MTvHbUFZSk5iPGflAp
-y2/BrrXeER8/PDwIs04YTBTJJt139b3e6dXodAc+5NzYy6RJkZAknEu4egUp
-r7VcwweVIjxV8xI3O4/PpQ0NSfr7ibcsF/qcddC719ax6DmnK92hXzBKBMjn
-3do1W7KJ/Ls9pGlaXfSsoVF+HEsV1sCl/i4BxitG1LdcWD+Rv0NhoCSR0Bei
-EqPNFZf6wgWDUUFvW94NeOwllZDwDfUJq3QozyKaxsD29pkDoi8HqkcccPml
-p8iBq6bz/wcFooEREudRok/84f/bBzc2DAGdDGOUfdpU2IY/H1ua/QmhLJpP
-smLj8o9yHOQLSmUPcsHEFMzHyCqqb9GDhMr+MU4Cz85/WahDNTbJYr9RKcAM
-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
-qwOwvf81HwPDedA/KcQ6OookRHvto6J+L6E00RM3GLNaEXihrOJ+R9laSC1t
-08kYfVuys4vP+OGh1cGsZ6w0xj8I/XPe9t1d0vPzo0gF+i9l/ELK1154E6QF
-TjdIDhFtOv6ya1gwGiddpS1a5nc6+aAl3hiVtCLA5wxlIYHCv1AY/VJCtjo/
-ScTjLKOviOdCqzAmZ3ChWFyqZlkBh/u56X9TCQIVeXFVvR7iRkpdFx1/KgGf
-gF6ew28yLphZ3WVPP4OLMdvzcspoeQPLymjKMCqtG3KcCUTmmjwAqcTETLjI
-qRPmslTfGBgYON/nqwM5+WO4uDkpR2Z7FL/ftXAYvwLJoxI3S/QYREL/ndLH
-EvPlLR7X6oc55iyk9VqGOyueSWfxeYeqMws81wts3c4D/N+9uwc8uHeOts0O
-4o6COScP9ihcwEoLyJC8Qe6A22nOr1QuhaYnM6gP3xTMiNbT5CkWes1gSF77
-qN9P+vy9H58/Yv713Yb59iMEz+6rv1wawINvXg4fux+GPa+FgJHIwtyYxEY6
-wZXTXWJG8evkF5Y0xEyccl/pEatV/PY73+V8Onf+qzITr7pH9YslOTeAJVJc
-9Ir+TYnBQrezoPSxcOhnoPpFYrLA7rP962a1jwr/81eWJ5Q6NOGXedRbj5PY
-ClsBy2NEnfOZP+gIAc1yhpgIAeAjoSVLPbT2QSXRNbPqQ7q+HasVWAsi7llW
-teg4/Mr6ix/aYd++rNn2CIfXTOtI1C7PkmST8unqd/zbPcA8h4lmfihDZAZo
-16zZifSLECqxu8I729KXT+Cb8IWFfaAXkVMLvOlp/g5eUO+mkCbR6k+hi5Xj
-2y+PnlgPXFZp/AUT3TNKeATrzvwH1wXJFHyrG2sOnn5CZhjbrBTn93HwHbZW
-sl89tllzXVAstuYU+PfrFbo3CTZ8Bneas5xcXPrvu+7bfe7b/dOnuh4CFzWS
-K5qFhtNMeWA7yYrDqDt8LgkPPXGnomMUOPm4zTXOSP5ENX9cWXJSlLSFsCkq
-RPlS4AxmiIkB9hqusHu6Ka7OnTeUeCKzY8asW3ikfvWQqdsv0Ro9RpLgfVdI
-DQQHUww9fM914vCQ5j5q8+fK+T1SmEjX66l9mKMONW2WLFXForXf45hBHeTU
-42oXYe4QXFamWamOmmqJmq6W9IFSONUGzs0tOxcP4cu9zK56KnbWYFDtoDIY
-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
-l0JTNFglsEVrFMYq5kn+zpPZ2NZ/+8lDcQKPUtN3p4eFgDslam5UQeWaeNEK
-YywpR1LMkhIvCqXi+ZRVnzqUonmcZrQy9ENHSqLGGaMYuoYlBWx2+JwIJ0Rq
-TqgiHJegCsN6lBRUHZSNrnUPWRJDS1pQWWFUwhaLM/KA894Tgsc0Ek3XxuAQ
-D45KiZASeE9ZZg5+wcdMO/aQn6IvRc1rreN++yhRdgWrzYa2T3KTLln4RQgJ
-+VTBkYASAin56ttTZKWpOyRMlPWAvEwi2+cQCX6GnGnalkYZrJGuvBAOtJ0A
-CZWVz9BuOnJcJPpvrSie8zzz+Cin8tV64OrigidX1zxu7zFKo4whx4CuKxh0
-h1Ka/f5YvUYLL158x4vvXrK5eof1+gJj77l69pzjMvPq7o6YxMQ9HSQdeH2z
-Ik7Sc9j2Hd1qZFitiCWzBC89hLUG6HK9wXYtSeuqnlR4bi6CzaBIVVBI6CzG
-/LTMzPvdWa3MNfThupZuPdKtRhKKcHo4NS1NsULFD5mSCo/3D5gGxrbBq3zm
-zDkFfWNoVMEhCpMPE9UII+9nDPJA1QJwjEVQFyGnc3ed+LxkqI5KyXpczhZk
-BTlkYvUOnRKyPkXy0lJiT0h1GFcyhDpBcNM2hl43bOdZDmzGsRpGdAE/L2zz
-A7ZpsFpznGdiVTNca2msQ/cDTdfWnzcQq2k+zR7rNF0n74mplP6QAq2xlKzk
-PbUKWWiLbbR3lkARhZVCVgVbMTFd24jKrCDUwVhrjSly35iPW5xr6YYBo2Do
-GlarEeNa+r7n66+/xs8z6/UaYuZ4PNI3PdYZttsHhq5jtRIvpdWadlixGjfY
-fGSzWXGrTrVhlRqfEhZNDB5rm2obqPd+DKBISQ4nKSU5H2orYNhc72Fay30u
-FayzWO1E9aaCw+oGwFo+MvALOXwnKOGjXD18JRzR4SCTfcokZHAuRmO0JWtF
-owRNoQukCpjOqn5+gL1EEum7BteN9OPql8p1H6lqVP+nH/4z9f0g9f31B18/
-vfk5v9p/Keu6LB4mYzSlAuxKkS83Csq5Db2cn+tyEhAlKZdyRifYkymdam6p
-kQ6l9fnEpbWmnE6a1ZQuw0jhOB0pdqiwu4mmFeWgG3rG9QptAk+f3vD4+Mhy
-mHln85yYAzEG1us1pRwJIbAZN+x2B0qB6biglcUYS05BSmhjYdofiPtFqMox
-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
-1opPXr8m6kzo9qQYaV1FZQ0lBpgC2xcvROnsjkyPrkjWsjCaReNxBmIYiMUS
-c086JpYxMOUF/RS4v78nlszFxQXVQkjfjfMypNfpyyLyOM79c1KzM83/rrUm
-U/B1RbNosdrI5zgXrPV47zl0A95LsvZ4PAo0dbPl/v6eL774gkXdcHV1RVsJ
-zHPVrlitVsQp8IsPPuTqes3z588pRfHq1Su8r6hrz3Z3pD8O9EMgK0/Ili4o
-LBVJG4YMsVgaJ0DgFEVNLgVMBqXnz5yWkvc5KoMucj/QxaGBmDIQT8MRaFGQ
-52BTjkHCCbPCPptQZ1xPPt2/ilJkbaAYgtIkA0U7tKvRrgIjVH6F/dFl+84P
-MnOJw1eK1FePX+XjYvFc3R8+kjLT5LElYQzUVQVpEmhfLid6d6aQ1ZcFsEKf
-1qiYKSnPEf9Zuj1lJpywVHQ5XRSV/nKdEuNEmCTmbq3Dty3jNPH86RM+eXPg
-8mLF7/z2b/E//S//ByjD737/u3z8yf/M3evXnC2WPHn2nOuLc6ZQiP2EmZOE
-b168JM0nN28d6+US6z33t3fYlRe2yySqjipgncYh66EHjIPs8OehT7jhqAIe
-5t95mn9HGUAfFJWHlKIymhwz1kg9jHWOBISSiUlOU97708ky5gwZ7vdHlssl
-TdPQeJHwnXNyIj4eiWnCVRVNs5gvzFpOuGEiDWLSjCXhdMF7T123J+PusT+w
-2d//UodZOknlD8Oy1vp0UZc/X5/+H2MMxxBQxmCWHmc0OUTGcSDESEmRMKsD
-lbE4X1PQUnqcswx4ZSKVgiZJwrBoXJE1qVaFcb/nADTNQlYXTSPPZQgSzT8O
-OGuofYWrG4rWTCExDhNhnNBYiJliFM1ywVl1gVKi8A29pDedc1jvUTnJanRW
-TR5WmsdujzGGd975OloVbm7eSFFyiZKoWiyZYqIbJi4urri+XGPUxOs3e1zd
-cOg2GFfRLpZMIZGLQZmKbgoobecbh6TttAHvPb6paRYt2+1GALdKPnvjKKkz
-Xau5UFwT5M1GSgImdMayPltzeb7m448/PvlVjNLUvqL2D6vaiHIVaOG8eSsJ
-qJIjKheMhhITQ7dlu71n6I9471iul6fmgKuLS2KayAmMVfOwlximjmma6I6H
-uVpFUdeVDOYPq2qlqdslITInHCM6Zez8PrPeoftRYK0z2gElGASVCtko0ryu
-LQVCks+bClpWSTHimyU5RKb5GqaRapXaW5TxPP3ac4pW3L++YX/fUaxHlUSc
-AsTEarnk0A90d7eE4Qjeszw/k3+coc+QlULPfraSJ6xZ0laesa25vX0jBdBe
-VO6SJBiRo3zWqtqhrUWXiLFW1KRJ8ADWaoZhgqJw1qOtJfYTXd9j1ERdt1Iv
-03UzoqGTHkonXX1tK8PXg/G9OxyFXH/sMErjbcWTR09w2vDRRx9xf3vHsyeP
-aCvHm5ef0HcT7foC36wZkmI/RGptUVlQBdYtiUrobvIeFuCymVdyxnjh4T2k
-mHOhaGEDFqVJoaBMlg6Z2fMkn/vZ8zWDSpWW4V7iJFH8kwhs92HYlJS3JitD
-MppYHNpVsoJUjoL7USz8oKD41q+ZofzXZpD62e1P/h9brH8Vf+b/7vGti3/G
-nx4/xnuvdK5KmQbxTaQEM22Yk0dqHqhKxlh98j4B5JRQZPlAa+G1pPglhNLM
-fV4pTYQ4lxkre+qpy3OHnPSfOcIEuSTqypKd5Z2vP+Otp9cc97cYvsFv/eZ3
-+Nn7H/PBX/0ty2rBt771HsY1XK7OeXz9hA9+8RFT1/Pq88/pVisuH13TNBWb
-7R5FZtHW5KIYNKdyZe8tTmlRnBRYPLaaGUuzoVrnjDOGpIwk8LKYomsnxOwH
-jk8IwkMyrqJyHuc9VdvIDTAGSnHo2p2GlJyzlDDPg4qtG0xVo5wXb1RV4aqK
-rEcYRvyDn8k3p/XbMAzEKIC6Z8+fC1ZgPtHLDRvQ5eQFmmbekHnoBZsNwc45
-8VUcDhSlWKxWVFVF18mqqKoquqETZc85coFpCiSlce2CpvaolAnjIER7bXDN
-klY5SgoYnRlv92IaTpCzcGAU4NGgNVNMTN0RlQu+qVHWEVKiD5FQoHhPtpZY
-BApI0WQl6pP1CpLCaSk4bmphCZUUiVGKc42Z+VMhkCgzmV+fno8yn6bruma1
-WtF3e3a7DSVnFouG8/NLVqsVYYzUbcP68oqmthw2N/i6IaZCyordvuP511t2
-x4Gb+x3XT59zc3NAO0cqiKl6xhv4qjoxyUIIKGcYo9C5JR6fZvXIypooTydM
-BrlQCMIkioGh7ygpC/gVoYpLF6HwmB7WeVZrgVUGeb5ziHit6LuOEEaYJpwS
-FtKqaUFLF93p5yQRppHpl0p9xbzforT8vHUzD3AhknNBGy/VIUbjtMXPSStX
-C0jSekdRR2FcPUgdICu7UvBTIE8Z50WtU1Gw60VZMpqiHP0gQ5yyFU57cgqM
-MTHsB0I+8uzdt6nblhILaUp4X1GSeA5LyqzsiqpysjqcRvrdntj3Apt1DnyD
-axYCsi3QKMXSe7SvsEZRWUNbefG+Bel+1EpCBWMc0UkUOhngE0VL1VPK4Iyl
-qu1Mep+bI4wjownxoTcynlbuRXECzT7UZu03W4FXpozVhjEM7Lqey/Nzvvbs
-LRpf8eLzlxwOB87P15ydnbG9v+Pufk8aR77x7Dm2XbM5jpQUWFaKzkLjNOvW
-QwjiQUKgzLpEUinElLAz3+nBW6uNki1EiUJ6Z14DKunFM0qhVEYb8UFJmXBG
-I80OWQFJzZXxM0pGa1nzKgMYYlYE5Si2QlUtOVt1vnz31y6N92s3SP3s9if/
-Wf/+9+9/wnsXv8f/9osflmerr6td92kxxhBmz4zNGV0i5CJwMzOTa7OkxnKW
-Nd6XN+b5BVJyI6JoUpqIM6VbazuX80KYknS/qSSyNYWiMswfmpgTTdPy0cvP
-uXz8Dn02UCL/xT/9Ph989Dkfvv83HPYFh2a/2fLTf/vv2N5u+f1//l/y3W+9
-x+HYc7E6559+/7f56KOP2Ox3rFYr9scdXmV+73d/m6wtMRW6ruOw21OSXPSJ
-gSFNoITO7pXc4KdjT+j7Wbly5DgRw0RMiewd1lUzY0uUjSlFnLc471BaYys/
-m7gfnjeNq2qW7QJbecauJzJIuamxXFxeo52lxEQ3jRSE/K60xVhP29an1N4w
-DHMFQ8S5Cl9XvPutbxJjZLvdcXN3y9AfTgrUlCJXD8DO+KUp/gEu+lBxMk2i
-tj1cnEMQ5UNbw+WTR7OxdKI7HDlMAzFnzpcr1udnlJgYj4dTrUplHX13YHe/
-Yex3KGuEkzUP6mLW14gmlWi9J6ZMDAHjHVobSQN2I2OOLFcrYskMKZKPWfhA
-rqKqGkxrGI4di8WSVVPLemq3Yew73KxuHYdehpMQUNaBdV+WT6dAKZ6mqbBW
-s9ttGIcjdeOl4Hc2+1dVRUngXY3znr7rGUPk8vqabhgoaG5u78lKc+wmbjdb
-vve9b/Hqzd/KEFogW3BlVgGdeHtClloihaAxUIEQ5bUwSmONJqcEJWG1BD1S
-gjCNbDf3jF3HfrvDG42fQaQKQW9oq7GuYnxQH4sgDsIUGI8daRwISnPYbVi2
-Cy6Xa2KemWFBfHRWG3IQJk9KmXEUL9zDSriqGjmAlSBhgORk0C0a5zy+admP
-I5X3VFWNc3YOqoha2c+dckpJ6W3OwqzzxlCUQik/c5TEg+RCRZkTqsYYikJU
-v8LMlxI0gHUe4y21Lrz84hXP3noLbyva1ZpF3RCnQDeMqFz4aF6PXVxcYJQh
-TGJEtyXLe6VZUq0SWCF9DznT+wpdOfq+p7KGMBzZHztyTGhVaKuaXCIpqNNn
-7n67IRZhoY3TxP54YBmFDTcMA3ruFAXop0AKQq9frVanqP9DWnEcJHiiZx/Z
-zes3hHHifL3GGcM0DBilWZ1f0HdbvvjiC64vLnnvm+8R48TLl6+5udtQW0W1
-WBOz4c2mY6cj68bRWFjUllBazhYWpwtOF7ROKAI6B3QSz2tdzXYOLXw96V2V
-xgJKkaFaPm2na48o+KDQs21E7iW6iKJVUpnN4gq0I5csSnfRBBxJWTAV2tY/
-+r1nP/hqWvp1GKTu+hflsnmm/r/8uV+FUe69C1G1/uW7P1B/8skfy84bTxhm
-eFlOqCxE35STXEgmaTlfti1p6gXUVtSJjVI7+feu67BmHiysIcRIHMX8q62n
-amAqo1z8HtQoo4k5MYWROEXOrxdcPbpke9gyFsezZ484u7oiZdjtP2B7e0Nt
-W9z6jP3uyH/405/yyQef8u3v/CbvfPNbxJBpFi3f/sY36UcxTvvmG/R9z+v7
-W+p2DUazWLxNHCc+/PBDXr58SQ4Ri4AzDUrWmVOghECeAmEc6WKgqZwYvK3w
-k6ZJaM1q/p3lomCF1Gs1RSmmmOQkGYJ4ZoxjmCIlxLmrzxETOF/z6PET7rcb
-jK1oVmtu39xws/mc58/e4rvf/y0++eQTdntJYslN2FN5T121rFYrjDHsDntC
-Cuy7AyXD5dnlTDcuHA6HkwfjwTeltab6JTDoWTrHe8/Vo2tKKewOewgKZQ3j
-NMnvqQxFG0nNeVDOUrTBNsLG0UphqxpjHZWChdKUDTiTSWNHmCZKSKQiaUBr
-hEIeY5o9ROJFs0YGm5QS/XHiMPY0iyWrdilq3jDN5mNH5WsYNEnDYewpMaCt
-FTUlBEl5KiPVMDETQmDRLlhfXpA0bPd7jn3H86+/JUb1N69YNJKSKkkUKOdk
-6Pzwi1+w8DVPri65O8qwGoJ0NX7x4hVDkA64s4tL3nr+Drd3O+p2SURhtBjh
-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
-aa6cJT2ljWOcplPk2RjDarWiqmtubm7IQSCT++7AW197ToyR49AzhonFWnxQ
-OWc2+x3GO9QMBt3sd+x2O7aHPd57qrrmOHSkEME6mqYhz11cD52NEUW7PsPP
-a57tUYaUytZEbVF1S0XB1kvIhQpFilGSklNkfzzK+65kosrEEqmbLKpHW7Mc
-pfNMlQTJCI/GzApTjjRNQ0wJbQ3NeolOCXt0RCdMInnPZUnxeUtRonzoylHV
-Fd7LazZN0zykrjBGk5NU6oyDGHyXyyVnZ6u/46lqKnXyrzR1OyuXakZZBHyz
-mhOZavalyUndOhk6rNKkIBiQMK8fSXIzEN9JocRAGGWwclqqN4axJ0wjlXUs
-m5YBWdOTkxCgVUGrgteKLgRBd+REtz8wDQPLpmHVykBrjCAX4ihpqlSgxMw0
-RqZJEldNvaBaVydFc7fbzdH+ihgDpWSM07hKDgc6SLI1lRHrAwUZhKcQhK4/
-m/2VEUK70gVtLJ4Hqnkv6tXU0feJRd3SLFaszpZUzQKlDd0wst93tIsK5wWE
-G2IglYjTDmMsTVWxvdmwWi3QylEva6qqJhlNju6khHitUU1mso6w7zl0A/2c
-zrXeSWVczqRhhnoej/TbPa6tWZytqdqG1eU5Z5cXLNqWuq3ZpIndviMMCWUt
-OUg4QkzTai66AaMFK5NClPel1nMxeiEOIx/97GcYNXfcTRML53h8fi7QT+f4
-8OcfMA4d9zeZ425LnFOf6/WapvIsa4/Xis8/+ZQ//bOf8tknn1AvFpydn4ty
-PgWuTAXecHt/z91mR1aGJ9fXXD79JofY8/KzOz55teXdrz/jG197xLpu0ER2
-Y4Zs8crgjdg5SurnRDQUZYgpy6Hayj1EzVBPpQwpFiiCMhETmkbP95GSBbwb
-lQVbY52nGE9CEwsnAeKv735CVmUm98nj6qsh6h/nIPX3h6gff/rHXC/e5r3L
-P+DffvbHXLVvQ4H3fkmd+v2v/6tfSXTzUfu109fX7dsc+s/+8KFRTynpeQpD
-h85fGvy01sRSyCnRh2Fuh5eWbYpGqYgxDm08OYvvSVuFwc2rLkOemT1aWUIR
-yTYnUaMEyKcpWeObJWMJxKjJCaZp5HAcGCMYf8Y/+Z3fpugF9WLJm9d37I4H
-xiFQL2S1FQahAIcwimckDIQwivm4bQHNoRs4GIO2hkMnVPG4CDPcU2LTbk6d
-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
-XR1YQ3sh6LqGQioIBVKmvkcZAwSHGzq8ICU2R2q2lGmNk+c5frCs12uMScqE
-95am3aV1powczRLhX+pUPbLbNpR1RV5WrLdbXp4/wznH8Y1Tbty+lUjazrFr
-9my3W9rdlts3jmiGK3aDR2k4Pim58+A+v/Pdd/jmt9/Ch5bjkylVreiHNV2z
-QRvBfFKQ5SVd48buRk+M7gDyvO5S0xoEFi88RkuMghgHgnd4G9AojBbJoKwC
-yqXmAGFKBBmPHtzgzUd3uDxb8/FPP+Pznz9ltVyxb3eIesHtRw+4Oltxfn6e
-WGdFjkbTNWu2+x1Ds6WczSgnNcoYSlNipcC6gB16vOiQ0jBZnMIsEJsW13T4
-tkXbgWBTzVQYU84ipgExxKR62t4hBpdYX97Rra7YNR0mK1gdLYgIJrN5gtD2
-KQV4XRdkjKHdbcchxL2qVRGR3lqGoafvB7KqxOQZg3f4kHhwx8fHzKczpPUQ
-IrUPDN6lTlWlmU4n3HnwkI9+9jHPvvqSMs948/XXmdY1u+2Wy8tLZicLZrMZ
-N/wNtssLXrw8J9qBRT3n+I6m2y65ahoG39N2V6zWLbdPPXduGo5nNVlpCGog
-KIePAy7alDSMKbsdY6TvdiBSI4K3lgD0ffKcbttANq8jID67/DEQuNg/wRPf
-F0K894MHP+STcaj6b2WI+vnlK8Vp2TzBuSH+WftYSKlTqt07Qkje4fP9k/j2
-6Q/Ebwapf8Tj7RuvpMmT8iGUyXb00Rc/iV034K2lKIp3yzyLxhixbn7xvneC
-q81TFpPX3hMIokjT9980r//NxyeXHzICxLk7fY2PLz9EBOj6L2OlNUJndPuW
-ptkSMkVpNGVVJq9ODCiRjJcJtpfAkJB6zZyLSKkw0hACFEWV4v7OI3RKlLkQ
-6b1j8JFhN+CiQmc1eT0jiozdEHDOIExFEySbs4bltsMFQWYqRJQMQ8euD5hp
-xYuLPecvz1K6qu3Zb3f0nQNdYOqMfddjXY+WBWWW4RA4pTEzTacK6qMJbYy4
-3mHqGSpEWmvRUmHqKv3w+rHSJHV4kOUpgr8fdkQiQqcPpeN4wU+AOOc9WaYY
-REy0cR9RJqldvQ0IbeicJ0iFygt8hM4l9WCz25OZAoQiy0u0MjgXMEWCHe73
-W27fuEmmVRpurWW322FMIkN3oWMxPybXBft+DzawuVqjomSaFay2GyaTGd5Z
-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
-m5HJA2Q9bDYp4dj3/SFplgYalYZtJUej+Pqwpkw+izRQHgB9MbJYLJKCV+TM
-5/NDF5/SSa3qui79f8e/nwF5VR7WD/ux9Pja8Nw37eH5CyFox2LYvdrRdxbX
-O4RQpPe4PKh/Mo5rmyxPqoxz7IaOW7OSejZj33eJhyMl3kd6b0fFIuEmuPZw
-KcVsUrHvHJ0dkrInR2yFSaff6XTKdD5nNpnSt+0BiZDpY/JM0+0bjJY8evga
-UgW6ZkvbNWxXV1SSFNKwPdiOOpO89eghbdvz7NkzpDbJh5VJfvqf/pzp0Tyt
-hARokXwfxijEoBgICJk+r5VI8fBMAM2AMn+PA0G6ERaZAcKr1KiQCS/iHM6G
-5B+c1Rids2sb3KjaKh1Qmcc3O37rna/zP/7LP+Str73GZJpTT6FpzwhhwzCA
-kA4hLCF2hGgRIeJi4pjJkf8kxvAKcfQPIkfvkxxTeCnVREwWgBR2CWSZIpDY
-S9dU82sF+VUaTxyQB9dqZfpcPBxI0m/E38IjjIo7xPRrUuIjQiTV4MbpAu8C
-fb9DyphUmIcnvP3NB1xcXXJ5ccnx8W2qwvDy+RmbTcd0WjOpc7yLGDVWx7ie
-dp+ef1bkKYvjI7O6QmUG68Yapv2OC5+M9fuuZ34U0f5VgblEoI0iNxkhS2pe
-iO6VvSKONoUYCSFZK0QMIFX6OkM4rKIksG8bkHokgvdYa6m6jqIokVKw327Y
-ty15WTCZH3F6egpCsdpuOT8/R69XxOg5OT7mwYMHdLvtGHDYA5LJpMQFy3q7
-YTKZMJ1O2Ww2rNdrjk9PEGOA5fjkhJcvX9L3PW+88SiBgwW8dnoX27YM+yvW
-rWfTOZwyZOWELCoGN6BlQIqIEhKjNEYppIjJhxteWU+kEEjCSEdPSBAlBQKH
-RL+LkFHLSIiCq/YxP376WTQhKUsiJGtLDC6JBiISRCRYC3ZA2KR6aZUCPQn+
-qcF2hOgQweOBOF7YoxCgDb3zeCTR5Ehd4E1ONDlOZOIP7v/bXztE/X/5+O9u
-kHrzZARnNs84qh5w4T5H6gwTFdgEaoM4crxSRUb0jjBIJAahVfyzp/9OeCHx
-45XnPzz79+QCoRExCokXIHxKp+AsMTiMytPpxic1IDFLGIuLBW4YxlLMdPMD
-CVHiQ8R5GKJAZQXPL1b87PEL1m3Ei5x2iLSDJYoMVI5RAjpPN7T0Q0ieiRFu
-aUyOj/0h7u36jhgjQ9+RZQmt/6pWQqCNPhitu65jGHumrnk012mnsizReXZg
-0RhjmFZ1MtqPPp88z8nHFVvfdURtyIxJO283gPNkMiVIbNNhu5ZyNsMojfee
-zXbN6eKYLE9MlLZNsLwiy7HRM/QpOSNjgjJ67w9JKz+u84wxh0GIELF2wDo7
-MlQ8Wmsm0zmz2Qw7mm+9jwfjfVVVSEmKXCuFMZqhT6vPaT074BaEEAlMOJre
-tdbozCSfU/mqqLgs06B0dnaWfA1VIjMj0qB6dHSEMgk7UNdlQh2MRvT9dkdV
-5kynU4SSLNdrkAo3OCSgpERcr4oF7MeTvAgeoicDpFII74neM4SIKSv8MDBY
-j1GGYCNN36T0m4hIEfHW0rctqiwp85xYZDRXjr6LxKBBm6QObTaU0wnVZIK1
-luXZFbnJyPL0vY5RHThUR7OKPNMsly+xmy1Vrrh7NGM+KdHeIULPbn1JXc2R
-vicXHoaUsJuVhvPVFTrViiEJDN2efXRUdUEMAyKMP9dRQBQoEUCAkxEREuhU
-jmZboZKhXilFdCkRFGNgNpsljpa7gjEtt2vT8JoX8If/w7f5vT/4Lb7zna8z
-PyoR/y97b9ZkWZaW6T1r2tMZfIw5cqisoiqLTKCooqAoaIZGoKYbGZha1K3+
-CvVrZCJNV5hM1je6kjXdZpikHoAiocbMmMPD/Yx7WJMuvnVORDL0hcwwGrpO
-WlhEZHi4h/s5vve33u99n1cHprARRbWKgEepiNVJVhRZ/Eday6ojZyPeJNHC
-ix9KgL1yLbCQXyuwYh7XoGSYUkquJ5LJOhKVXg9BxWx+WLO/uUJXSqqn5Nd8
-5u+pgkmQtbbMWbqERPKRvJAFmaAyMY1MHpTZ0HQz3vvCHVA/zf/+R/8nU7jB
-1Q2zZcXqesBWDbVbsFlvMaXOa4ieYb8jTF7SwbUoblkH6rahrWoUie2uJxf/
-4Mxqbl4+R7vX1yBjDI2zGONI0Yt6lSKmDNNaAykJyy9lGaKyHKLRsv6VuncZ
-QhfzjrpphCvnJf1a15b5rMU1LbupB2uoKidtAts1aLFA3L5zyaNHj3j+7BkK
-uHXrkmXXcnNzwzjshTvlI9ZZxnFDiJHmkJrNEkoyRrHdbjk7O+Pm5obVakXT
-zbhZbxi8Yp80Q67YThCvN9Q2cu9iweWyEQgsIzopKqeKMqlfhwpCJupILtw3
-k2UFl1OUYcgHjHWYHNHJgxLwaSYTU8g5eHQIEEQoSFmGUqUzpqiZAkH1gjeQ
-nChGZ3k+lPRZ6pzEp1cOAigjaXfj2E0eXIM2NarqMLb+6HTx3rf+LvP731c6
-78eD1F/HIbz1r7/1J5/8b3+ojFG2cjlN8qKJOR4n9soqXFCYADFOZJ/FvBl8
-NnWNdZX6pfvf4t99+r9QG50rDoY4g8qBNHmSn1DZM6YoXWBZLnRVYSSZQh/O
-QUy+KZZUn0n4pEnZEJUF0/Bqtecvvvcpj15uWV7cQ5mO3faG3ZClekYpYshI
-F7CYRY2rqCoBQE79nmkYiWEiTlOBhIaj3+VwilVGH/1AY/DoYWD00zHpVtd1
-6RyLR9NxO5sdOU6urBJyzgW4OKCVQPAq60S+R1EbxxQz+/2O635LUxsaV7Hf
-73n14qWY2mOkco6bmxtOF0sWswWmciTy0bsyhInF2Rl9OSnOZjMGP/HkyRM2
-mw1nZ2eMk6R8pIdtdhy0DoPVfr8HYN/LxdlWbRmCXAkm6AIXldhtZS0nJ0ty
-CkI+Xp4fFSOlpGbIWnv8f/0o3q2DZ2y9Xh8Vrk8++QRrJSmoCrdLFbVLGXP8
-HKZpIhQF6vDw3hOnxOXlpQyp+xGrNDkWhUMpYpLwyzQNjN6jYkAbjUvCkMkh
-cbPe0DSVpGCycJ1SGBmniaaT50yXlck09qUrMkh6M3kaJYORjonBT+iUmZ0s
-Mcbw6uUV/bDnS1/+ItZa1qsrVGU5PVnQ7za8fP6Mi4sZvt8ybxyfe3ifd26d
-c9Y2bK6u6CzoMDLuVjDueOvuJVuv+N6nn9K0C+5eLNn6Ede0aGsZ+i1+6Mmx
-paostTXsx4HkZf1sciJFT/STFCynREi+oDoaKuuIGVJMaC0J0xACNzeviESW
-JzM2+2turp7x4J23+IVvfpXf+M2vc++B+FW2++csFhVa7/HxRlhJKmCV3BCF
-0yTs6cNNTdKpEk+XtNibA8xn03hv/hBQJiSfyCp9BrD5Gb/hUX1Jn1WZDm+X
-/2as6YBPOPxatKtCzFaGpF6r/Ov1lrbp6DqpK9luXqD0jvPzjsXyPf70T/8D
-3/nzH5Imw9nJXXJesFtPxKCl1FwVoGYJ/8QwMR0qb1IW83NTU9kZi9odb1zG
-CK17PmvRRnAnU0kLO+cwKPGDhoA6rCTLtddnBANAwtZOECqaMjyJaqWUQmkY
-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
-VqA1l6cXzKuWPEXOl6ecn53Tb+XiYYzcJCqlmbUNXWXJ0ycTGIsAACAASURB
-VATjgCNjYiAOPYqAsxlrNH6Sk6E1Uu0x9gN1VaNyEh9aSgzTyG43EGPCaCtx
-2xRJITANAzlGuqbhZDFn1jQiUSsgymrRDwMqJeEMDZ4UEyZn2qqirRvaqqJ2
-lagGSjGfz4jBE6Iv9RyZGCTp1zUd0U9sVzeM/VC8GYq+n4hJUTUdq/WWtp0d
-jfxt05TKkYGT+RytJeDQtS0niyWnizPm7QynLISMitDUDcnHUg2SpI2+7cRz
-Fl+rDzEkxn6gHwb5WvqJFEZuX5yzmHeEMODHPePY41PA1o6slNRtJPFrtbMW
-Vxn6cccQeqzTJARyeX56xle/8jWev3hJ7z2b7ZrWZULY4ZzG1Y79bsfUD3RN
-S+NqfN+zbCqm9Zr9yxcsa81565jpyN1lzTd/5ss8OJ9z2jXcOltycXnOZrPm
-2atXzM9PufPWW9x56yF3H9xjebZk3+/o+zVkz9WzJ5zWLT/9pS/x4PKM9Yun
-vHr2mDjuMSSsyux2G5q6onG14OF8RlPhfRaTLho/yQndVDWmcWBhzANj2hHN
-yK//5jf4V7/3a7z7hUtSviazwVUjKm/RaYXTHmPkdaaIDOOI94n57IQQRbXJ
-BXeQs0Zri3U1xhps5aQiKom+dCDIp5TL8H2Ipx8ULRl0NAqjHWhV2GmHKt58
-JBkopdDOShAmK2LOx3JxGZ+0FIQnqdRJ4XU1kzZK0p1aVmra5CICyhAlDXoB
-22iSCvLaisJdU8YKQDGE4yGi7RbEAD/43iM264GmmtHv+2PlVFIa4xzKmNeV
-U1odMQVKQdPULAqSJXrPer0h5MBUFCU/jYTRHzEpaYqYrBm2Pf1mx7SXP0++
-cKNQtHVF8p4UgtQJOYczGlU2B85aAUQW/19ta0rrcVGAJ25dnFI7x/PHj3n2
-7BlaaebdXNLK3jNNHh8iVSUIlGY2Y9f3PHr8lG6+5M7tO6SYeP78BZWrOVmc
-Mk2e61fXtE3N+uaaylhmbcVudcN2dc3ZUuqthtHz9jtvcfX8GU5nHty9xc31
-SwgTy8Wcz3/+PVwhmecotUIahdbyHI3eo63GWF3WqbIp0dpgrC0+PXn9Va6i
-rhuMNoRw2EZkrNI4bdGp+J9iLtxTAXv6FPBAMIZU1eRmjmqXpHrOYvF59cG9
-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
-V5OU/cFi8uEPfufhP/jBD5//D59l9KeHFfb7J5/8ppD69/267l6Agu+e/cGv
-7QV6sf5zlMq/rVP6baNHLFkIQn+NCZ3VGC3BsYszRr3N7MpvO6s4BjfaMSfq
-6LCxDZebgUFV9NHw7OU1l3ctuz6x6xLzk3NsUVLXNWdnZ1grQZBdN3B5dc1u
-u2FSN3RdS7vfCT8qJoahpy5LghcEQvIB0piZpw7uDC2ur2FAG82kmVA3Ejbb
-+UEOJD9Il5kS5Rh/UlonheFeYk1mzYTpZCIp5zfX5Bi4d7pgWtcM+51oi7wI
-l3OOOGukKBq1GWpEFvzlXMScBR1grWRDqZhFK+I9vu+EOTV0lKXDGikerB6J
-zb7H9z19K5Mv3++PvCwB8cWxj05j+LDCKYlPUFm+z8Hl5/tO6PQxkXNEJQlb
-tlqs+WVRCqRzZFl1+5bddku73zF0LU1VYXLGKU1pNCpGWZl18vcKUXmMLslC
-bk6D6M9IUeCvKZC86LcYR+h9u2O7Wku+3qgb04p3fpljplvhZEqZYmSz3rLe
-bI5FcRpELxaDJ/pBNGgwdqGZbrOTojEErLPYsmBxdsrp+TlD17G5viUNA1ol
-SqfI7PnoG4/47e9+xB//0e9zcTphOilot0ueff45q+UdTTPBaofVlpSgqmpu
-bm/ZbDecni2YzxfoUfgqOYfjQT4MhCDTPq0NVht+/Gd/QbdvaZqak9kJfddh
-rWFxsmC324rr0TAK7jWFM3jfslpes23XvPeNx/y13/0tTk4qrEsYFzA2MJuV
-WKdIfoAs+q9u36JGYXQYIkVR4T3HQHI1FjhqXOGpCE5bok/4TpyrVstnEUOk
-6zsK60gxYZUEhqeQx7Xa6Lo8OSOT8UMQ12+WabczBcZaWbUcgJ6HSatWY3RM
-Hhlz72g4lTpmq6XDv3rH9afU25TSw7tLja3FUQ/1znpP2EOWHDUxaUJUEkyu
-HRhDygalHEOEkCxalUQsm21P23qCN4QgqJB925HIWGPphx5XOGbzE1LM7Pd7
-9vs9gx9/BiVTru1uyxBHqcE4JTmI4GMMFIVjvV0zP5mx76XJ/KO/88f8vX/4
-95mcnFBOpxSj0+5mueSrV6+5ur2jGzwJRVFLcdRMJjx9+pTZbM7V1SWv3ryi
-HwZm0zlFWRFCZrPbkTJM5nPKosIHL067lHHGYpxM6yfThsl0QtcP9CEyP1mQ
-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
-crfcMJ2d8OT9D1le3Y0TS8fJbMZ+uyO2rYSstyva7Y5qUhFih3UOrS0xdmLR
-R424CCl0o1I8+ehbDH1gNpuRVeLL58/Y73b0fUc2DmcqafqzQmclKQymgJDZ
-bvdMmoInj7+BMwWvXn7Fr756w7fv5P1iZw2/+/u/x6tXr3j55XOmk4a27chK
-4b1hfnJCUjCEyHy+YP3VV7z44hXvP31KWTe4iaH3gc8//4IPPviAxWzB7dUt
-d1e3nJ+coZOi3/dMp1OssnT7ntPTUy4v37ANe568/x7PX7wWyHJZ8OKrZ7z3
-/gOmZzOubjNX+yWpcTw4PUVlz5cvlwyrgccXU6bNKbEfUEXiZOKYVA7ve4Yk
-uinfB5JxIsM4sMZ8winQhaOPHdppSuNGoTpi2LGZYlL9Kys93mH0HQj/vymk
-ZCScs1Y/UIlPtTNKZ7LOwlpKMWL1YScvgmKdJBwRFSn06KDynqwiYYBsddbW
-oI37AUZ/+subH/LNcf3385sf/j8WqP/k5kdkxWcHOr0y+tM0UoUBrE6f5TTg
-+x2h3aKCx2SwyH7YKkPOmmwEyIaRDktlhTIWk8ArS1YjoFOJLTilRCBDiHgl
-D/kQwAUY+oyxNa6cMHgIKbNrW9ZX10zKgum0YTqd0nYdm+1K0PtG4YqCylb0
-+5auFa4TUYTXKUZcWdGNEQl5jAAwemRdZcgYogZlxRVUTSRhXKJsJFQ4Ip1O
-CoHpmUBBl6tbbu+uqSuHImOtRpeO3CeS93QhHDEDKMVutyeQqJopdT2DcWpU
-ljW+zWKlrwuUjqQhoqzCFZY6NZRFQRiC6FQiOBxFUeGMiNd9HvApEgN00Y/5
-ZgI0NEbhnBJQYfQC3ywqjDb4IEJ6ayReAn2I5niLpgDodl6mqVq0caUTDUZZ
-V5SuYFAdwViGGFAqUxYFVVMz+Mx+v+X+o8f0fUuIAWs13RBouzXOJCYnNe89
-fsL9+6IBck5iLZTlSC5u9z23qzVvXt9wt9wwDDucKyibGuNqMgZXNOSk2e8G
-un5PuArUdU1ZOZqzUwa/Z7tZ0rZis1azGc4VqKjo9zssWej0SuOsRuUoxWJZ
-iP5ECWcma9FJiCatAJsJYY9SmUePHvDxJx9xcW+BNokQBvq+G4nqoqGIyWOM
-wzmFsQkfB9Soy0opviOSPuKQKF1B1FJIyWrafk3nY1Qe8SIjv22MJrFGAn+L
-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
-NHYeFyJnSghBXZdUpSNQ0HQNmUyYzxcsL6+oqoqNkr23QOFt9AmUZcmtW3fY
-rpZsNhv2+z1Jn2rK8zxScXtuVGh7aKqPqk3XtLE2IY83TaUUbVsTvEOFQOc6
-qnKHEIL5dMpqtaKtS1xncZ1lNMnY71aoEOPVJk1pAzStiyWifa9bYx1lWRJw
-/YlPx79DeIrEcOd4yHuP7/L9b73Lwzu3CU2DtJZEEiGUQuGVQKQJd4oZD+4e
-cHQ0ZDrW3D6e87effEmazcmzCaZPEdouDrPX8MDIkHJIJSLQVCp8ny5Jsr4C
-yF/3hYVe9aB/X2rqukUoTZbGhGGWZYAkyTW1bdCJo3Mb0tzz0Tc/4l/8i3/C
-vftHlPsVWleAJ00l89mQICRVuaZu1oRgKXLzpnBWOpyrYu+e1OSpoes6pAh4
-19JYS9dGT8hgaEjSAVfLK5pmR+mAkHD37pQHD9/nG0Nln1UAACAASURBVO/d
-5sXLMy4vNnz+2TM+/fWXnF+scV0CwSBFRnCKutuRKIXQKSCwre9hsy56/Fx/
-RPACIUEEiQQMEqMkr5dXHB/exxjVYxksQsSH7WCQk+fxgVo1NUWakiQZ1vre
-AG+5rh65BsX2W/A3rQA+/Nage32/iGs//9sP5b7r8JqGD+LGN3VdfNy2LVW9
-JxEJxWCIVilt42kbh08CwSvG4xmmGGDSnEwXnJydIKQGlbDfXzGeTtEm5ZNP
-/obFdEBtHWxKdqtLsJbpqEB7R1k1nH75Chcso9mUuw8fMF7M+rEncHz3Np3s
-0LmhLivWyyWpSjk6OsLbwOmr15EuHSIjSevedK8VeZKRDIuoQsXzP0ImaKkJ
-QqEweJHxFz//FacXW54/P+PVyQUnp1dUZcdgOGG2OGZ6kDEaTxmNJlEhaprI
-WyNHpUO22xOMAWMioTtIQwgKa8H6jmyQ4GnoHHRtfF+GecZ0Ou/XcP3rbqNn
-LzbZ9O9X6Eh0vJ46b6Pn0F+XZNODnj23b98G63j5/AWZVqgsp2krdJJQdg19
-3zeu7xGUKhaKS6Mxru3rTqLv6fT0nKdffsXDhw85OJjz/e/9AZ//5jP8r3/D
-crnE1h4jPDKN+JhERmq9kIJMS2SW9t68jrYVhC5jt99zuVwxHY+p25a33nuX
-J0+esl4u2a53CDzOdn1aOsQVLY7UGLZNg++7AtM0Bi+ufYXXnYxVVeG9J8uy
-N8XzMl7bs9mMIh/2/YuOWkScTJobLpYbghTcvf/NqKpenNNaidFQbWsSCeP7
-YxQRGVE2nlFmGI3GeFux26xRaUpseL1mlUX1MNagBdqmRUuJ7j0jwVm6tkWi
-Y6eo0T+69km9v/guv778xY/P6xMOs9v/KFZ76s/+7M/+X/lCi8E9Pr/4BZka
-/SQAi+LOb/1+Zbc/q90GKcRPjNJ/pnXfAdW53rcQTzbX6SmlFImJ7eiEwHJ5
-1Zvb4o1WydjbppXC+46ua9FK9PJub6QOscBS9MNP01R0TfuRCOEjIfiI4H8k
-Q/iR0eqnwbufGM1PtRA/xTuwLdJ1KMD0/p/QWbAeoyVpksRotRAoLSOE8frX
-tUIQcK6L/i4R1wl120RlDcVu39LaEHk8QeNlytn5mpPTJeP5IattidQJu21F
-ALTS7HZbuqZh2EemT8/PWa23pFlGYhLy/gN4dXXFernqPVmx26+tq3gyqiNH
-p23if402DEcjktzgg6epI0JB+PBGmfIeKQQvn3/Fvdt3mIxHPH3yhNGw4O7t
-2ywvL5lPxmgp6OqWtqojHyYt0DrBWkfVlFjb4Z1F+A4lPKPccHww5cGtMf/1
-d7/BP/vBt7m3mCCbPfM0QXc1r7/8gtfPnlCully9fkW93+C6Cu9r7tw+5K1H
-91ksFlxc7Tm/WpEkOVlWADp6Jbo+2CDBE3vPnHexk02qGx+H79vaRb9eukmJ
-aYPSBu+ubxrxFOoISCWRWhJkRzYIqNTy4MER/80ffZd/8k+/w/HxmMAeQckg
-hzSxaN3g3Ia23eDdDiktxsR4v9EGJQXBu9jTFvyN+tK1dT+4W5QOGBPQ2gEN
-rd0hRYtJLEniSBKH1g5lfPTzTIcMB4Y7d49ZzOexq2+3j1gSpdEamnIfzeTI
-nmXSdwN6In+sbphNp2RJznq9oW1aimJAlmb9mrMkzQTHx2MeP7qFoKTINNv1
-ijzNsDbw4tlL2toxnx2y6q/PYZGz2+/iQUPJPjmmb4IFN4R73qz3rjsSr9eF
-TVOTGEPXtXSuI+BvUn1aSrQS8TCA49Wr5/hgee+DbzCdj6mbChEErgmslnuQ
-Ca/OLtHZkNt3H+AQPH4A24Akf/stiiLn/PwcFxyPHj+Oq5QyBh4m0wnrzZrV
-es12Eys+FrMpm9WKJ59/xuvTM5QS3L1/j0fvvMVgPIiePCUiLkQFOjrKakfb
-dGRpSpEVeOtp9hW2tey3+/hvljomLZsO5wP5cMRoMaPsLI2DJC3IiznIlM5q
-Tk7XfPLLL/jrv/6Uv/27z/n8ySvazpAPZmTFlGI4ZThecHB8D+cF+32DdZBm
-AwajCVontNZFllOSEYjezcFgQNt11E1DWkQO3GA8YDAYYfvvz1qH0QlFHkGr
-o9GQtmnY7zYYrWO9TlPFlLAINHVFlqbMpzNsZzk9ecV2tyMxcdUW8QPQtg3l
-fo9UiuFoSJpn0cydZ6Rpxr6u2VdVXEMOhqw2a8bTKXVTk+U5ZVvGIUVLxtMx
-RiveefSQg/mMg/mEYZHFoEBdUpc7qnLHbrOibSuUgkRLurZmt13TdS1JYtht
-K6bTGWVZsZjPOVgckOhYkfXZZ7+hrRv2mx2T0RSjNG3VkaRp7DfEs28aiuEQ
-LWX0kdYN202snWqahjzPb1oxZrMZTdNwdnbGcDCM4oEQOOto6w7RDzxSwHa3
-p6wrpFbM5rPIBdztcF0XU9ZC4m1Lnhpm4yHCe6rtkqPFFCUcp+evuXfvDmVd
-X2vAEfKq+5V6r9jtyiau+bynaWts26KUJi8G6CSNWBIpP7o9/tbPAC6qVzRu
-T66H/PL8z8Oj6Yc/+Z0i9bWEU/iPWLrfnv2Az71nvf8KoflZXL+Bl3GvapSO
-DepCIF1cCYXeaO6cYzgoYh0G0djYdZHce12JoEQ0UGsCQYC+ftjFLhesc0jv
-8C6ubYKzP7IhGjOlUug0CT70ZZeA1gYhcmSSIq1l27l+yOtb0fvknvOxdsUY
-g5DXMmjkRml93fMkb04TUl/380WVRaqEVCY4qbl3/w6vrvY0wTMeD1lXnn25
-5datW4wHA5xt2K7WtOfxpnbnzh0uVltevXhJsLHDbFAUHB8f3+AP2qaKHWbX
-be39Sd/ZjrZtaaqaqqnJRnns7Oq6qHgFj22jedi1HUJCnmZsVlfYOmc6HpEo
-zeXFBTJAU+2jQla3tE2LdAKRiJiAch2Z0XgtUNJDsHS7JZXVHD8+5od/8BHf
-eDzmeJiRS892t+Y3v/olz798wna1JE9StuWeyXyGO5Ek4xFvffQ+g4Mpo1nO
-wQ/+Kz59csrlpqbcWby3DAYj0nTAbrWjbkqcb78GgouQ168XaCdJ0jPKPSGo
-G8Ux9GrGtX/B9DUcQTqUFuS5ISsyJgcFDx4t+PCjd3n06BbjUYLRLUp7lErw
-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
-ECLrS6HtTVTce49RAS08QQZciKdvGzRd5whe9IZW1d88I4wQH1e2xpgbX5G1
-0bvT+g6j4loymrBlXzrd9AZ2Q7VtIsYgeKoyVlWkaR7XDd2ayWjAxfIfKIoZ
-f/zPv4VKG/63f2t5+eoShKatLM46ym1JbnKmkynLi0u2Vzvu3j6m3W+Q+5qx
-TjlbNbx8esI7795jOl2QaEFbVwQVEFoznGUsmgWrzZqLyzUmKVBpQggtxlz/
-+3XsfXQgvMC2Hd7aXmWL6xapdKRgS4Mgw3aQZQlZXnC1ueT5q2dsd1dMj2fc
-vnWAHiZ02kEiEFKR5Bl1Fwe6arfn6NYBZbPj9OyC42KGcPDi7ILBYkqXJpTd
-DluXpJsVx6Mp3/ngI86/OuGv//wvePtb32QwGtJZy8XlGY/eepuz8xh+8EUK
-vkZLQyoUruwo6wrXSXI/RCnJ0AxQQVGXLav1jnW1x2rP+Chndrhg19a8rl6S
-DRcMFzM2O8FmrXjxZccv//qSp8/2DMd3mExm6GyAUCOUiQ9+69q+DqemrDdY
-18aDTiYZFTl5kZAbxWQkSTODlHNGwwGLxQytNW1VM5lMMCbFyFid4juwPmBb
-R9M6ssGC9XbHaDTiyy8+x3YNtq1JdEaSKqpqz1tvP2A4HrDcLMkGBYNxTuss
-V6vtDZYiFT0qJjiSNJYzt13Dar0mHyU8ePseKtVsljsurs4Zj6bMjubceXiX
-clfFQE3X4JzHVju0Sri9mHBxccUgy/Dbiqt90/c86v+LvDdbtuw6z+zGbFa/
-1u5Ok32HBMAeFCmSJVpll29cLl+5C9D1HH4DvYD9FraDsBWKurB9UQ5H2SVT
-VFGkSAoCiSYTyMyTpz+736ubjS/mOidJieVwWBEVVXIiEAgkApl5Mvdee87/
-/74xaGmYzCoS61g3G9KqIos0rncY4UnSiigfUTcdLo45fX3Cdteyv3/Icr3m
-8nLObLaPVJrdckdrauI8rG832xXFaBQmd6YlziKkDizErm1gBdV4ghXgfM9s
-r2K93bFYXnKnuE9Z5qzrLV44zs7Pefr06eD3Szg+PuLdt99mNC4xvme10/TW
-0hnPsxev2N/fJ45jTk5OeFCkTGezEAGJEwQa2xrURHGwfwjOc35+zmdfPKOK
-7vDkwQOyNmOzqzG2QKo45BjjsLExztGZHud6lBY3xg+h9GDMCOgGFcU45aDv
-UXGQpEvXoyUoGbZE3jY4l7Jyn//wJ+tXP/De/xBgVj38wbw++uE0v/8DcDzd
-+/5NFOg3v308HIje/X84CH1y+SPONp/7w+qxeGf2fX788r/DOeOD+lEihBKf
-XP7dDlP636bx2Pcf/Fe/pWx5uv99/uz5f/8BSryPTrBCYWxg6yjPAN8MYfHQ
-ZAq0cDHkdAKBPKxFgoPKYfygSBEDEE8rlABvurAyHDIZkRToSGOVH3g+XWh0
-STms8ATGDMFW54ikxMmAO1BIhFMoNMKF8HK9bWjrDhGnISMx5MGEEEQ6oa5r
-0Bne9rRNQ6IFtw8mvD5dcPTqc8bTPW7fPqSc7PHZs+e8enmC9SqMvMWa3WbL
-i+0utB29J83zwLRSiuneLEybfEC5C0BaT+8gzGkDpO16wmFMT98F7ouMk4Cm
-SFPiRKO8wHbdzQjeNh29qdmbTLDG0u7q8AahB9ewN8348tMH/P7X3iaTHcuT
-C5YXJ6znc8RoQpaW9N0gYe17eusw3oWwfqTwnaS1HWfHr2iaHZ2zqDQnimLK
-ckSSjji53BHFBWW1R2ccx2fnLFYrJqOQpyuLlFragMaQoYJdFimjcUqWJkgP
-o7xgf7bHaFQiRXiIT8c5RR4jpKEsNKvtkt7UXB695PK1xXhDURSMpwVeGYx3
-OBd8b9f5qiSLiaKI1WqBF5ooFiRJRJxEIBy2c7S9R0dZuOyJgebswjw11pI4
-jtlttzhvsNcKDRcKFWKYdnk/tC4ZGqxywPZD4D8RIVEgFPGwgtZiwHfIns3m
-lK6X6MiSFVO++a2nqFjyf/345/zsL35F23uKdEThMup1y6b35HFGimazWFIm
-nu3iEt/22N7x6tkxVZFy58E+1jeh5iEdtuvAC8bTEfce3uPo+QmvXp/w4NFD
-ojTU/I11LC4XIbejAq6j64KXT0ShaemdwFpP0zmsacmyCOccXd9jRc9ifcWu
-rtFRRDVKufvwLnEiUJGibmts22Jcz24buD237t5iPBqHD9lVjfUOEcUIZ6md
-o7U9+3fv0jdbtqsl2+2W2XiCG9U8f/GCDz/8kLtvPWB/OqPve5JkxGg0YblY
-E0lJmWSYtsG2HW2zw/UGLSVJnAQsgFBcnF9yenbMpt4QFRGTvQn5rMKlDqmB
-OOFqs6KzBjjgs09P+dM//ZCXr5ZINUJGJSqukDrFWIHdNdRdy7besN4siGJJ
-nEaMRjlllTGZlkynY6oyoW0WjCc5eZqBcGgtKbM8TAWbniRJcE5gO0ndhIZr
-1/R0TThIffbsr9hsd9y6dSu8l02LMR1t50iSiNF4L+A2ZGhUqkiSpvGNzme3
-3Q4gXDHowoIkWCmHdZrb2UHQrdQt5TgfhNOa1rSsd1umhzPidBumMC6svzab
-HZvNhvVqwd7eAdvtlqau8WLIPqLody1Lb3G+RWhHNKqIlMYi6DvDqm3YbLck
-RUEkLL0FMyQdoyRlNJowmU7ZbrfoJOTyrGEguYfsklaCPE9RKhQmnDKkOieJ
-owCKbjb0UUxaluAsXdcMqJYQr4iShDizNH1w7+VFgekCeb5pGjabDXGUYn1L
-31u63mIdoCNkHNF0hiiyyAFlYga2YJbEjKuCO/fuEmtJvTrj4vKS9mrLRGxI
-H+7TdhOW6548T3E2RFpuylLaE+uwDq/bHukknjeEfS9V+CyWIb8morCuVFLg
-6Oi7nshHiMijVPq+ENYLLz7wwr2/2D5DCs9i84l3eJb18w+89/z59rP3r9f5
-Qr4pb/1o9SlCKKGuyzhD2ev631OtxaZ95X9x/D8SyzD1vy6pWW88IP5eTKR+
-17efHP2x11oL4SVJkngpr/0+AiUiHEG1IqRExhpvLbazcE0cF0Gw2NuOwRrw
-xt81rLS8dSDDuu8avRCmTANnqA9y1ba7rsLqG0+UlPLG++e9GvZjHulDDsb7
-8MaxQzDWOUciBycRPgRNlUDL4ArTcUTX9nTtjiqvePutJyh1wovTS/7Zn/wx
-b3/5q7z9ztf50rvv8ODeQxbLNcvFgvVqy9nZOaenp6zXa9I0pa5rlsslvQ1Z
-BwY59PUKT/uwAjWD4DdRAVsgpcTS400AjoqYwQEYGpBvVD4B7eC8GVxaKavV
-Cu9CdiLVCqUTHty9y7e++TWePH7E/PVzLo5esdvtbnQoQijqNoRXpZT0bRdk
-sMay2WxYLi45PesZ5Sk6ThmVBXFRUU33qEYTGiRHr0/42V9+zHq7CWoM6xiN
-S8ajiq5pEb5lUqUURUJVZmS5oswTqlHIZ0gsWZywPxkzGpVo6VHak6UxcSSx
-tkViKRON1SnWGtbrNYvVnCvvOckj7jw8JEoi0rRARzoUJnpP01s66amKWbDG
-256u9rh+IMergjRxgXoPYaIkw2G27ZowiTIdcTQ0VX0Aqwof+FdeSgQR3gcU
-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
-hURKEknR+UwlJ89f8uzpCWVZE0cZ1liqokJrL/NWXSbK8cqNaTtLBlKSJDFR
-GDOdzZhMphzs73N4cMDLsxOCMGA0GqK14vLyirys2NnbJesN2KxzLi8nWGPo
-9/rsHxyQZj3qpqUqW6SALI7Y5GvKsiQMNVmaEGiFpfUA6u41K4SfUoiOViGF
-P4jrUPscnPSHG6k0OtCeYRgojxjq/J/eFdgihEQHATKMsCr9qxvDL3/4D74j
-BTBO7/zcjbv/OzpQzvHhJH/JTnpj+2+T4hlKOIRzSCxCCWSgUNYircMqgZQB
-OhA0Tes1ksJ1riaDVf4NqbXevumluw6bC280d76FaVvYVBYjQ5QLmW5qHp9e
-8XJRofsHzArDojRYmZD2x8ggZp3Paa1gf7jDxcUVxtRe2BsGaK3JsowoisjX
-a5bzKc629NKEXhpDY6isIY0zbuzv8eTRY0KtcFKgEQyTzGtLmobl0q/G54sV
-1WbtR4ZBjAJaJ/1FVzta2/rNPI+W87NuK3FOYlqHMZayLBGuIUsVuIZIK/b3
-dkjjiHyxpClr+gREcUiaxCgnKTZrf1ER4DpnVmP9iURFIVpltLrGKkfrJI01
-tJYOzCd9KNwoyrylbARx2qfI4fzsiulkxXJT+zGO8HJNrQRBpDC2pq7WQIgx
-FqklUurt6d/iuq0fgdIaIeQ2CyfE9YXbgnNcXlzirGQwHPGtX/kGt46P+fTh
-E3q9PnfffY8nqzVfjlIuTk/4g+9+xK2DA77xta/h6oIf/9mPWM6m3L55g5s3
-b5CmY5x0VMZhW4eTEWHaI0xTVKBp6pKqrbBYolATJwF7+yN6vZh8vUIfe2Cd
-tZYH995ksrjipy/+kj/70V/yj3/jV+n1BuAMKtQUzcaHQ4XwH1IgOpL2Ncww
-1oqyrDDCQOy3OI01ILybzDnIRhmB8kWE6zbUG9NQr0qaVUPYj6lcgTSSOA1I
-kwQZaUSoEUHA1WxGnO6ynOe8ePacUEkGB7scH+1xtLtHud5w/uKM9WyJEhqF
-IlQhYRiTr/2I65ruLITHjAhUJ882CKPQKqGuSmbTJet1jyiJtr9v0o8IpMIa
-74BTHZ5kU7Wsi4LjO3eo25LJbMrFYkW0inzHSIf0sz7LTek3X62ibGswFteR
-m1thqWyBchYhFTKWIC15s8a0NXVdkCaKxtQo7dBa0dRtFw/QYC2KAOcgTTKs
-SGm7zEy/36e42rBazIk7tIZHKLTcuXOHyeQSIQSDwQ6nZyecv5x4NpUUmLah
-LGuMcfzKt34NKRVV4Tew9nZ3UELy4ukTpstL+kPNreNDdnbGPvNVt6zX+Qen
-p6ecXUy5cXTM3sEBO3sHoIMu3uBQwmKsZ2Fdj8S34zXHttMtO8m56xhC15MB
-0R1ktsqY17IzQvi8lDHGv+5eK4ius1Cv/KjdlMF2Ci/J5xZeTNNi8OYGP+Lz
-HdvGGNq2QQufTXUNxHFMpCOUFhSF50OVm4J3b91BqJBVXrBZrnzWsMuXKgdx
-oNkZ9Njb2UEJQxhIIgm2agiEYmc0JlCKpqrpp4qqqCiLDf3+kKquaaOWMPQM
-PecsRV1hMV7RhWM+mbJ7cIOD3T2ePHnK6vCId955l9nskqYq2dnbIYoi6rql
-rGv+T/berMeuK03Te9aw5zPHyAiSolLUkKnMyhq7XDaqDfi+4Sup/XPcP8aw
-S7IvjAIahn1ho1FZWVNWVQ5KzRLJIIMxn3mPa/DF2hGkslzdNtB90a4iEAiI
-CElBnjhrf+v93vd5t1XJYDBiurPH6ekpJy/PaJqOdx6/xdHDR8RpyunTExbr
-OalMGU8OsMrw959+zXJ5zQ/fuc/OULEo1xxOh2jpUUIBJrx+PeA40jFGdH1F
-j+zBwC6Y643H29DJavs1dNz75W5tj96Jf17tvT4o3aXl/l/6n/5DSIP/L79m
-WQBxvm5ul72sKwHb1NB1YAJczzrTFxWDlNFdR14AcFqc6bBdE2Q7IULp6+0e
-3go678N+2BqM02w2W1ApXsW8vFrx7HrDvDJYlYFMma+vOTmbMxgdEmUDfva3
-v8AYePToEYMs4+KipG0M66ZBRxGz2YzdvT0WiyVffv4Fh4eHeOtoqor59Q2p
-ihgNhwjneX7yDNe2yChFy4i6a6mrMjSjd4a2rcnThFgq0sEwEHetoakCgDOK
-ot6TcOtf6G8KUuKdxhqPRKNlFFrYrUFiENKRJorpZEiaxtQbB96RJpo8zymK
-gtQImvU2cLmECL153tMYaLzAqQhHjNMap32Qu42hvSMgh9uN0jF122FQFNmU
-er3i2fNLLq9WrCtDPhyE9nktSOLgbZISLMHA3lZrIhshpO77TlXg0/iQClJS
-BUDnayZXRUA92M5x/8Ehz56eMp9fMpvtMxoV7O6N2N8/5Me//T73haIRktNn
-OwhpefnshH/305/wzqNH/Oh3fo9f/OzvuFpuma++Zroz4ejoiOnuFCk1ddsw
-ne0zmYxoyw0nz59TrueMBgO0hNOzF2R5zsMHx3z75JSm3IYKISSjwZhBWtCU
-Lb/8+0/4/d/9bXYOBmyqGyIT0xlHa8LqyL/mI1G9yTOJY5IoxrBFxQqdQNtY
-XAu+C7woYx3Hbz+g3TY0ZRMCCgq00jS+o21b8qSgqrdYYxBx3mM5gtFWeY2U
-mjwrwK+otjV5nrN/cMDhwT57kxln33xDs1xh6iasCbzvydMJa7t6BSfUocRY
-6ogojgMjDmg6h0o01gvKsmZb1oxsFFolVCjobayhqQxNa9FRjk5jIqHQpuOb
-k1PG0wnJcAeZGYzr2PaeKJWmiPC/ou4cxnQoQhms0hrvOmSiwPbOHQ+t7Wi7
-GucsUjo2ncHZjjyOkEpjXIMznjRWSIJ3xwtBmma0NmG9qGmaYGRfr9csl0t2
-dg/J8pSmaWiqiv39Xep6Q2cNz09e0nQdaTpguZxz8vwJi/k1u7Md3nz4Jk4I
-7h0cIDw0dYUSnsXNBdtyze5swns/fJPRuMA7uF7M2SzXPHvylLpuee/7P0QK
-ze7OIcPxmG1TU7fN3brcW0OSFr9xsfV3a7rbZojveJpeh1EjsM73Q5dD0Pe3
-3XWbmjuG3m3bxN1aUMoADhai3yy47yhNQd1yBKijv/u4VcmMMXRNx87+Puv1
-msXNnEE+ZLI/I8syrLUBTOoke/s7SJ1w/dlXLOY3jMYT8jSjyGKabUWexoyH
-BaNBges2xCqwpKQIPqCiKFBS0rX1XXii6zqiKKLqoa5aquCV69q+9skR99VI
-63pJlhUMBzmDPOf85Qt2pzMePXjIl99+wXxxTZoUHBzscbPYcHFxQblt2d/f
-58GDB1xfX7NYbfjm2xOOjw7J8hFHD9+kWk+wmzmtcMRJihMRJ5cr6uZL3ntz
-j8cP9+kwoWpKhNBS8H15IqlQWvdBDI8QvS9MmDAE+5D41i5B9oq/1q8CL0Io
-rHP/2Q9S/9FWewA7+YO7zzv5A67K57yz+0d8u/yZPxq+929e/9qfvvjTjypb
-flzZLZXd8mz1OQ9H7/LTF3/60YPRux9/fv037OZH3H5+/d97MHr349e5U1/O
-f/ZR1W0+yKLhx7df++X1T6nbG6Tp/ntMhym3KHvbNReMfrJ/Ma01SB0UJtM1
-OGvRSoaeN2Ooqg1plASZ2fW0VhFI5m1nKOuOzsV4XWB1xqaTtDLlcm0Y7tzn
-r37+GcvKkw93yYYzvv76GVGUUuQFs+mMxXzOZjUnyzI26w1plvHGG2/w9MkT
-fvmLX3B8fEyaJKyXS6rVhixJ2BmNSbSm2ZZUmzWRUjhrqMqScrvBWUscKWKt
-wqEvJUpIXNdRlxXSC/KsII40XRdo423X3BVsxlFM13YIr8nTgmExYj6fE2lF
-limsrXj89kP++I//gMk4ZjAQpHFgkGyu59htTUTobGvrcHDEWcZwNmXbGVot
-GezOIE2IJhMY5Ph0SOsj1o2l7iQiKRB6QOsjnE4R8QCvMk4v5vz811/xy0+/
-5umLC+rOsnewy2RSMB5EFJkiz2BnkjMbF9TlOvBnvEeriCSOcc6H27rxYUWk
-FM568GFAiHVQwmTf69V1hsPDfbquxRnD3u6M66trTk9fMN6ZokYZN5sblBK8
-//73efONBzx9+oQnT54wGIzZv3fE7sERN/MFn3/zBOMlg9EMIdNAwO8RE3VT
-sl6tqKsKcGgp0VpR5AOMcVyeX9O1lkE+om1amqphNB5R2ZqLqwsePjxmNBqQ
-D1PyQcrLs1P29/Zo24YoipFC0LUtGIuWCtt311lvwuGmwkpFpzE6TWhMy2K9
-ZjgZYVxHYzsa22Bsh8WAEohYsDVbvLSkg4zxzpBinKMTjfGOznhaIxgMdvn7
-n3/OctkyLHY5OnyDnZ19nj95hqtbYq9QQtFWDa6zxDpGK80gK6i2VVATtQ4c
-NxUOYOeCMiTiBOMsjdmSFRH3jnfIhzFNV9J2JTqKEEJirKdsDK3xWDSdDcPR
-YLLDattSVQYV5+i4oHOKthO0RqDigqYNdzFPhNIZSqY4C50xRJGkaio6Fxpz
-Oxdgpp3rULGmMy2evsRXh4ona8LqPIpikjTHeYk1Ak+C9xHrdc319ZqqMrSN
-ISuG+F71GY9GrFdLjGlRUvXDY8XV1RUvX77EdA3T8ZQsydis15jO8NWXX/L8
-+TOausK7QER/5/Fjfuf3fguhPM5bqm3F5cUVZ2eXOCuYzvYYjibMZrt4IWk7
-A0IQxVGoHrUdeEjiNAxV/ZBym6i8Jfsr+ZoixW0HZJ/As45Ix9wWoN/u+6R8
-pTjdFoLfcv26rrujZWsd4ZwPD2mpUVLeXQzxvQ2DXoW6xSfcpvmcDOlC5/AG
-mqphf/+Qq4srPvnkE7bbim1ZEicJx8fH/O7v/QFZnvLpp5+Efr7DA1Y311yf
-vyCNBP/1H/+XvPnoPnW5pKu3JEnEZrVCCsl6s6WpLScnp9hQs8h0OmVbViRJ
-AVKgtSJOEmTf/lBVW8qyZDqdsF5vaeo6sOiShOV8iWlb9g/22JZbVpsVXWso
-BgPiJKOuqoAAUYrhaMTObIc4ijm/OOfi/BKlFOPplNFoiJCe6+srtlXNwcEh
-OlJ8+eUXbLcb3n3vbdIsDuKCacM37iy4cFbqSFO2ZSiDloIoidC69zMKge7X
-e13bgYI0y8PwVbdY59BpAVH+/r3xj/7NP3lF6tPrv+T7O3/4D37/J0/+xL8q
-Cnz164+O/9WH/+7Z/4r3/iOAg8H9Dz+7/hum6b0Pb5Wq3/x8Xb8E+PAnL/6U
-nfTe3e8F0rb44LWqMeblM4Q1vmsaaDbE1oSCVu97ns5rBkjhsF2D9w6pNFL1
-hsm+4VoiWG+WKBmhohilY4TQeO0DC0NIVDzEx0NeXs55cbNl3sK29qzmW7a1
-Z7GtebD7BlIG03asE3anu3z77bdkccxgMMDbjr2dHVQU8e0337DebHhw/z6j
-4ZD1YontTOgmahuqsiSSIf0zLHKuzi8oioJhlpGnOkjZPYrAtE24DSCIlEbH
-gkgHlo2wwRfWGPPK0HkXL48QPnQGrtdrhLckcUKeKfI84v7xHsf3djk4HNCZ
-NbGyRImEIsUmW+h5UamKubm6wgqFVZrSElaGUYHMhpDkbIxhbRq2G0PTSJRK
-qGq4vrng8vKSbFCwWC25vlmwmG9ZrCo6A4PRlMlkhBKORFvyLGM8FAzzsLLS
-0oMMf87bbid32+0lJVLokJRx4s6PAa6vWnF3foqmrSlrifAGoQKiYbYzAGEw
-rqJanjOZTmnrjrJaYmgpxgUnJyf89Gd/zXvvfJ/jo/u8++PfZXpwxOmLM/78
-L/6OB4/e4PvffxfjFZdXc1aLa8rNglxLoiRFKIW1lvWmJE1TRqMRdRXI8KlK
-SJSitS33D445uzjl9OScx2+/gTOecl2SxillWdPWwUCudfDg4W2ohxEClAJh
-AxnY05eKtiih0UXEUBQYZXCJR/U1Jra2eEJkP4lTpoMY6zuE9r2R1tB2feIH
-wb3DR1zNSz75xRd0teFf/P6/BHKekuS/5gAAIABJREFUPD1lcXPD0WjaD/om
-JCk9OGOpuxJjzF2QJZQK+IAy8WFdYACpEqQSdE1LXULbmNB56RVxMiROcrHZ
-lL7tJHE2wTrJumpBRGSjGaiMKE25WSw4O5kDEGUpcVwAAm1ztCpAebwNa4vO
-CaI4JYsLttUca/p+MSWJkiGpSmjakso0xHGGsw2d89StC7d2dECRqLg3UEuE
-UHd9lreIhyjW7O/v44Wm7VpkFOC4TVsBMB6NaIzl809+xfXFOY/ffpM/+i/+
-G6bTCSdPn/H1119TFDm2bZFCsLe/w1tvPmA8HqAkrFZLpHJcXF5x9uIlm01J
-lhXs7B8wHU9JsjSsoAHhXDjOjexXvwED07X1HergdkB6HV1gzCsj+XfK4YUI
-CjEiqBmh8uNu4Lkrk5fyrp/v9ZqSW+VLiLDmpU8E3lUi3SUC6cMKqm+6CGdj
-11qc8QgbZoM4ztlsSs7OztluKrquYzqdsrO3z3CQEynPdDJkd2dC03Y01Rqt
-PFW54uHRAwZFhsShtbob+oQK5PXpdMrh4SF5PmC7aelaR5oOyPOYbdUgjaO8
-bT8QniSO6eIEZQ3lZosSHiWgbSoEgiJPqcotn/zyl0z2puRJipQBpVGkGdPp
-lKvLBc+ePUPrsOXYOzxAacnZ6UtevDwF4P7xAQ8evUmep1yenfDsfM7+OOHw
-4TvIqOEvfvZrHh2NuL835GAyQfsO2TVEUhAphTEdsdK0PgSIvLF4FdavSkik
-CkqjVPTNC+Fn6K4EGYn34j9rs/l/tEHq/2mIenf3j1ACcbV5wlf9uu/xa16p
-f/nwv72jlv5jBPQv52GIenv67139ffjVzd/wePb7fHkZ+FEa/1GghYQVnrcm
-MKXw/YsXwvC3D8vOepSWwQysJN5ZnL1NNoUX3np7ty900tOa4OPxMqJF40XC
-2fWam03LymqQOacXc6rWUZcWrVI229Bir5UmjjU3V+c8OD5imA+4vDpnNpsh
-hOD5s6cUoyHHh/eYz+ds1kts1wXjO46m3NI6i/TBwFyVJWkSoUgDuh9P27XY
-rsMZS9UZIi2JkHeG6q4LQFJnQWqFRCNkIAXLuzb2oNit10uSSKOlI9KC6WTI
-vYMZk2lGmkpWmxLhPIlMSNKIjYBtVeG7lkGaEWdDOqFY1YbKCnSU0qiIF/M1
-i8trLpuGF5cXPPn2OZeXl0ipGY/HJFkGwvHVV1/hhSOJM4bDMcPpDCkiQNKZ
-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
-fvgj7h8dMty/x6GF1dUVnz55ys54xGAyZnlxQZrG5EXMN0+fQNqSDHNkpJCR
-ZrCbEcUZVWtJBgN0kiKcR3cOGsv6fM785Ix2U5MkEdV8xWyyF3mzAAAgAElE
-QVQ6IlOCplrTVNsAE5SCzXZFaxxZPiCKkmCINeHmrSMQusWKjk21ZJiNiYi5
-Od+SxlOyaMbXJ5csLlu2W8lwdkhaaHRcUAzGHN5TzF+cMSxG6DgjTjuSKAqr
-3bZB6Zg4FQitEKrHAUThoW9dF1bVTjBII/Rh8LIkrmCcDVlfb/Byzvyy7IeK
-KV7HtE4xzCbsH90jHRY0TYOLYFGW4A1JEmNNzcXlBZ2pSGKFo2M8GnB0dMh4
-OLhblwvpWS03XK9WNG0bVC1vGAwz0vyIutlQtyXzZcfff/INgoijvTHfOz4g
-TTLOLi959OCQWFlRV1ufJJlQsffz5QKpcnZmCS8vNdsuYpCMyOtx6HdLY7JE
-cxTvMBpk7O4NwRu836JwDPMedRErlLDkeYJ1oeMsQEIlWulgatY6/B28BquM
-RVCQbGtpnblbndGv40IyK7weOlI0relLdkVPag9sNutD6a6Ok75DztE2BqUE
-cZqGQaCu7jog3S0kV6u7Nbr1pvdmyeDd9NyVyGNDtth17pWh3DmM63psRuCi
-Ccldgs75UHodpymTyQTTWM7bSxY30DUbpOiYTXZY3Nzwb//t/8b+/i4A7//W
-e2RZQjEaUAwSqLYhsYghySNa11DWMpRyJ6HAve0aLPDy8hIZZ7z17hGzvQ1/
-/pO/IioydqOUm4tLRnmMaxu8DZdna8P5jivY2ZlidUykJBJPVTU46zBNS5pm
-RHHCumxoqNBRxDALAYl6vQIhiKVA22BXaDcli6ZjNBnz+M13OL+65OTkhKZ2
-HB8fM8xy/HiIazrSVNPUiqurbbgw7A+BBulr9qdTqtrhTEWexxhnArtLCLyQ
-xCpGK09rLXVpcY4ATFaKxluwHUIGK4CX0FQbpAqAW2WUV0qBChDhzfZrrIe/
-q57hpfrYOz6cZA/uwmqfX/4l7+794X+SAemnL/70oz86/lcf/mNUgf8kZvNX
-NTB/xF+f/MmHQnkftF+JkF1Y4QnwBFaMFRacwQtI4wiUC6RUEVQA6R1CavCS
-tusQAjQW6RXaexzBFK2spalqhLdEIXGL9MEY6Z3BuY44Uggl8EpgCStH7yzY
-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
-TpbvGlolK9HMOjorq+yqqsiyApsVWGPpfKLxHU3b9pM/t/9szO7n1ZossyzX
-a7arNXmeo63kIHZdS13XnBwcMjkck3zDerNBpcigyPAxsFqteffpB1xdvmS2
-qojqAJXnrNuO+bZmlGscYPtr4W7molIaqxTBd3JSW4dKSbS4waOsYZjndKEV
-pz+xjx7qv7AUUf25L1mNLSoaAQJESaeI1kEwpCSDGMGMZCRrSNoQehuRRNIY
-gA9TUuJBlYsizdLnP0nGfqSU4rPrf3wx9TsrpJRSH5LAoD6+3r7+6BN+9gax
-vC+o+NX1T/n28Y/Vz17+BHTksHyX6+rzj62BmMKHKJlopB5f0EXRQeTWobTt
-WVESuuX6h2L04tKLKRJDJOFRGgl87W9Sa4oeyBje6IwSSnKWeuZJCEGCbJWI
-Nfc3bNJoY+liImlDPhwRteVmueJ6sSLLT+lMyedffM5yseY777+HzYeyWklJ
-HExNr8NSmu1mw7gcQfIULuf68opMG3SSmjmzDms1bQy0W8nIil0rYZ67Y6Lf
-gauUetjojgu1S+CWzyApLSTrztO0ntZorDZSYHnRq2ltSV2SrDOTMClgiDgX
-GA0V9x6MOT7IGY8s2jZsqxWYBpMrhmXBq/mCPBdHW5Y5jEnELtJ2G+puS3IF
-QQEqMJmO6IJB25zBYMAnP/8F33hwTG4TOkn3Rdhi6BhNhihn0SrsD/KdS/Fu
-lxqjf+M4v7sK2BVDezjfHTLy3WnVbo3BnQ2I7qF/Mfr95Etu6LR/MCSlKIoB
-85sVre/Ih0Me3DtlMBiwrhs2izl1G/hqseT1i5dMxgcMiwFaKfLcMMwM7mjK
-yckRVdNyfX1NZhXHh8cYFSid5v/81/8Hz4cFx+Mpo+mEg8GQar0hpsSwLKnr
-WtYLSdycXd3Q1jnOFhS5I89LFBqrLCk6lHVkAw2ZFDFVbBiPDtEqslkt+OQX
-L3j96gXL2Zym6fj0l59Dz40CODo55vd+7wN+8IMf8Ojdx0S/pa42ODMgdZoX
-z3/Nz//2c+bLhsnklLPXF8QQODma4KNivdrSNVs6YB1axhqqWEMS80LbtrRe
-qN5121AMSlyeExSsexSILXKS0XQpiA27rrCZovEtYT0nH5ZUmyWr7ZpsOCUz
-loxEtV1hY8n4+JABjvmq5vryjOEo49l7j3nvnQdMhg7vK0K7JsWOw4MRy7UH
-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
-GjK8bW5Gq6J1dfjVVoWDXtwAAVfaKO/VOjrG+MZmjGnynIIOYKXFkFI0YFTV
-FHTgRaBGO2casq4PP3MjjPUikNI9HiU0Wmm8qcNYXIcCVrjwfEJ6lIbKWozz
-yEafkKYpWZahdYR3CilgMZ8yvDjn+vyc0fWIebuL2Duk3W4jsNi6Il8ucOQ4
-X9PJWrS7HeI0obZBzNnOOgEommUsl32sNxSmZDQZ8uzZM7q9HtfzOdPFnMHW
-JkVVMV/mbHb7VFVOpCX7e/t0NrrkJmc8mzKajtja6FDWS7qdDZIsRcmIsrDE
-ScL9Bw+wzrFYLgOvSEmsc+g4HMrn50NEN6LVbdMbbFJXM7J2Gx2rsL4uS1pZ
-j52dHazUXFxfMStW7raMXhLjejeRZQAAIABJREFUJHTarVCU4FnkBYtFjrdQ
-5QWzyZzz80vwMd5Jzs6uwAvu33/M5uaARFvOX37F3vYexweHREoxrwqyVoSw
-NVfnJ6S9DkKqhtZcEydJ40oyPHj0iCcff8zl5SW9bJdKVAF0KAODR0lFquOf
-9NrywzSNkTK851VVBbOEKNdFRhzH68/zqtiK4zBhcAHgdLO28/4WKuEu6uC2
-8/XfAmNeX4fhUvN3ImisCV9fNTBCCFQk1yJz5z3e3Jklr924cFc/tWosVxNi
-2xR2UdToZpviK5hvgy3e2vrW1OF2bl+INAmFXPQ1iK/3PpzVMqRHyFVhYCxp
-HFhXASoKraxDnucsFguWywVVkdIftOm0WsRJdMuR6IAIrcIUWwmF1x4pHXmV
-44Wj3+/w3vtvoqgZnl6iBWxtDEgiTavVIo5jjPNMZkuur0ZMZwWfffaCIjfk
-VdVM6QS1cOsiV+oQQSalgkShnMA0Gw5T1yvVW5g/1oayrvFKI+IMnYTkCikl
-W9vbjCZjhuMJUkUcHj1gtlhSmTbWhy2Cd0GwpFzYgECYaolIIbVGimDiwgUJ
-hGsmoLVTYSIVqk20CI2WUAIvIryQDcxThgg0IaH5HpnEeB/eQddk6YZGlo9c
-bT/84wf/3R3c0rA4h6YR/ePDf/ZvDC2+tWz+Rn33f3SF1P/+1U8+Aslu+96P
-bzOomo5E1M566cC4JhWhcUatLowwapaoZuUmWQnf/NrRJzxNUniFqU1TLWvK
-ylD7mEgmGB8xKwzTomK6yJksFsyWVbCWW4W1MJnMabe72LqisoayWKKTGFvn
-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
-9ylrS1WZkBdWV0zKc9751gO+/PIJbz0+5uD4kKuLV+zvHjIaXX+4LAoG7S5J
-LGi3IjYGXexoTl2WVGVNr5vS7YbPUL4oEKnDa43AkSQJVVk0sEiJtR7j3Y3T
-zdk7q7X19KeZWK20mjqK7kxsjF2xpzTW1VgfgLLWgWz4Q96LO1BMqUImqGsQ
-Dc6JIChe2ajX8TBhdRaYfxrTuFQBhHbrzYEUIU4ny2LKsqSum6bYOmxlm0eK
-KMsq6IFkhPM3QN3Vil4rhaugsiXe2zAJjlSTkgHG1OSLCqU9iVDM8wnee7J2
-yI67un5FrGOOj464Pm/x6tU5o8svWS4Fb7/XwwoDGuJIU3uDz0u0c6RSE2nN
-xeklcZbS2eiDqbG2ZP9gl2mc8OTTJ5yfniOcIFIxg+6AMi+o65K93V20luzu
-bfHBmzt88OYW8/mcp0+f8vHHn/Ly5JRFWVPkQ1TUBdfFiILKJVRW42TI3UMa
-FuUSZYNuSiZhrVbXOXIhOd7a5vTL53zvOx8wafWYXU+w/Q7TZY1TKc9fnXO0
-/RjnDPliwf5WF+kNi+mEVqdLHLUwUuFkhBAxWuo1h8zbmlhKlFAYKbGxxmcZ
-NmtRC03tPehYbGb3/22xLT/+XWqJd7f+4C/e/Xf8//6uIuo/eCH15PqnX/va
-W7+jbur1iu/z5rFe112JZnS8KqI+v/4pzhmMDWLyEMYYVj1h122DtdKJ9XTi
-5i/BTmk92roGcR84OUYFMIK1jto7Wp1tTNwlaikur6e8OLtiUdQsyop2Z8Dl
-2QRrwqpHSYiT4BrK8znCWrAlWIN3VbDoolht6YwQqGYyJt3Krh94GKuYkhXL
-qChrlsslURRcgJWzTEfXCBHR7WVkLUlVL0DUPH7jmN///vd5/90PeP/dD8BA
-phWmXvD5Z7/k6W9/QasF73/rIa3E4W1NVQhqL5lOxwyHQ7SOeeftd+n1+7ja
-sRjPAiDTWZajOeViTrnM6ezuovsxlVBUzjPY36a7s8uTk1f81d/+DK8kW1sb
-HOxtsbXZR2OJRUwWK7I0rC1lgwVYWZ5DgKVbh5EK3zCbpG/owWEYHXbt7rVu
-m1tTRn9X76Qk4hYFOXC5bpmFfOD2+FAJhedo8oScUI3IvHksv8r9CpC4FafK
-rYtgh2vyDGncQpEM09HbGhepVvZusbIYhlDqFaRuFcERot3X60whBBZQWuCc
-Cg5EFaN0ipARtYFykZPPFsRS0dkYsLnZZ1rOuPfOIx6/+x6dQZ/hcMgvfvEr
-fvbrX7O5ucW7732HwcYOo3nJ5eQZSjq+9+332T++x/DinFdfPacVp6Forx39
-TpczzliM5yRKc2//kLPhmOVsycZgwPn1FXvH+8hEc3l9xsnpK/YPtun1elwP
-LxgOhyRRhJaCusiRKLpZRj2vub66IE03wes13FbKkPF48vI5m1td3t14h7ou
-yCLF/vYOnXab8XiKrZcURUHtDL2NDdIkY1lYJpMhpqpot1LirMXF9YyrywlF
-ZUizNrNFwWS8BF9QG0lVQpJ20KkPzZqzXA/PmY+vmU1HfOeDd9g/2KHX79Bq
-pVhXcXJ+yunlOXUjQgeoyzBtiFSETgKCxLsQJdPrthhfRSwWC/LSYL2itpBk
-nZ94pT9M0/jPkU5sDDp+XlQUxlEZRasBWzrr1ygArcP6b6UJtNY0jJ5mwtu4
-oYTQYf3cZMR9E4PtNp/q9by91aTcyxCSvUoCkPqmWQmYgRAwbxpdzsppKwPc
-CS9WxZy7m04g7+ZmBhivXDvYfANvq8oc64ImVaqouS5v9FtxnK6vV+EDyFmK
-5vW6G/l8iDWRzXre3nL7uvUUb+X2882a1PuwXne1IY3aHO4fgo356uVLnj97
-RekMO4cbRJmllUA7k7STlBTPcjjh5GrI+XDM1s42vSSw/wTBgFLVNaPJlGdP
-njOfLkl1ysHeIar5PY2uJ7QzzWJ6Sa+f0e/32ejE9N57xP5Wi1/86td88unn
-XIxmFHWFiAwq20CKCCEdkYpIWx3KYhJcvzIgFhAh9seZgEhQQhMrRTHP6WUd
-8nmONQ6pNK1ej8KMqIwligOk1FlLpjU2DmzASCWUQmKFRuig4RUSIiRGCmoP
-tQh8RCINSmOlxslIGAc/uvff/L0e9PwHLaTe+vcQm39TEbX671Ux9Tqs8/Pr
-nzKeP0e4GlOX6JVAW7jG2WYDAn7tjvi6qHIlVq6sCeGHLjB8kArnBcY68roi
-S8B7Rdpq8/Lzp7x88Qq8YD5folSbZT5voI0e5y1p1MLZknw2DUBOY8EZsGAw
-4YL0khoQBrSTWGTjLACcRFiBs8FWfH52Sa/Xo5VmLIucPM9DSLDW6E5Mu93m
-8vIMqTT/+I9+n3/yT/6Yh4/u00oz4jjl7KsTnj99Rj6dUOZTvnr6McvFJd/9
-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
-pJ0u08Wc2XzJpL+k206p8pLjw0OO9o7Y3d5jZ3OHX336OT/75SdcNVrWTr/H
-IhdcjcfoNMFYhxdhyhQpjZIemtWtlIpW1mY2G7O3N8DhGU8nTOYzOhsSaxro
-Z5LghaQqDSYLvLK6rnFKUCMx0q8j3aQSREi8cNTWUQuohcMIiWrycFEghPh7
-XUT9R+vao/FuKfjI+yBSdiYkvDsJkiZTqhGzraZOYYYr74opkU2u3U1aucPi
-hURECZoWysUIn1I7TT5bcnJ6iTGwMdhhOAsdc5qFqAZfO+o6p1w4FtMx1XxJ
-GmmEcWgvcDKIPgNBOHSczjmsCPAx4TXOB4b6ymkmJBwc7HNxdkpeLNjaGNDr
-d6mqAlMVKO344Q++w3/1X/8X/N73v8vLly/4+c//krKoGI/nPH/2imJacnF+
-xuX5Ke1UsL/3iEcPj5HC8vzZM9obGZ1OK7x+Y0lamnYvxdiSq+EVSgqW+QLp
-HPPxiOVkRr/TDZlitQmiTiFDFmKxYFbVLJdT2p2Exw/vUfkaKWqEBa1AC0dd
-zdFeB/q7C3oMj1sfXsGh6O+sErznTte7gmuuY2/kTbxEeI9XN4Kb9SBeNDcc
-jzeBsCwabYaQtzk5twsysVbW3r5JrT9LOoj/rQ9dr3OuIa7rsOZo8sdWXfJK
-HS+lJEriJnz7biH1dav3ah0T4oACPqOZRjmLElHIG9OaJIqItaRwFWU+YzQ8
-5+HxJsbmKFtzsL/JFy+f8+LpFxw+fMxyPiPPc6SUHB8f8/DRW+zs7fOXf/lX
-PH9xwmyxYHd7i4P9XZT3LCcLqvIV02mJANqRotXpYy6GPH9xyu69N9jc2GWy
-KHh1fsbm7g7TVzMWiwW9jQ5aSywGpKfb7ZLPJ1RFTVWU4D1lWXJ5ecn19TW7
-e/fY2jlAx10+/uwp4+mE5XLJcrmk9oZOnLG5uwn6DYaXGZPRBXmeE8cZKMdy
-UeCdYDqd0+pqWr0BeeWpakdd1lRFzWJxxcHOIc45fv7XP+dqOOaf/sl/ytHR
-EWmaMptNyFoJxuzT7mQ8uH9IHIe8tu3tAePJNbWrmS/njKYjIiUYDHq02hlx
-rAOLR0s6rTS4LQV4U+OtbUxKCklYyU2mM2bzJZuDnq8rI8oy56fTf/HRIN3/
-qfeeOIkYqJTNQY/lsgwk6IAyDOJrZ6lM3ThAA5xS6qABdI619ME4i7eA8+hY
-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
-iS5cq/FKodF4pXA3K7iUvLbfyMj38whciMpU5yXdpqYur7iY71EdFqTeU3vL
-sMgIzmFtANdCEl93IxXaaMpNCVJgUhUBxkQfLbaO7ynhen+VQSoDwvwQ4cJ/
-ePo/fRKE+tE0f4vw91jZ/friZ29EB/6x3iv18ccf/52/Yb+4x93J97g7/R6V
-XZHpMamefJLpCWW3jLtp5CdeqB8HIX8chPqxF/rHAfVjL+WHKPNLqc2HFgHK
-IHTSows0Upu4F+6rRhobmUJSRxnR+ohUiOXaXVSriJF5fPQnCeJhLnYQNyKD
-ROsoIfcKRJ5H0dN3NtZ99Kh62ZeBaqljDURZI6WhqjuqziOTIa/OlpwtKi6W
-a7zSbOoKkxiyPKMqV9y6s8+//MP/hnvfuh0pxUajteL2yS1++ze/j3Adqbc0
-qzmuWrO6fM3l6xd0VQk4ikFB07W0neXycsF8viJLU8ajEWmiyFKDUp7gO6QM
-aCNwLpYGoyTL1ZIgYLo/4vB4QpJB0yxZV1fMl2ecnj/H0rDcXJGMU+596y53
-3rnD7bfvsnfrAJ1F03KR5VRlyauXL9ksN4wGA6aDEaFzBL+FXEYZfHsEehGp
-qjIRmFSTZllUXrzfHSghxO9RUQy4urwkyzKyPGOzXjMoiuir89cU8RBiX9nN
-ahfX+6C21HKp1BuKk+yJ5dvDcUtl3h6kW2r4V1d+26/lXKBpO4J1MfXZ3/hD
-X84s+vSm1hIjJUqISCH2DpwjSUxUOX1MtWih+vdW9PJlaR4LeZsWqXRUyJSJ
-zxJJjKRvVlxeXvD69JS6Kjk4PGBvNqNuGrSOYQ+TJORFgUpMXMXYCLxbnF0i
-Q0ddrQGH1pFITIgYitFoysXVmjSfslxbLi5rfvaXv+T5iwtsSHnrve9ycvc+
-o8GAp4+fIELg/p07JNqwN5nElFb/0JEipssQgsSkMdUYPE3T0bZdX4cSQxv4
-qAYqlVAMhiyWS6xzNE3HarNhf3bAeDxkvVlRNzVd1+5qlkajCZPJmDzPWcwX
-VFXNu+++z/n5OZPJFK0Mz5+/wHaWVCX8P3/xM3yAd997j+Vqw+V8wWQ8xQeP
-0Qa85M6te2xWJf/n//HvuTq/4vDgCNd0HO8fY6QiTQxZkSFVoKpKwDMcDQiA
-7Tsis+GQzgaqNqpvm8UaFTSucyTGIJTAuo7gHbfunKCNjsR+HSPdnetIE8N4
-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
-mmj74MUl7f1Wr6rSeksZDd6Aul3IhM1Z7RzOB8lYSwXbZlLu0+SrbXsG1Yg8
-s3Ttmr7zZDbiXGC9XvPll18So2Z/f8Jkb0g5KBgOh2RZhvPd9nxTRrINhYWV
-tKLpV2NuIxg2GIbdc3BTFDoX0mNzEGuIAi3NjazSY3B0TQ0BymLA0q8kqmi1
-YjQacXx6wrNnz7i6nvLehx9weHTEsl1Rtx3VoER7x9XFNVqvOTw8pF63qdBT
-dF1P2/itJKHISvp1z3pdb7lqTdtSFhllUeC6jg8//JDvf/+7vP/+e1R6jV8t
-tgH1m8matmIIUjqhjqP8DFnnSlNujMKriPc9vQsYLCYTLmO0FqMyIHBQPdiJ
-h5OIlj/UadStQuq3V59yWX/9s6Pq0U+/mVfzf/XP5ms+PvwJ/1gR9RfP/8PP
-jgfyfVX6IOyKw1JB9dNvCsmu66dY5aOJUXbGaDawbIUBnaOtRpHRufpWPbK9
-aXND0N1c0BvtztY1khhMemuTJ7GFxGVglWY8GBKDRvmCgADm2nVN35M65par
-y2tGR/uoMpORru/IM8Pp6Sld3XBx8ZZw/g6tJRS4yEtwPX3bYnY0O7/PtrsR
-Se7C6jbRFc45rN6km2/gZ2kMvZH4Kb2dyN1itGiN0RnWymTN9T2oKCN5u1nd
-+Z0iKHXcSsbzG83DxuW4az/eFbxLeLH/lpMmppRxW5Q4JyNtYTilsGKt0Bk8
-/uAh48mAN2/e8Pz5S9bLJXfunDDIR6z7BmUjJgi3JTqPiQplZc0SsKzcCkVM
-HVNMKz3RX4SABNpit85ECUMxoAxBKXwEnWeU2gpqLPHOu66jXzfYqFnMloQA
-jkimJetRuUDTegk5LYaorGLUgS57TFayCobZbM0XL1+ydIFgMuJgAg4u65rp
-qubl1SWrvmW8t8fe8SHXqzmvzl+RGcXZ6QloyKO4vgZlhWs7dNLPERSxabaO
-pyzLbl1HGyF1XmQJb9Bv3rQEtMzICqGSa2vJ8pJ129GHiM0rinJM2zl5LVyg
-buU6f/3mFZfTt9jCcni8T5Yr9g4njPcHHBztcffsGFvItVgMNF1s0VZuMiiP
-0gFjDTaTiUVZ5inySXRx4grbRIwEgq8l0015bBbRuse7FbVvCAGqdH11nce3
-XkJzNUz2Mybjfd5/fMb0cs6rl295++aC5xczCjNkb3DAsJxQ5IbMGFwM1KsF
-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
-zjJxF032Ki4uZwyKCVk24N3Vki++eMqvf/uEr1+9Y7lYbR934wJ1F7iaLTm7
-d8zDB6ccn+xT10tGwyEhdFzPrmiaFWVeYDONd55iOEoFtMxMtdZkucBMY4zo
-XslqzGaoLCNQ47yHrqP3gWFRcDmdM6kOGI0P+Ozr3/F3//n/oK47RuMDisGY
-+4/fYx0Uv/rstzx5c8lsueRiXnO5rLlz5w4nJ8eMx2NWyyWvnz5DhUieGZwL
-/A//3b/l7OQY17bMLi+o6yW675nkBcOsYLVsMSiqvNgW2Fmavmzet92OeFcn
-FULgzZu323VX03SioyhLlNb0wTMYj+i842J6wcs3z3k3fUs+tNy5d8bx2Zh7
-703YPyoZjMFkDcE6CiV5ft73KC2f1S6tfvveJy1Xg9GBqtTpevU71wVbh2We
-V8mhZ265QZUyZFkhN+TNVNNHus5vw6SNsXgHyqacvzRJ6ZTHO8iCrLfyPCez
-hUSktAHnUujySLAPP/rxDxmP9/j13/6G6eJSbqCDPSqbc+/4lNAJBFXFSMzk
-+7VtKyBUIof5IaPBgKgUvutZeY+xllE1YNWu8J0j4MCDb3va9QrfyPfbG4x5
-79EDXCcUahsV++MRrizwKrCazbF5js2FH3Uw2t9G1wSjePn0a168eMHj997j
-B//8j6iGJW/evaVerjg8OWa2WtIHL7FVfYNyChUDZVlQFOLII7mYURsUQcJP
-eIVV4AwJYLs5Y2TNo+LmfNuIY8O2YPZypEvhnoKgY3LjGZPhXE/wMBkOWNUt
-69VS9D+DAUVeJYSBo297qqqibTvqumE0GjEaDXn9+jW/+c1vOT8/Z7lYE6Ni
-MplwcHDIo0eP2N/fZ71ekRWavLBkeXLmWZVIhLKD2UhHA+LE3ExbNqaV5XKJ
-8/2N9lZzy73XNN025H333MuyDI3BrzpUFO5e7zrqumY9XzCbLVitVhRFcloG
-z97+PspoOtczGI0kjkkpiQE6PGS0N6FZL/FEMUWkBjwEwTfkuTQvRVExv56z
-XK8xVpHrXK6/tIrU2rKqO96cX1DpQK57CsbsDwyFzYV/qAJZEYmqQ6e8xxtv
-vt7+Xn5+4vNtNl9pveu9J0u8REUQnauOaarnImj1i2f/c5LmKL68CHy4g2dS
-O5yp/88LqWnzVCZN0f9MRf8JyJjWiNcHlRgf3nUp4yxxPpQW54JS6G1hEDBa
-xMgmiZNtDCS1HipGTJRwWN/3uE6RVQOUN7jktsu0SvoU0Ths0rBDAiiqoFJg
-bEjclm9OPsLOGookKAalby7kTbBuCAqTZ0TtQRkBgypLQKZSzoPJc7LcYIsB
-i3XPi1fveHJ+SYiGDz/8iPEgx+oe5xzDvML0NToGyjJHe0VbN7iuZT6bsl7X
-NF2g63psljEcDEWDtQOs3L35bf5sV8i4u75TOlKWOS6kaRw3bifnPM51FHmO
-0grlHTp9WDaZSEGL24TUZSoVboknYwxkWXHLurvZ53sX8E6s35u/uxH6ex8k
-92uTcRW95B8mE8B2NJ74MLYQdwrAcDgmeGgbx3g8ZlDlZPmIeh343dfn/MXf
-/JJf/uo3rFYtRV5xeHiIItCuPPPmgpcXU07fXHK9rPmgucd4XKB1ZFANODzI
-6doV0fUUZU4+GHC+WhD6Ho9oFrSJBJWRKwkp7XxH1zq0thRFJSsnF8BYqkFG
-1wf2JidkquTr56/5/IsnLOua0WgfAJyAY39bllSVJRsOYd2BzbhezHny/CWT
-wxN+9KMf8d7jRzz96kuefP5b5tczovN85/33+N53PsSi+OjBfXzTcL1a4FcL
-eucZViXDyT5VWTG9XCTAZ4EKkboWu/VGhKu0lc+oYSsy3hRS3num02smkwlV
-OWS9XhO8OKG0NbTNmhAjfeiZL2dcTN/SuBX37z/g/e+ccXB3yP3HI8g6glnT
-+Dpp7DoiTjQbSoTCJspkNbcFKtt8Xh3WBrS6CYo2WmGNluw/lZxckWQWkUNY
-PieCmTBKwpoDIpj2qbmyNkNbeQ1uOD+OLnT4EFA+QBfwOkiAbCXTAu/XEpOR
-aQqbMW+X3Dt9iFGarql5/fVb5pfXNH3DBw/eo/dyI1GZInqZVBqdAZplv0yO
-Jg1RijlEASGaNBVQXj6zFkuWlZhgacue0EX6tkNXgaODQ3zX0bqW9fKawXiA
-zTTLumE1n8l0f1CR5RnjqsQaRdP2tMEx7SP1csUXv/4N69WK7//gB5zdu0vX
-NVxeXmEHJbmxROWIIbmrYsBoRynwmM1mAqNEqxpDMjYohS0KTEACZyOoFOgt
-i4GATa5pUri5aJgU4HE+UBUVtA0hTcszm4mmJmpi6LZk9DLLMXkhgNAA3nm8
-8yhlmM8X5HkpTW0IfP755/zd3/0dr169YjabcXJywnuPP+Do6IjhcMzp6SlV
-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
-huyRvj40byxSGYkQNrCL5NXSqsghIPJ91COExmQIqwuWGJJgEoPLnt0yDauo
-7wB89OxffndvcOc7vzKK1EfP/uV3hRDf/t2HfyAA8dn5R5wvP4syOmLoifRp
-L565soSNjUxCsPkUlwonBREZ3ozEb5qhQ7gGb27UkKg0Rlfp5BYSq8d5kRlD
-iekTQzb9knklqNTTFhJnROUP7fWglZQbnW/czr+5agoxy9MbSq2WuJATFlEi
-dUkpC2xUWB84PZvhzAjKCdqUnM8b+uMTVFWzt7dLjJHd3V28sPjuimJQMNAK
-7dYUqsQ5R11X7NZTdg5uUw0mLNd9gg72bluoe7OPafOzaK2zsU/8gkldyiR/
-KxQhJkrsxlQu80PXubAFA25l10wVVpnf4rfk4RxJ3nJi3oxxbwapa+9WeiDZ
-4N7ostskNjZ4i+Qz4Bf+/+jTmc0URaKRywIVI94GSqNZrXs++fwL/vKvfszZ
-fM1gtJMiwEXJaDgiSEUsSqZ37hBdOgGXSqZk23pB6FtE6Dg+Pebq0lMbz85E
-Y5RHac/B3hhRaLreoYRK/XJZ0Uw5B0EIHtv2aVgPAm8DImq0KvE2cnlxxZ/+
-8V9Q6hF1Pebk5JR101MNhqiy4uxyRlkP8K5D1xXvfe1r/OY3vs7/9Ed/RPWT
-CQ/fus/Bzoi7d28TsVxcXCBEekB617JcXSHrVPDbzFZ4FynLAU3fYXtHPZpC
-FDRNQyCZxHVImIOqGmTVyiO0wnpPZ+12fRyjoG1b9vaGSBlp1n0KRpSCsqxo
-+57ZfMH57JJ6p+Lo7i63jw4SoXwo8arD+iaBMyMEqxEiBz88OCRg0VKltK2R
-2yLsxBUCrQvatkelHXQ6yTtHQCMlSdUKgqooqEyVPj8kw3bMpbXEhOxw4Xqt
-nxLAjuA6nLdIJSh1kblrERdS2bkxKtVTRIkTPpuoRa62SBUly+USZyPFoMK2
-nuX6iqNb9/jqr7/P65fnPP6bV6zmlrZ3HB3eokhmNIwpmezsMpvN8Zln530q
-8Uwcs3Q9TCc7Wwht3/cIoaiqOhX6BncDdZJ9iCFxepy3rJtUfyTytSlUpoEL
-0uFASa5WKyaTMdpo+mbNwc4uv/1b/4DXZyf8xfc/IsjIaGfE3t4upVb0vaXv
-WySagVEYk5yVGxRIgqAmnpNWCi81UiRFd4NOeWMAybYDmdN2zsdtWEDrZGze
-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
-NUfOKHJWYgiqKpGdxEJMIzEFUoKsC5WtxHCWMiHlWZ+rBYSdE8r6UtDc7H+r
-/rj7FKUUF4sPAfj19c8fCqlfPhJ0//BvkTFz+PWrq19w3X1diuJnAOftiz/8
-/5JZ85f+3dc/5274FFNCSdOeYdhi8kjbNlgSXT9SuVr2wGUuLZSZZzbC/Uj5
-ocOPKc/iQkMqME6JzaZnt91zcnJBilA1LRfNKbe7EWUrQsjc3m9pFkua1ZI3
-t9dMObJ+csGm37KwFZttxwcffEBzdsIQJ3pbMGVivTpjuHnDfr/nyeUFJcPt
-dkOcRupFw6u3b0kpo1G8fP6MoU/88le/Ybu55/nzp6SS5YI3Gu012mhKEo6M
-xsg6QTlCmMhFYius1YAIINva4W1FzIkUEqrMIZHKC9hMZwojh4+hjFft7Ayb
-7dLF4nxF5WZ2koqzrmxgO+xIqRBCIkziblkvTmSVMEclpFGCOBf1Qpg3JWNz
-YCQyEpniwBRHxrFnu9+Rpszl+VPWpytqvST1itRrbq+23Nzcoq3n7OwM5yqG
-MbCbBl48e05Fy+nFCcMYeXu9ZbFas9vtud9KgaFMpjJQtzX7EJhSoK5r4tix
-aJYYYxinwDhOMMfujL1oSaqmxhvLfuhR81Rx0SygFOq2FT3Y9o7KW8I4MIXE
-hy8k8NpoS7fpcO1aKOghMTHx1Vdf0FY1m+GGy/US5zyx62i0Jk8Td1dvRXSu
-LesTmbL0+05CX7WmquXAvLu/RzvNslkdxaRVU1M3FbvdTqZWTXPU0AxTQMVI
-4z2+XTLmyBQ6YhINWS6TrM9LZIoTVd0yDR3OCng25Sg6Ex3Yd3fCcyFhm5b1
-+QJTw/U0kIYRbWDc3nFxeoGxinjTobOh0RVeVZRGMYbCr371W7Z3O04Wl6TJ
-YGg4XT3lsy9esVyuGUNH2HS0jWdR13jjKJMnJU9dKcLUYZSmcjVDH8gnFev1
-ivu94/zpd2id4ZmOFD1iG8M0KbTXOGOY+kxMQhM3ztCuPVENDH3PaHqmKaHc
-Bc9ePiHcXPP29RvWL55wulzR7XpO6hajLDH0s/i4p67XvHjvjP/n/+4hF+KQ
-6fKEzhXny5phf8/U7UiVZRsmUhZ9njEa6w1NJQJyZYR+7quKerkgpcRms2Ec
-xaG2Wi7fpdnPxdGxSJpxAF3XHafLh8gYrTX39/c0zZLKtygdCXHAuMKUFXeb
-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
-27dv2awWbHzi3d0dbrGiXZ+gXU1IsO9Hpv0WXdVkH3AKTIgc9lumMEGMHHZb
-KXqjJwV53qySmOKU5qSMMsp+xGibpum9ru8McX3sXjuOcskP2sfCYcwpHaNd
-FoslKYjWSmWJNk6lkG4qJ2gENesx45FDZbQYuMI0oZwTcK4T6nkIgZjBOEff
-7fBTRquayrrSNUpolambmv32VjL4KkPjVvTdjto6fvD5p/jDntXC8uLsEy43
-KxqrMQTC1NH5QO1Eb1bpikpV8nyVqYFWVsxLUREmiYDTc1dvnEiVparbL4Qt
-KYWXVg8w0z9/9/PfrI7U+VKyaW4Or/L857+ue/b55d8tf/q7/8p+kA/ekC9u
-ui9lRJATSYdMcfShFQQwaDKT3DQxPMyxyThdQJ4pEVIiey/FQiidrPI6urSb
-XWXZbwdUMsWdIRX64/HHMPRQOm4OTcgI+btEQty9eUeuDCnIxjVNE/vDAVc3
-XF1d0bY1MY0MfqTvD/ixx4dItqLzOYQRrMMsFticiUrLiWoa8ePIx9/7jN/9
-rR/w5es3vHv1Er1Z0zSt6HMWNQlPdAJ8MxpUSEwastUY03K2aNEh4coJJirN
-eNgzac1tt6eNlkUMVKZC50cOlv2e7XbL2dkpyjQMfuDd7S2LzYL1Zkk3Dmxv
-brk8eYpTDmMmnKvZbve8/uY18eKC1WbFbndgmHp88rTLBcvlEhUD9/sDL9++
-Ra03ZGPBVRgyJmSUtWStiD6BVQQv2U91XVPVTlAVfmC9XGBPT+iMJaDI04jK
-HKMVzpqay8tL/DRiszpamklZ7LZ5+knV1MToGf0kFmEFujHoZEgxcpj2XDy7
-YLlq2b7b8fJX3/L6m9dUSvLDUkrSCYtCmTbGElPPNPnyfmwL1boui6k6BjlL
-MG4keR7F8Jj33DzzBpnzwwhwFiDHGDn0h/fwB/rRSOfxrw+1E1VVSYfR2GPH
-ShmorENnjR9kFCrCdgtGTpWGh3w/7z0+Jwkb14IswVn5vTw/xhjCMEHIJRZG
-OsSVcyyalv6wI42RNEUqY2ldRW0M2sjILMVIIrPv9rwri/rJ5SkqwN733Hf3
-rJ+es1qviXoF1h0J78lHdvd7lotTmqoRUWsKxMkzHvYctjtOr8/RGHHzpixa
-uhxgjAJoTBKArpQhl7BjXVIKjAGTXRm1GYxxRC8jEYMphHJHCGL7t1nTLpbU
-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
-Ki03n596TFPhx5F42GOun2IqEfBmPxXYXnn41UgUfjBWG64vLlldnnGy3hBz
-oGkqFk7Sy2P01LaCHIWN5T2pk46CsarwSBRujqTQUm3H8cCh3+MPkbOTDbe3
-t2Q/sWmWVFnyy0xMVEqTkmhLYsFBzJvtrJsxKBmbley4QCojNEPMoFdLyJF2
-vaEtD/CMjDAqs/bX3B723B86TtZL4QJpOXlPo8cnSzd5tr3Qoy9OTji/vMQt
-lxySl85USoTRg6s5e/YcU1cs1yu8seiqwishpseyEeQcUQlcyZWqqgpfRmOz
-luTu7o5dyvgzxaQN0+RR44jO0rWaklCY7+7usFpRG4fJNZumgRLSnZJgJKpy
-uktK7o+YhLBPhv/5z/6+SDytIRExqmK1WXL9/Anr9Zq/6P/s2AWaYY3WWtp2
-AcB+dzhqpIwxNM3s2JGFZb/fM4X0Hn38O8nE+cEJNLua5sV5fl/ma/9hZ2tO
-pZ+LuiNjKKvi0BEx6ZinQiE23N1uubu7Y7GpyrigOEKOESOirQghoBpbxhGB
-cRCOmq5qYs7UtYyNfS+uxa3Z0Q0Ddd1ycnpKvNkK5NZWtK5CJRn3VbYihIkw
-TpKh2UixMgFj36OVYbE5wY8D6/USrS0+C/1/f7/H1SvWyxVNveTm7S2kiD5Z
-c7ZpqI0mTAPBT+IkQtAoWitUtugs1G+ljBC/VSaFxOS9bFpKgrlTyGgFTbPA
-4YgxU9mGNGlubu5ICaZJBOJ6jgkJIhquSldwHKWb2/c9ywKYtbZ6jwP1+Jql
-zHubslzrAmwFfCw6KK1QwXCxWmL8LFQvmruc2O623G3v6cNE7yfG4BnCyDBO
-JDTL9Yonp5Kx9unnn/C9H3xEvaiYfEd/GGkXNc2mxtSGkBPJRzDI2L0UgiFG
-tDGolFBWuvrzlCCXoiGk8GC5L05XLcNJgTWijg5HLcpvKS7RYDVjnBij53Do
-GO531MpyenqBGj1vX98ydSOVW9G2ke999jnXL57xzbtvxbFK5snZGc1ySUyJ
-/rAne0tbnVA1CyAxhIAhQUawLKVTLs/j+wWSUt/NcvquAmoGQ0cfBNobHjJk
-ZfRu3yPu//rXapEnlJHo467zhy7OD3MAjz+X1uQ4CoRWQQyRKU6AaI21LRqt
-UkjpGIXBZj1v3r3+4/P15W/nFAXoiZNeUQrCi0oRrSLKQEpzKsADBiHlQEya
-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
-LVBPheEPeA3zyMxxOv5+WmA9PWTMiISHoukxGV3y0U5iSbQWjaZSBcxbIm+U
-fCKOgvQoh+OcM6YyGKXQzqBxmCSQyBRgTJFcWVQZdTvd4hYtuqsY+h6i8Ah1
-3VDVHaPpmfqenZ9wlUFXNRfPX0COxKx5++6afvTYyrFaJlCGKSbOLi/xcWK/
-2/D27Vs+fvmM1bLBOct6vaKyhv4w0Pfj0fHYj+F4YLq7uyuu6ih0+2kgKU+N
-xY8HqkbROtEEk6PEvBAxGno/0lQW7aSjNE2ZKXiJayp6z5yecr5mh7tE8aQC
-6jxqP8uhcBadG2sLj88wpZJbaivqtmVU+m9tEfUfXCH1rPv4mPH39PGPPv8n
-6s8//JhN/1OlXJOVa0g+4YOIDPXJc2Wem8tiJIJjH5M0Mo2W/DRjynw3Ysiy
-0JOpnaVyDmck1DFOIujd3h/Y374lAh9dLMh1Te/32Jz45MU5P78eGIInjT15
-bAgpcfA9i2XNcr2gbWU0sd3vePP2HVXtOAwTwzDQdZ1kYan2GCEgdnKDwpJV
-JIaMsdLh0VlDwQP4lAkx8OLynLzfoUYP1hLClt1mS4hyY1ZNy+rsnItmIULd
-bsHmsOPdzQ03w2uuPnmGNQofYPCRKUkHTSnJMsop4fuR0HuctZwtlnRtTdr2
-7HbCtXJVTQyK/dRzIGBWK5pVSz8OGKMle0vobyL8P+odMnXbsN/v2RVRftd1
-dN2S5XLJ1dUVMQaa5o7RT0d79VzIWKvJ2UvBfMIwmjeBWAovEmgjGUxz4Ofc
-83zoTqmvd7NyPmpNHlxLs/1eHQ8AMnhNIsos41+fM7GMLlLIRB1o6pblxZLl
-xYLtfs807KUA0BlUKPlQhaFTRpabzT1KQV2EoSEEXKWLSD4XR9fs6JOcq0zE
-KNGWVLWlHzKVM1TWMYYRaw3rbsFm2HD7/prN9ZYXV2ucNewHEb5q19IsJcZn
-TEW35WQjm6aRcRxJwLo9Q+fSDZq7Ikas18dw4XLSnfPU2oUgH8axL4U7R00G
-kUduyWEYHgWg55ON2NpanLwxghK6ej8ItLWrOokfqSpUDLTNAqs6GPZ0boEK
-ivev32KzJg4Tu+GeHDWNq3j++SXPry5Yrxe8ffclrz5/wbI7Z3g38v7mls00
-cHb+DLduef7ZM9xSQLdj7CX7Tylq6zBWRq3oUjhY89AVR+GsZhpjycrTx9VM
-FUfUXGwIrDM8ctDNWiSrH7o0M3XiQYxuvjE/75Tx9E1dn6eF0lMswjc5WZ+C
-P0+7R6dQzscO2yBRKQVEO3OxjvdfiEdqg0FhsyIpJSRunYV+HoMUokqSBjJG
-4nNKuHnTVIRxYooepzWucbTunCYuUUox9iM6GzyaPsFNP6Ljnn1/QPmJrrE4
-Z9BNg9IOkw11t8TUHeOUePPhLU3T8PFnn3P99itu7j7wF//6r8h4Fm0rsOck
-hqSQUwlmT6I1K/uV1Yrd0LP/+VcYo2i7isW6wQRIKtL3I2GILDrNclHT1A0q
-iuPTVYUBWP5mbQXmjEpH00cse2LWcuCQwloOlJOfHnUN5y6kMhqMJmVdCs7C
-bLTi+LN1halqftmBm39nCqn/J9DEn9/+Kd979rvA7/Inf/3fk6oWlSb6YWT0
-E2d1DVpEbionKDlSpqRj5+ISExGmKYmRCm01VmfOXEtSGt/3DIctPmeUcazb
-jrpucTEwOqFyZwf7cMCPB3Rdsa5a4vkZmyGR/YQjMo0T/X7LYVljrcRaTNPA
-fr9nu92yXq+lY6bg5u6OGk3MQUIiCw1pLhaON0eyaGexyhCVJk9SNCZgaipy
-rlG1o4oaqop4fc9hGvnw/pq6blk0C1ptUbpitVxx1jYc7jb8/O1r1qsW01qs
-a9AY0jiKILqEQ467A2Pfk0JkYSu6RsJYD97THw5cvfoU0zYMOTIOE/fjDu8c
-C6Pp+x6zbIXrlWTkE/BopYgEYlZU1YqvXl9zd3fHarXi4vIcgO1+JxuuH0/y
-nU60GEZTNy1+mI7MqMebQSLnIoBVkZSNCG5nl9CjzSU9/Huev6C+kXujtRGm
-CumEDJwlwkUy0mXBjAmDwlQtKlGI2nuM01x9dME49rz++TtcW6GVQ6WM94HR
-xzJanUgpMA4Dde0wbYvSGWsUOcqYIcVc7Nyi7UopiFYrBXHrlQWzqmQzSGFi
-v9uhGkfdtqy6BW9+/hWb6w3T/gXNecUQhc/UtQ1117G7uWMYPbv94eikiyUy
-JpEZ1IDTDlVQJCnJmG+aJpSX0XCMUQqvJKyq5XJJmHyx/pci0D5s+pqH9Xns
-BxkvORlBzVEWBRzHNExMIeJsxegju8OeqMF1jVD1h0FCm5Wjsh3LegFJcfvu
-hp/+5c9YNR3r5RXni3PqaoHTNQZDP+x4++Etvd+TLVSrGu4V9+MWS+DFxbf4
-7DvfJlcyxpuCp4+epAKVsQRkRCKsLX905c2HE7Lkk83dAYFwnhbv+QjafHDw
-5UcjmZzNL+QzzYWPtfbo5nvcDZLrLWMc+dw8ct9l0YVmYnHDivBbjHS6RCRp
-yOZrRPTT38U5dxSZz2vbsejTufx95fdVoCjoh1iAq2j5XYxgJUwWensu36uV
-lrFyyAQytlyjrAozzmomLwR+iamyJSKrwlpHdAPRJywaFTPVbi0deO/p91tW
-SfhNS1thF0vi4Bkz7O52XN/c8fb6louLM7792Ssun13w5sufMfY73nx4z/nZ
-mu1OeHjJgw/i8J2Gid1wwKdM27ZcffwRXddxv71j8gOmbamalshE04puy+DR
-WmDTISRUkoPlYrFgnALjNBEVxX1eE3M4ShqkqV5SAo6YDU4Aqw/VkCq5jMbK
-qLAfgsgqQkRXNbYp4FDAew+2+lUh9cvwOO1E/dX1j4/aqLldmDI/+sn1n/z4
-+1d///eVa9Riuc621uRhTwg3MtNNCaOk25CTtDRn/oUqxzSZNkdM5rhAaQ3e
-y7hEqQJYnD+sw54w7Kmt5mJ9zhQibz5c48eR87Ml1dmSoA2uXtNMmRxHklZM
-04CfBoZDj3GOze5eKOk5oYLCHixnZ2fUdc32fkOzahnDKDluRmMw5BIZYaw+
-bvjT6PEqYDAobXG1xmTLXejROlMX8XbjBPo4bg7kKbC93/D29RuqqkEZzWqx
-5OJsxW+8+pzaWbb3OxwtrWmxVYPItgM+yOLtx5Gxn0ghoJ2jtg5bNswQApeX
-l5jFkvt+z4HM7TTQ7w/U0zkxBHTJZ5u1RrkUgCmLs24qRO+5Y9G2LZvNhpu7
-25IyLl0J0cM05Wv6uAH7p06jJ5qm+bQvY6dUTv7SRSrDX6FIq29yLZ2ergsb
-hwK2y5mUolDBs7yaPp7+SsQMmdZYpWv9o5im39sd9nSmYX21YpouGYaB63db
-KYqDjMuMsdRVS+Va6rrmLgVi8oQgeWdKm7K5SSySNVbiNWIg6gJaPRaGEVJg
-0bYoLYXtMAzoLCPrytZUqub+w4abD3csV88wuiabEdfWtJVle3vHdjig725R
-RtEsK8FrqEK6zl+PBckxEsrG3HWd6NnGAshV0pVarVZCnMpZwKr6cedv7izO
-xPdZG2SedD76cZARsc2MfmI/9FjnaLuOEALJqDJ29izrim7dkHaZuw93bG/u
-qEzDqum4ODunNi3jGCRwehpAJdZXZ7y9fsNP3/6UIY5cvLzi2UevuPz4Obm2
-9OFAipEperLRVE1L3VqiCgzTHmdl4zdaYY0kKogET2QGTVWV+6MUE0mf6MJk
-5CcmmFKknHSthD3nv1a8cOLQe+o2fdRRMvK8lNOjLtJpd2nWTn1Tt3bOZvum
-btVclM0/9+kIcF4L5kbIaSF2fC2hSmFQ6JhRJpf0K7nPjTZYLWHeU46iATJi
-7acca0JOpDJiV07csp7IFAPkyBBFT6jriu7iXETZmz3D9p4hTCyuLgnjgXeb
-HWrbczgMZAxGO3of+e73v89+u2HvI8+XK65efsT9zVt8TOz2e5yMQ4gxMfqJ
-hGYMXuDMWjMCpm5YXFygaseh32EqwxgDfjrgQ2a5MCzbJUZHoj+QkqetHOv1
-CmMdQ4hMPpCCdD2V0ZALMwrpjOdi1BDNnSpj1khVuXL91dfI9gDOGYw36PJe
-WWvRTjqHqbzurwqpX8YO1ZMpy9vdlz9USvH9K1l8jKvpGo2ymj70JD+Qyoxd
-zQLMYgdOmgdhc5a8s4TAGo2W4N79didcDWdZNg04YUTt9z3Doed8eYZKHqdg
-2Vlsa6jPOlTnmHJF9oqVqthVFX2YZGHLCZUjfuyJMeJjoFstqetauk3WcLZc
-yUJkoZ8GbAgslh3GGfwo+Wi1q1BZdAYpFDGzmfUGMKXMOI00lSGXEUCtFPVy
-QWUr8mFk5ze8f/uWuha43Ic3cDZNXKzXrFa/wV++/YKgE8kHQkxoJL8MxMpe
-Vy1j3oil1gowrmkaGleVmbynWxqcqzk/v+TeT9z5XjLPrPCslNM4q4ma0snJ
-5eRj2e16Xr16xWq1ou97xsHjvWcYBna7HSF4Dv2OunZ0XUPdtuLYOQpky8Jr
-5g3kJGH89ISsnhRXJ5oesZtz7IPMQl2lFDGmR3ZxpR+Agrl0ZUSjVVBgJ/yb
-nDNTirlS+r/U1vyeMoFEBJNYnXe8+uxjhj7Q7z2HfiCGzKqqWCxbnKkEC+Fl
-jDYMB7quE9H5NAkzrK0IUZhjZIFxagMWI2ORMtpcFtPDoffUVSWdzGFAN471
-csXt9Q1vvnzDy1dnNIsWGwOukLpdVTMceohbuq6lXbYCCVWJkAN1VaO1nF6P
-HVStcYXjpZLEymDE2j0MA0ZpKic/20eJV5nNA6ei6VSKZqUUqgSTqxMtRwzS
-6YpZ9HeDnxj9RLda0nVLdmFE14KNSCGhMnR1o24+bPLm9h6rHefLNY11Mr5Q
-wqGz1rA+W6LrNTe7t3y4+cAhDjz/+CWf//p3Obt6wRThenODbRxZJ6KWDqBx
-BlVZVBIWlqsrdAzyN1uHzZqExL8Yq0gmFeCEQGbnjqlRUjIFH46Zn6J1eegc
-WWuZUnhSwBQjxgnf6Wm0y/xIRSOVH+X58bXC67Rwe1pIoR7rnp6Kyr33JzDR
-hyiZ+Xu1tsVo8bggfwB1SrKCyrOep7CvSiafUhGdMmb+/tLNk8NrRJdRs1IW
-VRkCcnhOMUDWjApBz6gM1pCbGpMSy9rhmprKaW4OezabnXyOoqLtljx/+RHL
-xZrLy0v+4s9/ws3mnhhHrArYtsapRMqRMQWaFBmGkd3Qo1VF7yc8Cdc2pKx4
-e3vLkBJVZZlSZLfZY3SgrhT7w5YQa6xasOg0VV3J2urEiDQGX2QTIpkIJzIK
-CRcuYFslaQ7WyDUNWUwlD+9nOmqLpVspY7yqsnRao0MkGwPWlj1Uo6wtn9x/
-O+zR936BnOdXhdT/y8evX/0uf3X940f2yZeLT/7pzfDm9wFS8IQYiNJmknws
-raXLn3myKc7uq1msKSfTlKWI0k6Abt1yKRvVNKFioGobKmsxXUtnLU1l2R82
-OFfz6uMXRA3vN3fsN3t0k8hDwuoOmz0Ece8ZSkBkMiyX52x3OxbdGV3XcXt3
-TYyZrutAZfb7PZPviSax0AbnJONJk6icaKh0gmxjEWNKN6ifZHM1FpxxeG3o
-xwEXMme2YbFaYGzFRdXw87/+Gdp7SJnb12+4f/+eb3/7c84/fsF3P3nF+909
-H25vGaaIskJet8hIYNksmLRFB+F0iX295dC11PuGr9684RJNshqzqIShMsjv
-b7VohXSBwGUNKZbujdZYXeHHDZ9/+il93/N//uQnbHf3KKXouoamqXnz5pZ+
-2KL1AqVrmspJtiKKMPljffRQPJW+UFYYBVmZsglrwUzkk0q9MKfy0VM4bxpl
-4VGGmKaih5qLMlmAjzZuTgJe9by4l5+gRIBvjP5vjVLoyjH5RPIjpjJcfHTF
-515x8/6OECYOhwPGilg4Bc9w2NM1FeNBBNR1VYFR4t6zhs4aGZGFiDKWioTT
-Fp0NwURyTGCg7mryXq75oqnxMbAbekyyrNszXr/9ipsPd4xDZHm5QOeIspmQ
-PNWiZeqHI+tLBOaGkI1scNaAehjpSRTGg5g4hCD2d+ckm28S8XZbN1R1Sw6H
-YsEPRITNlYnF9iiBzg+6toTKGk1xFgZPKlgEZcoYncSqrtBtjd8dyIV7lEPg
-YHoq1+bN9R33H+5EmDwm9uOe7OH8zFA3DbEPbPsdw+7Al++/ZHHR8lu/9mu8
-+s7nKOe4290RkqZZdNjWigkiSBduihEdJeqltvVRoydmhkIuS5SwadHEZTV3
-bspBoAjCFeZ4vQQqLDT/o46lFE6nBUjOkpM2C7ule2sLPf0hoDhF6VTUtSkF
-JEWgrB5YTt+giZITw4ljUOevdTGeaq1OtV2PdFKz8D3GYyElBH8J4BYlhhLz
-RpLnkAQ1kpHYpxjtSSGXHg46ORx5V6WmF6ecEmexMgZtK5ZNzWEY8GhymBjC
-iDWas9UZi8szWmuJdYVKsmYPQ2D0gd5qEp7D9TuuDxvGcY9xia62tO2iYAkG
-pgGqqLifIrs+Yl2iTxpva6rlGmM0b7cb3h32XF6sMSqy392xah0Xl8/Y+D19
-v+eWEaM7VpcrapsZ+x3397fU7VJGf3Y+XIoWS9KvXBkZn3QiZx1a1iTCo2zE
-PANf5/Gnc/iSZYl1UoTGQAiyYrqq4bL7/G91zfEfFNn89HHZffbov593n/yz
-z9ff41988Qc4nbNTCe8nhr4np0hrjIwqsnRsrNESn5YTOQbqypUYCYVWDmsa
-jK4hG7wXU3JCY4yTuA3jsMpgyEVnovDRE9NEykEWdUFaoqJY/r/6+c/Z7Tdk
-YEwZ23Q0q0va5QWL1SU3tzsu1he8ePaS3WbL/e0dmczQ92jTcH2zkUxYDPeb
-PUZb2nbJfncgJ0WIQSJRciQmL4G8WiJJumZFTIrBB4I2ZOcYM+ynicMk7KhP
-P/0EEwJv/uZvSH2P8iNpOLBoLfWiYpp6so/EcWTaD3SmYm1b1Bgwg6cKmf31
-LbEfeXF1ydlqidKKbrUkoGST7xq2/Y6v3r1B1Rbb1vgcCQqUFYibT5mYIGVF
-jAo/ZZxqWC7WBD9xff2B7X5D29acX65pGkfTVtxvrlm0Dc8vz/HjAafhYr0i
-+0CKo5yeil1apYzJSkKplaYyjsoYyQ3MAhklZdEvKVNa/+lBsFdo2nO+oSws
-RbcTMykkcorFZaSKPkmCoGdLuUriHlRZYbKVeJtYYl1yIgCpuMyij1I4RdHS
-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
-9Veszla8+uQVB99zc39zHOeLTkIgnl3XYKyi70NpSz8sliJefdCozESDWE5Z
-ERFQPpyGDYlQiuf81HZ03OBEYxAg2UcbXEq5bARPtS35OPrtFhXjUMZQJIyp
-jydt7yea2qCtJQVxqjlrOO/OaduW9XrN6y/e8X77geEwcr68pG4apsEzxYna
-Odq2ZRzHr21Ax25JWdRCTl87kc8RG2oaBKNgavpNz+52z/DME6YDOoud3riK
-qu0kP64o9CtTifuSUDw/+UlnTrQUQum2J8WAPxoljMpF5Fygk9qAg9keNY/B
-NJBCxPcD4zBIgWIqximw7fdEBU3XHnEJjWtAW7766jXL9oKrs1e8Y8NmJxEy
-7brj4uoZ/9Hf/20+/uwjbFtxfXtDP46szpbSER0OQkjPEqOCSrjKAObIzJoP
-Zkfx9BPw5dOO4Wn3xjlHSDzKkJwlB6cjKVv0ME/HelorxmnEOo1zQvrOOpOS
-IiZPnDi+nio66vngqFRVgJj6m+nnJ52xR/OBrznwvt5pfNol+qau0WmEjWg/
-ObK0Tju8T0dyqPzItSxdo6/n/z2I3R9E8KcjxJwzygsHLRX91en7NH9/zOFR
-J+1U5zf//KZuqXXFNPaSNFDeu6qqAF20uvJc6wx11ZBQDMMO12pJrQgj2AwE
-7HigyoG2toSpR2fRARsl95GVTk9x1looMoJU3JvKSKcw5nw0MxSwVEH3FGWb
-Ep2lKtDO0/deKYVVmlxVD51s7yEGkg9i+BoH2q5iSoEUelKRwGhj8x//zR+o
-MfOj/+Tzf/xD8p/+COCXrRv1d6KQejJP/f0/u/7Tp1/jbPE5u82/prINqk74
-YSD6SKc1VdVQ4Qjj4ehYCEEiVkSAmxljIMbi7JoXt5moWyr2rEsQbIba1Whj
-iHoeQwhNOo17/DjhfCjz5Mg47PDThDYtRkeaxjJME3d3N9ze3pBzZLO5I6XA
-7f0dXdexaBuJTNGKqqo5jAOXz56zvb/j/fUNRkHdlNFAlsWnMgZlkOy6acQr
-cYo569AJzKLDrZbc73Zc93teXZwTesXtoadxlhcvPwatifueL774AtCcnf9f
-7L1Zj2XZeab3rGkP55yYMzKzKqtISiyRomAIMkQ3TP8DDwKMhsnb9g/wTRto
-uG9sA4YvDPhCf0NdatiABfsHGG2zB7ZlWN1Nkd0casqqrMzIGM6whzX54lv7
-nB2RSUq21Qah5ikkEhV5IuIM+6z1re973+c95erla3KGTz/6OWdnF3TbdbG+
-V0Id3/WcP36CWi7BVbx4/QpjFT/68Q9RywXOOS6ePIZGNCu7PrAbRjKWrvPs
-tp+zW3fcvLrjz//5vwCj+d3f+11Wx0s+ev4xi8WC1zevsJWh3+5o2ora1eSU
-iF5Grrl0LxQHkfm0+IYom9PJ8WrvQpoklpMxQZX7yhgpHorkEo67H4PlRIpA
-PiTZG6uxWFIOUrwaNduo8n7M0nVbgYPaaVwxdQgUVIaqkQ6PtgoK12bMHruo
-uGyfsjw6oR8Huq4n6UDAs+luCWMkr1ZlcxFBvbGqxIootJYWPMrQpQ6fB7Q2
-1HVdHlfH2A20qwWrdkEXdpwfXfDpq4/5+U8+5be+8XWycYxdx2azwWTRBg7D
-wG7bsWwWqCzFALF0VDiIVX0YGMeRGIN0dZtciilNpGgsoseULD55Dez+QJFC
-EB1UP0hW2SgYjKZpuHr1ivV6zfnlu2St2Ox2JJNZHR9BbXh184o8Wo5Oz7Cm
-oR8CPsKf/fBHYDWP333KB9/8Bt/+9rdRDWSb2I47sk1UxhKNdHOiSmSd8ePI
-MAxSSDmHMSK4zSniS8eoshLyve+SFI5UCAIVNRNAM2Zxz5GlWzwroOYFxPS1
-eZdlD4Hda6jKIUPnvSZuQgVMTrZ9MbIfv6ri2PSEXsamWqtZt6uMYUsRVdeH
-Uam1lqquyrhS9I5ZCw9q+l3TKO2hcH4+Mp+P5aqmvfecpkJmcqPtO1Z5clHn
-Pb4DYBw91rh9oT53BgJ0XbfXDk7i/hACtqQ0jOXxTh1RVYxKSmvQojdUpgRq
-F6+AMhpnDU4bRjR5DDilMbbBjyPJR2otBWzTLBjHkZQjtbFYW2EU+JhwVqYA
-SmcqozEEoh9RfoDsqa0ieU8/bFDOoNuVFM9+FNlJPcu5MxpbGGDKiNZN54wp
-ZpNMYbdhi6lDLiCRCBT94gSwVgfm16brqOua1bIFWrbbLa9fv0IpRb1osVrh
-nCEqy5AiY78j+YhpV7mtlwB86/zb3/u12PxX6PawmPrg4jv8YPORskbnnGqy
-qwl9Tx88SgVSTtS2kpFfsYXmHPF+IGepuA8RIuqeNiaW0WAqlXtxwUuadszi
-5ouJYRjxPqL30QdqAiRA9sRkMCpSVXB8VHFxfkKMAVvLOK9p68OJzVjRLXhp
-A2+2Ha+vb/Fjj85QtQ3GOpjs7jmwu+6pK4tVYiHPSRFDZiSgQuRsdUxzekIX
-E9djj7lbs6prLp885ez8DIaRF589Z7PZkLTl0fkFtWu4vluTfKBdLYlEos/0
-XoIybeUYg+enP/8Z7dk5v/N73+Cr3/yA51cv+ez6FRdHRyyXl0RrSVrjkwiK
-66pFm5r1+oqf//xjttuO48WK47NjFqslCYFSVpUlqTitDzLDz1kYPF70Kbpw
-pKL3xNmIz2qNcZZlu8AYwzB2+9GFdGBmmwYR+4bolTcErIcvFuz0vlUuI66s
-YhnjzcccEaWsFAHlutgzzbLaoxbCtLHsxx6ZqJKYB2KgXlU8fvaYsff0654U
-IqayZYMRjszB2XTYRPb6p5LVdnR0RAihuEY9ILmGVVXhY4/VjqZqsMqxvdlx
-/eoOW0WMdTI2FStsQSuM+GEk1rXklqVQHIrm8FiIeO+pqurQddg/1yjvYSmo
-pmNwjpFYWGhqlrumC2fJKi1oD3UoeMcw0IWRylqUlVGNtZaoLHfrHUo5jGn4
-8x/9hH/+wx9xfnzJ73779/n6Vz+gzz0mq32nI4Upe1Ps7FVthfqt835UOznG
-9uLymYD/4OZUB5dUNm/mCO4vp0ztKnEb57f/mTvO5kWWjPs0Qxh++UZROlmT
-JnQK2Z46SSn7e50cYyaGnj24J62VNIGZ+3B6DHtMzIMx3MOi8KH+601d4f1u
-5lybdA8r8UDDKM61+9Ez80J0PtqbCrW5kH7+fhzW/njv/vMu1z3EidbYqEg+
-4bMgaypjpQibnlf0cs2SUdpiiw5Mp4gKESoZKVba4ki4AEpFnAKtBIEg2JiZ
-+H5i1xW8yFwDmcvylMr9YoxiwJlySOd6yZzZdZ2sawUHobMUXDHK6LKqqnuj
-UVNiZrKS9VeyPQs5n4zNEJNQ4rWy6idX3+frs6SSXxdSvxqdqTduJ4uvsvPP
-wWV01WCqkeyFF+IzrFyNDztyEkGtnGJKRe9qoUKmiRCliDHvc79ilIs4A0pb
-QMYaKWdiEBBfjJmEBeX2XQhnDcpkYk6E2Il7p3I0zaJA/BT9GEjZo3XL6AOj
-9/gQMGVhHcdAnwLLZcswdnR9zziO1JUr7V2DMZZm2VI7hwb8rmcYenwaIUV0
-ipiqojo6wVUNKnhuQ6Db7diNI682Wypt+Ojjz6iriqePn9AcnTD0PUMIGK1Z
-LOQU4rTDNjU+I2DIpLj67BPibstdt+bR8WO0k5iOrGC5WPBivWG93tGenFHV
-LUNQ3N6uefHiJeu7Dq01Z2dnHB0vi7ZsROuKGAOb7Q1+3NE2K7SaQIxASOhU
-XCZadG+pJNOLdicSkYZA1pFURL7aKPTE1pwt2NY8EJkjWjNUAl3s3WVzF82O
-2rt3lIQfFgtxKcZVKaJLpElV1fsIjAmIOTHBUkqFMlx8gvtNSnR+yhiaqubd
-rz4jh8RPf/xzNustx+0Rtanp+5FFVVFV9uCwUqkwthLDMJDy/dGKFHtT+K2i
-320YwiB6QFuzcEv8EAlD5PzijK6/ESpyySzbL7JJdGTaZFSEGCIhQ7Ry2p+y
-5fSMNxRDEM7ZDJGQUgRt9u6vOLOnO2MZ4kCMGVdMIWM/Fn2ULIG7fks/7qiX
-xxinGVPEVDVguLvZcXr2mBwrfvqzf0bvA8++9hW+9o3f5PLxJZ9+9jE6gg1T
-x3pkHAdi1jR22hQLl8dIAWCUJCcU86fEcMx1QdPoeP+8S7RTniE6slxXKUmE
-z8Nx17ywFwfm/YLjjQJ/32s9QDdzZr8eHYoU0fJN+BClD07Wg/hf3otIFoew
-MvuA9wNKIc00WvGth465xukhSHT+96Tnm/hR+7+j/I5pI98XsOp+t805SQ6Y
-IyKmsb0UHvre45iPWFNKVJW5V8jFB4WsLRR5EelLCkLW8uZrDSom6TLGJIT2
-ymC1HBDCOMCUgsBkipFPvygDBWFhNTitcVGhU5KcxhwEeaKgrqxIAPRhNIwp
-05I47V3MCqrDxHXqFPNg5ByLyWaXBoEcWzsba0pOYMyJpmn2HX2tJEvS1a68
-1pkcEthSZGVJrUjRo8aelHK+5ad//IPuk++hNN9+9p/8upD6Vb391uV3ANSf
-fvr3sq4XNDlhBoMOO5wf9lW5VmArh0maruskMlIo4AAAIABJREFUjsGYvcNq
-7+pI95PIZcFXIuozuvy80t3IYjN2OVFVLdbV2JxwZJTRMqbbM60crrZoewRk
-btdrxiBF3TB6vD8wY2ISoaKcqoRVJbRdTd20NFVdOiuZse8hZRxW2vJIUOqy
-rXHOcPP6mmVb07QL0tAzrO/Y+o6XrzekruPy+ALvKr7yG7/Jo4tHdNsNL29u
-uO17FnWFBTZ9z/lpy+nymJCv0K7i5OSEXDtebm75P/7PP+XsySXtyRH1csFu
-6GG3o+s6XLOQBdNHfMgYZbi8eMyji3e4OD/D+47tbs0XL57jGsPiaEnfbdnc
-3uCMuE8kiFdTFemMKUnkOoMPUZyKxqEqGdOGKGG2KSWatrp/YptbrFFFP5Xf
-OE2r/CZ5eW/iKx2nabWauk1T/ti8g3XYxPKD07pY5FMyxf5fFledKIlnRJUY
-88jypOXp+09Zr9d8Gb4k4hliIqZACI6mae8FwjqHuBRTKgBPT98PZdTQUNc1
-4xAYxg5tpu5mommWLJqFaDb6xPHRKV1/J0WdosS/WDlMRHn2ta2KmHUkRk+3
-G7DOY4wq3bhYCohQtFGpdDdKRyMU1ERxugmhGZRzBWDaYIuzKoXI0HWQMou6
-oa4qPru6IRGpWtlw/SC4iaZeYGxkDHB7fceLq2s++O1v8cHv/DZ97rneXeNW
-FSp7IOBjBhUwTvh0poit82wDJsd9/tt0TTjn7neRyG84+ebdjjTrQMpzzvuM
-s4fdrXkX5KGIWLQ6HmUVb62ryjUvDCRZsyaKutji2WchTr/DlddcQo+lo+iq
-5p4eKQR/D1Hw0FU47zzNPzcPC8TDhh72YvOHHeGHIvX54zjoFFOBS76JkJiK
-imkkKt2Uav+8567J/ZpfRv1vC3EO+c2O2/5wZcye9SdjyISxem/ESFmE/rGA
-LbVSVFbT+4CtwJIxWRiAFulgiTkm44yWjmsWSUksWM308DlPoemavRFiYtya
-UtzrUliqLIYIbTS5YIBSOWzmct+pCJ0MDtOoeXIMS0zPoYx3alogIzEOUqwp
-/V1tc8bYP/7BZ3//e79qxdSvC6ly++HVP+ZbF3+Do/Yr6i799MPa8F3rLGqX
-yTEQin13ErzqJK4bmZUbEdsphS6A/AJGx5mKrMRer4sjBq0I00lcWyFSa411
-BmXc4bSv5UpVOWLLyQEl+iBnLUcrR1INuz7QdX4fXdB1HUNZqGpnaJuG19e3
-jMNA5WoePbrg8vwCozTr2zvWm1tSStS2CE2VlW5H0gw+MaaMbpeMOtGFkdD3
-GG1ZnZ6zOtEwjuzWHctHl5w+e5+YE1++eEGfFW61IpPZ9AN9ytRHR6zOTnlx
-fc3ruztWF+d85YPfxH/6MZ/++M/xrxSP24rV8RG9EmG3NgbtHLfrO243A/Xy
-lHff+SqXjy23NxtC9Hz88cckFbjb3HF9fcXqZEHKI8tFQ1U5uu0t2tZYZamN
-uLpUiuic0FnT+wGixjgHSlxgyirJ2UqJ2k324ECM4Z6VWWuNDwMxJ3H4ofaM
-roN937IXR8AsSmYmtC3OFqUO4ckCOZQRVy7OrEn0ut90ymgrFwdYKm35XE6t
-JgWGvke3mqPTI97/2lcgJl59/pKu79EYumG3BxPKZqHubTJTR0NcWk5I/+LG
-JlPx6OKYm7tr7nZb6qqmMi03t3e8fHnFV7bvycaaMlHJM5lGhpvNRj5Tywpd
-S4GWki1C3Dhzmk2OUuG0TRqe6d+jTvc0aRO6IZTXqG1bwjCSy3Pp+15E/IsF
-zlnW6zuqhWWxagk5MAYPtsa5muNjw9Xrns+ev2CzG/ngm/8Wj54+4W5zxy5u
-WSxrLJax6whhxDlL0zqsK4/dyIhfSx4ROhu5Ria9kRJoqLhE872xibgaCqsp
-5VknKh/go5SgdX1fVjAfRaWZw266dmIpcmLMWGVFb1X+EzjlPtFERqX7jo3A
-ibVW+77qfGQt1+k0ho2lezU59SYOUTEtlFDzeQE4L4AeFlYPDzOHUVS6p4ma
-Okkpvn3k/vDmvRc39ow7NWm9ppH6Pe6WzvdGsjmm2RkpF5G12negYyme4rzr
-owrMt0hGrJUCVOeEjyO+dP1sKVYTST5DKe7NF8ZIXmQMUKGpKCBllagMtNng
-VMKkJM664tRLSa7FrLWkRehCG58Xm7PRXy6F0WHNkQO5mVx7zsiEJWeS91NA
-lsTwaCXIj8lRrtL+c4EqyIQoLmyjDHtVCyWmJ3vSuEXnSKb9rlEm/+Cz/4Fv
-P/ub6teF1K/Y7ZX/kv/1s//xbz+pn/5hRn9PG5e1jWQtiIL5SWS+ME26jcnV
-MhVSxIkgLATou822CI4jSUvmbRQLBlo7QgokIAbox0iPJ1hp5obgMXWNIwu2
-IPRk5aicZtFWaGXLIuz3C10qLh9ViVPHlQyuEEY22w6Tb0AlIU33W2GBpIxp
-JmaMI8bIsB0Y4sjp+QldyoSYwTra2mHqBmcNNsKnX/wLrjc76s+ek4eB7e0N
-7z56xOn5Gd3tLbfXN5xcnHH66IKqbklas+52bHc7zp8+RjnD5btPOT45w+eM
-qRxmEkKOnmEYcK7h0aMTTs8uObt4xM3tltvbNbe313z6/BO++dsfcHJyBCRe
-X79CqczFxbmMnUrwplFZWF4poJJkaSlrWC2WUggFITsHDrb/afP5RWOGt52a
-3yQkq7efdicJp8oPTuL39TPzn3X/64fu5kH3MOnwJvFwxIeRfuxZ1QvOL08Y
-u6f4fuDu9TVEJVC9JCgA55yIWYsNvq4dt3c7jo6OWC6PyTmz3XSM40hVVRwf
-H4vrz/fs+hGrLI1rSD5yd3PH+uYOt7TEPOKDlw05J8bRc3ezFq3VWrM8XXF6
-ekLTLIjRM/qeECIhdLLQl81L9Dol6qR83ESorPYaoGwP70EKkSF07LZbVMqE
-fuTu7g5SptKGXYxs+zuOz89oli2DHwRVoaRj1jZHHB81ZHXFyekZp+cXBJU4
-e3JK32/pxh0LKx0770cZbxRCtPeBPErXeiqIKJ1DNdOzzTfpiXM0jT2UUpg3
-Oiv3oZGCQLivGZqLr+ddk2nMNb9+J0YQ+y3w/rWstUUpuT4Uiqymr0knyzkn
-jq4H+qVpzDPhLqZOitFmj0OgdBF/0WhvPoZ8+DnKMzju/LOmtdkXqVNRdD8i
-hnudPu+jODVna/o8imhyz06f/7n+aRot3uuC7UeID3ICy7oynbRTko4wyoob
-zshYK5SJglUaymufVCLp0h0rMgClIlZpnLVUWtY2nUQbtahr2qypYoSYsVoJ
-IiVG0fZaB0aco9ZY8mwcjpExbFZFppAk0DkX22ZSh/tOWquUk2RXpggl0slY
-0UtFknDiUr7nVDy8D7bIBChC/YgtAE9VwshjIdWD/mMM3wP48dUP+MavAKDz
-35hC6l9efV9GeL9EsJbQf5gyJFX4TrFQaotQvHIOo43YxKMUUlUtcTH7hWkS
-dMa8n7HP9QW5tHxDlMQ7rS1GO9FVYMBn1OAZ8gitQAaVlhOoMXLiDkmowdo4
-2tqUD6ElI0iEXOJnRESb2Ox63n/2DsYYbq9vuL6+5ublFcYY2qqmbVu+/OJ5
-CW4dqKuKRdXSrI4wlSOoyG23JZIxrsI1LWTFNgT60eOyoouabn1H++o1TkHy
-CbtYsagd4ziy+/Ill0+e4toF281WSPB1w92u47MXX3K32VA3Dc2iZrfd0ixW
-9H3PWDLFqnbB6vyCZnlK3RwTQmZ9e8fYD1hree+993jy5JKqbdhs73j58gXG
-aI5XLePY01Q1lbXoFPH9SPIBXfRuunZUrsVnRSARUy78mCQnTa2wZQFROZeY
-F7V/r2XBtmSlyMq/gQaYVgeRO6lZ6G9pixcL8r2NROcHBVNZkKWfQ0rTfeM+
-9woO0TN5spiXzoKrKyKRzvdYpTg9WxHfe4qzhvXrNTpYcswl063B2mpvz5bC
-SoTpAtGLs+JOft9utyOMnug9OcvYz9qKrhu4vVlz3grLLCePKaMsxkQMkWGQ
-fL+QA6kEgFunCWGUa2Dsadoaa3XJJ1N7MrUfAkFFatMSY2II5WdNouFJixMT
-m7s1TVWhE4xDgJzZxo7X3QbvPY+PV1inGYaOulmStGPXDxIkrizbbcfZxSOO
-Tk643W14fHTKkHpyDpghE8MoUSlGHLd+EIu7gGzr/ShmP/4vEris1RtiaVU2
-3Wm7rppqL5g/dCpL7uBU2M+KjPnPm4vFJ5H/IXuuwFdzuid0P/yZrP4S66H3
-bVQ90+Olmesv76GwwpHS+981Z1dpa94YVz4soN624T4cze1xAsUJO2cgzW9T
-l+lAPr8fnxPCm3yq+e+bxlBTUfcwD1IeYrpnFICD+SMTC1ZGQKfK6IODsrht
-Qw7kqPauN22F2TXGUcLEVSH860OiQMxB3LxlZB2GgTT0tCpROUOFFC/WqHsj
-Q2VsyTbVxHHci94FV5H3erY8iweasvHkwDZFxsh1F1IglI58JJeJnioxWyVH
-1BjQEbQ87mkd0coUpZforQ6fj4xRGZh4f4qYe0jqu7ox/OTqH/O6e5F/9OoH
-6puPvv3rQuqv4vajAt785luq06mI+mW36cP6rcvv8INPPxGRcU5yLRiHygnj
-Sv5YP5JCxDkniwTMRJiZGA6jEJsiztazbNo86Y+x08nMOulgqUxOgRSljWuU
-QluHKSdLq2UynaN0sqwxKJVlJOdadn0Howes5D/lzOBlM7o7OYGsWC6PSK4i
-9B0qw/FqwenpKc+eXuK9p9vs2G223G139DGinCaoTN3WpCCckJDLgjiOtM6y
-WC64eP8Jd1cVF8+eUgG3V1fsUiD7zDZ4Xt7c8N77X2E7DLy8uqLzAVc3bHcj
-dx9/CjbShV5GX0ZxeXJCP4702x6TIQ4jzz/9nLvNz8HWLNoT1tueVy9fM4aB
-3/8b/za939Hf7nCVwyQYuw1p0VCFwKKuqEgYn4jDwIf/83/z32vgb/37/+Xf
-qZVie/cKrITI1pVDWUdWqTCjJKH8kIUrC0QsI7gYIk1VMxHH5xudFNeTmCDz
-iwYMb3NjHRbzwgNK0iFJKZP1YVFDCE33LEkHR43AMttlSwqZbtejfaZpHJfv
-XhDiyHa7ZfQjcYzYZLGVwCO7rif4hDGO45MVaE3f78ha0bQW7RZE79lue5YL
-t3ft6ASVFrpzd7fj9atrji5a+hilK+gcVWPRyWJ9xlrp8Y/dyOv+mvV6Q9u2
-KIUYJIYdqxCoard39SmlIIX9Au+TuF5344BPsYwZghRaIXByfIz3nqaqcFVN
-XTeiD0qK9a4nJ8WiWaIzhDFyfNLis6G77bB1w8cfv+TPf/Rjvvq1D1gerXj+
-5We8vs5sd3e8c/mItB6wlaNWNa6Woid2XUFJuDfE3Tq/3T02FdmTA2/S2Iky
-Xe83GqULODNnkpa8vsM1c7+LOWmwvB8Yx0BKfs+VOnR49KwjBfsol2l4F+9z
-0+Z0/ZwT2hmUFvdpiGGvgZo+B9O41XspeNyERiiu5kn4PS8E75PXDx2ht+qm
-opqJ5Q9T9Jyn7ou9jz8o99XTgUUZdNHtHfSuGqXk+t+7FiddVbzvJBQ8QEJl
-LbE+gsE8gCyzOI610oWRZFAqFbJ4Qhl53XxKODTOyqEo5UAIgsfQ1qCsFcRJ
-AY+GGNExo5K85rkf0F0HJmMxaBWI3mNq4T8lo0hJY6x0npNSgkDRipz1vkhS
-6D1PMOdAUkXMnyctXAJcgW5q6fBniQ5y+bD27UfJUAr9GSQ2elm3ki1/Q1Kp
-UOFT0YWVOCJApV7WPAU5mHy7++iPLxdfVV//dUfqr+72svsc0Lz89E941L5z
-z6WXgavdxygFv8XbO1IO/eF3nv3B9/7BR38v1zn8ccqy6KeJ11NVhCwjIbRC
-OSl2YsHrr9fdfoynilNBNA4R0kjvO6xqsNoVOrq0603pfDkiytZgYOsHRhVp
-zALlatLgsdqSfIYUsClhciYOYxkLGZqlo11GfFYlyibgh0SIsrB+/vxLmqqi
-u73l/XfewWjHyy+foxcN29tr2iePaRcLKlfTDZ7d2JFChBDpuo6LS8dRu0Tp
-yG57x9hvqCuNrgwjPfVxxZPlY7ZhQ5fBHlfc+i2bQQrQ93/rN7npe65uP6Xb
-bCWHrW6pjCOmEXRHayucyeyGgZ/92T/jtut5cbfl/J1nvNr1fPzymi9e37E4
-OuXR0/eK/kHz6NFTfHJU7SOeni65vfqCk/aEbAy7L16wqjWnWKosKABS5D//
-D/6rv1NXFckHuus7tId1d8t62KEqzer0hPbkCFVpvMoSJl07TFOBdcWNJB93
-lSEmRQxA1AX6qWVRLUHAxmjRyOzdQgUzkKRz5KOnMmofSrzXkkThDKmsMEho
-cioLdU7ldIxks8loS3RIqbTbVdksX3cbifwpwvuYPEYpmhPH5XtnXD2/ZpMG
-ej9igsHmGl/I1K6pxVShM/04kFVitVhiTaAfd2QVWfcdKifqSjPutjAGzptj
-8pDYXG8gWrReEGImGkmnv928Zonmd37zW6w3G7Z9R9/3+M6zWV8LXFBnbGUJ
-fksmYhQ0bc2irjBaTBaxH7FJYoP6NDKSCBqBSpb3p/Weo5NjTFLsdj26askh
-c3V9zetNj1216KypXUPwmTBG0JUEOvvI5y9e0jQL3n33PYZuZFE3WGM4Pjra
-W+x1ZdAZxihuXmUVJpsD1LFQnpVS5T0Ukr41hmGUTnWaOiu6jPxCJKa45xRh
-BdwaciaEqfDRhJz2XU71FtF5VhrjaipdEcIoTLsoAejOSlKAGCuijP6UwQcv
-3Y7ymL33ZUQIVWVm8UKRIfjyezVZKXThNu0DjMvBD5f3m2gIollLEZpmgVaa
-GES3ZYwES8cY2e12pcNpJfMt5TIiLoWM0VjX3scfxHyv0JsaSIfQ5zIqJRem
-U42PER8DzinBbRhHzIMUhfEADs1oOciUQlFpjY9C5Nf7sZd04w6aolyI+1pG
-d0OWAsmLgaTve6zTNNZicsL4gKLQ6BcLxhQJE01cS3FukyWOkZSGfXFuE9iQ
-MT6IQ9lGVNZYVzFMuZl1hTaOwScshsbWKCNO6ZQgYUhKo9GkFPBZSRGPgGO1
-UXvdYoojYYx712LvA6GYC5r2SIq1KKPbrOJeZ6dVpnEWpUFlT+WssBRzYOgk
-R9RWDq00o/fE4NG2pjGWkAdiHwih++46dvn/Gj/ld9/5m+p/++xPUErx7737
-H4nu+eX30Qq++eg7vy6k/rI3nUXAq/P9kOLpdrH4CjJT/T7fmI33vv/Zn3z4
-nWd/8L3vvPMffg+gAmWNyhUalTSxxFOkccARMATJnwOcVoA9zMP3/QGJclBF
-PByJxZ5cgj0NYvfMmpQjOY20zrAhAI7KWnolTpk8joSUqbRF5Qg4sopkEqb8
-Lq01N+sb6rriaXvKdvC8ennH9etbtKo4Wp3SLBrS6EUY7SVg9vL8UnQqr6/o
-/IhrakIpnKyrWB2dyIJWbxl7j1PgKmhcRe2O0EbCj2+3WxorXTvRWkWGkFAx
-oXzExsz7T96hu1mzXa9JKXFydMTFyQVGa7puzWa9pe92bNZrbu+2qKoFV9Ga
-GmcqUugwSkCQR0fHnJ+fk5NiGEasNpyeXHB9fc0Xn3zB9Zefkro7TurM7urT
-P3/27td+exFGFkZTK42uHLWuqKwloulCJmnFUc7sdCZqsDlhhp6YIJJY1BUx
-RbIPIkBFkbQWKvBkkU4l8qV07ARgGIs92mH1W8YTSThAivtOoila5s0xhd7j
-B6Z/MkoR8pvaq5wzuUQ+iJDFSAi3M9RJoWLCe0s91BxfHEkg9qYnKyl+RSMl
-7rNsFEZbskllo5QRpyTbSJGYvAhdVZSWfG0ssYR9j2NidXEKZkHOHTWJo6Mj
-di+v+OEPf8i7z96nqhrqZoGuRBe47Tb0Y0ckcnx8hB86/NjjQ6TPo8QPZVXE
-70WP4VraSpGsJuqSMRczy6pFe/B9z7iVAiFmCD6RQ+Z4dQQlMLmqGkJIJOVF
-u5EMt7e3HB8fC71/ajD6QIgDeYptKRvz1HZ8W6ju24KE2W+2U8diwgRoktao
-4sgs6uDyvabImTQZSRaYmxGmjDhVwJMPOzrTn4l2Pgx+ZvGfgJuCklAKgYei
-72mF7nX0k2L+T/PnOeXPzU0SsmbnEoGT3ggano/kprHonIN17+dHSCqS8tvF
-6PtR0QO33kHMbsp7VkalMRNC2oe5P+yUzfVf058pGzOVA01WueAHCghVaVTh
-gZOKuzDrQ4JErXBGDksmIiLrKN3kkItJo+BMKIBnPQP3usqS+h1D11EnWDjR
-TDk0uQRcJ1uMK6XbpbTGpoIiSYVKnuUCCMkWR58UocaaveZSNHuSuaiLs8/Y
-0j2K0n3s+xHYYnQ1I88Lfwyd0MmCDvtRdS5NilyI+ZTflYuJYdk2JAw+J3Ts
-idmSCyJn6ss/at65N5H61uVfXED9VWms/toUUo8W7wC89UX5xl8A8vqXr3+A
-zpGr7c8wKX5ocsSogM4BYxXOaWLICAFKo1QUQdykXyrFEaULpQ1F7Dg5nyJK
-ieJB+DdGHH8hStCsjhiTif2ACopqdUyjHH2JEbAFAJrLaZNywpz2R600rEda
-t6StWipV4auB0VVkLLUGFUZSDKwWS7pdj1OGk9Mzbq6vULZhsxtQg9+ncR8d
-LWlXS9q25cgvubm5kYRwldFORPRKR/wAMQ+i8TFSRhZDCKqkoRsSKnqczhy3
-juQsrVWM3S3b9Ybrm1cM4wbjNIvVCe7xEUfnj7HLI55fb2Cx4MK0nL//G9As
-WByf4qoFnz9/wXr9nGHwvPzsOX23pa0UyxIRUvmBdxaXv10HT+56klFgnGic
-TAJtyCGh+4G2rbCNojEWTyATiD6iojxn7wesc9C0OOsIyhBVLs6ThLJS3CY1
-2YnF7pTLwh9SJGeNmDbnKfOTvkU6WftFPuW9kFfuOwlX1b2Ry0HnofdkKTn9
-HbqxOQuaQHLqnPBetAGijKPqGnVi6DYD203PMHSAxuBQ2RLilAUYyNHLuDPE
-fbdtEhuHlPeRN0YZ6srSa9Hk9P2Oy8Up2hk26y2azGJRcxcHPvroOZ0f0LXj
-6OSYk7NjmmWDWRiW6QilM01TM44949CRcxQC9ARimijaVn5ntuBJcpIdesiB
-L794gQsKPUR0tNR1S2sdyTYMiyNOj47FbIBGGS0bgTWQHdvtlt1ux9d+4xuc
-nZ0Rka6Nyp7oZbxotRXG1QMR8kP8wHxs9TYB9UFb9zCqRO2vqTckCVNuHW8W
-ENM2I+TzfD/KBRE0E3grzHI+XpsDJR8Wh3s90IPi6e3PS98Ti+/J5Sm/Ya6Y
-NuCmafZ6vamQmhdkaSqwUG/FCjx8P+Y/Z08yT9yjvk/3nxduc93WQ1TD2wrm
-lNJBQG0moGl5ncoYTX6OJagpDPowBkNPn1+1F3Pn4qyLORY4poA429qxTSM5
-DjirqJ1FqVESE7QqexJkI049CkZBZAJKshoLty6T9/FLoskMVMbei8BJaNE8
-JYUmo21FiPKYEp4xZNIQ9uPnCuGNmdKVNUU/FXMZt2ZxsaacyErP1IHyGlVV
-RUiZHEpU1wRwDZ6sPP/04w/5/a/8Pwef/1UJ1f/aFFL/b1+Q7zz7g+8B/OnH
-H+YqjWKbCyM+jTg8rYZquSSYhM1RzhQhiE6JhNZCLBa7eN5DFe990PesjFCs
-s9NJdGKXQE6BoZdiYmU1rdWEKIJYW9m9tiAzaXQE1x/F586qXpB9Ygw7rKl4
-5+KC8+Mzul1P7wN912OUYrVa8umnn/L6+opn77zLZttT1zWLxQJ0JnhP8BIV
-EkrsRNU2uN6Ro6cfB2KUzCZtpYgz1ZJAkueVNFollFVUumLhFI1SbG5fU2VF
-bWDse26uXzHsxPmVUqJdLTg+PeHR5VP6rFD1km3U3K537LY9F+9/leWjx6i6
-4Xa74/mL53z00UfcvL6maRZ8/vHPWNYVl4/PGYD13R27bk2dO2p7xmnbUquM
-VWCzwqQEEUwSN0scN9QkKiOcl0gklE5VsobXt3foZonJCtMYglEkpSR4VCOt
-epVnp9wJqGiLiTMKxByLeqADIQqmYq6XyemQKn/YCdLMlnd/VGGMEft6Eo1Z
-YgrrlU7tnhmUhf3jFWhkI2mXDVZFlsdLtpuOftczdDtUNjhVg0m4uggVyshb
-pTnnaN4JE62ftbVE+vgtu/WG3XrDMHQ4lRl9jyWh8FgHrtFc370iWcumv+Ou
-P2a5arFVhasr6qbidncnot/aYW1LrSWSIo2eIY0oI12zkCNhCGyHnr7bMu46
-9DAyvN6wsi2n9ZLjdknjGunqtYmoE6aqmDCnIQg/bFEd42Pms88+o65r3n//
-Gatly+36hrZxJAV+zNKJnRVLD7srD639b3N1CqjxUJCklO8BH+cdpblYeroW
-xnHca9QORYsc6GTtmeXhIUiCGFLJ8BuwpnmwXt0ndT9EETxkqaV0KPLe1n37
-RUXN/uvK3Cvy5oTxuT7p4Wsr3du5A5Z7G/DDLtzDImtPVke0OA+p5vNib/64
-DyDY9EaxNRW1bzU07Ynrs+6bVgxx2ANMDUVHNWEqFIQCskzTAa08X6M1RiV0
-9miVqGvLUV1R6YjfDaTUUy/Mfj3I5VAeUyZljc4JlRVUWjhsJS80q1CKuPRg
-xKMnMkEBTmkymjFoxpQZYmbEgtVkVwu7kEw2tYSQaxmOSlvAlnBEg9EWn2V9
-y0qhtBOtlhIETY6JSb9emTLiLZy8HD2EIf/Tn/+RUsZ8mOB7p4v3JEu3jPj+
-Mt2pXxdS5faTV/+Qrz/6d9/6bxMn6m23f/LzP6JJI46AyoEQBlK/FslnpXG1
-tCVNgTdmk2fk10zO/jAzTmWRU/EABFLSehWLbJC8rPLSZ5NR1uFCkODc7LEk
-nFIoAjkbOdUkEQRqLdEBSafiEhPaRls7fBdl1GVhsViyqhp2xnC32ZEGT4iJ
-6Ad2ux3d0OPalru7DVVleb9Z0FQNR+0RMYoWYr3d4MNAVVlu7m5FCJ98MnPC
-AAAgAElEQVQiOUf5OBlNWznqpsHHjpQ1ZmoPhwn/YKmtYbf29F1Hf3dHd7ch
-jZ6mqnnn8oTjkzOyMrh2Sd0uWd9s2O7u2GVHVJbjs0ecPX7GoOCjTz/jpx/9
-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
-C3wiZq+uMYtbEiq2BtqdXbCUTJ4TrSpK6cYFW+0BBOmaRhyuE8HNCauYk6IR
-vYUPN22UOZOXTCsz0Y+cT0q43nK1Gzlebbm92XM8Zlqp5Hm2aSCFwXums8Aw
-TES3QfuaEanMx1twwriLtvTXanT0ITCEM87cOUUqd2kmHY+0IAxh5HiY+ezP
-PuPFFy/YXu548+2v8Nbbb9JUeXbzgqR9Ku7lNPEVtUYK5/BBLHNNWrf29zWV
-9uzAXsSasaV1DZL24DwQrHkU13Cq95+7Cl4V32zKK12ALjSkVmrJuJw5216g
-rdByoQ/pbQWaDuxb43K0BjL0gi46bzo2jBOW84KPtoaz866jC3rou2nA7jMB
-1wmm6TDjydyjXeelcj81FxEGH0/A4aY2EfPe4zp/6yH9e90CuJOOTxmHYIxA
-VkOLkLSiNeG86Kv9J9IErrbv/K2t9/5jgwJ32hK403AB4Hr79i/F/S8PR9av
-X383Xh9++rvvX01vv/fd6+/xw2cfcrf/Ez3zjdvP/4JH08DFZuTm5Stag2nc
-cDweu6jVaLshBBNLakFTobbMFMxpIrVxONxRcyZGzxAs4Nj3h/8UxomgNZPm
-Iykv7DaTuWFaMbF6BxVqLSStHEuH9YUAohZCqkYVDs6fmDGenkVVDfB5OBzJ
-S+Hi4uK0RpS2AveaFTm1cXNzZ2LLVFlm69qGYezj74ILidIKXjzb7ZYhTsaL
-ykYvPnGA/EDsQMDTYSeBzfQGuNEKIVX2S+LV4Y4Xt3fsl5nLqyumzYZht6Fh
-pOE5GQvL+cjNYaZ505id8A1q2pg1P3AdxeeUTp3nMAyWaxg9283I5dk5Z7sN
-23EkBoe4igNubp9T0gGhshkjwUMrGd+L1+l8w/64Jy1HoneMPX/MieIclmUY
-Ay5YhletBv5rYrmDqp6UEofDAXGO80eXSPS8uL3l5rDna9/4JrfLwsd/8qcc
-8sI3v/Vtzq+ueHlzS84L281k2hfnmaYtw7ijqmO/FI5z5ic/fc755WMur5+w
-3VzI4807/PTuE31y9o58929ozP/7n/42qvV9beWpjQgL2hJeKy0tOE1ITUhO
-SC0E1xiDJ8aRtFiTQU1Iq3ixaYl0sr//mfeMdNijV+NR+c2WXCst99+nGSx3
-XVuF4E52dtu7eHKrpJJJOTNud+QeozKOIxWDvdbS8H5kM53j3cA8F0pWgp+4
-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
-ve+ja+g08+CCdXT/H3tv1yTXlZ1nPmt/nHMyq/BZALtBECBbbJLNiHGMWw22
-Gm275bm2O+SRGkXJnrmYn8A/Yv4Dx0R4YiRWjWxZ3Z658I2lkYQmCbUnYmKC
-4pdEAgRBEigABFCZec7Ze6+5WDuzCiDYokQ2pRZrRxRBEl9Zmefss/Za7/u8
-q0LKUbI5Dr1bFhbL76WeKstgeVOqeBdNE1ZP4DZWMy0JFLqu2zuNJnNDlVBW
-hZALnqymJ8hFCWIbpHpn4Ms6QsRZVEPKVpBK5fq4YAym1ahp33teSqlEaYsY
-qU8rtHiLwykFp+a6FCrjSUzInuvGH2MgJXtoILqiyLNiySjiajahc4QsNMUE
-+5O1dW7c/thGC2Nmtx9wbWRt/TCxa7m96CFOKc7jQlP1cm7z2t2/0n/6xL+W
-l6/9WI80p1ZV8d9Xi8/DQlif2ji/KqIeXG/sXFwVU09tnOfS/N1N76L6iuhw
-NULFO3M4ppwokulcS2w7xqzkvGAoieijFU/FUbJ93uRiBwJxpOr48+op3uOy
-OTKzGuBTxVe2oo3di7N4EONhVmyCkxURXZdaHLUugzk2g3WOnd7XkVpWXaat
-kxVvTlUtMqrUHaiO4b2vbjBHzfwrDOOiFqIKoRC06hWdAylElp0fJUTjN+Vh
-oNSucTfpavd0wEkhNJHQCikrqgOiltOZRfDiK2E9IU4IQfHODisp90gRfIXj
-xhgQcfTjQMmsDisxtoiYky3n2gGre5914yrPztl7rBTjglkmkxU6alR6CZ5+
-kVCxnAfnZFWk5AIJZT5bkJa6s9haVl9NbBCgJ6DebwueIm4TcXzn9I8+cU2+
-uXORW7PLpkuVqM4lK3iyp2Sjp1vnzMQDFjKvpH5uh05ylVrUxAKtkVhqv9g6
-/YITy3UkJ9II8T6a8cE6KKR+SddGd2r172PqYeyJmvGuwuBWgEvqCEhXpxEw
-4OKYTSNlGqCA1Fl+KkrqR0JYxobUKAvncSFCO+G5p/+X+56PP7uyvSWOC0W9
-jQpcPfFmsBRT+/1NcKYRyboa5y0dNVB5S5jTR1UrIM7vI5tXgbgEpNjDa8mu
-ysub25tmQ3CrsVfRqgVQG71kDFDnnMCSUlySkdGLktPS0+wRMW2KbTSQkyKt
-swKrLLUqVpiYrswzlLRyPRWUERsPiLfYjs7Z+6RL/EAdZVpcT4aaw5WGRMq6
-4vo4H21kU+dTThziPeLrWEisz+V8JA89i8WAc5kxF5qmARXEBYY0p1EzHFA5
-Pi54fDR3UGwbhlToxxEXAm1nxOks4GND8gHnGlQcY1Y5OnmMD8fLqwewADuz
-a2xMT60KqbdvvMzt3at6dO1RefLE9/7e3lv7C6w3lp2p+k28fvMizxw/X4tf
-ExJbfp7lEtYbEE/AVRgjoWVUR59HQ4g0DanY9anOW7e3hgLE6iwb04Iiavon
-F0zwW7vLKo5cqvjZkFXmvoQVnHFV9DiliOmjULXDlWZDNrhAjO4T3WBfI0ns
-rneUvKfKV2z8JEv39jIGyVtBkoviXGExLlbyAUtFcagoWTOFQjuJ9IMJwZV6
-7+mIiuK8I0TTImkyuK9Su3veERtHGQdUR0pRG8EXyxf1PtrfVdI+84qNVIsu
-Q9IxMX+wZIRlp9C+RY93cWXQSMW6fbHynlSFkhNVNFYjlZb5g/skFaXUbq/H
-h2iMO2x0lotCaE3FIIKEBte2Bs90XvCBIWW+ZzDYPY3hzisgbgvg+uz9TRHh
-ZHeK7555fjmalo9336EUr84HygBjGsxBSAYtRCdEcRYtJSbbELHRq9VUFVS8
-4k45056qItlyC0kHz9+DQuofyPrWxjnTdORB8zBQ+h6h4IJAHm1zodjmkbNx
-ZWzMAlKYhMBiGOjnc1Ch66bEpkGxjStpqfoDRXygxOWN73HTNQD+69X/BLm8
-8M/P/o8v/uqZC5s/u/ofVXNP8ebco/SUZDeqS4pIxjeRNgb6eYI0GlsHAecR
-iYjaKHA+m+M8ND5UHos3DUgZSQpFPcnC7AjOiglXCgUhBCsQlqgAFdOd2INP
-VuwY8Y3pT4K13ykOfEKz6cGctwDQ6D2hFntaslGAsc19rA807yyyQ52N6kLw
-VuAED6Xgszdxl3OEClukmK3cOgEgElZduhgrriEZrqEVZ/wuZ9/DMAyIE1Qa
-y1B0DueMU+S0ELyHogy9AQNb9eC8XR/eMfYFl6y7WMQxFOiLoBIJLlLaKbNF
-zwLBT9eRyRpzDQSNuK7ByRpFopimRfnmxnm+uXFe3rx5iWPt1wVYFVFP7xvr
-HV179O9Vg+ovdi7x88aOT1cA5zPHz99XRNWhMVn8dlYu+DTatRsiTiIaLd8M
-HEECaYQ81IdyDMx2F/jYVv1fLZDo0HYdFwJjfxspo2WqiRIkVQcauCImhpaC
-5ALF9Egqwe75pZusHqhE9jLdTAeJ5fM5g+0ui4ll98XukVDrJKXUwsqJZXna
-4WfZ1apu0srCWgqadenIXR5qqi5w1eUJdiAZx2R67OpUFSdGMi+pjrUtciWN
-I0UKITQmmI6RJHvdMROyy4q3ZRE8Qhst7DxU88ViHBjHkemaRRwJnnHMDIue
-rBguocJ40xIZYonSOBfMRbf0doisAr5LUdNLOal7Ti2SY4PGDvWGZhlyYcjC
-kZOP0A8DY9FtMVszGd0sCr/2AJD2T6/+mOOTU1vX59c21blNe1/jC0h58Ub/
-AX/y/o/5p4/+kG9unOfS4mo153hKzqYd04wr5iYVH0yIDnVMWeUHxVA2llKk
-BN9YQZrLyuyy1733OE0HgvPPsQ44Ul/Qen3n0iceMm/tXGTpz3r651ygr155
-iVZUyQvKMEeHBaQ5rYNpE2kq2NJOSREfG3Iq9MnswtNpR3BqAbijhQoHFwi+
-s7BaCczmI+oDJXgGseyw0QHebR8/9CubT/6c1/fnl7fwedDOFcrsY/rb12l1
-4PihjrXGoWOiLIAiq/y7pdA7jQsW813GfpfppGHSxnrytk5KqRtuU6TGbVAt
-/2mljVpuDqomEM3sWcKNq+NJo4UsU6SOL230IFWAP+sXlmHnqKc40yp4tdHf
-PM8IMZIUZvORUZXYdITQVAYNTCaTGrKaaboJY8osxoHGeyIjaFqdfHUpQl8W
-Sr3pT1yFYjq8aU3U9DImQHek0dg0ouADdNEE9pY277m3q+zc/Jju8DqHNw4z
-z3eJrWPnxg0eO/M4t+/sMj18jMWgvL9zizO/8k0kdsz6BfcWPSOFyXRKO10D
-rbEXBLKbynP1JPxVXJfe+wM91H5Nbize0Tje5vCd9ziUF8TYksVxc7FgemjK
-mnfcvvkxolMOHVrjyOHAX15+C9cdZt5nGueZrh1F/ZS7yTMPU+LamqRxrlM/
-sJbvEPvbuNkuPitOomllpKBSHticl/+wIm6xWPuAnvYAACAASURBVODEs762
-Rslw9+5dVJXD6xM0zyyIuJZBugouqbqq2l1xavEhKSU71HgDc/bDaN0fHwHH
-WKwb60NDCJG8z8hhDlStBU+NhNJlYPnIYhhQMj7UznJJtJVintM+xhWV4h0b
-Cku+ldasyYj4PURKP58bm05kxXJrGuN69XmkmU4oWEdbs/HYtEZOaTAciHgM
-SuyCBTNT3cOC6dpiAExfqhUOmgoMY2Yo4NspvluDpiW7SHFhWwmbWeH4+tmV
-Vu+LXm/uXOT27B1ER5VxII1zyAOujMQgNE7wmmhqILqwl7wgak7Fvh/xMViB
-p9a1LjgWQ89un3HtcdpDG4TpOt8+9VvyR5d/f0tc2PTi+Cenf3j/2BFzxi6/
-19d3Ln1mxMhBR+pg/dy1M7tWN79LPHXCuks3Z5cpYk6in7e8li1Kjy8DnuoQ
-8QGwwNqVrqieEL2AekGy7mV2aal6JLO3mo26rGbj4iPFB4rzII7kZbsIm8cO
-Pc7DiqilsPhbG+f4ztlNLr37kiQpKqGDbo00FGbVKuyLjR0ckVJ1RHiPeoFU
-UBbkJAjB9APO4azzDMU6AX7aVuRAQnIxwfvSccQSW2DxKaGON1Eoo5JIjDmt
-7Ngie+BKnFjIcM6oh5LM0p1ViSpENThm9PXkjcfHvewqnG2uTdvy8Z3bFbwp
-3Lhxg7absHboCP18l2J1EUuUt8U9rPT0iF9OTdxK5yWyxDnUSI2+p+/tQdh1
-DW3jUJ0zjD2I58jx49z8+Drt2pRufY1BM+2hCR9df5/iPH1W2vVjECfgPGvH
-GhbS4n3D2Fr4sJZCalq860w0nwWcl+8+9vxX+v4VEZ45eZ5yC7l39//T4MBn
-JRTIAutHDpPSACKcOHKMcWzYvbtL4yPHjm5wd6g5leroR8ttS2EC7TFo1zQj
-qNo4zueRwEiowm47PKT7Cyldnh7sh6KmO9QCu7OZdZqqcD1pwUmp8ARnf041
-o9RYnJWzFWzsHMUOHLO7d7lz5y7rh4+iZSkVKChVGlCcRQi5UF9M/dKCiLNw
-XoR+6InRIdIQo2EBfGPfm8sjVDp4KgbVbRpPcHaoKrngm8a67mrJBsOYYcyr
-WJ0xDVYMqR20gvP29KqHk/nQ2z5SAl6CadaWzlwpjP0C5z1tGwhNi8NbzuBg
-hZ20rcE2xfYTV9xKkB/UXK/qPFm8dQpdI4fXnuCpjfO8tvMy3/wFAi2f2jjP
-mwK3d/9yW0JzwbmCTw4tS/1mYRwSGj2NxTRYsTom4rITr5jD21XHtFjFZTIL
-BR1wusCVlrd3LiIimzYaFV7befWFZzeee7H6Fj/RQDhoxRwUUl+cxml6ql70
-e5X58elZ9hODfu5GXirRVsR4KM5boZQT4zjYuGtf9Mey7a3YKCY2FfxmBh6c
-NFVQ2aDO47xZrYsIpYpEj60/zl9HtF2eNo5MzzKfvUsIkaadUMj0eU7OI1EV
-SiY4ewCoWLHnqkB3SCMu2snTu2Z1ylQc3gVcWwuelBiT0b+X9m4tBubrmmal
-GDFxfc2xyuYulDagNQPLOV+t6ZVnpUrbmf3Y5QryrGORak8yx18yF1R0ph1B
-bKdeRu8cOXJkpQM7fPwIKo55WhihOJvLyrpRS72J6atUrO1uj7ZVEEgtpgxs
-WspIDEpYX0ZM9xbgKgXfRZo44YOdjzhxeoPFqGRXGHTg6ofv88iprzMODrd2
-hK47xGJQCIFpd5jiIrgWcYUg3sSyTSSLl1LKluI3f+2x3z64gdn3kdX8tfqU
-R2RkvDujoCQnZCKDwnxMuF5YjBmkJcTGRlXtlBTXEOk4/40fybLr7BMak+LS
-UiQs5qSrXVF5mOBX96CvXWMjKhtzwXTS1rH2WDlWFWa7cvTuDS3NGefwsQUc
-s9mCUqA7cpKvb5xiNltUzWAVpztfO1vWRYpxL2zZXPhSqcA2AhzzwkTo3roe
-4qn5izaeF6lazaIEZxEtQSxxYUwJH+zAZINv3YcpqIHfzlmnudj97L1fjeOy
-2H5pkNKyj3pupoGRRMjBHIpSwb21u70M/fU1kmZ/Ye2cq5+TAXeRT7qRAZ79
-EqjgTx0/z6vzdzdFZCv49oJ3Ds1CTgMlGXjY46vOlFVgvGnjDMCKFLRk69ZL
-wAdHCUJbvEkayoiWkZuzd/jBmd/ZPyp/ce+VuPte1zMb51aH7oNC6mB9MZvw
-vn//5sb5Fcdm/1jvtZuXth5mH/fOIVkRLXsQSse+mTZWTNVCyte2eMnL8N9K
-3HVmd0U9RcJqtl+cM2E1VRDtwoVbi6ufOQftqZPn+dm7l7e9hAu+W7cw1bky
-jnMGVSJCtjCylZPIKyQyo8L6ZIqPLQVhTImhT0iItF3Eh8C93VsM44I0jBbC
-2jR472z8lJWCQ0rVUBRdvS9SbCNvm6ltwapkdPUQETXBZdO2BvRzxSYgZtUx
-wT1KHsTeG2faJocxu3JZ6kEgtA15vkvSxKSZMBtGZvMF0+kU77xpsoSVa9CL
-rCJclsXYUtO2/yGHFLwmJHi8F8vAGzNDTngfiSHy0e07fO2xs+QizHZnDOMA
-jePU42e4dXfGY2eeZbJ2lD4JeXcwcb0LqPOM1RFGMKG+EuRI9zjXZ+/y/bMH
-RRTA0e6UvH79ou2IRVcmCGVAtNCIkcil2LXTdh3Jt0gXSfkOXTOxbmWMjLFh
-dB1Hp9+U1269+sKHd979t0e8IxRzvEqqXDTRisjMnzjpf6Ke0oxIrI60uIoQ
-scKqX3VOocIay/KxZ10qvGO+GEk60kzWaQ5PuLe74N2dj7l182O+8Y1vWPe3
-xqgsg5Y1FwsOrg7gZSEhFdpppzcrzl2ImFlxRHNBsu1fQ+pZm05BvDGMfETx
-DFpIGUYV0jBQJZI2jhepwdBaoZyNdbRSzSqM1mE3bq8yWT9iUTpjwUlcsfJS
-NjRI20WSWhGa5jZSFxGCVPBmTURYOqDVkO5o5dlZZ0tWh2IR2eJL5qjZAEA2
-vXhrRmkFClMIbTBgaFE8Joj34nA6Vv6ZdSxFQZeGI4nmTo5KHhJoD2WOc52+
-fPn35NfO/vZ9esNvbpznrX3/vlzf+oqP9Q4KqV9QEfVgW3Z/EfXQ36vlghc7
-/2XNlJxwYmRjcR6Jch/ewESmzgopsZb5YjHUQF7DI5TqWpPaJXHNhKSQVbdV
-3ObR6Wk+S77S9fk1qF2pX338+c2fvfO/b3WhueA4hFehx5PSApVEcFI5LYoX
-m91r7PCTTNJcHxdh5SxDPWmEoYzMh5ExG9ckBBO3h+BRX1DncL6hqAnDcy7I
-MuYlRmLwDMUCYS0PMFftxRI4KCbsrRBM1YJXyBgp2OClHskBMJaScffM6ee9
-cPToEW7evG6htsFx+/ZNpAkcPXqIfkwUvAlylXqaXyZP2Oa8ymkXVg4pJduv
-r+6uceyZDdmI9L4huJaxRPrRE9ZPMiOySCNzAbqW2JmOpL89oN0hZO04927e
-pXfC4B19Vrp2jX/86G8IwJ9deWlrY3p2cymw/uDe5YMb94F1a3aZZll8AOiI
-L4nDay2LYY7LYjqZtrNMStcxOX6IzgWKFOalcHfMzH0iAjfGD/7tqcNPyPze
-X6nLWnkWxnrCQZFso6pV/2dZOd1fWClKHmteXy0ycs3gs583uK4vBbNhqYmR
-l6VaMoioa9fo1XPz3oJRPWtff4Jjj0+48dF1I2urpxVP6+1HvEFzxQe07OFN
-EKmibTOf+LYFB1oKYzL2nNTXqc4jLtB0pkvKiI3VcrZRmRcyo3V+nBWJS8zD
-CunijLvmfFq5YtUZcNjFBomdFUfFxpcKlTJvnKoY4r54JUsoWEJk7PDq6/dm
-bmB5oDPlnb2T+2NavuylyFZRNkG2FXcBF1Fv/WsXG8ZhTp8GOgc+tgQ/Mi4G
-Ut/TtN6eUlpqR94e/8EFVB1NzAg9UmI9BLqHis8PxOgPX+7gLfhi1tMb5+4T
-mvPASG/Z/rwxv3bfKWbZtdKcKHm0dO5SybaaCc46T/s3FRN7OnO/xVDHRtaO
-F99CaExY7jzJO8bgGUVITlDnN7/z+I8eWkTt5+3sP2XszK7x8tWfKEDGbQ4E
-NHTQHcJ1h6FdZ+EiC+dYiGchkV48KTS4doKfrLMoMBQrimLT0k6mOB9ZDD23
-P76LxIhvpzRra7Tr64RuUsWdE5rJFPUNJTQkHymuIXt7Da6d4Lsp9+Y9d3YX
-3L03Y7boGVI22763QsiyqRTvpQYOeyQG+woeF1qcNNby9pHgW5yzINOmaRjH
-kViRDV5gfTphEj2UkSbKvgeMLovjWjjVjYtiD8fqclIq66ruyuOglGKOMLNW
-C4N6iOvE6SNMTz7B5RszFn6KrB1n7ltu93Dlw3sc+9qvcHM3c3M28vFiZIGn
-+JYRzyCev7j+Mq9df5nvn3l+c79L7Z+dfX4TLOfxK19Azd/XZ06eJ6AErfea
-NXIIkhjv3sJin5W7d+9y8/Ztbi8GZtowkwkzDSxKoJeGFDqyj3zQXyVr2X7m
-2LlaVbv6J/hV9MuqayQ/XwBgVv09zZCNwXuKptWBaolUqJ47G+lU12eMnoKy
-OwzMUqE0a4zNlA/ujPy3t65Q1o6i68dh7QipW2dwLXN1LLIyFFAfwAfEBRMq
-i0MJJAxCmsUZLwsxHWYIxNDSdFOmk3VC09F0HaGbEJsOQktxDcW3SNNB0yFN
-i7QtNA0lBJILjOIZXcM8K70KJbRoOyWFll4Co28gTpinwpghWe4Cg2bGMtan
-nKOvGaRN07C2tsb6+vpKAD+m3tyJfi9fb1VA+X2xUZT7WHk3Zl/uQeT7Z57f
-PL72OErYLARBmm0JE1yzRgkdo7Qk9SyKkBSLMSpKXxlgjhqZ5TA+mmi9IhMx
-FIIMlDRHxjmaFty6+5d/7b7w2q2XDx7+Bx2pX/Bc+4Hq/cEiav8JeD67R9TR
-suOojJispmeSvVGV8ZFytTp7o9wWKMnhQiTEDud8zWRTVCLEyFCKHF17nL9J
-yvfy5FWsfy5v7FziuSd+m7dv/FTuzC6r9w66ACFQBrHTUaXUifNo8FBzn6Jm
-CJ6eYpA/FTuJJgs9nsQpwelKA5adtexLERSPqCMrtRjMgCO5SBKPV8dAJFEo
-+5AIwOrBI06t1nTO8rxWVB1B1Ng6SZcNcAtQyBXF4EPk1s1bdI1nXMwRgcNH
-pswWc+7d+Zi19cN4IuZDKvtGKsvhQJ3g1Y4UtV+wXAVBE3jf4qIZCeZDoc8N
-sT1Oe+gU7+/c48TZ/557wx2yDty8M2cYMo+f+e+4N1+gyTO/O9tOEjePdY8j
-PrI2tQL/9Z1LfDS7zLMP+Yzf2LnERndq8yt/s0rhlXdfwru85YuBYO3/ZwKJ
-nHumYcLCBciOMF1nbbpGmR6la0/LnY/fUidKaeL2ifVf2bw2frBVipJz3vyj
-y9tbh9Dt4uVCCQ0pNJBHYu1OrmJo9GHHsD2AbVjmtu2LXnIV4lrpcYYIUSvk
-PQWxQTcpDYQwpfiOO71ypx8JhzY48cgjHHeOPCZ7qGqB1KP9gnGYg1YSt484
-WTL9rS40ErsFOg1lwDmpUUs2VopxSQ0vuBDIKobnKKAuQLQu16hmFgkSVgL0
-rMVG+hX2m1WhgjaJgXEcmfcLnCpN8ASxfSi4ZIeYklGboxOiYxh1FTbsg2kf
-VSH7JaG8woKL1ggdCzdnX2dKi/0a93fodH9q4zxUyOyt2eVNk3o0pFIgTtS7
-gJSeoSwYk40oJUQzwYhUTtYyOtvGtspI6z2DjpBqbqd34OXCq+/8LuKbrXNn
-fmvzzRuXUOGBhsGB1PygkPo7WstuzytXXsKrbXbDfIa4YjRzqR2NKpRW2RsO
-LWGcGTGHRhV2DmWkKXW0Vk8jQ1GKZ/tYd3rzyROf3pJ9+9arPHnsuZ/bsk5a
-2Jl/sPXT93584XuP/VDevG5604/nV7aKc7Rtc8G7ymlJGcMb1Va7CGuTBoae
-+eIead4jYloPaQKRluyj6btcIJFXeoicM1qkcmMc2YEGVzP+HJItHiZOpma3
-Hr09oKJHRUnjyFAWJn7dJ9IvzuHVdGPJZo0MqtY4UMMF5poF2Ihw/PgJ7ty+
-TggNXSMs7u3iRTlx+LBFQZR9eAP23C1LrYXs/wyXW5DYQwgcTTthHEf6xRxC
-RF2Di4cYteNuH4iHv8b1eyPNocPsLu7Q+zUmRze4MwSayQY5sL3bLy5MJ2ua
-7MDJnfGG/pc3tzhy5DA/OPObcnDnffo6d/o35dV3fhef0wWfB7RU+zgZpHCo
-69jd3WWWI9ONs6w/dpb+9si3HvuRvL5zCZ2sMeZBkrL15LHzDLdevXjt3mWc
-CL9+9sLmn1/+XZI4HUNLDg3KCCSCJjx7hdGnrWEYaJqGEMKetb0iDcZxgfPN
-XteByhjSfYV7zYwbipLU4dopcf0I2k6Z90kkBqLzKmRIBrAsIoQ0WhZeCGhK
-lulY8ztXIdnAUJRGjLXm1eHEyOylZPoxExpHP4z0Q0El4JoJ+MBYEouUmCcl
-osTqYC3FMuhEzGXsms5wCLGjBE+fZ+ymAXB02XP00CG8FkJJuDRAWqA5GfPO
-eSI1lifnKu5npX0S7xlzwmNE9ZxzzdsbbQCfBYK/rxt132Hk9qsvPH30uRd/
-kdfnH13+/a1H1s5sPrvx3U8UVPsO7PLfrr2kjIE8N5SEdwbftdghc1Qbj09w
-IpSaiu6dwJghz03jqaazFYkqzt+3d+zHHTx77HsHm8dBIfXlrZ3FNURhY/L1
-F4AX6zyPNMw097s2eqLgnLFdggAlWyxAzZPygHhP03aoj8z7kYKFlK4f3bDs
-vFwYcmZEKC6gzv3cIgrgyWPP/fUzYOfI6KbTeiOdXN5A39sEuPTu75FVrRUc
-CqXkCykXXFaCWnyKRyC0+InpumaacBKQSYeElrFk0lAYK0MKF5C2RXxgNgwW
-J+EaQteYzTyNlkzvI32/gGwiUh8dsWlooiMXh8vQjwuLjKniUUI0nQeOsRjx
-PXtfacUwVhhfCC2+6bh67T06V2gC5LEQXbQHVcpVFMtKIyVO941gl7qKvV7V
-soha5uc59ewuerquIwj0JaES8aEl+5ZBPT2e0kb+0aP/4r5N7e2dV3ly4zne
-3LlIr5f5ztd/Y7XZjeMoZ4//yl87kj5YqwkQMQ2UxZw2eIb5AtdB7kcInQUG
-+3UWRO7dvM0YjnDxvZ9s9bjNf/7YqlDdtAaXvHh6+jjPbJzjzZ2LjCWrjwHn
-JziXYAGkGT4X47qKfMrp3v5f9MFAlnmpk9r7uVARCCKC5mQxLV4sP7IUQtsy
-Fk8u0GsmdmvI5DgltkzjaflHp/YexC9ffongIs30kMrYUOa7zIYFRTMxeMRZ
-oHBKg13vtfM7qpLHgVYjTfR452qI89J9Z3uTOoPjDmOGENCmMzfv2NCXzKiO
-JrT4xsj+znli25hxQmqgsUA4NOXYoROrrt1Y8sqVVsZEyJk2WOqAOf9AizPD
-QBX5L8e3omqQ46L4qj0VLVVPmQ394ByqiXEcabynT+nC+W/8T3YP/YKLKIBf
-P/tbm59l6nG4OSu301vqmzVzTqdIynNSWtCJIzYerzCkkdlsZk5Eb/sc/YKS
-lSY0SKxdQCmEEPTtGy/LHmf/YB0UUn9Hy4uootvPbjy3CfDqld9F8qDkAS0j
-XQxEp0QnBF/HTtUerUUYc7bIAR/BWxyEilmci3j6ZMG2ydXwO3GId/Lc45+d
-D/SgkPCZjXOwc8kE5/vGfEsB+urXAOce/+3VQ+TSld/fUpcl67gVnF4Ag4V2
-zhNjA8FRRlcdODUTT70BKaUWO7UVbZoPwU0Po8VIvm4yxUmo2WCezgvzD69V
-/VFhKHbydqKEGJDQ4KMFfVpXypu4NAlpSAxJKc7RFwPzEYwhFUIgx4aewOTw
-MXwZcKU38nTJ5pqpNmOJ1dFjtq7loGVvNLrvsahVz8IyV00gTiI+GGcq0+Bc
-pHdYnE00oODh9VPyx1f/4wtZyotOlF8/9SM+mn+4db12CXXn/s9zieRYfkbL
-eBT5lE34q75icBrHjBej1DdNQELGpciohj0Yw4TsOoYqmi7iNsHrf732hyJa
-eKR7bGtndm3TK1snJqc2377xsumVvJPkihYXkTKxERFSM7IL5qfNf+uxpK9j
-Pa2ZeRnTtScVUvFk11iX069BM0Fii/rA/kPWazuv8Gtnn+etnYvcmb277UK5
-oE0H4vj43h1iUqI3UFpGkKSECCE4YtvU0Z7ULDpWXDutIz3Bo97jfIu4gPjO
-uq8IvukoyYTktA26zOkUIYemhjm77b22udtcxvyIgndJHYXsrAMuNb5Gc00u
-EEsC8N6E764aUHIFCI/jWEXuVRpQC1Nx4RO4gwf/++/DWrKentw4z6uzdwRf
-1GlntgnvLO3B16zQkgx0XCn7PlQnuDhi1ZI6TZQyUEZP9g00ylMnzvHGQ1AH
-+zMrDwqpg/ULXaq6fbxqUd7euWhpcJqxr0T0jlD1NCZGtieekwCemioe9h6+
-ajb5rJ5SR2/UnK/iTJuQLcfpc+lflsXU/efjvR//ohLdn9k4x5s37Ndlmgsn
-1r7G7d13NrOoiihDmdvmVjeq5IWMZQGKeLSZQLHYFalIAAu79xbdMJngSgYf
-KLFB8aRS9R8Cfv0o6hxpXkh5tJO3vSUWOpuXG6zFN6gGwwwUYZELvpsy5sJY
-HISG2EwpTSQFz1wEwoSSLDjVlUIQE4aLgooRcCwVbwlDLKvAaNnXnXrotSGF
-Ic3JJZPIII7iM4vc00u2JtbksDxz4hzX3v+rF62bVfija/8Hv/7Yjzb3F0mr
-zf5hz1tgZ34Zp8Y4A8vLe/LErx3coIArmTy7QxznDMMurRQWfW8dDt8y+AlD
-PMIYpiSJHOpOy2x2E3FlW2uX8aPFtU0P+MIFp/Dx7pUtdXlTnZBd3B4JuCAX
-PI4iruoAzTGF/O2DY51ktBRz/jlPopB9tMMJDUkjKXRonODChOQDitveX0Rd
-n73HsxvfXUaTbIp4VRz4SOpNA+WjIzgoQ884LMA52rbD+YLDdFxOa2eo7KFb
-SilICHgXyS4gcQKhAd+Ys7Z026XkCwAuBPMwq+mxsjN0wUYFGz+YFPHGzkVu
-zy6Lk6TOBaOQpJqrh0XxhCoYX0Y/WclpOYOpjAZLNUuthX+rq5E4FiuV96Mf
-TIgub996mSePfbn3zuufwmx6dmOvK3Z0+gS3Z++I5SQ7RFsosSZCZAOfVue0
-d5gjcQSys+BmNXef12TFfRm5PXsX+B5PP4QbdaAZOCikvrS10Z3afHrjHG/v
-vMzHs3e3gmaEhDKajVjLSp9TikWYWJSIgHPkmtheKl5ANdcgY9PzqKvOHSci
-3m0VHMemj30hIuKH4f8fBmG7Mb+2tdxsrs8/1JNrT8jt3b8SFVVpO4bcM2Zz
-zzgXkTjFhYiTgLopqhbUKrW4MFmDOYRKMAG9Agm/XVQ2x1JUi5DIHFlbr064
-AuOcIolRQXKhSGZIFsHhXMC7gPeW/B6iNz7X9BBenQlMQwuxRZ1jQMhkMj2o
-x+eIF2idkp3DlWwkFzHnlYmU93QqDirob4npdJZ0/0BHITT2mfqUER/AC0NO
-JNcjbkF2jV58/98jrhERMRPgZxC9Pji6cw/8loMiytbPPvoDbUpB5/dYnwgJ
-EzaHohAaZovA4NcZ22MMYZ3i/HYBTky/xo3Ztc1jk0e3Plq8t+kUnBoY8/bs
-PRUp28solaPd2c0P+/d5ZP1xdu+9pSNCHAfUzUDd5xuc1G6sOId6T1EL1c0+
-MGhgkYVCi/qO7BoynqR7hyzT3uxdHOdO/4hLV/8D+FbERdojooFCE4UgoPN7
-9CWRxWJXyIKrTjADnxc0l0r7r/E00ZuJQ5zBgbFxI+K2i/ebG2uP3dcp/ayd
-jqerXujPr74k4oOqD/aaUPssqvtumTWV1Mqx5f3jnKNtjZu1LLhWhyDvcD7Q
-j+m+QgrgVv/ZOXxf5nqq8p5uzd4RcV6VjCuepCMpDzXw2liEWa1w6heJnGx/
-8pWbJ2QrRHUECVtv7lzcfFgX+6CQOiikvrS1eqBpQUq+QJlD7pHSV0F2WBF3
-RaSOg1wtpiyZXp1naVhd2qetfyNojNtH185uqsA3N87/wl1YD4OwbUxPbSpw
-c2EF1ZMb3+VtMh/P3t323fqF3HuGwe68GGK1QUcynjFbYUONyNGVu43tjG6W
-rJXVxNb3T/325v57+M2bFxnmbyuTDq/JbMzakxnM/VMSoYmVubNEFNqYtK1Z
-hLuuhWaC95EikSyeXAXokhO+c7jQUUJPKZYlJhSogngf7OGJ5JWBwGvCa64O
-qk/yZ5wuY3wKwSdKyahzBPE4EUZXKDIgrieXewQ3RSVo0iBFbbP/0/deUifI
-Rnd/DNGnuemL3N9RPFi27t69i966Rrj2Poc2GlyAMWcGXeBDR/IdKRymj0f4
-9hP/Ri5efYlhfpnvPfY8nld58vi5zWc5x5+892Pryjq2v3vmX23++eWXQMoW
-+M1njp3n2rU/5Nr8o63/4cz/LP/vlf9N57GjSS0u9fjyGWg0D+1a1Q4u2aKg
-JDLLGfURlSm7BXo8yBQnEyumiPLdB2CsDxK6z53eMyi8vXNRbu++Qw6oUEjO
-MwBDHvELaGtPtohFkWiu2A9xNC5Yd0gdSZWRAo0VUwOgyOb5B4J9gb/xuOg7
-p5/nZ1f+V2PCefPkulowxNCavqpA0mSTALH8PY/Fyhgvqh5QrMKzrpqMe9FO
-ujzA/N2UD8tD7f7O1MNeyTf3xOhye/Eu4r1KdpWwNSIYzNRpISdB1XRtTgRf
-g5v7NDJmJWcIa+2FW7PLsHH+vr3/7Rs/PSikDgqpL3e9vfMyt2eXkTxQ0ohL
-cxgXaMk0wU5MbnXiMRSAc86iT7ys+DMqHnUOIeAwB1oOf72o/EsrFveNE5/c
-OM+l+ZVNF1qVXE/rTiC25BAp6uTw5AxPnXz4a39z5yI3Zpc5vxeou/qz37x1
-ievzD/j+o/+S/+fq2zgEDQHUo7kGkqpY9lb0NbMLNEMq2QjIYrEfvTgKllWk
-QAAAIABJREFUDc51ZAn84zMXVvvDm9d/yr35ZfWhwcUR0ZGs9geVMZHLWBPa
-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
-ZoFFky5sCcRB3IMhMNt49JPue0dMnmo1cywpZSEe9Fbj0x/jclD3MvxeED9X
-WkUiaPckBCyDFLMff/D19gqJDdw4+W2/x8q91oyscqYsL8/wS1GmZG2/lt1w
-v2Q/XPK9y32AcTsjaVYFQnV0TibmNbYLkTmc4zB5liQkff1iqiEQI8ifjen3
-zcSB45GzJT1g8YQ5RuF66K8Tv9VAX/+OA27rx43ce7DSaWo6h33aR23bkFJY
-zDXie8VW7hsLIZK0dOA4cZR4JimHMziNMhUy5n7aPlt3zNdfik0/krDyKB1U
-GOySDzm/yWZybFw8VKyIWNFlyYYB8++wN4KMDN5r823+wQuX9qE9irEQ5jdG
-sCCp02it2u/yfyB92M+26kgCWIwx3x24O2FjdGANWstcwAPym/0YMANBEk3h
-5KWbNckEmXAQNepTNvfHO8yuUIbv6Yj6Tn+0Zn7Nc+X9xqWWZusdGeVpLLyQ
-LVjGXt0QKLbh4te8mNSPC9ZhNS32xnS1jqfH5xejBgHWloVg5b/CMm1pliDm
-d9CfEOQlcY2HbOmYmxGTrsiE8XOMDGK7+o2QeMyPBsdwfXbgyGr2KUFNEKrr
-7cwOcLrYcBDoGk2adAcHB+WBjXcUMuzXXVE6Q5jv/ezrNGZTcVBSK+HioaTg
-TbVU0GI0ERqdztgZ0emeO1iFGKYH8dQUDJbn/1a+6kuLZpcMOFSUfrfAZ2OR
-lpGxv/zrm6Ka4pCXm1pkff8MpX/xD44ZLnIJWVNlA6WqQas+KdO+mZv1/C7e
-kUZkWV0JAxlZvEi+fskCRYeLlWgcNvzHzJcYEhdlK5+bZIUl7k1Lr8qyVn4r
-CvDEmxMrPkObN5iApZV1xllLlvmY9Kw/u+LEjjg/6GmFbgy0VxBlJLy79IMp
-edehGfuS1itxf+zKUoj6GWL+CTlYb3VS4dsjk0jLyTnMCyPYKfE9KZnR3MpE
-soJkU0zcC2WEOw5mWuXojxk2p2PykEwoJpOcTc/qN6HCZHtmbM45Xx2X5nkG
-txVjqGBm5LU08meVUoDKD0fIWtXw7EeWsjo1phAbRp6HddrzmPrjHhxhqMhP
-qXHebiVbTw0iLF+sfq4NRRxXNErOgr171UKNd0o+zAgF7exPd9P9tk0UUnmw
-L3pjV13CG/lrxhxOI4H5B19QcsqmfuLTk4ej1U8KQygR5DRC6EL/Um8jNteo
-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
-Png6uHQsYaIT1Yg9aqY2RIoNWAi3/togXhRjcoIERWKvnO81qrSsbDkvcSFT
-oSKVMAkyOOiX2/t7w/limfzMpjwvZrysrKy+3auRlBSMohhpKm9P5gnNE/x/
-twiR3gjhwqCY9No9ExNwCaNkAAgBxRYZDiJemqL3kgUPwejsT+PKbwsl6LL2
-V+wjblEcRvpXe46oP380P7fZjv79Q4ODX67S+iYz/4lr5Zdl18xCJ/YoOYVq
-gr4m1MmCjFgDY8k0dSbjGO6dutyXPWCfFZeS/dpTzwgfcglX4NjmG9TupS4X
-F9fMykqp5+zRCVOy+UiT6SQOIL0Mxy6LS0vUZWzvMckkt3OUa8nj+2iNJXl5
-Xz43ZS6PCmJhNl/uLKGTdmuVmzWBWN654gA0MqmttXrA+BcFUOlDp33Ondx3
-wr/NrK3R3NbPXft4teMOahli3UlQYirmDo/4zVvtjCqP0lsTsjm2wjl64L7r
-g5SVkYHyIipq4I4c/hUHa6KF+SOI0W8hXgIlL9nTFKkCumqtajE/OTnZe/FA
-s60Umnyr2ASYP3OwC9f2OoN+iExOJ9FFkNPt63//rKGHSitmGVEnvr7+a5ge
-23q/bx5jJEOBTv4NBQ46pqRZZ/iVwOd2ViSEa79mtvPtsxNOvU7wknNqK/Ix
-o/sJ9/jO8+p6nCEVC0tHI0zfhxJNcZOuIBwwbP82O3G97v/1AtjNgBIebMkp
-NaG8lQSL7fLm5mmCHA14dlFAxQB3qBu4nNx9IRpmswb4O57Py6ns9TcrdPVq
-+mluu7CYfv/+rQ/YWveTspIF7Ybd7egYeFw2bm4OjkfI6mRl6hBv3pqTDx4C
-RDaAVz7/DlsvJCGa9Qf/26zkd7gX5dC5/Uz2GOBpQHqWcans8IOP2InEt4L8
-fXiqNV20tN7o+FrzdqVi7ETV2Hpbu4FsKeZ/VtRqfqgSRd4+3qpdjYJu58n9
-uQT222K+fzm/k5b1vOvF9vW+uVulfKENq4x+sdgP4zAh4aNOHc7Hx+dzBZua
-9XNLoO7PmWtF5f1QNK4DgFgRg7o51ShTih1AlgOVuneCJefN+3swUv4K0yFQ
-dsQpEn8O78JgzFgV3xGQbttjVVVVqTeYwn/+JZlP4wsKAkgTJvfPURB1qHyi
-jSJt1IQaIHV/CpOoN9vqSOw1yCeciiYyALLa8+lVvxJrR2Ko6LJPXRJSNn3o
-j5RXsGwcqbc5H1t5PZz7tFRXnyNedL3Qfy7zABUWMA0GQBp+9h8BHPzZeTe7
-vl651K7bqfw9anmFdQDNOXfDAU9aRsbncCKdBfBv5IpyniYDkwRNRv2s0tZ/
-fkt8Pgi4b+lDQ0311UHZ8DgU0X6E6WQ1UnkS3YTc0KfCfrZV6Kbqoo7NtxcX
-QwBhIUCG4nHWD/Mo1bmK99kJ+Gdtbf/p5nDRe+7FQOY+ncXM2M6uJheZgmJo
-/q0nAMxRX5/fAs2zczOhHA+HFZDkjsJBHJENFhYZ1OjoaAB3GT6vYTKJg/ph
-vdGm8rux0QCAXYIfrnA13e9cn1ZDUFxS2aRBo1K3EyeDzabv+e60zvPOcnZh
-QXkuS3aYWMIin2mxYWKAz4IbKP/dQtW52Z1L2z8BDbnDb0tVp+o318DQ1NJC
-hglR7mwmCE156JldPLur742JiangNsKXfGohBfzV8VxRjc+ZlR7q500IWHF8
-SuUpvcUkVzdmZxVKxAQ9IXslp2ZL5hhPOKRbhRf//fvXXFJcvBC0RNgxfdhO
-Ti5UzBg3brrt+lUfByLwnURvphZ8zolphd5P4ro3/rrcdE5R8vbubhQMEqHU
-VJd2nuRenMlfp901WZ4UAywmozg8Jgbha5cTSxzvpyHreLtfU2+0VIGeGlbs
-MxqOGSV8vwyTNGntoE/hBwBicCrrR53NWlN/5OT76arI+2evhXaFaKq9v8Uv
-cysrIR2dLKIH+66H34VzCBIHwBCTYMHRY7kcZSPXMVQzCEJ5tlR66QYFBW3J
-kqFIIiofHlzJFwTM8Ujq2O+KslRwYZTOpzjrUvoNB2txLqfe3XoGCzFF4OJz
-iVIF93gz3FQVMh9/6HWZpnmX4QxZWVvj487O39d5uFjvRD6PTpHcZvCBf17Z
-EbHxUIpPKY0KISzhl4Ji58CbmeLqwPTx2d3Z0wNiWKcezv9FYr3yR4wwieA0
-nt/CEIlOUWurxlvWJgh8/8ICmvoOJkKYimCwy5Fd9xsb4FSlGGkwXk9PuFij
-bGxstPimindYaNXyDSDFDRUrL+48O8eI4pxWNzbonPurar5Uw8+lUEJV9jN4
-CtfHIc8NA0ij0qjSSlA0vCtgY1PVN/bYOvB+W/ssComoUP19qmDKTgeq7S+P
-i7Oz/mgCefkxGs+hpPP2PMuiZwY8fv9iDh/84zdsPXBbhX0pjywWuTsAiVQo
-RC1hhdoBNAWidwslro+HIdH48Lo85/t4Ji/1DSUcGDDEn71kyuTarO+ex4nV
-XVUfPnW6bmJikAD+SZlTVs6NmDZ83snB9yZja6S1lXOfqliR6vWAvTv+m2ym
-/Ghyejr2Pnm9Kg5lgj273WbUj4uOhkLkeUNS0LcuDByuJbFS4UPD+nW5mojt
-oTlcs1nz45Vqet/c5jH1kZ9Hp3Xd3d3CWM3cqwLiwQ/KU9GVysJFXv2wOs30
-l+NeZAhrc3OBPF73+gAIBTrqtTFVKF8rXyz3W+0/HEX3O0Plzr058KqE1nWU
-B2Z8Zoezs/Ko2CxsLrOkkREp1MHmwmmGX0sbhy0jVnAVj7NDVanj+wMgoeXx
-ah5zPYc3VI0OO7GenTeGB9O7V7kNDTftVsvVKnjf+xBeJz6XA7o/Xro/AZOT
-nT1Mmz4MYLhxjyohaWlpSlsCJrnQCIJYSBcXl5V2NwbVGl06Z7gbT4Tu6xPo
-jfGC1CI7LA2K1Sb5SDVPuUx2BJ9z55iKqfGCDo1W/S+IR2VlZSjwYjxkciXz
-5dShW1VWRvRoXL7a/SsrK5TmR+qRE61U37Zufqza7pzqfXB9/l2KOy9Lqmv/
-GnXtosaAv51645cpzUZVn5GdFmLpJtGvj+xNnayIJWlm9q3radIuQoupbp1W
-twYTKCulFRU0xFzzQRIl85deHSOF8/4GoClFUSenNd3VgvQ7/m0l4p4Tc0VS
-6OxOdaJhy0A856w22eDi4OIqaGlVMFKGLoPYX+2IvL50f/x4fn7e+2warvG9
-o/lcrZTkjcjmbDX3bJz9lHWnQ1ms0DxJCMxddJ1TXt5KB9VWnNbN823Nx/0w
-n+VGXznS/qc8sQonlNGCxfDx5wcGvS7tIxUG1jh0qfdVtl+Ag5+Zye3KCaOB
-Pq8sMVNGh4MwwILw9PK6AhAnv65O4chJJO8Q8XT+zaFDlOB238qIuPrqGyep
-jxSjKL7ZnoVoLWe6dF89rbScHCkeAs3mxq/vVj1RB5MEbGTSIKFSue3tWgEr
-xRYkOeMkZpiNiDw28CJfVnObKTlTJgUfQR93rWpG3999ASu3nycf5R9BT0vz
-Eub3GIZSY8EUmpNtDZDE/fkGzecQyPk9K5FTV4SxAybYruuJAktWr8NdgUoG
-lXK5Hd6xFxL0i/VaEzxAm4GdHXczV4ncztPaD/zHV5e5xSvlQG5TognKyMCn
-0OtE6DO6T5Lpk6O5Pa5+bl8Cb26/P4YeAt8MEImrK0adujQ0LphIfNgntsvx
-vbFqamoKc+ophIGW77J9j+IalmFwwiUgOC9eUOM2vCeb/r9eAAI16Xd+ok/p
-ptp1bOgUna+PMGj4Lb+8knviIjMfXEvLcWOQnIQSY9NPNWLYR5EsupQ8EAAG
-yT/K6nNzHB1dmCSpm5NXVG3yYCBUkg9FPDM3l99H6RngeZQxanz5/nJRcXEQ
-UGhn2CnyrehFrUozRJ6ysMUvmdKtHR+yU4X565iQiWcogBhrzXZqzG/JMFmY
-MD80RgULJqwy0tMVTqRZd4DQHE+h60/tuiXnfn/cFSz5nezG0KGhaJET4jCv
-xhvC6iIAAvK4S/jhHo+/d+taSkdH97nwS+dTymrKm3OxDZiUHQgkUNvxQJM0
-pBhh32w9NUo0kFRY+1YmVvWFaymKRMkV/5acXY7Ll7eItFfAYNJ0FW+2mDPh
-hq1Y8+aIubmxt7W1Sf7qZnEaTYHaz/yBI6QjGzmKEDtcgObtXOaRlfQmQSCt
-nAyLGRUVJZ4lwJ/+PTeNfMmrOMnIbD97NVpUKUTwCzw8/ElrvVXe9KGSDe71
-U0d5OiJE0Oe1N6uOPlnKihhVllh211RVdjOAQnbcTP3g8Lq3lqj7sXo90G0b
-YpAUh1T8pXlY2Ibs+k9M+7nyZNlRHfM/NBSoJ7CeAbK4ye3oZb3h5F4BE6wn
-rndG2q1OL3YgF1KVpmOc0wfd+9v6YpZPB/80WomIiYUp6uXlGfnY8eYMr69n
-JszOOShKiimwx2JvfjbXWyev7sgx2+vadoy96EpRMTEy+l9dXSVMeXvSLO+P
-pxZ0durQJkXTxYbaOj968/5bqRP63PSLF8+tqJAS+boQVBghq6WF+3lvEu/3
-mxxMY5kkr4flPuuKXTaYImwIe6eXN99MDgfB+qHUX7aFcQDDbQNe53NtkDzv
-Nyk5XD842d+rlmTDxvH9wCw607/MIYZWUwvrtOvxmtqv3R+JiVIMuyGYuj2D
-AV/QfyUoS+HFF7l+0puSklJ3lzym1rpcRzgHUEzpzlt2EfA4HcFJSUmp6wpS
-FeotUBoSaeGNOaofmFsPs71q3S50K7VbFZMiobw1GUWrhbLoWXl4qtDisUaR
-XnSbrLFdz9c90CcUdLPVwnsliVLHQ7zOWz/b6PseH92RP5psAEolRoPJa2xE
-ByxxDXW3kY8v53trXF5lzNoC40mnMIi+pSVMQ0ODpKret6aTqA+tbSacPkoK
-feE6nd/7jr0pIvhdUUi1Z6B4ILWRWaDzq7SbHJdcCBibgltXqCMw/Oqm0JxZ
-GXHU33HZrB/pPUKU50zzjwvEaxfAydJsNTA+e6CECxRej8T4QEFEJv+GzpRx
-779xH8E3NTcbrTXZfLqTWodd0d4ItNCZHIzYoNPY6WArS8C4F64mVnevzMz4
-A67Fu7C3auCZLDtjfP8yucZbBCTu407v43Npw+jpev9zdU7E6GtraVTtGHxz
-l135yo6NLdaxwyVxfb2x/uY8iVzsc8jZ2Zm5rW2XiEvKDV6bIEEodIs0yFxo
-3GB0wuTapWCP8GxBaRU0cXaWkDV1mNs0Qg9uWZjz9YhUSSFCKsodIHqft7WM
-ODg4MFvBSYSQZHePXPX3nM8DXN1VDxjiCKlYzOcqmH37BvCVlp4uwJWlmoSo
-mOsMSh8i7/ZvJaAk2xNGq9kW3bMoytffBwfOqNVsOMjd0BB0fn6enA7f2VOO
-A09X3q1+Tibz6Gz+xguwtQOp3a/7CZpmnvVtCgseMW1w2k+dvppE8XJZBguY
-IFJv1dqt+bf7aSr7QZ9LpJ9doGOEzzJrHF+/pF7yg4iTz5dePcnjXmJ65afZ
-GsN47BETwYc7e2MExIXPi73oB5OImzmJYzj65yWwA8YI8N2fVxhle19L1CH9
-9eXJyyVg5ozp16XduXg/v9j7vOENMI2fO+MTvJ28tp5vnZ8reolyvOHDhH7a
-ZXlH29clk/O5vcsqvqJiYn6+13sSRzaaLpsW9KlCZCjIzxe2S69JNV/fagtZ
-BFZEProH8XRVCh6hGaOewciaxHGgnz53DAAnpScvdnGgLtLDCJ7ZAW+BY58O
-WjUZDeXuY9/KPUIUCQquP4GasM2PFvFrA5AqDytdpMXH3IX41QGVCtXteDGC
-ssd1Jm2YsP7P7gTxkvnrEr63/9fRVQC1taxhihe3S3ENRYqEkuLuUihQoMVJ
-cXd3C+4U9+AuBYoXghR3K+7uXgq85GUyk5lM5sxmd88nZ39hfZ+OA7fRh6e8
-QGBeBqNAbDDcY8PNzn9wr9GH8NgeBL6JR9o1zN8mhdbhgl1kcEp+s1lYuH6R
-Ha4WagSB5VA44inyw4AAuBYzMZEODfOaay4re12hVVWeZjIl12bcJ4YlSeot
-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
-wSdZkwIV6ubPLU/EY4mSkage+M47remgqw94liwF8l611xnrbel+eVBuqhJG
-k6BvG0zIX9nDQXMUGM4PdIhrbqeJ2B4aDX5BohEqAX4qWW6r2sF+Lti4rxvn
-gWhejnw/5f7nJthNH2sMUddLL0sYYw+vs5PX+T2wOo/hCnvpY4xx1tBvKL/X
-2/gx/9OGcqzjC9GuOR+HuZc6V0fvMP/n3/Pv5K4uxy728MkospqAvRwXn9im
-FmBFDMsYA76hSfOk9gE9XGNdiR4A4OjUCJTW0ea9vKS/BCL6+O1BH/+5AtjD
-JEsA+WHJyaxAUWMwANo8rw1aS4oCviOdKATN0s7e+bIlVO5Tt55Zlr2X2GL3
-WUw/Rnw/+D/PU+9QVFSxZGti0d0pBw3yH7ldHspUaBuh8W3Z5mNUeZUqZWKr
-dnCh8JDbrZjX0y4x4W+/HoxS36Ai6eDjM9UPpOzGJgfntrbR5AIbcxAp0iUG
-Y3uJ4bzvqDicV9uOAz5wfW54aVkIsl1mV75WXtw22/p5vkVhnYM/bnLUruHb
-QpF1N7K9+5Au1Tv0Dp2p03SKTtYp+pSu0f16kR2kW6U3LY0/kneu7iVKk6xB
-gzW2lN8+SCPiKnjf6KaU23qNVW9tCUZ85+DvcL7En6fyzh9WYp74jMLXtK0D
-6rHBFi4VinT+vEwIrQerORL6mCfaB9tmWpNIwQX6sRJeHDAiOV/t7SmiufQh
-VuSbzj3N5eGLEIbzvs+4I9PXTBh/xK76uA7jFNy+7U29dJO2hSaAV4Z1cFNB
-2+/9YxUFaMJ8EK1OzDtTzj/iDp2jz+sOPbXpMd2rpzbdrNN0kpLpMH588Xl6
-RL61rZ/aHinBYsQpaLSbPd+dcKxNwUKVDGNZS8UMXFeNZzacrFUBo/FDNamF
-RtZLVAhwGa9bfWrxqpYNWkiV5/vql0jnyUNrZPUzvq/xt+3bX00B3A/eUbKV
-7UtF+XHdZ+op9o8NTbyVJ3SvBT9zditH6n5zaU9rqSUrUiPmHqXnT3TXrVvW
-wCIpkfKXXrO4QS2VGhzJp9FUP5a4JWy0J7WjBXTQsL4+m1LbEeW0o0UQ+WLc
-pbrDIAKNlDnVQKxucQ0OviHifvUwId/6PVVM3kx9LGna3KTKr3RNKq3Xp18p
-aWz7GSW3tcqgct8OQOliV3xWo24DqhotFWStkRsPN/peSqifo/WBi4ZaauuS
-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
-rstZvxTKHhyGYjt3613200t1nUGBfKsuB4Q9ziLoQimN91n71guGvhTimQ2f
-2c8DSzvhn9HDahi406dfCtRpGCbSH2tDq9GFR7QEEnWb3d+vlGj7Lq3HKrLS
-G9/U5HahSMvUOtJ0KMTgH0p9/SMqpqxEt3A/NwRUpcV5/brSAxacae9KCW/R
-VVqmPp2nfh2uPn1eP9LPJMs/j+QbDKVItA0xkt++380+IrFQjxKiaM2V0GAY
-+nIAYayYK4OZHlOzsBO6TEWDKTRT+P8qTUby51iAq9fGbiXRh6FQwfk9Vcy+
-3MGjoRXF40rD6GY+nONxRODDK9Qk6YCSTibdIdG0QHRlwXhtfusO591VnmHF
-i8XuTf4dlHhqk7PEzlVseK6bhSK9w3rO1AK/JQ2aSgZOc6S7Uz6mLioWp4iU
-U5JfaxpczVe5NVIZ8emw72Uj7rXBWoxUphrQ++/R0pQ4PSPAGbYuGE/NmyKf
-t+vfgi+RjLslWgVxUbAX/fR1X3J+W2gKU7EC1qT5bdVCw5HB8MRWi4z4NjGR
-fqw41Y/Lgc/Ptcnq9YzucMk6o14ckCynyIfb3qMGDXMBchbLGcKD7RYC0UZD
-3rLHrrI6BdnWlXNdML5wzcxfNKJEVrqQzjInDVh827ynNyYpzvsD3r7MfeYC
-f8Fyam4zvDdE6LPaebVUqvaG/ULOPSpQpcp2lgT/El2sbfMM1Jmez9zxS7vq
-r4R77zr2WKESJk08s8Gj3QeQtapATxpSsBpwXkkQtsggjTDfr8cgpaJIM4ys
-KwbZXec8e+3PZ1HrVg626dAU1D76QViArWFOgPvE4zbs6g9NNKdIdlDAuy0v
-UmQkn+4t1sVpH7Hb/IJ8FstnlB0z32PT+BwxXAZ7IMz+cob7spQLfIe11Fwf
-0Muibtx2uumkGzMTrd4iZi4NkAX3/0fkmx3FKPRC8ECEwoJwtks02B5q4C5S
-+p0urcdqaKS+NWXcu5s9Swi9VZUQo2yk9o/vR1UznGKyy79vHXa8V7LNqtCK
-1iId3TKLHv2OvM4WPDdw2ad1uwbsPbcldiBubrEor1lALsD5dlWbGc47Pkty
-JF3sA3eTx6SaupStu8bP7IceVDns+cEWz8337SlSt1owv6ibQ9AGfU7evD/D
-PuH4NUvb9mYKzu7rOZ/emG5w1gjvFxBPb0y7ANf9wcnmNt1mfCDumQ1KQYYz
-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
-9OpHRz868tHBj3Z/tPOjVR9N+KjlXJDgU0zVzwL4A6AV6mEMTMKY98AC2AGn
-w7lwCy/Mn4B7R+75431wPzwInwU/+4FbhylHY8qwWN4LQRCW+8FADEKABOtW
-GQgFcqAASqwj1ECDuTEcaIEO0zQS4zcKY9gITMCMqWoBVmADMSAWxAE7iAcO
-4AQukAASQRJwg2SQAjzAC1JBGkgHGSATZAEfyMYckQvywGJQAApBESgGJaAU
-lIFyUAFGgUpQBapBDagFdaAejAYNYAxoBGNBExgHmsF40AImYLnVhvXV37Ce
-moj5azLoAt1gFeaptWAqOA1eAMvBb8Bx0AfmgLvAQ2ADWAAeBFvBIky3D8FZ
-rG23ge3gXrADnAM7MXf8CfPHn8F58BF4GHwKPgEXMM/sAuvAZ+Cv4CJ4BGzB
-UnI3eBTswdz7ONgIngB7wZPg15iT94OnwNPgAOboQ+Agz29HwO/BZnAUPAee
-B8fAfRjL68H9WCHeA1aAleBOsBosA3djZb4G5AMRmAemgH4wH8wGvWAumAFm
-AqwLIQsCDID3iNe9NxDw74CiGVYgDOoJFodIpLJQuUKpUmvCwrW6iEh9lMFo
-MkdbrLaY2Dh7vMPpSkhMcieneLypaekZmVm+7JzcvMXYTiouKS0rrxhVWVVd
-U1tXP7phTOPYpnHN41smtLZ9s237jp0P73pk968efWzP4088uffX+57a//SB
-Zw4eOnzk2eeOPn9s9m8mdnTP7dvywosvLVn123vXvXz8lVe7wImTr79xau2G
-NzduXtR++q1Jb4OpCxb+7d3fnVl//6w1U/rzRb9/7w/vd/5x2vQZM3vnzJt/
-x9kPPvzTuT+f/+jjTy785dO/Xvxs09Jly1esvPOuu1ffM2K0yZjKX8Nm+DJK
-QJVoLtpO0VQR1U7dTe2kXqK+pSV0Lb2V/oCJYDqYLcz3rI/tYDeyJwW0IF1w
-pxAIk4Urha8FoaDaoM1Bn4kSRA2ijaKPgsXBHcEHgz8Tm8TTxc+KuRBPyN0h
-r0hiJHMlRyVfS5HUKs2UVktbpHdI35DJZXmyPbIvQhNCd4V+LY+Td8mflX+i
-KFLcq3hFaVC2K3cpv1B5VFtUH6jL1JvVn2j0mhbNVM1BzR/CRGEtYSfDPgtv
-DH9FG6fdqN2n/UTn083WPRERFjE1Yn3EXyKLIlsit0cejvydHuk9+q36d6Ia
-onZHvRD1BwPAUinP0GVYbNht+J2RDvzFGDfyf9+aWvDfSdM/zSXmY9H64b/Z
-0YujP7OUWA5aWetc63LrfdaHrHusB60v2dS2Httc23LbfbZ3bH+yfWb7p42L
-EcWoY0wxzpj0mKKY2piWmJ6Y9TGXYltiv73uj7v5L64obmvcF/Y4/Oexb40H
-8Y3xbzrkjqWOvzgjnF3Ovc6/uGJci11vJEgSZid8kVhx4x/mafPgRWRmRVjK
-6AFQ2BQeqwtmQx90J+mhhBJQStZssqYke5LU59L6GVFQkEilKopIyVahSJNL
-uifH4czJbcqB3hDqnCcnROwKFqs1yZntY+9MvVrmzM11xufm8nNHQjeid1k5
-lmzY7oNugQSZTTYfbcRHFH8EI3u86pJ5eRY2ochmdsFJU7wyd+H4JP+5k5U/
-ljevmY2eO2tyzmMJzaOT/Yf8s82D/2T6mFYso7AuVniVjMfrgzaPO0ktYCmj
-x+tJwcd6JIH41J2OB+eVMFaBGZ+POGOlUO41+v83CbysHmoURhNUGKlNNujI
-DxYilBobL5bKaqDUrROmxsjUIoZi6KAx7Z7WshRRsCk2MTktLbJF6A3t9rSV
-8y1JKbilPc+6scnCfeOzb5hg4C5FCmNh4+z2Su5fEairmvu2lpKsoOlLaTFl
-IbaGtHzuyku99nqbSK2y6cLiub8ioSDKFakMYhDUHksecXZulx6GLXvnKT10
-TkMrEIUgFHE/QCF3ieiUrEEbdZD5AUv9XECsMrPH64QpyV49zMAjdApTkvHA
-8T+MGZVSoIf4v2SrjdLTKiUrUHhS8AlL+SDFqpQaj9wrgXBZh0p+x5pYav0E
-dgJUxsZaTfrwUFHrS3OZYJQsjFVNX29Z292WnDkmIfrfz39I+zLkmWU9g2hJ
-UFZQ9fQP55TBtrzEWEcp/LNAFmUyWqzx8cm6cUfXiCPbZCK7qoEdU5qY4a1m
-OZ/ZUVXYlvzI95EwPyzYMy6pkTsqb6aKhKquZie0eoNH4+GAeYNfMseZDqwn
-dVjzJRPvyGgWBsbDClghhCakUqrdST48bCvFMzHmCHzx9hfu2oCZpJeOicuq
-CkXcBm41FXnw8rz2ead7F14qKFw8rrjy3oE7Dv2IW97sXfAjaSmpXIv+gayJ
-+ljDPAU1cHngI5TADbw8Z+7id/pmLxh4bGLjpucnNq5/gbFxnL911oKBPbj1
-aDtuxQqma/Aicxeef9hv5GcdhoNMCCtPHxu/I7yLoVNhkD3JTmg2STC11BoJ
-xY8iWu4l7J6SbJMgAWZpcpGSa9bm2OzZHQsWJD+4O3flWDote2mNMdVrQOHm
-xMqp9xQs/WJrfmrFsqm+b/Y/A22/USlkDR20QuOJdJ93Vc5AoGyhyzf24ek1
-1sN3Ne7bZNXmLavb2inWZ8ZhQS8p7hllmPjqHfkr7PqmRXvb9v91B9Q881CC
-a1uHOMJkzVaaq8Jjt1RGER0JVtEs/BLzoQyfmIYxLbARiKEElSZbMvY+rJtc
-xfQrE1NzEut+35TYPCU3nb93w8AlKo/hPWSIBy3CI5Or3SYnRCnJWuhDVF7P
-759cWVK2qU3kdNsKehb1jWY6Nl3mTnG7d7/AvXOs7WEI7joIx8OgzzbXATio
-G7gEz+PnKbGUSFLLVUoRpM1JPqTFsDjRminby+98cxDMFtbOXzW7PCY1hel4
-lPvnvrc4J7f6x7Y9V2EY7Ni35OKaWgIbTcVSdtaBLSYApZAwk1dC26FGjzSs
-yUm5MCGoSOgno9VsEvjYDGiz2nhBFIXZNAsSSkMklrBZNRWVwazJnpcWkyG0
-ZjhDTKnJpniVJkikdRjkGboIna1kSxgTHpFoybVGS+iFZnO4ITVFrwsSLsnQ
-htOXw1koFFpSImWMOKcznxWHReSa7WFhjlGZjhA6IV8/KtmB5JGOSKWIgewn
-EnGEz+FQq9+10wm5EWUJvC1DbCGqlVqB7UZgMSeFmgifCVKUxpRM6IR+sAWY
-B0cKTJUSaVYGJS5oYCKF0I4lk0thiA6iELJjgegOYsLNDndqWqSWWoPvgWiF
-UIvbk4JEOkemgZ4Sj4RslDNSJcSibOKzkRiGwTPcGZiCLUbMK94beaWJZ5Un
-d2FWKcCckpswzCkQOOAhlIeysY2MpT8W3NeANGHUO3Swqizf01aWjCVyTCKR
-yLrFIZHw8AqagiOA8EdaWgYvwjQMQzDGw5Duw3DAtJx4Xp3l1JOdIycXw/s9
-J0bvMTOwpQ4UZjlIIVOVEFWAwJbd/4EJwvExdrkONXNz8Bc/pJk6SbQnLLeU
-5f5+JYHordrBT2kLfRjfT3QvL5IoLJLMJhpB0rHcjwEJqj20YdbbO+dmHXnw
-MHf2CfhAd2/r463TlxVOuxv2nnq96eHfX1r22qkL3PKBH0/v3Q0NB07uWfrN
-nk5+PH24Iwt9FMtJLB+9WL3bBDaLWyOgWNjyGnoiWCDdo4czI82WTVIh1ZpS
-IvVMfKBhx9X3C/G9EuJH0gexHwHcRjxPMGwpEmg2en0smTBmE8tLIG+AUhJK
-ime0Pb3GIkXqwvu5d3XacbPnz27yRuUtqF1z2m40WNpzinOaV+9a7XRGuZ1h
-SIgUrFyePX7KihX3F3pb6xNnjTaalalN/Q3j3v71rhlGE8+bg48NNlA6jCfs
-gwlMKQE0OSkbL/YwurC4HyIUkZQM0WYSGjUaFMVrH+wt10b7XNHm3tU5xdnN
-AoslKuaNFXWLCo3cW8t6c2du2PPY3iZak9O2e1JSWVyUmPUmHO7IqK7MU1si
-6ufFFIyK/+065T3trY/Na/ZGYJopBxupxzA+I7DfBbw2D1Y5biliBUkerxoL
-YGJUsCqzV4fdB4FR4YlV5UIvTM3rV5liYq3T6hQw2Fzrc9GRrOQEVbi3nDs1
-Bla0B53WL4NH4KyYhh1vv/VHYWiky2uAyp22onohnEIZi7maXfCyk8fFZxgX
-TZgmLnxixJ1i7jAbBUl6yq83nOgafswmKbQpsL53bClSB5tqs7g3UzxTpten
-1K7cf2is3haC9Mq8pUtaM62pJb4IrUIhnkY/xMojXKnG/6hTa1fU9r+5sjk2
-LEYmoiOLex7vLpiaEyelKCM8iPFQPXiRjmQasQ/q5KUzCuhUKkAROcA8ocF2
-hBMrYgxVckAzU5HjT7xwf9OhbS2PzW+wP9Q39jlfBlQ+mLdGGzp2Fjc3qdQa
-GnbHpOPbmMaq3R9xpw58cDF35v2/Hrt+Q20eRFCX6TRZkkcZL/+QMn5Kzsyl
-3edP/MvPI3sxXhZhvGDrUgNtxjiI+UMC9QjrzGwIMVX0WCbsRe/pOIszL8Gg
-CmZEohDnrNEti2WygbfzS02KlKLqRPoJM0SsUKCJ98UbQgSCq9Xz60NkoVQm
-76cnDn6KbapGTPkk7DcChh+Xj+INq8AUoAWEAyWIktA8PoghRWwotcbH4EMT
-C+dlzmxNT6poGW0uHfv9Cyu3mTz5+emK4sbiMeueCdMmlXls7U1zd8xYhhqq
-BammlKiwqj3TIg25M0uK72yvTQgu2F39+Kt3die1FOTEWoR5E+8t6Hi0OxXt
-Fkdll87wtfTtbK5aiwzBct/8ItqkSUqucRWPHUt818E86m08h8zA7aeXHzwv
-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
-AF5nA8qB4dISiUHgcqIhqAREiHq8bjWLLg5ME58SCiiBiJEnJrmyXHdHp4R/
-0bBYYZE5kmiZsyTOpBDzBNt2kvvxsSxXxG787KLB99kD+NlYVjM2/FwKK0GM
-XTYSmr1a6LX6R6yWa4AXcxmFUU+uyDEQXgGkwjPtGUq4n2Hk66LFm0TljxuU
-ClVFWpVV+HgCahPIMkrHJZRU1AWf12U0UyFUASe1y0WZ6RGUT9UK7xxo2JFj
-EhphErq4Iz/YrNWvv3ryadomjjBLgynuAHf3wJej1ZKFMBJFyyaIV10948cF
-sxbzfjxGDPHABcQHw94uhs5vxBDDzeOHGgMrMBMrRwlXByWJmoLWsWvyJLRS
-KVKGabRi1KWSSCiaXRIZo7LmZYWvKnOGzhh4UaejqcOuj1M47RojOgfLqifG
-mWmhgIHU1YpIN/7o0O5dWeYw9cBxbjG3mlqXnKyx8nZF++BFRoRlh4S3Tf1W
-g9wQ7SHiHPpFBG/sIJbqfoD74o/LPoYVMPbsos+4zOXbl/9h9pKdy99jmpdc
-4Paf+Ir7avXXsOrFr2DwFRrClw/AopOXXj7IHXkD91OJ+dTMVPt1CJaUpANe
-g1C8ZjXZkCLJL7OIClFD+3lh1GG5Ek5Jn9JTmTD+4Xd73SkV5zaciiuujp+m
-GBNqMt5BvVNXEGUWK1ylc8vnnVhWLObGIvj+EwWdXi1dwDXNVfDj4xYxtXh8
-Rt4rTZKTkeCZoOEdDGJ4Y8FM2awBWZhEwCI+IsEC1f3CF1Nf5K5sSRCc/bZ2
-rUX4zMrsTWtW3p24/OFlf4Rhs2a/t3znktl/WL6daea+/9sB7uQXW+R65oni
-ZKu8Y0XuxK7mUCtkTp6AtReWXKHfgOUHX750kjt24GVuEMOFpy+txDpVT7gC
-44NHR/SQvUFmqpO23YSVyHPsewoVnC0tXjI97+0nw2C+iuMkSZWeiZIUd8W5
-jW/ElVQ5pioa5CYj7e3KM5pF5rJVjUf+4w0ZGFTYO++ouU81hKUubzidyzX1
-K/xyhMZ27zqmnZ9TvHHp97lw38wIH4U47ryRwRAzBNoX7rNRB8YnTWhOTaxs
-aalMvHRywTM2q1ngLiw0RFcWO5PrOzrrk+/+m25WRYzT0aBKGJftHFs+qq5x
-lu/xb0YZkxdECZOr41XahNpEx5iyUaObFxYsPzWVwJOD8dOD+cVAYgkWCdS4
-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
-y9Y3bXrbVNtnMdkxLTF/sbvsJ/t837n1GxsaOzb2ZByNvyFxU+M+ik+Kfzr+
-XwktCX9xIEepY4XjxURxYmviwUQuqSbpeLLi5i+W6Xndl+E8+kWsZ/RYpM2U
-AyZCtzcbOlM0apWAFShVrNlkdbs8uADaBqRRSqFIHpKuG5AjV9BhefGOvDxH
-fB70ojcsaWKRTSxSpqdHjxjv6krw/ZOH66iia9GLrALrtTBchxNflbXasmlj
-7xYUj9Pqt4a5mJhEudQEx7Zroh7l90JkJlbxxF+zRDQTPXNKW27AJr5uffdP
-TCnTiPXTUACUXhXjcbtsmFA9UqsoY+COMx1mQ6+UsQrMUigI2GNl0OM14l+F
-12gSkEvgNSmiOqQwQSl3xmgjJZQRyhQhThvZNDR7Gvs7RUyYOcGZmhY5klEw
-Yz1NZTdKRmkFD+gV3D/D2FVGKXc1UiiFDi3FXYlEW+hQ7l9RlHQJTf91ZEah
-Te2IiU7hvvlwqKs/vx3PfYGEgqjESJWIQdBxMDZg7/3d+p+e/GKTHgatRfj8
-f+m4X8yXuas++9HRbaM6mV+wds/DGhwwZpfXAd0urx5mQIXbIXS7cHOthBka
-Vq2HuF8d0MYigZ5Rq3APu6w2VpkNoUqjDbFJIYprQct2hAY/NpKl4zQV4Tlh
-sXJpyeYxUJgkjgyl5+1WsrtaIYLOouGZqeGvbttaU47okqFc/dDBqLzhfEcW
-nFJi0yf0g9MnRci8oV5zhjPXNPiRKUH6yeLYArtwbI3F7hnEpnLv9YuKLyqo
-HuVd+0EYLMgbnzaNe09RTxV7R7qhtjFoMHEsQWf318xVpgXbwghs31wEvxjN
-QujFjVGrpEjACiE0sWqVxpni8bqsVI+s4pbdsfzgOiSF0+iY2KywCBuNuHXc
-SvTLoycembH1deqxjbVNdWVD20dff+/mEvQDsibr7Qp3jJuluq51fYqSXn9s
-x96/bNr6dNcT2zrb527uGLeEsZ32lT3VtXtbZ9vcTR3jF5M+qu/+jomi38d9
-lI/tK4ACrYann4i/22U187RqpZCnGPccJtuNR57No0whTXDbBFJoZhRa32iE
-KoG/PdRWuUBISQxhzz6mjWstzdg6f8tzhVnj557a+fmigXv7DW/2uubuHRss
-9QZ5BiGajgq9/uaRU3nT5u2GW96YMaiksoayhSUlmZ2545rjd14MDq8YMMFV
-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
-BAAAdaUPAAAA
+AAAIACh361CBxoK9LYgAADqRAAAOABwAYWNjZXB0Zm9ybS5qcGdVVAkAAyu3
+CV84twlfdXgLAAEE6AMAAAToAwAAlP11QFTB9ziAXlKkRAFpRZFYurtEAVmk
+lk5FBASku0FKSSUFlt5lWVK6RUFAQpClJKVhQVCklHx3wc/383m/99dbZefe
+M6fmTJwzc+fOnn07mwOooCpqKgAeHgDggf+As1PgCavuXU1l1qeWHpasNs7P
+nzt7u5OS3oMp39XTgkmzGhmwelm7uds5O7GK8AsJWvLZezo+cVax82F1tmEV
+FhQUExQVEmRl1fG0fG7n4csqxyohxsuq6+js7PHMzskWvBckPZsC7gFM12jo
+aK4y0V2nu8HMxMqlxMPFzs6lIy0nqPRY3/rpI31zU3uf9FB719fupuYRtZGv
+swtKykpsQ1p6mgq704tKEDgmeMw3bnCxcWny8GginMydEP9/f84+AFdJ8LUI
+JwjwbgP4V/EIruKdfQIYceYgwJnk/z54+ASERMRgHpQKwMcjwCO8REh8iegS
+IQHeRd7Va9S3hO4S0ejoWSYO3dZ9k0QrDHMNnWe7IyLqlldJzK705OO9+1ZP
+3V/kXxfT/xVWtd0O8mLAu/j8v3LALK6reKAcQnwCnCIAwXnWVXxQiA6B0O27
+lsI0bK5Kb/IqzyYBcjAf/yrBVUABOORQ/DifmkvoqCz+h281RaZp7xBpnhHB
+mJKaimxj+pPGbHt79p1sLWbb810BRfaw7V5rueSADPkqhhZipoeCJTNDPg64
+hVcj3Qa2eMdmlVupfMey2OsrSN1irzesa1IPyDJI30Oy27ky6iDp3q6PStlp
+ffRJUjFUbuX/2nAD+r45DTqMQHfCUuRMPN02Bw/pOwpX32XZmdQS8V21f2Ri
+POfgcHu2m9U3R11axmdGZwiWTLPNYK0mchNR3COtv8atWcagmRlb3Rc1q9ES
+45e7fXjtVB+LyaNf18OuIJYOUFk9XlnjEmKQcaRKiuSAvl62NS/7C01qauWm
+0FWVbQOD31kSDJsz4skHHNXbggnqaD2jcGYWDfrRze0u12/mIEt4aLelRavt
+o+d5L/VcTR6Ru4mNt5VpejNJX03mw7g5GTlaybzKd4rxw2MW/VnsaMW4q8cm
+7YQws87qSxIz3a0qkbSPpbGlYy80dm0f2K5/4/zwhmM91HF9OP7lk3KPBWPX
+Hz031UYKS5qSHy+qX+691uvmHOr1mw8b9sWca5QnEtuumUwzHJ4Z20I+c4zV
+1GlA5Kdw6kv2yaTRHsS1xHiH9ad0fip/vmxwNZxjWcDG+Ay4QmwalKJfAot/
++6z4VyXH8o3+vHr2Vlbf3UOl0gLSxDxaqKeXL2y2fpHTN73L6lsuASsMAARp
+IGBjoQnJw3cDSBW1WQHIZ1zrcbtoXg8AxL+WRqp4ntCEUDr4qs3OKNeNmAk2
+S7Bwstf/HA8OUDjRrDb2fwADrBXx8V8DXKwAyBogYgW/PrDSAopErPghABWC
+FQEBGeK4EnFFsLLm4r+EgUj4L/7Tml8AJIgLOXiKVLiEBACo3zygAW4DhFw0
+EcDdfkBoMOzU5v4HJmMyfg7ZGPmJyJjMZgevPIuax0sN8s922HQLFisTMMYo
+FZM84gYfibhVzv2CgyaF3TNgZFvY7ziIC+40kR5438EjwPrHbiTEYfI5ZrU7
+gdmHHoMe2l2EXUHozev3DPAJOMhL9ixqr/3tzShx1dFGTvEL/BL5tmt7yV3/
+D3baxvamjggPbL9s6wdaUzjtwSaNVaGQw2WBjhihlhJLX4WTbqVEzEI9antu
+kLFeVd1mw1RfH8svudBGkBhzwhv8KljXaDH+Ea81x/zeGaCiJLY2ijLwmOHi
+srSaTLC6vZYhBzUod3MdL1PPsPWAJoi3NNvDr64VOxp4rmvWbKg+RPJ9syBE
+DrnG1upVwEqTWSTtu6vS136zTvdVwa+30kLHyiAYtOg8xbX5zQrqYg82mQz9
+TD90YeJmT/PbO8si/SWJ1wVjEmoFnpQUvz/o+/u2o2BXjWssA4EqA/U62O4O
+nSSruDWoNGUJKy2QkhxJbeVzCeiRkdQwK4OdWD6xYKpswJJkoL6teL1Oxg5o
+tNLMyHqhzoBf46oF+06k+ihpl5jYx79Sb2z+WfAKLdfppEz4mqzfqUEVE3ut
+fTjrezy53e6TuOp6z1XugNRrHQPuB1lzTb8h3SOewyWMtSgJHa76Rkv+T7YG
+A1kmGStTJ0yF4/a2DzhaopifCxkkr1ogNVL1dLuEYp1peMWFI3k0hgunwiUs
+g2QHPpj70iwbCOrdUterJM28/3dVSjpExF1+BKACPRU9KUBFE0L4rxnjhQAA
+AyEXgKcH4NoZOKRqgxdEF81QCvfVTpNHmgQ3rJW1D2wQwQEuCM/RiUCCiFt3
+wStcKyfEf034fwMyYgXsKgA+AOSeiwETQkXWXAj+eSY+F9igSXOBl1QIUvBW
+KVSRNQTB5XZLLZGi4tWrpIUn9oEIeYcjnaPRm4fB6y4ejvSaiA2DkxRa9J/3
+qiXDTfKJeeXJxWWZ+3RySzFIpssN3zRUYB3IL3+yfv8ekFQRuoG5vbwwMzPS
+XLwqjjkDyH3vPJML+HoGLNgHCx1eOeVA7UgkZAhFxwYfi562bDhkpI7SYPtY
+SpLYOWaevXdSP8z8aauMjZAxVFL3H7zuPnRSimup78WEitGvAtdXqBfoBANW
+lfH4OggVyQEGgPbum8+3gRWdkJcA3meAhuvciAC+YPSVazuIjZG2FGQt1ENP
+vmZ10iIeCx21tZhtDi/WjUm2vnHlknlpMWb2q2z8SyzpgVfKukGyWV4HGXOV
+/TusTGYMWdNwsicm3url4uvJbIPZOVnKeOyNN83J7IVM9Oq71e3GyshAjBwb
+rKA6GQILm0G78vd319S3XOHJ94MZXi0hyxJEq27Ik13ylGmiNY3jfoe+U/2y
+j4Pz8itk3a+ATYfTNy9KYEg/GmZJHR/HrEcPJXdlnaapi2dj3QbtykoTZz/I
+0lvslrGr1D7gHin+6Rou0ckw45EyGvTGy0CTyvVwOPHzZOLsN1l/i8RGlIMr
+z6QGNLo3VbDQ5X0y9tLdmZJoUqmT1B9zqlEQvt1PSz7eJ0Im4uLj1//EFM8i
+xnzcBJtasepQj61iaU14xhfRBh/h7qjbs5vQ10gWT056ZXdnYrXCqmxdeVtU
+8XiZUpyjzvpwR7hrq6xzz/RPp1JpsdHGFOkkH71Eo+V+R1eWstakxNPT6zQF
+MAQ7O8Tqqmx0/QmPUo+5BsYFHesvs5hN3DeQ2BB1b8qMkwWpuilBMy6vnEAz
+bWI6jRKDwW3qIXeG3sx7oNSmJ7uGMA67r/tTU9pCSjCGY15uJd4kjvZq3DpL
+qRJLAyODPM4eNxVMfiKfrw03lUm7oziqKWSF/b32CizCuTvWByAFUpaSv+/X
+hZBzAcBFa6eg/D0hntV5Z5zv2XQA7eBP2uC4M0C3Pqa7fCIdNVXSZ4MxpMkM
+SB5q+cNke9gpsPho5GhoebuLplI81+0S7TkLLirWcx9w8SF4DZDAAEVWXFc9
+73n/z4cVIMZ1MhoakCb6Pg1AeEkQvA3Bx+WAfZL51edcLqXXeKRKoQ9gJKRA
+pEz/qz94dWYP2D8x5jx/736kbOIhUDQAr+nR9R+ftX/X2tCYZ5E6uokZJbY+
+KTrZSjtR2JP1o0UpldrfXdCxrbAX2e5mRmio5+2mrPt4LmX8uodVHwwWeCG9
+Cp1CKqhB7eO893L/iGh9rfftuhU/o2IlcOU0/7YBCtthULqh58mt1qsVY11w
+ZBR87RRVMOpYenvZVUe/LMHm6pLvbrDdlYVHIz8jXZM1386nRwdOBjx8E61i
+JO9v4015jynqNt4DfK7beEqvc5XC8W890C66dKsfIFIk0SYkekxyEz9E/sn+
+pPgMjwFytGVDu2g6KYFjIP5VfvFoGSwrI09LPfbOTlpOy0EGyaa83VsEqu+b
+XsO7CH9DO5gnZweZNzmTNHeEkYfjrjXUXlMmScPWdTekeqUtP1tVUTtjDduO
+sKaDyGGMlly+jZV9HS5Tqm1VQ8t2djrZYmIZZlac5JJ/HTK2u2+IbaEbio9q
+Wqcy+2SshpL5rGBeybv6Lq5afNkhd/5y2HR3fy3gLzNJLrXXXDH+tHyzOL7I
+aKziK+lVFDuMlrmmNnJot4F+2iNHdld39dn33YgH2nV1edxu0TpwFMunCs16
+VY/+8jqREmjho3fNWgUfng38nNciJT0DEKVO+j7Y2LS1/MUo+NIOuitOJjD2
+UNy9SYsh0cd2/PHjypWK/ByhYRrkvYLSOWwXvJpj/sbl9EdmMx4RrTIPjEdi
+f8MRY4vjWM1481ukrpPPvk7Nw7PeRMfq+V8na6ZlAYtnP4Dw459NkZT6kaFF
+JhvxbBApzQkt4NaHiEXITdbf2JeAH6S+a6lPYahLbiyHpHf3rfcG7C13Th/y
+i3Kb9MJvIaFuq/HE3snF+qeDE9wuyZO+7cabMkEv0JIqKaaTiQV0TfRy9nqL
+KnC7j0+EjB5g05Loi6E+cnzOBoH3lCF9D2E+xt2UnI+0JvSaamPRqnrYul+N
+BWOX+CYWt+12vA09D1XGspA80OhCg8Kxze5Wa9WSSVgBfC3aWIImfbWYm/Wl
+0muU2LlLuwV6tajPhmv+fw3R7E6Tbo6y5cM/SDy2/3JeUTP4SxYU1RZn75bS
+rKYm/rtZq4Lrhtad1R8vcykVV3KBEADnzcCwDnSlwBI4+1C8iNfO4zZcDIl/
+7lb/Z7ZClauEw8XHe0CqA5BwnXdsklzgX/ck5AIjR3DwAEAPSnhL7bW4oAGF
+Vp3lwm63igGWrOEHkig/+8SCD65w+GRnFvanGmt3uqcwl7Bns+8f4NtvRf5e
+I9jGme4I+uj680cTp6+7pD8JTZTlaFMMGG5d6g3GltQdjCC3bbRPB8y7XP2h
+phkBxnusDm96m8abUDs38wyND/SOf37FXuKj3zXN3Mvx1Bo4ubRhsZ6TdcjC
++qw7f/p76eo+DiOoOmdCd6ftHoLifxHl/xfxqDjIe03hH0MCFbnrKye2MyDN
+3cPBJuRqUNQDRqG1eokN+S2Qhm4vxxvkQBkiajXk5DwWOKMgs3uz9KgJ5OAR
+WnAjxv20egv793seyM6j5X/YDe+0KaL09WPtlSBqcuvG839YODK+1yHPAO9d
+kVT6kV91n/H6f9cA9MT3IgsGxmCZ+rr7sGBgRplTVUCM0W7fK2X4XjMbZ46E
+nHv/Njsv308FgkCSehPE0pS9kfmLRJeiek1klpTxj0sUwU9a1ZRb/YTrd/jK
+vUqoNSR/qtVxDXU26zIsDDC9elKTXWbU9aNmfFo4E14MhRaW3mkm4v8+VQcf
+fQBRDZtT+6IkZdd6HM+t4xJ3Wblvcvog4nqRwyifps9iH+sQ5doXtdrId3/T
+xV3UvkinUAd9OgNSL+t8aRfxT1Fb9e+iu6USlZfEoKHCr/VC8jZikb5Rjh/F
+cUS+kI3x0PUzG7+hjh9H+blHzckXsiqWL6ZncWM46ODDd9sSvTHEQoNVEBF1
+hHLTSwSiKuPZnNbu0VTq0zG9jODoH0KF+Xma/BrKPRsdf0jN6xHKd6bUSstV
+CfpiCy6rq2Agssf359CaVZGeXKXONBk3IlW0pKS4RobF4pipn3/XpMzqFM38
+lJeWPaQmqVtKLv8BEgL2JFYSQiKAnp8MxkpvRa4XQk//BAF0cKGpXzOH/o+L
+wuu/6DZgL3hJqvQPyE8C3H5z3hWBS6wXgeJFrwIdIABEEIJdCnR7AA2A62J4
+VOfh5yXWPFJFEjDuIngLdqzMXqsXcYMvyUE/1kEa3Kr1h+3EuDUDcrqne36V
+XRr89inAiGNBeD63Av4b0NKIjp20Chy15TUMme7vtm2dRrqdPoWmYHVTOUVz
+rGxYnKJaEz79PjQ8qDjS6fK12+z4yGBF7Zy74SH3I4itbOro27FWDq+y2Kmo
+1yFl9fODdY39ub4y7QFP51NqJsImpDwzZXLqFQOhjp6U+8M5pab1qQf7WO6m
+3LbO47g/9HwiLu3XUDoO8Tf5CeFYne8cBTkEVybMghPB6cQ71KEJpmi8+qaN
+QrD49bY/0l+afZ0F/qiNOe7Af55SFxDgJ84PjhVZBTT4UJdPLjI9OKaMohk2
+ekTwsTl/bTzZ11XFLT3q0Q36VdE9iGFddCq3/cjvA4bmDArL1u/tlkP7Rzwe
+S61oZ1sLMrqH1oXseWZTyPA/wcmVDQWQOzk1By4Sj8dNEtEa3WFLfWougw+9
+W/hWsquVGKLTKD892ah3qjxSk5P8YbOuNwIp2r/yR9/ffkP876D8DFvp1K/N
+MwAyFBqq3KEvPWIvR+XAEyRoyyekCevaEiAueSuJNOAJuNnpzm5Y54Kk+9E3
+mTZN+v6xoTjWKfhPWtnXo0d/MkcMJMlJE7ftNjyCxk95JzQR3IULO2G8jJyH
+jOvB8zlVp6eKC4HiNfc46umzn2+jHwCXxIwKGFOwmFR2Xvl+hrqC69/ZNFo8
+7Uv4ReazH+wtxinfMWy0qFfdDF7oNi3YPwO2bX6QM6IFrqd4Krc4nKrsmEPt
+EcwmC3b6046z3l/kJLfJdOQz2T2hwq7usw3z1GVDR1q9/UWYiWG1nwGm2+KP
+3XKuZ5+z62PKgCVGpx50cE2FmdubQh35BqOD2BJFqxOnn3CNTMK0coib6SV9
+hY7kXABKbnxkIlasgD/xWxgfm5qH9dDzu6lvEM/68nH3D4bSlCuZ+2uq7Dhi
+m/jwUhPtGIXXaohN1HAIX+nUPCoL+GOekCHOwbdSU0XTnPkjuRjsGOmH0tSf
+3/WownLMml//hMR0pYr/XqsBOcWxOYOiwq0RGSpgTrgIRoPXcfk/MpF1rH0P
+MF2z5uyVxCYqofWgcGITksXQAi5TRbzX55NBEtx8MARGE/IfZ3UeS+LcFTjH
+o8olIVUKwfU+6jevkjgXTlkdH8uzjlR9HXWqlUt6sc+Wpfb++URMRa1q74my
+wqx9MGFwiUR2C+cieZ8K/+noTZ49+uYjvYCKkVkKE9EnG5s6v9t0Ytpw2Bpz
+JjUgYAgHqLgA1MXRNx15gMgXcF0f9jj6xiOPlnMADAe4LrqwiruCSU6fFFsY
+rjsT1T7rHJ9CLgcVaAziksJf6iqx5oFNYJ6Q5z7W9xG6hYxRdOb/BUyf4AD/
+4M5ElQUa/5iM/2NiEMVUUa8OKgXTT/nCV5o7xh7Hc8kyv34TGzxzQr6qwGDk
+y8JzNH5StIxU0begI+p8r2r7QNdTwKMw1WrQNXkTRUqFYvhoG9Bazpl6a1do
+gI0kSrz9xfTW9eAo1wjoNcSYiWvAnQYRW92cFtSKmBqU72MfxEuu0+NV44LF
+T9VTrNaWdBpBaseBSbDrSMMNeKC8U/BICP67cZPUscx4l7/y7ZhC9EdlNxE8
+J3twWB5ydWD8HY7sElhwxntiIxXKywoOe8QRTikd6PmO7ppZAJmevg/gs6mV
+emU8My3m1+JbPr7aQtRYTAWw2jca58nuP510qDgizXEnuzGW+YWrDZ+e+x3S
+kUFj3pIxZYYjqW92d5F5UCEN29BlO5zrLqq5Hsuc5PzNx//V+LNSZ+dfUvzw
+Jsfmk1kLyUf9M7ThbwZdxWTMdXy1mM4AaqSL3OtPh6R4hfeyDba9Sct9Xbal
+AeSrt7vw0AdXH8Dw8l902ve4jOT8FmdcO52tn23L4zGMuFkx+MJs4IaWZorb
+N0rVQAoEG81kmiyLLRxuI1edgJ8oS+ovtEf5GELx/zs9+n8+l648+K4yeXVi
+pHC1DMLxh9/65XtWb/q+UMgoSt8Gvij6vq/nqZXkggE9cIVJ8d+UDuekSIhu
+Q6guVkv+LZtcVbzwJRG39KzePgaA29QLsCA8U6MrL8XkJyy1DopzPt5c//Jj
+6D9XqyU3VxheA3Y4Gu1zr/ga+L9wkhDA+aH32OB7vrhGFYjBOSRry+XdCI2s
+lTJui8HL15F9HpYGougWp7TqD+OYnNYgktUCCz3TLsYA3blBWfU1q4j5a1Pj
+N5uQy6LOzpLTX6YcnPjDBp+kLpLWZhm0ptCXX3ajWGS5N/XuBJMz7cl/SSxq
+K/l0EawOycOAH2cAGiB6TAgvIGlUm+e31hBLxqnYpRvrgthOCydWBA2B91Cs
+2yL2yGiAPBpA4L942kUdu4NcvUJO/pGUUGw6qB01/SWyOeGb3ul15QQnvxFr
+i7GMBNqo+EsSuugCiLI6LFUEnh3Hfkh/BpBeyunb3bihFn9rtRk6PCll17+U
+XuXB3VWD0lDeiIfLqz5WZZ9Ok0VLG3BTrNKfop7MPWs6CTtWQLeCbWc1edok
+hEIQeLxKK8ewXwnHSwfwXyMIlG9OjR2N74qZ68CLddFajHk9mc/A5rMtsPbc
+9gonSh1dT11fVp6iZdkr1TsX3/mBIDRVl3fxAyIBP7s/8F7Ga5qvYASPwH/9
+n2k8gFvLwkXoiPPYhCaCKwR3dcNbzcODn41OM0WusGZpssMhfe3Fp34/xrUh
+lLIYFP44+1j5ca+KivCclQLs3acINlnH/za9W4r4hDBWkCsMuFgoY6WC0OJa
+Ez4NEYm2ziVBbUIGtsTNR1ShxEX7Fa/EBGres71p3MbbvmU7Qc6pIpJdt8pg
+RdGl8bTTtPQUU9FvM2c0yHUEtVvfmNX/G+vp+ZP7uMuRaDzN+p7BR//eNqG0
+x+9nHr39Av+AAxkaJrSU7NCvbx+kBFmJh1bw90a2vjjyDLJiIkqY1N+ptr31
+2aGvKq+ipKLecEX4H7MVszhfLz3RPZ+j3vde0i2ue+vHXU6sOHZa/9gN4dhJ
+EIotT2gPjy7iiPQdb/oarojYqbQ0czNK1wQuP3rbbYBDZmhJZ/z9o8jugobF
+ROAGTrsJrgt28UGtIKJhwhSIWM+KU6XE8ma94UAfo1BsclJS4nQ1x5cQTV+t
+yeFOrNZsznQ823TTu7hOcydHp4+otbf+EwEk+/Mr7UIv05LC7vjl3O+YVZ97
+lJ/bNqk+x/j94/jQGdCkexSP/LCIhLZy219NkaD9WPP8xLYu7WN2qW1UFFdj
+er2i1BlgvIn8ZbWXPRlMbGqrhTV3tFdJECgTaKj70q3PIPdr/uB6nNTdXl27
+Xq2gywbw6RFsDaJedudmiSu2hXmjdH/4j9DhoKNCGF9hzvjdxd2IvpR2Hf+8
+jp8yS+UmDqJjvj8lc5RHnflL3ax43s5PddAvSiS3Mtn31tJ/cV9wlHR0LOdL
+0oEzBhb+HPO3OwNEdGTdVlOFAtRzu2A6Mc4vjMWCqqe05qykPYufiCTT+C6+
+rbO6OVbLcKfcwtOWLzj5R4wmpPwpBm7m+3g1Qnp37G0vBT/DIB7Wdmn9ksKG
+5EDxI2IFXPmsa4YPBxYKBzIdNuSGjr6Izo8WK9tOoBvPgKvJdiMpRr3VMTpz
+aXZVtWKwTONuqx9P7TkaHC9JG0JcUb+s6ORq3pObSgebX5LrcHNF3hBePLgy
+5tv0iNhEbwnFnWTXszXTQ2YUvVzvFn/1lWnPFYkknuQQwBL6bhLmssneqiod
+ND6mdeWnSJhob/KizkBS9GinqF9l7wJG2uPp06EYnOUfmnth/oh42Z04O1+u
+c5Xs1fHm2eBMOeaYGG5AswgnXwtwySHwi9bBNFBPfsIa9UC51cOMIV8Y9dEo
+RrfI2GVrF2H71bqcj6nDWhtBD23FSKTkLz8dPedsxa1fLFoMZRRJTVzgjbXa
+MjblyF0VKJNA/2FIl7Ui+bTjy5nxKCCE4PWAgKtb3OPNG8YvbTKFI3VKKbBr
+hf15yQ5Es9nRzz/3bootUftBn/duMqi0xMZhIdk6bs0aVmx+fpBqrnQVBgJc
+HodOpOJs4jm1GxNGVzYvify1M3TYRrt3U/BhGA6DQaUKpMVRAM5qGun3ewVZ
+LwhCQHy5B9b0Vylw2daMvRKIwv58exVCpipdJx3hOGswlXsQ99YdwtknQqNN
+Qgntu8Gm+qprFUbLz84sxiyR09BbOz3/nlumAG5Z//fG244bGUMKmmXyINIX
+nuiq5GQaWKxe/RszvdJtDfYfENk/cfS7GW6edtuMAZpkfikG3ZMmHuJDcCeU
+Dm+n5Bf5y1uMQlgP9WpoQFcCdfTkcjFDd7WmzJEpr9P6E00dLarRj6U+FJIe
+z3omcp9tS3ntCRfo3EV/7LF6jTIpmGiHP66mMO2K9dMQXh9aEPWBf21A67QL
+6sDs6nMIPGvV9AqnMVp8TryWCWpCQpvZobn9L5t9qp97UBA/zvRJ7VAcWrAh
+nmV/B5IyvNhcMKUguPuWCYSrvvx6Dv8Kgh3/C1b8akM19amOUVYl7HZci7pl
+bgb5B9w9cZgweGuHVhJjnRd7WxuZI5JqTmfT9k31b9YKNYcO/WJ7R9TalPzP
+KyvyCTVb26e2xq869PbLKl6R8d+5c8RYMq5nxTLh5mPaD5lBN5TJTNe0Hksw
+GBbUYoY7Ynp7Bdcx7X7bYnxqyAYJRoeULEx0prbzw5GgX1u26C7RzGSDp9Uf
+Ok1a5HT73HXnbKWvTUI91u1GKnlz265P6tMaQbrD5p5aQjNQGnddVHwp3f8Q
+Sr1rAJYk4hUvCfW3nD+YVMQDpA77Zz0wjrYMPY72mmV8umqyiaLsdBE6RbbS
+LrZKSUgWfmPjXh73wgZH4Kkgjgb8+kbPuuoN00l0mIJh3sSWrzIWC2iKWXlT
+BxuEFxdXbNyxHFnMqeC1H0Vs0FvzfZob2youg2FqVPwe2dW1+urGepT2apGx
+e71zSXbbhtjTiZqhy3j4ZMv+8MfGdNkwchtmR79B0/5YDNsW9tanKZbjuS+Z
+GFeQOjTiaO8Q871hzeBr5/0D9DajsDHcEmmmH5tfrOyvVhtG2agDi51+Unui
+68F3O8MNjoyIyFZOQbBIflQrk6UfSrSgVJvp+wZPFe35NXfAxOkp2XW5CK1m
+uyXhKek0yskJ/7kinaH2xC0mfumYODbNgAK6Xrpvf1WtR3b1g8r8gF6t6uTI
++A2bP1NK/AK6TlKmx0o1qOvZFlipAJXYJAOKq00lL3t1TNj55NnK9DHFXN33
+UnNucJyWUFyNt7j9213GuNFOx156Z6+eWkWdOrx+rIyLq4tMOKm9Z9Ci1lg3
+SyKCqyZbqtBLP4/xjVpdxmzGkoPB6+E7S1NJfdZDiVapgqMuy2QP+b5YRc2y
+fHkA1cmGY0eyvVnEnqmUyVHU5FiiJ5RManthjlZ8vxiF2XgdUt/OammoYJx4
+eF6XWJS/ardzjtRVWbZlVtdD7PHKVkMmlZz52koQz3o8LZ08veVii5U56WtS
+728VK5ncyFKz3pZo5pKdr8kWfr8wUhe7itbU8emaL2AzuL68AZtCs29qXr5z
+5GYL23KF5yf6+fzJzMqS+PKr/VpNjK9u4iCzPJuKSimjtbt+IzbWlRDxW80Q
+s64XK7Gm5S/tVyrX+nPK6KmXi6uDgJ/OH2rn28IfkdMDmfalhqMj76w1a81L
+b0l2X9PYEtevj60aZ5F2+aL3TMvxco/6VaPvvHEtMV2WmHS3/mRtTOSspiG5
+W5dxarIoCI6UsuLtgzLqeO3w0y/HVvNx2d2f+txglSrcX5OHpGjpe0KOS0tj
+cCnC8akplTWSggtM8dPt7kGZjK93p5Pv5iGpHW5/C7mXgQYAGCUYheMTAUqv
+CS4Wd3AP9sGI8D6Ap4gAAOYQAHDHrdCy5V2qWTxUbmk3cEkNRCPvJKltS9Ph
+Z3+Lp9brgOYRLh0cqZN3F3+0eoi8npoW1ckC1BKj3UuM+BhNTSSC8MXfxcuh
+axp4f0njcVPAVgySU4XgdphjHf1SweHkWSuU/5IHnrZ9arp2ONx0sOpdON/8
+ZeXSIyGME1GBXsO6qWTD84VJ4zPgOkPdWFKBsoqZ20TLtVS39Gh8oPRiyes2
+5KoS4eVC7YtQkZCLFJxp3FK6Ff6H4a1WaOwZkG70uCfndIs86k3d+KeIgAfG
+Kk07Qxq177U8DF/dsvtRpm+/mlNzbdJ8/ldhdcJ1T5Zjn06z0v5FWkqnwtbN
+R4Lrrge1Ad0PpO3i08eT0tDds2M7uO/RHRZWu/g4X6kmeOB/sRitCiw0nVA3
+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
+Ad1fnxd7Z7T1fbWP701T01TVzDf21odt+gUS9xYG+5UctxJ9WGeON9aFP1na
+Wkc01KP+g29GmQ+PjrPYMfzrR2dl2DJ6ahGmR8v/2v25/UExmJ3JnbVS8XuX
+o9Sf21xx5dvIT7HgtDxxfZlR5+U1MavJkabG1ziofltargdI8R1UoLsKOUKp
+r1Ihg7t7bu+d8X9A8xTNHdO/fhRxF4lRCn+u+z8EnDY4vE9oj7A0K92WMVCP
+f4mBHIjn9uMf3v8XPxyjhVbiLpRv2TYOMXn9EseAkwZPcVk5D4/3b/5/GXo0
+64rL30ZAu77n+foGKaUMldA3CWB0+Gr/AjlGaR47fvTFOXqXiTHmZKX+9y5j
+LtqTIOmeq5uhvke3lK9pZfcbfUhNRmPp8EoGmIkzuTxOLEnRYMvYn4q7xaSe
+BCnDie3e+lV/nE3PgNff/gNPg13i7wpcaev0uwpLSoKuVztE984cR5bCsh4v
+XyApcbvZYZuKf/36NX4zZJSglHmK4SD6O+2aKlRNfMvhTj1OeT7p0F60GmJ0
+1CZ7r9WPHrtfs9eUPiCEdv1DFu71H2WIuwIX6jv9KLRrsAxSdcLnJX3OOesQ
+YJh73oDcn1uf33zrOxd7budMS/5/pCs4UqN/aDw4NPWW8fMigFhWIFZ/6+XK
+NJ+KFYuI0Vew9VuD79J8wZvQr+ewMAN29QJ2Ka9rP2lb+r42X/bOOLVeE3ui
+i2CeuuwdDV6LX/spdvz9NUiK5dB0DG/uDJZYMg8DsS9gn3v63uEYHUd+PIg+
+tSy5hhxNvCB1/szje56A+npSc0oYnqNFnSeMldzmUpf+gV7UBy60vcWVKhZ+
+Tmk5ujzL4xtZCk3TVNF0BGUdf9R2OAFxMkAyNk6eehwZi4U5CGkCIcYMUmyq
+MD8nhxZZWa10L4q2WZ6/XaVQTw7heH1n/u1H/dLN3w87gwVxpQfVHc05p1Y/
+uRDq6c4gZd5SeQQifJMHkcWe6DVVUVqUn5wES+IAAzhAlEhayXscpxaw/JI4
+RhwXinXgwOcoKtRSKcRtU+M7cTj4ImjWoijxdpyOz9lBhSKLTNJ0KB1jW0/+
+ydHQ1mt6LZVy6efG31fvgk7BouSitKW8rrQY7lDgrCwkpqTXFNpfJL9t2i9+
+5fvYDgVIcLcPhwp/bp0wdQF4C9bcwd7x4uOTE2fBUSL1IuZmup8bvl2dR4ez
+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
+ZPQWmo51RGNGnffcRK9sOh9MzbwxN9k+exiCflqIYii8qv9737jZ08O7Mbyh
+iW9j1md00haKdKpitDN3y1AnDISmiHpgeT95rTwK6zjmy+dIsR74e6iHf/lN
+3vWsh1i34Zp98Vnw6GVlHYmyh7D5yHXLXzj2rRdfTjN4ZIX2OWKm69N+s+u+
+y/lSxecybKShECkl0SZTQ4NvKXnlf1nh/gPPOLxnNbrw2XF+G4RFxFLvZWJo
+Mmu/BNPVG1Teeprs0fD7bm6nemJsLSrLub9RbA052AWV4hFXlSS3VSTTbmub
+yM4DAotXIS2NLvtwqPV20f20YrmT44AG7R44CaHvt7Zo19qK15hQb4fYLiRg
+utLnU+Sbuzjuqbc09JypmnQ2XkKLe6yYlMM+aJs7PNWJvX/+ItMWzXzY9VPp
+AN9hIJlu9eT9r3Zfl98TaOu8L6vgGo/56kiImNQlR+iCggv5Wgz1UnYNySLx
+AP/2RDqfxKgSNDQ/iGFWqkH2r8MIXtATTRtEe2k6Pxip/qj88u9WPx+RuvWb
+rF0rfsEjYeNEegOvLeJ+EYadZgzNqpK62/riNhLzxNLHmuLevd3e6GZ0U1Fm
+9j//RT62MmaWrXJL/ewwoik46lj6tfb+aqH5cmifZv7awEctvagHtksb2m2e
+ZCNuqMrgrX42Y/p/a/Jlifz0NjKcYebU+kFjG17Cehz3II5bYnx8ZAIHuLEj
+mZzICP30GE60fkB0pL4n5OWzGoFJgI2YHWMELBPD/+0CVjg8wRJnY4knBOBt
+iAQ7oo2dOc6KiMNp3Hzy8f8C8YkRMayM/wasLa3wAXhrohWOaGP9n4D4UOVx
+OAAgd29KC/lE7p9QSwMEFAAAAAgAfXbrUOOFHoViRgIASUYCABAAHABzaGl2
+YS1zaGFrdGkucG5nVVQJAAPttQlfBrYJX3V4CwABBOgDAAAE6AMAAABQgK9/
+iVBORw0KGgoAAAANSUhEUgAAAlIAAAJECAMAAADqjjrHAAAC2VBMVEVHcEy/
+4q7C4rjW7cvX7srY78rC5LLM4qfG4qbG47OJnl1DaQDa6MehzqecyqXN4aIe
+OlCbyZ8dQFiIe4QhSGAaMkehy6DRxYMVRF7b03+PgoqXx6gfT2chLT0SPVba
+wYIdJzTb1YjSvnzYxXrK15TVznvS04MVSmUlVmzdzXjbzIGVxZ/VzInNy3wx
+ZHiq048QKz/Kv32CdX43a38QNk7M0o7QxI7tyWydzK3S2oyRxKqSv6XHuXLN
+3pcfWHSViJIZUW4pXnXK256z15SKwKfUxHPIwIg9c4e116HW05RCeo/Ly4fl
+y3PJw3XnwWnexXHws2bQu3K514UsZoDl0H0wXG/K04bXs3/Bzo3j14jNtXvb
+u3PU35bPuonDy4HAtICAuaotUWR5r6coRFbww2eKt6aKu54pN0bhxX3dwGaj
+0Z8SICyWxrDX4p+o0qbgxoh6bndLgpXbuYlBb3wzbomm0q2Sh3q+wYQ8ZHMj
+X3y9vni92qrxyHuu0Zvf25XnqWG/s26ekZyxvYKjzJaf0Y3I3YLD2YxJeIOy
+tHavzIZ0pJ+jz7azzJCckYK3qpXHpXlkj45UgomMfXBXjJy825yTu5eJuY2k
+yonVt2Xpv3f3t3KLv7G2tYzM47C+wZGnsnwmUlk2YWR/rIbA0Zikqmyhh29G
+bWy3p3TMrG2DrplmmaHnr3DA2Hjcw5TMrIa2pYWImn68nWiulntdbGvFtZhK
+Y1qUxpC3v6BweX6loY2qvpOjr5J0nYpTenRpe2Z8hWt0kXikwKiQmJOomGaU
+mWZwYW5ih3pIUUzam1iw1ro1TUiSg1ueonqTq4ZZalZ/iYuft5+Uq5g9VVmu
+sqBcV1+0zamhvoQhQ0GEc13Cx6w7OzSmn6flzJbRwp+4iGOmgFpwaVPboHfN
+0rPg06pbU0CubE3MlGrX3sbGhE+94sO2uLbz1Z6OY0Pt4cLJzcT146+RwMOi
+z8/c5eOBWiNJAAAADXRSTlMAqqqqcapxqqqq2IpxgVmylQACQxJJREFUeNrs
+ve9Pm3e67tuldg/JPi+MLEd2JNdpCGA3whaWbY7QNggjgQ/2YlfUy8iLScw4
+aDSrqqKRj9HGuNoRQmrMzq5mgzwvIg0QsxjRFnVUljKINSEQpqsiOlkJbYhm
+OO3RSNVRX51X6084n+v7kLT5zUyiUSb1k4SQhBCH53ru+/5e93Vf9yuv1K4/
+76qzdXfbzHuv1r4Yteu5XI2Li921r0Lten5X92Ims/jKXO0LUbueF6IaM4s1
+SNWu54goBanMB3WvvFf7WtSu54SoxbFIJlODVO16PpcNRDUKUrZXbLWvRu16
+LoUUaS8ZiTRCI9TCVO161uuQ8l5jRweQyjTWglTtei55z9bdceps1oSp2lej
+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
+l1mH+uC3B5xD5KVzN+PQHlaGiJSWEXWM+d/4SBK0sWnhwt6aluHua4eu6dUK
+VBUNPfeTyHmsenZ23ui88Z5cTT/6naymj7589PLl0hvgqpFhza4PrGvr6//t
+93PO57Paic43j2FM9KZCvBPt1FHU5VHJKBDOT/RffmLOjSZ7dAydmlhOEBXv
+LKn8/JpjHJDSgCbAAMoMls9YK1lsJucnysoFCZR0CHnpQCp5omKBBSlaPpzk
+ZyaSILa99PNfv6TyXHTOFk465+ZGViX0lZT4Aqk9etkuQQKlsLsPYUqZ758J
+qQNASj6KRiXlIDqZxexYvH8RHOdlvFHy80MOb3kaIkqJjwJ9vqzyn2HAhC0p
+gZhTrwucPuZvOZboFgxV1OU8jlJ/+TwUhnNRqJQGnluDgnJGqhvbiFJX33uP
+nIepuo8yX7ByYKVv9vWxsYEE3aHCnJxVd0S8BTRwlSMPRkaKbOUkxIspCUNv
+DUyDRcee3KkbfnfuKz6LjDLGPIQ13/Bj7wSvPXDgbNPQQjLD5AaDJeuFp6K7
+WpiStPwytdR7Mq9iivfxL/6N3PfRy0cvVNfVUZu/t8tx1YoIdhD3TZ1NPYFO
+6iT6TbtdIYpV3/SY5MIme3w7pmrnm+ynPdTkKeWZEBWf7Mh9JudZ7zyMdMqA
+KsaCVIzGM/WJbGK5sTODuUJI3hvfEKTaOeCuWZfuGEotHJH4zDNssGPbuWbZ
+amvEF4LQuLetrbFvxBbmqSjl6YDUYmminsVoijHfU/+sxDdt4wHJOTG8A1K7
+d1hb63LZWLE/bF1QzrlS7qXlRuCr8bzWaAlRW9jpkApB1oUyQSAev/jIiNo4
+ZJi9zLaE6pzK4seQiksLM8+6MB9fBanUUUGq870PXwt214t7MNupZD42CkeE
+qbGB0bbROrzvy6moFKnCRx58+VURtZUwlZICO/XRxiPP+VvVlPTDzy55ZR1y
+BqQzVkkfbuNHNHgpe/vTGgykho8funbLGaMOHaqpqenpB1K7cJz86KPqj3C1
+A05//vMv/o0Pv/89e1+WyTdges3cAP3g344muYIhLb2cqE+nojZ9Xm9uR15r
+4ZnCpibXifYn+0ubzme5JluQMogCUFYtRbtncp+Ho0RX7kOO58h7ilNRb2A0
+GIHK4e232WUIyTsjRLXX3JYrpSTYWhehQOf21+otWE3NfwYrwp8TszQ2jqhq
+w3eiEgP00O0KU3tkvSMrvHehzV/550Dqp48gtZWcFwtxvmP3Do2Jl+9/db9E
+wsz1sxsbsArMXfk2l3VZHHtJa2PUUMsiZrolzjTubNSMXJ//rvem9of3LWhr
+GczOrrxr6CgDqVDN9swTlJ1TjbRbia/z3B9e88EbFEAFe281kCoKD68cwZ4n
+tbandDSzujJzgHMdehyQulN8HZilJIwNXcXgb/1jBR7fuFdewfI/LZyyi5oq
+zEeX5N99d+3GC2NQnTXdumVsNXsGU0CqtJr1LrE1Fy4cvZz0McYZv//9b37/
+G7yB38ce+MIvTNwy14deMz4xjO4K7Rmso6D0Tv/6DTq01tZ6QEbtZG9tOk3D
+H5/VUJolGCU7Q5SzSrf0UlaBrgdq/YzmMptMzgNREAlnvq6PiJzJIhcq4S2H
+8+qhECba21klQ8c/XZZZ1v0cbg0ue/slmZY9/ZIO1f+M9nCZG0evNDMtAFOh
+i/YYsfBiy19x6T8rSjkXRhkaqzTfTebbsePVV3+5w5BSnAkNDz9X2tiKmCUE
+BuRXFFFubDFyH0A6c/b5deDTulS2wCm6MxoEXebYN3Sr735Otq38LwZSD/+S
+VmSzaYKXHa51k8G+xoaqqoYmSqk/BL/ygjF+R2ETHBRM5tsajr/9xZIvOT9V
+ijq8MpOKHNeXSu4LjYT7AqpyKvSUWsJUzsZd6//dUUr572UuA2PqE74VlUyY
+La3A59ixV5AK7V174ELbUFVNiyLTNYuaOnRo1SpBqunmyx9/LPOXC0kvf/Rn
+DBvxl37/N2/+5j9/8/5Rbp4BqI/kdfcnMZ2vfYDzEBxma34GUpTX09OlTMEs
+LN0exQqEvcnu0t4ej3tZT1Z8u6ooP2cF5SjMafI8FK6ckDISFzPrixKmXn8D
+Vd7rX2fk3l6TcUq+ZarODaQmejreMpBS0arUNz1CYWqbKJ2fc2sTc4qXtPcX
+klhR0dXQmW2zLaI+3x+7xxodb17CXeGlwUu/R7ONs48j0k+/G58cXBc2EjIQ
+lk5qOXKWHa/+xy9/iexuMTbC4dl1VJp5eStXc/cH2oCDMduWrZkfgmUwN62m
+z3ReDJKlm0UiLHAuj7NhnDo4UplWftfQ53/5CwsMI4OAKbsaDXt1XWNVW1tF
+K1TnEQjzV9xhvoMgUNgBI1T5PgiyjZRfHxlPYrGlcZQNBOwvUpnxjj8grPva
+ivCDKoe4GhvqvLD+wO/WC1KvOfR4/v6vfbjVG+iGh3FS4hViFOvbZzu7umq6
+a0QdCE23rLwHpCqabib94qON6zEBRaDyshHR4VmO5HfOm2++j63rL0iAOmH1
+wb8jOhek+r3sYqAkcpIZJ4jC5pVXe2EM4cQFw87CQAGpnbq8XUGq3RmjDJpi
+nP1eYKBmfoacssjOM8bW5es38nNvz8z4+rP5L729JSQxin/mRH97T4UWqGWq
+T9XK8SsoKhbft4UYx9Tn/+evKayeN5qp3vqKttHsIKao20M9Y7ebY8eUM9Lg
+vRD8/VmXJTn+ST/6X4WgFiOv69hwUbFWo7ecMPUfe/a8Cqa2rwvP6aSQas3L
+3bIFRP38Z8jnQ5a5zafJW2PsoM2R4ukmSlmHzxxllLENvtY3iFizuOyuQtTd
+hwNU2YPVl+vq6hjFNnZ1tXUg6eSQHE4oPrh4GJ0yYFLy88Y8LKio5MrI4Nn7
+gzj8Aqe+lMzGFPBFk+xLtINJKE8pTxgdaiTx/btVni+VwEWjvp0sHQT7hMv9
+n2EpiPKnlOpqaam5ZYKUlfhEJVwDUjU3Xz768RMfX3gZv81+kha3FLy8/Pxc
+XFxdXQ6+//v36fz+zWBK8xgrStmNr6tRo+Tn1mOP35peX2+PUbNPiDofTVBq
+tgook/XanWSnoOVAFLbogdGBhkQXPWWByph5RqVjWZZISk0M2XY4t/5rQaqd
+xXy+p7K5FaRwnIBDd5v+DM7u3JzhuDRLpASq1Wg7E/Mq+K52hvt6So27R9Zl
+TI7RtDxLhb7+n5T4sM4PlqOxRjHSce745av/8R+C1OJF4dk5pD1q86e3rP7Z
+S1uwvEHthXnIMnTBilAcYYo0CgTDnC9wVuicVQRSFOf3c3JGbGX3VEjdA1Kp
+tUCpjQ1QTr52tFV1cUuHSooLCD7iV73ZUSVK8WJeAQ5qhbMbL3Amb7SR1ag6
+szFFQZUdXmxlPuLU2GjORmM/pZGM/9I/Wc4u3BJaG/yaj/dWxn76+oEDF0Yb
++rp7naMYB6SuXatZBaSSXk56AitZCTIptat68+nf6lubUEIhrTv4JhsK7+vq
+Aq5EzxlIZRGl6lVM1WeQo+pj5NvDvIX85HH6vP18YLIz58Ub8DgnMlZF1Wyi
+FWgjSgVaFLowxeD4dUuKl56HFcxn6M05zpo3Pf2bCZVS7VNRnKQwiyJWNWWu
+r81cs2yZOefw85+DKVQuK99GNJVfw/C4kzjluZ/yfI9hg7jJ/ix7C+u/pxD1
+E7Nj9V/i09jeMYARpmA4V+xYDqJ++eqr8nwl7TWW2tPzsOWcL+JgJTrOECiT
+ZwyinL7QMpP+zrEOnf0EWPhJVeew81KUZkqpQw8zUwa6wFEX+a6NKrKroUGu
+mOeyj0jS6aMLFcp7wb4Wtu7coUi/foSi+exlnC9w+e2brGtsIPsBKRjPi9el
+zqsdgNje5f8BdKe/JGZ/MtjSEiR7a0v9FaD85/7W/8CFc6ONwzW9DiA9htS1
+WTU1fUmYyz7Z3mPHm5jO7bb1yNywvvW8l4vX6dMz3vzP39ACYtKw6+OPX54j
+SJ2ozxC5iVy43l4Imia+QQ+Ff/75LD8TnQQbHhObHKyU1fUlOyh0Zb4AsQgC
+VICUeEYwlf7ZYTjL/JNACouDyNyTExamppp7Z79l3bg08n6d9UP7rwt1OAv/
+6vmfa6GB7e8tKNjra5q4J3PsEphCmoQ8afHyzQyNvYOXfi9RKknfCOOX+P99
+QE2LzM8x3lvsud+c28KVga11lVLY51NJ3WhssafnhuChuHrlmsNSBrsRbbli
+aS4imItBC4xOykp9j0zsWEhvqGNyFry1yLAIDx+Ojo4KSyzF8E7L6nJZRZ57
+5IiZGfu6B/GO4CRMkQTB1B3blYK1uGlDOA6WdnU1ooXjoFAKlj4jxcX3BtAk
+qEK/vnHtB/7C0M4XzDaRJcfj/d6971KuU7L/duf6C41dNSQ+q5ZiXHzLSXdS
+TvX09xMGelqr8nNfdFpM55F8bt/uyO3A4MBOIqRiP4phPjX8x0QzNqoy8jE2
+z8+/nZvPdhXd3ibwxHM6yyXexS++XWCK14fvkJwa7iU/GviZ+pzJsSr0GCPE
+E6Rgu3Kn56FwMJ55J3Lzzpi8x7uo3n0vmvO8002YEp/AwjsW8+iEuZqKDm/b
+qW1cYVmNDjS/mz66ICxsTyyJD3swSZTYkQle+/3UUhtFuuh6zPqN/29YncVK
+eCM25+zEqNeMZS11CeqDX+54lW5hBZCqLm0QJ0VxPp9DzSciZq4MkeoANkoB
+ity+wLqaPn3fdzwRLRs7kVJBu47QnhkHhGujY1Tj7MN0d6O5ZyALbV5amp1t
+JjHuTE3cNTq28p5xZrjz7p2wK9d9Hzy4fx8NOHqArsaeur46ZJ1AqaTkugWp
+1IGBnLU7JUPwf1YiM1bWllo7Mw5E8ZHEd6Ghi+Wu7kdZz5kBVaF3N0+1J9vz
+e3MtOGGu8xIGdonyX8k3sQoBi9eMN48Sp54gVB2dcxMiykAqj7THTE4re0yN
+Qd5pV4SdLkCpPd56HBWV6fna2y2+00l2QijEOKbHKqaiBCl4PpauMrQ0Kh+q
++tZkC1ITyfbeSN1gMj7Jukj34nRTqs+cifqfC7zch8J26BTX7HBKSARS18Pd
+Q/d4btet41eB1CubX2CI8P10fDIpYx1C947W7zWYksXCtKeM4YKxBtoFK7TY
+RKkV3i+4v7BkOUHq1T2GkzpS19RakZ8XsXKlzgFwc8FEKZEia4xxvfpZc1nH
+2K4KUC86Lgvt4+x5dQ5LPb6+xcYPIfMWcqUaThfwVDVQTo2Nll4ezNF0b5Gn
+r2dRkVq9YKvhs/iEWPewY1fCtz54MJ5UV8rVGKZtDeyUI8DT3NgaHqfUZl4/
+t2vta4KU/5JXXmHhkfQHne5vFVdgbe9eiE64tVsV3TXQnI/KKfPMurZqVU3L
+JCEqEsk3c2DCBJZjLFp+B1O6LUTye/9o0hOQVC/3N4s+VyHFrO/kmSi7vTAA
+8V20h6tXFjW9kMQ7l3gTpSwywTxiLE1d7uHqkCXExPg5x8eiOO3peA0vm5l7
+goqKPQfOzdhPClJ6etKr5AHrDFNWyTHdHBPF8OznyzjgKnpnCxOalYkwCaPX
+C8KQt2Cw+KoQtRk/IOk8NiZ9L8U3is3X/IUqweo5E6+IWAfkXnZAq6F4UhuP
+7B3oSZcgK12OXcuOV+GkOH5BkKrqjWCw9zw07eEXcyPMiTLuX79omjxz/Wsf
+Pzj7zIUNp8m0pnu3VlWP5HBdBIao+C4SuoRbtygbiRUNKtAZm+H2M5IdZKoo
+9BdFpoAK1syc6YE3X8TialFReHk4UYrUB6Qo7cmVtbWcJx4YBVIPJaVKuNh5
+Zdfed3bC4y1ZV3bl2Obd7+5eIkDtVfbbqxC1Fwe4TtoCOIRZsx7FKZMCD626
+tmpWRXdPPfeNctll0kUEreMvozLOtR72CyiY8lpPz6D3+/jjjUCqPZryPP9w
+Rn09g+IzUUITj6vrHJeDYOjgQT4cdHFx4TOFKVIgPZ+V/DxMkPJwhqkYS4on
+RMXIwrOeoRf3rCLwDlIHGMVWtwEi/3MMFuqnv+g4TB8ZaWFKt2wZXsDssP6F
+KR4LAdsQpYeEmFvH4Z6e2ynPNxuDsLkrXvAh823c+L0cvcJR4zlaIPLCEm2c
+Svy41VtOQGvl16l58VJv9Zlzd+DqyAPD+eoOCAQf7ns0VNRn5M7cxk4P/uaJ
+a/RTofNV+i8SZWDuNM02t6mN653RIAhZ+9oO1VaOyF/I1xeRU3lJ5cBQV1ND
+W2PLjdrOzpKSHGbD6KJ8VUUt0jtJMFhWXKrLhM9ufdbsPfvYbL4F5SNKfZRT
+fcgreWtoqMURCjr9+sOLaRjfp3RmoxKgFgdR9+6WLd69e+4SsyWqt72Eq73B
+Wx9klzZAag5318w75IxPIjoPXUM8pdSXT2HCmSUcHn4l9U5uXi7lTHq6PcMc
+GFJhldd6fsbBy0lPfPxE0tF+V3urWIR0+8nAwOjoQC+FJjB0ML6dnYaD+px3
+B/VesSrZEnX6OfkpVz9XV+KUh1bZY0QrmBJd0z0ccUJmruE8aO4Jdt6/NhuA
+Kv3bk6MKo07mR9Jgy9V9wfTeXgtTupqqrMFgDI0I2w3z5d2ZGBIpTJWEbTd4
+EmfNMp87EwrjqDHtv66s/2am8v+f+9avXUuHvZSs8FtUyLvffVdDCoehInGB
+bAei5i5RJbd8Ob53+1/do3Yvu6+Bb2lEyBbZUKrXM6cEzGUpa0/PWZ4rYOnK
+52yHg7DaPUZNR4J3QYUXAalUtmG6Gtra+qproTp9zcM2jLtcZmU1a2GKnmSJ
+CJQ7zxKjiFIwnjYc94HUYF3njbq6vuq+uoSGUXY1a0l7YhG06HBu1/oP1vv7
+e4eV3btXdmzxXIgoFVN7D5hpsr//1gf3axsqxEDV1KzSsHiV1ezx6SrGM+in
+aurxJJDJ5hamaiAqP+ONN4xfnehHWazUZ0Bmnveak5T08U+SWAy1K/Ph8BOD
+WirLi+rpIOvGClLm5dHDl01BleyMU07xFKgSpBwLfmb/Kka0VHpeXuT0vER4
+KeNH9TVOL2zBtyfHSPGZQeYToayTa5HOq2uWgTPCBZYrtuGuv2wlLjDcjKuq
+aCyxee5xrM2xPYDBE/z5ayQ/k6nwQOBywtl/hHlar1mF1k1NgcE1SSektBLq
+7Y7nwtzlS5YsV9JFyrl8zyfkPbasGvLrEyMSdcsRuxA3fn6w6TYX1S0iaqHj
+ZKN+YU4IORLfvrZrEEjh4UcEKYZtJZW1jfR4Q13so7Awx7K6L8Smj4GU9Sbj
+PfjWpUikvbUPiy6iyBdlJnjMzmGjc7BPmKpLKU1oRMSUUp0wgErvrg7Idp67
+sJH2Y++77gV37x7zkXxx5869H/gf2Ou/01RUDx6kNh6qqKno7U008WkV8Ukf
+Zq0iUpH55iGzo/VmSmusW0PyDgOWqE2v4z1mrOvMStTr6TAKQGojDNbLM85T
+nzONSY6BW/LycFFcmmMwZYWng48/xptySqW5tdJgGj+ClKuHc7lBT2BAlLLf
+169zpjYv/bMTkXknXzdxStp1ISrq66iTb2REssT94gJzmx5QqbASpnTNb42b
+ePRtW5CwgamQRMJUY2cxDd8nXGTXKoFRCwez3o+8nxLIWpORddnfu2mlSLd3
+Lz/K5puM86vMqQ2meJ7FIpQwBR0GqpabKLUHizIgNVhK3svLxb7vV79iaW1N
+rjwTtaUuU/EFC52cgeM/9PHtswVt1/DFHCnyfUeJD8kS51s6x7qqhkpBBpDS
+pp5YAx/BSS8rfMz9HAmkaRAsJz5fBao7D0bCyzuzzZZwX11dbV1f3+D4YEoj
+OirRUrR+5SU5G6exWr73AMugxb4k8rX+e587cOArLhPvQnq3d+uDkZTRVbdu
+9fY6qAOiFMXUIROtCFOr5q0CUomJaJOQKHF8Wv5iauAkhHrDQhRjktdp87Im
++F5+rAsf9vz6dOw3o2jZSHsASi9z5jSb3GdBS+Eq/qCV+EyQinGM+KRDsCDl
+Z1YcaP0C8TKz+HNR8m9k5Oaq5QNTAdY+BDs2Z7RyfHuhNkQpMRSsHJfiDKJm
+ikh3A1QvsQkmTMlvo8BT/ufIEfYoSq3wXqKZ+isyBsIRSLsyO59b66QCjCL9
+fwtdP/1bWK3n2asW6F1eHsj2HNmDO3brS2Q8i52xEKXNvc3H1q3jfmZjfcaJ
+3Ah8IbFuXzl/zUxz607c5kKHU/CjI3rWldmFljv00K3MhPIS3zucLCdMsagy
+UlmJJriro7GuFkhlc3c63CqgrJTnbjxjjBURBypUTnnHQip4e6MgH/EVarJZ
+crlv9jpZQL+fmpCpm+klSnyClOzXDjwwzwhXrg9szDmXjfKX8zgH+PJIbeah
+a21tQCrRSXDeajPYstIePR/PYdPqHQ5J/ExUuOwRZZBo/prZhkpHf2LPt7cz
+Lf04SVO+qnxKKZbTVWx7zZghSB0EU0Aq3kXhSo+LKaxMlHJsXRnmM161lBIf
+qzMCmUl9m2Isf4QoboeyfWtByhjnqSskPybrdHaH+YGdbQ767jMeFLPl3swP
+Ohel1fK9vVqOfCG5GbkdDQnlYTIEAlGQjEjhlApeeMFhLcWbwKWdJKtp22iy
+4VP/O/Pivym1fiL+QCQVfTWoeqAYtdTbWC9QStH2qZzTgvEeTjpKcN6akTf9
+8Jbn8cx/eiVVVKTDjmzhQufoxXmHeKHzS8Yo7FZKSSXqN29f9Jq++GZowQqu
+vK2rVsV5QXj4Os3fhCJ3T3dnIaVnCeF56QrzKXs53lpD9x3BeqqkpKSSkzPc
+Uv/y/viX91NHgSyoKjGQkn3b2bOIFL58oF3PbJx7jCNV58iXQlnqwOiqtjbC
+1C2LQeBD2y2jRjCVldq+ipoT8iXMOByRmH7mm3a2OQvN1XSpTnRDVunvdVii
+6ImzT7wMpOacr0d9cPINRipegTO8XGcYRB0UpF6ON9CySqp4Ra14pyLBz8+p
+GzZ6KQePoJrKWhSVThhtSxSDQ1yppHd5IyAgMMBa2GqfSE6OqpIzwgJzr8m6
+u/aiM1IxIWOqgSW/MBUScQJIpXSmhWn9CkTtxw52xSJ9yzGWkrXUks0vKGQt
+EcDQEKN8XLvWqt3/rhwo4mAaNz543fvubrM2CKaskbFC1GaWjbebhfXSrtb0
+iJmHOS6Bh1GICnOjYnEernp8mOqRUMrMjYfGOGg1YqOh8z4i3S/SOdQs9Gpd
+Y6VAqvNDLVn5GBw9DlTGLc3R9+mBVXB3L7rDJh6aluzKkiuAR9c9WfS8D4sg
+AZUglUb3OAKiMPnRK/4GnTINMsZBQwOVD1CBJoyOKiyBI1BkXsdu3bK2GQ7B
+S0mBfqui4paBFGcCzuivsJ29F9YUAgypTXuHfNf+GbKodjbVsTsQgQ6kCqM0
+pwsk5ijvgSnredP6bM6bVpTyc4xlnJByKPAsQipGVgkEKiCFDE9V+OuSIuSZ
+Sw5fR50JDIwxTKkpxmLsvapWHaP56VbOsKQg2A9Smq+UZTUlCqDqrSiFQN9u
+MPXpDpawYs3u0wplJEGKqnnzEizRKaMhuMVZKVxd2PjUU/8ddct3734cEKK+
+2os0a64oZ0uEACe1ePO67SsWywPhwwtAqv5kiBtH0n7FXeYIc9jccf3T3KVa
++Pjqi9GzOFA2NDQKgWBK8GAp6mzutiNHWLBqgFZKyC45h5TgmM86H0fm4+Mi
+63MBzMfdAaln73hrPmNjKhNuGyFSlZSbBo/Q1Fme0nkxAbefyuISmemNjDwY
+t5yjWEgfbhCgBliDyBwYG6gFg9hYWTOYW9cqFKQGBKtVs45PTk4ODx+/Nmve
+qlX6rVtV+ZzhEHUZSNse72WegJNGAywmgYFeRr3d5YkfJ50FUjfFdr4RBaT4
+Ux6uMyCllO76H3d7Jlb1C1IuYjdj/JyQ8vNwVQFmaKnAGJP1RFcJUjGWBI9C
+Lf+kdXEmKsoUU36sBnpQkLVj3a8t7n2m7xPZad3gxSnB3JeZP/9neDLCKCxL
+7MWuujMct2qFqU8pqDAnUPjXGFf3GjZbHnnLzTKyt2KVQtXff1n7qWlnYTmB
+FVQz9npAaolZiOGu42Yp78BU0HvZ1U1VGekROpoj5nxZhMMw0dwZesthfW/d
+sdpnaaXeMhZlQ2MJlSNB4cb2GbGKzZ1NlbXZFy430KpdhZNCyKQ5saGjfKxH
+iPKxXB1XmFfvWDnJuKuYUjnl+8C30gaEwpX+KnMqK3NEdVXiflZSLD36l8LU
+1Jffjk8SkgawN2PPbwA/KpxeajNZ3TouPmpWS8u8lNqE48Mbjh+fN8wKO8/k
+hlnHMQ4ePcSUqAbN00maK6MpUJTyw8wHJPGKHCr3dj5NfmE/lURS0tHm8wxh
+0EVJTuDn4url4jpDEDIpzwmpNw++qUzIzM9S3QlNFtMpj9hAZT64zmQ/45Eg
+FTrZL0pUFJ1Aeqv9jNrNKOPTIbLUtI3tPfXmOIGRYVtoMsMLh9LTDQfPlTKk
+DXFL5JDaaGd4GLezP9FJdjAV+2ysp+zo+JsmHW02Wys7RERqHVn2imuDZbD4
+d5ttMNuTpfDSpSuYtWrByizEKOURp9YxMT7CVavWqowMDG+5A4CXhhlWWlIo
+R9XkxBVfdGxaGUpqaDRFMYqlF+8AJoDZf60gq8iIVNiSg/7GYbyE0pxj3Ivc
+X/Dx+Q6grCJdXIIprmDQ7yj7bS26g2x468idEZsco7RzBaYAlUxipQRmqYoo
+RYH1rRwTh1ddA1CZ8uPIHGBli8MLlSkJrKpP9c2bVYvlHe4Ig1Msrx//1vgi
+8G54cup+dWpK39RkM0JfIBXo4cFMjZkKFge6fp1XXxgTkPxGfh4Spla87Uh8
+SUe56qjBXhSlFOMVotSMGRam3nwcpFRcUaHHu7h6+CU7tefGZcPVj9BmIKUV
+ZEvfSdEEORWlBeUzhQwOT5JzJRWNUiSTk0e7YNXe0mu+9dbdwek6QA6TTl1F
+nNK5lacppGA9VaPntXV1loRJgH5pz6eC1P4VscxxPZWQNoswIu3Ntaz2kVIF
+W+XUxn/AAhb3u42gitrcfYm3xjDaLV6hCaOy3itAKqe6pzUfD+VlEU+HrJQp
+N4gyqy8LH5dNCx3mZJZVi2n5hCiClO/aI++Q9rbakD2FF/iOsHcJ+43/AYZ3
+FogWuxuVVPDj8jwWSHma+srTOejzvgOqtt7Z+qDIsKNFtpEi3KQJf0E2W6W1
+1V4MFaqafXxwcnjePOZ/owMEqIuKUpmplQnsuk9O1uLP2VJrnKqr8dmYHJ4E
+TJNATGYb1F/V1djj4ZRsj1KHFZg88W07KNiEeiq/I1+emxMBrfVc/kxvEqTO
+Iq6SGgEBgofJe82uM7yyvObMOWqCFIW5PjjfXNTePWY5ramxq2OH3c8ydNEv
+jc5lkyys2XEoPPlGDFmP1EpyVYwyoimWr2Jaby98dJNOZe0+i/RUka4LPk9H
+cO+BSfKyxPqOrpSSMBD1R6U+3jwtkaUhikRCLlGAWvqClfNM2/cP3WdAQWWy
+nzab6bKWAKfl+1HfLX/VcAg+6z48ktPfU1/Plvay+c8QSCPc9O9tCkPnQWvn
+qZa3TLyy3H+GFuKPOWLSXpBE5A9scewJp/mey8aol1Lq6ofmMptqcsgCbcWI
+4QzSAXrfWG9fJb9YhStHA0jic1wiAU4jRVYaLNpqlpNtZhVeeY+RjZyCcZ0+
+JPPF0Uw4dS5W8VxMxXYihVnzMOGptq5aZlLVghQpb5hSSmGKIgyc1VVP9vRE
+2QNjyHuBFMMTMdFR0UJUh729PTC5PdBuV3FTHziRdPbsRm50n1eYYhjjIUy5
+zPDyUpQyiOqHSjdRSvTUQU1q/CzPMscWO8MYFwfVGWPynkGY8cWTEh3n4TM4
+dkRpkFx45ruQmmjHJjWqQtcNLULZWC9ZoBI9JS4BbTqzfTnJZWixoTg0dP+n
+n366h3HIZgOpJdwum2s9DNifNW6d4Gn9es18p539x5QKUuZNg+d8wX2J1MlA
+d8f+5b/cIaZz0aJjH75X3W+nYJ0ZIUhhmwhnPtuZ7956BKp9CxyXiB23Fa1C
+qjJcsqe1+nsPCyU34cJytbGxDkT94QhwIBgtUp/HhBjC04Qpm4lUsVAKnt7f
+JRXQ4UnguVUbDmLTi6xoZZyHlQr1KkR9+YDTCwmZo9dGsaDSYdlUZMSgKmWk
+tq+vsa4as7K+FMIU5Nbg/am+PgtSk4LUpL5Y3dk31dxTmL5pU2FAMmGDqsZs
+5+Xexi1qork53kPc5xsB9YWC1IWfJClMNcnr3Msj0KvZxUp8ptUTbc4Hzfws
+dsopcXFohYlSDvbcSKUsqYuXwZTDJ2HTpqgAXmPAleJUjJ+lYmi36il7r77b
+b1mrbRaq9hkjZ+U+LcBx5kgnIE+0VnSlhLPOJ/NelACLdW9DkFpiACVVNdT3
+Lp1n+IduffyvjMK7xutc7d7y5a8iQdixY4cKN59j7+RUN3fnp5+YmbiM6ZFb
+rttMM85zrOlZnMFbby18fObTyn0GUSO2ImnI+au/g4vK3bLigovZnezsojP/
+MEgYgjNf/IKAE2RClMmENp9F3rEmPHk6GAV1IppB6h+ltXYhqUiUBLNBd0bK
+cXGhRCm2sx7gdXefMjwzJWEgQSccK4vNhhZcQ8J4be1g3aTxpO6r7h+83z9Y
+DboMlqwC/eubTHtwZ6geb8fMZ1PA60AKWkoOBzox1JEfyKpn+01ExDCfAa32
+9gkgRYVuCnQYdi96PuhzTM9NaDI4Ak0GUfFzDr6JIiH+kfjcyn6mQFfmo4Dy
+MPynyZ9Ojad2+5jQRAlSJwvfiIoxWTM5HkQ1U03hujDUMdSB+qxtyAiylfzk
+5CyzhOkzI3WznFsgbonpFW2NBcp8n+ow7atU47HYHC6Gllr6AkOUnTvNqY+N
+Ztr3fdpK0VdBnhtO6pfLf4n4bgd5z5RSl3XM8cTMwzgIhqiSmm7JNh1HiJ1h
+6q23nBuh+o/rGMuECiJ8+FrZiR3NMiAFT4m9AALyziO6H+n+CpDSor5GMsFW
+mIJJWKSEFxsb6+3+WJnwrEQv7LWDKlQyBKciX+MDIkGMDTeJ4nBKKZGclTJH
+z2TyBwOqrrBy5P6XD1ITBir7ajVs7tMg537/5aTqpKT7g83jgtQ3BlJTzfLq
+HBwc7G8m3WxKppjRRrp0m/nY/Fa1tk80sz18+vRpGWwWtt5MMpB6sr+wScI7
+7T54mJGMHlo8GCoTn6RDUNs3x8USDDuXjMW3u3pY8xiClNnmc7UYC+U+eHK1
+fkCqMEDF+UnYL+3b+DUrUiW3s2/TXCo9bAsrjo0NXJ4zT+Q+szPKLQPAhT/s
+sm0rIzIqGgaA1HbT9H0ixsBwy+7B3hrzcgZVaLIS1vehonLuyuxVq67inL0Y
+Kqlf8oHqHFIKH4Se+twTh59e/UxIRMQzdHtW2l7wN5ZkppIyjAJwgi88ZE6s
+p5XdK2DgC7IAFIgCUtmNpTcaO6+WHMEFSJZ3JvEpQOm/0IiEjR5hkQTDUrtY
++w2AiTLdupy01QQpsOpLluS2m6cnm2q2sO9ACm5zDPOpchZx+Le4ry8SpjDa
+7OvpA1RU5nWC1P3+vjqZ4E22DBtI9VTfr2arcBD37Z7C15Nln8KeJ2MDFOBv
+tOYXUsOM3yj14oxHdHRAcn1hUtLZjU8l/TgpS5DCXkqIao63IOV4TNpzMUqE
+OYKU5f5j8QUeVjHu6mG6Pz+/AMhSgtQmGVdbQYpJEKk3MDomsDAqphDN6MkY
+o4sxqQ86vhlPmbraFl7qcA2psFClQ1A6U64PrMM9vfrwTLxgR02U2vOpBSlP
+2fL4BK3dquVrh1PnYyu8f+XtX76H/T6874KJhkvIezuoppaj5/zk0rrtPvgg
+9DflZoRgsMYMMjHy9uwXHenNZL23zF20BeZwrI5ZsXV5fBhXuczsypGi4isP
+xx7i31OEIzAxKg0Cqa5xtKETIwudTSZpvQJm1gk1SnwM84INvMCKESSYT90d
+xZiereIRlEZVTfnaPL09PQlmnlhJhXFtBkh9++WXuA5jNazaHHU6ldMgQHsw
+knpxIJXUN1lbh3MtN0Avn03iRkNdrYlPx2tMeV7H+DCHvcL+9uaeQNhGbaqg
+1+TJYF3GrnavGU25q1lpiT7f2j+Ot+vLQMouGiFQ6hZrcjzDhCpTVD3WS83R
+bz3Sm1vLxtZiqCuxys8sytDtsX8VELjJ8jAjVpn/K/oDUh+uVfUnvxaREH+w
+v193DDhf19hQ09g9q7FFl3dqG3WGAlCJ7FTfF6krbG4nIiIruhuu4zX16aef
+iOpUdW5yw3PTfsBTj09M2ysJ3gpLgcDzKg+QWufjO1h9kyC1mmvYQCpv+u0X
+nbYspjJ/a8HjGLVgofGpn5qqHbheEkQYKZCpGLPiorK79/7614KSygfZDQM4
+/mRj8xpkQIOYRj8vACfIMkMQ0Nyld/G1XqxKTJgyp91EH/CqAh1EaUNND5C6
+FFbsS23+LSav5eVwBtV1A+iPubNXS5Ai/6WWD5SMV1Kh872/Ucc6ar85BlIr
+u85vj6/aQE01PknFnp19Iam/+Sb9nrl5xlbB4XxVUvmYmk9MeJw/H6j0pmhy
+umkOBfpPodAPnobrLIzOig5s9mpmcjxjhkITmAJRlhDBxXoYyLgka/TrZ6W9
+ALV4+ucZrzMTuAAUJHqgeM0zKF08LEgBKlJfFOs4n8F5usb3E5/4weDqZEUH
+c1RNlczdLrwhVHZMn/70fJ31i9Q+ltvhRBwgGq8XY1/26R8//XT//ljoc/jz
+72un4b92Et661nvpXOYwBlDLdcZYkPowZ7Af/XwiWwwwHIm5t2c7SQMHv/mW
+g5YiQnX1wO9MtsxbxdUueY8VFdy7UlRgi2ONQYfS0tJGKq9yU4gtY2KUAGMN
+83y0xWCtxZgKPchdqwz8il8KUCZICVMPTMrzNcCy+cbZbIBpkSBlLGDCKoEU
+VRM+HAMXscVPbRwd7WoAU4Nf3leJnplwfyp1eBJ7zrobl5X5zkrPNzhlUt/x
+SfiqPoyqUToM6pRJ85nW1s9YzTyMZSaQSi/UumfyeXuWi1dWlv7+Xb2aTgOp
+cSZcGAaT+KIDUQlnwUrx6qIq3dVUU1IkmKzn4qpaymr0zJhYIz1HlCK4mVmf
+o1IP0IDmjLniEGgeajrC1NfYbuRzVMQVKDVUNdxo7p+Y6qFCbxta2HGrAUz1
+DSpQLVyglEc9NTNX3kwcCIyo6m66Hi5I/Q8gRWTXpqaJUj+g8+u0jeZQ6BIl
+PgOq5YLUsWMsW1W3t97OY5+Hk2iJebenm0WFhY98Ex0sgs5gl05S3k7W3Gob
+Grs4stXQkeXFX6URpOj1zHmP8OsDONVfxvLH10eLMIKTGcAAnmCFKfMVIYwq
+yfy+r/MZkYuLr6PfM5DyjfP1xI/YRCn5CoWbUqqyvLiy6OKVB0ZLxUGiRgWq
+2sr7I5UJAzDntZP4aw/erANTScBusHaQAR9xahisdSfophonvC6DKCymtZGO
+cRQSYfIa2+N+gVwZcnGZkZVlQDCjqTTpifH/AwZdjsHn7YQSjVcAldSdDuWU
+4aMUpeYYntNFVJTFEHhY4xdX1eh6LETR94EiSfHIvAHS9UU7IBVYeBI5JxPG
+Qr9mLndroQNIjU/WVFVUtKFLaxttzCTPVytQcXx1tnXUD2YqMeJERG9r00Ba
+6CUyn3EYxmmK75mPIPUDrhmvX+u9Vvrh5ZuFpx28vLp53TFJhKub828fZrpH
+bY6Mc99jLYt1D22fKaIWDnX1jQ/W3WAhqg3WPHskPIiW37cg7QE2iGllf/2r
+IFVQfv169nvvZb8XfsQUSe7WDMZaBgVIvtqzIvMFqZbSn/DlH0J42sW7tcGq
+pKyaKijIQpYSn4lScTbKc5uBVOpFnH/SLiLVq07hPEfXrYbGFmoqLjlSoE9O
+DfdMttwc5KRs/+V+olRdAnTnMKl6eHhqsqdU/Gd27WXd2GUScrL3NiI4XqLY
+IWYKEni+8HRWvCGeXL0CXV2amg4ixPvpvyZNTPBb8lUkKcJ0GkyZ3KeEZ2KT
++cTUUq4mEkkbbGHIi3jnpw15EelCT0BglDAFdRCoBOiAlEop/o2666uqcO6A
+XWM3trRZnV8FLjQVHTpV0MahHIiTlC4OQ/eq6yNGuc2PWGmKqSZaPgMp1C06
+LyXRFJD64dbYuXJFcb5U3Plmsp6aPuIUewxBOYN9Lb2Rh5loI2OOnO3YJbZO
+WC1wjGE4bt12CJIQhwOM6tvwzB/BBl9xquAKf78gqlin0tI46aILLTm+Qe/4
+bA0y1ZShzkGPUEKUAoamirIQZj7zNizUCKAyiNpq/qhoqSIbDtc2QSoOFgG2
+wvR7QApG9d6Vkfv3IQ3qupu62kh+mQkpx8tXZfZN9bVMclQdRCVV91Oed2ZW
+j38rHUKUbsjwMz6YXVc3eL+ZP8NGQeTs/JPmhIsarMLo8zhFuWhBQZW2q1/8
++aasJ59IeuJfk56ccD3P2iiRhH0GC1IzvEzxJNmw0aO7WNy5iVKOtGdN+ZyQ
+MpSUEcgEClFiowIEqWhhKtpg6mT3Zydr8isamkwtCKQo7qbaazp6OTfDNANn
++Wtsy1ZyPWVowT6T+zTp49wm9p35NaNX0sI+2aMwxXdssWesI/H9gGbnLFy9
+IEXW5uXOh3GMLA/vt1R0RIQsW8ll1MjbL1oa89kSPc+2zlihr6DNWDU4zl0Z
+XJ7aGO0dwgFj6xHiStGVe3F3yohPoZ//FYvN8ILwI+f+8KGcExd5+1A0WW2d
+VYqrhgpysAnm1+r/QBRgylEpNfKcVVIFWY9hOt25g8UlLG6shdIMCFIPsIiF
+USi4Ev7leDVbWXUtWGyynqxIlXlowyQxavJm6Y3+pPtJOhGaTZQaF4kwyd2P
+byeZ8OEkAxibJ3sK63WUGcUmtpusU3EDjUtowtNBIwXG0KCw6Xz7RNK/yOHV
+Ba87CvTAQOKTq8opxseOktx84upiVOkuLq4eDpozxs9pLEXis6KUB/S7hynM
+SXhRJmAJYF4GUcyN3zjZouXTpqYbl/sQSvc0T03w734yLyIy4gSXoBj3tY0S
+j0cqU8YWLuxg0ccNNzm2LSMi8np7KwYuom/5IywCHR8VKPSjz2trNz71Q0Iq
+GG2fCVKqzq17MQpSlwcbbvcmurltmbkmMkJBylDjyCgeHR3SfPhQ3zjDF90J
+4lcdRKySB2yjC1JfFMFGkfdCQ/GLLgBTH374zjsAibshwpSlPVAoAmjmC0Fa
+l/HVnSt3s3e81UkfCE45VoiS2bQZxMRRmi+Ks4Ux4/M11PmD8riyODB15XrJ
+/S8HEajX9bTUteCgN2teAjsLw5OTPZN9N27iyjo4mCRI1elAg6op5At9FFd9
+zJMH+6amempqeiMXzO6FZcvPr8KIrJDOjAEejKW4gYMugR6csWoff+LHP8Wb
+4+B5WIRoxZMsrYV6merIIMpVdblSZbxJfcDGQApFg1gDgyjV5jNcHTZTgUbq
+EkiMChSFoC9YiLISX7cdRFUP9qVWD/a3q7P4pibvcARXriJwOcF0aXSgRLow
+vEvgOaESWBZ9OiQyrze3qvEiOw2oWz4x9mW8LhKkfrAwpTVkf6QIS8QgkPNw
+Y1guA+EgiRDabvdGzJyfuMYYszhHlI6RkuN042hqH0OPi7rOuW8BK8S191ke
+JovZrlz5ikoq9PPPqaXCQsMLPhSkULTIgtvXsN9GaU6tLksNwCJAqagy9IGP
+KcmFoa3EqiBHjDpiqikhahFvnnGykZV79VdCVAn3PRhmhaVduVJyfxxaEx4K
+JrCv5dC1DQilNiA6uAmkmMb0V2ffH8+utViEb02Q0qSGfq+vrrm5pbs7vcKs
+Z+VX4SfXijxXEroZMw4aArP5YDMOPllN8O2yenn54OmmJmW+aNXnp3ljV8bV
+AIvcpw9KhAZnfsZWyizIxDwyRLDqcy8LU4pSFFTmvXYDhSiCVhTSYZwbu0tv
+kJlTMuv6MNyY+Hbim/oIJCLsX7jlJQKpodGLJWyMcLFiARKkmTOfRuFClMrr
+rWq8zk7DpU8+/WQ/RJ6mfYuxbf4hIOWwU1z/3Np3pRBevsJQ5yCKxm+Rz5Hs
+utqGDiDlNlNs7Ozps502B/t6oWpNkCIujdUOYnhRLtLa/F5HTfVgNYfPwgru
+3f0itIyjszo7q/tDBe9wcAHSHMpbmDHVlKnIFYiC9QFUmZynF5+gRw3fVt8c
+x3BPCEMf6ghS5L1QY1kd5/uVlffi4lSwhxVcv96p+3rV4KQObqPvkHG7O04V
+frPvJohixCdIpQ5akJr4dorYxI111WCENvwauicnuyvAVUVFvl2DEBgALwtS
+/S7NJL7ArKabOpb2L0k/fnLOeQtSXtGMAPGlihbpCdsgSZ6AZV6FKGHKaKZi
+/Jxena4WohxBKtCBKb0YSAUqC0YFSokApFpKb8Dxc56kGSqfuSS3fE7MdDu1
+bdnMiMTpmqyOQgSS+oZgEjCeYv94WQReIRG97LHb9ltRikoqFmEnkPp+i6l/
+/W7awz8H7flcI0LYYcjzxTsWr1sXfq6ztKujIzc3wk2L95Kb7zOI6pB6+xY1
+FI2GhN0jaL8diGJ9fV9bQ0vn9esPr9x7yFkgUVKfC1JpxwqOhb9jIQqpgTDj
+aPmMff4j+IAXsQTgRugRzzmy1gj5gtZamLIFhRtIxZn7x7yCqKIRFefFBXGh
+sbH71QMWXLlaQswhjQ3qlOMkdndaiaEWb9HUmAoX9GB9XW3NjCE666bG+/qE
+wpa6vmFARRNYw659d01FvT1Alj7QkhYv3jwHRYJfc3RTYfuTSUmMtCYIU3Yt
+ZwVG2+HXuQuJKUK8F+W8odMpy62Wz9XZ8flZTZ/xRLBA5Wf4BNPgWQt9jlLd
+1OeBynxv4JVgtwtSdRiVdBfebJ+YKmSV9XDEfNZY3ajCZ0v/MVpgqywZHRLh
+SSiQ/aLsZ6q6BgpYEN2jbb5FnrE7YnesWBH82g9Wn3OJiGXRFVaQEn2g2nwH
+Nue4c5Z29bIjrSVQqc2tZ0hbJsjb+A8DUGOZ7H4KUUbUGRlp/kAXWwQPy+49
+jCtiFMOB0M8/D9Xlax/mej6a9Hp6KtaodlJVbkzzgwysTKGkg6E+NpMIBSnk
+wSrRHRIEE6EehalQ8p452oAb7JdFJUCKZmYR9VVBePnVhNq++7qCPdh3fN4q
+bcFcq5hFMV53f+q+IDUoSDFEVtb7dnCQap75DYIp2FCAR83erUUaohTmGtbu
+gTUVdjnYPGcGMSaryd48gSHVj36cxD6fzjNQn9tP0wy2txOe4lV0680wCVaU
+UpAKMHFIiIoxAilevCQI9XBAyoz30JQa7lzFeWDUGQOpQhOlSkVodrX1VuXX
+27sz8g5zu20Ze4ch8xOtMDV2JRw3GzOYiTSQyuWyax5RKtxASt5ORCnseJ4N
+5pDMD3PWcRr7x3OXrLAqKebFFOfL2Z3ffCk8vLOxlFIiP3c6Jlmo5plE9na0
+EaLGbqFG0tlODWhrR9irGlBlvm/B9IiMyH0dQ23w5xfvYqpxp+iv4KmM8pwz
+AWFaJvaRUz/L6mIr3Y23hpXgjviqmDK1FIBxN+oFKyjl+OrFCmQWlPRWZAKU
+VFIGUnHq94pKyvg/8dRJrqJiX84gZWbW1qbU1g6nzFo1b8O8ebNYhhmeqm1B
+JgyiLg/Cqg86wtT45GBdKdI85UkgNTyvZXhqWEae1FMUVPUa13oY6YpilEuz
+uMnA88p8T/JNfBI/PAQuUVkU7fFmqOsXL6WLq5G70Oe5PiqlzNl1531Hq5gy
+6gOnDSy/R5ziRYjiiTZ5L0qoEqa45VY9eKOxsaI3rwpQ5UMg0Dyd2BKRuCzx
+sNtsQep6QUFx+dgQf1tipiJk45CYWKWEGMbQ2ILU/j3cRgBS33OUeso8MiqD
+4tw8V6WURnu8Q0K6ef/+deuCrrJ4UNVrWWRpyN3b0VvFypJ8yNEiletq9dhY
+6oPworQxDQL2RUYkHgZ0RiLM3zSl1B2CVJoDUos8Dbsputwz1uQ4b4lafE1U
+CrLwEy5EuTvx5Kidch5R5lK1mOUtPg3D/lwUp4rzOMNzjsBXGEh5xhVhtP8g
+ldlx46HMhHkp8zZs2LDq+HFy36qpyVrJEXiBMqi8n9pnrvJN9g3KaUGQ6tMk
+sJu9mXkmV4IoLBYLzUILBbow5YLSzs81mZ4vqx0KAQK9H3OEJtEIWooyj9Je
+vDW8c3F1Fkz6XzkKdBOkzEAGndVN/pjE6x4miCn3BViIMsnPAIr3Mla3cxNQ
+Vl/d7M2zWlFxGB7TjRXQmYn4DofARCvzhReXjLZ1dKDwZHCcF5EbkZ9Y1UWU
+unRJ+wwmSumE2feQ+J7S9YXvrhybRT5i1FLiE+sxc81wzxIiYHh+Kdz3Kp6H
+vbdvW34Hs/cBqPqaBk7ZjQ6UP/jqAWZh0nenIou6p2ZPpNvhyF7sEpHf0dff
+vVf81Z2/Aqm/XhKiHFFKqY6Jr6/V5ZkZcZA1GTaJzkpvNpsDTjbrizkORFnF
+U5EJT+GKUmHF1kUZaxojf3M8BKmliooQ32WiRuD+zLwUNmGOz5u1QU3ftePw
+nbUt8n+pK+lMhTGYNFO+QUQKyDwNpvqGW45P9m3QNHbVNZyLavI7WgPFJimF
+kcoUpdhxcW1uguEyT78ONZwvLLyZrKyHmmkiHnIg3pCbAhS/mGPqdGezZxKf
+pcAz0j1XU5qbZQbV4oFWZjTVlCmkHNU5B92b7/eVNnXbM+QQmp+Yf4KbH4lu
+/CifYGlvjammysNxm7zV0UE/xWAmT8UUkBooCROk5NipxEeUWsrc+Cf/SEhy
+QGia4+EC6YG9+LhgHMCC8Y7dS1Y4KE7V56jb9+8pO1aEn3PbbfB0e5+RlIMo
+ewu+agMD5SN3DKQ4bFZSabOVP8SevqM3MT8xQog6xFQcSP3l7hfiEMrSwBOH
+iOIMprCwUp8nUJgoJbNXgcjBP1ljYYvODNeb6qigSiMxN5AKA0lSm4eHm7tG
+aVCoRTpnBaK+4LiMEp8n8nUJ0VPGxhJWpSC1GWZN7/g8QDVLYWdyijCEVri6
+rzOzhAbPVFOT41Ms0KhDrKY2n7cB8bAp6Pnz8An5HXmFYpL8zOwOTDUHunrF
+e7g2naeYUqB6+WCgnSjV4yEF74Q0TQYw8ixTpDJvJu+J0jRac3OF3TxKe/oT
+1E1WQW72qxz9X7RHYFS0gdQZU52T9/pvtJR2owlkBsn944gIAtXMxIy3T3EI
+eM10eOexi3xryk2YkitvRC+Qyq/oGihHiyBR537P/RxAB1Le/hxe/7tcNQ7I
++8B/pzEqW7sTvwksFQ5gOmH8WribzOb6bp4lxstRtbkYBKqpY2FcaBmlJr8t
+fxDWqToq2FjraalNSbl4vfjOF7aC4srUEtbn0tLQRS3syJMBU29+W1WjJN/F
+cXcfln3F33La55c+pzqH7EQtsMjooTTSs1m5zV1GCY/h5Gtt/BGcfByoyjF3
+2IMcnSB7W2GSmRdcuVJQzHkHA6qiokorSDHfCysKWwSgfMl7tWNdCRWzNgyz
+rVd7nJ29ecc3zJLnzzxSHxIEhOapjUyKq1EGc974277MFLiP6pZqCvPulsnJ
+VbeMDce1iu6Wmqq82/UTAX4YV0tc4OqFVIH6O4ti3JWpyJOwnS9z0KqnMJCd
+GmJUYEy7ur8AcZleIjo1+TM0QrOL0d/J59zcYZcwONAMBWFSkfZ5BfghJZVY
+yrCeVpQyYYq8p8RXWsqPwg07shsmRonY/XDIeLXbshNcyJ65bNmLBlLX+dYU
+jCIeNlYoEdwoys2vZy7FEdFP2bp6Vft7ePIsWRL83Mazj9YP/hsKg+dk2Yx9
+ujEAAld4wa3137pWfi27n4U62G0spnbPZY95rpHfabyno+vH1oVdGWjYpx0x
+3VPvWNjRFBXV1HRzMuH6xStll45duVI8UllcIMoRSJH1ejF1rqjqSqgeKSkv
+jsM27M4XdxjxpVFIfa57S5fCwtwthSr5T/sInlKomOLc5iCdHFyCLjfo5NUR
+q5QKCndU5r4wm1I0FFzRvjERjAVkxsS2SqcKgbR4J1YlF4XUQJvs7rT9yVuq
+3g2zGErsYdRHNaUVqxTcs+nxgNTkYF9CwiDLNT06Lg+ijmsv2RhvdLfUV/Xe
+zrd/E5AsSuDgQdcZzc3JjFwEKamoEHa+nNTf02SPkoY3iqsfrYEB0WwhBFgx
+CEi9OcMKU83xzRakLHEL5JaWlIGSUQgLUojwJMAzI2MTtbQlozAFok6mc2sS
+3GN53GrvBlLw5hmHt2DQQt47weTlRfptQYrumn7JMOiCVG4uE4CGziCMEf74
+qZwytXG1fMnStRak/lsXQzmHwtoDEUouzewT++vlWT5fG/zuHdn/7NYL1mXs
+GROhgNRuIUqejuyFhoUDqY4O9IGWMriKk2BNTS2YhF25d+/Kvev3ZEZwpSjM
+M/bewzEMXWkOUQhnch60uLgo7d69uK++YA5DJWWiFPUUSclASlJg/H2U+oK4
+aGZziFasUsp6w5FK4cn8UrHK8Jsa6EnAmVZeoMQ2YrZEbWaBT8W5Oj9bqIFU
++AgGCGNDFcPU5BtUSWmxeAN6Ux2OmTc12FJNVU5RUtrHCgOQ4lx2X2ZDraTp
+PXXDLZPjw8bLk8OiqwSp1l4cFZOTAwPNLjExpzl+joHU+cJ4ltxNNRXf05Pc
+HJhcmI8XcUehlASOc9hMY1hl8JphYQq782ZjqGEg5SHOXFCSQthrE5AK8ELz
+zsKxpUEIeFxMyeWDWqoTSHElo5Uli4z8yIgMLmlvORyB+R33cN3W4Gs5BKmZ
+dinMghQHNymlMD5j3Mzxjz1mbsyKDJt1y1c4IfXfm7R8jImwPF/Xyvh7qQUn
+f6DkH2z8pBSeKMspppbMZQVnx9zllkzYHJncfikNSFV1GNdpCILbdkI6Y/yE
+hBJ2E8quXLmC8dzFK3csSGFYcavi0Kx5Gs1wqxNElRUBKZjztEvkPqrzS6pz
+FKM02vNWy6bqSCWSI0qJFFdF7mj9eG+iFAGrkl/auFulGYxavLQiWCjkv/xZ
+wlSaBanUEpvtTlzsIkgq3yCcpG61LbwFYTkMkI4rToEtPiOZrZqcgieAAq1t
+bKwWpKaAVF9tZmNmYwtTmWEUMFPGynPWhnmHajDwbI2Sqb39m6iYaFdt6TWT
+wJoFLARU8YyOnxSkJib649mDqLp9u7ejqnBT1KZA07UBI4UpF1OCW8SUJUKI
+sYTBjmJKOwwgKzBAqxIgKlrzYj1nDG+uvGdBqrT6wmUgZU/vTq+h20s8derE
+iROJzPRZBhek6Piup10qC7sOjbBPSjy3SBJfYn5+Q0IJLMKnDgMX0pC8qv/7
+kHriJ1AEFz6QvYsc5Y3tHXFKaNqqNys+yQthye65y+fucKoQoBF27L90LIxa
+6laH1vZkDFzVM0E/01PXSYsX90XZpaI73Nq4eOULetKCKzIzz0RDIv0kxU3a
+w+tpd7746k5oWqiV+FRLMc41yws0fZ7eqrRVaFsllchyE558ramwRUjxlu0b
+XiligTf+OCEqVFugxUZ1gGGUjUPYHFNTcY5CmDMEi+6E2YpIe+WjQ3AZHLQS
+pFKV+wy2hodB1LUNMJlwUAw2GjQqRjPVN9yHKpLLD3U9fUp7LYY/WLXh+Ibu
+mu6e9K/zXiRMnUmOifab4SpNXXz8nDkkq8AeO6IlsQjAaqK/h9262x31hJAY
+gWBToNXEKfeZWsloNz2MA4tWYkQ9AakAtXwmSBGg9GogZa2yK0KZFhAjFx7u
+HZVeziFKldrN1ZpEivNTpzjexhpoZMRqU55DTKWFXQrlGwDrY+w7FaUSe7sa
+roaHXdrzPyxEETTcX3jt7zslI95JLlRypwZRa98Vst7dK/c7EEVtPtfgaoWm
+MXON6JwKXTcd91+6FFaQyTIPFsGQUkNVFXaPwKwbN+o6y21Fd2KvhHEwuKSg
+oCx20aLYRWnXYRPKU43jBYj6/N5DYhTFeZmBVDGnjEPD4KU8w8I0JSbeuGsd
+QVYuRnTgmLPok3ALTr5GdqDoRJSyVfJHDaDCuABtwtKX5sFzA0OE8EqT98iG
+SIdjPe/YSh5Ujkplc6u7ovu4eeZZH44PT26QlRScE5ia7GsYLdXEBnq9bpCu
+A7YdPFkk5y1MF1fNm9fS3VBjTz9Tj8/w7fpvYBI8pH86KMKTcw1ZgXbGIhMT
+42eTxgHVzfbk3tutqOUKgZQVp/TctFZfVE3JASHQ2LMIUiaQEZcsOHltMllP
+iW/TpkAPE8ZM0hN7jhsfiCpsaWrkMjgGAPZujKzTT4CpDCBVQ1U1PWK1G6aE
+lOf30vZ8EgozBaQYyUSwepmLLTI2sKjwnC5T27Uj+drft9BgsQeQBjLOYzy8
+d62B1l45KSoHygQWSO0WK2UJhMVOYYqwf8+l0LSLjW1KfBTntxuaFHabLldf
+vWK7wzT40h3u4XHmtWx7LDxH2sDow4uYPMV9AcWJ++q9sC+++iKuzECK8PS5
+IBUax+IB2i9j8spGusUKWFlPgHIO9UzAGgFPlYCKIAWeKMNtJkqhNBCktKsO
+iozThrnN9+UDnNGK7ghRRUHWKL5N8zkKKZVSKZTm+kRsAkeyj08Ok+laarH7
+rBs0kBqe6kvIhFyo7WH1eGoD3lOrZs2Cb59XI0idTEd/OD03Shy6cfthVcGF
+ZJbVbC80kJpgePzEE/3thewkWzQSi8JRmwJMoCKbOayCzLqCh5m4BJrpi4AU
+SFziE5DEPdpoYUoFukUiRFnUubQthVrkO8/NgQsbL5eWNtH0ZRCmaPlOpWcc
+5rro9Ag8iGfzg/Tw7qU9f7xUwF16RamnueOaS6mVW18xWm7bbnwRJETAZIMw
+tZMtvml/Bzn1lGV6bvwUnztgIQuT1AMOSKndW7F79w6HVoootfjV5RAXe7YD
+qcxbvZFyBdnXdf5mVlNXU11dTifHXZmtHZO0oLgg7cr23bG7v/hCXd/Dh/dY
+17v3l3t30+KozdXtAanPtbgJpEyYWuQpYQvzGJtVRdl8Hw1eLFBZhVS42APx
+UcJSpVlRF6L453BSFt+fYtm9lmSrRg+ylowfcGDdglS474MUZo8dcJS3uqEO
+SHiUUabhU1E1PAt/TgKR5seDfaVUU2BKwpZ5KVN9s4Z7+hBVXbtFVXjokCBF
+4mshx+SivI2s180h3FlmzHmfSZ8rBDkLDskT4+O8jpP8+m/aK5rk0MohmAAT
+pUxhpDwWbbFPHlJBmeC1ibQWTZyiaooGcsCIbs+DD3wKpGJMuxftJBCMUNgO
+pkpLL1/YmN15o5Tzf0QpPIMTOTCZmIdOxI1zDpE4UVxPC/3jnkskviE6vqfd
+ljkhVTV2NUzE1CeKU7GYdmJQ9sJOfwOqp/4xwhO+cz1kFZaKxl3enygFpvAX
+MvSBROevLuZW6P7te8IKyhtvdWh/dUFvD4zx6Rv9ly+fu3L93pVLnpeOlYka
+Cgsru7R4/47dsZ4+BTq98PAesLrkydmXr74IKwuN+7w4tFhVFO88PQ2DHnts
+kXdYrOE6bSRAvRhYWcR5kEWZ247YMHaxganiIJvzCbXRQIIqWjwMpXR9nYXm
+EXlrqKyixkIIFHvHxnAPDRoHIG5VrOo2ocnkPNP48ZD6rt0iTA3XthChKKHG
+rVrqUKZiVK1U6JrtbWAmCDea0t3UzYJoOhw0A86T30jlwkT44AwxnhBKN5kc
+j+sFQLH/V2jvQQSKGSwTFSHKAhQL79Hns9TbCTqb9JVA5285/kCACU38Ob0B
+KwcnpfGxRZ1HmSiFEOE9IHXuhimmYA/cVp/67FQi/3J55viHaKkraaGf/jH0
+Ch3fvpkRBlLzgZTECCqmPpF3i+f/zVhGrlJLZLq8VpbCP/kbwdO//D+0vYtX
+lfe5Ldxz2rOb7m8kalaU4XKnS0EdUTEIrWwRHIytyCefuj1kqAuX4gIZIKnq
+Yi+HwNBgAasKgiAVjAVBrgtMuYMCyh0lcgcFUfEWU6uaNOl/8M35/N4XTE/3
+3o3JeZVriMYwfS7zmc98fvq9gfXzafvIns8HwcB7K0AVanMla5E5H47PQvcO
+SI0P9Oxe9v6dnlrE9xkFmbOamnLQ6lUDNSSI0tj3lcKNats2OPU5l6IR/DTQ
+BMeVgIBXE+XIUkh4qMwrGKWches0lzpbcBmdTgaewfKKANKgpAWrYEVNIfEh
+WgULSQ6OvMIC/h3QpJlUxWl6HVRCbga7RODpawUpSqWCy5/Wpd7rjsKmzu3B
+BA+Dr4AJfCdf4328Z4y6bUCQgtkUMNWYSv1BR2pCVAcmNfchQniJSQwMho2Y
+C2KIgwtGHck3zpzA1YCLYSW7uNcwZwlND2bMemcGxsTXIm5CbcVndAiSdaVN
+OfUtZngkmLzp8ikgyewvW4J9hZWEFCDjpxo7oolfID8UwvjVTIdCIezd662Y
+c0l8lzg27iuEp21fKyCFfBe75T9+fwKT4y1hsQdi4VYGSH1Vzavr5hoFqV/C
++pxR6oPY/HrW54xRTHxQAKHpE2dFspXfXen72ZvtGqsZHwosLMaglNqma6U2
+E1IIUosAKWdrJa6c9dzpGakta581Cv3+1Su5Jx24SVIKSFlgdVhdbSl1sTnD
+LG8xE+i2zbiIjNIMpT+avQrp9p4ABk9QVcv+ptlUXe1s8nF2snDBBVhx0vVR
+hJJIodSU7wE1d/5y/NgCQJEy50gHaAKmKlUxVVdToyLU119/84A3se32YBPm
+xaikbndAQBBl9EWBLVQnSE6jkAm+DFlIfb5YikEtzpNZ0VfuvmyNiuL+DPZG
+/yKTGCmkUIYBVh61g2U3zsBeS8OUjPqgKQfd9I73HJDm4S+o4OMFopvew97e
+muDJWw43ztHW8CK8caYksx05TsUlokfV4ZOg8tMxFsHEt1JjEOBepmozQOrS
+teTkAuxBrg5K7GqFA9ENnBo5c+n38D4+gRuhZwCpMCR85D3zZ+bgYpAIuDQB
+SEmU+iAWNrBdDr08j9xsk64PLRkxtRSYEpeNf/wqw3+BKma/eTIyFjOEzRtk
+JIPfD3h2tlijBwbgJnjj2lBBVQFkz/1X8vIcsM2MRDeIlu+VPXjCZIH9Ikwf
+F87mWAfKLhenI6+OuAanoTR/okYxRBQjFCp0U+kjiwm9PoYydkao4HKppeCh
+4f/aQpUwnHWitdMbPUEMgp2EKSE16+xplQxS0voBa8ScvXziAY5n36vt4Bwl
+ClHGqFKeUUKVQOrlfV+P21Hci7l/9epLnEzGWuhgSxTXZzqwz3fLQHN9DpkF
+UsZBHsZqSI/lEcvpF898K+blby8RSKEt42zvJsLUzXfg8YKDfHslsKDzz4yQ
+Zo9rpty4gUvb8FBmhMBJ8zvw00styXxwp57KgFJtKVZKS3y7ykhMlQ1X9eXO
+D0rsa21roBIBFfrvEawAqbDmfMz12e9xRm+vGOdABh0f1o1h4PJvhNSAQErM
+FQEpMVQRSOFQETB1nEX2tB++hoUEiBGgFyDFKDVbIEWHDUBqbSnNhPHfDqU+
+/l9lZRVkDWHdp6vIapuYcEYxZf7mmwl8D22WUh+XxcKYgttCkFrsjPAVnKYi
+FFTnZKQYoRCiIBEwPSpljQ5eCvQBCilXiVIBnq89OmXOLEhIYRZsoXUikIRK
+nxaKFaJGKCdtzhiFIFXjqLArH7O66FTjPdyyGvSN8mA9pEFK1VIE1ksgC8Ng
+kE/3EZYg+Hz555cdUca/yMeS9ggnFaKMcPBE5gOmSkpGsLy/7GLy3r/Sjwdt
+HzwU0ZWdEhPGvdneBbxq3FZGg0QO+FZkZsKyYHh4aOjWlZe49NaKe0rD6PdW
+irvd3sloJd4He7OBp+zXIDVHQMU6ylvchXdhfx0HuZNZn+cVLs/N6wJEB4mp
+E+TPD2BcHxs2l9MY5D3wyiKY2i1nZUB0klxXic+ZVxp4Scamu/xCJzebDtWc
+AR9frtnp/xDVuVIJ051aUyEQUbi6HumyySUQ28b+ef3D10i0FMyIy9r/Yqip
+qa/I6mQzBarEZ0dus1viS+Pj1y52mseucfPibSCq0qoZVJ48sT/RISUzY5PN
+boKAivQU4IQBn78UU0oo7P/6kE8r060WdxDmEt/sFa9BSqp16FfSygVRONzQ
+iemxXRAFR4QEEPkNDQZkLoMvhC2+GprkPaNU6xi3IM/d76i6+hKueNhCHnz5
+l4QONIGgpLqvG4VwSECoAqTu+xo67nc0pKeXjLBGv5guF4oh7nyHay28lnCN
+G6T0gA0vu9EME6gVckBteBjRCU4xt7CWCtuR8dRbCFgrJM9hhBeuByh+Amdj
+/LLx6Wx+UkgFkFUapMJpgofavIweDZeSy9qQ+eYDU8AoJcy81n2CntrN+bux
+UPnl+CMsFaMAEFknb9S+y4EMIVWCe+wWFyzJBK6l/bhYdW6mlNdltiS/hQt5
+pmGn1OrTpv0Q1QvvfwBTyFiS8QRRQBaC4locj/HMacI4tAxB6nJc5owXL4au
+5hV1VscTHxZ+m83B1VCvWJx9nON9nLbRhjgwEAmv+hEhVfHkicp8nMegKjcj
+RpntGBaYgCh3SMdlr8pfjWX8dULqO6BCIYVi3gw2GIO9NFCmZk4NGaX4G1TX
+VLDhg+tQpQpSEw/sONAedb/h9khDA+vraKAoVSDlK7WRIj2Bkuvdg1QDYyUL
+gMIq1n0mwpegp4yozQE7/isGFFT8et9BaBMGG+SKcfOdfFi4QLpCQQK30XFM
+gZetYUiFSLMXdlQwF45ATEcziAB1FdvzNamwCx0HjXprqJ0HPQgp7/CVWuVE
+sgEeioRUtirP/YSaUmsM3ntVJbWLK1c4eAwpQmtXYlBAYW5fRms0bFtuKBr9
+RGzzCA13vxx/COsDe3AlWand9MLjhO+9dz/8FZdk+uLhfr6JJzcQoGB9Pk8s
+O+GFh8tnsxeIm/5OPVad/UGbxquWow5iu0f3OwUp1m5r18bHBxT29yOc3yjI
+vPybWVk3/3y1DxxCb2cppLh2em+aza/gbzcx4VNd7fBxDkQn6Fz6qNqeBmLK
+LIhCkHpSCh5e/FXMoBGqQZKaLTZnDGNM5eJlp1aKiSWRlPsHa9ufeAdidWc6
+/QSazQ8fPXoIGt7+xC7kFAsnTBoBpRxrjsMBtsqOKAXms3g8w8O3FjRnB2pz
+VOUMUwlEl6/GItyHFioB1dRtBKVbLzvAJLy89ZdGoIlE1V8wLr7OSt5AKYwB
+/SKLMI8GzP2SywaRZ86kwxEdA2Tucwqk5viJ9S94A78yLpE23yhDUZ6JjAfL
+0EY4/Wc8wqnUcSiWrwJj1GuKrWvEVGUe4ieJT9AVIYmP1JSwnPhKjZcKV5BK
+vzbc1tUXg83rnL5oQKqlJT198BId2WmtDzXtV49KIXh0FMMYgeJzjPwJqfd+
+dSIUq3x9jlIqhBWkaHs+j6DCObXZkv1UrJJLRbDSfwNM/dNrri1L12IGQwph
+8wbW53hNVQ12Q9cXNlW1teEG+bXMzKyDL/7nla4+0FKgEExsv5CHyGgyMcVj
+T8+CeJVGxhxLDI+qsbr+TIWpUmjwlGuPJMBq0FVYtTPZneyeSvNrguGrGh5r
+r4WLsoo/rLszA2Ip743+6eHDZ/JLpjHLmVH/Vzhq0hyd1WkkQk2S9lKjDQbe
+WBg0DlLOYjT4Kk4K1IEIEuQj1OkeUd23EZleijETEh9Mgl52JJCSijII8UAW
+waA4CL41Dg4PDn6bDD+8kpIz4DJ50OWdOYQVOrtwv72nwmV4gjNGN5r3nipr
+H76VimTXW/ynhzw6/9VXqY3DLNThjb5CLIO1pEdU4d9mFUXOwE/29vy0JpEr
+oSvLZM+YypZdcpadmS8xBq7f1s6u3tZxKLm5w1NS383lmPFe4ZkhwPtyrphW
+y3l2GKxu+f8+PFDfmhMfrzyFXSjqhBceKmAxP+dV9oW0FBa1ylYaC++EhOVN
+l5GxfbVq/VpZCWXWo6kiOr4NsHQMjD8UE5TS34+F/4KCGf1tbZn7+7vAbUzY
+wCGgBLSQJpooZ+GM/U87tFGQIOBDfL/h1YJPPuEkBq9IHjjLQ1ClVZeSYQKF
+BL0UDViCYfXqpNPoGqLUT8j1JEqVQiLDs8j89vzp+bMn5Kbo08jZDPXmwsrz
+5lFjBs5V3e6u7bjPwJRAvlIFp/sMOtL08QOQUwbsUzHTEUq3/tJh7LilanPe
+vzKKrpiYknIKmDIYOtqBqYb0b+nncib7r2IBzFsMECTIUgu5A2/eqLrWXHZz
+qP1W6vhX4+q/909/evhoXItRWFsgorylSvd7rdvjZoz3SoWkJSu1VSvZl/GW
+PQbUUoAVjo2AmqrKi1nPaxfWTii1cRi6taGWG3Bf9tZgXoxoXl0HBkFsO1FN
+oeX7AObnv/p/z9S35B0KjKTzudkFKyuRDE/wqFssl81YTi8UilIO1rnyrhrs
+9N+4olq1leJzZX4nLMKGyEUQlLr4wPs1t6kJEg5WB1ltBXCX7vMvf/WqtNRm
+UbQ44ZRmn5hA3gGkzOUCrHL0e6Q3ySKkiQTBDDgFguNkMWWurrbbWKub1EzG
+CRW4kxKjq+0Xf6V5gTgvGPNAdx8fC+eDz/40+TxjsY79QPAGEAqj3uKvBQXC
+A6zEeBhBAkB/0CEFlK+QCDKKAUjUW4UrA8IUMAR2k5AyRNGpGmkP+6MGiWdE
+oK8ClEIX2r6OQUkz8JtKpu0YlE9UGNALX+eRWPfUto2237o1jkHCI/Vf++zJ
+w0c1KM6HM73n6AIDbz9FRK3cu1KHlIwCyY3ynQhdz7mXUYqVlKhbLiVLNZWX
+6x8wcYSBqquvKzq6KqMFQpBif0/sExNTlZgevK/lPSJqy4f/tuVEem1LnruL
+FqW2U2TpQkYKRz3hp7lQJCnKAZ2kAvzMlsNi+M0LqlXLKcDbLIBCaS7WLaDP
+F7u4x8SkNMVlZmVGYOHxYEHmUEtrDoxXbUgzjFCKKTLbX4FOwAfYK0aFjMzH
+VuybV+Xc3yOi7HQzAqIC8RqIUpWWCZWUEqCDSXB2UjKXqewn8HJ397H6WBSi
+njxhCnn+p+fP8doM4KJkM9MXBkEMm6F2nvqrjM5AiwbkAFAJClLIcglKgndf
+mHNVeIvAE4M8FuVkzG95eNzibM/I2Z7irxSkhO7E+UejbwcPq4FLSMd8pnmE
+9RS28LgCQ5Wvslr0zvbDLG74RhsJVOZpiVDPAalnj4oBqfAhta8AjtNb5zYV
+pMBvSp+nxakINW0WSJURUEATDIWJKa404FpKjmcAZl6unpiFWmHYVNnX5+h0
+OE1gLlZd/ai3WG3p0lwYee8DXGr5MDS2ubY1xskF+8YmsucIUhjxMde5IjR5
+iRpF4EQX9AUIUzStLlz9pnnvJ6u8IDzfrEcpsOcbIiPxZvO2xe4xuSlxTdjI
+LpiRuaSgneU5vtcgAaqRu+zyoKpB3IIdJ86/VleksWi2E1LfTNBeQwml7HDJ
+YtpztpTaLXbzw4cW8Ny2YDXoE28yJy0+aeIEhahgd4sPY5QztQxPiKXngqnn
+WI54AvyaLWgRSFzRB51jP+xXGT0MIo1K8NUqcgUp8EuCI9GgK0wZbncbUU0N
+G269JI6wZQXyoUExokYmO8CK238kt/CgOmugSUIzzl2hHL7G9YaDoDwzadQy
+RwRzSFKooqpocfhIJT2gidXfM4lSzHzEnp+Mi731sYx6T/71SVBppkDeGn0A
+QJXtkkdkeK2t/ZDku+JWBe/T4zU9lBzVPotfvbJVpz3Czu5cQGomDWBhf441
+B/i3XBwZ6PN3D+QZGVoiuHC+BzaKp0NFmQKBJiopzPzUlYatQcfnv+lBbUJq
+3w7XjeAo0fJt+FhGfHjBla1IQOoQPKrHCgrgKJi1pGDoz6N9vVb0V9hGtxMp
+eGx2kkb41pqR/TD0QzmFn9X852miazGbVW1O7zVAil+NcAZICXgYkgRSFvKe
+wU6CKydtTiySYqZLs4U78H96/vnnT55/Lpjiw/8EMKjOpKgw2UOvF43tTxDm
+g0x1RIKiLCVceSgqYRJSL32N1+9d55GrBgz9ENcQpBogvFP/qqKwhJcyGOUX
+YqFOo4RmsNY36ISefJNKl3ZEqcwlkv3EDmp4qCM1FadrvlKAko6XUaryKopz
+pYDSEeUnL+q1ZoEguIqQiYzmXqZELckElHq5lt5GTPUV+cu5JicnjCwWY8bq
+El8NctCE1ZJxGujskSt9UHXCa+4DCPQu9uCQjL8PTYVF0xm4FpdDd/LZKuf3
+5ntBULf1GH7SBj1oedD8N7fgAKR+vu/Iwo2zVZTaJA/Gxp9sAmvv4nOIqa+q
+rSCrIPPgjMzDX/SN12Bq7ACjzRRmllUqqDUpEhARJ+qqVyzYwVZVP0vTYhR3
+yk1r6auJQttilmbNou0NM+HRPt+dQ2RR5Mlbd4tF3WRHcJMo9QxRCpD6wx/+
+8DnD1bNn4jCE2YMz9viE4swgorhWjKdD7/aMOs9JXLCSkqAlfDqmx7cZpgbp
+EgRS6qUvUqHRV2TFLLdU2lP9njCfYOMTEho6hhvAL94ouYFtUe5eLbmceVnM
+7yhGyRy6istaX4E3YER98gcFqWeA1C3MZdq99RrJW6Eqwk+PV8SjegevwsWt
+hbZl2bJqlUwwJe9iqEomDdXW0IKiFtZvsHkThhk/fAApLKA4HL2PsRwzd89u
+ufaI+R4vk2GlAarOPKtPpEDKtH1tIA/R7tw6//iqVdO++/xcLtG+tfoHuXhi
+KDNvo5AIG2BNvYnE1IZIQioSp678gwrj+tsyD5K8y/zJn/u6YBIVjCgFLZwE
+KrMFnKPFwp8USFVMIOOlUYJC+Z1dgMflVqwAB9KxDoIXczDrLYtWSInpD7gC
+iwhd6PsqghdOYpxZTLHhYzxE4kNsAqSe/JZxSsqUJxM2/jfwxFVdTXRGqi+T
+nsHDV891viJA8J2EETu9BI1IZyxChY6JX8Ig/o37oKQoQFDFuxTw8u8nqKxH
+OsHIiopPekM6/NCbm8Ohxc8cysS07zLXqryXRICNAhX15VcsoRhL/4AfxNTD
+R42IUe17xYnFL0KWPyU+iQKGdZXyadE7PZAJdJgipLK5XxXCjSuhEZLBO6ff
+GBRM5eWu3rHcFVUQh6tHXJ0OFXU6aoofj1+XxW+an+POMX3LQPr31LdU5VgD
+IyXxbec3A7Tm8lXqlPFrUHjrrR9lp33aDkQpTXW+QZIeuE7WVIiQPuuDUlLG
+smbMyJqVWdB/pQmHOibARFVoKc1uSyOLbhduADI7YAn/mBoEs1n/CjucD/HA
+djRQyilGsgohkyroh88qnDvtzkiFOMtA1ym2gM7Bwjo4OftQwAD1+rPnzz5/
+8ltEqSefP1eYev7MbMPvXRFMTUKGUePH+ea+kORqvqcSHet0DVH3JX5xXdRD
+iASlSf/LfcNtXHkU6krYUMU3JBhENoUCHVRVFH8VdH7Ng+E3djXXN3vfRN6b
+lZl1ecblzHe4MwXGHOdGxtHpwUMZZIcgCnnvYXEj896QiNFln9ibuU1UL96y
+YRUhrZ5fuIiHaSukbRhnI9Ol8/6tZL0yVaDzBgkw1VZ1tSknKIj6XNcAbH9b
+0f6NP8YVyx62e9M5jcHQ+JfvTr8TFgZEIUgFqpN8JrCdWNJdvuP1ad5P8fyM
+zw920f9fP1kdtHP90rWzVZRaJGGKN2Tk5ofLRveYxJSxgsysrMsFcPTr6wWk
+nmIds0KLUXqRzsqJQcn8kCFK1Vlm9RWMTYKP7RbxlOYqXkXaVyjwg8u1kpyX
+jYOdPcFO4SeSHRCFEsnZ3eKsaCk2fM+ePyekfiuZT8PUE/72ELpU4myMQMpX
+zXpJT2LAZzBqpZQC1eTqlTSC+BLcX7+N+R1ney9fUuyp2j3GNtX2sd0zCIcg
+UUqSKv6F2sHwdJ4qSt/b7p3ZDpFnZhYzH1QHQ1cxziN/9lASnqJ6nz2sqWkc
+Dh9CZZTpPfUASFR++sl7EVJihavYFSELxjLe24U8x8QXsksjPHmhL/1SegNG
+xi1SVOUlFuLeee6DB7l9jx+3DGANo5tHH8PorAhvxfemh02n3q0qJ9eqHzgG
+opyX0mTjbyPST+XHD3/m79y5dLFWSmlUJ84hRSJIbd68eO3GQ4nnxlBKZV3O
+6u/H+WlAamIy7WEeTNLSbpJCmaU6glV1hfALyHZ2/hOqD0zEhvR8vKZA3Yud
+TCXUBBNkDmyuUKTjH8IkyIm++LgKI68lrgWSHoXcGLzUM9RSnzPvAVyCKUKq
+nFeHMjKMikUy+moDYpTjxIFvgp7KtIGMIhE6jESMoaG2uxanMuAmxW6PtbkG
+qQS9SEe2k96Pb42MWL4dCViSKEPoQImOZdD2WUOE1CxZVJiE1EP2pIIp/HyI
+k1tXh8KH2cjNiZgE1F4pn3Q5pzbfI8wgWgenjioKMSod+hVWUX67dklFJURC
+slRUXEHFRAZXZLBiAsITZs71AwO34S+MtIf7odiZ2QJlC7xR7vTUt13N8beU
+Boq0BWMRRKn1MUHCjv8Cz4/tLrVquWiFN2tRaoNKfrjbhnmfy9qlh/LG+gsK
+2gp+t7+pv6u3y2EFLUUyylyaZjbrMiiJSfJKpHd8F9ghoMxSSUl44jK+bQKo
+Ypwqf/iIcgUemHEqt7maFJDAUDnLO/IxuSzaUAuHwPIc5dTnRNSTz/ARv3Ow
+58flBUyKZQ2GAUVBihoESYGKjtKrI4FWBxDVIUIqkAK7dw+/HBxEgYS6KsrA
+u7T3pYo/rf5tJcLzUN0fmQXkv8Ha+sEOMgnNJfVt7VhqH6bb+RLv9jnURaW2
+guQsfoYe1P5EC1LFGano97yHvDVCfM5kkNKEwSvlABFfs7LioI8m1dnhIUBU
+czqDUxkuAKqeTxA1CN25QtWNFsIK1hWQSnX31NfSBh2eTGE89fguMLUFOW+k
+ewAnMazWeCrP+eA4kDsI8vmqivpRESUKY5z6EERp7PkGGfNRKIwXrB0v3JkI
+SGUVFFxeF5fX1VXU2RlvUeSA7HtaFEsgAUrLghq7gDbPRHWwQArRh/GJD5Zk
+Juw0bCUzOiEuLAhNzG9wTHBG/kPiMxFYwo8G0tlHfrfPkPlYoaOmeoKC6gma
+qq/+VFzzAMoRXFWXely1+6pP89We+75ao6eKdOS4BP4YJI7wqn734Mv7g8PD
+LZjiDA7e1yClCAdfjYTwUOZUivpEDqy9PTgIo33cOe6pv9Z+qp2OBpnvCFCG
+hjpaMGmDt5amw0AZVVwcndoB+R2S3hxyTiL1lJEgExxzHgOWglQ4IYXNGmo5
+s7NDgKgzlxikdpWFCC0VIhQ6El96+n9omAKq6rt7EIogvoXhFBzmdvNyKGqp
+MNphTkeUqq/qa4Q6FitXXDams28gtdyaFdCPG6R+yuOOy5cuhbYFz+zNG5QA
+jzJ0LPJtoBvewvVJSf0Fly8XXB4by8056eDQmFYsWt5DBjRJgFK1uB31crnQ
+n8x30EBLeKKXtIkrduoFFsCcpFRU1/B0Az6iiNhHRoDMf8yAKlUCURbnQLNE
+KeYQARULFHZS5KYf1ZxuzIDNAYQHeiGlVAeUcwogjJMTGN9JSN1n25ZA4hKQ
+GqnveNk+VIWbdvDlxBTPKCR7qhT6GgGBdo8FOiuzVLKfNDFrZpQCpEoQp4Qe
+mNPu3U5IDbfiSgJulVYIpBJqwJalNnZ0DJcNE0xzvLXNF3R96tqQFrC8RYwH
+xZ0fP88HN9hxFImIUpxUSAhrdGCKeMKr37OkIqIazozQ+guIgtHJyEgPfXpn
+0lk1DPsN08N6enoeN+bk+IOW+ZQX+Thpow7BNeD/ygmZn0regzv15m1KJiyD
+Y7yOpAovEpOZBUu3Bq0ZK5jxm6zL/f+cyFFltY+zvjwswgKCy6K3d/JAmgdI
+gfg3Ew7EFBbXnVW0Yh4DgGSUg32/h+VEINQrFjZ3MMdjmOIU2RRolrwX6Fxq
+0SGlYeq59tf/IcreytPjUNvV4kVqcUGTMUFVVQYVZO7Lk0DjFhRCTHwdg8KD
+08IBLz0toCdbB+pHautv14p2D7DsSEjQxTCMfcCTgpRvNIkEusKmJ8tF9vrm
+MoUlmhtwgAKPDrDnNcUQdz2peFZTHD3e2nFruAO26DLhe0ctpg+pGEUGivZk
+3pOQ8mNlDgkfSylB1CUVnBSkJFSxPGeoSr+Exo8V1chMOMrNxDo0vXNGLob1
+AFO8ya6gBY4zGld7EKQCS+GC9++8lg1EOS0HpH7+1o8OKEJqn9fSjWvXqpMM
+CFOMUhtYRWFajeZvwcatQWfHCn6zP+vcGI7HogfDQpXa9SwVKJVa9M5OQxU4
+AglbTHtyjgMqFlO5Ta6cqViFX8OcNkHdE0acUM6BgiCinCwURwmwpPpCePYJ
+tJioe5Xy/BmkLc+eg/B5yLYcFXBFTU3q+G3Ys9SOKEgxO6la2kNRCprsQHIe
+RyqIUEx5CDPIBvXd9fX1LS032oaH+/th94rQ1YZaZGCgtqEForsEpQJlWGKc
+8hCuVKIfdcM3CCnUxyIOhnwTSOFuekQZJCyNjVdAoNNbBgfgU1tbkFfR9+Ng
+XwRQRURlaksOSmYHFQOITaqoSCRAKQPGvIyX286UHMBSqkQpgCkEiVAfyoCi
+IqSkSofmfM+y6dOX3clXkBqB+Q+v0RJQiFQ9u3HYOMdhxagUVdSnrKYgvXVx
+dg2AevMnbxCnLlz4hXr+842GVTDBU5BaJGlvgwz5Niu1CxxjdqakXEbDV3A0
+JfGkw+aM77asU009Mu2zkYDiO+Vswsol85m3WzRMsSRXQxneY5RPEEoIU73V
+FQhq4rnoTL5TynOWXoHOaHUDEecspYJg4IlyKQhF2OpBj1dTgUbvOqqIWm7D
+NAwSS76q78NWp3yk8hbhBHAgNiXQOgpfDJOZge4B9OAYhmN9qqnp6NGjM3gm
+9qYsHrTUYtm7o1H1fAnkqgxRWswTcoJzmYZru5qbBxEjMPMDj96e6c3FT9Tp
+or5DJoVaajwqw6N1EIuAZcMIO0iN8Nc4qJkl6mNhFlfhNClbqV105MoVtAch
+2ZfOHCg5k6wwpAWqXRqm8IkQCF2Y+ZB97yzbM3Nkz8x8wElZfAFSM7l7AaDt
+7tnd3QoPCytEZ4j5BNV2CgIWLw4IeOOJyy/kB8D1d4cxb00TX8W1H3+8SWhO
+xqfNIuxUFi4LFpBEAKQKCtxScq3utmoU1xNqKf21EkrB6ryaIttFGKDC1HaT
+him7HPd0lv1QqdTNNnxlBR1eIF+wWGzCd1KoQjKK9bqz0AnInCjd4PZJPKWl
+1eAt9Z0EVGXG9agGlA4lWLWrvd6gEpNR5Txp93VAARId6PM6KCFnwkNua4OX
+9OXLR2ftXxcXF3f03Dk3t6O/iTu6HzZRh2+OYvLbMgBQJXQwizKRGqI8dEhp
+o77B5OTaEgg9b8BuGHFqGAujyuocMQiQah9uxI2RwcHWhkG4F5TJbp/yTtfd
+zZH7hhG2wss40isLVwoXmfdFqBAFQxbwB1OYeh1S16hDR0FFcqxk5jLIomaG
+5pfEjgBTF0ckSM3kgysa798bSK2DByWXcqXbA4uwiIsMby6wey1g/W239zNF
+IezYMW82nBA+3rRBnDpJcKrlK74smoLUuZQgfycTN4mJoydm+xSfqb8viCrn
+G8zd7DIthpBCanI7AaWClrOq0m3Qo+iYomuU2C2C3bQw/0mpDmUxIWWRiSGw
+BLOOZ2RJHz7CjdkaGBrf5lWO3SXJDSca6EMkrd4UsBSkqGpJgNkGqqiEDlZd
+tbU30H+1z4qLm3X0KPDEl3NucWvw+ug67gyP4gU3u8D0DKqoRESR8pR+D+ND
+bN8QU7X16ckYznCSfKONoQeQkpyGX30vDpzRkB+OCkAU71yLJewp2PFrxgiY
+B5IjF6K8jAWUts+HILVrV3bIpfz8A2SkknU07dLynyDsEqmpS1Kol+Qvmzmy
+bBkO2yFMYekY8oM7THh0qefJ4NtVV+qsJHrw15v8AYkprjPgwOP3htRbf/eD
+t/7PZQaYtyAefSykOVs+sgiS+DbImtfOmBRKEUCdB/m7Y+4LhaXIObWcpyNK
+x5RdQlQwi27GI+dIYoqIMqmcR7mwSXgHzJohy8T9x0dUDls4MUbCs/gQUazZ
+kAItaBUVOZ8GpUwFVxrQKUqVgskDElR92J0wyMERdxoUhowGLT8Z9Tmx2jHG
+G1TV9fU4FFU13A7crFtHNOF1nFucmzy/+52bW1wcw1ZcXFMT73a1tKidYwqm
+PNSvSKwOGgip8MFa/r7Q5dXeaGu5URYBTR7xpFZDkUDvDwNTbTdwk5ERiqaw
+pw6u0K7u0ZYlImJYeR6w82OgCqeGqgytXkgITRNPpKcrgfAknhC9QpTABZj6
+fTpLqYYDYcumh86cORKbHwtITWchNVNIBFTmIBBGGjquwFOCdnEuJhWlaEMO
+HcIPuRn6Fp+/b1I9jUFKDIXFY0PaPco6AS1hPTcsmr14fdC5fp55qvrnGEDK
+VlrdWS32GSrxaTSU+bVgJWGqnJFHuj3sSqu6XIgqCVzAFjx9ZJXTzkWXRw8r
+Jux0cjGZNNbc3cKRMnAVLIsvE0ySRFNaDU44wiE0+jGKodr6njszL+afaR7h
+2p4S3KmKShHdginFMnHDhe1dCxc0Z42O/mYdwxIh9ZM1bmvWrVmzxo3ZD8+a
+NWfXpKSca8J9tSHcyMJWBNXCUZQPSwdgoMwBlfzwy6EGnpfhoRno0luQ3dpZ
+n0vN3R4eTnlU+HBZchvOpgNMf6XNMCBFF3RetGLrJ8Iob9ZO4KJC/ELKaPWS
+XZYckp184OKBE+lQmqtSXEeUBilFd+KfkvAsQVc3E+6JofkHDuRfZJgSRMGp
+jNawKDKrrtZBmY9mR0jOj7d/LItQC5Z67fiROITv6BhWrUIl5bVwKc8QSW0u
+VZSaHCtEbdgMSKWAPc+cVdWV54/z1Fh34dBlMi7pb7QQVSFhqg6IsoujVOQU
+poRF365Yhe1Q5dnFqpPoSwOmCEJU+c6CKE74OFHmljvwBAEjgFWBCU5FDQGV
+Gn39NgxzR+7MnH6x5ABa+UF6ckp08lCdn9GoFetkEXxBazbUjoAzQHM3NCpx
+aB3QQxCd+x9u59zOKkjhw4/WnAOo1qSsOXsu7vC6pqoWQIY48qB+WKvQ8Oui
+cxxuZ9hD5ziCbxvCESuq9lMrJs1aQVUBUWUd4eGn/oofjFG8bITE94468jhH
+CaNIQvmFh5SxKA/n6hWQk15yEWnvklJxKkiFKBIhJGSXBqpdAqkzZ0aWhU3f
+ExZLx/kDsTykhpRHpdT0sC1YGI2tZZSyYjMGwxgu8X28SWQBi9YSUj8cUz8X
+EGkPl7V2iDOsdpZB22dgGaWi1AYOjre5AlJNkApfrurPi5nAtipIBBM9fv6m
+iFJoev2RklwgJWddIjVSCimd76KUMtHg51V5+asJ7L/U0Caj3Ka2HiwCKdh5
+4iVgAsvIhBTYUWzs4fB1NIRO3bthiTkzDB6UsbWxZJpkgEIRikHjpRT7bbzP
+d4SFwkr7UHvm6OG4o+vOrltD5BBJa86N4V0ALAlgAqYAr6SkJGDK7dzRuFnE
+lIf8cjLry1CoIr8lMhdAGR6zkHrinRuo+bENqtbX6dTpLfo5yXpalEI1xat8
+76jTDNod7AiJULsES+AJOCkGok40n0kO0TdjdEgpMkEwhUIKLd+ZMyXTAall
+ODody4ce59MJqfdwoC+MopaSwaG7ddZ4cFKBUkgRUSho1m6EDdCq76naJHNw
+YTLDXRAXIBhLzT/udRw+eFu9sKwlgFqIpUCZGYvFhsKUClF8Nm9zggYvDvV5
+WxVIBACiNHICKiUMfkvTZFMhzaxilNmu57xgAVewXYioSC74qDDFIbDJNpkB
+g3lBvRwh6OmrpxVYqXpUI6tUZo73BFITAeUBAfOgg+UNtQDPiXJavtYVwxrf
+Q2LUCP6H4eLFSEkt0hpzHgkkgxLeeRhk5MeUx8LnNsYUtR2n2tvjmtatczt3
+9jCAdC4piTjCO2tUlHJToSopac3Zs8cBrzWo25uG2lqQ/JhQjaypiClilHNC
+OOR5dPhGdUchWHlwvAN64lo7NxBk+0528OCHhzvbf2WIQml+U52kXaFdTRMB
+Zwhp8mwpoOjxuuuvIWdQaANR6bs0CKm3kvS0KMV+D1MZQKoZxfnF6WEnYhmS
+MNELRXhC4nuX9nczf41QVdLQcbWyMthUisRHlbBEC5ytJqbQ811463sxUt/J
+dKvhm79qOaWgCkdHFqrnGEXs2zTKQGipzWTPsc4gkSrSxRWrfP1Z1woGslLy
+4lGcl263TdhEwiR40gd7di1zldt1sQsnNazNFREvgUqSID9l2o4eBNwBJnxP
+J2DkAyt+nDEqVnFOtXnBCE0BR6iuxnoREIVVdXreQcUCR4PuntqRsJESnCeo
+HcE3U9MdICIZfLX6HJ2eEo5DNtxwG2clWq61j+4H/6QqJgSnJKY5AClJyiep
+pfg6ye0jfP7stLOMXIKpge5aJZpi/qPEU7RYpDz5W+J0kYFNQcewYAq6FyBp
+7ylui4rjhqrMWZwflGcW74cqE1jYBbHf84PODohRuMlObsbRlxLOXJL1bLeL
+n+fX6IGKDMKlS1hTTY8F+RS2DD5AJw5s+XXsgS04w4nEh8I8FAK86TjLSUg1
+gugsDSSoWEkBUR9jiX32Qq8dq97gArugaceqALoq0v71GF1atnnR/GcerFa8
+ZuvPok26uEUyH39u+JiM52LXmMLC0UxUCllNeQ6f0k+ffRo5BSmNR/hOvivX
+ghb5TUGUbbPcA6CwU71lhe7MKBXMQomIGv+Sz1e9NTQ2kF/dQkRRXAZT0YD1
+sOF4irOgldjdHYehQTeM/UGYozyi3uk+GzxJdvflO61NjKWaRimFiqd7pBb7
+0uCgwEABOYxMjEZJgFSSyn/ElBujFl+5MVCpTyH3tVcNDID1YmLF4VHUVL5q
+gdlAoTtYegPX/jqEfMecBzzVNeyJhp+iOwb4y1OTkLo5ehA/cMhWKioVpcBB
+rQSvKYBBhArZK4DKL0knTQDwhOuI0mOUZD0NU4DUmVCZ5h2IvXgAF80Bq9BQ
+nF6fCfcyHjb+JcbGoSimGisxjYGe5VNi6nVIfe9qSkonNHQ8zLCQZsLieU5R
+qUQmLNloJp3kENbqC+z6XEYqqs2LTQGeq0f7ucGe2ZTogBweYWo7vud6k6fJ
+he228kk02TVCHbUUsQQno0jBkWk7mU9ICrcLkWBSWwjwXqEH4L0vYYWL+4SV
+Faya7DSz4/YHjB/xKmB5QAC+jiEqw3A64fruPe/XYgqzezckAS8p0oRyjmBK
+mNwFlfUFg+zwdTR09wwMDs8C/xTnJmA6d+53bizFEY0+SlqDt1NxSlVYkgRV
+oFp39PAoiM9aVe0bgSm16uCbKlHKw6DRn9xOltqqtr6kIfyvp+iFhz4OfrGn
+pDQ/eFOKczjHCqTeVob6MFKUvJdNjXnIt99eK7l45yIm0iDHQ3ahxOJ2u5/e
+6oXs0qd8TH3prKTIIIA4wCna2F99uOXMltB8Qmo6DonO5OE0VlQMUxC2SJhC
+ywdOG3kv8NONC3BdYce+vxUK/7dWwqjCj+3wOsat5Hkw5gSevLbNllS3YC2W
+Sr1ma76vYi61TbxfJyFFVMEawSlgeSH2jAtOHcwcS4ynPVEpxHPg0O2v8VJK
+H1WuRjLySghzSXKbBU/bpfcDf7ldISvS5GzDMiny3tcPGsd5ERn31rq5gl1c
+7CgvN5ttsuUAOM1bD0h5BiDrnR7nlSHchGnYPbc2GUonVMUJCkayt6BqJ/n+
+kjBXWid+k7sH2oYzASe3o24SpRRuPkKKO/sRYhUClnwixS1F8Qlo+FLwRWcF
+UpcRp662DHhoDGqUFFMs3DhallKdSr9UoAtbWYMGrPrV99SGM/GJxg58OdE0
+qn4AT/sFVDD6JKS4pSUrCyHZ3yL6pANQF2+EhCSD68wGmpT9hlTtIa+FKHl+
+z1LqQBiPuW5BcY6rfB+euRh64CIIBHQt8FcLfffX7yH9oSu5eroSPl0spiBD
+oApOnDaWMkyt2vd9MAVPzvnHjx/Xo9MRvABTxxijtnH/jwHrmIpYkLUonw0G
+Kk2QIO+4mJwCcuFfCwLlYH9/IhyvPv20+vnDaolSFTrJqQKTiZI7AslkOo8f
+dqENGKBYoLPXw41mqaNIjEeaLAxR5RKjsMh47zbPRsqdv/FiHBcym1GaS5Q6
+4qog9XVlRjSN1RNu3fLYPTJY0tPTgKt5yHiaSJwDXg6LDQnqwodKf/gegzBv
+6x866qY9KLtBlePtR0x6eHVuDC3f2TUaqtwm6/QU6QPXuB1tGh1F7vOQ6TGC
+lEGCn3otTSYeeKYjfkYb8duxoqqvH7wp8+AVQhxgxgMUjcItffTgYSBKqql3
+lGHwSnHJZ620Kx1+/fnN10K+3buLmc4vXPniIUxJ3vPTQpRGTQmHcIB64Jlw
+7DyAi9lbzqBRDOV1V4YpqM5/LWEKmEptrCSkGKUAKXgcriXXuZTre/uY/b5H
+nFq9av5xXo2ROx8Sq+aphCeQQlKZrSBFPG0W07JFmxdpQYrvYhSEo8JNVdeQ
+9Fdk9edBFvjpZyzQbWomY57kO8GV2/lZlE+ITdsj7ZEyyGMdFamxCJM/titg
+lduAqac49fJlN/q3eo5KIAXHXbbe3uryCUBqgneTBE4BAch6cCVvjDbgwtCt
++909DT31DfcTJO1oKnG1cs4tddX7qfU9bLMDUUOzZsUpoLilgOLEOymMVKil
+PnJbk3SOLR5+AlYp58YEUmfXnEs5lyLhLE5hqhtmi0ZuNUR5GDTVqFrkwuei
+ozOiG4EoQzQCFYuqhm5I87yxtteOCLUfY8P9+0cFU/v3E1Kop1Tfp/xdw7O/
+/TY8GczBxfzmdNZVSIV7w7M5noE9kEQplfpeY6YAKEIqFpOX0Jno9U4AUh+c
+IKTY8C0LiwUltQXLDHDYH7ld25rKairQWYMUr8K6LCYCgCk80/5BI0VhEAgq
+FOYBXgEBMORAe3eMLyjMF/JEA2v1I4IoOgrjh0p6ikMgvhbbXD1P5mCN71qZ
+34oZY3kwUfsMjegrLLWKS/ATrd+zMU5JXMJrYui87byiOCPlsYnbqIn/JFJ/
+ZbJJJVXJc7b1oKEbzmCoElV7HQUVPIktKM/JIXCTloBCHZUBK5To1Gj0cn8Z
+nIvivGN4kJubYm8njpxGX22XmE2fZn7nC1vhtuF2VlFSl6u0hxC1JokRCpjC
+T6nFASh8EiSVSospqLwEd8yXTYevtBBTaPcSNN2UWh2V0OhhYPTk3T/sOvtK
+mY7Rz7UyWCZ4v3PzMEPTOsAK9fn+UUl7wNTbUqK3r1D2rpSY52MMgJI8+1vV
+3gFNmlcQEuBreNL4KfBS6Zgsx6KUCp2+5eIWnqMNBaRiQy/egdCFi8ZA1b98
+gHAVW3/7cXRlJWcZIDs3kUNfBAcg7JPO88IiqJhU/+TCL/7xObHYccqzikc/
+tu5ksc5fCBEPx2W8NKfOxQt4qGazNjEma46EuxjLYf5FfbBugXfLnP1jRVbn
+Tz/79LfnP5mwiVTKook7BVZIbWay4oxSkbbzNrNozU0ukYrvNDHxRS6WMCWM
+AlTo6PZOP76H4zP1tTdunGlIpzIuCndIezsfPbSjwYOTBF4CyB5g8RNLvNBH
+GlOxzdKxu6cW3zmDVMdEkMGDBmO+muMBAUZeClryQbq4DM2Kc5OyPMkt5Sjy
+WUoSH1ZTeMU6yi1F++xHSWMsrPiP1x3GzAaxy21s3bpzcUh9UI5ihxR1f5SU
+aQmq1QOmoxmf+BOQAlmVQP1xw0D9DVwpGuI5kFEgah2v9jFYHT54WMipg7g3
+MwcHirikDjzls8tLTgZaskPAQMAfiIo8v4gQVZyTZAiZFHZKlLoEu3NACrdj
+pr/Hk6EHkPjygaB8cJw48rpsD84yYOlqyxboPG9Hn66zyHpMJIcycpZo3oIF
+8xYu3Qk7KVKebyxKeOvnk8/U1UcCa96CtQvo1MmZseLNN21eu2nz4iMBjq6+
+qv5M+HUe3D+W52/69LPPPy/9LNLZ4jNFI/DZblYDF5bfJoEMNeesm2yqLsfQ
+kmELftaRLvKVE+Zgxh5qfKk3uSFKanwrbn9Z/CDtT4+qK+mQ/xSA8vTE1xFR
+OFOM9r0RHojIfITUoPCPvsq+IMFonAod4tGJz4I/qK8aGsL4BfwT6IFzyHtJ
+Y4mJeSdPJualFAI8ZwVbQBtyHsGEwsptbGwsKbGpqSllHWuuc2vOnVs31gQp
+MRQ0TH3SBngYtW0cfpjhYaDa0xfsOrkxcliDLfUtkE2h23txkzcg43gNC1Hq
+4KybL0ZnweT6YASPGA+3D6PLuxiLJm8X9z9BPNDIU4Tok45mkvW0QJWdrQTo
+pBHOYEwMWdT0/NAPDnwIq+oTOEeLuZ5oOomqZVxpwMGi3fcy6iotZlbnn27C
+hYTASEYpzU1x4ULsr6NK18bA//SzH2Hqx/syMpTBPgPA9K8y2kPE2uSCvGft
+7GtClKK8aAwDGSS+3wJTpTDntIieybxdfkAoJ5FHleQIQLZIc6Qu49S1d5Lx
+6EHDOp393tO6aOpTmnnhPLyMktfahtbHjyuf1jwS/UoF+U265HOpCrkFV15S
+O1KHMbCtRXHeoMS72p6dr+wFGwxTvFSCgZO97hvD7UfZ6Uk2W7euMGksLzHx
+UGJMYlFeYsoaElDMhEAUIXUc9VVSUlFRXl5eU1/fWAp7vnNniau44QHunxg0
+0tNo0GWj+AguaRke0YA7QpWx0ShxC91fbe3QKUQphKbROMS8/UTUKBCGKh3n
+kQ96Y/8d1vstWES4SBXLLiET9lKLJ/evNEihltJoK42h2pWsyRHST5RcnPk+
+psQ4RPurX504Exoai3iFh5sMIuxkWQU11e57jxvrKswUnsuKDLLFYl42W6qD
+iiWVZs75v/7pZz8CqGisuJSQWqSPYcgfbEbiswFReVeQ9+TpTzwESJ3HHh38
+DhzUPjH7bZefgUCQnTWTPBOf2NRCjBrr2Wza0JiAQv9HztOmEIUD56AH07E+
+S4Ek17Ifj9c9KH6Y9qgYV247K3mSqK4SiIrWIdVIg030VPj32GsJpBgxJDqo
+LT6FrQQGqfr64fb9R+OEGUfJvaYwBTEqJihm/fKgvKK8pLOY5a1JSlLEwZo1
+hWuCPjoelIQvWJ8Lu/p/TkxJQoySun3daFs3j9IIlyoUugYp0dFEs9ns0Oyo
+ogVwg8MNWMlqb1c11OG4uP3r9q87OHrz4Nss2Q/eRDMYzv++gbl33h8BniCS
+wpkQMYDlacgVGqSy/YS1yp4qpyjpVMxUc/MIqyZACpnvP058QEfqdzE+xmGZ
+UFpT8/X0d5ctu3OvO7ouzRy4/fwmCoXxfVi8aIFyk4JJGcIUQUUm/a0fa78B
+jOjWpRt5jk/HFACF9YbIxSZHVxEavoIlmRERl7OaCmOcI8+f/+xzsAgOCVNq
+jUECFfMdeQSpkggf/F2wqSKKHy9Wwz0XiVLyuYnyyuLxcQ8cDm7APAvqxNob
+DS2tKKVqMPF7lAbZdi9AheNsONAWHQ0w8QVBCh0VoxQU54NauOCbQbGrE0ZK
+efeQ1gZFVIvv6n4U525ngSkQAymJiblBPMy9fnliXtFYIYEmtBRbvjVrgoKS
+TuYdwh1AnLDJzU3M+38QuUhQuZ1bNzrUgi5z0KgN+xRNz4NHAi4DKQQGLLWX
+Fc0yfRgnd4gp3OnDhXYgCoUU8AWLdFTsB1Ew4XDk3O62bpz6S8caKNq8U/Ds
+FGc8hCnJfvAYztYgpZfm2WqWjDWH9OYTlCGMTAekPvwA7udo8WLfDeUFUQz8
+tvBGbSwvYAFS98YrceWqVGnP+T3A9erZ9L7jLUbxVNyKc2jTfryNmWk7vNZv
+XCAk+lSQgjmQzdLZm5d7tbVgBvzKZmXGFcZYbOc/+wxnPWgTRkjBg5Nl1HZV
+Q0kVpTq97ej87NqM2KZnQNRTPB25HYdesHJMi5HHEIY0NJ+oPQMJdUsD1rEz
+Hhc/fVo8jrSHDd2a3vFinorJEDRF8yd0Sg1tgw2UlABTHhKiRH2gMZBcN2CE
+8lUm+PWDQ0OgzdcIpNYhvSXmxeSKWXFMDFMfynKFqBThoI6vLow5eTLG34Eo
+bPV8kFvUxUDmdvZsSlLcrNGOeq76eahVdl04KrVbND7JLBwtKZjEOvdo7ne0
+1HYAU28jMu2/iRjFgIW7KQxQyHglPbt3z7030NEAA4MSGQjSMl0VUivnTDp5
+7s3WC3T9EbuNa4QUyPOL0N9tOfDeFlz+wJWG0C0HeJVWPTCm5iGs0LA7cBqO
+dsj99U8/ppE+/OnQ4+PRIEU3PC+UVNP2/Vio+vk+yvAWz34t86HogX85nNVw
+T7AVdxkKcNWpKTfGYkKUgmUtRsQTNrqymm1CEKCa0itzvYSyKT7KZppcDRWH
+KZMpEPKYVxQzFIPjBL9ZW9tcWwJ9JBY5kOBwaaiyt7gYmErFLavU4r7iVHl8
+CSkc0aM0E5miloIScelRziq+HQbNYkUb7bHNH7w9MHxzCKNiMAEstFOSEk+e
+1CywPWOCgvLykPdknqfIA+TFIADKUw5L4MS742Ri4hjkeBBPpaQ0jba3dNer
+Ao5kglEXZqkFGqMiWmFgzI4ThRU+6LiF3Id7fe8sufnibU75yCS8oCjhWnPt
+yNw9e97fM7f1ViM8EMPCySYQVaAV4Hmu8weozRWkQrL/lj3fxQ2asGXcXMBA
+JvTMFhrqfwDR1AnEKJylBZzy87dswaWP2IsIhrjFh5NEGMecR4EOfdw2WOjj
+pMZs5aUIm+p5C9fj7PW01T/8PIM8GqTIdW6gAAFLoS7ASDwQhZqipQ2QWpKV
+1d8EowZkPlTnGKW8MsnqOqNRpAxcNOGmjijbVDmFZ7H+Dr4WZdcnZB7SHoE2
+/7Lldv1taplaW6NPN6ImL08DnoqLU6Gzw94SBjCpOOCRmpDK5FeV2lHVfQ+6
+Fiop0amLLlyGMHCkNkhppW8Zs/1rqG9pH22i+CCJYjtkvSIiSlz4Aan5eXmF
+zHYfIQqN5VHikhKUeBLjMHF8AK4cVv+YokREMqAqDnlrGGGqQYIio6MkP99J
+9TAENUbNjkFrCT3AdgwMyOroixfvCJ4w7XsBU6obd/bsucOzmXvuNd690o0w
+lS4+QTzVhyKKZx/FeFGYc7+Q1x8FKlVTpTdfJAE1ExOZ906cwEAm9kOkvwO4
+oC0BSqIV5jSx+SM4eFwDc3qkvQ1ckOGlDxgJE1K0UlRqFGDKywvpb/WPEagu
+sJhypVH/Ij3tRbrYbE7VvY7cnLtXW6veXoJ9BtwLLfQvNZ2HFz4Wz8s9IQzX
+6vPIqZpJQcqZe6CR9u0KUS7yj5DrGKpc5KvMpc+qS23lncTUlwOtHi2tjbdO
+5yA8YWgMhWcxwUQoRZM5iI6ORsWC91lIDaKcpS6YQkoPoyaKMmraExmOGKnk
+9YWACgxCy1BmE4d7iFEp4AlOFllxTxsqZ4jjrTGIUqtXr0FSSyGkxtwIqZiT
+vCVpx+X4CTuMtDxziopSUtAlnj17YRbCFKspga5Bbor6KgNGlXXpv6eEpCJW
+xrJWR2NjR8tAfdvNF+3eL4gnvHp5ahgl1J330eLPnfv+3HuND67chhtUbTgP
+8PE0LW0/V06FKa1Af53pzA7RxjLJYBHu4Granndxff3MgfdicfrjxIEPUUzF
+xv4q9kOV/n615V+2lCBMdVqdfAIh6qRzC4/kMe/N3qYJUY6pN/MWbt3JmuoH
+BqqfCo+wdSn8iiVKsYz6BJYtIBCQ9x7k3L1yNfPgQZgKZzZdzfWPN9m3o5ay
+4mCsVepzYErNWWyskLQldZumMteCF0GEIyFOeDNPGkLzw2rzZ599dt5W/dVX
+j7/qpWlAZR/q8M7gcjOdglGb1yAoIedFSx3l25jgC+Ice+BDDffQy4M6R9vX
+QGmcr1o4MMrqpkIUujKstgwmDHYPVPWPxbGSSiKViSAVHwzXdYoHYY7tn1jU
+l1IIHBWuTkEdnoeAtXo+ohSkpmBh0T7YrQhT1q5EftHZty6sG21vY1dA9zK8
+aGtYqj3wMCivICnm1GCIg0ZetuX+VhudE8gZtMOOH4L5O2HYvQOgcI/xdN3p
+2zhF3nPtFEz1IuDrgjpqL3cdVipKSr0K+e4jTR82+TAVDAvNv4jLNjj1iLTH
+bg+JDwHqg9APGKXyY2M//AB301BNPe60usdDKCzWLWsXcWSCwe5sSXsL5CeF
+KUx/rNOnQPUGnIKCFJpJMW8Bdf6JRKlIm6ujszMPUaq/aujtzCUHlxw8fCXX
+32EGenBntrPTIVc/NOiwiAJ0ttmmivHISVxJNeUkiRDfKpZR2F94Qkh9giT6
+qBfPV3zV6SjH6dqHDx087M4gpXJeqhgUGAEp1FJDg7KFB8XvfVj8DipvVqUN
+99ApI6wVc4mlA3lvuOlonNIApyQV5p60UkJYzR0fe3lATF5fF+pz5j4QnIlJ
+awoLcZUMoSnNYpvnegT/qZY0GPYW5eUWFqLpi4vjpK+ntsFD2E4pxw0qLmqH
+1qQtUG7pEq2YrXHsb7iqrZbr8SAMMHiCGBVPftgyAArXFL6qrDv9eC7cf5tx
+iVt2Z+Q2+17lNKzgJNzU38l+WJApuXMnNJ8LDGHA1JaLoR8eYLf3IWPVhyir
+SoCoDz/YwmoKhxscTi5rKT5nWQMSEhafCk2sp/64aJFUVGj9cJlBzPF+WMcH
+rlPOPG7brAcpRClPwKYyFxO+qllDWUtuZh58sa7Q3wFy02QBpAAAS7y2TLx9
+uwiAbfqjhyoltzPpVVawyRV7CRzmlGIT/bf/+w//+w/niSrern30CF9BP1wY
+wafV9BYLoNSTIMU56/PBaMz1alvQRcEQ6j7Jc93x10BEaQSVQTgFD87Z2tpH
+lQIBYvLE1TFFVpw4LQWLVsooZY3JzcvLTUw5W5iEQFRYCHQBdbxfaXFyWjrv
+yCue63J4WvNwnxpBbswNPEItrttS2iltgIeH7rZvUCZpIlZQDSjZe1+2qFeu
+XLnV0dZwox5uFyP86zAygg3OsFB1n+PeOBxeCKn3R8p4RRsB6hRdXFio781W
+xRQ0CIDULp08n0IVIQU1TGg+77pd3MKodIA/8Q77PsCLbd+HWz5And7T8+Xj
+In9CSmopAIhBapFypV70Rzn1uFbde1xITK1iTfUDEiB32FmeQy+8YdPmf90s
+tZQrIJWTk4t1tv7hgkxUUzMOryv0jIfHhsVc7XBgsusk2k7Z0XM2KbKJ6W+x
+SefQJ/dibKzO7c5CHtBUGHZez5/Dzu6z3/72s/Pi9YdsiGH0Jzw7Wl1R04sR
+cSrYKDwZBFOC4MoYLQJvLCUMyyqBb4dx0KjXMwaVfiRieRioWwKkqkZJclJk
+noK91pNFDgi+IiM/4W35YKvD8+svCnMZp1IAqWmFKYVBiTHWrl5cXeId6SPf
+THiWp3UG1zkQpiBKQIWOzNfNYup6lEaHKX8gnfnU9HgeauMPkIpujI6uu3X6
+VmOVCD7FKQaxE1EqbCR/N6vzLzuhsOYFoffv3PAGnS5Nnxx7AOlJTsovO0RX
+4Wm01FScSqYfwp2wiyMlwNQycOcnTkhBThV66BYY6EvL9+G/4RJtfsnA494i
+q3vg9k3s+bTEpyQpzH4LJFThDXw/vXhEFD76y39IUUWnjaX8pQVSEqUAKf/O
+zrrcurtX+nFEJnMFzF9HR3OXW+MD8f1wVDs6452ERrAIK+WsYWexNh+Wmkqo
+Tr1kR7oDYQ6LDfH2NMPS7nNkvvOf/fu/o1785JNPXkV+giCFnISzMPAvFyKq
+mKoRox6kUKCLvhuQAt05TEihEDcobw31jVUTmqgGYgqypYGq9rhzSn2QkrLa
+cdK9utoFJkebTfHxzsGdnblfA1OAVEphIswJE4NWJ+bl4u9RhbnUfSFE1Ueg
+g0jrrAh2FOUUpuCXOBt3lNTUYIfxepTEIqM6W8TfWcFIFVfSCcqeDsvAugeN
+bCvUNo38xLHo+hKAqufe3HvjbHxxSgGOUPW85CeQ2itjPtTkClSCp4hJIoF6
+YgiIWU1x1ziM1VQs49SvMSIGrgAp6oW3wFQRl96QDj/c8i9hoSW1A4+7rHTS
+h1R4k8uiBYvWSvWEY0QLyUt5eQmdwIuvC+U43/qdO5kA33CWDHX6wqUbtVpq
+g6Q9qMWdrKAQ6nJxo7ytPxPXGTILmpoSl7vHlwbCwBU50R1ZzKZWzGUsbNL5
+TJOzSV9TN+mfpOyAOc/E80V2WvvAeOzZ5+c/+fePAadPtmH49+qT85HnkZJg
+iC8VVI1U53yMqZzzp2IxxhfkYUsbZnwdwzAqR8Vk7DDo31EJGcQUyiqMahAV
+btd2jMbFiQABxXlQp/VIfPy2zRALBcbHB+NPl5P79OsvclNQKiV2deXlEVKr
+n1qxpFodP2/HMWg0jkxYYFJrLcorpG4P1dTNoZZudAbcE5XIJGMfKavE2UUM
+rVUlRUjJnwI+ouhaaa8wqLlnUzLPpwfFeY291FzNKDV9Zs81xXS2792rpT2B
+FHSdIRGqpNorc5lJgkoy35l86ECxw1eSP/3Xv5bzHgASZzFQIUCEDukLrn1s
+Cb04Akj1Otwl8Z2P5Bb5RsHU7KUbudOCNYR53L7Tzn3IcSJO/t4wTtG7BfMY
+HVESpaBncnJ0WnNzUAlUVbXfzCwog/E5pAjuPvGcFld3wuZeNmXMFrNeLS12
+1sOUEwKVOdKuNYJ8tgmigiVGQUtsO28nrEpLP8eAYBNtu7ed//T5c6hF09KK
+i4U9QOLTIJURbciQKh1h6PYAer3hDlxOxKJVB1adBqVSNuj3g8hEejTgNoeh
+AdOY4dE4pZFCu3eyM95141qqoRdsjPdxt1o9K/u++PpCIeuolD5gan5hXuK+
+pzjClvYwfh4XPwApnj0KrukrPIvZ8dmz6PnQHSDUEFJ6Ya6/q96wdDfqy86E
+VOUDbrJmwDnbqLgNOMjU9uweKUGU+rK4As3Cw8c4dDZ9+p1mqIsFVKTRZcFG
+C1J+okEPwceaFI9LDuFqLkOdFcTCSHpbIAqm1fl0CBCApul8kUNX74HsxFps
+y+PWonisNCBKRUIZt0AlOjnHIAgCM3lMbtLykwtYWx8hSzXtDecxW5cu0LYa
+NuhRysW9s8uaU3nl1t2r8BAoK1vxDq6v5yXG+PigEjE5eh2e7uAF4jGa2T4Z
+m6Bksam6SSkPVMlOLLHVs/Hgp8UOIyE7yibu/fGCzqeRmI4HIpt+yjoKvViN
+glS00Ad4kwqBG+b8jfgIZTeMn3Dt7Oqtq0biyUAFy6DGn0viiyKg8BIFDfjI
+wPAod6zQ7oE4LyqKj984e/Za/EE3xru7O6xPK7u++PqLK3msyhPzuhJXB+Wl
+THsQ3In/KJ95vIDhtSOA95WCO7sIKaw3rBsdHW5BMeVxXVIfWgIPvdOk5TDf
+N+qVHVEVHV1TWfmAU280q/iY5jF0dYSYBx493V9mPLDjj/0QtxTmzgy7M1KW
+DSN1pjwVpQgpIMlPQxSKdIUojU0XIoGYusjl4pETGLyEQdgyU4CFA1dYZsDO
+MS5+/PqX4Bfy6wcAKXdnWeUTXooBifBBMFq4ldtTC48RU0t59AoiYujIvbx4
+o+G/uvpx4T8xmQLPuXWh4ieIqX9lqIp0cY7v7bTW1eXculvV315W4LfknYKb
+h8eaYvzjA6Ebr0bmcwR7dlJ+Obnu6exCAec2iUrlpkknRdTdXCbl+T61Q4Mz
+Rq8maPVZ/fA53CO3g1KoBp62I+JVE1HRNY2EVLECVoa8QIUAhRv+tnfACxha
+cw/jlEOZMmqlkTS+vdL68R0QnQP9s46Oce8laU1SXlHRSVzh2fjHP3rN2xjv
+5GS1VtY0fvH1n5HNE1OCghKLYo4HJTZ9AZlpRYUlOODIjlXzl+84EuCOw6nW
+okSMl8+uBsnOoQwgC4sED8JJbfZRlUcbDs0oT8UoARqLqco63o1IpeoTCj1i
+Cl2FRxRI3q9qcI9+e3Uv3p0LKV3+DVRTe0/p9Tly3ko9RmWTRdBf69NjEVjB
+By//Di0UQ0NH8ENghdwnN7KZA0WMMB0KT0geWvusTmsDscqAhm+tjIxnz1bC
+Fq5RHQOiFh5DHsRrCIDx+YDl85fLbaLV/4V72d/PezCpRh6dvUBzf4VgCgfY
+Od/Lqbty+tat/uGytraIU94Fb784/JPCk/GBJg7/cAfAgfuh1SQSpGBShwMj
+F0NvDkRpJorwPZgQQMHMOpjO1byEJS0fnIcRlBCpzM/wFnoGvMJZNdbmUkPx
+b7YOKQlYqKhk3A9yCru++H6l+opUSazp1J6xfGcFUvjm0n+6X/as3ARSJw9h
+v/rYH/+49Ni8jT7OtnJHZWXdF3/+4grkdh8F7Uw8GbNqWkrelS++hvCvPNjJ
+a98qbIIoSPmroQzE6Zj0DfTUcp4XpZXkEpnUSRCtLpf0pyAl6ZsmDsXyZ+DQ
+m3Fq0ANunhlffoW92u2lpjRC6n2o5cJK0sMnMx/knisZpVR4Wilg8pOlGeGo
+1GoD9iCSr91opmELUQUAhYmiJRT+1KzO333vIpn0UJhvhOJYdmtXUbwPLgXT
+ng6qTop5oRjfupWUASGFx2vrH7mDDqUnz7FDY378TSY0b02bj19nqQim1CYD
+T8i4+BBSOXWnb8El6Rq056ciCpa8PetwYSIOTyLhORxFDpKTNFcTitOZTjOR
+sqyu6HPOZSxiw8jdB3HnFK+WiXJ6kFFgnFaKagzl6UMiCidAeNuos7KyUpVS
+CFP4kSGQio6WqTGVbUgnvtTbdWgePaooVi29h1TNyqu14fptMJ3QvlEHDEgV
+ncRZROzGHvvjMcQqd9uEo7Lu6deAFIZ7xz9Kiok5Pv84hC9f4Pj21+VWd699
+848HQZ7vREidzAMRSgIefi4tPbVqHTRKaCkDk5+q5DRjF6MaAQqfTvafYaqy
+WCSEqaKkSuXfE5wFKca2/naLzfGYh84woHl/BEulUCmopk8RCWpyzGvajFbZ
+miRPY9PlojIwVVISm6+5lIXJAyXne9wNlYuh0CjkiysQolRRvDuv0EJ6vmib
+3HIURM2f9MnAQrocYMfweN809c6bjPym8QQ7/i8j82nCc5qWOcc7OvH/ou7W
+lVtDVdciInjj8Z0lWWNJMSeZ+QCpStwXtJaXi/Mm2CaXSA6PtkdqqwomqdTp
+UaafwuJ+e7BZ2x+Fihj3icCkw4QKJRQdq2gGk2Z1PGDtIVKWaFWbR2VIv4co
+5ctXFLgZaT/G1bkonWPUaGzl0irgiiKkhtDxCaRYSh1avxN/A//4x2P40/o4
+l3v61z34+s93m5rWnAWkkoLwKnEs58rTr58GO6yu2HCbH7R8H8JUWjAIrTGO
+jsfOjcVBiEcJBMMh6zZ1C0Qq8yhVouuluvCdqWwyak7jj1RcrP15JPCOjxf3
+VtIeHnv6vTxLhZHM7juwmA4HpFYwSK0EncB6PDtbm/P5ZWt8giBKY6p4AqQM
+UjPQ5KFiK8UlPoDr1+8SUL+cLkU6anf4mF3sAaTyrO60/cbiymxCivOXrcv1
+s0QUjv/8woVpF/Dw7c+/J4N+4fWGT26xAVHbpnZCA8E8oZS6Unf3Vvtw2Slv
+XKz3Pvj25f6mxEPxPtAoVKMFL+qyTpSbeO7RBm0dIXVeYWqSL0fssosTPnf8
+MGqm5WKwulJkmkirRsRKS3M4wHJZcaH4kSXNYa3At/R0KisnFaemMh9w1Qgl
+rigO1CYoJN/R4nro4eGhqQMMqjRmvIJdECAlGzFJ5z4CpHwQpXbAXcQLF3N8
+4t1hjlyZA52FDGSSPjqe9NHZlLyuvtwH1ppO9yNHduxDMXXk1REcdbPmFSVS
+qoeNiHWHq+oVpOQ3VeoH1XJGaeIEdR1kElLUU9QBU5Ug2yRQpUaPjxNSuCMA
+q5rgGhbne/aA+NwNs6prNF8UujNipVgMr2SoEhBpk2SJUNqbshB1rQGncWMP
+5DO/hU2/8+vpv7zz7rs4kX2RDz/G3gzaQtRSVX0ncQwrkLaKeHgoFDX4chIF
+P582VR5d+AVBdeG7Bnf/gDe6bsJBRB1HLXWMO8ebN+tKBFsgqqUcRKkrd2+9
+HBr2LmsrW7kkYsmsyykp6PnATMU78nJw9AqeBvDFo+l9JI/mAlKk+wVOTi4m
+Vy6Loq5Su8cmvlPO1s/kCoc7MNNpOPUV7OAhGUyoUeljTItkBCJHIBWdof+1
+TiWujNiVSxBIce7RgWgVLcFJ6HJ+i8VTzKAT6PC7J6SOnhOLFkSpk0uljSOk
+dizcGB+PybejsygntxCLMh99dPwsV68S+3ANHFM+1yP7BFI7jhzxDHa3nlSQ
+guZq3WhVPa5ASohSWIrSeSmj7hIqkBJ+Cukaf5LiYmxmIPlBTIjZZQYF0MWd
+jkdf8XBhcCV39xGlkPp2j3TDL7udmOLhBkVKkfYUYkrtsmfrZ9t1E/QQykF3
+wR7hBIwVMe4DilBLcTqzJVYZThFosK+GgfJASxcgBUwFBsoRWqrvIGf5m1j0
+C22n7xd/a/n63yJKrcfQtmz+1p1LF2r9npJLoeNz9hFIPcCICpAqu3Zt5Qrv
+a5lQcRfGHIqPD8Q/7uvL6+tD5oMC0hmyOqzzmIEpns3drgmlkBBdldjFLEIq
+nPUot8n5VFfcs6IDJ+o13I/95hvkmk7AE70AM4DMfxXKt8q+RlWfy19qrduT
+Yh3kIUQAYDzpEAy9N6tzZiAPMT68HqXeUckIia+7dSjuKNetRHt3CGO7HWyL
+aROxHn8If09/x8mY1YVMjB+tOY5YlYL5TFeRFd5DiFKoMJazPg+2BsdQ/plC
+ZWjcaAFU7wSODikP/a0SahlU0S5CGw5pGKcgAqsLttehxSSqOrGhD0O/h49g
+6gep9D1CCs/u3d1YuMamPePUSrkwwx0ZgEqxCKqo0ptAbTpTxkC1i4ta2G04
+UVJSwrEe2HNIpuAeSxsOQu3izDtwhe0ZIaSs8Xx8IJYSXlMgdeG1CPNdWH1P
+Cw69IOOC+zyOehZN6oTB2JssWi2Fu7/DhNQK74iCgy8AqcRDuHhqsnR29eXk
+dHUhmD3qtJh8SgPleKB41jpTE7XN5qoYdSy0O5sVP0VQuToRUXR6pZFihaOX
+gekpLpH6f/PNN7ldfb1d1EgRSdzaI6QylGbKQBKBYlyjhxgeGJn4GJtID0kn
+Lx/JSrAw6LdvY8sY7mTnkhB+8ooObcTC9vLjLEbxJ14a70Duw+g4iIlPDDeg
+NiiEThgi4p1eR3bg/DggFeAEUtTTE5ASDfq5o4eHsCA2KNoWDw0+qpTyiJKF
+dr2e8lVBSjV9XPaBLWkdgjHCstVBW8pqgKoSMWrPvR5oO+fO7emGj/9Ad0vV
+6KmbKwClFYpAn4pOWm3uRyCp+YwqprTlBvEvI4YIpzOwCsLxBh5wAMEOucJI
+/sU7LKZOnnQQUhsXK0EnOQQxFv7Fhb/jNv3Tn/2DAUrzdFm9A2uiO+npMk9Y
+Tjoj8BAtlq5w5srF2SKIQsd3V04LeHsXZGW9eHE4DjQ0SFhkvsS+xNy+3t6u
+TqvnxDevTOo8SaRaPgSCyiG4Io3uaXMyT2oUXE2ugip3V894Bw0Tg3sf99ZV
+5kB81eVY/nRaTl9ea+t4NDdhorU1K9FLJRBbIp6K9lAGd1TkikqKTbxBsY1q
+LuKr5aQGJr64o7RPxBCv6OShjTy5On8VQcW/Rsh97k7+MRjtQVzOBdGks4VB
+QdaYmEOHliPveR2fD7pmnpMPJKABJ4uSaLjoBrPF9lpZvfJQ1KbKslLERXlI
+WaeYfKNmG4N38AcBpCphdCE3LYPLrbyPCeP4zq8glN4z995u5r3dPT3Y3s9o
+RZgavQkVnt8KbZFvpb4oIx8QYBH4kaVA5ecnfi7ZIqDSzsukC5zkfMMlGg/v
+gjsuRsvQIgxUdfWddPgwSi3m1pWQnTuDVl94zdL1rf/M2PU/ef7pF5P2+fOX
+oyQHoQU+SrxbFol7yyaV9z5WkGItdRpxaqiqrWwOOr6Cd17cxCIc/p+7B1p8
+YvLycqA4Ku60luMAOwa+MGrhpgyocJ4HXUwEfUc2zPdwJo3neP1dXa3x5RNw
+v8NKQ3HdA2slGIm8nJzEvLwqmENrqU6SHilCVCS+wiMwUmmCc65iSu0kvJAQ
+2RKvDEYdUrX1re2HOZCBfDyv6CTOruIw9PxpQbgDTUit3+hzyP3QoUOJVENx
+QyYJtJ6n1T/+0HqSf15iY4pTnJjceGKNVDb60PENkT6nPZqmZNEcPOne7yFt
+gUH72JgqjlRGIW07a2rQIuOXgkLZypvxQBUkrXOZ9XYjSkGV0B11/XFjYyuq
+KZRTc2TX2NtPXVSTG+1T6+xTFkF+NPksU7ynckdPvqTtzxBTmkdsejMuNsCW
+ZKANLV887o+jQmfiEy3L1uPTJr2mp378o5b6KoKJh9n8rZjBLBC2S4MUN9Zh
+U73p44+R+LAlTEjlCKSu3BouiJhTxmNXS5bMOrom6dAhH+waow9C5dPXVQk1
+9wQ1BBjdcdPKWY2QXRGNGJVsmrgl0iSXYSTzwefA1YqB7FNsLvRyby+nsqa3
+qw/rmFhDvdqPPRmhOlV9zlepUlwZKUswivEAxx5IK7KVSYTh+6kqdCVjEnzV
+dgNSUp6npIA6l1PjmK3TW3IVIjSaXPyFtR4qgnQF0pezWMfKg4jTGr/+yA55
+VlGNMM/VYil/cBJTm7NcQo6Ly6yVzasoJeH0UJopOaut9whGoy4/V/S+yFNr
++ipzrJXWOuxRoPy3Wqxw2f4SIere7j3o9wCp97s9ojMa755ubb062r5ihZLg
+qYMNRBde08klIkSXD8uWAxNh+JQbuhrRqDRIG45L+uE+DBQBqXokPn8fnH8K
+3MjyXKmjvOb/YKk5ayjSoxw7z9OsgMhGIe1tYilFSGE/BsVSJZrs06fBItzC
+uQIwUzNwdC5z1tFz2NVF6HS2Ynyfg/3Jylz+5cMoBaASSYvEJFebk44hoRi0
+abKrbcLVCeY+Tu5o8Tod1hpY4o+n1tVxjtaHlfGj/f39V65Gt45nNGosZ4Ym
+RuDfdpIGqcKbY8+JiS/aIJnG1ygcp0p8widEsZbSOj4KogCpmJ0iLRNMzac3
+xBEMZuIPnUTTl8c5H/axihzu+JOxihdIbSWknIItnoBULrazACk3qPComFKk
+uVHPckaDplLWyVd+Jlop4iXKpvah8oRUiLc9KzsRsWq6xmmB9D4BtUcS322O
+MevuNg70jw7xEiRP9O1dqUNqJSEVDkhF6NUVJn6SCsMZpibXZmgLmyxhSgBF
+TGFm09xzpwTleSuOKbrHB7qsXeuyGA5j1Nwd2/pmh2QkUaoSaprU4/R81eIT
+RFLKYIqVFHnOf6dTGQjMTqs1pyLndN2Vq7dGhwCprLczM99+G26XSUkxhzDR
+cPcv6krMzcnrqszxLw+ufkS60sIVB0DH5skzxWAKnLQBIP5WqAQ4z+aK44LQ
+AcRXA1OdladPnx4f73ta15v7RVVTHGZy/f2jd6+CugE1SM87+X7Ia4xjwHrq
+QUrLLpQeoKKh7ZOa4HpoMz48tbdbrsYdpfVPYW5RUSLymaKJYbqFpm/H1iNH
+liIHQA2F/J1TiEVQFM/BpfGLj+yj7dKxVV4KUhZrsGcOVHhxNPmECg+Jz6BF
+I+3x1flNNeXTeAzD5K67UTi21L7G0znAFXiKvtSu6FZW5veAJglSc9/vjkrF
+mj5lw9H9Q+2yJiPFVPgUpCLkdsPKyS0HFaVCIsp2TZnjaY8etSiAwcgGkKLn
+OycyFp+1LsDUokVLVZjauW8SUhf+7lGY/0ITJS0e54OQmc8WsZXEKMpFN8ye
+OpyG+nzzJ4QUpfwYG4OaunW1H8d2Zs0oyDr44ubRuJSgnYfiLSaUQw5Aqgn/
+hxxWjJHt8JqGDpcXZZ1omugkQYo/cVYJfwylxGP4creQFHJyjy9Ccq1sjAak
+rF1PD8PNoyprRkFV0927V/pAMGcoPorfDmKKpZUhA4FJGHSDzPuY+1g7sVDW
+rMk1LkFBqv9oChFFSFljMHmYv2MaYHX8uBAJwMsCZ8ydaiqhQcffjbyTjmr8
+pYBJGrRSq2D1dgwDmXlOzoBUJSC1bg18iOPWtbfAwKVBiE2DLMNo57Qnlcq6
+/t2oNnY8oEWt8q2KxvmQ1gz0Hi2PH8vrAcDpHvTnDFNo+t7vzsC0HGzDaVzG
+Gn5xas4p0eHxTq0wnurCjDy6V4J4msnhvjKaXCfrKOLLlD06jmvjxpuIlAEp
+hwN1FI4srl2r9vdg3bLvDWMUZjXKtdNrqywuiPZYw5QWr7TtdQAKec9mTusk
+pKxkO68M8Wrowf1ZmViV3X/ULQWQine2OflDlp1ztQ9ao87eRxXlT7/5ptwR
+Dwjh2LVnOUom5DyFKRfTWhdVpLsSUk7WeM+ndLeLKerLOd1YGd33wOrIbcKB
+d6zhZPVnjgJTlcRU6uuY8tX9dlLV8qdB/95N0tiSdARS/HmdSgQYbEB9Vwj/
+gxiIFJcfR9pD4juOCn2+YMoJkOqs6cvo4p/C0YmZkGnbNjourQKskP/wFXB4
+rHP05cJvCuadcXGA1HVKERSDMMVLqZGf7xSkDKrQM7RBFDHo0dBSOzAwwFzH
+NTOYtGlTGCEQdmPI1w3TSDSGpyv7WluqYMk/uXfsp1baVcfHN3oPSBWxHK31
+C3ndw1NBSg9a12A3cQNLOfgBv4k+K8nzRbxrtmAxtuzQoW3970R2f5ejeks/
+w8CEh/kwoSTaY80CT7YlaHouFvqfwPc1MhLyFSQ+iVKnc0aH2260ZWKLfVYm
+rkNh2QSQspgs7v55eYl5VwAqLDfwLAfCFDAlxzpc1Zaxk7MM+1ycXRYrMZ4r
+YphrsLX86QRsXdcDUuBSwXBZc7r69xNQmfspSL5yFxT6+OPHUkhJbU7DMgLK
+QOuBDC7wwbuMOU9LeCrtqGhBSEF4SUjJjI+QyotZP39+UNAqCgyOB30UNH8H
+0tuRI4sxBMI3Eovy2JPv7Hxotk1sgyvqjmMqOXp5oUG1BAczSqWcizu7jonv
+doNoDTQ+yhilVW+KyjBo4NYWaKDlioIesKUW+6+4S4oDxN1s8+6w0WPOQ8rb
+8z7T3+4eQKqYm0Hj0TqmVnqr+OSnQYonkFeu1GKVnyiJ1dHa8Km1GbkQsktv
+Abk+isR3A97wgNTAeKW/T3wgQtRa7sMshA+e68Ll33cV5sJP1Hk07QiDYgzw
+Ij8EUZsXqeS3YJFyVPwYxFTkdtxHAAnJMcIDzMGa+guutS2Bp3B/Vtblo79z
+S8Hs2Nlmdj5i7cr756axHO6VVHCEB4d9nqlyd3J14iiZGqoJsuigQbAX58lr
+CxhwYEE8eGLilbtrAP7tJjIRwFRv29HLWfvfzpqRlTXr8OHVX9y9Ev14XLnL
+qdKcfAKSXYYYD4j2DvEK4DICPfqUT/HnLKSiKEVAQ950lIrO3DwkvvXLtwYd
+R9rD9GUr7gnsEHk5OIKKispKLjg/xPQ63mnbQhIIGMcAUfv27fCPt6ZZPa19
+uRdSeLFo1uhw7Qh3vTwmlXbUtBDbGsk5RacLoY5KHtZ+Aqf6+tsj3d2YuvTs
+5viFgGKE6um+A55zoDWjF/xVxuMvH4OcAjs1B8opde94pRxqn7NST3nf2Rv1
+C5eJcrh+XWbX1GEs6f+uXUtm4qtv7unBqfZKa7wzKAQ4ImxbvJGKKZAI3wtS
+/3NyKuzFEwwL9PV3lfMmzaq5fQMWwYWnrdSIb4OLiZCCIPFBJYhIFExL0PEV
+zJqFsx9Zv8NBKIQpOuBN+HcVJcKuKTenr7NGrPS59M0jME62eSLyNFkoS+ch
+UFcujfPSkNWBwguklMk9YDlarTEIKrsc/pVdVbMyC2bMoOnQ0cOHCw8XXrjb
+x3oqWjo/cuip7PgMHhlaBUypFH0yjVGKh9Kr8slXMP/sgLVUHNhxZFir/3Jw
+54DUR0k7EaiO7wSklgegUeBNLmiDH1ZQZurjvhA0p8g99hFSR9bjRCAI777c
+QuiN42YNtXdgI6/BQz9RqhGsLOOUP4LBQ19GljtrRkMDzjeAGa+Hty1WY4Am
+zIeJqd3vsy6/h9tKOHeNU0l3T5+W811f4nItUmQbzzpAPSWA4u1agdRelQan
+qnRUU9lKlqdc8jRIJYfoSfCaZL76HlTouDCY4w/y/FMU6NvUAt/spf994vs/
++rxp6vAQ0TSJqHkCp3kKU/IKemyGKcHUv27GSQYXgRRmfKfrGKWahpZEZBXM
+eDvr8uHfHAWkgoJi4kkZBJzsBaYSE3OK+jqhqC2vcKRZeEMIohabsyuznnOw
+DeNiJ8QtCy2pMY2wYNTT2WnBVwWc7BJI9fbmQAc+FpcFRRbIr6xZ/+Mnh1cX
+XvjiSqoiqMajo6PGxVeRXBUwlaGyiuI9FR+kUQf83kZBxovEdx3JBhsyAqlE
+iCbWB/z/vL2BT9V3mvbd553NdmY355gTk0MqmbgqmtSDIZBAUTQmogTCqGtj
+FFVkM/PK0rOCxORIAsIwQA2sqE8MB0qXQgL0AeKjgLaowCgI1lpBsRVG58W2
+1hm3XZrXf+H9XPf3d7Dvs/vs7uzT8QcgorWtXNzf+3vd131dB3XXA1N5aIQO
+yl9yTypEvuUiXQRSaG56q9etLy6W/EwVCkwdzOGUBlKQCI21c5XB4PgocWRX
+SxfbpUVRTSxaLWbNoAVVXjn1HgpSikiX2kAF6uc/F21AYLpEDfcHHihllP7x
+ST8TwEdff3jtNJ38J5i4cfCdcv2UMrYdpBxfFYOUyVyUFIJHupcq+o+/jNkO
+/+M/In1R/i2Q+vx/KHJ3cqqnp1dj41V2WK14g1WYP5GWkvP5yZPvvmsxMftc
+RVrxhnQyVRigr5cL+r4qOQwjv1u9qEMAU6sO7OotkB6Ro++jrI/aRqLRvsLR
+5kiUmUxdGMOKrtyClRSgqpzJuzVtcIRt9R0MfsHK/jRGdYxnevdvTESdnoaI
+BUYhjkhQYoZy0go2FsRVzcdVT0wsX8gpm7zb0Tg8J0hl9bRVlEx3hjj2modK
+Xnut4oMt33RduXLG49CdwkWXvKXnlsaELOLSBSpXl2656uTaKD2ya7wxMztU
+SzMlSOEi64nNDh5MTT2YyjSKGV5uFq4aaALYmiesebB6XdXBVDbYTiYIUfxO
+IAWLYJBiHGMLx/j23Vq6iKeUZbEl9pfhyjZBdscg02sdd9Skv9d68c9/bjzU
+P/zNZx+Td6HAWt5840ECIc9A9969BKzOnDk9MDI9Noq+7rBtYCnCKD7+iHcK
+eseeEQz0VZx5AOvwS1eXxQ9oqkhFGi3sGx2zBv2eSIQe4qJ3iZbSQIZxTMKf
+lPPoZAYnT+5BAPrGu1DlZkut1QdzQHcPn1kROwAXfRV3rlq1q9eNjaHndPDN
+RBELd0YCzSXhoXCYEUcei7vL4xJflE121KDersHUBUhhaoDS/MXCMSBVnpqT
+XJCs4fD+/QVI9pIL9qfFVRfIynw+sXqiuroH/8IGVsfbJoFUf/sHwc5m3DyI
+hy2RrWXXBxXIeMVQORrdCYdZbICd+uEcZKl31BmTYDe9Uq+XSkEpbFwn/hr0
+UpiUpTI1Pnkoobg4t6ysPvdQLkdhLuQmEsCnCAP291YPbozT5PMkkmvjGQ4W
+czRibmyQQnoFpEaZGl8tddvG2vIqte3QxejbzTGeytkDlbqm/OfqmgCUkVB/
+o/KEy3FGVJF90ZmQP8BHI1PcED68SKnq7z9+g3XcPuWwbzXVlKUYbdiwiKnY
+DbDQxTdAI2jk1/cyDMsgBZyI3e4cVTwnvgzkFDzqzhLTCYegGR+rC+v2/Imb
+etKveGb62qsxifp6yYUwrdZz0L1zYxlzLOPGt1OBbUW2sdBjiPqovQ1INXeO
+FsIkNHP2hUtq57hE9fTMH0WqVj+B9eVwzTCmJwXSE6Tp4odEc39OcXEqJUDq
+3/3JSLiTGUTsr6ZGcYmqWouGr1uSbswIgBQjivbG6elAyVBncwBIZdNLVXzw
+wTffPB7Rsed4dG5+YjtLH6V4s1ozhXaQSvH6cqk5S+2NpSvcx6dna4eAFNsK
+uBvk5uZx20vdVJyLLVnZofLyQ6k563OTN5I2QaA75hu91cnrtBF5MCHvUF6q
+TWVyEhmeZIk9J8VBkBqQEKHU9UvLvEvnZs88ZnHbyp3GOoI58XTaqTYZnj67
+jdPtaB+1yR+KOkw1M5QYHgZSqO7zL5zViJmjD0gp9ljJx1u3ytTFYOR1U0c8
+UkFkuipUn73+slAzZH1wWI1U3z92/mMfxx520GPUg+v3/vBosnqldhlWbVvt
+ISrhT+ukPvAiGpaYppghRIK9WUGPyY0TXO9urfsqmxtDn++EmDrQe9Zp8Po/
+am9vGxkBUXdkAuuLAikalMqugri4C3HJF9KoNRh7tTCn4WFHPCtt/ujZLweP
+Vb0oZrVSlHr+BWCUlY9sr2d/XGJV4sq4tfviqsvLampwCmNDhZ3xrPy26enm
+YARMDTUHcQnfAqYqrnR98/iMaRJ09Vvm5AmlqlLHl6bEZiBWpLxhjEOTq1Kc
+fDRTi5AqS44DUjzFxQnl3eVVVan43TGVqVoXx3bOt9oh7N0Yt2JN+aGDztB7
+DzTDQZTCDHsLmPGZuqUy20EqxQ2CPNOWGKu51OX1efc9SZV52E3/vXfc0T99
+PHazzwLao9Hm5lCQJxAMBX2B4OyIZFUfnr2AyrXgo34gNQOiNlCo+ixPuzDD
+o6hi/FRsiMzhd7jv7xTw4ARUpsqzGsWp19lno1kyX8cYx09CIK5cq/UYTr61
+2gBVFu1f/FekwItqu3/9bEJ4zhbfOsfOx+ylkOAd6M2f+Aoy9wkzBPrzmQej
+W++MUqiizUOBcEkYm/msnJ64+f1xC2geO+bm5Mdb05hQ1oGFU/5+JJoXYKHn
+ta3LoOaoItBQsgwOJi9Pnk+sWrExOa66vqxB/1jjcIcglVY/xU5zMBLlf3+o
+RFXqtSZseB9XfGNuwufcvgxfsnPHLRTv+DK3k+Kap1spbgE4JXbjUy+VslQ+
+G9Eh1vg4+MriEhPRtpzMK96Uk1WW86LqRU55fbmWatfuGnze++1zwn/XVi0k
+dpfnvCguzskBUgfVpFdRewUpZaoZpO5dvr8sJaZzjwFb/Z06PW9knKJ7aYog
+RXSS1CuGqNuXLQMSOIVCAX8oAKD0cXMoQL2avqFGqkdBh/39Uzi+jGcUZpyK
+33pEPJQufVtt3mf8VGFM20k3VWgNOmdf4d+9zOtTJwUU+zo7DVJYg90YuPE1
+ArzklVz3gBQGeBQpBYf+9E+B1KKA+N89GZdoiqzMBpw7PBphh7yx6YbuTojp
+fPIRB9/4g874U+yHRjv9gUCgNgymEiCnkrm2zU90l1GlJMdlf6mhhgltvbEE
+gtSFXlb0li8sYK7Dha9nkJZ+HpJzbdz28u4afv9cy3Dj5N1HE2n5qBDmmkNR
+fUc112ZnV/w0u4mGqqvr8T+f8UgEtwkAg64737KXxmEpXh9lP9MmnxUq3fou
+f3xvvCRca71UOZdOZchRspUjQobIi8TuahslrCUW59veXog0qmd9anHxs+IX
+xanrjZgqzpFsDjvrxoamlkyozoGPr8bueJ4Xnsnw3FhPWniBSlQVPP5DGHxr
+y23o8vFYn9rxaMjvi/gCoaFQQKDy8ffJ99LMyPFzU/09l87mn8Uvp3/q9DWO
+xAyXVesei2ffunWR6VTyGjlZCrAttChbGioUeX/HKzWr75fWSPU1Q/40N4Op
+afapCwogpd6z1GGZIaxbh5PGn8xz/qfW1zctxtF6O1c7inYe2DV49u6Em563
+tWGS1AnoJXFhJlPBlymMbgrbXULS5+OsTGldThF3jfiqltXTVJnxD1ZUg0jT
+gVfc/AJqc+xeErn9rVixsbub5mSupbYFSNHVFxR0zdZGZbY3NBTVudpU0ZTN
+yvjjx5CejAEfxW5+6s5txJdSem6R2LQD0FN4LvV4KbjOWx/fm6GiJkk2yHdo
+XKqF7yakgqhnlKm0nnK2tPft2zY4+Cm7qUX72G1LrqeCveDMPmRqBB18KlI4
+pON9zjzm8dg9DNeXebNhz7rYTYicdcxxz7yFwZBrpP7GOM3bH491zhB3PGMV
+KhhwkBKoQoEQnwJT5yb7EXxevAii6KeujavP4sAzOClUO8PgVLi10KmnXK0S
+nA5blaJOWSv1S0coWG8OqHiapweEKP0VSHeuBBmu/qvXWW4o7flPfvLaj/y4
+FRnJz7UhQyu1g/78wAFWZKhSXPg4+Jgcd7IkUxjf3OzHEbckKEgBHm5DvUcX
+kvHdnXMxUhQE1Edgql5fQpknsKWwfH9cVVUy6cQFLJSm0Z3nJpbJqxd1XJ2q
+1KO7MD9pXbPDQ8Eo3Tk0AsHoQCqzsquiqaIRUF2zdV1R6bTn50wi7CnuHKY8
+hVQMUrdMxXv11tV79x4AqVqT4BVsTM5F3aLggJxnL569WJhfyWWBG+++jRO4
+N/d+uWv5KiDV051GBatKLBcrRXuO4LSgH6GweerTnt+47LbXPcu7ZU5iHnPi
+87Qu+tdja3tblKamLThB0kGRGRPv94/7hSE9IGoGbBmkxoenUWSgTu85e4mN
+20ttU1/MUNNCrlCFgFTGhpdVaoPHTRnrqRLF7dCufdqZUZESgUARKGzWwWeQ
+muL0sI0ry1+XXxmQyk3dtOS1P8ejfmq9yV12S4e3Y2frL1p3HhiE5EbYKR1e
+O5Pjzs5PRgt1Lkf5lgqHS0oq2REo2Lhyee98nJx3sXGqs0xzq1Q06vV04z1s
+A06snF9J35vo9mBoPrNyAVR391xDUl3dUG3LMJDCQfPJleFobUkQsrO5eY4u
+qmJLUyZlqgI9+DffUKfctY8ipUmf2E5HW6eULo1Ba2mpNzA2cSdlq1R2QJEg
+UaGC1MZkIKWY8C6DFHYH1RsTq/aR9lU9uG3fUQIQJWxJLAB8PfVpicmC1Kac
+nCx151Md2gs1SF2/DtPptHabNy9btJxd5lGfXmtljdRtseRwB4STUKCisuLk
+0PMHFjEVmuElFIoPhfzjJaRBsERzqecSMc9ff9hGzMoIRoz8VqtShabwdGXK
+cVMMaYSoPkPU1sPO3IXWXC4cdFL/6Np6ANU8DaQ6kJ0n44K3qmgn+oBV8lDE
+/gAOYNOfMpD5T2uIX3eYetmft+42SImZajdQXcG47PonfYVjY816hohAwZ++
+saa8AEjtOhqHwK0GiVqd2aQ02lMGqBB8lyWjTWcnAKPCCxwhBT13KcDdnOt5
+DZSoobqh4Tkglf8sP6t9eCR4JxLCubi5lsCV7C4Apee1ii6UCaclnrI322o4
+F2vOU9wmubt72bDNcVRLzW7j8r0xH6JBGHpBKu4Qu9oJeQl5OtsQDQ7u56Sj
+p0B1x0GwavcuVS1ueNTSuMR1iqqjlUrLym/vh+XH8ZPmHJ0wEz5P+rCIqZik
+Zam3RHg/hTjlGKIgNbnijVOj/EBHQPLzWGkKBWasWtGfBmdnh9uuTTGT+eoR
+5qVUqRsD10ZGOPtC1kmFwNRWry339AmqXByGvOnsYzYjlko7WNZKqU+xZorm
+vHNgquOv6HyhGw8UUaVYN96N1asMNbTOAJGw5Mc/+sylep0b853gpbWoqHeC
+MvXRE8OUIDU2mhEalVaAQd+Q69Ab0eL1stZ/tIcOXceYJZjLX1yYYikcb/G8
+8voe+IbE+RwpZHOyVKA6OhR60EKR4oY/Ry+VNt/TMzIyPUQShqZ8zZUUp8Ym
+1041UbG+efzFNXp0R3ues2Qpr0ilOP7As82UgPfWIku1NAWGLxoMDnEZ7eZv
+NO7QoTxppfJq0l6wU3z27EqULBgsbd++JnFF1dp9u3cxyX72LAtadnnc9vUW
+DwakPiroMEhlcmlgaixIlXqq5EVMeWNH/WtvLtUU5tZtIUpTYfKzueTN0JL7
+Ofbi6aXi/cR5GLhmgoFoICSABUsqKVOnGWBjXHpJm6TsBU0jxkNLW9hcGI2N
+YF5CKiNGLQhSEibYD4qvPawBzS+9TkpvkwOTf8VfwPZVBNAqjA9MYaS/OpEx
+ypoV6qdcTNWf1Kb/e3tZP3NWG3tcldptmOLkA1I9E5Miz4Up+vPxKFxKYUgs
+QnCIB0wBqereIrYXNlYX1Chm2hLvFGHXaKgiQEP2lxzi+cn5WfLnfZLGmViD
+vYC6+TphakgcwoULEz3SnVOmfLrz1lqV6mqS7WojjAKYenzttOMSzlmWIqSn
+O+1SFllOF5EeU7fo7er1e/c6g7XDLUxkuqtXxiWXAykSCvOyUp9Rpow2eGPd
+G6u3b1+3hjZ91UaD1BPtu+5aKUhtebYFSCGwR3Tekp1dWTFLd35/qVO6l5Z6
+c5ili1k2kqRv1iYFfZTpDShR98WTR30RSpPqE6OVkOYr6UJU7XgwYFUqFCiZ
+HR65dg2Xlw8v3T3zjPa8n6I1PUwrgF9clCrlTWIKPbHLBkOU6AWOwK0Zpkv/
+OxUor0od7utb7M+pUn89KUit2oUVkKWi7167Js5GvmaK8CcaH4hL+Nl/sH/8
++pKuQ14zZTsyQAqPHrZWMC2TaOrMF3RTDyhQzf47nUOEqdbWhgk9oA/fqDLV
+i5VL/VyS1SiDFIVKCec6ANF0szzGkZdV0JaGj1NNo21ZykJTkJqbm4I8f5Y2
+UVBRMcxEZmhIJ2tLdhOFqlGZQdlemXr8DXVKN79zIqc81CxdbNKtf/Heu27K
+9OfXPx4LwiKwbDxRvTLxUHme/EiWFJPB8Gwed+HBlftWr65aUV4tznNf9WDc
+Ak1W2oWFKro/IHWweEsORQrV51x2Ja8KaLinIuUOWU8S4V3/PD8EHB3vl4rj
+/Ox3dFEf//e+DBCVQU+uMsWhR4lCWLBBkIqK61R/zkQmQJUaHsHi7NKljz7s
+f9YmuSuQ4sBUmYJfD8VLiM4TW5gxSEGvc+TZ0WcidBSeh/9JFYpPGEnaZ6wU
+CsNu7YNy69ppvi1vqEox6ZNzmSyEE36sUIYfPE15h9YpmIgitcOe93r3kyDT
+kyaq88qTx1eGH0RnoqOd/kgnMrmSIUDFPlNjQioyFzbY98V1u8OsxeUHNyom
+kZ8ADdRKNRqxFRD0wKRMTod1XnynYWpSg8H8nrIttXMOT0iykA9s6dKZp7zq
+bI38KqxHF4Vw7viypTEBwtIUjzNwd/oUNzaOSdAZJXPn83F/bKipmSxYnly2
+KaHh7a6uhCUJZWW5L47uZ7q3S0qMjdXb3WIfC8nsFye+qEpOrtKxl5eQk0WV
+mpzqGq5kh296ZvbqQ215Se6+zAOzmUkBMrN3vXrrMhfNh2S/fva7f/ibzz8Z
+HX1QmEF18vnsoOPkS4/Xj5x84hJE8kFRiUwoKZm5MsLK311AhdcI+sczbWdG
+Rsaj/IOcD5yXHomALzrCdOEpw/14mNxRUQm68PVZmTJAwYKK7ezrg5MCUT0b
+FQmFJw/U+Ztr3SNBk1uT0aSO77ZFD+G/+Mu//D/HVMIhyr+YqRNgqhVTVu1d
+3e3JUplqf8L5N/ygcwA4iTkrmY3WDsNHIutOyK3eb0ZSyTioarRa5zClEHMp
+jOiNkeg9SdNXpq2tsatSQHJFKqnWqhRE54X5gp68n1YOUfqEKkGqS4hivQ6D
+qGwHqsePbc1BlnjnvG0Yk5t7NSnF69A99lxTPg36Lt8bV3/e0DHZs7+gjMVQ
+kofw4GKGR1laWd27sgjV9MZyLF2KsUuowldjZSIa5uRErnvFm8jEQizdD6Qq
++T+ppLW5ftkrUDGbDbczuPQ+KXAcd6pOty9jnPgrPII//4SvaYZaJb9PvXl8
+QN1Uuj9emNJ5J0SJo1Kt8vnGx0cGztGZ9/Sc1Wp9f//IyDV36VORCkW3Flqn
+vjXEwSdWoVCcOogCTsRuHxbtyUL74cMepNgRt4Ovr3NgWlrujVg1bVuF8yu9
+OXBaZW9vWsV6Q1lXSg/V9e912zR+7f8klM/7Z5fIvcU1U607d7S2tmLtOkgg
+HpAytlMJx2MDmhdFo5HszmnmfCRJN+RhCEu6465difUdOtQWc87F4wg4c6g+
+29qz8iWV6kduOwfoLIKjRQdfnUHq2YWegoRs4FRSEg6IPa/MbnKQyoawrhSl
+0FVxhSEydeqRlHiLDMItV5EMVEs9iymb9LkmXZCaDlayyVfDVnRyWSqjzi2o
+DIqZCycuvFiLCfqq3btXs9p+0BJ5QdTa6n0LiclxCPGYjOalpmZh8DLZ0UXu
+6NxwdJzu/Kq25Z2NlKuWNh6+9fnDzz+//TmQunz7848Zw7A0/t8PS+ck2iCg
+Jop3nHqClMOUXfz8gpSDVRBu6hxF6iyLyVnwnQjRp6ZnbLIcghiFnNoaMlQh
+yKOH6hOmrEm3GrXVGE+RUjrxXCc1qhlf38D0sJwG5NhyYNvObRLv7nOQIo72
+zbWmoJMrkHnob3n9g9d/pCuf6E6ulWvfLKJMiZgqwpKl5ysj0FVf2mA7R6JM
+E6IsXwVKUPNSSoBGQ15utcYsKxPTuifr8zRcXXxaWmora4eHGTv391y8gLUE
+Z9/wnNUxKpUufEAKtdTFBZjOhLm5aVQO4ZCbyDQ1LdnSBI9AT5xUW2ll6pvH
+GiIrNPvcUk/BKY1w7AAqXeQ+3XhGP9xPufzxJ8EK/riabsiMrFx0wpsEKbnV
+oDzvxQddVqiIg991Up+11azIxLHCLqlwQl5OzpMnyAM7dF7PzQ2P37x8VWVQ
+nPlSbxrDv+cWJx2eYArtQkp6W8qDn3/221HFwow7wiDgd6jiJcTZR4ee7jdI
+iUAQnGDRfePDI5N3Yc7PFlzMp6rTok/BI6BVE6aiIWk7t7qefGtsSnPYvdiu
+zFarTgYpvT2IAqe+vuZRQYoNISC1TbrzVbbJQm6aFSvq1BtrEeO5OpX644QS
+iUFgJpN6CMvP1RaZXbRTCVtFBBhPfH/3kgEKOcIVou1nZny+wB1OvpLAkKoH
+OdOwBEp7XLlyIa2gvqzxZZ2yh5a2o+3JBeHpS5RuaeqmkpLCYMpq1FALkNK5
+l5XTPh3VmTc0RB2EPoePwhsTGqFCZQpAZX9TMeswJXZKk+OU0h8qzj0z1pTF
+/VC3TX6VmUwFRW+4A0jl5skSAYUdMrI927cnrkAq2HtAyv7160868djKalYu
+klGArtfQOKH4mUGqRpCqrRwfH7gMhktvLY3JWzSNYRcHld2vfu5Em9ry/B1s
+1G/7MhCPW40SA0V18hmIBCld+9IdO2W/Ggj6fD48BseHB86pOp3tz097UoDF
+yxQGI9PT6mKjglS8O+pgPk34Apgcog47RBl94IrUYbFSRnU2j+nc49K9cRfW
+Ajutk9otQe9a8j7UTslxY+0abcusgU1nw3/J/1mnrrmx487XrTskSK0iYaQI
+RAlTyzEOfsRQ5oxOLmIaRob5jplGiMfXPEDjU6luqjEvNREz9P0r4xaq8GGi
+ToGkcF2YWlQLOVg5XMPm6IWnX/7xj1+e3ZufZkEHdVwOBai6lpaOqYkCmvO0
+nBruyxLgWYM+V9n009fUoFdATambEqYkd3l85crxczfOWUSnN4DxWAOLCfKM
+gaw7lwCuVH76D2ZLhhuH2yaQ3SCCguoEUeuBVPm6Ku3d925bKwMThi+2tbdy
+fvnG5JyDEhUbL1WW1T6FWopamT1bOXP/cqm7GMiazHaLNy8j8Pvh57/6e/ew
+P/y73//uM2w3M6TGtHZJXRPQAkrWS/FQpUJe+bLmPBDmW9XPoG/g+FR//8X+
+SwX5F+9+T74lher0aYepjPH4cSEKpGy1jtxVKSRTRp+z1+DVqF+qM3/A7+Om
+GGWTDUTd7WYaK7OKbYpN47r3hqrUCt36FMauZzUmi+tywZRzVvwvw0rrWAYo
+ECUlHqAVpOimeLDTX8m4qd/NjtuxINRC3wBbDfTojOJgOyXCbUjISZRvBMab
+yT3leVam6ngJ85Kd3Tjc3oZ5+Jdffgumnl+ERuA3cOzVWpEamuue7Gf2V5CT
+UJNdEWRmjNQDImGoNhv1ubXo2XpK7L2UCVobdTYJy7yeKcY7WprnD2Z9bmn0
+vgKGZ4evXGmfUJnKZWgsrRiQOrR93YoFJM2DvavWrnkXqpxeinixo/tWAikK
+98mTos8h09sUXpSdpEC+mTGlEkl8hx+RM9tLuYW0HESpPP29lhV+99nvPvuk
+T4dehgONEBWyS59A5Y8AKX/8BuqT3w36/NK5+Oz9zMj0lMoUY+MPv//67iUz
+LoVFp52KzmTMWI3qA0IZpmv5O1tn101PoPqnwx6orEb1RTXhA1LTc0yMJ+vT
+4hBz7pL+jlYKlbC9GJS8258CRNeg/8kxPfV//fz7qS2072FmrKuk0yLsNK6T
+Dp3Vq6NnJYcWhQ5BNQIZSYseCNlAphlZU5gWHaMv6lQc9q57l88nFtRbi25V
+itk9vVBjRzv2iV8+f/r82z9+eWw+q2OuUTy7V6WAFE5lZ7NyEhqzFdDGxkRz
+ocpUUpNBquIlpCqyxX4y8Ws7ruxsUyPoYmdLxs741YmY7JNmlbD0Vsrmq7cv
+P7gzO1vR3j1Rn5t1yMQIQOrdPfgxbz9KmRrs3bVaRaoYeWtc9a6F5cmClFzw
+sLfJeVJWXzNpebXZ2cHZmauXZeu4rJTQUDM+KFVf/vAhUAJR9OefYepz75PR
+jIzDOtl8IggkOfC7MUy6XtPVouvaR4GiQ+I26JMSIRAo9Ptmhq9cY+WY6fGl
+77//fiL/olzOTgtSUhSDKatM7pQrFLocnc4s5rAA5dWpw1FsdihR/D0CKSFK
+kpHlDlLahlq9ipe4dat13tmzzzBlT06qPVz+fvpfhNQW+RNL2mJxD8pd/0Xr
+DgHKtJ04I9zVogyrm21POqaGRwYGohFNIumjA3oXzk7S0ZfDMhUBVgsvkicY
+wuCbkylIhbnaVTZ2tF049hxIPSU2hvSMjsYWq1BhI6U6uicQVeWnJeQ1Bn2j
+o9EIkwfNzlnt5c5nZarCQBUBU4JXxQePH7eJR39Ues7ppWJ7mLEUGS/0anOp
+5X8Q/HF7FETNtnfcrc9KLUf+i7C1+OC77/KNJL1XERbZKBDWS5MQV70SEgER
+zEEbxiTwV5unIgXjJpvOIN15qfv3gCmnZim9xXqDIPUrGnNCRq5/fH0MM66M
+9DuqOrr/6+TjKbQyBd3pM0jp4LPxniOnAkIdNz+VqTNWpAiTy392sf8iRiTX
+rqFKeKBKJa680O1aOZWw5saFNog5bKHahipKlB4wNd05DZWMsV8y25XbdOrJ
++gJp3NoV8u2JW524eqWw5JEKICpxTWKuYepPJD9/amgyqZS0UitsyY8BqlsO
+Na5z5453wNTR5Xibc6K3ySiVW5+aqaA10eFIZKg5bLVILTrD1eWWfhZXX6az
+D35BTTi/NowfyuBXf/yWzJhvv/9qgipGk1VXa0Wqdu6vunuecd1LzWusDDbT
+l/Nt3YwceRpxiwGqy1UpBytqXhcK4i3fyDLBlhpSPC8655gSM6n2fKPvG6+t
+k29mZvYK64LdZblZOaxebdIpx97QunKileYRIOxy36Fx1YMrq/ZJqicRgrTV
+OalZZe2SyKORb2HTeODe1WWODkPZwr9n829KIQ5ufY6GxcKWr1795JO+B9ZG
+xwMkrnFDAU++EgoJUvBTBilffEze4gAVCjiIzaBBZ1cGSQIGjBfJG7momjU1
+8sWMYxPswmfNU58JprZaS84iH0Uq44h38HHN67NZLBoEJAiT5P2stKRyPViR
+K9V4xdrEFWtXo3RdnZjoMLVWVj5rE9Gy5eg5mNplw78/QZi3xC1o2y6D7Mps
+z09KhFZUnY5AB1JH9/eYeqfAafGGUaBEO5vDQ2xGfReJstgwlC3cNLZnpck+
+cf7Fiyy8N7ro0ZuMTahsGebEAVLCFOu8PfVdoE1wCoeHWhrnJrvTXhT0pEKS
+VjYzkyZCubCTbaROTlRYKQNVZnbFf6vQ0edEVI5IP/3oESqXcyiEY9Pj0tjy
++tIfsJAs0pHSwIYoPkNwM/VZ9AoHTX4vTO2BL1++cHT/YPXKtYmJifuSB6v3
+Va1NxqyIGwu9VCpqqTJBqisTSEEhfDGm5XUXVeOWFq4+/Azq4LO/+fnn9y0d
+jW8H+p2oUZlDdpyF+dETsKhJ97meSmUqFIj/gXLKIIWAahjaoO0MlrH9E3SZ
+bEYqNBzPtukRO/4Aq/ZmtvLOhMKSnrvOXIEzBilRnHbogag5IYrx5srlRQYo
+8VJoW1bbJS8xbh3/24nr4hJVnlavTmR7KpEBgl6qcuRBueVP6NM58Fx5Uiqb
+zRExh1mjvGxaqVbR57/YwQdFtnUscko9elvHyJXhaY4lyQWaI/BTFSV1mUaV
+17TnHO2F8gRT1T31eV0aGesXJEroKMinPac///LihZ7uRgjxuloYqVpEwnDa
+Oc96Coq7GpJqOxk9fDLKYNqGfJlO2QKRUAmKsr1HF0CufsKUfM1Kbz16uRa6
+NDb3s8sYF8CrdgckAO/22Cx9YHv33fr6nNxU/q42iYYiimBNeQ8rqjhu964i
+N2nfRvRSWmK1WUwxmoVi1FIKzCaIFq5/eHwE7rzUM+9PYTkd2aYYzs9//jef
+PQRRl69+MkqJcg2S381ZAmGde5oT273Pa6jSfelSJQhNQybzDBtxBdpwhBi5
+9sVHp4/3f3QJr2UwRV916e6jGzhMS5gwHqL1zjhy2JvrwUX901ZP15lxOPZE
+VaEMUh2sck+wDLpS05hVZoXg3O8SKVHr1sVhisDNLBemk3Qir5nSKy/rre3c
+suU/Camfbmk6iUknkLLsSMsgJYgGsYN5CrfSob/1lnR4cFMFVqba7eRj+0qQ
+wsSFaSRtdAmlwyA1V9M+z7c87NSLhazu+rwEUhMb9CuIqtryFFHNVhNZwfU1
+DVzHOfZq2VwZ7pgivjqtIHUJ+0xDnd9FOscQZke4TA8JUplC1BbR6NmVYQ9S
+fJhtdQqxCwO/R7zEjC1SFgmpzW7JzumomOKyznflynB7DYuRccmsvpxUey5q
+82AukhfUnbTouPqj/FrYV13NnqE2jfGoTjiYgxa6xhJkGpqyh8kkIn/dAmOW
+STR6+1e34TehD/6BY89OvZsPMvyxJxB7Yj8PLf4SiNLdz1Uode9+n/02nw/d
+wezMyBdfHMdp6tJEvzB19tKlCfwSdMsdsKufJOmHDx+RkNOs8RygDscufIcf
+HBZ5EG1G2THV0T1JYiXyYJyeZXeOoYqac+2FGqZyc9eTvLdOuFqzJpHxgcMU
+Wh+OP2upEv6zEj0glfByN1TJNIBSp6BbOW79xYkTO0QlqEOnTIlJUD9FkZru
+HGsOhhnFMZhpHsrODotlgrEsq4rbyLhv/uiLhbRy9uTyUHcCqkrQlofn6bGz
+Xw1ifqo9cJvtUaQah6e4iuRDcybMAanQd82fdN6J3OHiR69GSGemVaoucejM
+ftAqqVpBUr32AaSnE7sw7StdtLUo9cxbnCVd6f37TnlylXyisdmKjkZMpnqS
+MWIAUopLkRnQQVTyC7LFGjwwj67z6MLa6nIDlDPayMktKCirkaKT/5DK2TuM
+Y3AyTrERzENUwH9PULGxUQ+V3TjALvqMtdw+w1PQ0U4cdem65xl/LmIKtVS6
+m/TpHuhzuBsK2WRZuw1wHtdunLsGki5dZF8t/yt1s/2nJ3mZHp4xOd+DB25W
+zELf4ZigxXvA1Ywue9PREYMUGdQbe0moO7C2iH5p9xsuetY6cR5NjPfkapf/
+0J7cXEvh0+eBVZUVqxwJX17/j8Uur9tq+5Yl3rsl7rrIt24OAN19dHeRSTs5
++HZY0oLK1CR0SYGq1Mi05sYILyGEfcEAExfZbmBj2ZiGoTMT5Hy8YBNJ10iQ
+YFjhihyK7VlACtO7MkIUW6hR8lVgUkPDnIUuLyuVTM66ulAIx6FIJHInpI3j
+TJ2a+kpmdtmoD0VlhXXpmdmv/axidvabfzZhwnHJDbwFKM8SaJkXFxRbMIea
+un19GMo1r36ypzyO7z3OPbb6FeJ4MLGsGqNRkVPsBNFXJWOzYYBiaHxwE815
+AY60BDwapGYHLse20m/jiegcDpSq8PCqgm/xNhgPMLFyewomMQhZj5Ru9KYv
+YKSCPxQ7/hwt5RU0R17xa77ondmZ6QE8Y8Ul9F881vO9eJyPdA20+QyQesBq
+qVZHM16WJj128s3ww4PmB6IP5hAg4J0PwylX+t1upiftgRaBV6hBX7Em1UQI
++GzuWZMqZOWu4ywEVIzOVbDgfP/d9LT/H23+rybHEOl8f+asYKdBXGdrqxGe
+RbuOYl0CqKZ08tGSgP0oZ1+YMV/kTklttjClcV5XTU4O/vj75xVthditPi9P
+WoTKpsy5mi7CNXqyyhgs//Vcdp2ue6g5G/HmqMcMtaA9T4R7SXR0jALIuQek
+OsfqkharlBEJlYYp7/b3QUXFLELP0w5Spd5IptRFeW7WWDe2LaOe5/79e/cG
+RiqQdk5KbZ4Dh1C8yQ4+Avdyy+rjlFT5nJf5hY3ViRh1rt9EK6WpsWbGrP9g
+NizOFZHw9fult1imus0Slfx8jN/81d/rqnf56hjbB6wQ+9xZ5+A0pEaK8pSe
+HonovuczqbCGx/Ecfjarieq3+8K+SMijQ/13Zh+MfDFw/Ti2OcgSzt79/sOP
+LvYLUmdYxQJTODzfNEhl2DRv8czzeql/msl4IESNcNlTXV6JwQVazp2UKAEK
+j85tSt3jgp+4Yj10+UG3IrxJ7AonXa6e1FQde0Z6LvlPQ+p/g7LXi4sT1xa9
+8w5SBBPiSTF8lEhaUiow3QBSVwxUDGQi7JoHm9GlZSO6462xIS8hNTeOiQan
+30JVMmt69FgopjgV8eGQ9KWmpTHJMee1KBRq2HTIKuguy2unk4Jqx7fFH+3E
+GE1KYQQuSR6ojI5qsgtfjE+osPnMN20ySSj1XO9SYh5TP1CeaCEqZXOpTr4g
+azJ53d3Jlg6zRGlh3PpsA6u++igeDs+/7OXQrt5o/EGCoe7kQXZIy+on6Qr5
+X6nIHp5mK1SrL3Kw+70tpv8KevOhAHV57CbCqHidZnZ+ueZc3IDwle5zzZN9
+ZD+GbELjczKqgHXmql7ATCKXcerUjWun+89oARlIXbz45NklR6VfO8PYbwC3
+l5ucsuNIHfq8/mlGvZVmfwAKFmt6BEKqm33K5SzQvfeOyYNX2QtRfDDmyMJX
+r9PG0L9xo3t98flxtHjFuWs1NrYaBY0uTCmpYVJ16oowxb5FsxTDojyR9PI1
+lvCDVI3MrrzcLK1h7YKf2pfFCLlLwkxG+IzYhiWmSuKyV5ftDsoG7frxJWvP
+k39FUjjcHIrYH2mPzPYMU4YmaPPs7Fm9VMbufgiqPng8fOaa7bOneKhKka+L
+7WNdTfFIKvwXS5ddxls4OCxIbdwIQ0B/kCC7Tn1vbkrNLY/DxOH5870LCysp
+YnIB2qQ14/V76M6573U3vC0RQmX2MCJh0rpv/f7nv7/98Natq4ijELXcEqCu
+ojrgUmfilR9CymvPhaOA10jpd6Tb6afqFHEQc1ynNeiGKNql6ZEbx9GinznH
+5egjeqp8mYqqVNGm4wx/0zq3BzNQCodprThzPWWwDsUZrL5HmOzprrdr5853
+3ntnG5giIduu9igvNNVkNRRIbfnRxZz/Br1waN1a25Ixk8UTJ35xQExCQY+M
+ycV1MpQZmDbtJdfUoeictE2gpgUiijqAacV+Oir6qRcJeTWmFIZ4rlR7Lf5T
+nBSv1Ki5GhkHFRSkljWi/lRDFvXd8TebxE+j46E6p7rKzDRMVS5WqdiPlY0f
+fGBLo+rRnRmCa89LYyM+N4vDCGPZ9dvXH6hMsQhWLcZFcmFnL0ylOpgM4YnV
+DPeKjVbD3KmnJb40Yma6u/My58RKBYevozvnnvfz3z+8xVBm832n44T3uio1
+8Kl0mfb4FyEFpsLBsN8f9hugAl598vtNMexYBkHIPi9AWZulahWJAKvxkRs3
+qElnZL6hmdiTJ0RS9ps18bVr10ZuDhwfuzljYFp8+h6QRybHBU5HIWqStYyV
+gtS2d96RO6fufMgQJOSU7mBNrgWnvQpIJa6FSBCiWt86gTXQOzs9TH2oOsXJ
+p2WZ5kLsptDga/eqIhuKKUlwgUbHXQdMHRWmtpSZ0jwbvRNPpv0OBjFDlRyF
+EoP3IDSrAXeGqKEh3x2KVDQS8A2ZykWTZ/0jBim2jz05gkGqwj4noecXp4/b
+tqi3a+VOPDf2Mx243f2WoXAZCNpCT091VU4OgilRmWaCzvJnbk/10fm9fBsc
+rV7hEAWkdC4iEk4jkehtvimA1DCKTlb4bv3+97f4s3+DZeLVlPvLVKO0sHC4
+0M3t7FQz6tLpCwQmexFzsMgiuGpmkxorUF6T7tpzP4XKPx6h1FybwhrvNGcf
+8WtPXoCqS+dIysLt+osvTt84fuPmFw8GbvJy/+YMH40N3Lw5MDAw9oBua7ht
+SsttWayCcu69c+AdaVpWm9MhuoNVrK6vi1unZIEtr78KSKWuWfsmjkDvyGoK
+dorBjJRT7HlO3H00OYJb65XpG2PNocLR+Eg0FGGdvaJyTovoiF3YiElIoFCh
+n5oHVM9SGfjBPKvesPxgWvO6JEEK/pN4yHwCW9pFX/GLdbV3Iv5OXNF8d5qt
+lwrH1KHZuvFVujYqBimnRu+iRz8jfurliujSlJcDmWV2+6OXWnqf5atxdlnz
+ymGmNG3gOncyz4PUweLcao4+fLGSN1ZVrY9BClBBIZDuWHNS829WGbTCd//+
+rd8/XPYbF7jHz1SqQNR4YUZ6vCMIAh6kAlqg5U68CBn1SapDEcEJPKlhD4Ri
+6jwrZQapUMiug+MlnH7szJz++hr5kJfaiL588hFSMRYepjDmV1LT6WuEowwI
+R9eu3Tx9XHt/VK/pqWsKzbjbzf7kyl5F+uzc6enNjUBH0CJIyV7rz7HE8G81
+6Qdz1qzeRkMn+zKeHTveakVpg1V5/xQk7tQICX0DY1HcEeLvhJp9uFaHh+aG
+IBPCuuojRqdH31+9UT061gI5DPxUhuxa6AYxrDOQljDZfWEhvycrrwbEUcPC
+GkNrldkX+S5qe/yS6dFiuTIlYFlfrrufBykhDPPFLzyVZ2wek7Jol2mp7Mzh
++PJfvXf5QUk2Flio+pW1R5F62yCFZTUISk5OBFErypOxwCt2mJIJF5BCDqkp
+eNNryBAY8N38zWa8M1yY8VUtw9y8f//mA3KIM7TxYrjwOE5/kFPPFw7GEKUD
+zh14mhwLTvAl3njG79TC/hgr6hRVEXVVX9y88TWBOmrNCQW+9OjrR5fOfKQt
+MHz5CW/CfIuz8ZoF1XMefsFzBs9+vlIkX5ACvBI+6j1txcj95w3Xn0MmxMFH
+7ckTol5BjVJ/jn4Kn7SdymkQpN5664QS0fbma/no7o1JuF2s9VGhFp46xX4a
+fG/ztEwMWGrndKOfAlQFrM3Y6fcsp4w2PalWA+YkE0mFs1vmSL2bSNP2cRm3
+PYR6AKqyJMoqM9rFyJ1gs9dLGeNVmWRQ1e4VRILTJQhZHHzZsx9w9rWx3O7t
+ZqbEjKNjLhibzfJ+mXZExwLZLV15dFNxVc+46p2UT7VZbAGg1HJCHXF6RR68
+3vCkt5yqNBUpUkUVcDVbMn7vHlUpRa7nKYolsqWY+ze1m55hQl5HONkxpyYJ
+mAgoAa+F8rn7nT+GIgcscIYUwf2GoO/lwMasFOMB1QMYqnOngQ39VL/iRq2v
+gk44/RH/3xQtIHWm3/zhUcFcutZ/7cOpS3ih9uA9uGu/EPXee0QkuuUFSwtd
+obzQxPWmCX79lSDqNc6CFXAXEuHtUJl6CyKdpD0GyFBIFCqK7sg0ew3EZ98p
+xHYrAFVLkx7Wg3KYlOCEvHLcEMgzplA9S8uTMgH2Sp0Ror26ylpEARMFL+aJ
+na2v6UKLLmFCOOz/5JNoSDZ7gaCJZ+rs0ehZYx0NaGjIstVOuZmfyHScEz4w
+7TBIKnXKBAtNiBlpwk/Jcp95H2vHYewgWapPJsIGOdC78kC3OpV3sLisPrGY
+8Z+yY+wiCKTWyw6B3egOUvhQIZTMPvj46k2Wqh7e4k//DddITsHrV+mQx0+N
+d2o+GYrd8fxgI+gLBzy1JpyTlakYpIQqAOjTYp/PHZMqYpGgdeqClbTp6enI
+0+PjsW8hUYeNvmsfnXlyGoU0bRX+TM/wUL3G8jX5ox9a3B9ZkRbRZlorASqf
+VOnlhiioc5c8695TpGDH1+ekvqIK5SjPg3u2c+E8YEdfqxDV2nqCDBAsprOw
+eZ0CU4xlsMVDNxjyNweIKmqurcDHjCdJxpg0VKllPftJVZ+3OqUePdtZu9A1
+zVWSZ9STT7Qxf17eXGYdJQxzoZIoek6+NmIQkIwOAT4J1I1IEH3u+AS9OETZ
+2adF5C5myOcU8OgcU7ws9perm2aPUHr5amcwu3JLXvdEcs6zKqV+xFLHi5Uk
+B7tHfMN69VDFJlVYvwfjvizF5DQmzTXXlsiyhXOPpc9Fa3PXRTHIVY2KxhCF
+uQ/QYEOBU49lKsBl4xlPg+6PDf0g191BF/AoBp/1XZ46HWl6umJkWIdA7//g
+9HEuf+YB+CExMyTH01fRWH39SA69/cayX3p0lyMRWcwZopkHGeCDJ5vD0Ekd
+2CbDV4R2uzWUWbEuGfu71NRXhygNa/aUgykUw6g732o9wQIW7wj9XE7KL844
+HOVTON7KDgtiD1+MEvqpbC5/2Vg50VCTd44VQhb74fv3qqHKaW9n60m/RNME
+qBp10mNKOcjIL48JPzQnT0nUf8en2ucE6HLsr7Vbnw1mMr02XY1VhXf6VVjD
+vuVxBYYJp7WzYh7kpctebpWb168B4Orl62OhysauMrSdaa6ZIkON4A9FgLC2
+cKiMF5dvZbQUMVc5caIQppgqtSBjZc/46s3/R52UNVLAl6HeTZUoLW4ORT0D
+MlmQWbnhA23n6eOg4wns9ucadfuE+7nIBatOBimDlxbcQw5UvDs1M/MFA5qB
+AWvJr5ntsArVkzNASkHcTz6S9vMSG4CKUO4nhPssoWO7HKA49XayarVtpVeg
+VKnWyZA0N+FVIuq1JQnl2+U1tVtMJ6BSlWrl6DuKfznWOPkFlzoU2MD9TNlX
+gWj4u+/CtdlBZAnInEyTB8uZINKz5+wxnX2kSA3bzS+zEkQNw8GRZ2+QIl7R
+jkzeRSPfpXc2+wt9Uo3SS9WamJheykAlWGlVVPSBGqnsipKKEuuqnH7quNur
+02zPfc2XpXj20S6UCkyJmsIboTur+NnBg17kFYiyYy6PrMdDB10bpXdMZfCv
+Tiub6m5soqkbQnb+8b3LzIofuh3CZffVl3PqxTxYQoEhDYqDdOWqUN6+ZzBY
+EgkarNwNbxFCDkdeS+7KmGw7DWuBeBv3qUmH60ofN5IKMd0I3zm0SzrnLl1S
+U865d+YJJeuJBDAszX5IAo32a/BGdpAqMkjtVJFyWwvoW1aulf7gUOqm117p
+w+YxouGiE7uLZI6gYw9I7S2iUClShR4oq60GTEF5dgZKqFMld7ABrjVIKbNF
+x1RjYyr46xk8e4y4mLSc9hqFc6IRBlL4avQc24uHZ35BWxfGclKqc/Sxiktr
+FrlzR2efqpS0xCpTSa5MNcWqVJMrUxWzJvS00Qx7yMSxyyrTi5VZ6krJZuOl
+4CXv38dqSmvH5FKWsaxgAWrWSRWfVIOOS2T5HgepTeZVtslYKbz+0UplZ9fO
+3rmpfAVxnKWbb6bcopFyJq5wlG5MjDhDqArYJQ940GTW8rOIg5Q0wpFYdXLv
+IrHroXdJVGHzlXgcVrzZu4CpI+MOUzMyxbtmbt3Yu1zjjFMAyqMPL+oIlEL9
+0aOvFEFzqb+nZ7DX9eUiEHZx3TsgRAGnN103FadFmITiVwsp9ru371pVhCJh
+J0XqLUHqROsJbfYtP8rG6P78gvp67KAGQFVzQLZ1CMmGDFJWVHTrr2xMyMtl
+DxunwPln8y+eFXS34+ICphrnUIXhXT948Vh+P1IkdtwFqbqAr2+0j+9NLKbw
+luwMODzF1uEXq1SmZn4xDsHDlPklnLPMIi0gx7bKXbaZYUs8AnphCLQa5E9p
+xTLST4i5Ktul72R52R5XoCxZTSb6ZWql5jIz62TR+cX1h6p2XCFv3bx2/x5C
+US56hWqhhuSNBKqYIbGJBhll1UYlS+deScRqlMHKyHI78BxtHjv4VL+sbIWt
+qfemx+muo2J1S0ZnvohQxfUP5SEhhpyBN45DrZ+jHycD59KHMFaX+q1RP9tz
+lhol7sAwtU1Jads8UupNXfi2lxsl9QrxpNztTevXbF+1U66dOvoMUmqplisT
+tIjBfXVybt7jK9MjWme3kVwg0FyrJaxaI7xFTUJ7QidkFZztIVED17msmrKu
+LV0M++ZopS4S2nLh2YWPprTcwHWPl4AfSKVTp5jKcPQFSlSlBKm6xZOvyYxc
+PLWwp0dHPvXftDNKi85975yZ36U4s2jPhdxcpyBCSecLDs815OGpnaoqlWDe
+3ScTlCIKmPbkefyBQkGEqdzyrLLJKQbGLUkIHx7cu4zS3BQON65fv04XxRaM
+HDSG2BHDEJfCVGtlyW4pPpGc/JyDr0R0gkHKISmo/QX7TIyH0s1PhSscdP2U
+fle68Vfx6d7Sn0lhMiSUGrhx2gVGkil+jZPw0iW7530oesH2INAu0HFAcWIK
+vYu7nkHKZsZvylZjrQwVlZ+65dVWKawWq1YbjSBuSqgySOkkPLCLnop19RU5
+j2dHGM1ozks7HY4EwFNJtoxWMs0Zo7KlEVCRQ4Tr8kUw9SKNKtVVCaaYFeQz
+p72Ak1NbR9dwraoU+AmlZxTGF3YWuvbcSATHTMUg5TXp2d5kxtO6VFb8pa0h
+f0HQzI2UzbbeR5k6Z1gyfac5ujCK+/gG9iuNRPN1ZGnzU22TlSiPNdjk2qiD
+pGAp1zihrDwLHWhXY2ZdXcVrs1oztuyFzVjr3dAERpBCuKIKFdblToc3/y8l
+xnBSnoKuW3cvfnfQBW1AE1Br5fooK1XuThi2A9NnAk+fmwSaRt2adHqrrYXx
+6cz0bl47fgN95xf/8v+CKdnmqbPi3HN59ZinT0yc3U+Vkin0rgMcerazvttm
+MatseR2ek8CTV3nhk3hqS3HVulWGKE36rJ2aP9EKO8Xpd6KodQGoJ7Z3QU+N
+MUHuFJPwXYRmgqOv0nrn7Mxa+UzRpbOONTjIHQQ6AalIO7kwcFsTFxaOnT17
+AcubDp2Fgg9KhO++w+6tOURCxZDM1fmcd+4ZpN62oy9TjKfd9tBPxRb8+Jld
++87pqy4F1bkUNzZ20RvsspgUHTkCnZ469DLJgG0LxiKtIBFcCpF17SfX26JH
+all5Lht8TXJhq6yYuaHlQEk6S+9dH+Bej/4bJx7tIATkXWqQqqUuhUsCZhoV
+LBGN4HM9t5Uh48r97lrnBsmOVP/BzwOB2HkoJgKj2PRIeobRnoisSPyILxRr
+wWBY+pUvBjRA7sfh87SLbkKfcPzuZP/EBLbgNOaopGy/eNu2XTt373bDGIrU
+Pql4U/e86l6KnfbUdWt3SouwY8eJt1SkjvIKouYpVweKThA3E5cFQzWAGWw6
+k5loc1BLnYFQWA4GdNxMiLMrvd0ZxUgNPl14UZVWViBboX4Za6DTv3ghv5vV
+cOjzukAdLcR3d6hRASnw6EtKXJWKlai3vUJFgx6b+C1uIYOoWTb1GM3cwHeY
+LG2dfedKXS76MmeGoc6KxEecDRoaiCiiPy/2+qiTYqYOoj5cf1IRTjoMXSiK
+zr3JlqakzDnme1889Lz1ILhuwhyw/RQf7623DLnbXUnQxnr2Hgcau+e5nkm9
+UrpVIuulAovMpz4Rch8EfQ5r6ZFFFt7mgo5JkIdCPOGOyugrxFMP2UF05sEX
+M+w4QFnRVt28OXYT84NrA1NtPYM91kvprsf7be+4SEfTc6LlfIMYIUR26181
+pLYkHCrfttPSP3ZI4VJ0ovUYqAJXgKqotQjj4VVx9fU1mK30ZYxm3PHjWB6Q
+2TBrWCY70IlUCYEJpnIuDH71JXKk+ar5rB5SI/snvv/+LCO1hWcv0iaUc6cm
+jBGf77s7naP+OyGkfbUGqVrT6i0ee7E6lW0OQU4/JVDdEZ7kP0Vyu2SeVBKp
+phycNi/OaVKWYT1eW2kT63o2rxyPYJBaUqxZn8D0rjBl2Y9VufWo7ybVwKFC
+AFK2Ks+C1VWJvzMYwbjVTpY/A44zCKsiiUSolf+YQSpGOZkIwcgFa5o8LZ6D
+VMBBSuedqli6GSks/jafExkDKUuPiT+S7vL5eDcTpV0fQIqHAMFkLhJKUbMY
+XPTueu+9Xe+BK969w4Bvp3Qtb2qFjw27fWtyJUI4+EoRpTSjvLLt28xfeMdb
+J1SkWvdCTEF4qqmi9SvauSqRW18jgcSFo32n0olVCKizCLDUDpA0Q0lyvGYj
+FiRfPt37tHf//Iu0wZ6L/QWX7n7/pWY1L1486dHaJe05XwJ/oVIkI9/5zE1f
+5Ll7qHjWRP2wn9Imu/GcRiYArYr/S8php0b/jV3xUmI+mq64iEp6+PH1aTVT
+dEhsUBhr7jSysSRxO/bordanrq9af0jTmL/WJkPLXOWV47elurvFQvHMv+hO
+H+/3ICWlr+2pu9bJO/Vo0h13ELSZiyPI1WCpcMUGfganoAcplOqBsD+GInch
+jLcyFTkV4dIHqMz4lTS1+A0g6wi7XYIUKrwHN4VyejumzCMd2PEPipYSorZR
+pDhr3lQ7pRdtQiWyX5W7Jjcx9fVXiqkPKFOpyfwnqFBBTbnmHBpBTmZ4JYCp
+N9cmovtorAw098lqGB4dnWfEh1sCvlPSsaCSCifhkplX1jNx9uiJp9+icZvH
++LrnGAfhV1+evTB/secSSRrDleppw4EQt8dQcyHKzlFRnfKeqpNjUNIPIGWL
+WK5Dz44deYKUitSss8mzEEgvjyMWY+2Fc5Te+3gASMGgW5miOV+kERK88cy7
+m2wTmZhs7ntZ3cQFSl1TOztyD3eWh7dvLb05DqIyxm0B3R17UZWaoNGcxh8E
+w3TsQf6H7DRUK+51T+I97Sw0Exd9JhxrpYIOUlJMxWPD4XZIjbcSNRU5Fe8O
+PtkfxIOoDEX0Zcj9pTkqaoF9GUnPiX4YGW4rUJWyQ49n205n9qodPiTn+JOt
+fWOfLamvy93y+qs++jYlrjY9wi/eMhZhngI1by0VxrAHdhZB7ld3l7F2DhSY
+9jXTUjVrgwiPIBQJwIRBCz+gyisg13y+9fm3vUULC3tJKaI8XQBTzwe/+v7u
+RH17F+53tSAqlNGZEWFwGDKhMDsyzn9K/dQPq5Td+Zo06qtcFHkasmZFTz2W
+5f7S47FgURey5sWzL025d3sMr4WurvrJemgEd/DJDEmzGYV/vasobZaxNjGx
+OVRf1matVFMSrdSAEPXwYYq64xkhyrMwF3Puc5OYwFCskfLeCVEGLnXoERvR
+lKhdd6XIK1I08L6w3zv43DoNkJLoyqNC0/0UKeuneM/Ouvz4kdIciS88pRlg
++qn4U/EZ2rw6QpmKAqn6gmoPUqvQ3u2Ucb6e1SpSb8pKap+2quR8IGmLdqN+
+8soOv5wV67YJU2iFbSBzQsefKtUJqbqKVq2sLk/tyq4McEPDt7YQSglNJhZR
+Mp7C0qVSZkCs8aFRoki1nn96/sACPil7jylVdO/Z57TssPBlNUCqNhzkK3Tq
+1Kn40U4LgBCiAt7BV1vnNVM/GPbZiz2z6tysrapQKpa2Zm4cX7aYF7R5cUVU
+enQk6PIp7sIEPZWTz257ssvfJCW6WHP159pvLK5aX16fBaSUHJNZOTdz47Pb
+t3+vjIV/GZ+Bz44PZYS8DtrZt/pKgt6Ir9b9EA46gNUaTwV8QFO4xAhyNzhO
+d52UOwHVRVlJiw/IKchBSuRUukck2LCPPirDfM51CmYUpuMpvEHVypb5th4h
+UTvAIht2dzr37NkVK1OaxhiidpupVBxbemuYyZi45Sc/+clfvKpbX07ium3W
+o3twOtpqD616ESffql3VWQdxRQ2jbSkEVnQXzYW+gAa+xtCEhSkAkFc20cN0
+UNVtYeEE6gSliu7ViO/ihWcv2jvmdPBxX7xz51QGg2j5tjXLEU0nnxO4OCoh
+M+kHdUr0fOz0c6gCVF2zXbNKBjnueE432/NsXaylun773giOV5x89Xk5mhu7
+026JfWgcAtlqJ9dreSa3vHxLDUQsyzvcM6bv/f727Xv3deiNa+5mdz2nFDcw
+BEUZ1AYWG6kSEyGYwIKaLVSBqbA1WEFfyFOzOEiFAVtYP+hNGI04RFlTHwFS
+3vz4iNekx1tbJUi5MDXz3SCX4Z8IYs+IQWqXg9Oud3a942GKnRhmtrvfdL4/
+61Sq1sF3LjHS6M8Pqb+ISfFSc8HUgXfeMURZP2UcOsyUILWxOhkLH8a3CKbI
+l9mKdniIw+AOBHJ2WIgKo/PMzuQLCKRaDVEL5+nTjx1bOPocbyAyagqe4DDX
+CEXq8xOglQF7Ht/sfGFoSGKIirGd3t3Prc1k2qUytuBQOWuDZHBldcrZs6oj
+92I4nPVGaem929Oz7Oq019fk5RRv2qKAS9eYG7w8eYJEU4nJ5eVdHVPyysqc
+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
+7yMGqZiVJ3oWvXOQMibTVSnvymfNuddMHTki3dSGEIjiroygU60UBCdVSvzB
+G8KTUQiOKliy+DCM2rNHbdX6fRQpFrES1yXGyIS/+PHlU2wzWIKm1BCoz0/8
+wg6+XwhSXP2A1Ds7drxzgC/0Rs7mPL4UeYJUXabtrqulglwaLdyqkZ8c0mnU
+tUklUpxU2m5CivZCRpw///yrrwb7p26MXe/sw2FjdnhgpO3u3bO93/J8+qmr
+Ur8+/7d6hzK5l5aKL3uDo6fq3lY7FdOkS45X+TIOyyhP9gmB1LAwBaSoUsdp
+0eXo+fW9r6eHW2ow1RCkmk4SobyEVBH8u7YU24IDM+OcRHyEsecjLw2DGvDk
+i0S9yrT4gxOW+90SuhUXv2ulSmwLfSgmhoq8dNXQ3NN2ZzREJsqXW2TErn5G
+O3jZDRCapnGwBt3KVLy4cVewdOE7Ype+DSZEPyKhp/Xm0WYmxvVSnffuYk6s
+LSsHqW1vugHxnkN5XS+Jgg8Alc5BYWqFZccQR5To3ft+PEj9xJNisS+SyqFH
+cwf1KlHnW7vfUn/+1glzWZR753s0VKyIDW5MLM89dKisrIxDokmQcgSVMVTI
+M0M+bKLkmcA2ViGb7s21pMYU5O/f2/u09fwfyTC8e/fD4zfGHnR23mFzebpj
+8tHdL798/q09JGMBq/ffP//r98+f731v167qepFULRrMuMPv7cXNPnv5Qbqo
+wasL9fCVK/2K7mMPd/Pp3yw7nsJ230PKIgdeff0e2bZsatrUdHIJd74tfN8W
+C1PMY4BUfTcLZS2V2cHOsRhXUGsOBz6nKQ8EF0+sSMzJ3DKK7dQTvVkbsl9z
+dgcCFl2UkATeVKL0E6tSIXX7ttP+0htWwVh+xzdpIBNyxLnXSxmc1EmZSuqI
+XfzkbzUHnSYVwntube9NIq326U4nRK1Zc+hQ3v9ypXtdnu+0VOtzlRkbp7Qr
+rJa7tsRg99MfB1ROfkBCwwpxFkVvOkg5RO3Gs1PnHsiyDr21defgxrUbk9kk
+wcw/L6/BTDCUWZwUZg8PdmpUBSrEqafZQro/wjLJ8EhHO6NjtC3Pv31Kmfr+
+60fXR2amZyrIphlWcNwgTZaOu0+fPx+0evX+CR1+XAagRemnbPyjWXLDD3TD
+jE2yX4o8SxaPwdmuK21TXjuFn8FpqREePvzDwLDc8LbveVusAY+OAd6KnUFQ
+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
+uBMJ4fjhpc54FOVz61BDVlr6L+DIZrSUGPEOtJFvXFu1AQkk/2xGW6xQg1X8
+hfZV9nRXZ7Rr/XN4WVgKBLF1PCiQoPSB6CF/k7/9Z1XkrwUmgkgytwKeOgzb
+L91LZawQh6APs4dHlExDZNOOVK996ak9WBlt1O8v7wOaLs/pfDQzCJhLGruY
+jTdLK6tFwZVWp2/Zvs/HKHRCb7cLdUo1yxUnugWzRyqDT9y92GzzQYbuFc1z
+rHBgh1NZShDNHc2NtvaANNU6HU6hWDev0yzycNuCeKKyyn52HXHgiXLgDfUj
+8kUB0dxxt6SVlpbGz4ilzEqyyfJV3kXCO/n1Vw1IvjCmw7w4WWD7eRus26ZH
+ydzpXuPRLY5uty7vA+DFDFxdm4STAkzKXv8NDQ1hVif7t82WkmfJiq3buoW3
+IVMp/UPHjxy0P54jd+Fv0aaHQ0Cg5giFEQEsX7lnlPDloH7mPlc0XA6ALboO
+wCxx8vLGwGLSJ5We3dReeXamZWQETR8KSUnBAkxWXO58q9qzHxUuaYHvbQhf
+oKtXsczm5FSkSNUY0GoA/Zde2VpXwlqwJ+ALZC0+uKAB2dyg0nR9VT54Orh0
+LGGiE9WIPWqmNkSKDVgIt/7aIF4UY3KCBEVir5zvNaq0rGw5L3EhU6EilTAJ
+Mjjol9v7e8P5Ypn8zKY8L2a8rKysvt2rkZQUjKIYaSpvT+YJzRP8f7cIkd4I
+4cKgmPTaPRMTcAmjZAAIAcUWGQ4iXpqi95IFD8Ho7E/jym8LJeiy9lfsI25R
+HEb6V3uOqD9/ND+32Y7+/UODg1+u0vomM/+Ja+WXZdfMQif2KDmFaoK+JtTJ
+goxYA2PJNHUm4xjunbrclz1gnxWXkv3aU88IH3IJV+DY5hvU7qUuFxfXzMpK
+qefs0QlTsvlIk+kkDiC9DMcui0tL1GVs7zHJJLdzlGvJ4/tojSV5eV8+N2Uu
+jwpiYTZf7iyhk3ZrlZs1gVjeueIANDKprbV6wPgXBVDpQ6d9zp3cd8K/zayt
+0dzWz137eLXjDmoZYt1JUGIq5g6P+M1b7Ywqj9JbE7I5tsI5euC+64OUlZGB
+8iIqauCOHP4VB2uihfkjiNFvIV4CJS/Z0xSpArpqrWoxPzk52XvxQLOtFJp8
+q9gEmD9zsAvX9jqDfohMTifRRZDT7et//6yhh0orZhlRJ76+/muYHtt6v28e
+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
+RNDntTerjj5ZyooYVZZYdtdUVXYzgEJ23Ez94PC6t5ao+7F6PdBtG2KQFIdU
+/KV5WNiG7PpPTPu58mTZUR3zPzQUqCewngGyuMnt6GW94eReAROsJ653Rtqt
+Ti92IBdSlaZjnNMH3fvb+mKWTwf/NFqJiImFKerl5Rn52PHmDK+vZybMzjko
+SoopsMdib34211snr+7IMdvr2naMvehKUTExMvpfXV0lTHl70izvj6cWdHbq
+0CZF08WG2jo/evP+W6kT+tz0ixfPraiQEvm6EFQYIaulhft5bxLv95scTGOZ
+JK+H5T7ril02mCJsCHunlzffTA4Hwfqh1F+2hXEAw20DXudzbZA87zcpOVw/
+ONnfq5Zkw8bx/cAsOtO/zCGGVlML67Tr8Zrar90fiYlSDLshmLo9gwFf0H8l
+KEvhxRe5ftKbkpJSd5c8pta6XEc4B1BM6c5bdhHwOB3BSUlJqesKUhXqLVAa
+EmnhjTmqH5hbD7O9at0udCu1WxWTIqG8NRlFq4Wy6Fl5eKrQ4rFGkV50m6yx
+Xc/XPdAnFHSz1cJ7JYlSx0O8zls/2+j7Hh/dkT+abABKJUaDyWtsRAcscQ11
+t5GPL+d7a1xeZczaAuNJpzCIvqUlTENDg6Sq3remk6gPrW0mnD5KCn3hOp3f
++469KSL4XVFItWegeCC1kVmg86u0mxyXXAgYm4JbV6gjMPzqptCcWRlx1N9x
+2awf6T1ClOdM848LxGsXwMnSbDUwPnughAsUXo/E+EBBRCb/hs6Uce+/cR/B
+NzU3G6012Xy6k1qHXdHeCLTQmRyM2KDT2OlgK0vAuBeuJlZ3r8zM+AOuxbuw
+t2rgmSw7Y3z/MrnGWwQk7uNO7+NzacPo6Xr/c3VOxOhra2lU7Rh8c5dd+cqO
+jS3WscMlcX29sf7mPIlc7HPI2dmZua1tl4hLyg1emyBBKHSLNMhcaNxgdMLk
+2qVgj/BsQWkVNHF2lpA1dZjbNEIPblmY8/WIVEkhQirKHSB6n7e1jDg4ODBb
+wUmEkGR3j1z195zPA1zdVQ8Y4gipWMznKph9+wbwlZaeLsCVpZqEqJjrDEof
+Iu/2byWgJNsTRqvZFt2zKMrX3wcHzqjVbDjI3dAQdH5+npwO39lTjgNPV96t
+fk4m8+hs/sYLsLUDqd2v+wmaZp71bQoLHjFtcNpPnb6aRPFyWQYLmCBSb9Xa
+rfm3+2kq+0GfS6SfXaBjhM8yaxxfv6Re8oOIk8+XXj3J415ieuWn2RrDeOwR
+E8GHO3tjBMSFz4u96AeTiJs5iWM4+uclsAPGCPDdn1cYZXtfS9Qh/fXlycsl
+YOaM6del3bl4P7/Y+7zhDTCNnzvjE7ydvLaeb52fK3qJcrzhw4R+2mV5R9vX
+JZPzub3LKr6iYmJ+vtd7Ekc2mi6bFvSpQmQoyM8XtkuvSTVf32oLWQRWRD66
+B/F0VQoeoRmjnsHImsRxoJ8+dwwAJ6UnL3ZxoC7Swwie2QFvgWOfDlo1GQ3l
+7mPfyj1CFAkKrj+BmrDNjxbxawOQKg8rXaTFx9yF+NUBlQrV7XgxgrLHdSZt
+mLD+z+4E8ZL56xK+t//X0VUAtbWsYYoXt0txDUWKhJLi7lIoUKDFSXF3dwvu
+FPfgLgWKF4IUdyvu7l4KvORlMpOZTObMZnfPJ2d/YX2fjgO30YenvEBgXgaj
+QGww3GPDzc5/cK/Rh/DYHgS+iUfaNczfJoXW4YJdZHBKfrNZWLh+kR2uFmoE
+geVQOOIp8sOAALgWMzGRDg3zmmsuK3tdoVVVnmYyJddm3CeGJUnqLZspXphf
+PUf4/i0a3Yjnf8RSPUDRUkjdHm7yFj+BWR19yul/DbRXcPpm+7Z4gxK0aH77
+dL+8J8r858+fbf9/A/6IuEXTp7PWI87CaUu4MYyYD/rvnVa76v9DjRNz3aCl
+49kGTDNra3F1ddxFm70AnJ1OOHbap8s7ufrI4hq34K3ClVZ+YOArGZ05oedQ
+GPhHczNXOO7KjyPiAPDrNEigDx6Q3blpfYF2nac4n4jiLQCHHowEDAlhBdhY
+SgnSksncAli/pLWoxal94TP3JHOs49BtCs/9t83M7/v3x8iOk4WFxf1cb2+v
+PwQGdnFxCb98HgWR5KLFqeGXtRTLysomC1M1/DVBPA2SmS+PLQe3l0HUXrz9
+/V9S4JpdxmVO4sUzIdj+gPrEzgmAixEAwllAKkT7SoNte2LL72+K2fKxdWEI
+CS8kq4YzPdX4B50RForDJVCPdmbRq8NgZmYmLz8/vwCS8J+ABhe4IEBYhpVp
+rlKbMYQAbqwtLC0fRDtosqfyUzn8SIGllwYLEHDpXNPM6EyjePpxaez47c8i
+VPtp0OTaWk3aEw70AG1U6bNvblebptRYpvxwLQFWqMOa712+8eDUw2si4Ha7
+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
+Ydi5LuTbHdmcNiwynL869fITc4R6rPMCPvryczWoU6QciHiyNiNr89SJtzPK
+YHfxJ3aVuXW20UWp2uiPqI7Yasu9I+Sp0UBX4kw2j6PC5+xlV5RUpbtNVkht
+twuDs/4uDedjSkFllDLzrduYPljwSOhZdLW83o4R19mra6UZzp5xH3/FEvNb
+uhAHokmZLbxTkSX3USl06alxjxJIQrec7APOn7SXr1MTdVW8WyY9X6fMrUra
+rp2nbaZxqozks+m4upGtYKuxnT7buhdIlM1vq1FApucinSq/brXuiOZE1GX2
+Q93JdZcRfk9K9X4/pdY/EUTaS136PImdeUwqd9c8gAFG5VAbd0VKQqyQiM0F
+dryQnZcHECP5Kg/Y+VZrKGwrtz4VxPX28W9JB2LyNxBFqxqJuuC0SiBOlQfV
+F8hWwDWSSZyfMw9A+Lrzj5JL8WyDbtoiNafYbx9M2XiR7tTN8uSq0cxAtCpN
+6pRoGM99yoj2sMTglOYZVcRlJo2e2aCO588ogn5gF/181+p325Sfu03O4vtF
+eOUudRMgLqYE+ZYAVLjOODnuygypm38U89QmbImPMdKdrFtVYZRCZp6tGReV
+g96K9A4lG8PZizI3p2HbJC91jL9kIlmTL9qT4gEY0VsMb+xRI88hxHJ75WJV
+6NYT8jtyK14A3yMfk+w2WuGW7AGhSMerznC+11K5K/R5eW1fzajV/Xl7plii
+W1M2ci30bnChiHvkt3pX4rHOd9QtHqtpLrTbSetTb12oiuEJEdpOs8vC9maw
+tZ4MWnMr3XbGclGaBo7bviyEblDF0rmR/ILG5nPNHBlN7MCtJglWSYwaMV30
+Z6DFgnjePre5W+uxZCdzp5l9xVfJWgRWGA2X7Y8PBq779AHgnHzQq87PwouO
+kN2es2Jc+pzpyB9plEbAiSVxnayxTMdto1xn9/tJ1cKvOPyXD3e7/1cMBHhh
+h1x5pp08kn/ePvjVA4a2kOqsSvhrB0lP024OpxOuDRGM4gGFnGLj3xdAkZam
+MCM3B1vy9lC2H7fRr+2OHWGx4yDUqx2CGdvss5tDV9pE82UqKhyjzzoFR3OQ
+AtzEf66sC/2L3eNijrTe/a/Muv7rd1ZaOM4+XieyDOGyrseqvJJ36dcc4/wf
+AvFOJukH9tHPn0Zn2rU/zG/oYYxX8svYa99b2ybpuseGQsANcivo+yDn2k4w
+7mOMvbyHLwI5/r16jAar41RJZdbd956ukY+d83PekP717rSD3A1nFBnJi2sC
+F8ctOmJ24tzv6CFLSN1p0D/faeskoUhH6dt6TGkV0tlW3YoYzq83KXCnEm5u
+dFifqk2FTDdrbAYtncm5fhZxqiK52ukDP17iY0qaurvmRQWT+91Zpw3qNPhw
+SO8UyRYvn85+fMzO1WTItM4QFcRIPhe23NMbt1hI3JkqjTbibhRRsuCzM+Wb
+RrTpw+GXKRJmqYqkpjyjn1ZFvNtu4cBTEzXEQymtdpsSfVboaol9D0lfLXOM
+PKSh2IV2jM2EuUYo0rFKQwBc+tYHfE/UBvnwwSjtaxVKBkL3kZBPpVoG1Drc
+TxkxaC0Rl+glqjRa0qQZRI9rL/uAkt6lB5qzfSlkvSKhw+UrR6td24+ONx61
+/sbnBixztQui1Qym/jY7l7P0Gi2EuCrYvZskNs/A1x7uGwndpYIRrVNksWBX
+XcElYG9Sgg3NnAR1kbgnU3mqAzlccOly20XuVr4VDP64i02QwBK2GIToguD8
+NruWB09tck0obrEMl5uKkSzzkUKoV5GuVdJ6rdEWDiGKgWg7Qtql1vbqKqmW
++A4OeFyqVifORrRR21t+fMfcwFpOn2Lyu4hJtwvsssFDPGAvnZXqHT57nKZb
+uvuE0OGG9KwGtHPBfKnR1NJVqLZBeaRDWb648n2pAo9qB63mco0Fy+cjtCm0
+dyplFY+iTJHtFg+4V26mRTkzxM0vbcPmXJR4lqlTZVx6dTScsU6RakcBMpVz
+axSponDWy+Qd62pXm8DlJFCkb2h/otYM4fFoePEDwWdrdAhqf8A26YmqWriq
+0UEKlFJXMchpFjtKNPcsOK0RMA3fVZlmED6DsyBY0/4e4rSWZtHOEP6xhvMu
+fhCnbqeW0dKLW7Jp54cc8+zzBttaFmb/sF09tbyfCNf/YCpm3y4xdUooQqlR
+M5I1O26ZZsiOPIebbu9+eWh21mMJsUxLhG63is5CZk5rUrdEhvvGZqIQJL5G
+yTSLUeMLT4Z6pkWvpq7C18J9QuqaaDF1itwslNPaDiUczrioMGAGVaRI92kk
+385abbTw5MdVD3w2k751K/zeNvC9zDdTsAj1R1Saxi1sL8CqxNYG0AWbHJnW
+q0qTowPZlqtJLQRhBw3ImkV8e8FxdotO6w5h7JOpkdBP2qJCiqnruj1Ii4+o
+k3hsclnI2T+oukmd5rQ6NYnbfsXw0lUGgwuTMWAsZMHTdRqclVXWpGGd9X1Y
+1IuUTXLRh0RUfkei0GI4NzKJR5+49O08vyAFv6obM6nAUnPR6222YCNEWhqI
+94a3HunQHrGS0uAygnUmmhsSsz0kxZ7e2KNI72spsMwMBy3yQ6FIKxXbpdc6
+KtOp2Th3NKhT50cmTi6V+/YO/iLEMZDvI9echckvS6YUuc1e/IE0jVE9c1z+
+GkVC71cnToiNdFWGGM77LdfXoV3vd+zenO09EwiikQpY1UxAIlRANrwlE8K4
+YUT6iYmCh5TEwmYePNJInakUDOVIWwz31MQVx3o9N2oLF2eyHf0iuh16kr34
+qBpden1uy7xNkdC32wrHuCWiWUBhq7THuAznL00ZXLPTsSN5Mch9djVJJnvG
+KP8bTDJOj9Wl+E48Y0CO1bMcbdpgr+UKzmU9PfyGdeTYy3+LhCzuf6V2Ab2M
+kaMvQ6lTznrW9QPnWx7ilKjOZJijO9vHXutFd3bbxVnBBJMWud/JOuDPoj67
+qw/qd22afO4O+YxvZRrxPAHsZhxYGe9hLZdEAv4SWB9PZo3yF83wb5in9kSI
+ABQzGiIeMzucP95eHGx5r2bl9B4r4qtKsuzLckpM+r4Iz5r3lk33Dob4/SAx
+4mFFQm9RpxyBqxAfCpwkrgzG1FX7RT2H80tTUdYsOnY0dd81KmYFuAahlaw6
+rU6TGnWKlqr4oNI1YVmINoiLz/mZLZdYsn40GCujHGZBLYShR7JB1KqmI4bz
+SW+52RCt2lLQ64t4I12u7dP8vm9YX0HEjORPNsIcZjZknZgGdWohUBwp0osZ
+N2GFuhkkDQqIE4TQr0KwL7N11kC8SwidrUpA2DYzWpAOtOPCuUvMfHXqdtT+
+e4nEHOnRSL5mkY4sN1m367uiK05rrRr4hS1ylfIMv56u1tkeYN1XauqnlhvR
+1mcOAQ7nC5a/c5vmh0LoRvnUT25mPZTMqz4FgBo99AG9mbTGbvaRY5JX8put
+bPc4YFl+NzlWs5uj2cPRwAnsiHz73Tc4//d97KMvw6zb1fyOXtyM+0YXGuzV
+/AR99ru7mWAZAr5HP6tZ27aI9mV2AbvpAV7Jv0wvE5zMMYiIiP/Ifw9NePcx
+zh9r3FpnH0W2efTjrI3XAUvpY4J9wHURwGPJ1PBsAs4Z+Be1BI3roeXzzGGh
+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
+ABwAc2lnbm1hcmtlZC5wbmdVVAkAA5QCjVaUyI5WdXgLAAEE6AMAAAToAwAA
+NX0DdF5NF25s204a27btpI1t27bV2EmTNratL04aNbZt35P/3ts2q2u9fc+Z
+mT17P5iZcxqlrCiFCIcHBwICgigjLa4KAgIqCfxAwkABn+TjK7ICf0EZy0mJ
+g3x+/S7oKk8BPoF1lNZxAQGBR/v6AZ1b938DPoR2lVGQgF6HJEQiINk0vAc+
+IgGRERdR9/x31uWR+mPJ7/C57TFMNjcQiQSGjAMNnTpSpZ4+qdlSJp1Shw8p
+WeC0yWOk2byLCLqqqpZNMJ0hISOeLyvNTzNZqpk6AZPeh1oHQyYJg2aOQgKM
+BDQYAq8iiffwJJppzeMxofJVex1COPGX4tGjQLmiW0+ld81Jt0/PY0aAqMWM
+PyQBfag8qkQgIndWtFZfk20JljYtpG6RCkQ6WX0lNazoamCv8NG/hj+fNU15
+Lmv82Y/as2smNfg190akjDdFYTXz6nY/J9VRyAoaENLnUumxAwk4RSGoUQ1L
+hTVEYK9ss4VF2j/wGe9eD4kdXi6VEg3TRMf+6cbu4fMHNaNq4m3SzZ9ICkfe
+iOga0kFq9KagfUsppi1AUZ+tDmyMW8QrtPszCmpXLBGaHD3THCkeikRBckh/
+wRMAj5oySKDKLO60MoCu99ZyCt8QPyw5Sp+HONQY9leQFFWTgnqVkSSpgbL9
++3fqCfl5Y7m1xjjFUlwGDZKUPl7k7clv7ebvH/jRSjfO46spmHWiiWs1YUMB
+f3yDhUbXxdQNTGoecRlIA21t6HRTr+BJkWbyQFWsZay+rQ5rS7BhSf6a4sCg
+v2pILqoMrhX+Hkkdh8KZFKmcTtbIHzrDLUvW9FMO4dY/sDOwEWNBJ+AYggqf
+kDeUtchaq66xaDKhtkliqA5Vt35DZlb3Zgzzdi+UxIBW1ZFBNtfmJxae2Xfx
+YMjPdyGPO0H+XFJKWl+zJegUjbqJpK8OHkYExEHfXh6OrH6GGeh9LkkjJm25
+CXzHM10x0RuWUEKoXYzWPuRephXOAWfQ1cUlh8zmdLndfifDfWjz3FJwWMC3
+oDUVSCAjTatGuvC0uiSLV/vU6w0RhrsKfBS+3B3L1amWvlgii71G3dItQPau
+6Vhr8LsMr2ov5g8RZFPQgttrz3NTL4aZXchM3IG82oXORzXy4WqsKp5bbBot
+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
+ex3lnxAZRYGbhtTrKyvPTSnflOAYCZNKKyand68LCgq2KtuwK4tUscP1Kun4
+RN1ViXbhmTp7N/1f7VTeCrvt4FYQBwKBlPr1qzcEWZD7wqnp2BWvtLQUBiqk
+aEc2GPdhRgArZns0ifxpZdrfXQ904+twoNDrWYOlnR1mBdbJjXSpKgwEGM+g
+cctqnNvpotH7y/0Sv5Y3jhrHMpHs/NVvKWI/9hoiJQo01L8Ec2clLnAQYJdw
+Maurq/DIRPyR0hSiDYbOo2ccHBwpeP/cDiZwc4QC9Gdc1+xbcHYkf0jcjI7N
+xw8Zw4SJRo7sGkNNZnHYOE4LPDKPMCuSxRJVEShgG/MWfEtWNoNEi4DJYBgX
+VVFJmhFL7a3m9fBk79++MsjhdZNVLz7flbIyUTkc19bu9GTpuOx+3br2JBmv
+9/SeV/Px9MQBtNdAErkUlTpjWaEyRr2Zix5Zhqy+FgnKz5nWf4A1K1GlES9W
+YaEbFuQSBwQxqtP1jkTn9TD+cp0J9MPF+niNGYbH+b8wV15EwC8VFpIaISAM
+BFafAjxYtFpUWgr5dYa5+vR8LgejI8I0Q2r8EeF8cVFTsaomSVo8toHkuCE9
+HQsQduXnAbcdm++Kru0zSaNPgvnI4+kMHdte/5lsA/KdTMtK6VB5I81cU40y
+62Bu5v3EvUPFwECIDroclE1cfAf4yqrgY9v0fmj2mCkaABgpU8Xr1OENP5j7
+mkwCrX7yaMhaEYQgAlREazrXqV/z9GOPBTc8CJgyvYZf13mPndAd7udgCvHk
+JhIYGY7cseDQw0IK92la+tvT/LexymDfTMyWbopFZdzc7kMXbwGXH7y2urmZ
+YMpK4+1Fs1fKX199ChMx8BWRqXyhBIs8r3BsbOwQlvAv/dvTQ/w/jFxdlWiV
+Pu3lwWY1qqyMxncbisb8kp7hiPicP5a4UQhjIfCPJMtRuPLxYvf0vqHBIiAi
+wg6DTQY8vL5fJq9+AcuTR8/reg6P8F3B1xIqI2Oea4QMPRY6nEDjJ01j+Wto
+p1q0JfUgUpjoT0APHUzlxowQB+TwhDsFHx0dPS2GwWNDtGWHrwD3VcgekbYe
+KrMKtshPpGph5mYPDf0TKIeQw6LS1q2P87UbJ6MsJSkpOaiQLU0BwIiyunqo
+1+2B0fFcqZZfn8ZvzbryfP8sKTLU2QmH6dWhXafG5ub41wb7zW7Crq6u/tHE
+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
+mNg4e7zD6UpITHInp3i8qWnpGZlZvuyc3LzF2E4qLiktK68YVVlVXVNbVz+6
+YUzj2KZxzeNbJrS2fbNt+46dD+96ZPevHn1sz+NPPLn31/ue2v/0gWcOHjp8
+5Nnnjj5/bPZvJnZ0z+3b8sKLLy1Z9dt71718/JVXu8CJk6+/cWrthjc3bl7U
+fvqtSW+DqQsW/u3d351Zf/+sNVP680W/f+8P73f+cdr0GTN758ybf8fZDz78
+07k/n//o408u/OXTv178bNPSZctXrLzzrrtX3zNitMmYyl/DZvgySkCVaC7a
+TtFUEdVO3U3tpF6ivqUldC29lf6AiWA6mC3M96yP7WA3sicFtCBdcKcQCJOF
+K4WvBaGg2qDNQZ+JEkQNoo2ij4LFwR3BB4M/E5vE08XPirkQT8jdIa9IYiRz
+JUclX0uR1CrNlFZLW6R3SN+QyWV5sj2yL0ITQneFfi2Pk3fJn5V/oihS3Kt4
+RWlQtit3Kb9QeVRbVB+oy9Sb1Z9o9JoWzVTNQc0fwkRhLWEnwz4Lbwx/RRun
+3ajdp/1E59PN1j0RERYxNWJ9xF8iiyJbIrdHHo78nR7pPfqt+neiGqJ2R70Q
+9QcDwFIpz9BlWGzYbfidkQ78xRg38n/fmlrw30nTP80l5mPR+uG/2dGLoz+z
+lFgOWlnrXOty633Wh6x7rAetL9nUth7bXNty2322d2x/sn1m+6eNixHFqGNM
+Mc6Y9JiimNqYlpiemPUxl2JbYr+97o+7+S+uKG5r3Bf2OPznsW+NB/GN8W86
+5I6ljr84I5xdzr3Ov7hiXItdbyRIEmYnfJFYceMf5mnz4EVkZkVYyugBUNgU
+HqsLZkMfdCfpoYQSUErWbLKmJHuS1OfS+hlRUJBIpSqKSMlWoUiTS7onx+HM
+yW3Kgd4Q6pwnJ0TsCharNcmZ7WPvTL1a5szNdcbn5vJzR0I3ondZOZZs2O6D
+boEEmU02H23ERxR/BCN7vOqSeXkWNqHIZnbBSVO8Mnfh+CT/uZOVP5Y3r5mN
+njtrcs5jCc2jk/2H/LPNg/9k+phWLKOwLlZ4lYzH64M2jztJLWApo8frScHH
+eiSB+NSdjgfnlTBWgRmfjzhjpVDuNfr/Nwm8rB5qFEYTVBipTTboyA8WIpQa
+Gy+Wymqg1K0TpsbI1CKGYuigMe2e1rIUUbApNjE5LS2yRegN7fa0lfMtSSm4
+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
+PT2dXfMyt4+rEqhZe5KpZolv7+qKzQvnTeualhTHfXXNRcVwtXAr2FeZAlAE
+asjqCumTnx9kfssJQBoWG0FEyuF5jzAFaBZPI6AhOpA1++1SOYh2J9F6KJNQ
+UIElIQpV4mlG70ULJsiUmZXtruLupElP/+vO1onmGUpravLcGaXbuL8/8SD3
+5ZvzIDonMWeo7NvnvrexYQek4LjnHoT0wY7Cmfdt4L65S6w+PLgocU7K5HGu
+1PixDZ72LY1boOy1Xn3LwNvHfWnl9351369g6K67LnLHn+G4x2Nocf+it2DQ
+6jdgLwze1XXoEveXfz8+zwtno17EHea+v3AHnjcbAKBZphfbTpi73Wboo71K
+jUKtMXusKchmpNggaLQi80a0R+PxxRUESx9goz6HVLyES/0Gq1g86+4SF9In
+XDlGqZjKn3Ll46rRosRgmD6GKxDS0weOlsEveNnZgv/7lqnEvcRgbw24vQpe
+N9i8loB7w/ugWJkpbEgQ0CO2JA2v4aWQFbREHpYIgxkl7FTWLC6z3Dm/dVHj
+Q2/1ddUXxywvm1eWqNhUXejzjO6qbU9wrqEO1jh1MaoQsyi+bGzi1J15hvun
+z3puXg46RnOPDNgLx411LryzOyRuQ+voCQi9/R3m/xlYn33KNGOeBH7LnNel
+2ASLJrMA6w+bx2/zEMnJqxU6BT305ZLeZ6Z6Fr0PIx9eekYlmOSORGGupvSF
+byzIjam9a2z759BLS5rvr6pa+/yME7DywpKOouhlKq1ArM3Kilny1j8Xtmxf
+UNBNeK8e04HgRwMsAMRCH6UiCMLo4bGDJMiGXQwsnZEdGxhIADmugRELmAPy
+MDU81X3knqrqdS9cKK188r7m3+2R9jIvaDUeazikdnfG5NjMorxFry3cwP3n
+7Qerp018AgyufQcG0fqr9bv8tj/umzrFlBH7Cs9yq81rtKhZgTnZ6oIsZSQK
+VCChCX8LkEA1fG70QrMUhbJy6IBNWpXG1lO7NyUVZkTYWAax5mifwYBa6qI9
+ergoIlbA0qzZkmXSc+E6OqtsolFtZmMfV7qyKfYt7gOsaWONTnUwRAhyf35B
+7D/XBKM1w/C9ieGL8duwPweiBELXOd1hP2wu2BSuJLDtuyVslBgzix+cmCcV
+twaHnRTgj4uYP4jEupEj/I54NuKjJv7gGZEUJMTlZyFqERpmj4SmjPKNKzrS
+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
+pCPkwxBieno9Q3pSgIGGUdBIBQZpFsMTCyMMkRFhyoLSap1cnp2VtrohOEiu
+8uQWW1TT0rn33hWZQsSD4Fl9VCh3SadSHujAWnZyXafPIDVHWApqfru3cv+U
+FIfOHBGRujOf2zlwICpLKkHhcXEK7sVoixXjGeOXNmLYbH5pkI3tSMrJDGuy
+Yf1A4GMFLHz1z4I8yi4JnSMzyFShmlBVbkWOPrzfnHGhOFqV705yC2Ynci/Y
+lC4jHBX6pdwJG+NaXe4wtQADNIdbXFcNHW01GJ7oYxnclFd7vyP4eRvD8D1T
+TyK+5mwIvUYT1kXEYPEyRimEAiOvtYkgcKNcqq2Uy2xcLrMgWyxUoH0o5+oT
+JfAybrHRcXGx2bSxyOeiNUlLrGJ73pWv83wuoSJxqZX0s5o7jmzMOSAgHrYZ
+ugVGiGyql7hTL6m512Arc67jxwNdAi1Psx84MXqfmQHkxLZFIIXE/klASKPW
+Usi9+z/c7wKRbDTtrk03xLIZ7hDXwrm5lfg5Z3Gfff4+sdfodWODAPVxO7gT
+8hdh1kty5tylz7rY6g7/2g5aR3czewHJsjAHQQwh3b2Oe5R7dD08NButQ30D
+aygdScDgvqbODnaR3CZGYEyhzmZd7XpowQL+Ge/SYuRmrvJrS0mqoSiBV0OW
+wOBe/9rSLu3kKnr1jWtLJPZ+kXqBlgd0FhY62ICHGgHv9/FBFsg/Tc67fxTr
+ggGNRXx9OZUhqQyVySQGw1R7vFcOJaLc1xvHLN4M6QdjL9rdstXpaY7a+8eV
+eZu3tsHm6fY2mo4OC0u0Z1fnRc5/ZO/2V2HDO1ZqEDRcChE/yf11x6T2l+FO
+fwyiH8P1KSsCUYDkevmNdn8sBCsnchA6tD4oV7DDIVc+Bg7z6ByhWjU6LtUF
+W1Oqzre/5Whd+dtpq554LUjgqy+bV5GsWpi2Py+Kvhyjm01ZQsTahKRirvm5
+/k3c7gknXtzcNL7JS317dXq6ISe3fN72baP+vnj0U7ydiWHagE1OPYms+ZX6
+EHpIyB1jm7URjY61lXzu3Pq9JfQdr0++96V7Lq2vXNXUl5Vd37C5Gj66+LEJ
+o8fsaP7Ts7+CSa8ZK5LzSmPyq3Z87o8H0Ul4zAn+qCpWCimB5/sogn7e4wsk
+JSCWaGlE6EUITSls/IoopeIdAh+kwDy66njTpDnxLct/M9U2JczF0CaTUKUe
+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
+Rp4rEs14yQQbxizd6ILTOgu5s4krHxAJhfbOdT9sddqrYj1aJV19dPMxqHyw
+NYovIjmKKKoLHQGhGE4f0pDAisfLkgwLK3s0PMwbbnquYOI2eU1R9IvJEzYh
+jVyqRCiHZuvGZNB0JiWoxDbCt4OJ8FumAShAFH6khmLVUVAKA+EKyjtC91ih
+N72f9WfqFw5n6j+W4/DnOtC0+KrFmyMOcQUHawKp+tSzQ4k0gdiIkXqJPoPl
+XIo/czzgnw3ni0tw13zKOB4ChS0Trz/t0Z/oxCeLX+wIC6U3vNq09Y1pbCjl
+CokVSCl2ygJJ+OraZdr65/LR1EfHXRA1NN4lv+PRjxeWvvf8vd/v7Q6KXqoR
+xUosaVJjUGNheJwtlRpYcRfTVikvWtkYigyO3KkPqtEDE0NP++OmZdz79G5W
+SHJwFd5kNwGQCcQjMGWTAjqYZ8eReau8PxJNFiaMpmgbFppmU5l4NYRiabA5
+Y8zM7eN8i1vKHS4jYrvqZ+wWMyyi0Uq1p7X8WlbNfUyd/Zs9+2FYKst1TeVW
+nMkoEzWFI9squm1Vf5arafKY0riYMWn5RXqdLKHulVXujuI1XnpEys2j3Cif
+MztTpz3nNS+DT/2e59mvSUUfn9MO3Nfnsi/agGRwJmONz6qW8Ynp6DsUTZLO
+58v5pPNAHBnfv4pp5T1tpYbCiv2WoU0/KgQmMzui/oEVmL185FmAvW1+f/7F
+KXIblgsKZe6o7Kjw+eaMvxSZlfnJiXzY82N3c0myKChcb7HZ450OtUUi8fSM
+9omCLU5velZGpIl6mUWu9lmRwvBLpvZZEUJ0GtEwI2G2I1kVZI6w9HFLSHy0
+tdYcEWF5PoPbipETZo1QhQTRaHq5v8xBhQ0W+OQUY8hnFLUy6HmEsEv75gBH
+t2Efqohf55NCjZ4SIIawvTfZa2V5+8bHeOWKJL/TKRhKXfJ7u/7pTgIfCF5W
+lcWFC4PCsIe6mPvaYMxMpURZEyhqyZiKO7ubCjLsyqIEwVypKSXdRNGMJeIC
+CqKiNOMqY2NRuNJeTlFTiryzFsyku3yptI+iQiOSTVeOzJVkxwvCg1MdvnJr
+Xuf0++6sgWHwOBJF+FwsK6bNwt3t3YlmUXacOzemaZ9/vqk5GfUccwnLcOIG
+YVMxG88ur9sHEYW8fgdRCp2QJJfKNXI8IoqEwTzYC6KcCNOPpSRQj5FbtSBH
+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
+cREOiZAwHs5Ox9LbxDjJ1CGzW0/k+Y6DW0Q5LXOzR+0LZdObJ7e0dkyoTNXb
+GvZPaXtwetqznE2/3DGnZ0pzfkdiMFU+Zfmr81JyY9RGa75JHphcvXzPB7dM
+f+2Rjsrbn2h56un3nerwx+7dfrD14FM8ngoxntwYTyF4lkGzLgpibEgggcSV
+ASGeu2FEQDkR0nLRXuywMCBx4bjmHqmM64hPDVEl5ubE0wf1PDI0MWnRWj+W
+vVw+d5xY5k+lEj3ei8d9Ao87AnvY6ZgeDox1Ly+SyUDxvEjjoVKMmmCDMhPV
+TmHtnk55NH1v4vhSS/eCNx/b9ITJUWgPTCqa4DBxl19wTJpUZIUr6ndEJJWM
+jT22smDu9ECrM3xKQ1UL1FdtbE5Wjbur7s4/bZjlaC3IMUijkquLJtge+kwZ
+lz/tdriywlSSnZepb/pg2hrqp/yeCj9jaq2zoaOO0OqW/izqXfoJHmYA1S43
+Ys3EAlSxWIupsXJ0u6zIbCLWlFoRRmFTA3+NbX/4eNWjowJe21S8NZSlnRMm
+OYrWrZ06SsiYxu2Z0vbw3DxG9Ng3RR0OJW3eZJ8114eZDYsZt4v79VeWyY4K
+0NgKLWpER009CIUHZn/4zAKWKVp+uOnkG6iPnnfiVJsmjKbffLh3s4efdvWf
+hysoDZbN6uHS2X/gGAvqFTlx8Tk58XE5ZJ/bmFMdn5tLzlCY5yDXcy8b1i8k
+nunL+xtDJf0wbQOrM2OtmZnYc+E446oUNisWmyVot8fNybwsHdBA5S9h3ioH
+drSZOgGC8R3dLrcCo8eNiSnAhhwkdjaZg5TJDMVBQbILUmmcPCx1nZn7yRIL
+ZcZVqWGqGLHvF4pgeEmlUkGbXB7FWmO4k5ZY7tnoWB+jRAKTNBoe9hnQQDWi
+C1jPWXhNp7ui6Qz6COrqhhnwneG6j1vnh7X0CI2oZrhG5M5epSGJ3LejbXiM
+REljG4YiTEJmNVSHQwGeP9G45wyocLnhh0FB0s/JKMNT1pmhVCSVWLnvDatT
+wlUxvuIvFEFXjdNPIhk+UgR0/RfRZWwPG4hUg8SWTWcwbYghrLlCMDKjVErF
+EBZosWywFtXWFlnfyWgShaS6HK9ue+xMw8rehlmEmFl1mbBUkz0ndV5ba+OE
+1ri/jS4I0EVnmWetevuBmiPrV61NS+T+NqDkeXxP41awx5lc7FcQq1zN8nIL
+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
+AAAADwAPAOMEAADkZAYAAAA=
====
-%</images>
+%</files>
%<*readme>
-|
--------:|:--------------------------------------
- isodoc:| LaTeX class used for typesetting of letters and invoices
- Author:| Wybo Dekker
- E-mail:| wybo@dekkerdocumenten.nl
-License:| Released under the LaTeX Project Public License v1.3c or later
- See:| http://www.latex-project.org/lppl.txt
+# isodoc
+| key | description
+| ---:|:---
+| isodoc | LaTeX class used for typesetting of letters and invoices
+|version | 1.12
+| date | 2021-02-20
+| author | Wybo Dekker
+| email | wybo@dekkerdocumenten.nl
+|license | Released under the LaTeX Project Public License v1.3c or later
+| see | http://www.latex-project.org/lppl.txt
Short description:
The isodoc class is used for the preparation of letters and invoices.
@@ -26148,7 +12747,7 @@ These can individually be compiled, which may be useful for users to
experiment with.
Full documentation:
-https://bitbucket.org/wybodekker/isodoc/downloads/isodoc.pdf
+http://mirrors.ctan.org/macros/latex/contrib/isodoc/isodoc.pdf
Installation:
1. Copy isodoc.dtx and isodoc.ins in an empty directory
diff --git a/Master/texmf-dist/source/latex/isodoc/isodoc.ins b/Master/texmf-dist/source/latex/isodoc/isodoc.ins
index e2f1ab54763..e7f65e50644 100644
--- a/Master/texmf-dist/source/latex/isodoc/isodoc.ins
+++ b/Master/texmf-dist/source/latex/isodoc/isodoc.ins
@@ -33,27 +33,26 @@ and version 1.2 or later is part of all distributions of LaTeX version
\endpreamble
-\generate{\file{isodoc.cls }{\from{isodoc.dtx}{class}}
- \file{README }{\from{isodoc.dtx}{readme}}
+\generate{\file{isodoc.cls}{\from{isodoc.dtx}{class}}
\nopreamble\nopostamble
- \file{accept.tex }{\from{isodoc.dtx}{accepttex}}
- \file{accept.sty }{\from{isodoc.dtx}{acceptsty}}
- \file{invoice.tex }{\from{isodoc.dtx}{invoicetex}}
- \file{invoice.sty }{\from{isodoc.dtx}{invoicesty}}
- \file{letter.tex }{\from{isodoc.dtx}{lettertex}}
- \file{letter.sty }{\from{isodoc.dtx}{lettersty}}
- \file{logoletter.tex }{\from{isodoc.dtx}{logolettertex}}
- \file{logoletter.sty }{\from{isodoc.dtx}{logolettersty}}
- \file{ntgletter.tex }{\from{isodoc.dtx}{ntglettertex}}
- \file{ntgletter.sty }{\from{isodoc.dtx}{ntglettersty}}
- \file{images.zip.uue }{\from{isodoc.dtx}{images}}
- \file{listkeys.sh }{\from{isodoc.dtx}{listkeys}}
+ \file{README.md}{\from{isodoc.dtx}{readme}}
+ \file{accept.tex}{\from{isodoc.dtx}{accepttex}}
+ \file{accept.sty}{\from{isodoc.dtx}{acceptsty}}
+ \file{invoice.tex}{\from{isodoc.dtx}{invoicetex}}
+ \file{invoice.sty}{\from{isodoc.dtx}{invoicesty}}
+ \file{letter.tex}{\from{isodoc.dtx}{lettertex}}
+ \file{letter.sty}{\from{isodoc.dtx}{lettersty}}
+ \file{logoletter.tex}{\from{isodoc.dtx}{logolettertex}}
+ \file{logoletter.sty}{\from{isodoc.dtx}{logolettersty}}
+ \file{ntgletter.tex}{\from{isodoc.dtx}{ntglettertex}}
+ \file{ntgletter.sty}{\from{isodoc.dtx}{ntglettersty}}
+ \file{files.zip.uue}{\from{isodoc.dtx}{files}}
+ \file{listkeys.sh}{\from{isodoc.dtx}{listkeys}}
\catcode`\ 12
- \file{Makefile }{\from{isodoc.dtx}{make}}
+ \file{Makefile}{\from{isodoc.dtx}{make}}
}
\directlua{
os.rename("Makefile.tex","Makefile")
- os.rename("README.tex","README")
}
\obeyspaces
diff --git a/Master/texmf-dist/source/latex/jlreq/Makefile b/Master/texmf-dist/source/latex/jlreq/Makefile
index 139d68925ff..b9b9eca5d27 100644
--- a/Master/texmf-dist/source/latex/jlreq/Makefile
+++ b/Master/texmf-dist/source/latex/jlreq/Makefile
@@ -1,10 +1,12 @@
TEXMF:=$(shell kpsewhich -var-value=TEXMFHOME)
MAKEJVFCNF:=$(shell ls -R $(shell kpsewhich --var-value=TEXMFDIST)/fonts/source | awk '/:$$/{sub(/:$$/,"");f=$$0} tolower($$0) ~ /makejvf-upjpn\.cnf$$/{print f"/"$$0}' | head -n 1)
+.PHONY: all jfm doc latexdoc pdfdoc htmldoc jfm-install cls-install sty-install install tds uninstall jfmclean docclean clean
+
all: jfm
jfm: \
- jfm-jlreqv.lua \
+ jfm-jlreqv.lua jfm-jlreqv-jidori.lua \
jlreq.tfm bjlreq.tfm zjlreq.tfm bzjlreq.tfm \
jlreq.vf bjlreq.vf zjlreq.vf bzjlreq.vf \
ujlreq.tfm ubjlreq.tfm uzjlreq.tfm ubzjlreq.tfm \
@@ -25,6 +27,11 @@ jfm: \
jlreqg-v.vf bjlreqg-v.vf zjlreqg-v.vf bzjlreqg-v.vf \
ujlreqg-v.tfm ubjlreqg-v.tfm uzjlreqg-v.tfm ubzjlreqg-v.tfm \
ujlreqg-v.vf ubjlreqg-v.vf uzjlreqg-v.vf ubzjlreqg-v.vf \
+ jlreq-jidori.tfm jlreq-jidori.vf jlreqg-jidori.tfm jlreqg-jidori.vf \
+ jlreq-v-jidori.tfm jlreq-v-jidori.vf jlreqg-v-jidori.tfm jlreqg-v-jidori.vf \
+ ujlreq-jidori.tfm ujlreq-jidori.vf ujlreqg-jidori.tfm ujlreqg-jidori.vf \
+ ujlreq-jidori-q.tfm ujlreq-jidori-q.vf ujlreqg-jidori-q.tfm ujlreqg-jidori-q.vf \
+ ujlreq-v-jidori.tfm ujlreq-v-jidori.vf ujlreqg-v-jidori.tfm ujlreqg-v-jidori.vf
rm -f rml.tfm rmlv.tfm gbm.tfm gbmv.tfm uprml-h.tfm uprml-hq.tfm upgbm-h.tfm upgbm-hq.tfm uprml-v.tfm uprml-vq.tfm upgbm-v.tfm upgbm-vq.tfm
@@ -41,6 +48,19 @@ u%.pl: jfm-%-pl.lua luajfm2pl.lua
%.pl: jfm-%-pl.lua luajfm2pl.lua
texlua luajfm2pl.lua --noutf $*-pl $@
+jlreq-jidori.pl: jfm-jlreq-jidori-pl.lua
+ texlua luajfm2pl.lua --noutf jlreq-jidori-pl $@
+
+jlreq-v-jidori.pl: jfm-jlreqv-jidori-pl.lua
+ texlua luajfm2pl.lua --noutf jlreqv-jidori-pl $@
+
+ujlreq-jidori.pl: jfm-jlreq-jidori-pl.lua
+ texlua luajfm2pl.lua jlreq-jidori-pl $@
+
+ujlreq-v-jidori.pl: jfm-jlreqv-jidori-pl.lua
+ texlua luajfm2pl.lua jlreqv-jidori-pl $@
+
+
# .vf
u%g-q.vf: u%g-q.tfm
makejvf -i -u jisq $< upgbm-hq.tfm
@@ -72,6 +92,37 @@ u%.vf: u%.tfm u%-q.tfm
%.vf: %.tfm
makejvf -i $< rml.tfm
+jlreq-jidori.vf: jlreq-jidori.tfm
+ makejvf -i $< rml.tfm
+
+jlreq-v-jidori.vf: jlreq-v-jidori.tfm
+ makejvf -i $< rmlv.tfm
+
+jlreqg-jidori.vf: jlreqg-jidori.tfm
+ makejvf -i $< gbm.tfm
+
+jlreqg-v-jidori.vf: jlreqg-v-jidori.tfm
+ makejvf -i $< gbmv.tfm
+
+ujlreq-jidori-q.vf: ujlreq-jidori-q.tfm
+ makejvf -i -u jisq $< uprml-hq.tfm
+
+ujlreqg-jidori-q.vf: ujlreqg-jidori-q.tfm
+ makejvf -i -u jisq $< upgbm-hq.tfm
+
+ujlreq-jidori.vf: ujlreq-jidori.tfm ujlreq-jidori-q.tfm
+ makejvf -i -u custom -t ${MAKEJVFCNF} -H -U ujlreq-jidori-q $< uprml-h.tfm
+
+ujlreq-v-jidori.vf: ujlreq-v-jidori.tfm
+ makejvf -i -u custom -t ${MAKEJVFCNF} -H $< uprml-v.tfm
+
+ujlreqg-jidori.vf: ujlreqg-jidori.tfm ujlreqg-jidori-q.tfm
+ makejvf -i -u custom -t ${MAKEJVFCNF} -H -U ujlreqg-jidori-q $< upgbm-h.tfm
+
+ujlreqg-v-jidori.vf: ujlreqg-v-jidori.tfm
+ makejvf -i -u custom -t ${MAKEJVFCNF} -H $< upgbm-v.tfm
+
+
# .tfm
u%-q.tfm: u%.pl
uppltotf -kanji=uptex $< $@
@@ -91,7 +142,32 @@ u%.tfm: u%.pl
%.tfm: %.pl
ppltotf -kanji=utf8 $< $@
-jfm-jlreqv.lua jfm-jlreq-pl.lua jfm-bjlreq-pl.lua jfm-zjlreq-pl.lua jfm-bzjlreq-pl.lua jfm-jlreqv-pl.lua jfm-bjlreqv-pl.lua jfm-zjlreqv-pl.lua jfm-bzjlreqv-pl.lua: make_variant_jfm.lua jfm-jlreq.lua
+ujlreq%-jidori.tfm: ujlreq%-jidori.pl
+ uppltotf -kanji=uptex $< $@
+
+jlreq%-jidori.tfm: jlreq%-jidori.pl
+ ppltotf -kanji=utf8 $< $@
+
+ujlreqg-jidori.tfm: ujlreq-jidori.tfm
+ cp $< $@
+
+ujlreqg-v-jidori.tfm: ujlreq-v-jidori.tfm
+ cp $< $@
+
+jlreqg-jidori.tfm: jlreq-jidori.tfm
+ cp $< $@
+
+jlreqg-v-jidori.tfm: jlreq-v-jidori.tfm
+ cp $< $@
+
+ujlreq-jidori-q.tfm: ujlreq-jidori.pl
+ uppltotf -kanji=uptex $< $@
+
+ujlreqg-jidori-q.tfm: ujlreq-jidori-q.tfm
+ cp $< $@
+
+
+jfm-jlreqv.lua jfm-jlreq-pl.lua jfm-bjlreq-pl.lua jfm-zjlreq-pl.lua jfm-bzjlreq-pl.lua jfm-jlreqv-pl.lua jfm-bjlreqv-pl.lua jfm-zjlreqv-pl.lua jfm-bzjlreqv-pl.lua jfm-jlreqv-jidori.lua jfm-jlreq-jidori-pl.lua jfm-jlreqv-jidori-pl.lua: make_variant_jfm.lua jfm-jlreq.lua jfm-jlreq-jidori.lua
texlua make_variant_jfm.lua
doc: pdfdoc htmldoc
@@ -130,7 +206,7 @@ jfm-install: jfm
mkdir -p ${TEXMF}/fonts/vf/public/jlreq
install *.vf ${TEXMF}/fonts/vf/public/jlreq
mkdir -p ${TEXMF}/tex/luatex/jlreq
- install jfm-jlreqv.lua jfm-jlreq.lua ${TEXMF}/tex/luatex/jlreq
+ install jfm-jlreqv.lua jfm-jlreq.lua jfm-jlreq-jidori.lua jfm-jlreqv-jidori.lua ${TEXMF}/tex/luatex/jlreq
cls-install:
mkdir -p ${TEXMF}/tex/latex/jlreq
@@ -143,7 +219,7 @@ sty-install:
install: jfm-install cls-install sty-install
-tds: jfm jlreq.cls README.md README-ja.md LICENSE jlreq.html jlreq-ja.html jlreq-trimmarks.html jlreq-trimmarks-ja.html jlreq.pdf jlreq-ja.pdf jlreq-trimmarks.pdf jlreq-trimmarks-ja.pdf
+tds: jfm jlreq.cls README.md README-ja.md LICENSE jlreq.html jlreq-ja.html jlreq-trimmarks.html jlreq-trimmarks-ja.html jlreq.pdf jlreq-ja.pdf
mkdir -p ./tds/fonts/tfm/public/jlreq
cp -f *.tfm ./tds/fonts/tfm/public/jlreq
mkdir -p ./tds/fonts/vf/public/jlreq
@@ -151,6 +227,8 @@ tds: jfm jlreq.cls README.md README-ja.md LICENSE jlreq.html jlreq-ja.html jlreq
mkdir -p ./tds/tex/luatex/jlreq
cp jfm-jlreq.lua ./tds/tex/luatex/jlreq
cp jfm-jlreqv.lua ./tds/tex/luatex/jlreq
+ cp jfm-jlreq-jidori.lua ./tds/tex/luatex/jlreq
+ cp jfm-jlreqv-jidori.lua ./tds/tex/luatex/jlreq
mkdir -p ./tds/tex/latex/jlreq
cp jlreq.cls ./tds/tex/latex/jlreq
cp jlreq-helpers.sty ./tds/tex/latex/jlreq
@@ -184,6 +262,7 @@ jfmclean:
rm -f *jlreq*.tfm *jlreq*.pl *jlreq*.vf
rm -f jfm-jlreqv.lua
rm -f jfm-*jlreq*-pl.lua
+ rm -f jfm-jlreqv-jidori.lua
docclean:
rm -f jlreq.tex jlreq.pdf jlreq.html jlreq-ja.tex jlreq-ja.pdf jlreq-ja.html jlreq-trimmarks.html jlreq-trimmarks-ja.html
diff --git a/Master/texmf-dist/source/latex/jlreq/make_variant_jfm.lua b/Master/texmf-dist/source/latex/jlreq/make_variant_jfm.lua
index e91e85cc338..a38ddd13916 100644
--- a/Master/texmf-dist/source/latex/jlreq/make_variant_jfm.lua
+++ b/Master/texmf-dist/source/latex/jlreq/make_variant_jfm.lua
@@ -97,6 +97,7 @@ function tolf(file)
end
local originaljfm = "jlreq"
+local originaljfm_jidori = "jlreq-jidori"
local jfmfile = kpse.find_file("jfm-" .. originaljfm .. ".lua")
if jfmfile == nil then
@@ -175,3 +176,35 @@ fp:close()
tolf(file);
+
+jfmfile = kpse.find_file("jfm-" .. originaljfm_jidori .. ".lua")
+if jfmfile == nil then
+ print("JFM " .. originaljfm_jidori .. " is not found")
+ os.exit(1)
+end
+
+jfm = nil
+function luatexja.jfont.define_jfm(j)
+ jfm = j
+end
+dofile(jfmfile)
+
+function to_jidori_pl(t)
+ t = table.fastcopy(t)
+ -- kanjiskipに任せているところを15zwに変更
+ for cl1,val in pairs(t) do
+ if type(cl1) == "number" then
+ for cl2,glue in pairs(val.glue) do
+ if glue.kanjiskip_stretch == 1 then
+ t[cl1].glue[cl2][2] = 15
+ end
+ end
+ end
+ end
+ return t
+end
+
+
+make_jfmfile(to_jidori_pl(jfm),"jfm-jlreq-jidori-pl.lua")
+make_jfmfile(to_jidori_pl(tate(jfm)),"jfm-jlreqv-jidori-pl.lua")
+make_jfmfile(tate(jfm),"jfm-jlreqv-jidori.lua")
diff --git a/Master/texmf-dist/source/latex/jmlr/jmlr.dtx b/Master/texmf-dist/source/latex/jmlr/jmlr.dtx
index 577b06010df..14215e52a9f 100644
--- a/Master/texmf-dist/source/latex/jmlr/jmlr.dtx
+++ b/Master/texmf-dist/source/latex/jmlr/jmlr.dtx
@@ -1,14 +1,14 @@
%\iffalse
% jmlr.dtx generated using makedtx version 1.2 (c) Nicola Talbot
% Command line args:
+% -section "chapter"
% -doc "jmlr-manual.tex"
% -author "Nicola Talbot"
-% -section "chapter"
% -src "jmlrutils.sty\Z=>jmlrutils.sty"
% -src "jmlr.cls\Z=>jmlr.cls"
% -src "jmlrbook.cls\Z=>jmlrbook.cls"
% jmlr
-% Created on 2020/3/26 11:30
+% Created on 2020/9/21 16:27
%\fi
%\iffalse
%<*package>
@@ -52,7 +52,7 @@ Research (PMLR)},
\doxitem{Option}{option}{package options}
-\CheckSum{5259}
+\CheckSum{5265}
\newcommand*{\appopt}[1]{\texttt{-{}-#1}}
@@ -70,7 +70,7 @@ Research (PMLR)},
% \author{Nicola L. C. Talbot\\[10pt]
%\url{http://www.dickimaw-books.com/}}
%
-% \date{2020-03-26 (version 1.27)}
+% \date{2020-09-21 (version 1.28)}
% \maketitle
%\tableofcontents
%
@@ -142,14 +142,15 @@ Research (PMLR)},
%\href{http://www.dickimaw-books.com/software/makejmlrbookgui/manual/troubleshooting.html}{troubleshooting
%section}.
%
-%There is also a Perl script called \app{makejmlrbook}, which is
-%distributed with the \clsfmt{jmlr} and \clsfmt{jmlrbook} bundle,
-%however it is now deprecated and has been superseded by
+%The Perl script \app{makejmlrbook} is now deprecated and will be
+%removed in future releases. It has been superseded by
%\app{makejmlrbookgui}. Note that PMLR (formerly JMLR W\&CP) has new
%format guidelines that are followed by new versions of
%\app{makejmlrbookgui} but not by the Perl script \app{makejmlrbook},
-%so that script is no longer documented or supported and may be
-%dropped from future versions of this bundle.
+%so that script is no longer documented or supported.
+%The PMLR submission requirements for production editors are now much simpler
+%and can be followed without the assistance of \cls{jmlrbook} or
+%\app{makejmlrbookgui}.
%
%\section{Required Packages}
%
@@ -1152,8 +1153,8 @@ Research (PMLR)},
%\href{http://www.dickimaw-books.com/latex/novices}{\LaTeX\ for Complete Novices}.
%
%There are also forums, mailing lists and newsgroups. For example,
-%\TeX\ on StackExchange (\url{http://tex.stackexchange.com/}),
-%the \LaTeX\ Community (\url{http://www.latex-community.org/}),
+%\TeX\ on StackExchange (\url{https://tex.stackexchange.com/}),
+%the \LaTeX\ Community (\url{https://latex.org/forum/}),
%the \texttt{texhax} mailing list
%(\url{http://tug.org/mailman/listinfo/texhax}) and
%\texttt{comp.text.tex} (archives available at
@@ -1753,7 +1754,7 @@ Research (PMLR)},
%Non-class dependent code. This package is automatically loaded by
%\cls{jmlr} but may be used with other classes.
% \begin{macrocode}
-\ProvidesPackage{jmlrutils}[2020/03/26 v1.27 (NLCT)]
+\ProvidesPackage{jmlrutils}[2020/09/21 v1.28 (NLCT)]
% \end{macrocode}
% Package options:
%\begin{macro}{\ifjmlrutilsmaths}
@@ -2753,7 +2754,7 @@ Research (PMLR)},
% Declare class and required TeX format:
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{jmlr}[2020/03/26 v1.27 (NLCT) Journal of Machine Learning Research]
+\ProvidesClass{jmlr}[2020/09/21 v1.28 (NLCT) Journal of Machine Learning Research]
% \end{macrocode}
%\changes{1.10}{2011-01-05}{hyperref now loaded by jmlr instead of
%jmlrbook}
@@ -2976,6 +2977,13 @@ Research (PMLR)},
% \begin{macrocode}
\ProcessOptionsX
% \end{macrocode}
+% If two-sided, pass that to \cls{article} as well:
+%\changes{1.28}{2020-09-21}{pass twoside to article.cls}
+% \begin{macrocode}
+\if@twoside
+ \PassOptionsToClass{twoside}{article}
+\fi
+% \end{macrocode}
% Load \cls{article} class.
%\changes{1.10}{2011-01-05}{passed \cs{pt@size} when loading article
%class}
@@ -3197,11 +3205,13 @@ Research (PMLR)},
%\changes{1.10}{2011-01-05}{Modified definition of \cs{thanks}}
%Added optional argument to \cs{footnotetext} as per
%\url{http://tex.stackexchange.com/questions/229295}.
+%\changes{1.28}{2020-09-21}{switched to using mpfootnote to avoid clashing
+%with document footnotes}
% \begin{macrocode}
\renewcommand*{\thanks}[1]{%
- \footnotemark
- \protected@xdef\@thanks{\@thanks
- \protect\footnotetext[\arabic{footnote}]{#1}}%
+ \refstepcounter{mpfootnote}%
+ \footnotemark[\number\value{mpfootnote}]%
+ \xappto\@thanks{\noexpand\footnotetext[\number\value{mpfootnote}]{#1}}%
}
% \end{macrocode}
%\end{macro}
@@ -4879,7 +4889,7 @@ Keywords:} \ignorespaces}%
% \end{macrocode}
% Declare class:
% \begin{macrocode}
-\ProvidesClass{jmlrbook}[2020/03/26 v1.27 (NLCT) JMLR Book Style]
+\ProvidesClass{jmlrbook}[2020/09/21 v1.28 (NLCT) JMLR Book Style]
% \end{macrocode}
% Need \sty{xkeyval} package to have key=value class options
% \begin{macrocode}
@@ -5057,14 +5067,16 @@ Keywords:} \ignorespaces}%
% \end{macrocode}
%\begin{option}{oneside}
%\changes{1.22}{2015/04/11}{new}
+%\changes{1.28}{2020-09-21}{pass option to jmlr.cls}
% \begin{macrocode}
-\DeclareOptionX{oneside}{\@twosidefalse \@mparswitchfalse}
+\DeclareOptionX{oneside}{\PassOptionsToClass{\CurrentOption}{jmlr}}
% \end{macrocode}
%\end{option}
%\begin{option}{twoside}
%\changes{1.22}{2015/04/11}{new}
+%\changes{1.28}{2020-09-21}{pass option to jmlr.cls}
% \begin{macrocode}
-\DeclareOptionX{twoside}{\@twosidetrue \@mparswitchtrue}
+\DeclareOptionX{twoside}{\PassOptionsToClass{\CurrentOption}{jmlr}}
% \end{macrocode}
%\end{option}
%
diff --git a/Master/texmf-dist/source/latex/jmlr/jmlr.ins b/Master/texmf-dist/source/latex/jmlr/jmlr.ins
index c73ba3101cb..108c83e582f 100644
--- a/Master/texmf-dist/source/latex/jmlr/jmlr.ins
+++ b/Master/texmf-dist/source/latex/jmlr/jmlr.ins
@@ -1,4 +1,4 @@
-% jmlr.ins generated using makedtx version 1.2 2020/3/26 11:30
+% jmlr.ins generated using makedtx version 1.2 2020/9/21 16:27
\input docstrip
\preamble
diff --git a/Master/texmf-dist/source/latex/keyvaltable/keyvaltable.dtx b/Master/texmf-dist/source/latex/keyvaltable/keyvaltable.dtx
index 813904fb233..f68b0bf67c3 100644
--- a/Master/texmf-dist/source/latex/keyvaltable/keyvaltable.dtx
+++ b/Master/texmf-dist/source/latex/keyvaltable/keyvaltable.dtx
@@ -22,7 +22,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{keyvaltable}
%<*package>
- [2020/02/19 v2.1 Package for filling tables using key-value lists]
+ [2020/04/05 v2.2 Package for filling tables using key-value lists]
%</package>
%
%<*driver>
@@ -47,7 +47,7 @@
showhead=false,headformat={\bfseries\footnotesize},
rowbg=black!7!white..black!3!white,
showrules=false,
- shape=tabu]{GoalApproach}{
+ backend=tabu]{GoalApproach}{
id: align=r, default=(\alph{kvtRow}), head=\#;
goal: align=X[l];
approach: align={X[2,l]};
@@ -223,7 +223,10 @@ cherries,50g,cherries,heat up and add to bowl
% \NiceDescribeKey{align}{vals={l,c,r,p,X,\ldots}, init=l}
% This property specifies the alignment of content in the
% column. The \meta{value} can be set to any column alignment
-% understood by table environments.
+% understood by table environments.\footnote{More complex values, for
+% instance using the notation of the \pkgname{array} package for
+% inserting material before or after a column, are permitted but not
+% further tested. Use at your own risk.}
%
% \NiceDescribeKey{default}{vals=\vmeta{content}, init=\vmeta{empty}}
% This property specifies the default \meta{content} of a cell in this
@@ -497,6 +500,14 @@ cherries,50g,cherries,heat up and add to bowl
% \end{KeyValTable}
% \end{LTXexample}
%
+% By default, all counters start at value $1$. Through the following
+% possibilities, this behavior can be changed.
+%
+% \NiceDescribeKey{resume}{vals={true,false}, init=false, def=true}\label{opt:resume}
+% This option is available in |KeyValTable| environments. When this
+% option is set to |true|, the value of the |kvtRow| counter is resumed
+% from the previous |KeyValTable| environment. The other two counters
+% are not affected by this option.
%
% \subsection{Row Labeling}
%
@@ -608,27 +619,33 @@ cherries,50g,cherries,heat up and add to bowl
% list of \meta{property}|=|\meta{value} pairs.
% The following \meta{property} keys can be configured.
%
-% \NiceDescribeKey{shape}
-% {vals={multipage,onepage,tabular,tabularx,longtable,xltabular,tabu,longtabu},
-% init=multipage}
-% This property specifies the table's shape. For \meta{value}, the
-% package currently supports |multipage| and |onepage| as well as
-% |tabular|, |tabularx|, |longtable|, |xltabular|, |tabu|, and
-% |longtabu|. In case of |multipage|, the table may span multiple pages
-% and on each page, the column header is repeated. In case of |onepage|,
-% the table does not split into multiple pages. The remaining values
-% use the respective environment for producing the table (see
-% \cref{sec:AltTabEnv} for the effect).
+% \NiceDescribeKeys{2}
+% {backend}{vals={tabular,tabularx,longtable,xltabular,tabu,longtabu}}
+% {shape}{vals={multipage,onepage}, init=multipage}
+% The |backend| property specifies the table environment to be used for
+% producing the table. A set of six environments is currently supported,
+% including environments that can span multiple pages and environments
+% whose columns can stretch/shrink to fill the available space ("|X|"
+% columns).
+% The |shape| property abstracts from the concrete environments.
+% In case of |multipage|, the table may span multiple pages and
+% depending on whether |X|-columns are used or not, an appropriate
+% environment is selected. In case of |onepage|, the table does not
+% split into multiple pages.
+% See \cref{sec:AltTabEnv} for more details on the available shapes and
+% backends.
+% Only one of |shape| and |backend| can be specified. If both are
+% specified, the property that is specified last wins.
%
% \NiceDescribeKey{width}{vals=\vmeta{dimension}, init=\cmd\linewidth}
% This property specifies the width of the table, if the selected
-% |shape| supports it (see \cref{sec:AltTabEnv}).
+% |shape|/|backend| supports it (see \cref{sec:AltTabEnv}).
%
% \NiceDescribeKeys{2}
% {valign}{vals={t,c,b}, init=\vmeta{empty}}
% {halign}{vals={l,c,r}, init=\vmeta{empty}}
% These two properties specify the vertical and, respectively, horizontal
-% alignment of the table, if the selected |shape| supports it (see
+% alignment of the table, if the selected |shape|/|backend| supports it (see
% \cref{sec:AltTabEnv}).
%
% \NiceDescribeKey{showhead}{vals={true,false}, init=true}
@@ -733,6 +750,58 @@ cherries,50g,cherries,heat up and add to bowl
% \label{fig:TableOptionExamples}
% \end{figure}
%
+% \subsubsection{Table Styles and Resumable Options}
+%
+% Rather than specifying properties for individual tables or table
+% types, \thispackage also supports named \emph{table styles}.
+%
+% \NiceDescribeKey{style}{vals=\vmeta{list of style names}, init=\vmeta{empty}}
+% Through this property of tables or table types, a list of styles can
+% be applied to a single table or, respectively, a table type. Each
+% style must have been defined with |\kvtNewTableStyle| before.
+%
+% \NiceDescribeMacro{\kvtNewTableStyle}{\marg{name}\marg{options}}
+% This macro declares a new table style with the given \meta{name} and
+% defines it to be equivalent to using the given \meta{options}.
+% The \meta{name} must not already be defined.
+%
+% \NiceDescribeMacro{\kvtRenewTableStyle}{\marg{name}\marg{options}}
+% This macro re-defines an existing table style \meta{name} with new
+% \meta{options}.
+%
+% The following example demonstrates table styles for an individual
+% table.
+%
+% \begin{LTXexample}[morepreset=\RecipePreset,morekeywords={style,kvtNewTableStyle}]
+% \kvtNewTableStyle{plain}{
+% norules,nobg,headformat=\textbf}
+% \begin{KeyValTable}[style=plain]{Recipe}
+% \Row{amount=150g, ingredient=ice cream,
+% step=put into bowl}
+% \Row{amount= 50g, ingredient=cherries,
+% step=heat up and add to bowl}
+% \end{KeyValTable}
+% \end{LTXexample}
+%
+% \NiceNote{The \meta{options} in |\kvtNewTableStyle| can be left empty.
+% In this case, the table style does not have any effect on the appearance
+% of tables. However, the style can already be used for "tagging" tables
+% and table types, while the final options for the style can be
+% configured at a later point in time.}
+%
+% Even without table styles, the appearance of the previous
+% |KeyValTable| can be used again through the following option.
+% \NiceDescribeKey{resume*}{vals={true,false}, init=false, def=true}
+% When set to |true|, this option makes the table use the options from
+% the previous |KeyValTable| environment. This option also implies the
+% |resume| option (see \vref{opt:resume}).
+
+% If the previous environment also used |resume*|, then the options of
+% its predecessor environment are used, and so forth.
+% Note that this means that table options are not accumulated over
+% subsequent uses of |resume*|.
+% This behavior is the same as in the \pkgname{enumitem} package.
+%
%
% \subsection{Column Appearance}
%
@@ -1116,11 +1185,11 @@ cherries,50g,cherries,heat up and add to bowl
%
% \subsection{Captions}
%
-% There are two ways to add captions to (\pkgname{keyvaltable}-) tables:
+% There are two ways to add captions to \pkgname{keyvaltable} tables:
% The first way is to enclose the table in a |table| environment. This
% is particularly suit for tables that do not span multiple pages, such
-% as those produced through the |onepage| shape (or |tabular|,
-% |tabularx|, and |tabu| -- see \cref{sec:AltTabEnv}).
+% as those produced through the |onepage| shape or the backends
+% |tabular|, |tabularx|, and |tabu| (see \cref{sec:AltTabEnv}).
%
% \begin{LTXexample}[morepreset=\RecipePreset,morekeywords={caption,label,ref}]
% \begin{table}
@@ -1137,20 +1206,37 @@ cherries,50g,cherries,heat up and add to bowl
% \end{LTXexample}
%
% The second way to add captions is through the |caption| option of
-% \pkgname{keyvaltable} tables. This is particularly suit for tables
-% that can span multiple pages, such as those produced through the
-% |multipage| shape (or |longtable|, |xltabular|, and |longtabu| -- see
-% \cref{sec:AltTabEnv}).
+% \pkgname{keyvaltable} tables. This option is available for the
+% "multipage" shape and, respectively, the table backends |longtable|,
+% |xltabular|, and |longtabu| (see \cref{sec:AltTabEnv}).
%
-% \NiceDescribeKeys{2}
+% \NiceDescribeKeys{4}
% {caption}{vals=\vmeta{text}, init=\vmeta{none}}
+% {caption/lot}{vals=\vmeta{text}, init=\vmeta{none}}
+% {caption/alt}{vals=\vmeta{text}, init=\vmeta{none}}
% {label}{vals=\vmeta{name}, init=\vmeta{none}}
% These options set the caption and, respectively, label of a table.
-% The caption is added to the end of the table.
+% Through the option |caption/lot|, the caption to be put into the list
+% of tables can be specified; if omitted, |caption| is used.
+% Through the option |caption/alt|, the alternative caption to be
+% displayed on those pages of multipage tables where the main caption is
+% not shown; if omitted, no caption is displayed on these pages.
+%
+% The position of the caption is determined by the following option.
+%
+% \NiceDescribeKey{captionpos}{vals={t,b}, init=b}
+% This option specifies the position of table captions. Value "|t|"
+% specifies that captions are at the top of (above) their tables; value
+% "|b|" specifies that captions are at the bottom of (below) their
+% tables.
+% Moreover, in case of "|t|" the main caption is on top of the
+% \emph{first} page of a table while in case of "|b|" the main caption
+% is at the bottom of the \emph{last} page of a table.
+%
% The following example shows the options in action.
%
-% \begin{LTXexample}[morepreset=\RecipePreset,morekeywords={caption,label,ref}]
-% \begin{KeyValTable}[shape=multipage,
+% \begin{LTXexample}[morepreset=\RecipePreset\setcounter{table}{0},morekeywords={caption,label,ref}]
+% \begin{KeyValTable}[captionpos=t,
% caption=Cherries++, label=Cherries2]{Recipe}
% \Row{amount=150g, ingredient=ice cream,
% step=put into bowl}
@@ -1163,28 +1249,33 @@ cherries,50g,cherries,heat up and add to bowl
%
% \subsection{Alternative Table Environments}
% \label{sec:AltTabEnv}
-%
-% Originally, the \thispackage package uses the \pkgname{tabu} package
-% and |tabu|, resp. |longtabu| environments for typesetting the actual
-% tables. Through the |shape| option of tables, the table environment
-% used by \thispackage tables can be changed.
-% \Vref{tab:TabEnv} compares
-% the possible shapes/environments with regards to
+% The \thispackage package internally uses traditional table
+% environments, such as |tabular|, for typesetting the actual tables.
+% Through the |shape| and |backend| properties of a table or table type,
+% the table environment used by for the table or, respectively, table
+% type can be changed.
+% \Vref{tab:TabEnv} compares the possible shapes/environments with
+% regards to
% \begin{itemize}[nosep]
% \item whether they support tables that span multiple pages,
% \item whether they support |caption| and |label| options,
% \item whether they support |X|-type (variable-width) columns,
-% \item and whether their width can be specified (through the |width| option).
+% \item whether their width can be specified (through the |width|
+% option), and
+% \item whether they support a vertical or horizontal alignment of the
+% table to be specified.
% \end{itemize}
-% Finally, the table also displays the
-% package(s) that must be loaded manually when the respective shapes are
+% Finally, the table also lists the names of the packages that provide
+% the respective environments. The packages for the shapes |onepage| and
+% |multipage| are loaded automatically. All other packages must be
+% loaded via |\usepackage| when the respective shape or backend shall be
% used.
% \begin{table}\centering
% \newcommand\RHead[1]{\rotatebox{90}{\small\varwidth{\linewidth}#1\endvarwidth}}%
% \newcommand\YesNo[1]{\ifstrequal{#1}{yes}{\checkmark}{}}%
-% \NewKeyValTable[shape=tabular,headformat=\sffamily\textbf]{ShapeProps}{
+% \NewKeyValTable[backend=tabular,headformat=\sffamily\textbf]{ShapeProps}{
% shape: format=\small\texttt;
-% env: format=\small\texttt, head=environment;
+% env: format=\small\texttt, head=backend;
% multipage: align=c, head=\RHead{multipage}, format=\YesNo;
% caption: align=c, head=\RHead{caption}, format=\YesNo;
% Xcols: align=c, head=\RHead{\texttt{X} columns}, format=\YesNo;
@@ -1199,14 +1290,14 @@ cherries,50g,cherries,heat up and add to bowl
% \Row{shape=onepage, env=tabu, multipage=no, caption=no, Xcols=yes, width=yes, align=v, packages=tabu}
% \Row{shape=multipage, env=longtabu, multipage=yes, caption=yes, Xcols=yes, width=yes, align=h, packages={tabu, longtable}}
% \midrule
-% \Row{shape=tabular, env=tabular, multipage=no, caption=no, Xcols=no, width=no, align=v}
-% \Row{shape=tabularx, env=tabularx, multipage=no, caption=no, Xcols=yes, width=yes, align=v, packages={tabularx}}
-% \Row{shape=longtable, env=longtable, multipage=yes, caption=yes, Xcols=no, width=no, align=h, packages={longtable}}
-% \Row{shape=xltabular, env=xltabular, multipage=yes, caption=yes, Xcols=yes, width=yes, align=h, packages={xltabular}}
-% \Row{shape=tabu, env=tabu, multipage=no, caption=no, Xcols=yes, width=yes, align=v, packages={tabu}}
-% \Row{shape=longtabu, env=longtabu, multipage=yes, caption=yes, Xcols=yes, width=yes, align=h, packages={tabu,longtable}}
+% \Row{ env=tabular, multipage=no, caption=no, Xcols=no, width=no, align=v}
+% \Row{ env=tabularx, multipage=no, caption=no, Xcols=yes, width=yes, align=v, packages={tabularx}}
+% \Row{ env=longtable, multipage=yes, caption=yes, Xcols=no, width=no, align=h, packages={longtable}}
+% \Row{ env=xltabular, multipage=yes, caption=yes, Xcols=yes, width=yes, align=h, packages={xltabular}}
+% \Row{ env=tabu, multipage=no, caption=no, Xcols=yes, width=yes, align=v, packages={tabu}}
+% \Row{ env=longtabu, multipage=yes, caption=yes, Xcols=yes, width=yes, align=h, packages={tabu,longtable}}
% \end{KeyValTable}
-% \caption{Comparison of table shapes / environments}
+% \caption{Comparison of table shapes and backends}
% \label{tab:TabEnv}
% \end{table}
%
@@ -1219,11 +1310,11 @@ cherries,50g,cherries,heat up and add to bowl
% l: align=l; c: align=c; r: align=r;}[headers={
% l+c+r: head=\textbf{\kvtTableOpt{shape} shape}\\ ::}]
%
-% \begin{KeyValTable}[shape=tabular]{ShapeNoX}
+% \begin{KeyValTable}[backend=tabular]{ShapeNoX}
% \Row{l=left, c=center, r=right}
% \Row{l=left-2, c=2-center-2, r=2-right}
% \end{KeyValTable}\\
-% \begin{KeyValTable}[shape=longtable]{ShapeNoX}
+% \begin{KeyValTable}[backend=longtable]{ShapeNoX}
% \Row{l=left, c=center, r=right}
% \Row{l=left-2, c=2-center-2, r=2-right}
% \end{KeyValTable}
@@ -1236,24 +1327,24 @@ cherries,50g,cherries,heat up and add to bowl
% l: align=l; X: align=X; r: align=r;}[headers={
% l+X+r: head=\textbf{\kvtTableOpt{shape} shape}\\ ::}]
%
-% \begin{KeyValTable}[shape=tabularx]{ShapeWithX}
+% \begin{KeyValTable}[backend=tabularx]{ShapeWithX}
% \Row{l=left, X=expandable, r=right}
% \Row{l=left-2, X=expandable-2, r=2-right}
% \end{KeyValTable}\medskip\\
-% \begin{KeyValTable}[shape=xltabular]{ShapeWithX}
+% \begin{KeyValTable}[backend=xltabular]{ShapeWithX}
% \Row{l=left, X=expandable, r=right}
% \Row{l=left-2, X=expandable-2, r=2-right}
% \end{KeyValTable}
-% \begin{KeyValTable}[shape=tabu]{ShapeWithX}
+% \begin{KeyValTable}[backend=tabu]{ShapeWithX}
% \Row{l=left, X=expandable, r=right}
% \Row{l=left-2, X=expandable-2, r=2-right}
% \end{KeyValTable}
-% \begin{KeyValTable}[shape=longtabu]{ShapeWithX}
+% \begin{KeyValTable}[backend=longtabu]{ShapeWithX}
% \Row{l=left, X=expandable, r=right}
% \Row{l=left-2, X=expandable-2, r=2-right}
% \end{KeyValTable}
% \end{LTXexample}
-% \caption{Examples for the shape option}
+% \caption{Examples for the backend option}
% \label{fig:TableTypes}
% \end{figure}
%
@@ -1492,6 +1583,44 @@ cherries,50g,cherries,heat up and add to bowl
%
% \subsection{Auxiliary Code}
%
+% \subsubsection{List Parsing}
+%
+% \begin{macro}{\kvt@DeclareTrimListParser}
+% The |\kvt@DeclareTrimListParser|(|*|)\marg{command}\marg{separator}
+% macro is equivalent to \pkgname{etoolbox}'s |\DeclareListParser|,
+% except that the \meta{command} is defined such that it will remove
+% trailing spaces from list elements before passing the list elements to
+% the processing macro (i.e., to |\do| or the user-provided macro).
+% Note: With |\DeclareListParser|, \meta{command} is defined to only
+% remove leading spaces but not trailing ones.
+% This implementation relies on the internals of
+% \pkgname{etoolbox} and works with v2.4 of the package, at least.
+% \begin{macrocode}
+\newcommand\kvt@DeclareTrimListParser{%
+ \@ifstar{\kvt@DeclareTrimListParser@i{*}}
+ {\kvt@DeclareTrimListParser@i{}}}
+\newcommand\kvt@DeclareTrimListParser@i[3]{%
+ \DeclareListParser#1{#2}{#3}\expandafter
+ \patchcmd\csname etb@lst@\expandafter\@gobble\string#2\endcsname
+ {\etb@listitem}{\kvt@etb@listitem}{}
+ {\kvt@warn{Failed to patch a command defined by the etoolbox
+ package, possibly because etoolbox internals have changed.
+ You might encounter superfluous spaces.}}}
+% \end{macrocode}
+% The cascade of |\expandafter| below ensures that first the trimming
+% macro is expanded and afterwards the outer |\unexpanded| of the
+% timming macro's expansion is expanded, which by definition of the
+% "noexp" trimming macro fully expands the macro's logic.
+% The auxiliary macro below is only for switching the two arguments such
+% that the expansion control can be applied to the second argument.
+% \begin{macrocode}
+\newcommand\kvt@etb@listitem[2]{%
+ \expandafter\expandafter\expandafter\kvt@etb@listitem@i
+ \expandafter\expandafter\expandafter{\trim@post@space@noexp{#2}}{#1}}
+\newcommand\kvt@etb@listitem@i[2]{\etb@listitem{#2}{#1}}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\kvt@dossvlist}
% The |\kvt@dossvlist|\marg{list} macro parses a semicolon-separated
% list and runs |\do|\meta{item} for every element of the list.
@@ -1503,17 +1632,19 @@ cherries,50g,cherries,heat up and add to bowl
% \begin{macro}{\kvt@forpsvlist}
% The |\kvt@forpsvlist|\marg{handler}\marg{list} parses a `+'-separated list.
% \begin{macrocode}
-\DeclareListParser*{\kvt@forpsvlist}{+}
+\kvt@DeclareTrimListParser*{\kvt@forpsvlist}{+}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\kvt@dobrklist}
% The |\kvt@dobrklist|\marg{list} parses a `|\\|'-separated list.
% \begin{macrocode}
-\DeclareListParser{\kvt@dobrklist}{\\}
+\kvt@DeclareTrimListParser{\kvt@dobrklist}{\\}
% \end{macrocode}
% \end{macro}
%
+% \subsubsection{Errors and Warnings}
+%
% \begin{macro}{\kvt@error}
% \begin{macro}{\kvt@warn}
% These macros produce error and warning messages.
@@ -1524,6 +1655,8 @@ cherries,50g,cherries,heat up and add to bowl
% \end{macro}
% \end{macro}
%
+% \subsubsection{Setting Keys}
+%
% \begin{macro}{\kvt@setkeys}
% \begin{macro}{\kvt@setcmdkeys}
% \begin{macro}{\kvt@setcskeys}
@@ -1648,8 +1781,11 @@ cherries,50g,cherries,heat up and add to bowl
% The following code defines the possible table options.
%
% \changes{v0.2}{2016/05/21}{Added ``shape'' table option}
-% \changes{v2.0}{2019/05/11}{added table options "caption" and "label"}
+% \changes{v2.0}{2019/05/11}{Added table options "caption" and "label"}
% \changes{v2.1}{2020/01/18}{Added ``valign'' and ``halign'' table options}
+% \changes{v2.2}{2020/02/24}{Added ``style'' table option}
+% \changes{v2.2}{2020/02/27}{added option "backend"}
+% \changes{v2.2}{2020/03/08}{added option "captionpos"}
% \begin{macrocode}
\define@cmdkey[kvt]{Table}{rowbg}{}
\define@cmdkey[kvt]{Table}{headbg}{}
@@ -1658,12 +1794,13 @@ cherries,50g,cherries,heat up and add to bowl
\define@cmdkey[kvt]{Table}{width}{}
\define@boolkey[kvt]{Table}{showhead}{}
\define@boolkey[kvt]{Table}{showrules}{}
-\define@cmdkey[kvt]{Table}{caption}{}
-\define@cmdkey[kvt]{Table}{label}{}
+\define@choicekey[kvt]{Table}{captionpos}{t,b}
+ {\csdef{cmdkvt@Table@captionpos}{#1}}
\define@choicekey[kvt]{Table}{valign}{t,c,b}
{\csdef{cmdkvt@Table@valign}{#1}}
\define@choicekey[kvt]{Table}{halign}{l,c,r}
{\csdef{cmdkvt@Table@halign}{#1}}
+\define@key[kvt]{Table}{style}{\kvt@UseTableStyles{#1}}
% \end{macrocode}
% The following options only abbreviate options defined above.
% \changes{v2.1}{2020/01/14}{added abbreviation option "norules"}
@@ -1676,14 +1813,48 @@ cherries,50g,cherries,heat up and add to bowl
\ifbool{#1}
{\kvt@setkeys{showrules=false}{Table}}
{\kvt@setkeys{showrules=true}{Table}}}
+\define@key[kvt]{Table}{backend}{\ifinlist{#1}{\kvt@@tablebackends}
+ {\csdef{cmdkvt@Table@shape}{#1}}
+ {\kvt@error{Table backend '#1' not known}
+ {Check for misspellings in '#1'}}}
+\define@key[kvt]{Table}{shape}{\ifinlist{#1}{\kvt@@tableshapes}
+ {\csdef{cmdkvt@Table@shape}{#1}}
+ {\ifinlist{#1}{\kvt@@tablebackends}
+ {\kvt@warn{Using a backend ('#1') as shape is deprecated.
+ Use the 'backend' option instead.}%
+ \csdef{cmdkvt@Table@shape}{#1}}
+ {\kvt@error{Table shape '#1' not known}
+ {Check for misspellings in '#1'}}}}
+% \end{macrocode}
+%
+% The following table options only apply to individual |KeyValTable|
+% environments and cannot be set with |\NewKeyValTable| or |\kvtSet|.
+% \changes{v2.2}{2020/02/23}{added table options "resume" and "resume*"}
+% \changes{v2.2}{2020/03/12}{added options "caption/lot" and "caption/alt"}
+% \begin{macrocode}
+\define@cmdkey[kvt]{TableEnv}{caption}{}
+\define@cmdkey[kvt]{TableEnv}{caption/lot}{}
+\define@cmdkey[kvt]{TableEnv}{caption/alt}{}
+\define@cmdkey[kvt]{TableEnv}{label}{}
+\define@boolkey[kvt]{TableEnv}{resume}[true]{%
+ \ifbool{#1}{\ifundef\kvt@@rowcountlast
+ {\kvt@error{No previous table whose counter could be resumed.}
+ {Check whether the "resume" is intentional and whether a
+ previously existing predecessor table has disappeared.}}{}}{}}
+\define@boolkey[kvt]{TableEnv}{resume*}[true]{%
+ \ifbool{#1}
% \end{macrocode}
-% When adding further |shape| options below, ensure to also add a
-% corresponding |\kvt@DefineStdTabEnv| counterpart further below in the
-% code.
+% The |\kvt@@lastenvopt| macro holds the previous |KeyValTable|'s
+% options. Beyond these options, |resume*| automatically also sets
+% |resume|.
% \begin{macrocode}
-\define@choicekey[kvt]{Table}{shape}
- {multipage,onepage,tabular,longtable,tabularx,xltabular,tabu,longtabu}
- {\csdef{cmdkvt@Table@shape}{#1}}
+ {\ifundef\kvt@@lastenvopt
+ {\kvt@error{No previous table whose options could be resume*'d.}
+ {Check whether the "resume*" is intentional and whether a
+ previously existing predecessor table has disappeared.}}{}%
+ \kvt@setcmdkeys\kvt@@lastenvopt{Table}%
+ \kvt@setkeys{resume}{TableEnv}}
+ {}}
% \end{macrocode}
%
%
@@ -1808,9 +1979,11 @@ cherries,50g,cherries,heat up and add to bowl
%
% \subsubsection{Option Defaults}
%
-% The following sets the default values for the options.
+% The following sets the default values for the options. This is done
+% only after the package is otherwise completely processed, to ensure
+% that all features are already defined/registered at that point.
% \begin{macrocode}
-\kvtSet{%
+\AtEndOfPackage{\kvtSet{%
rowbg=white..black!10,
headbg=black!14,
showhead=true,
@@ -1819,7 +1992,7 @@ cherries,50g,cherries,heat up and add to bowl
headalign=,
shape=multipage,
width=\linewidth,
- caption={}, label={},
+ captionpos=b,
% \end{macrocode}
% Column options
% \begin{macrocode}
@@ -1838,7 +2011,7 @@ cherries,50g,cherries,heat up and add to bowl
ColGroup/align=c,
ColGroup/format=\kvtStrutted,
HeadCell/align=c,
-}
+}}
% \end{macrocode}
%
%
@@ -1928,6 +2101,10 @@ cherries,50g,cherries,heat up and add to bowl
% \meta{tname} and adds the column with the configuration to the table.
% \begin{macrocode}
\def\kvt@parsecolspec#1#2:#3:#4\@undefined{%
+% \end{macrocode}
+% Catch syntax errors first.
+% \begin{macrocode}
+ \kvt@checkcolspecempty{#4}{column}{#2}%
\def\kvt@@column{#2}%
\trim@spaces@in\kvt@@column
\expandafter\kvt@parsecolspec@i\expandafter{\kvt@@column}{#1}{#3}}
@@ -2066,6 +2243,13 @@ cherries,50g,cherries,heat up and add to bowl
% \meta{cgopts}.
% \begin{macrocode}
\def\kvt@parsecolgroup#1#2:#3:#4\@undefined{%
+% \end{macrocode}
+% Catch syntax errors first.
+% \begin{macrocode}
+ \kvt@checkcolspecempty{#4}{column group}{#2}%
+% \end{macrocode}
+% Next, check for a valid \meta{cgname}.
+% \begin{macrocode}
\ifinlistcs{#2}{kvt@allcolumns@#1}{\kvt@error
{Name `#2' cannot be used for a column group in table type `#1',
as it is already used for a column}
@@ -2116,6 +2300,23 @@ cherries,50g,cherries,heat up and add to bowl
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\kvt@checkcolspecempty}
+% The |\kvt@checkcolspecempty|\marg{empty}\marg{type}\marg{name}
+% macro checks the \meta{empty} parameter of a parsing macro for a
+% colon-separated key-value pair.
+% If \meta{empty} is empty, this corresponds to the valid case that only
+% the name of a column group was provided and no properties. If
+% \meta{empty} equals ":", then a name and properties were provided. In
+% all other cases, superfluous colons were found.
+% \begin{macrocode}
+\newcommand\kvt@checkcolspecempty[3]{%
+ \ifstrempty{#1}{}{\ifstrequal{#1}{:}{}{\kvt@error
+ {Too many ':' in definition of #2 '#3'}
+ {Check whether there is an accidental ':' that should actually be
+ a ',' or ';'.}}}}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\kvt@checkcolgroup}
% The |\kvt@checkcolgroup|\marg{span-psv}\marg{tname}\marg{cgname} macro
% performs some checks on \meta{span-psv} as a specification of which
@@ -2245,8 +2446,7 @@ cherries,50g,cherries,heat up and add to bowl
% header for the columns is added as header row.
% \begin{macrocode}
\def\do##1{%
- \def\kvt@@tmp{##1}\trim@post@space@in\kvt@@tmp%
- \expandafter\ifstrequal\expandafter{\kvt@@tmp}{::}
+ \ifstrequal{##1}{::}
{\appto\kvt@@parseheadrows{%
\cseappto{kvt@@custheadrows@#2}{%
\csexpandonce{kvt@headings@#2}}}}
@@ -2315,7 +2515,7 @@ cherries,50g,cherries,heat up and add to bowl
% for the column in |\kvt@@curhd|) and set |\kvt@@lasthd| to the
% current one.
% \begin{macrocode}
- {\ifnum\kvt@@span>\z@ \expandafter\kvt@concludecolumn\fi
+ {\ifnum\kvt@@span>\z@ \expandafter\kvt@concludehdcolumn\fi
\ifdefvoid\kvt@@curhd{}{\ifcsdef{kvt@@hdcelldone@\kvt@@curhd}{%
\kvt@error{Header cell `\kvt@@curhd' must consist of only
consecutive columns, but it is not}%
@@ -2323,7 +2523,7 @@ cherries,50g,cherries,heat up and add to bowl
specified in `\string\NewKeyValTable{#1}'}}{}}%
\kvt@@span\@ne \let\kvt@@lasthd\kvt@@curhd}%
}\dolistcsloop{kvt@displaycols@#1}%
- \kvt@concludecolumn
+ \kvt@concludehdcolumn
% \end{macrocode}
% Finally, conclude the whole header row and append the row to the
% overall list of rows, stored in \cs{kvt@@custheadrows@\meta{tname}},
@@ -2341,8 +2541,31 @@ cherries,50g,cherries,heat up and add to bowl
% The |\kvt@rowcolorornot|\marg{color} expands to
% |\rowcolor|\marg{color} if \meta{color} is nonempty and does have no
% effect if \meta{color} is empty.
+% \begin{macro}{\kvt@rowcolorcmdornot}
+% The |\kvt@rowcolorcmdornot|\marg{cmd} expands to
+% |\rowcolor|\marg{color}, where \meta{color} is the (one-time)
+% expansion of \meta{cmd}, if \meta{cmd} is a defined macro whose
+% expansion is nonempty; its expansion is empty otherwise.
% \begin{macrocode}
\newcommand\kvt@rowcolorornot[1]{\ifstrempty{#1}{}{\rowcolor{#1}}}
+\newcommand\kvt@rowcolorcmdornot[1]{\ifdefvoid{#1}{}{%
+ \expandafter\rowcolor\expandafter{#1}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\kvt@@bodyrow}
+% The counter |\kvt@@bodyrow| is used internally in |KeyValTable|
+% environments for keeping track of rows for the background-coloring.
+% The difference between this counter and |\kvtRow| is that the former
+% also counts |uncounted| rows and is unaffected by the |resume| option.
+% The counter only counts rows produced by |\Row| and its corresponding
+% collecting counterparts. Header rows as well as manually inserted
+% rows, including those produced by macros like |\midrule| in a
+% |longtable| environment, are not counted (as opposed by the internal
+% counter of |\rowcolors|.
+% \begin{macrocode}
+\newcount\kvt@@bodyrow
% \end{macrocode}
% \end{macro}
%
@@ -2354,18 +2577,19 @@ cherries,50g,cherries,heat up and add to bowl
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\kvt@concludecolumn}
-% The |\kvt@concludecolumn| macro appends a cell, potentially spanning
+% \begin{macro}{\kvt@concludehdcolumn}
+% The |\kvt@concludehdcolumn| macro appends a cell, potentially spanning
% multiple columns, to the row under construction (which is in
% |\kvt@@tmpgrphd|).
% \begin{macrocode}
-\newcommand\kvt@concludecolumn{%
+\newcommand\kvt@concludehdcolumn{%
\kvt@@switchcol
\ifdefvoid\kvt@@lasthd{}{%
\eappto\kvt@@tmpgrphd{\noexpand\multicolumn
{\the\kvt@@span}
{\csexpandonce{kvt@@hdcell@align@\kvt@@lasthd}}
- {\csexpandonce{kvt@@hdcell@head@\kvt@@lasthd}}}%
+ {\noexpand\cmdkvt@Table@headformat
+ {\csexpandonce{kvt@@hdcell@head@\kvt@@lasthd}}}}%
% \end{macrocode}
% Mark the header cell as already used and concluded, such that another
% use of the same header cell can be detected and raise an error.
@@ -2382,7 +2606,11 @@ cherries,50g,cherries,heat up and add to bowl
% \begin{macrocode}
\def\kvt@parsehdcolspec#1#2:#3:#4\@undefined{%
% \end{macrocode}
-% First link the individual columns of a header cell to the cell.
+% Catch syntax errors first.
+% \begin{macrocode}
+ \kvt@checkcolspecempty{#4}{header cell}{#2}%
+% \end{macrocode}
+% Next, link the individual columns of a header cell to the cell.
% In this, ensure that no column is contained in more than one header
% cell.
% \begin{macrocode}
@@ -2492,6 +2720,15 @@ cherries,50g,cherries,heat up and add to bowl
% \end{macro}
% \begin{macrocode}
\kvt@SetOptions{#2}{#1}%
+% \end{macrocode}
+% Save \meta{options} globally for a potential "|resume*|" option in the
+% immediately following |KeyValTable| environment.
+% If |resume*| is specified for the current environment, then the
+% previous options are not replaced. That is, |resume*| resumes the
+% options from the previous non-resuming environment.
+% \begin{macrocode}
+ \ifbool{kvt@TableEnv@resume*}{}
+ {\gdef\kvt@@lastenvopt{#1}}%
\csuse{kvt@StartTable@\cmdkvt@Table@shape}{#2}%
}{%
\csuse{kvt@EndTable@\cmdkvt@Table@shape}}
@@ -2503,224 +2740,18 @@ cherries,50g,cherries,heat up and add to bowl
% specific table options in the current environment, based on the
% options for table type \meta{tname} and the specific \meta{options}.
% \begin{macrocode}
-\newcommand\kvt@SetOptions[2]{%
- \begingroup\edef\kvt@@do{\endgroup\noexpand%
- \kvt@setkeys{\csexpandonce{kvt@options@#1},\unexpanded{#2}}{Table}%
- }\kvt@@do}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Table Environment Code}
-%
-% \begin{macro}{\kvt@StartTabularlike}
-% The
-% |\kvt@StartTabularlike|\marg{env}\marg{tname}
-% macro begins a table environment for the given table type \meta{tname}.
-% The \meta{env} parameter specifies the concrete environment name.
-% \begin{macrocode}
-\newcommand\kvt@StartTabularlike[2]{%
-% \end{macrocode}
-% The |\kvt@@recenttable| allows the |\AfterEndEnvironment| hook for
-% |KeyValTable| to access the most recent table type.
-% \changes{v1.0}{2019/02/18}{Implemented \texttt{showrules} option}
-% \begin{macrocode}
- \gdef\kvt@@recenttable{#2}%
- \metatblAtEnd{#1}{\kvt@@endhook}\let\kvt@@endhook\relax%
- \ifbool{kvt@Table@showrules}
- {\def\kvt@@rule##1{\csuse{##1rule}}}
- {\def\kvt@@rule##1{}}%
- \appto\kvt@@endhook{\kvt@@rule{bottom}}
-% \end{macrocode}
-% The following saves the row counter value for the table type globally,
-% such that subsequent tables of the same \meta{tname} can start counting
-% from there.
-% \begin{macrocode}
- \appto\kvt@@endhook{%
- \noalign{\csxdef{kvt@rowcount@#2}{\thekvtTypeRow}}}%
-% \end{macrocode}
-% Adding caption and label, if given, to the end hook. This displays the
-% caption solely at the very end of the table.
-% \begin{macrocode}
- \ifdefempty\cmdkvt@Table@caption{}{%
- \metatblHasCaption{#1}
- {\appto\kvt@@endhook{\rowcolor{white}%
- \caption{\cmdkvt@Table@caption}}%
- \ifdefempty\cmdkvt@Table@label{}{%
- \appto\kvt@@endhook{\expandafter%
- \label\expandafter{\cmdkvt@Table@label}}}}
- {\kvt@warn{Caption lost, table environment '#1'
- does not support captions.}}}%
-% \end{macrocode}
-% The following lines perform some checks before the table environment
-% is started.
-% \begin{macrocode}
- \ifdefvoid{\cmdkvt@Table@valign}{}{\metatblCanVAlign{#1}{}
- {\undef{\cmdkvt@Table@valign}%
- \kvt@warn{Table environment '#1' of table '#2'
- does not support the vertical alignment option (valign).
- Ignoring the option}}}%
- \ifdefvoid{\cmdkvt@Table@halign}{}{\metatblCanHAlign{#1}{}
- {\undef{\cmdkvt@Table@halign}%
- \kvt@warn{Table environment '#1' of table '#2'
- does not support the horizontal alignment option (halign).
- Ignoring the option}}}%
+\newcommand\kvt@SetOptions[2]{\expandafter
+ \kvt@SetOptions@i\expandafter{\csname kvt@options@#1\endcsname}{#2}}
% \end{macrocode}
-% Initializing the row counters. The global counter |kvtTotalRow| needs
-% no local initialization.
+% The auxiliary macro |\kvt@SetOptions@i|\marg{optcmd}\marg{options}
+% first sets the options in the expansion of \meta{optcmd} and then the
+% \meta{options}.
% \begin{macrocode}
- \setcounter{kvtRow}{0}%
- \setcounter{kvtTypeRow}{\csuse{kvt@rowcount@#2}}%
-% \end{macrocode}
-% In |\kvt@@do|, the start code for the environment, including the
-% header rows, is gathered, with expansion to fill in all the table
-% settings and options.
-% \changes{v0.3}{2016/06/05}{Added \texttt{showhead} option}
-% \changes{v1.0}{2019/03/09}{Added \texttt{width} option}
-% \changes{v2.1}{2020/01/19}{Added \texttt{valign} and \texttt{halign} options}
-% \begin{macrocode}
- \begingroup\edef\kvt@@do{\endgroup
- \metatblIsTabu{#1}{}{\noexpand\kvt@dottedrowcolors
- {\ifbool{kvt@Table@showhead}
- {\the\numexpr\csuse{kvt@headrowcount@#2}+1\relax}
- {1}}%
- {\expandonce\cmdkvt@Table@rowbg}}%
- \expandafter\noexpand\csname #1\endcsname
-% \end{macrocode}
-% As background on the positions of the parameters below, here is the
-% syntax for beginning the supported environments:
-% \begin{itemize}[nosep]
-% \item|\begin{tabular}|\oarg{valign}\marg{preamble}
-% \item|\begin{tabularx}|\marg{width}\oarg{valign}\marg{preamble}
-% \item|\begin{longtable}|\oarg{halign}\marg{preamble}
-% \item|\begin{xltabular}|\oarg{halign}\marg{width}\marg{preamble}
-% \item|\begin{tabu}| to \meta{width}\oarg{valign}\marg{preamble}
-% \item|\begin{longtabu}| to \meta{width}\oarg{halign}\marg{preamble}
-% \end{itemize}
-% The above cases are covered in the following lines.
-% \begin{macrocode}
- \ifdefvoid{\cmdkvt@Table@halign}{}
- {\metatblIsTabu{#1}{}{[\cmdkvt@Table@halign]}}%
- \metatblHasWidth{#1}
- {\metatblIsTabu{#1}
- {to \expandonce\cmdkvt@Table@width}
- {{\expandonce\cmdkvt@Table@width}}}
- {}%
- \ifdefvoid{\cmdkvt@Table@valign}{}{[\cmdkvt@Table@valign]}%
- \ifdefvoid{\cmdkvt@Table@halign}{}
- {\metatblIsTabu{#1}{[\cmdkvt@Table@halign]}{}}%
- {\csexpandonce{kvt@alignments@#2}}%
-% \end{macrocode}
-% The remainder below already starts the content of the table
-% environment.
-% \begin{macrocode}
- \noexpand\kvt@@rule{top}%
- \ifbool{kvt@Table@showhead}
- {\csuse{kvt@headings@#2}\noexpand\kvt@@rule{mid}}
- {}%
- \metatblIsTabu{#1}
- {\noexpand\kvt@taburowcolors{\expandonce\cmdkvt@Table@rowbg}}{}%
- \metatblIsLong{#1}{\noexpand\endhead}{}%
- }\kvt@@do}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\kvt@dottedrowcolors}
-% The |\kvt@dottedrowcolors|\marg{start-row}\marg{colors} sets up row
-% colors using the |\rowcolors| macro of \pkgname{xcolor}.
-% The \marg{colors} parameter expects arguments of the form
-% "\meta{color1}|..|\meta{color2}" (the syntax used for the |rowbg|
-% option. The row colors then alternate between \meta{color1} and
-% \meta{color2}, starting with \meta{color1} in \meta{start-row}.
-% This macro substitutes |\taburowcolors| for non-\pkgname{tabu}
-% environments.
-% If \meta{colors} is empty, then no row colors are setup.
-% \begin{macrocode}
-\newcommand\kvt@dottedrowcolors[2]{%
- \ifstrempty{#2}{}{\kvt@dottedrowcolors@i{#1}#2\@nil}}
-\def\kvt@dottedrowcolors@i#1#2..#3\@nil{%
-% \end{macrocode}
-% Since |\rowcolors| expects its color arguments to specify the odd and
-% even color, we swap arguments depending on the parity of
-% \meta{start-row} to ensure \meta{color1} is applied to
-% \meta{start-row}.
-% \begin{macrocode}
- \ifnumodd{#1}
- {\rowcolors{#1}{#2}{#3}}
- {\rowcolors{#1}{#3}{#2}}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\kvt@taburowcolors}
-% The |\kvt@taburowcolors|\marg{colors} expands to
-% |\taburowcolors|\marg{colors} if \meta{colors} is nonempty and does
-% have no effect if \meta{color} is empty.
-% \begin{macrocode}
-\newcommand\kvt@taburowcolors[1]{%
- \ifstrempty{#1}{}{\taburowcolors{#1}}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\kvt@DefineStdTabEnv}
-% The |\kvt@DefineStdTabEnv|\oarg{shape}\marg{env}
-% macro defines the macros needed for the given \meta{shape} value.
-% If \meta{shape} is omitted, \meta{env} (the name of the environment to
-% use for the shape) is used as \meta{shape} value.
-%
-% Note: In the future, the macro could automatically add \meta{option}
-% to the list of possible values for the |shape| option.
-% \begin{macrocode}
-\newcommand\kvt@DefineStdTabEnv{\@dblarg\kvt@DefineStdTabEnv@i}
-\newcommand\kvt@DefineStdTabEnv@i[2][]{%
- \expandafter\newcommand\csname kvt@StartTable@#1\endcsname[1]{%
- \kvt@StartTabularlike{#2}{##1}}%
- \csedef{kvt@EndTable@#1}{%
- \expandafter\noexpand\csname end#2\endcsname}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\kvt@DefineDualTabEnv}
-% The |\kvt@DefineDualTabEnv|\marg{shape}\marg{nonX-env}\marg{X-env}
-% macro defines the macros for the given \meta{shape} name.
-% The macros are defined in a way such that the table environment
-% \meta{nonX-env} is used for typesetting tables that do not use |X|
-% columns and that table environment \meta{X-env} is used for
-% typesetting tables that do use |X| columns.
-% \begin{macrocode}
-\newcommand\kvt@DefineDualTabEnv[3]{%
- \expandafter\newcommand\csname kvt@StartTable@#1\endcsname[1]{%
- \kvt@ifhasXcolumns{##1}
- {\csedef{kvt@EndTable@#1}{%
- \expandafter\noexpand\csname end#3\endcsname}%
- \kvt@StartTabularlike{#3}{##1}%
- }{\csedef{kvt@EndTable@#1}{%
- \expandafter\noexpand\csname end#2\endcsname}%
- \kvt@StartTabularlike{#2}{##1}}}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\kvt@ifhasXcolumns}
-% The |\kvt@ifhasXcolumns|\marg{tname}\marg{iftrue}\marg{iffalse}
-% takes a table type \meta{tname} and checks whether the table type
-% contains an "|X|" column. If such a column is contained, the macro
-% expands to \meta{iftrue}. Otherwise, it expands to \meta{iffalse}.
-% \begin{macrocode}
-\newcommand\kvt@ifhasXcolumns[1]{%
- \expandafter\expandafter\expandafter\metatbl@ifhasXcolumns
- \expandafter\expandafter\expandafter{%
- \csname kvt@alignments@#1\endcsname}}
+\newcommand\kvt@SetOptions@i[2]{\expandafter
+ \kvt@setkeys\expandafter{#1,#2}{Table,TableEnv}}
% \end{macrocode}
% \end{macro}
%
-% The following lines define the macros for the various table shapes /
-% environments.
-% \begin{macrocode}
-\kvt@DefineStdTabEnv{tabular}
-\kvt@DefineStdTabEnv{longtable}
-\kvt@DefineStdTabEnv{tabularx}
-\kvt@DefineStdTabEnv{xltabular}
-\kvt@DefineStdTabEnv{tabu}
-\kvt@DefineStdTabEnv{longtabu}
-% \end{macrocode}
%
% \subsubsection{Table Environment Properties}
%
@@ -2759,6 +2790,7 @@ cherries,50g,cherries,heat up and add to bowl
% \begin{macrocode}
\newrobustcmd\metatblRegisterEnv[2]{%
\edef\metatbl@@envname{#1}%
+ \csdef{metatbl@@registered@#1}{true}%
\setkeys[metatbl]{EnvProp}{#2}}
% \end{macrocode}
% \end{macro}
@@ -2786,29 +2818,24 @@ cherries,50g,cherries,heat up and add to bowl
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\metatblRegistered}
% \begin{macro}{\metatblIsLong}
% \begin{macro}{\metatblIsTabu}
% \begin{macro}{\metatblHasWidth}
% \begin{macro}{\metatblHasCaption}
% \begin{macro}{\metatblCanVAlign}
% \begin{macro}{\metatblCanHAlign}
+% All macros in the following block expect three arguments,
+% \marg{env-name}\marg{iftrue}\marg{iffalse}.
% The macro
-% |\metatblIsLong|\marg{env-name}\marg{iftrue}\marg{iffalse}
-% expands to \meta{iftrue} if \meta{env-name} is a "long" table
-% environment, i.e., one that can span multiple pages. Otherwise, the
-% macro expands to \meta{iffalse}.
-% The macro
-% |\metatblIsTabu|\marg{env-name}\marg{iftrue}\marg{iffalse}
-% expands to \meta{iftrue} if \meta{env-name} is a table environment
-% that inherits from |tabu| and expands to \meta{iffalse} otherwise.
-% The macro
-% |\metatblHasWidth|\marg{env-name}\marg{iftrue}\marg{iffalse}
-% expands to \meta{iftrue} if \meta{env-name} is a table environment
-% that expects a width argument and expands to \meta{iffalse} otherwise.
-% |\metatblHasCaption|\marg{env-name}\marg{iftrue}\marg{iffalse}
-% expands to \meta{iftrue} if \meta{env-name} is a table environment
-% that supports a caption and expands to \meta{iffalse} otherwise.
-% \begin{macrocode}
+% |\metatblRegistered|
+% expands to \meta{iftrue} if \meta{env-name} has been registered via
+% |\metatblRegisterEnv| and expands to \meta{iffalse} otherwise.
+% The remaining macros expand to \meta{iftrue}, if the respective
+% property has been set to |true| in when \meta{env-name} was registered
+% via |\metatblRegisterEnv|, and expand to \meta{iffalse} otherwise.
+% \begin{macrocode}
+\newcommand\metatblRegistered[1]{\ifcsdef{metatbl@@registered@#1}}
\newcommand\metatblIsLong[1]{\ifbool{metatbl@EnvProp@isLong@#1}}
\newcommand\metatblIsTabu[1]{\ifbool{metatbl@EnvProp@isTabu@#1}}
\newcommand\metatblHasWidth[1]{\ifbool{metatbl@EnvProp@hasWidth@#1}}
@@ -2822,6 +2849,7 @@ cherries,50g,cherries,heat up and add to bowl
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\metatblUsePackage}
% \begin{macro}{\metatblRequire}
@@ -2849,7 +2877,7 @@ cherries,50g,cherries,heat up and add to bowl
% \meta{code} for addition at the end of tables based on the
% \meta{env-name} environment.
% \begin{macrocode}
-\newcommand\metatblAtEnd[2]{% #1=env-name, #2=code
+\newcommand\metatblAtEnd[2]{%
\csname metatbl@EnvProp@atEnd@#1\endcsname{#2}}
% \end{macrocode}
% \end{macro}
@@ -2956,6 +2984,305 @@ cherries,50g,cherries,heat up and add to bowl
% \end{macro}
%
%
+% \subsubsection{Table Environment Code}
+%
+% \begin{macro}{\kvt@StartTabularlike}
+% The
+% |\kvt@StartTabularlike|\marg{env}\marg{tname}
+% macro begins a table environment for the given table type \meta{tname}.
+% The \meta{env} parameter specifies the concrete environment name.
+% \begin{macrocode}
+\newcommand\kvt@StartTabularlike[2]{%
+% \end{macrocode}
+% \changes{v1.0}{2019/02/18}{Implemented \texttt{showrules} option}
+% \begin{macrocode}
+ \metatblAtEnd{#1}{\kvt@@endhook}%
+ \let\kvt@@endhook\@empty
+ \let\kvt@@prehook\@empty
+ \ifbool{kvt@Table@showrules}
+ {\def\kvt@@rule##1{\csuse{##1rule}}}
+ {\def\kvt@@rule##1{}}%
+ \appto\kvt@@prehook{\kvt@@rule{top}}%
+ \appto\kvt@@endhook{\kvt@@rule{bottom}}%
+% \end{macrocode}
+% The following saves the row counter value for the table type globally,
+% such that subsequent tables of the same \meta{tname} can start counting
+% from there. Moreover, it save the local row counter for the case that
+% the next table uses the "|resume|" option.
+% \begin{macrocode}
+ \appto\kvt@@endhook{\noalign{%
+ \csxdef{kvt@rowcount@#2}{\thekvtTypeRow}%
+ \csxdef{kvt@@rowcountlast}{\thekvtRow}}}%
+% \end{macrocode}
+% Adding caption and label.
+% \begin{macrocode}
+ \ifdefvoid\cmdkvt@TableEnv@caption
+ {\let\kvt@@caption@main\@empty
+ \let\kvt@@caption@alt\@empty}
+ {\metatblHasCaption{#1}
+ {\edef\kvt@@caption@main{%
+ \csexpandonce{kvt@caption@\cmdkvt@Table@captionpos}%
+ \ifcsvoid{cmdkvt@TableEnv@caption/lot}{}
+ {[{\csexpandonce{cmdkvt@TableEnv@caption/lot}}]}%
+ {\expandonce\cmdkvt@TableEnv@caption
+ \ifdefvoid\cmdkvt@TableEnv@label{}{%
+ \noexpand\label{\expandonce\cmdkvt@TableEnv@label}}}%
+ \noexpand\\}%
+ \ifcsvoid{cmdkvt@TableEnv@caption/alt}
+ {\def\kvt@@caption@alt{}}
+ {\edef\kvt@@caption@alt{%
+ \csexpandonce{kvt@caption@\cmdkvt@Table@captionpos}[]%
+ {\csexpandonce{cmdkvt@TableEnv@caption/alt}}%
+ \noexpand\\}}%
+ }{\kvt@error
+ {Caption lost, table backend '#1' does not support captions}
+ {Consider placing the KeyValTable environment inside a 'table'
+ environment and use the \string\caption\space macro inside.}}}%
+ \ifdefstring{\cmdkvt@Table@captionpos}{t}
+ {\let\kvt@@caption@headmain\kvt@@caption@main\let\kvt@@caption@footmain\@empty
+ \let\kvt@@caption@headalt\kvt@@caption@alt \let\kvt@@caption@footalt\@empty}
+ {\let\kvt@@caption@footmain\kvt@@caption@main\let\kvt@@caption@headmain\@empty
+ \let\kvt@@caption@footalt\kvt@@caption@alt \let\kvt@@caption@headalt\@empty}%
+ \ifbool{kvt@Table@showhead}
+ {\eappto\kvt@@prehook{\csuse{kvt@headings@#2}\noexpand\kvt@@rule{mid}}}
+ {}%
+% \end{macrocode}
+% The following lines perform some checks before the table environment
+% is started.
+% \begin{macrocode}
+ \ifdefvoid{\cmdkvt@Table@valign}{}{\metatblCanVAlign{#1}{}
+ {\undef{\cmdkvt@Table@valign}%
+ \kvt@warn{Table environment '#1' of table '#2'
+ does not support the vertical alignment option (valign).
+ Ignoring the option}}}%
+ \ifdefvoid{\cmdkvt@Table@halign}{}{\metatblCanHAlign{#1}{}
+ {\undef{\cmdkvt@Table@halign}%
+ \kvt@warn{Table environment '#1' of table '#2'
+ does not support the horizontal alignment option (halign).
+ Ignoring the option}}}%
+% \end{macrocode}
+% Initializing the row counters. The global counter |kvtTotalRow| needs
+% no local initialization.
+% \begin{macrocode}
+ \global\kvt@@bodyrow=0\relax
+ \ifbool{kvt@TableEnv@resume}
+ {\setcounter{kvtRow}{\csuse{kvt@@rowcountlast}}}
+ {\setcounter{kvtRow}{0}}%
+ \setcounter{kvtTypeRow}{\csuse{kvt@rowcount@#2}}%
+% \end{macrocode}
+% Initialize the background colors for the body rows.
+% \begin{macrocode}
+ \expandafter\kvt@setrowcolors\expandafter{\cmdkvt@Table@rowbg}%
+% \end{macrocode}
+% In |\kvt@@do|, the start code for the environment, including the
+% header rows, is gathered, with expansion to fill in all the table
+% settings and options.
+% \changes{v0.3}{2016/06/05}{Added \texttt{showhead} option}
+% \changes{v1.0}{2019/03/09}{Added \texttt{width} option}
+% \changes{v2.1}{2020/01/19}{Added \texttt{valign} and \texttt{halign} options}
+% \begin{macrocode}
+ \begingroup\edef\kvt@@do{\endgroup
+ \expandafter\noexpand\csname #1\endcsname
+% \end{macrocode}
+% As background on the positions of the parameters below, here is the
+% syntax for beginning the supported environments:
+% \begin{itemize}[nosep]
+% \item|\begin{tabular}|\oarg{valign}\marg{preamble}
+% \item|\begin{tabularx}|\marg{width}\oarg{valign}\marg{preamble}
+% \item|\begin{longtable}|\oarg{halign}\marg{preamble}
+% \item|\begin{xltabular}|\oarg{halign}\marg{width}\marg{preamble}
+% \item|\begin{tabu}| to \meta{width}\oarg{valign}\marg{preamble}
+% \item|\begin{longtabu}| to \meta{width}\oarg{halign}\marg{preamble}
+% \end{itemize}
+% The above cases are covered in the following lines.
+% \begin{macrocode}
+ \ifdefvoid{\cmdkvt@Table@halign}{}
+ {\metatblIsTabu{#1}{}{[\cmdkvt@Table@halign]}}%
+ \metatblHasWidth{#1}
+ {\metatblIsTabu{#1}
+ {to \expandonce\cmdkvt@Table@width}
+ {{\expandonce\cmdkvt@Table@width}}}
+ {}%
+ \ifdefvoid{\cmdkvt@Table@valign}{}{[\cmdkvt@Table@valign]}%
+ \ifdefvoid{\cmdkvt@Table@halign}{}
+ {\metatblIsTabu{#1}{[\cmdkvt@Table@halign]}{}}%
+ {\csexpandonce{kvt@alignments@#2}}%
+% \end{macrocode}
+% The remainder below already starts the content of the table
+% environment. It also sets the header and footer for multipage tables.
+% \begin{macrocode}
+ \expandonce\kvt@@caption@headmain
+ \expandonce\kvt@@prehook
+ \metatblIsLong{#1}{%
+ \noexpand\endfirsthead
+ \expandonce\kvt@@caption@headalt
+ \expandonce\kvt@@prehook
+ \noexpand\endhead}{}%
+ \expandonce\kvt@@caption@footmain
+ \metatblIsLong{#1}{%
+ \noexpand\endlastfoot
+ \expandonce\kvt@@caption@footalt
+ \noexpand\endfoot}{}%
+ }\kvt@@do}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\kvt@caption@b}
+% \begin{macro}{\kvt@caption@t}
+% The |\kvt@caption@b| and |\kvt@caption@t| macros behave like
+% |\caption| but add extra behavior depending on whether the caption is
+% displayed above (|\kvt@caption@t|) or below (|\kvt@caption@b|) the
+% table. Currently, |\kvt@caption@b| only fixes the spacing between the
+% table and the caption.
+% \begin{macrocode}
+\newcommand\kvt@caption@t{\caption}
+\newcommand\kvt@caption@b{%
+% \end{macrocode}
+% Fixme: The following |\baselineskip| before the caption compensates
+% that \pkgname{longtable} adds a |\baselineskip| below the caption (in
+% its macro |\LT@makecaption|) but not above. The \pkgname{ltcaption}
+% package replaces the hard-coded |\baselineskip| by |\LTcapskip| but
+% also only puts it below the caption. The code below could at least be
+% improved to use |\LTcapskip| if it is available.
+% \begin{macrocode}
+ \noalign{\parbox{0pt}{\vskip\baselineskip}}%
+ \caption}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\kvt@setrowcolors}
+% The |\kvt@setrowcolors|\marg{colors} sets up row
+% colors using the |\rowcolors| macro of \pkgname{xcolor}.
+% The \marg{colors} parameter expects arguments of the form
+% "\meta{color1}|..|\meta{color2}" (the syntax used for the |rowbg|
+% option. The row colors then alternate between \meta{color1} and
+% \meta{color2}, starting with \meta{color1} in the first row.
+% If \meta{colors} is empty, then no row colors are setup.
+% \begin{macrocode}
+\newcommand\kvt@setrowcolors[1]{%
+ \ifstrempty{#1}{}{\kvt@setrowcolors@i#1\@nil}}
+\def\kvt@setrowcolors@i#1..#2\@nil{%
+ \def\kvt@@bgcolor@odd{#1}%
+ \def\kvt@@bgcolor@even{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\kvt@userowcolors}
+% The |\kvt@userowcolors| macro macro expands to
+% |\rowcolor|\marg{color}, where \meta{color} is the background color
+% set via |\kvt@setrowcolors| for odd, respectively even rows, based on
+% |\kvt@@bodyrow|.
+% \begin{macrocode}
+\newcommand\kvt@userowcolors{\ifnumodd{\the\kvt@@bodyrow}
+ {\kvt@rowcolorcmdornot{\kvt@@bgcolor@odd}}
+ {\kvt@rowcolorcmdornot{\kvt@@bgcolor@even}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\kvt@RegisterBackend}
+% \begin{macro}{\kvt@RegisterShape}
+% The |\kvt@RegisterBackend|\marg{env} macro registers the table
+% environment \meta{env} as a table backend for use by \thispackage.
+% The |\kvt@RegisterShape|\marg{name}\marg{nonX-env}\marg{X-env}
+% registers a shape with the given \meta{name} and associates it with
+% the environment \meta{nonX-env} when the shape is used for a table
+% without |X| columns and with environment \meta{X-env} otherwise.
+% \begin{macrocode}
+\newcommand\kvt@RegisterBackend[1]{%
+ \ifinlist{#1}{\kvt@@tablebackends}
+ {\kvt@error{Backend '#1' already registered}
+ {Internal error. Check use of \string\kvt@RegisterBackend.}}
+ {\kvt@CheckMetatblEnv{#1}%
+ \listadd{\kvt@@tablebackends}{#1}%
+ \kvt@DefineStdTabEnv{#1}{#1}}}
+\newcommand\kvt@RegisterShape[3]{%
+ \ifinlist{#1}{\kvt@@tableshapes}
+ {\kvt@error{Shape '#1' already registered}
+ {Internal error. Check use of \string\kvt@RegisterShape.}}
+ {\kvt@CheckMetatblEnv{#2}\kvt@CheckMetatblEnv{#3}%
+ \listadd{\kvt@@tableshapes}{#1}%
+ \ifstrequal{#2}{#3}
+ {\kvt@DefineStdTabEnv{#1}{#2}}
+ {\kvt@DefineDualTabEnv{#1}{#2}{#3}}}}
+\newcommand\kvt@CheckMetatblEnv[1]{\metatblRegistered{#1}{}
+ {\kvt@error{Environment '#1' not supported by keyvaltable}
+ {Check \string\metatblRegisterEnv\space for how to make it
+ supported.}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\kvt@RegisterBackend}
+% \begin{macro}{\kvt@RegisterShape}
+% The macros |\kvt@@tablebackends| and |\kvt@@tableshapes| hold
+% \pkgname{etoolbox} lists of registered names of table backends and
+% table shapes.
+% \begin{macrocode}
+\newcommand\kvt@@tablebackends{}
+\newcommand\kvt@@tableshapes{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\kvt@DefineStdTabEnv}
+% The |\kvt@DefineStdTabEnv|\marg{shape}\marg{env}
+% macro defines the macros needed for the given \meta{shape} value.
+% If \meta{shape} is omitted, \meta{env} (the name of the environment to
+% use for the shape) is used as \meta{shape} value.
+% \begin{macrocode}
+\newcommand\kvt@DefineStdTabEnv[2]{%
+ \csdef{kvt@StartTable@#1}##1{%
+ \kvt@StartTabularlike{#2}{##1}}%
+ \csedef{kvt@EndTable@#1}{%
+ \expandafter\noexpand\csname end#2\endcsname}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\kvt@DefineDualTabEnv}
+% The |\kvt@DefineDualTabEnv|\marg{shape}\marg{nonX-env}\marg{X-env}
+% macro defines the macros for the given \meta{shape} name.
+% The macros are defined in a way such that the table environment
+% \meta{nonX-env} is used for typesetting tables that do not use |X|
+% columns and that table environment \meta{X-env} is used for
+% typesetting tables that do use |X| columns.
+% \begin{macrocode}
+\newcommand\kvt@DefineDualTabEnv[3]{%
+ \expandafter\newcommand\csname kvt@StartTable@#1\endcsname[1]{%
+ \kvt@ifhasXcolumns{##1}
+ {\csedef{kvt@EndTable@#1}{%
+ \expandafter\noexpand\csname end#3\endcsname}%
+ \kvt@StartTabularlike{#3}{##1}%
+ }{\csedef{kvt@EndTable@#1}{%
+ \expandafter\noexpand\csname end#2\endcsname}%
+ \kvt@StartTabularlike{#2}{##1}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\kvt@ifhasXcolumns}
+% The |\kvt@ifhasXcolumns|\marg{tname}\marg{iftrue}\marg{iffalse}
+% takes a table type \meta{tname} and checks whether the table type
+% contains an "|X|" column. If such a column is contained, the macro
+% expands to \meta{iftrue}. Otherwise, it expands to \meta{iffalse}.
+% \begin{macrocode}
+\newcommand\kvt@ifhasXcolumns[1]{%
+ \expandafter\expandafter\expandafter\metatbl@ifhasXcolumns
+ \expandafter\expandafter\expandafter{%
+ \csname kvt@alignments@#1\endcsname}}
+% \end{macrocode}
+% \end{macro}
+%
+% The following lines define the macros for the various table
+% environments.
+% \begin{macrocode}
+\kvt@RegisterBackend{tabular}
+\kvt@RegisterBackend{longtable}
+\kvt@RegisterBackend{tabularx}
+\kvt@RegisterBackend{xltabular}
+\kvt@RegisterBackend{tabu}
+\kvt@RegisterBackend{longtabu}
+% \end{macrocode}
+%
+%
% \subsubsection{Environment-Independent Parts}
%
% \begin{macro}{\kvt@AddKeyValRow}
@@ -3012,10 +3339,12 @@ cherries,50g,cherries,heat up and add to bowl
\ifdefvoid\cmdkvt@Row@above{}{%
\eappto\kvt@@row{\noexpand\noalign{\noexpand\vspace{%
\expandonce\cmdkvt@Row@above}}}}%
- \ifdefvoid\cmdkvt@Row@bg{}{%
- \eappto\kvt@@row{\noexpand\rowcolor{\expandonce\cmdkvt@Row@bg}}}%
+ \appto\kvt@@row{\noalign{\global\advance\kvt@@bodyrow\@ne}}%
\ifbool{kvt@Row@uncounted}{}{%
\appto\kvt@@row{\noalign{\kvt@stepcounters}}}%
+ \ifdefvoid\cmdkvt@Row@bg
+ {\appto\kvt@@row{\kvt@userowcolors}}
+ {\eappto\kvt@@row{\noexpand\rowcolor{\expandonce\cmdkvt@Row@bg}}}%
% \end{macrocode}
% If a row alignment is specified, a default |\multicolumn| display is
% enabled for the row's cells.
@@ -3272,54 +3601,111 @@ cherries,50g,cherries,heat up and add to bowl
% \end{macrocode}
% \end{macro}
%
-% \subsubsection{Row Styles}
+% \subsubsection{Table and Row Styles}
+%
+% The following are the user macros.
%
% \begin{macro}{\kvtNewRowStyle}
+% \changes{v2.0}{2019/03/25}{Added the macro}
+% \begin{macro}{\kvtRenewRowStyle}
+% \changes{v2.0}{2019/03/25}{Added the macro}
% The |\kvtNewRowStyle|\marg{name}\marg{row-options} macro declares
% \meta{name} as a row style and defines it to be equivalent to
% specifying \meta{row-options} directly in the optional argument of
% |\Row|. The macro fails if \meta{name} is already declared as a row
% style.
-% \changes{v2.0}{2019/03/25}{Added the macro}
+% The |\kvtRenewRowStyle|\marg{name}\marg{row-options} macro re-defines
+% an already existing row style with new \meta{row-options}.
% \begin{macrocode}
-\newcommand\kvtNewRowStyle[2]{%
- \ifcsundef{kvt@@rowstyle@#1}
- {\csdef{kvt@@rowstyle@#1}{#2}}
- {\kvt@error{Row style '#1' is already defined}{Use
- \string\kvtRenewRowStyle\space to change an existing style.}}}
+\newcommand\kvtNewRowStyle{\kvt@NewStyle{row}{\kvtRenewRowStyle}}
+\newcommand\kvtRenewRowStyle{\kvt@RenewStyle{row}{\kvtNewRowStyle}}
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
-% \begin{macro}{\kvtRenewRowStyle}
-% The |\kvtRenewRowStyle|\marg{name}\marg{row-options} macro re-defines
-% an already existing row style with new \meta{row-options}.
-% \changes{v2.0}{2019/03/25}{Added the macro}
-% \begin{macrocode}
-\newcommand\kvtRenewRowStyle[2]{%
- \ifcsundef{kvt@@rowstyle@#1}
- {\kvt@error{Row style '#1' is not defined}
- {Use \string\kvtNewRowStyle\space to define a new row style.}}
- {\csdef{kvt@@rowstyle@#1}{#2}}}
+% \begin{macro}{\kvtNewTableStyle}
+% \changes{v2.2}{2020/02/24}{Added the macro}
+% \begin{macro}{\kvtRenewTableStyle}
+% \changes{v2.2}{2020/02/24}{Added the macro}
+% The |\kvtNewTableStyle|\marg{name}\marg{options} macro declares
+% \meta{name} as a table style and defines it to be equivalent to
+% specifying \meta{options} directly in the optional argument of
+% a |KeyValTable| environment or of a |\NewKeyValTable|. The macro fails
+% if \meta{name} is already declared as a table style.
+% The |\kvtRenewTableStyle|\marg{name}\marg{options} macro re-defines
+% an already existing table style with new \meta{options}.
+% \begin{macrocode}
+\newcommand\kvtNewTableStyle{\kvt@NewStyle{table}{\kvtRenewTableStyle}}
+\newcommand\kvtRenewTableStyle{\kvt@RenewStyle{table}{\kvtNewTableStyle}}
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
-% \begin{macro}{\kvt@UseRowStyle}
-% The |\kvt@UseRowStyle|\marg{style} macro sets the row keys based on
-% the \meta{row-options} stored for the given \meta{style}.
-% \begin{macrocode}
-\newcommand\kvt@UseRowStyle[1]{%
- \ifcsundef{kvt@@rowstyle@#1}
- {\kvt@error{Row style '#1' is not defined}
- {Use \string\kvtNewRowStyle\space to define a new row style.}}
- {\kvt@setcskeys{kvt@@rowstyle@#1}{Row}}}
+% The following are the internal macros that the style code shares.
+%
+% \begin{macro}{\kvt@NewStyle}
+% \begin{macro}{\kvt@RenewStyle}
+% The |\kvt@NewStyle|\marg{type}\marg{renewcmd}\marg{name}\marg{options}
+% macro defines a new style, \meta{name}, for \meta{type} (|table| or
+% |row|) to correspond to \meta{options}.
+% Analogously,
+% |\kvt@RenewStyle|\marg{type}\marg{newcmd}\marg{name}\marg{options}
+% macro re-defines a style.
+% \begin{macrocode}
+\newcommand\kvt@NewStyle[4]{%
+ \ifcsundef{kvt@@#1style@#3}
+ {\csdef{kvt@@#1style@#3}{#4}}
+ {\kvt@error{The #1 style '#3' is already defined}{Use
+ \string#2\space to change an existing style.}}}
+\newcommand\kvt@RenewStyle[4]{%
+ \ifcsundef{kvt@@#1style@#3}
+ {\kvt@error{A #1 style '#3' is not defined}
+ {Use \string#2\space to define a new #1 style.}}
+ {\csdef{kvt@@#1style@#3}{#4}}}
% \end{macrocode}
% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\kvt@UseRowStyles}
-% The |\kvt@UseRowStyle|\marg{styles} macro sets the row keys based on
-% the \meta{row-options} for all styles in the comma-separated list
-% \meta{styles}.
+% \begin{macro}{\kvt@UseTableStyles}
+% \changes{v2.2}{2020/02/24}{Added the macro}
+% The |\kvt@UseRowStyles|\marg{styles} and
+% |\kvt@UseTableStyles|\marg{styles} macros set the keys for the given,
+% comma-separated list of \meta{styles}.
% \begin{macrocode}
\newcommand\kvt@UseRowStyles[1]{%
+ \kvt@UseStyles{row}{Row}{\kvt@NewRowStyle}{#1}}
+\newcommand\kvt@UseTableStyles[1]{%
+ \kvt@UseStyles{table}{Table}{\kvt@NewTableStyle}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\kvt@UseStyle}
+% The |\kvt@UseStyle|\marg{type}\marg{fam}\marg{newcmd}\marg{style}
+% macro sets the keys for type \meta{type} based on the \meta{options}
+% stored for the given \meta{style}.
+% The \meta{fam} identifies the
+% \pkgname{xkeyval} family for \meta{type} and \meta{newcmd} is the
+% macro for defining new \meta{type} styles.
+% \begin{macrocode}
+\newcommand\kvt@UseStyle[4]{%
+ \ifcsundef{kvt@@#1style@#4}
+ {\kvt@error{A #1 style '#4' is not defined}
+ {Use \string#3\space to define a new #1 style.}}
+ {\kvt@setcskeys{kvt@@#1style@#4}{#2}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\kvt@UseStyles}
+% The |\kvt@UseStyles|\marg{type}\marg{fam}\marg{newcmd}\marg{styles}
+% macro sets the \meta{type} keys based on the \meta{options} for all
+% styles in the comma-separated list \meta{styles}.
+% The \meta{fam} identifies the
+% \pkgname{xkeyval} family for \meta{type} and \meta{newcmd} is the
+% macro for defining new \meta{type} styles.
+% \begin{macrocode}
+\newcommand\kvt@UseStyles[4]{%
% \end{macrocode}
% We use |\kvt@xkv@disablepreset| to eliminate undesired effects that
% would otherwise be caused by preset values for keys.
@@ -3334,8 +3720,8 @@ cherries,50g,cherries,heat up and add to bowl
% |\setkeys| would then again employ the presets for |Row| (e.g., from a
% |\kvtSet{Row/bg=blue}|) and undesirably overwrite the |bg=red|.
% \begin{macrocode}
- \kvt@xkv@disablepreset[kvt]{Row}{%
- \forcsvlist\kvt@UseRowStyle{#1}}}
+ \kvt@xkv@disablepreset[kvt]{#2}{%
+ \forcsvlist{\kvt@UseStyle{#1}{#2}{#3}}{#4}}}
% \end{macrocode}
% \end{macro}
%
@@ -3737,12 +4123,12 @@ cherries,50g,cherries,heat up and add to bowl
% \begin{macrocode}
\kvt@IfVersion{<}{2.0}{%
\metatblRequire{tabu,longtabu}
- \kvt@DefineStdTabEnv[onepage]{tabu}
- \kvt@DefineStdTabEnv[multipage]{longtabu}
+ \kvt@RegisterShape{onepage}{tabu}{tabu}
+ \kvt@RegisterShape{multipage}{longtabu}{longtabu}
}{%
\metatblRequire{tabularx,longtable,xltabular}
- \kvt@DefineDualTabEnv{onepage}{tabular}{tabularx}
- \kvt@DefineDualTabEnv{multipage}{longtable}{xltabular}
+ \kvt@RegisterShape{onepage}{tabular}{tabularx}
+ \kvt@RegisterShape{multipage}{longtable}{xltabular}
}
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/knowledge/knowledge-code.dtx b/Master/texmf-dist/source/latex/knowledge/knowledge-code.dtx
index 73ec799f183..947040dac96 100644
--- a/Master/texmf-dist/source/latex/knowledge/knowledge-code.dtx
+++ b/Master/texmf-dist/source/latex/knowledge/knowledge-code.dtx
@@ -23,7 +23,7 @@
%
% \iffalse
%<head>\usepackage{expl3}
-%<head>\ProvidesExplPackage{knowledge}{2020/03/05}{1.22}{}
+%<head>\ProvidesExplPackage{knowledge}{2020/09/22}{1.24}{}
%<*driver>
\def\knowledgecode{active}
\input{knowledge.tex}
@@ -55,6 +55,8 @@
% \changes{1.20}{2019/12/03}{bug fix} %
% \changes{1.21}{2020/01/26}{bug fix} %
% \changes{1.22}{2020/03/05}{improvements} %
+% \changes{1.23}{2020/04/25}{minor change} %
+% \changes{1.24}{2020/09/22}{silent option} %
% \GetFileInfo{knowledge.sty} %
% \DoNotIndex{}
%
@@ -72,31 +74,31 @@
% \begin{macrocode}
This directory contains the package
- name: knowledge
- license: LaTeX Project Public License version 1.2 or above
- version: v1.22
- date: 2020/03/05
- author: Thomas Colcombet
- mail: thomas.colcombet@irif.fr
- web: https://www.irif.fr/~colcombe/knowledge_en.html
+ name: knowledge
+ license: LaTeX Project Public License version 1.2 or above
+ version: v1.24
+ date: 2020/09/22
+ author: Thomas Colcombet
+ mail: thomas.colcombet@irif.fr
+ web: https://www.irif.fr/~colcombe/knowledge_en.html
-Purpose:
+### Purpose:
The knowledge package for LaTeX offers a systematic way to handle
notions/concepts/terms throughout a document. In combination with
- hyperref, it is used for easily handling links inside a document (every
+ `hyperref`, it is used for easily handling links inside a document (every
use of a concept is linked to its introduction), or outside the document
(for centralizing the url's in a separate part). It also helps building an
index, and deals with scoping of concepts as well as mathematics.
It is designed to--as much as possible--not interfere with the writing of
the document.
-Install:
+### Install:
It is sufficient to have the file knowledge.sty accessible by LaTeX.
- It can be produced by `make knowledge.sty' if necessary.
- The documentation is in the file knowledge.pdf.
- A starting example can be found in knowledge-example.tex.
+ It can be produced by `make knowledge.sty` if necessary.
+ The documentation is in the file `knowledge.pdf`.
+ A starting example can be found in `knowledge-example.tex`.
-Content of the file knowledge-sources.zip:
+### Content of knowledge-sources.zip:
- README.md: this file generated while compiling knowledge.ins,
the content is in knowledge-code.dtx
- knowledge.sty: the package file (generated using knowledge.ins)
@@ -145,6 +147,12 @@ Content of the file knowledge-sources.zip:
{}
% \end{macrocode}
%
+% When uploading to arXiv, a 2016 version of LaTeX is used and one macro name has changed since this in \kl{expl3}. Let us correct it: it makes it possible to include the latest version of \kl(package){knowledge} as a .sty file:
+% \begin{macrocode}
+\cs_if_exist:NTF\ior_str_get:NN{}
+ {\cs_set_eq:NN\ior_str_get:NN\ior_get_str:NN}
+% \end{macrocode}
+%
%\AP One defines the code of \csintro{\klparse_ifnextchar:NTF}
% which is a link to \cs{\@ifnextchar},
% as well as the constant \csintro{\klparse_novalue_tl} which contains
@@ -193,10 +201,11 @@ Content of the file knowledge-sources.zip:
% \begin{macrocode}
\cs_new:Nn\knowledge_info:n
{\msg_info:nnn{knowledge}{knowledge~info}{#1}}
-\cs_new:Nn\knowledge_warning:n
- {\msg_warning:nnn{knowledge}{knowledge~warning}{#1}}
+\cs_new:Nn\knowledge_warning:n{
+ \msg_warning:nnn{knowledge}{knowledge~warning}{#1}
+ }
\cs_new:Nn\knowledge_error:n
- {\msg_error:nnn{knowledge}{knowledge~error}{#1}}
+ {\msg_error:nnn{knowledge}{knowledge~error}{#1}}
% \end{macrocode}
% The command \csintro{\knowledge_werror:Nn} takes a boolean as argument, and behaves like \cs{\knowledge_error:n} if it is true, and \cs{\knowledge_warning:n} otherwise.
% \begin{macrocode}
@@ -213,6 +222,33 @@ Content of the file knowledge-sources.zip:
\cs_generate_variant:Nn\knowledge_warning:n{x}
\cs_generate_variant:Nn\knowledge_error:n{x}
% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new:Npn\knowledge_warning:nn{
+ \bool_if:NTF\knowledge_warningsilent_bool
+ \use_none:nn
+ \msg_warning:nn
+}
+\cs_new:Npn\knowledge_warning:nnn{
+ \bool_if:NTF\knowledge_warningsilent_bool
+ \use_none:nnn
+ \msg_warning:nnn
+}
+\cs_new:Npn\knowledge_warning:nnnn{
+ \bool_if:NTF\knowledge_warningsilent_bool
+ \use_none:nnnn
+ \msg_warning:nnnn
+}
+\cs_generate_variant:Nn\knowledge_warning:nnnn{nnxx}
+\cs_new:Npn\knowledge_warning:nnnnn{
+ \bool_if:NTF\knowledge_warningsilent_bool
+ \use_none:nnnnn
+ \msg_warning:nnnnn
+}
+\cs_generate_variant:Nn\knowledge_warning:nnnnn{nnxxx}
+% \end{macrocode}
+%
+%
%\AP We provide now the `official' messages \csintro{knowledge~recursion}, \csintro{knowledge~unknown},
% \csintro{knowledge~unknown~in~scope}, \csintro{knowledge~unknown~label}, \csintro{package~required} and \csintro{knowledge~exists}.
% \begin{macrocode}
@@ -433,6 +469,11 @@ Content of the file knowledge-sources.zip:
\KnowledgeConfigureBooleanOption[\knowledge_warningstrict_bool]{strict}
% \end{macrocode}
% \begin{macrocode}
+\bool_new:N\knowledge_warningsilent_bool
+\bool_set_false:N\knowledge_warningsilent_bool
+\KnowledgeConfigureBooleanOption[\knowledge_warningsilent_bool]{silent}
+% \end{macrocode}
+% \begin{macrocode}
\bool_new:N\knowledge_configuration_quotation_bool
\KnowledgeConfigureBooleanOptionTF[\knowledge_configuration_quotation_bool]{quotation}{\klactivatequotation}{\kldeactivatequotation}
\KnowledgeConfigureTrigger{protect~quotation}{\kl_protect_environment_quotation:n{#1}}
@@ -2792,7 +2833,7 @@ Content of the file knowledge-sources.zip:
\cs_new:Nn\knowledge_kl_error_unknown_firsttime:
{\bool_if:cTF{\knowledge_variant_var:n{unknownwarning_bool}}
{\IfKnowledgePaperModeF{
- \msg_warning:nnxxx{ knowledge }{ knowledge~unknown }
+ \knowledge_warning:nnxxx{ knowledge }{ knowledge~unknown }
{\exp_not:V\knowledge_kl_key_tl}
{\exp_not:V\knowledge_kl_namespace_tl}
{\seq_use:Nn\knowledge_visible_instances_seq{|}}}
@@ -2826,7 +2867,7 @@ Content of the file knowledge-sources.zip:
\cs_new:Nn\knowledge_kl_error_unknown_in_scope_firsttime:
{\bool_if:cTF{\knowledge_variant_var:n{unknownwarning_bool}}
{\IfKnowledgePaperModeF{
- \msg_warning:nnxxx{ knowledge }{ knowledge~unknown~in~scope }
+ \knowledge_warning:nnxxx{ knowledge }{ knowledge~unknown~in~scope }
{\exp_not:V\knowledge_kl_key_tl}
{\exp_not:V\knowledge_kl_namespace_tl}
{\knowledge_kl_linkscope_tl}}}{}
@@ -2862,7 +2903,7 @@ Content of the file knowledge-sources.zip:
}
%
\IfKnowledgePaperModeF{
- \msg_warning:nnxx{ knowledge }{ knowledge~unknown~label }
+ \knowledge_warning:nnxx{ knowledge }{ knowledge~unknown~label }
{\exp_not:V\knowledge_kl_key_tl}
{\knowledge_kl_linkscope_tl}}
%
diff --git a/Master/texmf-dist/source/latex/koma-script/Makefile b/Master/texmf-dist/source/latex/koma-script/Makefile
index 5c5ae90b84c..cd385982daa 100644
--- a/Master/texmf-dist/source/latex/koma-script/Makefile
+++ b/Master/texmf-dist/source/latex/koma-script/Makefile
@@ -1,6 +1,6 @@
# ======================================================================
# Makefile
-# Copyright (c) Markus Kohm, 2002-2019
+# Copyright (c) Markus Kohm, 2002-2020
#
# This file is part of the LaTeX2e KOMA-Script bundle.
#
@@ -18,7 +18,7 @@
# This work consists of all files listed in manifest.txt.
# ----------------------------------------------------------------------
# Makefile
-# Copyright (c) Markus Kohm, 2002-2019
+# Copyright (c) Markus Kohm, 2002-2020
#
# Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
# Version 1.3c, verteilt und/oder veraendert werden.
@@ -97,16 +97,17 @@ CLS_MAIN = scrbook.cls \
scrsize11pt.clo \
scrsize12pt.clo \
scrlfile.sty \
+ scrlfile-hook.sty \
+ scrlfile-patcholdlatex.sty \
+ scrlogo.sty \
scrwfile.sty \
scrbase.sty \
scrkbase.sty \
scraddr.sty \
- scrpage2.sty \
scrtime.sty \
scrdate.sty \
scrjura.sty \
tocbasic.sty \
- tocstyle.sty \
scrextend.sty \
scrhack.sty \
float.hak \
@@ -139,7 +140,6 @@ CLS_MAIN = scrbook.cls \
scrlayer-scrpage.sty \
scrlayer-notecolumn.sty \
scrlayer-fancyhdr.sty
-# komamarks.sty
CLS_MAIN_DTX = scrkernel-basics.dtx \
scrkernel-bibliography.dtx \
@@ -166,21 +166,20 @@ CLS_MAIN_DTX = scrkernel-basics.dtx \
scrkernel-variables.dtx \
scrkernel-version.dtx \
scrlfile.dtx \
+ scrlfile-hook.dtx \
+ scrlfile-patcholdlatex.dtx \
scrwfile.dtx \
scraddr.dtx \
- scrpage.dtx \
scrtime.dtx \
scrlogo.dtx \
scrextend.dtx \
scrhack.dtx \
scrjura.dtx \
tocbasic.dtx \
- tocstyle.dtx \
scrlayer.dtx \
scrlayer-scrpage.dtx \
scrlayer-notecolumn.dtx \
scrlayer-fancyhdr.dtx
-# komamarks.dtx
STATIC_DOC = README \
INSTALL.txt \
@@ -196,11 +195,9 @@ CLS_MAIN_INS = scrmain.ins
CLS_MAIN_SUBINS = scrstrip.inc scrstrop.inc scrdocstrip.tex
-ALPHA_INS = tocstyle.dtx scrlayer-fancyhdr.dtx
-# komamarks.dtx
+ALPHA_INS = scrlayer-fancyhdr.dtx
-ALPHA_DOC = tocstyle.pdf scrlayer-fancyhdr.pdf
-# komamarks.pdf
+ALPHA_DOC = scrlayer-fancyhdr.pdf
ALPHA_DTX = $(subst .pdf,.dtx,$(ALPHA_DOC))
@@ -236,8 +233,7 @@ NODIST_GENERATED = $(CLS_DVIS) $(CLS_FILES) $(ALPHA_DOC)
GENERATED = $(NODIST_GENERATED) \
scrjura.ins \
scrwfile.ins \
- tocbasic.ins \
- tocstyle.ins tocstyle.tex tocstyle.drv
+ tocbasic.ins
MISC_SRC = $(MAKE_FILES) \
scrdoc.dtx
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/Makefile b/Master/texmf-dist/source/latex/koma-script/doc/Makefile
index 3695d148e8c..16d4526d573 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/Makefile
+++ b/Master/texmf-dist/source/latex/koma-script/doc/Makefile
@@ -1,6 +1,6 @@
# ======================================================================
# Makefile
-# Copyright (c) Markus Kohm, 2002-2014
+# Copyright (c) Markus Kohm, 2002-2020
#
# This file is part of the LaTeX2e KOMA-Script bundle.
#
@@ -18,7 +18,7 @@
# This work consists of all files listed in manifest.txt.
# ----------------------------------------------------------------------
# Makefile
-# Copyright (c) Markus Kohm, 2002-2014
+# Copyright (c) Markus Kohm, 2002-2020
#
# Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
# Version 1.3c, verteilt und/oder veraendert werden.
@@ -108,10 +108,9 @@ STATIC_DOC_LINKS= komascript.html komascr.html \
DOC_SRC = scrguide.cls scrguide.ist scrguide.gst \
guide.tex guide.bib plength.dtx \
- linkalias.tex \
- scrpage2.tex
+ linkalias.tex
-DOC_FILES = scrpage2.pdf
+DOC_FILES =
DOC_DIR = doc
@@ -136,11 +135,6 @@ prepare_local: $(STATIC_DOC_LINKS)
default_local: $(STATIC_DOC) $(DOC_FILES)
$(make_recursive)
-scrpage2.pdf: $(DOC_SRC)
- $(LATEX) $(NONSTOPMODE) $(PDFOUTPUT) scrpage2.tex
- $(LATEX) $(NONSTOPMODE) $(PDFOUTPUT) scrpage2.tex
- $(LATEX) $(NONSTOPMODE) $(PDFOUTPUT) scrpage2.tex
-
$(STATIC_DOC_LINKS): $(STATIC_DOC_SRC)
$(SYMLINK) $< $@
@@ -203,7 +197,7 @@ dist_local: $(DIST_FILES)
$(MKDIR) $(DISTDIR)/$(BIN_DIR)
$(CP) $(DIST_FILES) $(DISTDIR)
$(CP) $(BIN_FILES) $(DISTDIR)/$(BIN_DIR)
- $(CP) $(DOC_FILES) $(DISTDIR)/$(DOC_DIR)
+# $(CP) $(DOC_FILES) $(DISTDIR)/$(DOC_DIR)
$(make_recursive)
maintain_local:
@@ -215,12 +209,10 @@ maintain_local:
$(make_recursive)
distclean_local:
- $(SRM) scrpage2-ngerman.tex scrpage2-english.tex
$(make_recursive)
maintainclean_local:
- $(SRM) ChangeLog.svn ChangeLog.bak $(STATIC_DOC_LINKS) $(DOC_FILES) \
- scrpage2-ngerman.tex scrpage2-english.tex
+ $(SRM) ChangeLog.svn ChangeLog.bak $(STATIC_DOC_LINKS) $(DOC_FILES)
$(make_recursive)
edit:
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/english/common-parmarkup.tex b/Master/texmf-dist/source/latex/koma-script/doc/english/common-parmarkup.tex
index c3c39e84463..5ca141c094c 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/english/common-parmarkup.tex
+++ b/Master/texmf-dist/source/latex/koma-script/doc/english/common-parmarkup.tex
@@ -1,6 +1,6 @@
% ======================================================================
% common-parmarkup.tex
-% Copyright (c) Markus Kohm, 2001-2019
+% Copyright (c) Markus Kohm, 2001-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -18,7 +18,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% common-parmarkup.tex
-% Copyright (c) Markus Kohm, 2001-2019
+% Copyright (c) Markus Kohm, 2001-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -46,12 +46,12 @@
% ======================================================================
\KOMAProvidesFile{common-parmarkup.tex}
- [$Date: 2019-11-11 08:22:00 +0100 (Mon, 11 Nov 2019) $
+ [$Date: 2020-03-12 08:27:32 +0100 (Thu, 12 Mar 2020) $
KOMA-Script guide (common paragraph: Paragraph Markup)]
\translator{Gernot Hassenpflug\and Markus Kohm\and Krickette Murabayashi\and
Karl Hagen}
-% Date of the translated German file: 2019-11-11
+% Date of the translated German file: 2020-03-12
\section{Marking Paragraphs}
\seclabel{parmarkup}%
@@ -187,41 +187,45 @@ shown in \autoref{tab:\ThisCommonFirstLabelBase.parskip}%
% \begin{desctabular}
\entry{\PValue{false}, \PValue{off}, \PValue{no}%
\IndexOption{parskip~=\textKValue{false}}}{%
- paragraph indentation instead of vertical space; the last line of a
- paragraph can be arbitrarily filled}%
+ Paragraphs are identified by indentation of the first line by 1em.
+ There is no spacing requirement at the end of the last line
+ of a paragraph.}%
\entry{\PValue{full}, \PValue{true}, \PValue{on}, \PValue{yes}%
\IndexOption{parskip~=\textKValue{full}}%
}{%
- one line vertical space between paragraphs; there must be at least
- 1\Unit{em} free space in the last line of a paragraph}%
+ Paragraphs are identified by a vertical space of one line between
+ paragraphs. There must be at least 1\Unit{em} of free space at the
+ end of the last line of the paragraph.}%
\pventry{full-}{%
- one line vertical space between paragraphs; the last line of a paragraph
- can be arbitrarily filled\IndexOption{parskip~=\textKValue{full-}}}%
+ Paragraphs are identified by a vertical space of one line between
+ paragraphs. There is no spacing requirement at the end of the last line
+ of a paragraph.\IndexOption{parskip~=\textKValue{full-}}}%
\pventry{full+}{%
- one line vertical space between paragraphs; there must be at least a third
- of a line of free space at the end of a
- paragraph\IndexOption{parskip~=\textKValue{full+}}}%
+ Paragraphs are identified by a vertical space of one line between
+ paragraphs. There must be at least a third of a line of free space at the
+ end of a paragraph.\IndexOption{parskip~=\textKValue{full+}}}%
\pventry{full*}{%
- one line vertical space between paragraphs; there must be at least a
- quarter of a line of free space at the end of a
- paragraph\IndexOption{parskip~=\textKValue{full*}}}%
+ Paragraphs are identified by a vertical space of one line between
+ paragraphs. There must be at least a quarter of a line of free space at
+ the end of a paragraph.\IndexOption{parskip~=\textKValue{full*}}}%
\pventry{half}{%
- half a line vertical space between paragraphs; there must be at least
- 1\Unit{em} free space in the last line of a
- paragraph\IndexOption{parskip~=\textKValue{half}}}%
+ Paragraphs are identified by a vertical space of half a line between
+ paragraphs. There must be at least 1\Unit{em} free space at the end of the
+ last line of a paragraph.\IndexOption{parskip~=\textKValue{half}}}%
\pventry{half-}{%
- one line vertical space between
- paragraphs\IndexOption{parskip~=\textKValue{half-}}}%
+ Paragraphs are identified by a vertical space of half a line between
+ paragraphs. There is no spacing requirement at the end of the last line
+ of a paragraph.\IndexOption{parskip~=\textKValue{half-}}}%
\pventry{half+}{%
- half a line vertical space between paragraphs; there must be at least a
- third of a line of free space at the end of a
- paragraph\IndexOption{parskip~=\textKValue{half+}}}%
+ Paragraphs are identified by a vertical space of half a line between
+ paragraphs. There must be at least a third of a line of free space at the
+ end of a paragraph.\IndexOption{parskip~=\textKValue{half+}}}%
\pventry{half*}{%
- half a line vertical space between paragraphs; there must be at least a
- quarter of a line of free space at the end of a
- paragraph\IndexOption{parskip~=\textKValue{half*}}}%
+ Paragraphs are identified by a vertical space of half a line between
+ paragraphs. There must be at least a quarter of a line of free space at
+ the end of a paragraph.\IndexOption{parskip~=\textKValue{half*}}}%
\pventry{never}{%
- there%
+ No%
\IfThisCommonLabelBase{maincls}{%
\ChangedAt{v3.08}{\Class{scrbook}\and \Class{scrreprt}\and
\Class{scrartcl}}%
@@ -230,9 +234,9 @@ shown in \autoref{tab:\ThisCommonFirstLabelBase.parskip}%
\ChangedAt{v3.08}{\Class{scrlttr2}}%
}{}%
} %
- will be no inter-paragraph spacing even if additional vertical spacing is
- needed for the vertical adjustment with
- \Macro{flushbottom}\IndexCmd{flushbottom}%
+ inter-paragraph spacing will be inserted even if additional vertical
+ spacing is needed for vertical adjustment with
+ \Macro{flushbottom}.\IndexCmd{flushbottom}%
\IndexOption{parskip~=\textKValue{never}}}%
% \end{desctabular}
% \end{table}%
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/english/scrbase.tex b/Master/texmf-dist/source/latex/koma-script/doc/english/scrbase.tex
index d90b1ef5e0c..56f4899802b 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/english/scrbase.tex
+++ b/Master/texmf-dist/source/latex/koma-script/doc/english/scrbase.tex
@@ -1,6 +1,6 @@
% ======================================================================
% scrbase.tex
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -18,7 +18,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrbase.tex
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -46,11 +46,11 @@
% ======================================================================
\KOMAProvidesFile{scrbase.tex}
- [$Date: 2019-12-03 09:41:21 +0100 (Tue, 03 Dec 2019) $
+ [$Date: 2020-08-24 15:34:10 +0200 (Mon, 24 Aug 2020) $
KOMA-Script package scrbase]
\translator{Markus Kohm\and Melvin Hendrix\and Karl Hagen}
-% Date of the translated German file: 2019-12-03
+% Date of the translated German file: 2020-08-24
\chapter{Basic Functions in the \Package{scrbase} Package}
\labelbase{scrbase}
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/english/scrbookreportarticle.tex b/Master/texmf-dist/source/latex/koma-script/doc/english/scrbookreportarticle.tex
index fc074400d26..9136fba827c 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/english/scrbookreportarticle.tex
+++ b/Master/texmf-dist/source/latex/koma-script/doc/english/scrbookreportarticle.tex
@@ -1,6 +1,6 @@
% ======================================================================
% scrbookreportarticle.tex
-% Copyright (c) Markus Kohm, 2001-2019
+% Copyright (c) Markus Kohm, 2001-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -18,7 +18,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrbookreportarticle.tex
-% Copyright (c) Markus Kohm, 2001-2019
+% Copyright (c) Markus Kohm, 2001-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -46,7 +46,7 @@
% ============================================================================
\KOMAProvidesFile{scrbookreportarticle.tex}
- [$Date: 2019-12-06 10:40:53 +0100 (Fri, 06 Dec 2019) $
+ [$Date: 2020-07-16 10:09:01 +0200 (Thu, 16 Jul 2020) $
KOMA-Script guide (chapter: scrbook, scrreprt, scrartcl)]
\translator{Jens-Uwe Morawski\and Gernot Hassenpflug\and Markus Kohm\and
@@ -104,24 +104,21 @@ new possibilities and options that are described in the following sections.
\end{captionbeside}
\end{table}
-% TODO: new translation missing
-\iffalse% don't show the not yet translated text
-Es sei an dieser Stelle jedoch nicht verschwiegen, dass einige Paketautoren
-ihre Pakete auf Basis der Implementierung und sogar von internem Code der
-Standardklassen entwickeln und dabei keine Ruecksicht auf komplett unabhaengige
-Entwicklungen wie die \KOMAScript-Klassen nehmen. In solchen Faellen kann es
-beim ersten \LaTeX-Lauf nach der Umstellung durchaus zu Fehlermeldungen oder
-zusaezlichen Warnungen kommen. Meist lassen sich diese auf einfache Weise
-beheben. Oftmals koennen dazu die erweiterten Moeglichkeiten von \KOMAScript{}
-genutzt werden, wodurch das problematische Paket dann vollstaendig
-entfaellt. Manchmal kann auch das in \autoref{cha:scrhack} ab Seite
-\autopageref{cha:scrhack} dokumentierte \hyperref[cha:scrhack]{Paket
- \Package{scrhack}}\IndexPackage{scrhack} Abhilfe schaffen. Auch der Ersatz
-von veralteten Paketen durch aktuelle Nachfolger kann zur Beseitigung
-derartiger Probleme beitragen. Teilweise geben sogar die \KOMAScript-Klassen
-durch entsprechende Warnungen Hilfestellung bei der Loesung von
-Inkompatibilitaeten.
-\fi
+% TODO: Fix translation
+However, it should be noted here that some package authors develop their
+packages based on the implementation and even internal code of the standard
+classes, without regard to completely independent developments like the
+\KOMAScript{} classes. In such cases, the first \LaTeX{} run after the change
+may well result in error messages or additional warnings. These can usually be
+corrected in a simple way. Often the extended capabilities of \KOMAScript{}
+can be used for this purpose, which completely eliminates the problematic
+package. Sometimes the \hyperref[cha:scrhack]{package
+ \Package{scrhack}}\IndexPackage{scrhack} documented in \autoref{cha:scrhack}
+starting on \autopageref{cha:scrhack} can also help. Replacing obsolete
+packages with current successors can also help to eliminate such
+problems. Sometimes even the \KOMAScript{} classes provide warnings to help
+solve incompatibilities.
+% :ODOT
Let me say something before describing the classes. When beginning to write a
document, you are often unsure which specific options to choose. Some
@@ -327,7 +324,7 @@ tables and figures, after the table of contents (see
\begin{Declaration}
\OptionVName{toc}{setting}
\end{Declaration}
-It is becoming increasingly common to to include lists of tables and figures,
+It is becoming increasingly common to include lists of tables and figures,
the bibliography, and sometimes even the index in the table of contents. This
is surely related to the recent trend of putting lists of figures and tables
at the end of the document. Both lists are similar to the table of contents in
@@ -3797,7 +3794,7 @@ subsequent lines, is indented by the absolute value of \PName{indent}.
Whether one-line captions are set the same way as multi-line captions or are
treated separately is specified with the option
\DescRef{\LabelBase.option.captions}. For details please refer to the
-explanations of these option on
+explanations of this option on
\DescPageRef{\LabelBase.option.captions.oneline}.
\begin{Example}
@@ -4062,7 +4059,7 @@ package (see \cite{package:longtable}) to be redefined by the {\KOMAScript}
classes, activate the \Option{origlongtable} option. This\textnote{Attention!}
option must be used in the optional argument of
\DescRef{\LabelBase.cmd.documentclass}. It cannot be used as a setting of
-\DescRef{\LabelBase.cmd.KOMAoptions} or \DescRef{\LabelBase.cmd.KOMAoptions}.
+\DescRef{\LabelBase.cmd.KOMAoptions} or \DescRef{\LabelBase.cmd.KOMAoption}.
%
\EndIndexGroup
%
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/english/scrlfile.tex b/Master/texmf-dist/source/latex/koma-script/doc/english/scrlfile.tex
index f3333d31405..f6a7220ca8c 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/english/scrlfile.tex
+++ b/Master/texmf-dist/source/latex/koma-script/doc/english/scrlfile.tex
@@ -1,6 +1,6 @@
% ======================================================================
% scrlfile.tex
-% Copyright (c) Markus Kohm, 2001-2019
+% Copyright (c) Markus Kohm, 2001-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -18,7 +18,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrlfile.tex
-% Copyright (c) Markus Kohm, 2001-2019
+% Copyright (c) Markus Kohm, 2001-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -46,11 +46,11 @@
% ============================================================================
\KOMAProvidesFile{scrlfile.tex}
- [$Date: 2019-12-03 09:41:21 +0100 (Tue, 03 Dec 2019) $
+ [$Date: 2020-09-14 09:43:36 +0200 (Mon, 14 Sep 2020) $
KOMA-Script guide (chapter: scrlfile)]
\translator{Gernot Hassenpflug\and Markus Kohm\and Karl Hagen}
-% Date of the translated German file: 2019-12-03
+% Date of the translated German file: 2020-09-14
\chapter{Controlling Package Dependencies with \Package{scrlfile}}
\labelbase{scrlfile}
@@ -111,6 +111,32 @@ are also applications for normal \LaTeX{} users. Therefore, this chapter
gives examples for both groups.
%\end{Explain}
+\begin{Declaration}
+ \Option{withdeprecated}
+\end{Declaration}
+With\ChangedAt{v3.32}{\Package{scrlfile}} \LaTeX{} 2020-10-01 a completely new
+hook mechanism is available. Instead of redefining macros of the \LaTeX{}
+kernel, \Package{scrlfile} 3.32 and newer makes use of it. For this purpose it
+loads the internal package
+\Package{scrfile-hook}\IndexPackage[indexmain]{scrlfile-hook}. With older
+\LaTeX{} versions, the internal package \Package{scrlayer-patcholdkernel}%
+\IndexPackage[indexmain]{scrlfile-patcholdkernel} is used. However, since it
+was not possible to achieve identical functionality with the new mechanism in
+\LaTeX, some commands of \Package{scrlfile} were marked as
+deprecated. Furthermore, the opportunity was taken to organize the
+proliferation of command variants. If a user uses a class or package that is
+still based on the commands that are no longer supported by
+\Package{scrlfile}, the package \Package{scrlfile} can be loaded with
+\begin{lstcode}
+ \RequirePackage[withdeprecated]{scrlfile}
+\end{lstcode}
+before loading the class. \Package{scrlfile} then additionally emulates some
+of the deprecated commands in a way that should be sufficient in most
+cases. In any case, the author of the corresponding class or package should be
+informed, so that he or she can make an adaptation to the current version of
+\Package{scrlfile} or directly to \LaTeX{} from version 2020-10-01.%
+%
+\EndIndexGroup
\section{Actions Before and After Loading}
\seclabel{macros}
@@ -120,8 +146,8 @@ loading files. The commands used to do so distinguish between ordinary files,
classes, and packages.
\begin{Declaration}
- \Macro{BeforeFile}\Parameter{file}\Parameter{commands}%
- \Macro{AfterFile}\Parameter{file}\Parameter{commands}
+ \Macro{BeforeFile}\Parameter{file}\OParameter{label}\Parameter{commands}%
+ \Macro{AfterFile}\Parameter{file}\OParameter{label}\Parameter{commands}
\end{Declaration}%
\Macro{BeforeFile} ensures that the \PName{commands} are executed before the
next time \PName{file} is loaded. \Macro{AfterFile} works in a similar
@@ -130,11 +156,21 @@ been loaded. Of course, if \PName{file} is never loaded, the \PName{commands}
will never be executed. For \PName{file}, you should specify any extensions as
part of the file name, as you would with \Macro{input}.
-To implement those features, \Package{scrlfile} redefines the well-known
-\LaTeX{} command \Macro{InputIfFileExists}. If this command does not have the
-expected definition, \Package{scrlfile} issues a warning. This occurs in case
-the command is changed in future \LaTeX{} versions or has already been
-redefined by another package.
+To implement those featuresfor \LaTeX{} before version 2020-10-01,
+\Package{scrlfile-patcholdlatex} redefines the well-known \LaTeX{} command
+\Macro{InputIfFileExists}. If this command does not have the expected
+definition, \Package{scrlfile-patcholdlatex} issues a warning. This occurs in
+case the command has already been redefined by an incompatible package.
+
+With\ChangedAt{v3.32}{\Package{scrlfile}}\IndexCmd{AddToHook} \LaTeX{} from
+version 2020-10-01 on, \Package{scrlfile-hook} uses
+\Macro{AddToHook}\PParameter{file/before/\PName{file}}\OParameter{label}\Parameter{commands}
+or
+\Macro{AddToHook}\PParameter{file/after/\PName{file}}\OParameter{label}\Parameter{commands}.
+For more information on the meaning of the optional argument \PName{label},
+please refer to the corresponding manual of the \LaTeX{} core statement
+\Macro{AddToHook}. As a rule, the omission of the optional argument is
+recommended. With older \LaTeX{} versions this is ignored anyway.
\LaTeX{} uses the \Macro{InputIfFileExists} command every time it loads a
file. This occurs regardless of whether the file is loaded with
@@ -154,28 +190,33 @@ instead. Notice the parentheses surrounding the file name!%
\begin{Declaration}
- \Macro{BeforeClass}\Parameter{class}\Parameter{commands}%
- \Macro{BeforePackage}\Parameter{package}\Parameter{commands}
+ \Macro{BeforeClass}\Parameter{class}\OParameter{label}\Parameter{commands}%
+ \Macro{BeforePackage}\Parameter{package}\OParameter{label}\Parameter{commands}
\end{Declaration}%
These two commands work the same way as \DescRef{\LabelBase.cmd.BeforeFile}.
The only difference is that the \PName{class} or \PName{package} is specified
with its class or package name and not with its file name. That means you
-should omit the file extensions \File{.cls} or \File{.sty}.%
-%
+should omit the file extensions \File{.cls} or \File{.sty}.
+
+Note,\important{Attention!} \Package{scrlfile-hook} also uses \PValue{file}
+and not \PValue{class} or \PValue{package} for the hook. This is the only way
+to ensure that the execution of the \PName{commands} already takes place in
+the context of the class or package. For the meaning of the optional argument
+\PName{label} please refer to the \LaTeX{} core statement
+\Macro{AddToHook}\IndexCmd{AddToHook}. As a rule, the omission of the optional
+argument is recommended. With older \LaTeX{} versions this is ignored anyway.%
\EndIndexGroup
\begin{Declaration}
- \Macro{AfterClass}\Parameter{class}\Parameter{commands}%
- \Macro{AfterClass*}\Parameter{class}\Parameter{commands}%
- \Macro{AfterClass+}\Parameter{class}\Parameter{commands}%
- \Macro{AfterClass!}\Parameter{class}\Parameter{commands}%
- \Macro{AfterAtEndOfClass}\Parameter{class}\Parameter{commands}%
- \Macro{AfterPackage}\Parameter{package}\Parameter{commands}%
- \Macro{AfterPackage*}\Parameter{package}\Parameter{commands}%
- \Macro{AfterPackage+}\Parameter{package}\Parameter{commands}%
- \Macro{AfterPackage!}\Parameter{package}\Parameter{commands}%
- \Macro{AfterAtEndOfPackage}\Parameter{package}\Parameter{commands}
+ \Macro{AfterClass}\Parameter{class}\OParameter{label}\Parameter{commands}%
+ \Macro{AfterClass*}\Parameter{class}\OParameter{label}\Parameter{commands}%
+ \Macro{AfterAtEndOfClass}\Parameter{class}\OParameter{label}\Parameter{commands}%
+ \Macro{AfterAtEndOfClass*}\Parameter{class}\OParameter{label}\Parameter{commands}%
+ \Macro{AfterPackage}\Parameter{package}\OParameter{label}\Parameter{commands}%
+ \Macro{AfterPackage*}\Parameter{package}\OParameter{label}\Parameter{commands}%
+ \Macro{AfterAtEndOfPackage}\Parameter{package}\OParameter{label}\Parameter{commands}
+ \Macro{AfterAtEndOfPackage*}\Parameter{package}\OParameter{label}\Parameter{commands}
\end{Declaration}%
The \Macro{AfterClass} and \Macro{AfterPackage} commands work much like
\DescRef{\LabelBase.cmd.AfterFile}. The only difference is that the
@@ -188,28 +229,27 @@ function somewhat differently. If the class or package has already been
loaded, they execute the \PName{commands} immediately rather than waiting
until the next time the class or package is loaded.
-The\important[i]{\Macro{AfterClass+}\\\Macro{AfterPackage+}}
-plus\ChangedAt{v3.09}{\Package{scrlfile}} version executes the
-\PName{commands} after the class or package has been completely loaded. This
-behaviour differs from that of the starred version only if you use the command
-when the class or package has begun loading but has not yet finished. If the
-class or package has not finished loading, the \PName{commands} will always be
-executed before the commands in \Macro{AtEndOfClass} or
-\Macro{AtEndOfPackage}.
-
-If\important[i]{\Macro{AfterClass!}\\\Macro{AfterPackage!}} a class uses
-\Macro{AtEndOfClass} or a package uses \Macro{AtEndOfPackage} to execute
-commands after the class of package file has been loaded completely, and
-if you want to execute \PName{commands} after these deferred
-commands have been executed, you can use the exclamation-mark versions
-\Macro{AfterClass!}\ChangedAt{v3.09}{\Package{scrlfile}} or
-\Macro{AfterPackage!}.
-
-If\important[i]{\Macro{AfterAtEndOfClass}\\\Macro{AfterAtEndOfPackage}} you
-want to execute the \PName{commands} only when the class or package is loaded
-later and outside the context of that class or package, you can use
-\Macro{AfterAtEndOfClass}\ChangedAt{v3.09}{\Package{scrlfile}} for classes and
-\Macro{AfterAtEndOfPackage} for packages.
+However\ChangedAt{v3.09}{\Package{scrlfile}}%
+\important[i]{\Macro{AfterAtEndOfClass}\\\Macro{AfterAtEndOfPackage}}, code
+whose execution is delayed by \Macro{AtEndOfClass} or \Macro{AtEndOfPackage}
+within the class or package is first executed afterwards. In contrast,
+\Macro{AfterAtEndOfClass} or \Macro{AfterAtEndOfPackage} ensures that
+\PName{commands} are executed after such code.
+
+Again\ChangedAt{v3.32}{\Package{scrlfile}}%
+\important[i]{\Macro{AfterAtEndOfClass*}\\\Macro{AfterAtEndOfPackage*}}, there
+are star variants that ensure that \PName{commands} are executed immediately
+if the class or package is already completely loaded. If a class or package is
+currently loaded, the execution is delayed like in the version without star.
+
+Note that \Package{scrlfile-hook} uses a \PValue{file/after} hook for
+\Macro{AfterClass}, \Macro{AfterPackage} and their star variants. In contrast
+\Macro{AfterAtEndOfClass} and its star variant set a \PValue{class/after} hook
+and \Macro{AfterAtEndOfPackage} and its star variant set a
+\PValue{package/after} hook accordingly. For the meaning of the optional
+argument \PName{label} please refer to the \LaTeX{} core statement
+\Macro{AddToHook}\IndexCmd{AddToHook}. As a rule, the omission of the optional
+argument is recommended. With older \LaTeX{} versions this is ignored anyway.
\begin{Example}
The following example for class and package authors shows how \KOMAScript{}
@@ -396,46 +436,55 @@ actions before or after loading a particular file, package, or class. You can
also use \Package{scrlfile} to input a completely different file than the one
that was requested.
-
\begin{Declaration}
\Macro{ReplaceInput}\Parameter{original file}%
\Parameter{replacement file}%
\end{Declaration}%
-This\ChangedAt{v2.96}{\Package{scrlfile}} command defines a replacement for
-the file specified in the first argument, \PName{original file}. If \LaTeX{}
-is instructed to load this file, the \PName{replacement file} will be loaded
-instead. The replacement-file definition affects all files loaded using
+This command\ChangedAt{v2.96}{\Package{scrlfile}} defines a replacement
+for the file specified in the first argument, \PName{original file}. If
+\LaTeX{} is instructed to load this file, the \PName{replacement file} will be
+loaded instead. The replacement-file definition affects all files loaded using
\Macro{InputIfFileExists}, whether they are loaded by the user or internally
by \LaTeX{}. To do so, \Package{scrlfile} redefines \Macro{InputIfFileExists}.
+When\ChangedAt{v3.32}{\Package{scrlfile}} using a \LaTeX{} version up to
+2020-04-01, the package \Package{scrlfile-patcholdlatex} must redefine the
+\Macro{InputIfFileExists} statement for this purpose. When using \LaTeX{} from
+version 2020-10-01 on, \Package{scrlfile-hook} uses the internal \LaTeX{}
+statement \Macro{declare@file@substitution}. The \LaTeX{} team asks to make
+such a substitution only if there is no other way to achieve the desired
+result, for example if such a substitution is indispensable to maintain
+compatibility and if the \PName{replacement file} provides the same
+functionality.
+
\begin{Example}
- You want to input the \File{\Macro{jobname}.xua} file instead of the
- \File{\Macro{jobname.aux}} file. To do this, you use
+ You want to input the \File{\Macro{jobname}.tol} file instead of the
+ \File{\Macro{jobname.lot}} file. To do this, you use
\begin{lstcode}
- \ReplaceInput{\jobname.aux}{\jobname.xua}
+ \ReplaceInput{\jobname.tol}{\jobname.lot}
\end{lstcode}
- If additionally you replace \File{\Macro{jobname}.xua} by
- \File{\Macro{jobname}.uxa} using
+ If additionally you replace \File{\Macro{jobname}.tol} by
+ \File{\Macro{jobname}.tlo} using
\begin{lstcode}
- \ReplaceInput{\jobname.xua}{\jobname.uxa}
+ \ReplaceInput{\jobname.tol}{\jobname.tlo}
\end{lstcode}
- then \File{\Macro{jobname}.aux} will also be replaced by
- \File{\Macro{jobname}.uxa}. In this way, you can process the whole
+ then \File{\Macro{jobname}.tol} will also be replaced by
+ \File{\Macro{jobname}.tlo}. In this way, you can process the whole
replacement chain.
However, a replacement that results in a loop such as
\begin{lstcode}
- \ReplaceInput{\jobname.aux}{\jobname.xua}
- \ReplaceInput{\jobname.xua}{\jobname.aux}
+ \ReplaceInput{\jobname.lot}{\jobname.tol}
+ \ReplaceInput{\jobname.tol}{\jobname.lot}
\end{lstcode}
- will cause a \emph{stack size error}. So it is not possible to replace
+ will cause an error. So it is not possible to replace
a file that has already been replaced once by itself again.
\end{Example}
In theory, it would also be possible to use this command to replace one
-package or class with another. But \LaTeX{} would recognize that the requested
-file name does not match the name of the package or class. You can find a
-solution for this problem below.%
+package or class with another .However, it is recommended to use the following
+instructions for replacing a package or class. For older \LaTeX{} versions
+this is even mandatory.%
\EndIndexGroup
@@ -447,26 +496,8 @@ solution for this problem below.%
\end{Declaration}%
You\ChangedAt{v2.96}{\Package{scrlfile}}\textnote{Attention!} should never
replace a class or package using the \DescRef{\LabelBase.cmd.ReplaceInput}
-command described above. Doing so would result in a \LaTeX{} warning about
-mismatched class or package names. Real errors are also possible if a class or
-package is loaded under an incorrect file name.
-\begin{Example}
- You replace the \Package{scrpage2} package with its official successor,
- \Package{scrlayer-scrpage}, by using
-\begin{lstcode}[escapechar=\$]
- \ReplaceInput{scrpage2.sty}{scrlayer-scrpage.sty}$\textnote{Do not try this!}$
-\end{lstcode}
- Loading \Package{scrpage2} will then lead to the following warning:
-\begin{lstcode}
- LaTeX warning: You have requested `scrpage2',
- but the package provides `scrlayer-scrpage'.
-\end{lstcode}
- Users may be greatly confused by such a warning because they requested not
- \Package{scrlayer-scrpage} but \Package{scrpage2}, which was replaced by
- \Package{scrlayer-scrpage}.
-\end{Example}
-One solution to this problem is to use \Macro{ReplaceClass} or
-\Macro{ReplacePackage} instead of \DescRef{\LabelBase.cmd.ReplaceInput}. Note
+command described above. Instead, \Macro{ReplacePackage} should be used for
+package replacements and \Macro{ReplaceClass} for class replacements. Note
that in this case, as with \Macro{documentclass} and \Macro{usepackage}, you
should give the name of the class or package and not the complete file name.
@@ -480,66 +511,21 @@ Please\textnote{Attention!} note that the \PName{replacement class} or the
\PName{replacement package} will be loaded with the same options that would
have been passed to the \PName{original class} or \PName{original package}. If
you replace a class or package with one that does not support a requested
-option, you will receive the usual warnings and errors. However, you can
-declare such missing options using \DescRef{\LabelBase.cmd.BeforeClass} or
-\DescRef{\LabelBase.cmd.BeforePackage}.
-
-\begin{Example}
- Suppose you want to replace the \Package{oldfoo} package with the
- \Package{newfoo} package when the former package is loaded. You can do this with
-\begin{lstcode}
- \ReplacePackage{oldfoo}{newfoo}
-\end{lstcode}
- Suppose the old package provides an \Option{oldopt} option, but the new
- package does not. With
-\begin{lstcode}
- \BeforePackage{newfoo}{%
- \DeclareOption{oldopt}{%
- \PackageInfo{newfoo}%
- {option `oldopt' not supported}%
- }}%
-\end{lstcode}
- you can declare this missing option for the \Package{newfoo} package. This
- avoids an error message when the \Package{oldfoo} package is loaded with the
- option that is unsupported by \Package{newfoo}.
-
- If, on the other hand, the \Package{newfoo} package supports a
- \Option{newopt} option that should be used instead of the \Option{oldopt}
- option, you can also achieved this:
-\begin{lstcode}
- \BeforePackage{newfoo}{%
- \DeclareOption{oldopt}{%
- \ExecuteOptions{newopt}%
- }}%
-\end{lstcode}
- You can even specify different default options that apply when loading the
- new package:
-\begin{lstcode}
- \BeforePackage{newfoo}{%
- \DeclareOption{oldopt}{%
- \ExecuteOptions{newopt}%
- }%
- \PassOptionsToPackage{newdefoptA,newdefoptB}%
- {newfoo}%
- }
-\end{lstcode}
- or directly:
-\begin{lstcode}
- \BeforePackage{newfoo}{%
- \DeclareOption{oldopt}{%
- \ExecuteOptions{newopt}%
- }%
- }%
- \PassOptionsToPackage{newdefoptA,newdefoptB}%
- {newfoo}%
-\end{lstcode}
- Note that in the last example, the call to \Macro{PassOptionsToPackage}
- occurs not within but after \Macro{BeforePackage}
-\end{Example}
+option, you will receive the usual warnings and errors.
Of course, to replace classes, you must load \Package{scrlfile} before the
class using \Macro{RequirePackage} instead of \Macro{usepackage}.
-%
+
+When\ChangedAt{v3.32}{\Package{scrlfile}} using a \LaTeX{} version up to
+2020-04-01 the package \Package{scrlfile-patcholdlatex} must redefine the
+internal statements \Macro{@onefilewithoptions} and
+\Macro{@loadwithoptions}. When using \LaTeX{} from version 2020-10-01 on,
+\Package{scrlfile-hook} uses the internal \LaTeX{} statement
+\Macro{declare@file@substitution}. The \LaTeX{} Team asks to perform such a
+substitution only if there is no other way to achieve the desired result,
+e.g. if such a substitution is indispensable to maintain compatibility and the
+\PName{replacement package} or \PName{replacement class} provides the same
+functionality.%
\EndIndexGroup
@@ -551,7 +537,7 @@ class using \Macro{RequirePackage} instead of \Macro{usepackage}.
You\ChangedAt{v3.12}{\Package{scrlfile}} can also remove a replacement. You
should remove the replacement definition for an input file using
\Macro{UnReplaceInput}, for a package using \Macro{UnReplacePackage}, and for
-a class using \Macro{UnReplaceClass}.%
+a class using \Macro{UnReplaceClass}.%
\EndIndexGroup
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/english/tocbasic.tex b/Master/texmf-dist/source/latex/koma-script/doc/english/tocbasic.tex
index 7222a34c221..816c8908591 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/english/tocbasic.tex
+++ b/Master/texmf-dist/source/latex/koma-script/doc/english/tocbasic.tex
@@ -1,6 +1,6 @@
% ======================================================================
% tocbasic.tex
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -18,7 +18,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% tocbasic.tex
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -46,10 +46,10 @@
% ======================================================================
\KOMAProvidesFile{tocbasic.tex}
- [$Date: 2019-12-03 09:41:21 +0100 (Tue, 03 Dec 2019) $
+ [$Date: 2020-06-11 16:57:03 +0200 (Thu, 11 Jun 2020) $
KOMA-Script guide (package tocbasic)]
-% Date of the translated German file: 2019-12-03
+% Date of the translated German file: 2020-06-11
\translator{Markus Kohm\and Arndt Schubert\and Karl Hagen}
@@ -1027,10 +1027,11 @@ Currently, \Package{tocbasic} defines the following entry styles:
\PValue{section} and \PValue{subsection} using this style, but add extra
\PName{initial code} to the clones to change their defaults.
- The style supports 18\important{\PValue{level}, \PValue{beforeskip},
- \PValue{breakafternumber}, \PValue{dynnumwidth}, \PValue{entryformat},
- \PValue{entrynumberformat}, \PValue{indent}, \PValue{linefill},
- \PValue{numsep}, \PValue{numwidth}, \PValue{onstarthigherlevel},
+ The style supports 20\important{\PValue{level}, \PValue{beforeskip},
+ \PValue{breakafternumber}, \PValue{dynindent}, \PValue{dynnumwidth},
+ \PValue{entryformat}, \PValue{entrynumberformat}, \PValue{indent},
+ \PValue{indentfollows}, \PValue{linefill}, \PValue{numsep},
+ \PValue{numwidth}, \PValue{onstarthigherlevel},
\PValue{onstartlowerlevel}, \PValue{onstartsamelevel},
\PValue{pagenumberbox}, \PValue{pagenumberformat},
\PValue{pagenumberwidth}, \PValue{raggedentrytext},
@@ -1205,7 +1206,8 @@ Currently, \Package{tocbasic} defines the following entry styles:
\item[\PValue{toctext}]\ChangedAt{v3.27}{\Package{tocbasic}}%
is a special feature. While all other styles produce one paragraph per
entry, this one produces one paragraph for all successive entries of this
- style. With 13\important{\PValue{afterpar}, \PValue{entryformat},
+ style. With 14\important{\PValue{afterpar}, \PValue{beforeskip},
+ \PValue{entryformat},
\PValue{entrynumberformat}, \PValue{indent}, \PValue{numsep},
\PValue{onendentry}, \PValue{onendlastentry}, \PValue{onstartentry},
\PValue{onstartfirstentry}, \PValue{pagenumberformat},
@@ -1279,10 +1281,12 @@ the form \Option{\PName{key}:=\PName{entry level}} for all options of the
\PName{entry level} will be copied. For example, you can copy the current
indent of the \PValue{figure} level using \OptionValue{indent:}{figure}. For
options that expect a length or integer value, you can also use
-\Option{\PName{key}+=\PName{value}} to add\PName{value} to the current setting
+\Option{\PName{key}+=\PName{value}} to add \PName{value} to the current setting
of the \PName{key}. To subtract simply, you can use a negative \PName{value}.
For example, with \OptionValue{indent+}{1cm} you can increase the indent by
-1\Unit{cm}.
+1\Unit{cm}. For options that expect a list value, you can use
+\Option{\PName{key}+=\PName{value}} to append \PName{value} to the current
+setting of the \PName{key}.
If\ChangedAt{v3.21}{\Package{tocbasic}} you use these attributes as
options to \DescRef{\LabelBase.cmd.DeclareNewTOC} (see
@@ -1333,6 +1337,12 @@ Finally, using \Macro{DeclareTOCStyleEntry} will define the internal command
undefined, \PValue{section} is initialised with \texttt{1em plus 1pt}
instead. The initial value for all other levels is \texttt{0pt plus
.2pt}.%
+
+ In\ChangedAt{v3.31}{\Package{tocbasic}} the style \PValue{toctext} the
+ vertical space is inserted before the paragraph if it is the first entry
+ in the paragraph. It is ignored for all other entries in the paragraph. If
+ the initialization takes place via this style, \texttt{0pt} is used as
+ default.%
}%
\entry{\OptionVName{breakafternumber}{switch}}{%
\PName{switch} is one of the values for simple switches from
@@ -1344,7 +1354,7 @@ Finally, using \Macro{DeclareTOCStyleEntry} will define the internal command
false for the \PValue{tocline} style.
If\textnote{Attention!} the \Option{numberline} feature has been activated
- for a content list (see \DescRef{\LabelBase.cmd.setuptoc},
+ for a content list (see \DescRef{\LabelBase.cmd.setuptoc},
\autoref{sec:tocbasic.toc}, \DescPageRef{\LabelBase.cmd.setuptoc}), as is
the case with the \KOMAScript{} classes when the
\OptionValueRef{maincls}{toc}{numberline}%
@@ -1352,6 +1362,15 @@ Finally, using \Macro{DeclareTOCStyleEntry} will define the internal command
unnumbered entries will nevertheless have a (by default empty) number line
using the formatting of \Option{entrynumberformat}.%
}%
+ \entry{\OptionVName{dynindent}{switch}}{%
+ \ChangedAt{v3.31}{\Package{tocbasic}}%
+ \PName{switch} is one of the values for simple switches from
+ \autoref{tab:truefalseswitch}, \autopageref{tab:truefalseswitch}. If the
+ switch is active with the \PValue{tocline} style, the \PValue{indent}
+ attribute only specifies a minimum value. The maximum value is determined
+ by the number width and the indentation of the levels specified via
+ \PValue{indentfollows}.%
+ }%
\entry{\OptionVName{dynnumwidth}{switch}}{%
\PName{switch} is one of the values for simple switches from
\autoref{tab:truefalseswitch}, \autopageref{tab:truefalseswitch}. If the
@@ -1439,6 +1458,15 @@ Finally, using \Macro{DeclareTOCStyleEntry} will define the internal command
classes. For all other levels, the initialisation is done with the value
of \Macro{\PName{entry level}numdepth}, if this is defined.%
}%
+ \entry{\OptionVName{indentfollows}{list of levels}}{%
+ \ChangedAt{v3.31}{\Package{tocbasic}}%
+ If \Option{dynindent} is set with style \PValue{tocline}, the
+ comma-separated list of level names specified here is used to determine
+ the actual indentation. Levels whose names begin with ``\texttt{sub}''
+ will be initialized with the name without this prefix. The \KOMAScript{}
+ classes also automatically set appropriate values for the levels
+ \PValue{section} and \PValue{paragraph}.%
+ }%
\entry{\OptionVName{linefill}{code}}{%
With the \PValue{tocline} style, you can change what is used to fill the
space between the end of the entry text and the page number. The
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/english/typearea.tex b/Master/texmf-dist/source/latex/koma-script/doc/english/typearea.tex
index ba5c6c38946..5547cc81d7f 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/english/typearea.tex
+++ b/Master/texmf-dist/source/latex/koma-script/doc/english/typearea.tex
@@ -1,6 +1,6 @@
% ======================================================================
% typearea.tex
-% Copyright (c) Markus Kohm, 2001-2019
+% Copyright (c) Markus Kohm, 2001-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -18,7 +18,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% typearea.tex
-% Copyright (c) Markus Kohm, 2001-2019
+% Copyright (c) Markus Kohm, 2001-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -46,7 +46,7 @@
% ======================================================================
\KOMAProvidesFile{typearea.tex}%
- [$Date: 2019-10-19 12:04:47 +0200 (Sat, 19 Oct 2019) $
+ [$Date: 2020-05-09 16:41:52 +0200 (Sat, 09 May 2020) $
KOMA-Script guide (chapter: typearea)]
\translator{Markus Kohm\and Gernot Hassenpflug\and Krickette Murabayashi\and
Karl Hagen}
@@ -1785,7 +1785,7 @@ German in the German guide.)
\textit{The\textnote{Quote!} practice of doing things oneself has long been
widespread, but the results are often dubious because amateur typographers
do not see what is wrong and cannot know what is important. This is how
- you get used to to incorrect and poor typography.} [\dots] \textit{Now the
+ you get used to incorrect and poor typography.} [\dots] \textit{Now the
objection could be made that typography is a matter of taste. When it
comes to decoration, one could perhaps accept that argument, but since
typography is primarily about information, not only can mistakes irritate,
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/ngerman/common-parmarkup.tex b/Master/texmf-dist/source/latex/koma-script/doc/ngerman/common-parmarkup.tex
index 6b89f097366..c9d02206d07 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/ngerman/common-parmarkup.tex
+++ b/Master/texmf-dist/source/latex/koma-script/doc/ngerman/common-parmarkup.tex
@@ -1,6 +1,6 @@
% ======================================================================
% common-parmarkup.tex
-% Copyright (c) Markus Kohm, 2001-2019
+% Copyright (c) Markus Kohm, 2001-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -18,7 +18,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% common-parmarkup.tex
-% Copyright (c) Markus Kohm, 2001-2019
+% Copyright (c) Markus Kohm, 2001-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -46,7 +46,7 @@
% ======================================================================
\KOMAProvidesFile{common-parmarkup.tex}
- [$Date: 2019-11-11 08:22:00 +0100 (Mon, 11 Nov 2019) $
+ [$Date: 2020-03-12 08:27:32 +0100 (Thu, 12 Mar 2020) $
KOMA-Script guide (common paragraphs)]
\section{Absatzauszeichnung}
@@ -190,8 +190,8 @@ letzte Zeile eines Absatzes auch bis zum rechten Rand reichen. Einen Überblick
\entry{\PValue{false}, \PValue{off}, \PValue{no}%
\IndexOption{parskip~=\textKValue{false}}}{%
Absätze werden durch einen Einzug der ersten Zeilen von einem Geviert
- (1\Unit{em}) gekennzeichnet. Der erste Absatz eines Abschnitts wird nicht
- eingezogen.}%
+ (1\Unit{em}) gekennzeichnet. Absatzenden werden nicht
+ gekennzeichnet.}%
\entry{\PValue{full}, \PValue{true}, \PValue{on}, \PValue{yes}%
\IndexOption{parskip~=\textKValue{full}}%
}{%
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/ngerman/scrbase.tex b/Master/texmf-dist/source/latex/koma-script/doc/ngerman/scrbase.tex
index 435588f9b58..e287d4f38ca 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/ngerman/scrbase.tex
+++ b/Master/texmf-dist/source/latex/koma-script/doc/ngerman/scrbase.tex
@@ -1,6 +1,6 @@
% ======================================================================
% scrbase.tex
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -18,7 +18,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrbase.tex
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -46,7 +46,7 @@
% ======================================================================
\KOMAProvidesFile{scrbase.tex}
- [$Date: 2019-12-03 09:41:21 +0100 (Tue, 03 Dec 2019) $
+ [$Date: 2020-08-24 15:34:10 +0200 (Mon, 24 Aug 2020) $
KOMA-Script package scrbase]
\chapter{Grundlegende Funktionen im Paket \Package{scrbase}}
@@ -1996,7 +1996,7 @@ genommen wird.
\item \PValue{heading/begingroup/}\PName{Name} mit leerem Argument für
Einmalcode.
\end{enumerate}
- Der Platzhalter \PName{Name} ist dabei indentisch mit dem bei
+ Der Platzhalter \PName{Name} ist dabei identisch mit dem bei
\DescRef{maincls-experts.cmd.DeclareSectionCommand},
\DescRef{maincls-experts.cmd.DeclareNewSectionCommand} oder
\DescRef{maincls-experts.cmd.ProvideSectionCommand}
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/ngerman/scrlfile.tex b/Master/texmf-dist/source/latex/koma-script/doc/ngerman/scrlfile.tex
index 13aab4afc1f..a65ab2312fd 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/ngerman/scrlfile.tex
+++ b/Master/texmf-dist/source/latex/koma-script/doc/ngerman/scrlfile.tex
@@ -1,6 +1,6 @@
% ======================================================================
% scrlfile.tex
-% Copyright (c) Markus Kohm, 2001-2019
+% Copyright (c) Markus Kohm, 2001-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -18,7 +18,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrlfile.tex
-% Copyright (c) Markus Kohm, 2001-2019
+% Copyright (c) Markus Kohm, 2001-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -46,7 +46,7 @@
% ============================================================================
\KOMAProvidesFile{scrlfile.tex}%
- [$Date: 2019-12-03 09:41:21 +0100 (Tue, 03 Dec 2019) $
+ [$Date: 2020-09-14 09:43:36 +0200 (Mon, 14 Sep 2020) $
KOMA-Script guide (chapter: scrlfile)]
\chapter{Paketabhängigkeiten mit \Package{scrlfile}
@@ -124,6 +124,35 @@ dürfte, gibt es durchaus auch Anwendungen für normale \LaTeX-Benutzer. Deshalb
sind in diesem Kapitel auch für beide Gruppen Beispiele aufgeführt.
%\end{Explain}
+\begin{Declaration}
+ \Option{withdeprecated}
+\end{Declaration}
+Mit\ChangedAt{v3.32}{\Package{scrlfile}} \LaTeX{} 2020-10-01 steht ein
+komplett neuer \emph{Hook}-Mechanismus zur Verfügung. Statt Makros des
+\LaTeX-Kerns umzudefinieren, macht \Package{scrlfile} ab Version 3.32 davon
+auch Gebrauch. Dazu lädt es das interne Paket
+\Package{scrlfile-hook}\IndexPackage[indexmain]{scrlfile-hook}. Bei älteren
+\LaTeX-Versionen wird dagegen das interne Paket
+\Package{scrlfile-patcholdkernel}%
+\IndexPackage[indexmain]{scrlfile-patcholdkernel} verwendet. Da mit dem neuen
+Mechanismus in \LaTeX{} jedoch keine identische Funktionalität zu erreichen
+war, wurden einige Anweisungen von \Package{scrlfile} als veraltet
+markiert. Darüber hinaus wurde die Gelegenheit genutzt, den Wildwuchs an
+Befehlsvarianten zu ordnen. Sollte ein Anwender eine Klasse oder Pakete
+verwenden, die noch auf den dadurch nicht mehr unterstützten Befehlen
+basieren, so kann vor \Package{scrlfile} vor dem Laden der Klasse mit
+\begin{lstcode}
+ \RequirePackage[withdeprecated]{scrlfile}
+\end{lstcode}
+geladen werden. \Package{scrlfile} emuliert dann zusätzlich einige der
+veralteten Befehle in einer Weise, die in den meisten Fällen ausreichend sein
+sollte. In jedem Fall sollte jedoch der Autor der entsprechenden Klasse oder
+des entsprechenden Pakets verständigt werden, damit dieser eine Anpassung an
+die aktuelle Version von \Package{scrlfile} oder direkt an \LaTeX{} ab Version
+2020-10-01 vornimmt.%
+%
+\EndIndexGroup
+
\section{Aktionen vor und nach dem Laden}
\seclabel{macros}
@@ -134,8 +163,8 @@ Dateien, Klassen und Paketen unterschieden.
\begin{Declaration}
- \Macro{BeforeFile}\Parameter{Datei}\Parameter{Anweisungen}
- \Macro{AfterFile}\Parameter{Datei}\Parameter{Anweisungen}
+ \Macro{BeforeFile}\Parameter{Datei}\OParameter{Label}\Parameter{Anweisungen}
+ \Macro{AfterFile}\Parameter{Datei}\OParameter{Label}\Parameter{Anweisungen}
\end{Declaration}%
Mit Hilfe von \Macro{BeforeFile} kann dafür gesorgt werden, dass die
\PName{Anweisungen} vor dem nächsten Laden einer bestimmten \PName{Datei}
@@ -145,13 +174,23 @@ ausgeführt. Wird die Datei nie geladen, so werden die \PName{Anweisungen} in
beiden Fällen natürlich auch nie ausgeführt. Bei \PName{Datei} sind etwaige
Dateiendungen wie bei \Macro{input} als Teil des Dateinamens anzugeben.
-Um die Funktionalität bereitstellen zu können, bedient sich \Package{scrlfile}
-der bekannten \LaTeX-Anweisung
-\Macro{InputIfFileExists}. Diese\textnote{Achtung!} wird hierzu umdefiniert.
-Falls die Anweisung nicht die erwartete Definition hat, gibt
-\Package{scrlfile} eine Warnung aus. Dies geschieht für den Fall, dass die
-Anweisung in späteren \LaTeX-Versionen geändert wird oder bereits von einem
-anderen Paket umdefiniert wurde.
+Um die Funktionalität für \LaTeX{} vor Version 2020-10-01 bereitstellen zu
+können, bedient sich \Package{scrlfile-patcholdlatex} der bekannten
+\LaTeX-Anweisung \Macro{InputIfFileExists}. Diese\textnote{Achtung!} wird
+hierzu umdefiniert. Falls die Anweisung nicht die erwartete Definition hat,
+gibt \Package{scrlfile-patcholdlatex} eine Warnung aus. Dies geschieht für
+den Fall, dass die Anweisung bereits von einem inkompatiblen Paket umdefiniert
+wurde.
+
+Bei\ChangedAt{v3.32}{\Package{scrlfile}}\IndexCmd{AddToHook} \LaTeX{} ab
+Version 2020-10-01 wird von \Package{scrlfile-hook} hingegen
+\Macro{AddToHook}\PParameter{file/before/\PName{Datei}}\OParameter{Label}\Parameter{Anweisungen}
+beziehungsweise
+\Macro{AddToHook}\PParameter{file/after/\PName{Datei}}\OParameter{Label}\Parameter{Anweisungen}
+verwendet. Näheres zur Bedeutung des optionalen Arguments \PName{Label} ist
+der zugehörigen Anleitung zur \LaTeX-Kern-Anweisung \Macro{AddToHook} zu
+entnehmen. Empfohlen wird in der Regel der Verzicht auf das optionale
+Argument. Bei älteren \LaTeX-Versionen wird dieses ohnehin ignoriert.
Die Anweisung \Macro{InputIfFileExists} wird von \LaTeX{} immer verwendet,
wenn eine Datei geladen werden soll. Dies geschieht unabhängig davon, ob die
@@ -174,68 +213,76 @@ verwenden. Beachten Sie die Klammern um den Dateinamen!%
\begin{Declaration}
- \Macro{BeforeClass}\Parameter{Klasse}\Parameter{Anweisungen}
- \Macro{BeforePackage}\Parameter{Paket}\Parameter{Anweisungen}
+ \Macro{BeforeClass}\Parameter{Klasse}\OParameter{Label}\Parameter{Anweisungen}
+ \Macro{BeforePackage}\Parameter{Paket}\OParameter{Label}\Parameter{Anweisungen}
\end{Declaration}%
Diese beiden Befehle arbeiten vergleichbar zu
\DescRef{\LabelBase.cmd.BeforeFile} mit dem einen Unterschied, dass die
\PName{Klasse} beziehungsweise das \PName{Paket} mit seinem Namen und nicht
mit seinem Dateinamen angegeben wird. Die Endungen »\File{.cls}« und
-»\File{.sty}« entfallen hier also.%
-%
+»\File{.sty}« entfallen hier also.
+
+Es ist zu beachten\important{Achtung!}, dass hier von \Package{scrlfile-hook}
+ebenfalls \PValue{file} und nicht \PValue{class} respektive \PValue{package}
+für den Hook verwendet wird. Nur so ist sichergestellt, dass die Ausführung
+der \PName{Anweisungen} bereits im Kontext der Klasse beziehungsweise des
+Pakets erfolgt. Zur Bedeutung des optionalen Arguments \PName{label} sei
+wiederum auf die Anleitung der \LaTeX-Kernanweisung
+\Macro{AddToHook}\IndexCmd{AddToHook} verwiesen. Empfohlen wird in der Regel
+der Verzicht auf das optionale Argument. Bei älteren \LaTeX-Versionen wird
+dieses ohnehin ignoriert.%
\EndIndexGroup
\begin{Declaration}
- \Macro{AfterClass}\Parameter{Klasse}\Parameter{Anweisungen}
- \Macro{AfterClass*}\Parameter{Klasse}\Parameter{Anweisungen}
- \Macro{AfterClass+}\Parameter{Klasse}\Parameter{Anweisungen}
- \Macro{AfterClass!}\Parameter{Klasse}\Parameter{Anweisungen}
- \Macro{AfterAtEndOfClass}\Parameter{Klasse}\Parameter{Anweisungen}
- \Macro{AfterPackage}\Parameter{Paket}\Parameter{Anweisungen}
- \Macro{AfterPackage*}\Parameter{Paket}\Parameter{Anweisungen}
- \Macro{AfterPackage+}\Parameter{Paket}\Parameter{Anweisungen}
- \Macro{AfterPackage!}\Parameter{Paket}\Parameter{Anweisungen}
- \Macro{AfterAtEndOfPackage}\Parameter{Paket}\Parameter{Anweisungen}
+ \Macro{AfterClass}\Parameter{Klasse}\OParameter{Label}\Parameter{Anweisungen}
+ \Macro{AfterClass*}\Parameter{Klasse}\OParameter{Label}\Parameter{Anweisungen}
+ \Macro{AfterAtEndOfClass}\Parameter{Klasse}\OParameter{Label}\Parameter{Anweisungen}
+ \Macro{AfterAtEndOfClass*}\Parameter{Klasse}\OParameter{Label}\Parameter{Anweisungen}
+ \Macro{AfterPackage}\Parameter{Paket}\OParameter{Label}\Parameter{Anweisungen}
+ \Macro{AfterPackage*}\Parameter{Paket}\OParameter{Label}\Parameter{Anweisungen}
+ \Macro{AfterAtEndOfPackage}\Parameter{Paket}\OParameter{Label}\Parameter{Anweisungen}
+ \Macro{AfterAtEndOfPackage*}\Parameter{Paket}\OParameter{Label}\Parameter{Anweisungen}
\end{Declaration}%
-Die Anweisungen \Macro{AfterClass} und \Macro{AfterPackage} arbeiten
-weitgehend wie \DescRef{\LabelBase.cmd.AfterFile}, mit dem winzigen
-Unterschied, dass die \PName{Klasse} beziehungsweise das \PName{Paket} mit
-seinem Namen und nicht mit seinem Dateinamen angegeben wird. Die Endungen
-»\File{.cls}« und »\File{.sty}« entfallen hier also.
+Die\important[i]{\Macro{AfterClass}\\\Macro{AfterPackage}} Anweisungen
+\Macro{AfterClass} und \Macro{AfterPackage} arbeiten weitgehend wie
+\DescRef{\LabelBase.cmd.AfterFile}, mit dem winzigen Unterschied, dass die
+\PName{Klasse} beziehungsweise das \PName{Paket} mit seinem Namen und nicht
+mit seinem Dateinamen angegeben wird. Die Endungen »\File{.cls}« und
+»\File{.sty}« entfallen hier also.
Bei\important[i]{\Macro{AfterClass*}\\\Macro{AfterPackage*}} den
-Sternvarianten gibt es eine zusätzliche Funktionalität. Wurde oder wird die
-entsprechende Klasse oder das entsprechende Paket bereits geladen, so werden
-die \PName{Anweisungen} nicht nach dem nächsten Laden, sondern unmittelbar
-ausgeführt.
-
-Bei\important[i]{\Macro{AfterClass+}\\\Macro{AfterPackage+}} der
-Plusvariante\ChangedAt{v3.09}{\Package{scrlfile}} werden die
-\PName{Anweisungen} sicher erst dann ausgeführt, wenn die Klasse oder das
-Paket vollständig geladen wurde. Der Unterschied zwischen der Stern- und der
-Plusvariante kommt nur zum Tragen, falls die Anweisung verwendet wird, während
-das Laden der Klassen bzw. des Pakets zwar bereits begonnen hat, aber noch
-nicht beendet wurde. Wenn das Laden der Klasse bzw. des Pakets noch nicht
-abgeschlossen wurde, werden die \PName{Anweisungen} in allen Fällen vor den in
-der Klasse bzw. dem Paket mit \Macro{AtEndOfClass} oder \Macro{AtEndOfPackage}
-verzögerten Anweisungen ausgeführt.
-
-Um\important[i]{\Macro{AfterClass!}\\\Macro{AfterPackage!}} eine Ausführung
-nach den in der Klasse oder dem Paket selbst mit \Macro{AtEndOfClass} oder
-\Macro{AtEndOfPackage} verzögerten Anweisungen sicherzustellen, ist die
-Variante mit Ausrufezeichen\ChangedAt{v3.09}{\Package{scrlfile}} zu
-verwenden. Bei dieser Spielart werden die \PName{Anweisungen} nicht mehr im
-Kontext der angegebenen Klasse oder des angegebenen Pakets ausgeführt.
-
-Will\important[i]{\Macro{AfterAtEndOfClass}\\\Macro{AfterAtEndOfPackage}} man
-nur für den Fall, dass die Klasse bzw. das Paket noch nicht geladen wurde,
-erreichen, dass \PName{Anweisungen} nach der Klasse bzw. dem Paket und
-außerhalb des Kontextes der angegebenen Klasse bzw. des angegebenen Pakets
-ausgeführt werden, so verwendet man für Klassen die Anweisung
-\Macro{AfterAtEndOfClass}\ChangedAt{v3.09}{\Package{scrlfile}}
-und für Pakete \Macro{AfterAtEndOfPackage}.%
-%
+Sternvarianten \Macro{AfterClass*} und \Macro{AfterPackage*} gibt es eine
+zusätzliche Funktionalität. Wurde oder wird die entsprechende Klasse oder das
+entsprechende Paket bereits geladen, so werden die \PName{Anweisungen} nicht
+nach dem nächsten Laden, sondern unmittelbar ausgeführt.
+
+Code,\ChangedAt{v3.09}{\Package{scrlfile}}%
+\important[i]{\Macro{AfterAtEndOfClass}\\\Macro{AfterAtEndOfPackage}}
+dessen Ausführung per \Macro{AtEndOfClass}\IndexCmd{AtEndOfClass} oder
+\Macro{AtEndOfPackage}\IndexCmd{AtEndOfPackage} innerhalb der Klasse
+respektive des Pakets verzögert wird, wird allerdings erst danach
+ausgeführt. Mit \Macro{AfterAtEndOfClass} beziehungsweise
+\Macro{AfterAtEndOfPackage} wird dagegen sichergestellt, dass
+\PName{Anweisungen} erst nach solchem Code ausgeführt wird.
+
+Auch\ChangedAt{v3.32}{\Package{scrlfile}}%
+\important[i]{\Macro{AfterAtEndOfClass*}\\\Macro{AfterAtEndOfPackage*}}
+hierzu gibt es Sternvarianten, die dafür sorgen, dass \PName{Anweisungen}
+sofort ausgeführt werden, falls die Klasse beziehungsweise das Paket bereits
+vollständig geladen ist. Wird eine Klasse oder ein Paket gerade geladen, so
+wird die Ausführung wie bei der Version ohne Stern verzögert.
+
+Es ist zu beachten, dass \Package{scrlfile-hook} für \Macro{AfterClass},
+\Macro{AfterPackage} und deren Sternvarianten einen \PValue{file/after}-Hook
+verwendet. Dagegen setzen \Macro{AfterAtEndOfClass} und dessen Sternvariante
+einen \PValue{class/after}-Hook und \Macro{AfterAtEndOfPackage} und dessen
+Sternvariante entsprechend einen \PValue{package/after}-Hook. Zur Bedeutung
+des optionalen Arguments \PName{label} sei wiederum auf die Anleitung der
+\LaTeX-Kernanweisung \Macro{AddToHook}\IndexCmd{AddToHook}
+verwiesen. Empfohlen wird in der Regel der Verzicht auf das optionale
+Argument. Bei älteren \LaTeX-Versionen wird dieses ohnehin ignoriert.
+
\begin{Example}
Als Beispiel für Paket- oder Klassenautoren will ich zunächst
erklären, wie \KOMAScript{} selbst Gebrauch von den neuen
@@ -266,7 +313,7 @@ und für Pakete \Macro{AfterAtEndOfPackage}.%
es sich um eine verträgliche Version handelt. Falls dies nicht der
Fall ist, wird eine Warnung ausgegeben.
- An anderer Stelle findet sich in drei der \KOMAScript-Klassen Folgendes:
+ An anderer Stelle findet sich in drei der \KOMAScript-Klassen folgendes:
\begin{lstcode}
\AfterPackage{caption2}{%
\renewcommand*{\setcapindent}{%
@@ -447,38 +494,47 @@ der Datei mit dem als erstes angegebenen \PName{Dateiname} definiert. Wenn
\LaTeX{} anschließend angewiesen wird, diese Datei zu laden, wird stattdessen
\PName{Ersatzdatei} geladen. Die Definition der Ersatzdatei wirkt sich auf
alle Dateien aus, die vom Anwender oder intern von \LaTeX{} mit Hilfe von
-\Macro{InputIfFileExists} geladen werden. Dazu ist es allerdings erforderlich,
-dass \Package{scrlfile} diese Anweisung umdefiniert.
+\Macro{InputIfFileExists} geladen werden.
+
+Bei\ChangedAt{v3.32}{\Package{scrlfile}} Verwendung eines \LaTeX-Version bis
+2020-04-01 muss dass Paket \Package{scrlfile-patcholdlatex} dazu die Anweisung
+\Macro{InputIfFileExists} umdefinieren. Bei Verwendung von \LaTeX{} ab Version
+2020-10-01 wird hingegen von \Package{scrlfile-hook} die interne
+\LaTeX-Anweisung \Macro{declare@file@substitution} verwendet. Das
+\LaTeX{}-Team bittet darum, eine derartige Dateiersetzung nur vorzunehmen,
+wenn es keine andere Möglichkeit gibt, zu dem gewünschten Ergebnis zu
+gelangen, beispielsweise wenn eine solche Ersetzung zum Erhalt der
+Kompatibilität unabdingbar ist und dabei die \PName{Ersatzdatei} die gleiche
+Funktionalität bereitstellt.
\begin{Example}
- Sie wollen, dass anstelle der Datei \File{\Macro{jobname}.aux}, die Datei
- \File{\Macro{jobname}.xua} geladen wird. Dazu verwenden Sie:
+ Sie wollen, dass anstelle der Datei \File{\Macro{jobname}.lot}, die Datei
+ \File{\Macro{jobname}.tol} geladen wird. Dazu verwenden Sie:
\begin{lstcode}
- \ReplaceInput{\jobname.aux}{\jobname.xua}
+ \ReplaceInput{\jobname.lot}{\jobname.tol}
\end{lstcode}
- Wenn Sie nun zusätzlich \File{\Macro{jobname}.xua} auch noch durch
- \File{\Macro{jobname}.uxa} ersetzen:
+ Wenn Sie nun zusätzlich \File{\Macro{jobname}.tol} auch noch durch
+ \File{\Macro{jobname}.tlo} ersetzen:
\begin{lstcode}
- \ReplaceInput{\jobname.xua}{\jobname.uxa}
+ \ReplaceInput{\jobname.tol}{\jobname.tlo}
\end{lstcode}
- dann wird \File{\Macro{jobname}.aux} am Ende durch
- \File{\Macro{jobname}.uxa} ersetzt. Es wird also die komplette
+ dann wird \File{\Macro{jobname}.lot} am Ende durch
+ \File{\Macro{jobname}.tlo} ersetzt. Es wird also die komplette
Ersetzungskette abgearbeitet.
Einer Ersetzung im Kreis:
\begin{lstcode}
- \ReplaceInput{\jobname.aux}{\jobname.xua}
- \ReplaceInput{\jobname.xua}{\jobname.aux}
+ \ReplaceInput{\jobname.lot}{\jobname.tol}
+ \ReplaceInput{\jobname.tol}{\jobname.lot}
\end{lstcode}
- würde jedoch zu einem \emph{stack size error} führen. Es ist also nicht
- möglich, eine einmal ersetzte Datei wieder durch ihren Ursprung zu ersetzen.
+ würde jedoch zu einem Fehler führen. Es ist also nicht möglich, eine einmal
+ ersetzte Datei wieder durch ihren Ursprung zu ersetzen.
\end{Example}
Theoretisch wäre es auch möglich, auf diesem Wege ein Paket durch ein anderes
-oder eine Klasse durch eine andere zu ersetzen. Dabei würde \LaTeX{} aber
-erkennen, dass die angeforderten Dateinamen nicht zum Namen des Pakets oder
-der Klasse passen. Eine Lösung dieses Problems finden Sie nachfolgend.
-%
+oder eine Klasse durch eine andere zu ersetzen. Es wird jedoch empfohlen, für
+das Ersetzen eines Pakets oder einer Klasse die nachfolgenden Anweisungen zu
+verwenden. Bei älteren \LaTeX-Versionen ist dies sogar zwingend.%
\EndIndexGroup
@@ -488,101 +544,40 @@ der Klasse passen. Eine Lösung dieses Problems finden Sie nachfolgend.
\end{Declaration}
Eine\ChangedAt{v2.96}{\Package{scrlfile}}\textnote{Achtung!} Klasse oder ein
Paket sollte niemals mit Hilfe der oben erklärten Anweisung
-\DescRef{\LabelBase.cmd.ReplaceInput} ersetzt werden. In diesem Fall würde
-\LaTeX{} eine Warnung über nicht übereinstimmende Klassen- oder Paketnamen
-melden. Auch echte Fehler sind möglich, wenn eine Klasse oder ein Paket unter
-einem falschen Dateinamen geladen wird.
-\begin{Example}
- Sie ersetzen das Paket \Package{scrpage2} durch dessen offiziellen
- Nachfolger \Package{scrlayer-scrpage}, indem Sie
-\begin{lstcode}[escapechar=\$]
- \ReplaceInput{scrpage2.sty}{scrlayer-scrpage.sty}$\textnote{Nicht nachmachen!}$
-\end{lstcode}
- verwenden. Dies wird beim Laden von \Package{scrpage2} zu der Warnung
-\begin{lstcode}
- LaTeX warning: You have requested `scrpage2',
- but the package provides
- `scrlayer-scrpage'.
-\end{lstcode}
- führen. Für den Anwender wäre diese Warnung mehr als verwirrend, hat er doch
- gar nicht \Package{scrlayer-scrpage}, sondern tatsächlich \Package{scrpage2}
- angefordert, das jedoch durch \Package{scrlayer-scrpage} ersetzt wurde.
-\end{Example}
-Eine Lösung dieser Probleme besteht nun darin, statt
-\DescRef{\LabelBase.cmd.ReplaceInput} eine der Anweisungen
-\Macro{ReplaceClass} oder \Macro{ReplacePackage} zu verwenden. Es ist zu
-beachten, dass wie bei \Macro{documentclass} und \Macro{usepackage} der Name
-der Klasse oder des Pakets und nicht deren kompletter Dateiname anzugeben ist.
-
-Die Ersetzung funktioniert für Klassen, die mit
-\Macro{documentclass}, \Macro{LoadClassWithOptions} oder \Macro{LoadClass}
-geladen werden. Für Pakete funktioniert die Ersetzung beim Laden mit
-\Macro{usepackage}, \Macro{RequirePackageWithOptions} und
-\Macro{RequirePackage}.
+\DescRef{\LabelBase.cmd.ReplaceInput} ersetzt werden. Stattdessen sollte für
+Paketersetzungen \Macro{ReplacePackage} und für Klassenersetzungen
+\Macro{ReplaceClass} verwendet werden. Es ist zu beachten, dass wie bei
+\Macro{documentclass} und \Macro{usepackage} der Name der Klasse oder des
+Pakets und nicht deren kompletter Dateiname anzugeben ist.
+
+Die Ersetzung funktioniert für Klassen, die mit \Macro{documentclass},
+\Macro{LoadClassWithOptions} oder \Macro{LoadClass} geladen werden. Für Pakete
+funktioniert die Ersetzung beim Laden mit \Macro{usepackage},
+\Macro{RequirePackageWithOptions} und \Macro{RequirePackage}.
Es\textnote{Achtung!} ist zu beachten, dass die \PName{Ersatzklasse} oder das
\PName{Ersatzpaket} mit denselben Optionen geladen wird, mit denen die
ursprünglich geforderte Klasse oder das ursprünglich geforderte Paket geladen
würden. Wird ein Paket oder eine Klasse durch ein Paket oder eine Klasse
ersetzt, die eine geforderte Option nicht unterstützt, würde das zu den
-üblichen Warnungen und Fehlern führen. Es ist jedoch möglich, solche in der
-\PName{Ersatzklasse} oder dem \PName{Ersatzpaket} fehlenden Optionen per
-\DescRef{\LabelBase.cmd.BeforeClass} oder
-\DescRef{\LabelBase.cmd.BeforePackage} neu zu definieren.
-
-\begin{Example}
- Angenommen, das Paket \Package{oldfoo} soll beim Laden durch das
- Paket \Package{newfoo} ersetzt werden. Dies wird mit
-\begin{lstcode}
- \ReplacePackage{oldfoo}{newfoo}
-\end{lstcode}
- erreicht. Das alte Paket hat eine Option \Option{oldopt}, die das neue Paket
- jedoch nicht hat. Mit
-\begin{lstcode}
- \BeforePackage{newfoo}{%
- \DeclareOption{oldopt}{%
- \PackageInfo{newfoo}%
- {option `oldopt' not supported}}}%
-\end{lstcode}
- wird diese Option nun für das Paket \Package{newfoo} nachdefiniert. Dadurch
- wird vermieden, dass beim Laden des Pakets \Package{oldfoo} ein Fehler über
- die im Paket \Package{newfoo} nicht unterstützte Option gemeldet wird.
-
- Existiert hingegen eine Option \Option{newopt}, die anstelle der Option
- \Option{oldopt} verwendet werden soll, so kann dies ebenfalls erreicht
- werden:
-\begin{lstcode}
- \BeforePackage{newfoo}{%
- \DeclareOption{oldopt}{\ExecuteOptions{newopt}}}%
-\end{lstcode}
- Es ist sogar möglich, festzulegen, dass beim Laden des neuen Pakets
- andere Voreinstellung gelten sollen:
-\begin{lstcode}
- \BeforePackage{newfoo}{%
- \DeclareOption{oldopt}{\ExecuteOptions{newopt}}%
- \PassOptionsToPackage{newdefoptA,newdefoptB}%
- {newfoo}%
- }
-\end{lstcode}
- oder auch direkt:
-\begin{lstcode}
- \BeforePackage{newfoo}{%
- \DeclareOption{oldopt}{\ExecuteOptions{newopt}}%
- }%
- \PassOptionsToPackage{newdefoptA,newdefoptB}%
- {newfoo}%
-\end{lstcode}
- \iffalse% Umbruchkorrektur
- Man beachte, dass im letzten Beispiel der Aufruf von
- \Macro{PassOptionsToPackage} nicht innerhalb, sondern nach
- \Macro{BeforePackage} erfolgt.%
- \fi%
-\end{Example}
+üblichen Warnungen und Fehlern führen.
Damit Klassen mit \Macro{ReplaceClass} ersetzt werden können, ist es natürlich
erforderlich \Package{scrlfile} vor der Klasse zu laden. Dazu ist
\Macro{RequirePackage}\IndexCmd{RequirePackage} anstelle von
-\DescRef{maincls.cmd.usepackage} zu verwenden (siehe \cite{latex:clsguide}).%
+\DescRef{maincls.cmd.usepackage} zu verwenden (siehe \cite{latex:clsguide}).
+
+Bei\ChangedAt{v3.32}{\Package{scrlfile}} Verwendung eines \LaTeX-Version bis
+2020-04-01 muss dass Paket \Package{scrlfile-patcholdlatex} die internen
+Anweisung \Macro{@onefilewithoptions} und \Macro{@loadwithoptions}
+umdefinieren. Bei Verwendung von \LaTeX{} ab Version 2020-10-01 wird hingegen
+von \Package{scrlfile-hook} die interne \LaTeX-Anweisung
+\Macro{declare@file@substitution} verwendet. Das \LaTeX{}-Team bittet darum,
+eine derartige Ersetzung nur vorzunehmen, wenn es keine andere Möglichkeit
+gibt, zu dem gewünschten Ergebnis zu gelangen, beispielsweise wenn eine solche
+Ersetzung zum Erhalt der Kompatibilität unabdingbar ist und dabei die
+\PName{Ersatzpaket} beziehungsweise \PName{Ersatzklasse} die gleiche
+Funktionalität bereitstellt.%
\EndIndexGroup
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/ngerman/tocbasic.tex b/Master/texmf-dist/source/latex/koma-script/doc/ngerman/tocbasic.tex
index 843d345f9d5..bafc7aadc26 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/ngerman/tocbasic.tex
+++ b/Master/texmf-dist/source/latex/koma-script/doc/ngerman/tocbasic.tex
@@ -1,6 +1,6 @@
% ======================================================================
% tocbasic.tex
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -18,7 +18,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% tocbasic.tex
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -46,7 +46,7 @@
% ======================================================================
\KOMAProvidesFile{tocbasic.tex}
- [$Date: 2019-12-03 09:41:21 +0100 (Tue, 03 Dec 2019) $
+ [$Date: 2020-06-11 16:57:03 +0200 (Thu, 11 Jun 2020) $
KOMA-Script guide (package tocbasic)]
\chapter{Verzeichnisse verwalten mit Hilfe von \Package{tocbasic}}
@@ -1118,9 +1118,11 @@ Derzeit werden von \Package{tocbasic} die folgenden Eintragsstile definiert:
der Klone so ab, dass sie unterschiedliche Voreinstellungen besitzen.
Der Stil kennt neben der Standardeigenschaft \PValue{level} noch
- 18\important{\PValue{level}, \PValue{beforeskip}, \PValue{breakafternumber},
+ 20\important{\PValue{level}, \PValue{beforeskip}, \PValue{breakafternumber},
+ \PValue{dynindent},
\PValue{dynnumwidth}, \PValue{entryformat}, \PValue{entrynumberformat},
- \PValue{indent}, \PValue{linefill}, \PValue{numsep}, \PValue{numwidth},
+ \PValue{indent}, \PValue{indentfollows},
+ \PValue{linefill}, \PValue{numsep}, \PValue{numwidth},
\PValue{onstarthigherlevel}, \PValue{onstartlowerlevel},
\PValue{onstartsamelevel}, \PValue{pagenumberbox},
\PValue{pagenumberformat}, \PValue{pagenumberwidth},
@@ -1290,14 +1292,15 @@ Derzeit werden von \Package{tocbasic} die folgenden Eintragsstile definiert:
\end{figure}
\item[\PValue{toctext}]\ChangedAt{v3.27}{\Package{tocbasic}}%
stellt eine Besonderheit dar. Während alle anderen Stile je Eintrag einen
- Absatz\important{\PValue{level}, \PValue{afterpar}, \PValue{entryformat},
+ Absatz\important{\PValue{level}, \PValue{afterpar}, \PValue{beforeskip},
+ \PValue{entryformat},
\PValue{entrynumberformat}, \PValue{indent}, \PValue{numsep},
\PValue{onendentry}, \PValue{onendlastentry}, \PValue{onstartentry},
\PValue{onstartfirstentry}, \PValue{pagenumberformat},
\PValue{prepagenumber}, \PValue{raggedright}, \PValue{rightindent}}
erzeugen, wird hier für alle aufeinanderfolgenden Einträge dieses Stils nur
ein einziger Absatz erzeugt. Für die Konfigurierung stehen neben der
- Standardeigenschaft \PValue{level} mit 13 weiteren Eigenschaften fast so
+ Standardeigenschaft \PValue{level} mit 14 weiteren Eigenschaften fast so
viele Möglichkeiten wie bei \PValue{tocline} zur Verfügung. Dieser Stil ist
aber zwingend darauf angewiesen, dass am Anfang aller anderen Stile und auch
am Ende des Verzeichnisses ein noch nicht beendeter Absatz tasächlich
@@ -1360,8 +1363,8 @@ Derzeit werden von \Package{tocbasic} die folgenden Eintragsstile definiert:
Eine Erklärung zu den Eigenschaften der von \Package{tocbasic} definierten
Stile findet sich in \autoref{tab:tocbasic.tocstyle.attributes}.
Neben\ChangedAt{v3.27}{\Package{tocbasic}} der normalen Zuweisung eines Wertes
-in der Form \Option{\PName{Schlüssel}=\PName{Wert}} verstehen beide Befehle für
-alle Optionen der durch \KOMAScript{} definierten Stile auch die
+in der Form \Option{\PName{Schlüssel}=\PName{Wert}} verstehen beide Befehle
+für alle Optionen der durch \KOMAScript{} definierten Stile auch die
Zuweisungen in der Form \Option{\PName{Schlüssel}:=\PName{Eintragsebene}}. In
diesem Fall wird die aktuell gültige Einstellung für \PName{Eintragsebene}
kopiert, soweit diese verfügbar ist. Es kann also beispielsweise mit
@@ -1371,7 +1374,10 @@ erwarten, gibt es außerdem die Möglichkeit mit
\Option{\PName{Schlüssel}+=\PName{Wert}} den \PName{Wert} zur aktuell gültigen
Einstellung zu addieren. Für eine Substraktion kann ein negativer \PName{Wert}
verwendet werden. Mit \OptionValue{indent+}{1cm} könnte so beispielsweise der
-Einzug um 1\Unit{cm} erhöht werden.
+Einzug um 1\Unit{cm} erhöht werden. Für Optionen, die eine
+Liste\ChangedAt{v3.31}{\Package{tocbasic}} als \PName{Wert} erwarten, kann mit
+\Option{\PName{Schlüssel}+=\PName{Wert}} der neue \PName{Wert} an den bereits
+vorhandenen angehängt werden.
Bei\ChangedAt{v3.21}{\Package{tocbasic}} Verwendung der Eigenschaften als
Optionen für Anweisung
@@ -1431,7 +1437,13 @@ angegebenen Einstellungen definiert.%
\PValue{chapter} bekannt, wird stattdessen für \PValue{section}
\texttt{1em plus 1pt} verwendet. Ansonsten wird es für \PValue{section}
wie für alle
- anderen Ebenen mit \texttt{0pt plus .2pt} initialisiert.%
+ anderen Ebenen mit \texttt{0pt plus .2pt} initialisiert.
+
+ Im\ChangedAt{v3.31}{\Package{tocbasic}} Stil \PValue{toctext} wird der
+ vertikale Abstand vor dem Absatz eingefügt, wenn es sich um den ersten
+ Eintrag im Absatz handelt. Bei allen weiteren Einträgen des Absatzes wird
+ er ignoriert. Findet die Initialisierung über diesen Stil statt, so wird
+ als Voreinstellung \texttt{0pt} verwendet.%
}%
\entry{\OptionVName{breakafternumber}{Schalter}}{%
\PName{Schalter} ist einer der Werte für einfache Schalter aus
@@ -1454,6 +1466,15 @@ angegebenen Einstellungen definiert.%
leeren Nummer in der Formatierung von \Option{entrynumberformat} gesetzt
wird.%
}%
+ \entry{\OptionVName{dynindent}{Schalter}}{%
+ \ChangedAt{v3.31}{\Package{tocbasic}}%
+ \PName{Schalter} ist einer der Werte für einfache Schalter aus
+ \autoref{tab:truefalseswitch}, \autopageref{tab:truefalseswitch}. Ist der
+ Schalter beim Stil \PValue{tocline} aktiviert, gibt die Eigenschaft
+ \PValue{indent} nur noch einen Minimalwert an. Der Maximalwert wird durch
+ die Nummernbreite und den Einzug der via \Option{indentfollows}
+ vorgegebenen Ebenen bestimmt.%
+ }%
\entry{\OptionVName{dynnumwidth}{Schalter}}{%
\PName{Schalter} ist einer der Werte für einfache Schalter aus
\autoref{tab:truefalseswitch}, \autopageref{tab:truefalseswitch}. Ist der
@@ -1532,6 +1553,15 @@ angegebenen Einstellungen definiert.%
allen von \KOMAScript{} bereitgestellten Stilen diesen Wert und verwenden
stattdessen 0\Unit{pt}. Der Einzug wird also deaktiviert.%
}%
+ \entry{\OptionVName{indentfollows}{Ebenenliste}}{%
+ \ChangedAt{v3.31}{\Package{tocbasic}}%
+ Ist \Option{dynindent} beim Stil \PValue{tocline} gesetzt, so dient die
+ hier angegebene durch Komma separierte Liste an Ebenennamen dazu, den
+ tatsächlichen Einzug zu ermitteln. Dabei findet bei Ebenen, deren Name mit
+ »\texttt{sub}« beginnt, eine Initialisierung mit dem Namen ohne diesen
+ Präfix statt. Die \KOMAScript-Klassen setzen außerdem automatisch passende
+ Werte für die Ebenen \PValue{section} und \PValue{paragraph}.%
+ }%
\entry{\OptionVName{level}{Integer}}{%
Numerischer Wert der \PName{Eintragsebene}. Tatsächlich angezeigt werden
nur Einträge, deren numerische Ebene nicht größer als Zähler
@@ -1635,8 +1665,8 @@ angegebenen Einstellungen definiert.%
\ChangedAt{v3.27}{\Package{tocbasic}}%
Führt den angegebenen \PName{Code} unmittelbar vor dem Eintrag im Stil
\PValue{toctext} aus, sofern es sich um den ersten Eintrag im Absatz
- handelt. Der Anwender sollte sicherstellen, dass \PName{Code} den
- Absatz nicht bereits beginnt.%
+ handelt. Der Anwender muss unbedingt sicherstellen, dass \PName{Code} auf
+ keinen Fall zum Beenden des bereits begonnen Absatzes führt.%
}%
\entry{\OptionVName{onstarthigherlevel}{Code}}{%
Der Stil \PValue{tocline} kann zu Beginn eines Eintrags eine Aktion in
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/scrguide.cls b/Master/texmf-dist/source/latex/koma-script/doc/scrguide.cls
index ca8fca3640b..9eb3bf23d8a 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/scrguide.cls
+++ b/Master/texmf-dist/source/latex/koma-script/doc/scrguide.cls
@@ -1,6 +1,6 @@
% ======================================================================
% scrguide.cls
-% Copyright (c) Markus Kohm, 2005-2019
+% Copyright (c) Markus Kohm, 2005-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -18,7 +18,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrguide.cls
-% Copyright (c) Markus Kohm, 2005-2019
+% Copyright (c) Markus Kohm, 2005-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -38,7 +38,7 @@
% \section{Identification}
%
% \begin{macrocode}
-\ProvidesClass{scrguide}[2019/12/06 v1.22d internal KOMA-Script guide class]
+\ProvidesClass{scrguide}[2020/03/17 v1.23 internal KOMA-Script guide class]
% \end{macrocode}
%
%
@@ -163,7 +163,6 @@
\newif\ifshortversion\shortversionfalse
\InputIfFileExists{scrnonfree.tex}{}{%
\RequirePackage[svgnames]{xcolor}%
- \RequirePackage{tocstyle}% hyperref needs xcolor with tocstyle
\RequirePackage{tikz}%
\usetikzlibrary{calc}%
\RequirePackage[\uselanguage]{hyperref}%
@@ -2230,19 +2229,24 @@ KOMAScript \endcsname
% We have large page numbers, so better setup the needed width. And we like
% other dot seperation.
% \begin{macrocode}
-\usetocstyle{classic}
+\RedeclareSectionCommand[%
+ tocdynnumwidth,%
+ tocbreakafternumber=true,%
+ tocentrynumberformat=\partnumberwithprefix,%
+ tocpagenumberformat=\@firstofone
+]{part}%
+\newcommand*{\partnumberwithprefix}[1]{\let\autodot:\partname~#1}%
+\RedeclareSectionCommand[%
+ tocnumwidth=21pt,%
+ tocpagenumberformat=\@firstofone,%
+ tocraggedentrytext=true%
+]{chapter}%
+\RedeclareSectionCommand[tocindent=21pt,tocnumwidth=34pt]{section}%
+\RedeclareSectionCommand[tocindent=55pt,tocnumwidth=36pt]{subsection}%
+\DeclareTOCStyleEntries[dynnumwidth]{default}{figure,table}%
\renewcommand*{\@pnumwidth}{1.8em}% 1.67
\renewcommand*\@tocrmarg {2.70em}% 2.55em
-\renewcommand*\@dotsep{2.5}
-\settocfeature[toc][-1]{entryhook}{%
- \let\sg@numberline\numberline
- \renewcommand*{\numberline}[1]{%
- \sg@numberline{\partname~##1}%
- ~\linebreak\nopagebreak\hspace*{-\@tempdima}%
- }%
- \def\autodot{: }%
- \sectfont
-}
+\renewcommand*\@dotsep{2.5}%
% \end{macrocode}
%
% \section{Part}
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/scrguide.html b/Master/texmf-dist/source/latex/koma-script/doc/scrguide.html
index 8729266a5dc..38ca39718f5 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/scrguide.html
+++ b/Master/texmf-dist/source/latex/koma-script/doc/scrguide.html
@@ -29,11 +29,11 @@
<li><a name="option.adrFreeIVstop"></a><a href="#option.adrFreeIVstop">adrFreeIVstop</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scraddr.option.adrFreeIVstop">303</a></li>
<li><a name="option.adrFreeIVwarn"></a><a href="#option.adrFreeIVwarn">adrFreeIVwarn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scraddr.option.adrFreeIVwarn">303</a></li>
<li><a name="option.appendixprefix"></a><a href="#option.appendixprefix">appendixprefix</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.option.appendixprefix">101</a></li>
- <li><a name="option.areasetadvanced"></a><a href="#option.areasetadvanced">areasetadvanced</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.option.areasetadvanced">504</a></li>
- <li><a name="option.autoclearnotecolumns"></a><a href="#option.autoclearnotecolumns">autoclearnotecolumns</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.option.autoclearnotecolumns">501</a></li>
+ <li><a name="option.areasetadvanced"></a><a href="#option.areasetadvanced">areasetadvanced</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.option.areasetadvanced">503</a></li>
+ <li><a name="option.autoclearnotecolumns"></a><a href="#option.autoclearnotecolumns">autoclearnotecolumns</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.option.autoclearnotecolumns">500</a></li>
<li><a name="option.autoenlargeheadfoot"></a><a href="#option.autoenlargeheadfoot">autoenlargeheadfoot</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.autoenlargeheadfoot">266</a></li>
- <li><a name="option.automark"></a><a href="#option.automark">automark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.automark">283</a>, <a href="scrguide.pdf#desc:scrlayer.option.automark">471</a></li>
- <li><a name="option.autooneside"></a><a href="#option.autooneside">autooneside</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.autooneside">283</a>, <a href="scrguide.pdf#desc:scrlayer.option.autooneside">471</a></li>
+ <li><a name="option.automark"></a><a href="#option.automark">automark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.automark">283</a>, <a href="scrguide.pdf#desc:scrlayer.option.automark">470</a></li>
+ <li><a name="option.autooneside"></a><a href="#option.autooneside">autooneside</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.autooneside">283</a>, <a href="scrguide.pdf#desc:scrlayer.option.autooneside">470</a></li>
<li><a name="option.backaddress"></a><a href="#option.backaddress">backaddress</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.backaddress">213</a></li>
<li><a name="option.bibliography"></a><a href="#option.bibliography">bibliography</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.option.bibliography">156</a></li>
<li><a name="option.captions"></a><a href="#option.captions">captions</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.option.captions">136</a></li>
@@ -44,8 +44,8 @@
<li><a name="option.cleardoublepage"></a><a href="#option.cleardoublepage">cleardoublepage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.cleardoublepage">243</a>, <a href="scrguide.pdf#desc:scrextend.option.cleardoublepage">316</a>, <a href="scrguide.pdf#desc:maincls.option.cleardoublepage">91</a></li>
<li><a name="option.clines"></a><a href="#option.clines">clines</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.clines">292</a></li>
<li><a name="option.contract"></a><a href="#option.contract">contract</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.option.contract">330</a></li>
- <li><a name="option.deactivatepagestylelayers"></a><a href="#option.deactivatepagestylelayers">deactivatepagestylelayers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.deactivatepagestylelayers">466</a></li>
- <li><a name="option.draft"></a><a href="#option.draft">draft</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.draft">165</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.option.draft">284</a>, <a href="scrguide.pdf#desc:scrextend.option.draft">308</a>, <a href="scrguide.pdf#desc:scrlayer.option.draft">459</a>, <a href="scrguide.pdf#desc:maincls.option.draft">58</a></li>
+ <li><a name="option.deactivatepagestylelayers"></a><a href="#option.deactivatepagestylelayers">deactivatepagestylelayers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.deactivatepagestylelayers">465</a></li>
+ <li><a name="option.draft"></a><a href="#option.draft">draft</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.draft">165</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.option.draft">284</a>, <a href="scrguide.pdf#desc:scrextend.option.draft">308</a>, <a href="scrguide.pdf#desc:scrlayer.option.draft">458</a>, <a href="scrguide.pdf#desc:maincls.option.draft">58</a></li>
<li><a name="option.enlargefirstpage"></a><a href="#option.enlargefirstpage">enlargefirstpage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.enlargefirstpage">233</a></li>
<li><a name="option.extendedfeature"></a><a href="#option.extendedfeature">extendedfeature</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.option.extendedfeature">308</a></li>
<li><a name="option.firstfoot"></a><a href="#option.firstfoot">firstfoot</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.firstfoot">233</a></li>
@@ -75,7 +75,7 @@
<li><a name="option.headsepline"></a><a href="#option.headsepline">headsepline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.headsepline">238</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.option.headsepline">291</a>, <a href="scrguide.pdf#desc:maincls.option.headsepline">84</a></li>
<li><a name="option.headtopline"></a><a href="#option.headtopline">headtopline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.headtopline">291</a></li>
<li><a name="option.headwidth"></a><a href="#option.headwidth">headwidth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.headwidth">289</a></li>
- <li><a name="option.hmode"></a><a href="#option.hmode">hmode</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.option.hmode">486</a></li>
+ <li><a name="option.hmode"></a><a href="#option.hmode">hmode</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.option.hmode">485</a></li>
<li><a name="option.ilines"></a><a href="#option.ilines">ilines</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.ilines">292</a></li>
<li><a name="option.index"></a><a href="#option.index">index</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.option.index">160</a></li>
<li><a name="option.juratitlepagebreak"></a><a href="#option.juratitlepagebreak">juratitlepagebreak</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.option.juratitlepagebreak">332</a></li>
@@ -85,22 +85,22 @@
<li><a name="option.leqno"></a><a href="#option.leqno">leqno</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.option.leqno">135</a></li>
<li><a name="option.listof"></a><a href="#option.listof">listof</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.option.listof">151</a></li>
<li><a name="option.locfield"></a><a href="#option.locfield">locfield</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.locfield">219</a></li>
- <li><a name="option.manualmark"></a><a href="#option.manualmark">manualmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.manualmark">283</a>, <a href="scrguide.pdf#desc:scrlayer.option.manualmark">471</a></li>
- <li><a name="option.markcase"></a><a href="#option.markcase">markcase</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.markcase">284</a>, <a href="scrguide.pdf#desc:scrlayer.option.markcase">472</a></li>
+ <li><a name="option.manualmark"></a><a href="#option.manualmark">manualmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.manualmark">283</a>, <a href="scrguide.pdf#desc:scrlayer.option.manualmark">470</a></li>
+ <li><a name="option.markcase"></a><a href="#option.markcase">markcase</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.markcase">284</a>, <a href="scrguide.pdf#desc:scrlayer.option.markcase">471</a></li>
<li><a name="option.mpinclude"></a><a href="#option.mpinclude">mpinclude</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea.option.mpinclude">44</a></li>
<li><a name="option.numbers"></a><a href="#option.numbers">numbers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.option.numbers">104</a></li>
<li><a name="option.numericaldate"></a><a href="#option.numericaldate">numericaldate</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.numericaldate">222</a></li>
<li><a name="option.olines"></a><a href="#option.olines">olines</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.option.olines">292</a></li>
- <li><a name="option.onpsbackground"></a><a href="#option.onpsbackground">onpsbackground</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsbackground">466</a></li>
- <li><a name="option.onpsevenpage"></a><a href="#option.onpsevenpage">onpsevenpage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsevenpage">466</a></li>
- <li><a name="option.onpsfloatpage"></a><a href="#option.onpsfloatpage">onpsfloatpage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsfloatpage">466</a></li>
- <li><a name="option.onpsforeground"></a><a href="#option.onpsforeground">onpsforeground</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsforeground">466</a></li>
- <li><a name="option.onpsinit"></a><a href="#option.onpsinit">onpsinit</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsinit">466</a></li>
- <li><a name="option.onpsnonfloatpage"></a><a href="#option.onpsnonfloatpage">onpsnonfloatpage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsnonfloatpage">466</a></li>
- <li><a name="option.onpsoddpage"></a><a href="#option.onpsoddpage">onpsoddpage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsoddpage">466</a></li>
- <li><a name="option.onpsoneside"></a><a href="#option.onpsoneside">onpsoneside</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsoneside">466</a></li>
- <li><a name="option.onpsselect"></a><a href="#option.onpsselect">onpsselect</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsselect">466</a></li>
- <li><a name="option.onpstwoside"></a><a href="#option.onpstwoside">onpstwoside</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpstwoside">466</a></li>
+ <li><a name="option.onpsbackground"></a><a href="#option.onpsbackground">onpsbackground</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsbackground">465</a></li>
+ <li><a name="option.onpsevenpage"></a><a href="#option.onpsevenpage">onpsevenpage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsevenpage">465</a></li>
+ <li><a name="option.onpsfloatpage"></a><a href="#option.onpsfloatpage">onpsfloatpage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsfloatpage">465</a></li>
+ <li><a name="option.onpsforeground"></a><a href="#option.onpsforeground">onpsforeground</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsforeground">465</a></li>
+ <li><a name="option.onpsinit"></a><a href="#option.onpsinit">onpsinit</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsinit">465</a></li>
+ <li><a name="option.onpsnonfloatpage"></a><a href="#option.onpsnonfloatpage">onpsnonfloatpage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsnonfloatpage">465</a></li>
+ <li><a name="option.onpsoddpage"></a><a href="#option.onpsoddpage">onpsoddpage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsoddpage">465</a></li>
+ <li><a name="option.onpsoneside"></a><a href="#option.onpsoneside">onpsoneside</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsoneside">465</a></li>
+ <li><a name="option.onpsselect"></a><a href="#option.onpsselect">onpsselect</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpsselect">465</a></li>
+ <li><a name="option.onpstwoside"></a><a href="#option.onpstwoside">onpstwoside</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.onpstwoside">465</a></li>
<li><a name="option.open"></a><a href="#option.open">open</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.option.open">100</a></li>
<li><a name="option.origlongtable"></a><a href="#option.origlongtable">origlongtable</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.option.origlongtable">151</a></li>
<li><a name="option.overfullrule"></a><a href="#option.overfullrule">overfullrule</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.overfullrule">165</a>, <a href="scrguide.pdf#desc:scrextend.option.overfullrule">308</a>, <a href="scrguide.pdf#desc:maincls.option.overfullrule">58</a></li>
@@ -118,115 +118,113 @@
<li><a name="option.ref"></a><a href="#option.ref">ref</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.option.ref">339</a></li>
<li><a name="option.refline"></a><a href="#option.refline">refline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.refline">222</a></li>
<li><a name="option.sectionentrydots"></a><a href="#option.sectionentrydots">sectionentrydots</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.option.sectionentrydots">78</a></li>
- <li><a name="option.singlespacing"></a><a href="#option.singlespacing">singlespacing</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.singlespacing">466</a></li>
+ <li><a name="option.singlespacing"></a><a href="#option.singlespacing">singlespacing</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.option.singlespacing">465</a></li>
<li><a name="option.subject"></a><a href="#option.subject">subject</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.subject">227</a></li>
<li><a name="option.symbolicnames"></a><a href="#option.symbolicnames">symbolicnames</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.symbolicnames">206</a></li>
<li><a name="option.titlepage"></a><a href="#option.titlepage">titlepage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.option.titlepage">311</a>, <a href="scrguide.pdf#desc:maincls.option.titlepage">67</a></li>
<li><a name="option.toc"></a><a href="#option.toc">toc</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.option.toc">75</a></li>
<li><a name="option.twocolumn"></a><a href="#option.twocolumn">twocolumn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea.option.twocolumn">42</a></li>
<li><a name="option.twoside"></a><a href="#option.twoside">twoside</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea.option.twoside">41</a></li>
- <li><a name="option.usegeometry"></a><a href="#option.usegeometry">usegeometry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.option.usegeometry">503</a></li>
+ <li><a name="option.usegeometry"></a><a href="#option.usegeometry">usegeometry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.option.usegeometry">502</a></li>
<li><a name="option.version"></a><a href="#option.version">version</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.option.version">164</a>, <a href="scrguide.pdf#desc:scrextend.option.version">307</a>, <a href="scrguide.pdf#desc:typearea.option.version">33</a>, <a href="scrguide.pdf#desc:maincls.option.version">57</a></li>
</ul>
<h2><a name="macro">Anweisungen</a></h2>
<ul>
- <li><a name="cmd.@mkboth"></a><a href="#cmd.@mkboth">\@mkboth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.@mkboth">476</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.@mkboth">480</a></li>
- <li><a name="cmd.@mkdouble"></a><a href="#cmd.@mkdouble">\@mkdouble</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.@mkdouble">476</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.@mkdouble">480</a></li>
- <li><a name="cmd.@mkleft"></a><a href="#cmd.@mkleft">\@mkleft</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.@mkleft">476</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.@mkleft">480</a></li>
- <li><a name="cmd.@mkright"></a><a href="#cmd.@mkright">\@mkright</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.@mkright">476</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.@mkright">480</a></li>
- <li><a name="cmd.@openbib@code"></a><a href="#cmd.@openbib@code">\@openbib@code</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.@openbib@code">536</a></li>
- <li><a name="cmd.AddLayersAtBeginOfPageStyle"></a><a href="#cmd.AddLayersAtBeginOfPageStyle">\AddLayersAtBeginOfPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AddLayersAtBeginOfPageStyle">467</a></li>
- <li><a name="cmd.AddLayersAtEndOfPageStyle"></a><a href="#cmd.AddLayersAtEndOfPageStyle">\AddLayersAtEndOfPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AddLayersAtEndOfPageStyle">467</a></li>
- <li><a name="cmd.AddLayersToPageStyle"></a><a href="#cmd.AddLayersToPageStyle">\AddLayersToPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AddLayersToPageStyle">467</a></li>
- <li><a name="cmd.AddLayersToPageStyleAfterLayer"></a><a href="#cmd.AddLayersToPageStyleAfterLayer">\AddLayersToPageStyleAfterLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AddLayersToPageStyleAfterLayer">468</a></li>
- <li><a name="cmd.AddLayersToPageStyleBeforeLayer"></a><a href="#cmd.AddLayersToPageStyleBeforeLayer">\AddLayersToPageStyleBeforeLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AddLayersToPageStyleBeforeLayer">468</a></li>
- <li><a name="cmd.AddToLayerPageStyleOptions"></a><a href="#cmd.AddToLayerPageStyleOptions">\AddToLayerPageStyleOptions</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AddToLayerPageStyleOptions">468</a></li>
+ <li><a name="cmd.@mkboth"></a><a href="#cmd.@mkboth">\@mkboth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.@mkboth">475</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.@mkboth">479</a></li>
+ <li><a name="cmd.@mkdouble"></a><a href="#cmd.@mkdouble">\@mkdouble</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.@mkdouble">475</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.@mkdouble">479</a></li>
+ <li><a name="cmd.@mkleft"></a><a href="#cmd.@mkleft">\@mkleft</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.@mkleft">475</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.@mkleft">479</a></li>
+ <li><a name="cmd.@mkright"></a><a href="#cmd.@mkright">\@mkright</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.@mkright">475</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.@mkright">479</a></li>
+ <li><a name="cmd.@openbib@code"></a><a href="#cmd.@openbib@code">\@openbib@code</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.@openbib@code">535</a></li>
+ <li><a name="cmd.AddLayersAtBeginOfPageStyle"></a><a href="#cmd.AddLayersAtBeginOfPageStyle">\AddLayersAtBeginOfPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AddLayersAtBeginOfPageStyle">466</a></li>
+ <li><a name="cmd.AddLayersAtEndOfPageStyle"></a><a href="#cmd.AddLayersAtEndOfPageStyle">\AddLayersAtEndOfPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AddLayersAtEndOfPageStyle">466</a></li>
+ <li><a name="cmd.AddLayersToPageStyle"></a><a href="#cmd.AddLayersToPageStyle">\AddLayersToPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AddLayersToPageStyle">466</a></li>
+ <li><a name="cmd.AddLayersToPageStyleAfterLayer"></a><a href="#cmd.AddLayersToPageStyleAfterLayer">\AddLayersToPageStyleAfterLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AddLayersToPageStyleAfterLayer">467</a></li>
+ <li><a name="cmd.AddLayersToPageStyleBeforeLayer"></a><a href="#cmd.AddLayersToPageStyleBeforeLayer">\AddLayersToPageStyleBeforeLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AddLayersToPageStyleBeforeLayer">467</a></li>
+ <li><a name="cmd.AddToLayerPageStyleOptions"></a><a href="#cmd.AddToLayerPageStyleOptions">\AddToLayerPageStyleOptions</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AddToLayerPageStyleOptions">467</a></li>
<li><a name="cmd.Address"></a><a href="#cmd.Address">\Address</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scraddr.cmd.Address">301</a></li>
<li><a name="cmd.AddtoDoHook"></a><a href="#cmd.AddtoDoHook">\AddtoDoHook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.AddtoDoHook">378</a></li>
<li><a name="cmd.AddtoOneTimeDoHook"></a><a href="#cmd.AddtoOneTimeDoHook">\AddtoOneTimeDoHook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.AddtoOneTimeDoHook">378</a></li>
+ <li><a name="cmd.AfterAtEndOfClass*"></a><a href="#cmd.AfterAtEndOfClass*">\AfterAtEndOfClass*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterAtEndOfClass*">383</a></li>
<li><a name="cmd.AfterAtEndOfClass"></a><a href="#cmd.AfterAtEndOfClass">\AfterAtEndOfClass</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterAtEndOfClass">383</a></li>
+ <li><a name="cmd.AfterAtEndOfPackage*"></a><a href="#cmd.AfterAtEndOfPackage*">\AfterAtEndOfPackage*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterAtEndOfPackage*">383</a></li>
<li><a name="cmd.AfterAtEndOfPackage"></a><a href="#cmd.AfterAtEndOfPackage">\AfterAtEndOfPackage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterAtEndOfPackage">383</a></li>
<li><a name="cmd.AfterBibliographyPreamble"></a><a href="#cmd.AfterBibliographyPreamble">\AfterBibliographyPreamble</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.AfterBibliographyPreamble">159</a></li>
- <li><a name="cmd.AfterCalculatingTypearea*"></a><a href="#cmd.AfterCalculatingTypearea*">\AfterCalculatingTypearea*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.AfterCalculatingTypearea*">506</a></li>
- <li><a name="cmd.AfterCalculatingTypearea"></a><a href="#cmd.AfterCalculatingTypearea">\AfterCalculatingTypearea</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.AfterCalculatingTypearea">506</a></li>
- <li><a name="cmd.AfterClass!"></a><a href="#cmd.AfterClass!">\AfterClass!</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterClass!">383</a></li>
+ <li><a name="cmd.AfterCalculatingTypearea*"></a><a href="#cmd.AfterCalculatingTypearea*">\AfterCalculatingTypearea*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.AfterCalculatingTypearea*">505</a></li>
+ <li><a name="cmd.AfterCalculatingTypearea"></a><a href="#cmd.AfterCalculatingTypearea">\AfterCalculatingTypearea</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.AfterCalculatingTypearea">505</a></li>
<li><a name="cmd.AfterClass*"></a><a href="#cmd.AfterClass*">\AfterClass*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterClass*">383</a></li>
- <li><a name="cmd.AfterClass+"></a><a href="#cmd.AfterClass+">\AfterClass+</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterClass+">383</a></li>
<li><a name="cmd.AfterClass"></a><a href="#cmd.AfterClass">\AfterClass</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterClass">383</a></li>
<li><a name="cmd.AfterFile"></a><a href="#cmd.AfterFile">\AfterFile</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterFile">382</a></li>
- <li><a name="cmd.AfterPackage!"></a><a href="#cmd.AfterPackage!">\AfterPackage!</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterPackage!">383</a></li>
<li><a name="cmd.AfterPackage*"></a><a href="#cmd.AfterPackage*">\AfterPackage*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterPackage*">383</a></li>
- <li><a name="cmd.AfterPackage+"></a><a href="#cmd.AfterPackage+">\AfterPackage+</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterPackage+">383</a></li>
<li><a name="cmd.AfterPackage"></a><a href="#cmd.AfterPackage">\AfterPackage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterPackage">383</a></li>
- <li><a name="cmd.AfterReadingMainAux"></a><a href="#cmd.AfterReadingMainAux">\AfterReadingMainAux</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterReadingMainAux">385</a></li>
- <li><a name="cmd.AfterRestoreareas*"></a><a href="#cmd.AfterRestoreareas*">\AfterRestoreareas*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.AfterRestoreareas*">505</a></li>
- <li><a name="cmd.AfterRestoreareas"></a><a href="#cmd.AfterRestoreareas">\AfterRestoreareas</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.AfterRestoreareas">505</a></li>
- <li><a name="cmd.AfterSelectAnyPageStyle"></a><a href="#cmd.AfterSelectAnyPageStyle">\AfterSelectAnyPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AfterSelectAnyPageStyle">461</a></li>
- <li><a name="cmd.AfterSettingArea*"></a><a href="#cmd.AfterSettingArea*">\AfterSettingArea*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.AfterSettingArea*">506</a></li>
- <li><a name="cmd.AfterSettingArea"></a><a href="#cmd.AfterSettingArea">\AfterSettingArea</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.AfterSettingArea">506</a></li>
- <li><a name="cmd.AfterStartingTOC"></a><a href="#cmd.AfterStartingTOC">\AfterStartingTOC</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.AfterStartingTOC">405</a></li>
- <li><a name="cmd.AfterTOCHead"></a><a href="#cmd.AfterTOCHead">\AfterTOCHead</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.AfterTOCHead">405</a></li>
- <li><a name="cmd.At@startsection"></a><a href="#cmd.At@startsection">\At@startsection</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.At@startsection">534</a></li>
- <li><a name="cmd.AtAddToTocList"></a><a href="#cmd.AtAddToTocList">\AtAddToTocList</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.AtAddToTocList">400</a></li>
+ <li><a name="cmd.AfterReadingMainAux"></a><a href="#cmd.AfterReadingMainAux">\AfterReadingMainAux</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.AfterReadingMainAux">386</a></li>
+ <li><a name="cmd.AfterRestoreareas*"></a><a href="#cmd.AfterRestoreareas*">\AfterRestoreareas*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.AfterRestoreareas*">504</a></li>
+ <li><a name="cmd.AfterRestoreareas"></a><a href="#cmd.AfterRestoreareas">\AfterRestoreareas</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.AfterRestoreareas">504</a></li>
+ <li><a name="cmd.AfterSelectAnyPageStyle"></a><a href="#cmd.AfterSelectAnyPageStyle">\AfterSelectAnyPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.AfterSelectAnyPageStyle">460</a></li>
+ <li><a name="cmd.AfterSettingArea*"></a><a href="#cmd.AfterSettingArea*">\AfterSettingArea*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.AfterSettingArea*">505</a></li>
+ <li><a name="cmd.AfterSettingArea"></a><a href="#cmd.AfterSettingArea">\AfterSettingArea</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.AfterSettingArea">505</a></li>
+ <li><a name="cmd.AfterStartingTOC"></a><a href="#cmd.AfterStartingTOC">\AfterStartingTOC</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.AfterStartingTOC">404</a></li>
+ <li><a name="cmd.AfterTOCHead"></a><a href="#cmd.AfterTOCHead">\AfterTOCHead</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.AfterTOCHead">404</a></li>
+ <li><a name="cmd.At@startsection"></a><a href="#cmd.At@startsection">\At@startsection</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.At@startsection">533</a></li>
+ <li><a name="cmd.AtAddToTocList"></a><a href="#cmd.AtAddToTocList">\AtAddToTocList</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.AtAddToTocList">399</a></li>
<li><a name="cmd.AtBeginLetter"></a><a href="#cmd.AtBeginLetter">\AtBeginLetter</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.AtBeginLetter">181</a></li>
<li><a name="cmd.AtEndBibliography"></a><a href="#cmd.AtEndBibliography">\AtEndBibliography</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.AtEndBibliography">159</a></li>
<li><a name="cmd.AtEndLetter"></a><a href="#cmd.AtEndLetter">\AtEndLetter</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.AtEndLetter">181</a></li>
<li><a name="cmd.AtEndOfFamilyOptions*"></a><a href="#cmd.AtEndOfFamilyOptions*">\AtEndOfFamilyOptions*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.AtEndOfFamilyOptions*">359</a></li>
<li><a name="cmd.AtEndOfFamilyOptions"></a><a href="#cmd.AtEndOfFamilyOptions">\AtEndOfFamilyOptions</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.AtEndOfFamilyOptions">359</a></li>
- <li><a name="cmd.Before@sect"></a><a href="#cmd.Before@sect">\Before@sect</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.Before@sect">534</a></li>
- <li><a name="cmd.Before@ssect"></a><a href="#cmd.Before@ssect">\Before@ssect</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.Before@ssect">534</a></li>
- <li><a name="cmd.BeforeClass"></a><a href="#cmd.BeforeClass">\BeforeClass</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.BeforeClass">382</a></li>
- <li><a name="cmd.BeforeClosingMainAux"></a><a href="#cmd.BeforeClosingMainAux">\BeforeClosingMainAux</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.BeforeClosingMainAux">385</a></li>
+ <li><a name="cmd.Before@sect"></a><a href="#cmd.Before@sect">\Before@sect</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.Before@sect">533</a></li>
+ <li><a name="cmd.Before@ssect"></a><a href="#cmd.Before@ssect">\Before@ssect</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.Before@ssect">533</a></li>
+ <li><a name="cmd.BeforeClass"></a><a href="#cmd.BeforeClass">\BeforeClass</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.BeforeClass">383</a></li>
+ <li><a name="cmd.BeforeClosingMainAux"></a><a href="#cmd.BeforeClosingMainAux">\BeforeClosingMainAux</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.BeforeClosingMainAux">386</a></li>
<li><a name="cmd.BeforeFamilyProcessOptions"></a><a href="#cmd.BeforeFamilyProcessOptions">\BeforeFamilyProcessOptions</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.BeforeFamilyProcessOptions">355</a></li>
<li><a name="cmd.BeforeFile"></a><a href="#cmd.BeforeFile">\BeforeFile</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.BeforeFile">382</a></li>
- <li><a name="cmd.BeforePackage"></a><a href="#cmd.BeforePackage">\BeforePackage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.BeforePackage">382</a></li>
- <li><a name="cmd.BeforeRestoreareas*"></a><a href="#cmd.BeforeRestoreareas*">\BeforeRestoreareas*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.BeforeRestoreareas*">505</a></li>
- <li><a name="cmd.BeforeRestoreareas"></a><a href="#cmd.BeforeRestoreareas">\BeforeRestoreareas</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.BeforeRestoreareas">505</a></li>
- <li><a name="cmd.BeforeSelectAnyPageStyle"></a><a href="#cmd.BeforeSelectAnyPageStyle">\BeforeSelectAnyPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.BeforeSelectAnyPageStyle">461</a></li>
- <li><a name="cmd.BeforeStartingTOC"></a><a href="#cmd.BeforeStartingTOC">\BeforeStartingTOC</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.BeforeStartingTOC">405</a></li>
- <li><a name="cmd.BeforeTOCHead"></a><a href="#cmd.BeforeTOCHead">\BeforeTOCHead</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.BeforeTOCHead">405</a></li>
+ <li><a name="cmd.BeforePackage"></a><a href="#cmd.BeforePackage">\BeforePackage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.BeforePackage">383</a></li>
+ <li><a name="cmd.BeforeRestoreareas*"></a><a href="#cmd.BeforeRestoreareas*">\BeforeRestoreareas*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.BeforeRestoreareas*">504</a></li>
+ <li><a name="cmd.BeforeRestoreareas"></a><a href="#cmd.BeforeRestoreareas">\BeforeRestoreareas</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.BeforeRestoreareas">504</a></li>
+ <li><a name="cmd.BeforeSelectAnyPageStyle"></a><a href="#cmd.BeforeSelectAnyPageStyle">\BeforeSelectAnyPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.BeforeSelectAnyPageStyle">460</a></li>
+ <li><a name="cmd.BeforeStartingTOC"></a><a href="#cmd.BeforeStartingTOC">\BeforeStartingTOC</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.BeforeStartingTOC">404</a></li>
+ <li><a name="cmd.BeforeTOCHead"></a><a href="#cmd.BeforeTOCHead">\BeforeTOCHead</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.BeforeTOCHead">404</a></li>
<li><a name="cmd.BreakBibliography"></a><a href="#cmd.BreakBibliography">\BreakBibliography</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.BreakBibliography">159</a></li>
<li><a name="cmd.CenturyPart"></a><a href="#cmd.CenturyPart">\CenturyPart</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrdate.cmd.CenturyPart">293</a></li>
<li><a name="cmd.ClassInfoNoLine"></a><a href="#cmd.ClassInfoNoLine">\ClassInfoNoLine</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.ClassInfoNoLine">375</a></li>
- <li><a name="cmd.ClassName"></a><a href="#cmd.ClassName">\ClassName</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.ClassName">507</a></li>
+ <li><a name="cmd.ClassName"></a><a href="#cmd.ClassName">\ClassName</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.ClassName">506</a></li>
<li><a name="cmd.Clause"></a><a href="#cmd.Clause">\Clause</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.cmd.Clause">330</a></li>
<li><a name="cmd.Clauseformat"></a><a href="#cmd.Clauseformat">\Clauseformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.cmd.Clauseformat">332</a></li>
- <li><a name="cmd.CloneTOCEntryStyle"></a><a href="#cmd.CloneTOCEntryStyle">\CloneTOCEntryStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.CloneTOCEntryStyle">423</a></li>
+ <li><a name="cmd.CloneTOCEntryStyle"></a><a href="#cmd.CloneTOCEntryStyle">\CloneTOCEntryStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.CloneTOCEntryStyle">422</a></li>
<li><a name="cmd.Comment"></a><a href="#cmd.Comment">\Comment</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scraddr.cmd.Comment">301</a></li>
<li><a name="cmd.DayName"></a><a href="#cmd.DayName">\DayName</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrdate.cmd.DayName">294</a></li>
<li><a name="cmd.DayNameByNumber"></a><a href="#cmd.DayNameByNumber">\DayNameByNumber</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrdate.cmd.DayNameByNumber">294</a></li>
<li><a name="cmd.DayNumber"></a><a href="#cmd.DayNumber">\DayNumber</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrdate.cmd.DayNumber">293</a></li>
<li><a name="cmd.DecadePart"></a><a href="#cmd.DecadePart">\DecadePart</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrdate.cmd.DecadePart">293</a></li>
- <li><a name="cmd.DeclareLayer"></a><a href="#cmd.DeclareLayer">\DeclareLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclareLayer">449</a></li>
+ <li><a name="cmd.DeclareLayer"></a><a href="#cmd.DeclareLayer">\DeclareLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclareLayer">448</a></li>
<li><a name="cmd.DeclareNewJuraEnvironment"></a><a href="#cmd.DeclareNewJuraEnvironment">\DeclareNewJuraEnvironment</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.cmd.DeclareNewJuraEnvironment">340</a></li>
- <li><a name="cmd.DeclareNewLayer"></a><a href="#cmd.DeclareNewLayer">\DeclareNewLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclareNewLayer">449</a></li>
- <li><a name="cmd.DeclareNewNoteColumn"></a><a href="#cmd.DeclareNewNoteColumn">\DeclareNewNoteColumn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.DeclareNewNoteColumn">492</a></li>
- <li><a name="cmd.DeclareNewPageStyleAlias"></a><a href="#cmd.DeclareNewPageStyleAlias">\DeclareNewPageStyleAlias</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclareNewPageStyleAlias">461</a></li>
- <li><a name="cmd.DeclareNewPageStyleByLayers"></a><a href="#cmd.DeclareNewPageStyleByLayers">\DeclareNewPageStyleByLayers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclareNewPageStyleByLayers">462</a></li>
- <li><a name="cmd.DeclareNewSectionCommand"></a><a href="#cmd.DeclareNewSectionCommand">\DeclareNewSectionCommand</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.DeclareNewSectionCommand">513</a></li>
- <li><a name="cmd.DeclareNewSectionCommands"></a><a href="#cmd.DeclareNewSectionCommands">\DeclareNewSectionCommands</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.DeclareNewSectionCommands">524</a></li>
- <li><a name="cmd.DeclareNewTOC"></a><a href="#cmd.DeclareNewTOC">\DeclareNewTOC</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DeclareNewTOC">431</a></li>
- <li><a name="cmd.DeclareNoteColumn"></a><a href="#cmd.DeclareNoteColumn">\DeclareNoteColumn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.DeclareNoteColumn">492</a></li>
- <li><a name="cmd.DeclarePageStyleAlias"></a><a href="#cmd.DeclarePageStyleAlias">\DeclarePageStyleAlias</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclarePageStyleAlias">461</a></li>
- <li><a name="cmd.DeclarePageStyleByLayers"></a><a href="#cmd.DeclarePageStyleByLayers">\DeclarePageStyleByLayers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclarePageStyleByLayers">462</a></li>
- <li><a name="cmd.DeclareSectionCommand"></a><a href="#cmd.DeclareSectionCommand">\DeclareSectionCommand</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.DeclareSectionCommand">513</a></li>
- <li><a name="cmd.DeclareSectionCommands"></a><a href="#cmd.DeclareSectionCommands">\DeclareSectionCommands</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.DeclareSectionCommands">524</a></li>
- <li><a name="cmd.DeclareSectionNumberDepth"></a><a href="#cmd.DeclareSectionNumberDepth">\DeclareSectionNumberDepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclareSectionNumberDepth">447</a></li>
- <li><a name="cmd.DeclareTOCEntryStyle"></a><a href="#cmd.DeclareTOCEntryStyle">\DeclareTOCEntryStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DeclareTOCEntryStyle">421</a></li>
- <li><a name="cmd.DeclareTOCStyleEntries"></a><a href="#cmd.DeclareTOCStyleEntries">\DeclareTOCStyleEntries</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DeclareTOCStyleEntries">410</a></li>
- <li><a name="cmd.DeclareTOCStyleEntry"></a><a href="#cmd.DeclareTOCStyleEntry">\DeclareTOCStyleEntry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DeclareTOCStyleEntry">410</a></li>
+ <li><a name="cmd.DeclareNewLayer"></a><a href="#cmd.DeclareNewLayer">\DeclareNewLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclareNewLayer">448</a></li>
+ <li><a name="cmd.DeclareNewNoteColumn"></a><a href="#cmd.DeclareNewNoteColumn">\DeclareNewNoteColumn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.DeclareNewNoteColumn">491</a></li>
+ <li><a name="cmd.DeclareNewPageStyleAlias"></a><a href="#cmd.DeclareNewPageStyleAlias">\DeclareNewPageStyleAlias</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclareNewPageStyleAlias">460</a></li>
+ <li><a name="cmd.DeclareNewPageStyleByLayers"></a><a href="#cmd.DeclareNewPageStyleByLayers">\DeclareNewPageStyleByLayers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclareNewPageStyleByLayers">461</a></li>
+ <li><a name="cmd.DeclareNewSectionCommand"></a><a href="#cmd.DeclareNewSectionCommand">\DeclareNewSectionCommand</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.DeclareNewSectionCommand">512</a></li>
+ <li><a name="cmd.DeclareNewSectionCommands"></a><a href="#cmd.DeclareNewSectionCommands">\DeclareNewSectionCommands</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.DeclareNewSectionCommands">523</a></li>
+ <li><a name="cmd.DeclareNewTOC"></a><a href="#cmd.DeclareNewTOC">\DeclareNewTOC</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DeclareNewTOC">430</a></li>
+ <li><a name="cmd.DeclareNoteColumn"></a><a href="#cmd.DeclareNoteColumn">\DeclareNoteColumn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.DeclareNoteColumn">491</a></li>
+ <li><a name="cmd.DeclarePageStyleAlias"></a><a href="#cmd.DeclarePageStyleAlias">\DeclarePageStyleAlias</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclarePageStyleAlias">460</a></li>
+ <li><a name="cmd.DeclarePageStyleByLayers"></a><a href="#cmd.DeclarePageStyleByLayers">\DeclarePageStyleByLayers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclarePageStyleByLayers">461</a></li>
+ <li><a name="cmd.DeclareSectionCommand"></a><a href="#cmd.DeclareSectionCommand">\DeclareSectionCommand</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.DeclareSectionCommand">512</a></li>
+ <li><a name="cmd.DeclareSectionCommands"></a><a href="#cmd.DeclareSectionCommands">\DeclareSectionCommands</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.DeclareSectionCommands">523</a></li>
+ <li><a name="cmd.DeclareSectionNumberDepth"></a><a href="#cmd.DeclareSectionNumberDepth">\DeclareSectionNumberDepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DeclareSectionNumberDepth">446</a></li>
+ <li><a name="cmd.DeclareTOCEntryStyle"></a><a href="#cmd.DeclareTOCEntryStyle">\DeclareTOCEntryStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DeclareTOCEntryStyle">420</a></li>
+ <li><a name="cmd.DeclareTOCStyleEntries"></a><a href="#cmd.DeclareTOCStyleEntries">\DeclareTOCStyleEntries</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DeclareTOCStyleEntries">409</a></li>
+ <li><a name="cmd.DeclareTOCStyleEntry"></a><a href="#cmd.DeclareTOCStyleEntry">\DeclareTOCStyleEntry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DeclareTOCStyleEntry">409</a></li>
<li><a name="cmd.DefineFamily"></a><a href="#cmd.DefineFamily">\DefineFamily</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.DefineFamily">351</a></li>
<li><a name="cmd.DefineFamilyKey"></a><a href="#cmd.DefineFamilyKey">\DefineFamilyKey</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.DefineFamilyKey">352</a></li>
<li><a name="cmd.DefineFamilyMember"></a><a href="#cmd.DefineFamilyMember">\DefineFamilyMember</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.DefineFamilyMember">351</a></li>
- <li><a name="cmd.DefineTOCEntryBooleanOption"></a><a href="#cmd.DefineTOCEntryBooleanOption">\DefineTOCEntryBooleanOption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DefineTOCEntryBooleanOption">421</a></li>
- <li><a name="cmd.DefineTOCEntryCommandOption"></a><a href="#cmd.DefineTOCEntryCommandOption">\DefineTOCEntryCommandOption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DefineTOCEntryCommandOption">421</a></li>
- <li><a name="cmd.DefineTOCEntryIfOption"></a><a href="#cmd.DefineTOCEntryIfOption">\DefineTOCEntryIfOption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DefineTOCEntryIfOption">421</a></li>
- <li><a name="cmd.DefineTOCEntryLengthOption"></a><a href="#cmd.DefineTOCEntryLengthOption">\DefineTOCEntryLengthOption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DefineTOCEntryLengthOption">421</a></li>
- <li><a name="cmd.DefineTOCEntryNumberOption"></a><a href="#cmd.DefineTOCEntryNumberOption">\DefineTOCEntryNumberOption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DefineTOCEntryNumberOption">421</a></li>
- <li><a name="cmd.DefineTOCEntryOption"></a><a href="#cmd.DefineTOCEntryOption">\DefineTOCEntryOption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DefineTOCEntryOption">421</a></li>
- <li><a name="cmd.DestroyLayer"></a><a href="#cmd.DestroyLayer">\DestroyLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DestroyLayer">459</a></li>
- <li><a name="cmd.DestroyPageStyleAlias"></a><a href="#cmd.DestroyPageStyleAlias">\DestroyPageStyleAlias</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DestroyPageStyleAlias">462</a></li>
- <li><a name="cmd.DestroyRealLayerPageStyle"></a><a href="#cmd.DestroyRealLayerPageStyle">\DestroyRealLayerPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DestroyRealLayerPageStyle">469</a></li>
+ <li><a name="cmd.DefineTOCEntryBooleanOption"></a><a href="#cmd.DefineTOCEntryBooleanOption">\DefineTOCEntryBooleanOption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DefineTOCEntryBooleanOption">420</a></li>
+ <li><a name="cmd.DefineTOCEntryCommandOption"></a><a href="#cmd.DefineTOCEntryCommandOption">\DefineTOCEntryCommandOption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DefineTOCEntryCommandOption">420</a></li>
+ <li><a name="cmd.DefineTOCEntryIfOption"></a><a href="#cmd.DefineTOCEntryIfOption">\DefineTOCEntryIfOption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DefineTOCEntryIfOption">420</a></li>
+ <li><a name="cmd.DefineTOCEntryLengthOption"></a><a href="#cmd.DefineTOCEntryLengthOption">\DefineTOCEntryLengthOption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DefineTOCEntryLengthOption">420</a></li>
+ <li><a name="cmd.DefineTOCEntryNumberOption"></a><a href="#cmd.DefineTOCEntryNumberOption">\DefineTOCEntryNumberOption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DefineTOCEntryNumberOption">420</a></li>
+ <li><a name="cmd.DefineTOCEntryOption"></a><a href="#cmd.DefineTOCEntryOption">\DefineTOCEntryOption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.DefineTOCEntryOption">420</a></li>
+ <li><a name="cmd.DestroyLayer"></a><a href="#cmd.DestroyLayer">\DestroyLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DestroyLayer">458</a></li>
+ <li><a name="cmd.DestroyPageStyleAlias"></a><a href="#cmd.DestroyPageStyleAlias">\DestroyPageStyleAlias</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DestroyPageStyleAlias">461</a></li>
+ <li><a name="cmd.DestroyRealLayerPageStyle"></a><a href="#cmd.DestroyRealLayerPageStyle">\DestroyRealLayerPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.DestroyRealLayerPageStyle">468</a></li>
<li><a name="cmd.ExecuteDoHook"></a><a href="#cmd.ExecuteDoHook">\ExecuteDoHook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.ExecuteDoHook">377</a></li>
<li><a name="cmd.FamilyBoolKey"></a><a href="#cmd.FamilyBoolKey">\FamilyBoolKey</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.FamilyBoolKey">360</a></li>
<li><a name="cmd.FamilyCSKey"></a><a href="#cmd.FamilyCSKey">\FamilyCSKey</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.FamilyCSKey">364</a></li>
@@ -258,32 +256,32 @@
<li><a name="cmd.FamilyUseLengthMacroKey"></a><a href="#cmd.FamilyUseLengthMacroKey">\FamilyUseLengthMacroKey</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.FamilyUseLengthMacroKey">364</a></li>
<li><a name="cmd.FirstName"></a><a href="#cmd.FirstName">\FirstName</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scraddr.cmd.FirstName">301</a></li>
<li><a name="cmd.ForDoHook"></a><a href="#cmd.ForDoHook">\ForDoHook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.ForDoHook">379</a></li>
- <li><a name="cmd.ForEachLayerOfPageStyle*"></a><a href="#cmd.ForEachLayerOfPageStyle*">\ForEachLayerOfPageStyle*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ForEachLayerOfPageStyle*">466</a></li>
- <li><a name="cmd.ForEachLayerOfPageStyle"></a><a href="#cmd.ForEachLayerOfPageStyle">\ForEachLayerOfPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ForEachLayerOfPageStyle">466</a></li>
+ <li><a name="cmd.ForEachLayerOfPageStyle*"></a><a href="#cmd.ForEachLayerOfPageStyle*">\ForEachLayerOfPageStyle*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ForEachLayerOfPageStyle*">465</a></li>
+ <li><a name="cmd.ForEachLayerOfPageStyle"></a><a href="#cmd.ForEachLayerOfPageStyle">\ForEachLayerOfPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ForEachLayerOfPageStyle">465</a></li>
<li><a name="cmd.FreeI"></a><a href="#cmd.FreeI">\FreeI</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scraddr.cmd.FreeI">301</a></li>
<li><a name="cmd.FreeII"></a><a href="#cmd.FreeII">\FreeII</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scraddr.cmd.FreeII">301</a></li>
<li><a name="cmd.FreeIII"></a><a href="#cmd.FreeIII">\FreeIII</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scraddr.cmd.FreeIII">301</a></li>
<li><a name="cmd.FreeIV"></a><a href="#cmd.FreeIV">\FreeIV</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scraddr.cmd.FreeIV">301</a></li>
- <li><a name="cmd.GenericMarkFormat"></a><a href="#cmd.GenericMarkFormat">\GenericMarkFormat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.GenericMarkFormat">475</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.GenericMarkFormat">478</a></li>
- <li><a name="cmd.GetLayerContents"></a><a href="#cmd.GetLayerContents">\GetLayerContents</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.GetLayerContents">459</a></li>
- <li><a name="cmd.GetRealPageStyle"></a><a href="#cmd.GetRealPageStyle">\GetRealPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.GetRealPageStyle">462</a></li>
+ <li><a name="cmd.GenericMarkFormat"></a><a href="#cmd.GenericMarkFormat">\GenericMarkFormat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.GenericMarkFormat">474</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.GenericMarkFormat">477</a></li>
+ <li><a name="cmd.GetLayerContents"></a><a href="#cmd.GetLayerContents">\GetLayerContents</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.GetLayerContents">458</a></li>
+ <li><a name="cmd.GetRealPageStyle"></a><a href="#cmd.GetRealPageStyle">\GetRealPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.GetRealPageStyle">461</a></li>
<li><a name="cmd.ISODayName"></a><a href="#cmd.ISODayName">\ISODayName</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrdate.cmd.ISODayName">294</a></li>
<li><a name="cmd.ISODayNumber"></a><a href="#cmd.ISODayNumber">\ISODayNumber</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrdate.cmd.ISODayNumber">293</a></li>
<li><a name="cmd.ISOToday"></a><a href="#cmd.ISOToday">\ISOToday</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrdate.cmd.ISOToday">295</a></li>
<li><a name="cmd.IfActiveMkBoth"></a><a href="#cmd.IfActiveMkBoth">\IfActiveMkBoth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.IfActiveMkBoth">369</a></li>
<li><a name="cmd.IfChapterUsesPrefixLine"></a><a href="#cmd.IfChapterUsesPrefixLine">\IfChapterUsesPrefixLine</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.IfChapterUsesPrefixLine">101</a></li>
- <li><a name="cmd.IfExistskomafont"></a><a href="#cmd.IfExistskomafont">\IfExistskomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.IfExistskomafont">511</a></li>
- <li><a name="cmd.IfIsAliaskomafont"></a><a href="#cmd.IfIsAliaskomafont">\IfIsAliaskomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.IfIsAliaskomafont">511</a></li>
- <li><a name="cmd.IfLayerAtPageStyle"></a><a href="#cmd.IfLayerAtPageStyle">\IfLayerAtPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.IfLayerAtPageStyle">469</a></li>
- <li><a name="cmd.IfLayerExists"></a><a href="#cmd.IfLayerExists">\IfLayerExists</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.IfLayerExists">459</a></li>
- <li><a name="cmd.IfLayerPageStyleExists"></a><a href="#cmd.IfLayerPageStyleExists">\IfLayerPageStyleExists</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.IfLayerPageStyleExists">469</a></li>
- <li><a name="cmd.IfLayersAtPageStyle"></a><a href="#cmd.IfLayersAtPageStyle">\IfLayersAtPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.IfLayersAtPageStyle">469</a></li>
- <li><a name="cmd.IfRealLayerPageStyleExists"></a><a href="#cmd.IfRealLayerPageStyleExists">\IfRealLayerPageStyleExists</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.IfRealLayerPageStyleExists">469</a></li>
- <li><a name="cmd.IfSectionCommandStyleIs"></a><a href="#cmd.IfSectionCommandStyleIs">\IfSectionCommandStyleIs</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.IfSectionCommandStyleIs">525</a></li>
- <li><a name="cmd.IfSomeLayersAtPageStyle"></a><a href="#cmd.IfSomeLayersAtPageStyle">\IfSomeLayersAtPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.IfSomeLayersAtPageStyle">469</a></li>
- <li><a name="cmd.IfUseNumber"></a><a href="#cmd.IfUseNumber">\IfUseNumber</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.IfUseNumber">533</a></li>
+ <li><a name="cmd.IfExistskomafont"></a><a href="#cmd.IfExistskomafont">\IfExistskomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.IfExistskomafont">510</a></li>
+ <li><a name="cmd.IfIsAliaskomafont"></a><a href="#cmd.IfIsAliaskomafont">\IfIsAliaskomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.IfIsAliaskomafont">510</a></li>
+ <li><a name="cmd.IfLayerAtPageStyle"></a><a href="#cmd.IfLayerAtPageStyle">\IfLayerAtPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.IfLayerAtPageStyle">468</a></li>
+ <li><a name="cmd.IfLayerExists"></a><a href="#cmd.IfLayerExists">\IfLayerExists</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.IfLayerExists">458</a></li>
+ <li><a name="cmd.IfLayerPageStyleExists"></a><a href="#cmd.IfLayerPageStyleExists">\IfLayerPageStyleExists</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.IfLayerPageStyleExists">468</a></li>
+ <li><a name="cmd.IfLayersAtPageStyle"></a><a href="#cmd.IfLayersAtPageStyle">\IfLayersAtPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.IfLayersAtPageStyle">468</a></li>
+ <li><a name="cmd.IfRealLayerPageStyleExists"></a><a href="#cmd.IfRealLayerPageStyleExists">\IfRealLayerPageStyleExists</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.IfRealLayerPageStyleExists">468</a></li>
+ <li><a name="cmd.IfSectionCommandStyleIs"></a><a href="#cmd.IfSectionCommandStyleIs">\IfSectionCommandStyleIs</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.IfSectionCommandStyleIs">524</a></li>
+ <li><a name="cmd.IfSomeLayersAtPageStyle"></a><a href="#cmd.IfSomeLayersAtPageStyle">\IfSomeLayersAtPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.IfSomeLayersAtPageStyle">468</a></li>
+ <li><a name="cmd.IfUseNumber"></a><a href="#cmd.IfUseNumber">\IfUseNumber</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.IfUseNumber">532</a></li>
<li><a name="cmd.IfUsePrefixLine"></a><a href="#cmd.IfUsePrefixLine">\IfUsePrefixLine</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.IfUsePrefixLine">116</a></li>
- <li><a name="cmd.Ifattoclist"></a><a href="#cmd.Ifattoclist">\Ifattoclist</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.Ifattoclist">397</a></li>
+ <li><a name="cmd.Ifattoclist"></a><a href="#cmd.Ifattoclist">\Ifattoclist</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.Ifattoclist">396</a></li>
<li><a name="cmd.Ifdimen"></a><a href="#cmd.Ifdimen">\Ifdimen</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.Ifdimen">368</a></li>
<li><a name="cmd.Ifdvioutput"></a><a href="#cmd.Ifdvioutput">\Ifdvioutput</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.Ifdvioutput">368</a></li>
<li><a name="cmd.Ifiscount"></a><a href="#cmd.Ifiscount">\Ifiscount</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.Ifiscount">369</a></li>
@@ -297,8 +295,8 @@
<li><a name="cmd.Ifisnumexpr"></a><a href="#cmd.Ifisnumexpr">\Ifisnumexpr</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.Ifisnumexpr">369</a></li>
<li><a name="cmd.Ifisskip"></a><a href="#cmd.Ifisskip">\Ifisskip</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.Ifisskip">368</a></li>
<li><a name="cmd.Ifkomavar"></a><a href="#cmd.Ifkomavar">\Ifkomavar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.Ifkomavar">171</a></li>
- <li><a name="cmd.Ifkomavarempty*"></a><a href="#cmd.Ifkomavarempty*">\Ifkomavarempty*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.Ifkomavarempty*">171</a>, <a href="scrguide.pdf#desc:scrlttr2-experts.cmd.Ifkomavarempty*">539</a></li>
- <li><a name="cmd.Ifkomavarempty"></a><a href="#cmd.Ifkomavarempty">\Ifkomavarempty</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.Ifkomavarempty">171</a>, <a href="scrguide.pdf#desc:scrlttr2-experts.cmd.Ifkomavarempty">539</a></li>
+ <li><a name="cmd.Ifkomavarempty*"></a><a href="#cmd.Ifkomavarempty*">\Ifkomavarempty*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.Ifkomavarempty*">171</a>, <a href="scrguide.pdf#desc:scrlttr2-experts.cmd.Ifkomavarempty*">538</a></li>
+ <li><a name="cmd.Ifkomavarempty"></a><a href="#cmd.Ifkomavarempty">\Ifkomavarempty</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.Ifkomavarempty">171</a>, <a href="scrguide.pdf#desc:scrlttr2-experts.cmd.Ifkomavarempty">538</a></li>
<li><a name="cmd.Ifnotundefined"></a><a href="#cmd.Ifnotundefined">\Ifnotundefined</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.Ifnotundefined">367</a></li>
<li><a name="cmd.Ifnumber"></a><a href="#cmd.Ifnumber">\Ifnumber</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.Ifnumber">369</a></li>
<li><a name="cmd.Ifnumbered"></a><a href="#cmd.Ifnumbered">\Ifnumbered</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.Ifnumbered">120</a></li>
@@ -308,111 +306,111 @@
<li><a name="cmd.Ifstr"></a><a href="#cmd.Ifstr">\Ifstr</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.Ifstr">367</a></li>
<li><a name="cmd.Ifstrstart"></a><a href="#cmd.Ifstrstart">\Ifstrstart</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.Ifstrstart">367</a></li>
<li><a name="cmd.Ifthispageodd"></a><a href="#cmd.Ifthispageodd">\Ifthispageodd</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.Ifthispageodd">237</a>, <a href="scrguide.pdf#desc:scrextend.cmd.Ifthispageodd">316</a>, <a href="scrguide.pdf#desc:maincls.cmd.Ifthispageodd">83</a></li>
- <li><a name="cmd.Iftocfeature"></a><a href="#cmd.Iftocfeature">\Iftocfeature</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.Iftocfeature">409</a></li>
+ <li><a name="cmd.Iftocfeature"></a><a href="#cmd.Iftocfeature">\Iftocfeature</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.Iftocfeature">408</a></li>
<li><a name="cmd.Ifundefinedorrelax"></a><a href="#cmd.Ifundefinedorrelax">\Ifundefinedorrelax</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.Ifundefinedorrelax">367</a></li>
<li><a name="cmd.Ifunnumbered"></a><a href="#cmd.Ifunnumbered">\Ifunnumbered</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.Ifunnumbered">120</a></li>
<li><a name="cmd.InputAddressFile"></a><a href="#cmd.InputAddressFile">\InputAddressFile</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scraddr.cmd.InputAddressFile">300</a></li>
<li><a name="cmd.IsoToday"></a><a href="#cmd.IsoToday">\IsoToday</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrdate.cmd.IsoToday">295</a></li>
- <li><a name="cmd.KOMAClassName"></a><a href="#cmd.KOMAClassName">\KOMAClassName</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.KOMAClassName">507</a></li>
+ <li><a name="cmd.KOMAClassName"></a><a href="#cmd.KOMAClassName">\KOMAClassName</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.KOMAClassName">506</a></li>
<li><a name="cmd.KOMAScript"></a><a href="#cmd.KOMAScript">\KOMAScript</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.KOMAScript">374</a></li>
<li><a name="cmd.KOMAScriptVersion"></a><a href="#cmd.KOMAScriptVersion">\KOMAScriptVersion</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.KOMAScriptVersion">375</a></li>
- <li><a name="cmd.KOMAoption"></a><a href="#cmd.KOMAoption">\KOMAoption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.KOMAoption">163</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.KOMAoption">265</a>, <a href="scrguide.pdf#desc:scrextend.cmd.KOMAoption">306</a>, <a href="scrguide.pdf#desc:typearea.cmd.KOMAoption">32</a>, <a href="scrguide.pdf#desc:scrjura.cmd.KOMAoption">326</a>, <a href="scrguide.pdf#desc:scrhack.cmd.KOMAoption">439</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.KOMAoption">445</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.KOMAoption">489</a>, <a href="scrguide.pdf#desc:maincls.cmd.KOMAoption">57</a></li>
- <li><a name="cmd.KOMAoptions"></a><a href="#cmd.KOMAoptions">\KOMAoptions</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.KOMAoptions">163</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.KOMAoptions">265</a>, <a href="scrguide.pdf#desc:scrextend.cmd.KOMAoptions">306</a>, <a href="scrguide.pdf#desc:typearea.cmd.KOMAoptions">32</a>, <a href="scrguide.pdf#desc:scrjura.cmd.KOMAoptions">326</a>, <a href="scrguide.pdf#desc:scrhack.cmd.KOMAoptions">439</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.KOMAoptions">445</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.KOMAoptions">489</a>, <a href="scrguide.pdf#desc:maincls.cmd.KOMAoptions">57</a></li>
+ <li><a name="cmd.KOMAoption"></a><a href="#cmd.KOMAoption">\KOMAoption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.KOMAoption">163</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.KOMAoption">265</a>, <a href="scrguide.pdf#desc:scrextend.cmd.KOMAoption">306</a>, <a href="scrguide.pdf#desc:typearea.cmd.KOMAoption">32</a>, <a href="scrguide.pdf#desc:scrjura.cmd.KOMAoption">326</a>, <a href="scrguide.pdf#desc:scrhack.cmd.KOMAoption">438</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.KOMAoption">444</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.KOMAoption">488</a>, <a href="scrguide.pdf#desc:maincls.cmd.KOMAoption">57</a></li>
+ <li><a name="cmd.KOMAoptions"></a><a href="#cmd.KOMAoptions">\KOMAoptions</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.KOMAoptions">163</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.KOMAoptions">265</a>, <a href="scrguide.pdf#desc:scrextend.cmd.KOMAoptions">306</a>, <a href="scrguide.pdf#desc:typearea.cmd.KOMAoptions">32</a>, <a href="scrguide.pdf#desc:scrjura.cmd.KOMAoptions">326</a>, <a href="scrguide.pdf#desc:scrhack.cmd.KOMAoptions">438</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.KOMAoptions">444</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.KOMAoptions">488</a>, <a href="scrguide.pdf#desc:maincls.cmd.KOMAoptions">57</a></li>
<li><a name="cmd.LastName"></a><a href="#cmd.LastName">\LastName</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scraddr.cmd.LastName">301</a></li>
- <li><a name="cmd.LastTOCLevelWasHigher"></a><a href="#cmd.LastTOCLevelWasHigher">\LastTOCLevelWasHigher</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.LastTOCLevelWasHigher">424</a></li>
- <li><a name="cmd.LastTOCLevelWasLower"></a><a href="#cmd.LastTOCLevelWasLower">\LastTOCLevelWasLower</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.LastTOCLevelWasLower">424</a></li>
- <li><a name="cmd.LastTOCLevelWasSame"></a><a href="#cmd.LastTOCLevelWasSame">\LastTOCLevelWasSame</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.LastTOCLevelWasSame">424</a></li>
- <li><a name="cmd.LenToUnit"></a><a href="#cmd.LenToUnit">\LenToUnit</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.LenToUnit">457</a></li>
- <li><a name="cmd.MakeMarkcase"></a><a href="#cmd.MakeMarkcase">\MakeMarkcase</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.MakeMarkcase">284</a>, <a href="scrguide.pdf#desc:tocbasic.cmd.MakeMarkcase">405</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.MakeMarkcase">472</a></li>
- <li><a name="cmd.ModifyLayer"></a><a href="#cmd.ModifyLayer">\ModifyLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ModifyLayer">449</a></li>
- <li><a name="cmd.ModifyLayerPageStyleOptions"></a><a href="#cmd.ModifyLayerPageStyleOptions">\ModifyLayerPageStyleOptions</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ModifyLayerPageStyleOptions">468</a></li>
- <li><a name="cmd.ModifyLayers"></a><a href="#cmd.ModifyLayers">\ModifyLayers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ModifyLayers">457</a></li>
+ <li><a name="cmd.LastTOCLevelWasHigher"></a><a href="#cmd.LastTOCLevelWasHigher">\LastTOCLevelWasHigher</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.LastTOCLevelWasHigher">423</a></li>
+ <li><a name="cmd.LastTOCLevelWasLower"></a><a href="#cmd.LastTOCLevelWasLower">\LastTOCLevelWasLower</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.LastTOCLevelWasLower">423</a></li>
+ <li><a name="cmd.LastTOCLevelWasSame"></a><a href="#cmd.LastTOCLevelWasSame">\LastTOCLevelWasSame</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.LastTOCLevelWasSame">423</a></li>
+ <li><a name="cmd.LenToUnit"></a><a href="#cmd.LenToUnit">\LenToUnit</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.LenToUnit">456</a></li>
+ <li><a name="cmd.MakeMarkcase"></a><a href="#cmd.MakeMarkcase">\MakeMarkcase</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.MakeMarkcase">284</a>, <a href="scrguide.pdf#desc:tocbasic.cmd.MakeMarkcase">404</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.MakeMarkcase">471</a></li>
+ <li><a name="cmd.ModifyLayer"></a><a href="#cmd.ModifyLayer">\ModifyLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ModifyLayer">448</a></li>
+ <li><a name="cmd.ModifyLayerPageStyleOptions"></a><a href="#cmd.ModifyLayerPageStyleOptions">\ModifyLayerPageStyleOptions</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ModifyLayerPageStyleOptions">467</a></li>
+ <li><a name="cmd.ModifyLayers"></a><a href="#cmd.ModifyLayers">\ModifyLayers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ModifyLayers">456</a></li>
<li><a name="cmd.Name"></a><a href="#cmd.Name">\Name</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scraddr.cmd.Name">301</a></li>
<li><a name="cmd.PackageInfoNoLine"></a><a href="#cmd.PackageInfoNoLine">\PackageInfoNoLine</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.PackageInfoNoLine">375</a></li>
- <li><a name="cmd.PreventPackageFromLoading*"></a><a href="#cmd.PreventPackageFromLoading*">\PreventPackageFromLoading*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.PreventPackageFromLoading*">390</a></li>
- <li><a name="cmd.PreventPackageFromLoading"></a><a href="#cmd.PreventPackageFromLoading">\PreventPackageFromLoading</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.PreventPackageFromLoading">390</a></li>
- <li><a name="cmd.ProvideLayer"></a><a href="#cmd.ProvideLayer">\ProvideLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ProvideLayer">449</a></li>
- <li><a name="cmd.ProvideNoteColumn"></a><a href="#cmd.ProvideNoteColumn">\ProvideNoteColumn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.ProvideNoteColumn">492</a></li>
- <li><a name="cmd.ProvidePageStyleAlias"></a><a href="#cmd.ProvidePageStyleAlias">\ProvidePageStyleAlias</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ProvidePageStyleAlias">461</a></li>
- <li><a name="cmd.ProvidePageStyleByLayers"></a><a href="#cmd.ProvidePageStyleByLayers">\ProvidePageStyleByLayers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ProvidePageStyleByLayers">462</a></li>
- <li><a name="cmd.ProvideSectionCommand"></a><a href="#cmd.ProvideSectionCommand">\ProvideSectionCommand</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.ProvideSectionCommand">513</a></li>
- <li><a name="cmd.ProvideSectionCommands"></a><a href="#cmd.ProvideSectionCommands">\ProvideSectionCommands</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.ProvideSectionCommands">524</a></li>
- <li><a name="cmd.RedeclareLayer"></a><a href="#cmd.RedeclareLayer">\RedeclareLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.RedeclareLayer">449</a></li>
- <li><a name="cmd.RedeclareNoteColumn"></a><a href="#cmd.RedeclareNoteColumn">\RedeclareNoteColumn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.RedeclareNoteColumn">492</a></li>
- <li><a name="cmd.RedeclarePageStyleAlias"></a><a href="#cmd.RedeclarePageStyleAlias">\RedeclarePageStyleAlias</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.RedeclarePageStyleAlias">461</a></li>
- <li><a name="cmd.RedeclarePageStyleByLayers"></a><a href="#cmd.RedeclarePageStyleByLayers">\RedeclarePageStyleByLayers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.RedeclarePageStyleByLayers">462</a></li>
- <li><a name="cmd.RedeclareSectionCommand"></a><a href="#cmd.RedeclareSectionCommand">\RedeclareSectionCommand</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.RedeclareSectionCommand">513</a></li>
- <li><a name="cmd.RedeclareSectionCommands"></a><a href="#cmd.RedeclareSectionCommands">\RedeclareSectionCommands</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.RedeclareSectionCommands">524</a></li>
+ <li><a name="cmd.PreventPackageFromLoading*"></a><a href="#cmd.PreventPackageFromLoading*">\PreventPackageFromLoading*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.PreventPackageFromLoading*">389</a></li>
+ <li><a name="cmd.PreventPackageFromLoading"></a><a href="#cmd.PreventPackageFromLoading">\PreventPackageFromLoading</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.PreventPackageFromLoading">389</a></li>
+ <li><a name="cmd.ProvideLayer"></a><a href="#cmd.ProvideLayer">\ProvideLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ProvideLayer">448</a></li>
+ <li><a name="cmd.ProvideNoteColumn"></a><a href="#cmd.ProvideNoteColumn">\ProvideNoteColumn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.ProvideNoteColumn">491</a></li>
+ <li><a name="cmd.ProvidePageStyleAlias"></a><a href="#cmd.ProvidePageStyleAlias">\ProvidePageStyleAlias</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ProvidePageStyleAlias">460</a></li>
+ <li><a name="cmd.ProvidePageStyleByLayers"></a><a href="#cmd.ProvidePageStyleByLayers">\ProvidePageStyleByLayers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.ProvidePageStyleByLayers">461</a></li>
+ <li><a name="cmd.ProvideSectionCommand"></a><a href="#cmd.ProvideSectionCommand">\ProvideSectionCommand</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.ProvideSectionCommand">512</a></li>
+ <li><a name="cmd.ProvideSectionCommands"></a><a href="#cmd.ProvideSectionCommands">\ProvideSectionCommands</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.ProvideSectionCommands">523</a></li>
+ <li><a name="cmd.RedeclareLayer"></a><a href="#cmd.RedeclareLayer">\RedeclareLayer</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.RedeclareLayer">448</a></li>
+ <li><a name="cmd.RedeclareNoteColumn"></a><a href="#cmd.RedeclareNoteColumn">\RedeclareNoteColumn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.RedeclareNoteColumn">491</a></li>
+ <li><a name="cmd.RedeclarePageStyleAlias"></a><a href="#cmd.RedeclarePageStyleAlias">\RedeclarePageStyleAlias</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.RedeclarePageStyleAlias">460</a></li>
+ <li><a name="cmd.RedeclarePageStyleByLayers"></a><a href="#cmd.RedeclarePageStyleByLayers">\RedeclarePageStyleByLayers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.RedeclarePageStyleByLayers">461</a></li>
+ <li><a name="cmd.RedeclareSectionCommand"></a><a href="#cmd.RedeclareSectionCommand">\RedeclareSectionCommand</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.RedeclareSectionCommand">512</a></li>
+ <li><a name="cmd.RedeclareSectionCommands"></a><a href="#cmd.RedeclareSectionCommands">\RedeclareSectionCommands</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.RedeclareSectionCommands">523</a></li>
<li><a name="cmd.RelaxFamilyKey"></a><a href="#cmd.RelaxFamilyKey">\RelaxFamilyKey</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.RelaxFamilyKey">354</a></li>
- <li><a name="cmd.RemoveLayersFromPageStyle"></a><a href="#cmd.RemoveLayersFromPageStyle">\RemoveLayersFromPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.RemoveLayersFromPageStyle">467</a></li>
- <li><a name="cmd.ReplaceClass"></a><a href="#cmd.ReplaceClass">\ReplaceClass</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.ReplaceClass">387</a></li>
+ <li><a name="cmd.RemoveLayersFromPageStyle"></a><a href="#cmd.RemoveLayersFromPageStyle">\RemoveLayersFromPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.RemoveLayersFromPageStyle">466</a></li>
+ <li><a name="cmd.ReplaceClass"></a><a href="#cmd.ReplaceClass">\ReplaceClass</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.ReplaceClass">388</a></li>
<li><a name="cmd.ReplaceInput"></a><a href="#cmd.ReplaceInput">\ReplaceInput</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.ReplaceInput">387</a></li>
- <li><a name="cmd.ReplacePackage"></a><a href="#cmd.ReplacePackage">\ReplacePackage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.ReplacePackage">387</a></li>
+ <li><a name="cmd.ReplacePackage"></a><a href="#cmd.ReplacePackage">\ReplacePackage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.ReplacePackage">388</a></li>
<li><a name="cmd.ResetPreventPackageFromLoading"></a><a href="#cmd.ResetPreventPackageFromLoading">\ResetPreventPackageFromLoading</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.ResetPreventPackageFromLoading">390</a></li>
- <li><a name="cmd.SecDef"></a><a href="#cmd.SecDef">\SecDef</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.SecDef">533</a></li>
+ <li><a name="cmd.SecDef"></a><a href="#cmd.SecDef">\SecDef</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.SecDef">532</a></li>
<li><a name="cmd.Sentence"></a><a href="#cmd.Sentence">\Sentence</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.cmd.Sentence">336</a></li>
<li><a name="cmd.SplitDoHook"></a><a href="#cmd.SplitDoHook">\SplitDoHook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.SplitDoHook">379</a></li>
<li><a name="cmd.StorePreventPackageFromLoading"></a><a href="#cmd.StorePreventPackageFromLoading">\StorePreventPackageFromLoading</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.StorePreventPackageFromLoading">390</a></li>
<li><a name="cmd.SubClause"></a><a href="#cmd.SubClause">\SubClause</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.cmd.SubClause">330</a></li>
- <li><a name="cmd.TOCEntryStyleInitCode"></a><a href="#cmd.TOCEntryStyleInitCode">\TOCEntryStyleInitCode</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.TOCEntryStyleInitCode">424</a></li>
- <li><a name="cmd.TOCEntryStyleStartInitCode"></a><a href="#cmd.TOCEntryStyleStartInitCode">\TOCEntryStyleStartInitCode</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.TOCEntryStyleStartInitCode">424</a></li>
- <li><a name="cmd.TOCLineLeaderFill"></a><a href="#cmd.TOCLineLeaderFill">\TOCLineLeaderFill</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.TOCLineLeaderFill">425</a></li>
- <li><a name="cmd.TOCclone"></a><a href="#cmd.TOCclone">\TOCclone</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrwfile.cmd.TOCclone">395</a></li>
+ <li><a name="cmd.TOCEntryStyleInitCode"></a><a href="#cmd.TOCEntryStyleInitCode">\TOCEntryStyleInitCode</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.TOCEntryStyleInitCode">423</a></li>
+ <li><a name="cmd.TOCEntryStyleStartInitCode"></a><a href="#cmd.TOCEntryStyleStartInitCode">\TOCEntryStyleStartInitCode</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.TOCEntryStyleStartInitCode">423</a></li>
+ <li><a name="cmd.TOCLineLeaderFill"></a><a href="#cmd.TOCLineLeaderFill">\TOCLineLeaderFill</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.TOCLineLeaderFill">424</a></li>
+ <li><a name="cmd.TOCclone"></a><a href="#cmd.TOCclone">\TOCclone</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrwfile.cmd.TOCclone">394</a></li>
<li><a name="cmd.Telephone"></a><a href="#cmd.Telephone">\Telephone</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scraddr.cmd.Telephone">301</a></li>
<li><a name="cmd.UnPreventPackageFromLoading*"></a><a href="#cmd.UnPreventPackageFromLoading*">\UnPreventPackageFromLoading*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.UnPreventPackageFromLoading*">391</a></li>
<li><a name="cmd.UnPreventPackageFromLoading"></a><a href="#cmd.UnPreventPackageFromLoading">\UnPreventPackageFromLoading</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.UnPreventPackageFromLoading">391</a></li>
<li><a name="cmd.UnReplaceClass"></a><a href="#cmd.UnReplaceClass">\UnReplaceClass</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.UnReplaceClass">389</a></li>
<li><a name="cmd.UnReplaceInput"></a><a href="#cmd.UnReplaceInput">\UnReplaceInput</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.UnReplaceInput">389</a></li>
<li><a name="cmd.UnReplacePackage"></a><a href="#cmd.UnReplacePackage">\UnReplacePackage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlfile.cmd.UnReplacePackage">389</a></li>
- <li><a name="cmd.UnifyLayersAtPageStyle"></a><a href="#cmd.UnifyLayersAtPageStyle">\UnifyLayersAtPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.UnifyLayersAtPageStyle">468</a></li>
+ <li><a name="cmd.UnifyLayersAtPageStyle"></a><a href="#cmd.UnifyLayersAtPageStyle">\UnifyLayersAtPageStyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.UnifyLayersAtPageStyle">467</a></li>
<li><a name="cmd.XdivY"></a><a href="#cmd.XdivY">\XdivY</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.XdivY">376</a></li>
<li><a name="cmd.XmodY"></a><a href="#cmd.XmodY">\XmodY</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.XmodY">376</a></li>
- <li><a name="cmd.activateareas"></a><a href="#cmd.activateareas">\activateareas</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.activateareas">504</a></li>
+ <li><a name="cmd.activateareas"></a><a href="#cmd.activateareas">\activateareas</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.activateareas">503</a></li>
<li><a name="cmd.addchap*"></a><a href="#cmd.addchap*">\addchap*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.addchap*">112</a></li>
<li><a name="cmd.addchap"></a><a href="#cmd.addchap">\addchap</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.addchap">112</a></li>
<li><a name="cmd.addchapmark"></a><a href="#cmd.addchapmark">\addchapmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.addchapmark">118</a></li>
- <li><a name="cmd.addchaptertocentry"></a><a href="#cmd.addchaptertocentry">\addchaptertocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addchaptertocentry">509</a></li>
- <li><a name="cmd.addcontentslinetoeachtocfile"></a><a href="#cmd.addcontentslinetoeachtocfile">\addcontentslinetoeachtocfile</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.addcontentslinetoeachtocfile">403</a></li>
- <li><a name="cmd.addparagraphtocentry"></a><a href="#cmd.addparagraphtocentry">\addparagraphtocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addparagraphtocentry">509</a></li>
+ <li><a name="cmd.addchaptertocentry"></a><a href="#cmd.addchaptertocentry">\addchaptertocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addchaptertocentry">508</a></li>
+ <li><a name="cmd.addcontentslinetoeachtocfile"></a><a href="#cmd.addcontentslinetoeachtocfile">\addcontentslinetoeachtocfile</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.addcontentslinetoeachtocfile">402</a></li>
+ <li><a name="cmd.addparagraphtocentry"></a><a href="#cmd.addparagraphtocentry">\addparagraphtocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addparagraphtocentry">508</a></li>
<li><a name="cmd.addpart*"></a><a href="#cmd.addpart*">\addpart*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.addpart*">112</a></li>
<li><a name="cmd.addpart"></a><a href="#cmd.addpart">\addpart</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.addpart">112</a></li>
- <li><a name="cmd.addparttocentry"></a><a href="#cmd.addparttocentry">\addparttocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addparttocentry">509</a></li>
+ <li><a name="cmd.addparttocentry"></a><a href="#cmd.addparttocentry">\addparttocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addparttocentry">508</a></li>
<li><a name="cmd.addrchar"></a><a href="#cmd.addrchar">\addrchar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.addrchar">262</a>, <a href="scrguide.pdf#desc:scraddr.cmd.addrchar">300</a></li>
<li><a name="cmd.addrentry"></a><a href="#cmd.addrentry">\addrentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.addrentry">260</a>, <a href="scrguide.pdf#desc:scraddr.cmd.addrentry">300</a></li>
<li><a name="cmd.addsec*"></a><a href="#cmd.addsec*">\addsec*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.addsec*">112</a></li>
<li><a name="cmd.addsec"></a><a href="#cmd.addsec">\addsec</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.addsec">112</a></li>
<li><a name="cmd.addsecmark"></a><a href="#cmd.addsecmark">\addsecmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.addsecmark">118</a></li>
- <li><a name="cmd.addsectiontocentry"></a><a href="#cmd.addsectiontocentry">\addsectiontocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addsectiontocentry">509</a></li>
- <li><a name="cmd.addsubparagraphtocentry"></a><a href="#cmd.addsubparagraphtocentry">\addsubparagraphtocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addsubparagraphtocentry">509</a></li>
- <li><a name="cmd.addsubsectiontocentry"></a><a href="#cmd.addsubsectiontocentry">\addsubsectiontocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addsubsectiontocentry">509</a></li>
- <li><a name="cmd.addsubsubsectiontocentry"></a><a href="#cmd.addsubsubsectiontocentry">\addsubsubsectiontocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addsubsubsectiontocentry">509</a></li>
- <li><a name="cmd.addtocentrydefault"></a><a href="#cmd.addtocentrydefault">\addtocentrydefault</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addtocentrydefault">508</a></li>
- <li><a name="cmd.addtoeachtocfile"></a><a href="#cmd.addtoeachtocfile">\addtoeachtocfile</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.addtoeachtocfile">402</a></li>
- <li><a name="cmd.addtokomafont"></a><a href="#cmd.addtokomafont">\addtokomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.addtokomafont">191</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.addtokomafont">267</a>, <a href="scrguide.pdf#desc:scrextend.cmd.addtokomafont">309</a>, <a href="scrguide.pdf#desc:scrjura.cmd.addtokomafont">326</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.addtokomafont">490</a>, <a href="scrguide.pdf#desc:maincls.cmd.addtokomafont">61</a></li>
- <li><a name="cmd.addtokomafontgobblelist"></a><a href="#cmd.addtokomafontgobblelist">\addtokomafontgobblelist</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addtokomafontgobblelist">510</a></li>
- <li><a name="cmd.addtokomafontonearglist"></a><a href="#cmd.addtokomafontonearglist">\addtokomafontonearglist</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addtokomafontonearglist">510</a></li>
- <li><a name="cmd.addtokomafontrelaxlist"></a><a href="#cmd.addtokomafontrelaxlist">\addtokomafontrelaxlist</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addtokomafontrelaxlist">510</a></li>
+ <li><a name="cmd.addsectiontocentry"></a><a href="#cmd.addsectiontocentry">\addsectiontocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addsectiontocentry">508</a></li>
+ <li><a name="cmd.addsubparagraphtocentry"></a><a href="#cmd.addsubparagraphtocentry">\addsubparagraphtocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addsubparagraphtocentry">508</a></li>
+ <li><a name="cmd.addsubsectiontocentry"></a><a href="#cmd.addsubsectiontocentry">\addsubsectiontocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addsubsectiontocentry">508</a></li>
+ <li><a name="cmd.addsubsubsectiontocentry"></a><a href="#cmd.addsubsubsectiontocentry">\addsubsubsectiontocentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addsubsubsectiontocentry">508</a></li>
+ <li><a name="cmd.addtocentrydefault"></a><a href="#cmd.addtocentrydefault">\addtocentrydefault</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addtocentrydefault">507</a></li>
+ <li><a name="cmd.addtoeachtocfile"></a><a href="#cmd.addtoeachtocfile">\addtoeachtocfile</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.addtoeachtocfile">401</a></li>
+ <li><a name="cmd.addtokomafont"></a><a href="#cmd.addtokomafont">\addtokomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.addtokomafont">191</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.addtokomafont">267</a>, <a href="scrguide.pdf#desc:scrextend.cmd.addtokomafont">309</a>, <a href="scrguide.pdf#desc:scrjura.cmd.addtokomafont">326</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.addtokomafont">489</a>, <a href="scrguide.pdf#desc:maincls.cmd.addtokomafont">61</a></li>
+ <li><a name="cmd.addtokomafontgobblelist"></a><a href="#cmd.addtokomafontgobblelist">\addtokomafontgobblelist</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addtokomafontgobblelist">509</a></li>
+ <li><a name="cmd.addtokomafontonearglist"></a><a href="#cmd.addtokomafontonearglist">\addtokomafontonearglist</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addtokomafontonearglist">509</a></li>
+ <li><a name="cmd.addtokomafontrelaxlist"></a><a href="#cmd.addtokomafontrelaxlist">\addtokomafontrelaxlist</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.addtokomafontrelaxlist">509</a></li>
<li><a name="cmd.addtolengthplength"></a><a href="#cmd.addtolengthplength">\addtolengthplength</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.addtolengthplength">178</a></li>
<li><a name="cmd.addtoplength"></a><a href="#cmd.addtoplength">\addtoplength</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.addtoplength">178</a></li>
- <li><a name="cmd.addtoreffields"></a><a href="#cmd.addtoreffields">\addtoreffields</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.addtoreffields">538</a></li>
- <li><a name="cmd.addtotoclist"></a><a href="#cmd.addtotoclist">\addtotoclist</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.addtotoclist">398</a></li>
- <li><a name="cmd.addxcontentsline"></a><a href="#cmd.addxcontentsline">\addxcontentsline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.addxcontentsline">402</a></li>
- <li><a name="cmd.addxcontentslinetoeachtocfile"></a><a href="#cmd.addxcontentslinetoeachtocfile">\addxcontentslinetoeachtocfile</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.addxcontentslinetoeachtocfile">403</a></li>
+ <li><a name="cmd.addtoreffields"></a><a href="#cmd.addtoreffields">\addtoreffields</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.addtoreffields">537</a></li>
+ <li><a name="cmd.addtotoclist"></a><a href="#cmd.addtotoclist">\addtotoclist</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.addtotoclist">397</a></li>
+ <li><a name="cmd.addxcontentsline"></a><a href="#cmd.addxcontentsline">\addxcontentsline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.addxcontentsline">401</a></li>
+ <li><a name="cmd.addxcontentslinetoeachtocfile"></a><a href="#cmd.addxcontentslinetoeachtocfile">\addxcontentslinetoeachtocfile</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.addxcontentslinetoeachtocfile">402</a></li>
<li><a name="cmd.adrchar"></a><a href="#cmd.adrchar">\adrchar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.adrchar">262</a>, <a href="scrguide.pdf#desc:scraddr.cmd.adrchar">300</a></li>
<li><a name="cmd.adrentry"></a><a href="#cmd.adrentry">\adrentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.adrentry">259</a>, <a href="scrguide.pdf#desc:scraddr.cmd.adrentry">300</a></li>
- <li><a name="cmd.aliaskomafont"></a><a href="#cmd.aliaskomafont">\aliaskomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.aliaskomafont">510</a></li>
+ <li><a name="cmd.aliaskomafont"></a><a href="#cmd.aliaskomafont">\aliaskomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.aliaskomafont">509</a></li>
<li><a name="cmd.and"></a><a href="#cmd.and">\and</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.and">313</a>, <a href="scrguide.pdf#desc:maincls.cmd.and">70</a></li>
<li><a name="cmd.appendix"></a><a href="#cmd.appendix">\appendix</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.appendix">156</a></li>
- <li><a name="cmd.appendixmore"></a><a href="#cmd.appendixmore">\appendixmore</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.appendixmore">535</a></li>
- <li><a name="cmd.areaset"></a><a href="#cmd.areaset">\areaset</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea.cmd.areaset">47</a>, <a href="scrguide.pdf#desc:typearea-experts.cmd.areaset">504</a></li>
+ <li><a name="cmd.appendixmore"></a><a href="#cmd.appendixmore">\appendixmore</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.appendixmore">534</a></li>
+ <li><a name="cmd.areaset"></a><a href="#cmd.areaset">\areaset</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea.cmd.areaset">47</a>, <a href="scrguide.pdf#desc:typearea-experts.cmd.areaset">503</a></li>
<li><a name="cmd.author"></a><a href="#cmd.author">\author</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.author">313</a>, <a href="scrguide.pdf#desc:maincls.cmd.author">70</a></li>
<li><a name="cmd.autodot"></a><a href="#cmd.autodot">\autodot</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.autodot">116</a></li>
- <li><a name="cmd.automark*"></a><a href="#cmd.automark*">\automark*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.automark*">281</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.automark*">471</a></li>
- <li><a name="cmd.automark"></a><a href="#cmd.automark">\automark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.automark">281</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.automark">471</a></li>
+ <li><a name="cmd.automark*"></a><a href="#cmd.automark*">\automark*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.automark*">281</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.automark*">470</a></li>
+ <li><a name="cmd.automark"></a><a href="#cmd.automark">\automark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.automark">281</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.automark">470</a></li>
<li><a name="cmd.backmatter"></a><a href="#cmd.backmatter">\backmatter</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.backmatter">99</a></li>
- <li><a name="cmd.bankname"></a><a href="#cmd.bankname">\bankname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.bankname">545</a></li>
- <li><a name="cmd.bib@beginhook"></a><a href="#cmd.bib@beginhook">\bib@beginhook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.bib@beginhook">536</a></li>
- <li><a name="cmd.bib@endhook"></a><a href="#cmd.bib@endhook">\bib@endhook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.bib@endhook">536</a></li>
+ <li><a name="cmd.bankname"></a><a href="#cmd.bankname">\bankname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.bankname">544</a></li>
+ <li><a name="cmd.bib@beginhook"></a><a href="#cmd.bib@beginhook">\bib@beginhook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.bib@beginhook">535</a></li>
+ <li><a name="cmd.bib@endhook"></a><a href="#cmd.bib@endhook">\bib@endhook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.bib@endhook">535</a></li>
<li><a name="cmd.caption"></a><a href="#cmd.caption">\caption</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.caption">139</a></li>
<li><a name="cmd.captionabove"></a><a href="#cmd.captionabove">\captionabove</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.captionabove">139</a></li>
<li><a name="cmd.captionaboveof"></a><a href="#cmd.captionaboveof">\captionaboveof</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.captionaboveof">140</a></li>
@@ -420,36 +418,36 @@
<li><a name="cmd.captionbelowof"></a><a href="#cmd.captionbelowof">\captionbelowof</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.captionbelowof">140</a></li>
<li><a name="cmd.captionformat"></a><a href="#cmd.captionformat">\captionformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.captionformat">146</a></li>
<li><a name="cmd.captionof"></a><a href="#cmd.captionof">\captionof</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.captionof">140</a></li>
- <li><a name="cmd.captionsUKenglish"></a><a href="#cmd.captionsUKenglish">\captionsUKenglish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsUKenglish">546</a></li>
- <li><a name="cmd.captionsUSenglish"></a><a href="#cmd.captionsUSenglish">\captionsUSenglish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsUSenglish">546</a></li>
- <li><a name="cmd.captionsacadian"></a><a href="#cmd.captionsacadian">\captionsacadian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsacadian">546</a></li>
- <li><a name="cmd.captionsamerican"></a><a href="#cmd.captionsamerican">\captionsamerican</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsamerican">546</a></li>
- <li><a name="cmd.captionsaustralien"></a><a href="#cmd.captionsaustralien">\captionsaustralien</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsaustralien">546</a></li>
- <li><a name="cmd.captionsaustrian"></a><a href="#cmd.captionsaustrian">\captionsaustrian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsaustrian">546</a></li>
- <li><a name="cmd.captionsbritish"></a><a href="#cmd.captionsbritish">\captionsbritish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsbritish">546</a></li>
- <li><a name="cmd.captionscanadian"></a><a href="#cmd.captionscanadian">\captionscanadian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionscanadian">546</a></li>
- <li><a name="cmd.captionscanadien"></a><a href="#cmd.captionscanadien">\captionscanadien</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionscanadien">546</a></li>
- <li><a name="cmd.captionscroatian"></a><a href="#cmd.captionscroatian">\captionscroatian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionscroatian">546</a></li>
- <li><a name="cmd.captionsczech"></a><a href="#cmd.captionsczech">\captionsczech</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsczech">546</a></li>
- <li><a name="cmd.captionsdutch"></a><a href="#cmd.captionsdutch">\captionsdutch</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsdutch">546</a></li>
- <li><a name="cmd.captionsenglish"></a><a href="#cmd.captionsenglish">\captionsenglish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsenglish">546</a></li>
- <li><a name="cmd.captionsfinnish"></a><a href="#cmd.captionsfinnish">\captionsfinnish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsfinnish">546</a></li>
- <li><a name="cmd.captionsfrancais"></a><a href="#cmd.captionsfrancais">\captionsfrancais</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsfrancais">546</a></li>
- <li><a name="cmd.captionsfrench"></a><a href="#cmd.captionsfrench">\captionsfrench</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsfrench">546</a></li>
- <li><a name="cmd.captionsgerman"></a><a href="#cmd.captionsgerman">\captionsgerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsgerman">546</a></li>
- <li><a name="cmd.captionsitalian"></a><a href="#cmd.captionsitalian">\captionsitalian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsitalian">546</a></li>
- <li><a name="cmd.captionsnaustrian"></a><a href="#cmd.captionsnaustrian">\captionsnaustrian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsnaustrian">546</a></li>
- <li><a name="cmd.captionsnewzealand"></a><a href="#cmd.captionsnewzealand">\captionsnewzealand</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsnewzealand">546</a></li>
- <li><a name="cmd.captionsngerman"></a><a href="#cmd.captionsngerman">\captionsngerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsngerman">546</a></li>
- <li><a name="cmd.captionsnorsk"></a><a href="#cmd.captionsnorsk">\captionsnorsk</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsnorsk">546</a></li>
- <li><a name="cmd.captionsnswissgerman"></a><a href="#cmd.captionsnswissgerman">\captionsnswissgerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsnswissgerman">546</a></li>
- <li><a name="cmd.captionspolish"></a><a href="#cmd.captionspolish">\captionspolish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionspolish">546</a></li>
- <li><a name="cmd.captionsslovak"></a><a href="#cmd.captionsslovak">\captionsslovak</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsslovak">546</a></li>
- <li><a name="cmd.captionsspanish"></a><a href="#cmd.captionsspanish">\captionsspanish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsspanish">546</a></li>
- <li><a name="cmd.captionsswedish"></a><a href="#cmd.captionsswedish">\captionsswedish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsswedish">546</a></li>
- <li><a name="cmd.captionsswissgerman"></a><a href="#cmd.captionsswissgerman">\captionsswissgerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsswissgerman">546</a></li>
+ <li><a name="cmd.captionsUKenglish"></a><a href="#cmd.captionsUKenglish">\captionsUKenglish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsUKenglish">545</a></li>
+ <li><a name="cmd.captionsUSenglish"></a><a href="#cmd.captionsUSenglish">\captionsUSenglish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsUSenglish">545</a></li>
+ <li><a name="cmd.captionsacadian"></a><a href="#cmd.captionsacadian">\captionsacadian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsacadian">545</a></li>
+ <li><a name="cmd.captionsamerican"></a><a href="#cmd.captionsamerican">\captionsamerican</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsamerican">545</a></li>
+ <li><a name="cmd.captionsaustralien"></a><a href="#cmd.captionsaustralien">\captionsaustralien</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsaustralien">545</a></li>
+ <li><a name="cmd.captionsaustrian"></a><a href="#cmd.captionsaustrian">\captionsaustrian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsaustrian">545</a></li>
+ <li><a name="cmd.captionsbritish"></a><a href="#cmd.captionsbritish">\captionsbritish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsbritish">545</a></li>
+ <li><a name="cmd.captionscanadian"></a><a href="#cmd.captionscanadian">\captionscanadian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionscanadian">545</a></li>
+ <li><a name="cmd.captionscanadien"></a><a href="#cmd.captionscanadien">\captionscanadien</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionscanadien">545</a></li>
+ <li><a name="cmd.captionscroatian"></a><a href="#cmd.captionscroatian">\captionscroatian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionscroatian">545</a></li>
+ <li><a name="cmd.captionsczech"></a><a href="#cmd.captionsczech">\captionsczech</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsczech">545</a></li>
+ <li><a name="cmd.captionsdutch"></a><a href="#cmd.captionsdutch">\captionsdutch</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsdutch">545</a></li>
+ <li><a name="cmd.captionsenglish"></a><a href="#cmd.captionsenglish">\captionsenglish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsenglish">545</a></li>
+ <li><a name="cmd.captionsfinnish"></a><a href="#cmd.captionsfinnish">\captionsfinnish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsfinnish">545</a></li>
+ <li><a name="cmd.captionsfrancais"></a><a href="#cmd.captionsfrancais">\captionsfrancais</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsfrancais">545</a></li>
+ <li><a name="cmd.captionsfrench"></a><a href="#cmd.captionsfrench">\captionsfrench</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsfrench">545</a></li>
+ <li><a name="cmd.captionsgerman"></a><a href="#cmd.captionsgerman">\captionsgerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsgerman">545</a></li>
+ <li><a name="cmd.captionsitalian"></a><a href="#cmd.captionsitalian">\captionsitalian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsitalian">545</a></li>
+ <li><a name="cmd.captionsnaustrian"></a><a href="#cmd.captionsnaustrian">\captionsnaustrian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsnaustrian">545</a></li>
+ <li><a name="cmd.captionsnewzealand"></a><a href="#cmd.captionsnewzealand">\captionsnewzealand</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsnewzealand">545</a></li>
+ <li><a name="cmd.captionsngerman"></a><a href="#cmd.captionsngerman">\captionsngerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsngerman">545</a></li>
+ <li><a name="cmd.captionsnorsk"></a><a href="#cmd.captionsnorsk">\captionsnorsk</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsnorsk">545</a></li>
+ <li><a name="cmd.captionsnswissgerman"></a><a href="#cmd.captionsnswissgerman">\captionsnswissgerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsnswissgerman">545</a></li>
+ <li><a name="cmd.captionspolish"></a><a href="#cmd.captionspolish">\captionspolish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionspolish">545</a></li>
+ <li><a name="cmd.captionsslovak"></a><a href="#cmd.captionsslovak">\captionsslovak</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsslovak">545</a></li>
+ <li><a name="cmd.captionsspanish"></a><a href="#cmd.captionsspanish">\captionsspanish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsspanish">545</a></li>
+ <li><a name="cmd.captionsswedish"></a><a href="#cmd.captionsswedish">\captionsswedish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsswedish">545</a></li>
+ <li><a name="cmd.captionsswissgerman"></a><a href="#cmd.captionsswissgerman">\captionsswissgerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.captionsswissgerman">545</a></li>
<li><a name="cmd.cc"></a><a href="#cmd.cc">\cc</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.cc">185</a></li>
- <li><a name="cmd.ccname"></a><a href="#cmd.ccname">\ccname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.ccname">545</a></li>
+ <li><a name="cmd.ccname"></a><a href="#cmd.ccname">\ccname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.ccname">544</a></li>
<li><a name="cmd.cefoot*"></a><a href="#cmd.cefoot*">\cefoot*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.cefoot*">277</a></li>
<li><a name="cmd.cefoot"></a><a href="#cmd.cefoot">\cefoot</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.cefoot">274</a></li>
<li><a name="cmd.cehead*"></a><a href="#cmd.cehead*">\cehead*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.cehead*">273</a></li>
@@ -461,13 +459,13 @@
<li><a name="cmd.chapter*"></a><a href="#cmd.chapter*">\chapter*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.chapter*">111</a></li>
<li><a name="cmd.chapter"></a><a href="#cmd.chapter">\chapter</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.chapter">106</a></li>
<li><a name="cmd.chapterformat"></a><a href="#cmd.chapterformat">\chapterformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.chapterformat">116</a></li>
- <li><a name="cmd.chapterheadendvskip"></a><a href="#cmd.chapterheadendvskip">\chapterheadendvskip</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.chapterheadendvskip">525</a></li>
- <li><a name="cmd.chapterheadmidvskip"></a><a href="#cmd.chapterheadmidvskip">\chapterheadmidvskip</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.chapterheadmidvskip">525</a></li>
- <li><a name="cmd.chapterheadstartvskip"></a><a href="#cmd.chapterheadstartvskip">\chapterheadstartvskip</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.chapterheadstartvskip">525</a></li>
- <li><a name="cmd.chapterlinesformat"></a><a href="#cmd.chapterlinesformat">\chapterlinesformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.chapterlinesformat">528</a></li>
- <li><a name="cmd.chapterlineswithprefixformat"></a><a href="#cmd.chapterlineswithprefixformat">\chapterlineswithprefixformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.chapterlineswithprefixformat">528</a></li>
- <li><a name="cmd.chaptermark"></a><a href="#cmd.chaptermark">\chaptermark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.chaptermark">118</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.chaptermark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.chaptermark">474</a></li>
- <li><a name="cmd.chaptermarkformat"></a><a href="#cmd.chaptermarkformat">\chaptermarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.chaptermarkformat">118</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.chaptermarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.chaptermarkformat">474</a></li>
+ <li><a name="cmd.chapterheadendvskip"></a><a href="#cmd.chapterheadendvskip">\chapterheadendvskip</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.chapterheadendvskip">524</a></li>
+ <li><a name="cmd.chapterheadmidvskip"></a><a href="#cmd.chapterheadmidvskip">\chapterheadmidvskip</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.chapterheadmidvskip">524</a></li>
+ <li><a name="cmd.chapterheadstartvskip"></a><a href="#cmd.chapterheadstartvskip">\chapterheadstartvskip</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.chapterheadstartvskip">524</a></li>
+ <li><a name="cmd.chapterlinesformat"></a><a href="#cmd.chapterlinesformat">\chapterlinesformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.chapterlinesformat">527</a></li>
+ <li><a name="cmd.chapterlineswithprefixformat"></a><a href="#cmd.chapterlineswithprefixformat">\chapterlineswithprefixformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.chapterlineswithprefixformat">527</a></li>
+ <li><a name="cmd.chaptermark"></a><a href="#cmd.chaptermark">\chaptermark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.chaptermark">118</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.chaptermark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.chaptermark">473</a></li>
+ <li><a name="cmd.chaptermarkformat"></a><a href="#cmd.chaptermarkformat">\chaptermarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.chaptermarkformat">118</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.chaptermarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.chaptermarkformat">473</a></li>
<li><a name="cmd.chapternumdepth"></a><a href="#cmd.chapternumdepth">\chapternumdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.chapternumdepth">120</a></li>
<li><a name="cmd.chapterpagestyle"></a><a href="#cmd.chapterpagestyle">\chapterpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.chapterpagestyle">87</a></li>
<li><a name="cmd.chead*"></a><a href="#cmd.chead*">\chead*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.chead*">279</a></li>
@@ -487,12 +485,12 @@
<li><a name="cmd.cleardoublepageusingstyle"></a><a href="#cmd.cleardoublepageusingstyle">\cleardoublepageusingstyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.cleardoublepageusingstyle">243</a>, <a href="scrguide.pdf#desc:scrextend.cmd.cleardoublepageusingstyle">317</a>, <a href="scrguide.pdf#desc:maincls.cmd.cleardoublepageusingstyle">92</a></li>
<li><a name="cmd.cleardoubleplainpage"></a><a href="#cmd.cleardoubleplainpage">\cleardoubleplainpage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.cleardoubleplainpage">243</a>, <a href="scrguide.pdf#desc:scrextend.cmd.cleardoubleplainpage">317</a>, <a href="scrguide.pdf#desc:maincls.cmd.cleardoubleplainpage">92</a></li>
<li><a name="cmd.cleardoublestandardpage"></a><a href="#cmd.cleardoublestandardpage">\cleardoublestandardpage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.cleardoublestandardpage">243</a>, <a href="scrguide.pdf#desc:scrextend.cmd.cleardoublestandardpage">317</a>, <a href="scrguide.pdf#desc:maincls.cmd.cleardoublestandardpage">92</a></li>
- <li><a name="cmd.clearmainofpairofpagestyles"></a><a href="#cmd.clearmainofpairofpagestyles">\clearmainofpairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.clearmainofpairofpagestyles">482</a></li>
- <li><a name="cmd.clearnotecolumn"></a><a href="#cmd.clearnotecolumn">\clearnotecolumn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.clearnotecolumn">500</a></li>
- <li><a name="cmd.clearnotecolumns"></a><a href="#cmd.clearnotecolumns">\clearnotecolumns</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.clearnotecolumns">501</a></li>
+ <li><a name="cmd.clearmainofpairofpagestyles"></a><a href="#cmd.clearmainofpairofpagestyles">\clearmainofpairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.clearmainofpairofpagestyles">481</a></li>
+ <li><a name="cmd.clearnotecolumn"></a><a href="#cmd.clearnotecolumn">\clearnotecolumn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.clearnotecolumn">499</a></li>
+ <li><a name="cmd.clearnotecolumns"></a><a href="#cmd.clearnotecolumns">\clearnotecolumns</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.clearnotecolumns">500</a></li>
<li><a name="cmd.clearpage"></a><a href="#cmd.clearpage">\clearpage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.clearpage">243</a>, <a href="scrguide.pdf#desc:scrextend.cmd.clearpage">317</a>, <a href="scrguide.pdf#desc:maincls.cmd.clearpage">92</a></li>
- <li><a name="cmd.clearpairofpagestyles"></a><a href="#cmd.clearpairofpagestyles">\clearpairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.clearpairofpagestyles">482</a></li>
- <li><a name="cmd.clearplainofpairofpagestyles"></a><a href="#cmd.clearplainofpairofpagestyles">\clearplainofpairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.clearplainofpairofpagestyles">482</a></li>
+ <li><a name="cmd.clearpairofpagestyles"></a><a href="#cmd.clearpairofpagestyles">\clearpairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.clearpairofpagestyles">481</a></li>
+ <li><a name="cmd.clearplainofpairofpagestyles"></a><a href="#cmd.clearplainofpairofpagestyles">\clearplainofpairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.clearplainofpairofpagestyles">481</a></li>
<li><a name="cmd.closing"></a><a href="#cmd.closing">\closing</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.closing">183</a></li>
<li><a name="cmd.cofoot*"></a><a href="#cmd.cofoot*">\cofoot*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.cofoot*">277</a></li>
<li><a name="cmd.cofoot"></a><a href="#cmd.cofoot">\cofoot</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.cofoot">274</a></li>
@@ -502,83 +500,83 @@
<li><a name="cmd.coverpageleftmargin"></a><a href="#cmd.coverpageleftmargin">\coverpageleftmargin</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.coverpageleftmargin">311</a>, <a href="scrguide.pdf#desc:maincls.cmd.coverpageleftmargin">67</a></li>
<li><a name="cmd.coverpagerightmargin"></a><a href="#cmd.coverpagerightmargin">\coverpagerightmargin</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.coverpagerightmargin">311</a>, <a href="scrguide.pdf#desc:maincls.cmd.coverpagerightmargin">67</a></li>
<li><a name="cmd.coverpagetopmargin"></a><a href="#cmd.coverpagetopmargin">\coverpagetopmargin</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.coverpagetopmargin">311</a>, <a href="scrguide.pdf#desc:maincls.cmd.coverpagetopmargin">67</a></li>
- <li><a name="cmd.currentpagestyle"></a><a href="#cmd.currentpagestyle">\currentpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.currentpagestyle">460</a></li>
- <li><a name="cmd.customername"></a><a href="#cmd.customername">\customername</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.customername">545</a></li>
+ <li><a name="cmd.currentpagestyle"></a><a href="#cmd.currentpagestyle">\currentpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.currentpagestyle">459</a></li>
+ <li><a name="cmd.customername"></a><a href="#cmd.customername">\customername</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.customername">544</a></li>
<li><a name="cmd.date"></a><a href="#cmd.date">\date</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.date">313</a>, <a href="scrguide.pdf#desc:maincls.cmd.date">70</a></li>
- <li><a name="cmd.dateUKenglish"></a><a href="#cmd.dateUKenglish">\dateUKenglish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateUKenglish">547</a></li>
- <li><a name="cmd.dateUSenglish"></a><a href="#cmd.dateUSenglish">\dateUSenglish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateUSenglish">547</a></li>
- <li><a name="cmd.dateacadian"></a><a href="#cmd.dateacadian">\dateacadian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateacadian">547</a></li>
- <li><a name="cmd.dateamerican"></a><a href="#cmd.dateamerican">\dateamerican</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateamerican">547</a></li>
- <li><a name="cmd.dateaustralien"></a><a href="#cmd.dateaustralien">\dateaustralien</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateaustralien">547</a></li>
- <li><a name="cmd.dateaustrian"></a><a href="#cmd.dateaustrian">\dateaustrian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateaustrian">547</a></li>
- <li><a name="cmd.datebritish"></a><a href="#cmd.datebritish">\datebritish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datebritish">547</a></li>
- <li><a name="cmd.datecanadian"></a><a href="#cmd.datecanadian">\datecanadian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datecanadian">547</a></li>
- <li><a name="cmd.datecanadien"></a><a href="#cmd.datecanadien">\datecanadien</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datecanadien">547</a></li>
- <li><a name="cmd.datecroatian"></a><a href="#cmd.datecroatian">\datecroatian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datecroatian">547</a></li>
- <li><a name="cmd.dateczech"></a><a href="#cmd.dateczech">\dateczech</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateczech">547</a></li>
- <li><a name="cmd.datedutch"></a><a href="#cmd.datedutch">\datedutch</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datedutch">547</a></li>
- <li><a name="cmd.dateenglish"></a><a href="#cmd.dateenglish">\dateenglish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateenglish">547</a></li>
- <li><a name="cmd.datefinnish"></a><a href="#cmd.datefinnish">\datefinnish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datefinnish">547</a></li>
- <li><a name="cmd.datefrancais"></a><a href="#cmd.datefrancais">\datefrancais</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datefrancais">547</a></li>
- <li><a name="cmd.datefrench"></a><a href="#cmd.datefrench">\datefrench</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datefrench">547</a></li>
- <li><a name="cmd.dategerman"></a><a href="#cmd.dategerman">\dategerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dategerman">547</a></li>
- <li><a name="cmd.dateitalian"></a><a href="#cmd.dateitalian">\dateitalian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateitalian">547</a></li>
- <li><a name="cmd.datename"></a><a href="#cmd.datename">\datename</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datename">545</a></li>
- <li><a name="cmd.datenaustrian"></a><a href="#cmd.datenaustrian">\datenaustrian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datenaustrian">547</a></li>
- <li><a name="cmd.datenewzealand"></a><a href="#cmd.datenewzealand">\datenewzealand</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datenewzealand">547</a></li>
- <li><a name="cmd.datengerman"></a><a href="#cmd.datengerman">\datengerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datengerman">547</a></li>
- <li><a name="cmd.datenorsk"></a><a href="#cmd.datenorsk">\datenorsk</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datenorsk">547</a></li>
- <li><a name="cmd.datenswissgerman"></a><a href="#cmd.datenswissgerman">\datenswissgerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datenswissgerman">547</a></li>
- <li><a name="cmd.datepolish"></a><a href="#cmd.datepolish">\datepolish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datepolish">547</a></li>
- <li><a name="cmd.dateslovak"></a><a href="#cmd.dateslovak">\dateslovak</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateslovak">547</a></li>
- <li><a name="cmd.datespanish"></a><a href="#cmd.datespanish">\datespanish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datespanish">547</a></li>
- <li><a name="cmd.dateswedish"></a><a href="#cmd.dateswedish">\dateswedish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateswedish">547</a></li>
- <li><a name="cmd.dateswissgerman"></a><a href="#cmd.dateswissgerman">\dateswissgerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateswissgerman">547</a></li>
+ <li><a name="cmd.dateUKenglish"></a><a href="#cmd.dateUKenglish">\dateUKenglish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateUKenglish">546</a></li>
+ <li><a name="cmd.dateUSenglish"></a><a href="#cmd.dateUSenglish">\dateUSenglish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateUSenglish">546</a></li>
+ <li><a name="cmd.dateacadian"></a><a href="#cmd.dateacadian">\dateacadian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateacadian">546</a></li>
+ <li><a name="cmd.dateamerican"></a><a href="#cmd.dateamerican">\dateamerican</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateamerican">546</a></li>
+ <li><a name="cmd.dateaustralien"></a><a href="#cmd.dateaustralien">\dateaustralien</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateaustralien">546</a></li>
+ <li><a name="cmd.dateaustrian"></a><a href="#cmd.dateaustrian">\dateaustrian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateaustrian">546</a></li>
+ <li><a name="cmd.datebritish"></a><a href="#cmd.datebritish">\datebritish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datebritish">546</a></li>
+ <li><a name="cmd.datecanadian"></a><a href="#cmd.datecanadian">\datecanadian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datecanadian">546</a></li>
+ <li><a name="cmd.datecanadien"></a><a href="#cmd.datecanadien">\datecanadien</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datecanadien">546</a></li>
+ <li><a name="cmd.datecroatian"></a><a href="#cmd.datecroatian">\datecroatian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datecroatian">546</a></li>
+ <li><a name="cmd.dateczech"></a><a href="#cmd.dateczech">\dateczech</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateczech">546</a></li>
+ <li><a name="cmd.datedutch"></a><a href="#cmd.datedutch">\datedutch</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datedutch">546</a></li>
+ <li><a name="cmd.dateenglish"></a><a href="#cmd.dateenglish">\dateenglish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateenglish">546</a></li>
+ <li><a name="cmd.datefinnish"></a><a href="#cmd.datefinnish">\datefinnish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datefinnish">546</a></li>
+ <li><a name="cmd.datefrancais"></a><a href="#cmd.datefrancais">\datefrancais</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datefrancais">546</a></li>
+ <li><a name="cmd.datefrench"></a><a href="#cmd.datefrench">\datefrench</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datefrench">546</a></li>
+ <li><a name="cmd.dategerman"></a><a href="#cmd.dategerman">\dategerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dategerman">546</a></li>
+ <li><a name="cmd.dateitalian"></a><a href="#cmd.dateitalian">\dateitalian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateitalian">546</a></li>
+ <li><a name="cmd.datename"></a><a href="#cmd.datename">\datename</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datename">544</a></li>
+ <li><a name="cmd.datenaustrian"></a><a href="#cmd.datenaustrian">\datenaustrian</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datenaustrian">546</a></li>
+ <li><a name="cmd.datenewzealand"></a><a href="#cmd.datenewzealand">\datenewzealand</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datenewzealand">546</a></li>
+ <li><a name="cmd.datengerman"></a><a href="#cmd.datengerman">\datengerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datengerman">546</a></li>
+ <li><a name="cmd.datenorsk"></a><a href="#cmd.datenorsk">\datenorsk</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datenorsk">546</a></li>
+ <li><a name="cmd.datenswissgerman"></a><a href="#cmd.datenswissgerman">\datenswissgerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datenswissgerman">546</a></li>
+ <li><a name="cmd.datepolish"></a><a href="#cmd.datepolish">\datepolish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datepolish">546</a></li>
+ <li><a name="cmd.dateslovak"></a><a href="#cmd.dateslovak">\dateslovak</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateslovak">546</a></li>
+ <li><a name="cmd.datespanish"></a><a href="#cmd.datespanish">\datespanish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.datespanish">546</a></li>
+ <li><a name="cmd.dateswedish"></a><a href="#cmd.dateswedish">\dateswedish</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateswedish">546</a></li>
+ <li><a name="cmd.dateswissgerman"></a><a href="#cmd.dateswissgerman">\dateswissgerman</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.dateswissgerman">546</a></li>
<li><a name="cmd.dedication"></a><a href="#cmd.dedication">\dedication</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.dedication">315</a>, <a href="scrguide.pdf#desc:maincls.cmd.dedication">73</a></li>
- <li><a name="cmd.defaultreffields"></a><a href="#cmd.defaultreffields">\defaultreffields</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.defaultreffields">538</a></li>
+ <li><a name="cmd.defaultreffields"></a><a href="#cmd.defaultreffields">\defaultreffields</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.defaultreffields">537</a></li>
<li><a name="cmd.defcaptionname*"></a><a href="#cmd.defcaptionname*">\defcaptionname*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.defcaptionname*">371</a></li>
<li><a name="cmd.defcaptionname"></a><a href="#cmd.defcaptionname">\defcaptionname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.defcaptionname">371</a></li>
<li><a name="cmd.deffootnote"></a><a href="#cmd.deffootnote">\deffootnote</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.deffootnote">246</a>, <a href="scrguide.pdf#desc:scrextend.cmd.deffootnote">320</a>, <a href="scrguide.pdf#desc:maincls.cmd.deffootnote">96</a></li>
<li><a name="cmd.deffootnotemark"></a><a href="#cmd.deffootnotemark">\deffootnotemark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.deffootnotemark">246</a>, <a href="scrguide.pdf#desc:scrextend.cmd.deffootnotemark">320</a>, <a href="scrguide.pdf#desc:maincls.cmd.deffootnotemark">96</a></li>
- <li><a name="cmd.defpagestyle"></a><a href="#cmd.defpagestyle">\defpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.defpagestyle">483</a></li>
- <li><a name="cmd.defpairofpagestyles"></a><a href="#cmd.defpairofpagestyles">\defpairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.defpairofpagestyles">481</a></li>
- <li><a name="cmd.deftocheading"></a><a href="#cmd.deftocheading">\deftocheading</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.deftocheading">406</a></li>
+ <li><a name="cmd.defpagestyle"></a><a href="#cmd.defpagestyle">\defpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.defpagestyle">482</a></li>
+ <li><a name="cmd.defpairofpagestyles"></a><a href="#cmd.defpairofpagestyles">\defpairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.defpairofpagestyles">480</a></li>
+ <li><a name="cmd.deftocheading"></a><a href="#cmd.deftocheading">\deftocheading</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.deftocheading">405</a></li>
<li><a name="cmd.dictum"></a><a href="#cmd.dictum">\dictum</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.dictum">123</a>, <a href="scrguide.pdf#desc:scrextend.cmd.dictum">321</a></li>
<li><a name="cmd.dictumauthorformat"></a><a href="#cmd.dictumauthorformat">\dictumauthorformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.dictumauthorformat">123</a>, <a href="scrguide.pdf#desc:scrextend.cmd.dictumauthorformat">321</a></li>
<li><a name="cmd.dictumrule"></a><a href="#cmd.dictumrule">\dictumrule</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.dictumrule">123</a>, <a href="scrguide.pdf#desc:scrextend.cmd.dictumrule">321</a></li>
<li><a name="cmd.dictumwidth"></a><a href="#cmd.dictumwidth">\dictumwidth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.dictumwidth">123</a>, <a href="scrguide.pdf#desc:scrextend.cmd.dictumwidth">321</a></li>
- <li><a name="cmd.documentclass"></a><a href="#cmd.documentclass">\documentclass</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.documentclass">162</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.documentclass">264</a>, <a href="scrguide.pdf#desc:scrextend.cmd.documentclass">306</a>, <a href="scrguide.pdf#desc:typearea.cmd.documentclass">32</a>, <a href="scrguide.pdf#desc:scrjura.cmd.documentclass">325</a>, <a href="scrguide.pdf#desc:scrhack.cmd.documentclass">438</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.documentclass">444</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.documentclass">488</a>, <a href="scrguide.pdf#desc:maincls.cmd.documentclass">56</a></li>
- <li><a name="cmd.doforeachtocfile"></a><a href="#cmd.doforeachtocfile">\doforeachtocfile</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.doforeachtocfile">400</a></li>
+ <li><a name="cmd.documentclass"></a><a href="#cmd.documentclass">\documentclass</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.documentclass">162</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.documentclass">264</a>, <a href="scrguide.pdf#desc:scrextend.cmd.documentclass">306</a>, <a href="scrguide.pdf#desc:typearea.cmd.documentclass">32</a>, <a href="scrguide.pdf#desc:scrjura.cmd.documentclass">325</a>, <a href="scrguide.pdf#desc:scrhack.cmd.documentclass">437</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.documentclass">443</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.documentclass">487</a>, <a href="scrguide.pdf#desc:maincls.cmd.documentclass">56</a></li>
+ <li><a name="cmd.doforeachtocfile"></a><a href="#cmd.doforeachtocfile">\doforeachtocfile</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.doforeachtocfile">399</a></li>
<li><a name="cmd.ellipsispar"></a><a href="#cmd.ellipsispar">\ellipsispar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.cmd.ellipsispar">335</a></li>
- <li><a name="cmd.emailname"></a><a href="#cmd.emailname">\emailname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.emailname">545</a></li>
+ <li><a name="cmd.emailname"></a><a href="#cmd.emailname">\emailname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.emailname">544</a></li>
<li><a name="cmd.encl"></a><a href="#cmd.encl">\encl</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.encl">187</a></li>
- <li><a name="cmd.enclname"></a><a href="#cmd.enclname">\enclname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.enclname">545</a></li>
+ <li><a name="cmd.enclname"></a><a href="#cmd.enclname">\enclname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.enclname">544</a></li>
<li><a name="cmd.extratitle"></a><a href="#cmd.extratitle">\extratitle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.extratitle">313</a>, <a href="scrguide.pdf#desc:maincls.cmd.extratitle">69</a></li>
- <li><a name="cmd.faxname"></a><a href="#cmd.faxname">\faxname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.faxname">545</a></li>
+ <li><a name="cmd.faxname"></a><a href="#cmd.faxname">\faxname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.faxname">544</a></li>
<li><a name="cmd.figureformat"></a><a href="#cmd.figureformat">\figureformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.figureformat">146</a></li>
<li><a name="cmd.flushbottom"></a><a href="#cmd.flushbottom">\flushbottom</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.flushbottom">59</a></li>
<li><a name="cmd.footnote"></a><a href="#cmd.footnote">\footnote</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.footnote">245</a>, <a href="scrguide.pdf#desc:scrextend.cmd.footnote">319</a>, <a href="scrguide.pdf#desc:maincls.cmd.footnote">94</a></li>
<li><a name="cmd.footnotemark"></a><a href="#cmd.footnotemark">\footnotemark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.footnotemark">245</a>, <a href="scrguide.pdf#desc:scrextend.cmd.footnotemark">319</a>, <a href="scrguide.pdf#desc:maincls.cmd.footnotemark">94</a></li>
<li><a name="cmd.footnotetext"></a><a href="#cmd.footnotetext">\footnotetext</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.footnotetext">245</a>, <a href="scrguide.pdf#desc:scrextend.cmd.footnotetext">319</a>, <a href="scrguide.pdf#desc:maincls.cmd.footnotetext">94</a></li>
<li><a name="cmd.footref"></a><a href="#cmd.footref">\footref</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.footref">246</a>, <a href="scrguide.pdf#desc:scrextend.cmd.footref">319</a>, <a href="scrguide.pdf#desc:maincls.cmd.footref">96</a></li>
- <li><a name="cmd.foreachemptykomavar"></a><a href="#cmd.foreachemptykomavar">\foreachemptykomavar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.foreachemptykomavar">540</a></li>
- <li><a name="cmd.foreachkomavar"></a><a href="#cmd.foreachkomavar">\foreachkomavar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.foreachkomavar">540</a></li>
- <li><a name="cmd.foreachkomavarifempty"></a><a href="#cmd.foreachkomavarifempty">\foreachkomavarifempty</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.foreachkomavarifempty">540</a></li>
- <li><a name="cmd.foreachnonemptykomavar"></a><a href="#cmd.foreachnonemptykomavar">\foreachnonemptykomavar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.foreachnonemptykomavar">540</a></li>
+ <li><a name="cmd.foreachemptykomavar"></a><a href="#cmd.foreachemptykomavar">\foreachemptykomavar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.foreachemptykomavar">539</a></li>
+ <li><a name="cmd.foreachkomavar"></a><a href="#cmd.foreachkomavar">\foreachkomavar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.foreachkomavar">539</a></li>
+ <li><a name="cmd.foreachkomavarifempty"></a><a href="#cmd.foreachkomavarifempty">\foreachkomavarifempty</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.foreachkomavarifempty">539</a></li>
+ <li><a name="cmd.foreachnonemptykomavar"></a><a href="#cmd.foreachnonemptykomavar">\foreachnonemptykomavar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.foreachnonemptykomavar">539</a></li>
<li><a name="cmd.frontispiece"></a><a href="#cmd.frontispiece">\frontispiece</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.frontispiece">313</a>, <a href="scrguide.pdf#desc:maincls.cmd.frontispiece">69</a></li>
<li><a name="cmd.frontmatter"></a><a href="#cmd.frontmatter">\frontmatter</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.frontmatter">99</a></li>
- <li><a name="cmd.headfromname"></a><a href="#cmd.headfromname">\headfromname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.headfromname">545</a></li>
- <li><a name="cmd.headmark"></a><a href="#cmd.headmark">\headmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.headmark">285</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.headmark">473</a></li>
- <li><a name="cmd.headtoname"></a><a href="#cmd.headtoname">\headtoname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.headtoname">545</a></li>
+ <li><a name="cmd.headfromname"></a><a href="#cmd.headfromname">\headfromname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.headfromname">544</a></li>
+ <li><a name="cmd.headmark"></a><a href="#cmd.headmark">\headmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.headmark">285</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.headmark">472</a></li>
+ <li><a name="cmd.headtoname"></a><a href="#cmd.headtoname">\headtoname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.headtoname">544</a></li>
<li><a name="cmd.if@atdocument"></a><a href="#cmd.if@atdocument">\if@atdocument</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.if@atdocument">370</a></li>
- <li><a name="cmd.if@chapter"></a><a href="#cmd.if@chapter">\if@chapter</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.if@chapter">446</a></li>
- <li><a name="cmd.if@mainmatter"></a><a href="#cmd.if@mainmatter">\if@mainmatter</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.if@mainmatter">446</a></li>
+ <li><a name="cmd.if@chapter"></a><a href="#cmd.if@chapter">\if@chapter</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.if@chapter">445</a></li>
+ <li><a name="cmd.if@mainmatter"></a><a href="#cmd.if@mainmatter">\if@mainmatter</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.if@mainmatter">445</a></li>
<li><a name="cmd.ifoot*"></a><a href="#cmd.ifoot*">\ifoot*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.ifoot*">279</a></li>
<li><a name="cmd.ifoot"></a><a href="#cmd.ifoot">\ifoot</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.ifoot">278</a></li>
<li><a name="cmd.ihead*"></a><a href="#cmd.ihead*">\ihead*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.ihead*">279</a></li>
<li><a name="cmd.ihead"></a><a href="#cmd.ihead">\ihead</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.ihead">278</a></li>
<li><a name="cmd.indexpagestyle"></a><a href="#cmd.indexpagestyle">\indexpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.indexpagestyle">87</a></li>
- <li><a name="cmd.invoicename"></a><a href="#cmd.invoicename">\invoicename</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.invoicename">545</a></li>
+ <li><a name="cmd.invoicename"></a><a href="#cmd.invoicename">\invoicename</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.invoicename">544</a></li>
<li><a name="cmd.item"></a><a href="#cmd.item">\item</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.item">125</a>, <a href="scrguide.pdf#desc:scrlttr2.cmd.item">248</a></li>
<li><a name="cmd.l@addto@macro"></a><a href="#cmd.l@addto@macro">\l@addto@macro</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.l@addto@macro">375</a></li>
<li><a name="cmd.labelenumi"></a><a href="#cmd.labelenumi">\labelenumi</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.labelenumi">127</a>, <a href="scrguide.pdf#desc:scrlttr2.cmd.labelenumi">249</a></li>
@@ -589,80 +587,80 @@
<li><a name="cmd.labelitemii"></a><a href="#cmd.labelitemii">\labelitemii</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.labelitemii">125</a>, <a href="scrguide.pdf#desc:scrlttr2.cmd.labelitemii">248</a></li>
<li><a name="cmd.labelitemiii"></a><a href="#cmd.labelitemiii">\labelitemiii</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.labelitemiii">125</a>, <a href="scrguide.pdf#desc:scrlttr2.cmd.labelitemiii">248</a></li>
<li><a name="cmd.labelitemiv"></a><a href="#cmd.labelitemiv">\labelitemiv</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.labelitemiv">125</a>, <a href="scrguide.pdf#desc:scrlttr2.cmd.labelitemiv">248</a></li>
- <li><a name="cmd.layercontentsmeasure"></a><a href="#cmd.layercontentsmeasure">\layercontentsmeasure</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layercontentsmeasure">459</a></li>
- <li><a name="cmd.layerhalign"></a><a href="#cmd.layerhalign">\layerhalign</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layerhalign">457</a></li>
- <li><a name="cmd.layerheight"></a><a href="#cmd.layerheight">\layerheight</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layerheight">457</a></li>
- <li><a name="cmd.layervalign"></a><a href="#cmd.layervalign">\layervalign</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layervalign">457</a></li>
- <li><a name="cmd.layerwidth"></a><a href="#cmd.layerwidth">\layerwidth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layerwidth">457</a></li>
- <li><a name="cmd.layerxoffset"></a><a href="#cmd.layerxoffset">\layerxoffset</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layerxoffset">457</a></li>
- <li><a name="cmd.layeryoffset"></a><a href="#cmd.layeryoffset">\layeryoffset</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layeryoffset">457</a></li>
+ <li><a name="cmd.layercontentsmeasure"></a><a href="#cmd.layercontentsmeasure">\layercontentsmeasure</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layercontentsmeasure">458</a></li>
+ <li><a name="cmd.layerhalign"></a><a href="#cmd.layerhalign">\layerhalign</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layerhalign">456</a></li>
+ <li><a name="cmd.layerheight"></a><a href="#cmd.layerheight">\layerheight</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layerheight">456</a></li>
+ <li><a name="cmd.layervalign"></a><a href="#cmd.layervalign">\layervalign</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layervalign">456</a></li>
+ <li><a name="cmd.layerwidth"></a><a href="#cmd.layerwidth">\layerwidth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layerwidth">456</a></li>
+ <li><a name="cmd.layerxoffset"></a><a href="#cmd.layerxoffset">\layerxoffset</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layerxoffset">456</a></li>
+ <li><a name="cmd.layeryoffset"></a><a href="#cmd.layeryoffset">\layeryoffset</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.layeryoffset">456</a></li>
<li><a name="cmd.lefoot*"></a><a href="#cmd.lefoot*">\lefoot*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.lefoot*">277</a></li>
<li><a name="cmd.lefoot"></a><a href="#cmd.lefoot">\lefoot</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.lefoot">274</a></li>
- <li><a name="cmd.leftbotmark"></a><a href="#cmd.leftbotmark">\leftbotmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.leftbotmark">472</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.leftbotmark">477</a></li>
- <li><a name="cmd.leftfirstmark"></a><a href="#cmd.leftfirstmark">\leftfirstmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.leftfirstmark">472</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.leftfirstmark">477</a></li>
- <li><a name="cmd.leftmark"></a><a href="#cmd.leftmark">\leftmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.leftmark">285</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.leftmark">472</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.leftmark">477</a></li>
- <li><a name="cmd.lefttopmark"></a><a href="#cmd.lefttopmark">\lefttopmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.lefttopmark">472</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.lefttopmark">477</a></li>
+ <li><a name="cmd.leftbotmark"></a><a href="#cmd.leftbotmark">\leftbotmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.leftbotmark">471</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.leftbotmark">476</a></li>
+ <li><a name="cmd.leftfirstmark"></a><a href="#cmd.leftfirstmark">\leftfirstmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.leftfirstmark">471</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.leftfirstmark">476</a></li>
+ <li><a name="cmd.leftmark"></a><a href="#cmd.leftmark">\leftmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.leftmark">285</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.leftmark">471</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.leftmark">476</a></li>
+ <li><a name="cmd.lefttopmark"></a><a href="#cmd.lefttopmark">\lefttopmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.lefttopmark">471</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.lefttopmark">476</a></li>
<li><a name="cmd.lehead*"></a><a href="#cmd.lehead*">\lehead*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.lehead*">273</a></li>
<li><a name="cmd.lehead"></a><a href="#cmd.lehead">\lehead</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.lehead">271</a></li>
<li><a name="cmd.letterlastpage"></a><a href="#cmd.letterlastpage">\letterlastpage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.letterlastpage">182</a></li>
<li><a name="cmd.letterpagestyle"></a><a href="#cmd.letterpagestyle">\letterpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.letterpagestyle">238</a></li>
- <li><a name="cmd.listof/Dateierweiterung/name"></a><a href="#cmd.listof/Dateierweiterung/name">\listof/Dateierweiterung/name</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.listof/Dateierweiterung/name">403</a></li>
- <li><a name="cmd.listof/Zielendung/"></a><a href="#cmd.listof/Zielendung/">\listof/Zielendung/</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrwfile.cmd.listof/Zielendung/">395</a></li>
- <li><a name="cmd.listofeachtoc"></a><a href="#cmd.listofeachtoc">\listofeachtoc</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.listofeachtoc">403</a></li>
+ <li><a name="cmd.listof/Dateierweiterung/name"></a><a href="#cmd.listof/Dateierweiterung/name">\listof/Dateierweiterung/name</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.listof/Dateierweiterung/name">402</a></li>
+ <li><a name="cmd.listof/Zielendung/"></a><a href="#cmd.listof/Zielendung/">\listof/Zielendung/</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrwfile.cmd.listof/Zielendung/">394</a></li>
+ <li><a name="cmd.listofeachtoc"></a><a href="#cmd.listofeachtoc">\listofeachtoc</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.listofeachtoc">402</a></li>
<li><a name="cmd.listoffigures"></a><a href="#cmd.listoffigures">\listoffigures</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.listoffigures">154</a></li>
<li><a name="cmd.listoftables"></a><a href="#cmd.listoftables">\listoftables</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.listoftables">154</a></li>
- <li><a name="cmd.listoftoc*"></a><a href="#cmd.listoftoc*">\listoftoc*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.listoftoc*">403</a></li>
- <li><a name="cmd.listoftoc"></a><a href="#cmd.listoftoc">\listoftoc</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.listoftoc">403</a></li>
+ <li><a name="cmd.listoftoc*"></a><a href="#cmd.listoftoc*">\listoftoc*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.listoftoc*">402</a></li>
+ <li><a name="cmd.listoftoc"></a><a href="#cmd.listoftoc">\listoftoc</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.listoftoc">402</a></li>
<li><a name="cmd.lofoot*"></a><a href="#cmd.lofoot*">\lofoot*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.lofoot*">277</a></li>
<li><a name="cmd.lofoot"></a><a href="#cmd.lofoot">\lofoot</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.lofoot">274</a></li>
<li><a name="cmd.lohead*"></a><a href="#cmd.lohead*">\lohead*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.lohead*">273</a></li>
<li><a name="cmd.lohead"></a><a href="#cmd.lohead">\lohead</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.lohead">271</a></li>
<li><a name="cmd.lowertitleback"></a><a href="#cmd.lowertitleback">\lowertitleback</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.lowertitleback">315</a>, <a href="scrguide.pdf#desc:maincls.cmd.lowertitleback">72</a></li>
<li><a name="cmd.mainmatter"></a><a href="#cmd.mainmatter">\mainmatter</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.mainmatter">99</a></li>
- <li><a name="cmd.makenote*"></a><a href="#cmd.makenote*">\makenote*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.makenote*">496</a></li>
- <li><a name="cmd.makenote"></a><a href="#cmd.makenote">\makenote</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.makenote">496</a></li>
+ <li><a name="cmd.makenote*"></a><a href="#cmd.makenote*">\makenote*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.makenote*">495</a></li>
+ <li><a name="cmd.makenote"></a><a href="#cmd.makenote">\makenote</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.makenote">495</a></li>
<li><a name="cmd.maketitle"></a><a href="#cmd.maketitle">\maketitle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.maketitle">312</a>, <a href="scrguide.pdf#desc:maincls.cmd.maketitle">68</a></li>
- <li><a name="cmd.manualmark"></a><a href="#cmd.manualmark">\manualmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.manualmark">281</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.manualmark">471</a></li>
+ <li><a name="cmd.manualmark"></a><a href="#cmd.manualmark">\manualmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.manualmark">281</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.manualmark">470</a></li>
<li><a name="cmd.marginline"></a><a href="#cmd.marginline">\marginline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.marginline">155</a>, <a href="scrguide.pdf#desc:scrlttr2.cmd.marginline">252</a>, <a href="scrguide.pdf#desc:scrextend.cmd.marginline">323</a></li>
<li><a name="cmd.marginpar"></a><a href="#cmd.marginpar">\marginpar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.marginpar">155</a>, <a href="scrguide.pdf#desc:scrlttr2.cmd.marginpar">252</a>, <a href="scrguide.pdf#desc:scrextend.cmd.marginpar">323</a></li>
- <li><a name="cmd.markboth"></a><a href="#cmd.markboth">\markboth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.markboth">242</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.markboth">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.markboth">475</a>, <a href="scrguide.pdf#desc:maincls.cmd.markboth">87</a></li>
- <li><a name="cmd.markdouble"></a><a href="#cmd.markdouble">\markdouble</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.markdouble">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.markdouble">475</a></li>
- <li><a name="cmd.markleft"></a><a href="#cmd.markleft">\markleft</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.markleft">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.markleft">475</a></li>
- <li><a name="cmd.markright"></a><a href="#cmd.markright">\markright</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.markright">242</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.markright">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.markright">475</a>, <a href="scrguide.pdf#desc:maincls.cmd.markright">87</a></li>
+ <li><a name="cmd.markboth"></a><a href="#cmd.markboth">\markboth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.markboth">242</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.markboth">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.markboth">474</a>, <a href="scrguide.pdf#desc:maincls.cmd.markboth">87</a></li>
+ <li><a name="cmd.markdouble"></a><a href="#cmd.markdouble">\markdouble</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.markdouble">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.markdouble">474</a></li>
+ <li><a name="cmd.markleft"></a><a href="#cmd.markleft">\markleft</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.markleft">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.markleft">474</a></li>
+ <li><a name="cmd.markright"></a><a href="#cmd.markright">\markright</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.markright">242</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.markright">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.markright">474</a>, <a href="scrguide.pdf#desc:maincls.cmd.markright">87</a></li>
<li><a name="cmd.minisec"></a><a href="#cmd.minisec">\minisec</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.minisec">113</a></li>
- <li><a name="cmd.mobilephonename"></a><a href="#cmd.mobilephonename">\mobilephonename</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.mobilephonename">545</a></li>
+ <li><a name="cmd.mobilephonename"></a><a href="#cmd.mobilephonename">\mobilephonename</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.mobilephonename">544</a></li>
<li><a name="cmd.multfootsep"></a><a href="#cmd.multfootsep">\multfootsep</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.multfootsep">244</a>, <a href="scrguide.pdf#desc:scrextend.cmd.multfootsep">318</a>, <a href="scrguide.pdf#desc:maincls.cmd.multfootsep">94</a></li>
<li><a name="cmd.multiplefootnoteseparator"></a><a href="#cmd.multiplefootnoteseparator">\multiplefootnoteseparator</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.multiplefootnoteseparator">245</a>, <a href="scrguide.pdf#desc:scrextend.cmd.multiplefootnoteseparator">319</a>, <a href="scrguide.pdf#desc:maincls.cmd.multiplefootnoteseparator">94</a></li>
- <li><a name="cmd.myrefname"></a><a href="#cmd.myrefname">\myrefname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.myrefname">545</a></li>
+ <li><a name="cmd.myrefname"></a><a href="#cmd.myrefname">\myrefname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.myrefname">544</a></li>
<li><a name="cmd.nameday"></a><a href="#cmd.nameday">\nameday</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrdate.cmd.nameday">296</a></li>
- <li><a name="cmd.newbibstyle"></a><a href="#cmd.newbibstyle">\newbibstyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.newbibstyle">536</a></li>
- <li><a name="cmd.newblock"></a><a href="#cmd.newblock">\newblock</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.newblock">536</a></li>
+ <li><a name="cmd.newbibstyle"></a><a href="#cmd.newbibstyle">\newbibstyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.newbibstyle">535</a></li>
+ <li><a name="cmd.newblock"></a><a href="#cmd.newblock">\newblock</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.newblock">535</a></li>
<li><a name="cmd.newcaptionname*"></a><a href="#cmd.newcaptionname*">\newcaptionname*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.newcaptionname*">371</a></li>
<li><a name="cmd.newcaptionname"></a><a href="#cmd.newcaptionname">\newcaptionname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.newcaptionname">371</a></li>
<li><a name="cmd.newdaylanguage"></a><a href="#cmd.newdaylanguage">\newdaylanguage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrdate.cmd.newdaylanguage">296</a></li>
- <li><a name="cmd.newkomafont"></a><a href="#cmd.newkomafont">\newkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.newkomafont">510</a></li>
- <li><a name="cmd.newkomavar*"></a><a href="#cmd.newkomavar*">\newkomavar*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.newkomavar*">538</a></li>
- <li><a name="cmd.newkomavar"></a><a href="#cmd.newkomavar">\newkomavar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.newkomavar">538</a></li>
- <li><a name="cmd.newpagestyle"></a><a href="#cmd.newpagestyle">\newpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.newpagestyle">483</a></li>
- <li><a name="cmd.newpairofpagestyles"></a><a href="#cmd.newpairofpagestyles">\newpairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.newpairofpagestyles">481</a></li>
+ <li><a name="cmd.newkomafont"></a><a href="#cmd.newkomafont">\newkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.newkomafont">509</a></li>
+ <li><a name="cmd.newkomavar*"></a><a href="#cmd.newkomavar*">\newkomavar*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.newkomavar*">537</a></li>
+ <li><a name="cmd.newkomavar"></a><a href="#cmd.newkomavar">\newkomavar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.newkomavar">537</a></li>
+ <li><a name="cmd.newpagestyle"></a><a href="#cmd.newpagestyle">\newpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.newpagestyle">482</a></li>
+ <li><a name="cmd.newpairofpagestyles"></a><a href="#cmd.newpairofpagestyles">\newpairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.newpairofpagestyles">480</a></li>
<li><a name="cmd.newplength"></a><a href="#cmd.newplength">\newplength</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.newplength">176</a></li>
- <li><a name="cmd.nonumberline"></a><a href="#cmd.nonumberline">\nonumberline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.nonumberline">427</a></li>
- <li><a name="cmd.numberline"></a><a href="#cmd.numberline">\numberline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.numberline">410</a></li>
+ <li><a name="cmd.nonumberline"></a><a href="#cmd.nonumberline">\nonumberline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.nonumberline">426</a></li>
+ <li><a name="cmd.numberline"></a><a href="#cmd.numberline">\numberline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.numberline">409</a></li>
<li><a name="cmd.ofoot*"></a><a href="#cmd.ofoot*">\ofoot*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.ofoot*">279</a></li>
<li><a name="cmd.ofoot"></a><a href="#cmd.ofoot">\ofoot</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.ofoot">278</a></li>
<li><a name="cmd.ohead*"></a><a href="#cmd.ohead*">\ohead*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.ohead*">279</a></li>
<li><a name="cmd.ohead"></a><a href="#cmd.ohead">\ohead</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.ohead">278</a></li>
<li><a name="cmd.opening"></a><a href="#cmd.opening">\opening</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.opening">182</a></li>
<li><a name="cmd.othersectionlevelsformat"></a><a href="#cmd.othersectionlevelsformat">\othersectionlevelsformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.othersectionlevelsformat">116</a></li>
- <li><a name="cmd.pagemark"></a><a href="#cmd.pagemark">\pagemark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.pagemark">285</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.pagemark">473</a></li>
- <li><a name="cmd.pagename"></a><a href="#cmd.pagename">\pagename</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.pagename">545</a></li>
+ <li><a name="cmd.pagemark"></a><a href="#cmd.pagemark">\pagemark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.pagemark">285</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.pagemark">472</a></li>
+ <li><a name="cmd.pagename"></a><a href="#cmd.pagename">\pagename</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.pagename">544</a></li>
<li><a name="cmd.pagenumbering"></a><a href="#cmd.pagenumbering">\pagenumbering</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.pagenumbering">89</a></li>
<li><a name="cmd.pagestyle"></a><a href="#cmd.pagestyle">\pagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.pagestyle">239</a>, <a href="scrguide.pdf#desc:maincls.cmd.pagestyle">84</a></li>
<li><a name="cmd.paragraph*"></a><a href="#cmd.paragraph*">\paragraph*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.paragraph*">111</a></li>
<li><a name="cmd.paragraph"></a><a href="#cmd.paragraph">\paragraph</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.paragraph">106</a></li>
<li><a name="cmd.paragraphformat"></a><a href="#cmd.paragraphformat">\paragraphformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.paragraphformat">116</a></li>
- <li><a name="cmd.paragraphmark"></a><a href="#cmd.paragraphmark">\paragraphmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.paragraphmark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.paragraphmark">474</a></li>
- <li><a name="cmd.paragraphmarkformat"></a><a href="#cmd.paragraphmarkformat">\paragraphmarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.paragraphmarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.paragraphmarkformat">474</a></li>
+ <li><a name="cmd.paragraphmark"></a><a href="#cmd.paragraphmark">\paragraphmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.paragraphmark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.paragraphmark">473</a></li>
+ <li><a name="cmd.paragraphmarkformat"></a><a href="#cmd.paragraphmarkformat">\paragraphmarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.paragraphmarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.paragraphmarkformat">473</a></li>
<li><a name="cmd.paragraphnumdepth"></a><a href="#cmd.paragraphnumdepth">\paragraphnumdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.paragraphnumdepth">120</a></li>
<li><a name="cmd.paragraphtocdepth"></a><a href="#cmd.paragraphtocdepth">\paragraphtocdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.paragraphtocdepth">79</a></li>
<li><a name="cmd.parellipsis"></a><a href="#cmd.parellipsis">\parellipsis</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.cmd.parellipsis">335</a></li>
@@ -673,31 +671,31 @@
<li><a name="cmd.part*"></a><a href="#cmd.part*">\part*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.part*">111</a></li>
<li><a name="cmd.part"></a><a href="#cmd.part">\part</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.part">106</a></li>
<li><a name="cmd.partformat"></a><a href="#cmd.partformat">\partformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.partformat">116</a></li>
- <li><a name="cmd.partheademptypage"></a><a href="#cmd.partheademptypage">\partheademptypage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.partheademptypage">525</a></li>
- <li><a name="cmd.partheadendvskip"></a><a href="#cmd.partheadendvskip">\partheadendvskip</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.partheadendvskip">525</a></li>
- <li><a name="cmd.partheadmidvskip"></a><a href="#cmd.partheadmidvskip">\partheadmidvskip</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.partheadmidvskip">525</a></li>
- <li><a name="cmd.partheadstartvskip"></a><a href="#cmd.partheadstartvskip">\partheadstartvskip</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.partheadstartvskip">525</a></li>
- <li><a name="cmd.partlineswithprefixformat"></a><a href="#cmd.partlineswithprefixformat">\partlineswithprefixformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.partlineswithprefixformat">527</a></li>
- <li><a name="cmd.partmark"></a><a href="#cmd.partmark">\partmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.partmark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.partmark">474</a></li>
- <li><a name="cmd.partmarkformat"></a><a href="#cmd.partmarkformat">\partmarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.partmarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.partmarkformat">474</a></li>
+ <li><a name="cmd.partheademptypage"></a><a href="#cmd.partheademptypage">\partheademptypage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.partheademptypage">524</a></li>
+ <li><a name="cmd.partheadendvskip"></a><a href="#cmd.partheadendvskip">\partheadendvskip</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.partheadendvskip">524</a></li>
+ <li><a name="cmd.partheadmidvskip"></a><a href="#cmd.partheadmidvskip">\partheadmidvskip</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.partheadmidvskip">524</a></li>
+ <li><a name="cmd.partheadstartvskip"></a><a href="#cmd.partheadstartvskip">\partheadstartvskip</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.partheadstartvskip">524</a></li>
+ <li><a name="cmd.partlineswithprefixformat"></a><a href="#cmd.partlineswithprefixformat">\partlineswithprefixformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.partlineswithprefixformat">526</a></li>
+ <li><a name="cmd.partmark"></a><a href="#cmd.partmark">\partmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.partmark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.partmark">473</a></li>
+ <li><a name="cmd.partmarkformat"></a><a href="#cmd.partmarkformat">\partmarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.partmarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.partmarkformat">473</a></li>
<li><a name="cmd.partnumdepth"></a><a href="#cmd.partnumdepth">\partnumdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.partnumdepth">120</a></li>
<li><a name="cmd.partpagestyle"></a><a href="#cmd.partpagestyle">\partpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.partpagestyle">87</a></li>
<li><a name="cmd.parttocdepth"></a><a href="#cmd.parttocdepth">\parttocdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.parttocdepth">79</a></li>
- <li><a name="cmd.phonename"></a><a href="#cmd.phonename">\phonename</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.phonename">545</a></li>
+ <li><a name="cmd.phonename"></a><a href="#cmd.phonename">\phonename</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.phonename">544</a></li>
<li><a name="cmd.providecaptionname*"></a><a href="#cmd.providecaptionname*">\providecaptionname*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.providecaptionname*">371</a></li>
<li><a name="cmd.providecaptionname"></a><a href="#cmd.providecaptionname">\providecaptionname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.providecaptionname">371</a></li>
- <li><a name="cmd.providepagestyle"></a><a href="#cmd.providepagestyle">\providepagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.providepagestyle">483</a></li>
- <li><a name="cmd.providepairofpagestyles"></a><a href="#cmd.providepairofpagestyles">\providepairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.providepairofpagestyles">481</a></li>
+ <li><a name="cmd.providepagestyle"></a><a href="#cmd.providepagestyle">\providepagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.providepagestyle">482</a></li>
+ <li><a name="cmd.providepairofpagestyles"></a><a href="#cmd.providepairofpagestyles">\providepairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.providepairofpagestyles">480</a></li>
<li><a name="cmd.ps"></a><a href="#cmd.ps">\ps</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.ps">185</a></li>
<li><a name="cmd.publishers"></a><a href="#cmd.publishers">\publishers</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.publishers">313</a>, <a href="scrguide.pdf#desc:maincls.cmd.publishers">70</a></li>
- <li><a name="cmd.putC"></a><a href="#cmd.putC">\putC</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.putC">458</a></li>
- <li><a name="cmd.putLL"></a><a href="#cmd.putLL">\putLL</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.putLL">458</a></li>
- <li><a name="cmd.putLR"></a><a href="#cmd.putLR">\putLR</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.putLR">458</a></li>
- <li><a name="cmd.putUL"></a><a href="#cmd.putUL">\putUL</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.putUL">458</a></li>
- <li><a name="cmd.putUR"></a><a href="#cmd.putUR">\putUR</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.putUR">458</a></li>
+ <li><a name="cmd.putC"></a><a href="#cmd.putC">\putC</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.putC">457</a></li>
+ <li><a name="cmd.putLL"></a><a href="#cmd.putLL">\putLL</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.putLL">457</a></li>
+ <li><a name="cmd.putLR"></a><a href="#cmd.putLR">\putLR</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.putLR">457</a></li>
+ <li><a name="cmd.putUL"></a><a href="#cmd.putUL">\putUL</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.putUL">457</a></li>
+ <li><a name="cmd.putUR"></a><a href="#cmd.putUR">\putUR</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.putUR">457</a></li>
<li><a name="cmd.raggedbottom"></a><a href="#cmd.raggedbottom">\raggedbottom</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.raggedbottom">59</a></li>
<li><a name="cmd.raggedchapter"></a><a href="#cmd.raggedchapter">\raggedchapter</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.raggedchapter">114</a></li>
- <li><a name="cmd.raggedchapterentry"></a><a href="#cmd.raggedchapterentry">\raggedchapterentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.raggedchapterentry">508</a></li>
+ <li><a name="cmd.raggedchapterentry"></a><a href="#cmd.raggedchapterentry">\raggedchapterentry</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.raggedchapterentry">507</a></li>
<li><a name="cmd.raggeddictum"></a><a href="#cmd.raggeddictum">\raggeddictum</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.raggeddictum">123</a>, <a href="scrguide.pdf#desc:scrextend.cmd.raggeddictum">321</a></li>
<li><a name="cmd.raggeddictumauthor"></a><a href="#cmd.raggeddictumauthor">\raggeddictumauthor</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.raggeddictumauthor">123</a>, <a href="scrguide.pdf#desc:scrextend.cmd.raggeddictumauthor">321</a></li>
<li><a name="cmd.raggeddictumtext"></a><a href="#cmd.raggeddictumtext">\raggeddictumtext</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.raggeddictumtext">123</a>, <a href="scrguide.pdf#desc:scrextend.cmd.raggeddictumtext">321</a></li>
@@ -724,28 +722,28 @@
<li><a name="cmd.refoot"></a><a href="#cmd.refoot">\refoot</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.refoot">274</a></li>
<li><a name="cmd.rehead*"></a><a href="#cmd.rehead*">\rehead*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.rehead*">273</a></li>
<li><a name="cmd.rehead"></a><a href="#cmd.rehead">\rehead</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.rehead">271</a></li>
- <li><a name="cmd.removefromtoclist"></a><a href="#cmd.removefromtoclist">\removefromtoclist</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.removefromtoclist">400</a></li>
- <li><a name="cmd.removereffields"></a><a href="#cmd.removereffields">\removereffields</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.removereffields">538</a></li>
+ <li><a name="cmd.removefromtoclist"></a><a href="#cmd.removefromtoclist">\removefromtoclist</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.removefromtoclist">399</a></li>
+ <li><a name="cmd.removereffields"></a><a href="#cmd.removereffields">\removereffields</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.removereffields">537</a></li>
<li><a name="cmd.renewcaptionname*"></a><a href="#cmd.renewcaptionname*">\renewcaptionname*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.renewcaptionname*">371</a></li>
<li><a name="cmd.renewcaptionname"></a><a href="#cmd.renewcaptionname">\renewcaptionname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrbase.cmd.renewcaptionname">371</a></li>
- <li><a name="cmd.renewpagestyle"></a><a href="#cmd.renewpagestyle">\renewpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.renewpagestyle">483</a></li>
- <li><a name="cmd.renewpairofpagestyles"></a><a href="#cmd.renewpairofpagestyles">\renewpairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.renewpairofpagestyles">481</a></li>
- <li><a name="cmd.rightbotmark"></a><a href="#cmd.rightbotmark">\rightbotmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.rightbotmark">472</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.rightbotmark">477</a></li>
- <li><a name="cmd.rightfirstmark"></a><a href="#cmd.rightfirstmark">\rightfirstmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.rightfirstmark">472</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.rightfirstmark">477</a></li>
- <li><a name="cmd.rightmark"></a><a href="#cmd.rightmark">\rightmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.rightmark">285</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.rightmark">472</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.rightmark">477</a></li>
- <li><a name="cmd.righttopmark"></a><a href="#cmd.righttopmark">\righttopmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.righttopmark">472</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.righttopmark">477</a></li>
+ <li><a name="cmd.renewpagestyle"></a><a href="#cmd.renewpagestyle">\renewpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.renewpagestyle">482</a></li>
+ <li><a name="cmd.renewpairofpagestyles"></a><a href="#cmd.renewpairofpagestyles">\renewpairofpagestyles</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.renewpairofpagestyles">480</a></li>
+ <li><a name="cmd.rightbotmark"></a><a href="#cmd.rightbotmark">\rightbotmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.rightbotmark">471</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.rightbotmark">476</a></li>
+ <li><a name="cmd.rightfirstmark"></a><a href="#cmd.rightfirstmark">\rightfirstmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.rightfirstmark">471</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.rightfirstmark">476</a></li>
+ <li><a name="cmd.rightmark"></a><a href="#cmd.rightmark">\rightmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.rightmark">285</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.rightmark">471</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.rightmark">476</a></li>
+ <li><a name="cmd.righttopmark"></a><a href="#cmd.righttopmark">\righttopmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.righttopmark">471</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage-experts.cmd.righttopmark">476</a></li>
<li><a name="cmd.rofoot*"></a><a href="#cmd.rofoot*">\rofoot*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.rofoot*">277</a></li>
<li><a name="cmd.rofoot"></a><a href="#cmd.rofoot">\rofoot</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.rofoot">274</a></li>
<li><a name="cmd.rohead*"></a><a href="#cmd.rohead*">\rohead*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.rohead*">273</a></li>
<li><a name="cmd.rohead"></a><a href="#cmd.rohead">\rohead</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.rohead">271</a></li>
- <li><a name="cmd.scr@startsection"></a><a href="#cmd.scr@startsection">\scr@startsection</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.scr@startsection">533</a></li>
+ <li><a name="cmd.scr@startsection"></a><a href="#cmd.scr@startsection">\scr@startsection</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.scr@startsection">532</a></li>
<li><a name="cmd.section*"></a><a href="#cmd.section*">\section*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.section*">111</a></li>
<li><a name="cmd.section"></a><a href="#cmd.section">\section</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.section">106</a></li>
- <li><a name="cmd.sectioncatchphraseformat"></a><a href="#cmd.sectioncatchphraseformat">\sectioncatchphraseformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.sectioncatchphraseformat">531</a></li>
+ <li><a name="cmd.sectioncatchphraseformat"></a><a href="#cmd.sectioncatchphraseformat">\sectioncatchphraseformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.sectioncatchphraseformat">530</a></li>
<li><a name="cmd.sectionformat"></a><a href="#cmd.sectionformat">\sectionformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.sectionformat">116</a></li>
- <li><a name="cmd.sectionlinesformat"></a><a href="#cmd.sectionlinesformat">\sectionlinesformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.sectionlinesformat">531</a></li>
- <li><a name="cmd.sectionmark"></a><a href="#cmd.sectionmark">\sectionmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.sectionmark">118</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.sectionmark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.sectionmark">474</a></li>
- <li><a name="cmd.sectionmarkformat"></a><a href="#cmd.sectionmarkformat">\sectionmarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.sectionmarkformat">118</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.sectionmarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.sectionmarkformat">474</a></li>
+ <li><a name="cmd.sectionlinesformat"></a><a href="#cmd.sectionlinesformat">\sectionlinesformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.sectionlinesformat">530</a></li>
+ <li><a name="cmd.sectionmark"></a><a href="#cmd.sectionmark">\sectionmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.sectionmark">118</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.sectionmark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.sectionmark">473</a></li>
+ <li><a name="cmd.sectionmarkformat"></a><a href="#cmd.sectionmarkformat">\sectionmarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.sectionmarkformat">118</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.sectionmarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.sectionmarkformat">473</a></li>
<li><a name="cmd.sectionnumdepth"></a><a href="#cmd.sectionnumdepth">\sectionnumdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.sectionnumdepth">120</a></li>
<li><a name="cmd.sectiontocdepth"></a><a href="#cmd.sectiontocdepth">\sectiontocdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.sectiontocdepth">79</a></li>
<li><a name="cmd.sentencename"></a><a href="#cmd.sentencename">\sentencename</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.cmd.sentencename">342</a></li>
@@ -763,11 +761,11 @@
<li><a name="cmd.setchapterpreamble"></a><a href="#cmd.setchapterpreamble">\setchapterpreamble</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.setchapterpreamble">121</a></li>
<li><a name="cmd.setfootnoterule"></a><a href="#cmd.setfootnoterule">\setfootnoterule</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.setfootnoterule">247</a>, <a href="scrguide.pdf#desc:maincls.cmd.setfootnoterule">98</a></li>
<li><a name="cmd.setindexpreamble"></a><a href="#cmd.setindexpreamble">\setindexpreamble</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.setindexpreamble">161</a></li>
- <li><a name="cmd.setkomafont"></a><a href="#cmd.setkomafont">\setkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.setkomafont">191</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.setkomafont">267</a>, <a href="scrguide.pdf#desc:scrextend.cmd.setkomafont">309</a>, <a href="scrguide.pdf#desc:scrjura.cmd.setkomafont">326</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.setkomafont">490</a>, <a href="scrguide.pdf#desc:maincls.cmd.setkomafont">61</a></li>
+ <li><a name="cmd.setkomafont"></a><a href="#cmd.setkomafont">\setkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.setkomafont">191</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.setkomafont">267</a>, <a href="scrguide.pdf#desc:scrextend.cmd.setkomafont">309</a>, <a href="scrguide.pdf#desc:scrjura.cmd.setkomafont">326</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.setkomafont">489</a>, <a href="scrguide.pdf#desc:maincls.cmd.setkomafont">61</a></li>
<li><a name="cmd.setkomavar*"></a><a href="#cmd.setkomavar*">\setkomavar*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.setkomavar*">170</a></li>
<li><a name="cmd.setkomavar"></a><a href="#cmd.setkomavar">\setkomavar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.setkomavar">170</a></li>
<li><a name="cmd.setlengthtoplength"></a><a href="#cmd.setlengthtoplength">\setlengthtoplength</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.setlengthtoplength">178</a></li>
- <li><a name="cmd.setparsizes"></a><a href="#cmd.setparsizes">\setparsizes</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.setparsizes">512</a></li>
+ <li><a name="cmd.setparsizes"></a><a href="#cmd.setparsizes">\setparsizes</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls-experts.cmd.setparsizes">511</a></li>
<li><a name="cmd.setpartpreamble"></a><a href="#cmd.setpartpreamble">\setpartpreamble</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.setpartpreamble">121</a></li>
<li><a name="cmd.setplength"></a><a href="#cmd.setplength">\setplength</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.setplength">178</a></li>
<li><a name="cmd.setplengthtodepth"></a><a href="#cmd.setplengthtodepth">\setplengthtodepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.setplengthtodepth">178</a></li>
@@ -775,38 +773,38 @@
<li><a name="cmd.setplengthtototalheight"></a><a href="#cmd.setplengthtototalheight">\setplengthtototalheight</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.setplengthtototalheight">178</a></li>
<li><a name="cmd.setplengthtowidth"></a><a href="#cmd.setplengthtowidth">\setplengthtowidth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.setplengthtowidth">178</a></li>
<li><a name="cmd.settime"></a><a href="#cmd.settime">\settime</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrtime.cmd.settime">299</a></li>
- <li><a name="cmd.setuptoc"></a><a href="#cmd.setuptoc">\setuptoc</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.setuptoc">406</a></li>
- <li><a name="cmd.storeareas"></a><a href="#cmd.storeareas">\storeareas</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.storeareas">505</a></li>
+ <li><a name="cmd.setuptoc"></a><a href="#cmd.setuptoc">\setuptoc</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.setuptoc">405</a></li>
+ <li><a name="cmd.storeareas"></a><a href="#cmd.storeareas">\storeareas</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea-experts.cmd.storeareas">504</a></li>
<li><a name="cmd.subject"></a><a href="#cmd.subject">\subject</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.subject">313</a>, <a href="scrguide.pdf#desc:maincls.cmd.subject">70</a></li>
- <li><a name="cmd.subjectname"></a><a href="#cmd.subjectname">\subjectname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.subjectname">545</a></li>
+ <li><a name="cmd.subjectname"></a><a href="#cmd.subjectname">\subjectname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.subjectname">544</a></li>
<li><a name="cmd.subparagraph*"></a><a href="#cmd.subparagraph*">\subparagraph*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subparagraph*">111</a></li>
<li><a name="cmd.subparagraph"></a><a href="#cmd.subparagraph">\subparagraph</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subparagraph">106</a></li>
<li><a name="cmd.subparagraphformat"></a><a href="#cmd.subparagraphformat">\subparagraphformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subparagraphformat">116</a></li>
- <li><a name="cmd.subparagraphmark"></a><a href="#cmd.subparagraphmark">\subparagraphmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.subparagraphmark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.subparagraphmark">474</a></li>
- <li><a name="cmd.subparagraphmarkformat"></a><a href="#cmd.subparagraphmarkformat">\subparagraphmarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.subparagraphmarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.subparagraphmarkformat">474</a></li>
+ <li><a name="cmd.subparagraphmark"></a><a href="#cmd.subparagraphmark">\subparagraphmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.subparagraphmark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.subparagraphmark">473</a></li>
+ <li><a name="cmd.subparagraphmarkformat"></a><a href="#cmd.subparagraphmarkformat">\subparagraphmarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.subparagraphmarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.subparagraphmarkformat">473</a></li>
<li><a name="cmd.subparagraphnumdepth"></a><a href="#cmd.subparagraphnumdepth">\subparagraphnumdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subparagraphnumdepth">120</a></li>
<li><a name="cmd.subparagraphtocdepth"></a><a href="#cmd.subparagraphtocdepth">\subparagraphtocdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subparagraphtocdepth">79</a></li>
<li><a name="cmd.subsection*"></a><a href="#cmd.subsection*">\subsection*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsection*">111</a></li>
<li><a name="cmd.subsection"></a><a href="#cmd.subsection">\subsection</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsection">106</a></li>
<li><a name="cmd.subsectionformat"></a><a href="#cmd.subsectionformat">\subsectionformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsectionformat">116</a></li>
- <li><a name="cmd.subsectionmark"></a><a href="#cmd.subsectionmark">\subsectionmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsectionmark">118</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.subsectionmark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.subsectionmark">474</a></li>
- <li><a name="cmd.subsectionmarkformat"></a><a href="#cmd.subsectionmarkformat">\subsectionmarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsectionmarkformat">118</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.subsectionmarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.subsectionmarkformat">474</a></li>
+ <li><a name="cmd.subsectionmark"></a><a href="#cmd.subsectionmark">\subsectionmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsectionmark">118</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.subsectionmark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.subsectionmark">473</a></li>
+ <li><a name="cmd.subsectionmarkformat"></a><a href="#cmd.subsectionmarkformat">\subsectionmarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsectionmarkformat">118</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.subsectionmarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.subsectionmarkformat">473</a></li>
<li><a name="cmd.subsectionnumdepth"></a><a href="#cmd.subsectionnumdepth">\subsectionnumdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsectionnumdepth">120</a></li>
<li><a name="cmd.subsectiontocdepth"></a><a href="#cmd.subsectiontocdepth">\subsectiontocdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsectiontocdepth">79</a></li>
<li><a name="cmd.subsubsection*"></a><a href="#cmd.subsubsection*">\subsubsection*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsubsection*">111</a></li>
<li><a name="cmd.subsubsection"></a><a href="#cmd.subsubsection">\subsubsection</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsubsection">106</a></li>
<li><a name="cmd.subsubsectionformat"></a><a href="#cmd.subsubsectionformat">\subsubsectionformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsubsectionformat">116</a></li>
- <li><a name="cmd.subsubsectionmark"></a><a href="#cmd.subsubsectionmark">\subsubsectionmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.subsubsectionmark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.subsubsectionmark">474</a></li>
- <li><a name="cmd.subsubsectionmarkformat"></a><a href="#cmd.subsubsectionmarkformat">\subsubsectionmarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.subsubsectionmarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.subsubsectionmarkformat">474</a></li>
+ <li><a name="cmd.subsubsectionmark"></a><a href="#cmd.subsubsectionmark">\subsubsectionmark</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.subsubsectionmark">287</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.subsubsectionmark">473</a></li>
+ <li><a name="cmd.subsubsectionmarkformat"></a><a href="#cmd.subsubsectionmarkformat">\subsubsectionmarkformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.subsubsectionmarkformat">286</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.subsubsectionmarkformat">473</a></li>
<li><a name="cmd.subsubsectionnumdepth"></a><a href="#cmd.subsubsectionnumdepth">\subsubsectionnumdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsubsectionnumdepth">120</a></li>
<li><a name="cmd.subsubsectiontocdepth"></a><a href="#cmd.subsubsectiontocdepth">\subsubsectiontocdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.subsubsectiontocdepth">79</a></li>
<li><a name="cmd.subtitle"></a><a href="#cmd.subtitle">\subtitle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.subtitle">313</a>, <a href="scrguide.pdf#desc:maincls.cmd.subtitle">70</a></li>
- <li><a name="cmd.syncwithnotecolumn"></a><a href="#cmd.syncwithnotecolumn">\syncwithnotecolumn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.syncwithnotecolumn">498</a></li>
- <li><a name="cmd.syncwithnotecolumns"></a><a href="#cmd.syncwithnotecolumns">\syncwithnotecolumns</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.syncwithnotecolumns">500</a></li>
+ <li><a name="cmd.syncwithnotecolumn"></a><a href="#cmd.syncwithnotecolumn">\syncwithnotecolumn</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.syncwithnotecolumn">497</a></li>
+ <li><a name="cmd.syncwithnotecolumns"></a><a href="#cmd.syncwithnotecolumns">\syncwithnotecolumns</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.syncwithnotecolumns">499</a></li>
<li><a name="cmd.tableformat"></a><a href="#cmd.tableformat">\tableformat</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.tableformat">146</a></li>
<li><a name="cmd.tableofcontents"></a><a href="#cmd.tableofcontents">\tableofcontents</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.tableofcontents">78</a></li>
- <li><a name="cmd.tb@/Dateierweiterung/@after@hook"></a><a href="#cmd.tb@/Dateierweiterung/@after@hook">\tb@/Dateierweiterung/@after@hook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tb@/Dateierweiterung/@after@hook">426</a></li>
- <li><a name="cmd.tb@/Dateierweiterung/@before@hook"></a><a href="#cmd.tb@/Dateierweiterung/@before@hook">\tb@/Dateierweiterung/@before@hook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tb@/Dateierweiterung/@before@hook">426</a></li>
+ <li><a name="cmd.tb@/Dateierweiterung/@after@hook"></a><a href="#cmd.tb@/Dateierweiterung/@after@hook">\tb@/Dateierweiterung/@after@hook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tb@/Dateierweiterung/@after@hook">425</a></li>
+ <li><a name="cmd.tb@/Dateierweiterung/@before@hook"></a><a href="#cmd.tb@/Dateierweiterung/@before@hook">\tb@/Dateierweiterung/@before@hook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tb@/Dateierweiterung/@before@hook">425</a></li>
<li><a name="cmd.thanks"></a><a href="#cmd.thanks">\thanks</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.thanks">313</a>, <a href="scrguide.pdf#desc:maincls.cmd.thanks">70</a></li>
<li><a name="cmd.theenumi"></a><a href="#cmd.theenumi">\theenumi</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.theenumi">127</a>, <a href="scrguide.pdf#desc:scrlttr2.cmd.theenumi">249</a></li>
<li><a name="cmd.theenumii"></a><a href="#cmd.theenumii">\theenumii</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.cmd.theenumii">127</a>, <a href="scrguide.pdf#desc:scrlttr2.cmd.theenumii">249</a></li>
@@ -822,38 +820,38 @@
<li><a name="cmd.title"></a><a href="#cmd.title">\title</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.title">313</a>, <a href="scrguide.pdf#desc:maincls.cmd.title">70</a></li>
<li><a name="cmd.titlehead"></a><a href="#cmd.titlehead">\titlehead</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.titlehead">313</a>, <a href="scrguide.pdf#desc:maincls.cmd.titlehead">70</a></li>
<li><a name="cmd.titlepagestyle"></a><a href="#cmd.titlepagestyle">\titlepagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.titlepagestyle">316</a>, <a href="scrguide.pdf#desc:maincls.cmd.titlepagestyle">87</a></li>
- <li><a name="cmd.tocbasic@@after@hook"></a><a href="#cmd.tocbasic@@after@hook">\tocbasic@@after@hook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@@after@hook">426</a></li>
- <li><a name="cmd.tocbasic@@before@hook"></a><a href="#cmd.tocbasic@@before@hook">\tocbasic@@before@hook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@@before@hook">426</a></li>
- <li><a name="cmd.tocbasic@DependOnPenaltyAndTOCLevel"></a><a href="#cmd.tocbasic@DependOnPenaltyAndTOCLevel">\tocbasic@DependOnPenaltyAndTOCLevel</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@DependOnPenaltyAndTOCLevel">427</a></li>
- <li><a name="cmd.tocbasic@SetPenaltyByTOCLevel"></a><a href="#cmd.tocbasic@SetPenaltyByTOCLevel">\tocbasic@SetPenaltyByTOCLevel</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@SetPenaltyByTOCLevel">427</a></li>
- <li><a name="cmd.tocbasic@addxcontentsline"></a><a href="#cmd.tocbasic@addxcontentsline">\tocbasic@addxcontentsline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@addxcontentsline">427</a></li>
- <li><a name="cmd.tocbasic@extend@babel"></a><a href="#cmd.tocbasic@extend@babel">\tocbasic@extend@babel</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@extend@babel">425</a></li>
- <li><a name="cmd.tocbasic@listhead"></a><a href="#cmd.tocbasic@listhead">\tocbasic@listhead</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@listhead">427</a></li>
- <li><a name="cmd.tocbasic@listhead@/Dateierweiterung/"></a><a href="#cmd.tocbasic@listhead@/Dateierweiterung/">\tocbasic@listhead@/Dateierweiterung/</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@listhead@/Dateierweiterung/">427</a></li>
- <li><a name="cmd.tocbasic@starttoc"></a><a href="#cmd.tocbasic@starttoc">\tocbasic@starttoc</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@starttoc">425</a></li>
- <li><a name="cmd.tocbasicautomode"></a><a href="#cmd.tocbasicautomode">\tocbasicautomode</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasicautomode">401</a></li>
+ <li><a name="cmd.tocbasic@@after@hook"></a><a href="#cmd.tocbasic@@after@hook">\tocbasic@@after@hook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@@after@hook">425</a></li>
+ <li><a name="cmd.tocbasic@@before@hook"></a><a href="#cmd.tocbasic@@before@hook">\tocbasic@@before@hook</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@@before@hook">425</a></li>
+ <li><a name="cmd.tocbasic@DependOnPenaltyAndTOCLevel"></a><a href="#cmd.tocbasic@DependOnPenaltyAndTOCLevel">\tocbasic@DependOnPenaltyAndTOCLevel</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@DependOnPenaltyAndTOCLevel">426</a></li>
+ <li><a name="cmd.tocbasic@SetPenaltyByTOCLevel"></a><a href="#cmd.tocbasic@SetPenaltyByTOCLevel">\tocbasic@SetPenaltyByTOCLevel</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@SetPenaltyByTOCLevel">426</a></li>
+ <li><a name="cmd.tocbasic@addxcontentsline"></a><a href="#cmd.tocbasic@addxcontentsline">\tocbasic@addxcontentsline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@addxcontentsline">426</a></li>
+ <li><a name="cmd.tocbasic@extend@babel"></a><a href="#cmd.tocbasic@extend@babel">\tocbasic@extend@babel</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@extend@babel">424</a></li>
+ <li><a name="cmd.tocbasic@listhead"></a><a href="#cmd.tocbasic@listhead">\tocbasic@listhead</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@listhead">426</a></li>
+ <li><a name="cmd.tocbasic@listhead@/Dateierweiterung/"></a><a href="#cmd.tocbasic@listhead@/Dateierweiterung/">\tocbasic@listhead@/Dateierweiterung/</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@listhead@/Dateierweiterung/">426</a></li>
+ <li><a name="cmd.tocbasic@starttoc"></a><a href="#cmd.tocbasic@starttoc">\tocbasic@starttoc</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasic@starttoc">424</a></li>
+ <li><a name="cmd.tocbasicautomode"></a><a href="#cmd.tocbasicautomode">\tocbasicautomode</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.tocbasicautomode">400</a></li>
<li><a name="cmd.todaysname"></a><a href="#cmd.todaysname">\todaysname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrdate.cmd.todaysname">295</a></li>
<li><a name="cmd.todaysnumber"></a><a href="#cmd.todaysnumber">\todaysnumber</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrdate.cmd.todaysnumber">295</a></li>
- <li><a name="cmd.toplevelpagestyle"></a><a href="#cmd.toplevelpagestyle">\toplevelpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.toplevelpagestyle">460</a></li>
+ <li><a name="cmd.toplevelpagestyle"></a><a href="#cmd.toplevelpagestyle">\toplevelpagestyle</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.cmd.toplevelpagestyle">459</a></li>
<li><a name="cmd.typearea"></a><a href="#cmd.typearea">\typearea</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:typearea.cmd.typearea">41</a></li>
- <li><a name="cmd.unsettoc"></a><a href="#cmd.unsettoc">\unsettoc</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.unsettoc">406</a></li>
+ <li><a name="cmd.unsettoc"></a><a href="#cmd.unsettoc">\unsettoc</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.unsettoc">405</a></li>
<li><a name="cmd.uppertitleback"></a><a href="#cmd.uppertitleback">\uppertitleback</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrextend.cmd.uppertitleback">315</a>, <a href="scrguide.pdf#desc:maincls.cmd.uppertitleback">72</a></li>
- <li><a name="cmd.useencodingofkomafont"></a><a href="#cmd.useencodingofkomafont">\useencodingofkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.useencodingofkomafont">194</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.useencodingofkomafont">269</a>, <a href="scrguide.pdf#desc:scrextend.cmd.useencodingofkomafont">310</a>, <a href="scrguide.pdf#desc:scrjura.cmd.useencodingofkomafont">327</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.useencodingofkomafont">491</a>, <a href="scrguide.pdf#desc:maincls.cmd.useencodingofkomafont">66</a></li>
- <li><a name="cmd.usefamilyofkomafont"></a><a href="#cmd.usefamilyofkomafont">\usefamilyofkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usefamilyofkomafont">194</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.usefamilyofkomafont">269</a>, <a href="scrguide.pdf#desc:scrextend.cmd.usefamilyofkomafont">310</a>, <a href="scrguide.pdf#desc:scrjura.cmd.usefamilyofkomafont">327</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.usefamilyofkomafont">491</a>, <a href="scrguide.pdf#desc:maincls.cmd.usefamilyofkomafont">66</a></li>
- <li><a name="cmd.usefontofkomafont"></a><a href="#cmd.usefontofkomafont">\usefontofkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usefontofkomafont">194</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.usefontofkomafont">269</a>, <a href="scrguide.pdf#desc:scrextend.cmd.usefontofkomafont">310</a>, <a href="scrguide.pdf#desc:scrjura.cmd.usefontofkomafont">327</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.usefontofkomafont">491</a>, <a href="scrguide.pdf#desc:maincls.cmd.usefontofkomafont">66</a></li>
- <li><a name="cmd.usekomafont"></a><a href="#cmd.usekomafont">\usekomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usekomafont">191</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.usekomafont">267</a>, <a href="scrguide.pdf#desc:scrextend.cmd.usekomafont">309</a>, <a href="scrguide.pdf#desc:scrjura.cmd.usekomafont">326</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.usekomafont">490</a>, <a href="scrguide.pdf#desc:maincls.cmd.usekomafont">61</a></li>
- <li><a name="cmd.usekomavar*"></a><a href="#cmd.usekomavar*">\usekomavar*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usekomavar*">171</a>, <a href="scrguide.pdf#desc:scrlttr2-experts.cmd.usekomavar*">539</a></li>
- <li><a name="cmd.usekomavar"></a><a href="#cmd.usekomavar">\usekomavar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usekomavar">171</a>, <a href="scrguide.pdf#desc:scrlttr2-experts.cmd.usekomavar">539</a></li>
- <li><a name="cmd.usepackage"></a><a href="#cmd.usepackage">\usepackage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usepackage">162</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.usepackage">264</a>, <a href="scrguide.pdf#desc:scrextend.cmd.usepackage">306</a>, <a href="scrguide.pdf#desc:typearea.cmd.usepackage">32</a>, <a href="scrguide.pdf#desc:scrjura.cmd.usepackage">325</a>, <a href="scrguide.pdf#desc:scrhack.cmd.usepackage">438</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.usepackage">444</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.usepackage">488</a>, <a href="scrguide.pdf#desc:maincls.cmd.usepackage">56</a></li>
+ <li><a name="cmd.useencodingofkomafont"></a><a href="#cmd.useencodingofkomafont">\useencodingofkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.useencodingofkomafont">194</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.useencodingofkomafont">269</a>, <a href="scrguide.pdf#desc:scrextend.cmd.useencodingofkomafont">310</a>, <a href="scrguide.pdf#desc:scrjura.cmd.useencodingofkomafont">327</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.useencodingofkomafont">490</a>, <a href="scrguide.pdf#desc:maincls.cmd.useencodingofkomafont">66</a></li>
+ <li><a name="cmd.usefamilyofkomafont"></a><a href="#cmd.usefamilyofkomafont">\usefamilyofkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usefamilyofkomafont">194</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.usefamilyofkomafont">269</a>, <a href="scrguide.pdf#desc:scrextend.cmd.usefamilyofkomafont">310</a>, <a href="scrguide.pdf#desc:scrjura.cmd.usefamilyofkomafont">327</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.usefamilyofkomafont">490</a>, <a href="scrguide.pdf#desc:maincls.cmd.usefamilyofkomafont">66</a></li>
+ <li><a name="cmd.usefontofkomafont"></a><a href="#cmd.usefontofkomafont">\usefontofkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usefontofkomafont">194</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.usefontofkomafont">269</a>, <a href="scrguide.pdf#desc:scrextend.cmd.usefontofkomafont">310</a>, <a href="scrguide.pdf#desc:scrjura.cmd.usefontofkomafont">327</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.usefontofkomafont">490</a>, <a href="scrguide.pdf#desc:maincls.cmd.usefontofkomafont">66</a></li>
+ <li><a name="cmd.usekomafont"></a><a href="#cmd.usekomafont">\usekomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usekomafont">191</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.usekomafont">267</a>, <a href="scrguide.pdf#desc:scrextend.cmd.usekomafont">309</a>, <a href="scrguide.pdf#desc:scrjura.cmd.usekomafont">326</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.usekomafont">489</a>, <a href="scrguide.pdf#desc:maincls.cmd.usekomafont">61</a></li>
+ <li><a name="cmd.usekomavar*"></a><a href="#cmd.usekomavar*">\usekomavar*</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usekomavar*">171</a>, <a href="scrguide.pdf#desc:scrlttr2-experts.cmd.usekomavar*">538</a></li>
+ <li><a name="cmd.usekomavar"></a><a href="#cmd.usekomavar">\usekomavar</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usekomavar">171</a>, <a href="scrguide.pdf#desc:scrlttr2-experts.cmd.usekomavar">538</a></li>
+ <li><a name="cmd.usepackage"></a><a href="#cmd.usepackage">\usepackage</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usepackage">162</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.usepackage">264</a>, <a href="scrguide.pdf#desc:scrextend.cmd.usepackage">306</a>, <a href="scrguide.pdf#desc:typearea.cmd.usepackage">32</a>, <a href="scrguide.pdf#desc:scrjura.cmd.usepackage">325</a>, <a href="scrguide.pdf#desc:scrhack.cmd.usepackage">437</a>, <a href="scrguide.pdf#desc:scrlayer.cmd.usepackage">443</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.usepackage">487</a>, <a href="scrguide.pdf#desc:maincls.cmd.usepackage">56</a></li>
<li><a name="cmd.useplength"></a><a href="#cmd.useplength">\useplength</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.useplength">176</a></li>
- <li><a name="cmd.useseriesofkomafont"></a><a href="#cmd.useseriesofkomafont">\useseriesofkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.useseriesofkomafont">194</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.useseriesofkomafont">269</a>, <a href="scrguide.pdf#desc:scrextend.cmd.useseriesofkomafont">310</a>, <a href="scrguide.pdf#desc:scrjura.cmd.useseriesofkomafont">327</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.useseriesofkomafont">491</a>, <a href="scrguide.pdf#desc:maincls.cmd.useseriesofkomafont">66</a></li>
- <li><a name="cmd.useshapeofkomafont"></a><a href="#cmd.useshapeofkomafont">\useshapeofkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.useshapeofkomafont">194</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.useshapeofkomafont">269</a>, <a href="scrguide.pdf#desc:scrextend.cmd.useshapeofkomafont">310</a>, <a href="scrguide.pdf#desc:scrjura.cmd.useshapeofkomafont">327</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.useshapeofkomafont">491</a>, <a href="scrguide.pdf#desc:maincls.cmd.useshapeofkomafont">66</a></li>
- <li><a name="cmd.usesizeofkomafont"></a><a href="#cmd.usesizeofkomafont">\usesizeofkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usesizeofkomafont">194</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.usesizeofkomafont">269</a>, <a href="scrguide.pdf#desc:scrextend.cmd.usesizeofkomafont">310</a>, <a href="scrguide.pdf#desc:scrjura.cmd.usesizeofkomafont">327</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.usesizeofkomafont">491</a>, <a href="scrguide.pdf#desc:maincls.cmd.usesizeofkomafont">66</a></li>
- <li><a name="cmd.usetocbasicnumberline"></a><a href="#cmd.usetocbasicnumberline">\usetocbasicnumberline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.usetocbasicnumberline">410</a></li>
+ <li><a name="cmd.useseriesofkomafont"></a><a href="#cmd.useseriesofkomafont">\useseriesofkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.useseriesofkomafont">194</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.useseriesofkomafont">269</a>, <a href="scrguide.pdf#desc:scrextend.cmd.useseriesofkomafont">310</a>, <a href="scrguide.pdf#desc:scrjura.cmd.useseriesofkomafont">327</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.useseriesofkomafont">490</a>, <a href="scrguide.pdf#desc:maincls.cmd.useseriesofkomafont">66</a></li>
+ <li><a name="cmd.useshapeofkomafont"></a><a href="#cmd.useshapeofkomafont">\useshapeofkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.useshapeofkomafont">194</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.useshapeofkomafont">269</a>, <a href="scrguide.pdf#desc:scrextend.cmd.useshapeofkomafont">310</a>, <a href="scrguide.pdf#desc:scrjura.cmd.useshapeofkomafont">327</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.useshapeofkomafont">490</a>, <a href="scrguide.pdf#desc:maincls.cmd.useshapeofkomafont">66</a></li>
+ <li><a name="cmd.usesizeofkomafont"></a><a href="#cmd.usesizeofkomafont">\usesizeofkomafont</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.cmd.usesizeofkomafont">194</a>, <a href="scrguide.pdf#desc:scrlayer-scrpage.cmd.usesizeofkomafont">269</a>, <a href="scrguide.pdf#desc:scrextend.cmd.usesizeofkomafont">310</a>, <a href="scrguide.pdf#desc:scrjura.cmd.usesizeofkomafont">327</a>, <a href="scrguide.pdf#desc:scrlayer-notecolumn.cmd.usesizeofkomafont">490</a>, <a href="scrguide.pdf#desc:maincls.cmd.usesizeofkomafont">66</a></li>
+ <li><a name="cmd.usetocbasicnumberline"></a><a href="#cmd.usetocbasicnumberline">\usetocbasicnumberline</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.cmd.usetocbasicnumberline">409</a></li>
<li><a name="cmd.withoutparnumber"></a><a href="#cmd.withoutparnumber">\withoutparnumber</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.cmd.withoutparnumber">335</a></li>
- <li><a name="cmd.wwwname"></a><a href="#cmd.wwwname">\wwwname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.wwwname">545</a></li>
- <li><a name="cmd.yourmailname"></a><a href="#cmd.yourmailname">\yourmailname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.yourmailname">545</a></li>
- <li><a name="cmd.yourrefname"></a><a href="#cmd.yourrefname">\yourrefname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.yourrefname">545</a></li>
+ <li><a name="cmd.wwwname"></a><a href="#cmd.wwwname">\wwwname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.wwwname">544</a></li>
+ <li><a name="cmd.yourmailname"></a><a href="#cmd.yourmailname">\yourmailname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.yourmailname">544</a></li>
+ <li><a name="cmd.yourrefname"></a><a href="#cmd.yourrefname">\yourrefname</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2-experts.cmd.yourrefname">544</a></li>
</ul>
<h2><a name="environment">Umgebungen</a></h2>
<ul>
@@ -875,8 +873,8 @@
</ul>
<h2><a name="length">Längen</a></h2>
<ul>
- <li><a name="length.footheight"></a><a href="#length.footheight">footheight</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.length.footheight">266</a>, <a href="scrguide.pdf#desc:typearea.length.footheight">46</a>, <a href="scrguide.pdf#desc:scrlayer.length.footheight">470</a></li>
- <li><a name="length.headheight"></a><a href="#length.headheight">headheight</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.length.headheight">266</a>, <a href="scrguide.pdf#desc:scrlayer.length.headheight">470</a></li>
+ <li><a name="length.footheight"></a><a href="#length.footheight">footheight</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.length.footheight">266</a>, <a href="scrguide.pdf#desc:typearea.length.footheight">46</a>, <a href="scrguide.pdf#desc:scrlayer.length.footheight">469</a></li>
+ <li><a name="length.headheight"></a><a href="#length.headheight">headheight</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer-scrpage.length.headheight">266</a>, <a href="scrguide.pdf#desc:scrlayer.length.headheight">469</a></li>
</ul>
<h2><a name="plength">Pseudolängen</a></h2>
<ul>
@@ -973,8 +971,8 @@
</ul>
<h2><a name="pagestyle">Seitenstile</a></h2>
<ul>
- <li><a name="pagestyle.@everystyle@"></a><a href="#pagestyle.@everystyle@">@everystyle@</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.pagestyle.@everystyle@">465</a></li>
- <li><a name="pagestyle.empty"></a><a href="#pagestyle.empty">empty</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.pagestyle.empty">239</a>, <a href="scrguide.pdf#desc:scrlayer.pagestyle.empty">465</a></li>
+ <li><a name="pagestyle.@everystyle@"></a><a href="#pagestyle.@everystyle@">@everystyle@</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlayer.pagestyle.@everystyle@">464</a></li>
+ <li><a name="pagestyle.empty"></a><a href="#pagestyle.empty">empty</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.pagestyle.empty">239</a>, <a href="scrguide.pdf#desc:scrlayer.pagestyle.empty">464</a></li>
<li><a name="pagestyle.headings"></a><a href="#pagestyle.headings">headings</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.pagestyle.headings">240</a></li>
<li><a name="pagestyle.letter"></a><a href="#pagestyle.letter">letter</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.pagestyle.letter">241</a></li>
<li><a name="pagestyle.myheadings"></a><a href="#pagestyle.myheadings">myheadings</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrlttr2.pagestyle.myheadings">241</a></li>
@@ -987,7 +985,7 @@
<li><a name="counter.par"></a><a href="#counter.par">par</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.counter.par">334</a></li>
<li><a name="counter.secnumdepth"></a><a href="#counter.secnumdepth">secnumdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:maincls.counter.secnumdepth">120</a></li>
<li><a name="counter.sentence"></a><a href="#counter.sentence">sentence</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:scrjura.counter.sentence">336</a></li>
- <li><a name="counter.tocdepth"></a><a href="#counter.tocdepth">tocdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.counter.tocdepth">410</a>, <a href="scrguide.pdf#desc:maincls.counter.tocdepth">79</a></li>
+ <li><a name="counter.tocdepth"></a><a href="#counter.tocdepth">tocdepth</a> &rarr;&nbsp;<a href="scrguide.pdf#desc:tocbasic.counter.tocdepth">409</a>, <a href="scrguide.pdf#desc:maincls.counter.tocdepth">79</a></li>
</ul>
<h2><a name="floatstyle">Stile für das float-Paket</a></h2>
<ul>
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/scrguide.pdf b/Master/texmf-dist/source/latex/koma-script/doc/scrguide.pdf
index e2b0bd297b8..1af8d213fbc 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/scrguide.pdf
+++ b/Master/texmf-dist/source/latex/koma-script/doc/scrguide.pdf
Binary files differ
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/scrguien.html b/Master/texmf-dist/source/latex/koma-script/doc/scrguien.html
index 7e3ae170307..53c7248b930 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/scrguien.html
+++ b/Master/texmf-dist/source/latex/koma-script/doc/scrguien.html
@@ -19,980 +19,979 @@
</ul>
<h2><a name="option">Options</a></h2>
<ul>
- <li><a name="option.12h"></a><a href="#option.12h">12h</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrtime.option.12h">283</a></li>
+ <li><a name="option.12h"></a><a href="#option.12h">12h</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrtime.option.12h">284</a></li>
<li><a name="option.BCOR"></a><a href="#option.BCOR">BCOR</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.option.BCOR">34</a></li>
<li><a name="option.DIV"></a><a href="#option.DIV">DIV</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.option.DIV">35</a></li>
<li><a name="option.abstract"></a><a href="#option.abstract">abstract</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.abstract">71</a></li>
- <li><a name="option.addrfield"></a><a href="#option.addrfield">addrfield</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.addrfield">202</a></li>
- <li><a name="option.adrFreeIVempty"></a><a href="#option.adrFreeIVempty">adrFreeIVempty</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.option.adrFreeIVempty">287</a></li>
- <li><a name="option.adrFreeIVshow"></a><a href="#option.adrFreeIVshow">adrFreeIVshow</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.option.adrFreeIVshow">287</a></li>
- <li><a name="option.adrFreeIVstop"></a><a href="#option.adrFreeIVstop">adrFreeIVstop</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.option.adrFreeIVstop">287</a></li>
- <li><a name="option.adrFreeIVwarn"></a><a href="#option.adrFreeIVwarn">adrFreeIVwarn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.option.adrFreeIVwarn">287</a></li>
+ <li><a name="option.addrfield"></a><a href="#option.addrfield">addrfield</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.addrfield">203</a></li>
+ <li><a name="option.adrFreeIVempty"></a><a href="#option.adrFreeIVempty">adrFreeIVempty</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.option.adrFreeIVempty">288</a></li>
+ <li><a name="option.adrFreeIVshow"></a><a href="#option.adrFreeIVshow">adrFreeIVshow</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.option.adrFreeIVshow">288</a></li>
+ <li><a name="option.adrFreeIVstop"></a><a href="#option.adrFreeIVstop">adrFreeIVstop</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.option.adrFreeIVstop">288</a></li>
+ <li><a name="option.adrFreeIVwarn"></a><a href="#option.adrFreeIVwarn">adrFreeIVwarn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.option.adrFreeIVwarn">288</a></li>
<li><a name="option.appendixprefix"></a><a href="#option.appendixprefix">appendixprefix</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.appendixprefix">95</a></li>
- <li><a name="option.areasetadvanced"></a><a href="#option.areasetadvanced">areasetadvanced</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.option.areasetadvanced">470</a></li>
- <li><a name="option.autoclearnotecolumns"></a><a href="#option.autoclearnotecolumns">autoclearnotecolumns</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.option.autoclearnotecolumns">467</a></li>
- <li><a name="option.autoenlargeheadfoot"></a><a href="#option.autoenlargeheadfoot">autoenlargeheadfoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.autoenlargeheadfoot">254</a></li>
- <li><a name="option.automark"></a><a href="#option.automark">automark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.automark">269</a>, <a href="scrguien.pdf#desc:scrlayer.option.automark">440</a></li>
- <li><a name="option.autooneside"></a><a href="#option.autooneside">autooneside</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.autooneside">269</a>, <a href="scrguien.pdf#desc:scrlayer.option.autooneside">440</a></li>
- <li><a name="option.backaddress"></a><a href="#option.backaddress">backaddress</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.backaddress">202</a></li>
- <li><a name="option.bibliography"></a><a href="#option.bibliography">bibliography</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.bibliography">146</a></li>
- <li><a name="option.captions"></a><a href="#option.captions">captions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.captions">126</a></li>
- <li><a name="option.chapteratlists"></a><a href="#option.chapteratlists">chapteratlists</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.chapteratlists">99</a></li>
- <li><a name="option.chapterentrydots"></a><a href="#option.chapterentrydots">chapterentrydots</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.chapterentrydots">74</a></li>
+ <li><a name="option.areasetadvanced"></a><a href="#option.areasetadvanced">areasetadvanced</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.option.areasetadvanced">472</a></li>
+ <li><a name="option.autoclearnotecolumns"></a><a href="#option.autoclearnotecolumns">autoclearnotecolumns</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.option.autoclearnotecolumns">469</a></li>
+ <li><a name="option.autoenlargeheadfoot"></a><a href="#option.autoenlargeheadfoot">autoenlargeheadfoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.autoenlargeheadfoot">255</a></li>
+ <li><a name="option.automark"></a><a href="#option.automark">automark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.automark">270</a>, <a href="scrguien.pdf#desc:scrlayer.option.automark">442</a></li>
+ <li><a name="option.autooneside"></a><a href="#option.autooneside">autooneside</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.autooneside">270</a>, <a href="scrguien.pdf#desc:scrlayer.option.autooneside">442</a></li>
+ <li><a name="option.backaddress"></a><a href="#option.backaddress">backaddress</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.backaddress">203</a></li>
+ <li><a name="option.bibliography"></a><a href="#option.bibliography">bibliography</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.bibliography">147</a></li>
+ <li><a name="option.captions"></a><a href="#option.captions">captions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.captions">127</a></li>
+ <li><a name="option.chapteratlists"></a><a href="#option.chapteratlists">chapteratlists</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.chapteratlists">100</a></li>
+ <li><a name="option.chapterentrydots"></a><a href="#option.chapterentrydots">chapterentrydots</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.chapterentrydots">75</a></li>
<li><a name="option.chapterprefix"></a><a href="#option.chapterprefix">chapterprefix</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.chapterprefix">95</a></li>
- <li><a name="option.clausemark"></a><a href="#option.clausemark">clausemark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.clausemark">314</a></li>
- <li><a name="option.cleardoublepage"></a><a href="#option.cleardoublepage">cleardoublepage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.cleardoublepage">231</a>, <a href="scrguien.pdf#desc:scrextend.option.cleardoublepage">300</a>, <a href="scrguien.pdf#desc:maincls.option.cleardoublepage">86</a></li>
- <li><a name="option.clines"></a><a href="#option.clines">clines</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.clines">276</a></li>
- <li><a name="option.contract"></a><a href="#option.contract">contract</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.contract">312</a></li>
- <li><a name="option.deactivatepagestylelayers"></a><a href="#option.deactivatepagestylelayers">deactivatepagestylelayers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.deactivatepagestylelayers">435</a></li>
- <li><a name="option.draft"></a><a href="#option.draft">draft</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.draft">154</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.option.draft">270</a>, <a href="scrguien.pdf#desc:scrextend.option.draft">292</a>, <a href="scrguien.pdf#desc:scrlayer.option.draft">429</a>, <a href="scrguien.pdf#desc:maincls.option.draft">57</a></li>
- <li><a name="option.enlargefirstpage"></a><a href="#option.enlargefirstpage">enlargefirstpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.enlargefirstpage">222</a></li>
- <li><a name="option.extendedfeature"></a><a href="#option.extendedfeature">extendedfeature</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.option.extendedfeature">291</a></li>
- <li><a name="option.firstfoot"></a><a href="#option.firstfoot">firstfoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.firstfoot">222</a></li>
- <li><a name="option.firsthead"></a><a href="#option.firsthead">firsthead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.firsthead">189</a></li>
- <li><a name="option.fleqn"></a><a href="#option.fleqn">fleqn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.fleqn">126</a></li>
- <li><a name="option.foldmarks"></a><a href="#option.foldmarks">foldmarks</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.foldmarks">184</a></li>
- <li><a name="option.fontsize"></a><a href="#option.fontsize">fontsize</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fontsize">177</a>, <a href="scrguien.pdf#desc:scrextend.option.fontsize">292</a>, <a href="scrguien.pdf#desc:maincls.option.fontsize">58</a></li>
- <li><a name="option.footbotline"></a><a href="#option.footbotline">footbotline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.footbotline">276</a></li>
+ <li><a name="option.clausemark"></a><a href="#option.clausemark">clausemark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.clausemark">315</a></li>
+ <li><a name="option.cleardoublepage"></a><a href="#option.cleardoublepage">cleardoublepage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.cleardoublepage">232</a>, <a href="scrguien.pdf#desc:scrextend.option.cleardoublepage">301</a>, <a href="scrguien.pdf#desc:maincls.option.cleardoublepage">87</a></li>
+ <li><a name="option.clines"></a><a href="#option.clines">clines</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.clines">277</a></li>
+ <li><a name="option.contract"></a><a href="#option.contract">contract</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.contract">313</a></li>
+ <li><a name="option.deactivatepagestylelayers"></a><a href="#option.deactivatepagestylelayers">deactivatepagestylelayers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.deactivatepagestylelayers">437</a></li>
+ <li><a name="option.draft"></a><a href="#option.draft">draft</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.draft">155</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.option.draft">271</a>, <a href="scrguien.pdf#desc:scrextend.option.draft">293</a>, <a href="scrguien.pdf#desc:scrlayer.option.draft">431</a>, <a href="scrguien.pdf#desc:maincls.option.draft">57</a></li>
+ <li><a name="option.enlargefirstpage"></a><a href="#option.enlargefirstpage">enlargefirstpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.enlargefirstpage">223</a></li>
+ <li><a name="option.extendedfeature"></a><a href="#option.extendedfeature">extendedfeature</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.option.extendedfeature">292</a></li>
+ <li><a name="option.firstfoot"></a><a href="#option.firstfoot">firstfoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.firstfoot">223</a></li>
+ <li><a name="option.firsthead"></a><a href="#option.firsthead">firsthead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.firsthead">190</a></li>
+ <li><a name="option.fleqn"></a><a href="#option.fleqn">fleqn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.fleqn">127</a></li>
+ <li><a name="option.foldmarks"></a><a href="#option.foldmarks">foldmarks</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.foldmarks">185</a></li>
+ <li><a name="option.fontsize"></a><a href="#option.fontsize">fontsize</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fontsize">178</a>, <a href="scrguien.pdf#desc:scrextend.option.fontsize">293</a>, <a href="scrguien.pdf#desc:maincls.option.fontsize">58</a></li>
+ <li><a name="option.footbotline"></a><a href="#option.footbotline">footbotline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.footbotline">277</a></li>
<li><a name="option.footheight"></a><a href="#option.footheight">footheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.option.footheight">46</a></li>
<li><a name="option.footinclude"></a><a href="#option.footinclude">footinclude</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.option.footinclude">43</a></li>
<li><a name="option.footlines"></a><a href="#option.footlines">footlines</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.option.footlines">46</a></li>
- <li><a name="option.footnotes"></a><a href="#option.footnotes">footnotes</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.footnotes">233</a>, <a href="scrguien.pdf#desc:scrextend.option.footnotes">301</a>, <a href="scrguien.pdf#desc:maincls.option.footnotes">89</a></li>
- <li><a name="option.footsepline"></a><a href="#option.footsepline">footsepline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.footsepline">227</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.option.footsepline">276</a>, <a href="scrguien.pdf#desc:maincls.option.footsepline">80</a></li>
- <li><a name="option.footwidth"></a><a href="#option.footwidth">footwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.footwidth">274</a></li>
- <li><a name="option.fromalign"></a><a href="#option.fromalign">fromalign</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromalign">190</a></li>
- <li><a name="option.fromemail"></a><a href="#option.fromemail">fromemail</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromemail">195</a></li>
- <li><a name="option.fromfax"></a><a href="#option.fromfax">fromfax</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromfax">195</a></li>
- <li><a name="option.fromlogo"></a><a href="#option.fromlogo">fromlogo</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromlogo">199</a></li>
- <li><a name="option.frommobilephone"></a><a href="#option.frommobilephone">frommobilephone</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.frommobilephone">195</a></li>
- <li><a name="option.fromphone"></a><a href="#option.fromphone">fromphone</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromphone">195</a></li>
- <li><a name="option.fromrule"></a><a href="#option.fromrule">fromrule</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromrule">190</a></li>
- <li><a name="option.fromurl"></a><a href="#option.fromurl">fromurl</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromurl">195</a></li>
+ <li><a name="option.footnotes"></a><a href="#option.footnotes">footnotes</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.footnotes">234</a>, <a href="scrguien.pdf#desc:scrextend.option.footnotes">302</a>, <a href="scrguien.pdf#desc:maincls.option.footnotes">89</a></li>
+ <li><a name="option.footsepline"></a><a href="#option.footsepline">footsepline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.footsepline">228</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.option.footsepline">277</a>, <a href="scrguien.pdf#desc:maincls.option.footsepline">80</a></li>
+ <li><a name="option.footwidth"></a><a href="#option.footwidth">footwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.footwidth">275</a></li>
+ <li><a name="option.fromalign"></a><a href="#option.fromalign">fromalign</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromalign">191</a></li>
+ <li><a name="option.fromemail"></a><a href="#option.fromemail">fromemail</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromemail">196</a></li>
+ <li><a name="option.fromfax"></a><a href="#option.fromfax">fromfax</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromfax">196</a></li>
+ <li><a name="option.fromlogo"></a><a href="#option.fromlogo">fromlogo</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromlogo">200</a></li>
+ <li><a name="option.frommobilephone"></a><a href="#option.frommobilephone">frommobilephone</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.frommobilephone">196</a></li>
+ <li><a name="option.fromphone"></a><a href="#option.fromphone">fromphone</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromphone">196</a></li>
+ <li><a name="option.fromrule"></a><a href="#option.fromrule">fromrule</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromrule">191</a></li>
+ <li><a name="option.fromurl"></a><a href="#option.fromurl">fromurl</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.fromurl">196</a></li>
<li><a name="option.headheight"></a><a href="#option.headheight">headheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.option.headheight">45</a></li>
<li><a name="option.headinclude"></a><a href="#option.headinclude">headinclude</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.option.headinclude">43</a></li>
- <li><a name="option.headings"></a><a href="#option.headings">headings</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.headings">96</a></li>
+ <li><a name="option.headings"></a><a href="#option.headings">headings</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.headings">97</a></li>
<li><a name="option.headlines"></a><a href="#option.headlines">headlines</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.option.headlines">45</a></li>
- <li><a name="option.headsepline"></a><a href="#option.headsepline">headsepline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.headsepline">227</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.option.headsepline">276</a>, <a href="scrguien.pdf#desc:maincls.option.headsepline">80</a></li>
- <li><a name="option.headtopline"></a><a href="#option.headtopline">headtopline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.headtopline">276</a></li>
- <li><a name="option.headwidth"></a><a href="#option.headwidth">headwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.headwidth">274</a></li>
- <li><a name="option.hmode"></a><a href="#option.hmode">hmode</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.option.hmode">454</a></li>
- <li><a name="option.ilines"></a><a href="#option.ilines">ilines</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.ilines">276</a></li>
- <li><a name="option.index"></a><a href="#option.index">index</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.index">149</a></li>
- <li><a name="option.internalonly"></a><a href="#option.internalonly">internalonly</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.option.internalonly">358</a></li>
- <li><a name="option.juratitlepagebreak"></a><a href="#option.juratitlepagebreak">juratitlepagebreak</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.juratitlepagebreak">314</a></li>
- <li><a name="option.juratocindent"></a><a href="#option.juratocindent">juratocindent</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.juratocindent">311</a></li>
- <li><a name="option.juratocnumberwidth"></a><a href="#option.juratocnumberwidth">juratocnumberwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.juratocnumberwidth">311</a></li>
- <li><a name="option.juratotoc"></a><a href="#option.juratotoc">juratotoc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.juratotoc">311</a></li>
- <li><a name="option.leqno"></a><a href="#option.leqno">leqno</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.leqno">126</a></li>
- <li><a name="option.listof"></a><a href="#option.listof">listof</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.listof">141</a></li>
- <li><a name="option.locfield"></a><a href="#option.locfield">locfield</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.locfield">208</a></li>
- <li><a name="option.manualmark"></a><a href="#option.manualmark">manualmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.manualmark">269</a>, <a href="scrguien.pdf#desc:scrlayer.option.manualmark">440</a></li>
- <li><a name="option.markcase"></a><a href="#option.markcase">markcase</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.markcase">270</a>, <a href="scrguien.pdf#desc:scrlayer.option.markcase">441</a></li>
+ <li><a name="option.headsepline"></a><a href="#option.headsepline">headsepline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.headsepline">228</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.option.headsepline">277</a>, <a href="scrguien.pdf#desc:maincls.option.headsepline">80</a></li>
+ <li><a name="option.headtopline"></a><a href="#option.headtopline">headtopline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.headtopline">277</a></li>
+ <li><a name="option.headwidth"></a><a href="#option.headwidth">headwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.headwidth">275</a></li>
+ <li><a name="option.hmode"></a><a href="#option.hmode">hmode</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.option.hmode">456</a></li>
+ <li><a name="option.ilines"></a><a href="#option.ilines">ilines</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.ilines">277</a></li>
+ <li><a name="option.index"></a><a href="#option.index">index</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.index">150</a></li>
+ <li><a name="option.internalonly"></a><a href="#option.internalonly">internalonly</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.option.internalonly">359</a></li>
+ <li><a name="option.juratitlepagebreak"></a><a href="#option.juratitlepagebreak">juratitlepagebreak</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.juratitlepagebreak">315</a></li>
+ <li><a name="option.juratocindent"></a><a href="#option.juratocindent">juratocindent</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.juratocindent">312</a></li>
+ <li><a name="option.juratocnumberwidth"></a><a href="#option.juratocnumberwidth">juratocnumberwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.juratocnumberwidth">312</a></li>
+ <li><a name="option.juratotoc"></a><a href="#option.juratotoc">juratotoc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.juratotoc">312</a></li>
+ <li><a name="option.leqno"></a><a href="#option.leqno">leqno</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.leqno">127</a></li>
+ <li><a name="option.listof"></a><a href="#option.listof">listof</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.listof">142</a></li>
+ <li><a name="option.locfield"></a><a href="#option.locfield">locfield</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.locfield">209</a></li>
+ <li><a name="option.manualmark"></a><a href="#option.manualmark">manualmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.manualmark">270</a>, <a href="scrguien.pdf#desc:scrlayer.option.manualmark">442</a></li>
+ <li><a name="option.markcase"></a><a href="#option.markcase">markcase</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.markcase">271</a>, <a href="scrguien.pdf#desc:scrlayer.option.markcase">443</a></li>
<li><a name="option.mpinclude"></a><a href="#option.mpinclude">mpinclude</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.option.mpinclude">44</a></li>
- <li><a name="option.numbers"></a><a href="#option.numbers">numbers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.numbers">98</a></li>
- <li><a name="option.numericaldate"></a><a href="#option.numericaldate">numericaldate</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.numericaldate">210</a></li>
- <li><a name="option.olines"></a><a href="#option.olines">olines</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.olines">276</a></li>
- <li><a name="option.onpsbackground"></a><a href="#option.onpsbackground">onpsbackground</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsbackground">435</a></li>
- <li><a name="option.onpsevenpage"></a><a href="#option.onpsevenpage">onpsevenpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsevenpage">435</a></li>
- <li><a name="option.onpsfloatpage"></a><a href="#option.onpsfloatpage">onpsfloatpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsfloatpage">435</a></li>
- <li><a name="option.onpsforeground"></a><a href="#option.onpsforeground">onpsforeground</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsforeground">435</a></li>
- <li><a name="option.onpsinit"></a><a href="#option.onpsinit">onpsinit</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsinit">435</a></li>
- <li><a name="option.onpsnonfloatpage"></a><a href="#option.onpsnonfloatpage">onpsnonfloatpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsnonfloatpage">435</a></li>
- <li><a name="option.onpsoddpage"></a><a href="#option.onpsoddpage">onpsoddpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsoddpage">435</a></li>
- <li><a name="option.onpsoneside"></a><a href="#option.onpsoneside">onpsoneside</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsoneside">435</a></li>
- <li><a name="option.onpsselect"></a><a href="#option.onpsselect">onpsselect</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsselect">435</a></li>
- <li><a name="option.onpstwoside"></a><a href="#option.onpstwoside">onpstwoside</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpstwoside">435</a></li>
- <li><a name="option.open"></a><a href="#option.open">open</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.open">94</a></li>
- <li><a name="option.origlongtable"></a><a href="#option.origlongtable">origlongtable</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.origlongtable">141</a></li>
- <li><a name="option.overfullrule"></a><a href="#option.overfullrule">overfullrule</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.overfullrule">154</a>, <a href="scrguien.pdf#desc:scrextend.option.overfullrule">292</a>, <a href="scrguien.pdf#desc:maincls.option.overfullrule">57</a></li>
- <li><a name="option.pagenumber"></a><a href="#option.pagenumber">pagenumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.pagenumber">228</a></li>
+ <li><a name="option.numbers"></a><a href="#option.numbers">numbers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.numbers">99</a></li>
+ <li><a name="option.numericaldate"></a><a href="#option.numericaldate">numericaldate</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.numericaldate">211</a></li>
+ <li><a name="option.olines"></a><a href="#option.olines">olines</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.olines">277</a></li>
+ <li><a name="option.onpsbackground"></a><a href="#option.onpsbackground">onpsbackground</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsbackground">437</a></li>
+ <li><a name="option.onpsevenpage"></a><a href="#option.onpsevenpage">onpsevenpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsevenpage">437</a></li>
+ <li><a name="option.onpsfloatpage"></a><a href="#option.onpsfloatpage">onpsfloatpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsfloatpage">437</a></li>
+ <li><a name="option.onpsforeground"></a><a href="#option.onpsforeground">onpsforeground</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsforeground">437</a></li>
+ <li><a name="option.onpsinit"></a><a href="#option.onpsinit">onpsinit</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsinit">437</a></li>
+ <li><a name="option.onpsnonfloatpage"></a><a href="#option.onpsnonfloatpage">onpsnonfloatpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsnonfloatpage">437</a></li>
+ <li><a name="option.onpsoddpage"></a><a href="#option.onpsoddpage">onpsoddpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsoddpage">437</a></li>
+ <li><a name="option.onpsoneside"></a><a href="#option.onpsoneside">onpsoneside</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsoneside">437</a></li>
+ <li><a name="option.onpsselect"></a><a href="#option.onpsselect">onpsselect</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpsselect">437</a></li>
+ <li><a name="option.onpstwoside"></a><a href="#option.onpstwoside">onpstwoside</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.onpstwoside">437</a></li>
+ <li><a name="option.open"></a><a href="#option.open">open</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.open">95</a></li>
+ <li><a name="option.origlongtable"></a><a href="#option.origlongtable">origlongtable</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.origlongtable">142</a></li>
+ <li><a name="option.overfullrule"></a><a href="#option.overfullrule">overfullrule</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.overfullrule">155</a>, <a href="scrguien.pdf#desc:scrextend.option.overfullrule">293</a>, <a href="scrguien.pdf#desc:maincls.option.overfullrule">57</a></li>
+ <li><a name="option.pagenumber"></a><a href="#option.pagenumber">pagenumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.pagenumber">229</a></li>
<li><a name="option.pagesize"></a><a href="#option.pagesize">pagesize</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.option.pagesize">50</a></li>
- <li><a name="option.pagestyleset"></a><a href="#option.pagestyleset">pagestyleset</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.pagestyleset">266</a></li>
+ <li><a name="option.pagestyleset"></a><a href="#option.pagestyleset">pagestyleset</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.pagestyleset">267</a></li>
<li><a name="option.paper"></a><a href="#option.paper">paper</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.option.paper">48</a></li>
- <li><a name="option.parnumber"></a><a href="#option.parnumber">parnumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.parnumber">315</a></li>
- <li><a name="option.parskip"></a><a href="#option.parskip">parskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.parskip">225</a>, <a href="scrguien.pdf#desc:maincls.option.parskip">77</a></li>
- <li><a name="option.plainfootbotline"></a><a href="#option.plainfootbotline">plainfootbotline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.plainfootbotline">276</a></li>
- <li><a name="option.plainfootsepline"></a><a href="#option.plainfootsepline">plainfootsepline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.plainfootsepline">276</a></li>
- <li><a name="option.plainheadsepline"></a><a href="#option.plainheadsepline">plainheadsepline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.plainheadsepline">276</a></li>
- <li><a name="option.plainheadtopline"></a><a href="#option.plainheadtopline">plainheadtopline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.plainheadtopline">276</a></li>
- <li><a name="option.priority"></a><a href="#option.priority">priority</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.priority">202</a></li>
- <li><a name="option.ref"></a><a href="#option.ref">ref</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.ref">319</a></li>
- <li><a name="option.refline"></a><a href="#option.refline">refline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.refline">211</a></li>
- <li><a name="option.sectionentrydots"></a><a href="#option.sectionentrydots">sectionentrydots</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.sectionentrydots">74</a></li>
- <li><a name="option.singlespacing"></a><a href="#option.singlespacing">singlespacing</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.singlespacing">435</a></li>
- <li><a name="option.subject"></a><a href="#option.subject">subject</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.subject">216</a></li>
- <li><a name="option.symbolicnames"></a><a href="#option.symbolicnames">symbolicnames</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.symbolicnames">195</a></li>
- <li><a name="option.titlepage"></a><a href="#option.titlepage">titlepage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.option.titlepage">295</a>, <a href="scrguien.pdf#desc:maincls.option.titlepage">64</a></li>
+ <li><a name="option.parnumber"></a><a href="#option.parnumber">parnumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.parnumber">316</a></li>
+ <li><a name="option.parskip"></a><a href="#option.parskip">parskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.parskip">226</a>, <a href="scrguien.pdf#desc:maincls.option.parskip">78</a></li>
+ <li><a name="option.plainfootbotline"></a><a href="#option.plainfootbotline">plainfootbotline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.plainfootbotline">277</a></li>
+ <li><a name="option.plainfootsepline"></a><a href="#option.plainfootsepline">plainfootsepline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.plainfootsepline">277</a></li>
+ <li><a name="option.plainheadsepline"></a><a href="#option.plainheadsepline">plainheadsepline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.plainheadsepline">277</a></li>
+ <li><a name="option.plainheadtopline"></a><a href="#option.plainheadtopline">plainheadtopline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.option.plainheadtopline">277</a></li>
+ <li><a name="option.priority"></a><a href="#option.priority">priority</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.priority">203</a></li>
+ <li><a name="option.ref"></a><a href="#option.ref">ref</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.option.ref">320</a></li>
+ <li><a name="option.refline"></a><a href="#option.refline">refline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.refline">212</a></li>
+ <li><a name="option.sectionentrydots"></a><a href="#option.sectionentrydots">sectionentrydots</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.sectionentrydots">75</a></li>
+ <li><a name="option.singlespacing"></a><a href="#option.singlespacing">singlespacing</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.option.singlespacing">437</a></li>
+ <li><a name="option.subject"></a><a href="#option.subject">subject</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.subject">217</a></li>
+ <li><a name="option.symbolicnames"></a><a href="#option.symbolicnames">symbolicnames</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.symbolicnames">196</a></li>
+ <li><a name="option.titlepage"></a><a href="#option.titlepage">titlepage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.option.titlepage">296</a>, <a href="scrguien.pdf#desc:maincls.option.titlepage">65</a></li>
<li><a name="option.toc"></a><a href="#option.toc">toc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.option.toc">72</a></li>
<li><a name="option.twocolumn"></a><a href="#option.twocolumn">twocolumn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.option.twocolumn">42</a></li>
<li><a name="option.twoside"></a><a href="#option.twoside">twoside</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.option.twoside">41</a></li>
- <li><a name="option.usegeometry"></a><a href="#option.usegeometry">usegeometry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.option.usegeometry">469</a></li>
- <li><a name="option.version"></a><a href="#option.version">version</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.version">153</a>, <a href="scrguien.pdf#desc:scrextend.option.version">291</a>, <a href="scrguien.pdf#desc:typearea.option.version">33</a>, <a href="scrguien.pdf#desc:maincls.option.version">56</a></li>
+ <li><a name="option.usegeometry"></a><a href="#option.usegeometry">usegeometry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.option.usegeometry">471</a></li>
+ <li><a name="option.version"></a><a href="#option.version">version</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.option.version">154</a>, <a href="scrguien.pdf#desc:scrextend.option.version">292</a>, <a href="scrguien.pdf#desc:typearea.option.version">33</a>, <a href="scrguien.pdf#desc:maincls.option.version">56</a></li>
+ <li><a name="option.withdeprecated"></a><a href="#option.withdeprecated">withdeprecated</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.option.withdeprecated">361</a></li>
</ul>
<h2><a name="macro">Commands</a></h2>
<ul>
- <li><a name="cmd.@fontsizefilebase"></a><a href="#cmd.@fontsizefilebase">\@fontsizefilebase</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.@fontsizefilebase">476</a></li>
- <li><a name="cmd.@mkboth"></a><a href="#cmd.@mkboth">\@mkboth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.@mkboth">445</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.@mkboth">449</a></li>
- <li><a name="cmd.@mkdouble"></a><a href="#cmd.@mkdouble">\@mkdouble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.@mkdouble">445</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.@mkdouble">449</a></li>
- <li><a name="cmd.@mkleft"></a><a href="#cmd.@mkleft">\@mkleft</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.@mkleft">445</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.@mkleft">449</a></li>
- <li><a name="cmd.@mkright"></a><a href="#cmd.@mkright">\@mkright</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.@mkright">445</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.@mkright">449</a></li>
- <li><a name="cmd.@openbib@code"></a><a href="#cmd.@openbib@code">\@openbib@code</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.@openbib@code">500</a></li>
- <li><a name="cmd.AddLayersAtBeginOfPageStyle"></a><a href="#cmd.AddLayersAtBeginOfPageStyle">\AddLayersAtBeginOfPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AddLayersAtBeginOfPageStyle">436</a></li>
- <li><a name="cmd.AddLayersAtEndOfPageStyle"></a><a href="#cmd.AddLayersAtEndOfPageStyle">\AddLayersAtEndOfPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AddLayersAtEndOfPageStyle">436</a></li>
- <li><a name="cmd.AddLayersToPageStyle"></a><a href="#cmd.AddLayersToPageStyle">\AddLayersToPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AddLayersToPageStyle">436</a></li>
- <li><a name="cmd.AddLayersToPageStyleAfterLayer"></a><a href="#cmd.AddLayersToPageStyleAfterLayer">\AddLayersToPageStyleAfterLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AddLayersToPageStyleAfterLayer">437</a></li>
- <li><a name="cmd.AddLayersToPageStyleBeforeLayer"></a><a href="#cmd.AddLayersToPageStyleBeforeLayer">\AddLayersToPageStyleBeforeLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AddLayersToPageStyleBeforeLayer">437</a></li>
- <li><a name="cmd.AddToLayerPageStyleOptions"></a><a href="#cmd.AddToLayerPageStyleOptions">\AddToLayerPageStyleOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AddToLayerPageStyleOptions">437</a></li>
- <li><a name="cmd.Address"></a><a href="#cmd.Address">\Address</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.Address">285</a></li>
- <li><a name="cmd.AddtoDoHook"></a><a href="#cmd.AddtoDoHook">\AddtoDoHook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.AddtoDoHook">356</a></li>
- <li><a name="cmd.AddtoOneTimeDoHook"></a><a href="#cmd.AddtoOneTimeDoHook">\AddtoOneTimeDoHook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.AddtoOneTimeDoHook">356</a></li>
- <li><a name="cmd.AfterAtEndOfClass"></a><a href="#cmd.AfterAtEndOfClass">\AfterAtEndOfClass</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterAtEndOfClass">361</a></li>
- <li><a name="cmd.AfterAtEndOfPackage"></a><a href="#cmd.AfterAtEndOfPackage">\AfterAtEndOfPackage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterAtEndOfPackage">361</a></li>
- <li><a name="cmd.AfterBibliographyPreamble"></a><a href="#cmd.AfterBibliographyPreamble">\AfterBibliographyPreamble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.AfterBibliographyPreamble">148</a></li>
- <li><a name="cmd.AfterCalculatingTypearea*"></a><a href="#cmd.AfterCalculatingTypearea*">\AfterCalculatingTypearea*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.AfterCalculatingTypearea*">471</a></li>
- <li><a name="cmd.AfterCalculatingTypearea"></a><a href="#cmd.AfterCalculatingTypearea">\AfterCalculatingTypearea</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.AfterCalculatingTypearea">471</a></li>
- <li><a name="cmd.AfterClass!"></a><a href="#cmd.AfterClass!">\AfterClass!</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterClass!">361</a></li>
- <li><a name="cmd.AfterClass*"></a><a href="#cmd.AfterClass*">\AfterClass*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterClass*">361</a></li>
- <li><a name="cmd.AfterClass+"></a><a href="#cmd.AfterClass+">\AfterClass+</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterClass+">361</a></li>
- <li><a name="cmd.AfterClass"></a><a href="#cmd.AfterClass">\AfterClass</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterClass">361</a></li>
- <li><a name="cmd.AfterFile"></a><a href="#cmd.AfterFile">\AfterFile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterFile">360</a></li>
- <li><a name="cmd.AfterPackage!"></a><a href="#cmd.AfterPackage!">\AfterPackage!</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterPackage!">361</a></li>
- <li><a name="cmd.AfterPackage*"></a><a href="#cmd.AfterPackage*">\AfterPackage*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterPackage*">361</a></li>
- <li><a name="cmd.AfterPackage+"></a><a href="#cmd.AfterPackage+">\AfterPackage+</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterPackage+">361</a></li>
- <li><a name="cmd.AfterPackage"></a><a href="#cmd.AfterPackage">\AfterPackage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterPackage">361</a></li>
- <li><a name="cmd.AfterReadingMainAux"></a><a href="#cmd.AfterReadingMainAux">\AfterReadingMainAux</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterReadingMainAux">363</a></li>
- <li><a name="cmd.AfterRestoreareas*"></a><a href="#cmd.AfterRestoreareas*">\AfterRestoreareas*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.AfterRestoreareas*">470</a></li>
- <li><a name="cmd.AfterRestoreareas"></a><a href="#cmd.AfterRestoreareas">\AfterRestoreareas</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.AfterRestoreareas">470</a></li>
- <li><a name="cmd.AfterSelectAnyPageStyle"></a><a href="#cmd.AfterSelectAnyPageStyle">\AfterSelectAnyPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AfterSelectAnyPageStyle">431</a></li>
- <li><a name="cmd.AfterSettingArea*"></a><a href="#cmd.AfterSettingArea*">\AfterSettingArea*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.AfterSettingArea*">471</a></li>
- <li><a name="cmd.AfterSettingArea"></a><a href="#cmd.AfterSettingArea">\AfterSettingArea</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.AfterSettingArea">471</a></li>
- <li><a name="cmd.AfterStartingTOC"></a><a href="#cmd.AfterStartingTOC">\AfterStartingTOC</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.AfterStartingTOC">381</a></li>
- <li><a name="cmd.AfterTOCHead"></a><a href="#cmd.AfterTOCHead">\AfterTOCHead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.AfterTOCHead">381</a></li>
- <li><a name="cmd.At@startsection"></a><a href="#cmd.At@startsection">\At@startsection</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.At@startsection">498</a></li>
- <li><a name="cmd.AtAddToTocList"></a><a href="#cmd.AtAddToTocList">\AtAddToTocList</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.AtAddToTocList">376</a></li>
- <li><a name="cmd.AtBeginLetter"></a><a href="#cmd.AtBeginLetter">\AtBeginLetter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.AtBeginLetter">169</a></li>
- <li><a name="cmd.AtEndBibliography"></a><a href="#cmd.AtEndBibliography">\AtEndBibliography</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.AtEndBibliography">148</a></li>
- <li><a name="cmd.AtEndLetter"></a><a href="#cmd.AtEndLetter">\AtEndLetter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.AtEndLetter">169</a></li>
- <li><a name="cmd.AtEndOfFamilyOptions*"></a><a href="#cmd.AtEndOfFamilyOptions*">\AtEndOfFamilyOptions*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.AtEndOfFamilyOptions*">338</a></li>
- <li><a name="cmd.AtEndOfFamilyOptions"></a><a href="#cmd.AtEndOfFamilyOptions">\AtEndOfFamilyOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.AtEndOfFamilyOptions">338</a></li>
- <li><a name="cmd.Before@sect"></a><a href="#cmd.Before@sect">\Before@sect</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.Before@sect">498</a></li>
- <li><a name="cmd.Before@ssect"></a><a href="#cmd.Before@ssect">\Before@ssect</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.Before@ssect">498</a></li>
- <li><a name="cmd.BeforeClass"></a><a href="#cmd.BeforeClass">\BeforeClass</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.BeforeClass">360</a></li>
- <li><a name="cmd.BeforeClosingMainAux"></a><a href="#cmd.BeforeClosingMainAux">\BeforeClosingMainAux</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.BeforeClosingMainAux">363</a></li>
- <li><a name="cmd.BeforeFamilyProcessOptions"></a><a href="#cmd.BeforeFamilyProcessOptions">\BeforeFamilyProcessOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.BeforeFamilyProcessOptions">335</a></li>
- <li><a name="cmd.BeforeFile"></a><a href="#cmd.BeforeFile">\BeforeFile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.BeforeFile">360</a></li>
- <li><a name="cmd.BeforePackage"></a><a href="#cmd.BeforePackage">\BeforePackage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.BeforePackage">360</a></li>
- <li><a name="cmd.BeforeRestoreareas*"></a><a href="#cmd.BeforeRestoreareas*">\BeforeRestoreareas*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.BeforeRestoreareas*">470</a></li>
- <li><a name="cmd.BeforeRestoreareas"></a><a href="#cmd.BeforeRestoreareas">\BeforeRestoreareas</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.BeforeRestoreareas">470</a></li>
- <li><a name="cmd.BeforeSelectAnyPageStyle"></a><a href="#cmd.BeforeSelectAnyPageStyle">\BeforeSelectAnyPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.BeforeSelectAnyPageStyle">431</a></li>
- <li><a name="cmd.BeforeStartingTOC"></a><a href="#cmd.BeforeStartingTOC">\BeforeStartingTOC</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.BeforeStartingTOC">381</a></li>
- <li><a name="cmd.BeforeTOCHead"></a><a href="#cmd.BeforeTOCHead">\BeforeTOCHead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.BeforeTOCHead">381</a></li>
- <li><a name="cmd.BreakBibliography"></a><a href="#cmd.BreakBibliography">\BreakBibliography</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.BreakBibliography">148</a></li>
- <li><a name="cmd.CenturyPart"></a><a href="#cmd.CenturyPart">\CenturyPart</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.CenturyPart">277</a></li>
- <li><a name="cmd.Clause"></a><a href="#cmd.Clause">\Clause</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.Clause">312</a></li>
- <li><a name="cmd.Clauseformat"></a><a href="#cmd.Clauseformat">\Clauseformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.Clauseformat">314</a></li>
- <li><a name="cmd.CloneTOCEntryStyle"></a><a href="#cmd.CloneTOCEntryStyle">\CloneTOCEntryStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.CloneTOCEntryStyle">398</a></li>
- <li><a name="cmd.Comment"></a><a href="#cmd.Comment">\Comment</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.Comment">285</a></li>
- <li><a name="cmd.DayName"></a><a href="#cmd.DayName">\DayName</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.DayName">278</a></li>
- <li><a name="cmd.DayNameByNumber"></a><a href="#cmd.DayNameByNumber">\DayNameByNumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.DayNameByNumber">278</a></li>
- <li><a name="cmd.DayNumber"></a><a href="#cmd.DayNumber">\DayNumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.DayNumber">277</a></li>
- <li><a name="cmd.DecadePart"></a><a href="#cmd.DecadePart">\DecadePart</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.DecadePart">277</a></li>
- <li><a name="cmd.DeclareLayer"></a><a href="#cmd.DeclareLayer">\DeclareLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclareLayer">420</a></li>
- <li><a name="cmd.DeclareNewJuraEnvironment"></a><a href="#cmd.DeclareNewJuraEnvironment">\DeclareNewJuraEnvironment</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.DeclareNewJuraEnvironment">319</a></li>
- <li><a name="cmd.DeclareNewLayer"></a><a href="#cmd.DeclareNewLayer">\DeclareNewLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclareNewLayer">420</a></li>
- <li><a name="cmd.DeclareNewNoteColumn"></a><a href="#cmd.DeclareNewNoteColumn">\DeclareNewNoteColumn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.DeclareNewNoteColumn">459</a></li>
- <li><a name="cmd.DeclareNewPageStyleAlias"></a><a href="#cmd.DeclareNewPageStyleAlias">\DeclareNewPageStyleAlias</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclareNewPageStyleAlias">431</a></li>
- <li><a name="cmd.DeclareNewPageStyleByLayers"></a><a href="#cmd.DeclareNewPageStyleByLayers">\DeclareNewPageStyleByLayers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclareNewPageStyleByLayers">432</a></li>
- <li><a name="cmd.DeclareNewSectionCommand"></a><a href="#cmd.DeclareNewSectionCommand">\DeclareNewSectionCommand</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.DeclareNewSectionCommand">479</a></li>
- <li><a name="cmd.DeclareNewSectionCommands"></a><a href="#cmd.DeclareNewSectionCommands">\DeclareNewSectionCommands</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.DeclareNewSectionCommands">489</a></li>
- <li><a name="cmd.DeclareNewTOC"></a><a href="#cmd.DeclareNewTOC">\DeclareNewTOC</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DeclareNewTOC">404</a></li>
- <li><a name="cmd.DeclareNoteColumn"></a><a href="#cmd.DeclareNoteColumn">\DeclareNoteColumn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.DeclareNoteColumn">459</a></li>
- <li><a name="cmd.DeclarePageStyleAlias"></a><a href="#cmd.DeclarePageStyleAlias">\DeclarePageStyleAlias</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclarePageStyleAlias">431</a></li>
- <li><a name="cmd.DeclarePageStyleByLayers"></a><a href="#cmd.DeclarePageStyleByLayers">\DeclarePageStyleByLayers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclarePageStyleByLayers">432</a></li>
- <li><a name="cmd.DeclareSectionCommand"></a><a href="#cmd.DeclareSectionCommand">\DeclareSectionCommand</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.DeclareSectionCommand">479</a></li>
- <li><a name="cmd.DeclareSectionCommands"></a><a href="#cmd.DeclareSectionCommands">\DeclareSectionCommands</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.DeclareSectionCommands">489</a></li>
- <li><a name="cmd.DeclareSectionNumberDepth"></a><a href="#cmd.DeclareSectionNumberDepth">\DeclareSectionNumberDepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclareSectionNumberDepth">418</a></li>
- <li><a name="cmd.DeclareTOCEntryStyle"></a><a href="#cmd.DeclareTOCEntryStyle">\DeclareTOCEntryStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DeclareTOCEntryStyle">396</a></li>
- <li><a name="cmd.DeclareTOCStyleEntries"></a><a href="#cmd.DeclareTOCStyleEntries">\DeclareTOCStyleEntries</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DeclareTOCStyleEntries">386</a></li>
- <li><a name="cmd.DeclareTOCStyleEntry"></a><a href="#cmd.DeclareTOCStyleEntry">\DeclareTOCStyleEntry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DeclareTOCStyleEntry">386</a></li>
- <li><a name="cmd.DefineFamily"></a><a href="#cmd.DefineFamily">\DefineFamily</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.DefineFamily">331</a></li>
- <li><a name="cmd.DefineFamilyKey"></a><a href="#cmd.DefineFamilyKey">\DefineFamilyKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.DefineFamilyKey">332</a></li>
- <li><a name="cmd.DefineFamilyMember"></a><a href="#cmd.DefineFamilyMember">\DefineFamilyMember</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.DefineFamilyMember">331</a></li>
- <li><a name="cmd.DefineTOCEntryBooleanOption"></a><a href="#cmd.DefineTOCEntryBooleanOption">\DefineTOCEntryBooleanOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DefineTOCEntryBooleanOption">396</a></li>
- <li><a name="cmd.DefineTOCEntryCommandOption"></a><a href="#cmd.DefineTOCEntryCommandOption">\DefineTOCEntryCommandOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DefineTOCEntryCommandOption">396</a></li>
- <li><a name="cmd.DefineTOCEntryIfOption"></a><a href="#cmd.DefineTOCEntryIfOption">\DefineTOCEntryIfOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DefineTOCEntryIfOption">396</a></li>
- <li><a name="cmd.DefineTOCEntryLengthOption"></a><a href="#cmd.DefineTOCEntryLengthOption">\DefineTOCEntryLengthOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DefineTOCEntryLengthOption">396</a></li>
- <li><a name="cmd.DefineTOCEntryNumberOption"></a><a href="#cmd.DefineTOCEntryNumberOption">\DefineTOCEntryNumberOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DefineTOCEntryNumberOption">396</a></li>
- <li><a name="cmd.DefineTOCEntryOption"></a><a href="#cmd.DefineTOCEntryOption">\DefineTOCEntryOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DefineTOCEntryOption">396</a></li>
- <li><a name="cmd.DestroyLayer"></a><a href="#cmd.DestroyLayer">\DestroyLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DestroyLayer">429</a></li>
- <li><a name="cmd.DestroyPageStyleAlias"></a><a href="#cmd.DestroyPageStyleAlias">\DestroyPageStyleAlias</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DestroyPageStyleAlias">432</a></li>
- <li><a name="cmd.DestroyRealLayerPageStyle"></a><a href="#cmd.DestroyRealLayerPageStyle">\DestroyRealLayerPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DestroyRealLayerPageStyle">438</a></li>
- <li><a name="cmd.ExecuteDoHook"></a><a href="#cmd.ExecuteDoHook">\ExecuteDoHook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.ExecuteDoHook">355</a></li>
- <li><a name="cmd.FamilyBoolKey"></a><a href="#cmd.FamilyBoolKey">\FamilyBoolKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyBoolKey">338</a></li>
- <li><a name="cmd.FamilyCSKey"></a><a href="#cmd.FamilyCSKey">\FamilyCSKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyCSKey">342</a></li>
- <li><a name="cmd.FamilyCounterKey"></a><a href="#cmd.FamilyCounterKey">\FamilyCounterKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyCounterKey">341</a></li>
- <li><a name="cmd.FamilyCounterMacroKey"></a><a href="#cmd.FamilyCounterMacroKey">\FamilyCounterMacroKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyCounterMacroKey">342</a></li>
- <li><a name="cmd.FamilyElseValues"></a><a href="#cmd.FamilyElseValues">\FamilyElseValues</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyElseValues">358</a></li>
- <li><a name="cmd.FamilyExecuteOptions"></a><a href="#cmd.FamilyExecuteOptions">\FamilyExecuteOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyExecuteOptions">335</a></li>
- <li><a name="cmd.FamilyInverseBoolKey"></a><a href="#cmd.FamilyInverseBoolKey">\FamilyInverseBoolKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyInverseBoolKey">340</a></li>
- <li><a name="cmd.FamilyKeyState"></a><a href="#cmd.FamilyKeyState">\FamilyKeyState</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyKeyState">332</a></li>
- <li><a name="cmd.FamilyKeyStateNeedValue"></a><a href="#cmd.FamilyKeyStateNeedValue">\FamilyKeyStateNeedValue</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyKeyStateNeedValue">332</a></li>
- <li><a name="cmd.FamilyKeyStateProcessed"></a><a href="#cmd.FamilyKeyStateProcessed">\FamilyKeyStateProcessed</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyKeyStateProcessed">332</a></li>
- <li><a name="cmd.FamilyKeyStateUnknown"></a><a href="#cmd.FamilyKeyStateUnknown">\FamilyKeyStateUnknown</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyKeyStateUnknown">332</a></li>
- <li><a name="cmd.FamilyKeyStateUnknownValue"></a><a href="#cmd.FamilyKeyStateUnknownValue">\FamilyKeyStateUnknownValue</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyKeyStateUnknownValue">332</a></li>
- <li><a name="cmd.FamilyLengthKey"></a><a href="#cmd.FamilyLengthKey">\FamilyLengthKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyLengthKey">342</a></li>
- <li><a name="cmd.FamilyLengthMacroKey"></a><a href="#cmd.FamilyLengthMacroKey">\FamilyLengthMacroKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyLengthMacroKey">342</a></li>
- <li><a name="cmd.FamilyNumericalKey"></a><a href="#cmd.FamilyNumericalKey">\FamilyNumericalKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyNumericalKey">340</a></li>
- <li><a name="cmd.FamilyOption"></a><a href="#cmd.FamilyOption">\FamilyOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyOption">337</a></li>
- <li><a name="cmd.FamilyOptions"></a><a href="#cmd.FamilyOptions">\FamilyOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyOptions">336</a></li>
- <li><a name="cmd.FamilyProcessOptions"></a><a href="#cmd.FamilyProcessOptions">\FamilyProcessOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyProcessOptions">334</a></li>
- <li><a name="cmd.FamilySetBool"></a><a href="#cmd.FamilySetBool">\FamilySetBool</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetBool">338</a></li>
- <li><a name="cmd.FamilySetCounter"></a><a href="#cmd.FamilySetCounter">\FamilySetCounter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetCounter">341</a></li>
- <li><a name="cmd.FamilySetCounterMacro"></a><a href="#cmd.FamilySetCounterMacro">\FamilySetCounterMacro</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetCounterMacro">342</a></li>
- <li><a name="cmd.FamilySetInverseBool"></a><a href="#cmd.FamilySetInverseBool">\FamilySetInverseBool</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetInverseBool">340</a></li>
- <li><a name="cmd.FamilySetLength"></a><a href="#cmd.FamilySetLength">\FamilySetLength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetLength">342</a></li>
- <li><a name="cmd.FamilySetLengthMacro"></a><a href="#cmd.FamilySetLengthMacro">\FamilySetLengthMacro</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetLengthMacro">342</a></li>
- <li><a name="cmd.FamilySetNumerical"></a><a href="#cmd.FamilySetNumerical">\FamilySetNumerical</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetNumerical">340</a></li>
- <li><a name="cmd.FamilySetUseLengthMacro"></a><a href="#cmd.FamilySetUseLengthMacro">\FamilySetUseLengthMacro</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetUseLengthMacro">342</a></li>
- <li><a name="cmd.FamilyStringKey"></a><a href="#cmd.FamilyStringKey">\FamilyStringKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyStringKey">342</a></li>
- <li><a name="cmd.FamilyUnknownKeyValue"></a><a href="#cmd.FamilyUnknownKeyValue">\FamilyUnknownKeyValue</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyUnknownKeyValue">343</a></li>
- <li><a name="cmd.FamilyUseLengthMacroKey"></a><a href="#cmd.FamilyUseLengthMacroKey">\FamilyUseLengthMacroKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyUseLengthMacroKey">342</a></li>
- <li><a name="cmd.FirstName"></a><a href="#cmd.FirstName">\FirstName</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.FirstName">285</a></li>
- <li><a name="cmd.ForDoHook"></a><a href="#cmd.ForDoHook">\ForDoHook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.ForDoHook">357</a></li>
- <li><a name="cmd.ForEachLayerOfPageStyle*"></a><a href="#cmd.ForEachLayerOfPageStyle*">\ForEachLayerOfPageStyle*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ForEachLayerOfPageStyle*">435</a></li>
- <li><a name="cmd.ForEachLayerOfPageStyle"></a><a href="#cmd.ForEachLayerOfPageStyle">\ForEachLayerOfPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ForEachLayerOfPageStyle">435</a></li>
- <li><a name="cmd.FreeI"></a><a href="#cmd.FreeI">\FreeI</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.FreeI">285</a></li>
- <li><a name="cmd.FreeII"></a><a href="#cmd.FreeII">\FreeII</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.FreeII">285</a></li>
- <li><a name="cmd.FreeIII"></a><a href="#cmd.FreeIII">\FreeIII</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.FreeIII">285</a></li>
- <li><a name="cmd.FreeIV"></a><a href="#cmd.FreeIV">\FreeIV</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.FreeIV">285</a></li>
- <li><a name="cmd.GenericMarkFormat"></a><a href="#cmd.GenericMarkFormat">\GenericMarkFormat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.GenericMarkFormat">444</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.GenericMarkFormat">447</a></li>
- <li><a name="cmd.GetLayerContents"></a><a href="#cmd.GetLayerContents">\GetLayerContents</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.GetLayerContents">429</a></li>
- <li><a name="cmd.GetRealPageStyle"></a><a href="#cmd.GetRealPageStyle">\GetRealPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.GetRealPageStyle">432</a></li>
- <li><a name="cmd.ISODayName"></a><a href="#cmd.ISODayName">\ISODayName</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.ISODayName">278</a></li>
- <li><a name="cmd.ISODayNumber"></a><a href="#cmd.ISODayNumber">\ISODayNumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.ISODayNumber">277</a></li>
- <li><a name="cmd.ISOToday"></a><a href="#cmd.ISOToday">\ISOToday</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.ISOToday">279</a></li>
- <li><a name="cmd.IfActiveMkBoth"></a><a href="#cmd.IfActiveMkBoth">\IfActiveMkBoth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.IfActiveMkBoth">348</a></li>
+ <li><a name="cmd.@fontsizefilebase"></a><a href="#cmd.@fontsizefilebase">\@fontsizefilebase</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.@fontsizefilebase">478</a></li>
+ <li><a name="cmd.@mkboth"></a><a href="#cmd.@mkboth">\@mkboth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.@mkboth">447</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.@mkboth">451</a></li>
+ <li><a name="cmd.@mkdouble"></a><a href="#cmd.@mkdouble">\@mkdouble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.@mkdouble">447</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.@mkdouble">451</a></li>
+ <li><a name="cmd.@mkleft"></a><a href="#cmd.@mkleft">\@mkleft</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.@mkleft">447</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.@mkleft">451</a></li>
+ <li><a name="cmd.@mkright"></a><a href="#cmd.@mkright">\@mkright</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.@mkright">447</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.@mkright">451</a></li>
+ <li><a name="cmd.@openbib@code"></a><a href="#cmd.@openbib@code">\@openbib@code</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.@openbib@code">502</a></li>
+ <li><a name="cmd.AddLayersAtBeginOfPageStyle"></a><a href="#cmd.AddLayersAtBeginOfPageStyle">\AddLayersAtBeginOfPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AddLayersAtBeginOfPageStyle">438</a></li>
+ <li><a name="cmd.AddLayersAtEndOfPageStyle"></a><a href="#cmd.AddLayersAtEndOfPageStyle">\AddLayersAtEndOfPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AddLayersAtEndOfPageStyle">438</a></li>
+ <li><a name="cmd.AddLayersToPageStyle"></a><a href="#cmd.AddLayersToPageStyle">\AddLayersToPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AddLayersToPageStyle">438</a></li>
+ <li><a name="cmd.AddLayersToPageStyleAfterLayer"></a><a href="#cmd.AddLayersToPageStyleAfterLayer">\AddLayersToPageStyleAfterLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AddLayersToPageStyleAfterLayer">439</a></li>
+ <li><a name="cmd.AddLayersToPageStyleBeforeLayer"></a><a href="#cmd.AddLayersToPageStyleBeforeLayer">\AddLayersToPageStyleBeforeLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AddLayersToPageStyleBeforeLayer">439</a></li>
+ <li><a name="cmd.AddToLayerPageStyleOptions"></a><a href="#cmd.AddToLayerPageStyleOptions">\AddToLayerPageStyleOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AddToLayerPageStyleOptions">439</a></li>
+ <li><a name="cmd.Address"></a><a href="#cmd.Address">\Address</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.Address">286</a></li>
+ <li><a name="cmd.AddtoDoHook"></a><a href="#cmd.AddtoDoHook">\AddtoDoHook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.AddtoDoHook">357</a></li>
+ <li><a name="cmd.AddtoOneTimeDoHook"></a><a href="#cmd.AddtoOneTimeDoHook">\AddtoOneTimeDoHook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.AddtoOneTimeDoHook">357</a></li>
+ <li><a name="cmd.AfterAtEndOfClass*"></a><a href="#cmd.AfterAtEndOfClass*">\AfterAtEndOfClass*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterAtEndOfClass*">362</a></li>
+ <li><a name="cmd.AfterAtEndOfClass"></a><a href="#cmd.AfterAtEndOfClass">\AfterAtEndOfClass</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterAtEndOfClass">362</a></li>
+ <li><a name="cmd.AfterAtEndOfPackage*"></a><a href="#cmd.AfterAtEndOfPackage*">\AfterAtEndOfPackage*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterAtEndOfPackage*">362</a></li>
+ <li><a name="cmd.AfterAtEndOfPackage"></a><a href="#cmd.AfterAtEndOfPackage">\AfterAtEndOfPackage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterAtEndOfPackage">362</a></li>
+ <li><a name="cmd.AfterBibliographyPreamble"></a><a href="#cmd.AfterBibliographyPreamble">\AfterBibliographyPreamble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.AfterBibliographyPreamble">149</a></li>
+ <li><a name="cmd.AfterCalculatingTypearea*"></a><a href="#cmd.AfterCalculatingTypearea*">\AfterCalculatingTypearea*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.AfterCalculatingTypearea*">473</a></li>
+ <li><a name="cmd.AfterCalculatingTypearea"></a><a href="#cmd.AfterCalculatingTypearea">\AfterCalculatingTypearea</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.AfterCalculatingTypearea">473</a></li>
+ <li><a name="cmd.AfterClass*"></a><a href="#cmd.AfterClass*">\AfterClass*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterClass*">362</a></li>
+ <li><a name="cmd.AfterClass"></a><a href="#cmd.AfterClass">\AfterClass</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterClass">362</a></li>
+ <li><a name="cmd.AfterFile"></a><a href="#cmd.AfterFile">\AfterFile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterFile">361</a></li>
+ <li><a name="cmd.AfterPackage*"></a><a href="#cmd.AfterPackage*">\AfterPackage*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterPackage*">362</a></li>
+ <li><a name="cmd.AfterPackage"></a><a href="#cmd.AfterPackage">\AfterPackage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterPackage">362</a></li>
+ <li><a name="cmd.AfterReadingMainAux"></a><a href="#cmd.AfterReadingMainAux">\AfterReadingMainAux</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.AfterReadingMainAux">364</a></li>
+ <li><a name="cmd.AfterRestoreareas*"></a><a href="#cmd.AfterRestoreareas*">\AfterRestoreareas*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.AfterRestoreareas*">472</a></li>
+ <li><a name="cmd.AfterRestoreareas"></a><a href="#cmd.AfterRestoreareas">\AfterRestoreareas</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.AfterRestoreareas">472</a></li>
+ <li><a name="cmd.AfterSelectAnyPageStyle"></a><a href="#cmd.AfterSelectAnyPageStyle">\AfterSelectAnyPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.AfterSelectAnyPageStyle">433</a></li>
+ <li><a name="cmd.AfterSettingArea*"></a><a href="#cmd.AfterSettingArea*">\AfterSettingArea*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.AfterSettingArea*">473</a></li>
+ <li><a name="cmd.AfterSettingArea"></a><a href="#cmd.AfterSettingArea">\AfterSettingArea</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.AfterSettingArea">473</a></li>
+ <li><a name="cmd.AfterStartingTOC"></a><a href="#cmd.AfterStartingTOC">\AfterStartingTOC</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.AfterStartingTOC">382</a></li>
+ <li><a name="cmd.AfterTOCHead"></a><a href="#cmd.AfterTOCHead">\AfterTOCHead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.AfterTOCHead">382</a></li>
+ <li><a name="cmd.At@startsection"></a><a href="#cmd.At@startsection">\At@startsection</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.At@startsection">500</a></li>
+ <li><a name="cmd.AtAddToTocList"></a><a href="#cmd.AtAddToTocList">\AtAddToTocList</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.AtAddToTocList">377</a></li>
+ <li><a name="cmd.AtBeginLetter"></a><a href="#cmd.AtBeginLetter">\AtBeginLetter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.AtBeginLetter">170</a></li>
+ <li><a name="cmd.AtEndBibliography"></a><a href="#cmd.AtEndBibliography">\AtEndBibliography</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.AtEndBibliography">149</a></li>
+ <li><a name="cmd.AtEndLetter"></a><a href="#cmd.AtEndLetter">\AtEndLetter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.AtEndLetter">170</a></li>
+ <li><a name="cmd.AtEndOfFamilyOptions*"></a><a href="#cmd.AtEndOfFamilyOptions*">\AtEndOfFamilyOptions*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.AtEndOfFamilyOptions*">339</a></li>
+ <li><a name="cmd.AtEndOfFamilyOptions"></a><a href="#cmd.AtEndOfFamilyOptions">\AtEndOfFamilyOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.AtEndOfFamilyOptions">339</a></li>
+ <li><a name="cmd.Before@sect"></a><a href="#cmd.Before@sect">\Before@sect</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.Before@sect">500</a></li>
+ <li><a name="cmd.Before@ssect"></a><a href="#cmd.Before@ssect">\Before@ssect</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.Before@ssect">500</a></li>
+ <li><a name="cmd.BeforeClass"></a><a href="#cmd.BeforeClass">\BeforeClass</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.BeforeClass">362</a></li>
+ <li><a name="cmd.BeforeClosingMainAux"></a><a href="#cmd.BeforeClosingMainAux">\BeforeClosingMainAux</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.BeforeClosingMainAux">364</a></li>
+ <li><a name="cmd.BeforeFamilyProcessOptions"></a><a href="#cmd.BeforeFamilyProcessOptions">\BeforeFamilyProcessOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.BeforeFamilyProcessOptions">336</a></li>
+ <li><a name="cmd.BeforeFile"></a><a href="#cmd.BeforeFile">\BeforeFile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.BeforeFile">361</a></li>
+ <li><a name="cmd.BeforePackage"></a><a href="#cmd.BeforePackage">\BeforePackage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.BeforePackage">362</a></li>
+ <li><a name="cmd.BeforeRestoreareas*"></a><a href="#cmd.BeforeRestoreareas*">\BeforeRestoreareas*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.BeforeRestoreareas*">472</a></li>
+ <li><a name="cmd.BeforeRestoreareas"></a><a href="#cmd.BeforeRestoreareas">\BeforeRestoreareas</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.BeforeRestoreareas">472</a></li>
+ <li><a name="cmd.BeforeSelectAnyPageStyle"></a><a href="#cmd.BeforeSelectAnyPageStyle">\BeforeSelectAnyPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.BeforeSelectAnyPageStyle">433</a></li>
+ <li><a name="cmd.BeforeStartingTOC"></a><a href="#cmd.BeforeStartingTOC">\BeforeStartingTOC</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.BeforeStartingTOC">382</a></li>
+ <li><a name="cmd.BeforeTOCHead"></a><a href="#cmd.BeforeTOCHead">\BeforeTOCHead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.BeforeTOCHead">382</a></li>
+ <li><a name="cmd.BreakBibliography"></a><a href="#cmd.BreakBibliography">\BreakBibliography</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.BreakBibliography">149</a></li>
+ <li><a name="cmd.CenturyPart"></a><a href="#cmd.CenturyPart">\CenturyPart</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.CenturyPart">278</a></li>
+ <li><a name="cmd.Clause"></a><a href="#cmd.Clause">\Clause</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.Clause">313</a></li>
+ <li><a name="cmd.Clauseformat"></a><a href="#cmd.Clauseformat">\Clauseformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.Clauseformat">315</a></li>
+ <li><a name="cmd.CloneTOCEntryStyle"></a><a href="#cmd.CloneTOCEntryStyle">\CloneTOCEntryStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.CloneTOCEntryStyle">400</a></li>
+ <li><a name="cmd.Comment"></a><a href="#cmd.Comment">\Comment</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.Comment">286</a></li>
+ <li><a name="cmd.DayName"></a><a href="#cmd.DayName">\DayName</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.DayName">279</a></li>
+ <li><a name="cmd.DayNameByNumber"></a><a href="#cmd.DayNameByNumber">\DayNameByNumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.DayNameByNumber">279</a></li>
+ <li><a name="cmd.DayNumber"></a><a href="#cmd.DayNumber">\DayNumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.DayNumber">278</a></li>
+ <li><a name="cmd.DecadePart"></a><a href="#cmd.DecadePart">\DecadePart</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.DecadePart">278</a></li>
+ <li><a name="cmd.DeclareLayer"></a><a href="#cmd.DeclareLayer">\DeclareLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclareLayer">422</a></li>
+ <li><a name="cmd.DeclareNewJuraEnvironment"></a><a href="#cmd.DeclareNewJuraEnvironment">\DeclareNewJuraEnvironment</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.DeclareNewJuraEnvironment">320</a></li>
+ <li><a name="cmd.DeclareNewLayer"></a><a href="#cmd.DeclareNewLayer">\DeclareNewLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclareNewLayer">422</a></li>
+ <li><a name="cmd.DeclareNewNoteColumn"></a><a href="#cmd.DeclareNewNoteColumn">\DeclareNewNoteColumn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.DeclareNewNoteColumn">461</a></li>
+ <li><a name="cmd.DeclareNewPageStyleAlias"></a><a href="#cmd.DeclareNewPageStyleAlias">\DeclareNewPageStyleAlias</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclareNewPageStyleAlias">433</a></li>
+ <li><a name="cmd.DeclareNewPageStyleByLayers"></a><a href="#cmd.DeclareNewPageStyleByLayers">\DeclareNewPageStyleByLayers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclareNewPageStyleByLayers">434</a></li>
+ <li><a name="cmd.DeclareNewSectionCommand"></a><a href="#cmd.DeclareNewSectionCommand">\DeclareNewSectionCommand</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.DeclareNewSectionCommand">481</a></li>
+ <li><a name="cmd.DeclareNewSectionCommands"></a><a href="#cmd.DeclareNewSectionCommands">\DeclareNewSectionCommands</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.DeclareNewSectionCommands">491</a></li>
+ <li><a name="cmd.DeclareNewTOC"></a><a href="#cmd.DeclareNewTOC">\DeclareNewTOC</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DeclareNewTOC">406</a></li>
+ <li><a name="cmd.DeclareNoteColumn"></a><a href="#cmd.DeclareNoteColumn">\DeclareNoteColumn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.DeclareNoteColumn">461</a></li>
+ <li><a name="cmd.DeclarePageStyleAlias"></a><a href="#cmd.DeclarePageStyleAlias">\DeclarePageStyleAlias</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclarePageStyleAlias">433</a></li>
+ <li><a name="cmd.DeclarePageStyleByLayers"></a><a href="#cmd.DeclarePageStyleByLayers">\DeclarePageStyleByLayers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclarePageStyleByLayers">434</a></li>
+ <li><a name="cmd.DeclareSectionCommand"></a><a href="#cmd.DeclareSectionCommand">\DeclareSectionCommand</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.DeclareSectionCommand">481</a></li>
+ <li><a name="cmd.DeclareSectionCommands"></a><a href="#cmd.DeclareSectionCommands">\DeclareSectionCommands</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.DeclareSectionCommands">491</a></li>
+ <li><a name="cmd.DeclareSectionNumberDepth"></a><a href="#cmd.DeclareSectionNumberDepth">\DeclareSectionNumberDepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DeclareSectionNumberDepth">420</a></li>
+ <li><a name="cmd.DeclareTOCEntryStyle"></a><a href="#cmd.DeclareTOCEntryStyle">\DeclareTOCEntryStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DeclareTOCEntryStyle">398</a></li>
+ <li><a name="cmd.DeclareTOCStyleEntries"></a><a href="#cmd.DeclareTOCStyleEntries">\DeclareTOCStyleEntries</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DeclareTOCStyleEntries">387</a></li>
+ <li><a name="cmd.DeclareTOCStyleEntry"></a><a href="#cmd.DeclareTOCStyleEntry">\DeclareTOCStyleEntry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DeclareTOCStyleEntry">387</a></li>
+ <li><a name="cmd.DefineFamily"></a><a href="#cmd.DefineFamily">\DefineFamily</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.DefineFamily">332</a></li>
+ <li><a name="cmd.DefineFamilyKey"></a><a href="#cmd.DefineFamilyKey">\DefineFamilyKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.DefineFamilyKey">333</a></li>
+ <li><a name="cmd.DefineFamilyMember"></a><a href="#cmd.DefineFamilyMember">\DefineFamilyMember</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.DefineFamilyMember">332</a></li>
+ <li><a name="cmd.DefineTOCEntryBooleanOption"></a><a href="#cmd.DefineTOCEntryBooleanOption">\DefineTOCEntryBooleanOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DefineTOCEntryBooleanOption">398</a></li>
+ <li><a name="cmd.DefineTOCEntryCommandOption"></a><a href="#cmd.DefineTOCEntryCommandOption">\DefineTOCEntryCommandOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DefineTOCEntryCommandOption">398</a></li>
+ <li><a name="cmd.DefineTOCEntryIfOption"></a><a href="#cmd.DefineTOCEntryIfOption">\DefineTOCEntryIfOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DefineTOCEntryIfOption">398</a></li>
+ <li><a name="cmd.DefineTOCEntryLengthOption"></a><a href="#cmd.DefineTOCEntryLengthOption">\DefineTOCEntryLengthOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DefineTOCEntryLengthOption">398</a></li>
+ <li><a name="cmd.DefineTOCEntryNumberOption"></a><a href="#cmd.DefineTOCEntryNumberOption">\DefineTOCEntryNumberOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DefineTOCEntryNumberOption">398</a></li>
+ <li><a name="cmd.DefineTOCEntryOption"></a><a href="#cmd.DefineTOCEntryOption">\DefineTOCEntryOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.DefineTOCEntryOption">398</a></li>
+ <li><a name="cmd.DestroyLayer"></a><a href="#cmd.DestroyLayer">\DestroyLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DestroyLayer">431</a></li>
+ <li><a name="cmd.DestroyPageStyleAlias"></a><a href="#cmd.DestroyPageStyleAlias">\DestroyPageStyleAlias</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DestroyPageStyleAlias">434</a></li>
+ <li><a name="cmd.DestroyRealLayerPageStyle"></a><a href="#cmd.DestroyRealLayerPageStyle">\DestroyRealLayerPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.DestroyRealLayerPageStyle">440</a></li>
+ <li><a name="cmd.ExecuteDoHook"></a><a href="#cmd.ExecuteDoHook">\ExecuteDoHook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.ExecuteDoHook">356</a></li>
+ <li><a name="cmd.FamilyBoolKey"></a><a href="#cmd.FamilyBoolKey">\FamilyBoolKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyBoolKey">339</a></li>
+ <li><a name="cmd.FamilyCSKey"></a><a href="#cmd.FamilyCSKey">\FamilyCSKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyCSKey">343</a></li>
+ <li><a name="cmd.FamilyCounterKey"></a><a href="#cmd.FamilyCounterKey">\FamilyCounterKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyCounterKey">342</a></li>
+ <li><a name="cmd.FamilyCounterMacroKey"></a><a href="#cmd.FamilyCounterMacroKey">\FamilyCounterMacroKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyCounterMacroKey">343</a></li>
+ <li><a name="cmd.FamilyElseValues"></a><a href="#cmd.FamilyElseValues">\FamilyElseValues</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyElseValues">359</a></li>
+ <li><a name="cmd.FamilyExecuteOptions"></a><a href="#cmd.FamilyExecuteOptions">\FamilyExecuteOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyExecuteOptions">336</a></li>
+ <li><a name="cmd.FamilyInverseBoolKey"></a><a href="#cmd.FamilyInverseBoolKey">\FamilyInverseBoolKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyInverseBoolKey">341</a></li>
+ <li><a name="cmd.FamilyKeyState"></a><a href="#cmd.FamilyKeyState">\FamilyKeyState</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyKeyState">333</a></li>
+ <li><a name="cmd.FamilyKeyStateNeedValue"></a><a href="#cmd.FamilyKeyStateNeedValue">\FamilyKeyStateNeedValue</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyKeyStateNeedValue">333</a></li>
+ <li><a name="cmd.FamilyKeyStateProcessed"></a><a href="#cmd.FamilyKeyStateProcessed">\FamilyKeyStateProcessed</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyKeyStateProcessed">333</a></li>
+ <li><a name="cmd.FamilyKeyStateUnknown"></a><a href="#cmd.FamilyKeyStateUnknown">\FamilyKeyStateUnknown</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyKeyStateUnknown">333</a></li>
+ <li><a name="cmd.FamilyKeyStateUnknownValue"></a><a href="#cmd.FamilyKeyStateUnknownValue">\FamilyKeyStateUnknownValue</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyKeyStateUnknownValue">333</a></li>
+ <li><a name="cmd.FamilyLengthKey"></a><a href="#cmd.FamilyLengthKey">\FamilyLengthKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyLengthKey">343</a></li>
+ <li><a name="cmd.FamilyLengthMacroKey"></a><a href="#cmd.FamilyLengthMacroKey">\FamilyLengthMacroKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyLengthMacroKey">343</a></li>
+ <li><a name="cmd.FamilyNumericalKey"></a><a href="#cmd.FamilyNumericalKey">\FamilyNumericalKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyNumericalKey">341</a></li>
+ <li><a name="cmd.FamilyOption"></a><a href="#cmd.FamilyOption">\FamilyOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyOption">338</a></li>
+ <li><a name="cmd.FamilyOptions"></a><a href="#cmd.FamilyOptions">\FamilyOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyOptions">337</a></li>
+ <li><a name="cmd.FamilyProcessOptions"></a><a href="#cmd.FamilyProcessOptions">\FamilyProcessOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyProcessOptions">335</a></li>
+ <li><a name="cmd.FamilySetBool"></a><a href="#cmd.FamilySetBool">\FamilySetBool</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetBool">339</a></li>
+ <li><a name="cmd.FamilySetCounter"></a><a href="#cmd.FamilySetCounter">\FamilySetCounter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetCounter">342</a></li>
+ <li><a name="cmd.FamilySetCounterMacro"></a><a href="#cmd.FamilySetCounterMacro">\FamilySetCounterMacro</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetCounterMacro">343</a></li>
+ <li><a name="cmd.FamilySetInverseBool"></a><a href="#cmd.FamilySetInverseBool">\FamilySetInverseBool</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetInverseBool">341</a></li>
+ <li><a name="cmd.FamilySetLength"></a><a href="#cmd.FamilySetLength">\FamilySetLength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetLength">343</a></li>
+ <li><a name="cmd.FamilySetLengthMacro"></a><a href="#cmd.FamilySetLengthMacro">\FamilySetLengthMacro</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetLengthMacro">343</a></li>
+ <li><a name="cmd.FamilySetNumerical"></a><a href="#cmd.FamilySetNumerical">\FamilySetNumerical</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetNumerical">341</a></li>
+ <li><a name="cmd.FamilySetUseLengthMacro"></a><a href="#cmd.FamilySetUseLengthMacro">\FamilySetUseLengthMacro</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilySetUseLengthMacro">343</a></li>
+ <li><a name="cmd.FamilyStringKey"></a><a href="#cmd.FamilyStringKey">\FamilyStringKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyStringKey">343</a></li>
+ <li><a name="cmd.FamilyUnknownKeyValue"></a><a href="#cmd.FamilyUnknownKeyValue">\FamilyUnknownKeyValue</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyUnknownKeyValue">344</a></li>
+ <li><a name="cmd.FamilyUseLengthMacroKey"></a><a href="#cmd.FamilyUseLengthMacroKey">\FamilyUseLengthMacroKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.FamilyUseLengthMacroKey">343</a></li>
+ <li><a name="cmd.FirstName"></a><a href="#cmd.FirstName">\FirstName</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.FirstName">286</a></li>
+ <li><a name="cmd.ForDoHook"></a><a href="#cmd.ForDoHook">\ForDoHook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.ForDoHook">358</a></li>
+ <li><a name="cmd.ForEachLayerOfPageStyle*"></a><a href="#cmd.ForEachLayerOfPageStyle*">\ForEachLayerOfPageStyle*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ForEachLayerOfPageStyle*">437</a></li>
+ <li><a name="cmd.ForEachLayerOfPageStyle"></a><a href="#cmd.ForEachLayerOfPageStyle">\ForEachLayerOfPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ForEachLayerOfPageStyle">437</a></li>
+ <li><a name="cmd.FreeI"></a><a href="#cmd.FreeI">\FreeI</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.FreeI">286</a></li>
+ <li><a name="cmd.FreeII"></a><a href="#cmd.FreeII">\FreeII</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.FreeII">286</a></li>
+ <li><a name="cmd.FreeIII"></a><a href="#cmd.FreeIII">\FreeIII</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.FreeIII">286</a></li>
+ <li><a name="cmd.FreeIV"></a><a href="#cmd.FreeIV">\FreeIV</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.FreeIV">286</a></li>
+ <li><a name="cmd.GenericMarkFormat"></a><a href="#cmd.GenericMarkFormat">\GenericMarkFormat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.GenericMarkFormat">446</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.GenericMarkFormat">449</a></li>
+ <li><a name="cmd.GetLayerContents"></a><a href="#cmd.GetLayerContents">\GetLayerContents</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.GetLayerContents">431</a></li>
+ <li><a name="cmd.GetRealPageStyle"></a><a href="#cmd.GetRealPageStyle">\GetRealPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.GetRealPageStyle">434</a></li>
+ <li><a name="cmd.ISODayName"></a><a href="#cmd.ISODayName">\ISODayName</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.ISODayName">279</a></li>
+ <li><a name="cmd.ISODayNumber"></a><a href="#cmd.ISODayNumber">\ISODayNumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.ISODayNumber">278</a></li>
+ <li><a name="cmd.ISOToday"></a><a href="#cmd.ISOToday">\ISOToday</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.ISOToday">280</a></li>
+ <li><a name="cmd.IfActiveMkBoth"></a><a href="#cmd.IfActiveMkBoth">\IfActiveMkBoth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.IfActiveMkBoth">349</a></li>
<li><a name="cmd.IfChapterUsesPrefixLine"></a><a href="#cmd.IfChapterUsesPrefixLine">\IfChapterUsesPrefixLine</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.IfChapterUsesPrefixLine">95</a></li>
- <li><a name="cmd.IfExistskomafont"></a><a href="#cmd.IfExistskomafont">\IfExistskomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.IfExistskomafont">477</a></li>
- <li><a name="cmd.IfIsAliaskomafont"></a><a href="#cmd.IfIsAliaskomafont">\IfIsAliaskomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.IfIsAliaskomafont">477</a></li>
- <li><a name="cmd.IfLayerAtPageStyle"></a><a href="#cmd.IfLayerAtPageStyle">\IfLayerAtPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.IfLayerAtPageStyle">438</a></li>
- <li><a name="cmd.IfLayerExists"></a><a href="#cmd.IfLayerExists">\IfLayerExists</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.IfLayerExists">429</a></li>
- <li><a name="cmd.IfLayerPageStyleExists"></a><a href="#cmd.IfLayerPageStyleExists">\IfLayerPageStyleExists</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.IfLayerPageStyleExists">438</a></li>
- <li><a name="cmd.IfLayersAtPageStyle"></a><a href="#cmd.IfLayersAtPageStyle">\IfLayersAtPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.IfLayersAtPageStyle">438</a></li>
- <li><a name="cmd.IfRealLayerPageStyleExists"></a><a href="#cmd.IfRealLayerPageStyleExists">\IfRealLayerPageStyleExists</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.IfRealLayerPageStyleExists">438</a></li>
- <li><a name="cmd.IfSectionCommandStyleIs"></a><a href="#cmd.IfSectionCommandStyleIs">\IfSectionCommandStyleIs</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.IfSectionCommandStyleIs">490</a></li>
- <li><a name="cmd.IfSomeLayerAtPageStyle"></a><a href="#cmd.IfSomeLayerAtPageStyle">\IfSomeLayerAtPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.IfSomeLayerAtPageStyle">438</a></li>
- <li><a name="cmd.IfUseNumber"></a><a href="#cmd.IfUseNumber">\IfUseNumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.IfUseNumber">497</a></li>
- <li><a name="cmd.IfUsePrefixLine"></a><a href="#cmd.IfUsePrefixLine">\IfUsePrefixLine</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.IfUsePrefixLine">108</a></li>
- <li><a name="cmd.Ifattoclist"></a><a href="#cmd.Ifattoclist">\Ifattoclist</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.Ifattoclist">374</a></li>
- <li><a name="cmd.Ifdimen"></a><a href="#cmd.Ifdimen">\Ifdimen</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifdimen">347</a></li>
- <li><a name="cmd.Ifdvioutput"></a><a href="#cmd.Ifdvioutput">\Ifdvioutput</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifdvioutput">346</a></li>
- <li><a name="cmd.Ifiscount"></a><a href="#cmd.Ifiscount">\Ifiscount</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifiscount">348</a></li>
- <li><a name="cmd.Ifiscounter"></a><a href="#cmd.Ifiscounter">\Ifiscounter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifiscounter">347</a></li>
- <li><a name="cmd.Ifisdimen"></a><a href="#cmd.Ifisdimen">\Ifisdimen</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisdimen">346</a></li>
- <li><a name="cmd.Ifisdimension"></a><a href="#cmd.Ifisdimension">\Ifisdimension</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisdimension">346</a></li>
- <li><a name="cmd.Ifisdimexpr"></a><a href="#cmd.Ifisdimexpr">\Ifisdimexpr</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisdimexpr">347</a></li>
- <li><a name="cmd.Ifisglue"></a><a href="#cmd.Ifisglue">\Ifisglue</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisglue">347</a></li>
- <li><a name="cmd.Ifisglueexpr"></a><a href="#cmd.Ifisglueexpr">\Ifisglueexpr</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisglueexpr">347</a></li>
- <li><a name="cmd.Ifisinteger"></a><a href="#cmd.Ifisinteger">\Ifisinteger</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisinteger">348</a></li>
- <li><a name="cmd.Ifisnumexpr"></a><a href="#cmd.Ifisnumexpr">\Ifisnumexpr</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisnumexpr">348</a></li>
- <li><a name="cmd.Ifisskip"></a><a href="#cmd.Ifisskip">\Ifisskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisskip">347</a></li>
- <li><a name="cmd.Ifkomavar"></a><a href="#cmd.Ifkomavar">\Ifkomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.Ifkomavar">159</a></li>
- <li><a name="cmd.Ifkomavarempty*"></a><a href="#cmd.Ifkomavarempty*">\Ifkomavarempty*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.Ifkomavarempty*">159</a>, <a href="scrguien.pdf#desc:scrlttr2-experts.cmd.Ifkomavarempty*">503</a></li>
- <li><a name="cmd.Ifkomavarempty"></a><a href="#cmd.Ifkomavarempty">\Ifkomavarempty</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.Ifkomavarempty">159</a>, <a href="scrguien.pdf#desc:scrlttr2-experts.cmd.Ifkomavarempty">503</a></li>
- <li><a name="cmd.Ifnotundefined"></a><a href="#cmd.Ifnotundefined">\Ifnotundefined</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifnotundefined">345</a></li>
- <li><a name="cmd.Ifnumber"></a><a href="#cmd.Ifnumber">\Ifnumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifnumber">348</a></li>
- <li><a name="cmd.Ifnumbered"></a><a href="#cmd.Ifnumbered">\Ifnumbered</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.Ifnumbered">112</a></li>
- <li><a name="cmd.Ifpdfoutput"></a><a href="#cmd.Ifpdfoutput">\Ifpdfoutput</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifpdfoutput">345</a></li>
- <li><a name="cmd.Ifplength"></a><a href="#cmd.Ifplength">\Ifplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.Ifplength">166</a></li>
- <li><a name="cmd.Ifpsoutput"></a><a href="#cmd.Ifpsoutput">\Ifpsoutput</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifpsoutput">345</a></li>
- <li><a name="cmd.Ifstr"></a><a href="#cmd.Ifstr">\Ifstr</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifstr">346</a></li>
- <li><a name="cmd.Ifstrstart"></a><a href="#cmd.Ifstrstart">\Ifstrstart</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifstrstart">346</a></li>
- <li><a name="cmd.Ifthispageodd"></a><a href="#cmd.Ifthispageodd">\Ifthispageodd</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.Ifthispageodd">226</a>, <a href="scrguien.pdf#desc:scrextend.cmd.Ifthispageodd">299</a>, <a href="scrguien.pdf#desc:maincls.cmd.Ifthispageodd">79</a></li>
- <li><a name="cmd.Iftocfeature"></a><a href="#cmd.Iftocfeature">\Iftocfeature</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.Iftocfeature">385</a></li>
- <li><a name="cmd.Ifundefinedorrelax"></a><a href="#cmd.Ifundefinedorrelax">\Ifundefinedorrelax</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifundefinedorrelax">345</a></li>
- <li><a name="cmd.Ifunnumbered"></a><a href="#cmd.Ifunnumbered">\Ifunnumbered</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.Ifunnumbered">112</a></li>
- <li><a name="cmd.InputAddressFile"></a><a href="#cmd.InputAddressFile">\InputAddressFile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.InputAddressFile">284</a></li>
- <li><a name="cmd.IsoToday"></a><a href="#cmd.IsoToday">\IsoToday</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.IsoToday">279</a></li>
- <li><a name="cmd.KOMAScript"></a><a href="#cmd.KOMAScript">\KOMAScript</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.KOMAScript">353</a></li>
- <li><a name="cmd.KOMAScriptVersion"></a><a href="#cmd.KOMAScriptVersion">\KOMAScriptVersion</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.KOMAScriptVersion">353</a></li>
- <li><a name="cmd.KOMAoption"></a><a href="#cmd.KOMAoption">\KOMAoption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.KOMAoption">152</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.KOMAoption">253</a>, <a href="scrguien.pdf#desc:scrextend.cmd.KOMAoption">290</a>, <a href="scrguien.pdf#desc:scrjura.cmd.KOMAoption">309</a>, <a href="scrguien.pdf#desc:typearea.cmd.KOMAoption">33</a>, <a href="scrguien.pdf#desc:scrhack.cmd.KOMAoption">412</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.KOMAoption">417</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.KOMAoption">456</a>, <a href="scrguien.pdf#desc:maincls.cmd.KOMAoption">55</a></li>
- <li><a name="cmd.KOMAoptions"></a><a href="#cmd.KOMAoptions">\KOMAoptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.KOMAoptions">152</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.KOMAoptions">253</a>, <a href="scrguien.pdf#desc:scrextend.cmd.KOMAoptions">290</a>, <a href="scrguien.pdf#desc:scrjura.cmd.KOMAoptions">309</a>, <a href="scrguien.pdf#desc:typearea.cmd.KOMAoptions">33</a>, <a href="scrguien.pdf#desc:scrhack.cmd.KOMAoptions">412</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.KOMAoptions">417</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.KOMAoptions">456</a>, <a href="scrguien.pdf#desc:maincls.cmd.KOMAoptions">55</a></li>
- <li><a name="cmd.LastName"></a><a href="#cmd.LastName">\LastName</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.LastName">285</a></li>
- <li><a name="cmd.LastTOCLevelWasHigher"></a><a href="#cmd.LastTOCLevelWasHigher">\LastTOCLevelWasHigher</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.LastTOCLevelWasHigher">399</a></li>
- <li><a name="cmd.LastTOCLevelWasLower"></a><a href="#cmd.LastTOCLevelWasLower">\LastTOCLevelWasLower</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.LastTOCLevelWasLower">399</a></li>
- <li><a name="cmd.LastTOCLevelWasSame"></a><a href="#cmd.LastTOCLevelWasSame">\LastTOCLevelWasSame</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.LastTOCLevelWasSame">399</a></li>
- <li><a name="cmd.LenToUnit"></a><a href="#cmd.LenToUnit">\LenToUnit</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.LenToUnit">428</a></li>
- <li><a name="cmd.LoadLetterOption"></a><a href="#cmd.LoadLetterOption">\LoadLetterOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.LoadLetterOption">241</a></li>
- <li><a name="cmd.LoadLetterOptions"></a><a href="#cmd.LoadLetterOptions">\LoadLetterOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.LoadLetterOptions">241</a></li>
- <li><a name="cmd.MakeMarkcase"></a><a href="#cmd.MakeMarkcase">\MakeMarkcase</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.MakeMarkcase">270</a>, <a href="scrguien.pdf#desc:tocbasic.cmd.MakeMarkcase">382</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.MakeMarkcase">441</a></li>
- <li><a name="cmd.ModifyLayer"></a><a href="#cmd.ModifyLayer">\ModifyLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ModifyLayer">420</a></li>
- <li><a name="cmd.ModifyLayerPageStyleOptions"></a><a href="#cmd.ModifyLayerPageStyleOptions">\ModifyLayerPageStyleOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ModifyLayerPageStyleOptions">437</a></li>
- <li><a name="cmd.ModifyLayers"></a><a href="#cmd.ModifyLayers">\ModifyLayers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ModifyLayers">427</a></li>
- <li><a name="cmd.Name"></a><a href="#cmd.Name">\Name</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.Name">285</a></li>
- <li><a name="cmd.PreventPackageFromLoading*"></a><a href="#cmd.PreventPackageFromLoading*">\PreventPackageFromLoading*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.PreventPackageFromLoading*">367</a></li>
- <li><a name="cmd.PreventPackageFromLoading"></a><a href="#cmd.PreventPackageFromLoading">\PreventPackageFromLoading</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.PreventPackageFromLoading">367</a></li>
- <li><a name="cmd.ProvideLayer"></a><a href="#cmd.ProvideLayer">\ProvideLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ProvideLayer">420</a></li>
- <li><a name="cmd.ProvideNoteColumn"></a><a href="#cmd.ProvideNoteColumn">\ProvideNoteColumn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.ProvideNoteColumn">459</a></li>
- <li><a name="cmd.ProvidePageStyleAlias"></a><a href="#cmd.ProvidePageStyleAlias">\ProvidePageStyleAlias</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ProvidePageStyleAlias">431</a></li>
- <li><a name="cmd.ProvidePageStyleByLayers"></a><a href="#cmd.ProvidePageStyleByLayers">\ProvidePageStyleByLayers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ProvidePageStyleByLayers">432</a></li>
- <li><a name="cmd.ProvideSectionCommand"></a><a href="#cmd.ProvideSectionCommand">\ProvideSectionCommand</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.ProvideSectionCommand">479</a></li>
- <li><a name="cmd.ProvideSectionCommands"></a><a href="#cmd.ProvideSectionCommands">\ProvideSectionCommands</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.ProvideSectionCommands">489</a></li>
- <li><a name="cmd.RedeclareLayer"></a><a href="#cmd.RedeclareLayer">\RedeclareLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.RedeclareLayer">420</a></li>
- <li><a name="cmd.RedeclareNoteColumn"></a><a href="#cmd.RedeclareNoteColumn">\RedeclareNoteColumn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.RedeclareNoteColumn">459</a></li>
- <li><a name="cmd.RedeclarePageStyleAlias"></a><a href="#cmd.RedeclarePageStyleAlias">\RedeclarePageStyleAlias</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.RedeclarePageStyleAlias">431</a></li>
- <li><a name="cmd.RedeclarePageStyleByLayers"></a><a href="#cmd.RedeclarePageStyleByLayers">\RedeclarePageStyleByLayers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.RedeclarePageStyleByLayers">432</a></li>
- <li><a name="cmd.RedeclareSectionCommand"></a><a href="#cmd.RedeclareSectionCommand">\RedeclareSectionCommand</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.RedeclareSectionCommand">479</a></li>
- <li><a name="cmd.RedeclareSectionCommands"></a><a href="#cmd.RedeclareSectionCommands">\RedeclareSectionCommands</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.RedeclareSectionCommands">489</a></li>
- <li><a name="cmd.RelaxFamilyKey"></a><a href="#cmd.RelaxFamilyKey">\RelaxFamilyKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.RelaxFamilyKey">334</a></li>
- <li><a name="cmd.RemoveLayersFromPageStyle"></a><a href="#cmd.RemoveLayersFromPageStyle">\RemoveLayersFromPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.RemoveLayersFromPageStyle">436</a></li>
- <li><a name="cmd.ReplaceClass"></a><a href="#cmd.ReplaceClass">\ReplaceClass</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.ReplaceClass">365</a></li>
- <li><a name="cmd.ReplaceInput"></a><a href="#cmd.ReplaceInput">\ReplaceInput</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.ReplaceInput">364</a></li>
- <li><a name="cmd.ReplacePackage"></a><a href="#cmd.ReplacePackage">\ReplacePackage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.ReplacePackage">365</a></li>
+ <li><a name="cmd.IfExistskomafont"></a><a href="#cmd.IfExistskomafont">\IfExistskomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.IfExistskomafont">479</a></li>
+ <li><a name="cmd.IfIsAliaskomafont"></a><a href="#cmd.IfIsAliaskomafont">\IfIsAliaskomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.IfIsAliaskomafont">479</a></li>
+ <li><a name="cmd.IfLayerAtPageStyle"></a><a href="#cmd.IfLayerAtPageStyle">\IfLayerAtPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.IfLayerAtPageStyle">440</a></li>
+ <li><a name="cmd.IfLayerExists"></a><a href="#cmd.IfLayerExists">\IfLayerExists</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.IfLayerExists">431</a></li>
+ <li><a name="cmd.IfLayerPageStyleExists"></a><a href="#cmd.IfLayerPageStyleExists">\IfLayerPageStyleExists</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.IfLayerPageStyleExists">440</a></li>
+ <li><a name="cmd.IfLayersAtPageStyle"></a><a href="#cmd.IfLayersAtPageStyle">\IfLayersAtPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.IfLayersAtPageStyle">440</a></li>
+ <li><a name="cmd.IfRealLayerPageStyleExists"></a><a href="#cmd.IfRealLayerPageStyleExists">\IfRealLayerPageStyleExists</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.IfRealLayerPageStyleExists">440</a></li>
+ <li><a name="cmd.IfSectionCommandStyleIs"></a><a href="#cmd.IfSectionCommandStyleIs">\IfSectionCommandStyleIs</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.IfSectionCommandStyleIs">492</a></li>
+ <li><a name="cmd.IfSomeLayerAtPageStyle"></a><a href="#cmd.IfSomeLayerAtPageStyle">\IfSomeLayerAtPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.IfSomeLayerAtPageStyle">440</a></li>
+ <li><a name="cmd.IfUseNumber"></a><a href="#cmd.IfUseNumber">\IfUseNumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.IfUseNumber">499</a></li>
+ <li><a name="cmd.IfUsePrefixLine"></a><a href="#cmd.IfUsePrefixLine">\IfUsePrefixLine</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.IfUsePrefixLine">109</a></li>
+ <li><a name="cmd.Ifattoclist"></a><a href="#cmd.Ifattoclist">\Ifattoclist</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.Ifattoclist">375</a></li>
+ <li><a name="cmd.Ifdimen"></a><a href="#cmd.Ifdimen">\Ifdimen</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifdimen">348</a></li>
+ <li><a name="cmd.Ifdvioutput"></a><a href="#cmd.Ifdvioutput">\Ifdvioutput</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifdvioutput">347</a></li>
+ <li><a name="cmd.Ifiscount"></a><a href="#cmd.Ifiscount">\Ifiscount</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifiscount">349</a></li>
+ <li><a name="cmd.Ifiscounter"></a><a href="#cmd.Ifiscounter">\Ifiscounter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifiscounter">348</a></li>
+ <li><a name="cmd.Ifisdimen"></a><a href="#cmd.Ifisdimen">\Ifisdimen</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisdimen">347</a></li>
+ <li><a name="cmd.Ifisdimension"></a><a href="#cmd.Ifisdimension">\Ifisdimension</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisdimension">347</a></li>
+ <li><a name="cmd.Ifisdimexpr"></a><a href="#cmd.Ifisdimexpr">\Ifisdimexpr</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisdimexpr">348</a></li>
+ <li><a name="cmd.Ifisglue"></a><a href="#cmd.Ifisglue">\Ifisglue</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisglue">348</a></li>
+ <li><a name="cmd.Ifisglueexpr"></a><a href="#cmd.Ifisglueexpr">\Ifisglueexpr</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisglueexpr">348</a></li>
+ <li><a name="cmd.Ifisinteger"></a><a href="#cmd.Ifisinteger">\Ifisinteger</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisinteger">349</a></li>
+ <li><a name="cmd.Ifisnumexpr"></a><a href="#cmd.Ifisnumexpr">\Ifisnumexpr</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisnumexpr">349</a></li>
+ <li><a name="cmd.Ifisskip"></a><a href="#cmd.Ifisskip">\Ifisskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifisskip">348</a></li>
+ <li><a name="cmd.Ifkomavar"></a><a href="#cmd.Ifkomavar">\Ifkomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.Ifkomavar">160</a></li>
+ <li><a name="cmd.Ifkomavarempty*"></a><a href="#cmd.Ifkomavarempty*">\Ifkomavarempty*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.Ifkomavarempty*">160</a>, <a href="scrguien.pdf#desc:scrlttr2-experts.cmd.Ifkomavarempty*">505</a></li>
+ <li><a name="cmd.Ifkomavarempty"></a><a href="#cmd.Ifkomavarempty">\Ifkomavarempty</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.Ifkomavarempty">160</a>, <a href="scrguien.pdf#desc:scrlttr2-experts.cmd.Ifkomavarempty">505</a></li>
+ <li><a name="cmd.Ifnotundefined"></a><a href="#cmd.Ifnotundefined">\Ifnotundefined</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifnotundefined">346</a></li>
+ <li><a name="cmd.Ifnumber"></a><a href="#cmd.Ifnumber">\Ifnumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifnumber">349</a></li>
+ <li><a name="cmd.Ifnumbered"></a><a href="#cmd.Ifnumbered">\Ifnumbered</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.Ifnumbered">113</a></li>
+ <li><a name="cmd.Ifpdfoutput"></a><a href="#cmd.Ifpdfoutput">\Ifpdfoutput</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifpdfoutput">346</a></li>
+ <li><a name="cmd.Ifplength"></a><a href="#cmd.Ifplength">\Ifplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.Ifplength">167</a></li>
+ <li><a name="cmd.Ifpsoutput"></a><a href="#cmd.Ifpsoutput">\Ifpsoutput</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifpsoutput">346</a></li>
+ <li><a name="cmd.Ifstr"></a><a href="#cmd.Ifstr">\Ifstr</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifstr">347</a></li>
+ <li><a name="cmd.Ifstrstart"></a><a href="#cmd.Ifstrstart">\Ifstrstart</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifstrstart">347</a></li>
+ <li><a name="cmd.Ifthispageodd"></a><a href="#cmd.Ifthispageodd">\Ifthispageodd</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.Ifthispageodd">227</a>, <a href="scrguien.pdf#desc:scrextend.cmd.Ifthispageodd">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.Ifthispageodd">80</a></li>
+ <li><a name="cmd.Iftocfeature"></a><a href="#cmd.Iftocfeature">\Iftocfeature</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.Iftocfeature">386</a></li>
+ <li><a name="cmd.Ifundefinedorrelax"></a><a href="#cmd.Ifundefinedorrelax">\Ifundefinedorrelax</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.Ifundefinedorrelax">346</a></li>
+ <li><a name="cmd.Ifunnumbered"></a><a href="#cmd.Ifunnumbered">\Ifunnumbered</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.Ifunnumbered">113</a></li>
+ <li><a name="cmd.InputAddressFile"></a><a href="#cmd.InputAddressFile">\InputAddressFile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.InputAddressFile">285</a></li>
+ <li><a name="cmd.IsoToday"></a><a href="#cmd.IsoToday">\IsoToday</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.IsoToday">280</a></li>
+ <li><a name="cmd.KOMAScript"></a><a href="#cmd.KOMAScript">\KOMAScript</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.KOMAScript">354</a></li>
+ <li><a name="cmd.KOMAScriptVersion"></a><a href="#cmd.KOMAScriptVersion">\KOMAScriptVersion</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.KOMAScriptVersion">354</a></li>
+ <li><a name="cmd.KOMAoption"></a><a href="#cmd.KOMAoption">\KOMAoption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.KOMAoption">153</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.KOMAoption">254</a>, <a href="scrguien.pdf#desc:scrextend.cmd.KOMAoption">291</a>, <a href="scrguien.pdf#desc:scrjura.cmd.KOMAoption">310</a>, <a href="scrguien.pdf#desc:typearea.cmd.KOMAoption">33</a>, <a href="scrguien.pdf#desc:scrhack.cmd.KOMAoption">414</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.KOMAoption">419</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.KOMAoption">458</a>, <a href="scrguien.pdf#desc:maincls.cmd.KOMAoption">55</a></li>
+ <li><a name="cmd.KOMAoptions"></a><a href="#cmd.KOMAoptions">\KOMAoptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.KOMAoptions">153</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.KOMAoptions">254</a>, <a href="scrguien.pdf#desc:scrextend.cmd.KOMAoptions">291</a>, <a href="scrguien.pdf#desc:scrjura.cmd.KOMAoptions">310</a>, <a href="scrguien.pdf#desc:typearea.cmd.KOMAoptions">33</a>, <a href="scrguien.pdf#desc:scrhack.cmd.KOMAoptions">414</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.KOMAoptions">419</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.KOMAoptions">458</a>, <a href="scrguien.pdf#desc:maincls.cmd.KOMAoptions">55</a></li>
+ <li><a name="cmd.LastName"></a><a href="#cmd.LastName">\LastName</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.LastName">286</a></li>
+ <li><a name="cmd.LastTOCLevelWasHigher"></a><a href="#cmd.LastTOCLevelWasHigher">\LastTOCLevelWasHigher</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.LastTOCLevelWasHigher">400</a></li>
+ <li><a name="cmd.LastTOCLevelWasLower"></a><a href="#cmd.LastTOCLevelWasLower">\LastTOCLevelWasLower</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.LastTOCLevelWasLower">400</a></li>
+ <li><a name="cmd.LastTOCLevelWasSame"></a><a href="#cmd.LastTOCLevelWasSame">\LastTOCLevelWasSame</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.LastTOCLevelWasSame">400</a></li>
+ <li><a name="cmd.LenToUnit"></a><a href="#cmd.LenToUnit">\LenToUnit</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.LenToUnit">430</a></li>
+ <li><a name="cmd.LoadLetterOption"></a><a href="#cmd.LoadLetterOption">\LoadLetterOption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.LoadLetterOption">242</a></li>
+ <li><a name="cmd.LoadLetterOptions"></a><a href="#cmd.LoadLetterOptions">\LoadLetterOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.LoadLetterOptions">242</a></li>
+ <li><a name="cmd.MakeMarkcase"></a><a href="#cmd.MakeMarkcase">\MakeMarkcase</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.MakeMarkcase">271</a>, <a href="scrguien.pdf#desc:tocbasic.cmd.MakeMarkcase">383</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.MakeMarkcase">443</a></li>
+ <li><a name="cmd.ModifyLayer"></a><a href="#cmd.ModifyLayer">\ModifyLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ModifyLayer">422</a></li>
+ <li><a name="cmd.ModifyLayerPageStyleOptions"></a><a href="#cmd.ModifyLayerPageStyleOptions">\ModifyLayerPageStyleOptions</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ModifyLayerPageStyleOptions">439</a></li>
+ <li><a name="cmd.ModifyLayers"></a><a href="#cmd.ModifyLayers">\ModifyLayers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ModifyLayers">429</a></li>
+ <li><a name="cmd.Name"></a><a href="#cmd.Name">\Name</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.Name">286</a></li>
+ <li><a name="cmd.PreventPackageFromLoading*"></a><a href="#cmd.PreventPackageFromLoading*">\PreventPackageFromLoading*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.PreventPackageFromLoading*">368</a></li>
+ <li><a name="cmd.PreventPackageFromLoading"></a><a href="#cmd.PreventPackageFromLoading">\PreventPackageFromLoading</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.PreventPackageFromLoading">368</a></li>
+ <li><a name="cmd.ProvideLayer"></a><a href="#cmd.ProvideLayer">\ProvideLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ProvideLayer">422</a></li>
+ <li><a name="cmd.ProvideNoteColumn"></a><a href="#cmd.ProvideNoteColumn">\ProvideNoteColumn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.ProvideNoteColumn">461</a></li>
+ <li><a name="cmd.ProvidePageStyleAlias"></a><a href="#cmd.ProvidePageStyleAlias">\ProvidePageStyleAlias</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ProvidePageStyleAlias">433</a></li>
+ <li><a name="cmd.ProvidePageStyleByLayers"></a><a href="#cmd.ProvidePageStyleByLayers">\ProvidePageStyleByLayers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.ProvidePageStyleByLayers">434</a></li>
+ <li><a name="cmd.ProvideSectionCommand"></a><a href="#cmd.ProvideSectionCommand">\ProvideSectionCommand</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.ProvideSectionCommand">481</a></li>
+ <li><a name="cmd.ProvideSectionCommands"></a><a href="#cmd.ProvideSectionCommands">\ProvideSectionCommands</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.ProvideSectionCommands">491</a></li>
+ <li><a name="cmd.RedeclareLayer"></a><a href="#cmd.RedeclareLayer">\RedeclareLayer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.RedeclareLayer">422</a></li>
+ <li><a name="cmd.RedeclareNoteColumn"></a><a href="#cmd.RedeclareNoteColumn">\RedeclareNoteColumn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.RedeclareNoteColumn">461</a></li>
+ <li><a name="cmd.RedeclarePageStyleAlias"></a><a href="#cmd.RedeclarePageStyleAlias">\RedeclarePageStyleAlias</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.RedeclarePageStyleAlias">433</a></li>
+ <li><a name="cmd.RedeclarePageStyleByLayers"></a><a href="#cmd.RedeclarePageStyleByLayers">\RedeclarePageStyleByLayers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.RedeclarePageStyleByLayers">434</a></li>
+ <li><a name="cmd.RedeclareSectionCommand"></a><a href="#cmd.RedeclareSectionCommand">\RedeclareSectionCommand</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.RedeclareSectionCommand">481</a></li>
+ <li><a name="cmd.RedeclareSectionCommands"></a><a href="#cmd.RedeclareSectionCommands">\RedeclareSectionCommands</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.RedeclareSectionCommands">491</a></li>
+ <li><a name="cmd.RelaxFamilyKey"></a><a href="#cmd.RelaxFamilyKey">\RelaxFamilyKey</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.RelaxFamilyKey">335</a></li>
+ <li><a name="cmd.RemoveLayersFromPageStyle"></a><a href="#cmd.RemoveLayersFromPageStyle">\RemoveLayersFromPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.RemoveLayersFromPageStyle">438</a></li>
+ <li><a name="cmd.ReplaceClass"></a><a href="#cmd.ReplaceClass">\ReplaceClass</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.ReplaceClass">367</a></li>
+ <li><a name="cmd.ReplaceInput"></a><a href="#cmd.ReplaceInput">\ReplaceInput</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.ReplaceInput">366</a></li>
+ <li><a name="cmd.ReplacePackage"></a><a href="#cmd.ReplacePackage">\ReplacePackage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.ReplacePackage">367</a></li>
<li><a name="cmd.ResetPreventPackageFromLoading"></a><a href="#cmd.ResetPreventPackageFromLoading">\ResetPreventPackageFromLoading</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.ResetPreventPackageFromLoading">368</a></li>
- <li><a name="cmd.SecDef"></a><a href="#cmd.SecDef">\SecDef</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.SecDef">497</a></li>
- <li><a name="cmd.Sentence"></a><a href="#cmd.Sentence">\Sentence</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.Sentence">317</a></li>
- <li><a name="cmd.SplitDoHook"></a><a href="#cmd.SplitDoHook">\SplitDoHook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.SplitDoHook">357</a></li>
+ <li><a name="cmd.SecDef"></a><a href="#cmd.SecDef">\SecDef</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.SecDef">499</a></li>
+ <li><a name="cmd.Sentence"></a><a href="#cmd.Sentence">\Sentence</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.Sentence">318</a></li>
+ <li><a name="cmd.SplitDoHook"></a><a href="#cmd.SplitDoHook">\SplitDoHook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.SplitDoHook">358</a></li>
<li><a name="cmd.StorePreventPackageFromLoading"></a><a href="#cmd.StorePreventPackageFromLoading">\StorePreventPackageFromLoading</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.StorePreventPackageFromLoading">368</a></li>
- <li><a name="cmd.SubClause"></a><a href="#cmd.SubClause">\SubClause</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.SubClause">312</a></li>
- <li><a name="cmd.TOCEntryStyleInitCode"></a><a href="#cmd.TOCEntryStyleInitCode">\TOCEntryStyleInitCode</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.TOCEntryStyleInitCode">398</a></li>
- <li><a name="cmd.TOCEntryStyleStartInitCode"></a><a href="#cmd.TOCEntryStyleStartInitCode">\TOCEntryStyleStartInitCode</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.TOCEntryStyleStartInitCode">398</a></li>
- <li><a name="cmd.TOCLineLeaderFill"></a><a href="#cmd.TOCLineLeaderFill">\TOCLineLeaderFill</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.TOCLineLeaderFill">399</a></li>
- <li><a name="cmd.TOCclone"></a><a href="#cmd.TOCclone">\TOCclone</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrwfile.cmd.TOCclone">371</a></li>
- <li><a name="cmd.Telephone"></a><a href="#cmd.Telephone">\Telephone</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.Telephone">285</a></li>
+ <li><a name="cmd.SubClause"></a><a href="#cmd.SubClause">\SubClause</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.SubClause">313</a></li>
+ <li><a name="cmd.TOCEntryStyleInitCode"></a><a href="#cmd.TOCEntryStyleInitCode">\TOCEntryStyleInitCode</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.TOCEntryStyleInitCode">400</a></li>
+ <li><a name="cmd.TOCEntryStyleStartInitCode"></a><a href="#cmd.TOCEntryStyleStartInitCode">\TOCEntryStyleStartInitCode</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.TOCEntryStyleStartInitCode">400</a></li>
+ <li><a name="cmd.TOCLineLeaderFill"></a><a href="#cmd.TOCLineLeaderFill">\TOCLineLeaderFill</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.TOCLineLeaderFill">401</a></li>
+ <li><a name="cmd.TOCclone"></a><a href="#cmd.TOCclone">\TOCclone</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrwfile.cmd.TOCclone">372</a></li>
+ <li><a name="cmd.Telephone"></a><a href="#cmd.Telephone">\Telephone</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scraddr.cmd.Telephone">286</a></li>
<li><a name="cmd.UnPreventPackageFromLoading*"></a><a href="#cmd.UnPreventPackageFromLoading*">\UnPreventPackageFromLoading*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.UnPreventPackageFromLoading*">369</a></li>
<li><a name="cmd.UnPreventPackageFromLoading"></a><a href="#cmd.UnPreventPackageFromLoading">\UnPreventPackageFromLoading</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.UnPreventPackageFromLoading">369</a></li>
<li><a name="cmd.UnReplaceClass"></a><a href="#cmd.UnReplaceClass">\UnReplaceClass</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.UnReplaceClass">367</a></li>
<li><a name="cmd.UnReplaceInput"></a><a href="#cmd.UnReplaceInput">\UnReplaceInput</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.UnReplaceInput">367</a></li>
<li><a name="cmd.UnReplacePackage"></a><a href="#cmd.UnReplacePackage">\UnReplacePackage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlfile.cmd.UnReplacePackage">367</a></li>
- <li><a name="cmd.UnifyLayersAtPageStyle"></a><a href="#cmd.UnifyLayersAtPageStyle">\UnifyLayersAtPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.UnifyLayersAtPageStyle">437</a></li>
- <li><a name="cmd.XdivY"></a><a href="#cmd.XdivY">\XdivY</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.XdivY">354</a></li>
- <li><a name="cmd.XmodY"></a><a href="#cmd.XmodY">\XmodY</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.XmodY">354</a></li>
- <li><a name="cmd.activateareas"></a><a href="#cmd.activateareas">\activateareas</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.activateareas">470</a></li>
- <li><a name="cmd.addchap*"></a><a href="#cmd.addchap*">\addchap*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addchap*">105</a></li>
- <li><a name="cmd.addchap"></a><a href="#cmd.addchap">\addchap</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addchap">105</a></li>
- <li><a name="cmd.addchapmark"></a><a href="#cmd.addchapmark">\addchapmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addchapmark">111</a></li>
- <li><a name="cmd.addchaptertocentry"></a><a href="#cmd.addchaptertocentry">\addchaptertocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addchaptertocentry">475</a></li>
- <li><a name="cmd.addcontentslinetoeachtocfile"></a><a href="#cmd.addcontentslinetoeachtocfile">\addcontentslinetoeachtocfile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.addcontentslinetoeachtocfile">379</a></li>
- <li><a name="cmd.addparagraphtocentry"></a><a href="#cmd.addparagraphtocentry">\addparagraphtocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addparagraphtocentry">475</a></li>
- <li><a name="cmd.addpart*"></a><a href="#cmd.addpart*">\addpart*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addpart*">105</a></li>
- <li><a name="cmd.addpart"></a><a href="#cmd.addpart">\addpart</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addpart">105</a></li>
- <li><a name="cmd.addparttocentry"></a><a href="#cmd.addparttocentry">\addparttocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addparttocentry">475</a></li>
- <li><a name="cmd.addrchar"></a><a href="#cmd.addrchar">\addrchar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.addrchar">249</a>, <a href="scrguien.pdf#desc:scraddr.cmd.addrchar">284</a></li>
- <li><a name="cmd.addrentry"></a><a href="#cmd.addrentry">\addrentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.addrentry">248</a>, <a href="scrguien.pdf#desc:scraddr.cmd.addrentry">284</a></li>
- <li><a name="cmd.addsec*"></a><a href="#cmd.addsec*">\addsec*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addsec*">105</a></li>
- <li><a name="cmd.addsec"></a><a href="#cmd.addsec">\addsec</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addsec">105</a></li>
- <li><a name="cmd.addsecmark"></a><a href="#cmd.addsecmark">\addsecmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addsecmark">111</a></li>
- <li><a name="cmd.addsectiontocentry"></a><a href="#cmd.addsectiontocentry">\addsectiontocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addsectiontocentry">475</a></li>
- <li><a name="cmd.addsubparagraphtocentry"></a><a href="#cmd.addsubparagraphtocentry">\addsubparagraphtocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addsubparagraphtocentry">475</a></li>
- <li><a name="cmd.addsubsectiontocentry"></a><a href="#cmd.addsubsectiontocentry">\addsubsectiontocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addsubsectiontocentry">475</a></li>
- <li><a name="cmd.addsubsubsectiontocentry"></a><a href="#cmd.addsubsubsectiontocentry">\addsubsubsectiontocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addsubsubsectiontocentry">475</a></li>
- <li><a name="cmd.addtocentrydefault"></a><a href="#cmd.addtocentrydefault">\addtocentrydefault</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addtocentrydefault">474</a></li>
- <li><a name="cmd.addtoeachtocfile"></a><a href="#cmd.addtoeachtocfile">\addtoeachtocfile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.addtoeachtocfile">378</a></li>
- <li><a name="cmd.addtokomafont"></a><a href="#cmd.addtokomafont">\addtokomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.addtokomafont">179</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.addtokomafont">255</a>, <a href="scrguien.pdf#desc:scrextend.cmd.addtokomafont">293</a>, <a href="scrguien.pdf#desc:scrjura.cmd.addtokomafont">309</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.addtokomafont">457</a>, <a href="scrguien.pdf#desc:maincls.cmd.addtokomafont">59</a></li>
- <li><a name="cmd.addtokomafontgobblelist"></a><a href="#cmd.addtokomafontgobblelist">\addtokomafontgobblelist</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addtokomafontgobblelist">476</a></li>
- <li><a name="cmd.addtokomafontonearglist"></a><a href="#cmd.addtokomafontonearglist">\addtokomafontonearglist</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addtokomafontonearglist">476</a></li>
- <li><a name="cmd.addtokomafontrelaxlist"></a><a href="#cmd.addtokomafontrelaxlist">\addtokomafontrelaxlist</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addtokomafontrelaxlist">476</a></li>
- <li><a name="cmd.addtolengthplength"></a><a href="#cmd.addtolengthplength">\addtolengthplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.addtolengthplength">167</a></li>
- <li><a name="cmd.addtoplength"></a><a href="#cmd.addtoplength">\addtoplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.addtoplength">166</a></li>
- <li><a name="cmd.addtoreffields"></a><a href="#cmd.addtoreffields">\addtoreffields</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.addtoreffields">502</a></li>
- <li><a name="cmd.addtotoclist"></a><a href="#cmd.addtotoclist">\addtotoclist</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.addtotoclist">375</a></li>
- <li><a name="cmd.addxcontentsline"></a><a href="#cmd.addxcontentsline">\addxcontentsline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.addxcontentsline">378</a></li>
- <li><a name="cmd.addxcontentslinetoeachtocfile"></a><a href="#cmd.addxcontentslinetoeachtocfile">\addxcontentslinetoeachtocfile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.addxcontentslinetoeachtocfile">379</a></li>
- <li><a name="cmd.adrchar"></a><a href="#cmd.adrchar">\adrchar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.adrchar">249</a>, <a href="scrguien.pdf#desc:scraddr.cmd.adrchar">284</a></li>
- <li><a name="cmd.adrentry"></a><a href="#cmd.adrentry">\adrentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.adrentry">247</a>, <a href="scrguien.pdf#desc:scraddr.cmd.adrentry">284</a></li>
- <li><a name="cmd.aliaskomafont"></a><a href="#cmd.aliaskomafont">\aliaskomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.aliaskomafont">476</a></li>
- <li><a name="cmd.and"></a><a href="#cmd.and">\and</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.and">297</a>, <a href="scrguien.pdf#desc:maincls.cmd.and">67</a></li>
- <li><a name="cmd.appendix"></a><a href="#cmd.appendix">\appendix</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.appendix">146</a></li>
- <li><a name="cmd.appendixmore"></a><a href="#cmd.appendixmore">\appendixmore</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.appendixmore">498</a></li>
- <li><a name="cmd.areaset"></a><a href="#cmd.areaset">\areaset</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.cmd.areaset">47</a>, <a href="scrguien.pdf#desc:typearea-experts.cmd.areaset">470</a></li>
- <li><a name="cmd.author"></a><a href="#cmd.author">\author</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.author">297</a>, <a href="scrguien.pdf#desc:maincls.cmd.author">67</a></li>
- <li><a name="cmd.autodot"></a><a href="#cmd.autodot">\autodot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.autodot">108</a></li>
- <li><a name="cmd.automark*"></a><a href="#cmd.automark*">\automark*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.automark*">267</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.automark*">440</a></li>
- <li><a name="cmd.automark"></a><a href="#cmd.automark">\automark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.automark">267</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.automark">440</a></li>
- <li><a name="cmd.backmatter"></a><a href="#cmd.backmatter">\backmatter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.backmatter">93</a></li>
- <li><a name="cmd.bankname"></a><a href="#cmd.bankname">\bankname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.bankname">509</a></li>
- <li><a name="cmd.bib@beginhook"></a><a href="#cmd.bib@beginhook">\bib@beginhook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.bib@beginhook">500</a></li>
- <li><a name="cmd.bib@endhook"></a><a href="#cmd.bib@endhook">\bib@endhook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.bib@endhook">500</a></li>
- <li><a name="cmd.caption"></a><a href="#cmd.caption">\caption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.caption">129</a></li>
- <li><a name="cmd.captionabove"></a><a href="#cmd.captionabove">\captionabove</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.captionabove">129</a></li>
- <li><a name="cmd.captionaboveof"></a><a href="#cmd.captionaboveof">\captionaboveof</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.captionaboveof">131</a></li>
- <li><a name="cmd.captionbelow"></a><a href="#cmd.captionbelow">\captionbelow</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.captionbelow">129</a></li>
- <li><a name="cmd.captionbelowof"></a><a href="#cmd.captionbelowof">\captionbelowof</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.captionbelowof">131</a></li>
- <li><a name="cmd.captionformat"></a><a href="#cmd.captionformat">\captionformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.captionformat">136</a></li>
- <li><a name="cmd.captionof"></a><a href="#cmd.captionof">\captionof</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.captionof">131</a></li>
- <li><a name="cmd.captionsUKenglish"></a><a href="#cmd.captionsUKenglish">\captionsUKenglish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsUKenglish">510</a></li>
- <li><a name="cmd.captionsUSenglish"></a><a href="#cmd.captionsUSenglish">\captionsUSenglish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsUSenglish">510</a></li>
- <li><a name="cmd.captionsacadian"></a><a href="#cmd.captionsacadian">\captionsacadian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsacadian">510</a></li>
- <li><a name="cmd.captionsamerican"></a><a href="#cmd.captionsamerican">\captionsamerican</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsamerican">510</a></li>
- <li><a name="cmd.captionsaustralien"></a><a href="#cmd.captionsaustralien">\captionsaustralien</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsaustralien">510</a></li>
- <li><a name="cmd.captionsaustrian"></a><a href="#cmd.captionsaustrian">\captionsaustrian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsaustrian">510</a></li>
- <li><a name="cmd.captionsbritish"></a><a href="#cmd.captionsbritish">\captionsbritish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsbritish">510</a></li>
- <li><a name="cmd.captionscanadian"></a><a href="#cmd.captionscanadian">\captionscanadian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionscanadian">510</a></li>
- <li><a name="cmd.captionscanadien"></a><a href="#cmd.captionscanadien">\captionscanadien</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionscanadien">510</a></li>
- <li><a name="cmd.captionscroatian"></a><a href="#cmd.captionscroatian">\captionscroatian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionscroatian">510</a></li>
- <li><a name="cmd.captionsczech"></a><a href="#cmd.captionsczech">\captionsczech</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsczech">510</a></li>
- <li><a name="cmd.captionsdutch"></a><a href="#cmd.captionsdutch">\captionsdutch</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsdutch">510</a></li>
- <li><a name="cmd.captionsenglish"></a><a href="#cmd.captionsenglish">\captionsenglish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsenglish">510</a></li>
- <li><a name="cmd.captionsfinnish"></a><a href="#cmd.captionsfinnish">\captionsfinnish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsfinnish">510</a></li>
- <li><a name="cmd.captionsfrancais"></a><a href="#cmd.captionsfrancais">\captionsfrancais</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsfrancais">510</a></li>
- <li><a name="cmd.captionsfrench"></a><a href="#cmd.captionsfrench">\captionsfrench</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsfrench">510</a></li>
- <li><a name="cmd.captionsgerman"></a><a href="#cmd.captionsgerman">\captionsgerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsgerman">510</a></li>
- <li><a name="cmd.captionsitalian"></a><a href="#cmd.captionsitalian">\captionsitalian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsitalian">510</a></li>
- <li><a name="cmd.captionsnaustrian"></a><a href="#cmd.captionsnaustrian">\captionsnaustrian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsnaustrian">510</a></li>
- <li><a name="cmd.captionsnewzealand"></a><a href="#cmd.captionsnewzealand">\captionsnewzealand</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsnewzealand">510</a></li>
- <li><a name="cmd.captionsngerman"></a><a href="#cmd.captionsngerman">\captionsngerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsngerman">510</a></li>
- <li><a name="cmd.captionsnorsk"></a><a href="#cmd.captionsnorsk">\captionsnorsk</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsnorsk">510</a></li>
- <li><a name="cmd.captionsnswissgerman"></a><a href="#cmd.captionsnswissgerman">\captionsnswissgerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsnswissgerman">510</a></li>
- <li><a name="cmd.captionspolish"></a><a href="#cmd.captionspolish">\captionspolish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionspolish">510</a></li>
- <li><a name="cmd.captionsslovak"></a><a href="#cmd.captionsslovak">\captionsslovak</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsslovak">510</a></li>
- <li><a name="cmd.captionsspanish"></a><a href="#cmd.captionsspanish">\captionsspanish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsspanish">510</a></li>
- <li><a name="cmd.captionsswedish"></a><a href="#cmd.captionsswedish">\captionsswedish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsswedish">510</a></li>
- <li><a name="cmd.captionsswissgerman"></a><a href="#cmd.captionsswissgerman">\captionsswissgerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsswissgerman">510</a></li>
- <li><a name="cmd.cc"></a><a href="#cmd.cc">\cc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cc">175</a></li>
- <li><a name="cmd.ccname"></a><a href="#cmd.ccname">\ccname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.ccname">509</a></li>
- <li><a name="cmd.cefoot*"></a><a href="#cmd.cefoot*">\cefoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cefoot*">263</a></li>
- <li><a name="cmd.cefoot"></a><a href="#cmd.cefoot">\cefoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cefoot">261</a></li>
- <li><a name="cmd.cehead*"></a><a href="#cmd.cehead*">\cehead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cehead*">260</a></li>
- <li><a name="cmd.cehead"></a><a href="#cmd.cehead">\cehead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cehead">258</a></li>
- <li><a name="cmd.cfoot*"></a><a href="#cmd.cfoot*">\cfoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cfoot*">265</a></li>
- <li><a name="cmd.cfoot"></a><a href="#cmd.cfoot">\cfoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cfoot">264</a></li>
- <li><a name="cmd.changefontsizes"></a><a href="#cmd.changefontsizes">\changefontsizes</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.changefontsizes">476</a></li>
- <li><a name="cmd.chapapp"></a><a href="#cmd.chapapp">\chapapp</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chapapp">110</a></li>
- <li><a name="cmd.chapappifchapterprefix"></a><a href="#cmd.chapappifchapterprefix">\chapappifchapterprefix</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chapappifchapterprefix">110</a></li>
- <li><a name="cmd.chapter*"></a><a href="#cmd.chapter*">\chapter*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chapter*">104</a></li>
- <li><a name="cmd.chapter"></a><a href="#cmd.chapter">\chapter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chapter">100</a></li>
- <li><a name="cmd.chapterformat"></a><a href="#cmd.chapterformat">\chapterformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chapterformat">108</a></li>
- <li><a name="cmd.chapterheadendvskip"></a><a href="#cmd.chapterheadendvskip">\chapterheadendvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.chapterheadendvskip">490</a></li>
- <li><a name="cmd.chapterheadmidvskip"></a><a href="#cmd.chapterheadmidvskip">\chapterheadmidvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.chapterheadmidvskip">490</a></li>
- <li><a name="cmd.chapterheadstartvskip"></a><a href="#cmd.chapterheadstartvskip">\chapterheadstartvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.chapterheadstartvskip">490</a></li>
- <li><a name="cmd.chapterlinesformat"></a><a href="#cmd.chapterlinesformat">\chapterlinesformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.chapterlinesformat">493</a></li>
- <li><a name="cmd.chapterlineswithprefixformat"></a><a href="#cmd.chapterlineswithprefixformat">\chapterlineswithprefixformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.chapterlineswithprefixformat">493</a></li>
- <li><a name="cmd.chaptermark"></a><a href="#cmd.chaptermark">\chaptermark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chaptermark">111</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.chaptermark">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.chaptermark">443</a></li>
- <li><a name="cmd.chaptermarkformat"></a><a href="#cmd.chaptermarkformat">\chaptermarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chaptermarkformat">111</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.chaptermarkformat">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.chaptermarkformat">443</a></li>
- <li><a name="cmd.chapternumdepth"></a><a href="#cmd.chapternumdepth">\chapternumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chapternumdepth">112</a></li>
+ <li><a name="cmd.UnifyLayersAtPageStyle"></a><a href="#cmd.UnifyLayersAtPageStyle">\UnifyLayersAtPageStyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.UnifyLayersAtPageStyle">439</a></li>
+ <li><a name="cmd.XdivY"></a><a href="#cmd.XdivY">\XdivY</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.XdivY">355</a></li>
+ <li><a name="cmd.XmodY"></a><a href="#cmd.XmodY">\XmodY</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.XmodY">355</a></li>
+ <li><a name="cmd.activateareas"></a><a href="#cmd.activateareas">\activateareas</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.activateareas">472</a></li>
+ <li><a name="cmd.addchap*"></a><a href="#cmd.addchap*">\addchap*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addchap*">106</a></li>
+ <li><a name="cmd.addchap"></a><a href="#cmd.addchap">\addchap</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addchap">106</a></li>
+ <li><a name="cmd.addchapmark"></a><a href="#cmd.addchapmark">\addchapmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addchapmark">112</a></li>
+ <li><a name="cmd.addchaptertocentry"></a><a href="#cmd.addchaptertocentry">\addchaptertocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addchaptertocentry">477</a></li>
+ <li><a name="cmd.addcontentslinetoeachtocfile"></a><a href="#cmd.addcontentslinetoeachtocfile">\addcontentslinetoeachtocfile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.addcontentslinetoeachtocfile">380</a></li>
+ <li><a name="cmd.addparagraphtocentry"></a><a href="#cmd.addparagraphtocentry">\addparagraphtocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addparagraphtocentry">477</a></li>
+ <li><a name="cmd.addpart*"></a><a href="#cmd.addpart*">\addpart*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addpart*">106</a></li>
+ <li><a name="cmd.addpart"></a><a href="#cmd.addpart">\addpart</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addpart">106</a></li>
+ <li><a name="cmd.addparttocentry"></a><a href="#cmd.addparttocentry">\addparttocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addparttocentry">477</a></li>
+ <li><a name="cmd.addrchar"></a><a href="#cmd.addrchar">\addrchar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.addrchar">250</a>, <a href="scrguien.pdf#desc:scraddr.cmd.addrchar">285</a></li>
+ <li><a name="cmd.addrentry"></a><a href="#cmd.addrentry">\addrentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.addrentry">249</a>, <a href="scrguien.pdf#desc:scraddr.cmd.addrentry">285</a></li>
+ <li><a name="cmd.addsec*"></a><a href="#cmd.addsec*">\addsec*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addsec*">106</a></li>
+ <li><a name="cmd.addsec"></a><a href="#cmd.addsec">\addsec</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addsec">106</a></li>
+ <li><a name="cmd.addsecmark"></a><a href="#cmd.addsecmark">\addsecmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.addsecmark">112</a></li>
+ <li><a name="cmd.addsectiontocentry"></a><a href="#cmd.addsectiontocentry">\addsectiontocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addsectiontocentry">477</a></li>
+ <li><a name="cmd.addsubparagraphtocentry"></a><a href="#cmd.addsubparagraphtocentry">\addsubparagraphtocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addsubparagraphtocentry">477</a></li>
+ <li><a name="cmd.addsubsectiontocentry"></a><a href="#cmd.addsubsectiontocentry">\addsubsectiontocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addsubsectiontocentry">477</a></li>
+ <li><a name="cmd.addsubsubsectiontocentry"></a><a href="#cmd.addsubsubsectiontocentry">\addsubsubsectiontocentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addsubsubsectiontocentry">477</a></li>
+ <li><a name="cmd.addtocentrydefault"></a><a href="#cmd.addtocentrydefault">\addtocentrydefault</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addtocentrydefault">476</a></li>
+ <li><a name="cmd.addtoeachtocfile"></a><a href="#cmd.addtoeachtocfile">\addtoeachtocfile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.addtoeachtocfile">379</a></li>
+ <li><a name="cmd.addtokomafont"></a><a href="#cmd.addtokomafont">\addtokomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.addtokomafont">180</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.addtokomafont">256</a>, <a href="scrguien.pdf#desc:scrextend.cmd.addtokomafont">294</a>, <a href="scrguien.pdf#desc:scrjura.cmd.addtokomafont">310</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.addtokomafont">459</a>, <a href="scrguien.pdf#desc:maincls.cmd.addtokomafont">59</a></li>
+ <li><a name="cmd.addtokomafontgobblelist"></a><a href="#cmd.addtokomafontgobblelist">\addtokomafontgobblelist</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addtokomafontgobblelist">478</a></li>
+ <li><a name="cmd.addtokomafontonearglist"></a><a href="#cmd.addtokomafontonearglist">\addtokomafontonearglist</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addtokomafontonearglist">478</a></li>
+ <li><a name="cmd.addtokomafontrelaxlist"></a><a href="#cmd.addtokomafontrelaxlist">\addtokomafontrelaxlist</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.addtokomafontrelaxlist">478</a></li>
+ <li><a name="cmd.addtolengthplength"></a><a href="#cmd.addtolengthplength">\addtolengthplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.addtolengthplength">168</a></li>
+ <li><a name="cmd.addtoplength"></a><a href="#cmd.addtoplength">\addtoplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.addtoplength">167</a></li>
+ <li><a name="cmd.addtoreffields"></a><a href="#cmd.addtoreffields">\addtoreffields</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.addtoreffields">504</a></li>
+ <li><a name="cmd.addtotoclist"></a><a href="#cmd.addtotoclist">\addtotoclist</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.addtotoclist">376</a></li>
+ <li><a name="cmd.addxcontentsline"></a><a href="#cmd.addxcontentsline">\addxcontentsline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.addxcontentsline">379</a></li>
+ <li><a name="cmd.addxcontentslinetoeachtocfile"></a><a href="#cmd.addxcontentslinetoeachtocfile">\addxcontentslinetoeachtocfile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.addxcontentslinetoeachtocfile">380</a></li>
+ <li><a name="cmd.adrchar"></a><a href="#cmd.adrchar">\adrchar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.adrchar">250</a>, <a href="scrguien.pdf#desc:scraddr.cmd.adrchar">285</a></li>
+ <li><a name="cmd.adrentry"></a><a href="#cmd.adrentry">\adrentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.adrentry">248</a>, <a href="scrguien.pdf#desc:scraddr.cmd.adrentry">285</a></li>
+ <li><a name="cmd.aliaskomafont"></a><a href="#cmd.aliaskomafont">\aliaskomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.aliaskomafont">478</a></li>
+ <li><a name="cmd.and"></a><a href="#cmd.and">\and</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.and">298</a>, <a href="scrguien.pdf#desc:maincls.cmd.and">68</a></li>
+ <li><a name="cmd.appendix"></a><a href="#cmd.appendix">\appendix</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.appendix">147</a></li>
+ <li><a name="cmd.appendixmore"></a><a href="#cmd.appendixmore">\appendixmore</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.appendixmore">500</a></li>
+ <li><a name="cmd.areaset"></a><a href="#cmd.areaset">\areaset</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.cmd.areaset">47</a>, <a href="scrguien.pdf#desc:typearea-experts.cmd.areaset">472</a></li>
+ <li><a name="cmd.author"></a><a href="#cmd.author">\author</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.author">298</a>, <a href="scrguien.pdf#desc:maincls.cmd.author">68</a></li>
+ <li><a name="cmd.autodot"></a><a href="#cmd.autodot">\autodot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.autodot">109</a></li>
+ <li><a name="cmd.automark*"></a><a href="#cmd.automark*">\automark*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.automark*">268</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.automark*">442</a></li>
+ <li><a name="cmd.automark"></a><a href="#cmd.automark">\automark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.automark">268</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.automark">442</a></li>
+ <li><a name="cmd.backmatter"></a><a href="#cmd.backmatter">\backmatter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.backmatter">94</a></li>
+ <li><a name="cmd.bankname"></a><a href="#cmd.bankname">\bankname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.bankname">511</a></li>
+ <li><a name="cmd.bib@beginhook"></a><a href="#cmd.bib@beginhook">\bib@beginhook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.bib@beginhook">502</a></li>
+ <li><a name="cmd.bib@endhook"></a><a href="#cmd.bib@endhook">\bib@endhook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.bib@endhook">502</a></li>
+ <li><a name="cmd.caption"></a><a href="#cmd.caption">\caption</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.caption">130</a></li>
+ <li><a name="cmd.captionabove"></a><a href="#cmd.captionabove">\captionabove</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.captionabove">130</a></li>
+ <li><a name="cmd.captionaboveof"></a><a href="#cmd.captionaboveof">\captionaboveof</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.captionaboveof">132</a></li>
+ <li><a name="cmd.captionbelow"></a><a href="#cmd.captionbelow">\captionbelow</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.captionbelow">130</a></li>
+ <li><a name="cmd.captionbelowof"></a><a href="#cmd.captionbelowof">\captionbelowof</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.captionbelowof">132</a></li>
+ <li><a name="cmd.captionformat"></a><a href="#cmd.captionformat">\captionformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.captionformat">137</a></li>
+ <li><a name="cmd.captionof"></a><a href="#cmd.captionof">\captionof</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.captionof">132</a></li>
+ <li><a name="cmd.captionsUKenglish"></a><a href="#cmd.captionsUKenglish">\captionsUKenglish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsUKenglish">512</a></li>
+ <li><a name="cmd.captionsUSenglish"></a><a href="#cmd.captionsUSenglish">\captionsUSenglish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsUSenglish">512</a></li>
+ <li><a name="cmd.captionsacadian"></a><a href="#cmd.captionsacadian">\captionsacadian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsacadian">512</a></li>
+ <li><a name="cmd.captionsamerican"></a><a href="#cmd.captionsamerican">\captionsamerican</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsamerican">512</a></li>
+ <li><a name="cmd.captionsaustralien"></a><a href="#cmd.captionsaustralien">\captionsaustralien</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsaustralien">512</a></li>
+ <li><a name="cmd.captionsaustrian"></a><a href="#cmd.captionsaustrian">\captionsaustrian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsaustrian">512</a></li>
+ <li><a name="cmd.captionsbritish"></a><a href="#cmd.captionsbritish">\captionsbritish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsbritish">512</a></li>
+ <li><a name="cmd.captionscanadian"></a><a href="#cmd.captionscanadian">\captionscanadian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionscanadian">512</a></li>
+ <li><a name="cmd.captionscanadien"></a><a href="#cmd.captionscanadien">\captionscanadien</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionscanadien">512</a></li>
+ <li><a name="cmd.captionscroatian"></a><a href="#cmd.captionscroatian">\captionscroatian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionscroatian">512</a></li>
+ <li><a name="cmd.captionsczech"></a><a href="#cmd.captionsczech">\captionsczech</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsczech">512</a></li>
+ <li><a name="cmd.captionsdutch"></a><a href="#cmd.captionsdutch">\captionsdutch</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsdutch">512</a></li>
+ <li><a name="cmd.captionsenglish"></a><a href="#cmd.captionsenglish">\captionsenglish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsenglish">512</a></li>
+ <li><a name="cmd.captionsfinnish"></a><a href="#cmd.captionsfinnish">\captionsfinnish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsfinnish">512</a></li>
+ <li><a name="cmd.captionsfrancais"></a><a href="#cmd.captionsfrancais">\captionsfrancais</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsfrancais">512</a></li>
+ <li><a name="cmd.captionsfrench"></a><a href="#cmd.captionsfrench">\captionsfrench</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsfrench">512</a></li>
+ <li><a name="cmd.captionsgerman"></a><a href="#cmd.captionsgerman">\captionsgerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsgerman">512</a></li>
+ <li><a name="cmd.captionsitalian"></a><a href="#cmd.captionsitalian">\captionsitalian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsitalian">512</a></li>
+ <li><a name="cmd.captionsnaustrian"></a><a href="#cmd.captionsnaustrian">\captionsnaustrian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsnaustrian">512</a></li>
+ <li><a name="cmd.captionsnewzealand"></a><a href="#cmd.captionsnewzealand">\captionsnewzealand</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsnewzealand">512</a></li>
+ <li><a name="cmd.captionsngerman"></a><a href="#cmd.captionsngerman">\captionsngerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsngerman">512</a></li>
+ <li><a name="cmd.captionsnorsk"></a><a href="#cmd.captionsnorsk">\captionsnorsk</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsnorsk">512</a></li>
+ <li><a name="cmd.captionsnswissgerman"></a><a href="#cmd.captionsnswissgerman">\captionsnswissgerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsnswissgerman">512</a></li>
+ <li><a name="cmd.captionspolish"></a><a href="#cmd.captionspolish">\captionspolish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionspolish">512</a></li>
+ <li><a name="cmd.captionsslovak"></a><a href="#cmd.captionsslovak">\captionsslovak</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsslovak">512</a></li>
+ <li><a name="cmd.captionsspanish"></a><a href="#cmd.captionsspanish">\captionsspanish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsspanish">512</a></li>
+ <li><a name="cmd.captionsswedish"></a><a href="#cmd.captionsswedish">\captionsswedish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsswedish">512</a></li>
+ <li><a name="cmd.captionsswissgerman"></a><a href="#cmd.captionsswissgerman">\captionsswissgerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.captionsswissgerman">512</a></li>
+ <li><a name="cmd.cc"></a><a href="#cmd.cc">\cc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cc">176</a></li>
+ <li><a name="cmd.ccname"></a><a href="#cmd.ccname">\ccname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.ccname">511</a></li>
+ <li><a name="cmd.cefoot*"></a><a href="#cmd.cefoot*">\cefoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cefoot*">264</a></li>
+ <li><a name="cmd.cefoot"></a><a href="#cmd.cefoot">\cefoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cefoot">262</a></li>
+ <li><a name="cmd.cehead*"></a><a href="#cmd.cehead*">\cehead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cehead*">261</a></li>
+ <li><a name="cmd.cehead"></a><a href="#cmd.cehead">\cehead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cehead">259</a></li>
+ <li><a name="cmd.cfoot*"></a><a href="#cmd.cfoot*">\cfoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cfoot*">266</a></li>
+ <li><a name="cmd.cfoot"></a><a href="#cmd.cfoot">\cfoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cfoot">265</a></li>
+ <li><a name="cmd.changefontsizes"></a><a href="#cmd.changefontsizes">\changefontsizes</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.changefontsizes">478</a></li>
+ <li><a name="cmd.chapapp"></a><a href="#cmd.chapapp">\chapapp</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chapapp">111</a></li>
+ <li><a name="cmd.chapappifchapterprefix"></a><a href="#cmd.chapappifchapterprefix">\chapappifchapterprefix</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chapappifchapterprefix">111</a></li>
+ <li><a name="cmd.chapter*"></a><a href="#cmd.chapter*">\chapter*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chapter*">105</a></li>
+ <li><a name="cmd.chapter"></a><a href="#cmd.chapter">\chapter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chapter">101</a></li>
+ <li><a name="cmd.chapterformat"></a><a href="#cmd.chapterformat">\chapterformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chapterformat">109</a></li>
+ <li><a name="cmd.chapterheadendvskip"></a><a href="#cmd.chapterheadendvskip">\chapterheadendvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.chapterheadendvskip">492</a></li>
+ <li><a name="cmd.chapterheadmidvskip"></a><a href="#cmd.chapterheadmidvskip">\chapterheadmidvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.chapterheadmidvskip">492</a></li>
+ <li><a name="cmd.chapterheadstartvskip"></a><a href="#cmd.chapterheadstartvskip">\chapterheadstartvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.chapterheadstartvskip">492</a></li>
+ <li><a name="cmd.chapterlinesformat"></a><a href="#cmd.chapterlinesformat">\chapterlinesformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.chapterlinesformat">495</a></li>
+ <li><a name="cmd.chapterlineswithprefixformat"></a><a href="#cmd.chapterlineswithprefixformat">\chapterlineswithprefixformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.chapterlineswithprefixformat">495</a></li>
+ <li><a name="cmd.chaptermark"></a><a href="#cmd.chaptermark">\chaptermark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chaptermark">112</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.chaptermark">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.chaptermark">445</a></li>
+ <li><a name="cmd.chaptermarkformat"></a><a href="#cmd.chaptermarkformat">\chaptermarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chaptermarkformat">112</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.chaptermarkformat">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.chaptermarkformat">445</a></li>
+ <li><a name="cmd.chapternumdepth"></a><a href="#cmd.chapternumdepth">\chapternumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chapternumdepth">113</a></li>
<li><a name="cmd.chapterpagestyle"></a><a href="#cmd.chapterpagestyle">\chapterpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.chapterpagestyle">83</a></li>
- <li><a name="cmd.chead*"></a><a href="#cmd.chead*">\chead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.chead*">265</a></li>
- <li><a name="cmd.chead"></a><a href="#cmd.chead">\chead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.chead">264</a></li>
- <li><a name="cmd.cleardoubleemptypage"></a><a href="#cmd.cleardoubleemptypage">\cleardoubleemptypage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleemptypage">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleemptypage">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleemptypage">87</a></li>
- <li><a name="cmd.cleardoubleevenemptypage"></a><a href="#cmd.cleardoubleevenemptypage">\cleardoubleevenemptypage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleevenemptypage">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleevenemptypage">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleevenemptypage">87</a></li>
- <li><a name="cmd.cleardoubleevenpage"></a><a href="#cmd.cleardoubleevenpage">\cleardoubleevenpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleevenpage">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleevenpage">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleevenpage">87</a></li>
- <li><a name="cmd.cleardoubleevenpageusingstyle"></a><a href="#cmd.cleardoubleevenpageusingstyle">\cleardoubleevenpageusingstyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleevenpageusingstyle">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleevenpageusingstyle">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleevenpageusingstyle">87</a></li>
- <li><a name="cmd.cleardoubleevenplainpage"></a><a href="#cmd.cleardoubleevenplainpage">\cleardoubleevenplainpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleevenplainpage">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleevenplainpage">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleevenplainpage">87</a></li>
- <li><a name="cmd.cleardoubleevenstandardpage"></a><a href="#cmd.cleardoubleevenstandardpage">\cleardoubleevenstandardpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleevenstandardpage">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleevenstandardpage">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleevenstandardpage">87</a></li>
- <li><a name="cmd.cleardoubleoddemptypage"></a><a href="#cmd.cleardoubleoddemptypage">\cleardoubleoddemptypage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleoddemptypage">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleoddemptypage">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleoddemptypage">87</a></li>
- <li><a name="cmd.cleardoubleoddpage"></a><a href="#cmd.cleardoubleoddpage">\cleardoubleoddpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleoddpage">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleoddpage">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleoddpage">87</a></li>
- <li><a name="cmd.cleardoubleoddpageusingstyle"></a><a href="#cmd.cleardoubleoddpageusingstyle">\cleardoubleoddpageusingstyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleoddpageusingstyle">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleoddpageusingstyle">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleoddpageusingstyle">87</a></li>
- <li><a name="cmd.cleardoubleoddplainpage"></a><a href="#cmd.cleardoubleoddplainpage">\cleardoubleoddplainpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleoddplainpage">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleoddplainpage">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleoddplainpage">87</a></li>
- <li><a name="cmd.cleardoubleoddstandardpage"></a><a href="#cmd.cleardoubleoddstandardpage">\cleardoubleoddstandardpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleoddstandardpage">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleoddstandardpage">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleoddstandardpage">87</a></li>
- <li><a name="cmd.cleardoublepage"></a><a href="#cmd.cleardoublepage">\cleardoublepage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoublepage">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoublepage">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoublepage">87</a></li>
- <li><a name="cmd.cleardoublepageusingstyle"></a><a href="#cmd.cleardoublepageusingstyle">\cleardoublepageusingstyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoublepageusingstyle">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoublepageusingstyle">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoublepageusingstyle">87</a></li>
- <li><a name="cmd.cleardoubleplainpage"></a><a href="#cmd.cleardoubleplainpage">\cleardoubleplainpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleplainpage">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleplainpage">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleplainpage">87</a></li>
- <li><a name="cmd.cleardoublestandardpage"></a><a href="#cmd.cleardoublestandardpage">\cleardoublestandardpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoublestandardpage">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoublestandardpage">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoublestandardpage">87</a></li>
- <li><a name="cmd.clearmainofpairofpagestyles"></a><a href="#cmd.clearmainofpairofpagestyles">\clearmainofpairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.clearmainofpairofpagestyles">451</a></li>
- <li><a name="cmd.clearnotecolumn"></a><a href="#cmd.clearnotecolumn">\clearnotecolumn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.clearnotecolumn">466</a></li>
- <li><a name="cmd.clearnotecolumns"></a><a href="#cmd.clearnotecolumns">\clearnotecolumns</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.clearnotecolumns">467</a></li>
- <li><a name="cmd.clearpage"></a><a href="#cmd.clearpage">\clearpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.clearpage">232</a>, <a href="scrguien.pdf#desc:scrextend.cmd.clearpage">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.clearpage">87</a></li>
- <li><a name="cmd.clearpairofpagestyles"></a><a href="#cmd.clearpairofpagestyles">\clearpairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.clearpairofpagestyles">451</a></li>
- <li><a name="cmd.clearplainofpairofpagestyles"></a><a href="#cmd.clearplainofpairofpagestyles">\clearplainofpairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.clearplainofpairofpagestyles">451</a></li>
- <li><a name="cmd.closing"></a><a href="#cmd.closing">\closing</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.closing">172</a></li>
- <li><a name="cmd.cofoot*"></a><a href="#cmd.cofoot*">\cofoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cofoot*">263</a></li>
- <li><a name="cmd.cofoot"></a><a href="#cmd.cofoot">\cofoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cofoot">261</a></li>
- <li><a name="cmd.cohead*"></a><a href="#cmd.cohead*">\cohead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cohead*">260</a></li>
- <li><a name="cmd.cohead"></a><a href="#cmd.cohead">\cohead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cohead">258</a></li>
- <li><a name="cmd.coverpagebottommargin"></a><a href="#cmd.coverpagebottommargin">\coverpagebottommargin</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.coverpagebottommargin">295</a>, <a href="scrguien.pdf#desc:maincls.cmd.coverpagebottommargin">64</a></li>
- <li><a name="cmd.coverpageleftmargin"></a><a href="#cmd.coverpageleftmargin">\coverpageleftmargin</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.coverpageleftmargin">295</a>, <a href="scrguien.pdf#desc:maincls.cmd.coverpageleftmargin">64</a></li>
- <li><a name="cmd.coverpagerightmargin"></a><a href="#cmd.coverpagerightmargin">\coverpagerightmargin</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.coverpagerightmargin">295</a>, <a href="scrguien.pdf#desc:maincls.cmd.coverpagerightmargin">64</a></li>
- <li><a name="cmd.coverpagetopmargin"></a><a href="#cmd.coverpagetopmargin">\coverpagetopmargin</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.coverpagetopmargin">295</a>, <a href="scrguien.pdf#desc:maincls.cmd.coverpagetopmargin">64</a></li>
- <li><a name="cmd.currentpagestyle"></a><a href="#cmd.currentpagestyle">\currentpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.currentpagestyle">430</a></li>
- <li><a name="cmd.customername"></a><a href="#cmd.customername">\customername</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.customername">509</a></li>
- <li><a name="cmd.date"></a><a href="#cmd.date">\date</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.date">297</a>, <a href="scrguien.pdf#desc:maincls.cmd.date">67</a></li>
- <li><a name="cmd.dateUKenglish"></a><a href="#cmd.dateUKenglish">\dateUKenglish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateUKenglish">511</a></li>
- <li><a name="cmd.dateUSenglish"></a><a href="#cmd.dateUSenglish">\dateUSenglish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateUSenglish">511</a></li>
- <li><a name="cmd.dateacadian"></a><a href="#cmd.dateacadian">\dateacadian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateacadian">511</a></li>
- <li><a name="cmd.dateamerican"></a><a href="#cmd.dateamerican">\dateamerican</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateamerican">511</a></li>
- <li><a name="cmd.dateaustralien"></a><a href="#cmd.dateaustralien">\dateaustralien</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateaustralien">511</a></li>
- <li><a name="cmd.dateaustrian"></a><a href="#cmd.dateaustrian">\dateaustrian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateaustrian">511</a></li>
- <li><a name="cmd.datebritish"></a><a href="#cmd.datebritish">\datebritish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datebritish">511</a></li>
- <li><a name="cmd.datecanadian"></a><a href="#cmd.datecanadian">\datecanadian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datecanadian">511</a></li>
- <li><a name="cmd.datecanadien"></a><a href="#cmd.datecanadien">\datecanadien</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datecanadien">511</a></li>
- <li><a name="cmd.datecroatian"></a><a href="#cmd.datecroatian">\datecroatian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datecroatian">511</a></li>
- <li><a name="cmd.dateczech"></a><a href="#cmd.dateczech">\dateczech</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateczech">511</a></li>
- <li><a name="cmd.datedutch"></a><a href="#cmd.datedutch">\datedutch</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datedutch">511</a></li>
- <li><a name="cmd.dateenglish"></a><a href="#cmd.dateenglish">\dateenglish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateenglish">511</a></li>
- <li><a name="cmd.datefinnish"></a><a href="#cmd.datefinnish">\datefinnish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datefinnish">511</a></li>
- <li><a name="cmd.datefrancais"></a><a href="#cmd.datefrancais">\datefrancais</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datefrancais">511</a></li>
- <li><a name="cmd.datefrench"></a><a href="#cmd.datefrench">\datefrench</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datefrench">511</a></li>
- <li><a name="cmd.dategerman"></a><a href="#cmd.dategerman">\dategerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dategerman">511</a></li>
- <li><a name="cmd.dateitalian"></a><a href="#cmd.dateitalian">\dateitalian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateitalian">511</a></li>
- <li><a name="cmd.datename"></a><a href="#cmd.datename">\datename</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datename">509</a></li>
- <li><a name="cmd.datenaustrian"></a><a href="#cmd.datenaustrian">\datenaustrian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datenaustrian">511</a></li>
- <li><a name="cmd.datenewzealand"></a><a href="#cmd.datenewzealand">\datenewzealand</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datenewzealand">511</a></li>
- <li><a name="cmd.datengerman"></a><a href="#cmd.datengerman">\datengerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datengerman">511</a></li>
- <li><a name="cmd.datenorsk"></a><a href="#cmd.datenorsk">\datenorsk</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datenorsk">511</a></li>
- <li><a name="cmd.datenswissgerman"></a><a href="#cmd.datenswissgerman">\datenswissgerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datenswissgerman">511</a></li>
- <li><a name="cmd.datepolish"></a><a href="#cmd.datepolish">\datepolish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datepolish">511</a></li>
- <li><a name="cmd.dateslovak"></a><a href="#cmd.dateslovak">\dateslovak</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateslovak">511</a></li>
- <li><a name="cmd.datespanish"></a><a href="#cmd.datespanish">\datespanish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datespanish">511</a></li>
- <li><a name="cmd.dateswedish"></a><a href="#cmd.dateswedish">\dateswedish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateswedish">511</a></li>
- <li><a name="cmd.dateswissgerman"></a><a href="#cmd.dateswissgerman">\dateswissgerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateswissgerman">511</a></li>
- <li><a name="cmd.dedication"></a><a href="#cmd.dedication">\dedication</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.dedication">299</a>, <a href="scrguien.pdf#desc:maincls.cmd.dedication">70</a></li>
- <li><a name="cmd.defaultreffields"></a><a href="#cmd.defaultreffields">\defaultreffields</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.defaultreffields">502</a></li>
- <li><a name="cmd.defcaptionname*"></a><a href="#cmd.defcaptionname*">\defcaptionname*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.defcaptionname*">350</a></li>
- <li><a name="cmd.defcaptionname"></a><a href="#cmd.defcaptionname">\defcaptionname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.defcaptionname">350</a></li>
- <li><a name="cmd.deffootnote"></a><a href="#cmd.deffootnote">\deffootnote</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.deffootnote">234</a>, <a href="scrguien.pdf#desc:scrextend.cmd.deffootnote">303</a>, <a href="scrguien.pdf#desc:maincls.cmd.deffootnote">91</a></li>
- <li><a name="cmd.deffootnotemark"></a><a href="#cmd.deffootnotemark">\deffootnotemark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.deffootnotemark">234</a>, <a href="scrguien.pdf#desc:scrextend.cmd.deffootnotemark">303</a>, <a href="scrguien.pdf#desc:maincls.cmd.deffootnotemark">91</a></li>
- <li><a name="cmd.defpagestyle"></a><a href="#cmd.defpagestyle">\defpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.defpagestyle">451</a></li>
- <li><a name="cmd.defpairofpagestyles"></a><a href="#cmd.defpairofpagestyles">\defpairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.defpairofpagestyles">450</a></li>
- <li><a name="cmd.deftocheading"></a><a href="#cmd.deftocheading">\deftocheading</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.deftocheading">382</a></li>
- <li><a name="cmd.dictum"></a><a href="#cmd.dictum">\dictum</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.dictum">115</a>, <a href="scrguien.pdf#desc:scrextend.cmd.dictum">304</a></li>
- <li><a name="cmd.dictumauthorformat"></a><a href="#cmd.dictumauthorformat">\dictumauthorformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.dictumauthorformat">115</a>, <a href="scrguien.pdf#desc:scrextend.cmd.dictumauthorformat">304</a></li>
- <li><a name="cmd.dictumrule"></a><a href="#cmd.dictumrule">\dictumrule</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.dictumrule">115</a>, <a href="scrguien.pdf#desc:scrextend.cmd.dictumrule">304</a></li>
- <li><a name="cmd.dictumwidth"></a><a href="#cmd.dictumwidth">\dictumwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.dictumwidth">115</a>, <a href="scrguien.pdf#desc:scrextend.cmd.dictumwidth">304</a></li>
- <li><a name="cmd.documentclass"></a><a href="#cmd.documentclass">\documentclass</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.documentclass">151</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.documentclass">253</a>, <a href="scrguien.pdf#desc:scrextend.cmd.documentclass">290</a>, <a href="scrguien.pdf#desc:scrjura.cmd.documentclass">308</a>, <a href="scrguien.pdf#desc:typearea.cmd.documentclass">32</a>, <a href="scrguien.pdf#desc:scrhack.cmd.documentclass">411</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.documentclass">416</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.documentclass">456</a>, <a href="scrguien.pdf#desc:maincls.cmd.documentclass">55</a></li>
- <li><a name="cmd.doforeachtocfile"></a><a href="#cmd.doforeachtocfile">\doforeachtocfile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.doforeachtocfile">377</a></li>
- <li><a name="cmd.ellipsispar"></a><a href="#cmd.ellipsispar">\ellipsispar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.ellipsispar">316</a></li>
- <li><a name="cmd.emailname"></a><a href="#cmd.emailname">\emailname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.emailname">509</a></li>
- <li><a name="cmd.encl"></a><a href="#cmd.encl">\encl</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.encl">175</a></li>
- <li><a name="cmd.enclname"></a><a href="#cmd.enclname">\enclname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.enclname">509</a></li>
- <li><a name="cmd.extratitle"></a><a href="#cmd.extratitle">\extratitle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.extratitle">296</a>, <a href="scrguien.pdf#desc:maincls.cmd.extratitle">66</a></li>
- <li><a name="cmd.faxname"></a><a href="#cmd.faxname">\faxname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.faxname">509</a></li>
- <li><a name="cmd.figureformat"></a><a href="#cmd.figureformat">\figureformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.figureformat">137</a></li>
- <li><a name="cmd.flushbottom"></a><a href="#cmd.flushbottom">\flushbottom</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.flushbottom">57</a></li>
- <li><a name="cmd.footnote"></a><a href="#cmd.footnote">\footnote</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.footnote">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.footnote">302</a>, <a href="scrguien.pdf#desc:maincls.cmd.footnote">89</a></li>
- <li><a name="cmd.footnotemark"></a><a href="#cmd.footnotemark">\footnotemark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.footnotemark">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.footnotemark">302</a>, <a href="scrguien.pdf#desc:maincls.cmd.footnotemark">89</a></li>
- <li><a name="cmd.footnotetext"></a><a href="#cmd.footnotetext">\footnotetext</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.footnotetext">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.footnotetext">302</a>, <a href="scrguien.pdf#desc:maincls.cmd.footnotetext">89</a></li>
- <li><a name="cmd.footref"></a><a href="#cmd.footref">\footref</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.footref">234</a>, <a href="scrguien.pdf#desc:scrextend.cmd.footref">302</a>, <a href="scrguien.pdf#desc:maincls.cmd.footref">90</a></li>
- <li><a name="cmd.foreachemptykomavar"></a><a href="#cmd.foreachemptykomavar">\foreachemptykomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.foreachemptykomavar">504</a></li>
- <li><a name="cmd.foreachkomavar"></a><a href="#cmd.foreachkomavar">\foreachkomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.foreachkomavar">504</a></li>
- <li><a name="cmd.foreachkomavarifempty"></a><a href="#cmd.foreachkomavarifempty">\foreachkomavarifempty</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.foreachkomavarifempty">504</a></li>
- <li><a name="cmd.foreachnonemptykomavar"></a><a href="#cmd.foreachnonemptykomavar">\foreachnonemptykomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.foreachnonemptykomavar">504</a></li>
- <li><a name="cmd.frontispiece"></a><a href="#cmd.frontispiece">\frontispiece</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.frontispiece">296</a>, <a href="scrguien.pdf#desc:maincls.cmd.frontispiece">66</a></li>
- <li><a name="cmd.frontmatter"></a><a href="#cmd.frontmatter">\frontmatter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.frontmatter">93</a></li>
- <li><a name="cmd.headfromname"></a><a href="#cmd.headfromname">\headfromname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.headfromname">509</a></li>
- <li><a name="cmd.headmark"></a><a href="#cmd.headmark">\headmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.headmark">270</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.headmark">442</a></li>
- <li><a name="cmd.headtoname"></a><a href="#cmd.headtoname">\headtoname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.headtoname">509</a></li>
- <li><a name="cmd.if@atdocument"></a><a href="#cmd.if@atdocument">\if@atdocument</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.if@atdocument">346</a></li>
- <li><a name="cmd.if@chapter"></a><a href="#cmd.if@chapter">\if@chapter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.if@chapter">417</a></li>
- <li><a name="cmd.if@mainmatter"></a><a href="#cmd.if@mainmatter">\if@mainmatter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.if@mainmatter">418</a></li>
- <li><a name="cmd.ifoot*"></a><a href="#cmd.ifoot*">\ifoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ifoot*">265</a></li>
- <li><a name="cmd.ifoot"></a><a href="#cmd.ifoot">\ifoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ifoot">264</a></li>
- <li><a name="cmd.ihead*"></a><a href="#cmd.ihead*">\ihead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ihead*">265</a></li>
- <li><a name="cmd.ihead"></a><a href="#cmd.ihead">\ihead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ihead">264</a></li>
+ <li><a name="cmd.chead*"></a><a href="#cmd.chead*">\chead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.chead*">266</a></li>
+ <li><a name="cmd.chead"></a><a href="#cmd.chead">\chead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.chead">265</a></li>
+ <li><a name="cmd.cleardoubleemptypage"></a><a href="#cmd.cleardoubleemptypage">\cleardoubleemptypage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleemptypage">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleemptypage">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleemptypage">88</a></li>
+ <li><a name="cmd.cleardoubleevenemptypage"></a><a href="#cmd.cleardoubleevenemptypage">\cleardoubleevenemptypage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleevenemptypage">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleevenemptypage">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleevenemptypage">88</a></li>
+ <li><a name="cmd.cleardoubleevenpage"></a><a href="#cmd.cleardoubleevenpage">\cleardoubleevenpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleevenpage">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleevenpage">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleevenpage">88</a></li>
+ <li><a name="cmd.cleardoubleevenpageusingstyle"></a><a href="#cmd.cleardoubleevenpageusingstyle">\cleardoubleevenpageusingstyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleevenpageusingstyle">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleevenpageusingstyle">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleevenpageusingstyle">88</a></li>
+ <li><a name="cmd.cleardoubleevenplainpage"></a><a href="#cmd.cleardoubleevenplainpage">\cleardoubleevenplainpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleevenplainpage">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleevenplainpage">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleevenplainpage">88</a></li>
+ <li><a name="cmd.cleardoubleevenstandardpage"></a><a href="#cmd.cleardoubleevenstandardpage">\cleardoubleevenstandardpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleevenstandardpage">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleevenstandardpage">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleevenstandardpage">88</a></li>
+ <li><a name="cmd.cleardoubleoddemptypage"></a><a href="#cmd.cleardoubleoddemptypage">\cleardoubleoddemptypage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleoddemptypage">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleoddemptypage">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleoddemptypage">88</a></li>
+ <li><a name="cmd.cleardoubleoddpage"></a><a href="#cmd.cleardoubleoddpage">\cleardoubleoddpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleoddpage">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleoddpage">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleoddpage">88</a></li>
+ <li><a name="cmd.cleardoubleoddpageusingstyle"></a><a href="#cmd.cleardoubleoddpageusingstyle">\cleardoubleoddpageusingstyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleoddpageusingstyle">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleoddpageusingstyle">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleoddpageusingstyle">88</a></li>
+ <li><a name="cmd.cleardoubleoddplainpage"></a><a href="#cmd.cleardoubleoddplainpage">\cleardoubleoddplainpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleoddplainpage">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleoddplainpage">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleoddplainpage">88</a></li>
+ <li><a name="cmd.cleardoubleoddstandardpage"></a><a href="#cmd.cleardoubleoddstandardpage">\cleardoubleoddstandardpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleoddstandardpage">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleoddstandardpage">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleoddstandardpage">88</a></li>
+ <li><a name="cmd.cleardoublepage"></a><a href="#cmd.cleardoublepage">\cleardoublepage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoublepage">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoublepage">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoublepage">88</a></li>
+ <li><a name="cmd.cleardoublepageusingstyle"></a><a href="#cmd.cleardoublepageusingstyle">\cleardoublepageusingstyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoublepageusingstyle">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoublepageusingstyle">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoublepageusingstyle">88</a></li>
+ <li><a name="cmd.cleardoubleplainpage"></a><a href="#cmd.cleardoubleplainpage">\cleardoubleplainpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoubleplainpage">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoubleplainpage">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoubleplainpage">88</a></li>
+ <li><a name="cmd.cleardoublestandardpage"></a><a href="#cmd.cleardoublestandardpage">\cleardoublestandardpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.cleardoublestandardpage">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.cleardoublestandardpage">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.cleardoublestandardpage">88</a></li>
+ <li><a name="cmd.clearmainofpairofpagestyles"></a><a href="#cmd.clearmainofpairofpagestyles">\clearmainofpairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.clearmainofpairofpagestyles">453</a></li>
+ <li><a name="cmd.clearnotecolumn"></a><a href="#cmd.clearnotecolumn">\clearnotecolumn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.clearnotecolumn">468</a></li>
+ <li><a name="cmd.clearnotecolumns"></a><a href="#cmd.clearnotecolumns">\clearnotecolumns</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.clearnotecolumns">469</a></li>
+ <li><a name="cmd.clearpage"></a><a href="#cmd.clearpage">\clearpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.clearpage">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.clearpage">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.clearpage">88</a></li>
+ <li><a name="cmd.clearpairofpagestyles"></a><a href="#cmd.clearpairofpagestyles">\clearpairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.clearpairofpagestyles">453</a></li>
+ <li><a name="cmd.clearplainofpairofpagestyles"></a><a href="#cmd.clearplainofpairofpagestyles">\clearplainofpairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.clearplainofpairofpagestyles">453</a></li>
+ <li><a name="cmd.closing"></a><a href="#cmd.closing">\closing</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.closing">173</a></li>
+ <li><a name="cmd.cofoot*"></a><a href="#cmd.cofoot*">\cofoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cofoot*">264</a></li>
+ <li><a name="cmd.cofoot"></a><a href="#cmd.cofoot">\cofoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cofoot">262</a></li>
+ <li><a name="cmd.cohead*"></a><a href="#cmd.cohead*">\cohead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cohead*">261</a></li>
+ <li><a name="cmd.cohead"></a><a href="#cmd.cohead">\cohead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.cohead">259</a></li>
+ <li><a name="cmd.coverpagebottommargin"></a><a href="#cmd.coverpagebottommargin">\coverpagebottommargin</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.coverpagebottommargin">296</a>, <a href="scrguien.pdf#desc:maincls.cmd.coverpagebottommargin">65</a></li>
+ <li><a name="cmd.coverpageleftmargin"></a><a href="#cmd.coverpageleftmargin">\coverpageleftmargin</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.coverpageleftmargin">296</a>, <a href="scrguien.pdf#desc:maincls.cmd.coverpageleftmargin">65</a></li>
+ <li><a name="cmd.coverpagerightmargin"></a><a href="#cmd.coverpagerightmargin">\coverpagerightmargin</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.coverpagerightmargin">296</a>, <a href="scrguien.pdf#desc:maincls.cmd.coverpagerightmargin">65</a></li>
+ <li><a name="cmd.coverpagetopmargin"></a><a href="#cmd.coverpagetopmargin">\coverpagetopmargin</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.coverpagetopmargin">296</a>, <a href="scrguien.pdf#desc:maincls.cmd.coverpagetopmargin">65</a></li>
+ <li><a name="cmd.currentpagestyle"></a><a href="#cmd.currentpagestyle">\currentpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.currentpagestyle">432</a></li>
+ <li><a name="cmd.customername"></a><a href="#cmd.customername">\customername</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.customername">511</a></li>
+ <li><a name="cmd.date"></a><a href="#cmd.date">\date</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.date">298</a>, <a href="scrguien.pdf#desc:maincls.cmd.date">68</a></li>
+ <li><a name="cmd.dateUKenglish"></a><a href="#cmd.dateUKenglish">\dateUKenglish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateUKenglish">513</a></li>
+ <li><a name="cmd.dateUSenglish"></a><a href="#cmd.dateUSenglish">\dateUSenglish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateUSenglish">513</a></li>
+ <li><a name="cmd.dateacadian"></a><a href="#cmd.dateacadian">\dateacadian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateacadian">513</a></li>
+ <li><a name="cmd.dateamerican"></a><a href="#cmd.dateamerican">\dateamerican</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateamerican">513</a></li>
+ <li><a name="cmd.dateaustralien"></a><a href="#cmd.dateaustralien">\dateaustralien</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateaustralien">513</a></li>
+ <li><a name="cmd.dateaustrian"></a><a href="#cmd.dateaustrian">\dateaustrian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateaustrian">513</a></li>
+ <li><a name="cmd.datebritish"></a><a href="#cmd.datebritish">\datebritish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datebritish">513</a></li>
+ <li><a name="cmd.datecanadian"></a><a href="#cmd.datecanadian">\datecanadian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datecanadian">513</a></li>
+ <li><a name="cmd.datecanadien"></a><a href="#cmd.datecanadien">\datecanadien</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datecanadien">513</a></li>
+ <li><a name="cmd.datecroatian"></a><a href="#cmd.datecroatian">\datecroatian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datecroatian">513</a></li>
+ <li><a name="cmd.dateczech"></a><a href="#cmd.dateczech">\dateczech</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateczech">513</a></li>
+ <li><a name="cmd.datedutch"></a><a href="#cmd.datedutch">\datedutch</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datedutch">513</a></li>
+ <li><a name="cmd.dateenglish"></a><a href="#cmd.dateenglish">\dateenglish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateenglish">513</a></li>
+ <li><a name="cmd.datefinnish"></a><a href="#cmd.datefinnish">\datefinnish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datefinnish">513</a></li>
+ <li><a name="cmd.datefrancais"></a><a href="#cmd.datefrancais">\datefrancais</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datefrancais">513</a></li>
+ <li><a name="cmd.datefrench"></a><a href="#cmd.datefrench">\datefrench</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datefrench">513</a></li>
+ <li><a name="cmd.dategerman"></a><a href="#cmd.dategerman">\dategerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dategerman">513</a></li>
+ <li><a name="cmd.dateitalian"></a><a href="#cmd.dateitalian">\dateitalian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateitalian">513</a></li>
+ <li><a name="cmd.datename"></a><a href="#cmd.datename">\datename</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datename">511</a></li>
+ <li><a name="cmd.datenaustrian"></a><a href="#cmd.datenaustrian">\datenaustrian</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datenaustrian">513</a></li>
+ <li><a name="cmd.datenewzealand"></a><a href="#cmd.datenewzealand">\datenewzealand</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datenewzealand">513</a></li>
+ <li><a name="cmd.datengerman"></a><a href="#cmd.datengerman">\datengerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datengerman">513</a></li>
+ <li><a name="cmd.datenorsk"></a><a href="#cmd.datenorsk">\datenorsk</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datenorsk">513</a></li>
+ <li><a name="cmd.datenswissgerman"></a><a href="#cmd.datenswissgerman">\datenswissgerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datenswissgerman">513</a></li>
+ <li><a name="cmd.datepolish"></a><a href="#cmd.datepolish">\datepolish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datepolish">513</a></li>
+ <li><a name="cmd.dateslovak"></a><a href="#cmd.dateslovak">\dateslovak</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateslovak">513</a></li>
+ <li><a name="cmd.datespanish"></a><a href="#cmd.datespanish">\datespanish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.datespanish">513</a></li>
+ <li><a name="cmd.dateswedish"></a><a href="#cmd.dateswedish">\dateswedish</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateswedish">513</a></li>
+ <li><a name="cmd.dateswissgerman"></a><a href="#cmd.dateswissgerman">\dateswissgerman</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.dateswissgerman">513</a></li>
+ <li><a name="cmd.dedication"></a><a href="#cmd.dedication">\dedication</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.dedication">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.dedication">70</a></li>
+ <li><a name="cmd.defaultreffields"></a><a href="#cmd.defaultreffields">\defaultreffields</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.defaultreffields">504</a></li>
+ <li><a name="cmd.defcaptionname*"></a><a href="#cmd.defcaptionname*">\defcaptionname*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.defcaptionname*">351</a></li>
+ <li><a name="cmd.defcaptionname"></a><a href="#cmd.defcaptionname">\defcaptionname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.defcaptionname">351</a></li>
+ <li><a name="cmd.deffootnote"></a><a href="#cmd.deffootnote">\deffootnote</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.deffootnote">235</a>, <a href="scrguien.pdf#desc:scrextend.cmd.deffootnote">304</a>, <a href="scrguien.pdf#desc:maincls.cmd.deffootnote">92</a></li>
+ <li><a name="cmd.deffootnotemark"></a><a href="#cmd.deffootnotemark">\deffootnotemark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.deffootnotemark">235</a>, <a href="scrguien.pdf#desc:scrextend.cmd.deffootnotemark">304</a>, <a href="scrguien.pdf#desc:maincls.cmd.deffootnotemark">92</a></li>
+ <li><a name="cmd.defpagestyle"></a><a href="#cmd.defpagestyle">\defpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.defpagestyle">453</a></li>
+ <li><a name="cmd.defpairofpagestyles"></a><a href="#cmd.defpairofpagestyles">\defpairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.defpairofpagestyles">452</a></li>
+ <li><a name="cmd.deftocheading"></a><a href="#cmd.deftocheading">\deftocheading</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.deftocheading">383</a></li>
+ <li><a name="cmd.dictum"></a><a href="#cmd.dictum">\dictum</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.dictum">116</a>, <a href="scrguien.pdf#desc:scrextend.cmd.dictum">305</a></li>
+ <li><a name="cmd.dictumauthorformat"></a><a href="#cmd.dictumauthorformat">\dictumauthorformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.dictumauthorformat">116</a>, <a href="scrguien.pdf#desc:scrextend.cmd.dictumauthorformat">305</a></li>
+ <li><a name="cmd.dictumrule"></a><a href="#cmd.dictumrule">\dictumrule</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.dictumrule">116</a>, <a href="scrguien.pdf#desc:scrextend.cmd.dictumrule">305</a></li>
+ <li><a name="cmd.dictumwidth"></a><a href="#cmd.dictumwidth">\dictumwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.dictumwidth">116</a>, <a href="scrguien.pdf#desc:scrextend.cmd.dictumwidth">305</a></li>
+ <li><a name="cmd.documentclass"></a><a href="#cmd.documentclass">\documentclass</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.documentclass">152</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.documentclass">254</a>, <a href="scrguien.pdf#desc:scrextend.cmd.documentclass">291</a>, <a href="scrguien.pdf#desc:scrjura.cmd.documentclass">309</a>, <a href="scrguien.pdf#desc:typearea.cmd.documentclass">32</a>, <a href="scrguien.pdf#desc:scrhack.cmd.documentclass">413</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.documentclass">418</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.documentclass">458</a>, <a href="scrguien.pdf#desc:maincls.cmd.documentclass">55</a></li>
+ <li><a name="cmd.doforeachtocfile"></a><a href="#cmd.doforeachtocfile">\doforeachtocfile</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.doforeachtocfile">378</a></li>
+ <li><a name="cmd.ellipsispar"></a><a href="#cmd.ellipsispar">\ellipsispar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.ellipsispar">317</a></li>
+ <li><a name="cmd.emailname"></a><a href="#cmd.emailname">\emailname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.emailname">511</a></li>
+ <li><a name="cmd.encl"></a><a href="#cmd.encl">\encl</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.encl">176</a></li>
+ <li><a name="cmd.enclname"></a><a href="#cmd.enclname">\enclname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.enclname">511</a></li>
+ <li><a name="cmd.extratitle"></a><a href="#cmd.extratitle">\extratitle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.extratitle">297</a>, <a href="scrguien.pdf#desc:maincls.cmd.extratitle">67</a></li>
+ <li><a name="cmd.faxname"></a><a href="#cmd.faxname">\faxname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.faxname">511</a></li>
+ <li><a name="cmd.figureformat"></a><a href="#cmd.figureformat">\figureformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.figureformat">138</a></li>
+ <li><a name="cmd.flushbottom"></a><a href="#cmd.flushbottom">\flushbottom</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.flushbottom">58</a></li>
+ <li><a name="cmd.footnote"></a><a href="#cmd.footnote">\footnote</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.footnote">234</a>, <a href="scrguien.pdf#desc:scrextend.cmd.footnote">303</a>, <a href="scrguien.pdf#desc:maincls.cmd.footnote">90</a></li>
+ <li><a name="cmd.footnotemark"></a><a href="#cmd.footnotemark">\footnotemark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.footnotemark">234</a>, <a href="scrguien.pdf#desc:scrextend.cmd.footnotemark">303</a>, <a href="scrguien.pdf#desc:maincls.cmd.footnotemark">90</a></li>
+ <li><a name="cmd.footnotetext"></a><a href="#cmd.footnotetext">\footnotetext</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.footnotetext">234</a>, <a href="scrguien.pdf#desc:scrextend.cmd.footnotetext">303</a>, <a href="scrguien.pdf#desc:maincls.cmd.footnotetext">90</a></li>
+ <li><a name="cmd.footref"></a><a href="#cmd.footref">\footref</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.footref">235</a>, <a href="scrguien.pdf#desc:scrextend.cmd.footref">303</a>, <a href="scrguien.pdf#desc:maincls.cmd.footref">91</a></li>
+ <li><a name="cmd.foreachemptykomavar"></a><a href="#cmd.foreachemptykomavar">\foreachemptykomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.foreachemptykomavar">506</a></li>
+ <li><a name="cmd.foreachkomavar"></a><a href="#cmd.foreachkomavar">\foreachkomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.foreachkomavar">506</a></li>
+ <li><a name="cmd.foreachkomavarifempty"></a><a href="#cmd.foreachkomavarifempty">\foreachkomavarifempty</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.foreachkomavarifempty">506</a></li>
+ <li><a name="cmd.foreachnonemptykomavar"></a><a href="#cmd.foreachnonemptykomavar">\foreachnonemptykomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.foreachnonemptykomavar">506</a></li>
+ <li><a name="cmd.frontispiece"></a><a href="#cmd.frontispiece">\frontispiece</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.frontispiece">297</a>, <a href="scrguien.pdf#desc:maincls.cmd.frontispiece">67</a></li>
+ <li><a name="cmd.frontmatter"></a><a href="#cmd.frontmatter">\frontmatter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.frontmatter">94</a></li>
+ <li><a name="cmd.headfromname"></a><a href="#cmd.headfromname">\headfromname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.headfromname">511</a></li>
+ <li><a name="cmd.headmark"></a><a href="#cmd.headmark">\headmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.headmark">271</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.headmark">444</a></li>
+ <li><a name="cmd.headtoname"></a><a href="#cmd.headtoname">\headtoname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.headtoname">511</a></li>
+ <li><a name="cmd.if@atdocument"></a><a href="#cmd.if@atdocument">\if@atdocument</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.if@atdocument">347</a></li>
+ <li><a name="cmd.if@chapter"></a><a href="#cmd.if@chapter">\if@chapter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.if@chapter">419</a></li>
+ <li><a name="cmd.if@mainmatter"></a><a href="#cmd.if@mainmatter">\if@mainmatter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.if@mainmatter">420</a></li>
+ <li><a name="cmd.ifoot*"></a><a href="#cmd.ifoot*">\ifoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ifoot*">266</a></li>
+ <li><a name="cmd.ifoot"></a><a href="#cmd.ifoot">\ifoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ifoot">265</a></li>
+ <li><a name="cmd.ihead*"></a><a href="#cmd.ihead*">\ihead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ihead*">266</a></li>
+ <li><a name="cmd.ihead"></a><a href="#cmd.ihead">\ihead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ihead">265</a></li>
<li><a name="cmd.indexpagestyle"></a><a href="#cmd.indexpagestyle">\indexpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.indexpagestyle">83</a></li>
- <li><a name="cmd.invoicename"></a><a href="#cmd.invoicename">\invoicename</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.invoicename">509</a></li>
- <li><a name="cmd.item"></a><a href="#cmd.item">\item</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.item">117</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.item">236</a></li>
- <li><a name="cmd.labelenumi"></a><a href="#cmd.labelenumi">\labelenumi</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelenumi">118</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelenumi">237</a></li>
- <li><a name="cmd.labelenumii"></a><a href="#cmd.labelenumii">\labelenumii</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelenumii">118</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelenumii">237</a></li>
- <li><a name="cmd.labelenumiii"></a><a href="#cmd.labelenumiii">\labelenumiii</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelenumiii">118</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelenumiii">237</a></li>
- <li><a name="cmd.labelenumiv"></a><a href="#cmd.labelenumiv">\labelenumiv</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelenumiv">118</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelenumiv">237</a></li>
- <li><a name="cmd.labelitemi"></a><a href="#cmd.labelitemi">\labelitemi</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelitemi">117</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelitemi">236</a></li>
- <li><a name="cmd.labelitemii"></a><a href="#cmd.labelitemii">\labelitemii</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelitemii">117</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelitemii">236</a></li>
- <li><a name="cmd.labelitemiii"></a><a href="#cmd.labelitemiii">\labelitemiii</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelitemiii">117</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelitemiii">236</a></li>
- <li><a name="cmd.labelitemiv"></a><a href="#cmd.labelitemiv">\labelitemiv</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelitemiv">117</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelitemiv">236</a></li>
- <li><a name="cmd.layercontentsmeasure"></a><a href="#cmd.layercontentsmeasure">\layercontentsmeasure</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layercontentsmeasure">429</a></li>
- <li><a name="cmd.layerhalign"></a><a href="#cmd.layerhalign">\layerhalign</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layerhalign">427</a></li>
- <li><a name="cmd.layerheight"></a><a href="#cmd.layerheight">\layerheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layerheight">427</a></li>
- <li><a name="cmd.layervalign"></a><a href="#cmd.layervalign">\layervalign</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layervalign">427</a></li>
- <li><a name="cmd.layerwidth"></a><a href="#cmd.layerwidth">\layerwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layerwidth">427</a></li>
- <li><a name="cmd.layerxoffset"></a><a href="#cmd.layerxoffset">\layerxoffset</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layerxoffset">427</a></li>
- <li><a name="cmd.layeryoffset"></a><a href="#cmd.layeryoffset">\layeryoffset</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layeryoffset">427</a></li>
- <li><a name="cmd.lefoot*"></a><a href="#cmd.lefoot*">\lefoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lefoot*">263</a></li>
- <li><a name="cmd.lefoot"></a><a href="#cmd.lefoot">\lefoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lefoot">261</a></li>
- <li><a name="cmd.leftbotmark"></a><a href="#cmd.leftbotmark">\leftbotmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.leftbotmark">441</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.leftbotmark">446</a></li>
- <li><a name="cmd.leftfirstmark"></a><a href="#cmd.leftfirstmark">\leftfirstmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.leftfirstmark">441</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.leftfirstmark">446</a></li>
- <li><a name="cmd.leftmark"></a><a href="#cmd.leftmark">\leftmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.leftmark">270</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.leftmark">441</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.leftmark">446</a></li>
- <li><a name="cmd.lefttopmark"></a><a href="#cmd.lefttopmark">\lefttopmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.lefttopmark">441</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.lefttopmark">446</a></li>
- <li><a name="cmd.lehead*"></a><a href="#cmd.lehead*">\lehead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lehead*">260</a></li>
- <li><a name="cmd.lehead"></a><a href="#cmd.lehead">\lehead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lehead">258</a></li>
- <li><a name="cmd.letterlastpage"></a><a href="#cmd.letterlastpage">\letterlastpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.letterlastpage">170</a></li>
- <li><a name="cmd.letterpagestyle"></a><a href="#cmd.letterpagestyle">\letterpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.letterpagestyle">226</a></li>
- <li><a name="cmd.listof/extension/name"></a><a href="#cmd.listof/extension/name">\listof/extension/name</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.listof/extension/name">380</a></li>
- <li><a name="cmd.listofeachtoc"></a><a href="#cmd.listofeachtoc">\listofeachtoc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.listofeachtoc">380</a></li>
- <li><a name="cmd.listoffigures"></a><a href="#cmd.listoffigures">\listoffigures</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.listoffigures">144</a></li>
- <li><a name="cmd.listoftables"></a><a href="#cmd.listoftables">\listoftables</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.listoftables">144</a></li>
- <li><a name="cmd.listoftoc*"></a><a href="#cmd.listoftoc*">\listoftoc*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.listoftoc*">380</a></li>
- <li><a name="cmd.listoftoc"></a><a href="#cmd.listoftoc">\listoftoc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.listoftoc">380</a></li>
- <li><a name="cmd.lofoot*"></a><a href="#cmd.lofoot*">\lofoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lofoot*">263</a></li>
- <li><a name="cmd.lofoot"></a><a href="#cmd.lofoot">\lofoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lofoot">261</a></li>
- <li><a name="cmd.lohead*"></a><a href="#cmd.lohead*">\lohead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lohead*">260</a></li>
- <li><a name="cmd.lohead"></a><a href="#cmd.lohead">\lohead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lohead">258</a></li>
- <li><a name="cmd.lowertitleback"></a><a href="#cmd.lowertitleback">\lowertitleback</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.lowertitleback">298</a>, <a href="scrguien.pdf#desc:maincls.cmd.lowertitleback">70</a></li>
- <li><a name="cmd.mainmatter"></a><a href="#cmd.mainmatter">\mainmatter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.mainmatter">93</a></li>
- <li><a name="cmd.makenote*"></a><a href="#cmd.makenote*">\makenote*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.makenote*">463</a></li>
- <li><a name="cmd.makenote"></a><a href="#cmd.makenote">\makenote</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.makenote">463</a></li>
- <li><a name="cmd.maketitle"></a><a href="#cmd.maketitle">\maketitle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.maketitle">296</a>, <a href="scrguien.pdf#desc:maincls.cmd.maketitle">66</a></li>
- <li><a name="cmd.manualmark"></a><a href="#cmd.manualmark">\manualmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.manualmark">267</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.manualmark">440</a></li>
- <li><a name="cmd.marginline"></a><a href="#cmd.marginline">\marginline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.marginline">145</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.marginline">240</a>, <a href="scrguien.pdf#desc:scrextend.cmd.marginline">306</a></li>
- <li><a name="cmd.marginpar"></a><a href="#cmd.marginpar">\marginpar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.marginpar">145</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.marginpar">240</a>, <a href="scrguien.pdf#desc:scrextend.cmd.marginpar">306</a></li>
- <li><a name="cmd.markboth"></a><a href="#cmd.markboth">\markboth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.markboth">230</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.markboth">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.markboth">444</a>, <a href="scrguien.pdf#desc:maincls.cmd.markboth">82</a></li>
- <li><a name="cmd.markdouble"></a><a href="#cmd.markdouble">\markdouble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.markdouble">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.markdouble">444</a></li>
- <li><a name="cmd.markleft"></a><a href="#cmd.markleft">\markleft</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.markleft">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.markleft">444</a></li>
- <li><a name="cmd.markright"></a><a href="#cmd.markright">\markright</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.markright">230</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.markright">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.markright">444</a>, <a href="scrguien.pdf#desc:maincls.cmd.markright">82</a></li>
- <li><a name="cmd.minisec"></a><a href="#cmd.minisec">\minisec</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.minisec">105</a></li>
- <li><a name="cmd.mobilephonename"></a><a href="#cmd.mobilephonename">\mobilephonename</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.mobilephonename">509</a></li>
- <li><a name="cmd.multfootsep"></a><a href="#cmd.multfootsep">\multfootsep</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.multfootsep">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.multfootsep">301</a>, <a href="scrguien.pdf#desc:maincls.cmd.multfootsep">89</a></li>
- <li><a name="cmd.multiplefootnoteseparator"></a><a href="#cmd.multiplefootnoteseparator">\multiplefootnoteseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.multiplefootnoteseparator">233</a>, <a href="scrguien.pdf#desc:scrextend.cmd.multiplefootnoteseparator">302</a>, <a href="scrguien.pdf#desc:maincls.cmd.multiplefootnoteseparator">89</a></li>
- <li><a name="cmd.myrefname"></a><a href="#cmd.myrefname">\myrefname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.myrefname">509</a></li>
- <li><a name="cmd.nameday"></a><a href="#cmd.nameday">\nameday</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.nameday">280</a></li>
- <li><a name="cmd.newbibstyle"></a><a href="#cmd.newbibstyle">\newbibstyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.newbibstyle">500</a></li>
- <li><a name="cmd.newblock"></a><a href="#cmd.newblock">\newblock</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.newblock">500</a></li>
- <li><a name="cmd.newcaptionname*"></a><a href="#cmd.newcaptionname*">\newcaptionname*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.newcaptionname*">350</a></li>
- <li><a name="cmd.newcaptionname"></a><a href="#cmd.newcaptionname">\newcaptionname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.newcaptionname">350</a></li>
- <li><a name="cmd.newdaylanguage"></a><a href="#cmd.newdaylanguage">\newdaylanguage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.newdaylanguage">280</a></li>
- <li><a name="cmd.newkomafont"></a><a href="#cmd.newkomafont">\newkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.newkomafont">476</a></li>
- <li><a name="cmd.newkomavar*"></a><a href="#cmd.newkomavar*">\newkomavar*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.newkomavar*">502</a></li>
- <li><a name="cmd.newkomavar"></a><a href="#cmd.newkomavar">\newkomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.newkomavar">502</a></li>
- <li><a name="cmd.newpagestyle"></a><a href="#cmd.newpagestyle">\newpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.newpagestyle">451</a></li>
- <li><a name="cmd.newpairofpagestyles"></a><a href="#cmd.newpairofpagestyles">\newpairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.newpairofpagestyles">450</a></li>
- <li><a name="cmd.newplength"></a><a href="#cmd.newplength">\newplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.newplength">164</a></li>
- <li><a name="cmd.nonumberline"></a><a href="#cmd.nonumberline">\nonumberline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.nonumberline">401</a></li>
- <li><a name="cmd.numberline"></a><a href="#cmd.numberline">\numberline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.numberline">386</a></li>
- <li><a name="cmd.ofoot*"></a><a href="#cmd.ofoot*">\ofoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ofoot*">265</a></li>
- <li><a name="cmd.ofoot"></a><a href="#cmd.ofoot">\ofoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ofoot">264</a></li>
- <li><a name="cmd.ohead*"></a><a href="#cmd.ohead*">\ohead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ohead*">265</a></li>
- <li><a name="cmd.ohead"></a><a href="#cmd.ohead">\ohead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ohead">264</a></li>
- <li><a name="cmd.opening"></a><a href="#cmd.opening">\opening</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.opening">171</a></li>
- <li><a name="cmd.othersectionlevelsformat"></a><a href="#cmd.othersectionlevelsformat">\othersectionlevelsformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.othersectionlevelsformat">108</a></li>
- <li><a name="cmd.pagemark"></a><a href="#cmd.pagemark">\pagemark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.pagemark">270</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.pagemark">442</a></li>
- <li><a name="cmd.pagename"></a><a href="#cmd.pagename">\pagename</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.pagename">509</a></li>
- <li><a name="cmd.pagenumbering"></a><a href="#cmd.pagenumbering">\pagenumbering</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.pagenumbering">84</a></li>
- <li><a name="cmd.pagestyle"></a><a href="#cmd.pagestyle">\pagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.pagestyle">229</a>, <a href="scrguien.pdf#desc:maincls.cmd.pagestyle">80</a></li>
- <li><a name="cmd.paragraph*"></a><a href="#cmd.paragraph*">\paragraph*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.paragraph*">104</a></li>
- <li><a name="cmd.paragraph"></a><a href="#cmd.paragraph">\paragraph</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.paragraph">100</a></li>
- <li><a name="cmd.paragraphformat"></a><a href="#cmd.paragraphformat">\paragraphformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.paragraphformat">108</a></li>
- <li><a name="cmd.paragraphmark"></a><a href="#cmd.paragraphmark">\paragraphmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.paragraphmark">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.paragraphmark">443</a></li>
- <li><a name="cmd.paragraphmarkformat"></a><a href="#cmd.paragraphmarkformat">\paragraphmarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.paragraphmarkformat">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.paragraphmarkformat">443</a></li>
- <li><a name="cmd.paragraphnumdepth"></a><a href="#cmd.paragraphnumdepth">\paragraphnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.paragraphnumdepth">112</a></li>
+ <li><a name="cmd.invoicename"></a><a href="#cmd.invoicename">\invoicename</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.invoicename">511</a></li>
+ <li><a name="cmd.item"></a><a href="#cmd.item">\item</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.item">118</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.item">237</a></li>
+ <li><a name="cmd.labelenumi"></a><a href="#cmd.labelenumi">\labelenumi</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelenumi">119</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelenumi">238</a></li>
+ <li><a name="cmd.labelenumii"></a><a href="#cmd.labelenumii">\labelenumii</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelenumii">119</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelenumii">238</a></li>
+ <li><a name="cmd.labelenumiii"></a><a href="#cmd.labelenumiii">\labelenumiii</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelenumiii">119</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelenumiii">238</a></li>
+ <li><a name="cmd.labelenumiv"></a><a href="#cmd.labelenumiv">\labelenumiv</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelenumiv">119</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelenumiv">238</a></li>
+ <li><a name="cmd.labelitemi"></a><a href="#cmd.labelitemi">\labelitemi</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelitemi">118</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelitemi">237</a></li>
+ <li><a name="cmd.labelitemii"></a><a href="#cmd.labelitemii">\labelitemii</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelitemii">118</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelitemii">237</a></li>
+ <li><a name="cmd.labelitemiii"></a><a href="#cmd.labelitemiii">\labelitemiii</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelitemiii">118</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelitemiii">237</a></li>
+ <li><a name="cmd.labelitemiv"></a><a href="#cmd.labelitemiv">\labelitemiv</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.labelitemiv">118</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.labelitemiv">237</a></li>
+ <li><a name="cmd.layercontentsmeasure"></a><a href="#cmd.layercontentsmeasure">\layercontentsmeasure</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layercontentsmeasure">431</a></li>
+ <li><a name="cmd.layerhalign"></a><a href="#cmd.layerhalign">\layerhalign</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layerhalign">429</a></li>
+ <li><a name="cmd.layerheight"></a><a href="#cmd.layerheight">\layerheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layerheight">429</a></li>
+ <li><a name="cmd.layervalign"></a><a href="#cmd.layervalign">\layervalign</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layervalign">429</a></li>
+ <li><a name="cmd.layerwidth"></a><a href="#cmd.layerwidth">\layerwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layerwidth">429</a></li>
+ <li><a name="cmd.layerxoffset"></a><a href="#cmd.layerxoffset">\layerxoffset</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layerxoffset">429</a></li>
+ <li><a name="cmd.layeryoffset"></a><a href="#cmd.layeryoffset">\layeryoffset</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.layeryoffset">429</a></li>
+ <li><a name="cmd.lefoot*"></a><a href="#cmd.lefoot*">\lefoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lefoot*">264</a></li>
+ <li><a name="cmd.lefoot"></a><a href="#cmd.lefoot">\lefoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lefoot">262</a></li>
+ <li><a name="cmd.leftbotmark"></a><a href="#cmd.leftbotmark">\leftbotmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.leftbotmark">443</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.leftbotmark">448</a></li>
+ <li><a name="cmd.leftfirstmark"></a><a href="#cmd.leftfirstmark">\leftfirstmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.leftfirstmark">443</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.leftfirstmark">448</a></li>
+ <li><a name="cmd.leftmark"></a><a href="#cmd.leftmark">\leftmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.leftmark">271</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.leftmark">443</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.leftmark">448</a></li>
+ <li><a name="cmd.lefttopmark"></a><a href="#cmd.lefttopmark">\lefttopmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.lefttopmark">443</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.lefttopmark">448</a></li>
+ <li><a name="cmd.lehead*"></a><a href="#cmd.lehead*">\lehead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lehead*">261</a></li>
+ <li><a name="cmd.lehead"></a><a href="#cmd.lehead">\lehead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lehead">259</a></li>
+ <li><a name="cmd.letterlastpage"></a><a href="#cmd.letterlastpage">\letterlastpage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.letterlastpage">171</a></li>
+ <li><a name="cmd.letterpagestyle"></a><a href="#cmd.letterpagestyle">\letterpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.letterpagestyle">227</a></li>
+ <li><a name="cmd.listof/extension/name"></a><a href="#cmd.listof/extension/name">\listof/extension/name</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.listof/extension/name">381</a></li>
+ <li><a name="cmd.listofeachtoc"></a><a href="#cmd.listofeachtoc">\listofeachtoc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.listofeachtoc">381</a></li>
+ <li><a name="cmd.listoffigures"></a><a href="#cmd.listoffigures">\listoffigures</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.listoffigures">145</a></li>
+ <li><a name="cmd.listoftables"></a><a href="#cmd.listoftables">\listoftables</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.listoftables">145</a></li>
+ <li><a name="cmd.listoftoc*"></a><a href="#cmd.listoftoc*">\listoftoc*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.listoftoc*">381</a></li>
+ <li><a name="cmd.listoftoc"></a><a href="#cmd.listoftoc">\listoftoc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.listoftoc">381</a></li>
+ <li><a name="cmd.lofoot*"></a><a href="#cmd.lofoot*">\lofoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lofoot*">264</a></li>
+ <li><a name="cmd.lofoot"></a><a href="#cmd.lofoot">\lofoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lofoot">262</a></li>
+ <li><a name="cmd.lohead*"></a><a href="#cmd.lohead*">\lohead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lohead*">261</a></li>
+ <li><a name="cmd.lohead"></a><a href="#cmd.lohead">\lohead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.lohead">259</a></li>
+ <li><a name="cmd.lowertitleback"></a><a href="#cmd.lowertitleback">\lowertitleback</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.lowertitleback">299</a>, <a href="scrguien.pdf#desc:maincls.cmd.lowertitleback">70</a></li>
+ <li><a name="cmd.mainmatter"></a><a href="#cmd.mainmatter">\mainmatter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.mainmatter">94</a></li>
+ <li><a name="cmd.makenote*"></a><a href="#cmd.makenote*">\makenote*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.makenote*">465</a></li>
+ <li><a name="cmd.makenote"></a><a href="#cmd.makenote">\makenote</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.makenote">465</a></li>
+ <li><a name="cmd.maketitle"></a><a href="#cmd.maketitle">\maketitle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.maketitle">297</a>, <a href="scrguien.pdf#desc:maincls.cmd.maketitle">66</a></li>
+ <li><a name="cmd.manualmark"></a><a href="#cmd.manualmark">\manualmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.manualmark">268</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.manualmark">442</a></li>
+ <li><a name="cmd.marginline"></a><a href="#cmd.marginline">\marginline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.marginline">146</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.marginline">241</a>, <a href="scrguien.pdf#desc:scrextend.cmd.marginline">307</a></li>
+ <li><a name="cmd.marginpar"></a><a href="#cmd.marginpar">\marginpar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.marginpar">146</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.marginpar">241</a>, <a href="scrguien.pdf#desc:scrextend.cmd.marginpar">307</a></li>
+ <li><a name="cmd.markboth"></a><a href="#cmd.markboth">\markboth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.markboth">231</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.markboth">274</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.markboth">446</a>, <a href="scrguien.pdf#desc:maincls.cmd.markboth">83</a></li>
+ <li><a name="cmd.markdouble"></a><a href="#cmd.markdouble">\markdouble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.markdouble">274</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.markdouble">446</a></li>
+ <li><a name="cmd.markleft"></a><a href="#cmd.markleft">\markleft</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.markleft">274</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.markleft">446</a></li>
+ <li><a name="cmd.markright"></a><a href="#cmd.markright">\markright</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.markright">231</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.markright">274</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.markright">446</a>, <a href="scrguien.pdf#desc:maincls.cmd.markright">83</a></li>
+ <li><a name="cmd.minisec"></a><a href="#cmd.minisec">\minisec</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.minisec">106</a></li>
+ <li><a name="cmd.mobilephonename"></a><a href="#cmd.mobilephonename">\mobilephonename</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.mobilephonename">511</a></li>
+ <li><a name="cmd.multfootsep"></a><a href="#cmd.multfootsep">\multfootsep</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.multfootsep">234</a>, <a href="scrguien.pdf#desc:scrextend.cmd.multfootsep">302</a>, <a href="scrguien.pdf#desc:maincls.cmd.multfootsep">89</a></li>
+ <li><a name="cmd.multiplefootnoteseparator"></a><a href="#cmd.multiplefootnoteseparator">\multiplefootnoteseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.multiplefootnoteseparator">234</a>, <a href="scrguien.pdf#desc:scrextend.cmd.multiplefootnoteseparator">303</a>, <a href="scrguien.pdf#desc:maincls.cmd.multiplefootnoteseparator">90</a></li>
+ <li><a name="cmd.myrefname"></a><a href="#cmd.myrefname">\myrefname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.myrefname">511</a></li>
+ <li><a name="cmd.nameday"></a><a href="#cmd.nameday">\nameday</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.nameday">281</a></li>
+ <li><a name="cmd.newbibstyle"></a><a href="#cmd.newbibstyle">\newbibstyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.newbibstyle">502</a></li>
+ <li><a name="cmd.newblock"></a><a href="#cmd.newblock">\newblock</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.newblock">502</a></li>
+ <li><a name="cmd.newcaptionname*"></a><a href="#cmd.newcaptionname*">\newcaptionname*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.newcaptionname*">351</a></li>
+ <li><a name="cmd.newcaptionname"></a><a href="#cmd.newcaptionname">\newcaptionname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.newcaptionname">351</a></li>
+ <li><a name="cmd.newdaylanguage"></a><a href="#cmd.newdaylanguage">\newdaylanguage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.newdaylanguage">281</a></li>
+ <li><a name="cmd.newkomafont"></a><a href="#cmd.newkomafont">\newkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.newkomafont">478</a></li>
+ <li><a name="cmd.newkomavar*"></a><a href="#cmd.newkomavar*">\newkomavar*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.newkomavar*">504</a></li>
+ <li><a name="cmd.newkomavar"></a><a href="#cmd.newkomavar">\newkomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.newkomavar">504</a></li>
+ <li><a name="cmd.newpagestyle"></a><a href="#cmd.newpagestyle">\newpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.newpagestyle">453</a></li>
+ <li><a name="cmd.newpairofpagestyles"></a><a href="#cmd.newpairofpagestyles">\newpairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.newpairofpagestyles">452</a></li>
+ <li><a name="cmd.newplength"></a><a href="#cmd.newplength">\newplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.newplength">165</a></li>
+ <li><a name="cmd.nonumberline"></a><a href="#cmd.nonumberline">\nonumberline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.nonumberline">403</a></li>
+ <li><a name="cmd.numberline"></a><a href="#cmd.numberline">\numberline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.numberline">387</a></li>
+ <li><a name="cmd.ofoot*"></a><a href="#cmd.ofoot*">\ofoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ofoot*">266</a></li>
+ <li><a name="cmd.ofoot"></a><a href="#cmd.ofoot">\ofoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ofoot">265</a></li>
+ <li><a name="cmd.ohead*"></a><a href="#cmd.ohead*">\ohead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ohead*">266</a></li>
+ <li><a name="cmd.ohead"></a><a href="#cmd.ohead">\ohead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.ohead">265</a></li>
+ <li><a name="cmd.opening"></a><a href="#cmd.opening">\opening</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.opening">172</a></li>
+ <li><a name="cmd.othersectionlevelsformat"></a><a href="#cmd.othersectionlevelsformat">\othersectionlevelsformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.othersectionlevelsformat">109</a></li>
+ <li><a name="cmd.pagemark"></a><a href="#cmd.pagemark">\pagemark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.pagemark">271</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.pagemark">444</a></li>
+ <li><a name="cmd.pagename"></a><a href="#cmd.pagename">\pagename</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.pagename">511</a></li>
+ <li><a name="cmd.pagenumbering"></a><a href="#cmd.pagenumbering">\pagenumbering</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.pagenumbering">85</a></li>
+ <li><a name="cmd.pagestyle"></a><a href="#cmd.pagestyle">\pagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.pagestyle">230</a>, <a href="scrguien.pdf#desc:maincls.cmd.pagestyle">81</a></li>
+ <li><a name="cmd.paragraph*"></a><a href="#cmd.paragraph*">\paragraph*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.paragraph*">105</a></li>
+ <li><a name="cmd.paragraph"></a><a href="#cmd.paragraph">\paragraph</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.paragraph">101</a></li>
+ <li><a name="cmd.paragraphformat"></a><a href="#cmd.paragraphformat">\paragraphformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.paragraphformat">109</a></li>
+ <li><a name="cmd.paragraphmark"></a><a href="#cmd.paragraphmark">\paragraphmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.paragraphmark">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.paragraphmark">445</a></li>
+ <li><a name="cmd.paragraphmarkformat"></a><a href="#cmd.paragraphmarkformat">\paragraphmarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.paragraphmarkformat">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.paragraphmarkformat">445</a></li>
+ <li><a name="cmd.paragraphnumdepth"></a><a href="#cmd.paragraphnumdepth">\paragraphnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.paragraphnumdepth">113</a></li>
<li><a name="cmd.paragraphtocdepth"></a><a href="#cmd.paragraphtocdepth">\paragraphtocdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.paragraphtocdepth">76</a></li>
- <li><a name="cmd.parellipsis"></a><a href="#cmd.parellipsis">\parellipsis</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.parellipsis">316</a></li>
- <li><a name="cmd.parformat"></a><a href="#cmd.parformat">\parformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.parformat">316</a></li>
- <li><a name="cmd.parformatseparation"></a><a href="#cmd.parformatseparation">\parformatseparation</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.parformatseparation">316</a></li>
- <li><a name="cmd.parname"></a><a href="#cmd.parname">\parname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.parname">323</a></li>
- <li><a name="cmd.parshortname"></a><a href="#cmd.parshortname">\parshortname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.parshortname">323</a></li>
- <li><a name="cmd.part*"></a><a href="#cmd.part*">\part*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.part*">104</a></li>
- <li><a name="cmd.part"></a><a href="#cmd.part">\part</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.part">100</a></li>
- <li><a name="cmd.partformat"></a><a href="#cmd.partformat">\partformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.partformat">108</a></li>
- <li><a name="cmd.partheademptypage"></a><a href="#cmd.partheademptypage">\partheademptypage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.partheademptypage">490</a></li>
- <li><a name="cmd.partheadendvskip"></a><a href="#cmd.partheadendvskip">\partheadendvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.partheadendvskip">490</a></li>
- <li><a name="cmd.partheadmidvskip"></a><a href="#cmd.partheadmidvskip">\partheadmidvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.partheadmidvskip">490</a></li>
- <li><a name="cmd.partheadstartvskip"></a><a href="#cmd.partheadstartvskip">\partheadstartvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.partheadstartvskip">490</a></li>
- <li><a name="cmd.partlineswithprefixformat"></a><a href="#cmd.partlineswithprefixformat">\partlineswithprefixformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.partlineswithprefixformat">491</a></li>
- <li><a name="cmd.partmark"></a><a href="#cmd.partmark">\partmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.partmark">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.partmark">443</a></li>
- <li><a name="cmd.partmarkformat"></a><a href="#cmd.partmarkformat">\partmarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.partmarkformat">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.partmarkformat">443</a></li>
- <li><a name="cmd.partnumdepth"></a><a href="#cmd.partnumdepth">\partnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.partnumdepth">112</a></li>
+ <li><a name="cmd.parellipsis"></a><a href="#cmd.parellipsis">\parellipsis</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.parellipsis">317</a></li>
+ <li><a name="cmd.parformat"></a><a href="#cmd.parformat">\parformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.parformat">317</a></li>
+ <li><a name="cmd.parformatseparation"></a><a href="#cmd.parformatseparation">\parformatseparation</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.parformatseparation">317</a></li>
+ <li><a name="cmd.parname"></a><a href="#cmd.parname">\parname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.parname">324</a></li>
+ <li><a name="cmd.parshortname"></a><a href="#cmd.parshortname">\parshortname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.parshortname">324</a></li>
+ <li><a name="cmd.part*"></a><a href="#cmd.part*">\part*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.part*">105</a></li>
+ <li><a name="cmd.part"></a><a href="#cmd.part">\part</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.part">101</a></li>
+ <li><a name="cmd.partformat"></a><a href="#cmd.partformat">\partformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.partformat">109</a></li>
+ <li><a name="cmd.partheademptypage"></a><a href="#cmd.partheademptypage">\partheademptypage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.partheademptypage">492</a></li>
+ <li><a name="cmd.partheadendvskip"></a><a href="#cmd.partheadendvskip">\partheadendvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.partheadendvskip">492</a></li>
+ <li><a name="cmd.partheadmidvskip"></a><a href="#cmd.partheadmidvskip">\partheadmidvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.partheadmidvskip">492</a></li>
+ <li><a name="cmd.partheadstartvskip"></a><a href="#cmd.partheadstartvskip">\partheadstartvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.partheadstartvskip">492</a></li>
+ <li><a name="cmd.partlineswithprefixformat"></a><a href="#cmd.partlineswithprefixformat">\partlineswithprefixformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.partlineswithprefixformat">493</a></li>
+ <li><a name="cmd.partmark"></a><a href="#cmd.partmark">\partmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.partmark">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.partmark">445</a></li>
+ <li><a name="cmd.partmarkformat"></a><a href="#cmd.partmarkformat">\partmarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.partmarkformat">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.partmarkformat">445</a></li>
+ <li><a name="cmd.partnumdepth"></a><a href="#cmd.partnumdepth">\partnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.partnumdepth">113</a></li>
<li><a name="cmd.partpagestyle"></a><a href="#cmd.partpagestyle">\partpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.partpagestyle">83</a></li>
<li><a name="cmd.parttocdepth"></a><a href="#cmd.parttocdepth">\parttocdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.parttocdepth">76</a></li>
- <li><a name="cmd.phonename"></a><a href="#cmd.phonename">\phonename</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.phonename">509</a></li>
- <li><a name="cmd.providecaptionname*"></a><a href="#cmd.providecaptionname*">\providecaptionname*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.providecaptionname*">350</a></li>
- <li><a name="cmd.providecaptionname"></a><a href="#cmd.providecaptionname">\providecaptionname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.providecaptionname">350</a></li>
- <li><a name="cmd.providepagestyle"></a><a href="#cmd.providepagestyle">\providepagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.providepagestyle">451</a></li>
- <li><a name="cmd.providepairofpagestyles"></a><a href="#cmd.providepairofpagestyles">\providepairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.providepairofpagestyles">450</a></li>
- <li><a name="cmd.ps"></a><a href="#cmd.ps">\ps</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.ps">173</a></li>
- <li><a name="cmd.publishers"></a><a href="#cmd.publishers">\publishers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.publishers">297</a>, <a href="scrguien.pdf#desc:maincls.cmd.publishers">67</a></li>
- <li><a name="cmd.putC"></a><a href="#cmd.putC">\putC</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.putC">428</a></li>
- <li><a name="cmd.putLL"></a><a href="#cmd.putLL">\putLL</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.putLL">428</a></li>
- <li><a name="cmd.putLR"></a><a href="#cmd.putLR">\putLR</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.putLR">428</a></li>
- <li><a name="cmd.putUL"></a><a href="#cmd.putUL">\putUL</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.putUL">428</a></li>
- <li><a name="cmd.putUR"></a><a href="#cmd.putUR">\putUR</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.putUR">428</a></li>
- <li><a name="cmd.raggedbottom"></a><a href="#cmd.raggedbottom">\raggedbottom</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggedbottom">57</a></li>
- <li><a name="cmd.raggedchapter"></a><a href="#cmd.raggedchapter">\raggedchapter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggedchapter">107</a></li>
- <li><a name="cmd.raggedchapterentry"></a><a href="#cmd.raggedchapterentry">\raggedchapterentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.raggedchapterentry">474</a></li>
- <li><a name="cmd.raggeddictum"></a><a href="#cmd.raggeddictum">\raggeddictum</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggeddictum">115</a>, <a href="scrguien.pdf#desc:scrextend.cmd.raggeddictum">304</a></li>
- <li><a name="cmd.raggeddictumauthor"></a><a href="#cmd.raggeddictumauthor">\raggeddictumauthor</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggeddictumauthor">115</a>, <a href="scrguien.pdf#desc:scrextend.cmd.raggeddictumauthor">304</a></li>
- <li><a name="cmd.raggeddictumtext"></a><a href="#cmd.raggeddictumtext">\raggeddictumtext</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggeddictumtext">115</a>, <a href="scrguien.pdf#desc:scrextend.cmd.raggeddictumtext">304</a></li>
- <li><a name="cmd.raggedfootnote"></a><a href="#cmd.raggedfootnote">\raggedfootnote</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.raggedfootnote">235</a>, <a href="scrguien.pdf#desc:scrextend.cmd.raggedfootnote">304</a>, <a href="scrguien.pdf#desc:maincls.cmd.raggedfootnote">93</a></li>
- <li><a name="cmd.raggedpart"></a><a href="#cmd.raggedpart">\raggedpart</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggedpart">107</a></li>
- <li><a name="cmd.raggedsection"></a><a href="#cmd.raggedsection">\raggedsection</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggedsection">107</a></li>
- <li><a name="cmd.raggedsignature"></a><a href="#cmd.raggedsignature">\raggedsignature</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.raggedsignature">219</a></li>
+ <li><a name="cmd.phonename"></a><a href="#cmd.phonename">\phonename</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.phonename">511</a></li>
+ <li><a name="cmd.providecaptionname*"></a><a href="#cmd.providecaptionname*">\providecaptionname*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.providecaptionname*">351</a></li>
+ <li><a name="cmd.providecaptionname"></a><a href="#cmd.providecaptionname">\providecaptionname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.providecaptionname">351</a></li>
+ <li><a name="cmd.providepagestyle"></a><a href="#cmd.providepagestyle">\providepagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.providepagestyle">453</a></li>
+ <li><a name="cmd.providepairofpagestyles"></a><a href="#cmd.providepairofpagestyles">\providepairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.providepairofpagestyles">452</a></li>
+ <li><a name="cmd.ps"></a><a href="#cmd.ps">\ps</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.ps">174</a></li>
+ <li><a name="cmd.publishers"></a><a href="#cmd.publishers">\publishers</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.publishers">298</a>, <a href="scrguien.pdf#desc:maincls.cmd.publishers">68</a></li>
+ <li><a name="cmd.putC"></a><a href="#cmd.putC">\putC</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.putC">430</a></li>
+ <li><a name="cmd.putLL"></a><a href="#cmd.putLL">\putLL</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.putLL">430</a></li>
+ <li><a name="cmd.putLR"></a><a href="#cmd.putLR">\putLR</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.putLR">430</a></li>
+ <li><a name="cmd.putUL"></a><a href="#cmd.putUL">\putUL</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.putUL">430</a></li>
+ <li><a name="cmd.putUR"></a><a href="#cmd.putUR">\putUR</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.putUR">430</a></li>
+ <li><a name="cmd.raggedbottom"></a><a href="#cmd.raggedbottom">\raggedbottom</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggedbottom">58</a></li>
+ <li><a name="cmd.raggedchapter"></a><a href="#cmd.raggedchapter">\raggedchapter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggedchapter">108</a></li>
+ <li><a name="cmd.raggedchapterentry"></a><a href="#cmd.raggedchapterentry">\raggedchapterentry</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.raggedchapterentry">476</a></li>
+ <li><a name="cmd.raggeddictum"></a><a href="#cmd.raggeddictum">\raggeddictum</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggeddictum">116</a>, <a href="scrguien.pdf#desc:scrextend.cmd.raggeddictum">305</a></li>
+ <li><a name="cmd.raggeddictumauthor"></a><a href="#cmd.raggeddictumauthor">\raggeddictumauthor</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggeddictumauthor">116</a>, <a href="scrguien.pdf#desc:scrextend.cmd.raggeddictumauthor">305</a></li>
+ <li><a name="cmd.raggeddictumtext"></a><a href="#cmd.raggeddictumtext">\raggeddictumtext</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggeddictumtext">116</a>, <a href="scrguien.pdf#desc:scrextend.cmd.raggeddictumtext">305</a></li>
+ <li><a name="cmd.raggedfootnote"></a><a href="#cmd.raggedfootnote">\raggedfootnote</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.raggedfootnote">236</a>, <a href="scrguien.pdf#desc:scrextend.cmd.raggedfootnote">305</a>, <a href="scrguien.pdf#desc:maincls.cmd.raggedfootnote">94</a></li>
+ <li><a name="cmd.raggedpart"></a><a href="#cmd.raggedpart">\raggedpart</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggedpart">108</a></li>
+ <li><a name="cmd.raggedsection"></a><a href="#cmd.raggedsection">\raggedsection</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.raggedsection">108</a></li>
+ <li><a name="cmd.raggedsignature"></a><a href="#cmd.raggedsignature">\raggedsignature</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.raggedsignature">220</a></li>
<li><a name="cmd.recalctypearea"></a><a href="#cmd.recalctypearea">\recalctypearea</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.cmd.recalctypearea">40</a></li>
- <li><a name="cmd.ref"></a><a href="#cmd.ref">\ref</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.ref">318</a></li>
- <li><a name="cmd.refClause"></a><a href="#cmd.refClause">\refClause</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refClause">318</a></li>
- <li><a name="cmd.refClauseN"></a><a href="#cmd.refClauseN">\refClauseN</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refClauseN">318</a></li>
- <li><a name="cmd.refL"></a><a href="#cmd.refL">\refL</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refL">318</a></li>
- <li><a name="cmd.refN"></a><a href="#cmd.refN">\refN</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refN">318</a></li>
- <li><a name="cmd.refPar"></a><a href="#cmd.refPar">\refPar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refPar">318</a></li>
- <li><a name="cmd.refParL"></a><a href="#cmd.refParL">\refParL</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refParL">318</a></li>
- <li><a name="cmd.refParN"></a><a href="#cmd.refParN">\refParN</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refParN">318</a></li>
- <li><a name="cmd.refParS"></a><a href="#cmd.refParS">\refParS</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refParS">318</a></li>
- <li><a name="cmd.refS"></a><a href="#cmd.refS">\refS</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refS">318</a></li>
- <li><a name="cmd.refSentence"></a><a href="#cmd.refSentence">\refSentence</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refSentence">319</a></li>
- <li><a name="cmd.refSentenceL"></a><a href="#cmd.refSentenceL">\refSentenceL</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refSentenceL">319</a></li>
- <li><a name="cmd.refSentenceN"></a><a href="#cmd.refSentenceN">\refSentenceN</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refSentenceN">319</a></li>
- <li><a name="cmd.refSentenceS"></a><a href="#cmd.refSentenceS">\refSentenceS</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refSentenceS">319</a></li>
- <li><a name="cmd.refoot*"></a><a href="#cmd.refoot*">\refoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.refoot*">263</a></li>
- <li><a name="cmd.refoot"></a><a href="#cmd.refoot">\refoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.refoot">261</a></li>
- <li><a name="cmd.rehead*"></a><a href="#cmd.rehead*">\rehead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rehead*">260</a></li>
- <li><a name="cmd.rehead"></a><a href="#cmd.rehead">\rehead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rehead">258</a></li>
- <li><a name="cmd.removefromtoclist"></a><a href="#cmd.removefromtoclist">\removefromtoclist</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.removefromtoclist">377</a></li>
- <li><a name="cmd.removereffields"></a><a href="#cmd.removereffields">\removereffields</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.removereffields">502</a></li>
- <li><a name="cmd.renewcaptionname*"></a><a href="#cmd.renewcaptionname*">\renewcaptionname*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.renewcaptionname*">350</a></li>
- <li><a name="cmd.renewcaptionname"></a><a href="#cmd.renewcaptionname">\renewcaptionname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.renewcaptionname">350</a></li>
- <li><a name="cmd.renewpagestyle"></a><a href="#cmd.renewpagestyle">\renewpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.renewpagestyle">451</a></li>
- <li><a name="cmd.renewpairofpagestyles"></a><a href="#cmd.renewpairofpagestyles">\renewpairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.renewpairofpagestyles">450</a></li>
- <li><a name="cmd.rightbotmark"></a><a href="#cmd.rightbotmark">\rightbotmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.rightbotmark">441</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.rightbotmark">446</a></li>
- <li><a name="cmd.rightfirstmark"></a><a href="#cmd.rightfirstmark">\rightfirstmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.rightfirstmark">441</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.rightfirstmark">446</a></li>
- <li><a name="cmd.rightmark"></a><a href="#cmd.rightmark">\rightmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rightmark">270</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.rightmark">441</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.rightmark">446</a></li>
- <li><a name="cmd.righttopmark"></a><a href="#cmd.righttopmark">\righttopmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.righttopmark">441</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.righttopmark">446</a></li>
- <li><a name="cmd.rofoot*"></a><a href="#cmd.rofoot*">\rofoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rofoot*">263</a></li>
- <li><a name="cmd.rofoot"></a><a href="#cmd.rofoot">\rofoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rofoot">261</a></li>
- <li><a name="cmd.rohead*"></a><a href="#cmd.rohead*">\rohead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rohead*">260</a></li>
- <li><a name="cmd.rohead"></a><a href="#cmd.rohead">\rohead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rohead">258</a></li>
- <li><a name="cmd.scr@startsection"></a><a href="#cmd.scr@startsection">\scr@startsection</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.scr@startsection">497</a></li>
- <li><a name="cmd.section*"></a><a href="#cmd.section*">\section*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.section*">104</a></li>
- <li><a name="cmd.section"></a><a href="#cmd.section">\section</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.section">100</a></li>
- <li><a name="cmd.sectioncatchphraseformat"></a><a href="#cmd.sectioncatchphraseformat">\sectioncatchphraseformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.sectioncatchphraseformat">495</a></li>
- <li><a name="cmd.sectionformat"></a><a href="#cmd.sectionformat">\sectionformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.sectionformat">108</a></li>
- <li><a name="cmd.sectionlinesformat"></a><a href="#cmd.sectionlinesformat">\sectionlinesformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.sectionlinesformat">495</a></li>
- <li><a name="cmd.sectionmark"></a><a href="#cmd.sectionmark">\sectionmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.sectionmark">111</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.sectionmark">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.sectionmark">443</a></li>
- <li><a name="cmd.sectionmarkformat"></a><a href="#cmd.sectionmarkformat">\sectionmarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.sectionmarkformat">111</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.sectionmarkformat">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.sectionmarkformat">443</a></li>
- <li><a name="cmd.sectionnumdepth"></a><a href="#cmd.sectionnumdepth">\sectionnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.sectionnumdepth">112</a></li>
+ <li><a name="cmd.ref"></a><a href="#cmd.ref">\ref</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.ref">319</a></li>
+ <li><a name="cmd.refClause"></a><a href="#cmd.refClause">\refClause</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refClause">319</a></li>
+ <li><a name="cmd.refClauseN"></a><a href="#cmd.refClauseN">\refClauseN</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refClauseN">319</a></li>
+ <li><a name="cmd.refL"></a><a href="#cmd.refL">\refL</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refL">319</a></li>
+ <li><a name="cmd.refN"></a><a href="#cmd.refN">\refN</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refN">319</a></li>
+ <li><a name="cmd.refPar"></a><a href="#cmd.refPar">\refPar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refPar">319</a></li>
+ <li><a name="cmd.refParL"></a><a href="#cmd.refParL">\refParL</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refParL">319</a></li>
+ <li><a name="cmd.refParN"></a><a href="#cmd.refParN">\refParN</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refParN">319</a></li>
+ <li><a name="cmd.refParS"></a><a href="#cmd.refParS">\refParS</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refParS">319</a></li>
+ <li><a name="cmd.refS"></a><a href="#cmd.refS">\refS</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refS">319</a></li>
+ <li><a name="cmd.refSentence"></a><a href="#cmd.refSentence">\refSentence</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refSentence">320</a></li>
+ <li><a name="cmd.refSentenceL"></a><a href="#cmd.refSentenceL">\refSentenceL</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refSentenceL">320</a></li>
+ <li><a name="cmd.refSentenceN"></a><a href="#cmd.refSentenceN">\refSentenceN</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refSentenceN">320</a></li>
+ <li><a name="cmd.refSentenceS"></a><a href="#cmd.refSentenceS">\refSentenceS</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.refSentenceS">320</a></li>
+ <li><a name="cmd.refoot*"></a><a href="#cmd.refoot*">\refoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.refoot*">264</a></li>
+ <li><a name="cmd.refoot"></a><a href="#cmd.refoot">\refoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.refoot">262</a></li>
+ <li><a name="cmd.rehead*"></a><a href="#cmd.rehead*">\rehead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rehead*">261</a></li>
+ <li><a name="cmd.rehead"></a><a href="#cmd.rehead">\rehead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rehead">259</a></li>
+ <li><a name="cmd.removefromtoclist"></a><a href="#cmd.removefromtoclist">\removefromtoclist</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.removefromtoclist">378</a></li>
+ <li><a name="cmd.removereffields"></a><a href="#cmd.removereffields">\removereffields</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.removereffields">504</a></li>
+ <li><a name="cmd.renewcaptionname*"></a><a href="#cmd.renewcaptionname*">\renewcaptionname*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.renewcaptionname*">351</a></li>
+ <li><a name="cmd.renewcaptionname"></a><a href="#cmd.renewcaptionname">\renewcaptionname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrbase.cmd.renewcaptionname">351</a></li>
+ <li><a name="cmd.renewpagestyle"></a><a href="#cmd.renewpagestyle">\renewpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.renewpagestyle">453</a></li>
+ <li><a name="cmd.renewpairofpagestyles"></a><a href="#cmd.renewpairofpagestyles">\renewpairofpagestyles</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.renewpairofpagestyles">452</a></li>
+ <li><a name="cmd.rightbotmark"></a><a href="#cmd.rightbotmark">\rightbotmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.rightbotmark">443</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.rightbotmark">448</a></li>
+ <li><a name="cmd.rightfirstmark"></a><a href="#cmd.rightfirstmark">\rightfirstmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.rightfirstmark">443</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.rightfirstmark">448</a></li>
+ <li><a name="cmd.rightmark"></a><a href="#cmd.rightmark">\rightmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rightmark">271</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.rightmark">443</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.rightmark">448</a></li>
+ <li><a name="cmd.righttopmark"></a><a href="#cmd.righttopmark">\righttopmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.righttopmark">443</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage-experts.cmd.righttopmark">448</a></li>
+ <li><a name="cmd.rofoot*"></a><a href="#cmd.rofoot*">\rofoot*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rofoot*">264</a></li>
+ <li><a name="cmd.rofoot"></a><a href="#cmd.rofoot">\rofoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rofoot">262</a></li>
+ <li><a name="cmd.rohead*"></a><a href="#cmd.rohead*">\rohead*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rohead*">261</a></li>
+ <li><a name="cmd.rohead"></a><a href="#cmd.rohead">\rohead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.rohead">259</a></li>
+ <li><a name="cmd.scr@startsection"></a><a href="#cmd.scr@startsection">\scr@startsection</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.scr@startsection">499</a></li>
+ <li><a name="cmd.section*"></a><a href="#cmd.section*">\section*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.section*">105</a></li>
+ <li><a name="cmd.section"></a><a href="#cmd.section">\section</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.section">101</a></li>
+ <li><a name="cmd.sectioncatchphraseformat"></a><a href="#cmd.sectioncatchphraseformat">\sectioncatchphraseformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.sectioncatchphraseformat">497</a></li>
+ <li><a name="cmd.sectionformat"></a><a href="#cmd.sectionformat">\sectionformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.sectionformat">109</a></li>
+ <li><a name="cmd.sectionlinesformat"></a><a href="#cmd.sectionlinesformat">\sectionlinesformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.sectionlinesformat">497</a></li>
+ <li><a name="cmd.sectionmark"></a><a href="#cmd.sectionmark">\sectionmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.sectionmark">112</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.sectionmark">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.sectionmark">445</a></li>
+ <li><a name="cmd.sectionmarkformat"></a><a href="#cmd.sectionmarkformat">\sectionmarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.sectionmarkformat">112</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.sectionmarkformat">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.sectionmarkformat">445</a></li>
+ <li><a name="cmd.sectionnumdepth"></a><a href="#cmd.sectionnumdepth">\sectionnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.sectionnumdepth">113</a></li>
<li><a name="cmd.sectiontocdepth"></a><a href="#cmd.sectiontocdepth">\sectiontocdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.sectiontocdepth">76</a></li>
- <li><a name="cmd.sentencename"></a><a href="#cmd.sentencename">\sentencename</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.sentencename">323</a></li>
- <li><a name="cmd.sentencenumberformat"></a><a href="#cmd.sentencenumberformat">\sentencenumberformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.sentencenumberformat">317</a></li>
- <li><a name="cmd.sentenceshortname"></a><a href="#cmd.sentenceshortname">\sentenceshortname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.sentenceshortname">323</a></li>
- <li><a name="cmd.setbibpreamble"></a><a href="#cmd.setbibpreamble">\setbibpreamble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setbibpreamble">148</a></li>
- <li><a name="cmd.setcapdynwidth"></a><a href="#cmd.setcapdynwidth">\setcapdynwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcapdynwidth">139</a></li>
- <li><a name="cmd.setcaphanging"></a><a href="#cmd.setcaphanging">\setcaphanging</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcaphanging">137</a></li>
- <li><a name="cmd.setcapindent*"></a><a href="#cmd.setcapindent*">\setcapindent*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcapindent*">137</a></li>
- <li><a name="cmd.setcapindent"></a><a href="#cmd.setcapindent">\setcapindent</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcapindent">137</a></li>
- <li><a name="cmd.setcapmargin*"></a><a href="#cmd.setcapmargin*">\setcapmargin*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcapmargin*">139</a></li>
- <li><a name="cmd.setcapmargin"></a><a href="#cmd.setcapmargin">\setcapmargin</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcapmargin">139</a></li>
- <li><a name="cmd.setcaptionalignment"></a><a href="#cmd.setcaptionalignment">\setcaptionalignment</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcaptionalignment">140</a></li>
- <li><a name="cmd.setcapwidth"></a><a href="#cmd.setcapwidth">\setcapwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcapwidth">139</a></li>
- <li><a name="cmd.setchapterpreamble"></a><a href="#cmd.setchapterpreamble">\setchapterpreamble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setchapterpreamble">113</a></li>
- <li><a name="cmd.setfootnoterule"></a><a href="#cmd.setfootnoterule">\setfootnoterule</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setfootnoterule">235</a>, <a href="scrguien.pdf#desc:maincls.cmd.setfootnoterule">92</a></li>
- <li><a name="cmd.setindexpreamble"></a><a href="#cmd.setindexpreamble">\setindexpreamble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setindexpreamble">150</a></li>
- <li><a name="cmd.setkomafont"></a><a href="#cmd.setkomafont">\setkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setkomafont">179</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.setkomafont">255</a>, <a href="scrguien.pdf#desc:scrextend.cmd.setkomafont">293</a>, <a href="scrguien.pdf#desc:scrjura.cmd.setkomafont">309</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.setkomafont">457</a>, <a href="scrguien.pdf#desc:maincls.cmd.setkomafont">59</a></li>
- <li><a name="cmd.setkomavar*"></a><a href="#cmd.setkomavar*">\setkomavar*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setkomavar*">158</a></li>
- <li><a name="cmd.setkomavar"></a><a href="#cmd.setkomavar">\setkomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setkomavar">158</a></li>
- <li><a name="cmd.setlengthtoplength"></a><a href="#cmd.setlengthtoplength">\setlengthtoplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setlengthtoplength">167</a></li>
- <li><a name="cmd.setparsizes"></a><a href="#cmd.setparsizes">\setparsizes</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.setparsizes">478</a></li>
- <li><a name="cmd.setpartpreamble"></a><a href="#cmd.setpartpreamble">\setpartpreamble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setpartpreamble">113</a></li>
- <li><a name="cmd.setplength"></a><a href="#cmd.setplength">\setplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setplength">166</a></li>
- <li><a name="cmd.setplengthtodepth"></a><a href="#cmd.setplengthtodepth">\setplengthtodepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setplengthtodepth">166</a></li>
- <li><a name="cmd.setplengthtoheight"></a><a href="#cmd.setplengthtoheight">\setplengthtoheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setplengthtoheight">166</a></li>
- <li><a name="cmd.setplengthtototalheight"></a><a href="#cmd.setplengthtototalheight">\setplengthtototalheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setplengthtototalheight">166</a></li>
- <li><a name="cmd.setplengthtowidth"></a><a href="#cmd.setplengthtowidth">\setplengthtowidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setplengthtowidth">166</a></li>
- <li><a name="cmd.settime"></a><a href="#cmd.settime">\settime</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrtime.cmd.settime">283</a></li>
- <li><a name="cmd.setuptoc"></a><a href="#cmd.setuptoc">\setuptoc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.setuptoc">383</a></li>
- <li><a name="cmd.storeareas"></a><a href="#cmd.storeareas">\storeareas</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.storeareas">470</a></li>
- <li><a name="cmd.subject"></a><a href="#cmd.subject">\subject</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.subject">297</a>, <a href="scrguien.pdf#desc:maincls.cmd.subject">67</a></li>
- <li><a name="cmd.subjectname"></a><a href="#cmd.subjectname">\subjectname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.subjectname">509</a></li>
- <li><a name="cmd.subparagraph*"></a><a href="#cmd.subparagraph*">\subparagraph*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subparagraph*">104</a></li>
- <li><a name="cmd.subparagraph"></a><a href="#cmd.subparagraph">\subparagraph</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subparagraph">100</a></li>
- <li><a name="cmd.subparagraphformat"></a><a href="#cmd.subparagraphformat">\subparagraphformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subparagraphformat">108</a></li>
- <li><a name="cmd.subparagraphmark"></a><a href="#cmd.subparagraphmark">\subparagraphmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.subparagraphmark">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.subparagraphmark">443</a></li>
- <li><a name="cmd.subparagraphmarkformat"></a><a href="#cmd.subparagraphmarkformat">\subparagraphmarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.subparagraphmarkformat">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.subparagraphmarkformat">443</a></li>
- <li><a name="cmd.subparagraphnumdepth"></a><a href="#cmd.subparagraphnumdepth">\subparagraphnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subparagraphnumdepth">112</a></li>
+ <li><a name="cmd.sentencename"></a><a href="#cmd.sentencename">\sentencename</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.sentencename">324</a></li>
+ <li><a name="cmd.sentencenumberformat"></a><a href="#cmd.sentencenumberformat">\sentencenumberformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.sentencenumberformat">318</a></li>
+ <li><a name="cmd.sentenceshortname"></a><a href="#cmd.sentenceshortname">\sentenceshortname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.sentenceshortname">324</a></li>
+ <li><a name="cmd.setbibpreamble"></a><a href="#cmd.setbibpreamble">\setbibpreamble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setbibpreamble">149</a></li>
+ <li><a name="cmd.setcapdynwidth"></a><a href="#cmd.setcapdynwidth">\setcapdynwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcapdynwidth">140</a></li>
+ <li><a name="cmd.setcaphanging"></a><a href="#cmd.setcaphanging">\setcaphanging</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcaphanging">138</a></li>
+ <li><a name="cmd.setcapindent*"></a><a href="#cmd.setcapindent*">\setcapindent*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcapindent*">138</a></li>
+ <li><a name="cmd.setcapindent"></a><a href="#cmd.setcapindent">\setcapindent</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcapindent">138</a></li>
+ <li><a name="cmd.setcapmargin*"></a><a href="#cmd.setcapmargin*">\setcapmargin*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcapmargin*">140</a></li>
+ <li><a name="cmd.setcapmargin"></a><a href="#cmd.setcapmargin">\setcapmargin</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcapmargin">140</a></li>
+ <li><a name="cmd.setcaptionalignment"></a><a href="#cmd.setcaptionalignment">\setcaptionalignment</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcaptionalignment">141</a></li>
+ <li><a name="cmd.setcapwidth"></a><a href="#cmd.setcapwidth">\setcapwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setcapwidth">140</a></li>
+ <li><a name="cmd.setchapterpreamble"></a><a href="#cmd.setchapterpreamble">\setchapterpreamble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setchapterpreamble">114</a></li>
+ <li><a name="cmd.setfootnoterule"></a><a href="#cmd.setfootnoterule">\setfootnoterule</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setfootnoterule">236</a>, <a href="scrguien.pdf#desc:maincls.cmd.setfootnoterule">93</a></li>
+ <li><a name="cmd.setindexpreamble"></a><a href="#cmd.setindexpreamble">\setindexpreamble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setindexpreamble">151</a></li>
+ <li><a name="cmd.setkomafont"></a><a href="#cmd.setkomafont">\setkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setkomafont">180</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.setkomafont">256</a>, <a href="scrguien.pdf#desc:scrextend.cmd.setkomafont">294</a>, <a href="scrguien.pdf#desc:scrjura.cmd.setkomafont">310</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.setkomafont">459</a>, <a href="scrguien.pdf#desc:maincls.cmd.setkomafont">59</a></li>
+ <li><a name="cmd.setkomavar*"></a><a href="#cmd.setkomavar*">\setkomavar*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setkomavar*">159</a></li>
+ <li><a name="cmd.setkomavar"></a><a href="#cmd.setkomavar">\setkomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setkomavar">159</a></li>
+ <li><a name="cmd.setlengthtoplength"></a><a href="#cmd.setlengthtoplength">\setlengthtoplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setlengthtoplength">168</a></li>
+ <li><a name="cmd.setparsizes"></a><a href="#cmd.setparsizes">\setparsizes</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls-experts.cmd.setparsizes">480</a></li>
+ <li><a name="cmd.setpartpreamble"></a><a href="#cmd.setpartpreamble">\setpartpreamble</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.setpartpreamble">114</a></li>
+ <li><a name="cmd.setplength"></a><a href="#cmd.setplength">\setplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setplength">167</a></li>
+ <li><a name="cmd.setplengthtodepth"></a><a href="#cmd.setplengthtodepth">\setplengthtodepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setplengthtodepth">167</a></li>
+ <li><a name="cmd.setplengthtoheight"></a><a href="#cmd.setplengthtoheight">\setplengthtoheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setplengthtoheight">167</a></li>
+ <li><a name="cmd.setplengthtototalheight"></a><a href="#cmd.setplengthtototalheight">\setplengthtototalheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setplengthtototalheight">167</a></li>
+ <li><a name="cmd.setplengthtowidth"></a><a href="#cmd.setplengthtowidth">\setplengthtowidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.setplengthtowidth">167</a></li>
+ <li><a name="cmd.settime"></a><a href="#cmd.settime">\settime</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrtime.cmd.settime">284</a></li>
+ <li><a name="cmd.setuptoc"></a><a href="#cmd.setuptoc">\setuptoc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.setuptoc">384</a></li>
+ <li><a name="cmd.storeareas"></a><a href="#cmd.storeareas">\storeareas</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea-experts.cmd.storeareas">472</a></li>
+ <li><a name="cmd.subject"></a><a href="#cmd.subject">\subject</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.subject">298</a>, <a href="scrguien.pdf#desc:maincls.cmd.subject">68</a></li>
+ <li><a name="cmd.subjectname"></a><a href="#cmd.subjectname">\subjectname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.subjectname">511</a></li>
+ <li><a name="cmd.subparagraph*"></a><a href="#cmd.subparagraph*">\subparagraph*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subparagraph*">105</a></li>
+ <li><a name="cmd.subparagraph"></a><a href="#cmd.subparagraph">\subparagraph</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subparagraph">101</a></li>
+ <li><a name="cmd.subparagraphformat"></a><a href="#cmd.subparagraphformat">\subparagraphformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subparagraphformat">109</a></li>
+ <li><a name="cmd.subparagraphmark"></a><a href="#cmd.subparagraphmark">\subparagraphmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.subparagraphmark">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.subparagraphmark">445</a></li>
+ <li><a name="cmd.subparagraphmarkformat"></a><a href="#cmd.subparagraphmarkformat">\subparagraphmarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.subparagraphmarkformat">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.subparagraphmarkformat">445</a></li>
+ <li><a name="cmd.subparagraphnumdepth"></a><a href="#cmd.subparagraphnumdepth">\subparagraphnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subparagraphnumdepth">113</a></li>
<li><a name="cmd.subparagraphtocdepth"></a><a href="#cmd.subparagraphtocdepth">\subparagraphtocdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subparagraphtocdepth">76</a></li>
- <li><a name="cmd.subsection*"></a><a href="#cmd.subsection*">\subsection*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsection*">104</a></li>
- <li><a name="cmd.subsection"></a><a href="#cmd.subsection">\subsection</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsection">100</a></li>
- <li><a name="cmd.subsectionformat"></a><a href="#cmd.subsectionformat">\subsectionformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsectionformat">108</a></li>
- <li><a name="cmd.subsectionmark"></a><a href="#cmd.subsectionmark">\subsectionmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsectionmark">111</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.subsectionmark">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.subsectionmark">443</a></li>
- <li><a name="cmd.subsectionmarkformat"></a><a href="#cmd.subsectionmarkformat">\subsectionmarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsectionmarkformat">111</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.subsectionmarkformat">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.subsectionmarkformat">443</a></li>
- <li><a name="cmd.subsectionnumdepth"></a><a href="#cmd.subsectionnumdepth">\subsectionnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsectionnumdepth">112</a></li>
+ <li><a name="cmd.subsection*"></a><a href="#cmd.subsection*">\subsection*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsection*">105</a></li>
+ <li><a name="cmd.subsection"></a><a href="#cmd.subsection">\subsection</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsection">101</a></li>
+ <li><a name="cmd.subsectionformat"></a><a href="#cmd.subsectionformat">\subsectionformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsectionformat">109</a></li>
+ <li><a name="cmd.subsectionmark"></a><a href="#cmd.subsectionmark">\subsectionmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsectionmark">112</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.subsectionmark">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.subsectionmark">445</a></li>
+ <li><a name="cmd.subsectionmarkformat"></a><a href="#cmd.subsectionmarkformat">\subsectionmarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsectionmarkformat">112</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.subsectionmarkformat">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.subsectionmarkformat">445</a></li>
+ <li><a name="cmd.subsectionnumdepth"></a><a href="#cmd.subsectionnumdepth">\subsectionnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsectionnumdepth">113</a></li>
<li><a name="cmd.subsectiontocdepth"></a><a href="#cmd.subsectiontocdepth">\subsectiontocdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsectiontocdepth">76</a></li>
- <li><a name="cmd.subsubsection*"></a><a href="#cmd.subsubsection*">\subsubsection*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsubsection*">104</a></li>
- <li><a name="cmd.subsubsection"></a><a href="#cmd.subsubsection">\subsubsection</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsubsection">100</a></li>
- <li><a name="cmd.subsubsectionformat"></a><a href="#cmd.subsubsectionformat">\subsubsectionformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsubsectionformat">108</a></li>
- <li><a name="cmd.subsubsectionmark"></a><a href="#cmd.subsubsectionmark">\subsubsectionmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.subsubsectionmark">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.subsubsectionmark">443</a></li>
- <li><a name="cmd.subsubsectionmarkformat"></a><a href="#cmd.subsubsectionmarkformat">\subsubsectionmarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.subsubsectionmarkformat">272</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.subsubsectionmarkformat">443</a></li>
- <li><a name="cmd.subsubsectionnumdepth"></a><a href="#cmd.subsubsectionnumdepth">\subsubsectionnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsubsectionnumdepth">112</a></li>
+ <li><a name="cmd.subsubsection*"></a><a href="#cmd.subsubsection*">\subsubsection*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsubsection*">105</a></li>
+ <li><a name="cmd.subsubsection"></a><a href="#cmd.subsubsection">\subsubsection</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsubsection">101</a></li>
+ <li><a name="cmd.subsubsectionformat"></a><a href="#cmd.subsubsectionformat">\subsubsectionformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsubsectionformat">109</a></li>
+ <li><a name="cmd.subsubsectionmark"></a><a href="#cmd.subsubsectionmark">\subsubsectionmark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.subsubsectionmark">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.subsubsectionmark">445</a></li>
+ <li><a name="cmd.subsubsectionmarkformat"></a><a href="#cmd.subsubsectionmarkformat">\subsubsectionmarkformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.subsubsectionmarkformat">273</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.subsubsectionmarkformat">445</a></li>
+ <li><a name="cmd.subsubsectionnumdepth"></a><a href="#cmd.subsubsectionnumdepth">\subsubsectionnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsubsectionnumdepth">113</a></li>
<li><a name="cmd.subsubsectiontocdepth"></a><a href="#cmd.subsubsectiontocdepth">\subsubsectiontocdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.subsubsectiontocdepth">76</a></li>
- <li><a name="cmd.subtitle"></a><a href="#cmd.subtitle">\subtitle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.subtitle">297</a>, <a href="scrguien.pdf#desc:maincls.cmd.subtitle">67</a></li>
- <li><a name="cmd.syncwithnotecolumn"></a><a href="#cmd.syncwithnotecolumn">\syncwithnotecolumn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.syncwithnotecolumn">464</a></li>
- <li><a name="cmd.syncwithnotecolumns"></a><a href="#cmd.syncwithnotecolumns">\syncwithnotecolumns</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.syncwithnotecolumns">466</a></li>
- <li><a name="cmd.tableformat"></a><a href="#cmd.tableformat">\tableformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.tableformat">137</a></li>
+ <li><a name="cmd.subtitle"></a><a href="#cmd.subtitle">\subtitle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.subtitle">298</a>, <a href="scrguien.pdf#desc:maincls.cmd.subtitle">68</a></li>
+ <li><a name="cmd.syncwithnotecolumn"></a><a href="#cmd.syncwithnotecolumn">\syncwithnotecolumn</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.syncwithnotecolumn">466</a></li>
+ <li><a name="cmd.syncwithnotecolumns"></a><a href="#cmd.syncwithnotecolumns">\syncwithnotecolumns</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.syncwithnotecolumns">468</a></li>
+ <li><a name="cmd.tableformat"></a><a href="#cmd.tableformat">\tableformat</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.tableformat">138</a></li>
<li><a name="cmd.tableofcontents"></a><a href="#cmd.tableofcontents">\tableofcontents</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.tableofcontents">75</a></li>
- <li><a name="cmd.thanks"></a><a href="#cmd.thanks">\thanks</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.thanks">297</a>, <a href="scrguien.pdf#desc:maincls.cmd.thanks">67</a></li>
- <li><a name="cmd.theenumi"></a><a href="#cmd.theenumi">\theenumi</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.theenumi">118</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.theenumi">237</a></li>
- <li><a name="cmd.theenumii"></a><a href="#cmd.theenumii">\theenumii</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.theenumii">118</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.theenumii">237</a></li>
- <li><a name="cmd.theenumiii"></a><a href="#cmd.theenumiii">\theenumiii</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.theenumiii">118</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.theenumiii">237</a></li>
- <li><a name="cmd.theenumiv"></a><a href="#cmd.theenumiv">\theenumiv</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.theenumiv">118</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.theenumiv">237</a></li>
- <li><a name="cmd.thefootnotemark"></a><a href="#cmd.thefootnotemark">\thefootnotemark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.thefootnotemark">234</a>, <a href="scrguien.pdf#desc:scrextend.cmd.thefootnotemark">303</a>, <a href="scrguien.pdf#desc:maincls.cmd.thefootnotemark">91</a></li>
- <li><a name="cmd.thepar"></a><a href="#cmd.thepar">\thepar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.thepar">316</a></li>
- <li><a name="cmd.thesentence"></a><a href="#cmd.thesentence">\thesentence</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.thesentence">317</a></li>
- <li><a name="cmd.thisletter"></a><a href="#cmd.thisletter">\thisletter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.thisletter">170</a></li>
- <li><a name="cmd.thispagestyle"></a><a href="#cmd.thispagestyle">\thispagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.thispagestyle">229</a>, <a href="scrguien.pdf#desc:maincls.cmd.thispagestyle">80</a></li>
- <li><a name="cmd.thistime*"></a><a href="#cmd.thistime*">\thistime*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrtime.cmd.thistime*">282</a></li>
- <li><a name="cmd.thistime"></a><a href="#cmd.thistime">\thistime</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrtime.cmd.thistime">282</a></li>
- <li><a name="cmd.title"></a><a href="#cmd.title">\title</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.title">297</a>, <a href="scrguien.pdf#desc:maincls.cmd.title">67</a></li>
- <li><a name="cmd.titlehead"></a><a href="#cmd.titlehead">\titlehead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.titlehead">297</a>, <a href="scrguien.pdf#desc:maincls.cmd.titlehead">67</a></li>
- <li><a name="cmd.titlepagestyle"></a><a href="#cmd.titlepagestyle">\titlepagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.titlepagestyle">299</a>, <a href="scrguien.pdf#desc:maincls.cmd.titlepagestyle">83</a></li>
- <li><a name="cmd.tocbasic@/extension/@after@hook"></a><a href="#cmd.tocbasic@/extension/@after@hook">\tocbasic@/extension/@after@hook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@/extension/@after@hook">401</a></li>
- <li><a name="cmd.tocbasic@/extension/@before@hook"></a><a href="#cmd.tocbasic@/extension/@before@hook">\tocbasic@/extension/@before@hook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@/extension/@before@hook">401</a></li>
- <li><a name="cmd.tocbasic@@after@hook"></a><a href="#cmd.tocbasic@@after@hook">\tocbasic@@after@hook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@@after@hook">400</a></li>
- <li><a name="cmd.tocbasic@@before@hook"></a><a href="#cmd.tocbasic@@before@hook">\tocbasic@@before@hook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@@before@hook">400</a></li>
- <li><a name="cmd.tocbasic@DependOnPenaltyAndTOCLevel"></a><a href="#cmd.tocbasic@DependOnPenaltyAndTOCLevel">\tocbasic@DependOnPenaltyAndTOCLevel</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@DependOnPenaltyAndTOCLevel">401</a></li>
- <li><a name="cmd.tocbasic@SetPenaltyByTOCLevel"></a><a href="#cmd.tocbasic@SetPenaltyByTOCLevel">\tocbasic@SetPenaltyByTOCLevel</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@SetPenaltyByTOCLevel">401</a></li>
- <li><a name="cmd.tocbasic@addxcontentsline"></a><a href="#cmd.tocbasic@addxcontentsline">\tocbasic@addxcontentsline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@addxcontentsline">401</a></li>
- <li><a name="cmd.tocbasic@extend@babel"></a><a href="#cmd.tocbasic@extend@babel">\tocbasic@extend@babel</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@extend@babel">399</a></li>
- <li><a name="cmd.tocbasic@listhead"></a><a href="#cmd.tocbasic@listhead">\tocbasic@listhead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@listhead">401</a></li>
- <li><a name="cmd.tocbasic@listhead@/extension/"></a><a href="#cmd.tocbasic@listhead@/extension/">\tocbasic@listhead@/extension/</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@listhead@/extension/">401</a></li>
- <li><a name="cmd.tocbasic@starttoc"></a><a href="#cmd.tocbasic@starttoc">\tocbasic@starttoc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@starttoc">400</a></li>
- <li><a name="cmd.tocbasicautomode"></a><a href="#cmd.tocbasicautomode">\tocbasicautomode</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasicautomode">377</a></li>
- <li><a name="cmd.todaysname"></a><a href="#cmd.todaysname">\todaysname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.todaysname">279</a></li>
- <li><a name="cmd.todaysnumber"></a><a href="#cmd.todaysnumber">\todaysnumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.todaysnumber">279</a></li>
- <li><a name="cmd.toplevelpagestyle"></a><a href="#cmd.toplevelpagestyle">\toplevelpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.toplevelpagestyle">430</a></li>
+ <li><a name="cmd.thanks"></a><a href="#cmd.thanks">\thanks</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.thanks">298</a>, <a href="scrguien.pdf#desc:maincls.cmd.thanks">68</a></li>
+ <li><a name="cmd.theenumi"></a><a href="#cmd.theenumi">\theenumi</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.theenumi">119</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.theenumi">238</a></li>
+ <li><a name="cmd.theenumii"></a><a href="#cmd.theenumii">\theenumii</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.theenumii">119</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.theenumii">238</a></li>
+ <li><a name="cmd.theenumiii"></a><a href="#cmd.theenumiii">\theenumiii</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.theenumiii">119</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.theenumiii">238</a></li>
+ <li><a name="cmd.theenumiv"></a><a href="#cmd.theenumiv">\theenumiv</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.cmd.theenumiv">119</a>, <a href="scrguien.pdf#desc:scrlttr2.cmd.theenumiv">238</a></li>
+ <li><a name="cmd.thefootnotemark"></a><a href="#cmd.thefootnotemark">\thefootnotemark</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.thefootnotemark">235</a>, <a href="scrguien.pdf#desc:scrextend.cmd.thefootnotemark">304</a>, <a href="scrguien.pdf#desc:maincls.cmd.thefootnotemark">92</a></li>
+ <li><a name="cmd.thepar"></a><a href="#cmd.thepar">\thepar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.thepar">317</a></li>
+ <li><a name="cmd.thesentence"></a><a href="#cmd.thesentence">\thesentence</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.thesentence">318</a></li>
+ <li><a name="cmd.thisletter"></a><a href="#cmd.thisletter">\thisletter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.thisletter">171</a></li>
+ <li><a name="cmd.thispagestyle"></a><a href="#cmd.thispagestyle">\thispagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.thispagestyle">230</a>, <a href="scrguien.pdf#desc:maincls.cmd.thispagestyle">81</a></li>
+ <li><a name="cmd.thistime*"></a><a href="#cmd.thistime*">\thistime*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrtime.cmd.thistime*">283</a></li>
+ <li><a name="cmd.thistime"></a><a href="#cmd.thistime">\thistime</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrtime.cmd.thistime">283</a></li>
+ <li><a name="cmd.title"></a><a href="#cmd.title">\title</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.title">298</a>, <a href="scrguien.pdf#desc:maincls.cmd.title">68</a></li>
+ <li><a name="cmd.titlehead"></a><a href="#cmd.titlehead">\titlehead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.titlehead">298</a>, <a href="scrguien.pdf#desc:maincls.cmd.titlehead">68</a></li>
+ <li><a name="cmd.titlepagestyle"></a><a href="#cmd.titlepagestyle">\titlepagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.titlepagestyle">300</a>, <a href="scrguien.pdf#desc:maincls.cmd.titlepagestyle">83</a></li>
+ <li><a name="cmd.tocbasic@/extension/@after@hook"></a><a href="#cmd.tocbasic@/extension/@after@hook">\tocbasic@/extension/@after@hook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@/extension/@after@hook">402</a></li>
+ <li><a name="cmd.tocbasic@/extension/@before@hook"></a><a href="#cmd.tocbasic@/extension/@before@hook">\tocbasic@/extension/@before@hook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@/extension/@before@hook">402</a></li>
+ <li><a name="cmd.tocbasic@@after@hook"></a><a href="#cmd.tocbasic@@after@hook">\tocbasic@@after@hook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@@after@hook">402</a></li>
+ <li><a name="cmd.tocbasic@@before@hook"></a><a href="#cmd.tocbasic@@before@hook">\tocbasic@@before@hook</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@@before@hook">402</a></li>
+ <li><a name="cmd.tocbasic@DependOnPenaltyAndTOCLevel"></a><a href="#cmd.tocbasic@DependOnPenaltyAndTOCLevel">\tocbasic@DependOnPenaltyAndTOCLevel</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@DependOnPenaltyAndTOCLevel">403</a></li>
+ <li><a name="cmd.tocbasic@SetPenaltyByTOCLevel"></a><a href="#cmd.tocbasic@SetPenaltyByTOCLevel">\tocbasic@SetPenaltyByTOCLevel</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@SetPenaltyByTOCLevel">403</a></li>
+ <li><a name="cmd.tocbasic@addxcontentsline"></a><a href="#cmd.tocbasic@addxcontentsline">\tocbasic@addxcontentsline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@addxcontentsline">403</a></li>
+ <li><a name="cmd.tocbasic@extend@babel"></a><a href="#cmd.tocbasic@extend@babel">\tocbasic@extend@babel</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@extend@babel">401</a></li>
+ <li><a name="cmd.tocbasic@listhead"></a><a href="#cmd.tocbasic@listhead">\tocbasic@listhead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@listhead">403</a></li>
+ <li><a name="cmd.tocbasic@listhead@/extension/"></a><a href="#cmd.tocbasic@listhead@/extension/">\tocbasic@listhead@/extension/</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@listhead@/extension/">403</a></li>
+ <li><a name="cmd.tocbasic@starttoc"></a><a href="#cmd.tocbasic@starttoc">\tocbasic@starttoc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasic@starttoc">402</a></li>
+ <li><a name="cmd.tocbasicautomode"></a><a href="#cmd.tocbasicautomode">\tocbasicautomode</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.tocbasicautomode">378</a></li>
+ <li><a name="cmd.todaysname"></a><a href="#cmd.todaysname">\todaysname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.todaysname">280</a></li>
+ <li><a name="cmd.todaysnumber"></a><a href="#cmd.todaysnumber">\todaysnumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrdate.cmd.todaysnumber">280</a></li>
+ <li><a name="cmd.toplevelpagestyle"></a><a href="#cmd.toplevelpagestyle">\toplevelpagestyle</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.cmd.toplevelpagestyle">432</a></li>
<li><a name="cmd.typearea"></a><a href="#cmd.typearea">\typearea</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:typearea.cmd.typearea">40</a></li>
- <li><a name="cmd.unsettoc"></a><a href="#cmd.unsettoc">\unsettoc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.unsettoc">383</a></li>
- <li><a name="cmd.uppertitleback"></a><a href="#cmd.uppertitleback">\uppertitleback</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.uppertitleback">298</a>, <a href="scrguien.pdf#desc:maincls.cmd.uppertitleback">70</a></li>
- <li><a name="cmd.useencodingofkomafont"></a><a href="#cmd.useencodingofkomafont">\useencodingofkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.useencodingofkomafont">183</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.useencodingofkomafont">257</a>, <a href="scrguien.pdf#desc:scrextend.cmd.useencodingofkomafont">294</a>, <a href="scrguien.pdf#desc:scrjura.cmd.useencodingofkomafont">310</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.useencodingofkomafont">458</a>, <a href="scrguien.pdf#desc:maincls.cmd.useencodingofkomafont">64</a></li>
- <li><a name="cmd.usefamilyofkomafont"></a><a href="#cmd.usefamilyofkomafont">\usefamilyofkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usefamilyofkomafont">183</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.usefamilyofkomafont">257</a>, <a href="scrguien.pdf#desc:scrextend.cmd.usefamilyofkomafont">294</a>, <a href="scrguien.pdf#desc:scrjura.cmd.usefamilyofkomafont">310</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.usefamilyofkomafont">458</a>, <a href="scrguien.pdf#desc:maincls.cmd.usefamilyofkomafont">64</a></li>
- <li><a name="cmd.usefontofkomafont"></a><a href="#cmd.usefontofkomafont">\usefontofkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usefontofkomafont">183</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.usefontofkomafont">257</a>, <a href="scrguien.pdf#desc:scrextend.cmd.usefontofkomafont">294</a>, <a href="scrguien.pdf#desc:scrjura.cmd.usefontofkomafont">310</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.usefontofkomafont">458</a>, <a href="scrguien.pdf#desc:maincls.cmd.usefontofkomafont">64</a></li>
- <li><a name="cmd.usekomafont"></a><a href="#cmd.usekomafont">\usekomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usekomafont">179</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.usekomafont">255</a>, <a href="scrguien.pdf#desc:scrextend.cmd.usekomafont">293</a>, <a href="scrguien.pdf#desc:scrjura.cmd.usekomafont">309</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.usekomafont">457</a>, <a href="scrguien.pdf#desc:maincls.cmd.usekomafont">59</a></li>
- <li><a name="cmd.usekomavar*"></a><a href="#cmd.usekomavar*">\usekomavar*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usekomavar*">159</a>, <a href="scrguien.pdf#desc:scrlttr2-experts.cmd.usekomavar*">503</a></li>
- <li><a name="cmd.usekomavar"></a><a href="#cmd.usekomavar">\usekomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usekomavar">159</a>, <a href="scrguien.pdf#desc:scrlttr2-experts.cmd.usekomavar">503</a></li>
- <li><a name="cmd.usepackage"></a><a href="#cmd.usepackage">\usepackage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usepackage">151</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.usepackage">253</a>, <a href="scrguien.pdf#desc:scrextend.cmd.usepackage">290</a>, <a href="scrguien.pdf#desc:scrjura.cmd.usepackage">308</a>, <a href="scrguien.pdf#desc:typearea.cmd.usepackage">32</a>, <a href="scrguien.pdf#desc:scrhack.cmd.usepackage">411</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.usepackage">416</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.usepackage">456</a>, <a href="scrguien.pdf#desc:maincls.cmd.usepackage">55</a></li>
- <li><a name="cmd.useplength"></a><a href="#cmd.useplength">\useplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.useplength">166</a></li>
- <li><a name="cmd.useseriesofkomafont"></a><a href="#cmd.useseriesofkomafont">\useseriesofkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.useseriesofkomafont">183</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.useseriesofkomafont">257</a>, <a href="scrguien.pdf#desc:scrextend.cmd.useseriesofkomafont">294</a>, <a href="scrguien.pdf#desc:scrjura.cmd.useseriesofkomafont">310</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.useseriesofkomafont">458</a>, <a href="scrguien.pdf#desc:maincls.cmd.useseriesofkomafont">64</a></li>
- <li><a name="cmd.useshapeofkomafont"></a><a href="#cmd.useshapeofkomafont">\useshapeofkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.useshapeofkomafont">183</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.useshapeofkomafont">257</a>, <a href="scrguien.pdf#desc:scrextend.cmd.useshapeofkomafont">294</a>, <a href="scrguien.pdf#desc:scrjura.cmd.useshapeofkomafont">310</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.useshapeofkomafont">458</a>, <a href="scrguien.pdf#desc:maincls.cmd.useshapeofkomafont">64</a></li>
- <li><a name="cmd.usesizeofkomafont"></a><a href="#cmd.usesizeofkomafont">\usesizeofkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usesizeofkomafont">183</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.usesizeofkomafont">257</a>, <a href="scrguien.pdf#desc:scrextend.cmd.usesizeofkomafont">294</a>, <a href="scrguien.pdf#desc:scrjura.cmd.usesizeofkomafont">310</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.usesizeofkomafont">458</a>, <a href="scrguien.pdf#desc:maincls.cmd.usesizeofkomafont">64</a></li>
- <li><a name="cmd.usetocbasicnumberline"></a><a href="#cmd.usetocbasicnumberline">\usetocbasicnumberline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.usetocbasicnumberline">386</a></li>
- <li><a name="cmd.withoutparnumber"></a><a href="#cmd.withoutparnumber">\withoutparnumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.withoutparnumber">316</a></li>
- <li><a name="cmd.wwwname"></a><a href="#cmd.wwwname">\wwwname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.wwwname">509</a></li>
- <li><a name="cmd.yourmailname"></a><a href="#cmd.yourmailname">\yourmailname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.yourmailname">509</a></li>
- <li><a name="cmd.yourrefname"></a><a href="#cmd.yourrefname">\yourrefname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.yourrefname">509</a></li>
+ <li><a name="cmd.unsettoc"></a><a href="#cmd.unsettoc">\unsettoc</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.unsettoc">384</a></li>
+ <li><a name="cmd.uppertitleback"></a><a href="#cmd.uppertitleback">\uppertitleback</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.cmd.uppertitleback">299</a>, <a href="scrguien.pdf#desc:maincls.cmd.uppertitleback">70</a></li>
+ <li><a name="cmd.useencodingofkomafont"></a><a href="#cmd.useencodingofkomafont">\useencodingofkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.useencodingofkomafont">184</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.useencodingofkomafont">258</a>, <a href="scrguien.pdf#desc:scrextend.cmd.useencodingofkomafont">295</a>, <a href="scrguien.pdf#desc:scrjura.cmd.useencodingofkomafont">311</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.useencodingofkomafont">460</a>, <a href="scrguien.pdf#desc:maincls.cmd.useencodingofkomafont">64</a></li>
+ <li><a name="cmd.usefamilyofkomafont"></a><a href="#cmd.usefamilyofkomafont">\usefamilyofkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usefamilyofkomafont">184</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.usefamilyofkomafont">258</a>, <a href="scrguien.pdf#desc:scrextend.cmd.usefamilyofkomafont">295</a>, <a href="scrguien.pdf#desc:scrjura.cmd.usefamilyofkomafont">311</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.usefamilyofkomafont">460</a>, <a href="scrguien.pdf#desc:maincls.cmd.usefamilyofkomafont">64</a></li>
+ <li><a name="cmd.usefontofkomafont"></a><a href="#cmd.usefontofkomafont">\usefontofkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usefontofkomafont">184</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.usefontofkomafont">258</a>, <a href="scrguien.pdf#desc:scrextend.cmd.usefontofkomafont">295</a>, <a href="scrguien.pdf#desc:scrjura.cmd.usefontofkomafont">311</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.usefontofkomafont">460</a>, <a href="scrguien.pdf#desc:maincls.cmd.usefontofkomafont">64</a></li>
+ <li><a name="cmd.usekomafont"></a><a href="#cmd.usekomafont">\usekomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usekomafont">180</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.usekomafont">256</a>, <a href="scrguien.pdf#desc:scrextend.cmd.usekomafont">294</a>, <a href="scrguien.pdf#desc:scrjura.cmd.usekomafont">310</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.usekomafont">459</a>, <a href="scrguien.pdf#desc:maincls.cmd.usekomafont">59</a></li>
+ <li><a name="cmd.usekomavar*"></a><a href="#cmd.usekomavar*">\usekomavar*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usekomavar*">160</a>, <a href="scrguien.pdf#desc:scrlttr2-experts.cmd.usekomavar*">505</a></li>
+ <li><a name="cmd.usekomavar"></a><a href="#cmd.usekomavar">\usekomavar</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usekomavar">160</a>, <a href="scrguien.pdf#desc:scrlttr2-experts.cmd.usekomavar">505</a></li>
+ <li><a name="cmd.usepackage"></a><a href="#cmd.usepackage">\usepackage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usepackage">152</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.usepackage">254</a>, <a href="scrguien.pdf#desc:scrextend.cmd.usepackage">291</a>, <a href="scrguien.pdf#desc:scrjura.cmd.usepackage">309</a>, <a href="scrguien.pdf#desc:typearea.cmd.usepackage">32</a>, <a href="scrguien.pdf#desc:scrhack.cmd.usepackage">413</a>, <a href="scrguien.pdf#desc:scrlayer.cmd.usepackage">418</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.usepackage">458</a>, <a href="scrguien.pdf#desc:maincls.cmd.usepackage">55</a></li>
+ <li><a name="cmd.useplength"></a><a href="#cmd.useplength">\useplength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.useplength">167</a></li>
+ <li><a name="cmd.useseriesofkomafont"></a><a href="#cmd.useseriesofkomafont">\useseriesofkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.useseriesofkomafont">184</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.useseriesofkomafont">258</a>, <a href="scrguien.pdf#desc:scrextend.cmd.useseriesofkomafont">295</a>, <a href="scrguien.pdf#desc:scrjura.cmd.useseriesofkomafont">311</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.useseriesofkomafont">460</a>, <a href="scrguien.pdf#desc:maincls.cmd.useseriesofkomafont">64</a></li>
+ <li><a name="cmd.useshapeofkomafont"></a><a href="#cmd.useshapeofkomafont">\useshapeofkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.useshapeofkomafont">184</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.useshapeofkomafont">258</a>, <a href="scrguien.pdf#desc:scrextend.cmd.useshapeofkomafont">295</a>, <a href="scrguien.pdf#desc:scrjura.cmd.useshapeofkomafont">311</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.useshapeofkomafont">460</a>, <a href="scrguien.pdf#desc:maincls.cmd.useshapeofkomafont">64</a></li>
+ <li><a name="cmd.usesizeofkomafont"></a><a href="#cmd.usesizeofkomafont">\usesizeofkomafont</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.cmd.usesizeofkomafont">184</a>, <a href="scrguien.pdf#desc:scrlayer-scrpage.cmd.usesizeofkomafont">258</a>, <a href="scrguien.pdf#desc:scrextend.cmd.usesizeofkomafont">295</a>, <a href="scrguien.pdf#desc:scrjura.cmd.usesizeofkomafont">311</a>, <a href="scrguien.pdf#desc:scrlayer-notecolumn.cmd.usesizeofkomafont">460</a>, <a href="scrguien.pdf#desc:maincls.cmd.usesizeofkomafont">64</a></li>
+ <li><a name="cmd.usetocbasicnumberline"></a><a href="#cmd.usetocbasicnumberline">\usetocbasicnumberline</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.cmd.usetocbasicnumberline">387</a></li>
+ <li><a name="cmd.withoutparnumber"></a><a href="#cmd.withoutparnumber">\withoutparnumber</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.cmd.withoutparnumber">317</a></li>
+ <li><a name="cmd.wwwname"></a><a href="#cmd.wwwname">\wwwname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.wwwname">511</a></li>
+ <li><a name="cmd.yourmailname"></a><a href="#cmd.yourmailname">\yourmailname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.yourmailname">511</a></li>
+ <li><a name="cmd.yourrefname"></a><a href="#cmd.yourrefname">\yourrefname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2-experts.cmd.yourrefname">511</a></li>
</ul>
<h2><a name="environment">Environments</a></h2>
<ul>
- <li><a name="env.abstract"></a><a href="#env.abstract">abstract</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.abstract">71</a></li>
- <li><a name="env.addmargin*"></a><a href="#env.addmargin*">addmargin*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.addmargin*">124</a>, <a href="scrguien.pdf#desc:scrlttr2.env.addmargin*">238</a>, <a href="scrguien.pdf#desc:scrextend.env.addmargin*">306</a></li>
- <li><a name="env.addmargin"></a><a href="#env.addmargin">addmargin</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.addmargin">124</a>, <a href="scrguien.pdf#desc:scrlttr2.env.addmargin">238</a>, <a href="scrguien.pdf#desc:scrextend.env.addmargin">306</a></li>
- <li><a name="env.captionbeside"></a><a href="#env.captionbeside">captionbeside</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.captionbeside">133</a></li>
- <li><a name="env.captionofbeside"></a><a href="#env.captionofbeside">captionofbeside</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.captionofbeside">136</a></li>
- <li><a name="env.contract"></a><a href="#env.contract">contract</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.env.contract">312</a></li>
- <li><a name="env.description"></a><a href="#env.description">description</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.description">119</a>, <a href="scrguien.pdf#desc:scrlttr2.env.description">237</a></li>
- <li><a name="env.enumerate"></a><a href="#env.enumerate">enumerate</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.enumerate">118</a>, <a href="scrguien.pdf#desc:scrlttr2.env.enumerate">237</a></li>
- <li><a name="env.itemize"></a><a href="#env.itemize">itemize</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.itemize">117</a>, <a href="scrguien.pdf#desc:scrlttr2.env.itemize">236</a></li>
- <li><a name="env.labeling"></a><a href="#env.labeling">labeling</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.labeling">120</a>, <a href="scrguien.pdf#desc:scrlttr2.env.labeling">237</a>, <a href="scrguien.pdf#desc:scrextend.env.labeling">305</a></li>
- <li><a name="env.letter"></a><a href="#env.letter">letter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.env.letter">169</a></li>
- <li><a name="env.quotation"></a><a href="#env.quotation">quotation</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.quotation">123</a>, <a href="scrguien.pdf#desc:scrlttr2.env.quotation">238</a></li>
- <li><a name="env.quote"></a><a href="#env.quote">quote</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.quote">123</a>, <a href="scrguien.pdf#desc:scrlttr2.env.quote">238</a></li>
- <li><a name="env.titlepage"></a><a href="#env.titlepage">titlepage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.env.titlepage">295</a>, <a href="scrguien.pdf#desc:maincls.env.titlepage">65</a></li>
- <li><a name="env.verse"></a><a href="#env.verse">verse</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.verse">121</a>, <a href="scrguien.pdf#desc:scrlttr2.env.verse">238</a></li>
+ <li><a name="env.abstract"></a><a href="#env.abstract">abstract</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.abstract">72</a></li>
+ <li><a name="env.addmargin*"></a><a href="#env.addmargin*">addmargin*</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.addmargin*">125</a>, <a href="scrguien.pdf#desc:scrlttr2.env.addmargin*">239</a>, <a href="scrguien.pdf#desc:scrextend.env.addmargin*">307</a></li>
+ <li><a name="env.addmargin"></a><a href="#env.addmargin">addmargin</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.addmargin">125</a>, <a href="scrguien.pdf#desc:scrlttr2.env.addmargin">239</a>, <a href="scrguien.pdf#desc:scrextend.env.addmargin">307</a></li>
+ <li><a name="env.captionbeside"></a><a href="#env.captionbeside">captionbeside</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.captionbeside">134</a></li>
+ <li><a name="env.captionofbeside"></a><a href="#env.captionofbeside">captionofbeside</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.captionofbeside">137</a></li>
+ <li><a name="env.contract"></a><a href="#env.contract">contract</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.env.contract">313</a></li>
+ <li><a name="env.description"></a><a href="#env.description">description</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.description">120</a>, <a href="scrguien.pdf#desc:scrlttr2.env.description">238</a></li>
+ <li><a name="env.enumerate"></a><a href="#env.enumerate">enumerate</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.enumerate">119</a>, <a href="scrguien.pdf#desc:scrlttr2.env.enumerate">238</a></li>
+ <li><a name="env.itemize"></a><a href="#env.itemize">itemize</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.itemize">118</a>, <a href="scrguien.pdf#desc:scrlttr2.env.itemize">237</a></li>
+ <li><a name="env.labeling"></a><a href="#env.labeling">labeling</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.labeling">121</a>, <a href="scrguien.pdf#desc:scrlttr2.env.labeling">238</a>, <a href="scrguien.pdf#desc:scrextend.env.labeling">306</a></li>
+ <li><a name="env.letter"></a><a href="#env.letter">letter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.env.letter">170</a></li>
+ <li><a name="env.quotation"></a><a href="#env.quotation">quotation</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.quotation">124</a>, <a href="scrguien.pdf#desc:scrlttr2.env.quotation">239</a></li>
+ <li><a name="env.quote"></a><a href="#env.quote">quote</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.quote">124</a>, <a href="scrguien.pdf#desc:scrlttr2.env.quote">239</a></li>
+ <li><a name="env.titlepage"></a><a href="#env.titlepage">titlepage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrextend.env.titlepage">296</a>, <a href="scrguien.pdf#desc:maincls.env.titlepage">65</a></li>
+ <li><a name="env.verse"></a><a href="#env.verse">verse</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.env.verse">122</a>, <a href="scrguien.pdf#desc:scrlttr2.env.verse">239</a></li>
</ul>
<h2><a name="length">Lengths</a></h2>
<ul>
- <li><a name="length.footheight"></a><a href="#length.footheight">footheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.length.footheight">254</a>, <a href="scrguien.pdf#desc:scrlayer.length.footheight">439</a>, <a href="scrguien.pdf#desc:typearea.length.footheight">46</a></li>
- <li><a name="length.headheight"></a><a href="#length.headheight">headheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.length.headheight">254</a>, <a href="scrguien.pdf#desc:scrlayer.length.headheight">439</a></li>
+ <li><a name="length.footheight"></a><a href="#length.footheight">footheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.length.footheight">255</a>, <a href="scrguien.pdf#desc:scrlayer.length.footheight">441</a>, <a href="scrguien.pdf#desc:typearea.length.footheight">46</a></li>
+ <li><a name="length.headheight"></a><a href="#length.headheight">headheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.length.headheight">255</a>, <a href="scrguien.pdf#desc:scrlayer.length.headheight">441</a></li>
</ul>
<h2><a name="plength">Pseudolengths</a></h2>
<ul>
- <li><a name="plength.PPdatamatrixvskip"></a><a href="#plength.PPdatamatrixvskip">PPdatamatrixvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.PPdatamatrixvskip">207</a></li>
- <li><a name="plength.PPheadheight"></a><a href="#plength.PPheadheight">PPheadheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.PPheadheight">207</a></li>
- <li><a name="plength.PPheadwidth"></a><a href="#plength.PPheadwidth">PPheadwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.PPheadwidth">207</a></li>
- <li><a name="plength.backaddrheight"></a><a href="#plength.backaddrheight">backaddrheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.backaddrheight">207</a></li>
- <li><a name="plength.bfoldmarklength"></a><a href="#plength.bfoldmarklength">bfoldmarklength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.bfoldmarklength">188</a></li>
- <li><a name="plength.bfoldmarkvpos"></a><a href="#plength.bfoldmarkvpos">bfoldmarkvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.bfoldmarkvpos">186</a></li>
- <li><a name="plength.firstfoothpos"></a><a href="#plength.firstfoothpos">firstfoothpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.firstfoothpos">224</a></li>
- <li><a name="plength.firstfootvpos"></a><a href="#plength.firstfootvpos">firstfootvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.firstfootvpos">224</a></li>
- <li><a name="plength.firstfootwidth"></a><a href="#plength.firstfootwidth">firstfootwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.firstfootwidth">224</a></li>
- <li><a name="plength.firstheadhpos"></a><a href="#plength.firstheadhpos">firstheadhpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.firstheadhpos">189</a></li>
- <li><a name="plength.firstheadvpos"></a><a href="#plength.firstheadvpos">firstheadvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.firstheadvpos">189</a></li>
- <li><a name="plength.firstheadwidth"></a><a href="#plength.firstheadwidth">firstheadwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.firstheadwidth">189</a></li>
- <li><a name="plength.foldmarkhpos"></a><a href="#plength.foldmarkhpos">foldmarkhpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.foldmarkhpos">188</a></li>
- <li><a name="plength.foldmarkthickness"></a><a href="#plength.foldmarkthickness">foldmarkthickness</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.foldmarkthickness">188</a></li>
- <li><a name="plength.foldmarkvpos"></a><a href="#plength.foldmarkvpos">foldmarkvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.foldmarkvpos">188</a></li>
- <li><a name="plength.fromrulethickness"></a><a href="#plength.fromrulethickness">fromrulethickness</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.fromrulethickness">194</a></li>
- <li><a name="plength.fromrulewidth"></a><a href="#plength.fromrulewidth">fromrulewidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.fromrulewidth">194</a></li>
- <li><a name="plength.lfoldmarkhpos"></a><a href="#plength.lfoldmarkhpos">lfoldmarkhpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.lfoldmarkhpos">188</a></li>
- <li><a name="plength.lfoldmarklength"></a><a href="#plength.lfoldmarklength">lfoldmarklength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.lfoldmarklength">188</a></li>
- <li><a name="plength.locheight"></a><a href="#plength.locheight">locheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.locheight">209</a></li>
- <li><a name="plength.lochpos"></a><a href="#plength.lochpos">lochpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.lochpos">209</a></li>
- <li><a name="plength.locvpos"></a><a href="#plength.locvpos">locvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.locvpos">209</a></li>
- <li><a name="plength.locwidth"></a><a href="#plength.locwidth">locwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.locwidth">209</a></li>
- <li><a name="plength.mfoldmarklength"></a><a href="#plength.mfoldmarklength">mfoldmarklength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.mfoldmarklength">188</a></li>
- <li><a name="plength.mfoldmarkvpos"></a><a href="#plength.mfoldmarkvpos">mfoldmarkvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.mfoldmarkvpos">186</a></li>
- <li><a name="plength.pfoldmarklength"></a><a href="#plength.pfoldmarklength">pfoldmarklength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.pfoldmarklength">188</a></li>
- <li><a name="plength.refaftervskip"></a><a href="#plength.refaftervskip">refaftervskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.refaftervskip">215</a></li>
- <li><a name="plength.refhpos"></a><a href="#plength.refhpos">refhpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.refhpos">214</a></li>
- <li><a name="plength.refvpos"></a><a href="#plength.refvpos">refvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.refvpos">214</a></li>
- <li><a name="plength.refwidth"></a><a href="#plength.refwidth">refwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.refwidth">214</a></li>
- <li><a name="plength.sigbeforevskip"></a><a href="#plength.sigbeforevskip">sigbeforevskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.sigbeforevskip">221</a></li>
- <li><a name="plength.sigindent"></a><a href="#plength.sigindent">sigindent</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.sigindent">221</a></li>
- <li><a name="plength.specialmailindent"></a><a href="#plength.specialmailindent">specialmailindent</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.specialmailindent">207</a></li>
- <li><a name="plength.specialmailrightindent"></a><a href="#plength.specialmailrightindent">specialmailrightindent</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.specialmailrightindent">207</a></li>
- <li><a name="plength.subjectaftervskip"></a><a href="#plength.subjectaftervskip">subjectaftervskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.subjectaftervskip">219</a></li>
- <li><a name="plength.subjectbeforevskip"></a><a href="#plength.subjectbeforevskip">subjectbeforevskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.subjectbeforevskip">219</a></li>
- <li><a name="plength.subjectvpos"></a><a href="#plength.subjectvpos">subjectvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.subjectvpos">218</a></li>
- <li><a name="plength.tfoldmarklength"></a><a href="#plength.tfoldmarklength">tfoldmarklength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.tfoldmarklength">188</a></li>
- <li><a name="plength.tfoldmarkvpos"></a><a href="#plength.tfoldmarkvpos">tfoldmarkvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.tfoldmarkvpos">186</a></li>
- <li><a name="plength.toaddrheight"></a><a href="#plength.toaddrheight">toaddrheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.toaddrheight">206</a></li>
- <li><a name="plength.toaddrhpos"></a><a href="#plength.toaddrhpos">toaddrhpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.toaddrhpos">205</a></li>
- <li><a name="plength.toaddrindent"></a><a href="#plength.toaddrindent">toaddrindent</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.toaddrindent">206</a></li>
- <li><a name="plength.toaddrvpos"></a><a href="#plength.toaddrvpos">toaddrvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.toaddrvpos">205</a></li>
- <li><a name="plength.toaddrwidth"></a><a href="#plength.toaddrwidth">toaddrwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.toaddrwidth">206</a></li>
+ <li><a name="plength.PPdatamatrixvskip"></a><a href="#plength.PPdatamatrixvskip">PPdatamatrixvskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.PPdatamatrixvskip">208</a></li>
+ <li><a name="plength.PPheadheight"></a><a href="#plength.PPheadheight">PPheadheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.PPheadheight">208</a></li>
+ <li><a name="plength.PPheadwidth"></a><a href="#plength.PPheadwidth">PPheadwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.PPheadwidth">208</a></li>
+ <li><a name="plength.backaddrheight"></a><a href="#plength.backaddrheight">backaddrheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.backaddrheight">208</a></li>
+ <li><a name="plength.bfoldmarklength"></a><a href="#plength.bfoldmarklength">bfoldmarklength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.bfoldmarklength">189</a></li>
+ <li><a name="plength.bfoldmarkvpos"></a><a href="#plength.bfoldmarkvpos">bfoldmarkvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.bfoldmarkvpos">187</a></li>
+ <li><a name="plength.firstfoothpos"></a><a href="#plength.firstfoothpos">firstfoothpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.firstfoothpos">225</a></li>
+ <li><a name="plength.firstfootvpos"></a><a href="#plength.firstfootvpos">firstfootvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.firstfootvpos">225</a></li>
+ <li><a name="plength.firstfootwidth"></a><a href="#plength.firstfootwidth">firstfootwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.firstfootwidth">225</a></li>
+ <li><a name="plength.firstheadhpos"></a><a href="#plength.firstheadhpos">firstheadhpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.firstheadhpos">190</a></li>
+ <li><a name="plength.firstheadvpos"></a><a href="#plength.firstheadvpos">firstheadvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.firstheadvpos">190</a></li>
+ <li><a name="plength.firstheadwidth"></a><a href="#plength.firstheadwidth">firstheadwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.firstheadwidth">190</a></li>
+ <li><a name="plength.foldmarkhpos"></a><a href="#plength.foldmarkhpos">foldmarkhpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.foldmarkhpos">189</a></li>
+ <li><a name="plength.foldmarkthickness"></a><a href="#plength.foldmarkthickness">foldmarkthickness</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.foldmarkthickness">189</a></li>
+ <li><a name="plength.foldmarkvpos"></a><a href="#plength.foldmarkvpos">foldmarkvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.foldmarkvpos">189</a></li>
+ <li><a name="plength.fromrulethickness"></a><a href="#plength.fromrulethickness">fromrulethickness</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.fromrulethickness">195</a></li>
+ <li><a name="plength.fromrulewidth"></a><a href="#plength.fromrulewidth">fromrulewidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.fromrulewidth">195</a></li>
+ <li><a name="plength.lfoldmarkhpos"></a><a href="#plength.lfoldmarkhpos">lfoldmarkhpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.lfoldmarkhpos">189</a></li>
+ <li><a name="plength.lfoldmarklength"></a><a href="#plength.lfoldmarklength">lfoldmarklength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.lfoldmarklength">189</a></li>
+ <li><a name="plength.locheight"></a><a href="#plength.locheight">locheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.locheight">210</a></li>
+ <li><a name="plength.lochpos"></a><a href="#plength.lochpos">lochpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.lochpos">210</a></li>
+ <li><a name="plength.locvpos"></a><a href="#plength.locvpos">locvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.locvpos">210</a></li>
+ <li><a name="plength.locwidth"></a><a href="#plength.locwidth">locwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.locwidth">210</a></li>
+ <li><a name="plength.mfoldmarklength"></a><a href="#plength.mfoldmarklength">mfoldmarklength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.mfoldmarklength">189</a></li>
+ <li><a name="plength.mfoldmarkvpos"></a><a href="#plength.mfoldmarkvpos">mfoldmarkvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.mfoldmarkvpos">187</a></li>
+ <li><a name="plength.pfoldmarklength"></a><a href="#plength.pfoldmarklength">pfoldmarklength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.pfoldmarklength">189</a></li>
+ <li><a name="plength.refaftervskip"></a><a href="#plength.refaftervskip">refaftervskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.refaftervskip">216</a></li>
+ <li><a name="plength.refhpos"></a><a href="#plength.refhpos">refhpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.refhpos">215</a></li>
+ <li><a name="plength.refvpos"></a><a href="#plength.refvpos">refvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.refvpos">215</a></li>
+ <li><a name="plength.refwidth"></a><a href="#plength.refwidth">refwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.refwidth">215</a></li>
+ <li><a name="plength.sigbeforevskip"></a><a href="#plength.sigbeforevskip">sigbeforevskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.sigbeforevskip">222</a></li>
+ <li><a name="plength.sigindent"></a><a href="#plength.sigindent">sigindent</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.sigindent">222</a></li>
+ <li><a name="plength.specialmailindent"></a><a href="#plength.specialmailindent">specialmailindent</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.specialmailindent">208</a></li>
+ <li><a name="plength.specialmailrightindent"></a><a href="#plength.specialmailrightindent">specialmailrightindent</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.specialmailrightindent">208</a></li>
+ <li><a name="plength.subjectaftervskip"></a><a href="#plength.subjectaftervskip">subjectaftervskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.subjectaftervskip">220</a></li>
+ <li><a name="plength.subjectbeforevskip"></a><a href="#plength.subjectbeforevskip">subjectbeforevskip</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.subjectbeforevskip">220</a></li>
+ <li><a name="plength.subjectvpos"></a><a href="#plength.subjectvpos">subjectvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.subjectvpos">219</a></li>
+ <li><a name="plength.tfoldmarklength"></a><a href="#plength.tfoldmarklength">tfoldmarklength</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.tfoldmarklength">189</a></li>
+ <li><a name="plength.tfoldmarkvpos"></a><a href="#plength.tfoldmarkvpos">tfoldmarkvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.tfoldmarkvpos">187</a></li>
+ <li><a name="plength.toaddrheight"></a><a href="#plength.toaddrheight">toaddrheight</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.toaddrheight">207</a></li>
+ <li><a name="plength.toaddrhpos"></a><a href="#plength.toaddrhpos">toaddrhpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.toaddrhpos">206</a></li>
+ <li><a name="plength.toaddrindent"></a><a href="#plength.toaddrindent">toaddrindent</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.toaddrindent">207</a></li>
+ <li><a name="plength.toaddrvpos"></a><a href="#plength.toaddrvpos">toaddrvpos</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.toaddrvpos">206</a></li>
+ <li><a name="plength.toaddrwidth"></a><a href="#plength.toaddrwidth">toaddrwidth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.plength.toaddrwidth">207</a></li>
</ul>
<h2><a name="variable">Variables</a></h2>
<ul>
- <li><a name="variable.PPcode"></a><a href="#variable.PPcode">PPcode</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.PPcode">202</a></li>
- <li><a name="variable.PPdatamatrix"></a><a href="#variable.PPdatamatrix">PPdatamatrix</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.PPdatamatrix">202</a></li>
- <li><a name="variable.addresseeimage"></a><a href="#variable.addresseeimage">addresseeimage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.addresseeimage">202</a></li>
- <li><a name="variable.backaddress"></a><a href="#variable.backaddress">backaddress</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.backaddress">202</a></li>
- <li><a name="variable.backaddressseparator"></a><a href="#variable.backaddressseparator">backaddressseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.backaddressseparator">202</a></li>
- <li><a name="variable.ccseparator"></a><a href="#variable.ccseparator">ccseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.ccseparator">175</a></li>
- <li><a name="variable.customer"></a><a href="#variable.customer">customer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.customer">212</a></li>
- <li><a name="variable.date"></a><a href="#variable.date">date</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.date">211</a></li>
- <li><a name="variable.emailseparator"></a><a href="#variable.emailseparator">emailseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.emailseparator">195</a></li>
- <li><a name="variable.enclseparator"></a><a href="#variable.enclseparator">enclseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.enclseparator">175</a></li>
- <li><a name="variable.faxseparator"></a><a href="#variable.faxseparator">faxseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.faxseparator">195</a></li>
- <li><a name="variable.firstfoot"></a><a href="#variable.firstfoot">firstfoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.firstfoot">222</a></li>
- <li><a name="variable.firsthead"></a><a href="#variable.firsthead">firsthead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.firsthead">200</a></li>
- <li><a name="variable.fromaddress"></a><a href="#variable.fromaddress">fromaddress</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromaddress">190</a></li>
- <li><a name="variable.frombank"></a><a href="#variable.frombank">frombank</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.frombank">223</a></li>
- <li><a name="variable.fromemail"></a><a href="#variable.fromemail">fromemail</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromemail">195</a></li>
- <li><a name="variable.fromfax"></a><a href="#variable.fromfax">fromfax</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromfax">195</a></li>
- <li><a name="variable.fromlogo"></a><a href="#variable.fromlogo">fromlogo</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromlogo">199</a></li>
- <li><a name="variable.frommobilephone"></a><a href="#variable.frommobilephone">frommobilephone</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.frommobilephone">195</a></li>
- <li><a name="variable.fromname"></a><a href="#variable.fromname">fromname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromname">190</a></li>
- <li><a name="variable.fromphone"></a><a href="#variable.fromphone">fromphone</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromphone">195</a></li>
- <li><a name="variable.fromurl"></a><a href="#variable.fromurl">fromurl</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromurl">195</a></li>
- <li><a name="variable.fromzipcode"></a><a href="#variable.fromzipcode">fromzipcode</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromzipcode">202</a></li>
- <li><a name="variable.invoice"></a><a href="#variable.invoice">invoice</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.invoice">212</a></li>
- <li><a name="variable.location"></a><a href="#variable.location">location</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.location">208</a></li>
- <li><a name="variable.mobilephoneseparator"></a><a href="#variable.mobilephoneseparator">mobilephoneseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.mobilephoneseparator">195</a></li>
- <li><a name="variable.myref"></a><a href="#variable.myref">myref</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.myref">212</a></li>
- <li><a name="variable.nextfoot"></a><a href="#variable.nextfoot">nextfoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.nextfoot">230</a></li>
- <li><a name="variable.nexthead"></a><a href="#variable.nexthead">nexthead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.nexthead">230</a></li>
- <li><a name="variable.phoneseparator"></a><a href="#variable.phoneseparator">phoneseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.phoneseparator">195</a></li>
- <li><a name="variable.place"></a><a href="#variable.place">place</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.place">202</a></li>
- <li><a name="variable.placeseparator"></a><a href="#variable.placeseparator">placeseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.placeseparator">212</a></li>
- <li><a name="variable.signature"></a><a href="#variable.signature">signature</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.signature">219</a></li>
- <li><a name="variable.specialmail"></a><a href="#variable.specialmail">specialmail</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.specialmail">202</a></li>
- <li><a name="variable.subject"></a><a href="#variable.subject">subject</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.subject">216</a></li>
- <li><a name="variable.subjectseparator"></a><a href="#variable.subjectseparator">subjectseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.subjectseparator">216</a></li>
- <li><a name="variable.title"></a><a href="#variable.title">title</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.title">215</a></li>
- <li><a name="variable.toaddress"></a><a href="#variable.toaddress">toaddress</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.toaddress">202</a></li>
- <li><a name="variable.toname"></a><a href="#variable.toname">toname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.toname">202</a></li>
- <li><a name="variable.urlseparator"></a><a href="#variable.urlseparator">urlseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.urlseparator">195</a></li>
- <li><a name="variable.yourmail"></a><a href="#variable.yourmail">yourmail</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.yourmail">212</a></li>
- <li><a name="variable.yourref"></a><a href="#variable.yourref">yourref</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.yourref">212</a></li>
- <li><a name="variable.zipcodeseparator"></a><a href="#variable.zipcodeseparator">zipcodeseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.zipcodeseparator">202</a></li>
+ <li><a name="variable.PPcode"></a><a href="#variable.PPcode">PPcode</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.PPcode">203</a></li>
+ <li><a name="variable.PPdatamatrix"></a><a href="#variable.PPdatamatrix">PPdatamatrix</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.PPdatamatrix">203</a></li>
+ <li><a name="variable.addresseeimage"></a><a href="#variable.addresseeimage">addresseeimage</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.addresseeimage">203</a></li>
+ <li><a name="variable.backaddress"></a><a href="#variable.backaddress">backaddress</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.backaddress">203</a></li>
+ <li><a name="variable.backaddressseparator"></a><a href="#variable.backaddressseparator">backaddressseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.backaddressseparator">203</a></li>
+ <li><a name="variable.ccseparator"></a><a href="#variable.ccseparator">ccseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.ccseparator">176</a></li>
+ <li><a name="variable.customer"></a><a href="#variable.customer">customer</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.customer">213</a></li>
+ <li><a name="variable.date"></a><a href="#variable.date">date</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.date">212</a></li>
+ <li><a name="variable.emailseparator"></a><a href="#variable.emailseparator">emailseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.emailseparator">196</a></li>
+ <li><a name="variable.enclseparator"></a><a href="#variable.enclseparator">enclseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.enclseparator">176</a></li>
+ <li><a name="variable.faxseparator"></a><a href="#variable.faxseparator">faxseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.faxseparator">196</a></li>
+ <li><a name="variable.firstfoot"></a><a href="#variable.firstfoot">firstfoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.firstfoot">223</a></li>
+ <li><a name="variable.firsthead"></a><a href="#variable.firsthead">firsthead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.firsthead">201</a></li>
+ <li><a name="variable.fromaddress"></a><a href="#variable.fromaddress">fromaddress</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromaddress">191</a></li>
+ <li><a name="variable.frombank"></a><a href="#variable.frombank">frombank</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.frombank">224</a></li>
+ <li><a name="variable.fromemail"></a><a href="#variable.fromemail">fromemail</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromemail">196</a></li>
+ <li><a name="variable.fromfax"></a><a href="#variable.fromfax">fromfax</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromfax">196</a></li>
+ <li><a name="variable.fromlogo"></a><a href="#variable.fromlogo">fromlogo</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromlogo">200</a></li>
+ <li><a name="variable.frommobilephone"></a><a href="#variable.frommobilephone">frommobilephone</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.frommobilephone">196</a></li>
+ <li><a name="variable.fromname"></a><a href="#variable.fromname">fromname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromname">191</a></li>
+ <li><a name="variable.fromphone"></a><a href="#variable.fromphone">fromphone</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromphone">196</a></li>
+ <li><a name="variable.fromurl"></a><a href="#variable.fromurl">fromurl</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromurl">196</a></li>
+ <li><a name="variable.fromzipcode"></a><a href="#variable.fromzipcode">fromzipcode</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.fromzipcode">203</a></li>
+ <li><a name="variable.invoice"></a><a href="#variable.invoice">invoice</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.invoice">213</a></li>
+ <li><a name="variable.location"></a><a href="#variable.location">location</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.location">209</a></li>
+ <li><a name="variable.mobilephoneseparator"></a><a href="#variable.mobilephoneseparator">mobilephoneseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.mobilephoneseparator">196</a></li>
+ <li><a name="variable.myref"></a><a href="#variable.myref">myref</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.myref">213</a></li>
+ <li><a name="variable.nextfoot"></a><a href="#variable.nextfoot">nextfoot</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.nextfoot">231</a></li>
+ <li><a name="variable.nexthead"></a><a href="#variable.nexthead">nexthead</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.nexthead">231</a></li>
+ <li><a name="variable.phoneseparator"></a><a href="#variable.phoneseparator">phoneseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.phoneseparator">196</a></li>
+ <li><a name="variable.place"></a><a href="#variable.place">place</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.place">203</a></li>
+ <li><a name="variable.placeseparator"></a><a href="#variable.placeseparator">placeseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.placeseparator">213</a></li>
+ <li><a name="variable.signature"></a><a href="#variable.signature">signature</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.signature">220</a></li>
+ <li><a name="variable.specialmail"></a><a href="#variable.specialmail">specialmail</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.specialmail">203</a></li>
+ <li><a name="variable.subject"></a><a href="#variable.subject">subject</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.subject">217</a></li>
+ <li><a name="variable.subjectseparator"></a><a href="#variable.subjectseparator">subjectseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.subjectseparator">217</a></li>
+ <li><a name="variable.title"></a><a href="#variable.title">title</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.title">216</a></li>
+ <li><a name="variable.toaddress"></a><a href="#variable.toaddress">toaddress</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.toaddress">203</a></li>
+ <li><a name="variable.toname"></a><a href="#variable.toname">toname</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.toname">203</a></li>
+ <li><a name="variable.urlseparator"></a><a href="#variable.urlseparator">urlseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.urlseparator">196</a></li>
+ <li><a name="variable.yourmail"></a><a href="#variable.yourmail">yourmail</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.yourmail">213</a></li>
+ <li><a name="variable.yourref"></a><a href="#variable.yourref">yourref</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.yourref">213</a></li>
+ <li><a name="variable.zipcodeseparator"></a><a href="#variable.zipcodeseparator">zipcodeseparator</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.variable.zipcodeseparator">203</a></li>
</ul>
<h2><a name="pagestyle">Page Styles</a></h2>
<ul>
- <li><a name="pagestyle.@everystyle@"></a><a href="#pagestyle.@everystyle@">@everystyle@</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.pagestyle.@everystyle@">434</a></li>
- <li><a name="pagestyle.empty"></a><a href="#pagestyle.empty">empty</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.pagestyle.empty">229</a>, <a href="scrguien.pdf#desc:scrlayer.pagestyle.empty">434</a></li>
- <li><a name="pagestyle.headings"></a><a href="#pagestyle.headings">headings</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.pagestyle.headings">229</a></li>
- <li><a name="pagestyle.letter"></a><a href="#pagestyle.letter">letter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.pagestyle.letter">229</a></li>
- <li><a name="pagestyle.myheadings"></a><a href="#pagestyle.myheadings">myheadings</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.pagestyle.myheadings">229</a></li>
- <li><a name="pagestyle.plain"></a><a href="#pagestyle.plain">plain</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.pagestyle.plain">229</a></li>
- <li><a name="pagestyle.scrheadings"></a><a href="#pagestyle.scrheadings">scrheadings</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.pagestyle.scrheadings">257</a></li>
+ <li><a name="pagestyle.@everystyle@"></a><a href="#pagestyle.@everystyle@">@everystyle@</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer.pagestyle.@everystyle@">436</a></li>
+ <li><a name="pagestyle.empty"></a><a href="#pagestyle.empty">empty</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.pagestyle.empty">230</a>, <a href="scrguien.pdf#desc:scrlayer.pagestyle.empty">436</a></li>
+ <li><a name="pagestyle.headings"></a><a href="#pagestyle.headings">headings</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.pagestyle.headings">230</a></li>
+ <li><a name="pagestyle.letter"></a><a href="#pagestyle.letter">letter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.pagestyle.letter">230</a></li>
+ <li><a name="pagestyle.myheadings"></a><a href="#pagestyle.myheadings">myheadings</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.pagestyle.myheadings">230</a></li>
+ <li><a name="pagestyle.plain"></a><a href="#pagestyle.plain">plain</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.pagestyle.plain">230</a></li>
+ <li><a name="pagestyle.scrheadings"></a><a href="#pagestyle.scrheadings">scrheadings</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlayer-scrpage.pagestyle.scrheadings">258</a></li>
</ul>
<h2><a name="counter">Counter</a></h2>
<ul>
- <li><a name="counter.letter"></a><a href="#counter.letter">letter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.counter.letter">170</a></li>
- <li><a name="counter.par"></a><a href="#counter.par">par</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.counter.par">316</a></li>
- <li><a name="counter.secnumdepth"></a><a href="#counter.secnumdepth">secnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.counter.secnumdepth">112</a></li>
- <li><a name="counter.sentence"></a><a href="#counter.sentence">sentence</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.counter.sentence">317</a></li>
- <li><a name="counter.tocdepth"></a><a href="#counter.tocdepth">tocdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.counter.tocdepth">386</a>, <a href="scrguien.pdf#desc:maincls.counter.tocdepth">76</a></li>
+ <li><a name="counter.letter"></a><a href="#counter.letter">letter</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrlttr2.counter.letter">171</a></li>
+ <li><a name="counter.par"></a><a href="#counter.par">par</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.counter.par">317</a></li>
+ <li><a name="counter.secnumdepth"></a><a href="#counter.secnumdepth">secnumdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.counter.secnumdepth">113</a></li>
+ <li><a name="counter.sentence"></a><a href="#counter.sentence">sentence</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:scrjura.counter.sentence">318</a></li>
+ <li><a name="counter.tocdepth"></a><a href="#counter.tocdepth">tocdepth</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:tocbasic.counter.tocdepth">387</a>, <a href="scrguien.pdf#desc:maincls.counter.tocdepth">76</a></li>
</ul>
<h2><a name="floatstyle">Styles for the float Package</a></h2>
<ul>
- <li><a name="floatstyle.komaabove"></a><a href="#floatstyle.komaabove">komaabove</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.floatstyle.komaabove">136</a></li>
- <li><a name="floatstyle.komabelow"></a><a href="#floatstyle.komabelow">komabelow</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.floatstyle.komabelow">136</a></li>
+ <li><a name="floatstyle.komaabove"></a><a href="#floatstyle.komaabove">komaabove</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.floatstyle.komaabove">137</a></li>
+ <li><a name="floatstyle.komabelow"></a><a href="#floatstyle.komabelow">komabelow</a> &rarr;&nbsp;<a href="scrguien.pdf#desc:maincls.floatstyle.komabelow">137</a></li>
</ul>
<p><a href="http://validator.w3.org/check?uri=referer"><img
src="http://www.w3.org/Icons/valid-html40"
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/scrguien.pdf b/Master/texmf-dist/source/latex/koma-script/doc/scrguien.pdf
index a955cd736d2..7d4e484dc0c 100644
--- a/Master/texmf-dist/source/latex/koma-script/doc/scrguien.pdf
+++ b/Master/texmf-dist/source/latex/koma-script/doc/scrguien.pdf
Binary files differ
diff --git a/Master/texmf-dist/source/latex/koma-script/doc/scrpage2.tex b/Master/texmf-dist/source/latex/koma-script/doc/scrpage2.tex
deleted file mode 100644
index fe7c62a5047..00000000000
--- a/Master/texmf-dist/source/latex/koma-script/doc/scrpage2.tex
+++ /dev/null
@@ -1,2963 +0,0 @@
-% ======================================================================
-% scrpage2.tex
-% Copyright (c) Markus Kohm, 2001-2018
-%
-% This file is part of the LaTeX2e KOMA-Script bundle.
-%
-% This work may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3c of the license.
-% 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 and of this work.
-%
-% This work has the LPPL maintenance status "author-maintained".
-%
-% The Current Maintainer and author of this work is Markus Kohm.
-%
-% This work consists of all files listed in manifest.txt.
-% ----------------------------------------------------------------------
-% scrpage2.tex
-% Copyright (c) Markus Kohm, 2001-2018
-%
-% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
-% Version 1.3c, verteilt und/oder veraendert werden.
-% Die neuste Version dieser Lizenz ist
-% http://www.latex-project.org/lppl.txt
-% und Version 1.3c ist Teil aller Verteilungen von LaTeX
-% Version 2005/12/01 oder spaeter und dieses Werks.
-%
-% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained"
-% (allein durch den Autor verwaltet).
-%
-% Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm.
-%
-% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
-% ======================================================================
-%
-% Chapter about scrpage2
-% Maintained by Markus Kohm
-%
-% ----------------------------------------------------------------------
-%
-% Kapitel über scrpage2
-% Verwaltet von Markus Kohm
-%
-% ============================================================================
-
-\begin{filecontents*}{\jobname-ngerman.tex}
-\input{ngerman/guide-ngerman.tex}
-% \section{Jens-Uwe's Example Text}
-%
-% TODO: These should be merged with other example text.
-% \begin{macro}{\XmpText}
-% Example text command; the default definition (50) returns the whole text.
-% \begin{macrocode}
-\newcommand*{\XmpText}[1][50]{%
- \ifnum #1<51
- Dieser Blindtext wird gerade von 130 Millionen Rezeptoren
- Ihrer Netzhaut erfasst.
- \ifnum #1>1
- Die Zellen werden dadurch in einen Erregungs\char\defaulthyphenchar
- \kern-1pt\linebreak
- \ifnum #1>2
- zustand versetzt, der sich vom Sehnerv in den
- \ifnum #1>3
- hinteren Teil Ihres Gehirns ausbreitet.
- Von dort aus \"ubertr\"agt sich die Erregung in
- Sekundenbruchteilen auch in andere Bereiche Ihres
- Gro\ss hirns.
- Ihr Stirnlappen wird stimuliert.
- Von dort aus gehen jetzt Willens\char\defaulthyphenchar
- \kern-1pt\linebreak
- \fi\fi\fi
- \fi
- \ifnum #1>49
- impulse aus, die Ihr zentrales Nervensystem in konkrete Handlungen
- umsetzt. Kopf und Augen reagieren bereits.
- Sie folgen dem Text, nehmen die darin enthaltenen Informationen
- auf und leiten diese \"uber den Sehnerv weiter.
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\XmpTopText}
-% \begin{macro}{\XmpBotText}
-% These two commands are language-dependent, since in some languages
-% additional commands may required.
-% \begin{macrocode}
-\newcommand*{\XmpTopText}{\XmpText[3]}
-\newcommand*{\XmpBotText}{\XmpText[2]}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\XmpMarginTextA}
-% \begin{macro}{\XmpMarginTextB}
-% Margin notes.
-% \begin{macrocode}
-\newcommand*{\XmpMarginTextA}{Netzhaut}
-\newcommand*{\XmpMarginTextB}{(\textit{Retina})}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-\end{filecontents*}
-
-\begin{filecontents*}{\jobname-english.tex}
-\input{english/guide-english.tex}
-% \begin{macro}{\XmpText}
-% Example text command; the default definition (50) returns the whole text.
-% \begin{macrocode}
-\newcommand*{\XmpText}[1][50]{%
- \ifnum #1<51
- This f\/ill text is currently seized by 130 million receptors
- in your retina.
- \ifnum #1>1
- Thereby the nerve cells are put in a state of stimulation,
- which spreads
- \ifnum #1>2
- into the rear part of your brain originating from
- \ifnum #1>3
- the optic nerve.
- From there the stimulation is transmitted in a split second
- also in other parts of your cerebrum.
- Your frontal lobe becomes stimulated.
- Intention-impulses spread from there, which your
- central nervous\setlength{\parfillskip}{0pt}%
- \fi\fi\fi
- \fi
- \ifnum #1>49
- system transforms in actual deeds.
- Head and eyes already react.
- They follow the text, taking the information present there
- and transmit them via the optic nerve.
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\XmpTopText}
-% \begin{macro}{\XmpBotText}
-% These two commands are language-dependent, since in some languages
-% additional commands may required.
-% \begin{macrocode}
-\newcommand*{\XmpTopText}{\XmpText[3]}
-\newcommand*{\XmpBotText}{\XmpText[2]}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\XmpMarginTextA}
-% \begin{macro}{\XmpMarginTextB}
-% Margin notes.
-% \begin{macrocode}
-\newcommand*{\XmpMarginTextA}{Retina}
-\newcommand*{\XmpMarginTextB}{}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-\end{filecontents*}
-
-\documentclass[ngerman,english]{scrguide}
-
-\makeatletter
-\renewcommand*{\@pnumwidth}{2em}
-\makeatother
-
-\KOMAProvidesFile{scrpage2.tex}%
- [$Date: 2013-07-22 $
- a user guide to obsolete package scrpage2]
-
-\begin{document}
-
-\addparttocentry{}{English}
-\def\theHchapter{E.\thechapter}
-\setcounter{chapter}{0}
-\renewcommand*{\thepage}{E.\arabic{page}}
-\title{The Obsolete Package \Package{scrpage2}}
-\subtitle{Extract from former versions of the \KOMAScript{} Manual}
-\author{Markus Kohm\and Jens-Uwe-Morakswi}
-\date{2018-02-07}
-\maketitle
-
-\tableofcontents
-
-\translator{Jens-Uwe Morawski\and Karl-Heinz Zimmer\and Christoph Bier\and
- Gernot Hassenpflug\and Markus Kohm}
-
-\chapter{Adapting Page Headers and Footers with \Package{scrpage2}}
-\labelbase{scrpage-en}
-
-%
-\BeginIndexGroup
-\BeginIndex{Package}{scrpage2}%
-\BeginIndex{}{page>style}
-From \KOMAScript{} 3.12 the completely newly implemented package
-\Package{scrlayer-scrpage} replaces the old \Package{scrpage2}. The new
-package is a consequently developed extension of the design of
-\Package{scrpage2}. In difference to \Package{scrpage2} it provides the
-extended option interface of the \KOMAScript{} classes. Because
-\Package{scrlayer-scrpage} predominates \Package{scrpage2} it is recommended
-to not longer use \Package{scrpage2} but \Package{scrlayer-scrpage}. Because
-of this the current version of \Package{scrpage2} is the final one. All
-development resources will go into \Package{scrlayer-scrpage}. For more
-information about \Package{scrlayer-scrpage} see the \KOMAScript{} manual.
-
-\begin{Explain}
- In place of \Package{scrpage2} or \Package{scrlayer-scrpage} you can of
- course make use of \Package{fancyhdr}. However, \Package{scrpage2} and
- especially \Package{scrlayer-scrpage} integrated markedly better with the
- {\KOMAScript} bundle. For this reason, and because at the time the
- forerunner to \Package{fancyhdr} was missing many features,
- \Package{scrpage2} was developed. Naturally, \Package{scrpage2} and
- \Package{scrlayer-scrpage} are not limited to use only with the
- {\KOMAScript} classes, but can just as easily be used with other document
- classes.
-\end{Explain}
-
-
-\section{Basic Functionality}\label{sec:scrpage-en.basics}
-
-\begin{Explain}% Introduction to headings
- To understand the following description, an overview of {\LaTeX}'s fairly
- involved header and footer mechanism is needed. The {\LaTeX} kernel defines
- the page styles \PageStyle{empty}, which produces a completely empty header
- and footer, and \PageStyle{plain}, which produces usually only a page number
- in the footer and an empty header. Apart from these, many document classes
- provide the style \PageStyle{headings}, which allows more complex style
- settings and running
- headings\Index{headings>running}\Index{headings>automatic}. The
- \PageStyle{headings} style often has a related variant,
- \PageStyle{myheadings}, which is similar except for switching off the
- running headings\Index{headings>manual} and reverting them to manual control
- by the user. A more detailed description is given in the page style section
- of the \KOMAScript{} manual where it is also noted that some {\LaTeX}
- commands automatically switch to another page style\,---\,usually page style
- \PageStyle{plain}\,---\,for the current page.
-\end{Explain}
-
-
-Package \Package{scrpage2} does not distinguish between page styles with
-automatic, running headings and page styles with manual headings. The way to
-deal with automatic and manual headings is independent from the page style and
-so the page style is independent from the choice of automatic or manual
-headings. More information about this in \autoref{sec:scrpage-en.basics.mark}.
-
-
-\subsection{Predefined Page Styles}\label{sec:scrpage-en.basics.buildIn}
-
-One of the basic features of \Package{scrpage2} is a set of predefined,
-configurable page styles.
-
-% \lehead ...
-% scrheadings
-% \headmark \pagemark
-
-\begin{Declaration}
- \PageStyle{scrheadings}%
- \PageStyle{scrplain}
-\end{Declaration}%
-Package \Package{scrpage2} delivers its own page style, named
-\PageStyle{scrheadings}, which can be activated with the
-\Macro{pagestyle}\PParameter{scrheadings}. When this page style is in use, an
-appropriate \PageStyle{scrplain} page style is used for the plain page style.
-In this case \emph{appropriate} means that this new plain page style is also
-configureable by the commands introduced in
-\autoref{sec:scrpage-en.basics.format}, which, for example, configure the header
-and footer width and complies within the basic layout. Neither the activation
-of \PageStyle{scrheadings} nor the attendant change to the appropriate plain
-page style, \PageStyle{scrplain}, influences the mode of manual or automatic
-headings\Index{headings>automatic}\Index{headings>manual} (see
-\autoref{sec:scrpage-en.basics.mark}). The \PageStyle{scrplain} page style can
-also be activated directly with \Macro{pagestyle}.
-
-
-\begin{Declaration}
- \Macro{lehead}%
- \OParameter{scrplain-left-even}\Parameter{scrheadings-left-even}%
- \Macro{cehead}%
- \OParameter{scrplain-center-even}\Parameter{scrheadings-center-even}%
- \Macro{rehead}%
- \OParameter{scrplain-right-even}\Parameter{scrheadings-right-even}%
- \Macro{lefoot}%
- \OParameter{scrplain-left-even}\Parameter{scrheadings-left-even}%
- \Macro{cefoot}%
- \OParameter{scrplain-center-even}\Parameter{scrheadings-center-even}%
- \Macro{refoot}%
- \OParameter{scrplain-right-even}\Parameter{scrheadings-right-even}%
- \Macro{lohead}%
- \OParameter{scrplain-left-odd}\Parameter{scrheadings-left-odd}%
- \Macro{cohead}%
- \OParameter{scrplain-center-odd}\Parameter{scrheadings-center-odd}%
- \Macro{rohead}%
- \OParameter{scrplain-right-odd}\Parameter{scrheadings-right-odd}%
- \Macro{lofoot}%
- \OParameter{scrplain-left-odd}\Parameter{scrheadings-left-odd}%
- \Macro{cofoot}%
- \OParameter{scrplain-center-odd}\Parameter{scrheadings-center-odd}%
- \Macro{rofoot}%
- \OParameter{scrplain-right-odd}\Parameter{scrheadings-right-odd}%
- \Macro{ihead}%
- \OParameter{scrplain-inside}\Parameter{scrheadings-inside}%
- \Macro{chead}%
- \OParameter{scrplain-centered}\Parameter{scrheadings-centered}%
- \Macro{ohead}%
- \OParameter{scrplain-outside}\Parameter{scrheadings-outside}%
- \Macro{ifoot}%
- \OParameter{scrplain-inside}\Parameter{scrheadings-inside}%
- \Macro{cfoot}%
- \OParameter{scrplain-centered}\Parameter{scrheadings-centered}%
- \Macro{ofoot}%
- \OParameter{scrplain-outside}\Parameter{scrheadings-outside}
-\end{Declaration}%
-The page style of \Package{scrpage2} are defined to have flexible configurable
-header and footer. To achieve this, the page styles include three boxes in
-both the header and the footer. The contents of these boxes may be modified
-easily. The commands modifying the content of these boxes can be seen in
-\autoref{fig:scrpage-en.leheadetall}. Commands in the middle column modify the
-box contents on both odd and even pages. All of the commands have an optional
-and a mandatory argument. The option Argument influences the content of
-corresponding box of the plain page style, \PageStyle{scrplain}. The mandatory
-argument influences the content of the corresponding box of the page style
-\PageStyle{scrheadings}.
-
-\begin{figure}
-% \centering
- \setcapindent{0pt}%
- \begin{captionbeside}
- [Commands for modification of \Package{scrpage2} page styles elements]%
- {Commands for modification of page styles \PageStyle{scrheadings} and
- \PageStyle{scrplain} and their relationship to header and footer
- elements}
- [l]
- \setlength{\unitlength}{.95mm}\begin{picture}(100,65)(0,8)\small
- \put(0,12){\dashbox{2}(40,56){even page}}
- \put(60,12){\dashbox{2}(40,56){odd page}}
- % items top left
- \put(1,63){\framebox(8,4){~}}
- \put(16,63){\framebox(8,4){~}}
- \put(31,63){\framebox(8,4){~}}
- % items top right
- \put(61,63){\framebox(8,4){~}}
- \put(76,63){\framebox(8,4){~}}
- \put(91,63){\framebox(8,4){~}}
- % items bottom left
- \put(1,13){\framebox(8,4){~}}
- \put(16,13){\framebox(8,4){~}}
- \put(31,13){\framebox(8,4){~}}
- % items bottom right
- \put(61,13){\framebox(8,4){~}}
- \put(76,13){\framebox(8,4){~}}
- \put(91,13){\framebox(8,4){~}}
- % commands and arrow
- % for twoside
- %
- \put(50,65){\makebox(0,0){\DescRef{scrpage-en.cmd.ihead}}}
- \put(44,65){\vector(-1,0){4}}\put(56,65){\vector(1,0){4}}
- \put(50,58){\makebox(0,0){\DescRef{scrpage-en.cmd.chead}}}
- \put(44,58){\line(-1,0){24}}\put(56,58){\line(1,0){24}}
- \put(20,58){\vector(0,1){4}}\put(80,58){\vector(0,1){4}}
- \put(50,51){\makebox(0,0){\DescRef{scrpage-en.cmd.ohead}}}
- \put(44,51){\line(-1,0){40}}\put(56,51){\line(1,0){40}}
- \put(4,51){\vector(0,1){11}}\put(96,51){\vector(0,1){11}}
- %
- \put(50,15){\makebox(0,0){\DescRef{scrpage-en.cmd.ifoot}}}
- \put(56,15){\vector(1,0){4}}\put(44,15){\vector(-1,0){4}}
- \put(50,22){\makebox(0,0){\DescRef{scrpage-en.cmd.cfoot}}}
- \put(44,22){\line(-1,0){24}}\put(56,22){\line(1,0){24}}
- \put(20,22){\vector(0,-1){4}}\put(80,22){\vector(0,-1){4}}
- \put(50,29){\makebox(0,0){\DescRef{scrpage-en.cmd.ofoot}}}
- \put(44,29){\line(-1,0){40}}\put(56,29){\line(1,0){40}}
- \put(4,29){\vector(0,-1){11}}\put(96,29){\vector(0,-1){11}}
- % commands for oneside
- \put(5,69){\makebox(0,0)[b]{\DescRef{scrpage-en.cmd.lehead}}}
- \put(20,69){\makebox(0,0)[b]{\DescRef{scrpage-en.cmd.cehead}}}
- \put(35,69){\makebox(0,0)[b]{\DescRef{scrpage-en.cmd.rehead}}}
- %
- \put(65,69){\makebox(0,0)[b]{\DescRef{scrpage-en.cmd.lohead}}}
- \put(80,69){\makebox(0,0)[b]{\DescRef{scrpage-en.cmd.cohead}}}
- \put(95,69){\makebox(0,0)[b]{\DescRef{scrpage-en.cmd.rohead}}}
- %
- \put(5,11){\makebox(0,0)[t]{\DescRef{scrpage-en.cmd.lefoot}}}
- \put(20,11){\makebox(0,0)[t]{\DescRef{scrpage-en.cmd.cefoot}}}
- \put(35,11){\makebox(0,0)[t]{\DescRef{scrpage-en.cmd.refoot}}}
- %
- \put(65,11){\makebox(0,0)[t]{\DescRef{scrpage-en.cmd.lofoot}}}
- \put(80,11){\makebox(0,0)[t]{\DescRef{scrpage-en.cmd.cofoot}}}
- \put(95,11){\makebox(0,0)[t]{\DescRef{scrpage-en.cmd.rofoot}}}
- \end{picture}
- \end{captionbeside}
-% \caption[Commands for modification of \Package{scrpage2} page styles
-% elements]%
-% {Commands for modification of page styles \PageStyle{scrheadings} and
-% \PageStyle{scrplain} and their relationship to header and footer
-% elements}
- \label{fig:scrpage-en.leheadetall}
-\end{figure}
-
-\begin{Example}
- If one wants the page number within \PageStyle{scrheadings} be placed in the
- middle of the footer, then following can be used:
-\begin{lstcode}
- \cfoot{\pagemark}
-\end{lstcode}
- The next example shows how to place both running heading and page
- number\Index{page>number}\Index{pagination} in the header; the running
- heading\Index{headings} inside and the page number outside:
-\begin{lstcode}
- \ohead{\pagemark}
- \ihead{\headmark}
- \cfoot{}
-\end{lstcode}
- The command \Macro{cfoot}\PParameter{} is only required in order to
- empty the item in the middle of the footer, which normally contains
- the page number.
-\end{Example}
-
-The commands which are associated with only one item can be used for
-more advanced settings.
-
-\begin{Example}
- Assuming one has the order to write an annual report of a company, one could
- use commands like this:
-\begin{lstcode}
- \ohead{\pagemark}
- \rehead{Annual Report 2001}
- \lohead{\headmark}
- \cefoot{TheCompanyName Inc.}
- \cofoot{Department: Development}
-\end{lstcode}
- In order to keep the data in the footer synchronized with the content
- of the document, the footer has to be updated using \Macro{cofoot}
- when a new department is discussed in the report.
-\end{Example}
-
-As mentioned above, there is a new plain page style which corresponds to
-\PageStyle{scrheadings}. Since it should also be possible to customize this
-style, the commands support an optional argument with which the contents of
-the appropriate fields of this plain page style can be modified.
-
-\begin{Example}
- The position of the page number for the page style \PageStyle{scrheadings}
- can be declared as follows:
-\begin{lstcode}
- \cfoot[\pagemark]{}
- \ohead[]{\pagemark}
-\end{lstcode}
- When the command \Macro{chapter}, after it has started a new page, now
- switches to the page style \PageStyle{plain}, then the page number is
- centered in the footer.
-\end{Example}
-%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Macro{clearscrheadings}%
- \Macro{clearscrplain}%
- \Macro{clearscrheadfoot}
-\end{Declaration}%
-If one wants to redefine both the page style \PageStyle{scrheadings} and
-the corresponding plain page style, frequently one must empty
-some already occupied page elements. Since one rarely fills all items
-with new content, in most cases several instructions with empty
-parameters are necessary. With the help of these three instructions
-the quick and thorough deletion is possible. While
-\Macro{clearscrheadings} only deletes all fields of the page style
-\PageStyle{scrheadings}, and \Macro{clearscrplain} deletes all fields of
-the corresponding plain page style, \Macro{clearscrheadfoot}
-sets all fields of both page styles to empty.
-\begin{Example}
- If one wants to reset the page style to the default {\KOMAScript}
- settings, independent of the actual configuration, only these three
- commands are sufficient:
-\begin{lstcode}
- \clearscrheadfoot
- \ohead{\headmark}
- \ofoot[\pagemark]{\pagemark}
-\end{lstcode}
- Without the commands \Macro{clearscrheadfoot},
- \Macro{clearscrheadings} and \Macro{clearscrplain}, six commands with
- additional nine empty arguments would be required:
-\begin{lstcode}
- \ihead[]{}
- \chead[]{}
- \ohead[]{\headmark}
- \ifoot[]{}
- \cfoot[]{}
- \ofoot[\pagemark]{\pagemark}
-\end{lstcode}
- Of course, for a specific configuration, some of them could be
- dropped.%
-\end{Example}%
-%
-\EndIndexGroup
-%
-\EndIndexGroup
-
-
-In the previous examples two commands were used which have not been
-introduced yet. The description of these commands follows.
-
-\begin{Declaration}
- \Macro{leftmark}%
- \Macro{rightmark}
-\end{Declaration}%
-These two instructions make it possible to access the running headings, which
-are normally meant for the left or for the right page. These two instruction
-are not made available by \Package{scrpage2}, but directly by the {\LaTeX}
-kernel. When in this section running headings of the left page or the right
-page are mentioned, this refers to the contents of \Macro{leftmark} or
-\Macro{rightmark}, respectively.
-%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Macro{headmark}
-\end{Declaration}%
-This command gives access to the content of running headings. In
-contrast to \Macro{leftmark} and \Macro{rightmark}, one need not
-regard the proper assignment to left or right page.%
-%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Macro{pagemark}
-\end{Declaration}%
-This command returns the formatted page number. The formatting can be
-controlled by \DescRef{scrpage-en.cmd.pnumfont}, introduced in
-\autoref{sec:scrpage-en.basics.format}, \DescPageRef{scrpage-en.cmd.pnumfont},
-which \Macro{pagemark} heeds automatically.%
-%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \PageStyle{useheadings}
-\end{Declaration}%
-The package \Package{scrpage2} is meant primarily for use of the supplied
-styles or for defining one's own styles. However, it may be necessary to shift
-back also to a style provided by the document class. It might appear that
-this should be done with
-\Macro{pagestyle}\PParameter{headings}\IndexCmd{pagestyle}, but this has the
-disadvantage that commands \DescRef{scrpage-en.cmd.automark} and \DescRef{scrpage-en.cmd.manualmark}, to be
-discussed shortly, do not function as expected. For this reason one should
-shift back to the original styles using
-\Macro{pagestyle}\PParameter{useheadings}\IndexCmd{pagestyle}, which chooses
-the correct page styles automatically for both manual and automatic running
-headings.%
-%
-\EndIndexGroup
-
-
-\subsection{Manual and Running Headings}
-\label{sec:scrpage-en.basics.mark}
-% \automark \manualmark
-\BeginIndexGroup
-\BeginIndex{}{headings>running}%
-\BeginIndex{}{headings>automatic}%
-\BeginIndex{}{headings>manual}%
-Usually there is a \emph{my}-version of the \PageStyle{headings}
-page style. If such a page style is active, then the running headings
-are no longer updated no longer automatically and become manual
-headings. With \Package{scrpage2} a different path is taken. Whether
-the headings are running or manual is determined by the instructions
-\DescRef{scrpage-en.cmd.automark} and \DescRef{scrpage-en.cmd.manualmark}, respectively. The default
-can be set already while loading of the package, with the options
-\DescRef{scrpage-en.option.automark} and \DescRef{scrpage-en.option.manualmark} (see
-\autoref{sec:scrpage-en.basics.options},
-\DescPageRef{scrpage-en.option.automark}).
-
-
-\begin{Declaration}
- \Macro{manualmark}
-\end{Declaration}%
-As the name suggests, \Macro{manualmark} switches off the updating of
-the running headings and makes them manual. It is left to the user to
-update and provide contents for the headings. For that purpose the
-instructions \Macro{markboth}\IndexCmd{markboth} and
-\Macro{markright}\IndexCmd{markright} are available.%
-%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Macro{automark}\OParameter{right page}\Parameter{left page}
-\end{Declaration}%
-The macro \Macro{automark} activates the automatic updating, that is, running
-headings. For the two parameters the designations of the document sectioning
-level whose title is to appear in appropriate place are to be used. Valid
-values for the parameters are:
-\PValue{part}\ChangedAt{v2.2}{\Package{scrpage2}}, \PValue{chapter},
-\PValue{section}, \PValue{subsection}, \PValue{subsubsection},
-\PValue{paragraph}, and \PValue{subparagraph}. For most of the classes use of
-\PValue{part} will not produce the expected result. So far only {\KOMAScript}
-classes from version~2.9s up are known to support this value. The optional
-argument \PName{right page} is understandably meant only for double-sided
-documents. In the single-sided case one should normally not use it. With the
-help of the option
-\DescRef{scrpage-en.option.autooneside}\IndexOption{autooneside}\important{\DescRef{scrpage-en.option.autooneside}}
-one can also set that the optional argument in single-sided mode is ignored
-automatically (see \autoref{sec:scrpage-en.basics.options},
-\DescPageRef{scrpage-en.option.autooneside}).
-%
-\begin{Example}
- Assuming that the document uses a \emph{book} class, whose topmost
- section level is \emph{chapter}, then after a preceding
- \DescRef{scrpage-en.cmd.manualmark}
-\begin{lstcode}
- \automark[section]{chapter}
-\end{lstcode}
- restores the original behaviour. If one prefers lower section levels
- in running headings, the following can be used:
-\begin{lstcode}
- \automark[subsection]{section}
-\end{lstcode}
-% How useful the last declaration is, everybody has to decide
-% for themselves.
-\end{Example}
-
-\begin{Explain}
- For the upper section level, the data of the headings is set by the command
- \Macro{markboth}\IndexCmd{markboth}, while that for the lower section level
- by \Macro{markright}\IndexCmd{markright} or
- \Macro{markleft}\IndexCmd[indexmain]{markleft}. These commands are called
- indirectly by the sectioning commands. The macro \Macro{markleft} is
- provided by the package \Package{scrpage2} and is defined similarly to
- \Macro{markright} in the {\LaTeX} kernel. Although \Macro{markleft} is not
- defined as an internal command, the direct use is not recommended.
-\end{Explain}
-\EndIndexGroup
-%
-\EndIndexGroup
-
-
-\subsection{Formatting of Header and Footer}
-\label{sec:scrpage-en.basics.format}
-% \headfont \pnumfont
-% \setheadwidth \setfootwidth
-% \set(head|foot)(top|sep|bot)line
-The previous section concerned itself mainly with the contents of the
-header and footer. This is of course not sufficient to satisfy
-formative ambitions. Therefore we devote this section exclusively to
-this topic.
-
-\begin{Declaration}
- \Macro{headfont}%
- \Macro{footfont}%
- \Macro{pnumfont}
-\end{Declaration}%
-The command \Macro{headfont} contains the commands which determine the font of
-header and footer lines. Command \Macro{footfont} contains the difference of
-the footer to that. The difference for the style of the page number is defined
-by the command \Macro{pnumfont}.
-\begin{Example}
- If, for example, one wants the header to be typeset in bold sans serif, the
- footer in non-bold sans serif, and the page number in a slanted serif style,
- then one can use the following definitions:
-\begin{lstcode}
- \renewcommand{\headfont}{\normalfont\sffamily\bfseries}
- \renewcommand*{\footfont}{\normalfont\sffamily}
- \renewcommand{\pnumfont}{\normalfont\rmfamily\slshape}
-\end{lstcode}
-\end{Example}
-
-\BeginIndex{FontElement}{pagehead}%
-\BeginIndex{FontElement}{pagefoot}%
-\BeginIndex{FontElement}{pagenumber}%
-From version 2.8p of the {\KOMAScript} classes a new unified user interface
-scheme is implemented for font attributes. If \Package{scrpage2} is used
-together with one of these classes, then it is recommended to set up font
-attributes in the manner described in the \KOMAScript{} manual.
-\begin{Example}
- Instead of \Macro{renewcommand} the command \Macro{setkomafont}
- should be used to configure the font attributes. The previous
- definitions can then be written as:
-\begin{lstcode}
- \setkomafont{pagehead}\normalfont\sffamily\bfseries}
- \setkomafont{pagefoot}{\normalfont\sffamily}
- \setkomafont{pagenumber}{\normalfont\rmfamily\slshape}
-\end{lstcode}
-\end{Example}
-\EndIndexGroup
-
-
-\begin{Declaration}
-\Macro{setheadwidth}\OParameter{shift}\Parameter{width}%
-\Macro{setfootwidth}\OParameter{shift}\Parameter{width}
-\end{Declaration}%
-Normally the widths of header and footer lines correspond to the width of the
-text body. The commands
-\Macro{setheadwidth}\Index{header>width}\Index{head>width} and
-\Macro{setfootwidth}\Index{footer>width}\Index{foot>width} enable the user to
-adapt in a simple manner the widths to his needs. The mandatory argument
-\PName{width} takes the value of the desired width of the page header or
-footer, while \PName{shift} is a length parameter by which amount the
-appropriate item is shifted toward the outside page edge.
-
-For the most common situations the mandatory argument \PName{width}
-accepts the following symbolic values:
-\begin{labeling}[\,--]{\PValue{textwithmarginpar}}
-\item[\PValue{paper}] the width of the paper
-\item[\PValue{page}] the width of the page
-\item[\PValue{text}] the width of the text body
-\item[\PValue{textwithmarginpar}] the width of the text body including margin
-\item[\PValue{head}] the current header width
-\item[\PValue{foot}] the current footer width
-\end{labeling}
-The difference between \PValue{paper} and \PValue{page} is that \PValue{page}
-means the width of the paper less the binding correction if the package
-\Package{typearea}\IndexPackage{typearea} is used (see the chapter about
-\Package{typearea} in the \KOMAScript{} manual). Without \Package{typearea}
-both values are identical.
-
-\begin{Example}
- Assume that one wants a layout like that of \emph{The
- {\LaTeX}\,Companion}, where the header projects into the
- margin. This can be obtained with:
-\begin{lstcode}
- \setheadwidth[0pt]{textwithmarginpar}
-\end{lstcode}
-%
- which appears like this on an odd page:
-%
- \begin{XmpTopPage}
- \XmpHeading{10,25}{85}
- \thinlines\XmpRule{10,23}{85}
- \XmpSetText[\XmpTopText]{10,21}
- \XmpMarginNote{83,11.8}
- \end{XmpTopPage}
-%
- If the footer line should have the same width and alignment, then two
- ways to set this up are possible. The first way simply repeats the
- settings for the case of the footer line:
-\begin{lstcode}
- \setfootwidth[0pt]{textwithmarginpar}
-\end{lstcode}
-%
- In the second way the symbolic value \PValue{head} is used, since the
- header already has the desired settings.
-\begin{lstcode}
- \setfootwidth[0pt]{head}
-\end{lstcode}
-\end{Example}
-
-If no \PName{shift} is indicated, i.\,e., without the optional argument,
-then the header or footer appears arranged symmetrically on the page.
-In other words, a value for the \PName{shift} is determined
-automatically to correspond to the current page shape.
-%
-\begin{Example}
- Continuing with the previous example, we remove the optional
- argument:
-\begin{lstcode}
- \setheadwidth{textwithmarginpar}
-\end{lstcode}
-%
- which appears like this on an odd page:
-%
- \begin{XmpTopPage}
- \XmpHeading{5,25}{85}
- \thinlines\XmpRule{5,23}{85}
- \XmpSetText[\XmpTopText]{10,21}
- \XmpMarginNote{83,11.8}
- \end{XmpTopPage}
-\end{Example}
-
-As can be seen, the header is now shifted inward, while the header
-width has not changed. The shift is calculated in a way that the
-configuration of the typearea become visible also here.%
-%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Macro{setheadtopline}\OParameter{length}\Parameter{thickness}%
- \OParameter{commands}%
- \Macro{setheadsepline}\OParameter{length}\Parameter{thickness}%
- \OParameter{commands}%
- \Macro{setfootsepline}\OParameter{length}\Parameter{thickness}%
- \OParameter{commands}%
- \Macro{setfootbotline}\OParameter{length}\Parameter{thickness}%
- \OParameter{commands}
-\end{Declaration}%
-Corresponding to the size configuration parameters of header and
-footer there are commands to modify the rules above and below the
-header and footer. But first of all the rules should be activated. See options
-\DescRef{scrpage-en.option.headtopline}, \DescRef{scrpage-en.option.headsepline},
-\DescRef{scrpage-en.option.footsepline}, and \DescRef{scrpage-en.option.footbotline} in
-\autoref{sec:scrpage-en.basics.options},
-\DescPageRef{scrpage-en.option.headsepline} for this.
-
-\begin{labeling}[\,--]{\Macro{setfootsepline}}
-\item[\Macro{setheadtopline}] configures the line above the header
-\item[\Macro{setheadsepline}] configures the line below the header
-\item[\Macro{setfootsepline}] configures the line above the footer
-\item[\Macro{setfootbotline}] configures the line below the footer
-\end{labeling}
-
-The mandatory argument \PName{thickness} determines how strongly the
-line is drawn. The optional argument \PName{length} accepts the same
-symbolic values as \PName{width} for \DescRef{scrpage-en.cmd.setheadwidth}, as well as
-also a normal length expression. As long as the optional argument
-\PName{length} is not assigned a value, the appropriate line length
-adapts automatically the width of the header or the footer.
-
-Use \PValue{auto} in the length argument to restore this automation
-for the length of a line.
-
-\BeginIndexGroup
-\BeginIndex{FontElement}{headtopline}%
-\BeginIndex{FontElement}{headsepline}%
-\BeginIndex{FontElement}{footsepline}%
-\BeginIndex{FontElement}{footbotline}%
-\BeginIndex{FontElement}{footbottomline}%
-The\ChangedAt{v2.2}{\Package{scrpage2}} optional argument \PName{commands} may
-be used to specify additional commands to be executed before the respective
-line is drawn. For example, such commands could be used for changing the
-color\Index{header>color}\Index{footer>color}%
-\Index{head>color}\Index{foot>color}%
-\Index{color>in header}\Index{color>in footer} of the line. When using a
-{\KOMAScript} class you could also use
-\Macro{setkomafont}\IndexCmd{setkomafont} to specify commands for one of the
-elements \FontElement{headtopline}\important[i]{\FontElement{headtopline}\\
- \FontElement{headsepline}\\
- \FontElement{footsepline}\\
- \FontElement{footbottomline}}, \FontElement{headsepline},
-\FontElement{footsepline}, \FontElement{footbottomline}, or
-\FontElement{footbotline}. These can then be extended via
-\Macro{addtokomafont}\IndexCmd{addtokomafont}. See the \KOMAScript{} manual
-for details on the \Macro{setkomafont} and \Macro{addtokomafont} commands.
-\EndIndexGroup
-
-
-\begin{Declaration}
- \labelsuffix[auto+current]
- \Macro{setheadtopline}\POParameter{auto}%
- \PParameter{current}%
- \labelsuffix[auto]
- \Macro{setheadtopline}\POParameter{auto}%
- \Parameter{}%
- \labelsuffix[auto+]
- \Macro{setheadtopline}\POParameter{auto}%
- \Parameter{}\OParameter{}
-\end{Declaration}%
-The arguments shown here for the command \DescRef{scrpage-en.cmd.setheadtopline} are of
-course valid for the other three configuration commands too.
-
-If the mandatory parameter has the value \PValue{current} or has been
-left empty, then the line thickness is not changed. This may be used
-to modify the length of the line without changing its thickness.
-
-If the optional argument \PName{commands} is omitted, then all command
-settings that might have been specified before will remain active,
-while an empty \PName{commands} argument will revoke any previously
-valid commands.
-
-\begin{Example}
- If the header, for example, is to be contrasted by a strong line of
- 2\,pt above and a normal line of 0.4\,pt between header and body,
- one can achieve this with:
-\begin{lstcode}
- \setheadtopline{2pt}
- \setheadsepline{.4pt}
-\end{lstcode}
- Additionally\textnote{Attention!} the options \DescRef{scrpage-en.option.headtopline} and
- \DescRef{scrpage-en.option.headsepline} have to be used preferably globally in the optional
- argument of \Macro{documentclass}. In this case the result may be the
- following.
-%
-\begin{XmpTopPage}
- \XmpHeading{10,25}{70}
- \thinlines\XmpRule{10,23}{70}
- \thicklines\XmpRule{10,28}{70}
- \XmpSetText[\XmpTopText]{10,21}
- \XmpMarginNote{83,11.8}
-\end{XmpTopPage}
-
- To specify that this line is to be drawn also, e.\,g., in red color, you
- would change the commands like this:
-\begin{lstcode}
- \setheadtopline{2pt}[\color{red}]
- \setheadsepline{.4pt}[\color{red}]
-\end{lstcode}
- In this example, as well as in the following one, line color is
- activated by applying the syntax of the
- \Package{color}\IndexPackage{color} package, so this package must of
- course be loaded. Since \Package{scrpage2} comes without built-in
- color handling, any package providing color support may be used.
-
- {\KOMAScript} classes also support the following way of color specification:
-\begin{lstcode}
- \setheadtopline{2pt}
- \setheadsepline{.4pt}
- \setkomafont{headtopline}[\color{red}]
- \setkomafont{headsepline}[\color{red}]
-\end{lstcode}
-
- The automatic adjustment to the header and footer width is illustrated
- in the following example:
-\begin{lstcode}
- \setfootbotline{2pt}
- \setfootsepline[text]{.4pt}
- \setfootwidth[0pt]{textwithmarginpar}
-\end{lstcode}
-
-% \phantomsection for hyperref-\pageref-links jum-2001/11/24
- \phantomsection\label{page:scrpage-en.autoLineLength}
- \begin{XmpBotPage}
- \XmpHeading{10,18}{85}
- \thinlines\XmpRule{17,21}{70}
- \thicklines\XmpRule{10,16}{85}
- \XmpSetText[\XmpBotText]{10,33}
- \XmpMarginNote{83,24}
- \end{XmpBotPage}
-\end{Example}
-%
-Now not everyone will like the alignment of the line above the footer;
-instead, one would expect the line to be left-aligned. This can only
-be achieved with a global package option, which will be described
-together with other package options in the next
-\autoref{sec:scrpage-en.basics.options}.%
-%
-\EndIndexGroup
-\EndIndexGroup
-
-
-\subsection{Package Options}
-\label{sec:scrpage-en.basics.options}
-% head(in|ex)clude foot(in|ex)clude --> typearea
-% headtopline headsepline footbotline footsepline (plain...)
-% komastyle standardstyle
-% markuppercase markusecase
-% automark manualmark
-
-In opposite to the \KOMAScript{} classes, where the most options may be
-changed using \Macro{KOMAoptions} or \Macro{KOMAoption} also after loading the
-class, package \Package{scrpage2} does not provide this feature\iffree{
- currently}{}. All options to \Package{scrpage2} have to be global options,
-i.\,e. be part of the optional argument of \Macro{documentclass}, or
-package option, i.\,e. be part of the optional argument of \Macro{usepackage}.
-
-\begin{Declaration}
- \Option{headinclude}%
- \Option{headexclude}%
- \Option{footinclude}%
- \Option{footexclude}
-\end{Declaration}%
-Since\textnote{Attention!} \KOMAScript~3\ChangedAt{v2.3}{\Package{scrpage2}}
-this options should not be passed to \Package{scrpage2} any longer using
-\Macro{PassOptionsToPackage} or the optional argument of
-\Macro{usepackage}. Only for compatibility reason \Package{scrpage2} still
-declares them and pass them as \Option{headinclude},
-\OptionValue{headinclude}{false}, \Option{footinclude}, and
-\OptionValue{footinclude}{false} to package \Package{typearea}.
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Option{headtopline}%
- \Option{plainheadtopline}%
- \Option{headsepline}%
- \Option{plainheadsepline}%
- \Option{footsepline}%
- \Option{plainfootsepline}%
- \Option{footbotline}%
- \Option{plainfootbotline}
-\end{Declaration}%
-Basic adjustment of the lines under and over header and footer can be
-made with these options. These adjustments are then considered the
-default for all page styles defined with \Package{scrpage2}. If one
-of these options is used, then a line thickness 0.4\,pt is set.
-Since there is a corresponding plain page style to the
-page style \PageStyle{scrheadings}, the corresponding line in the plain
-style can also be configured with the \Option{plain\dots} options.
-These \Option{plain} options do however work only if the corresponding
-options without \Option{plain} are activated. Thus,
-\Option{plainheadtopline} shows no effect without the
-\Option{headtopline} option set.
-
-With these options, it is to be noted that the appropriate page part,
-header or footer, is considered as a part of the text area for the
-calculation of the type area in case a line has been activated. This
-means that, if the separation line between header and text is
-activated with \Option{headsepline}, then the package
-\Package{typearea} calculates the type area in such a way that the
-page header is part of the text block automatically.
-
-The\textnote{Attention!} conditions for the options of the preceding paragraph
-apply also to this automation. That means that the package \Package{typearea}
-must be loaded after \Package{scrpage2}, or that on use of a {\KOMAScript}
-class, the options \DescRef{scrpage-en.option.headinclude} and \DescRef{scrpage-en.option.footinclude} must be set
-explicitly with \Macro{documentclass} in order to transfer header or footer
-line in the text area.%
-%
-\EndIndexGroup
-
-
-\begin{Declaration}
-\Option{ilines}%
-\Option{clines}%
-\Option{olines}
-\end{Declaration}%
-\Index{rule>alignment}\Index{line>alignment}%
-With the definition of the line lengths the case can arise where the
-lengths are set correctly, but the justification is not as desired
-because the line will be centered in the header or footer area. With
-the package options presented here, this specification can be modified
-for all page styles defined with \Package{scrpage2}. The option
-\Option{ilines} sets the justification in such a way that the lines
-align to the inside edge. The option \Option{clines} behaves like the
-default justification, and \Option{olines} aligns at the outside edge.
-
-\begin{Example}
- The next example illustrates the influence of the
- option \Option{ilines}. Please compare to the example for
- \DescRef{scrpage-en.cmd.setfootsepline} on \autopageref{page:scrpage-en.autoLineLength}.
-\begin{lstcode}
- \usepackage[ilines]{scrpage2}
- \setfootbotline{2pt}
- \setfootsepline[text]{.4pt}
- \setfootwidth[0pt]{textwithmarginpar}
-\end{lstcode}
- The mere use of the option \Option{ilines} leads to the different
- result shown below:
-\begin{XmpBotPage}
- \XmpHeading{10,18}{85}
- \thinlines\XmpRule{10,21}{70}
- \thicklines\XmpRule{10,16}{85}
- \XmpSetText[\XmpBotText]{10,33}
- \XmpMarginNote{83,24}
-\end{XmpBotPage}
- In contrast to the default configuration, the separation line between
- text and footer is now left-aligned, not centered.%
-\end{Example}%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Option{automark}%
- \Option{manualmark}
-\end{Declaration}%
-\BeginIndex{}{headings>automatic}%
-\BeginIndex{}{headings>manual}%
-These options set at the beginning of the document whether to use running
-headings or manual ones. The option \Option{automark} switches the automatic
-updating on, \Option{manualmark} deactivates it. Without the use of one of
-the two options, the setting which was valid when the package was loaded is
-preserved.
-%
-\begin{Example}
- You load the package \Package{scrpage2} directly after the document class
- \Class{scrreprt} without any package options:
-\begin{lstcode}
- \documentclass{scrreprt}
- \usepackage{scrpage2}
-\end{lstcode}
- Since the default page style of \Class{scrreprt} is \PageStyle{plain},
- this page style is also now still active. Futhermore, \PageStyle{plain}
- means manual headings. If one now activates the page style
- \PageStyle{scrheadings} with
-\begin{lstcode}
- \pagestyle{scrheadings}
-\end{lstcode}
- then the manual headings are nevertheless still active.
-
- If you instead use the document class \Class{scrbook}, then after
-\begin{lstcode}
- \documentclass{scrbook}
- \usepackage{scrpage2}
-\end{lstcode}
- the page style \PageStyle{headings} is active and the running headings are
- updated automatically. Switching to the page style
- \PageStyle{scrheadings} keeps this setting active. The marking commands
- of \Class{scrbook} continue to be used.
-
- However, the use of
-\begin{lstcode}
- \usepackage[automark]{scrpage2}
-\end{lstcode}
- activates running headings independently of the used document class.
- The option does not of course affect the used page style \PageStyle{plain}
- of the class \Class{scrreprt}. The headings are not visible until the
- page style is changed to
- \PageStyle{scrheadings}\IndexPagestyle{scrheadings}, \PageStyle{useheadings}
- or another user-defined page style with headings.%
-\end{Example}%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Option{autooneside}
-\end{Declaration}%
-\BeginIndex{}{headings>manual}%
-\BeginIndex{}{headings>automatic}%
-This option ensures that the optional parameter of
-\DescRef{scrpage-en.cmd.automark}\IndexCmd{automark} will be ignored automatically in
-one-sided mode. See also the explanation of the command
-\DescRef{scrpage-en.cmd.automark} in \autoref{sec:scrpage-en.basics.mark},
-\DescPageRef{scrpage-en.cmd.automark}.%
-%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Option{komastyle}%
- \Option{standardstyle}
-\end{Declaration}%
-These options determine the look of the predefined page styles
-\PageStyle{scrheadings} and \PageStyle{scrplain}. The option
-\Option{komastyle} configures a look like that of the {\KOMAScript} classes.
-This is the default for {\KOMAScript} classes and can in this way also be set
-for other classes.
-
-The option \Option{standardstyle} configures a page style as it is
-expected by the standard classes. Furthermore, the option
-\DescRef{scrpage-en.option.markuppercase} will be activated automatically, but only if
-option \DescRef{scrpage-en.option.markusedcase} is not given.%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Option{markuppercase}%
- \Option{markusedcase}
-\end{Declaration}%
-In order to achieve the functionality of \DescRef{scrpage-en.cmd.automark}, the package
-\Package{scrpage2} modifies internal commands which are used by the
-document structuring commands to set the running headings. Since some
-classes, in contrast to the {\KOMAScript} classes, write the headings
-in uppercase letters, \Package{scrpage2} has to know how the used
-document class sets the headings.
-
-Option \Option{markuppercase} shows \Package{scrpage2} that the document class
-uses uppercase letters. If the document class does not set the headings in
-uppercase letters, then the option \Option{markusedcase} should be given.
-These\textnote{Attention!} options are not suitable to force a representation;
-thus, unexpected effects may occur if the given option does not match the
-actual behaviour of the document class.%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Option{nouppercase}
-\end{Declaration}%
-In the previous paragraph dealing with \DescRef{scrpage-en.option.markuppercase} and
-\DescRef{scrpage-en.option.markusedcase}, it has been already stated that some document classes
-set the running headings\Index{heading} in uppercase letters using the
-commands
-\Macro{MakeUppercase}\IndexCmd{MakeUppercase}\important{\Macro{MakeUppercase}}
-or \Macro{uppercase}\IndexCmd{uppercase}\important{\Macro{uppercase}}.
-Setting the option \Option{nouppercase} allows disabling both these commands
-in the headers and footers. However, this is valid only for page styles
-defined by \Package{scrpage2}, including \PageStyle{scrheadings} and its
-corresponding plain page style.
-
-The applied method is very brutal and can cause that desired changes
-of normal letters to uppercase letters \Index{uppercase letters} do
-not occur. Since these cases do not occur frequently, the option
-\Option{nouppercase} usually affords a useful solution.
-\begin{Example}
- Your document uses the standard class \Class{book}\IndexClass{book},
- but you do not want the uppercase headings but mixed case
- headings. Then the preamble of your document could start with:
-\begin{lstcode}
- \documentclass{book}
- \usepackage[nouppercase]{scrpage2}
- \pagestyle{scrheadings}
-\end{lstcode}
- The selection of the page style \PageStyle{scrheadings} is necessary,
- since otherwise the page style \PageStyle{headings} is active, which
- does not respect the settings made by option \Option{nouppercase}.
-\end{Example}
-
-In some cases not only classes but also packages set the running
-headings in uppercase letters.
-Also in these cases the option \Option{nouppercase} should be able
-to switch back to the normal mixed case headings.%
-%
-\EndIndexGroup
-
-
-\section{Defining Own Page Styles}\label{sec:scrpage-en.UI}
-
-\subsection{The Interface for Beginners}\label{sec:scrpage-en.UI.user}
-% \deftripstyle
-
-Now one would not like to remain bound to only the provided page
-styles, but may wish to define one's own page styles. Sometimes there
-will be a special need, since a specific \emph{Corporate Identity} may
-require the declaration of its own page styles. The easiest way to
-deal with this is:
-\begin{Declaration}
- \Macro{deftripstyle}\Parameter{name}%
- \OParameter{LO}\OParameter{LI}%
- \Parameter{HI}\Parameter{HC}\Parameter{HO}%
- \Parameter{FI}\Parameter{FC}\Parameter{FO}
-\end{Declaration}%
-The individual parameters have the following meanings:
-\begin{labeling}[\,--]{\PName{Name}}
-\item[\PName{name}] the name of the page style, in order to activate it
- using the command \Macro{pagestyle}\Parameter{name}
-\item[\PName{LO}] the thickness of the outside lines,
- i.\,e., the line above the header
- and the line below the footer (optional)
-\item[\PName{LI}] the thickness of the separation lines,
- i.\,e., the line below the header
- and the line above the foot (optional)
-\item[\PName{HI}] contents of the inside box in the page header for two-sided
- layout or left for one-sided layout
-\item[\PName{HC}] contents of the centered box in the page header
-\item[\PName{HO}] contents of the outside box in the page header for two-sided
- layout or right for one-sided layout
-\item[\PName{FI}] contents of the inside box in the page footer for two-sided
- layout or left for one-sided layout
-\item[\PName{FC}] contents of the centered box in the page footer
-\item[\PName{FO}] contents of the outside box in the page footer for two-sided
- layout or right for one-sided layout
-\end{labeling}
-
-The command \Macro{deftripstyle} definitely represents the simplest
-possibility of defining page styles. Unfortunately, there are also
-restrictions connected with this, since in a page range using a page
-style defined via deftripstyle, no modification of the lines above and
-below header and footer can take place.
-
-\begin{Example}
- Assume a two-sided layout, where the running headings are placed on
- the inside. Furthermore, the document title, here ``Report'', shall
- be placed outside in the header, the page number shall be centered
- in the footer.
-\begin{lstcode}
- \deftripstyle{TheReport}%
- {\headmark}{}{Report}%
- {}{\pagemark}{}
-\end{lstcode}
-
- If moreover the lines above the header and below the footer shall be
- drawn with a thickness of 2\,pt, and the text body be separated from
- header and footer with 0.4\,pt lines, then the definition has to be
- extended:
-\begin{lstcode}
- \deftripstyle{TheReport}[2pt][.4pt]%
- {\headmark}{}{Report}%
- {}{\pagemark}{}
-\end{lstcode}
- See \autoref{fig:scrpage2.tomuchlines} for the result.
-%
-\begin{figure}
- \typeout{^^J--- Ignore underfull and overfull \string\hbox:}
- \setcapindent{0pt}%
-% \begin{center}
- \begin{captionbeside}
- [{%
- Example of a user defined, line dominated page style%
- }]{%
- example of a user defined, line dominated page style
- with a static and a running heading at the page header and a page number
- centered at the page footer%
- \label{fig:scrpage2.tomuchlines}%
- }
- [l]
- \iffree{\setlength{\unitlength}{1.15mm}}{\setlength{\unitlength}{1mm}}%
- \begin{picture}(85,51)\scriptsize
- \thinlines
- \put(0,0){\line(0,1){51}}
- \put(45,0){\line(0,1){51}}
- \put(0,51){\line(1,0){40}}
- \put(45,51){\line(1,0){40}}
- %
- \thicklines
- \put(40,0){\line(0,1){51}}
- \put(85,0){\line(0,1){51}}
- \put(0,0,){\line(1,0){40}}
- \put(45,0){\line(1,0){40}}
- %
- \XmpHeading[Report\hfill 2. The Eye]{6,47}{30}
- \XmpHeading[2.1 Retina\hfill Report]{49,47}{30}
- \XmpHeading[\hfill 14\hfill]{6,6.5}{30}
- \XmpHeading[\hfill 15\hfill]{49,6.5}{30}
- \put(6,44){\makebox(0,0)[tl]{\parbox{30\unitlength}{\tiny%
- \textbf{2.1 Retina}\\
- \XmpText[49]}}}
- \put(49,44){\makebox(0,0)[tl]{\parbox{30\unitlength}{\tiny%
- \XmpText[51]}}}
- %
- \thinlines
- \XmpRule{6,45.5}{30}\XmpRule{49,45.5}{30}
- \XmpRule{6,8}{30}\XmpRule{49,8}{30}
- \linethickness{1pt}
- \XmpRule{6,49}{30}\XmpRule{49,49}{30}
- \XmpRule{6,5}{30}\XmpRule{49,5}{30}
- \end{picture}
-% \end{center}
- \end{captionbeside}
- \typeout{^^J--- Don't ignore underfull and overfull \string\hbox:^^J}
-\end{figure}
-\end{Example}
-\EndIndexGroup
-
-
-\subsection{The Interface for Experts}\label{sec:scrpage-en.UI.expert}
-% \defpagestyle \newpagestyle \providepagestyle \renewpagestyle
-Simple page styles, as they can be defined with \DescRef{scrpage-en.cmd.deftripstyle},
-are fairly rare according to experience. Either a professor requires
-that the thesis looks like his or her own\,---\,and who seriously wants
-to argue against such a wish?\,---\,or a company would like that half the
-financial accounting emerges in the page footer. No problem, the
-solution is:
-%
-\begin{Declaration}
- \Macro{defpagestyle}\Parameter{name}\Parameter{header definition}\Parameter{footer definition}%
- \Macro{newpagestyle}\Parameter{name}\Parameter{header definition}\Parameter{footer definition}%
- \Macro{renewpagestyle}\Parameter{name}\Parameter{header definition}\Parameter{footer definition}%
- \Macro{providepagestyle}\Parameter{name}\Parameter{header definition}\Parameter{footer definition}
-\end{Declaration}%
-These four commands give full access to the capabilities of
-\Package{scrpage2} to define page styles. Their structure is
-indentical, they differ only in the manner of working.
-\begin{labeling}[\ --]{\Macro{providepagestyle}}
-\item[\Macro{defpagestyle}] defines a new page style.
-If a page style with this name already exists it will be overwritten.
-\item[\Macro{newpagestyle}] defines a new page style.
-If a page style with this name already exists a error message will be given.
-\item[\Macro{renewpagestyle}] redefines a page style.
-If a page style with this name does not exist a error message will be given.
-\item[\Macro{providepagestyle}] defines a new page style only if there is no page style with that name already present.
-\end{labeling}
-
-Using \Macro{defpagestyle} as an example, the syntax of the four
-commands is explained below.
-\begin{labeling}[~--]{\PName{head definition}}
-\item[\PName{name}] the name of the page style for
- \Macro{pagestyle}\Parameter{name}
-\item[\PName{header definition}] the declaration of the header, consisting
- of five element; elements in round parenthesis are optional:\hfill\\
- \hspace*{1em}\AParameter{ALL,ALT}%
- \Parameter{EP}\Parameter{OP}\Parameter{OS}\AParameter{BLL,BLT}
-\item[\PName{footer definition}] the declaration of the footer, consisting
- of five element; elements in round parenthesis are optional:\hfill\\
- \hspace*{1em}\AParameter{ALL,ALT}%
- \Parameter{EP}\Parameter{OP}\Parameter{OS}\AParameter{BLL,BLT}
-\end{labeling}
-
-As can be seen, header and footer declaration have identical
-structure. The individual parameters have the following meanings:
-\begin{labeling}[\ --]{\PName{OLD}}
-\item[\PName{ALL}] above line length: (header = outside, footer = separation
- line)
-\item[\PName{ALT}] above line thickness
-\item[\PName{EP}] definition for \emph{even} pages
-\item[\PName{OP}] definition for \emph{odd} pages
-\item[\PName{OS}] definition for \emph{one-sided} layout
-\item[\PName{BLL}] below line length: (header = separation line, footer =
- outside)
-\item[\PName{BLT}] below line thickness
-\end{labeling}
-
-If the optional line-parameters are omitted, then the line behaviour remains
-configurable by the commands introduced in
-\autoref{sec:scrpage-en.basics.format},
-\DescPageRef{scrpage-en.cmd.setheadtopline}.
-
-The three elements \PName{EP}, \PName{OP} and \PName{OS} are boxes with the
-width of page header or footer, as appropriate. The corresponding definitions
-are set left-justified in the boxes. To set something left- \emph{and}
-right-justified into the boxes, the space between two text elements can be
-stretched using \Macro{hfill}:
-%
-\begin{lstcode}[belowskip=\dp\strutbox]
- {\headmark\hfill\pagemark}
-\end{lstcode}
-
-If one would like a third text-element centered in the box, then an
-extended definition must be used. The commands \Macro{rlap} and
-\Macro{llap} simply write the given arguments, but for {\LaTeX} they
-take up no horizontal space. Only in this way is the middle text
-really centered.
-%
-\begin{lstcode}
- {\rlap{\headmark}\hfill centered text\hfill\llap{\pagemark}}
-\end{lstcode}
-
-\iffalse% Umbruchkorrekturtext
-This and the use of the expert interface in connection with other
-commands provided by \Package{scpage2} follows now in the final
-example.
-\fi
-
-\begin{Example}
- This examples uses the document class \Class{scrbook}, which means
- that the default page layout is two-sided. The package
- \Package{scrpage2} is loaded with options \DescRef{scrpage-en.option.automark} and
- \DescRef{scrpage-en.option.headsepline}. The first switches on the automatic update of
- running headings, the second determines that a separation line
- between header and text body is drawn in the \PageStyle{scrheadings}
- page style.
-
-\begin{lstcode}
- \documentclass{scrbook}
- \usepackage[automark,headsepline]{scrpage2}
-\end{lstcode}
-
- The expert interface is used to define two page styles. The page
- style \PValue{withoutLines} does not define any line parameters. The
- second page style \PValue{withLines} defines a line thicknes of 1\,pt
- for the line above the header and 0\,pt for the separation line
- between header and text.
-
-\begin{lstcode}
- \defpagestyle{withoutLines}{%
- {Example\hfill\headmark}{\headmark\hfill without lines}
- {\rlap{Example}\hfill\headmark\hfill%
- \llap{without lines}}
- }{%
- {\pagemark\hfill}
- {\hfill\pagemark}
- {\hfill\pagemark\hfill}
- }
-\end{lstcode}
-
-\begin{lstcode}
- \defpagestyle{withLines}{%
- (\textwidth,1pt)
- {with lines\hfill\headmark}{\headmark\hfill with lines}
- {\rlap{\KOMAScript}\hfill \headmark\hfill%
- \llap{with lines}}
- (0pt,0pt)
- }{%
- (\textwidth,.4pt)
- {\pagemark\hfill}
- {\hfill\pagemark}
- {\hfill\pagemark\hfill}
- (\textwidth,1pt)
- }
-\end{lstcode}
-
- Right at the beginning of the document the page style
- \PageStyle{scrheadings} is activated. The command \Macro{chapter} starts
- a new chapter and automatically sets the page rstyle for this page to
- \PageStyle{plain}. Even though not a prime example, the command
- \DescRef{scrpage-en.cmd.chead} shows how running headings can be created even on a
- plain page. However, in principle running headings on
- chapter start-pages are to be avoided, since otherwise the special
- character of the \PageStyle{plain} page style is lost. It is more
- important to indicate that a new chapter starts here than that a
- section of this page has a special title.
-
-\begin{lstcode}
- \begin{document}
- \pagestyle{scrheadings}
- \chapter{Thermodynamics}
- \chead[\leftmark]{}
- \section{Main Laws}
- Every system has an extensive state quantity called
- Energy. In a closed system the energy is constant.
-\end{lstcode}
-
- \begin{XmpTopPage}
- \XmpHeading[\hfill\textsl{1. Thermodynamics}\hfill]{10,27}{70}
- \put(10,17){\normalsize\textbf{\sffamily 1.Thermodynamics}}
- \put(10,12){\textbf{\sffamily 1.1 Main Laws}}
- \XmpSetText[%
- Every System has an extensive state quantity]{10,9}
- \end{XmpTopPage}
-
- After starting a new page the page style \PageStyle{scrheadings} is
- active and thus the separation line below the header is visible.
-\begin{lstcode}
- There is a state quatity of a system, called entropy, whose temporal
- change consists of entropy flow and entropy generation.
-\end{lstcode}
- \begin{XmpTopPage}
- \XmpHeading[\textsl{1. Thermodynamics}\hfill]{20,27}{70}
- \thinlines\XmpRule{20,25}{70}
- \XmpSetText[%
- There is a condition unit of a system, called entropy,
- whose temporal change consists of entropy flow
- and entropy generation.]{20,20}
- \end{XmpTopPage}
-
- After switching to the next page, the automatic update of the running
- headings is disabled using \DescRef{scrpage-en.cmd.manualmark}, and the page style
- \PValue{withoutLines} becomes active. Since no line parameters are
- given in the definition of this page style, the default configuration
- is used, which draws a separation line between header and text body
- because \Package{scrpage2} was called with \DescRef{scrpage-en.option.headsepline}.
-\begin{lstcode}
- \manualmark
- \pagestyle{withoutLines}
- \section{Exergy and Anergy}\markright{Energy Conversion}
- During the transition of a system to an equilibrium state
- with its environment, the maximum work gainable is called
- exergy.
-\end{lstcode}
- \begin{XmpTopPage}
- \XmpHeading[\slshape Energy Conversion\hfill without lines]{10,27}{70}
- \thinlines\XmpRule{10,25}{70}
- \XmpSetText[\setlength{\parfillskip}{0pt plus 1fil}%
- \textbf{\sffamily 1.2 Exergy and Anergy}\\
- During the transition of a system to an equilibrium state
- with its environment, the maximum work gainable is called
- exergy.]{10,21}
- \end{XmpTopPage}
-
- At the next page of the document, the page style \PValue{withLines} is
- activated. The line settings of its definition are taken in account
- and the lines are drawn accordingly.
-\begin{lstcode}
- \pagestyle{mitLinien}
- \renewcommand{\headfont}{\itshape\bfseries}
- The portion of an energy not convertible in exergy
- is named anergy \Var{B}.
- \[ B = U + T (S_1 - S_u) - p (V_1 - V_u)\]
- \end{document}
-\end{lstcode}
- \begin{XmpTopPage}
- \XmpHeading[\itshape\bfseries with lines\hfill 1. Thermodynamics]{20,27}{70}
- \thicklines\XmpRule{20,29}{70}
- \XmpSetText[\setlength{\parfillskip}{0pt plus 1fil}%
- The portion of an energy not convertible in exergy
- is named anergy $B$.
- \[ B = U + T (S_1 - S_u) - p (V_1 - V_u)\] ]{20,20}
- \end{XmpTopPage}
-\end{Example}
-\EndIndexGroup
-
-
-\subsection{Managing Page Styles}\label{sec:scrpage-en.UI.cfgFile}
-% scrpage.cfg
-\BeginIndex{File}{scrpage.cfg}
-Before long the work with different page styles will establish a
-common set of employed page styles, depending on taste and tasks. In
-order to make the management of page styles easier and avoid
-time-consuming copy operations each time a new project is started,
-\Package{scrpage2} reads the file \File{scrpage.cfg} after
-initialisation. This file can contain a set of user-defined page
-styles which many projects can share.
-\EndIndex{File}{scrpage.cfg}
-\EndIndexGroup
-
-
-% ============================================================================
-
-\cleardoubleoddpage
-
-\selectlanguage{ngerman}
-\let\savednewcommand\newcommand
-\let\newcommand\renewcommand
-\input{\jobname-ngerman.tex}
-\let\newcommand\savednewcommand
-\def\theHchapter{D.\thechapter}
-\setcounter{chapter}{0}
-\renewcommand*{\thepage}{D.\arabic{page}}
-
-\phantomsection
-\addparttocentry{}{Deutsch}
-
-\title{Das obsolete Paket \Package{scrpage2}}
-\subtitle{Auszug aus früheren Versionen der \KOMAScript-Anleitung}
-\author{Markus Kohm\and Jens-Uwe-Morawski}
-\date{2014-06-25}
-\maketitle
-
-
-\chapter{Kopf- und Fußzeilen mit \Package{scrpage2}}
-\labelbase{scrpage-de}
-%
-\BeginIndexGroup
-\BeginIndex{Package}{scrpage2}%
-\BeginIndex{}{Seitenstil}
-Mit \KOMAScript~3.12 wurde das komplett neu implementierte Paket
-\Package{scrlayer-scrpage} vorgestellt, das eine konsequente Weiterführung des
-Designs von \Package{scrpage2} mit anderen Mitteln darstellt. Siehe dazu das
-entsprechende Kapitel der \KOMAScript-Anleitung. Während
-\Package{scrpage2} die erweiterte Optionen-Schnittstelle der
-\KOMAScript-Klassen nicht unterstützt, kommt diese in
-\Package{scrlayer-scrpage} selbstverständlich zum Einsatz. Da der Ansatz von
-\Package{scrlayer-scrpage} gegenüber \Package{scrpage2} als überlegen
-betrachtet wird, wird somit empfohlen, \Package{scrlayer-scrpage} an Stelle
-von \Package{scrpage2} zu verwenden. Die aktuelle Version von
-\Package{scrpage2} ist daher auch als final zu betrachten. Sämtliche
-Entwicklungsresourcen im Bereich Kopf- und Fußzeilen werden zukünftig in
-\Package{scrlayer-scrpage} einfließen.
-
-\begin{Explain}
- An Stelle von \Package{scrpage2} oder \Package{scrlayer-scrpage} kann
- natürlich auch \Package{fancyhdr} verwendet
- werden. \Package{scrpage2} und insbesondere \Package{scrlayer-scrpage}
- harmonieren jedoch mit den \KOMAScript-Klassen deutlich besser. Genau
- deshalb und weil der Vorläufer von \Package{fancyhdr} damals viele
- Möglichkeiten vermissen lies, ist \Package{scrpage2} entstanden. Natürlich
- ist das Paket \Package{scrpage2} ebenso wie das Paket
- \Package{scrlayer-scrpage} nicht an eine \KOMAScript-Klasse gebunden,
- sondern kann auch sehr gut mit anderen Klassen verwendet werden.
-\end{Explain}
-
-\section{Grundlegende Funktionen}\label{sec:scrpage-de.basics}
-
-\begin{Explain}
- Um die nachfolgende Beschreibung zu verstehen, muss noch einiges zu \LaTeX{}
- gesagt werden. Im \LaTeX-Kern sind die Standardseitenstile
- \PageStyle{empty}, welcher eine völlig undekorierte Seite erzeugt, und
- \PageStyle{plain}, welcher meist nur die Seitenzahl enthält, definiert. In
- vielen Klassen ist der Stil \PageStyle{headings} zu finden, welcher eine
- komplexe Seitendekoration mit automatischen
- Kolumnentitel\Index{Kolumnentitel>automatisch} erzeugt. Die Variante
- \PageStyle{myheadings} gleicht \PageStyle{headings}. Die Kolumnentitel
- müssen dabei aber manuell\Index{Kolumnentitel>manuell} gesetzt werden.
- Ausführlicher wird das im Abschnitt über Seitenstile der
- \KOMAScript-Anleitung beschrieben. Dort wird auch erläutert, dass auf
- einigen Seiten der Seitenstil automatisch -- in der Regel zu
- \PageStyle{plain} -- wechselt.
-\end{Explain}
-
-Das Paket \Package{scrpage2} unterscheidet nicht mehr zwischen Seitenstilen
-mit automatischem und mit manuellem Kolumnentitel. Die Wahl des Seitenstils
-erfolgt unabhängig davon, ob mit automatischem oder manuellem Kolumnentitel
-gearbeitet wird. Näheres dazu finden Sie in \autoref{sec:scrpage-de.basics.mark}.
-
-
-\subsection{Vordefinierte Seitenstile}\label{sec:scrpage-de.basics.buildIn}
-
-Zu den grundlegenden Funktionen von \Package{scrpage2} gehören unter anderem
-vordefinierte, konfigurierbare Seitenstile.
-
-% \lehead ...
-% scrheadings
-% \headmark \pagemark
-
-\begin{Declaration}
- \PageStyle{scrheadings}%
- \PageStyle{scrplain}
-\end{Declaration}%
-Das Paket \Package{scrpage2} liefert für Seiten mit Kolumnentitel einen
-eigenen Seitenstil namens \PageStyle{scrheadings}. Dieser Seitenstil kann
-mittels \Macro{pagestyle}\PParameter{scrheadings} aktiviert werden. Wird
-dieser Seitenstil benutzt, dann wird gleichzeitig der plain-Stil durch den
-dazu passenden Stil \PageStyle{scrplain} ersetzt. Passend bedeutet, dass auch
-der plain-Stil auf in \autoref{sec:scrpage-de.basics.format} vorgestellte
-Befehle, die beispielsweise die Kopfbreite ändern, reagiert und im Grundlayout
-übereinstimmt. Die Aktivierung des Seitenstils \PageStyle{scrheadings} oder
-des zugehörigen plain-Stils, \PageStyle{scrplain}, hat keine Auswirkung
-darauf, ob mit manuellen oder automatischen
-Kolumnentiteln\Index{Kolumnentitel>automatisch}\Index{Kolumnentitel>manuell}
-gearbeitet wird (siehe \autoref{sec:scrpage-de.basics.mark}). Der Seitenstil
-\PageStyle{scrplain} kann auch direkt per \Macro{pagestyle} aktiviert werden.
-
-
-\begin{Declaration}
- \Macro{lehead}%
- \OParameter{scrplain-links-gerade}\Parameter{scrheadings-links-gerade}%
- \Macro{cehead}%
- \OParameter{scrplain-mittig-gerade}\Parameter{scrheadings-mittig-gerade}%
- \Macro{rehead}%
- \OParameter{scrplain-rechts-gerade}\Parameter{scrheadings-rechts-gerade}%
- \Macro{lefoot}%
- \OParameter{scrplain-links-gerade}\Parameter{scrheadings-links-gerade}%
- \Macro{cefoot}%
- \OParameter{scrplain-mittig-gerade}\Parameter{scrheadings-mittig-gerade}%
- \Macro{refoot}%
- \OParameter{scrplain-rechts-gerade}\Parameter{scrheadings-rechts-gerade}%
- \Macro{lohead}%
- \OParameter{scrplain-links-ungerade}\Parameter{scrheadings-links-ungerade}%
- \Macro{cohead}%
- \OParameter{scrplain-mittig-ungerade}\Parameter{scrheadings-mittig-ungerade}%
- \Macro{rohead}%
- \OParameter{scrplain-rechts-ungerade}\Parameter{scrheadings-rechts-ungerade}%
- \Macro{lofoot}%
- \OParameter{scrplain-links-ungerade}\Parameter{scrheadings-links-ungerade}%
- \Macro{cofoot}%
- \OParameter{scrplain-mittig-ungerade}\Parameter{scrheadings-mittig-ungerade}%
- \Macro{rofoot}%
- \OParameter{scrplain-rechts-ungerade}\Parameter{scrheadings-rechts-ungerade}%
- \Macro{ihead}%
- \OParameter{scrplain-innen}\Parameter{scrheadings-innen}%
- \Macro{chead}%
- \OParameter{scrplain-zentriert}\Parameter{scrheadings-zentriert}%
- \Macro{ohead}%
- \OParameter{scrplain-außen}\Parameter{scrheadings-außen}%
- \Macro{ifoot}%
- \OParameter{scrplain-innen}\Parameter{scrheadings-innen}%
- \Macro{cfoot}%
- \OParameter{scrplain-zentriert}\Parameter{scrheadings-zentriert}%
- \Macro{ofoot}%
- \OParameter{scrplain-außen}\Parameter{scrheadings-außen}
-\end{Declaration}%
-Die Seitenstile von \Package{scrpage2} sind so definiert, dass ihr Kopf und
-Fuß flexibel angepasst werden kann. Hierzu sind sowohl im Kopf als auch im Fuß
-drei Felder vorhanden, deren Inhalt modifiziert werden kann. Die Befehle
-zur Modifikation sind in \autoref{fig:scrpage-de.leheadetall} verdeutlicht. Die
-in der Mitte dargestellten Befehle modifizieren sowohl die Felder der linken
-als auch der rechten Seite. Alle Befehle haben sowohl ein optionales als auch
-ein obligatorisches Argument. Das optionale Argument bestimmt jeweils das
-durch den Befehl festgelegte Feld im plain-Seitenstil,
-\PageStyle{scrplain}. Das obligatorische Argument definiert das entsprechende
-Feld im Seitenstil \PageStyle{scrheadings}.
-
-\begin{figure}
-% \centering
- \setcapindent{0pt}%
- \begin{captionbeside}
- [Befehle zur Manipulation der \Package{scrpage2}-Seitenstile]%
- {\hspace{0pt plus 1ex}%
- Zuord\-nung der Befehle zur Manipulation der beiden Seiten\-stile
- \PageStyle{scrheadings} und \PageStyle{scrplain} zu den Feldern im
- Kopf und Fuß der Seiten}
- [l]
- \setlength{\unitlength}{.95mm}\begin{picture}(100,65)(0,8)\small
- \put(0,12){\dashbox{2}(40,56){linke Seite}}
- \put(60,12){\dashbox{2}(40,56){rechte Seite}}
- % Felder: oben links
- \put(1,63){\framebox(8,4){~}}
- \put(16,63){\framebox(8,4){~}}
- \put(31,63){\framebox(8,4){~}}
- % Felder: oben rechts
- \put(61,63){\framebox(8,4){~}}
- \put(76,63){\framebox(8,4){~}}
- \put(91,63){\framebox(8,4){~}}
- % Felder: unten links
- \put(1,13){\framebox(8,4){~}}
- \put(16,13){\framebox(8,4){~}}
- \put(31,13){\framebox(8,4){~}}
- % Felder: unten rechts
- \put(61,13){\framebox(8,4){~}}
- \put(76,13){\framebox(8,4){~}}
- \put(91,13){\framebox(8,4){~}}
- % die Befehle und Pfeile
- % für beidseitig
- %
- \put(50,65){\makebox(0,0){\DescRef{scrpage-de.cmd.ihead}}}
- \put(44,65){\vector(-1,0){4}}\put(56,65){\vector(1,0){4}}
- \put(50,58){\makebox(0,0){\DescRef{scrpage-de.cmd.chead}}}
- \put(44,58){\line(-1,0){24}}\put(56,58){\line(1,0){24}}
- \put(20,58){\vector(0,1){4}}\put(80,58){\vector(0,1){4}}
- \put(50,51){\makebox(0,0){\DescRef{scrpage-de.cmd.ohead}}}
- \put(44,51){\line(-1,0){40}}\put(56,51){\line(1,0){40}}
- \put(4,51){\vector(0,1){11}}\put(96,51){\vector(0,1){11}}
- %
- \put(50,15){\makebox(0,0){\DescRef{scrpage-de.cmd.ifoot}}}
- \put(56,15){\vector(1,0){4}}\put(44,15){\vector(-1,0){4}}
- \put(50,22){\makebox(0,0){\DescRef{scrpage-de.cmd.cfoot}}}
- \put(44,22){\line(-1,0){24}}\put(56,22){\line(1,0){24}}
- \put(20,22){\vector(0,-1){4}}\put(80,22){\vector(0,-1){4}}
- \put(50,29){\makebox(0,0){\DescRef{scrpage-de.cmd.ofoot}}}
- \put(44,29){\line(-1,0){40}}\put(56,29){\line(1,0){40}}
- \put(4,29){\vector(0,-1){11}}\put(96,29){\vector(0,-1){11}}
- % Befehle für einseitig
- \put(5,69){\makebox(0,0)[b]{\DescRef{scrpage-de.cmd.lehead}}}
- \put(20,69){\makebox(0,0)[b]{\DescRef{scrpage-de.cmd.cehead}}}
- \put(35,69){\makebox(0,0)[b]{\DescRef{scrpage-de.cmd.rehead}}}
- %
- \put(65,69){\makebox(0,0)[b]{\DescRef{scrpage-de.cmd.lohead}}}
- \put(80,69){\makebox(0,0)[b]{\DescRef{scrpage-de.cmd.cohead}}}
- \put(95,69){\makebox(0,0)[b]{\DescRef{scrpage-de.cmd.rohead}}}
- %
- \put(5,11){\makebox(0,0)[t]{\DescRef{scrpage-de.cmd.lefoot}}}
- \put(20,11){\makebox(0,0)[t]{\DescRef{scrpage-de.cmd.cefoot}}}
- \put(35,11){\makebox(0,0)[t]{\DescRef{scrpage-de.cmd.refoot}}}
- %
- \put(65,11){\makebox(0,0)[t]{\DescRef{scrpage-de.cmd.lofoot}}}
- \put(80,11){\makebox(0,0)[t]{\DescRef{scrpage-de.cmd.cofoot}}}
- \put(95,11){\makebox(0,0)[t]{\DescRef{scrpage-de.cmd.rofoot}}}
- \end{picture}
- \end{captionbeside}
-% \caption[Befehle zur Manipulation der \Package{scrpage2}-Seitenstile]%
-% {Zuordnung der Befehle zur Manipulation der Seitenstile
-% \PageStyle{scrheadings} und \PageStyle{scrplain} zu den manipulierten
-% Seitenelementen}
- \label{fig:scrpage-de.leheadetall}
-\end{figure}
-
-\begin{Example}
- Angenommen, man möchte bei \PageStyle{scrheadings} zentriert im Seitenfuß
- die Seitenzahl dargestellt haben, dann benutzt man einfach:
-\begin{lstcode}
- \cfoot{\pagemark}
-\end{lstcode}
- Sollen die Seitenzahlen\Index{Paginierung} im Kopf außen und die
- Kolumnentitel\Index{Kolumnentitel} innen stehen, dann erfolgt dies mit:
-\begin{lstcode}
- \ohead{\pagemark}
- \ihead{\headmark}
- \cfoot{}
-\end{lstcode}
- Das \Macro{cfoot}\PParameter{} ist nur notwendig, um eine möglicherweise in
- der Mitte des Fußes vorhandene Seitenzahl zu entfernen.
-\end{Example}
-
-Die Befehle, die direkt nur einem Feld zugeordnet sind, können für
-anspruchsvollere Vorhaben genutzt werden.
-
-\begin{Example}
- Angenommen, man hat den Auf"|trag, einen Jahresbericht einer Firma zu
- erstellen, dann könnte das so angegangen werden:
-\begin{lstcode}
- \ohead{\pagemark}
- \rehead{Jahresbericht 2001}
- \lohead{\headmark}
- \cefoot{Firma WasWeißIch}
- \cofoot{Abteilung Entwicklung}
-\end{lstcode}
- Natürlich muss man hier dafür sorgen, dass mittels \Macro{cofoot} der Fuß
- der rechten Seite aktualisiert wird, wenn eine neue Abteilung im Bericht
- besprochen wird.
-\end{Example}
-
-Wie oben dargestellt, gibt es einen zu \PageStyle{scrheadings}
-korrespondierenden plain-Seitenstil. Da es auch möglich sein soll, diesen
-Stil anzupassen, unterstüt"-zen die Befehle ein optionales Argument. Damit
-kann der Inhalt des entsprechenden Feldes im plain-Seitenstil modifiziert
-werden.
-
-\begin{Example}
- Um für die Nutzung von \PageStyle{scrheadings} die Position der Seitenzahlen
- festzulegen, kann man folgendes benutzen:
-\begin{lstcode}
- \cfoot[\pagemark]{}
- \ohead[]{\pagemark}
-\end{lstcode}
- Wird anschließend der Stil \PageStyle{plain} genutzt, beispielsweise weil
- \Macro{chapter} eine neue Seite beginnt und darauf umschaltet, dann steht
- die Seitenzahl zentriert im Seitenfuß.
-\end{Example}
-%
-\EndIndexGroup
-
-
-% Die folgende Deklaration und Erklaerung wurde eingefuegt von
-% mjk 2001-08-18
-\begin{Declaration}
- \Macro{clearscrheadings}%
- \Macro{clearscrplain}%
- \Macro{clearscrheadfoot}
-\end{Declaration}%
-Will man sowohl den Seitenstil \PageStyle{scrheadings} als auch den dazu
-gehörenden plain-Seitenstil von Grund auf neu definieren,
-muss man häufig zusätzlich einige der bereits belegten Seitenelemente
-löschen. Da man selten alle Elemente mit neuem Inhalt füllt, sind
-dazu in den meisten Fällen mehrere Befehle mit leeren Parametern
-notwendig.
-Mit Hilfe dieser drei Befehle ist das Löschen schnell und
-gründlich möglich. Während \Macro{clearscrheadings} lediglich alle
-Felder des Seitenstils \PageStyle{scrheadings} und \Macro{clearscrplain}
-alle Felder des zugehörigen plain-Seitenstils löscht, werden
-von \Macro{clearscrheadfoot} alle Felder beider Seitenstile auf leere
-Inhalte gesetzt.
-\begin{Example}
- Sie wollen unabhängig davon, wie die Seitenstile derzeit aussehen,
- die Standardform der \KOMAScript-Klassen bei zweiseitigem Satz
- erreichen. Dies ist mit nur drei Befehlen möglich:
-\begin{lstcode}
- \clearscrheadfoot
- \ohead{\headmark}
- \ofoot[\pagemark]{\pagemark}
-\end{lstcode}
- Ohne die Befehle \Macro{clearscrheadings}, \Macro{clearscrplain} und
- \Macro{clearscrheadfoot} wären doppelt so viele Anweisungen und neun weitere
- leere Argumente notwendig:
-\begin{lstcode}
- \ihead[]{}
- \chead[]{}
- \ohead[]{\headmark}
- \ifoot[]{}
- \cfoot[]{}
- \ofoot[\pagemark]{\pagemark}
-\end{lstcode}
- Einige davon könnten natürlich entfallen, wenn man von einer
- konkreten Vorbelegung ausginge.
-\end{Example}
-%
-\EndIndexGroup
-%
-\EndIndexGroup
-
-
-% Satz leicht geaendert: mjk 2001-08-18
-In den vorausgehenden Beispielen wurden schon zwei Befehle benutzt, die noch
-gar nicht besprochen wurden. Das soll jetzt nachgeholt werden.
-
-% Die folgende Deklaration und Erklaerung wurde eingefuegt von
-% mjk 2001-08-17
-\begin{Declaration}
- \Macro{leftmark}%
- \Macro{rightmark}
-\end{Declaration}%
-Diese beiden Befehle erlauben es, auf die Kolumnentitel zuzugreifen, die
-normalerweise für die linke bzw. die rechte Seite gedacht sind. Diese beiden
-Befehle werden nicht von \Package{scrpage2}, sondern direkt vom \LaTeX-Kern
-zur Verfügung gestellt. Wenn in diesem Kapitel vom Kolumnentitel der linken
-Seite oder vom Kolumnentitel der rechten Seite die Rede ist, dann ist damit
-eigentlich der Inhalt von \Macro{leftmark} und \Macro{rightmark} gemeint.
-%
-\EndIndexGroup
-
-
-\begin{Declaration}
-\Macro{headmark}
-\end{Declaration}%
-Dieser Befehl ermöglicht es, auf die Inhalte der Kolumnentitel zuzugreifen.
-Im Gegensatz zu den originalen \LaTeX{}-Befehlen \Macro{leftmark} und
-\Macro{rightmark} braucht man nicht auf die richtige Zuordnung zur linken oder
-rechten Seite zu achten.%
-%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Macro{pagemark}
-\end{Declaration}%
-Dieser Befehl ermöglicht den Zugriff auf die Seitenzahl. Im
-\autoref{sec:scrpage-de.basics.format}, \DescPageRef{scrpage-de.cmd.pnumfont}
-wird der Befehl \DescRef{scrpage-de.cmd.pnumfont} zur Formatierung der Seitenzahl vorgestellt,
-den \Macro{pagemark} automatisch berücksichtigt.%
-%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \PageStyle{useheadings}
-\end{Declaration}%
-Das Paket \Package{scrpage2} ist in erster Linie dafür gedacht, dass die
-bereitgestellten Stile benutzt oder eigene Stile definiert werden. Jedoch
-kann es notwendig sein, auch auf einen von der Dokumentklasse zur Verfügung
-gestellten Stil zurückzuschalten. Es wäre nahe liegend, dieses mit
-\Macro{pagestyle}\PParameter{headings} vorzunehmen. Das hätte aber den
-Nachteil, dass die nachfolgend besprochenen Befehle \DescRef{scrpage-de.cmd.automark} und
-\DescRef{scrpage-de.cmd.manualmark} nicht wie erwartet funktionierten. Daher sollte mit
-\Macro{pagestyle}\PParameter{useheadings}\IndexCmd{pagestyle} auf die
-originalen Stile umgeschaltet werden. Eine solche Umschaltung hat dann keine
-Auswirkung darauf, ob mit manuellen oder automatischen Kolumnentiteln
-gearbeitet wird.%
-%
-\EndIndexGroup
-
-
-\subsection{Manuelle und automatische Kolumnentitel}
-\label{sec:scrpage-de.basics.mark}
-% \automark \manualmark
-%
-\BeginIndexGroup
-\BeginIndex{}{Kolumnentitel>automatisch}%
-\BeginIndex{}{Kolumnentitel>manuell}%
-Gewöhnlich\textnote{Achtung!} gibt es zu einem \PageStyle{headings}-Stil eine
-\emph{my}-Variante. Ist ein solcher Stil aktiv, dann werden die Kolumnentitel
-nicht mehr automatisch aktualisiert. Bei \Package{scrpage2} wird ein anderer
-Weg beschritten. Ob die Kolumnentitel lebend sind oder nicht, bestimmen die
-Befehle \DescRef{scrpage-de.cmd.automark} und \DescRef{scrpage-de.cmd.manualmark}. Die Voreinstellung kann auch
-bereits beim Laden des Paketes über die Optionen \DescRef{scrpage-de.option.automark} und
-\DescRef{scrpage-de.option.manualmark} beeinflusst werden (siehe
-\autoref{sec:scrpage-de.basics.options},
-\DescPageRef{scrpage-de.option.automark}).
-
-
-\begin{Declaration}
-\Macro{manualmark}
-\end{Declaration}%
-Wie der Name bereits verdeutlicht, schaltet \Macro{manualmark} die
-Aktualisierung der Kolumnentitel aus. Es bleibt somit dem Nutzer überlassen,
-für eine Aktualisierung bzw. für den Inhalt der Kolumnentitel zu sorgen. Dazu
-stehen die Befehle \Macro{markboth}\IndexCmd{markboth} und
-\Macro{markright}\IndexCmd{markright} aus dem \LaTeX-Kern bereit. Diese
-Anweisungen sind im Abschnitt über Seitenstile in der \KOMAScript-Anleitung
-erklärt.%
-%
-\EndIndexGroup
-
-
-% Ergaenzt mjk 2001-07-17
-\begin{Declaration}
- \Macro{automark}\OParameter{rechte Seite}\Parameter{linke Seite}
-\end{Declaration}%
-Die Anweisung \Macro{automark} aktiviert die automatische Aktualisierung des
-Kolumnentitels. Für die beiden Parameter sind die Bezeichnungen der
-Gliederungsebenen\Index{Gliederungsebenen} einzusetzen, deren Titel an
-entsprechender Stelle erscheinen soll. Gültige Werte für die Parameter sind:
-\PValue{part}\ChangedAt{v2.2}{\Package{scrpage2}}, \PValue{chapter},
-\PValue{section}, \PValue{subsection}, \PValue{subsubsection},
-\PValue{paragraph} und \PValue{subparagraph}. Der Wert \PValue{part} führt bei
-Verwendung der meisten Klassen nicht zu dem gewünschten Ergebnis. Bisher ist
-nur von den \KOMAScript-Klassen ab Version~2.9s bekannt, dass dieser Wert
-unterstützt wird. Das optionale Argument \PName{rechte Seite} ist
-ver\-ständlicherweise nur für zweiseitigen Satz gedacht. Im einseitigen Satz
-sollten Sie normalerweise darauf verzichten. Mit Hilfe der Option
-\DescRef{scrpage-de.option.autooneside}\IndexOption{autooneside}\important{\DescRef{scrpage-de.option.autooneside}}
-können Sie auch einstellen, dass das optionale Argument im
-einseitigen\Index{einseitig} Satz automatisch ignoriert wird (siehe
-\autoref{sec:scrpage-de.basics.options},
-\DescPageRef{scrpage-de.option.autooneside}).
-\begin{Example}
- Wird beispielsweise mit einer \emph{book}-Klasse gearbeitet, deren höch\-ste
- Gliederungsebene \emph{chapter} ist, dann stellt nach einem vorhergehenden
- \DescRef{scrpage-de.cmd.manualmark} der Befehl
-\begin{lstcode}
- \automark[section]{chapter}
-\end{lstcode}
- den Originalzustand wieder her. Bevorzugt man stattdessen, die tieferen
- Gliederungsebenen angezeigt zu bekommen, dann erfolgt dies mit:
-\begin{lstcode}
- \automark[subsection]{section}
-\end{lstcode}
-\end{Example}
-
-\begin{Explain}
- Die Markierung der jeweils höheren Gliederungsebene wird mit Hilfe von
- \Macro{markboth}\IndexCmd{markboth} gesetzt. Die Markierung der
- tieferen Gliederungsebene wird mit \Macro{markright}\IndexCmd{markright}
- bzw. \Macro{markleft}\IndexCmd{markleft} gesetzt. Der entsprechende Aufruf
- erfolgt indirekt über die Gliederungsbefehle. Die Anweisung \Macro{markleft}
- wird von \Package{scrpage2} bereitgestellt und ist vergleichbar zu
- \Macro{markright} aus dem \LaTeX-Kern
- definiert. Obwohl sie nicht als internes Makro definiert ist, wird von einem
- direkten Gebrauch abgeraten.
-\end{Explain}
-\EndIndexGroup
-\EndIndexGroup
-
-
-\subsection{Formatierung der Kopf- und Fußzeilen}
-\label{sec:scrpage-de.basics.format}
-% \headfont \pnumfont
-% \setheadwidth \setfootwidth
-% \set(head|foot)(top|sep|bot)line
-Im vorherigen Abschnitt ging es hauptsächlich um inhaltliche Dinge. Das
-genügt natürlich nicht, um die gestalterischen Ambitionen zu
-befriedigen. Deshalb soll es sich in diesem Abschnitt ausschließlich darum
-drehen.
-
-\begin{Declaration}
- \Macro{headfont}%
- \Macro{footfont}%
- \Macro{pnumfont}
-\end{Declaration}%
-Die Schriftformatierung für den Seitenkopf und -fuß übernimmt der Befehl
-\Macro{headfont}, \Macro{footfont} die Abweichung davon für den Fuß und
-\Macro{pnumfont} wiederum die Abweichung davon für die Seitenzahl.
-\begin{Example}
- Um beispielsweise den Kopf in fetter, serifenloser Schrift und den Fuß in
- nicht fetter, serifenloser Schrift zu setzen und die Seitenzahl geneigt
- mit Serifen erscheinen zu lassen, nutzt man folgende Definitionen:
-\begin{lstcode}
- \renewcommand*{\headfont}{%
- \normalfont\sffamily\bfseries}
- \renewcommand*{\footfont}{%
- \normalfont\sffamily}
- \renewcommand*{\pnumfont}{%
- \normalfont\rmfamily\slshape}
-\end{lstcode}
-\end{Example}
-
-\BeginIndexGroup
-\BeginIndex{FontElement}{pagehead}%
-\BeginIndex{FontElement}{pagefoot}%
-\BeginIndex{FontElement}{pagenumber}%
-Ab Version 2.8p der \KOMAScript{}-Klassen wurde die Schnittstelle für
-Schriftattribute vereinheitlicht. Wird \Package{scrpage2} in Verbindung mit
-einer dieser Klassen verwendet, dann sollte die Zuweisung in der Art erfolgen,
-wie sie in der \KOMAScript-Anleitung beschrieben wird.
-\begin{Example}
- Statt \Macro{renewcommand} wird bei Verwendung einer \KOMAScript-Klasse
- vorzugsweise der Befehl \Macro{setkomafont} verwendet. Die vorhergehenden
- Definitionen lauten damit:
-\begin{lstcode}
- \setkomafont{pagehead}{%
- \normalfont\sffamily\bfseries}
- \setkomafont{pagefoot}{%
- \normalfont\sffamily}
- \setkomafont{pagenumber}{%
- \normalfont\rmfamily\slshape}
-\end{lstcode}
-\end{Example}
-\EndIndexGroup
-\EndIndexGroup
-
-
-\begin{Declaration}
-\Macro{setheadwidth}\OParameter{Verschiebung}\Parameter{Breite}%
-\Macro{setfootwidth}\OParameter{Verschiebung}\Parameter{Breite}
-\end{Declaration}%
-Normalerweise entsprechen die Breiten von Kopf- und Fußzeile der Breite des
-Textbereichs.\Index{Kopf>Breite}\Index{Fuss=Fuß>Breite} Die beiden Befehle
-\Macro{setheadwidth} und \Macro{setfootwidth} ermöglichen dem Anwender, auf
-einfache Weise die Breiten seinen Bedürfnissen anzupassen. Das obligatorische
-Argument \PName{Breite} nimmt den Wert der Breite des Kopfes bzw. des Fußes
-auf, \PName{Verschiebung} ist ein Längenmaß für die Verschiebung des
-entsprechenden Elements in Richtung des äußeren Seitenrandes.
-
-Für die möglichen Standardfälle akzeptiert das obligatorische Argument
-\PName{Breite} auch folgende symbolische Werte:
-\begin{labeling}[\ --]{\PValue{textwithmarginpar}}
-\item[\PValue{paper}] die Breite des Papiers
-\item[\PValue{page}] die Breite der Seite
-\item[\PValue{text}] die Breite des Textbereichs
-\item[\PValue{textwithmarginpar}] die Breite des Textbereichs inklusive
-Seitenrand
-\item[\PValue{head}] die aktuelle Breite des Seitenkopfes
-\item[\PValue{foot}] die aktuelle Breite des Seitenfußes
-\end{labeling}
-Der Unterschied zwischen \PValue{paper} und \PValue{page} besteht darin, dass
-\PValue{page} die Breite des Papiers abzüglich der Bindekorrektur ist, falls
-das \Package{typearea}-Paket\IndexPackage{typearea} verwendet wird (siehe das
-Kapitel über \Package{typearea} in der \KOMAScript-Anleitung). Ohne Verwendung
-von \Package{typearea} sind \PValue{paper} und \PValue{page}
-identisch.%mjk-2001-08-17
-
-\begin{Example}
- Angenommen, man möchte ein Seitenlayout wie im
- \emph{\LaTeX-Begleiter}, bei dem die Kopfzeile in den Rand ragt,
- dann geschieht das ganz einfach mit:
-\begin{lstcode}
- \setheadwidth[0pt]{textwithmarginpar}
-\end{lstcode}
-%
- und sieht dann auf einer rechten Seite folgendermaßen aus:
-%
- \begin{XmpTopPage}
- \XmpHeading{10,29}{85}
- \thinlines\XmpRule{10,27}{85}
- \XmpSetText[\XmpTopText]{10,24}
- \XmpMarginNote{83,14}
- \end{XmpTopPage}
-%
- Soll der Seitenfuß die gleiche Breite und Ausrichtung haben, dann hat man
- jetzt zwei Wege. Der erste ist, man wiederholt das Gleiche für den
- Seitenfuß mit:
-\begin{lstcode}
- \setfootwidth[0pt]{textwithmarginpar}
-\end{lstcode}
-%
- oder man greift auf den anderen symbolischen Wert \PValue{head} zurück, da
- der Kopf bereits die gewünschte Breite hat.
-\begin{lstcode}
- \setfootwidth[0pt]{head}
-\end{lstcode}
-\end{Example}
-
-Wird keine Verschiebung angegeben, das heißt auf das optionale Argument
-verzichtet, dann erscheint der Kopf bzw. der Fuß symmetrisch auf der Seite
-angeordnet. Es wird somit ein Wert für die Verschiebung automatisch ermittelt,
-der der aktuellen Seitengestalt entspricht.
-
-\begin{Example}
- Entsprechend dem vorherigen Beispiel wird hier auf das optionale Argument
- verzichtet:
-\begin{lstcode}
- \setheadwidth{textwithmarginpar}
-\end{lstcode}
-%
- und sieht dann auf einer rechten Seite folgendermaßen aus:
-%
- \begin{XmpTopPage}
- \XmpHeading{5,29}{85}
- \thinlines\XmpRule{5,27}{85}
- \XmpSetText[\XmpTopText]{10,24}
- \XmpMarginNote{83,14}
- \end{XmpTopPage}
-\end{Example}
-
-Wie zu sehen, ist der Kopf jetzt nach innen verschoben, wobei die Kopfbreite
-sich nicht geändert hat. Die Verschiebung ist so berechnet, dass die
-Seitenproportionen auch hier sichtbar werden.
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Macro{setheadtopline}\OParameter{Länge}\Parameter{Dicke}%
- \OParameter{Anweisungen}%
- \Macro{setheadsepline}\OParameter{Länge}\Parameter{Dicke}%
- \OParameter{Anweisungen}%
- \Macro{setfootsepline}\OParameter{Länge}\Parameter{Dicke}%
- \OParameter{Anweisungen}%
- \Macro{setfootbotline}\OParameter{Länge}\Parameter{Dicke}%
- \OParameter{Anweisungen}
-\end{Declaration}%
-Entsprechend den Größenparametern für die Kopf- und Fußzeile gibt es auch
-Befehle, die die Dimensionen der Linien im Kopf und Fuß modifizieren
-können. Dazu sollten diese Linien aber zunächst erst einmal eingeschaltet
-werden. Siehe hierzu die Optionen \DescRef{scrpage-de.option.headtopline}, \DescRef{scrpage-de.option.headsepline},
-\DescRef{scrpage-de.option.footsepline}, \DescRef{scrpage-de.option.footbotline} in
-\autoref{sec:scrpage-de.basics.options},
-\DescPageRef{scrpage-de.option.headsepline}.
-
-\begin{labeling}[\ --]{\Macro{setfootsepline}}
-\item[\Macro{setheadtopline}] modifiziert die Parameter für die Linie
-über dem Seitenkopf
-\item[\Macro{setheadsepline}] modifiziert die Parameter für die Linie
-zwischen Kopf und Textkörper
-\item[\Macro{setfootsepline}] modifiziert die Parameter für die Linie
-zwischen Text und Fuß
-\item[\Macro{setfootbotline}] modifiziert die Parameter für die Linie
-unter dem Seitenfuß
-\end{labeling}
-
-Das obligatorische Argument \PName{Dicke} bestimmt, wie stark die Linie
-gezeichnet wird. Das optionale Argument \PName{Länge} akzeptiert die gleichen
-symbolischen Werte wie \PName{Breite} bei \DescRef{scrpage-de.cmd.setheadwidth}, also auch einen
-normalen Längenausdruck. Solange im Dokument dem optionalen Argument
-\PName{Länge} kein Wert zugewiesen wurde, passt sich die entsprechende
-Linienlänge automatisch der Breite des Kopfes bzw. des Fußes an.
-
-Möchte man diesen Automatismus für die Länge einer Linie wieder restaurieren,
-dann nutzt man im Längenargument den Wert \PValue{auto}.
-
-Mit\ChangedAt{v2.2}{\Package{scrpage2}} dem optionalen Argument
-\PName{Anweisungen} können zusätzliche Anweisungen definiert werden, die vor
-dem Zeichnen der jeweiligen Linie auszuführen sind. Das können beispielsweise
-Anweisungen sein, um die
-Farbe\Index{Kopf>Farbe}\Index{Fuss=Fuß>Farbe}\Index{Farbe>im
- Kopf}\Index{Farbe>im Fuss=im Fuß} der Linie zu ändern. Bei Verwendung einer
-\KOMAScript-Klasse können diese Anweisungen auch über
-\Macro{setkomafont}\IndexCmd{setkomafont} für eines der Elemente
-\FontElement{headtopline}\IndexFontElement[indexmain]{headtopline}%
-\important[i]{\FontElement{headtopline}\\
- \FontElement{headsepline}\\
- \FontElement{footsepline}\\
- \FontElement{footbottomline}},
-\FontElement{headsepline}\IndexFontElement[indexmain]{headsepline},
-\FontElement{footsepline}\IndexFontElement[indexmain]{footsepline},
-\FontElement{footbottomline}\IndexFontElement[indexmain]{footbottomline} oder
-auch \FontElement{footbotline}\IndexFontElement[indexmain]{footbotline}
-gesetzt und mit \Macro{addtokomafont}\IndexCmd{addtokomafont} erweitert
-werden. Die beiden Anweisungen \Macro{setkomafont} und \Macro{addtokomafont}
-sind in der \KOMAScript-Anleitung näher beschrieben.
-
-
-\begin{Declaration}
- \labelsuffix[auto+current]%
- \Macro{setheadtopline}\POParameter{auto}
- \PParameter{current}%
- \labelsuffix[auto]
- \Macro{setheadtopline}\POParameter{auto}\Parameter{}%
- \labelsuffix[auto+]
- \Macro{setheadtopline}\POParameter{auto}\Parameter{}\OParameter{}
-\end{Declaration}%
-Die hier am Befehl \DescRef{scrpage-de.cmd.setheadtopline} illustrierten Argumente
-sind natürlich auch für die anderen drei Längenbefehle gültig.
-
-Enthält das obligatorische Argument den Wert \PValue{current} oder wird
-leer gelassen, dann wird die Dicke der Linie nicht verändert. Das kann
-genutzt werden, wenn die Länge der Linie, aber nicht die Dicke modifiziert
-werden soll.
-
-Wird das optionale Argument \PName{Anweisungen} weggelassen, so bleiben
-eventuell zuvor gesetzte Anweisungen erhalten. Wird hingegen ein leeres
-Argument \PName{Anweisungen} gesetzt, so werden eventuell zuvor gesetzte
-Anweisungen wieder gelöscht.
-
-\begin{Example}
- Soll beispielsweise der Kopf mit einer kräftigen Linie von 2\,pt darüber und
- einer normalen von 0,4\,pt zwischen Kopf und Text abgesetzt werden, dann
- erfolgt das mit:
-\begin{lstcode}
- \setheadtopline{2pt}
- \setheadsepline{.4pt}
-\end{lstcode}
-Zusätzlich\textnote{Achtung!} sind unbedingt die Optionen
-\DescRef{scrpage-de.option.headtopline} und \DescRef{scrpage-de.option.headsepline} vorzugsweise global im
-optionalen Argument von \Macro{documentclass} zu setzen. Das Ergebnis könnte
-dann wie folgt aussehen.
-%
- \begin{XmpTopPage}
- \XmpHeading{10,29}{70}
- \thinlines\XmpRule{10,27}{70}
- \thicklines\XmpRule{10,32}{70}
- \XmpSetText[\XmpTopText]{10,24}
- \XmpMarginNote{83,14}
- \end{XmpTopPage}
-
- Sollen diese Linien zusätzlich in roter Farbe gesetzt werden, dann sind die
- Anweisungen beispielsweise wie folgt zu ändern:
-\begin{lstcode}
- \setheadtopline{2pt}[\color{red}]
- \setheadsepline{.4pt}[\color{red}]
-\end{lstcode}
- In diesem und auch dem folgenden Beispiel wurde für die Aktivierung der
- Farbe die Syntax des \Package{color}\IndexPackage{color}-Pakets verwendet,
- das dann natürlich auch geladen werden muss. \Package{scrpage2} selbst
- bietet keine direkte Farbunterstützung. Damit ist jedes beliebige
- Farbunterstützungspaket verwendbar.
-
- Mit einer \KOMAScript-Klasse kann alternativ
-\begin{lstcode}
- \setheadtopline{2pt}
- \setheadsepline{.4pt}
- \setkomafont{headtopline}{\color{red}}
- \setkomafont{headsepline}{\color{red}}
-\end{lstcode}
- verwendet werden.
-
- Die automatische Anpassung an die Kopf- und Fußbreiten illustriert folgendes
- Beispiel, für das die Optionen \DescRef{scrpage-de.option.footbotline} und \DescRef{scrpage-de.option.footsepline}
- gesetzt sein sollten:
-\begin{lstcode}
- \setfootbotline{2pt}
- \setfootsepline[text]{.4pt}
- \setfootwidth[0pt]{textwithmarginpar}
-\end{lstcode}
-
-%\phantomsection für hyperref-\pageref-Link jum-2001/11/24
- \phantomsection\label{page:scrpage-de.autoLineLength}%
- \begin{XmpBotPage}
- \XmpHeading{10,18}{85}
- \thinlines\XmpRule{17,21}{70}
- \thicklines\XmpRule{10,16}{85}
- \XmpSetText[\XmpBotText]{10,36}
- \XmpMarginNote{83,26}
- \end{XmpBotPage}
-\end{Example}
-%
-Nun mag nicht jedem die Ausrichtung der Linie über der Fußzeile gefallen,
-sondern es wird in einem solchen Fall erwartet, dass sie wie der Kolumnentitel
-linksbündig zum Text ist. Diese Einstellung kann nur global in Form einer
-Paketoption erfolgen und wird im folgenden
-\autoref{sec:scrpage-de.basics.options} mit anderen Optionen beschrieben.%
-%
-\EndIndexGroup
-\EndIndexGroup
-
-
-\subsection{Optionen beim Laden des Paketes}
-\label{sec:scrpage-de.basics.options}
-
-Während bei den \KOMAScript-Klassen die Mehrzahl der Optionen auch noch nach
-dem Laden der Klasse mit \Macro{KOMAoptions} und \Macro{KOMAoption} geändert
-werden kann, trifft dies für das Paket \Package{scrpage2} \iffree{derzeit noch
-}{}nicht zu. Alle Optionen für dieses Paket müssen als globale Optionen, also
-im optionalen Argument von \Macro{documentclass}, oder als Paketoptionen, also
-im optionalen Argument von \Macro{usepackage}, angegeben werden.
-
-% head(in|ex)clude foot(in|ex)clude --> typearea
-% headtopline headsepline footbotline footsepline (plain...)
-% komastyle standardstyle
-% markuppercase markusecase
-% automark manualmark
-\begin{Declaration}
- \Option{headinclude}%
- \Option{headexclude}%
- \Option{footinclude}%
- \Option{footexclude}
-\end{Declaration}%
-Diese\textnote{Achtung!} Optionen sollten bei Verwendung von
-\KOMAScript~3\ChangedAt{v2.3}{\Package{scrpage2}} nicht mehr beispielsweise
-per optionalem Argument von \Macro{usepackage} oder per
-\Macro{PassOptionsToPackage} direkt an \Package{scrpage2} übergeben
-werden. Lediglich aus Gründen der Kompatibilität sind sie noch in
-\Package{scrpage2} deklariert und werden von diesem als \Option{headinclude},
-\OptionValue{headinclude}{false}, \Option{footinclude} und
-\OptionValue{footinclude}{false} an das Paket \Package{typearea}
-weitergereicht.
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Option{headtopline}%
- \Option{plainheadtopline}%
- \Option{headsepline}%
- \Option{plainheadsepline}%
- \Option{footsepline}%
- \Option{plainfootsepline}%
- \Option{footbotline}%
- \Option{plainfootbotline}
-\end{Declaration}%
-Eine Grundeinstellung für die Linien unter und über den Kopf- und Fußzeilen
-kann mit diesen Optionen vorgenommen werden. Diese Einstellungen gelten dann
-als Standard für alle mit \Package{scrpage2} definierten Seitenstile. Wird
-eine von diesen Optionen verwendet, dann wird eine Linienstärke von 0,4\,pt
-eingesetzt. Da es zum Seitenstil \PageStyle{scrheadings} einen entsprechenden
-plain-Stil gibt, kann mit den \Option{plain\dots}-Optionen auch die
-entsprechende Linie des plain-Stils konfiguriert werden. Diese
-\Option{plain}-Optionen wirken aber nur, wenn auch die korrespondierende
-Option ohne \Option{plain} aktiviert wurde. Somit zeigt die Option
-\Option{plainheadtopline} ohne \Option{headtopline} keine Wirkung.
-
-Bei diesen Optionen ist zu beachten, dass der entsprechende Seitenteil in den
-Textbereich des Satzspiegels mit übernommen wird, wenn eine Linie aktiviert
-wurde. Wird also mittels \Option{headsepline} die Trennlinie zwischen Kopf
-und Text aktiviert, dann wird automatisch mittels \Package{typearea} der
-Satzspiegel so berechnet, dass der Seitenkopf Teil des Textblocks ist.
-
-Die\textnote{Achtung!} Bedingungen für die Optionen des vorhergehenden
-Abschnitts gelten auch für diesen Automatismus. Das bedeutet, dass das Paket
-\Package{typearea} nach \Package{scrpage2} geladen werden muss,
-beziehungsweise, dass bei Verwendung einer \KOMAScript{}-Klasse die Optionen
-\DescRef{scrpage-de.option.headinclude} und \DescRef{scrpage-de.option.footinclude} explizit bei
-\Macro{documentclass} gesetzt werden müssen, um Kopf- bzw. Fußzeile in den
-Textblock zu übernehmen.%
-%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Option{ilines}%
- \Option{clines}%
- \Option{olines}
-\end{Declaration}%
-\Index{Linienausrichtung}%
-Bei der Festlegung der Linienlängen kann es vorkommen, dass die Linie zwar die
-gewünschte Länge, aber nicht die erwünschte Ausrichtung hat, da sie im Kopf-
-bzw. Fußbereich zentriert wird. Mit den hier vorgestellten Paketoptionen kann
-global für alle mit \Package{scrpage2} definierten Seitenstile diese Vorgabe
-modifiziert werden. Dabei setzt \Option{ilines} die Ausrichtung so, dass die
-Linien an den inneren Rand verschoben werden. Die Option \Option{clines}
-verhält sich wie die Standardeinstellung und \Option{olines} richtet am
-äußeren Rand aus.
-
-\begin{Example}
- Hier gilt es, das Beispiel zu \DescRef{scrpage-de.cmd.setfootsepline} auf
- \autopageref{page:scrpage-de.autoLineLength} mit dem folgenden zu
- vergleichen, um die Wirkung der Option \Option{ilines} zu sehen.
-\begin{lstcode}
- \usepackage[ilines,footsepline,footbotline]
- {scrpage2}
- \setfootbotline{2pt}
- \setfootsepline[text]{.4pt}
- \setfootwidth[0pt]{textwithmarginpar}
-\end{lstcode}
-% Der folgende Text wurde erg"anzt um den Seitenumbruch zu verbessern,
-% mjk-2001-10-05:
-% \enlargethispage*{2\baselineskip}
- Allein die Verwendung der Option \Option{ilines} führt dabei zu der
- geänderten Ausgabe, die nachfolgend veranschaulicht wird:
-%
-\begin{XmpBotPage}
- \XmpHeading{10,18}{85}
- \thinlines\XmpRule{10,21}{70}
- \thicklines\XmpRule{10,16}{85}
- \XmpSetText[\XmpBotText]{10,36}
- \XmpMarginNote{83,26}
-\end{XmpBotPage}
- Die Trennlinie zwischen Text und Fuß wird bündig innen im Fußteil
- gesetzt und nicht wie bei der Standardeinstellung zentriert.
-\end{Example}
-\EndIndexGroup
-
-
-% \phantomsection für hyperref-\pageref-Link jum-2001/11/24
-\begin{Declaration}
- \Option{automark}%
- \Option{manualmark}
-\end{Declaration}%
-\BeginIndex{}{Kolumnentitel>automatisch}%
-\BeginIndex{}{Kolumnentitel>manuell}%
-Diese Optionen bestimmen gleich zu Beginn des Dokuments, ob eine automatische
-Aktualisierung der Kolumnentitel erfolgt. Die Option \Option{automark}
-schaltet die automatische Aktualisierung ein, \Option{manualmark} deaktiviert
-sie.
-% Das Folgende wurde ergaenzt, weil dazu die haeufigsten Fragen
-% bzw. falschen Bug-Reports im Support kamen.
-% mjk-2001-09-21:
-Ohne Verwendung einer der beiden Optionen bleibt die Einstellung
-erhalten, die beim Laden des Paketes gültig war.
-\begin{Example}
- Sie laden das Paket \Package{scrpage2} unmittelbar nach der Klasse
- \Class{scrreprt} und ohne weitere Optionen. Dazu schreiben Sie:
-\begin{lstcode}
- \documentclass{scrreprt}
- \usepackage{scrpage2}
-\end{lstcode}
- Da bei \Class{scrreprt} der Seitenstil \PageStyle{plain} voreingestellt
- ist, ist dies auch jetzt noch der Fall. Außerdem entspricht die
- Voreinstellung \PageStyle{plain} manuellen Kolumnentiteln. Wenn Sie
- also anschließend mit
-\begin{lstcode}
- \pagestyle{scrheadings}
-\end{lstcode}
- auf den Seitenstil \PageStyle{scrheadings} umschalten, sind noch immer
- manuelle Kolumnentitel eingestellt.
-
- Verwenden Sie stattdessen die Dokumentklasse \Class{scrbook}, so
- ist nach
-\begin{lstcode}
- \documentclass{scrbook}
- \usepackage{scrpage2}
-\end{lstcode}
- der Seitenstil \PageStyle{headings} mit automatischen Kolumnentiteln
- aktiviert. Bei anschließender Umschaltung auf den Seitenstil
- \PageStyle{scrheadings} bleiben automatische Kolumnentitel
- eingeschaltet. Dabei werden dann weiterhin die Markierungsmakros von
- \Class{scrbook} verwendet.
-
- Verwenden Sie hingegen
-\begin{lstcode}
- \usepackage[automark]{scrpage2}
-\end{lstcode}
- so wird unabhängig von der verwendeten Klasse auf automatische
- Kolumnentitel umgeschaltet, wobei die Markierungsmakros von
- \Package{scrpage2} genutzt werden.
- Natürlich wirkt sich dies auf den Seitenstil
- \PageStyle{plain} von \Class{scrreprt} nicht aus. Die Kolumnentitel
- werden erst sichtbar, wenn auf den Seitenstil
- \PageStyle{scrheadings}\IndexPagestyle{scrheadings} oder
- \PageStyle{useheadings} oder einen selbst definierten Seitenstil mit
- Kolumnentiteln umgeschaltet wird.
-\end{Example}
-\EndIndexGroup
-
-
-% Folgende Deklaration und Erklaerung wurde eingefügt von
-% mjk 2001-08-17:
-\begin{Declaration}
- \Option{autooneside}
-\end{Declaration}%
-\BeginIndex{}{Kolumnentitel>automatisch}%
-\BeginIndex{}{Kolumnentitel>manuell}%
-Mit dieser Option wird das optionale Argument von
-\DescRef{scrpage-de.cmd.automark}\IndexCmd{automark}\Index{Kolumnentitel>automatisch} im
-einseitigen Satz automatisch ignoriert. Siehe hierzu auch die Erläuterung
-zum Befehl \DescRef{scrpage-de.cmd.automark} in \autoref{sec:scrpage-de.basics.mark},
-\DescPageRef{scrpage-de.cmd.automark}.%
-%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Option{komastyle}%
- \Option{standardstyle}
-\end{Declaration}%
-Diese Optionen bestimmen, wie die beiden vordefinierten Seitenstile
-\PageStyle{scrheadings} und \PageStyle{scrplain} gestaltet sind.
-Bei \Option{komastyle} wird eine Definition vorgenommen, wie
-sie den \KOMAScript{}-Klassen entspricht.
-Bei den \KOMAScript{}-Klassen ist dies die Voreinstellung und
-kann somit auch für andere Klassen gesetzt werden.
-
-Die Option \Option{standardstyle} definiert die beiden Seitenstile
-wie es von den Standardklassen erwartet wird.
-Außerdem wird hier automatisch \DescRef{scrpage-de.option.markuppercase} aktiviert,
-es sei denn, \DescRef{scrpage-de.option.markusedcase} wird ebenfalls als Option übergeben.%
-\EndIndexGroup
-
-
-\begin{Declaration}
- \Option{markuppercase}%
- \Option{markusedcase}
-\end{Declaration}%
-Für die Funktionalität von \DescRef{scrpage-de.cmd.automark} modifiziert
-\Package{scrpage2} interne Befehle, die die Gliederungsbefehle
-benutzen, um die lebenden Kolumnentitel zu setzen.
-Da einige Klassen, im Gegensatz
-zu den \KOMAScript{}-Klassen, die Kolumnentitel in Großbuchstaben
-schreiben, muss \Package{scrpage2} wissen, wie die genutzte
-Dokumentklasse die lebenden Kolumnentitel darstellt.
-
-Die Option \Option{markuppercase} zeigt \Package{scrpage2}, dass die benutzte
-Klasse die Großschreibweise benutzt. Die Option \Option{markusedcase} sollte
-angegeben werden, wenn die benutzte Dokumentklasse keine Großschreibweise
-verwendet. Die\textnote{Achtung!} Optionen sind nicht geeignet, eine
-entsprechende Darstellung zu erzwingen. Es kann somit zu unerwünschten
-Effekten kommen, wenn die Angabe nicht dem Verhalten der Dokumentklasse
-entspricht.%
-\EndIndexGroup
-
-
-% Die folgende Deklaration und Erklaerung wurde eingefuegt von
-% mjk 2001-08-18
-\begin{Declaration}
- \Option{nouppercase}
-\end{Declaration}%
-Wie in obiger Erklärung zu \DescRef{scrpage-de.option.markuppercase} und \DescRef{scrpage-de.option.markusedcase}
-bereits ausgeführt wurde, gibt es Klassen und auch Pakete, die beim Setzen der
-lebenden Kolumnentitel\Index{Kolumnentitel>automatisch} mit Hilfe einer der
-Anweisungen \Macro{uppercase}\IndexCmd{uppercase}\important{\Macro{uppercase}}
-oder
-\Macro{MakeUppercase}\IndexCmd{MakeUppercase}\important{\Macro{MakeUppercase}}
-den gesamten Eintrag in Großbuchstaben wandeln. Mit der Option
-\Option{nouppercase} können diese beiden Anweisungen im Kopf und im Fuß außer
-Kraft gesetzt werden. Das gilt aber nur für Seitenstile, die mit Hilfe von
-\Package{scrpage2} definiert werden. Dazu zählen auch \PageStyle{scrheadings}
-und der zugehörige plain-Seitenstil.
-
-Die verwendete Methode ist äußerst brutal und kann dazu führen, dass
-auch erwünschte Änderungen von Klein- in
-Großbuchstaben\Index{Grossbuchstaben=Großbuchstaben} unterbleiben. Da
-diese Fälle nicht sehr häufig sind, stellt \Option{nouppercase} aber
-meist eine brauchbare Lösung dar.
-\begin{Example}
- Sie verwenden die Standardklasse \Class{book}\IndexClass{book},
- wollen aber, dass die lebenden Kolumnentitel nicht in
- Großbuchstaben, sondern in normaler gemischter Schreibweise gesetzt
- werden. Die Präambel Ihres Dokuments könnte dann wie folgt beginnen:
-\begin{lstcode}
- \documentclass{book}
- \usepackage[nouppercase]{scrpage2}
- \pagestyle{scrheadings}
-\end{lstcode}
- Die Umschaltung auf den Seitenstil \PageStyle{scrheadings} ist
- notwendig, weil sonst der Seitenstil \PageStyle{headings} verwendet
- wird, der von der Option \Option{nouppercase} nicht behandelt wird.
-\end{Example}
-
-In einigen Fällen setzen nicht nur Klassen, sondern auch Pakete
-lebende Kolumnentitel in Großbuchstaben. Auch in diesen Fällen hilft
-\Option{nouppercase} meist, um zu gemischter Schreibweise
-zurückzuschalten.%
-%
-\EndIndexGroup
-
-
-\section{Seitenstile selbst gestalten}\label{sec:scrpage-de.UI}
-%
-%
-\subsection{Die Anwenderschnittstelle}\label{sec:scrpage-de.UI.user}
-% \deftripstyle
-
-Nun möchte man ja nicht immer an die vorgegebenen Seitenstile gebunden sein,
-sondern auch seiner Kreativität freien Lauf lassen.
-Manchmal ist man auch dazu gezwungen, weil eine bestimmte
-\emph{Corporate Identity} einer Firma es verlangt.
-Der einfachste Weg damit umzugehen ist
-\begin{Declaration}
- \Macro{deftripstyle}\Parameter{Name}%
- \OParameter{LA}\OParameter{LI}%
- \Parameter{KI}\Parameter{KM}\Parameter{KA}%
- \Parameter{FI}\Parameter{FM}\Parameter{FA}
-\end{Declaration}%
-Die einzelnen Felder haben folgende Bedeutung:
-\begin{labeling}[~--]{\PName{Name}}
-\item[\PName{Name}] die Bezeichnung des Seitenstils, die dann bei der
- Aktivierung mit \Macro{pagestyle}\Parameter{Name} oder
- \Macro{thispagestyle}\Parameter{Name} verwendet wird
-\item[\PName{LA}] die Dicke der äußeren Linien, d.\,h. der Linien über der
- Kopfzeile und unter der Fußzeile (optional)
-\item[\PName{LI}] die Dicke der inneren Linie, d.\,h. der Linien die Kopf und
- Fuß vom Textkörper trennen (optional)
-\item[\PName{KI}] Inhalt des Feldes im Kopf innenseitig oder bei einseitigem
- Layout links
-\item[\PName{KM}] Inhalt des Feldes im Kopf zentriert
-\item[\PName{KA}] Inhalt des Feldes im Kopf außenseitig oder bei einseitigem
- Layout rechts
-\item[\PName{FI}] Inhalt des Feldes im Fuß innenseitig oder bei einseitigem
- Layout links
-\item[\PName{FM}] Inhalt des Feldes im Fuß zentriert
-\item[\PName{FA}] Inhalt des Feldes im Fuß außenseitig oder bei einseitigem
- Layout rechts
-\end{labeling}
-
-Der Befehl \Macro{deftripstyle} stellt sicherlich die einfachste
-Möglichkeit dar, Seitenstile zu definieren.
-Leider sind damit auch Einschränkungen verbunden,
-da in einem Seitenbereich mit einem durch \Macro{deftripstyle} deklarierten
-Seitenstil keine Änderung der Kopf- und Fußlinien erfolgen kann.
-
-\begin{Example}
- Vorgegeben sei ein doppelseitiges Layout, bei dem die Kolumnentitel innen
- erscheinen sollen. Weiterhin soll der Dokumenttitel, in diesem Fall kurz
- \glqq Bericht\grqq, an den Außenrand in den Kopf, die Seitenzahl soll
- zentriert in den Fuß.
-\begin{lstcode}
- \deftripstyle{DerBericht}%
- {\headmark}{}{Bericht}%
- {}{\pagemark}{}
-\end{lstcode}
-
- Sollen weiterhin die Linien über dem Kopf und unter dem Fuß
- mit 2\,pt erscheinen und der ganze Textkörper mit dünnen Linien
- von 0,4\,pt von Kopf und Fuß abgesetzt werden, dann erweitert
- man vorherige Definition.
-\begin{lstcode}
- \deftripstyle{DerBericht}[2pt][.4pt]%
- {\headmark}{}{Bericht}%
- {}{\pagemark}{}
-\end{lstcode}
- Das Ergebnis ist in \autoref{fig:scrpage-de2.tomuchlines} zu sehen.
-%
-\begin{figure}
- \typeout{^^J--- Ignore underfull and overfull \string\hbox:}%
- \setcapindent{0pt}%
- \begin{captionbeside}
- [{%
- Beispiel eines selbst definierten, von Linien dominierten Seitenstils%
- }]{%
- Beispiel für einen selbst definierten, von Linien dominierten Seitenstil
- mit einem statischen und einem lebenden Kolumnentitel im Kopf und der
- Seitenzahl in der Mitte des Fußes.%
- \label{fig:scrpage-de2.tomuchlines}%
- }
- [l]
- \iffree{\setlength{\unitlength}{1.15mm}}{\setlength{\unitlength}{1mm}}%
- \begin{picture}(85,51)\scriptsize
- \thinlines
- \put(0,0){\line(0,1){51}}
- \put(45,0){\line(0,1){51}}
- \put(0,51){\line(1,0){40}}
- \put(45,51){\line(1,0){40}}
- %
- \thicklines
- \put(40,0){\line(0,1){51}}
- \put(85,0){\line(0,1){51}}
- \put(0,0){\line(1,0){40}}
- \put(45,0){\line(1,0){40}}
- %
- \XmpHeading[Bericht\hfill 2 Das Auge]{6,47}{30}
- \XmpHeading[2.1 Netzhaut\hfill Bericht]{49,47}{30}
- \XmpHeading[\hfill 14\hfill]{6,6.5}{30}
- \XmpHeading[\hfill 15\hfill]{49,6.5}{30}
- \put(6,44){\makebox(0,0)[tl]{\parbox{30\unitlength}{\tiny%
- \textbf{2.1 Netzhaut}\\
- \XmpText[49]}}}
- \put(49,44){\makebox(0,0)[tl]{\parbox{30\unitlength}{\tiny%
- \XmpText[51]}}}
- %
- \thinlines
- \XmpRule{6,45.5}{30}\XmpRule{49,45.5}{30}
- \XmpRule{6,8}{30}\XmpRule{49,8}{30}
- \linethickness{1pt}
- \XmpRule{6,49}{30}\XmpRule{49,49}{30}
- \XmpRule{6,5}{30}\XmpRule{49,5}{30}
- \end{picture}
- \end{captionbeside}
- \typeout{^^J--- Don't ignore underfull and overfull \string\hbox:^^J}%
-\end{figure}
-\end{Example}
-\EndIndexGroup
-
-
-\subsection{Die Expertenschnittstelle}\label{sec:scrpage-de.UI.expert}
-% \defpagestyle \newpagestyle \providepagestyle \renewpagestyle
-Einfache Seitenstile, wie sie mit \DescRef{scrpage-de.cmd.deftripstyle} deklariert
-werden können, sind erfahrungsgemäß selten.
-Entweder verlangt ein Professor, dass die Diplomarbeit so aussieht
-wie seine eigene -- und wer will ihm da \emph{ernsthaft} widersprechen --
-oder eine Firma möchte, dass die halbe Finanzbuchhaltung im
-Seitenfuß auf"|taucht. Alles kein Problem, denn es gibt noch:
-\begin{Declaration}
- \Macro{defpagestyle}\Parameter{Name}\Parameter{Kopfdefinition}\Parameter{Fußdefinition}%
- \Macro{newpagestyle}\Parameter{Name}\Parameter{Kopfdefinition}\Parameter{Fußdefinition}%
- \Macro{renewpagestyle}\Parameter{Name}\Parameter{Kopfdefinition}\Parameter{Fußdefinition}%
- \Macro{providepagestyle}\Parameter{Name}\Parameter{Kopfdefinition}\Parameter{Fußdefinition}
-\end{Declaration}%
-Dies sind die Befehle, die die volle Kontrolle über die Gestaltung
-eines Seitenstils ermöglichen. Der Aufbau ist bei allen vier
-Definitionen gleich, sie unterscheiden sich nur hinsichtlich
-der Wirkungsweise.
-\begin{labeling}[\ --]{\Macro{providepagestyle}}
-\item[\Macro{defpagestyle}] definiert einen neuen Seitenstil. Existiert
- bereits einer mit diesem Namen, wird dieser überschrieben.
-\item[\Macro{newpagestyle}] definiert einen neuen Seitenstil. Wenn schon einer
- mit diesem Namen existiert, wird ein Fehler ausgegeben.
-\item[\Macro{renewpagestyle}] definiert einen bestehenden Seitenstil um. Wenn
- noch keiner mit diesem Namen existiert, wird ein Fehler ausgegeben.
-\item[\Macro{providepagestyle}] definiert einen neuen Seitenstil nur dann,
- wenn dieser vorher noch nicht existiert.
-\end{labeling}
-
-Am Beispiel von \Macro{defpagestyle} soll die Syntax der Definitionen
-im Folgenden erläutert werden.
-\begin{labeling}[~--]{\PName{Kopfdefinition}\,}
-\item[\PName{Name}] die Bezeichnung des Seitenstils
-\item[\PName{Kopfdefinition}] die Deklaration des Seitenkopfes bestehend aus
- fünf Teilen, wobei die in runden Klammern stehenden Angaben optional
- sind:\hfill\\
- \hspace*{1em}\AParameter{OLL,OLD}%
- \Parameter{GS}\Parameter{US}\Parameter{ES}\AParameter{ULL,ULD}
-\item[\PName{Fußdefinition}] die Deklaration des Seitenfußes bestehend aus
- fünf Teilen, wobei die in runden Klammern stehenden Angaben optional
- sind:\hfill\\
- \hspace*{1em}\AParameter{OLL,OLD}%
- \Parameter{GS}\Parameter{US}\Parameter{ES}\AParameter{ULL,ULD}
-\end{labeling}
-
-Wie zu sehen ist, haben Kopf- und Fußdefinition identischen Aufbau. Die
-einzelnen Parameter haben folgende Bedeutung:
-\begin{labeling}[\ --]{\PName{OLD}}
-\item[\PName{OLL}] obere Linienlänge: Kopf = außen, Fuß = Trennlinie
-\item[\PName{OLD}] obere Liniendicke
-\item[\PName{GS}] Definition für die \emph{gerade} Seite
-\item[\PName{US}] Definition für die \emph{ungerade} Seite
-\item[\PName{ES}] Definition für \emph{einseitiges} Layout
-\item[\PName{ULL}] untere Linienlänge Kopf = Trennlinie, Fuß = außen
-\item[\PName{ULD}] untere Liniendicke
-\end{labeling}
-
-Werden die optionalen Linienargumente nicht gesetzt, dann bleibt das Verhalten
-weiterhin durch die in \autoref{sec:scrpage-de.basics.format},
-\DescPageRef{scrpage-de.cmd.setheadtopline} vorgestellten Linienbefehle
-konfigurierbar.
-
-Die drei Felder \PName{GS}, \PName{US} und \PName{ES} entsprechen Boxen, die
-die Breite des Kopf- bzw. Fußteils haben.
-Die entsprechenden Definitionen erscheinen in diesen Boxen linksbündig.
-Um somit etwas links- \emph{und} rechtsseitig in den Boxen zu platzieren,
-kann der Zwischenraum mit \Macro{hfill} gestreckt werden:
-%
-\begin{lstcode}[belowskip=\dp\strutbox]
- {\headmark\hfill\pagemark}
-\end{lstcode}
-
-Um zusätzlich etwas zentriert erscheinen zu lassen, ist eine erweiterte
-Definition notwendig.
-Die Befehle \Macro{rlap} und \Macro{llap} setzen die übergebenen Argumente.
-Für \LaTeX{} erscheint es aber so, dass diese Texte eine Breite von Null
-haben. Nur so erscheint der mittlere Text auch wirklich zentriert.
-%
-\begin{lstcode}
- {\rlap{\headmark}\hfill zentriert\hfill\llap{\pagemark}}
-\end{lstcode}
-
-\iffalse% Umbruchkorrekturtext
-Dies und die Verwendung der Expertenschnittstelle in Zusammenhang mit
-anderen Befehlen von \Package{scrpage2} nun als abschließendes Beispiel.
-\fi
-
-\begin{Example}
- Angenommen es wird die Dokumentklasse \Class{scrbook} genutzt. Damit
- liegt ein zweiseitiges Layout vor. Für das Paket \Package{scrpage2} wird
- festgelegt, dass mit automatisch aktualisierten Kolumnentiteln gearbeitet
- wird und dass im Seitenstil \PageStyle{scrheadings} eine Trennlinie zwischen
- Kopf und Text gezogen wird.
-
-\begin{lstcode}
- \documentclass{scrbook}
- \usepackage[automark,headsepline]{scrpage2}
-\end{lstcode}
-
- Mit Hilfe der Expertenschnittstelle werden zwei Seitenstile definiert. Der
- erste legt keine Linienargumente fest, im zweiten wird die Linie über dem
- Kopf mit einer Dicke von 1\,pt und die Linie unter dem Kopf mit 0\,pt
- festgelegt.
-
-\begin{lstcode}
- \defpagestyle{ohneLinien}{%
- {Beispiel\hfill\headmark}
- {\headmark\hfill ohne Linien}
- {\rlap{Beispiel}\hfill\headmark\hfill%
- \llap{ohne Linien}}
- }{%
- {\pagemark\hfill}
- {\hfill\pagemark}
- {\hfill\pagemark\hfill}
- }
- \defpagestyle{mitLinien}{%
- (\textwidth,1pt)
- {mit Linien\hfill\headmark}
- {\headmark\hfill mit Linien}
- {\rlap{\KOMAScript}\hfill \headmark\hfill%
- \llap{mit Linien}}
- (0pt,0pt)
- }{%
- (\textwidth,.4pt)
- {\pagemark\hfill}
- {\hfill\pagemark}
- {\hfill\pagemark\hfill}
- (\textwidth,1pt)
- }
-\end{lstcode}
-
- Gleich zu Beginn wird der Seitenstil \PageStyle{scrheadings} aktiviert. Mit
- \Macro{chapter} wird ein neues Kapitel begonnen. Weiterhin wird automatisch
- durch \Macro{chapter} der Seitenstil für diese Seite auf \PageStyle{plain}
- gesetzt. Das folgende \DescRef{scrpage-de.cmd.chead} zeigt, wie durch Modifikation des
- plain-Stils ein Kolumnentitel erzeugt werden kann. Grundsätzlich sollte
- jedoch davon Abstand genommen werden, da sonst der Markierungscharakter der
- plain-Seite verloren geht. Es ist wichtiger anzuzeigen, dass hier ein neues
- Kapitel beginnt, als dass ein Abschnitt dieser Seite einen bestimmten Titel
- trägt.
-
-\begin{lstcode}
- \begin{document}
- \pagestyle{scrheadings}
- \chapter{Thermodynamik}
- \chead[\leftmark]{}
- \section{Hauptsätze}
- Jedes System besitzt eine extensive Zustandsgröße
- Energie. Sie ist in einem abgeschlossenen System
- konstant.
-\end{lstcode}%
- \begin{XmpTopPage}
- \XmpHeading[\hfill\textsl{1 Thermodynamik}\hfill]{10,27}{70}
- \put(10,17){\normalsize\textbf{\sffamily 1 Thermodynamik}}
- \put(10,12){\textbf{\sffamily 1.1 Hauptsätze}}
- \XmpSetText[%
- Jedes System besitzt eine extensive Zustands\char\defaulthyphenchar
- \linebreak]{10,9}
- \end{XmpTopPage}
-
- Nach dem Seitenwechsel ist der Seitenstil \PageStyle{scrheadings}
- aktiv, und somit auch die Trennlinie aus den Paketoptionen sichtbar.
-\begin{lstcode}
- Es existiert eine Zustandsgröße, genannt die
- Entropie eines Systems, deren zeitliche Änderung
- sich aus Entropieströmung und Entropieerzeugung
- zusammensetzt.
-\end{lstcode}
- \begin{XmpTopPage}
- \XmpHeading[\textsl{1 Thermodynamik}\hfill]{20,27}{70}
- \thinlines\XmpRule{20,25}{70}
- \XmpSetText[%
- Es existiert eine Zustandsgröße, genannt die En"-tropie
- eines Systems, deren zeitliche Änderung sich aus
- Entropieströmung und Entropie\char\defaulthyphenchar\kern-1pt
- \linebreak]{20,21}
- \end{XmpTopPage}
-
- Wiederum nach einem Seitenwechsel wird auf manuelle Kolumnentitel gewechselt
- und der Seitenstil \PValue{ohneLinien} aktiviert. Da keine Linienargumente
- bei der Definition dieses Stils genutzt wurden, wird die
- Standard-Linien\-konfiguration verwendet. Diese zeichnet hier eine Linie
- zwischen Kopf und Text, da \DescRef{scrpage-de.option.headsepline} als Argument für
- \Package{scrpage2} angegeben wurde.%
-\begin{lstcode}
- \manualmark
- \pagestyle{ohneLinien}
- \section{Exergie und Anergie}
- \markright{Energieumwandlung}
- Man bezeichnet die bei der Einstellung des
- Gleichgewichts mit der Umgebung maximal gewinnbare
- Arbeit als Exergie.
-\end{lstcode}%
- \begin{XmpTopPage}
- \XmpHeading[\slshape Energieumwandlung\hfill ohne Linien]{10,27}{70}
- \thinlines\XmpRule{10,25}{70}
- \XmpSetText[{%
- \textbf{\sffamily 1.2 Exergie und Anergie}\\[2pt]
- Man bezeichnet die bei der Einstellung des
- Gleichgewichts mit der Umgebung maximal\linebreak}]{10,21}
- \end{XmpTopPage}
-
- Nach dem Wechsel auf die folgende linke Seite wird der Seitenstil
- \PValue{mitLinien} aktiviert. Die Linieneinstellungen werden hier nun
- angewendet und entsprechend der Definition dargestellt.
-\begin{lstcode}
- \pagestyle{mitLinien}
- \renewcommand{\headfont}{\itshape\bfseries}
- Den nicht in Exergie umwandelbaren Anteil einer
- Energie nennt man Anergie \Var{B}.
- \[ B = U + T (S_1 - S_u) - p (V_1 - V_u)\]
- \end{document}
-\end{lstcode}
- \begin{XmpTopPage}
- \XmpHeading[\itshape\bfseries mit Linien\hfill 1 Thermodynamik]{20,27}{70}
- \thicklines\XmpRule{20,29}{70}
- \XmpSetText[%
- Den nicht in Exergie umwandelbaren Anteil einer
- Energie nennt man Anergie $B$.
- \vspace{-.5ex}\[ B = U + T (S_1 - S_u) - p (V_1 - V_u)\] ]{20,21}
- \end{XmpTopPage}
-\end{Example}
-\EndIndexGroup
-
-
-\subsection{Seitenstile verwalten}\label{sec:scrpage-de.UI.cfgFile}
-% scrpage.cfg
-\BeginIndex{File}{scrpage.cfg}
-Bei längerer Arbeit mit verschiedenen Seitenstilen wird sich, je nach
-Geschmack und Aufgabenstellung, ein fester Satz an benutzten Stilen
-etablieren.
-Um nicht bei jedem neuen Projekt eine große Kopieraktion von den Daten
-eines Projekts zum neuen Projekt starten zu müssen, liest \Package{scrpage2}
-am Ende seiner Initialisierungsphase die Datei \File{scrpage.cfg} ein.
-In dieser Datei können dann Seitenstile definiert sein, die viele
-Projekte gemeinsam nutzen können.
-\EndIndex{File}{scrpage.cfg}
-%
-\EndIndexGroup
-
-\end{document}
-
-%%% Local Variables:
-%%% mode: latex
-%%% coding: utf-8
-%%% TeX-master: t
-%%% End:
diff --git a/Master/texmf-dist/source/latex/koma-script/scrextend.dtx b/Master/texmf-dist/source/latex/koma-script/scrextend.dtx
index 009e922244a..63718bf10e1 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrextend.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrextend.dtx
@@ -1,8 +1,8 @@
-% \CheckSum{75}
+% \CheckSum{74}
% \iffalse meta-comment
% ======================================================================
% scrextend.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +20,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrextend.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -55,7 +55,7 @@
% Right brace \} Tilde \~}
%
% \iffalse
-%%% From File: $Id: scrextend.dtx 3262 2019-10-10 08:25:29Z kohm $
+%%% From File: $Id: scrextend.dtx 3453 2020-02-25 07:33:30Z kohm $
%<preidentify>%%% (run: preidentify)
%<prepare>%%% (run: prepare)
%<option>%%% (run: option)
@@ -63,7 +63,7 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-10-10 10:25:29 +0200 (Thu, 10 Oct 2019) $
+ \filedate$Date: 2020-02-25 08:33:30 +0100 (Tue, 25 Feb 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
\filerevision$Revision: 1962 $
\endgroup
@@ -111,15 +111,17 @@
%<*preidentify>
% \fi
%
+% \changes{v3.30}{2020/02/25}{\cs{PackageWarningNoLine} statt
+% \cs{PackageWarning} mit angehängtem \cs{@gobble}}%^^A
% \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname KOMAClassName\endcsname\relax\else
- \PackageWarning{scrextend}{%
+ \PackageWarningNoLine{scrextend}{%
This package was made to extend other classes but\MessageBreak
KOMA-Script classes by some features of the\MessageBreak
KOMA-Script classes.\MessageBreak
It should never be used with a KOMA-Script class.\MessageBreak
- Loading of the package will be aborted\@gobble%
+ Loading of the package will be aborted%
}%
\expandafter\endinput
\fi
diff --git a/Master/texmf-dist/source/latex/koma-script/scrhack.dtx b/Master/texmf-dist/source/latex/koma-script/scrhack.dtx
index 4a8aedcecf3..49cf81ef4e5 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrhack.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrhack.dtx
@@ -1,8 +1,7 @@
-% \CheckSum{1855}
% \iffalse meta-comment
% ======================================================================
% scrhack.dtx
-% Copyright (c) Markus Kohm, 2008-2019
+% Copyright (c) Markus Kohm, 2008-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -23,7 +22,7 @@
% of TeX would generate the implementation documentation.
% ----------------------------------------------------------------------
% scrhack.dtx
-% Copyright (c) Markus Kohm, 2008-2019
+% Copyright (c) Markus Kohm, 2008-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -62,7 +61,7 @@
% Right brace \} Tilde \~}
%
% \iffalse
-%%% From File: $Id: scrhack.dtx 3392 2019-11-19 09:37:46Z kohm $
+%%% From File: $Id: scrhack.dtx 3508 2020-07-08 08:45:20Z kohm $
%<package&identify>%%% using: package,identify
%<package&option>%%% using: package,option
%<package&body>%%% using: package,body
@@ -71,7 +70,7 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-11-19 10:37:46 +0100 (Tue, 19 Nov 2019) $
+ \filedate$Date: 2020-07-08 10:45:20 +0200 (Wed, 08 Jul 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
\filerevision$Revision: 1962 $
\endgroup
@@ -861,6 +860,21 @@
}%
}%
}%
+% \end{macrocode}
+% \changes{v3.30}{2020/04/01}{setzen von \cs{@captype} ergänzt}%^^A
+% Ab Version~3.30 wird zusätzlich \cs{lst@makecaption} um das Setzen von
+% \cs{@captype} auf \texttt{lstlisting} ergänzt. Dadurch wird auch die
+% Verwendung von \cs{raggedlstlistingcaption} ermöglicht, falls dieses
+% definiert wird. Die Umdefinierung erfolgt in Form einer Erweiterung der
+% Definition aus \textsf{listings}. Das sollte so lange funktionieren, solange
+% die Anweisung in \textsf{listings} keine Argumente hat.
+% \begin{macrocode}
+ \expandafter\def\expandafter\lst@makecaption\expandafter{%
+ \expandafter\def\expandafter\@captype\expandafter{%
+ \expandafter l\expandafter s\expandafter t\expandafter l%
+ \expandafter i\expandafter s\expandafter t\expandafter i%
+ \expandafter n\expandafter g\expandafter}\lst@makecaption
+ }%
\let\scr@do@hack@listings\relax
}
\scr@ifexpected{\lstlistoflistings}{%
@@ -1016,6 +1030,7 @@
}{%
% \end{macrocode}
% \changes{v3.25}{2019/01/23}{emergency patch added}%^^A
+% \changes{v3.30}{2020/02/25}{spurious space in warning message removed}%^^A
% If this also does not work, we try an emergency patch, that could break
% things.
% \begin{macrocode}
@@ -1031,7 +1046,7 @@
release of package `nomencl'.\MessageBreak
Mostly this patch does work too, but it also could\MessageBreak
break `nomencl`. If this happens, please deactivate\MessageBreak
- the `nomencl` hack of `scrhack`
+ the `nomencl` hack of `scrhack`%
}%
}{%
\PackageWarning{scrhack}{%
@@ -1049,16 +1064,16 @@
%
% \begin{macro}{\scr@hack@nomencl@head}
% \changes{v3.23}{2017/03/31}{Überschrift für \texttt{thenomenclature} unter
-% Verwendung von \textsf{tocbasic}}%^^A
+% Verwendung von \textsf{tocbasic}}%^^A
+% \changes{v3.31}{2020/07/08}{internal \cs{list@fname} eliminated}%^^A
% Im Gegensatz zu Gleitumgebungen benötigen wir hier keine Gruppe, weil
% \texttt{thenomenclature} bereits die Gruppe bereitstellt.
% \begin{macrocode}
%<*nomencl&body>
\newcommand*{\scr@hack@nomencl@head}{%
\providecommand*{\listofnlsname}{\nomname}%
- \let\list@fname\listofnlsname
\def\@currext{nls}%
- \tocbasic@listhead{\list@fname}%
+ \tocbasic@listhead{\nomname}%
}
%</nomencl&body>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx b/Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx
index f9c193af4f4..6a65c8fc812 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx
@@ -1,8 +1,7 @@
-% \CheckSum{4335}
% \iffalse meta-comment
% ======================================================================
% scrkernel-basics.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +19,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrkernel-basics.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -36,26 +35,8 @@
%
% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
% ======================================================================
-% \fi
-%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
%
-% \iffalse
-%%% From File: $Id: scrkernel-basics.dtx 3448 2020-01-17 14:56:41Z kohm $
+%%% From File: $Id: scrkernel-basics.dtx 3527 2020-09-11 09:44:32Z kohm $
%<prepare>%%% (run: prepare)
%<option>%%% (run: option)
%<body>%%% (run: body)
@@ -65,7 +46,7 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\def\filedate{#2/#3/#4}}
- \filedate$Date: 2020-01-17 15:56:41 +0100 (Fri, 17 Jan 2020) $
+ \filedate$Date: 2020-09-11 11:44:32 +0200 (Fri, 11 Sep 2020) $
\def\filerevision$#1: #2 ${\def\filerevision{r#2}}
\filerevision$Revision: 1638 $
\xdef\fileinfo{\filedate\space\filerevision\space}
@@ -103,7 +84,6 @@
\from{scrkernel-basics.dtx}{package,prepare,base}%
\from{scrkernel-basics.dtx}{package,option,base}%
\from{scrkernel-language.dtx}{package,option,base}%
- \from{scrlfile.dtx}{load}%
\from{scrkernel-basics.dtx}{package,body,base}%
\from{scrkernel-language.dtx}{package,body,base}%
\from{scrlogo.dtx}{logo}%
@@ -135,9 +115,10 @@
%
% \selectlanguage{ngerman}
%
-% \changes{v1.0}{2002/07/06}{Beginn der ersten Version}%^^A
+% \changes{v1.0}{2002/07/06}{Beginn der ersten Version}
% \changes{v3.12}{203/03/05}{Verwendung von \cs{@tempa}, \cs{@tempb},
% \cs{@tempc} eliminiert}
+% \changes{v3.32}{2020/09/11}{\textsf{scrlfile} wird nicht mehr geladen}
%
% \section{Grundlegenden \KOMAScript-Erweiterungen}
%
@@ -216,6 +197,17 @@
%<koma>\RequirePackage{scrbase}[\KOMAScriptVersion]
% \end{macrocode}
%
+% \subsection{Laden von \textsf{scrlfile}}
+%
+% \textsf{scrlfile} wird benötigt, um auf das Laden anderer Pakete reagieren
+% zu können. Dazu gehört beispielsweise \textsf{polyglossia} wegen dessen
+% unzureichender Behandlung unterschiedlicher Sprachvarianten. Welche Version
+% davon geladen wird, ist allerdings ziemlich egal.
+%
+% \begin{macrocode}
+%<base>\RequirePackage{scrlfile}
+% \end{macrocode}
+%
% \subsection{Laden von \textsf{keyval}}
%
% Hier wird nicht nur das Paket geladen, was ruckzuck mit:
@@ -244,6 +236,38 @@
% \end{macrocode}
% \end{macro}%^^A \kernel@ifstar
%
+% \selectlanguage{english}
+%
+% \subsection{Improved \LaTeX{} kernel commands}
+% The \LaTeX{} kernel already provides some useful commands, but some can be
+% improved.
+%
+% \begin{macro}{\rloop}
+% \changes{v3.30}{2020/03/07}{new}
+% The \cs{loop} \dots \cs{repeat} of the \LaTeX{} kernel cannot be used inside
+% a \cs{loop} \dots \cs{repeat} without extra code for preserving
+% \cs{iterate}. So here is a re-entrant version that is also long. This
+% version can be used even inside a \cs{loop} \dots \cs{repeat}. However you
+% should not use \cs{loop} \dots \cs{repeat} inside \cs{rloop} \dots
+% \cs{repeat}.
+% \begin{macrocode}
+%<*base>
+\newcommand{\rloop}[1]{}
+\long\def\rloop#1\repeat{%
+ \ifdefined\iterate
+ \edef\iterate{\unexpanded{#1\relax\expandafter\iterate\fi\def\iterate}%
+ {\unexpanded\expandafter{\iterate}}}%
+ \else
+ \def\iterate{#1\relax\expandafter\iterate\fi\let\iterate\relax}%
+ \fi
+ \iterate
+}
+%</base>
+% \end{macrocode}
+% \end{macro}
+% \selectlanguage{ngerman}
+%
+%
% \subsection{Test von Anweisungen}
%
% \begin{macro}{\scr@ifundefinedorrelax}
@@ -2761,10 +2785,12 @@
% \changes{v3.28}{2019/11/18}{entfernt}%^^A
% \begin{macro}{\scr@ifpdftex}
% \changes{v2.95}{2002/08/19}{neu (intern)}%^^A
+% \changes{v3.30}{2020/03/06}{veralteten Befehl \cs{ifnotundefined} durch
+% \cs{Ifnotundefined} ersetzt}%^^A
% If-then-else-Konstrukt, um zu testen, ob pdf\TeX{} verwendet wird.
% \begin{macrocode}
%<*base>
-\newcommand{\scr@ifpdftex}{\ifnotundefined{pdftexversion}}
+\newcommand{\scr@ifpdftex}{\Ifnotundefined{pdftexversion}}
%</base>
% \end{macrocode}
% \end{macro}
@@ -2772,10 +2798,12 @@
%
% \begin{macro}{\scr@ifluatex}
% \changes{v3.21}{2016/05/27}{neu (intern)}%^^A
+% \changes{v3.30}{2020/03/06}{veralteten Befehl \cs{ifnotundefined} durch
+% \cs{Ifnotundefined} ersetzt}%^^A
% If-the-else-Konstrukt, um zu testen, ob lua\TeX{} verwendet wird.
% \begin{macrocode}
%<*base>
-\newcommand{\scr@ifluatex}{\ifnotundefined{luatexversion}}
+\newcommand{\scr@ifluatex}{\Ifnotundefined{luatexversion}}
%</base>
% \end{macrocode}
% \end{macro}
@@ -2800,10 +2828,12 @@
% \begin{macro}{\scr@ifVTeX}
% \changes{v2.95}{2002/08/19}{neu}%^^A
% \changes{v2.97c}{2007/06/20}{umdefiniert von \cs{scr@ifvtex}}
+% \changes{v3.30}{2020/03/06}{veralteten Befehl \cs{ifnotundefined} durch
+% \cs{Ifnotundefined} ersetzt}%^^A
% If-then-else-Konstrukt, um zu testen, ob V\TeX{} verwendet wird.
% \begin{macrocode}
%<*base>
-\newcommand{\scr@ifVTeX}{\ifnotundefined{VTeXversion}}
+\newcommand{\scr@ifVTeX}{\Ifnotundefined{VTeXversion}}
%</base>
% \end{macrocode}
% \end{macro}
@@ -2880,19 +2910,21 @@
% \begin{macro}{\scr@ifpsoutput}
% \changes{v2.95}{2002/08/21}{neu (intern)}%^^A
% \changes{v2.95}{2004/07/20}{Expandierbarkeit verbessert}%^^A
+% \changes{v3.30}{2020/03/06}{veralteten Befehl \cs{ifnotundefined} durch
+% \cs{Ifnotundefined} ersetzt}%^^A
% If-then-else-Konstrukt, um abhängig davon, ob früher oder später
% \texttt{ps} ausgegeben wird oder nicht, Befehle auszuführen.
% \begin{macrocode}
%<*base>
\newcommand*{\scr@ifpsoutput}{%
- \ifnotundefined{if@dvips}{%
+ \Ifnotundefined{if@dvips}{%
\if@dvips
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}{%
- \ifnotundefined{OpMode}{%
+ \Ifnotundefined{OpMode}{%
\ifnum\OpMode=2
\expandafter\@firstoftwo
\else
@@ -4105,8 +4137,9 @@
% \begin{macro}{\FamilyUnknownKeyValue}
% \changes{v3.10}{2011/09/12}{no error while processing global options}%^^A
% \changes{v3.11a}{2012/05/28}{prevent remove from list of unused global
-% options globally}%^^A
+% options globally}%^^A
% \changes{v3.14}{2014/10/17}{\cs{long}}%^^A
+% \changes{v3.30}{2020/02/25}{spurious space in warning message removed}%^^A
% Dieses Makro berichtet über Fehler wegen unbekannter Wertübergabe an einen
% Schlüssel. Das erste Argument ist die Familie, das zweite der Schlüssel,
% das dritte der Wert und das vierte die Liste der möglichen Werte.
@@ -4120,7 +4153,7 @@
Setting this command to a non empty\MessageBreak
value for option `#2' of\MessageBreak
family `#1' is deprecated,\MessageBreak
- but has been found
+ but has been found%
}%
\fi
}
@@ -5108,6 +5141,8 @@
% \begin{macro}{\ForDoHook}
% \changes{v3.27}{2019/02/05}{New}%^^A
% \changes{v3.28}{2019/11/18}{\cs{ifstr} umbenannt in \cs{Ifstr}}%^^A
+% \changes{v3.30}{2020/03/07}{\cs{loop}\dots\cs{repeat} inside group}%^^A
+% \changes{v3.30}{2020/03/07}{using \cs{rloop} instead of \cs{loop}}%^^A
% Arguments:
% \begin{description}
% \item[\meta{specificator}:]
@@ -5129,18 +5164,20 @@
but do-hook specificators must not be empty.%
}%
}{%
- \let\scr@hookname\relax
- \edef\scr@hookargument{#1}%
- \loop
- \scr@hooksplit@specificator\scr@hookname\scr@hookargument
- \scr@hookargument
- \begingroup\edef\reserved@a{%
- \unexpanded{\endgroup #2}{\scr@hookname}{\scr@hookargument}%
- }\reserved@a
- \ifx\scr@hookargument\@empty\else
- \repeat
- \let\scr@hookname\relax
- \let\scr@hookargument\relax
+ \begingroup
+ \def\scr@hookrun{\endgroup}%
+ \let\scr@hookname\relax
+ \edef\scr@hookargument{#1}%
+ \rloop
+ \scr@hooksplit@specificator\scr@hookname\scr@hookargument
+ \scr@hookargument
+ \edef\scr@hookrun{%
+ \unexpanded\expandafter{\scr@hookrun}%
+ \unexpanded{#2}{\scr@hookname}{\scr@hookargument}%
+ }%
+ \ifx\scr@hookargument\@empty\else
+ \repeat
+ \scr@hookrun
}%
}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkernel-compatibility.dtx b/Master/texmf-dist/source/latex/koma-script/scrkernel-compatibility.dtx
index 3037d123abe..2a3e3c981b2 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrkernel-compatibility.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrkernel-compatibility.dtx
@@ -1,8 +1,8 @@
-% \CheckSum{222}
+% \CheckSum{225}
% \iffalse meta-comment
% ======================================================================
% scrkernel-compatibility.dtx
-% Copyright (c) Markus Kohm, 2006-2019
+% Copyright (c) Markus Kohm, 2006-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +20,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrkernel-compatibility.dtx
-% Copyright (c) Markus Kohm, 2006-2019
+% Copyright (c) Markus Kohm, 2006-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -55,7 +55,7 @@
% Right brace \} Tilde \~}
%
% \iffalse
-%%% From File: $Id: scrkernel-compatibility.dtx 3446 2020-01-06 16:31:11Z kohm $
+%%% From File: $Id: scrkernel-compatibility.dtx 3515 2020-08-06 16:16:31Z kohm $
%<identify>%%% (run: identify)
%<init>%%% (run: init)
%<option>%%% (run: option)
@@ -65,7 +65,7 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\def\filedate{#2/#3/#4}}
- \filedate$Date: 2020-01-06 17:31:11 +0100 (Mon, 06 Jan 2020) $
+ \filedate$Date: 2020-08-06 18:16:31 +0200 (Thu, 06 Aug 2020) $
\def\filerevision$#1: #2 ${\def\filerevision{r#2}}
\filerevision$Revision: 1638 $
\edef\reserved@a{%
@@ -428,6 +428,12 @@
% \changes{v3.28}{2019/11/20}{Neues Macro}
% \begin{macro}{\scr@v@3.29}
% \changes{v3.29}{2020/01/06}{Neues Macro}
+% \begin{macro}{\scr@v@3.30}
+% \changes{v3.30}{2020/02/24}{Neues Macro}
+% \begin{macro}{\scr@v@3.31}
+% \changes{v3.31}{2020/04/26}{Neues Macro}
+% \begin{macro}{\scr@v@3.32}
+% \changes{v3.32}{2020/08/06}{Neues Macro}
% \begin{macro}{\scr@v@last}
% \changes{v2.9u}{2005/03/05}{Neues Macro}%^^A
% Nun die unterschiedlichen möglichen Werte (|\scr@v@last| ist jeweils die
@@ -506,7 +512,10 @@
\@namedef{scr@v@3.27a}{17}
\@namedef{scr@v@3.28}{17}
\@namedef{scr@v@3.29}{17}
-\@namedef{scr@v@last}{17}
+\@namedef{scr@v@3.30}{17}
+\@namedef{scr@v@3.31}{18}
+\@namedef{scr@v@3.32}{18}
+\@namedef{scr@v@last}{18}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -568,6 +577,9 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkernel-language.dtx b/Master/texmf-dist/source/latex/koma-script/scrkernel-language.dtx
index 2a02e45de08..3738ca9b50c 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrkernel-language.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrkernel-language.dtx
@@ -1,8 +1,8 @@
-% \CheckSum{2229}
+% \CheckSum{2247}
% \iffalse meta-comment
% ======================================================================
% scrkernel-language.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +20,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrkernel-language.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -55,7 +55,7 @@
% Right brace \} Tilde \~}
%
% \iffalse
-%%% From File: $Id: scrkernel-language.dtx 3265 2019-10-13 17:58:25Z kohm $
+%%% From File: $Id: scrkernel-language.dtx 3480 2020-04-13 09:39:03Z kohm $
%<option>%%% (run: option)
%<body>%%% (run: body)
%<*dtx>
@@ -63,9 +63,9 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-10-13 19:58:25 +0200 (Sun, 13 Oct 2019) $
+ \filedate$Date: 2020-04-13 11:39:03 +0200 (Mon, 13 Apr 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
- \filerevision$Revision: 3265 $
+ \filerevision$Revision: 3480 $
\edef\reserved@a{%
\noexpand\endgroup
\noexpand\ProvidesFile{scrkernel-language.dtx}
@@ -563,6 +563,15 @@
% \begin{macrocode}
\expandafter\providecommand\expandafter*%
\csname abx@extras@\scr@reserved@a\endcsname{}%
+% \end{macrocode}
+% \changes{v3.30}{2020/04/13}{\cs{renewcommand} workaround}%^^A
+% Unfortunately some users use \cs{renewcommand} to change a name even if the
+% language has not been loaded and the command has not been defined. This
+% would result in an error message. So a this point we let \cs{renewcommand}
+% be \cs{providecommand}, because we know that currently the command is
+% \cs{relax}.
+% \begin{macrocode}
+ \let\renewcommand\providecommand
\csname extras\scr@reserved@a\endcsname
\csname captions\scr@reserved@a\endcsname
\ifx #2\relax \aftergroup\@firstofone
@@ -642,8 +651,14 @@
% \cs{extras\meta{language}} would result in an error. As a workaround for
% this issue, make sure, that \cs{abx@extras@\meta{language}} is defined here
% locally.
-% \selectlanguage{ngerman}%^^A
+% \changes{v3.30}{2020/04/13}{\cs{renewcommand} workaround}%^^A
+% Unfortunately some users use \cs{renewcommand} to change a name even if the
+% language has not been loaded and the command has not been defined. This
+% would result in an error message. So a this point we let \cs{renewcommand}
+% be \cs{providecommand}, because we know that currently the command is
+% \cs{relax}.
% \begin{macrocode}
+ \let\renewcommand\providecommand
\expandafter\providecommand\expandafter*%
\csname abx@extras@\scr@reserved@a\endcsname{}%
\csname captions\scr@reserved@a\endcsname
@@ -682,6 +697,7 @@
% \end{macrocode}
% \end{macro}%^^A \scr@provide@captionname
% \end{macro}%^^A \providecaptionname
+% \selectlanguage{ngerman}
%
% \begin{macro}{\newcaptionname}
% \changes{v2.8q}{2001/11/08}{neu}%^^A
@@ -748,8 +764,14 @@
% \cs{extras\meta{language}} would result in an error. As a workaround for
% this issue, make sure, that \cs{abx@extras@\meta{language}} is defined here
% locally.
-% \selectlanguage{ngerman}%^^A
+% \changes{v3.30}{2020/04/13}{\cs{renewcommand} workaround}%^^A
+% Unfortunately some users use \cs{renewcommand} to change a name even if the
+% language has not been loaded and the command has not been defined. This
+% would result in an error message. So a this point we let \cs{renewcommand}
+% be \cs{providecommand}, because we know that currently the command is
+% \cs{relax}.
% \begin{macrocode}
+ \let\renewcommand\providecommand
\expandafter\providecommand\expandafter*%
\csname abx@extras@\scr@reserved@a\endcsname{}%
\csname captions\scr@reserved@a\endcsname
@@ -783,6 +805,7 @@
}
% \end{macrocode}
% \end{macro}%^^A \scr@new@scaptionname
+% \selectlanguage{ngerman}%^^A
% \begin{macro}{\scr@new@captionname}
% \changes{v3.12}{2013/07/30}{neu (intern)}%^^A
% \changes{v3.26}{2018/08/29}{diverse \cs{expandafter} eingespart}%^^A
@@ -824,8 +847,14 @@
% \cs{extras\meta{language}} would result in an error. As a workaround for
% this issue, make sure, that \cs{abx@extras@\meta{language}} is defined here
% locally.
-% \selectlanguage{ngerman}%^^A
+% \changes{v3.30}{2020/04/13}{\cs{renewcommand} workaround}%^^A
+% Unfortunately some users use \cs{renewcommand} to change a name even if the
+% language has not been loaded and the command has not been defined. This
+% would result in an error message. So a this point we let \cs{renewcommand}
+% be \cs{providecommand}, because we know that currently the command is
+% \cs{relax}.
% \begin{macrocode}
+ \let\renewcommand\providecommand
\expandafter\providecommand\expandafter*%
\csname abx@extras@\scr@reserved@a\endcsname{}%
\csname captions\scr@reserved@a\endcsname
@@ -860,6 +889,7 @@
% \end{macrocode}
% \end{macro}%^^A \scr@new@captionname
% \end{macro}%^^A \newcaptionname
+% \selectlanguage{ngerman}%^^A
%
% \begin{macro}{\renewcaptionname}
% \changes{v2.8q}{2001/11/08}{neu}%^^A
@@ -929,8 +959,14 @@
% \cs{extras\meta{language}} would result in an error. As a workaround for
% this issue, make sure, that \cs{abx@extras@\meta{language}} is defined here
% locally.
-% \selectlanguage{ngerman}%^^A
+% \changes{v3.30}{2020/04/13}{\cs{renewcommand} workaround}%^^A
+% Unfortunately some users use \cs{renewcommand} to change a name even if the
+% language has not been loaded and the command has not been defined. This
+% would result in an error message. So a this point we let \cs{renewcommand}
+% be \cs{providecommand}, because we know that currently the command is
+% \cs{relax}.
% \begin{macrocode}
+ \let\renewcommand\providecommand
\expandafter\providecommand\expandafter*%
\csname abx@extras@\scr@reserved@a\endcsname{}%
\csname captions\scr@reserved@a\endcsname
@@ -963,6 +999,7 @@
}
% \end{macrocode}
% \end{macro}%^^A \scr@renew@scaptionname
+% \selectlanguage{ngerman}%^^A
% \begin{macro}{\scr@renew@captionname}
% \changes{v3.12}{2013/07/30}{neu (intern)}%^^A
% \changes{v3.26}{2018/08/29}{diverse \cs{expandafter} eingespart}%^^A
@@ -1006,8 +1043,14 @@
% \cs{extras\meta{language}} would result in an error. As a workaround for
% this issue, make sure, that \cs{abx@extras@\meta{language}} is defined here
% locally.
-% \selectlanguage{ngerman}%^^A
+% \changes{v3.30}{2020/04/13}{\cs{renewcommand} workaround}%^^A
+% Unfortunately some users use \cs{renewcommand} to change a name even if the
+% language has not been loaded and the command has not been defined. This
+% would result in an error message. So a this point we let \cs{renewcommand}
+% be \cs{providecommand}, because we know that currently the command is
+% \cs{relax}.
% \begin{macrocode}
+ \let\renewcommand\providecommand
\expandafter\providecommand\expandafter*%
\csname abx@extras@\scr@reserved@a\endcsname{}%
\csname extras\scr@reserved@a\endcsname
@@ -1049,6 +1092,7 @@
% \end{macrocode}
% \end{macro}%^^A \scr@renew@captionname
% \end{macro}%^^A \renewcaptionname
+% \selectlanguage{ngerman}%^^A
%
% \iffalse
%</package&base>
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkernel-letterclassoptions.dtx b/Master/texmf-dist/source/latex/koma-script/scrkernel-letterclassoptions.dtx
index 82608724172..1759c2990d6 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrkernel-letterclassoptions.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrkernel-letterclassoptions.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
% ======================================================================
% scrkernel-letterclassoptions.dtx
-% Copyright (c) Markus Kohm, 2006-2019
+% Copyright (c) Markus Kohm, 2006-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +20,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrkernel-letterclassoptions.dtx
-% Copyright (c) Markus Kohm, 2006-2019
+% Copyright (c) Markus Kohm, 2006-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -55,7 +55,7 @@
% Right brace \} Tilde \~}
%
% \iffalse
-%%% From File: $Id: scrkernel-letterclassoptions.dtx 3404 2019-11-24 21:50:05Z kohm $
+%%% From File: $Id: scrkernel-letterclassoptions.dtx 3453 2020-02-25 07:33:30Z kohm $
%<option>%%% (run: option)
%<head>%%% (run: head)
%<body>%%% (run: body)
@@ -64,9 +64,9 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-11-24 22:50:05 +0100 (Sun, 24 Nov 2019) $
+ \filedate$Date: 2020-02-25 08:33:30 +0100 (Tue, 25 Feb 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
- \filerevision$Revision: 3404 $
+ \filerevision$Revision: 3453 $
\endgroup
\ProvidesFile{scrkernel-letterclassoptions.dtx}
[\filedate\space \filerevision\space
@@ -895,6 +895,8 @@
%
% Und für \texttt{DIN5008} braucht es dann noch einige zusätzliche
% Einstellungen:
+% \changes{v3.30}{2020/02/25}{unerwünschtes Leerzeichen am Ende der Warnungen
+% beseitigt}%^^A
% \begin{macrocode}
%</!5008>
%<*5008>
@@ -926,7 +928,7 @@
\space\string\areaset[5mm]{%
\the\dimexpr \paperwidth-45mm\relax}{%
\the\dimexpr 1.414\dimexpr \paperwidth-45mm\relax\relax}\MessageBreak
- to follow the norm
+ to follow the norm%
}%
\fi
\ifdim \dimexpr\parskip\relax=\dimexpr\baselineskip\relax\else
@@ -939,7 +941,7 @@
document does not conform DIN5008.\MessageBreak
You shoud use, e.g.,\MessageBreak
\space\string\KOMAoption{parskip}{full}\MessageBreak
- to follow the norm
+ to follow the norm%
}%
\fi
\endgroup
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkernel-listsof.dtx b/Master/texmf-dist/source/latex/koma-script/scrkernel-listsof.dtx
index 4c2b069b2de..b7ff8d719ee 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrkernel-listsof.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrkernel-listsof.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
% ======================================================================
% scrkernel-listsof.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +20,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrkernel-listsof.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -55,7 +55,7 @@
% Right brace \} Tilde \~}
%
% \iffalse
-%%% From File: $Id: scrkernel-listsof.dtx 3390 2019-11-18 17:09:35Z kohm $
+%%% From File: $Id: scrkernel-listsof.dtx 3477 2020-04-11 07:26:26Z kohm $
%<prepare>%%% (run: prepare)
%<option>%%% (run: option)
%<body>%%% (run: body)
@@ -64,9 +64,9 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-11-18 18:09:35 +0100 (Mon, 18 Nov 2019) $
+ \filedate$Date: 2020-04-11 09:26:26 +0200 (Sat, 11 Apr 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
- \filerevision$Revision: 3390 $
+ \filerevision$Revision: 3477 $
\edef\reserved@a{%
\noexpand\endgroup
\noexpand\ProvidesFile{scrkernel-listsof.dtx}%
@@ -299,7 +299,7 @@
%
% \selectlanguage{english}%^^A
% \changes{v3.27}{2019/05/11}{init code moved from \texttt{tocbasic.dtx}}%^^A
-% \changes{v1.00}{auto-activation of feature \texttt{onecolumn}}
+% \changes{v1.0a}{2008/11/13}{auto-activation of feature \texttt{onecolumn}}
% Set feature \texttt{onecolumn} for every ToC file.
% \begin{macrocode}
%<*prepare&(book|report)>
@@ -508,7 +508,8 @@
% \textsf{scrbook}}%^^A
% \changes{v3.00}{2008/07/04}{Verwendung von \cs{toc@heading} ist nicht
% länger empfohlen}%^^A
-% \changes{v3.10}{2011/08/31}{\cs{MakeMarkcase} wird beachtet}%
+% \changes{v3.10}{2011/08/31}{\cs{MakeMarkcase} wird beachtet}%^^A
+% \changes{v3.30}{2020/02/24}{Leerzeichen am Ende der Warnung entfernt}%^^A
% Befehl, zum Setzen der Überschrift des Inhaltsverzeichnisses. Eigentlich
% ist das überflüssig, weil es nur einmal verwendet wird. Aus Gründen der
% Konsistenz mit den anderen Verzeichnissen machen wir das hier aber
@@ -521,7 +522,7 @@
You should use the features of package `tocbasic'\MessageBreak
instead of \string\toc@heading.\MessageBreak
Definition of \string\toc@heading\space may be removed from\MessageBreak
- KOMA-Script soon, so it should not be used
+ KOMA-Script soon, so it should not be used%
}%
%<article> \section*{\contentsname}%
%<book|report> \chapter*{\contentsname}%
@@ -1016,6 +1017,8 @@
% \changes{v3.01}{2008/11/13}{Neu (intern)}%^^A
% \changes{v3.12}{2013/09/25}{Text geändert}%^^A
% \changes{v3.12a}{2014/03/05}{Text korrigiert}%^^A
+% \changes{v3.30}{2020/02/25}{spurious space at end of warning message
+% removed}%^^A
% Die Warnung für die Verwendung von \cs{float@listhead}, dessen Definition
% irgendwann aus den Klassen verschwinden wird.
% \begin{macrocode}
@@ -1031,7 +1034,7 @@
Loading of package `scrhack' may help to\MessageBreak
avoid this warning, if you are using a\MessageBreak
a package that still implements the\MessageBreak
- deprecated \string\float@listhead\space interface
+ deprecated \string\float@listhead\space interface%
}%
}
% \end{macrocode}
@@ -1040,6 +1043,7 @@
% \changes{v3.01}{2008/11/13}{Neu (intern)}%^^A
% \changes{v3.12}{2013/09/25}{Text geändert}%^^A
% \changes{v3.12a}{2014/03/05}{Text korrigiert}%^^A
+% \changes{v3.30}{2020/02/24}{Leerzeichen am Ende der Warnung entfernt}%^^A
% Die Warnung für die Verwendung von \cs{float@addtolists}, dessen
% Unterstützung irgendwann aus den Klassen verschwinden wird.
% \begin{macrocode}
@@ -1057,7 +1061,7 @@
Loading of package `scrhack' may help to\MessageBreak
avoid this warning, if you are using a\MessageBreak
a package that still implements the\MessageBreak
- deprecated \string\float@addtolist\space interface
+ deprecated \string\float@addtolist\space interface%
}%
\global\let\scr@float@addtolists@warning\relax
}
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkernel-miscellaneous.dtx b/Master/texmf-dist/source/latex/koma-script/scrkernel-miscellaneous.dtx
index 8c5a97f27a2..e7fdedb0113 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrkernel-miscellaneous.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrkernel-miscellaneous.dtx
@@ -1,8 +1,7 @@
-% \CheckSum{782}
% \iffalse meta-comment
% ======================================================================
% scrkernel-miscellaneous.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +19,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrkernel-miscellaneous.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -55,7 +54,7 @@
% Right brace \} Tilde \~}
%
% \iffalse
-%%% From File: $Id: scrkernel-miscellaneous.dtx 3400 2019-11-21 10:36:26Z kohm $
+%%% From File: $Id: scrkernel-miscellaneous.dtx 3514 2020-08-06 16:14:53Z kohm $
%<init>%%% (run: init)
%<option>%%% (run: option)
%<execoption>%%% (run: execoption)
@@ -65,9 +64,9 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-11-21 11:36:26 +0100 (Thu, 21 Nov 2019) $
+ \filedate$Date: 2020-08-06 18:14:53 +0200 (Thu, 06 Aug 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
- \filerevision$Revision: 3400 $
+ \filerevision$Revision: 3514 $
\edef\reserved@a{%
\noexpand\endgroup
\noexpand\ProvidesFile{scrkernel-miscellaneous.dtx}%
@@ -719,9 +718,13 @@
%
% Nun fehlt nur noch das eigentliche oben versprochene
% Anwendermacro. Das ist nun aber auch kein Problem mehr:
+% \changes{v3.31}{2020/04/27}{Klasse und Paket in der Ausgabe korrigiert}%^^A
+% \changes{v3.32}{2020/08/06}{\cs{KOMAClassName} fixed}
% \begin{macrocode}
\providecommand*{\ifthispageodd}{%
- \PackageWarning{scrbase}{Usage of deprecated command
+%<class> \ClassWarning{\KOMAClassName}{%
+%<extend> \PackageWarning{scrextend}{%
+ Usage of deprecated command
`\string\ifthispageodd'.\MessageBreak
The command has been renamed because of a\MessageBreak
recommendation of The LaTeX Project Team.\MessageBreak
@@ -1080,8 +1083,8 @@
\ifx\@sect\@tempa
% \end{macrocode}
% Note: There are several bugs in this definition (e.g. missing
-% \cs{expandafter} and orphan spaced). Nevertheless its the original one from
-% \textsf{minitoc} 61 and so I have to use it.
+% \cs{expandafter} and spurious spaced). Nevertheless its the original one
+% from \textsf{minitoc} 61 and so I have to use it.
% \begin{macrocode}
\def\@tempa#1#2#3#4#5#6[#7]#8{
\expandafter
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkernel-notepaper.dtx b/Master/texmf-dist/source/latex/koma-script/scrkernel-notepaper.dtx
index 3fed0574dfc..651bc7d50b1 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrkernel-notepaper.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrkernel-notepaper.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
% ======================================================================
% scrkernel-notepaper.dtx
-% Copyright (c) Markus Kohm, 2006-2019
+% Copyright (c) Markus Kohm, 2006-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -19,7 +19,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrkernel-notepaper.dtx
-% Copyright (c) Markus Kohm, 2006-2019
+% Copyright (c) Markus Kohm, 2006-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -54,7 +54,7 @@
% Right brace \} Tilde \~}
%
% \iffalse
-%%% From File: $Id: scrkernel-notepaper.dtx 3390 2019-11-18 17:09:35Z kohm $
+%%% From File: $Id: scrkernel-notepaper.dtx 3472 2020-03-27 11:01:45Z kohm $
%<option>%%% (run: option)
%<body>%%% (run: body)
%<*dtx>
@@ -62,7 +62,7 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-11-18 18:09:35 +0100 (Mon, 18 Nov 2019) $
+ \filedate$Date: 2020-03-27 12:01:45 +0100 (Fri, 27 Mar 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
\filerevision$Revision: 1767 $
\edef\reserved@a{%
@@ -2206,6 +2206,8 @@
% \changes{v3.27}{2019/03/22}{new (internal)}%^^A
% \changes{v3.28}{2019/11/15}{\cs{ifkomavarempty} durch \cs{Ifkomavarempty}
% ersetzt}%^^A
+% \changes{v3.30}{2020/03/27}{Umdefinierung des Zeilenumbruchs
+% verschoben}%^^A
% The field with the recipience address. This should be used only on the first
% page of a letter.
% \begin{macrocode}
@@ -2215,9 +2217,13 @@
\color@begingroup
\if@baddr
\Ifkomavarempty{backaddress}{}{%
- \def\\{\usekomavar{backaddressseparator}\@ogobble}%
- \backaddr@format{\scriptsize\usekomafont{backaddress}%
- \usekomavar{backaddress}}%
+ \backaddr@format{\scriptsize
+ {%
+ \def\\{\usekomavar{backaddressseparator}\@ogobble}%
+ \usekomafont{backaddress}%
+ {\usekomavar{backaddress}}%
+ }%
+ }%
}%
\fi
\color@endgroup
@@ -3346,6 +3352,8 @@
% \changes{v3.27}{2019/03/27}{only at \textsf{scrlttr2}}%^^A
% \changes{v3.28}{2019/11/15}{\cs{ifkomavarempty} durch \cs{Ifkomavarempty}
% ersetzt}%^^A
+% \changes{v3.30}{2020/03/27}{Umdefinierung des Zeilenumbruchs
+% verschoben}%^^A
% Dasselbe gilt auch für das Adressfeld für Fensterumschläge. Die
% Rücksendeadresse und die Briefart werden dabei mit eigenen
% Formatieranweisungen gesetzt.
@@ -3391,9 +3399,12 @@
\if@baddr
\Ifkomavarempty{backaddress}{}{{%
\noindent%
- \def\\{\usekomavar{backaddressseparator}\@ogobble}%
- \backaddr@format{\scriptsize\usekomafont{backaddress}%
- \usekomavar{backaddress}}}}%
+ \backaddr@format{\scriptsize
+ {%
+ \def\\{\usekomavar{backaddressseparator}\@ogobble}%
+ \usekomafont{backaddress}%
+ {\usekomavar{backaddress}}%
+ }}}}%
\fi
}{backaddress}{backaddrheight}{\setkomavar}%
\ifcase \ltr@priority
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkernel-sections.dtx b/Master/texmf-dist/source/latex/koma-script/scrkernel-sections.dtx
index 154a4539272..d6ea3faa9b7 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrkernel-sections.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrkernel-sections.dtx
@@ -1,8 +1,7 @@
-% \CheckSum{4850}
% \iffalse meta-comment
% ======================================================================
% scrkernel-sections.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +19,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrkernel-sections.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -55,7 +54,7 @@
% Right brace \} Tilde \~}
%
% \iffalse
-%%% From File: $Id: scrkernel-sections.dtx 3400 2019-11-21 10:36:26Z kohm $
+%%% From File: $Id: scrkernel-sections.dtx 3543 2020-09-14 16:21:00Z kohm $
% The runs of run-time file generation:
%<preidentify>%%% (run: preidentify)
% - everything that is needed before selfidentification of resulting files
@@ -78,9 +77,9 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-11-21 11:36:26 +0100 (Thu, 21 Nov 2019) $
+ \filedate$Date: 2020-09-14 18:21:00 +0200 (Mon, 14 Sep 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
- \filerevision$Revision: 3400 $
+ \filerevision$Revision: 3543 $
\edef\reserved@a{%
\noexpand\endgroup
\noexpand\ProvidesFile{scrkernel-sections.dtx}%
@@ -981,6 +980,8 @@
% \changes{v3.19}{2015/07/17}{Verwendung von \cs{sectionlinesformat} und
% \cs{sectioncatchphraseformat}}%^^A
% \changes{v3.27}{2019/07/08}{neue Option \texttt{nonumber}}%^^A
+% \changes{v3.30}{2020/02/25}{unerwünschtes Leerzeichen am Ende der Warnung
+% entfernt}%^^A
% \begin{macro}{\scr@latex@sect}
% \changes{v3.27}{2019/07/24}{Neu (intern für \textsf{scrhack})}%^^A
% Damit auch alle mit \cs{@startsection} definierten Gliederungsebenen
@@ -1029,7 +1030,7 @@
Please send information about this to\MessageBreak
the KOMA-Script maintainer!\MessageBreak
Maybe LaTeX will be broken by the redefinition\MessageBreak
- of \string\@sect\space}%
+ of \string\@sect}%
\fi
% \end{macrocode}
% \end{macro}%^^A \scr@latex@sect
@@ -1083,6 +1084,25 @@
\z@
\fi
\let\@svsec\@empty
+% \end{macrocode}
+% \selectlanguage{english}%
+% \changes{v3.31}{2020/06/02}{execute counter reset list}%^^A
+% Even for not numbered sections, the reset list für the section counter has
+% to be executed.
+% \begin{macrocode}
+ \expandafter\ifnum\scr@v@is@lt{3.31}\relax\else
+ \begingroup
+ \let\@elt\@stpelt
+ \csname cl@#1\endcsname
+ \endgroup
+ \fi
+% \end{macrocode}
+% \changes{v3.31}{2020/06/02}{\cs{hy@insteadofrefstepcounter} added}%^^A
+% At this point we have to make sure, that the \textsf{hyperref} code for not
+% increasing a counter is executed.
+% \selectlanguage{ngerman}%
+% \begin{macrocode}
+ \hy@insteadofrefstepcounter{#1}%
\else
\refstepcounter{#1}%
\expandafter\@maybeautodot\csname the#1\endcsname
@@ -1124,8 +1144,7 @@
\expandafter\csname #1mark\expandafter\endcsname\expandafter{\@currentheadentry}%
\ifx\@currenttocentry\@empty\else
\scr@ifundefinedorrelax{add#1tocentry}{%
- \expandafter\global\expandafter\def
- \csname add#1tocentry\endcsname##1##2{%
+ \expandafter\gdef\csname add#1tocentry\endcsname##1##2{%
\addtocentrydefault{#1}{##1}{##2}%
}%
}{}%
@@ -1137,7 +1156,17 @@
\fi
\csname add#1tocentry\endcsname{}{\@currenttocentry}%
\else
- \csname add#1tocentry\endcsname{\csname the#1\endcsname}{%
+% \end{macrocode}
+% \selectlanguage{english}%
+% \changes{v3.31}{2020/06/06}{use \cs{\dots tocformat}}%
+%^^ATODO: move \cs{autodot} to the definition of \cs{\dots tocformat}
+% \selectlanguage{ngerman}%
+% \begin{macrocode}
+ \@ifundefined{#1tocformat}{%
+ \expandafter\gdef\csname #1tocformat\endcsname
+ {\csname the#1\endcsname}%
+ }{}%
+ \csname add#1tocentry\endcsname{\csname #1tocformat\endcsname}{%
\@currenttocentry}%
\fi
\fi
@@ -1167,8 +1196,7 @@
\expandafter{\@currentheadentry}%
\ifx\@currenttocentry\@empty\else
\scr@ifundefinedorrelax{add#1tocentry}{%
- \expandafter\global\expandafter\def
- \csname add#1tocentry\endcsname####1####2{%
+ \expandafter\gdef\csname add#1tocentry\endcsname####1####2{%
\addtocentrydefault{#1}{####1}{####2}%
}%
}{}%
@@ -1180,8 +1208,18 @@
\fi
\csname add#1tocentry\endcsname{}{\@currenttocentry}%
\else
- \csname add#1tocentry\endcsname{\csname the#1\endcsname}{%
- \@currenttocentry}%
+% \end{macrocode}
+% \selectlanguage{english}%
+% \changes{v3.31}{2020/06/06}{use \cs{\dots tocformat}}%
+%^^ATODO: move \cs{autodot} to the definition of \cs{\dots tocformat}
+% \selectlanguage{ngerman}%
+% \begin{macrocode}
+ \@ifundefined{#1tocformat}{%
+ \expandafter\gdef\csname #1tocformat\endcsname
+ {\csname the#1\endcsname}%
+ }{}%
+ \csname add#1tocentry\endcsname{\csname #1tocformat\endcsname}{%
+ \@currenttocentry}%
\fi
\fi
\ExecuteDoHook{heading/endgroup/#1}%
@@ -1307,6 +1345,8 @@
% der Erweiterung für die Formatieurng der Überschrift}%^^A
% \begin{macro}{\scr@latex@ssect}
% \changes{v3.27}{2019/07/24}{Neu (intern für \textsf{scrhack})}%^^A
+% \changes{v3.30}{2020/02/25}{unerwünschtes Leerzeichen am Ende der Warnung
+% entfernt}%^^A
% Das wird für Überschriften ohne Nummer verwendet. Im Prinzip machen wir hier
% dasselbe wie zuvor.
% \begin{macrocode}
@@ -1330,7 +1370,7 @@
Please send information about this to\MessageBreak
the KOMA-Script maintainer!\MessageBreak
Maybe LaTeX will be broken by the redefinition\MessageBreak
- of \string\@ssect\space}%
+ of \string\@ssect}%
\fi
% \end{macrocode}
% \end{macro}%^^A \scr@latex@ssect
@@ -1347,7 +1387,21 @@
\string\scr@s@ct@@nn@m@\space locally.\MessageBreak
This could result in several error messages}%
\def\scr@s@ct@@nn@m@{\string\scr@s@ct@@nn@m@}%
- }{}%
+ }{%
+% \end{macrocode}
+% \selectlanguage{english}%
+% \changes{v3.31}{2020/06/02}{execute counter reset list}%^^A
+% Even for not numbered sections, the reset list für the corresponding section
+% counter has to be executed.
+% \selectlanguage{ngerman}%
+% \begin{macrocode}
+ \expandafter\ifnum\scr@v@is@lt{3.31}\relax\else
+ \begingroup
+ \let\@elt\@stpelt
+ \csname cl@\scr@s@ct@@nn@m@\endcsname
+ \endgroup
+ \fi
+ }%
% \end{macrocode}
% \changes{v3.26}{2018/09/18}{\cs{scr@sect@runin} beachten}%^^A
% Falls \cs{scr@sect@runin} nicht definiert ist, wird es jetzt höchste Zeit
@@ -1402,6 +1456,8 @@
% \end{macro}%^^A \@ssect
% \begin{macro}{\@xsect}
% \changes{v3.26}{2018/09/18}{wird umdefiniert}%^^A
+% \changes{v3.30}{2020/02/25}{unerwünschtes Leerzeichen am Ende der Warnung
+% entfernt}%^^A
% \begin{macro}{\scr@latex@xsect}
% \changes{v3.27}{2019/07/24}{Neu (intern für \textsf{scrhack})}%^^A
% Wir brauchen zum Einen in \cs{@xsect} einen Fallunterscheidung nach
@@ -1441,7 +1497,7 @@
Please send information about this to\MessageBreak
the KOMA-Script maintainer!\MessageBreak
Maybe LaTeX will be broken by the redefinition\MessageBreak
- of \string\@xsect\space}%
+ of \string\@xsect}%
\fi
% \end{macrocode}
% \end{macro}%^^A \scr@latex@xsect
@@ -1899,6 +1955,17 @@
}
%</book|report>
% \end{macrocode}
+% \begin{macro}{\scr@dsc@style@chapter@subcommands}
+% \selectlanguage{english}%^^A
+% \changes{v3.30}{2020/04/08}{new (internal)}
+% Internal name list of additional commands to be defined for style
+% \texttt{part} commands.
+% \begin{macrocode}
+\newcommand*{\scr@dsc@style@chapter@subcommands}[1]{%
+ @#1,@s#1,@make#1head,@makes#1head,@@make#1head,@@makes#1head,set#1preamble%
+}
+% \end{macrocode}
+% \end{macro}%^^A \scr@dsc@style@chapter@subcommands
% \end{macro}%^^A \scr@dsc@def@style@chapter@command
%
% \begin{macro}{\scr@dsc@style@part@options}
@@ -1972,7 +2039,7 @@
\DeclareSectionCommandStyleFontOption{part}{prefixfont}{}{prefix}
% \end{macrocode}
% \end{macro}%^^A \scr@dsc@style@part@options
-% \begin{macro}{\scr@dsc@def@style@part@command}
+% \begin{macro}{\scr@dsc@def@style@part@ommand}
% \changes{v3.18}{2015/05/23}{neue Anweisung (intern)}
% Diese Anweisung legt fest, wie ein Gliederungsbefehl für den Stil
% \texttt{part} zu definieren ist. Das einzige Argument ist dabei der
@@ -1987,6 +2054,17 @@
%<book|report> \@namedef{set#1preamble}{\set@preamble{#1}}%
}
% \end{macrocode}
+% \begin{macro}{\scr@dsc@style@part@subcommands}
+% \selectlanguage{english}%^^A
+% \changes{v3.30}{2020/04/08}{new (internal)}
+% Internal name list of additional commands to be defined for style
+% \texttt{part} commands.
+% \begin{macrocode}
+\newcommand*{\scr@dsc@style@part@subcommands}[1]{%
+ @#1,@s#1,@end#1,set#1preamble%
+}
+% \end{macrocode}
+% \end{macro}%^^A \scr@dsc@style@part@subcommands
% \end{macro}%^^A \scr@dsc@def@style@part@command
%
% \begin{macro}{\scr@dsc@style@section@neededoptionstest}
@@ -2783,6 +2861,7 @@
% \changes{v3.25}{2018/03/10}{zusätzliche Tests und Fehlermeldungen bei
% \cs{the\dots}, \cs{\dots mark}, \cs{\dots format},
% \cs{\dots markformat}}%^^A
+% \changes{v3.30}{2020/04/08}{unerwünschte Leerzeichen eliminiert}%^^A
% Basierend auf |\DeclareSectionCommand| wird eine Gliederungsanweisung
% definiert, die zuvor noch nicht existierte. Wichtig zu bemerken ist, dass
% die ganzen Hilfsanweisungen bereits existieren dürfen.
@@ -2795,8 +2874,46 @@
\expandafter\scr@ifundefinedorrelax\expandafter{\reserved@a}{}{%
\@tempswafalse
\edef\reserved@b{\expandafter\string\csname \reserved@a\endcsname}%
- }
- }
+ }%
+ }%
+ \if@tempswa
+% \end{macrocode}
+% \changes{v3.30}{2020/04/08}{erweiterte Neuheitsprüfung}%^^A
+% Es wird der Stil benötigt, um zu ermitteln, ob die Unterbefehle für diesen
+% Stil möglicherweise bereits definiert sind.
+% \begin{macrocode}
+ \expandafter\let\expandafter\scr@dsc@current
+ \csname scr@tso@##2@style\endcsname
+ \DefineFamilyKey[.dsc]{KOMAarg}{style}{%
+ \edef\scr@dsc@current{##1}%
+ \FamilyKeyStateProcessed
+ }%
+ \DefineFamilyKey[.dsc]{KOMAarg}{@else@}{\FamilyKeyStateProcessed}%
+ \FamilyExecuteOptions[.dsc]{KOMAarg}{#1}%
+ \RelaxFamilyKey[.dsc]{KOMAarg}{@else@}%
+ \RelaxFamilyKey[.dsc]{KOMAarg}{style}%
+ \@tempswatrue
+% \end{macrocode}
+% Wenn der Stil definiert ist und Unterbefehle kennt, diese ebenfalls testen.
+% \begin{macrocode}
+ \@ifundefined{scr@dsc@current}{}{%
+ \scr@ifundefinedorrelax{scr@dsc@style@\scr@dsc@current @subcommands}{%
+ }{%
+ \edef\reserved@b{%
+ \csname scr@dsc@style@\scr@dsc@current @subcommands\endcsname{#2}%
+ }%
+ \expandafter\@for\expandafter\reserved@a\expandafter:\expandafter=%
+ \reserved@b\do{%
+ \expandafter\scr@ifundefinedorrelax\expandafter{\reserved@a}{}{%
+ \@tempswafalse
+ \edef\reserved@b{%
+ \expandafter\string\csname \reserved@a\endcsname}%
+ }%
+ }%
+ }
+ }%
+ \let\scr@dsc@current\relax
+ \fi
\if@tempswa
\DeclareSectionCommand[{#1}]{#2}%
\else
@@ -3840,18 +3957,29 @@
% \cs{typeout}}%^^A
% \changes{v3.28}{2019/11/19}{\cs{ifnumbered} umbenannt in
% \cs{Ifnumbered}}%^^A
+% \changes{v3.31}{2020/06/02}{\cs{@maybeautodot}\cs{thepart} entfernt}%^^A
% \begin{macrocode}
\Ifnumbered{#1}{%
\refstepcounter{#1}%
- \@maybeautodot\thepart%
\expandafter\@maybeautodot\csname the#1\endcsname
\typeout{#1 \csname the#1\endcsname.}%
\ifx\@currenttocentry\@empty\else
+% \end{macrocode}
+% \selectlanguage{english}%
+% \changes{v3.31}{2020/06/06}{use \cs{\dots tocformat}}%
+%^^ATODO: move \cs{autodot} to the definition of \cs{\dots tocformat}
+% \selectlanguage{ngerman}%
+% \begin{macrocode}
+ \@ifundefined{#1tocformat}{%
+ \expandafter\gdef\csname #1tocformat\endcsname
+ {\csname the#1\endcsname}%
+ }{}%
\scr@ifundefinedorrelax{add#1tocentry}{%
\addtocentrydefault{#1}%
}{%
\@nameuse{add#1tocentry}%
- }{\csname the#1\endcsname}{\@currenttocentry}%
+ }{\csname\@ifundefined{#1tocformat}{the#1}{#1tocformat}\endcsname}%
+ {\@currenttocentry}%
\fi
}{%
% \end{macrocode}
@@ -4090,11 +4218,13 @@
%
%
% \begin{macro}{\hy@insteadofrefstepcounter}
-% \changes{v3.18}{2015/05/22}{neu (intern und \textsf{hyperref})}%^^A
+% \changes{v3.18}{2015/05/22}{neu (intern und \textsf{hyperref})}
% \begin{macro}{\scr@chapter@before@hyperref@patch}
-% \changes{v3.27}{2019/07/24}{neu (intern für \textsf{scrhack})}%^^A
+% \changes{v3.27}{2019/07/24}{neu (intern für \textsf{scrhack})}
% \begin{macro}{\scr@chapter@after@hyperref@patch}
-% \changes{v3.27}{2019/07/24}{neu (intern für \textsf{scrhack})}%^^A
+% \changes{v3.27}{2019/07/24}{neu (intern für \textsf{scrhack})}
+% \changes{v3.32}{2020/09/11}{\cs{AfterPackage!} durch
+% \cs{AfterAtEndOfPackage} ersetzt}
% Normalerweise führt \textsf{hyperref} via \cs{refstepcounter}
% Initialisierungen für ein nachfolgendes \cs{addcontentsline} durch. Wenn
% allerdings eine nicht nummerierte Überschrift ins Inhaltsverzeichnis
@@ -4129,7 +4259,7 @@
}%
\fi
}
-\AfterPackage!{hyperref}{\scr@chapter@after@hyperref@patch}
+\AfterAtEndOfPackage{hyperref}{\scr@chapter@after@hyperref@patch}
% \end{macrocode}
% \end{macro}%^^A \scr@after@hyperref@patch
% \end{macro}%^^A \scr@before@hyperref@patch
@@ -4683,11 +4813,22 @@
\expandafter\@maybeautodot\csname the#1\endcsname
\typeout{#1 \csname the#1\endcsname.}%
\ifx\@currenttocentry\@empty\else
+% \end{macrocode}
+% \selectlanguage{english}%
+% \changes{v3.31}{2020/06/06}{use \cs{\dots tocformat}}%
+%^^ATODO: move \cs{autodot} to the definition of \cs{\dots tocformat}
+% \selectlanguage{ngerman}%
+% \begin{macrocode}
+ \@ifundefined{#1tocformat}{%
+ \expandafter\gdef\csname #1tocformat\endcsname
+ {\csname the#1\endcsname}%
+ }{}%
\scr@ifundefinedorrelax{add#1tocentry}{%
\addtocentrydefault{#1}%
}{%
\@nameuse{add#1tocentry}%
- }{\csname the#1\endcsname}{\@currenttocentry}%
+ }{\csname\@ifundefined{#1tocformat}{the#1}{#1tocformat}\endcsname}%
+ {\@currenttocentry}%
\fi
% \end{macrocode}
% Für alle nicht nummerieten Überschriften dieser Ebene trotzdem die
@@ -6194,6 +6335,7 @@
beforeskip=-3.5ex \@plus -1ex \@minus -.2ex,%
afterskip=2.3ex \@plus.2ex,%
tocstyle=section,%
+%<book|report> tocindentfollows=chapter,%
%<article> tocindent=0pt,%
%<book|report> tocindent=1.5em,%
%<article> tocnumwidth=1.5em%
@@ -6242,6 +6384,7 @@
beforeskip=3.25ex \@plus1ex \@minus.2ex,%
afterskip=-1em,%
%<article> tocstyle=subsection,%
+ tocindentfollows=subsubsection,%
%<book|report> tocstyle=section,%
%<article> tocindent=7.0em,%
%<book|report> tocindent=10em,%
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkernel-tocstyle.dtx b/Master/texmf-dist/source/latex/koma-script/scrkernel-tocstyle.dtx
index c42af21aeba..d5e1f14710a 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrkernel-tocstyle.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrkernel-tocstyle.dtx
@@ -1,8 +1,7 @@
-% \CheckSum{1936}
% \iffalse meta-comment
% ======================================================================
% scrkernel-tocstyle.dtx
-% Copyright (c) Markus Kohm, 2015-2019
+% Copyright (c) Markus Kohm, 2015-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +19,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrkernel-tocstyle.dtx
-% Copyright (c) Markus Kohm, 2015-2019
+% Copyright (c) Markus Kohm, 2015-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -55,7 +54,7 @@
% Right brace \} Tilde \~}
%
% \iffalse
-%%% From File: $Id: scrkernel-tocstyle.dtx 3392 2019-11-19 09:37:46Z kohm $
+%%% From File: $Id: scrkernel-tocstyle.dtx 3507 2020-06-11 14:57:03Z kohm $
% The runs of run-time file generation:
%<preidentify>%%% (run: preidentify)
% - everything that is needed before selfidentification of resulting files
@@ -80,9 +79,9 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-11-19 10:37:46 +0100 (Tue, 19 Nov 2019) $
+ \filedate$Date: 2020-06-11 16:57:03 +0200 (Thu, 11 Jun 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
- \filerevision$Revision: 2254 $
+ \filerevision$Revision: 3507 $
\edef\reserved@a{%
\noexpand\endgroup
\noexpand\ProvidesFile{scrkernel-tocstyle.dtx}%
@@ -353,6 +352,97 @@
% \end{macrocode}
% \end{macro}%^^A \@RelaxTOCEntryOptions
%
+% \selectlanguage{english}
+% \begin{macro}{\@DefineTOCEntryListOption}
+% \changes{v3.31}{2020/06/11}{new (internal)}%^^A
+% Use \cs{DefineTOCEntryOption} to define an option that represents a list.
+% It has following parameters:
+% \begin{description}
+% \item[\marg{style}: \meta{string},] name of the entry style
+% \item[\marg{option}: \meta{string},] name of the option
+% \item[\oarg{default}: \meta{string},] default value of the option
+% \item[\marg{prefix}: \meta{string},] prefix of the macro to be defined
+% \item[\marg{postfix}: \meta{string},] postfix of the macro to be defined
+% \item[\marg{description}: \meta{String},] short description of the option
+% \item[\oarg{init}: \meta{code},] initialization of the option
+% \end{description}
+% Between the \meta{prefix} and \meta{postfix} automatically
+% \cs{scr@dte@current} will be added. A copy option using ``\texttt{:=}''
+% instead of ``\texttt{=}'' and an add (append) option using ``\texttt{+=}''
+% instead of ``\texttt{=}'' is also defined.
+% \begin{macrocode}
+%<*body>
+\newcommand*{\@DefineTOCEntryListOption}[2]{%
+ \kernel@ifnextchar [%]
+ {\@DefineTOCEntryListOptionWithDefault{#1}{#2}}
+ {\@DefineTOCEntryListOptionWithoutDefault{#1}{#2}}%
+}
+% \end{macrocode}
+% \begin{macro}{\@DefineTOCEntryListOptionWithoutDefault}
+% \changes{v3.31}{2020/06/11}{new (internal)}%^^A
+% This is the case without default value. So we only have to define
+% the three internal options, that manipulate a macro.
+% \begin{macrocode}
+\newcommand*{\@DefineTOCEntryListOptionWithoutDefault}[5]{%
+ \@TOCEntryStyleNeedsCommandByOption{#1}{#3}{#4}{#2}{#5}%
+ \@DefineTOCEntryOption{#1}{#2}{%
+ \expandafter\protected@edef\csname #3\scr@dte@current#4\endcsname{##1}%
+ \FamilyKeyStateProcessed
+ }%
+ \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
+ \scr@ifundefinedorrelax{#3##1#4}{\FamilyKeyStateUnknownValue}{%
+ \expandafter\let
+ \csname #3\scr@dte@current#4\expandafter\endcsname
+ \csname #3##1#4\endcsname
+ \FamilyKeyStateProcessed
+ }%
+ }%
+ \DefineFamilyKey[.dte]{KOMAarg}{#2+}{%
+ \expandafter\protected@edef\csname #2\scr@dte@current#4\endcsname{%
+ \csname #2\scr@dte@current#4\endcsname,##1}%
+ \FamilyKeyStateProcessed
+ }%
+ \edef\scr@dte@doopts{%
+ \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2:}\noexpand\do{#2+}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}%^^A \@DefineTOCEntryListOptionWithoutDefault
+% \begin{macro}{\@DefineTOCEntryListOptionWithDefault}
+% \changes{v3.31}{2020/06/11}{new (internal)}%^^A
+% This is the case with a default value. It's almost the same, but the
+% argument numbers and using \cs{DefineFamilyKey} with optional argument.
+% \begin{macrocode}
+\newcommand*{\@DefineTOCEntryListOptionWithDefault}{}
+\def\@DefineTOCEntryListOptionWithDefault#1#2[#3]#4#5#6{%
+ \@TOCEntryStyleNeedsCommandByOption{#1}{#4}{#5}{#2}{#6}%
+ \@DefineTOCEntryOption{#1}{#2}[{#3]}{%
+ \expandafter\protected@edef\csname #4\scr@dte@current#5\endcsname{##1}%
+ \FamilyKeyStateProcessed
+ }%
+ \DefineFamilyKey[.dte]{KOMAarg}{#2:}{%
+ \scr@ifundefinedorrelax{#4##1#5}{\FamilyKeyStateUnknownValue}{%
+ \expandafter\let
+ \csname #4\scr@dte@current#5\expandafter\endcsname
+ \csname #4##1#5\endcsname
+ \FamilyKeyStateProcessed
+ }%
+ }%
+ \DefineFamilyKey[.dte]{KOMAarg}{#2+}{%
+ \expandafter\protected@edef\csname #4\scr@dte@current#5\endcsname{%
+ \csname #4\scr@dte@current#5\endcsname,##1}%
+ \FamilyKeyStateProcessed
+ }%
+ \edef\scr@dte@doopts{%
+ \unexpanded\expandafter{\scr@dte@doopts}\noexpand\do{#2:}\noexpand\do{#2+}%
+ }%
+}
+%</body>
+% \end{macrocode}
+% \end{macro}%^^A \@DefineTOCEntryListOptionWithDefault
+% \end{macro}%^^A \@DefineTOCEntryListOption
+% \selectlanguage{ngerman}
+%
% \begin{macro}{\@DefineTOCEntryLengthOption}
% \changes{v3.20}{2015/12/04}{neu (intern)}%^^A
% Verwendet \cs{DefineTOCEntryOption}, um eine Option zu definieren, die ein
@@ -360,7 +450,7 @@
% \begin{description}
% \item[\marg{Stil}: \meta{String},] Name des Eintragsstils
% \item[\marg{Option}: \meta{String},] Name der Option
-% \item[\oarg{Wert}:] der Säumniswert der Option
+% \item[\oarg{Wert}: \meta{Länge},] der Säumniswert der Option
% \item[\marg{Prefix}: \meta{String},] Präfix des zu definierenden Makros
% \item[\marg{Postfix}: \meta{String},] Postfix des zu definierenden Makros
% \item[\marg{Erklärung}: \meta{String},] Erklärung der Option
@@ -1067,6 +1157,7 @@
\def\DefineTOCEntryCommandOption{\@DefineTOCEntryCommandOption{#1}}%
\def\DefineTOCEntryIfOption{\@DefineTOCEntryIfOption{#1}}%
\def\DefineTOCEntryLengthOption{\@DefineTOCEntryLengthOption{#1}}%
+ \def\DefineTOCEntryListOption{\@DefineTOCEntryListOption{#1}}%
\def\DefineTOCEntryNumberOption{\@DefineTOCEntryNumberOption{#1}}%
\def\DefineTOCEntryOption{\@DefineTOCEntryOption{#1}}%
\def\AddToDeclareTOCEntryStylePreCheckNeeds{%
@@ -1081,6 +1172,7 @@
\let\AddToDeclareTOCEntryStylePreCheckNeeds\relax
\let\DefineTOCEntryOption\relax
\let\DefineTOCEntryNumberOption\relax
+ \let\DefineTOCEntryListOption\relax
\let\DefineTOCEntryLengthOption\relax
\let\DefineTOCEntryIfOption\relax
\let\DefineTOCEntryCommandOption\relax
@@ -1450,12 +1542,29 @@
%<*tocline>
%%% (run: style,tocline)
\DeclareTOCEntryStyle{tocline}[{%
+%</tocline>
+% \end{macrocode}
+% \selectlanguage{english}%^^A
+% \changes{v3.31}{2020/06/09}{style \texttt{toctext} has also option
+% \texttt{beforeskip}}%^^A
+% \selectlanguage{ngerman}%^^A
+% \begin{macrocode}
+%<*tocline|toctext>
\DefineTOCEntryLengthOption{beforeskip}%
{scr@tso@}{@beforeskip}{vertical skip before the entry}%
+%</tocline|toctext>
+%<*tocline>
\DefineTOCEntryIfOption{breakafternumber}%
{scr@tso@}{@breakafternumber}{line break after number flag}%
\DefineTOCEntryIfOption{dynnumwidth}%
{scr@tso@}{@dynnumwidth}{dynamic number width flag}%
+% \end{macrocode}
+% \changes{v3.31}{2020/06/08}{option for indent follows list}%^^A
+% \begin{macrocode}
+ \DefineTOCEntryListOption{indentfollows}%
+ {scr@tso@}{@indentfollows}{list of levels that define the indent}%
+ \DefineTOCEntryIfOption{dynindent}%
+ {scr@tso@}{@dynindent}{dynamic indent width flag}%
%</tocline>
%<*tocline|toctext>
\DefineTOCEntryCommandOption{entryformat}%
@@ -1864,6 +1973,20 @@
\expandafter\providecommand\expandafter*%
\csname scr@tso@#1@beforeskip\endcsname{\glueexpr \z@ plus .2\p@\relax}%
}{}%
+%</tocline>
+% \end{macrocode}
+% \selectlanguage{english}%^^A
+% \changes{v3.31}{2020/06/09}{\texttt{beforeskip} default also for style
+% \texttt{toctext}}%^^A
+% For style \texttt{toctext} a default without glue is used to stay
+% compatible.
+% \selectlanguage{ngerman}%^^A
+% \begin{macrocode}
+%<*toctext>
+ \expandafter\providecommand\expandafter*%
+ \csname scr@tso@#1@beforeskip\endcsname{\z@}%
+%</toctext>
+%<*tocline>
% \end{macrocode}
% Es ist gut zu wissen, wie breit die breiteste Nummer ist, damit wir
% ggf. prüfen können, ob entsprechende Bedingungen eingehalten werden.
@@ -2014,6 +2137,22 @@
\csname scr@tso@#1@pagenumberbox\endcsname[1]{%
\hb@xt@\@nameuse{scr@dte@pagenumberwidth}{\hfil ##1}}%
\expandafter\providecommand\csname Ifscr@tso@#1@dynnumwidth\endcsname[2]{##2}%
+% \end{macrocode}
+% \selectlanguage{english}%
+% \changes{v3.31}{2020/06/08}{init indent follows list}%^^A
+% This command defines a list of levels that specify the indent (if not empty).
+% \selectlanguage{ngerman}%^^A
+% \begin{macrocode}
+ \expandafter\providecommand\csname Ifscr@tso@#1@dynindent\endcsname[2]{##2}%
+ \scr@ifundefinedorrelax{scr@tso@#1@indentfollows}{%
+ \Ifstrstart{#1}{sub}{%
+ \expandafter\edef\csname scr@tso@#1@indentfollows\endcsname{%
+ \scr@dte@nosub{#1}%
+ }%
+ }{%
+ \expandafter\let\csname scr@tso@#1@indentfollows\endcsname\@empty
+ }%
+ }{}%
%</tocline>
% \end{macrocode}
% \changes{v3.27}{2019/07/08}{Initialisierung von \texttt{raggedentry}}%^^A
@@ -2216,6 +2355,49 @@
\else
\tocbasic@DependOnPenaltyAndTOCLevel{#1}%
\addvspace{\@nameuse{scr@tso@#1@beforeskip}}\relax
+% \end{macrocode}
+% \selectlanguage{english}%
+% \changes{v3.31}{2020/06/08}{code for indent following list processing}%^^A
+% If a indent following list exists and the depth of an entry is lower than
+% the depth of the current entry, use the maximum of the ident + number width
+% for the indent of this entry.
+% \selectlanguage{ngerman}%^^A
+% \begin{macrocode}
+ \@nameuse{Ifscr@tso@#1@dynindent}{%
+ \expandafter\ifx\csname scr@tso@#1@indentfollows\endcsname\@empty
+ \PackageWarning{tocbasic}{`dynindent' for `#1' not available}%
+ \else
+ \edef\reserved@a{\@nameuse{scr@tso@#1@indentfollows}}%
+ \@for \reserved@a:=\reserved@a\do {%
+ \scr@trim@spaces\reserved@a
+ \ifx\reserved@a\@empty\else
+ \scr@ifundefinedorrelax{\reserved@a tocdepth}{%
+ }{%
+ \ifnum \@nameuse{\reserved@a tocdepth}<\@nameuse{#1tocdepth}%
+ \@tempdima\@nameuse{scr@tso@\reserved@a @indent}\relax
+ \@nameuse{Ifscr@tso@\reserved@a @dynnumwidth}{%
+ \scr@ifundefinedorrelax
+ {scr@dte@\reserved@a @lastmaxnumwidth}{%
+ \advance\@tempdima
+ \@nameuse{scr@tso@\reserved@a @numwidth}\relax
+ }{%
+ \advance\@tempdima
+ \@nameuse{scr@dte@\reserved@a @lastmaxnumwidth}\relax
+ }%
+ }{%
+ \advance\@tempdima
+ \@nameuse{scr@tso@\reserved@a @numwidth}\relax
+ }%
+ \ifdim \@tempdima>\@nameuse{scr@tso@#1@indent}\relax
+ \expandafter\edef\csname scr@tso@#1@indent\endcsname
+ {\the\@tempdima}%
+ \fi
+ \fi
+ }%
+ \fi
+ }%
+ \fi
+ }{}%
{%
\Iftocfeature{\@currext}{noindent}{%
\leftskip \z@
@@ -2442,8 +2624,11 @@
\@nameuse{scr@tso@#1@onstartentry}%
\else
% \end{macrocode}
-% In v-mode it is a new text entry.
+% \changes{v3.31}{2020/06/09}{use of option \texttt{beforeskip}}%^^A
+% In v-mode it is a new text entry. Before leaving v-mode the vertical space
+% is added.
% \begin{macrocode}
+ \addvspace{\@nameuse{scr@tso@#1@beforeskip}}%
\leavevmode
% \end{macrocode}
% The paragraph end has to be prepared to eventually change the right
@@ -2471,8 +2656,27 @@
}%
\rightskip \@nameuse{scr@tso@#1@rightindent}\relax
\parfillskip \z@ \@plus 1fill\relax
- \edef\@noitemerr{\unexpanded{\par\def\@noitemerr}%
- {\unexpanded\expandafter{\@noitemerr}}}%
+% \end{macrocode}
+% \changes{v3.31}{2020/06/09}{redefinition of \cs{addvspace}}%^^A
+% \changes{v3.31}{2020/06/09}{redefinition of \cs{addpenalty}}%^^A
+% Now, make sure, that the first non-\texttt{toctext} entry does do a \cs{par}
+% before it uses \cs{addpenalty} or \cs{addvspace}. Before version~3.31 this
+% has been done by redefining \cs{@noitemerr} but this does not work, because
+% it ignores the argument of \cs{addpenalty} or \cs{addvspace}. So, this more
+% dangerous solution has been made, that redefines \cs{addvspace} and
+% \cs{addpenalty} locally.
+% \begin{macrocode}
+ \ifx\addvspace\scr@dte@xaddvspace\else
+ \let\scr@dte@saddvspace\addvspace
+ \def\scr@dte@xaddvspace{%
+ \let\addvspace\scr@dte@saddvspace\par\addvspace}%
+ \let\addvspace\scr@dte@xaddvspace
+ \fi
+ \ifx\addpenalty\scr@dte@xaddpenalty\else
+ \let\scr@dte@saddpenalty\addpenalty
+ \def\scr@dte@xaddpenalty{%
+ \let\addpenalty\scr@dte@saddpenalty\par\addpenalty}%
+ \fi
% \end{macrocode}
% Finally the init code of the first entry has to be used.
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkernel-typearea.dtx b/Master/texmf-dist/source/latex/koma-script/scrkernel-typearea.dtx
index d49b9ba6406..ec6e89babfb 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrkernel-typearea.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrkernel-typearea.dtx
@@ -1,8 +1,7 @@
-%\CheckSum{2882}
% \iffalse meta-comment
% ======================================================================
% scrkernel-typearea.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +19,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrkernel-typearea.dtx
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -55,7 +54,7 @@
% Right brace \} Tilde \~}
%
% \iffalse meta-comment
-%%% From File: $Id: scrkernel-typearea.dtx 3390 2019-11-18 17:09:35Z kohm $
+%%% From File: $Id: scrkernel-typearea.dtx 3488 2020-04-27 13:04:43Z kohm $
%<identify>%%% (run: identify)
%<init>%%% (run: init)
%<options>%%% (run: options)
@@ -66,9 +65,9 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-11-18 18:09:35 +0100 (Mon, 18 Nov 2019) $
+ \filedate$Date: 2020-04-27 15:04:43 +0200 (Mon, 27 Apr 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
- \filerevision$Revision: 3390 $
+ \filerevision$Revision: 3488 $
\edef\reserved@a{%
\noexpand\endgroup
\noexpand\ProvidesFile{scrkernel-typearea.dtx}[%
@@ -1413,37 +1412,39 @@
% \begin{macrocode}
%<*class&body&!letter>
\if@scr@emulatestandardclasses
- \ifnum\@lastdiv=\z@
- \setlength{\textwidth}{\dimexpr \paperwidth-2in\relax}
- \ifdim \f@size\p@<10.5\p@
- \setlength{\@tempdimb}{345\p@}
- \else\ifdim \f@size\p@<11.5\p@
- \setlength{\@tempdimb}{360\p@}
- \else
- \setlength{\@tempdimb}{390\p@}
- \fi
- \fi
- \if@twocolumn
- \ifdim\@textwidth>2\@tempdimb\relax
- \setlength{\textwidth}{2\@tempdimb}
+ \Ifstr{\@lastdiv}{areaset}{}{%
+ \ifnum\@lastdiv=\z@
+ \setlength{\textwidth}{\dimexpr \paperwidth-2in\relax}
+ \ifdim \f@size\p@<10.5\p@
+ \setlength{\@tempdimb}{345\p@}
+ \else\ifdim \f@size\p@<11.5\p@
+ \setlength{\@tempdimb}{360\p@}
+ \else
+ \setlength{\@tempdimb}{390\p@}
+ \fi
\fi
- \else
- \ifdim\textwidth>\@tempdimb
- \setlength{\textwidth}{\@tempdimb}
+ \if@twocolumn
+ \ifdim\@textwidth>2\@tempdimb\relax
+ \setlength{\textwidth}{2\@tempdimb}
+ \fi
+ \else
+ \ifdim\textwidth>\@tempdimb
+ \setlength{\textwidth}{\@tempdimb}
+ \fi
\fi
+ \@settopoint\textwidth
+ \setlength{\@tempdima}{\dimexpr \paperheight-3.5in\relax}
+ \divide\@tempdima\baselineskip
+ \@tempcnta=\@tempdima
+ \setlength{\textheight}{\@tempcnta\baselineskip}
+ \addtolength{\textheight}{\topskip}
+ \edef\reserved@a{%
+ \noexpand\@areasetadvancedtrue
+ \noexpand\areaset[current]{\noexpand\textwidth}{\noexpand\textheight}%
+ \if@areasetadvanced\else\noexpand\@areasetadvancedfalse\fi
+ }\reserved@a
\fi
- \@settopoint\textwidth
- \setlength{\@tempdima}{\dimexpr \paperheight-3.5in\relax}
- \divide\@tempdima\baselineskip
- \@tempcnta=\@tempdima
- \setlength{\textheight}{\@tempcnta\baselineskip}
- \addtolength{\textheight}{\topskip}
- \edef\reserved@a{%
- \noexpand\@areasetadvancedtrue
- \noexpand\areaset[current]{\noexpand\textwidth}{\noexpand\textheight}%
- \if@areasetadvanced\else\noexpand\@areasetadvancedfalse\fi
- }\reserved@a
- \fi
+ }%
\fi
%</class&body&!letter>
% \end{macrocode}
@@ -1701,28 +1702,51 @@
% \end{option}
%
% \begin{option}{DIV}
-% \changes{v2.2a}{1995/01/25}{neue Option}%^^A
+% \changes{v2.2a}{1995/01/25}{new option}%^^A
% \changes{v2.95}{2002/12/04}{new implementation using \textsf{keyval}}%^^A
% \changes{v3.12}{2013/03/05}{status signaling using \cs{FamilyKeyState}}%^^A
% The value is written into the counter \cs{ta@div}. Several symbolic values
% are supported and have to be converted into a counter. Note, while loading
% the package symbolic values are nonsense.
+% \begin{macro}{\@lastdiv}
+% \changes{v3.30}{2020/03/24}{init the internal macro}%^^A
+% This internal macro stores the last value to option \texttt{DIV}. It is
+% initialized with \cs{relax}.
+% \begin{macrocode}
+%<package&typearea&init>\newcommand*{\@lastdiv}{\z@}\let\@lastdiv\relax
+% \end{macrocode}
+% \end{macro}%^^A \@lastdiv
% \begin{macrocode}
%<*package&typearea&options>
+\def\movet@reserved@a@to@nnil#1\@nnil{\def\reserved@a{#1}}%
\KOMA@key{DIV}[calc]{%
\edef\@tempa{#1}%
- \def\@tempb{last}\ifx\@tempa\@tempb\let\@tempa=\@lastdiv\fi
+ \def\@tempb{last}\ifx\@tempa\@tempb\let\@tempa=\@lastdiv
+ \ifx\@tempa\relax\def\@tempa{current}\fi
+ \fi
\def\@tempb{current}\ifx\@tempa\@tempb\else
\def\@tempb{default}\ifx\@tempa\@tempb\ta@div=\z@ \else
\def\@tempb{calc}\ifx\@tempa\@tempb\ta@div=\tw@ \else
\def\@tempb{classic}\ifx\@tempa\@tempb\ta@div=\thr@@ \else
- \ta@div=\@tempa
+ \expandafter\def\expandafter\@tempa\expandafter{\expandafter0\@tempa}%
+ \afterassignment\movet@reserved@a@to@nnil
+ \@tempcnta=\@tempa\relax\@nnil
+ \def\@tempb{\relax}\ifx\reserved@a\@tempb
+ \ta@div=\@tempcnta
+ \edef\@tempa{\the\ta@div}%
+ \else
+ \let\@tempa\relax
+ \fi
\fi
\fi
\fi
\fi
- \FamilyKeyStateProcessed
- \KOMA@kav@xreplacevalue{.typearea.\scr@pkgextension}{DIV}{#1}%
+ \ifx\@tempa\relax
+ \FamilyKeyStateUnknownValue
+ \else
+ \FamilyKeyStateProcessed
+ \KOMA@kav@xreplacevalue{.typearea.\scr@pkgextension}{DIV}{\@tempa}%
+ \fi
}
% \end{macrocode}
% After loading the package we have to do a little bit more, because we need
@@ -1836,6 +1860,8 @@
% the margin notes at the outer margin. But if the typing area is to narrow
% for the margin note column, the width of margin note column will be
% reduced. This can be done easily be swapping the two lengths.
+% \changes{v3.30}{2020/02/25}{orphan line break at end of warning message
+% removed}%^^A
% \begin{macrocode}
\if@mincl
\advance\textwidth by-\marginparwidth
@@ -1846,7 +1872,7 @@
marginpar (\the\marginparwidth) while using option\MessageBreak
`mpinclude'.\MessageBreak
Because of this, I'm exchanging the values.\MessageBreak
- You should increase DIV to avoid such problems.\MessageBreak
+ You should increase DIV to avoid such problems%
}%
\@tempskipa=\marginparwidth
\marginparwidth=\textwidth
@@ -2120,8 +2146,10 @@
% \changes{v2.8q}{2001/11/06}{new symbolic value \texttt{last}}%^^A
% \changes{v2.96}{2006/08/21}{warn if \cs{typearea} is used inside a
% group}%^^A
-% \changes{v3.10}{2011/09/13}{using \cs{scr@grouplevel@test}}
+% \changes{v3.10}{2011/09/13}{using \cs{scr@grouplevel@test}}%^^A
% \changes{v3.12}{2013/03/26}{page footer height configurable}%^^A
+% \changes{v3.30}{2020/03/24}{\texttt{current} after \cs{areaset} is
+% \texttt{areaset}}%^^A
%
% The symbolic values of the obligatory argument of \cs{typearea}:
% \begin{center}\begin{tabular}{lll}
@@ -2145,14 +2173,16 @@
\fi
\edef\@tempa{#2}%
\def\@tempb{last}\ifx\@tempa\@tempb\let\@tempa=\@lastdiv
- \ifx\csname @tempa\endcsname\relax
- \def\@tempa{current}%
- \fi
+ \ifx\@tempa\relax \def\@tempa{current}\fi
\fi
+ \Ifstr{\@tempa}{current}{%
+ \Ifstr{\@lastdiv}{areaset}{\let\@tempa\@lastdiv}{}%
+ }{}%
\def\@tempb{areaset}\ifx\@tempa\@tempb
\areaset[current]{\textwidth}{\textheight}%
\else
- \def\@tempb{current}\ifx\@tempa\@tempb\else
+ \def\@tempb{current}\ifx\@tempa\@tempb
+ \else
\def\@tempb{default}\ifx\@tempa\@tempb\ta@div=\z@ \else
\def\@tempb{calc}\ifx\@tempa\@tempb\ta@div=\tw@ \else
\def\@tempb{classic}\ifx\@tempa\@tempb\ta@div=\thr@@ \else
@@ -3119,8 +3149,18 @@
% \cs{ProcessOptions}).
% \changes{v3.22}{2016/07/29}{missing deprecated option warning added}%^^A
% \changes{v3.28}{2019/11/18}{\cs{ifdimen} renamed to \cs{Ifdimen}}%^^A
-% \begin{macrocode}
-%<class> \PassOptionsToPackage{BCOR#2}{typearea}%
+% \changes{v3.30}{2020/03/24}{avoid error message for unknown \texttt{BCOR}
+% value to \cs{documentclass}}%^^A
+% \changes{v3.31}{2020/04/27}{improved valid value recognization}%^^A
+% \begin{macrocode}
+%<*class>
+ \Ifstrstart{#2}{=}{%
+ \edef\reserved@a{\noexpand\Ifdimen{\@gobble#2}}%
+ \reserved@a{\PassOptionsToPackage{BCOR#2}{typearea}}{\OptionNotUsed}%
+ }{%
+ \Ifdimen{#2}{\PassOptionsToPackage{BCOR#2}{typearea}}{\OptionNotUsed}%
+ }%
+%</class>
%<*package>
\Ifdimen{#2}{%
\KOMA@UseDeprecatedOption{%
@@ -3145,6 +3185,9 @@
% Mustererkennung ersetzt}%^^A
% \changes{v3.22}{2016/07/29}{missing deprecated option warning added}%^^A
% \changes{v3.28}{2019/11/18}{\cs{ifnumber} umbenannt in \cs{Ifnumber}}%^^A
+% \changes{v3.30}{2020/03/24}{avoid error message for unknown \texttt{DIV}
+% value to \cs{documentclass}}%^^A
+% \changes{v3.31}{2020/04/27}{improved valid value recognization}%^^A
% Die grundsätzliche Funktion ist die gleiche wie bei \cs{@BCOR},
% \cs{@@BCOR}.
% \begin{macrocode}
@@ -3153,7 +3196,14 @@
\def\@@DIV #1DIV#2DIV#3\@@DIV{%
\edef\@tempa{#1}\ifx\@tempa\@empty
\edef\@tempa{#3}\def\@tempb{DIV}\ifx\@tempa\@tempb
-%<class> \PassOptionsToPackage{DIV#2}{typearea}%
+%<*class>
+ \Ifstrstart{#2}{=}{%
+ \edef\reserved@a{\noexpand\Ifnumber{\@gobble#2}}%
+ \reserved@a{\PassOptionsToPackage{DIV#2}{typearea}}{\OptionNotUsed}%
+ }{%
+ \Ifnumber{#2}{\PassOptionsToPackage{DIV#2}{typearea}}{\OptionNotUsed}%
+ }%
+%</class>
%<*package>
\Ifnumber{#2}{%
\KOMA@UseDeprecatedOption{%
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkernel-version.dtx b/Master/texmf-dist/source/latex/koma-script/scrkernel-version.dtx
index f7ba6495275..8b1383e76c4 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrkernel-version.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrkernel-version.dtx
@@ -55,7 +55,7 @@
% Right brace \} Tilde \~}
%
% \iffalse
-%%% From File: $Id: scrkernel-version.dtx 3449 2020-01-24 07:28:10Z kohm $
+%%% From File: $Id: scrkernel-version.dtx 3545 2020-09-21 07:45:07Z kohm $
% \fi
%
% \iffalse
@@ -123,7 +123,7 @@
\fi
%</ignorethis>
\fi
- \@CheckKOMAScriptVersion{2020/01/24 v3.29 KOMA-Script}%
+ \@CheckKOMAScriptVersion{2020/09/21 v3.32 KOMA-Script}%
\endgroup
% \end{macrocode}
% \end{macro}
diff --git a/Master/texmf-dist/source/latex/koma-script/scrlayer-notecolumn.dtx b/Master/texmf-dist/source/latex/koma-script/scrlayer-notecolumn.dtx
index f97ad15f501..d0c33a8c927 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrlayer-notecolumn.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrlayer-notecolumn.dtx
@@ -1,8 +1,7 @@
-% \CheckSum{1863}
% \iffalse^^A meta-comment
% ======================================================================
% scrlayer-notecolumn.dtx
-% Copyright (c) Markus Kohm, 2013-2019
+% Copyright (c) Markus Kohm, 2013-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +19,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrlayer-notecolumn.dtx
-% Copyright (c) Markus Kohm, 2013-2019
+% Copyright (c) Markus Kohm, 2013-2020
%
% Diese Datei ist Teil der LaTeX2e KOMA-Script-Sammlung.
%
@@ -38,26 +37,8 @@
%
% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
% ======================================================================
-% \fi^^A meta-comment
-%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
%
-% \iffalse^^A meta-comment
-%%% From File: $Id: scrlayer-notecolumn.dtx 3426 2019-12-02 09:15:20Z kohm $
+%%% From File: $Id: scrlayer-notecolumn.dtx 3533 2020-09-11 13:32:10Z kohm $
%<identify>%%% (run: identify)
%<init>%%% (run: init)
%<options>%%% (run: options)
@@ -67,9 +48,9 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-12-02 10:15:20 +0100 (Mon, 02 Dec 2019) $
+ \filedate$Date: 2020-09-11 15:32:10 +0200 (Fri, 11 Sep 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{v0.3.#2}}
- \filerevision$Revision: 3426 $
+ \filerevision$Revision: 3533 $
\edef\reserved@a{%
\noexpand\endgroup
\noexpand\ProvidesFile{scrlayer-notecolumn.dtx}%
@@ -204,6 +185,7 @@
% \selectlanguage{english}
%
% \changes{v0.0}{2013/04/26}{start of interface}
+% \changes{v0.3.3532}{2020/09/11}{do not use deprecated interface commands}
%
% \StopEventually{}
%
@@ -285,8 +267,7 @@
% column needs.
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\DeclareNoteColumn{%
- \newcommand*{\DeclareNoteColumn}[2][]{%
+\newcommand*{\DeclareNoteColumn}[2][]{%
% \end{macrocode}
% First of all we need a box register. The contents of the note column will be
% build inside of this register. Since \eTeX{} registers shouldn't be a
@@ -294,131 +275,91 @@
% registers. Note, that the registers will stay allocated, if the interface
% will be removed! Nevertheless, the name will be destroyed!
% \begin{macrocode}
- \@ifundefined{slnc@#2@box}{%
- \expandafter\newsavebox\csname slnc@#2@box\endcsname
- \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{%
- \expandafter\let\csname slnc@#2@box\endcsname\relax
- }%
- }{}%
+ \@ifundefined{slnc@#2@box}{%
+ \expandafter\newsavebox\csname slnc@#2@box\endcsname
+ }{}%
% \end{macrocode}
% There's also a kind of item stack of unprocessed notes for each note column.
% \begin{macrocode}
- \@ifundefined{slnc@#2@unprocessed}{%
- \@namedef{slnc@#2@unprocessed}{}%
- \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{%
- \expandafter\let\csname slnc@#2@unprocessed\endcsname\relax
- }%
- }{}%
+ \@ifundefined{slnc@#2@unprocessed}{%
+ \@namedef{slnc@#2@unprocessed}{}%
+ }{}%
% \end{macrocode}
% Next we need a horizontal positions and a width for the note column. Neither
% the horizontal position nor the width are stretchable or shrinkable. The
% position should be variable depending on the page. So it's better to use a
% macro instead of a length. The width isn't more variable than, e.g., the
% text width. So we can use a macro too. Both will be initialised to the
-% normal marginal note column.
-% \begin{macrocode}
- \@ifundefined{slnc@#2@pos}{%
- \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{%
- \expandafter\let\csname slnc@#2@pos\endcsname\relax
- }%
- }{}%
- \@ifundefined{slnc@#2@width}{%
- \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{%
- \expandafter\let\csname slnc@#2@width\endcsname\relax
- }%
- }{}%
-% \end{macrocode}
+% normal marginal note column later.
% \changes{3.27}{2019/02/14}{initialization of one colour stack per note
% column}%^^A
% For colour support we also need one colour stack per note column. A colour
% stack is a feature only available for pdf\TeX{} and lua\TeX{}.
% \begin{macrocode}
- \@ifundefined{slnc@#2@colorstack}{%
- \scr@ifundefinedorrelax{pdfcolorstackinit}{%
- \scr@ifundefinedorrelax{pdffeedback}{}{%
- \expandafter\chardef\csname slnc@#2@colorstack\endcsname=
- \pdffeedback colorstackinit direct {\slnc@initial@black}%
- \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{%
- \expandafter\let\csname slnc@#2@colorstack\endcsname\relax
- }%
- }%
- }{%
+ \@ifundefined{slnc@#2@colorstack}{%
+ \scr@ifundefinedorrelax{pdfcolorstackinit}{%
+ \scr@ifundefinedorrelax{pdffeedback}{}{%
\expandafter\chardef\csname slnc@#2@colorstack\endcsname=
- \pdfcolorstackinit direct {\slnc@initial@black}%
- \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{%
- \expandafter\let\csname slnc@#2@colorstack\endcsname\relax
- }%
+ \pdffeedback colorstackinit direct {\slnc@initial@black}%
}%
- }{}%
+ }{%
+ \expandafter\chardef\csname slnc@#2@colorstack\endcsname=
+ \pdfcolorstackinit direct {\slnc@initial@black}%
+ }%
+ }{}%
% \end{macrocode}
% If there isn't a font element for the (new) note column, we define a new one
% and add it to the auto-remove code:
% \begin{macrocode}
- \@ifundefined{scr@fnt@notecolumn.#2}{%
- \@ifundefined{@notecolumn.#2font}{%
- \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{%
- \expandafter\let\csname @notecolumn.#2font\endcsname\relax
- }%
- }{%
- \PackageInfo{scrlayer-notecolumn}{using already defined
- macro\MessageBreak
- `\expandafter\string\csname @notecolumn.#2font\endcsname' for font
- element\MessageBreak
- `notecolumn.#2'%
- }%
- }%
- \newkomafont{notecolumn.#2}{}%
- \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{%
- \expandafter\let\csname scr@fnt@notecolumn.#2\endcsname\relax
- }%
- }{%
- \PackageInfo{scrlayer-notecolumn}{using already defined font
+ \@ifundefined{scr@fnt@notecolumn.#2}{%
+ \@ifundefined{@notecolumn.#2font}{}{%
+ \PackageInfo{scrlayer-notecolumn}{using already defined
+ macro\MessageBreak
+ `\expandafter\string\csname @notecolumn.#2font\endcsname' for font
element\MessageBreak
`notecolumn.#2'%
}%
}%
+ \newkomafont{notecolumn.#2}{}%
+ }{%
+ \PackageInfo{scrlayer-notecolumn}{using already defined font
+ element\MessageBreak
+ `notecolumn.#2'%
+ }%
+ }%
% \end{macrocode}
% After the initialisation we process the options, that may change the initial
% values.
% \begin{macrocode}
- \newcommand*{\slnc@name}{}%
- \edef\slnc@name{#2}%
- \FamilyExecuteOptions[.definenotecolumn]{KOMAarg}{marginpar,#1}%
- \let\slnc@name\relax
+ \newcommand*{\slnc@name}{}%
+ \edef\slnc@name{#2}%
+ \FamilyExecuteOptions[.definenotecolumn]{KOMAarg}{marginpar,#1}%
+ \let\slnc@name\relax
% \end{macrocode}
% The values are set up, so they may be used to declare a layer.
% \begin{macrocode}
- \DeclareLayer[%
- foreground,%
- align=tl,%
- voffset=1in+\topmargin+\headheight+\headsep,%
- height=\dimexpr\textheight+\topskip\relax,%
- hoffset=\csname slnc@#2@pos\endcsname,%
- width=\csname slnc@#2@width\endcsname,%
- contents=\slnc@processnotes{#2}%
- ]{notecolumn.#2}
+ \DeclareLayer[%
+ foreground,%
+ align=tl,%
+ voffset=1in+\topmargin+\headheight+\headsep,%
+ height=\dimexpr\textheight+\topskip\relax,%
+ hoffset=\csname slnc@#2@pos\endcsname,%
+ width=\csname slnc@#2@width\endcsname,%
+ contents=\slnc@processnotes{#2}%
+ ]{notecolumn.#2}
% \end{macrocode}
% We need to add the layer to every page style. The easiest way to do this is
% to add it to the pseudo layer page style \Pagestyle{@everystyle@}.
% \changes{v0.1.1681}{2014/02/05}{add the layer only once}
% \begin{macrocode}
- \IfLayerAtPageStyle{@everystyle@}{notecolumn.#2}{}{%
- \AddLayersToPageStyle{@everystyle@}{notecolumn.#2}%
-% \end{macrocode}
-% On auto-removing the interface, the layer should be removed from
-% \Pagestyle{@everystyle@} and should be destroyed.
-% \begin{macrocode}
- }%
- \scrlayerOnAutoRemoveInterface[scrlayer-notecolumn.sty]{%
- \RemoveLayersFromPageStyle{@everystyle@}{notecolumn.#2}%
- \DestroyLayer{notecolumn.#2}%
- }%
+ \IfLayerAtPageStyle{@everystyle@}{notecolumn.#2}{}{%
+ \AddLayersToPageStyle{@everystyle@}{notecolumn.#2}%
+ }%
% \end{macrocode}
% Last but not least, we add the new note column to the note column procession
% list.
% \begin{macrocode}
- \@cons\slnc@processnotecolumns{{#2}}%
- }%
+ \@cons\slnc@processnotecolumns{{#2}}%
}
% \end{macrocode}
% \begin{macro}{\slnc@initial@black}
@@ -429,26 +370,22 @@
% \cs{current@color} of the used colour package. Using \cs{default@color} would
% be even better, but this is not available until \cs{begin\{document\}}.
% \begin{macrocode}
-\scrlayerAddToInterface\slnc@initial@black{%
- \newcommand*{\slnc@initial@black}{0 g 0 G}%
- \AfterPackage*{color}{%
- \let\slnc@initial@black\current@color
- \AtBeginDocument{\let\slnc@initial@black\default@color}%
- }%
- \AfterPackage*{xcolor}{%
- \let\slnc@initial@black\current@color
- \AtBeginDocument{\let\slnc@initial@black\default@color}%
- }%
-}
+\newcommand*{\slnc@initial@black}{0 g 0 G}%
+\AfterPackage*{color}{%
+ \let\slnc@initial@black\current@color
+ \AtBeginDocument{\let\slnc@initial@black\default@color}%
+}%
+\AfterPackage*{xcolor}{%
+ \let\slnc@initial@black\current@color
+ \AtBeginDocument{\let\slnc@initial@black\default@color}%
+}%
% \end{macrocode}
% \end{macro}%^^A \slnc@initial@black
% \begin{macro}{\slnc@processnotecolumns}
% This is a list of all declared note columns in \LaTeX{} syntax (using
% \Macro{@cons} and \Macro{@elt} etc.).
% \begin{macrocode}
-\scrlayerAddToInterface\slnc@processnotecolumns{%
- \newcommand*{\slnc@processnotecolumns}{}%
-}
+\newcommand*{\slnc@processnotecolumns}{}%
% \end{macrocode}
% \end{macro}%^^A \slnc@processnotecolumns
% \begin{macrocode}
@@ -466,18 +403,16 @@
% extended by the note column layers. So we warn, if another page style has
% been selected.
% \begin{macrocode}
-\scrlayerAddToInterface\slnc@testforpagestylewarning{%
- \newcommand*{\slnc@testforpagestylewarning}{%
- \IfLayerPageStyleExists{\currentpagestyle}{}{%
- \PackageWarning{scrlayer-notecolumn}{%
- output of note columns delayed,\MessageBreak
- because with `\currentpagestyle'\MessageBreak
- a page style has been selected, that\MessageBreak
- isn't a layer page style,%
- }%
+\newcommand*{\slnc@testforpagestylewarning}{%
+ \IfLayerPageStyleExists{\currentpagestyle}{}{%
+ \PackageWarning{scrlayer-notecolumn}{%
+ output of note columns delayed,\MessageBreak
+ because with `\currentpagestyle'\MessageBreak
+ a page style has been selected, that\MessageBreak
+ isn't a layer page style,%
}%
}%
-}
+}%
\AfterSelectAnyPageStyle{\slnc@testforpagestylewarning}
% \end{macrocode}
% \end{macro}%^^A \slnc@testforpagestylewarning
@@ -495,79 +430,69 @@
\@namedef{slnc@\slnc@name @pos}{\dimexpr #1\relax}%
\FamilyKeyStateProcessed
}
-\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@position}
-\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@position@default}
\DefineFamilyKey[.definenotecolumn]{KOMAarg}{width}{%
\@namedef{slnc@\slnc@name @width}{\dimexpr #1\relax}%
\FamilyKeyStateProcessed
}
-\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@width}
-\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@width@default}
\DefineFamilyKey[.definenotecolumn]{KOMAarg}{font}{%
\setkomafont{notecolumn.\slnc@name}{#1}%
\FamilyKeyStateProcessed
}
-\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@font}
-\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@font@default}
\DefineFamilyKey[.definenotecolumn]{KOMAarg}{marginpar}[\relax]{%
\FamilyKeyStateProcessed
\scrlayer@testunexpectedarg{marginpar}{#1}%
\edef\reserved@a{\noexpand\slnc@defpos{\slnc@name}}\reserved@a
\@namedef{slnc@\slnc@name @width}{\marginparwidth}%
}
-\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@marginpar}
-\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@marginpar@default}
% \end{macrocode}
% \begin{macro}{\slnc@defpos}
% Little helper for option \Option{marginpar}. The argument is the expanded
% name of the note column.
% \begin{macrocode}
-\scrlayerAddToInterface\slnc@defpos{%
- \newcommand*\slnc@defpos[1]{%
- \@namedef{slnc@#1@pos}{%
- \ifodd\value{page}
- \if@reversemargin
+\newcommand*\slnc@defpos[1]{%
+ \@namedef{slnc@#1@pos}{%
+ \ifodd\value{page}
+ \if@reversemargin
% \end{macrocode}
% The reverse marginal note column on odd pages is at the left margin.
% \begin{macrocode}
- \dimexpr \oddsidemargin+1in
- -\marginparsep-\csname slnc@#1@width\endcsname\relax
- \else
+ \dimexpr \oddsidemargin+1in
+ -\marginparsep-\csname slnc@#1@width\endcsname\relax
+ \else
% \end{macrocode}
% The normal marginal note column on odd pages is the right margin.
% \begin{macrocode}
- \dimexpr \oddsidemargin+1in
- +\textwidth+\marginparsep\relax
- \fi
- \else
- \if@twoside
- \if@reversemargin
+ \dimexpr \oddsidemargin+1in
+ +\textwidth+\marginparsep\relax
+ \fi
+ \else
+ \if@twoside
+ \if@reversemargin
% \end{macrocode}
% The reverse marginal note column on even pages is the right margin.
% \begin{macrocode}
- \dimexpr \evensidemargin+1in
- +\textwidth+\marginparsep\relax
- \else
+ \dimexpr \evensidemargin+1in
+ +\textwidth+\marginparsep\relax
+ \else
% \end{macrocode}
% The normal marginal note column on even pages is at the left margin.
% \begin{macrocode}
- \dimexpr \evensidemargin+1in
- -\marginparsep-\csname slnc@#1@width\endcsname\relax
- \fi
- \else
+ \dimexpr \evensidemargin+1in
+ -\marginparsep-\csname slnc@#1@width\endcsname\relax
+ \fi
+ \else
% \end{macrocode}
% \begin{macrocode}
% If not in two-side mode, do the same already done for odd pages.
- \if@reversemargin
- \dimexpr \oddsidemargin+1in
- -\marginparsep-\csname slnc@#1@width\endcsname\relax
- \else
- \dimexpr \oddsidemargin+1in
- +\textwidth+\marginparsep\relax
- \fi
+ \if@reversemargin
+ \dimexpr \oddsidemargin+1in
+ -\marginparsep-\csname slnc@#1@width\endcsname\relax
+ \else
+ \dimexpr \oddsidemargin+1in
+ +\textwidth+\marginparsep\relax
\fi
\fi
- }%
+ \fi
}%
}%
% \end{macrocode}
@@ -579,38 +504,34 @@
\edef\reserved@a{\noexpand\slnc@defnormalpos{\slnc@name}}\reserved@a
\@namedef{slnc@\slnc@name @width}{\marginparwidth}%
}
-\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@normalmarginpar}
-\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@normalmarginpar@default}
% \end{macrocode}
% \begin{macro}{\slnc@defnormalpos}
% Little helper for option \Option{normalmarginpar}. The argument is the
% expanded name of the note column.
% \begin{macrocode}
-\scrlayerAddToInterface\slnc@defnormalpos{%
- \newcommand*\slnc@defnormalpos[1]{%
- \@namedef{slnc@#1@pos}{%
- \ifodd\value{page}
+\newcommand*\slnc@defnormalpos[1]{%
+ \@namedef{slnc@#1@pos}{%
+ \ifodd\value{page}
% \end{macrocode}
% The normal marginal note column on odd pages is the right margin.
% \begin{macrocode}
- \dimexpr \oddsidemargin+1in
- +\textwidth+\marginparsep\relax
- \else
- \if@twoside
+ \dimexpr \oddsidemargin+1in
+ +\textwidth+\marginparsep\relax
+ \else
+ \if@twoside
% \end{macrocode}
% The normal marginal note column on even pages is at the left margin.
% \begin{macrocode}
- \dimexpr \evensidemargin+1in
- -\marginparsep-\csname slnc@#1@width\endcsname\relax
- \else
+ \dimexpr \evensidemargin+1in
+ -\marginparsep-\csname slnc@#1@width\endcsname\relax
+ \else
% \end{macrocode}
% \begin{macrocode}
% If not in two-side mode, do the same already done for odd pages.
- \dimexpr \oddsidemargin+1in
- +\textwidth+\marginparsep\relax
- \fi
+ \dimexpr \oddsidemargin+1in
+ +\textwidth+\marginparsep\relax
\fi
- }%
+ \fi
}%
}%
% \end{macrocode}
@@ -622,38 +543,34 @@
\edef\reserved@a{\noexpand\slnc@defreversepos{\slnc@name}}\reserved@a
\@namedef{slnc@\slnc@name @width}{\marginparwidth}%
}
-\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@reversemarginpar}
-\scrlayer@AddCsToInterface{KV@KOMAarg.definenotecolumn@reversemarginpar@default}
% \end{macrocode}
% \begin{macro}{\slnc@defreversepos}
% Little helper for option \Option{reversemarginpar}. The argument is the
% expanded name of the note column.
% \begin{macrocode}
-\scrlayerAddToInterface\slnc@defreversepos{%
- \newcommand*\slnc@defreversepos[1]{%
- \@namedef{slnc@#1@pos}{%
- \ifodd\value{page}
+\newcommand*\slnc@defreversepos[1]{%
+ \@namedef{slnc@#1@pos}{%
+ \ifodd\value{page}
% \end{macrocode}
% The reverse marginal note column on odd pages is at the left margin.
% \begin{macrocode}
- \dimexpr \oddsidemargin+1in
- -\marginparsep-\csname slnc@#1@width\endcsname\relax
- \else
- \if@twoside
+ \dimexpr \oddsidemargin+1in
+ -\marginparsep-\csname slnc@#1@width\endcsname\relax
+ \else
+ \if@twoside
% \end{macrocode}
% The reverse marginal note column on even pages is the right margin.
% \begin{macrocode}
- \dimexpr \evensidemargin+1in
- +\textwidth+\marginparsep\relax
- \else
+ \dimexpr \evensidemargin+1in
+ +\textwidth+\marginparsep\relax
+ \else
% \end{macrocode}
% \begin{macrocode}
% If not in two-side mode, do the same already done for odd pages.
- \dimexpr \oddsidemargin+1in
- -\marginparsep-\csname slnc@#1@width\endcsname\relax
- \fi
+ \dimexpr \oddsidemargin+1in
+ -\marginparsep-\csname slnc@#1@width\endcsname\relax
\fi
- }%
+ \fi
}%
}%
% \end{macrocode}
@@ -676,48 +593,42 @@
% (not) been declared already.
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\DeclareNewNoteColumn{%
- \newcommand*{\DeclareNewNoteColumn}[2][]{%
- \scr@ifundefinedorrelax{slnc@#2@box}{}{%
- \PackageError{scrlayer-notecolumn}{note column `#2' already defined}{%
- You may declare only note columns, that haven't been declared
- previously using\MessageBreak
- \string\DeclareNewNoteColumn. See also the alternatives
- \string\RedeclareNoteColumn,\MessageBreak
- \string\ProvideNoteColumn, and \string\DeclareNoteColumn.\MessageBreak
- Nevertheless, if you'll continue, declaration will be done.%
- }%
- }%
- \DeclareNoteColumn[{#1}]{#2}%
- }%
-}
-\scrlayerAddToInterface\ProvideNoteColumn{%
- \newcommand*{\ProvideNoteColumn}[2][]{%
- \scr@ifundefinedorrelax{slnc@#2@box}{}{%
- \PackageInfo{scrlayer-notecolumn}{\string\ProvideNoteColumn{#2}
- ignored,\MessageBreak
- because of already defined\MessageBreak
- not column}%
- }{%
- \DeclareNoteColumn[{#1}]{#2}%
+\newcommand*{\DeclareNewNoteColumn}[2][]{%
+ \scr@ifundefinedorrelax{slnc@#2@box}{}{%
+ \PackageError{scrlayer-notecolumn}{note column `#2' already defined}{%
+ You may declare only note columns, that haven't been declared
+ previously using\MessageBreak
+ \string\DeclareNewNoteColumn. See also the alternatives
+ \string\RedeclareNoteColumn,\MessageBreak
+ \string\ProvideNoteColumn, and \string\DeclareNoteColumn.\MessageBreak
+ Nevertheless, if you'll continue, declaration will be done.%
}%
}%
-}
-\scrlayerAddToInterface\RedeclareNoteColumn{%
- \newcommand*{\RedeclareNoteColumn}[2][]{%
- \scr@ifundefinedorrelax{slnc@#2@box}{%
- \PackageError{scrlayer-notecolumn}{note column `#2' undefined}{%
- You may declare only note columns, that have been declared
- previously using\MessageBreak
- \string\RedeclareNoteColumn. See also the alternatives
- \string\DeclareNewNoteColumn,\MessageBreak
- \string\ProvideNoteColumn, and \string\DeclareNoteColumn.\MessageBreak
- Nevertheless, if you'll continue, declaration will be done.%
- }%
- }{}%
+ \DeclareNoteColumn[{#1}]{#2}%
+}%
+\newcommand*{\ProvideNoteColumn}[2][]{%
+ \scr@ifundefinedorrelax{slnc@#2@box}{}{%
+ \PackageInfo{scrlayer-notecolumn}{\string\ProvideNoteColumn{#2}
+ ignored,\MessageBreak
+ because of already defined\MessageBreak
+ not column}%
+ }{%
\DeclareNoteColumn[{#1}]{#2}%
}%
-}
+}%
+\newcommand*{\RedeclareNoteColumn}[2][]{%
+ \scr@ifundefinedorrelax{slnc@#2@box}{%
+ \PackageError{scrlayer-notecolumn}{note column `#2' undefined}{%
+ You may declare only note columns, that have been declared
+ previously using\MessageBreak
+ \string\RedeclareNoteColumn. See also the alternatives
+ \string\DeclareNewNoteColumn,\MessageBreak
+ \string\ProvideNoteColumn, and \string\DeclareNoteColumn.\MessageBreak
+ Nevertheless, if you'll continue, declaration will be done.%
+ }%
+ }{}%
+ \DeclareNoteColumn[{#1}]{#2}%
+}%
%</body>
% \end{macrocode}
% \end{macro}
@@ -743,28 +654,24 @@
% interface!
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\tf@slnc{%
- \newwrite\tf@slnc
- \AtBeginDocument{%
- \if@filesw
- \immediate\write\@auxout{%
- \noexpand\csname slnc@initwrite\noexpand\endcsname
- }%
- \fi
- }%
- \AtEndDocument{\let\slnc@initwrite\slnc@openwrite}%
-}
-\scrlayerAddToInterface\slnc@initwrite{}%
-\scrlayerAddToInterface\slnc@openwrite{%
- \newcommand*{\slnc@openwrite}{%
- \immediate\closein\slnc@file
+\newwrite\tf@slnc
+\AtBeginDocument{%
+ \if@filesw
+ \immediate\write\@auxout{%
+ \noexpand\csname slnc@initwrite\noexpand\endcsname
+ }%
+ \fi
+}%
+\AtEndDocument{\let\slnc@initwrite\slnc@openwrite}%
+\newcommand*{\slnc@initwrite}{}%
+\newcommand*{\slnc@openwrite}{%
+ \immediate\closein\slnc@file
%<*trace>
- \PackageInfo{scrlayer-notecolumn}{%
- Opening `\jobname.slnc'\MessageBreak
- for writing}%
+ \PackageInfo{scrlayer-notecolumn}{%
+ Opening `\jobname.slnc'\MessageBreak
+ for writing}%
%</trace>
- \immediate\openout\tf@slnc\jobname.slnc
- }%
+ \immediate\openout\tf@slnc\jobname.slnc
}
% \end{macrocode}
% After reading the main \File{aux}-file at |\end{document}|, we again
@@ -847,28 +754,23 @@
% \changes{0.1.2583}{2017/02/08}{new (internal)}%^^A
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\slnc@unexpanded{%
- \let\slnc@unexpanded\detokenize
-}
-\scrlayerAddToInterface\makenote{%
- \newcommand*{\makenote}{%
- \kernel@ifstar{\let\slnc@unexpanded\detokenize\slnc@makenote}%
- {\let\slnc@unexpanded\@firstofone\slnc@makenote}%
- }%
-}
-\scrlayerAddToInterface\slnc@makenote{%
- \newcommand{\slnc@makenote}[2][marginpar]{%
- \@bsphack
- \scr@savepos
- \addtocontents{slnc}{%
- \string\slnc@note{#1}%
- {\noexpand\number\value{slncpage}}%
- {\noexpand\number\scr@lastypos}%
- {\slnc@unexpanded{#2}}%
- }%
- \@esphack
+\newcommand*{\slnc@unexpanded}{}
+\let\slnc@unexpanded\detokenize
+\newcommand*{\makenote}{%
+ \kernel@ifstar{\let\slnc@unexpanded\detokenize\slnc@makenote}%
+ {\let\slnc@unexpanded\@firstofone\slnc@makenote}%
+}%
+\newcommand{\slnc@makenote}[2][marginpar]{%
+ \@bsphack
+ \scr@savepos
+ \addtocontents{slnc}{%
+ \string\slnc@note{#1}%
+ {\noexpand\number\value{slncpage}}%
+ {\noexpand\number\scr@lastypos}%
+ {\slnc@unexpanded{#2}}%
}%
-}
+ \@esphack
+}%
% \end{macrocode}
%^^A \begin{counter}{slncpage}
% This counter should be increased once per page with note column. This may
@@ -898,53 +800,52 @@
% steps:
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\slnc@processnotes{%
- \newcommand*{\slnc@processnotes}[1]{%
+\newcommand*{\slnc@processnotes}[1]{%
% \end{macrocode}
% Read as long notes from the notes file until the number at \#2 of
% \Macro{slnc@note} in the file is greater than \Counter{slncpage}. Put all
% these to the corresponding unprocessed list.
% \begin{macrocode}
- \begingroup
- \slnc@readnotes{\value{slncpage}}%
+ \begingroup
+ \slnc@readnotes{\value{slncpage}}%
% \end{macrocode}
% Process the unprocessed list of the current note column
% \begin{macrocode}
- \expandafter\let\expandafter\reserved@a
- \csname slnc@#1@unprocessed\endcsname
- \expandafter\global
- \expandafter\let\csname slnc@#1@unprocessed\endcsname\@empty
- \def\slnc@notesyncfonttest##1{%
- \ifhmode
- \PackageError{scrlayer-notecolumn}{%
- illegal font setting for `notecolumn.##1'%
- }{%
- Current setting of font for `notecolumn.##1' switches
- from\MessageBreak
- vertical mode to horizontal mode. This is
- illegal!\MessageBreak
- You have to change the font setting to fix
- this.\MessageBreak
- If you'll continue vertical alignment of notes may fail%
- }%
- \par\vskip-\dimexpr \baselineskip+\parskip\relax
- \fi
- }%
- \long\def\slnc@note##1##2##3##4{%
+ \expandafter\let\expandafter\reserved@a
+ \csname slnc@#1@unprocessed\endcsname
+ \expandafter\global
+ \expandafter\let\csname slnc@#1@unprocessed\endcsname\@empty
+ \def\slnc@notesyncfonttest##1{%
+ \ifhmode
+ \PackageError{scrlayer-notecolumn}{%
+ illegal font setting for `notecolumn.##1'%
+ }{%
+ Current setting of font for `notecolumn.##1' switches
+ from\MessageBreak
+ vertical mode to horizontal mode. This is
+ illegal!\MessageBreak
+ You have to change the font setting to fix
+ this.\MessageBreak
+ If you'll continue vertical alignment of notes may fail%
+ }%
+ \par\vskip-\dimexpr \baselineskip+\parskip\relax
+ \fi
+ }%
+ \long\def\slnc@note##1##2##3##4{%
%<trace> \typeout{TRACE (slnc): ##2<=\theslncpage?}%
- \ifnum ##2>\value{slncpage}\relax
+ \ifnum ##2>\value{slncpage}\relax
%<trace> \typeout{TRACE (slnc): no: unprocess note}%
- \expandafter\g@addto@macro\csname slnc@#1@unprocessed\endcsname{%
- \slnc@note{##1}{##2}{##3}{##4}%
- }%
- \else
- \ifnum ##2<\value{slncpage}\relax
- \PackageWarning{scrlayer-notecolumn}{note of type `#1' delayed}%
- \fi
- \boxmaxdepth\maxdepth
- \expandafter\setbox\csname slnc@#1@box\endcsname\vbox{%
- \expandafter\hsize\csname slnc@#1@width\endcsname
- \normalfont\normalsize
+ \expandafter\g@addto@macro\csname slnc@#1@unprocessed\endcsname{%
+ \slnc@note{##1}{##2}{##3}{##4}%
+ }%
+ \else
+ \ifnum ##2<\value{slncpage}\relax
+ \PackageWarning{scrlayer-notecolumn}{note of type `#1' delayed}%
+ \fi
+ \boxmaxdepth\maxdepth
+ \expandafter\setbox\csname slnc@#1@box\endcsname\vbox{%
+ \expandafter\hsize\csname slnc@#1@width\endcsname
+ \normalfont\normalsize
% \end{macrocode}
% \changes{v0.2.3085}{2019/02/14}{using colour stack if available}%^^A
% If a color stack is available we switch to it before changing the font. So a
@@ -952,152 +853,151 @@
% the column! But if we don't have a color stack, color switching is not
% permitted!
% \begin{macrocode}
- \slnc@switchcolorstack{#1}%
- {%
- \usekomafont{notecolumn.#1}{%
- \slnc@notesyncfonttest{#1}%
- \expandafter\ifvoid\csname slnc@#1@box\endcsname
- \expandafter\setbox\csname slnc@#1@box\endcsname\vbox{%
- \kern\dimexpr\topskip-\baselineskip\relax
- }%
- \fi
+ \slnc@switchcolorstack{#1}%
+ {%
+ \usekomafont{notecolumn.#1}{%
+ \slnc@notesyncfonttest{#1}%
+ \expandafter\ifvoid\csname slnc@#1@box\endcsname
+ \expandafter\setbox\csname slnc@#1@box\endcsname\vbox{%
+ \kern\dimexpr\topskip-\baselineskip\relax
+ }%
+ \fi
% \end{macrocode}
% \changes{v0.1}{2015/10/07}{ready for renaming \cs{pdfpageheight} in
% luaTeX}%^^A
% From lua\TeX~0.80.1 \cs{pdfpageheight} will be renamed into
% \cs{pageheight}. So we have to do an extra test for the new primitive.
% \begin{macrocode}
- \scr@ifundefinedorrelax{pdfpageheight}{%
- \scr@ifundefinedorrelax{pageheight}{%
- \@tempdima=\paperheight
- }{%
- \@tempdima=\pageheight
- }%
+ \scr@ifundefinedorrelax{pdfpageheight}{%
+ \scr@ifundefinedorrelax{pageheight}{%
+ \@tempdima=\paperheight
}{%
- \@tempdima=\pdfpageheight
+ \@tempdima=\pageheight
}%
- \@tempdima=\dimexpr \@tempdima-##3sp
- -1in-\topmargin
- -\headheight-\headsep
- -\baselineskip
- \relax
- \@tempdimb=\dimexpr \expandafter\ht\csname slnc@#1@box\endcsname
- +\expandafter\dp\csname slnc@#1@box\endcsname
- \relax
- \typeout{Soll: \the\@tempdima^^JIst: \space\the\@tempdimb}%
- \ifdim\@tempdima<\@tempdimb
+ }{%
+ \@tempdima=\pdfpageheight
+ }%
+ \@tempdima=\dimexpr \@tempdima-##3sp
+ -1in-\topmargin
+ -\headheight-\headsep
+ -\baselineskip
+ \relax
+ \@tempdimb=\dimexpr \expandafter\ht\csname slnc@#1@box\endcsname
+ +\expandafter\dp\csname slnc@#1@box\endcsname
+ \relax
+ \typeout{Soll: \the\@tempdima^^JIst: \space\the\@tempdimb}%
+ \ifdim\@tempdima<\@tempdimb
%<*trace>
- \PackageInfo{scrlayer-notecolumn}{%
- Note moved down from\MessageBreak
- \the\@tempdima\space to \the\@tempdimb\MessageBreak
- at note box `#1'
- }%
+ \PackageInfo{scrlayer-notecolumn}{%
+ Note moved down from\MessageBreak
+ \the\@tempdima\space to \the\@tempdimb\MessageBreak
+ at note box `#1'
+ }%
%</trace>
- \else
- \ifdim\@tempdima>\@tempdimb
+ \else
+ \ifdim\@tempdima>\@tempdimb
%<*trace>
- \PackageInfo{scrlayer-notecolumn}{%
- Adding vertical white space from\MessageBreak
- \the\@tempdimb\space to \the\@tempdima\MessageBreak
- into note box `#1'
- }%
+ \PackageInfo{scrlayer-notecolumn}{%
+ Adding vertical white space from\MessageBreak
+ \the\@tempdimb\space to \the\@tempdima\MessageBreak
+ into note box `#1'
+ }%
%</trace>
- \expandafter\setbox\csname slnc@#1@box\endcsname
- \vbox {%
- \expandafter\unvbox\csname slnc@#1@box\endcsname
- \kern\dimexpr\@tempdima-\@tempdimb\relax
- }%
- \fi
- \fi
- \expandafter\ifvoid\expandafter\csname slnc@#1@box\endcsname
- \else
- \@tempdima\dimexpr
- \dp\strutbox
- -\dp\csname slnc@#1@box\endcsname
- \relax
- \expandafter\unvbox\csname slnc@#1@box\endcsname
- \ifdim\@tempdima>\z@ \kern\@tempdima\fi
+ \expandafter\setbox\csname slnc@#1@box\endcsname
+ \vbox {%
+ \expandafter\unvbox\csname slnc@#1@box\endcsname
+ \kern\dimexpr\@tempdima-\@tempdimb\relax
+ }%
\fi
+ \fi
+ \expandafter\ifvoid\expandafter\csname slnc@#1@box\endcsname
+ \else
+ \@tempdima\dimexpr
+ \dp\strutbox
+ -\dp\csname slnc@#1@box\endcsname
+ \relax
+ \expandafter\unvbox\csname slnc@#1@box\endcsname
+ \ifdim\@tempdima>\z@ \kern\@tempdima\fi
+ \fi
% \end{macrocode}
% \changes{v0.1.2582}{2017/02/08}{restore several commands}%^^A
% Some commands have to be restored when processing the note.
% \begin{macrocode}
- \slnc@restoreinnote
- \strut\ignorespaces ##4\par
- }%
+ \slnc@restoreinnote
+ \strut\ignorespaces ##4\par
}%
}%
- \fi
- }%
- \def\slnc@sync##1##2##3##4{%
- \ifnum ##2>\value{slncpage}\relax
- \expandafter\g@addto@macro\csname slnc@#1@unprocessed\endcsname{%
- \slnc@sync{##1}{##2}{##3}{}%
- }%
- \else
- \if@filesw
- \expandafter\setbox\csname slnc@#1@box\endcsname\vbox{%
- \expandafter\unvbox\csname slnc@#1@box\endcsname
- \scr@savepos
- \protected@write\@auxout{}{%
- \string\newlabel{notecolumn.##1.##3.syncnote.label}{%
- {%
- \noexpand\number\scr@lastypos
- }{\thepage}%
- }%
+ }%
+ \fi
+ }%
+ \def\slnc@sync##1##2##3##4{%
+ \ifnum ##2>\value{slncpage}\relax
+ \expandafter\g@addto@macro\csname slnc@#1@unprocessed\endcsname{%
+ \slnc@sync{##1}{##2}{##3}{}%
+ }%
+ \else
+ \if@filesw
+ \expandafter\setbox\csname slnc@#1@box\endcsname\vbox{%
+ \expandafter\unvbox\csname slnc@#1@box\endcsname
+ \scr@savepos
+ \protected@write\@auxout{}{%
+ \string\newlabel{notecolumn.##1.##3.syncnote.label}{%
+ {%
+ \noexpand\number\scr@lastypos
+ }{\thepage}%
}%
}%
- \fi
+ }%
\fi
- }%
- \reserved@a
- \expandafter\ifvoid\csname slnc@#1@box\endcsname
+ \fi
+ }%
+ \reserved@a
+ \expandafter\ifvoid\csname slnc@#1@box\endcsname
%<*trace>
- \PackageInfo{scrlayer-notecolumn}{Note box `#1' empty}%
+ \PackageInfo{scrlayer-notecolumn}{Note box `#1' empty}%
%</trace>
- \else
- \ifdim \dimexpr \expandafter\ht\csname slnc@#1@box\endcsname
- +\expandafter\dp\csname slnc@#1@box\endcsname
- \relax >\textheight\relax
+ \else
+ \ifdim \dimexpr \expandafter\ht\csname slnc@#1@box\endcsname
+ +\expandafter\dp\csname slnc@#1@box\endcsname
+ \relax >\textheight\relax
%<*trace>
- \PackageInfo{scrlayer-notecolumn}{Split note box `#1'}%
+ \PackageInfo{scrlayer-notecolumn}{Split note box `#1'}%
%</trace>
- \splittopskip\topskip
- \splitmaxdepth\baselineskip
+ \splittopskip\topskip
+ \splitmaxdepth\baselineskip
% \end{macrocode}
% Bring back the colours:
% \changes{v0.2.3085}{2019/02/14}{\cs{slnc@switchcolorstack} added}%^^A
% \begin{macrocode}
- \usekomafont{notecolumn.#1}{%
- \expandafter\vsplit\csname slnc@#1@box\endcsname to
- \textheight\relax
- }%
- \expandafter\ifvoid\csname slnc@#1@box\endcsname
- \else
- \expandafter\setbox\csname slnc@#1@box\endcsname\vbox{%
- \slnc@switchcolorstack{#1}%
- \expandafter\unvbox\csname slnc@#1@box\endcsname
- }%
- \fi
+ \usekomafont{notecolumn.#1}{%
+ \expandafter\vsplit\csname slnc@#1@box\endcsname to
+ \textheight\relax
+ }%
+ \expandafter\ifvoid\csname slnc@#1@box\endcsname
\else
+ \expandafter\setbox\csname slnc@#1@box\endcsname\vbox{%
+ \slnc@switchcolorstack{#1}%
+ \expandafter\unvbox\csname slnc@#1@box\endcsname
+ }%
+ \fi
+ \else
%<*trace>
- \PackageInfo{scrlayer-notecolumn}{Flush note box `#1'}%
+ \PackageInfo{scrlayer-notecolumn}{Flush note box `#1'}%
%</trace>
% \end{macrocode}
% Bring back the colours:
% \changes{v0.2.3085}{2019/02/14}{\cs{slnc@switchcolorstack} added}%^^A
% \begin{macrocode}
- \usekomafont{notecolumn.#1}{%
- \slnc@switchcolorstack{#1}%
- \expandafter\box\csname slnc@#1@box\endcsname%
- }%
- \fi
+ \usekomafont{notecolumn.#1}{%
+ \slnc@switchcolorstack{#1}%
+ \expandafter\box\csname slnc@#1@box\endcsname%
+ }%
\fi
- \expandafter\global
- \expandafter\setbox\csname slnc@#1@box\expandafter\endcsname
- \expandafter\box\csname slnc@#1@box\endcsname
- \endgroup
- }
+ \fi
+ \expandafter\global
+ \expandafter\setbox\csname slnc@#1@box\expandafter\endcsname
+ \expandafter\box\csname slnc@#1@box\endcsname
+ \endgroup
}
% \end{macrocode}
% \begin{macro}{\slnc@switchcolorstack}
@@ -1105,50 +1005,48 @@
% This either redefines \cs{set@color} or switches to the colour stack of the
% note column given by the argument.
% \begin{macrocode}
-\scrlayerAddToInterface{\slnc@switchcolorstack}{%
- \newcommand*{\slnc@switchcolorstack}[1]{%
- \scr@ifundefinedorrelax{slnc@#1@colorstack}{%
- \def\set@color{%
- \PackageWarningNoLine{scrlayer-notecolumn}{%
- unsupported change of colour!\MessageBreak
- It seems you are using a TeX engine,\MessageBreak
- that does not support switching the\MessageBreak
- colour stack like pdfTeX or luaTeX do.\MessageBreak
- Because of this, usage of \string\color,\MessageBreak
- \string\textcolor\space etc. inside a note
- column\MessageBreak
- is not supported%
- }%
+\newcommand*{\slnc@switchcolorstack}[1]{%
+ \scr@ifundefinedorrelax{slnc@#1@colorstack}{%
+ \def\set@color{%
+ \PackageWarningNoLine{scrlayer-notecolumn}{%
+ unsupported change of colour!\MessageBreak
+ It seems you are using a TeX engine,\MessageBreak
+ that does not support switching the\MessageBreak
+ colour stack like pdfTeX or luaTeX do.\MessageBreak
+ Because of this, usage of \string\color,\MessageBreak
+ \string\textcolor\space etc. inside a note
+ column\MessageBreak
+ is not supported%
}%
+ }%
+ }{%
+ \scr@ifundefinedorrelax{@pdfcolorstack}{%
}{%
- \scr@ifundefinedorrelax{@pdfcolorstack}{%
- }{%
- \expandafter\let\expandafter\@pdfcolorstack
- \csname slnc@#1@colorstack\endcsname
- }%
- \scr@ifundefinedorrelax{pdfcolorstack}{%
- \scr@ifundefinedorrelax{pdfextension}{%
- \PackageError{scrlayer-notecolumm}{%
- colour stack defined but not usable%
- }{%
- \expandafter\string
- \csname slnc@#1@colorstack\endcsname\space defined
- \MessageBreak
- but neither \string\pdfcolorstack\space nor
- \string\pdfextension.\MessageBreak
- This should never happen!%
- }%
+ \expandafter\let\expandafter\@pdfcolorstack
+ \csname slnc@#1@colorstack\endcsname
+ }%
+ \scr@ifundefinedorrelax{pdfcolorstack}{%
+ \scr@ifundefinedorrelax{pdfextension}{%
+ \PackageError{scrlayer-notecolumm}{%
+ colour stack defined but not usable%
}{%
- \pdfextension colorstack
- \csname slnc@#1@colorstack\endcsname current\relax
+ \expandafter\string
+ \csname slnc@#1@colorstack\endcsname\space defined
+ \MessageBreak
+ but neither \string\pdfcolorstack\space nor
+ \string\pdfextension.\MessageBreak
+ This should never happen!%
}%
}{%
- \pdfcolorstack
+ \pdfextension colorstack
\csname slnc@#1@colorstack\endcsname current\relax
}%
+ }{%
+ \pdfcolorstack
+ \csname slnc@#1@colorstack\endcsname current\relax
}%
}%
-}
+}%
% \end{macrocode}
% \end{macro}%^^A \slnc@switchcolorstack
% \begin{macro}{\restoreinnote}
@@ -1159,25 +1057,21 @@
% these are \cs{label}, \cs{index}, \cs{glossary}. More can be added using
% \cs{restoreinnote}. The storage is \cs{slnc@restoreinnote}.
% \begin{macrocode}
-\scrlayerAddToInterface\slnc@restoreinnote{%
- \let\slnc@restoreinnote\@empty
-}
-\scrlayerAddToInterface\restoreinnote{%
- \newcommand*\restoreinnote[1]{%
- \AtBeginDocument{%
- \expandafter\scrlayerAddCsToInterface[scrlayer-notecolumn.sty]{slnc\string#1}{%
- \expandafter\let\csname slnc\string#1\endcsname#1%
- \g@addto@macro\slnc@restoreinnote{%
- \expandafter\let\expandafter#1\csname slnc\string#1\endcsname
- }%
- }%
+\newcommand*{\slnc@restoreinnote}{}
+\let\slnc@restoreinnote\@empty
+\newcommand*\restoreinnote[1]{%
+ \AtBeginDocument{%
+ \expandafter\newcommand\expandafter*\csname slnc\string#1\endcsname{}%
+ \expandafter\let\csname slnc\string#1\endcsname#1%
+ \g@addto@macro\slnc@restoreinnote{%
+ \expandafter\let\expandafter#1\csname slnc\string#1\endcsname
}%
}%
- \@onlypreamble\restoreinnote
- \restoreinnote\label
- \restoreinnote\index
- \restoreinnote\glossary
}
+\@onlypreamble\restoreinnote
+\restoreinnote\label
+\restoreinnote\index
+\restoreinnote\glossary
% \end{macrocode}
% \end{macro}%^^A \slnc@restoreinnote
% \end{macro}%^^A \restoreinnote
@@ -1190,9 +1084,7 @@
% We need a helper macro \cs{slnc@catcodes} to restore (some of) the catcodes
% before reading from file.
% \begin{macrocode}
-\scrlayerAddToInterface\slnc@catcodes{%
- \newcommand*{\slnc@catcodes}{}%
-}
+\newcommand*{\slnc@catcodes}{}%
\AtBeginDocument{%
\begingroup
\def\do#1{%
@@ -1208,94 +1100,86 @@
% \end{macrocode}
% \end{macro}%^^A \slnc@catcodes
% \begin{macrocode}
-\scrlayerAddToInterface\slnc@readnotes{%
- \newcommand*\slnc@readnotes[1]{%
- \ifeof\slnc@file\else
- \ifnum \number #1<\slnc@unprocessed\relax
- \@tempswafalse
- \else
- \@tempswatrue
- \fi
- \@whilesw\if@tempswa\fi{%
- \begingroup
- \slnc@catcodes
- \endlinechar\m@ne
- \read\slnc@file to\reserved@a
- \edef\reserved@a{%
- \endgroup
- \noexpand\def\noexpand\reserved@a{%
- \unexpanded\expandafter{\reserved@a}%
- }%
+\newcommand*\slnc@readnotes[1]{%
+ \ifeof\slnc@file\else
+ \ifnum \number #1<\slnc@unprocessed\relax
+ \@tempswafalse
+ \else
+ \@tempswatrue
+ \fi
+ \@whilesw\if@tempswa\fi{%
+ \begingroup
+ \slnc@catcodes
+ \endlinechar\m@ne
+ \read\slnc@file to\reserved@a
+ \edef\reserved@a{%
+ \endgroup
+ \noexpand\def\noexpand\reserved@a{%
+ \unexpanded\expandafter{\reserved@a}%
}%
- \reserved@a
- \expandafter\slnc@iofv\expandafter\reserved@b\reserved@a
- \@empty\@empty\@empty\@empty\@empty
- \@tempswafalse
- \@for\reserved@c :={\slnc@note },{\slnc@sync }\do{%
- \ifx\reserved@b\reserved@c \@tempswatrue\fi
}%
- \if@tempswa
- \@tempswafalse
- \expandafter\slnc@iiiofv\expandafter\reserved@b\reserved@a
+ \reserved@a
+ \expandafter\slnc@iofv\expandafter\reserved@b\reserved@a
+ \@empty\@empty\@empty\@empty\@empty
+ \@tempswafalse
+ \@for\reserved@c :={\slnc@note },{\slnc@sync }\do{%
+ \ifx\reserved@b\reserved@c \@tempswatrue\fi
+ }%
+ \if@tempswa
+ \@tempswafalse
+ \expandafter\slnc@iiiofv\expandafter\reserved@b\reserved@a
+ \@empty\@empty\@empty\@empty\@empty
+ \ifx\reserved@b\@empty
+ \PackageError{scrlayer-notecolumn}{internal syntax error}{%
+ Unexpected syntax of file `\jobname.slnc'.\MessageBreak
+ Second argument should be a number.\MessageBreak
+ I don't know what to do with\MessageBreak
+ \expandafter\detokenize\expandafter{\reserved@a}%
+ }%
+ \@tempswatrue
+ \else
+ \global\let\slnc@unprocessed\reserved@b
+ \expandafter\slnc@iiofv\expandafter\reserved@b\reserved@a
\@empty\@empty\@empty\@empty\@empty
- \ifx\reserved@b\@empty
- \PackageError{scrlayer-notecolumn}{internal syntax error}{%
- Unexpected syntax of file `\jobname.slnc'.\MessageBreak
- Second argument should be a number.\MessageBreak
- I don't know what to do with\MessageBreak
- \expandafter\detokenize\expandafter{\reserved@a}%
+ \@ifundefined{slnc@\reserved@b @unprocessed}{%
+ \PackageWarning{scrlayer-notecolumn}{%
+ column `\reserved@b' undefined.\MessageBreak
+ You should declare the column before the usage.\MessageBreak
+ Notes will be lost%
}%
- \@tempswatrue
- \else
- \global\let\slnc@unprocessed\reserved@b
- \expandafter\slnc@iiofv\expandafter\reserved@b\reserved@a
- \@empty\@empty\@empty\@empty\@empty
- \@ifundefined{slnc@\reserved@b @unprocessed}{%
- \PackageWarning{scrlayer-notecolumn}{%
- column `\reserved@b' undefined.\MessageBreak
- You should declare the column before the usage.\MessageBreak
- Notes will be lost%
- }%
- }{%
- \expandafter\g@addto@macro
- \csname slnc@\reserved@b @unprocessed\expandafter\endcsname
- \expandafter{%
- \reserved@a
- }%
+ }{%
+ \expandafter\g@addto@macro
+ \csname slnc@\reserved@b @unprocessed\expandafter\endcsname
+ \expandafter{%
+ \reserved@a
}%
- \ifnum \number #1<\slnc@unprocessed\relax
- \@tempswafalse
- \else
- \@tempswatrue
- \fi
+ }%
+ \ifnum \number #1<\slnc@unprocessed\relax
+ \@tempswafalse
+ \else
+ \@tempswatrue
\fi
- \else
+ \fi
+ \else
%<*trace>
- \PackageInfo{scrlayer-notecolumn}{%
- Ignoring `\expandafter\detokenize\expandafter{\reserved@a}'}%
+ \PackageInfo{scrlayer-notecolumn}{%
+ Ignoring `\expandafter\detokenize\expandafter{\reserved@a}'}%
%</trace>
- \@tempswatrue
- \fi
- \ifeof\slnc@file\@tempswafalse\fi
- }%
- \fi
- }%
-}
+ \@tempswatrue
+ \fi
+ \ifeof\slnc@file\@tempswafalse\fi
+ }%
+ \fi
+}%
% \end{macrocode}
% \end{macro}%^^A \slnc@readnotes
% \begin{macro}{\slnc@iofv}
% \begin{macro}{\slnc@iiofv}
% \begin{macro}{\slnc@iiiofv}
% \begin{macrocode}
-\scrlayerAddToInterface\slnc@iofv{%
- \newcommand\slnc@iofv[6]{\def#1{#2}}%
-}
-\scrlayerAddToInterface\slnc@iiofiv{%
- \newcommand\slnc@iiofv[6]{\def#1{#3}}%
-}
-\scrlayerAddToInterface\slnc@iiiofiv{%
- \newcommand\slnc@iiiofv[6]{\def#1{#4}}%
-}
+\newcommand\slnc@iofv[6]{\def#1{#2}}%
+\newcommand\slnc@iiofv[6]{\def#1{#3}}%
+\newcommand\slnc@iiiofv[6]{\def#1{#4}}%
% \end{macrocode}
% \end{macro}%^^A \slnc@iiiofv
% \end{macro}%^^A \slnc@iiofv
@@ -1303,9 +1187,7 @@
% \begin{macro}{\slnc@unprocessed}
% The \#2 of the last read note column from notes file.
% \begin{macrocode}
-\scrlayerAddToInterface\slnc@unprocessed{%
- \newcommand*{\slnc@unprocessed}{0}%
-}
+\newcommand*{\slnc@unprocessed}{0}%
%</body>
% \end{macrocode}
% \begin{macro}{\slnc@file}
@@ -1320,42 +1202,38 @@
% The MD5 sum of the file before opening it for reading.
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\slnc@mdfivesum{%
- \let\slnc@mdfivesum\@empty
-}
-\scrlayerAddToInterface\slnc@file{%
- \scr@ifundefinedorrelax{pdfmdfivesum}{%
- \scr@ifundefinedorrelax{mdfivesum}{%
- \ifdefined\directlua
- \directlua{%
- function slncmdfivesum(filename)
- local fh = io.open(filename,"rb")
- if fh then
- local sum=md5.sumhexa(fh:read("*a"))
- tex.sprint(sum)
- fh:close()
- end
+\newcommand*{\slnc@mdfivesum}{}
+\let\slnc@mdfivesum\@empty
+\scr@ifundefinedorrelax{pdfmdfivesum}{%
+ \scr@ifundefinedorrelax{mdfivesum}{%
+ \ifdefined\directlua
+ \directlua{%
+ function slncmdfivesum(filename)
+ local fh = io.open(filename,"rb")
+ if fh then
+ local sum=md5.sumhexa(fh:read("*a"))
+ tex.sprint(sum)
+ fh:close()
end
- }%
- \xdef\slnc@mdfivesum{\directlua{slncmdfivesum("\jobname.slnc")}}%
- \fi
- }{%
- \xdef\slnc@mdfivesum{\mdfivesum file {\jobname.slnc}}%
- }%
+ end
+ }%
+ \xdef\slnc@mdfivesum{\directlua{slncmdfivesum("\jobname.slnc")}}%
+ \fi
}{%
- \xdef\slnc@mdfivesum{\pdfmdfivesum file {\jobname.slnc}}%
+ \xdef\slnc@mdfivesum{\mdfivesum file {\jobname.slnc}}%
}%
+}{%
+ \xdef\slnc@mdfivesum{\pdfmdfivesum file {\jobname.slnc}}%
+}%
%<*trace>
- \scr@ifundefinedorrelax{slnc@mdfivesum}{}{%
- \PackageInfo{scrlayer-notecolumn}{%
- MD5 of last `\jobname.slnc':\MessageBreak
- \slnc@mdfivesum}%
- }%
+\scr@ifundefinedorrelax{slnc@mdfivesum}{}{%
+ \PackageInfo{scrlayer-notecolumn}{%
+ MD5 of last `\jobname.slnc':\MessageBreak
+ \slnc@mdfivesum}%
+}%
%</trace>
- \newread\slnc@file
- \immediate\openin\slnc@file \jobname.slnc
- \scrlayerOnAutoRemoveInterface{\immediate\closein\slnc@file}%
-}
+\newread\slnc@file
+\immediate\openin\slnc@file \jobname.slnc
%</body>
% \end{macrocode}
% \end{macro}%^^A \slnc@mdfivesum
@@ -1366,9 +1244,8 @@
% \begin{option}{autoclearnotecolumns}
% \begin{macrocode}
%<*options>
-\KOMA@ifkey{autoclearnotecolumns}{slnc@autoclearnotecolumns}\slnc@autoclearnotecolumnstrue
-\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @autoclearnotecolumns}
-\scrlayer@AddCsToInterface{KV@KOMA.\@currname.\@currext @autoclearnotecolumns@default}
+\KOMA@ifkey{autoclearnotecolumns}{slnc@autoclearnotecolumns}
+\slnc@autoclearnotecolumnstrue
%</options>
%<*final>
\let\reserved@a\clearpage
@@ -1390,66 +1267,99 @@
% unprocessed notes. But the output of the following (empty) pages shouldn't.
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\c@slnc@clearnote@label{%
- \newcounter{slnc@clearnote@label}%
-}
-\scrlayerAddToInterface\clearnotecolumn{%
- \newcommand*\clearnotecolumn[1][marginpar]{%
- \begingroup
- \slnc@autoclearnotecolumnsfalse
+\newcounter{slnc@clearnote@label}%
+\newcommand*\clearnotecolumn[1][marginpar]{%
+ \begingroup
+ \slnc@autoclearnotecolumnsfalse
% \end{macrocode}
% First of all we need to know the note column page of this page.
% \begin{macrocode}
- \stepcounter{slnc@clearnote@label}%
- \if@filesw
- \protected@write\@auxout{%
- \let\theslncpage\relax
- \let\slnc@voidtest\relax
- }{%
- \string\newlabel{notecolumn.\theslnc@clearnote@label}%
- {{\theslncpage}{\slnc@voidtest{#1}}}%
- }%
- \fi
- \scr@ifundefinedorrelax{r@notecolumn.\theslnc@clearnote@label}{%
- \PackageInfo{scrlayer-notecolumn}{%
- Using estimated to low value for clearing\MessageBreak
- note colum `#1'%
- }
- \edef\slnc@cmp@value{\the\value{slncpage}}%
- \let\reserved@a\z@
+ \stepcounter{slnc@clearnote@label}%
+ \if@filesw
+ \protected@write\@auxout{%
+ \let\theslncpage\relax
+ \let\slnc@voidtest\relax
}{%
- \edef\reserved@a{%
- \@nameuse{r@notecolumn.\theslnc@clearnote@label}\@empty\@empty
- }%
- \edef\slnc@cmp@value{\expandafter\slnc@firstof\reserved@a\@nil}%
- \edef\reserved@a{\expandafter\slnc@secondof\reserved@a\@nil}%
+ \string\newlabel{notecolumn.\theslnc@clearnote@label}%
+ {{\theslncpage}{\slnc@voidtest{#1}}}%
+ }%
+ \fi
+ \scr@ifundefinedorrelax{r@notecolumn.\theslnc@clearnote@label}{%
+ \PackageInfo{scrlayer-notecolumn}{%
+ Using estimated to low value for clearing\MessageBreak
+ note colum `#1'%
+ }
+ \edef\slnc@cmp@value{\the\value{slncpage}}%
+ \let\reserved@a\z@
+ }{%
+ \edef\reserved@a{%
+ \@nameuse{r@notecolumn.\theslnc@clearnote@label}\@empty\@empty
}%
+ \edef\slnc@cmp@value{\expandafter\slnc@firstof\reserved@a\@nil}%
+ \edef\reserved@a{\expandafter\slnc@secondof\reserved@a\@nil}%
+ }%
%<*trace>
- \typeout{TRACE (slnc): clearnote=\@nameuse{theslnc@clearnote@label},
- abspage=\the\value{slncpage}, until page=\slnc@cmp@value,
- process=\reserved@a, pagetotal=\the\pagetotal, topskip=\the\topskip}%
+ \typeout{TRACE (slnc): clearnote=\@nameuse{theslnc@clearnote@label},
+ abspage=\the\value{slncpage}, until page=\slnc@cmp@value,
+ process=\reserved@a, pagetotal=\the\pagetotal, topskip=\the\topskip}%
%</trace>
- \ifvmode\ifdim \pagetotal<\topskip
+ \ifvmode\ifdim \pagetotal<\topskip
% \end{macrocode}
% \Macro{clearpage} wouldn't result in a new page, so we do not have to output
% the notes of this page but only until the previous.
% \begin{macrocode}
- \edef\slnc@cmp@value{\the\numexpr\slnc@cmp@value-1}%
+ \edef\slnc@cmp@value{\the\numexpr\slnc@cmp@value-1}%
%<trace> \typeout{TRACE (slnc): until page=\slnc@cmp@value}%
- \fi\fi
- \ifnum \reserved@a=\z@
+ \fi\fi
+ \ifnum \reserved@a=\z@
% \end{macrocode}
% Next we read all notes until the end of the current page, but only
% if a \Macro{clearpage} wouldn't result in a new page.
% \begin{macrocode}
- \ifvmode
- \ifdim \pagetotal<\topskip
- \else
- \slnc@readnotes{\slnc@cmp@value}%
- \fi
+ \ifvmode
+ \ifdim \pagetotal<\topskip
\else
\slnc@readnotes{\slnc@cmp@value}%
\fi
+ \else
+ \slnc@readnotes{\slnc@cmp@value}%
+ \fi
+ \begingroup
+ \aftergroup\@tempswafalse
+ \long\def\slnc@note##1##2##3##4{%
+ \ifnum ##2>\slnc@cmp@value\relax \else \aftergroup\@tempswatrue\fi
+ }%
+ \let\slnc@sync\slnc@note
+ \csname slnc@#1@unprocessed\endcsname
+ \endgroup
+ \else
+ \PackageInfo{scrlayer-notecolumn}{%
+ box of note column `#1'\MessageBreak
+ not empty after page of \string\clearnotecolumn}%
+ \@tempswatrue
+ \fi
+ \if@tempswa
+% \end{macrocode}
+% Yes, we have!
+% \begin{macrocode}
+ \IfLayerPageStyleExists{\currentpagestyle}{}{%
+ \PackageWarning{scrlayer-notecolumn}{%
+ \string\clearnotecolumn\space while active non-layer page
+ style.\MessageBreak
+ Activate empty page style until note column\MessageBreak
+ has been cleared%
+ }%
+ \pagestyle{empty}%
+ }%
+ \@tempswatrue
+ \fi
+ \@whilesw\if@tempswa\fi{%
+%<trace> \typeout{TRACE (slnc): add \string\clearpage}%
+% \end{macrocode}
+% Yes, we have (maybe again)!
+% \begin{macrocode}
+ \clearpage
+ \expandafter\ifcase \slnc@voidtest{#1}%
\begingroup
\aftergroup\@tempswafalse
\long\def\slnc@note##1##2##3##4{%
@@ -1459,53 +1369,16 @@
\csname slnc@#1@unprocessed\endcsname
\endgroup
\else
- \PackageInfo{scrlayer-notecolumn}{%
- box of note column `#1'\MessageBreak
- not empty after page of \string\clearnotecolumn}%
\@tempswatrue
\fi
\if@tempswa
% \end{macrocode}
-% Yes, we have!
-% \begin{macrocode}
- \IfLayerPageStyleExists{\currentpagestyle}{}{%
- \PackageWarning{scrlayer-notecolumn}{%
- \string\clearnotecolumn\space while active non-layer page
- style.\MessageBreak
- Activate empty page style until note column\MessageBreak
- has been cleared%
- }%
- \pagestyle{empty}%
- }%
- \@tempswatrue
- \fi
- \@whilesw\if@tempswa\fi{%
-%<trace> \typeout{TRACE (slnc): add \string\clearpage}%
-% \end{macrocode}
-% Yes, we have (maybe again)!
-% \begin{macrocode}
- \clearpage
- \expandafter\ifcase \slnc@voidtest{#1}%
- \begingroup
- \aftergroup\@tempswafalse
- \long\def\slnc@note##1##2##3##4{%
- \ifnum ##2>\slnc@cmp@value\relax \else \aftergroup\@tempswatrue\fi
- }%
- \let\slnc@sync\slnc@note
- \csname slnc@#1@unprocessed\endcsname
- \endgroup
- \else
- \@tempswatrue
- \fi
- \if@tempswa
-% \end{macrocode}
% And we still have: So we have to output one more page.
% \begin{macrocode}
- \null
- \fi
- }%
- \endgroup
- }%
+ \null
+ \fi
+ }%
+ \endgroup
}
% \end{macrocode}
% \begin{macro}{\slnc@firstof}
@@ -1513,12 +1386,10 @@
% We need these little helpers, because some packages like
% \Package{hyperref} extend the label mechanism by additional arguments.
% \begin{macrocode}
-\scrlayerAddToInterface{\slnc@firstof}{%
- \def\slnc@firstof#1#2\@nil{#1}%
-}
-\scrlayerAddToInterface{slnc@secondof}{%
- \def\slnc@secondof#1#2#3\@nil{#2}%
-}
+\newcommand*{\slnc@firstof}{}
+\def\slnc@firstof#1#2\@nil{#1}%
+\newcommand*{\slnc@secondof}{}
+\def\slnc@secondof#1#2#3\@nil{#2}%
% \end{macrocode}
% \end{macro}%^^A \slnc@firstof
% \end{macro}%^^A \slnc@secondof
@@ -1530,10 +1401,8 @@
% If the box of the note column is empty/void it returns \Macro{z@} otherwise
% \Macro{@ne}.
% \begin{macrocode}
-\scrlayerAddToInterface\slnc@voidtest{%
- \newcommand*{\slnc@voidtest}[1]{%
- \expandafter\ifvoid \csname slnc@#1@box\endcsname \z@\else \@ne\fi
- }%
+\newcommand*{\slnc@voidtest}[1]{%
+ \expandafter\ifvoid \csname slnc@#1@box\endcsname \z@\else \@ne\fi
}
%</body>
% \end{macrocode}
@@ -1555,140 +1424,138 @@
% pages shouldn't.
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\clearnotecolumns{%
- \newcommand*\clearnotecolumns[1][\relax]{%
- \begingroup
- \slnc@autoclearnotecolumnsfalse
- \ifx\relax#1\relax\else
- \let\slnc@processnotecolumns\@empty
- \edef\reserved@a{#1}%
- \@for\reserved@a:=\reserved@a\do {%
- \scr@trim@spaces\reserved@a
- \ifx\reserved@a\@empty\else
- \expandafter\l@addto@macro\expandafter\slnc@processnotecolumns
- \expandafter{\expandafter\@elt\expandafter{\reserved@a}}%
- \fi
- }%
- \fi
+\newcommand*\clearnotecolumns[1][\relax]{%
+ \begingroup
+ \slnc@autoclearnotecolumnsfalse
+ \ifx\relax#1\relax\else
+ \let\slnc@processnotecolumns\@empty
+ \edef\reserved@a{#1}%
+ \@for\reserved@a:=\reserved@a\do {%
+ \scr@trim@spaces\reserved@a
+ \ifx\reserved@a\@empty\else
+ \expandafter\l@addto@macro\expandafter\slnc@processnotecolumns
+ \expandafter{\expandafter\@elt\expandafter{\reserved@a}}%
+ \fi
+ }%
+ \fi
% \end{macrocode}
% First of all we need to know the note column page of this page.
% \begin{macrocode}
- \stepcounter{slnc@clearnote@label}%
- \if@filesw
- \begingroup
- \def\@elt##1{+\slnc@voidtest{##1}}%
- \protected@write\@auxout{%
- \let\theslncpage\relax
- \let\slnc@voidtest\relax
- }{%
- \string\newlabel{notecolumn.\theslnc@clearnote@label}%
- {{\theslncpage}{\numexpr \slnc@processnotecolumns\relax}}%
- }%
- \endgroup
- \fi
- \scr@ifundefinedorrelax{r@notecolumn.\theslnc@clearnote@label}{%
- \begingroup
- \def\@elt##1{, `##1'}%
- \PackageInfo{scrlayer-notecolumn}{%
- Using estimated to low value for\MessageBreak
- clearing note colums\MessageBreak
- \expandafter\@gobble\slnc@processnotecolumns
- }%
- \endgroup
- \edef\slnc@cmp@value{\the\value{slncpage}}%
- \let\reserved@a\z@
- }{%
- \edef\reserved@a{%
- \@nameuse{r@notecolumn.\theslnc@clearnote@label}\@empty\@empty
+ \stepcounter{slnc@clearnote@label}%
+ \if@filesw
+ \begingroup
+ \def\@elt##1{+\slnc@voidtest{##1}}%
+ \protected@write\@auxout{%
+ \let\theslncpage\relax
+ \let\slnc@voidtest\relax
+ }{%
+ \string\newlabel{notecolumn.\theslnc@clearnote@label}%
+ {{\theslncpage}{\numexpr \slnc@processnotecolumns\relax}}%
+ }%
+ \endgroup
+ \fi
+ \scr@ifundefinedorrelax{r@notecolumn.\theslnc@clearnote@label}{%
+ \begingroup
+ \def\@elt##1{, `##1'}%
+ \PackageInfo{scrlayer-notecolumn}{%
+ Using estimated to low value for\MessageBreak
+ clearing note colums\MessageBreak
+ \expandafter\@gobble\slnc@processnotecolumns
}%
- \edef\slnc@cmp@value{\expandafter\slnc@firstof\reserved@a\@nil}%
- \edef\reserved@a{\expandafter\slnc@secondof\reserved@a\@nil}%
+ \endgroup
+ \edef\slnc@cmp@value{\the\value{slncpage}}%
+ \let\reserved@a\z@
+ }{%
+ \edef\reserved@a{%
+ \@nameuse{r@notecolumn.\theslnc@clearnote@label}\@empty\@empty
}%
+ \edef\slnc@cmp@value{\expandafter\slnc@firstof\reserved@a\@nil}%
+ \edef\reserved@a{\expandafter\slnc@secondof\reserved@a\@nil}%
+ }%
%<*trace>
- \typeout{TRACE (slnc): clearnote=\@nameuse{theslnc@clearnote@label},
- abspage=\theslncpage, until page=\slnc@cmp@value,
- process=\reserved@a, pagetotal=\the\pagetotal, topskip=\the\topskip}%
+ \typeout{TRACE (slnc): clearnote=\@nameuse{theslnc@clearnote@label},
+ abspage=\theslncpage, until page=\slnc@cmp@value,
+ process=\reserved@a, pagetotal=\the\pagetotal, topskip=\the\topskip}%
%</trace>
- \ifvmode\ifdim \pagetotal<\topskip
+ \ifvmode\ifdim \pagetotal<\topskip
% \end{macrocode}
% \Macro{clearpage} wouldn't result in a new page, so we do not have to output
% the notes of this page but only until the previous.
% \begin{macrocode}
- \edef\slnc@cmp@value{\the\numexpr\slnc@cmp@value-1}%
+ \edef\slnc@cmp@value{\the\numexpr\slnc@cmp@value-1}%
%<trace> \typeout{TRACE (slnc): until page=\slnc@cmp@value}%
- \fi\fi
- \ifnum \reserved@a=\z@
+ \fi\fi
+ \ifnum \reserved@a=\z@
% \end{macrocode}
% Next we read all notes until the end of the current page, but only
% if a \Macro{clearpage} wouldn't result in a new page.
% \begin{macrocode}
- \ifvmode
- \ifdim \pagetotal<\topskip
- \else
- \slnc@readnotes{\slnc@cmp@value}%
- \fi
+ \ifvmode
+ \ifdim \pagetotal<\topskip
\else
\slnc@readnotes{\slnc@cmp@value}%
\fi
- \begingroup
- \aftergroup\@tempswafalse
- \long\def\slnc@note##1##2##3##4{%
- \ifnum ##2>\slnc@cmp@value\relax \else \aftergroup\@tempswatrue\fi
- }%
- \let\slnc@sync\slnc@note
- \def\@elt##1{\csname slnc@##1@unprocessed\endcsname}%
- \slnc@processnotecolumns
- \endgroup
\else
- \PackageInfo{scrlayer-notecolumn}{%
- box of at least one note column\MessageBreak
- not empty after page of \string\clearnotecolumns}%
- \@tempswatrue
+ \slnc@readnotes{\slnc@cmp@value}%
\fi
- \if@tempswa
+ \begingroup
+ \aftergroup\@tempswafalse
+ \long\def\slnc@note##1##2##3##4{%
+ \ifnum ##2>\slnc@cmp@value\relax \else \aftergroup\@tempswatrue\fi
+ }%
+ \let\slnc@sync\slnc@note
+ \def\@elt##1{\csname slnc@##1@unprocessed\endcsname}%
+ \slnc@processnotecolumns
+ \endgroup
+ \else
+ \PackageInfo{scrlayer-notecolumn}{%
+ box of at least one note column\MessageBreak
+ not empty after page of \string\clearnotecolumns}%
+ \@tempswatrue
+ \fi
+ \if@tempswa
% \end{macrocode}
% Yes, we have!
% \begin{macrocode}
- \IfLayerPageStyleExists{\currentpagestyle}{}{%
- \PackageWarning{scrlayer-notecolumn}{%
- \string\clearnotecolumns\space while active non-layer page
- style.\MessageBreak
- Activate empty page style until note column\MessageBreak
- has been cleared%
- }%
- \pagestyle{empty}%
+ \IfLayerPageStyleExists{\currentpagestyle}{}{%
+ \PackageWarning{scrlayer-notecolumn}{%
+ \string\clearnotecolumns\space while active non-layer page
+ style.\MessageBreak
+ Activate empty page style until note column\MessageBreak
+ has been cleared%
}%
- \@tempswatrue
- \fi
- \@whilesw\if@tempswa\fi{%
-%<trace> \typeout{TRACE (slnc): add \string\clearpage}%
+ \pagestyle{empty}%
+ }%
+ \@tempswatrue
+ \fi
+ \@whilesw\if@tempswa\fi{%
+%<trace> \typeout{TRACE (slnc): add \string\clearpage}%
% \end{macrocode}
% Yes, we have (maybe again)!
% \begin{macrocode}
- \clearpage
- \begingroup
- \def\@elt##1{+\slnc@voidtest{##1}}%
- \ifcase \numexpr \slnc@processnotecolumns\relax
- \aftergroup\@tempswafalse
- \long\def\slnc@note##1##2##3##4{%
- \ifnum ##2>\slnc@cmp@value\relax \else \aftergroup\@tempswatrue\fi
- }%
- \let\slnc@sync\slnc@note
- \def\@elt##1{\csname slnc@##1@unprocessed\endcsname}%
- \slnc@processnotecolumns
- \else
- \aftergroup\@tempswatrue
- \fi
- \endgroup
- \if@tempswa
+ \clearpage
+ \begingroup
+ \def\@elt##1{+\slnc@voidtest{##1}}%
+ \ifcase \numexpr \slnc@processnotecolumns\relax
+ \aftergroup\@tempswafalse
+ \long\def\slnc@note##1##2##3##4{%
+ \ifnum ##2>\slnc@cmp@value\relax \else \aftergroup\@tempswatrue\fi
+ }%
+ \let\slnc@sync\slnc@note
+ \def\@elt##1{\csname slnc@##1@unprocessed\endcsname}%
+ \slnc@processnotecolumns
+ \else
+ \aftergroup\@tempswatrue
+ \fi
+ \endgroup
+ \if@tempswa
% \end{macrocode}
% And we still have: So we have to output one more page.
% \begin{macrocode}
- \null
- \fi
- }%
- \endgroup
- }%
+ \null
+ \fi
+ }%
+ \endgroup
}
%</body>
% \end{macrocode}
@@ -1719,176 +1586,168 @@
% runs to terminate.
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface{\c@slnc@syncpoint}{%
- \newcounter{slnc@syncpoint}%
-}
-\scrlayerAddToInterface{\syncwithnotecolumn}{%
- \newcommand*{\syncwithnotecolumn}[1][marginpar]{%
- \begingroup
- \edef\reserved@a{\endgroup\noexpand\syncwithnotecolumns[{#1}]}%
- \reserved@a
- }%
+\newcounter{slnc@syncpoint}%
+\newcommand*{\syncwithnotecolumn}[1][marginpar]{%
+ \begingroup
+ \edef\reserved@a{\endgroup\noexpand\syncwithnotecolumns[{#1}]}%
+ \reserved@a
}
-\scrlayerAddToInterface{\syncwithnotecolumns}{%
- \newcommand*{\syncwithnotecolumns}[1][\relax]{%
- \begingroup
- \ifx\relax#1\relax\else
- \let\slnc@processnotecolumns\@empty
- \edef\reserved@a{#1}%
- \@for\reserved@a:=\reserved@a\do {%
- \scr@trim@spaces\reserved@a
- \ifx\reserved@a\@empty\else
- \expandafter\l@addto@macro\expandafter\slnc@processnotecolumns
- \expandafter{\expandafter\@elt\expandafter{\reserved@a}}%
- \fi
- }%
- \fi
- \stepcounter{slnc@syncpoint}%
- \def\@elt##1{%
- \addtocontents{slnc}{%
- \string\slnc@sync{##1}%
- {\noexpand\number\value{slncpage}}%
- {\theslnc@syncpoint}%
- {}%
- }%
+\newcommand*{\syncwithnotecolumns}[1][\relax]{%
+ \begingroup
+ \ifx\relax#1\relax\else
+ \let\slnc@processnotecolumns\@empty
+ \edef\reserved@a{#1}%
+ \@for\reserved@a:=\reserved@a\do {%
+ \scr@trim@spaces\reserved@a
+ \ifx\reserved@a\@empty\else
+ \expandafter\l@addto@macro\expandafter\slnc@processnotecolumns
+ \expandafter{\expandafter\@elt\expandafter{\reserved@a}}%
+ \fi
}%
- \slnc@processnotecolumns
- \ifvmode
- \let\slnc@voffset\@empty%
- \expandafter\@firstofone
- \else
- \PackageWarning{scrlayer-notecolumn}{%
- \string\syncwithnotecolumn\space in hmode.\MessageBreak
- Using \string\syncwithnotecolumn\space in horizontal\MessageBreak
- mode may result in unwanted vertical\MessageBreak
- space inside paragraphs and may lost\MessageBreak
- colours of text of notes. \space So perhaps you\MessageBreak
- should move \string\syncwithnotecolumn\space before\MessageBreak
- or after the paragraph%
+ \fi
+ \stepcounter{slnc@syncpoint}%
+ \def\@elt##1{%
+ \addtocontents{slnc}{%
+ \string\slnc@sync{##1}%
+ {\noexpand\number\value{slncpage}}%
+ {\theslnc@syncpoint}%
+ {}%
+ }%
+ }%
+ \slnc@processnotecolumns
+ \ifvmode
+ \let\slnc@voffset\@empty%
+ \expandafter\@firstofone
+ \else
+ \PackageWarning{scrlayer-notecolumn}{%
+ \string\syncwithnotecolumn\space in hmode.\MessageBreak
+ Using \string\syncwithnotecolumn\space in horizontal\MessageBreak
+ mode may result in unwanted vertical\MessageBreak
+ space inside paragraphs and may lost\MessageBreak
+ colours of text of notes. \space So perhaps you\MessageBreak
+ should move \string\syncwithnotecolumn\space before\MessageBreak
+ or after the paragraph%
+ }%
+ \let\slnc@voffset\@empty%\def\slnc@voffset{-\number\baselineskip}%
+ \expandafter\slnc@vadjust
+ \fi
+ {%
+ \if@filesw
+ \scr@savepos
+ \protected@write\@auxout{}{%
+ \string\newlabel{notecolumn.\theslnc@syncpoint.synctext.label}{%
+ {%
+ \noexpand\number
+ \numexpr \scr@lastypos\slnc@voffset\relax
+ }{\thepage}%
+ }%
}%
- \let\slnc@voffset\@empty%\def\slnc@voffset{-\number\baselineskip}%
- \expandafter\slnc@vadjust
\fi
- {%
- \if@filesw
- \scr@savepos
- \protected@write\@auxout{}{%
- \string\newlabel{notecolumn.\theslnc@syncpoint.synctext.label}{%
- {%
- \noexpand\number
- \numexpr \scr@lastypos\slnc@voffset\relax
- }{\thepage}%
+ \@ifundefined{r@notecolumn.\theslnc@syncpoint.synctext.label}{%
+ \PackageInfo{scrlayer-notecolumn}{%
+ No text label for \string\syncwithnotecolumn.\MessageBreak
+ Need rerun to sync position}%
+ }{%
+ \edef\reserved@a{%
+ \@nameuse{r@notecolumn.\theslnc@syncpoint.synctext.label}%
+ \@empty\@empty
+ }%
+ \edef\slnc@textpos{\expandafter\slnc@firstof\reserved@a\@nil}%
+ \edef\slnc@textpage{\expandafter\slnc@secondof\reserved@a\@nil}%
+ \let\slnc@notepos\slnc@textpos
+ \let\slnc@notepage\slnc@textpage
+ \def\@elt##1{%
+ \@ifundefined{r@notecolumn.##1.\theslnc@syncpoint.syncnote.label}{%
+ \PackageInfo{scrlayer-notecolumn}{%
+ No note label for sync with note column\MessageBreak
+ `##1'.\MessageBreak
+ Need rerun to sync position}%
+ \G@refundefinedtrue
+ }{%
+ \edef\reserved@a{%
+ \@nameuse{r@notecolumn.##1.\theslnc@syncpoint.syncnote.label}%
+ \@empty\@empty
}%
+ \edef\reserved@b{\expandafter\slnc@firstof\reserved@a\@nil}%
+ \edef\reserved@c{\expandafter\slnc@secondof\reserved@a\@nil}%
+ \ifnum \slnc@notepage<\reserved@c\relax
+ \let\slnc@notepos=\reserved@b
+ \let\slnc@notepage=\reserved@c
+ \else
+ \ifnum \slnc@notepage=\reserved@c\relax
+ \ifnum \slnc@notepos>\reserved@b
+ \let\slnc@notepos=\reserved@b
+ \let\slnc@notepage=\reserved@c
+ \fi
+ \fi
+ \fi
}%
- \fi
- \@ifundefined{r@notecolumn.\theslnc@syncpoint.synctext.label}{%
+ }%
+ \slnc@processnotecolumns
+ \ifnum\slnc@textpage>\slnc@notepage\relax
\PackageInfo{scrlayer-notecolumn}{%
- No text label for \string\syncwithnotecolumn.\MessageBreak
+ Last note page before last text page.\MessageBreak
Need rerun to sync position}%
- }{%
- \edef\reserved@a{%
- \@nameuse{r@notecolumn.\theslnc@syncpoint.synctext.label}%
- \@empty\@empty
- }%
- \edef\slnc@textpos{\expandafter\slnc@firstof\reserved@a\@nil}%
- \edef\slnc@textpage{\expandafter\slnc@secondof\reserved@a\@nil}%
- \let\slnc@notepos\slnc@textpos
- \let\slnc@notepage\slnc@textpage
- \def\@elt##1{%
- \@ifundefined{r@notecolumn.##1.\theslnc@syncpoint.syncnote.label}{%
- \PackageInfo{scrlayer-notecolumn}{%
- No note label for sync with note column\MessageBreak
- `##1'.\MessageBreak
- Need rerun to sync position}%
- \G@refundefinedtrue
- }{%
- \edef\reserved@a{%
- \@nameuse{r@notecolumn.##1.\theslnc@syncpoint.syncnote.label}%
- \@empty\@empty
- }%
- \edef\reserved@b{\expandafter\slnc@firstof\reserved@a\@nil}%
- \edef\reserved@c{\expandafter\slnc@secondof\reserved@a\@nil}%
- \ifnum \slnc@notepage<\reserved@c\relax
- \let\slnc@notepos=\reserved@b
- \let\slnc@notepage=\reserved@c
- \else
- \ifnum \slnc@notepage=\reserved@c\relax
- \ifnum \slnc@notepos>\reserved@b
- \let\slnc@notepos=\reserved@b
- \let\slnc@notepage=\reserved@c
- \fi
- \fi
- \fi
+ \else
+ \ifnum\slnc@textpage<\slnc@notepage\relax
+ \@whilenum \slnc@textpage<\slnc@notepage\do {%
+ \newpage\null\vskip-\dimexpr \baselineskip+\parskip\relax
+ \edef\slnc@textpage{\the\numexpr\slnc@textpage+1\relax}%
}%
- }%
- \slnc@processnotecolumns
- \ifnum\slnc@textpage>\slnc@notepage\relax
- \PackageInfo{scrlayer-notecolumn}{%
- Last note page before last text page.\MessageBreak
- Need rerun to sync position}%
- \else
- \ifnum\slnc@textpage<\slnc@notepage\relax
- \@whilenum \slnc@textpage<\slnc@notepage\do {%
- \newpage\null\vskip-\dimexpr \baselineskip+\parskip\relax
- \edef\slnc@textpage{\the\numexpr\slnc@textpage+1\relax}%
- }%
% \end{macrocode}
% \changes{v0.1}{2015/10/07}{ready for renaming \cs{pdfpageheight} in
% luaTeX}%^^A
% From lua\TeX~0.80.1 \cs{pdfpageheight} will be renamed into
% \cs{pageheight}. So we have to do an extra test for the new primitive.
% \begin{macrocode}
- \scr@ifundefinedorrelax{pdfpageheight}{%
- \scr@ifundefinedorrelax{pageheight}{%
- \@tempdima=\paperheight
- }{%
- \@tempdima=\pageheight
- }%
+ \scr@ifundefinedorrelax{pdfpageheight}{%
+ \scr@ifundefinedorrelax{pageheight}{%
+ \@tempdima=\paperheight
}{%
- \@tempdima=\pdfpageheight
+ \@tempdima=\pageheight
}%
- \@tempdima=\dimexpr \@tempdima
- -\topmargin-1in
- -\headheight-\headsep
- -\topskip+\baselineskip
- \relax
- \edef\slnc@textpos{\number\@tempdima}%
+ }{%
+ \@tempdima=\pdfpageheight
+ }%
+ \@tempdima=\dimexpr \@tempdima
+ -\topmargin-1in
+ -\headheight-\headsep
+ -\topskip+\baselineskip
+ \relax
+ \edef\slnc@textpos{\number\@tempdima}%
%<*trace>
- \PackageInfo{scrlayer-notecolumn}{%
- Top position is \slnc@textpos%
- }%
+ \PackageInfo{scrlayer-notecolumn}{%
+ Top position is \slnc@textpos%
+ }%
%</trace>
- \fi
- \ifnum\slnc@notepos>\slnc@textpos\relax
+ \fi
+ \ifnum\slnc@notepos>\slnc@textpos\relax
+ \PackageInfo{scrlayer-notecolumn}{%
+ Last note position before last text\MessageBreak
+ position.\MessageBreak
+ Need rerun to sync position%
+ }%
+ \else
+ \ifnum\slnc@notepos<\slnc@textpos\relax
+ \@tempdima=\numexpr \slnc@textpos-\slnc@notepos\relax sp
\PackageInfo{scrlayer-notecolumn}{%
- Last note position before last text\MessageBreak
- position.\MessageBreak
- Need rerun to sync position%
+ skipping \the\@tempdima\space to sync%
}%
- \else
- \ifnum\slnc@notepos<\slnc@textpos\relax
- \@tempdima=\numexpr \slnc@textpos-\slnc@notepos\relax sp
- \PackageInfo{scrlayer-notecolumn}{%
- skipping \the\@tempdima\space to sync%
- }%
- \vskip\@tempdima
- \fi
+ \vskip\@tempdima
\fi
\fi
- }%
+ \fi
}%
- \endgroup
- }%
+ }%
+ \endgroup
}
% \end{macrocode}
% \begin{macro}{\slnc@vadjust}
% \begin{macrocode}
-\scrlayerAddToInterface\slnc@vadjust{%
- \newcommand{\slnc@vadjust}[1]{%
- \@bsphack
- \vadjust{#1}%
- \@esphack
- }%
+\newcommand{\slnc@vadjust}[1]{%
+ \@bsphack
+ \vadjust{#1}%
+ \@esphack
}
%</body>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/koma-script/scrlayer-scrpage.dtx b/Master/texmf-dist/source/latex/koma-script/scrlayer-scrpage.dtx
index 22dfc382b83..6f223ad9449 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrlayer-scrpage.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrlayer-scrpage.dtx
@@ -1,8 +1,7 @@
-% \CheckSum{2604}
% \iffalse^^A meta-comment
% ======================================================================
% scrlayer-scrpage.dtx
-% Copyright (c) Markus Kohm, 2012-2019
+% Copyright (c) Markus Kohm, 2012-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +19,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrlayer-scrpage.dtx
-% Copyright (c) Markus Kohm, 2012-2019
+% Copyright (c) Markus Kohm, 2012-2020
%
% Diese Datei ist Teil der LaTeX2e KOMA-Script-Sammlung.
%
@@ -38,26 +37,8 @@
%
% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
% ======================================================================
-% \fi^^A meta-comment
-%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
%
-% \iffalse^^A meta-comment
-%%% From File: $Id: scrlayer-scrpage.dtx 3390 2019-11-18 17:09:35Z kohm $
+%%% From File: $Id: scrlayer-scrpage.dtx 3531 2020-09-11 12:28:41Z kohm $
%<identify>%%% (run: identify)
%<init>%%% (run: init)
%<options>%%% (run: options)
@@ -66,9 +47,9 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-11-18 18:09:35 +0100 (Mon, 18 Nov 2019) $
+ \filedate$Date: 2020-09-11 14:28:41 +0200 (Fri, 11 Sep 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
- \filerevision$Revision: 3390 $
+ \filerevision$Revision: 3531 $
\edef\reserved@a{%
\noexpand\endgroup
\noexpand\ProvidesFile{scrlayer-scrpage.dtx}%
@@ -185,6 +166,7 @@
% \selectlanguage{english}
%
% \changes{v0.0}{2012/01/01}{start of interface}
+% \changes{v3.32}{2020/09/11}{do not use deprecated interface commands}
% \let\restorechapter\chapter
% \let\chapter\section
% \let\section\subsection
@@ -301,8 +283,6 @@
}%
\reserved@a
}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@headwidth}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@headwidth@default}
\KOMA@key{footwidth}{%
\begingroup
\sls@split@at@iicolons#1:::\@nil
@@ -317,8 +297,6 @@
}%
\reserved@a
}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@footwidth}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@footwidth@default}
% \end{macrocode}
% \begin{macro}{\sls@split@at@iicolons}
% \changes{v3.28}{2019/11/18}{\cs{ifstr} umbenannt in \cs{Ifstr}}%^^A
@@ -332,24 +310,23 @@
% This little helper is used, e.g., by options \Option{headwidth} and
% \Option{footwidth}.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@split@at@iicolons{%
- \def\sls@split@at@iicolons#1:#2:#3:#4\@nil{%
- \Ifstr{#4}{}{}{%
- \Ifstr{#4}{:}{}{%
- \Ifstr{#4}{::}{}{%
- \PackageWarning{scrlayer}{extra `:' found!\MessageBreak
- You've used more than two colons at the argument\MessageBreak
- of a two value option.\MessageBreak
- The extra value(s) will be ignored%
- }%
+\newcommand\sls@split@at@iicolons{}
+\def\sls@split@at@iicolons#1:#2:#3:#4\@nil{%
+ \Ifstr{#4}{}{}{%
+ \Ifstr{#4}{:}{}{%
+ \Ifstr{#4}{::}{}{%
+ \PackageWarning{scrlayer}{extra `:' found!\MessageBreak
+ You've used more than two colons at the argument\MessageBreak
+ of a two value option.\MessageBreak
+ The extra value(s) will be ignored%
}%
}%
}%
- \def\reserved@a{#1}%
- \def\reserved@b{#2}%
- \def\reserved@c{#3}%
}%
-}
+ \def\reserved@a{#1}%
+ \def\reserved@b{#2}%
+ \def\reserved@c{#3}%
+}%
% \end{macrocode}
% \end{macro}%^^A \sls@split@at@iicolons
% \begin{macro}{\sls@set@hf@width}
@@ -364,62 +341,60 @@
% \end{description}
% This helper will generally set up width an offset of either head or footer.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@set@hf@width{%
- \newcommand*{\sls@set@hf@width}[4]{%
- \sls@settowidthof{\@tempdima}{#4}%
- \ifdim\@tempdima>\paperwidth
- \PackageWarning
- {scrlayer-scrpage}%
- {You've set width of #1 to a value\MessageBreak
- greater than width of page!\MessageBreak%
- I'll reduce width of #1 to width of page}%
- \setlength{\@tempdima}{\paperwidth}%
+\newcommand*{\sls@set@hf@width}[4]{%
+ \sls@settowidthof{\@tempdima}{#4}%
+ \ifdim\@tempdima>\paperwidth
+ \PackageWarning
+ {scrlayer-scrpage}%
+ {You've set width of #1 to a value\MessageBreak
+ greater than width of page!\MessageBreak%
+ I'll reduce width of #1 to width of page}%
+ \setlength{\@tempdima}{\paperwidth}%
+ \else
+ \ifdim\@tempdima<\z@
+ \PackageWarning
+ {scrlayer-scrpage}%
+ {You've set width of #1 to negative value!\MessageBreak%
+ I'll set it to 0pt}%
+ \setlength{\@tempdima}{\z@}%
+ \fi
+ \fi
+ \expandafter\edef\csname sls@#1width\endcsname{\the\@tempdima}%
+ \setlength{\@tempdima}{\textwidth}%
+ \addtolength{\@tempdima}{-\csname sls@#1width\endcsname}%
+ \Ifstr{#2}{}{%
+ \ifdim \csname sls@#1width\endcsname
+ = \dimexpr \textwidth+\marginparwidth+\marginparsep\relax
+ \setlength{\@tempdimb}{\z@}
\else
- \ifdim\@tempdima<\z@
- \PackageWarning
- {scrlayer-scrpage}%
- {You've set width of #1 to negative value!\MessageBreak%
- I'll set it to 0pt}%
- \setlength{\@tempdima}{\z@}%
- \fi
- \fi
- \expandafter\edef\csname sls@#1width\endcsname{\the\@tempdima}%
- \setlength{\@tempdima}{\textwidth}%
- \addtolength{\@tempdima}{-\csname sls@#1width\endcsname}%
- \Ifstr{#2}{}{%
- \ifdim \csname sls@#1width\endcsname
- = \dimexpr \textwidth+\marginparwidth+\marginparsep\relax
- \setlength{\@tempdimb}{\z@}
+ \if@twoside
+ \setlength{\@tempdimb}{.3333333333\@tempdima}%
\else
- \if@twoside
- \setlength{\@tempdimb}{.3333333333\@tempdima}%
- \else
- \setlength{\@tempdimb}{.5\@tempdima}%
- \fi
+ \setlength{\@tempdimb}{.5\@tempdima}%
\fi
- }{%
- \sls@settowidthof{\@tempdimb}{#2}%
- }%
- \Ifstr{#3}{}{%
- \addtolength{\@tempdima}{-\@tempdimb}%
- }{%
- \sls@settowidthof{\@tempdima}{#3}%
- \setlength{\@tempdima}{-\@tempdima}%
- }%
- \ifdim\@tempdimb<\z@
- \setlength{\@tempdimb}{-\@tempdimb}%
- \expandafter\edef\csname sls@odd#1shift\endcsname{-\the\@tempdimb}%
- \else
- \expandafter\edef\csname sls@odd#1shift\endcsname{\the\@tempdimb}%
- \fi
- \ifdim\@tempdima<\z@
- \setlength{\@tempdima}{-\@tempdima}%
- \expandafter\edef\csname sls@even#1shift\endcsname{-\the\@tempdima}%
- \else
- \expandafter\edef\csname sls@even#1shift\endcsname{\the\@tempdima}%
\fi
+ }{%
+ \sls@settowidthof{\@tempdimb}{#2}%
}%
-}
+ \Ifstr{#3}{}{%
+ \addtolength{\@tempdima}{-\@tempdimb}%
+ }{%
+ \sls@settowidthof{\@tempdima}{#3}%
+ \setlength{\@tempdima}{-\@tempdima}%
+ }%
+ \ifdim\@tempdimb<\z@
+ \setlength{\@tempdimb}{-\@tempdimb}%
+ \expandafter\edef\csname sls@odd#1shift\endcsname{-\the\@tempdimb}%
+ \else
+ \expandafter\edef\csname sls@odd#1shift\endcsname{\the\@tempdimb}%
+ \fi
+ \ifdim\@tempdima<\z@
+ \setlength{\@tempdima}{-\@tempdima}%
+ \expandafter\edef\csname sls@even#1shift\endcsname{-\the\@tempdima}%
+ \else
+ \expandafter\edef\csname sls@even#1shift\endcsname{\the\@tempdima}%
+ \fi
+}%
% \end{macrocode}
% \end{macro}%^^A \sls@set@hf@width
% \begin{macro}{\sls@headwidth}
@@ -432,28 +407,24 @@
% also used by the options and therefore need to be initialised before option
% usage.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@headwidth{%
- \scr@ifundefinedorrelax{@headwidth}{%
- \newcommand*{\sls@headwidth}{\textwidth}%
- \KOMA@kav@add{.scrlayer-scrpage.sty}{headwidth}{\textwidth:0pt:0pt}%
- }{%
- \newcommand*{\sls@headwidth}{\@headwidth}%
- \KOMA@kav@xadd{.scrlayer-scrpage.sty}{headwidth}{\@headwidth:0pt:0pt}%
- }%
-}
-\scrlayerAddToInterface\sls@oddheadshift{\newcommand*{\sls@oddheadshift}{0pt}}
-\scrlayerAddToInterface\sls@evenheadshift{\newcommand*{\sls@evenheadshift}{0pt}}
-\scrlayerAddToInterface\sls@footwidth{%
- \scr@ifundefinedorrelax{@footwidth}{%
- \newcommand*{\sls@footwidth}{\textwidth}%
- \KOMA@kav@add{.scrlayer-scrpage.sty}{footwidth}{\textwidth:0pt:0pt}
- }{%
- \newcommand*{\sls@footwidth}{\@footwidth}%
- \KOMA@kav@xadd{.scrlayer-scrpage.sty}{footwidth}{\@footwidth:0pt:0pt}
- }%
-}
-\scrlayerAddToInterface\sls@oddfootshift{\newcommand*{\sls@oddfootshift}{0pt}}
-\scrlayerAddToInterface\sls@evenfootshift{\newcommand*{\sls@evenfootshift}{0pt}}
+\scr@ifundefinedorrelax{@headwidth}{%
+ \newcommand*{\sls@headwidth}{\textwidth}%
+ \KOMA@kav@add{.scrlayer-scrpage.sty}{headwidth}{\textwidth:0pt:0pt}%
+}{%
+ \newcommand*{\sls@headwidth}{\@headwidth}%
+ \KOMA@kav@xadd{.scrlayer-scrpage.sty}{headwidth}{\@headwidth:0pt:0pt}%
+}%
+\newcommand*{\sls@oddheadshift}{0pt}
+\newcommand*{\sls@evenheadshift}{0pt}
+\scr@ifundefinedorrelax{@footwidth}{%
+ \newcommand*{\sls@footwidth}{\textwidth}%
+ \KOMA@kav@add{.scrlayer-scrpage.sty}{footwidth}{\textwidth:0pt:0pt}
+}{%
+ \newcommand*{\sls@footwidth}{\@footwidth}%
+ \KOMA@kav@xadd{.scrlayer-scrpage.sty}{footwidth}{\@footwidth:0pt:0pt}
+}%
+\newcommand*{\sls@oddfootshift}{0pt}
+\newcommand*{\sls@evenfootshift}{0pt}
% \end{macrocode}
% \end{macro}%^^A \sls@headwidth
% \end{macro}%^^A \sls@oddheadshift
@@ -474,50 +445,48 @@
% expression. But it cannot be both a dimensional expression using symbolic
% values!
% \begin{macrocode}
-\scrlayerAddToInterface\sls@settotwidthof{%
- \newcommand*{\sls@settowidthof}[2]{%
- \Ifstr{#2}{paper}{%
- \setlength{#1}{\paperwidth}%
+\newcommand*{\sls@settowidthof}[2]{%
+ \Ifstr{#2}{paper}{%
+ \setlength{#1}{\paperwidth}%
+ }{%
+ \Ifstr{#2}{text}{%
+ \setlength{#1}{\textwidth}%
}{%
- \Ifstr{#2}{text}{%
- \setlength{#1}{\textwidth}%
+ \Ifstr{#2}{marginpar}{%
+ \setlength{#1}{\dimexpr \marginparwidth+\marginparsep\relax}%
}{%
- \Ifstr{#2}{marginpar}{%
- \setlength{#1}{\dimexpr \marginparwidth+\marginparsep\relax}%
+ \Ifstr{#2}{textwithmarginpar}{%
+ \setlength{#1}{\dimexpr\textwidth
+ +\marginparwidth
+ +\marginparsep\relax}%
}{%
- \Ifstr{#2}{textwithmarginpar}{%
- \setlength{#1}{\dimexpr\textwidth
- +\marginparwidth
- +\marginparsep\relax}%
+ \Ifstr{#2}{head}{%
+ \setlength{#1}{\sls@headwidth}%
}{%
- \Ifstr{#2}{head}{%
- \setlength{#1}{\sls@headwidth}%
+ \Ifstr{#2}{foot}{%
+ \setlength{#1}{\sls@footwidth}%
}{%
- \Ifstr{#2}{foot}{%
- \setlength{#1}{\sls@footwidth}%
+ \Ifstr{#2}{headtopline}{%
+ \setlength{#1}{\sls@headabove@linelength}%
}{%
- \Ifstr{#2}{headtopline}{%
- \setlength{#1}{\sls@headabove@linelength}%
+ \Ifstr{#2}{headsepline}{%
+ \setlength{#1}{\sls@headbelow@linelength}%
}{%
- \Ifstr{#2}{headsepline}{%
- \setlength{#1}{\sls@headbelow@linelength}%
+ \Ifstr{#2}{footsepline}{%
+ \setlength{#1}{\sls@footabove@linelength}%
}{%
- \Ifstr{#2}{footsepline}{%
- \setlength{#1}{\sls@footabove@linelength}%
+ \Ifstr{#2}{footbotline}{%
+ \setlength{#1}{\sls@footbelow@linelength}%
}{%
- \Ifstr{#2}{footbotline}{%
- \setlength{#1}{\sls@footbelow@linelength}%
+ \Ifstr{#2}{page}{%
+ \setlength{#1}{\paperwidth}%
+ \begingroup
+ \expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname ta@bcor\endcsname\relax\else
+ \addtolength{#1}{-\ta@bcor}%
+ \fi
}{%
- \Ifstr{#2}{page}{%
- \setlength{#1}{\paperwidth}%
- \begingroup
- \expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname ta@bcor\endcsname\relax\else
- \addtolength{#1}{-\ta@bcor}%
- \fi
- }{%
- \setlength{#1}{\dimexpr #2\relax}%
- }%
+ \setlength{#1}{\dimexpr #2\relax}%
}%
}%
}%
@@ -529,21 +498,19 @@
}%
}%
}%
-}
-\scrlayerAddToInterface\sls@deftowidthof{%
- \newcommand*{\sls@deftowidthof}[2]{%
- \Ifstr{#2}{autohead}{%
- \expandafter\def\csname #1\endcsname{\sls@headwidth}%
+}%
+\newcommand*{\sls@deftowidthof}[2]{%
+ \Ifstr{#2}{autohead}{%
+ \expandafter\def\csname #1\endcsname{\sls@headwidth}%
+ }{%
+ \Ifstr{#2}{autofoot}{%
+ \expandafter\def\csname #1\endcsname{\sls@footwidth}%
}{%
- \Ifstr{#2}{autofoot}{%
- \expandafter\def\csname #1\endcsname{\sls@footwidth}%
- }{%
- \sls@settowidthof{\@tempdima}{#2}%
- \expandafter\edef\csname #1\endcsname{\the\@tempdima}%
- }%
+ \sls@settowidthof{\@tempdima}{#2}%
+ \expandafter\edef\csname #1\endcsname{\the\@tempdima}%
}%
}%
-}
+}%
%</options>
% \end{macrocode}
% \end{macro}%^^A \sls@deftowidthof
@@ -556,16 +523,12 @@
% For compatibility with \Package{scrpage2}, map the commands to the options:
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\setheadwidth{%
- \newcommand*{\setheadwidth}[2][]{%
- \KOMAoptions{headwidth=#2:#1}%
- }%
-}
-\scrlayerAddToInterface\setfootwidth{%
- \newcommand*{\setfootwidth}[2][]{%
- \KOMAoptions{footwidth=#2:#1}%
- }%
-}
+\newcommand*{\setheadwidth}[2][]{%
+ \KOMAoptions{headwidth=#2:#1}%
+}%
+\newcommand*{\setfootwidth}[2][]{%
+ \KOMAoptions{footwidth=#2:#1}%
+}%
%</body>
% \end{macrocode}
% \end{macro}%^^A \setheadwidth
@@ -611,23 +574,15 @@
\KOMA@key{headtopline}[:]{%
\sls@set@values[headtopline]{head}{above}{#1}%
}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@headtopline}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@headtopline@default}
\KOMA@key{headsepline}[:]{%
\sls@set@values[headsepline]{head}{below}{#1}%
}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@headsepline}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@headsepline@default}
\KOMA@key{footsepline}[:]{%
\sls@set@values[footsepline]{foot}{above}{#1}%
}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@footsepline}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@footsepline@default}
\KOMA@key{footbotline}[:]{%
\sls@set@values[footbotline]{foot}{below}{#1}%
}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@footbotline}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@footbotline@default}
% \end{macrocode}
% \begin{macro}{\sls@set@values}
% \changes{v3.28}{2019/11/18}{\cs{ifstr} umbenannt in \cs{Ifstr}}%^^A
@@ -643,65 +598,63 @@
% Helper macros for the options to set two macros by two values of one
% option. The two values are separated by a colon.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@set@values{%
- \newcommand*{\sls@set@values}[4][]{%
- \begingroup
- \Ifstr{#1}{}{%
- \FamilyKeyStateUnknown
- }{%
- \KOMA@set@ifkey{#1}{@tempswa}{#4}%
- }%
- \ifx\FamilyKeyState\FamilyKeyStateProcessed
- \if@tempswa
- \edef\reserved@b{%
- \noexpand\endgroup
- \noexpand\@namedef{sls@#2#3@linethickness}{.4pt}%
- \noexpand\@namedef{sls@#2#3@linelength}{%
- \expandafter\noexpand\csname sls@#2width\endcsname
- }%
- }%
- \else
- \def\reserved@b{%
- \endgroup
- \@namedef{sls@#2#3@linethickness}{0pt}%
- \@namedef{sls@#2#3@linelength}{0pt}%
+\newcommand*{\sls@set@values}[4][]{%
+ \begingroup
+ \Ifstr{#1}{}{%
+ \FamilyKeyStateUnknown
+ }{%
+ \KOMA@set@ifkey{#1}{@tempswa}{#4}%
+ }%
+ \ifx\FamilyKeyState\FamilyKeyStateProcessed
+ \if@tempswa
+ \edef\reserved@b{%
+ \noexpand\endgroup
+ \noexpand\@namedef{sls@#2#3@linethickness}{.4pt}%
+ \noexpand\@namedef{sls@#2#3@linelength}{%
+ \expandafter\noexpand\csname sls@#2width\endcsname
}%
- \fi
+ }%
\else
- \let\reserved@a\@empty
- \let\reserved@b\@empty
- \sls@split@at@colon#4::\@nil
- \ifx\reserved@a\@empty
- \def\reserved@a{\endgroup\@namedef{sls@#2#3@linethickness}{.4pt}}%
- \else
- \setlength{\@tempdima}{\dimexpr\reserved@a\relax}%
- \edef\reserved@a{%
- \noexpand\endgroup
- \noexpand\@namedef{sls@#2#3@linethickness}{\the\@tempdima}%
- }%
- \fi
- \ifx\reserved@b\@empty
- \def\reserved@b{%
- \reserved@a
- \@namedef{sls@#2#3@linelength}{\@nameuse{sls@#2width}}%
- }%
- \else
- \edef\reserved@b{%
- \noexpand\reserved@a
- \noexpand\sls@deftowidthof{sls@#2#3@linelength}{\reserved@b}%
- }%
- \fi
+ \def\reserved@b{%
+ \endgroup
+ \@namedef{sls@#2#3@linethickness}{0pt}%
+ \@namedef{sls@#2#3@linelength}{0pt}%
+ }%
\fi
- \reserved@b
- \FamilyKeyStateProcessed
- \Ifstr{#1}{}{}{%
- \KOMA@kav@xreplacevalue{.scrlayer-scrpage.sty}{#1}{%
- \csname sls@#2#3@linethickness\endcsname
- :\csname sls@#2#3@linelength\endcsname
- }%
+ \else
+ \let\reserved@a\@empty
+ \let\reserved@b\@empty
+ \sls@split@at@colon#4::\@nil
+ \ifx\reserved@a\@empty
+ \def\reserved@a{\endgroup\@namedef{sls@#2#3@linethickness}{.4pt}}%
+ \else
+ \setlength{\@tempdima}{\dimexpr\reserved@a\relax}%
+ \edef\reserved@a{%
+ \noexpand\endgroup
+ \noexpand\@namedef{sls@#2#3@linethickness}{\the\@tempdima}%
+ }%
+ \fi
+ \ifx\reserved@b\@empty
+ \def\reserved@b{%
+ \reserved@a
+ \@namedef{sls@#2#3@linelength}{\@nameuse{sls@#2width}}%
+ }%
+ \else
+ \edef\reserved@b{%
+ \noexpand\reserved@a
+ \noexpand\sls@deftowidthof{sls@#2#3@linelength}{\reserved@b}%
+ }%
+ \fi
+ \fi
+ \reserved@b
+ \FamilyKeyStateProcessed
+ \Ifstr{#1}{}{}{%
+ \KOMA@kav@xreplacevalue{.scrlayer-scrpage.sty}{#1}{%
+ \csname sls@#2#3@linethickness\endcsname
+ :\csname sls@#2#3@linelength\endcsname
}%
}%
-}
+}%
% \end{macrocode}
% \end{macro}%^^A \sls@set@values
% \begin{macro}{\sls@split@at@colon}
@@ -716,21 +669,20 @@
% This little helper is used, e.g., by options \Option{headwidth} and
% \Option{footwidth}.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@split@at@colon{%
- \def\sls@split@at@colon#1:#2:#3\@nil{%
- \Ifstr{#3}{}{}{%
- \Ifstr{#3}{:}{}{%
- \PackageWarning{scrlayer}{extra `:' found!\MessageBreak
- You've used more than one colon at the argument\MessageBreak
- of a two value option.\MessageBreak
- The extra value(s) will be ignored%
- }%
+\newcommand*{\sls@split@at@colon}{}
+\def\sls@split@at@colon#1:#2:#3\@nil{%
+ \Ifstr{#3}{}{}{%
+ \Ifstr{#3}{:}{}{%
+ \PackageWarning{scrlayer}{extra `:' found!\MessageBreak
+ You've used more than one colon at the argument\MessageBreak
+ of a two value option.\MessageBreak
+ The extra value(s) will be ignored%
}%
}%
- \def\reserved@a{#1}%
- \def\reserved@b{#2}%
}%
-}
+ \def\reserved@a{#1}%
+ \def\reserved@b{#2}%
+}%
% \end{macrocode}
% \end{macro}%^^A \sls@split@at@colon
% \begin{macro}{\sls@headabove@linelength}
@@ -745,42 +697,30 @@
% use macros. Those are also used by the options and therefore need to be
% initialised before option usage.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@headabove@linelength{%
- \newcommand*{\sls@headabove@linelength}{\sls@headwidth}%
-}
-\scrlayerAddToInterface\sls@headabove{%
- \newcommand*{\sls@headabove@linethickness}{0pt}%
-}
+\newcommand*{\sls@headabove@linelength}{\sls@headwidth}%
+\newcommand*{\sls@headabove@linethickness}{0pt}%
\KOMA@kav@xadd{.scrlayer-scrpage.sty}{headtopline}{%
\expandafter\noexpand\sls@headabove@linethickness:%
- \expandafter\noexpand\sls@headabove@linelength}
-\scrlayerAddToInterface\sls@headbelow@linelength{%
- \newcommand*{\sls@headbelow@linelength}{\sls@headwidth}%
-}
-\scrlayerAddToInterface\sls@headbelow@linethickness{%
- \newcommand*{\sls@headbelow@linethickness}{0pt}%
+ \expandafter\noexpand\sls@headabove@linelength
}
+\newcommand*{\sls@headbelow@linelength}{\sls@headwidth}%
+\newcommand*{\sls@headbelow@linethickness}{0pt}%
\KOMA@kav@xadd{.scrlayer-scrpage.sty}{headsepline}{%
\expandafter\noexpand\sls@headbelow@linethickness:%
- \expandafter\noexpand\sls@headbelow@linelength}
-\scrlayerAddToInterface\sls@footabove@linelength{%
- \newcommand*{\sls@footabove@linelength}{\sls@footwidth}%
-}
-\scrlayerAddToInterface\sls@footabove@linethickness{%
- \newcommand*{\sls@footabove@linethickness}{0pt}%
+ \expandafter\noexpand\sls@headbelow@linelength
}
+\newcommand*{\sls@footabove@linelength}{\sls@footwidth}%
+\newcommand*{\sls@footabove@linethickness}{0pt}%
\KOMA@kav@xadd{.scrlayer-scrpage.sty}{footsepline}{%
\expandafter\noexpand\sls@footabove@linethickness:%
- \expandafter\noexpand\sls@footabove@linelength}
-\scrlayerAddToInterface\sls@footbelow@linelength{%
- \newcommand*{\sls@footbelow@linelength}{\sls@footwidth}%
-}
-\scrlayerAddToInterface\sls@footbelow@linethickness{%
- \newcommand*{\sls@footbelow@linethickness}{0pt}%
+ \expandafter\noexpand\sls@footabove@linelength
}
+\newcommand*{\sls@footbelow@linelength}{\sls@footwidth}%
+\newcommand*{\sls@footbelow@linethickness}{0pt}%
\KOMA@kav@xadd{.scrlayer-scrpage.sty}{footbotline}{%
\expandafter\noexpand\sls@footbelow@linethickness:%
- \expandafter\noexpand\sls@footbelow@linelength}
+ \expandafter\noexpand\sls@footbelow@linelength
+}
%</options>
% \end{macrocode}
% \end{macro}%^^A \sls@footbelow@linethickness
@@ -810,38 +750,10 @@
% While these only switches the rule on or off, we need only some switches.
% \begin{macrocode}
%<*options>
-\scrlayerAddCsToInterface{ifsls@plain@head@above@line}{%
- \KOMA@ifkey{plainheadtopline}{sls@plain@head@above@line}%
- \scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@plainheadtopline}%
- \scrlayer@AddCsToInterface{%
- KV@KOMA.scrlayer-scrpage.sty@plainheadtopline@default}%
- \scrlayer@AddCsToInterface{sls@plain@head@above@linetrue}
- \scrlayer@AddCsToInterface{sls@plain@head@above@linefalse}
-}
-\scrlayerAddCsToInterface{ifsls@plain@head@sbelow@line}{%
- \KOMA@ifkey{plainheadsepline}{sls@plain@head@below@line}%
- \scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@plainheadsepline}%
- \scrlayer@AddCsToInterface{%
- KV@KOMA.scrlayer-scrpage.sty@plainheadsepline@default}%
- \scrlayer@AddCsToInterface{sls@plain@head@below@linetrue}%
- \scrlayer@AddCsToInterface{sls@plain@head@below@linefalse}%
-}
-\scrlayerAddCsToInterface{ifsls@plain@foot@above@line}{%
- \KOMA@ifkey{plainfootsepline}{sls@plain@foot@above@line}%
- \scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@plainfootsepline}%
- \scrlayer@AddCsToInterface{%
- KV@KOMA.scrlayer-scrpage.sty@plainfootsepline@default}%
- \scrlayer@AddCsToInterface{sls@plain@foot@above@linetrue}%
- \scrlayer@AddCsToInterface{sls@plain@foot@above@linefalse}%
-}
-\scrlayerAddCsToInterface{ifsls@plain@foot@below@line}{%
- \KOMA@ifkey{plainfootbotline}{sls@plain@foot@below@line}%
- \scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@plainfootbotline}%
- \scrlayer@AddCsToInterface{%
- KV@KOMA.scrlayer-scrpage.sty@plainfootbotline@default}%
- \scrlayer@AddCsToInterface{sls@plain@foot@below@linetrue}%
- \scrlayer@AddCsToInterface{sls@plain@foot@below@linefalse}%
-}
+\KOMA@ifkey{plainheadtopline}{sls@plain@head@above@line}%
+\KOMA@ifkey{plainheadsepline}{sls@plain@head@below@line}%
+\KOMA@ifkey{plainfootsepline}{sls@plain@foot@above@line}%
+\KOMA@ifkey{plainfootbotline}{sls@plain@foot@below@line}%
%</options>
% \end{macrocode}
% \end{macro}%^^A \ifsls@plain@foot@below@line
@@ -866,9 +778,7 @@
% may help.
% \begin{macrocode}
%<*options>
-\scrlayerAddToInterface\sls@hfline@adjust{%
- \newcommand*{\sls@hfline@adjust}{0}%
-}
+\newcommand*{\sls@hfline@adjust}{0}%
\KOMA@kav@add{.scrlayer-scrpage.sty}{ilines}{}
\KOMA@key{ilines}[]{%
\ifx\relax#1\relax
@@ -882,8 +792,6 @@
\def\FamilyKeyStateProcessed{unexpected value}%
\fi
}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@ilines}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@ilines@default}
\KOMA@key{clines}[]{%
\ifx\relax#1\relax
\renewcommand*{\sls@hfline@adjust}{1}%
@@ -896,8 +804,6 @@
\def\FamilyKeyStateProcessed{unexpected value}%
\fi
}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@clines}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@clines@default}
\KOMA@key{olines}[]{%
\ifx\relax#1\relax
\renewcommand*{\sls@hfline@adjust}{2}%
@@ -910,8 +816,6 @@
\def\FamilyKeyStateProcessed{unexpected value}%
\fi
}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@olines}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@olines@default}
\KOMA@kav@add{.scrlayer-scrpage.sty}{ilines}{}
%</options>
% \end{macrocode}
@@ -935,18 +839,10 @@
% \end{description}
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\setheadtopline{%
- \newcommand*{\setheadtopline}{\sls@setline{head}{above}}%
-}
-\scrlayerAddToInterface\setheadsepline{%
- \newcommand*{\setheadsepline}{\sls@setline{head}{below}}%
-}
-\scrlayerAddToInterface\setfootsepline{%
- \newcommand*{\setfootsepline}{\sls@setline{foot}{above}}%
-}
-\scrlayerAddToInterface\setfootbotline{%
- \newcommand*{\setfootbotline}{\sls@setline{foot}{below}}%
-}
+\newcommand*{\setheadtopline}{\sls@setline{head}{above}}%
+\newcommand*{\setheadsepline}{\sls@setline{head}{below}}%
+\newcommand*{\setfootsepline}{\sls@setline{foot}{above}}%
+\newcommand*{\setfootbotline}{\sls@setline{foot}{below}}%
% \end{macrocode}
% \begin{macro}{\sls@setline}
% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
@@ -964,78 +860,72 @@
% Helper to set up the line attributes processing the parameters of the
% commands above.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@setline{%
- \newcommand*\sls@setline[2]{%
- \kernel@ifnextchar[%]
- {\sls@@setline{#1}{#2}}{\sls@@@setline{#1#2}}%
- }%
-}
-\scrlayerAddToInterface\sls@@setline{%
- \def\sls@@setline#1#2[#3]{%
- \Ifstr{#3}{auto}{%
- \sls@deftowidthof{sls@#1#2@linelength}{#3#1}%
- }{%
- \sls@deftowidthof{sls@#1#2@linelength}{#3}%
- }%
- \sls@@@setline{#1#2}%
+\newcommand*\sls@setline[2]{%
+ \kernel@ifnextchar[%]
+ {\sls@@setline{#1}{#2}}{\sls@@@setline{#1#2}}%
+}%
+\newcommand*{\sls@@setline}{}
+\def\sls@@setline#1#2[#3]{%
+ \Ifstr{#3}{auto}{%
+ \sls@deftowidthof{sls@#1#2@linelength}{#3#1}%
+ }{%
+ \sls@deftowidthof{sls@#1#2@linelength}{#3}%
}%
-}
-\scrlayerAddToInterface\sls@@@setline{%
- \def\sls@@@setline#1#2{%
- \edef\@tempa{#2}\edef\@tempb{current}%
- \Ifstr{#2}{}{}{%
- \Ifstr{#2}{current}{}{%
- \setlength{\@tempdima}{#2}%
- \Ifstr{#1}{headabove}{%
+ \sls@@@setline{#1#2}%
+}%
+\newcommand*{\sls@@@setline}[2]{%
+ \edef\@tempa{#2}\edef\@tempb{current}%
+ \Ifstr{#2}{}{}{%
+ \Ifstr{#2}{current}{}{%
+ \setlength{\@tempdima}{#2}%
+ \Ifstr{#1}{headabove}{%
+ \KOMAExecuteOptions[.scrlayer-scrpage.sty]%
+ {headtopline=\@tempdima:\csname sls@#1@linelength\endcsname}%
+ }{\Ifstr{#1}{headbelow}{%
\KOMAExecuteOptions[.scrlayer-scrpage.sty]%
- {headtopline=\@tempdima:\csname sls@#1@linelength\endcsname}%
- }{\Ifstr{#1}{headbelow}{%
+ {headsepline=\@tempdima:\csname sls@#1@linelength\endcsname}%
+ }{%
+ \Ifstr{#1}{footabove}{%
\KOMAExecuteOptions[.scrlayer-scrpage.sty]%
- {headsepline=\@tempdima:\csname sls@#1@linelength\endcsname}%
+ {footsepline=\@tempdima:\csname sls@#1@linelength\endcsname}%
}{%
- \Ifstr{#1}{footabove}{%
- \KOMAExecuteOptions[.scrlayer-scrpage.sty]%
- {footsepline=\@tempdima:\csname sls@#1@linelength\endcsname}%
- }{%
- \KOMAExecuteOptions[.scrlayer-scrpage.sty]%
- {footbotline=\@tempdima:\csname sls@#1@linelength\endcsname}%
- }%
+ \KOMAExecuteOptions[.scrlayer-scrpage.sty]%
+ {footbotline=\@tempdima:\csname sls@#1@linelength\endcsname}%
}%
}%
}%
}%
- \PackageWarning{scrlayer-scrpage}{%
- Command deprecated!\MessageBreak
- Usage of `\string\setheadtopline',
- `\string\setheadsepline',\MessageBreak
- `\string\setfootsepline', and `\string\setfootbotline'\MessageBreak
- became deprecated with scrlayer-scrpage.\MessageBreak
- You should use KOMA-Script options\MessageBreak
- `headsepline', `headtopline', `footsepline',\MessageBreak
- or `footbotline' with values\MessageBreak
- `<line thickness>:<line length>' to setup\MessageBreak
- the line length and thickness, and\MessageBreak
- `\string\setkomafont' or `\string\addtokomafont' to\MessageBreak
- setup the colour%
- }%
- \kernel@ifnextchar[%]
- {%
- \sls@@@@setline{#1}%
- }{%
- }%
}%
-}
-\scrlayerAddToInterface\sls@@@@setline{%
- \def\sls@@@@setline#1[#2]{%
- \Ifstr{#1}{headabove}{\setkomafont{headtopline}{#2}}{%
- \Ifstr{#1}{headbelow}{\setkomafont{headsepline}{#2}}{%
- \Ifstr{#1}{footabove}{\setkomafont{footsepline}{#2}}{%
- \setkomafont{footbotline}{#2}%
- }%
+ \PackageWarning{scrlayer-scrpage}{%
+ Command deprecated!\MessageBreak
+ Usage of `\string\setheadtopline',
+ `\string\setheadsepline',\MessageBreak
+ `\string\setfootsepline', and `\string\setfootbotline'\MessageBreak
+ became deprecated with scrlayer-scrpage.\MessageBreak
+ You should use KOMA-Script options\MessageBreak
+ `headsepline', `headtopline', `footsepline',\MessageBreak
+ or `footbotline' with values\MessageBreak
+ `<line thickness>:<line length>' to setup\MessageBreak
+ the line length and thickness, and\MessageBreak
+ `\string\setkomafont' or `\string\addtokomafont' to\MessageBreak
+ setup the colour%
+ }%
+ \kernel@ifnextchar[%]
+ {%
+ \sls@@@@setline{#1}%
+ }{%
+ }%
+}%
+\newcommand*{\sls@@@@setline}{}
+\def\sls@@@@setline#1[#2]{%
+ \Ifstr{#1}{headabove}{\setkomafont{headtopline}{#2}}{%
+ \Ifstr{#1}{headbelow}{\setkomafont{headsepline}{#2}}{%
+ \Ifstr{#1}{footabove}{\setkomafont{footsepline}{#2}}{%
+ \setkomafont{footbotline}{#2}%
}%
}%
}%
-}
+}%
% \end{macrocode}
% \end{macro}%^^A \sls@setline
% \end{macro}%^^A \sls@@setline
@@ -1050,32 +940,16 @@
% become only part of the interface if they are not.
% \begin{macrocode}
\@ifundefined{scr@fnt@headtopline}{%
- \@ifundefined{@headtoplinefont}{%
- \scrlayer@AddCsToInterface{@headtoplinefont}%
- }{}%
\newkomafont{headtopline}{}%
- \scrlayer@AddCsToInterface{scr@fnt@headtopline}%
}{}
\@ifundefined{scr@fnt@headsepline}{%
- \@ifundefined{@headseplinefont}{%
- \scrlayer@AddCsToInterface{@headseplinefont}%
- }{}%
\newkomafont{headsepline}{}%
- \scrlayer@AddCsToInterface{scr@fnt@headsepline}%
}{}
\@ifundefined{scr@fnt@footsepline}{%
- \@ifundefined{@footseplinefont}{%
- \scrlayer@AddCsToInterface{@footseplinefont}%
- }{}%
\newkomafont{footsepline}{}%
- \scrlayer@AddCsToInterface{scr@fnt@footsepline}%
}{}
\@ifundefined{scr@fnt@footbotline}{%
- \@ifundefined{@footbotlinefont}{%
- \scrlayer@AddCsToInterface{@footbotlinefont}%
- }{}%
\newkomafont{footbotline}{}%
- \scrlayer@AddCsToInterface{scr@fnt@footbotline}%
}{}
%</body>
% \end{macrocode}
@@ -1256,7 +1130,6 @@
\KOMA@kav@replacevalue{.scrlayer-scrpage.sty}{pagestyleset}{#1}%
}%
}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@pagestyleset}
% \end{macrocode}
% \begin{macro}{\sls@ps@style@standard}
% \changes{v3.28}{2019/11/18}{\cs{ifstr} umbenannt in \cs{Ifstr}}%^^A
@@ -1264,63 +1137,59 @@
% \changes{v3.28}{2019/11/18}{\cs{ifstr} umbenannt in \cs{Ifstr}}%^^A
% These are the predefined page style sets.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@ps@style@standard{%
- \newcommand*{\sls@ps@style@standard}{%
- \let\MakeMarkcase\MakeUppercase
- \scrlayer@AtEndOfPackage{%
- \pagestyle{scrheadings}%
- \clearpairofpagestyles
- \ihead{\headmark}%
- \ohead{\pagemark}%
- \cfoot[\if@twoside\else\pagemark\fi]{}%
- }%
+\newcommand*{\sls@ps@style@standard}{%
+ \let\MakeMarkcase\MakeUppercase
+ \scrlayer@AtEndOfPackage{%
+ \pagestyle{scrheadings}%
+ \clearpairofpagestyles
+ \ihead{\headmark}%
+ \ohead{\pagemark}%
+ \cfoot[\if@twoside\else\pagemark\fi]{}%
}%
-}
-\scrlayerAddCsToInterface{sls@ps@style@KOMA-Script}{%
- \@namedef{sls@ps@style@KOMA-Script}{%
- \let\MakeMarkcase\@firstofone
- \scrlayer@AtEndOfPackage{%
- \pagestyle{scrheadings}%
- \clearpairofpagestyles
- \ohead{\if@twoside\headmark\fi}%
- \chead{\if@twoside\else\headmark\fi}%
- \ofoot[\if@twoside\pagemark\fi]{\if@twoside\pagemark\fi}%
- \cfoot[\if@twoside\else\pagemark\fi]{\if@twoside\else\pagemark\fi}%
- \scr@ifundefinedorrelax{KOMAClassName}{}{%
- \Ifstr{\KOMAClassName}{scrlttr2}{%
+}%
+\expandafter\newcommand\expandafter*\csname sls@ps@style@KOMA-Script\endcsname{%
+ \let\MakeMarkcase\@firstofone
+ \scrlayer@AtEndOfPackage{%
+ \pagestyle{scrheadings}%
+ \clearpairofpagestyles
+ \ohead{\if@twoside\headmark\fi}%
+ \chead{\if@twoside\else\headmark\fi}%
+ \ofoot[\if@twoside\pagemark\fi]{\if@twoside\pagemark\fi}%
+ \cfoot[\if@twoside\else\pagemark\fi]{\if@twoside\else\pagemark\fi}%
+ \scr@ifundefinedorrelax{KOMAClassName}{}{%
+ \Ifstr{\KOMAClassName}{scrlttr2}{%
% \end{macrocode}
% We are using \Class{scrlttr2}, so we have to initialise the page style
% different:
% \changes{v3.18}{2015/06/24}{missing \cs{lofoot} and \cs{rofoot} added}%^^A
% \begin{macrocode}
- \clearpairofpagestyles
- \lehead[\ifnum\@pageat=\z@\pagemark\fi]
- {\ifnum\@pageat=\z@\pagemark\else\leftmark\fi}%
- \lohead[\ifnum\@pageat=\z@\pagemark\fi]
- {\ifnum\@pageat=\z@\pagemark\else\leftmark\fi}%
- \chead[\ifnum\@pageat=\@ne\pagemark\fi]
- {\ifcase\@pageat \rightmark\or \pagemark\or \rightmark\fi}%
- \rehead[\ifnum\@pageat=\tw@\pagemark\fi]
- {\ifcase\@pageat \leftmark\or \rightmark\or \pagemark
- \else \rightmark\fi}%
- \rohead[\ifnum\@pageat=\tw@\pagemark\fi]
- {\ifcase\@pageat \leftmark\or \rightmark\or \pagemark
- \else \rightmark\fi}%
- \lefoot[\ifnum\@pageat=\thr@@\pagemark\fi]
- {\ifnum\@pageat=\thr@@\pagemark\fi}%
- \lofoot[\ifnum\@pageat=\thr@@\pagemark\fi]
- {\ifnum\@pageat=\thr@@\pagemark\fi}%
- \cfoot[\ifnum\@pageat=4 \pagemark\fi]
- {\ifnum\@pageat=4 \pagemark\fi}%
- \refoot[\ifnum\@pageat=5 \pagemark\fi]
- {\ifnum\@pageat=5 \pagemark\fi}%
- \rofoot[\ifnum\@pageat=5 \pagemark\fi]
- {\ifnum\@pageat=5 \pagemark\fi}%
- }{}%
- }%
+ \clearpairofpagestyles
+ \lehead[\ifnum\@pageat=\z@\pagemark\fi]
+ {\ifnum\@pageat=\z@\pagemark\else\leftmark\fi}%
+ \lohead[\ifnum\@pageat=\z@\pagemark\fi]
+ {\ifnum\@pageat=\z@\pagemark\else\leftmark\fi}%
+ \chead[\ifnum\@pageat=\@ne\pagemark\fi]
+ {\ifcase\@pageat \rightmark\or \pagemark\or \rightmark\fi}%
+ \rehead[\ifnum\@pageat=\tw@\pagemark\fi]
+ {\ifcase\@pageat \leftmark\or \rightmark\or \pagemark
+ \else \rightmark\fi}%
+ \rohead[\ifnum\@pageat=\tw@\pagemark\fi]
+ {\ifcase\@pageat \leftmark\or \rightmark\or \pagemark
+ \else \rightmark\fi}%
+ \lefoot[\ifnum\@pageat=\thr@@\pagemark\fi]
+ {\ifnum\@pageat=\thr@@\pagemark\fi}%
+ \lofoot[\ifnum\@pageat=\thr@@\pagemark\fi]
+ {\ifnum\@pageat=\thr@@\pagemark\fi}%
+ \cfoot[\ifnum\@pageat=4 \pagemark\fi]
+ {\ifnum\@pageat=4 \pagemark\fi}%
+ \refoot[\ifnum\@pageat=5 \pagemark\fi]
+ {\ifnum\@pageat=5 \pagemark\fi}%
+ \rofoot[\ifnum\@pageat=5 \pagemark\fi]
+ {\ifnum\@pageat=5 \pagemark\fi}%
+ }{}%
}%
}%
-}
+}%
%</options>
% \end{macrocode}
% \end{macro}%^^A \sls@ps@style@KOMA-Script
@@ -1394,9 +1263,10 @@
% \end{description}
% Note: \Package{scrpage2} also provides starred versions of the page style
% definition commands, doing the same like the starless versions. This has
-% been done for compatibility reasons with deprecated \Package{scrpage2} and
+% been done for compatibility reasons with deprecated \Package{scrpage} and
% may be removed some times. The layer interface doesn't support this.
%
+%
% \begin{macro}{\defpagestyle}
% \changes{v3.28}{2019/11/18}{\cs{ifstr} umbenannt in \cs{Ifstr}}%^^A
% \begin{description}
@@ -1410,41 +1280,16 @@
% See \Package{scrpage2} implementation.
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\defpagestyle{%
- \newcommand*{\defpagestyle}[3]{%
- \sls@defhead{#1}#2\@empty\@empty\@empty
- \sls@deffoot{#1}#3\@empty\@empty\@empty
- \DeclarePageStyleByLayers{#1}{%
- #1.head.odd,#1.head.even,#1.head.oneside,%
- #1.head.above.line,#1.head.below.line,%
- #1.foot.odd,#1.foot.even,#1.foot.oneside,%
- #1.foot.above.line,#1.foot.below.line%
- }%
- \edef\reserved@a{%
- \noexpand\scrlayerOnAutoRemoveInterface[scrlayer-scrpage.sty]{%
- \noexpand\DestroyLayer{#1.head.odd}%
- \noexpand\DestroyLayer{#1.head.even}%
- \noexpand\DestroyLayer{#1.head.oneside}%
- \noexpand\DestroyLayer{#1.head.above.line}%
- \noexpand\DestroyLayer{#1.head.below.line}%
- \noexpand\DestroyLayer{#1.foot.odd}%
- \noexpand\DestroyLayer{#1.foot.even}%
- \noexpand\DestroyLayer{#1.foot.oneside}%
- \noexpand\DestroyLayer{#1.foot.above.line}%
- \noexpand\DestroyLayer{#1.foot.below.line}%
- \noexpand\Ifstr{\noexpand\currentpagestyle}{#1}{%
- \noexpand\PackageWarning{scrlayer-scrpage}{%
- page style `#1' not longer valid.\noexpand\MessageBreak
- The page style has been defined using\noexpand\MessageBreak
- interface `scrlayer-scrpage.sty', that\noexpand\MessageBreak
- has been removed%
- }%
- }{}%
- \noexpand\DestroyRealLayerPageStyle{#1}%
- }%
- }\reserved@a
+\newcommand*{\defpagestyle}[3]{%
+ \sls@defhead{#1}#2\@empty\@empty\@empty
+ \sls@deffoot{#1}#3\@empty\@empty\@empty
+ \DeclarePageStyleByLayers{#1}{%
+ #1.head.odd,#1.head.even,#1.head.oneside,%
+ #1.head.above.line,#1.head.below.line,%
+ #1.foot.odd,#1.foot.even,#1.foot.oneside,%
+ #1.foot.above.line,#1.foot.below.line%
}%
-}
+}%
% \end{macrocode}
% \begin{macro}{\sls@defhead}
% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
@@ -1473,86 +1318,82 @@
% \end{description}
% Helper to define the head layers.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@defhead{%
- \newcommand*\sls@defhead[1]{%
- \kernel@ifnextchar(%)
- {\sls@@defhead{#1}}%
- {\sls@@defhead{#1}(\sls@headabove@linelength,\sls@headabove@linethickness)}%
- }%
-}
-\scrlayerAddToInterface\sls@@defhead{%
- \def\sls@@defhead#1(#2,#3)#4#5#6{%
- \kernel@ifnextchar(%)
- {\sls@@@defhead{#1}({#2},{#3}){#4}{#5}{#6}}%
- {\sls@@@defhead{#1}%
- ({#2},{#3})%
- {#4}{#5}{#6}%
- (\sls@headbelow@linelength,\sls@headbelow@linethickness)}%
- }%
-}
-\scrlayerAddToInterface\sls@@@defhead{%
- \def\sls@@@defhead#1(#2,#3)#4#5#6(#7,#8){%
+\newcommand*\sls@defhead[1]{%
+ \kernel@ifnextchar(%)
+ {\sls@@defhead{#1}}%
+ {\sls@@defhead{#1}(\sls@headabove@linelength,\sls@headabove@linethickness)}%
+}%
+\newcommand*{\sls@@defhead}{}
+\def\sls@@defhead#1(#2,#3)#4#5#6{%
+ \kernel@ifnextchar(%)
+ {\sls@@@defhead{#1}({#2},{#3}){#4}{#5}{#6}}%
+ {\sls@@@defhead{#1}%
+ ({#2},{#3})%
+ {#4}{#5}{#6}%
+ (\sls@headbelow@linelength,\sls@headbelow@linethickness)}%
+}%
+\newcommand*{\sls@@@defhead}{}
+\def\sls@@@defhead#1(#2,#3)#4#5#6(#7,#8){%
% \end{macrocode}
% The lines:
% \begin{macrocode}
- \DeclareLayer[%
- background,%
- hoffset=\sls@leftmargin{head},%
- voffset=\sls@topmargin+\dp\strutbox,%
- width=\sls@headwidth,%
- height=0pt,%
- align=bl,%
- contents={%
- {\normalfont\usekomafont{pageheadfoot}{\usekomafont{pagehead}{%
- \sls@hf@rule{headtop}{#2}{#3}}}}%
- }%
- ]{#1.head.above.line}%
- \DeclareLayer[%
- background,%
- hoffset=\sls@leftmargin{head},%
- voffset=\sls@topmargin+\headheight-\ht\strutbox+#8,%
- width=\sls@headwidth,%
- height=0pt,%
- align=tl,%
- contents={%
- {\normalfont\usekomafont{pageheadfoot}{\usekomafont{pagehead}{%
- \sls@hf@rule{headsep}{#7}{#8}}}}%
- }%
- ]{#1.head.below.line}%
+ \DeclareLayer[%
+ background,%
+ hoffset=\sls@leftmargin{head},%
+ voffset=\sls@topmargin+\dp\strutbox,%
+ width=\sls@headwidth,%
+ height=0pt,%
+ align=bl,%
+ contents={%
+ {\normalfont\usekomafont{pageheadfoot}{\usekomafont{pagehead}{%
+ \sls@hf@rule{headtop}{#2}{#3}}}}%
+ }%
+ ]{#1.head.above.line}%
+ \DeclareLayer[%
+ background,%
+ hoffset=\sls@leftmargin{head},%
+ voffset=\sls@topmargin+\headheight-\ht\strutbox+#8,%
+ width=\sls@headwidth,%
+ height=0pt,%
+ align=tl,%
+ contents={%
+ {\normalfont\usekomafont{pageheadfoot}{\usekomafont{pagehead}{%
+ \sls@hf@rule{headsep}{#7}{#8}}}}%
+ }%
+ ]{#1.head.below.line}%
% \end{macrocode}
% The odd side, even side and one side:
% \changes{v3.13b}{2014/10/16}{workaround: additional group added to avoid
% pdf\TeX{} color stack warnings}%^^A
% \begin{macrocode}
- \DeclareLayer[%
- background,evenpage,twoside,%
- head,%
- hoffset=\sls@leftmargin{head},%
- width=\sls@headwidth,%
- contents={%
- \sls@secure@box\headheight{%
- \normalfont{\usekomafont{pageheadfoot}{\usekomafont{pagehead}{#4}}}}}%
- ]{#1.head.even}%
- \DeclareLayer[%
- background,oddpage,twoside,%
- head,%
- hoffset=\sls@leftmargin{head},%
- width=\sls@headwidth,%
- contents={%
- \sls@secure@box\headheight{%
- \normalfont{\usekomafont{pageheadfoot}{\usekomafont{pagehead}{#5}}}}}%
- ]{#1.head.odd}%
- \DeclareLayer[%
- background,oddpage,oneside,%
- head,%
- hoffset=\sls@leftmargin{head},%
- width=\sls@headwidth,%
- contents={%
- \sls@secure@box\headheight{%
- \normalfont{\usekomafont{pageheadfoot}{\usekomafont{pagehead}{#6}}}}}%
- ]{#1.head.oneside}%
- }%
-}
+ \DeclareLayer[%
+ background,evenpage,twoside,%
+ head,%
+ hoffset=\sls@leftmargin{head},%
+ width=\sls@headwidth,%
+ contents={%
+ \sls@secure@box\headheight{%
+ \normalfont{\usekomafont{pageheadfoot}{\usekomafont{pagehead}{#4}}}}}%
+ ]{#1.head.even}%
+ \DeclareLayer[%
+ background,oddpage,twoside,%
+ head,%
+ hoffset=\sls@leftmargin{head},%
+ width=\sls@headwidth,%
+ contents={%
+ \sls@secure@box\headheight{%
+ \normalfont{\usekomafont{pageheadfoot}{\usekomafont{pagehead}{#5}}}}}%
+ ]{#1.head.odd}%
+ \DeclareLayer[%
+ background,oddpage,oneside,%
+ head,%
+ hoffset=\sls@leftmargin{head},%
+ width=\sls@headwidth,%
+ contents={%
+ \sls@secure@box\headheight{%
+ \normalfont{\usekomafont{pageheadfoot}{\usekomafont{pagehead}{#6}}}}}%
+ ]{#1.head.oneside}%
+}%
% \end{macrocode}
% \begin{macro}{\sls@deffoot}
% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
@@ -1581,93 +1422,89 @@
% \end{description}
% Helper to define the foot layers.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@deffoot{%
- \newcommand*\sls@deffoot[1]{%
- \kernel@ifnextchar(%)
- {\sls@@deffoot{#1}}%
- {\sls@@deffoot{#1}(\sls@footabove@linelength,\sls@footabove@linethickness)}%
- }%
-}
-\scrlayerAddToInterface\sls@@deffoot{%
- \def\sls@@deffoot#1(#2,#3)#4#5#6{%
- \kernel@ifnextchar(%)
- {\sls@@@deffoot{#1}({#2},{#3}){#4}{#5}{#6}}%
- {\sls@@@deffoot{#1}%
- ({#2},{#3})%
- {#4}{#5}{#6}%
- (\sls@footbelow@linelength,\sls@footbelow@linethickness)}%
- }%
-}
-\scrlayerAddToInterface\sls@@@deffoot{%
- \def\sls@@@deffoot#1(#2,#3)#4#5#6(#7,#8){%
+\newcommand*\sls@deffoot[1]{%
+ \kernel@ifnextchar(%)
+ {\sls@@deffoot{#1}}%
+ {\sls@@deffoot{#1}(\sls@footabove@linelength,\sls@footabove@linethickness)}%
+}%
+\newcommand*{\sls@@deffoot}{}
+\def\sls@@deffoot#1(#2,#3)#4#5#6{%
+ \kernel@ifnextchar(%)
+ {\sls@@@deffoot{#1}({#2},{#3}){#4}{#5}{#6}}%
+ {\sls@@@deffoot{#1}%
+ ({#2},{#3})%
+ {#4}{#5}{#6}%
+ (\sls@footbelow@linelength,\sls@footbelow@linethickness)}%
+}%
+\newcommand*{\sls@@@deffoot}{}
+\def\sls@@@deffoot#1(#2,#3)#4#5#6(#7,#8){%
% \end{macrocode}
% The lines:
% \begin{macrocode}
- \DeclareLayer[%
- foreground,%
- hoffset=\sls@leftmargin{foot},%
- voffset=\sls@topmargin
- +\headheight+\headsep
- +\textheight
- +\footskip-\footheight
- +2\dp\strutbox,%
- width=\sls@footwidth,%
- height=0pt,%
- align=bl,%
- contents={%
- {\normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{%
- \sls@hf@rule{footsep}{#2}{#3}}}}%
- }%
- ]{#1.foot.above.line}%
- \DeclareLayer[%
- foreground,%
- hoffset=\sls@leftmargin{foot},%
- voffset=\sls@topmargin
- +\headheight+\headsep
- +\textheight
- +\footskip
- +2\dp\strutbox
- +#8,%
- width=\sls@footwidth,%
- height=0pt,%
- align=bl,%
- contents={%
- {\normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{%
- \sls@hf@rule{footbot}{#7}{#8}}}}%
- }%
- ]{#1.foot.below.line}%
+ \DeclareLayer[%
+ foreground,%
+ hoffset=\sls@leftmargin{foot},%
+ voffset=\sls@topmargin
+ +\headheight+\headsep
+ +\textheight
+ +\footskip-\footheight
+ +2\dp\strutbox,%
+ width=\sls@footwidth,%
+ height=0pt,%
+ align=bl,%
+ contents={%
+ {\normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{%
+ \sls@hf@rule{footsep}{#2}{#3}}}}%
+ }%
+ ]{#1.foot.above.line}%
+ \DeclareLayer[%
+ foreground,%
+ hoffset=\sls@leftmargin{foot},%
+ voffset=\sls@topmargin
+ +\headheight+\headsep
+ +\textheight
+ +\footskip
+ +2\dp\strutbox
+ +#8,%
+ width=\sls@footwidth,%
+ height=0pt,%
+ align=bl,%
+ contents={%
+ {\normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{%
+ \sls@hf@rule{footbot}{#7}{#8}}}}%
+ }%
+ ]{#1.foot.below.line}%
% \end{macrocode}
% The odd side, even side and one side:
% \begin{macrocode}
- \DeclareLayer[%
- foreground,evenpage,twoside,%
- foot,%
- hoffset=\sls@leftmargin{foot},%
- width=\sls@footwidth,%
- contents={%
- \sls@secure@box\footheight{%
- \normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{#4}}}}%
- ]{#1.foot.even}%
- \DeclareLayer[%
- foreground,oddpage,twoside,%
- foot,%
- hoffset=\sls@leftmargin{foot},%
- width=\sls@footwidth,%
- contents={%
- \sls@secure@box\footheight{%
- \normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{#5}}}}%
- ]{#1.foot.odd}%
- \DeclareLayer[%
- foreground,oddpage,oneside,%
- foot,%
- hoffset=\sls@leftmargin{foot},%
- width=\sls@footwidth,%
- contents={%
- \sls@secure@box\footheight{%
- \normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{#6}}}}%
- ]{#1.foot.oneside}%
- }%
-}
+ \DeclareLayer[%
+ foreground,evenpage,twoside,%
+ foot,%
+ hoffset=\sls@leftmargin{foot},%
+ width=\sls@footwidth,%
+ contents={%
+ \sls@secure@box\footheight{%
+ \normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{#4}}}}%
+ ]{#1.foot.even}%
+ \DeclareLayer[%
+ foreground,oddpage,twoside,%
+ foot,%
+ hoffset=\sls@leftmargin{foot},%
+ width=\sls@footwidth,%
+ contents={%
+ \sls@secure@box\footheight{%
+ \normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{#5}}}}%
+ ]{#1.foot.odd}%
+ \DeclareLayer[%
+ foreground,oddpage,oneside,%
+ foot,%
+ hoffset=\sls@leftmargin{foot},%
+ width=\sls@footwidth,%
+ contents={%
+ \sls@secure@box\footheight{%
+ \normalfont\usekomafont{pageheadfoot}{\usekomafont{pagefoot}{#6}}}}%
+ ]{#1.foot.oneside}%
+}%
% \end{macrocode}
% \begin{macro}{\sls@secure@box}
% \begin{description}
@@ -1678,68 +1515,66 @@
% \end{description}
% Note, that several length may be changed, to fit.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@secure@box{%
- \newcommand*{\sls@secure@box}[2]{%
- \begingroup
- \setbox\z@\vbox{%
- \ifsls@leavevmode\leavevmode\expandafter\ignorespaces\fi
- #2%
- }%
- \ifdim #1<\dimexpr \ht\z@+\dp\z@\relax
- \PackageWarning{scrlayer-scrpage}{%
- \string#1 to low.\MessageBreak
- At least \the\dimexpr \ht\z@+\dp\z@\relax\space needed,\MessageBreak
- but only \the#1 found.\MessageBreak
- \ifsls@autoenlarge
- I'll enlarge \string#1, for further\MessageBreak
- processing, but you should do this yourself,\MessageBreak
- \else
- You should enlarge \string#1,\MessageBreak
- \fi
- e.g.,
- \scr@ifundefinedorrelax{geometry}{%
- \scr@ifundefinedorrelax{typearea}{%
- using\MessageBreak
- \space\space\string\setlength{\string#1}{%
- \the\dimexpr \ht\z@+\dp\z@\relax}\MessageBreak
- in your preamble%
- }{%
- setting typearea's option\MessageBreak
- `\expandafter\@gobble\string#1=\the\dimexpr \ht\z@+\dp\z@\relax'%
- }%
+\newcommand*{\sls@secure@box}[2]{%
+ \begingroup
+ \setbox\z@\vbox{%
+ \ifsls@leavevmode\leavevmode\expandafter\ignorespaces\fi
+ #2%
+ }%
+ \ifdim #1<\dimexpr \ht\z@+\dp\z@\relax
+ \PackageWarning{scrlayer-scrpage}{%
+ \string#1 to low.\MessageBreak
+ At least \the\dimexpr \ht\z@+\dp\z@\relax\space needed,\MessageBreak
+ but only \the#1 found.\MessageBreak
+ \ifsls@autoenlarge
+ I'll enlarge \string#1, for further\MessageBreak
+ processing, but you should do this yourself,\MessageBreak
+ \else
+ You should enlarge \string#1,\MessageBreak
+ \fi
+ e.g.,
+ \scr@ifundefinedorrelax{geometry}{%
+ \scr@ifundefinedorrelax{typearea}{%
+ using\MessageBreak
+ \space\space\string\setlength{\string#1}{%
+ \the\dimexpr \ht\z@+\dp\z@\relax}\MessageBreak
+ in your preamble%
}{%
- \ifx #1\headheight
- setting geometry's option\MessageBreak
- `head=\the\dimexpr \ht\z@+\dp\z@\relax'%
- \else
- using\MessageBreak
- \space\space\string\setlength{\string#1}{%
- \the\dimexpr \ht\z@+\dp\z@\relax}\MessageBreak
- in your preamble%
- \fi
+ setting typearea's option\MessageBreak
+ `\expandafter\@gobble\string#1=\the\dimexpr \ht\z@+\dp\z@\relax'%
}%
- \ifsls@autoenlarge
- .\MessageBreak
- I'll also
- \ifx #1\headheight decrease \string\topmargin
- \else increase \string\footskip\fi
- \fi
- }%
- \ifsls@autoenlarge
- \@tempdima\dimexpr \ht\z@+\dp\z@\relax
+ }{%
\ifx #1\headheight
- \global\advance\topmargin by \dimexpr #1-(\ht\z@+\dp\z@)\relax
- \dp\z@\dimexpr \dp\z@+\ht\z@+\dp\z@-\headheight\relax
+ setting geometry's option\MessageBreak
+ `head=\the\dimexpr \ht\z@+\dp\z@\relax'%
\else
- \global\advance\footskip by \dimexpr \ht\z@+\dp\z@-#1\relax
+ using\MessageBreak
+ \space\space\string\setlength{\string#1}{%
+ \the\dimexpr \ht\z@+\dp\z@\relax}\MessageBreak
+ in your preamble%
\fi
- \global#1\@tempdima
+ }%
+ \ifsls@autoenlarge
+ .\MessageBreak
+ I'll also
+ \ifx #1\headheight decrease \string\topmargin
+ \else increase \string\footskip\fi
+ \fi
+ }%
+ \ifsls@autoenlarge
+ \@tempdima\dimexpr \ht\z@+\dp\z@\relax
+ \ifx #1\headheight
+ \global\advance\topmargin by \dimexpr #1-(\ht\z@+\dp\z@)\relax
+ \dp\z@\dimexpr \dp\z@+\ht\z@+\dp\z@-\headheight\relax
+ \else
+ \global\advance\footskip by \dimexpr \ht\z@+\dp\z@-#1\relax
\fi
+ \global#1\@tempdima
\fi
- \usebox\z@
- \endgroup
- }%
-}
+ \fi
+ \usebox\z@
+ \endgroup
+}%
%</body>
% \end{macrocode}
% \begin{option}{hmode}
@@ -1748,10 +1583,6 @@
% \begin{macrocode}
%<*options>
\KOMA@ifkey{hmode}{sls@leavevmode}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@hmode}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@hmode@default}
-\scrlayer@AddCsToInterface{sls@leavevmode@linetrue}
-\scrlayer@AddCsToInterface{sls@leavevmode@linefalse}
%</options>
% \end{macrocode}
% \end{option}%^^A hmode
@@ -1763,11 +1594,6 @@
%<*options>
\KOMA@ifkey{autoenlargeheadfoot}{sls@autoenlarge}
\KOMAExecuteOptions{autoenlargeheadfoot=true}
-\scrlayer@AddCsToInterface{KV@KOMA.scrlayer-scrpage.sty@autoenlargeheadfoot}
-\scrlayer@AddCsToInterface{%
- KV@KOMA.scrlayer-scrpage.sty@autoenlargeheadfoot@default}
-\scrlayer@AddCsToInterface{sls@autoenlargetrue}
-\scrlayer@AddCsToInterface{sls@autoenlargefalse}
%</options>
% \end{macrocode}
% \end{option}%^^A autoenlargeheadfoot
@@ -1797,16 +1623,13 @@
}%
\let\scr@fnt@instead@pagehead\relax
}%
- \scrlayer@AddCsToInterface{scr@fnt@pagehead}%
\@ifundefined{@pageheadfont}{%
\newcommand*{\@pageheadfont}{}%
- \scrlayer@AddCsToInterface{@pageheadfont}%
}{}%
\newcommand*{\scr@fnt@pagehead}{\@pageheadfont}%
}{}
\@ifundefined{scr@fnt@pageheadfoot}{%
\newcommand*{\scr@fnt@pageheadfoot}{\headfont}%
- \scrlayer@AddCsToInterface{scr@fnt@pageheadfoot}%
\@ifundefined{headfont}{%
\newcommand*{\headfont}{\normalcolor\slshape}%
}{}
@@ -1831,11 +1654,9 @@
% \changes{v0.9}{2014/01/13}{warning always deactivated}
% \begin{macrocode}
\@ifundefined{scr@fnt@pagefoot}{%
- \scrlayer@AddCsToInterface{scr@fnt@pagefoot}%
\def\scr@fnt@pagefoot{\footfont}%
\@ifundefined{footfont}{%
\newcommand*{\footfont}{}%
- \scrlayer@AddCsToInterface{footfont}%
}{}%
}{}
\scr@ifundefinedorrelax{scr@fnt@wrn@pagefoot}{}{%
@@ -1858,56 +1679,50 @@
% \end{description}
% Helper to draw the line.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@hf@rule{%
- \newcommand*\sls@hf@rule[3]{%
- \begingroup
- \normalfont\usekomafont{#1line}{%
- \vbox to \z@{%
- \kern -\dimexpr #3\relax
- \ifnum \sls@hfline@adjust>\z@ \@tempswatrue \else \@tempswafalse\fi
- \if@twoside\ifodd\value{page}\else
- \ifnum \sls@hfline@adjust<\tw@ \@tempswatrue\else \@tempswafalse\fi
- \fi\fi
- \if@tempswa
- \hskip \z@\@plus 1fill\@minus \paperwidth
- \fi
- \vrule \@width\dimexpr #2\relax \@height\dimexpr #3\relax \@depth\z@
+\newcommand*\sls@hf@rule[3]{%
+ \begingroup
+ \normalfont\usekomafont{#1line}{%
+ \vbox to \z@{%
+ \kern -\dimexpr #3\relax
+ \ifnum \sls@hfline@adjust>\z@ \@tempswatrue \else \@tempswafalse\fi
+ \if@twoside\ifodd\value{page}\else
\ifnum \sls@hfline@adjust<\tw@ \@tempswatrue\else \@tempswafalse\fi
- \if@twoside\ifodd\value{page}\else
- \ifnum \sls@hfline@adjust>\z@ \@tempswatrue \else \@tempswafalse\fi
- \fi\fi
- \if@tempswa
- \hskip \z@\@plus 1fill\@minus \paperwidth\null
- \fi
- }%
- }%
- \endgroup
- }%
-}
+ \fi\fi
+ \if@tempswa
+ \hskip \z@\@plus 1fill\@minus \paperwidth
+ \fi
+ \vrule \@width\dimexpr #2\relax \@height\dimexpr #3\relax \@depth\z@
+ \ifnum \sls@hfline@adjust<\tw@ \@tempswatrue\else \@tempswafalse\fi
+ \if@twoside\ifodd\value{page}\else
+ \ifnum \sls@hfline@adjust>\z@ \@tempswatrue \else \@tempswafalse\fi
+ \fi\fi
+ \if@tempswa
+ \hskip \z@\@plus 1fill\@minus \paperwidth\null
+ \fi
+ }%
+ }%
+ \endgroup
+}%
% \end{macrocode}
% \end{macro}%^^A \sls@hf@rule
% \begin{macro}{\sls@topmargin}
% \begin{macro}{\sls@leftmargin}
% Two simple helper macros:
% \begin{macrocode}
-\scrlayerAddToInterface\sls@topmargin{%
- \newcommand*{\sls@topmargin}{\dimexpr\topmargin+1in\relax}%
-}
-\scrlayerAddToInterface\sls@leftmargin{%
- \newcommand*{\sls@leftmargin}[1]{%
- \dimexpr
- \if@twoside
- \ifodd\value{page}
- \oddsidemargin+\csname sls@odd#1shift\endcsname
- \else
- \evensidemargin+\csname sls@even#1shift\endcsname
- \fi
- \else
+\newcommand*{\sls@topmargin}{\dimexpr\topmargin+1in\relax}%
+\newcommand*{\sls@leftmargin}[1]{%
+ \dimexpr
+ \if@twoside
+ \ifodd\value{page}
\oddsidemargin+\csname sls@odd#1shift\endcsname
- \fi
- +1in\relax
- }%
-}
+ \else
+ \evensidemargin+\csname sls@even#1shift\endcsname
+ \fi
+ \else
+ \oddsidemargin+\csname sls@odd#1shift\endcsname
+ \fi
+ +1in\relax
+}%
%</body>
% \end{macrocode}
% \end{macro}%^^A \sls@leftmargin
@@ -1915,49 +1730,89 @@
% \end{macro}%^^A \defpagestyle
%
% \begin{macro}{\newpagestyle}
+% \changes{v3.32}{2020/09/11}{test for \textsf{titlesec}}
% For the parameters see \Macro{defpagestyle}.
-% Define only, if not already defined:
+% Define the pagestyle only, if not already defined. Unfortunately
+% \textsf{titlesec} also defines this command. So new definition will
+% fail. \textsf{titlesec} uses \cs{providecommand} so if the order would be
+% changed, everything would be OK.
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\newpagestyle{%
- \newcommand*\newpagestyle[3]{%
- \@ifundefined{ps@#1}{\defpagestyle{#1}{#2}{#3}}{%
- \PackageError{scrlayer-scrpage}{Page style `#1' already defined}{%
- Only not yet defined page style may be defined using
- \string\newpagestyle.\MessageBreak
- You may use either \string\renewpagestyle, \string\providepagestyle,
- or \string\defpagestyle\MessageBreak
- with already defined page styles.\MessageBreak
- If you'll continue, your command will be ignored.%
+\@ifpackageloaded{titlesec}{%
+ \@ifundefined{newpagestyle}{}{%
+ \@ifpackageloaded{titleps}{}{%
+ \PackageWarningNoLine{scrlayer-scrpage}{%
+ it seems that package `titlesec' is used\MessageBreak
+ and has already defined `\string\newpagestyle'.\MessageBreak
+ To avoid this warning message, you should\MessageBreak
+ load package `titlesec' not before package\MessageBreak
+ `scrlayer-scrpage'. If you need `titlesec'\MessageBreak
+ you could load it after `scrlayer-scrpage',\MessageBreak
+ but you still would not be able to use\MessageBreak
+ the `titlesec' implemenation of\MessageBreak
+ `\string\newpagestyle'%
}%
+ \let\newpagestyle\relax
}%
}%
-}
+}{}
+\newcommand*\newpagestyle[3]{%
+ \@ifundefined{ps@#1}{\defpagestyle{#1}{#2}{#3}}{%
+ \PackageError{scrlayer-scrpage}{Page style `#1' already defined}{%
+ Only not yet defined page style may be defined using
+ \string\newpagestyle.\MessageBreak
+ You may use either \string\renewpagestyle, \string\providepagestyle,
+ or \string\defpagestyle\MessageBreak
+ with already defined page styles.\MessageBreak
+ If you'll continue, your command will be ignored.%
+ }%
+ }%
+}%
%</body>
% \end{macrocode}
% \end{macro}%^^A \newpagestyle
%
% \begin{macro}{\renewpagestyle}
+% \changes{v3.32}{2020/09/11}{test for \textsf{titlesec}}
% For the parameters see \Macro{defpagestyle}.
-% Define only, if not already defined:
+% Define the pagestyle only, if not already defined. Unfortunately
+% \textsf{titlesec} also defines this command. So new definition will
+% fail. \textsf{titlesec} uses \cs{providecommand} so if the order would be
+% changed, everything would be OK.
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\renewpagestyle{%
- \newcommand*\renewpagestyle[3]{%
- \@ifundefined{ps@#1}{%
- \PackageError{scrlayer-scrpage}{Undefined page style `#1'}{%
- Only already defined page style may be re-defined using
- \string\renewpagestyle.\MessageBreak
- You may use either \string\newpagestyle, \string\providepagestyle,
- or \string\defpagestyle\MessageBreak
- with not yet defined page styles.\MessageBreak
- If you'll continue, your command will be ignored.%
+\@ifpackageloaded{titlesec}{%
+ \@ifundefined{renewpagestyle}{}{%
+ \@ifpackageloaded{titleps}{}{%
+ \PackageWarningNoLine{scrlayer-scrpage}{%
+ It seems that package `titlesec' is used\MessageBreak
+ and has already defined `\string\renewpagestyle'.\MessageBreak
+ To avoid this warning message, you should\MessageBreak
+ load package `titlesec' not before package\MessageBreak
+ `scrlayer-scrpage'. If you need `titlesec'\MessageBreak
+ you could load it after `scrlayer-scrpage',\MessageBreak
+ but you still would not be able to use\MessageBreak
+ the `titlesec' implemenation of\MessageBreak
+ `\string\renewpagestyle'%
}%
- }{%
- \defpagestyle{#1}{#2}{#3}%
+ \let\renewpagestyle\relax
}%
}%
-}
+}{}
+\newcommand*\renewpagestyle[3]{%
+ \@ifundefined{ps@#1}{%
+ \PackageError{scrlayer-scrpage}{Undefined page style `#1'}{%
+ Only already defined page style may be re-defined using
+ \string\renewpagestyle.\MessageBreak
+ You may use either \string\newpagestyle, \string\providepagestyle,
+ or \string\defpagestyle\MessageBreak
+ with not yet defined page styles.\MessageBreak
+ If you'll continue, your command will be ignored.%
+ }%
+ }{%
+ \defpagestyle{#1}{#2}{#3}%
+ }%
+}%
%</body>
% \end{macrocode}
% \end{macro}%^^A \renewpagestyle
@@ -1967,18 +1822,16 @@
% Define only, if not already defined:
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\providepagestyle{%
- \newcommand*\providepagestyle[3]{%
- \@ifundefined{ps@#1}{%
- \defpagestyle{#1}{#2}{#3}%
- }{%
+\newcommand*\providepagestyle[3]{%
+ \@ifundefined{ps@#1}{%
+ \defpagestyle{#1}{#2}{#3}%
+ }{%
%<*trace>
- \PackageInfo{scrlayer-scrpage}{%
- page style `#1' already defined.\MessageBreak
- New definition ignored%
- }%
-%</trace>
+ \PackageInfo{scrlayer-scrpage}{%
+ page style `#1' already defined.\MessageBreak
+ New definition ignored%
}%
+%</trace>
}%
}
%</body>
@@ -2029,30 +1882,22 @@
% defined. Additional commands have been added.
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface{\deftriplepagestyle}{%
- \newcommand*{\deftriplepagestyle}[1]{%
- \let\@tempa\defpagestyle
- \scrlayer@triplestyle{#1}%
- }%
-}
-\scrlayerAddToInterface{\newtriplepagestyle}{%
- \newcommand*{\newtriplepagestyle}[1]{%
- \let\@tempa\newpagestyle
- \scrlayer@triplestyle{#1}%
- }%
-}
-\scrlayerAddToInterface{\renewtriplepagestyle}{%
- \newcommand*{\renewtriplepagestyle}[1]{%
- \let\@tempa\renewpagestyle
- \scrlayer@triplestyle{#1}%
- }%
-}
-\scrlayerAddToInterface{\providetriplepagestyle}{%
- \newcommand*{\providetriplepagestyle}[1]{%
- \let\@tempa\providepagestyle
- \scrlayer@triplestyle{#1}%
- }%
-}
+\newcommand*{\deftriplepagestyle}[1]{%
+ \let\@tempa\defpagestyle
+ \scrlayer@triplestyle{#1}%
+}%
+\newcommand*{\newtriplepagestyle}[1]{%
+ \let\@tempa\newpagestyle
+ \scrlayer@triplestyle{#1}%
+}%
+\newcommand*{\renewtriplepagestyle}[1]{%
+ \let\@tempa\renewpagestyle
+ \scrlayer@triplestyle{#1}%
+}%
+\newcommand*{\providetriplepagestyle}[1]{%
+ \let\@tempa\providepagestyle
+ \scrlayer@triplestyle{#1}%
+}%
% \end{macrocode}
% \begin{macro}{\scrlayer@triplestyle}
% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
@@ -2065,73 +1910,67 @@
% to be one of \Macro{defpagestyle}, \Macro{newpagestyle},
% \Macro{renewpagestyle}, or \Macro{providepagestyle}.
% \begin{macrocode}
-\scrlayerAddToInterface\scrlayer@triplestyle{%
- \def\scrlayer@triplestyle#1{%
- \kernel@ifnextchar[%]
- {\scrlayer@@triplestyle{#1}}%
- {\scrlayer@@triplestyle{#1}[\z@]}%
- }
-}
-\scrlayerAddToInterface\scrlayer@@triplestyle{%
- \def\scrlayer@@triplestyle#1[#2]{%
- \kernel@ifnextchar[%]
- {\scrlayer@@@triplestyle{#1}[#2]}%
- {\scrlayer@@@triplestyle{#1}[\z@][#2]}%
- }%
-}
-\scrlayerAddToInterface\scrlayer@@@triplestyle{%
- \def\scrlayer@@@triplestyle#1[#2][#3]#4#5#6#7#8#9{%
- \@tempa{#1}{%
- (\sls@headwidth,#2)%
- {%
- \makebox[\z@][l]{#6}\hfill
- \makebox[\z@][c]{#5}\hfill
- \makebox[\z@][r]{#4}%
- }{%
- \makebox[\z@][l]{#4}\hfill
- \makebox[\z@][c]{#5}\hfill
- \makebox[\z@][r]{#6}%
- }{%
- \makebox[\z@][l]{#4}\hfill
- \makebox[\z@][c]{#5}\hfill
- \makebox[\z@][r]{#6}%
- }%
- (\sls@headwidth,#3)%
+\newcommand*{\scrlayer@triplestyle}[1]{%
+ \kernel@ifnextchar[%]
+ {\scrlayer@@triplestyle{#1}}%
+ {\scrlayer@@triplestyle{#1}[\z@]}%
+}
+\newcommand*{\scrlayer@@triplestyle}{}
+\def\scrlayer@@triplestyle#1[#2]{%
+ \kernel@ifnextchar[%]
+ {\scrlayer@@@triplestyle{#1}[#2]}%
+ {\scrlayer@@@triplestyle{#1}[\z@][#2]}%
+}%
+\newcommand*{\scrlayer@@@triplestyle}{}
+\def\scrlayer@@@triplestyle#1[#2][#3]#4#5#6#7#8#9{%
+ \@tempa{#1}{%
+ (\sls@headwidth,#2)%
+ {%
+ \makebox[\z@][l]{#6}\hfill
+ \makebox[\z@][c]{#5}\hfill
+ \makebox[\z@][r]{#4}%
}{%
- (\sls@footwidth,#3)%
- {%
- \makebox[\z@][l]{#9}\hfill
- \makebox[\z@][c]{#8}\hfill
- \makebox[\z@][r]{#7}%
- }{%
- \makebox[\z@][l]{#7}\hfill
- \makebox[\z@][c]{#8}\hfill
- \makebox[\z@][r]{#9}%
- }{%
- \makebox[\z@][l]{#7}\hfill
- \makebox[\z@][c]{#8}\hfill
- \makebox[\z@][r]{#9}%
- }%
- (\sls@footwidth,#2)%
+ \makebox[\z@][l]{#4}\hfill
+ \makebox[\z@][c]{#5}\hfill
+ \makebox[\z@][r]{#6}%
+ }{%
+ \makebox[\z@][l]{#4}\hfill
+ \makebox[\z@][c]{#5}\hfill
+ \makebox[\z@][r]{#6}%
+ }%
+ (\sls@headwidth,#3)%
+ }{%
+ (\sls@footwidth,#3)%
+ {%
+ \makebox[\z@][l]{#9}\hfill
+ \makebox[\z@][c]{#8}\hfill
+ \makebox[\z@][r]{#7}%
+ }{%
+ \makebox[\z@][l]{#7}\hfill
+ \makebox[\z@][c]{#8}\hfill
+ \makebox[\z@][r]{#9}%
+ }{%
+ \makebox[\z@][l]{#7}\hfill
+ \makebox[\z@][c]{#8}\hfill
+ \makebox[\z@][r]{#9}%
}%
+ (\sls@footwidth,#2)%
}%
-}
+}%
% \end{macrocode}
% \end{macro}%^^A \scrlayer@@@triplestyle
% \end{macro}%^^A \scrlayer@@triplestyle
% \end{macro}%^^A \scrlayer@triplestyle
% \begin{macrocode}
-\scrlayerAddToInterface{\deftripstyle}{%
- \newcommand*{\deftripstyle}{%
- \PackageWarning{scrlayer-scrpage}{%
- Command \string\deftripstyle\space is deprecate.\MessageBreak
- You should replace it by \string\deftriplepagestyle,\MessageBreak
- e.g.,%
- }%
- \let\deftripstyle\deftriplepagestyle
- \deftripstyle
+\newcommand*{\deftripstyle}{%
+ \PackageWarning{scrlayer-scrpage}{%
+ Command \string\deftripstyle\space is deprecate.\MessageBreak
+ You should replace it by \string\deftriplepagestyle,\MessageBreak
+ e.g.,%
}%
-}
+ \let\deftripstyle\deftriplepagestyle
+ \deftripstyle
+}%
%</body>
% \end{macrocode}
% \end{macro}%^^A \deftripstyle
@@ -2176,132 +2015,105 @@
% they depend on page style \texttt{scrheadings}.
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\defpairofpagestyles{%
- \newcommand*{\defpairofpagestyles}[3][]{%
- \def\reserved@a##1##2##3##4##5##6##7\@nil{##1##2##3##4##5##6}%
- \edef\reserved@a{\expandafter\reserved@a #2xxxxxx\@nil}%
- \Ifstr\reserved@a{plain.}{%
- \PackageError{scrlayer-scrpage}{plain page style `#2' not allowed}{%
- You may not define a plain page style using
- \string\defpairofpagestyles, \string\newpairofpagestyles,
- \string\renewpairofpagestyles, or\MessageBreak
- \string\providepairofpagestyles. I'd suggest to simply define the
- corresponding\MessageBreak
- non-plain page style to also define the plain one.\MessageBreak
- If you'll continue, your command will be ignored.}%
- }{%
- \sls@init@pair@page@style*{#2}%
- \sls@init@pair@page@style*{plain.#2}%
- \ifx\relax #1\relax\else
- \scr@ifundefinedorrelax{sls@ps@#1@even@left@head}{%
- \PackageError{scrlayer-scrpage}{`#1' not a pair page style}{%
- Only pair page styles may be used to initialise new pairs of page
- styles. So\MessageBreak
- optional argument of \string\defpairofpagestyles,
- \string\newpairofpagestyles,\MessageBreak
- \string\renewpairofpagestyles, or \string\providepairofpagestyle has
- to be a pair\MessageBreak
- page style or should be unused.\MessageBreak
- If you'll continue, the initialisation will be ignored.}%
+\newcommand*{\defpairofpagestyles}[3][]{%
+ \def\reserved@a##1##2##3##4##5##6##7\@nil{##1##2##3##4##5##6}%
+ \edef\reserved@a{\expandafter\reserved@a #2xxxxxx\@nil}%
+ \Ifstr\reserved@a{plain.}{%
+ \PackageError{scrlayer-scrpage}{plain page style `#2' not allowed}{%
+ You may not define a plain page style using
+ \string\defpairofpagestyles, \string\newpairofpagestyles,
+ \string\renewpairofpagestyles, or\MessageBreak
+ \string\providepairofpagestyles. I'd suggest to simply define the
+ corresponding\MessageBreak
+ non-plain page style to also define the plain one.\MessageBreak
+ If you'll continue, your command will be ignored.}%
+ }{%
+ \sls@init@pair@page@style*{#2}%
+ \sls@init@pair@page@style*{plain.#2}%
+ \ifx\relax #1\relax\else
+ \scr@ifundefinedorrelax{sls@ps@#1@even@left@head}{%
+ \PackageError{scrlayer-scrpage}{`#1' not a pair page style}{%
+ Only pair page styles may be used to initialise new pairs of page
+ styles. So\MessageBreak
+ optional argument of \string\defpairofpagestyles,
+ \string\newpairofpagestyles,\MessageBreak
+ \string\renewpairofpagestyles, or \string\providepairofpagestyle has
+ to be a pair\MessageBreak
+ page style or should be unused.\MessageBreak
+ If you'll continue, the initialisation will be ignored.}%
+ }{%
+ \sls@init@pair@page@style{#2}{#1}%
+ \scr@ifundefinedorrelax{sls@ps@plain.#1@even@left@head}{%
+ \sls@init@pair@page@style{plain.#2}{#1}%
}{%
- \sls@init@pair@page@style{#2}{#1}%
- \scr@ifundefinedorrelax{sls@ps@plain.#1@even@left@head}{%
- \sls@init@pair@page@style{plain.#2}{#1}%
- }{%
- \sls@init@pair@page@style{plain.#2}{plain.#1}%
- }%
+ \sls@init@pair@page@style{plain.#2}{plain.#1}%
}%
- \fi
- \edef\reserved@a{%
- \noexpand\scrlayerOnAutoRemoveInterface[scrlayer-scrpage.sty]{%
- \noexpand\sls@init@pair@page@style**{#2}%
- \noexpand\sls@init@pair@page@style**{plain.#2}%
- \noexpand\expandafter\noexpand\ifx\noexpand
- \csname ps@plain.#2\noexpand\endcsname\noexpand\ps@plain
- \noexpand\PackageWarning{scrlayer-scrpage}{%
- page style `#2' not longer valid.\noexpand\MessageBreak
- This was the current plain page style.\noexpand\MessageBreak
- Making current plain page style empty.\noexpand\MessageBreak
- The page style has been defined using\noexpand\MessageBreak
- interface `scrlayer-scrpage.sty', that\noexpand\MessageBreak
- has been removed%
- }%
- \noexpand\def\noexpand\ps@plain{%
- \noexpand\def\noexpand\@oddhead{}\noexpand\def\noexpand\@evenhead{}%
- \noexpand\def\noexpand\@oddhead{}\noexpand\def\noexpand\@evenhead{}%
- }%
- \noexpand\fi
- }%
- }\reserved@a
- \sls@def@pair@page@style@member{#2}%
- \AddToLayerPageStyleOptions{#2}{%
- onselect={%
+ }%
+ \fi
+ \sls@def@pair@page@style@member{#2}%
+ \AddToLayerPageStyleOptions{#2}{%
+ onselect={%
% \end{macrocode}
% \changes{v3.15}{2015/01/08}{usage of \cs{DeclarePageStyleAlias} instead of
% \cs{let}}%^^A fixme: Is this correct?
% \begin{macrocode}
- \DeclarePageStyleAlias{plain}{plain.#2}%
- \DeclarePageStyleAlias{headings}{#2}%
- \def\sls@currentheadings{#2}%
- \def\sls@currentplain{plain.#2}%
- #3%
- }%
+ \DeclarePageStyleAlias{plain}{plain.#2}%
+ \DeclarePageStyleAlias{headings}{#2}%
+ \def\sls@currentheadings{#2}%
+ \def\sls@currentplain{plain.#2}%
+ #3%
}%
- \sls@def@pair@page@style@member{plain.#2}%
- \AddToLayerPageStyleOptions{plain.#2}{%
- onselect={%
+ }%
+ \sls@def@pair@page@style@member{plain.#2}%
+ \AddToLayerPageStyleOptions{plain.#2}{%
+ onselect={%
% \end{macrocode}
% \changes{v3.15}{2015/01/08}{usage of \cs{DeclarePageStyleAlias} instead of
% \cs{let}}%^^A fixme: Is this correct?
% \begin{macrocode}
- \DeclarePageStyleAlias{plain}{plain.#2}%
- \DeclarePageStyleAlias{headings}{#2}%
- \def\sls@currentheadings{#2}%
- \def\sls@currentplain{plain.#2}%
- #3%
- },%
- oninit={%
- \expandafter
- \ifx\csname ifsls@plain@head@above@line\expandafter\endcsname
+ \DeclarePageStyleAlias{plain}{plain.#2}%
+ \DeclarePageStyleAlias{headings}{#2}%
+ \def\sls@currentheadings{#2}%
+ \def\sls@currentplain{plain.#2}%
+ #3%
+ },%
+ oninit={%
+ \expandafter
+ \ifx\csname ifsls@plain@head@above@line\expandafter\endcsname
+ \csname iftrue\endcsname\else
+ \let\sls@headabove@linelength\z@
+ \let\sls@headabove@linethickness\z@
+ \fi
+ \expandafter
+ \ifx\csname ifsls@plain@head@below@line\expandafter\endcsname
\csname iftrue\endcsname\else
- \let\sls@headabove@linelength\z@
- \let\sls@headabove@linethickness\z@
- \fi
- \expandafter
- \ifx\csname ifsls@plain@head@below@line\expandafter\endcsname
- \csname iftrue\endcsname\else
- \let\sls@headbelow@linelength\z@
- \let\sls@headbelow@linethickness\z@
- \fi
- \expandafter
- \ifx\csname ifsls@plain@foot@above@line\expandafter\endcsname
- \csname iftrue\endcsname\else
- \let\sls@footabove@linelength\z@
- \let\sls@footabove@linethickness\z@
- \fi
- \expandafter
- \ifx\csname ifsls@plain@foot@below@line\expandafter\endcsname
- \csname iftrue\endcsname\else
- \let\sls@footbelow@linelength\z@
- \let\sls@footbelow@linethickness\z@
- \fi
- }%
+ \let\sls@headbelow@linelength\z@
+ \let\sls@headbelow@linethickness\z@
+ \fi
+ \expandafter
+ \ifx\csname ifsls@plain@foot@above@line\expandafter\endcsname
+ \csname iftrue\endcsname\else
+ \let\sls@footabove@linelength\z@
+ \let\sls@footabove@linethickness\z@
+ \fi
+ \expandafter
+ \ifx\csname ifsls@plain@foot@below@line\expandafter\endcsname
+ \csname iftrue\endcsname\else
+ \let\sls@footbelow@linelength\z@
+ \let\sls@footbelow@linethickness\z@
+ \fi
}%
}%
}%
-}
+}%
% \end{macrocode}
% \begin{macro}{\sls@currentheadings}
% \begin{macro}{\sls@currentplain}
% These little helpers will be set up at selection of each pair page style and
% stores the last activated page style pair of the scope.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@currentheadings{%
- \newcommand*\sls@currentheadings{scrheadings}%
-}
-\scrlayerAddToInterface\sls@currentplain{%
- \newcommand*\sls@currentplain{plain.scrheadings}%
-}
+\newcommand*\sls@currentheadings{scrheadings}%
+\newcommand*\sls@currentplain{plain.scrheadings}%
% \end{macrocode}
% \end{macro}%^^A \sls@currentplain
% \end{macro}%^^A \sls@currentheadings
@@ -2324,47 +2136,43 @@
% Note also, that the second argument may either be the plain or the non-plain
% member of the page style pair.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@init@pair@page@style{%
- \newcommand*{\sls@init@pair@page@style}{%
+\newcommand*{\sls@init@pair@page@style}{%
+ \kernel@ifstar {%
\kernel@ifstar {%
- \kernel@ifstar {%
- \sls@let@pair@page@style\relax
- }{%
- \sls@let@pair@page@style\@empty
- }
+ \sls@let@pair@page@style\relax
}{%
- \sls@init@@pair@page@style
- }%
- }%
-}
-\scrlayerAddToInterface\sls@init@@pair@page@style{%
- \newcommand*{\sls@init@@pair@page@style}[2]{%
- \expandafter\let\csname sls@ps@#1@even@left@head\expandafter\endcsname
- \csname sls@ps@#2@even@left@head\endcsname
- \expandafter\let\csname sls@ps@#1@even@middle@head\expandafter\endcsname
- \csname sls@ps@#2@even@middle@head\endcsname
- \expandafter\let\csname sls@ps@#1@even@right@head\expandafter\endcsname
- \csname sls@ps@#2@even@right@head\endcsname
- \expandafter\let\csname sls@ps@#1@odd@left@head\expandafter\endcsname
- \csname sls@ps@#2@odd@left@head\endcsname
- \expandafter\let\csname sls@ps@#1@odd@middle@head\expandafter\endcsname
- \csname sls@ps@#2@odd@middle@head\endcsname
- \expandafter\let\csname sls@ps@#1@odd@right@head\expandafter\endcsname
- \csname sls@ps@#2@odd@right@head\endcsname
- \expandafter\let\csname sls@ps@#1@even@left@foot\expandafter\endcsname
- \csname sls@ps@#2@even@left@foot\endcsname
- \expandafter\let\csname sls@ps@#1@even@middle@foot\expandafter\endcsname
- \csname sls@ps@#2@even@middle@foot\endcsname
- \expandafter\let\csname sls@ps@#1@even@right@foot\expandafter\endcsname
- \csname sls@ps@#2@even@right@foot\endcsname
- \expandafter\let\csname sls@ps@#1@odd@left@foot\expandafter\endcsname
- \csname sls@ps@#2@odd@left@foot\endcsname
- \expandafter\let\csname sls@ps@#1@odd@middle@foot\expandafter\endcsname
- \csname sls@ps@#2@odd@middle@foot\endcsname
- \expandafter\let\csname sls@ps@#1@odd@right@foot\expandafter\endcsname
- \csname sls@ps@#2@odd@right@foot\endcsname
+ \sls@let@pair@page@style\@empty
+ }
+ }{%
+ \sls@init@@pair@page@style
}%
-}
+}%
+\newcommand*{\sls@init@@pair@page@style}[2]{%
+ \expandafter\let\csname sls@ps@#1@even@left@head\expandafter\endcsname
+ \csname sls@ps@#2@even@left@head\endcsname
+ \expandafter\let\csname sls@ps@#1@even@middle@head\expandafter\endcsname
+ \csname sls@ps@#2@even@middle@head\endcsname
+ \expandafter\let\csname sls@ps@#1@even@right@head\expandafter\endcsname
+ \csname sls@ps@#2@even@right@head\endcsname
+ \expandafter\let\csname sls@ps@#1@odd@left@head\expandafter\endcsname
+ \csname sls@ps@#2@odd@left@head\endcsname
+ \expandafter\let\csname sls@ps@#1@odd@middle@head\expandafter\endcsname
+ \csname sls@ps@#2@odd@middle@head\endcsname
+ \expandafter\let\csname sls@ps@#1@odd@right@head\expandafter\endcsname
+ \csname sls@ps@#2@odd@right@head\endcsname
+ \expandafter\let\csname sls@ps@#1@even@left@foot\expandafter\endcsname
+ \csname sls@ps@#2@even@left@foot\endcsname
+ \expandafter\let\csname sls@ps@#1@even@middle@foot\expandafter\endcsname
+ \csname sls@ps@#2@even@middle@foot\endcsname
+ \expandafter\let\csname sls@ps@#1@even@right@foot\expandafter\endcsname
+ \csname sls@ps@#2@even@right@foot\endcsname
+ \expandafter\let\csname sls@ps@#1@odd@left@foot\expandafter\endcsname
+ \csname sls@ps@#2@odd@left@foot\endcsname
+ \expandafter\let\csname sls@ps@#1@odd@middle@foot\expandafter\endcsname
+ \csname sls@ps@#2@odd@middle@foot\endcsname
+ \expandafter\let\csname sls@ps@#1@odd@right@foot\expandafter\endcsname
+ \csname sls@ps@#2@odd@right@foot\endcsname
+}%
% \end{macrocode}
% \end{macro}%^^A \sls@init@@pair@page@style
% \begin{macro}{\sls@let@pair@page@style}
@@ -2377,22 +2185,20 @@
% \end{description}
% A little helper for \Macro{sls@init@pair@page@style}.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@let@pair@page@style{%
- \newcommand*{\sls@let@pair@page@style}[2]{%
- \expandafter\let\csname sls@ps@#2@even@left@head\endcsname #1%
- \expandafter\let\csname sls@ps@#2@even@middle@head\endcsname #1%
- \expandafter\let\csname sls@ps@#2@even@right@head\endcsname #1%
- \expandafter\let\csname sls@ps@#2@odd@left@head\endcsname #1%
- \expandafter\let\csname sls@ps@#2@odd@middle@head\endcsname #1%
- \expandafter\let\csname sls@ps@#2@odd@right@head\endcsname #1%
- \expandafter\let\csname sls@ps@#2@even@left@foot\endcsname #1%
- \expandafter\let\csname sls@ps@#2@even@middle@foot\endcsname #1%
- \expandafter\let\csname sls@ps@#2@even@right@foot\endcsname #1%
- \expandafter\let\csname sls@ps@#2@odd@left@foot\endcsname #1%
- \expandafter\let\csname sls@ps@#2@odd@middle@foot\endcsname #1%
- \expandafter\let\csname sls@ps@#2@odd@right@foot\endcsname #1%
- }%
-}
+\newcommand*{\sls@let@pair@page@style}[2]{%
+ \expandafter\let\csname sls@ps@#2@even@left@head\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@even@middle@head\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@even@right@head\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@odd@left@head\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@odd@middle@head\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@odd@right@head\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@even@left@foot\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@even@middle@foot\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@even@right@foot\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@odd@left@foot\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@odd@middle@foot\endcsname #1%
+ \expandafter\let\csname sls@ps@#2@odd@right@foot\endcsname #1%
+}%
% \end{macrocode}
% \end{macro}%^^A \sls@let@pair@page@style
% \end{macro}%^^A \sls@init@pair@page@style
@@ -2409,57 +2215,55 @@
% \end{description}
% A little helper for \Macro{defpairofpagestyles}.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@def@pair@page@style@member{%
- \newcommand*{\sls@def@pair@page@style@member}[1]{%
- \defpagestyle{#1}{%
- {%
- \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@headwidth}{\LaTeXraggedright
- \strut\@nameuse{sls@ps@#1@even@left@head}\strut}}%
- \parbox{\sls@headwidth}{\LaTeXcentering
- \strut\@nameuse{sls@ps@#1@even@middle@head}\strut}%
- \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@headwidth}{\LaTeXraggedleft
- \strut\@nameuse{sls@ps@#1@even@right@head}\strut}}%
- }{%
- \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@headwidth}{\LaTeXraggedright
- \strut\@nameuse{sls@ps@#1@odd@left@head}\strut}}%
- \parbox{\sls@headwidth}{\LaTeXcentering
- \strut\@nameuse{sls@ps@#1@odd@middle@head}\strut}%
- \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@headwidth}{\LaTeXraggedleft
- \strut\@nameuse{sls@ps@#1@odd@right@head}\strut}}%
- }{%
- \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@headwidth}{\LaTeXraggedright
- \strut\@nameuse{sls@ps@#1@odd@left@head}\strut}}%
- \parbox{\sls@headwidth}{\LaTeXcentering
- \strut\@nameuse{sls@ps@#1@odd@middle@head}\strut}%
- \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@headwidth}{\LaTeXraggedleft
- \strut\@nameuse{sls@ps@#1@odd@right@head}\strut}}%
- }%
+\newcommand*{\sls@def@pair@page@style@member}[1]{%
+ \defpagestyle{#1}{%
+ {%
+ \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@headwidth}{\LaTeXraggedright
+ \strut\@nameuse{sls@ps@#1@even@left@head}\strut}}%
+ \parbox{\sls@headwidth}{\LaTeXcentering
+ \strut\@nameuse{sls@ps@#1@even@middle@head}\strut}%
+ \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@headwidth}{\LaTeXraggedleft
+ \strut\@nameuse{sls@ps@#1@even@right@head}\strut}}%
}{%
- {%
- \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@footwidth}{\LaTeXraggedright
- \strut\@nameuse{sls@ps@#1@even@left@foot}\strut}}%
- \parbox{\sls@footwidth}{\LaTeXcentering
- \strut\@nameuse{sls@ps@#1@even@middle@foot}\strut}%
- \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@footwidth}{\LaTeXraggedleft
- \strut\@nameuse{sls@ps@#1@even@right@foot}\strut}}%
- }{%
- \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@footwidth}{\LaTeXraggedright
- \strut\@nameuse{sls@ps@#1@odd@left@foot}\strut}}%
- \parbox{\sls@footwidth}{\LaTeXcentering
- \strut\@nameuse{sls@ps@#1@odd@middle@foot}\strut}%
- \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@footwidth}{\LaTeXraggedleft
- \strut\@nameuse{sls@ps@#1@odd@right@foot}\strut}}%
- }{%
- \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@footwidth}{\LaTeXraggedright
- \strut\@nameuse{sls@ps@#1@odd@left@foot}\strut}}%
- \parbox{\sls@footwidth}{\LaTeXcentering
- \strut\@nameuse{sls@ps@#1@odd@middle@foot}\strut}%
- \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@footwidth}{\LaTeXraggedleft
- \strut\@nameuse{sls@ps@#1@odd@right@foot}\strut}}%
- }%
+ \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@headwidth}{\LaTeXraggedright
+ \strut\@nameuse{sls@ps@#1@odd@left@head}\strut}}%
+ \parbox{\sls@headwidth}{\LaTeXcentering
+ \strut\@nameuse{sls@ps@#1@odd@middle@head}\strut}%
+ \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@headwidth}{\LaTeXraggedleft
+ \strut\@nameuse{sls@ps@#1@odd@right@head}\strut}}%
+ }{%
+ \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@headwidth}{\LaTeXraggedright
+ \strut\@nameuse{sls@ps@#1@odd@left@head}\strut}}%
+ \parbox{\sls@headwidth}{\LaTeXcentering
+ \strut\@nameuse{sls@ps@#1@odd@middle@head}\strut}%
+ \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@headwidth}{\LaTeXraggedleft
+ \strut\@nameuse{sls@ps@#1@odd@right@head}\strut}}%
+ }%
+ }{%
+ {%
+ \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@footwidth}{\LaTeXraggedright
+ \strut\@nameuse{sls@ps@#1@even@left@foot}\strut}}%
+ \parbox{\sls@footwidth}{\LaTeXcentering
+ \strut\@nameuse{sls@ps@#1@even@middle@foot}\strut}%
+ \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@footwidth}{\LaTeXraggedleft
+ \strut\@nameuse{sls@ps@#1@even@right@foot}\strut}}%
+ }{%
+ \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@footwidth}{\LaTeXraggedright
+ \strut\@nameuse{sls@ps@#1@odd@left@foot}\strut}}%
+ \parbox{\sls@footwidth}{\LaTeXcentering
+ \strut\@nameuse{sls@ps@#1@odd@middle@foot}\strut}%
+ \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@footwidth}{\LaTeXraggedleft
+ \strut\@nameuse{sls@ps@#1@odd@right@foot}\strut}}%
+ }{%
+ \makebox[0pt][\IfRTL{r}{l}]{\parbox{\sls@footwidth}{\LaTeXraggedright
+ \strut\@nameuse{sls@ps@#1@odd@left@foot}\strut}}%
+ \parbox{\sls@footwidth}{\LaTeXcentering
+ \strut\@nameuse{sls@ps@#1@odd@middle@foot}\strut}%
+ \makebox[0pt][\IfRTL{l}{r}]{\parbox{\sls@footwidth}{\LaTeXraggedleft
+ \strut\@nameuse{sls@ps@#1@odd@right@foot}\strut}}%
}%
}%
-}
+}%
%</body>
% \end{macrocode}
% \end{macro}%^^A \sls@def@pair@page@style@member
@@ -2471,83 +2275,77 @@
% See \Macro{defpairofpagestyles} for the arguments.
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\newpairofpagestyles{%
- \newcommand*{\newpairofpagestyles}[3][]{%
- \scr@ifundefinedorrelax{ps@#2}{%
- \@ifundefined{ps@plain.#2}{\defpairofpagestyles[#1]{#2}{#3}}{%
- \PackageError{scrlayer-scrpage}{%
- Plain page style of `#2' already defined}{%
- You may only define a new pair of page styles, if neither the style
- itself\MessageBreak
- nor it's plain page style has already been defined.\MessageBreak
- You may use only \string\defpairofpagestyles\space or
- \string\providepairofpagestyles\space with partly\MessageBreak
- already defined page styles.\MessageBreak
- If you'll continue, your command will be ignored.%
- }%
- }%
- }{%
+\newcommand*{\newpairofpagestyles}[3][]{%
+ \scr@ifundefinedorrelax{ps@#2}{%
+ \@ifundefined{ps@plain.#2}{\defpairofpagestyles[#1]{#2}{#3}}{%
\PackageError{scrlayer-scrpage}{%
- Page style `#2' already defined}{%
+ Plain page style of `#2' already defined}{%
You may only define a new pair of page styles, if neither the style
itself\MessageBreak
nor it's plain page style has already been defined.\MessageBreak
- You may use either \string\renewpairsofpagestyles,
- \string\defpairofpagestyles, or\MessageBreak
- \string\providepairofpagestyles\space with already defined page
- styles.\MessageBreak
+ You may use only \string\defpairofpagestyles\space or
+ \string\providepairofpagestyles\space with partly\MessageBreak
+ already defined page styles.\MessageBreak
If you'll continue, your command will be ignored.%
}%
}%
+ }{%
+ \PackageError{scrlayer-scrpage}{%
+ Page style `#2' already defined}{%
+ You may only define a new pair of page styles, if neither the style
+ itself\MessageBreak
+ nor it's plain page style has already been defined.\MessageBreak
+ You may use either \string\renewpairsofpagestyles,
+ \string\defpairofpagestyles, or\MessageBreak
+ \string\providepairofpagestyles\space with already defined page
+ styles.\MessageBreak
+ If you'll continue, your command will be ignored.%
+ }%
}%
-}
-\scrlayerAddToInterface\renewpairofpagestyles{%
- \newcommand*{\renewpairofpagestyles}[3][]{%
- \scr@ifundefinedorrelax{ps@#2}{%
+}%
+\newcommand*{\renewpairofpagestyles}[3][]{%
+ \scr@ifundefinedorrelax{ps@#2}{%
+ \PackageError{scrlayer-scrpage}{%
+ Undefined page style `#2'}{%
+ You may only redefine existing pairs of page styles. You may use
+ either\MessageBreak
+ \string\newpairsofpagestyles, \string\defpairofpagestyles, or
+ \string\providepairofpagestyles\MessageBreak
+ with not yet defined page styles.\MessageBreak
+ If you'll continue, your command will be ignored.%
+ }%
+ }{%
+ \@ifundefined{ps@plain.#2}{%
\PackageError{scrlayer-scrpage}{%
- Undefined page style `#2'}{%
+ Undefined plain page style of `#2'}{%
You may only redefine existing pairs of page styles. You may use
either\MessageBreak
- \string\newpairsofpagestyles, \string\defpairofpagestyles, or
- \string\providepairofpagestyles\MessageBreak
- with not yet defined page styles.\MessageBreak
+ \string\defpairofpagestyles\space or
+ \string\providepairofpagestyles\space with partly already
+ defined\MessageBreak
+ page styles.\MessageBreak
If you'll continue, your command will be ignored.%
}%
- }{%
- \@ifundefined{ps@plain.#2}{%
- \PackageError{scrlayer-scrpage}{%
- Undefined plain page style of `#2'}{%
- You may only redefine existing pairs of page styles. You may use
- either\MessageBreak
- \string\defpairofpagestyles\space or
- \string\providepairofpagestyles\space with partly already
- defined\MessageBreak
- page styles.\MessageBreak
- If you'll continue, your command will be ignored.%
- }%
- }{\defpairofpagestyles[#1]{#2}{#3}}%
- }%
+ }{\defpairofpagestyles[#1]{#2}{#3}}%
}%
-}
-\scrlayerAddToInterface\providepairofpagestyles{%
- \newcommand*{\providepairofpagestyles}[3][]{%
- \scr@ifundefinedorrelax{ps@#2}{%
- \@ifundefined{ps@plain.#2}{\defpairofpagestyles[#1]{#2}{#3}}{%
-%<*trace>
- \PackageInfo{scrlayer-scrpage}{%
- Plain page style of `#2' already\MessageBreak
- defined. Definition ignored}%
-%</trace>
- }%
- }{%
+}%
+\newcommand*{\providepairofpagestyles}[3][]{%
+ \scr@ifundefinedorrelax{ps@#2}{%
+ \@ifundefined{ps@plain.#2}{\defpairofpagestyles[#1]{#2}{#3}}{%
%<*trace>
\PackageInfo{scrlayer-scrpage}{%
- Page style of `#2' already defined.\MessageBreak
- Definition ignored}%
+ Plain page style of `#2' already\MessageBreak
+ defined. Definition ignored}%
%</trace>
}%
+ }{%
+%<*trace>
+ \PackageInfo{scrlayer-scrpage}{%
+ Page style of `#2' already defined.\MessageBreak
+ Definition ignored}%
+%</trace>
}%
-}
+}%
%</body>
% \end{macrocode}
% \end{macro}%^^A \providepairofpagestyles
@@ -2567,7 +2365,6 @@
% \texttt{scrplain}. So we make a kind of alias:
% \begin{macrocode}
\DeclarePageStyleAlias{scrplain}{plain.scrheadings}
-\scrlayerOnAutoRemoveInterface{\DestroyPageStyleAlias{scrplain}}
%</body>
% \end{macrocode}
% \end{macro}%^^A \ps@scrplain
@@ -2653,9 +2450,7 @@
% member.
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\ihead{%
- \newcommand*{\ihead}{\kernel@ifstar {\@dblarg\@@@ihead}{\@ihead}}%
-}
+\newcommand*{\ihead}{\kernel@ifstar {\@dblarg\@@@ihead}{\@ihead}}%
% \end{macrocode}
% \begin{macro}{\@ihead}
% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
@@ -2666,23 +2461,15 @@
% \changes{v3.27}{2019/04/05}{made long}%^^A
% Two helpers for the previous one to double the command and it's arguments.
% \begin{macrocode}
-\scrlayerAddToInterface\@ihead{%
- \newcommand*{\@ihead}{\kernel@ifnextchar[{\@@@ihead}{\@@ihead}}%
-}
-\scrlayerAddToInterface\@@ihead{%
- \newcommand{\@@ihead}[1]{\rehead{#1}\lohead{#1}}%
-}
-\scrlayerAddToInterface\@@@ihead{%
- \newcommand{\@@@ihead}[2][]{\rehead[{#1}]{#2}\lohead[{#1}]{#2}}%
-}
+\newcommand*{\@ihead}{\kernel@ifnextchar[{\@@@ihead}{\@@ihead}}%
+\newcommand{\@@ihead}[1]{\rehead{#1}\lohead{#1}}%
+\newcommand{\@@@ihead}[2][]{\rehead[{#1}]{#2}\lohead[{#1}]{#2}}%
% \end{macrocode}
% \end{macro}%^^A \@@@ihead
% \end{macro}%^^A \@@ihead
% \end{macro}%^^A \@ihead
% \begin{macrocode}
-\scrlayerAddToInterface\ohead{%
- \newcommand*{\ohead}{\kernel@ifstar {\@dblarg\@@@ohead}{\@ohead}}%
-}
+\newcommand*{\ohead}{\kernel@ifstar {\@dblarg\@@@ohead}{\@ohead}}%
% \end{macrocode}
% \begin{macro}{\@ohead}
% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
@@ -2693,23 +2480,15 @@
% \changes{v3.27}{2019/04/05}{made long}%^^A
% Two helpers for the previous one to double the command and it's arguments.
% \begin{macrocode}
-\scrlayerAddToInterface\@ohead{%
- \newcommand*{\@ohead}{\kernel@ifnextchar[{\@@@ohead}{\@@ohead}}%
-}
-\scrlayerAddToInterface\@@ohead{%
- \newcommand{\@@ohead}[1]{\lehead{#1}\rohead{#1}}%
-}
-\scrlayerAddToInterface\@@@ohead{%
- \newcommand{\@@@ohead}[2][]{\lehead[{#1}]{#2}\rohead[{#1}]{#2}}%
-}
+\newcommand*{\@ohead}{\kernel@ifnextchar[{\@@@ohead}{\@@ohead}}%
+\newcommand{\@@ohead}[1]{\lehead{#1}\rohead{#1}}%
+\newcommand{\@@@ohead}[2][]{\lehead[{#1}]{#2}\rohead[{#1}]{#2}}%
% \end{macrocode}
% \end{macro}%^^A \@@@ohead
% \end{macro}%^^A \@@ohead
% \end{macro}%^^A \@ohead
% \begin{macrocode}
-\scrlayerAddToInterface\chead{%
- \newcommand*{\chead}{\kernel@ifstar {\@dblarg\@@@chead}{\@chead}}%
-}
+\newcommand*{\chead}{\kernel@ifstar {\@dblarg\@@@chead}{\@chead}}%
% \end{macrocode}
% \begin{macro}{\@chead}
% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
@@ -2720,43 +2499,23 @@
% \changes{v3.27}{2019/04/05}{made long}%^^A
% Two helpers for the previous one to double the command and it's arguments.
% \begin{macrocode}
-\scrlayerAddToInterface\@chead{%
- \newcommand*{\@chead}{\kernel@ifnextchar[{\@@@chead}{\@@chead}}%
-}
-\scrlayerAddToInterface\@@chead{%
- \newcommand{\@@chead}[1]{\cehead{#1}\cohead{#1}}%
-}
-\scrlayerAddToInterface\@@@chead{%
- \newcommand{\@@@chead}[2][]{\cehead[{#1}]{#2}\cohead[{#1}]{#2}}%
-}
+\newcommand*{\@chead}{\kernel@ifnextchar[{\@@@chead}{\@@chead}}%
+\newcommand{\@@chead}[1]{\cehead{#1}\cohead{#1}}%
+\newcommand{\@@@chead}[2][]{\cehead[{#1}]{#2}\cohead[{#1}]{#2}}%
% \end{macrocode}
% \end{macro}%^^A \@@@chead
% \end{macro}%^^A \@@chead
% \end{macro}%^^A \@chead
% \begin{macrocode}
-\scrlayerAddToInterface\lehead{%
- \newcommand*{\lehead}{\sls@renewelement{even}{left}{head}}%
-}
-\scrlayerAddToInterface\lohead{%
- \newcommand*{\lohead}{\sls@renewelement{odd}{left}{head}}%
-}
-\scrlayerAddToInterface\rehead{%
- \newcommand*{\rehead}{\sls@renewelement{even}{right}{head}}%
-}
-\scrlayerAddToInterface\rohead{%
- \newcommand*{\rohead}{\sls@renewelement{odd}{right}{head}}%
-}
-\scrlayerAddToInterface\cehead{%
- \newcommand*{\cehead}{\sls@renewelement{even}{middle}{head}}%
-}
-\scrlayerAddToInterface\cohead{%
- \newcommand*{\cohead}{\sls@renewelement{odd}{middle}{head}}%
-}
+\newcommand*{\lehead}{\sls@renewelement{even}{left}{head}}%
+\newcommand*{\lohead}{\sls@renewelement{odd}{left}{head}}%
+\newcommand*{\rehead}{\sls@renewelement{even}{right}{head}}%
+\newcommand*{\rohead}{\sls@renewelement{odd}{right}{head}}%
+\newcommand*{\cehead}{\sls@renewelement{even}{middle}{head}}%
+\newcommand*{\cohead}{\sls@renewelement{odd}{middle}{head}}%
% \end{macrocode}
% \begin{macrocode}
-\scrlayerAddToInterface\ifoot{%
- \newcommand*{\ifoot}{\kernel@ifstar {\@dblarg\@@@ifoot}{\@ifoot}}%
-}
+\newcommand*{\ifoot}{\kernel@ifstar {\@dblarg\@@@ifoot}{\@ifoot}}%
% \end{macrocode}
% \begin{macro}{\@ifoot}
% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
@@ -2767,23 +2526,15 @@
% \changes{v3.27}{2019/04/05}{made long}%^^A
% Two helpers for the previous one to double the command and it's arguments.
% \begin{macrocode}
-\scrlayerAddToInterface\@ifoot{%
- \newcommand*{\@ifoot}{\kernel@ifnextchar[{\@@@ifoot}{\@@ifoot}}%
-}
-\scrlayerAddToInterface\@@ifoot{%
- \newcommand{\@@ifoot}[1]{\refoot{#1}\lofoot{#1}}%
-}
-\scrlayerAddToInterface\@@@ifoot{%
- \newcommand{\@@@ifoot}[2][]{\refoot[{#1}]{#2}\lofoot[{#1}]{#2}}%
-}
+\newcommand*{\@ifoot}{\kernel@ifnextchar[{\@@@ifoot}{\@@ifoot}}%
+\newcommand{\@@ifoot}[1]{\refoot{#1}\lofoot{#1}}%
+\newcommand{\@@@ifoot}[2][]{\refoot[{#1}]{#2}\lofoot[{#1}]{#2}}%
% \end{macrocode}
% \end{macro}%^^A \@@@ifoot
% \end{macro}%^^A \@@ifoot
% \end{macro}%^^A \@ifoot
% \begin{macrocode}
-\scrlayerAddToInterface\ofoot{%
- \newcommand*{\ofoot}{\kernel@ifstar {\@dblarg\@@@ofoot}{\@ofoot}}%
-}
+\newcommand*{\ofoot}{\kernel@ifstar {\@dblarg\@@@ofoot}{\@ofoot}}%
% \end{macrocode}
% \begin{macro}{\@ofoot}
% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
@@ -2794,23 +2545,15 @@
% \changes{v3.27}{2019/04/05}{made long}%^^A
% Two helpers for the previous one to double the command and it's arguments.
% \begin{macrocode}
-\scrlayerAddToInterface\@ofoot{%
- \newcommand*{\@ofoot}{\kernel@ifnextchar[{\@@@ofoot}{\@@ofoot}}%
-}
-\scrlayerAddToInterface\@@ofoot{%
- \newcommand{\@@ofoot}[1]{\lefoot{#1}\rofoot{#1}}%
-}
-\scrlayerAddToInterface\@@@ofoot{%
- \newcommand{\@@@ofoot}[2][]{\lefoot[{#1}]{#2}\rofoot[{#1}]{#2}}%
-}
+\newcommand*{\@ofoot}{\kernel@ifnextchar[{\@@@ofoot}{\@@ofoot}}%
+\newcommand{\@@ofoot}[1]{\lefoot{#1}\rofoot{#1}}%
+\newcommand{\@@@ofoot}[2][]{\lefoot[{#1}]{#2}\rofoot[{#1}]{#2}}%
% \end{macrocode}
% \end{macro}%^^A \@@@ofoot
% \end{macro}%^^A \@@ofoot
% \end{macro}%^^A \@ofoot
% \begin{macrocode}
-\scrlayerAddToInterface\cfoot{%
- \newcommand*{\cfoot}{\kernel@ifstar {\@dblarg\@@@cfoot}{\@cfoot}}%
-}
+\newcommand*{\cfoot}{\kernel@ifstar {\@dblarg\@@@cfoot}{\@cfoot}}%
% \end{macrocode}
% \begin{macro}{\@cfoot}
% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
@@ -2821,38 +2564,20 @@
% \changes{v3.27}{2019/04/05}{made long}%^^A
% Two helpers for the previous one to double the command and it's arguments.
% \begin{macrocode}
-\scrlayerAddToInterface\@cfoot{%
- \newcommand*{\@cfoot}{\kernel@ifnextchar[{\@@@cfoot}{\@@cfoot}}%
-}
-\scrlayerAddToInterface\@@cfoot{%
- \newcommand{\@@cfoot}[1]{\cefoot{#1}\cofoot{#1}}%
-}
-\scrlayerAddToInterface\@@@cfoot{%
- \newcommand{\@@@cfoot}[2][]{\cefoot[{#1}]{#2}\cofoot[{#1}]{#2}}%
-}
+\newcommand*{\@cfoot}{\kernel@ifnextchar[{\@@@cfoot}{\@@cfoot}}%
+\newcommand{\@@cfoot}[1]{\cefoot{#1}\cofoot{#1}}%
+\newcommand{\@@@cfoot}[2][]{\cefoot[{#1}]{#2}\cofoot[{#1}]{#2}}%
% \end{macrocode}
% \end{macro}%^^A \@@@cfoot
% \end{macro}%^^A \@@cfoot
% \end{macro}%^^A \@cfoot
% \begin{macrocode}
-\scrlayerAddToInterface\lefoot{%
- \newcommand*{\lefoot}{\sls@renewelement{even}{left}{foot}}%
-}
-\scrlayerAddToInterface\lofoot{%
- \newcommand*{\lofoot}{\sls@renewelement{odd}{left}{foot}}%
-}
-\scrlayerAddToInterface\refoot{%
- \newcommand*{\refoot}{\sls@renewelement{even}{right}{foot}}%
-}
-\scrlayerAddToInterface\rofoot{%
- \newcommand*{\rofoot}{\sls@renewelement{odd}{right}{foot}}%
-}
-\scrlayerAddToInterface\cefoot{%
- \newcommand*{\cefoot}{\sls@renewelement{even}{middle}{foot}}%
-}
-\scrlayerAddToInterface\cofoot{%
- \newcommand*{\cofoot}{\sls@renewelement{odd}{middle}{foot}}%
-}
+\newcommand*{\lefoot}{\sls@renewelement{even}{left}{foot}}%
+\newcommand*{\lofoot}{\sls@renewelement{odd}{left}{foot}}%
+\newcommand*{\refoot}{\sls@renewelement{even}{right}{foot}}%
+\newcommand*{\rofoot}{\sls@renewelement{odd}{right}{foot}}%
+\newcommand*{\cefoot}{\sls@renewelement{even}{middle}{foot}}%
+\newcommand*{\cofoot}{\sls@renewelement{odd}{middle}{foot}}%
% \end{macrocode}
% \begin{macro}{\sls@renewelement}
% \begin{macro}{\sls@@renewelement}
@@ -2868,43 +2593,34 @@
% \changes{v3.27}{2019/04/05}{made long}%^^A
% Little helper for several of the above commands.
% \begin{macrocode}
-\scrlayerAddToInterface\sls@renewelement{%
- \newcommand*{\sls@renewelement}[3]{%
- \kernel@ifstar{\@dblarg{\sls@@@@renewelement{#1}{#2}{#3}}}%
- {\sls@@renewelement{#1}{#2}{#3}}%
- }%
-}
-\scrlayerAddToInterface\sls@@renewelement{%
- \newcommand*{\sls@@renewelement}[3]{%
- \kernel@ifnextchar[%]
- {\sls@@@@renewelement{#1}{#2}{#3}}%
- {\sls@@@renewelement{#1}{#2}{#3}}%
- }%
-}
-\scrlayerAddToInterface\sls@@@renewelement{%
- \newcommand{\sls@@@renewelement}[4]{%
- \scr@ifundefinedorrelax{sls@ps@\sls@currentheadings @#1@#2@#3}{%
- \@namedef{sls@ps@scrheadings@#1@#2@#3}{#4}%
- }{%
- \@namedef{sls@ps@\sls@currentheadings @#1@#2@#3}{#4}%
- }%
- }%
-}
-\scrlayerAddToInterface\sls@@@@renewelement{%
- \long\def\sls@@@@renewelement#1#2#3[#4]#5{%
- \sls@@renewplainelement{#1}{#2}{#3}{#4}%
- \sls@@@renewelement{#1}{#2}{#3}{#5}%
+\newcommand*{\sls@renewelement}[3]{%
+ \kernel@ifstar{\@dblarg{\sls@@@@renewelement{#1}{#2}{#3}}}%
+ {\sls@@renewelement{#1}{#2}{#3}}%
+}%
+\newcommand*{\sls@@renewelement}[3]{%
+ \kernel@ifnextchar[%]
+ {\sls@@@@renewelement{#1}{#2}{#3}}%
+ {\sls@@@renewelement{#1}{#2}{#3}}%
+}%
+\newcommand{\sls@@@renewelement}[4]{%
+ \scr@ifundefinedorrelax{sls@ps@\sls@currentheadings @#1@#2@#3}{%
+ \@namedef{sls@ps@scrheadings@#1@#2@#3}{#4}%
+ }{%
+ \@namedef{sls@ps@\sls@currentheadings @#1@#2@#3}{#4}%
}%
-}
-\scrlayerAddToInterface\sls@@renewplainelement{%
- \newcommand{\sls@@renewplainelement}[4]{%
- \scr@ifundefinedorrelax{sls@ps@\sls@currentplain @#1@#2@#3}{%
- \@namedef{sls@ps@plain.scrheadings@#1@#2@#3}{#4}%
- }{%
- \@namedef{sls@ps@\sls@currentplain @#1@#2@#3}{#4}%
- }%
+}%
+\newcommand*{\sls@@@@renewelement}{}
+\long\def\sls@@@@renewelement#1#2#3[#4]#5{%
+ \sls@@renewplainelement{#1}{#2}{#3}{#4}%
+ \sls@@@renewelement{#1}{#2}{#3}{#5}%
+}%
+\newcommand{\sls@@renewplainelement}[4]{%
+ \scr@ifundefinedorrelax{sls@ps@\sls@currentplain @#1@#2@#3}{%
+ \@namedef{sls@ps@plain.scrheadings@#1@#2@#3}{#4}%
+ }{%
+ \@namedef{sls@ps@\sls@currentplain @#1@#2@#3}{#4}%
}%
-}
+}%
%</body>
% \end{macrocode}
% \end{macro}%^^A \sls@@renewplainelement
@@ -2933,18 +2649,21 @@
%
% \begin{macro}{\clearmainofpairofpagestyles}
% \begin{macro}{\clearscrheadings}
+% \changes{v3.32}{2020/09/11}{deprecation warning added}
% Maybe you want to clear the currently defined head and foot. First
% let's clear only scrheadings pagestyle but not scrplain pagestyle.
% We do this simply using the already known command:
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\clearmainofpairofpagestyles{%
- \newcommand*{\clearmainofpairofpagestyles}{%
- \ihead{}\chead{}\ohead{}\ifoot{}\cfoot{}\ofoot{}%
+\newcommand*{\clearmainofpairofpagestyles}{%
+ \ihead{}\chead{}\ohead{}\ifoot{}\cfoot{}\ofoot{}%
+}%
+\newcommand*{\clearscrheadings}{%
+ \PackageWarning{scrlayer-scrpage}{%
+ replacing deprecated \string\clearscrheading\space by\MessageBreak
+ \string\clearmainofpairofpagestyles
}%
-}
-\scrlayerAddToInterface\clearscrheadings{%
- \let\clearscrheadings\clearmainofpairofpagestyles
+ \clearmainofpairofpagestyles
}
%</body>
% \end{macrocode}
@@ -2952,27 +2671,30 @@
% \end{macro}%^^A \clearmainofpairofpagestyles
% \begin{macro}{\clearplainofpairofpagestyles}
% \begin{macro}{\clearscrplain}
+% \changes{v3.32}{2020/09/11}{deprecation warning added}
% Now, we use the not recommended feature to set up a plain style:
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\clearplainofpairofpagestyles{%
- \newcommand*{\clearplainofpairofpagestyles}{%
- \sls@@renewplainelement{odd}{left}{head}{}%
- \sls@@renewplainelement{odd}{right}{head}{}%
- \sls@@renewplainelement{odd}{middle}{head}{}%
- \sls@@renewplainelement{even}{left}{head}{}%
- \sls@@renewplainelement{even}{right}{head}{}%
- \sls@@renewplainelement{even}{middle}{head}{}%
- \sls@@renewplainelement{odd}{left}{foot}{}%
- \sls@@renewplainelement{odd}{right}{foot}{}%
- \sls@@renewplainelement{odd}{middle}{foot}{}%
- \sls@@renewplainelement{even}{left}{foot}{}%
- \sls@@renewplainelement{even}{right}{foot}{}%
- \sls@@renewplainelement{even}{middle}{foot}{}%
+\newcommand*{\clearplainofpairofpagestyles}{%
+ \sls@@renewplainelement{odd}{left}{head}{}%
+ \sls@@renewplainelement{odd}{right}{head}{}%
+ \sls@@renewplainelement{odd}{middle}{head}{}%
+ \sls@@renewplainelement{even}{left}{head}{}%
+ \sls@@renewplainelement{even}{right}{head}{}%
+ \sls@@renewplainelement{even}{middle}{head}{}%
+ \sls@@renewplainelement{odd}{left}{foot}{}%
+ \sls@@renewplainelement{odd}{right}{foot}{}%
+ \sls@@renewplainelement{odd}{middle}{foot}{}%
+ \sls@@renewplainelement{even}{left}{foot}{}%
+ \sls@@renewplainelement{even}{right}{foot}{}%
+ \sls@@renewplainelement{even}{middle}{foot}{}%
+}%
+\newcommand*{\clearscrplain}{%
+ \PackageWarning{scrlayer-scrpage}{%
+ replacing deprecated \string\clearscrplain\space by\MessageBreak
+ \string\clearplainofpairofpagestyles
}%
-}
-\scrlayerAddToInterface\clearscrplain{%
- \let\clearscrplain\clearplainofpairofpagestyles
+ \clearplainofpairofpagestyles
}
%</body>
% \end{macrocode}
@@ -2980,16 +2702,19 @@
% \end{macro}%^^A \clearplainofpairofpagestyles
% \begin{macro}{\clearpairofpagestyles}
% \begin{macro}{\clearscrheadfoot}
+% \changes{v3.32}{2020/09/11}{deprecation warning added}
% Last but not least we clean up both, the main and the plain:
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\clearpairofpagestyles{%
- \newcommand*{\clearpairofpagestyles}{%
- \ihead[]{}\chead[]{}\ohead[]{}\ifoot[]{}\cfoot[]{}\ofoot[]{}%
+\newcommand*{\clearpairofpagestyles}{%
+ \ihead[]{}\chead[]{}\ohead[]{}\ifoot[]{}\cfoot[]{}\ofoot[]{}%
+}%
+\newcommand*{\clearscrheadfoot}{%
+ \PackageWarning{scrlayer-scrpage}{%
+ replacing deprecated \string\clearscrheadfoot\space by\MessageBreak
+ \string\clearpairofpagestyles
}%
-}
-\scrlayerAddToInterface\clearscrheadfoot{%
- \let\clearscrheadfoot\clearpairofpagestyles
+ \clearpairofpagestyles
}
%</body>
% \end{macrocode}
@@ -3000,24 +2725,22 @@
% Not longer supported:
% \begin{macrocode}
%<*body>
-\scrlayerAddToInterface\ps@useheadings{%
- \newcommand*\ps@useheadings{%
- \PackageWarning{scrlayer-scrpage}{incompatible page style!\MessageBreak
- Page styles like `headings' and `plain'\MessageBreak
- are incompatible with the page styles\MessageBreak
- of scrlayer-scrpage. You shouldn't mix\MessageBreak
- them up. Therefore page style\MessageBreak
- `useheadings' is not longer provided.\MessageBreak
- Usage is deprecated and will be replaced\MessageBreak
- by `scrheadings'%
- }%
- \let\ps@useheadings\ps@scrheadings
- \ps@useheadings
+\newcommand*\ps@useheadings{%
+ \PackageWarning{scrlayer-scrpage}{incompatible page style!\MessageBreak
+ Page styles like `headings' and `plain'\MessageBreak
+ are incompatible with the page styles\MessageBreak
+ of scrlayer-scrpage. You shouldn't mix\MessageBreak
+ them up. Therefore page style\MessageBreak
+ `useheadings' is not longer provided.\MessageBreak
+ Usage is deprecated and will be replaced\MessageBreak
+ by `scrheadings'%
}%
-}
-\scrlayerAddCsToInterface{ps@plain.useheadings}{%
- \@namedef{ps@plain.useheadings}{\@nameuse{ps@plain.scrheadings}}%
-}
+ \let\ps@useheadings\ps@scrheadings
+ \ps@useheadings
+}%
+\expandafter\newcommand\expandafter*\csname ps@plain.useheadings\endcsname{%
+ \@nameuse{ps@plain.scrheadings}%
+}%
%</body>
% \end{macrocode}
% \end{macro}%^^A \ps@useheadings
diff --git a/Master/texmf-dist/source/latex/koma-script/scrlayer.dtx b/Master/texmf-dist/source/latex/koma-script/scrlayer.dtx
index 50c44bd3327..5bc31538870 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrlayer.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrlayer.dtx
@@ -1,8 +1,7 @@
-% \CheckSum{4107}
% \iffalse^^A meta-comment
% ======================================================================
% scrlayer.dtx
-% Copyright (c) Markus Kohm, 2012-2019
+% Copyright (c) Markus Kohm, 2012-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +19,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrlayer.dtx
-% Copyright (c) Markus Kohm, 2012-2019
+% Copyright (c) Markus Kohm, 2012-2020
%
% Diese Datei ist Teil der LaTeX2e KOMA-Script-Sammlung.
%
@@ -38,26 +37,8 @@
%
% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
% ======================================================================
-% \fi^^A meta-comment
-%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
%
-% \iffalse^^A meta-comment
-%%% From File: $Id: scrlayer.dtx 3411 2019-11-28 09:11:27Z kohm $
+%%% From File: $Id: scrlayer.dtx 3533 2020-09-11 13:32:10Z kohm $
%<identify>%%% (run: identify)
%<init>%%% (run: init)
%<options>%%% (run: options)
@@ -67,9 +48,9 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-11-28 10:11:27 +0100 (Thu, 28 Nov 2019) $
+ \filedate$Date: 2020-09-11 15:32:10 +0200 (Fri, 11 Sep 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
- \filerevision$Revision: 3411 $
+ \filerevision$Revision: 3533 $
\edef\reserved@a{%
\noexpand\endgroup
\noexpand\ProvidesFile{scrlayer.dtx}%
@@ -2033,9 +2014,10 @@
% shouldn't matter, because layers with, e.g.,
% \Macro{if@scr@l@\dots@nonfloatpage}=\Macro{relax} and
% \Macro{if@scr@l@\dots@floatpage}=\Macro{relax} won't be output ever. This
-% command may and should be used by interfaces via
+% command could be used by interfaces via
% \Macro{scrlayerOnAutoRemoveInterface} to remove the generated
-% layers. Therefore it only destroys existing layers and doesn't care for not
+% layers, if the interface commands wouldn't be depreacted.
+% However, it only destroys existing layers and doesn't care for not
% existing.
% \begin{macrocode}
%<*package&body>
@@ -3992,8 +3974,9 @@
% Destroys the given layer page style but not the layers! If the page style is
% the current page style, the empty page style an empty page style will be
% activated. If the special page style is valid an the destroyed one, this
-% will be removed. This command may be used, e.g., at
-% \Macro{scrlayerOnAutoRemoveInterface} after destroying the layers.
+% will be removed. This command could be used, e.g., at
+% \Macro{scrlayerOnAutoRemoveInterface} after destroying the layers. However,
+% the interface commands are deprecated.
% \begin{macrocode}
%<*package&body>
\newcommand*{\DestroyRealLayerPageStyle}[1]{%
@@ -4133,6 +4116,8 @@
%
% \subsection{Declaration of End User Interfaces}
%
+% \changes{v3.32}{2020/09/11}{the interface commands are deprecated}
+%
% The package also supports an interface for loading end user interfaces.
% Maybe it would be a good idea to move this to \Package{scrbase}, but
% currently it is not needed.
@@ -4150,6 +4135,7 @@
% \begin{macrocode}
%<*package&body>
\newcommand*{\scrlayerAddToInterface}[2][\@currname.\@currext]{%
+ \scrlayer@report@deprecated{#1}{\scrlayerAddToInterface}%
\begingroup
\edef\reserve@a{%
\noexpand\scrlayerAddCsToInterface[#1]{\expandafter\@gobble\string #2}%
@@ -4157,6 +4143,7 @@
\expandafter\endgroup\reserve@a
}
\newcommand{\scrlayerAddCsToInterface}[3][\@currname.\@currext]{%
+ \scrlayer@report@deprecated{#1}{\scrlayerAddCsToInterface}%
\@ifundefined{scrlayer@#1@commandlist}{%
\PackageError{scrlayer}{unkown interface `#1'}{%
I've been told to add a command sequence to an interface, that hasn't
@@ -4253,6 +4240,7 @@
% \end{description}
% \begin{macrocode}
\newcommand*\scrlayer@AddCsToInterface[2][\@currname.\@currext]{%
+ \scrlayer@report@deprecated{#1}{\scrlayer@AddCsToInterface}%
\expandafter\expandafter\expandafter\def\expandafter
\csname scrlayer@#1@commandlist\expandafter\expandafter\expandafter\endcsname
\expandafter\expandafter\expandafter{%
@@ -4304,6 +4292,7 @@
%</package>
%<*interface>
\KOMA@key{autoremoveinterfaces}[true]{%
+ \scrlayer@report@deprecated{#1}{autoremoveinterface}%
\KOMA@set@ifkey{autoremoveinterfaces}{scrlayer@autoremoveinterfaces}{#1}%
\KOMA@kav@replacebool{.scrlayer.sty}{autoremoveinterfaces}
{scrlayer@autoremoveinterfaces}%
@@ -4334,6 +4323,7 @@
% \begin{macrocode}
%<*package&body>
\newcommand*{\scrlayerInitInterface}[1][\@currname.\@currext]{%
+ \scrlayer@report@deprecated{#1}{\scrlayerInitInterface}%
\@ifundefined{scrlayer@#1@commandlist}{%
\@namedef{scrlayer@#1@commandlist}{}%
}{%
@@ -4353,10 +4343,6 @@
}
%</package&body>
% \end{macrocode}
-% The initialisation has to be done by each interface package:
-% \begin{macrocode}
-%<interface&init>\scrlayerInitInterface
-% \end{macrocode}
% \end{macro}%^^A \scrlayerInitInterface
%
% \begin{macro}{\scrlayerOnAutoRemoveInterface}
@@ -4370,6 +4356,7 @@
% \begin{macrocode}
%<*package&body>
\newcommand*{\scrlayerOnAutoRemoveInterface}[2][\@currname.\@currext]{%
+ \scrlayer@report@deprecated{#1}{\scrlayerOnAutoRemoveInterface}%
\@ifundefined{scrlayer@#1@onremove}{\@namedef{scrlayer@#1@onremove}{}}{}%
\expandafter\l@addto@macro\csname scrlayer@#1@onremove\endcsname{#2}%
}
@@ -4377,6 +4364,25 @@
% \end{macrocode}
% \end{macro}%^^A \scrlayerOnAutoRemoveInterface
%
+% \begin{macro}{\scrlayer@report@deprecated}
+% \changes{v3.32}{2020/09/11}{new (internal)}
+% Report that the deprecated interface commands are used but should not. But
+% report this only once per interface.
+% \begin{macrocode}
+%<*package&init>
+\newcommand*{\scrlayer@report@deprecated}[2]{%
+ \@ifundefined{scrlayer@deprecated@reported@for@#1}{%
+ \PackageWarning{scrlayer}{%
+ Deprecated interface detected for `#1'.\MessageBreak
+ There isn't any support for using, e.g.,\MessageBreak
+ `\string #2'%
+ }%
+ \@namedef{scrlayer@deprecated@reported@for@#1}{\string #2}%
+ }{}%
+}
+%</package&init>
+% \end{macrocode}
+% \end{macro}
%
% \iffalse^^A meta-comment
%</package|interface|class>
diff --git a/Master/texmf-dist/source/latex/koma-script/scrlfile-hook.dtx b/Master/texmf-dist/source/latex/koma-script/scrlfile-hook.dtx
new file mode 100644
index 00000000000..1f944139be4
--- /dev/null
+++ b/Master/texmf-dist/source/latex/koma-script/scrlfile-hook.dtx
@@ -0,0 +1,634 @@
+% \iffalse^^A meta-comment
+% ======================================================================
+% scrlfile-hook.dtx
+% Copyright (c) Markus Kohm, 2020
+%
+% This file is part of the work `scrlfile' which is part of the LaTeX2e
+% KOMA-Script bundle.
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c of the license.
+% 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 and of this work.
+%
+% This work has the LPPL maintenance status "author-maintained".
+%
+% The Current Maintainer and author of this work is Markus Kohm.
+%
+% This work consists of all files listed in manifest.txt.
+% ----------------------------------------------------------------------
+% scrlfile-hook.dtx
+% Copyright (c) Markus Kohm, 2020
+%
+% Diese Datei ist Teil des Werks `scrlfile', das wiederum Teil des
+% LaTeX2e KOMA-Script Pakets ist.
+%
+% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
+% Version 1.3c, verteilt und/oder veraendert werden.
+% Die neuste Version dieser Lizenz ist
+% http://www.latex-project.org/lppl.txt
+% und Version 1.3c ist Teil aller Verteilungen von LaTeX
+% Version 2005/12/01 oder spaeter und dieses Werks.
+%
+% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained"
+% (allein durch den Autor verwaltet).
+%
+% Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm.
+%
+%
+% Dieses Werk besteht aus den in manifest.txt aufgeführten Dateien.
+% ======================================================================
+%
+%%% From File: $Id: scrlfile-hook.dtx$
+%<*dtx>
+\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
+\begingroup
+ \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
+ \filedate$Date: 2020-09-17 14:01:13 +0200 (Thu, 17 Sep 2020) $
+ \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
+ \filerevision$Revision: 3544 $
+ \edef\reserved@a{%
+ \noexpand\endgroup
+ \noexpand\ProvidesFile{scrlfile-hook.dtx}%
+ [\filedate\space\filerevision\space
+ KOMA-Script package source
+ }%
+\reserved@a
+%</dtx>
+%<package>\ProvidesPackage{scrlfile-hook}[%
+%!KOMAScriptVersion
+%<package> package
+ (using LaTeX hooks)]
+%<*dtx>
+\ifx\documentclass\undefined
+ \input scrdocstrip.tex
+ \@@input scrkernel-version.dtx
+ \@@input scrstrip.inc
+ \KOMAdefVariable{COPYRIGHTFROM}{2002}
+ \generate{\usepreamble\defaultpreamble
+ \file{scrlfile-hook.sty}{%
+ \from{scrlfile-hook.dtx}{package}%
+ }%
+ }%
+ \@@input scrstrop.inc
+\else
+ \let\endbatchfile\relax
+\fi
+\endbatchfile
+\documentclass{l3doc}
+\usepackage[english]{babel}
+\DeclareRobustCommand{\KOMAScript}{\textsf{K\kern.05em O\kern.05em%
+ M\kern.05em A\kern.1em-\kern.1em Script}}
+\CodelineIndex
+\GetFileInfo{scrlfile-hook.dtx}
+\title{\KOMAScript{} \partname\ \texttt{\filename}%
+ \thanks{This file is revision \fileversion\ of file \texttt{\filename}.}}
+\date{\filedate}
+\author{Markus Kohm\thanks{mailto:komascript@gmx.info}}
+
+\begin{document}
+ \maketitle
+ \begin{abstract}
+ This package provides hooks before and after loading files, packages or
+ classes. It also provides a hook after the last \cs{clearpage} of the
+ document. It allowes to replace files, packages and classes by other
+ files, packages and classes. It is inteded to be used by package and class
+ authors but may also be used by \LaTeX{} users.
+ \end{abstract}
+
+ \tableofcontents
+
+ \DocInput{\filename}
+\end{document}
+%</dtx>
+% \fi^^A meta-comment
+%
+% \changes{v3.32}{2020/08/25}{new (sub-)package}
+%^^A TODO: We should use docstrip3 instead of of docstrip. This would enable
+%^^A usability of @@-syntax in the source. But for this, additional
+%^^A changes would be needed to setup the version string. Because of
+%^^A this it should be done together with switch over to l3build.
+%
+% \section{The User Manual of \textsf{scrlfile-hook}}
+%
+% \textsf{scrlfile-hook} implements the \LaTeX-hook-based part of
+% \textsf{scrlfile}.
+%
+% There isn't any user manual for the user level \LaTeXe{} commands in this
+% file. Please see the manual of \textsf{scrlfile} for more information about
+% \textsf{scrlfile-hook}.
+%
+% This section, however, contains the user manual of the \LaTeX3{} package
+% author commands.
+%
+% \begin{function}[TF, added = 2020-08-26]
+% {\scrlfile_if_class_loaded:n,\scrlfile_if_package_loaded:n}
+% \begin{syntax}
+% \cs{scrlfile_if_class_loaded:nTF} \Arg{class name} \Arg{true code} \Arg{false code}
+% \cs{scrlfile_if_package_loaded:nTF} \Arg{package name} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the class \meta{class name} resp. the package \meta{package name}
+% has been loaded completely. It runs the \Arg{true code} only, if the input
+% of the class file with the name \meta{class
+% name}\texttt{.}\cs{@clsextension} resp. the package file with the name
+% \meta{package name}\texttt{.}\cs{@pkgextension} has already been
+% finished. It runs the \Arg{false code}, if the class or package has not
+% been loaded or the input of the class or package file is still in
+% progress.
+% \end{function}
+%
+%
+% \StopEventually{\PrintIndex}
+%
+% \section{The Implementation of \textsf{scrlfile-hook}}
+%
+% \begin{macrocode}
+%<@@=scrlfile>
+% \end{macrocode}
+%
+% Test whether the uses \LaTeX{} provides all commands we need.
+% \begin{macrocode}
+\@ifundefined{AddToHook}{%
+ \PackageError{scrlfile-hook}{LaTeX too old for this package}{%
+ \string\AddToHook\space of LaTeX 2020-10-01 or newer is
+ needed.\MessageBreak
+ Please update LaTeX or use package scrlfile-patch instead of\MessageBreak
+ scrlfile-hook.\MessageBreak
+ If you would continue, I will try to load scrlfile-patch
+ }%
+ \RequirePackage{scrlfile-patch}%
+ \endinput
+}{}
+% \end{macrocode}
+%
+%
+% \subsection{Before and After Commands}
+%
+% The hook implementation is based on a \LaTeX{} version that provides
+% \LaTeX3. So it makes sense to use it.
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \begin{macro}{\BeforeFile}
+% The hook version of this command is just a wrapper to the corresponding
+% \LaTeX{} file hooks. It supports a mandatory \meta{file} argument, an
+% optional \meta{label} argument and a mandatory \meta{hook code} argument.
+% \begin{macrocode}
+\NewDocumentCommand \BeforeFile { m }
+ {
+ \AddToHook { file / before / #1 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AfterFile}
+% The hook version of this command is just a wrapper to the corresponding
+% \LaTeX{} file hooks. It supports a mandatory \meta{file} argument, an
+% optional \meta{label} argument and a mandatory \meta{hook code} argument.
+% \begin{macrocode}
+\NewDocumentCommand \AfterFile { m }
+ {
+ \AddToHook { file / after / #1 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\BeforeClass,\BeforePackage}
+% The hook version of these commands are also wrappers to the
+% \texttt{file/before} hooks, because the \meta{code} should also be executed
+% already in the class or package context.
+% \begin{macrocode}
+\NewDocumentCommand \BeforeClass { m }
+ {
+ \BeforeFile { #1.\@clsextension }
+ }
+\NewDocumentCommand \BeforePackage { m }
+ {
+ \BeforeFile { #1.\@pkgextension }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AfterAtEndOfClass,\AfterAtEndOfPackage}
+% With version 3.32 the syntax of these commands have been changed. Now, there
+% is also a star variant, that runs the \meta{code} immediately if the class
+% or package has already been loaded completely. Otherwise and in the normal
+% variant the \meta{code} is added to the \texttt{class/after} or
+% \texttt{package/after} hook, because this hook is used outside the context
+% of the class or package and after the \cs{AtEndOfClass} or
+% \cs{AtEndOfPackage} code.
+% \begin{macrocode}
+\NewDocumentCommand \AfterAtEndOfClass { s m o +m }
+ {
+ \IfBooleanTF { #1 }
+ {
+ \scrlfile_if_class_loaded:nTF { #2 }
+ { #4 }
+ { \hook_gput_code:nnn { class / after / #2 } { #3 } { #4 } }
+ }
+ { \hook_gput_code:nnn { class / after / #2 } { #3 } { #4 } }
+ }
+\NewDocumentCommand \AfterAtEndOfPackage { s m o +m }
+ {
+ \IfBooleanTF { #1 }
+ {
+ \scrlfile_if_package_loaded:nTF { #2 }
+ { #4 }
+ { \hook_gput_code:nnn { package / after / #2 } { #3 } { #4 } }
+ }
+ { \hook_gput_code:nnn { package / after / #2} { #3 } { #4 } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}[added = 2020-06-26]{\g__scrlfile_input_file_seq}
+% \cs{g__scrlfile_input_file_seq} is a sequence of active file inputs (without
+% path information). Two global hooks are used to setup the sequence. The new
+% conditional tests if a file is in the sequence.
+% \begin{macrocode}
+\seq_new:N \g__scrlfile_input_file_seq
+\hook_gput_code:nnn { file / before } { . }
+ { \seq_gpush:Nx \g__scrlfile_input_file_seq { \CurrentFile } }
+\hook_gput_code:nnn { file / after } { . }
+ {
+ \seq_gpop:NNF \g__scrlfile_input_file_seq \l_tmpa_seq
+ {
+ \msg_new:nnn { scrlfile-hook } { to-much-pops }
+ {
+ More~file~names~popped~from~stack~than~put~to.~
+ This~should~never~happen.~
+ However,~it~could~happen~if~scrlfile-hook~is~loaded~by~another~
+ package~or~class.~In~this~case~some~packages~or~classes~are~not~
+ recognised~correctly.
+ }
+ \msg_warning:nn { scrlfile-hook } { to-much-pops }
+ }
+ }
+% \end{macrocode}
+% Unfortunately we need an ugly hack to initialise the stack using an internal
+% kernel variable. This is a no go but I do not know a better solution for
+% this, because loading of the package could be done late.
+% TODO: Decide, if the second or fourth token is correct. If fourth,
+% \cs{CurrentFile} has to be used always instead of
+% \cs{CurrentFileUsed}.
+% \begin{macrocode}
+\cs_if_exist:NTF \g__filehook_input_file_seq
+ {
+ \seq_map_inline:Nn \g__filehook_input_file_seq
+ {
+ \seq_gput_right:Nx \g__scrlfile_input_file_seq
+ { \tl_item:nn { #1 } { 2 } }
+ }
+ }
+ {
+ \seq_gpush:Nx \g__scrlfile_input_file_seq { }
+ \cs_if_exist:NTF \CurrentFileUsed
+ { \seq_gpush:Nx \g__scrlfile_input_file_seq { \CurrentFileUsed } }
+ { \seq_gpush:Nx \g__scrlfile_input_file_seq { \CurrentFile } }
+ }
+% \end{macrocode}
+% \end{variable}
+% \begin{function}[TF, added = 2020-06-26]{\@@_if_loading:n}
+% Test if the file name is in the file name list.
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \__scrlfile_if_loading:n #1 { T, F, TF }
+ {
+ \str_set:Nx \l_tmpa_str { #1 }
+ \seq_if_in:NxTF \g__scrlfile_input_file_seq { \str_use:N \l_tmpa_str }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+% \end{macrocode}
+% \end{function}
+%
+% \begin{function}[TF, added = 2020/08/22]
+% {\scrlfile_if_class_loaded:n,\scrlfile_if_package_loaded:n}
+% \cs{scrlfile_if_class_loaded:nTF} is similar to \cs{@ifclassloaded} and
+% \cs{scrlfile_if_package_loaded:nTF} is similar to \cs{@ifpackageloaded} but in
+% opposite to those they test, if the class or package has been loaded
+% completely.
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \scrlfile_if_class_loaded:n #1 { T, F, TF }
+ {
+ \@ifclassloaded { #1 }
+ {
+ \__scrlfile_if_loading:nTF { #1.\@clsextension }
+ { \prg_return_false: }
+ { \prg_return_true: }
+ }
+ {
+ \prg_return_false:
+ }
+ }
+\prg_new_protected_conditional:Npnn \scrlfile_if_package_loaded:n #1 { T, F, TF }
+ {
+ \@ifpackageloaded { #1 }
+ {
+ \__scrlfile_if_loading:nTF { #1.\@pkgextension }
+ { \prg_return_false: }
+ { \prg_return_true: }
+ }
+ {
+ \prg_return_false:
+ }
+ }
+% \end{macrocode}
+% \end{function}
+%
+% \begin{macro}{\AfterClass,\AfterPackage}
+% With version 3.32 these do not support plus or exclamation mark variants,
+% but only the normal and the star variants. Instead of the plus or
+% exclamation mark variants users should use the star variant of
+% \cs{AfterAtEndOfClass} and \cs{AfterAtEndOfPackage}. The commands use the
+% \texttt{file/after} hook, because the user manual declares, that \meta{code}
+% is used before the code of \cs{AtEndOfClass} or \cs{AtEndOfPackage}.
+% \begin{macrocode}
+\NewDocumentCommand \scrlfile@AfterClass { s m o +m }
+ {
+ \IfBooleanTF { #1 }
+ {
+ \@ifclassloaded{ #2 }
+ { #4 }
+ {
+ \hook_gput_code:nnn
+ { file / after / #2.\@clsextension }
+ { #3 }
+ { #4 }
+ }
+ }
+ {
+ \hook_gput_code:nnn { file / after / #2.\@clsextension } { #3 } { #4 }
+ }
+ }
+\NewDocumentCommand \AfterClass { } { \scrlfile@AfterClass }
+\NewDocumentCommand \scrlfile@AfterPackage { s m o +m }
+ {
+ \IfBooleanTF { #1 }
+ {
+ \@ifpackageloaded{ #2 }
+ { #4 }
+ {
+ \hook_gput_code:nnn
+ { file / after / #2.\@pkgextension }
+ { #3 }
+ { #4 }
+ }
+ }
+ {
+ \hook_gput_code:nnn { file / after / #2.\@pkgextension } { #3 } { #4 }
+ }
+ }
+\NewDocumentCommand \AfterPackage { } { \scrlfile@AfterPackage }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{File Substitution}
+%
+% With new file hooks the substitutions are so easy we even do not need
+% \LaTeX3 syntax to implement them.
+%
+% \begin{macro}{\ReplaceInput}
+% This is only the simplest wrapper to \cs{declare@file@substitution}.
+% \begin{macrocode}
+\NewDocumentCommand{\ReplaceInput}{}{\declare@file@substitution}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ReplaceClass}
+% \begin{macro}{\ReplacePackage}
+% These are also wrappers to \cs{declare@file@substitution}. But in this case
+% we also have to add the extension.
+% \begin{macrocode}
+\NewDocumentCommand\ReplaceClass{mm}{%
+ \declare@file@substitution{#1.\@clsextension}{#2.\@clsextension}%
+}
+\NewDocumentCommand\ReplacePackage{mm}{%
+ \declare@file@substitution{#1.\@pkgextension}{#2.\@pkgextension}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\UnReplaceInput}
+% This is the simplest wrapper to \cs{undeclare@file@substitution}.
+% \begin{macrocode}
+\NewDocumentCommand{\UnReplaceInput}{}{\undeclare@file@substitution}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\UnReplaceClass}
+% \begin{macro}{\UnReplacePackage}
+% Also very simple but again we have to add the extension.
+% \begin{macrocode}
+\NewDocumentCommand\UnReplaceClass{m}{%
+ \undeclare@file@substitution{#1.\@clsextension}%
+}
+\NewDocumentCommand\UnReplacePackage{mm}{%
+ \undeclare@file@substitution{#1.\@pkgextension}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Prevent Package from Loading}
+%
+% To store and reset the hole list of prevents we use a comma separated
+% list. So we need again use \LaTeX3.
+%
+% \begin{variable}[added = 2020-09-02]{\g__scrlfile_prevents_clist}
+% This local variable stores the list of files, that should be prevented from
+% loading. It is needed to stay compatible with old \file{scrlfile}. Without
+% this compatibility purpose we would be able to use simple wrappers to
+% \cs{disable@package@load} and \cs{reenable@package@load}.
+% \begin{macrocode}
+\clist_new:N \g__scrlfile_prevent_clist
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\PreventPackageFromLoading}
+% This is more than a wrapper to \cs{disable@package@load} because we have to
+% manage an internal list and it is documented, that the re-enabling does not
+% undefine the \meta{alternate-code} setting but only disables it. So we have
+% to extra store it. Note: Local loading of packages does not make sense, so
+% local changes of the prevent list also does not make sense. Therefore this
+% is a global acting command!
+% \begin{macrocode}
+\NewDocumentCommand \PreventPackageFromLoading { s +o m }
+ {
+ \clist_set:Nx \l__scrlfile_package_clist { #3 }
+ \clist_map_inline:Nn \l__scrlfile_package_clist
+ {
+ \@ifpackageloaded { ##1 }
+ {
+ \IfBooleanTF { #1 } { \msg_info:nnn } { \msg_warning:nnn }
+ { scrlfile } { no-prevent-for-already-loaded } { ##1 }
+ }
+ {
+ \clist_if_in:NnF \g__scrlfile_prevent_clist { ##1 }
+ { \clist_gput_right:Nn \g__scrlfile_prevent_clist { ##1 } }
+ \tl_if_exist:cF { g__scrlfile_exclude_package_##1_tl }
+ {
+ \tl_new:c { g__scrlfile_exclude_package_##1_tl }
+ }
+ \IfValueT { #2 }
+ {
+ \tl_gput_right:cn { g__scrlfile_exclude_package_##1_tl } { #2 }
+ }
+ \disable@package@load { ##1 }
+ { \tl_use:c { g__scrlfile_exclude_package_##1_tl } }
+ }
+ }
+ \clist_clear:N \l__scrlfile_package_clist
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\l__scrlfile_package_clist}
+% One local variable is used to process the \meta{package-list} argument of
+% \cs{PreventPackageFromLoading}.
+% \begin{macrocode}
+\clist_new:N \l__scrlfile_package_clist
+% \end{macrocode}
+% \end{macro}
+%
+% And here comes the message, that could be used either as a warning or as an
+% info.
+% \begin{macrocode}
+\msg_new:nnn { scrlfile } { no-prevent-for-already-loaded }
+ {
+ Cannot~prevent~package~`#1'~from~being~loaded,~
+ because~it~has~been~loaded~already~before~line~\msg_line_number:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\StorePreventPackageFromLoading}
+% This simply copies the internal \texttt{clist} to a macro.
+% \begin{macrocode}
+\NewDocumentCommand \StorePreventPackageFromLoading { m }
+ { \edef #1 { \clist_use:Nn \g__scrlfile_prevent_clist { , } } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ResetPreventPackageFromLoading}
+% Map the internal list to a function that re-enables the package. At the end
+% the internal list is cleared.
+% \begin{macrocode}
+\NewDocumentCommand \ResetPreventPackageFromLoading {}
+ {
+ \clist_map_function:NN \g__scrlfile_prevent_clist \reenable@package@load
+ \clist_gclear:N \g__scrlfile_prevent_clist
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\UnPreventPackageFromLoading}
+% Here again the argument is a \meta{package-list} not only one
+% \meta{package}. So we have to build a local \texttt{clist} and walk through
+% it.
+% \begin{macrocode}
+\NewDocumentCommand \UnPreventPackageFromLoading { s m }
+ {
+ \clist_set:Nx \l__scrlfile_package_clist { #2 }
+ \clist_map_inline:Nn \l__scrlfile_package_clist
+ {
+ \clist_if_in:NnT \g__scrlfile_prevent_clist { ##1 }
+ {
+ \clist_gremove_all:Nn \g__scrlfile_prevent_clist { ##1 }
+ \reenable@package@load { ##1 }
+ \IfBooleanT { #1 }
+ { \cs_undefine:c { g__scrlfile_exclude_package_##1_tl } }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Extra Document Hooks}
+%
+% \begin{macro}{\BeforeClosingMainAux}
+% \changes{v3.32}{2020/09/10}{optional argument added}
+% Here we cannot simply wrap this to the hook
+% \texttt{enddocument/afterlastpage}, because it is documented, that inside
+% the \meta{code} \cs{protected@write} is replaced by
+% \cs{immediate@protected@write}. So we have to take extra care to it.
+% \begin{macrocode}
+\NewDocumentCommand \BeforeClosingMainAux { o m }
+ {
+ \hook_gput_code:nnn { enddocument / afterlastpage } { #1 }
+ {
+ \debug_suspend:
+ \RenewDocumentCommand \BeforeClosingMainAux { m } { ##1 }
+ \cs_set_eq:NN \__scrlfile_protected@write:Nnn \protected@write
+ \cs_set_eq:NN \protected@write \protected@immediate@write
+ #2
+ \cs_set_eq:NN \protected@write \__scrlfile_protected@write:Nnn
+ \debug_resume:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AfterReadingMainAux}
+% \changes{v3.32}{2020/09/10}{optional argument added}
+% Here we the exact same problem as with \cs{BeforeClosingMainAux}.
+% \begin{macrocode}
+\NewDocumentCommand \AfterReadingMainAux { o m }
+ {
+ \hook_gput_code:nnn { enddocument / afteraux } { #1 }
+ {
+ \debug_suspend:
+ \RenewDocumentCommand \AfterReadingMainAux { m } { ##1 }
+ \cs_set_eq:NN \__scrlfile_protected@write:Nnn \protected@write
+ \cs_set_eq:NN \protected@write \protected@immediate@write
+ #2
+ \cs_set_eq:NN \protected@write \__scrlfile_protected@write:Nnn
+ \debug_resume:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% \subsection{Kernel Extensions not Using \LaTeX3}
+%
+% \begin{macro}{\protected@immediate@write}
+% Like \LaTeX{} kernel's |\protected@write| but using |\immediate\write|. In
+% this case it is even not a good idea to protect |\thepage|!
+% \begin{macrocode}
+\ProvideDocumentCommand\protected@immediate@write{m+m+m}
+ {%
+ \begingroup
+ #2%
+ \let\protect\@unexpandable@protect
+ \edef\reserved@a{\immediate\write#1{#3}}%
+ \reserved@a
+ \endgroup
+ \if@nobreak\ifvmode\nobreak\fi\fi
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The \KOMAScript{} Logo}
+%
+% Last but not least this is a \KOMAScript{} package, so we also define the
+% \KOMAScript{} logo:
+% \begin{macrocode}
+\RequirePackage{scrlogo}
+% \end{macrocode}
+%
+% \Finale
+%
+% \endinput
+% Local Variables:
+% mode: doctex
+% TeX-master: t
+% End:
diff --git a/Master/texmf-dist/source/latex/koma-script/scrlfile-patcholdlatex.dtx b/Master/texmf-dist/source/latex/koma-script/scrlfile-patcholdlatex.dtx
new file mode 100644
index 00000000000..070d28a5dd3
--- /dev/null
+++ b/Master/texmf-dist/source/latex/koma-script/scrlfile-patcholdlatex.dtx
@@ -0,0 +1,1269 @@
+% \iffalse^^A meta-comment
+% ======================================================================
+% scrlfile-patcholdlatex.dtx
+% Copyright (c) Markus Kohm, 2002-2020
+%
+% This file is part of the work `scrlfile' which is part of the LaTeX2e
+% KOMA-Script bundle.
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c of the license.
+% 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 and of this work.
+%
+% This work has the LPPL maintenance status "author-maintained".
+%
+% The Current Maintainer and author of this work is Markus Kohm.
+%
+% This work consists of all files listed in manifest.txt.
+% ----------------------------------------------------------------------
+% scrlfile-patcholdlatex.dtx
+% Copyright (c) Markus Kohm, 2002-2020
+%
+% Diese Datei ist Teil des Werks `scrlfile', das wiederum Teil des
+% LaTeX2e KOMA-Script Pakets ist.
+%
+% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
+% Version 1.3c, verteilt und/oder veraendert werden.
+% Die neuste Version dieser Lizenz ist
+% http://www.latex-project.org/lppl.txt
+% und Version 1.3c ist Teil aller Verteilungen von LaTeX
+% Version 2005/12/01 oder spaeter und dieses Werks.
+%
+% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained"
+% (allein durch den Autor verwaltet).
+%
+% Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm.
+%
+% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
+% ======================================================================
+% \fi^^A meta-comment
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+% \iffalse
+%%% From File: $Id: scrlfile-patcholdlatex.dtx 3527 2020-09-11 09:44:32Z kohm $
+%<*dtx>
+\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
+\begingroup
+ \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
+ \filedate$Date: 2020-09-11 11:44:32 +0200 (Fri, 11 Sep 2020) $
+ \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
+ \filerevision$Revision: 3527 $
+ \edef\reserved@a{%
+ \noexpand\endgroup
+ \noexpand\ProvidesFile{scrlfile-patcholdlatex.dtx}%
+ [\filedate\space\filerevision\space
+ KOMA-Script package source
+ }%
+\reserved@a
+%</dtx>
+%<package>\ProvidesPackage{scrlfile-patcholdlatex}[%
+%!KOMAScriptVersion
+%<package> package
+ (patching old LaTeX kernels)]
+%<*dtx>
+\ifx\documentclass\undefined
+ \input scrdocstrip.tex
+ \@@input scrkernel-version.dtx
+ \@@input scrstrip.inc
+ \KOMAdefVariable{COPYRIGHTFROM}{2002}
+ \generate{\usepreamble\defaultpreamble
+ \file{scrlfile-patcholdlatex.sty}{%
+ \from{scrlfile-patcholdlatex.dtx}{package}%
+ }%
+ }
+ \@@input scrstrop.inc
+\else
+ \let\endbatchfile\relax
+\fi
+\endbatchfile
+\documentclass[parskip=half-]{scrdoc}
+\usepackage[main=english]{babel}
+\CodelineIndex
+\RecordChanges
+\GetFileInfo{scrlfile-patcholdlatex.dtx}
+\title{\KOMAScript{} \partname\ \texttt{\filename}%
+ \thanks{This file is revision \fileversion\ of file \texttt{\filename}.}}
+\date{\filedate}
+\author{Markus Kohm\thanks{mailto:komascript@gmx.info}}
+
+\begin{document}
+ \maketitle
+ \begin{abstract}
+ This package provides hooks before and after loading files, packages or
+ classes. It also provides a hook after the last \cs{clearpage} of the
+ document. It allowes to replace files, packages and classes by other
+ files, packages and classes. It is inteded to be used by package and class
+ authors but may also be used by \LaTeX{} users.
+ \end{abstract}
+
+ \DocInput{\filename}
+\end{document}
+%</dtx>
+% \fi^^A meta-comment
+%
+% \changes{v2.95}{2002/06/11}{First version split from hugh scrclass.dtx}
+% \changes{v3.24}{2017/05/06}{standalone manual removed}
+% \changes{v3.32}{2020/09/02}{new (sub)-package}
+%
+% \section{The User Manual of \textsf{scrlfile-patcholdlatex}}
+%
+% \textsf{scrlfile-patcholdlatex} implements the part of \textsf{scrlfile}
+% that patches old \LaTeX{} kernels.
+%
+% There isn't any user manual for the user level \LaTeXe{} commands in this
+% file. Please see the manual of \textsf{scrlfile} for more information about
+% \textsf{scrlfile-patcholdlatex}.
+%
+% \StopEventually{\PrintIndex\PrintChanges}
+%
+% \section{Implementation of \textsf{scrlfile-patcholdlatex}}
+%
+%
+% \subsection{Patching \LaTeX{} Kernel Macros}
+%
+% \begin{macro}{\InputIfFileExists}
+% \changes{v2.96}{2006/07/19}{replacement code added}%^^A
+% \LaTeX{} uses this macro for loading files with
+% \cs{input}\marg{filename}, \cs{include}, \cs{LoadClass},
+% \cs{LoadClassWithOptions}, \cs{documentclass}, \cs{documentstyle},
+% \cs{RequirePackage}, \cs{usepackage}. Only
+% \cs{input}~\meta{filename} loads \meta{filename} without using
+% \cs{InputIfFileExists}.
+%
+% Because of this, it's very easy to add stuff before and after
+% loading a file. We simply change this macro and add to
+% macros\,---\,one before loading the file and one after loading the
+% file. But before we redefine the macro, we test, if the macro was
+% defined like we expected. \LaTeX{} will warn, if not.
+% \changes{v3.27}{2019/10/06}{\LaTeX{} 2019-10-01 changed the definition}%^^A
+%
+% \changes{v3.28}{2019/11/21}{support for \textsf{memoir}}%^^A
+% With \textsf{memoir} their is a special case. It also redefines
+% \cs{InputIfFileExists}. As shown in the source of the class it does so
+% because \textsf{scrlfile} does it. However it does it not compatible with
+% \textsf{scrlfile} and it does not emulate \textsf{scrlfile} as it do for
+% other packages. So if you try to use \textsf{scrlfile} with memoir,
+% \textsf{scrbase} has to take care to \textsf{memoir}. And in oposit to
+% \textsf{scrlfile} \textsf{memoir} does not always fix the argument order bug
+% of \LaTeX{} but do so only for the implementation of \LaTeX{} 2019-10-01.
+% So in case of \textsf{memoir} we just patch every version of it without
+% testing.
+% \begin{macrocode}
+\@ifclassloaded{memoir}{%
+ \PackageInfo{scrlfile}{class `memoir' detected.\MessageBreak
+ Using a compatible redefinition of \string\InputIfFileExists,\MessageBreak
+ but always robust and with the fix of the\MessageBreak
+ argument order bug even for old versions of the\MessageBreak
+ LaTeX kernel%
+ }%
+}{%
+ \long\def\reserved@a#1#2{%
+ \IfFileExists{#1}%
+ {#2\@addtofilelist{#1}\@@input \@filef@und}}%
+ \ifx\reserved@a\InputIfFileExists\else
+ \expandafter\CheckCommand\expandafter*\expandafter\InputIfFileExists
+ \expandafter{%
+ \expandafter\protect\csname InputIfFileExists \endcsname
+ }%
+ \expandafter\CheckCommand \csname InputIfFileExists \endcsname[2]{%
+ \IfFileExists {#1}{%
+ \expandafter \@swaptwoargs \expandafter {\@filef@und }%
+ {#2\@addtofilelist {#1}\@@input }%
+ }%
+ }%
+ \fi
+}
+% \end{macrocode}
+% Now we can redefine the macro like described above:
+% \begin{macrocode}
+\expandafter\renewcommand\expandafter*\expandafter\InputIfFileExists
+\expandafter{\expandafter
+ \protect\csname InputIfFileExists \endcsname}%
+\expandafter\long\expandafter\def\csname InputIfFileExists \endcsname#1#2{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname #1-@alias\endcsname\relax
+ \expandafter\@secondoftwo
+ \else
+ \scr@replacefile@msg{\csname #1-@alias\endcsname}{#1}%
+ \expandafter\@firstoftwo
+ \fi
+ {%
+ \expandafter\InputIfFileExists\expandafter{\csname
+ #1-@alias\endcsname}{#2}%
+ }%
+ {\IfFileExists{#1}{%
+ \expandafter\scr@input@withhook\expandafter{\@filef@und}{#1}{#2}%
+ }}%
+}
+% \end{macrocode}
+% \begin{macro}{\scr@input@withhook}
+% \changes{v3.27}{2019/03/28}{new (internal)}%^^A
+% \changes{v3.28}{2019/11/21}{support for \textsf{memoir}}%^^A
+% We need a new internal, because of expanding \cs{@file@und} before inputting
+% the file.
+% \begin{macrocode}
+\@ifclassloaded{memoir}{%
+ \newcommand{\scr@input@withhook}[3]{%
+ \scr@load@hook{before}{#2}%
+ #3\@addtofilelist{#2}%
+ \@ifundefined{m@matbeginf}{}{\m@matbeginf{#2}}%
+ \@@input #1%
+ \@ifundefined{m@matendf}{}{\m@matendf{#2}}%
+ \@ifundefined{killm@matf}{}{\killm@matf{#2}}%
+ \scr@load@hook{after}{#2}%
+ }%
+}{%
+ \newcommand{\scr@input@withhook}[3]{%
+ \scr@load@hook{before}{#2}%
+ #3\@addtofilelist{#2}%
+ \@@input #1%
+ \scr@load@hook{after}{#2}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@loadwithoptions}
+% \changes{v2.96}{2006/07/19}{new redefinition}
+% \begin{macro}{\scr@loadwithoptions}
+% \changes{v2.96}{2006/07/19}{new helper macro}
+% \begin{macro}{\scr@@loadwithoptions}
+% \changes{v2.97a}{2007/03/07}{new helper macro}
+% \LaTeX{} uses this macro for loading classes and packages using
+% \cs{LoadClassWithOptions} or \cs{RequirePackageWithOptions}. We simply say
+% now: if the class or package should be replaced by another, try it again
+% with the replacement name. The stack is used. This will result in an
+% error if the replacements are nested too deep. This should be, because it
+% will also result in an error using ring replacements.
+% \begin{macrocode}
+\newcommand*{\scr@@loadwithoptions}{}
+\newcommand*{\scr@loadwithoptions}{}
+\let\scr@loadwithoptions\@loadwithoptions
+\renewcommand*{\@loadwithoptions}[3]{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname #3.#1-@aliasname\endcsname\relax
+ \def\scr@@loadwithoptions{\scr@loadwithoptions{#1}{#2}{#3}}%
+ \else
+ \scr@replacefile@msg{\csname #3.#1-@aliasname\endcsname.#1}{#3.#1}%
+ \def\scr@@loadwithoptions{%
+ \@loadwithoptions{#1}{#2}{\csname #3.#1-@aliasname\endcsname}%
+ }%
+ \fi
+ \scr@@loadwithoptions
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@onefilewithoption}
+% \changes{v2.96}{2006/07/19}{new redefinition}
+% \begin{macro}{\scr@onefilewithoption}
+% \changes{v2.96}{2006/07/19}{new helper macro}
+% \begin{macro}{\scr@@onefilewithoption}
+% \changes{v2.98}{2007/12/18}{new helper macro}
+% \LaTeX{} uses this macro for loading classes and packages using
+% \cs{LoadClass}, \cs{documentclass}, \cs{RequirePackage}, and
+% \cs{usepackage}. We simply say now: if the class or package should be
+% replaced by another, try it again with the replacement name. The stack is
+% used. This will result in an error if the replacements are nested too
+% deep. This should be, because it will also result in an error using ring
+% replacements.
+% \begin{macrocode}
+\newcommand*{\scr@onefilewithoptions}{}
+\let\scr@onefilewithoptions\@onefilewithoptions
+\def\@onefilewithoptions#1[#2][#3]#4{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname #1.#4-@aliasname\endcsname\relax
+% \end{macrocode}
+% Do this ridiculous definition and call outside of \cs{ifx}\dots\cs{fi}
+% because of some errornous packages like some versions of
+% \textsf{breakurl}. This does not avoid an error, but the message about
+% unclosed \cs{if} will be outside of \textsf{scrlfile}.
+% \begin{macrocode}
+ \def\scr@@onefilewithoptions{\scr@onefilewithoptions{#1}}%
+ \else
+ \scr@replacefile@msg{\csname #1.#4-@aliasname\endcsname.#4}{#1.#4}%
+ \edef\scr@@onefilewithoptions{%
+ \noexpand\@onefilewithoptions{\csname #1.#4-@aliasname\endcsname}}%
+ \fi
+ \scr@@onefilewithoptions[{#2}][{#3}]{#4}%
+ \scr@load@hook{lateafter}{#1.#4}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\scr@replacefile@msg}
+% \changes{v2.96}{2006/07/19}{new helper command}
+% \changes{v2.98}{2007/12/18}{spellfix}
+% Last but not least \textsf{scrlfile} will write a message to the log file at
+% every replacement.
+% \begin{macrocode}
+\newcommand*{\scr@replacefile@msg}[2]{%
+ \PackageInfo{scrlfile}{inputing `#1' instead of `#2'}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\scr@load@hook}
+% \changes{v3.27a}{2019/10/16}{workaround for strange handling of
+% \cs{AtEndOfPackage} hook in \cs{@onefilewithoptions}}%^^A
+% This macro simply calls a load-file-hook, either the \emph{before}
+% or the \emph{after} one, if the hook exists. After calling the hook
+% it will be deleted. First argument is the type of hook
+% (\meta{before} or \meta{after}), second argument is a filename.
+% \begin{macrocode}
+\newcommand*{\scr@load@hook}[2]{%
+% \end{macrocode}
+% \begin{macro}{\scrlfile@cmp@hook}
+% \changes{v3.27a}{2019/10/23}{local macros renamed}%^^A
+% \begin{macro}{\scrlfile@hookname}
+% \changes{v3.27a}{2019/10/23}{local macros renamed}%^^A
+% \changes{v3.29}{2020/06/01}{do the class and package load hooks only in the
+% document preamble}%^^A --> https://komascript.de/node/2274
+% Workaround for strange handling of the \cs{AtEndOfPackage} hook in
+% \cs{@onefilewithoptions} (becomes \cs{@empty}, if the package already has
+% been loaded and is not loaded again). This workaround is not nice but
+% smart. Before loading a file it defines a marker macro and undefines it
+% later. To decide whether to define or remove the marker, two local macros
+% are used \cs{scrlfile@hookname} and \cs{scrlfile@cmp@hook}. The first has
+% the name of the current hook from the first argument. The other is a compare
+% string. The first one is also valid while processing the hook, but only in
+% the document preamble. The names are very unique, so we do not reserve them
+% using \cs{newcommand} outside. The name of the marker is less
+% unique. Nevertheless it is not reserved.
+% Note: For recursive loading of files this does not work. But this also does
+% not matter, because it is needed only for packages and classes, which are
+% never loaded recursive. For the same reason from \KOMAScript{} 3.29 this is
+% only used inside the document preamble. After the document preamble it can
+% be dangerous, e.g., inside a |tabular| or |array|.
+% \begin{macrocode}
+ \ifx\@begindocumenthook\@undefined\else
+ \edef\scrlfile@hookname{#1}%
+ \def\scrlfile@cmp@hook{before}%
+ \ifx\scrlfile@hookname\scrlfile@cmp@hook
+ \expandafter\def\csname #2-l@ading\endcsname{#2}%
+ \fi
+ \let\scrlfile@cmp@hook\@undefined
+ \fi
+ \@ifundefined{#2-@#1}{}{%
+ \@nameuse{#2-@#1}%
+ \expandafter\let\csname #2-@#1\endcsname\relax
+ }%
+% \end{macrocode}
+% The hook could destroy \cs{scrlfile@hookname} so define it again:
+% \begin{macrocode}
+ \ifx\@begindocumenthook\@undefined\else
+ \edef\scrlfile@hookname{#1}%
+ \def\scrlfile@cmp@hook{after}%
+ \ifx\scrlfile@hookname\scrlfile@cmp@hook
+ \expandafter\let\csname #2-l@ading\endcsname\@undefined
+ \fi
+ \let\scrlfile@cmp@hook\@undefined
+ \let\scrlfile@hookname\@undefined
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\scr@set@load@hook}
+% This command adds stuff to a load-file-hook, either the
+% \emph{before} or the \emph{after} one. First argument is the type of
+% hook (\meta{before} or \meta{after}), second is a filename. There's
+% a third argument not parsed by the macro itself but
+% \cs{g@addto@macro}. This third argument is the stuff, which will be
+% added to the hook. Because of using \cs{g@addto@macro} the hook must
+% be defined. So we define it, if it isn't.
+% TODO: Handling/ignoring an optional argument to make it more compatible with
+% \LaTeX's new \cs{AddToHook}.
+% \begin{macrocode}
+\newcommand*{\scr@set@load@hook}[2]{%
+ \@ifundefined{#2-@#1}{\@namedef{#2-@#1}{}}{}%
+ \expandafter\g@addto@macro\csname #2-@#1\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Before and After Commands}
+%
+% \begin{macro}{\BeforeFile}
+% \begin{macro}{\AfterFile}
+% Just add code to the \emph{before} or \emph{after} hook of a file. The
+% arguments are:
+% \begin{description}
+% \item[\meta{file name}:] mandatory argument with the file name as given by
+% \cs{InputIfFileExists}.
+% \item[\meta{code}:] this argument is not processed by \cs{BeforeFile} or
+% \cs{AfterFile} but the internal \cs{scr@set@load@hook}. It is the code
+% that should be added to either the \emph{before} or the \emph{after} hook.
+% \end{description}
+% \begin{macrocode}
+\newcommand*{\BeforeFile}{\scr@set@load@hook{before}}
+\newcommand*{\AfterFile}{\scr@set@load@hook{after}}
+% \end{macrocode}
+% \end{macro}%^^A \AfterFile
+% \end{macro}%^^A \BeforeFile
+%
+% \begin{macro}{\BeforeClass}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}%^^A
+% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
+% ersetzt}%^^A
+% This is quite simple. It only has to add code to the \emph{before} hook
+% already known by \cs{BeforeFile}. The arguments are:
+% \begin{description}
+% \item[\meta{package name}:] mandatory argument.
+% \item[\meta{code}:] this argument is processed not by \cs{BeforeClass} but
+% by the internal \cs{scr@set@load@hook} (see above), that will add the code
+% to the \emph{before} hook of file \meta{code}\texttt{.cls} (or whatever the
+% package extension is).
+% \end{description}
+% \begin{macrocode}
+\newcommand*{\BeforeClass}[1]{%
+ \scr@set@load@hook{before}{#1.\@clsextension}%
+}
+% \end{macrocode}
+% \end{macro}%^^A \BeforeClass
+%
+% \begin{macro}{\AfterClass}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}
+% \changes{v3.20}{2016/04/12}{\cs{@ifstar} replaced by \cs{kernel@ifstar}}
+% \changes{v3.32}{2020/09/02}{plus and exclamation mark variants removed}
+% \begin{macro}{\AfterAtEndOfClass}
+% \changes{v3.32}{2020/09/02}{star variant replaces the exclamation mark
+% variant of \cs{AfterClass}}
+% These are more complicated. There are four forms:
+% \begin{description}
+% \item[\cs{AfterClass}] corresponds to \cs{AfterFile}. So the code will be
+% added to the usual \emph{after} hook and the code is exexuted before code
+% added by the class itself using \cs{AtEndOfClass}. Argument procession
+% will be done by \cs{@AfterClass}.
+% \item[\cs{AfterAtEndOfClass}] This uses the \emph{lateafter} hook, which
+% is executed after the class has been loaded completely inclusive the
+% execution of \cs{AtEndOfClass} code. However, the code will never be
+% executed, if the class will not be loaded (again). But it does nothing,
+% if the class has already been loaded. The arguments are:
+% \begin{description}
+% \item[\meta{class name}] mandatory argument
+% \item[\meta{code}:] this argument is processed not by \cs{BeforeClass}
+% but by the internal \cs{scr@set@load@hook} (see above), that will add
+% the code to the \emph{lateafter} hook of file \meta{code}\texttt{.cls}
+% (or whatever the class extension is), or by \cs{@gobble}.
+% \end{description}
+% \item[\cs{AfterClass*}] like \cs{AfterClass}, but if loading of the
+% class has already began, the code will be executed immediately. So, if
+% the command is used inside the class it is simply
+% \cs{@firstofone}. Argument procession will be done by \cs{@sAfterClass}.
+% \item[\cs{AfterAtEndOfClass*}] like \cs{AfterClass*}, but the code will be
+% executed immediately only if the class already has been loaded
+% completely. Inside \cs{AtEndOfClass} the code is executed after every all
+% the \cs{AtEndOfClass} code. Argument procession will be done by
+% \cs{@xAfterClass}.
+% \end{description}
+% \begin{macrocode}
+\newcommand*{\scrlfile@AfterClass}{%
+ \kernel@ifstar \@sAfterClass\@AfterClass
+}
+\newcommand*{\AfterClass}{\scrlfile@AfterClass}
+% \end{macrocode}
+% \begin{macro}{\@AfterClass}
+% \cs{AfterClass}\marg{class name}\marg{code}.
+% It uses \cs{scr@set@load@hook} to add \meta{code} to the
+% \emph{after} hook. The second argument will be processed by
+% \cs{scr@set@load@hook}.
+% \begin{macrocode}
+\newcommand*{\@AfterClass}[1]{%
+ \scr@set@load@hook{after}{#1.\@clsextension}%
+}
+% \end{macrocode}
+% \end{macro}%^^A \@AfterClass
+% \begin{macro}{\@sAfterClass}
+% \changes{v3.27a}{2019/10/16}{group removed}%^^A
+% This is the internal implementation of:
+% \cs{AfterClass*}\marg{class name}\marg{code}.
+% It tests, whether or not \LaTeX{} thinks that the class
+% has already been loaded, but this only means whether or not the class
+% loading has already been started. If so, it immediately executes the next
+% argument. If not, is uses \cs{@AfterClass} to execute the \meta{code}
+% after loading the class.
+% \begin{macrocode}
+\newcommand*{\@sAfterClass}[1]{%
+ \@ifclassloaded{#1}{%
+ \@secondoftwo
+ }{%
+ \@AfterClass
+ }%
+ {#1}%
+}
+% \end{macrocode}
+% \end{macro}%^^A \@sAfterClass
+% \begin{macrocode}
+\newcommand*{\AfterAtEndOfClass}{%
+ \kernel@ifstar \@sAfterAtEndOfClass\@AfterAtEndOfClass
+}
+% \end{macrocode}
+% \begin{macro}{\@AfterAtEndOfClass}
+% \changes{v3.32}{2020/09/02}{new (internal)}
+% Note that \cs{AfterAtEndOfClass} executed the \meta{code} after each try
+% to load a class, even if the class has already been loaded and you try
+% to load it again.
+% \begin{macrocode}
+\newcommand*{\@AfterAtEndOfClass}[1]{%
+ \scr@set@load@hook{lateafter}{#1.\@clsextension}%
+}
+% \end{macrocode}
+% \begin{macro}{\@sAfterAtEndOfClass}
+% \changes{v3.09}{2011/03/09}{new (internal)}%^^A
+% \changes{v3.27}{2019/08/26}{using inside class fixed}%^^A
+% \changes{v3.27a}{2019/10/15}{renamed from \cs{@@@AfterClass}}%^^A
+% \changes{v3.27a}{2019/10/16}{usage of \emph{l@ading} marker}%^^A
+% \changes{v3.27a}{2019/10/16}{group removed}%^^A
+% \changes{v3.32}{2020/09/02}{renamed from \cs{@xAfterClass}}
+% This is the internal implementation of:
+% \cs{AfterClass!}\marg{class name}\marg{code}. Note, that the exclamation
+% mark has not already read. So the arguments are:
+% \begin{description}
+% \item[\texttt{!}:] static exclamation mark, to be ignored.
+% \item[\meta{class name}] mandatory argument
+% \item[\meta{code}:] this argument is processed not by \cs{BeforeClass} but
+% by the internal \cs{@sAfterClass} or \cs{@AfterClass} (see above).
+% \end{description}
+% There are two differences to \cs{@pAfterClass}:
+% \begin{enumerate}
+% \item In case of \cs{\meta{class name}.cls-l@ading} is defined (and not
+% \cs{relax}), while loading a class, it used \cs{AfterAtEndOfClass}
+% instead of \cs{AfterClass} to add \meta{code} to the \emph{lateafter}
+% hook instead of the \emph{after} hook.
+% \item In case of \cs{\meta{class name}.cls-l@ading} is undefined (or
+% \cs{relax}) it also has to test, whether or not the class has already
+% been loaded. If so, it uses \cs{@sAfterClass} to execute the \meta{code}
+% immediately, otherwise it uses \cs{AfterAtEndOfClass} to add the
+% \meta{code} to the \emph{lateafter} hook.
+% \end{enumerate}
+% So it is more like (the not existing) \cs{AfterAtEndOfClass+} than
+% \cs{AfterAtEndOfClass*}.
+% \begin{macrocode}
+\newcommand*{\@sAfterAtEndOfClass}[1]{%
+ \@ifundefined{#1.\@clsextension-l@ading}{%
+ \@ifclassloaded{#1}{%
+ \@secondoftwo
+ }{%
+ \@AfterAtEndOfClass
+ }%
+ }{%
+ \@AfterAtEndOfClass
+ }%
+ {#1}%
+}
+% \end{macrocode}
+% \end{macro}%^^A \@sAfterAtEndOfClass
+% \end{macro}%^^A \AfterAtEndOfClass
+% \end{macro}%^^A \AfterClass
+%
+% \begin{macro}{\BeforePackage}
+% This is quite simple. It only has to add code to the \emph{before} hook
+% already known by \cs{BeforeFile}. The arguments are:
+% \begin{description}
+% \item[\meta{package name}:] mandatory argument.
+% \item[\meta{code}:] this argument is processed not by \cs{BeforePackage} but
+% by the internal \cs{scr@set@load@hook} (see above), that will add the code
+% to the \emph{before} hook of file \meta{code}\texttt{.sty} (or whatever the
+% package extension is).
+% \end{description}
+% \begin{macrocode}
+\newcommand*{\BeforePackage}[1]{%
+ \scr@set@load@hook{before}{#1.\@pkgextension}%
+}
+% \end{macrocode}
+% \end{macro}%^^A \BeforePackage
+%
+% \begin{macro}{\AfterPackage}
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}%^^A
+% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
+% ersetzt}%^^A
+% \begin{macro}{\AfterAtEndOfPackage}
+% These are more complicated. There are four forms:
+% \begin{description}
+% \item[\cs{AfterPackage}] corresponds to \cs{AfterFile}. So the code will be
+% added to the usual \emph{after} hook and the code is exexuted before code
+% added by the package itself using \cs{AtEndOfPackage}. Argument procession
+% will be done by \cs{@AfterPackage}.
+% \item[\cs{AfterAtEndOfPackage}] This uses the \emph{lateafter} hook, which
+% is executed after the package has been loaded completely inclusive the
+% execution of \cs{AtEndOfPackage} code. However, the code will never be
+% executed, if the package will not be loaded (again). But it does nothing,
+% if the package has already been loaded. The arguments are:
+% \begin{description}
+% \item[\meta{package name}] mandatory argument
+% \item[\meta{code}:] this argument is processed not by \cs{BeforePackage}
+% but by the internal \cs{scr@set@loaf@hook} (see above), that will add
+% the code to the \emph{lateafter} hook of file \meta{code}\texttt{.sty}
+% (or whatever the package extension is), or by \cs{@gobble}.
+% \end{description}
+% \item[\cs{AfterPackage*}] like \cs{AfterPackage}, but if loading of the
+% package has already began, the code will be executed immediately. So, if
+% the command is used inside the package it is simply
+% \cs{@firstofone}..
+% \item[\cs{AfterAtEndOfPackage*}] like \cs{AfterPackage*}, but the code will
+% be executed immediately only if the package already has been loaded
+% completely. Inside \cs{AtEndOfPackage} the code is executed after every
+% all the \cs{AtEndOfPackage} code.
+% \end{description}
+% \begin{macrocode}
+\newcommand*{\scrlfile@AfterPackage}{%
+ \kernel@ifstar \@sAfterPackage\@AfterPackage
+}
+\newcommand*{\AfterPackage}{\scrlfile@AfterPackage}
+% \end{macrocode}
+% \begin{macro}{\@AfterPackage}
+% This is the internal implementation of:
+% \cs{AfterPackage}\marg{package name}\marg{code}.
+% It uses \cs{scr@set@load@hook} to add \meta{code} to the
+% \emph{after} hook. The second argument will be processed by
+% \cs{scr@set@load@hook}.
+% \begin{macrocode}
+\newcommand*{\@AfterPackage}[1]{%
+ \scr@set@load@hook{after}{#1.\@pkgextension}%
+}
+% \end{macrocode}
+% \end{macro}%^^A \@AfterPackage
+% \begin{macro}{\@sAfterPackage}
+% \changes{v3.27a}{2019/10/16}{group removed}%^^A
+% This is the internal implementation of:
+% \cs{AfterPackage*}\marg{package name}\marg{code}.
+% It tests, whether or not \LaTeX{} thinks that the package
+% has already been loaded, but this only means whether or not the package
+% loading has already been started. If so, it immediately executes the next
+% argument. If not, is uses \cs{@AfterPackage} to execute the \meta{code}
+% after loading the package.
+% \begin{macrocode}
+\newcommand*{\@sAfterPackage}[1]{%
+ \@ifpackageloaded{#1}{%
+ \@secondoftwo
+ }{%
+ \@AfterPackage
+ }%
+ {#1}%
+}
+% \end{macrocode}
+% \end{macro}%^^A \@sAfterPackage
+% \begin{macrocode}
+\newcommand*{\AfterAtEndOfPackage}{%
+ \kernel@ifstar \@sAfterAtEndOfPackage\@AfterAtEndOfPackage
+}
+% \end{macrocode}
+% \begin{macro}{\@sAfterAtEndOfPackage}
+% \changes{v3.09}{2011/03/09}{new (internal)
+% \changes{v3.27}{2019/08/26}{using inside package fixed}
+% \changes{v3.27a}{2019/10/15}{renamed from \cs{@@@AfterPackage}
+% \changes{v3.27a}{2019/10/16}{usage of \emph{l@ading} marker}
+% \changes{v3.27a}{2019/10/16}{group removed}
+% \changes{v3.32}{2020/09/02}{renamed from \@xAfterPackage}
+% This is the internal implementation of:
+% \cs{AfterAtEndOfPackage*}\marg{package name}\marg{code}.
+% \begin{macrocode}
+\newcommand*{\@sAfterAtEndOfPackage}[1]{%
+ \@ifundefined{#1.\@pkgextension-l@ading}{%
+ \@ifpackageloaded{#1}{%
+ \@secondoftwo
+ }{%
+ \@@AfterAtEndOfPackage
+ }%
+ }{%
+ \@@AfterAtEndOfPackage
+ }%
+ {#1}%
+}
+% \end{macrocode}
+% \end{macro}%^^A \@sAfterAtEndOfPackage
+% \begin{macro}{\@AfterAtEndOfPackage}
+% \changes{v3.32}{2020/09/02}{new (internal)}
+% \begin{macro}{\@@AfterAtEndOfPackage}
+% \changes{v3.27a}{2019/10/15}{new (internal)}
+% \changes{v3.27a}{2019/10/16}{group removed}
+% \changes{v3.32}{2020/09/02}{renamed from \cs{@AfterAtEndOfPackage}}
+% Note that until 3.27a \cs{AfterAtEndOfPackage} executed the \meta{code}
+% after each try to load a package, even if the package has already been
+% loaded and you've try to load it again. Since 3.27a this is the
+% functionality of \cs{@AfterAtEndOfPackage}. \cs{AfterAtEndOfPackage} now
+% does not do anything for already loaded packages or while loading the
+% package.
+% \begin{macrocode}
+\newcommand*{\@AfterAtEndOfPackage}[1]{%
+ \@ifpackageloaded{#1}{%
+ \@ifundefined{#1.\@pkgextension-l@ading}{%
+ \@gobbletwo
+ }{%
+ \@@AfterAtEndOfPackage
+ }%
+ }{%
+ \@@AfterAtEndOfPackage
+ }%
+ {#1}%
+}
+\newcommand*{\@@AfterAtEndOfPackage}[1]{%
+ \scr@set@load@hook{lateafter}{#1.\@pkgextension}%
+}
+% \end{macrocode}
+% \end{macro}%^^A \@@AfterAtEndOfPackage
+% \end{macro}%^^A \@AfterEndOfPackage
+% \end{macro}%^^A \AfterAtEndOfPackage
+% \end{macro}%^^A \AfterPackage
+%
+%
+% \subsection{File Substitution}
+%
+% \begin{macro}{\ReplaceInput}
+% \changes{v2.96}{2006/07/19}{new command}
+% \changes{v3.12}{2013/11/15}{implemented}
+% Defining the replacement by definition of \cs{\#1-@alias}.
+% \begin{macrocode}
+\newcommand*{\ReplaceInput}[2]{%
+ \expandafter\edef\csname #1-@alias\endcsname{#2}%
+}
+% \end{macrocode}
+% \begin{macro}{\ReplaceFile}
+% \changes{v2.96}{2006/07/19}{new command}
+% \changes{v3.12}{2013/11/15}{throw error}
+% Sorry, but I've implemented the wrong command some time ago.
+% \begin{macrocode}
+\newcommand*{\ReplaceFile}{%
+ \PackageError{scrlfile}{%
+ usage of not documented command `\string\ReplaceFile'%
+ }{%
+ Command `\string\ReplaceFile' has been implemented accidentally in
+ KOMA-Script 2.96\MessageBreak
+ and replaced by `\string\ReplaceInput' in KOMA-Script 3.12.\MessageBreak
+ You should replace `\string\ReplaceFile' by `\string\ReplaceInput' to
+ avoid this error\MessageBreak
+ message%
+ }%
+ \ReplaceInput
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\UnReplaceInput}
+% \changes{v3.12}{2013/11/15}{new command}
+% Do not longer replace a file.
+% \begin{macrocode}
+\newcommand*{\UnReplaceInput}[1]{%
+ \ifcsname #1-@alias\endcsname
+ \expandafter\let\csname #1-@alias\endcsname\relax
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ReplacePackage}
+% \changes{v2.96}{2006/07/19}{new command}
+% \begin{macro}{\ReplaceClass}
+% \changes{v2.96}{2006/07/19}{new command}
+% \begin{macro}{\@replacefilewithext}
+% \changes{v2.96}{2006/07/19}{new helper command}
+% \changes{v3.32}{2020/09/09}{works global}
+% Note that replacing a package or class will not replace the input of the
+% file of the package or class but only the input of package or class.
+% \begin{macrocode}
+\newcommand*{\@replacefilewithext}[3]{%
+ \expandafter\xdef\csname #1.#3-@aliasname\endcsname{#2}%
+}
+\newcommand*{\ReplacePackage}[2]{%
+ \@replacefilewithext{#1}{#2}\@pkgextension
+}
+\newcommand*{\ReplaceClass}[2]{%
+ \@replacefilewithext{#1}{#2}\@clsextension
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\UnReplacePackage}
+% \changes{v3.12}{2013/11/15}{new command}
+% \begin{macro}{\UnReplaceClass}
+% \changes{v3.12}{2013/11/15}{new command}
+% \begin{macro}{\@unreplacefilewithext}
+% \changes{v3.12}{2013/11/15}{new helper command}%^^A
+% \changes{v3.32}{2020/09/09}{works global}
+% Do not nolonger replace a class or package.
+% \begin{macrocode}
+\newcommand*{\@unreplacefilewithext}[2]{%
+ \ifcsname #1.#2-@aliasname\endcsname
+ \expandafter\global\expandafter\let\csname #1.#2-@aliasname\endcsname\relax
+ \fi
+}
+\newcommand*{\UnReplacePackage}[1]{%
+ \@unreplacefilewithext{#1}\@pkgextension
+}
+\newcommand*{\UnReplaceClass}[1]{%
+ \@unreplacefilewithext{#1}\@clsextension
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Prevent Package from Loading}
+%
+% \begin{macro}{\PreventPackageFromLoading}
+% \changes{v3.08}{2010/11/04}{New}
+% \changes{v3.11a}{2012/06/13}{write fault error in \cs{MessageBreak} fixed}
+% \changes{v3.12}{2012/06/15}{new star version allowes empty argument with
+% info instead of warning}
+% \changes{v3.20}{2016/04/12}{\cs{@ifstar} replaced by \cs{kernel@ifstar}}
+% \changes{v3.32}{2020/09/09}{works global}
+% \begin{macro}{\@PreventPackageFromLoading}
+% \changes{v3.12}{2012/06/15}{New (internal)}%^^A
+% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
+% \cs{kernel@ifnextchar}}%^^A
+% \begin{macro}{\@@PreventPackageFromLoading}
+% \changes{v3.12}{2013/11/22}{New (internal)}%^^A
+% \changes{v3.12}{2013/11/22}{\cs{usepackage} before \cs{documentclass}
+% fixed}%^^A
+% \begin{macro}{\scrlfile@excludedpackages}
+% \changes{v3.08}{2010/11/04}{New (internal)}%^^A
+% \begin{macro}{\scrlfile@saved@RequirePackage}
+% \changes{v3.08}{2010/11/04}{New (internal)}%^^A
+% \begin{macrocode}
+\newcommand*{\scrlfile@excludedpackages}{}
+\let\scrlfile@excludedpackages\@empty
+\newcommand*{\scrlfile@saved@RequirePackage}{}
+\newcommand*{\PreventPackageFromLoading}{%
+ \kernel@ifstar{\@PreventPackageFromLoading\PackageInfo}%
+ {\@PreventPackageFromLoading\PackageWarning}%
+}
+\newcommand*{\@PreventPackageFromLoading}[1]{%
+ \kernel@ifnextchar [%]
+ {\@@PreventPackageFromLoading#1}{\@@PreventPackageFromLoading#1[]}%
+}
+\newcommand*{\@@PreventPackageFromLoading}{}
+\def\@@PreventPackageFromLoading#1[#2]#3{%
+% \end{macrocode}
+% We do nothing, if the argument was empty:
+% \begin{macrocode}
+ \edef\reserved@b{\zap@space#3 \@empty}%
+ \ifx \reserved@b\@empty
+ #1{scrlfile}{%
+ \string\PreventPackageFromLoading\space with empty packages\MessageBreak
+ argument ignored%
+ }%
+ \else
+% \end{macrocode}
+% If the argument was not empty we first need to patch \cs{RequirePackage} and
+% maybe \cs{usepackage} too.
+% \begin{macrocode}
+ \ifx\scrlfile@excludedpackages\@empty
+ \global\let\scrlfile@saved@RequirePackage\RequirePackage
+ \global\let\RequirePackage\scrlfile@RequirePackage
+ \def\reserved@a##1##{%
+ \@latex@error
+ {\noexpand \usepackage before \string\documentclass}%
+ {\noexpand \usepackage may only appear in the document
+ preamble, i.e.,\MessageBreak
+ between \noexpand\documentclass and
+ \string\begin{document}.}%
+ \@gobble}%
+ \ifx\reserved@a\usepackage\else
+ \ifx\usepackage\scrlfile@saved@RequirePackage\else
+ \PackageWarning{scrlfile}{%
+ Maybe serious problem: unexpected definition of\MessageBreak
+ \string\usepackage
+ }%
+ \fi
+ \global\let\usepackage\RequirePackage
+ \fi
+ \fi
+% \end{macrocode}
+% We have to test, if a package was already loaded. Only not yet loaded
+% packages will be added to the exclusion list. Empty arguments will be
+% ignored.
+% \changes{v3.11a}{2012/06/11}{missing \cs{scrlfile@excludedpackages} at
+% redefinition of \cs{scrlfile@excludedpackages} added}%^^A
+% \changes{v3.26}{2018/08/29}{spurious \cs{expandafter} removed}%^^A
+% \begin{macrocode}
+ \@for\reserved@a:=\reserved@b\do {%
+ \ifx\reserved@a\@empty
+ #1{scrlfile}{%
+ empty package argument for
+ \string\PreventPackageFromLoading\MessageBreak
+ ignored%
+ }%
+ \else
+ \expandafter\@ifpackageloaded\expandafter{\reserved@a}{%
+ #1{scrlfile}{%
+ package `\reserved@a' already loaded.\MessageBreak
+ Cannot prevent it from beeing loaded%
+ }%
+ }{%
+ \ifx\scrlfile@excludedpackages\@empty
+ \global\let\scrlfile@excludedpackages\reserved@a
+ \else
+ \xdef\scrlfile@excludedpackages{\scrlfile@excludedpackages,%
+ \reserved@a}%
+ \fi
+ \if\relax\detokenize{#2}\relax\else
+ \@ifundefined{scrlfile@exclude@package@\reserved@a @do}{%
+ \@namedef{scrlfile@exclude@package@\reserved@a @do}{}%
+ }{}%
+ \expandafter\gdef
+ \csname scrlfile@exclude@package@\reserved@a
+ @do\expandafter\expandafter\expandafter\endcsname
+ \expandafter\expandafter\expandafter{%
+ \csname scrlfile@exclude@package@\reserved@a @do\endcsname
+ #2%
+ }%
+ \fi
+ }%
+ \fi
+ }%
+% \end{macrocode}
+% If the exclusion list is still empty (because all packages has been loaded
+% already), remove the patch:
+% \begin{macrocode}
+ \ifx\scrlfile@excludedpackages\@empty
+ \ResetPreventPackageFromLoading
+ \fi
+ \fi
+}
+\@onlypreamble\PreventPackageFromLoading
+% \end{macrocode}
+% \begin{macro}{\ResetPreventPackageFromLoading}
+% \changes{v3.08}{2010/11/04}{New}
+% \changes{v3.32}{2020/09/09}{works global}
+% \begin{macro}{\StorePreventPackageFromLoading}
+% \changes{v3.08}{2010/11/04}{New}
+% These two are very simple
+% \begin{macrocode}
+\newcommand*{\ResetPreventPackageFromLoading}{%
+ \global\let\scrlfile@excludedpackages\@empty
+ \ifx\RequirePackage\scrlfile@RequirePackage
+ \ifx\usepackage\RequirePackage
+ \global\let\usepackage\scrlfile@saved@RequirePackage
+ \fi
+ \global\let\RequirePackage\scrlfile@saved@RequirePackage
+ \fi
+}
+\@onlypreamble\ResetPreventPackageFromLoading
+\newcommand*{\StorePreventPackageFromLoading}[1]{%
+ \let#1\scrlfile@excludedpackages
+}
+\@onlypreamble\StorePreventPackageFromLoading
+% \end{macrocode}
+% \begin{macro}{\UnPreventPackageFromLoading}
+% \changes{v3.12}{2013/11/22}{New}%^^A
+% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
+% ersetzt}%^^A
+% \changes{v3.32}{2020/09/09}{works global}
+% \begin{macro}{\@UnPreventPackageFromLoading}
+% \changes{v3.12}{2013/11/22}{New (internal)}%^^A
+% This removes packages from the prevent exclude list. The star variant also
+% undefines the instead code.
+% \begin{macrocode}
+\newcommand*{\UnPreventPackageFromLoading}{%
+ \kernel@ifstar {\@tempswatrue\@UnPreventPackageFromLoading}%
+ {\@tempswafalse\@UnPreventPackageFromLoading}%
+}
+\newcommand*{\@UnPreventPackageFromLoading}[1]{%
+ \edef\reserved@b{\zap@space#1 \@empty}%
+ \if@tempswa
+ \@for\reserved@a:=\reserved@b\do {%
+ \ifx\reserved@a\@empty \else
+ \ifcsname scrlfile@exclude@package@\reserved@a @do\endcsname
+ \expandafter\let
+ \csname scrlfile@exclude@package@\reserved@a @do\endcsname
+ \undefined
+ \fi
+ \fi
+ }%
+ \fi
+ \ifcsname scrlfile@excludedpackages\endcsname
+ \let\reserved@a\scrlfile@excludedpackages
+ \let\scrlfile@excludedpackages\@empty
+ \expandafter\@for\expandafter\reserved@c
+ \expandafter:\expandafter=\reserved@a
+ \do{%
+ \ifx\reserved@c\@empty\else
+ \@expandtwoargs\in@{,\reserved@c,}{,\reserved@b,}%
+ \ifin@
+ \else
+ \ifx\scrlfile@excludepackages\@empty
+ \global\let\scrlfile@excludepackages\reserved@c
+ \else
+ \xdef\scrlfile@excludedpackages{%
+ \scrlfile@excludedpackages,\reserved@c
+ }%
+ \fi
+ \fi
+ \fi
+ }%
+ \ifx\scrlfile@excludedpackages\@empty\ResetPreventPackageFromLoading\fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\scrlfile@RequirePackage}
+% \changes{v3.08}{2010/11/04}{New (internal)}
+% \changes{v3.12}{2013/11/22}{tolerate spaces}
+% \changes{v3.12}{2013/11/22}{execute the optional argument of
+% \cs{PreventPackageFromLoading}}
+% This macro will replace \cs{RequirePackage} whenever the exlude list is not
+% empty
+% \begin{macrocode}
+\newcommand*{\scrlfile@RequirePackage}[2][]{%
+ \let\reserved@c\@empty
+ \let\reserved@d\@empty
+ \edef\reserved@b{\zap@space#2 \@empty}%
+ \expandafter\@for\expandafter\reserved@b\expandafter:\expandafter=\reserved@b
+ \do {%
+ \begingroup
+ \@tempswatrue
+ \@for\reserved@a:=\scrlfile@excludedpackages\do {%
+ \ifx\reserved@a\reserved@b
+ \@tempswafalse
+ \fi
+ }%
+ \if@tempswa
+ \xdef\reserved@c{\reserved@c,\reserved@b}%
+ \else
+ \ifx\reserved@b\@empty\else
+ \PackageInfo{scrlfile}{Excluding package `\reserved@b'\MessageBreak
+ from loading}%
+ \@ifundefined{scrlfile@exclude@package@\reserved@b @do}{%
+ }{%
+ \expandafter\g@addto@macro\expandafter\reserved@d
+ \csname scrlfile@exclude@package@\reserved@b @do\endcsname
+ }%
+ \fi
+ \fi
+ \endgroup
+ }%
+ \ifx\reserved@c\@empty
+ \let\reserved@a\scr@gobbleopt
+ \else
+ \edef\reserved@a{\noexpand\scrlfile@saved@RequirePackage[#1]{%
+ \expandafter\@gobble\reserved@c\@empty}}%
+ \fi
+ \expandafter\reserved@d
+ \reserved@a
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\scr@gobbleopt}
+% \changes{v3.08}{2010/11/04}{New (internal)}
+% \changes{v3.08a}{2011/02/11}{\cs{@gobbleopt} renamed due to compaibility
+% problems with \texttt{ntheorem}}
+% Eat the optional argument if it exists.
+% \begin{macrocode}
+\providecommand{\scr@gobbleopt}[1][]{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\kernel@ifstar}
+% \changes{v3.20}{2016/04/12}{New (internal)}
+% I hope, the \LaTeX{} kernel will define this command in future. But
+% nevertheless, there are \LaTeX{} kernels in real live without this
+% command. So I do it again if needed:
+% \begin{macrocode}
+\providecommand*\kernel@ifstar[1]{\kernel@ifnextchar*{\@firstoftwo{#1}}}
+% \end{macrocode}
+% \end{macro}%^^A \kernel@ifstar
+%
+%
+% \subsection{Extra Document Hooks}
+%
+% \begin{macro}{\BeforeClosingMainAux}
+% \changes{v2.95}{2002/09/03}{new}
+% \begin{macro}{\AfterReadingMainAux}
+% \changes{v3.03}{2009/03/25}{new}
+% These are completly different. First we have to establish a new hook
+% at \cs{end\{document\}}, just after closing the group and after the
+% final \cs{clearpage}.
+% TODO: Handling/ignoring an optional argument to make them more compatible
+% with \LaTeX's new \cs{AddToHook}.
+% \begin{macrocode}
+\AtEndDocument{%
+ \let\scr@saved@checkend=\@checkend
+ \renewcommand*{\@checkend}[1]{%
+ \def\reserved@a{#1}\def\reserved@b{document}%
+ \scr@saved@checkend{#1}%
+ \ifx\reserved@a\reserved@b
+ \let\scr@saved@clearpage=\clearpage
+ \renewcommand*{\clearpage}{\scr@saved@clearpage
+ \scr@hook@bcma
+ \scr@restore@newpage
+ \let\clearpage=\scr@saved@clearpage}%
+ \fi%
+ \let\scr@saved@dofilelist\@dofilelist
+ \def\@dofilelist{%
+ \scr@hook@acma
+ \let\@dofilelist\scr@saved@dofilelist
+ \scr@saved@dofilelist
+ }%
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\scr@saved@checkend}
+% \changes{v2.95}{2002/09/03}{new (internal)}
+% \begin{macro}{\scr@saved@dofilelist}
+% \changes{v3.03}{2009/03/25}{new}
+% You may see above, that we need save-to macros.
+% \begin{macrocode}
+\newcommand*{\scr@saved@checkend}{}
+\newcommand*{\scr@saved@dofilelist}{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\scr@redefine@newpage}
+% \changes{v3.00}{2008/07/09}{new (internal)}
+% Some classes (e.g. \textsf{letter}) write output to the aux file.
+% Because of this, redefinition of \cs{newpage} will only be done, if
+% \cs{BeforeClosingMainAux} is used.
+% \begin{macro}{\scr@saved@newpage}
+% \changes{v3.00}{2008/07/09}{new (internal)}
+% And \cs{newpage} will be restored after the hook.
+% \begin{macro}{\scr@restore@newpage}
+% \begin{macrocode}
+\newcommand*{\scr@redefine@newpage}{%
+ \let\scr@saved@newpage\newpage
+ \def\scr@restore@newpage{%
+ \renewcommand*{\newpage}{%
+ \PackageWarningNoLine{%
+ scrlfile%
+ }{%
+ \string\newpage\space at main aux file!\MessageBreak
+ You have output material at the main aux file.\MessageBreak
+ Note, that the \string\BeforeClosingMainAux\space commands\MessageBreak
+ are processed before the output from aux file%
+ }%
+ \let\newpage\scr@saved@newpage
+ \newpage
+ }%
+ }%
+ \renewcommand*{\newpage}{%
+ \PackageError{%
+ scrlfile%
+ }{%
+ \string\newpage\space at \string\BeforeClosingMainAux
+ }{%
+ You should never use \string\newpage\space or
+ \string\clear(double)page or other output material at the\MessageBreak
+ argument of \string\BeforeClosingMainAux!\MessageBreak
+ If you'll continue, the \string\newpage\space will be ignored to
+ avoid corruption of\MessageBreak
+ every prior use of \string\BeforeClosingMainAux.
+ }%
+ }%
+}
+\newcommand*{\scr@restore@newpage}{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\scr@hook@bcma}
+% \changes{v2.95}{2002/09/03}{new (internal)}
+% \begin{macro}{\scr@hook@acma}
+% \changes{v3.03}{2009/03/25}{new (internal)}
+% We also need macros, that saves the commands at the hooks and are
+% extendable using \cs{g@addto@macro}.
+% \begin{macrocode}
+\newcommand*{\scr@hook@bcma}{}
+\newcommand*{\scr@hook@acma}{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% Now we are able to write the user command. Here we also warn, if we detect
+% one more \cs{newpage}\,---\,maybe at a \cs{clearpage} or
+% \cs{cleardoublepage}.
+% \begin{macrocode}
+\newcommand*{\BeforeClosingMainAux}{%
+ \ifx\scr@hook@bcma\@empty
+ \gdef\scr@hook@bcma{%
+ \renewcommand*{\BeforeClosingMainAux}[1]{####1}%
+ \let\protected@write\protected@immediate@write
+ \scr@redefine@newpage
+ }%
+ \fi
+ \g@addto@macro\scr@hook@bcma%
+}
+\newcommand*{\AfterReadingMainAux}{%
+ \ifx\scr@hook@acma\@empty
+ \gdef\scr@hook@acma{%
+ \renewcommand*{\AfterReadingMainAux}[1]{####1}%
+ \let\protected@write\protected@immediate@write
+ }%
+ \fi
+ \g@addto@macro\scr@hook@acma%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\protected@immediate@write}
+% Like \LaTeX{} kernel's |\protected@write| but using |\immediate\write|. In
+% this case it is even not a good idea to protect |\thepage|!
+% \begin{macrocode}
+\long\def\protected@immediate@write#1#2#3{%
+ \begingroup
+ #2%
+ \let\protect\@unexpandable@protect
+ \edef\reserved@a{\immediate\write#1{#3}}%
+ \reserved@a
+ \endgroup
+ \if@nobreak\ifvmode\nobreak\fi\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The \KOMAScript{} Logo}
+%
+% Last but not least this is a \KOMAScript{} package, so we also define the
+% \KOMAScript{} logo:
+% \begin{macrocode}
+\RequirePackage{scrlogo}
+% \end{macrocode}
+%
+% \Finale
+%
+% \endinput
+% Local Variables:
+% mode: doctex
+% TeX-master: t
+% End:
diff --git a/Master/texmf-dist/source/latex/koma-script/scrlfile.dtx b/Master/texmf-dist/source/latex/koma-script/scrlfile.dtx
index 8746d73643c..b9782c81e57 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrlfile.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrlfile.dtx
@@ -1,4 +1,3 @@
-% \CheckSum{849}
% \iffalse^^A meta-comment
% ======================================================================
% scrlfile.dtx
@@ -40,31 +39,13 @@
%
% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
% ======================================================================
-% \fi^^A meta-comment
-%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
%
-% \iffalse
-%%% From File: $Id: scrlfile.dtx 3447 2020-01-06 16:40:47Z kohm $
+%%% From File: $Id: scrlfile.dtx 3537 2020-09-14 07:30:10Z kohm $
%<*dtx>
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2020-01-06 17:40:47 +0100 (Mon, 06 Jan 2020) $
+ \filedate$Date: 2020-09-14 09:30:10 +0200 (Mon, 14 Sep 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
\filerevision$Revision: 2631 $
\edef\reserved@a{%
@@ -75,12 +56,10 @@
}%
\reserved@a
%</dtx>
-%<*dtx|scrlfile>
-%<scrlfile>\ProvidesPackage{scrlfile}[%
+%<package>\ProvidesPackage{scrlfile}[%
%!KOMAScriptVersion
-%<scrlfile> package
- (loading files)]
-%</dtx|scrlfile>
+%<package> package
+ (file load hooks)]
%<*dtx>
\ifx\documentclass\undefined
\input scrdocstrip.tex
@@ -89,1262 +68,173 @@
\KOMAdefVariable{COPYRIGHTFROM}{2002}
\generate{\usepreamble\defaultpreamble
\file{scrlfile.sty}{%
- \from{scrlfile.dtx}{scrlfile}%
- \from{scrlogo.dtx}{logo}%
+ \from{scrlfile.dtx}{package}%
}%
}
+ \batchinput{scrlfile-hook.dtx}
+ \batchinput{scrlfile-patcholdlatex.dtx}
\@@input scrstrop.inc
\else
\let\endbatchfile\relax
\fi
\endbatchfile
\documentclass[parskip=half-]{scrdoc}
-\usepackage[german,english]{babel}
+\usepackage[english]{babel}
\CodelineIndex
\RecordChanges
\GetFileInfo{scrlfile.dtx}
\title{\KOMAScript{} \partname\ \texttt{\filename}%
- \thanks{This file is version \fileversion\ of file \texttt{\filename}.}}
+ \thanks{This file is revision \fileversion\ of file \texttt{\filename}.}}
\date{\filedate}
-\author{Markus Kohm\thanks{mailto:komascript@gmx.info}~\thanks{Parts of
- description sections of the documentation where written by Jens-Uwe
- Morawski.}}
+\author{Markus Kohm\thanks{mailto:komascript@gmx.info}}
\begin{document}
\maketitle
\begin{abstract}
- This package provides hooks before and after loading files, packages or
- classes. It also provides a hook after the last \cs{clearpage} of the
- document. It allowes to replace files, packages and classes by other
- files, packages and classes. It is inteded to be used by package and class
- authors but may also be used by \LaTeX{} users.
+ This package is the compatibility layer over \texttt{scrlfile-hook} and
+ \texttt{scrlfile-patcholdlatex}. It provides package and class hook
+ handling independent from the used \LaTeX{} release.
\end{abstract}
+ \tableofcontents
+
\DocInput{\filename}
\end{document}
%</dtx>
-% \fi
-%
-% \selectlanguage{english}
-%
-% \changes{v2.95}{2002/06/11}{First version split from hugh scrclass.dtx}%^^A
-% \changes{v3.24}{2017/05/06}{standalone manual removed}%^^A
-%
-% \StopEventually{\PrintIndex\PrintChanges}
-%
-% \section{Implementation of \textsf{scrlfile}}
+% \fi^^A meta-comment
%
-% \iffalse
-%<*scrlfile>
-% \fi
+% \changes{v2.95}{2002/06/11}{First version split from hugh scrclass.dtx}
+% \changes{v3.24}{2017/05/06}{standalone manual removed}
+% \changes{v3.32}{2020/09/11}{new implementation based on
+% \texttt{scrlfile-hook} and \texttt{scrlfile-patcholdlatex}}
%
-% \subsection{Preamble}
%
-% \changes{v3.24}{2017/05/06}{Preamble sub-section removed}%^^A
-% Since \KOMAScript~3.24 we do not longer output version information into the
-% \texttt{log}-file.
+% \section{User Manual}
%
-% \subsection{Options}
+% For user manual see the \KOMAScript{} manual. Here you can find interim
+% documentation only (before it is added to the \KOMAScript{} manual).
%
-% Currently there are no options.
-% \begin{macrocode}
-\ExecuteOptions{}
-\ProcessOptions\relax
-% \end{macrocode}
+% \DescribeOption{withdeprecated}
+% Package option \texttt{withdeprecated} enables the definition of deprecated
+% commands \cs{AfterClass+}, \cs{AfterPackage+}, \cs{AfterClass!} and
+% \cs{AfterPackage!}. All of them will be emulated by \cs{AfterAtEndOClass*}
+% and \cs{AfterAtEndOfPackage*} so they are not completely compatible with the
+% original deprecated commands.
%
+% Users of classes or package, that use such deprecated commands can load
+% \texttt{scrlfile} already before the class using:
+% \begin{verbatim}
+% \RequirePackage[withdeprecated]{scrlfile}
+% \end{verbatim}
+% or adding option \texttt{withdeprecated} to the global options of
+% \cs{documentclass}. Note, this is not a key-value option. It cannot be
+% changed after loading \texttt{scrlfile}.
%
-% \subsection{The macros}
%
-% \begin{macro}{\InputIfFileExists}
-% \changes{v2.96}{2006/07/19}{replacement code added}%^^A
-% \LaTeX{} uses this macro for loading files with
-% \cs{input}\marg{filename}, \cs{include}, \cs{LoadClass},
-% \cs{LoadClassWithOptions}, \cs{documentclass}, \cs{documentstyle},
-% \cs{RequirePackage}, \cs{usepackage}. Only
-% \cs{input}~\meta{filename} loads \meta{filename} without using
-% \cs{InputIfFileExists}.
+% \StopEventually{\PrintIndex\PrintChanges}
%
-% Because of this, it's very easy to add stuff before and after
-% loading a file. We simply change this macro and add to
-% macros\,---\,one before loading the file and one after loading the
-% file. But before we redefine the macro, we test, if the macro was
-% defined like we expected. \LaTeX{} will warn, if not.
-% \changes{v3.27}{2019/10/06}{\LaTeX{} 2019-10-01 changed the definition}%^^A
+% \section{Implementation of \textsf{scrlfile}}
%
-% \changes{v3.28}{2019/11/21}{support for \textsf{memoir}}%^^A
-% With \textsf{memoir} their is a special case. It also redefines
-% \cs{InputIfFileExists}. As shown in the source of the class it does so
-% because \textsf{scrlfile} does it. However it does it not compatible with
-% \textsf{scrlfile} and it does not emulate \textsf{scrlfile} as it do for
-% other packages. So if you try to use \textsf{scrlfile} with memoir,
-% \textsf{scrbase} has to take care to \textsf{memoir}. And in oposit to
-% \textsf{scrlfile} \textsf{memoir} does not always fix the argument order bug
-% of \LaTeX{} but do so only for the implementation of \LaTeX{} 2019-10-01.
-% So in case of \textsf{memoir} we just patch every version of it without
-% testing.
-% \begin{macrocode}
-\@ifclassloaded{memoir}{%
- \PackageInfo{scrlfile}{class `memoir' detected.\MessageBreak
- Using a compatible redefinition of \string\InputIfFileExists,\MessageBreak
- but always robust and with the fix of the\MessageBreak
- argument order bug even for old versions of the\MessageBreak
- LaTeX kernel%
- }%
-}{%
- \long\def\reserved@a#1#2{%
- \IfFileExists{#1}%
- {#2\@addtofilelist{#1}\@@input \@filef@und}}%
- \ifx\reserved@a\InputIfFileExists\else
- \expandafter\CheckCommand\expandafter*\expandafter\InputIfFileExists
- \expandafter{%
- \expandafter\protect\csname InputIfFileExists \endcsname
- }%
- \expandafter\CheckCommand \csname InputIfFileExists \endcsname[2]{%
- \IfFileExists {#1}{%
- \expandafter \@swaptwoargs \expandafter {\@filef@und }%
- {#2\@addtofilelist {#1}\@@input }%
- }%
- }%
- \fi
-}
-% \end{macrocode}
-% Now we can redefine the macro like described above:
+% We either need to load one of these packages. We could do the decision by
+% testing the \LaTeX{} version. But the existence of macro \cs{AddToHook} is
+% easier and better.
% \begin{macrocode}
-\expandafter\renewcommand\expandafter*\expandafter\InputIfFileExists
-\expandafter{\expandafter
- \protect\csname InputIfFileExists \endcsname}%
-\expandafter\long\expandafter\def\csname InputIfFileExists \endcsname#1#2{%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname #1-@alias\endcsname\relax
- \expandafter\@secondoftwo
- \else
- \scr@replacefile@msg{\csname #1-@alias\endcsname}{#1}%
- \expandafter\@firstoftwo
- \fi
- {%
- \expandafter\InputIfFileExists\expandafter{\csname
- #1-@alias\endcsname}{#2}%
- }%
- {\IfFileExists{#1}{%
- \expandafter\scr@input@withhook\expandafter{\@filef@und}{#1}{#2}%
- }}%
-}
-% \end{macrocode}
-% \begin{macro}{\scr@input@withhook}
-% \changes{v3.27}{2019/03/28}{new (internal)}%^^A
-% \changes{v3.28}{2019/11/21}{support for \textsf{memoir}}%^^A
-% We need a new internal, because of expanding \cs{@file@und} before inputting
-% the file.
-% \begin{macrocode}
-\@ifclassloaded{memoir}{%
- \newcommand{\scr@input@withhook}[3]{%
- \scr@load@hook{before}{#2}%
- #3\@addtofilelist{#2}%
- \@ifundefined{m@matbeginf}{}{\m@matbeginf{#2}}%
- \@@input #1%
- \@ifundefined{m@matendf}{}{\m@matendf{#2}}%
- \@ifundefined{killm@matf}{}{\killm@matf{#2}}%
- \scr@load@hook{after}{#2}%
- }%
+\@ifundefined{AddToHook}{%
+ \RequirePackage{scrlfile-patcholdlatex}%
+ \RequirePackage{xparse}%
}{%
- \newcommand{\scr@input@withhook}[3]{%
- \scr@load@hook{before}{#2}%
- #3\@addtofilelist{#2}%
- \@@input #1%
- \scr@load@hook{after}{#2}%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@loadwithoptions}
-% \changes{v2.96}{2006/07/19}{new redefinition}
-% \begin{macro}{\scr@loadwithoptions}
-% \changes{v2.96}{2006/07/19}{new helper macro}
-% \begin{macro}{\scr@@loadwithoptions}
-% \changes{v2.97a}{2007/03/07}{new helper macro}
-% \LaTeX{} uses this macro for loading classes and packages using
-% \cs{LoadClassWithOptions} or \cs{RequirePackageWithOptions}. We simply say
-% now: if the class or package should be replaced by another, try it again
-% with the replacement name. The stack is used. This will result in an
-% error if the replacements are nested too deep. This should be, because it
-% will also result in an error using ring replacements.
-% \begin{macrocode}
-\newcommand*{\scr@@loadwithoptions}{}
-\newcommand*{\scr@loadwithoptions}{}
-\let\scr@loadwithoptions\@loadwithoptions
-\renewcommand*{\@loadwithoptions}[3]{%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname #3.#1-@aliasname\endcsname\relax
- \def\scr@@loadwithoptions{\scr@loadwithoptions{#1}{#2}{#3}}%
- \else
- \scr@replacefile@msg{\csname #3.#1-@aliasname\endcsname.#1}{#3.#1}%
- \def\scr@@loadwithoptions{%
- \@loadwithoptions{#1}{#2}{\csname #3.#1-@aliasname\endcsname}%
- }%
- \fi
- \scr@@loadwithoptions
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@onefilewithoption}
-% \changes{v2.96}{2006/07/19}{new redefinition}
-% \begin{macro}{\scr@onefilewithoption}
-% \changes{v2.96}{2006/07/19}{new helper macro}
-% \begin{macro}{\scr@@onefilewithoption}
-% \changes{v2.98}{2007/12/18}{new helper macro}
-% \LaTeX{} uses this macro for loading classes and packages using
-% \cs{LoadClass}, \cs{documentclass}, \cs{RequirePackage}, and
-% \cs{usepackage}. We simply say now: if the class or package should be
-% replaced by another, try it again with the replacement name. The stack is
-% used. This will result in an error if the replacements are nested too
-% deep. This should be, because it will also result in an error using ring
-% replacements.
-% \begin{macrocode}
-\newcommand*{\scr@onefilewithoptions}{}
-\let\scr@onefilewithoptions\@onefilewithoptions
-\def\@onefilewithoptions#1[#2][#3]#4{%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname #1.#4-@aliasname\endcsname\relax
-% \end{macrocode}
-% Do this ridiculous definition and call outside of \cs{ifx}\dots\cs{fi}
-% because of some errornous packages like some versions of
-% \textsf{breakurl}. This does not avoid an error, but the message about
-% unclosed \cs{if} will be outside of \textsf{scrlfile}.
-% \begin{macrocode}
- \def\scr@@onefilewithoptions{\scr@onefilewithoptions{#1}}%
- \else
- \scr@replacefile@msg{\csname #1.#4-@aliasname\endcsname.#4}{#1.#4}%
- \edef\scr@@onefilewithoptions{%
- \noexpand\@onefilewithoptions{\csname #1.#4-@aliasname\endcsname}}%
- \fi
- \scr@@onefilewithoptions[{#2}][{#3}]{#4}%
- \scr@load@hook{lateafter}{#1.#4}%
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\ReplaceInput}
-% \changes{v2.96}{2006/07/19}{new command}
-% \changes{v3.12}{2013/11/15}{implemented}
-% Defining the replacement by definition of \cs{\#1-@alias}.
-% \begin{macrocode}
-\newcommand*{\ReplaceInput}[2]{%
- \expandafter\edef\csname #1-@alias\endcsname{#2}%
-}
-% \end{macrocode}
-% \begin{macro}{\ReplaceFile}
-% \changes{v2.96}{2006/07/19}{new command}
-% \changes{v3.12}{2013/11/15}{throw error}
-% Sorry, but I've implemented the wrong command some time ago.
-% \begin{macrocode}
-\newcommand*{\ReplaceFile}{%
- \PackageError{scrlfile}{%
- usage of not documented command `\string\ReplaceFile'%
- }{%
- Command `\string\ReplaceFile' has been implemented accidentally in
- KOMA-Script 2.96\MessageBreak
- and replaced by `\string\ReplaceInput' in KOMA-Script 3.12.\MessageBreak
- You should replace `\string\ReplaceFile' by `\string\ReplaceInput' to
- avoid this error\MessageBreak
- message%
- }%
- \ReplaceInput
+ \RequirePackage{scrlfile-hook}%
}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\UnReplaceInput}
-% \changes{v3.12}{2013/11/15}{new command}
-% Do not longer replace a file.
+% \begin{option}{withdeprecated}
+% \changes{v3.32}{2020/09/11}{new option}
+% Depending on this option we implement addition deprecated commands.
% \begin{macrocode}
-\newcommand*{\UnReplaceInput}[1]{%
- \ifcsname #1-@alias\endcsname
- \expandafter\let\csname #1-@alias\endcsname\relax
- \fi
-}
+\DeclareOption{withdeprecated}{%
% \end{macrocode}
-% \end{macro}
%
-% \begin{macro}{\ReplacePackage}
-% \changes{v2.96}{2006/07/19}{new command}
-% \begin{macro}{\ReplaceClass}
-% \changes{v2.96}{2006/07/19}{new command}
-% \begin{macro}{\@replacefilewithext}
-% \changes{v2.96}{2006/07/19}{new helper command}%^^A
-% Note that replacing a package or class will not replace the input of the
-% file of the package or class but only the input of package or class.
+% \begin{macro}{\AfterClass+}
+% \begin{macro}{\AfterClass!}
+% \cs{scrlfile@AfterClass} is used to store the original \cs{AfterClass},
+% before redefining \cs{AfterClass} to handle the plus and the exclamation
+% mark variant.
% \begin{macrocode}
-\newcommand*{\@replacefilewithext}[3]{%
- \expandafter\edef\csname #1.#3-@aliasname\endcsname{#2}%
- }
-\newcommand*{\ReplacePackage}[2]{%
- \@replacefilewithext{#1}{#2}\@pkgextension
-}
-\newcommand*{\ReplaceClass}[2]{%
- \@replacefilewithext{#1}{#2}\@clsextension
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\UnReplacePackage}
-% \changes{v3.12}{2013/11/15}{new command}
-% \begin{macro}{\UnReplaceClass}
-% \changes{v3.12}{2013/11/15}{new command}
-% \begin{macro}{\@unreplacefilewithext}
-% \changes{v3.12}{2013/11/15}{new helper command}%^^A
-% Do not nolonger replace a class or package.
-% \begin{macrocode}
-\newcommand*{\@unreplacefilewithext}[2]{%
- \ifcsname #1.#2-@aliasname\endcsname
- \expandafter\let\csname #1.#2-@aliasname\endcsname\relax
- \fi
-}
-\newcommand*{\UnReplacePackage}[1]{%
- \@unreplacefilewithext{#1}\@pkgextension
-}
-\newcommand*{\UnReplaceClass}[1]{%
- \@unreplacefilewithext{#1}\@clsextension
-}
+ \RenewDocumentCommand\AfterClass{}{%
+ \kernel@ifnextchar +%
+ {\scrlfile@emulatedeprecated{Class}}%
+ {%
+ \kernel@ifnextchar !%
+ {\scrlfile@emulatedeprecated{Class}}%
+ \scrlfile@AfterClass
+ }%
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\scr@replacefile@msg}
-% \changes{v2.96}{2006/07/19}{new helper command}
-% \changes{v2.98}{2007/12/18}{spellfix}
-% Last but not least \textsf{scrlfile} will write a message to the log file at
-% every replacement.
-% \begin{macrocode}
-\newcommand*{\scr@replacefile@msg}[2]{%
- \PackageInfo{scrlfile}{inputing `#1' instead of `#2'}%
-}
-% \end{macrocode}
-% \end{macro}
%
-% \begin{macro}{\scr@load@hook}
-% \changes{v3.27a}{2019/10/16}{workaround for strange handling of
-% \cs{AtEndOfPackage} hook in \cs{@onefilewithoptions}}%^^A
-% This macro simply calls a load-file-hook, either the \emph{before}
-% or the \emph{after} one, if the hook exists. After calling the hook
-% it will be deleted. First argument is the type of hook
-% (\meta{before} or \meta{after}), second argument is a filename.
-% \begin{macrocode}
-\newcommand*{\scr@load@hook}[2]{%
-% \end{macrocode}
-% \begin{macro}{\scrlfile@cmp@hook}
-% \changes{v3.27a}{2019/10/23}{local macros renamed}%^^A
-% \begin{macro}{\scrlfile@hookname}
-% \changes{v3.27a}{2019/10/23}{local macros renamed}%^^A
-% \changes{v3.29}{2020/06/01}{do the class and package load hooks only in the
-% document preamble}%^^A --> https://komascript.de/node/2274
-% Workaround for strange handling of the \cs{AtEndOfPackage} hook in
-% \cs{@onefilewithoptions} (becomes \cs{@empty}, if the package already has
-% been loaded and is not loaded again). This workaround is not nice but
-% smart. Before loading a file it defines a marker macro and undefines it
-% later. To decide whether to define or remove the marker, two local macros
-% are used \cs{scrlfile@hookname} and \cs{scrlfile@cmp@hook}. The first has
-% the name of the current hook from the first argument. The other is a compare
-% string. The first one is also valid while processing the hook, but only in
-% the document preamble. The names are very unique, so we do not reserve them
-% using \cs{newcommand} outside. The name of the marker is less
-% unique. Nevertheless it is not reserved.
-% Note: For recursive loading of files this does not work. But this also does
-% not matter, because it is needed only for packages and classes, which are
-% never loaded recursive. For the same reason from \KOMAScript{} 3.29 this is
-% only used inside the document preamble. After the document preamble it can
-% be dangerous, e.g., inside a |tabular| or |array|.
-% \begin{macrocode}
- \ifx\@begindocumenthook\@undefined\else
- \edef\scrlfile@hookname{#1}%
- \def\scrlfile@cmp@hook{before}%
- \ifx\scrlfile@hookname\scrlfile@cmp@hook
- \expandafter\def\csname #2-l@ading\endcsname{#2}%
- \fi
- \let\scrlfile@cmp@hook\@undefined
- \fi
- \@ifundefined{#2-@#1}{}{%
- \@nameuse{#2-@#1}%
- \expandafter\let\csname #2-@#1\endcsname\relax
- }%
-% \end{macrocode}
-% The hook could destroy \cs{scrlfile@hookname} so define it again:
-% \begin{macrocode}
- \ifx\@begindocumenthook\@undefined\else
- \edef\scrlfile@hookname{#1}%
- \def\scrlfile@cmp@hook{after}%
- \ifx\scrlfile@hookname\scrlfile@cmp@hook
- \expandafter\let\csname #2-l@ading\endcsname\@undefined
- \fi
- \let\scrlfile@cmp@hook\@undefined
- \let\scrlfile@hookname\@undefined
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\scr@set@load@hook}
-% This command adds stuff to a load-file-hook, either the
-% \emph{before} or the \emph{after} one. First argument is the type of
-% hook (\meta{before} or \meta{after}), second is a filename. There's
-% a third argument not parsed by the macro itself but
-% \cs{g@addto@macro}. This third argument is the stuff, which will be
-% added to the hook. Because of using \cs{g@addto@macro} the hook must
-% be defined. So we define it, if it isn't.
-% \begin{macrocode}
-\newcommand*{\scr@set@load@hook}[2]{%
- \@ifundefined{#2-@#1}{\@namedef{#2-@#1}{}}{}%
- \expandafter\g@addto@macro\csname #2-@#1\endcsname}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\BeforeFile}
-% \begin{macro}{\AfterFile}
-% Just add code to the \emph{before} or \emph{after} hook of a file. The
-% arguments are:
-% \begin{description}
-% \item[\meta{file name}:] mandatory argument with the file name as given by
-% \cs{InputIfFileExists}.
-% \item[\meta{code}:] this argument is not processed by \cs{BeforeFile} or
-% \cs{AfterFile} but the internal \cs{scr@set@load@hook}. It is the code
-% that should be added to either the \emph{before} or the \emph{after} hook.
-% \end{description}
-% \begin{macrocode}
-\newcommand*{\BeforeFile}{\scr@set@load@hook{before}}
-\newcommand*{\AfterFile}{\scr@set@load@hook{after}}
-% \end{macrocode}
-% \end{macro}%^^A \AfterFile
-% \end{macro}%^^A \BeforeFile
-%
-% \begin{macro}{\BeforeClass}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
-% ersetzt}%^^A
-% This is quite simple. It only has to add code to the \emph{before} hook
-% already known by \cs{BeforeFile}. The arguments are:
-% \begin{description}
-% \item[\meta{package name}:] mandatory argument.
-% \item[\meta{code}:] this argument is processed not by \cs{BeforeClass} but
-% by the internal \cs{scr@set@load@hook} (see above), that will add the code
-% to the \emph{before} hook of file \meta{code}\texttt{.cls} (or whatever the
-% package extension is).
-% \end{description}
-% \begin{macrocode}
-\newcommand*{\BeforeClass}[1]{%
- \scr@set@load@hook{before}{#1.\@clsextension}}
-% \end{macrocode}
-% \end{macro}%^^A \BeforeClass
-%
-% \begin{macro}{\AfterClass}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
-% ersetzt}%^^A
-% \begin{macro}{\AfterAtEndOfClass}
-% These are more complicated. There are five forms:
-% \begin{description}
-% \item[\cs{AfterClass}] corresponds to \cs{AfterFile}. So the code will be
-% added to the usual \emph{after} hook and the code is exexuted before code
-% added by the class itself using \cs{AtEndOfClass}. Argument procession
-% will be done by \cs{@AfterClass}.
-% \item[\cs{AfterAtEndOfClass}] This uses the \emph{lateafter} hook, which
-% is executed after the class has been loaded completely inclusive the
-% execution of \cs{AtEndOfClass} code. However, the code will never be
-% executed, if the class will not be loaded (again). But it does nothing,
-% if the class has already been loaded. The arguments are:
-% \begin{description}
-% \item[\meta{class name}] mandatory argument
-% \item[\meta{code}:] this argument is processed not by \cs{BeforeClass}
-% but by the internal \cs{scr@set@load@hook} (see above), that will add
-% the code to the \emph{lateafter} hook of file \meta{code}\texttt{.cls}
-% (or whatever the class extension is), or by \cs{@gobble}.
-% \end{description}
-% \item[\cs{AfterClass*}] like \cs{AfterClass}, but if loading of the
-% class has already began, the code will be executed immediately. So, if
-% the command is used inside the class it is simply
-% \cs{@firstofone}. Argument procession will be done by \cs{@sAfterClass}.
-% \item[\cs{AfterClass+}] like \cs{AfterClass*}, but the code will be
-% executed immediately only if the class already has been loaded
-% completely or it is used inside \cs{AtEndOfClass}. So inside the class
-% it is similar to \cs{AtEndOfClass}. Argument procession will be done by
-% \cs{@pAfterClass}.
-% \item[\cs{AfterClass!}] like \cs{AfterClass+}, but even inside
-% \cs{AtEndOfClass} the code is executed after every all the
-% \cs{AtEndOfClass} code. Argument procession will be done by
-% \cs{@xAfterClass}. (Some class authors interpret this as the star
-% form of \cs{AfterAtEndOfClass}.)
-% \end{description}
-% \begin{macrocode}
-\newcommand*{\AfterClass}{%
- \kernel@ifstar {\@sAfterClass}{%
- \kernel@ifnextchar +\@pAfterClass{%
- \kernel@ifnextchar !\@xAfterClass\@AfterClass
- }%
- }%
-}
-% \end{macrocode}
-% \begin{macro}{\@AfterClass}
-% \cs{AfterClass}\marg{class name}\marg{code}.
-% It uses \cs{scr@set@load@hook} to add \meta{code} to the
-% \emph{after} hook. The second argument will be processed by
-% \cs{scr@set@load@hook}.
-% \begin{macrocode}
-\newcommand*{\@AfterClass}[1]{%
- \scr@set@load@hook{after}{#1.\@clsextension}}
-% \end{macrocode}
-% \end{macro}%^^A \@AfterClass
-% \begin{macro}{\@sAfterClass}
-% \changes{v3.27a}{2019/10/16}{group removed}%^^A
-% This is the internal implementation of:
-% \cs{AfterClass*}\marg{class name}\marg{code}.
-% It tests, whether or not \LaTeX{} thinks that the class
-% has already been loaded, but this only means whether or not the class
-% loading has already been started. If so, it immediately executes the next
-% argument. If not, is uses \cs{@AfterClass} to execute the \meta{code}
-% after loading the class.
-% \begin{macrocode}
-\newcommand*{\@sAfterClass}[1]{%
- \@ifclassloaded{#1}{%
- \@secondoftwo
- }{%
- \@AfterClass
- }%
- {#1}%
-}
-% \end{macrocode}
-% \end{macro}%^^A \@sAfterClass
-% \begin{macro}{\@pAfterClass}
-% \changes{v3.09}{2011/03/08}{new (internal)}%^^A
-% \changes{v3.27a}{2019/10/15}{renamed from \cs{@@AfterClass}}%^^A
-% \changes{v3.27a}{2019/10/16}{usage of \emph{l@ading} marker}%^^A
-% \changes{v3.27a}{2019/10/16}{group removed}%^^A
-% This is the internal implementation of:
-% \cs{AfterClass+}\marg{class name}\marg{code}.
-% Note, that the plus has not already read. So the arguments are:
-% \begin{description}
-% \item[\texttt{+}:] static plus, to be ignored.
-% \item[\meta{class name}] mandatory argument
-% \item[\meta{code}:] this argument is processed not by \cs{BeforeClass} but
-% by the internal \cs{@sAfterClass} or \cs{@AfterClass} (see above).
-% \end{description}
-% Here we cannot use \LaTeX's test, whether or not the class as already been
-% loaded, because it tests only, if loading of the class has already been
-% started. Here we use an internal information of our \emph{l@ading} marker
-% (see \cs{scr@load@hook}). It is as long defined as a file is read while
-% input. If it is undefined (or \cs{relax}) we can use \cs{@sAfterClass} to
-% either execute \meta{code} immediately or add it to the \emph{after}
-% hook. If is defined (and not \cs{relax}) loading of the class is in progress
-% and \cs{AfterClass} is used to add \meta{code} to the \emph{after} hook. The
-% effect is, that \meta{code} is executed immediately if loading of
-% \meta{class name} has already been finished and after the class if the
-% loading of the \meta{class name} has not already been finished.
-% \begin{macrocode}
-\newcommand*{\@pAfterClass}[2]{%
- \@ifundefined{#2.\@clsextension-l@ading}{%
- \@sAfterClass
- }{%
- \@AfterClass
- }%
- {#2}%
-}
-% \end{macrocode}
-% \end{macro}%^^A \@pAfterClass
-% \begin{macro}{\@xAfterClass}
-% \changes{v3.09}{2011/03/09}{new (internal)}%^^A
-% \changes{v3.27}{2019/08/26}{using inside class fixed}%^^A
-% \changes{v3.27a}{2019/10/15}{renamed from \cs{@@@AfterClass}}%^^A
-% \changes{v3.27a}{2019/10/16}{usage of \emph{l@ading} marker}%^^A
-% \changes{v3.27a}{2019/10/16}{group removed}%^^A
-% This is the internal implementation of:
-% \cs{AfterClass!}\marg{class name}\marg{code}. Note, that the exclamation
-% mark has not already read. So the arguments are:
-% \begin{description}
-% \item[\texttt{!}:] static exclamation mark, to be ignored.
-% \item[\meta{class name}] mandatory argument
-% \item[\meta{code}:] this argument is processed not by \cs{BeforeClass} but
-% by the internal \cs{@sAfterClass} or \cs{@AfterClass} (see above).
-% \end{description}
-% There are two differences to \cs{@pAfterClass}:
-% \begin{enumerate}
-% \item In case of \cs{\meta{class name}.cls-l@ading} is defined (and not
-% \cs{relax}), while loading a class, it used \cs{AfterAtEndOfClass}
-% instead of \cs{AfterClass} to add \meta{code} to the \emph{lateafter}
-% hook instead of the \emph{after} hook.
-% \item In case of \cs{\meta{class name}.cls-l@ading} is undefined (or
-% \cs{relax}) it also has to test, whether or not the class has already
-% been loaded. If so, it uses \cs{@sAfterClass} to execute the \meta{code}
-% immediately, otherwise it uses \cs{AfterAtEndOfClass} to add the
-% \meta{code} to the \emph{lateafter} hook.
-% \end{enumerate}
-% So it is more like (the not existing) \cs{AfterAtEndOfClass+} than
-% \cs{AfterAtEndOfClass*}.
+% \begin{macro}{\AfterPackage+}
+% \begin{macro}{\AfterPackage!}
+% \cs{scrlfile@AfterPackage} is used to store the original \cs{AfterPackage},
+% before redefining \cs{AfterPackage} to handle the plus and the exclamation
+% mark variant.
% \begin{macrocode}
-\newcommand*{\@xAfterClass}[2]{%
- \@ifundefined{#2.\@clsextension-l@ading}{%
- \@ifclassloaded{#2}{%
- \@sAfterClass
- }{%
- \AfterAtEndOfClass
- }%
- }{%
- \AfterAtEndOfClass
- }%
- {#2}%
-}
-% \end{macrocode}
-% \end{macro}%^^A \@xAfterClass
-% Note that \cs{AfterAtEndOfClass} executed the \meta{code} after each try
-% to load a class, even if the class has already been loaded and you try
-% to load it again.
-% \begin{macrocode}
-\newcommand*{\AfterAtEndOfClass}[1]{%
- \scr@set@load@hook{lateafter}{#1.\@clsextension}}
-% \end{macrocode}
-% \end{macro}%^^A \AfterAtEndOfClass
-% \end{macro}%^^A \AfterClass
-%
-% \begin{macro}{\BeforePackage}
-% This is quite simple. It only has to add code to the \emph{before} hook
-% already known by \cs{BeforeFile}. The arguments are:
-% \begin{description}
-% \item[\meta{package name}:] mandatory argument.
-% \item[\meta{code}:] this argument is processed not by \cs{BeforePackage} but
-% by the internal \cs{scr@set@load@hook} (see above), that will add the code
-% to the \emph{before} hook of file \meta{code}\texttt{.sty} (or whatever the
-% package extension is).
-% \end{description}
-% \begin{macrocode}
-\newcommand*{\BeforePackage}[1]{%
- \scr@set@load@hook{before}{#1.\@pkgextension}}
-% \end{macrocode}
-% \end{macro}%^^A \BeforePackage
-%
-% \begin{macro}{\AfterPackage}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
-% ersetzt}%^^A
-% \begin{macro}{\AfterAtEndOfPackage}
-% These are more complicated. There are five forms:
-% \begin{description}
-% \item[\cs{AfterPackage}] corresponds to \cs{AfterFile}. So the code will be
-% added to the usual \emph{after} hook and the code is exexuted before code
-% added by the package itself using \cs{AtEndOfPackage}. Argument procession
-% will be done by \cs{@AfterPackage}.
-% \item[\cs{AfterAtEndOfPackage}] This uses the \emph{lateafter} hook, which
-% is executed after the package has been loaded completely inclusive the
-% execution of \cs{AtEndOfPackage} code. However, the code will never be
-% executed, if the package will not be loaded (again). But it does nothing,
-% if the package has already been loaded. The arguments are:
-% \begin{description}
-% \item[\meta{package name}] mandatory argument
-% \item[\meta{code}:] this argument is processed not by \cs{BeforePackage}
-% but by the internal \cs{scr@set@loaf@hook} (see above), that will add
-% the code to the \emph{lateafter} hook of file \meta{code}\texttt{.sty}
-% (or whatever the package extension is), or by \cs{@gobble}.
-% \end{description}
-% \item[\cs{AfterPackage*}] like \cs{AfterPackage}, but if loading of the
-% package has already began, the code will be executed immediately. So, if
-% the command is used inside the package it is simply
-% \cs{@firstofone}. Argument procession will be done by \cs{@sAfterPackage}.
-% \item[\cs{AfterPackage+}] like \cs{AfterPackage*}, but the code will be
-% executed immediately only if the package already has been loaded
-% completely or it is used inside \cs{AtEndOfPackage}. So inside the package
-% it is similar to \cs{AtEndOfPackage}. Argument procession will be done by
-% \cs{@pAfterPackage}.
-% \item[\cs{AfterPackage!}] like \cs{AfterPackage+}, but even inside
-% \cs{AtEndOfPackage} the code is executed after every all the
-% \cs{AtEndOfPackage} code. Argument procession will be done by
-% \cs{@xAfterPackage}. (Some package authors interpret this as the star
-% form of \cs{AfterAtEndOfPackage}.)
-% \end{description}
-% \begin{macrocode}
-\newcommand*{\AfterPackage}{%
- \kernel@ifstar {\@sAfterPackage}{%
- \kernel@ifnextchar +\@pAfterPackage{%
- \kernel@ifnextchar !\@xAfterPackage\@AfterPackage
- }%
- }%
-}
-% \end{macrocode}
-% \begin{macro}{\@AfterPackage}
-% This is the internal implementation of:
-% \cs{AfterPackage}\marg{package name}\marg{code}.
-% It uses \cs{scr@set@load@hook} to add \meta{code} to the
-% \emph{after} hook. The second argument will be processed by
-% \cs{scr@set@load@hook}.
-% \begin{macrocode}
-\newcommand*{\@AfterPackage}[1]{%
- \scr@set@load@hook{after}{#1.\@pkgextension}}
-% \end{macrocode}
-% \end{macro}%^^A \@AfterPackage
-% \begin{macro}{\@sAfterPackage}
-% \changes{v3.27a}{2019/10/16}{group removed}%^^A
-% This is the internal implementation of:
-% \cs{AfterPackage*}\marg{package name}\marg{code}.
-% It tests, whether or not \LaTeX{} thinks that the package
-% has already been loaded, but this only means whether or not the package
-% loading has already been started. If so, it immediately executes the next
-% argument. If not, is uses \cs{@AfterPackage} to execute the \meta{code}
-% after loading the package.
-% \begin{macrocode}
-\newcommand*{\@sAfterPackage}[1]{%
- \@ifpackageloaded{#1}{%
- \@secondoftwo
- }{%
- \@AfterPackage
- }%
- {#1}%
-}
-% \end{macrocode}
-% \end{macro}%^^A \@sAfterPackage
-% \begin{macro}{\@pAfterPackage}
-% \changes{v3.09}{2011/03/08}{new (internal)}%^^A
-% \changes{v3.27a}{2019/10/15}{renamed from \cs{@@AfterPackage}}%^^A
-% \changes{v3.27a}{2019/10/16}{usage of \emph{l@ading} marker}%^^A
-% \changes{v3.27a}{2019/10/16}{group removed}%^^A
-% This is the internal implementation of:
-% \cs{AfterPackage+}\marg{package name}\marg{code}.
-% Note, that the plus has not already read. So the arguments are:
-% \begin{description}
-% \item[\texttt{+}:] static plus, to be ignored.
-% \item[\meta{package name}] mandatory argument
-% \item[\meta{code}:] this argument is processed not by \cs{BeforePackage} but
-% by the internal \cs{@sAfterPackage} or \cs{@AfterPackage} (see above).
-% \end{description}
-% Here we cannot use \LaTeX's test, whether or not the package as already been
-% loaded, because it tests only, if loading of the package has already been
-% started. Here we use an internal information of our \emph{l@ading} marker
-% (see \cs{scr@load@hook}). It is as long defined as a file is read while
-% input. If it is undefined (or \cs{relax}) we can use \cs{@sAfterPackage} to
-% either execute \meta{code} immediately or add it to the \emph{after}
-% hook. If is defined (and not \cs{relax}) loading of the package is in
-% progress and \cs{AfterPackage} is used to add \meta{code} to the
-% \emph{after} hook. The effect is, that \meta{code} is executed immediately
-% if loading of \meta{package name} has already been finished and after the
-% package if the loading of the \meta{package name} has not already been
-% finished.
-% \begin{macrocode}
-\newcommand*{\@pAfterPackage}[2]{%
- \@ifundefined{#2.\@pkgextension-l@ading}{%
- \@sAfterPackage
- }{%
- \@AfterPackage
- }%
- {#2}%
-}
-% \end{macrocode}
-% \end{macro}%^^A \@pAfterPackage
-% \begin{macro}{\@xAfterPackage}
-% \changes{v3.09}{2011/03/09}{new (internal)}%^^A
-% \changes{v3.27}{2019/08/26}{using inside package fixed}%^^A
-% \changes{v3.27a}{2019/10/15}{renamed from \cs{@@@AfterPackage}}%^^A
-% \changes{v3.27a}{2019/10/16}{usage of \emph{l@ading} marker}%^^A
-% \changes{v3.27a}{2019/10/16}{group removed}%^^A
-% This is the internal implementation of:
-% \cs{AfterPackage!}\marg{package name}\marg{code}. Note, that the exclamation
-% mark has not already read. So the arguments are:
-% \begin{description}
-% \item[\texttt{!}:] static exclamation mark, to be ignored.
-% \item[\meta{package name}] mandatory argument
-% \item[\meta{code}:] this argument is processed not by \cs{BeforePackage} but
-% by the internal \cs{@sAfterPackage} or \cs{@AfterPackage} (see above).
-% \end{description}
-% There are two differences to \cs{@pAfterPackage}:
-% \begin{enumerate}
-% \item In case of \cs{\meta{package name}.sty-l@ading} is defined (and not
-% \cs{relax}), to while loading a package, it used \cs{@AfterAtEndOfPackage}
-% instead of \cs{AfterPackage} to add \meta{code} to the \emph{lateafter}
-% hook instead of the \emph{after} hook.
-% \item In case of \cs{\meta{package name}.sty-l@ading} is not defined (or
-% \cs{relax}) it also has to test, whether or not the package has already
-% been loaded. If so, it uses \cs{@sAfterPackage} to execute the \meta{code}
-% immediately, otherwise it uses \cs{@AfterAtEndOfPackage} to add the
-% \meta{code} to the \emph{lateafter} hook.
-% \end{enumerate}
-% So it is more like (the not existing) \cs{AfterAtEndOfPackage+} than
-% \cs{AfterAtEndOfPackage*}.
-% \begin{macrocode}
-\newcommand*{\@xAfterPackage}[2]{%
- \@ifundefined{#2.\@pkgextension-l@ading}{%
- \@ifpackageloaded{#2}{%
- \@sAfterPackage
- }{%
- \@AfterAtEndOfPackage
- }%
- }{%
- \@AfterAtEndOfPackage
- }%
- {#2}%
-}
-% \end{macrocode}
-% \end{macro}%^^A \@xAfterPackage
-% \begin{macro}{\@AfterAtEndOfPackage}
-% \changes{v3.27a}{2019/10/15}{new (internal)}
-% \changes{v3.27a}{2019/10/16}{group removed}%^^A
-% Note that until 3.27a \cs{AfterAtEndOfPackage} executed the \meta{code}
-% after each try to load a package, even if the package has already been
-% loaded and you've try to load it again. Since 3.27a this is the
-% functionality of \cs{@AfterAtEndOfPackage}. \cs{AfterAtEndOfPackage} now
-% does not do anything for already loaded packages or while loading the
-% package.
-% \begin{macrocode}
-\newcommand*{\AfterAtEndOfPackage}[1]{%
- \@ifpackageloaded{#1}{%
- \@ifundefined{#1.\@pkgextension-l@ading}{%
- \@gobbletwo
- }{%
- \@AfterAtEndOfPackage
- }%
- }{%
- \@AfterAtEndOfPackage
- }%
- {#1}%
-}
-\newcommand*{\@AfterAtEndOfPackage}[1]{%
- \scr@set@load@hook{lateafter}{#1.\@pkgextension}%
-}
-% \end{macrocode}
-% \end{macro}%^^A \@AfterAtEndOfPackage
-% \end{macro}%^^A \AfterAtEndOfPackage
-% \end{macro}%^^A \AfterPackage
-%
-% \begin{macro}{\PreventPackageFromLoading}
-% \changes{v3.08}{2010/11/04}{New}
-% \changes{v3.11a}{2012/06/13}{write fault error in \cs{MessageBreak} fixed}
-% \changes{v3.12}{2012/06/15}{new star version allowes empty argument with
-% info instead of warning}
-% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
-% ersetzt}%^^A
-% \begin{macro}{\@PreventPackageFromLoading}
-% \changes{v3.12}{2012/06/15}{New (internal)}%^^A
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\@@PreventPackageFromLoading}
-% \changes{v3.12}{2013/11/22}{New (internal)}%^^A
-% \changes{v3.12}{2013/11/22}{\cs{usepackage} before \cs{documentclass}
-% fixed}%^^A
-% \begin{macro}{\scrlfile@excludedpackages}
-% \changes{v3.08}{2010/11/04}{New (internal)}%^^A
-% \begin{macro}{\scrlfile@saved@RequirePackage}
-% \changes{v3.08}{2010/11/04}{New (internal)}%^^A
-% \begin{macrocode}
-\newcommand*{\scrlfile@excludedpackages}{}
-\let\scrlfile@excludedpackages\@empty
-\newcommand*{\scrlfile@saved@RequirePackage}{}
-\newcommand*{\PreventPackageFromLoading}{%
- \kernel@ifstar{\@PreventPackageFromLoading\PackageInfo}%
- {\@PreventPackageFromLoading\PackageWarning}%
-}
-\newcommand*{\@PreventPackageFromLoading}[1]{%
- \kernel@ifnextchar [%]
- {\@@PreventPackageFromLoading#1}{\@@PreventPackageFromLoading#1[]}%
-}
-\newcommand*{\@@PreventPackageFromLoading}{}
-\def\@@PreventPackageFromLoading#1[#2]#3{%
-% \end{macrocode}
-% We do nothing, if the argument was empty:
-% \begin{macrocode}
- \edef\reserved@b{\zap@space#3 \@empty}%
- \ifx \reserved@b\@empty
- #1{scrlfile}{%
- \string\PreventPackageFromLoading\space with empty packages\MessageBreak
- argument ignored%
- }%
- \else
-% \end{macrocode}
-% If the argument was not empty we first need to patch \cs{RequirePackage} and
-% maybe \cs{usepackage} too.
-% \begin{macrocode}
- \ifx\scrlfile@excludedpackages\@empty
- \let\scrlfile@saved@RequirePackage\RequirePackage
- \let\RequirePackage\scrlfile@RequirePackage
- \def\reserved@a##1##{%
- \@latex@error
- {\noexpand \usepackage before \string\documentclass}%
- {\noexpand \usepackage may only appear in the document
- preamble, i.e.,\MessageBreak
- between \noexpand\documentclass and
- \string\begin{document}.}%
- \@gobble}%
- \ifx\reserved@a\usepackage\else
- \ifx\usepackage\scrlfile@saved@RequirePackage\else
- \PackageWarning{scrlfile}{%
- Maybe serious problem: unexpected definition of\MessageBreak
- \string\usepackage
- }%
- \fi
- \let\usepackage\RequirePackage
- \fi
- \fi
-% \end{macrocode}
-% We have to test, if a package was already loaded. Only not yet loaded
-% packages will be added to the exclusion list. Empty arguments will be
-% ignored.
-% \changes{v3.11a}{2012/06/11}{missing \cs{scrlfile@excludedpackages} at
-% redefinition of \cs{scrlfile@excludedpackages} added}%^^A
-% \changes{v3.26}{2018/08/29}{spurious \cs{expandafter} removed}%^^A
-% \begin{macrocode}
- \@for\reserved@a:=\reserved@b\do {%
- \ifx\reserved@a\@empty
- #1{scrlfile}{%
- empty package argument for
- \string\PreventPackageFromLoading\MessageBreak
- ignored%
- }%
- \else
- \expandafter\@ifpackageloaded\expandafter{\reserved@a}{%
- #1{scrlfile}{%
- package `\reserved@a' already loaded.\MessageBreak
- Cannot prevent it from beeing loaded%
- }%
- }{%
- \edef\scrlfile@excludedpackages{\scrlfile@excludedpackages,%
- \reserved@a}%
- \if\relax\detokenize{#2}\relax\else
- \@ifundefined{scrlfile@exclude@package@\reserved@a @do}{%
- \@namedef{scrlfile@exclude@package@\reserved@a @do}{}%
- }{}%
- \expandafter\def
- \csname scrlfile@exclude@package@\reserved@a
- @do\expandafter\expandafter\expandafter\endcsname
- \expandafter\expandafter\expandafter{%
- \csname scrlfile@exclude@package@\reserved@a @do\endcsname
- #2%
- }%
- \fi
- }%
- \fi
- }%
-% \end{macrocode}
-% If the exclusion list is still empty (because all packages has been loaded
-% already), remove the patch:
-% \begin{macrocode}
- \ifx\scrlfile@excludedpackages\@empty
- \ResetPreventPackageFromLoading
- \fi
- \fi
-}
-\@onlypreamble\PreventPackageFromLoading
-% \end{macrocode}
-% \begin{macro}{\ResetPreventPackageFromLoading}
-% \changes{v3.08}{2010/11/04}{New}
-% \begin{macro}{\StorePreventPackageFromLoading}
-% \changes{v3.08}{2010/11/04}{New}
-% These two are very simple
-% \begin{macrocode}
-\newcommand*{\ResetPreventPackageFromLoading}{%
- \let\scrlfile@excludedpackages\@empty
- \ifx\RequirePackage\scrlfile@RequirePackage
- \ifx\usepackage\RequirePackage
- \let\usepackage\scrlfile@saved@RequirePackage
- \fi
- \let\RequirePackage\scrlfile@saved@RequirePackage
- \fi
-}
-\@onlypreamble\ResetPreventPackageFromLoading
-\newcommand*{\StorePreventPackageFromLoading}[1]{%
- \let#1\scrlfile@excludedpackages
-}
-\@onlypreamble\StorePreventPackageFromLoading
-% \end{macrocode}
-% \begin{macro}{\UnPreventPackageFromLoading}
-% \changes{v3.12}{2013/11/22}{New}%^^A
-% \changes{v3.20}{2016/04/12}{\cs{@ifstar} durch \cs{kernel@ifstar}
-% ersetzt}%^^A
-% \begin{macro}{\@UnPreventPackageFromLoading}
-% \changes{v3.12}{2013/11/22}{New (internal)}%^^A
-% This removes packages from the prevent exclude list. The star variant also
-% undefines the instead code.
-% \begin{macrocode}
-\newcommand*{\UnPreventPackageFromLoading}{%
- \kernel@ifstar {\@tempswatrue\@UnPreventPackageFromLoading}%
- {\@tempswafalse\@UnPreventPackageFromLoading}%
-}
-\newcommand*{\@UnPreventPackageFromLoading}[1]{%
- \edef\reserved@b{\zap@space#1 \@empty}%
- \if@tempswa
- \@for\reserved@a:=\reserved@b\do {%
- \ifx\reserved@a\@empty \else
- \ifcsname scrlfile@exclude@package@\reserved@a @do\endcsname
- \expandafter\let
- \csname scrlfile@exclude@package@\reserved@a @do\endcsname
- \undefined
- \fi
- \fi
- }%
- \fi
- \ifcsname scrlfile@excludedpackages\endcsname
- \let\reserved@a\scrlfile@excludedpackages
- \let\scrlfile@excludedpackages\@empty
- \expandafter\@for\expandafter\reserved@c
- \expandafter:\expandafter=\reserved@a
- \do{%
- \ifx\reserved@c\@empty\else
- \@expandtwoargs\in@{,\reserved@c,}{,\reserved@b,}%
- \ifin@
- \else
- \edef\scrlfile@excludedpackages{%
- \scrlfile@excludedpackages,\reserved@c
- }%
- \fi
- \fi
- }%
- \ifx\scrlfile@excludedpackages\@empty\ResetPreventPackageFromLoading\fi
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \begin{macro}{\scrlfile@RequirePackage}
-% \changes{v3.08}{2010/11/04}{New (internal)}
-% \changes{v3.12}{2013/11/22}{tolerate spaces}
-% \changes{v3.12}{2013/11/22}{execute the optional argument of
-% \cs{PreventPackageFromLoading}}
-% This macro will replace \cs{RequirePackage} whenever the exlude list is not
-% empty
-% \begin{macrocode}
-\newcommand*{\scrlfile@RequirePackage}[2][]{%
- \let\reserved@c\@empty
- \let\reserved@d\@empty
- \edef\reserved@b{\zap@space#2 \@empty}%
- \expandafter\@for\expandafter\reserved@b\expandafter:\expandafter=\reserved@b
- \do {%
- \begingroup
- \@tempswatrue
- \@for\reserved@a:=\scrlfile@excludedpackages\do {%
- \ifx\reserved@a\reserved@b
- \@tempswafalse
- \fi
+ \RenewDocumentCommand\AfterPackage{}{%
+ \kernel@ifnextchar +%
+ {\scrlfile@emulatedeprecated{Package}}%
+ {%
+ \kernel@ifnextchar !%
+ {\scrlfile@emulatedeprecated{Package}}%
+ \scrlfile@AfterPackage
}%
- \if@tempswa
- \xdef\reserved@c{\reserved@c,\reserved@b}%
- \else
- \ifx\reserved@b\@empty\else
- \PackageInfo{scrlfile}{Excluding package `\reserved@b'\MessageBreak
- from loading}%
- \@ifundefined{scrlfile@exclude@package@\reserved@b @do}{%
- }{%
- \expandafter\g@addto@macro\expandafter\reserved@d
- \csname scrlfile@exclude@package@\reserved@b @do\endcsname
- }%
- \fi
- \fi
- \endgroup
- }%
- \ifx\reserved@c\@empty
- \let\reserved@a\scr@gobbleopt
- \else
- \edef\reserved@a{\noexpand\scrlfile@saved@RequirePackage[#1]{%
- \expandafter\@gobble\reserved@c\@empty}}%
- \fi
- \expandafter\reserved@d
- \reserved@a
-}
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\scr@gobbleopt}
-% \changes{v3.08}{2010/11/04}{New (internal)}
-% \changes{v3.08a}{2011/02/11}{\cs{@gobbleopt} renamed due to compaibility
-% problems with \texttt{ntheorem}}
-% Eat the optional argument if it exists.
-% \begin{macrocode}
-\newcommand{\scr@gobbleopt}[1][]{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\kernel@ifstar}
-% \changes{v3.20}{2016/04/12}{New (internal)}
-% I hope, the \LaTeX{} kernel will define this command in future. But
-% nevertheless, there are \LaTeX{} kernels in real live without this
-% command. So I do it again if needed:
-% \begin{macrocode}
-\providecommand*\kernel@ifstar[1]{\kernel@ifnextchar*{\@firstoftwo{#1}}}
-% \end{macrocode}
-% \end{macro}%^^A \kernel@ifstar
%
-% \begin{macro}{\BeforeClosingMainAux}
-% \changes{v2.95}{2002/09/03}{new}
-% \begin{macro}{\AfterReadingMainAux}
-% \changes{v3.03}{2009/03/25}{new}
-% These are completly different. First we have to establish a new hook
-% at \cs{end\{document\}}, just after closing the group and after the
-% final \cs{clearpage}.
+% \begin{macro}{\scrlfile@emulatedeprecated}
+% \changes{v3.32}{2020/09/11}{new internal command}
+% This emulates \cs{AfterClass+}, \cs{AfterPackage+}, \cs{AfterClass!} and
+% \cs{AfterPackage!} using \cs{AfterAtEndOfClass} or
+% \cs{AfterAtEndOfPackage}. Note, that both, the plus and the exclamation mark
+% variants, are emulated by the star variant of \cs{AfterAtEndOfClass}
+% resp. \cs{AfterAtEndOfPackage}. So the emulation is not perfect.
% \begin{macrocode}
-\AtEndDocument{%
- \let\scr@saved@checkend=\@checkend
- \renewcommand*{\@checkend}[1]{%
- \def\reserved@a{#1}\def\reserved@b{document}%
- \scr@saved@checkend{#1}%
- \ifx\reserved@a\reserved@b
- \let\scr@saved@clearpage=\clearpage
- \renewcommand*{\clearpage}{\scr@saved@clearpage
- \scr@hook@bcma
- \scr@restore@newpage
- \let\clearpage=\scr@saved@clearpage}%
- \fi%
- \let\scr@saved@dofilelist\@dofilelist
- \def\@dofilelist{%
- \scr@hook@acma
- \let\@dofilelist\scr@saved@dofilelist
- \scr@saved@dofilelist
+ \newcommand*{\scrlfile@emulatedeprecated}[2]{%
+ \PackageWarning{scrlfile}{%
+ emulating deprecated \expandafter\string\csname After#1#2\endcsname
+ \space by\MessageBreak
+ \expandafter\string\csname AfterAtEndOf#1*\endcsname.\MessageBreak
+ Note, this may fail, so you should not use\MessageBreak
+ \expandafter\string\csname After#1#2\endcsname
}%
- }%
-}
-% \end{macrocode}
-% \begin{macro}{\scr@saved@checkend}
-% \changes{v2.95}{2002/09/03}{new (internal)}
-% \begin{macro}{\scr@saved@dofilelist}
-% \changes{v3.03}{2009/03/25}{new}
-% You may see above, that we need save-to macros.
-% \begin{macrocode}
-\newcommand*{\scr@saved@checkend}{}
-\newcommand*{\scr@saved@dofilelist}{}
+ \csname AfterAtEndOf#1\endcsname*%
+ }
% \end{macrocode}
% \end{macro}
-% \end{macro}
-% \begin{macro}{\scr@redefine@newpage}
-% \changes{v3.00}{2008/07/09}{new (internal)}
-% Some classes (e.g. \textsf{letter}) write output to the aux file.
-% Because of this, redefinition of \cs{newpage} will only be done, if
-% \cs{BeforeClosingMainAux} is used.
-% \begin{macro}{\scr@saved@newpage}
-% \changes{v3.00}{2008/07/09}{new (internal)}
-% And \cs{newpage} will be restored after the hook.
-% \begin{macro}{\scr@restore@newpage}
+%
% \begin{macrocode}
-\newcommand*{\scr@redefine@newpage}{%
- \let\scr@saved@newpage\newpage
- \def\scr@restore@newpage{%
- \renewcommand*{\newpage}{%
- \PackageWarningNoLine{%
- scrlfile%
- }{%
- \string\newpage\space at main aux file!\MessageBreak
- You have output material at the main aux file.\MessageBreak
- Note, that the \string\BeforeClosingMainAux\space commands\MessageBreak
- are processed before the output from aux file%
- }%
- \let\newpage\scr@saved@newpage
- \newpage
- }%
- }%
- \renewcommand*{\newpage}{%
- \PackageError{%
- scrlfile%
- }{%
- \string\newpage\space at \string\BeforeClosingMainAux
- }{%
- You should never use \string\newpage\space or
- \string\clear(double)page or other output material at the\MessageBreak
- argument of \string\BeforeClosingMainAux!\MessageBreak
- If you'll continue, the \string\newpage\space will be ignored to
- avoid corruption of\MessageBreak
- every prior use of \string\BeforeClosingMainAux.
- }%
- }%
}
-\newcommand*{\scr@restore@newpage}{}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \begin{macro}{\scr@hook@bcma}
-% \changes{v2.95}{2002/09/03}{new (internal)}
-% \begin{macro}{\scr@hook@acma}
-% \changes{v3.03}{2009/03/25}{new (internal)}
-% We also need macros, that saves the commands at the hooks and are
-% extendable using \cs{g@addto@macro}.
-% \begin{macrocode}
-\newcommand*{\scr@hook@bcma}{}
-\newcommand*{\scr@hook@acma}{}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% Now we are able to write the user command. Here we also warn, if we detect
-% one more \cs{newpage}\,---\,maybe at a \cs{clearpage} or
-% \cs{cleardoublepage}.
+% \end{option}
+%
+% Now, we just have to execute and process the options.
% \begin{macrocode}
-\newcommand*{\BeforeClosingMainAux}{%
- \ifx\scr@hook@bcma\@empty
- \gdef\scr@hook@bcma{%
- \renewcommand*{\BeforeClosingMainAux}[1]{####1}%
- \let\protected@write\protected@immediate@write
- \scr@redefine@newpage
- }%
- \fi
- \g@addto@macro\scr@hook@bcma%
-}
-\newcommand*{\AfterReadingMainAux}{%
- \ifx\scr@hook@acma\@empty
- \gdef\scr@hook@acma{%
- \renewcommand*{\AfterReadingMainAux}[1]{####1}%
- \let\protected@write\protected@immediate@write
- }%
- \fi
- \g@addto@macro\scr@hook@acma%
-}
+\ExecuteOptions{}
+\ProcessOptions\relax
% \end{macrocode}
-% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\protected@immediate@write}
-% Like \LaTeX{} kernel's |\protected@write| but using |\immediate\write|. In
-% this case it is even not a good idea to protect |\thepage|!
+% Last but not least this is a \KOMAScript{} package, so we also define the
+% \KOMAScript{} logo:
% \begin{macrocode}
-\long\def\protected@immediate@write#1#2#3{%
- \begingroup
- #2%
- \let\protect\@unexpandable@protect
- \edef\reserved@a{\immediate\write#1{#3}}%
- \reserved@a
- \endgroup
- \if@nobreak\ifvmode\nobreak\fi\fi
-}
+\RequirePackage{scrlogo}
% \end{macrocode}
-% \end{macro}
%
% \Finale
%
-% \iffalse
-%</scrlfile>
-%<*load>
-% Used at \KOMAScript{} classes.
-% \begin{macrocode}
-\RequirePackage{scrlfile}[%
-%!KOMAScriptVersion
-]
-% \end{macrocode}
-%</load>
-% \fi
-%
-\endinput
+% \endinput
%
-% end of file `scrlfile.dtx'
-
-%%% Local Variables:
-%%% mode: doctex
-%%% TeX-master: t
-%%% End:
+% Local Variables:
+% mode: doctex
+% TeX-master: t
+% End:
diff --git a/Master/texmf-dist/source/latex/koma-script/scrlogo.dtx b/Master/texmf-dist/source/latex/koma-script/scrlogo.dtx
index 14c5f0b6c9f..ceea050dca4 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrlogo.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrlogo.dtx
@@ -1,8 +1,7 @@
-% \CheckSum{9}
-% \iffalse meta-comment
+% \iffalse^^A meta-comment
% ======================================================================
% scrlogo.dtx
-% Copyright (c) Markus Kohm, 2002-2017
+% Copyright (c) Markus Kohm, 2002-2020
%
% This work may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, version 1.3c of the license.
@@ -18,7 +17,7 @@
% This work consists of the file `scrlogo.dtx' at least.
% ----------------------------------------------------------------------
% scrlogo.dtx
-% Copyright (c) Markus Kohm, 2002-2017
+% Copyright (c) Markus Kohm, 2002-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -34,42 +33,45 @@
%
% Dieses Werk besteht mindestens aus der Datei `scrlogo.dtx'.
% ======================================================================
-% \fi
-%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
%
-% \iffalse
-%%% From File: $Id: scrlogo.dtx 2640 2017-05-08 09:36:55Z kohm $
+%%% From File: $Id: scrlogo.dtx 3527 2020-09-11 09:44:32Z kohm $
%<*dtx>
-% \fi
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2017-05-08 11:36:55 +0200 (Mon, 08 May 2017) $
+ \filedate$Date: 2020-09-11 11:44:32 +0200 (Fri, 11 Sep 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
\filerevision$Revision: 2631 $
\edef\reserved@a{%
\noexpand\endgroup
\noexpand\ProvidesFile{scrlogo.dtx}%
[\filedate\space\filerevision\space
- KOMA-Script package source (Logo)]
+ KOMA-Script package source
}%
\reserved@a
-% \iffalse
+%</dtx>
+%<*dtx|package>
+%<package>\ProvidesPackage{scrlogo}[%
+%!KOMAScriptVersion
+%<package> package
+ (logo)]
+%</dtx|package>
+%<*dtx>
+\ifx\documentclass\undefined
+ \ifx\ifTopLevel\undefined
+ \input scrdocstrip.tex
+ \@@input scrkernel-version.dtx
+ \@@input scrstrip.inc
+ \KOMAdefVariable{COPYRIGHTFROM}{2002}
+ \generate{\usepreamble\defaultpreamble
+ \file{scrlogo.sty}{\from{scrlogo.dtx}{package,logo}}%
+ }
+ \@@input scrstrop.inc
+ \fi
+\else
+ \let\endbatchfile\relax
+\fi
+\endbatchfile
\documentclass[parskip=half-]{scrdoc}
\usepackage[english,ngerman]{babel}
\CodelineIndex
@@ -85,7 +87,7 @@
\DocInput{\filename}
\end{document}
%</dtx>
-% \fi
+% \fi^^A meta-comment
%
% \selectlanguage{ngerman}
%
diff --git a/Master/texmf-dist/source/latex/koma-script/scrmain.ins b/Master/texmf-dist/source/latex/koma-script/scrmain.ins
index dbd131361e7..e53a87c7912 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrmain.ins
+++ b/Master/texmf-dist/source/latex/koma-script/scrmain.ins
@@ -1,6 +1,6 @@
% ======================================================================
% scrmain.ins
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -18,7 +18,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrmain.ins
-% Copyright (c) Markus Kohm, 2002-2019
+% Copyright (c) Markus Kohm, 2002-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -35,7 +35,7 @@
% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
% ======================================================================
-% $Id: scrmain.ins 3353 2019-11-04 17:35:20Z kohm $
+% $Id: scrmain.ins 3527 2020-09-11 09:44:32Z kohm $
% ---------- KOMA-Script default docstrip declarations -----------------
@@ -157,7 +157,7 @@
\file{scrreprt.cls}{%
\from{scrkernel-version.dtx}{class,report}%
\from{scrkernel-basics.dtx}{class,load}%
- \from{scrkernel-listsof.dtx}{class,book,prepare}%
+ \from{scrkernel-listsof.dtx}{class,report,prepare}%
\from{scrkernel-tocstyle.dtx}{class,report,prepare}%
\from{scrkernel-sections.dtx}{class,report,prepare}%
\from{scrkernel-compatibility.dtx}{class,report,init}%
@@ -206,7 +206,7 @@
\file{scrartcl.cls}{%
\from{scrkernel-version.dtx}{class,article}%
\from{scrkernel-basics.dtx}{class,load}%
- \from{scrkernel-listsof.dtx}{class,book,prepare}%
+ \from{scrkernel-listsof.dtx}{class,article,prepare}%
\from{scrkernel-tocstyle.dtx}{class,article,prepare}%
\from{scrkernel-sections.dtx}{class,article,prepare}%
\from{scrkernel-compatibility.dtx}{class,article,init}%
@@ -478,7 +478,6 @@
\from{scrkernel-basics.dtx}{package,prepare,koma}%
\from{scrkernel-basics.dtx}{package,option,koma}%
\from{scrkernel-fonts.dtx}{package,option,scrkbase}%
- \from{scrlfile.dtx}{package,load}%
\from{scrkernel-basics.dtx}{package,body,koma}%
\from{scrkernel-fonts.dtx}{package,body,scrkbase}%
\from{scrlogo.dtx}{logo}%
@@ -487,13 +486,13 @@
% --- additional package batches (maybe used with other classes, too) --
+\batchinput{scrlogo.dtx}% scrlogo.sty
\batchinput{scrkernel-typearea.dtx}% typearea.sty
\batchinput{scrkernel-basics.dtx}% scrbase.sty
\batchinput{scrhack.dtx}% scrhack.sty and the hak files
\batchinput{scrtime.dtx}% scrtime.sty, scrdate.sty
\batchinput{scrlfile.dtx}% scrlfile.sty
\batchinput{scraddr.dtx}% scraddr.sty
-\batchinput{scrpage.dtx}% scrpage2.sty
\batchinput{tocbasic.dtx}% tocbasic.sty
\batchinput{scrlayer.dtx}% scrlayer.sty, scrlayer-scrpage.sty ...
\batchinput{scrwfile.dtx}% scrwfile.sty
diff --git a/Master/texmf-dist/source/latex/koma-script/scrpage.dtx b/Master/texmf-dist/source/latex/koma-script/scrpage.dtx
deleted file mode 100644
index 36951ba3901..00000000000
--- a/Master/texmf-dist/source/latex/koma-script/scrpage.dtx
+++ /dev/null
@@ -1,2261 +0,0 @@
-% \CheckSum{2389}
-% \iffalse
-% ======================================================================
-% scrpage.dtx
-% Copyright (c) Markus Kohm, 1995-2019
-%
-% This file is part of the LaTeX2e KOMA-Script bundle.
-%
-% This work may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3c of the license.
-% 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 and of this work.
-%
-% This work has the LPPL maintenance status "author-maintained".
-%
-% The Current Maintainer and author of this work is Markus Kohm.
-%
-% This work consists of all files listed in manifest.txt.
-% ----------------------------------------------------------------------
-% scrpage.dtx
-% Copyright (c) Markus Kohm, 1995-2019
-%
-% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
-% Version 1.3c, verteilt und/oder veraendert werden.
-% Die neuste Version dieser Lizenz ist
-% http://www.latex-project.org/lppl.txt
-% und Version 1.3c ist Teil aller Verteilungen von LaTeX
-% Version 2005/12/01 oder spaeter und dieses Werks.
-%
-% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained"
-% (allein durch den Autor verwaltet).
-%
-% Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm.
-%
-% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
-% ======================================================================
-% \fi
-%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
-%
-% \iffalse
-%%% From File: $Id: scrpage.dtx 3403 2019-11-23 15:38:36Z kohm $
-%<scrpage>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
-%<*dtx>
-\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
-\begingroup
- \def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-11-23 16:38:36 +0100 (Sat, 23 Nov 2019) $
- \def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
- \filerevision$Revision: 2631 $
- \edef\reserved@a{%
- \noexpand\endgroup
- \noexpand\ProvidesFile{scrpage.dtx}%
- [\filedate\space\filerevision\space
- KOMA-Script package source
- }%
-\reserved@a
-%</dtx>
-%<*dtx|scrpage>
-%<scrpage>\ProvidesPackage{scrpage2}[%
-%!KOMAScriptVersion
-%<scrpage> package
- (page head and foot)]
-%</dtx|scrpage>
-%<*dtx>
-\ifx\documentclass\undefined
- \input scrdocstrip.tex
- \@@input scrkernel-version.dtx
- \@@input scrstrip.inc
- \KOMAdefVariable{COPYRIGHFROM}{1995}
- \generate{\usepreamble\defaultpreamble
- \file{scrpage2.sty}{%
- \from{scrpage.dtx}{scrpage}%
- \from{scrlogo.dtx}{logo}%
- }%
- }
- \@@input scrstrop.inc
-\else
- \let\endbatchfile\relax
-\fi
-\endbatchfile
-\documentclass{scrdoc}
-\usepackage[ngerman,english]{babel}
-\CodelineIndex
-\RecordChanges
-\GetFileInfo{scrpage.dtx}
-\title{\KOMAScript{} \partname\ \texttt{\filename}\thanks{This file has
- revision number \fileversion, last revised \filedate.}}
-\date{\filedate}
-\author{Markus Kohm}
-\begin{document}
- \maketitle
- \tableofcontents
- \DocInput{\filename}
-\end{document}
-%</dtx>
-% \fi
-%
-% \section{Page Layout Package}
-%
-% This is the \KOMAScript{} package \textsf{scrpage2}. You may find the user
-% documentation of this package in the English \KOMAScript{} guide,
-% \texttt{scrguien.pdf}, and in the German \KOMAScript{} guide,
-% \texttt{scrguide.pdf}.
-%
-% \StopEventually{\PrintIndex\PrintChanges}
-%
-% \section{Implementation}
-%
-% Currently this package doesn't share any code but the \KOMAScript{} logo
-% with other packages. So all the code of this package but the implementation
-% of the \KOMAScript{} logo is at this file and their is nor more code at this
-% file.
-%
-% \changes{v3.24}{2017/05/08}{warning about obsolete package added}
-% \begin{macrocode}
-%<*scrpage>
-\PackageWarning{scrpage2}{usage of obsolete package!\MessageBreak
- Package `scrpage2' is obsolete.\MessageBreak
- You should not longer use package `scrpage2'.\MessageBreak
- You should replace usage of package `scrpage2'\MessageBreak
- by `scrlayer-scrpage'}
-% \end{macrocode}
-% \changes{v1.1}{1995/06/27}{\cs{hbox to} changed into \cs{hb@xt@}.}
-% \changes{v2.2c}{2007/07/23}{a lot of \% added and removed}
-%
-% \subsection{Options}
-% \begin{option}{headinclude}
-% \changes{v2.3}{2008/12/08}{obsolete}%
-% \begin{option}{headexclude}
-% \changes{v2.3}{2008/12/08}{obsolete}%
-% \begin{option}{footinclude}
-% \changes{v2.3}{2008/12/08}{obsolete}%
-% \begin{option}{footexclude}
-% \changes{v2.3}{2008/12/08}{obsolete}%
-% \texttt{scrpage} has known some options. They are similar to the
-% old \KOMAScript{} classes. To work with and without the \KOMAScript{}
-% classes their definitions are not quite simple.
-% \begin{macrocode}
-\newcommand*{\@Pass@Obsolete@Option@To@Typearea}[1]{%
- \@expandtwoargs\in@{,\CurrentOption,}{,\@curroptions,}%
- \ifin@
- \PackageWarningNoLine{scrpage2}{%
- deprecated passing option `\CurrentOption' to scrpage2.\MessageBreak
- If you are using package typearea or\MessageBreak
- a KOMA-Script class since version 3.00\MessageBreak
- you may use `\string\KOMAoptions{#1}' and\MessageBreak
- remove passing `\CurrentOption' to scrpage2%
- }%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname KOMAoptions\endcsname\relax
- \PassOptionsToPackage{#1}{typearea}%
- \else
- \KOMAoptions{#1}\csname relcalctypearea\endcsname
- \fi
- \fi
-}
-\DeclareOption{headinclude}{%
- \@Pass@Obsolete@Option@To@Typearea{headinclude}%
-}
-\DeclareOption{headexclude}{%
- \@Pass@Obsolete@Option@To@Typearea{headinclude=false}%
-}
-\DeclareOption{footinclude}{%
- \@Pass@Obsolete@Option@To@Typearea{footinclude}%
-}
-\DeclareOption{footexclude}{%
- \@Pass@Obsolete@Option@To@Typearea{footinclude=false}%
-}
-% \end{macrocode}
-% We do so, because we want so set |headinclude|, |footinclude| by
-% default at old version (see below)!
-% \end{option}
-% \end{option}
-% \end{option}
-% \end{option}
-%
-% We have additional options designed for the additional interface.
-% \begin{option}{mpinclude}
-% \changes{v2.8q}{2002/03/28}{New option}
-% \begin{option}{mpexclude}
-% \changes{v2.8q}{2002/03/28}{New option}
-% There are documents where the head and foot should span not only the
-% text but also the marginpar. We have an option to do this at
-% initialization. This option corresponds with the option of package
-% \texttt{typearea} and the classes.
-% \begin{macro}{\if@mincl}
-% \begin{macro}{\@mincltrue}
-% \begin{macro}{\@minclfalse}
-% \changes{v2.2g}{2008/11/19}{Test fixed}
-% \begin{macrocode}
-\@ifundefined{@mincltrue}{\newif\if@mincl}{}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \begin{macrocode}
-\DeclareOption{mpinclude}{\@mincltrue}
-\DeclareOption{mpexclude}{\@minclfalse}
-% \end{macrocode}
-% \end{option}
-% \end{option}
-%
-% Other new options redefine macros, so we have to define them first.
-% \begin{macro}{\scr@headabove@linethickness}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scr@headbelow@linethickness}
-% \changes{v2.0}{2001/03/30}{New}
-% \begin{macro}{\scr@footabove@linethickness}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scr@footbelow@linethickness}
-% \changes{v2.0}{2001/04/20}{New}
-% These macros define the thickness of the line above and below the head
-% and the foot.
-% \begin{macrocode}
-\newcommand*{\scr@headabove@linethickness}{0pt}
-\newcommand*{\scr@headbelow@linethickness}{0pt}
-\newcommand*{\scr@footabove@linethickness}{0pt}
-\newcommand*{\scr@footbelow@linethickness}{0pt}
-% \end{macrocode}
-% \begin{macro}{\scr@headabove@linelength}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scr@headbelow@linelength}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scr@footabove@linelength}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scr@footbelow@linelength}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@headabove@linelength}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@headbelow@linelength}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@footabove@linelength}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@footbelow@linelength}
-% \changes{v2.0}{2001/04/20}{New}
-% Because we want to have the ``line definitions'' at one place, we
-% also define the length of the lines here. We have own length at to
-% be used at pagestyle \texttt{scrplain}.
-% \begin{macrocode}
-\newcommand*{\scr@headabove@linelength}{\@headwidth}
-\newcommand*{\scr@headbelow@linelength}{\@headwidth}
-\newcommand*{\scr@footabove@linelength}{\@footwidth}
-\newcommand*{\scr@footbelow@linelength}{\@footwidth}
-\newcommand*{\scrplain@headabove@linelength}{0pt}
-\newcommand*{\scrplain@headbelow@linelength}{0pt}
-\newcommand*{\scrplain@footabove@linelength}{0pt}
-\newcommand*{\scrplain@footbelow@linelength}{0pt}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{option}{headtopline}
-% \changes{v2.0}{2001/04/20}{New option}
-% \begin{option}{headsepline}
-% \changes{v2.0}{2001/04/20}{New option}
-% \begin{option}{footsepline}
-% \changes{v2.0}{2001/04/20}{New option}
-% \begin{option}{footbotline}
-% \changes{v2.0}{2001/04/20}{New option}
-% \begin{option}{plainheadtopline}
-% \changes{v2.0}{2001/04/20}{New option}
-% \begin{option}{plainheadsepline}
-% \changes{v2.0}{2001/04/20}{New option}
-% \begin{option}{plainfootsepline}
-% \changes{v2.0}{2001/04/20}{New option}
-% \begin{option}{plainfootbotline}
-% \changes{v2.0}{2001/04/20}{New option}
-% The thickness can be set by four simple options:
-% \begin{macrocode}
-\DeclareOption{headtopline}{%
- \renewcommand*{\scr@headabove@linethickness}{.4pt}
- \PassOptionsToPackage{headinclude}{typearea}}
-\DeclareOption{headsepline}{%
- \renewcommand*{\scr@headbelow@linethickness}{.4pt}
- \PassOptionsToPackage{headinclude}{typearea}}
-\DeclareOption{footsepline}{%
- \renewcommand*{\scr@footabove@linethickness}{.4pt}
- \PassOptionsToPackage{footinclude}{typearea}}
-\DeclareOption{footbotline}{
- \renewcommand*{\scr@footbelow@linethickness}{.4pt}
- \PassOptionsToPackage{footinclude}{typearea}}
-\DeclareOption{plainheadtopline}{%
- \renewcommand*{\scrplain@headabove@linelength}{\scr@headabove@linelength}
- \PassOptionsToPackage{headinclude}{typearea}}
-\DeclareOption{plainheadsepline}{%
- \renewcommand*{\scrplain@headbelow@linelength}{\scr@headbelow@linelength}
- \PassOptionsToPackage{headinclude}{typearea}}
-\DeclareOption{plainfootsepline}{%
- \renewcommand*{\scrplain@footabove@linelength}{\scr@footabove@linelength}
- \PassOptionsToPackage{footinclude}{typearea}}
-\DeclareOption{plainfootbotline}{
- \renewcommand*{\scrplain@footbelow@linelength}{\scr@footbelow@linelength}
- \PassOptionsToPackage{footinclude}{typearea}}
-% \end{macrocode}
-% \end{option}
-% \end{option}
-% \end{option}
-% \end{option}
-% \end{option}
-% \end{option}
-% \end{option}
-% \end{option}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\hfline@adjust}
-% \changes{v2.0f}{2001/06/23}{New}
-% \begin{option}{ilines}
-% \changes{v2.0f}{2001/06/23}{New}
-% \begin{option}{clines}
-% \changes{v2.0f}{2001/06/23}{New}
-% \begin{option}{olines}
-% \changes{v2.0f}{2001/06/23}{New}
-% At Version 2 lines may be inner adjusted (0), centered (1) or outer
-% adjusted (2):
-% \begin{macrocode}
-\newcommand*{\hfline@adjust}{1}
-\DeclareOption{ilines}{\renewcommand*{\hfline@adjust}{0}}
-\DeclareOption{clines}{\renewcommand*{\hfline@adjust}{1}}
-\DeclareOption{olines}{\renewcommand*{\hfline@adjust}{2}}
-% \end{macrocode}
-% \end{option}
-% \end{option}
-% \end{option}
-% \end{macro}
-%
-% \begin{option}{automark}
-% \changes{v2.0b}{2001/05/31}{use \cs{AtEndOfPackage} to run not yet
-% defined macro}
-% \begin{option}{manualmark}
-% \changes{v2.0b}{2001/05/31}{use \cs{AtEndOfPackage} to run not yet
-% defined macro}
-% \changes{v2.0i}{2001/08/17}{don't ignore oneside any longer}
-% At version 2 we want to distinguish between running headline and
-% static headline not only using different pagestyles. We do this with
-% options and commands. But here only the options are defined.
-% \begin{macrocode}
-\DeclareOption{automark}{%
- \AtEndOfPackage{\if@twoside%
- \if@chapter\automark[section]{chapter}%
- \else\automark[subsection]{section}\fi%
- \else%
- \if@chapter\automark{chapter}\else\automark{section}\fi%
- \fi}}
-\DeclareOption{manualmark}{\AtEndOfPackage{\manualmark}}
-% \end{macrocode}
-% \end{option}
-% \end{option}
-%
-% \begin{option}{autoonesize}
-% \changes{v2.0i}{2001/08/17}{New}
-% \begin{macro}{\if@autooneside}
-% \changes{v2.0i}{2001/08/17}{New}
-% If the optional argument of \cs{automark} should be irgnored at
-% onside mode, use this option:
-% \begin{macrocode}
-\newif\if@autooneside\@autoonesidefalse
-\DeclareOption{autooneside}{\@autoonesidetrue}
-% \end{macrocode}
-% \end{macro}
-% \end{option}
-%
-% \begin{option}{markuppercase}
-% \changes{v2.0c}{2001/06/07}{New}
-% \begin{option}{markusedcase}
-% \changes{v2.0c}{2001/06/07}{New}
-% For use of running headlines there are also options to say ``class
-% uses upper case at the automatic marks'' or ``class use same case at
-% the automatic marks like used writing the heading''.
-% \begin{macrocode}
-\DeclareOption{markuppercase}{\let\MakeMarkcase\MakeUppercase}
-\DeclareOption{markusedcase}{\let\MakeMarkcase\@empty}
-% \end{macrocode}
-% \end{option}
-% \end{option}
-%
-% \begin{macro}{\scr@nouppercase}
-% \changes{v2.0j}{2001/08/18}{New}
-% \begin{option}{nouppercase}
-% \changes{v2.0j}{2001/08/18}{New}
-% Sometimes scrpage may be used with a class, which uses
-% \cs{uppercase} or \cs{MakeUppercase} at \cs{markboth} or
-% \cs{markright}. But the author does not want upper case at the
-% headlines. So we define an option, that simply deaktivates
-% \cs{uppercase} and \cs{MakeUppercase} at all heads and foots,
-% defined by scrpage2.
-% \begin{macrocode}
-\newcommand*{\scr@nouppercase}{}
-\DeclareOption{nouppercase}{\renewcommand*{\scr@nouppercase}{%
- \let\uppercase\relax\let\MakeUppercase\relax
- \expandafter\let\csname MakeUppercase \endcsname\relax}
- \ifx\MakeMarkcase\MakeUppercase
- \PackageWarning{scrpage2}{%
- Option 'markuppercase' will be ignored.\MessageBreak%
- You shouldn't use option 'markuppercase' together\MessageBreak%
- with option 'nouppercase'}
- \let\MakeMarkcase\@empty
- \fi}
-% \end{macrocode}
-% \end{option}
-% \end{macro}
-%
-% \begin{option}{komastyle}
-% \begin{option}{standardstyle}
-% At version 2 there is an predefined pagestyle ``scrheadings''. With
-% the two options you may decide, wether it has to behave like
-% ``headings'' at the standard classes or the KOMA-Script classes.
-% The macro saves the name of the style.
-% \begin{macrocode}
-\DeclareOption{komastyle}{\def\scrheadings@style{koma}
- \@ifundefined{MakeMarkcase}{\let\MakeMarkcase\relax}{}}
-\DeclareOption{standardstyle}{\def\scrheadings@style{standard}
- \@ifundefined{MakeMarkcase}{\let\MakeMarkcase\MakeUppercase}{}}
-% \end{macrocode}
-% \end{option}
-% \end{option}
-%
-%
-% We don't need default options.
-% \begin{macrocode}
-\ExecuteOptions{}
-% \end{macrocode}
-% But you may set other Options:
-% \begin{macrocode}
-\ProcessOptions\relax
-% \end{macrocode}
-%
-%
-% \subsection{Some Initialisation}
-%
-% For easier handling of the differences between article-, report- and
-% book-classes we define some more switches.
-%
-% \begin{macro}{\if@chapter}
-% \changes{v2.1b}{2003/05/31}{more save test}
-% First distinguish between article and others.
-% \begin{macrocode}
-\newif\if@chapter
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname chapter\endcsname\relax
- \@chapterfalse
-\else
- \@chaptertrue
-\fi
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\if@mainmatter}
-% \changes{v1.2}{1995/07/08}{Definition changed}
-% \changes{v2.1b}{2003/05/31}{more save test}
-% \changes{v2.2d}{2007/03/13}{additional \cs{if@mainmatter} test}
-% \changes{v2.2g}{2008/11/19}{usage of \cs{if@mainmatter} at message
-% removed}
-% Next distinguish between matter- and nomatter-classes.
-% \begin{macrocode}
-\def\@tempa{\newif\if@mainmatter\@mainmattertrue}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname mainmatter\endcsname\relax
-\else
- \@ifundefined{@mainmattertrue}{%
- \PackageWarningNoLine{scrpage2}{%
- \string\mainmatter\space defined without
- \expandafter\string\csname if@mainmatter\endcsname!\MessageBreak
- This switch is obligatory for scrpage2 to omit\MessageBreak
- running head chapter numbers in front and\MessageBreak
- back matter and will be defined now%
- }%
- }{%
- \let\@tempa\relax
- }%
-\fi
-\@tempa
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Predefinitions}
-% There are some commands, you can use at pagestyle-definition.
-%
-% \begin{macro}{\headmark}
-% This macro is |\rightmark| or |\leftmark|. But outside
-% pagestyle-definition it's nothing.
-% \begin{macrocode}
-\let\headmark\relax
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pagemark}
-% This macro is the number of the page at the pagenumberfont:
-% \begin{macrocode}
-\DeclareRobustCommand\pagemark{{\pnumfont\thepage}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Expert-Pagestyle-Definition-Interface}
-% The pagestyle-definition-interface for experts is not as easy as the
-% simple interface we'll define later. But it's more flexible. We'll
-% later use it to define the pagestyle-definition-interface for users.
-%
-% \begin{macro}{\if@automark}
-% \changes{v2.1}{2002/10/30}{New switch}
-% \begin{macro}{\@automarktrue}
-% \begin{macro}{\@automarkfalse}
-% We need this switch to decide to switch on or off \cs{@mkboth} at the
-% pagestyles.
-% \begin{macrocode}
-\newif\if@automark\@automarkfalse
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\defpagestyle}
-% First we define the simple definition-interface. There's no test, if
-% the pagestyle's defined twice.
-%
-% First there has to be the definition of head and foot.
-% \begin{macrocode}
-\def\defpagestyle{%
-% \end{macrocode}
-% We have to decide, whether it is a my-version or not:
-% \begin{macrocode}
- \@ifstar
- {\@defpagestyle[-]}%
- {\@defpagestyle[+]}}
-% \end{macrocode}
-% \begin{macro}{\@defpagestyle}
-% Now the we can define the head and the foot.
-% \changes{v1.0b}{1995/05/25}{Dot deleted after number at
-% chapter- and sectionmark}
-% \changes{v1.0b}{1995/05/25}{Use CJK at \cs{chaptermark},
-% \cs{sectionmark} and \cs{subsectionmark}}
-% \changes{v1.3e}{2008/02/29}{usage of \cs{if@mainmatter} fixed}
-% \changes{v2.0}{2001/04/20}{Version 2 uses \cs{automark} and
-% \cs{manualmark}, so star and non-star version are same}
-% \changes{v2.1a}{2002/10/30}{Use \cs{if@automark}}
-% \changes{v2.2d}{2007/06/14}{Support of article-classes with
-% \cs{if@mainmatter}}
-% \changes{v2.5}{2010/04/22}{moved \cs{if@twoside} inside of definition}
-% Before version 2.5 we have distinguished one- and two-side definitions while
-% loading the package and have had all the definitions of \cs{@mkboth},
-% \cs{chaptermark}, \cs{sectionmark}, and \cs{subsectionmark} at the
-% definition of the page style.
-% Since version~2.5 the difference of one- and two-side is made at the
-% definition of the heads and foots themself and \cs{chaptermark},
-% \cs{sectionmark}, and \cs{subsectionmark} are defined by \cs{automark} and
-% \cs{manualmark}. So the code is much easier.
-% \begin{macrocode}
-\def\@defpagestyle[#1]#2#3#4{%
- \expandafter\def\csname ps@#2\endcsname{%
- \if@automark\let\@mkboth\markboth\else\let\@mkboth\@gobbletwo\fi
- \def@head#3
- \def@foot#4
- }%
-}
-% \end{macrocode}
-%
-% \begin{macro}{\def@head}
-% \changes{v2.5}{2010/04/22}{new (internal)}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\def@@head}
-% \changes{v2.0}{2001/04/20}{Thickness and length of the lines are
-% optional}
-% \changes{v2.0j}{2001/08/18}{Use of \cs{scr@nouppercase}}
-% \changes{v2.5}{2010/04/22}{new (internal)}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% This was real simple, but we already have to do the real definition
-% of the heads and foots. First the head:
-% \begin{macrocode}
-\def\def@head{%
- \kernel@ifnextchar(%)
- {\def@@head}%
- {\def@@head(\scr@headabove@linelength,%
- \scr@headabove@linethickness)}}
-\def\def@@head(#1,#2)#3#4#5{%
- \kernel@ifnextchar(%)
- {\def@@@head({#1},{#2}){#3}{#4}{#5}}%
- {\def@@@head({#1},{#2}){#3}{#4}{#5}%
- (\scr@headbelow@linelength,%
- \scr@headbelow@linethickness)}}
-\def\def@@@head(#1,#2)#3#4#5(#6,#7){%
- \def\@evenhead{%
- \if@twoside
- \let\headmark\leftmark%
- \hss\hskip\@evenheadshift\vbox{\hsize=\@headwidth\relax%
- \hf@rule{#1}{#2}{\@headwidth}{headabove}%
- \vskip#2
- \vskip\baselineskip
- \hb@xt@\@headwidth{{%
- \scr@nouppercase
- \headfont\strut #3}}%
- \hf@rule{#6}{#7}{\@headwidth}{headbelow}%
- }\hskip\@oddheadshift\hss
- \fi
- }%
- \def\@oddhead{\let\headmark\rightmark
- \hss\hskip\@oddheadshift\vbox{\hsize=\@headwidth\relax
- \hf@rule{#1}{#2}{\@headwidth}{headabove}%
- \vskip#2%
- \vskip\baselineskip
- \hb@xt@\@headwidth{{%
- \scr@nouppercase
- \headfont\strut \if@twoside #4\else #5\fi}}%
- \hf@rule{#6}{#7}{\@headwidth}{headbelow}%
- }\hskip\@evenheadshift\hss}%
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \begin{macro}{\def@foot}
-% \changes{v2.0}{2001/04/20}{Thickness and length of the lines are
-% optional}
-% \changes{v1.3}{2001/03/30}{Use of \cmd\@footwidth instead of
-% \cs{textwidth}}
-% \changes{v2.5}{2010/04/22}{new (internal)}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\def@@foot}
-% \changes{v2.5}{2010/04/22}{new (internal)}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\def@@@foot}
-% \changes{v2.0j}{2001/08/18}{Use of \cs{scr@nouppercase}}
-% \changes{v2.2f}{2008/02/14}{Use of \cs{footfont}}
-% \changes{v2.5}{2010/04/22}{new (internal)}
-% And last twosided and onesided foot:
-% \begin{macrocode}
-\def\def@foot{%
- \kernel@ifnextchar(%)
- {\def@@foot}
- {\def@@foot(\scr@footabove@linelength,%
- \scr@footabove@linethickness)}}
-\def\def@@foot(#1,#2)#3#4#5{%
- \kernel@ifnextchar(%)
- {\def@@@foot({#1},{#2}){#3}{#4}{#5}}%
- {\def@@@foot({#1},{#2}){#3}{#4}{#5}%
- (\scr@footbelow@linelength,%
- \scr@footbelow@linethickness)}}
-\def\def@@@foot(#1,#2)#3#4#5(#6,#7){%
- \def\@evenfoot{%
- \if@twoside
- \let\headmark\leftmark
- \hss\hskip\@evenfootshift\vbox{\hsize=\@footwidth\relax
- \topfoot@rule{#1}{#2}\hb@xt@\@footwidth{{%
- \scr@nouppercase
- \headfont\footfont\strut #3}}%
- \botfoot@rule{#6}{#7}}\hskip\@oddfootshift\hss
- \fi
- }%
- \def\@oddfoot{\let\headmark\rightmark
- \hss\hskip\@oddfootshift\vbox{\hsize=\@footwidth\relax
- \topfoot@rule{#1}{#2}\hb@xt@\@footwidth{{%
- \scr@nouppercase
- \headfont\footfont\strut \if@twoside #4\else #5\fi}}%
- \botfoot@rule{#6}{#7}}\hskip\@evenfootshift\hss}%
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% We now define the rules used at head and foot.
-% \begin{macro}{\topfoot@rule}
-% \begin{macrocode}
-\newcommand\topfoot@rule[2]{%
- \@tempdima\baselineskip\advance\@tempdima by-.7\normalbaselineskip
- \advance\@tempdima by -#2
- \vskip\@tempdima\hf@rule{#1}{#2}{\@footwidth}{footabove}%
- \vskip-\@tempdima}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\botfoot@rule}
-% \begin{macrocode}
-\newcommand\botfoot@rule[2]{%
- \@tempdima-\baselineskip\advance\@tempdima by .3\normalbaselineskip
- \advance\@tempdima by #2
- \vskip\@tempdima\hf@rule{#1}{#2}{\@footwidth}{footbelow}%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\hf@rule}
-% \changes{v1.3}{2001/03/30}{New, third parameter ``boxwidth''}
-% \changes{v2.0f}{2001/06/23}{Rule can be adjusted at inner margine,
-% centered or adjusted at outer margine}
-% \changes{v2.2}{2004/07/05}{Last parameter of the rule tells, if it is a
-% headabove, headbelow, footabove or footbelow rule}
-% \changes{v2.2}{2005/07/05}{Precommands before the rules are allowed}
-% \changes{v2.2}{2005/07/05}{Macro is not longer long}
-% \changes{v2.2b}{2005/08/31}{No even alignment at oneside}
-% \begin{macrocode}
-\newcommand*{\hf@rule}[4]{%
- \setlength{\@tempdimb}{#1}
- \begingroup
- \csname scr@pre@#4@line\endcsname
- \if@twoside
- \ifodd\c@page
- \edef\@tempa{\hfline@adjust}%
- \else
- \@tempcnta=2\advance\@tempcnta -\hfline@adjust
- \edef\@tempa{\the\@tempcnta}%
- \fi
- \else
- \edef\@tempa{\hfline@adjust}%
- \fi
- \ifnum\@tempa=1
- \setlength{\@tempdimb}{.5\@tempdimb}%
- \fi
- \hb@xt@#3{%
- \ifnum\@tempa>0
- \hfill%
- \llap{\vrule\@depth#2\@height\z@\@width\@tempdimb}%
- \fi
- \ifnum\@tempa<2
- \rlap{\vrule\@depth#2\@height\z@\@width\@tempdimb}%
- \hfill%
- \fi
- }%
- \endgroup
-}
-% \end{macrocode}
-% \begin{macro}{\scr@pre@headabove@line}
-% \changes{v2.2}{2004/07/05}{New internal}
-% \begin{macro}{\scr@fnt@headtopline}
-% \changes{v2.2}{2004/07/05}{New KOMA-Script font command}
-% \begin{macro}{\scr@pre@headbelow@line}
-% \changes{v2.2}{2004/07/05}{New internal}
-% \begin{macro}{\scr@fnt@headsepline}
-% \changes{v2.2}{2004/07/05}{New KOMA-Script font command}
-% \begin{macro}{\scr@pre@footabove@line}
-% \changes{v2.2}{2004/07/05}{New internal}
-% \begin{macro}{\scr@fnt@footsepline}
-% \changes{v2.2}{2004/07/05}{New KOMA-Script font command}
-% \begin{macro}{\scr@pre@footbelow@line}
-% \changes{v2.2}{2004/07/05}{New internal}
-% \begin{macro}{\scr@fnt@footbottomrule}
-% \changes{v2.2}{2004/07/05}{New KOMA-Script font command}
-% \begin{macro}{\scr@fnt@instead@footbotline}
-% \changes{v2.2}{2004/07/05}{New KOMA-Script font command}
-% \begin{macrocode}
-\newcommand*{\scr@pre@headabove@line}{}
-\newcommand*{\scr@fnt@headtopline}{\scr@pre@headabove@line}
-\newcommand*{\scr@pre@headbelow@line}{}
-\newcommand*{\scr@fnt@headsepline}{\scr@pre@headbelow@line}
-\newcommand*{\scr@pre@footabove@line}{}
-\newcommand*{\scr@fnt@footsepline}{\scr@pre@footabove@line}
-\newcommand*{\scr@pre@footbelow@line}{}
-\newcommand*{\scr@fnt@footbottomline}{\scr@pre@footbelow@line}
-\newcommand*{\scr@fnt@instead@footbotline}{footbottomline}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% Using these definitions, we can define the testing macros.
-%
-% \begin{macro}{\newpagestyle}
-% First the simple star/starless-selection:
-% \begin{macrocode}
-\def\newpagestyle{%
-% \end{macrocode}
-% We have to decide, whether it is a my-version or not:
-% \begin{macrocode}
- \@ifstar
- {\@newpagestyle[-]}%
- {\@newpagestyle[+]}}
-% \end{macrocode}
-% \begin{macro}{\@newpagestyle}
-% There we have to distinguish, whether the pagestyle is already
-% defined or not.
-% \begin{macrocode}
-\def\@newpagestyle[#1]#2#3#4{%
- \expandafter\ifx\csname ps@#2\endcsname\relax
-% \end{macrocode}
-% Then we can use the already defined |\@defpagestyle|.
-% \begin{macrocode}
- \@defpagestyle[#1]{#2}{#3}{#4}%
- \else
- \PackageError
- {scrpage2}%
- {Your command was ignored}%
- {There is already a pagestyle named ``#1''.\MessageBreak%
- Use \protect\defpagestyle\space, \protect\renewpagestyle or
- \protect\providepagestyle.}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\renewpagestyle}
-% First the simple star/starless-selection:
-% \begin{macrocode}
-\def\renewpagestyle{%
-% \end{macrocode}
-% We have to decide, whether it is a my-version or not:
-% \begin{macrocode}
- \@ifstar
- {\@renewpagestyle[-]}%
- {\@renewpagestyle[+]}}
-% \end{macrocode}
-% \begin{macro}{\@renewpagestyle}
-% \changes{v1.2a}{1996/12/07}{Avoid to define pagestyle as \cs{relax}
-% if it wasn't defined (Thanks to Bernd).}
-% There we have to distinguish, whether the pagestyle is already
-% defined or not.
-% \begin{macrocode}
-\def\@renewpagestyle[#1]#2#3#4{%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname ps@#2\endcsname\relax
- \PackageError
- {scrpage2}%
- {Your command was ignored}%
- {There is no pagestyle named ``#1''.\MessageBreak%
- Use \protect\defpagestyle, \protect\newpagestyle or
- \protect\providepagestyle.}%
- \else
-% \end{macrocode}
-% Then we can use the already defined |\@defpagestyle|.
-% \begin{macrocode}
- \@defpagestyle[#1]{#2}{#3}{#4}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\providepagestyle}
-% First the simple star/starless-selection:
-% \begin{macrocode}
-\def\providepagestyle{%
-% \end{macrocode}
-% We have to decide, whether it is a my-version or not:
-% \begin{macrocode}
- \@ifstar
- {\@providepagestyle[-]}%
- {\@providepagestyle[+]}}
-% \end{macrocode}
-% \begin{macro}{\@providepagestyle}
-% There we have to distinguish, whether the pagestyle is already
-% defined or not.
-% \begin{macrocode}
-\def\@providepagestyle[#1]#2#3#4{%
- \expandafter\ifx\csname ps@#2\endcsname\relax
-% \end{macrocode}
-% Then we can use the already defined |\@defpagestyle|.
-% \begin{macrocode}
- \@defpagestyle[#1]{#2}{#3}{#4}%
- \else
- \PackageInfo
- {scrpage2}%
- {\protect\providepagestyle\protect{#1\protect} ignored.}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-% \subsection{User-Pagestyle-Definition-Interface}
-% The pagestyle-definition-interface for users is much easier than the
-% expert-version. Using the expert-macros, the definition is easy, too.
-%
-% \begin{macro}{\deftripstyle}
-% \begin{macrocode}
-% \end{macrocode}
-% At version 1 we define the selection of star- or starless-version first:
-% \begin{macrocode}
-\def\deftripstyle{%
- \@ifstar
- {\@deftripstyle[-]}%
- {\@deftripstyle[+]}}
-% \end{macrocode}
-% \end{macro}
-% Next we check, if there is an optional argument:
-% \begin{macro}{\@deftripstyle}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macrocode}
-\def\@deftripstyle[#1]#2{%
- \kernel@ifnextchar[%]
- {\@@deftripstyle[#1]{#2}}%
- {\@@deftripstyle[#1]{#2}[\z@]}}
-% \end{macrocode}
-% \end{macro}
-% or perhaps two optional arguments:
-% \begin{macro}{\@@deftripstyle}
-% \begin{macrocode}
-\def\@@deftripstyle[#1]#2[#3]{%
-% \end{macrocode}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% Ok, now we have the problem, that there can be only 9 arguments. So we
-% have to distinguish the star-versions by a macro:
-% \begin{macrocode}
- \def\@tempa{#1}%
- \kernel@ifnextchar[%]
- {\@@@deftripstyle#2[#3]}%
- {\@@@deftripstyle#2[\z@][#3]}}
-% \end{macrocode}
-% \end{macro}
-% Now the main-definition:
-% \begin{macro}{\@@@deftripstyle}
-% \begin{macrocode}
-\def\@@@deftripstyle#1[#2][#3]#4#5#6#7#8#9{%
- \def\@tempb{+}%
- \ifx\@tempa\@tempb
- \defpagestyle{#1}%
- {(\@headwidth,#2)%
- {\rlap{#6}\hfill{#5}\hfill\llap{#4}}%
- {\rlap{#4}\hfill{#5}\hfill\llap{#6}}%
- {\rlap{#4}\hfill{#5}\hfill\llap{#6}}%
- (\@headwidth,#3)}%
- {(\@footwidth,#3)%
- {\rlap{#9}\hfill{#8}\hfill\llap{#7}}%
- {\rlap{#7}\hfill{#8}\hfill\llap{#9}}%
- {\rlap{#7}\hfill{#8}\hfill\llap{#9}}%
- (\@footwidth,#2)}%
- \else
- \defpagestyle*{#1}%
- {(\@headwidth,#2)%
- {\rlap{#6}\hfill{#5}\hfill\llap{#4}}%
- {\rlap{#4}\hfill{#5}\hfill\llap{#6}}%
- {\rlap{#4}\hfill{#5}\hfill\llap{#6}}%
- (\@headwidth,#3)}%
- {(\@footwidth,#3)%
- {\rlap{#9}\hfill{#8}\hfill\llap{#7}}%
- {\rlap{#7}\hfill{#8}\hfill\llap{#9}}%
- {\rlap{#7}\hfill{#8}\hfill\llap{#9}}%
- (\@footwidth,#2)}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Automark or not}
-% This is new since version 2.
-% \begin{macro}{\automark}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v2.0c}{2001/06/07}{Use of \cs{MakeMarkcase}}
-% \changes{v2.0g}{2001/06/25}{Use of \cs{manualmark}}
-% \changes{v2.0i}{2001/08/17}{Warning, if arguments are mixed up}
-% \changes{v2.0i}{2001/08/17}{\cs{markboth} behavior fixed}
-% \changes{v2.0i}{2001/08/17}{Use of \cs{if@autooneside}}
-% \changes{v2.1a}{2002/10/30}{Switch on \cs{if@automark}}
-% This macro activates automatic mark. Is has two arguments. The
-% first, optional argument is the sectioning level name of the mark at
-% left pages, the second, not optional argument is the same at right
-% pages. At oneside mode all pages are right.
-% \begin{macro}{\@iflevelok}
-% \changes{v2.0i}{2001/08/17}{New}
-% \begin{macro}{\markleft}
-% \changes{v2.0i}{2001/08/17}{New}
-% \begin{macro}{\@markleft}
-% \changes{v2.0i}{2001/08/17}{New}
-% To define \cs{automark} we also need these three makros. The first
-% one decides, if level of second parameter is less than level of
-% first parameter and does then third or fourth parameter.
-% \cs{markleft} and \cs{@markleft} are similar to \cs{markright} and
-% \cs{@markright} at \LaTeX{} kernel.
-% \begin{macrocode}
-\newcommand*{\@iflevelok}[4]{%
- \begingroup
- \edef\@tempa{#1}\ifx\@tempa\@empty\def\@tempa{\endgroup #3}\else
- \def\@tempa{\csname #1level\endcsname}%
- \def\@tempb{\csname #2level\endcsname}%
- \ifnum \@tempa>\@tempb
- \def\@tempa{\endgroup#3}%
- \else
- \def\@tempa{\endgroup#4}%
- \fi\fi\@tempa}
-\providecommand{\markleft}[1]{%
- \begingroup
- \let\label\relax \let\index\relax \let\glossary\relax
- \expandafter\@markleft\@themark {#1}%
- \@temptokena \expandafter{\@themark}%
- \mark{\the\@temptokena}%
- \endgroup
- \if@nobreak\ifvmode\nobreak\fi\fi}
-\providecommand{\@markleft}[3]{\@temptokena {#2}%
- \unrestored@protected@xdef\@themark{{#3}{\the\@temptokena}}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \changes{v2.2a}{2004/09/05}{all changes of helper macros and switches are
-% local to fix e.g.\ twocolumn problem with \cs{part}}
-% \begin{macrocode}
-\newcommand*{\automark}[2][\@empty]{%
- \manualmark
- \@automarktrue
- \begingroup
- \edef\@tempa{#2}\ifx\@tempa\@empty
- \endgroup
- \PackageWarning{scrpage2}%
- {\string\automark\space with empty obligatory argument}%
- \else
- \endgroup
- \expandafter\def\csname #2mark\endcsname##1{%
- \begingroup
- \def\@tempa{\csname #2level\endcsname}%
- \@tempswafalse
- \ifnum \c@secnumdepth <\@tempa\else\if@mainmatter
- \@tempswatrue
- \fi\fi
- \edef\@tempa{#1}%
- \if@twoside\edef\@tempb{#2}\else\let\@tempb\@tempa\fi
- \ifx\@tempa\@tempb
- \if@tempswa
- \@mkboth{\MakeMarkcase{\csname #2markformat\endcsname ##1}}%
- {\MakeMarkcase{\csname #2markformat\endcsname ##1}}%
- \else%
- \@mkboth{\MakeMarkcase{##1}}{\MakeMarkcase{##1}}%
- \fi
- \else
- \if@tempswa
- \@iflevelok{#1}{#2}{%
- \@mkboth{\MakeMarkcase{\csname #2markformat\endcsname
- ##1}}{}}{%
- \ifx\@mkboth\markboth\markleft{\MakeMarkcase{\csname
- #2markformat\endcsname ##1}}%
- \fi}
- \else
- \@iflevelok{#1}{#2}{%
- \@mkboth{\MakeMarkcase{##1}}{}}{%
- \ifx\@mkboth\markboth\markleft{\MakeMarkcase{##1}}\fi}%
- \fi
- \fi
- \endgroup
- }
- \fi
- \begingroup
- \edef\@tempa{#1}\edef\@tempb{#2}%
- \if@autooneside\if@twoside\else\let\@tempa\@empty\fi\fi
- \ifx\@tempa\@empty
- \endgroup
- \else
- \ifx\@tempa\@tempb
- \endgroup
- \else
- \endgroup
- \expandafter\def\csname #1mark\endcsname##1{%
- \begingroup
- \def\@tempa{\csname #1level\endcsname}%
- \@tempswafalse
- \ifnum \c@secnumdepth <\@tempa\else\if@mainmatter
- \@tempswatrue
- \fi\fi
- \if@tempswa
- \@iflevelok{#1}{#2}{%
- \ifx\@mkboth\markboth
- \markright{\MakeMarkcase{\csname #1markformat\endcsname
- ##1}}%
- \fi}{%
- \@mkboth{}{\MakeMarkcase{\csname #1markformat\endcsname
- ##1}}}%
- \else
- \@iflevelok{#1}{#2}{%
- \ifx\@mkboth\markboth
- \markright{\MakeMarkcase{##1}}%
- \fi}{%
- \@mkboth{}{\MakeMarkcase{##1}}}%
- \fi
- \endgroup
- }
- \fi\fi%
- \let\@mkboth\markboth
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\manualmark}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v2.0g}{2001/06/25}{also deactivating \cs{...mark}}
-% \changes{v2.1a}{2002/10/30}{Switch off \cs{if@automark}}
-% This macro switchs to the manual set of marks (using \cs{markboth}
-% and \cs{markright}. This is very simple, we only have to deaktivate
-% the mark macros.
-% \begin{macrocode}
-\newcommand*{\manualmark}{%
- \if@chapter\let\chaptermark\@gobble\fi
- \let\sectionmark\@gobble
- \let\subsectionmark\@gobble
- \let\subsubsectionmark\@gobble
- \let\paragraphmark\@gobble
- \let\subparagraphmark\@gobble
- \let\@mkboth\@gobbletwo
- \@automarkfalse
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\partlevel}
-% \changes{v2.2}{2004/07/05}{New}
-% \changes{v2.4}{2009/11/11}{part level is always -1}
-% \begin{macro}{\chapterlevel}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\sectionlevel}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\subsectionlevel}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\subsubsectionlevel}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\paragraphlevel}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\subparagraphlevel}
-% \changes{v2.0}{2001/04/20}{New}
-% At \cs{automark} we use some macros to get the numeric level of a
-% sectioning name. We simply define these:
-% \begin{macrocode}
-\newcommand*{\partlevel}{-1}
-\newcommand*{\chapterlevel}{0}
-\newcommand*{\sectionlevel}{1}
-\newcommand*{\subsectionlevel}{2}
-\newcommand*{\subsubsectionlevel}{3}
-\newcommand*{\paragraphlevel}{4}
-\newcommand*{\subparagraphlevel}{5}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\MakeMarkcase}
-% \changes{v2.0m}{2002/02/05}{\texttt{scrlttr2} is a known class}
-% At \cs{automark} we use a new macro to enable usability of
-% \cs{MakeUppercase} at the head-marks. We set this macro to
-% \cs{MakeUppercase} if one of the standard-classes was loaded:
-% \begin{macrocode}
-\@ifundefined{MakeMarkcase}{%
- \@ifclassloaded{scrbook}{\let\MakeMarkcase\relax}{%
- \@ifclassloaded{scrreprt}{\let\MakeMarkcase\relax}{%
- \@ifclassloaded{scrartcl}{\let\MakeMarkcase\relax}{%
- \@ifclassloaded{scrlttr2}{\let\MakeMarkcase\relax}{%
- \@ifclassloaded{book}{}{%
- \@ifclassloaded{report}{}{%
- \@ifclassloaded{article}{}{%
- \PackageWarningNoLine{scrpage2}{%
- use of scrpage2 with unknown class.\MessageBreak
- Please mail to markus.kohm@gmx.de, if
- headmarks\MessageBreak
- are lower case without use of scrpage2}}}}%
- \let\MakeMarkcase\MakeUppercase}}}}}{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\scrheadings@style}
-% \changes{v2.0g}{2001/06/25}{New}
-% \changes{v2.0m}{2002/02/05}{Take care of class \texttt{scrlttr2}}
-% This macro defines, which style for scrheadings should be used. If
-% it is not defined, we have to define it in a propper way.
-% \begin{macrocode}
-\@ifundefined{scrheadings@style}{%
- \@ifclassloaded{scrbook}{\def\scrheadings@style{koma}}{%
- \@ifclassloaded{scrreprt}{\def\scrheadings@style{koma}}{%
- \@ifclassloaded{scrartcl}{\def\scrheadings@style{koma}}{%
- \@ifclassloaded{scrlttr2}{\def\scrheadings@style{koma}}{%
- \def\scrheadings@style{standard}}}}}}{}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Width of head and foot}
-% \begin{macro}{\setheadwidth}
-% \changes{v1.3}{2001/03/30}{New}
-% \begin{macro}{\setfootwidth}
-% \changes{v1.3}{2001/03/30}{New}
-% \begin{macro}{\set@hf@width}
-% \changes{v1.3}{2001/03/30}{New}
-% \changes{v1.3a}{2001/05/31}{symbolic values ``paper'', ``text'',
-% ``textwidthmarginpar''}
-% \changes{v2.0b}{2001/05/31}{symbolic values ``paper'', ``text'',
-% ``textwidthmarginpar''}
-% \changes{v2.0c}{2001/06/07}{error fix at warning}
-% \begin{macro}{\settowidthof}
-% \changes{v2.0e}{2001/06/22}{New}
-% \begin{macro}{\deftowidthof}
-% \changes{v2.0e}{2001/06/22}{New}
-% \changes{v2.0f}{2001/06/23}{new symbolic values ``autohead'' and
-% ``autofoot''}
-% \changes{v2.0i}{2001/08/17}{new symbolic value ``page''}
-% \changes{v2.0k}{2001/09/28}{\cs{pagewidth} korrigiert}
-% \changes{v2.1b}{2003/05/31}{more save existance test}
-% \changes{v2.2}{2004/07/05}{value ``foot'' fixed}
-% Until version 1.3, head and foot of a page had same width like the
-% text block. Since version 1.3 this was changed. Now the head and
-% foot have their own width and an optional shift relative to the text
-% part of the page. This shift can be positive or negative. We set
-% the width and shift with one macro and save them at macros. The set
-% macros have an optional argument: the shift.
-%
-% For definition of symbolic length values there is the macro
-% \cs{settowidthof}. And to define a macro with this value, there
-% is \cs{deftowidthof}.
-% \begin{macrocode}
-\newcommand*{\settowidthof}[2]{%
- \edef\@tempa{#2}%
- \edef\@tempb{paper}\ifx\@tempa\@tempb
- \setlength{#1}{\paperwidth}%
- \else\edef\@tempb{text}\ifx\@tempa\@tempb
- \setlength{#1}{\textwidth}%
- \else\edef\@tempb{textwithmarginpar}\ifx\@tempa\@tempb
- \setlength{#1}{\textwidth}%
- \addtolength{#1}{\marginparwidth}%
- \addtolength{#1}{\marginparsep}%
- \else\edef\@tempb{head}\ifx\@tempa\@tempb
- \setlength{#1}{\@headwidth}%
- \else\edef\@tempb{foot}\ifx\@tempa\@tempb
- \setlength{#1}{\@footwidth}%
- \else\edef\@tempb{headtopline}\ifx\@tempa\@tempb
- \setlength{#1}{\scr@headabove@linelength}%
- \else\edef\@tempb{headsepline}\ifx\@tempa\@tempb
- \setlength{#1}{\scr@headbelow@linelength}%
- \else\edef\@tempb{footsepline}\ifx\@tempa\@tempb
- \setlength{#1}{\scr@footabove@linelength}%
- \else\edef\@tempb{footbotline}\ifx\@tempa\@tempb
- \setlength{#1}{\scr@footbelow@linelength}%
- \else\edef\@tempb{page}\ifx\@tempa\@tempb
- \setlength{#1}{\paperwidth}%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname ta@bcor\endcsname\relax\else
- \addtolength{#1}{-\ta@bcor}%
- \fi
- \else
- \setlength{#1}{#2}%
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
-}
-\newcommand*{\deftowidthof}[2]{%
- \edef\@tempa{#2}\edef\@tempb{autohead}\ifx\@tempa\@tempb
- \expandafter\def\csname #1\endcsname{\@headwidth}%
- \else\edef\@tempb{autofoot}\ifx\@tempa\@tempb
- \expandafter\def\csname #1\endcsname{\@footwidth}%
- \else
- \settowidthof{\@tempdima}{#2}%
- \expandafter\edef\csname #1\endcsname{\the\@tempdima}%
- \fi
- \fi
-}
-\newcommand*{\setheadwidth}[2][\@empty]{%
- \set@hf@width{head}{#1}{#2} %
-}
-\newcommand*{\setfootwidth}[2][\@empty]{%
- \set@hf@width{foot}{#1}{#2}%
-}
-\newcommand*{\set@hf@width}[3]{%
- \settowidthof{\@tempdima}{#3}%
- \ifdim\@tempdima>\paperwidth
- \PackageWarning
- {scrpage2}%
- {You've set width of #1 to a value\MessageBreak
- greater than width of page!\MessageBreak%
- I`ll reduce width of #1 to width of page}%
- \setlength{\@tempdima}{\paperwidth}%
- \else
- \ifdim\@tempdima<\z@
- \PackageWarning
- {scrpage2}%
- {You've set width of #1 to negative value!\MessageBreak%
- I'll set it to 0pt}%
- \setlength{\@tempdima}{\z@}%
- \fi
- \fi
- \expandafter\edef\csname @#1width\endcsname{\the\@tempdima}%
- \edef\@tempa{#2}%
- \setlength{\@tempdima}{\textwidth}%
- \addtolength{\@tempdima}{-\csname @#1width\endcsname}%
- \ifx\@tempa\@empty
- \if@twoside
- \setlength{\@tempdimb}{.3333333333\@tempdima}%
- \else
- \setlength{\@tempdimb}{.5\@tempdima}%
- \fi
- \else
- \setlength{\@tempdimb}{#2}%
- \fi
- \addtolength{\@tempdima}{-\@tempdimb}%
- \ifdim\@tempdimb<\z@
- \setlength{\@tempdimb}{-\@tempdimb}%
- \expandafter\edef\csname @odd#1shift\endcsname{-\the\@tempdimb}%
- \else
- \expandafter\edef\csname @odd#1shift\endcsname{\the\@tempdimb}%
- \fi
- \ifdim\@tempdima<\z@
- \setlength{\@tempdima}{-\@tempdima}%
- \expandafter\edef\csname @even#1shift\endcsname{-\the\@tempdima}%
- \else
- \expandafter\edef\csname @even#1shift\endcsname{\the\@tempdima}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@headwidth}
-% \changes{v1.3}{2001/03/30}{New}
-% \changes{v2.1}{2002/03/28}{use of option \texttt{mpinclude}}
-% \begin{macro}{\@footwidth}
-% \changes{v1.3}{2001/03/30}{New}
-% \changes{v2.1}{2002/03/28}{use of option \texttt{mpinclude}}
-% \begin{macro}{\@oddheadshift}
-% \changes{v1.3}{2001/03/30}{New}
-% \begin{macro}{\@evenheadshift}
-% \changes{v1.3}{2001/03/30}{New}
-% \begin{macro}{\@oddfootshift}
-% \changes{v1.3}{2001/03/30}{New}
-% \begin{macro}{\@evenfootshift}
-% \changes{v1.3}{2001/03/30}{New}
-% The values of width and shift of head and foot are saved at internal
-% macros.
-% \begin{macrocode}
-\newcommand*{\@headwidth}{\textwidth}%
-\newcommand*{\@oddheadshift}{\z@}%
-\newcommand*{\@evenheadshift}{\z@}%
-\newcommand*{\@footwidth}{\textwidth}%
-\newcommand*{\@oddfootshift}{\z@}%
-\newcommand*{\@evenfootshift}{\z@}%
-% \end{macrocode}
-% If option \texttt{mpinclude} was used, we use a special trick to set
-% width of head and foot but only if the user doesn't:
-% \begin{macrocode}
-\if@mincl
- \renewcommand*{\@headwidth}{}%
- \renewcommand*{\@footwidth}{}%
- \AtBeginDocument{%
- \ifx\@headwidth\@empty
- \setheadwidth[0pt]{textwithmarginpar}%
- \fi
- \ifx\@footwidth\@empty
- \setfootwidth[0pt]{textwithmarginpar}%
- \fi
- }
-\fi
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \subsection{Fonts}
-% \begin{macro}{\pnumfont}
-% We have to define a macro defining the font, used by |\pagemark|. Because
-% of this macro may already be defined by a \textsf{KOMA}-script-class, we
-% have to do this, using |\providecommand|
-% \begin{macrocode}
-\providecommand*{\pnumfont}{\normalfont}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\headfont}
-% There is also a macro used by |\@evenhead|, |\@oddhead| and |\@evenfoot|,
-% |\@oddfoot|:
-% \begin{macrocode}
-\providecommand*{\headfont}{\normalfont\slshape}
-\def\scr@fnt@wrn@pagehead#1{%
- `pagehead' is only an alias of `pageheadfoot'.\MessageBreak
- Font of page foot may also be changed%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\footfont}
-% \changes{v2.2f}{2008/02/14}{New}
-% \begin{macro}{\scr@fnt@pagefoot}
-% \changes{v2.2f}{2008/02/14}{New (internal)}
-% \begin{macro}{\scr@fnt@wrn@pagefoot}
-% \changes{v2.2f}{2008/02/14}{deactivated}
-% There is also a macro used by |\@evenfoot|, |\@oddfoot| after |\headfont|:
-% \begin{macrocode}
-\providecommand*{\footfont}{\normalfont}
-\providecommand*{\scr@fnt@pagefoot}{\footfont}
-\let\scr@fnt@wrn@pagefoot\relax
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \subsection{Length and thickness of lines at head and foot}
-% \begin{macro}{\setheadtopline}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v2.0d}{2001/06/19}{\texttt{headtop} changed into
-% \texttt{headabove}}
-% \changes{v2.0f}{2001/06/23}{new symbolic value ``auto''}
-% \begin{macro}{\setheadsepline}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v2.0d}{2001/06/19}{\texttt{headbot} changed into
-% \texttt{headbelow}}
-% \changes{v2.0f}{2001/06/23}{new symbolic value ``auto''}
-% \begin{macro}{\setfootsepline}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v2.0d}{2001/06/19}{\texttt{foottop} changed into
-% \texttt{footabove}}
-% \changes{v2.0f}{2001/06/23}{new symbolic value ``auto''}
-% \begin{macro}{\setfootbotline}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v2.0d}{2001/06/19}{\texttt{footbot} changed into
-% \texttt{footbelow}}
-% \changes{v2.0f}{2001/06/23}{new symbolic value ``auto''}
-% Since version 2 there are new macros to set the length and
-% thickness of the lines at head and foot. Wie use macros not
-% dimensions, because the amount of dimensions is very small at \TeX.
-% \begin{macrocode}
-\newcommand*{\setheadtopline}{\scr@setline{head}{above}}
-\newcommand*{\setheadsepline}{\scr@setline{head}{below}}
-\newcommand*{\setfootsepline}{\scr@setline{foot}{above}}
-\newcommand*{\setfootbotline}{\scr@setline{foot}{below}}
-% \end{macrocode}
-% \begin{macro}{\scr@setline}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\@scr@setline}
-% \changes{v2.0d}{2001/06/19}{symbolic values implemented}
-% \begin{macro}{\@@scr@setline}
-% \changes{v2.0d}{2001/06/18}{macro name fixed}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\@scr@set@pre@line}
-% \changes{v2.2}{2004/07/05}{New internal}
-% The real change of the lines is done with the macros
-% \cs{scr@setline}, \cs{@scr@setline} and \cs{@@scr@setline}:
-% \begin{macrocode}
-\def\scr@setline#1#2{%
- \kernel@ifnextchar[%]
- {\@scr@setline{#1}{#2}}{\@@scr@setline{#1#2}}%
-}
-\def\@scr@setline#1#2[#3]{%
- \edef\@tempa{#3}\edef\@tempa{auto}\ifx\@tempa\@tempb
- \deftowidthof{scr@#1#2@linelength}{#3#1}%
- \else
- \deftowidthof{scr@#1#2@linelength}{#3}%
- \fi
- \@@scr@setline{#1#2}%
-}
-\def\@@scr@setline#1#2{%
- \edef\@tempa{#2}\edef\@tempb{current}\ifx\@tempa\@empty\else
- \ifx\@tempa\@tempb\else
- \setlength{\@tempdima}{#2}%
- \expandafter\edef\csname scr@#1@linethickness\endcsname%
- {\the\@tempdima}%
- \fi\fi
- \kernel@ifnextchar[%]
- {\@src@set@pre@line{#1}}{}%
-}
-\def\@src@set@pre@line#1[#2]{%
- \expandafter\def\csname scr@pre@#1@line\endcsname{#2}%
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \subsection{Extended multilanguage formats}
-% \begin{macro}{\partmarkformat}
-% \changes{v2.2}{2004/07/05}{New}
-% \begin{macro}{\chaptermarkformat}
-% \changes{v1.1}{1995/06/27}{Space after chapternumber increased.}
-% \begin{macro}{\sectionmarkformat}
-% \changes{v1.1}{1995/06/27}{Space after sectionnumber increased.}
-% \begin{macro}{\subsectionmarkformat}
-% \changes{v1.1}{1995/06/27}{Space after subsectionnumber increased.}
-% \begin{macro}{\subsubsectionmarkformat}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\paragraphmarkformat}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\subparagraphmarkformat}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\@seccntmarkformat}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\@seccntformat}
-% \changes{v2.0}{2001/04/20}{New}
-% There are some macros to handle languages like Chinese, Japanese or Korean.
-% These macros were defined first by Werner Lemberg at his CJK-bundle. See
-% |scrclass.dtx| for further information.
-% \begin{macrocode}
-\providecommand{\partmarkformat} {\partname\ \thepart. \ }
-\if@chapter
- \providecommand{\chaptermarkformat} {\@chapapp\ \thechapter. \ }
- \providecommand{\sectionmarkformat} {\thesection. \ }
- \providecommand{\subsectionmarkformat} {\@seccntmarkformat{subsection}}
-\else
- \providecommand{\sectionmarkformat} {\thesection\quad}
- \providecommand{\subsectionmarkformat} {\thesubsection\quad}
-\fi
-\providecommand{\subsubsectionmarkformat}{\@seccntmarkformat{subsubsection}}
-\providecommand{\paragraphmarkformat} {\@seccntmarkformat{paragraph}}
-\providecommand{\subparagraphmarkformat} {\@seccntmarkformat{subparagraph}}
-\providecommand{\@seccntmarkformat}[1] {\@seccntformat{#1}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \subsection{Definition of default pagestyles}
-%
-% \begin{macro}{\ps@save@plain}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v2.0b}{2001/05/31}{use this instead of
-% \cs{ps@standardplain}}
-% We define two default pagestyles, which can be used instead of the
-% standard pagestyles. The two pagestyles are something like a
-% family. A pagestyle for \emph{normal} pages with head and foot and a
-% pagestyle for \emph{plain} pages with not so much head and foot. So
-% we have to redefine the standard pagestyle \texttt{plain}. But maybe
-% someone want to use the old standard pagestyle. So we first define
-% new names for old pagestyles.
-% \begin{macrocode}
-\newcommand*{\ps@save@plain}{}
-\let\ps@save@plain\ps@plain
-\newcommand*{\ps@use@plain}{\let\save@@mkboth\@mkboth
- \ps@save@plain
- \let\@mkboth\save@@mkboth}
-\let\ps@plain\ps@use@plain
-% \end{macrocode}
-% \begin{macro}{\ps@save@headings}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v2.0b}{2001/05/31}{use this instead of
-% \cs{ps@standardheadings}}
-% \begin{macro}{\ps@save@myheadings}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v2.0b}{2001/05/31}{use this instead of
-% \cs{ps@standardmyheadings}}
-% \begin{macro}{\ps@headings}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\ps@myheadings}
-% \changes{v2.0}{2001/04/20}{New}
-% If standard pagestyle \texttt{headings} or \texttt{myheadings} is
-% used, also standard pagestyle \texttt{use@plain} should be
-% used. So we also define new names for the other old pagestyles and
-% new pagestyles with the old names, doing the switch back for the
-% plain pagestyle. These are defined even if the pagestyles are
-% unknown.
-% \begin{macrocode}
-\newcommand*{\ps@save@headings}{}
-\let\ps@save@headings\ps@headings
-\newcommand*{\ps@save@myheadings}{}
-\let\ps@save@myheadings\ps@myheadings
-\def\ps@headings{%
- \PackageWarning{scrpage2}%
- {you've used pagestyle ``headings''.\MessageBreak
- You should not use this pagestyle with a\MessageBreak
- scrpage2-pagestyle!\MessageBreak
- You should use pagestyle ``useheadings'' instead\MessageBreak}%
- \let\ps@plain\ps@save@plain%
- \ps@save@headings\@automarktrue}
-\def\ps@myheadings{%
- \PackageWarning{scrpage2}%
- {you've used pagestyle ``myheadings''.\MessageBreak
- You should not use this pagestyle with a\MessageBreak
- scrpage2-pagestyle!\MessageBreak
- You should use pagestyle ``useheadings'' instead\MessageBreak}%
- \let\ps@plain\ps@save@plain%
- \ps@save@myheadings\@automarkfalse}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\ps@useheadings}
-% \changes{v2.0b}{2001/05/31}{New}
-% \changes{v2.0m}{2002/02/05}{Fatal bug (\cs{mkboth} instead of
-% \cs{@mkboth}) fixed}
-% \changes{v2.1a}{2002/10/30}{Use of switch \cs{if@automark}}
-% This is the pagestyle, you should use instead of \texttt{headings}
-% or \texttt{myheadings}. If you are using manual marks, this behaves
-% like pagestyle \texttt{myheadings}. If you are using automatic
-% marks, this behaves like headings, but without changing
-% \cs{chaptermark}, \cs{sectionmark} or \cs{subsectionmark}.
-% \begin{macrocode}
-\newcommand*{\ps@useheadings}{%
- \if@automark\let\@mkboth\markboth\else\let\@mkboth\@gobbletwo\fi
- \let\ps@plain\ps@use@plain
- \let\save@@mkboth\@mkboth
- \let\save@chaptermark\chaptermark
- \let\save@sectionmark\sectionmark
- \let\save@subsectionmark\subsectionmark
- \ifx\@mkboth\markboth\ps@save@headings\else\ps@save@myheadings\fi
- \let\@mkboth\save@@mkboth
- \let\chaptermark\save@chaptermark
- \let\sectionmark\save@sectionmark
- \let\subsectionmark\save@subsectionmark
-}
-% \end{macrocode}
-% Note: Because of saving \cs{@mkboth}, \cs{chaptermark},
-% \cs{sectionmark} and \cs{subsection} before changing the pagestyle
-% and restore them after changing the pagestyle it does not matter, if
-% we set pagestyle \texttt{headings} or \texttt{myheadings}. So it
-% would be possible to remove the \cs{ifx}\dots\cs{fi}-line above and
-% simply use \cs{ps@save@headings} or \cs{ps@save@myheadings} instead
-% of.
-% \end{macro}
-%
-%
-% \begin{macro}{\ps@scrplain}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v2.0a}{2001/04/24}{\cs{strut} inserted}
-% \changes{v2.0f}{2001/06/23}{\cs{strut} inserted}
-% \changes{v2.1c}{2004/02/07}{thickness of footbelow line fixed}
-% \begin{macro}{\scrplain@even@left@head}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@even@middle@head}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@even@right@head}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@odd@left@head}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@odd@middle@head}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@odd@right@head}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@even@left@foot}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@even@middle@foot}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@even@right@foot}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@odd@left@foot}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@odd@middle@foot}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrplain@odd@right@foot}
-% \changes{v2.0}{2001/04/20}{New}
-% After this, we can define the new pagestyles, first a new plain
-% one. It sould be variable and so we use macros to define the parts.
-% \begin{macrocode}
-\newcommand*{\ps@scrplain}{\let\ps@plain\ps@@scrplain\ps@plain}
-\newpagestyle{@scrplain}
-{%
- (\scrplain@headabove@linelength,\scr@headabove@linethickness)%
- {%
- \rlap{\parbox{\@headwidth}{\raggedright
- \strut\scrplain@even@left@head\strut}}%
- \hfill
- \parbox{\@headwidth}{\centering\strut
- \scrplain@even@middle@head\strut}%
- \hfill
- \llap{\parbox{\@headwidth}{\raggedleft
- \strut\scrplain@even@right@head\strut}}}%
- {%
- \rlap{\parbox{\@headwidth}{\raggedright
- \strut\scrplain@odd@left@head\strut}}%
- \hfill
- \parbox{\@headwidth}{\centering
- \strut\scrplain@odd@middle@head\strut}%
- \hfill
- \llap{\parbox{\@headwidth}{\raggedleft
- \strut\scrplain@odd@right@head\strut}}}%
- {%
- \rlap{\parbox{\@headwidth}{\raggedright
- \strut\scrplain@odd@left@head\strut}}%
- \hfill
- \parbox{\@headwidth}{\centering
- \strut\scrplain@odd@middle@head\strut}%
- \hfill
- \llap{\parbox{\@headwidth}{\raggedleft
- \strut\scrplain@odd@right@head\strut}}}%
- (\scrplain@headbelow@linelength,\scr@headbelow@linethickness)
-}{%
- (\scrplain@footabove@linelength,\scr@footabove@linethickness)
- {%
- \rlap{\parbox{\@footwidth}{\raggedright
- \strut\scrplain@even@left@foot\strut}}%
- \hfill
- \parbox{\@footwidth}{\centering
- \strut\scrplain@even@middle@foot\strut}%
- \hfill
- \llap{\parbox{\@footwidth}{\raggedleft
- \strut\scrplain@even@right@foot\strut}}}%
- {%
- \rlap{\parbox{\@footwidth}{\raggedright
- \strut\scrplain@odd@left@foot\strut}}%
- \hfill
- \parbox{\@footwidth}{\centering
- \strut\scrplain@odd@middle@foot\strut}%
- \hfill
- \llap{\parbox{\@footwidth}{\raggedleft
- \strut\scrplain@odd@right@foot\strut}}}%
- {%
- \rlap{\parbox{\@footwidth}{\raggedright
- \strut\scrplain@odd@left@foot\strut}}%
- \hfill
- \parbox{\@footwidth}{\centering
- \strut\scrplain@odd@middle@foot\strut}%
- \hfill
- \llap{\parbox{\@footwidth}{\raggedleft
- \strut\scrplain@odd@right@foot\strut}}}%
- (\scrplain@footbelow@linelength,\scr@footbelow@linethickness)
-}
-\newcommand*{\scrplain@even@left@head}{}
-\newcommand*{\scrplain@even@middle@head}{}
-\newcommand*{\scrplain@even@right@head}{}
-\newcommand*{\scrplain@odd@left@head}{}
-\newcommand*{\scrplain@odd@middle@head}{}
-\newcommand*{\scrplain@odd@right@head}{}
-\newcommand*{\scrplain@even@left@foot}{}
-\newcommand*{\scrplain@even@middle@foot}{}
-\newcommand*{\scrplain@even@right@foot}{}
-\newcommand*{\scrplain@odd@left@foot}{}
-\newcommand*{\scrplain@odd@middle@foot}{}
-\newcommand*{\scrplain@odd@right@foot}{}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \begin{macro}{\ps@scrheadings}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v2.0a}{2001/04/24}{\cs{strut} inserted}
-% \changes{v2.0f}{2001/06/23}{\cs{strut} inserted}
-% \begin{macro}{\scrheadings@even@left@head}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrheadings@even@middle@head}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrheadings@even@right@head}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrheadings@odd@left@head}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrheadings@odd@middle@head}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrheadings@odd@right@head}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrheadings@even@left@foot}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrheadings@even@middle@foot}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrheadings@even@right@foot}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrheadings@odd@left@foot}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrheadings@odd@middle@foot}
-% \changes{v2.0}{2001/04/20}{New}
-% \begin{macro}{\scrheadings@odd@right@foot}
-% \changes{v2.0}{2001/04/20}{New}
-% We also define define a new headings one. It sould be variable and
-% so we use macros to define the parts. But we need an \emph{also
-% action}, so we first define a inner pagestyle and then use this at a
-% outer one (definition is done in reverse order):
-% \begin{macrocode}
-\newcommand*{\ps@scrheadings}{\let\ps@plain\ps@scrplain\ps@@scrheadings}
-\newpagestyle{@scrheadings}
-{%
- {%
- \rlap{\parbox{\@headwidth}{\raggedright
- \strut\scrheadings@even@left@head\strut}}%
- \hfill
- \parbox{\@headwidth}{\centering
- \strut\scrheadings@even@middle@head\strut}%
- \hfill
- \llap{\parbox{\@headwidth}{\raggedleft%
- \strut\scrheadings@even@right@head\strut}}}%
- {%
- \rlap{\parbox{\@headwidth}{\raggedright
- \strut\scrheadings@odd@left@head\strut}}%
- \hfill
- \parbox{\@headwidth}{\centering
- \strut\scrheadings@odd@middle@head\strut}%
- \hfill
- \llap{\parbox{\@headwidth}{\raggedleft%
- \strut\scrheadings@odd@right@head\strut}}}%
- {%
- \rlap{\parbox{\@headwidth}{\raggedright
- \strut\scrheadings@odd@left@head\strut}}%
- \hfill
- \parbox{\@headwidth}{\centering
- \strut\scrheadings@odd@middle@head\strut}%
- \hfill
- \llap{\parbox{\@headwidth}{\raggedleft
- \strut\scrheadings@odd@right@head\strut}}}}%
-{%
- {%
- \rlap{\parbox{\@footwidth}{\raggedright
- \strut\scrheadings@even@left@foot\strut}}%
- \hfill
- \parbox{\@footwidth}{\centering
- \strut\scrheadings@even@middle@foot\strut}%
- \hfill
- \llap{\parbox{\@footwidth}{\raggedleft
- \strut\scrheadings@even@right@foot\strut}}}%
- {%
- \rlap{\parbox{\@footwidth}{\raggedright
- \strut\scrheadings@odd@left@foot\strut}}%
- \hfill
- \parbox{\@footwidth}{\centering
- \strut\scrheadings@odd@middle@foot\strut}%
- \hfill
- \llap{\parbox{\@footwidth}{\raggedleft
- \strut\scrheadings@odd@right@foot\strut}}}%
- {%
- \rlap{\parbox{\@footwidth}{\raggedright
- \strut\scrheadings@odd@left@foot\strut}}%
- \hfill
- \parbox{\@footwidth}{\centering
- \strut\scrheadings@odd@middle@foot\strut}%
- \hfill
- \llap{\parbox{\@footwidth}{\raggedleft
- \strut\scrheadings@odd@right@foot\strut}}%
- }%
-}
-\newcommand*{\scrheadings@even@left@head}{}
-\newcommand*{\scrheadings@even@middle@head}{}
-\newcommand*{\scrheadings@even@right@head}{}
-\newcommand*{\scrheadings@odd@left@head}{}
-\newcommand*{\scrheadings@odd@middle@head}{}
-\newcommand*{\scrheadings@odd@right@head}{}
-\newcommand*{\scrheadings@even@left@foot}{}
-\newcommand*{\scrheadings@even@middle@foot}{}
-\newcommand*{\scrheadings@even@right@foot}{}
-\newcommand*{\scrheadings@odd@left@foot}{}
-\newcommand*{\scrheadings@odd@middle@foot}{}
-\newcommand*{\scrheadings@odd@right@foot}{}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\ihead}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\ohead}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\chead}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\lehead}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\lohead}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\rehead}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\rohead}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\cehead}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\cohead}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\ifoot}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\ofoot}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\cfoot}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\lefoot}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\lofoot}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\refoot}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\rofoot}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\cefoot}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% \begin{macro}{\cofoot}
-% \changes{v2.0}{2001/04/20}{New}
-% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-% We also need macros to define the contents of the three part head
-% and foot. Each macro defines one of the part of head or foot of the
-% scrheadings pagestyle and optional of the scrplain pagestyle.
-% \begin{macrocode}
-\newcommand{\ihead}{\kernel@ifnextchar[{\@@lhead}{\@lhead}}
-\newcommand{\@lhead}[1]{\@rehead{#1}\@lohead{#1}}
-\newcommand{\@@lhead}[2][]{\@@rehead[{#1}]{#2}\@@lohead[{#1}]{#2}}
-\newcommand{\ohead}{\kernel@ifnextchar[{\@@rhead}{\@rhead}}
-\newcommand{\@rhead}[1]{\@lehead{#1}\@rohead{#1}}
-\newcommand{\@@rhead}[2][]{\@@lehead[{#1}]{#2}\@@rohead[{#1}]{#2}}
-\newcommand{\chead}{\kernel@ifnextchar[{\@@chead}{\@chead}}
-\newcommand{\@chead}[1]{\@cehead{#1}\@cohead{#1}}
-\newcommand{\@@chead}[2][]{\@@cehead[{#1}]{#2}\@@cohead[{#1}]{#2}}
-\newcommand{\lehead}{\kernel@ifnextchar[{\@@lehead}{\@lehead}}
-\newcommand{\@lehead}[1]{\renewcommand*{\scrheadings@even@left@head}{#1}}
-\newcommand{\@@lehead}[2][]{%
- \renewcommand*{\scrplain@even@left@head}{#1}%
- \renewcommand*{\scrheadings@even@left@head}{#2}}
-\newcommand{\lohead}{\kernel@ifnextchar[{\@@lohead}{\@lohead}}
-\newcommand{\@lohead}[1]{\renewcommand*{\scrheadings@odd@left@head}{#1}}
-\newcommand{\@@lohead}[2][]{%
- \renewcommand*{\scrplain@odd@left@head}{#1}%
- \renewcommand*{\scrheadings@odd@left@head}{#2}}
-\newcommand{\rehead}{\kernel@ifnextchar[{\@@rehead}{\@rehead}}
-\newcommand{\@rehead}[1]{\renewcommand*{\scrheadings@even@right@head}{#1}}
-\newcommand{\@@rehead}[2][]{%
- \renewcommand*{\scrplain@even@right@head}{#1}%
- \renewcommand*{\scrheadings@even@right@head}{#2}}
-\newcommand{\rohead}{\kernel@ifnextchar[{\@@rohead}{\@rohead}}
-\newcommand{\@rohead}[1]{\renewcommand*{\scrheadings@odd@right@head}{#1}}
-\newcommand{\@@rohead}[2][]{%
- \renewcommand*{\scrplain@odd@right@head}{#1}%
- \renewcommand*{\scrheadings@odd@right@head}{#2}}
-\newcommand{\cehead}{\kernel@ifnextchar[{\@@cehead}{\@cehead}}
-\newcommand{\@cehead}[1]{\renewcommand*{\scrheadings@even@middle@head}{#1}}
-\newcommand{\@@cehead}[2][]{%
- \renewcommand*{\scrplain@even@middle@head}{#1}%
- \renewcommand*{\scrheadings@even@middle@head}{#2}}
-\newcommand{\cohead}{\kernel@ifnextchar[{\@@cohead}{\@cohead}}
-\newcommand{\@cohead}[1]{\renewcommand*{\scrheadings@odd@middle@head}{#1}}
-\newcommand{\@@cohead}[2][]{%
- \renewcommand*{\scrplain@odd@middle@head}{#1}%
- \renewcommand*{\scrheadings@odd@middle@head}{#2}}
-\newcommand{\ifoot}{\kernel@ifnextchar[{\@@lfoot}{\@lfoot}}
-\newcommand{\@lfoot}[1]{\@refoot{#1}\@lofoot{#1}}
-\newcommand{\@@lfoot}[2][]{\@@refoot[{#1}]{#2}\@@lofoot[{#1}]{#2}}
-\newcommand{\ofoot}{\kernel@ifnextchar[{\@@rfoot}{\@rfoot}}
-\newcommand{\@rfoot}[1]{\@lefoot{#1}\@rofoot{#1}}
-\newcommand{\@@rfoot}[2][]{\@@lefoot[{#1}]{#2}\@@rofoot[{#1}]{#2}}
-\newcommand{\cfoot}{\kernel@ifnextchar[{\@@cfoot}{\@cfoot}}
-\newcommand{\@cfoot}[1]{\@cefoot{#1}\@cofoot{#1}}
-\newcommand{\@@cfoot}[2][]{\@@cefoot[{#1}]{#2}\@@cofoot[{#1}]{#2}}
-\newcommand{\lefoot}{\kernel@ifnextchar[{\@@lefoot}{\@lefoot}}
-\newcommand{\@lefoot}[1]{\renewcommand*{\scrheadings@even@left@foot}{#1}}
-\newcommand{\@@lefoot}[2][]{%
- \renewcommand*{\scrplain@even@left@foot}{#1}%
- \renewcommand*{\scrheadings@even@left@foot}{#2}}
-\newcommand{\lofoot}{\kernel@ifnextchar[{\@@lofoot}{\@lofoot}}
-\newcommand{\@lofoot}[1]{\renewcommand*{\scrheadings@odd@left@foot}{#1}}
-\newcommand{\@@lofoot}[2][]{%
- \renewcommand*{\scrplain@odd@left@foot}{#1}%
- \renewcommand*{\scrheadings@odd@left@foot}{#2}}
-\newcommand{\refoot}{\kernel@ifnextchar[{\@@refoot}{\@refoot}}
-\newcommand{\@refoot}[1]{\renewcommand*{\scrheadings@even@right@foot}{#1}}
-\newcommand{\@@refoot}[2][]{%
- \renewcommand*{\scrplain@even@right@foot}{#1}%
- \renewcommand*{\scrheadings@even@right@foot}{#2}}
-\newcommand{\rofoot}{\kernel@ifnextchar[{\@@rofoot}{\@rofoot}}
-\newcommand{\@rofoot}[1]{\renewcommand*{\scrheadings@odd@right@foot}{#1}}
-\newcommand{\@@rofoot}[2][]{%
- \renewcommand*{\scrplain@odd@right@foot}{#1}%
- \renewcommand*{\scrheadings@odd@right@foot}{#2}}
-\newcommand{\cefoot}{\kernel@ifnextchar[{\@@cefoot}{\@cefoot}}
-\newcommand{\@cefoot}[1]{\renewcommand*{\scrheadings@even@middle@foot}{#1}}
-\newcommand{\@@cefoot}[2][]{%
- \renewcommand*{\scrplain@even@middle@foot}{#1}%
- \renewcommand*{\scrheadings@even@middle@foot}{#2}}
-\newcommand{\cofoot}{\kernel@ifnextchar[{\@@cofoot}{\@cofoot}}
-\newcommand{\@cofoot}[1]{\renewcommand*{\scrheadings@odd@middle@foot}{#1}}
-\newcommand{\@@cofoot}[2][]{%
- \renewcommand*{\scrplain@odd@middle@foot}{#1}%
- \renewcommand*{\scrheadings@odd@middle@foot}{#2}}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\clearscrheadings}
-% \changes{v2.0j}{2001/08/18}{New}
-% \begin{macro}{\clearscrheadfoot}
-% \changes{v2.0j}{2001/08/18}{New}
-% \begin{macro}{\clearscrpain}
-% \changes{v2.0j}{2001/08/18}{New}
-% Maybe you want to clear the currently defined head and foot. First
-% let's clear only scrheadings pagestyle but not scrplain pagestyle.
-% We do this simply using the already known command:
-% \begin{macrocode}
-\newcommand*{\clearscrheadings}{%
- \ihead{}\chead{}\ohead{}\ifoot{}\cfoot{}\ofoot{}}
-% \end{macrocode}
-% We can do almost the same to clear scrheadings pagestyle and
-% scrplain pagestyle together:
-% \begin{macrocode}
-\newcommand*{\clearscrheadfoot}{%
- \ihead[]{}\chead[]{}\ohead[]{}\ifoot[]{}\cfoot[]{}\ofoot[]{}}
-% \end{macrocode}
-% But, for only clearing the scrplain pagestyle, we have to do the
-% redefinition directly:
-% \begin{macrocode}
-\newcommand*{\clearscrplain}{%
- \renewcommand*{\scrplain@even@left@head}{}%
- \renewcommand*{\scrplain@even@middle@head}{}%
- \renewcommand*{\scrplain@even@right@head}{}%
- \renewcommand*{\scrplain@odd@left@head}{}%
- \renewcommand*{\scrplain@odd@middle@head}{}%
- \renewcommand*{\scrplain@odd@right@head}{}%
- \renewcommand*{\scrplain@even@left@foot}{}%
- \renewcommand*{\scrplain@even@middle@foot}{}%
- \renewcommand*{\scrplain@even@right@foot}{}%
- \renewcommand*{\scrplain@odd@left@foot}{}%
- \renewcommand*{\scrplain@odd@middle@foot}{}%
- \renewcommand*{\scrplain@odd@right@foot}{}%
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-% Let's do the default setting:
-% \changes{v2.0m}{2002/02/05}{Active support for new letter class
-% \texttt{scrlttr2}}%^^A
-% \changes{v3.12}{2013/12/14}{fix \cs{rohead} if page number left at head}%^^A
-% \changes{v3.28}{2019/11/23}{\cs{PackageErrorNoLine} durch \cs{PackageError}
-% ersetzt}%^^A
-% \begin{macrocode}
-\def\@tempa{koma}\ifx\scrheadings@style\@tempa
- \@ifclassloaded{scrlttr2}{%
- \ifcase\@pageat
- \lehead[\pagemark]{\pagemark}\lohead[\pagemark]{\pagemark}%
- \chead{\rightmark}%
- \rehead{\leftmark}\rohead{\leftmark}%
- \or
- \lehead{\leftmark}\lohead{\leftmark}%
- \chead[\pagemark]{\pagemark}%
- \rehead{\rightmark}\rohead{\rightmark}%
- \or
- \lehead{\leftmark}\lohead{\leftmark}%
- \chead{\rightmark}%
- \rehead[\pagemark]{\pagemark}\rohead[\pagemark]{\pagemark}%
- \or
- \lehead{\leftmark}\lohead{\leftmark}%
- \rehead{\rightmark}\rohead{\rightmark}%
- \lefoot[\pagemark]{\pagemark}\lofoot[\pagemark]{\pagemark}%
- \or
- \lehead{\leftmark}\lohead{\leftmark}%
- \rehead{\rightmark}\rohead{\rightmark}%
- \cfoot[\pagemark]{\pagemark}%
- \or
- \lehead{\leftmark}\lohead{\leftmark}%
- \rehead{\rightmark}\rohead{\rightmark}%
- \refoot[\pagemark]{\pagemark}\rofoot[\pagemark]{\pagemark}%
- \fi
- \let\ps@save@myheadings=\ps@save@headings
- }{%
- \ohead{\if@twoside\headmark\fi}%
- \chead{\if@twoside\else\headmark\fi}%
- \cfoot[\if@twoside\else\pagemark\fi]{\if@twoside\else\pagemark\fi}%
- \ofoot[\if@twoside\pagemark\fi]{\if@twoside\pagemark\fi}%
- }%
-\else\def\@tempa{standard}\ifx\scrheadings@style\@tempa
- \ihead{\headmark}
- \ohead{\pagemark}
- \cfoot[\pagemark]{}
- \else\PackageError{scrpage2}{unknown scrheadings style}%
- {Somehow \string\scrheadings@style was
- defined\MessageBreak
- as ``\scrheadings@style''.\MessageBreak
- scrpage2 doesn't know what to do.
- If you'll continue, pagestyle
- ``scrheadings''\MessageBreak
- will be predefined empty.}
-\fi\fi
-\begingroup\expandafter\expandafter\expandafter\endgroup\expandafter
-\ifx\csname chaptermark\endcsname\relax
- \begingroup\expandafter\expandafter\expandafter\endgroup\expandafter
- \ifx\csname sectionmark\endcsname\relax
- \ifx\@mkboth\markboth\@automarktrue\fi
- \else
-% \end{macrocode}
-% \changes{v2.5a}{2012/11/02}{\cs{@gobble} is long, but \cs{sectionmark} and
-% \cs{chaptermark} may be short}
-% \begin{macrocode}
- \ifx\sectionmark\@gobble\else
- \begingroup
- \def\@gobble#1{}\ifx\sectionmark\@gobble\else
- \aftergroup\@automarktrue
- \fi
- \endgroup
- \fi
- \fi
-\else
- \ifx\chaptermark\@gobble\else
- \begingroup
- \def\@gobble#1{}\ifx\chaptermark\@gobble\else
- \aftergroup\@automarktrue
- \fi
- \endgroup
- \fi
-\fi
-% \end{macrocode}
-%
-%
-% \subsection{Configurationfile}
-% Not last and not least we include the local configuration-file
-% \texttt{scrpage.cfg}, if it exists.
-% \begin{macrocode}
-\InputIfFileExists{scrpage.cfg}
- {\typeout{*************************************^^J%
- * Local config file scrpage.cfg used^^J%
- *************************************}}
- {}
-% \end{macrocode}
-%
-%
-% \subsection{Some checks}
-% \changes{v2.0}{2001/04/20}{\cs{headheight}-check}
-% Last but not least we do some checks at version 2. Some means one at
-% the moment. And the one is a check, if the \cs{headheight} should be
-% increased.
-% \begin{macrocode}
-\AtBeginDocument{%
- \ifdim\headheight=12pt
- \PackageWarningNoLine{scrpage2}%
- {seems you are using a constant headheight.\MessageBreak
- If you get overfull \string\vbox\space warnings at almost every%
- \MessageBreak
- page, you should increase headheight e.g. writing\MessageBreak
- \space\string\setlength{\string\headheight}{%
- 1.1\string\baselineskip}\MessageBreak
- into the preamble of your document.\MessageBreak
- A better solution would be to use typearea package}%
- \else\ifdim\headheight<1.07\baselineskip
- \PackageWarningNoLine{scrpage2}%
- {seems you are using a very small headheight.\MessageBreak
- If you get overfull \string\vbox\space warnings at almost every%
- \MessageBreak
- page, you should increase headheight e.g. writing\MessageBreak
- \space\string\setlength{\string\headheight}{%
- 1.1\string\baselineskip}\MessageBreak
- into the preamble of your document.\MessageBreak
- A better solution would be to use typearea package}%
- \fi\fi}
-% \end{macrocode}
-%
-% \subsection{End}
-% \begin{macrocode}
-%</scrpage>
-% \end{macrocode}
-%
-% \Finale
-%
-\endinput
-%
-% end of file `scrpage.dtx'
-%%% Local Variables:
-%%% mode: doctex
-%%% TeX-master: t
-%%% End:
diff --git a/Master/texmf-dist/source/latex/koma-script/scrwfile.dtx b/Master/texmf-dist/source/latex/koma-script/scrwfile.dtx
index 25fa71ad3fb..26e3b0af9e4 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrwfile.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrwfile.dtx
@@ -2,7 +2,7 @@
% \iffalse meta-comment
% ======================================================================
% scrwfile.dtx
-% Copyright (c) Markus Kohm, 2010-2019
+% Copyright (c) Markus Kohm, 2010-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -29,7 +29,7 @@
% at least three times.
% ----------------------------------------------------------------------
% scrwfile.dtx
-% Copyright (c) Markus Kohm, 2010-2019
+% Copyright (c) Markus Kohm, 2010-2020
%
% Diese Datei ist Teil des LaTeX2e KOMA-Script-Pakets.
%
@@ -75,7 +75,7 @@
% Right brace \} Tilde \~}
%
% \iffalse
-%%% From File: $Id: scrwfile.dtx 3392 2019-11-19 09:37:46Z kohm $
+%%% From File: $Id: scrwfile.dtx 3453 2020-02-25 07:33:30Z kohm $
%<*dtx>
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\ProvidesFile{scrwfile.dtx}
@@ -454,6 +454,7 @@
% \cs{Ifattoclist}}%^^A
% \changes{v3.28}{2019/11/19}{\cs{iftocfeature} replaced by
% \cs{Iftocfeature}}%^^A
+% \changes{v3.30}{2020/02/25}{spurious space in warning message removed}%^^A
% Clone the entries from the second (first mandatory) argument TOC to the
% third (second mandatory) argument TOC. If the first (optional) argument was
% given, define |\listof#3name| to this and also define |\listof#3| and clone
@@ -482,7 +483,7 @@
\Ifattoclist{#3}{%
\PackageWarning{scrwfile}{`#3' already under control of
tocbasic.\MessageBreak
- Nevertheless features will be set
+ Nevertheless features will be set%
}%
}{%
\addtotoclist[TOCclone]{#3}%
diff --git a/Master/texmf-dist/source/latex/koma-script/tocbasic.dtx b/Master/texmf-dist/source/latex/koma-script/tocbasic.dtx
index 4f42a82726f..44a222f81dd 100644
--- a/Master/texmf-dist/source/latex/koma-script/tocbasic.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/tocbasic.dtx
@@ -1,8 +1,7 @@
-% \CheckSum{1643}
% \iffalse meta-comment
% ======================================================================
% tocbasic.dtx
-% Copyright (c) Markus Kohm, 2008-2019
+% Copyright (c) Markus Kohm, 2008-2020
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +19,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% tocbasic.dtx
-% Copyright (c) Markus Kohm, 2008-2019
+% Copyright (c) Markus Kohm, 2008-2020
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3c, verteilt und/oder veraendert werden.
@@ -55,7 +54,7 @@
% Right brace \} Tilde \~}
%
% \iffalse
-%%% From File: $Id: tocbasic.dtx 3401 2019-11-22 07:30:48Z kohm $
+%%% From File: $Id: tocbasic.dtx 3518 2020-08-25 08:26:01Z kohm $
%<identify>%%% (run: identify)
%<prepare>%%% (run: prepare)
%<option>%%% (run: option)
@@ -66,7 +65,7 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\begingroup
\def\filedate$#1: #2-#3-#4 #5${\gdef\filedate{#2/#3/#4}}
- \filedate$Date: 2019-11-22 08:30:48 +0100 (Fri, 22 Nov 2019) $
+ \filedate$Date: 2020-08-25 10:26:01 +0200 (Tue, 25 Aug 2020) $
\def\filerevision$#1: #2 ${\gdef\filerevision{r#2}}
\filerevision$Revision: 1962 $
\endgroup
@@ -134,11 +133,11 @@
\RecordChanges
\GetFileInfo{tocbasic.dtx}
\sloppy
+\begin{document}
\DocInput{\filename}
\end{document}
% \fi
%
-% \begin{document}
% \title{\KOMAScript{} \partname\ \texttt{\filename}%
% \thanks{Diese Datei ist Version \fileversion\ von \texttt{\filename}.}}
% \date{\filedate}
@@ -765,10 +764,12 @@
% too. Here are basics and high level commands for this.
%
% \begin{macro}{\tocbasic@starttoc}
-% \changes{v3.17}{2015/03/23}{usage of feature \texttt{noparskipfake}}%^^A
-% \changes{v3.27}{2019/07/08}{hack to add \cs{par} at end of (main) file}%^^A
+% \changes{v3.17}{2015/03/23}{usage of feature \texttt{noparskipfake}}
+% \changes{v3.27}{2019/07/08}{hack to add \cs{par} at end of (main) file}
% \changes{v3.28}{2019/11/19}{\cs{iftocfeature} replaced by
-% \cs{Iftocfeature}}%^^A
+% \cs{Iftocfeature}}
+% \changes{v3.32}{2020/08/25}{replace \cs{par} hack by \cs{par} solution}}
+% \changes{v3.32}{2020/08/25}{reentrant warning}
% Some basics are done like setting up \cs{parskip}, \cs{parindent} and
% \cs{parfillskip}, a general hook will be called, an individual hook will
% be called, the toc will be started, an individual hook will be called, an
@@ -777,6 +778,16 @@
%<*body>
\newcommand*{\tocbasic@starttoc}[1]{%
\begingroup
+ \tocbasic@reentrant@warning
+ \def\tocbasic@reentrant@warning{%
+ \PackageWarning{tocbasic}{%
+ Loading one auxiliary file inside the setup context\MessageBreak
+ of another auxiliary file is not recommended.\MessageBreak
+ In this case settings for `\@currext' could also influence\MessageBreak
+ settings of `#1' and local states of `#1' can also\MessageBreak
+ influence local states of `\@currext'%
+ }%
+ }%
\edef\@currext{#1}%
\Iftocfeature{\@currext}{noparskipfake}{}{%
\ifvmode
@@ -791,16 +802,29 @@
\setlength{\parfillskip}{\z@\@plus 1fil}%
\csname tocbasic@@before@hook\endcsname
\csname tb@#1@before@hook\endcsname
- \let\tocbasic@saved@input\@input
- \def\@input##1{%
- \let\@input\tocbasic@saved@input\@input{##1}\par
- }%
\@starttoc{#1}%
+ \BeforeClosingMainAux{%
+ \addtocontents{#1}{%
+ \string\providecommand\string\tocbasic@end@toc@file{}%
+ \string\tocbasic@end@toc@file
+ }%
+ }%
+ \edef\@currext{#1}%
\csname tb@#1@after@hook\endcsname
\csname tocbasic@@after@hook\endcsname
\endgroup
}
% \end{macrocode}
+% \begin{macro]{tocbasic@end@toc@file}
+% \changes{v3.32}{2020/08/25}{new}
+% \begin{macrocode}
+\newcommand*{\tocbasic@end@toc@file}{\par}
+% \end{macrocode}
+% \end{macro}%^^A \tocbasic@end@toc@file
+% \begin{macro}{\tocbasic@reentrant@warning}
+% \changes{v3.32}{2020/08/25}{new}
+\newcommand*{\tocbasic@reentrant@warning}{}
+% \end{macro}
% \begin{macro}{\tocbasic@@before@hook}
% \begin{macro}{\tocbasic@@after@hook}
% These are the general hooks. They may be used by classes and packages for
@@ -866,6 +890,8 @@
% of \cs{def}}%^^A
% \changes{v3.28}{2019/11/19}{\cs{iftocfeature} replaced by
% \cs{Iftocfeature}}%^^A
+% \changes{v3.31}{2020/07/08}{use one time expansion of local
+% \cs{list@fname}}%^^A
% Command to handle the hole list of something. There are additional hooks
% for this. The first optional argument is the title for this list. If the
% optional argument was omitted \cs{listof\#2name} will be used. The star
@@ -874,11 +900,11 @@
\newcommand*{\listoftoc}{%
\kernel@ifstar \tocbasic@starttoc\@listoftoc
}
-\newcommand*{\@listoftoc}[2][\list@fname]{%
+\newcommand*{\@listoftoc}[2][]{%
\begingroup
+ \def\list@fname{#1}%
\@ifundefined{listof#2name}{%
- \let\list@fname\relax
- \ifx\relax#1\relax
+ \ifx\list@fname\@empty
\PackageWarning{tocbasic}{%
You should either define \expandafter\string\csname
listof#2name\endcsname\MessageBreak
@@ -899,7 +925,7 @@
}%
}{}%
\Iftocfeature{\@currext}{numberline}{\def\nonumberline{\numberline{}}}{}%
- \tocbasic@listhead{#1}%
+ \expandafter\tocbasic@listhead\expandafter{\list@fname}%
\scr@ifundefinedorrelax{microtypesetup}{}{%
\Iftocfeature{\@currext}{noprotrusion}{}{%
\microtypesetup{protrusion=false}%
@@ -1649,6 +1675,7 @@
% \begin{macro}{\tb@nt@level}
% \changes{v3.20}{2015/12/16}{undefined}%^^A
% \changes{v3.20}{2015/12/16}{local valid only}%^^A
+% \changes{v3.30}{2020/02/25}{spurious space in warning message removed}%^^A
% Each entry to a TOC/list of has a numeric level. You may set up your own
% level.
% \begin{macrocode}
@@ -1656,7 +1683,7 @@
\PackageWarning{tocbasic}{%
deprecated option `level'.\MessageBreak
You should replace option `level' by option\MessageBreak
- `tocentrylevel'
+ `tocentrylevel'%
}%
\l@addto@macro\tb@nt@tocstyle@options{,level={##1}}%
\FamilyKeyStateProcessed
diff --git a/Master/texmf-dist/source/latex/koma-script/tocstyle.dtx b/Master/texmf-dist/source/latex/koma-script/tocstyle.dtx
deleted file mode 100644
index 94c77591ffd..00000000000
--- a/Master/texmf-dist/source/latex/koma-script/tocstyle.dtx
+++ /dev/null
@@ -1,2309 +0,0 @@
-% \CheckSum{1933}
-% \iffalse meta-comment
-% ======================================================================
-% tocstyle.dtx
-% Copyright (c) Markus Kohm, 2007-2019
-%
-% This file is part of the LaTeX2e KOMA-Script bundle.
-%
-% This work may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3c of the license.
-% 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 and of this work.
-%
-% This work has the LPPL maintenance status "author-maintained".
-%
-% The Current Maintainer and author of this work is Markus Kohm.
-%
-% The KOMA-Script bundle consists of all files listed in manifest.txt.
-% The work `tocstyle' consists of the files `tocstyle.dtx' and
-% `scrlogo.dtx'.
-%
-% If you're missing the installation batch file `tocstyle.ins', try
-% tex tocstyle.dtx
-% to unpack all files.
-% The package documentation may be produced repeating
-% latex tocstyle.dtx
-% at least three times.
-% ----------------------------------------------------------------------
-% tocstyle.dtx
-% Copyright (c) Markus Kohm, 2007-2019
-%
-% Diese Datei ist Teil des LaTeX2e KOMA-Script-Pakets.
-%
-% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
-% Version 1.3c.
-% Die neuste Version dieser Lizenz ist
-% http://www.latex-project.org/lppl.txt
-% und Version 1.3c ist Teil aller Verteilungen von LaTeX
-% Version 2005/12/01 und dieses Werks.
-%
-% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained"
-% (allein durch den Autor verwaltet).
-%
-% Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm.
-%
-% Das KOMA-Script-Paket besteht aus allen Dateien, die in manifest.txt
-% genannt sind.
-% Das Werk `tocstyle' besteht aus den Dateien `tocstyle.dtx' und
-% `scrlogo.dtx'.
-%
-% Falls Sie die Installations-Batch-Datei `tocstyle.ins' vermissen,
-% probieren Sie einfach einmal
-% tex tocstyle.dtx
-% um alle Dateien auszupacken. Zur englischen Anleitung siehe den
-% englischen Kommentar oben.
-% ======================================================================
-% \fi
-%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
-%
-% \iffalse
-%%% From File: $Id: tocstyle.dtx 3249 2019-10-09 11:35:26Z kohm $
-%<*dtx>
-% \fi
-\def\LaTeXformat{LaTeX2e}
-\let\ifbeta=\iffalse %^^A with = will be replaced by release process
-\ifx\fmtname\LaTeXformat\else
-% \iffalse
-%</dtx>
-%<*insfile>
-% \fi
-\def\batchfile{tocstyle.dtx}
-\input docstrip.tex
-\ifToplevel{%
- \Msg{**********************************************************************}
- \Msg{*}
- \Msg{* This is `\batchfile', a batchfile to unpack the package tocstyle.}
- \Msg{*}
- \Msg{**********************************************************************}
- \keepsilent
- \askforoverwritefalse
-}
-
-\preamble
-
-Copyright (c) 2007-2019 by Markus Kohm <komascript(at)gmx.info>
-
-This file was generated from file(s) of the KOMA-Script bundle.
----------------------------------------------------------------
-
-This work may be distributed and/or modified under the conditions of
-the LaTeX Project Public License, version 1.3c of the license.
-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 and of this work.
-
-This work has the LPPL maintenance status "author-maintained".
-
-The Current Maintainer and author of this work is Markus Kohm.
-
-This file may only be distributed together with the file
-`tocstyle.dtx' and `scrlogo.dtx'. You may however distribute the files
-`tocstyle.dtx' and `scrlogo.dtx' without this file.
-
-The english manual is in `tocstyle.dtx', too.
-
-THIS IS AN OBSOLETE PACKAGE! YOU SHOULD NOT USE IT!
-
-\endpreamble
-
-\generate{\usepreamble\defaultpreamble
- \file{tocstyle.sty}{%
- \from{tocstyle.dtx}{package,trace,tocstyle}%
- \from{scrlogo.dtx}{logo}%
- }%
-}
-
-\ifToplevel{%
- \generate{\usepreamble\defaultpreamble
- \file{tocstyle.ins}{%
- \from{tocstyle.dtx}{insfile}%
- }%
- \file{tocstyle.tex}{%
- \from{tocstyle.dtx}{doc}%
- }%
-% \file{tocstyle.drv}{%
-% \from{tocstyle.dtx}{driver}%
-% }%
- }%
-}
-
-% \iffalse
-%</insfile>
-%<*dtx>
-% \fi
- \def\ProvidesFile{\csname fi\endcsname\csname endinput\endcsname}
-\fi
-\ProvidesFile{tocstyle.dtx}
-% \iffalse
-%</dtx>
-%<package|driver>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
-%<package>\ProvidesPackage{tocstyle}
-%<driver>\ProvidesFile{tocstyle.drv}
-%<doc>\ProvidesFile{tocstyle.tex}
-%<*dtx|package|driver|doc>
- [2019/10/09 v0.2j-alpha deprecated package (versatile toc styles)]
-%</dtx|package|driver|doc>
-%<*driver>
-\documentclass{scrdoc}
-\usepackage[ngerman,english]{babel}
-\usepackage{listings}
-\lstnewenvironment{lstcode}[1][]{%
- \lstset{language=[LaTeX]TeX,basicstyle=\ttfamily\small,#1}%
-}{}
-
-\usepackage{tocstyle}
-\usetocstyle[toc]{nopagecolumn}
-\CodelineIndex
-\RecordChanges
-\GetFileInfo{tocstyle.dtx}
-\title{The obsolete package \texttt{tocstyle}%
- \footnote{This is version \fileversion\ of file \texttt{\filename}.}}
-\date{\filedate}
-\author{Markus Kohm}
-
-\let\Macro\cs
-\let\Package\textsf
-\let\File\texttt
-\let\Option\texttt
-\let\Counter\texttt
-\let\ShowOutput\quote
-\let\endShowOutput\endquote
-\let\Parameter\marg
-\let\OParameter\oarg
-\newcommand\PParameter[1]{\mbox{\texttt{\{#1\}}}}
-\let\PName\meta
-\let\PValue\texttt
-\newlength\descwidth
-\newenvironment{desctabular}{%
- \setlength{\descwidth}{\linewidth}
- \addtolength{\descwidth}{-1em}
- \addtolength{\descwidth}{-2\tabcolsep}
- \tabular{@{}lp{\descwidth}@{}}
- \hline
-}{%
- \hline
- \endtabular
-}
-\newcommand{\pventry}[2]{%
- \multicolumn{2}{@{}l@{}}{\PValue{#1}}\\
- ~ & #2 \\ }
-\providecommand*{\autoref}[1]{\expandafter\AUTOREF#1:}
-\newcommand*{\AUTOREF}{}
-\makeatletter
-\def\AUTOREF#1:#2:{%
- \edef\@tempa{#1}%
- \edef\@tempb{tab}\ifx\@tempa\@tempb table~\fi
- \edef\@tempb{sec}\ifx\@tempa\@tempb section~\fi
- \ref{#1:#2}%
-}
-\makeatother
-
-\begin{document}
- \maketitle
- \DocInput{\filename}
-\end{document}
-%</driver>
-% \fi
-%
-% \selectlanguage{english}
-%
-% \changes{v0.1}{2007/06/23}{start of new package}%^^A
-% \changes{v0.2h}{2016/04/12}{\cs{@ifnextchar} replaced by
-% \cs{kernel@ifnextchar}}%^^A
-%
-%\iffalse
-%<doc>\chapter{Other Styles for Table of Contents and Lists of Floats}
-%<doc>\labelbase{tocstyle}
-%<doc>\BeginIndex{Package}{tocstyle}
-%\fi
-%
-% \begin{abstract}
-%\iffalse
-%<*doc>
-%\fi
-While the main classes of the \KOMAScript\ bundle were made, there where
-several ideas for formating the table of contents and lists of floats, but
-almost none of them where implemented. One reason was, that the \KOMAScript\
-author didn't like to change the \LaTeX\ kernel at a class, because this may
-result in serveral problems with other packages. The package
-\Package{tocstyle} will fill the gap. If it conflicts with another package,
-you simply may decide not to use it.
-
-Since \KOMAScript~3.20 most of the features of \Package{tocstyle} are also
-provided by other \KOMAScript{} packages like \Package{tocbasic}.
-%\iffalse
-%</doc>
-%\fi
-% \end{abstract}
-%
-% \def\appendixtocdepth{\value{tocdepth}}
-% \tableofcontents
-% \def\appendixtocdepth{2}
-%
-%\iffalse
-%<*doc>
-%\fi
-%
-\section{Package Status}
-\label{sec:tocstyle.status}
-
-Package \Package{tocstyle} has alpha status for a very long time (since
-2007), despite the fact that it was very stable all over the years. The main
-reason for this is that it was an experiment and I always intended to make a
-better successor. Another reason was, that there are known issues, which are
-hardly to fix. So \Package{tocstyle} never became an official part of
-\KOMAScript. Nevertheless it has been published with \KOMAScript, because I
-thought it would be an useful addition. I never thought that the interim
-status of the package would be for more than eight years.
-
-With \KOMAScript~3.20 several features of \Package{tocstyle} can be found also
-in \Package{tocbasic}. I recommend to use that official and essential part of
-\KOMAScript{} instead of \Package{tocstyle} whenever possible. Expect that
-\Package{tocstyle} will move from \KOMAScript{} bundle to another package,
-e.\,g., \KOMAScript-obsolete or a stand-alone package soon.
-
-\section{How It Works}
-\label{sec:tocstyle.howitworks}
-
-Loading the package \Package{tocstyle} will redefine the kernel macro
-\Macro{@starttoc}. Using the redefined \Macro{@starttoc} will redefine
-\Macro{@dottedtocline}, \Macro{l@part} down to \Macro{l@subparagraph},
-\Macro{l@figure}, and \Macro{l@table}, if and only if \Package{tocstyle}
-wasn't deactivated for all TOCs or this TOC. Usage the redefined
-\Macro{@dottedtocline} will redefine \Macro{numberline}.
-
-Redefining \Macro{@starttoc}, \Macro{@dottedtocline}, and \Macro{numberline}
-will activate the features of \Package{tocstyle} for all lists that uses
-these, e.g. table of contents, list of figures and list of tables at the
-standard or the \KOMAScript{} classes. But while not all classes uses
-\Macro{@dottedtocline} and \Macro{@numberline} for all entries to table of
-contents and list of floats the package redefines some other macros that are
-typically used for those entries. These are e.g. \Macro{l@part},
-\Macro{l@chapter} and some more. If the class even does not use those macros,
-you may not use \Package{tocstyle} to change the lists. The term TOC will be
-used for all kind of list, that may be processed by \Package{tocstyle}. The
-package tests wether the original kernel macros \Macro{@starttoc},
-\Macro{@dottedtocline}, and \Macro{numberline} were used or not and warns if
-not.
-
-Package \Package{tocstyle} needs some more information. For the standard and
-the \KOMAScript{} classes these informations may be detected by the
-package. If the result is not the expected, you may configure these
-informations manually.
-
-The entries of every TOC hat a depth. See the counter \Counter{tocdepth} for
-more information about the depth. You may change several settings for the
-entries of either all depths of all TOCs, all depths of one TOC, or one depth
-of one TOC.
-
-But most users will not need to set up \Package{tocstyle} at this low
-level. They simply will select one of the predefined styles and maybe select
-one of the optional features.
-
-\section{Optional Features}
-\label{sec:tocstyle.options}
-
-Optional features will be selected using a package option while loading the
-package or using the package option as a global option loading the class using
-\Macro{documentclass}. Optional features change generall behaviour of all
-TOCs.
-
-%\iffalse
-\begin{Description}
- \Option{tocindentauto}
- \Option{tocindentmanual}
-\end{Description}
-\BeginIndex{Option}{tocindentauto}\BeginIndex{Option}{tocindentmanual}
-%</doc>
-%<*dtx>
-%\fi
-\DescribeMacro{tocindentauto}
-\DescribeMacro{tocindentmanual}
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-With option \Option{tocindentauto} all widths at the TOCs are calculated by
-\Package{tocstyle}. The calculation of the width needs at least one \LaTeX{}
-run with all TOC entries. So you need at least three \LaTeX{} runs:
-\begin{itemize}
-\item one to write all the TOC entries to the TOC file
-\item one with the known TOC entries from the TOC file but unknown widths
-\item one with the known TOC entries from the TOC file and known widths
-\end{itemize}
-If the TOC entries changed between the second and the third
-run\,---\,e.g. because of page numbers changed\,---\,you'll need one more run
-(and so on).
-
-Note: The widths of all entries of same depth and same TOC are same. Don't ask
-for less width of page numbers at the first than the last TOC page!
-%\iffalse
-\EndIndex{Option}{tocindentauto}\EndIndex{Option}{tocindentmanual}
-%\fi
-%
-%\iffalse
-\begin{Description}
- \Option{tocgraduated}
- \Option{tocflat}
- \Option{tocfullflat}
-\end{Description}%
-\BeginIndex{Option}{tocgraduated}\BeginIndex{Option}{tocflat}%
-\BeginIndex{Option}{tocfullflat}%
-%</doc>
-%<*dtx>
-%\fi
-\DescribeMacro{tocgraduated}
-\DescribeMacro{tocflat}
-\DescribeMacro{tocfullflat}
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-The option \Option{tocgraduated} selects the graduated version of all
-TOCs. You know the graduated version from the standard classes. Entries of lower
-depth are indented against entries of higher depth. This may e.g. look like:
-\begin{ShowOutput}
- \showtoc[{%
- \aliastoc{\tocstyleTOC}{toc}%
- \usetocstyle[toc]{standard}%
- \settocfeature[toc]{raggedhook}{\raggedright}%
- \selecttocstyleoption{tocgraduated}%
- }]{toc}
-\end{ShowOutput}
-The option \Option{tocflat} selects the flat\,---\,aka left
-aligned\,---\,version of all TOCs. You know the flat version from the
-\KOMAScript{} classes using option \Option{tocleft}. This may e.g. look like:
-\begin{ShowOutput}
- \showtoc[{%
- \aliastoc{\tocstyleTOC}{toc}%
- \usetocstyle[toc]{standard}%
- \selecttocstyleoption{tocflat}%
- }]{toc}%
-\end{ShowOutput}
-The option \Option{tocfullflat} is similar to flat version of all
-TOCs, but there is even no box of same width for the numbers of all entries.
-This may e.g. look like:
-\begin{ShowOutput}
- \showtoc[{%
- \aliastoc{\tocstyleTOC}{toc}%
- \usetocstyle[toc]{standard}%
- \selecttocstyleoption{tocfullflat}%
- }]{toc}%
-\end{ShowOutput}
-Default is option \Option{tocgraduated}.
-%\iffalse
-\EndIndex{Option}{tocgraduated}\EndIndex{Option}{tocflat}%
-\EndIndex{Option}{tocfullflat}%
-%\fi
-%
-%\iffalse
-\begin{Description}
- \Option{tocbreaksstrict}\\
- \Option{tocbreakscareless}
-\end{Description}%
-\BeginIndex{Option}{tocbreaksstrict}%
-\BeginIndex{Option}{tocbreakscareless}%
-%</doc>
-%<*dtx>
-%\fi
-\DescribeMacro{tocbreaksstrict}
-\DescribeMacro{tocbreakscareless}
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-Default option \Option{tocbreaksstrict} sets a lot of penalties before and
-after TOC entries to avoid page break between a TOC entry and it's parent. But
-sometimes you may like to allow more page breaks. You may use option
-\Option{tocbreakscareless} for this.
-%\iffalse
-\EndIndex{Option}{tocbreaksstrict}\EndIndex{Option}{tocbreakscareless}%
-%\fi
-%
-%\iffalse
-\begin{Description}
- \Option{toctextentriesindented}\\
- \Option{toctextentriesleft}
-\end{Description}%
-\BeginIndex{Option}{toctextentriesindented}%
-\BeginIndex{Option}{toctextentriesleft}%
-%</doc>
-%<*dtx>
-%\fi
-\DescribeMacro{toctextentriesindented}
-\DescribeMacro{toctextentriesleft}
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-With default option \Option{toctextentriesleft} unnumbered TOC entries,
-e.g. from \KOMAScript{} command \Macro{addchap}, are indented only as wide as
-the number of numbered TOC entries of the same level are. But with option
-\Option{toctextentriesindented} these are indented as if they have an empty
-number.
-%\iffalse
-\EndIndex{Option}{toctextentriesindented}%
-\EndIndex{Option}{toctextentriesleft}%
-%\fi
-%
-\section{Using TOC Styles}
-\label{sec:tocstyle.usestyles}
-
-Package \Package{tocstyle} hat several predefined toc styles. Most users will
-never need to define their own toc style but only select one of the
-predefined and maybe configure it by one of the options described at the
-previsous section.
-
-%\iffalse
-\begin{Description}
- \Macro{usetocstyle}\OParameter{TOC}\Parameter{style}
-\end{Description}%
-\BeginIndex{Macro}{usetocstyle}%
-%</doc>
-%<*dtx>
-%\fi
-\DescribeMacro{\usetocstyle}
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-You may set the style of one or all TOCs. If you want to set the style of all
-TOCs, you'd simply say \Macro{usetocstyle}\Parameter{style}. This will set
-all settings of the given style to all TOCs. Individual settings will
-overwrite this generall setting.
-
-If you use \Macro{usetocstyle}\OParameter{TOC}\Parameter{style}, only the
-style of the given TOC will be set. This will be done \emph{after} the general
-setting. Only individual settings of single features may overwrite the setting
-of the style.
-
-The \autoref{tab:tocstyle.styles} shows the predefined styles, that may be
-used as mandatory argument of \Macro{tocstyle}. The optional argument
-\PName{TOC} is the shortcut (file extension) of the TOC. Examples of known
-shortcuts are shown at \autoref{tab:tocstyle.shortcuts}.
-
-\begin{table}
- \centering
- \caption{Predefined TOC Styles}
- \label{tab:tocstyle.styles}
- \begin{desctabular}
- \pventry{standard}{A style similar to the standard classes. All width are
- predefined to the width of the standard classes, but may be overwritten
- by the general options (see \autoref{sec:tocstyle.options}). The depth -1
- (part) and 0 (chapter) are set in bold face (\Macro{bfseries}). If no
- depth 0 was found at the TOC, depth 1 (section) will be set in bold
- face, too. All other depth will be set in normal font. Depth -1 (part)
- will be set using \Macro{large}. The font changes are valid for the
- page numbers, too.}%
- \pventry{KOMAlike}{A style similar to the \KOMAScript{} classes. This is
- almost the same like \PValue{standard}, but instead of bold face
- \Macro{usekomafont}\PParameter{disposition} will be used if
- \Macro{usekomafont} was defined and sans serif, bold face
- (\Macro{sffamily}\Macro{bfseries}) if not.}%
- \pventry{classic}{Like \PValue{KOMAlike} but all page numbers are set
- using normal font.}%
- \pventry{allwithdot}{Like \PValue{classic} but dots between entry text and
- page numbers are used at all depths.}%
- \pventry{noonewithdot}{Like \PValue{classic} but not dots between entry
- text and page numbers are used.}%
- \pventry{nopagecolumn}{Like \PValue{noonewithdot} but also the gap
- between text and page numbers is omited. This means, that the page
- numbers are set 1\,em after the text.}%
- \end{desctabular}
-\end{table}
-
-Note: Before you're setting a style the style of the TOCs are
-unspecified. This means that some entries may be set using \Package{tocstyle}
-others may not.
-
-\begin{table}
- \centering
- \caption{Known TOC Shortcuts}
- \label{tab:tocstyle.shortcuts}
- \begin{desctabular}
- \pventry{toc}{Table of contents of almost all known classes.}
- \pventry{lof}{List of figures of almost all known classes.}
- \pventry{lot}{List of tables of almost all known classes.}
- \pventry{lol}{List of listings of package \Package{listings}. Currently
- the usability of \Package{listings} with \Package{tocstyle} is not
- recomended. Maybe it works, maybe not. Maybe you should try
- \Macro{deactivatetocstyle[lol]}.}
- \end{desctabular}
-\end{table}
-%\iffalse
-\EndIndex{Macro}{usetocstyle}%
-%\fi
-%
-%\iffalse
-\begin{Description}
- \Macro{deactivatetocstyle}\OParameter{TOC}\\
- \Macro{reactivatetocstyle}\OParameter{TOC}
-\end{Description}%
-\BeginIndex{Macro}{\deactivatetocstyle}\BeginIndex{Macro}{\reactivatetocstyle}%
-%</doc>
-%<*dtx>
-%\fi
-\DescribeMacro{\deactivatetocstyle}\DescribeMacro{\reactivatetocstyle}
-Both commands have one optional argument \PName{TOC}.
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-You may deactive the influence of \Package{tocstyle} for a TOC and reactivate
-it. If you use \Macro{deactivatetocstyle} without the optional argument or
-empty optional argument, the influence of \Package{tocstyle} for all TOCs will
-be deactivated and may reactivated only using \Macro{reactivatetocstyle}
-without the optional argument or empty optional argument too.
-
-After deactivation of \Package{tocstyle} for one TOC or all TOCs you may
-continue configuring TOCs. All these changes will be used after reactivation.
-%\iffalse
-\EndIndex{Macro}{\deactivatetocstyle}\EndIndex{Macro}{\reactivatetocstyle}%
-%\fi
-
-%
-
-\section{Setting-up Single Features}
-\label{sec:tocstyle.singlefeatures}
-
-At the previous section you've learned how to select a predefined TOC
-style. You were also told, that you may change one ore more features against
-the used predefined TOC style for one or all depth of one ore all TOCs. Now
-you will learn how to do this.
-
-%\iffalse
-\begin{Description}
- \Macro{settocfeature}%
- \OParameter{TOC}\OParameter{depth}\Parameter{feature}\Parameter{commands}\\
- \Macro{settocstylefeature}%
- \OParameter{depth}\Parameter{feature}\Parameter{commands}
-\end{Description}%
-\BeginIndex{Macro}{settocfeature}\BeginIndex{Macro}{settocstylefeature}%
-%</doc>
-%<*dtx>
-%\fi
-\DescribeMacro{\settocfeature}
-\DescribeMacro{\settocstylefeature}
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-These commands are used to set a single feature eiher of all depth of all TOCs
-(\Macro{settocfeature} \Parameter{feature} \Parameter{command} or
-\Macro{settocstylefeature} \Parameter{feature} \Parameter{commands}), or of
-all depth of a single TOC (\Macro{settocfeature}
-\OParameter{TOC} \Parameter{feature} \Parameter{commands}), or of a single
-depth of all TOCs (\Macro{settocstylefeature}
-\OParameter{depth} \Parameter{feature} \Parameter{commands}), or of a single
-depth of a single TOC (\Macro{settocfeature} \OParameter{TOC}
-\OParameter{depth} \Parameter{feature} \Parameter{commands}).
-
-Parameter \PName{commands} is a list of commands. In most cases these must not
-be commands, that need an argument. So you should e.g. not use \Macro{textbf}
-but \Macro{bfseries} to switch to bold face. Parameter \PName{feature} is
-the feature, that may be configured with parameter \PName{commands}. All known
-features are show at \autoref{tab:tocstyle.features}.
-
-\begin{table}
- \centering
- \caption{Features that May Be Set}
- \label{tab:tocstyle.features}
- \begin{desctabular}
- \pventry{dothook}{will be executed before any dot of the dot line}%
- \pventry{entryhook}{hook before the entry will be set}%
- \pventry{entryvskip}{initial vertical skip amount (if not set 0pt plus
- .2pt will be used)}%
- \pventry{leaders}{commands for fillin the gap between entry text and page
- number (if not set the default leaders command with dots will be used)}%
- \pventry{pagenumberbox}{the box command for setting the page number (if
- not set the default box of with \Macro{@pnumwidth} will be used); note,
- that this has to be a command with exactly one argument}%
- \pventry{pagenumberhook}{hook before the page number will be set at the
- page number box}%
- \pventry{parfillskip}{add this amount to the default value of
- \Macro{parfillskip} after setting up all lengths}%
- \pventry{raggedhook}{the only allowed values here are \Macro{raggedright}
- or nothing}%
- \pventry{spaceafternumber}{amount of minimum space after the entry number,
- if the needed width will be calculated automaticly}%
- \end{desctabular}
-\end{table}
-
-The order of used commands for a feature is
-\begin{enumerate}
-\item commands for all depths of all TOCs,
-\item commands for all depth of a single TOC,
-\item commands for a single depth of all TOCs,
-\item commands for a single depth of a single TOC,
-\end{enumerate}
-and settings of \Macro{usetocstyle} may be overwritten by
-\Macro{settocfeature} und \Macro{settocstylefeature}.
-%\iffalse
-\EndIndex{Macro}{settocfeature}\EndIndex{Macro}{settocstylefeature}%
-%\fi
-%
-
-\section{Defining New TOC Styles}
-\label{sec:tocstyle.define}
-
-Now you know how to select a prefedined TOC style and how to change single
-features. But wouldn't it be nice to define your own TOC style?
-
-%\iffalse
-\begin{Description}
- \Macro{newtocstyle}\OParameter{parent style}\OParameter{exclude features}%
- \Parameter{new style}%
- \Parameter{\Macro{settocstylefeature}-commands}
-\end{Description}%
-\BeginIndex{Macro}{\newtocstyle}%
-%</doc>
-%<*dtx>
-%\fi
-\DescribeMacro{\newtocstyle}
-You may do this using \Macro{newtocstyle}\OParameter{parent
- style} \OParameter{exclude features} \Parameter{style
- name} \Parameter{\Macro{settocstylefeature}-commands}.
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-If you used the optional argument \PName{parent style} all features of the
-parent style will be part of the new style, before overwriting them with the
-features of the \PName{\Macro{settocstylefeature}-commands}. You should not
-use any other commands at the last argument. But at \Macro{newtocstyle} the
-command \Macro{settocfeature} becomes an alias for \Macro{settocstylefeature}
-to avoid to much mistakes.
-
-The second optional argument is a comma seperated list of feature names. If it
-is used, these features of the parent style (and all ancestors of the parent)
-will not be part of the new style.
-%\iffalse
-\EndIndex{Macro}{\newtocstyle}%
-%\fi
-
-%\iffalse
-\begin{Description}
- \Macro{aliastoc}\Parameter{original-TOC}\Parameter{alias-TOC}
-\end{Description}%
-\BeginIndex{Macro}{\aliastoc}%
-You
-%</doc>
-%<*dtx>
-%\fi
-\DescribeMacro{\aliastoc}
-Using \Macro{aliastoc}\Parameter{original-TOC}\Parameter{alias-TOC} you
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-may define an alias for a TOC. The first argument is the original TOC for that
-the second argument should be the alias. An alias-TOC will be processed
-with all settings, that were done for the original-TOC. Internally this
-command is used as default for the optional, first argument of
-\Macro{showtoc}.%
-%\iffalse
-\EndIndex{Macro}{\aliastoc}
-%\fi
-
-\section{Processing a TOC}
-\label{sec:tocstyle.processing}
-
-While \LaTeX{} inputs a toc file it processes the commands of the TOC. These
-commands mainly produce the entries of the toc. Some commands are only
-available or valid while a TOC is processed. But be carefull: Some of these
-are read-only commands. Changing such a read-only command may result in
-various errors!
-
-%\iffalse
-\begin{Description}
- \Macro{@starttoc}\Parameter{TOC}\\
- \Macro{showtoc}\OParameter{preprocession}\Parameter{TOC}
-\end{Description}%
-\BeginIndex{Macro}{\@starttoc}%
-\BeginIndex{Macro}{\showtoc}%
-%</doc>
-%<*dtx>
-%\fi
-\DescribeMacro{\@starttoc}%
-\DescribeMacro{\showtoc}%
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-The internal comand \Macro{@startoc} is defined by the \LaTeX{} kernel. It is
-used by package and class authors to build commands like
-\Macro{tableofcontents} or \Macro{listoffigures}. Without using it you will
-not get a toc file. \Package{tocstyle} redefines it, to add pre- and
-post-processing commands. The original definition found by \Package{tocstyle}
-will be used inside the redefinition.
-
-\Macro{showtoc}%
-%\iffalse
-%</doc>
-%<*dtx>
-%\fi
-\OParameter{preprocession}\Parameter{TOC}%
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-\ is an addition of \texttt{tocstyle}. Using it will procude a copy of TOC and
-process this copy. The copy will be done just after creating the original
-TOC. The copy will be an alias for the original file. The extension of the
-copy is the generated alias if \PName{TOC}. You may generate the alias using
-\Macro{aliastoc} at the optional argument of \Macro{showtoc}. The default for
-this optional argument will be
-\Macro{aliastoc}\Macro{tocstyleTOC}\Macro{tocstyleAliasTOC} and the default
-alias \Macro{tocstyleAliasTOC} will be \Macro{tocstyleTOC} extended by a
-number.
-%\iffalse
-\begin{example}
-%\fi
-The first TOC example at \autoref{sec:tocstyle.options} was made using
-\begin{lstcode}
- \showtoc[{%
- \aliastoc{\tocstyleTOC}{toc}%
- \usetocstyle[toc]{standard}%
- \settocfeature[toc]{raggedhook}{\raggedright}%
- \selecttocstyleoption{tocgraduated}%
- }]{toc}
-\end{lstcode}
-If you want to show a copy of the table of contents, that shows only depth~1 of
-the headlines you may simply use:
-\begin{lstcode}
- \showtoc[{%
- \expandafter\value{tocdepth}=1\relax
- \aliastoc{\tocstyleTOC}{toc}%
- }]{toc}
-\end{lstcode}
-or
-\begin{lstcode}
- \newcounter{savedtocdepth}
- \setcounter{savedtocdepth}{\value{tocdepth}}
- \setcounter{tocdepth}{1}
- \showtoc{toc}
- \setcounter{tocdepth}{\value{savedtocdepth}}
-\end{lstcode}
-%\iffalse
-\end{example}%
-\EndIndex{Macro}{\showtoc}
-%\fi
-
-%\iffalse
-\begin{Description}
- \Macro{tocstyleTOC}\\
- \Macro{tocstyleAliasTOC}
-\end{Description}%
-\BeginIndex{Macro}{\tocstyleTOC}%
-\BeginIndex{Macro}{\tocstyleAliasTOC}%
-%</doc>
-%<*dtx>
-%\fi
-\DescribeMacro{\tocstyleTOC}%
-\DescribeMacro{\tocstyleAliasTOC}%
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-These are read-only macros. While processing a TOC using \Macro{@starttoc} or
-\Macro{showtoc}, \Macro{tocstyleAliasTOC} is the shortcut, that is valid for
-the features and \Macro{tocstyleTOC} is valid for the file extension to be
-used.%
-%\iffalse
-\EndIndex{Macro}{\tocstyleAliasTOC}%
-\EndIndex{Macro}{\tocstyleTOC}
-%\fi
-
-%\iffalse
-\begin{Description}
- \Macro{tocstyledepth}
-\end{Description}%
-\BeginIndex{Macro}{\tocstyledepth}%
-%</doc>
-%<*dtx>
-%\fi
-\DescribeMacro{\tocstyledepth}
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-This is a read-only macro. While processing a single toc entry with
-\Macro{@dottedtocline} this is the depth (first argument of
-\Macro{@dottedtocline}) of this entry. Most users will never need this, but it
-is often used internaly. Because of this \emph{you should never change it!}%
-%\iffalse
-\EndIndex{Macro}{\tocstyledepth}
-%\fi
-
-%\iffalse
-\begin{Description}
- \Macro{iftochasdepth}\Parameter{TOC}\Parameter{depth}\Parameter{true}%
- \Parameter{false}
-\end{Description}
-\BeginIndex{Macro}{\iftochasdepth}%
-You
-%</doc>
-%<*dtx>
-%\fi
-\DescribeMacro{\iftochasdepth}
-Using \Macro{iftochasdepth}\Parameter{TOC}\Parameter{depth}\Parameter{true}%
- \Parameter{false} you
-%\iffalse
-%</dtx>
-%<*doc>
-%\fi
-may test, if an entry of a given depth was already output to a TOC. If so
-the commands of argument \PName{true} will be processed. If not so the
-commands of argument \PName{false} will be processed.%
-%\iffalse
-\EndIndex{Macro}{\iftochasdepth}
-%\fi
-
-\section{Configuration file}
-\label{sec:tocstyle.cfg}
-
-There's another feature for new toc styles. If there's a file
-\File{tocstyle.cfg} it will be loaded at the end of the package. This is
-usefull to define your own toc styles.
-
-%
-%\iffalse
-%</doc>
-%\fi
-%
-% \StopEventually{%
-% \clearpage
-% \appendix
-% \addtocontents{toc}{%
-% \value{tocdepth}=\protect\appendixtocdepth\relax}
-% \section{Examples for the Different TOC Styles}
-% Here you will find the table of contents of this document set in the
-% different TOC styles. All are set with option \Option{tocindentauto}.
-%^^A The appendix will be omitted.
-% \subsection{Graduated Versions}
-% First of all all graduated versions of the table of contents
-% \selecttocstyleoption{tocgraduated}%
-% \subsubsection{\PValue{standard} with Option \Option{tocgraduated}}
-% \usetocstyle[toc]{standard}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{KOMAlike} with Option \Option{tocgraduated}}
-% \usetocstyle[toc]{KOMAlike}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{classic} with Option \Option{tocgraduated}}
-% \usetocstyle[toc]{classic}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{allwithdot} with Option \Option{tocgraduated}}
-% \usetocstyle[toc]{allwithdot}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{noonewithdot} with Option \Option{tocgraduated}}
-% \usetocstyle[toc]{noonewithdot}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{nopagecolumn} with Option \Option{tocgraduated}}
-% \usetocstyle[toc]{nopagecolumn}
-% \showtoc{toc}\clearpage
-% \subsection{Flat Versions}
-% Now, all flat versions of the table of contents
-% \selecttocstyleoption{tocflat}%
-% \subsubsection{\PValue{standard} with Option \Option{tocflat}}
-% \usetocstyle[toc]{standard}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{KOMAlike} with Option \Option{tocflat}}
-% \usetocstyle[toc]{KOMAlike}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{classic} with Option \Option{tocflat}}
-% \usetocstyle[toc]{classic}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{allwithdot} with Option \Option{tocflat}}
-% \usetocstyle[toc]{allwithdot}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{noonewithdot} with Option
-% \Option{tocflat}}
-% \usetocstyle[toc]{noonewithdot}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{nopagecolumn} with Option
-% \Option{tocflat}}
-% \usetocstyle[toc]{nopagecolumn}
-% \showtoc{toc}\clearpage
-% \subsection{Fullflat Versions}
-% Now, all full-flat versions of the table of contents
-% \selecttocstyleoption{tocfullflat}%
-% \subsubsection{\PValue{standard} with Option \Option{tocfullflat}}
-% \usetocstyle[toc]{standard}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{KOMAlike} with Option \Option{tocfullflat}}
-% \usetocstyle[toc]{KOMAlike}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{classic} with Option \Option{tocfullflat}}
-% \usetocstyle[toc]{classic}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{allwithdot} with Option \Option{tocfullflat}}
-% \usetocstyle[toc]{allwithdot}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{noonewithdot} with Option
-% \Option{tocfullflat}}
-% \usetocstyle[toc]{noonewithdot}
-% \showtoc{toc}\clearpage
-% \subsubsection{\PValue{nopagecolumn} with Option
-% \Option{tocfullflat}}
-% \usetocstyle[toc]{nopagecolumn}
-% \showtoc{toc}\clearpage
-% \PrintIndex\PrintChanges}
-%
-% \section{Implementation}
-%
-% \iffalse
-%<*package>
-% \fi
-%
-% \begin{macrocode}
-\PackageWarningNoLine{tocstyle}{%
- THIS IS A DEPRECATED ALPHA VERSION!\MessageBreak
- USAGE OF THIS VERSION IS ON YOUR OWN RISK!\MessageBreak
- EVERYTHING MAY HAPPEN!\MessageBreak
- THE PACKAGE IS FROZEN WITH ALL IT'S BUGS!\MessageBreak
- IT WILL BE REMOVED FROM KOMA-SCRIPT SOON!\MessageBreak
- THERE IS NO SUPPORT, IF YOU USE THIS PACKAGE!\MessageBreak
- Maybe it would be better, not to load this package%
-}
-% \end{macrocode}
-%
-% \subsection{Option}
-%
-% Options change general behaviour of TOCs.
-%
-% \begin{macro}{\selecttocstyleoption}
-% \begin{macrocode}
-\newif\if@tocstyle@penalties
-\newif\iftocstyle@autolength
-\newif\iftocstyle@indentnotnumbered
-\newcount\tocstyle@indentstyle\tocstyle@indentstyle=\z@
-\newcommand*{\selecttocstyleoption}[1]{%
- \begingroup
- \edef\@tempa{#1}%
- \edef\@tempb{tocbreaksstrict}%
- \ifx\@tempa\@tempb\aftergroup\@tocstyle@penaltiestrue\else
- \edef\@tempb{tocbreakscareless}%
- \ifx\@tempa\@tempb\aftergroup\@tocstyle@penaltiesfalse\else
- \edef\@tempb{tocindentauto}
- \ifx\@tempa\@tempb\aftergroup\tocstyle@autolengthtrue\else
- \edef\@tempb{tocindentmanual}%
- \ifx\@tempa\@tempb\aftergroup\tocstyle@autolengthfalse\else
- \edef\@tempb{tocgraduated}%
- \ifx\@tempa\@tempb
- \aftergroup\tocstyle@indentstyle\aftergroup\z@
- \else
- \edef\@tempb{tocflat}%
- \ifx\@tempa\@tempb
- \aftergroup\tocstyle@indentstyle\aftergroup\@ne
- \aftergroup\relax
- \else
- \edef\@tempb{tocfullflat}%
- \ifx\@tempa\@tempb
- \aftergroup\tocstyle@indentstyle\aftergroup\tw@
- \aftergroup\relax
- \else
- \edef\@tempb{toctextentriesindented}%
- \ifx\@tempa\@tempb\aftergroup\tocstyle@indentnotnumberedtrue
- \else
- \edef\@tempb{toctextentriesleft}%
- \ifx\@tempa\@tempb
- \aftergroup\tocstyle@indentnotnumberedfalse
- \else
- \PackageError{tocstyle}{unknown option `#1'}{%
- You've told me to select toc style option
- `#1',\MessageBreak
- but tocstyle doesn't know an option named `#1'}%
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \endgroup
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{option}{chapter}
-% \changes{v0.2d}{2009/11/11}{New}
-% \begin{option}{nochapter}
-% \changes{v0.2d}{2009/11/11}{New}
-% \begin{macro}{\iftochaschapter}
-% \changes{v0.2d}{2009/11/11}{New}
-% Do we have \cs{chapter} and \cs{l@chapter}?
-% \begin{macrocode}
-\newif\iftochaschapter\tochaschapterfalse
-\ifcsname l@chapter\endcsname
- \ifcsname chapter\endcsname
- \tochaschaptertrue
- \fi
-\fi
-% \end{macrocode}
-% \end{macro}
-% \end{option}
-% \end{option}
-%
-% \begin{option}{tocbreaksstrict}
-% \begin{option}{tocbreakscareless}
-% Switch on extended pernalties.
-% \begin{macrocode}
-\DeclareOption{tocbreaksstrict}{\selecttocstyleoption\CurrentOption}
-\DeclareOption{tocbreakscareless}{\selecttocstyleoption\CurrentOption}
-% \end{macrocode}
-% \end{option}
-% \end{option}
-%
-% \begin{option}{tocindentauto}
-% \begin{option}{tocindentmanual}
-% \begin{macrocode}
-\DeclareOption{tocindentauto}{\selecttocstyleoption\CurrentOption}
-\DeclareOption{tocindentmanual}{\selecttocstyleoption\CurrentOption}
-% \end{macrocode}
-% \end{option}
-% \end{option}
-%
-% \begin{option}{toctextentriesindented}
-% \begin{option}{toctextentriesleft}
-% \begin{macrocode}
-\DeclareOption{toctextentriesindented}{\selecttocstyleoption\CurrentOption}
-\DeclareOption{toctextentriesleft}{\selecttocstyleoption\CurrentOption}
-% \end{macrocode}
-% \end{option}
-% \end{option}
-%
-% \begin{option}{tocgraduated}
-% \begin{option}{tocflat}
-% \begin{option}{tocfullflat}
-% \begin{macrocode}
-\DeclareOption{tocgraduated}{\selecttocstyleoption\CurrentOption}
-\DeclareOption{tocflat}{\selecttocstyleoption\CurrentOption}
-\DeclareOption{tocfullflat}{\selecttocstyleoption\CurrentOption}
-% \end{macrocode}
-% \end{option}
-% \end{option}
-% \end{option}
-%
-% Defaults and others:
-% \begin{macrocode}
-\ExecuteOptions{tocbreaksstrict,tocindentauto,tocgraduated,%
- toctextentriesleft}
-\ProcessOptions\relax
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ifcsname if@tocleft\endcsname
- \expandafter\let\csname if@tempswa\expandafter\endcsname
- \csname if@tocleft\endcsname
-\else
- \@tempswafalse
-\fi
-\if@tempswa
- \PackageWarningNoLine{tocstyle}{%
- You should not use class option `toc=flat'!\MessageBreak
- This may result in errors or unexpected results.\MessageBreak
- I'll try to deactivate `toc=flat', now.\MessageBreak
- You may use package options `tocflat' and\MessageBreak
- `tocindentauto' instead of `toc=flat'}%
- \csname @tocleftfalse\endcsname
-\fi
-% \end{macrocode}
-%
-%
-% \subsection{Body}
-%
-% There are two parts at \Package{tocstyle}:
-% \begin{itemize}
-% \item redefining internal \LaTeX{} kernel macros,
-% \item defining new macros and redefining class macros.
-% \end{itemize}
-% Redefining \LaTeX{} kernel macros may not be switched of. But redefining
-% class macros will only be on demand.
-%
-% \subsubsection{Redefining \LaTeX{} Kernel Macros}
-%
-% Some \LaTeX{} kernel macros must be redefined to add the new
-% functionality. Before redefining them, we test against the definition at
-% kernel 2005/12/01
-%
-% \begin{macro}{\@starttoc}
-% \begin{macro}{\tocstyle@saved@@starttoc}
-% The original definition will be extended by defaults for \cs{parskip},
-% \cs{parindent} and % \cs{parfillskip} and storage of the shortcut of the
-% current TOC.
-% \begin{macrocode}
-\newcommand*\tocstyle@saved@starttoc{}
-\let\tocstyle@saved@starttoc\@starttoc
-\renewcommand*{\@starttoc}[1]{%
- \tocstyle@pre@starttoc{#1}%
- \tocstyle@saved@starttoc{#1}%
- \tocstyle@post@starttoc{#1}%
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\tocstyle@saved@dottedtocline}
-% For saving the unchanged definition (at \cs{begin{document}}):
-% \begin{macrocode}
-\newcommand*{\tocstyle@saved@dottedtocline}{}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\tocstyle@dottedtocline}
-% \changes{v0.2j}{2019/10/09}{newer \LaTeX{} uses two \cs{kern}}%^^A
-% Implement new definition and redefine:
-%^^A ------ Help me to find the \renecommand*{\@dottedtocline} ----------------
-% \begin{macrocode}
-\newcommand*{\tocstyle@dottedtocline}[5]{%
- \let\numberline\tocstyle@numberline
- \ifnum #1>\c@tocdepth \else
-% \end{macrocode}
-% Penalty feature: no page break between higher and lower depths.
-% \begin{macrocode}
- \if@tocstyle@penalties
- \begingroup
- \@tempcnta 20010
- \advance \@tempcnta by -#1
- \ifnum \@tempcnta>\lastpenalty
- \aftergroup\penalty\aftergroup\@lowpenalty
- \fi
- \endgroup
- \fi
-% \end{macrocode}
-% Activation of all features for this TOC and depth:
-% \begin{macrocode}
- \edef\tocstyledepth{#1}%
- \tocstyle@activate@features
-% \end{macrocode}
-% Similar to kernel command but if feature \texttt{entryvskip} was set use
-% \cs{addvspace}:
-% \begin{macrocode}
- \ifx\tocstyle@feature@entryvskip\relax
- \vskip \z@ \@plus.2\p@
- \else
- \addvspace{\tocstyle@feature@entryvskip}%
- \fi
- {%
-% \end{macrocode}
-% Preinitialization of lengths and skips and then call a hook
-% \begin{macrocode}
- \parskip \z@ \parindent \z@ \leftskip \z@ \rightskip \z@
- \tocstyle@feature@raggedhook
-% \end{macrocode}
-% Set number indent to \cs{@tempdimb} and text indent to \cs{@tempdima}.
-% \begin{macrocode}
- \@tempdima #3\relax
- \@tempdimb #2\relax
-%<trace> \typeout{number indent by \string\l@... (\tocstyleTOC, \tocstyledepth): \space\the\@tempdimb}%
-%<trace> \typeout{text indent by \string\l@... (\tocstyleTOC, \tocstyledepth): \space\the\@tempdima}%
-% \end{macrocode}
-% \changes{v0.2d}{2009/11/09}{fix: use of max-values}
-% Calc auto lengths. Use max. of last run of parents if available.
-% \begin{macrocode}
- \ifnum #1>\z@\relax
- \@tempcnta #1\relax \advance\@tempcnta \m@ne
- \ifcsname tocstyle@maxskipwidth@\tocstyleTOC @\the\@tempcnta\endcsname
- \ifcsname tocstyle@maxnumwidth@\tocstyleTOC @\the\@tempcnta\endcsname
- \@tempdimb
- \csname tocstyle@maxskipwidth@\tocstyleTOC @\the\@tempcnta\endcsname
- \advance\@tempdimb
- \csname tocstyle@maxnumwidth@\tocstyleTOC @\the\@tempcnta\endcsname
- \fi
- \fi
- \fi
-%<trace> \typeout{number indent by parent (\tocstyleTOC, \tocstyledepth): \space\the\@tempdimb}%
- \ifcsname tocstyle@skipwidth@\tocstyleTOC @#1\endcsname
- \ifdim \@tempdimb>
- \csname tocstyle@skipwidth@\tocstyleTOC @#1\endcsname\relax
- \expandafter\xdef\csname tocstyle@skipwidth@\tocstyleTOC
- @#1\endcsname{\the\@tempdimb}%
- \fi
- \else
- \expandafter\xdef\csname tocstyle@skipwidth@\tocstyleTOC
- @#1\endcsname{\the\@tempdimb}%
- \fi
- \iftocstyle@autolength
- \ifcsname tocstyle@maxskipwidth@\tocstyleTOC @#1\endcsname
- \@tempdimb \csname tocstyle@maxskipwidth@\tocstyleTOC @#1\endcsname
- \relax
- \fi
- \ifcsname tocstyle@maxnumwidth@\tocstyleTOC @#1\endcsname
- \@tempdima \csname tocstyle@maxnumwidth@\tocstyleTOC @#1\endcsname
- \relax
- \fi
-%<trace> \typeout{text indent calculated (\tocstyleTOC, \tocstyledepth): \the\@tempdima}%
-%<trace> \typeout{number indent calculated (\tocstyleTOC, \tocstyledepth): \the\@tempdimb}%
- \else
- \@tempdimb #2\relax
-%<trace> \typeout{number indent explicite (\tocstyleTOC, \tocstyledepth): \the\@tempdimb}%
- \fi
- \ifcsname tocstyle@unumwidth@\tocstyleTOC @\endcsname
- \ifdim \@tempdima>
- \csname tocstyle@unumwidth@\tocstyleTOC @\endcsname\relax
- \expandafter\xdef\csname tocstyle@unumwidth@\tocstyleTOC
- @\endcsname{\the\@tempdima}%
- \fi
- \else
- \expandafter\xdef\csname tocstyle@unumwidth@\tocstyleTOC
- @\endcsname{\the\@tempdima}%
- \fi
- \ifcase\tocstyle@indentstyle\relax\else
- \@tempdimb \z@
- \ifcsname tocstyle@maxunumwidth@\tocstyleTOC @\endcsname
- \@tempdima \csname tocstyle@maxunumwidth@\tocstyleTOC @\endcsname
- \relax
- \fi
-%<trace> \typeout{text noindent (\tocstyleTOC, \tocstyledepth): \the\@tempdima}%
-%<trace> \typeout{number noindent (\tocstyleTOC, \tocstyledepth): \the\@tempdimb}%
- \fi
-% \end{macrocode}
-% Advance instead of set, because of the hook above:
-% \begin{macrocode}
- \advance\parindent \@tempdimb\@afterindenttrue
- \advance\leftskip \parindent
- \advance\rightskip \@tocrmarg
- \parfillskip -\rightskip
- \ifx\tocstyle@feature@parfillskip\relax\else
- \advance\parfillskip \tocstyle@feature@parfillskip\relax
- \fi
- \interlinepenalty\@M
- \leavevmode
- \advance\leftskip \@tempdima
- \null\nobreak
-% \end{macrocode}
-% \cs{hskip}\cs{-leftskip} optional moved to \cs{numberline}
-% \begin{macrocode}
- \iftocstyle@indentnotnumbered\else
- \hskip -\leftskip
- \fi
-% \end{macrocode}
-% Change at start of the entry
-% \begin{macrocode}
- \tocstyle@feature@entryhook
-% \end{macrocode}
-% Similar to kernel command but if feature \texttt{leaders} was set use
-% this instead of the default leaders. And if feature \texttt{dothook} was set
-% (default is \cs{normalfont}) use this at the default leaders.
-% \begin{macrocode}
- {#4}\nobreak
- \ifx\tocstyle@feature@leaders\relax
- \leaders\hbox{$\m@th
- \mkern \@dotsep mu\hbox{\tocstyle@feature@dothook .}%
- \mkern \@dotsep mu$}\hfill
- \else
- \tocstyle@feature@leaders
- \fi
- \nobreak
- \ifx\tocstyle@feature@pagenumberbox\relax
- \hb@xt@\@pnumwidth{\hfil\tocstyle@feature@pagenumberhook #5%
- \kern-\p@\kern\p@}%
- \else
- \tocstyle@feature@pagenumberbox{\tocstyle@feature@pagenumberhook #5%
- \kern-\p@\kern\p@}%
- \fi
- \par
- }%
-% \end{macrocode}
-% Last change is, another penalty change:
-% \begin{macrocode}
- \if@tocstyle@penalties
- \bgroup
- \@tempcnta 20009
- \advance\@tempcnta by -#1
- \edef\reserved@a{\egroup\penalty\the\@tempcnta\relax}%
- \reserved@a
- \fi
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tocstyle@saved@numberline}
-% \begin{macro}{\tocstyle@numberline}
-% Define a new \cs{numberline}, that will do all the job after
-% \cs{begin{document}} and one to save the original definition.
-%^^A----------------------- \renewcommand*\numberline ------------------------
-% \begin{macrocode}
-\newcommand*{\tocstyle@saved@numberline}{}
-\newcommand*{\tocstyle@numberline}[1]{%
- \begingroup
- \ifx\tocstyle@feature@spaceafternumber\relax
- \settowidth\@tempdima{\tocstyle@@numberline{#1}\enskip}%
- \else
- \settowidth\@tempdima{\tocstyle@@numberline{#1}}%
- \advance \@tempdima \tocstyle@feature@spaceafternumber\relax
- \fi
- \ifcsname tocstyle@numwidth@\tocstyleTOC @\tocstyledepth\endcsname
- \ifdim \@tempdima >
- \csname tocstyle@numwidth@\tocstyleTOC @\tocstyledepth\endcsname\relax
- \expandafter\xdef\csname tocstyle@numwidth@\tocstyleTOC
- @\tocstyledepth\endcsname{\the\@tempdima}%
- \fi
- \else
- \expandafter\xdef\csname tocstyle@numwidth@\tocstyleTOC
- @\tocstyledepth\endcsname{\the\@tempdima}%
- \fi
- \endgroup
- \iftocstyle@indentnotnumbered
- \hskip -\leftskip
- \fi
- \ifcase \tocstyle@indentstyle
- \hb@xt@\@tempdima{\tocstyle@@numberline{#1}\hfil}%
- \or
- \hb@xt@\@tempdima{\tocstyle@@numberline{#1}\hfil}%
- \else
- \ifx\tocstyle@feature@spaceafternumber\relax
- \hbox{\tocstyle@@numberline{#1}\enskip}%
- \else
- \hbox{\tocstyle@@numberline{#1}\hskip
- \tocstyle@feature@spaceafternumber\relax}%
- \fi
- \fi
-}
-% \end{macrocode}
-% \begin{macro}{\tocstyle@@numberline}
-% Do the main work!
-% \begin{macrocode}
-\newcommand*{\tocstyle@@numberline}[1]{%
- #1\csname autodot\endcsname
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsubsection{Redefining Class Macros}
-%
-% \begin{macro}{\l@part}
-% \changes{v0.2d}{2009/11/11}{part level is always -1}
-% \begin{macro}{\l@chapter}
-% \begin{macro}{\l@section}
-% \begin{macro}{\l@subsection}
-% \begin{macro}{\l@subsubsection}
-% \begin{macro}{\l@paragraph}
-% \begin{macro}{\l@subparagraph}
-% \begin{macro}{\l@table}
-% \begin{macro}{\l@figure}
-% Try to redefine the toc commands at startup.
-% \changes{v0.2f}{2016/03/22}{recognize all subs of part, chapter,
-% section and paragraph}%^^A
-% \changes{v0.2g}{2016/03/23}{warning for usage of not recommended package
-% combinations}%^^A
-% \changes{v0.2h}{2016/04/24}{lokal \cs{normalcolor} auf \cs{relax}
-% setzen}%^^A
-% \changes{v0.2h}{2016/04/24}{lokal \cs{color} auf \cs{@gobble} setzen}%^^A
-% \begin{macrocode}
-\AtBeginDocument{%
- \@ifpackageloaded{tocbasic}{%
- \@ifpackagelater{tocbasic}{2016/03/01}{%
- \PackageWarningNoLine{tocstyle}{%
- Usage of `tocstyle' with new `tocbasic' detected.\MessageBreak
- This is not an error! You can do this.\MessageBreak
- Nevertheless, you should note, combining `tocstyle'\MessageBreak
- with this version of `tocbasic' will break several\MessageBreak
- features of `tocbasic'. You should use `tocstyle'\MessageBreak
- features instead of `tocbasic' attributes for all\MessageBreak
- entry changes you want.\MessageBreak
- You may also get additional warnings because of\MessageBreak
- redefined `\string\numberline'. Ignore them}%
- }{}%
- }{}%
- \@ifpackageloaded{etoc}{%
- \PackageWarningNoLine{tocstyle}{%
- Usage of `tocstyle' with `etoc' detected.\MessageBreak
- I suggest to use either `tocstyle' or `etoc'\MessageBreak
- but not both of them together}%
- }{}%
- \@ifpackageloaded{titletoc}{%
- \PackageWarningNoLine{tocstyle}{%
- Usage of `tocstyle' with `titletoc' detected.\MessageBreak
- I suggest to use either `tocstyle' or `titletoc'\MessageBreak
- but not both of them together. I expect even\MessageBreak
- error messages because of this combination}%
- }{}%
- \def\tocstyle@test@level{-1}%
- \def\tocstyle@test@levelname{part}%
- \@whilesw\ifcsname l@\tocstyle@test@levelname\endcsname\fi{%
- \setbox\@tempboxa\vbox{\hsize\maxdimen
- \let\normalcolor\relax
- \let\color\@gobble
- \edef\reserved@a{%
- \expandafter\noexpand\csname l@\tocstyle@test@levelname\endcsname{%
- \noexpand\tocstyle@l@define{\tocstyle@test@levelname}%
- {\tocstyle@test@level}%
- }{}%
- }%
- \reserved@a
- }%
- \edef\tocstyle@test@levelname{sub\tocstyle@test@levelname}%
- \edef\tocstyle@test@level{\the\numexpr\tocstyle@test@level+1}%
- }%
- \ifnum\tocstyle@test@level<\z@
- \def\tocstyle@test@level{0}%
- \fi
- \def\tocstyle@test@levelname{chapter}%
- \@whilesw\ifcsname l@\tocstyle@test@levelname\endcsname\fi{%
- \setbox\@tempboxa\vbox{\hsize\maxdimen
- \let\normalcolor\relax
- \let\color\@gobble
- \edef\reserved@a{%
- \expandafter\noexpand\csname l@\tocstyle@test@levelname\endcsname{%
- \noexpand\tocstyle@l@define{\tocstyle@test@levelname}%
- {\tocstyle@test@level}%
- }{}%
- }%
- \reserved@a
- }%
- \edef\tocstyle@test@levelname{sub\tocstyle@test@levelname}%
- \edef\tocstyle@test@level{\the\numexpr\tocstyle@test@level+1}%
- }%
- \ifnum\tocstyle@test@level<\@ne
- \def\tocstyle@test@level{1}%
- \fi
- \def\tocstyle@test@levelname{section}%
- \@whilesw\ifcsname l@\tocstyle@test@levelname\endcsname\fi{%
- \setbox\@tempboxa\vbox{\hsize\maxdimen
- \let\normalcolor\relax
- \let\color\@gobble
- \edef\reserved@a{%
- \expandafter\noexpand\csname l@\tocstyle@test@levelname\endcsname{%
- \noexpand\tocstyle@l@define{\tocstyle@test@levelname}%
- {\tocstyle@test@level}%
- }{}%
- }%
- \reserved@a
- }%
- \edef\tocstyle@test@levelname{sub\tocstyle@test@levelname}%
- \edef\tocstyle@test@level{\the\numexpr\tocstyle@test@level+1}%
- }%
- \def\tocstyle@test@levelname{paragraph}%
- \@whilesw\ifcsname l@\tocstyle@test@levelname\endcsname\fi{%
- \setbox\@tempboxa\vbox{\hsize\maxdimen
- \let\normalcolor\relax
- \let\color\@gobble
- \edef\reserved@a{%
- \expandafter\noexpand\csname l@\tocstyle@test@levelname\endcsname{%
- \noexpand\tocstyle@l@define{\tocstyle@test@levelname}%
- {\tocstyle@test@level}%
- }{}%
- }%
- \reserved@a
- }%
- \edef\tocstyle@test@levelname{sub\tocstyle@test@levelname}%
- \edef\tocstyle@test@level{\the\numexpr\tocstyle@test@level+1}%
- }%
- \def\tocstyle@test@level{1}%
- \def\tocstyle@test@levelname{table}%
- \@whilesw\ifcsname l@\tocstyle@test@levelname\endcsname\fi{%
- \setbox\@tempboxa\vbox{\hsize\maxdimen
- \let\normalcolor\relax
- \let\color\@gobble
- \edef\reserved@a{%
- \expandafter\noexpand\csname l@\tocstyle@test@levelname\endcsname{%
- \noexpand\tocstyle@l@define{\tocstyle@test@levelname}%
- {\tocstyle@test@level}%
- }{}%
- }%
- \reserved@a
- }%
- \edef\tocstyle@test@levelname{sub\tocstyle@test@levelname}%
- \edef\tocstyle@test@level{\the\numexpr\tocstyle@test@level+1}%
- }%
- \def\tocstyle@test@level{1}%
- \def\tocstyle@test@levelname{figure}%
- \@whilesw\ifcsname l@\tocstyle@test@levelname\endcsname\fi{%
- \setbox\@tempboxa\vbox{\hsize\maxdimen
- \let\normalcolor\relax
- \let\color\@gobble
- \edef\reserved@a{%
- \expandafter\noexpand\csname l@\tocstyle@test@levelname\endcsname{%
- \noexpand\tocstyle@l@define{\tocstyle@test@levelname}%
- {\tocstyle@test@level}%
- }{}%
- }%
- \reserved@a
- }%
- \edef\tocstyle@test@levelname{sub\tocstyle@test@levelname}%
- \edef\tocstyle@test@level{\the\numexpr\tocstyle@test@level+1}%
- }%
-% \end{macrocode}
-% \begin{macro}{\@dottedtocline}
-% \changes{v0.2j}{2019/10/09}{newer \LaTeX{} uses two \cs{kern}}%^^A
-% This will be used even for undotted toc lines. First check the definition,
-% then redefine.
-% \begin{macrocode}
- \def\@tempa#1#2#3#4#5{%
- \ifnum #1>\c@tocdepth \else
- \vskip \z@ \@plus.2\p@
- {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
- \parindent #2\relax\@afterindenttrue
- \interlinepenalty\@M
- \leavevmode
- \@tempdima #3\relax
- \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
- {#4}\nobreak
- \leaders\hbox{$\m@th
- \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
- mu$}\hfill
- \nobreak
- \hb@xt@\@pnumwidth{\hfil \normalfont \normalcolor #5}%
- \par}%
- \fi}%
- \ifx\@dottedtocline\@tempa\else
- \def\@tempa#1#2#3#4#5{%
- \ifnum #1>\c@tocdepth \else
- \vskip \z@ \@plus.2\p@
- {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
- \parindent #2\relax\@afterindenttrue
- \interlinepenalty\@M
- \leavevmode
- \@tempdima #3\relax
- \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
- {#4}\nobreak
- \leaders\hbox{$\m@th
- \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
- mu$}\hfill
- \nobreak
- \hb@xt@\@pnumwidth{\hfil \normalfont \normalcolor #5\kern-\p@\kern\p@}%
- \par}%
- \fi}%
- \ifx\@dottedtocline\@tempa\else
- \tocstyle@macrochangewarning\@dottedtocline
- \fi
- \fi
- \let\tocstyle@saved@dottedtocline\@dottedtocline
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\numberline}
-% This macro needed to be redefined to calculate the with of the numbers.
-% First of all: check the definition. This is a bit more difficult, because
-% of respecting \KOMAScript:
-% \begin{macrocode}
- \def\@tempa#1{\hb@xt@\@tempdima{#1\autodot\hfil}}%
- \ifx\numberline\@tempa\else
- \def\@tempa#1{\hb@xt@\@tempdima{#1\hfil}}%
- \ifx\numberline@tempa\else
- \tocstyle@macrochangewarning\numberline
- \fi
- \fi
- \let\tocstyle@saved@numberline\numberline
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\tocstyle@macrochangewarning}
-% \begin{macrocode}
-\newcommand*{\tocstyle@macrochangewarning}[1]{%
- \PackageWarningNoLine{tocstyle}{%
- unexpected \string#1\space definition!\MessageBreak
- You are either using an unknown LaTeX kernel\MessageBreak
- version, an unknown class or package, that redefines\MessageBreak
- \string#1, or a \string#1\space
- redefinition\MessageBreak
- at the document preamble.\MessageBreak
- Because of this you may get unexpected results!\MessageBreak
- Maybe it would be better not to use package tocstyle}%
- \PackageInfo{tocstyle}{Unexpected definition is:\MessageBreak
- \meaning#1}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tocstyle@l@define}
-% \begin{macro}{\tocstyle@activate@all@l}
-% \begin{macrocode}
-\newcommand*{\tocstyle@activate@all@l}{}
-\newcommand*{\tocstyle@l@define}[2]{%
- \advance\leftskip-\@tempdima
- \edef\@tempa{%
- \noexpand\global\noexpand\let
- \expandafter\noexpand\csname tocstyle@saved@l@#1\endcsname
- \expandafter\noexpand\csname l@#1\endcsname
- \noexpand\gdef
- \expandafter\noexpand\csname tocstyle@l@#1\endcsname{%
- \noexpand\@dottedtocline{#2}{\the\leftskip}{\the\@tempdima}}%
- \noexpand\g@addto@macro\noexpand\tocstyle@activate@all@l{%
- \noexpand\let\expandafter\noexpand\csname l@#1\endcsname
- \expandafter\noexpand\csname tocstyle@l@#1\endcsname
- }%
- }%
- \PackageInfo{tocstyle}{prepare \expandafter\string
- \csname l@#1\endcsname\space for redefinition}%
- \@tempa
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsubsection{New Macros}
-%
-% \begin{macro}{\showtoc}
-% \begin{macrocode}
-\newcommand*{\showtoc}[2][\aliastoc\tocstyleTOC\tocstyleAliasTOC]{%
- \ifcsname tocstyle@copyname@#2\endcsname
- \@tempcnta \csname tocstyle@copyname@#2\endcsname\relax
- \advance\@tempcnta \@ne
- \expandafter\xdef\csname tocstyle@copyname@#2\endcsname{\the\@tempcnta}%
- \else
- \expandafter\xdef\csname tocstyle@copyname@#2\endcsname{1}%
- \fi
- \ifx\@dofilelist\relax\let\@dofilelist\@empty\fi
- \edef\@tempa{\noexpand\g@addto@macro\noexpand\@dofilelist{%
- \noexpand\tocstyle@copy@toc{#2}{\csname
- tocstyle@copyname@#2\endcsname}}%
- }\@tempa%
- \begingroup
- \edef\tocstyleAliasTOC{#2}%
- \edef\tocstyleTOC{#2\csname tocstyle@copyname@#2\endcsname}%
- #1
- \tocstyle@pre@starttoc{#2\csname tocstyle@copyname@#2\endcsname}%
- \makeatletter
- \@input{\jobname.#2\csname tocstyle@copyname@#2\endcsname}%
- \@nobreakfalse
- \tocstyle@post@starttoc{#2\csname tocstyle@copyname@#2\endcsname}%
- \endgroup
-}
-% \end{macrocode}
-% \begin{macro}{\tocstyle@copy@toc}
-% \begin{macrocode}
-\newcommand*{\tocstyle@copy@toc}[2]{%
- \if@filesw
- \begingroup
- \endlinechar=\m@ne
-% \end{macrocode}
-% While \LaTeX{} does not close the files, we have to do it know.
-% \begin{macrocode}
- \immediate\closeout\csname tf@#1\endcsname
- \immediate\openin\@inputcheck \jobname.#1
- \immediate\openout\@partaux \jobname.#1#2
- \loop\unless\ifeof\@inputcheck
- \immediate\readline\@inputcheck to \@tempa
- \immediate\write\@partaux{\@tempa}%
- \repeat
- \immediate\closeout\@partaux
- \immediate\closein\@inputcheck
- \endgroup
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\aliastoc}
-% Internal use not the real TOC shortcut but another one.
-% \begin{macrocode}
-\newcommand*{\aliastoc}[2]{%
- \expandafter\edef\csname tocstyle@alias@TOC@#1\endcsname{#2}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tocstyle@pre@starttoc}
-% \begin{macro}{\tocstyle@post@starttoc}
-% Commands before and after the original \cs{@starttoc}.
-% \begin{macrocode}
-\newcommand*{\tocstyle@pre@starttoc}[1]{%
- \begingroup
- \expandafter\ifx\csname tocstyle@deactivated@\endcsname\relax
- \expandafter\ifx\csname tocstyle@deactivated@#1\endcsname\relax\relax
- \tocstyle@activetrue
- \else
- \tocstyle@activefalse
- \fi
- \else
- \tocstyle@activefalse
- \fi
- \iftocstyle@active
- \let\@dottedtocline\tocstyle@dottedtocline
- \parskip \z@
- \parindent \z@
- \parfillskip \z@\@plus 1fil
- \ifcsname tocstyle@alias@TOC@#1\endcsname
- \edef\tocstyleAliasTOC{\csname tocstyle@alias@TOC@#1\endcsname}%
- \else
- \edef\tocstyleAliasTOC{#1}%
- \fi
- \edef\tocstyleTOC{#1}%
- \tocstyle@activate@all@l
- \fi
-}
-\newcommand*{\tocstyle@post@starttoc}[1]{%
- \iftocstyle@active
- \if@filesw
- \ifcsname tocstyle@unumwidth@#1@\endcsname
- \protected@write\@auxout{}{%
- \protect\tocstyle@set@width{unum}{#1}{}{%
- \csname tocstyle@unumwidth@#1@\endcsname}%
- }%
- \fi
- \expandafter\let\expandafter\@tempa
- \csname tocstyle@depthlist@#1\endcsname
- \ifx\@tempa\relax\else
- \expandafter\@for \expandafter\@tempa\expandafter:\expandafter=\@tempa
- \do {%
- \ifcsname tocstyle@numwidth@#1@\@tempa\endcsname
- \protected@write\@auxout{}{%
- \protect\tocstyle@set@width{num}{#1}{\@tempa}{%
- \csname tocstyle@numwidth@#1@\@tempa\endcsname}%
- }%
- \fi
- \ifcsname tocstyle@skipwidth@#1@\@tempa\endcsname
- \protected@write\@auxout{}{%
- \protect\tocstyle@set@width{skip}{#1}{\@tempa}{%
- \csname tocstyle@skipwidth@#1@\@tempa\endcsname}%
- }%
- \fi
- }%
- \fi
- \fi
- \fi
- \endgroup
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\tocstyle@set@width}
-% \changes{v0.2d}{2009/11/11}{improve handling of standard classes}%^^A
-% \changes{v0.2h}{2016/03/25}{use after definition in \texttt{aux}-file}%^^A
-% Some classes do not use \cs{numberline}. This may result in negativ widths
-% (esp. negativ skips). Following special handling of negativ values improves
-% the toc handling of the standard classes. Nevertheless indentation of not
-% numbered entries does not work with such classes!
-% \begin{macrocode}
-\newcommand*{\tocstyle@set@width}[4]{%
- \iftocstyle@indentnotnumbered
- \ifdim #4<\z@
- \expandafter\gdef\csname tocstyle@max#1width@#2@#3\endcsname{%
- \dimexpr #4/2\relax}%
- \else
- \expandafter\gdef\csname tocstyle@max#1width@#2@#3\endcsname{#4}%
- \fi
- \else
- \ifdim #4<\z@
- \expandafter\gdef\csname tocstyle@max#1width@#2@#3\endcsname{\z@}%
- \else
- \expandafter\gdef\csname tocstyle@max#1width@#2@#3\endcsname{#4}%
- \fi
- \fi
-}
-\AtBeginDocument{%
- \if@filesw
- \immediate\write\@auxout{%
- \string\providecommand*\string\tocstyle@set@width[4]{}%
- }%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tocstyleTOC}
-% \begin{macro}{\tocstyleAliasTOC}
-% Shortcut of the current processed TOC. Empty outside of TOCs.
-% \begin{macrocode}
-\newcommand*{\tocstyleTOC}{}
-\newcommand*{\tocstyleAliasTOC}{}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\tocstyledepth}
-% Current depth of the current processed TOC entry.
-% \begin{macrocode}
-\newcommand*{\tocstyledepth}{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\deactivatetocstyle}%
-% \begin{macro}{\reactivatetocstyle}%
-% You may (de)activate all influence of tocstyle either for one or all TOCs.
-% \begin{macrocode}
-\newif\iftocstyle@active
-\newcommand*{\deactivatetocstyle}[1][]{%
- \expandafter\let\csname tocstyle@deactivated@#1\endcsname\@empty}
-\newcommand*{\reactivatetocstyle}[1][]{%
- \expandafter\let\csname tocstyle@deactivated@#1\endcsname\relax}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\settocfeature}
-% \begin{macro}{\@settocfeature}
-% \begin{macro}{\@@@settocfeature}
-% The primary command to set the features of a depth of a TOC.
-% \begin{macrocode}
-\newcommand*{\@settocfeature}[1][]{%
- \kernel@ifnextchar[ {\@@settocfeature[{#1}]}{\@@settocfeature[{#1}][]}
-}
-\def\@@settocfeature[#1][#2]#3#4{%
-%<trace> \typeout{exclude: \tocstyle@feature@excludelist}%
- \@expandtwoargs\in@{,#3,}{,\tocstyle@feature@excludelist,}%
- \ifin@\else
- \expandafter\ifcsname tocstyle@feature@#3\endcsname
- \@namedef{tocstyle@feature@#3@#1@#2}{#4}%
- \begingroup
- \expandafter\let\expandafter\@tempa
- \csname tocstyle@commandlist@#1\endcsname
- \@expandtwoargs\in@{,tocstyle@feature@#3@#1@#2,}{,\@tempa,}%
- \ifin@\let\@tempa\endgroup\else
- \edef\@tempa{\endgroup
- \noexpand\expandafter\noexpand\ifx
- \noexpand\csname tocstyle@commandlist@#1\noexpand\endcsname\relax
- \noexpand\expandafter\noexpand\expandafter\noexpand\expandafter
- \noexpand\def
- \noexpand\else
- \noexpand\expandafter\noexpand\expandafter\noexpand\expandafter
- \noexpand\l@addto@macro
- \noexpand\fi
- \noexpand\csname tocstyle@commandlist@#1\noexpand\endcsname%
- {tocstyle@feature@#3@#1@#2,}}%
- \fi
- \@tempa
- \else
- \PackageError{tocstyle}{unkown feature `#3'}{%
- You've told me to set up toc style feature `#3',\MessageBreak
- but I don't know this feature.\MessageBreak
- See the tocstyle manual for all known feature.\MessageBreak
- }%
- \fi
- \fi
-}
-\newcommand*{\settocfeature}{}
-\let\settocfeature\@settocfeature
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\l@addto@macro}
-% Something like \cs{g@addto@macro} but only with local effect. While other
-% packages or classes may also define this, \cs{providecommand} will be used.
-% \begin{macrocode}
-\providecommand{\l@addto@macro}[2]{%
- \edef#1{\unexpanded\expandafter{#1#2}}%
-}%
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\settocstylefeature}
-% \begin{macro}{\@settocstylefeature}
-% Same as above without TOC argument.
-% \begin{macrocode}
-\newcommand*{\@settocstylefeature}{%
- \kernel@ifnextchar[ {\@settocfeature[]}{\@settocfeature[][]}%
-}
-\newcommand*{\settocstylefeature}{}
-\let\settocstylefeature\@settocstylefeature
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% Different commands will be defined:
-% \begin{macro}{\tocstyle@feature@!<feature!>@@}
-% Global feature (all TOCs all depths).
-% \end{macro}
-% \begin{macro}{\tocstyle@feature@@!<feature!>@!<TOC!>@}
-% All depth feature for one TOC.
-% \end{macro}
-% \begin{macro}{\tocstyle@feature@@!<feature!>@@!<depth!>}
-% All TOCs feature for one depth.
-% \end{macro}
-% \begin{macro}{\tocstyle@feature@@!<feature!>@!<TOC!>@!<depth!>}
-% One depth of one TOC feature.
-% \end{macro}
-%
-% \begin{macro}{\tocstyle@activate@features}
-% Activates the features
-% \begin{macrocode}
-\newcommand*{\tocstyle@activate@features}{%
- \expandafter\ifx\csname tocstyle@depthlist@\tocstyleTOC\endcsname\relax
- \expandafter\xdef\csname tocstyle@depthlist@\tocstyleTOC\endcsname{%
- \tocstyledepth}%
- \else
- \expandafter\let\expandafter\@tempa
- \csname tocstyle@depthlist@\tocstyleTOC\endcsname
- \@expandtwoargs\in@{,\tocstyledepth,}{,\@tempa,}%
- \ifin@\else
- \expandafter\xdef\csname tocstyle@depthlist@\tocstyleTOC\endcsname{%
- \csname tocstyle@depthlist@\tocstyleTOC\endcsname,\tocstyledepth}%
- \fi
- \fi
- \expandafter\@for \expandafter\@tempa
- \expandafter:\expandafter=\tocstyle@featurelist \do
- {%
- \@ifundefined{tocstyle@feature@\@tempa @\tocstyleAliasTOC @\tocstyledepth}{%
- \@ifundefined{tocstyle@feature@\@tempa @@\tocstyledepth}{%
- \@ifundefined{tocstyle@feature@\@tempa @\tocstyleAliasTOC @}{%
- \@ifundefined{tocstyle@feature@\@tempa @@}{%
- \expandafter\let\csname tocstyle@feature@\@tempa\endcsname\relax
- }{%
- \expandafter\let\csname tocstyle@feature@\@tempa
- \expandafter\endcsname
- \csname tocstyle@feature@\@tempa @@\endcsname
- }%
- }{%
- \expandafter\let\csname tocstyle@feature@\@tempa
- \expandafter\endcsname
- \csname tocstyle@feature@\@tempa @\tocstyleAliasTOC @\endcsname
- }%
- }{%
- \expandafter\let\csname tocstyle@feature@\@tempa
- \expandafter\endcsname
- \csname tocstyle@feature@\@tempa @@\tocstyledepth\endcsname
- }%
- }{%
- \expandafter\let\csname tocstyle@feature@\@tempa
- \expandafter\endcsname
- \csname tocstyle@feature@\@tempa @\tocstyleAliasTOC @\tocstyledepth\endcsname
- }%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\newtocstyle}
-% Defining a new TOC style. First optional argument is a TOC style, that
-% will be activated before the new definitions. Note that all new
-% definitions will overwirte the parent's definitions. So a new TOC style,
-% that defines all features doesn't need a parent.
-% \begin{macrocode}
-\newcommand*{\newtocstyle}{%
- \kernel@ifnextchar [{\@newtocstyle}{\@newtocstyle[]}}
-\newcommand*{\@newtocstyle}{}
-\def\@newtocstyle[#1]{%
- \kernel@ifnextchar [{\@@newtocstyle[{#1}]}{\@newtocstyle[{#1}][]}}
-\newcommand*{\@@newtocstyle}{}
-\def\@@newtocstyle[#1][#2]#3#4{%
- \@ifundefined{tocstyle@style@#3}{%
- \@ifundefined{tocstyle@style@#1}{%
- \ifx \relax#1\relax\else
- \PackageError{tocstyle}{unknown parent TOC style `#1'}{%
- You've told me to inheritate parent TOC style `#1',\MessageBreak
- but there's no TOC style `#1' defined.}%
- \fi
- \expandafter\def\csname tocstyle@style@#3\endcsname{#4}%
- }{%
- \expandafter\def\csname tocstyle@style@#3\endcsname{%
- \edef\reserved@a{%
- \noexpand\l@addto@macro\noexpand\tocstyle@feature@excludelist{#2}%
- \noexpand\@usetocstyle{#1}%
- \noexpand\def\noexpand\tocstyle@feature@excludelist{%
- \tocstyle@feature@excludelist}%
- }\reserved@a
- #4%
- }%
- }%
- }{%
- \PackageError{tocstyle}{TOC style `#3' already defined}{%
- You've tried to define a new TOC style `#3',\MessageBreak
- but there's already a TOC style named `#3'.}%
- }%
-}
-\newcommand*{\tocstyle@feature@excludelist}{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\usetocstyle}
-% \begin{macro}{\@usetocstyle}
-% \changes{v0.2a}{2008/02/14}{extended for deprecated TOC styles}
-% Use the predefined TOC style. You may define
-% |\tocstyle@deprecated@style@foo| to mark TOC style |foo| to be
-% deprecated. If |\tocstyle@deprecated@style@foo| is |\@empty| TOC style
-% |deprecated@foo| will be used instead almost silently. Otherwise TOC
-% style |\tocstyle@deprecated@style@foo| will be used instead and the user
-% will be told about this change.
-% \begin{macrocode}
-\newcommand*{\usetocstyle}[2][]{%
- \@ifundefined{tocstyle@deprecated@style@#2}{%
- \@ifundefined{tocstyle@style@#2}{%
- \PackageError{tocstyle}{unknown TOC style `#2'}{%
- You've told me to use TOC style `#2',\MessageBreak
- but there's no TOC style `#2' defined.}%
- }{%
- \def\settocfeature{%
- \kernel@ifnextchar[ %]
- {\@@settocfeature[{#1}]}{\@@settocfeature[{#1}][]}%
- }%
- \let\settocstylefeature\settocfeature
-% \end{macrocode}
-% Deactivate all known features for this TOC
-% \begin{macrocode}
- \expandafter\ifx\csname tocstyle@commandlist@#1\endcsname\relax
- \else
- \expandafter\expandafter\expandafter\@for
- \expandafter\expandafter\expandafter\@tempa
- \expandafter\expandafter\expandafter:%
- \expandafter\expandafter\expandafter=%
- \csname tocstyle@commandlist@#1\endcsname
- \do{%
- \expandafter\let\csname \@tempa\endcsname\relax
- }%
-% \end{macrocode}
-% So there are no more known features for this TOC.
-% \begin{macrocode}
- \expandafter\let\csname tocstyle@commandlist@#1\endcsname\relax
- \fi
-% \end{macrocode}
-% Activate all known features for this style and TOC
-% \begin{macrocode}
- \@usetocstyle{#2}%
- \let\settocfeature\@settocfeature
- \let\settocstylefeature\@settocstylefeature
- }%
- }{%
- \expandafter\ifx\csname tocstyle@deprecated@style@#2\endcsname\@empty
- \PackageWarning{tocstyle}{%
- deprecated TOC style `#2'!\MessageBreak
- You should not longer use this style,\MessageBreak
- because it will be removed soon.\MessageBreak
- You should select another TOC style}%
- \usetocstyle[{#1}]{deprecated@#2}%
- \else
- \PackageWarning{tocstyle}{%
- deprecated TOC style `#2'!\MessageBreak
- You should use TOC style '\csname
- tocstyle@deprecated@style@#2\endcsname'\MessageBreak
- instead of `#2'}%
- \fi
- }%
-}
-\newcommand*{\@usetocstyle}[1]{%
- \csname tocstyle@style@#1\endcsname
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\tocstyle@featurelist}
-% Comma seperated list of all known features
-% \begin{macrocode}
-\newcommand*{\tocstyle@featurelist}{%
- pagenumberhook,entryhook,dothook,entryvskip,leaders,raggedhook,%
- spaceafternumber,parfillskip,pagenumberbox,%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\tocstyle@feature@pagenumberhook}
-% \begin{macro}{\tocstyle@feature@pagenumberhook}
-% \begin{macro}{\tocstyle@feature@entryhook}
-% \begin{macro}{\tocstyle@feature@dothook}
-% \begin{macro}{\tocstyle@feature@entryvskip}
-% \begin{macro}{\tocstyle@feature@leaders}
-% \begin{macro}{\tocstyle@feature@parfillskip}
-% \begin{macro}{\tocstyle@feature@raggedhook}
-% \begin{macro}{\tocstyle@feature@spaceafternumber}
-% \begin{macrocode}
-\newcommand*{\tocstyle@feature@pagenumberhook}{}
-\let\tocstyle@feature@pagenumberhook\relax
-\newcommand*{\tocstyle@feature@pagenumberbox}{}
-\let\tocstyle@feature@pagenumberbox\relax
-\newcommand*{\tocstye@feature@entryhook}{}
-\let\tocstyle@feature@entryhook\relax
-\newcommand*{\tocstye@feature@dothook}{}
-\let\tocstyle@feature@dothook\relax
-\newcommand*{\tocstye@feature@entryvskip}{}
-\let\tocstyle@feature@entryvskip\relax
-\newcommand*{\tocstye@feature@leaders}{}
-\let\tocstyle@feature@leaders\relax
-\newcommand*{\tocstye@feature@parfillskip}{}
-\let\tocstyle@feature@parfillskip\relax
-\newcommand*{\tocstye@feature@raggedhook}{}
-\let\tocstyle@feature@raggedhook\relax
-\newcommand*{\tocstye@feature@spaceafternumber}{}
-\let\tocstyle@feature@spaceafternumber\relax
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\iftochasdepth}
-% Uses \Macro{tocstyle@depthlist@}\meta{TOC} to test, if the TOC has the depth
-% already.
-% \begin{macrocode}
-\newcommand*{\iftochasdepth}[2]{%
- \begingroup
- \expandafter\let\expandafter\@tempa\csname tocstyle@depthlist@#1\endcsname
- \ifx\@tempa\relax
- \aftergroup\@secondoftwo
- \else
- \@expandtwoargs\in@{,#2,}{,\@tempa}%
- \expandafter\aftergroup\ifin@
- \@firstoftwo
- \else
- \@secondoftwo
- \fi
- \fi
- \endgroup
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Defining Some TOC Styles}
-% \changes{v0.2e}{2013/08/11}{usage of new font elements of \KOMAScript\space
-% at \texttt{KOMAlike}}
-%
-% \begin{macro}{\ext@toc}
-% \changes{v0.2i}{2017/02/23}{use indirect extensions}
-% From version 0.2i the indirect extension for the auxiliary file of the
-% table of contents is used like the KOMA-Script classes do.
-% \begin{macrocode}
-\providecommand*{\ext@toc}{toc}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\newtocstyle{standard}{%
- \settocfeature{dothook}{\normalfont}%
- \settocfeature[-1]{entryhook}{\bfseries}%
- \settocfeature[-1]{entryvskip}{2.25em\@plus\p@}%
- \settocfeature[-1]{leaders}{\hfill}%
- \settocfeature[0]{entryvskip}{1em\@plus\p@}%
- \settocfeature[0]{leaders}{\hfill}%
- \settocfeature[0]{entryhook}{\bfseries}
- \iftochaschapter\else
- \settocfeature[1]{entryvskip}{1em\@plus\p@}%
- \settocfeature[1]{leaders}{\hfill}%
- \settocfeature[1]{entryhook}{%
- \ifx\tocstyleAliasTOC\ext@toc\bfseries\fi
- }%
- \fi
-}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname KOMAClassName\endcsname\relax
- \newtocstyle{KOMAlike}{%
- \settocfeature{dothook}{\normalfont}%
- \settocfeature[-1]{entryhook}{\sffamily\bfseries}%
- \settocfeature[-1]{entryvskip}{2.25em\@plus\p@}%
- \settocfeature[-1]{leaders}{\hfill}%
- \settocfeature[-1]{pagenumberhook}{\sffamily\bfseries}%
- \settocfeature[0]{entryvskip}{1em\@plus\p@}%
- \settocfeature[0]{leaders}{\hfill}%
- \settocfeature[0]{entryhook}{\sffamily\bfseries}
- \settocfeature[0]{pagenumberhook}{\sffamily\bfseries}%
- \iftochaschapter\else
- \settocfeature[1]{entryvskip}{1em\@plus\p@}%
- \settocfeature[1]{leaders}{\hfill}%
- \settocfeature[1]{entryhook}{%
- \ifx\tocstyleAliasTOC\ext@toc\sffamily\bfseries\fi
- }%
- \settocfeature[1]{pagenumberhook}{%
- \ifx\tocstyleAliasTOC\ext@toc\sffamily\bfseries\fi
- }%
- \fi
- }
-\else
- \newtocstyle{KOMAlike}{%
- \settocfeature{dothook}{\normalfont}%
- \settocfeature[-1]{entryhook}{\usekomafont{partentry}}%
- \settocfeature[-1]{entryvskip}{2.25em\@plus\p@}%
- \settocfeature[-1]{leaders}{\hfill}%
- \settocfeature[-1]{pagenumberhook}{\usekomafont{partentrypagenumber}}%
- \settocfeature[0]{entryvskip}{1em\@plus\p@}%
- \settocfeature[0]{leaders}{\hfill}%
- \settocfeature[0]{entryhook}{\usekomafont{chapterentry}}%
- \settocfeature[0]{pagenumberhook}{\usekomafont{chapterentrypagenumber}}%
- \iftochaschapter\else
- \settocfeature[1]{entryvskip}{1em\@plus\p@}%
- \settocfeature[1]{leaders}{\hfill}%
- \settocfeature[1]{entryhook}{%
- \begingroup
- \ifx\tocstyleAliasTOC\ext@toc
- \def\@tempa{\endgroup\usekomafont{sectionentry}}%
- \else
- \let\@tempa\endgroup
- \fi
- \@tempa
- }%
- \settocfeature[1]{pagenumberhook}{%
- \begingroup
- \ifx\tocstyleAliasTOC\ext@toc
- \def\@tempa{\endgroup\usekomafont{sectionentrypagenumber}}%
- \else
- \let\@tempa\endgroup
- \fi
- \@tempa
- }%
- \fi
- }
-\fi
-\newcommand*{\tocstyle@deprecated@style@KOMAScript}{KOMAlike}%
-\newtocstyle[KOMAlike]{classic}{%
- \settocfeature[-1]{pagenumberhook}{\normalfont\normalcolor}%
- \settocfeature[0]{pagenumberhook}{\normalfont\normalcolor}%
- \iftochaschapter\else
- \settocfeature[1]{pagenumberhook}{\normalfont\normalcolor}%
- \fi
- \settocfeature{pagenumberhook}{\normalfont\normalcolor}%
- \settocfeature{raggedhook}{\raggedright}%
-}
-\newtocstyle[classic][leaders]{allwithdot}{}
-\newtocstyle[allwithdot]{noonewithdot}{%
- \settocfeature{leaders}{\hfill}%
-}
-\newtocstyle[classic][leaders]{nopagecolumn}{%
- \settocfeature{leaders}{\quad}%
- \settocfeature{parfillskip}{\z@ plus 1fil}%
- \settocfeature{pagenumberbox}{\hbox}%
-}
-% \end{macrocode}
-%
-% \subsubsection{Defining Some TOC Styles}
-%
-% Loading a optional configuration file.
-% \begin{macrocode}
-\InputIfFileExists{tocstyle.cfg}{%
- \PackageInfo{tocstyle}{using tocstyle.cfg}%
-}{%
- \PackageInfo{tocstyle}{no tocstyle.cfg found}%
-}
-% \end{macrocode}
-%
-% \iffalse
-%</package>
-% \fi
-%
-% \Finale
-%
-\endinput
-%
-% end of file `tocstyle.dtx'
-%%% Local Variables:
-%%% mode: doctex
-%%% TeX-master: t
-%%% End:
diff --git a/Master/texmf-dist/source/latex/komacv/komacv.dtx b/Master/texmf-dist/source/latex/komacv/komacv.dtx
index 05a4e86bc2c..66cdf86866a 100644
--- a/Master/texmf-dist/source/latex/komacv/komacv.dtx
+++ b/Master/texmf-dist/source/latex/komacv/komacv.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2014-2017
+% Copyright (C) 2014-2021
% by Salome Södergran (salome.soedergran@gmx.ch)
% -----------------------------------------------
%
@@ -25,15 +25,15 @@
%
% \iffalse
%<*driver>
-\ProvidesFile{komacv.dtx}[2017/04/17 v1.1.1 komacv class]
+\ProvidesFile{komacv.dtx}[2021/02/12 v1.1.2 komacv class]
%</driver>
%<class|classic|casual|oldstyle>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<class>\ProvidesClass{komacv}
-%<class> [2017/04/17 v1.1.1 komacv class]
+%<class> [2021/02/12 v1.1.2 komacv class]
%<classic>\ProvidesPackage{komacv-classic}
%<casual>\ProvidesPackage{komacv-casual}
%<oldstyle>\ProvidesPackage{komacv-oldstyle}
-%<classic|casual|oldstyle> [2017/04/17 v1.1.1 style package for komacv class]
+%<classic|casual|oldstyle> [2021/02/12 v1.1.2 style package for komacv class]
%<*driver>
\documentclass{ltxdoc}
% \AtBeginDocument{\OnlyDescription}
@@ -60,6 +60,7 @@
\newcommand*\cvitemwithcommentusage{\cs{cvitemwithcomment}\oarg{spacing}\marg{header}\marg{text}\marg{comment}\xspace}
\newcommand*\linkusage{\cs{link}\oarg{optional text}\marg{link}}
\newcommand*\httplinkusage{\cs{httplink}\oarg{optional text}\marg{link}}
+\newcommand*\httpslinkusage{\cs{httpslink}\oarg{optional text}\marg{link}}
\newcommand*\emaillinkusage{\cs{emaillink}\oarg{optional text}\marg{link}}
\makeatletter
\renewcommand{\Describe@Macro}{\@ifstar\Describe@MacroStar\Describe@MacroStarNoStar}
@@ -81,10 +82,8 @@
\@ifundefined{KOMAScript}{%
\DeclareRobustCommand{\KOMAScript}{\textsf{\KOMA Script}}}{}
\makeatother
-
\usepackage[colorlinks=true]{hyperref}
\hypersetup{pdftitle={CV}}
-
\begin{document}
\DocInput{komacv.dtx}
\PrintIndex\PrintChanges
@@ -119,6 +118,7 @@
% \changes{v1.0.1}{2014/08/10}{Installation problem fixed}
% \changes{v1.1}{2017/04/12}{Option headline added; user length \texttt{titlenamemaxwidth}; behavior of sections and subsections improved; several bugfixes}
% \changes{v1.1.1}{2017/04/17}{Typos in the documentation and minor bugs fixed}
+% \changes{v1.1.2}{2021/02/12}{Improved implementation of headline, minor bug fixes, httpslink added, fontawesome-switch added}
%
% \GetFileInfo{komacv.dtx}
%
@@ -170,7 +170,7 @@
%
% The variants of the file \textsf{komacv\_{}example} which come with this package show exemplarily how a document with \mycls might be structured and how the typical commands are to be used. They are not intended as examples of good style but as demonstrations of the potential of the \mycls class. In this documentation all commands and features are explained.
%
-% Please note that \mycls does not (yet?) provide for the possibility of typesetting the covering letter as well.
+% As for typesetting a covering letter with \mycls, see \ref{sec:bugs-feat-requ}.
%
% \section{Engines}
% \label{sec:engines}
@@ -199,6 +199,9 @@
% \DescribeMacro{[style=<value>]}
% This option loads the style variant. The default is |style=classic|. Other variants currently available are: |casual| and |oldstyle|. Other variants may follow in time, contributions are very welcome! See the example documents to see the different layouts the styles produce.
%
+% \DescribeMacro{[fontawesome=false]}
+% In case you don't like the social media symbols offered by fontawesome or if fontawesome provides error messages you may turn off the use of fontawesome with this option. Please note that you don't have to use this option to avoid fontawesome; you may just redefine the social media symbols to your liking with \cs{renewcommand} (see \ref{sub:symbols}).
+%
% \DescribeMacro{\KOMAoptions}
% In addition to these \mycls specific options, all \KOMA options may be used as with the \KOMA classes. They may be given either in the option list of \cs{documentclass} or with the help of \cs{KOMAoptions} somewhere in the preamble:
%
@@ -217,20 +220,22 @@
% |\renewcommand*\title{Curriculum vitae}|.
%
% \begin{macro}{\headline}
-% With \cs{headline} you can set -- guess what? -- a headline for the whole document, either a title (like \enquote{Curriculum vitae}) or your name, which may come in handy if you have a very long name that is otherwise being displayed in an unsatisfying way.
+% With \cs{headline}\oarg{alignment}\marg{type}\oarg{content} you can set -- guess what? -- a headline or title for the whole document, either a title (like \enquote{Curriculum vitae}) or your name, which may come in handy if you have a very long name that is otherwise being displayed in an unsatisfying way.
% \changes{v1.1}{2017/04/12}{New macro headline, and new correspondent elements headlinestyle, headlinecolor, headlinefont}
% \changes{v1.1}{2017/04/12}{Default font size changed, due to new font \texttt{headlinefont}}
-% The optional argument sets the alignment (l=left, r=right, c=centered).
+% \changes{v1.1.2}{2021/02/12}{Improved implementation of headline. Caution! changed syntax}
+% The first optional argument sets the alignment (|l|=left, |r|=right, |c|=centered (default)). The mandatory argument defines the type (|name| or |title|). The last optional argument defines the content of the headline. If it is ommitted, with type |name| firstname, lastname and (if defined) the academic title are used, with type |title| \enquote{Curriculum vitae}.
+% Apart from that, the only difference between the two types is that with type |title| the name is printed with the personal data, whereas it is ommitted with type |name| to avoid duplicates.
+% Depending on the combination of style and type the result may be aesthetically questionable.
+%
% \emph{Example:}
%
-% |\headline[l]{name}|
-% sets (by default) your defined firstname and familyname as headline, to the left.
+% |\headline{name} |
+% sets your defined firstname and familyname as a centered headline.
%
-% |\headline[c]{title}|
-% sets (by default) \enquote{Curriculum vitae} as a centered headline.
+% |\headline[r]{title}[Lebenslauf]|
+% sets \enquote{Lebenslauf} as a right-aligned headline.
%
-% If you want to change the defaults, use\\
-% |\renewcommand\headlinecontent{your text}|.
% \end{macro}
%
% \DescribeMacro{\title}
@@ -248,7 +253,6 @@
% \DescribeMacro{\github}
% \DescribeMacro{\facebook}
% \DescribeMacro{\linkedin}
-
%
% The names of the macros are self-explanatory, so I will give just a few hints.
%
@@ -298,7 +302,6 @@
% \DescribeMacro{\listitemsymbol}
% In the same way the item symbol in the listitems may be changed with the macro \cs{listitemsymbol}.
%
-% \newpage
% \subsection{Picture}
% \label{sub:picture}
%
@@ -456,8 +459,9 @@
% |commentfont| and |commentmainfont| are used in |\cvitemwithcomment| only.
%
% \DescribeMacro*{linkfont}
-% |linkfont|, |httplinkfont|, |emaillinkfont| are used for the link commands \cs{link}, \cs{httplink} and \cs{emaillink} (described below \ref{sub:links}).
+% |linkfont|, |httplinkfont|, |httpslinkfont|, |emaillinkfont| are used for the link commands \cs{link}, \cs{httplink}, \cs{httpslink}, and \cs{emaillink} (described below \ref{sub:links}).
% \DescribeMacro*{httplinkfont}
+% \DescribeMacro*{httpslinkfont}
%
% \DescribeMacro*{emaillinkfont}
% Font attributes of elements that belong to the \textsf{scrartcl} class are also changed in the usual \KOMA way, e.\,g.:
@@ -482,7 +486,7 @@
%
% |\pagestyle{scrheadings}|
%
-% \cs{clearscrheadfoot}
+% \cs{clearpairofpagestyles}
%
% |\ofoot{\pagemark/\totalpagemark}|
%
@@ -491,6 +495,7 @@
%
% \DescribeMacro{\hypersetup}
% To change the way hyperlinks are highlighted in the pdf document, use the \cs{hypersetup} command. This command is provided by the \textsf{hyperref} package which is loaded by the \mycls class. See the \textsf{hyperref} manual for the options available.
+% Example: use |\hypersetup{pdfborder = false}| to remove the box around links in the pdf-document.
%
% \DescribeMacro{pdfauthor}
% \DescribeMacro{pdftitle}
@@ -571,6 +576,7 @@
% With the command\\
% \cventryusage\\
% you get a more structured description. The first mandatory argument will usually be placed in the hint column (depending on the style in use), all others in the main column, each with its own formatting. Just leave empty those arguments you do not need (use empty braces |{}|) . Note, however, that the second mandatory argument should not be empty (otherwise the entry in the main column will start with a comma).
+% In case the predefined formatting of the arguments does not suit your needs you may of course use formatting commands inside the arguments.
%
%\subsection{\cs{cvitemwithcomment}}
% \label{sub:cvitemwithcomment}
@@ -581,18 +587,22 @@
%\subsection{Links}
% \label{sub:links}
%
-% There are three link commands predefined:
+% There are four link commands predefined:
%
% \DescribeMacro{\link}
% \DescribeMacro{\httplink}
+% \DescribeMacro{\httpslink}
% \DescribeMacro{\emaillink}
% \cs{link}\oarg{optional text}\marg{link},
%
% \cs{httplink}\oarg{optional text}\marg{link}, and
%
+% \cs{httpslink}\oarg{optional text}\marg{link}, and
+% \changes{v1.1.2}{2021/02/12}{\cs{httpslink} added.}
+%
% \cs{emaillink}\oarg{optional text}\marg{link}.
%
-% All of them take a description as optional argument and the link address as mandatory argument. The optional argument will be shown in the text, the hyperlink points to the address given in the mandatory argument. If no optional argument is given the address in the mandatory argument will be printed. The mandatory argument of \cs{httplink} will be prefixed with |http://|, of \cs{emaillink} with |mailto:|. To change the font attributes of the links, see above \ref{sub:fonts}.
+% All of them take a description as optional argument and the link address as mandatory argument. The optional argument will be shown in the text, the hyperlink points to the address given in the mandatory argument. If no optional argument is given the address in the mandatory argument will be printed. The mandatory argument of \cs{httplink} will be prefixed with |http://|, of \cs{httpslink} with |https://|, of \cs{emaillink} with |mailto:|. To change the font attributes of the links, see above \ref{sub:fonts}.
%
% \subsection{Itemize}
% \label{sub:itemize}
@@ -626,24 +636,31 @@
%
% \section{Examples}
%
-% For examples see the example files \mbox{\texttt{komacv\_example\_}\meta{style}\texttt{.pdf}} that come with this class. They should be located in the |doc|-directory of the tree where the class is stored. The example file \mbox{\texttt{komacv\_example.tex}} can be used to test the various possibilities |komacv| offers. Just remove (or add) comment signs and change the preset values.
+% For examples see the example files \mbox{\texttt{komacv\_example\_}\meta{style}\texttt{.pdf}} that come with this class. They should be located in the |doc|-directory of the tree where the class is stored. The example file \mbox{\texttt{komacv\_example.tex}} can be used to test the various possibilities |komacv| offers. Just remove (or add) comment signs and play around.
%
%
% \section{New CV styles}
-% The flexibility of \mycls makes it fairly easy to create new CV styles. If you have created a CV style of your own and want to share it with others you have two possibilites:
+% The flexibility of \mycls makes it fairly easy to create new CV styles. If you have created a CV style of your own and want to share it with others you have several possibilites:
%
-% You can publish it on CTAN. Just make sure it will be installed in the |styles|-subdirectory of the |komacv|-directory (usually
+% You can publish it on CTAN. Just make sure it will be installed in the |styles|-subdirectory of the |komacv|-directory\\(such as
% |tex/latex/komacv/styles|).
%
-% Or you can send it to me at \texttt{salome.soedergran@gmx.ch} and I will include it in the next version of |komacv|.
+% Or you can put it on GitHub (\texttt{salsod/komacv}) or send it to me by e-mail (\texttt{salome.soedergran@gmx.ch}) and I will include it in the next version of \mycls.
+%
+% For your personal use, you can put it either into the working directory of your .tex-file (your cv-file) or into your local texmf-tree. In the latter case, don't forget to run texhash on the directory to refresh your tex system.
+%
+% \section{Bugs, feature requests, and maintenance}\label{sec:bugs-feat-requ}
+% Known issue: Inconsistent vertical space between multiline cvlistitems (\cs{cvlistitem}).
+%
+% Feature request: A feature that has sometimes been asked for is the possibility of creating a cover letter based on \mycls for a job application. This has not been implemented into \mycls so far. The \KOMAScript\ now offers the possibility to create letters not only with the letter class \textsf{scrlttr2}, but also to load the package \textsf{scrletter} within any \KOMA class. This works also for \mycls. If you're interested in creating a cover letter inside \mycls, also have a look at Richard Grewe's extra package |komacv-rg| (see below, Acknowledgements).
%
-% \section{Bugs, things to do, and maintenance}
-% Further testing and use will certainly make some bugs crawl out from the dark in which they hide from me until now. If you encounter bugs, errors or typos, or if you have suggestions how to improve the |komacv| class and the style files, please do not hesitate to contact me (in English or German) at \texttt{salome.soedergran@gmx.ch}. I am thankful for any suggestions that help improving |komacv| though I dare not promise to be always very speedy in publishing a new version. Computer stuff is something of rather low priority with me. So if you make a point of having bugs fixed as soon as possible I'd readily hand over the task of maintenance.
+% Further testing and use will certainly make some bugs crawl out from the dark in which they hide from me until now. If you encounter bugs, errors or typos, or if you have suggestions how to improve the \mycls class and the style files, please do not hesitate to contact me (in English or German) at \texttt{salome.soedergran@gmx.ch}. I am thankful for any suggestions that help improving \mycls though I dare not promise to be always very speedy in publishing a new version. Computer stuff is something of rather low priority with me. So if you make a point of having bugs fixed as soon as possible please consider making your own contributions on GitHub (\texttt{salsod/komacv}) \ldots or to become the new maintainer of \mycls.
%
%
%\section{Acknowledgements}
-% Many thanks to Ulrike Fischer, Alexander Kr\"anzlein, Matthias C.~Schmidt, Damian Martinez Dreyer, Wolfgang Witt, and Sebastian R\"oder for their suggestions and help. I am also grateful to Andreas Bie\ss{}mann, Simon Dreher, Paul Menzel and Dominik Wa\ss{}enhoven who helped to improve the (now obsolete) |koma-moderncvlassic.sty|.
-%
+% Many thanks to Richard Grewe, Samuel W. Flint, Alexander Dietzel, Ulrike Fischer, Alexander Kr\"anzlein, Matthias C.~Schmidt, Damian Martinez Dreyer, Wolfgang Witt, and Sebastian R\"oder for their suggestions and help. I am also grateful to Andreas Bie\ss{}mann, Simon Dreher, Paul Menzel and Dominik Wa\ss{}enhoven who helped to improve the (now obsolete) |koma-moderncvlassic.sty|.
+%
+% On CTAN you can find the bundle \textsf{komacv-rg} by Richard Grewe with extra features: \enquote{The komacv-rg bundle provides packages that aid in creating CVs based on the komacv class and creating related documents, such as cover letters and cover sheets for job applications. Concretely, the bundle consists of three packages: komacv-addons, komacv-lco, and komacv-multilang.} (The bug fixes presented in \textsf{komacv-addons} v0.9.2 found their way into \mycls as of v1.1.2.) Many thanks for this great addition!
%
% \StopEventually{\PrintIndex}
%
@@ -659,7 +676,7 @@
% \fi
% \begin{macrocode}
\providecommand*\mycolor{blue}
-\RequirePackage{ifthen,kvoptions,calc}
+\RequirePackage{ifthen,kvoptions,calc,xparse,xstring}
% \end{macrocode}
%
% \subsubsection*{Declare Options}
@@ -672,6 +689,7 @@ setkeys=\kvsetkeys%
\DeclareStringOption[mycolor]{color}[mycolor]
\DeclareStringOption[x11names]{xcolor}[x11names]
\DeclareStringOption[classic]{style}[classic]
+\DeclareBoolOption[true]{fontawesome}
\DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{scrartcl}}
% \end{macrocode}
%
@@ -697,15 +715,16 @@ setkeys=\kvsetkeys%
ifxetex,%
scrlayer-scrpage,%
marvosym,%
- fontawesome,%
array,%
graphicx,%
microtype,%
enumitem,
hyperref%
}
+\ifkomacv@fontawesome
+\RequirePackage{fontawesome}
+\fi
\RequirePackage[raggedrightboxes]{ragged2e}
-
\AtEndPreamble{%
\renewcommand\familydefault{\sfdefault}% without this, pdflatex produces error messages; WHY?
}
@@ -775,6 +794,7 @@ setkeys=\kvsetkeys%
\newkomafont{hintfont}{}
\newkomafont{linkfont}{}
\newkomafont{httplinkfont}{}
+\newkomafont{httpslinkfont}{}
\newkomafont{emaillinkfont}{}
\newkomafont{commentmainfont}{\bfseries} % in \cvitemwithcomment
\newkomafont{commentfont}{\footnotesize\itshape} % in \cvitemwithcomment
@@ -863,39 +883,33 @@ setkeys=\kvsetkeys%
\newlength\@aftersubsecvspace
\newlength\aftersubsecvspace
\setlength\aftersubsecvspace{0pt}
-
\AtEndPreamble{%
% infocol (oldstyle)
\setlength{\@infocolwidth}{\infocolwidth}
\setlength{\@sepinfocolwidth}{\sepinfocolwidth}
- \setlength\komacvinfocolextrawidth{\@infocolwidth+\@sepinfocolwidth}
+\setlength\komacvinfocolextrawidth{\@infocolwidth+\@sepinfocolwidth}
\setlength\@komacvtextwidth{\textwidth-\komacvinfocolextrawidth}
-
% fboxextra (picture frame)
\newlength\@fboxextra
\setlength\@fboxextra{\fboxsep+\fboxrule}
-
% hintscolumn
\ifdimequal{\hintscolwidth}{0pt}{%
\setlength\@hintscolwidth{.2\@komacvtextwidth}
}{%
\setlength{\@hintscolwidth}{\hintscolwidth}%
}
-
% separatorcolumn
\ifdimequal{\sepcolwidth}{0pt}{%
\setlength\@sepcolwidth{2em}%
}{%
\setlength{\@sepcolwidth}{\sepcolwidth}%
}
-
% maincolumn
\ifdimequal{\maincolwidth}{0pt}{%
- \setlength{\@maincolwidth}{\@komacvtextwidth-\@sepcolwidth-\@hintscolwidth}%
+\setlength{\@maincolwidth}{\@komacvtextwidth-\@sepcolwidth-\@hintscolwidth}%
}{%
\setlength{\@maincolwidth}{\maincolwidth}%
}
-
% doubleitem
\ifdimequal{\dbitemmaincolwidth}{0pt}{%
\setlength{\@dbitemmaincolwidth}{%
@@ -904,24 +918,21 @@ setkeys=\kvsetkeys%
}{%
\setlength{\@dbitemmaincolwidth}{\dbitemmaincolwidth}%
}
-
% listitem
\ifdimequal{\listitemsymbolwidth}{0pt}{%
\settowidth{\@listitemsymbolwidth}{\listitemsymbol{}~}%
}{%
\setlength{\@listitemsymbolwidth}{\listitemsymbolwidth}%
}
- \setlength{\@listitemmaincolwidth}{\@maincolwidth-\@listitemsymbolwidth}%
-
+\setlength{\@listitemmaincolwidth}{\@maincolwidth-\@listitemsymbolwidth}%
% listdoubleitem
\ifdimequal{\listdbitemmaincolwidth}{0pt}{%
- \setlength{\@listdbitemmaincolwidth}{\@maincolwidth-\@listitemsymbolwidth}%
- \setlength{\@listdbitemmaincolwidth}{0.475\@listdbitemmaincolwidth}% %
+\setlength{\@listdbitemmaincolwidth}{\@maincolwidth-\@sepcolwidth-\@listitemsymbolwidth}%
+\setlength{\@listdbitemmaincolwidth}{0.475\@listdbitemmaincolwidth}% %
}{%
\setlength{\@listdbitemmaincolwidth}{\listdbitemmaincolwidth}%
- \setlength{\@listdbitemmaincolwidth}{0.475\@listdbitemmaincolwidth}% %
+\setlength{\@listdbitemmaincolwidth}{0.475\@listdbitemmaincolwidth}% %
}
-
% quote
\ifdimequal{\quotewidth}{0pt}{%
\setlength{\@quotewidth}{0.65\textwidth}%
@@ -933,7 +944,6 @@ setkeys=\kvsetkeys%
}{%
\setlength\@afterquotevspace{\afterquotevspace}%
}
-
% title
\ifundef{\@photoname}{% without picture:
\setlength\@aftertitlevspace{\aftertitlevspace}
@@ -958,21 +968,18 @@ setkeys=\kvsetkeys%
\setlength{\@titlesepwidth}{\titlesepwidth}
}
}
-
% afterelementsvspace
\ifdimequal{\afterelementsvspace}{0pt}{%
\setlength{\@afterelementsvspace}{0.25em}%
}{%
\setlength{\@afterelementsvspace}{\afterelementsvspace}%
}
-
% beforesecvspace
\ifdimequal{\beforesecvspace}{0pt}{%
\setlength{\@beforesecvspace}{3.5ex \@plus -1ex \@minus -.2ex}%
}{%
\setlength{\@beforesecvspace}{\beforesecvspace}%
}
-
% aftersecvspace
\ifdimequal{\aftersecvspace}{0pt}{%
\setlength{\@aftersecvspace}{2.3ex \@plus.2ex}%
@@ -985,7 +992,6 @@ setkeys=\kvsetkeys%
}{
\setlength{\@beforesubsecvspace}{\beforesubsecvspace}%
}
-
% aftersubsecvspace
\ifdimequal{\aftersubsecvspace}{0pt}{%
\setlength{\@aftersubsecvspace}{1.5ex \@plus .2ex}%
@@ -997,32 +1003,39 @@ setkeys=\kvsetkeys%
%
%\subsubsection*{Symbols}
% \changes{v1.1}{2017/04/12}{Added macros and symbols for social media}
+% \changes{v1.1.2}{2021/02/12}{Added class option |fontawesome=false| to avoid the social media symbols}
% \begin{macrocode}
\providecommand*\@addresssymbol{}
\providecommand*\addresssymbol{}
-\providecommand*\@mobilesymbol{\Mobilefone~}
+\providecommand*\@mobilesymbol{\upshape{\Mobilefone}~}
\providecommand*\mobilesymbol{}
-\providecommand*\@phonesymbol{\Telefon~}
+\providecommand*\@phonesymbol{\upshape{\Telefon}~}
\providecommand*\phonesymbol{}
-\providecommand*\@faxsymbol{\FAX~}
+\providecommand*\@faxsymbol{\upshape{\FAX}~}
\providecommand*\faxsymbol{}
-\providecommand*\@emailsymbol{\Letter~}
+\providecommand*\@emailsymbol{\upshape{\Letter}~}
\providecommand*\emailsymbol{}
\providecommand*\@homepagesymbol{}
\providecommand*\homepagesymbol{}
-\providecommand*\@twittersymbol{\faTwitter~}
+\ifkomacv@fontawesome
+\providecommand*\@twittersymbol{\upshape{\faTwitter}~}
+\providecommand*\@githubsymbol{\upshape{\faGithub}~}
+\providecommand*\@facebooksymbol{\upshape{\faFacebook}~}
+\providecommand*\@linkedinsymbol{\upshape{\faLinkedin}~}
+\else
+\providecommand*\@twittersymbol{}
+\providecommand*\@githubsymbol{}
+\providecommand*\@facebooksymbol{}
+\providecommand*\@linkedinsymbol{}
+\fi
\providecommand*\twittersymbol{}
-\providecommand*\@githubsymbol{\faGithub~}
\providecommand*\githubsymbol{}
-\providecommand*\@facebooksymbol{\faFacebook~}
\providecommand*\facebooksymbol{}
-\providecommand*\@linkedinsymbol{\faLinkedin~}
\providecommand*\linkedinsymbol{}
\providecommand*\@fsymbol{~~~\textbullet~~~}
\providecommand*\fsymbol{}
\providecommand*\@listitemsymbol{\textcolor{colortheme}{\Neutral}~}
\providecommand*\listitemsymbol{}
-
\AtEndPreamble{%
\ifdefempty{\addresssymbol}{}{%
\renewcommand*\@addresssymbol{\addresssymbol}
@@ -1060,10 +1073,7 @@ setkeys=\kvsetkeys%
\ifdefempty{\listitemsymbol}{}{%
\renewcommand*\@listitemsymbol{\listitemsymbol}
}
-
-
} % end \AtEndPreamble
-
% \end{macrocode}
%
%\subsubsection*{Personal data}
@@ -1121,27 +1131,42 @@ setkeys=\kvsetkeys%
%
%\subsubsection*{Headline}
% \changes{v1.1}{2017/04/12}{Vertical space between name and academic title adjusted}
+% \changes{v1.1.2}{2021/02/12}{New implementation}
% \begin{macrocode}
-\providecommand\headlinetype{none}
+\providecommand\@headlinealignment{}
+\providecommand\@headlinetype{none}
\providecommand\@headlinecontent{}
-\providecommand\headlinecontent{}
-\providecommand\headline[2]{\renewcommand\headlinecontent{#1}\renewcommand\headlinetype{#2}}
-
-\AtEndPreamble{%
- \ifdefstring{\headlinetype}{name}{%
- \ifdefempty{\headlinecontent}{%
- \renewcommand*\@headlinecontent{\firstnamestyle{\firstname}\ \familynamestyle{\familyname}
- \ifdefempty{\acadtitle}{}{%
- \par\bigskip\acadtitlestyle{\acadtitle}}%
- }}{%
- \renewcommand*\@headlinecontent{\headlinecontent}
- }}{}
- \ifdefstring{\headlinetype}{title}{%
- \ifdefempty{\headlinecontent}{%
-\renewcommand*\@headlinecontent{\headlinestyle{Curriculum Vitae}}
- }{%
- \renewcommand*\@headlinecontent{\headlinecontent}
- }}{}
+\ProvideDocumentCommand{\headline}{O{c} m o}
+{
+ \renewcommand\@headlinealignment{#1}
+ \renewcommand\@headlinetype{#2}
+ \renewcommand\@headlinecontent{
+ \IfNoValueTF {#3}
+ {
+ \ifstrequal{#2}{title}{\par\headlinestyle{Curriculum Vitae}}{}
+ \ifstrequal{#2}{name}{\par\firstnamestyle{\firstname}\ \familynamestyle{\familyname}\par\bigskip\acadtitlestyle{\acadtitle}}{}
+ }{\headlinestyle{#3}}
+}
+}
+\providecommand\setheadlinealignment{%
+ \ifdefstring{\@headlinealignment}{l}{\RaggedRight}{%
+ \ifdefstring{\@headlinealignment}{r}{\RaggedLeft}{\Centering}}
+}
+\providecommand\setheadlinetypename{%
+\ifdefstring{\@headlinetype}{name}{%
+ \setheadlinealignment
+ \headlinestyle{\@headlinecontent}
+}{}
+}
+\providecommand\setheadlinetypetitle{%
+ \ifdefstring{\@headlinetype}{title}{%
+ \setheadlinealignment
+ \headlinestyle{\@headlinecontent}
+}{}
+}
+\providecommand\setheadline{%
+ \setheadlinetypename
+ \setheadlinetypetitle
}
% \end{macrocode}
%
@@ -1207,7 +1232,7 @@ setkeys=\kvsetkeys%
@{}>{\raggedleft\arraybackslash}p{\@hintscolwidth}%
@{\hspace{\@sepcolwidth}}p{\@maincolwidth}@{}%
}%
- \hintstyle{#2} & {#3}%
+ \hintstyle{#2} & {\@minipagetrue #3}%
\end{tabular}\\[#1]%
}
% \end{macrocode}
@@ -1322,11 +1347,30 @@ setkeys=\kvsetkeys%
%\paragraph{httplink}~\\%
%usage: \httplinkusage
% \begin{macrocode}
+ \providecommand*\croplink{}
\providecommand*{\httplink}[2][]{%
+ \renewcommand\croplink{\StrDel{#2}{http://}}
\ifstrempty{#1}{%
- \href{http://#2}{\usefontofkomafont{httplinkfont}#2}}{%
- \href{http://#2}{\usefontofkomafont{httplinkfont}#1}}%
- }
+ \IfSubStr{#2}{http:}{\href{#2}}{\href{http://#2}}{%
+ \usefontofkomafont{httplinkfont}\croplink}%
+ }{%
+ \IfSubStr{#2}{http:}{\href{#2}}{\href{http://#2}}{%
+ \usefontofkomafont{httplinkfont}#1}}
+ }
+% \end{macrocode}
+%
+%\paragraph{httpslink}~\\%
+%usage: \httpslinkusage
+% \begin{macrocode}
+ \providecommand*{\httpslink}[2][]{%
+ \renewcommand\croplink{\StrDel{#2}{https://}}
+ \ifstrempty{#1}{%
+ \IfSubStr{#2}{https:}{\href{#2}}{\href{https://#2}}{%
+ \usefontofkomafont{httpslinkfont}\croplink}%
+ }{%
+ \IfSubStr{#2}{https:}{\href{#2}}{\href{https://#2}}{%
+ \usefontofkomafont{httpslinkfont}#1}}
+ }
% \end{macrocode}
%
%\paragraph{emaillink}~\\%
@@ -1344,8 +1388,6 @@ setkeys=\kvsetkeys%
% \begin{macrocode}
% Depending on the style in use (see style descriptions).
% \end{macrocode}
-
-
%\subsubsection*{Hypersetup}
% \begin{macrocode}
\hypersetup{
@@ -1376,7 +1418,6 @@ setkeys=\kvsetkeys%
\providecommand*\pdfsubject{}
\providecommand*\pdftitle{}
\providecommand*\pdfkeywords{}
-
\AtEndPreamble{%
\providecommand*\@allbordercolors{colortheme}
\ifdefempty{\allbordercolors}{}{\renewcommand*\@allbordercolors{\allbordercolors}}
@@ -1409,7 +1450,7 @@ setkeys=\kvsetkeys%
\AtBeginDocument{%
\raggedbottom
} % End AtBeginDocument
-\clearscrheadfoot
+\clearpairofpagestyles
% \end{macrocode}
%
%\subsubsection*{Load style}
@@ -1469,28 +1510,23 @@ setkeys=\kvsetkeys%
\setlength{\@titledetailswidth}{\textwidth-\@titlenamewidth-\@titlesepwidth}%
\ifundef{\@photoname}{}{% else
\ifdefstring{\@photoframe}{frame}{%
- \setlength{\@titledetailswidth}{\@titledetailswidth-\@photowidth-2\@fboxextra}
+\setlength{\@titledetailswidth}{\@titledetailswidth-\@photowidth-2\@fboxextra}
\setlength{\@titledetailswidth}{.99\@titledetailswidth} % avoid overfullbox warning
}{% else
\ifdefstring{\@photoframe}{mframe}{%
- \setlength{\@titledetailswidth}{\@titledetailswidth-\@mframepicshift}%
+\setlength{\@titledetailswidth}{\@titledetailswidth-\@mframepicshift}%
\setlength{\@titledetailswidth}{.99\@titledetailswidth} % avoid overfullbox warning
}{% picture but no frame
- \setlength{\@titledetailswidth}{\@titledetailswidth-\@photowidth}
+ \setlength{\@titledetailswidth}{\@titledetailswidth-\@photowidth}
\setlength{\@titledetailswidth}{.99\@titledetailswidth} % avoid overfullbox warning
}
}
}%
- % name and title
-\ifdefstring{\headlinetype}{none}{%
-}{
- \begin{center}
- \headlinestyle{\@headlinecontent}\par\bigskip
- \end{center}
-}
+ % name and title
+\setheadline\par\bigskip
\begin{minipage}[b]{\@titlenamewidth}%
\RaggedRight
- \ifdefstring{\headlinetype}{name}{\hfill\mbox{}}{%
+ \ifdefstring{\@headlinetype}{name}{\hfill\mbox{}}{%
\firstnamestyle{\firstname}\ %
\familynamestyle{\familyname}%
\ifdefempty{\acadtitle}{}{%
@@ -1514,7 +1550,10 @@ setkeys=\kvsetkeys%
\ifdefempty{\email}{}{%
\@titledetailsnewline\@emailsymbol\emaillink{\email}}%
\ifdefempty{\homepage}{}{%
- \@titledetailsnewline\@homepagesymbol\httplink{\homepage}}%
+ \@titledetailsnewline\@homepagesymbol%
+ \IfSubStr{\homepage}{https}{%
+ \httpslink{\homepage}}{%
+ \httplink{\homepage}}}%
\ifdefempty{\twitter}{}{%
\@titledetailsnewline\@twittersymbol~\twitter}%
\ifdefempty{\github}{}{%
@@ -1544,11 +1583,12 @@ setkeys=\kvsetkeys%
\\[\@aftertitlevspace]
% optional quote
\ifundef{\cvquote}{}{%
- \centering
+ {\centering
\begin{minipage}{\@quotewidth}%
\centering\quotestyle{\cvquote}%
\end{minipage}\\[\@afterquotevspace]%
- }%
+ }
+ }%
}
% \end{macrocode}
%
@@ -1556,7 +1596,6 @@ setkeys=\kvsetkeys%
% \changes{v1.1}{2017/04/12}{Definition of \cs{section} and \cs{subsection} changed, mainly to avoid pagebreaks (all styles)}
% \begin{macrocode}
\setcounter{secnumdepth}{1}
-
\RedeclareSectionCommand
[
beforeskip=\@beforesecvspace,
@@ -1564,11 +1603,10 @@ setkeys=\kvsetkeys%
font=\color{@seccolor}\sectionfont
]{section}
\renewcommand*\thesection{\color{@secbarcolor}\rule{\@hintscolwidth}{1ex}\hspace{-1ex}\hspace{\@sepcolwidth}}
-
\RedeclareSectionCommand
[
- beforeskip=\@beforesecvspace,
- afterskip=\@aftersecvspace,
+ beforeskip=\@beforesubsecvspace,
+ afterskip=\@aftersubsecvspace,
indent=\dimexpr\@sepcolwidth+\@hintscolwidth,
font=\color{@subseccolor}\subsectionfont
]{subsection}
@@ -1615,7 +1653,7 @@ setkeys=\kvsetkeys%
\@sboxb{#2}
}
}
- \ifdimequal{\footerwidth}{0pt}{}{\setlength\@footerwidth{\footerwidth}}
+\ifdimequal{\footerwidth}{0pt}{}{\setlength\@footerwidth{\footerwidth}}
\defpagestyle{footer}
{{}{}{}}% head definition (empty)
{% foot definition
@@ -1638,7 +1676,10 @@ setkeys=\kvsetkeys%
\ifdefempty{\email}{}{%
\addtofooter{\@emailsymbol\emaillink{\email}}}
\ifdefempty{\homepage}{}{%
- \addtofooter{\@homepagesymbol\httplink{\homepage}}}%
+ \addtofooter{\@homepagesymbol%
+ \IfSubStr{\homepage}{https}{%
+ \httpslink{\homepage}}{%
+ \httplink{\homepage}}}}%
\ifdefempty{\twitter}{}{%
\addtofooter{\@twittersymbol\twitter}}%
\ifdefempty{\github}{}{%
@@ -1676,18 +1717,22 @@ setkeys=\kvsetkeys%
}% end savebox picbox
\settowidth\@titlepicwidth{\usebox{\@picbox}}
\setlength\@titlenamewidth{\textwidth-\@titlesepwidth-\@titlepicwidth}
-
+\setheadlinetypetitle\par
\usebox{\@picbox}%
\hspace*{\@titlesepwidth}%
\parbox[b]{\@titlenamewidth}{%
+ \ifdefstring{\@headlinetype}{name}{\setheadlinetypename}{%
\raggedleft{\firstnamestyle\firstname}%
- ~{\familynamestyle\familyname}\\
- \raggedleft\color{@firstnamecolor}\rule{\@titlenamewidth}{.25ex}\par
+ ~{\familynamestyle\familyname}
+ }
+ \\
+\raggedleft\color{@firstnamecolor}\rule{\@titlenamewidth}{.25ex}\par
}% end parbox
\vspace{\@aftertitlevspace}
%% optional acadtitle
\ifdefempty{\acadtitle}{}{%
- \raggedleft\acadtitlestyle{\acadtitle}}\\[2.5em]%
+ \ifdefstring{\@headlinetype}{name}{}{%
+ \raggedleft\acadtitlestyle{\acadtitle}}}\\[2.5em]%
%% optional quote
\ifdefempty{\cvquote}{}{%
{\centering
@@ -1697,7 +1742,6 @@ setkeys=\kvsetkeys%
}
}%
}% end \@cvtitle-casual
-
\AtBeginDocument{%
\thispagestyle{footer}
} % end \AtBeginDocument
@@ -1706,7 +1750,6 @@ setkeys=\kvsetkeys%
%\subsubsection*{Sections}
% \begin{macrocode}
\setcounter{secnumdepth}{1}
-
\RedeclareSectionCommand
[
beforeskip=\@beforesecvspace,
@@ -1714,11 +1757,10 @@ setkeys=\kvsetkeys%
font=\color{@seccolor}\sectionfont
]{section}
\renewcommand*\thesection{\color{@secbarcolor}\rule{\@hintscolwidth}{1ex}\hspace{-1ex}\hspace{\@sepcolwidth}}
-
\RedeclareSectionCommand
[
- beforeskip=\@beforesecvspace,
- afterskip=\@aftersecvspace,
+ beforeskip=\@beforesubsecvspace,
+ afterskip=\@aftersubsecvspace,
indent=\dimexpr\@sepcolwidth+\@hintscolwidth,
font=\color{@subseccolor}\subsectionfont
]{subsection}
@@ -1772,7 +1814,6 @@ setkeys=\kvsetkeys%
% \begin{macrocode}
\setlength{\infocolwidth}{3.5cm}
\setlength{\sepinfocolwidth}{2em}
-
\providecommand\@infocontent{%
\ifdefempty{\addressstreet}{}{%
\@titledetailsnewline%
@@ -1788,7 +1829,10 @@ setkeys=\kvsetkeys%
\ifdefempty{\email}{}{%
\@titledetailsnewline\@emailsymbol\emaillink{\email}}%
\ifdefempty{\homepage}{}{%
- \@titledetailsnewline\@homepagesymbol\httplink{\homepage}}%
+ \@titledetailsnewline\@homepagesymbol%
+ \IfSubStr{\homepage}{https}{%
+ \httpslink{\homepage}}{%
+ \httplink{\homepage}}}%
\ifdefempty{\twitter}{}{%
\@titledetailsnewline\@twittersymbol~\twitter}%
\ifdefempty{\github}{}{%
@@ -1800,7 +1844,6 @@ setkeys=\kvsetkeys%
\ifdefempty{\extrainfo}{}{%
\@titledetailsnewline\extrainfo}%
} % end \@infocontent
-
\providecommand{\@makeinfo}{%
\newbox{\@infobox}%
\savebox{\@infobox}{%
@@ -1823,7 +1866,6 @@ setkeys=\kvsetkeys%
\vspace*{-\parskip}%
\vspace*{-\@aftersecvspace}
}% end \providecommand \@makeinfo
-
\providecommand{\@cvtitleoldstyle}{%
% optional picture box
\newbox{\@picbox}
@@ -1842,12 +1884,15 @@ setkeys=\kvsetkeys%
}% end ifundef photoname
}% end savebox picbox
\settowidth\@titlepicwidth{\usebox{\@picbox}}
- \setlength\@titlenamewidth{\textwidth-\@titlesepwidth-\@titlepicwidth}
+\setlength\@titlenamewidth{\textwidth-\@titlesepwidth-\@titlepicwidth}
+ \setheadlinetypetitle\par
\begin{minipage}[b]{\@titlenamewidth}%
+ \ifdefstring{\@headlinetype}{name}{\setheadlinetypename}{%
\firstnamestyle{\firstname}\ %
\familynamestyle{\familyname}%
\ifdefempty{\acadtitle}{}{%
\\[1.25em]\acadtitlestyle{\acadtitle}}%
+ }
\end{minipage}%
% optional photo
\usebox{\@picbox}%
@@ -1865,7 +1910,6 @@ setkeys=\kvsetkeys%
\par
\begin{addmargin}[\komacvinfocolextrawidth]{0pt}
} % end \@cvtitleoldstyle
-
\AtEndDocument{%
\end{addmargin}
}
@@ -1875,18 +1919,16 @@ setkeys=\kvsetkeys%
%\label{subsub:oldstyle-sections}
% \begin{macrocode}
\setcounter{secnumdepth}{0}
-
\RedeclareSectionCommand
[
beforeskip=\@beforesecvspace,
afterskip=\@aftersecvspace,
font=\color{@seccolor}\sectionfont
]{section}
-
\RedeclareSectionCommand
[
- beforeskip=\@beforesecvspace,
- afterskip=\@aftersecvspace,
+ beforeskip=\@beforesubsecvspace,
+ afterskip=\@aftersubsecvspace,
font=\color{@subseccolor}\subsectionfont
]{subsection}
% \end{macrocode}
@@ -1902,7 +1944,6 @@ setkeys=\kvsetkeys%
{#3} & \RaggedRight\hintstyle{#2}%
\end{tabular}\\[#1]%
}
-
\renewcommand*{\cvdoubleitem}[5][\@afterelementsvspace]{%
\cvitem[#1]{#4}{%
\begin{minipage}[t]{\@dbitemmaincolwidth}#3\end{minipage}%
diff --git a/Master/texmf-dist/source/latex/komacv/komacv.ins b/Master/texmf-dist/source/latex/komacv/komacv.ins
index 02f16db379b..54e2fca81ec 100644
--- a/Master/texmf-dist/source/latex/komacv/komacv.ins
+++ b/Master/texmf-dist/source/latex/komacv/komacv.ins
@@ -1,4 +1,4 @@
-%% Copyright (C) 2014-2017 by Salome Södergran (salome.soedergran@gmx.ch)
+%% Copyright (C) 2014-2021 by Salome Södergran (salome.soedergran@gmx.ch)
%%
%% This work may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.3 of this license
@@ -23,7 +23,7 @@
This is a generated file.
-Copyright (C) 2014-2017 by Salome Södergran (salome.soedergran@gmx.ch)
+Copyright (C) 2014-2021 by Salome Södergran (salome.soedergran@gmx.ch)
This file may be distributed and/or modified under the conditions of
the LaTeX Project Public License, either version 1.3 of this license
diff --git a/Master/texmf-dist/source/latex/kvmap/kvmap.dtx b/Master/texmf-dist/source/latex/kvmap/kvmap.dtx
index b5fa08b04f4..2adb0fbaa38 100644
--- a/Master/texmf-dist/source/latex/kvmap/kvmap.dtx
+++ b/Master/texmf-dist/source/latex/kvmap/kvmap.dtx
@@ -64,6 +64,12 @@ End of file
\tcbset{enhanced,sharp corners=all}
\usemintedstyle{vs}
+^^A quick fix for tcolorbox's broken documentation library
+^^A by Skillmon, see https://chat.stackexchange.com/transcript/message/55558127#55558127
+\makeatletter
+\let\tcb@doc@index@doc\relax
+\makeatother
+
\usepackage{fontspec}
\usepackage{unicode-math}
\setmainfont[Numbers={OldStyle}]{Libertinus Serif}
@@ -102,7 +108,7 @@ End of file
%<*pkg>
%<@@=kvmap>
\RequirePackage{expl3}
-\ProvidesExplPackage{kvmap}{2020/03/27}{0.3.3}{Drawing karnaugh maps with LaTeX}
+\ProvidesExplPackage{kvmap}{2020/09/16}{0.3.5}{Drawing karnaugh maps with LaTeX}
%</pkg>
% \fi
%
@@ -133,8 +139,8 @@ End of file
% \section{Introduction}
% \pkg{kvmap} aims to provide a \emph{user-friendly} (i.e. less typing) way to
% typeset Karnaugh maps including the surrounding gray code and bundles of
-% cells (implicants). This package relies on \pkg{xparse} (with \pkg{expl3}),
-% \pkg{tikz} and \pkg{environ}.\par
+% cells (implicants). This package relies on \pkg{amsmath}, \pkg{xparse} (with
+% \pkg{expl3}) and \pkg{tikz}.\par
% Drawing Karnaugh maps is not that uncommon and there are already packages
% available on CTAN that provide means to typeset them:\begin{itemize}
% \item \pkg{askmaps} -- This package lets you draw American style Karnaugh
@@ -291,17 +297,18 @@ End of file
% \end{documentation}
% \begin{implementation}
% \clearpage\section{Implementation}
+% \changes{v0.3.5}{2020/09/16}{Add amsmath dependency to have smash option b available}
% \begin{macrocode}
+\RequirePackage{amsmath}
\RequirePackage{xparse}
\RequirePackage{tikz}
-\RequirePackage{environ}
% \end{macrocode}
-% \begin{macro}[aux]{\seq_set_split:Nno,\seq_set_split:Nnx,\int_mod:VV,\int_div_truncate:VV}
+% \begin{macro}[aux]{\seq_set_split:Nnx,\int_mod:VV,\int_div_truncate:VV}
% Define variants for better expansion.
% \begin{macrocode}
-\cs_generate_variant:Nn \seq_set_split:Nnn { Nno, Nnx }
-\cs_generate_variant:Nn \int_mod:nn { VV }
-\cs_generate_variant:Nn \int_div_truncate:nn { VV }
+\cs_generate_variant:Nn \seq_set_split:Nnn { Nnx }
+\cs_generate_variant:Nn \int_mod:nn { VV }
+\cs_generate_variant:Nn \int_div_truncate:nn { VV }
% \end{macrocode}
% \end{macro}
@@ -407,9 +414,10 @@ End of file
% \end{macro}
% \begin{macro}[int]{\@@_outputmatrix:n}
% \changes{v0.3.2}{2019/12/26}{Allow empty elements}
+% \changes{v0.3.4}{2020/04/25}{Fix node size}
% Define a TikZ style for easier customizability.
% \begin{macrocode}
-\tikzset{kvnode/.style = { inner ~ sep = 8pt }}
+\tikzset{kvnode/.style = { minimum ~ width=.75cm, minimum ~ height=.75cm }}
% \end{macrocode}
% This macro fill the grid with values.
% \begin{arguments}
@@ -441,7 +449,7 @@ End of file
at ~
(.5+\int_mod:VV \l_tmpa_int \l_@@_matrix_width_int,
-.5-\int_div_truncate:nn \l_tmpa_int \l_@@_matrix_width_int ) ~
- {$##1$};
+ {\smash[b]{\makebox[0pt]{$##1$}}};
\int_incr:N \l_tmpa_int
}
}
@@ -752,14 +760,14 @@ End of file
% \end{macrocode}
% \end{variable}
% \begin{macrocode}
-\NewEnviron { kvmatrix } [ 1 ]
+\NewDocumentEnvironment { kvmatrix } { m +b }
{
% \end{macrocode}
% Split the environments body at |\\| and remove empty lines. Now the height
% of the map is just the count of the sequence. Split the first element at |&|
% and use the count of that as width.
% \begin{macrocode}
- \seq_set_split:Nno \l_tmpa_seq { \\ } { \BODY }
+ \seq_set_split:Nnn \l_tmpa_seq { \\ } { #2 }
\seq_remove_all:Nn \l_tmpa_seq { }
\seq_set_split:Nnx \l_tmpb_seq { & } { \seq_item:Nn \l_tmpa_seq { 1 } }
\int_gset:Nn \l_@@_matrix_width_int { \seq_count:N \l_tmpb_seq }
@@ -789,7 +797,7 @@ End of file
{ #1 }
\bool_if:NF \l_@@_matrix_isintikz_bool
{ \end{tikzpicture} }
- }
+ } { }
% \end{macrocode}
% \end{environment}
@@ -808,6 +816,6 @@ End of file
% \end{macro}
% \end{implementation}
% \clearpage\PrintChanges
-% \clearpage\PrintIndex
+% ^^A\clearpage\PrintIndex
% \Finale
% \endinput \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/kvoptions/kvoptions.dtx b/Master/texmf-dist/source/latex/kvoptions/kvoptions.dtx
index 8dd9701d479..38dfa185861 100644
--- a/Master/texmf-dist/source/latex/kvoptions/kvoptions.dtx
+++ b/Master/texmf-dist/source/latex/kvoptions/kvoptions.dtx
@@ -1,12 +1,12 @@
% \iffalse meta-comment
%
% File: kvoptions.dtx
-% Version: 2019/11/29 v3.13
+% Version: 2020-10-07 v3.14
% Info: Key value format for package options
%
% Copyright (C)
% 2004, 2006, 2007, 2009-2011 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
+% 2016-2020 Oberdiek Package Support Group
% https://github.com/ho-tex/kvoptions/issues
%
% This work may be distributed and/or modified under the
@@ -85,7 +85,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: kvoptions 2019/11/29 v3.13 Key value format for package options (HO)}
+\Msg{* Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -97,11 +97,11 @@
This is a generated file.
Project: kvoptions
-Version: 2019/11/29 v3.13
+Version: 2020-10-07 v3.14
Copyright (C)
2004, 2006, 2007, 2009-2011 Heiko Oberdiek
- 2016-2019 Oberdiek Package Support Group
+ 2016-2020 Oberdiek Package Support Group
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -145,10 +145,6 @@ and the derived files
% \file{kvoptions-test3.tex}{\from{kvoptions.dtx}{test3}}%
% \file{kvoptions-test4.tex}{\from{kvoptions.dtx}{test4}}%
% \file{kvoptions-test4.sty}{\from{kvoptions.dtx}{test4pkg}}%
- \nopreamble
- \nopostamble
-% \usedir{source/latex/kvoptions/catalogue}%
-% \file{kvoptions.xml}{\from{kvoptions.dtx}{catalogue}}%
}
\catcode32=13\relax% active space
@@ -175,7 +171,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{kvoptions.drv}%
- [2019/11/29 v3.13 Key value format for package options (HO)]%
+ [2020-10-07 v3.14 Key value format for package options (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}[2011/11/22]
\begin{document}
@@ -185,26 +181,11 @@ and the derived files
% \fi
%
%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
%
% \GetFileInfo{kvoptions.drv}
%
% \title{The \xpackage{kvoptions} package}
-% \date{2019/11/29 v3.13}
+% \date{2020-10-07 v3.14}
% \author{Heiko Oberdiek\thanks
% {Please report any issues at \url{https://github.com/ho-tex/kvoptions/issues}}}
%
@@ -883,6 +864,11 @@ and the derived files
%
% \subsection{Package \xpackage{kvoptions-patch}}
%
+% \begin{description}
+% \item[Change in version v3.14:] \xpackage{kvoptions-patch} is not compatible with a
+% \LaTeX\ 2020-10-01 or newer and will abort loading if it detects it!
+% \end{description}
+%
% \LaTeX's system of package/class options has some severe limitations
% that especially affects the value part if options are used as
% pair of key and value.
@@ -1075,7 +1061,19 @@ and the derived files
% }
%
% \section{Implementation}
-%
+% \subsection{Disabling the patches for newer LaTeX}
+% \xpackage{kvoptions-patch} is not compatible with \LaTeX{} 2020-10-01 and newer
+% so it is disabled and issues a warning.
+% \begin{macrocode}
+%<*patch>
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}{\PackageWarning{kvoptions-patch}%
+ {kvoptions-patch is not compatible with \MessageBreak
+ LaTeX \fmtversion\MessageBreak Loading is aborted}{}}{}
+\IfFormatAtLeastTF{2020/10/01}{\endinput}{}
+%</patch>
+% \end{macrocode}
+
% \subsection{Preamble}
%
% \begin{macrocode}
@@ -1154,7 +1152,7 @@ and the derived files
\fi
\expandafter\x\csname ver@kvoptions.sty\endcsname
\ProvidesPackage{kvoptions}%
- [2019/11/29 v3.13 Key value format for package options (HO)]%
+ [2020-10-07 v3.14 Key value format for package options (HO)]%
% \end{macrocode}
%
% \paragraph{Catcodes}
@@ -2288,7 +2286,7 @@ and the derived files
\TMP@EnsureCode{124}{12}% |
\edef\KVO@AtEnd{\KVO@AtEnd\noexpand\endinput}
\ProvidesPackage{kvoptions-patch}%
- [2019/11/29 v3.13 LaTeX patch for keyval options (HO)]%
+ [2020-10-07 v3.14 LaTeX patch for keyval options (HO)]%
% \end{macrocode}
%
% Check for \eTeX.
@@ -2789,253 +2787,6 @@ and the derived files
\KVO@AtEnd%
%</patch>
% \end{macrocode}
-%
-% \section{Test}
-%
-% \subsection{Preface for standard catcode check}
-%
-% \begin{macrocode}
-%<*test1>
-\input miniltx.tex\relax
-%</test1>
-% \end{macrocode}
-%
-% \subsection{Catcode checks for loading}
-%
-% \begin{macrocode}
-%<*test1>
-% \end{macrocode}
-% \begin{macrocode}
-\catcode`\{=1 %
-\catcode`\}=2 %
-\catcode`\#=6 %
-\catcode`\@=11 %
-\expandafter\ifx\csname count@\endcsname\relax
- \countdef\count@=255 %
-\fi
-\expandafter\ifx\csname @gobble\endcsname\relax
- \long\def\@gobble#1{}%
-\fi
-\expandafter\ifx\csname @firstofone\endcsname\relax
- \long\def\@firstofone#1{#1}%
-\fi
-\expandafter\ifx\csname loop\endcsname\relax
- \expandafter\@firstofone
-\else
- \expandafter\@gobble
-\fi
-{%
- \def\loop#1\repeat{%
- \def\body{#1}%
- \iterate
- }%
- \def\iterate{%
- \body
- \let\next\iterate
- \else
- \let\next\relax
- \fi
- \next
- }%
- \let\repeat=\fi
-}%
-\def\RestoreCatcodes{}
-\count@=0 %
-\loop
- \edef\RestoreCatcodes{%
- \RestoreCatcodes
- \catcode\the\count@=\the\catcode\count@\relax
- }%
-\ifnum\count@<255 %
- \advance\count@ 1 %
-\repeat
-
-\def\RangeCatcodeInvalid#1#2{%
- \count@=#1\relax
- \loop
- \catcode\count@=15 %
- \ifnum\count@<#2\relax
- \advance\count@ 1 %
- \repeat
-}
-\def\RangeCatcodeCheck#1#2#3{%
- \count@=#1\relax
- \loop
- \ifnum#3=\catcode\count@
- \else
- \errmessage{%
- Character \the\count@\space
- with wrong catcode \the\catcode\count@\space
- instead of \number#3%
- }%
- \fi
- \ifnum\count@<#2\relax
- \advance\count@ 1 %
- \repeat
-}
-\def\space{ }
-\expandafter\ifx\csname LoadCommand\endcsname\relax
- \def\LoadCommand{\input kvoptions.sty\relax}%
-\fi
-\def\Test{%
- \RangeCatcodeInvalid{0}{47}%
- \RangeCatcodeInvalid{58}{64}%
- \RangeCatcodeInvalid{91}{96}%
- \RangeCatcodeInvalid{123}{255}%
- \catcode`\@=12 %
- \catcode`\\=0 %
- \catcode`\%=14 %
- \LoadCommand
- \RangeCatcodeCheck{0}{36}{15}%
- \RangeCatcodeCheck{37}{37}{14}%
- \RangeCatcodeCheck{38}{47}{15}%
- \RangeCatcodeCheck{48}{57}{12}%
- \RangeCatcodeCheck{58}{63}{15}%
- \RangeCatcodeCheck{64}{64}{12}%
- \RangeCatcodeCheck{65}{90}{11}%
- \RangeCatcodeCheck{91}{91}{15}%
- \RangeCatcodeCheck{92}{92}{0}%
- \RangeCatcodeCheck{93}{96}{15}%
- \RangeCatcodeCheck{97}{122}{11}%
- \RangeCatcodeCheck{123}{255}{15}%
- \RestoreCatcodes
-}
-\Test
-\csname @@end\endcsname
-\end
-% \end{macrocode}
-% \begin{macrocode}
-%</test1>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<*test2>
-\NeedsTeXFormat{LaTeX2e}
-\makeatletter
-\catcode`\@=11 %
-\def\RestoreCatcodes{}
-\count@=0 %
-\loop
- \edef\RestoreCatcodes{%
- \RestoreCatcodes
- \catcode\the\count@=\the\catcode\count@\relax
- }%
-\ifnum\count@<255 %
- \advance\count@\@ne
-\repeat
-
-\def\RangeCatcodeInvalid#1#2{%
- \count@=#1\relax
- \loop
- \catcode\count@=15 %
- \ifnum\count@<#2\relax
- \advance\count@\@ne
- \repeat
-}
-\def\Test#1{%
- \RangeCatcodeInvalid{0}{47}%
- \RangeCatcodeInvalid{58}{64}%
- \RangeCatcodeInvalid{91}{96}%
- \RangeCatcodeInvalid{123}{255}%
- \catcode`\@=12 %
- \catcode`\\=0 %
- \catcode`\{=1 %
- \catcode`\}=2 %
- \catcode`\#=6 %
- \catcode`\[=12 %
- \catcode`\]=12 %
- \catcode`\%=14 %
- \catcode`\ =10 %
- \catcode13=5 %
- #1\relax
- \RestoreCatcodes
-}
-\Test{\RequirePackage{kvoptions-patch}}%
-\Test{\RequirePackage{kvoptions}}%
-\csname @@end\endcsname
-%</test2>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<*test3>
-\NeedsTeXFormat{LaTeX2e}
-\makeatletter
-\RequirePackage{kvoptions}[2019/11/29]
-\def\msg#{\immediate\write16}
-\define@key{testfamily}{testkey}{%
- \msg{[testfamily/testkey/#1]}%
-}
-\define@key{testfamily}{testdefaultkey}[testdefault]{%
- \msg{[testfamily/testdefaultkey/#1]}%
-}
-\AddToKeyvalOption{testfamily}{testkey}{%
- \msg{[addition/#1]}%
-}
-\AddToKeyvalOption{testfamily}{testdefaultkey}{%
- \msg{[addition/#1]}%
-}
-\setkeys{testfamily}{%
- testkey=testA,%
- testdefaultkey=testB,%
- testdefaultkey,%
-}
-\SetupKeyvalOptions{%
- family=testfamily%
-}
-\AddToKeyvalOption*{testkey}{%
- \msg{[star addition/#1]}%
-}
-\AddToKeyvalOption*{testdefaultkey}{%
- \msg{[star addition/#1]}%
-}
-\setkeys{testfamily}{%
- testkey=testA,%
- testdefaultkey=testB,%
- testdefaultkey,%
-}
-\@@end
-%</test3>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<*test4pkg>
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{kvoptions-test4}[2019/11/29 package for testing]
-\RequirePackage{kvoptions}[2019/11/29]
-\SetupKeyvalOptions{%
- family=FOO,%
- prefix=foo,%
- setkeys=\kvsetkeys,%
-}
-\DeclareStringOption{str}
-\define@key{FOO}{set}{%
- \setkeys{BAR}{strbar={#1}}%
-}
-\define@key{BAR}{strbar}{%
- \def\foostr{[BAR:#1]}%
-}
-\ProcessKeyvalOptions*
-%</test4pkg>
-% \end{macrocode}
-% \begin{macrocode}
-%<*test4>
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{kvoptions-test4.tex}[2019/11/29 test file]
-\RequirePackage[%
- str=A,set=B,str=C,%
-]{kvoptions-test4}[2019/11/29]
-\def\TestExpected{C}
-\ifx\foostr\TestExpected
- \typeout{* Test ok.}%
-\else
- \typeout{* Result: [\foostr]}%
- \typeout{* Expected: [\TestExpected]}%
- \errmessage{Test failed!}%
-\fi
-\csname @@end\endcsname\end
-%</test4>
-% \end{macrocode}
-%
% \section{Installation}
%
% \subsection{Download}
@@ -3368,6 +3119,11 @@ and the derived files
% \item
% Documentation updates.
% \end{Version}
+% \begin{Version}{2020-10-07 v3.14}
+% \item \xpackage{kvoptions-patch} is not compatible with a
+% \LaTeX\ 2020-10-01 or newer and so it will abort loading if it detects it.
+% This fixes github issue \#5.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx
index 1ab76b974d7..b7f09e7dbde 100644
--- a/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx
+++ b/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx
@@ -2,7 +2,7 @@
%
%% File: l3backend-basics.dtx
%
-% Copyright (C) 2019,2020 The LaTeX3 Project
+% Copyright (C) 2019-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -56,7 +56,7 @@
% \section{\pkg{l3backend-basics} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% Whilst there is a reasonable amount of code overlap between backends,
@@ -68,29 +68,59 @@
% All the file identifiers are up-front so that they come out in the right
% place in the files.
% \begin{macrocode}
-%<*package>
\ProvidesExplFile
%<*dvipdfmx>
- {l3backend-dvipdfmx.def}{2020-03-12}{}
+ {l3backend-dvipdfmx.def}{2021-02-18}{}
{L3 backend support: dvipdfmx}
%</dvipdfmx>
%<*dvips>
- {l3backend-dvips.def}{2020-03-12}{}
+ {l3backend-dvips.def}{2021-02-18}{}
{L3 backend support: dvips}
%</dvips>
%<*dvisvgm>
- {l3backend-dvisvgm.def}{2020-03-12}{}
+ {l3backend-dvisvgm.def}{2021-02-18}{}
{L3 backend support: dvisvgm}
%</dvisvgm>
-%<*pdfmode>
- {l3backend-pdfmode.def}{2020-03-12}{}
- {L3 backend support: PDF mode}
-%</pdfmode>
-%<*xdvipdfmx>
- {l3backend-xdvipdfmx.def}{2020-03-12}{}
- {L3 backend support: xdvipdfmx}
-%</xdvipdfmx>
-%</package>
+%<*luatex>
+ {l3backend-luatex.def}{2021-02-18}{}
+ {L3 backend support: PDF output (LuaTeX)}
+%</luatex>
+%<*pdftex>
+ {l3backend-pdftex.def}{2021-02-18}{}
+ {L3 backend support: PDF output (pdfTeX)}
+%</pdftex>
+%<*xetex>
+ {l3backend-xetex.def}{2021-02-18}{}
+ {L3 backend support: XeTeX}
+%</xetex>
+% \end{macrocode}
+%
+% Check if the loaded kernel is at least enough to load this file.
+% The kernel date has to be at least equal to \cs{ExplBackendFileDate}
+% or later. If \cs{__kernel_dependency_version_check:Nn} doesn't
+% exist we're loading in an older kernel, so it's an error anyway.
+% With time, this test should vanish and only the dependency check
+% should remain.
+% \begin{macrocode}
+\cs_if_exist:NTF \__kernel_dependency_version_check:nn
+ {
+ \__kernel_dependency_version_check:nn {2020-09-01}
+%<dvipdfmx> {l3backend-dvipdfmx.def}
+%<dvips> {l3backend-dvips.def}
+%<dvisvgm> {l3backend-dvisvgm.def}
+%<luatex> {l3backend-luatex.def}
+%<pdftex> {l3backend-pdftex.def}
+%<xetex> {l3backend-xetex.def}
+ }
+ {
+ \cs_if_exist_use:cF { @latex@error } { \errmessage }
+ {
+ Mismatched~LaTeX~support~files~detected. \MessageBreak
+ Loading~aborted!
+ }
+ { \use:c { @ehd } }
+ \tex_endinput:D
+ }
% \end{macrocode}
%
% The order of the backend code here is such that we get somewhat logical
@@ -98,10 +128,10 @@
% mix all of the code by concept is almost unmanageable.) The key parts which
% are shared are
% \begin{itemize}
-% \item Color support is either \texttt{dvips}-like or \texttt{pdfmode}-like.
-% \item \texttt{pdfmode} and \texttt{(x)dvipdfmx} share drawing routines.
-% \item \texttt{xdvipdfmx} is largely the same as \texttt{dvipdfmx} so
-% takes most of the same code.
+% \item Color support is either \texttt{dvips}-like or \LuaTeX{}/pdfTeX{}-like.
+% \item \LuaTeX{}/pdfTeX{} and \texttt{dvipdfmx}/\XeTeX{} share drawing routines.
+% \item \XeTeX{} is the same as \texttt{dvipdfmx} other than image size
+% extraction so takes most of the same code.
% \end{itemize}
%
% \begin{macro}
@@ -155,15 +185,13 @@
% This is held until the start of shipout such that a document with no
% actual output does not write anything.
% \begin{macrocode}
-\cs_if_exist:NTF \AtBeginDvi
- { \AtBeginDvi }
- { \use:n }
- {
- \bool_lazy_and:nnT
- { \cs_if_exist_p:N \g__kernel_backend_header_bool }
- { \g__kernel_backend_header_bool }
+\bool_if:NT \g__kernel_backend_header_bool
+ {
+ \cs_if_exist:NTF \AtBeginDvi
+ { \AtBeginDvi }
+ { \use:n }
{ \__kernel_backend_literal:n { header = l3backend-dvips.pro } }
- }
+ }
% \end{macrocode}
%
% \begin{macro}
@@ -211,17 +239,16 @@
%</dvips>
% \end{macrocode}
%
-% \subsection{\texttt{pdfmode} backend}
+% \subsection{\LuaTeX{} and \pdfTeX{} backends}
%
% \begin{macrocode}
-%<*pdfmode>
+%<*luatex|pdftex>
% \end{macrocode}
%
-% The direct PDF backend covers both \pdfTeX{} and \LuaTeX{}. The latter
-% renames and restructures the backend primitives but this can be handled
-% at one level of abstraction. As such, we avoid using two separate backends
-% for this material at the cost of some \texttt{x}-type definitions to get
-% everything expanded up-front.
+% Both \LuaTeX{} and \pdfTeX{} write PDFs directly rather than via an
+% intermediate file. Although there are similarities, the move of \LuaTeX{}
+% to have more code in Lua means we create two independent files using
+% shared DocStrip code.
%
% \begin{macro}{\__kernel_backend_literal_pdf:n, \__kernel_backend_literal_pdf:x}
% This is equivalent to \verb|\special{pdf:}| but the engine can
@@ -230,12 +257,15 @@
% Note that this is still inside the text (\texttt{BT} \dots \texttt{ET}
% block).
% \begin{macrocode}
-\cs_new_protected:Npx \__kernel_backend_literal_pdf:n #1
+\cs_new_protected:Npn \__kernel_backend_literal_pdf:n #1
{
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D literal }
- { \tex_pdfliteral:D }
- { \exp_not:N \exp_not:n {#1} }
+%<*luatex>
+ \tex_pdfextension:D literal
+%</luatex>
+%<*pdftex>
+ \tex_pdfliteral:D
+%</pdftex>
+ { \exp_not:n {#1} }
}
\cs_generate_variant:Nn \__kernel_backend_literal_pdf:n { x }
% \end{macrocode}
@@ -245,13 +275,15 @@
% Page literals are pretty simple. To avoid an expansion, we write out
% by hand.
% \begin{macrocode}
-\cs_new_protected:Npx \__kernel_backend_literal_page:n #1
+\cs_new_protected:Npn \__kernel_backend_literal_page:n #1
{
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D literal ~ }
- { \tex_pdfliteral:D }
- page
- { \exp_not:N \exp_not:n {#1} }
+%<*luatex>
+ \tex_pdfextension:D literal ~
+%</luatex>
+%<*pdftex>
+ \tex_pdfliteral:D
+%</pdftex>
+ page { \exp_not:n {#1} }
}
% \end{macrocode}
% \end{macro}
@@ -259,17 +291,23 @@
% \begin{macro}{\__kernel_backend_scope_begin:, \__kernel_backend_scope_end:}
% Higher-level interfaces for saving and restoring the graphic state.
% \begin{macrocode}
-\cs_new_protected:Npx \__kernel_backend_scope_begin:
+\cs_new_protected:Npn \__kernel_backend_scope_begin:
{
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D save \scan_stop: }
- { \tex_pdfsave:D }
+%<*luatex>
+ \tex_pdfextension:D save \scan_stop:
+%</luatex>
+%<*pdftex>
+ \tex_pdfsave:D
+%</pdftex>
}
-\cs_new_protected:Npx \__kernel_backend_scope_end:
+\cs_new_protected:Npn \__kernel_backend_scope_end:
{
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D restore \scan_stop: }
- { \tex_pdfrestore:D }
+%<*luatex>
+ \tex_pdfextension:D restore \scan_stop:
+%</luatex>
+%<*pdftex>
+ \tex_pdfrestore:D
+%</pdftex>
}
% \end{macrocode}
% \end{macro}
@@ -279,36 +317,40 @@
% into the PDF. With \pdfTeX{} and \LuaTeX{} in direct PDF output mode there
% is a primitive for this, which only needs the rotation/scaling/skew part.
% \begin{macrocode}
-\cs_new_protected:Npx \__kernel_backend_matrix:n #1
+\cs_new_protected:Npn \__kernel_backend_matrix:n #1
{
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D setmatrix }
- { \tex_pdfsetmatrix:D }
- { \exp_not:N \exp_not:n {#1} }
+%<*luatex>
+ \tex_pdfextension:D setmatrix
+%</luatex>
+%<*pdftex>
+ \tex_pdfsetmatrix:D
+%</pdftex>
+ { \exp_not:n {#1} }
}
\cs_generate_variant:Nn \__kernel_backend_matrix:n { x }
% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
-%</pdfmode>
+%</luatex|pdftex>
% \end{macrocode}
%
% \subsection{\texttt{dvipdfmx} backend}
%
% \begin{macrocode}
-%<*dvipdfmx|xdvipdfmx>
+%<*dvipdfmx|xetex>
% \end{macrocode}
%
% The \texttt{dvipdfmx} shares code with the PDF mode one (using the common
-% section to this file) but also with \texttt{xdvipdfmx}. The latter is close
+% section to this file) but also with \XeTeX{}. The latter is close
% to identical to \texttt{dvipdfmx} and so all of the code here is extracted
-% for both backends, with some \texttt{clean up} for \texttt{xdvipdfmx} as
+% for both backends, with some \texttt{clean up} for \XeTeX{} as
% required.
%
% \begin{macro}{\__kernel_backend_literal_pdf:n, \__kernel_backend_literal_pdf:x}
-% Equivalent to \texttt{pdf:content} but favored as the link to
-% the \pdfTeX{} primitive approach is clearer.
+% Undocumented but equivalent to \pdfTeX{}'s |literal| keyword. It's similar to
+% be not the same as the documented |contents| keyword as that adds a |q|/|Q|
+% pair.
% \begin{macrocode}
\cs_new_protected:Npn \__kernel_backend_literal_pdf:n #1
{ \__kernel_backend_literal:n { pdf:literal~ #1 } }
@@ -326,7 +368,9 @@
% \end{macro}
%
% \begin{macro}{\__kernel_backend_scope_begin:, \__kernel_backend_scope_end:}
-% Scoping is done using the backend-specific specials.
+% Scoping is done using the backend-specific specials. We use the versions
+% originally from \texttt{xdvidfpmx} (\texttt{x:}) as these are well-tested
+% \enquote{in the wild}.
% \begin{macrocode}
\cs_new_protected:Npn \__kernel_backend_scope_begin:
{ \__kernel_backend_literal:n { x:gsave } }
@@ -336,7 +380,36 @@
% \end{macro}
%
% \begin{macrocode}
-%</dvipdfmx|xdvipdfmx>
+%<@@=sys>
+% \end{macrocode}
+%
+% \begin{macro}{\c__kernel_sys_dvipdfmx_version_int}
+% A short excursion into the |sys| module to set up the backend version
+% information.
+% \begin{macrocode}
+\group_begin:
+ \cs_set:Npn \@@_tmp:w #1 Version ~ #2 ~ #3 \q_stop {#2}
+ \sys_get_shell:nnNTF { extractbb~--version }
+ { \char_set_catcode_space:n { `\ } }
+ \l_@@_internal_tl
+ {
+ \int_const:Nn \c__kernel_sys_dvipdfmx_version_int
+ {
+ \exp_after:wN \@@_tmp:w \l_@@_internal_tl
+ \q_stop
+ }
+ }
+ { \int_const:Nn \c__kernel_sys_dvipdfmx_version_int { 0 } }
+\group_end:
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</dvipdfmx|xetex>
% \end{macrocode}
%
% \subsection{\texttt{dvisvgm} backend}
@@ -358,36 +431,71 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\__kernel_backend_scope_begin:, \__kernel_backend_scope_end:}
-% A scope in SVG terms is slightly different to the other backends as
-% operations have to be \enquote{tied} to these not simply inside them.
+% \begin{variable}{\g__kernel_backend_scope_int, \l__kernel_backend_scope_int}
+% In SVG, we need to track scope nesting as properties attach to scopes; that
+% requires a pair of \texttt{int} registers.
% \begin{macrocode}
-\cs_new_protected:Npn \__kernel_backend_scope_begin:
- { \__kernel_backend_literal_svg:n { <g> } }
-\cs_new_protected:Npn \__kernel_backend_scope_end:
- { \__kernel_backend_literal_svg:n { </g> } }
+\int_new:N \g__kernel_backend_scope_int
+\int_new:N \l__kernel_backend_scope_int
% \end{macrocode}
-% \end{macro}
+% \end{variable}
%
+% \begin{macro}{\__kernel_backend_scope_begin:, \__kernel_backend_scope_end:}
% \begin{macro}{\__kernel_backend_scope_begin:n, \__kernel_backend_scope_begin:x}
-% In SVG transformations, clips and so on are attached directly to scopes so
-% we need a way or allowing for that. This is rather more useful than
-% \cs{__kernel_backend_scope_begin:} as a result.
-% No assumptions are made about the nature
-% of the scoped operation(s).
+% \begin{macro}{\__kernel_backend_scope:n, \__kernel_backend_scope:x}
+% In SVG, the need to attach concepts to a scope means we need to be sure we
+% will close all of the open scopes. That is easiest done if we only need
+% an outer \enquote{wrapper} \texttt{begin}/\texttt{end} pair, and within
+% that we apply operations as a simple scoped statements. To keep down the
+% non-productive groups, we also have a \texttt{begin} version that does take
+% an argument.
% \begin{macrocode}
+\cs_new_protected:Npn \__kernel_backend_scope_begin:
+ {
+ \__kernel_backend_literal_svg:n { <g> }
+ \int_set_eq:NN
+ \l__kernel_backend_scope_int
+ \g__kernel_backend_scope_int
+ \group_begin:
+ \int_gset:Nn \g__kernel_backend_scope_int { 1 }
+ }
+\cs_new_protected:Npn \__kernel_backend_scope_end:
+ {
+ \prg_replicate:nn
+ { \g__kernel_backend_scope_int }
+ { \__kernel_backend_literal_svg:n { </g> } }
+ \group_end:
+ \int_gset_eq:NN
+ \g__kernel_backend_scope_int
+ \l__kernel_backend_scope_int
+ }
\cs_new_protected:Npn \__kernel_backend_scope_begin:n #1
- { \__kernel_backend_literal_svg:n { <g~ #1 > } }
+ {
+ \__kernel_backend_literal_svg:n { <g ~ #1 > }
+ \int_set_eq:NN
+ \l__kernel_backend_scope_int
+ \g__kernel_backend_scope_int
+ \group_begin:
+ \int_gset:Nn \g__kernel_backend_scope_int { 1 }
+ }
\cs_generate_variant:Nn \__kernel_backend_scope_begin:n { x }
+\cs_new_protected:Npn \__kernel_backend_scope:n #1
+ {
+ \__kernel_backend_literal_svg:n { <g ~ #1 > }
+ \int_gincr:N \g__kernel_backend_scope_int
+ }
+\cs_generate_variant:Nn \__kernel_backend_scope:n { x }
% \end{macrocode}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macrocode}
%</dvisvgm>
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx
index 8a855c54c84..bc0a3ffdd5f 100644
--- a/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx
+++ b/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx
@@ -2,7 +2,7 @@
%
%% File: l3backend-box.dtx
%
-% Copyright (C) 2019,2020 The LaTeX3 Project
+% Copyright (C) 2019-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -56,7 +56,7 @@
% \section{\pkg{l3backend-box} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
%<@@=box>
% \end{macrocode}
%
@@ -151,10 +151,10 @@
%</dvips>
% \end{macrocode}
%
-% \subsection{\texttt{pdfmode} backend}
+% \subsection{\LuaTeX{} and \pdfTeX{} backends}
%
% \begin{macrocode}
-%<*pdfmode>
+%<*luatex|pdftex>
% \end{macrocode}
%
% \begin{macro}{\@@_backend_clip:N}
@@ -247,17 +247,17 @@
% \end{macro}
%
% \begin{macrocode}
-%</pdfmode>
+%</luatex|pdftex>
% \end{macrocode}
%
-% \subsection{\texttt{dvipdfmx} backend}
+% \subsection{\texttt{dvipdfmx}/\XeTeX{} backend}
%
% \begin{macrocode}
-%<*dvipdfmx|xdvipdfmx>
+%<*dvipdfmx|xetex>
% \end{macrocode}
%
% \begin{macro}{\@@_backend_clip:N}
-% The code here is identical to that for \texttt{pdfmode}: unlike rotation and
+% The code here is identical to that for \LuaTeX{}/\pdfTeX{}: unlike rotation and
% scaling, there is no higher-level support in the backend for clipping.
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_clip:N #1
@@ -280,7 +280,7 @@
%
% \begin{macro}{\@@_backend_rotate:Nn}
% \begin{macro}{\@@_backend_rotate_aux:Nn}
-% Rotating in \texttt{(x)}dvipdmfx can be implemented using either PDF or
+% Rotating in \texttt{dvipdmfx}/\XeTeX{} can be implemented using either PDF or
% backend-specific code. The former approach however is not \enquote{aware}
% of the content of boxes: this means that any embedded links would not be
% adjusted by the rotation. As such, the backend-native approach is preferred:
@@ -327,7 +327,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</dvipdfmx|xdvipdfmx>
+%</dvipdfmx|xetex>
% \end{macrocode}
%
% \subsection{\texttt{dvisvgm} backend}
@@ -387,12 +387,12 @@
scale ( 1 , -1 )
"
}
- \__kernel_backend_scope_begin:x
+ \__kernel_backend_scope:x
{
clip-path =
"url ( \c_hash_str l3cp \int_use:N \g_@@_clip_path_int ) "
}
- \__kernel_backend_scope_begin:n
+ \__kernel_backend_scope:n
{
transform =
"
@@ -403,9 +403,6 @@
}
\box_use:N #1
\__kernel_backend_scope_end:
- \__kernel_backend_scope_end:
- \__kernel_backend_scope_end:
-% \skip_horizontal:n { \box_wd:N #1 }
}
\int_new:N \g_@@_clip_path_int
% \end{macrocode}
@@ -465,7 +462,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx
index 6381a09b938..451a0039a55 100644
--- a/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx
+++ b/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx
@@ -2,7 +2,7 @@
%
%% File: l3backend-color.dtx
%
-% Copyright (C) 2019,2020 The LaTeX3 Project
+% Copyright (C) 2019-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -56,233 +56,1161 @@
% \section{\pkg{l3backend-color} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
%<@@=color>
% \end{macrocode}
%
-% Color support is split into two parts: a \enquote{general} concept and
-% one directly linked to drawings (or rather the split between filling
-% and stroking). General color is relatively easy to handle: we have a color
-% stack available with all modern drivers, and can use that.
-% Whilst \texttt{(x)dvipdfmx} does have its own approach to color specials,
-% it is easier to use \texttt{dvips}-like ones for all cases except direct
-% PDF output.
+% Color support is split into parts: collecting data from \LaTeXe{}, the color stack, general color, separations, and color for
+% drawings. We have different approaches in each backend, and have some choices
+% to make about \texttt{dvipdfmx}/\XeTeX{} in particular. Whilst it is in some ways
+% convenient to use the same approach in multiple backends, the fact that
+% \texttt{dvipdfmx}/\XeTeX{} is PDF-based means it (largely) sticks closer to
+% direct PDF output.
+%
+% \subsection{Collecting information from \LaTeXe{}}
%
-% \subsection{\texttt{dvips}-style}
+% \subsubsection{\texttt{dvips}-style}
%
% \begin{macrocode}
-%<*dvisvgm|dvipdfmx|dvips|xdvipdfmx>
+%<*dvisvgm|dvipdfmx|dvips|xetex>
% \end{macrocode}
%
% \begin{macro}{\@@_backend_pickup:N}
% \begin{macro}{\@@_backend_pickup:w}
% Allow for \LaTeXe{} color. Here, the possible input values are limited:
% \texttt{dvips}-style colors can mainly be taken as-is with the exception
-% spot ones (here we need a model and a tint).
+% spot ones (here we need a model and a tint). The \texttt{x}-type expansion
+% is there to cover the case where \pkg{xcolor} is in use.
% \begin{macrocode}
-%<*package>
\cs_new_protected:Npn \@@_backend_pickup:N #1 { }
-\AtBeginDocument
+\cs_if_exist:cT { ver@color.sty }
{
- \cs_if_exist:cT { ver@color.sty }
+ \cs_set_protected:Npn \@@_backend_pickup:N #1
{
- \cs_set_protected:Npn \@@_backend_pickup:N #1
+ \exp_args:NV \tl_if_head_is_space:nTF \current@color
{
- \exp_args:NV \tl_if_head_is_space:nTF \current@color
+ \tl_set:Nx #1
+ {
+ { \exp_after:wN \use:n \current@color }
+ { 1 }
+ }
+ }
+ {
+ \exp_last_unbraced:Nx \@@_backend_pickup:w
+ { \current@color } \s_@@_stop #1
+ }
+ }
+ \cs_new_protected:Npn \@@_backend_pickup:w #1 ~ #2 \s_@@_stop #3
+ { \tl_set:Nn #3 { {#1} {#2} } }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</dvisvgm|dvipdfmx|dvips|xetex>
+% \end{macrocode}
+%
+% \subsubsection{\LuaTeX{} and \pdfTeX{}}
+%
+% \begin{macrocode}
+%<*luatex|pdftex>
+% \end{macrocode}
+%
+% \begin{macro}{\@@_backend_pickup:N}
+% \begin{macro}{\@@_backend_pickup:w}
+% The current color in driver-dependent format: pick up the package-mode
+% data if available. We end up converting back and forward in this route as
+% we store our color data in \texttt{dvips} format.
+% The \tn{current@color} needs to be \texttt{x}-expanded before
+% \cs{@@_backend_pickup:w} breaks it apart, because for instance
+% \pkg{xcolor} sets it to be instructions to generate a color
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_pickup:N #1 { }
+\cs_if_exist:cT { ver@color.sty }
+ {
+ \cs_set_protected:Npn \@@_backend_pickup:N #1
+ {
+ \exp_last_unbraced:Nx \@@_backend_pickup:w
+ { \current@color } ~ 0 ~ 0 ~ 0 \s_@@_stop #1
+ }
+ \cs_new_protected:Npn \@@_backend_pickup:w
+ #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \s_@@_stop #7
+ {
+ \str_if_eq:nnTF {#2} { g }
+ { \tl_set:Nn #7 { { gray } {#1} } }
+ {
+ \str_if_eq:nnTF {#4} { rg }
+ { \tl_set:Nn #7 { { rgb } { #1 ~ #2 ~ #3 } } }
{
- \tl_set:Nx #1
+ \str_if_eq:nnTF {#5} { k }
+ { \tl_set:Nn #7 { { cmyk } { #1 ~ #2 ~ #3 ~ #4 } } }
{
- spot ~
- \exp_after:wN \use:n \current@color \c_space_tl 1
+ \str_if_eq:nnTF {#2} { cs }
+ {
+ \tl_set:Nx #7 { { \use:n #1 } { #5 } }
+ }
+ {
+ \tl_set:Nn #7 { { gray } { 0 } }
+ }
}
}
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</luatex|pdftex>
+% \end{macrocode}
+%
+% \subsection{The color stack}
+%
+% For PDF-based engines, we have a color stack available inside the specials.
+% This is used for concepts beyond color itself: it is needed to manage th graphics
+% state generally. The exact form depends on the engine, and for
+% \texttt{dvipdfmx}/\XeTeX{} the backend version.
+%
+% \subsubsection{Common code}
+%
+% \begin{macrocode}
+%<*dvipdfmx|luatex|pdftex|xetex>
+% \end{macrocode}
+%
+% \begin{variable}{\l_@@_backend_stack_int}
+% \pdfTeX{}, \LuaTeX{} and recent \texttt{(x)dvipdfmx} have multiple stacks
+% available, and to track which one is in use a variable is required.
+% \begin{macrocode}
+\int_new:N \l_@@_backend_stack_int
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macrocode}
+%</dvipdfmx|luatex|pdftex|xetex>
+% \end{macrocode}
+%
+% \subsubsection{\texttt{dvipdfmx}/\XeTeX{}}
+%
+% \begin{macrocode}
+%<*dvipdfmx|xetex>
+% \end{macrocode}
+%
+% \begin{macro}{\__kernel_color_backend_stack_init:Nnn}
+% \begin{variable}
+% {\g_@@_backend_stack_int, \c_@@_backend_main_stack_int}
+% In \texttt{(x)dvipdfmx}, the base color stack is not set up, so we have to
+% force that, as well as providing a mechanism more generally.
+% \begin{macrocode}
+\int_compare:nNnTF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
+ { \cs_new_protected:Npn \__kernel_color_backend_stack_init:Nnn #1#2#3 { } }
+ {
+ \int_new:N \g_@@_backend_stack_int
+ \cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3
+ {
+ \int_gincr:N \exp_not:N \g_@@_backend_stack_int
+ \int_const:Nn #1 { \exp_not:N \g_@@_backend_stack_int }
+ \cs_if_exist:NTF \AtBeginDvi
+ { \exp_not:N \AtBeginDvi }
+ { \exp_not:N \use:n }
+ {
+ \__kernel_backend_literal:x
{
- \exp_last_unbraced:Nx \@@_backend_pickup:w
- { \current@color } \q_stop #1
+ pdfcolorstackinit ~
+ \exp_not:N \int_use:N \exp_not:N \g_@@_backend_stack_int
+ \c_space_tl
+ \exp_not:N \tl_if_blank:nF {#2} { #2 ~ }
+ (#3)
}
}
- \cs_new_protected:Npn \@@_backend_pickup:w #1 ~ #2 \q_stop #3
- { \tl_set:Nn #3 { #1 ~ #2 } }
+ }
+ \cs_if_exist:cTF { main@pdfcolorstack }
+ {
+ \int_set:Nn \l_@@_backend_stack_int
+ { \int_use:c { main@pdfcolorstack } }
+ }
+ {
+ \__kernel_color_backend_stack_init:Nnn \c_@@_backend_main_stack_int
+ { page ~ direct } { 0 ~ g ~ 0 ~ G }
+ \int_set_eq:NN \l_@@_backend_stack_int
+ \c_@@_backend_main_stack_int
+ }
+ }
+% \end{macrocode}
+% \end{variable}
+% \end{macro}
+%
+% \begin{macro}{\__kernel_color_backend_stack_push:nn, \__kernel_color_backend_stack_push:nx}
+% \begin{macro}{\__kernel_color_backend_stack_pop:n}
+% Simple enough but needs a version check.
+% \begin{macrocode}
+\int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
+ {
+ \cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2
+ {
+ \__kernel_backend_literal:x
+ {
+ pdfcolorstack ~
+ \int_eval:n {#1} ~
+ push ~ (#2)
+ }
+ }
+ \cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx }
+ \cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1
+ {
+ \__kernel_backend_literal:x
+ {
+ pdfcolorstack ~
+ \int_eval:n {#1} ~
+ pop
+ }
}
}
-%</package>
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\@@_backend_cmyk:nnnn}
-% \begin{macro}{\@@_backend_gray:n}
-% \begin{macro}{\@@_backend_rgb:nnn}
-% \begin{macro}{\@@_backend_spot:nn}
-% \begin{macro}{\@@_backend_select:n, \@@_backend_select:x}
-% \begin{macro}{\@@_backend_reset:}
-% \begin{macro}{color.fc}
-% Push the data to the stack. In the case of \texttt{dvips} also reset the
-% drawing fill color in raw PostScript.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_backend_cmyk:nnnn #1#2#3#4
+%</dvipdfmx|xetex>
+% \end{macrocode}
+%
+% \subsubsection{\LuaTeX and \pdfTeX{}}
+%
+% \begin{macrocode}
+%<*luatex|pdftex>
+% \end{macrocode}
+%
+% \begin{macro}{\__kernel_color_backend_stack_init:Nnn}
+% \begin{macrocode}
+\cs_new_protected:Npn \__kernel_color_backend_stack_init:Nnn #1#2#3
{
- \@@_backend_select:x
+ \int_const:Nn #1
{
- cmyk~
- \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
- \fp_eval:n {#3} ~ \fp_eval:n {#4}
+%<*luatex>
+ \tex_pdffeedback:D colorstackinit ~
+%</luatex>
+%<*pdftex>
+ \tex_pdfcolorstackinit:D
+%</pdftex>
+ \tl_if_blank:nF {#2} { #2 ~ }
+ {#3}
}
}
-\cs_new_protected:Npn \@@_backend_gray:n #1
- { \@@_backend_select:x { gray~ \fp_eval:n {#1} } }
-\cs_new_protected:Npn \@@_backend_rgb:nnn #1#2#3
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\__kernel_color_backend_stack_push:nn, \__kernel_color_backend_stack_push:nx}
+% \begin{macro}{\__kernel_color_backend_stack_pop:n}
+% \begin{macrocode}
+\cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2
+ {
+%<*luatex>
+ \tex_pdfextension:D colorstack ~
+%</luatex>
+%<*pdftex>
+ \tex_pdfcolorstack:D
+%</pdftex>
+ \int_eval:n {#1} ~ push ~ {#2}
+ }
+\cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx }
+\cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1
{
- \@@_backend_select:x
- { rgb~ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} }
+%<*luatex>
+ \tex_pdfextension:D colorstack ~
+%</luatex>
+%<*pdftex>
+ \tex_pdfcolorstack:D
+%</pdftex>
+ \int_eval:n {#1} ~ pop \scan_stop:
}
-\cs_new_protected:Npn \@@_backend_spot:nn #1#2
- { \@@_backend_select:n { #1 } }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</luatex|pdftex>
+% \end{macrocode}
+%
+% \subsection{General color}
+%
+% \subsubsection{\texttt{dvips}-style}
+%
+% \begin{macrocode}
+%<*dvips|dvisvgm>
+% \end{macrocode}
+%
+% \begin{macro}
+% {
+% \@@_backend_select_cmyk:n ,
+% \@@_backend_select_gray:n ,
+% \@@_backend_select_rgb:n ,
+% \@@_backend_select:n
+% }
+% \begin{macro}{\@@_backend_reset:}
+% \begin{macro}{color.sc}
+% Push the data to the stack. In the case of \texttt{dvips} also saves the
+% drawing color in raw PostScript.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_select_cmyk:n #1
+ { \@@_backend_select:n { cmyk ~ #1 } }
+\cs_new_protected:Npn \@@_backend_select_gray:n #1
+ { \@@_backend_select:n { gray ~ #1 } }
+\cs_new_protected:Npn \@@_backend_select_rgb:n #1
+ { \@@_backend_select:n { rgb ~ #1 } }
\cs_new_protected:Npn \@@_backend_select:n #1
{
\__kernel_backend_literal:n { color~push~ #1 }
%<*dvips>
- \__kernel_backend_postscript:n { /color.fc~{ }~def }
+ \__kernel_backend_postscript:n { /color.sc ~ { } ~ def }
%</dvips>
\group_insert_after:N \@@_backend_reset:
}
-\cs_generate_variant:Nn \@@_backend_select:n { x }
\cs_new_protected:Npn \@@_backend_reset:
{ \__kernel_backend_literal:n { color~pop } }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
+%
+% \begin{macrocode}
+%</dvips|dvisvgm>
+% \end{macrocode}
+%
+% \subsubsection{\LuaTeX{} and \pdfTeX{}}
+%
+% \begin{macrocode}
+%<*dvipdfmx|luatex|pdftex|xetex>
+% \end{macrocode}
+%
+% \begin{variable}{\l_@@_backend_fill_tl, \l_@@_backend_stroke_tl}
+% \begin{macrocode}
+\tl_new:N \l_@@_backend_fill_tl
+\tl_new:N \l_@@_backend_stroke_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}
+% {
+% \@@_backend_select_cmyk:n ,
+% \@@_backend_select_gray:n ,
+% \@@_backend_select_rgb:n
+% }
+% \begin{macro}{\@@_backend_select:nn}
+% \begin{macro}{\@@_backend_reset:}
+% Store the values then pass to the stack.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_select_cmyk:n #1
+ { \@@_backend_select:nn { #1 ~ k } { #1 ~ K } }
+\cs_new_protected:Npn \@@_backend_select_gray:n #1
+ { \@@_backend_select:nn { #1 ~ g } { #1 ~ G } }
+\cs_new_protected:Npn \@@_backend_select_rgb:n #1
+ { \@@_backend_select:nn { #1 ~ rg } { #1 ~ RG } }
+\cs_new_protected:Npn \@@_backend_select:nn #1#2
+ {
+ \tl_set:Nn \l_@@_backend_fill_tl {#1}
+ \tl_set:Nn \l_@@_backend_stroke_tl {#2}
+ \__kernel_color_backend_stack_push:nn \l_@@_backend_stack_int { #1 ~ #2 }
+ \group_insert_after:N \@@_backend_reset:
+ }
+\cs_new_protected:Npn \@@_backend_reset:
+ { \__kernel_color_backend_stack_pop:n \l_@@_backend_stack_int }
+% \end{macrocode}
+% \end{macro}
% \end{macro}
% \end{macro}
+%
+% \begin{macrocode}
+%</dvipdfmx|luatex|pdftex|xetex>
+% \end{macrocode}
+%
+% \subsubsection{\texttt{dvipmdfx}/\XeTeX{}}
+%
+% \begin{macrocode}
+%<*dvipdfmx|xetex>
+% \end{macrocode}
+%
+% These backends have the most possible approaches: it recognises both
+% \texttt{dvips}-based color specials and it's own format, plus one can
+% include PDF statements directly. Recent releases also have a color stack
+% approach similar to \pdfTeX{}. Of the stack methods, the dedicated
+% the most versatile is the latter as it can cover all of the use cases
+% we have. Thus it is used in preference to the \texttt{dvips}-style interface
+% or the \enquote{native} color specials (which have only one stack).
+%
+% \begin{macro}
+% {
+% \@@_backend_select_cmyk:n ,
+% \@@_backend_select_gray:n ,
+% \@@_backend_select_rgb:n
+% }
+% \begin{macro}{\@@_backend_reset:}
+% Push the data to the stack.
+% \begin{macrocode}
+\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
+ {
+ \cs_gset_protected:Npn \@@_backend_select_cmyk:n #1
+ {
+ \__kernel_backend_literal:n { pdf: bc ~ [#1] }
+ \group_insert_after:N \@@_backend_reset:
+ }
+ \cs_gset_eq:NN \@@_backend_select_gray:n \@@_backend_select_cmyk:n
+ \cs_gset_eq:NN \@@_backend_select_rgb:n \@@_backend_select_cmyk:n
+ \cs_gset_protected:Npn \@@_backend_reset:
+ { \__kernel_backend_literal:n { pdf: ec } }
+ }
+% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macrocode}
-%</dvisvgm|dvipdfmx|dvips|xdvipdfmx>
+%</dvipdfmx|xetex>
% \end{macrocode}
%
-% \subsection{\texttt{pdfmode}}
+% \subsection{Separations}
+%
+% Here, life gets interesting and we need essentially one approach per
+% backend.
%
% \begin{macrocode}
-%<*pdfmode>
+%<*dvips>
% \end{macrocode}
%
-% \begin{macro}{\@@_backend_pickup:N}
-% \begin{macro}{\@@_backend_pickup:w}
-% The current color in driver-dependent format: pick up the package-mode
-% data if available. We end up converting back and forward in this route as
-% we store our color data in \texttt{dvips} format.
-% The \tn{current@color} needs to be \texttt{x}-expanded before
-% \cs{@@_backend_pickup:w} breaks it apart, because for instance
-% \pkg{xcolor} sets it to be instructions to generate a color
+% \begin{macro}{\@@_backend_select_separation:nn, \@@_backend_select_devicen:nn}
% \begin{macrocode}
-%<*package>
-\cs_new_protected:Npn \@@_backend_pickup:N #1 { }
-\AtBeginDocument
+\cs_new_protected:Npn \@@_backend_select_separation:nn #1#2
+ { \@@_backend_select:n { separation ~ #1 ~ #2 } }
+\cs_new_eq:NN \@@_backend_select_devicen:nn \@@_backend_select_separation:nn
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \@@_backend_separation_init:nnnnn,
+% \@@_backend_separation_init:nxxnn,
+% \@@_backend_separation_init_aux:nnnnn
+% }
+% \begin{macro}[EXP]
+% {
+% \@@_backend_separation_init_/DeviceCMYK:nnn ,
+% \@@_backend_separation_init_/DeviceGray:nnn ,
+% \@@_backend_separation_init_/DeviceRGB:nnn
+% }
+% \begin{macro}[EXP]{\@@_backend_separation_init_Device:Nn}
+% \begin{macro}[EXP]{\@@_backend_separation_init:nnn}
+% \begin{macro}[EXP]{\@@_backend_separation_init_count:n}
+% \begin{macro}[EXP]{\@@_backend_separation_init_count:w}
+% \begin{macro}[EXP]{\@@_backend_separation_init:nnnn}
+% \begin{macro}[EXP]{\@@_backend_separation_init:w}
+% \begin{macro}[EXP]{\@@_backend_separation_init:n}
+% \begin{macro}[EXP]{\@@_backend_separation_init:nw}
+% \begin{macro}{\@@_backend_separation_init_CIELAB:nnn}
+% Initialising here means creating a small header set up plus massaging
+% some data. This comes about as we have to deal with PDF-focussed data,
+% which makes most sense \enquote{higher-up}. The approach is based on
+% ideas from \url{https://tex.stackexchange.com/q/560093} plus using
+% the PostScript manual for other aspects.
+% \begin{macrocode}
+\cs_new_protected:Npx \@@_backend_separation_init:nnnnn #1#2#3#4#5
+ {
+ \bool_if:NT \g__kernel_backend_header_bool
+ {
+ \cs_if_exist:NTF \AtBeginDvi
+ { \exp_not:N \AtBeginDvi }
+ { \use:n }
+ {
+ \exp_not:N \@@_backend_separation_init_aux:nnnnn
+ {#1} {#2} {#3} {#4} {#5}
+ }
+ }
+ }
+\cs_generate_variant:Nn \@@_backend_separation_init:nnnnn { nxx }
+\cs_new_protected:Npn \@@_backend_separation_init_aux:nnnnn #1#2#3#4#5
{
- \cs_if_exist:cT { ver@color.sty }
+ \__kernel_backend_literal:e
{
- \cs_set_protected:Npn \@@_backend_pickup:N #1
+ !
+ TeXDict ~ begin ~
+ /color \int_use:N \g_@@_model_int
{
- \exp_last_unbraced:Nx \@@_backend_pickup:w
- { \current@color } ~ 0 ~ 0 ~ 0 \q_stop #1
+ [ ~
+ /Separation ~ ( \str_convert_pdfname:n {#1} ) ~
+ [ ~ #2 ~ ] ~
+ {
+ \cs_if_exist_use:cF { @@_backend_separation_init_ #2 :nnn }
+ { \@@_backend_separation_init:nnn }
+ {#3} {#4} {#5}
+ }
+ ] ~ setcolorspace
+ } ~ def ~
+ end
+ }
+ }
+\cs_new:cpn { @@_backend_separation_init_ /DeviceCMYK :nnn } #1#2#3
+ { \@@_backend_separation_init_Device:Nn 4 {#3} }
+\cs_new:cpn { @@_backend_separation_init_ /DeviceGray :nnn } #1#2#3
+ { \@@_backend_separation_init_Device:Nn 1 {#3} }
+\cs_new:cpn { @@_backend_separation_init_ /DeviceRGB :nnn } #1#2#3
+ { \@@_backend_separation_init_Device:Nn 2 {#3} }
+\cs_new:Npn \@@_backend_separation_init_Device:Nn #1#2
+ {
+ #2 ~
+ \prg_replicate:nn {#1}
+ { #1 ~ index ~ mul ~ #1 ~ 1 ~ roll ~ }
+ \int_eval:n { #1 + 1 } ~ -1 ~ roll ~ pop
+ }
+% \end{macrocode}
+% For the generic case, we cannot use |/FunctionType 2| unfortunately, so
+% we have to code that idea up in PostScript. Here, we will therefore assume
+% that a range is \emph{always} given. First, we count values in each argument:
+% at the backend level, we can assume there are always well-behaved with
+% spaces present.
+% \begin{macrocode}
+\cs_new:Npn \@@_backend_separation_init:nnn #1#2#3
+ {
+ \exp_args:Ne \@@_backend_separation_init:nnnn
+ { \@@_backend_separation_init_count:n {#2} }
+ {#1} {#2} {#3}
+ }
+\cs_new:Npn \@@_backend_separation_init_count:n #1
+ { \int_eval:n { 0 \@@_backend_separation_init_count:w #1 ~ \s_@@_stop } }
+\cs_new:Npn \@@_backend_separation_init_count:w #1 ~ #2 \s_@@_stop
+ {
+ +1
+ \tl_if_blank:nF {#2}
+ { \@@_backend_separation_init_count:w #2 \s_@@_stop }
+ }
+% \end{macrocode}
+% Now we implement the algorithm. In the terms in the PostScript manual,
+% we have $\mathbf{N} = 1$ and $\mathbf{Domain} = [0~1]$, with
+% $\mathbf{Range}$ as |#2|, $\mathbf{C0}$ as |#3| and $\mathbf{C1}$
+% as |#4|, with the number of output components in |#1|. So all we have
+% to do is implement $y_{i} = \mathbf{C0}_{i} + x(\mathbf{C1}_{i} -
+% \mathbf{C0}_{i})$ with lots of stack manipulation, then check the
+% ranges. That's done by adding everything to the stack first, then using
+% the fact we know all of the offsets. As manipulating the stack is tricky,
+% we start by re-formatting the $\mathbf{C0}$ and $\mathbf{C1}$ arrays to
+% be interleaved, and add a \texttt{0} to each pair: this is used
+% to keep the stack of constant length while we are doing the first pass of
+% mathematics. We then working through that list, calculating from the
+% last to the first value before tidying up by removing all of the input
+% values. We do that by first copying all of the final $y$ values to the
+% end of the stack, then rolling everything so we can pop the now-unneeded
+% material.
+% \begin{macrocode}
+\cs_new:Npn \@@_backend_separation_init:nnnn #1#2#3#4
+ {
+ \@@_backend_separation_init:w #3 ~ \s_@@_stop #4 ~ \s_@@_stop
+ \prg_replicate:nn {#1}
+ {
+ pop ~ 1 ~ index ~ neg ~ 1 ~ index ~ add ~
+ \int_eval:n { 3 * #1 } ~ index ~ mul ~
+ 2 ~ index ~ add ~
+ \int_eval:n { 3 * #1 } ~ #1 ~ roll ~
+ }
+ \int_step_function:nnnN {#1} { -1 } { 1 }
+ \@@_backend_separation_init:n
+ \int_eval:n { 4 * #1 + 1 } ~ #1 ~ roll ~
+ \prg_replicate:nn { 3 * #1 + 1 } { pop ~ }
+ \tl_if_blank:nF {#2}
+ { \@@_backend_separation_init:nw {#1} #2 ~ \s_@@_stop }
+ }
+\cs_new:Npn \@@_backend_separation_init:w
+ #1 ~ #2 \s_@@_stop #3 ~ #4 \s_@@_stop
+ {
+ #1 ~ #3 ~ 0 ~
+ \tl_if_blank:nF {#2}
+ { \@@_backend_separation_init:w #2 \s_@@_stop #4 \s_@@_stop }
+ }
+\cs_new:Npn \@@_backend_separation_init:n #1
+ { \int_eval:n { #1 * 2 } ~ index ~ }
+% \end{macrocode}
+% Finally, we deal with the range limit if required. This is handled
+% by splitting the range into pairs. It's then just a question of doing
+% the comparisons, this time dropping everything except the desired
+% result.
+% \begin{macrocode}
+\cs_new:Npn \@@_backend_separation_init:nw #1#2 ~ #3 ~ #4 \s_@@_stop
+ {
+ #2 ~ #3 ~
+ 2 ~ index ~ 2 ~ index ~ lt ~
+ { ~ pop ~ exch ~ pop ~ } ~
+ { ~
+ 2 ~ index ~ 1 ~ index ~ gt ~
+ { ~ exch ~ pop ~ exch ~ pop ~ } ~
+ { ~ pop ~ pop ~ } ~
+ ifelse ~
+ }
+ ifelse ~
+ #1 ~ 1 ~ roll ~
+ \tl_if_blank:nF {#4}
+ { \@@_backend_separation_init:nw {#1} #4 \s_@@_stop }
+ }
+% \end{macrocode}
+% CIELAB support uses the detail from the PostScript reference, page 227;
+% other than that block of PostScript, this is the same as for PDF-based
+% routes.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_separation_init_CIELAB:nnn #1#2#3
+ {
+ \@@_backend_separation_init:nxxnn
+ {#2}
+ {
+ /CIEBasedABC ~
+ << ~
+ /RangeABC ~ [ ~ \c_@@_model_range_CIELAB_tl \c_space_tl ] ~
+ /DecodeABC ~
+ [ ~
+ { ~ 16 ~ add ~ 116 ~ div ~ } ~ bind ~
+ { ~ 500 ~ div ~ } ~ bind ~
+ { ~ 200 ~ div ~ } ~ bind ~
+ ] ~
+ /MatrixABC ~ [ ~ 1 ~ 1 ~ 1 ~ 1 ~ 0 ~ 0 ~ 0 ~ 0 ~ -1 ~ ] ~
+ /DecodeLMN ~
+ [ ~
+ { ~
+ dup ~ 6 ~ 29 ~ div ~ ge ~
+ { ~ dup ~ dup ~ mul ~ mul ~ ~ } ~
+ { ~ 4 ~ 29 ~ div ~ sub ~ 108 ~ 841 ~ div ~ mul ~ } ~
+ ifelse ~
+ 0.9505 ~ mul ~
+ } ~ bind ~
+ { ~
+ dup ~ 6 ~ 29 ~ div ~ ge ~
+ { ~ dup ~ dup ~ mul ~ mul ~ } ~
+ { ~ 4 ~ 29 ~ div ~ sub ~ 108 ~ 841 ~ div ~ mul ~ } ~
+ ifelse ~
+ } ~ bind ~
+ { ~
+ dup ~ 6 ~ 29 ~ div ~ ge ~
+ { ~ dup ~ dup ~ mul ~ mul ~ } ~
+ { ~ 4 ~ 29 ~ div ~ sub ~ 108 ~ 841 ~ div ~ mul ~ } ~
+ ifelse ~
+ 1.0890 ~ mul ~
+ } ~ bind
+ ] ~
+ /WhitePoint ~
+ [ ~ \tl_use:c { c_@@_model_whitepoint_CIELAB_ #1 _tl } ~ ] ~
+ >>
+ }
+ { \c_@@_model_range_CIELAB_tl }
+ { 100 ~ 0 ~ 0 }
+ {#3}
+ }
+% \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}{\@@_backend_devicen_init:nnn}
+% Trivial as almost all of the work occurs in the shared code.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_devicen_init:nnn #1#2#3
+ {
+ \__kernel_backend_literal:e
+ {
+ !
+ TeXDict ~ begin ~
+ /color \int_use:N \g_@@_model_int
+ {
+ [ ~
+ /DeviceN ~
+ [ ~ #1 ~ ] ~
+ #2 ~
+ { ~ #3 ~ } ~
+ ] ~ setcolorspace
+ } ~ def ~
+ end
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</dvips>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*dvisvgm>
+% \end{macrocode}
+%
+% \begin{macro}{\@@_backend_select_separation:nn, \@@_backend_select_devicen:nn}
+% No support at present.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_select_separation:nn #1#2 { }
+\cs_new_protected:Npn \@@_backend_select_devicen:nn #1#2 { }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {\@@_backend_separation_init:nnnnn, \@@_backend_separation_init_CIELAB:nnn}
+% No support at present.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_separation_init:nnnnn #1#2#3#4#5 { }
+\cs_new_protected:Npn \@@_backend_separation_init_CIELAB:nnnnnn #1#2#3 { }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</dvisvgm>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*dvipdfmx|luatex|pdftex|xetex>
+% \end{macrocode}
+%
+% \begin{macro}{\@@_backend_select_separation:nn, \@@_backend_select_devicen:nn}
+% \begin{macro}{\@@_backend_select:n}
+% Although \texttt{(x)dvipdfmx} has a built-in approach to color spaces, that
+% can't be used with the generic color stacks. So we take an approach in which
+% we share the same code as for \pdfTeX{}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_select_separation:nn #1#2
+ { \@@_backend_select:nn { /#1 ~ cs ~ #2 ~ scn } { /#1 ~ CS ~ #2 ~ SCN } }
+\cs_new_eq:NN \@@_backend_select_devicen:nn \@@_backend_select_separation:nn
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_backend_separation_init:nnnnn}
+% \begin{macro}{\@@_backend_separation_init:n}
+% \begin{macro}{\@@_backend_separation_init_CIELAB:nnn}
+% Initialising the PDF structures needs two parts: creating an object
+% containing the \enquote{real} name of the Separation, then adding a reference
+% to that to each page. We use a separate object for the tint transformation
+% following the model in the PDF reference.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_separation_init:nnnnn #1#2#3#4#5
+ {
+ \pdf_object_unnamed_write:nx { dict }
+ {
+ /FunctionType ~ 2
+ /Domain ~ [0 ~ 1]
+ \tl_if_blank:nF {#3} { /Range ~ [#3] }
+ /C0 ~ [#4] ~
+ /C1 ~ [#5] /N ~ 1
+ }
+ \@@_backend_separation_init:n
+ {
+ /Separation ~
+ / \str_convert_pdfname:n {#1} ~ #2 ~
+ \pdf_object_ref_last:
+ }
+ \cs_if_exist:NT \pdfmanagement_add:nnn
+ {
+ \use:x
+ {
+ \pdfmanagement_add:nnn
+ { Page / Resources / ColorSpace }
+ { color \int_use:N \g_@@_model_int }
+ { \pdf_object_ref_last: }
}
- \cs_new_protected:Npn \@@_backend_pickup:w
- #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 \q_stop #7
+ }
+ }
+\cs_new_protected:Npn \@@_backend_separation_init:n #1
+ {
+ \pdf_object_unnamed_write:nx { array } {#1}
+ }
+% \end{macrocode}
+% For CIELAB colors, we need one object per document for the illuminant,
+% plus initialisation of the color space referencing that object.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_separation_init_CIELAB:nnn #1#2#3
+ {
+ \pdf_object_if_exist:nF { @@_illuminant_CIELAB_ #1 }
+ {
+ \pdf_object_new:nn { @@_illuminant_CIELAB_ #1 } { array }
+ \pdf_object_write:nx { @@_illuminant_CIELAB_ #1 }
{
- \str_if_eq:nnTF {#2} { g }
- { \tl_set:Nn #7 { gray ~ #1 } }
- {
- \str_if_eq:nnTF {#4} { rg }
- { \tl_set:Nn #7 { rgb ~ #1 ~ #2 ~ #3 } }
- {
- \str_if_eq:nnTF {#5} { k }
- { \tl_set:Nn #7 { cmyk ~ #1 ~ #2 ~ #3 ~ #4 } }
- {
- \str_if_eq:nnTF {#2} { cs }
- {
- \tl_set:Nx #7 { spot ~ \use_none:n #1 ~ #5 }
- }
- {
- \tl_set:Nn #7 { gray ~ 0 }
- }
- }
- }
- }
+ /Lab ~
+ <<
+ /WhitePoint ~
+ [ \tl_use:c { c_@@_model_whitepoint_CIELAB_ #1 _tl } ]
+ /Range ~ [ \c_@@_model_range_CIELAB_tl ]
+ >>
}
}
+ \@@_backend_separation_init:nnnnn
+ {#2}
+ { \pdf_object_ref:n { @@_illuminant_CIELAB_ #1 } }
+ { \c_@@_model_range_CIELAB_tl }
+ { 100 ~ 0 ~ 0 }
+ {#3}
+ }
+\cs_if_exist:NF \pdf_object_unnamed_write:nn
+ {
+ \cs_gset_protected:Npn \@@_backend_separation_init_CIELAB:nnn #1#2#3
+ { }
}
-%</package>
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
%
-% \begin{variable}{\l__kernel_color_stack_int}
-% \pdfTeX{} and \LuaTeX{} have multiple stacks available, and to track
-% which one is in use a variable is required.
+% \begin{macro}{\@@_backend_devicen_init:nnn}
+% \begin{macro}[EXP]{\@@_backend_devicen_init:w}
+% \begin{macro}{\@@_backend_devicen_init:n}
+% Similar to the Separations case, but with an arbitrary function for
+% the alternative space work.
% \begin{macrocode}
-\int_new:N \l__kernel_color_stack_int
+\cs_new_protected:Npn \@@_backend_devicen_init:nnn #1#2#3
+ {
+ \pdf_object_unnamed_write:nx { stream }
+ {
+ {
+ /FunctionType ~ 4 ~
+ /Domain ~
+ [ ~
+ \prg_replicate:nn
+ { 0 \@@_backend_devicen_init:w #1 ~ \s_@@_stop }
+ { 0 ~ 1 ~ } ~
+ ] ~
+ /Range ~
+ [ ~
+ \str_case:nn {#2}
+ {
+ { /DeviceCMYK } { 0 ~ 1 ~ 0 ~ 1 ~ 0 ~ 1 ~ 0 ~ 1 }
+ { /DeviceGray } { 0 ~ 1 }
+ { /DeviceRGB } { 0 ~ 1 ~ 0 ~ 1 ~ 0 ~ 1 }
+ } ~
+ ]
+ }
+ {#3}
+ }
+ \@@_backend_separation_init:n
+ {
+ /DeviceN ~
+ [ ~ #1 ~ ] ~
+ #2 ~
+ \pdf_object_ref_last:
+ }
+ \cs_if_exist:NT \pdfmanagement_add:nnn
+ {
+ \use:x
+ {
+ \pdfmanagement_add:nnn
+ { Page / Resources / ColorSpace }
+ { color \int_use:N \g_@@_model_int }
+ { \pdf_object_ref_last: }
+ }
+ }
+ }
+\cs_new:Npn \@@_backend_devicen_init:w #1 ~ #2 \s_@@_stop
+ {
+ + 1
+ \tl_if_blank:nF {#2}
+ { \@@_backend_devicen_init:w #2 \s_@@_stop }
+ }
+\cs_new_eq:NN \@@_backend_devicen_init:n \@@_backend_separation_init:n
% \end{macrocode}
-% \end{variable}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
-% \begin{macro}{\@@_backend_cmyk:nnnn, \@@_backend_cmyk_aux:nnnn}
-% \begin{macro}{\@@_backend_gray:n, \@@_backend_gray_aux:n}
-% \begin{macro}{\@@_backend_rgb:nnn, \@@_backend_rgb_aux:nnn}
-% \begin{macro}{\@@_backend_spot:nn}
-% \begin{macro}{\@@_backend_select:n, \@@_backend_select:x}
+% \begin{macrocode}
+%</dvipdfmx|luatex|pdftex|xetex>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*dvipdfmx|xetex>
+% \end{macrocode}
+%
+% \begin{macro}{\@@_backend_select_separation:nn, \@@_backend_select_devicen:nn}
+% For older \texttt{(x)dvipdfmx}, we \emph{could} support separations using a
+% dedicated mechanism, but it was not added that long before the color
+% stacks. So instead of having two complex paths, just disable here.
+% \begin{macrocode}
+\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
+ {
+ \cs_gset_protected:Npn \@@_backend_select_separation:nn #1#2 { }
+ \cs_gset_eq:NN \@@_backend_select_devicen:nn
+ \@@_backend_select_separation:nn
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</dvipdfmx|xetex>
+% \end{macrocode}
+%
+% \subsection{Fill and stroke color}
+%
+% Here, \texttt{dvipdfmx}/\XeTeX{} follows \LuaTeX{} and \pdfTeX{},
+% while for \texttt{dvips}
+% we have to manage fill and stroke color ourselves. We also handle
+% \texttt{dvisvgm} independently, as there we can create SVG directly.
+%
+% \begin{macrocode}
+%<*dvipdfmx|luatex|pdftex|xetex>
+% \end{macrocode}
+%
+% \begin{macro}
+% {
+% \@@_backend_fill_cmyk:n ,
+% \@@_backend_fill_gray:n ,
+% \@@_backend_fill_rgb:n ,
+% \@@_backend_fill:n ,
+% \@@_backend_stroke_cmyk:n ,
+% \@@_backend_stroke_gray:n ,
+% \@@_backend_stroke_rgb:n ,
+% \@@_backend_stroke:n
+% }
+% Drawing (fill/stroke) color is handled in \texttt{dvipdfmx}/\XeTeX{} in the
+% same way as \LuaTeX{}/\pdfTeX{}. We use the same approach as earlier, except the
+% color stack is not involved so the generic direct PDF operation is used.
+% There is no worry about the nature of strokes: everything is handled
+% automatically.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_fill_cmyk:n #1
+ { \@@_backend_fill:n { #1 ~ k } }
+\cs_new_protected:Npn \@@_backend_fill_gray:n #1
+ { \@@_backend_fill:n { #1 ~ g } }
+\cs_new_protected:Npn \@@_backend_fill_rgb:n #1
+ { \@@_backend_fill:n { #1 ~ rg } }
+\cs_new_protected:Npn \@@_backend_fill:n #1
+ {
+ \tl_set:Nn \l_@@_backend_fill_tl {#1}
+ \__kernel_color_backend_stack_push:nn \l_@@_backend_stack_int
+ { #1 ~ \l_@@_backend_stroke_tl }
+ \group_insert_after:N \@@_backend_reset:
+ }
+\cs_new_protected:Npn \@@_backend_stroke_cmyk:n #1
+ { \@@_backend_stroke:n { #1 ~ K } }
+\cs_new_protected:Npn \@@_backend_stroke_gray:n #1
+ { \@@_backend_stroke:n { #1 ~ G } }
+\cs_new_protected:Npn \@@_backend_stroke_rgb:n #1
+ { \@@_backend_stroke:n { #1 ~ RG } }
+\cs_new_protected:Npn \@@_backend_stroke:n #1
+ {
+ \tl_set:Nn \l_@@_backend_stroke_tl {#1}
+ \__kernel_color_backend_stack_push:nn \l_@@_backend_stack_int
+ { \l_@@_backend_fill_tl \c_space_tl #1 }
+ \group_insert_after:N \@@_backend_reset:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \@@_backend_fill_separation:nn,
+% \@@_backend_stroke_separation:nn,
+% \@@_backend_fill_devicen:nn,
+% \@@_backend_stroke_devicen:nn
+% }
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_fill_separation:nn #1#2
+ { \@@_backend_fill:n { /#1 ~ cs ~ #2 ~ scn } }
+\cs_new_protected:Npn \@@_backend_stroke_separation:nn #1#2
+ { \@@_backend_stroke:n { /#1 ~ CS ~ #2 ~ SCN } }
+\cs_new_eq:NN \@@_backend_fill_devicen:nn \@@_backend_fill_separation:nn
+\cs_new_eq:NN \@@_backend_stroke_devicen:nn \@@_backend_stroke_separation:nn
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</dvipdfmx|luatex|pdftex|xetex>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*dvipdfmx|xetex>
+% \end{macrocode}
+%
+% \begin{macro}
+% {
+% \@@_backend_fill_cmyk:n ,
+% \@@_backend_fill_gray:n ,
+% \@@_backend_fill_rgb:n
+% }
% \begin{macro}{\@@_backend_reset:}
-% Simply dump the data, but allowing for \LuaTeX{}.
+% \begin{macro}{\@@_backend_stroke:n}
+% \begin{macro}{\@@_backend_fill_separation:nn, \@@_backend_stroke_separation:nn}
+% Deal with older \texttt{(x)dvipdfmx}.
+% \begin{macrocode}
+\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
+ {
+ \cs_gset_protected:Npn \@@_backend_fill_cmyk:n #1
+ {
+ \__kernel_backend_literal:n { pdf: bc ~ [#1] }
+ \group_insert_after:N \@@_backend_reset:
+ }
+ \cs_gset_eq:NN \@@_backend_fill_gray:n \@@_backend_fill_cmyk:n
+ \cs_gset_eq:NN \@@_backend_fill_rgb:n \@@_backend_fill_cmyk:n
+ \cs_gset_protected:Npn \@@_backend_reset:
+ { \__kernel_backend_literal:n { pdf: ec } }
+ \cs_gset_protected:Npn \@@_backend_stroke:n #1
+ { \__kernel_backend_literal:n {#1} }
+ \cs_gset_protected:Npn \@@_backend_fill_separation:nn #1#2 { }
+ \cs_gset_eq:NN \@@_backend_fill_devicen:nn
+ \@@_backend_fill_separation:nn
+ \cs_gset_eq:NN \@@_backend_stroke_separation:nn
+ \@@_backend_fill_separation:nn
+ \cs_gset_eq:NN \@@_backend_stroke_devicen:nn
+ \@@_backend_stroke_separation:nn
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</dvipdfmx|xetex>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*dvips>
+% \end{macrocode}
+%
+% \begin{macro}
+% {
+% \@@_backend_fill_cmyk:n ,
+% \@@_backend_fill_gray:n ,
+% \@@_backend_fill_rgb:n ,
+% \@@_backend_fill:n ,
+% \@@_backend_stroke_cmyk:n ,
+% \@@_backend_stroke_gray:n ,
+% \@@_backend_stroke_rgb:n
+% }
+% Fill color here is the same as general color \emph{except} we skip the
+% stroke part.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_fill_cmyk:n #1
+ { \@@_backend_fill:n { cmyk ~ #1 } }
+\cs_new_protected:Npn \@@_backend_fill_gray:n #1
+ { \@@_backend_fill:n { gray ~ #1 } }
+\cs_new_protected:Npn \@@_backend_fill_rgb:n #1
+ { \@@_backend_fill:n { rgb ~ #1 } }
+\cs_new_protected:Npn \@@_backend_fill:n #1
+ {
+ \__kernel_backend_literal:n { color~push~ #1 }
+ \group_insert_after:N \@@_backend_reset:
+ }
+\cs_new_protected:Npn \@@_backend_stroke_cmyk:n #1
+ { \__kernel_backend_postscript:n { /color.sc { #1 ~ setcmykcolor } def } }
+\cs_new_protected:Npn \@@_backend_stroke_gray:n #1
+ { \__kernel_backend_postscript:n { /color.sc { #1 ~ setgray } def } }
+\cs_new_protected:Npn \@@_backend_stroke_rgb:n #1
+ { \__kernel_backend_postscript:n { /color.sc { #1 ~ setrgbcolor } def } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \@@_backend_fill_separation:nn,
+% \@@_backend_stroke_separation:nn,
+% \@@_backend_fill_devicen:nn,
+% \@@_backend_stroke_devicen:nn
+% }
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_fill_separation:nn #1#2
+ { \@@_backend_fill:n { separation ~ #1 ~ #2 } }
+\cs_new_protected:Npn \@@_backend_stroke_separation:nn #1#2
+ { \__kernel_backend_postscript:n { /color.sc { separation ~ #1 ~ #2 } def } }
+\cs_new_eq:NN \@@_backend_fill_devicen:nn \@@_backend_fill_separation:nn
+\cs_new_eq:NN \@@_backend_stroke_devicen:nn \@@_backend_stroke_separation:nn
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</dvips>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*dvisvgm>
+% \end{macrocode}
+%
+% \begin{macro}
+% {
+% \@@_backend_fill_cmyk:n ,
+% \@@_backend_fill_gray:n ,
+% \@@_backend_fill_rgb:n ,
+% \@@_backend_fill:n
+% }
+% Fill color here is the same as general color \emph{except} we skip the
+% stroke part.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_backend_cmyk:nnnn #1#2#3#4
+\cs_new_protected:Npn \@@_backend_fill_cmyk:n #1
+ { \@@_backend_fill:n { cmyk ~ #1 } }
+\cs_new_protected:Npn \@@_backend_fill_gray:n #1
+ { \@@_backend_fill:n { gray ~ #1 } }
+\cs_new_protected:Npn \@@_backend_fill_rgb:n #1
+ { \@@_backend_fill:n { rgb ~ #1 } }
+\cs_new_protected:Npn \@@_backend_fill:n #1
{
- \use:x
- {
- \@@_backend_cmyk_aux:nnnn
- { \fp_eval:n {#1} }
- { \fp_eval:n {#2} }
- { \fp_eval:n {#3} }
- { \fp_eval:n {#4} }
- }
+ \__kernel_backend_literal:n { color~push~ #1 }
+ \group_insert_after:N \@@_backend_reset:
}
-\cs_new_protected:Npn \@@_backend_cmyk_aux:nnnn #1#2#3#4
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_backend_stroke_cmyk:n}
+% \begin{macro}{\@@_backend_stroke_cmyk:w}
+% \begin{macro}{\@@_backend_stroke_gray:n, \@@_backend_stroke_gray_aux:n}
+% \begin{macro}{\@@_backend_stroke_rgb:n}
+% \begin{macro}{\@@_backend_stroke_rgb:w}
+% \begin{macro}{\@@_backend:nnn}
+% For drawings in SVG, we use scopes for all stroke colors. That
+% requires using \texttt{RGB} values, which luckily are easy to
+% convert here (|cmyk| to |RGB| is a fixed function).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_stroke_cmyk:n #1
+ { \@@_backend_cmyk:w #1 \s_@@_stop }
+\cs_new_protected:Npn \@@_backend_stroke_cmyk:w
+ #1 ~ #2 ~ #3 ~ #4 \s_@@_stop
{
- \@@_backend_select:n
- { #1 ~ #2 ~ #3 ~ #4 ~ k ~ #1 ~ #2 ~ #3 ~ #4 ~ K }
+ \use:x
+ {
+ \@@_backend:nnn
+ { \fp_eval:n { -100 * ( 1 - min ( 1 , #1 + #4 ) ) } }
+ { \fp_eval:n { -100 * ( 1 - min ( 1 , #2 + #4 ) ) } }
+ { \fp_eval:n { -100 * ( 1 - min ( 1 , #3 + #4 ) ) } }
+ }
}
-\cs_new_protected:Npn \@@_backend_gray:n #1
- { \exp_args:Nx \@@_backend_gray_aux:n { \fp_eval:n {#1} } }
-\cs_new_protected:Npn \@@_backend_gray_aux:n #1
- { \@@_backend_select:n { #1 ~ g ~ #1 ~ G } }
-\cs_new_protected:Npn \@@_backend_rgb:nnn #1#2#3
+\cs_new_protected:Npn \@@_backend_stroke_gray:n #1
{
- \use:x
- {
- \@@_backend_rgb_aux:nnn
- { \fp_eval:n {#1} }
- { \fp_eval:n {#2} }
- { \fp_eval:n {#3} }
- }
+ \use:x
+ {
+ \@@_backend_stroke_gray_aux:n
+ { \fp_eval:n { 100 * (#1) } }
+ }
}
-\cs_new_protected:Npn \@@_backend_rgb_aux:nnn #1#2#3
- { \@@_backend_select:n { #1 ~ #2 ~ #3 ~ rg ~ #1 ~ #2 ~ #3 ~ RG } }
-\cs_new_protected:Npn \@@_backend_spot:nn #1#2
- { \@@_backend_select:n { /#1 ~ cs ~ /#1 ~ CS ~ #2 ~ sc ~ #2 ~ SC } }
-\cs_new_protected:Npx \@@_backend_select:n #1
+\cs_new_protected:Npn \@@_backend_stroke_gray_aux:n #1
+ { \@@_backend:nnn {#1} {#1} {#1} }
+\cs_new_protected:Npn \@@_backend_stroke_rgb:n #1
+ { \@@_backend_rgb:w #1 \s_@@_stop }
+\cs_new_protected:Npn \@@_backend_stroke_rgb:w
+ #1 ~ #2 ~ #3 \s_@@_stop
{
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D colorstack }
- { \tex_pdfcolorstack:D }
- \exp_not:N \l__kernel_color_stack_int push {#1}
- \group_insert_after:N \exp_not:N \@@_backend_reset:
+ \use:x
+ {
+ \@@_backend:nnn
+ { \fp_eval:n { 100 * (#1) } }
+ { \fp_eval:n { 100 * (#2) } }
+ { \fp_eval:n { 100 * (#3) } }
+ }
}
-\cs_generate_variant:Nn \@@_backend_select:n { x }
-\cs_new_protected:Npx \@@_backend_reset:
+\cs_new_protected:Npx \@@_backend:nnn #1#2#3
{
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D colorstack }
- { \tex_pdfcolorstack:D }
- \exp_not:N \l__kernel_color_stack_int pop \scan_stop:
+ \__kernel_backend_scope:n
+ {
+ stroke =
+ "
+ rgb
+ (
+ #1 \c_percent_str ,
+ #2 \c_percent_str ,
+ #3 \c_percent_str
+ )
+ "
+ }
}
% \end{macrocode}
% \end{macro}
@@ -292,12 +1220,28 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}
+% {
+% \@@_backend_fill_separation:nn,
+% \@@_backend_stroke_separation:nn,
+% \@@_backend_fill_devicen:nn,
+% \@@_backend_stroke_devicen:nn
+% }
+% At present, these are no-ops.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_fill_separation:nn #1#2 { }
+\cs_new_protected:Npn \@@_backend_stroke_separation:nn #1#2 { }
+\cs_new_eq:NN \@@_backend_fill_devicen:nn \@@_backend_fill_separation:nn
+\cs_new_eq:NN \@@_backend_stroke_devicen:nn \@@_backend_stroke_separation:nn
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
-%</pdfmode>
+%</dvisvgm>
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx
index 88114fec28c..5536391276a 100644
--- a/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx
+++ b/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx
@@ -2,7 +2,7 @@
%
%% File: l3backend-draw.dtx
%
-% Copyright (C) 2019,2020 The LaTeX3 Project
+% Copyright (C) 2019-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -56,7 +56,7 @@
% \section{\pkg{l3backend-draw} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
%<@@=draw>
% \end{macrocode}
%
@@ -76,13 +76,12 @@
% \end{macro}
%
% \begin{macro}{\@@_backend_begin:, \@@_backend_end:}
-% \begin{macro}{color.fc}
% The |ps::[begin]| special here deals with positioning but allows us to
% continue on to a matching |ps::[end]|: contrast with |ps:|, which positions
% but where we can't split material between separate calls. The
% |@beginspecial|/|@endspecial| pair are from |special.pro| and correct the
-% scale and $y$-axis direction. The definition of |/color.fc| deals with fill
-% color in paths. In contrast to \pkg{pgf}, we don't save the current point:
+% scale and $y$-axis direction.
+% In contrast to \pkg{pgf}, we don't save the current point:
% discussion with Tom Rokici suggested a better way to handle the necessary
% translations (see \cs{@@_backend_box_use:Nnnnn}). (Note that
% |@beginspecial|/|@endspecial| forms a backend scope.) The |[begin]|/^^A
@@ -94,7 +93,6 @@
{
\__kernel_backend_literal:n { ps::[begin] }
\@@_backend_literal:n { @beginspecial }
- \@@_backend_literal:n { SDict ~ begin ~ /color.fc ~ { } ~ def ~ end }
}
\cs_new_protected:Npn \@@_backend_end:
{
@@ -103,7 +101,6 @@
}
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \begin{macro}{\@@_backend_scope_begin:, \@@_backend_scope_end:}
% Scope here may need to contain saved definitions, so the entire memory
@@ -202,7 +199,10 @@
{ \@@_backend_literal:n { closepath } }
\cs_new_protected:Npn \@@_backend_stroke:
{
+ \@@_backend_literal:n { gsave }
+ \@@_backend_literal:n { color.sc }
\@@_backend_literal:n { stroke }
+ \@@_backend_literal:n { grestore }
\bool_if:NT \g_@@_draw_clip_bool
{
\@@_backend_literal:x
@@ -221,14 +221,11 @@
}
\cs_new_protected:Npn \@@_backend_fill:
{
- \@@_backend_literal:n { gsave }
- \@@_backend_literal:n { color.fc }
\@@_backend_literal:x
{
\bool_if:NT \g_@@_draw_eor_bool { eo }
fill
}
- \@@_backend_literal:n { grestore }
\bool_if:NT \g_@@_draw_clip_bool
{
\@@_backend_literal:x
@@ -242,15 +239,15 @@
}
\cs_new_protected:Npn \@@_backend_fillstroke:
{
- \@@_backend_literal:n { gsave }
- \@@_backend_literal:n { color.fc }
\@@_backend_literal:x
{
\bool_if:NT \g_@@_draw_eor_bool { eo }
fill
}
- \@@_backend_literal:n { grestore }
+ \@@_backend_literal:n { gsave }
+ \@@_backend_literal:n { color.sc }
\@@_backend_literal:n { stroke }
+ \@@_backend_literal:n { grestore }
\bool_if:NT \g_@@_draw_clip_bool
{
\@@_backend_literal:x
@@ -313,7 +310,7 @@
{ \dim_to_decimal_in_bp:n {#1} ~ setlinewidth }
}
\cs_new_protected:Npn \@@_backend_miterlimit:n #1
- { \@@_backend_literal:x { \fp_eval:n {#1} ~ setmiterlimit } }
+ { \@@_backend_literal:n { #1 ~ setmiterlimit } }
\cs_new_protected:Npn \@@_backend_cap_butt:
{ \@@_backend_literal:n { 0 ~ setlinecap } }
\cs_new_protected:Npn \@@_backend_cap_round:
@@ -333,99 +330,18 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}
-% {
-% \@@_backend_color_fill_cmyk:nnnn ,
-% \@@_backend_color_stroke_cmyk:nnnn
-% }
-% \begin{macro}
-% {
-% \@@_backend_color_fill_gray:n ,
-% \@@_backend_color_stroke_gray:n
-% }
-% \begin{macro}
-% {
-% \@@_backend_color_fill_rgb:nnn ,
-% \@@_backend_color_stroke_rgb:nnn
-% }
-% \begin{macro}
-% {
-% \@@_backend_color_fill:n, \@@_backend_color_fill:x,
-% \@@_backend_color_stroke:n, \@@_backend_color_stroke:x
-% }
-% For \texttt{dvips}, we can use the standard color stack to deal with
-% stroke color, but for fills have to switch to raw PostScript. This is
-% thus not handled by the stack, but the context is very restricted. See
-% also how fills are implemented.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_backend_color_fill_cmyk:nnnn #1#2#3#4
- {
- \@@_backend_color_fill:x
- {
- \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
- \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
- setcmykcolor
- }
- }
-\cs_new_protected:Npn \@@_backend_color_stroke_cmyk:nnnn #1#2#3#4
- {
- \@@_backend_color_stroke:x
- {
- cmyk ~
- \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
- \fp_eval:n {#3} ~ \fp_eval:n {#4}
- }
- }
-\cs_new_protected:Npn \@@_backend_color_fill_gray:n #1
- { \@@_backend_color_fill:x { \fp_eval:n {#1} ~ setgray } }
-\cs_new_protected:Npn \@@_backend_color_stroke_gray:n #1
- { \@@_backend_color_stroke:x { gray ~ \fp_eval:n {#1} } }
-\cs_new_protected:Npn \@@_backend_color_fill_rgb:nnn #1#2#3
- {
- \@@_backend_color_fill:x
- { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ setrgbcolor }
- }
-\cs_new_protected:Npn \@@_backend_color_stroke_rgb:nnn #1#2#3
- {
- \@@_backend_color_stroke:x
- { rgb ~ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} }
- }
-\cs_new_protected:Npn \@@_backend_color_fill:n #1
- {
- \__kernel_backend_postscript:n
- { /color.fc ~ { #1 } ~ def }
- }
-\cs_generate_variant:Nn \@@_backend_color_fill:n { x }
-\cs_new_protected:Npn \@@_backend_color_stroke:n #1
- {
- \__kernel_backend_literal:n { color~push~#1 }
- \group_insert_after:N \@@_color_reset:
- }
-\cs_generate_variant:Nn \@@_backend_color_stroke:n { x }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
%
% \begin{macro}{\@@_backend_cm:nnnn}
% In \texttt{dvips}, keeping the transformations in line with the engine
% is unfortunately not possible for scaling and rotations: even if we
% decompose the matrix into those operations, there is still no backend
-% tracking (\emph{cf.}~\texttt{(x)dvipdfmx}). Thus we take the shortest
+% tracking (\emph{cf.}~\texttt{dvipdfmx}/\XeTeX{}). Thus we take the shortest
% path available and simply dump the matrix as given.
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_cm:nnnn #1#2#3#4
{
\@@_backend_literal:n
- {
- [
- \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
- \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
- 0 ~ 0
- ] ~
- concat
- }
+ { [ #1 ~ #2 ~ #3 ~ #4 ~ 0 ~ 0 ] ~ concat }
}
% \end{macrocode}
% \end{macro}
@@ -473,13 +389,13 @@
%</dvips>
% \end{macrocode}
%
-% \subsection{\texttt{pdfmode} and \texttt{(x)dvipdfmx}}
+% \subsection{\LuaTeX{}, \pdfTeX{}, \texttt{dvipdfmx} and \XeTeX{}}
%
-% Both \texttt{pdfmode} and \texttt{(x)dvipdfmx} directly produce PDF output
+% \LuaTeX{}, \pdfTeX{}, \texttt{dvipdfmx} and \XeTeX{} directly produce PDF output
% and understand a shared set of specials for drawing commands.
%
% \begin{macrocode}
-%<*dvipdfmx|pdfmode|xdvipdfmx>
+%<*dvipdfmx|luatex|pdftex|xetex>
% \end{macrocode}
%
% \subsubsection{Drawing}
@@ -633,7 +549,7 @@
{ \dim_to_decimal_in_bp:n {#1} ~ w }
}
\cs_new_protected:Npn \@@_backend_miterlimit:n #1
- { \@@_backend_literal:x { \fp_eval:n {#1} ~ M } }
+ { \@@_backend_literal:x { #1 ~ M } }
\cs_new_protected:Npn \@@_backend_cap_butt:
{ \@@_backend_literal:n { 0 ~ J } }
\cs_new_protected:Npn \@@_backend_cap_round:
@@ -653,111 +569,29 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}
-% {
-% \@@_backend_color_fill_cmyk:nnnn ,
-% \@@_backend_color_stroke_cmyk:nnnn
-% }
-% \begin{macro}
-% {
-% \@@_backend_color_fill_gray:n ,
-% \@@_backend_color_stroke_gray:n
-% }
-% \begin{macro}
-% {
-% \@@_backend_color_fill_rgb:nnn ,
-% \@@_backend_color_stroke_rgb:nnn
-% }
-% \begin{macro}{\@@_backend_color_select:n, \@@_backend_color_select:x}
-% \begin{macro}{\@@_backend_color_reset:}
-% Color has to be split between \texttt{(x)dvipdfmx} and the PDF engines
-% as there is no color stack for fill/stroke separation in the former.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_backend_color_fill_cmyk:nnnn #1#2#3#4
- {
- \@@_backend_color_select:x
- {
- \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
- \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
- k
- }
- }
-\cs_new_protected:Npn \@@_backend_color_stroke_cmyk:nnnn #1#2#3#4
- {
- \@@_backend_color_select:x
- {
- \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
- \fp_eval:n {#3} ~ \fp_eval:n {#4} ~
- k
- }
- }
-\cs_new_protected:Npn \@@_backend_color_fill_gray:n #1
- { \@@_backend_color_select:x { \fp_eval:n {#1} ~ g } }
-\cs_new_protected:Npn \@@_backend_color_stroke_gray:n #1
- { \@@_backend_color_select:x { \fp_eval:n {#1} ~ G } }
-\cs_new_protected:Npn \@@_backend_color_fill_rgb:nnn #1#2#3
- {
- \@@_backend_color_select:x
- { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ rg }
- }
-\cs_new_protected:Npn \@@_backend_color_stroke_rgb:nnn #1#2#3
- {
- \@@_backend_color_select:x
- { \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} ~ RG }
- }
-%<*pdfmode>
-\cs_new_protected:Npx \@@_backend_color_select:n #1
- {
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D colorstack }
- { \tex_pdfcolorstack:D }
- \exp_not:N \l__kernel_color_stack_int push {#1}
- \group_insert_after:N \exp_not:N \@@_backend_color_reset:
- }
-\cs_new_protected:Npx \@@_backend_color_reset:
- {
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D colorstack }
- { \tex_pdfcolorstack:D }
- \exp_not:N \l__kernel_color_stack_int pop \scan_stop:
- }
-%</pdfmode>
-%<*dvipdfmx|xdvipdfmx>
-\cs_new_eq:NN \@@_backend_color_select:n \__kernel_backend_literal_pdf:n
-%</dvipdfmx|xdvipdfmx>
-\cs_generate_variant:Nn \@@_backend_color_select:n { x }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
% \begin{macro}{\@@_backend_cm:nnnn}
% \begin{macro}{\@@_backend_cm_aux:nnnn}
-% Another split here between \texttt{pdfmode} and \texttt{(x)dvipdfmx}.
+% Another split here between \LuaTeX{}/pdfTeX{} and \texttt{dvipdfmx}/\XeTeX{}.
% In the former, we have a direct method to maintain alignment: the backend
-% can use a matrix itself. For \texttt{(x)dvipdfmx}, we can to decompose the
+% can use a matrix itself. For \texttt{dvipdfmx}/\XeTeX{}, we can to decompose the
% matrix into rotations and a scaling, then use those operations as they
% are handled by the backend. (There is backend support for matrix operations in
-% \texttt{(x)dvipdfmx}, but as a matched pair so not suitable for the
-% \enquote{stand alone} transformation set up here.)
+% \texttt{dvipdfmx}/\XeTeX{}, but as a matched pair so not suitable for the
+% \enquote{stand alone} transformation set up here.) The specials used here
+% are from \texttt{xdvipdfmx} originally: they are well-tested, but probably
+% equivalent to the \texttt{pdf:} versions!
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_cm:nnnn #1#2#3#4
{
-%<*pdfmode>
- \__kernel_backend_matrix:x
- {
- \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
- \fp_eval:n {#3} ~ \fp_eval:n {#4}
- }
-%</pdfmode>
-%<*dvipdfmx|xdvipdfmx>
+%<*luatex|pdftex>
+ \__kernel_backend_matrix:n { #1 ~ #2 ~ #3 ~ #4 }
+%</luatex|pdftex>
+%<*dvipdfmx|xetex>
\@@_backend_cm_decompose:nnnnN {#1} {#2} {#3} {#4}
\@@_backend_cm_aux:nnnn
-%</dvipdfmx|xdvipdfmx>
+%</dvipdfmx|xetex>
}
-%<*dvipdfmx|xdvipdfmx>
+%<*dvipdfmx|xetex>
\cs_new_protected:Npn \@@_backend_cm_aux:nnnn #1#2#3#4
{
\__kernel_backend_literal:x
@@ -781,7 +615,7 @@
{ \fp_eval:n { round ( -#4 , 5 ) } }
}
}
-%</dvipdfmx|xdvipdfmx>
+%</dvipdfmx|xetex>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -841,7 +675,7 @@
% way of specifying a transformation matrix exchanges where one would
% normally expect $B$ and $C$ to be.
% \begin{macrocode}
-%<*dvipdfmx|xdvipdfmx>
+%<*dvipdfmx|xetex>
\cs_new_protected:Npn \@@_backend_cm_decompose:nnnnN #1#2#3#4#5
{
\use:x
@@ -884,7 +718,7 @@
{ #5 {#1} {#2} {#3} {#4} }
{ #5 {#1} {#3} {#2} {#4} }
}
-%</dvipdfmx|xdvipdfmx>
+%</dvipdfmx|xetex>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -900,29 +734,24 @@
\cs_new_protected:Npn \@@_backend_box_use:Nnnnn #1#2#3#4#5
{
\__kernel_backend_scope_begin:
-%<*pdfmode>
+%<*luatex|pdftex>
\@@_backend_cm:nnnn {#2} {#3} {#4} {#5}
-%</pdfmode>
-%<*dvipdfmx|xdvipdfmx>
- \__kernel_backend_literal:x
- {
- pdf:btrans~matrix~
- \fp_eval:n {#2} ~ \fp_eval:n {#3} ~
- \fp_eval:n {#4} ~ \fp_eval:n {#5} ~
- 0 ~ 0
- }
-%</dvipdfmx|xdvipdfmx>
+%</luatex|pdftex>
+%<*dvipdfmx|xetex>
+ \__kernel_backend_literal:n
+ { pdf:btrans~matrix~ #2 ~ #3 ~ #4 ~ #5 ~ 0 ~ 0 }
+%</dvipdfmx|xetex>
\hbox_overlap_right:n { \box_use:N #1 }
-%<*dvipdfmx|xdvipdfmx>
+%<*dvipdfmx|xetex>
\__kernel_backend_literal:n { pdf:etrans }
-%</dvipdfmx|xdvipdfmx>
+%</dvipdfmx|xetex>
\__kernel_backend_scope_end:
}
% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
-%</dvipdfmx|pdfmode|xdvipdfmx>
+%</dvipdfmx|luatex|pdftex|xetex>
% \end{macrocode}
%
% \subsection{\texttt{dvisvgm} backend}
@@ -945,54 +774,11 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_begin:
{
- \@@_backend_scope_begin:
- \@@_backend_scope:n { transform="translate({?x},{?y})~scale(1,-1)" }
- }
-\cs_new_protected:Npn \@@_backend_end:
- { \@@_backend_scope_end: }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_backend_scope_begin:, \@@_backend_scope_end:}
-% \begin{macro}{\@@_backend_scope:n, \@@_backend_scope:x}
-% \begin{variable}{\g_@@_draw_scope_int, \l_@@_draw_scope_int}
-% Several settings that with other backends are \enquote{stand alone} have
-% to be given as part of a scope in SVG. As a result, there is a need to
-% provide a mechanism to automatically close these extra scopes. That is
-% done using a dedicated function and a pair of tracking variables. Within
-% each graphics scope we use a global variable to do the work, with a group
-% used to save the value between scopes. The result is that no direct action
-% is needed when creating a scope.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_backend_scope_begin:
- {
- \int_set_eq:NN
- \l_@@_draw_scope_int
- \g_@@_draw_scope_int
- \group_begin:
- \int_gzero:N \g_@@_draw_scope_int
- }
-\cs_new_protected:Npn \@@_backend_scope_end:
- {
- \prg_replicate:nn
- { \g_@@_draw_scope_int }
- { \@@_backend_literal:n { </g> } }
- \group_end:
- \int_gset_eq:NN
- \g_@@_draw_scope_int
- \l_@@_draw_scope_int
- }
-\cs_new_protected:Npn \@@_backend_scope:n #1
- {
- \@@_backend_literal:n { <g~ #1 > }
- \int_gincr:N \g_@@_draw_scope_int
+ \__kernel_backend_scope_begin:
+ \__kernel_backend_scope:n { transform="translate({?x},{?y})~scale(1,-1)" }
}
-\cs_generate_variant:Nn \@@_backend_scope:n { x }
-\int_new:N \g_@@_draw_scope_int
-\int_new:N \l_@@_draw_scope_int
+\cs_new_eq:NN \@@_backend_end: \__kernel_backend_scope_end:
% \end{macrocode}
-% \end{variable}
-% \end{macro}
% \end{macro}
%
% \begin{macro}{\@@_backend_moveto:nn, \@@_backend_lineto:nn}
@@ -1199,7 +985,7 @@
\cs_new_protected:Npn \@@_backend_linewidth:n #1
{ \@@_backend_scope:x { stroke-width=" \dim_to_decimal:n {#1} " } }
\cs_new_protected:Npn \@@_backend_miterlimit:n #1
- { \@@_backend_scope:x { stroke-miterlimit=" \fp_eval:n {#1} " } }
+ { \@@_backend_scope:x { stroke-miterlimit=" #1 " } }
\cs_new_protected:Npn \@@_backend_cap_butt:
{ \@@_backend_scope:n { stroke-linecap="butt" } }
\cs_new_protected:Npn \@@_backend_cap_round:
@@ -1220,93 +1006,6 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}
-% {
-% \@@_backend_color_fill_cmyk:nnnn ,
-% \@@_backend_color_stroke_cmyk:nnnn
-% }
-% \begin{macro}
-% {
-% \@@_backend_color_fill_gray:n ,
-% \@@_backend_color_stroke_gray:n
-% }
-% \begin{macro}
-% {
-% \@@_backend_color_fill_rgb:nnn ,
-% \@@_backend_color_stroke_rgb:nnn
-% }
-% \begin{macro}{\@@_backend_color_fill:nnn}
-% SVG fill color has to be covered outside of the stack, as for
-% \texttt{dvips}. Here, we are only allowed RGB colors so there is some
-% conversion to do.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_backend_color_fill_cmyk:nnnn #1#2#3#4
- {
- \use:x
- {
- \@@_backend_color_fill:nnn
- { \fp_eval:n { -100 * ( (#1) * ( 1 - (#4) ) - 1 ) } }
- { \fp_eval:n { -100 * ( (#2) * ( 1 - (#4) ) + #4 - 1 ) } }
- { \fp_eval:n { -100 * ( (#3) * ( 1 - (#4) ) + #4 - 1 ) } }
- }
- }
-\cs_new_protected:Npn \@@_backend_color_stroke_cmyk:nnnn #1#2#3#4
- {
- \@@_backend_select:x
- {
- cmyk~
- \fp_eval:n {#1} ~ \fp_eval:n {#2} ~
- \fp_eval:n {#3} ~ \fp_eval:n {#4}
- }
- }
-\cs_new_protected:Npn \@@_backend_color_fill_gray:n #1
- {
- \use:x
- {
- \@@_backend_color_gray_aux:n
- { \fp_eval:n { 100 * (#1) } }
- }
- }
-\cs_new_protected:Npn \@@_backend_color_gray_aux:n #1
- { \@@_backend_color_fill:nnn {#1} {#1} {#1} }
-\cs_new_protected:Npn \@@_backend_color_stroke_gray:n #1
- { \@@_backend_select:x { gray~ \fp_eval:n {#1} } }
-\cs_new_protected:Npn \@@_backend_color_fill_rgb:nnn #1#2#3
- {
- \use:x
- {
- \@@_backend_color_fill:nnn
- { \fp_eval:n { 100 * (#1) } }
- { \fp_eval:n { 100 * (#2) } }
- { \fp_eval:n { 100 * (#3) } }
- }
- }
-\cs_new_protected:Npn \@@_backend_color_fill:nnn #1#2#3
- {
- \@@_backend_scope:x
- {
- fill =
- "
- rgb
- (
- #1 \c_percent_str ,
- #2 \c_percent_str ,
- #3 \c_percent_str
- )
- "
- }
- }
-\cs_new_protected:Npn \@@_backend_color_stroke_rgb:nnn #1#2#3
- {
- \@@_backend_select:x
- { rgb~ \fp_eval:n {#1} ~ \fp_eval:n {#2} ~ \fp_eval:n {#3} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
% \begin{macro}{\@@_backend_cm:nnnn}
% The four arguments here are floats (the affine matrix), the last
% two are a displacement vector.
@@ -1316,14 +1015,7 @@
\@@_backend_scope:n
{
transform =
- "
- matrix
- (
- \fp_eval:n {#1} , \fp_eval:n {#2} ,
- \fp_eval:n {#3} , \fp_eval:n {#4} ,
- 0pt , 0pt
- )
- "
+ " matrix ( #1 , #2 , #3 , #4 , 0pt , 0pt ) "
}
}
% \end{macrocode}
@@ -1360,7 +1052,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx
index e6ca6646601..c3ec121c073 100644
--- a/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx
+++ b/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx
@@ -2,7 +2,7 @@
%
%% File: l3backend-graphics.dtx
%
-% Copyright (C) 2019,2020 The LaTeX3 Project
+% Copyright (C) 2019-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -56,7 +56,7 @@
% \section{\pkg{l3backend-graphics} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
%<@@=graphics>
% \end{macrocode}
%
@@ -69,13 +69,7 @@
% \begin{macro}{\@@_backend_getbb_eps:n}
% Simply use the generic function.
% \begin{macrocode}
-%<*initex>
-\use:n
-%</initex>
-%<*package>
-\AtBeginDocument
-%</package>
- { \cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n }
+\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n
% \end{macrocode}
% \end{macro}
%
@@ -101,10 +95,10 @@
%</dvips>
% \end{macrocode}
%
-% \subsection{\texttt{pdfmode} backend}
+% \subsection{\LuaTeX{} and \pdfTeX{} backends}
%
% \begin{macrocode}
-%<*pdfmode>
+%<*luatex|pdftex>
% \end{macrocode}
%
% \begin{variable}{\l_@@_graphics_attr_tl}
@@ -166,7 +160,7 @@
\graphics_bb_restore:xF { #1 \l_@@_graphics_attr_tl }
{ \@@_backend_getbb_auxii:n {#1} }
}
-% \begin{macrocode}
+% \end{macrocode}
% Measuring the graphic is done by boxing up: for PDF graphics we could
% use |\tex_pdfximagebbox:D|, but if doesn't work for other types.
% As the box always starts at $(0,0)$ there is no need to worry about
@@ -229,7 +223,7 @@
% \begin{macro}{\@@_backend_include_eps:n}
% \begin{variable}
% {\l_@@_backend_dir_str, \l_@@_backend_name_str, \l_@@_backend_ext_str}
-% EPS graphics may be included in \texttt{pdfmode} by conversion to
+% EPS graphics may be included in \LuaTeX{}/pdfTeX{} by conversion to
% PDF: this requires restricted shell escape. Modelled on the \pkg{epstopdf}
% \LaTeXe{} package, but simplified, conversion takes place here if we have
% shell access.
@@ -280,13 +274,13 @@
% \end{macro}
%
% \begin{macrocode}
-%</pdfmode>
+%</luatex|pdftex>
% \end{macrocode}
%
% \subsection{\texttt{dvipdfmx} backend}
%
% \begin{macrocode}
-%<*dvipdfmx|xdvipdfmx>
+%<*dvipdfmx|xetex>
% \end{macrocode}
%
% \begin{macro}
@@ -297,13 +291,7 @@
% Simply use the generic functions: only for \texttt{dvipdfmx} in the
% extraction cases.
% \begin{macrocode}
-%<*initex>
-\use:n
-%</initex>
-%<*package>
-\AtBeginDocument
-%</package>
- { \cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n }
+\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n
%<*dvipdfmx>
\cs_new_protected:Npn \@@_backend_getbb_jpg:n #1
{
@@ -338,7 +326,7 @@
% \begin{macro}{\@@_backend_include_auxii:nnn, \@@_backend_include_auxii:xnn}
% \begin{macro}{\@@_backend_include_auxiii:nnn}
% The special syntax depends on the file type. There is a difference in
-% how PDF graphics are best handled between |dvipdfmx| and |xdvipdfmx|: for
+% how PDF graphics are best handled between |dvipdfmx| and \XeTeX{}: for
% the latter it is better to use the primitive route. The relevant code for
% that is included later in this file.
% \begin{macrocode}
@@ -437,13 +425,13 @@
% \end{macro}
%
% \begin{macrocode}
-%</dvipdfmx|xdvipdfmx>
+%</dvipdfmx|xetex>
% \end{macrocode}
%
-% \subsection{\texttt{xdvipdfmx} backend}
+% \subsection{\XeTeX{} backend}
%
% \begin{macrocode}
-%<*xdvipdfmx>
+%<*xetex>
% \end{macrocode}
%
% \subsubsection{Images}
@@ -460,7 +448,7 @@
% \begin{macro}{\@@_backend_getbb_auxiv:nnNnn, \@@_backend_getbb_auxiv:VnNnn}
% \begin{macro}{\@@_backend_getbb_auxv:nNnn, \@@_backend_getbb_auxv:nNnn}
% \begin{macro}[EXP]{\@@_backend_getbb_pagebox:w}
-% For \texttt{xdvipdfmx}, there are two primitives that allow us to obtain
+% For \XeTeX{}, there are two primitives that allow us to obtain
% the bounding box without needing \texttt{extractbb}. The only complexity
% is passing the various minor variations to a common core process. The
% \XeTeX{} primitive omits the text |box| from the page box specification,
@@ -536,19 +524,19 @@
\cs_new_protected:Npn \@@_backend_include_pdf:n #1
{
\tex_XeTeXpdffile:D
- \@@_backend_include_pdf_quote:w #1 "#1" \q_stop \c_space_tl
+ \@@_backend_include_pdf_quote:w #1 "#1" \s_@@_stop \c_space_tl
\int_compare:nNnT \l_graphics_page_int > 0
{ page ~ \int_use:N \l_graphics_page_int \c_space_tl }
\exp_after:wN \@@_backend_getbb_pagebox:w \l_graphics_pagebox_tl
}
-\cs_new:Npn \@@_backend_include_pdf_quote:w #1 " #2 " #3 \q_stop
+\cs_new:Npn \@@_backend_include_pdf_quote:w #1 " #2 " #3 \s_@@_stop
{ " #2 " }
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macrocode}
-%</xdvipdfmx>
+%</xetex>
% \end{macrocode}
%
% \subsection{\texttt{dvisvgm} backend}
@@ -560,13 +548,7 @@
% \begin{macro}{\@@_backend_getbb_eps:n}
% Simply use the generic function.
% \begin{macrocode}
-%<*initex>
-\use:n
-%</initex>
-%<*package>
-\AtBeginDocument
-%</package>
- { \cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n }
+\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n
% \end{macrocode}
% \end{macro}
%
@@ -635,11 +617,11 @@
dvisvgm:img~
\dim_to_decimal:n { \l_graphics_ury_dim } ~
\dim_to_decimal:n { \l_graphics_ury_dim } ~
- \@@_backend_include_bitmap_quote:w #1 " #1 " \q_stop
+ \@@_backend_include_bitmap_quote:w #1 " #1 " \s_@@_stop
}
}
\cs_new_eq:NN \@@_backend_include_jpg:n \@@_backend_include_png:n
-\cs_new:Npn \@@_backend_include_bitmap_quote:w #1 " #2 " #3 \q_stop
+\cs_new:Npn \@@_backend_include_bitmap_quote:w #1 " #2 " #3 \s_@@_stop
{ " #2 " }
% \end{macrocode}
% \end{macro}
@@ -650,7 +632,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx
index 490d5522339..eafd36f50d7 100644
--- a/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx
+++ b/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx
@@ -2,7 +2,7 @@
%
%% File: l3backend-header.dtx
%
-% Copyright (C) 2019,2020 The LaTeX3 Project
+% Copyright (C) 2019-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -59,6 +59,23 @@
%<*dvips&header>
% \end{macrocode}
%
+% \begin{macro}{color.sc}
+% Empty definition for color at the top level.
+% \begin{macrocode}
+/color.sc { } def
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{TeXcolorseparation, separation}
+% Support for separation/spot colors: this strange naming is so
+% things work with the color stack.
+% \begin{macrocode}
+TeXDict begin
+/TeXcolorseparation { setcolor } def
+end
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{pdf.globaldict}
% A small global dictionary for backend use.
% \begin{macrocode}
@@ -79,7 +96,6 @@ false setglobal
% is done here to allow for |Resolution|. The total height of a rectangle
% (an array) needs a little maths, in contrast to simply extracting a value.
% \begin{macrocode}
-
/pdf.cvs { 65534 string cvs } def
/pdf.dvi.pt { 72.27 mul Resolution div } def
/pdf.pt.dvi { 72.27 div Resolution mul } def
@@ -351,7 +367,7 @@ false setglobal
/x
{
0 exch rmoveto
- SDict~
+ SDict
begin
currentpoint
pdf.originy ne exch pdf.originx ne or
diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx
new file mode 100644
index 00000000000..ee4702a3cdf
--- /dev/null
+++ b/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx
@@ -0,0 +1,286 @@
+% \iffalse meta-comment
+%
+%% File: l3backend-opacity.dtx
+%
+% Copyright (C) 2021 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3backend bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full,kernel]{l3doc}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% The \textsf{l3backend-opacity} package\\ Backend opacity support^^A
+% }
+%
+% \author{^^A
+% The \LaTeX{} Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released 2021-02-18}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3backend-opacity} Implementation}
+%
+% \begin{macrocode}
+%<*package>
+%<@@=opacity>
+% \end{macrocode}
+%
+% Although opacity is not color, it needs to be managed in a somewhat
+% similar way: using a dedicated stack if possible. Depending on the backend,
+% that may not be possible. There is also the need to cover fill/stroke setting
+% as well as more general running opacity. It is easiest to describe the value
+% used in terms of opacity, although commonly this is referred to as
+% transparency.
+%
+% \begin{macrocode}
+%<*dvips>
+% \end{macrocode}
+%
+% \begin{macro}{\@@_backend_select:n,\@@_backend_select_aux:n}
+% No stack so set values directly.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_select:n #1
+ {
+ \exp_args:Nx \@@_backend_select_aux:n
+ { \fp_eval:n { min(max(0,#1),1) } }
+ }
+\cs_new_protected:Npn \@@_backend_select_aux:n #1
+ {
+ \__kernel_backend_postscript:n
+ { #1 ~ .setfillconstantalpha ~ #1 ~ .setstrokeconstantalpha }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_backend_fill:n, \@@_backend_stroke:n}
+% \begin{macro}{\@@_backend:nn, \@@_backend:xn}
+% Similar to the above but with no stack and only adding to one or other of
+% the entries.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_fill:n #1
+ { \@@_backend:xn { \fp_eval:n { min(max(0,#1),1) } } { fill } }
+\cs_new_protected:Npn \@@_backend_stroke:n #1
+ { \@@_backend:xn { \fp_eval:n { min(max(0,#1),1) } } { stroke } }
+\cs_new_protected:Npn \@@_backend:nn #1#2
+ {
+ \__kernel_backend_postscript:n { #1 ~ .set #2 constantalpha }
+ }
+\cs_generate_variant:Nn \@@_backend:nn { x }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</dvips>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*dvipdfmx|luatex|pdftex|xetex>
+% \end{macrocode}
+%
+% \begin{variable}{\c_@@_backend_stack_int}
+% Set up a stack.
+% \begin{macrocode}
+\cs_if_exist:NT \pdfmanagement_add:nnn
+ {
+ \__kernel_color_backend_stack_init:Nnn \c_@@_backend_stack_int
+ { page ~ direct } { /opacity 1 ~ gs }
+ \pdfmanagement_add:nnn { Page / Resources / ExtGState }
+ { opacity 1 } { << /ca ~ 1 /CA ~ 1 >> }
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_backend_fill_tl, \l_@@_backend_stroke_tl}
+% We use |tl| here for speed: at the backend, this should be reasonable.
+% \begin{macrocode}
+\tl_new:N \l_@@_backend_fill_tl
+\tl_new:N \l_@@_backend_stroke_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_backend_select:n, \@@_backend_select_aux:n}
+% \begin{macro}{\@@_backend_reset:}
+% Other than the need to evaluate the opacity as an \texttt{fp}, much the
+% same as color.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_select:n #1
+ {
+ \exp_args:Nx \@@_backend_select_aux:n
+ { \fp_eval:n { min(max(0,#1),1) } }
+ }
+\cs_new_protected:Npn \@@_backend_select_aux:n #1
+ {
+ \tl_set:Nn \l_@@_backend_fill_tl {#1}
+ \tl_set:Nn \l_@@_backend_stroke_tl {#1}
+ \pdfmanagement_add:nnn { Page / Resources / ExtGState }
+ { opacity #1 }
+ { << /ca ~ #1 /CA ~ #1 >> }
+ \__kernel_color_backend_stack_push:nn \c_@@_backend_stack_int
+ { /opacity #1 ~ gs }
+ \group_insert_after:N \@@_backend_reset:
+ }
+\cs_if_exist:NF \pdfmanagement_add:nnn
+ {
+ \cs_gset_protected:Npn \@@_backend_select_aux:n #1 { }
+ }
+\cs_new_protected:Npn \@@_backend_reset:
+ { \__kernel_color_backend_stack_pop:n \c_@@_backend_stack_int }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_backend_fill:n, \@@_backend_stroke:n}
+% \begin{macro}{\@@_backend_fillstroke:nn, \@@_backend_fillstroke:xx}
+% For separate fill and stroke, we need to work out if we need to do
+% more work or if we can stick to a single setting.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_fill:n #1
+ {
+ \@@_backend_fill_stroke:xx
+ { \fp_eval:n { min(max(0,#1),1) } }
+ \l_@@_backend_stroke_tl
+ }
+\cs_new_protected:Npn \@@_backend_stroke:n #1
+ {
+ \@@_backend_fill_stroke:xx
+ \l_@@_backend_fill_tl
+ { \fp_eval:n { min(max(0,#1),1) } }
+ }
+\cs_new_protected:Npn \@@_backend_fill_stroke:nn #1#2
+ {
+ \str_if_eq:nnTF {#1} {#2}
+ { \@@_backend_select_aux:n {#1} }
+ {
+ \tl_set:Nn \l_@@_backend_fill_tl {#1}
+ \tl_set:Nn \l_@@_backend_stroke_tl {#2}
+ \pdfmanagement_add:nnn { Page / Resources / ExtGState }
+ { opacity.fill #1 }
+ { << /ca ~ #1 >> }
+ \pdfmanagement_add:nnn { Page / Resources / ExtGState }
+ { opacity.stroke #1 }
+ { << /CA ~ #2 >> }
+ \__kernel_color_backend_stack_push:nn \c_@@_backend_stack_int
+ { /opacity.fill #1 ~ gs /opacity.stroke #2 ~ gs }
+ \group_insert_after:N \@@_backend_reset:
+ }
+ }
+\cs_generate_variant:Nn \@@_backend_fill_stroke:nn { xx }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</dvipdfmx|luatex|pdftex|xetex>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*dvipdfmx|xdvipdfmx>
+% \end{macrocode}
+%
+% \begin{macro}{\@@_backend_select:n}
+% Older backends have no stack support, so everything is done directly.
+% \begin{macrocode}
+\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
+ {
+ \cs_gset_protected:Npn \@@_backend_select_aux:n #1
+ {
+ \tl_set:Nn \l_@@_backend_fill_tl {#1}
+ \tl_set:Nn \l_@@_backend_stroke_tl {#1}
+ \pdfmanagement_add:nnn { Page / Resources / ExtGState }
+ { opacity #1 }
+ { << /ca ~ #1 /CA ~ #1 >> }
+ \__kernel_backend_literal_pdf:n { /opacity #1 ~ gs }
+ }
+ \cs_gset_protected:Npn \@@_backend_fill_stroke:nn #1#2
+ {
+ \str_if_eq:nnTF {#1} {#2}
+ { \@@_backend_select_aux:n {#1} }
+ {
+ \tl_set:Nn \l_@@_backend_fill_tl {#1}
+ \tl_set:Nn \l_@@_backend_stroke_tl {#2}
+ \pdfmanagement_add:nnn { Page / Resources / ExtGState }
+ { opacity.fill #1 }
+ { << /ca ~ #1 >> }
+ \pdfmanagement_add:nnn { Page / Resources / ExtGState }
+ { opacity.stroke #1 }
+ { << /CA ~ #2 >> }
+ \__kernel_backend_literal_pdf:n
+ { /opacity.fill #1 ~ gs /opacity.stroke #2 ~ gs }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</dvipdfmx|xdvipdfmx>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*dvisvgm>
+% \end{macrocode}
+%
+% \begin{macro}{\@@_backend_select:n, \@@_backend_fill:n, \@@_backend_stroke:n}
+% \begin{macro}{\@@_backend:nn}
+% Once again, we use a scope here. There is a general opacity function for
+% SVG, but that is of course not set up using the stack.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_select:n #1
+ { \@@_backend:nn {#1} { } }
+\cs_new_protected:Npn \@@_backend_fill:n #1
+ { \@@_backend:nn {#1} { fill- } }
+\cs_new_protected:Npn \@@_backend_stroke:n #1
+ { \@@_backend:nn { {#1} } { stroke- } }
+\cs_new_protected:Npn \@@_backend:nn #1#2
+ { \__kernel_backend_scope:x { #2 opacity = " \fp_eval:n { min(max(0,#1),1) } " } }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</dvisvgm>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx b/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx
index 14496bbc89a..ad2b0d51705 100644
--- a/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx
+++ b/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx
@@ -2,7 +2,7 @@
%
%% File: l3backend-pdf.dtx
%
-% Copyright (C) 2019,2020 The LaTeX3 Project
+% Copyright (C) 2019-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -56,7 +56,7 @@
% \section{\pkg{l3backend-pdf} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
%<@@=pdf>
% \end{macrocode}
%
@@ -134,8 +134,9 @@
% \begin{macro}{\@@_backend_object_write:nn, \@@_backend_object_write:nx}
% \begin{macro}
% {
-% \@@_backend_object_write_array:nn ,
-% \@@_backend_object_write_dict:nn ,
+% \@@_backend_object_write_array:nn ,
+% \@@_backend_object_write_dict:nn ,
+% \@@_backend_object_write_fstream:nn ,
% \@@_backend_object_write_stream:nn
% }
% \begin{macro}{\@@_backend_object_write_stream:nnn}
@@ -166,13 +167,28 @@
\cs_new_protected:Npn \@@_backend_object_write_array:nn #1#2
{
\@@_backend_pdfmark:x
- { #1 [ ~ \exp_not:n {#2} ~ ] ~ /PUTINTERVAL }
+ { #1 ~0~ [ ~ \exp_not:n {#2} ~ ] ~ /PUTINTERVAL }
}
\cs_new_protected:Npn \@@_backend_object_write_dict:nn #1#2
{
\@@_backend_pdfmark:x
{ #1 << \exp_not:n {#2} >> /PUT }
}
+\cs_new_protected:Npn \@@_backend_object_write_fstream:nn #1#2
+ {
+ \exp_args:Nx
+ \@@_backend_object_write_fstream:nnn {#1} #2
+ }
+\cs_new_protected:Npn \@@_backend_object_write_fstream:nnn #1#2#3
+ {
+ \__kernel_backend_postscript:n
+ {
+ SDict ~ begin ~
+ mark ~ #1 ~ << #2 >> /PUT ~ pdfmark ~
+ mark ~ #1 ~ ( #3 )~ ( r )~ file ~ /PUT ~ pdfmark ~
+ end
+ }
+ }
\cs_new_protected:Npn \@@_backend_object_write_stream:nn #1#2
{
\exp_args:Nx
@@ -182,7 +198,6 @@
{
\__kernel_backend_postscript:n
{
- [nobreak]
mark ~ #1 ~ ( #3 ) /PUT ~ pdfmark ~
mark ~ #1 ~ << #2 >> /PUT ~ pdfmark
}
@@ -227,6 +242,14 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[EXP]{\@@_backend_pageobject_ref:n}
+% Page references are easy in \texttt{dvips}.
+% \begin{macrocode}
+\cs_new:Npn \@@_backend_pageobject_ref:n #1
+ { { Page #1 } }
+% \end{macrocode}
+% \end{macro}
+%
% \subsubsection{Annotations}
%
% In \texttt{dvips}, annotations have to be constructed manually. As such,
@@ -263,7 +286,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_annotation:nnnn #1#2#3#4
{
- \exp_args:Nf \@@_backend_annotation_aux:nnnn
+ \exp_args:Nf \@@_backend_annotation_aux:nnnn
{ \dim_eval:n {#1} } {#2} {#3} {#4}
}
\cs_new_protected:Npn \@@_backend_annotation_aux:nnnn #1#2#3#4
@@ -274,9 +297,9 @@
{
\hbox:n
{
- \tex_kern:D #1 \scan_stop:
+ \__kernel_kern:n {#1}
\__kernel_backend_postscript:n { pdf.save.ur }
- \tex_kern:D -#1 \scan_stop:
+ \__kernel_kern:n { -#1 }
}
}
\int_gincr:N \g_@@_backend_object_int
@@ -435,14 +458,9 @@
\hbox_set:Nn \l_@@_backend_model_box { Gg }
\exp_args:Nx \@@_backend_link_outerbox:n
{
-%<*initex>
- \l_galley_total_left_margin_dim
-%</initex>
-%<*package>
\int_if_odd:nTF { \value { page } }
{ \oddsidemargin }
{ \evensidemargin }
-%</package>
}
\box_move_down:nn { \box_dp:N \l_@@_backend_content_box }
{ \hbox:n { \__kernel_backend_postscript:n { pdf.save.linkll } } }
@@ -504,12 +522,7 @@
[
\dim_to_decimal:n {#1} ~
\dim_to_decimal:n { -\box_dp:N \l_@@_backend_model_box } ~
-%<*initex>
- \dim_to_decimal:n { #1 + \l_galley_text_width_dim } ~
-%</initex>
-%<*package>
\dim_to_decimal:n { #1 + \textwidth } ~
-%</package>
\dim_to_decimal:n { \box_ht:N \l_@@_backend_model_box }
]
[ exch { pdf.pt.dvi } forall ] def
@@ -552,7 +565,6 @@
% question about the name of the hook: to be resolved at the \LaTeXe{}
% end.
% \begin{macrocode}
-%<*package>
\use_none:n
{
\cs_if_exist:NT \@makecol@hook
@@ -580,7 +592,6 @@
\cs_set_eq:NN \@@_breaklink_usebox:N \hbox_unpack:N
}
}
-%</package>
% \end{macrocode}
% \end{macro}
%
@@ -605,10 +616,12 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_backend_destination:nn, \@@_backend_destination_box:nn}
+% \begin{macro}{\@@_backend_destination:nn}
+% \begin{macro}{\@@_backend_destination:nnnn, \@@_backend_destination_aux:nnnn}
% Here, we need to turn the zoom into a scale. We also need to know where
% the current anchor point actually is: worked out in PostScript. For the
% rectangle version, we have a bit more PostScript: we need two points.
+% fitr without rule spec doesn't work, so it falls back to \texttt{/Fit} here.
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_destination:nn #1#2
{
@@ -626,6 +639,7 @@
{ fitbv } { /FitBV ~ pdf.dest.x }
{ fith } { /FitH ~ pdf.dest.y }
{ fitv } { /FitV ~ pdf.dest.x }
+ { fitr } { /Fit }
}
{
/XYZ ~ pdf.dest.point ~ \fp_eval:n { (#2) / 100 }
@@ -635,41 +649,73 @@
/DEST
}
}
-\cs_new_protected:Npn \@@_backend_destination_box:nn #1#2
- {
- \group_begin:
- \hbox_set:Nn \l_@@_internal_box {#2}
- \box_move_down:nn
- { \box_dp:N \l_@@_internal_box }
- { \hbox:n { \__kernel_backend_postscript:n { pdf.save.ll } } }
- \box_use:N \l_@@_internal_box
- \box_move_up:nn
- { \box_ht:N \l_@@_internal_box }
- { \hbox:n { \__kernel_backend_postscript:n { pdf.save.ur } } }
- \@@_backend_pdfmark:n
- {
- /View
- [
- /FitR ~
- pdf.llx ~ pdf.lly ~ pdf.dest2device ~
- pdf.urx ~ pdf.ury ~ pdf.dest2device
- ]
- /Dest ( #1 ) cvn
- /DEST
- }
- \group_end:
+\cs_new_protected:Npn \@@_backend_destination:nnnn #1#2#3#4
+ {
+ \exp_args:Ne \@@_backend_destination_aux:nnnn
+ { \dim_eval:n {#2} } {#1} {#3} {#4}
+ }
+\cs_new_protected:Npn \@@_backend_destination_aux:nnnn #1#2#3#4
+ {
+ \vbox_to_zero:n
+ {
+ \__kernel_kern:n {#4}
+ \hbox:n { \__kernel_backend_postscript:n { pdf.save.ll } }
+ \tex_vss:D
+ }
+ \__kernel_kern:n {#1}
+ \vbox_to_zero:n
+ {
+ \__kernel_kern:n { -#3 }
+ \hbox:n { \__kernel_backend_postscript:n { pdf.save.ur } }
+ \tex_vss:D
+ }
+ \__kernel_kern:n { -#1 }
+ \@@_backend_pdfmark:n
+ {
+ /View
+ [
+ /FitR ~
+ pdf.llx ~ pdf.lly ~ pdf.dest2device ~
+ pdf.urx ~ pdf.ury ~ pdf.dest2device
+ ]
+ /Dest ( #2 ) cvn
+ /DEST
+ }
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \subsubsection{Structure}
%
% \begin{macro}{\@@_backend_compresslevel:n}
% \begin{macro}{\@@_backend_compress_objects:n}
-% These are all no-ops.
+% Doable for the usual \texttt{ps2pdf} method.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_backend_compresslevel:n #1 { }
-\cs_new_protected:Npn \@@_backend_compress_objects:n #1 { }
+\cs_new_protected:Npn \@@_backend_compresslevel:n #1
+ {
+ \int_compare:nNnT {#1} = 0
+ {
+ \__kernel_backend_literal_postscript:n
+ {
+ /setdistillerparams ~ where
+ { pop << /CompressPages ~ false >> setdistillerparams }
+ if
+ }
+ }
+ }
+\cs_new_protected:Npn \@@_backend_compress_objects:n #1
+ {
+ \bool_if:nF {#1}
+ {
+ \__kernel_backend_literal_postscript:n
+ {
+ /setdistillerparams ~ where
+ { pop << /CompressStreams ~ false >> setdistillerparams }
+ if
+ }
+ }
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -709,10 +755,10 @@
%</dvips>
% \end{macrocode}
%
-% \subsection{\texttt{pdfmode} backend}
+% \subsection{\LuaTeX{} and \pdfTeX{} backend}
%
% \begin{macrocode}
-%<*pdfmode>
+%<*luatex|pdftex>
% \end{macrocode}
%
% \subsubsection{Annotations}
@@ -720,28 +766,37 @@
% \begin{macro}{\@@_backend_annotation:nnnn}
% Simply pass the raw data through, just dealing with evaluation of dimensions.
% \begin{macrocode}
-\cs_new_protected:Npx \@@_backend_annotation:nnnn #1#2#3#4
+\cs_new_protected:Npn \@@_backend_annotation:nnnn #1#2#3#4
{
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D annot ~ }
- { \tex_pdfannot:D }
- width ~ \exp_not:N \dim_eval:n {#1} ~
- height ~ \exp_not:N \dim_eval:n {#2} ~
- depth ~ \exp_not:N \dim_eval:n {#3} ~
+%<*luatex>
+ \tex_pdfextension:D annot ~
+%</luatex>
+%<*pdftex>
+ \tex_pdfannot:D
+%</pdftex>
+ width ~ \dim_eval:n {#1} ~
+ height ~ \dim_eval:n {#2} ~
+ depth ~ \dim_eval:n {#3} ~
{#4}
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[EXP]{\@@_backend_annotation_last:}
-% A tiny amount of extra data gets added here.
+% A tiny amount of extra data gets added here; we use \texttt{x}-type
+% expansion to get the space in the right place and form. The \enquote{extra}
+% space in the \LuaTeX{} version is \emph{required} as it is consumed in
+% finding the end of the keyword.
% \begin{macrocode}
\cs_new:Npx \@@_backend_annotation_last:
{
\exp_not:N \int_value:w
- \cs_if_exist:NTF \tex_pdffeedback:D
- { \exp_not:N \tex_pdffeedback:D lastannot ~ }
- { \exp_not:N \tex_pdflastannot:D }
+%<*luatex>
+ \exp_not:N \tex_pdffeedback:D lastannot ~
+%</luatex>
+%<*pdftex>
+ \exp_not:N \tex_pdflastannot:D
+%</pdftex>
\c_space_tl 0 ~ R
}
% \end{macrocode}
@@ -757,19 +812,25 @@
{ \@@_backend_link_begin:nnnw {#1} { goto~name } {#2} }
\cs_new_protected:Npn \@@_backend_link_begin_user:nnw #1#2
{ \@@_backend_link_begin:nnnw {#1} { user } {#2} }
-\cs_new_protected:Npx \@@_backend_link_begin:nnnw #1#2#3
+\cs_new_protected:Npn \@@_backend_link_begin:nnnw #1#2#3
{
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D startlink ~ }
- { \tex_pdfstartlink:D }
- attr {#1}
- #2 {#3}
+%<*luatex>
+ \tex_pdfextension:D startlink ~
+%</luatex>
+%<*pdftex>
+ \tex_pdfstartlink:D
+%</pdftex>
+ attr {#1}
+ #2 {#3}
}
-\cs_new_protected:Npx \@@_backend_link_end:
+\cs_new_protected:Npn \@@_backend_link_end:
{
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D endlink \scan_stop: }
- { \tex_pdfendlink:D }
+%<*luatex>
+ \tex_pdfextension:D endlink \scan_stop:
+%</luatex>
+%<*pdftex>
+ \tex_pdfendlink:D
+%</pdftex>
}
% \end{macrocode}
% \end{macro}
@@ -782,9 +843,12 @@
\cs_new:Npx \@@_backend_link_last:
{
\exp_not:N \int_value:w
- \cs_if_exist:NTF \tex_pdffeedback:D
- { \exp_not:N \tex_pdffeedback:D lastlink ~ }
- { \exp_not:N \tex_pdflastlink:D }
+%<*luatex>
+ \exp_not:N \tex_pdffeedback:D lastlink ~
+%</luatex>
+%<*pdftex>
+ \exp_not:N \tex_pdflastlink:D
+%</pdftex>
\c_space_tl 0 ~ R
}
% \end{macrocode}
@@ -793,29 +857,36 @@
% \begin{macro}{\@@_backend_link_margin:n}
% A simple task: pass the data to the primitive.
% \begin{macrocode}
-\cs_new_protected:Npx \@@_backend_link_margin:n #1
+\cs_new_protected:Npn \@@_backend_link_margin:n #1
{
- \cs_if_exist:NTF \tex_pdfvariable:D
- { \exp_not:N \tex_pdfvariable:D linkmargin }
- { \exp_not:N \tex_pdflinkmargin:D }
- \exp_not:N \dim_eval:n {#1} \scan_stop:
+%<*luatex>
+ \tex_pdfvariable:D linkmargin
+%</luatex>
+%<*pdftex>
+ \tex_pdflinkmargin:D
+%</pdftex>
+ \dim_eval:n {#1} \scan_stop:
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_backend_destination:nn, \@@_backend_destination_box:nn}
+% \begin{macro}{\@@_backend_destination:nn}
+% \begin{macro}{\@@_backend_destination:nnnn}
% A simple task: pass the data to the primitive. The |\scan_stop:| deals
% with the danger of an unterminated keyword. The zoom given here is a
% percentage, but we need to pass it as \emph{per mille}. The rectangle
% version is also easy as everything is build in.
% \begin{macrocode}
-\cs_new_protected:Npx \@@_backend_destination:nn #1#2
+\cs_new_protected:Npn \@@_backend_destination:nn #1#2
{
- \cs_if_exist:NTF \tex_pdfextension:D
- { \exp_not:N \tex_pdfextension:D dest ~ }
- { \exp_not:N \tex_pdfdest:D }
+%<*luatex>
+ \tex_pdfextension:D dest ~
+%</luatex>
+%<*pdftex>
+ \tex_pdfdest:D
+%</pdftex>
name {#1}
- \exp_not:N \str_case:nnF {#2}
+ \str_case:nnF {#2}
{
{ xyz } { xyz }
{ fit } { fit }
@@ -824,45 +895,52 @@
{ fitbv } { fitbv }
{ fith } { fith }
{ fitv } { fitv }
+ { fitr } { fitr }
}
- { xyz ~ zoom \exp_not:N \fp_eval:n { #2 * 10 } }
+ { xyz ~ zoom \fp_eval:n { #2 * 10 } }
\scan_stop:
}
-\cs_new_protected:Npx \@@_backend_destination_box:nn #1#2
+\cs_new_protected:Npn \@@_backend_destination:nnnn #1#2#3#4
{
- \group_begin:
- \hbox_set:Nn \l_@@_internal_box {#2}
- \cs_if_exist:NTF \tex_pdfextension:D
- { \exp_not:N \tex_pdfextension:D dest ~ }
- { \exp_not:N \tex_pdfdest:D }
- name {#1}
- fitr ~
- width \exp_not:N \box_wd:N \l_@@_internal_box
- height \exp_not:N \box_ht:N \l_@@_internal_box
- depth \exp_not:N \box_dp:N \l_@@_internal_box
- \box_use:N \l_@@_internal_box
- \group_end:
+%<*luatex>
+ \tex_pdfextension:D dest ~
+%</luatex>
+%<*pdftex>
+ \tex_pdfdest:D
+%</pdftex>
+ name {#1}
+ fitr ~
+ width \dim_eval:n {#2} ~
+ height \dim_eval:n {#3} ~
+ depth \dim_eval:n {#4} \scan_stop:
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \subsubsection{Catalogue entries}
%
% \begin{macro}{\@@_backend_catalog_gput:nn, \@@_backend_info_gput:nn}
% \begin{macrocode}
-\cs_new_protected:Npx \@@_backend_catalog_gput:nn #1#2
+\cs_new_protected:Npn \@@_backend_catalog_gput:nn #1#2
{
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D catalog }
- { \tex_pdfcatalog:D }
- { / #1 ~ #2 }
+%<*luatex>
+ \tex_pdfextension:D catalog
+%</luatex>
+%<*pdftex>
+ \tex_pdfcatalog:D
+%</pdftex>
+ { / #1 ~ #2 }
}
-\cs_new_protected:Npx \@@_backend_info_gput:nn #1#2
+\cs_new_protected:Npn \@@_backend_info_gput:nn #1#2
{
- \cs_if_exist:NTF \tex_pdfextension:D
- { \tex_pdfextension:D info }
- { \tex_pdfinfo:D }
- { / #1 ~ #2 }
+%<*luatex>
+ \tex_pdfextension:D info
+%</luatex>
+%<*pdftex>
+ \tex_pdfinfo:D
+%</pdftex>
+ { / #1 ~ #2 }
}
% \end{macrocode}
% \end{macro}
@@ -881,26 +959,25 @@
% Declaring objects means reserving at the PDF level plus starting
% tracking.
% \begin{macrocode}
-\group_begin:
- \cs_set_protected:Npn \@@_tmp:w #1#2
- {
- \cs_new_protected:Npx \@@_backend_object_new:nn ##1##2
- {
- #1 reserveobjnum ~
- \int_const:cn
- { c_@@_backend_object_ \exp_not:N \tl_to_str:n {##1} _int }
- {#2}
- \prop_gput:Nnn \exp_not:N \g_@@_backend_object_prop {##1} {##2}
- }
- }
- \cs_if_exist:NTF \tex_pdfextension:D
- {
- \@@_tmp:w
- { \tex_pdfextension:D obj ~ }
- { \exp_not:N \tex_pdffeedback:D lastobj }
- }
- { \@@_tmp:w { \tex_pdfobj:D } { \tex_pdflastobj:D } }
-\group_end:
+\cs_new_protected:Npn \@@_backend_object_new:nn #1#2
+ {
+%<*luatex>
+ \tex_pdfextension:D obj ~
+%</luatex>
+%<*pdftex>
+ \tex_pdfobj:D
+%</pdftex>
+ reserveobjnum ~
+ \int_const:cn
+ { c_@@_backend_object_ \tl_to_str:n {#1} _int }
+%<*luatex>
+ { \tex_pdffeedback:D lastobj }
+%</luatex>
+%<*pdftex>
+ { \tex_pdflastobj:D }
+%</pdftex>
+ \prop_gput:Nnn \g_@@_backend_object_prop {#1} {#2}
+ }
\cs_new:Npn \@@_backend_object_ref:n #1
{ \int_use:c { c_@@_backend_object_ \tl_to_str:n {#1} _int } ~ 0 ~ R }
% \end{macrocode}
@@ -912,36 +989,34 @@
% Writing the data needs a little information about the structure of the
% object.
% \begin{macrocode}
-\group_begin:
- \cs_set_protected:Npn \@@_tmp:w #1
- {
- \cs_new_protected:Npn \@@_backend_object_write:nn ##1##2
+\cs_new_protected:Npn \@@_backend_object_write:nn #1#2
+ {
+%<*luatex>
+ \tex_immediate:D \tex_pdfextension:D obj ~
+%</luatex>
+%<*pdftex>
+ \tex_immediate:D \tex_pdfobj:D
+%</pdftex>
+ useobjnum ~
+ \int_use:c
+ { c_@@_backend_object_ \tl_to_str:n {#1} _int }
+ \str_case_e:nn
+ { \prop_item:Nn \g_@@_backend_object_prop {#1} }
{
- \tex_immediate:D #1 useobjnum ~
- \int_use:c
- { c_@@_backend_object_ \tl_to_str:n {##1} _int }
- \str_case_e:nn
- { \prop_item:Nn \g_@@_backend_object_prop {##1} }
- {
- { array } { { [ ~ \exp_not:n {##2} ~ ] } }
- { dict } { { << ~ \exp_not:n {##2} ~ >> } }
- { fstream }
- {
- stream ~ attr ~ { \@@_exp_not_i:nn ##2 } ~
- file ~ { \@@_exp_not_ii:nn ##2 }
- }
- { stream }
- {
- stream ~ attr ~ { \@@_exp_not_i:nn ##2 } ~
- { \@@_exp_not_ii:nn ##2 }
- }
- }
+ { array } { { [ ~ \exp_not:n {#2} ~ ] } }
+ { dict } { { << ~ \exp_not:n {#2} ~ >> } }
+ { fstream }
+ {
+ stream ~ attr ~ { \@@_exp_not_i:nn #2 } ~
+ file ~ { \@@_exp_not_ii:nn #2 }
+ }
+ { stream }
+ {
+ stream ~ attr ~ { \@@_exp_not_i:nn #2 } ~
+ { \@@_exp_not_ii:nn #2 }
+ }
}
- }
- \cs_if_exist:NTF \tex_pdfextension:D
- { \@@_tmp:w { \tex_pdfextension:D obj ~ } }
- { \@@_tmp:w { \tex_pdfobj:D } }
-\group_end:
+ }
\cs_generate_variant:Nn \@@_backend_object_write:nn { nx }
\cs_new:Npn \@@_exp_not_i:nn #1#2 { \exp_not:n {#1} }
\cs_new:Npn \@@_exp_not_ii:nn #1#2 { \exp_not:n {#2} }
@@ -952,34 +1027,31 @@
% \begin{macro}{\@@_backend_object_now:nn, \@@_backend_object_now:nx}
% Much like writing, but direct creation.
% \begin{macrocode}
-\group_begin:
- \cs_set_protected:Npn \@@_tmp:w #1
- {
- \cs_new_protected:Npn \@@_backend_object_now:nn ##1##2
+\cs_new_protected:Npn \@@_backend_object_now:nn #1#2
+ {
+%<*luatex>
+ \tex_immediate:D \tex_pdfextension:D obj ~
+%</luatex>
+%<*pdftex>
+ \tex_immediate:D \tex_pdfobj:D
+%</pdftex>
+ \str_case:nn
+ {#1}
{
- \tex_immediate:D #1
- \str_case:nn
- {##1}
- {
- { array } { { [ ~ \exp_not:n {##2} ~ ] } }
- { dict } { { << ~ \exp_not:n {##2} ~ >> } }
- { fstream }
- {
- stream ~ attr ~ { \@@_exp_not_i:nn ##2 } ~
- file ~ { \@@_exp_not_ii:nn ##2 }
- }
- { stream }
- {
- stream ~ attr ~ { \@@_exp_not_i:nn ##2 } ~
- { \@@_exp_not_ii:nn ##2 }
- }
- }
+ { array } { { [ ~ \exp_not:n {#2} ~ ] } }
+ { dict } { { << ~ \exp_not:n {#2} ~ >> } }
+ { fstream }
+ {
+ stream ~ attr ~ { \@@_exp_not_i:nn #2 } ~
+ file ~ { \@@_exp_not_ii:nn #2 }
+ }
+ { stream }
+ {
+ stream ~ attr ~ { \@@_exp_not_i:nn #2 } ~
+ { \@@_exp_not_ii:nn #2 }
+ }
}
- }
- \cs_if_exist:NTF \tex_pdfextension:D
- { \@@_tmp:w { \tex_pdfextension:D obj ~ } }
- { \@@_tmp:w { \tex_pdfobj:D } }
-\group_end:
+ }
\cs_generate_variant:Nn \@@_backend_object_now:nn { nx }
% \end{macrocode}
% \end{macro}
@@ -990,14 +1062,34 @@
\cs_new:Npx \@@_backend_object_last:
{
\exp_not:N \int_value:w
- \cs_if_exist:NTF \tex_pdffeedback:D
- { \exp_not:N \tex_pdffeedback:D lastobj ~ }
- { \exp_not:N \tex_pdflastobj:D }
+%<*luatex>
+ \exp_not:N \tex_pdffeedback:D lastobj ~
+%</luatex>
+%<*pdftex>
+ \exp_not:N \tex_pdflastobj:D
+%</pdftex>
\c_space_tl 0 ~ R
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[EXP]{\@@_backend_pageobject_ref:n}
+% The usual wrapper situation; the three spaces here are essential.
+% \begin{macrocode}
+\cs_new:Npx \@@_backend_pageobject_ref:n #1
+ {
+ \exp_not:N \int_value:w
+%<*luatex>
+ \exp_not:N \tex_pdffeedback:D pageref
+%</luatex>
+%<*pdftex>
+ \exp_not:N \tex_pdfpageref:D
+%</pdftex>
+ \c_space_tl #1 \c_space_tl \c_space_tl \c_space_tl 0 ~ R
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \subsubsection{Structure}
%
% \begin{macro}{\@@_backend_compresslevel:n}
@@ -1005,13 +1097,16 @@
% \begin{macro}{\@@_backend_objcompresslevel:n}
% Simply pass data to the engine.
% \begin{macrocode}
-\cs_new_protected:Npx \@@_backend_compresslevel:n #1
+\cs_new_protected:Npn \@@_backend_compresslevel:n #1
{
- \exp_not:N \tex_global:D
- \cs_if_exist:NTF \tex_pdfcompresslevel:D
- { \tex_pdfcompresslevel:D }
- { \tex_pdfvariable:D compresslevel }
- \exp_not:N \int_value:w \exp_not:N \int_eval:n {#1} \scan_stop:
+ \tex_global:D
+%<*luatex>
+ \tex_pdfvariable:D compresslevel
+%</luatex>
+%<*pdftex>
+ \tex_pdfcompresslevel:D
+%</pdftex>
+ \int_value:w \int_eval:n {#1} \scan_stop:
}
\cs_new_protected:Npn \@@_backend_compress_objects:n #1
{
@@ -1019,13 +1114,16 @@
{ \@@_backend_objcompresslevel:n { 2 } }
{ \@@_backend_objcompresslevel:n { 0 } }
}
-\cs_new_protected:Npx \@@_backend_objcompresslevel:n #1
+\cs_new_protected:Npn \@@_backend_objcompresslevel:n #1
{
- \exp_not:N \tex_global:D
- \cs_if_exist:NTF \tex_pdfobjcompresslevel:D
- { \tex_pdfobjcompresslevel:D }
- { \tex_pdfvariable:D objcompresslevel }
- #1 \scan_stop:
+ \tex_global:D
+%<*luatex>
+ \tex_pdfvariable:D objcompresslevel
+%</luatex>
+%<*pdftex>
+ \tex_pdfobjcompresslevel:D
+%</pdftex>
+ #1 \scan_stop:
}
% \end{macrocode}
% \end{macro}
@@ -1034,61 +1132,65 @@
%
% \begin{macro}
% {\@@_backend_version_major_gset:n, \@@_backend_version_minor_gset:n}
-% At present, we don't have a primitive for the major version in \pdfTeX{},
-% but we anticipate one \ldots
+% The availability of the primitive is not universal, so we have to test
+% at load time.
% \begin{macrocode}
\cs_new_protected:Npx \@@_backend_version_major_gset:n #1
{
- \cs_if_exist:NTF \tex_pdfvariable:D
+%<*luatex>
+ \int_compare:nNnT \tex_luatexversion:D > { 106 }
{
- \int_compare:nNnT \tex_luatexversion:D > { 106 }
- {
- \exp_not:N \tex_global:D \tex_pdfvariable:D majorversion
- \exp_not:N \int_eval:n {#1} \scan_stop:
- }
+ \exp_not:N \tex_global:D \tex_pdfvariable:D majorversion
+ \exp_not:N \int_eval:n {#1} \scan_stop:
}
+%</luatex>
+%<*pdftex>
+ \cs_if_exist:NT \tex_pdfmajorversion:D
{
- \cs_if_exist:NT \tex_pdfmajorversion:D
- {
- \exp_not:N \tex_global:D \tex_pdfmajorversion:D
- \exp_not:N \int_eval:n {#1} \scan_stop:
- }
+ \exp_not:N \tex_global:D \tex_pdfmajorversion:D
+ \exp_not:N \int_eval:n {#1} \scan_stop:
}
+%</pdftex>
}
-\cs_new_protected:Npx \@@_backend_version_minor_gset:n #1
+\cs_new_protected:Npn \@@_backend_version_minor_gset:n #1
{
- \exp_not:N \tex_global:D
- \cs_if_exist:NTF \tex_pdfminorversion:D
- { \exp_not:N \tex_pdfminorversion:D }
- { \tex_pdfvariable:D minorversion }
- \exp_not:N \int_eval:n {#1} \scan_stop:
+ \tex_global:D
+%<*luatex>
+ \tex_pdfvariable:D minorversion
+%</luatex>
+%<*pdftex>
+ \tex_pdfminorversion:D
+%</pdftex>
+ \int_eval:n {#1} \scan_stop:
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[EXP]{\@@_backend_version_major:, \@@_backend_version_minor:}
-% At present, we don't have a primitive for the major version!
+% As above.
% \begin{macrocode}
\cs_new:Npx \@@_backend_version_major:
{
- \cs_if_exist:NTF \tex_pdfvariable:D
- {
- \int_compare:nNnTF \tex_luatexversion:D > { 106 }
- { \exp_not:N \tex_the:D \tex_pdfvariable:D majorversion }
- { 1 }
- }
- {
- \cs_if_exist:NTF \tex_pdfmajorversion:D
- { \exp_not:N \tex_the:D \tex_pdfmajorversion:D }
- { 1 }
- }
+%<*luatex>
+ \int_compare:nNnTF \tex_luatexversion:D > { 106 }
+ { \exp_not:N \tex_the:D \tex_pdfvariable:D majorversion }
+ { 1 }
+%</luatex>
+%<*pdftex>
+ \cs_if_exist:NTF \tex_pdfmajorversion:D
+ { \exp_not:N \tex_the:D \tex_pdfmajorversion:D }
+ { 1 }
+%</pdftex>
}
-\cs_new:Npx \@@_backend_version_minor:
+\cs_new:Npn \@@_backend_version_minor:
{
- \exp_not:N \tex_the:D
- \cs_if_exist:NTF \tex_pdfminorversion:D
- { \exp_not:N \tex_pdfminorversion:D }
- { \tex_pdfvariable:D minorversion }
+ \tex_the:D
+%<*luatex>
+ \tex_pdfvariable:D minorversion
+%</luatex>
+%<*pdftex>
+ \tex_pdfminorversion:D
+%</pdftex>
}
% \end{macrocode}
% \end{macro}
@@ -1109,13 +1211,13 @@
% \end{macro}
%
% \begin{macrocode}
-%</pdfmode>
+%</luatex|pdftex>
% \end{macrocode}
%
% \subsection{\texttt{dvipdfmx} backend}
%
% \begin{macrocode}
-%<*dvipdfmx|xdvipdfmx>
+%<*dvipdfmx|xetex>
% \end{macrocode}
%
% \begin{macro}{\@@_backend:n, \@@_backend:x}
@@ -1240,25 +1342,28 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[EXP]{\@@_backend_pageobject_ref:n}
+% Page references are easy in \texttt{dvipdfmx}/\XeTeX{}.
+% \begin{macrocode}
+\cs_new:Npn \@@_backend_pageobject_ref:n #1
+ { @page #1 }
+% \end{macrocode}
+% \end{macro}
+%
% \subsubsection{Annotations}
%
% \begin{variable}{\g_@@_landscape_bool}
-% There is a bug in \texttt{(x)dvipdfmx} which means annotations do
+% There is a bug in \texttt{dvipdfmx}/\XeTeX{} which means annotations do
% not rotate. As such, we need to know if landscape is active.
% \begin{macrocode}
\bool_new:N \g_@@_landscape_bool
-%<*package>
-\AtBeginDocument
+\cs_if_exist:NT \landscape
{
- \cs_if_exist:NT \landscape
- {
- \tl_put_right:Nn \landscape
- { \bool_gset_true:N \g_@@_landscape_bool }
- \tl_put_left:Nn \endlandscape
- { \bool_gset_false:N \g_@@_landscape_bool }
- }
+ \tl_put_right:Nn \landscape
+ { \bool_gset_true:N \g_@@_landscape_bool }
+ \tl_put_left:Nn \endlandscape
+ { \bool_gset_false:N \g_@@_landscape_bool }
}
-%</package>
% \end{macrocode}
% \end{variable}
%
@@ -1311,6 +1416,13 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{variable}{\g_@@_backend_link_int}
+% To track annotations which are links.
+% \begin{macrocode}
+\int_new:N \g_@@_backend_link_int
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}
% {\@@_backend_link_begin_goto:nnw, \@@_backend_link_begin_user:nnw}
% \begin{macro}{\@@_backend_link_begin:n}
@@ -1321,11 +1433,21 @@
{ \@@_backend_link_begin:n { #1 /Subtype /Link /A << /S /GoTo /D ( #2 ) >> } }
\cs_new_protected:Npn \@@_backend_link_begin_user:nnw #1#2
{ \@@_backend_link_begin:n {#1#2} }
-\cs_new_protected:Npn \@@_backend_link_begin:n #1
+\cs_new_protected:Npx \@@_backend_link_begin:n #1
{
- \@@_backend:n
+ \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
{
- bann
+ \exp_not:N \int_gincr:N \exp_not:N \g_@@_backend_link_int
+ }
+ \@@_backend:x
+ {
+ bann ~
+ \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
+ {
+ @pdf.lnk
+ \exp_not:N \int_use:N \exp_not:N \g_@@_backend_link_int
+ \c_space_tl
+ }
<<
/Type /Annot
#1
@@ -1340,9 +1462,17 @@
% \end{macro}
%
% \begin{macro}{\@@_backend_link_last:}
-% Data not available.
+% Available using the backend mechanism with a suitably-recent
+% version.
% \begin{macrocode}
-\cs_new:Npn \@@_backend_link_last: { }
+\cs_new:Npx \@@_backend_link_last:
+ {
+ \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
+ {
+ @pdf.lnk
+ \exp_not:N \int_use:N \exp_not:N \g_@@_backend_link_int
+ }
+ }
% \end{macrocode}
% \end{macro}
%
@@ -1354,10 +1484,13 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_backend_destination:nn, \@@_backend_destination_box:nn}
+% \begin{macro}{\@@_backend_destination:nn}
+% \begin{macro}{\@@_backend_destination:nnnn,\@@_backend_destination_aux:nnnn}
% Here, we need to turn the zoom into a scale. The method for \texttt{FitR}
% is from Alexander Grahn: the idea is to avoid needing to do any calculations
% in \TeX{} by using the backend data for \texttt{@xpos} and \texttt{@ypos}.
+% \texttt{/FitR} without rule spec doesn't work, so it falls back to
+% \texttt{/Fit} here.
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_destination:nn #1#2
{
@@ -1375,44 +1508,53 @@
{ fitbv } { /FitBV ~ @xpos }
{ fith } { /FitH ~ @ypos }
{ fitv } { /FitV ~ @xpos }
+ { fitr } { /Fit }
}
{ /XYZ ~ @xpos ~ @ypos ~ \fp_eval:n { (#2) / 100 } }
]
}
}
-\cs_new_protected:Npn \@@_backend_destination_box:nn #1#2
+\cs_new_protected:Npn \@@_backend_destination:nnnn #1#2#3#4
{
- \group_begin:
- \hbox_set:Nn \l_@@_internal_box {#2}
- \box_move_down:nn { \box_dp:N \l_@@_internal_box }
- {
- \hbox:n
- {
- \@@_backend:n { obj ~ @pdf_ #1 _llx ~ @xpos }
- \@@_backend:n { obj ~ @pdf_ #1 _lly ~ @ypos }
- }
- }
- \box_use:N \l_@@_internal_box
- \box_move_up:nn { \box_ht:N \l_@@_internal_box }
- {
- \hbox:n
- {
- \@@_backend:n
- {
- dest ~ (#1)
- [
- @thispage
- /FitR ~
- @pdf_ #1 _llx ~ @pdf_ #1 _lly ~
- @xpos ~ @ypos
- ]
- }
- }
- }
- \group_end:
+ \exp_args:Ne \@@_backend_destination_aux:nnnn
+ { \dim_eval:n {#2} } {#1} {#3} {#4}
+ }
+\cs_new_protected:Npn \@@_backend_destination_aux:nnnn #1#2#3#4
+ {
+ \vbox_to_zero:n
+ {
+ \__kernel_kern:n {#4}
+ \hbox:n
+ {
+ \@@_backend:n { obj ~ @pdf_ #2 _llx ~ @xpos }
+ \@@_backend:n { obj ~ @pdf_ #2 _lly ~ @ypos }
+ }
+ \tex_vss:D
+ }
+ \__kernel_kern:n {#1}
+ \vbox_to_zero:n
+ {
+ \__kernel_kern:n { -#3 }
+ \hbox:n
+ {
+ \@@_backend:n
+ {
+ dest ~ (#2)
+ [
+ @thispage
+ /FitR ~
+ @pdf_ #2 _llx ~ @pdf_ #2 _lly ~
+ @xpos ~ @ypos
+ ]
+ }
+ }
+ \tex_vss:D
+ }
+ \__kernel_kern:n { -#1 }
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \subsubsection{Structure}
%
@@ -1472,7 +1614,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</dvipdfmx|xdvipdfmx>
+%</dvipdfmx|xetex>
% \end{macrocode}
%
% \subsection{\texttt{dvisvgm} backend}
@@ -1498,6 +1640,7 @@
% \begin{macro}{\@@_backend_object_write:nn, , \@@_backend_object_write:nx}
% \begin{macro}{\@@_backend_object_now:nn, , \@@_backend_object_now:nx}
% \begin{macro}{\@@_backend_object_last:}
+% \begin{macro}[EXP]{\@@_backend_pageobject_ref:n}
% All no-ops here.
% \begin{macrocode}
\cs_new_protected:Npn \@@_backend_object_new:nn #1#2 { }
@@ -1507,12 +1650,14 @@
\cs_new_protected:Npn \@@_backend_object_now:nn #1#2 { }
\cs_new_protected:Npn \@@_backend_object_now:nx #1#2 { }
\cs_new:Npn \@@_backend_object_last: { }
+\cs_new:Npn \@@_backend_pageobject_ref:n #1 { }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \subsubsection{Structure}
%
@@ -1558,7 +1703,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3backend/l3backend.ins b/Master/texmf-dist/source/latex/l3backend/l3backend.ins
index 1c5289b1165..7fced393bd0 100644
--- a/Master/texmf-dist/source/latex/l3backend/l3backend.ins
+++ b/Master/texmf-dist/source/latex/l3backend/l3backend.ins
@@ -2,7 +2,7 @@
File l3backend.ins
-Copyright (C) 2019,2020 The LaTeX3 Project
+Copyright (C) 2019-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 1990-2020 The LaTeX3 Project
+Copyright (C) 1990-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -64,6 +64,7 @@ and all files in that bundle must be distributed together.
\from{l3backend-draw.dtx} {package,dvipdfmx}
\from{l3backend-graphics.dtx}{package,dvipdfmx}
\from{l3backend-pdf.dtx} {package,dvipdfmx}
+ \from{l3backend-opacity.dtx} {package,dvipdfmx}
}
}
\generate
@@ -76,6 +77,7 @@ and all files in that bundle must be distributed together.
\from{l3backend-draw.dtx} {package,dvips}
\from{l3backend-graphics.dtx}{package,dvips}
\from{l3backend-pdf.dtx} {package,dvips}
+ \from{l3backend-opacity.dtx} {package,dvips}
}
\file{l3backend-dvips.pro}
{
@@ -92,30 +94,46 @@ and all files in that bundle must be distributed together.
\from{l3backend-draw.dtx} {package,dvisvgm}
\from{l3backend-graphics.dtx}{package,dvisvgm}
\from{l3backend-pdf.dtx} {package,dvisvgm}
+ \from{l3backend-opacity.dtx} {package,dvisvgm}
}
}
\generate
{
- \file{l3backend-pdfmode.def}
+ \file{l3backend-luatex.def}
{
- \from{l3backend-basics.dtx} {package,pdfmode}
- \from{l3backend-color.dtx} {package,pdfmode}
- \from{l3backend-box.dtx} {package,pdfmode}
- \from{l3backend-draw.dtx} {package,pdfmode}
- \from{l3backend-graphics.dtx}{package,pdfmode}
- \from{l3backend-pdf.dtx} {package,pdfmode}
+ \from{l3backend-basics.dtx} {package,luatex}
+ \from{l3backend-color.dtx} {package,luatex}
+ \from{l3backend-box.dtx} {package,luatex}
+ \from{l3backend-draw.dtx} {package,luatex}
+ \from{l3backend-graphics.dtx}{package,luatex}
+ \from{l3backend-pdf.dtx} {package,luatex}
+ \from{l3backend-opacity.dtx} {package,luatex}
}
}
\generate
{
- \file{l3backend-xdvipdfmx.def}
+ \file{l3backend-pdftex.def}
{
- \from{l3backend-basics.dtx} {package,xdvipdfmx}
- \from{l3backend-color.dtx} {package,xdvipdfmx}
- \from{l3backend-box.dtx} {package,xdvipdfmx}
- \from{l3backend-draw.dtx} {package,xdvipdfmx}
- \from{l3backend-graphics.dtx}{package,xdvipdfmx}
- \from{l3backend-pdf.dtx} {package,xdvipdfmx}
+ \from{l3backend-basics.dtx} {package,pdftex}
+ \from{l3backend-color.dtx} {package,pdftex}
+ \from{l3backend-box.dtx} {package,pdftex}
+ \from{l3backend-draw.dtx} {package,pdftex}
+ \from{l3backend-graphics.dtx}{package,pdftex}
+ \from{l3backend-pdf.dtx} {package,pdftex}
+ \from{l3backend-opacity.dtx} {package,pdftex}
+ }
+ }
+\generate
+ {
+ \file{l3backend-xetex.def}
+ {
+ \from{l3backend-basics.dtx} {package,xetex}
+ \from{l3backend-color.dtx} {package,xetex}
+ \from{l3backend-box.dtx} {package,xetex}
+ \from{l3backend-draw.dtx} {package,xetex}
+ \from{l3backend-graphics.dtx}{package,xetex}
+ \from{l3backend-pdf.dtx} {package,xetex}
+ \from{l3backend-opacity.dtx} {package,xetex}
}
}
diff --git a/Master/texmf-dist/source/latex/l3build/l3build.dtx b/Master/texmf-dist/source/latex/l3build/l3build.dtx
index a513e3e6c50..198042469e6 100644
--- a/Master/texmf-dist/source/latex/l3build/l3build.dtx
+++ b/Master/texmf-dist/source/latex/l3build/l3build.dtx
@@ -69,9 +69,10 @@
\luavarset{builddir} {maindir .. "/build"} {Directory for building and testing}
\luavarset{distribdir}{builddir .. "/distrib"}{Directory for generating distribution structure}
\luavarset{localdir} {builddir .. "/local"} {Directory for extracted files in \enquote{sandboxed} \TeX{} runs}
+\luavarset{resultdir} {builddir .. "/result"} {Directory for PDF files when using PDF-based tests}
\luavarset{testdir} {builddir .. "/test"} {Directory for running tests}
\luavarset{typesetdir}{builddir .. "/doc"} {Directory for building documentation}
-\luavarset{unpackdir} {builddir .. "/unpack"} {Directory for unpacking sources}
+\luavarset{unpackdir} {builddir .. "/unpacked"}{Directory for unpacking sources}
\luavarseparator
\luavarset{ctandir}{distribdir .. "/ctan"}{Directory for organising files for CTAN}
\luavarset{tdsdir} {distribdir .. "/tds"} {Directory for organised files into TDS structure}
@@ -234,7 +235,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-25}
+% \date{Released 2020-06-04}
%
% \maketitle
% \tableofcontents
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
index 5383ac46247..1771ac26668 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
@@ -2,7 +2,7 @@
%
%% File: l3benchmark.dtx
%
-% Copyright (C) 2011,2012,2014-2020 The LaTeX3 Project
+% Copyright (C) 2011,2012,2014-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -38,7 +38,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -125,14 +125,12 @@
% Our working unit is the scaled second, namely $2^{-16}$ seconds.
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage{l3benchmark}{2020-01-12}{}
+\ProvidesExplPackage{l3benchmark}{2021-02-18}{}
{L3 Experimental benchmarking}
-%</package>
% \end{macrocode}
%
% \subsection{Additions to \pkg{l3sys}: elapsed time}
@@ -141,7 +139,7 @@
%<@@=sys>
% \end{macrocode}
%
-% \begin{macro}[EXP]{\sys_timer:}
+% \begin{macro}[EXP]{\sys_timer:, \@@_elapsedtime:, \@@_resettimer:}
% \begin{macro}[EXP,pTF]{\sys_if_timer_exist:}
% In \LuaTeX{}, use emulation (see \pkg{l3luatex}),
% otherwise try to locate the primitive. The
@@ -149,8 +147,27 @@
% \begin{macrocode}
\sys_if_engine_luatex:TF
{
+ \cs_new:Npn \@@_elapsedtime: { }
+ \cs_new:Npn \@@_resettimer: { }
+ \lua_now:n
+ {
+ local~gettimeofday = os.gettimeofday~
+ local~epoch = gettimeofday() - os.clock()~
+ local~write = tex.write~
+ local~tointeger = math.tointeger~
+ local~id = luatexbase.new_luafunction'@@_elapsedtime:'
+ lua.get_functions_table()[id] = function()
+ write(tointeger((gettimeofday() - epoch)*65536 // 1))
+ end~
+ token.set_lua('@@_elapsedtime:', id, 'global')
+ id = luatexbase.new_luafunction'@@_resettimer:'
+ lua.get_functions_table()[id] = function()
+ epoch = gettimeofday()
+ end~
+ token.set_lua('@@_resettimer:', id, 'global', 'protected')
+ }
\cs_new:Npn \sys_timer:
- { \lua_now:n { l3kernel.elapsedtime() } }
+ { \@@_elapsedtime: }
}
{
\cs_if_exist:NT \tex_elapsedtime:D
@@ -165,8 +182,7 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\sys_gzero_timer:, \@@_timer_fp:}
-% \begin{variable}{\g_@@_timer_base_fp}
+% \begin{macro}{\sys_gzero_timer:}
% Three case, and in each case we define \cs{sys_gzero_timer:}.
% \begin{macrocode}
\cs_if_exist:NTF \sys_timer:
@@ -174,7 +190,7 @@
\sys_if_engine_luatex:TF
{
\cs_new_protected:Npn \sys_gzero_timer:
- { \lua_now:n { l3kernel.resettimer() } }
+ { \@@_resettimer: }
}
{ \cs_new_protected:Npn \sys_gzero_timer: { \tex_resettimer:D } }
}
@@ -200,7 +216,6 @@
}
}
% \end{macrocode}
-% \end{variable}
% \end{macro}
%
% \subsection{Benchmarking code}
@@ -576,7 +591,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.ins b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.ins
index ca4c280f820..4b72b69db33 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.ins
+++ b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.ins
@@ -2,7 +2,7 @@
File: l3benchmark.ins
-Copyright (C) 2011,2018-2020 The LaTeX3 Project
+Copyright (C) 2011,2018-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2018-2020 The LaTeX3 Project
+Copyright (C) 2018-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx b/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx
new file mode 100644
index 00000000000..686df60ccd4
--- /dev/null
+++ b/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx
@@ -0,0 +1,591 @@
+% \iffalse meta-comment
+%
+%% File: l3bitset.dtx
+%
+% Copyright (C) 2020,2021 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3bitset bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full]{l3doc}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+% \title{^^A
+% The \pkg{l3bitset} package \\ Experimental bitsets ^^A
+% }
+%
+% \author{^^A
+% The \LaTeX{} Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released 2021-02-18}
+%
+% \maketitle
+% \begin{documentation}
+%
+% This package defines and implements the data type \texttt{bitset}, a vector of
+% bits. The size of the vector may grow dynamically.
+% Individual bits can be set and unset by names pointing to an index position.
+% The names |1|, |2|, |3|, \ldots\ are predeclared and point to the
+% index positions $1$, $2$, $3$,\ldots. More names can be added and existing names can
+% be changed.
+% The index is like all other indices in \pkg{expl3} modules \emph{1-based}.
+% A \texttt{bitset} can be output as binary number or---as needed e.g. in a
+% PDF dictionary---as decimal (arabic) number.
+% Currently only a small subset of the functions provided by the \pkg{bitset}
+% package are implemented here, mainly the functions needed to use bitsets in
+% PDF dictionaries.
+%
+% The bitset is stored as a string (but one shouldn't rely on the internal
+% representation) and so the vector size is theoretically
+% unlimited, only restricted by \TeX-memory. But the functions to set and clear
+% bits uses integer functions for the index so bitsets can't be longer
+% than $2^{31} - 1$.
+% The export function
+% \cs{bitset_to_arabic:N} can use functions from the \texttt{int} module only if
+% the largest index used for this bitset is smaller then $32$, for longer
+% bitsets \texttt{fp} is used and this is slower.
+%
+% \section{Creating bitsets}
+% \begin{function}[added = 2021-01-26,updated=2020-12-29]
+% {\bitset_new:N,\bitset_new:c,\bitset_new:Nn, \bitset_new:cn}
+% \begin{syntax}
+% \cs{bitset_new:N} \meta{bitset var} \\
+% \cs{bitset_new:Nn} \meta{bitset var}
+% \{
+% \meta{name1} |=| \meta{index1} |,|
+% \meta{name2} |=| \meta{index2} |,| \ldots{}
+% \}
+% \end{syntax}
+% Creates a new \meta{bitset var} or raises an error if the name is already taken.
+% The declaration is global. The \meta{bitset var} is initially $0$.
+%
+% Bitsets are implemented as string variables consisting of
+% \texttt{1}'s and \texttt{0}'s.
+% The rightmost number is the index position $1$, so
+% the string variable can be viewed directly as the binary number.
+% But one shouldn't rely on the internal representation, but use the
+% dedicated \cs{bitset_to_bin:N} instead to get the binary number.
+%
+% The name--index pairs given in the second
+% argument of \cs{bitset_new:Nn} declares names for some indices,
+% which can be used to set and unset bits.
+% The names |1|, |2|, |3|, \ldots\ are predeclared and point to the
+% index positions $1$, $2$, $3$, \ldots.
+%
+% \meta{index\ldots} should be a positive number or an
+% \meta{integer expression} which evaluates to a positive number.
+% The expression is evaluated when the index is used, not a declaration time.
+% The names \meta{name\ldots}
+% should be unique. Using a number as name, e.g.~|10=1|, is allowed, it
+% then overwrites the predeclared name |10|,
+% but the index position $10$ can then only be reached if some other
+% name for it exists, e.g. |ten=10|.
+% It is not necessary to give every index
+% a name, and an index can have more than one name. The named index
+% can be extended or changed with the next function.
+%
+% \end{function}
+% \begin{function}[added = 2021-01-26]
+% {\bitset_addto_named_index:Nn}
+% \begin{syntax}
+% \cs{bitset_addto_named_index:Nn} \meta{bitset var}
+% \{
+% \meta{name1} |=| \meta{index1} |,|
+% \meta{name2} |=| \meta{index2} |,| \ldots{}
+% \}
+% \end{syntax}
+% This extends or changes the name--index pairs for \meta{bitset var}
+% globally as described for \cs{bitset_new:Nn}.
+%
+% For example after these settings
+%
+% \begin{verbatim}
+% \bitset_new:Nn \l_pdfannot_F_bitset
+% {
+% Invisible = 1,
+% Hidden = 2,
+% Print = 3,
+% NoZoom = 4,
+% NoRotate = 5,
+% NoView = 6,
+% ReadOnly = 7,
+% Locked = 8,
+% ToggleNoView = 9,
+% LockedContents = 10
+% }
+% \bitset_addto_named_index:Nn \l_pdfannot_F_bitset
+% {
+% print = 3
+% }
+% \end{verbatim}
+% it is possible to set bit $3$ by using any of this alternatives:
+% \begin{verbatim}
+% \bitset_set_true:Nn \l_pdfannot_F_bitset {Print}
+% \bitset_set_true:Nn \l_pdfannot_F_bitset {print}
+% \bitset_set_true:Nn \l_pdfannot_F_bitset {3}
+% \end{verbatim}
+% \end{function}
+%
+% \begin{function}[EXP, pTF,added = 2021-01-26]
+% { \bitset_if_exist:N, \bitset_if_exist:c }
+% \begin{syntax}
+% \cs{bitset_if_exist_p:N} \meta{bitset var}
+% \cs{bitset_if_exist:NTF} \meta{bitset var} \Arg{true code} \Arg{false code}%
+% \end{syntax}
+% Tests whether the \meta{bitset var} exist.
+% \end{function}
+%
+% \section{Setting and unsetting bits}
+%
+% \begin{function}[added = 2021-01-26]
+% { \bitset_set_true:Nn, \bitset_set_true:cn, \bitset_gset_true:Nn, \bitset_gset_true:cn }
+% \begin{syntax}
+% \cs{bitset_set_true:Nn} \meta{bitset var} \Arg{name}\\
+% \cs{bitset_gset_true:Nn} \meta{bitset var} \Arg{name}
+% \end{syntax}
+% This sets the bit of the index position represented by \Arg{name} to $1$.
+% \Arg{name} should be either one of the predeclared names
+% |1|, |2|, |3|, \ldots, or one of the names added manually.
+% Index position are 1-based.
+% If needed the length of the bit vector is enlarged.
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+% { \bitset_set_false:Nn, \bitset_set_false:cn, \bitset_gset_false:Nn, \bitset_set_false:cn }
+% \begin{syntax}
+% \cs{bitset_set_false:Nn} \meta{bitset var} \Arg{name}\\
+% \cs{bitset_gset_false:Nn} \meta{bitset var} \Arg{name}
+% \end{syntax}
+% This unsets the bit of the index position represented by \Arg{name} (sets
+% it to $0$).
+% \Arg{name} should be either one of the predeclared names
+% |1|, |2|, |3|, \ldots, or one of the names added manually.
+% The index is $1$-based. If the index position is larger
+% than the current length of the bit vector
+% nothing happens. If the leading (left most) bit is unset,
+% zeros are not trimmed but stay in the bit vector and are still shown
+% by \cs{bitset_show:N}.
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+% {\bitset_clear:N,\bitset_clear:c,\bitset_gclear:N,\bitset_gclear:c}
+% \begin{syntax}
+% \cs{bitset_clear:N} \meta{bitset var} \\
+% \cs{bitset_gclear:N} \meta{bitset var}
+% \end{syntax}
+% This resets the bitset to the initial state. The declared names are not changed.
+% \end{function}
+%
+% \section{Using bitsets}
+%
+% \begin{function}[EXP,added = 2021-01-26]
+% { \bitset_item:Nn, \bitset_item:cn }
+% \begin{syntax}
+% \cs{bitset_item:Nn} \meta{bitset var} \Arg{name}
+% \end{syntax}
+% \cs{bitset_item:Nn} outputs \texttt{1} if the bit with
+% the index number represented by \Arg{name} is set and \texttt{0} otherwise.
+% \Arg{name} is either one of the predeclared names
+% |1|, |2|, |3|, \ldots, or one of the names added manually.
+% \end{function}
+%
+% \begin{function}[EXP,added = 2021-01-26]
+% {\bitset_to_bin:N, \bitset_to_bin:c}
+% \begin{syntax}
+% \cs{bitset_to_bin:N} \meta{bitset var}
+% \end{syntax}
+% This leaves the current value of the bitset expressed as
+% a binary (string) number in the input stream.
+% If no bit has been set yet, the output is zero.
+% \end{function}
+% \begin{function}[EXP,added = 2021-01-26]
+% {\bitset_to_arabic:N, \bitset_to_arabic:c}
+% \begin{syntax}
+% \cs{bitset_to_arabic:N} \meta{bitset var}
+% \end{syntax}
+% This leaves the current value of the bitset expressed as
+% a decimal number in the input stream. If no bit has been set yet,
+% the output is zero. The function uses \cs{int_from_bin:n} if the largest
+% index that have been set or unset is smaller then $32$, and a slower implementation
+% based on \cs{fp_eval:n} otherwise.
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+% {\bitset_show:N, \bitset_show:c}
+% \begin{syntax}
+% \cs{bitset_show:N} \meta{bitset var}
+% \end{syntax}
+% Displays the binary and decimal value of the \meta{bitset var} on the terminal,
+% \end{function}
+%
+% \begin{function}[added = 2021-01-26]
+% {\bitset_log:N, \bitset_log:c}
+% \begin{syntax}
+% \cs{bitset_log:N} \meta{bitset var}
+% \end{syntax}
+% Writes the value of the \meta{bitset var} in the log file.
+% \end{function}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+% \section{\pkg{l3bitset} implementation}
+% \TestFiles{m3bitset001,m3bitset002}
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=bitset>
+% \end{macrocode}
+% \begin{macrocode}
+\ProvidesExplPackage{l3bitset}{2021-02-18}{}
+ {L3 Experimental bitset support}
+% \end{macrocode}
+% A bitset is a string variable.
+% \begin{macro}
+% {
+% \bitset_new:N, \bitset_new:c
+% }
+% \begin{macrocode}
+\cs_new_protected:Npn \bitset_new:N #1
+ {
+ \__kernel_chk_if_free_cs:N #1
+ \cs_gset_eq:NN #1 \c_zero_str
+ \prop_new:c { g__bitset_ \cs_to_str:N #1 _name_prop }
+ }
+
+\cs_new_protected:Npn \bitset_new:Nn #1 #2
+ {
+ \__kernel_chk_if_free_cs:N #1
+ \cs_gset_eq:NN #1 \c_zero_str
+ \prop_new:c { g__bitset_ \cs_to_str:N #1 _name_prop }
+ \prop_gset_from_keyval:cn
+ { g__bitset_ \cs_to_str:N #1 _name_prop }
+ {#2}
+ }
+\cs_generate_variant:Nn \bitset_new:N { c }
+% \end{macrocode}
+% \end{macro}
+% \begin{variable}{\l_@@_tmpa_prop}
+% A scratch prop to be able to extend the names properties.
+% \begin{macrocode}
+\prop_new:N \l_@@_tmpa_prop
+% \end{macrocode}
+% \end{variable}
+% \begin{macro}
+% {
+% \bitset_addto_named_index:Nn
+% }
+% \begin{macrocode}
+\cs_new_protected:Npn \bitset_addto_named_index:Nn #1#2
+ {
+ \prop_set_from_keyval:Nn \l_@@_tmpa_prop {#2}
+ \prop_map_inline:Nn \l_@@_tmpa_prop
+ {
+ \prop_gput:cnn
+ { g_@@_ \cs_to_str:N #1 _name_prop }
+ {##1}
+ {##2}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[EXP,pTF]
+% {
+% \bitset_if_exist:N, \bitset_if_exist:c
+% }
+% Existence tests.
+% \begin{macrocode}
+\prg_new_eq_conditional:NNn
+ \bitset_if_exist:N \str_if_exist:N { p , T , F , TF }
+\prg_new_eq_conditional:NNn
+ \bitset_if_exist:c \str_if_exist:c
+ { p , T , F , TF }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_set_true:Nn, \@@_gset_true:Nn, \@@_set_false:Nn, \@@_gset_false:Nn}
+% \begin{macro}{\@@_set:NNnN}
+% The internal command uses only numbers (integer expressions) for the
+% position.
+% A bit is set by either extending the string or by splitting it and
+% then inserting an $1$. It is not checked if the value was already $1$.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_true:Nn #1#2
+ { \@@_set:NNnN \str_set:Nx #1 {#2} 1 }
+\cs_new_protected:Npn \@@_gset_true:Nn #1#2
+ { \@@_set:NNnN \str_gset:Nx #1 {#2} 1 }
+\cs_new_protected:Npn \@@_set_false:Nn #1#2
+ { \@@_set:NNnN \str_set:Nx #1 {#2} 0 }
+\cs_new_protected:Npn \@@_gset_false:Nn #1#2
+ { \@@_set:NNnN \str_gset:Nx #1 {#2} 0 }
+\cs_new_protected:Npn \@@_set:NNnN #1#2#3#4
+ {
+ \int_compare:nNnT {#3} > { 0 }
+ {
+ \int_compare:nNnTF { \str_count:N #2 } < {#3}
+ {
+ #1 #2
+ {
+ #4
+ \prg_replicate:nn { #3 - \str_count:N #2 - 1 } { 0 }
+ #2
+ }
+ }
+ {
+ #1 #2
+ {
+ \str_range:Nnn #2 { 1 } { -1 - (#3) }
+ #4
+ \str_range:Nnn #2 { 1 - (#3) } { -1 }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_internal_int}
+% \begin{macrocode}
+\int_new:N \l_@@_internal_int
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[TF]{\@@_test_digits:n}
+% \begin{macro}{\@@_test_digits_end:n}
+% \begin{macro}{\@@_test_digits:wn}
+% \url{https://chat.stackexchange.com/transcript/message/56878159#56878159}
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \@@_test_digits:n #1 { TF }
+ {
+ \tex_afterassignment:D \@@_test_digits:w
+ \l_@@_internal_int = 0 \tl_trim_spaces_apply:nN {#1} \tl_to_str:n
+ \@@_test_digits_end:
+ \use_i:nnn \if_false:
+ \@@_test_digits_end:
+ \if_int_compare:w \c_zero_int < \l_@@_internal_int
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+\cs_new_eq:NN \@@_test_digits_end: \exp_stop_f:
+\cs_new_protected:Npn \@@_test_digits:w #1 \@@_test_digits_end: { }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \bitset_set_true:Nn, \bitset_set_true:cn,
+% \bitset_gset_true:Nn, \bitset_gset_true:cn,
+% }
+% \begin{macro}{\@@_set_aux:NNn}
+% The user commands must first translate the argument to an index number.
+% \begin{macrocode}
+\cs_new_protected:Npn \bitset_set_true:Nn #1#2
+ { \@@_set:NNn \@@_set_true:Nn #1 {#2} }
+\cs_new_protected:Npn \bitset_gset_true:Nn #1#2
+ { \@@_set:NNn \@@_gset_true:Nn #1 {#2} }
+\cs_new_protected:Npn \bitset_set_false:Nn #1#2
+ { \@@_set:NNn \@@_set_false:Nn #1 {#2} }
+\cs_new_protected:Npn \bitset_gset_false:Nn #1#2
+ { \@@_set:NNn \@@_gset_false:Nn #1 {#2} }
+\cs_new_protected:Npn \@@_set:NNn #1#2#3
+ {
+ \prop_if_in:cnTF { g_@@_ \cs_to_str:N #2 _name_prop } {#3}
+ {
+ #1 #2
+ {
+ \prop_item:cn { g_@@_ \cs_to_str:N #2 _name_prop } {#3}
+ }
+ }
+ {
+ \@@_test_digits:nTF {#3}
+ {
+ #1 #2 {#3}
+ \prop_gput:cnn { g_@@_ \cs_to_str:N #2 _name_prop } {#3} {#3}
+ }
+ {
+ \__kernel_msg_warning:nnxx { bitset } { bitset-unknown-name }
+ { \token_to_str:N #2 }
+ { \tl_to_str:n {#3} }
+ }
+ }
+ }
+\cs_generate_variant:Nn \bitset_set_true:Nn { c }
+\cs_generate_variant:Nn \bitset_gset_true:Nn { c }
+\cs_generate_variant:Nn \bitset_set_false:Nn { c }
+\cs_generate_variant:Nn \bitset_gset_false:Nn { c }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \bitset_clear:N, \bitset_clear:c,
+% \bitset_gclear:N, \bitset_gclear:c
+% }
+% \begin{macrocode}
+\cs_new_protected:Npn \bitset_clear:N #1
+ {
+ \str_set_eq:NN #1 \c_zero_str
+ }
+\cs_new_protected:Npn \bitset_gclear:N #1
+ {
+ \str_gset_eq:NN #1 \c_zero_str
+ }
+\cs_generate_variant:Nn \bitset_clear:N { c }
+\cs_generate_variant:Nn \bitset_gclear:N { c }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}
+% {
+% \bitset_to_arabic:N, \bitset_to_arabic:c,
+% \bitset_to_bin:N, \bitset_to_bin:c,
+% }
+% The naming of the commands follow the names in the \texttt{int} module.
+% \cs{bitset_to_arabic:N} uses \cs{int_from_bin:n} if the string is shorter
+% then $32$ and the slower \cs{fp_eval} for larger bitsets.
+% \begin{macrocode}
+\cs_new:Npn \bitset_to_arabic:N #1
+ {
+ \int_compare:nNnTF { \str_count:N #1 } < { 32 }
+ { \exp_args:No \int_from_bin:n {#1} }
+ {
+ \exp_after:wN \@@_to_int:nN \exp_after:wN 0
+ #1 \q_recursion_tail \q_recursion_stop
+ }
+ }
+
+\cs_new:Npn \@@_to_int:nN #1#2
+ {
+ \quark_if_recursion_tail_stop_do:Nn #2 {#1}
+ \exp_args:Nf \@@_to_int:nN { \fp_eval:n { #1 * 2 + #2 } }
+ }
+
+\cs_new:Npn \bitset_to_bin:N #1
+ {
+ #1
+ }
+\cs_generate_variant:Nn \bitset_to_arabic:N { c }
+\cs_generate_variant:Nn \bitset_to_bin:N { c }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}
+% {
+% \bitset_item:Nn, \bitset_item:cn
+% }
+% All bits that have been set at anytime have an entry in the prop,
+% so we can take everything else as $0$.
+% \begin{macrocode}
+\cs_new:Npn \bitset_item:Nn #1#2
+ {
+ \prop_if_in:cnTF { g_@@_ \cs_to_str:N #1 _name_prop } {#2}
+ {
+ \int_eval:n
+ {
+ \str_item:Nn #1
+ { 0 - ( \prop_item:cn { g_@@_ \cs_to_str:N #1 _name_prop } {#2} ) }
+ +0
+ }
+ }
+ {
+ 0
+ }
+ }
+\cs_generate_variant:Nn \bitset_item:Nn { c }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}
+% {
+% \bitset_show:N, \bitset_show:c,
+% \bitset_log:N, \bitset_log:c
+% }
+% \begin{macrocode}
+\cs_new_protected:Npn \bitset_show:N { \@@_show:NN \msg_show:nnxxxx }
+\cs_generate_variant:Nn \bitset_show:N { c }
+\cs_new_protected:Npn \bitset_log:N { \@@_show:NN \msg_log:nnxxxx }
+\cs_generate_variant:Nn \bitset_log:N { c }
+\cs_new_protected:Npn \bitset_show_named_index:N { \@@_show_named_index:NN \msg_show:nnxxxx }
+\cs_generate_variant:Nn \bitset_show_named_index:N { c }
+\cs_new_protected:Npn \@@_show:NN #1#2
+ {
+ \__kernel_chk_defined:NT #2
+ {
+ #1 { LaTeX/bitset } { show-bitset }
+ { \token_to_str:N #2 }
+ { \bitset_to_bin:N #2 }
+ { \bitset_to_arabic:N #2 }
+ { }
+ }
+ }
+\cs_new_protected:Npn \@@_show_named_index:NN #1#2
+ {
+ \__kernel_chk_defined:NT #2
+ {
+ #1 { LaTeX/bitset } { show-names }
+ { \token_to_str:N #2 }
+ { \prop_map_function:cN { g_@@_ \cs_to_str:N #2 _name_prop } \msg_show_item:nn }
+ { }
+ { }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Messages}
+% \begin{macrocode}
+ \__kernel_msg_new:nnn { bitset } { show-bitset }
+ {
+ The~bitset~#1~has~the~representation: \\
+ >~binary:~#2 \\
+ >~arabic:~#3 .
+ }
+\__kernel_msg_new:nnn { bitset } { show-names }
+ {
+ The~bitset~#1~
+ \tl_if_empty:nTF {#2}
+ { knows~no~names~yet \\>~ . }
+ { knows~the~name/index~pairs~(without~outer~braces): #2 . }
+ }
+\__kernel_msg_new:nnn { bitset } { bitset-unknown-name }
+ { The~name~'#2'~is~unknown~for~bitset~\tl_to_str:n {#1} }
+
+% \end{macrocode}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+% \end{macro}
+%
+% \end{implementation}
+%
+% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.ins b/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.ins
index e968f1bf838..1f693d29569 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.ins
+++ b/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.ins
@@ -1,8 +1,8 @@
\iffalse meta-comment
-File: l3cctab.ins
+File: l3bitset.ins
-Copyright (C) 2018-2020 The LaTeX3 Project
+Copyright (C) 2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2018-2020 The LaTeX3 Project
+Copyright (C) 2020 The LaTeX3 Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -53,9 +53,9 @@ and all files in that bundle must be distributed together.
\keepsilent
-\generate{\file{l3cctab.sty}
+\generate{\file{l3bitset.sty}
{
- \from{l3cctab.dtx}{package}
+ \from{l3bitset.dtx} {package}
}
}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx b/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx
deleted file mode 100644
index f7418e117f6..00000000000
--- a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx
+++ /dev/null
@@ -1,556 +0,0 @@
-% \iffalse meta-comment
-%
-%% File: l3cctab.dtx
-%
-% Copyright (C) 2018-2020 The LaTeX3 Project
-%
-% It may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this
-% license or (at your option) any later version. The latest version
-% of this license is in the file
-%
-% http://www.latex-project.org/lppl.txt
-%
-% This file is part of the "l3experimental bundle" (The Work in LPPL)
-% and all files in that bundle must be distributed together.
-%
-% -----------------------------------------------------------------------
-%
-% The development version of the bundle can be found at
-%
-% https://github.com/latex3/latex3
-%
-% for those people who are interested.
-%
-%<*driver|package>
-\RequirePackage{expl3}
-%</driver|package>
-%<*driver>
-\documentclass[full]{l3doc}
-\begin{document}
- \DocInput{\jobname.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \title{^^A
-% The \pkg{l3cctab} package\\ Experimental category code tables^^A
-% }
-%
-% \author{^^A
-% The \LaTeX3 Project\thanks
-% {^^A
-% E-mail:
-% \href{mailto:latex-team@latex-project.org}
-% {latex-team@latex-project.org}^^A
-% }^^A
-% }
-%
-% \date{Released 2020-01-12}
-%
-% \maketitle
-%
-% \begin{documentation}
-%
-% \section{\pkg{l3cctab} documentation}
-%
-% A category code table enables rapid switching of all category codes in
-% one operation. For \LuaTeX{}, this is possible over the entire Unicode
-% range. For other engines, only the $8$-bit range ($0$-$255$) is covered by
-% such tables.
-%
-% \subsection{Creating and initialising category code tables}
-%
-% \begin{function}{\cctab_new:N,\cctab_new:c}
-% \begin{syntax}
-% \cs{cctab_new:N} \meta{category code table}
-% \end{syntax}
-% Creates a new \meta{category code table} variable or raises an error if
-% the name is already taken. The declaration is global. The
-% \meta{category code table} is initialised with the codes
-% as used by \IniTeX{}.
-% \end{function}
-%
-% \begin{function}{\cctab_const:Nn,\cctab_const:cn}
-% \begin{syntax}
-% \cs{cctab_const:Nn} \meta{category code table} \Arg{category code set up}
-% \end{syntax}
-% Creates a new \meta{category code table} with the category code settings in
-% force at the time the function is called, and applies the
-% \meta{category code set up} on top of prevailing settings, then saves
-% as a constant table.
-% \end{function}
-%
-% \begin{function}{\cctab_gset:Nn,\cctab_gset:cn}
-% \begin{syntax}
-% \cs{cctab_gset:Nn} \meta{category code table} \Arg{category code set up}
-% \end{syntax}
-% Sets the \meta{category code table} to apply the category codes
-% which apply when the prevailing régime is modified by the
-% \meta{category code set up}. Thus within a standard code block
-% the starting point will be the code applied by \cs{c_code_cctab}.
-% The assignment of the table is global: the underlying primitive does
-% not respect grouping.
-% \end{function}
-%
-% \subsection{Using category code tables}
-%
-% \begin{function}{\cctab_begin:N,\cctab_begin:c}
-% \begin{syntax}
-% \cs{cctab_begin:N} \meta{category code table}
-% \end{syntax}
-% Switches the category codes in force to those stored in the
-% \meta{category code table}. The prevailing codes before the
-% function is called are added to a stack, for use with
-% \cs{cctab_end:}. This function does not start a \TeX{} group.
-% \end{function}
-%
-% \begin{function}{\cctab_end:}
-% \begin{syntax}
-% \cs{cctab_end:}
-% \end{syntax}
-% Ends the scope of a \meta{category code table} started using
-% \cs{cctab_begin:N}, retuning the codes to those in force before
-% the matching \cs{cctab_begin:N} was used.
-% \end{function}
-%
-% \subsection{Category code table conditionals}
-%
-% \begin{function}[pTF]{\cctab_if_exist:N,\cctab_if_exist:c}
-% \begin{syntax}
-% \cs{cctab_if_exist_p:N} \meta{category code table}
-% \cs{cctab_if_exist:NTF} \meta{category code table} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Tests whether the \meta{category code table} is currently defined.
-% This does not check that the \meta{category code table} really is a
-% category code table.
-% \end{function}
-%
-% \subsection{Constant category code tables}
-%
-% \begin{variable}{\c_code_cctab}
-% Category code table for the code environment. This does not include
-% setting the behaviour of the line-end character, which is only
-% altered by \cs{ExplSyntaxOn}.
-% \end{variable}
-%
-% \begin{variable}{\c_document_cctab}
-% Category code table for a standard \LaTeX{} document. This does not
-% include setting the behaviour of the line-end character, which is
-% only altered by \cs{ExplSyntaxOff}.
-% \end{variable}
-%
-% \begin{variable}{\c_initex_cctab}
-% Category code table as set up by \IniTeX{}.
-% \end{variable}
-%
-% \begin{variable}{\c_other_cctab}
-% Category code table where all characters have category code $12$
-% (other).
-% \end{variable}
-%
-% \begin{variable}{\c_str_cctab}
-% Category code table where all characters have category code $12$
-% (other) with the exception of spaces, which have category code
-% $10$ (space).
-% \end{variable}
-%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3cctab} implementation}
-%
-% \begin{macrocode}
-%<*initex|package>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=cctab>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage{l3cctab}{2020-01-12}{}
- {L3 Experimental category code tables}
-%</package>
-% \end{macrocode}
-%
-% \begin{variable}{\g_@@_allocate_int}
-% \begin{variable}{\g_@@_stack_int}
-% \begin{variable}{\g_@@_stack_seq}
-% To allocate category code tables, both the read-only and stack
-% tables need to be followed. There is also a sequence stack for the
-% dynamic tables themselves.
-% \begin{macrocode}
-\int_new:N \g_@@_allocate_int
-\int_gset:Nn \g_@@_allocate_int { -1 }
-\int_new:N \g_@@_stack_int
-\seq_new:N \g_@@_stack_seq
-% \end{macrocode}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_tmp_tl}
-% Scratch space.
-% \begin{macrocode}
-\tl_new:N \l_@@_tmp_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\cctab_new:N,\cctab_new:c}
-% \begin{macro}{\@@_begin:N,\@@_begin:c}
-% \begin{macro}{\@@_end:}
-% \begin{macro}{\cctab_gset:Nn,\cctab_gset:cn}
-% As \LuaTeX{} offers engine support for category code tables, and this is
-% entirely lacking from the other engines, we need two complementary
-% approaches here. Rather than intermix them, we split the set up based on
-% engine. (Some future \XeTeX{} may add support, at which point the
-% conditional here would be subtly different.)
-%
-% First, the \LuaTeX{} case.
-% \begin{macrocode}
-\sys_if_engine_luatex:TF
- {
-% \end{macrocode}
-% Creating a new category code table is done slightly differently
-% from other registers. Low-numbered tables are more efficiently-stored
-% than high-numbered ones. There is also a need to have a stack of
-% flexible tables as well as the set of read-only ones. To satisfy both
-% of these requirements, odd numbered tables are used for read-only
-% tables, and even ones for the stack. Here, therefore, the odd numbers
-% are allocated.
-% \begin{macrocode}
- \cs_new_protected:Npn \cctab_new:N #1
- {
- \__kernel_chk_if_free_cs:N #1
-%<*initex>
- \int_gadd:Nn \g_@@_allocate_int { 2 }
- \int_compare:nNnTF
- \g_@@_allocate_int < { \c_max_register_int + 1 }
- {
- \tex_global:D \tex_chardef:D #1 \g_@@_allocate_int
- \tex_initcatcodetable:D #1
- }
- {
- \__kernel_msg_fatal:nnx
- { kernel } { out-of-registers } { cctab }
- }
-%</initex>
-%<*package>
- \newcatcodetable #1
-%</package>
- }
-% \end{macrocode}
-% The aim here is to ensure that the saved tables are read-only. This is
-% done by using a stack of tables which are not read only, and actually
-% having them as \enquote{in use} copies.
-% \begin{macrocode}
- \cs_new_protected:Npn \@@_begin:N #1
- {
- \seq_gpush:Nx \g_@@_stack_seq { \tex_the:D \tex_catcodetable:D }
- \tex_catcodetable:D #1
- \int_gadd:Nn \g_@@_stack_int { 2 }
- \int_compare:nNnT \g_@@_stack_int > \c_max_register_int
- { \__kernel_msg_fatal:nn { kernel } { cctab-stack-full } }
- \tex_savecatcodetable:D \g_@@_stack_int
- \tex_catcodetable:D \g_@@_stack_int
- }
- \cs_new_protected:Npn \@@_end:
- {
- \int_gsub:Nn \g_@@_stack_int { 2 }
- \seq_if_empty:NTF \g_@@_stack_seq
- { \tl_set:Nn \l_@@_tmp_tl { 0 } }
- { \seq_gpop:NN \g_@@_stack_seq \l_@@_tmp_tl }
- \tex_catcodetable:D \l_@@_tmp_tl \scan_stop:
- }
-% \end{macrocode}
-% Category code tables are always global, so only one version is needed.
-% The set up here is simple, and means that at the point of use there is
-% no need to worry about escaping category codes.
-% \begin{macrocode}
- \cs_new_protected:Npn \cctab_gset:Nn #1#2
- {
- \group_begin:
- #2 \scan_stop:
- \tex_savecatcodetable:D #1
- \group_end:
- }
- }
-% \end{macrocode}
-% Now the case for other engines. Here, we use an integer array for each
-% table. The index base is out-by-one, so we have an internal function to
-% handle that. The rest of the approach here is pretty simple: use a stack
-% of tables, and save to them at each |begin|. Unlike the \LuaTeX{} case,
-% we can't accidentally alter a saved table, which makes life a little
-% easier.
-% \begin{macrocode}
- {
- \cs_new_protected:Npn \@@_gstore:Nnn #1#2#3
- {
- \intarray_gset:cnn
- { g_@@_ \int_use:N #1 _cctab } { #2 + 1 } {#3}
- }
-% \end{macrocode}
-% Following the \LuaTeX{} pattern, a new table starts with \IniTeX{} codes.
-% \begin{macrocode}
- \cs_new_protected:Npn \cctab_new:N #1
- {
- \int_gadd:Nn \g_@@_allocate_int { 2 }
- \int_const:Nn #1 { \g_@@_allocate_int }
- \intarray_new:cn { g_@@_ \int_use:N #1 _cctab } { 256 }
- \int_step_inline:nn { 256 }
- {
- \intarray_gset:cnn
- { g_@@_ \int_use:N #1 _cctab } {##1} { 12 }
- }
- \@@_gstore:Nnn #1 { 0 } { 9 }
- \@@_gstore:Nnn #1 { 13 } { 5 }
- \@@_gstore:Nnn #1 { 32 } { 10 }
- \@@_gstore:Nnn #1 { 37 } { 14 }
- \int_step_inline:nnn { 65 } { 90 }
- { \@@_gstore:Nnn #1 {##1} { 11 } }
- \@@_gstore:Nnn #1 { 92 } { 0 }
- \int_step_inline:nnn { 97 } { 122 }
- { \@@_gstore:Nnn #1 {##1} { 11 } }
- \@@_gstore:Nnn #1 { 127 } { 15 }
- }
- \cs_new_protected:Npn \@@_begin:N #1
- {
- \int_gadd:Nn \g_@@_stack_int { 2 }
- \int_compare:nNnT \g_@@_stack_int > \c_max_register_int
- { \__kernel_msg_fatal:nn { kernel } { cctab-stack-full } }
- \cs_if_exist:cF { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- {
- \intarray_new:cn
- { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- { 256 }
- }
- \int_step_inline:nn { 256 }
- {
- \intarray_gset:cnn
- { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- {##1}
- { \char_value_catcode:n { ##1 - 1 } }
- }
- \int_step_inline:nn { 256 }
- {
- \char_set_catcode:nn { ##1 - 1 }
- {
- \intarray_item:cn
- { g_@@_ \int_use:N #1 _cctab } {##1}
- }
- }
- }
- \cs_generate_variant:Nn \intarray_new:Nn { c }
- \cs_generate_variant:Nn \intarray_gset:Nnn { c }
- \cs_new_protected:Npn \@@_end:
- {
- \int_step_inline:nn { 256 }
- {
- \char_set_catcode:nn { ##1 - 1 }
- {
- \intarray_item:cn
- { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- {##1}
- }
- }
- \int_gsub:Nn \g_@@_stack_int { 2 }
- }
- \cs_generate_variant:Nn \intarray_item:Nn { c }
- \cs_new_protected:Npn \cctab_gset:Nn #1#2
- {
- \group_begin:
- #2 \scan_stop:
- \int_step_inline:nn { 256 }
- {
- \intarray_gset:cnn { g_@@_ \int_use:N #1 _cctab } {##1}
- { \char_value_catcode:n { ##1 - 1 } }
- }
- \group_end:
- }
- }
-\cs_generate_variant:Nn \cctab_new:N { c }
-\cs_generate_variant:Nn \cctab_gset:Nn { c }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\cctab_begin:N,\cctab_end:}
-% These functions perform a few sanity checks before calling the
-% functions which will do the heavy-lifting.
-% \cs{cctab_begin:N} checks if a \meta{cctab~var} exists before trying
-% to use it. \cs{cctab_end:} checks if a \cs{cctab_begin:N} was used
-% some time earlier.
-%
-% Skipping these checks would result in an \enquote{Undefined control
-% sequence} error for \cs{cctab_begin:N} with an undefined
-% \meta{cctab~var}, and a \enquote{Missing font identifier} for an extra
-% \cs{cctab_end:}.
-% \begin{macrocode}
-\cs_new_protected:Npn \cctab_begin:N #1
- { \@@_chk_if_valid:NT #1 { \__cctab_begin:N #1 } }
-\cs_generate_variant:Nn \cctab_begin:N { c }
-\cs_new_protected:Npn \cctab_end:
- {
- \int_compare:nNnTF { \g_@@_stack_int } = { \c_zero_int }
- { \__kernel_msg_error:nn { kernel } { cctab-extra-end } }
- { \@@_end: }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\cctab_if_exist:N,\cctab_if_exist:c}
-% Checks whether a \meta{cctab~var} is defined.
-% \begin{macrocode}
-\prg_new_eq_conditional:NNn \cctab_if_exist:N \cs_if_exist:N
- { TF , T , F , p }
-\prg_new_eq_conditional:NNn \cctab_if_exist:c \cs_if_exist:c
- { TF , T , F , p }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_chk_if_valid:N}
-% Checks whether the argument is defined and whether it is a valid
-% \meta{cctab~var}. In \LuaTeX{} the validity of the \meta{cctab~var}
-% is checked by the engine, which complains if the argument is not
-% a \cs{chardef}'ed constant. In other engines, check if the
-% underlying \cs[no-index]{g_@@_\meta{integer}_cctab}
-% \meta{intarray~var} exists.
-% \begin{macrocode}
-\sys_if_engine_luatex:TF
- {
- \prg_new_protected_conditional:Npnn \@@_chk_if_valid:N #1
- { TF , T , F }
- {
- \cctab_if_exist:NTF #1
- {
-%<*initex>
- \bool_lazy_and:nnTF
- { \int_if_odd_p:n {#1} }
- { \int_compare_p:nNn {#1-1} < { \g_@@_allocate_int } }
-%</initex>
-%<*package>
- \int_compare:nNnTF {#1-1} < { \e@alloc@ccodetable@count }
-%</package>
- { \prg_return_true: }
- {
- \__kernel_msg_error:nnx { kernel } { invalid-cctab }
- { \token_to_str:N #1 }
- \prg_return_false:
- }
- }
- {
- \__kernel_msg_error:nnx { kernel } { command-not-defined }
- { \token_to_str:N #1 }
- \prg_return_false:
- }
- }
- }
- {
- \prg_new_protected_conditional:Npnn \@@_chk_if_valid:N #1
- { TF , T , F }
- {
- \cctab_if_exist:NTF #1
- {
- \cs_if_exist:cTF { g_@@_ \int_use:N #1 _cctab }
- { \prg_return_true: }
- {
- \__kernel_msg_error:nnx { kernel } { invalid-cctab }
- { \token_to_str:N #1 }
- \prg_return_false:
- }
- }
- {
- \__kernel_msg_error:nnx { kernel } { command-not-defined }
- { \token_to_str:N #1 }
- \prg_return_false:
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\cctab_const:Nn,\cctab_const:cn}
-% Creates a new \meta{cctab~var} then sets it with the current and
-% user-supplied codes.
-% \begin{macrocode}
-\cs_new_protected:Npn \cctab_const:Nn #1#2
- {
- \cctab_new:N #1
- \cctab_gset:Nn #1 {#2}
- }
-\cs_generate_variant:Nn \cctab_const:Nn { c }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{variable}
-% {
-% \c_initex_cctab ,
-% \c_code_cctab ,
-% \c_document_cctab ,
-% \c_other_cctab ,
-% \c_str_cctab
-% }
-% Creating category code tables is easy using the function above.
-% The \texttt{other} and \texttt{string} ones are done by completely
-% ignoring the existing codes as this makes life a lot less complex.
-% \begin{macrocode}
-\cctab_new:N \c_initex_cctab
-\cctab_const:Nn \c_code_cctab { }
-\cctab_const:Nn \c_document_cctab
- {
- \char_set_catcode_space:n { 9 }
- \char_set_catcode_space:n { 32 }
- \char_set_catcode_other:n { 58 }
- \char_set_catcode_math_subscript:n { 95 }
- \char_set_catcode_active:n { 126 }
- }
-\cctab_const:Nn \c_other_cctab
- {
- \int_step_inline:nnn { 0 } { 127 }
- { \char_set_catcode_other:n {#1} }
- }
-\cctab_const:Nn \c_str_cctab
- {
- \int_step_inline:nnn { 0 } { 127 }
- { \char_set_catcode_other:n {#1} }
- \char_set_catcode_space:n { 32 }
- }
-% \end{macrocode}
-% \end{variable}
-%
-% \subsection{Messages}
-%
-% \begin{macrocode}
-\__kernel_msg_new:nnnn { kernel } { cctab-stack-full }
- { The~category~code~table~stack~is~exhausted. }
- {
- LaTeX~has~been~asked~to~switch~to~a~new~category~code~table,~
- but~there~is~no~more~space~to~do~this!
- }
-\__kernel_msg_new:nnnn { kernel } { cctab-extra-end }
- { Extra~\iow_char:N\\cctab_end:~ignored~\msg_line_context:. }
- {
- LaTeX~came~across~a~\iow_char:N\\cctab_end:~without~a~matching~
- \iow_char:N\\cctab_begin:N.~This~command~will~be~ignored.
- }
-\__kernel_msg_new:nnnn { kernel } { invalid-cctab }
- { Invalid~\iow_char:N\\catcode~table. }
- {
- You~can~only~switch~to~a~\iow_char:N\\catcode~table~that~is~
- initialized~using~\iow_char:N\\cctab_new:N~or~
- \iow_char:N\\cctab_const:Nn.
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</initex|package>
-% \end{macrocode}
-%
-%\end{implementation}
-%
-%\PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
deleted file mode 100644
index de6616acf3d..00000000000
--- a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx
+++ /dev/null
@@ -1,904 +0,0 @@
-% \iffalse meta-comment
-%
-%% File: l3color.dtx
-%
-% Copyright (C) 2017-2020 The LaTeX3 Project
-%
-% It may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this
-% license or (at your option) any later version. The latest version
-% of this license is in the file
-%
-% http://www.latex-project.org/lppl.txt
-%
-% This file is part of the "l3experimental bundle" (The Work in LPPL)
-% and all files in that bundle must be distributed together.
-%
-% -----------------------------------------------------------------------
-%
-% The development version of the bundle can be found at
-%
-% https://github.com/latex3/latex3
-%
-% for those people who are interested.
-%
-%<*driver|package>
-\RequirePackage{expl3}
-%</driver|package>
-%<*driver>
-\documentclass[full]{l3doc}
-\begin{document}
- \DocInput{\jobname.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \title{^^A
-% The \textsf{l3color} package\\ Experimental color support^^A
-% }
-%
-% \author{^^A
-% The \LaTeX3 Project\thanks
-% {^^A
-% E-mail:
-% \href{mailto:latex-team@latex-project.org}
-% {latex-team@latex-project.org}^^A
-% }^^A
-% }
-%
-% \date{Released 2020-01-12}
-%
-% \maketitle
-%
-% \begin{documentation}
-%
-% \section{Color models}
-%
-% A color \emph{model} is a way to represent sets of colors. Different models
-% are particularly suitable for different output methods, \emph{e.g.}~screen
-% or print. Parameter-based models can describe a very large number of unique
-% colors, and have a varying number of \emph{axes} which define a color
-% space. In contrast, various proprietary models are available which define
-% \emph{spot} colors.
-%
-% The models supported here are
-% \begin{itemize}
-% \item \texttt{gray} Grayscale color, with a single axis running from
-% $0$ (fully black) to $1$ (fully white)
-% \item \texttt{rgb} Red-green-blue color, with three axes, one for each of
-% the components
-% \item \texttt{cmyk} Cyan-magenta-yellow-black color, with four axes, one for
-% each of the components
-% \item \texttt{spot} Spot color, with one value, the name of the color
-% (see \url{https://helpx.adobe.com/indesign/using/spot-process-colors.html}
-% for details of the use of spot colors in print)
-% \end{itemize}
-%
-% Additional models may be created to allow mixing of spot colors
-% with each other or with those from other models. See
-% Section~\ref{l3color:sec:spot} for more detail of spot color support.
-%
-% When color is selected by model, the \meta{values} given are specified as
-% a comma-separated list. The length of the list will therefore be determined
-% by the detail of the model involved.
-%
-% Color models (and interconversion) are complex, and more details are given
-% in the manual to the \LaTeXe{} \pkg{xcolor} package and in the
-% \emph{PostScript Language Reference Manual}, published by Addison--Wesley.
-%
-% \section{Color expressions}
-%
-% In addition to allowing specification of color by model and values,
-% \pkg{l3color} also supports color expressions. These are created
-% by combining one or more color names, with the amount of each specified
-% as a percentage. The latter is given between |!| symbols in the expression.
-% Thus for example
-% \begin{verbatim}
-% red!50!green
-% \end{verbatim}
-% is a mixture of $50\,\%$ red and $50\,\%$ green. A trailing percentage is
-% interpreted as implicitly followed by |white|, and so
-% \begin{verbatim}
-% red!25
-% \end{verbatim}
-% specifies $25\,\%$ red mixed with $75\,\%$ white.
-%
-% Where the models for the mixed colors are different, the model of the first
-% color is used. Thus
-% \begin{verbatim}
-% red!50!cyan
-% \end{verbatim}
-% will result in a color specification using the |rgb| model, made up of
-% $50\,\%$ red and $50\,\%$ of cyan \emph{expressed in \texttt{rgb}}. As color
-% model interconversion is not exact.
-%
-% The one exception to the above is where the first model in an expression is
-% |gray|. In this case, the order of mixing is \enquote{swapped} internally, so
-% that for example
-% \begin{verbatim}
-% black!50!red
-% \end{verbatim}
-% has the same result as
-% \begin{verbatim}
-% red!50!black
-% \end{verbatim}
-% (the predefined colors |black| and |white| use the |gray| model).
-%
-% Where more than two colors are mixed in an expression, evaluation takes place
-% in a stepwise fashion. Thus in
-% \begin{verbatim}
-% cyan!50!magenta!10!yellow
-% \end{verbatim}
-% the sub-expression
-% \begin{verbatim}
-% cyan!50!magenta
-% \end{verbatim}
-% is first evaluated to give an intermediate color specification, before
-% the second step
-% \begin{verbatim}
-% <intermediate>!10!yellow
-% \end{verbatim}
-% where |<intermediate>| represents this transitory calculated value.
-%
-% Within a color expression, |.| may be used to represent the color active
-% for typesetting (the current color). This allows for example
-% \begin{verbatim}
-% .!50
-% \end{verbatim}
-% to mean a mixture of $50\,\%$ of current color with white.
-%
-% (Color expressions supported here are a subset of those provided by
-% the \LaTeXe{} \pkg{xcolor} package. At present, only such features as are
-% clearly useful have been added here.)
-%
-% \section{Named colors}
-%
-% Color names are stored in a single namespace, which makes them accessible
-% as part of color expressions. Whilst they are not reserved in a technical
-% sense, the names |black|, |white|, |red|, |green|, |blue|, |cyan|, |magenta|
-% and |yellow| have special meaning and should not be redefined. Color names
-% should be made up of letters, numbers and spaces only: other characters are
-% reserved for use in color expressions. In particular, |.| represents the
-% current color at the start of a color expression.
-%
-% \begin{function}{\color_set:nn}
-% \begin{syntax}
-% \cs{color_set:nn} \Arg{name} \Arg{color expression}
-% \end{syntax}
-% Evaluates the \meta{color expression} and stores the resulting
-% color specification as the \meta{name}.
-% \end{function}
-%
-% \begin{function}{\color_set:nnn}
-% \begin{syntax}
-% \cs{color_set:nnn} \Arg{name} \Arg{model} \Arg{value(s)}
-% \end{syntax}
-% Stores the color specification equivalent to the \meta{model} and
-% \meta{values} as the \meta{name}.
-% \end{function}
-%
-% \begin{function}{\color_set_eq:nn}
-% \begin{syntax}
-% \cs{color_set_eq:nn} \Arg{name1} \Arg{name2}
-% \end{syntax}
-% Copies the color specification in \meta{name2} to \meta{name1}. The
-% special name |.| may be used to represent the current color, allowing
-% it to be saved to a name.
-% \end{function}
-%
-% \begin{function}{\color_show:n}
-% \begin{syntax}
-% \cs{color_show:n} \Arg{name}
-% \end{syntax}
-% Displays the color specification stored in the \meta{name} on the
-% terminal.
-% \end{function}
-%
-% \section{Selecting colors}
-%
-% \begin{function}{\color_select:n}
-% \begin{syntax}
-% \cs{color_select:n} \Arg{color expression}
-% \end{syntax}
-% Parses the \meta{color expression} and then activates the resulting
-% color specification for typeset material.
-% \end{function}
-%
-% \begin{function}{\color_select:nn}
-% \begin{syntax}
-% \cs{color_select:nn} \Arg{model} \Arg{value(s)}
-% \end{syntax}
-% Activates the color specification equivalent to the \meta{model} and
-% \meta{value(s)} for typeset material.
-% \end{function}
-%
-% \begin{variable}{\l_color_fixed_model_tl}
-% When this is set to a non-empty value, colors will be converted to
-% the specified model when they are selected. Note that included images
-% and similar are not influenced by this setting.
-% \end{variable}
-%
-% \section{Core color representation}
-%
-% To allow data to be handled internally, \pkg{l3color} uses a simple
-% representation of color, based on that used by the \pkg{dvips} program.
-% This is a token list made up of the model name followed by one or more
-% data entries, each separated by a \emph{space}. The valid forms are thus
-% \begin{itemize}
-% \item \texttt{gray \meta{gray}} Grayscale color with the \meta{gray}
-% value running from $0$ (fully black) to $1$ (fully white)
-% \item \texttt{cmyk \meta{cyan} \meta{magenta} \meta{yellow} \meta{black}},
-% each of which falls in the range $[0,1]$
-% \item \texttt{rgb \meta{red} \meta{green} \meta{blue}},
-% each of which falls in the range $[0,1]$
-% \item \texttt{spot \meta{name} \meta{tint}} A pre-defined spot color,
-% where the \meta{name} should be a pre-defined string color name and the
-% \meta{tint} should be in the range $[0,1]$.
-% \end{itemize}
-%
-% This core representation is produced when parsing color expressions.
-%
-% \begin{function}{\color_parse:nN}
-% \begin{syntax}
-% \cs{color_parse:nN} \Arg{color expression} \Arg{tl}
-% \end{syntax}
-% Parses the \meta{color expression} as described above, and sets the
-% \meta{tl} the the equivalent \meta{core color representation}
-% (used at the backend level and based on \texttt{dvips} color
-% representation).
-% \end{function}
-%
-% \section{Spot colors}
-% \label{l3color:sec:spot}
-%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3color} Implementation}
-%
-% \begin{macrocode}
-%<*initex|package>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=color>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage{l3color}{2020-01-12}{}
- {L3 Experimental color support}
-%</package>
-% \end{macrocode}
-%
-% \subsection{Predefined color names}
-%
-% The ability to predefine colors with a name is a key part of this module and
-% means there has to be a method for storing the results. At first sight, it
-% seems natural to follow the usual \pkg{expl3} model and create a
-% \texttt{color} variable type for the process. That would then allow both
-% local and global colors, constant colors and the like. However, these names
-% need to be accessible in some form at the user level, for selection of colors
-% either simply by name or as part of a more complex expression. This does not
-% require that the full name is exposed but does require that they can be
-% looked up in a predictable way. As such, it is more useful to expose just the
-% color names as part of the interface, with the result that only local color
-% names can be created. (This is also seen for example in key creation in
-% \pkg{l3keys}.) As a result, color names are declarative (no \texttt{new}
-% functions).
-%
-% Since there is no need to manipulate colors \emph{en masse}, each is stored
-% in a separate token list variable, rather than the alternative of using a
-% single property list for all names.
-%
-% \subsection{Setup}
-%
-% \begin{variable}{\l_@@_internal_tl}
-% \begin{macrocode}
-\tl_new:N \l_@@_internal_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \subsection{Utility functions}
-%
-% \begin{macro}[int, TF, EXP]{\@@_if_defined:n}
-% A simple wrapper to avoid needing to have the lookup repeated in too many
-% places.
-% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_if_defined:n #1 { T, F, TF }
- {
- \tl_if_exist:cTF { l_@@_named_ #1 _tl }
- \prg_return_true:
- \prg_return_false:
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_extract:nNN, \@@_extract:VNN}
-% \begin{macro}{\@@_extract:NNw}
-% Split the model and color from a named color, and store the two. No test
-% for the existence of the color: that is assumed to be the case (this
-% is internal only). Somewhat \enquote{old-fashioned} but should be quite
-% fast.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_extract:nNN #1#2#3
- {
- \exp_after:wN \exp_after:wN \exp_after:wN
- \@@_extract:NNw
- \exp_after:wN \exp_after:wN \exp_after:wN #2
- \exp_after:wN \exp_after:wN \exp_after:wN #3
- \cs:w l_@@_named_ #1 _tl \cs_end: \q_stop
- }
-\cs_generate_variant:Nn \@@_extract:nNN { V }
-\cs_new_protected:Npn \@@_extract:NNw #1#2 #3 ~ #4 \q_stop
- {
- \tl_set:Nn #1 {#3}
- \tl_set:Nn #2 {#4}
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Model conversion}
-%
-% \begin{macro}{\@@_convert:nnN, \@@_convert:VVN}
-% \begin{macro}{\@@_convert:nnnN}
-% \begin{macro}[aux, EXP]
-% {
-% \@@_convert_gray_rgb:w
-% \@@_convert_gray_cmyk:w
-% \@@_convert_cmyk_gray:w
-% \@@_convert_cmyk_rgb:w
-% \@@_convert_rgb_gray:w
-% \@@_convert_rgb_cmyk:w
-% }
-% \begin{macro}[aux, EXP]{\@@_convert_rgb_cmyk:nnnn}
-% Model conversion is carried out using standard formulae, as described in
-% the manual for \pkg{xcolor} (see also the \emph{PostScript Language
-% Reference Manual}).
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_convert:nnN #1#2#3
- { \@@_convert:nnVN {#1} {#2} #3 #3 }
-\cs_generate_variant:Nn \@@_convert:nnN { VV }
-\cs_new_protected:Npn \@@_convert:nnnN #1#2#3#4
- {
- \str_if_eq:nnT {#1} { spot } % TO DO!!!
- { }
- \tl_set:Nx #4
- { \use:c { @@_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \q_stop }
- }
-\cs_generate_variant:Nn \@@_convert:nnnN { nnV }
-\cs_new:Npn \@@_convert_gray_rgb:w #1 ~ #2 \q_stop
- { #1 ~ #1 ~ #1 }
-\cs_new:Npn \@@_convert_gray_cmyk:w #1 ~ #2 \q_stop
- { 0 ~ 0 ~ 0 ~ \fp_eval:n { 1 - #1 } }
-% \end{macrocode}
-% These rather odd values are based on \textsc{ntsc} television: the set are
-% used for the |cmyk| conversion.
-% \begin{macrocode}
-\cs_new:Npn \@@_convert_rgb_gray:w #1 ~ #2 ~ #3 ~ #4 \q_stop
- { \fp_eval:n { 0.3 * #1 + 0.59 * #2 + 0.11 * #3 } }
-% \end{macrocode}
-% The conversion from |rgb| to |cmyk| is the most complex: a two-step
-% procedure which requires \emph{black generation} and \emph{undercolor
-% removal} functions. The PostScript reference describes them as
-% device-dependent, but following \pkg{xcolor} we assume they are linear.
-% Moreover, as the likelihood of anyone using a non-unitary matrix here is
-% tiny, we simplify and treat those two concepts as no-ops.
-% \begin{macrocode}
-\cs_new:Npn \@@_convert_rgb_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop
- {
- \exp_args:Nf \@@_convert_rgb_cmyk:nnnn
- { \fp_eval:n { min ( 1 - #1 , 1 - #2 , 1 - #3 ) } } {#1} {#2} {#3}
- }
-\cs_new:Npn \@@_convert_rgb_cmyk:nnnn #1#2#3#4
- {
- \fp_eval:n { min ( 1 , max ( 0 , 1 - #2 - #1 ) ) } \c_space_tl
- \fp_eval:n { min ( 1 , max ( 0 , 1 - #3 - #1 ) ) } \c_space_tl
- \fp_eval:n { min ( 1 , max ( 0 , 1 - #4 - #1 ) ) } \c_space_tl
- #1
- }
-\cs_new:Npn \@@_convert_cmyk_gray:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
- { \fp_eval:n { 1 - min ( 1 , 0.3 * #1 + 0.59 * #2 + 0.11 * #3 + #4 ) } }
-\cs_new:Npn \@@_convert_cmyk_rgb:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop
- {
- \fp_eval:n { 1 - min ( 1 , #1 + #4 ) } \c_space_tl
- \fp_eval:n { 1 - min ( 1 , #2 + #4 ) } \c_space_tl
- \fp_eval:n { 1 - min ( 1 , #3 + #4 ) }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Color expressions}
-%
-% \begin{variable}
-% {\l_@@_model_tl, \l_@@_value_tl, \l_@@_next_model_tl, \l_@@_next_value_tl}
-% Working space to store the color data whilst doing calculations: keeping
-% it on the stack is attractive but gets tricky (return is non-trivial).
-% \begin{macrocode}
-\tl_new:N \l_@@_model_tl
-\tl_new:N \l_@@_value_tl
-\tl_new:N \l_@@_next_model_tl
-\tl_new:N \l_@@_next_value_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\color_parse:nN}
-% \begin{macro}{\@@_parse:nN}
-% \begin{macro}{\@@_parse:Nw}
-% \begin{macro}{\@@_parse_loop_init:Nnn}
-% \begin{macro}{\@@_parse_loop:w}
-% \begin{macro}{\@@_parse_loop:nn}
-% \begin{macro}{\@@_parse_break:w}
-% \begin{macro}{\@@_parse_end:}
-% \begin{macro}[aux, EXP]{\@@_parse_mix:Nnnn, \@@_parse_mix:NVVn}
-% \begin{macro}[aux, EXP]{\@@_parse_mix:nNnn}
-% \begin{macro}[aux, EXP]
-% {
-% \@@_parse_mix_gray:nw ,
-% \@@_parse_mix_rgb:nw ,
-% \@@_parse_mix_cmyk:nw
-% }
-% The main function for parsing color expressions removes actives but
-% otherwise expands, then starts working through the expression itself.
-% At the end, we apply the payload.
-% \begin{macrocode}
-\cs_new_protected:Npn \color_parse:nN #1#2
- {
-%<*package>
- \@@_backend_pickup:N \l_@@_current_tl
- \tl_set_eq:cN { l_@@_named_ . _tl } \l_@@_current_tl
-%</package>
- \exp_args:Ne \@@_parse:nN { \tl_to_str:n {#1} } #2
- }
-% \end{macrocode}
-% Before going to all of the effort of parsing an expression, these two
-% precursor functions look for a pre-defined name, either on its own or
-% with a trailing |!| (which is the same thing).
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse:nN #1#2
- {
- \tl_if_exist:cTF { l_@@_named_ #1 _tl }
- { \tl_set_eq:Nc #2 { l_@@_named_ #1 _tl } }
- { \@@_parse:Nw #2#1 ! \q_stop }
- \@@_check_model:N #2
- }
-\cs_new_protected:Npn \@@_parse:Nw #1#2 ! #3 \q_stop
- {
- \@@_if_defined:nTF {#2}
- {
- \tl_if_blank:nTF {#3}
- { \tl_set_eq:Nc #1 { l_@@_named_ #2 _tl } }
- { \@@_parse_loop_init:Nnn #1 {#2} {#3} }
- }
- {
- \__kernel_msg_error:nnn { color } { unknown-color } {#2}
- \tl_set_eq:NN \l_@@_current_tl \l_@@_named_black_tl
- }
- }
-% \end{macrocode}
-% Once we establish that a full parse is needed, the next job is to get the
-% detail of the first color. That will determine the model we use for the
-% calculation: splitting here makes checking that a bit easier.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse_loop_init:Nnn #1#2#3
- {
- \group_begin:
- \@@_extract:nNN {#2} \l_@@_model_tl \l_@@_value_tl
- \@@_parse_loop:w #3 ! ! ! ! \q_stop
- \tl_set:Nx \l_@@_internal_tl
- { \l_@@_model_tl \c_space_tl \l_@@_value_tl }
- \exp_args:NNNV \group_end:
- \tl_set:Nn #1 \l_@@_internal_tl
- }
-% \end{macrocode}
-% This is the loop proper: there can be an open-ended set of colors to parse,
-% separated by |!| tokens. There are a few cases to look out for. At the end
-% of the expression and with we find a mix of $100$ then we simply skip the
-% next color entirely (we can't stop the loop as there might be a further
-% valid color to mix in). On the other hand, if we get a mix of $0$ then
-% drop everything so far and start again. There is also a trailing
-% |white| to \enquote{read in} if the final explicit data is a mix.
-% Those conditions are separate from actually looping, which is therefore
-% sorted out by checking if we have further data to process: in contrast
-% to \pkg{xcolor}, we don't allow |!!| so the test can be simplified.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse_loop:w #1 ! #2 ! #3 ! #4 ! #5 \q_stop
- {
- \bool_lazy_or:nnF
- { \tl_if_blank_p:n {#1} }
- { \int_compare_p:nNn {#1} = { 100 } }
- {
- \int_compare:nNnTF {#1} = { 0 }
- {
- \tl_if_blank:nTF {#2}
- { \@@_extract:nNN { white } }
- { \@@_extract:nNN {#2} }
- \l_@@_model_tl \l_@@_value_tl
- }
- {
- \use:x
- {
- \@@_parse_loop:nn {#1}
- { \tl_if_blank:nTF {#2} { white } {#2} }
- }
- }
- }
- \tl_if_blank:nF {#3}
- { \@@_parse_loop:w #3 ! #4 ! #5 \q_stop }
- \@@_parse_end:
- }
-% \end{macrocode}
-% The \enquote{payload} of calculation in the loop first. If the model for
-% the upcoming color is different from that of the existing (partial) color,
-% convert the model. For |gray| the two are flipped round so that the outcome
-% is something with \enquote{real} color. We are then in a position to do the
-% actual calculation itself. The two auxiliaries here give us a way to break
-% the loop should an invalid name be found.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse_loop:nn #1#2
- {
- \@@_if_defined:nTF {#2}
- {
- \@@_extract:nNN {#2} \l_@@_next_model_tl \l_@@_next_value_tl
- \tl_if_eq:NNF \l_@@_model_tl \l_@@_next_model_tl
- {
- \str_if_eq:VnT \l_@@_model_tl { gray }
- {
- \use:x
- {
- \tl_set:Nn \exp_not:N \l_@@_model_tl
- { \l_@@_next_model_tl }
- \tl_set:Nn \exp_not:N \l_@@_value_tl
- { \l_@@_next_value_tl }
- \tl_set:Nn \exp_not:N \l_next_@@_model_tl
- { \l_@@_model_tl }
- \tl_set:Nn \exp_not:N \l_next_@@_value_tl
- { \l_@@_value_tl }
- }
- }
- \@@_convert:VVN
- \l_@@_next_model_tl
- \l_@@_model_tl
- \l_@@_next_value_tl
- }
- \tl_set:Nx \l_@@_value_tl
- {
- \@@_parse_mix:NVVn
- \l_@@_model_tl \l_@@_value_tl \l_@@_next_value_tl {#1}
- }
- }
- {
- \__kernel_msg_error:nnn { color } { unknown-color } {#2}
- \@@_extract:nNN { black } \l_@@_model_tl \l_@@_value_tl
- \@@_parse_break:w
- }
- }
-\cs_new_protected:Npn \@@_parse_break:w #1 \@@_parse_end: { }
-\cs_new_protected:Npn \@@_parse_end: { }
-% \end{macrocode}
-% Do the vector arithmetic: mainly a question of shuffling input, along
-% with one pre-calculation to keep down the use of division.
-% \begin{macrocode}
-\cs_new:Npn \@@_parse_mix:Nnnn #1#2#3#4
- {
- \exp_args:Nf \@@_parse_mix:nNnn
- { \fp_eval:n { #4 / 100 } }
- #1 {#2} {#3}
- }
-\cs_generate_variant:Nn \@@_parse_mix:Nnnn { NVV }
-\cs_new:Npn \@@_parse_mix:nNnn #1#2#3#4
- {
- \use:c { @@_parse_mix_ #2 :nw } {#1}
- #3 \q_mark #4 \q_stop
- }
-\cs_new:Npn \@@_parse_mix_gray:nw #1#2 \q_mark #3 \q_stop
- { \fp_eval:n { #2 * #1 + #3 * ( 1 - #1 ) } }
-\cs_new:Npn \@@_parse_mix_rgb:nw
- #1#2 ~ #3 ~ #4 \q_mark #5 ~ #6 ~ #7 \q_stop
- {
- \fp_eval:n { #2 * #1 + #5 * ( 1 - #1 ) } \c_space_tl
- \fp_eval:n { #3 * #1 + #6 * ( 1 - #1 ) } \c_space_tl
- \fp_eval:n { #4 * #1 + #7 * ( 1 - #1 ) }
- }
-\cs_new:Npn \@@_parse_mix_cmyk:nw
- #1#2 ~ #3 ~ #4 ~ #5 \q_mark #6 ~ #7 ~ #8 ~ #9 \q_stop
- {
- \fp_eval:n { #2 * #1 + #6 * ( 1 - #1 ) } \c_space_tl
- \fp_eval:n { #3 * #1 + #7 * ( 1 - #1 ) } \c_space_tl
- \fp_eval:n { #4 * #1 + #8 * ( 1 - #1 ) } \c_space_tl
- \fp_eval:n { #5 * #1 + #9 * ( 1 - #1 ) }
- }
-% \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}[EXP]
-% {
-% \@@_parse_model_gray:w, \@@_parse_model_rgb:w,
-% \@@_parse_model_cmyk:w, \@@_parse_model_spot:w
-% }
-% \begin{macro}[EXP]{\@@_parse_number:n}
-% \begin{macro}[EXP]{\@@_parse_number:w}
-% \begin{macro}[EXP]{\@@_parse_spot_aux:w}
-% Turn the input into internal form, also tidying up the number quickly.
-% \begin{macrocode}
-\cs_new:Npn \@@_parse_model_gray:w #1 , #2 \q_stop { \@@_parse_number:n {#1} }
-\cs_new:Npn \@@_parse_model_rgb:w #1 , #2 , #3 , #4 \q_stop
- {
- \@@_parse_number:n {#1} ~
- \@@_parse_number:n {#2} ~
- \@@_parse_number:n {#3}
- }
-\cs_new:Npn \@@_parse_model_cmyk:w #1 , #2 , #3 , #4 , #5 \q_stop
- {
- \@@_parse_number:n {#1} ~
- \@@_parse_number:n {#2} ~
- \@@_parse_number:n {#3} ~
- \@@_parse_number:n {#4}
- }
-\cs_new:Npn \@@_parse_model_spot:w #1 , #2 \q_stop
- { \@@_parse_spot_aux:w #1 ! 100 ! \q_stop }
-\cs_new:Npn \@@_parse_spot_aux:w #1 ! #2 ! #3 \q_stop
- { #1 ~ \fp_eval:n { #2 / 100 } }
-\cs_new:Npn \@@_parse_number:n #1
- { \@@_parse_number:w #1 . 0 . \q_stop }
-\cs_new:Npn \@@_parse_number:w #1 . #2 . #3 \q_stop
- { \tl_if_blank:nTF {#1} { 0 } {#1} . #2 }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Selecting colors (and color models)}
-%
-% \begin{variable}{\l_color_fixed_model_tl}
-% For selecting a single fixed model.
-% \begin{macrocode}
-\tl_new:N \l_color_fixed_model_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\@@_check_model:N}
-% \begin{macro}{\@@_check_model:w}
-% Check that the model in use is the one required.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_check_model:N #1
- {
- \tl_if_empty:NF \l_color_fixed_model_tl
- {
- \exp_after:wN \@@_check_model:w #1 \q_stop
- \tl_if_eq:NNF \l_@@_model_tl \l_color_fixed_model_tl
- {
- \@@_convert:VVN \l_@@_model_tl \l_color_fixed_model_tl
- \l_@@_value_tl
- }
- \tl_set:Nx #1
- { \l_color_fixed_model_tl \c_space_tl \l_@@_value_tl }
- }
- }
-\cs_new_protected:Npn \@@_check_model:w #1 ~ #2 \q_stop
- {
- \tl_set:Nn \l_@@_model_tl {#1}
- \tl_set:Nn \l_@@_value_tl {#2}
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_select:}
-% A backend-neutral location for \enquote{last minute} manipulations before
-% handing off to the backend code. We set the special |.| syntax here: this
-% will therefore always be available. The finalisation is separate from the
-% main function so it can also be applied to \emph{e.g.}~page color.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_select:
- {
- \tl_set_eq:cN { l_@@_named_ . _tl } \l_@@_current_tl
- \@@_select:V \l_@@_current_tl
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\color_select:n}
-% \begin{macro}{\color_select:nn}
-% Parse the input expressions then get the backend to actually activate
-% them.
-% \begin{macrocode}
-\cs_new_protected:Npn \color_select:n #1
- {
- \color_parse:nN {#1} \l_@@_current_tl
- \@@_select:
- }
-\cs_new_protected:Npn \color_select:nn #1#2
- {
- \@@_direct:nnN {#1} {#2} \l_@@_current_tl
- \@@_select:
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Direct model use}
-%
-% \begin{macro}{\@@_direct:nnN}
-% Directly set a color based on a model/value combination.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_direct:nnN #1#2#3
- {
- \cs_if_exist:cTF { @@_parse_model_ #1 :w }
- {
- \tl_set:Nx #3
- { #1 ~ \use:c { @@_parse_model_ #1 :w } #2 , 0 , 0 , 0 , 0 \q_stop }
- \@@_check_model:N #3
- }
- {
- \__kernel_msg_error:nnn { color } { invalid-model } {#1}
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Defining named colors}
-%
-% \begin{variable}{\l_@@_named_tl}
-% Space to store the detail of the named color.
-% \begin{macrocode}
-\tl_new:N \l_@@_named_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\@@_store:Nn}
-% Store the named color unless it has an invalid name.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_store:Nn #1#2
- {
- \str_if_eq:nnF {#2} { . }
- {
- \tl_clear_new:c { l_@@_named_ #2 _tl }
- \tl_set_eq:cN { l_@@_named_ #2 _tl } #1
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\color_set:nn}
-% \begin{macro}{\color_set:nnn}
-% \begin{macro}{\color_set_eq:nn}
-% Defining named colors has to include a step to force creation of the
-% underlying token list to avoid errors when checking is enabled.
-% \begin{macrocode}
-\cs_new_protected:Npn \color_set:nn #1#2
- {
- \color_parse:nN {#2} \l_@@_named_tl
- \@@_store:Nn \l_@@_named_tl {#1}
- }
-\cs_new_protected:Npn \color_set:nnn #1#2#3
- {
- \@@_direct:nnN {#2} {#3} \l_@@_named_tl
- \@@_store:Nn \l_@@_named_tl {#1}
- }
-\cs_new_protected:Npn \color_set_eq:nn #1#2
- {
- \@@_if_defined:nTF {#2}
- {
- \tl_clear_new:c { l_@@_named_ #1 _tl }
- \str_if_eq:nnTF {#2} { . }
- { \tl_set_eq:cN { l_@@_named_ #1 _tl } \l_@@_current_tl }
- { \tl_set_eq:cc { l_@@_named_ #1 _tl } { l_@@_named_ #2 _tl } }
- }
- {
- \__kernel_msg_error:nnn { color } { unknown-color } {#2}
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% A small set of colors are always defined.
-% \begin{macrocode}
-\color_set:nnn { black } { gray } { 0 }
-\color_set:nnn { white } { gray } { 1 }
-\color_set:nnn { cyan } { cmyk } { 1 , 0 , 0 , 0 }
-\color_set:nnn { magenta } { cmyk } { 0 , 1 , 0 , 0 }
-\color_set:nnn { yellow } { cmyk } { 0 , 0 , 1 , 0 }
-\color_set:nnn { red } { rgb } { 1 , 0 , 0 }
-\color_set:nnn { green } { rgb } { 0 , 1 , 0 }
-\color_set:nnn { blue } { rgb } { 0 , 0 , 1 }
-% \end{macrocode}
-%
-% \begin{variable}{\l_@@_named_._tl}
-% A special named color: this is always defined though not fixed in
-% definition.
-% \begin{macrocode}
-\tl_new:c { l_@@_named_._tl }
-\tl_set_eq:cN { l_@@_named_._tl } \l_@@_current_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \subsection{Diagnostics}
-%
-% \begin{macro}{\color_show:n}
-% \begin{macro}{\@@_show:w}
-% \begin{macro}{\@@_show_gray:w, \@@_show_rgb:w, \@@_show_cmyk:w}
-% Extract the information about a color and format for the user: the approach
-% is similar to the keys module here.
-% \begin{macrocode}
-\cs_new_protected:Npn \color_show:n #1
- {
- \msg_show:nnxxxx { LaTeX / color } { show }
- {#1}
- {
- \@@_if_defined:nTF {#1}
- { \exp_last_unbraced:Nv \@@_show:w { l_@@_named_ #1 _tl } \q_stop }
- { }
- }
- { }
- { }
- }
-\cs_new:Npn \@@_show:w #1 ~ #2 \q_stop
- {
- \msg_show_item_unbraced:nn { model } {#1}
- \exp_args:Nnf \msg_show_item_unbraced:nn { value }
- { \use:c { @@_show_ #1 :w } #2 \q_stop }
- }
-\cs_new:Npn \@@_show_gray:w #1 \q_stop { #1 }
-\cs_new:Npn \@@_show_rgb:w #1 ~ #2 ~ #3 \q_stop { #1 ,~ #2 ,~ #3 }
-\cs_new:Npn \@@_show_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop { #1 ,~ #2 ,~ #3 ,~ #4 }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Messages}
-%
-% \begin{macrocode}
-\__kernel_msg_new:nnnn { color } { invalid-model }
- { Invalid~color~model~'#1'. }
- {
- LaTeX~has~been~asked~to~use~a~color~model~called~'#1',~
- but~this~model~is~not~set~up.
- }
-\__kernel_msg_new:nnnn { color } { unknown-color }
- { Unknown~color~'#1'. }
- {
- LaTeX~has~been~asked~to~use~a~color~named~'#1',~
- but~this~has~never~been~defined.
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\__kernel_msg_new:nnn { color } { show }
- {
- The~color~#1~
- \tl_if_empty:nTF {#2}
- { is~undefined. }
- { has~the~properties: #2 }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</initex|package>
-% \end{macrocode}
-%
-% \end{implementation}
-%
-% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins
deleted file mode 100644
index a2601a4fde1..00000000000
--- a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.ins
+++ /dev/null
@@ -1,58 +0,0 @@
-\iffalse meta-comment
-
-File: l3color.ins
-
-Copyright (C) 2017-2020 The LaTeX3 Project
-
-It may be distributed and/or modified under the conditions of the
-LaTeX Project Public License (LPPL), either version 1.3c of this
-license or (at your option) any later version. The latest version
-of this license is in the file
-
- http://www.latex-project.org/lppl.txt
-
-This file is part of the "l3experimental bundle" (The Work in LPPL)
-and all files in that bundle must be distributed together.
-
------------------------------------------------------------------------
-
-The development version of the bundle can be found at
-
- https://github.com/latex3/latex3
-
-for those people who are interested.
-
------------------------------------------------------------------------
-
-Any modification of this file should ensure that the copyright and
-license information is placed in the derived files.
-
-\fi
-
-\input l3docstrip.tex
-\askforoverwritefalse
-
-\preamble
-
-Copyright (C) 2017-2020 The LaTeX3 Project
-
-It may be distributed and/or modified under the conditions of
-the LaTeX Project Public License (LPPL), either version 1.3c of
-this license or (at your option) any later version. The latest
-version of this license is in the file:
-
- http://www.latex-project.org/lppl.txt
-
-This file is part of the "l3experimental bundle" (The Work in LPPL)
-and all files in that bundle must be distributed together.
-
-\endpreamble
-% stop docstrip adding \endinput
-\postamble
-\endpostamble
-
-\keepsilent
-
-\generate{\file{l3color.sty}{\from{l3color.dtx}{package}}}
-
-\endbatchfile
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
index 572b4f2192a..64bc0cfa646 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-boxes.dtx
%
-% Copyright (C) 2018-2020 The LaTeX3 Project
+% Copyright (C) 2018-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3draw-boxes} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -113,7 +113,7 @@
}
\hbox_set:Nn \l_@@_tmp_box
{
- \tex_kern:D \l_@@_xshift_dim
+ \__kernel_kern:n { \l_@@_xshift_dim }
\box_move_up:nn { \l_@@_yshift_dim }
{ \box_use_drop:N \l_@@_tmp_box }
}
@@ -147,7 +147,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
index 53c221d69e2..f193ceb4d64 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-layers.dtx
%
-% Copyright (C) 2019,2020 The LaTeX3 Project
+% Copyright (C) 2019-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3draw-layers} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -208,7 +208,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
index 846043faa45..a846d4046a2 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-paths.dtx
%
-% Copyright (C) 2018-2020 The LaTeX3 Project
+% Copyright (C) 2018-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3draw-paths} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -1030,7 +1030,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
index dccb1fb6772..70e088d0cf7 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-points.dtx
%
-% Copyright (C) 2018-2020 The LaTeX3 Project
+% Copyright (C) 2018-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3draw-points} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -116,8 +116,8 @@
{#1}
}
\cs_new:Npn \@@_point_process_auxi:nn #1#2
- { \@@_point_process_auxii:nw {#2} #1 \q_stop }
-\cs_new:Npn \@@_point_process_auxii:nw #1 #2 , #3 \q_stop
+ { \@@_point_process_auxii:nw {#2} #1 \s_@@_stop }
+\cs_new:Npn \@@_point_process_auxii:nw #1 #2 , #3 \s_@@_stop
{ #1 {#2} {#3} }
\cs_new:Npn \@@_point_process:nnn #1#2#3
{
@@ -127,8 +127,8 @@
{#1}
}
\cs_new:Npn \@@_point_process_auxiii:nnn #1#2#3
- { \@@_point_process_auxiv:nw {#3} #1 \q_mark #2 \q_stop }
-\cs_new:Npn \@@_point_process_auxiv:nw #1 #2 , #3 \q_mark #4 , #5 \q_stop
+ { \@@_point_process_auxiv:nw {#3} #1 \s_@@_mark #2 \s_@@_stop }
+\cs_new:Npn \@@_point_process_auxiv:nw #1 #2 , #3 \s_@@_mark #4 , #5 \s_@@_stop
{ #1 {#2} {#3} {#4} {#5} }
\cs_new:Npn \@@_point_process:nnnn #1#2#3#4
{
@@ -139,9 +139,9 @@
{#1}
}
\cs_new:Npn \@@_point_process_auxv:nnnn #1#2#3#4
- { \@@_point_process_auxvi:nw {#4} #1 \q_mark #2 \q_mark #3 \q_stop }
+ { \@@_point_process_auxvi:nw {#4} #1 \s_@@_mark #2 \s_@@_mark #3 \s_@@_stop }
\cs_new:Npn \@@_point_process_auxvi:nw
- #1 #2 , #3 \q_mark #4 , #5 \q_mark #6 , #7 \q_stop
+ #1 #2 , #3 \s_@@_mark #4 , #5 \s_@@_mark #6 , #7 \s_@@_stop
{ #1 {#2} {#3} {#4} {#5} {#6} {#7} }
\cs_new:Npn \@@_point_process:nnnnn #1#2#3#4#5
{
@@ -155,10 +155,10 @@
\cs_new:Npn \@@_point_process_auxvii:nnnnn #1#2#3#4#5
{
\@@_point_process_auxviii:nw
- {#5} #1 \q_mark #2 \q_mark #3 \q_mark #4 \q_stop
+ {#5} #1 \s_@@_mark #2 \s_@@_mark #3 \s_@@_mark #4 \s_@@_stop
}
\cs_new:Npn \@@_point_process_auxviii:nw
- #1 #2 , #3 \q_mark #4 , #5 \q_mark #6 , #7 \q_mark #8 , #9 \q_stop
+ #1 #2 , #3 \s_@@_mark #4 , #5 \s_@@_mark #6 , #7 \s_@@_mark #8 , #9 \s_@@_stop
{ #1 {#2} {#3} {#4} {#5} {#6} {#7} {#8} {#9} }
% \end{macrocode}
% \end{macro}
@@ -963,7 +963,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
index 704d80652ff..60792f27ed0 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-scopes.dtx
%
-% Copyright (C) 2018-2020 The LaTeX3 Project
+% Copyright (C) 2018-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3draw-scopes} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -132,7 +132,7 @@
\draw_transform_shift_reset:
\@@_softpath_clear:
\draw_linewidth:n { \l_draw_default_linewidth_dim }
- \draw_color:n { . }
+ \color_select:n { . }
\draw_nonzero_rule:
\draw_cap_butt:
\draw_join_miter:
@@ -262,7 +262,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
index ce3b8b1ac80..9d70d5d7e2c 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-softpath.dtx
%
-% Copyright (C) 2018-2020 The LaTeX3 Project
+% Copyright (C) 2018-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3draw-softpath} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -326,8 +326,8 @@
\tl_build_get:NN \g_@@_softpath_main_tl \l_@@_softpath_internal_tl
\exp_after:wN \@@_softpath_round_loop:Nnn
\l_@@_softpath_internal_tl
- \q_recursion_tail ? ?
- \q_recursion_stop
+ \q_@@_recursion_tail ? ?
+ \q_@@_recursion_stop
\group_end:
}
\bool_gset_false:N \g_@@_softpath_corners_bool
@@ -342,7 +342,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_softpath_round_loop:Nnn #1#2#3
{
- \quark_if_recursion_tail_stop_do:Nn #1 { \@@_softpath_round_end: }
+ \@@_if_recursion_tail_stop_do:Nn #1 { \@@_softpath_round_end: }
\token_if_eq_meaning:NNTF #1 \@@_softpath_roundpoint_op:nn
{ \@@_softpath_round_action:nn {#2} {#3} }
{
@@ -505,7 +505,7 @@
\cs_new:Npn \@@_softpath_round_calc:nnnnnn #1#2#3#4#5#6
{
\@@_softpath_round_calc:nnnnw {#3} {#4} {#5} {#6}
- #1 \q_mark #2 \q_stop
+ #1 \s_@@_mark #2 \s_@@_stop
}
\cs_generate_variant:Nn \@@_softpath_round_calc:nnnnnn { fV }
% \end{macrocode}
@@ -513,7 +513,7 @@
% quadratic Bézier curve.
% \begin{macrocode}
\cs_new:Npn \@@_softpath_round_calc:nnnnw
- #1#2#3#4 #5 , #6 \q_mark #7 , #8 \q_stop
+ #1#2#3#4 #5 , #6 \s_@@_mark #7 , #8 \s_@@_stop
{
{#5} {#6}
\exp_not:N \@@_softpath_curveto_opi:nn
@@ -556,7 +556,7 @@
\exp_not:N \exp_after:wN
\exp_not:N \@@_softpath_round_close:w
\exp_not:N \l_@@_softpath_curve_end_tl
- \exp_not:N \q_stop
+ \s_@@_stop
}
\use:x
{
@@ -567,7 +567,7 @@
\exp_not:N \exp_after:wN
\exp_not:N \@@_softpath_round_close:w
\exp_not:N \l_@@_softpath_curve_end_tl
- \exp_not:N \q_stop
+ \s_@@_stop
}
}
}
@@ -576,7 +576,7 @@
\exp_after:wN \use_none:n \l_@@_softpath_move_tl
}
}
-\cs_new:Npn \@@_softpath_round_close:w #1 , #2 \q_stop { {#1} {#2} }
+\cs_new:Npn \@@_softpath_round_close:w #1 , #2 \s_@@_stop { {#1} {#2} }
% \end{macrocode}
% Tidy up the parts of the path, complete the built token list and put
% it back into action.
@@ -607,7 +607,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
index 658982a49b9..105120a391d 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-state.dtx
%
-% Copyright (C) 2018-2020 The LaTeX3 Project
+% Copyright (C) 2018-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3draw-state} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -124,7 +124,7 @@
% Pass through to the driver layer.
% \begin{macrocode}
\cs_new_protected:Npn \draw_miterlimit:n #1
- { \@@_backend_miterlimit:n { \fp_eval:n {#1} } }
+ { \exp_args:Nx \@@_backend_miterlimit:n { \fp_eval:n {#1} } }
% \end{macrocode}
% \end{macro}
%
@@ -147,57 +147,8 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{variable}{\l_@@_color_tmp_tl}
-% Scratch space.
% \begin{macrocode}
-\tl_new:N \l_@@_color_tmp_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\draw_color:n, \draw_color_fill:n, \draw_color_stroke:n}
-% \begin{macro}{\@@_color:nn}
-% \begin{macro}{\@@_color_aux:nn, \@@_color_aux:Vn}
-% \begin{macro}{\@@_color:nw}
-% \begin{macro}
-% {
-% \@@_select_cmyk:nw, \@@_select_gray:nw,
-% \@@_select_rgb:nw, \@@_split_select:nw
-% }
-% Much the same as for core color support but calling the relevant
-% driver-level function.
-% \begin{macrocode}
-\cs_new_eq:NN \draw_color:n \color_select:n
-\cs_new_protected:Npn \draw_color_fill:n #1
- { \@@_color:nn { fill } {#1} }
-\cs_new_protected:Npn \draw_color_stroke:n #1
- { \@@_color:nn { stroke } {#1} }
-\cs_new_protected:Npn \@@_color:nn #1#2
- {
- \color_parse:nN {#2} \l_@@_color_tmp_tl
- \@@_color_aux:Vn \l_@@_color_tmp_tl {#1}
- }
-\cs_new_protected:Npn \@@_color_aux:nn #1#2
- { \@@_color:nw {#2} #1 \q_stop }
-\cs_generate_variant:Nn \@@_color_aux:nn { V }
-\cs_new_protected:Npn \@@_color:nw #1#2 ~ #3 \q_stop
- { \use:c { @@_color_ #2 :nw } {#1} #3 \q_stop }
-\cs_new_protected:Npn \@@_color_cmyk:nw #1#2 ~ #3 ~ #4 ~ #5 \q_stop
- { \use:c { @@_backend_color_ #1 _cmyk:nnnn } {#2} {#3} {#4} {#5} }
-\cs_new_protected:Npn \@@_color_gray:nw #1#2 \q_stop
- { \use:c { @@_backend_color_ #1 _gray:n } {#2} }
-\cs_new_protected:Npn \@@_color_rgb:nw #1#2 ~ #3 ~ #4 \q_stop
- { \use:c { @@_backend_color_ #1 _rgb:nnn } {#2} {#3} {#4} }
-\cs_new_protected:Npn \@@_color_spot:nw #1#2 ~ #3 \q_stop
- { \use:c { @@_backend_color_ #1 _spot:nn } {#2} {#3} }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
index bcfed707879..839fce91a61 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw-transforms.dtx
%
-% Copyright (C) 2018-2020 The LaTeX3 Project
+% Copyright (C) 2018-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3draw-transforms} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -70,8 +70,12 @@
% these to fully understand them.
% \item \cs{pgftransformarrow}: Likely to be done when other arrow functions
% are added.
+% \item \cs{pgftransformationadjustments}: Used mainly by CircuiTi\textit{k}Z
+% although also for shapes, likely needs more use cases before addressing.
% \item \cs{pgflowlevelsynccm}, \cs{pgflowlevel}: Likely to be added when
% use cases are encountered in other parts of the code.
+% \item \cs{pgfviewboxscope}: Seems very speicalied, need to understand the
+% requirements here.
% \end{itemize}
%
% \begin{variable}{\l_@@_matrix_active_bool}
@@ -331,7 +335,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
index 0ce74688f42..1b6cdd8ab9f 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
@@ -2,7 +2,7 @@
%
%% File: l3draw.dtx
%
-% Copyright(C) 2018-2020 The LaTeX3 Project
+% Copyright(C) 2018-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -102,7 +102,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -110,7 +110,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -231,7 +231,7 @@
% \begin{syntax}
% \cs{draw_linewidth:n} \Arg{width}
% \end{syntax}
-% Sets the width to be used for stroking to the \meta{width} (an
+% Sets the width to be used for stroking to the \meta{width} (an
% \meta{fp expr}).
% \end{function}
%
@@ -268,7 +268,7 @@
% \draw_end:
% \end{demo}
% Setting an empty pattern will produce a solid line.
-%
+%
% Note the \meta{pattern} interface here is different from that in \pkg{pgf}:
% the list is comma-separated not given in brace groups.
% \end{function}
@@ -410,7 +410,7 @@
% Gives the co-ordinates of the point at \meta{angle} (an \meta{fp expr} in
% \emph{degrees}) and \meta{radius}. The three-argument version accepts
% two radii of different lengths.
-%
+%
% Note the interface here is somewhat different from that in \pkg{pgf}:
% the one- and two-radii versions in \pkg{l3draw} use separate functions,
% whilst in \pkg{pgf} they use the same function and a keyword.
@@ -470,7 +470,7 @@
% \emph{degrees}) and \meta{radius}, relative to the prevailing
% $x$- and $y$-vectors. The three-argument version accepts two radii of
% different lengths.
-%
+%
% Note the interface here is somewhat different from that in \pkg{pgf}:
% the one- and two-radii versions in \pkg{l3draw} use separate functions,
% whilst in \pkg{pgf} they use the same function and a keyword.
@@ -650,7 +650,7 @@
% \draw_path_lineto:n { 2cm , 1cm }
% \draw_path_lineto:n { 3cm , 0.5cm }
% \draw_path_lineto:n { 3cm , 0cm }
-% \draw_color_fill:n { yellow!80!black }
+% \color_fill:n { yellow!80!black }
% \draw_path_use_clear:n { fill , stroke }
% \draw_end:
% \end{demo}
@@ -662,7 +662,7 @@
% \draw_path_moveto:n { 2cm , 1cm } % Begins a new part
% \draw_path_lineto:n { 3cm , 0.5cm }
% \draw_path_lineto:n { 3cm , 0cm }
-% \draw_color_fill:n { yellow!80!black }
+% \color_fill:n { yellow!80!black }
% \draw_path_use_clear:n { fill , stroke }
% \draw_end:
% \end{demo}
@@ -684,7 +684,7 @@
% { 1cm , 1cm } % First control
% { 2cm , 1cm } % Second control
% { 3cm , 0cm } % End
-% \draw_color_fill:n { yellow!80!black }
+% \color_fill:n { yellow!80!black }
% \draw_path_use_clear:n { fill , stroke }
% \draw_end:
% \end{demo}
@@ -705,7 +705,7 @@
% \draw_path_curveto:nn
% { 1cm , 1cm }
% { 2cm , 0cm }
-% \draw_color_fill:n { yellow!80!black }
+% \color_fill:n { yellow!80!black }
% \draw_path_use_clear:n { fill , stroke }
% \draw_end:
% \end{demo}
@@ -778,7 +778,7 @@
% { 1.5cm , 0cm }
% { 0cm , 1cm }
% \draw_path_use_clear:n { stroke }
-% \draw_color:n { red }
+% \color_select:n { red }
% \draw_path_ellipse:nnn
% { 1cm , 0cm }
% { 1cm , 1cm }
@@ -795,7 +795,7 @@
% \begin{syntax}
% \cs{draw_path_circle:nn} \Arg{center} \Arg{radius}
% \end{syntax}
-% Appends a circle of \meta{radius} at \meta{center} to the current path.
+% Appends a circle of \meta{radius} at \meta{center} to the current path.
% This is a shortcut for \cs{draw_path_ellipse:nnn}.
% \end{function}
%
@@ -977,15 +977,6 @@
% \end{demo}
% \end{function}
%
-% \subsection{Color}
-%
-% \begin{function}{\draw_color:n, \draw_color_fill:n, \draw_color_stroke:n}
-% \begin{syntax}
-% \cs{draw_color:n} \Arg{color expression}
-% \end{syntax}
-% Evaluates the \meta{color expression} as described for \pkg{l3color}.
-% \end{function}
-%
% \subsection{Transformations}
%
% Points are normally used unchanged relative to the canvas axes. This can
@@ -1137,7 +1128,7 @@
% \section{\pkg{l3draw} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -1145,20 +1136,39 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage{l3draw}{2020-01-12}{}
+\ProvidesExplPackage{l3draw}{2021-02-18}{}
{L3 Experimental core drawing support}
-%</package>
% \end{macrocode}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
% \begin{macrocode}
-\RequirePackage { l3color }
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop_do:Nn}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop_do:Nn
+% \end{macrocode}
+% \end{macro}
%
% Everything else is in the sub-files!
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins
index 9b72ca17fd6..ba54fc41322 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins
+++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.ins
@@ -2,7 +2,7 @@
File: l3draw.ins
-Copyright (C) 2018-2020 The LaTeX3 Project
+Copyright (C) 2018-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2018-2020 The LaTeX3 Project
+Copyright (C) 2018-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
index e877b69ca5f..5b4144c062e 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
@@ -2,7 +2,7 @@
%
%% File: l3graphics.dtx
%
-% Copyright (C) 2017-2020 The LaTeX3 Project
+% Copyright (C) 2017-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -38,7 +38,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -232,7 +232,7 @@
% \section{\pkg{l3graphics} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -240,10 +240,8 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage{l3graphics}{2020-01-12}{}
+\ProvidesExplPackage{l3graphics}{2021-02-18}{}
{L3 Experimental graphics inclusion support}
-%</package>
% \end{macrocode}
%
% \begin{variable}{\l_@@_tmp_ior, \l_@@_tmp_tl}
@@ -254,6 +252,13 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \subsection{Image feature support}
%
% \begin{macro}
@@ -408,7 +413,7 @@
\ior_str_map_inline:Nn \exp_not:N \l_@@_tmp_ior
{
\exp_not:N \@@_read_bb_auxiii:w
- ##1 ~ \c_colon_str \exp_not:N \q_stop
+ ##1 ~ \c_colon_str \s_@@_stop
}
}
\exp_not:n
@@ -425,12 +430,12 @@
\use:x
{
\cs_new_protected:Npn \exp_not:N \@@_read_bb_auxiii:w
- ##1 \c_colon_str ##2 \exp_not:N \q_stop
+ ##1 \c_colon_str ##2 \s_@@_stop
{
\exp_not:N \str_if_eq:nnT
{ \c_percent_str \c_percent_str BoundingBox }
{##1}
- { \exp_not:N \@@_read_bb_auxiv:w ##2 ( ) \exp_not:N \q_stop }
+ { \exp_not:N \@@_read_bb_auxiv:w ##2 ( ) \s_@@_stop }
}
}
% \end{macrocode}
@@ -441,7 +446,7 @@
% whitespace. \TeX{} will then tidy up for us, with just a leading space to
% worry about: that is taken out by the |\use:n| here.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_read_bb_auxiv:w #1 ( #2 ) #3 \q_stop
+\cs_new_protected:Npn \@@_read_bb_auxiv:w #1 ( #2 ) #3 \s_@@_stop
{
\str_if_eq:nnF {#2} { atend }
{
@@ -451,14 +456,14 @@
\char_set_catcode_space:n { 32 }
}
{ \use:n #1 }
- \exp_after:wN \@@_read_bb_auxv:w \l_@@_tmp_tl \q_stop
+ \exp_after:wN \@@_read_bb_auxv:w \l_@@_tmp_tl \s_@@_stop
}
}
% \end{macrocode}
% A trailing space was deliberately added earlier so we know that the final
% data point is terminated by a space.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_read_bb_auxv:w #1~#2~#3~#4~#5 \q_stop
+\cs_new_protected:Npn \@@_read_bb_auxv:w #1~#2~#3~#4~#5 \s_@@_stop
{
\dim_set:Nn \l_graphics_llx_dim { #1 bp }
\dim_set:Nn \l_graphics_lly_dim { #2 bp }
@@ -708,7 +713,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.ins b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.ins
index ef345b5969d..92af3d8915a 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.ins
+++ b/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.ins
@@ -1,6 +1,6 @@
\iffalse meta-comment
-File l3graphics.ins Copyright (C) 2017,2019,2020 The LaTeX3 Project
+File l3graphics.ins Copyright (C) 2017,2019-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -32,7 +32,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2019,2020 The LaTeX3 Project
+Copyright (C) 2019-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.ins b/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.ins
deleted file mode 100644
index e325be4520a..00000000000
--- a/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.ins
+++ /dev/null
@@ -1,60 +0,0 @@
-\iffalse meta-comment
-
-File: l3pdf.ins
-
-Copyright (C) 2019,2020 The LaTeX3 Project
-
-It may be distributed and/or modified under the conditions of the
-LaTeX Project Public License (LPPL), either version 1.3c of this
-license or (at your option) any later version. The latest version
-of this license is in the file
-
- http://www.latex-project.org/lppl.txt
-
-This file is part of the "l3experimental bundle" (The Work in LPPL)
-and all files in that bundle must be distributed together.
-
------------------------------------------------------------------------
-
-The development version of the bundle can be found at
-
- https://github.com/latex3/latex3
-
-for those people who are interested.
-
------------------------------------------------------------------------
-
-Any modification of this file should ensure that the copyright and
-license information is placed in the derived files.
-
-\fi
-
-\input l3docstrip.tex
-\askforoverwritefalse
-
-\preamble
-
-Copyright (C) 2019,2020 The LaTeX3 Project
-
-It may be distributed and/or modified under the conditions of
-the LaTeX Project Public License (LPPL), either version 1.3c of
-this license or (at your option) any later version. The latest
-version of this license is in the file:
-
- http://www.latex-project.org/lppl.txt
-
-This file is part of the "l3pdf bundle" (The Work in LPPL)
-and all files in that bundle must be distributed together.
-
-\endpreamble
-% stop docstrip adding \endinput
-\postamble
-\endpostamble
-
-\keepsilent
-
-\generate{\file{l3pdf.sty}
- {\from{l3pdf.dtx}{package}}
-}
-
-\endbatchfile
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
index af34128e5b7..9b0cf4a5a4d 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
@@ -2,7 +2,7 @@
%
%% File: l3str-format.dtx
%
-% Copyright (C) 2012-2020 The LaTeX3 Project
+% Copyright (C) 2012-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -40,7 +40,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -48,7 +48,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -158,7 +158,7 @@
% \section{\pkg{l3str-format} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -166,10 +166,8 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage{l3str-format}{2020-01-12}{}
+\ProvidesExplPackage{l3str-format}{2021-02-18}{}
{L3 Experimental string formatting}
-%</package>
% \end{macrocode}
%
% \subsection{Helpers}
@@ -191,7 +189,7 @@
%
% \begin{macro}[EXP]{\@@_format_if_digit:NTF}
% Here we expect |#1| to be a character with category other, or
-% \cs{s_stop}.
+% \cs{s_@@_stop}.
% \begin{macrocode}
\prg_new_conditional:Npnn \@@_format_if_digit:N #1 { TF }
{
@@ -203,9 +201,9 @@
%
% \begin{macro}[EXP]
% {\@@_format_put:nw, \@@_format_put:ow, \@@_format_put:fw}
-% Put |#1| after an \cs{s_stop} delimiter.
+% Put |#1| after an \cs{s_@@_stop} delimiter.
% \begin{macrocode}
-\cs_new:Npn \@@_format_put:nw #1 #2 \s_stop { #2 \s_stop #1 }
+\cs_new:Npn \@@_format_put:nw #1 #2 \s_@@_stop { #2 \s_@@_stop #1 }
\cs_generate_variant:Nn \@@_format_put:nw { o , f }
% \end{macrocode}
% \end{macro}
@@ -256,7 +254,7 @@
\cs_new:Npn \@@_format_parse:n #1
{
\exp_last_unbraced:Nf \@@_format_parse_auxi:NN
- { \__kernel_str_to_other:n {#1} } \s_stop \s_stop {#1}
+ { \__kernel_str_to_other:n {#1} } \s_@@_stop \s_@@_stop {#1}
}
\cs_new:Npx \@@_format_parse_auxi:NN #1#2
{
@@ -301,11 +299,11 @@
}
\cs_new:Npn \@@_format_parse_auxvii:nN #1#2
{
- \token_if_eq_meaning:NNTF \s_stop #2
+ \token_if_eq_meaning:NNTF \s_@@_stop #2
{ \@@_format_parse_end:nwn { #1 ? } #2 }
{ \@@_format_parse_end:nwn { #1 #2 } }
}
-\cs_new:Npn \@@_format_parse_end:nwn #1 #2 \s_stop \s_stop #3
+\cs_new:Npn \@@_format_parse_end:nwn #1 #2 \s_@@_stop \s_@@_stop #3
{
\tl_if_empty:nF {#2}
{ \__kernel_msg_expandable_error:nnn { str } { invalid-format } {#3} }
@@ -455,9 +453,9 @@
% \end{quote}
% First check that the \meta{alignment} is not |=|, and set the
% default alignment |?| to |<|. Place the modified information after
-% a trailing \cs{s_stop} for later retrieval. Then check that there
+% a trailing \cs{s_@@_stop} for later retrieval. Then check that there
% was no \meta{sign}. The width will be useful later, store it after
-% \cs{s_stop}. Afterwards, store the precision, and the function
+% \cs{s_@@_stop}. Afterwards, store the precision, and the function
% \cs{@@_range:nnn} that will be used to extract the first
% |#5| characters of the string.
% There is a need to use the internal function, as otherwise
@@ -495,14 +493,14 @@
}
}
\@@_format_tl_s:NNnnNNn
- \s_stop
+ \s_@@_stop
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[EXP]{\@@_format_tl_s:NNnnNNn}
% \begin{quote}
-% \cs{@@_format_tl_s:NNnnNNn} \cs{s_stop} \meta{function}
+% \cs{@@_format_tl_s:NNnnNNn} \cs{s_@@_stop} \meta{function}
% \Arg{arguments} \Arg{width} \meta{fill} \meta{alignment}
% \Arg{token list}
% \end{quote}
@@ -617,12 +615,12 @@
% \end{quote}
% First set the
% default alignment |?| to |>|. Place the modified information after
-% a trailing \cs{s_stop} for later retrieval. Then check the
+% a trailing \cs{s_@@_stop} for later retrieval. Then check the
% \meta{sign}: if the integer is negative, always put~|-|. Otherwise,
% if the format's \meta{sign} is |~|, put a space (with category
% \enquote{other}); if it is~|+| put |+|; if it is |-| (default), put
% nothing, represented as a brace group. The width |#4| will be
-% useful later, store it after \cs{s_stop}. Afterwards, check that
+% useful later, store it after \cs{s_@@_stop}. Afterwards, check that
% the \meta{precision} was absent. Finally, dispatch depending on the
% \meta{style}.
% \begin{macrocode}
@@ -660,14 +658,14 @@
{ str } { invalid-style-format } {#6} { int }
\@@_format_int:NwnnNNn \use:n
}
- \s_stop {#7}
+ \s_@@_stop {#7}
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[EXP]{\@@_format_int:NwnnNNn}
% \begin{quote}
-% \cs{@@_format_int:NwnnNNn} \meta{function} \cs{s_stop}
+% \cs{@@_format_int:NwnnNNn} \meta{function} \cs{s_@@_stop}
% \Arg{width} \Arg{sign} \meta{fill} \meta{alignment} \Arg{integer}
% \end{quote}
% Use the |format_align| function corresponding to the
@@ -680,7 +678,7 @@
% \item the \meta{fill} character.
% \end{itemize}
% \begin{macrocode}
-\cs_new:Npn \@@_format_int:NwnnNNn #1#2 \s_stop #3#4#5#6#7
+\cs_new:Npn \@@_format_int:NwnnNNn #1#2 \s_@@_stop #3#4#5#6#7
{
\exp_args:Nc \exp_args:Nf
{ @@_format_align_#6:nnnN }
@@ -728,13 +726,13 @@
% \Arg{floating point}
% \end{quote}
% First set the default alignment |?| to |>|. Place the modified
-% information after a trailing \cs{s_stop} for later retrieval. Then
+% information after a trailing \cs{s_@@_stop} for later retrieval. Then
% check the \meta{format sign} and the \meta{fp sign}: if the floating
% point is negative, always put~|-|. Otherwise (including
% \texttt{nan}), if the format's \meta{sign} is |~|, put a space (with
% category \enquote{other}); if it is~|+| put |+|; if it is |-|
% (default), put nothing, represented as a brace group. The width
-% |#4| will be useful later, store it after \cs{s_stop}. Afterwards,
+% |#4| will be useful later, store it after \cs{s_@@_stop}. Afterwards,
% check the \meta{precision}: if it was not given, replace it by $6$
% (default precision) unless no \meta{style} was given: in that case
% we want to use whatever precision is needed to fully describe the
@@ -776,20 +774,20 @@
{ str } { invalid-style-format } {#6} { fp }
\@@_format_fp:wnnnNNn \@@_format_fp_g:nn
}
- \s_stop {#7}
+ \s_@@_stop {#7}
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[EXP]{\@@_format_fp:wnnnNNn}
% \begin{quote}
-% \cs{@@_format_fp:wnnnNNn} \meta{formatting function} \cs{s_stop}
+% \cs{@@_format_fp:wnnnNNn} \meta{formatting function} \cs{s_@@_stop}
% \Arg{precision} \Arg{width} \Arg{sign} \meta{fill}
% \meta{alignment} \Arg{floating point}
% \end{quote}
% \begin{macrocode}
\cs_new:Npn \@@_format_fp:wnnnNNn
- #1 \s_stop #2 #3 #4 #5#6 #7
+ #1 \s_@@_stop #2 #3 #4 #5#6 #7
{
\exp_args:Nc \exp_args:Nf
{ @@_format_align_#6:nnnN }
@@ -850,7 +848,7 @@
{ \prg_replicate:nn { #4 - \c__fp_prec_int + 1 } { 0 } }
\@@_format_put:nw { #1 . #2 }
}
- \use_none:n \s_stop
+ \use_none:n \s_@@_stop
}
% \end{macrocode}
% \end{macro}
@@ -947,11 +945,11 @@
\cs_new:Npn \@@_format_fp_trim:w #1 e
{
\@@_format_fp_trim_loop:w #1
- ; \@@_format_fp_trim_loop:w 0; \@@_format_fp_trim_dot:w .; \s_stop e
+ ; \@@_format_fp_trim_loop:w 0; \@@_format_fp_trim_dot:w .; \s_@@_stop e
}
\cs_new:Npn \@@_format_fp_trim_loop:w #1 0; #2 { #2 #1 ; #2 }
\cs_new:Npn \@@_format_fp_trim_dot:w #1 .; { \@@_format_fp_trim_end:w #1 ; }
-\cs_new:Npn \@@_format_fp_trim_end:w #1 ; #2 \s_stop { #1 }
+\cs_new:Npn \@@_format_fp_trim_end:w #1 ; #2 \s_@@_stop { #1 }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -974,7 +972,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str.ins b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str.ins
index 76fc36a116c..4c2b0df987c 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str.ins
+++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str.ins
@@ -2,7 +2,7 @@
File l3str.ins
-Copyright (C) 2011-2017,2019,2020 The LaTeX3 Project
+Copyright (C) 2011-2017,2019-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2011-2020 The LaTeX3 Project
+Copyright (C) 2011-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
index c166811e114..9a7920fe3f3 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
@@ -2,7 +2,7 @@
%
%% File: l3sys-shell.dtx
%
-% Copyright (C) 2018-2020 The LaTeX3 Project
+% Copyright (C) 2018-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -38,7 +38,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -67,7 +67,7 @@
% \begin{syntax}
% \cs{sys_shell_mkdir:n} \Arg{directory}
% \end{syntax}
-% Creates the \meta{directory}, which should should be specified using |/| as
+% Creates the \meta{directory}, which should be specified using |/| as
% a path separator. If unrestricted shell escape is not enabled, no action is
% attempted.
% \end{function}
@@ -95,7 +95,7 @@
% \begin{syntax}
% \cs{sys_shell_rmdir:n} \Arg{directory}
% \end{syntax}
-% Removes the \meta{directory}, which should should be specified using |/| as
+% Removes the \meta{directory}, which should be specified using |/| as
% a path separator. If unrestricted shell escape is not enabled, no action is
% attempted.
% \end{function}
@@ -127,7 +127,7 @@
% \section{\pkg{l3sys-shell} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -135,12 +135,31 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage{l3sys-shell}{2020-01-12}{}
+\ProvidesExplPackage{l3sys-shell}{2021-02-18}{}
{L3 Experimental system shell functions}
-%</package>
% \end{macrocode}
%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_nil}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_nil:n}
+% Branching quark conditional.
+% \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:N { F }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[EXP]{\@@_path_to_win:n}
% \begin{macro}[EXP]{\@@_path_to_win:w}
% \begin{macro}[EXP]{\@@_path_to_win:N}
@@ -148,20 +167,20 @@
% \begin{macrocode}
\cs_new:Npn \@@_path_to_win:n #1
{
- \exp_after:wN \@@_path_to_win:w \tl_to_str:n {#1} ~ \q_stop
+ \exp_after:wN \@@_path_to_win:w \tl_to_str:n {#1} ~ \s_@@_stop
}
-\cs_new:Npn \@@_path_to_win:w #1 ~ #2 \q_stop
+\cs_new:Npn \@@_path_to_win:w #1 ~ #2 \s_@@_stop
{
- \@@_path_to_win:N #1 \q_nil
+ \@@_path_to_win:N #1 \q_@@_nil
\tl_if_empty:nF {#2}
{
\c_space_tl
- \@@_path_to_win:w #2 \q_stop
+ \@@_path_to_win:w #2 \s_@@_stop
}
}
\cs_new:Npn \@@_path_to_win:N #1
{
- \quark_if_nil:NF #1
+ \@@_quark_if_nil:NF #1
{
\token_if_eq_meaning:NNTF #1 /
{ \c_backslash_str }
@@ -364,7 +383,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.ins b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.ins
index 9ee35460cbd..025c282b726 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.ins
+++ b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.ins
@@ -2,7 +2,7 @@
File: l3sys-shell.ins
-Copyright (C) 2018-2020 The LaTeX3 Project
+Copyright (C) 2018-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2018-2020 The LaTeX3 Project
+Copyright (C) 2018-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
index 9f4aec0bcd9..86d3add8ae5 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
@@ -2,7 +2,7 @@
%
%% File: xcoffins.dtx
%
-% Copyright (C) 2010-2012,2014,2016-2020 The LaTeX3 Project
+% Copyright (C) 2010-2012,2014,2016-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -22,9 +22,6 @@
%
% for those people who are interested.
%
-%<*driver|package>
-\RequirePackage{xparse}
-%</driver|package>
%<*driver>
\documentclass[full]{l3doc}
\usepackage{xcoffins} % Not yet part of expl3, so not in l3doc
@@ -48,7 +45,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -56,7 +53,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -675,7 +672,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2020-01-12}{}
+\ProvidesExplPackage{xcoffins}{2021-02-18}{}
{L3 Experimental design level coffins}
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.ins b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.ins
index 52d5c24a449..218e38dec37 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.ins
+++ b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.ins
@@ -2,7 +2,7 @@
File: xcoffins.ins
-Copyright (C) 2010,2011,2012,2016,2017,2019,2020 The LaTeX3 Project
+Copyright (C) 2010,2011,2012,2016,2017,2019-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2010-2020 The LaTeX3 Project
+Copyright (C) 2010-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
index 14d9fc9e099..1c7c9bd9418 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
@@ -3,7 +3,7 @@
%% File: l3galley.dtx
%
% Copyright (C) 1999-2001,2004-2009 Frank Mittelbach
-% (C) 2010-2020 The LaTeX3 Project
+% (C) 2010-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -53,7 +53,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -61,7 +61,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -678,7 +678,7 @@
% level both of these need to be correctly saved.
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -686,23 +686,8 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage{l3galley}{2020-01-12}{}
+\ProvidesExplPackage{l3galley}{2021-02-18}{}
{L3 Experimental galley code}
-%</package>
-% \end{macrocode}
-%
-% \subsection{Support items}
-%
-% Functions or settings which are needed by the galley but perhaps also
-% elsewhere.
-%
-% The default hyphenation character should be set and hyphenation should be
-% enabled.
-% \begin{macrocode}
-%<*initex>
-\tex_defaulthyphenchar:D 45 \scan_stop:
-%</initex>
% \end{macrocode}
%
% \subsection{Scratch variables}
@@ -767,12 +752,7 @@
% The width of the current measure: the \enquote{running} setting can be
% inherited from \LaTeXe{}.
% \begin{macrocode}
-%<*initex>
-\dim_new:N \l_galley_text_width_dim
-%</initex>
-%<*package>
\cs_new_eq:NN \l_galley_text_width_dim \linewidth
-%</package>
% \end{macrocode}
% \end{variable}
%
@@ -782,12 +762,7 @@
% width are one way to define the measure width. See also the text width,
% which is an alternative view (and should be in sync with this one!).
% \begin{macrocode}
-%<*initex>
-\dim_new:N \l_galley_total_left_margin_dim
-%</initex>
-%<*package>
\cs_new_eq:NN \l_galley_total_left_margin_dim \@totalleftmargin
-%</package>
\dim_new:N \l_galley_total_right_margin_dim
% \end{macrocode}
% \end{variable}
@@ -1453,18 +1428,11 @@
% \LaTeXe{} \cs{@nodocument} is never removed from the register.
% This precaution is not be needed for a stand-alone format.
% \begin{macrocode}
-%<*initex>
-\tex_everypar:D % TEMP
- {
- \bool_if:NTF \g_@@_begin_level_bool
- { \@@_start_paragraph_first: }
- { \@@_start_paragraph_std: }
- }
-%</initex>
-%<*package>
\cs_undefine:N \everypar
\newtoks \everypar
-\AtBeginDocument
+\cs_if_exist:NTF \AtBeginDocument
+ { \AtBeginDocument }
+ { \use:n }
{
\tex_everypar:D
{
@@ -1474,7 +1442,6 @@
\tex_the:D \everypar
}
}
-%</package>
% \end{macrocode}
% \end{macro}
%
@@ -1751,7 +1718,7 @@
\cs_new_protected:Npn \galley_cutout_right:nn
{ \@@_cutout:nnn { right } }
% \end{macrocode}
-% The cutout information needs to be saved in in the appropriate sequence.
+% The cutout information needs to be saved in the appropriate sequence.
% First, the input is converted to a (temporary) sequence. If there is
% no existing cutout defined, this is simply stored. On the other hand,
% if there is a cutout already active, the new one needs to be added to
@@ -2497,10 +2464,6 @@
%
% \subsection{\LaTeXe{} functions}
%
-% \begin{macrocode}
-%<*package>
-% \end{macrocode}
-%
% \begin{macro}{\clearpage}
% The \tn{clearpage} macro needs to place material into the correct
% structures rather than directly onto the main vertical list. Other
@@ -2653,10 +2616,6 @@
%</package>
% \end{macrocode}
%
-% \begin{macrocode}
-%</initex|package>
-% \end{macrocode}
-%
% \end{implementation}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
index 5cd043a5e61..680e288fe37 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
@@ -3,7 +3,7 @@
%% File: xgalley.dtx
%
% Copyright (C) 1999-2001,2004-2009 Frank Mittelbach
-% (C) 2010-2012,2014,2016-2020 The LaTeX3 Project
+% (C) 2010-2012,2014,2016-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -23,9 +23,6 @@
%
% for those people who are interested.
%
-%<*driver|package>
-\RequirePackage{xparse}
-%</driver|package>
%<*driver>
\documentclass[full]{l3doc}
\begin{document}
@@ -39,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -47,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -121,7 +118,7 @@
% \subsection{Layer two: internal dimensions}
%
% \begin{TemplateInterfaceDescription}{measure}
-% \TemplateArgument{}{} ^^A A hack
+% \TemplateArgument{}{} ^^A Some hack
% \TemplateSemantics
% Sets the width available to typeset material within the galley.
% The \meta{left margin} and \meta{right margin} values are used in the
@@ -192,7 +189,7 @@
% \subsection{Layer three: paragraph shape}
%
% \begin{TemplateInterfaceDescription}{parshape}
-% \TemplateArgument{}{}^^A A hack
+% \TemplateArgument{}{}^^A Some hack
% \TemplateSemantics
% Template of this type define any shaping of the paragraph within the
% current measure of the galley. Thus they are used to generate
@@ -734,9 +731,9 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2020-01-12}{}
+\ProvidesExplPackage{xgalley}{2021-02-18}{}
{L3 Experimental galley}
-\RequirePackage{xparse,xtemplate,l3galley}
+\RequirePackage{xtemplate,l3galley}
% \end{macrocode}
%
% \subsection{Variables}
diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.ins b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.ins
index d0c89bcd2c9..8b5690d0799 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.ins
+++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.ins
@@ -2,7 +2,7 @@
File: xgalley.ins
-Copyright (C) 2010-2012,2016,2017,2019,2020 The LaTeX3 Project
+Copyright (C) 2010-2012,2016,2017,2019-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2010-2020 The LaTeX3 Project
+Copyright (C) 2010-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
index 080baf1bed3..23bbb5a8084 100644
--- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
@@ -2,7 +2,7 @@
%
%% File: expl3.dtx
%
-% Copyright (C) 1990-2020 The LaTeX3 Project
+% Copyright (C) 1990-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -24,7 +24,7 @@
%
%<*driver|generic|package|2ekernel>
%</driver|generic|package|2ekernel>
-\def\ExplFileDate{2020-03-06}%
+\def\ExplFileDate{2021-02-18}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -43,7 +43,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -74,13 +74,13 @@
% arguments.
% \end{itemize}
% This system is being used as the basis for \TeX{} programming within
-% the \LaTeX3 project. Note that the language is not intended for either
+% The \LaTeX{} Project. Note that the language is not intended for either
% document mark-up or style specification. Instead, it is intended that
% such features will be built on top of the conventions described here.
%
% This document is an introduction to the ideas behind the \pkg{expl3}
% programming interface. For the complete documentation of the programming
-% layer provided by the \LaTeX3 Project, see the accompanying
+% layer provided by The \LaTeX{} Project, see the accompanying
% \texttt{interface3} document.
%
% \end{abstract}
@@ -365,6 +365,13 @@
% distinguish variables from functions in the source when the |@@|
% convention is used.
%
+% Please note that you have to use the \pkg{l3docstrip} and
+% \textbf{not} the \pkg{docstrip} program in your \texttt{.ins} files
+% to make this work---the original \LaTeXe{} \pkg{docstrip} doesn't
+% understand the \texttt{@@} and will just copy it into your code
+% unmodified!
+%
+%
% \subsubsection{Variables: declaration}
%
% In well-formed \pkg{expl3} code, variables should always be declared before
@@ -416,6 +423,7 @@
% \item[bool] either true or false (the \LaTeX3 implementation does
% not use \tn{iftrue} or \tn{iffalse});
% \item[box] box register;
+% \item[cctab] category code table;
% \item[clist] comma separated list;
% \item[coffin] a \enquote{box with handles} --- a higher-level data
% type for carrying out |box| alignment operations;
@@ -518,9 +526,20 @@
% \end{arg-description}
% There are two other specifiers with more general meanings:
% \begin{arg-description}
-% \item[D] This means: \textbf{Do not use}. This special case is used
-% for \TeX{} primitives. Programmers outside the kernel team should
-% not use these functions!
+% \item[D] Stands for \textbf{Do not use}. This special case is used
+% for \TeX{} primitives. These functions have no standardized
+% syntax, they are engine dependent and their name can change
+% without warning, thus their use is \emph{strongly discouraged} in
+% package code: programmers should instead use the interfaces
+% documented in \href{interface3.pdf}{interface3.pdf}%^^A
+% \footnote{If a primitive offers a functionality not yet in the
+% kernel, programmers and users are encouraged to write to the
+% \texttt{LaTeX-L} mailing list
+% (\url{mailto:LATEX-L@listserv.uni-heidelberg.de}) describing
+% their use-case and intended behaviour, so that a possible
+% interface can be discussed. Temporarily, while an interface is
+% not provided, programmers may use the procedure described in the
+% \href{l3styleguide.pdf}{l3styleguide.pdf}.}.
% \item[w] This means that the argument syntax is \enquote{weird} in that it
% does not follow any standard rule. It is used for functions with
% arguments that take non standard forms: examples are \TeX{}-level
@@ -790,16 +809,14 @@
%
% \section{The distribution}
%
-% At present, the \pkg{expl3} modules are designed to be loaded on top
-% of \LaTeXe{}. In time, a \LaTeX3 format may be produced based on this
-% code.
+% The \pkg{expl3} modules are designed to be loaded on top of \LaTeXe{}.
%
% \begin{bfseries}
-% While \pkg{expl3} is still experimental, the bundle is now regarded
-% as broadly stable. The syntax conventions and functions provided
+% The core \pkg{expl3} language is broadly stable, and thus
+% the syntax conventions and functions provided
% are now ready for wider use. There may still be changes to some
% functions, but these will be minor when compared to the scope of
-% \pkg{expl3}.
+% \pkg{expl3}. A robust mechanism is in place for such deprecations.
% \end{bfseries}
%
% The distribution of \pkg{expl3} is split up into three packages on
@@ -813,7 +830,9 @@
% and any changes in this code are very limited. This material is
% therefore suitable for use in third-party packages without concern
% about changes in support. All of this code is documented in
-% \texttt{interface3.pdf}.
+% \texttt{interface3.pdf}. With an up-to-date \LaTeXe{} kernel, this
+% code is built into the format file and therefore can be used
+% without any further steps.
%
% The material in \pkg{l3packages} is also stable, but is not always
% at a programming level: most notably, \pkg{xparse} is stable and
@@ -826,9 +845,9 @@
% in terms of interface and functionality detail. Feedback on these
% modules is extremely valuable.
%
-% \section{Moving from \LaTeXe{} to \LaTeX3}
+% \section{Moving from \LaTeXe{} to \pkg{expl3}}
%
-% To help programmers to use \LaTeX3 code in existing \LaTeXe{} package,
+% To help programmers to use \pkg{expl3} code in existing \LaTeXe{} package,
% some short notes on making the change are probably desirable.
% Suggestions for inclusion here are welcome! Some of the following
% is concerned with code, and some with coding style.
@@ -837,11 +856,10 @@
% \item \pkg{expl3} is mainly focused on programming. This means that
% some areas still require the use of \LaTeXe{} internal macros.
% For example, you may well need \tn{@ifpackageloaded}, as there
-% is currently no native \LaTeX3 package loading module.
+% is currently no native \pkg{expl3} package loading module.
% \item User level macros should be generated using the mechanism
% available in the \pkg{xparse} package, which is part of the
-% \texttt{l3package} bundle, available from CTAN or the \LaTeX3 SVN
-% repository.
+% \texttt{l3package} bundle.
% \item At an internal level, most functions should be generated
% \tn{long} (using \cs{cs_new:Npn}) rather than \enquote{short} (using
% \cs{cs_new_nopar:Npn}).
@@ -886,7 +904,7 @@
% updated in time.
%
% \DescribeOption{check-declarations}
-% All variables used in \LaTeX3 code should be declared. This is enforced
+% All variables used in \pkg{expl3} code should be declared. This is enforced
% by \TeX{} for variable types based on \TeX{} registers, but not for those
% which are constructed using macros as the underlying storage system. The
% \texttt{check-declarations} option enables checking for all variable
@@ -899,7 +917,7 @@
% function name in the \texttt{.log} file. This is useful for debugging
% purposes, as it means that there is a complete list of all functions
% created by each module loaded (with the exceptions of a very small number
-% required by the bootstrap code for \LaTeX3). See also \cs{debug_on:n}
+% required by the bootstrap code). See also \cs{debug_on:n}
% \texttt{\{log-functions\}} in \pkg{l3candidates} for finer control.
%
% \DescribeOption{enable-debug}
@@ -917,10 +935,13 @@
% \item[dvips] Use the \texttt{dvips} driver.
% \item[dvipdfmx] Use the \texttt{dvipdfmx} driver.
% \item[dvisvgm] Use the \texttt{dvisvgm} driver.
-% \item[pdfmode] Use the \texttt{pdfmode} driver (direct PDF output from
-% \pdfTeX{} or \LuaTeX{}).
-% \item[xdvipdfmx] Use the \texttt{xdvipdfmx} driver (\XeTeX{} only).
+% \item[luatex] Use the direct PDF output mode of \LuaTeX{}
+% \item[pdftex] Use the direct PDF output mode of \pdfTeX{}
+% \item[xetex] Use the \XeTeX{} version of the \texttt{dvipdfmx} driver.
% \end{itemize}
+% For historical reasons, there is also \texttt{pdfmode} as an equivalent of
+% \texttt{luatex} or \texttt{pdftex}, and \texttt{xdvipdfmx} as
+% an equivalent to \texttt{xetex}, but these are deprecated
%
% \DescribeOption{suppress-backend-headers}
% The \texttt{suppress-backend-headers} option suppresses loading of
@@ -928,6 +949,12 @@
% This option is available to support DVI-based routes that do not
% support the |header| line used by \texttt{dvips}.
%
+% The debugging options may also be given using
+% \verb|\keys_set:nn { sys } { ... }|; the \texttt{backend} option can be
+% given in this way \emph{only} if a backend has not already been loaded.
+% This method of setting options is useful where \pkg{expl3} is pre-loaded
+% by the \LaTeXe{} format.
+%
% \section{Using \pkg{expl3} with formats other than \LaTeXe{}}
%
% As well as the \LaTeXe{} package \pkg{expl3}, there is also a
@@ -979,9 +1006,9 @@
% primitives. In particular, third-party authors may significantly
% extend the primitive coverage requirements.
%
-% \section{The \LaTeX3 Project}
+% \section{The \LaTeX{} Project}
%
-% Development of \LaTeX3 is carried out by The \LaTeX3 Project:
+% Development of \LaTeX3 is carried out by The \LaTeX{} Project:
% \url{https://www.latex-project.org/latex3/}.
%
% \begin{thebibliography}{1}
@@ -1003,7 +1030,7 @@
%
% \bibitem{tub:MR97-1}
% Frank Mittelbach and Chris Rowley.
-% \newblock \enquote{The \LaTeX3 Project}.
+% \newblock \enquote{The \LaTeX{} Project}.
% \newblock \emph{TUGboat},
% Vol.\,18, No.\,3, pp.\,195--198, 1997.
%
@@ -1039,6 +1066,33 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\c__kernel_expl_date_tl}
+% The \LaTeXe{} loader stores a private copy of \cs{ExplFileDate},
+% which is fixed when the format is build and cannot be changed later.
+% While \cs{ExplFileDate} ensures that the loader (either
+% \texttt{2ekernel} or \texttt{package}) version matches the version
+% of \file{expl3-code.tex}, this one ensures that the version of an
+% eventual |\usepackage{expl3}| matches the version from the format.
+% It seems to be common to have stray format files in the user tree
+% which trigger errors due to mismatched versions (\emph{e.g.}
+% \url{https://github.com/latex3/latex3/issues/781}).
+%
+% This block also goes to the generic loader, as \pkg{expl3} isn't
+% preloaded there, so the kernel date should be equal to the loader
+% date.
+% \begin{macrocode}
+%<*2ekernel|generic>
+\begingroup
+ \catcode`\_=11
+ \expandafter
+ \ifx\csname c__kernel_expl_date_tl\endcsname\relax
+ \global\let\c__kernel_expl_date_tl\ExplFileDate
+ \fi
+\endgroup
+%</2ekernel|generic>
+% \end{macrocode}
+% \end{macro}
+%
% The interlock test itself is simple: \cs{ExplLoaderFileDate} must be
% defined and identical to \cs{ExplFileDate}. As this has to work for
% both \LaTeXe{} and other formats, there is some auto-detection involved.
@@ -1149,23 +1203,40 @@
%
% \begin{macro}{\ProvidesExplPackage, \ProvidesExplClass, \ProvidesExplFile}
% For other packages and classes building on this one it is convenient
-% not to need \cs{ExplSyntaxOn} each time.
+% not to need \cs{ExplSyntaxOn} each time. All macros use the same
+% internal one with the proper \LaTeXe{} command.
% \begin{macrocode}
-\protected\def\ProvidesExplPackage#1#2#3#4%
- {%
- \ProvidesPackage{#1}[#2 \ifx\relax#3\relax\else v#3\space\fi #4]%
- \ExplSyntaxOn
- }%
-\protected\def\ProvidesExplClass#1#2#3#4%
+\protected\def\ProvidesExplPackage
+ {\@expl@provides@file@@Nnnnnn\ProvidesPackage{Package}}
+\protected\def\ProvidesExplClass
+ {\@expl@provides@file@@Nnnnnn\ProvidesClass{Document Class}}
+\protected\def\ProvidesExplFile
+ {\@expl@provides@file@@Nnnnnn\ProvidesFile{File}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@expl@provides@file@@Nnnnnn, \@expl@provides@generic@@wnnw}
+% We need to check the existence of the
+% \cs[no-index]{Provides\meta{thing}}, since we need to load this very
+% early in the \LaTeXe{} kernel.
+% \begin{macrocode}
+\protected\long\def\@expl@provides@file@@Nnnnnn#1#2#3#4#5#6%
{%
- \ProvidesClass{#1}[#2 \ifx\relax#3\relax\else v#3\space\fi #4]%
+ \ifnum0%
+ \ifdefined#11\fi
+ \ifx\relax#1\else1\fi
+ =11
+ \expandafter#1%
+ \else
+ \@expl@provides@generic@@wnnw{#2}%
+ \fi
+ {#3}[{#4 \ifx\relax#5\relax\else v#5\space\fi #6}]%
\ExplSyntaxOn
- }%
-\protected\def\ProvidesExplFile#1#2#3#4%
+ }
+\protected\long\def\@expl@provides@generic@@wnnw#1\fi#2[#3]%
{%
- \ProvidesFile{#1}[#2 \ifx\relax#3\relax\else v#3\space\fi #4]%
- \ExplSyntaxOn
- }%
+ \immediate\write-1{#1: #2 #3}%
+ }
% \end{macrocode}
% \end{macro}
%
@@ -1179,7 +1250,7 @@
\else
\expandafter\@gobble
\fi
- {\input{expl3-code.tex}}%
+ {\input expl3-code.tex }%
% \end{macrocode}
%
% A check that the bootstrap code did not abort loading: if it did,
@@ -1191,24 +1262,81 @@
\fi
% \end{macrocode}
%
-% If \pkg{expl3} was pre-loaded, we now have to deal with the fact that
-% the syntax will not be activated for the package mode version:
-% simply turn it on. We use \tn{@pushfilenameaux} as a marker: it's defined
-% a little later.
% \begin{macrocode}
-\ifdefined\@pushfilenameaux
- \ExplSyntaxOn
+%<@@=expl>
+% \end{macrocode}
+%
+% At this point, if we have \cs{c__kernel_expl_date_tl} defined, just
+% call the \cs{__kernel_dependency_version_check:Nn} auxiliary to check
+% if it matches \cs{ExplLoaderFileDate}. Here the test is performed
+% only if \cs{c__kernel_expl_date_tl} exists because this file can be
+% loaded in a \LaTeXe{} format without \pkg{expl3} preloaded, where that
+% token list doesn't exist.
+%
+% This is all done in the \texttt{package} \pkg{docstrip} guard because
+% it doesn't apply to \pkg{expl3.ltx}.
+% \begin{macrocode}
+%<*package>
+\ifcsname\detokenize{c__kernel_expl_date_tl}\endcsname
+ \expandafter\@firstofone
+\else
+% \end{macrocode}
+% If \cs{c__kernel_expl_date_tl} does \emph{not} exist we may be loading
+% in a format without \pkg{expl3} preloaded or in the earlier (although
+% still compatible) version in which the error mentioned above showed
+% up. If loading as a package, \file{expl3-code.tex} got read and here
+% the \pkg{expl3} syntax is on. Otherwise it was already loaded in a
+% sligtly older kernel, so we fire the incompatibility error message and
+% abort loading.
+% \begin{macrocode}
+ \ifodd\csname\detokenize{l__kernel_expl_bool}\endcsname
+% \end{macrocode}
+% In package mode all files are loaded in one go, so versions will
+% match. We just have to set \cs{c__kernel_expl_date_tl} so that
+% further dependencies don't break:
+% \begin{macrocode}
+ \global\expandafter\let\csname\detokenize
+ {c__kernel_expl_date_tl}\endcsname\ExplLoaderFileDate
+ \expandafter\expandafter
+ \expandafter\@gobble
+ \else
+% \end{macrocode}
+% And reloading in an incompatible version is an error:
+% \begin{macrocode}
+ \expandafter\expandafter
+ \expandafter\@firstofone
+ \fi
\fi
+ {\csname\detokenize{__kernel_dependency_version_check:Nn}\endcsname
+ \ExplLoaderFileDate{expl3.sty}}%
+%</package>
% \end{macrocode}
%
+% Here we can also detect whether we're reloading. This code goes into
+% \texttt{expl3.ltx} and \texttt{expl3.sty}, the former loaded into the
+% \LaTeXe{} format. When this code is loaded for the first time, the
+% \cs{g_@@_reload_bool} boolean doesn't exist (\cs{else} branch of the
+% \cs{ifcsname} below), so we create it. If the \cs{ifcsname} is true,
+% then we do \cs{ExplSyntaxOn} (because when reloading,
+% \texttt{expl3-code.tex} isn't read again), and set
+% \cs{g_@@_reload_bool} to true.
% \begin{macrocode}
-%<@@=expl>
+\ifcsname\detokenize{g_@@_reload_bool}\endcsname
+ \ExplSyntaxOn
+ \bool_gset_true:N \g_@@_reload_bool
+\else
+ \bool_new:N \g_@@_reload_bool
+\fi
% \end{macrocode}
%
% \begin{variable}{\c_@@_def_ext_tl}
-% Needed by \LaTeXe{}, and avoiding a re-load issue.
+% Needed by \LaTeXe{}, and avoiding a re-load issue. Variables are
+% best checked explicitly, rather than with \cs{g_@@_reload_bool}
+% because some appear only in one of the code files, so
+% \cs{g_@@_reload_bool} doesn't necessarily mean that the variable
+% is already declared.
% \begin{macrocode}
-\cs_if_exist:NF \c_@@_def_ext_tl
+\tl_if_exist:NF \c_@@_def_ext_tl
{ \tl_const:Nn \c_@@_def_ext_tl { def } }
% \end{macrocode}
% \end{variable}
@@ -1248,7 +1376,7 @@
% \begin{variable}{\l_@@_options_clist}
% \begin{macrocode}
%<*!2ekernel>
-\cs_if_exist:NF \l_@@_options_clist
+\clist_if_exist:NF \l_@@_options_clist
{ \clist_new:N \l_@@_options_clist }
\DeclareOption*
{ \clist_put_right:NV \l_@@_options_clist \CurrentOption }
@@ -1262,7 +1390,7 @@
\keys_define:nn { sys }
{
backend .choices:nn =
- { dvipdfmx , dvips , dvisvgm , pdfmode , xdvipdfmx }
+ { dvipdfmx , dvips , dvisvgm , luatex , pdftex , pdfmode , xdvipdfmx , xetex }
{ \sys_load_backend:n {#1} } ,
check-declarations .code:n =
{
@@ -1288,19 +1416,74 @@
}
% \end{macrocode}
%
-% A backend has to be in place by the start of the document: this has to be
-% before global options are checked for use. The odd group stuff avoids
-% needing to actually patch \tn{document}.
+% \begin{macro}{\@expl@sys@load@backend@@@@}
+% A backend has to be in place by the start of the document: this has
+% to be before global options are checked for use.
+%
+% The \cs[no-index]{@expl@...@@@@} macros defined in this package are
+% interfaces for \LaTeXe{}. There are currently (this will change
+% with the next release of \LaTeXe{}) two possible cases, at this
+% point of the code: either \cs{@expl@sys@load@backend@@@@} (and the
+% others) already exist because they were defined in
+% \texttt{ltexpl.ltx} (in \texttt{2ekernel} mode) or in
+% \texttt{expl3.ltx} (in \texttt{package} mode).
+%
+% In \texttt{2ekernel} mode, if they exist we are using a future
+% (2020-10-01) release of \LaTeXe{} and we don't need (and can't)
+% patch \LaTeXe's internals because these commands are already there.
+% Though if they don't exist in \texttt{2ekernel} mode, we're using
+% an older version of the kernel, so we \emph{must} patch.
+%
+% In \texttt{package} mode, if these commands exist, then we are using
+% a version of \LaTeXe{} with \textsf{expl3} preloaded (any version)
+% and in any case patching is already done or the macros are in the
+% format itself, so nothing to do.
+% But if in \texttt{package} mode these macros don't exist, we have an
+% even older version of \LaTeXe{} which doesn't even have
+% \textsf{expl3} preloaded, so patching is necessary.
+%
+% All this means that in both \texttt{2ekernel} and \texttt{package}
+% mode we have to check whether \cs{@expl@sys@load@backend@@@@}
+% exists, and patch some \LaTeXe{} internals if it doesn't.
+%
+% In newer \LaTeXe{}, these macros have an empty definition in
+% \texttt{ltexpl.dtx} in case something wrong happens while loading
+% this file (\texttt{expl3.ltx}), so they can safely be used in the
+% \LaTeXe{} kernel.
+%
+% \cs{@expl@sys@load@backend@@@@} is inserted right at the beginning
+% of \cs{document}, but after closing the group started by \cs{begin}.
+% When using \cs{tl_put_left:Nn} to patch the backend loading in
+% \cs{document}, we need to make sure that it happens at group level
+% zero, thus the strange |\endgroup...\begingroup| thing.
+%
+% This chunk of code should only be executed when loading
+% \texttt{expl3.sty} in a \LaTeXe{} without \pkg{expl3} preloaded, so
+% we check if \cs{@expl@sys@load@backend@@@@} exists.
% \begin{macrocode}
-%<*2ekernel>
-\tl_put_left:Nn \document
+\cs_if_exist:NF \@expl@sys@load@backend@@@@
+ {
+ \tl_put_left:Nn \document
+ {
+ \endgroup
+ \@expl@sys@load@backend@@@@
+ \begingroup
+ }
+ }
+% \end{macrocode}
+%
+% Now we define it anyhow.
+% \begin{macrocode}
+\cs_gset_protected:Npn \@expl@sys@load@backend@@@@
{
- \endgroup
\str_if_exist:NF \c_sys_backend_str
{ \sys_load_backend:n { } }
- \begingroup
}
-%</2ekernel>
+% \end{macrocode}
+% \end{macro}
+%
+% Process package options.
+% \begin{macrocode}
%<*!2ekernel>
\keys_set:nV { sys } \l_@@_options_clist
\str_if_exist:NF \c_sys_backend_str
@@ -1308,15 +1491,14 @@
%</!2ekernel>
% \end{macrocode}
%
-% A test for pre-loading: does \tn{@pushfilenameaux} already exist.
-% The alrady-loaded mechanism will handle everything now.
% \begin{macrocode}
%<*!2ekernel>
-\cs_if_exist:NT \@pushfilenameaux
+\bool_if:NT \g_@@_reload_bool
{
\cs_gset_eq:NN \__kernel_sys_configuration_load:n
\__kernel_sys_configuration_load_std:n
- \endinput
+ \ExplSyntaxOff
+ \file_input_stop:
}
%</!2ekernel>
% \end{macrocode}
@@ -1334,19 +1516,41 @@
{ \sys_everyjob: }
% \end{macrocode}
%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks. This code has to be reload-safe, so this one
+% has to be guarded with \cs{if_cs_exist:N} (\cs{cs_if_exist:NF}) wouldn't
+% do because it returns false for control sequences equal to \cs{scan_stop:}.
+% \begin{macrocode}
+\reverse_if:N \if_cs_exist:N \s_@@_stop
+ \scan_new:N \s_@@_stop
+\fi:
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\@pushfilename, \@popfilename}
% \begin{macro}{\@@_status_pop:w}
+% \begin{macro}{\@expl@push@filename@@@@}
+% \begin{macro}{\@expl@push@filename@aux@@@@}
+% \begin{macro}{\@expl@pop@filename@@@@}
% The idea here is to use \LaTeXe{}'s \tn{@pushfilename} and
% \tn{@popfilename} to track the current syntax status. This can be
% achieved by saving the current status flag at each push to a stack,
% then recovering it at the pop stage and checking if the code
% environment should still be active.
+%
+% Here the code follows the same patching logic than above for
+% \cs{@expl@sys@load@backend@@@@}.
% \begin{macrocode}
-\tl_put_left:Nn \@pushfilename
+\cs_if_exist:NF \@expl@push@filename@@@@
+ {
+ \tl_put_left:Nn \@pushfilename { \@expl@push@filename@@@@ }
+ \tl_put_right:Nn \@pushfilename { \@expl@push@filename@aux@@@@ }
+ }
+\cs_gset_protected:Npn \@expl@push@filename@@@@
{
\exp_args:Nx \__kernel_file_input_push:n
{
- \tl_to_str:N \@currname
+ \tl_to_str:N \@currname .
\tl_to_str:N \@currext
}
\tl_put_left:Nx \l_@@_status_stack_tl
@@ -1357,29 +1561,36 @@
}
\ExplSyntaxOff
}
-\tl_put_right:Nn \@pushfilename { \@pushfilenameaux }
% \end{macrocode}
% This bit of trickery is needed to grab the name of the file being loaded
% so we can record it.
% \begin{macrocode}
-\cs_set_protected:Npn \@pushfilenameaux #1#2#3
+\cs_gset_protected:Npn \@expl@push@filename@aux@@@@ #1#2#3
{
\str_gset:Nn \g_file_curr_name_str {#3}
#1 #2 {#3}
}
-\tl_put_right:Nn \@popfilename
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_if_exist:NF \@expl@pop@filename@@@@
+ {
+ \tl_put_right:Nn \@popfilename
+ { \@expl@pop@filename@@@@ }
+ }
+\cs_gset_protected:Npn \@expl@pop@filename@@@@
{
\__kernel_file_input_pop:
\tl_if_empty:NTF \l_@@_status_stack_tl
{ \ExplSyntaxOff }
- { \exp_after:wN \@@_status_pop:w \l_@@_status_stack_tl \q_stop }
+ { \exp_after:wN \@@_status_pop:w \l_@@_status_stack_tl \s_@@_stop }
}
% \end{macrocode}
% The pop auxiliary function removes the first item from the stack,
% saves the rest of the stack and then does the test. The flag here
% is not a proper \texttt{bool}, so a low-level test is used.
% \begin{macrocode}
-\cs_gset_protected:Npn \@@_status_pop:w #1#2 \q_stop
+\cs_gset_protected:Npn \@@_status_pop:w #1#2 \s_@@_stop
{
\tl_set:Nn \l_@@_status_stack_tl {#2}
\int_if_odd:nTF {#1}
@@ -1389,6 +1600,9 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{variable}{\l_@@_status_stack_tl}
% As \pkg{expl3} itself cannot be loaded with the code environment
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3.ins b/Master/texmf-dist/source/latex/l3kernel/l3.ins
index 86d4ac52801..91c471e75e8 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3.ins
+++ b/Master/texmf-dist/source/latex/l3kernel/l3.ins
@@ -2,7 +2,7 @@
File l3.ins
-Copyright (C) 2011,2012,2014-2020 The LaTeX3 Project
+Copyright (C) 2011,2012,2014-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 1990-2020 The LaTeX3 Project
+Copyright (C) 1990-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -58,23 +58,21 @@ and all files in that bundle must be distributed together.
{
\file{expl3-code.tex}
{
- % ======== PACKAGE ONLY ========
\from{expl3.dtx} {package}
- % ==============================
\from{l3bootstrap.dtx} {package}
- \from{l3names.dtx} {package}
+ \from{l3names.dtx} {package,tex}
\from{l3basics.dtx} {package}
\from{l3expan.dtx} {package}
+ \from{l3quark.dtx} {package}
\from{l3tl.dtx} {package}
\from{l3str.dtx} {package}
- \from{l3quark.dtx} {package}
\from{l3seq.dtx} {package}
\from{l3int.dtx} {package}
\from{l3flag.dtx} {package}
\from{l3prg.dtx} {package}
- \from{l3sys.dtx} {package}
+ \from{l3sys.dtx} {package,tex}
\from{l3clist.dtx} {package}
- \from{l3token.dtx} {package}
+ \from{l3token.dtx} {package,tex}
\from{l3prop.dtx} {package}
\from{l3msg.dtx} {package}
\from{l3file.dtx} {package}
@@ -95,12 +93,14 @@ and all files in that bundle must be distributed together.
\from{l3fp-convert.dtx} {package}
\from{l3fp-random.dtx} {package}
\from{l3fparray.dtx} {package}
+ \from{l3cctab.dtx} {package}
\from{l3sort.dtx} {package}
\from{l3str-convert.dtx}{package}
\from{l3tl-analysis.dtx}{package}
\from{l3regex.dtx} {package}
\from{l3box.dtx} {package}
- \from{l3color-base.dtx} {package}
+ \from{l3color.dtx} {package}
+ \from{l3pdf.dtx} {package}
\from{l3coffins.dtx} {package}
\from{l3luatex.dtx} {package,tex}
\from{l3unicode.dtx} {package}
@@ -152,7 +152,7 @@ and all files in that bundle must be distributed together.
\def\MetaPrefix{--}
\preamble
-Copyright (C) 1990-2020 The LaTeX3 Project
+Copyright (C) 1990-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -166,6 +166,11 @@ and all files in that bundle must be distributed together.
\endpreamble
\nopostamble
-\generate{\file{expl3.lua}{\from{l3luatex.dtx}{package,lua}}}
+\generate{\file{expl3.lua}{
+ \from{l3luatex.dtx}{package,lua}
+ \from{l3names.dtx}{package,lua}
+ \from{l3sys.dtx}{package,lua}
+ \from{l3token.dtx}{package,lua}
+}}
\endbatchfile
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
deleted file mode 100644
index 190b3edc379..00000000000
--- a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx
+++ /dev/null
@@ -1,195 +0,0 @@
-% \iffalse meta-comment
-%
-%% File: l3alloc.dtx
-%
-% Copyright (C) 1990-2012,2014-2020 The LaTeX3 Project
-%
-% It may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this
-% license or (at your option) any later version. The latest version
-% of this license is in the file
-%
-% https://www.latex-project.org/lppl.txt
-%
-% This file is part of the "l3kernel bundle" (The Work in LPPL)
-% and all files in that bundle must be distributed together.
-%
-% -----------------------------------------------------------------------
-%
-% The development version of the bundle can be found at
-%
-% https://github.com/latex3/latex3
-%
-% for those people who are interested.
-%
-%<*driver>
-\documentclass[full,kernel]{l3doc}
-\begin{document}
- \DocInput{\jobname.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \title{^^A
-% The \pkg{l3alloc} package\\ Register allocation^^A
-% }
-%
-% \author{^^A
-% The \LaTeX3 Project\thanks
-% {^^A
-% E-mail:
-% \href{mailto:latex-team@latex-project.org}
-% {latex-team@latex-project.org}^^A
-% }^^A
-% }
-%
-% \date{Released 2020-03-06}
-%
-% \maketitle
-%
-% \begin{documentation}
-%
-% This module provides the basic mechanism for allocating \TeX{}'s
-% registers when operating in format mode. When loaded as a package on
-% an existing format, the mechanisms from the latter are used.
-%
-% The approach used here is informed by the mechanisms used in plain
-% \TeX{}/\LaTeX{} but noting that newer engines provide us much more
-% flexibility. In addition to this, we do not need allocators for all
-% register types: for example \texttt{toks} are not used by \LaTeX3 whilst
-% reads/writes are handled using a pool and thus do not need a classical
-% allocator.
-%
-% In classical (non-\LuaTeX{}) engines, there are various restriction on
-% registers, for example |\box255| is hard-coded as the output box and
-% inserts have to be allocated below this (not in the extended pool). Rather
-% than worry about this, allocations for the registers affected (\TeX{}
-% |box|, |count|, |dimen| and |skip| types) are simply made only from the
-% extended pool. (There is a performance impact in engines other than
-% \LuaTeX{} but the free use of registers in \pkg{expl3} means that code
-% cannot be sure of obtaining a low-numbered register in any case.)
-%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3alloc} implementation}
-%
-% \begin{macrocode}
-%<*initex>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=alloc>
-% \end{macrocode}
-%
-% \begin{variable}
-% {
-% \g_@@_int_int ,
-% \g_@@_dim_int ,
-% \g_@@_muskip_int ,
-% \g_@@_int_int ,
-% \g_@@_box_int
-% }
-% The core register tracking is done using the same raw \TeX{} count
-% registers as reserved by plain \TeX{} and \LaTeXe{}, as there may be the
-% odd piece of generic code that needs to work by number. However, as not
-% all of our variables work the same way, some of the older registers are
-% simply ignored. For the same reason, there is no special status for the
-% low-numbers registers other than counts. To avoid having to worry about
-% inserts and reflecting the register availability in \eTeX{}, the lower
-% register space is unused here (though is available for hard-coded
-% use).
-% \begin{macrocode}
-\tex_countdef:D \g_@@_int_int = 10 ~
-\tex_countdef:D \g_@@_dim_int = 11 ~
-\tex_countdef:D \g_@@_skip_int = 12 ~
-\tex_countdef:D \g_@@_muskip_int = 13 ~
-\tex_countdef:D \g_@@_box_int = 14 ~
-\g_@@_int_int = 255 ~
-\g_@@_dim_int = 255 ~
-\g_@@_skip_int = 255 ~
-\g_@@_muskip_int = 0 ~
-\g_@@_box_int = 255 ~
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}
-% {
-% \g_@@_attribute_int ,
-% \g_@@_bytecode_int ,
-% \g_@@_chunkname_int ,
-% \g_@@_whatsit_int
-% }
-% To allow \LuaTeX{} to load |ltluatex.lua| for generic \Lua{} support, a
-% small number of counts have to be correctly named at the \TeX{} level.
-% At present there are no \pkg{expl3} allocators for these concepts so the
-% names and numbers of the tracking variables may change.
-% \begin{macrocode}
-\tex_ifdefined:D \tex_luatexversion:D
- \tex_global:D \tex_countdef:D \g_@@_attribute_int = 21 ~
- \tex_global:D \tex_countdef:D \g_@@_bytecode_int = 22 ~
- \tex_global:D \tex_countdef:D \g_@@_chunkname_int = 23 ~
- \tex_global:D \tex_countdef:D \g_@@_whatsit_int = 24 ~
-\tex_fi:D
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}
-% {\box_new:N, \dim_new:N, \int_new:N, \muskip_new:N \skip_new:N}
-% Each of the public allocators is a wrapper around the one internal
-% function needed here.
-% \begin{macrocode}
-\cs_new_protected:Npx \box_new:N #1
- {
- \exp_not:N \@@_reg:nNnN { box }
- \cs_if_exist:NTF \tex_luatexversion:D
- { \tex_chardef:D }
- {
- \cs_if_exist:NTF \tex_omathchardef:D
- { \tex_omathchardef:D }
- { \tex_mathchardef:D }
- }
- \c_max_register_int
- #1
- }
-\cs_new_protected:Npn \dim_new:N #1
- { \@@_reg:nNnN { dim } \tex_dimendef:D \c_max_register_int #1 }
-\cs_new_protected:Npn \int_new:N #1
- { \@@_reg:nNnN { int } \tex_countdef:D \c_max_register_int #1 }
-\cs_new_protected:Npn \muskip_new:N #1
- { \@@_reg:nNnN { muskip } \tex_muskipdef:D \c_max_register_int #1 }
-\cs_new_protected:Npn \skip_new:N #1
- { \@@_reg:nNnN { skip } \tex_skipdef:D \c_max_register_int #1 }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_reg:nNNN}
-% The allocator itself is modelled somewhat on \LaTeXe{}'s \tn{e@alloc},
-% though there is no need to set \tn{allocationnumber}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_reg:nNnN #1#2#3#4
- {
- \__kernel_chk_if_free_cs:N #4
- \int_compare:nNnTF { \int_use:c { g_@@_ #1 _int } } < {#3}
- {
- \int_gincr:c { g_@@_ #1 _int }
- \tex_global:D #2 #4 \int_use:c { g_@@_ #1 _int }
- \iow_log:x
- {
- \token_to_str:N #4 ~=~ #1 ~register~
- \int_use:c { g_@@_ #1 _int }
- }
- }
- { \__kernel_msg_fatal:nnx { kernel } { out-of-registers } {#1} }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-%</initex>
-% \end{macrocode}
-%
-% \end{implementation}
-%
-% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
index 349ec432352..9a82102634f 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
@@ -2,7 +2,7 @@
%
%% File: l3basics.dtx
%
-% Copyright (C) 1990-2020 The LaTeX3 Project
+% Copyright (C) 1990-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -1293,7 +1293,7 @@
% \end{texnote}
% \end{function}
%
-% \subsection{Debugging support}
+% \section{Debugging support}
%
% \begin{function}[added = 2017-07-16, updated = 2017-08-02]{\debug_on:n, \debug_off:n}
% \begin{syntax}
@@ -1339,7 +1339,7 @@
% \section{\pkg{l3basics} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \subsection{Renaming some \TeX{} primitives (again)}
@@ -1368,6 +1368,7 @@
\tex_let:D \if_charcode:w \tex_if:D
\tex_let:D \if_catcode:w \tex_ifcat:D
\tex_let:D \if_meaning:w \tex_ifx:D
+\tex_let:D \if_bool:N \tex_ifodd:D
% \end{macrocode}
% \end{macro}
%
@@ -1693,7 +1694,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}
+% \begin{macro}[EXP]
% {
% \use_i_delimit_by_q_nil:nw ,
% \use_i_delimit_by_q_stop:nw ,
@@ -1846,6 +1847,14 @@
% two arguments are absorbed then the code would work.
% \end{macro}
%
+% \begin{macro}[EXP]{\@@_use_none_delimit_by_q_recursion_stop:w}
+% Private version of \cs{use_none_delimit_by_q_recursion_stop:w}.
+% \begin{macrocode}
+\cs_set:Npn \@@_use_none_delimit_by_q_recursion_stop:w
+ #1 \q_@@_recursion_stop { }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}
% {
% \prg_set_conditional:Npnn ,
@@ -1981,17 +1990,17 @@
\exp_not:N \@@_generate_conditional:NNnnnnNw
\exp_not:n { #4 #5 {#1} {#2} {#6} }
\@@_generate_conditional_test:w
- #8 \q_mark
+ #8 \s_@@_mark
\@@_generate_conditional_fast:nw
- \prg_return_true: \else: \prg_return_false: \fi: \q_mark
+ \prg_return_true: \else: \prg_return_false: \fi: \s_@@_mark
\use_none:n
\exp_not:n { {#8} \use_i_ii:nnn }
\tl_to_str:n {#7}
- \exp_not:n { , \q_recursion_tail , \q_recursion_stop }
+ \exp_not:n { , \q_@@_recursion_tail , \q_@@_recursion_stop }
}
}
\cs_set:Npn \@@_generate_conditional_test:w
- #1 \prg_return_true: \else: \prg_return_false: \fi: \q_mark #2
+ #1 \prg_return_true: \else: \prg_return_false: \fi: \s_@@_mark #2
{ #2 {#1} }
\cs_set:Npn \@@_generate_conditional_fast:nw #1#2 \exp_not:n #3
{ \exp_not:n { {#1} \use_i:nn } }
@@ -2006,8 +2015,8 @@
% \begin{macrocode}
\cs_set_protected:Npn \@@_generate_conditional:NNnnnnNw #1#2#3#4#5#6#7#8 ,
{
- \if_meaning:w \q_recursion_tail #8
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \if_meaning:w \q_@@_recursion_tail #8
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\fi:
\use:c { @@_generate_ #8 _form:wNNnnnnN }
\tl_if_empty:nF {#8}
@@ -2017,7 +2026,7 @@
{#8} { \token_to_str:c { #3 : #4 } }
}
\use_none:nnnnnnnn
- \q_stop
+ \s_@@_stop
#1 #2 {#3} {#4} {#5} {#6} #7
\@@_generate_conditional:NNnnnnNw #1 #2 {#3} {#4} {#5} {#6} #7
}
@@ -2052,7 +2061,7 @@
% nesting of conditionals.
% \begin{macrocode}
\cs_set_protected:Npn \@@_generate_p_form:wNNnnnnN
- #1 \q_stop #2#3#4#5#6#7#8
+ #1 \s_@@_stop #2#3#4#5#6#7#8
{
\if_meaning:w e #3
\exp_after:wN \use_i:nn
@@ -2071,7 +2080,7 @@
}
}
\cs_set_protected:Npn \@@_generate_T_form:wNNnnnnN
- #1 \q_stop #2#3#4#5#6#7#8
+ #1 \s_@@_stop #2#3#4#5#6#7#8
{
#8
{ \exp_args:Nc #2 { #4 : #5 T } #6 }
@@ -2079,7 +2088,7 @@
{ #7 \exp_after:wN \use_ii:nn \fi: \use_none:n }
}
\cs_set_protected:Npn \@@_generate_F_form:wNNnnnnN
- #1 \q_stop #2#3#4#5#6#7#8
+ #1 \s_@@_stop #2#3#4#5#6#7#8
{
#8
{ \exp_args:Nc #2 { #4 : #5 F } #6 }
@@ -2087,7 +2096,7 @@
{ #7 \exp_after:wN \use_none:nn \fi: \use:n }
}
\cs_set_protected:Npn \@@_generate_TF_form:wNNnnnnN
- #1 \q_stop #2#3#4#5#6#7#8
+ #1 \s_@@_stop #2#3#4#5#6#7#8
{
#8
{ \exp_args:Nc #2 { #4 : #5 TF } #6 }
@@ -2104,8 +2113,8 @@
% The setting-equal functions. Split both functions and feed
% \Arg{name_1} \Arg{signature_1} \meta{boolean_1}
% \Arg{name_2} \Arg{signature_2} \meta{boolean_2}
-% \meta{copying~function} \meta{conditions} |,| \cs{q_recursion_tail}
-% |,| \cs{q_recursion_stop}
+% \meta{copying~function} \meta{conditions} |,| \cs{q_@@_recursion_tail}
+% |,| \cs{q_@@_recursion_stop}
% to a first auxiliary.
% \begin{macrocode}
\cs_set_protected:Npn \prg_set_eq_conditional:NNn
@@ -2121,7 +2130,7 @@
\cs_split_function:N #3
\exp_not:N #1
\tl_to_str:n {#4}
- \exp_not:n { , \q_recursion_tail , \q_recursion_stop }
+ \exp_not:n { , \q_@@_recursion_tail , \q_@@_recursion_stop }
}
}
% \end{macrocode}
@@ -2156,19 +2165,19 @@
\if_meaning:w \c_false_bool #3
\__kernel_msg_error:nnx { kernel } { missing-colon }
{ \token_to_str:c {#1} }
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\fi:
\if_meaning:w \c_false_bool #6
\__kernel_msg_error:nnx { kernel } { missing-colon }
{ \token_to_str:c {#4} }
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\fi:
\@@_set_eq_conditional_loop:nnnnNw {#1} {#2} {#4} {#5}
}
\cs_set_protected:Npn \@@_set_eq_conditional_loop:nnnnNw #1#2#3#4#5#6 ,
{
- \if_meaning:w \q_recursion_tail #6
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \if_meaning:w \q_@@_recursion_tail #6
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\fi:
\use:c { @@_set_eq_conditional_ #6 _form:wNnnnn }
\tl_if_empty:nF {#6}
@@ -2178,17 +2187,17 @@
{#6} { \token_to_str:c { #1 : #2 } }
}
\use_none:nnnnnn
- \q_stop
+ \s_@@_stop
#5 {#1} {#2} {#3} {#4}
\@@_set_eq_conditional_loop:nnnnNw {#1} {#2} {#3} {#4} #5
}
-\cs_set:Npn \@@_set_eq_conditional_p_form:wNnnnn #1 \q_stop #2#3#4#5#6
+\cs_set:Npn \@@_set_eq_conditional_p_form:wNnnnn #1 \s_@@_stop #2#3#4#5#6
{ #2 { #3 _p : #4 } { #5 _p : #6 } }
-\cs_set:Npn \@@_set_eq_conditional_TF_form:wNnnnn #1 \q_stop #2#3#4#5#6
+\cs_set:Npn \@@_set_eq_conditional_TF_form:wNnnnn #1 \s_@@_stop #2#3#4#5#6
{ #2 { #3 : #4 TF } { #5 : #6 TF } }
-\cs_set:Npn \@@_set_eq_conditional_T_form:wNnnnn #1 \q_stop #2#3#4#5#6
+\cs_set:Npn \@@_set_eq_conditional_T_form:wNnnnn #1 \s_@@_stop #2#3#4#5#6
{ #2 { #3 : #4 T } { #5 : #6 T } }
-\cs_set:Npn \@@_set_eq_conditional_F_form:wNnnnn #1 \q_stop #2#3#4#5#6
+\cs_set:Npn \@@_set_eq_conditional_F_form:wNnnnn #1 \s_@@_stop #2#3#4#5#6
{ #2 { #3 : #4 F } { #5 : #6 F } }
% \end{macrocode}
% \end{macro}
@@ -2335,12 +2344,12 @@
% First ensure that we actually get a properly evaluated string by
% expanding \cs{cs_to_str:N} twice. If the function contained a
% colon, the auxiliary takes as |#1| the function name, delimited by
-% the first colon, then the signature |#2|, delimited by \cs{q_mark},
-% then \cs{c_true_bool} as |#3|, and |#4| cleans up until \cs{q_stop}.
-% Otherwise, the |#1| contains the function name and \cs{q_mark}
+% the first colon, then the signature |#2|, delimited by \cs{s_@@_mark},
+% then \cs{c_true_bool} as |#3|, and |#4| cleans up until \cs{s_@@_stop}.
+% Otherwise, the |#1| contains the function name and \cs{s_@@_mark}
% \cs{c_true_bool}, |#2| is empty, |#3| is \cs{c_false_bool}, and |#4|
% cleans up. The second
-% auxiliary trims the trailing \cs{q_mark} from the function name if
+% auxiliary trims the trailing \cs{s_@@_mark} from the function name if
% present (that is, if the original function had no colon).
% \begin{macrocode}
\cs_set_protected:Npn \@@_tmp:w #1
@@ -2349,13 +2358,13 @@
{
\exp_after:wN \exp_after:wN \exp_after:wN
\@@_split_function_auxi:w
- \cs_to_str:N ##1 \q_mark \c_true_bool
- #1 \q_mark \c_false_bool \q_stop
+ \cs_to_str:N ##1 \s_@@_mark \c_true_bool
+ #1 \s_@@_mark \c_false_bool \s_@@_stop
}
\cs_set:Npn \@@_split_function_auxi:w
- ##1 #1 ##2 \q_mark ##3##4 \q_stop
- { \@@_split_function_auxii:w ##1 \q_mark \q_stop {##2} ##3 }
- \cs_set:Npn \@@_split_function_auxii:w ##1 \q_mark ##2 \q_stop
+ ##1 #1 ##2 \s_@@_mark ##3##4 \s_@@_stop
+ { \@@_split_function_auxii:w ##1 \s_@@_mark \s_@@_stop {##2} ##3 }
+ \cs_set:Npn \@@_split_function_auxii:w ##1 \s_@@_mark ##2 \s_@@_stop
{ {##1} }
}
\exp_after:wN \@@_tmp:w \token_to_str:N :
@@ -3158,7 +3167,7 @@
\use:x
{
\exp_not:n { \cs_new:Npn \@@_prefix_arg_replacement:wN #1 }
- \tl_to_str:n { macro : } \exp_not:n { #2 -> #3 \q_stop #4 }
+ \tl_to_str:n { macro : } \exp_not:n { #2 -> #3 \s_@@_stop #4 }
}
{ #4 {#1} {#2} {#3} }
\cs_new:Npn \cs_prefix_spec:N #1
@@ -3166,7 +3175,7 @@
\token_if_macro:NTF #1
{
\exp_after:wN \@@_prefix_arg_replacement:wN
- \token_to_meaning:N #1 \q_stop \use_i:nnn
+ \token_to_meaning:N #1 \s_@@_stop \use_i:nnn
}
{ \scan_stop: }
}
@@ -3175,7 +3184,7 @@
\token_if_macro:NTF #1
{
\exp_after:wN \@@_prefix_arg_replacement:wN
- \token_to_meaning:N #1 \q_stop \use_ii:nnn
+ \token_to_meaning:N #1 \s_@@_stop \use_ii:nnn
}
{ \scan_stop: }
}
@@ -3184,7 +3193,7 @@
\token_if_macro:NTF #1
{
\exp_after:wN \@@_prefix_arg_replacement:wN
- \token_to_meaning:N #1 \q_stop \use_iii:nnn
+ \token_to_meaning:N #1 \s_@@_stop \use_iii:nnn
}
{ \scan_stop: }
}
@@ -3268,7 +3277,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
index 4427850302f..81fb06a5796 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
@@ -2,7 +2,7 @@
%
%% File: l3bootstrap.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,9 +53,7 @@
%
% The modules documented in \file{source3} are designed to be used on top of
% \LaTeXe{} and are loaded all as one with the usual |\usepackage{expl3}| or
-% |\RequirePackage{expl3}| instructions. These modules will also form the
-% basis of the \LaTeX3 format, but work in this area is incomplete and not
-% included in this documentation at present.
+% |\RequirePackage{expl3}| instructions.
%
% As the modules use a coding syntax different from standard
% \LaTeXe{} it provides a few functions for setting it up.
@@ -123,43 +121,11 @@
% \section{\pkg{l3bootstrap} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
%<@@=kernel>
% \end{macrocode}
%
-% \subsection{Format-specific code}
-%
-% The very first thing to do is to bootstrap the \IniTeX{} system so
-% that everything else will actually work. \TeX{} does not start with
-% some pretty basic character codes set up.
-% \begin{macrocode}
-%<*initex>
-\catcode `\{ = 1 %
-\catcode `\} = 2 %
-\catcode `\# = 6 %
-\catcode `\^ = 7 %
-%</initex>
-% \end{macrocode}
-%
-% Tab characters should not show up in the code, but to be on the
-% safe side.
-% \begin{macrocode}
-%<*initex>
-\catcode `\^^I = 10 %
-%</initex>
-% \end{macrocode}
-%
-% For \LuaTeX{}, the extra primitives need to be enabled. This is not needed
-% in package mode: common formats have the primitives enabled.
-% \begin{macrocode}
-%<*initex>
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname directlua\endcsname\relax
-\else
- \directlua{tex.enableprimitives("", tex.extraprimitives())}%
-\fi
-%</initex>
-% \end{macrocode}
+% \subsection{\LuaTeX{}-specific code}
%
% Depending on the versions available, the \LaTeX{} format may not have
% the raw |\Umath| primitive names available. We fix that globally:
@@ -169,7 +135,6 @@
% a newer format anyway and as they all start |\U| this should be
% reasonably safe.
% \begin{macrocode}
-%<*package>
\begingroup
\expandafter\ifx\csname directlua\endcsname\relax
\else
@@ -187,7 +152,6 @@
}%
\fi
\endgroup
-%</package>
% \end{macrocode}
%
% \subsection{The \tn{pdfstrcmp} primitive in \XeTeX{}}
@@ -212,18 +176,23 @@
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname directlua\endcsname\relax
\else
- \ifnum\luatexversion<95 %
+ \ifnum\luatexversion<110 %
\else
% \end{macrocode}
-% In package mode for \LuaTeX{} we make sure the basic support is loaded:
+% For \LuaTeX{} we make sure the basic support is loaded:
% this is only necessary in plain.
+%
+% Additionally we just ensure that \TeX{} has seen the csnames \cs{prg_return_true:}
+% and \cs{prg_return_false:} before the Lua code builds these tokens.
% \begin{macrocode}
-%<*package>
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname newcatcodetable\endcsname\relax
\input{ltluatex}%
\fi
-%</package>
+ \begingroup\edef\ignored{%
+ \expandafter\noexpand\csname prg_return_true:\endcsname
+ \expandafter\noexpand\csname prg_return_false:\endcsname
+ }\endgroup
\directlua{require("expl3")}%
% \end{macrocode}
% As the user might be making a custom format, no assumption is made about
@@ -250,6 +219,9 @@
% The code currently requires \eTeX{} and functionality equivalent to
% \tn{pdfstrcmp}, and also driver and Unicode character support. This is
% available in a reasonably-wide range of engines.
+%
+% For \LuaTeX, we require at least Lua 5.3 and the |token.set_lua| function.
+% This is available at least since \LuaTeX{} 1.10.
% \begin{macrocode}
\begingroup
\def\next{\endgroup}%
@@ -262,7 +234,7 @@
These are available in the engines\LineBreak
- pdfTeX v1.40\LineBreak
- XeTeX v0.99992\LineBreak
- - LuaTeX v0.95\LineBreak
+ - LuaTeX v1.10\LineBreak
- e-(u)pTeX mid-2012\LineBreak
or later.\LineBreak
\LineBreak
@@ -285,28 +257,10 @@
\fi
\expandafter\ifx\csname directlua\endcsname\relax
\else
- \ifnum\luatexversion<76 \else 1\fi
+ \ifnum\luatexversion<110 \else 1\fi
\fi
=0 %
\newlinechar`\^^J %
-%<*initex>
- \def\LineBreak{^^J}%
- \edef\next
- {%
- \errhelp
- {%
- \LongText
- For pdfTeX and XeTeX the '-etex' command-line switch is also
- needed.\LineBreak
- \LineBreak
- Format building will abort!\LineBreak
- }%
- \errmessage{\ShortText}%
- \endgroup
- \noexpand\end
- }%
-%</initex>
-%<*package>
\def\LineBreak{\noexpand\MessageBreak}%
\expandafter\ifx\csname PackageError\endcsname\relax
\def\LineBreak{^^J}%
@@ -323,18 +277,14 @@
\endgroup
\noexpand\endinput
}%
-%</package>
\fi
\next
% \end{macrocode}
%
% \subsection{Extending allocators}
%
-% In format mode, allocating registers is handled by \pkg{l3alloc}. However, in
-% package mode it's much safer to rely on more general code. For example,
-% the ability to extend \TeX{}'s allocation routine to allow for \eTeX{} has
+% The ability to extend \TeX{}'s allocation routine to allow for \eTeX{} has
% been around since 1997 in the \pkg{etex} package.
-%
% Loading this support is delayed until here as we are now sure that the
% \eTeX{} extensions and \tn{pdfstrcmp} or equivalent are available. Thus
% there is no danger of an \enquote{uncontrolled} error if the engine
@@ -353,7 +303,6 @@
% here is done using a group and \tn{ifx} test as we are not quite in the
% position to have a single name for \tn{pdfstrcmp} just yet.
% \begin{macrocode}
-%<*package>
\begingroup
\def\@tempa{LaTeX2e}%
\def\next{}%
@@ -368,98 +317,6 @@
\fi
\expandafter\endgroup
\next
-%</package>
-% \end{macrocode}
-%
-% \subsection{Character data}
-%
-% \TeX{} needs various pieces of data to be set about characters, in particular
-% which ones to treat as letters and which \tn{lccode} values apply as these
-% affect hyphenation. It makes most sense to set this and related information
-% up in one place. Whilst for \LuaTeX{} hyphenation patterns can be read
-% anywhere, other engines have to build them into the format and so we
-% \emph{must} do this set up before reading the patterns. For the Unicode
-% engines, there are shared loaders available to obtain the relevant
-% information directly from the Unicode Consortium data files. These need
-% standard (Ini)\TeX{} category codes and primitive availability and must
-% therefore loaded \emph{very} early. This has a knock-on effect on the
-% $8$-bit set up: it makes sense to do the definitions for those here as
-% well so it is all in one place.
-%
-% For \XeTeX{} and \LuaTeX{}, which are natively Unicode engines, simply
-% load the Unicode data.
-% \begin{macrocode}
-%<*initex>
-\ifdefined\Umathcode
- \input load-unicode-data %
- \input load-unicode-math-classes %
-\else
-% \end{macrocode}
-% For the $8$-bit engines a font encoding scheme must be chosen. At present,
-% this is the EC (|T1|) scheme, with the assumption that languages for which
-% this is not appropriate will be used with one of the Unicode engines.
-% \begin{macrocode}
- \begingroup
-% \end{macrocode}
-% Lower case chars: map to themselves when lower casing and down by |"20| when
-% upper casing. (The characters |a|--|z| are set up correctly by \IniTeX{}.)
-% \begin{macrocode}
- \def\temp{%
- \ifnum\count0>\count2 %
- \else
- \global\lccode\count0 = \count0 %
- \global\uccode\count0 = \numexpr\count0 - "20\relax
- \advance\count0 by 1 %
- \expandafter\temp
- \fi
- }
- \count0 = "A0 %
- \count2 = "BC %
- \temp
- \count0 = "E0 %
- \count2 = "FF %
- \temp
-% \end{macrocode}
-% Upper case chars: map up by |"20| when lower casing, to themselves when upper
-% casing and require an \tn{sfcode} of $999$. (The characters |A|--|Z| are set
-% up correctly by \IniTeX{}.)
-% \begin{macrocode}
- \def\temp{%
- \ifnum\count0>\count2 %
- \else
- \global\lccode\count0 = \numexpr\count0 + "20\relax
- \global\uccode\count0 = \count0 %
- \global\sfcode\count0 = 999 %
- \advance\count0 by 1 %
- \expandafter\temp
- \fi
- }
- \count0 = "80 %
- \count2 = "9C %
- \temp
- \count0 = "C0 %
- \count2 = "DF %
- \temp
-% \end{macrocode}
-% A few special cases where things are not as one might expect using the above
-% pattern: dotless-I, dotless-J, dotted-I and d-bar.
-% \begin{macrocode}
- \global\lccode`\^^Y = `\^^Y %
- \global\uccode`\^^Y = `\I %
- \global\lccode`\^^Z = `\^^Z %
- \global\uccode`\^^Y = `\J %
- \global\lccode"9D = `\i %
- \global\uccode"9D = "9D %
- \global\lccode"9E = "9E %
- \global\uccode"9E = "D0 %
-% \end{macrocode}
-% Allow hyphenation at a zero-width glyph (used to break up ligatures or
-% to place accents between characters).
-% \begin{macrocode}
- \global\lccode23 = 23 %
- \endgroup
-\fi
-%</initex>
% \end{macrocode}
%
% \subsection{The \LaTeX3 code environment}
@@ -470,14 +327,11 @@
% Before changing any category codes, in package mode we need to save
% the situation before loading. Note the set up here means that once applied
% \cs{ExplSyntaxOff} becomes a \enquote{do nothing} command until
-% \cs{ExplSyntaxOn} is used. For format mode, there is no need to save
-% category codes so that step is skipped.
+% \cs{ExplSyntaxOn} is used.
% \begin{macrocode}
-\protected\def\ExplSyntaxOff{}%
-%<*package>
\protected\edef\ExplSyntaxOff
{%
- \protected\def\ExplSyntaxOff{}%
+ \protected\def\noexpand\ExplSyntaxOff{}%
\catcode 9 = \the\catcode 9\relax
\catcode 32 = \the\catcode 32\relax
\catcode 34 = \the\catcode 34\relax
@@ -490,7 +344,6 @@
\endlinechar = \the\endlinechar\relax
\chardef\csname\detokenize{l_@@_expl_bool}\endcsname = 0\relax
}%
-%</package>
% \end{macrocode}
% \end{macro}
%
@@ -560,7 +413,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
index 91ddc238a60..5dcf864f73c 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
@@ -2,7 +2,7 @@
%
%% File: l3box.dtx
%
-% Copyright (C) 2005-2020 The LaTeX3 Project
+% Copyright (C) 2005-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -370,6 +370,14 @@
% and then stores the result inside the \meta{box}.
% \end{function}
%
+% \begin{function}[added = 2020-08-25]{\hbox_overlap_center:n}
+% \begin{syntax}
+% \cs{hbox_overlap_center:n} \Arg{contents}
+% \end{syntax}
+% Typesets the \meta{contents} into a horizontal box of zero width
+% such that material protrudes equally to both sides of the insertion point.
+% \end{function}
+%
% \begin{function}[updated = 2017-04-05]{\hbox_overlap_right:n}
% \begin{syntax}
% \cs{hbox_overlap_right:n} \Arg{contents}
@@ -887,7 +895,7 @@
% \section{\pkg{l3box} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -909,6 +917,16 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{'\__kernel_kern:n}
+% We need kerns in a few places. At present, we don't have a module for
+% this concept, so it goes in at first use: here. The idea is to avoid
+% repeated use of the bare primitive.
+% \begin{macrocode}
+\cs_new_protected:Npn \__kernel_kern:n #1
+ { \tex_kern:D \@@_dim_eval:n {#1} }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Creating and initialising boxes}
%
% \TestFiles{m3box001.lvt}
@@ -917,13 +935,11 @@
% Defining a new \meta{box} register: remember that box $255$ is not
% generally available.
% \begin{macrocode}
-%<*package>
\cs_new_protected:Npn \box_new:N #1
{
\__kernel_chk_if_free_cs:N #1
\cs:w newbox \cs_end: #1
}
-%</package>
\cs_generate_variant:Nn \box_new:N { c }
% \end{macrocode}
%
@@ -1383,10 +1399,12 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\hbox_overlap_left:n, \hbox_overlap_right:n}
+% \begin{macro}{\hbox_overlap_center:n, \hbox_overlap_left:n, \hbox_overlap_right:n}
% Put a zero-sized box with the contents pushed against one side (which
% makes it stick out on the other) directly into the input stream.
% \begin{macrocode}
+\cs_new_protected:Npn \hbox_overlap_center:n #1
+ { \hbox_to_zero:n { \tex_hss:D #1 \tex_hss:D } }
\cs_new_protected:Npn \hbox_overlap_left:n #1
{ \hbox_to_zero:n { \tex_hss:D #1 } }
\cs_new_protected:Npn \hbox_overlap_right:n #1
@@ -1760,7 +1778,7 @@
\hbox_set:Nn \l_@@_internal_box { \box_use:N #1 }
\hbox_set:Nn \l_@@_internal_box
{
- \tex_kern:D -\l_@@_left_new_dim
+ \__kernel_kern:n { -\l_@@_left_new_dim }
\hbox:n
{
\@@_backend_rotate:Nn
@@ -2219,7 +2237,7 @@
{
\hbox_to_wd:nn { \l_@@_right_new_dim }
{
- \tex_kern:D \l_@@_right_new_dim
+ \__kernel_kern:n { \l_@@_right_new_dim }
\box_use_drop:N \l_@@_internal_box
\tex_hss:D
}
@@ -2228,7 +2246,7 @@
\box_set_wd:Nn \l_@@_internal_box { \l_@@_right_new_dim }
\hbox:n
{
- \tex_kern:D \c_zero_dim
+ \__kernel_kern:n { 0pt }
\box_use_drop:N \l_@@_internal_box
\tex_hss:D
}
@@ -2238,7 +2256,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
index e346f674a70..aa0f4e1f8ae 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
@@ -2,7 +2,7 @@
%
%% File: l3candidates.dtx
%
-% Copyright (C) 2012-2020 The LaTeX3 Project
+% Copyright (C) 2012-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -86,8 +86,6 @@
%
% \section{Additions to \pkg{l3box}}
%
-% \subsection{Viewing part of a box}
-%
% \begin{function}[updated = 2019-01-23]
% {\box_clip:N, \box_clip:c, \box_gclip:N, \box_gclip:c}
% \begin{syntax}
@@ -206,7 +204,7 @@
%
% \begin{function}[added = 2019-05-08]{\ior_shell_open:Nn}
% \begin{syntax}
-% \cs{ior_shell_open:nN} \meta{stream} \Arg{shell~command}
+% \cs{ior_shell_open:Nn} \meta{stream} \Arg{shell~command}
% \end{syntax}
% Opens the \emph{pseudo}-file created by the output of the
% \meta{shell command} for reading using \meta{stream} as the
@@ -254,8 +252,6 @@
% This is not available in older versions of \XeTeX{}.
% \end{function}
%
-% \subsection{Working with contents of integer arrays}
-%
% \begin{function}[added = 2018-05-04, rEXP]{\intarray_to_clist:N}
% \begin{syntax}
% \cs{intarray_to_clist:N} \meta{intarray~var}
@@ -268,44 +264,6 @@
%
% \section{Additions to \pkg{l3msg}}
%
-% In very rare cases it may be necessary to produce errors in an
-% expansion-only context. The functions in this section should only be
-% used if there is no alternative approach using \cs{msg_error:nnnnnn}
-% or other non-expandable commands from the previous section. Despite
-% having a similar interface as non-expandable messages, expandable
-% errors must be handled internally very differently from normal error
-% messages, as none of the tools to print to the terminal or the log
-% file are expandable. As a result, short-hands such as |\{| or |\\| do
-% not work, and messages must be very short (with default settings,
-% they are truncated after approximately 50 characters). It is
-% advisable to ensure that the message is understandable even when
-% truncated, by putting the most important information up front.
-% Another particularity of expandable messages is that they
-% cannot be redirected or turned off by the user.
-%
-% \begin{function}[EXP, added = 2015-08-06, updated = 2019-02-28]
-% {
-% \msg_expandable_error:nnnnnn ,
-% \msg_expandable_error:nnnnn ,
-% \msg_expandable_error:nnnn ,
-% \msg_expandable_error:nnn ,
-% \msg_expandable_error:nn ,
-% \msg_expandable_error:nnffff ,
-% \msg_expandable_error:nnfff ,
-% \msg_expandable_error:nnff ,
-% \msg_expandable_error:nnf ,
-% }
-% \begin{syntax}
-% \cs{msg_expandable_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues an \enquote{Undefined error} message from \TeX{} itself
-% using the undefined control sequence \cs{::error} then prints
-% \enquote{! \meta{module}: }\meta{error message}, which should be
-% short. With default settings, anything beyond approximately $60$
-% characters long (or bytes in some engines) is cropped. A leading
-% space might be removed as well.
-% \end{function}
-%
% \begin{function}[added = 2017-12-04]{\msg_show_eval:Nn, \msg_log_eval:Nn}
% \begin{syntax}
% \cs{msg_show_eval:Nn} \meta{function} \Arg{expression}
@@ -317,32 +275,6 @@
% |1+2| then this logs |> 1+2=3.|
% \end{function}
%
-% \begin{function}[added = 2017-12-04]
-% {
-% \msg_show:nnnnnn ,
-% \msg_show:nnnnn ,
-% \msg_show:nnnn ,
-% \msg_show:nnn ,
-% \msg_show:nn ,
-% \msg_show:nnxxxx ,
-% \msg_show:nnxxx ,
-% \msg_show:nnxx ,
-% \msg_show:nnx
-% }
-% \begin{syntax}
-% \cs{msg_show:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues \meta{module} information \meta{message}, passing \meta{arg
-% one} to \meta{arg four} to the text-creating functions. The
-% information text is shown on the terminal and the \TeX{} run is
-% interrupted in a manner similar to \cs{tl_show:n}. This is used in
-% conjunction with \cs{msg_show_item:n} and similar functions to print
-% complex variable contents completely. If the formatted text does
-% not contain |>~| at the start of a line, an additional line |>~.|
-% will be put at the end. In addition, a final period is added if not
-% present.
-% \end{function}
-%
% \begin{function}[EXP, added = 2017-12-04]
% {\msg_show_item:n, \msg_show_item_unbraced:n, \msg_show_item:nn, \msg_show_item_unbraced:nn}
% \begin{syntax}
@@ -464,24 +396,6 @@
% \end{texnote}
% \end{function}
%
-% \begin{function}[added = 2011-12-22]
-% {\seq_set_map:NNn, \seq_gset_map:NNn}
-% \begin{syntax}
-% \cs{seq_set_map:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function}
-% \end{syntax}
-% Applies \meta{inline function} to every \meta{item} stored
-% within the \meta{sequence_2}. The \meta{inline function} should
-% consist of code which will receive the \meta{item} as |#1|.
-% The sequence resulting from \texttt{x}-expanding
-% \meta{inline function} applied to each \meta{item}
-% is assigned to \meta{sequence_1}. As such, the code
-% in \meta{inline function} should be expandable.
-% \begin{texnote}
-% Contrarily to other mapping functions, \cs{seq_map_break:} cannot
-% be used in this function, and would lead to low-level \TeX{} errors.
-% \end{texnote}
-% \end{function}
-%
% \begin{function}[added = 2018-04-06]
% {\seq_set_from_function:NnN, \seq_gset_from_function:NnN}
% \begin{syntax}
@@ -520,26 +434,6 @@
% mappings.
% \end{function}
%
-% \begin{function}[rEXP,added = 2018-05-03]{\seq_indexed_map_function:NN}
-% \begin{syntax}
-% \cs{seq_indexed_map_function:NN} \meta{seq~var} \meta{function}
-% \end{syntax}
-% Applies \meta{function} to every entry in the \meta{sequence
-% variable}. The \meta{function} should have signature |:nn|. It
-% receives two arguments for each iteration: the \meta{index} (namely
-% |1| for the first entry, then |2| and so on) and the \meta{item}.
-% \end{function}
-%
-% \begin{function}[added = 2018-05-03]{\seq_indexed_map_inline:Nn}
-% \begin{syntax}
-% \cs{seq_indexed_map_inline:Nn} \meta{seq~var} \Arg{inline function}
-% \end{syntax}
-% Applies \meta{inline function} to every entry in the \meta{sequence
-% variable}. The \meta{inline function} should consist of code which
-% receives the \meta{index} (namely |1| for the first entry, then |2|
-% and so on) as~|#1| and the \meta{item} as~|#2|.
-% \end{function}
-%
% \section{Additions to \pkg{l3sys}}
%
% \begin{variable}[added = 2018-05-02]{\c_sys_engine_version_str}
@@ -680,7 +574,8 @@
% \cs{tl_build_end:N} \meta{tl~var}
% \end{syntax}
% Gets the contents of \meta{tl~var} and stores that into the
-% \meta{tl~var} using \cs{tl_set:Nn}. The \meta{tl~var} must have
+% \meta{tl~var} using \cs{tl_set:Nn} or \cs{tl_gset:Nn}.
+% The \meta{tl~var} must have
% been set up with \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}.
% The |end| and |gend| functions must be used for local and global
% \meta{tl~var} respectively. These functions completely remove the
@@ -765,7 +660,7 @@
% \section{\pkg{l3candidates} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \subsection{Additions to \pkg{l3box}}
@@ -807,9 +702,9 @@
{
\hbox_set:Nn \l_@@_internal_box
{
- \tex_kern:D - \@@_dim_eval:n {#2}
+ \__kernel_kern:n { -#2 }
\box_use:N #1
- \tex_kern:D - \@@_dim_eval:n {#4}
+ \__kernel_kern:n { -#4 }
}
% \end{macrocode}
% For the height and depth, there is a need to watch the baseline is
@@ -884,9 +779,9 @@
{
\hbox_set:Nn \l_@@_internal_box
{
- \tex_kern:D - \@@_dim_eval:n {#2}
+ \__kernel_kern:n { -#2 }
\box_use:N #1
- \tex_kern:D \@@_dim_eval:n { #4 - \box_wd:N #1 }
+ \__kernel_kern:n { #4 - \box_wd:N #1 }
}
\dim_compare:nNnTF {#3} < \c_zero_dim
{
@@ -958,56 +853,6 @@
%<@@=msg>
% \end{macrocode}
%
-% \begin{macro}[EXP]
-% {
-% \msg_expandable_error:nnnnnn ,
-% \msg_expandable_error:nnnnn ,
-% \msg_expandable_error:nnnn ,
-% \msg_expandable_error:nnn ,
-% \msg_expandable_error:nn ,
-% \msg_expandable_error:nnffff ,
-% \msg_expandable_error:nnfff ,
-% \msg_expandable_error:nnff ,
-% \msg_expandable_error:nnf
-% }
-% \begin{macro}{\@@_expandable_error_module:nn}
-% Pass to an auxiliary the message to display and the module name
-% \begin{macrocode}
-\cs_new:Npn \msg_expandable_error:nnnnnn #1#2#3#4#5#6
- {
- \exp_args:Ne \@@_expandable_error_module:nn
- {
- \exp_args:Nc \exp_args:Noooo
- { \c_@@_text_prefix_tl #1 / #2 }
- { \tl_to_str:n {#3} }
- { \tl_to_str:n {#4} }
- { \tl_to_str:n {#5} }
- { \tl_to_str:n {#6} }
- }
- {#1}
- }
-\cs_new:Npn \msg_expandable_error:nnnnn #1#2#3#4#5
- { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} {#5} { } }
-\cs_new:Npn \msg_expandable_error:nnnn #1#2#3#4
- { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} { } { } }
-\cs_new:Npn \msg_expandable_error:nnn #1#2#3
- { \msg_expandable_error:nnnnnn {#1} {#2} {#3} { } { } { } }
-\cs_new:Npn \msg_expandable_error:nn #1#2
- { \msg_expandable_error:nnnnnn {#1} {#2} { } { } { } { } }
-\cs_generate_variant:Nn \msg_expandable_error:nnnnnn { nnffff }
-\cs_generate_variant:Nn \msg_expandable_error:nnnnn { nnfff }
-\cs_generate_variant:Nn \msg_expandable_error:nnnn { nnff }
-\cs_generate_variant:Nn \msg_expandable_error:nnn { nnf }
-\cs_new:Npn \@@_expandable_error_module:nn #1#2
- {
- \exp_after:wN \exp_after:wN
- \exp_after:wN \use_none_delimit_by_q_stop:w
- \use:n { \::error ! ~ #2 : ~ #1 } \q_stop
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \begin{macro}{\msg_show_eval:Nn, \msg_log_eval:Nn, \@@_show_eval:nnN}
% A short-hand used for \cs{int_show:n} and similar functions that
% passes to \cs{tl_show:n} the result of applying |#1| (a
@@ -1079,6 +924,14 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}[EXP, noTF]{\bool_case_true:n, \bool_case_false:n}
% \begin{macro}{\@@_case:NnTF}
% \begin{macro}{\@@_case_true:w, \@@_case_false:w, \@@_case_end:nw}
@@ -1104,7 +957,7 @@
\cs_new:Npn \@@_case:NnTF #1#2#3#4
{
\bool_if:NTF #1 \@@_case_true:w \@@_case_false:w
- #2 #1 { } \q_mark {#3} \q_mark {#4} \q_stop
+ #2 #1 { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop
}
\cs_new:Npn \@@_case_true:w #1#2
{
@@ -1118,7 +971,7 @@
{ \@@_case_false:w }
{ \@@_case_end:nw {#2} }
}
-\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
{ \exp_end: #1 #4 }
% \end{macrocode}
% \end{macro}
@@ -1131,6 +984,13 @@
%<@@=prop>
% \end{macrocode}
%
+% \begin{macro}[EXP]{\@@_use_i_delimit_by_s_stop:nw}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[EXP]
% {\prop_rand_key_value:N, \prop_rand_key_value:c}
% \begin{macro}[EXP]{\@@_rand_item:w}
@@ -1146,14 +1006,14 @@
{
\exp_after:wN \@@_rand_item:w
\int_value:w \int_rand:nn { 1 } { \prop_count:N #1 }
- #1 \q_stop
+ #1 \s_@@_stop
}
}
\cs_generate_variant:Nn \prop_rand_key_value:N { c }
\cs_new:Npn \@@_rand_item:w #1 \s_@@ \@@_pair:wn #2 \s_@@ #3
{
\int_compare:nNnF {#1} > 1
- { \use_i_delimit_by_q_stop:nw { \exp_not:n { {#2} {#3} } } }
+ { \@@_use_i_delimit_by_s_stop:nw { \exp_not:n { {#2} {#3} } } }
\exp_after:wN \@@_rand_item:w
\int_value:w \int_eval:n { #1 - 1 } \s_@@
}
@@ -1189,25 +1049,25 @@
% worrying about which is longer.
% \begin{macrocode}
\cs_new:Npn \seq_mapthread_function:NNN #1#2#3
- { \exp_after:wN \@@_mapthread_function:wNN #2 \q_stop #1 #3 }
-\cs_new:Npn \@@_mapthread_function:wNN \s_@@ #1 \q_stop #2#3
+ { \exp_after:wN \@@_mapthread_function:wNN #2 \s_@@_stop #1 #3 }
+\cs_new:Npn \@@_mapthread_function:wNN \s_@@ #1 \s_@@_stop #2#3
{
- \exp_after:wN \@@_mapthread_function:wNw #2 \q_stop #3
+ \exp_after:wN \@@_mapthread_function:wNw #2 \s_@@_stop #3
#1 { ? \prg_break: } { }
\prg_break_point:
}
-\cs_new:Npn \@@_mapthread_function:wNw \s_@@ #1 \q_stop #2
+\cs_new:Npn \@@_mapthread_function:wNw \s_@@ #1 \s_@@_stop #2
{
\@@_mapthread_function:Nnnwnn #2
#1 { ? \prg_break: } { }
- \q_stop
+ \s_@@_stop
}
-\cs_new:Npn \@@_mapthread_function:Nnnwnn #1#2#3#4 \q_stop #5#6
+\cs_new:Npn \@@_mapthread_function:Nnnwnn #1#2#3#4 \s_@@_stop #5#6
{
\use_none:n #2
\use_none:n #5
#1 {#3} {#6}
- \@@_mapthread_function:Nnnwnn #1 #4 \q_stop
+ \@@_mapthread_function:Nnnwnn #1 #4 \s_@@_stop
}
\cs_generate_variant:Nn \seq_mapthread_function:NNN { Nc , c , cc }
% \end{macrocode}
@@ -1225,9 +1085,9 @@
% hence in the \texttt{x}-expanding assignment.
% \begin{macrocode}
\cs_new_protected:Npn \seq_set_filter:NNn
- { \@@_set_filter:NNNn \tl_set:Nx }
+ { \@@_set_filter:NNNn \__kernel_tl_set:Nx }
\cs_new_protected:Npn \seq_gset_filter:NNn
- { \@@_set_filter:NNNn \tl_gset:Nx }
+ { \@@_set_filter:NNNn \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_set_filter:NNNn #1#2#3#4
{
\@@_push_item_def:n { \bool_if:nT {#4} { \@@_wrap_item:n {##1} } }
@@ -1238,34 +1098,14 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\seq_set_map:NNn, \seq_gset_map:NNn}
-% \begin{macro}{\@@_set_map:NNNn}
-% Very similar to \cs{seq_set_filter:NNn}. We could actually
-% merge the two within a single function, but it would have weird
-% semantics.
-% \begin{macrocode}
-\cs_new_protected:Npn \seq_set_map:NNn
- { \@@_set_map:NNNn \tl_set:Nx }
-\cs_new_protected:Npn \seq_gset_map:NNn
- { \@@_set_map:NNNn \tl_gset:Nx }
-\cs_new_protected:Npn \@@_set_map:NNNn #1#2#3#4
- {
- \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
- #1 #2 { #3 }
- \@@_pop_item_def:
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \begin{macro}{\seq_set_from_inline_x:Nnn, \seq_gset_from_inline_x:Nnn}
% \begin{macro}{\@@_set_from_inline_x:NNnn}
% Set \cs{@@_item:n} then map it using the loop code.
% \begin{macrocode}
\cs_new_protected:Npn \seq_set_from_inline_x:Nnn
- { \@@_set_from_inline_x:NNnn \tl_set:Nx }
+ { \@@_set_from_inline_x:NNnn \__kernel_tl_set:Nx }
\cs_new_protected:Npn \seq_gset_from_inline_x:Nnn
- { \@@_set_from_inline_x:NNnn \tl_gset:Nx }
+ { \@@_set_from_inline_x:NNnn \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_set_from_inline_x:NNnn #1#2#3#4
{
\@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
@@ -1286,50 +1126,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}
-% {
-% \seq_indexed_map_function:NN, \seq_indexed_map_inline:Nn,
-% \@@_indexed_map:nNN, \@@_indexed_map:Nw
-% }
-% Similar to \cs{seq_map_function:NN} but we keep track of the item
-% index as a |;|-delimited argument of \cs{@@_indexed_map:Nw}.
-% \begin{macrocode}
-\cs_new:Npn \seq_indexed_map_function:NN #1#2
- {
- \@@_indexed_map:NN #1#2
- \prg_break_point:Nn \seq_map_break: { }
- }
-\cs_new_protected:Npn \seq_indexed_map_inline:Nn #1#2
- {
- \int_gincr:N \g__kernel_prg_map_int
- \cs_gset_protected:cpn
- { @@_map_ \int_use:N \g__kernel_prg_map_int :w } ##1##2 {#2}
- \exp_args:NNc \@@_indexed_map:NN #1
- { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
- \prg_break_point:Nn \seq_map_break:
- { \int_gdecr:N \g__kernel_prg_map_int }
- }
-\cs_new:Npn \@@_indexed_map:NN #1#2
- {
- \exp_after:wN \@@_indexed_map:Nw
- \exp_after:wN #2
- \int_value:w 1
- \exp_after:wN \use_i:nn
- \exp_after:wN ;
- #1
- \prg_break: \@@_item:n { } \prg_break_point:
- }
-\cs_new:Npn \@@_indexed_map:Nw #1#2 ; #3 \@@_item:n #4
- {
- #3
- #1 {#2} {#4}
- \exp_after:wN \@@_indexed_map:Nw
- \exp_after:wN #1
- \int_value:w \int_eval:w 1 + #2 ;
- }
-% \end{macrocode}
-% \end{macro}
-%
% \subsection{Additions to \pkg{l3sys}}
%
% \begin{macrocode}
@@ -1405,6 +1201,9 @@
% \begin{macro}{\ior_shell_open:Nn}
% \begin{macro}{\@@_shell_open:nN}
% Actually much easier than either the standard open or input versions!
+% When calling \cs{__kernel_ior_open:Nn} the file the pipe is added to
+% signal a shell command, but the quotes are not added yet---they are
+% added later by \cs{__kernel_file_name_quote:n}.
% \begin{macrocode}
\cs_new_protected:Npn \ior_shell_open:Nn #1#2
{
@@ -1419,7 +1218,7 @@
\__kernel_msg_error:nnx
{ kernel } { quote-in-shell } {#1}
}
- { \__kernel_ior_open:Nn #2 { "|#1" } }
+ { \__kernel_ior_open:Nn #2 { |#1 } }
}
\__kernel_msg_new:nnnn { kernel } { pipe-failed }
{ Cannot~run~piped~system~commands. }
@@ -1431,6 +1230,8 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Additions to \pkg{l3tl}}
+%
% \subsubsection{Building a token list}
%
% \begin{macrocode}
@@ -1607,7 +1408,7 @@
% trick to wrap all the \meta{right} parts together.
% \begin{macrocode}
\cs_new_protected:Npn \tl_build_get:NN
- { \@@_build_get:NNN \tl_set:Nx }
+ { \@@_build_get:NNN \__kernel_tl_set:Nx }
\cs_new_protected:Npn \@@_build_get:NNN #1#2#3
{ #1 #3 { \if_false: { \fi: \exp_after:wN \@@_build_get:w #2 } } }
\cs_new:Npn \@@_build_get:w #1 \@@_build_last:NNn #2#3#4
@@ -1632,12 +1433,12 @@
% \begin{macrocode}
\cs_new_protected:Npn \tl_build_end:N #1
{
- \@@_build_get:NNN \tl_set:Nx #1 #1
+ \@@_build_get:NNN \__kernel_tl_set:Nx #1 #1
\exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_clear:N
}
\cs_new_protected:Npn \tl_build_gend:N #1
{
- \@@_build_get:NNN \tl_gset:Nx #1 #1
+ \@@_build_get:NNN \__kernel_tl_gset:Nx #1 #1
\exp_args:Nc \@@_build_end_loop:NN { \cs_to_str:N #1 ' } \tl_gclear:N
}
\cs_new_protected:Npn \@@_build_end_loop:NN #1#2
@@ -1807,7 +1608,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx b/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
new file mode 100644
index 00000000000..46d682bd544
--- /dev/null
+++ b/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
@@ -0,0 +1,882 @@
+% \iffalse meta-comment
+%
+%% File: l3cctab.dtx
+%
+% Copyright (C) 2018-2021 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full]{l3doc}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% The \pkg{l3cctab} package\\ Category code tables^^A
+% }
+%
+% \author{^^A
+% The \LaTeX{} Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released 2021-02-18}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% A category code table enables rapid switching of all category codes in
+% one operation. For \LuaTeX{}, this is possible over the entire Unicode
+% range. For other engines, only the $8$-bit range ($0$--$255$) is covered by
+% such tables.
+%
+% \section{Creating and initialising category code tables}
+%
+% \begin{function}[updated = 2020-07-02]{\cctab_new:N,\cctab_new:c}
+% \begin{syntax}
+% \cs{cctab_new:N} \meta{category code table}
+% \end{syntax}
+% Creates a new \meta{category code table} variable or raises an error if
+% the name is already taken. The declaration is global. The
+% \meta{category code table} is initialised with the codes
+% as used by \IniTeX{}.
+% \end{function}
+%
+% \begin{function}[updated = 2020-07-07]{\cctab_const:Nn,\cctab_const:cn}
+% \begin{syntax}
+% \cs{cctab_const:Nn} \meta{category code table} \Arg{category code set up}
+% \end{syntax}
+% Creates a new \meta{category code table}, applies (in a group) the
+% \meta{category code set up} on top of \IniTeX{} settings,
+% then saves them globally as a constant
+% table. The \meta{category code set up} can include a call to
+% \cs{cctab_select:N}.
+% \end{function}
+%
+% \begin{function}[updated = 2020-07-07]{\cctab_gset:Nn,\cctab_gset:cn}
+% \begin{syntax}
+% \cs{cctab_gset:Nn} \meta{category code table} \Arg{category code set up}
+% \end{syntax}
+% Starting from the \IniTeX{} category codes,
+% applies (in a group) the \meta{category code set up}, then saves them
+% globally in the \meta{category code table}. The \meta{category code set up}
+% can include a call to \cs{cctab_select:N}.
+% \end{function}
+%
+% \section{Using category code tables}
+%
+% \begin{function}[updated = 2020-07-02]{\cctab_begin:N,\cctab_begin:c}
+% \begin{syntax}
+% \cs{cctab_begin:N} \meta{category code table}
+% \end{syntax}
+% Switches locally the category codes in force to those stored in the
+% \meta{category code table}. The prevailing codes before the
+% function is called are added to a stack, for use with
+% \cs{cctab_end:}. This function does not start a \TeX{} group.
+% \end{function}
+%
+% \begin{function}[updated = 2020-07-02]{\cctab_end:}
+% \begin{syntax}
+% \cs{cctab_end:}
+% \end{syntax}
+% Ends the scope of a \meta{category code table} started using
+% \cs{cctab_begin:N}, returning the codes to those in force before the
+% matching \cs{cctab_begin:N} was used. This must be used within the
+% same \TeX{} group (and at the same \TeX{} group level) as the
+% matching \cs{cctab_begin:N}.
+% \end{function}
+%
+% \begin{function}[added = 2020-05-19, updated = 2020-07-02]{\cctab_select:N}
+% \begin{syntax}
+% \cs{cctab_select:N} \meta{category code table}
+% \end{syntax}
+% Selects the \meta{category code table} for the scope of the current
+% group. This is in particular useful in the \meta{setup} arguments
+% of \cs{tl_set_rescan:Nnn}, \cs{tl_rescan:nn}, \cs{cctab_const:Nn},
+% and \cs{cctab_gset:Nn}.
+% \end{function}
+%
+% \section{Category code table conditionals}
+%
+% \begin{function}[pTF]{\cctab_if_exist:N, \cctab_if_exist:c}
+% \begin{syntax}
+% \cs{cctab_if_exist_p:N} \meta{category code table}
+% \cs{cctab_if_exist:NTF} \meta{category code table} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests whether the \meta{category code table} is currently defined.
+% This does not check that the \meta{category code table} really is a
+% category code table.
+% \end{function}
+%
+% \section{Constant category code tables}
+%
+% \begin{variable}[updated = 2020-07-10]{\c_code_cctab}
+% Category code table for the \pkg{expl3} code environment; this does
+% \emph{not} include \texttt{@}, which is retained as an \enquote{other}
+% character.
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-08]{\c_document_cctab}
+% Category code table for a standard \LaTeX{} document, as set by the \LaTeX{}
+% kernel. In particular, the upper-half of the $8$-bit range will be set to
+% \enquote{active} with \pdfTeX{} \emph{only}. No \pkg{babel} shorthands
+% will be activated.
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-02]{\c_initex_cctab}
+% Category code table as set up by \IniTeX{}.
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-02]{\c_other_cctab}
+% Category code table where all characters have category code $12$
+% (other).
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-02]{\c_str_cctab}
+% Category code table where all characters have category code $12$
+% (other) with the exception of spaces, which have category code
+% $10$ (space).
+% \end{variable}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3cctab} implementation}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=cctab>
+% \end{macrocode}
+%
+% As \LuaTeX{} offers engine support for category code tables, and this
+% is entirely lacking from the other engines, we need two complementary
+% approaches. (Some future \XeTeX{} may add support, at which point the
+% conditionals below would be different.)
+%
+% \subsection{Variables}
+%
+% \begin{variable}{\g_@@_stack_seq, \g_@@_unused_seq}
+% List of catcode tables saved by nested \cs{cctab_begin:N}, to
+% restore catcodes at the matching \cs{cctab_end:}. When popped from
+% the \cs{g_@@_stack_seq} the table numbers are stored in
+% \cs{g_@@_unused_seq} for later reuse.
+% \begin{macrocode}
+\seq_new:N \g_@@_stack_seq
+\seq_new:N \g_@@_unused_seq
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_group_seq}
+% A stack to store the group level when a catcode table started.
+% \begin{macrocode}
+\seq_new:N \g_@@_group_seq
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_allocate_int}
+% Integer to keep track of what category code table to allocate. In
+% \LuaTeX{} it is only used in format mode to implement
+% \cs{cctab_new:N}. In other engines it is used to make csnames for
+% dynamic tables.
+% \begin{macrocode}
+\int_new:N \g_@@_allocate_int
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_internal_a_tl,\l_@@_internal_b_tl}
+% Scratch space. For instance, when popping
+% \cs{g_@@_stack_seq}/\cs{g_@@_unused_seq}, consists of the
+% catcodetable number (integer denotation) in \LuaTeX{}, or of an
+% intarray variable (as a single token) in other engines.
+% \begin{macrocode}
+\tl_new:N \l_@@_internal_a_tl
+\tl_new:N \l_@@_internal_b_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_endlinechar_prop}
+% In \LuaTeX{} we store the \tn{endlinechar} associated to each
+% \tn{catcodetable} in a property list, unless it is the default
+% value~$13$.
+% \begin{macrocode}
+\prop_new:N \g_@@_endlinechar_prop
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Allocating category code tables}
+%
+% \begin{macro}{\cctab_new:N, \cctab_new:c, \@@_new:N, \@@_gstore:Nnn}
+% The \cs{@@_new:N} auxiliary allocates a new catcode table but does
+% not attempt to set its value consistently across engines. It is
+% used both in \cs{cctab_new:N}, which sets catcodes to \IniTeX{}
+% values, and in \cs{cctab_begin:N}/\cs{cctab_end:} for dynamically
+% allocated tables.
+%
+% First, the \LuaTeX{} case.
+% Creating a new category code table is done like other registers.
+% In Con\TeX{}t, \tn{newcatcodetable} does not include the initialisation,
+% so that is added explicitly.
+% \begin{macrocode}
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \cctab_new:N #1
+ {
+ \__kernel_chk_if_free_cs:N #1
+ \@@_new:N #1
+ }
+ \cs_new_protected:Npn \@@_new:N #1
+ {
+ \newcatcodetable #1
+ \tex_initcatcodetable:D #1
+ }
+ }
+% \end{macrocode}
+% Now the case for other engines. Here, each table is an integer
+% array. Following the \LuaTeX{} pattern, a new table starts with
+% \IniTeX{} codes. The index base is out-by-one, so we have an
+% internal function to handle that. The \IniTeX{} \tn{endlinechar} is
+% $13$.
+% \begin{macrocode}
+ {
+ \cs_new_protected:Npn \@@_new:N #1
+ { \intarray_new:Nn #1 { 257 } }
+ \cs_new_protected:Npn \@@_gstore:Nnn #1#2#3
+ { \intarray_gset:Nnn #1 { \int_eval:n { #2 + 1 } } {#3} }
+ \cs_new_protected:Npn \cctab_new:N #1
+ {
+ \__kernel_chk_if_free_cs:N #1
+ \@@_new:N #1
+ \int_step_inline:nn { 256 }
+ { \__kernel_intarray_gset:Nnn #1 {##1} { 12 } }
+ \__kernel_intarray_gset:Nnn #1 { 257 } { 13 }
+ \@@_gstore:Nnn #1 { 0 } { 9 }
+ \@@_gstore:Nnn #1 { 13 } { 5 }
+ \@@_gstore:Nnn #1 { 32 } { 10 }
+ \@@_gstore:Nnn #1 { 37 } { 14 }
+ \int_step_inline:nnn { 65 } { 90 }
+ { \@@_gstore:Nnn #1 {##1} { 11 } }
+ \@@_gstore:Nnn #1 { 92 } { 0 }
+ \int_step_inline:nnn { 97 } { 122 }
+ { \@@_gstore:Nnn #1 {##1} { 11 } }
+ \@@_gstore:Nnn #1 { 127 } { 15 }
+ }
+ }
+\cs_generate_variant:Nn \cctab_new:N { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Saving category code tables}
+%
+% \begin{macro}{\@@_gset:n, \@@_gset_aux:n}
+% In various functions we need to save the current catcodes (globally)
+% in a table. In \LuaTeX{}, saving the catcodes is a primitives, but
+% the \tn{endlinechar} needs more work: to avoid filling
+% \cs{g_@@_endlinechar_prop} with many entries we special-case the
+% default value $13$. In other engines we store $256$ current
+% catcodes and the \tn{endlinechar} in an intarray variable.
+% \begin{macrocode}
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \@@_gset:n #1
+ { \exp_args:Nf \@@_gset_aux:n { \int_eval:n {#1} } }
+ \cs_new_protected:Npn \@@_gset_aux:n #1
+ {
+ \tex_savecatcodetable:D #1 \scan_stop:
+ \int_compare:nNnTF { \tex_endlinechar:D } = { 13 }
+ { \prop_gremove:Nn \g_@@_endlinechar_prop {#1} }
+ {
+ \prop_gput:NnV \g_@@_endlinechar_prop {#1}
+ \tex_endlinechar:D
+ }
+ }
+ }
+ {
+ \cs_new_protected:Npn \@@_gset:n #1
+ {
+ \int_step_inline:nn { 256 }
+ {
+ \__kernel_intarray_gset:Nnn #1 {##1}
+ { \char_value_catcode:n { ##1 - 1 } }
+ }
+ \__kernel_intarray_gset:Nnn #1 { 257 }
+ { \tex_endlinechar:D }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cctab_gset:Nn, \cctab_gset:cn}
+% Category code tables are always global, so only one version of
+% assignments is needed. Simply run the setup in a group and save the
+% result in a category code table~|#1|, provided it is valid. The
+% internal function is defined above depending on the engine.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_gset:Nn #1#2
+ {
+ \@@_chk_if_valid:NT #1
+ {
+ \group_begin:
+ \cctab_select:N \c_initex_cctab
+ #2 \scan_stop:
+ \@@_gset:n {#1}
+ \group_end:
+ }
+ }
+\cs_generate_variant:Nn \cctab_gset:Nn { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Using category code tables}
+%
+% \begin{variable}{\g_@@_internal_cctab}
+% \begin{macro}[EXP]{\@@_internal_cctab_name:}
+% In \LuaTeX{}, we must ensure that the saved tables are read-only.
+% This is done by applying the saved table, then switching immediately
+% to a scratch table. Any later catcode assignment will affect that
+% scratch table rather than the saved one. If we simply switched to
+% the saved tables, then \cs{char_set_catcode_other:N} in the example
+% below would change \cs{c_document_cctab} and a later use of that
+% table would give the wrong category code to |_|.
+% \begin{verbatim}
+% \use:n
+% {
+% \cctab_begin:N \c_document_cctab
+% \char_set_catcode_other:N \_
+% \cctab_end:
+% \cctab_begin:N \c_document_cctab
+% \int_compare:nTF { \char_value_catcode:n { `_ } = 8 }
+% { \TRUE } { \ERROR }
+% \cctab_end:
+% }
+% \end{verbatim}
+% We must also make sure that a scratch table is never reused in a
+% nested group: in the following example, the scratch table used by
+% the first \cs{cctab_begin:N} would be changed globally by the second
+% one issuing \tn{savecatcodetable}, and after \cs{group_end:} the
+% wrong category codes (those of \cs{c_str_cctab}) would be imposed.
+% Note that the inner \cs{cctab_end:} restores the correct catcodes
+% only locally, so the problem really comes up because of the
+% different grouping level. The simplest is to use a scratch table
+% labeled by the \tn{currentgrouplevel}. We initialize one of them as
+% an example.
+% \begin{verbatim}
+% \use:n
+% {
+% \cctab_begin:N \c_document_cctab
+% \group_begin:
+% \cctab_begin:N \c_str_cctab
+% \cctab_end:
+% \group_end:
+% \cctab_end:
+% }
+% \end{verbatim}
+% \begin{macrocode}
+\sys_if_engine_luatex:T
+ {
+ \@@_new:N \g_@@_internal_cctab
+ \cs_new:Npn \@@_internal_cctab_name:
+ {
+ g_@@_internal
+ \tex_romannumeral:D \tex_currentgrouplevel:D
+ _cctab
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{variable}
+%
+% \begin{macro}{\cctab_select:N, \cctab_select:c}
+% \begin{macro}{\@@_select:N}
+% The public function simply checks the \meta{cctab~var} exists before
+% using the engine-dependent \cs{@@_select:N}. Skipping these checks
+% would result in low-level engine-dependent errors. First, the
+% \LuaTeX{} case. In other engines, selecting a catcode table is a matter
+% of doing $256$ catcode assignments and setting the \tn{endlinechar}.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_select:N #1
+ { \@@_chk_if_valid:NT #1 { \@@_select:N #1 } }
+\cs_generate_variant:Nn \cctab_select:N { c }
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \@@_select:N #1
+ {
+ \tex_catcodetable:D #1
+ \prop_get:NVNTF \g_@@_endlinechar_prop #1 \l_@@_internal_a_tl
+ { \int_set:Nn \tex_endlinechar:D { \l_@@_internal_a_tl } }
+ { \int_set:Nn \tex_endlinechar:D { 13 } }
+ \cs_if_exist:cF { \@@_internal_cctab_name: }
+ { \exp_args:Nc \@@_new:N { \@@_internal_cctab_name: } }
+ \exp_args:Nc \tex_savecatcodetable:D { \@@_internal_cctab_name: }
+ \exp_args:Nc \tex_catcodetable:D { \@@_internal_cctab_name: }
+ }
+ }
+ {
+ \cs_new_protected:Npn \@@_select:N #1
+ {
+ \int_step_inline:nn { 256 }
+ {
+ \char_set_catcode:nn { ##1 - 1 }
+ { \__kernel_intarray_item:Nn #1 {##1} }
+ }
+ \int_set:Nn \tex_endlinechar:D
+ { \__kernel_intarray_item:Nn #1 { 257 } }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{variable}{\g_@@_next_cctab}
+% \begin{macro}{\@@_begin_aux:}
+% For \cs{cctab_begin:N}/\cs{cctab_end:} we will need to allocate
+% dynamic tables. This is done here by \cs{@@_begin_aux:}, which puts
+% a table number (in \LuaTeX{}) or name (in other engines) into
+% \cs{l_@@_internal_a_tl}. In \LuaTeX{} this simply calls \cs{@@_new:N}
+% and uses the resulting catcodetable number; in other engines we need
+% to give a name to the intarray variable and use that. In \LuaTeX{},
+% to restore catcodes at \cs{cctab_end:} we cannot just set
+% \tn{catcodetable} to its value before \cs{cctab_begin:N}, because
+% that table may have been altered by other code in the mean time. So
+% we must make sure to save the catcodes in a table we control and
+% restore them at \cs{cctab_end:}.
+% \begin{macrocode}
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \@@_begin_aux:
+ {
+ \@@_new:N \g_@@_next_cctab
+ \tl_set:NV \l_@@_internal_a_tl \g_@@_next_cctab
+ \cs_undefine:N \g_@@_next_cctab
+ }
+ }
+ {
+ \cs_new_protected:Npn \@@_begin_aux:
+ {
+ \int_gincr:N \g_@@_allocate_int
+ \exp_args:Nc \@@_new:N
+ { g_@@_ \int_use:N \g_@@_allocate_int _cctab }
+ \exp_args:NNc \tl_set:Nn \l_@@_internal_a_tl
+ { g_@@_ \int_use:N \g_@@_allocate_int _cctab }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{variable}
+%
+% \begin{macro}{\cctab_begin:N, \cctab_begin:c}
+% Check the \meta{cctab~var} exists, to avoid low-level errors. Get
+% in \cs{l_@@_internal_a_tl} the number/name of a dynamic table, either
+% from \cs{g_@@_unused_seq} where we save tables that are not
+% currently in use, or from \cs{@@_begin_aux:} if none are available.
+% Then save the current catcodes into the table (pointed to by)
+% \cs{l_@@_internal_a_tl} and save that table number in a stack before
+% selecting the desired catcodes.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_begin:N #1
+ {
+ \@@_chk_if_valid:NT #1
+ {
+ \seq_gpop:NNF \g_@@_unused_seq \l_@@_internal_a_tl
+ { \@@_begin_aux: }
+ \exp_args:Nx \@@_chk_group_begin:n
+ { \@@_nesting_number:N \l_@@_internal_a_tl }
+ \seq_gpush:NV \g_@@_stack_seq \l_@@_internal_a_tl
+ \exp_args:NV \@@_gset:n \l_@@_internal_a_tl
+ \@@_select:N #1
+ }
+ }
+\cs_generate_variant:Nn \cctab_begin:N { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cctab_end:}
+% Make sure a \cs{cctab_begin:N} was used some time earlier, get in
+% \cs{l_@@_internal_a_tl} the catcode table number/name in which the
+% prevailing catcodes were stored, then restore these catcodes. The
+% dynamic table is now unused hence stored in \cs{g_@@_unused_seq} for
+% recycling by later \cs{cctab_begin:N}.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_end:
+ {
+ \seq_gpop:NNTF \g_@@_stack_seq \l_@@_internal_a_tl
+ {
+ \seq_gpush:NV \g_@@_unused_seq \l_@@_internal_a_tl
+ \exp_args:Nx \@@_chk_group_end:n
+ { \@@_nesting_number:N \l_@@_internal_a_tl }
+ \@@_select:N \l_@@_internal_a_tl
+ }
+ { \__kernel_msg_error:nn { kernel } { cctab-extra-end } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_chk_group_begin:n,\@@_chk_group_end:n}
+% Catcode tables are not allowed to be intermixed with groups, so here
+% we check that they are properly nested regarding \TeX{} groups.
+% \cs{@@_chk_group_begin:n} stores the current group level in a stack,
+% and locally defines a dummy control sequence
+% \cs[no-index]{@@_group_\meta{cctab-level}_chk:}.
+%
+% \cs{@@_chk_group_end:n} pops the stack, and compares the returned
+% value with \cs{tex_currentgrouplevel:D}. If they differ,
+% \cs{cctab_end:} is in a different grouping level than the matching
+% \cs{cctab_begin:N}. If they are the same, both happened at the same
+% level, however a group might have ended and another started between
+% \cs{cctab_begin:N} and \cs{cctab_end:}:
+% \begin{verbatim}
+% \group_begin:
+% \cctab_begin:N \c_document_cctab
+% \group_end:
+% \group_begin:
+% \cctab_end:
+% \group_end:
+% \end{verbatim}
+% In this case checking \cs{tex_currentgrouplevel:D} is not enough, so
+% we locally define \cs[no-index]{@@_group_\meta{cctab-level}_chk:},
+% and then check if it exist in \cs{cctab_end:}. If it doesn't,
+% we know there was a group end where it shouldn't.
+%
+% The \meta{cctab-level} in the sentinel macro above cannot be
+% replaced by the more convenient \cs{tex_currentgrouplevel:D} because
+% with the latter we might be tricked. Suppose:
+% \begin{verbatim}
+% \group_begin:
+% \cctab_begin:N \c_code_cctab % A
+% \group_end:
+% \group_begin:
+% \cctab_begin:N \c_code_cctab % B
+% \cctab_end: % C
+% \cctab_end: % D
+% \group_end:
+% \end{verbatim}
+% The line marked with |A| would start a |cctab| with a sentinel token
+% named \cs[no-index]{@@_group_1_chk:}, which would disappear at the
+% \cs{group_end:} that follows. But |B| would create the same
+% sentinel token, since both are at the same group level. Line |C|
+% would end the |cctab| from line |B| correctly, but so would line |D|
+% because line |B| created the same sentinel token. Using
+% \meta{cctab-level} works correctly because it signals that certain
+% |cctab| level was activated somewhere, but if it doesn't exist when
+% the \cs{cctab_end:} is reached, we had a problem.
+%
+% Unfortunately these tests only flag the wrong usage at the
+% \cs{cctab_end:}, which might be far from the \cs{cctab_begin:N}.
+% However it isn't possible to signal the wrong usage at the
+% \cs{group_end:} without using \cs{tex_aftergroup:D}, which is
+% unsafe in certain types of groups.
+%
+% The three cases checked here just raise an error, and no recovery is
+% attempted: usually interleaving groups and catcode tables will work
+% predictably.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_chk_group_begin:n #1
+ {
+ \seq_gpush:Nx \g_@@_group_seq
+ { \int_use:N \tex_currentgrouplevel:D }
+ \cs_set_eq:cN { @@_group_ #1 _chk: } \prg_do_nothing:
+ }
+\cs_new_protected:Npn \@@_chk_group_end:n #1
+ {
+ \seq_gpop:NN \g_@@_group_seq \l_@@_internal_b_tl
+ \bool_lazy_and:nnF
+ {
+ \int_compare_p:nNn
+ { \tex_currentgrouplevel:D } = { \l_@@_internal_b_tl }
+ }
+ { \cs_if_exist_p:c { @@_group_ #1 _chk: } }
+ {
+ \__kernel_msg_error:nnx { kernel } { cctab-group-mismatch }
+ {
+ \int_sign:n
+ { \tex_currentgrouplevel:D - \l_@@_internal_b_tl }
+ }
+ }
+ \cs_undefine:c { @@_group_ #1 _chk: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_nesting_number:N,\@@_nesting_number:w}
+% This macro returns the numeric index of the current catcode table.
+% In \LuaTeX{} this is just the argument, which is a count reference
+% to a \tn{catcodetable} register. In other engines, the number is
+% extracted from the |cctab| variable.
+% \begin{macrocode}
+\sys_if_engine_luatex:TF
+ { \cs_new:Npn \@@_nesting_number:N #1 {#1} }
+ {
+ \cs_new:Npn \@@_nesting_number:N #1
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN \@@_nesting_number:w
+ \exp_after:wN \token_to_str:N #1
+ }
+ \use:x
+ {
+ \cs_new:Npn \exp_not:N \@@_nesting_number:w
+ ##1 \tl_to_str:n { g_@@_ } ##2 \tl_to_str:n { _cctab } {##2}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% Finally, install some code at the end of the \TeX{} run to check that
+% all \cs{cctab_begin:N} were ended by some \cs{cctab_end:}.
+% \begin{macrocode}
+\cs_if_exist:NT \hook_gput_code:nnn
+ {
+ \hook_gput_code:nnn { enddocument/end } { kernel }
+ {
+ \seq_if_empty:NF \g_@@_stack_seq
+ { \__kernel_msg_error:nn { kernel } { cctab-missing-end } }
+ }
+ }
+% \end{macrocode}
+%
+% \subsection{Category code table conditionals}
+%
+% \begin{macro}{\cctab_if_exist:N,\cctab_if_exist:c}
+% Checks whether a \meta{cctab~var} is defined.
+% \begin{macrocode}
+\prg_new_eq_conditional:NNn \cctab_if_exist:N \cs_if_exist:N
+ { TF , T , F , p }
+\prg_new_eq_conditional:NNn \cctab_if_exist:c \cs_if_exist:c
+ { TF , T , F , p }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[TF]{\@@_chk_if_valid:N}
+% \begin{macro}{\@@_chk_if_valid_aux:NTF}
+% Checks whether the argument is defined and whether it is a valid
+% \meta{cctab~var}. In \LuaTeX{} the validity of the \meta{cctab~var}
+% is checked by the engine, which complains if the argument is not a
+% \cs{chardef}'ed constant. In other engines, check if the given
+% command is an intarray variable (the underlying definition is a copy
+% of the \texttt{cmr10} font).
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \@@_chk_if_valid:N #1
+ { TF , T , F }
+ {
+ \cctab_if_exist:NTF #1
+ {
+ \@@_chk_if_valid_aux:NTF #1
+ { \prg_return_true: }
+ {
+ \__kernel_msg_error:nnx { kernel } { invalid-cctab }
+ { \token_to_str:N #1 }
+ \prg_return_false:
+ }
+ }
+ {
+ \__kernel_msg_error:nnx { kernel } { command-not-defined }
+ { \token_to_str:N #1 }
+ \prg_return_false:
+ }
+ }
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \@@_chk_if_valid_aux:NTF #1
+ {
+ \int_compare:nNnTF {#1-1} < { \e@alloc@ccodetable@count }
+ }
+ \cs_if_exist:NT \c_syst_catcodes_n
+ {
+ \cs_gset_protected:Npn \@@_chk_if_valid_aux:NTF #1
+ {
+ \int_compare:nTF { #1 <= \c_syst_catcodes_n }
+ }
+ }
+ }
+ {
+ \cs_new_protected:Npn \@@_chk_if_valid_aux:NTF #1
+ {
+ \exp_args:Nf \str_if_in:nnTF
+ { \cs_meaning:N #1 }
+ { select~font~cmr10~at~ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Constant category code tables}
+%
+% \begin{macro}{\cctab_const:Nn,\cctab_const:cn}
+% Creates a new \meta{cctab~var} then sets it with the current and
+% user-supplied codes.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_const:Nn #1#2
+ {
+ \cctab_new:N #1
+ \cctab_gset:Nn #1 {#2}
+ }
+\cs_generate_variant:Nn \cctab_const:Nn { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}
+% {
+% \c_initex_cctab ,
+% \c_other_cctab ,
+% \c_str_cctab
+% }
+% Creating category code tables means thinking starting from \IniTeX{}.
+% For all-other and the standard \enquote{string} tables that's easy.
+% \begin{macrocode}
+\cctab_new:N \c_initex_cctab
+\cctab_const:Nn \c_other_cctab
+ {
+ \cctab_select:N \c_initex_cctab
+ \int_set:Nn \tex_endlinechar:D { -1 }
+ \int_step_inline:nnn { 0 } { 127 }
+ { \char_set_catcode_other:n {#1} }
+ }
+\cctab_const:Nn \c_str_cctab
+ {
+ \cctab_select:N \c_other_cctab
+ \char_set_catcode_space:n { 32 }
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_code_cctab, \c_document_cctab}
+% To pick up document-level category codes, we need to delay set up to the
+% end of the format, where that's possible. Also, as there are a \emph{lot}
+% of category codes to set, we avoid using the official interface and store the
+% document codes using internal code. Depending on whether we are in the hook
+% or not, the catcodes may be code or document, so we explicitly set up both
+% correctly.
+% \begin{macrocode}
+\cs_if_exist:NTF \@expl@finalise@setup@@@@
+ { \tl_gput_right:Nn \@expl@finalise@setup@@@@ }
+ { \use:n }
+ {
+ \@@_new:N \c_code_cctab
+ \group_begin:
+ \int_set:Nn \tex_endlinechar:D { 32 }
+ \char_set_catcode_invalid:n { 0 }
+ \bool_lazy_or:nnTF
+ { \sys_if_engine_xetex_p: } { \sys_if_engine_luatex_p: }
+ { \int_step_function:nN { 31 } \char_set_catcode_invalid:n }
+ { \int_step_function:nN { 31 } \char_set_catcode_active:n }
+ \int_step_function:nnN { 33 } { 64 } \char_set_catcode_other:n
+ \int_step_function:nnN { 65 } { 90 } \char_set_catcode_letter:n
+ \int_step_function:nnN { 91 } { 96 } \char_set_catcode_other:n
+ \int_step_function:nnN { 97 } { 122 } \char_set_catcode_letter:n
+ \char_set_catcode_ignore:n { 9 } % tab
+ \char_set_catcode_other:n { 10 } % lf
+ \char_set_catcode_active:n { 12 } % ff
+ \char_set_catcode_end_line:n { 13 } % cr
+ \char_set_catcode_ignore:n { 32 } % space
+ \char_set_catcode_parameter:n { 35 } % hash
+ \char_set_catcode_math_toggle:n { 36 } % dollar
+ \char_set_catcode_comment:n { 37 } % percent
+ \char_set_catcode_alignment:n { 38 } % ampersand
+ \char_set_catcode_letter:n { 58 } % colon
+ \char_set_catcode_escape:n { 92 } % backslash
+ \char_set_catcode_math_superscript:n { 94 } % circumflex
+ \char_set_catcode_letter:n { 95 } % underscore
+ \char_set_catcode_group_begin:n { 123 } % left brace
+ \char_set_catcode_other:n { 124 } % pipe
+ \char_set_catcode_group_end:n { 125 } % right brace
+ \char_set_catcode_space:n { 126 } % tilde
+ \char_set_catcode_invalid:n { 127 } % ^^?
+ \bool_lazy_or:nnF
+ { \sys_if_engine_xetex_p: } { \sys_if_engine_luatex_p: }
+ { \int_step_function:nnN { 128 } { 255 } \char_set_catcode_active:n }
+ \@@_gset:n { \c_code_cctab }
+ \group_end:
+ \cctab_const:Nn \c_document_cctab
+ {
+ \cctab_select:N \c_code_cctab
+ \int_set:Nn \tex_endlinechar:D { 13 }
+ \char_set_catcode_space:n { 9 }
+ \char_set_catcode_space:n { 32 }
+ \char_set_catcode_other:n { 58 }
+ \char_set_catcode_math_subscript:n { 95 }
+ \char_set_catcode_active:n { 126 }
+ }
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Messages}
+%
+% \begin{macrocode}
+\__kernel_msg_new:nnnn { kernel } { cctab-stack-full }
+ { The~category~code~table~stack~is~exhausted. }
+ {
+ LaTeX~has~been~asked~to~switch~to~a~new~category~code~table,~
+ but~there~is~no~more~space~to~do~this!
+ }
+\__kernel_msg_new:nnnn { kernel } { cctab-extra-end }
+ { Extra~\iow_char:N\\cctab_end:~ignored~\msg_line_context:. }
+ {
+ LaTeX~came~across~a~\iow_char:N\\cctab_end:~without~a~matching~
+ \iow_char:N\\cctab_begin:N.~This~command~will~be~ignored.
+ }
+\__kernel_msg_new:nnnn { kernel } { cctab-missing-end }
+ { Missing~\iow_char:N\\cctab_end:~before~end~of~TeX~run. }
+ {
+ LaTeX~came~across~more~\iow_char:N\\cctab_begin:N~than~
+ \iow_char:N\\cctab_end:.
+ }
+\__kernel_msg_new:nnnn { kernel } { invalid-cctab }
+ { Invalid~\iow_char:N\\catcode~table. }
+ {
+ You~can~only~switch~to~a~\iow_char:N\\catcode~table~that~is~
+ initialized~using~\iow_char:N\\cctab_new:N~or~
+ \iow_char:N\\cctab_const:Nn.
+ }
+\__kernel_msg_new:nnnn { kernel } { cctab-group-mismatch }
+ {
+ \iow_char:N\\cctab_end:~occurred~in~a~
+ \int_case:nn {#1}
+ {
+ { 0 } { different~group }
+ { 1 } { higher~group~level }
+ { -1 } { lower~group~level }
+ } ~than~
+ the~matching~\iow_char:N\\cctab_begin:N.
+ }
+ {
+ Catcode~tables~and~groups~must~be~properly~nested,~but~
+ you~tried~to~interleave~them.~LaTeX~will~try~to~proceed,~
+ but~results~may~be~unexpected.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+%\PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
index 3c79a276d90..02064b80ea9 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
@@ -2,8 +2,8 @@
%
%% File: l3clist.dtx
%
-% Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX3 Project
-% (C) 2012-2020 The LaTeX3 Project
+% Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX Project
+% (C) 2012-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -94,8 +94,7 @@
% than their sequence analogues for large lists. However, these
% functions work slowly for \enquote{unsafe} items that must be braced,
% and may produce errors when their argument contains |{|, |}| or |#|
-% (assuming the usual \TeX{} category codes apply). In addition, comma
-% lists cannot store quarks \cs{q_mark} or \cs{q_stop}. The sequence
+% (assuming the usual \TeX{} category codes apply). The sequence
% data type should thus certainly be preferred to comma lists to store
% such items.
%
@@ -763,7 +762,7 @@
% \TestFiles{m3clist002}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -785,6 +784,41 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{
+% \@@_use_none_delimit_by_s_stop:w,
+% \@@_use_i_delimit_by_s_stop:nw
+% }
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_break:nN,\@@_if_recursion_tail_stop:n}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_break:nN
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop:n
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_tmp:w}
% A temporary function for various purposes.
% \begin{macrocode}
@@ -826,11 +860,11 @@
{
\exp_after:wN \@@_sanitize:Nn \exp_after:wN \c_empty_tl
\exp:w \@@_trim_next:w \prg_do_nothing:
- #1 , \q_recursion_tail , \q_recursion_stop
+ #1 , \q_@@_recursion_tail , \q_@@_recursion_stop
}
\cs_new:Npn \@@_sanitize:Nn #1#2
{
- \quark_if_recursion_tail_stop:n {#2}
+ \@@_if_recursion_tail_stop:n {#2}
#1 \@@_wrap_item:w #2 ,
\exp_after:wN \@@_sanitize:Nn \exp_after:wN ,
\exp:w \@@_trim_next:w \prg_do_nothing:
@@ -850,7 +884,7 @@
% \end{itemize}
% All \pkg{l3clist} functions go through the same test when they need
% to determine whether to brace an item, so it is not a problem that
-% this test has false positives such as \enquote{\cs{q_mark}
+% this test has false positives such as \enquote{\cs{s_@@_mark}
% \texttt{?}}. If the argument starts or end with a space or contains
% a comma then one of the three arguments of \cs{@@_if_wrap:w} will
% have its end delimiter (partly) in one of the three copies of |#1|
@@ -865,7 +899,8 @@
\tl_if_empty:oTF
{
\@@_if_wrap:w
- \q_mark ? #1 ~ \q_mark ? ~ #1 \q_mark , ~ \q_mark #1 ,
+ \s_@@_mark ? #1 ~ \s_@@_mark ? ~ #1
+ \s_@@_mark , ~ \s_@@_mark #1 ,
}
{
\tl_if_head_is_group:nTF { #1 { } }
@@ -882,7 +917,7 @@
}
{ \prg_return_true: }
}
-\cs_new:Npn \@@_if_wrap:w #1 \q_mark ? ~ #2 ~ \q_mark #3 , { }
+\cs_new:Npn \@@_if_wrap:w #1 \s_@@_mark ? ~ #2 ~ \s_@@_mark #3 , { }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -991,9 +1026,9 @@
% in the case of an empty comma-list.
% \begin{macrocode}
\cs_new_protected:Npn \clist_set_from_seq:NN
- { \@@_set_from_seq:NNNN \clist_clear:N \tl_set:Nx }
+ { \@@_set_from_seq:NNNN \clist_clear:N \__kernel_tl_set:Nx }
\cs_new_protected:Npn \clist_gset_from_seq:NN
- { \@@_set_from_seq:NNNN \clist_gclear:N \tl_gset:Nx }
+ { \@@_set_from_seq:NNNN \clist_gclear:N \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_set_from_seq:NNNN #1#2#3#4
{
\seq_if_empty:NTF #4
@@ -1032,9 +1067,9 @@
% a little work to do.
% \begin{macrocode}
\cs_new_protected:Npn \clist_concat:NNN
- { \@@_concat:NNNN \tl_set:Nx }
+ { \@@_concat:NNNN \__kernel_tl_set:Nx }
\cs_new_protected:Npn \clist_gconcat:NNN
- { \@@_concat:NNNN \tl_gset:Nx }
+ { \@@_concat:NNNN \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_concat:NNNN #1#2#3#4
{
#1 #2
@@ -1079,9 +1114,9 @@
% }
% \begin{macrocode}
\cs_new_protected:Npn \clist_set:Nn #1#2
- { \tl_set:Nx #1 { \@@_sanitize:n {#2} } }
+ { \__kernel_tl_set:Nx #1 { \@@_sanitize:n {#2} } }
\cs_new_protected:Npn \clist_gset:Nn #1#2
- { \tl_gset:Nx #1 { \@@_sanitize:n {#2} } }
+ { \__kernel_tl_gset:Nx #1 { \@@_sanitize:n {#2} } }
\cs_generate_variant:Nn \clist_set:Nn { NV , No , Nx , c , cV , co , cx }
\cs_generate_variant:Nn \clist_gset:Nn { NV , No , Nx , c , cV , co , cx }
% \end{macrocode}
@@ -1180,10 +1215,10 @@
\if_meaning:w #1 \c_empty_clist
\tl_set:Nn #2 { \q_no_value }
\else:
- \exp_after:wN \@@_get:wN #1 , \q_stop #2
+ \exp_after:wN \@@_get:wN #1 , \s_@@_stop #2
\fi:
}
-\cs_new_protected:Npn \@@_get:wN #1 , #2 \q_stop #3
+\cs_new_protected:Npn \@@_get:wN #1 , #2 \s_@@_stop #3
{ \tl_set:Nn #3 {#1} }
\cs_generate_variant:Nn \clist_get:NN { c }
% \end{macrocode}
@@ -1199,35 +1234,35 @@
% An empty clist leads to \cs{q_no_value}, otherwise grab until the
% first comma and assign to the variable. The second argument of
% \cs{@@_pop:wwNNN} is a comma list ending in a comma and
-% \cs{q_mark}, unless the original clist contained exactly one item:
-% then the argument is just \cs{q_mark}. The next auxiliary picks
+% \cs{s_@@_mark}, unless the original clist contained exactly one item:
+% then the argument is just \cs{s_@@_mark}. The next auxiliary picks
% either \cs{exp_not:n} or \cs{use_none:n} as |#2|, ensuring that the
% result can safely be an empty comma list.
% \begin{macrocode}
\cs_new_protected:Npn \clist_pop:NN
- { \@@_pop:NNN \tl_set:Nx }
+ { \@@_pop:NNN \__kernel_tl_set:Nx }
\cs_new_protected:Npn \clist_gpop:NN
- { \@@_pop:NNN \tl_gset:Nx }
+ { \@@_pop:NNN \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_pop:NNN #1#2#3
{
\if_meaning:w #2 \c_empty_clist
\tl_set:Nn #3 { \q_no_value }
\else:
- \exp_after:wN \@@_pop:wwNNN #2 , \q_mark \q_stop #1#2#3
+ \exp_after:wN \@@_pop:wwNNN #2 , \s_@@_mark \s_@@_stop #1#2#3
\fi:
}
-\cs_new_protected:Npn \@@_pop:wwNNN #1 , #2 \q_stop #3#4#5
+\cs_new_protected:Npn \@@_pop:wwNNN #1 , #2 \s_@@_stop #3#4#5
{
\tl_set:Nn #5 {#1}
#3 #4
{
\@@_pop:wN \prg_do_nothing:
#2 \exp_not:o
- , \q_mark \use_none:n
- \q_stop
+ , \s_@@_mark \use_none:n
+ \s_@@_stop
}
}
-\cs_new:Npn \@@_pop:wN #1 , \q_mark #2 #3 \q_stop { #2 {#1} }
+\cs_new:Npn \@@_pop:wN #1 , \s_@@_mark #2 #3 \s_@@_stop { #2 {#1} }
\cs_generate_variant:Nn \clist_pop:NN { c }
\cs_generate_variant:Nn \clist_gpop:NN { c }
% \end{macrocode}
@@ -1246,21 +1281,21 @@
\if_meaning:w #1 \c_empty_clist
\prg_return_false:
\else:
- \exp_after:wN \@@_get:wN #1 , \q_stop #2
+ \exp_after:wN \@@_get:wN #1 , \s_@@_stop #2
\prg_return_true:
\fi:
}
\prg_generate_conditional_variant:Nnn \clist_get:NN { c } { T , F , TF }
\prg_new_protected_conditional:Npnn \clist_pop:NN #1#2 { T , F , TF }
- { \@@_pop_TF:NNN \tl_set:Nx #1 #2 }
+ { \@@_pop_TF:NNN \__kernel_tl_set:Nx #1 #2 }
\prg_new_protected_conditional:Npnn \clist_gpop:NN #1#2 { T , F , TF }
- { \@@_pop_TF:NNN \tl_gset:Nx #1 #2 }
+ { \@@_pop_TF:NNN \__kernel_tl_gset:Nx #1 #2 }
\cs_new_protected:Npn \@@_pop_TF:NNN #1#2#3
{
\if_meaning:w #2 \c_empty_clist
\prg_return_false:
\else:
- \exp_after:wN \@@_pop:wwNNN #2 , \q_mark \q_stop #1#2#3
+ \exp_after:wN \@@_pop:wwNNN #2 , \s_@@_mark \s_@@_stop #1#2#3
\prg_return_true:
\fi:
}
@@ -1364,13 +1399,13 @@
% the expanded comma list, and another copy of the \meta{item}.
% The loop is controlled by the argument grabbed by
% \cs{@@_remove_all:w}: when the item was found,
-% the \cs{q_mark} delimiter used is the one inserted by
-% \cs{@@_tmp:w}, and \cs{use_none_delimit_by_q_stop:w}
+% the \cs{s_@@_mark} delimiter used is the one inserted by
+% \cs{@@_tmp:w}, and \cs{@@_use_none_delimit_by_s_stop:w}
% is deleted. At the end, the final \meta{item} is
% grabbed, and the argument of \cs{@@_tmp:w} contains
-% \cs{q_mark}: in that case, \cs{@@_remove_all:w}
-% removes the second \cs{q_mark} (inserted by \cs{@@_tmp:w}),
-% and lets \cs{use_none_delimit_by_q_stop:w} act.
+% \cs{s_@@_mark}: in that case, \cs{@@_remove_all:w}
+% removes the second \cs{s_@@_mark} (inserted by \cs{@@_tmp:w}),
+% and lets \cs{@@_use_none_delimit_by_s_stop:w} act.
%
% No brace is lost because items are always grabbed with a leading comma.
% The result of the first assignment has an extra leading comma,
@@ -1381,9 +1416,9 @@
% the second step removes it.
% \begin{macrocode}
\cs_new_protected:Npn \clist_remove_all:Nn
- { \@@_remove_all:NNNn \clist_set_from_seq:NN \tl_set:Nx }
+ { \@@_remove_all:NNNn \clist_set_from_seq:NN \__kernel_tl_set:Nx }
\cs_new_protected:Npn \clist_gremove_all:Nn
- { \@@_remove_all:NNNn \clist_gset_from_seq:NN \tl_gset:Nx }
+ { \@@_remove_all:NNNn \clist_gset_from_seq:NN \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_remove_all:NNNn #1#2#3#4
{
\@@_if_wrap:nTF {#4}
@@ -1396,13 +1431,13 @@
\cs_set:Npn \@@_tmp:w ##1 , #4 ,
{
##1
- , \q_mark , \use_none_delimit_by_q_stop:w ,
+ , \s_@@_mark , \@@_use_none_delimit_by_s_stop:w ,
\@@_remove_all:
}
#2 #3
{
\exp_after:wN \@@_remove_all:
- #3 , \q_mark , #4 , \q_stop
+ #3 , \s_@@_mark , #4 , \s_@@_stop
}
\clist_if_empty:NF #3
{
@@ -1416,7 +1451,7 @@
}
\cs_new:Npn \@@_remove_all:
{ \exp_after:wN \@@_remove_all:w \@@_tmp:w , }
-\cs_new:Npn \@@_remove_all:w #1 , \q_mark , #2 , { \exp_not:n {#1} }
+\cs_new:Npn \@@_remove_all:w #1 , \s_@@_mark , #2 , { \exp_not:n {#1} }
\cs_generate_variant:Nn \clist_remove_all:Nn { c }
\cs_generate_variant:Nn \clist_gremove_all:Nn { c }
% \end{macrocode}
@@ -1437,9 +1472,9 @@
% \texttt{N}-type comma lists, but the slow-down is not too bad.
% \begin{macrocode}
\cs_new_protected:Npn \clist_reverse:N #1
- { \tl_set:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
+ { \__kernel_tl_set:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
\cs_new_protected:Npn \clist_greverse:N #1
- { \tl_gset:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
+ { \__kernel_tl_gset:Nx #1 { \exp_args:No \clist_reverse:n {#1} } }
\cs_generate_variant:Nn \clist_reverse:N { c }
\cs_generate_variant:Nn \clist_greverse:N { c }
% \end{macrocode}
@@ -1448,19 +1483,19 @@
% \begin{macro}[EXP]{\clist_reverse:n}
% \begin{macro}[EXP]{\@@_reverse:wwNww, \@@_reverse_end:ww}
% The reversed token list is built one item at a time, and stored
-% between \cs{q_stop} and \cs{q_mark}, in the form of |?| followed by
+% between \cs{s_@@_stop} and \cs{s_@@_mark}, in the form of |?| followed by
% zero or more instances of \enquote{\meta{item}\texttt{,}}. We start from a comma
% list \enquote{\meta{item_1}\texttt{,\ldots,}\meta{item_n}}. During the loop,
% the auxiliary \cs{@@_reverse:wwNww} receives \enquote{\texttt{?}\meta{item_i}} as
% |#1|, \enquote{\meta{item_{i+1}}\texttt{,\ldots,}\meta{item_n}} as |#2|,
-% \cs{@@_reverse:wwNww} as |#3|, what remains until \cs{q_stop} as
+% \cs{@@_reverse:wwNww} as |#3|, what remains until \cs{s_@@_stop} as
% |#4|, and \enquote{\meta{item_{i-1}}\texttt{,\ldots,}\meta{item_1}\texttt{,}} as |#5|.
% The auxiliary moves |#1| just before |#5|, with a comma, and calls
% itself (|#3|). After the last item is moved, \cs{@@_reverse:wwNww}
-% receives \enquote{\cs{q_mark} \cs{@@_reverse:wwNww} \texttt{!}} as its argument
+% receives \enquote{\cs{s_@@_mark} \cs{@@_reverse:wwNww} \texttt{!}} as its argument
% |#1|, thus \cs{@@_reverse_end:ww} as its argument |#3|. This second
% auxiliary cleans up until the marker~|!|, removes the trailing comma
-% (introduced when the first item was moved after \cs{q_stop}), and
+% (introduced when the first item was moved after \cs{s_@@_stop}), and
% leaves its argument~|#1| within \cs{exp_not:n}. There is also a
% need to remove a leading comma, hence \cs{exp_not:o} and
% \cs{use_none:n}.
@@ -1468,14 +1503,14 @@
\cs_new:Npn \clist_reverse:n #1
{
\@@_reverse:wwNww ? #1 ,
- \q_mark \@@_reverse:wwNww ! ,
- \q_mark \@@_reverse_end:ww
- \q_stop ? \q_mark
+ \s_@@_mark \@@_reverse:wwNww ! ,
+ \s_@@_mark \@@_reverse_end:ww
+ \s_@@_stop ? \s_@@_mark
}
\cs_new:Npn \@@_reverse:wwNww
- #1 , #2 \q_mark #3 #4 \q_stop ? #5 \q_mark
- { #3 ? #2 \q_mark #3 #4 \q_stop #1 , #5 \q_mark }
-\cs_new:Npn \@@_reverse_end:ww #1 ! #2 , \q_mark
+ #1 , #2 \s_@@_mark #3 #4 \s_@@_stop ? #5 \s_@@_mark
+ { #3 ? #2 \s_@@_mark #3 #4 \s_@@_stop #1 , #5 \s_@@_mark }
+\cs_new:Npn \@@_reverse_end:ww #1 ! #2 , \s_@@_mark
{ \exp_not:o { \use_none:n #2 } }
% \end{macrocode}
% \end{macro}
@@ -1511,14 +1546,14 @@
% item is non-blank, exit: the second auxiliary grabs
% \cs{prg_return_false:} as |#2|, unless every item in
% the comma list was blank and the loop actually got broken
-% by the trailing |\q_mark \prg_return_false:| item.
+% by the trailing \cs{s_@@_mark} \cs{prg_return_false:} item.
% \begin{macrocode}
\prg_new_conditional:Npnn \clist_if_empty:n #1 { p , T , F , TF }
{
\@@_if_empty_n:w ? #1
- , \q_mark \prg_return_false:
- , \q_mark \prg_return_true:
- \q_stop
+ , \s_@@_mark \prg_return_false:
+ , \s_@@_mark \prg_return_true:
+ \s_@@_stop
}
\cs_new:Npn \@@_if_empty_n:w #1 ,
{
@@ -1526,7 +1561,7 @@
{ \@@_if_empty_n:w ? }
{ \@@_if_empty_n:wNw }
}
-\cs_new:Npn \@@_if_empty_n:wNw #1 \q_mark #2#3 \q_stop {#2}
+\cs_new:Npn \@@_if_empty_n:wNw #1 \s_@@_mark #2#3 \s_@@_stop {#2}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1595,7 +1630,7 @@
% If the variable is empty, the mapping is skipped (otherwise,
% that comma-list would be seen as consisting of one empty item).
% Then loop over the comma-list, grabbing one comma-delimited
-% item at a time. The end is marked by \cs{q_recursion_tail}.
+% item at a time. The end is marked by \cs{q_@@_recursion_tail}.
% The auxiliary function \cs{@@_map_function:Nw} is also used
% in \cs{clist_map_inline:Nn}.
% \begin{macrocode}
@@ -1604,13 +1639,13 @@
\clist_if_empty:NF #1
{
\exp_last_unbraced:NNo \@@_map_function:Nw #2 #1
- , \q_recursion_tail ,
+ , \q_@@_recursion_tail ,
\prg_break_point:Nn \clist_map_break: { }
}
}
\cs_new:Npn \@@_map_function:Nw #1#2 ,
{
- \quark_if_recursion_tail_break:nN {#2} \clist_map_break:
+ \@@_if_recursion_tail_break:nN {#2} \clist_map_break:
#1 {#2}
\@@_map_function:Nw #1
}
@@ -1634,12 +1669,12 @@
\cs_new:Npn \clist_map_function:nN #1#2
{
\exp_after:wN \@@_map_function_n:Nn \exp_after:wN #2
- \exp:w \@@_trim_next:w \prg_do_nothing: #1 , \q_recursion_tail ,
+ \exp:w \@@_trim_next:w \prg_do_nothing: #1 , \q_@@_recursion_tail ,
\prg_break_point:Nn \clist_map_break: { }
}
\cs_new:Npn \@@_map_function_n:Nn #1 #2
{
- \quark_if_recursion_tail_break:nN {#2} \clist_map_break:
+ \@@_if_recursion_tail_break:nN {#2} \clist_map_break:
\@@_map_unbrace:Nw #1 #2,
\exp_after:wN \@@_map_function_n:Nn \exp_after:wN #1
\exp:w \@@_trim_next:w \prg_do_nothing:
@@ -1675,7 +1710,7 @@
{ @@_map_ \int_use:N \g__kernel_prg_map_int :w } ##1 {#2}
\exp_last_unbraced:Nco \@@_map_function:Nw
{ @@_map_ \int_use:N \g__kernel_prg_map_int :w }
- #1 , \q_recursion_tail ,
+ #1 , \q_@@_recursion_tail ,
\prg_break_point:Nn \clist_map_break:
{ \int_gdecr:N \g__kernel_prg_map_int }
}
@@ -1702,7 +1737,7 @@
% The quark test is done before assigning the item to the variable:
% this avoids storing a quark which the user wouldn't expect.
% The strange \cs{use:n} avoids unlikely problems when |#2| would
-% contain \cs{q_recursion_stop}.
+% contain \cs{q_@@_recursion_stop}.
% \begin{macrocode}
\cs_new_protected:Npn \clist_map_variable:NNn #1#2#3
{
@@ -1711,7 +1746,7 @@
\exp_args:Nno \use:nn
{ \@@_map_variable:Nnw #2 {#3} }
#1
- , \q_recursion_tail , \q_recursion_stop
+ , \q_@@_recursion_tail , \q_@@_recursion_stop
\prg_break_point:Nn \clist_map_break: { }
}
}
@@ -1722,7 +1757,7 @@
}
\cs_new_protected:Npn \@@_map_variable:Nnw #1#2#3,
{
- \quark_if_recursion_tail_stop:n {#3}
+ \@@_if_recursion_tail_stop:n {#3}
\tl_set:Nn #1 {#3}
\use:n {#2}
\@@_map_variable:Nnw #1 {#2}
@@ -1769,13 +1804,13 @@
{
0
\exp_not:N \@@_count:w \c_space_tl
- #1 \exp_not:n { , \q_recursion_tail , \q_recursion_stop }
+ #1 \exp_not:n { , \q_@@_recursion_tail , \q_@@_recursion_stop }
}
}
\cs_new:Npn \@@_count:n #1 { + 1 }
\cs_new:Npx \@@_count:w #1 ,
{
- \exp_not:n { \exp_args:Nf \quark_if_recursion_tail_stop:n } {#1}
+ \exp_not:n { \exp_args:Nf \@@_if_recursion_tail_stop:n } {#1}
\exp_not:N \tl_if_blank:nF {#1} { + 1 }
\exp_not:N \@@_count:w \c_space_tl
}
@@ -1801,15 +1836,15 @@
% quarks), 5: the rest of the comma list, 6: a \meta{continuation}
% function (\texttt{use_ii} or \texttt{use_iii} with its
% \meta{separator} argument), 7: junk, and 8: the temporary result,
-% which is built in a brace group following \cs{q_stop}. The
+% which is built in a brace group following \cs{q_@@_stop}. The
% \meta{separator} and the first of the three items are placed in the
% result, then we use the \meta{continuation}, placing the remaining
% two items after it. When we begin this loop, the three items really
-% belong to the comma list, the first \cs{q_mark} is taken as a
+% belong to the comma list, the first \cs{q_@@_mark} is taken as a
% delimiter to the \texttt{use_ii} function, and the continuation is
% \texttt{use_ii} itself. When we reach the last two items of the
-% original token list, \cs{q_mark} is taken as a third item, and now
-% the second \cs{q_mark} serves as a delimiter to \texttt{use_ii},
+% original token list, \cs{q_@@_mark} is taken as a third item, and now
+% the second \cs{q_@@_mark} serves as a delimiter to \texttt{use_ii},
% switching to the other \meta{continuation}, \texttt{use_iii}, which
% uses the \meta{separator between final two}.
% \begin{macrocode}
@@ -1826,9 +1861,9 @@
{
\exp_after:wN \@@_use:nwwwwnwn
\exp_after:wN { \exp_after:wN } #1 ,
- \q_mark , { \@@_use:nwwwwnwn {#3} }
- \q_mark , { \@@_use:nwwn {#4} }
- \q_stop { }
+ \s_@@_mark , { \@@_use:nwwwwnwn {#3} }
+ \s_@@_mark , { \@@_use:nwwn {#4} }
+ \s_@@_stop { }
}
}
{
@@ -1839,9 +1874,9 @@
\cs_generate_variant:Nn \clist_use:Nnnn { c }
\cs_new:Npn \@@_use:wwn #1 , #2 , #3 { \exp_not:n { #1 #3 #2 } }
\cs_new:Npn \@@_use:nwwwwnwn
- #1#2 , #3 , #4 , #5 \q_mark , #6#7 \q_stop #8
- { #6 {#3} , {#4} , #5 \q_mark , {#6} #7 \q_stop { #8 #1 #2 } }
-\cs_new:Npn \@@_use:nwwn #1#2 , #3 \q_stop #4
+ #1#2 , #3 , #4 , #5 \s_@@_mark , #6#7 \s_@@_stop #8
+ { #6 {#3} , {#4} , #5 \s_@@_mark , {#6} #7 \s_@@_stop { #8 #1 #2 } }
+\cs_new:Npn \@@_use:nwwn #1#2 , #3 \s_@@_stop #4
{ \exp_not:n { #4 #1 #2 } }
\cs_new:Npn \clist_use:Nn #1#2
{ \clist_use:Nnnn #1 {#2} {#2} {#2} }
@@ -1877,21 +1912,21 @@
\int_compare:nNnTF {#2} < 0
{
\int_compare:nNnTF {#2} < { - #1 }
- { \use_none_delimit_by_q_stop:w }
+ { \@@_use_none_delimit_by_s_stop:w }
{ \exp_args:Nf #4 { \int_eval:n { #2 + 1 + #1 } } }
}
{
\int_compare:nNnTF {#2} > {#1}
- { \use_none_delimit_by_q_stop:w }
+ { \@@_use_none_delimit_by_s_stop:w }
{ #4 {#2} }
}
- { } , #3 , \q_stop
+ { } , #3 , \s_@@_stop
}
\cs_generate_variant:Nn \@@_item:nnnN { ffo, ff }
\cs_new:Npn \@@_item_N_loop:nw #1 #2,
{
\int_compare:nNnTF {#1} = 0
- { \use_i_delimit_by_q_stop:nw { \exp_not:n {#2} } }
+ { \@@_use_i_delimit_by_s_stop:nw { \exp_not:n {#2} } }
{ \exp_args:Nf \@@_item_N_loop:nw { \int_eval:n { #1 - 1 } } }
}
\cs_generate_variant:Nn \clist_item:Nn { c }
@@ -1936,7 +1971,7 @@
}
}
}
-\cs_new:Npn \@@_item_n_end:n #1 #2 \q_stop
+\cs_new:Npn \@@_item_n_end:n #1 #2 \s_@@_stop
{ \tl_trim_spaces_apply:nN {#1} \@@_item_n_strip:n }
\cs_new:Npn \@@_item_n_strip:n #1 { \@@_item_n_strip:w #1 , }
\cs_new:Npn \@@_item_n_strip:w #1 , { \exp_not:n {#1} }
@@ -2023,7 +2058,7 @@
% \end{variable}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
index 6824a83a2d3..ae2e660caa5 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
@@ -2,7 +2,7 @@
%
%% File: l3coffins.dtx
%
-% Copyright (C) 2010-2020 The LaTeX3 Project
+% Copyright (C) 2010-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -408,7 +408,7 @@
% \section{\pkg{l3coffins} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -667,6 +667,7 @@
% \vcoffin_gset:Nnn, \vcoffin_gset:cnn
% }
% \begin{macro}{\@@_set_vertical:NnnNN}
+% \begin{macro}{\@@_set_vertical_aux:}
% Setting vertical coffins is more complex. First, the material is
% typeset with a given width. The default handles and poles are set as
% for a horizontal coffin, before finding the top baseline using a
@@ -694,10 +695,7 @@
#4 #1
{
\dim_set:Nn \tex_hsize:D {#2}
-%<*package>
- \dim_set_eq:NN \linewidth \tex_hsize:D
- \dim_set_eq:NN \columnwidth \tex_hsize:D
-%</package>
+ \@@_set_vertical_aux:
#3
}
#5 #1
@@ -715,9 +713,20 @@
\box_clear:N \l_@@_internal_box
}
}
+\cs_new_protected:Npx \@@_set_vertical_aux:
+ {
+ \bool_lazy_and:nnT
+ { \cs_if_exist_p:N \fmtname }
+ { \str_if_eq_p:Vn \fmtname { LaTeX2e } }
+ {
+ \dim_set_eq:NN \exp_not:N \linewidth \tex_hsize:D
+ \dim_set_eq:NN \exp_not:N \columnwidth \tex_hsize:D
+ }
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}
% {\hcoffin_set:Nw, \hcoffin_set:cw, \hcoffin_gset:Nw, \hcoffin_gset:cw}
@@ -783,10 +792,7 @@
{
#3 #1
\dim_set:Nn \tex_hsize:D {#2}
-%<*package>
- \dim_set_eq:NN \linewidth \tex_hsize:D
- \dim_set_eq:NN \columnwidth \tex_hsize:D
-%</package>
+ \@@_set_vertical_aux:
\cs_set_protected:Npn #4
{
#5
@@ -1406,10 +1412,8 @@
% \begin{macrocode}
\hbox_set:Nn \l_@@_internal_box
{
- \tex_kern:D
- \dim_eval:n
+ \__kernel_kern:n
{ \l_@@_bounding_shift_dim - \l_@@_left_corner_dim }
- \exp_stop_f:
\box_move_down:nn { \l_@@_bottom_corner_dim }
{ \box_use:N #1 }
}
@@ -1864,12 +1868,12 @@
\hbox_set:Nn \l_@@_aligned_coffin
{
\dim_compare:nNnT { \l_@@_offset_x_dim } < \c_zero_dim
- { \tex_kern:D -\l_@@_offset_x_dim }
+ { \__kernel_kern:n { -\l_@@_offset_x_dim } }
\hbox_unpack:N \l_@@_aligned_coffin
\dim_set:Nn \l_@@_internal_dim
{ \l_@@_offset_x_dim - \box_wd:N #1 + \box_wd:N #4 }
\dim_compare:nNnT \l_@@_internal_dim < \c_zero_dim
- { \tex_kern:D -\l_@@_internal_dim }
+ { \__kernel_kern:n { -\l_@@_internal_dim } }
}
% \end{macrocode}
% The coffin structure is reset, and the corners are cleared: only
@@ -1995,8 +1999,8 @@
\hbox_set:Nn \l_@@_aligned_internal_coffin
{
\box_use:N #1
- \tex_kern:D -\box_wd:N #1
- \tex_kern:D \l_@@_offset_x_dim
+ \__kernel_kern:n { -\box_wd:N #1 }
+ \__kernel_kern:n { \l_@@_offset_x_dim }
\box_move_up:nn { \l_@@_offset_y_dim } { \box_use:N #4 }
}
\coffin_set_eq:NN #9 \l_@@_aligned_internal_coffin
@@ -2232,21 +2236,25 @@
% Stores the settings used to print coffin data: this keeps things
% flexible.
% \begin{macrocode}
-\tl_new:N \l_@@_display_font_tl
-%<*initex>
-\tl_set:Nn \l_@@_display_font_tl { } % TODO
-%</initex>
-%<*package>
-\tl_set:Nn \l_@@_display_font_tl { \sffamily \tiny }
-%</package>
+\tl_new:N \l_@@_display_font_tl
+\bool_lazy_and:nnT
+ { \cs_if_exist_p:N \fmtname }
+ { \str_if_eq_p:Vn \fmtname { LaTeX2e } }
+ {
+ \tl_set:Nn \l_@@_display_font_tl
+ { \sffamily \tiny }
+ }
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\@@_color:n}
-% Calls \tn{color}, and otherwise does nothing if \tn{color} is not defined.
+% \begin{macro}{\@@_rule:nn}
+% Abstract out creation of rules here until there is a higher-level interface.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_color:n #1
- { \cs_if_exist:NT \color { \color {#1} } }
+\cs_new_protected:Npn \@@_rule:nn #1#2
+ {
+ \mode_leave_vertical:
+ \hbox:n { \tex_vrule:D width #1 height #2 \scan_stop: }
+ }
% \end{macrocode}
% \end{macro}
%
@@ -2262,24 +2270,14 @@
{
\hcoffin_set:Nn \l_@@_display_pole_coffin
{
-%<*initex>
- \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: } % TODO
-%</initex>
-%<*package>
- \@@_color:n {#4}
- \rule { 1pt } { 1pt }
-%</package>
+ \color_select:n {#4}
+ \@@_rule:nn { 1pt } { 1pt }
}
\@@_attach_mark:NnnNnnnn #1 {#2} {#3}
\l_@@_display_pole_coffin { hc } { vc } { 0pt } { 0pt }
\hcoffin_set:Nn \l_@@_display_coord_coffin
{
-%<*initex>
- % TODO
-%</initex>
-%<*package>
- \@@_color:n {#4}
-%</package>
+ \color_select:n {#4}
\l_@@_display_font_tl
( \tl_to_str:n { #2 , #3 } )
}
@@ -2331,13 +2329,8 @@
{
\hcoffin_set:Nn \l_@@_display_pole_coffin
{
-%<*initex>
- \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: } % TODO
-%</initex>
-%<*package>
- \@@_color:n {#2}
- \rule { 1pt } { 1pt }
-%</package>
+ \color_select:n {#2}
+ \@@_rule:nn { 1pt } { 1pt }
}
\prop_set_eq:Nc \l_@@_display_poles_prop
{ coffin ~ \@@_to_value:N #1 ~ poles }
@@ -2377,12 +2370,7 @@
{ 0pt } { 0pt }
\hcoffin_set:Nn \l_@@_display_coord_coffin
{
-%<*initex>
- % TODO
-%</initex>
-%<*package>
- \@@_color:n {#6}
-%</package>
+ \color_select:n {#6}
\l_@@_display_font_tl
( \tl_to_str:n { #1 , ##1 } )
}
@@ -2437,8 +2425,8 @@
\hbox_set:Nn \l_@@_aligned_coffin
{
\box_use:N \l_@@_display_coffin
- \tex_kern:D -\box_wd:N \l_@@_display_coffin
- \tex_kern:D \l_@@_offset_x_dim
+ \__kernel_kern:n { -\box_wd:N \l_@@_display_coffin }
+ \__kernel_kern:n { \l_@@_offset_x_dim }
\box_move_up:nn { \l_@@_offset_y_dim } { \box_use:N #1 }
}
\box_set_ht:Nn \l_@@_aligned_coffin
@@ -2520,7 +2508,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
deleted file mode 100644
index b5c9e391895..00000000000
--- a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx
+++ /dev/null
@@ -1,192 +0,0 @@
-% \iffalse meta-comment
-%
-%% File: l3color-base.dtx
-%
-% Copyright (C) 2011,2012,2014,2016-2020 The LaTeX3 Project
-%
-% It may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this
-% license or (at your option) any later version. The latest version
-% of this license is in the file
-%
-% https://www.latex-project.org/lppl.txt
-%
-% This file is part of the "l3kernel bundle" (The Work in LPPL)
-% and all files in that bundle must be distributed together.
-%
-% -----------------------------------------------------------------------
-%
-% The development version of the bundle can be found at
-%
-% https://github.com/latex3/latex3
-%
-% for those people who are interested.
-%
-%<*driver>
-\documentclass[full,kernel]{l3doc}
-\begin{document}
- \DocInput{\jobname.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \title{^^A
-% The \textsf{l3color-base} package\\ Color support^^A
-% }
-%
-% \author{^^A
-% The \LaTeX3 Project\thanks
-% {^^A
-% E-mail:
-% \href{mailto:latex-team@latex-project.org}
-% {latex-team@latex-project.org}^^A
-% }^^A
-% }
-%
-% \date{Released 2020-03-06}
-%
-% \maketitle
-%
-% \begin{documentation}
-%
-% This module provides support for color in \LaTeX3{}. At present, the
-% material here is mainly intended to support a small number of low-level
-% requirements in other \pkg{l3kernel} modules.
-%
-% \section{Color in boxes}
-%
-% Controlling the color of text in boxes requires a small number of control
-% functions, so that the boxed material uses the color at the point where
-% it is set, rather than where it is used.
-%
-% \begin{function}[added = 2011-09-03]{\color_group_begin:, \color_group_end:}
-% \begin{syntax}
-% \cs{color_group_begin:}
-% \ldots
-% \cs{color_group_end:}
-% \end{syntax}
-% Creates a color group: one used to \enquote{trap} color settings.
-% \end{function}
-%
-% \begin{function}[added = 2011-09-03]{\color_ensure_current:}
-% \begin{syntax}
-% \cs{color_ensure_current:}
-% \end{syntax}
-% Ensures that material inside a box uses the foreground color
-% at the point where the box is set, rather than that in force when the
-% box is used. This function should usually be used within a
-% \cs{color_group_begin:} \ldots \cs{color_group_end:} group.
-% \end{function}
-%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3color-base} Implementation}
-%
-% \begin{macrocode}
-%<*initex|package>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=color>
-% \end{macrocode}
-%
-% \begin{variable}
-% {\l_@@_current_tl}
-% The color currently active for foreground (text, \emph{etc.}) material.
-% This is stored in the form of a color model followed by one or more
-% values. There are four pre-defined models, three of which take numerical
-% values in the range $[0,1]$:
-% \begin{itemize}
-% \item \texttt{gray \meta{gray}} Grayscale color with the \meta{gray}
-% value running from $0$ (fully black) to $1$ (fully white)
-% \item \texttt{cmyk \meta{cyan} \meta{magenta} \meta{yellow} \meta{black}}
-% \item \texttt{rgb \meta{red} \meta{green} \meta{blue}}
-% \end{itemize}
-% Notice that the value are separated by spaces. There is a fourth pre-defined
-% model using a string value and a numerical one:
-% \begin{itemize}
-% \item \texttt{spot \meta{name} \meta{tint}} A pre-defined spot color,
-% where the \meta{name} should be a pre-defined string color name and the
-% \meta{tint} should be in the range $[0,1]$.
-% \end{itemize}
-%
-% Additional models may be created to allow mixing of spot colors. The
-% number of data entries these require will depend on the number of
-% colors to be mixed.
-% \begin{texnote}
-% The content of \cs{l_@@_current_tl} is space-separated as
-% this allows it to be used directly in specials in many common cases.
-% This internal representation is close to that used by the \texttt{dvips}
-% program.
-% \end{texnote}
-% \end{variable}
-%
-% \begin{macro}{\color_group_begin:, \color_group_end:}
-% Grouping for color is the same as using the basic \cs{group_begin:}
-% and \cs{group_end:} functions. However, for semantic reasons, they
-% are renamed here.
-% \begin{macrocode}
-\cs_new_eq:NN \color_group_begin: \group_begin:
-\cs_new_eq:NN \color_group_end: \group_end:
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\color_ensure_current:}
-% A driver-independent wrapper for setting the foreground color to the
-% current color \enquote{now}.
-% \begin{macrocode}
-\cs_new_protected:Npn \color_ensure_current:
- {
-%<*package>
- \@@_backend_pickup:N \l_@@_current_tl
-%</package>
- \@@_select:V \l_@@_current_tl
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_select:n, \@@_select:V}
-% \begin{macro}{\@@_select:w}
-% \begin{macro}
-% {\@@_select_cmyk:w, \@@_select_gray:w, \@@_select_rgb:w, \@@_select_spot:w}
-% Take an internal color specification and pass it to the driver. This code
-% is needed to ensure the current color but will also be used by the
-% higher-level experimental material.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_select:n #1
- { \@@_select:w #1 \q_stop }
-\cs_generate_variant:Nn \@@_select:n { V }
-\cs_new_protected:Npn \@@_select:w #1 ~ #2 \q_stop
- { \use:c { @@_select_ #1 :w } #2 \q_stop }
-\cs_new_protected:Npn \@@_select_cmyk:w #1 ~ #2 ~ #3 ~ #4 \q_stop
- { \@@_backend_cmyk:nnnn {#1} {#2} {#3} {#4} }
-\cs_new_protected:Npn \@@_select_gray:w #1 \q_stop
- { \@@_backend_gray:n {#1} }
-\cs_new_protected:Npn \@@_select_rgb:w #1 ~ #2 ~ #3 \q_stop
- { \@@_backend_rgb:nnn {#1} {#2} {#3} }
-\cs_new_protected:Npn \@@_select_spot:w #1 ~ #2 \q_stop
- { \@@_backend_spot:nn {#1} {#2} }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{variable}{\l_@@_current_tl}
-% As the setting data is used only
-% for specials, and those are always space-separated, it makes most sense to
-% hold the internal information in that form.
-% \begin{macrocode}
-\tl_new:N \l_@@_current_tl
-\tl_set:Nn \l_@@_current_tl { gray~0 }
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macrocode}
-%</initex|package>
-% \end{macrocode}
-%
-% \end{implementation}
-%
-% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
new file mode 100644
index 00000000000..b3fd3cfa7a3
--- /dev/null
+++ b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
@@ -0,0 +1,2655 @@
+% \iffalse meta-comment
+%
+%% File: l3color.dtx
+%
+% Copyright (C) 2017-2021 The LaTeX Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full]{l3doc}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% The \textsf{l3color} package\\ Color support^^A
+% }
+%
+% \author{^^A
+% The \LaTeX{} Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released 2021-02-18}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% \section{Color in boxes}
+%
+% Controlling the color of text in boxes requires a small number of control
+% functions, so that the boxed material uses the color at the point where
+% it is set, rather than where it is used.
+%
+% \begin{function}[added = 2011-09-03]{\color_group_begin:, \color_group_end:}
+% \begin{syntax}
+% \cs{color_group_begin:}
+% \ldots
+% \cs{color_group_end:}
+% \end{syntax}
+% Creates a color group: one used to \enquote{trap} color settings.
+% This grouping is built in to for example \cs{hbox_set:Nn}.
+% \end{function}
+%
+% \begin{function}[added = 2011-09-03]{\color_ensure_current:}
+% \begin{syntax}
+% \cs{color_ensure_current:}
+% \end{syntax}
+% Ensures that material inside a box uses the foreground color
+% at the point where the box is set, rather than that in force when the
+% box is used. This function should usually be used within a
+% \cs{color_group_begin:} \ldots \cs{color_group_end:} group.
+% \end{function}
+%
+% \section{Color models}
+%
+% A color \emph{model} is a way to represent sets of colors. Different models
+% are particularly suitable for different output methods, \emph{e.g.}~screen
+% or print. Parameter-based models can describe a very large number of unique
+% colors, and have a varying number of \emph{axes} which define a color
+% space. In contrast, various proprietary models are available which define
+% \emph{spot} colors (more formally separations).
+%
+% Core models are used to pass color information to output; these are
+% \enquote{native} to \pkg{l3color}. Core models use real numbers in the range
+% $[0,1]$ to represent values. The core models supported here are
+% \begin{itemize}
+% \item \texttt{gray} Grayscale color, with a single axis running from
+% $0$ (fully black) to $1$ (fully white)
+% \item \texttt{rgb} Red-green-blue color, with three axes, one for each of
+% the components
+% \item \texttt{cmyk} Cyan-magenta-yellow-black color, with four axes, one for
+% each of the components
+% \end{itemize}
+% There are also interface models: these are convenient for users but have
+% to be manipulated before storing/passing to the backend. Interface models
+% are primarily integer-based: see below for more detail. The supported
+% interface models are
+% \begin{itemize}
+% \item \texttt{Gray} Grayscale color, with a single axis running from
+% $0$ (fully black) to $15$ (fully white)
+% \item \texttt{hsb} Hue-saturation-brightness color, with three axes,all
+% real values in the range $[0,1]$ for hue saturation and brightness
+% \item \texttt{Hsb} Hue-saturation-brightness color, with three axes, integer
+% in the range $[0,360]$ for hue, real values in the range $[0,1]$ for
+% saturation and brightness
+% \item \texttt{HSB} Hue-saturation-brightness color, with three axes, integers
+% in the range $[0,240]$ for hue, saturation and brightness
+% \item \texttt{HTML} HTML format representation of RGB color given as a
+% single six-digit hexadecimal number
+% \item \texttt{RGB} Red-green-blue color, with three axes, one for each of
+% the components, values as integers from $0$ to $255$
+% \item \texttt{wave} Light wavelength, a real number in the range
+% $380$ to $780$ (nanometres)
+% \end{itemize}
+% All interface models are internally stored as |rgb|.
+%
+% To allow parsing of data from \pkg{xcolor}, any leading model up the first
+% \texttt{:} will be discarded; the approach of selecting an internal form
+% for data is \emph{not} used in \pkg{l3color}.
+%
+% Additional models may be created to allow mixing of separation colors
+% with each other or with those from other models. See
+% Section~\ref{l3color:sec:new-models} for more detail of color support
+% for additional models.
+%
+% When color is selected by model, the \meta{values} given are specified as
+% a comma-separated list. The length of the list will therefore be determined
+% by the detail of the model involved.
+%
+% Color models (and interconversion) are complex, and more details are given
+% in the manual to the \LaTeXe{} \pkg{xcolor} package and in the
+% \emph{PostScript Language Reference Manual}, published by Addison--Wesley.
+%
+% \section{Color expressions}
+%
+% In addition to allowing specification of color by model and values,
+% \pkg{l3color} also supports color expressions. These are created
+% by combining one or more color names, with the amount of each specified
+% as a percentage. The latter is given between |!| symbols in the expression.
+% Thus for example
+% \begin{verbatim}
+% red!50!green
+% \end{verbatim}
+% is a mixture of $50\,\%$ red and $50\,\%$ green. A trailing percentage is
+% interpreted as implicitly followed by |white|, and so
+% \begin{verbatim}
+% red!25
+% \end{verbatim}
+% specifies $25\,\%$ red mixed with $75\,\%$ white.
+%
+% Where the models for the mixed colors are different, the model of the first
+% color is used. Thus
+% \begin{verbatim}
+% red!50!cyan
+% \end{verbatim}
+% will result in a color specification using the |rgb| model, made up of
+% $50\,\%$ red and $50\,\%$ of cyan \emph{expressed in \texttt{rgb}}. As color
+% model interconversion is not exact.
+%
+% The one exception to the above is where the first model in an expression is
+% |gray|. In this case, the order of mixing is \enquote{swapped} internally, so
+% that for example
+% \begin{verbatim}
+% black!50!red
+% \end{verbatim}
+% has the same result as
+% \begin{verbatim}
+% red!50!black
+% \end{verbatim}
+% (the predefined colors |black| and |white| use the |gray| model).
+%
+% Where more than two colors are mixed in an expression, evaluation takes place
+% in a stepwise fashion. Thus in
+% \begin{verbatim}
+% cyan!50!magenta!10!yellow
+% \end{verbatim}
+% the sub-expression
+% \begin{verbatim}
+% cyan!50!magenta
+% \end{verbatim}
+% is first evaluated to give an intermediate color specification, before
+% the second step
+% \begin{verbatim}
+% <intermediate>!10!yellow
+% \end{verbatim}
+% where |<intermediate>| represents this transitory calculated value.
+%
+% Within a color expression, |.| may be used to represent the color active
+% for typesetting (the current color). This allows for example
+% \begin{verbatim}
+% .!50
+% \end{verbatim}
+% to mean a mixture of $50\,\%$ of current color with white.
+%
+% (Color expressions supported here are a subset of those provided by
+% the \LaTeXe{} \pkg{xcolor} package. At present, only such features as are
+% clearly useful have been added here.)
+%
+% \section{Named colors}
+%
+% Color names are stored in a single namespace, which makes them accessible
+% as part of color expressions. Whilst they are not reserved in a technical
+% sense, the names |black|, |white|, |red|, |green|, |blue|, |cyan|, |magenta|
+% and |yellow| have special meaning and should not be redefined. Color names
+% should be made up of letters, numbers and spaces only: other characters are
+% reserved for use in color expressions. In particular, |.| represents the
+% current color at the start of a color expression.
+%
+% \begin{function}{\color_set:nn}
+% \begin{syntax}
+% \cs{color_set:nn} \Arg{name} \Arg{color expression}
+% \end{syntax}
+% Evaluates the \meta{color expression} and stores the resulting
+% color specification as the \meta{name}.
+% \end{function}
+%
+% \begin{function}{\color_set:nnn}
+% \begin{syntax}
+% \cs{color_set:nnn} \Arg{name} \Arg{model(s)} \Arg{value(s)}
+% \end{syntax}
+% Stores the color specification equivalent to the \meta{model(s)} and
+% \meta{values} as the \meta{name}.
+% \end{function}
+%
+% \begin{function}{\color_set_eq:nn}
+% \begin{syntax}
+% \cs{color_set_eq:nn} \Arg{name1} \Arg{name2}
+% \end{syntax}
+% Copies the color specification in \meta{name2} to \meta{name1}. The
+% special name |.| may be used to represent the current color, allowing
+% it to be saved to a name.
+% \end{function}
+%
+% \begin{function}{\color_show:n}
+% \begin{syntax}
+% \cs{color_show:n} \Arg{name}
+% \end{syntax}
+% Displays the color specification stored in the \meta{name} on the
+% terminal.
+% \end{function}
+%
+% \section{Selecting colors}
+%
+% General selection of color is safe when split across pages: a stack is
+% used to ensure that the correct color is re-selected on the new page.
+%
+% \begin{function}{\color_select:n}
+% \begin{syntax}
+% \cs{color_select:n} \Arg{color expression}
+% \end{syntax}
+% Parses the \meta{color expression} and then activates the resulting
+% color specification for typeset material.
+% \end{function}
+%
+% \begin{function}{\color_select:nn}
+% \begin{syntax}
+% \cs{color_select:nn} \Arg{model(s)} \Arg{value(s)}
+% \end{syntax}
+% Activates the color specification equivalent to the \meta{model(s)} and
+% \meta{value(s)} for typeset material.
+% \end{function}
+%
+% \begin{variable}{\l_color_fixed_model_tl}
+% When this is set to a non-empty value, colors will be converted to
+% the specified model when they are selected. Note that included images
+% and similar are not influenced by this setting.
+% \end{variable}
+%
+% \section{Colors for fills and strokes}
+%
+% Colors for drawing operations and so forth are split into strokes and fills
+% (the latter may also be referred to as non-stroke color). The fill color is
+% used for text under normal circumstances. Depending on the backend, stroke
+% color may use a \emph{stack}, in which case it exhibits the same page breaking
+% behavior as general color. However, \texttt{dvips}/\texttt{dvisvgm} do not
+% support this, and so color will need to be contained within a scope, such
+% as \cs{draw_begin:}/\cs{draw_end:}.
+%
+% Note that the \emph{current color} is the fill color, as this is used for
+% running text.
+%
+% \begin{function}{\color_fill:n, \color_stroke:n}
+% \begin{syntax}
+% \cs{color_fill:n} \Arg{color expression}
+% \end{syntax}
+% Parses the \meta{color expression} and then activates the resulting
+% color specification for filling or stroking.
+% \end{function}
+%
+% \begin{function}{\color_fill:nn, \color_stroke:nn}
+% \begin{syntax}
+% \cs{color_fill:nn} \Arg{model(s)} \Arg{value(s)}
+% \end{syntax}
+% Activates the color specification equivalent to the \meta{model(s)} and
+% \meta{value(s)} for filling or stroking.
+% \end{function}
+%
+% \begin{variable}{color.sc}
+% When using \texttt{dvips}, this PostScript variables hold the stroke color.
+% \end{variable}
+%
+% \section{Multiple color models}
+%
+% When selecting or setting a color with an explicit model, it is possible
+% to give values for more than one model at one time. This is particularly
+% useful where automated conversion between models does not give the desired
+% outcome. To do this, the list of models and list of values are both subdivided
+% using |/| characters (as for the similar function in \pkg{xcolor}). For
+% example, to save a color with explicit |cmyk| and |rgb| values, one could
+% use
+% \begin{verbatim}
+% \color_set:nnn { foo } { cmyk / rgb }
+% { 0.1 , 0.2 , 0.3 , 0.4 / 0.1, 0.2 , 0.3 }
+% \end{verbatim}
+% The manually-specified conversion will be used in preference to automated
+% calculation whenever the model(s) listed are used: both in expressions and
+% when a fixed model is active.
+%
+% Similarly, the same syntax can be applied to directly selecting a color.
+% \begin{verbatim}
+% \color_select:nn { cmyk / rgb }
+% { 0.1 , 0.2 , 0.3 , 0.4 / 0.1, 0.2 , 0.3 }
+% \end{verbatim}
+% Again, this list is used when a fixed model is active: the first entry is used
+% unless there is a fixed model matching one of the other entries.
+%
+% \section{Exporting color specifications}
+%
+% The major use of color expressions is in setting typesetting output, but there
+% are other places in which some form of color information is required. These
+% may need data in a different format or using a different model to the internal
+% representation. Thus a set of functions are available to export colors in
+% different formats.
+%
+% Valid export targets are
+% \begin{itemize}
+% \item \texttt{backend} Two brace groups: the first containing the
+% model, the second containing space-separated values appropriate
+% for the model; this is the format required by backend functions
+% of \pkg{expl3}
+% \item \texttt{HTML} Uppercase two-digit hexadecimal values, expressing
+% a red-green-blue color; the digits are \emph{not} separated
+% \item \texttt{space-sep-cmyk} Space-separated cyan-magenta-yellow-black
+% values
+% \item \texttt{space-sep-rgb} Space-separated red-green-blue values
+% suitable for use as a PDF annotation color
+% \end{itemize}
+%
+% \begin{function}{\color_export:nnN}
+% \begin{syntax}
+% \cs{color_export:nnN} \Arg{color expression} \Arg{format} \Arg{tl}
+% \end{syntax}
+% Parses the \meta{color expression} as described earlier,
+% then converts to the \meta{format} specified and assigns the data to the
+% \meta{tl}.
+% \end{function}
+%
+% \begin{function}{\color_export:nnnN}
+% \begin{syntax}
+% \cs{color_export:nnnN} \Arg{model} \Arg{value(s)} \Arg{format} \Arg{tl}
+% \end{syntax}
+% Expresses the combination of \meta{model} and \meta{value(s)} in an
+% internal representation, then converts to the \meta{format} specified and
+% assigns the data to the \meta{tl}.
+% \end{function}
+%
+% \section{Creating new color models}
+% \label{l3color:sec:new-models}
+%
+% Additional color models are required to support specialist workflows, for
+% example those involving separations (see
+% \url{https://helpx.adobe.com/indesign/using/spot-process-colors.html}
+% for details of the use of separations in print). Color models may be split
+% into families; for the standard device-based color models (\texttt{DeviceCMYK},
+% \texttt{DeviceRGB}, \texttt{DeviceGray}), these are synonymous. This
+% is not generally the case: see the PDF reference for more details. (Note that
+% \pkg{l3color} uses the shorter names \texttt{cmyk}, etc.)
+%
+% \begin{function}{\color_model_new:nnn}
+% \begin{syntax}
+% \cs{color_model_new:nnn} \Arg{model} \Arg{family} \Arg{params}
+% \end{syntax}
+% Creates a new \meta{model} which is derived from the color model \meta{family}.
+% The latter should be one of
+% \begin{itemize}
+% \item \texttt{DeviceN}
+% \item \texttt{Separation}
+% \end{itemize}
+% (The \meta{family} may be given in mixed case as-in the PDF reference:
+% internally, case of these strings is folded.)
+% Depending on the \meta{family}, one or more \meta{params} are mandatory or
+% optional.
+% \end{function}
+%
+% For a \texttt{Separation} space, there are three \emph{compulsory} keys.
+% \begin{itemize}
+% \item \texttt{name} The name of the Separation, for example the formal
+% name of a spot color ink. Such a \meta{name} may contain spaces, etc.,
+% which are not permitted in the \meta{model}.
+% \item \texttt{alternative-model} An alternative device colorspace, one of
+% \texttt{cmyk}, \texttt{rgb}, \texttt{gray} or \texttt{CIELAB}. The three
+% parameter-based models work as described above; see below for
+% details of CIELAB colors.
+% \item \texttt{alternative-values} A comma-separated list of values
+% appropriate to the \texttt{alternative-model}. This information is used by
+% the PDF application if the \texttt{Separation} is not available.
+% \end{itemize}
+%
+% CIELAB color separations are created using the
+% \texttt{alternative-model = CIELAB} setting. These colors must also have an
+% \texttt{illuminant} key, one of \texttt{a}, \texttt{c}, \texttt{e},
+% \texttt{d50}, \texttt{d55}, \texttt{d65} or \texttt{d75}. The
+% \texttt{alternative-values} in this case are the three parameters $L*$, $a*$
+% and $b*$ of the CIELAB model. Full details of this device-independent color
+% approach are given in the documentation to the \pkg{colorspace} package.
+%
+% CIELAB colors \emph{cannot} be converted into other device-dependent color
+% spaces, and as such, mixing can only occur if colors set up using the CIELAB
+% model are also given with an alternative parameter-based model. If that is
+% not the case, \pkg{l3color} will fallback to using black as the colorant in
+% any mixing.
+%
+% For a \texttt{DeviceN} space, there is one \emph{compulsory} key.
+% \begin{itemize}
+% \item \texttt{names} The names of the components of the \texttt{DeviceN}
+% space. Each should be either the \meta{name} of a \texttt{Separation} model,
+% a process color name (\texttt{cyan}, etc.) or the special name \texttt{none}.
+% \end{itemize}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3color} Implementation}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=color>
+% \end{macrocode}
+%
+% \subsection{Basics}
+%
+% \begin{variable}
+% {\l_@@_current_tl}
+% The color currently active for foreground (text, \emph{etc.}) material.
+% This is stored in the form of a color model followed by one or more
+% values. There are four pre-defined models, three of which take numerical
+% values in the range $[0,1]$:
+% \begin{itemize}
+% \item \texttt{gray \meta{gray}} Grayscale color with the \meta{gray}
+% value running from $0$ (fully black) to $1$ (fully white)
+% \item \texttt{cmyk \meta{cyan} \meta{magenta} \meta{yellow} \meta{black}}
+% \item \texttt{rgb \meta{red} \meta{green} \meta{blue}}
+% \end{itemize}
+% Notice that the value are separated by spaces. There is a fourth pre-defined
+% model using a string value and a numerical one:
+% \begin{itemize}
+% \item \texttt{spot \meta{name} \meta{tint}} A pre-defined spot color,
+% where the \meta{name} should be a pre-defined string color name and the
+% \meta{tint} should be in the range $[0,1]$.
+% \end{itemize}
+%
+% Additional models may be created to allow mixing of spot colors. The
+% number of data entries these require will depend on the number of
+% colors to be mixed.
+% \begin{texnote}
+% The content of \cs{l_@@_current_tl} comprises two brace groups, the
+% first containing the color model and the second containing the value(s)
+% applicable in that model.
+% \end{texnote}
+% \end{variable}
+%
+% \begin{macro}{\color_group_begin:, \color_group_end:}
+% Grouping for color is the same as using the basic \cs{group_begin:}
+% and \cs{group_end:} functions. However, for semantic reasons, they
+% are renamed here.
+% \begin{macrocode}
+\cs_new_eq:NN \color_group_begin: \group_begin:
+\cs_new_eq:NN \color_group_end: \group_end:
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\color_ensure_current:}
+% A driver-independent wrapper for setting the foreground color to the
+% current color \enquote{now}.
+% \begin{macrocode}
+\cs_new_protected:Npn \color_ensure_current:
+ {
+ \@@_backend_pickup:N \l_@@_current_tl
+ \@@_select:N \l_@@_current_tl
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_select:N}
+% \begin{macro}{\@@_select:nn}
+% Take an internal color specification and pass it to the driver. This code
+% is needed to ensure the current color but will also be used by the
+% higher-level experimental material.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_select:N #1
+ { \exp_after:wN \@@_select:nn #1 }
+\cs_new_protected:Npn \@@_select:nn #1#2
+ { \use:c { @@_backend_select_ #1 :n } {#2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_current_tl}
+% The current color, with the model and
+% \begin{macrocode}
+\tl_new:N \l_@@_current_tl
+\tl_set:Nn \l_@@_current_tl { { gray } { 0 } }
+% \end{macrocode}
+% \end{variable}
+
+%
+% \subsection{Predefined color names}
+%
+% The ability to predefine colors with a name is a key part of this module and
+% means there has to be a method for storing the results. At first sight, it
+% seems natural to follow the usual \pkg{expl3} model and create a
+% \texttt{color} variable type for the process. That would then allow both
+% local and global colors, constant colors and the like. However, these names
+% need to be accessible in some form at the user level, for selection of colors
+% either simply by name or as part of a more complex expression. This does not
+% require that the full name is exposed but does require that they can be
+% looked up in a predictable way. As such, it is more useful to expose just the
+% color names as part of the interface, with the result that only local color
+% names can be created. (This is also seen for example in key creation in
+% \pkg{l3keys}.) As a result, color names are declarative (no \texttt{new}
+% functions).
+%
+% Since there is no need to manipulate colors \emph{en masse}, each is stored
+% in a two-part structure: a \texttt{prop} for the colors themselves, and a
+% \texttt{tl} for the default model for each color.
+%
+% \subsection{Setup}
+%
+% \begin{variable}{\l_@@_internal_int, \l_@@_internal_tl}
+% \begin{macrocode}
+\int_new:N \l_@@_internal_int
+\tl_new:N \l_@@_internal_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\s_@@_mark}
+% Internal scan marks. \cs{s_@@_stop} is already defined in \pkg{l3color-base}.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Utility functions}
+%
+% \begin{macro}[int, TF, EXP]{\@@_if_defined:n}
+% A simple wrapper to avoid needing to have the lookup repeated in too many
+% places.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_defined:n #1 { T, F, TF }
+ {
+ \prop_if_exist:cTF { l_@@_named_ #1 _prop }
+ \prg_return_true:
+ \prg_return_false:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_model:N, \@@_values:N}
+% Simple abstractions.
+% \begin{macrocode}
+\cs_new:Npn \@@_model:N #1 { \exp_after:wN \use_i:nn #1 }
+\cs_new:Npn \@@_values:N #1 { \exp_after:wN \use_ii:nn #1 }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_extract:nNN, \@@_extract:VNN}
+% Recover the values for the standard model for a color.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_extract:nNN #1#2#3
+ {
+ \tl_set_eq:Nc #2 { l_@@_named_ #1 _tl }
+ \prop_get:cVN { l_@@_named_ #1 _prop } #2 #3
+ }
+\cs_generate_variant:Nn \@@_extract:nNN { V }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Model conversion}
+%
+% \begin{macro}{\@@_convert:nnN, \@@_convert:VVN}
+% \begin{macro}{\@@_convert:nnnN, \@@_convert:nVnN, \@@_convert:nnVN}
+% \begin{macro}[aux, EXP]
+% {
+% \@@_convert_gray_rgb:w
+% \@@_convert_gray_cmyk:w
+% \@@_convert_cmyk_gray:w
+% \@@_convert_cmyk_rgb:w
+% \@@_convert_rgb_gray:w
+% \@@_convert_rgb_cmyk:w
+% }
+% \begin{macro}[aux, EXP]{\@@_convert_rgb_cmyk:nnnn}
+% Model conversion is carried out using standard formulae, as described in
+% the manual for \pkg{xcolor} (see also the \emph{PostScript Language
+% Reference Manual}).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_convert:nnN #1#2#3
+ { \@@_convert:nnVN {#1} {#2} #3 #3 }
+\cs_generate_variant:Nn \@@_convert:nnN { VV }
+\cs_new_protected:Npn \@@_convert:nnnN #1#2#3#4
+ {
+ \tl_set:Nx #4
+ {
+ \cs_if_exist:cTF { @@_convert_ #1 _ #2 :w }
+ { \use:c { @@_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \s_@@_stop }
+ { \use:c { c_@@_fallback_ #2 _tl } }
+ }
+ }
+\cs_generate_variant:Nn \@@_convert:nnnN { nV , nnV }
+\cs_new:Npn \@@_convert_gray_rgb:w #1 ~ #2 \s_@@_stop
+ { #1 ~ #1 ~ #1 }
+\cs_new:Npn \@@_convert_gray_cmyk:w #1 ~ #2 \s_@@_stop
+ { 0 ~ 0 ~ 0 ~ \fp_eval:n { 1 - #1 } }
+% \end{macrocode}
+% These rather odd values are based on \textsc{ntsc} television: the set are
+% used for the |cmyk| conversion.
+% \begin{macrocode}
+\cs_new:Npn \@@_convert_rgb_gray:w #1 ~ #2 ~ #3 ~ #4 \s_@@_stop
+ { \fp_eval:n { 0.3 * #1 + 0.59 * #2 + 0.11 * #3 } }
+% \end{macrocode}
+% The conversion from |rgb| to |cmyk| is the most complex: a two-step
+% procedure which requires \emph{black generation} and \emph{undercolor
+% removal} functions. The PostScript reference describes them as
+% device-dependent, but following \pkg{xcolor} we assume they are linear.
+% Moreover, as the likelihood of anyone using a non-unitary matrix here is
+% tiny, we simplify and treat those two concepts as no-ops.
+% \begin{macrocode}
+\cs_new:Npn \@@_convert_rgb_cmyk:w #1 ~ #2 ~ #3 ~ #4 \s_@@_stop
+ {
+ \exp_args:Nf \@@_convert_rgb_cmyk:nnnn
+ { \fp_eval:n { min ( 1 - #1 , 1 - #2 , 1 - #3 ) } } {#1} {#2} {#3}
+ }
+\cs_new:Npn \@@_convert_rgb_cmyk:nnnn #1#2#3#4
+ {
+ \fp_eval:n { min ( 1 , max ( 0 , 1 - #2 - #1 ) ) } \c_space_tl
+ \fp_eval:n { min ( 1 , max ( 0 , 1 - #3 - #1 ) ) } \c_space_tl
+ \fp_eval:n { min ( 1 , max ( 0 , 1 - #4 - #1 ) ) } \c_space_tl
+ #1
+ }
+\cs_new:Npn \@@_convert_cmyk_gray:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \s_@@_stop
+ { \fp_eval:n { 1 - min ( 1 , 0.3 * #1 + 0.59 * #2 + 0.11 * #3 + #4 ) } }
+\cs_new:Npn \@@_convert_cmyk_rgb:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \s_@@_stop
+ {
+ \fp_eval:n { 1 - min ( 1 , #1 + #4 ) } \c_space_tl
+ \fp_eval:n { 1 - min ( 1 , #2 + #4 ) } \c_space_tl
+ \fp_eval:n { 1 - min ( 1 , #3 + #4 ) }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Color expressions}
+%
+% \begin{variable}
+% {\l_@@_model_tl, \l_@@_value_tl, \l_@@_next_model_tl, \l_@@_next_value_tl}
+% Working space to store the color data whilst doing calculations: keeping
+% it on the stack is attractive but gets tricky (return is non-trivial).
+% \begin{macrocode}
+\tl_new:N \l_@@_model_tl
+\tl_new:N \l_@@_value_tl
+\tl_new:N \l_@@_next_model_tl
+\tl_new:N \l_@@_next_value_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_parse:nN}
+% \begin{macro}{\@@_parse_aux:nN}
+% \begin{macro}{\@@_parse_eq:Nn}
+% \begin{macro}{\@@_parse_eq:nNn}
+% \begin{macro}{\@@_parse:Nw}
+% \begin{macro}{\@@_parse_loop_init:Nnn}
+% \begin{macro}{\@@_parse_loop:w}
+% \begin{macro}{\@@_parse_loop:nn}
+% \begin{macro}{\@@_parse_gray:n, \@@_parse_std:n}
+% \begin{macro}{\@@_parse_break:w}
+% \begin{macro}{\@@_parse_end:}
+% \begin{macro}[aux, EXP]{\@@_parse_mix:Nnnn, \@@_parse_mix:NVVn}
+% \begin{macro}[aux, EXP]{\@@_parse_mix:nNnn}
+% \begin{macro}[aux, EXP]
+% {
+% \@@_parse_mix_gray:nw ,
+% \@@_parse_mix_rgb:nw ,
+% \@@_parse_mix_cmyk:nw
+% }
+% The main function for parsing color expressions removes actives but
+% otherwise expands, then starts working through the expression itself.
+% At the end, we apply the payload.
+% \begin{macrocode}
+\cs_new_protected:Npx \@@_parse:nN #1#2
+ {
+ \exp_not:N \@@_backend_pickup:N \exp_not:N \l_@@_current_tl
+ \tl_set:Nx \exp_not:c { l_@@_named_ . _tl }
+ { \exp_not:N \@@_model:N \exp_not:N \l_@@_current_tl }
+ \prop_put:NVx \exp_not:c { l_@@_named_ . _prop }
+ \exp_not:c { l_@@_named_ . _tl }
+ { \exp_not:N \@@_values:N \exp_not:N \l_@@_current_tl }
+ \exp_not:N \exp_args:Ne \exp_not:N \@@_parse_aux:nN
+ { \exp_not:N \tl_to_str:n {#1} } #2
+ }
+% \end{macrocode}
+% Before going to all of the effort of parsing an expression, these two
+% precursor functions look for a pre-defined name, either on its own or
+% with a trailing |!| (which is the same thing).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_aux:nN #1#2
+ {
+ \tl_if_exist:cTF { l_@@_named_ #1 _prop }
+ { \@@_parse_set_eq:Nn #2 {#1} }
+ { \@@_parse:Nw #2#1 ! \s_@@_stop }
+ \@@_check_model:N #2
+ }
+\cs_new_protected:Npn \@@_parse_set_eq:Nn #1#2
+ {
+ \tl_if_empty:NTF \l_color_fixed_model_tl
+ { \exp_args:Nv \@@_parse_set_eq:nNn { l_@@_named_ #2 _tl } }
+ { \exp_args:NV \@@_parse_set_eq:nNn \l_color_fixed_model_tl }
+ #1 {#2}
+ }
+% \end{macrocode}
+% Here, we have to allow for the case where there is a fixed model:
+% that can't be swept up by generic conversion as we are dealing with a
+% named color.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_set_eq:nNn #1#2#3
+ {
+ \prop_get:cnNTF
+ { l_@@_named_ #3 _prop } {#1}
+ \l_@@_value_tl
+ { \tl_set:Nx #2 { {#1} { \l_@@_value_tl } } }
+ {
+ \tl_set_eq:Nc \l_@@_model_tl { l_@@_named_ #3 _tl }
+ \prop_get:cVN { l_@@_named_ #3 _prop } \l_@@_model_tl
+ \l_@@_value_tl
+ \@@_convert:nnN
+ \l_@@_model_tl {#1} \l_@@_value_tl
+ \tl_set:Nx #2
+ {
+ {#1}
+ { \l_@@_value_tl }
+ }
+ }
+ }
+\cs_new_protected:Npn \@@_parse:Nw #1#2 ! #3 \s_@@_stop
+ {
+ \@@_if_defined:nTF {#2}
+ {
+ \tl_if_blank:nTF {#3}
+ { \@@_parse_set_eq:Nn #1 {#2} }
+ { \@@_parse_loop_init:Nnn #1 {#2} {#3} }
+ }
+ {
+ \__kernel_msg_error:nnn { color } { unknown-color } {#2}
+ \tl_set:Nn \l_@@_current_tl { { gray } { 0 } }
+ }
+ }
+% \end{macrocode}
+% Once we establish that a full parse is needed, the next job is to get the
+% detail of the first color. That will determine the model we use for the
+% calculation: splitting here makes checking that a bit easier.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_loop_init:Nnn #1#2#3
+ {
+ \group_begin:
+ \@@_extract:nNN {#2} \l_@@_model_tl \l_@@_value_tl
+ \@@_parse_loop:w #3 ! ! ! ! \s_@@_stop
+ \tl_set:Nx \l_@@_internal_tl
+ { { \l_@@_model_tl } { \l_@@_value_tl } }
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn #1 \l_@@_internal_tl
+ }
+% \end{macrocode}
+% This is the loop proper: there can be an open-ended set of colors to parse,
+% separated by |!| tokens. There are a few cases to look out for. At the end
+% of the expression and with we find a mix of $100$ then we simply skip the
+% next color entirely (we can't stop the loop as there might be a further
+% valid color to mix in). On the other hand, if we get a mix of $0$ then
+% drop everything so far and start again. There is also a trailing
+% |white| to \enquote{read in} if the final explicit data is a mix.
+% Those conditions are separate from actually looping, which is therefore
+% sorted out by checking if we have further data to process: in contrast
+% to \pkg{xcolor}, we don't allow |!!| so the test can be simplified.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_loop:w #1 ! #2 ! #3 ! #4 ! #5 \s_@@_stop
+ {
+ \bool_lazy_or:nnF
+ { \tl_if_blank_p:n {#1} }
+ { \int_compare_p:nNn {#1} = { 100 } }
+ {
+ \int_compare:nNnTF {#1} = { 0 }
+ {
+ \tl_if_blank:nTF {#2}
+ { \@@_extract:nNN { white } }
+ { \@@_extract:nNN {#2} }
+ \l_@@_model_tl \l_@@_value_tl
+ }
+ {
+ \use:x
+ {
+ \@@_parse_loop:nn {#1}
+ { \tl_if_blank:nTF {#2} { white } {#2} }
+ }
+ }
+ }
+ \tl_if_blank:nF {#3}
+ { \@@_parse_loop:w #3 ! #4 ! #5 \s_@@_stop }
+ \@@_parse_end:
+ }
+% \end{macrocode}
+% The \enquote{payload} of calculation in the loop first. If the model for
+% the upcoming color is different from that of the existing (partial) color,
+% convert the model. For |gray| the two are flipped round so that the outcome
+% is something with \enquote{real} color. We are then in a position to do the
+% actual calculation itself. The two auxiliaries here give us a way to break
+% the loop should an invalid name be found.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_loop:nn #1#2
+ {
+ \@@_if_defined:nTF {#2}
+ {
+ \@@_extract:nNN {#2} \l_@@_next_model_tl \l_@@_next_value_tl
+ \tl_if_eq:NNF \l_@@_model_tl \l_@@_next_model_tl
+ {
+ \str_if_eq:VnTF \l_@@_model_tl { gray }
+ { \@@_parse_gray:n {#2} }
+ { \@@_parse_std:n {#2} }
+ }
+ \tl_set:Nx \l_@@_value_tl
+ {
+ \@@_parse_mix:NVVn
+ \l_@@_model_tl \l_@@_value_tl \l_@@_next_value_tl {#1}
+ }
+ }
+ {
+ \__kernel_msg_error:nnn { color } { unknown-color } {#2}
+ \@@_extract:nNN { black } \l_@@_model_tl \l_@@_value_tl
+ \@@_parse_break:w
+ }
+ }
+% \end{macrocode}
+% The \texttt{gray} model needs special handling: the models need to be
+% swapped: we do that using a dedicated function.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_gray:n #1
+ {
+ \tl_set_eq:NN \l_@@_model_tl \l_@@_next_model_tl
+ \tl_set:Nn \l_@@_next_model_tl { gray }
+ \exp_args:NnV \@@_convert:nnN { gray } \l_@@_model_tl
+ \l_@@_value_tl
+ \prop_get:cVN { l_@@_named_ #1 _prop } \l_@@_model_tl
+ \l_@@_next_value_tl
+ }
+\cs_new_protected:Npn \@@_parse_std:n #1
+ {
+ \prop_get:cVNF { l_@@_named_ #1 _prop }
+ \l_@@_model_tl
+ \l_@@_next_value_tl
+ {
+ \@@_convert:VVN
+ \l_@@_next_model_tl
+ \l_@@_model_tl
+ \l_@@_next_value_tl
+ }
+ }
+\cs_new_protected:Npn \@@_parse_break:w #1 \@@_parse_end: { }
+\cs_new_protected:Npn \@@_parse_end: { }
+% \end{macrocode}
+% Do the vector arithmetic: mainly a question of shuffling input, along
+% with one pre-calculation to keep down the use of division.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_mix:Nnnn #1#2#3#4
+ {
+ \exp_args:Nf \@@_parse_mix:nNnn
+ { \fp_eval:n { #4 / 100 } }
+ #1 {#2} {#3}
+ }
+\cs_generate_variant:Nn \@@_parse_mix:Nnnn { NVV }
+\cs_new:Npn \@@_parse_mix:nNnn #1#2#3#4
+ {
+ \use:c { @@_parse_mix_ #2 :nw } {#1}
+ #3 \s_@@_mark #4 \s_@@_stop
+ }
+\cs_new:Npn \@@_parse_mix_gray:nw #1#2 \s_@@_mark #3 \s_@@_stop
+ { \fp_eval:n { #2 * #1 + #3 * ( 1 - #1 ) } }
+\cs_new:Npn \@@_parse_mix_rgb:nw
+ #1#2 ~ #3 ~ #4 \s_@@_mark #5 ~ #6 ~ #7 \s_@@_stop
+ {
+ \fp_eval:n { #2 * #1 + #5 * ( 1 - #1 ) } \c_space_tl
+ \fp_eval:n { #3 * #1 + #6 * ( 1 - #1 ) } \c_space_tl
+ \fp_eval:n { #4 * #1 + #7 * ( 1 - #1 ) }
+ }
+\cs_new:Npn \@@_parse_mix_cmyk:nw
+ #1#2 ~ #3 ~ #4 ~ #5 \s_@@_mark #6 ~ #7 ~ #8 ~ #9 \s_@@_stop
+ {
+ \fp_eval:n { #2 * #1 + #6 * ( 1 - #1 ) } \c_space_tl
+ \fp_eval:n { #3 * #1 + #7 * ( 1 - #1 ) } \c_space_tl
+ \fp_eval:n { #4 * #1 + #8 * ( 1 - #1 ) } \c_space_tl
+ \fp_eval:n { #5 * #1 + #9 * ( 1 - #1 ) }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]
+% {
+% \@@_parse_model_gray:w, \@@_parse_model_rgb:w,
+% \@@_parse_model_cmyk:w
+% }
+% \begin{macro}[EXP]{\@@_parse_number:n}
+% \begin{macro}[EXP]{\@@_parse_number:w}
+% Turn the input into internal form, also tidying up the number quickly.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_model_gray:w #1 , #2 \s_@@_stop
+ { { gray } { \@@_parse_number:n {#1} } }
+\cs_new:Npn \@@_parse_model_rgb:w #1 , #2 , #3 , #4 \s_@@_stop
+ {
+ { rgb }
+ {
+ \@@_parse_number:n {#1} ~
+ \@@_parse_number:n {#2} ~
+ \@@_parse_number:n {#3}
+ }
+ }
+\cs_new:Npn \@@_parse_model_cmyk:w #1 , #2 , #3 , #4 , #5 \s_@@_stop
+ {
+ { cmyk }
+ {
+ \@@_parse_number:n {#1} ~
+ \@@_parse_number:n {#2} ~
+ \@@_parse_number:n {#3} ~
+ \@@_parse_number:n {#4}
+ }
+ }
+\cs_new:Npn \@@_parse_number:n #1
+ { \@@_parse_number:w #1 . 0 . \s_@@_stop }
+\cs_new:Npn \@@_parse_number:w #1 . #2 . #3 \s_@@_stop
+ { \tl_if_blank:nTF {#1} { 0 } {#1} . #2 }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]
+% {
+% \@@_parse_model_Gray:w, \@@_parse_model_hsb:w,
+% \@@_parse_model_Hsb:w, \@@_parse_model_HSB:w,
+% \@@_parse_model_HTML:w, \@@_parse_model_RGB:w
+% }
+% \begin{macro}[EXP]{\@@_parse_model_hsb:nnn, \@@_parse_model_hsb_aux:nnn}
+% \begin{macro}[EXP]{\@@_parse_model_hsb:nnnn}
+% \begin{macro}[EXP]{\@@_parse_model_hsb:nnnnn}
+% \begin{macro}[EXP]
+% {
+% \@@_parse_model_hsb_0:nnnn ,
+% \@@_parse_model_hsb_1:nnnn ,
+% \@@_parse_model_hsb_2:nnnn ,
+% \@@_parse_model_hsb_3:nnnn ,
+% \@@_parse_model_hsb_4:nnnn ,
+% \@@_parse_model_hsb_5:nnnn
+% }
+% \begin{macro}[EXP]{\@@_parse_model_wave:w}
+% \begin{macro}[EXP]
+% {\@@_parse_model_wave_auxi:nn, \@@_parse_model_wave_auxii:nn}
+% \begin{macro}[EXP]{\@@_parse_model_wave_rho:n}
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_model_Gray:w #1 , #2 \s_@@_stop
+ { { gray } { \fp_eval:n { #1 / 15 } } }
+\cs_new:Npn \@@_parse_model_hsb:w #1 , #2 , #3 , #4 \s_@@_stop
+ { \@@_parse_model_hsb:nnn {#1} {#2} {#3} }
+\cs_new:Npn \@@_parse_model_Hsb:w #1 , #2 , #3 , #4 \s_@@_stop
+ {
+ \exp_args:Ne \@@_parse_model_hsb:nnn { \fp_eval:n { #1 / 360 } }
+ {#2} {#3}
+ }
+% \end{macrocode}
+% The conversion here is non-trivial but is described at length
+% in the \pkg{xcolor} manual. For ease, we calculate the integer
+% and fractional parts of the hue first, then use them to work out the
+% possible values for $r$, $g$ and $b$ before putting them in the correct
+% places.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_model_hsb:nnn #1#2#3
+ {
+ { rgb }
+ {
+ \exp_args:Ne \@@_parse_model_hsb_aux:nnn
+ { \fp_eval:n { 6 * #1 } } {#2} {#3}
+ }
+ }
+\cs_new:Npn \@@_parse_model_hsb_aux:nnn #1#2#3
+ {
+ \exp_args:Nee \@@_parse_model_hsb_aux:nnnn
+ { \fp_eval:n { floor(#1) } } { \fp_eval:n { #1 - floor(#1) } }
+ {#2} {#3}
+ }
+\cs_new:Npn \@@_parse_model_hsb_aux:nnnn #1#2#3#4
+ {
+ \use:e
+ {
+ \exp_not:N \@@_parse_model_hsb_aux:nnnnn
+ { \@@_parse_number:n {#4} }
+ { \fp_eval:n { round(#4 * (1 - #3) ,5) } }
+ { \fp_eval:n { round(#4 * ( 1 - #3 * #2 ) ,5) } }
+ { \fp_eval:n { round(#4 * ( 1 - #3 * (1 - #2) ) ,5) } }
+ {#1}
+ }
+ }
+\cs_new:Npn \@@_parse_model_hsb_aux:nnnnn #1#2#3#4#5
+ { \use:c { @@_parse_model_hsb_ #5 :nnnn } {#1} {#2} {#3} {#4} }
+\cs_new:cpn { @@_parse_model_hsb_0:nnnn } #1#2#3#4 { #1 ~ #4 ~ #2 }
+\cs_new:cpn { @@_parse_model_hsb_1:nnnn } #1#2#3#4 { #3 ~ #1 ~ #2 }
+\cs_new:cpn { @@_parse_model_hsb_2:nnnn } #1#2#3#4 { #2 ~ #1 ~ #4 }
+\cs_new:cpn { @@_parse_model_hsb_3:nnnn } #1#2#3#4 { #2 ~ #3 ~ #1 }
+\cs_new:cpn { @@_parse_model_hsb_4:nnnn } #1#2#3#4 { #4 ~ #2 ~ #1 }
+\cs_new:cpn { @@_parse_model_hsb_5:nnnn } #1#2#3#4 { #1 ~ #2 ~ #3 }
+\cs_new:cpn { @@_parse_model_hsb_6:nnnn } #1#2#3#4 { #1 ~ #2 ~ #2 }
+\cs_new:Npn \@@_parse_model_HSB:w #1 , #2 , #3 , #4 \s_@@_stop
+ {
+ \exp_args:Neee \@@_parse_model_hsb:nnn
+ { \fp_eval:n {#1 / 240} }
+ { \fp_eval:n {#2 / 240} }
+ { \fp_eval:n {#3 / 240} }
+ }
+\cs_new:Npn \@@_parse_model_HTML:w #1 , #2 \s_@@_stop
+ { \@@_parse_model_HTML_aux:w #1 0 0 0 0 0 0 \s_@@_stop }
+\cs_new:Npn \@@_parse_model_HTML_aux:w #1#2#3#4#5#6#7 \s_@@_stop
+ {
+ { rgb }
+ {
+ \fp_eval:n { round(\int_from_hex:n {#1#2} / 255,5) } ~
+ \fp_eval:n { round(\int_from_hex:n {#3#4} / 255,5) } ~
+ \fp_eval:n { round(\int_from_hex:n {#5#6} / 255,5) }
+ }
+ }
+\cs_new:Npn \@@_parse_model_RGB:w #1 , #2 , #3 , #4 \s_@@_stop
+ {
+ { rgb }
+ {
+ \fp_eval:n { round(#1 / 255,5) } ~
+ \fp_eval:n { round(#2 / 255,5) } ~
+ \fp_eval:n { round(#3 / 255,5) }
+ }
+ }
+% \end{macrocode}
+% Following the description in the \pkg{xcolor} manual. As we always use |rgb|,
+% there is no need to find the sixth, we just pas the information straight
+% to the |hsb| auxiliary defined earlier.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_model_wave:w #1 , #2 \s_@@_stop
+ {
+ { rgb }
+ {
+ \fp_compare:nNnTF {#1} < { 420 }
+ { \@@_parse_model_wave_auxi:nn {#1} { 0.3 + 0.7 * (#1 - 380) / 40 }
+ }
+ {
+ \fp_compare:nNnTF {#1} > { 700 }
+ { \@@_parse_model_wave_auxi:nn {#1} { 0.3 + 0.7 * (#1 - 780) / -80 } }
+ { \@@_parse_model_wave_auxi:nn {#1} { 1 } }
+ }
+ }
+ }
+\cs_new:Npn \@@_parse_model_wave_auxi:nn #1#2
+ {
+ \fp_compare:nNnTF {#1} < { 440 }
+ {
+ \@@_parse_model_wave_auxii:nn
+ { 4 + \@@_parse_model_wave_rho:n { (#1 - 440) / -60 } }
+ {#2}
+ }
+ {
+ \fp_compare:nNnTF {#1} < { 490 }
+ {
+ \@@_parse_model_wave_auxii:nn
+ { 4 - \@@_parse_model_wave_rho:n { (#1 - 440) / 50 } }
+ {#2}
+ }
+ {
+ \fp_compare:nNnTF {#1} < { 510 }
+ {
+ \@@_parse_model_wave_auxii:nn
+ { 2 + \@@_parse_model_wave_rho:n { (#1 - 510) / -20 } }
+ {#2}
+ }
+ {
+ \fp_compare:nNnTF {#1} < { 580 }
+ {
+ \@@_parse_model_wave_auxii:nn
+ { 2 - \@@_parse_model_wave_rho:n { (#1 - 510) / 70 } }
+ {#2}
+ }
+ {
+ \fp_compare:nNnTF {#1} < { 645 }
+ {
+ \@@_parse_model_wave_auxii:nn
+ { \@@_parse_model_wave_rho:n { (#1 - 645) / -65 } }
+ {#2}
+ }
+ { \@@_parse_model_wave_auxii:nn { 0 } {#2} }
+ }
+ }
+ }
+ }
+ }
+\cs_new:Npn \@@_parse_model_wave_auxii:nn #1#2
+ {
+ \exp_args:Neee \@@_parse_model_hsb_aux:nnn
+ { \fp_eval:n {#1} }
+ { 1 }
+ { \@@_parse_model_wave_rho:n {#2} }
+ }
+\cs_new:Npn \@@_parse_model_wave_rho:n #1
+ { \fp_eval:n { min(1, max(0,#1) ) } }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Selecting colors (and color models)}
+%
+% \begin{variable}{\l_color_fixed_model_tl}
+% For selecting a single fixed model.
+% \begin{macrocode}
+\tl_new:N \l_color_fixed_model_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_check_model:N}
+% \begin{macro}{\@@_check_model:nn}
+% Check that the model in use is the one required.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_check_model:N #1
+ {
+ \tl_if_empty:NF \l_color_fixed_model_tl
+ {
+ \exp_after:wN \@@_check_model:nn #1
+ \tl_if_eq:NNF \l_@@_model_tl \l_color_fixed_model_tl
+ {
+ \@@_convert:VVN \l_@@_model_tl \l_color_fixed_model_tl
+ \l_@@_value_tl
+ }
+ \tl_set:Nx #1
+ { { \l_color_fixed_model_tl } { \l_@@_value_tl } }
+ }
+ }
+\cs_new_protected:Npn \@@_check_model:nn #1#2
+ {
+ \tl_set:Nn \l_@@_model_tl {#1}
+ \tl_set:Nn \l_@@_value_tl {#2}
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_select:}
+% A backend-neutral location for \enquote{last minute} manipulations before
+% handing off to the backend code. We set the special |.| syntax here: this
+% will therefore always be available. The finalisation is separate from the
+% main function so it can also be applied to \emph{e.g.}~page color.
+% \begin{macrocode}
+\cs_new_protected:Npx \@@_select:
+ {
+ \tl_set:Nx \exp_not:c { l_@@_named_ . _tl }
+ { \exp_not:N \@@_model:N \exp_not:N \l_@@_current_tl }
+ \prop_clear:N \exp_not:c { l_@@_named_ . _prop }
+ \prop_put:NVx \exp_not:c { l_@@_named_ . _prop }
+ \exp_not:c { l_@@_named_ . _tl }
+ { \exp_not:N \@@_values:N \exp_not:N \l_@@_current_tl }
+ \@@_select:N \exp_not:N \l_@@_current_tl
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\color_select:n}
+% \begin{macro}{\color_select:nn}
+% \begin{macro}{\@@_select_main:Nw, \@@_select_loop:Nw}
+% \begin{macro}{\@@_select:nnN}
+% \begin{macro}{\@@_select_swap:Nnn}
+% Parse the input expressions then get the backend to actually activate
+% them. The main complexity here is the need to check through multiple models.
+% That is done \enquote{locally} here as the approach is subtly different to
+% when different models are being stored.
+% \begin{macrocode}
+\cs_new_protected:Npn \color_select:n #1
+ {
+ \@@_parse:nN {#1} \l_@@_current_tl
+ \@@_select:
+ }
+\cs_new_protected:Npn \color_select:nn #1#2
+ {
+ \@@_select_main:Nw \l_@@_current_tl
+ #1 / / \s_@@_mark #2 / / \s_@@_stop
+ \@@_select:
+ }
+% \end{macrocode}
+% If the first color model is the fixed one, or if there is no fixed
+% model, we don't need most of the data: just set up and apply the backend
+% function.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_select_main:Nw
+ #1 #2 / #3 / #4 \s_@@_mark #5 / #6 / #7 \s_@@_stop
+ {
+ \@@_select:nnN {#2} {#5} #1
+ \bool_lazy_or:nnF
+ { \tl_if_empty_p:N \l_color_fixed_model_tl }
+ { \str_if_eq_p:nV {#2} \l_color_fixed_model_tl }
+ { \@@_select_loop:Nw #1 #3 / #4 \s_@@_mark #6 / #7 \s_@@_stop }
+ }
+% \end{macrocode}
+% If a fixed model applies, we need to check each possible value in order.
+% If there is no hit at all, fall back on the generic formula-based
+% interchange.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_select_loop:Nw
+ #1 #2 / #3 \s_@@_mark #4 / #5 \s_@@_stop
+ {
+ \str_if_eq:nVTF {#2} \l_color_fixed_model_tl
+ { \@@_select:nnN {#2} {#4} #1 }
+ {
+ \tl_if_blank:nTF {#2}
+ { \exp_after:wN \@@_select_swap:Nnn \exp_after:wN #1 #1 }
+ { \@@_select_loop:Nw #1 #3 \s_@@_mark #5 \s_@@_stop }
+ }
+ }
+\cs_new_protected:Npn \@@_select:nnN #1#2#3
+ {
+ \cs_if_exist:cTF { @@_parse_model_ #1 :w }
+ {
+ \tl_set:Nx #3
+ { \use:c { @@_parse_model_ #1 :w } #2 , 0 , 0 , 0 , 0 \s_@@_stop }
+ }
+ { \__kernel_msg_error:nnn { color } { unknown-model } {#1} }
+ }
+\cs_new_protected:Npn \@@_select_swap:Nnn #1#2#3
+ {
+ \@@_convert:nVnN {#2} \l_color_fixed_model_tl {#3} \l_@@_value_tl
+ \tl_set:Nx #1
+ { { \l_color_fixed_model_tl } { \l_@@_value_tl } }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Fill and stroke color}
+%
+% \begin{macro}{\color_fill:n, \color_stroke:n}
+% \begin{macro}{\color_fill:nn, \color_stroke:nn}
+% \begin{macro}{\@@_draw:nnn}
+% \begin{macrocode}
+\cs_new_protected:Npn \color_fill:n #1
+ {
+ \@@_parse:nN {#1} \l_@@_current_tl
+ \exp_after:wN \@@_draw:nnn \l_@@_current_tl { fill }
+ }
+\cs_new_protected:Npn \color_stroke:n #1
+ {
+ \@@_parse:nN {#1} \l_@@_current_tl
+ \exp_after:wN \@@_draw:nnn \l_@@_current_tl { stroke }
+ }
+\cs_new_protected:Npn \color_fill:nn #1#2
+ {
+ \@@_select_main:Nw \l_@@_current_tl
+ #1 / / \s_@@_mark #2 / / \s_@@_stop
+ \exp_after:wN \@@_draw:nnn \l_@@_current_tl { fill }
+ }
+\cs_new_protected:Npn \color_stroke:nn #1#2
+ {
+ \@@_select_main:Nw \l_@@_current_tl
+ #1 / / \s_@@_mark #2 / / \s_@@_stop
+ \exp_after:wN \@@_draw:nnn \l_@@_current_tl { stroke }
+ }
+\cs_new_protected:Npn \@@_draw:nnn #1#2#3
+ { \use:c { @@_backend_ #3 _ #1 :n } {#2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Defining named colors}
+%
+% \begin{variable}{\l_@@_named_tl}
+% Space to store the detail of the named color.
+% \begin{macrocode}
+\tl_new:N \l_@@_named_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\color_set:nn}
+% \begin{macro}{\@@_set:nnn}
+% \begin{macro}{\@@_set:nn}
+% \begin{macro}{\@@_set:nnw}
+% \begin{macro}{\color_set:nnn}
+% \begin{macro}{\@@_set_colon:nnw}
+% \begin{macro}{\@@_set_loop:nw}
+% \begin{macro}{\color_set_eq:nn}
+% Defining named colors means working through the model list and saving
+% both the \enquote{main} color and any equivalents in other models. Even
+% if there is only one model, we store a |prop| as well as a |tl|, as there
+% could be grouping weirdness, etc. When setting using an expression,
+% we need to avoid any fixed model issues, which is done without a group as
+% in \pkg{l3keys}.
+% \begin{macrocode}
+\cs_new_protected:Npn \color_set:nn #1#2
+ {
+ \exp_args:NV \@@_set:nnn
+ \l_color_fixed_model_tl {#1} {#2}
+ }
+\cs_new_protected:Npn \@@_set:nnn #1#2#3
+ {
+ \tl_clear:N \l_color_fixed_model_tl
+ \@@_set:nn {#2} {#3}
+ \tl_set:Nn \l_color_fixed_model_tl {#1}
+ }
+\cs_new_protected:Npn \@@_set:nn #1#2
+ {
+ \str_if_eq:nnF {#1} { . }
+ {
+ \@@_parse:nN {#2} \l_@@_named_tl
+ \tl_clear_new:c { l_@@_named_ #1 _tl }
+ \tl_set:cx { l_@@_named_ #1 _tl }
+ { \@@_model:N \l_@@_named_tl }
+ \prop_clear_new:c { l_@@_named_ #1 _prop }
+ \prop_put:cvx { l_@@_named_ #1 _prop } { l_@@_named_ #1 _tl }
+ { \@@_values:N \l_@@_named_tl }
+ \@@_set:nnw {#1} {#2} #2 ! \s_@@_stop
+ }
+ }
+% \end{macrocode}
+% When setting an expression-based color, there could be multiple model
+% data available for one or more of the input colors. Where that is true for
+% the \emph{first} named color in an expression, we re-parse the expression
+% when they are also parameter-based: only |cmyk|, |gray| and |rgb| make
+% any sense here. There is a bit of a performance hit but this should be
+% rare and taking place during set-up.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set:nnw #1#2#3 ! #4 \s_@@_stop
+ {
+ \clist_map_inline:nn { cmyk , gray , rgb }
+ {
+ \prop_get:cnNT { l_@@_named_ #3 _prop } {##1} \l_@@_internal_tl
+ {
+ \prop_if_in:cnF { l_@@_named_ #1 _prop } {##1}
+ {
+ \group_begin:
+ \tl_set:cn { l_@@_named_ #3 _tl } {##1}
+ \@@_parse:nN {#2} \l_@@_internal_tl
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l_@@_internal_tl \l_@@_internal_tl
+ \prop_put:cxx { l_@@_named_ #1 _prop }
+ { \@@_model:N \l_@@_internal_tl }
+ { \@@_values:N \l_@@_internal_tl }
+ }
+ }
+ }
+ }
+\cs_new_protected:Npx \color_set:nnn #1#2#3
+ {
+ \exp_not:N \str_if_eq:nnF {#1} { . }
+ {
+ \tl_clear_new:c { l_@@_named_ #1 _tl }
+ \prop_clear_new:c { l_@@_named_ #1 _prop }
+ \exp_not:N \@@_set_colon:nnw {#1} {#3}
+ #2 \c_colon_str \c_colon_str \exp_not:N \s_@@_stop
+ }
+ }
+\use:x
+ {
+ \cs_new_protected:Npn \exp_not:N \@@_set_colon:nnw
+ ##1##2 ##3 \c_colon_str ##4 \c_colon_str
+ ##5 \exp_not:N \s_@@_stop
+ }
+ {
+ \tl_if_blank:nTF {#4}
+ { \@@_set_loop:nw {#1} #3 }
+ { \@@_set_loop:nw {#1} #4 }
+ / / \s_@@_mark #2 / / \s_@@_stop
+ }
+\cs_new_protected:Npn \@@_set_loop:nw
+ #1#2 / #3 \s_@@_mark #4 / #5 \s_@@_stop
+ {
+ \tl_if_blank:nF {#2}
+ {
+ \@@_select:nnN {#2} {#4} \l_@@_named_tl
+ \tl_set:Nx \l_@@_internal_tl { \@@_model:N \l_@@_named_tl }
+ \tl_if_empty:cT { l_@@_named_ #1 _tl }
+ { \tl_set_eq:cN { l_@@_named_ #1 _tl } \l_@@_internal_tl }
+ \prop_put:cVx { l_@@_named_ #1 _prop } \l_@@_internal_tl
+ { \@@_values:N \l_@@_named_tl }
+ \@@_set_loop:nw {#1} #3 \s_@@_mark #5 \s_@@_stop
+ }
+ }
+\cs_new_protected:Npn \color_set_eq:nn #1#2
+ {
+ \@@_if_defined:nTF {#2}
+ {
+ \tl_clear_new:c { l_@@_named_ #1 _tl }
+ \prop_clear_new:c { l_@@_named_ #1 _prop }
+ \str_if_eq:nnTF {#2} { . }
+ {
+ \tl_set:cx { l_@@_named_ #1 _tl }
+ { \@@_model:N \l_@@_current_tl }
+ \prop_put:cvx { l_@@_named_ #1 _prop } { l_@@_named_ #1 _tl }
+ { \@@_values:N \l_@@_current_tl }
+ }
+ {
+ \tl_set_eq:cc { l_@@_named_ #1 _tl } { l_@@_named_ #2 _tl }
+ \prop_set_eq:cc { l_@@_named_ #1 _prop } { l_@@_named_ #2 _prop }
+ }
+ }
+ {
+ \__kernel_msg_error:nnn { color } { unknown-color } {#2}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% A small set of colors are always defined.
+% \begin{macrocode}
+\color_set:nnn { black } { gray } { 0 }
+\color_set:nnn { white } { gray } { 1 }
+\color_set:nnn { cyan } { cmyk } { 1 , 0 , 0 , 0 }
+\color_set:nnn { magenta } { cmyk } { 0 , 1 , 0 , 0 }
+\color_set:nnn { yellow } { cmyk } { 0 , 0 , 1 , 0 }
+\color_set:nnn { red } { rgb } { 1 , 0 , 0 }
+\color_set:nnn { green } { rgb } { 0 , 1 , 0 }
+\color_set:nnn { blue } { rgb } { 0 , 0 , 1 }
+% \end{macrocode}
+%
+% \begin{variable}{\l_@@_named_._prop, \l_@@_named_._tl}
+% A special named color: this is always defined though not fixed in
+% definition.
+% \begin{macrocode}
+\prop_new:c { l_@@_named_._prop }
+\tl_new:c { l_@@_named_._tl }
+\tl_set:cx { l_@@_named_._tl } { \@@_model:N \l_@@_current_tl }
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Exporting colors}
+%
+% \begin{macro}{\color_export:nnN}
+% \begin{macro}{\color_export:nnnN}
+% \begin{macro}{\@@_export:nN}
+% \begin{macro}{\@@_export:nnnN}
+% \begin{macrocode}
+\cs_new_protected:Npn \color_export:nnN #1#2#3
+ {
+ \group_begin:
+ \tl_if_exist:cT { c_@@_export_ #2 _tl }
+ { \tl_set_eq:Nc \l_color_fixed_model_tl { c_@@_export_ #2 _tl } }
+ \@@_parse:nN {#1} #3
+ \@@_export:nN {#2} #3
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn #3 #3
+ }
+\cs_new_protected:Npn \color_export:nnnN #1#2#3#4
+ {
+ \@@_select_main:Nw #4
+ #1 / / \s_@@_mark #2 / / \s_@@_stop
+ \@@_export:nN {#3} #4
+ }
+\cs_new_protected:Npn \@@_export:nN #1#2
+ { \exp_after:wN \@@_export:nnnN #2 {#1} #2 }
+\cs_new:Npn \@@_export:nnnN #1#2#3#4
+ {
+ \cs_if_exist_use:cF { @@_export_format_ #3 :nnN }
+ {
+ \__kernel_msg_error:nnn { color } { unknown-export-format } {#3}
+ \use_none:nnn
+ }
+ {#1} {#2} #4
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_export_format_backend:nnN}
+% Simple.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_export_format_backend:nnN #1#2#3
+ { \tl_set:Nn #3 { {#1} {#2} } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_export:nnnNN}
+% A generic auxiliary for cases where only one model is appropriate.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_export:nnnNN #1#2#3#4#5
+ {
+ \str_if_eq:nnTF {#2} {#1}
+ { #5 #4 #3 \s_@@_stop }
+ {
+ \@@_convert:nnnN {#2} {#1} {#3} #4
+ \exp_after:wN #5 \exp_after:wN #4
+ #4 \s_@@_stop
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}
+% {
+% \c_@@_export_HTML_tl ,
+% \c_@@_export_space-sep-cmyk_tl ,
+% \c_@@_export_space-sep-rgb_tl
+% }
+% \begin{macrocode}
+\tl_const:Nn \c_@@_export_HTML_tl { rgb }
+\tl_const:cn { c_@@_export_space-sep-cmyk_tl } { cmyk }
+\tl_const:cn { c_@@_export_space-sep-rgb_tl } { rgb }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_export_format_space-sep-cmyk:nnN}
+% \begin{macro}{\@@_export_space-sep-cmyk:Nw}
+% \begin{macrocode}
+\cs_new_protected:cpx { @@_export_format_space-sep-cmyk:nnN } #1#2#3
+ {
+ \exp_not:N \@@_export:nnnNN { cmyk } {#1} {#2} #3
+ \exp_not:c { @@_export_space-sep-cmyk:Nw }
+ }
+\cs_new_protected:cpn { @@_export_space-sep-cmyk:Nw } #1#2 \s_@@_stop
+ { \tl_set:Nx #1 {#2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \@@_export_format_HTML:nnN ,
+% \@@_export_format_space-sep-rgb:nnN
+% }
+% \begin{macro}
+% {
+% \@@_export_HTML:Nw ,
+% \@@_export_space-sep-rgb:Nw
+% }
+% \begin{macro}[EXP]{\@@_export_HTML:n}
+% \textsc{html} values must be given in |rgb|: we force conversion if
+% required, then do some simple maths.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_export_format_HTML:nnN #1#2#3
+ { \@@_export:nnnNN { rgb } {#1} {#2}#3 \@@_export_HTML:Nw }
+\cs_new_protected:cpx { @@_export_format_space-sep-rgb:nnN } #1#2#3
+ {
+ \exp_not:N \@@_export:nnnNN { rgb } {#1} {#2} #3
+ \exp_not:c { @@_export_space-sep-rgb:Nw }
+ }
+\cs_new_protected:Npn \@@_export_HTML:Nw #1#2 ~ #3 ~ #4 \s_@@_stop
+ {
+ \tl_set:Nx #1
+ {
+ \@@_export_HTML:n {#2}
+ \@@_export_HTML:n {#3}
+ \@@_export_HTML:n {#4}
+ }
+ }
+\cs_new:Npn \@@_export_HTML:n #1
+ {
+ \fp_compare:nNnTF {#1} = { 0 }
+ { 00 }
+ { \int_to_Hex:n { \fp_to_int:n { #1 * 255 } } }
+ }
+\cs_new_protected:cpn { @@_export_space-sep-rgb:Nw } #1#2 \s_@@_stop
+ { \tl_set:Nx #1 {#2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Additional color models}
+%
+% \begin{variable}{\l_@@_internal_prop}
+% \begin{macrocode}
+\prop_new:N \l_@@_internal_prop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_model_int}
+% A tracker for the total number of new models.
+% \begin{macrocode}
+\int_new:N \g_@@_model_int
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}
+% {\c_@@_fallback_cmyk_tl, \c_@@_fallback_gray_tl, \c_@@_fallback_rgb_tl}
+% Conversion from Separation or DeviceN spaces may not be possible; have
+% a fallback to black.
+% \begin{macrocode}
+\tl_const:Nn \c_@@_fallback_cmyk_tl { 0 ~ 0 ~ 0 ~ 1 }
+\tl_const:Nn \c_@@_fallback_gray_tl { 1 }
+\tl_const:Nn \c_@@_fallback_rgb_tl { 1 ~ 1 ~ 1 }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_colorants_prop}
+% Mapping from names to colorants.
+% \begin{macrocode}
+\prop_new:N \g_@@_colorants_prop
+\prop_gput:Nnn \g_@@_colorants_prop { black } { Black }
+\prop_gput:Nnn \g_@@_colorants_prop { blue } { Blue }
+\prop_gput:Nnn \g_@@_colorants_prop { cyan } { Cyan }
+\prop_gput:Nnn \g_@@_colorants_prop { green } { Green }
+\prop_gput:Nnn \g_@@_colorants_prop { magenta } { Magenta }
+\prop_gput:Nnn \g_@@_colorants_prop { none } { None }
+\prop_gput:Nnn \g_@@_colorants_prop { red } { Red }
+\prop_gput:Nnn \g_@@_colorants_prop { yellow } { Yellow }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}
+% {
+% \c_@@_model_whitepoint_CIELAB_a_tl ,
+% \c_@@_model_whitepoint_CIELAB_b_tl ,
+% \c_@@_model_whitepoint_CIELAB_e_tl ,
+% \c_@@_model_whitepoint_CIELAB_d50_tl ,
+% \c_@@_model_whitepoint_CIELAB_d55_tl ,
+% \c_@@_model_whitepoint_CIELAB_d65_tl ,
+% \c_@@_model_whitepoint_CIELAB_d75_tl
+% }
+% Whitepoint data for the CIELAB profiles.
+% \begin{macrocode}
+\tl_const:Nn \c_@@_model_whitepoint_CIELAB_a_tl { 1.0985 ~ 1 ~ 0.3558 }
+\tl_const:Nn \c_@@_model_whitepoint_CIELAB_b_tl { 0.9807 ~ 1 ~ 1.1822 }
+\tl_const:Nn \c_@@_model_whitepoint_CIELAB_e_tl { 1 ~ 1 ~ 1 }
+\tl_const:cn { c_@@_model_whitepoint_CIELAB_d50_tl } { 0.9642 ~ 1 ~ 0.8251 }
+\tl_const:cn { c_@@_model_whitepoint_CIELAB_d55_tl } { 0.9568 ~ 1 ~ 0.9214 }
+\tl_const:cn { c_@@_model_whitepoint_CIELAB_d65_tl } { 0.9504 ~ 1 ~ 1.0888 }
+\tl_const:cn { c_@@_model_whitepoint_CIELAB_d75_tl } { 0.9497 ~ 1 ~ 1.2261 }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_@@_model_range_CIELAB_tl}
+% The range for CIELAB color spaces.
+% \begin{macrocode}
+\tl_const:Nn \c_@@_model_range_CIELAB_tl { 0 ~ 100 ~ -128 ~ 127 ~ -128 ~ 127 }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_alternative_model_prop}
+% For tracking the alternative model set up for separations, etc.
+% \begin{macrocode}
+\prop_new:N \g_@@_alternative_model_prop
+\clist_map_inline:nn { cyan , magenta , yellow , black }
+ { \prop_gput:Nnn \g_@@_alternative_model_prop {#1} { cmyk } }
+\clist_map_inline:nn { red , green , blue }
+ { \prop_gput:Nnn \g_@@_alternative_model_prop {#1} { rgb } }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_alternative_values_prop}
+% Same for the values: a bit more involved.
+% \begin{macrocode}
+\prop_new:N \g_@@_alternative_values_prop
+\prop_gput:Nnn \g_@@_alternative_values_prop { cyan } { 1 , 0 , 0 , 0 }
+\prop_gput:Nnn \g_@@_alternative_values_prop { magenta } { 0 , 1 , 0 , 0 }
+\prop_gput:Nnn \g_@@_alternative_values_prop { yellow } { 0 , 0 , 1 , 0 }
+\prop_gput:Nnn \g_@@_alternative_values_prop { black } { 0 , 0 , 0 , 1 }
+\prop_gput:Nnn \g_@@_alternative_values_prop { red } { 1 , 0 , 0 }
+\prop_gput:Nnn \g_@@_alternative_values_prop { green } { 0 , 1 , 0 }
+\prop_gput:Nnn \g_@@_alternative_values_prop { blue } { 0 , 0 , 1 }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\color_model_new:nnn, \@@_model_new:nnn}
+% Set up a new model: in general this has to be handled by a family-dependent
+% function. To avoid some \enquote{interesting} questions with casing, we
+% fold the case of the family name. The key--value list should always be
+% present, so we convert it up-front to a |prop|, then deal with the detail
+% on a per-family basis.
+% \begin{macrocode}
+\cs_new_protected:Npn \color_model_new:nnn #1#2#3
+ {
+ \exp_args:Nee \@@_model_new:nnn
+ { \tl_to_str:n {#1} }
+ { \str_foldcase:n {#2} } {#3}
+ }
+\cs_new_protected:Npn \@@_model_new:nnn #1#2#3
+ {
+ \cs_if_exist:cTF { @@_parse_model_ #1 :w }
+ {
+ \__kernel_msg_error:nnn { color } { model-already-defined } {#1}
+ }
+ {
+ \cs_if_exist:cTF { @@_model_ #2 :n }
+ {
+ \prop_set_from_keyval:Nn \l_@@_internal_prop {#3}
+ \use:c { @@_model_ #2 :n } {#1}
+ }
+ {
+ \__kernel_msg_error:nnn { color } { unknown-model-type } {#2}
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_model_separation:n}
+% \begin{macro}{\@@_model_separation:nn}
+% \begin{macro}{\@@_model_separation:nnn}
+% \begin{macro}{\@@_model_separation:w}
+% \begin{macro}
+% {
+% \@@_model_separation_cmyk:nnnnnn ,
+% \@@_model_separation_gray:nnnnnn ,
+% \@@_model_separation_rgb:nnnnnn
+% }
+% \begin{macro}{\@@_model_convert:nnn}
+% \begin{macro}{\@@_model_separation_CIELAB:nnnnnn}
+% \begin{macro}{\@@_model_separation_CIELAB:nnnnnnn}
+% Separations must have a \enquote{real} name, which is pretty easy to find.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_model_separation:n #1
+ {
+ \prop_get:NnNTF \l_@@_internal_prop { name }
+ \l_@@_internal_tl
+ {
+ \exp_args:NV \@@_model_separation:nn
+ \l_@@_internal_tl {#1}
+ }
+ {
+ \__kernel_msg_error:nnn { color }
+ { separation-requires-name } {#1}
+ }
+ }
+% \end{macrocode}
+% We have two keys to find at this stage: the alternative space model
+% and linked values.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_model_separation:nn #1#2
+ {
+ \prop_get:NnNTF \l_@@_internal_prop { alternative-model }
+ \l_@@_internal_tl
+ {
+ \exp_args:NV \@@_model_separation:nnn
+ \l_@@_internal_tl {#2} {#1}
+ }
+ {
+ \__kernel_msg_error:nnn { color }
+ { separation-alternative-model } {#2}
+ }
+ }
+\cs_new_protected:Npn \@@_model_separation:nnn #1#2#3
+ {
+ \cs_if_exist:cTF { @@_model_separation_ #1 :nnnnnn }
+ {
+ \prop_get:NnNTF \l_@@_internal_prop { alternative-values }
+ \l_@@_internal_tl
+ {
+ \exp_after:wN \@@_model_separation:w \l_@@_internal_tl
+ , 0 , 0 , 0 , 0 \s_@@_stop {#2} {#3} {#1}
+ }
+ {
+ \__kernel_msg_error:nnn { color }
+ { separation-alternative-values } {#2}
+ }
+ }
+ {
+ \__kernel_msg_error:nnn { color }
+ { unknown-alternative-model } {#1}
+ }
+ }
+% \end{macrocode}
+% As each alternative space leads to a different requirement for conversion,
+% and as there are only a small number of choices, we manually split the data
+% and then set up. Notice that mixing tints is really just the same
+% as mixing \texttt{gray}. The \texttt{white} color is special, as it allows
+% tints to be adjusted without an additional color space. To make sure the
+% data is set for that at all group levels, we need to work on a per-level
+% basis. Within the output, only the set-up needs the \enquote{real} name
+% of the colorspace: we use a simple tracking number for general usage
+% as this is a clear namespace without issues of escaping chars.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_model_separation:w
+ #1 , #2 , #3 , #4 , #5 \s_@@_stop #6#7#8
+ {
+ \int_gincr:N \g_@@_model_int
+ \tl_const:cn { c_@@_fallback_ #6 _tl } { 1 }
+ \cs_new_eq:cN { @@_parse_mix_ #6 :nw } \@@_parse_mix_gray:nw
+ \cs_new:cpn { @@_parse_model_ #6 :w } ##1 , ##2 \s_@@_stop
+ { {#6} { \@@_parse_number:n {##1} } }
+ \clist_map_inline:nn { fill , stroke , select }
+ {
+ \cs_new_protected:cpx { @@_backend_ ##1 _ #6 :n } ####1
+ {
+ \exp_not:c { @@_backend_ ##1 _ separation:nn }
+ { color \int_use:N \g_@@_model_int } {####1}
+ }
+ }
+ \use:c { @@_model_separation_ #8 :nnnnnn }
+ {#6} {#7} {#1} {#2} {#3} {#4}
+ \prop_gput:Nnn \g_@@_alternative_model_prop {#6} {#8}
+ \prop_gput:Nnx \g_@@_colorants_prop {#6}
+ { \str_convert_pdfname:n {#7} }
+ \cs_new_protected:cpx { @@_model_ #6 _white: }
+ {
+ \prop_put:Nnn \exp_not:N \l_@@_named_white_prop {#6} { 0 }
+ \exp_not:N \int_compare:nNnF { \tex_currentgrouplevel:D } = 0
+ { \group_insert_after:N \exp_not:c { @@_model_ #6 _ white: } }
+ }
+ \use:c { @@_model_ #6 _white: }
+ }
+\cs_new_protected:Npn \@@_model_separation_cmyk:nnnnnn #1#2#3#4#5#6
+ {
+ \cs_new:cpn { @@_convert_ #1 _cmyk:w } ##1 ~ ##2 \s_@@_stop
+ {
+ \fp_eval:n {##1 * #3} ~
+ \fp_eval:n {##1 * #4} ~
+ \fp_eval:n {##1 * #5} ~
+ \fp_eval:n {##1 * #6}
+ }
+ \@@_model_convert:nnn {#1} { cmyk } { rgb }
+ \@@_model_convert:nnn {#1} { cmyk } { gray }
+ \prop_gput:Nnn \g_@@_alternative_values_prop {#1} { #3 , #4 , #5 , #6 }
+ \@@_backend_separation_init:nnnnn {#2} { /DeviceCMYK } { }
+ { 0 ~ 0 ~ 0 ~ 0 } { #3 ~ #4 ~ #5 ~ #6 }
+ }
+\cs_new_protected:Npn \@@_model_separation_rgb:nnnnnn #1#2#3#4#5#6
+ {
+ \cs_new:cpn { @@_convert_ #1 _rgb:w } ##1 ~ ##2 \s_@@_stop
+ {
+ \fp_eval:n {##1 * #3} ~
+ \fp_eval:n {##1 * #4} ~
+ \fp_eval:n {##1 * #5}
+ }
+ \@@_model_convert:nnn {#1} { rgb } { cmyk }
+ \@@_model_convert:nnn {#1} { rgb } { gray }
+ \prop_gput:Nnn \g_@@_alternative_values_prop {#1} { #3 , #4 , #5 }
+ \@@_backend_separation_init:nnnnn {#2} { /DeviceRGB } { }
+ { 0 ~ 0 ~ 0 } { #3 ~ #4 ~ #5 }
+ }
+\cs_new_protected:Npn \@@_model_separation_gray:nnnnnn #1#2#3#4#5#6
+ {
+ \cs_new:cpn { @@_convert_ #1 _cmyk:w } ##1 ~ ##2 \s_@@_stop
+ {
+ \fp_eval:n {##1 * #3} ~
+ \fp_eval:n {##1 * #3} ~
+ \fp_eval:n {##1 * #3} ~
+ \fp_eval:n {##1 * #3}
+ }
+ \cs_new:cpn { @@_convert_ #1 _gray:w } ##1 ~ ##2 \s_@@_stop
+ { \fp_eval:n {##1 * #3} }
+ \cs_new:cpn { @@_convert_ #1 _rgb:w } ##1 ~ ##2 \s_@@_stop
+ {
+ \fp_eval:n {##1 * #3} ~
+ \fp_eval:n {##1 * #3} ~
+ \fp_eval:n {##1 * #3}
+ }
+ \prop_gput:Nnn \g_@@_alternative_values_prop {#1} {#3}
+ \@@_backend_separation_init:nnnnn {#2} { /DeviceGray } { } { 0 } {#3}
+ }
+% \end{macrocode}
+% Generic model conversion \emph{via} an alternative intermediate.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_model_convert:nnn #1#2#3
+ {
+ \cs_new:cpx { @@_convert_ #1 _ #3 :w } ##1 ~ ##2 \s_@@_stop
+ {
+ \exp_not:N \exp_args:NNe \exp_not:N \use:nn
+ \exp_not:c { @@_convert_ #2 _ #3 :w }
+ { \exp_not:c { @@_convert_ #1 _ #2 :w } ##1 ~ ##2 \s_@@_stop }
+ \c_space_tl \exp_not:N \s_@@_stop
+ }
+ }
+% \end{macrocode}
+% Setting up for CIELAB needs a bit more work: there is the illuminant and
+% the need for an appropriate object.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_model_separation_CIELAB:nnnnnn #1#2#3#4#5#6
+ {
+ \prop_get:NnNF \l_@@_internal_prop { illuminant }
+ \l_@@_internal_tl
+ {
+ \__kernel_msg_error:nnn { color }
+ { CIELAB-requires-illuminant } {#1}
+ \tl_set:Nn \l_@@_internal_tl { d50 }
+ }
+ \exp_args:NV \@@_model_separation_CIELAB:nnnnnnn
+ \l_@@_internal_tl {#1} {#2} {#3} {#4} {#5} {#6}
+ }
+% \end{macrocode}
+% If a CIELAB space is being set up, we need the illuminant, then create
+% the appropriate set up. At present, this doesn't include \texttt{BlackPoint}
+% or \texttt{Range} data, but that may be added later. As CIELAB colors
+% cannot be converted to anything else, we fallback to producing black: the
+% user should set up a second model for colors set up this way.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_model_separation_CIELAB:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \tl_if_exist:cTF { c_@@_model_whitepoint_CIELAB_ #1 _tl }
+ {
+ \@@_backend_separation_init_CIELAB:nnn {#1} {#3} { #4 ~ #5 ~ #6 }
+ \cs_new:cpn { @@_convert_ #2 _cmyk:w } ##1 ~ ##2 \s_@@_stop
+ { 0 ~ 0 ~ 0 ~ 1 }
+ \cs_new:cpn { @@_convert_ #2 _rgb:w } ##1 ~ ##2 \s_@@_stop
+ { 1 ~ 1 ~ 1 }
+ \cs_new:cpn { @@_convert_ #2 _gray:w } ##1 ~ ##2 \s_@@_stop
+ { 1 }
+ }
+ {
+ \__kernel_msg_error:nnn { color }
+ { unknown-CIELAB-illuminant } {#1}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_model_devicen:n}
+% \begin{macro}{\@@_model_devicen:nn}
+% \begin{macro}{\@@_model_devicen:nnn}
+% \begin{macro}{\@@_model_devicen:nnnn}
+% \begin{macro}
+% {
+% \@@_model_devicen_parse_1:nn ,
+% \@@_model_devicen_parse_2:nn ,
+% \@@_model_devicen_parse_3:nn ,
+% \@@_model_devicen_parse_4:nn ,
+% \@@_model_devicen_parse_generic:nn
+% }
+% \begin{macro}[EXP]{\@@_model_devicen_parse:nw}
+% \begin{macro}[EXP]{\@@_model_devicen_mix:nw}
+% \begin{macro}{\@@_model_devicen_init:nnn}
+% \begin{macro}{\@@_model_devicen_init:nnnn}
+% \begin{macro}{\@@_model_devicen_tranform:w}
+% \begin{macro}
+% {
+% \@@_model_devicen_tranform_1:nnnnn ,
+% \@@_model_devicen_tranform_3:nnnnn ,
+% \@@_model_devicen_tranform_4:nnnnn ,
+% }
+% \begin{macro}{\@@_model_devicen_tranform:nnn}
+% \begin{macro}[EXP]{\@@_model_devicen_colorant:n}
+% \begin{macro}{\@@_model_devicen_convert:nnn}
+% \begin{macro}
+% {
+% \@@_model_devicen_convert_cmyk:n ,
+% \@@_model_devicen_convert_gray:n ,
+% \@@_model_devicen_convert_rgb:n
+% }
+% \begin{macro}{\@@_model_devicen_convert:nnnn}
+% \begin{macro}[EXP]{\@@_model_devicen_convert:n, \@@_model_devicen_convert_aux:n}
+% \begin{macro}[EXP]{\@@_model_devicen_convert:w}
+% \begin{macro}[EXP]{\@@_convert_devicen_cmyk:nnnnw}
+% \begin{macro}[EXP]{\@@_convert_devicen_cmyk:nnnnnnnnn}
+% \begin{macro}[EXP]{\@@_convert_devicen_cmyk_aux:nnnnw}
+% \begin{macro}[EXP]{\@@_convert_devicen_gray:nw}
+% \begin{macro}[EXP]{\@@_convert_devicen_gray:nnn}
+% \begin{macro}[EXP]{\@@_convert_devicen_gray_aux:nw}
+% \begin{macro}[EXP]{\@@_convert_devicen_rgb:nnnw}
+% \begin{macro}[EXP]{\@@_convert_devicen_rgb:nnnnnnn}
+% \begin{macro}[EXP]{\@@_convert_devicen_rgb_aux:nnnw}
+% We require a list of component names here: one might call them colorants,
+% but it's convenient to use \TeX{} names instead so we slightly adjust the
+% terminology.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_model_devicen:n #1
+ {
+ \prop_get:NnNTF \l_@@_internal_prop { names }
+ \l_@@_internal_tl
+ {
+ \exp_args:NV \@@_model_devicen:nn
+ \l_@@_internal_tl {#1}
+ }
+ {
+ \__kernel_msg_error:nnn { color }
+ { DeviceN-requires-names } {#1}
+ }
+ }
+% \end{macrocode}
+% All valid models will have an alternative listed, either hard-coded for
+% the core device ones, or dynamically added for Separations, etc.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_model_devicen:nn #1#2
+ {
+ \tl_clear:N \l_@@_model_tl
+ \clist_map_inline:nn {#1}
+ {
+ \prop_get:NnNTF \g_@@_alternative_model_prop {##1}
+ \l_@@_internal_tl
+ {
+ \tl_if_empty:NTF \l_@@_model_tl
+ { \tl_set_eq:NN \l_@@_model_tl \l_@@_internal_tl }
+ {
+ \str_if_eq:VVF \l_@@_model_tl \l_@@_internal_tl
+ {
+ \__kernel_msg_error:nnn { color }
+ { DeviceN-inconsistent-alternative }
+ {#2}
+ \clist_map_break:n { \use_none:nnnn }
+ }
+ }
+ }
+ {
+ \str_if_eq:nnF {##1} { none }
+ {
+ \__kernel_msg_error:nnn { color }
+ { DeviceN-no-alternative }
+ {#2}
+ }
+ }
+ }
+ \tl_if_empty:NTF \l_@@_model_tl
+ {
+ \__kernel_msg_error:nnn { color }
+ { DeviceN-no-alternative } {#2}
+ }
+ { \exp_args:NV \@@_model_devicen:nnn \l_@@_model_tl {#1} {#2} }
+ }
+% \end{macrocode}
+% We now complete the data we require by first finding out how many
+% colorants there are, then moving on to begin constructing the function
+% required to map to the alternative color space.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_model_devicen:nnn #1#2#3
+ {
+ \exp_args:Nx \@@_model_devicen:nnnn
+ { \clist_count:n {#2} } {#1} {#2} {#3}
+ }
+% \end{macrocode}
+% At this stage, we have checked everything is in place, so we can set up
+% the \TeX{} and backend data structures. As for separations, it's not really
+% possible in general to have a fallback, so we simply provide
+% \enquote{black} for each element.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_model_devicen:nnnn #1#2#3#4
+ {
+ \int_gincr:N \g_@@_model_int
+ \tl_const:cx { c_@@_fallback_ #4 _tl }
+ { \prg_replicate:nn {#1} { 1 ~ } }
+ \cs_if_exist_use:cF { @@_model_devicen_parse_ #1 :nn }
+ { \@@_model_devicen_parse_generic:nn }
+ {#4} {#1}
+ \clist_map_inline:nn { fill , stroke , select }
+ {
+ \cs_new_protected:cpx { @@_backend_ ##1 _ #4 :n } ####1
+ {
+ \exp_not:c { @@_backend_ ##1 _ devicen:nn }
+ { color \int_use:N \g_@@_model_int } {####1}
+ }
+ }
+ \cs_new_protected:cpx { @@_model_ #4 _white: }
+ {
+ \prop_put:Nnn \exp_not:N \l_@@_named_white_prop {#4}
+ { \prg_replicate:nn {#1} { 0 ~ } }
+ \exp_not:N \int_compare:nNnF { \tex_currentgrouplevel:D } = 0
+ { \group_insert_after:N \exp_not:c { @@_model_ #4 _ white: } }
+ }
+ \use:c { @@_model_ #4 _white: }
+ \@@_model_devicen_init:nnn {#1} {#2} {#3}
+ \@@_model_devicen_convert:nnn {#4} {#2} {#3}
+ }
+% \end{macrocode}
+% For short lists of DeviceN colors, wee can use hand-tuned parsing. This
+% lines up with other models, where we allow for up to four components. For
+% larger spaces,. rather than limit artificially, we use a somewhat slow
+% approach based on open-ended commas-lists.
+% \begin{macrocode}
+\cs_new_protected:cpn { @@_model_devicen_parse_1:nn } #1#2
+ {
+ \cs_new:cpn { @@_parse_model_ #1 :w } ##1 , ##2 \s_@@_stop
+ { {#1} { \@@_parse_number:n {##1} } }
+ \cs_new_eq:cN { @@_parse_mix_ #1 :nw } \@@_parse_mix_gray:nw
+ }
+\cs_new_protected:cpn { @@_model_devicen_parse_2:nn } #1#2
+ {
+ \cs_new:cpn { @@_parse_model_ #1 :w } ##1 , ##2 , ##3 \s_@@_stop
+ { {#1} { \@@_parse_number:n {##1} ~ \@@_parse_number:n {##2} } }
+ \cs_new:cpn { @@_parse_mix_ #1 :nw }
+ ##1##2 ~ ##3 \s_@@_mark ##4 ~ ##5 \s_@@_stop
+ {
+ \fp_eval:n { ##2 * ##1 + ##4 * ( 1 - ##1 ) } \c_space_tl
+ \fp_eval:n { ##3 * ##1 + ##5 * ( 1 - ##1 ) }
+ }
+ }
+\cs_new_protected:cpn { @@_model_devicen_parse_3:nn } #1#2
+ {
+ \cs_new:cpn { @@_parse_model_ #1 :w } ##1 , ##2 , ##3 , ##4 \s_@@_stop
+ {
+ {#1}
+ {
+ \@@_parse_number:n {##1} ~
+ \@@_parse_number:n {##2} ~
+ \@@_parse_number:n {##3}
+ }
+ }
+ \cs_new_eq:cN { @@_parse_mix_ #1 :nw } \@@_parse_mix_rgb:nw
+ }
+\cs_new_protected:cpn { @@_model_devicen_parse_4:nn } #1#2
+ {
+ \cs_new:cpn { @@_parse_model_ #1 :w }
+ ##1 , ##2 , ##3 , ##4 , ##5 \s_@@_stop
+ {
+ {#1}
+ {
+ \@@_parse_number:n {##1} ~
+ \@@_parse_number:n {##2} ~
+ \@@_parse_number:n {##3} ~
+ \@@_parse_number:n {##4}
+ }
+ }
+ \cs_new_eq:cN { @@_parse_mix_ #1 :nw } \@@_parse_mix_cmyk:nw
+ }
+\cs_new_protected:Npn \@@_model_devicen_parse_generic:nn #1#2
+ {
+ \cs_new:cpn { @@_parse_model_ #1 :w } ##1 , ##2 \s_@@_stop
+ {
+ {#1}
+ { \@@_model_devicen_parse:nw {#2} ##1 , ##2 , \q_nil , \s_@@_stop }
+ }
+ \cs_new:cpx { @@_parse_mix_ #1 :nw }
+ ##1 ##2 \s_@@_mark ##3 \s_@@_stop
+ {
+ \exp_not:N \@@_model_devicen_mix:nw {##1}
+ ##2 \c_space_tl \exp_not:N \q_nil \c_space_tl \exp_not:N \s_@@_mark
+ ##3 \c_space_tl \exp_not:N \q_nil \c_space_tl \exp_not:N \s_@@_stop
+ }
+ }
+\cs_new:Npn \@@_model_devicen_parse:nw #1#2 , #3 \s_@@_stop
+ {
+ \int_compare:nNnT {#1} > 0
+ {
+ \quark_if_nil:nTF {#2}
+ { \prg_replicate:nn {#1} { 0 ~ } }
+ {
+ \@@_parse_number:n {#2}
+ \int_compare:nNnT {#1} > 1 { ~ }
+ \exp_args:Nf \@@_model_devicen_parse:nw
+ { \int_eval:n { #1 - 1 } } #3 \s_@@_stop
+ }
+ }
+ }
+\cs_new:Npn \@@_model_devicen_mix:nw #1#2 ~ #3 \s_@@_mark #4 ~ #5 \s_@@_stop
+ {
+ \fp_eval:n { #2 * #1 + #4 * ( 1 - #1 ) }
+ \quark_if_nil:oF { \tl_head:w #3 \q_stop }
+ {
+ \c_space_tl
+ \@@_model_devicen_mix:nw {#1} #3 \s_@@_mark #5 \s_@@_stop
+ }
+ }
+% \end{macrocode}
+% To construct the tint transformation, we have to use PostScript. The
+% aim is to have the final tint for each device colorant as
+% \[
+% 1 - \prod_{n} (1 - X_{n} D_{X_{n}})
+% \]
+% where $X$ is a DeviceN colorant and $D$ is the amount of device colorant
+% that the DeviceN colorant maps to. At the start of the process, the
+% PostScript stack will contain the $X_{n}$ values, whilst we have the
+% $D$ values on a per-DeviceN colorant basis. The more convenient approach
+% for us is therefore to take each DeviceN colorant in turn and find the
+% value $1 - X_{n} D_{X_{n}}$, multiplying as we go, and finalise with the
+% subtraction. That contrasts to \pkg{colorspace}: it splits the process
+% up by process color, which works better when you have a fixed list
+% of colorants. (\pkg{colorspace} only supports up to $4$ DeviceN colors,
+% and only \texttt{cmyk} as the alternative space.) To set this up,
+% we first need to know the number of values in the target color space:
+% this is easily handled as there are a very small range of possibles.
+% Once we have that information, it's relatively easy to build the required
+% PostScript using some generic code.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_model_devicen_init:nnn #1#2#3
+ {
+ \exp_args:Ne \@@_model_devicen_init:nnnn
+ {
+ \str_case:nn {#2}
+ {
+ { cmyk } { 4 }
+ { gray } { 1 }
+ { rgb } { 3 }
+ }
+ }
+ {#1} {#2} {#3}
+ }
+% \end{macrocode}
+% As we always need to split the alternative values into parts, we use a
+% shared auxiliary and only use a minimal difference between code paths.
+% Construction of the tint transformation is as far as possible done using
+% loops, which means there are some inefficiencies for device colors in
+% the \texttt{DeviceN} space: we roll the stack one-at-a-time even if there
+% is a potential shortcut. However, that way there is nothing to special-case.
+% Once this is sorted, we can write the tint transform object, which will
+% remain as the last object until we sort out the final step: the colorant
+% list.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_model_devicen_init:nnnn #1#2#3#4
+ {
+ \tl_set:Nx \l_@@_internal_tl
+ { \prg_replicate:nn {#1} { 1.0 ~ } }
+ \int_zero:N \l_@@_internal_int
+ \clist_map_inline:nn {#4}
+ {
+ \int_incr:N \l_@@_internal_int
+ \prop_get:NnN \g_@@_alternative_values_prop {##1}
+ \l_@@_value_tl
+ \exp_after:wN \@@_model_devicen_transform:w
+ \l_@@_value_tl , 0 , 0 , 0 \s_@@_stop {#1} {#2}
+ }
+ \tl_put_right:Nx \l_@@_internal_tl
+ {
+ \prg_replicate:nn {#1}
+ { neg ~ 1.0 ~ add ~ #1 ~ -1 ~ roll ~ }
+ \int_eval:n { #2 + 4 } ~ 4 ~ roll
+ \prg_replicate:nn {#2} { ~ pop }
+ }
+ \use:x
+ {
+ \@@_backend_devicen_init:nnn
+ {
+ \clist_map_function:nN {#4}
+ \@@_model_devicen_colorant:n
+ }
+ {
+ \str_case:nn {#3}
+ {
+ { cmyk } { /DeviceCMYK }
+ { gray } { /DeviceGray }
+ { rgb } { /DeviceRGB }
+ }
+ }
+ { \exp_not:V \l_@@_internal_tl }
+ }
+ }
+\cs_new_protected:Npn \@@_model_devicen_transform:w
+ #1 , #2 , #3 , #4 , #5 \s_@@_stop #6#7
+ {
+ \use:c { @@_model_devicen_transform_ #6 :nnnnn }
+ {#1} {#2} {#3} {#4} {#7}
+ }
+\cs_new_protected:cpn { @@_model_devicen_transform_1:nnnnn } #1#2#3#4#5
+ { \@@_model_devicen_transform:nnn {#5} { 1 } {#1} }
+\cs_new_protected:cpn { @@_model_devicen_transform_3:nnnnn } #1#2#3#4#5
+ {
+ \clist_map_inline { #1 , #2 , #3 }
+ { \@@_model_devicen_transform:nnn {#5} { 3 } {##1} }
+ }
+\cs_new_protected:cpn { @@_model_devicen_transform_4:nnnnn } #1#2#3#4#5
+ {
+ \clist_map_inline:nn { #1 , #2 , #3 , #4 }
+ { \@@_model_devicen_transform:nnn {#5} { 4 } {##1} }
+ }
+\cs_new_protected:Npn \@@_model_devicen_transform:nnn #1#2#3
+ {
+ \tl_put_right:Nx \l_@@_internal_tl
+ {
+ \fp_compare:nNnF {#3} = \c_zero_fp
+ {
+ \int_eval:n { #1 - \l_@@_internal_int + #2 } ~ index ~
+ #3 ~ neg ~ mul ~ 1.0 ~ add ~ mul ~
+ }
+ #2 ~ -1 ~ roll ~
+ }
+ }
+\cs_new:Npn \@@_model_devicen_colorant:n #1
+ {
+ / \prop_item:Nn \g_@@_colorants_prop {#1} ~
+ }
+% \end{macrocode}
+% Here we need to set up conversion from the DeviceN space to the alternative
+% at the \TeX{} level. This also means supplying methods for inter-converting
+% to other parameter-based spaces. Essentially the approach is exactly the same
+% as the PostScript, just expressed in \TeX{} terms.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_model_devicen_convert:nnn #1#2#3
+ {
+ \use:c { @@_model_devicen_convert_ #2 :nn } {#1} {#3}
+ }
+\cs_new_protected:Npn \@@_model_devicen_convert_cmyk:nn #1#2
+ {
+ \@@_model_convert:nnn {#1} { cmyk } { gray }
+ \@@_model_convert:nnn {#1} { cmyk } { rgb }
+ \@@_model_devicen_convert:nnnn {#1} { cmyk } { 4 } {#2}
+ }
+\cs_new_protected:Npn \@@_model_devicen_convert_gray:nn #1#2
+ {
+ \@@_model_convert:nnn {#1} { gray } { cmyk }
+ \@@_model_convert:nnn {#1} { gray } { rgb }
+ \@@_model_devicen_convert:nnnn {#1} { gray } { 1 } {#2}
+ }
+\cs_new_protected:Npn \@@_model_devicen_convert_rgb:nn #1#2
+ {
+ \@@_model_convert:nnn {#1} { rgb } { cmyk }
+ \@@_model_convert:nnn {#1} { rgb } { gray }
+ \@@_model_devicen_convert:nnnn {#1} { rgb } { 3 } {#2}
+ }
+\cs_new_protected:Npn \@@_model_devicen_convert:nnnn #1#2#3#4
+ {
+ \cs_new:cpx { @@_convert_ #1 _ #2 :w } ##1 \s_@@_stop
+ {
+ \exp_not:c { @@_convert_devicen_ #2 : \prg_replicate:nn {#3} { n } w }
+ \prg_replicate:nn {#3} { { 1 } }
+ ##1 \exp_not:N \s_@@_mark
+ \clist_map_function:nN {#4} \@@_model_devicen_convert:n
+ \exp_not:N \s_@@_stop
+ }
+ }
+\cs_new:Npn \@@_model_devicen_convert:n #1
+ {
+ {
+ \exp_args:Ne \@@_model_devicen_convert_aux:n
+ { \prop_item:Nn \g_@@_alternative_values_prop {#1} }
+ }
+ }
+\cs_new:Npn \@@_model_devicen_convert_aux:n #1
+ { \@@_model_devicen_convert_aux:w #1 , , , , \s_@@_stop }
+\cs_new:Npn \@@_model_devicen_convert_aux:w #1 , #2 , #3 , #4 , #5 \s_@@_stop
+ {
+ {#1}
+ \tl_if_blank:nF {#2}
+ {
+ {#2}
+ \tl_if_blank:nF {#3}
+ {
+ {#3}
+ \tl_if_blank:nF {#4} { {#4} }
+ }
+ }
+ }
+\cs_new:Npn \@@_convert_devicen_cmyk:nnnnw
+ #1#2#3#4#5 ~ #6 \s_@@_mark #7#8 \s_@@_stop
+ {
+ \@@_convert_devicen_cmyk:nnnnnnnnn {#5} {#1} {#2} {#3} {#4} #7
+ #6 \s_@@_mark #8 \s_@@_stop
+ }
+\cs_new:Npn \@@_convert_devicen_cmyk:nnnnnnnnn #1#2#3#4#5#6#7#8#9
+ {
+ \use:e
+ {
+ \exp_not:N \@@_convert_devicen_cmyk_aux:nnnnw
+ { \fp_eval:n { #2 * (1 - (#1 * #6)) } }
+ { \fp_eval:n { #3 * (1 - (#1 * #7)) } }
+ { \fp_eval:n { #4 * (1 - (#1 * #8)) } }
+ { \fp_eval:n { #5 * (1 - (#1 * #9)) } }
+ }
+ }
+\cs_new:Npn \@@_convert_devicen_cmyk_aux:nnnnw
+ #1#2#3#4 #5 \s_@@_mark #6 \s_@@_stop
+ {
+ \tl_if_blank:nTF {#5}
+ {
+ \fp_eval:n { 1 - #1 } ~
+ \fp_eval:n { 1 - #2 } ~
+ \fp_eval:n { 1 - #3 } ~
+ \fp_eval:n { 1 - #4 }
+ }
+ {
+ \@@_convert_devicen_cmyk:nnnnw {#1} {#2} {#3} {#4}
+ #5 \s_@@_mark #6 \s_@@_stop
+ }
+ }
+\cs_new:Npn \@@_convert_devicen_gray:nw
+ #1#2 ~ #3 \s_@@_mark #4#5 \s_@@_stop
+ {
+ \@@_convert_devicen_gray:nnn {#2} {#1} #4
+ #3 \s_@@_mark #5 \s_@@_stop
+ }
+\cs_new:Npn \@@_convert_devicen_gray:nnn #1#2#3
+ {
+ \exp_arsgs:Ne \@@_convert_devicen_gray_aux:nw
+ { \fp_eval:n { #2 * (1 - (#1 * #3)) } }
+ }
+\cs_new:Npn \@@_convert_devicen_gray_aux:nw
+ #1 #2 \s_@@_mark #3 \s_@@_stop
+ {
+ \tl_if_blank:nTF {#2}
+ { \fp_eval:n { 1 - #1 } }
+ {
+ \@@_convert_devicen_gray:nw {#1}
+ #2 \s_@@_mark #3 \s_@@_stop
+ }
+ }
+\cs_new:Npn \@@_convert_devicen_rgb:nnnw
+ #1#2#3#4 ~ #5 \s_@@_mark #6#7 \s_@@_stop
+ {
+ \@@_convert_devicen_cmyk:nnnnnn {#4} {#1} {#2} {#3} #6
+ #5 \s_@@_mark #7 \s_@@_stop
+ }
+\cs_new:Npn \@@_convert_devicen_rgb:nnnnnnn #1#2#3#4#5#6#7
+ {
+ \use:e
+ {
+ \exp_not:N \@@_convert_devicen_rgb_aux:nnnw
+ { \fp_eval:n { #2 * (1 - (#1 * #5)) } }
+ { \fp_eval:n { #3 * (1 - (#1 * #6)) } }
+ { \fp_eval:n { #4 * (1 - (#1 * #7)) } }
+ }
+ }
+\cs_new:Npn \@@_convert_devicen_rgb_aux:nnnw
+ #1#2#3 #4 \s_@@_mark #5 \s_@@_stop
+ {
+ \tl_if_blank:nTF {#4}
+ {
+ \fp_eval:n { 1 - #1 } ~
+ \fp_eval:n { 1 - #2 } ~
+ \fp_eval:n { 1 - #3 }
+ }
+ {
+ \@@_convert_devicen_rgb:nnnw {#1} {#2} {#3}
+ #4 \s_@@_mark #5 \s_@@_stop
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Diagnostics}
+%
+% \begin{macro}{\color_show:n}
+% \begin{macro}{\@@_show:n}
+% Extract the information about a color and format for the user: the approach
+% is similar to the keys module here.
+% \begin{macrocode}
+\cs_new_protected:Npn \color_show:n #1
+ {
+ \msg_show:nnxxxx { LaTeX / color } { show }
+ {#1}
+ {
+ \@@_if_defined:nT {#1}
+ {
+ \exp_args:Nv \@@_show:n { l_@@_named_ #1 _tl }
+ \prop_map_function:cN
+ { l_@@_named_ #1 _prop }
+ \msg_show_item_unbraced:nn
+ }
+ }
+ { }
+ { }
+ }
+\cs_new:Npn \@@_show:n #1
+ {
+ \msg_show_item_unbraced:nn { model } {#1}
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Messages}
+%
+% \begin{macrocode}
+\__kernel_msg_new:nnnn { color } { CIELAB-requires-illuminant }
+ { CIELAB~color~space~'#1'~require~an~illuminant. }
+ {
+ LaTeX~has~been~asked~to~create~a~separation~color~space~using~
+ CIELAB~specifications,~but~no~\\ \\
+ \iow_indent:n { illuminant~=~<basis> }
+ \\ \\
+ key~was~given~with~the~correct~information.~LaTeX~will~use~illuminant~
+ 'd50'~for~recovery.
+ }
+\__kernel_msg_new:nnnn { color } { conversion-not-available }
+ { No~model~conversion~available~from~'#1'~to~'#2'. }
+ {
+ LaTeX~has~been~asked~to~convert~a~color~from~model~'#1'~
+ to~model'#2',~but~there~is~no~method~available~to~do~that.
+ }
+\__kernel_msg_new:nnnn { color } { DeviceN-inconsistent-alternative }
+ { DeviceN~color~spaces~require~a~single~alternative~space. }
+ {
+ LaTeX~has~been~asked~to~create~a~DeviceN~color~space~'#1',~
+ but~the~constituent~colors~do~not~have~a~common~alternative~
+ color.
+ }
+\__kernel_msg_new:nnnn { color } { DeviceN-no-alternative }
+ { DeviceN~color~spaces~require~an~alternative~space. }
+ {
+ LaTeX~has~been~asked~to~create~a~DeviceN~color~space~'#1',~
+ but~the~constituent~colors~do~not~all~have~a~device-based~alternative.
+ }
+\__kernel_msg_new:nnnn { color } { DeviceN-requires-names }
+ { DeviceN~color~space~'#1'~require~a~list~of~names. }
+ {
+ LaTeX~has~been~asked~to~create~a~DeviceN~color~space,~
+ but~no~\\ \\
+ \iow_indent:n { names~=~<names> }
+ \\ \\
+ key~was~given~with~the~correct~information.
+ }
+\__kernel_msg_new:nnnn { color } { model-already-defined }
+ { Color~model~'#1'~already~defined. }
+ {
+ LaTeX~was~asked~to~define~a~new~color~model~called~'#1',~but~
+ this~color~model~already~exists.
+ }
+\__kernel_msg_new:nnnn { color } { separation-alternative-model }
+ { Separation~color~space~'#1'~require~an~alternative~model. }
+ {
+ LaTeX~has~been~asked~to~create~a~separation~color~space,~
+ but~no~\\ \\
+ \iow_indent:n { alternative-model~=~<model> }
+ \\ \\
+ key~was~given~with~the~correct~information.
+ }
+\__kernel_msg_new:nnnn { color } { separation-alternative-values }
+ { Separation~color~space~'#1'~require~values~for~the~alternative~space. }
+ {
+ LaTeX~has~been~asked~to~create~a~separation~color~space,~
+ but~no~\\ \\
+ \iow_indent:n { alternative-values~=~<model> }
+ \\ \\
+ key~was~given~with~the~correct~information.
+ }
+\__kernel_msg_new:nnnn { color } { separation-requires-name }
+ { Separation~color~space~'#1'~require~a~formal~name. }
+ {
+ LaTeX~has~been~asked~to~create~a~separation~color~space,~
+ but~no~\\ \\
+ \iow_indent:n { name~=~<formal~name> }
+ \\ \\
+ key~was~given~with~the~correct~information.
+ }
+\__kernel_msg_new:nnnn { color } { unknown-color }
+ { Unknown~color~'#1'. }
+ {
+ LaTeX~has~been~asked~to~use~a~color~named~'#1',~
+ but~this~has~never~been~defined.
+ }
+\__kernel_msg_new:nnnn { color } { unknown-alternative-model }
+ { Separation~color~space~'#1'~require~an~valid~alternative~space. }
+ {
+ LaTeX~has~been~asked~to~create~a~separation~color~space,~
+ but~the~model~given~as\\ \\
+ \iow_indent:n { alternative-model~=~<model> }
+ \\ \\
+ is~unknown.
+ }
+\__kernel_msg_new:nnnn { color } { unknown-export-format }
+ { Unknown~export~format~'#1'. }
+ {
+ LaTeX~has~been~asked~to~export~a~color~in~format~'#1',~
+ but~this~has~never~been~defined.
+ }
+\__kernel_msg_new:nnnn { color } { unknown-CIELAB-illuminant }
+ { Unknown~illuminant~model~'#1'. }
+ {
+ LaTeX~has~been~asked~to~use~create~a~color~space~using~CIELAB~
+ illuminant~'#1',~but~this~does~not~exist.
+ }
+\__kernel_msg_new:nnnn { color } { unknown-model }
+ { Unknown~color~model~'#1'. }
+ {
+ LaTeX~has~been~asked~to~use~a~color~model~called~'#1',~
+ but~this~model~is~not~set~up.
+ }
+\__kernel_msg_new:nnnn { color } { unknown-model-type }
+ { Unknown~color~model~type~'#1'. }
+ {
+ LaTeX~has~been~asked~to~create~a~new~color~model~called~'#1',~
+ but~this~type~of~model~was~never~set~up.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\__kernel_msg_new:nnn { color } { show }
+ {
+ The~color~#1~
+ \tl_if_empty:nTF {#2}
+ { is~undefined. }
+ { has~the~properties: #2 }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
index 04ba29e9159..107601afe8e 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
@@ -2,7 +2,7 @@
%
%% File: l3debug.dtx
%
-% Copyright (C) 2019,2020 The LaTeX3 Project
+% Copyright (C) 2019-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -119,7 +119,7 @@
% \section{\pkg{l3debug} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -131,6 +131,37 @@
\ProvidesExplFile{l3debug.def}{2019-04-06}{}{L3 Debugging support}
% \end{macrocode}
%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_i_delimit_by_s_stop:nw}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop:N}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_q_recursion_stop:w
+ #1 \q_@@_recursion_stop { }
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop:N
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\debug_on:n, \debug_off:n, \@@_all_on:, \@@_all_off:}
% \begin{macrocode}
\cs_set_protected:Npn \debug_on:n #1
@@ -189,7 +220,7 @@
}
\cs_set_protected:Npn \debug_resume:
{
- \tl_set:Nx \l_@@_suspended_tl
+ \__kernel_tl_set:Nx \l_@@_suspended_tl
{ \tl_tail:N \l_@@_suspended_tl }
\tl_if_empty:NT \l_@@_suspended_tl
{
@@ -314,9 +345,9 @@
{ \exp_args:NNf \@@_chk_var_scope_aux:Nn #1 { \cs_to_str:N #2 } }
\cs_new_protected:Npn \@@_chk_var_scope_aux:Nn #1#2
{
- \if:w _ \use_i:nn \use_i_delimit_by_q_stop:nw #2 ? ? \q_stop
+ \if:w _ \use_i:nn \@@_use_i_delimit_by_s_stop:nw #2 ? ? \s_@@_stop
\exp_after:wN \@@_chk_var_scope_aux:NNn
- \use_i_delimit_by_q_stop:nw #2 ? \q_stop
+ \@@_use_i_delimit_by_s_stop:nw #2 ? \s_@@_stop
#1 {#2}
\else:
\exp_args:Nc \@@_chk_var_scope_aux:NNn
@@ -479,26 +510,26 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_generate_parameter_list:NNN #1#2#3
{
- \tl_set:Nx \l_@@_internal_tl
+ \__kernel_tl_set:Nx \l_@@_internal_tl
{ \exp_last_unbraced:Nf \use_ii:nnn \cs_split_function:N #1 }
- \tl_set:Nx #2
+ \__kernel_tl_set:Nx #2
{ \exp_args:NV \@@_build_parm_text:n \l_@@_internal_tl }
- \tl_set:Nx #3
+ \__kernel_tl_set:Nx #3
{ \exp_args:NV \@@_build_arg_list:n \l_@@_internal_tl }
}
\cs_new:Npn \@@_build_parm_text:n #1
{
\@@_arg_list_from_signature:nNN { 1 } \c_false_bool #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
\cs_new:Npn \@@_build_arg_list:n #1
{
\@@_arg_list_from_signature:nNN { 1 } \c_true_bool #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
\cs_new:Npn \@@_arg_list_from_signature:nNN #1 #2 #3
{
- \quark_if_recursion_tail_stop:N #3
+ \@@_if_recursion_tail_stop:N #3
\@@_arg_check_invalid:N #3
\bool_if:NT #2 { \@@_arg_if_braced:NT #3 { \use_none:n } }
\use:n { \c_hash_str \int_eval:n {#1} }
@@ -523,7 +554,7 @@
\exp_end:
}
\cs_new:Npn \@@_parm_terminate:w
- { \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \exp:w }
+ { \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w \exp:w }
\prg_new_conditional:Npnn \@@_arg_if_braced:N #1 { T }
{ \exp_args:Nf \@@_arg_if_braced:n { \@@_get_base_form:N #1 } }
\cs_new:Npn \@@_arg_if_braced:n #1
@@ -649,7 +680,7 @@
####2 \tl_to_str:n { -> }
####3 \c_backslash_str \tl_to_str:n { __debug_ }
\cs_to_str:N #1
- ####4 \exp_not:N \q_mark
+ ####4 \s_@@_stop
{
\exp_not:N \exp_args:Nx \exp_not:N \tex_scantokens:D
{
@@ -663,7 +694,7 @@
}
}
}
- \exp_after:wN \@@_tmp:w \cs_meaning:N #1 \q_mark
+ \exp_after:wN \@@_tmp:w \cs_meaning:N #1 \s_@@_stop
}
% \end{macrocode}
% Some functions, however, won't work with the signature reading setup
@@ -757,6 +788,12 @@
% \tracingnone
% \end{macrocode}
%
+%
+% \begin{macrocode}
+\cs_gset_protected:Npn \__kernel_tl_set:Nx { \cs_set_nopar:Npx }
+\cs_gset_protected:Npn \__kernel_tl_gset:Nx { \cs_gset_nopar:Npx }
+% \end{macrocode}
+%
% Patching where the first argument to a function needs scope-checking:
% either local or global (so two lists).
% \begin{macrocode}
@@ -800,9 +837,7 @@
\skip_set_eq:NN
\skip_add:Nn
\skip_sub:Nn
- \tl_set:Nn
- \tl_set:No
- \tl_set:Nx
+ \__kernel_tl_set:Nx
\tl_set_eq:NN
\tl_put_left:Nn
\tl_put_left:NV
@@ -834,6 +869,7 @@
\box_gset_eq:NN
\box_gset_eq_drop:NN
\box_gset_to_last:N
+ \cctab_gset:Nn
\clist_gset_eq:NN
\dim_gset_eq:NN
\dim_gzero:N
@@ -863,9 +899,7 @@
\skip_gset_eq:NN
\skip_gadd:Nn
\skip_gsub:Nn
- \tl_gset:Nn
- \tl_gset:No
- \tl_gset:Nx
+ \__kernel_tl_gset:Nx
\tl_gset_eq:NN
\tl_gput_left:Nn
\tl_gput_left:NV
@@ -895,6 +929,7 @@
{ }
{
\bool_const:Nn
+ \cctab_const:Nn
\dim_const:Nn
\int_const:Nn
\intarray_const_from_clist:Nn
@@ -930,6 +965,10 @@
\__kernel_patch:nnn
{ \__kernel_chk_var_scope:NN g #1 }
{ }
+ { \cctab_new:N }
+ \__kernel_patch:nnn
+ { \__kernel_chk_var_scope:NN g #1 }
+ { }
{ \intarray_new:Nn }
\__kernel_patch:nnn
{ \__kernel_chk_var_scope:NN q #1 }
@@ -1016,7 +1055,7 @@
{
\@@_trace_push:nnN { regex } { 1 } \@@_escape_use:nnnn
\group_begin:
- \tl_set:Nx \l_@@_internal_a_tl
+ \__kernel_tl_set:Nx \l_@@_internal_a_tl
{ \@@_trace_pop:nnN { regex } { 1 } \@@_escape_use:nnnn }
\use_none:nnn
}
@@ -1380,7 +1419,7 @@
\__kernel_chk_expr:nNnN
{##1} \tex_glueexpr:D { } \skip_if_finite:n
; \prg_return_false:
- #1 ; \prg_return_true: \q_stop
+ #1 ; \prg_return_true: \s_@@_stop
}
}
\exp_args:No \@@_tmp:w { \tl_to_str:n { fil } }
@@ -1439,7 +1478,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
index cf9733ef68e..e5a70436f62 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
@@ -2,7 +2,7 @@
%
%% File: l3deprecation.dtx
%
-% Copyright (C) 2017-2020 The LaTeX3 Project
+% Copyright (C) 2017-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -86,7 +86,7 @@
% \section{\pkg{l3deprecation} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -109,15 +109,23 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}[EXP]{\@@_date_compare:nNnTF, \@@_date_compare_aux:w}
% Expects |#1| and |#3| to be dates in the format YYYY-MM-DD (but
% accepts YYYY or YYYY-MM too, filling in zeros for the missing data).
% Compares them using |#2| (one of |<|, |=|, |>|).
% \begin{macrocode}
\cs_new:Npn \@@_date_compare:nNnTF #1#2#3
- { \@@_date_compare_aux:w #1 -0-0- \q_mark #2 #3 -0-0- \q_stop }
+ { \@@_date_compare_aux:w #1 -0-0- \s_@@_mark #2 #3 -0-0- \s_@@_stop }
\cs_new:Npn \@@_date_compare_aux:w
- #1 - #2 - #3 - #4 \q_mark #5 #6 - #7 - #8 - #9 \q_stop
+ #1 - #2 - #3 - #4 \s_@@_mark #5 #6 - #7 - #8 - #9 \s_@@_stop
{
\int_compare:nNnTF {#1} = {#6}
{
@@ -155,7 +163,7 @@
\exp_args:Nf \@@_date_compare:nNnTF
{
\exp_after:wN \@@_minus_six_months:w
- \ExplLoaderFileDate -0-0- \q_stop
+ \ExplLoaderFileDate -0-0- \s_@@_stop
} < {#1}
{
\bool_set_true:N \l_@@_grace_period_bool
@@ -164,7 +172,7 @@
{ \use_ii:nn }
}
}
-\cs_new:Npn \@@_minus_six_months:w #1 - #2 - #3 - #4 \q_stop
+\cs_new:Npn \@@_minus_six_months:w #1 - #2 - #3 - #4 \s_@@_stop
{
\int_compare:nNnTF {#2} > 6
{ #1 - \int_eval:n { #2 - 6 } - #3 }
@@ -358,8 +366,8 @@
% \begin{macrocode}
\__kernel_msg_new:nnn { kernel } { deprecated-command }
{
- '#2'~deprecated~on~#1.
- \tl_if_empty:nF {#3} { ~Use~'#3'. }
+ \tl_if_blank:nF {#3} { Use~ \tl_trim_spaces:n {#3} ~not~ }
+ #2~deprecated~on~#1.
\str_if_eq:nnT {#4} { grace }
{
\c_space_tl
@@ -394,6 +402,52 @@
{ \c_sys_jobname_str } { 2017-01-01 }
\@@_old:Nnn \c_minus_one
{ -1 } { 2019-01-01 }
+\@@_old:Nnn \c_zero
+ { 0 } { 2020-01-01 }
+\@@_old:Nnn \c_one
+ { 1 } { 2020-01-01 }
+\@@_old:Nnn \c_two
+ { 2 } { 2020-01-01 }
+\@@_old:Nnn \c_three
+ { 3 } { 2020-01-01 }
+\@@_old:Nnn \c_four
+ { 4 } { 2020-01-01 }
+\@@_old:Nnn \c_five
+ { 5 } { 2020-01-01 }
+\@@_old:Nnn \c_six
+ { 6 } { 2020-01-01 }
+\@@_old:Nnn \c_seven
+ { 7 } { 2020-01-01 }
+\@@_old:Nnn \c_eight
+ { 8 } { 2020-01-01 }
+\@@_old:Nnn \c_nine
+ { 9 } { 2020-01-01 }
+\@@_old:Nnn \c_ten
+ { 10 } { 2020-01-01 }
+\@@_old:Nnn \c_eleven
+ { 11 } { 2020-01-01 }
+\@@_old:Nnn \c_twelve
+ { 12 } { 2020-01-01 }
+\@@_old:Nnn \c_thirteen
+ { 13 } { 2020-01-01 }
+\@@_old:Nnn \c_fourteen
+ { 14 } { 2020-01-01 }
+\@@_old:Nnn \c_fifteen
+ { 15 } { 2020-01-01 }
+\@@_old:Nnn \c_sixteen
+ { 16 } { 2020-01-01 }
+\@@_old:Nnn \c_thirty_two
+ { 32 } { 2020-01-01 }
+\@@_old:Nnn \c_one_hundred
+ { 100 } { 2020-01-01 }
+\@@_old:Nnn \c_two_hundred_fifty_five
+ { 255 } { 2020-01-01 }
+\@@_old:Nnn \c_two_hundred_fifty_six
+ { 256 } { 2020-01-01 }
+\@@_old:Nnn \c_one_thousand
+ { 1000 } { 2020-01-01 }
+\@@_old:Nnn \c_ten_thousand
+ { 10000 } { 2020-01-01 }
\@@_old:Nnn \dim_case:nnn
{ \dim_case:nnF } { 2015-07-14 }
\@@_old:Nnn \file_add_path:nN
@@ -434,6 +488,12 @@
{ \iow_show_list: } { 2019-01-01 }
\@@_old:Nnn \iow_log_streams:
{ \iow_log_list: } { 2019-01-01 }
+\@@_old:Nnn \lua_escape_x:n
+ { \lua_escape:e } { 2020-01-01 }
+\@@_old:Nnn \lua_now_x:n
+ { \lua_now:e } { 2020-01-01 }
+\@@_old_protected:Nnn \lua_shipout_x:n
+ { \lua_shipout_e:n } { 2020-01-01 }
\@@_old:Nnn \luatex_if_engine_p:
{ \sys_if_engine_luatex_p: } { 2017-01-01 }
\@@_old:Nnn \luatex_if_engine:F
@@ -442,6 +502,12 @@
{ \sys_if_engine_luatex:T } { 2017-01-01 }
\@@_old:Nnn \luatex_if_engine:TF
{ \sys_if_engine_luatex:TF } { 2017-01-01 }
+\@@_old_protected:Nnn \msg_interrupt:nnn
+ { [Defined~error~message] } { 2020-01-01 }
+\@@_old_protected:Nnn \msg_log:n
+ { \iow_log:n } { 2020-01-01 }
+\@@_old_protected:Nnn \msg_term:n
+ { \iow_term:n } { 2020-01-01 }
\@@_old:Nnn \pdftex_if_engine_p:
{ \sys_if_engine_pdftex_p: } { 2017-01-01 }
\@@_old:Nnn \pdftex_if_engine:F
@@ -468,8 +534,28 @@
{ \str_case:nnF } { 2015-07-14 }
\@@_old:Nnn \str_case:onn
{ \str_case:onF } { 2015-07-14 }
+\@@_old:Nnn \str_case_x:nn
+ { \str_case_e:nn } { 2020-01-01 }
\@@_old:Nnn \str_case_x:nnn
{ \str_case_e:nnF } { 2015-07-14 }
+\@@_old:Nnn \str_case_x:nnT
+ { \str_case_e:nnT } { 2020-01-01 }
+\@@_old:Nnn \str_case_x:nnTF
+ { \str_case_e:nnTF } { 2020-01-01 }
+\@@_old:Nnn \str_case_x:nnF
+ { \str_case_e:nnF } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x_p:nn
+ { \str_if_eq_p:ee } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x:nnT
+ { \str_if_eq:eeT } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x:nnF
+ { \str_if_eq:eeF } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x:nnTF
+ { \str_if_eq:eeTF } { 2020-01-01 }
+\@@_old_protected:Nnn \tl_show_analysis:N
+ { \tl_analysis_show:N } { 2020-01-01 }
+\@@_old_protected:Nnn \tl_show_analysis:n
+ { \tl_analysis_show:n } { 2020-01-01 }
\@@_old:Nnn \tl_case:cnn
{ \tl_case:cnF } { 2015-07-14 }
\@@_old:Nnn \tl_case:Nnn
@@ -491,70 +577,6 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Deprecated primitives}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\etex_beginL:D}
-% \begin{macro}{\@@_primitive:NN, \@@_primitive:w}
-% We renamed all primitives to \cs[no-index]{tex_\ldots{}:D} so all
-% others are deprecated. In \pkg{l3names}, \cs{__kernel_primitives:}
-% is defined to contain \cs{__kernel_primitive:NN} \cs{beginL}
-% \cs{etex_beginL:D} and so on, one for each deprecated primitive. We
-% apply \cs{exp_not:N} to the second argument of
-% \cs{__kernel_primitive:NN} because it may be outer (both when doing
-% and undoing deprecation actually), then \cs{@@_primitive:NN} uses
-% \cs{tex_let:D} to change the meaning of this potentially outer
-% token. Then, either turn it into an error or make it equal to the
-% primitive~|#1|. To be more precise, |#1| may not be defined, so try
-% a \cs[no-index]{tex_\ldots{}:D} command as well.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_primitive:NN #1#2 { }
-\exp_last_unbraced:NNNNo
- \cs_new:Npn \@@_primitive:w #1 { \token_to_str:N _ } { }
-\__kernel_deprecation_code:nn
- {
- \cs_set_protected:Npn \__kernel_primitive:NN #1
- {
- \exp_after:wN \@@_primitive:NN
- \exp_after:wN #1
- \exp_not:N
- }
- \cs_set_protected:Npn \@@_primitive:NN #1#2
- {
- \tex_let:D #2 \scan_stop:
- \exp_args:NNx \__kernel_deprecation_error:Nnn #2
- {
- \iow_char:N \\
- \cs_if_exist:NTF #1
- { \cs_to_str:N #1 }
- {
- tex_
- \exp_last_unbraced:Nf
- \@@_primitive:w { \cs_to_str:N #2 }
- }
- }
- { 2020-01-01 }
- }
- \__kernel_primitives:
- }
- {
- \cs_set_protected:Npn \__kernel_primitive:NN #1
- {
- \exp_after:wN \@@_primitive:NN
- \exp_after:wN #1
- \exp_not:N
- }
- \cs_set_protected:Npn \@@_primitive:NN #1#2
- {
- \tex_let:D #2 #1
- \cs_if_exist:cT { tex_ \cs_to_str:N #1 :D }
- { \cs_set_eq:Nc #2 { tex_ \cs_to_str:N #1 :D } }
- }
- \__kernel_primitives:
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \subsection{Loading the patches}
%
% When loaded first, the patches are simply read here.
@@ -638,245 +660,12 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Deprecated \pkg{l3int} functions}
-%
-% \begin{macrocode}
-%<@@=int>
-% \end{macrocode}
-%
-% \begin{variable}[deprecated = 2020-07-01]
-% {
-% \c_zero, \c_one, \c_two, \c_three, \c_four, \c_five, \c_six,
-% \c_seven, \c_eight, \c_nine, \c_ten, \c_eleven, \c_twelve,
-% \c_thirteen, \c_fourteen, \c_fifteen, \c_sixteen, \c_thirty_two,
-% \c_one_hundred, \c_two_hundred_fifty_five,
-% \c_two_hundred_fifty_six, \c_one_thousand, \c_ten_thousand,
-% }
-% \begin{macro}{\@@_deprecated_constants:nn}
-% Constants that are now deprecated. By default define them with
-% \cs{int_const:Nn}. To deprecate them call for instance
-% \cs{__kernel_deprecation_error:Nnn} \cs{c_zero} |{0}|
-% |{2020-01-01}|. To redefine them (locally), use
-% \cs{@@_constdef:Nw}, with an \cs{exp_not:N} construction because the
-% constants themselves are outer at that point.
-% \begin{macrocode}
-\cs_gset_protected:Npn \@@_deprecated_constants:nn #1#2
- {
- #1 \c_zero { 0 } #2
- #1 \c_one { 1 } #2
- #1 \c_two { 2 } #2
- #1 \c_three { 3 } #2
- #1 \c_four { 4 } #2
- #1 \c_five { 5 } #2
- #1 \c_six { 6 } #2
- #1 \c_seven { 7 } #2
- #1 \c_eight { 8 } #2
- #1 \c_nine { 9 } #2
- #1 \c_ten { 10 } #2
- #1 \c_eleven { 11 } #2
- #1 \c_twelve { 12 } #2
- #1 \c_thirteen { 13 } #2
- #1 \c_fourteen { 14 } #2
- #1 \c_fifteen { 15 } #2
- #1 \c_sixteen { 16 } #2
- #1 \c_thirty_two { 32 } #2
- #1 \c_one_hundred { 100 } #2
- #1 \c_two_hundred_fifty_five { 255 } #2
- #1 \c_two_hundred_fifty_six { 256 } #2
- #1 \c_one_thousand { 1000 } #2
- #1 \c_ten_thousand { 10000 } #2
- }
-\cs_set_protected:Npn \@@_deprecated_constants:Nn #1#2
- {
- \cs_if_free:NT #1
- { \int_const:Nn #1 {#2} }
- }
-\@@_deprecated_constants:nn { \@@_deprecated_constants:Nn } { }
-\__kernel_deprecation_code:nn
- {
- \@@_deprecated_constants:nn
- { \exp_after:wN \__kernel_deprecation_error:Nnn \exp_not:N }
- { { 2020-01-01 } }
- }
- {
- \@@_deprecated_constants:nn
- {
- \exp_after:wN \use:nnn
- \exp_after:wN \@@_constdef:Nw \exp_not:N
- }
- { \exp_stop_f: }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{variable}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\@@_value:w}
-% Made public.
-% \begin{macrocode}
-\cs_gset_eq:NN \@@_value:w \int_value:w
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Deprecated \pkg{l3luatex} functions}
-%
-% \begin{macrocode}
-%<@@=lua>
-% \end{macrocode}
-%
-% \begin{macro}[EXP, deprecated = 2020-07-01]{\lua_now_x:n, \lua_escape_x:n}
-% \begin{macro}[deprecated = 2020-07-01]{\lua_shipout_x:n}
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_now:e }
-\cs_gset:Npn \lua_now_x:n #1 { \@@_now:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_escape:e }
-\cs_gset:Npn \lua_escape_x:n #1 { \@@_escape:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_shipout_e:n }
-\cs_gset_protected:Npn \lua_shipout_x:n #1 { \@@_shipout:n {#1} }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Deprecated \pkg{l3msg} functions}
-%
-% \begin{macrocode}
-%<@@=msg>
-% \end{macrocode}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\msg_log:n, \msg_term:n}
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \iow_log:n }
-\cs_gset_protected:Npn \msg_log:n #1
- {
- \iow_log:n { ................................................. }
- \iow_wrap:nnnN { . ~ #1} { . ~ } { } \iow_log:n
- \iow_log:n { ................................................. }
- }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \iow_term:n }
-\cs_gset_protected:Npn \msg_term:n #1
- {
- \iow_term:n { ************************************************* }
- \iow_wrap:nnnN { * ~ #1} { * ~ } { } \iow_term:n
- \iow_term:n { ************************************************* }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\msg_interrupt:nnn}
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { [Defined~error~message] }
-\cs_gset_protected:Npn \msg_interrupt:nnn #1#2#3
- {
- \tl_if_empty:nTF {#3}
- {
- \@@_old_interrupt_wrap:nn { \\ \c_@@_no_info_text_tl }
- {#1 \\\\ #2 \\\\ \c_@@_continue_text_tl }
- }
- {
- \@@_old_interrupt_wrap:nn { \\ #3 }
- {#1 \\\\ #2 \\\\ \c_@@_help_text_tl }
- }
- }
-\cs_gset_protected:Npn \@@_old_interrupt_wrap:nn #1#2
- {
- \iow_wrap:nnnN {#1} { | ~ } { } \@@_old_interrupt_more_text:n
- \iow_wrap:nnnN {#2} { ! ~ } { } \@@_old_interrupt_text:n
- }
-\cs_gset_protected:Npn \@@_old_interrupt_more_text:n #1
- {
- \exp_args:Nx \tex_errhelp:D
- {
- |'''''''''''''''''''''''''''''''''''''''''''''''
- #1 \iow_newline:
- |...............................................
- }
- }
-\group_begin:
- \char_set_lccode:nn {`\{} {`\ }
- \char_set_lccode:nn {`\}} {`\ }
- \char_set_lccode:nn {`\&} {`\!}
- \char_set_catcode_active:N \&
-\tex_lowercase:D
- {
- \group_end:
- \cs_gset_protected:Npn \@@_old_interrupt_text:n #1
- {
- \iow_term:x
- {
- \iow_newline:
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- \iow_newline:
- !
- }
- \__kernel_iow_with:Nnn \tex_newlinechar:D { `\^^J }
- {
- \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
- {
- \group_begin:
- \cs_set_protected:Npn &
- {
- \tex_errmessage:D
- {
- #1
- \use_none:n
- { ............................................ }
- }
- }
- \exp_after:wN
- \group_end:
- &
- }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Deprecated \pkg{l3prg} functions}
+% \subsection{Deprecated \pkg{l3str} functions}
%
% \begin{macrocode}
-%<@@=prg>
+%<@@=str>
% \end{macrocode}
%
-% \begin{macro}[deprecated = 2020-07-01]
-% {
-% \@@_break_point:Nn,
-% \@@_break_point:,
-% \@@_map_break:Nn,
-% \@@_break:,
-% \@@_break:n
-% }
-% Made public, but used by a few third-parties. It's not possible to
-% perfectly support a mixture of \cs{@@_map_break:Nn} and
-% \cs{prg_map_break:Nn} because they use different delimiters. The
-% following code only breaks if someone tries to break from two
-% \enquote{old-style} \cs{@@_map_break:Nn} \ldots{}
-% \cs{@@_break_point:Nn} mappings in one go. Basically, the
-% \cs{@@_map_break:Nn} converts a single \cs{@@_break_point:Nn} to
-% \cs{prg_break_point:Nn}, and that delimiter had better be the right
-% one. Then we call \cs{prg_map_break:Nn} which may end up breaking
-% intermediate looks in the (unbraced) argument |#1|. It is essential
-% to define the |break_point| functions before the corresponding
-% |break| functions: otherwise \cs{debug_on:n} |{deprecation}|
-% \cs{debug_off:n} |{deprecation}| would break when trying to restore
-% the definitions because they would involve deprecated commands whose
-% definition has not yet been restored.
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break_point:Nn }
-\cs_gset:Npn \@@_break_point:Nn { \prg_break_point:Nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break_point: }
-\cs_gset:Npn \@@_break_point: { \prg_break_point: }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_map_break:Nn }
-\cs_gset:Npn \@@_map_break:Nn #1 \@@_break_point:Nn
- { \prg_map_break:Nn #1 \prg_break_point:Nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break: }
-\cs_gset:Npn \@@_break: #1 \@@_break_point: { }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break:n }
-\cs_gset:Npn \@@_break:n #1#2 \@@_break_point: {#1}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Deprecated \pkg{l3str} functions}
-%
% \begin{macro}[EXP, deprecated = 2022-07-01]
% {
% \str_lower_case:n, \str_lower_case:f,
@@ -899,27 +688,30 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP, deprecated = 2020-07-01, noTF]{\str_case_x:nn}
-% \begin{macro}[EXP, deprecated = 2020-07-01, pTF]{\str_if_eq_x:nn}
+% \begin{macro}[EXP, deprecated = 2022-07-01]
+% {\str_declare_eight_bit_encoding:nnn}
+% This command was made internal, with one more argument. There is no
+% easy way to compute a reasonable value for that extra argument so we
+% take a value that is big enough to accomodate all of Unicode.
% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nn }
-\cs_gset:Npn \str_case_x:nn { \str_case_e:nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnT }
-\cs_gset:Npn \str_case_x:nnT { \str_case_e:nnT }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnF }
-\cs_gset:Npn \str_case_x:nnF { \str_case_e:nnF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnTF }
-\cs_gset:Npn \str_case_x:nnTF { \str_case_e:nnTF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq_p:ee }
-\cs_gset:Npn \str_if_eq_x_p:nn { \str_if_eq_p:ee }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeT }
-\cs_gset:Npn \str_if_eq_x:nnT { \str_if_eq:eeT }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeF }
-\cs_gset:Npn \str_if_eq_x:nnF { \str_if_eq:eeF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeTF }
-\cs_gset:Npn \str_if_eq_x:nnTF { \str_if_eq:eeTF }
+\__kernel_patch_deprecation:nnNNpn { 2022-01-01 } { }
+\cs_gset_protected:Npn \str_declare_eight_bit_encoding:nnn #1
+ { \@@_declare_eight_bit_encoding:nnnn {#1} { 1114112 } }
% \end{macrocode}
% \end{macro}
+%
+% \subsection{Deprecated \pkg{l3seq} functions}
+%
+% \begin{macro}[EXP, deprecated = 2023-01-01]
+% {
+% \seq_indexed_map_inline:Nn, \seq_indexed_map_function:NN
+% }
+% \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2022-07-01 } { \seq_map_indexed_inline:Nn }
+\cs_gset:Npn \seq_indexed_map_inline:Nn { \seq_map_indexed_inline:Nn }
+\__kernel_patch_deprecation:nnNNpn { 2022-07-01 } { \seq_map_indexed_function:NN }
+\cs_gset:Npn \seq_indexed_map_function:NN { \seq_map_indexed_function:NN }
+% \end{macrocode}
% \end{macro}
%
% \subsubsection{Deprecated \pkg{l3tl} functions}
@@ -955,7 +747,7 @@
\group_begin:
\file_get:nnN {#3} {#2} \l_@@_internal_a_tl
#2 \scan_stop:
- \tl_set:Nx \l_@@_internal_a_tl { \l_@@_internal_a_tl }
+ \__kernel_tl_set:Nx \l_@@_internal_a_tl { \l_@@_internal_a_tl }
\exp_args:NNNo \group_end:
\tl_set:Nn #1 \l_@@_internal_a_tl
}
@@ -966,7 +758,7 @@
\group_begin:
\file_get:nnN {#3} {#2} \l_@@_internal_a_tl
#2 \scan_stop:
- \tl_gset:Nx #1 { \l_@@_internal_a_tl }
+ \__kernel_tl_gset:Nx #1 { \l_@@_internal_a_tl }
\group_end:
}
\cs_generate_variant:Nn \tl_gset_from_file_x:Nnn { c }
@@ -1001,19 +793,6 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Deprecated \pkg{l3tl-analysis} functions}
-%
-% \begin{macro}[deprecated = 2020-07-01]
-% {\tl_show_analysis:N, \tl_show_analysis:n}
-% Simple renames.
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:N }
-\cs_gset_protected:Npn \tl_show_analysis:N { \tl_analysis_show:N }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:n }
-\cs_gset_protected:Npn \tl_show_analysis:n { \tl_analysis_show:n }
-% \end{macrocode}
-% \end{macro}
-%
% \subsection{Deprecated \pkg{l3token} functions}
%
% \begin{macro}[EXP, deprecated = 2021-07-01]
@@ -1073,7 +852,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
index d474ceabd84..47f57dfb669 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
@@ -2,7 +2,7 @@
%
%% File: l3doc.dtx
%
-% Copyright (C) 1990-2020 The LaTeX3 Project
+% Copyright (C) 1990-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -31,7 +31,7 @@
\askforoverwritefalse
\preamble
-Copyright (C) 1990-2020 The LaTeX3 Project
+Copyright (C) 1990-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -57,11 +57,11 @@ and all files in that bundle must be distributed together.
%</driver>
%
%<*driver|class>
-\RequirePackage{expl3,xparse,calc}
+\RequirePackage{expl3,calc}
%</driver|class>
%
%<*driver>
-\ProvidesFile{l3doc.dtx}[2017/03/18 L3 Experimental documentation class]
+\ProvidesFile{l3doc.dtx}[2020/08/21 L3 Experimental documentation class]
\documentclass{l3doc}
\usepackage{framed,lipsum}
\begin{document}
@@ -79,7 +79,7 @@ and all files in that bundle must be distributed together.
%
% \title{The \cls{l3doc} class}
% \author{\Team}
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
% \maketitle
% \tableofcontents
%
@@ -168,7 +168,7 @@ and all files in that bundle must be distributed together.
% Furthermore, we need another \enquote{layer} of documentation commands
% to account for \enquote{user-macro} as opposed to
% \enquote{code-functions}; the \pkg{expl3} functions should be
-% documented differently, probably, to the \pkg{xparse} user macros (at
+% documented differently, probably, to the \pkg{ltcmd} user macros (at
% least in terms of indexing).
%
% In no particular order, a list of things to do:
@@ -1008,7 +1008,7 @@ and all files in that bundle must be distributed together.
\cs_new_protected:Npn \@@_trim_right:Nn #1#2
{
\cs_set:Npn \@@_tmp:w ##1 #2 ##2 \q_stop { \exp_not:n {##1} }
- \tl_set:Nx #1 { \exp_after:wN \@@_tmp:w #1 #2 \q_stop }
+ \__kernel_tl_set:Nx #1 { \exp_after:wN \@@_tmp:w #1 #2 \q_stop }
}
\cs_generate_variant:Nn \@@_trim_right:Nn { No }
% \end{macrocode}
@@ -1228,14 +1228,14 @@ and all files in that bundle must be distributed together.
\@@_if_almost_str:nTF {#1}
{
\@@_key_get_base_TF:nN {#1} \l_@@_tmpa_tl
- \tl_set:Nx #2
+ \__kernel_tl_set:Nx #2
{ \@@_split_function_do:on \l_@@_tmpa_tl { \@@_base_form_aux:nnN } }
}
{ \tl_set:Nn #2 {#1} }
}
\cs_new:Npx \@@_key_get_base_TF:nN #1#2
{
- \tl_set:Nx #2 { \exp_not:N \tl_to_str:n {#1} }
+ \__kernel_tl_set:Nx #2 { \exp_not:N \tl_to_str:n {#1} }
\tl_if_in:NoF #2 { \tl_to_str:n {:} }
{ \exp_not:N \prg_break: }
\tl_if_in:onT { #2 z } { \tl_to_str:n {TF} z }
@@ -1590,7 +1590,7 @@ and all files in that bundle must be distributed together.
% \begin{macro}{\@@_pdfstring_newline:w}
% We avoid some hyperref warnings by making |\\| (almost) trivial in
% bookmarks: more precisely it might be used with a star and an
-% optional argument, which we thus remove using an \pkg{xparse}
+% optional argument, which we thus remove using an \pkg{ltcmd}
% expandable command. Since there cannot be trailing optional
% arguments, pick up an extra mandatory one and put it back.
% \begin{macrocode}
@@ -1992,7 +1992,7 @@ and all files in that bundle must be distributed together.
\verbatim@font
\@@_if_almost_str:VT \l_@@_cmd_tl
{
- \tl_set:Nx \l_@@_cmd_tl { \tl_to_str:N \l_@@_cmd_tl }
+ \__kernel_tl_set:Nx \l_@@_cmd_tl { \tl_to_str:N \l_@@_cmd_tl }
\bool_if:NT \g_@@_cs_break_bool
{
\regex_replace_all:nnN
@@ -2012,14 +2012,14 @@ and all files in that bundle must be distributed together.
{
\quark_if_no_value:NF \l_@@_cmd_index_tl
{
- \tl_set:Nx \l_@@_cmd_tl
+ \__kernel_tl_set:Nx \l_@@_cmd_tl
{ \c_backslash_str \exp_not:o { \l_@@_cmd_index_tl } }
}
\exp_args:No \@@_key_get:n { \l_@@_cmd_tl }
\quark_if_no_value:NF \l_@@_cmd_module_tl
{
- \tl_set:Nx \l_@@_index_module_tl
+ \__kernel_tl_set:Nx \l_@@_index_module_tl
{ \tl_to_str:N \l_@@_cmd_module_tl }
}
\@@_special_index_module:ooonN
@@ -2134,7 +2134,7 @@ and all files in that bundle must be distributed together.
% \begin{macrocode}
\cs_new_protected:Npn \@@_get_hyper_target:nN #1#2
{
- \tl_set:Nx #2 { \tl_to_str:n {#1} }
+ \__kernel_tl_set:Nx #2 { \tl_to_str:n {#1} }
\tl_replace_all:Nxn #2 { \c_underscore_str } { / }
\tl_remove_all:Nx #2 { \c_backslash_str }
\tl_put_left:Nn #2 { doc/function// }
@@ -2157,7 +2157,7 @@ and all files in that bundle must be distributed together.
% \begin{macrocode}
\cs_new_protected:Npn \@@_names_get_seq:nN #1#2
{
- \tl_set:Nx \l_@@_tmpa_tl { \tl_to_str:n {#1} }
+ \__kernel_tl_set:Nx \l_@@_tmpa_tl { \tl_to_str:n {#1} }
\bool_if:NTF \l_@@_names_verb_bool
{
\seq_clear:N #2
@@ -2932,7 +2932,7 @@ and all files in that bundle must be distributed together.
%
% \begin{macro}{\@@_macro:nnw}
% The arguments are a key--value list of \meta{options} and a
-% comma-list of \meta{names}, read verbatim by \pkg{xparse}. First
+% comma-list of \meta{names}, read verbatim by \pkg{ltcmd}. First
% initialize some variables before applying the \meta{options}, then
% parse the \meta{names} to get a sequence of macro names, then apply
% \cs{@@_macro_single:nNN} to each (this step is more subtle than
@@ -3045,7 +3045,7 @@ and all files in that bundle must be distributed together.
\l_@@_macro_do_not_index_tl
\exp_args:NNV \seq_set_from_clist:Nn
\l_@@_tmpa_seq \l_@@_macro_do_not_index_tl
- \tl_set:Nx \l_@@_macro_do_not_index_tl
+ \__kernel_tl_set:Nx \l_@@_macro_do_not_index_tl
{ \seq_use:Nn \l_@@_tmpa_seq { , } }
\exp_args:NV \DoNotIndex \l_@@_macro_do_not_index_tl
}
@@ -3154,7 +3154,10 @@ and all files in that bundle must be distributed together.
\vbox_set:Nn \l_@@_macro_box
{
\vbox_unpack_drop:N \l_@@_macro_box
- \hbox { \llap { \@@_print_macroname:nN {#1} #2 \ } }
+ \hbox { \llap { \__codedoc_print_macroname:nN {#1} #2
+ \MacroFont % <----- without it the \ is in lmr10 if a link is made
+ \
+ } }
}
\int_incr:N \l_@@_macro_int
}
@@ -3368,7 +3371,7 @@ and all files in that bundle must be distributed together.
{
\seq_set_map:NNn \l_@@_tmpa_seq
\g_@@_nested_names_seq
- { \exp_not:n { \@@_macro_end_wrap_item:n {##1} } }
+ { \@@_macro_end_wrap_item:n {##1} }
End~ definition~ for~
\int_compare:nTF { \seq_count:N \l_@@_tmpa_seq <= 3 }
{
@@ -3716,7 +3719,7 @@ and all files in that bundle must be distributed together.
{ \cs_set:Npn \currentfile{#1.dtx} }
\int_compare:nNnTF \@auxout = \@partaux
{ \@latexerr{\string\include\space cannot~be~nested}\@eha }
- { \@docinclude #1 }
+ { \@docinclude {#1} }
}
% \end{macrocode}
%
@@ -3750,7 +3753,7 @@ and all files in that bundle must be distributed together.
{
\cs_set_eq:NN \ttfamily\relax
\cs_gset:Npx \filekey
- { \filekey, \thepart = { \ttfamily \currentfile } }
+ { \filekey,~ \thepart = { \ttfamily \currentfile } }
}
\DocInput{\currentfile}
\cs_set_eq:NN \PrintIndex \@ltxdoc@PrintIndex
@@ -4225,7 +4228,7 @@ and all files in that bundle must be distributed together.
% \begin{macrocode}
\cs_new_protected:Npn \@@_special_index_set:Nn #1#2
{
- \tl_set:Nx #1 { \tl_to_str:n {#2} }
+ \__kernel_tl_set:Nx #1 { \tl_to_str:n {#2} }
\@@_if_almost_str:nTF {#2}
{
\tl_replace_all:Non #1 { \tl_to_str:n { __ } }
@@ -4243,7 +4246,7 @@ and all files in that bundle must be distributed together.
\token_to_str:N \verb * \verbatimchar
}
}
- \tl_set:Nx #1
+ \__kernel_tl_set:Nx #1
{
\token_to_str:N \verb * \verbatimchar
#1 \verbatimchar
@@ -4294,7 +4297,7 @@ and all files in that bundle must be distributed together.
\cs_new_protected:Npn \@@_key_get:n #1
{
\@@_key_get_base:nN {#1} \l_@@_index_macro_tl
- \tl_set:Nx \l_@@_index_key_tl
+ \__kernel_tl_set:Nx \l_@@_index_key_tl
{ \tl_to_str:N \l_@@_index_macro_tl }
\tl_clear:N \l_@@_index_module_tl
\tl_if_in:NoTF \l_@@_index_key_tl { \tl_to_str:n { __ } }
@@ -4317,7 +4320,7 @@ and all files in that bundle must be distributed together.
}
\cs_new_protected:Npn \@@_key_pop:
{
- \tl_set:Nx \l_@@_index_key_tl
+ \__kernel_tl_set:Nx \l_@@_index_key_tl
{ \tl_tail:N \l_@@_index_key_tl }
}
% \end{macrocode}
@@ -4332,7 +4335,7 @@ and all files in that bundle must be distributed together.
{
\cs_set:Npn \@@_tmpa:w ##1 #1 ##2 \q_stop
{ \exp_not:n {##1} }
- \tl_set:Nx \l_@@_index_module_tl
+ \__kernel_tl_set:Nx \l_@@_index_module_tl
{ \exp_after:wN \@@_tmpa:w \l_@@_index_module_tl #1 \q_stop }
}
\cs_new_protected:Npn \@@_key_drop_underscores:
@@ -4393,7 +4396,7 @@ and all files in that bundle must be distributed together.
{
\seq_set_split:NoV \l_@@_tmpa_seq
{ \token_to_str:N _ } \l_@@_index_key_tl
- \tl_set:Nx \l_@@_index_module_tl
+ \__kernel_tl_set:Nx \l_@@_index_module_tl
{
\int_case:nnF { \seq_count:N \l_@@_tmpa_seq }
{
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
index 1e7a512c56a..c0b1db04876 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
@@ -2,7 +2,7 @@
%
%% File l3dosctrip.dtx
%
-% Copyright (C) 2012,2014-2020 The LaTeX3 Project
+% Copyright (C) 2012,2014-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -55,7 +55,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
index f356ac22dfc..c4de266f4e9 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
@@ -2,7 +2,7 @@
%
%% File: l3expan.dtx
%
-% Copyright (C) 1990-2020 The LaTeX3 Project
+% Copyright (C) 1990-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -504,6 +504,7 @@
% {
% \exp_args:NNNo,
% \exp_args:NNNV,
+% \exp_args:NNNv,
% \exp_args:Nccc,
% \exp_args:NcNc,
% \exp_args:NcNo,
@@ -937,7 +938,7 @@
% \section{\pkg{l3expan} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -1365,7 +1366,8 @@
%
% \begin{macro}[EXP]
% {
-% \exp_args:NNNV, \exp_args:NcNc, \exp_args:NcNo,
+% \exp_args:NNNV, \exp_args:NNNv,
+% \exp_args:NcNc, \exp_args:NcNo,
% \exp_args:Ncco,
% }
% A few more that we can hand-tune.
@@ -1377,6 +1379,13 @@
\exp_after:wN #3
\exp_after:wN { \exp:w \@@_eval_register:N #4 }
}
+\cs_new:Npn \exp_args:NNNv #1#2#3#4
+ {
+ \exp_after:wN #1
+ \exp_after:wN #2
+ \exp_after:wN #3
+ \exp_after:wN { \exp:w \@@_eval_register:c {#4} }
+ }
\cs_new:Npn \exp_args:NcNc #1#2#3#4
{
\exp_after:wN #1
@@ -2165,6 +2174,35 @@
%<@@=cs>
% \end{macrocode}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks. No \pkg{l3quark} yet, so do things by hand.
+% \begin{macrocode}
+\cs_new_eq:NN \s_@@_mark \scan_stop:
+\cs_new_eq:NN \s_@@_stop \scan_stop:
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_recursion_stop}
+% Internal recursion quarks. No \pkg{l3quark} yet, so do things by hand.
+% \begin{macrocode}
+\cs_new:Npn \q_@@_recursion_stop { \q_@@_recursion_stop }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{
+% \@@_use_none_delimit_by_s_stop:w,
+% \@@_use_i_delimit_by_s_stop:nw,
+% \@@_use_none_delimit_by_q_recursion_stop:w
+% }
+% Internal scan marks.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+\cs_new:Npn \@@_use_none_delimit_by_q_recursion_stop:w
+ #1 \q_@@_recursion_stop { }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\cs_generate_variant:Nn, \cs_generate_variant:cn}
% \begin{arguments}
% \item Base form of a function; \emph{e.g.},~\cs{tl_set:Nn}
@@ -2189,7 +2227,7 @@
\exp_not:N #1
\tl_to_str:n {#2} ,
\exp_not:N \scan_stop: ,
- \exp_not:N \q_recursion_stop
+ \exp_not:N \q_@@_recursion_stop
}
}
\cs_new_protected:Npn \cs_generate_variant:cn
@@ -2217,7 +2255,7 @@
% \verb*|\protected |, \verb*|\protected\long |, |\first|, |\top|,
% |\bot|, |\splittop|, or |\splitbot|, with |\| replaced by the
% appropriate escape character. If |pr| appears in the part before
-% |ma|, the first \cs{q_mark} is taken as an argument of the |wwNw|
+% |ma|, the first \cs{s_@@_mark} is taken as an argument of the |wwNw|
% auxiliary, and |#3| is \cs{cs_new_protected:Npx}, otherwise it
% is \cs{cs_new:Npx}.
% \begin{macrocode}
@@ -2229,20 +2267,20 @@
\exp_not:N \else:
\exp_not:N \exp_after:wN \exp_not:N \@@_generate_variant:ww
\exp_not:N \token_to_meaning:N #1 \tl_to_str:n { ma }
- \exp_not:N \q_mark
- \exp_not:N \q_mark \cs_new_protected:Npx
+ \s_@@_mark
+ \s_@@_mark \cs_new_protected:Npx
\tl_to_str:n { pr }
- \exp_not:N \q_mark \cs_new:Npx
- \exp_not:N \q_stop
+ \s_@@_mark \cs_new:Npx
+ \s_@@_stop
\exp_not:N \fi:
}
\exp_last_unbraced:NNNNo
\cs_new_protected:Npn \@@_generate_variant:ww
- #1 { \tl_to_str:n { ma } } #2 \q_mark
+ #1 { \tl_to_str:n { ma } } #2 \s_@@_mark
{ \@@_generate_variant:wwNw #1 }
\exp_last_unbraced:NNNNo
\cs_new_protected:Npn \@@_generate_variant:wwNw
- #1 { \tl_to_str:n { pr } } #2 \q_mark #3 #4 \q_stop
+ #1 { \tl_to_str:n { pr } } #2 \s_@@_mark #3 #4 \s_@@_stop
{ \cs_set_eq:NN \@@_tmp:w #3 }
% \end{macrocode}
% \end{macro}
@@ -2265,7 +2303,7 @@
\if_meaning:w \c_false_bool #3
\__kernel_msg_error:nnx { kernel } { missing-colon }
{ \token_to_str:c {#1} }
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\fi:
\@@_generate_variant:Nnnw #4 {#1}{#2}
}
@@ -2312,8 +2350,8 @@
% We compare the base and variant signatures one character at a time
% within |x|-expansion. The result is given to
% \cs{@@_generate_variant:wwNN} (defined later) in the form
-% \meta{processed variant signature} \cs{q_mark} \meta{errors}
-% \cs{q_stop} \meta{base function} \meta{new function}. If all went
+% \meta{processed variant signature} \cs{s_@@_mark} \meta{errors}
+% \cs{s_@@_stop} \meta{base function} \meta{new function}. If all went
% well, \meta{errors} is empty; otherwise, it is a kernel error
% message and some clean-up code.
%
@@ -2325,7 +2363,7 @@
\cs_new_protected:Npn \@@_generate_variant:Nnnw #1#2#3#4 ,
{
\if_meaning:w \scan_stop: #4
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\fi:
\use:x
{
@@ -2333,11 +2371,11 @@
\@@_generate_variant_loop:nNwN { }
#4
\@@_generate_variant_loop_end:nwwwNNnn
- \q_mark
+ \s_@@_mark
#3 ~
{ ~ { } \fi: \@@_generate_variant_loop_long:wNNnn } ~
{ }
- \q_stop
+ \s_@@_stop
\exp_not:N #1 {#2} {#4}
}
\@@_generate_variant:Nnnw #1 {#2} {#3}
@@ -2407,7 +2445,7 @@
% argument: this empty brace group produces the correct signature for
% the full variant.
% \begin{macrocode}
-\cs_new:Npn \@@_generate_variant_loop:nNwN #1#2#3 \q_mark #4
+\cs_new:Npn \@@_generate_variant_loop:nNwN #1#2#3 \s_@@_mark #4
{
\if:w #2 #4
\exp_after:wN \@@_generate_variant_loop_same:w
@@ -2426,7 +2464,7 @@
#1
\prg_do_nothing:
#2
- \@@_generate_variant_loop:nNwN { } #3 \q_mark
+ \@@_generate_variant_loop:nNwN { } #3 \s_@@_mark
}
\cs_new:Npn \@@_generate_variant_loop_base:N #1
{
@@ -2454,46 +2492,45 @@
#1 \prg_do_nothing: #2#3#4
{ #3 { #1 \@@_generate_variant_same:N #2 } }
\cs_new:Npn \@@_generate_variant_loop_end:nwwwNNnn
- #1#2 \q_mark #3 ~ #4 \q_stop #5#6#7#8
+ #1#2 \s_@@_mark #3 ~ #4 \s_@@_stop #5#6#7#8
{
\scan_stop: \scan_stop: \fi:
- \exp_not:N \q_mark
- \exp_not:N \q_stop
+ \s_@@_mark \s_@@_stop
\exp_not:N #6
\exp_not:c { #7 : #8 #1 #3 }
}
-\cs_new:Npn \@@_generate_variant_loop_long:wNNnn #1 \q_stop #2#3#4#5
+\cs_new:Npn \@@_generate_variant_loop_long:wNNnn #1 \s_@@_stop #2#3#4#5
{
\exp_not:n
{
- \q_mark
+ \s_@@_mark
\__kernel_msg_error:nnxx { kernel } { variant-too-long }
{#5} { \token_to_str:N #3 }
\use_none:nnn
- \q_stop
+ \s_@@_stop
#3
#3
}
}
\cs_new:Npn \@@_generate_variant_loop_invalid:NNwNNnn
- #1#2 \fi: \fi: \fi: #3 \q_stop #4#5#6#7
+ #1#2 \fi: \fi: \fi: #3 \s_@@_stop #4#5#6#7
{
\fi: \fi: \fi:
\exp_not:n
{
- \q_mark
+ \s_@@_mark
\__kernel_msg_error:nnxxxx { kernel } { invalid-variant }
{#7} { \token_to_str:N #5 } {#1} {#2}
\use_none:nnn
- \q_stop
+ \s_@@_stop
#5
#5
}
}
\cs_new:Npn \@@_generate_variant_loop_special:NNwNNnn
- #1#2#3 \q_stop #4#5#6#7
+ #1#2#3 \s_@@_stop #4#5#6#7
{
- #3 \q_stop #4 #5 {#6} {#7}
+ #3 \s_@@_stop #4 #5 {#6} {#7}
\exp_not:n
{
\__kernel_msg_error:nnxxxx
@@ -2534,7 +2571,7 @@
% combining the |\exp_args:N #3| variant and the base function.
% \begin{macrocode}
\cs_new_protected:Npn \@@_generate_variant:wwNN
- #1 \q_mark #2 \q_stop #3#4
+ #1 \s_@@_mark #2 \s_@@_stop #3#4
{
#2
\cs_if_free:NT #4
@@ -2568,20 +2605,20 @@
\cs_new_protected:Npx \@@_generate_internal_variant:n #1
{
\exp_not:N \@@_generate_internal_variant:wwnNwn
- #1 \exp_not:N \q_mark
+ #1 \s_@@_mark
{ \cs_set_eq:NN \exp_not:N \@@_tmp:w \cs_new_protected:Npx }
\cs_new_protected:cpn
\use:x
- \token_to_str:N x \exp_not:N \q_mark
+ \token_to_str:N x \s_@@_mark
{ }
\cs_new:cpn
\exp_not:N \tex_expanded:D
- \exp_not:N \q_stop
+ \s_@@_stop
{#1}
}
\exp_last_unbraced:NNNNo
\cs_new_protected:Npn \@@_generate_internal_variant:wwnNwn #1
- { \token_to_str:N x } #2 \q_mark #3#4#5#6 \q_stop #7
+ { \token_to_str:N x } #2 \s_@@_mark #3#4#5#6 \s_@@_stop #7
{
#3
\cs_if_free:cT { exp_args:N #7 }
@@ -2600,7 +2637,7 @@
\exp_after:wN \@@_generate_internal_test_aux:w \exp_after:wN #1
\fi:
##3
- \q_mark
+ \s_@@_mark
{
\use:x
{
@@ -2609,12 +2646,12 @@
}
}
#1
- \q_mark
+ \s_@@_mark
{ \exp_not:n { \@@_generate_internal_one_go:NNn ##1 ##2 {##3} } }
- \q_stop
+ \s_@@_stop
}
\cs_new_protected:Npn \@@_generate_internal_test_aux:w
- ##1 #1 ##2 \q_mark ##3 ##4 \q_stop {##3}
+ ##1 #1 ##2 \s_@@_mark ##3 ##4 \s_@@_stop {##3}
\cs_if_exist:NTF \tex_expanded:D
{
\cs_new_eq:NN \@@_generate_internal_test:Nw
@@ -2722,20 +2759,20 @@
\if_meaning:w \c_false_bool #3
\__kernel_msg_error:nnx { kernel } { missing-colon }
{ \token_to_str:c {#1} }
- \use_i_delimit_by_q_stop:nw
+ \@@_use_i_delimit_by_s_stop:nw
\fi:
\exp_after:wN \@@_generate_variant:w
- \tl_to_str:n {#5} , \scan_stop: , \q_recursion_stop
- \use_none_delimit_by_q_stop:w \q_mark {#1} {#2} {#4} \q_stop
+ \tl_to_str:n {#5} , \scan_stop: , \q_@@_recursion_stop
+ \@@_use_none_delimit_by_s_stop:w \s_@@_mark {#1} {#2} {#4} \s_@@_stop
}
\cs_new_protected:Npn \@@_generate_variant:w
- #1 , #2 \q_mark #3#4#5
+ #1 , #2 \s_@@_mark #3#4#5
{
\if_meaning:w \scan_stop: #1 \scan_stop:
- \if_meaning:w \q_nil #1 \q_nil
+ \if_meaning:w \q_@@_nil #1 \q_@@_nil
\use_i:nnn
\fi:
- \exp_after:wN \use_none_delimit_by_q_recursion_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_q_recursion_stop:w
\else:
\cs_if_exist_use:cTF { @@_generate_variant_#1_form:nnn }
{ {#3} {#4} {#5} }
@@ -2745,7 +2782,7 @@
{#1} { \token_to_str:c { #3 : #4 } }
}
\fi:
- \@@_generate_variant:w #2 \q_mark {#3} {#4} {#5}
+ \@@_generate_variant:w #2 \s_@@_mark {#3} {#4} {#5}
}
\cs_new_protected:Npn \@@_generate_variant_p_form:nnn #1#2
{ \cs_generate_variant:cn { #1 _p : #2 } }
@@ -2881,7 +2918,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
index 51506ece3c1..76c21c537e7 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
@@ -2,7 +2,7 @@
%
%% File: l3file.dtx
%
-% Copyright (C) 1990-2020 The LaTeX3 Project
+% Copyright (C) 1990-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -548,7 +548,7 @@
% The maximum number of characters in a line to be written
% by the \cs{iow_wrap:nnnN}
% function. This value depends on the \TeX{} system in use: the standard
-% value is $78$, which is typically correct for unmodified \TeX{}live
+% value is $78$, which is typically correct for unmodified \TeX{} Live
% and \hologo{MiKTeX} systems.
% \end{variable}
%
@@ -677,7 +677,7 @@
% If the file is not found on the path, the expansion is empty.
% \end{function}
%
-% \begin{function}[added = 2017-06-23, updated = 2017-06-26]
+% \begin{function}[added = 2017-06-23, updated = 2020-06-24]
% {\file_parse_full_name:nNNN, \file_parse_full_name:VNNN}
% \begin{syntax}
% \cs{file_parse_full_name:nNNN} \Arg{full name} \meta{dir} \meta{name} \meta{ext}
@@ -697,9 +697,28 @@
% \item The \meta{ext}: everything after the last |.| (including the dot).
% The \meta{ext} is empty if there is no |.| after the last |/|.
% \end{itemize}
-% This function does not expand the \meta{full name} before turning it
-% to a string. It assume that the \meta{full name} either contains no
-% quote (|"|) characters or is surrounded by a pair of quotes.
+%
+% Before parsing, the \meta{full name} is expanded until only non-expandable
+% tokens remain, except that active characters are also not expanded.
+% Quotes (|"|) are invalid in file names and are discarded from the input.
+% \end{function}
+%
+% \begin{function}[EXP, added = 2020-06-24]{\file_parse_full_name:n}
+% \begin{syntax}
+% \cs{file_parse_full_name:n} \Arg{full name}
+% \end{syntax}
+% Parses the \meta{full name} as described for \cs{file_parse_full_name:nNNN},
+% and leaves \meta{dir}, \meta{name}, and \meta{ext} in the input stream,
+% each inside a pair of braces.
+% \end{function}
+%
+% \begin{function}[EXP, added = 2020-06-24]{\file_parse_full_name_apply:nN}
+% \begin{syntax}
+% \cs{file_parse_full_name_apply:nN} \Arg{full name} \meta{function}
+% \end{syntax}
+% Parses the \meta{full name} as described for \cs{file_parse_full_name:nNNN},
+% and passes \meta{dir}, \meta{name}, and \meta{ext} as arguments to \meta{function},
+% as an \texttt{n}-type argument each, in this order.
% \end{function}
%
% \begin{function}[rEXP, added = 2019-11-19]
@@ -752,7 +771,7 @@
% \cs{file_get_mdfive_hash:nN} \Arg{file name} \meta{tl var}
% \end{syntax}
% Sets the \meta{tl var} to the result of applying
-% \cs{file_mdfive_hash:n} to the \meta{file}. If the file is not found,
+% \cs{file_mdfive_hash:n} to the \meta{file}. If the file is not found,
% the \meta{tl var} will be set to \cs{q_no_value}.
% \end{function}
%
@@ -772,7 +791,7 @@
% \cs{file_get_size:nN} \Arg{file name} \meta{tl var}
% \end{syntax}
% Sets the \meta{tl var} to the result of applying
-% \cs{file_size:n} to the \meta{file}. If the file is not found,
+% \cs{file_size:n} to the \meta{file}. If the file is not found,
% the \meta{tl var} will be set to \cs{q_no_value}.
% This is not available in older versions of \XeTeX{}.
% \end{function}
@@ -798,7 +817,7 @@
% \cs{file_get_timestamp:nN} \Arg{file name} \meta{tl var}
% \end{syntax}
% Sets the \meta{tl var} to the result of applying
-% \cs{file_timestamp:n} to the \meta{file}. If the file is not found,
+% \cs{file_timestamp:n} to the \meta{file}. If the file is not found,
% the \meta{tl var} will be set to \cs{q_no_value}.
% This is not available in older versions of \XeTeX{}.
% \end{function}
@@ -891,7 +910,7 @@
% \TestFiles{m3file001}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \subsection{Input operations}
@@ -920,16 +939,9 @@
%
% \begin{variable}{\g_@@_streams_seq}
% A list of the currently-available input streams to be used as a
-% stack. In format mode, all streams (from $0$ to~$15$) are
-% available, while the package requests streams to \LaTeXe{} as they
-% are needed (initially none are needed), so the starting point
-% varies!
+% stack.
% \begin{macrocode}
\seq_new:N \g_@@_streams_seq
-%<*initex>
-\seq_gset_split:Nnn \g_@@_streams_seq { , }
- { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 }
-%</initex>
% \end{macrocode}
% \end{variable}
%
@@ -951,7 +963,6 @@
% it holds the value of the \emph{last} stream allocated.
% \begin{macrocode}
\prop_new:N \g_@@_streams_prop
-%<*package>
\int_step_inline:nnn
{ 0 }
{
@@ -965,7 +976,6 @@
{
\prop_gput:Nnn \g_@@_streams_prop {#1} { Reserved~by~format }
}
-%</package>
% \end{macrocode}
% \end{variable}
%
@@ -1024,7 +1034,7 @@
% \end{macro}
%
% \begin{macro}{\@@_new:N}
-% In package mode, streams are reserved using \tn{newread} before they
+% Streams are reserved using \tn{newread} before they
% can be managed by \pkg{ior}. To prevent \pkg{ior} from being
% affected by redefinitions of \tn{newread} (such as done by the
% third-party package \pkg{morewrites}), this macro is saved here
@@ -1034,7 +1044,6 @@
% that \tn{newread} works like our own: it actually checks before
% altering definition.
% \begin{macrocode}
-%<*package>
\exp_args:NNf \cs_new_protected:Npn \@@_new:N
{ \exp_args:NNc \exp_after:wN \exp_stop_f: { newread } }
\cs_if_exist:NT \normalend
@@ -1046,15 +1055,13 @@
\@@_new_aux:N #1
}
}
-%</package>
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\__kernel_ior_open:Nn, \__kernel_ior_open:No}
% \begin{macro}{\@@_open_stream:Nn}
% The stream allocation itself uses the fact that there is a list of all of
-% those available, so allocation is simply a question of using the number at
-% the top of the list. In package mode, life gets more complex as it's
+% those available. Life gets more complex as it's
% important to keep things in sync. That is done using a two-part approach:
% any streams that have already been taken up by \pkg{ior} but are now free
% are tracked, so we first try those. If that fails, ask plain \TeX{} or \LaTeXe{}
@@ -1065,16 +1072,11 @@
\ior_close:N #1
\seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl
{ \@@_open_stream:Nn #1 {#2} }
-%<*initex>
- { \__kernel_msg_fatal:nn { kernel } { input-streams-exhausted } }
-%</initex>
-%<*package>
{
\@@_new:N #1
- \tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} }
+ \__kernel_tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} }
\@@_open_stream:Nn #1 {#2}
}
-%</package>
}
\cs_generate_variant:Nn \__kernel_ior_open:Nn { No }
% \end{macrocode}
@@ -1373,20 +1375,9 @@
%
% \begin{variable}{\g_@@_streams_seq}
% A list of the currently-available output streams to be used as a
-% stack. The stream $18$ is special, as \tn{write}18 is used to
-% denote commands to be sent to the OS\@.
+% stack.
% \begin{macrocode}
\seq_new:N \g_@@_streams_seq
-%<*initex>
-\exp_args:Nnx \use:n
- { \seq_gset_split:Nnn \g_@@_streams_seq { } }
- {
- \int_step_function:nnN { 0 } { \c_term_iow }
- \prg_do_nothing:
- }
-\int_compare:nNnF \c_term_iow < { 18 }
- { \seq_gremove_all:Nn \g_@@_streams_seq { 18 } }
-%</initex>
% \end{macrocode}
% \end{variable}
%
@@ -1402,7 +1393,6 @@
% check on.
% \begin{macrocode}
\prop_new:N \g_@@_streams_prop
-%<*package>
\int_step_inline:nnn
{ 0 }
{
@@ -1416,7 +1406,30 @@
{
\prop_gput:Nnn \g_@@_streams_prop {#1} { Reserved~by~format }
}
-%</package>
+% \end{macrocode}
+% \end{variable}
+%
+% \subsubsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_i_delimit_by_s_stop:nw}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_nil}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
% \end{macrocode}
% \end{variable}
%
@@ -1440,13 +1453,11 @@
% \end{variable}
%
% \begin{macro}{\@@_new:N}
-% As for read streams, copy \tn{newwrite} in package mode, making sure
+% As for read streams, copy \tn{newwrite}, making sure
% that it is not \tn{outer}.
% \begin{macrocode}
-%<*package>
\exp_args:NNf \cs_new_protected:Npn \@@_new:N
{ \exp_args:NNc \exp_after:wN \exp_stop_f: { newwrite } }
-%</package>
% \end{macrocode}
% \end{macro}
%
@@ -1464,21 +1475,16 @@
% \begin{macrocode}
\cs_new_protected:Npn \iow_open:Nn #1#2
{
- \tl_set:Nx \l_@@_file_name_tl
+ \__kernel_tl_set:Nx \l_@@_file_name_tl
{ \__kernel_file_name_sanitize:n {#2} }
\iow_close:N #1
\seq_gpop:NNTF \g_@@_streams_seq \l_@@_stream_tl
{ \@@_open_stream:NV #1 \l_@@_file_name_tl }
-%<*initex>
- { \__kernel_msg_fatal:nn { kernel } { output-streams-exhausted } }
-%</initex>
-%<*package>
{
\@@_new:N #1
- \tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} }
+ \__kernel_tl_set:Nx \l_@@_stream_tl { \int_eval:n {#1} }
\@@_open_stream:NV #1 \l_@@_file_name_tl
}
-%</package>
}
\cs_generate_variant:Nn \iow_open:Nn { c }
\cs_new_protected:Npn \@@_open_stream:Nn #1#2
@@ -1641,7 +1647,7 @@
% This is the \enquote{raw} number of characters in a line which
% can be written to the terminal.
% The standard value is the line length typically used by
-% \TeX{}Live and \hologo{MiKTeX}.
+% \TeX{} Live and \hologo{MiKTeX}.
% \begin{macrocode}
\int_new:N \l_iow_line_count_int
\int_set:Nn \l_iow_line_count_int { 78 }
@@ -1678,7 +1684,7 @@
\cs_new:Npn \@@_unindent:w { }
\cs_new_protected:Npn \@@_set_indent:n #1
{
- \tl_set:Nx \l_@@_one_indent_tl
+ \__kernel_tl_set:Nx \l_@@_one_indent_tl
{ \exp_args:No \__kernel_str_to_other_fast:n { \tl_to_str:n {#1} } }
\int_set:Nn \l_@@_one_indent_int
{ \str_count:N \l_@@_one_indent_tl }
@@ -1833,7 +1839,7 @@
\cs_new_protected:Npn \iow_wrap:nnnN #1#2#3#4
{
\group_begin:
-%<package> \cs_if_exist_use:N \conditionally@traceoff
+ \cs_if_exist_use:N \conditionally@traceoff
\int_set:Nn \tex_escapechar:D { -1 }
\cs_set:Npx \{ { \token_to_str:N \{ }
\cs_set:Npx \# { \token_to_str:N \# }
@@ -1854,8 +1860,8 @@
% definition: it only works in the first argument of
% \cs{iow_wrap:nnnN}.
% \begin{macrocode}
-%<package> \cs_set_eq:NN \protect \token_to_str:N
- \tl_set:Nx \l_@@_wrap_tl {#1}
+ \cs_set_eq:NN \protect \token_to_str:N
+ \__kernel_tl_set:Nx \l_@@_wrap_tl {#1}
\cs_set_eq:NN \iow_allow_break: \@@_allow_break_error:
\cs_set_eq:NN \iow_indent:n \@@_indent_error:n
% \end{macrocode}
@@ -1863,8 +1869,8 @@
% then convert to a string) and initialize the target count for lines
% (the first line has target count \cs{l_iow_line_count_int} instead).
% \begin{macrocode}
- \tl_set:Nx \l_@@_newline_tl { \iow_newline: #2 }
- \tl_set:Nx \l_@@_newline_tl { \tl_to_str:N \l_@@_newline_tl }
+ \__kernel_tl_set:Nx \l_@@_newline_tl { \iow_newline: #2 }
+ \__kernel_tl_set:Nx \l_@@_newline_tl { \tl_to_str:N \l_@@_newline_tl }
\int_set:Nn \l_@@_line_target_int
{ \l_iow_line_count_int - \str_count:N \l_@@_newline_tl + 1 }
% \end{macrocode}
@@ -1904,23 +1910,23 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_wrap_do:
{
- \tl_set:Nx \l_@@_wrap_tl
+ \__kernel_tl_set:Nx \l_@@_wrap_tl
{
\exp_args:No \__kernel_str_to_other_fast:n \l_@@_wrap_tl
\c_@@_wrap_end_marker_tl
}
- \tl_set:Nx \l_@@_wrap_tl
+ \__kernel_tl_set:Nx \l_@@_wrap_tl
{
\exp_after:wN \@@_wrap_fix_newline:w \l_@@_wrap_tl
- ^^J \q_nil ^^J \q_stop
+ ^^J \q_@@_nil ^^J \s_@@_stop
}
\exp_after:wN \@@_wrap_start:w \l_@@_wrap_tl
}
\cs_new:Npn \@@_wrap_fix_newline:w #1 ^^J #2 ^^J
{
#1
- \if_meaning:w \q_nil #2
- \use_i_delimit_by_q_stop:nw
+ \if_meaning:w \q_@@_nil #2
+ \@@_use_i_delimit_by_s_stop:nw
\fi:
\c_@@_wrap_newline_marker_tl
\@@_wrap_fix_newline:w #2 ^^J
@@ -1970,7 +1976,7 @@
}
{ \@@_wrap_line:nw { } ##1 ; }
##2 #1
- \@@_wrap_end_chunk:w 7 6 5 4 3 2 1 0 \q_stop
+ \@@_wrap_end_chunk:w 7 6 5 4 3 2 1 0 \s_@@_stop
}
}
\cs_new_protected:Npn \@@_wrap_next:nw ##1##2 #1
@@ -2066,7 +2072,7 @@
\@@_wrap_next_line:w
}
\cs_new:Npn \@@_wrap_end_chunk:w
- #1 \int_eval:w #2 - #3 ; #4#5 \q_stop
+ #1 \int_eval:w #2 - #3 ; #4#5 \s_@@_stop
{
\if_false: { \fi: }
\exp_args:Nf \@@_wrap_next:nw { \int_eval:n { #2 - #4 } }
@@ -2111,14 +2117,14 @@
\l_@@_line_part_tl
#1
{ ? \@@_wrap_break_end:w }
- \q_mark
+ \s_@@_mark
}
\cs_new:Npn \@@_wrap_break_first:w ##1 #1 ##2
{
\use_none:nn ##2 \@@_wrap_break_none:w
\@@_wrap_break_loop:w ##1 #1 ##2
}
- \cs_new:Npn \@@_wrap_break_none:w ##1##2 #1 ##3 \q_mark ##4 #1
+ \cs_new:Npn \@@_wrap_break_none:w ##1##2 #1 ##3 \s_@@_mark ##4 #1
{
\tl_if_empty:NTF \l_@@_line_tl
{ ##2 ##4 \@@_wrap_line_end:nw { } }
@@ -2130,7 +2136,7 @@
##1 #1
\@@_wrap_break_loop:w ##2 #1 ##3
}
- \cs_new:Npn \@@_wrap_break_end:w ##1 #1 ##2 ##3 #1 ##4 \q_mark
+ \cs_new:Npn \@@_wrap_break_end:w ##1 #1 ##2 ##3 #1 ##4 \s_@@_mark
{ ##1 \@@_wrap_line_end:nw { } ##3 }
}
\exp_args:NV \@@_tmp:w \c_catcode_other_space_tl
@@ -2144,7 +2150,7 @@
% call \cs{@@_wrap_line:nw} to find characters for the next line
% (remembering to account for the indentation).
% \begin{macrocode}
-\cs_new_protected:Npn \@@_wrap_next_line:w #1#2 \q_stop
+\cs_new_protected:Npn \@@_wrap_next_line:w #1#2 \s_@@_stop
{
\tl_clear:N \l_@@_line_tl
\token_if_eq_meaning:NNTF #1 \@@_wrap_end_chunk:w
@@ -2157,7 +2163,7 @@
\@@_wrap_line:nw
{ \l_@@_indent_tl }
\l_@@_line_target_int - \l_@@_indent_int ;
- #1 #2 \q_stop
+ #1 #2 \s_@@_stop
}
}
% \end{macrocode}
@@ -2173,7 +2179,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_wrap_allow_break:n #1
{
- \tl_set:Nx \l_@@_line_tl
+ \__kernel_tl_set:Nx \l_@@_line_tl
{ \l_@@_line_tl \@@_wrap_trim:N \l_@@_line_part_tl }
\bool_set_false:N \l_@@_line_break_bool
\tl_if_empty:NTF \l_@@_line_part_tl
@@ -2204,7 +2210,7 @@
\tl_put_right:Nx \l_@@_line_tl { \l_@@_line_part_tl }
\bool_set_false:N \l_@@_line_break_bool
\int_sub:Nn \l_@@_indent_int { \l_@@_one_indent_int }
- \tl_set:Nx \l_@@_indent_tl
+ \__kernel_tl_set:Nx \l_@@_indent_tl
{ \exp_after:wN \@@_unindent:w \l_@@_indent_tl }
\@@_wrap_chunk:nw {#1}
}
@@ -2243,9 +2249,9 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_wrap_store_do:n #1
{
- \tl_set:Nx \l_@@_line_tl
+ \__kernel_tl_set:Nx \l_@@_line_tl
{ \l_@@_line_tl \l_@@_line_part_tl }
- \tl_set:Nx \l_@@_wrap_tl
+ \__kernel_tl_set:Nx \l_@@_wrap_tl
{
\l_@@_wrap_tl
\l_@@_newline_tl
@@ -2262,10 +2268,10 @@
\cs_set_protected:Npn \@@_tmp:w #1
{
\cs_new:Npn \@@_wrap_trim:N ##1
- { \exp_after:wN \@@_wrap_trim:w ##1 \q_mark #1 \q_mark \q_stop }
- \cs_new:Npn \@@_wrap_trim:w ##1 #1 \q_mark
- { \@@_wrap_trim_aux:w ##1 \q_mark }
- \cs_new:Npn \@@_wrap_trim_aux:w ##1 \q_mark ##2 \q_stop {##1}
+ { \exp_after:wN \@@_wrap_trim:w ##1 \s_@@_mark #1 \s_@@_mark \s_@@_stop }
+ \cs_new:Npn \@@_wrap_trim:w ##1 #1 \s_@@_mark
+ { \@@_wrap_trim_aux:w ##1 \s_@@_mark }
+ \cs_new:Npn \@@_wrap_trim_aux:w ##1 \s_@@_mark ##2 \s_@@_stop {##1}
}
\exp_args:NV \@@_tmp:w \c_catcode_other_space_tl
% \end{macrocode}
@@ -2308,18 +2314,17 @@
% \tn{@currnamestack} is empty so is skipped.
% \begin{macrocode}
\seq_new:N \g_@@_stack_seq
-%<*package>
\group_begin:
\cs_set_protected:Npn \@@_tmp:w #1#2#3
{
\tl_if_blank:nTF {#1}
{
- \cs_set:Npn \@@_tmp:w ##1 " ##2 " ##3 \q_stop
+ \cs_set:Npn \@@_tmp:w ##1 " ##2 " ##3 \s_@@_stop
{ { } {##2} { } }
\seq_gput_right:Nx \g_@@_stack_seq
{
\exp_after:wN \@@_tmp:w \tex_jobname:D
- " \tex_jobname:D " \q_stop
+ " \tex_jobname:D " \s_@@_stop
}
}
{
@@ -2333,25 +2338,16 @@
{ \exp_after:wN \@@_tmp:w \@currnamestack }
}
\group_end:
-%</package>
% \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_record_seq}
% The total list of files used is recorded separately from the current
% file stack, as nothing is ever popped from this list. The current
-% file name should be included in the file list! In format mode, this
-% is done at the very start of the \TeX{} run. In package mode we
+% file name should be included in the file list! We
% will eventually copy the contents of \cs{@filelist}.
% \begin{macrocode}
\seq_new:N \g_@@_record_seq
-%<*initex>
-\tex_everyjob:D \exp_after:wN
- {
- \tex_the:D \tex_everyjob:D
- \seq_gput_right:NV \g_@@_record_seq \g_file_curr_name_str
- }
-%</initex>
% \end{macrocode}
% \end{variable}
%
@@ -2381,14 +2377,54 @@
% \end{variable}
%
% \begin{variable}{\l_@@_tmp_seq}
-% Scratch space for comma list conversion in package mode.
+% Scratch space for comma list conversion.
% \begin{macrocode}
-%<*package>
\seq_new:N \l_@@_tmp_seq
-%</package>
% \end{macrocode}
% \end{variable}
%
+% \subsubsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_nil}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_nil:n}
+% Branching quark conditional.
+% \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:n { TF }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{
+% \@@_if_recursion_tail_break:NN,
+% \@@_if_recursion_tail_stop_do:Nn
+% }
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop:N
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop_do:nn
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[EXP]{\__kernel_file_name_sanitize:n}
% \begin{macro}[EXP]{\__kernel_file_name_expand_loop:w}
% \begin{macro}[EXP]{\__kernel_file_name_expand_N_type:Nw}
@@ -2413,11 +2449,11 @@
\exp_args:Ne \__kernel_file_name_strip_quotes:n
{
\__kernel_file_name_expand_loop:w #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
}
}
-\cs_new:Npn \__kernel_file_name_expand_loop:w #1 \q_recursion_stop
+\cs_new:Npn \__kernel_file_name_expand_loop:w #1 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#1}
{ \__kernel_file_name_expand_N_type:Nw }
@@ -2426,11 +2462,11 @@
{ \__kernel_file_name_expand_group:nw }
{ \__kernel_file_name_expand_space:w }
}
- #1 \q_recursion_stop
+ #1 \q_@@_recursion_stop
}
\cs_new:Npn \__kernel_file_name_expand_N_type:Nw #1
{
- \quark_if_recursion_tail_stop:N #1
+ \@@_if_recursion_tail_stop:N #1
\bool_lazy_and:nnTF
{ \token_if_expandable_p:N #1 }
{
@@ -2452,10 +2488,10 @@
}
\cs_new:Npx \__kernel_file_name_expand_group:nw #1
{
- \c_left_brace_str
+ \c_left_brace_str
\exp_not:N \__kernel_file_name_expand_loop:w
#1
- \c_right_brace_str
+ \c_right_brace_str
}
\exp_last_unbraced:NNo
\cs_new:Npx \__kernel_file_name_expand_space:w \c_space_tl
@@ -2470,11 +2506,11 @@
\cs_new:Npn \__kernel_file_name_strip_quotes:n #1
{
\__kernel_file_name_strip_quotes:nnnw {#1} { 0 } { }
- #1 " \q_recursion_tail " \q_recursion_stop
+ #1 " \q_@@_recursion_tail " \q_@@_recursion_stop
}
\cs_new:Npn \__kernel_file_name_strip_quotes:nnnw #1#2#3#4 "
{
- \quark_if_recursion_tail_stop_do:nn {#4}
+ \@@_if_recursion_tail_stop_do:nn {#4}
{ \__kernel_file_name_strip_quotes:nnn {#1} {#2} {#3} }
\__kernel_file_name_strip_quotes:nnnw {#1} { #2 + 1 } { #3#4 }
}
@@ -2491,23 +2527,23 @@
% Spaces need to be trimmed from the start of the name and from the end of
% any extension. However, the name we are passed might not have an extension:
% that means we have to look for one. If there is no extension, we still use
-% the standard trimming function but deliberately prevent any spaces being
+% the standard trimming function but deliberately prevent any spaces being
% removed at the end.
% \begin{macrocode}
\cs_new:Npn \__kernel_file_name_trim_spaces:n #1
- { \__kernel_file_name_trim_spaces:nw {#1} #1 . \q_nil . \q_stop }
-\cs_new:Npn \__kernel_file_name_trim_spaces:nw #1#2 . #3 . #4 \q_stop
+ { \__kernel_file_name_trim_spaces:nw {#1} #1 . \q_@@_nil . \s_@@_stop }
+\cs_new:Npn \__kernel_file_name_trim_spaces:nw #1#2 . #3 . #4 \s_@@_stop
{
- \quark_if_nil:nTF {#3}
+ \@@_quark_if_nil:nTF {#3}
{
\exp_args:Ne \__kernel_file_name_trim_spaces_aux:n
- { \tl_trim_spaces:n { #1 \s_stop } }
+ { \tl_trim_spaces:n { #1 \s_@@_stop } }
}
{ \tl_trim_spaces:n {#1} }
}
\cs_new:Npn \__kernel_file_name_trim_spaces_aux:n #1
{ \__kernel_file_name_trim_spaces_aux:w #1 }
-\cs_new:Npn \__kernel_file_name_trim_spaces_aux:w #1 \s_stop {#1}
+\cs_new:Npn \__kernel_file_name_trim_spaces_aux:w #1 \s_@@_stop {#1}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2526,10 +2562,10 @@
% \begin{macro}[EXP]{\__kernel_file_name_quote:nw}
% \begin{macrocode}
\cs_new:Npn \__kernel_file_name_quote:n #1
- { \__kernel_file_name_quote:nw {#1} #1 ~ \q_nil \q_stop }
-\cs_new:Npn \__kernel_file_name_quote:nw #1 #2 ~ #3 \q_stop
+ { \__kernel_file_name_quote:nw {#1} #1 ~ \q_@@_nil \s_@@_stop }
+\cs_new:Npn \__kernel_file_name_quote:nw #1 #2 ~ #3 \s_@@_stop
{
- \quark_if_nil:nTF {#3}
+ \@@_quark_if_nil:nTF {#3}
{ #1 }
{ "#1" }
}
@@ -2600,24 +2636,15 @@
% \end{macro}
%
% \begin{macro}{\@@_size:n}
-% A copy of the primitive where it's available, or the \LuaTeX{}
-% equivalent if relevant.
+% A copy of the primitive where it's available.
% \begin{macrocode}
\cs_new_eq:NN \@@_size:n \tex_filesize:D
-\sys_if_engine_luatex:T
- {
- \cs_gset:Npn \@@_size:n #1
- {
- \lua_now:e
- { l3kernel.filesize ( " \lua_escape:e {#1} " ) }
- }
- }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[EXP]{\file_full_name:n, \@@_full_name:n}
-% \begin{macro}[EXP]{\@@_full_name_aux:nn}
-% \begin{macro}[EXP]{\@@_full_name_aux:n}
+% \begin{macro}[EXP]{\@@_full_name_aux:Nnn}
+% \begin{macro}[EXP]{\@@_full_name_aux:nN}
% \begin{macro}[EXP]{\@@_name_cleanup:w}
% \begin{macro}[EXP]{\@@_name_end:}
% \begin{macro}[EXP]{\@@_name_ext_check:n}
@@ -2648,14 +2675,12 @@
\tl_if_blank:eTF { \@@_size:n {#1} }
{
\seq_map_tokens:Nn \l_file_search_path_seq
- { \@@_full_name_aux:nn {#1} }
-%<*package>
+ { \@@_full_name_aux:Nnn \seq_map_break:n {#1} }
\cs_if_exist:NT \input@path
{
\tl_map_tokens:Nn \input@path
- { \@@_full_name_aux:nn {#1} }
+ { \@@_full_name_aux:Nnn \tl_map_break:n {#1} }
}
-%</package>
\@@_name_end:
}
{ \@@_ext_check:n {#1} }
@@ -2665,13 +2690,13 @@
% Two pars to the auxiliary here so we can avoid doing quoting
% twice in the event we find the right file.
% \begin{macrocode}
-\cs_new:Npn \@@_full_name_aux:nn #1#2
- { \exp_args:Ne \@@_full_name_aux:n { \tl_to_str:n {#2} / #1 } }
-\cs_new:Npn \@@_full_name_aux:n #1
+\cs_new:Npn \@@_full_name_aux:Nnn #1#2#3
+ { \exp_args:Ne \@@_full_name_aux:nN { \tl_to_str:n {#3} / #2 } #1 }
+\cs_new:Npn \@@_full_name_aux:nN #1 #2
{
\tl_if_blank:eF { \@@_size:n {#1} }
{
- \seq_map_break:n
+ #2
{
\@@_ext_check:n {#1}
\@@_name_cleanup:w
@@ -2686,19 +2711,19 @@
% directory part, saving that. Then check for an extension.
% \begin{macrocode}
\cs_new:Npn \@@_ext_check:n #1
- { \@@_ext_check:nw { / } #1 / \q_nil / \q_stop }
-\cs_new:Npn \@@_ext_check:nw #1 #2 / #3 / #4 \q_stop
+ { \@@_ext_check:nw { / } #1 / \q_@@_nil / \s_@@_stop }
+\cs_new:Npn \@@_ext_check:nw #1 #2 / #3 / #4 \s_@@_stop
{
- \quark_if_nil:nTF {#3}
+ \@@_quark_if_nil:nTF {#3}
{
\exp_args:No \@@_ext_check:nnw
- { \use_none:n #1 } {#2} #2 . \q_nil . \q_stop
+ { \use_none:n #1 } {#2} #2 . \q_@@_nil . \s_@@_stop
}
- { \@@_ext_check:nw { #1 #2 / } #3 / #4 \q_stop }
+ { \@@_ext_check:nw { #1 #2 / } #3 / #4 \s_@@_stop }
}
-\cs_new:Npx \@@_ext_check:nnw #1#2#3 . #4 . #5 \q_stop
+\cs_new:Npx \@@_ext_check:nnw #1#2#3 . #4 . #5 \s_@@_stop
{
- \exp_not:N \quark_if_nil:nTF {#4}
+ \exp_not:N \@@_quark_if_nil:nTF {#4}
{
\exp_not:N \@@_ext_check:nn
{ #1 #2 } { #1 #2 \tl_to_str:n { .tex } }
@@ -2719,9 +2744,7 @@
% \end{macrocode}
% Deal with the fact that the primitive might not be available.
% \begin{macrocode}
-\bool_lazy_or:nnF
- { \cs_if_exist_p:N \tex_filesize:D }
- { \sys_if_engine_luatex_p: }
+\cs_if_exist:NF \tex_filesize:D
{
\cs_gset:Npn \file_full_name:n #1
{
@@ -2762,7 +2785,7 @@
\cs_generate_variant:Nn \file_get_full_name:nN { V }
\prg_new_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF }
{
- \tl_set:Nx #2
+ \__kernel_tl_set:Nx #2
{ \file_full_name:n {#1} }
\tl_if_empty:NTF #2
{ \prg_return_false: }
@@ -2783,24 +2806,20 @@
% existence of the file with |.tex| extension in that directory, and
% if it exists we include the |.tex| extension in the result.
% \begin{macrocode}
-\bool_lazy_or:nnF
- { \cs_if_exist_p:N \tex_filesize:D }
- { \sys_if_engine_luatex_p: }
+\cs_if_exist:NF \tex_filesize:D
{
\prg_set_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF }
{
- \tl_set:Nx \l_@@_base_name_tl
+ \__kernel_tl_set:Nx \l_@@_base_name_tl
{ \__kernel_file_name_sanitize:n {#1} }
\@@_get_full_name_search:nN { } \use:n
\seq_map_inline:Nn \l_file_search_path_seq
{ \@@_get_full_name_search:nN { ##1 / } \seq_map_break:n }
-%<*package>
\cs_if_exist:NT \input@path
{
\tl_map_inline:Nn \input@path
{ \@@_get_full_name_search:nN { ##1 } \tl_map_break:n }
}
-%</package>
\tl_set:Nn \l_@@_full_name_tl { \q_no_value }
\prg_break_point:
\quark_if_no_value:NTF \l_@@_full_name_tl
@@ -2826,7 +2845,7 @@
}
\cs_new_protected:Npn \@@_get_full_name_search:nN #1#2
{
- \tl_set:Nx \l_@@_full_name_tl
+ \__kernel_tl_set:Nx \l_@@_full_name_tl
{ \tl_to_str:n {#1} \l_@@_base_name_tl }
\__kernel_ior_open:No \g_@@_internal_ior \l_@@_full_name_tl
\ior_if_eof:NF \g_@@_internal_ior { #2 { \prg_break: } }
@@ -2836,12 +2855,10 @@
% \end{macro}
% \end{macro}
% \begin{variable}{\g_@@_internal_ior}
-% A reserved stream to test for file existence, if required.
+% A reserved stream to test for file existence (if required), and for
+% opening a shell.
% \begin{macrocode}
-\bool_lazy_or:nnF
- { \cs_if_exist_p:N \tex_filesize:D }
- { \sys_if_engine_luatex_p: }
- { \ior_new:N \g_@@_internal_ior }
+\ior_new:N \g_@@_internal_ior
% \end{macrocode}
% \end{variable}
%
@@ -2852,8 +2869,6 @@
% As the MD5 function has a slightly different syntax from the other commands,
% there is a little cleaning up to do.
% \begin{macrocode}
-\cs_new:Npn \file_mdfive_hash:n #1
- { \@@_details:nn {#1} { mdfivesum } }
\cs_new:Npn \file_size:n #1
{ \@@_details:nn {#1} { size } }
\cs_new:Npn \file_timestamp:n #1
@@ -2868,20 +2883,10 @@
\tl_if_blank:nF {#1}
{ \use:c { tex_file #2 :D } {#1} }
}
-\sys_if_engine_luatex:TF
- {
- \cs_gset:Npn \@@_details_aux:nn #1#2
- {
- \lua_now:e
- { l3kernel.file#2 ( " \lua_escape:e { #1 } " ) }
- }
- }
- {
- \cs_gset:Npn \file_mdfive_hash:n #1
- { \exp_args:Ne \@@_mdfive_hash:n { \file_full_name:n {#1} } }
- \cs_new:Npn \@@_mdfive_hash:n #1
- { \tex_mdfivesum:D file {#1} }
- }
+\cs_new:Npn \file_mdfive_hash:n #1
+ { \exp_args:Ne \@@_mdfive_hash:n { \file_full_name:n {#1} } }
+\cs_new:Npn \@@_mdfive_hash:n #1
+ { \tex_mdfivesum:D file {#1} }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2943,34 +2948,21 @@
length ~ \int_eval:n { #1 - #2 + 1 }
{#3}
}
-\sys_if_engine_luatex:T
- {
- \cs_gset:Npn \@@_hex_dump_auxiv:nnn #1#2#3
- {
- \lua_now:e
- {
- l3kernel.filedump
- (
- " \lua_escape:e {#3} " ,
- \int_eval:n { #2 - 1 } ,
- \int_eval:n { #1 - #2 + 1 }
- )
- }
- }
- }
\cs_new:Npn \file_hex_dump:n #1
{ \exp_args:Ne \@@_hex_dump:n { \file_full_name:n {#1} } }
-\cs_new:Npn \@@_hex_dump:n #1
+\sys_if_engine_luatex:TF
{
- \tl_if_blank:nF {#1}
- { \tex_filedump:D length \tex_filesize:D {#1} {#1} }
+ \cs_new:Npn \@@_hex_dump:n #1
+ {
+ \tl_if_blank:nF {#1}
+ { \tex_filedump:D whole {#1} {#1} }
+ }
}
-\sys_if_engine_luatex:T
{
- \cs_gset:Npn \@@_hex_dump:n #1
+ \cs_new:Npn \@@_hex_dump:n #1
{
- \lua_now:e
- { l3kernel.filedump ( " \lua_escape:e { #1 } " ) }
+ \tl_if_blank:nF {#1}
+ { \tex_filedump:D length \tex_filesize:D {#1} {#1} }
}
}
% \end{macrocode}
@@ -3008,7 +3000,7 @@
{ \@@_get_details:nnN {#1} { timestamp } #2 }
\cs_new_protected:Npn \@@_get_details:nnN #1#2#3
{
- \tl_set:Nx #3
+ \__kernel_tl_set:Nx #3
{ \use:c { file_ #2 :n } {#1} }
\tl_if_empty:NTF #3
{ \prg_return_false: }
@@ -3018,9 +3010,7 @@
% Where the primitive is not available, issue an error: this is a little
% more conservative than absolutely needed, but does work.
% \begin{macrocode}
-\bool_lazy_or:nnF
- { \cs_if_exist_p:N \tex_filesize:D }
- { \sys_if_engine_luatex_p: }
+\cs_if_exist:NF \tex_filesize:D
{
\cs_set_protected:Npn \@@_get_details:nnN #1#2#3
{
@@ -3050,12 +3040,12 @@
\cs_new_protected:Npn \file_get_hex_dump:nnnN #1#2#3#4
{
\file_get_hex_dump:nnnNF {#1} {#2} {#3} #4
- { \tl_set:Nn #4 { \q_no_value } }
+ { \tl_set:Nn #4 { \q_no_value } }
}
\prg_new_protected_conditional:Npnn \file_get_hex_dump:nnnN #1#2#3#4
{ T , F , TF }
{
- \tl_set:Nx #4
+ \__kernel_tl_set:Nx #4
{ \file_hex_dump:nnn {#1} {#2} {#3} }
\tl_if_empty:NTF #4
{ \prg_return_false: }
@@ -3065,33 +3055,12 @@
% \end{macro}
%
% \begin{macro}[EXP]{\@@_str_cmp:nn}
-% \begin{macro}[EXP]{\@@_str_escape:n}
% As we are doing a fixed-length \enquote{big} integer comparison, it
% is easiest to use the low-level behavior of string comparisons.
% \begin{macrocode}
-\cs_new:Npn \@@_str_cmp:nn #1#2 { \tex_strcmp:D {#1} {#2} }
-\sys_if_engine_luatex:T
- {
- \cs_set:Npn \@@_str_cmp:nn #1#2
- {
- \lua_now:e
- {
- l3kernel.strcmp
- (
- " \@@_str_escape:n {#1}",
- " \@@_str_escape:n {#2}"
- )
- }
- }
- \cs_new:Npn \@@_str_escape:n #1
- {
- \lua_escape:e
- { \__kernel_tl_to_str:w \use:e { {#1} } }
- }
- }
+\cs_new_eq:NN \@@_str_cmp:nn \tex_strcmp:D
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \begin{macro}[EXP, pTF]{\file_compare_timestamp:nNn}
% \begin{macro}[EXP]{\@@_compare_timestamp:nnN}
@@ -3139,16 +3108,8 @@
}
}
}
-\sys_if_engine_luatex:TF
- {
- \cs_new:Npn \@@_timestamp:n #1
- {
- \lua_now:e
- { l3kernel.filemoddate ( " \lua_escape:e {#1} " ) }
- }
- }
- { \cs_new_eq:NN \@@_timestamp:n \tex_filemoddate:D }
-\cs_if_exist:NF \tex_filemoddate:D
+\cs_new_eq:NN \@@_timestamp:n \tex_filemoddate:D
+\cs_if_exist:NF \@@_timestamp:n
{
\prg_set_conditional:Npnn \file_compare_timestamp:nNn #1#2#3
{ p , T , F , TF }
@@ -3234,14 +3195,9 @@
}
\cs_new_protected:Npx \@@_input:n #1
{
-%<*initex>
- \seq_gput_right:Nn \exp_not:N \g_@@_record_seq {#1}
-%</initex>
-%<*package>
\exp_not:N \clist_if_exist:NTF \exp_not:N \@filelist
{ \exp_not:N \@addtofilelist {#1} }
{ \seq_gput_right:Nn \exp_not:N \g_@@_record_seq {#1} }
-%</package>
\exp_not:N \@@_input_push:n {#1}
\exp_not:N \tex_input:D
\sys_if_engine_luatex:TF
@@ -3268,17 +3224,13 @@
\str_gset_eq:NN \g_file_curr_name_str \l_@@_name_str
\str_gset_eq:NN \g_file_curr_ext_str \l_@@_ext_str
}
-%<*package>
\cs_new_eq:NN \__kernel_file_input_push:n \@@_input_push:n
-%</package>
\cs_new_protected:Npn \@@_input_pop:
{
\seq_gpop:NN \g_@@_stack_seq \l_@@_internal_tl
\exp_after:wN \@@_input_pop:nnn \l_@@_internal_tl
}
-%<*package>
\cs_new_eq:NN \__kernel_file_input_pop: \@@_input_pop:
-%</package>
\cs_new_protected:Npn \@@_input_pop:nnn #1#2#3
{
\str_gset:Nn \g_file_curr_dir_str {#1}
@@ -3292,63 +3244,113 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\file_parse_full_name:nNNN, \file_parse_full_name:VNNN}
-% \begin{macro}
-% {\@@_parse_full_name_auxi:w, \@@_parse_full_name_split:nNNNTF}
-% Parsing starts by stripping off any surrounding quotes. Then find
-% the directory |#4| by splitting at the last~|/|. (The auxiliary
-% returns \texttt{true}/\texttt{false} depending on whether it found
-% the delimiter.) We correct for the case of a file in the root |/|,
-% as in that case we wish to keep the trailing (and only) slash. Then
-% split the base name |#5| at the last dot. If there was indeed a
-% dot, |#5| contains the name and |#6| the extension without the dot,
-% which we add back for convenience. In the special case of no
-% extension given, the auxiliary stored the name into |#6|, we just
-% have to move it to |#5|.
-% \begin{macrocode}
-\cs_new_protected:Npn \file_parse_full_name:nNNN #1#2#3#4
- {
- \exp_after:wN \@@_parse_full_name_auxi:w
- \tl_to_str:n { #1 " #1 " } \q_stop #2#3#4
+% \begin{macro}{\file_parse_full_name:n, \file_parse_full_name_apply:nN}
+% The main parsing macro \cs{file_parse_full_name_apply:nN} passes the
+% file name |#1| through \cs{__kernel_file_name_sanitize:n} so that we
+% have a single normalised way to treat files internally.
+% \cs{file_parse_full_name:n} uses the former, with
+% \cs{prg_do_nothing:} to
+% leave each part of the name within a pair of braces.
+% \begin{macrocode}
+\cs_new:Npn \file_parse_full_name:n #1
+ {
+ \file_parse_full_name_apply:nN {#1}
+ \prg_do_nothing:
}
-\cs_generate_variant:Nn \file_parse_full_name:nNNN { V }
-\cs_new_protected:Npn \@@_parse_full_name_auxi:w
- #1 " #2 " #3 \q_stop #4#5#6
- {
- \@@_parse_full_name_split:nNNNTF {#2} / #4 #5
- { \str_if_empty:NT #4 { \str_set:Nn #4 { / } } }
- { }
- \exp_args:No \@@_parse_full_name_split:nNNNTF {#5} . #5 #6
- { \str_put_left:Nn #6 { . } }
- {
- \str_set_eq:NN #5 #6
- \str_clear:N #6
- }
+\cs_new:Npn \file_parse_full_name_apply:nN #1
+ {
+ \exp_args:Ne \@@_parse_full_name_auxi:nN
+ { \__kernel_file_name_sanitize:n {#1} }
}
-\cs_new_protected:Npn \@@_parse_full_name_split:nNNNTF #1#2#3#4
+% \end{macrocode}
+%
+% \begin{macro}{\@@_parse_full_name_auxi:nN}
+% \begin{macro}{\@@_parse_full_name_area:nw}
+% \cs{@@_parse_full_name_area:nw} splits the file name into chunks
+% separated by |/|, until the last one is reached. The last chunk is
+% the file name plus the extension, and everything before that is the
+% path. When \cs{@@_parse_full_name_area:nw} is done, it leaves
+% the path within braces after the scan mark \cs{s_@@_stop} and
+% proceeds parsing the actual file name.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_full_name_auxi:nN #1
{
- \cs_set_protected:Npn \@@_tmp:w ##1 ##2 #2 ##3 \q_stop
+ \@@_parse_full_name_area:nw { } #1
+ / \s_@@_stop
+ }
+\cs_new:Npn \@@_parse_full_name_area:nw #1 #2 / #3 \s_@@_stop
+ {
+ \tl_if_empty:nTF {#3}
+ { \@@_parse_full_name_base:nw { } #2 . \s_@@_stop {#1} }
+ { \@@_parse_full_name_area:nw { #1 / #2 } #3 \s_@@_stop }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_parse_full_name_base:nw}
+% \cs{@@_parse_full_name_base:nw} does roughly the same as above, but
+% it separates the chunks at each period. However here there's some
+% extra complications: In case |#1| is empty, it is assumed that the
+% extension is actually empty, and the file name is |#2|. Besides, an
+% extra |.| has to be added to |#2| because it is later removed in
+% \cs{@@_parse_full_name_tidy:nnnN}. In any case, if there's an
+% extension, it is returned with a leading |.|.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_full_name_base:nw #1 #2 . #3 \s_@@_stop
+ {
+ \tl_if_empty:nTF {#3}
{
- \tl_if_empty:nTF {##3}
+ \tl_if_empty:nTF {#1}
{
- \str_set:Nn #4 {##2}
- \tl_if_empty:nTF {##1}
- {
- \str_clear:N #3
- \use_ii:nn
- }
- {
- \str_set:Nx #3 { \str_tail:n {##1} }
- \use_i:nn
- }
+ \tl_if_empty:nTF {#2}
+ { \@@_parse_full_name_tidy:nnnN { } { } }
+ { \@@_parse_full_name_tidy:nnnN { .#2 } { } }
}
- { \@@_tmp:w { ##1 #2 ##2 } ##3 \q_stop }
+ { \@@_parse_full_name_tidy:nnnN {#1} { .#2 } }
}
- \@@_tmp:w { } #1 #2 \q_stop
+ { \@@_parse_full_name_base:nw { #1 . #2 } #3 \s_@@_stop }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_parse_full_name_tidy:nnnN}
+% Now we just need to tidy some bits left loose before. The loop
+% used in the two macros above start with a leading |/| and |.| in the
+% file path an name, so here we need to remove them, except in the
+% path, if it is a single |/|, in which case it's left as is. After
+% all's done, pass to |#4|.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_full_name_tidy:nnnN #1 #2 #3 #4
+ {
+ \exp_args:Nee #4
+ {
+ \str_if_eq:nnF {#3} { / } { \use_none:n }
+ #3 \prg_do_nothing:
+ }
+ { \use_none:n #1 \prg_do_nothing: }
+ {#2}
}
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\file_parse_full_name:nNNN, \file_parse_full_name:VNNN}
+% \begin{macrocode}
+\cs_new_protected:Npn \file_parse_full_name:nNNN #1 #2 #3 #4
+ {
+ \file_parse_full_name_apply:nN {#1}
+ \@@_full_name_assign:nnnNNN #2 #3 #4
+ }
+\cs_new_protected:Npn \@@_full_name_assign:nnnNNN #1 #2 #3 #4 #5 #6
+ {
+ \str_set:Nn #4 {#1}
+ \str_set:Nn #5 {#2}
+ \str_set:Nn #6 {#3}
+ }
+\cs_generate_variant:Nn \file_parse_full_name:nNNN { V }
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\file_show_list:, \file_log_list:, \@@_list:N}
% \begin{macro}[EXP]{\@@_list_aux:n}
@@ -3363,13 +3365,11 @@
\cs_new_protected:Npn \@@_list:N #1
{
\seq_clear:N \l_@@_tmp_seq
-%<*package>
\clist_if_exist:NT \@filelist
{
\exp_args:NNx \seq_set_from_clist:Nn \l_@@_tmp_seq
{ \tl_to_str:N \@filelist }
}
-%</package>
\seq_concat:NNN \l_@@_tmp_seq \l_@@_tmp_seq \g_@@_record_seq
\seq_remove_duplicates:N \l_@@_tmp_seq
#1 { LaTeX/kernel } { file-list }
@@ -3386,7 +3386,6 @@
% \cs{@filelist} must be turned to strings before being added to
% \cs{g_@@_record_seq}.
% \begin{macrocode}
-%<*package>
\cs_if_exist:NT \@filelist
{
\AtBeginDocument
@@ -3399,10 +3398,9 @@
\l_@@_tmp_seq
}
}
-%</package>
% \end{macrocode}
%
-% \subsection{GetIfInfo}
+% \subsection{GetIdInfo}
%
% \begin{macro}{\GetIdInfo}
% \begin{macro}{\@@_id_info_auxi:w, \@@_id_info_auxii:w, \@@_id_info_auxiii:w}
@@ -3449,7 +3447,7 @@
\tl_set:Nn \ExplFileExtension { [unknown~extension] }
\tl_set:Nn \ExplFileVersion {-1}
}
- { \@@_id_info_auxii:w #1 ~ \q_stop }
+ { \@@_id_info_auxii:w #1 ~ \s_@@_stop }
}
% \end{macrocode}
% Here, |#1| is |Id|, |#2| is the file name, |#3| is the extension,
@@ -3458,24 +3456,149 @@
% |-1| value then |#5| and |#6| are empty.
% \begin{macrocode}
\cs_new_protected:Npn \@@_id_info_auxii:w
- #1 ~ #2.#3 ~ #4 ~ #5 ~ #6 \q_stop
+ #1 ~ #2.#3 ~ #4 ~ #5 ~ #6 \s_@@_stop
{
\tl_set:Nn \ExplFileName {#2}
\tl_set:Nn \ExplFileExtension {#3}
\tl_set:Nn \ExplFileVersion {#4}
\str_if_eq:nnTF {#4} {-1}
{ \tl_set:Nn \ExplFileDate { 0000/00/00 } }
- { \@@_id_info_auxiii:w #5 - 0 - 0 - \q_stop }
+ { \@@_id_info_auxiii:w #5 - 0 - 0 - \s_@@_stop }
}
% \end{macrocode}
% Convert an \textsc{svn}-style date into a \LaTeX{}-style one.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_id_info_auxiii:w #1 - #2 - #3 - #4 \q_stop
+\cs_new_protected:Npn \@@_id_info_auxiii:w #1 - #2 - #3 - #4 \s_@@_stop
{ \tl_set:Nn \ExplFileDate { #1/#2/#3 } }
% \end{macrocode}
% \end{macro}
% \end{macro}
%
+% \subsection{Checking the version of kernel dependencies}
+%
+% \begin{macro}{\__kernel_dependency_version_check:Nn}
+% \begin{macro}{\__kernel_dependency_version_check:nn}
+% \begin{macro}{\@@_kernel_dependency_compare:nnn,\@@_parse_version:w}
+% This function is responsible for checking if dependencies of the
+% \LaTeX3 kernel match the version preloaded in the \LaTeXe{} kernel.
+% If versions don't match, the function attempts to tell why by
+% searching for a possible stray format file.
+%
+% The function starts by checking that the kernel date is defined, and
+% if not zero is used to force the error route. The kernel date is
+% then compared with the argument requested date (ususally the
+% packaging date of the dependency). If the kernel date is less than
+% the required date, it's an error and the loading should abort.
+% \begin{macrocode}
+\cs_new_protected:Npn \__kernel_dependency_version_check:Nn #1
+ { \exp_args:NV \__kernel_dependency_version_check:nn #1 }
+\cs_new_protected:Npn \__kernel_dependency_version_check:nn #1
+ {
+ \cs_if_exist:NTF \c__kernel_expl_date_tl
+ {
+ \exp_args:NV \@@_kernel_dependency_compare:nnn
+ \c__kernel_expl_date_tl {#1}
+ }
+ { \@@_kernel_dependency_compare:nnn { 0000-00-00 } {#1} }
+ }
+\cs_new_protected:Npn \@@_kernel_dependency_compare:nnn #1 #2 #3
+ {
+ \int_compare:nNnT
+ { \@@_parse_version:w #1 \s_@@_stop } <
+ { \@@_parse_version:w #2 \s_@@_stop }
+ { \@@_mismatched_dependency_error:nn {#2} {#3} }
+ }
+\cs_new:Npn \@@_parse_version:w #1 - #2 - #3 \s_@@_stop {#1#2#3}
+% \end{macrocode}
+%
+% \begin{macro}{\@@_mismatched_dependency_error:nn}
+% If the versions differ, then we try to give the user some guidance.
+% This function starts by taking the engine name \cs{c_sys_engine_str}
+% and replacing |tex| by |latex|, then building a command of the form:
+% \begin{texttt}
+% kpsewhich --all --engine=\meta{engine} \meta{format}[-dev].fmt
+% \end{texttt}
+% to query the format files available. A shell is opened and each
+% line is read into a sequence.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_mismatched_dependency_error:nn #1 #2
+ {
+ \exp_args:NNx \ior_shell_open:Nn \g_@@_internal_ior
+ {
+ kpsewhich ~ --all ~
+ --engine = \c_sys_engine_exec_str
+ \c_space_tl \c_sys_engine_format_str
+ \bool_lazy_and:nnF
+ { \tl_if_exist_p:N \development@branch@name }
+ { ! \tl_if_empty_p:N \development@branch@name }
+ { -dev } .fmt
+ }
+ \seq_clear:N \l_@@_tmp_seq
+ \ior_map_inline:Nn \g_@@_internal_ior
+ { \seq_put_right:Nn \l_@@_tmp_seq {##1} }
+ \ior_close:N \g_@@_internal_ior
+ \__kernel_msg_error:nnnn { kernel } { mismatched-support-file }
+ {#1} {#2}
+% \end{macrocode}
+% And finish by ending the current file.
+% \begin{macrocode}
+ \tex_endinput:D
+ }
+% \begin{macrocode}
+%
+% Now define the actual error message:
+% \begin{macrocode}
+\__kernel_msg_new:nnnn { kernel } { mismatched-support-file }
+ {
+ Mismatched~LaTeX~support~files~detected. \\
+ Loading~'#2'~aborted!
+% \end{macrocode}
+% \cs{c__kernel_expl_date_tl} may not exist, due to an older format,
+% so only print the dates when the sentinel token list exists:
+% \begin{macrocode}
+ \tl_if_exist:NT \c__kernel_expl_date_tl
+ {
+ \\ \\
+ The~L3~programming~layer~in~the~LaTeX~format \\
+ is~dated~\c__kernel_expl_date_tl,~but~in~your~TeX~
+ tree~the~files~require \\ at~least~#1.
+ }
+ }
+ {
+% \end{macrocode}
+% The sequence containing the format files should have exactly one
+% item: the format file currently being run. If that's the case, the
+% cause of the error is not that, so print a generic help with some
+% possible causes. If more than one format file was found, then print
+% the list to the user, with appropriate indications of what's in the
+% system and what's in the user tree.
+% \begin{macrocode}
+ \int_compare:nNnTF { \seq_count:N \l_@@_tmp_seq } > 1
+ {
+ The~cause~seems~to~be~an~old~format~file~in~the~user~tree. \\
+ LaTeX~found~these~files:
+ \seq_map_tokens:Nn \l_@@_tmp_seq { \\~-~\use:n } \\
+ Try~deleting~the~file~in~the~user~tree~then~run~LaTeX~again.
+ }
+ {
+ The~most~likely~causes~are:
+ \\~-~A~recent~format~generation~failed;
+ \\~-~A~stray~format~file~in~the~user~tree~which~needs~
+ to~be~removed~or~rebuilt;
+ \\~-~You~are~running~a~manually~installed~version~of~#2 \\
+ \ \ \ which~is~incompatible~with~the~version~in~LaTeX. \\
+ }
+ \\
+ LaTeX~will~abort~loading~the~incompatible~support~files~
+ but~this~may~lead~to \\ later~errors.~Please~ensure~that~
+ your~LaTeX~format~is~correctly~regenerated.
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Messages}
%
% \begin{macrocode}
@@ -3491,20 +3614,6 @@
#1 \\
.............
}
-\__kernel_msg_new:nnnn { kernel } { input-streams-exhausted }
- { Input~streams~exhausted }
- {
- TeX~can~only~open~up~to~16~input~streams~at~one~time.\\
- All~16~are~currently~in~use,~and~something~wanted~to~open~
- another~one.
- }
-\__kernel_msg_new:nnnn { kernel } { output-streams-exhausted }
- { Output~streams~exhausted }
- {
- TeX~can~only~open~up~to~16~output~streams~at~one~time.\\
- All~16~are~currently~in~use,~and~something~wanted~to~open~
- another~one.
- }
\__kernel_msg_new:nnnn { kernel } { unbalanced-quote-in-filename }
{ Unbalanced~quotes~in~file~name~'#1'. }
{
@@ -3564,7 +3673,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
deleted file mode 100644
index febd7f7aa9e..00000000000
--- a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx
+++ /dev/null
@@ -1,389 +0,0 @@
-% \iffalse meta-comment
-%
-%% File: l3final.dtx
-%
-% Copyright (C) 1990-2020 The LaTeX3 Project
-%
-% It may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this
-% license or (at your option) any later version. The latest version
-% of this license is in the file
-%
-% https://www.latex-project.org/lppl.txt
-%
-% This file is part of the "l3kernel bundle" (The Work in LPPL)
-% and all files in that bundle must be distributed together.
-%
-% -----------------------------------------------------------------------
-%
-% The development version of the bundle can be found at
-%
-% https://github.com/latex3/latex3
-%
-% for those people who are interested.
-%
-%<*driver>
-\documentclass[full,kernel]{l3doc}
-\begin{document}
- \DocInput{\jobname.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \title{^^A
-% The \pkg{l3final} package\\ Format finalisation^^A
-% }
-%
-% \author{^^A
-% The \LaTeX3 Project\thanks
-% {^^A
-% E-mail:
-% \href{mailto:latex-team@latex-project.org}
-% {latex-team@latex-project.org}^^A
-% }^^A
-% }
-%
-% \date{Released 2020-03-06}
-%
-% \maketitle
-%
-% \begin{documentation}
-%
-% This module is the end of the \LaTeX3 format file. Currently, a lot of this
-% is copy-pasted from the \LaTeXe{} format or is highly unstable (essentially
-% hacks which need revisiting later).
-%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3final} Implementation}
-%
-% \begin{macrocode}
-%<*initex>
-% \end{macrocode}
-%
-% \subsection{Input encoding}
-%
-% \begin{macrocode}
-%<@@=char>
-% \end{macrocode}
-%
-% The letters |a|--|z| and |A|--|Z| have the correct catcode directly from \IniTeX{}
-% while for Unicode engines (almost) all characters to be treated as letters
-% are defined by the automatic data parsing. Thus the changes here are to
-% deal with the additional cases.
-%
-% All the characters in the range $0$--$31$ \emph{except} tab (|^^I|), nl
-% (|^^J|), ff (|^^L|) and cr (|^^M|).
-% \begin{macrocode}
-\int_step_inline:nnn { 0 } { `\^^H }
- { \char_set_catcode_invalid:n {#1} }
-\char_set_catcode_invalid:n { `\^^K }
-\int_step_inline:nnn { `\^^N } { 31 }
- { \char_set_catcode_invalid:n {#1} }
-% \end{macrocode}
-% The same is true for the top of the $7$-bit range.
-% \begin{macrocode}
-\char_set_catcode_invalid:n { 127 }
-% \end{macrocode}
-% For the $8$-bit engines dotless-I and dotless-J need to be valid,
-% and these therefore appear in some following code. To avoid an issue
-% when those lines are read, the chars are made valid here and that is
-% reversed for Unicode engines below.
-% \begin{macrocode}
-\char_set_catcode_letter:n { `\^^Y }
-\char_set_catcode_letter:n { `\^^Z }
-% \end{macrocode}
-%
-% For non-Unicode engine we now need to convert from UTF-$8$ to $8$-bit
-% for pattern reading and document use. The set up here is copied from
-% the file |conv-utf8-ec.tex| maintained by \textsc{tug} for hyphenation
-% pattern use. As some of the relevant primitives have been moved and to
-% allow for self-contained code that is copied here with minor adjustments.
-% (The primitives have to be available at point of use not just at point of
-% definition so a compatibility layer is hard to arrange here.)
-% \begin{macrocode}
-\bool_lazy_or:nnTF
- { \sys_if_engine_luatex_p: }
- { \sys_if_engine_xetex_p: }
-% \end{macrocode}
-% Unicode engines: make these two invalid (this happens after \TeX{}
-% has read and thrown away their use in the following).
-% \begin{macrocode}
- {
- \char_set_catcode_invalid:n { `\^^Y }
- \char_set_catcode_invalid:n { `\^^Z }
- }
-% \end{macrocode}
-% Now for $8$-bit engines.
-% \begin{macrocode}
- {
-% \end{macrocode}
-% At least for the present, make \upTeX{} behave like \pdfTeX{} so
-% the set up is easier.
-% \begin{macrocode}
- \sys_if_engine_uptex:T
- { \tex_disablecjktoken:D }
-% \end{macrocode}
-% The actual mappings: these are kept low-level for performance reasons.
-% \begin{macrocode}
- \cs_new:cpn { @@_active_C3:N } #1
- {
- \if_meaning:w #1 ^^9f ^^ff \else: % ß - U+00DF - germandbls
- \if_meaning:w #1 ^^a0 ^^e0 \else: % à - U+00E0 - agrave
- \if_meaning:w #1 ^^a1 ^^e1 \else: % á - U+00E1 - aacute
- \if_meaning:w #1 ^^a2 ^^e2 \else: % â - U+00E2 - acircumflex
- \if_meaning:w #1 ^^a3 ^^e3 \else: % ã - U+00E3 - atilde
- \if_meaning:w #1 ^^a4 ^^e4 \else: % ä - U+00E4 - adieresis
- \if_meaning:w #1 ^^a5 ^^e5 \else: % å - U+00E5 - aring
- \if_meaning:w #1 ^^a6 ^^e6 \else: % æ - U+00E6 - ae
- \if_meaning:w #1 ^^a7 ^^e7 \else: % ç - U+00E7 - ccedilla
- \if_meaning:w #1 ^^a8 ^^e8 \else: % è - U+00E8 - egrave
- \if_meaning:w #1 ^^a9 ^^e9 \else: % é - U+00E9 - eacute
- \if_meaning:w #1 ^^aa ^^ea \else: % ê - U+00EA - ecircumflex
- \if_meaning:w #1 ^^ab ^^eb \else: % ë - U+00EB - edieresis
- \if_meaning:w #1 ^^ac ^^ec \else: % ì - U+00EC - igrave
- \if_meaning:w #1 ^^ad ^^ed \else: % í - U+00ED - iacute
- \if_meaning:w #1 ^^ae ^^ee \else: % î - U+00EE - icircumflex
- \if_meaning:w #1 ^^af ^^ef \else: % ï - U+00EF - idieresis
- \if_meaning:w #1 ^^b0 ^^f0 \else: % ð - U+00F0 - eth
- \if_meaning:w #1 ^^b1 ^^f1 \else: % ñ - U+00F1 - ntilde
- \if_meaning:w #1 ^^b2 ^^f2 \else: % ò - U+00F2 - ograve
- \if_meaning:w #1 ^^b3 ^^f3 \else: % ó - U+00F3 - oacute
- \if_meaning:w #1 ^^b4 ^^f4 \else: % ô - U+00F4 - ocircumflex
- \if_meaning:w #1 ^^b5 ^^f5 \else: % õ - U+00F5 - otilde
- \if_meaning:w #1 ^^b6 ^^f6 \else: % ö - U+00F6 - odieresis
- \if_meaning:w #1 ^^b8 ^^f8 \else: % ø - U+00F8 - oslash
- \if_meaning:w #1 ^^b9 ^^f9 \else: % ù - U+00F9 - ugrave
- \if_meaning:w #1 ^^ba ^^fa \else: % ú - U+00FA - uacute
- \if_meaning:w #1 ^^bb ^^fb \else: % û - U+00FB - ucircumflex
- \if_meaning:w #1 ^^bc ^^fc \else: % ü - U+00FC - udieresis
- \if_meaning:w #1 ^^bd ^^fd \else: % ý - U+00FD - yacute
- \if_meaning:w #1 ^^be ^^fe \else: % þ - U+00FE - thorn
- \if_meaning:w #1 ^^bf ^^b8 \else: % ÿ - U+00FF - ydieresis
- \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
- \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
- \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
- }
- \cs_new:cpn { @@_active_C4:N } #1
- {
- \if_meaning:w #1 ^^83 ^^a0 \else: % ă - U+0103 - abreve
- \if_meaning:w #1 ^^85 ^^a1 \else: % ą - U+0105 - aogonek
- \if_meaning:w #1 ^^87 ^^a2 \else: % ć - U+0107 - cacute
- \if_meaning:w #1 ^^8d ^^a3 \else: % č - U+010D - ccaron
- \if_meaning:w #1 ^^8f ^^a4 \else: % ď - U+010F - dcaron
- \if_meaning:w #1 ^^91 ^^9e \else: % đ - U+0111 - dcroat
- \if_meaning:w #1 ^^99 ^^a6 \else: % ę - U+0119 - eogonek
- \if_meaning:w #1 ^^9b ^^a5 \else: % ě - U+011B - ecaron
- \if_meaning:w #1 ^^9f ^^a7 \else: % ğ - U+011F - gbreve
- \if_meaning:w #1 ^^b1 ^^19 \else: % ı - U+0131 - dotlessi
- \if_meaning:w #1 ^^b3 ^^bc \else: % ij - U+0133 - ij
- \if_meaning:w #1 ^^ba ^^a8 \else: % ĺ - U+013A - lacute
- \if_meaning:w #1 ^^be ^^a9 \else: % ľ - U+013E - lcaron
- \__kernel_msg_expandable_error:nn { kernel } { encoding-failure }
- \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
- }
- \cs_new:cpn { @@_active_C5:N } #1
- {
- \if_meaning:w #1 ^^82 ^^aa \else: % ł - U+0142 - lslash
- \if_meaning:w #1 ^^84 ^^ab \else: % ń - U+0144 - nacute
- \if_meaning:w #1 ^^88 ^^ac \else: % ň - U+0148 - ncaron
- \if_meaning:w #1 ^^8b ^^ad \else: % ŋ - U+014B - eng
- \if_meaning:w #1 ^^91 ^^ae \else: % ő - U+0151 - ohungarumlaut
- \if_meaning:w #1 ^^93 ^^f7 \else: % œ - U+0153 - oe
- \if_meaning:w #1 ^^95 ^^af \else: % ŕ - U+0155 - racute
- \if_meaning:w #1 ^^99 ^^b0 \else: % ř - U+0159 - rcaron
- \if_meaning:w #1 ^^9b ^^b1 \else: % ś - U+015B - sacute
- \if_meaning:w #1 ^^9f ^^b3 \else: % ş - U+015F - scedilla
- \if_meaning:w #1 ^^a1 ^^b2 \else: % š - U+0161 - scaron
- \if_meaning:w #1 ^^a5 ^^b4 \else: % ť - U+0165 - tcaron
- \if_meaning:w #1 ^^af ^^b7 \else: % ů - U+016F - uring
- \if_meaning:w #1 ^^b1 ^^b6 \else: % ű - U+0171 - uhungarumlaut
- \if_meaning:w #1 ^^ba ^^b9 \else: % ź - U+017A - zacute
- \if_meaning:w #1 ^^bc ^^bb \else: % ż - U+017C - zdotaccent
- \if_meaning:w #1 ^^be ^^ba \else: % ž - U+017E - zcaron
- \__kernel_msg_expandable_error:nn { kernel } { encoding-failure }
- \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
- \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
- }
- \cs_new:cpn { @@_active_C8:N } #1
- {
- \if_meaning:w #1 ^^99 ^^b3 \else: % ș - U+0219 - scommaaccent
- \if_meaning:w #1 ^^9b ^^b5 \else: % ț - U+021B - tcommaaccent
- \if_meaning:w #1 ^^b7 ^^1a \else: % ȷ - U+0237 - dotlessj
- \__kernel_msg_expandable_error:nn { kernel } { encoding-failure }
- \fi: \fi: \fi:
- }
-% \end{macrocode}
-% Install and record the active characters.
-% \begin{macrocode}
- \clist_map_inline:nn { C3 , C4 , C5 , C8 }
- {
- \char_set_catcode_active:n { "#1 }
- \char_set_active_eq:nc { "#1 } { @@_active_ #1 :N }
- \seq_put_right:Nx \l_char_special_seq
- { \exp_not:c { \char_generate:nn { "#1 } { 12 } } }
- \seq_put_right:Nx \l_char_active_seq
- { \exp_not:c { \char_generate:nn { "#1 } { 12 } } }
- }
- \__kernel_msg_new:nnn { kernel } { encoding-failure }
- { Unknown~UTF-8~char }
-% \end{macrocode}
-% All of the chars are lower case so give them the correct \tn{lccode}
-% values.
-% \begin{macrocode}
- \clist_map_inline:nn
- {
- 19 , 1A , 9E , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9 ,
- AA , AB , AC , AD , AE , AF , B0 , B1 , B2 , B3 , B3 , B4 , B5 ,
- B6 , B7 , B8 , B9 , BA , BB , BC , E0 , E1 , E2 , E3 , E4 , E5 ,
- E6 , E7 , E8 , E9 , EA , EB , EC , ED , EE , EF , F0 , F1 , F2 ,
- F3 , F4 , F5 , F6 , F7 , F8 , F9 , FA , FB , FC , FD , FE , FF
- }
- { \char_set_lccode:nn { "#1 } { "#1 } }
- }
-% \end{macrocode}
-%
-% \subsection{Temporary hacks}
-%
-% \begin{macro}{\T1/lmr/m/n/10, \TU/lmr/m/n/10}
-% For \emph{testing only} provide some kind of output: for that we
-% need a font. At present, select Latin Modern Roman at 10\,pt:
-% entirely arbitrary but at least usable.
-% \begin{macrocode}
-\sys_if_engine_luatex:T
- {
- \tex_everyjob:D \exp_after:wN
- {
- \tex_the:D \tex_everyjob:D
- \lua_now:n { require("l3format.lua") }
- }
- }
-\use:x
- {
- \tex_everyjob:D
- {
- \tex_the:D \tex_everyjob:D
- \bool_lazy_or:nnTF
- { \sys_if_engine_luatex_p: }
- { \sys_if_engine_xetex_p: }
- {
- \tex_font:D \exp_not:c { TU/lmr/m/n/10 }
- = "[lmroman10-regular.otf]/OT" \scan_stop:
- \exp_not:c { TU/lmr/m/n/10 }
- \tex_font:D \exp_not:c { TU/lmm/m/n/10 }
- = "[latinmodern-math.otf]/OT:mode=base;script=math;" \scan_stop:
- \tex_font:D \exp_not:c { TU/lmm/m/n/7 }
- = "[latinmodern-math.otf]/OT:mode=base;script=math;+ssty=0;"~at~7pt \scan_stop:
- \tex_font:D \exp_not:c { TU/lmm/m/n/5 }
- = "[latinmodern-math.otf]/OT:mode=base;script=math;+ssty=1;"~at~5pt \scan_stop:
- \exp_not:N \int_step_inline:nnn { 0 } { 3 }
- {
- \tex_textfont:D ##1 = \exp_not:c { TU/lmm/m/n/10 }
- \tex_scriptfont:D ##1 = \exp_not:c { TU/lmm/m/n/7 }
- \tex_scriptscriptfont:D ##1 = \exp_not:c { TU/lmm/m/n/5 }
- }
- }
- {
- \tex_font:D \exp_not:c { T1/lmr/m/n/10 }
- = ec-lmr10 \scan_stop:
- \exp_not:c { T1/lmr/m/n/10 }
- \tex_font:D \exp_not:c { OT1/lmr/m/n/10 }
- = rm-lmr10 \scan_stop:
- \tex_font:D \exp_not:c { OML/lmm/m/it/10 }
- = lmmi10 \scan_stop:
- \tex_font:D \exp_not:c { OMS/lmsy/m/n/10 }
- = lmsy10 \scan_stop:
- \tex_font:D \exp_not:c { OMX/lmex/m/n/10 }
- = lmex10 \scan_stop:
- \tex_font:D \exp_not:c { OT1/lmr/m/n/7 }
- = rm-lmr7 \scan_stop:
- \tex_font:D \exp_not:c { OML/lmm/m/it/7 }
- = lmmi7 \scan_stop:
- \tex_font:D \exp_not:c { OMS/lmsy/m/n/7 }
- = lmsy7 \scan_stop:
- \tex_font:D \exp_not:c { OMX/lmex/m/n/7 }
- = lmex10~at~7pt \scan_stop:
- \tex_font:D \exp_not:c { OT1/lmr/m/n/5 }
- = rm-lmr5 \scan_stop:
- \tex_font:D \exp_not:c { OML/lmm/m/it/5 }
- = lmmi5 \scan_stop:
- \tex_font:D \exp_not:c { OMS/lmsy/m/n/5 }
- = lmsy5 \scan_stop:
- \tex_font:D \exp_not:c { OMX/lmex/m/n/5 }
- = lmex10~at~5pt \scan_stop:
- \tex_textfont:D 0 = \exp_not:c { OT1/lmr/m/n/10 }
- \tex_textfont:D 1 = \exp_not:c { OML/lmm/m/it/10 }
- \tex_textfont:D 2 = \exp_not:c { OMS/lmsy/m/n/10 }
- \tex_textfont:D 3 = \exp_not:c { OMX/lmex/m/n/10 }
- \tex_scriptfont:D 0 = \exp_not:c { OT1/lmr/m/n/7 }
- \tex_scriptfont:D 1 = \exp_not:c { OML/lmm/m/it/7 }
- \tex_scriptfont:D 2 = \exp_not:c { OMS/lmsy/m/n/7 }
- \tex_scriptfont:D 3 = \exp_not:c { OMX/lmex/m/n/7 }
- \tex_scriptscriptfont:D 0 = \exp_not:c { OT1/lmr/m/n/5 }
- \tex_scriptscriptfont:D 1 = \exp_not:c { OML/lmm/m/it/5 }
- \tex_scriptscriptfont:D 2 = \exp_not:c { OMS/lmsy/m/n/5 }
- \tex_scriptscriptfont:D 3 = \exp_not:c { OMX/lmex/m/n/5 }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% Produce PDF output if possible (easier testing) and set some kind of
-% horizontal width: the one here is the \LaTeXe{} default. A parfill is
-% also useful so we get some kind of sensible paragraphs.
-% \begin{macrocode}
-\dim_set:Nn \tex_hsize:D { 345pt }
-\skip_set:Nn \tex_parfillskip:D { 0pt plus 1fil }
-\cs_if_exist:NT \tex_pdfoutput:D
- { \int_set:Nn \tex_pdfoutput:D { 1 } }
-% \end{macrocode}
-%
-% \begin{macro}{\stop}
-% A way out of the run without needing to switch to the code environment.
-% \begin{macrocode}
-\cs_set_eq:NN \stop \tex_end:D
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Final tasks}
-%
-% \begin{macro}{\par}
-% \TeX{} has a nasty habit of inserting a command with the name \cs{par}
-% so we had better make sure that \cs{par} has a definition.
-% \begin{macrocode}
-\cs_set_eq:NN \par \tex_par:D
-% \end{macrocode}
-% \end{macro}
-%
-% The very last job is to dump the format, taking care to first leave
-% the code environment and set the appropriate flag.
-% \begin{macrocode}
-\use:n
- {
- \bool_set_false:N \l__kernel_expl_bool
- \char_set_catcode_space:n { 9 } % tab
- \char_set_catcode_space:n { 32 } % space
- \char_set_catcode_active:n { 34 } % double quote
- \char_set_catcode_active:n { 36 } % dollar
- \char_set_catcode_active:n { 38 } % ampersand
- \char_set_catcode_other:n { 58 } % colon
- \char_set_catcode_active:n { 94 } % circumflex
- \char_set_catcode_active:n { 95 } % underscore
- \char_set_catcode_other:n { 124 } % pipe
- \char_set_catcode_active:n { 126 } % tilde
- \tex_endlinechar:D = 13 \scan_stop:
- \tex_newlinechar:D = 10 \scan_stop:
- \tex_dump:D
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</initex>
-% \end{macrocode}
-%
-% \end{implementation}
-%
-%\PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
index d807c132ed6..c55b5564537 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
@@ -2,7 +2,7 @@
%
%% File: l3flag.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -159,7 +159,7 @@
% \section{\pkg{l3flag} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -300,7 +300,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3format.ins b/Master/texmf-dist/source/latex/l3kernel/l3format.ins
deleted file mode 100644
index a4f728a0d07..00000000000
--- a/Master/texmf-dist/source/latex/l3kernel/l3format.ins
+++ /dev/null
@@ -1,163 +0,0 @@
-\iffalse meta-comment
-
-File l3format.ins
-
-Copyright (C) 2011,2012,2014-2020 The LaTeX3 Project
-
-It may be distributed and/or modified under the conditions of the
-LaTeX Project Public License (LPPL), either version 1.3c of this
-license or (at your option) any later version. The latest version
-of this license is in the file
-
- https://www.latex-project.org/lppl.txt
-
-This file is part of the "l3kernel bundle" (The Work in LPPL)
-and all files in that bundle must be distributed together.
-
------------------------------------------------------------------------
-
-The development version of the bundle can be found at
-
- https://github.com/latex3/latex3
-
-for those people who are interested.
-
------------------------------------------------------------------------
-
-Any modification of this file should ensure that the copyright and
-license information is placed in the derived files.
-
-\fi
-
-\let\jobname\relax
-\input l3docstrip.dtx
-\askforoverwritefalse
-
-\preamble
-
-Copyright (C) 1990-2020 The LaTeX3 Project
-
-It may be distributed and/or modified under the conditions of
-the LaTeX Project Public License (LPPL), either version 1.3c of
-this license or (at your option) any later version. The latest
-version of this license is in the file:
-
- https://www.latex-project.org/lppl.txt
-
-This file is part of the "l3kernel bundle" (The Work in LPPL)
-and all files in that bundle must be distributed together.
-
-\endpreamble
-% stop docstrip adding \endinput
-\postamble
-\endpostamble
-
-\keepsilent
-
-\generate
- {
- \file{l3format.ltx}
- {
- \from{l3bootstrap.dtx} {initex}
- \from{l3names.dtx} {initex}
- \from{l3basics.dtx} {initex}
- \from{l3expan.dtx} {initex}
- \from{l3tl.dtx} {initex}
- \from{l3str.dtx} {initex}
- \from{l3quark.dtx} {initex}
- \from{l3seq.dtx} {initex}
- % ======== FORMAT ONLY =========
- \from{l3alloc.dtx} {initex}
- % ==============================
- \from{l3int.dtx} {initex}
- \from{l3flag.dtx} {initex}
- \from{l3prg.dtx} {initex}
- \from{l3sys.dtx} {initex}
- \from{l3clist.dtx} {initex}
- \from{l3token.dtx} {initex}
- \from{l3prop.dtx} {initex}
- \from{l3msg.dtx} {initex}
- \from{l3file.dtx} {initex}
- \from{l3skip.dtx} {initex}
- \from{l3keys.dtx} {initex}
- \from{l3intarray.dtx} {initex}
- \from{l3fp.dtx} {initex}
- \from{l3fp-aux.dtx} {initex}
- \from{l3fp-traps.dtx} {initex}
- \from{l3fp-round.dtx} {initex}
- \from{l3fp-parse.dtx} {initex}
- \from{l3fp-assign.dtx} {initex}
- \from{l3fp-logic.dtx} {initex}
- \from{l3fp-basics.dtx} {initex}
- \from{l3fp-extended.dtx}{initex}
- \from{l3fp-expo.dtx} {initex}
- \from{l3fp-trig.dtx} {initex}
- \from{l3fp-convert.dtx} {initex}
- \from{l3fp-random.dtx} {initex}
- \from{l3fparray.dtx} {initex}
- \from{l3sort.dtx} {initex}
- \from{l3str-convert.dtx}{initex}
- \from{l3tl-analysis.dtx}{initex}
- \from{l3regex.dtx} {initex}
- \from{l3box.dtx} {initex}
- \from{l3color-base.dtx} {initex}
- \from{l3coffins.dtx} {initex}
- \from{l3luatex.dtx} {initex,tex}
- \from{l3unicode.dtx} {initex}
- \from{l3text.dtx} {initex}
- \from{l3text-case.dtx} {initex}
- \from{l3text-purify.dtx}{initex}
- \from{l3candidates.dtx} {initex}
- % ======== FORMAT ONLY =========
- \from{l3final.dtx} {initex}
- % ==============================
- }
- }
-
-% ISO-8859 encodings.
-\generate{%
- \file{l3str-enc-iso88591.def} {\from{l3str-convert.dtx}{iso88591}}%
- \file{l3str-enc-iso88592.def} {\from{l3str-convert.dtx}{iso88592}}%
- \file{l3str-enc-iso88593.def} {\from{l3str-convert.dtx}{iso88593}}%
- \file{l3str-enc-iso88594.def} {\from{l3str-convert.dtx}{iso88594}}%
- \file{l3str-enc-iso88595.def} {\from{l3str-convert.dtx}{iso88595}}%
- \file{l3str-enc-iso88596.def} {\from{l3str-convert.dtx}{iso88596}}%
- \file{l3str-enc-iso88597.def} {\from{l3str-convert.dtx}{iso88597}}%
- \file{l3str-enc-iso88598.def} {\from{l3str-convert.dtx}{iso88598}}%
- \file{l3str-enc-iso88599.def} {\from{l3str-convert.dtx}{iso88599}}%
- \file{l3str-enc-iso885910.def} {\from{l3str-convert.dtx}{iso885910}}%
- \file{l3str-enc-iso885911.def} {\from{l3str-convert.dtx}{iso885911}}%
- \file{l3str-enc-iso885913.def} {\from{l3str-convert.dtx}{iso885913}}%
- \file{l3str-enc-iso885914.def} {\from{l3str-convert.dtx}{iso885914}}%
- \file{l3str-enc-iso885915.def} {\from{l3str-convert.dtx}{iso885915}}%
- \file{l3str-enc-iso885916.def} {\from{l3str-convert.dtx}{iso885916}}%
-}
-
-\generate{\file{l3debug.def}{\from{l3debug.dtx}{initex}}}
-\generate{\file{l3deprecation.def}{\from{l3deprecation.dtx}{initex,patches}}}
-
-\generate{\file{l3docstrip.tex}{\from{l3docstrip.dtx}{program}}}
-
-% Lua code (currently identical to the package-mode version)
-
-\def\MetaPrefix{--}
-\preamble
-
-Copyright (C) 1990-2020 The LaTeX3 Project
-
-It may be distributed and/or modified under the conditions of
-the LaTeX Project Public License (LPPL), either version 1.3c of
-this license or (at your option) any later version. The latest
-version of this license is in the file:
-
- https://www.latex-project.org/lppl.txt
-
-This file is part of the "l3kernel bundle" (The Work in LPPL)
-and all files in that bundle must be distributed together.
-
-\endpreamble
-\nopostamble
-\generate{\file{expl3.lua} {\from{l3luatex.dtx}{lua,package}}}
-\generate{\file{l3format.lua}{\from{l3luatex.dtx}{lua,initex}}}
-
-\endbatchfile
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
index dab8dc4d7d6..30d9cc9ad57 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-assign.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -33,14 +33,14 @@
% \title{The \textsf{l3fp-assign} package\\
% Floating point expressions}
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
% \maketitle
%
% \begin{documentation}
@@ -52,7 +52,7 @@
% \section{\pkg{l3fp-assign} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -80,9 +80,9 @@
% assignments.
% \begin{macrocode}
\cs_new_protected:Npn \fp_set:Nn #1#2
- { \tl_set:Nx #1 { \exp_not:f { \@@_parse:n {#2} } } }
+ { \__kernel_tl_set:Nx #1 { \exp_not:f { \@@_parse:n {#2} } } }
\cs_new_protected:Npn \fp_gset:Nn #1#2
- { \tl_gset:Nx #1 { \exp_not:f { \@@_parse:n {#2} } } }
+ { \__kernel_tl_gset:Nx #1 { \exp_not:f { \@@_parse:n {#2} } } }
\cs_new_protected:Npn \fp_const:Nn #1#2
{ \tl_const:Nx #1 { \exp_not:f { \@@_parse:n {#2} } } }
\cs_generate_variant:Nn \fp_set:Nn {c}
@@ -219,7 +219,7 @@
% \end{variable}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
index f9601e4d768..451f0952fc0 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-aux.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -56,7 +56,7 @@
% \section{\pkg{l3fp-aux} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -245,12 +245,27 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\s_@@_mark, \s_@@_stop}
+% \begin{variable}{\s_@@_expr_mark, \s_@@_expr_stop}
% Aliases of \cs{tex_relax:D}, used to terminate expressions.
% \begin{macrocode}
+\scan_new:N \s_@@_expr_mark
+\scan_new:N \s_@@_expr_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\s_@@_mark, \s_@@_stop}
+% Generic scan marks used throughout the module.
+% \begin{macrocode}
\scan_new:N \s_@@_mark
\scan_new:N \s_@@_stop
% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_i_delimit_by_s_stop:nw}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+% \end{macrocode}
% \end{macro}
%
% \begin{macro}
@@ -378,7 +393,7 @@
\@@_if_type_fp:NTwFw
#1 \@@_use_ii_until_s:nnw
\s_@@ { \@@_use_i_until_s:nw 4 }
- \q_stop
+ \s_@@_stop
}
% \end{macrocode}
% \end{macro}
@@ -540,12 +555,12 @@
%
% \begin{macro}[EXP]{\@@_if_type_fp:NTwFw}
% Used as \cs{@@_if_type_fp:NTwFw} \meta{marker} \Arg{true code}
-% \cs{s_@@} \Arg{false code} \cs{q_stop}, this test whether the
+% \cs{s_@@} \Arg{false code} \cs{s_@@_stop}, this test whether the
% \meta{marker} is \cs{s_@@} or not and runs the appropriate
% \meta{code}. The very unusual syntax is for optimization purposes
% as that function is used for all floating point operations.
% \begin{macrocode}
-\cs_new:Npn \@@_if_type_fp:NTwFw #1 \s_@@ #2 #3 \q_stop {#2}
+\cs_new:Npn \@@_if_type_fp:NTwFw #1 \s_@@ #2 #3 \s_@@_stop {#2}
% \end{macrocode}
% \end{macro}
%
@@ -562,7 +577,7 @@
\@@_if_type_fp:NTwFw
#1 \@@_array_if_all_fp_loop:w
\s_@@ { \prg_break:n \use_iii:nnn }
- \q_stop
+ \s_@@_stop
}
% \end{macrocode}
% \end{macro}
@@ -579,17 +594,17 @@
\@@_if_type_fp:NTwFw
#1 { }
\s_@@ { \@@_type_from_scan_other:N #1 }
- \q_stop
+ \s_@@_stop
}
\cs_new:Npx \@@_type_from_scan_other:N #1
{
\exp_not:N \exp_after:wN \exp_not:N \@@_type_from_scan:w
- \exp_not:N \token_to_str:N #1 \exp_not:N \q_mark
- \tl_to_str:n { s_@@ _? } \exp_not:N \q_mark \exp_not:N \q_stop
+ \exp_not:N \token_to_str:N #1 \s_@@_mark
+ \tl_to_str:n { s_@@ _? } \s_@@_mark \s_@@_stop
}
\exp_last_unbraced:NNNNo
\cs_new:Npn \@@_type_from_scan:w #1
- { \tl_to_str:n { s_@@ } } #2 \q_mark #3 \q_stop {#2}
+ { \tl_to_str:n { s_@@ } } #2 \s_@@_mark #3 \s_@@_stop {#2}
% \end{macrocode}
% \end{macro}
%
@@ -614,7 +629,7 @@
\cs_end:
#2 #3
}
- \q_stop
+ \s_@@_stop
}
\exp_last_unbraced:NNNNo
\cs_new:Npn \@@_change_func_type_aux:w #1 { \tl_to_str:n { @@ } } { }
@@ -631,7 +646,7 @@
% \end{macro}
%
% \begin{macro}[EXP]{\@@_exp_after_any_f:Nnw, \@@_exp_after_any_f:nw}
-% \begin{macro}[EXP]{\@@_exp_after_stop_f:nw}
+% \begin{macro}[EXP]{\@@_exp_after_expr_stop_f:nw}
% The |Nnw| function simply dispatches to the appropriate
% \cs[no-index]{@@_exp_after\ldots{}_f:nw} with \enquote{\ldots{}}
% (either empty or |_|\meta{type}) extracted from |#1|, which should
@@ -649,10 +664,10 @@
\@@_if_type_fp:NTwFw
#2 \@@_exp_after_f:nw
\s_@@ { \@@_exp_after_any_f:Nnw #2 }
- \q_stop
+ \s_@@_stop
{#1} #2
}
-\cs_new_eq:NN \@@_exp_after_stop_f:nw \use_none:nn
+\cs_new_eq:NN \@@_exp_after_expr_stop_f:nw \use_none:nn
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -667,7 +682,7 @@
% \meta{fp_1} |;|\\
% \ldots{}\\
% \meta{fp_n} |;|\\
-% \cs{s_@@_stop}
+% \cs{s_@@_expr_stop}
% \end{quote}
% \begin{macrocode}
\cs_new:Npn \@@_exp_after_tuple_o:w
@@ -679,7 +694,7 @@
\exp_after:wN \@@_tuple_chk:w
\exp_after:wN {
\exp:w \exp_end_continue_f:w
- \@@_exp_after_array_f:w #2 \s_@@_stop
+ \@@_exp_after_array_f:w #2 \s_@@_expr_stop
\exp_after:wN }
\exp_after:wN ;
\exp:w \exp_end_continue_f:w #1
@@ -1224,27 +1239,9 @@
% \subsection{Fast string comparison}
%
% \begin{macro}{\@@_str_if_eq:nn}
-% A private version of the low-level string comparison function. As
-% the nature of the arguments is restricted and as speed is of the essence,
-% this version does not seek to deal with |#| tokens.
-% No \pkg{l3sys} or \pkg{l3luatex} just yet so we have to define in terms of
-% primitives.
+% A private version of the low-level string comparison function.
% \begin{macrocode}
-\sys_if_engine_luatex:TF
- {
- \cs_new:Npn \@@_str_if_eq:nn #1#2
- {
- \tex_directlua:D
- {
- l3kernel.strcmp
- (
- " \tex_luaescapestring:D {#1}",
- " \tex_luaescapestring:D {#2}"
- )
- }
- }
- }
- { \cs_new_eq:NN \@@_str_if_eq:nn \tex_strcmp:D }
+\cs_new_eq:NN \@@_str_if_eq:nn \tex_strcmp:D
% \end{macrocode}
% \end{macro}
%
@@ -1281,7 +1278,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
index 75803be1af8..0742eafffd3 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-basics.dtx
%
-% Copyright (C) 2011-2014,2016-2020 The LaTeX3 Project
+% Copyright (C) 2011-2014,2016-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -33,14 +33,14 @@
% \title{The \textsf{l3fp-basics} package\\
% Floating point arithmetic}
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3fp-basics} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -2168,7 +2168,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
index 03e40eae388..ccac4b8a42c 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-convert.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -56,7 +56,7 @@
% \section{\texttt{l3fp-convert} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -111,11 +111,11 @@
\cs_new:Npn \@@_trim_zeros:w #1 ;
{
\@@_trim_zeros_loop:w #1
- ; \@@_trim_zeros_loop:w 0; \@@_trim_zeros_dot:w .; \s_stop
+ ; \@@_trim_zeros_loop:w 0; \@@_trim_zeros_dot:w .; \s_@@_stop
}
\cs_new:Npn \@@_trim_zeros_loop:w #1 0; #2 { #2 #1 ; #2 }
\cs_new:Npn \@@_trim_zeros_dot:w #1 .; { \@@_trim_zeros_end:w #1 ; }
-\cs_new:Npn \@@_trim_zeros_end:w #1 ; #2 \s_stop { #1 }
+\cs_new:Npn \@@_trim_zeros_end:w #1 ; #2 \s_@@_stop { #1 }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -620,7 +620,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
index 8489efefae4..09e0a27689f 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-expo.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -33,14 +33,14 @@
% \title{The \textsf{l3fp-expo} package\\
% Floating point exponential-related functions}
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3fp-expo} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -704,7 +704,7 @@
; #2#3#4 0000 0000 ;
}
\cs_new:Npn \@@_exp_Taylor_ii:ww #1; #2;
- { \@@_exp_Taylor_loop:www 10 ; #1 ; #1 ; \s_stop }
+ { \@@_exp_Taylor_loop:www 10 ; #1 ; #1 ; \s_@@_stop }
\cs_new:Npn \@@_exp_Taylor_loop:www #1; #2; #3;
{
\if_int_compare:w #1 = 1 \exp_stop_f:
@@ -719,7 +719,7 @@
#2 ;
}
}
-\cs_new:Npn \@@_exp_Taylor_break:Nww #1 #2; #3 \s_stop
+\cs_new:Npn \@@_exp_Taylor_break:Nww #1 #2; #3 \s_@@_stop
{ \@@_fixed_add_one:wN #2 ; }
% \end{macrocode}
% \end{macro}
@@ -1369,7 +1369,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
index f08e2562262..d3654cf4f5b 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-extended.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -33,14 +33,14 @@
% \title{The \textsf{l3fp-extended} package\\
% Manipulating numbers with extended precision, for internal use}
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3fp-extended} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -1263,7 +1263,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
index d58c523d9d6..e6da23c805c 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-logic.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -33,14 +33,14 @@
% \title{The \textsf{l3fp-logic} package\\
% Floating point conditionals}
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3fp-logic} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -125,8 +125,8 @@
{
\if_charcode:w 0
\@@_if_type_fp:NTwFw
- #1 { \use_i_delimit_by_q_stop:nw #3 \q_stop }
- \s_@@ 1 \q_stop
+ #1 { \@@_use_i_delimit_by_s_stop:nw #3 \s_@@_stop }
+ \s_@@ 1 \s_@@_stop
\prg_return_false:
\else:
\prg_return_true:
@@ -181,8 +181,8 @@
\cs_new:Npn \@@_compare_back_any:ww #1#2; #3
{
\@@_if_type_fp:NTwFw
- #1 { \@@_if_type_fp:NTwFw #3 \use_i:nn \s_@@ \use_ii:nn \q_stop }
- \s_@@ \use_ii:nn \q_stop
+ #1 { \@@_if_type_fp:NTwFw #3 \use_i:nn \s_@@ \use_ii:nn \s_@@_stop }
+ \s_@@ \use_ii:nn \s_@@_stop
\@@_compare_back:ww
{
\cs:w
@@ -416,9 +416,9 @@
% \begin{macrocode}
\cs_new:Npn \@@_step:wwwN #1#2; #3#4; #5#6; #7
{
- \@@_if_type_fp:NTwFw #1 { } \s_@@ \prg_break: \q_stop
- \@@_if_type_fp:NTwFw #3 { } \s_@@ \prg_break: \q_stop
- \@@_if_type_fp:NTwFw #5 { } \s_@@ \prg_break: \q_stop
+ \@@_if_type_fp:NTwFw #1 { } \s_@@ \prg_break: \s_@@_stop
+ \@@_if_type_fp:NTwFw #3 { } \s_@@ \prg_break: \s_@@_stop
+ \@@_if_type_fp:NTwFw #5 { } \s_@@ \prg_break: \s_@@_stop
\use_i:nnnn { \@@_step_fp:wwwN #1#2; #3#4; #5#6; #7 }
\prg_break_point:
\use:n
@@ -683,15 +683,15 @@
\if_meaning:w \@@_parse_infix_::N #5
\if_charcode:w 0
\@@_if_type_fp:NTwFw
- #2 { \use_i:nn \use_i_delimit_by_q_stop:nw #3 \q_stop }
- \s_@@ 1 \q_stop
+ #2 { \use_i:nn \@@_use_i_delimit_by_s_stop:nw #3 \s_@@_stop }
+ \s_@@ 1 \s_@@_stop
\exp_after:wN \exp_after:wN \exp_after:wN \@@_ternary_auxii:NwwN
\else:
\exp_after:wN \exp_after:wN \exp_after:wN \@@_ternary_auxi:NwwN
\fi:
\exp_after:wN #1
\exp:w \exp_end_continue_f:w
- \@@_exp_after_array_f:w #4 \s_@@_stop
+ \@@_exp_after_array_f:w #4 \s_@@_expr_stop
\exp_after:wN @
\exp:w
\@@_parse_operand:Nw \c_@@_prec_colon_int
@@ -702,7 +702,7 @@
\exp_after:wN \@@_parse_continue:NwN
\exp_after:wN #1
\exp:w \exp_end_continue_f:w
- \@@_exp_after_array_f:w #4 \s_@@_stop
+ \@@_exp_after_array_f:w #4 \s_@@_expr_stop
\exp_after:wN #5
\exp_after:wN #1
\fi:
@@ -712,7 +712,7 @@
\exp_after:wN \@@_parse_continue:NwN
\exp_after:wN #1
\exp:w \exp_end_continue_f:w
- \@@_exp_after_array_f:w #2 \s_@@_stop
+ \@@_exp_after_array_f:w #2 \s_@@_expr_stop
#4 #1
}
\cs_new:Npn \@@_ternary_auxii:NwwN #1#2@#3@#4
@@ -720,14 +720,14 @@
\exp_after:wN \@@_parse_continue:NwN
\exp_after:wN #1
\exp:w \exp_end_continue_f:w
- \@@_exp_after_array_f:w #3 \s_@@_stop
+ \@@_exp_after_array_f:w #3 \s_@@_expr_stop
#4 #1
}
% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
index 0d125aeaec8..ce534ca6c68 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-parse.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -33,14 +33,14 @@
% \title{The \textsf{l3fp-parse} package\\
% Floating point expression parsing}
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3fp-parse} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -468,7 +468,7 @@
% \item If the next token is a control sequence with the meaning of
% \cs{scan_stop:}, it can be: \cs{s_@@}, in which case our job is
% done, as what follows is an internal floating point number, or
-% \cs{s_@@_mark}, in which case the expression has come to an early
+% \cs{s_@@_expr_mark}, in which case the expression has come to an early
% end, as we are still looking for a number here, or something else,
% in which case we consider the control sequence to be a bad
% variable resulting from \texttt{c}-expansion.
@@ -499,7 +499,7 @@
% operator. This goes as follows.
% \begin{itemize}
% \item If the next token is a control sequence, it could be the
-% special marker \cs{s_@@_mark}, and
+% special marker \cs{s_@@_expr_mark}, and
% otherwise it is a case of juxtaposing numbers, such as
% |2\c_zero_int|, with an implied multiplication.
% \item If the next token is a letter, it is also a case of
@@ -741,7 +741,7 @@
% \begin{macro}[EXP]
% {
% \@@_parse_one_fp:NN,
-% \@@_exp_after_mark_f:nw,
+% \@@_exp_after_expr_mark_f:nw,
% \@@_exp_after_?_f:nw
% }
% This function receives a \meta{precedence} and a control sequence
@@ -750,8 +750,8 @@
% \item \cs{s_@@} starts a floating point number, and we call
% \cs{@@_exp_after_f:nw}, which |f|-expands after the floating
% point.
-% \item \cs{s_@@_mark} is a premature end, we call
-% \cs{@@_exp_after_mark_f:nw}, which triggers an |fp-early-end|
+% \item \cs{s_@@_expr_mark} is a premature end, we call
+% \cs{@@_exp_after_expr_mark_f:nw}, which triggers an |fp-early-end|
% error.
% \item For a control sequence not containing \cs[no-index]{s_@@}, we call
% \cs{@@_exp_after_?_f:nw}, causing a |bad-variable| error.
@@ -776,7 +776,7 @@
\exp_after:wN #1 \exp:w \@@_parse_expand:w
}
}
-\cs_new:Npn \@@_exp_after_mark_f:nw #1
+\cs_new:Npn \@@_exp_after_expr_mark_f:nw #1
{
\int_case:nnF { \exp_after:wN \use_i:nnn \use_none:nnn #1 }
{
@@ -800,7 +800,6 @@
{#2}
\exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w #1
}
-%<*package>
\cs_set_protected:Npn \@@_tmp:w #1
{
\cs_if_exist:NT #1
@@ -824,7 +823,6 @@
}
}
\exp_args:Nc \@@_tmp:w { @unexpandable@protect }
-%</package>
% \end{macrocode}
% \end{macro}
%
@@ -877,11 +875,11 @@
; \exp_not:N \@@_parse_one_register_dim:ww
\tl_to_str:n { pt } ; \exp_not:N \@@_parse_one_register_mu:www
. \tl_to_str:n { pt } ; \exp_not:N \@@_parse_one_register_int:www
- \exp_not:N \q_stop
+ \s_@@_stop
}
\exp_args:Nno \use:nn
{ \cs_new:Npn \@@_parse_one_register_auxii:wwwNw #1 . #2 }
- { \tl_to_str:n { pt } #3 ; #4#5 \q_stop }
+ { \tl_to_str:n { pt } #3 ; #4#5 \s_@@_stop }
{ #4 #1.#2; }
\exp_args:Nno \use:nn
{ \cs_new:Npn \@@_parse_one_register_mu:www #1 }
@@ -1643,12 +1641,12 @@
% \end{macro}
%
% \begin{macro}[rEXP]
-% {\@@_parse_exponent:N, \@@_parse_exponent_aux:N}
+% {\@@_parse_exponent:N, \@@_parse_exponent_aux:NN}
% This function should be called within an \cs{int_value:w}
% expansion (or within an integer expression). It leaves digits of the
% exponent behind it in the input stream, and terminates the expansion
-% with a semicolon. If there is no~|e|, leave an exponent of~$0$. If
-% there is an~|e|, expand the next token to run some tests on it. The
+% with a semicolon. If there is no~|e| (or~|E|), leave an exponent of~$0$. If
+% there is an~|e| or~|E|, expand the next token to run some tests on it. The
% first rough test is that if the character code of~|#1| is greater
% than that of~|9| (largest code valid for an exponent, less than any
% code valid for an identifier), there was in fact no exponent;
@@ -1656,23 +1654,24 @@
% \begin{macrocode}
\cs_new:Npn \@@_parse_exponent:N #1
{
- \if:w e \exp_not:N #1
- \exp_after:wN \@@_parse_exponent_aux:N
+ \if:w e \if:w E \exp_not:N #1 e \else: \exp_not:N #1 \fi:
+ \exp_after:wN \@@_parse_exponent_aux:NN
+ \exp_after:wN #1
\exp:w
\else:
0 \@@_parse_return_semicolon:w #1
\fi:
\@@_parse_expand:w
}
-\cs_new:Npn \@@_parse_exponent_aux:N #1
+\cs_new:Npn \@@_parse_exponent_aux:NN #1#2
{
- \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #1
- 0 \else: `#1 \fi: > `9 \exp_stop_f:
- 0 \exp_after:wN ; \exp_after:wN e
+ \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #2
+ 0 \else: `#2 \fi: > `9 \exp_stop_f:
+ 0 \exp_after:wN ; \exp_after:wN #1
\else:
\exp_after:wN \@@_parse_exponent_sign:N
\fi:
- #1
+ #2
}
% \end{macrocode}
% \end{macro}
@@ -1837,12 +1836,12 @@
% \begin{macrocode}
\cs_new:Npn \@@_parse_apply_unary:NNNwN #1#2#3#4@#5
{
- \@@_parse_apply_unary_chk:NwNw #4 @ ; . \q_stop
+ \@@_parse_apply_unary_chk:NwNw #4 @ ; . \s_@@_stop
\@@_parse_apply_unary_type:NNN
#3 #2 #4 @
\exp:w \exp_end_continue_f:w #5 #1
}
-\cs_new:Npn \@@_parse_apply_unary_chk:NwNw #1#2 ; #3#4 \q_stop
+\cs_new:Npn \@@_parse_apply_unary_chk:NwNw #1#2 ; #3#4 \s_@@_stop
{
\if_meaning:w @ #3 \else:
\token_if_eq_meaning:NNTF . #3
@@ -1947,7 +1946,7 @@
\exp_not:N \token_if_eq_meaning:NNTF #3
\exp_not:c { @@_parse_infix_):N }
{
- \exp_not:N \@@_exp_after_array_f:w #2 \s_@@_stop
+ \exp_not:N \@@_exp_after_array_f:w #2 \s_@@_expr_stop
\exp_not:N \exp_after:wN
\exp_not:N \@@_parse_infix_after_paren:NN
\exp_not:N \exp_after:wN #1
@@ -2116,7 +2115,7 @@
% in two steps. The \cs{@@_parse_operand:Nw} function performs
% computations until reaching an operation with precedence
% \cs{c_@@_prec_end_int} or less, namely, the end of the expression. The
-% marker \cs{s_@@_mark} indicates that the next token is an already
+% marker \cs{s_@@_expr_mark} indicates that the next token is an already
% parsed version of an infix operator, and \cs{@@_parse_infix_end:N}
% has infinitely negative precedence. Finally, clean up a
% (well-defined) set of extra tokens and stop the initial expansion
@@ -2129,12 +2128,12 @@
\exp:w
\@@_parse_operand:Nw \c_@@_prec_end_int
\@@_parse_expand:w #1
- \s_@@_mark \@@_parse_infix_end:N
- \s_@@_stop
+ \s_@@_expr_mark \@@_parse_infix_end:N
+ \s_@@_expr_stop
\exp_end:
}
\cs_new:Npn \@@_parse_after:ww
- #1@ \@@_parse_infix_end:N \s_@@_stop #2 { #2 #1 }
+ #1@ \@@_parse_infix_end:N \s_@@_expr_stop #2 { #2 #1 }
\cs_new:Npn \@@_parse_o:n #1
{
\exp:w
@@ -2142,8 +2141,8 @@
\exp:w
\@@_parse_operand:Nw \c_@@_prec_end_int
\@@_parse_expand:w #1
- \s_@@_mark \@@_parse_infix_end:N
- \s_@@_stop
+ \s_@@_expr_mark \@@_parse_infix_end:N
+ \s_@@_expr_stop
{
\exp_end_continue_f:w
\@@_exp_after_any_f:nw { \exp_after:wN \exp_stop_f: }
@@ -2265,7 +2264,7 @@
{
\if_catcode:w \scan_stop: \exp_not:N #2
\if_int_compare:w
- \@@_str_if_eq:nn { \s_@@_mark } { \exp_not:N #2 }
+ \@@_str_if_eq:nn { \s_@@_expr_mark } { \exp_not:N #2 }
= 0 \exp_stop_f:
\exp_after:wN \exp_after:wN
\exp_after:wN \@@_parse_infix_mark:NNN
@@ -2317,7 +2316,7 @@
{
\if_catcode:w \scan_stop: \exp_not:N #2
\if_int_compare:w
- \@@_str_if_eq:nn { \s_@@_mark } { \exp_not:N #2 }
+ \@@_str_if_eq:nn { \s_@@_expr_mark } { \exp_not:N #2 }
= 0 \exp_stop_f:
\exp_after:wN \exp_after:wN
\exp_after:wN \@@_parse_infix_mark:NNN
@@ -2349,7 +2348,7 @@
% \subsubsection{Closing parentheses and commas}
%
% \begin{macro}[EXP]{\@@_parse_infix_mark:NNN}
-% As an infix operator, \cs{s_@@_mark} means that the next
+% As an infix operator, \cs{s_@@_expr_mark} means that the next
% token~(|#3|) has already gone through \cs{@@_parse_infix:NN} and
% should be provided the precedence~|#1|. The scan mark~|#2| is
% discarded.
@@ -2764,7 +2763,7 @@
\cs_new:Npn \@@_parse_function_one_two:nnw #1#2#3
{
\@@_if_type_fp:NTwFw
- #3 { } \s_@@ \@@_parse_function_one_two_error_o:w \q_stop
+ #3 { } \s_@@ \@@_parse_function_one_two_error_o:w \s_@@_stop
\@@_parse_function_one_two_aux:nnw {#1} {#2} #3
}
\cs_new:Npn \@@_parse_function_one_two_error_o:w #1#2#3#4 @
@@ -2786,7 +2785,7 @@
\fi:
\@@_parse_function_one_two_error_o:w
}
- \q_stop
+ \s_@@_stop
\@@_parse_function_one_two_auxii:nnw {#1} {#2} #3; #4
}
\cs_new:Npn \@@_parse_function_one_two_auxii:nnw #1#2#3; #4; #5
@@ -2888,17 +2887,15 @@
{ Arguments~in~#1#2~are~invalid. }
\__kernel_msg_new:nnn { kernel } { fp-infty-pi }
{ Math~command~#1 is~not~an~fp }
-%<*package>
\cs_if_exist:cT { @unexpandable@protect }
{
\__kernel_msg_new:nnn { kernel } { fp-robust-cmd }
{ Robust~command~#1 invalid~in~fp~expression! }
}
-%</package>
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
index 17bd04d9eed..cf909120d9a 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-random.dtx
%
-% Copyright (C) 2016-2020 The LaTeX3 Project
+% Copyright (C) 2016-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -33,14 +33,14 @@
% \title{The \textsf{l3fp-random} package\\
% Floating point random numbers}
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3fp-random} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -654,7 +654,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
index 5063fa4105a..c67804df2be 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-round.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -56,7 +56,7 @@
% \section{\pkg{l3fp-round} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -582,7 +582,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
index 07e29f0bb41..c9d3d19deb2 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-traps.dtx
%
-% Copyright (C) 2011-2014,2016-2020 The LaTeX3 Project
+% Copyright (C) 2011-2014,2016-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -33,14 +33,14 @@
% \title{The \textsf{l3fp-traps} package\\
% Trapping floating-point exceptions}
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
% \maketitle
%
% \begin{documentation}
@@ -52,7 +52,7 @@
% \section{\pkg{l3fp-traps} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -390,7 +390,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
index 3fef46a6c29..55460c8a8fe 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp-trig.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -33,14 +33,14 @@
% \title{The \textsf{l3fp-trig} package\\
% Floating point trigonometric functions}
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,7 +53,7 @@
% \section{\pkg{l3fp-trig} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -1688,7 +1688,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
index e4dbc76a8e0..476e7a8789b 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fp.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -41,7 +41,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -96,7 +96,7 @@
% $\operatorname{asech} x$, $\operatorname{acsch} x$.
% \item Extrema: $\max(x_{1},x_{2},\ldots)$, $\min(x_{1},x_{2},\ldots)$,
% $\operatorname{abs}(x)$.
-% \item Rouning functions, controlled by two optional
+% \item Rounding functions, controlled by two optional
% values, $n$ (number of places, $0$ by default) and
% $t$ (behavior on a tie, $\nan$ by default):
% \begin{itemize}
@@ -446,10 +446,10 @@
% \end{syntax}
% Evaluates the \meta{floating point expressions} as described for
% \cs{fp_eval:n} and compares consecutive result using the
-% corresponding \meta{relation}, namely it compares \meta{intexpr_1}
-% and \meta{intexpr_2} using the \meta{relation_1}, then
-% \meta{intexpr_2} and \meta{intexpr_3} using the \meta{relation_2},
-% until finally comparing \meta{intexpr_N} and \meta{intexpr_{N+1}}
+% corresponding \meta{relation}, namely it compares \meta{fpexpr_1}
+% and \meta{fpexpr_2} using the \meta{relation_1}, then
+% \meta{fpexpr_2} and \meta{fpexpr_3} using the \meta{relation_2},
+% until finally comparing \meta{fpexpr_N} and \meta{fpexpr_{N+1}}
% using the \meta{relation_N}. The test yields \texttt{true} if all
% comparisons are \texttt{true}. Each \meta{floating point
% expression} is evaluated only once. Contrarily to
@@ -813,7 +813,7 @@
% \item \meta{sign}: a possibly empty string of |+| and |-| characters;
% \item \meta{significand}: a non-empty string of digits together with zero
% or one dot;
-% \item \meta{exponent} optionally: the character |e|, followed by a
+% \item \meta{exponent} optionally: the character |e| or |E|, followed by a
% possibly empty string of |+|~and~|-| tokens, and a non-empty string
% of digits.
% \end{itemize}
@@ -843,7 +843,7 @@
% valid floating point numbers. Note that the latter could be mistaken
% with the difference of \enquote{\texttt{e}} and $1$. To avoid
% confusions, the base of natural logarithms cannot be input as |e| and
-% should be input as \texttt{exp(1)} or \cs{c_e_fp}.
+% should be input as \texttt{exp(1)} or \cs{c_e_fp} (which is faster).
%
% Special numbers are input as follows:
% \begin{itemize}
@@ -1364,7 +1364,7 @@
%
% \begin{variable}[tested = m3fp-parse001]
% {em, ex, in, pt, pc, cm, mm, dd, cc, nd, nc, bp, sp}
-% \newcommand{\unit}[1]{\text{\texttt{#1}}}
+% \newcommand{\unit}[1]{\ifmmode\,\fi\text{\texttt{#1}}}
% Those units of measurement are equal to their values in \unit{pt},
% namely
% \begin{align*}
@@ -1378,7 +1378,7 @@
% 1 \unit{nd} & = 0.375 \unit{mm} = 1.066978346456693 \unit{pt} \\
% 1 \unit{nc} & = 12 \unit{nd} = 12.80374015748031 \unit{pt} \\
% 1 \unit{bp} & = \frac{1}{72} \unit{in} = 1.00375 \unit{pt} \\
-% 1 \unit{sp} & = 2^{-16} \unit{pt} = 1.52587890625e-5 \unit{pt}.
+% 1 \unit{sp} & = 2^{-16} \unit{pt} = 1.52587890625 \times 10^{-5} \unit{pt}.
% \end{align*}
% The values of the (font-dependent) units \unit{em} and \unit{ex} are
% gathered from \TeX{} when the surrounding floating point expression
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
index 3016f666fb6..9d4ca672adb 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
@@ -2,7 +2,7 @@
%
%% File: l3fparray.dtx
%
-% Copyright (C) 2018-2020 The LaTeX3 Project
+% Copyright (C) 2018-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -115,7 +115,7 @@
% \section{\pkg{l3fparray} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -388,7 +388,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
index 8d9fc1c8955..85da3a199e1 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
@@ -2,7 +2,7 @@
%
%% File: l3int.dtx
%
-% Copyright (C) 1990-2020 The LaTeX3 Project
+% Copyright (C) 1990-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -919,7 +919,7 @@
% code and so should only be used for short-term storage.
% \end{variable}
%
-% \subsection{Direct number expansion}
+% \section{Direct number expansion}
%
% \begin{function}[EXP, added = 2018-03-27]{\int_value:w}
% \begin{syntax}
@@ -1010,7 +1010,7 @@
% \section{\pkg{l3int} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -1053,6 +1053,37 @@
% \end{macro}
% \end{macro}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Scan marks used throughout the module.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_none_delimit_by_s_stop:w}
+% Function to gobble until a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Quarks for recursion.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop_do:Nn,\@@_if_recursion_tail_stop:N}
+% Functions to query quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop_do:Nn
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop:N
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Integer expressions}
%
% \begin{macro}{\int_eval:n}
@@ -1241,13 +1272,11 @@
% this is therefore accessed by name. (The same applies to \cs{newbox},
% \cs{newdimen} and so on.)
% \begin{macrocode}
-%<*package>
\cs_new_protected:Npn \int_new:N #1
{
\__kernel_chk_if_free_cs:N #1
\cs:w newcount \cs_end: #1
}
-%</package>
\cs_generate_variant:Nn \int_new:N { c }
% \end{macrocode}
% \end{macro}
@@ -1469,7 +1498,7 @@
\@@_compare_error:
}
\cs_new:Npn \@@_compare_error:Nw
- #1#2 \q_stop
+ #1#2 \s_@@_stop
{
{ }
\c_zero_int \fi:
@@ -1525,7 +1554,7 @@
% \cs{@@_compare:w} receives as its argument an integer, a relation
% symbol, and some more tokens. We then setup the loop, which is
% ended by the two odd-looking items |e| and |{=nd_}|, with a trailing
-% \cs{q_stop} used to grab the entire argument when necessary.
+% \cs{s_@@_stop} used to grab the entire argument when necessary.
% \begin{macrocode}
\prg_new_conditional:Npnn \int_compare:n #1 { p , T , F , TF }
{
@@ -1535,7 +1564,7 @@
\cs_new:Npn \@@_compare:w #1 \@@_compare_error:
{
\exp_after:wN \if_false: \int_value:w
- \@@_compare:Nw #1 e { = nd_ } \q_stop
+ \@@_compare:Nw #1 e { = nd_ } \s_@@_stop
}
% \end{macrocode}
% The goal here is to find an \meta{operand} and a \meta{comparison}.
@@ -1552,13 +1581,13 @@
% \cs{scan_stop:}, ignored thanks to \tn{unexpanded}, and
% \cs{@@_compare_error:Nw} raises an error.
% \begin{macrocode}
-\cs_new:Npn \@@_compare:Nw #1#2 \q_stop
+\cs_new:Npn \@@_compare:Nw #1#2 \s_@@_stop
{
\exp_after:wN \@@_compare:NNw
- \@@_to_roman:w - 0 #2 \q_mark
- #1#2 \q_stop
+ \@@_to_roman:w - 0 #2 \s_@@_mark
+ #1#2 \s_@@_stop
}
-\cs_new:Npn \@@_compare:NNw #1#2#3 \q_mark
+\cs_new:Npn \@@_compare:NNw #1#2#3 \s_@@_mark
{
\__kernel_exp_not:w
\use:c
@@ -1585,7 +1614,7 @@
% and call \cs{@@_compare:Nw} to look for additional operands, after
% evaluating the following expression.
% \begin{macrocode}
-\cs_new:cpn { @@_compare_end_=:NNw } #1#2#3 e #4 \q_stop
+\cs_new:cpn { @@_compare_end_=:NNw } #1#2#3 e #4 \s_@@_stop
{
{#3} \exp_stop_f:
\prg_return_false: \else: \prg_return_true: \fi:
@@ -1593,7 +1622,7 @@
\cs_new:Npn \@@_compare:nnN #1#2#3
{
{#2} \exp_stop_f:
- \prg_return_false: \exp_after:wN \use_none_delimit_by_q_stop:w
+ \prg_return_false: \exp_after:wN \@@_use_none_delimit_by_s_stop:w
\fi:
#1 #2 #3 \exp_after:wN \@@_compare:Nw \int_value:w \@@_eval:w
}
@@ -1665,14 +1694,14 @@
\exp_args:Nf \@@_case:nnTF { \int_eval:n {#1} } {#2} { } { }
}
\cs_new:Npn \@@_case:nnTF #1#2#3#4
- { \@@_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
+ { \@@_case:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
\cs_new:Npn \@@_case:nw #1#2#3
{
\int_compare:nNnTF {#1} = {#2}
{ \@@_case_end:nw {#3} }
{ \@@_case:nw {#1} }
}
-\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
{ \exp_end: #1 #4 }
% \end{macrocode}
% \end{macro}
@@ -2261,10 +2290,10 @@
% \subsection{Converting from other formats to integers}
%
% \begin{macro}[rEXP]{\@@_pass_signs:wn, \@@_pass_signs_end:wn}
-% Called as \cs{@@_pass_signs:wn} \meta{signs and digits} \cs{q_stop}
+% Called as \cs{@@_pass_signs:wn} \meta{signs and digits} \cs{s_@@_stop}
% \Arg{code}, this function leaves in the input stream any sign it
% finds, then inserts the \meta{code} before the first non-sign token
-% (and removes \cs{q_stop}). More precisely, it deletes any~|+| and
+% (and removes \cs{s_@@_stop}). More precisely, it deletes any~|+| and
% passes any~|-| to the input stream, hence should be called in an
% integer expression.
% \begin{macrocode}
@@ -2277,7 +2306,7 @@
\exp_after:wN #1
\fi:
}
-\cs_new:Npn \@@_pass_signs_end:wn #1 \q_stop #2 { #2 #1 }
+\cs_new:Npn \@@_pass_signs_end:wn #1 \s_@@_stop #2 { #2 #1 }
% \end{macrocode}
% \end{macro}
%
@@ -2295,13 +2324,13 @@
\int_eval:n
{
\exp_after:wN \@@_pass_signs:wn \tl_to_str:n {#1}
- \q_stop { \@@_from_alph:nN { 0 } }
- \q_recursion_tail \q_recursion_stop
+ \s_@@_stop { \@@_from_alph:nN { 0 } }
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
}
\cs_new:Npn \@@_from_alph:nN #1#2
{
- \quark_if_recursion_tail_stop_do:Nn #2 {#1}
+ \@@_if_recursion_tail_stop_do:Nn #2 {#1}
\exp_args:Nf \@@_from_alph:nN
{ \int_eval:n { #1 * 26 + \@@_from_alph:N #2 } }
}
@@ -2327,13 +2356,13 @@
\int_eval:n
{
\exp_after:wN \@@_pass_signs:wn \tl_to_str:n {#1}
- \q_stop { \@@_from_base:nnN { 0 } {#2} }
- \q_recursion_tail \q_recursion_stop
+ \s_@@_stop { \@@_from_base:nnN { 0 } {#2} }
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
}
\cs_new:Npn \@@_from_base:nnN #1#2#3
{
- \quark_if_recursion_tail_stop_do:Nn #3 {#1}
+ \@@_if_recursion_tail_stop_do:Nn #3 {#1}
\exp_args:Nf \@@_from_base:nnN
{ \int_eval:n { #1 * #2 + \@@_from_base:N #3 } }
{#2}
@@ -2409,16 +2438,16 @@
(
0
\exp_after:wN \@@_from_roman:NN \tl_to_str:n {#1}
- \q_recursion_tail \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_tail \q_@@_recursion_stop
)
}
}
\cs_new:Npn \@@_from_roman:NN #1#2
{
- \quark_if_recursion_tail_stop:N #1
+ \@@_if_recursion_tail_stop:N #1
\int_if_exist:cF { c_@@_from_roman_ #1 _int }
{ \@@_from_roman_error:w }
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ + \use:c { c_@@_from_roman_ #1 _int } }
\int_if_exist:cF { c_@@_from_roman_ #2 _int }
{ \@@_from_roman_error:w }
@@ -2436,7 +2465,7 @@
\@@_from_roman:NN #2
}
}
-\cs_new:Npn \@@_from_roman_error:w #1 \q_recursion_stop #2
+\cs_new:Npn \@@_from_roman_error:w #1 \q_@@_recursion_stop #2
{ #2 * 0 - 1 }
% \end{macrocode}
% \end{macro}
@@ -2550,7 +2579,7 @@
% \end{variable}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
index 0219861d145..dc7b7fdee8c 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
@@ -2,7 +2,7 @@
%
%% File: l3intarray.dtx
%
-% Copyright (C) 2017-2020 The LaTeX3 Project
+% Copyright (C) 2017-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -157,7 +157,7 @@
%
% While \LuaTeX{}'s memory is extensible, other engines can
% \enquote{only} deal with a bit less than $4\times 10^6$ entries in all
-% \tn{fontdimen} arrays combined (with default \TeX{}Live settings).
+% \tn{fontdimen} arrays combined (with default \TeX{} Live settings).
%
% \end{documentation}
%
@@ -166,7 +166,7 @@
% \section{\pkg{l3intarray} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -266,29 +266,28 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_bounds:NNnTF, \@@_bounds_error:NNn}
+% \begin{macro}[EXP]{\@@_bounds:NNnTF, \@@_bounds_error:NNnw}
% The functions \cs{intarray_gset:Nnn} and \cs{intarray_item:Nn} share
% bounds checking. The |T| branch is used if |#3| is within bounds of
% the array |#2|.
% \begin{macrocode}
-\cs_new:Npn \@@_bounds:NNnTF #1#2#3#4#5
+\cs_new:Npn \@@_bounds:NNnTF #1#2#3
{
\if_int_compare:w 1 > #3 \exp_stop_f:
- \@@_bounds_error:NNn #1 #2 {#3}
- #5
+ \@@_bounds_error:NNnw #1 #2 {#3}
\else:
\if_int_compare:w #3 > \intarray_count:N #2 \exp_stop_f:
- \@@_bounds_error:NNn #1 #2 {#3}
- #5
- \else:
- #4
+ \@@_bounds_error:NNnw #1 #2 {#3}
\fi:
\fi:
+ \use_i:nn
}
-\cs_new:Npn \@@_bounds_error:NNn #1#2#3
+\cs_new:Npn \@@_bounds_error:NNnw #1#2#3#4 \use_i:nn #5#6
{
+ #4
#1 { kernel } { out-of-bounds }
{ \token_to_str:N #2 } {#3} { \intarray_count:N #2 }
+ #6
}
% \end{macrocode}
% \end{macro}
@@ -462,6 +461,51 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}[rEXP]{\__kernel_intarray_range_to_clist:Nnn, \@@_range_to_clist:ww}
+% Loop through part of the array.
+% \begin{macrocode}
+\cs_new:Npn \__kernel_intarray_range_to_clist:Nnn #1#2#3
+ {
+ \exp_last_unbraced:Nf \use_none:n
+ {
+ \exp_after:wN \@@_range_to_clist:ww
+ \int_value:w \int_eval:w #2 \exp_after:wN ;
+ \int_value:w \int_eval:w #3 ;
+ #1 \prg_break_point:
+ }
+ }
+\cs_new:Npn \@@_range_to_clist:ww #1 ; #2 ; #3
+ {
+ \if_int_compare:w #1 > #2 \exp_stop_f:
+ \prg_break:n
+ \fi:
+ , \__kernel_intarray_item:Nn #3 {#1}
+ \exp_after:wN \@@_range_to_clist:ww
+ \int_value:w \int_eval:w #1 + \c_one_int ; #2 ; #3
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\__kernel_intarray_gset_range_from_clist:Nnn, \@@_gset_range:Nw}
+% Loop through part of the array.
+% \begin{macrocode}
+\cs_new_protected:Npn \__kernel_intarray_gset_range_from_clist:Nnn #1#2#3
+ {
+ \int_set:Nn \l_@@_loop_int {#2}
+ \@@_gset_range:Nw #1 #3 , , \prg_break_point:
+ }
+\cs_new_protected:Npn \@@_gset_range:Nw #1 #2 ,
+ {
+ \if_catcode:w \scan_stop: \tl_to_str:n {#2} \scan_stop:
+ \prg_break:n
+ \fi:
+ \__kernel_intarray_gset:Nnn #1 \l_@@_loop_int {#2}
+ \int_incr:N \l_@@_loop_int
+ \@@_gset_range:Nw #1
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\intarray_show:N, \intarray_show:c, \intarray_log:N, \intarray_log:c}
% Convert the list to a comma list (with spaces after each comma)
% \begin{macrocode}
@@ -580,7 +624,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
index b58d0fdc27c..f0fd4227077 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
@@ -2,7 +2,7 @@
%
%% File: l3kernel-functions.dtx
%
-% Copyright (C) 2018-2020 The LaTeX3 Project
+% Copyright (C) 2018-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -101,6 +101,19 @@
% the \meta{follow-on}.
% \end{function}
%
+% \begin{function}{
+% \__kernel_dependency_version_check:Nn,
+% \__kernel_dependency_version_check:nn,
+% }
+% \begin{syntax}
+% \cs{__kernel_dependency_version_check:Nn} \Arg{\cs{date}} \Arg{file}
+% \cs{__kernel_dependency_version_check:nn} \Arg{date} \Arg{file}
+% \end{syntax}
+% Checks if the loaded version of the \pkg{expl3} kernel is at least \meta{date},
+% required by \meta{file}. If the kernel date is older than \meta{date}, the
+% loading of \meta{file} is aborted and an error is raised.
+% \end{function}
+%
% \begin{function}{\__kernel_deprecation_code:nn}
% \begin{syntax}
% \cs{__kernel_deprecation_code:nn} \Arg{error code} \Arg{working code}
@@ -125,6 +138,11 @@
% set by \cs{ExplSyntaxOn}/\cs{ExplSyntaxOff}.
% \end{variable}
%
+% \begin{variable}{\c__kernel_expl_date_tl}
+% A token list containing the release date of the \pkg{l3kernel} preloaded
+% in \LaTeXe{} used to check if dependencies match.
+% \end{variable}
+%
% \begin{function}{\__kernel_file_missing:n}
% \begin{syntax}
% \cs{__kernel_file_missing:n} \Arg{name}
@@ -162,6 +180,58 @@
% than once.
% \end{function}
%
+% \begin{function}[added = 2018-03-31]{\__kernel_intarray_gset:Nnn}
+% \begin{syntax}
+% \cs{__kernel_intarray_gset:Nnn} \meta{intarray~var} \Arg{index} \Arg{value}
+% \end{syntax}
+% Faster version of \cs{intarray_gset:Nnn}. Stores the \meta{value}
+% into the \meta{integer array variable} at the \meta{position}. The
+% \meta{index} and \meta{value} must be suitable for a direct
+% assignment to a \TeX{} count register, for instance expanding to an
+% integer denotation or obtained through the primitive \tn{numexpr}
+% (which may be un-terminated). No bound checking is performed: the
+% caller is responsible for ensuring that the \meta{position} is
+% between $1$ and the \cs{intarray_count:N}, and the \meta{value}'s
+% absolute value is at most $2^{30}-1$. Assignments are always
+% global.
+% \end{function}
+%
+% \begin{function}[EXP, added = 2018-03-31]{\__kernel_intarray_item:Nn}
+% \begin{syntax}
+% \cs{__kernel_intarray_item:Nn} \meta{intarray~var} \Arg{index}
+% \end{syntax}
+% Faster version of \cs{intarray_item:Nn}. Expands to the integer
+% entry stored at the \meta{index} in the \meta{integer array
+% variable}. The \meta{index} must be suitable for a direct
+% assignment to a \TeX{} count register and must be between $1$ and
+% the \cs{intarray_count:N}, lest a low-level \TeX{} error occur.
+% \end{function}
+%
+% \begin{function}[rEXP, added = 2020-07-12]{\__kernel_intarray_range_to_clist:Nnn}
+% \begin{syntax}
+% \cs{__kernel_intarray_range_to_clist:Nnn} \meta{intarray~var} \Arg{start index} \Arg{end index}
+% \end{syntax}
+% Converts to integer denotations separated by commas the entries of
+% the \meta{intarray} from positions \meta{start index} to \meta{end
+% index} included. The \meta{start index} and \meta{end index} must
+% be suitable for a direct assignment to a \TeX{} count register, must
+% be between $1$ and the \cs{intarray_count:N}, and be suitably
+% ordered. All tokens have category code other.
+% \end{function}
+%
+% \begin{function}[added = 2020-07-12]{\__kernel_intarray_gset_range_from_clist:Nnn}
+% \begin{syntax}
+% \cs{__kernel_intarray_gset_range_from_clist:Nnn} \meta{intarray~var} \Arg{start index} \Arg{integer clist}
+% \end{syntax}
+% Stores the entries of the \meta{clist} as entries of the
+% \meta{intarray~var} starting from the \meta{start index}, upwards.
+% This is done without any bound checking. The \meta{start index} and
+% all entries of the \meta{integer comma list} (which do not undergo
+% space trimming and brace stripping as in normal clist mappings) must
+% be suitable for a direct assignment to a \TeX{} count register. An
+% empty entry may stop the loop.
+% \end{function}
+%
% \begin{function}{\__kernel_ior_open:Nn, \__kernel_ior_open:No}
% \begin{syntax}
% \cs{__kernel_ior_open:Nn} \meta{stream} \Arg{file name}
@@ -189,6 +259,13 @@
% that \tn{errorcontextlines} is $-1$ when displaying a message.
% \end{function}
%
+% \begin{variable}{\__kernel_kern:n}
+% \begin{syntax}
+% \cs{__kernel_kern:n} \Arg{length}
+% \end{syntax}
+% Inserts a kern of the specified \meta{length}, a dimension expression.
+% \end{variable}
+%
% \begin{function}
% {\__kernel_msg_new:nnnn, \__kernel_msg_new:nnn}
% \begin{syntax}
@@ -238,6 +315,27 @@
%
% \begin{function}
% {
+% \__kernel_msg_critical:nnnnnn ,
+% \__kernel_msg_critical:nnnnn ,
+% \__kernel_msg_critical:nnnn ,
+% \__kernel_msg_critical:nnn ,
+% \__kernel_msg_critical:nn ,
+% \__kernel_msg_critical:nnxxxx ,
+% \__kernel_msg_critical:nnxxx ,
+% \__kernel_msg_critical:nnxx ,
+% \__kernel_msg_critical:nnx
+% }
+% \begin{syntax}
+% \cs{__kernel_msg_critical:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+% \end{syntax}
+% Issues kernel \meta{module} error \meta{message}, passing \meta{arg one}
+% to \meta{arg four} to the text-creating functions. After issuing a
+% critical error, \TeX{} stops reading the current input file.
+% Cannot be redirected.
+% \end{function}
+%
+% \begin{function}
+% {
% \__kernel_msg_error:nnnnnn ,
% \__kernel_msg_error:nnnnn ,
% \__kernel_msg_error:nnnn ,
@@ -329,6 +427,104 @@
% and variable mappings.
% \end{variable}
%
+% \begin{function}{\__kernel_quark_new_test:N}
+% \begin{syntax}
+% \cs{__kernel_quark_new_test:N} \cs[no-index]{\meta{name}:\meta{arg spec}}
+% \end{syntax}
+% Defines a quark-test function \cs[no-index]{\meta{name}:\meta{arg spec}}
+% which tests if its argument is \cs[no-index]{q__\meta{namespace}_recursion_tail},
+% then acts accordingly, as described below for each possible
+% \meta{arg spec}.
+%
+% The \meta{namespace} is determined as the first (nonempty)
+% |_|-delimited word in \meta{name} and is used internally
+% in the definition of auxiliaries. The function
+% \cs{__kernel_quark_new_test:N} does \emph{not} define
+% the \cs[no-index]{q__\meta{namespace}_recursion_tail} and
+% \cs[no-index]{q__\meta{namespace}_recursion_stop} quarks.
+% They should be manually defined with \cs{quark_new:N}.
+%
+% There are $6$ different types of quark-test functions. Which one is
+% defined depends on the \meta{arg spec}, which \emph{must} be one of
+% the options listed now. Four of them are modeled after
+% \cs[no-index]{quark_if_recursion_tail:(N|n)} and
+% \cs[no-index]{quark_if_recursion_tail_do:(N|n)n}.
+% \begin{description}
+% \def\makelabel#1{\texttt{#1}}
+% \item[n] defines \cs[no-index]{\meta{name}:n} such that it
+% checks if |#1| contains only \cs[no-index]{q__\meta{namespace}_recursion_tail}, and
+% if so consumes all tokens up to \cs[no-index]{q__\meta{namespace}_recursion_stop}
+% (\emph{c.f.}~\cs{quark_if_recursion_tail_stop:n}).
+% \item[nn] defines \cs[no-index]{\meta{name}:nn} such that it
+% checks if |#1| contains only \cs[no-index]{q__\meta{namespace}_recursion_tail}, and
+% if so consumes all tokens up to \cs[no-index]{q__\meta{namespace}_recursion_stop},
+% then executes the code |#2| after that
+% (\emph{c.f.}~\cs{quark_if_recursion_tail_stop_do:nn}).
+% \item[N] defines \cs[no-index]{\meta{name}:N} such that it
+% checks if |#1| is \cs[no-index]{q__\meta{namespace}_recursion_tail}, and if so consumes
+% all tokens up to \cs[no-index]{q__\meta{namespace}_recursion_stop}
+% (\emph{c.f.}~\cs{quark_if_recursion_tail_stop:N}).
+% \item[Nn] defines \cs[no-index]{\meta{name}:Nn} such that it
+% checks if |#1| is \cs[no-index]{q__\meta{namespace}_recursion_tail}, and if so consumes
+% all tokens up to \cs[no-index]{q__\meta{namespace}_recursion_stop}, then executes
+% the code |#2| after that
+% (\emph{c.f.}~\cs{quark_if_recursion_tail_stop_do:Nn}).
+% \end{description}
+% The last two are modeled after
+% \cs[no-index]{quark_if_recursion_tail_break:(n|N)N}, and in those
+% cases the quark \cs[no-index]{q__\meta{namespace}_recursion_stop} is
+% not used (and thus needs not be defined).
+% \begin{description}
+% \def\makelabel#1{\texttt{#1}}
+% \item[nN] defines \cs[no-index]{\meta{name}:nN} such that it
+% checks if |#1| contains only \cs[no-index]{q__\meta{namespace}_recursion_tail}, and
+% if so uses the \cs[no-index]{\meta{type}_map_break:} function |#2|.
+% \item[NN] defines \cs[no-index]{\meta{name}:NN} such that it
+% checks if |#1| is \cs[no-index]{q__\meta{namespace}_recursion_tail}, and if so uses
+% the \cs[no-index]{\meta{type}_map_break:} function |#2|.
+% \end{description}
+% Any other signature, as well as a function without signature
+% are errors, and in such case the definition is aborted.
+% \end{function}
+%
+% \begin{function}{\__kernel_quark_new_conditional:Nn}
+% \begin{syntax}
+% \cs{__kernel_quark_new_conditional:Nn} \cs[no-index]{__\meta{namespace}_quark_if_\meta{name}:\meta{arg spec}} \Arg{conditions}
+% \end{syntax}
+% Defines a collection of quark conditionals that test if their
+% argument is the quark \cs[no-index]{q__\meta{namespace}_\meta{name}}
+% and perform suitable actions. The \meta{conditions} are a
+% comma-separated list of one or more of |p|, |T|, |F|, and |TF|, and
+% one conditional is defined for each \meta{condition} in the list, as
+% described for \cs{prg_new_conditional:Npnn}. The conditionals are
+% defined using \cs{prg_new_conditional:Npnn}, so that their name is
+% obtained by adding |p|, |T|, |F|, or |TF| to the base name
+% \cs[no-index]{__\meta{namespace}_quark_if_\meta{name}:\meta{arg spec}}.
+%
+% The first argument of \cs{__kernel_quark_new_conditional:Nn} must
+% contain |_quark_if_| and |:|, as these markers are used to determine
+% the \meta{name} of the quark
+% \cs[no-index]{q__\meta{namespace}_\meta{name}} to be tested. This
+% quark should be manually defined with \cs{quark_new:N}, as
+% \cs{__kernel_quark_new_conditional:Nn} does \emph{not} define it.
+%
+% The function \cs{__kernel_quark_new_conditional:Nn} can define $2$
+% different types of quark conditionals. Which one is defined depends
+% on the \meta{arg spec}, which \emph{must} be one of the following
+% options, modeled after \cs[no-index]{quark_if_nil:(N|n)(TF)}.
+% \begin{description}
+% \def\makelabel#1{\texttt{#1}}
+% \item[n] defines \cs[no-index]{__\meta{namespace}_quark_if_\meta{name}:n(TF)} such that it
+% checks if |#1| contains only \cs[no-index]{q__\meta{namespace}_\meta{name}}, and
+% executes the proper conditional branch.
+% \item[N] defines \cs[no-index]{__\meta{namespace}_quark_if_\meta{name}:N(TF)} such that it
+% checks if |#1| is \cs[no-index]{q__\meta{namespace}_\meta{name}}, and
+% executes the proper conditional branch.
+% \end{description}
+% Any other signature, as well as a function without signature
+% are errors, and in such case the definition is aborted.
+% \end{function}
+%
% \begin{variable}{\c__kernel_randint_max_int}
% Maximal allowed argument to \cs{__kernel_randint:n}. Equal to
% $2^{17}-1$.
@@ -405,6 +601,15 @@
% only a single expansion.
% \end{function}
%
+% \begin{function}{\__kernel_tl_set:Nx, \__kernel_tl_gset:Nx}
+% \begin{syntax}
+% \cs{__kernel_tl_set:Nx} \meta{tl~var} \Arg{tokens}
+% \end{syntax}
+% Fully expands \meta{tokens} and assigns the result to \meta{tl~var}.
+% \meta{tokens} must be given in braces and there must be no token between
+% \meta{tl~var} and \meta{tokens}.
+% \end{function}
+%
% \section{Kernel backend functions}
%
% These functions are required to pass information to the backend. The nature
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
index ab068d57860..4c2b01526a0 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
@@ -2,7 +2,7 @@
%
%% File: l3keys.dtx
%
-% Copyright (C) 2006-2020 The LaTeX3 Project
+% Copyright (C) 2006-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -891,7 +891,45 @@
% \end{verbatim}
% are treated identically.
%
-% \begin{function}[EXP,updated = 2020-02-20]{\keyval_parse:NNn}
+% \begin{function}[rEXP, added=2020-12-19]{\keyval_parse:nnn}
+% \begin{syntax}
+% \cs{keyval_parse:nnn} \Arg{code_1} \Arg{code_2} \Arg{key--value list}
+% \end{syntax}
+% Parses the \meta{key--value list} into a series of \meta{keys} and
+% associated \meta{values}, or keys alone (if no \meta{value} was
+% given). \meta{code_1} receives each \meta{key} (with no \meta{value}) as a
+% trailing brace group, whereas \meta{code_2} is appended by two brace groups,
+% the \meta{key} and \meta{value}.
+% The order of the \meta{keys} in the \meta{key--value list}
+% is preserved. Thus
+% \begin{verbatim}
+% \keyval_parse:nnn
+% { \use_none:nn { code 1 } }
+% { \use_none:nnn { code 2 } }
+% { key1 = value1 , key2 = value2, key3 = , key4 }
+% \end{verbatim}
+% is converted into an input stream
+% \begin{verbatim}
+% \use_none:nnn { code 2 } { key1 } { value1 }
+% \use_none:nnn { code 2 } { key2 } { value2 }
+% \use_none:nnn { code 2 } { key3 } { }
+% \use_none:nn { code 1 } { key4 }
+% \end{verbatim}
+% Note that there is a difference between an empty value (an equals
+% sign followed by nothing) and a missing value (no equals sign at
+% all). Spaces are trimmed from the ends of the \meta{key} and \meta{value},
+% then one \emph{outer} set of braces is removed from the \meta{key}
+% and \meta{value} as part of the processing. If you need exactly the output
+% shown above, you'll need to either \texttt{x}-type or \texttt{e}-type expand
+% the function.
+% \begin{texnote}
+% The result of each list element is returned within \cs{exp_not:n}, which
+% means that the converted input stream does not expand further when
+% appearing in an \texttt{x}-type or \texttt{e}-type argument expansion.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}[rEXP,updated = 2020-12-19]{\keyval_parse:NNn}
% \begin{syntax}
% \cs{keyval_parse:NNn} \meta{function_1} \meta{function_2} \Arg{key--value list}
% \end{syntax}
@@ -920,6 +958,9 @@
% all). Spaces are trimmed from the ends of the \meta{key} and \meta{value},
% then one \emph{outer} set of braces is removed from the \meta{key}
% and \meta{value} as part of the processing.
+%
+% This shares the implementation of \cs{keyval_parse:nnn}, the difference is
+% only semantically.
% \begin{texnote}
% The result is returned within \cs{exp_not:n}, which means that the
% converted input stream does not expand further when appearing in an
@@ -934,18 +975,18 @@
% \section{\pkg{l3keys} Implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \subsection{Low-level interface}
%
-% The low-level key parser is based heavily on \pkg{keyval}, but with a number
-% of additional \enquote{safety} requirements and with the idea that the
-% parsed list of key--value pairs can be processed in a variety of ways.
-% The net result is that this code needs around twice the amount of time
-% as \pkg{keyval} to parse the same list of keys. To optimise speed as far
-% as reasonably practical, a number of lower-level approaches are taken
-% rather than using the higher-level \pkg{expl3} interfaces.
+% The low-level key parser's implementation is based heavily on \pkg{expkv}.
+% Compared to \pkg{keyval} it adds a number of additional \enquote{safety}
+% requirements and allows to process the parsed list of key--value pairs in a
+% variety of ways. The net result is that this code needs around one and a half
+% the amount of time as \pkg{keyval} to parse the same list of keys. To optimise
+% speed as far as reasonably practical, a number of lower-level approaches are
+% taken rather than using the higher-level \pkg{expl3} interfaces.
%
% \begin{macrocode}
%<@@=keyval>
@@ -969,180 +1010,285 @@
{
% \end{macrocode}
%
-% \begin{macro}[EXP]{\keyval_parse:NNn}
-% The main function starts the first of two input loops. The outer loop splits
-% the key--value list at active commas, the inner loop will do so at other
-% commas. The use of \cs{s_@@_mark} here prevents loss of braces from the key
+% \begin{macro}[EXP]{\keyval_parse:nnn, \keyval_parse:NNn}
+% The main function starts the first of two loops. The outer loop splits the
+% key--value list at active commas, the inner loop will do so at other commas.
+% The use of \cs{s_@@_mark} here prevents loss of braces from the key
% argument.
% \begin{macrocode}
- \cs_new:Npn \keyval_parse:NNn ##1 ##2 ##3
- {
- \@@_loop_active:NNw ##1 ##2 \s_@@_mark ##3 #1 \s_@@_tail #1
- }
+ \cs_new:Npn \keyval_parse:nnn ##1 ##2 ##3
+ { \@@_loop_active:nnw {##1} {##2} \s_@@_mark ##3 #1 \s_@@_tail #1 }
+ \cs_new_eq:NN \keyval_parse:NNn \keyval_parse:nnn
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_loop_active:NNw}
+% \begin{macro}[EXP]{\@@_loop_active:nnw}
% First a fast test for the end of the loop is done, it'll gobble everything
-% up to an \cs{s_@@_mark} immediately followed by an \cs{s_@@_tail}. The loop
-% ending macro will gobble everything to the last \cs{s_@@_mark} in this
-% definition.
+% up to a \cs{s_@@_tail}. The loop ending macro will gobble everything to the
+% last comma in this definition.
% If the end isn't reached yet, start the second loop splitting at other
-% comments, and after that one iterate the current loop.
+% commas, the next iteration of this first loop will be inserted by the end of
+% \cs{@@_loop_other:nnw}.
% \begin{macrocode}
- \cs_new:Npn \@@_loop_active:NNw ##1 ##2 ##3 #1
+ \cs_new:Npn \@@_loop_active:nnw ##1 ##2 ##3 #1
{
\@@_if_recursion_tail:w ##3
- \@@_end_loop_active:w \s_@@_mark \s_@@_tail
- \@@_loop_other:NNw ##1 ##2 ##3 , \s_@@_tail ,
- \@@_loop_active:NNw ##1 ##2 \s_@@_mark
+ \@@_end_loop_active:w \s_@@_tail
+ \@@_loop_other:nnw {##1} {##2} ##3 , \s_@@_tail ,
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_loop_other:NNw}
+% \begin{macro}[EXP]{\@@_split_other:w, \@@_split_active:w}
+% These two macros allow to split at the first equals sign of category 12 or
+% 13. At the same time they also execute branching by inserting the first
+% token following \cs{s_@@_mark} that followed the equals sign. Hence they
+% also test for the presence of such an equals sign simultaneously.
+% \begin{macrocode}
+ \cs_new:Npn \@@_split_other:w ##1 = ##2 \s_@@_mark ##3
+ { ##3 ##1 \s_@@_stop \s_@@_mark ##2 }
+ \cs_new:Npn \@@_split_active:w ##1 #2 ##2 \s_@@_mark ##3
+ { ##3 ##1 \s_@@_stop \s_@@_mark ##2 }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_loop_other:nnw}
% The second loop uses the same test for its end as the first loop, next it
-% tests whether there are other or active equals signs, throwing an error if
-% there are both. If there are none, test whether the argument is blank or is
-% a single key. If there are only active equals signs split at those, else
-% split at others. Finally, iterate the loop.
+% splits at the first active equals sign using \cs{@@_split_active:w}. The
+% \cs{s_@@_nil} prevents accidental brace stripping and acts as a delimiter in
+% the next steps. First testing for an active equals sign will reduce the
+% number of necessary expansion steps for the expected average use case of
+% other equals signs and hence perform better on average.
% \begin{macrocode}
- \cs_new:Npn \@@_loop_other:NNw ##1 ##2 ##3 ,
+ \cs_new:Npn \@@_loop_other:nnw ##1 ##2 ##3 ,
{
\@@_if_recursion_tail:w ##3
- \@@_end_loop_other:w \s_@@_mark \s_@@_tail
- \@@_if_has_equal_other:w ##3 = \s_@@_stop
- \@@_has_false:w \s_@@_mark \s_@@_stop \use_i:nn
- {
- \@@_if_has_equal_active:w ##3 #2 \s_@@_stop
- \@@_has_false:w \s_@@_mark \s_@@_stop \use_i:nn
- \@@_misplaced_equal_error:
- { \@@_split_other:w ##3 = \s_@@_stop ##2 }
- }
- {
- \@@_if_has_equal_active:w ##3 #2 \s_@@_stop
- \@@_has_false:w \s_@@_mark \s_@@_stop \use_i:nn
- { \@@_split_active:w ##3 #2 \s_@@_stop ##2 }
- {
- \@@_if_blank:w ##3 \s_@@_nil \s_@@_stop
- \@@_blank_true:w \s_@@_mark \s_@@_stop \use:n
- { \@@_trim:nN { ##3 } \@@_key:nN ##1 }
- }
- }
- \@@_loop_other:NNw ##1 ##2 \s_@@_mark
+ \@@_end_loop_other:w \s_@@_tail
+ \@@_split_active:w ##3 \s_@@_nil
+ \s_@@_mark \@@_split_active_auxi:w
+ #2 \s_@@_mark \@@_clean_up_active:w
+ {##1} {##2}
+ \s_@@_mark
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_split_active:w}
-% \begin{macro}[EXP]{\@@_split_active:nw}
-% Splits at the first active equals sign and trims the key. Next test whether
-% there are any more valid split points, if so throw an error and gobble the
-% remaining \meta{function_2}, which will not yet be gobbled. If there was
-% only one active equals sign start trimming the spaces off the value and give
-% control to \cs[no-index]{@@_key_val:nnN}.
+% \begin{macro}[EXP]{\@@_split_active_auxi:w}
+% \begin{macro}[EXP]{\@@_split_active_auxii:w}
+% \begin{macro}[EXP]{\@@_split_active_auxiii:w}
+% \begin{macro}[EXP]{\@@_split_active_auxiv:w}
+% \begin{macro}[EXP]{\@@_split_active_auxv:w}
+% After \cs{@@_split_active:w} the following will only be called if there was
+% at least one active equals sign in the current key--value pair. Therefore
+% this is the execution branch for a key--value pair with an active equals
+% sign. |##1| will be everything up to the first active equals sign. First it
+% tests for other equals signs in the key name, which will eventually throw an
+% error via \cs{@@_misplaced_equal_after_active_error:w}. If none was found we
+% forward the key to \cs{@@_split_active_auxii:w}.
% \begin{macrocode}
- \cs_new:Npn \@@_split_active:w ##1 #2
+ \cs_new:Npn \@@_split_active_auxi:w ##1 \s_@@_stop
{
- \@@_trim:nN { ##1 } \@@_split_active:nw \s_@@_mark
+ \@@_split_other:w ##1 \s_@@_nil
+ \s_@@_mark \@@_misplaced_equal_after_active_error:w
+ = \s_@@_mark \@@_split_active_auxii:w
+ }
+% \end{macrocode}
+% \cs{@@_split_active_auxii:w} gets the correct key name with a leading
+% \cs{s_@@_mark} as |##1|. It has to sanitise the remainder of the previous
+% test and trims the key name which will be forwarded to
+% \cs{@@_split_active_auxiii:w}.
+% \begin{macrocode}
+ \cs_new:Npn \@@_split_active_auxii:w
+ ##1 \s_@@_nil \s_@@_mark \@@_misplaced_equal_after_active_error:w
+ \s_@@_stop \s_@@_mark
+ ##2 \s_@@_nil #2 \s_@@_mark \@@_clean_up_active:w
+ { \@@_trim:nN {##1} \@@_split_active_auxiii:w ##2 \s_@@_nil }
+% \end{macrocode}
+% Next we test for a misplaced active equals sign in the value, if none is
+% found \cs{@@_split_active_auxiv:w} will be called.
+% \begin{macrocode}
+ \cs_new:Npn \@@_split_active_auxiii:w ##1 ##2 \s_@@_nil
+ {
+ \@@_split_active:w ##2 \s_@@_nil
+ \s_@@_mark \@@_misplaced_equal_in_split_error:w
+ #2 \s_@@_mark \@@_split_active_auxiv:w
+ {##1}
+ }
+% \end{macrocode}
+% This runs the last test after sanitising the remainder of the previous one.
+% This time test for a misplaced equals sign of category 12 in the value.
+% Finally the last auxiliary macro will be called.
+% \begin{macrocode}
+ \cs_new:Npn \@@_split_active_auxiv:w
+ ##1 \s_@@_nil \s_@@_mark \@@_misplaced_equal_in_split_error:w
+ \s_@@_stop \s_@@_mark
+ {
+ \@@_split_other:w ##1 \s_@@_nil
+ \s_@@_mark \@@_misplaced_equal_in_split_error:w
+ = \s_@@_mark \@@_split_active_auxv:w
}
- \cs_new:Npn \@@_split_active:nw ##1 ##2 #2 ##3 \s_@@_stop
- {
- \@@_if_empty:w \s_@@_mark ##3 \s_@@_stop
- \@@_has_false:w \s_@@_mark \s_@@_stop \use_i:nn
- { \@@_misplaced_equal_error: \use_none:n }
- { \@@_trim:nN { ##2 } \@@_key_val:nnN { ##1 } }
- }
% \end{macrocode}
+% This last macro in this execution branch sanitises the last test, trims the
+% value and passes it to \cs{@@_pair:nnnn}.
+% \begin{macrocode}
+ \cs_new:Npn \@@_split_active_auxv:w
+ ##1 \s_@@_nil \s_@@_mark \@@_misplaced_equal_in_split_error:w
+ \s_@@_stop \s_@@_mark
+ { \@@_trim:nN { ##1 } \@@_pair:nnnn }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_if_has_equal_active:w}
-% The test for an active equals sign just gobbles tokens until the first
-% active equals sign and then runs the test for an empty argument.
+% \begin{macro}[EXP]{\@@_clean_up_active:w}
+% The following is the branch taken if the key--value pair doesn't contain an
+% active equals sign. The remainder of that test will be cleaned up by
+% \cs{@@_clean_up_active:w} which will then split at an equals sign of
+% category other.
% \begin{macrocode}
- \cs_new:Npn \@@_if_has_equal_active:w ##1 #2
+ \cs_new:Npn \@@_clean_up_active:w
+ ##1 \s_@@_nil \s_@@_mark \@@_split_active_auxi:w \s_@@_stop \s_@@_mark
{
- \@@_if_empty:w \s_@@_mark
+ \@@_split_other:w ##1 \s_@@_nil
+ \s_@@_mark \@@_split_other_auxi:w
+ = \s_@@_mark \@@_clean_up_other:w
}
% \end{macrocode}
% \end{macro}
%
-% We're done with the macros which need active equals signs or commas in their
-% definition, so we can end that scope and call the temporary macro which will
-% do the definitions.
+% \begin{macro}[EXP]{\@@_split_other_auxi:w}
+% \begin{macro}[EXP]{\@@_split_other_auxii:w}
+% \begin{macro}[EXP]{\@@_split_other_auxiii:w}
+% This is executed if the key--value pair doesn't contain an active equals
+% sign but at least one other. |##1| of \cs{@@_split_other_auxi:w} will
+% contain the complete key name, which is trimmed and forwarded to the next
+% auxiliary macro.
% \begin{macrocode}
- }
- \char_set_catcode_active:n { `\, }
- \char_set_catcode_active:n { `\= }
- \@@_tmp:NN , =
-\group_end:
+ \cs_new:Npn \@@_split_other_auxi:w ##1 \s_@@_stop
+ { \@@_trim:nN { ##1 } \@@_split_other_auxii:w }
+% \end{macrocode}
+% We know that the value doesn't contain misplaced active equals signs but we
+% have to test for others. Also we need to sanitise the previous test, which
+% is done here and not earlier to avoid superfluous argument grabbing.
+% \begin{macrocode}
+ \cs_new:Npn \@@_split_other_auxii:w
+ ##1 ##2 \s_@@_nil = \s_@@_mark \@@_clean_up_other:w
+ {
+ \@@_split_other:w ##2 \s_@@_nil
+ \s_@@_mark \@@_misplaced_equal_in_split_error:w
+ = \s_@@_mark \@@_split_other_auxiii:w
+ { ##1 }
+ }
+% \end{macrocode}
+% \cs{@@_split_other_auxiii:w} sanitises the test for other equals signs,
+% trims the value and forwards it to \cs{@@_pair:nnnn}.
+% \begin{macrocode}
+ \cs_new:Npn \@@_split_other_auxiii:w
+ ##1 \s_@@_nil \s_@@_mark \@@_misplaced_equal_in_split_error:w
+ \s_@@_stop \s_@@_mark
+ { \@@_trim:nN { ##1 } \@@_pair:nnnn }
% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
-% \begin{macro}[EXP]{\@@_end_loop_active:w,\@@_end_loop_other:w}
-% Both of these macros just have to gobble a few tokens to remove the reminder
-% of the loops current iteration. We do this in a pretty static manner,
-% explicitly stating every token we know beforehand because this is slightly
-% faster.
+% \begin{macro}[EXP]{\@@_clean_up_other:w}
+% \cs{@@_clean_up_other:w} is the last branch that might exist. It is called
+% if no equals sign was found, hence the only possibilities left are a blank
+% list element, which is to be skipped, or a lonely key. If it's no empty list
+% element this will trim the key name and forward it to \cs{@@_key:nn}.
% \begin{macrocode}
-\cs_new:Npn \@@_end_loop_active:w
- \s_@@_mark \s_@@_tail
- \@@_loop_other:NNw #1 , \s_@@_tail ,
- \@@_loop_active:NNw #2 \s_@@_mark
- {}
-\cs_new:Npn \@@_end_loop_other:w
- \s_@@_mark \s_@@_tail
- \@@_if_has_equal_other:w #1 = \s_@@_stop
- \@@_has_false:w \s_@@_mark \s_@@_stop \use_i:nn
- #2
- \@@_loop_other:NNw #3 \s_@@_mark
- {}
+ \cs_new:Npn \@@_clean_up_other:w
+ ##1 \s_@@_nil \s_@@_mark \@@_split_other_auxi:w \s_@@_stop \s_@@_mark
+ {
+ \@@_if_blank:w ##1 \s_@@_nil \s_@@_stop \@@_blank_true:w
+ \s_@@_mark \s_@@_stop
+ \@@_trim:nN { ##1 } \@@_key:nn
+ }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_split_other:w}
-% \begin{macro}[EXP]{\@@_split_other:nw}
-% These work exactly as \cs[no-index]{@@_split_active:wN}, just for
-% equals signs of category other.
+% \begin{macro}[EXP]{\@@_misplaced_equal_after_active_error:w}
+% \begin{macro}[EXP]{\@@_misplaced_equal_in_split_error:w}
+% All these two macros do is gobble the remainder of the current other loop
+% execution and throw an error. Afterwards they have to insert the next loop
+% iteration.
% \begin{macrocode}
-\cs_new:Npn \@@_split_other:w #1 =
- {
- \@@_trim:nN { #1 } \@@_split_other:nw \s_@@_mark
- }
- \cs_new:Npn \@@_split_other:nw #1 #2 = #3 \s_@@_stop
- {
- \@@_if_empty:w \s_@@_mark #3 \s_@@_stop
- \@@_has_false:w \s_@@_mark \s_@@_stop \use_i:nn
- { \@@_misplaced_equal_error: \use_none:n }
- { \@@_trim:nN { #2 } \@@_key_val:nnN { #1 } }
- }
+ \cs_new:Npn \@@_misplaced_equal_after_active_error:w
+ \s_@@_mark ##1 \s_@@_stop \s_@@_mark ##2 \s_@@_nil
+ = \s_@@_mark \@@_split_active_auxii:w
+ \s_@@_mark ##3 \s_@@_nil
+ #2 \s_@@_mark \@@_clean_up_active:w
+ {
+ \__kernel_msg_expandable_error:nn
+ { kernel } { misplaced-equals-sign }
+ \@@_loop_other:nnw
+ }
+ \cs_new:Npn \@@_misplaced_equal_in_split_error:w
+ \s_@@_mark ##1 \s_@@_stop \s_@@_mark ##2 \s_@@_nil
+ ##3 \s_@@_mark ##4 ##5
+ {
+ \__kernel_msg_expandable_error:nn
+ { kernel } { misplaced-equals-sign }
+ \@@_loop_other:nnw
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_key:nN}
-% This will get the current key with spaces trimmed and \meta{function_1} as
-% its arguments. All it has to do is put them in an \cs{exp_not:n} and reorder
-% them.
+% \begin{macro}[EXP]{\@@_end_loop_other:w, \@@_end_loop_active:w}
+% All that's left for the parsing loops are the macros which end the
+% recursion. Both just gobble the remaining tokens of the respective loop
+% including the next recursion call. \cs{@@_end_loop_other:w} also has to
+% insert the next iteration of the active loop.
% \begin{macrocode}
-\cs_new:Npn \@@_key:nN #1 #2
- {
- \exp_not:n { #2 { #1 } }
- }
+ \cs_new:Npn \@@_end_loop_other:w
+ \s_@@_tail
+ \@@_split_active:w
+ \s_@@_mark \s_@@_tail
+ \s_@@_nil \s_@@_mark
+ \@@_split_active_auxi:w
+ #2 \s_@@_mark \@@_clean_up_active:w
+ { \@@_loop_active:nnw }
+ \cs_new:Npn \@@_end_loop_active:w
+ \s_@@_tail
+ \@@_loop_other:nnw ##1 \s_@@_mark \s_@@_tail , \s_@@_tail ,
+ { }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_key_val:nnN}
-% This will get the key name and value with spaces trimmed. It has to
-% assert that the key name isn't empty. Afterwards put them into an
-% \cs{exp_not:n} together with \meta{function_2}. If the key is empty they are
-% gobbled instead.
+% The parsing loops are done, so here ends the definition of \cs{@@_tmp:NN},
+% which will finally set up the macros.
+% \begin{macrocode}
+ }
+ \char_set_catcode_active:n { `\, }
+ \char_set_catcode_active:n { `\= }
+ \@@_tmp:NN , =
+\group_end:
+% \end{macrocode}
+%
+% \begin{macro}[EXP]{\@@_pair:nnnn, \@@_key:nn}
+% These macros will be called on the parsed keys and values of the key--value
+% list. All arguments are completely trimmed. They test for blank key names
+% and call the functions passed to \cs{keyval_parse:nnn} inside of
+% \cs{exp_not:n} with the correct arguments. Afterwards they insert the next
+% iteration of the other loop.
% \begin{macrocode}
-\cs_new:Npn \@@_key_val:nnN #1 #2 #3
+\cs_new:Npn \@@_pair:nnnn #1 #2 #3 #4
+ {
+ \@@_if_blank:w \s_@@_mark #2 \s_@@_nil \s_@@_stop \@@_blank_key_error:w
+ \s_@@_mark \s_@@_stop
+ \exp_not:n { #4 { #2 } { #1 } }
+ \@@_loop_other:nnw {#3} {#4}
+ }
+\cs_new:Npn \@@_key:nn #1 #2
{
- \@@_if_empty:w \s_@@_mark #2 \s_@@_stop
- \@@_empty_key:w \s_@@_mark \s_@@_stop
- \exp_not:n { #3 { #2 } { #1 } }
+ \@@_if_blank:w \s_@@_mark #1 \s_@@_nil \s_@@_stop \@@_blank_key_error:w
+ \s_@@_mark \s_@@_stop
+ \exp_not:n { #2 { #1 } }
+ \@@_loop_other:nnw {#2}
}
% \end{macrocode}
% \end{macro}
@@ -1153,52 +1299,32 @@
% with an arbitrary token following the argument. Each of these utilize the
% fact that the argument will contain a leading \cs{s_@@_mark}.
% \begin{macrocode}
-\cs_new:Npn \@@_if_empty:w #1 \s_@@_mark \s_@@_stop {}
+\cs_new:Npn \@@_if_empty:w #1 \s_@@_mark \s_@@_stop { }
\cs_new:Npn \@@_if_blank:w \s_@@_mark #1 { \@@_if_empty:w \s_@@_mark }
-\cs_new:Npn \@@_if_recursion_tail:w #1 \s_@@_mark \s_@@_tail {}
+\cs_new:Npn \@@_if_recursion_tail:w \s_@@_mark #1 \s_@@_tail { }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_has_false:w,\@@_blank_true:w,\@@_empty_key:w}
+% \begin{macro}[EXP]{\@@_blank_true:w,\@@_blank_key_error:w}
% These macros will be called if the tests above didn't gobble them, they
% execute the branching.
% \begin{macrocode}
-\cs_new:Npn \@@_has_false:w \s_@@_mark \s_@@_stop \use_i:nn #1 #2 { #2 }
-\cs_new:Npn \@@_blank_true:w \s_@@_mark \s_@@_stop \use:n #1 {}
-\cs_new:Npn \@@_empty_key:w \s_@@_mark \s_@@_stop \exp_not:n #1
- {
- \@@_misplaced_equal_error:
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_if_has_equal_other:w}
-% Another test that works by gobbling tokens until a specific one is hit.
-% \begin{macrocode}
-\cs_new:Npn \@@_if_has_equal_other:w #1 =
+\cs_new:Npn \@@_blank_true:w \s_@@_mark \s_@@_stop \@@_trim:nN #1 \@@_key:nn
+ { \@@_loop_other:nnw }
+\cs_new:Npn \@@_blank_key_error:w \s_@@_mark \s_@@_stop \exp_not:n #1
{
- \@@_if_empty:w \s_@@_mark
+ \__kernel_msg_expandable_error:nn
+ { kernel } { blank-key-name }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_misplaced_equal_error:}
-% Just throw an error expandably. This is hid inside a macro so that other
-% macros don't have to gobble so many tokens, which increases speed for
-% correct input. This will marginally slow down the error case, but that
-% doesn't have to be fast anyway.
-% \begin{macrocode}
-\cs_new:Npn \@@_misplaced_equal_error:
- {
- \__kernel_msg_expandable_error:nn { kernel } { misplaced-equals-sign }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% One message for the low level parsing system.
+% Two messages for the low level parsing system.
% \begin{macrocode}
\__kernel_msg_new:nnn { kernel } { misplaced-equals-sign }
{ Misplaced~equals~sign~in~key-value~input~\msg_line_context: }
+\__kernel_msg_new:nnn { kernel } { blank-key-name }
+ { Blank~key~name~in~key-value~input~\msg_line_context: }
% \end{macrocode}
%
% \begin{macro}[EXP]{\@@_trim:nN}
@@ -1219,12 +1345,11 @@
\@@_trim_auxi:w
##1
\s_@@_nil
- \s_@@_mark #1 {}
+ \s_@@_mark #1 { }
\s_@@_mark \@@_trim_auxii:w
\@@_trim_auxiii:w
#1 \s_@@_nil
\@@_trim_auxiv:w
- \s_@@_stop
}
\cs_new:Npn \@@_trim_auxi:w ##1 \s_@@_mark #1 ##2 \s_@@_mark ##3
{
@@ -1248,8 +1373,11 @@
% \end{macrocode}
% This is the one macro which differs from the original definition.
% \begin{macrocode}
- \cs_new:Npn \@@_trim_auxiv:w \s_@@_mark ##1 \s_@@_nil ##2 \s_@@_stop ##3
- { ##3 { ##1 } }
+ \cs_new:Npn \@@_trim_auxiv:w
+ \s_@@_mark ##1 \s_@@_nil
+ \@@_trim_auxiii:w \s_@@_nil \@@_trim_auxiii:w
+ ##2
+ { ##2 { ##1 } }
}
\@@_tmp:n { ~ }
\group_end:
@@ -1360,7 +1488,7 @@
% be explicitly no-value, it must be a token list.
% \begin{macrocode}
\tl_new:N \l_@@_relative_tl
-\tl_set:Nn \l_@@_relative_tl { \q_no_value }
+\tl_set:Nn \l_@@_relative_tl { \q_@@_no_value }
% \end{macrocode}
% \end{variable}
%
@@ -1412,6 +1540,31 @@
% \end{macrocode}
% \end{variable}
%
+% \subsubsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_nil,\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_nil
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_no_value}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_no_value
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_no_value:N}
+% Branching quark conditional.
+% \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_no_value:N { TF }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{The key defining mechanism}
%
% \begin{macro}{\keys_define:nn}
@@ -1458,11 +1611,11 @@
\cs_if_exist:cTF { \c_@@_props_root_str \l_@@_property_str }
{ \@@_define_code:n {#2} }
{
- \str_if_empty:NF \l_@@_property_str
- {
- \__kernel_msg_error:nnxx { kernel } { key-property-unknown }
- { \l_@@_property_str } { \l_keys_path_str }
- }
+ \str_if_empty:NF \l_@@_property_str
+ {
+ \__kernel_msg_error:nnxx { kernel } { key-property-unknown }
+ \l_@@_property_str \l_keys_path_str
+ }
}
}
% \end{macrocode}
@@ -1471,53 +1624,59 @@
% \end{macro}
%
% \begin{macro}{\@@_property_find:n}
-% \begin{macro}{\@@_property_find:w}
+% \begin{macro}
+% {
+% \@@_property_find_auxi:w ,
+% \@@_property_find_auxii:w ,
+% \@@_property_find_auxiii:w ,
+% \@@_property_find_auxiv:w
+% }
% Searching for a property means finding the last |.| in the input,
% and storing the text before and after it. Everything is turned into
-% strings, so there is no problem using an \texttt{x}-type expansion.
+% strings, so there is no problem using an \texttt{x}-type expansion. Since
+% |\__keys_trim_spaces:n| will turn its argument into a string anyway, this
+% function uses \cs{cs_set_nopar:Npx} instead of \cs{tl_set:Nx} to gain some
+% speed.
% \begin{macrocode}
\cs_new_protected:Npn \@@_property_find:n #1
{
- \str_set:Nx \l_@@_property_str { \@@_trim_spaces:n {#1} }
- \exp_after:wN \@@_property_find:w \l_@@_property_str . .
- \q_stop {#1}
+ \cs_set_nopar:Npx \l__keys_property_str { \__keys_trim_spaces:n { #1 } }
+ \exp_after:wN \@@_property_find_auxi:w \l__keys_property_str
+ \s_@@_nil \@@_property_find_auxii:w
+ . \s_@@_nil \@@_property_find_err:w
}
-\cs_new_protected:Npn \@@_property_find:w #1 . #2 . #3 \q_stop #4
+\cs_new_protected:Npn \@@_property_find_auxi:w #1 . #2 \s_@@_nil #3
{
- \tl_if_blank:nTF {#3}
- {
- \str_clear:N \l_@@_property_str
- \__kernel_msg_error:nnn { kernel } { key-no-property } {#4}
- }
- {
- \str_if_eq:nnTF {#3} { . }
- {
- \str_set:Nx \l_keys_path_str
- {
- \str_if_empty:NF \l_@@_module_str
- { \l_@@_module_str / }
- \tl_trim_spaces:n {#1}
- }
- \str_set:Nn \l_@@_property_str { . #2 }
- }
- {
- \str_set:Nx \l_keys_path_str { \l_@@_module_str / #1 . #2 }
- \@@_property_search:w #3 \q_stop
- }
- \tl_set_eq:NN \l_keys_path_tl \l_keys_path_str
- }
+ #3 #1 \s_@@_mark #2 \s_@@_nil #3
}
-\cs_new_protected:Npn \@@_property_search:w #1 . #2 \q_stop
+\cs_new_protected:Npn \@@_property_find_auxii:w
+ #1 \s_@@_mark #2 \s_@@_nil \@@_property_find_auxii:w . \s_@@_nil
+ \@@_property_find_err:w
{
- \str_if_eq:nnTF {#2} { . }
- {
- \str_set:Nx \l_keys_path_str { \l_keys_path_str }
- \str_set:Nn \l_@@_property_str { . #1 }
- }
- {
- \str_set:Nx \l_keys_path_str { \l_keys_path_str . #1 }
- \@@_property_search:w #2 \q_stop
- }
+ \cs_set_nopar:Npx \l_keys_path_str
+ { \str_if_empty:NF \l__keys_module_str { \l__keys_module_str / } #1 }
+ \@@_property_find_auxi:w #2 \s_@@_nil \@@_property_find_auxiii:w . \s_@@_nil
+ \@@_property_find_auxiv:w
+ }
+\cs_new_protected:Npn \@@_property_find_auxiii:w #1 \s_@@_mark
+ {
+ \cs_set_nopar:Npx \l_keys_path_str { \l_keys_path_str . #1 }
+ \@@_property_find_auxi:w
+ }
+\cs_new_protected:Npn \@@_property_find_auxiv:w
+ #1 \s_@@_nil \@@_property_find_auxiii:w
+ \s_@@_mark \s_@@_nil \@@_property_find_auxiv:w
+ {
+ \cs_set_nopar:Npx \l__keys_property_str { . #1 }
+ \cs_set_nopar:Npx \l_keys_path_str
+ { \exp_after:wN \__keys_trim_spaces:n \exp_after:wN { \l_keys_path_str } }
+ \tl_set_eq:NN \l_keys_path_tl \l_keys_path_str
+ }
+\cs_new_protected:Npn \@@_property_find_err:w
+ #1 \s_@@_nil #2 \@@_property_find_err:w
+ {
+ \str_clear:N \l__keys_property_str
+ \__kernel_msg_error:nnn { kernel } { key-no-property } {#1}
}
% \end{macrocode}
% \end{macro}
@@ -1536,18 +1695,17 @@
\bool_if:NTF \l_@@_no_value_bool
{
\exp_after:wN \@@_define_code:w
- \l_@@_property_str \q_stop
+ \l_@@_property_str \s_@@_stop
{ \use:c { \c_@@_props_root_str \l_@@_property_str } }
{
- \__kernel_msg_error:nnxx { kernel }
- { key-property-requires-value } { \l_@@_property_str }
- { \l_keys_path_str }
- }
+ \__kernel_msg_error:nnxx { kernel } { key-property-requires-value }
+ \l_@@_property_str \l_keys_path_str
+ }
}
{ \use:c { \c_@@_props_root_str \l_@@_property_str } {#1} }
}
\exp_last_unbraced:NNNNo
- \cs_new:Npn \@@_define_code:w #1 \c_colon_str #2 \q_stop
+ \cs_new:Npn \@@_define_code:w #1 \c_colon_str #2 \s_@@_stop
{ \tl_if_empty:nTF {#2} }
% \end{macrocode}
% \end{macro}
@@ -1571,7 +1729,7 @@
\@@_cmd_set:nn { \l_keys_path_str / unknown }
{
\__kernel_msg_error:nnx { kernel } { boolean-values-only }
- { \l_keys_key_str }
+ \l_keys_key_str
}
\@@_default_set:n { true }
}
@@ -1593,7 +1751,7 @@
\@@_cmd_set:nn { \l_keys_path_str / unknown }
{
\__kernel_msg_error:nnx { kernel } { boolean-values-only }
- { \l_keys_key_str }
+ \l_keys_key_str
}
\@@_default_set:n { true }
}
@@ -1622,7 +1780,7 @@
{ choice }
{
\__kernel_msg_error:nnxx { kernel } { nested-choice-key }
- { \l_keys_path_tl } { \@@_parent:o \l_keys_path_str }
+ \l_keys_path_tl { \@@_parent:o \l_keys_path_str }
}
{ \@@_choice_make_aux:N #1 }
}
@@ -1632,11 +1790,11 @@
{
\cs_set_nopar:cpn { \c_@@_type_root_str \l_keys_path_str }
{ choice }
- \@@_cmd_set:nn { \l_keys_path_str } { #1 {##1} }
+ \@@_cmd_set:nn \l_keys_path_str { #1 {##1} }
\@@_cmd_set:nn { \l_keys_path_str / unknown }
{
\__kernel_msg_error:nnxx { kernel } { key-choice-unknown }
- { \l_keys_path_str } {##1}
+ \l_keys_path_str {##1}
}
}
% \end{macrocode}
@@ -1767,7 +1925,8 @@
{ \@@_execute_inherit: }
{
\str_clear:N \l_@@_inherit_str
- \cs_if_exist_use:cT { \c_@@_code_root_str \l_keys_path_str } { {#1} }
+ \cs_if_exist:cT { \c_@@_code_root_str \l_keys_path_str }
+ { \@@_execute:nn \l_keys_path_str {#1} }
}
}
% \end{macrocode}
@@ -1781,8 +1940,7 @@
{
\@@_cmd_set:Vo \l_keys_path_str
{
- \exp_after:wN \keys_set:nn
- \exp_after:wN { \l_@@_module_str } {#1}
+ \exp_after:wN \keys_set:nn \exp_after:wN { \l_@@_module_str } {#1}
}
}
\cs_new_protected:Npn \@@_meta_make:nn #1#2
@@ -1797,11 +1955,9 @@
\cs_new_protected:Npn \@@_prop_put:Nn #1#2
{
\prop_if_exist:NF #1 { \prop_new:N #1 }
- \exp_after:wN \@@_find_key_module:NNw
- \exp_after:wN \l_@@_tmpa_tl
- \exp_after:wN \l_@@_tmpb_tl
- \l_keys_path_str / \q_stop
- \@@_cmd_set:nx { \l_keys_path_str }
+ \exp_after:wN \@@_find_key_module:wNN \l_keys_path_str \s_@@_stop
+ \l_@@_tmpa_tl \l_@@_tmpb_tl
+ \@@_cmd_set:nx \l_keys_path_str
{
\exp_not:c { prop_ #2 put:Nnn }
\exp_not:N #1
@@ -1832,7 +1988,6 @@
%
% \begin{macro}{\@@_value_requirement:nn}
% \begin{macro}{\@@_validate_forbidden:, \@@_validate_required:}
-% \begin{macro}{\@@_validate_cleanup:w}
% Validating key input is done using a second function which runs before
% the main key code. Setting that up means setting it equal to a generic
% stub which does the check. This approach makes the lookup very fast at
@@ -1872,8 +2027,8 @@
\bool_if:NF \l_@@_no_value_bool
{
\__kernel_msg_error:nnxx { kernel } { value-forbidden }
- { \l_keys_path_str } { \l_keys_value_tl }
- \@@_validate_cleanup:w
+ \l_keys_path_str \l_keys_value_tl
+ \use_none:nnn
}
}
\cs_new_protected:Npn \@@_validate_required:
@@ -1881,15 +2036,13 @@
\bool_if:NT \l_@@_no_value_bool
{
\__kernel_msg_error:nnx { kernel } { value-required }
- { \l_keys_path_str }
- \@@_validate_cleanup:w
+ \l_keys_path_str
+ \use_none:nnn
}
}
-\cs_new_protected:Npn \@@_validate_cleanup:w #1 \cs_end: #2#3 { }
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
%
% \begin{macro}{\@@_variable_set:NnnN, \@@_variable_set:cnnN}
% \begin{macro}{\@@_variable_set_required:NnnN, \@@_variable_set_required:cnnN}
@@ -1899,7 +2052,7 @@
\cs_new_protected:Npn \@@_variable_set:NnnN #1#2#3#4
{
\use:c { #2_if_exist:NF } #1 { \use:c { #2 _new:N } #1 }
- \@@_cmd_set:nx { \l_keys_path_str }
+ \@@_cmd_set:nx \l_keys_path_str
{
\exp_not:c { #2 _ #3 set:N #4 }
\exp_not:N #1
@@ -1991,7 +2144,7 @@
% \texttt{set} function.
% \begin{macrocode}
\cs_new_protected:cpn { \c_@@_props_root_str .code:n } #1
- { \@@_cmd_set:nn { \l_keys_path_str } {#1} }
+ { \@@_cmd_set:nn \l_keys_path_str {#1} }
% \end{macrocode}
% \end{macro}
%
@@ -2277,7 +2430,7 @@
\bool_set_false:N \exp_not:N \l_@@_filtered_bool
\bool_set_false:N \exp_not:N \l_@@_selective_bool
\tl_set:Nn \exp_not:N \l_@@_relative_tl
- { \exp_not:N \q_no_value }
+ { \exp_not:N \q_@@_no_value }
\@@_set:nn \exp_not:n { {#1} {#2} }
\bool_if:NT \l_@@_only_known_bool
{ \bool_set_true:N \exp_not:N \l_@@_only_known_bool }
@@ -2328,7 +2481,7 @@
\cs_new_protected:Npn \keys_set_known:nnN #1#2#3
{
\exp_args:No \@@_set_known:nnnnN
- \l_@@_unused_clist { \q_no_value } {#1} {#2} #3
+ \l_@@_unused_clist \q_@@_no_value {#1} {#2} #3
}
\cs_generate_variant:Nn \keys_set_known:nnN { nV , nv , no }
\cs_new_protected:Npn \keys_set_known:nnnN #1#2#3#4
@@ -2341,11 +2494,11 @@
{
\clist_clear:N \l_@@_unused_clist
\@@_set_known:nnn {#2} {#3} {#4}
- \tl_set:Nx #5 { \exp_not:o { \l_@@_unused_clist } }
+ \__kernel_tl_set:Nx #5 { \exp_not:o \l_@@_unused_clist }
\tl_set:Nn \l_@@_unused_clist {#1}
}
\cs_new_protected:Npn \keys_set_known:nn #1#2
- { \@@_set_known:nnn { \q_no_value } {#1} {#2} }
+ { \@@_set_known:nnn \q_@@_no_value {#1} {#2} }
\cs_generate_variant:Nn \keys_set_known:nn { nV , nv , no }
\cs_new_protected:Npn \@@_set_known:nnn #1#2#3
{
@@ -2406,7 +2559,7 @@
{
\exp_args:No \@@_set_filter:nnnnnN
\l_@@_unused_clist
- { \q_no_value } {#1} {#2} {#3} #4
+ \q_@@_no_value {#1} {#2} {#3} #4
}
\cs_generate_variant:Nn \keys_set_filter:nnnN { nnV , nnv , nno }
\cs_new_protected:Npn \keys_set_filter:nnnnN #1#2#3#4#5
@@ -2419,11 +2572,11 @@
{
\clist_clear:N \l_@@_unused_clist
\@@_set_filter:nnnn {#2} {#3} {#4} {#5}
- \tl_set:Nx #6 { \exp_not:o { \l_@@_unused_clist } }
+ \__kernel_tl_set:Nx #6 { \exp_not:o \l_@@_unused_clist }
\tl_set:Nn \l_@@_unused_clist {#1}
}
\cs_new_protected:Npn \keys_set_filter:nnn #1#2#3
- {\@@_set_filter:nnnn { \q_no_value } {#1} {#2} {#3} }
+ {\@@_set_filter:nnnn \q_@@_no_value {#1} {#2} {#3} }
\cs_generate_variant:Nn \keys_set_filter:nnn { nnV , nnv , nno }
\cs_new_protected:Npn \@@_set_filter:nnnn #1#2#3#4
{
@@ -2452,7 +2605,7 @@
\bool_set_false:N \exp_not:N \l_@@_filtered_bool
\bool_set_true:N \exp_not:N \l_@@_selective_bool
\tl_set:Nn \exp_not:N \l_@@_relative_tl
- { \exp_not:N \q_no_value }
+ { \exp_not:N \q_@@_no_value }
\@@_set_selective:nnn \exp_not:n { {#1} {#2} {#3} }
\bool_if:NT \l_@@_only_known_bool
{ \bool_set_true:N \exp_not:N \l_@@_only_known_bool }
@@ -2485,7 +2638,14 @@
%
% \begin{macro}{\@@_set_keyval:n, \@@_set_keyval:nn}
% \begin{macro}{\@@_set_keyval:nnn, \@@_set_keyval:onn}
-% \begin{macro}{\@@_find_key_module:NNw}
+% \begin{macro}{\@@_find_key_module:wNN}
+% \begin{macro}
+% {
+% \@@_find_key_module_auxi:Nw ,
+% \@@_find_key_module_auxii:Nw ,
+% \@@_find_key_module_auxiii:Nn ,
+% \@@_find_key_module_auxiv:Nw
+% }
% \begin{macro}{\@@_set_selective:}
% A shared system once again. First, set the current path and add a
% default if needed. There are then checks to see if the a value is
@@ -2511,7 +2671,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_set_keyval:nnn #1#2#3
{
- \tl_set:Nx \l_keys_path_str
+ \__kernel_tl_set:Nx \l_keys_path_str
{
\tl_if_blank:nF {#1}
{ #1 / }
@@ -2519,30 +2679,46 @@
}
\str_clear:N \l_@@_module_str
\str_clear:N \l_@@_inherit_str
- \exp_after:wN \@@_find_key_module:NNw
- \exp_after:wN \l_@@_module_str
- \exp_after:wN \l_keys_key_str
- \l_keys_path_str / \q_stop
+ \exp_after:wN \@@_find_key_module:wNN \l_keys_path_str \s_@@_stop
+ \l_@@_module_str \l_keys_key_str
\tl_set_eq:NN \l_keys_key_tl \l_keys_key_str
\@@_value_or_default:n {#3}
\bool_if:NTF \l_@@_selective_bool
- { \@@_set_selective: }
- { \@@_execute: }
+ \@@_set_selective:
+ \@@_execute:
\str_set:Nn \l_@@_module_str {#1}
}
\cs_generate_variant:Nn \@@_set_keyval:nnn { o }
-\cs_new_protected:Npn \@@_find_key_module:NNw #1#2#3 / #4 \q_stop
+% \end{macrocode}
+% This function uses \cs{cs_set_nopar:Npx} internally for performance reasons,
+% the argument |#1| is already a string in every usage, so turning it into a
+% string again seems unnecessary.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_find_key_module:wNN #1 \s_@@_stop #2 #3
{
- \tl_if_blank:nTF {#4}
- { \str_set:Nn #2 {#3} }
- {
- \str_put_right:Nx #1
- {
- \str_if_empty:NF #1 { / }
- #3
- }
- \@@_find_key_module:NNw #1#2 #4 \q_stop
- }
+ \@@_find_key_module_auxi:Nw #2 #1 \s_@@_nil \@@_find_key_module_auxii:Nw
+ / \s_@@_nil \@@_find_key_module_auxiv:Nw #3
+ }
+\cs_new_protected:Npn \@@_find_key_module_auxi:Nw #1 #2 / #3 \s_@@_nil #4
+ {
+ #4 #1 #2 \s_@@_mark #3 \s_@@_nil #4
+ }
+\cs_new_protected:Npn \@@_find_key_module_auxii:Nw
+ #1 #2 \s_@@_mark #3 \s_@@_nil \@@_find_key_module_auxii:Nw
+ {
+ \cs_set_nopar:Npx #1 { \tl_if_empty:NF #1 { #1 / } #2 }
+ \@@_find_key_module_auxi:Nw #1 #3 \s_@@_nil \@@_find_key_module_auxiii:Nw
+ }
+\cs_new_protected:Npn \@@_find_key_module_auxiii:Nw #1 #2 \s_@@_mark
+ {
+ \cs_set_nopar:Npx #1 { \tl_if_empty:NF #1 { #1 / } #2 }
+ \@@_find_key_module_auxi:Nw #1
+ }
+\cs_new_protected:Npn \@@_find_key_module_auxiv:Nw
+ #1 #2 \s_@@_nil #3 \s_@@_mark
+ \s_@@_nil \@@_find_key_module_auxiv:Nw #4
+ {
+ \cs_set_nopar:Npn #4 { #2 }
}
% \end{macrocode}
% If selective setting is active, there are a number of possible sub-cases
@@ -2560,8 +2736,8 @@
}
{
\bool_if:NTF \l_@@_filtered_bool
- { \@@_execute: }
- { \@@_store_unused: }
+ \@@_execute:
+ \@@_store_unused:
}
}
% \end{macrocode}
@@ -2580,20 +2756,20 @@
\str_if_eq:nnT {##1} {####1}
{
\bool_set_true:N \l_@@_tmp_bool
- \clist_map_break:n { \seq_map_break: }
+ \clist_map_break:n \seq_map_break:
}
}
}
\bool_if:NTF \l_@@_tmp_bool
{
\bool_if:NTF \l_@@_filtered_bool
- { \@@_store_unused: }
- { \@@_execute: }
+ \@@_store_unused:
+ \@@_execute:
}
{
\bool_if:NTF \l_@@_filtered_bool
- { \@@_execute: }
- { \@@_store_unused: }
+ \@@_execute:
+ \@@_store_unused:
}
}
% \end{macrocode}
@@ -2601,6 +2777,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\@@_value_or_default:n}
% \begin{macro}{\@@_default_inherit:}
@@ -2646,7 +2823,7 @@
% \end{macro}
%
% \begin{macro}{\@@_execute:, \@@_execute_inherit:, \@@_execute_unknown:}
-% \begin{macro}[EXP]{\@@_execute:nn}
+% \begin{macro}[EXP]{\@@_execute:nn, \@@_execute:no}
% \begin{macro}{\@@_store_unused:,\@@_store_unused_aux:}
% Actually executing a key is done in two parts. First, look for the
% key itself, then look for the \texttt{unknown} key with the same
@@ -2659,8 +2836,7 @@
\cs_if_exist:cTF { \c_@@_code_root_str \l_keys_path_str }
{
\cs_if_exist_use:c { \c_@@_validate_root_str \l_keys_path_str }
- \cs:w \c_@@_code_root_str \l_keys_path_str \exp_after:wN \cs_end:
- \exp_after:wN { \l_keys_value_tl }
+ \@@_execute:no \l_keys_path_str \l_keys_value_tl
}
{
\cs_if_exist:cTF
@@ -2684,10 +2860,8 @@
{
\str_set:Nn \l_@@_inherit_str {##1}
\cs_if_exist_use:c { \c_@@_validate_root_str ##1 / \l_keys_key_str }
- \cs:w \c_@@_code_root_str ##1 / \l_keys_key_str
- \exp_after:wN \cs_end: \exp_after:wN
- { \l_keys_value_tl }
- \clist_map_break:n { \use_none:n }
+ \@@_execute:no { ##1 / \l_keys_key_str } \l_keys_value_tl
+ \clist_map_break:n \use_none:n
}
}
\@@_execute_unknown:
@@ -2699,39 +2873,50 @@
{
\cs_if_exist:cTF
{ \c_@@_code_root_str \l_@@_module_str / unknown }
- {
- \cs:w \c_@@_code_root_str \l_@@_module_str / unknown
- \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl }
- }
+ { \@@_execute:no { \l_@@_module_str / unknown } \l_keys_value_tl }
{
\__kernel_msg_error:nnxx { kernel } { key-unknown }
- { \l_keys_path_str } { \l_@@_module_str }
+ \l_keys_path_str \l_@@_module_str
}
}
}
+% \end{macrocode}
+% A key's code is in the control sequence with csname
+% \cs{c_@@_code_root_str} |#1|. We expand it once to get the
+% replacement text (with argument |#2|) and call \cs{use:n}
+% with this replacement as its argument. This ensures that any
+% undefined control sequence error in the key's code will lead to an
+% error message of the form |<argument>|\ldots{}\meta{control
+% sequence} in which one can read the (undefined) \meta{control
+% sequence} in full, rather than an error message that starts with the
+% potentially very long key name, which would make the (undefined)
+% \meta{control sequence} be truncated or sometimes completely hidden.
+% See \url{https://github.com/latex3/latex2e/issues/351}.
+% \begin{macrocode}
\cs_new:Npn \@@_execute:nn #1#2
+ { \@@_execute:no {#1} { \prg_do_nothing: #2 } }
+\cs_new:Npn \@@_execute:no #1#2
{
- \cs_if_exist:cTF { \c_@@_code_root_str #1 }
+ \exp_args:NNo \exp_args:No \use:n
{
\cs:w \c_@@_code_root_str #1 \exp_after:wN \cs_end:
- \exp_after:wN { \l_keys_value_tl }
+ \exp_after:wN {#2}
}
- {#2}
}
% \end{macrocode}
% When there is no relative path, things here are easy: just save the key
% name and value. When we are working with a relative path, first we
% need to turn it into a string: that can't happen earlier as we need
-% to store \cs{q_no_value}. Then, use a standard delimited approach to fish
+% to store \cs{q_@@_no_value}. Then, use a standard delimited approach to fish
% out the partial path.
% \begin{macrocode}
\cs_new_protected:Npn \@@_store_unused:
{
- \quark_if_no_value:NTF \l_@@_relative_tl
+ \@@_quark_if_no_value:NTF \l_@@_relative_tl
{
\clist_put_right:Nx \l_@@_unused_clist
{
- \exp_not:o \l_keys_key_str
+ \l_keys_key_str
\bool_if:NF \l_@@_no_value_bool
{ = { \exp_not:o \l_keys_value_tl } }
}
@@ -2741,7 +2926,7 @@
{
\clist_put_right:Nx \l_@@_unused_clist
{
- \exp_not:o \l_keys_path_str
+ \l_keys_path_str
\bool_if:NF \l_@@_no_value_bool
{ = { \exp_not:o \l_keys_value_tl } }
}
@@ -2751,14 +2936,14 @@
}
\cs_new_protected:Npn \@@_store_unused_aux:
{
- \tl_set:Nx \l_@@_relative_tl
+ \__kernel_tl_set:Nx \l_@@_relative_tl
{ \exp_args:No \@@_trim_spaces:n \l_@@_relative_tl }
\use:x
{
\cs_set_protected:Npn \@@_store_unused:w
####1 \l_@@_relative_tl /
####2 \l_@@_relative_tl /
- ####3 \exp_not:N \q_stop
+ ####3 \s_@@_stop
}
{
\tl_if_blank:nF {##1}
@@ -2778,7 +2963,7 @@
{
\@@_store_unused:w \l_keys_path_str
\l_@@_relative_tl / \l_@@_relative_tl /
- \exp_not:N \q_stop
+ \s_@@_stop
}
}
\cs_new_protected:Npn \@@_store_unused:w { }
@@ -2798,7 +2983,7 @@
\cs_new:Npn \@@_choice_find:n #1
{
\str_if_empty:NTF \l_@@_inherit_str
- { \@@_choice_find:nn { \l_keys_path_str } {#1} }
+ { \@@_choice_find:nn \l_keys_path_str {#1} }
{
\@@_choice_find:nn
{ \l_@@_inherit_str / \l_keys_key_str } {#1}
@@ -2807,8 +2992,8 @@
\cs_new:Npn \@@_choice_find:nn #1#2
{
\cs_if_exist:cTF { \c_@@_code_root_str #1 / \@@_trim_spaces:n {#2} }
- { \use:c { \c_@@_code_root_str #1 / \@@_trim_spaces:n {#2} } {#2} }
- { \use:c { \c_@@_code_root_str #1 / unknown } {#2} }
+ { \@@_execute:nn { #1 / \@@_trim_spaces:n {#2} } {#2} }
+ { \@@_execute:nn { #1 / unknown } {#2} }
}
\cs_new:Npn \@@_multichoice_find:n #1
{ \clist_map_function:nN {#1} \@@_choice_find:n }
@@ -2819,23 +3004,35 @@
%
% \subsection{Utilities}
%
-% \begin{macro}[EXP]{\@@_parent:n, \@@_parent:o}
-% \begin{macro}[EXP]{\@@_parent:w}
+% \begin{macro}[EXP]{\@@_parent:o}
+% \begin{macro}[EXP]
+% {
+% \@@_parent_auxi:w ,
+% \@@_parent_auxii:w ,
+% \@@_parent_auxiii:n ,
+% \@@_parent_auxiv:w
+% }
% Used to strip off the ending part of the key path after the last~|/|.
% \begin{macrocode}
-\cs_new:Npn \@@_parent:n #1
- { \@@_parent:w #1 / / \q_stop { } }
-\cs_generate_variant:Nn \@@_parent:n { o }
-\cs_new:Npn \@@_parent:w #1 / #2 / #3 \q_stop #4
+\cs_new:Npn \@@_parent:o #1
+ {
+ \exp_after:wN \@@_parent_auxi:w #1 \q_nil \@@_parent_auxii:w
+ / \q_nil \@@_parent_auxiv:w
+ }
+\cs_new:Npn \@@_parent_auxi:w #1 / #2 \q_nil #3
+ {
+ #3 { #1 } #2 \q_nil #3
+ }
+\cs_new:Npn \@@_parent_auxii:w #1 #2 \q_nil \@@_parent_auxii:w
+ {
+ #1 \@@_parent_auxi:w #2 \q_nil \@@_parent_auxiii:n
+ }
+\cs_new:Npn \@@_parent_auxiii:n #1
+ {
+ / #1 \@@_parent_auxi:w
+ }
+\cs_new:Npn \@@_parent_auxiv:w #1 \q_nil \@@_parent_auxiv:w
{
- \tl_if_blank:nTF {#2}
- {
- \tl_if_blank:nF {#4}
- { \use_none:n #4 }
- }
- {
- \@@_parent:w #2 / #3 \q_stop { #4 / #1 }
- }
}
% \end{macrocode}
% \end{macro}
@@ -2849,29 +3046,43 @@
% \@@_trim_spaces_auxiii:w
% }
% Space stripping has to allow for the fact that the key here might have
-% several parts, and spaces need to be stripped from each part.
+% several parts, and spaces need to be stripped from each part. Since the key
+% name is turned into a string groups can't be stripped accidentally and the
+% precautions of \cs{tl_trim_spaces:n} aren't necessary, in this case it is
+% much faster to just directly strip spaces around |/|.
% \begin{macrocode}
-\cs_new:Npn \@@_trim_spaces:n #1
- {
- \exp_after:wN \@@_trim_spaces_auxi:w \tl_to_str:n {#1}
- / \q_nil \q_stop
- }
-\cs_new:Npn \@@_trim_spaces_auxi:w #1 / #2 \q_stop
+\group_begin:
+ \cs_set:Npn \@@_tmp:n #1
+ {
+ \cs_new:Npn \@@_trim_spaces:n ##1
+ {
+ \exp_after:wN \@@_trim_spaces_auxi:w \tl_to_str:n { / ##1 } /
+ \s_@@_nil \@@_trim_spaces_auxi:w
+ \s_@@_mark \@@_trim_spaces_auxii:w
+ #1 / #1
+ \s_@@_nil \@@_trim_spaces_auxii:w
+ \s_@@_mark \@@_trim_spaces_auxiii:w
+ }
+ }
+ \@@_tmp:n { ~ }
+\group_end:
+\cs_new:Npn \@@_trim_spaces_auxi:w #1 ~ / #2 \s_@@_nil #3
{
- \quark_if_nil:nTF {#2}
- { \tl_trim_spaces:n {#1} }
- { \@@_trim_spaces_auxii:w #1 / #2 }
+ #3 #1 / #2 \s_@@_nil #3
}
-\cs_new:Npn \@@_trim_spaces_auxii:w #1 / #2 / \q_nil
+\cs_new:Npn \@@_trim_spaces_auxii:w #1 / ~ #2 \s_@@_mark #3
{
- \tl_trim_spaces:n {#1}
- \@@_trim_spaces_auxiii:w #2 / \q_recursion_tail / \q_recursion_stop
+ #3 #1 / #2 \s_@@_mark #3
}
-\cs_set:Npn \@@_trim_spaces_auxiii:w #1 /
+\cs_new:Npn \@@_trim_spaces_auxiii:w
+ / #1 /
+ \s_@@_nil \@@_trim_spaces_auxi:w
+ \s_@@_mark \@@_trim_spaces_auxii:w
+ /
+ \s_@@_nil \@@_trim_spaces_auxii:w
+ \s_@@_mark \@@_trim_spaces_auxiii:w
{
- \quark_if_recursion_tail_stop:n {#1}
- / \tl_trim_spaces:n { #1 }
- \@@_trim_spaces_auxiii:w
+ #1
}
% \end{macrocode}
% \end{macro}
@@ -2983,7 +3194,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
%\end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
index 14320d3ada2..b3c3627c6f7 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
@@ -2,7 +2,7 @@
%
%% File: l3legacy.dtx
%
-% Copyright (C) 2019,2020 The LaTeX3 Project
+% Copyright (C) 2019-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
index 89185a21867..e4aed9498ce 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
@@ -2,7 +2,7 @@
%
%% File: l3luatex.dtx
%
-% Copyright (C) 2010-2020 The LaTeX3 Project
+% Copyright (C) 2010-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -120,9 +120,15 @@
% As well as interfaces for \TeX{}, there are a small number of Lua functions
% provided here.
%
-% \begin{function}{l3kernel}
-% All public interfaces provided by the module are stored within the
-% |l3kernel| table.
+% \begin{function}{ltx.utils}
+% Most public interfaces provided by the module are stored within the
+% |ltx.utils| table.
+% \end{function}
+%
+% \begin{function}[deprecated = 2021-12-31]{l3kernel}
+% For compatibility reasons, there are also some deprecated interfaces provided
+% in the |l3kernel| table. These do not return their result as Lua values but
+% instead print them to \TeX.
% \end{function}
%
% \begin{function}{l3kernel.charcat}
@@ -143,8 +149,9 @@
% for user input.
% \end{function}
%
-% \begin{function}{l3kernel.filedump}
+% \begin{function}{ltx.utils.filedump, l3kernel.filedump}
% \begin{syntax}
+% \meta{dump}| = ltx.utils.filedump(|\meta{file}|,|\meta{offset}|,|\meta{length}|)| \\
% |l3kernel.filedump(|\meta{file}|,|\meta{offset}|,|\meta{length}|)|
% \end{syntax}
% Returns the uppercase hexadecimal representation of the content of the
@@ -154,21 +161,23 @@
% is read starting at the \meta{offset}.
% \end{function}
%
-% \begin{function}{l3kernel.filemdfivesum}
+% \begin{function}{ltx.utils.filemd5sum, l3kernel.filemdfivesum}
% \begin{syntax}
+% \meta{hash}| = ltx.utils.filemd5sum(|\meta{file}|)| \\
% |l3kernel.filemdfivesum(|\meta{file}|)|
% \end{syntax}
-% Returns the of the MD5 sum of the file contents read as bytes; note that
+% Returns the MD5 sum of the file contents read as bytes; note that
% the result will depend on the nature of the line endings used in the file,
% in contrast to normal \TeX{} behaviour. If the \meta{file} is not found,
% nothing is returned with \emph{no error raised}.
% \end{function}
%
-% \begin{function}{l3kernel.filemoddate}
+% \begin{function}{ltx.utils.filemoddate, l3kernel.filemoddate}
% \begin{syntax}
+% \meta{date}| = ltx.utils.filemoddate(|\meta{file}|)| \\
% |l3kernel.filemoddate(|\meta{file}|)|
% \end{syntax}
-% Returns the of the date/time of last modification of the \meta{file} in the
+% Returns the date/time of last modification of the \meta{file} in the
% format
% \begin{quote}
% |D:|\meta{year}\meta{month}\meta{day}\meta{hour}\meta{minute}^^A
@@ -179,8 +188,9 @@
% not found, nothing is returned with \emph{no error raised}.
% \end{function}
%
-% \begin{function}{l3kernel.filesize}
+% \begin{function}{ltx.utils.filesize, l3kernel.filesize}
% \begin{syntax}
+% |size = ltx.utils.filesize(|\meta{file}|)| \\
% |l3kernel.filesize(|\meta{file}|)|
% \end{syntax}
% Returns the size of the \meta{file} in bytes. If the \meta{file} is not
@@ -216,7 +226,7 @@
% \section{\pkg{l3luatex} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \subsection{Breaking out to \Lua{}}
@@ -313,11 +323,17 @@
% \pkg{pdftexcmds} package.
%
% \begin{macro}{l3kernel}
+% \begin{macro}{ltx.utils}
% Create a table for the kernel's own use.
% \begin{macrocode}
l3kernel = l3kernel or { }
+local l3kernel = l3kernel
+ltx = ltx or {utils={}}
+ltx.utils = ltx.utils or { }
+local ltxutils = ltx.utils
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% Local copies of global tables.
% \begin{macrocode}
@@ -331,7 +347,6 @@ local string = string
local tex = tex
local texio = texio
local tonumber = tonumber
-local unicode = unicode
% \end{macrocode}
%
% Local copies of standard functions.
@@ -342,23 +357,33 @@ local floor = math.floor
local format = string.format
local gsub = string.gsub
local lfs_attr = lfs.attributes
-local md5_sum = md5.sum
local open = io.open
-local os_clock = os.clock
local os_date = os.date
-local os_exec = os.execute
local setcatcode = tex.setcatcode
local sprint = tex.sprint
local cprint = tex.cprint
local write = tex.write
local write_nl = texio.write_nl
+local utf8_char = utf8.char
+
+local scan_int = token.scan_int or token.scan_integer
+local scan_string = token.scan_string
+local scan_keyword = token.scan_keyword
+local put_next = token.put_next
+
+local true_tok = token.create'prg_return_true:'
+local false_tok = token.create'prg_return_false:'
% \end{macrocode}
%
-% Newer Con\TeX{}t releases replace the |unicode| library by |utf| and
-% since Lua 5.3 we can even use the Lua standard |utf8| library.
% \begin{macrocode}
-local utf8_char = (utf8 and utf8.char) or (utf and utf.char) or unicode.utf8.char
-% \end{macrocode}
+local function deprecated(table, name, func)
+ table[name] = function(...)
+ write_nl(format("Calling deprecated Lua function %s", name))
+ table[name] = func
+ return func(...)
+ end
+end
+% \end{macrocode
%
% Deal with Con\TeX{}t: doesn't use |kpse| library.
% \begin{macrocode}
@@ -371,20 +396,20 @@ local kpse_find = (resolvers and resolvers.findfile) or kpse.find_file
% covered in \pkg{pdftexcmds} but is not currently required here.
% \begin{macrocode}
local function escapehex(str)
- write((gsub(str, ".",
- function (ch) return format("%02X", byte(ch)) end)))
+ return (gsub(str, ".",
+ function (ch) return format("%02X", byte(ch)) end))
end
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{l3kernel.charcat}
% Creating arbitrary chars using |tex.cprint|.
+% The alternative approach using |token.put_next(token.create(...))|
+% would be about 10\% slower.
% \begin{macrocode}
-local charcat
-function charcat(charcode, catcode)
+deprecated(l3kernel, 'charcat', function(charcode, catcode)
cprint(catcode, utf8_char(charcode))
-end
-l3kernel.charcat = charcat
+end)
% \end{macrocode}
% \end{macro}
%
@@ -392,9 +417,10 @@ l3kernel.charcat = charcat
% Simple timing set up: give the result from the system clock in scaled
% seconds.
% \begin{macrocode}
-local base_time = 0
+local os_clock = os.clock
+local base_clock_time = 0
local function elapsedtime()
- local val = (os_clock() - base_time) * 65536 + 0.5
+ local val = (os_clock() - base_clock_time) * 65536 + 0.5
if val > 2147483647 then
val = 2147483647
end
@@ -402,36 +428,56 @@ local function elapsedtime()
end
l3kernel.elapsedtime = elapsedtime
local function resettimer()
- base_time = os_clock()
+ base_clock_time = os_clock()
end
l3kernel.resettimer = resettimer
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{ltx.utils.filedump}
% \begin{macro}{l3kernel.filedump}
% Similar comments here to the next function: read the file in binary mode
% to avoid any line-end weirdness.
% \begin{macrocode}
local function filedump(name,offset,length)
local file = kpse_find(name,"tex",true)
- if file then
- local length = tonumber(length) or lfs_attr(file,"size")
- local offset = tonumber(offset) or 0
- local f = open(file,"rb")
- if f then
- if offset > 0 then
- f:seek("set",offset)
- end
- local data = f:read(length)
- escapehex(data)
- f:close()
- end
+ if not file then return end
+ local f = open(file,"rb")
+ if not f then return end
+ if offset and offset > 0 then
+ f:seek("set", offset)
end
+ local data = f:read(length or 'a')
+ f:close()
+ return escapehex(data)
end
-l3kernel.filedump = filedump
+ltxutils.filedump = filedump
+deprecated(l3kernel, "filedump", function(name, offset, length)
+ local dump = filedump(name, tonumber(offset), tonumber(length))
+ if dump then
+ write(dump)
+ end
+end)
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
+% \begin{macro}{md5.HEX}
+% Hash a string and return the hash in uppercase hexadecimal format.
+% In some engines, this is build-in. For traditional \LuaTeX{}, the conversion
+% to hexadecimal has to be done by us.
+% \begin{macrocode}
+local md5_HEX = md5.HEX
+if not md5_HEX then
+ local md5_sum = md5.sum
+ function md5_HEX(data)
+ return escapehex(md5_sum(data))
+ end
+ md5.HEX = md5_HEX
+end
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{ltx.utils.filemd5sum}
% \begin{macro}{l3kernel.filemdfivesum}
% Read an entire file and hash it: the hash function itself is a built-in.
% As Lua is byte-based there is no work needed here in terms of UTF-8
@@ -439,94 +485,129 @@ l3kernel.filedump = filedump
% \LuaTeX{}). The file is read in binary mode so that no line ending
% normalisation occurs.
% \begin{macrocode}
-local function filemdfivesum(name)
- local file = kpse_find(name, "tex", true)
- if file then
- local f = open(file, "rb")
- if f then
- local data = f:read("*a")
- escapehex(md5_sum(data))
- f:close()
- end
- end
+local function filemd5sum(name)
+ local file = kpse_find(name, "tex", true) if not file then return end
+ local f = open(file, "rb") if not f then return end
+
+ local data = f:read("*a")
+ f:close()
+ return md5_HEX(data)
end
-l3kernel.filemdfivesum = filemdfivesum
+ltxutils.filemd5sum = filemd5sum
+deprecated(l3kernel, "filemdfivesum", function(name)
+ local hash = filemd5sum(name)
+ if hash then
+ write(hash)
+ end
+end)
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
+% \begin{macro}{ltx.utils.filemoddate}
% \begin{macro}{l3kernel.filemoddate}
+% There are two cases: If the C standard library is C99 compliant,
+% we can use |%z| to get the timezone in almost the right format.
+% We only have to add primes and replace a zero or missing offset
+% with |Z|.
+%
+% Of course this would be boring, so Windows does things differently.
+% There we have to manually calculate the offset.
% See procedure \texttt{makepdftime} in \texttt{utils.c} of
% \pdfTeX{}.
% \begin{macrocode}
-local function filemoddate(name)
- local file = kpse_find(name, "tex", true)
- if file then
+local filemoddate
+if os_date'%z':match'^[+-]%d%d%d%d$' then
+ local pattern = lpeg.Cs(16 *
+ (lpeg.Cg(lpeg.S'+-' * '0000' * lpeg.Cc'Z')
+ + 3 * lpeg.Cc"'" * 2 * lpeg.Cc"'"
+ + lpeg.Cc'Z')
+ * -1)
+ function filemoddate(name)
+ local file = kpse_find(name, "tex", true)
+ if not file then return end
local date = lfs_attr(file, "modification")
- if date then
- local d = os_date("*t", date)
- if d.sec >= 60 then
- d.sec = 59
+ if not date then return end
+ return pattern:match(os_date("D:%Y%m%d%H%M%S%z", date))
+ end
+else
+ local function filemoddate(name)
+ local file = kpse_find(name, "tex", true)
+ if not file then return end
+ local date = lfs_attr(file, "modification")
+ if not date then return end
+ local d = os_date("*t", date)
+ local u = os_date("!*t", date)
+ local off = 60 * (d.hour - u.hour) + d.min - u.min
+ if d.year ~= u.year then
+ if d.year > u.year then
+ off = off + 1440
+ else
+ off = off - 1440
end
- local u = os_date("!*t", date)
- local off = 60 * (d.hour - u.hour) + d.min - u.min
- if d.year ~= u.year then
- if d.year > u.year then
- off = off + 1440
- else
- off = off - 1440
- end
- elseif d.yday ~= u.yday then
- if d.yday > u.yday then
- off = off + 1440
- else
- off = off - 1440
- end
+ elseif d.yday ~= u.yday then
+ if d.yday > u.yday then
+ off = off + 1440
+ else
+ off = off - 1440
end
- local timezone
- if off == 0 then
- timezone = "Z"
+ end
+ local timezone
+ if off == 0 then
+ timezone = "Z"
+ else
+ if off < 0 then
+ timezone = "-"
+ off = -off
else
- local hours = floor(off / 60)
- local mins = abs(off - hours * 60)
- timezone = format("%+03d", hours)
- .. "'" .. format("%02d", mins) .. "'"
+ timezone = "+"
end
- write("D:"
- .. format("%04d", d.year)
- .. format("%02d", d.month)
- .. format("%02d", d.day)
- .. format("%02d", d.hour)
- .. format("%02d", d.min)
- .. format("%02d", d.sec)
- .. timezone)
+ timezone = format("%s%02d'%02d'", timezone, hours // 60, hours % 60)
end
+ return format("D:%04d%02d%02d%02d%02d%02d%s",
+ d.year, d.month, d.day, d.hour, d.min, d.sec, timezone)
end
end
-l3kernel.filemoddate = filemoddate
+ltxutils.filemoddate = filemoddate
+deprecated(l3kernel, "filemoddate", function(name)
+ local hash = filemoddate(name)
+ if hash then
+ write(hash)
+ end
+end)
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
+% \begin{macro}{ltx.utils.filesize}
% \begin{macro}{l3kernel.filesize}
% A simple disk lookup.
% \begin{macrocode}
local function filesize(name)
- local file = kpse_find(name, "tex", true)
+ local file = kpse_find(name, "tex", true)
if file then
local size = lfs_attr(file, "size")
if size then
- write(size)
+ return size
end
end
end
-l3kernel.filesize = filesize
+ltxutils.filesize = filesize
+deprecated(l3kernel, "filesize", function(name)
+ local size = filesize(name)
+ if size then
+ write(size)
+ end
+end)
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{l3kernel.strcmp}
% String comparison which gives the same results as \pdfTeX{}'s
% \tn{pdfstrcmp}, although the ordering should likely not be relied upon!
% \begin{macrocode}
-local function strcmp(A, B)
+deprecated(l3kernel, "strcmp", function (A, B)
if A == B then
write("0")
elseif A < B then
@@ -534,15 +615,15 @@ local function strcmp(A, B)
else
write("1")
end
-end
-l3kernel.strcmp = strcmp
+end)
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{l3kernel.shellescape}
% Replicating the \pdfTeX{} log interaction for shell escape.
% \begin{macrocode}
-local function shellescape(cmd)
+local os_exec = os.execute
+deprecated(l3kernel, "shellescape", function(cmd)
local status,msg = os_exec(cmd)
if status == nil then
write_nl("log","runsystem(" .. cmd .. ")...(" .. msg .. ")\n")
@@ -551,48 +632,57 @@ local function shellescape(cmd)
else
write_nl("log","runsystem(" .. cmd .. ")...failed " .. (msg or "") .. "\n")
end
-end
-l3kernel.shellescape = shellescape
+end)
% \end{macrocode}
% \end{macro}
%
-% \subsection{Generic \Lua{} and font support}
-%
-% \begin{macrocode}
-%<*initex>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=alloc>
-% \end{macrocode}
-%
-% A small amount of generic code is used by almost all \LuaTeX{} material so
-% needs to be loaded by the format.
-% \begin{macrocode}
-attribute_count_name = "g_@@_attribute_int"
-bytecode_count_name = "g_@@_bytecode_int"
-chunkname_count_name = "g_@@_chunkname_int"
-whatsit_count_name = "g_@@_whatsit_int"
-require("ltluatex")
-% \end{macrocode}
-%
-% With the above available the font loader code used by plain \TeX{} and
-% \LaTeXe{} when used with \LuaTeX{} can be loaded here. This is thus being
-% treated more-or-less as part of the engine itself.
+% \begin{macro}[int]{luadef}
+% An internal function for defining control sequences form Lua which behave
+% like primitives. This acts as a wrapper around |token.set_lua| which accepts
+% a function instead of an index into the functions table.
% \begin{macrocode}
-require("luaotfload-main")
-local _void = luaotfload.main()
-% \end{macrocode}
-% \begin{macrocode}
-%</initex>
+local luacmd do
+ local token_create = token.create
+ local set_lua = token.set_lua
+ local undefined_cs = token.command_id'undefined_cs'
+
+ if not context and not luatexbase then require'ltluatex' end
+ if luatexbase then
+ local new_luafunction = luatexbase.new_luafunction
+ local functions = lua.get_functions_table()
+ function luacmd(name, func, ...)
+ local id
+ local tok = token_create(name)
+ if tok.command == undefined_cs then
+ id = new_luafunction(name)
+ set_lua(name, id, ...)
+ else
+ id = tok.index or tok.mode
+ end
+ functions[id] = func
+ end
+ elseif context then
+ local register = context.functions.register
+ local functions = context.functions.known
+ function luacmd(name, func, ...)
+ local tok = token.create(name)
+ if tok.command == undefined_cs then
+ token.set_lua(name, register(func), ...)
+ else
+ functions[tok.index or tok.mode] = func
+ end
+ end
+ end
+end
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
%</lua>
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
%\end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
index 68264ca6d1d..e51d93a30e9 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
@@ -2,7 +2,7 @@
%
%% File: l3msg.dtx
%
-% Copyright (C) 2009-2020 The LaTeX3 Project
+% Copyright (C) 2009-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -404,6 +404,27 @@
% is briefer than \cs{msg_info:nnnnnn}.
% \end{function}
%
+% \begin{function}[added = 2020-07-16]
+% {
+% \msg_term:nnnnnn ,
+% \msg_term:nnnnn ,
+% \msg_term:nnnn ,
+% \msg_term:nnn ,
+% \msg_term:nn ,
+% \msg_term:nnxxxx ,
+% \msg_term:nnxxx ,
+% \msg_term:nnxx ,
+% \msg_term:nnx
+% }
+% \begin{syntax}
+% \cs{msg_term:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+% \end{syntax}
+% Issues \meta{module} information \meta{message}, passing
+% \meta{arg one} to \meta{arg four} to the text-creating functions.
+% The information text is printed on the terminal (and added to the
+% log file): the output is similar to that of \cs{msg_log:nnnnnn}.
+% \end{function}
+%
% \begin{function}[updated = 2012-08-11]
% {
% \msg_none:nnnnnn ,
@@ -423,6 +444,74 @@
% all (see the discussion of message redirection).
% \end{function}
%
+% \subsection{Messages for showing material}
+%
+% \begin{function}[added = 2017-12-04]
+% {
+% \msg_show:nnnnnn ,
+% \msg_show:nnnnn ,
+% \msg_show:nnnn ,
+% \msg_show:nnn ,
+% \msg_show:nn ,
+% \msg_show:nnxxxx ,
+% \msg_show:nnxxx ,
+% \msg_show:nnxx ,
+% \msg_show:nnx
+% }
+% \begin{syntax}
+% \cs{msg_show:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+% \end{syntax}
+% Issues \meta{module} information \meta{message}, passing \meta{arg
+% one} to \meta{arg four} to the text-creating functions. The
+% information text is shown on the terminal and the \TeX{} run is
+% interrupted in a manner similar to \cs{tl_show:n}. This is used in
+% conjunction with \cs{msg_show_item:n} and similar functions to print
+% complex variable contents completely. If the formatted text does
+% not contain |>~| at the start of a line, an additional line |>~.|
+% will be put at the end. In addition, a final period is added if not
+% present.
+% \end{function}
+%
+% \subsection{Expandable error messages}
+%
+% In very rare cases it may be necessary to produce errors in an
+% expansion-only context. The functions in this section should only be
+% used if there is no alternative approach using \cs{msg_error:nnnnnn}
+% or other non-expandable commands from the previous section. Despite
+% having a similar interface as non-expandable messages, expandable
+% errors must be handled internally very differently from normal error
+% messages, as none of the tools to print to the terminal or the log
+% file are expandable. As a result, short-hands such as |\{| or |\\| do
+% not work, and messages must be very short (with default settings,
+% they are truncated after approximately 50 characters). It is
+% advisable to ensure that the message is understandable even when
+% truncated, by putting the most important information up front.
+% Another particularity of expandable messages is that they
+% cannot be redirected or turned off by the user.
+%
+% \begin{function}[EXP, added = 2015-08-06, updated = 2019-02-28]
+% {
+% \msg_expandable_error:nnnnnn ,
+% \msg_expandable_error:nnnnn ,
+% \msg_expandable_error:nnnn ,
+% \msg_expandable_error:nnn ,
+% \msg_expandable_error:nn ,
+% \msg_expandable_error:nnffff ,
+% \msg_expandable_error:nnfff ,
+% \msg_expandable_error:nnff ,
+% \msg_expandable_error:nnf ,
+% }
+% \begin{syntax}
+% \cs{msg_expandable_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+% \end{syntax}
+% Issues an \enquote{Undefined error} message from \TeX{} itself
+% using the undefined control sequence \cs{::error} then prints
+% \enquote{! \meta{module}: }\meta{error message}, which should be
+% short. With default settings, anything beyond approximately $60$
+% characters long (or bytes in some engines) is cropped. A leading
+% space might be removed as well.
+% \end{function}
+%
% \section{Redirecting messages}
%
% Each message has a \enquote{name}, which can be used to alter the behaviour
@@ -503,7 +592,7 @@
% \section{\pkg{l3msg} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -525,6 +614,23 @@
% \end{macrocode}
% \end{variable}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_none_delimit_by_s_stop:w}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Creating messages}
%
% Messages are created and used separately, so there two parts to
@@ -823,12 +929,8 @@
% \subsection{Displaying messages}
%
% \LaTeX{} is handling error messages and so the \TeX{} ones are disabled.
-% This is already done by the \LaTeXe{} kernel, so to avoid messing up any
-% deliberate change by a user this is only set in format mode.
% \begin{macrocode}
-%<*initex>
\int_gset:Nn \tex_errorcontextlines:D { -1 }
-%</initex>
% \end{macrocode}
%
% \begin{macro}[EXP]
@@ -896,12 +998,7 @@
{
\prop_if_in:NnTF \g_msg_module_type_prop {#1}
{ \prop_item:Nn \g_msg_module_type_prop {#1} }
-%<*initex>
- { Module }
-%</initex>
-%<*package>
{ Package }
-%</package>
}
% \end{macrocode}
% \end{macro}
@@ -1157,6 +1254,31 @@
%
% \begin{macro}
% {
+% \msg_term:nnnnnn ,
+% \msg_term:nnnnn ,
+% \msg_term:nnnn ,
+% \msg_term:nnn ,
+% \msg_term:nn ,
+% \msg_term:nnxxxx ,
+% \msg_term:nnxxx ,
+% \msg_term:nnxx ,
+% \msg_term:nnx
+% }
+% \enquote{Term} is used for communicating with the user through the
+% terminal, like diagnostic messages, and debugging. This is similar
+% to \enquote{log} messages, but uses the terminal output.
+% \begin{macrocode}
+ \@@_class_new:nn { term }
+ {
+ \iow_wrap:nnnN
+ { \use:c { \c_@@_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} }
+ { } { } \iow_term:n
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
% \msg_none:nnnnnn ,
% \msg_none:nnnnn ,
% \msg_none:nnnn ,
@@ -1207,15 +1329,15 @@
{
\tl_if_in:nnTF { ^^J #1 } { ^^J > ~ }
{
- \tl_if_in:nnTF { #1 \q_mark } { . \q_mark }
+ \tl_if_in:nnTF { #1 \s_@@_mark } { . \s_@@_mark }
{ \@@_show_dot:w } { \@@_show:w }
- ^^J #1 \q_stop
+ ^^J #1 \s_@@_stop
}
{ \@@_show:nn { ? #1 } { } }
}
- \cs_new:Npn \@@_show_dot:w #1 ^^J > ~ #2 . \q_stop
+ \cs_new:Npn \@@_show_dot:w #1 ^^J > ~ #2 . \s_@@_stop
{ \@@_show:nn {#1} {#2} }
- \cs_new:Npn \@@_show:w #1 ^^J > ~ #2 \q_stop
+ \cs_new:Npn \@@_show:w #1 ^^J > ~ #2 \s_@@_stop
{ \@@_show:nn {#1} {#2} }
\cs_new_protected:Npn \@@_show:nn #1#2
{
@@ -1301,7 +1423,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_use:nnnnnnn #1#2#3#4#5#6#7
{
-%<package> \cs_if_exist_use:N \conditionally@traceoff
+ \cs_if_exist_use:N \conditionally@traceoff
\msg_if_exist:nnTF {#2} {#3}
{
\@@_class_chk_exist:nT {#1}
@@ -1319,7 +1441,7 @@
}
}
{ \__kernel_msg_error:nnxx { kernel } { message-unknown } {#2} {#3} }
-%<package> \cs_if_exist_use:N \conditionally@traceon
+ \cs_if_exist_use:N \conditionally@traceon
}
\cs_new_protected:Npn \@@_use_code: { }
% \end{macrocode}
@@ -1338,16 +1460,16 @@
{
\seq_clear:N \l_@@_hierarchy_seq
\@@_use_hierarchy:nwwN { }
- #1 \q_mark \@@_use_hierarchy:nwwN
- / \q_mark \use_none_delimit_by_q_stop:w
- \q_stop
+ #1 \s_@@_mark \@@_use_hierarchy:nwwN
+ / \s_@@_mark \@@_use_none_delimit_by_s_stop:w
+ \s_@@_stop
\@@_use_redirect_module:n { }
}
}
-\cs_new_protected:Npn \@@_use_hierarchy:nwwN #1#2 / #3 \q_mark #4
+\cs_new_protected:Npn \@@_use_hierarchy:nwwN #1#2 / #3 \s_@@_mark #4
{
\seq_put_left:Nn \l_@@_hierarchy_seq {#1}
- #4 { #1 / #2 } #3 \q_mark #4
+ #4 { #1 / #2 } #3 \s_@@_mark #4
}
% \end{macrocode}
% At this point, the items of \cs{l_@@_hierarchy_seq} are the
@@ -1562,23 +1684,32 @@
%
% \begin{macro}
% {
-% \__kernel_msg_fatal:nnnnnn ,
-% \__kernel_msg_fatal:nnnnn ,
-% \__kernel_msg_fatal:nnnn ,
-% \__kernel_msg_fatal:nnn ,
-% \__kernel_msg_fatal:nn ,
-% \__kernel_msg_fatal:nnxxxx ,
-% \__kernel_msg_fatal:nnxxx ,
-% \__kernel_msg_fatal:nnxx ,
-% \__kernel_msg_fatal:nnx ,
-% \__kernel_msg_error:nnnnnn ,
-% \__kernel_msg_error:nnnnn ,
-% \__kernel_msg_error:nnnn ,
-% \__kernel_msg_error:nnn ,
-% \__kernel_msg_error:nn ,
-% \__kernel_msg_error:nnxxxx ,
-% \__kernel_msg_error:nnxxx ,
-% \__kernel_msg_error:nnxx ,
+% \__kernel_msg_fatal:nnnnnn ,
+% \__kernel_msg_fatal:nnnnn ,
+% \__kernel_msg_fatal:nnnn ,
+% \__kernel_msg_fatal:nnn ,
+% \__kernel_msg_fatal:nn ,
+% \__kernel_msg_fatal:nnxxxx ,
+% \__kernel_msg_fatal:nnxxx ,
+% \__kernel_msg_fatal:nnxx ,
+% \__kernel_msg_fatal:nnx ,
+% \__kernel_msg_critical:nnnnnn ,
+% \__kernel_msg_critical:nnnnn ,
+% \__kernel_msg_critical:nnnn ,
+% \__kernel_msg_critical:nnn ,
+% \__kernel_msg_critical:nn ,
+% \__kernel_msg_critical:nnxxxx ,
+% \__kernel_msg_critical:nnxxx ,
+% \__kernel_msg_critical:nnxx ,
+% \__kernel_msg_critical:nnx ,
+% \__kernel_msg_error:nnnnnn ,
+% \__kernel_msg_error:nnnnn ,
+% \__kernel_msg_error:nnnn ,
+% \__kernel_msg_error:nnn ,
+% \__kernel_msg_error:nn ,
+% \__kernel_msg_error:nnxxxx ,
+% \__kernel_msg_error:nnxxx ,
+% \__kernel_msg_error:nnxx ,
% \__kernel_msg_error:nnx
% }
% Neither fatal kernel errors nor kernel errors can be redirected. We
@@ -1588,6 +1719,7 @@
% errors.
% \begin{macrocode}
\@@_kernel_class_new:nN { fatal } \@@_fatal_code:nnnnnn
+ \@@_kernel_class_new:nN { critical } \@@_critical_code:nnnnnn
\cs_undefine:N \__kernel_msg_error:nnxx
\cs_undefine:N \__kernel_msg_error:nnx
\cs_undefine:N \__kernel_msg_error:nn
@@ -1798,6 +1930,18 @@
\__kernel_msg_new:nnnn { kernel } { quote-in-shell }
{ Quotes~in~shell~command~'#1'. }
{ Shell~commands~cannot~contain~quotes~("). }
+\__kernel_msg_new:nnnn { kernel } { invalid-quark-function }
+ { Quark~test~function~'#1'~is~invalid. }
+ {
+ \c__msg_coding_error_text_tl
+ LaTeX~has~been~asked~to~create~quark~test~function~'#1'~
+ \tl_if_empty:nTF {#2}
+ { but~that~name~ }
+ { with~signature~'#2',~but~that~signature~ }
+ is~not~valid.
+ }
+\__kernel_msg_new:nnn { kernel } { invalid-quark }
+ { Invalid~quark~variable~'#1'. }
\__kernel_msg_new:nnnn { kernel } { scanmark-already-defined }
{ Scan~mark~#1~already~defined. }
{
@@ -1862,28 +2006,15 @@
% \texttt{log-functions}, or on the contrary if debugging is turned off.
% In format mode the error is somewhat different.
% \begin{macrocode}
-%<*package>
-\__kernel_msg_new:nnnn { kernel } { enable-debug }
- { To~use~'#1'~load~expl3~with~the~'enable-debug'~option. }
- {
- The~function~'#1'~will~be~ignored~because~it~can~only~work~if~
- some~internal~functions~in~expl3~have~been~appropriately~
- defined.~This~only~happens~if~one~of~the~options~
- 'enable-debug',~'check-declarations'~or~'log-functions'~was~
- given~when~loading~expl3.
- }
-%</package>
-%<*initex>
\__kernel_msg_new:nnnn { kernel } { enable-debug }
- { '#1'~cannot~be~used~in~format~mode. }
+ { To~use~'#1'~set~the~'enable-debug'~option. }
{
The~function~'#1'~will~be~ignored~because~it~can~only~work~if~
some~internal~functions~in~expl3~have~been~appropriately~
- defined.~This~only~happens~in~package~mode~(and~only~if~one~of~
- the~options~'enable-debug',~'check-declarations'~or~'log-functions'~
- was~given~when~loading~expl3.
+ defined.~This~only~happens~if~one~of~the~options~
+ 'enable-debug',~'check-declarations'~or~'log-functions'~was~
+ given~as~an~option:~see~the~main~expl3~documentation.
}
-%</initex>
% \end{macrocode}
%
% Some errors only appear in expandable settings,
@@ -1984,7 +2115,7 @@
% is an extra subtlety: if the user inserts tokens for error recovery,
% they should be kept. Thus we also use an odd space character
% (with category code $7$) and keep tokens until that space character,
-% dropping everything else until \cs{q_stop}. The \cs{exp_end:} prevents
+% dropping everything else until \cs{s_@@_stop}. The \cs{exp_end:} prevents
% losing braces around the user-inserted text if any, and stops the
% expansion of \cs{exp:w}. The group is used to prevent
% |\LaTeX3~error:| from being globally equal to \cs{scan_stop:}.
@@ -2069,8 +2200,58 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[EXP]
+% {
+% \msg_expandable_error:nnnnnn ,
+% \msg_expandable_error:nnnnn ,
+% \msg_expandable_error:nnnn ,
+% \msg_expandable_error:nnn ,
+% \msg_expandable_error:nn ,
+% \msg_expandable_error:nnffff ,
+% \msg_expandable_error:nnfff ,
+% \msg_expandable_error:nnff ,
+% \msg_expandable_error:nnf
+% }
+% \begin{macro}{\@@_expandable_error_module:nn}
+% Pass to an auxiliary the message to display and the module name
% \begin{macrocode}
-%</initex|package>
+\cs_new:Npn \msg_expandable_error:nnnnnn #1#2#3#4#5#6
+ {
+ \exp_args:Ne \@@_expandable_error_module:nn
+ {
+ \exp_args:Nc \exp_args:Noooo
+ { \c_@@_text_prefix_tl #1 / #2 }
+ { \tl_to_str:n {#3} }
+ { \tl_to_str:n {#4} }
+ { \tl_to_str:n {#5} }
+ { \tl_to_str:n {#6} }
+ }
+ {#1}
+ }
+\cs_new:Npn \msg_expandable_error:nnnnn #1#2#3#4#5
+ { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} {#5} { } }
+\cs_new:Npn \msg_expandable_error:nnnn #1#2#3#4
+ { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} { } { } }
+\cs_new:Npn \msg_expandable_error:nnn #1#2#3
+ { \msg_expandable_error:nnnnnn {#1} {#2} {#3} { } { } { } }
+\cs_new:Npn \msg_expandable_error:nn #1#2
+ { \msg_expandable_error:nnnnnn {#1} {#2} { } { } { } { } }
+\cs_generate_variant:Nn \msg_expandable_error:nnnnnn { nnffff }
+\cs_generate_variant:Nn \msg_expandable_error:nnnnn { nnfff }
+\cs_generate_variant:Nn \msg_expandable_error:nnnn { nnff }
+\cs_generate_variant:Nn \msg_expandable_error:nnn { nnf }
+\cs_new:Npn \@@_expandable_error_module:nn #1#2
+ {
+ \exp_after:wN \exp_after:wN
+ \exp_after:wN \@@_use_none_delimit_by_s_stop:w
+ \use:n { \::error ! ~ #2 : ~ #1 } \s_@@_stop
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
index ccd26ea9c3a..bc7d4f12384 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
@@ -2,7 +2,7 @@
%
%% File: l3names.dtx
%
-% Copyright (C) 1990-2020 The LaTeX3 Project
+% Copyright (C) 1990-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -55,19 +55,19 @@
% performs the following tasks:
% \begin{itemize}
% \item defines new names for all \TeX{} primitives;
+% \item emulate required primitives not provided by default in \LuaTeX;
% \item switches to the category code r{\'e}gime for programming;
-% \item provides support settings for building the code as a \TeX{} format.
% \end{itemize}
%
-% This module is entirely dedicated to primitives, which should not be
-% used directly within \LaTeX3 code (outside of \enquote{kernel-level}
-% code). As such, the primitives are not documented here: \emph{The
-% \TeX{}book}, \emph{\TeX{} by Topic} and the manuals for \pdfTeX{},
-% \XeTeX{}, \LuaTeX{}, \pTeX{} and \upTeX{} should be consulted for
-% details of the primitives. These are named
-% \cs[no-index]{tex_\meta{name}:D}, typically based on the primitive's
-% \meta{name} in \pdfTeX{} and omitting a leading |pdf| when the
-% primitive is not related to pdf output.
+% This module is entirely dedicated to primitives (and emulations of
+% these), which should not be used directly within \LaTeX3 code
+% (outside of \enquote{kernel-level} code). As such, the primitives
+% are not documented here: \emph{The \TeX{}book}, \emph{\TeX{} by
+% Topic} and the manuals for \pdfTeX{}, \XeTeX{}, \LuaTeX{}, \pTeX{}
+% and \upTeX{} should be consulted for details of the primitives.
+% These are named \cs[no-index]{tex_\meta{name}:D}, typically based
+% on the primitive's \meta{name} in \pdfTeX{} and omitting a leading
+% |pdf| when the primitive is not related to pdf output.
%
% \end{documentation}
%
@@ -76,7 +76,7 @@
% \section{\pkg{l3names} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package&tex>
% \end{macrocode}
%
% The prefix here is \texttt{kernel}. A few places need |@@| to be left
@@ -86,8 +86,7 @@
% \end{macrocode}
%
% The code here simply renames all of the primitives to new, internal,
-% names. In format mode, it also deletes all of the existing names (although
-% some do come back later).
+% names.
%
% The \tn{let} primitive is renamed by hand first as it is essential for
% the entire process to follow. This also uses \tn{global}, as that way
@@ -104,23 +103,18 @@
% \end{macrocode}
%
% \begin{macro}{\@@_primitive:NN}
-% A temporary function to actually do the renaming. This also allows the
-% original names to be removed in format mode.
+% A temporary function to actually do the renaming.
% \begin{macrocode}
\long \def \@@_primitive:NN #1#2
- {
- \tex_global:D \tex_let:D #2 #1
-%<*initex>
- \tex_global:D \tex_let:D #1 \tex_undefined:D
-%</initex>
- }
+ { \tex_global:D \tex_let:D #2 #1 }
% \end{macrocode}
%\end{macro}
%
% To allow extracting \enquote{just the names}, a bit of DocStrip fiddling.
% \begin{macrocode}
-%</initex|package>
-%<*initex|names|package>
+%</package&tex>
+%<*names|tex>
+%<*names|package>
% \end{macrocode}
%
% In the current incarnation of this package, all \TeX{} primitives
@@ -600,9 +594,7 @@
\@@_primitive:NN \pdfuniqueresname \tex_pdfuniqueresname:D
\@@_primitive:NN \pdfvorigin \tex_pdfvorigin:D
\@@_primitive:NN \pdfxform \tex_pdfxform:D
- \@@_primitive:NN \pdfxformattr \tex_pdfxformattr:D
\@@_primitive:NN \pdfxformname \tex_pdfxformname:D
- \@@_primitive:NN \pdfxformresources \tex_pdfxformresources:D
\@@_primitive:NN \pdfximage \tex_pdfximage:D
\@@_primitive:NN \pdfximagebbox \tex_pdfximagebbox:D
% \end{macrocode}
@@ -619,9 +611,6 @@
\@@_primitive:NN \pdfeachlinedepth \tex_eachlinedepth:D
\@@_primitive:NN \pdfeachlineheight \tex_eachlineheight:D
\@@_primitive:NN \pdfelapsedtime \tex_elapsedtime:D
- \@@_primitive:NN \pdffiledump \tex_filedump:D
- \@@_primitive:NN \pdffilemoddate \tex_filemoddate:D
- \@@_primitive:NN \pdffilesize \tex_filesize:D
\@@_primitive:NN \pdffirstlineheight \tex_firstlineheight:D
\@@_primitive:NN \pdffontexpand \tex_fontexpand:D
\@@_primitive:NN \pdffontsize \tex_fontsize:D
@@ -632,7 +621,6 @@
\@@_primitive:NN \pdflastypos \tex_lastypos:D
\@@_primitive:NN \pdfmapfile \tex_mapfile:D
\@@_primitive:NN \pdfmapline \tex_mapline:D
- \@@_primitive:NN \pdfmdfivesum \tex_mdfivesum:D
\@@_primitive:NN \pdfnoligatures \tex_noligatures:D
\@@_primitive:NN \pdfnormaldeviate \tex_normaldeviate:D
\@@_primitive:NN \pdfpageheight \tex_pageheight:D
@@ -645,7 +633,6 @@
\@@_primitive:NN \pdfrandomseed \tex_randomseed:D
\@@_primitive:NN \pdfresettimer \tex_resettimer:D
\@@_primitive:NN \pdfsavepos \tex_savepos:D
- \@@_primitive:NN \pdfstrcmp \tex_strcmp:D
\@@_primitive:NN \pdfsetrandomseed \tex_setrandomseed:D
\@@_primitive:NN \pdfshellescape \tex_shellescape:D
\@@_primitive:NN \pdftracingfonts \tex_tracingfonts:D
@@ -677,8 +664,8 @@
% for \LuaTeX{} tracking all of that would be hard. Instead, we now check that
% we only save primitives if they actually exist.
% \begin{macrocode}
-%</initex|names|package>
-%<*initex|package>
+%</names|package>
+%<*package>
\tex_long:D \tex_def:D \use_ii:nn #1#2 {#2}
\tex_long:D \tex_def:D \use_none:n #1 { }
\tex_long:D \tex_def:D \@@_primitive:NN #1#2
@@ -687,12 +674,19 @@
\tex_expandafter:D \use_ii:nn
\tex_fi:D
\use_none:n { \tex_global:D \tex_let:D #2 #1 }
-%<*initex>
- \tex_global:D \tex_let:D #1 \tex_undefined:D
-%</initex>
}
-%</initex|package>
-%<*initex|names|package>
+%</package>
+%<*names|package>
+% \end{macrocode}
+% Some \pdfTeX{} primitives are handled here because they got dropped in
+% \LuaTeX{} but the corresponding internal names are emulated later. The
+% Lua code is already loaded at this point, so we shouldn't overwrite them.
+% \begin{macrocode}
+ \@@_primitive:NN \pdfstrcmp \tex_strcmp:D
+ \@@_primitive:NN \pdffilesize \tex_filesize:D
+ \@@_primitive:NN \pdfmdfivesum \tex_mdfivesum:D
+ \@@_primitive:NN \pdffilemoddate \tex_filemoddate:D
+ \@@_primitive:NN \pdffiledump \tex_filedump:D
% \end{macrocode}
% \XeTeX{}-specific primitives. Note that \XeTeX{}'s \tn{strcmp} is
% handled earlier and is \enquote{rolled up} into \tn{pdfstrcmp}.
@@ -924,7 +918,7 @@
\@@_primitive:NN \normaldeviate \tex_normaldeviate:D
\@@_primitive:NN \outputmode \tex_pdfoutput:D
\@@_primitive:NN \pageheight \tex_pageheight:D
- \@@_primitive:NN \pagewidth \tex_pagewith:D
+ \@@_primitive:NN \pagewidth \tex_pagewidth:D
\@@_primitive:NN \protrudechars \tex_protrudechars:D
\@@_primitive:NN \pxdimen \tex_pxdimen:D
\@@_primitive:NN \randomseed \tex_randomseed:D
@@ -1199,8 +1193,10 @@
% \end{macrocode}
% End of the \enquote{just the names} part of the source.
% \begin{macrocode}
-%</initex|names|package>
-%<*initex|package>
+%</names|package>
+%</names|tex>
+%<*package>
+%<*tex>
% \end{macrocode}
%
% The job is done: close the group (using the primitive renamed!).
@@ -1209,15 +1205,25 @@
% \end{macrocode}
%
% \LaTeXe{} moves a few primitives, so these are sorted out.
-% A convenient test for \LaTeXe{} is the \cs{@@@@end} saved primitive.
+% In newer versions of \LaTeXe{}, \pkg{expl3} is loaded rather early, so
+% only some primitives are already renamed, so we need two tests here.
+% At the beginning of the \LaTeXe{} format, the primitives \tn{end} and
+% \tn{input} are renamed, and only later on the other ones.
% \begin{macrocode}
-%<*package>
\tex_ifdefined:D \@@@@end
\tex_let:D \tex_end:D \@@@@end
+ \tex_let:D \tex_input:D \@@@@input
+\tex_fi:D
+% \end{macrocode}
+%
+% If \tn{@@@@hyph} is defined, we are loading \pkg{expl3} in a
+% pre-2020/10/01 release of \LaTeXe{}, so a few other primitives have to
+% be tested as well.
+% \begin{macrocode}
+\tex_ifdefined:D \@@@@hyph
\tex_let:D \tex_everydisplay:D \frozen@everydisplay
\tex_let:D \tex_everymath:D \frozen@everymath
\tex_let:D \tex_hyphen:D \@@@@hyph
- \tex_let:D \tex_input:D \@@@@input
\tex_let:D \tex_italiccorrection:D \@@@@italiccorr
\tex_let:D \tex_underline:D \@@@@underline
% \end{macrocode}
@@ -1359,7 +1365,6 @@
\tex_let:D \tex_mapfile:D \tex_undefined:D
\tex_let:D \tex_mapline:D \tex_undefined:D
\tex_fi:D
-%</package>
% \end{macrocode}
% A few packages do unfortunate things to date-related primitives.
% \begin{macrocode}
@@ -1394,13 +1399,21 @@
% confusing. Removing them means that \cs{tex_pdftexversion:D} is
% a marker for \pdfTeX{} alone: useful in engine-dependent code later.
% \begin{macrocode}
-%<*initex|package>
\tex_ifdefined:D \tex_luatexversion:D
\tex_let:D \tex_pdftexbanner:D \tex_undefined:D
\tex_let:D \tex_pdftexrevision:D \tex_undefined:D
\tex_let:D \tex_pdftexversion:D \tex_undefined:D
\tex_fi:D
-%</initex|package>
+% \end{macrocode}
+% \pkg{cslatex} moves a couple of primitives which we recover here; as there
+% is no other marker, we can only work by looking for the names.
+% \begin{macrocode}
+\tex_ifdefined:D \orieveryjob
+ \tex_let:D \tex_everyjob:D \orieveryjob
+\tex_fi:D
+\tex_ifdefined:D \oripdfoutput
+ \tex_let:D \tex_pdfoutput:D \oripdfoutput
+\tex_fi:D
% \end{macrocode}
%
% For \ConTeXt{}, two tests are needed. Both Mark~II and Mark~IV move several
@@ -1408,7 +1421,6 @@
% as a marker. For Mark~IV, a few more primitives are moved: they are
% implemented using some Lua code in the current \ConTeXt{}.
% \begin{macrocode}
-%<*package>
\tex_ifdefined:D \normalend
\tex_let:D \tex_end:D \normalend
\tex_let:D \tex_everyjob:D \normaleveryjob
@@ -1435,657 +1447,112 @@
\tex_let:D \tex_middle:D \normalmiddle
\tex_let:D \tex_right:D \normalright
\tex_fi:D
-%</package>
% \end{macrocode}
%
-% \subsection{Deprecated functions}
+% \begin{macrocode}
+%</tex>
+% \end{macrocode}
%
-% Older versions of \pkg{expl3} divided up primitives by \enquote{source}: that
-% becomes very tricky with multiple parallel engine developments, so has been
-% dropped. To cover the transition, we provide the older names here for a
-% limited period (until the end of 2019).
+% In \LuaTeX{}, we additionally emulate some primitives using Lua code.
+% \begin{macrocode}
+%<*lua>
+% \end{macrocode}
%
-% To allow \cs{debug_on:n} \Arg{deprecation} to work we save the list of
-% primitives into \cs{@@_primitives:}
+% \begin{macro}{\tex_strcmp:D}
+% Compare two strings, expanding to |0| if they are equal,
+% |-1| if the first one is smaller and |1| if the second one is smaller.
+% Here \enquote{smaller} refers to codepoint order which does not correspond to
+% the user expected order for most non-ASCII strings.
% \begin{macrocode}
-%<*package>
-\tex_begingroup:D
- \tex_long:D \tex_def:D \use_ii:nn #1#2 {#2}
- \tex_long:D \tex_def:D \use_none:n #1 { }
- \tex_long:D \tex_def:D \@@_primitive:NN #1#2
- {
- \tex_ifdefined:D #1
- \tex_expandafter:D \use_ii:nn
- \tex_fi:D
- \use_none:n { \tex_global:D \tex_let:D #2 #1 }
- }
- \tex_xdef:D \@@_primitives:
- {
- \tex_unexpanded:D
- {
- \@@_primitive:NN \beginL \etex_beginL:D
- \@@_primitive:NN \beginR \etex_beginR:D
- \@@_primitive:NN \botmarks \etex_botmarks:D
- \@@_primitive:NN \clubpenalties \etex_clubpenalties:D
- \@@_primitive:NN \currentgrouplevel \etex_currentgrouplevel:D
- \@@_primitive:NN \currentgrouptype \etex_currentgrouptype:D
- \@@_primitive:NN \currentifbranch \etex_currentifbranch:D
- \@@_primitive:NN \currentiflevel \etex_currentiflevel:D
- \@@_primitive:NN \currentiftype \etex_currentiftype:D
- \@@_primitive:NN \detokenize \etex_detokenize:D
- \@@_primitive:NN \dimexpr \etex_dimexpr:D
- \@@_primitive:NN \displaywidowpenalties
- \etex_displaywidowpenalties:D
- \@@_primitive:NN \endL \etex_endL:D
- \@@_primitive:NN \endR \etex_endR:D
- \@@_primitive:NN \eTeXrevision \etex_eTeXrevision:D
- \@@_primitive:NN \eTeXversion \etex_eTeXversion:D
- \@@_primitive:NN \everyeof \etex_everyeof:D
- \@@_primitive:NN \firstmarks \etex_firstmarks:D
- \@@_primitive:NN \fontchardp \etex_fontchardp:D
- \@@_primitive:NN \fontcharht \etex_fontcharht:D
- \@@_primitive:NN \fontcharic \etex_fontcharic:D
- \@@_primitive:NN \fontcharwd \etex_fontcharwd:D
- \@@_primitive:NN \glueexpr \etex_glueexpr:D
- \@@_primitive:NN \glueshrink \etex_glueshrink:D
- \@@_primitive:NN \glueshrinkorder \etex_glueshrinkorder:D
- \@@_primitive:NN \gluestretch \etex_gluestretch:D
- \@@_primitive:NN \gluestretchorder \etex_gluestretchorder:D
- \@@_primitive:NN \gluetomu \etex_gluetomu:D
- \@@_primitive:NN \ifcsname \etex_ifcsname:D
- \@@_primitive:NN \ifdefined \etex_ifdefined:D
- \@@_primitive:NN \iffontchar \etex_iffontchar:D
- \@@_primitive:NN \interactionmode \etex_interactionmode:D
- \@@_primitive:NN \interlinepenalties \etex_interlinepenalties:D
- \@@_primitive:NN \lastlinefit \etex_lastlinefit:D
- \@@_primitive:NN \lastnodetype \etex_lastnodetype:D
- \@@_primitive:NN \marks \etex_marks:D
- \@@_primitive:NN \middle \etex_middle:D
- \@@_primitive:NN \muexpr \etex_muexpr:D
- \@@_primitive:NN \mutoglue \etex_mutoglue:D
- \@@_primitive:NN \numexpr \etex_numexpr:D
- \@@_primitive:NN \pagediscards \etex_pagediscards:D
- \@@_primitive:NN \parshapedimen \etex_parshapedimen:D
- \@@_primitive:NN \parshapeindent \etex_parshapeindent:D
- \@@_primitive:NN \parshapelength \etex_parshapelength:D
- \@@_primitive:NN \predisplaydirection \etex_predisplaydirection:D
- \@@_primitive:NN \protected \etex_protected:D
- \@@_primitive:NN \readline \etex_readline:D
- \@@_primitive:NN \savinghyphcodes \etex_savinghyphcodes:D
- \@@_primitive:NN \savingvdiscards \etex_savingvdiscards:D
- \@@_primitive:NN \scantokens \etex_scantokens:D
- \@@_primitive:NN \showgroups \etex_showgroups:D
- \@@_primitive:NN \showifs \etex_showifs:D
- \@@_primitive:NN \showtokens \etex_showtokens:D
- \@@_primitive:NN \splitbotmarks \etex_splitbotmarks:D
- \@@_primitive:NN \splitdiscards \etex_splitdiscards:D
- \@@_primitive:NN \splitfirstmarks \etex_splitfirstmarks:D
- \@@_primitive:NN \TeXXeTstate \etex_TeXXeTstate:D
- \@@_primitive:NN \topmarks \etex_topmarks:D
- \@@_primitive:NN \tracingassigns \etex_tracingassigns:D
- \@@_primitive:NN \tracinggroups \etex_tracinggroups:D
- \@@_primitive:NN \tracingifs \etex_tracingifs:D
- \@@_primitive:NN \tracingnesting \etex_tracingnesting:D
- \@@_primitive:NN \tracingscantokens \etex_tracingscantokens:D
- \@@_primitive:NN \unexpanded \etex_unexpanded:D
- \@@_primitive:NN \unless \etex_unless:D
- \@@_primitive:NN \widowpenalties \etex_widowpenalties:D
- \@@_primitive:NN \pdfannot \pdftex_pdfannot:D
- \@@_primitive:NN \pdfcatalog \pdftex_pdfcatalog:D
- \@@_primitive:NN \pdfcompresslevel \pdftex_pdfcompresslevel:D
- \@@_primitive:NN \pdfcolorstack \pdftex_pdfcolorstack:D
- \@@_primitive:NN \pdfcolorstackinit \pdftex_pdfcolorstackinit:D
- \@@_primitive:NN \pdfcreationdate \pdftex_pdfcreationdate:D
- \@@_primitive:NN \pdfdecimaldigits \pdftex_pdfdecimaldigits:D
- \@@_primitive:NN \pdfdest \pdftex_pdfdest:D
- \@@_primitive:NN \pdfdestmargin \pdftex_pdfdestmargin:D
- \@@_primitive:NN \pdfendlink \pdftex_pdfendlink:D
- \@@_primitive:NN \pdfendthread \pdftex_pdfendthread:D
- \@@_primitive:NN \pdffontattr \pdftex_pdffontattr:D
- \@@_primitive:NN \pdffontname \pdftex_pdffontname:D
- \@@_primitive:NN \pdffontobjnum \pdftex_pdffontobjnum:D
- \@@_primitive:NN \pdfgamma \pdftex_pdfgamma:D
- \@@_primitive:NN \pdfimageapplygamma \pdftex_pdfimageapplygamma:D
- \@@_primitive:NN \pdfimagegamma \pdftex_pdfimagegamma:D
- \@@_primitive:NN \pdfgentounicode \pdftex_pdfgentounicode:D
- \@@_primitive:NN \pdfglyphtounicode \pdftex_pdfglyphtounicode:D
- \@@_primitive:NN \pdfhorigin \pdftex_pdfhorigin:D
- \@@_primitive:NN \pdfimagehicolor \pdftex_pdfimagehicolor:D
- \@@_primitive:NN \pdfimageresolution \pdftex_pdfimageresolution:D
- \@@_primitive:NN \pdfincludechars \pdftex_pdfincludechars:D
- \@@_primitive:NN \pdfinclusioncopyfonts
- \pdftex_pdfinclusioncopyfonts:D
- \@@_primitive:NN \pdfinclusionerrorlevel
- \pdftex_pdfinclusionerrorlevel:D
- \@@_primitive:NN \pdfinfo \pdftex_pdfinfo:D
- \@@_primitive:NN \pdflastannot \pdftex_pdflastannot:D
- \@@_primitive:NN \pdflastlink \pdftex_pdflastlink:D
- \@@_primitive:NN \pdflastobj \pdftex_pdflastobj:D
- \@@_primitive:NN \pdflastxform \pdftex_pdflastxform:D
- \@@_primitive:NN \pdflastximage \pdftex_pdflastximage:D
- \@@_primitive:NN \pdflastximagecolordepth
- \pdftex_pdflastximagecolordepth:D
- \@@_primitive:NN \pdflastximagepages \pdftex_pdflastximagepages:D
- \@@_primitive:NN \pdflinkmargin \pdftex_pdflinkmargin:D
- \@@_primitive:NN \pdfliteral \pdftex_pdfliteral:D
- \@@_primitive:NN \pdfminorversion \pdftex_pdfminorversion:D
- \@@_primitive:NN \pdfnames \pdftex_pdfnames:D
- \@@_primitive:NN \pdfobj \pdftex_pdfobj:D
- \@@_primitive:NN \pdfobjcompresslevel
- \pdftex_pdfobjcompresslevel:D
- \@@_primitive:NN \pdfoutline \pdftex_pdfoutline:D
- \@@_primitive:NN \pdfoutput \pdftex_pdfoutput:D
- \@@_primitive:NN \pdfpageattr \pdftex_pdfpageattr:D
- \@@_primitive:NN \pdfpagebox \pdftex_pdfpagebox:D
- \@@_primitive:NN \pdfpageref \pdftex_pdfpageref:D
- \@@_primitive:NN \pdfpageresources \pdftex_pdfpageresources:D
- \@@_primitive:NN \pdfpagesattr \pdftex_pdfpagesattr:D
- \@@_primitive:NN \pdfrefobj \pdftex_pdfrefobj:D
- \@@_primitive:NN \pdfrefxform \pdftex_pdfrefxform:D
- \@@_primitive:NN \pdfrefximage \pdftex_pdfrefximage:D
- \@@_primitive:NN \pdfrestore \pdftex_pdfrestore:D
- \@@_primitive:NN \pdfretval \pdftex_pdfretval:D
- \@@_primitive:NN \pdfsave \pdftex_pdfsave:D
- \@@_primitive:NN \pdfsetmatrix \pdftex_pdfsetmatrix:D
- \@@_primitive:NN \pdfstartlink \pdftex_pdfstartlink:D
- \@@_primitive:NN \pdfstartthread \pdftex_pdfstartthread:D
- \@@_primitive:NN \pdfsuppressptexinfo
- \pdftex_pdfsuppressptexinfo:D
- \@@_primitive:NN \pdfthread \pdftex_pdfthread:D
- \@@_primitive:NN \pdfthreadmargin \pdftex_pdfthreadmargin:D
- \@@_primitive:NN \pdftrailer \pdftex_pdftrailer:D
- \@@_primitive:NN \pdfuniqueresname \pdftex_pdfuniqueresname:D
- \@@_primitive:NN \pdfvorigin \pdftex_pdfvorigin:D
- \@@_primitive:NN \pdfxform \pdftex_pdfxform:D
- \@@_primitive:NN \pdfxformattr \pdftex_pdfxformattr:D
- \@@_primitive:NN \pdfxformname \pdftex_pdfxformname:D
- \@@_primitive:NN \pdfxformresources \pdftex_pdfxformresources:D
- \@@_primitive:NN \pdfximage \pdftex_pdfximage:D
- \@@_primitive:NN \pdfximagebbox \pdftex_pdfximagebbox:D
- \@@_primitive:NN \ifpdfabsdim \pdftex_ifabsdim:D
- \@@_primitive:NN \ifpdfabsnum \pdftex_ifabsnum:D
- \@@_primitive:NN \ifpdfprimitive \pdftex_ifprimitive:D
- \@@_primitive:NN \pdfadjustspacing \pdftex_adjustspacing:D
- \@@_primitive:NN \pdfcopyfont \pdftex_copyfont:D
- \@@_primitive:NN \pdfdraftmode \pdftex_draftmode:D
- \@@_primitive:NN \pdfeachlinedepth \pdftex_eachlinedepth:D
- \@@_primitive:NN \pdfeachlineheight \pdftex_eachlineheight:D
- \@@_primitive:NN \pdffilemoddate \pdftex_filemoddate:D
- \@@_primitive:NN \pdffilesize \pdftex_filesize:D
- \@@_primitive:NN \pdffirstlineheight \pdftex_firstlineheight:D
- \@@_primitive:NN \pdffontexpand \pdftex_fontexpand:D
- \@@_primitive:NN \pdffontsize \pdftex_fontsize:D
- \@@_primitive:NN \pdfignoreddimen \pdftex_ignoreddimen:D
- \@@_primitive:NN \pdfinsertht \pdftex_insertht:D
- \@@_primitive:NN \pdflastlinedepth \pdftex_lastlinedepth:D
- \@@_primitive:NN \pdflastxpos \pdftex_lastxpos:D
- \@@_primitive:NN \pdflastypos \pdftex_lastypos:D
- \@@_primitive:NN \pdfmapfile \pdftex_mapfile:D
- \@@_primitive:NN \pdfmapline \pdftex_mapline:D
- \@@_primitive:NN \pdfmdfivesum \pdftex_mdfivesum:D
- \@@_primitive:NN \pdfnoligatures \pdftex_noligatures:D
- \@@_primitive:NN \pdfnormaldeviate \pdftex_normaldeviate:D
- \@@_primitive:NN \pdfpageheight \pdftex_pageheight:D
- \@@_primitive:NN \pdfpagewidth \pdftex_pagewidth:D
- \@@_primitive:NN \pdfpkmode \pdftex_pkmode:D
- \@@_primitive:NN \pdfpkresolution \pdftex_pkresolution:D
- \@@_primitive:NN \pdfprimitive \pdftex_primitive:D
- \@@_primitive:NN \pdfprotrudechars \pdftex_protrudechars:D
- \@@_primitive:NN \pdfpxdimen \pdftex_pxdimen:D
- \@@_primitive:NN \pdfrandomseed \pdftex_randomseed:D
- \@@_primitive:NN \pdfsavepos \pdftex_savepos:D
- \@@_primitive:NN \pdfstrcmp \pdftex_strcmp:D
- \@@_primitive:NN \pdfsetrandomseed \pdftex_setrandomseed:D
- \@@_primitive:NN \pdfshellescape \pdftex_shellescape:D
- \@@_primitive:NN \pdftracingfonts \pdftex_tracingfonts:D
- \@@_primitive:NN \pdfuniformdeviate \pdftex_uniformdeviate:D
- \@@_primitive:NN \pdftexbanner \pdftex_pdftexbanner:D
- \@@_primitive:NN \pdftexrevision \pdftex_pdftexrevision:D
- \@@_primitive:NN \pdftexversion \pdftex_pdftexversion:D
- \@@_primitive:NN \efcode \pdftex_efcode:D
- \@@_primitive:NN \ifincsname \pdftex_ifincsname:D
- \@@_primitive:NN \leftmarginkern \pdftex_leftmarginkern:D
- \@@_primitive:NN \letterspacefont \pdftex_letterspacefont:D
- \@@_primitive:NN \lpcode \pdftex_lpcode:D
- \@@_primitive:NN \quitvmode \pdftex_quitvmode:D
- \@@_primitive:NN \rightmarginkern \pdftex_rightmarginkern:D
- \@@_primitive:NN \rpcode \pdftex_rpcode:D
- \@@_primitive:NN \synctex \pdftex_synctex:D
- \@@_primitive:NN \tagcode \pdftex_tagcode:D
- \@@_primitive:NN \mdfivesum \pdftex_mdfivesum:D
- \@@_primitive:NN \ifprimitive \pdftex_ifprimitive:D
- \@@_primitive:NN \primitive \pdftex_primitive:D
- \@@_primitive:NN \shellescape \pdftex_shellescape:D
- \@@_primitive:NN \adjustspacing \pdftex_adjustspacing:D
- \@@_primitive:NN \copyfont \pdftex_copyfont:D
- \@@_primitive:NN \draftmode \pdftex_draftmode:D
- \@@_primitive:NN \expandglyphsinfont \pdftex_fontexpand:D
- \@@_primitive:NN \ifabsdim \pdftex_ifabsdim:D
- \@@_primitive:NN \ifabsnum \pdftex_ifabsnum:D
- \@@_primitive:NN \ignoreligaturesinfont
- \pdftex_ignoreligaturesinfont:D
- \@@_primitive:NN \insertht \pdftex_insertht:D
- \@@_primitive:NN \lastsavedboxresourceindex
- \pdftex_pdflastxform:D
- \@@_primitive:NN \lastsavedimageresourceindex
- \pdftex_pdflastximage:D
- \@@_primitive:NN \lastsavedimageresourcepages
- \pdftex_pdflastximagepages:D
- \@@_primitive:NN \lastxpos \pdftex_lastxpos:D
- \@@_primitive:NN \lastypos \pdftex_lastypos:D
- \@@_primitive:NN \normaldeviate \pdftex_normaldeviate:D
- \@@_primitive:NN \outputmode \pdftex_pdfoutput:D
- \@@_primitive:NN \pageheight \pdftex_pageheight:D
- \@@_primitive:NN \pagewidth \pdftex_pagewith:D
- \@@_primitive:NN \protrudechars \pdftex_protrudechars:D
- \@@_primitive:NN \pxdimen \pdftex_pxdimen:D
- \@@_primitive:NN \randomseed \pdftex_randomseed:D
- \@@_primitive:NN \useboxresource \pdftex_pdfrefxform:D
- \@@_primitive:NN \useimageresource \pdftex_pdfrefximage:D
- \@@_primitive:NN \savepos \pdftex_savepos:D
- \@@_primitive:NN \saveboxresource \pdftex_pdfxform:D
- \@@_primitive:NN \saveimageresource \pdftex_pdfximage:D
- \@@_primitive:NN \setrandomseed \pdftex_setrandomseed:D
- \@@_primitive:NN \tracingfonts \pdftex_tracingfonts:D
- \@@_primitive:NN \uniformdeviate \pdftex_uniformdeviate:D
- \@@_primitive:NN \suppressfontnotfounderror
- \xetex_suppressfontnotfounderror:D
- \@@_primitive:NN \XeTeXcharclass \xetex_charclass:D
- \@@_primitive:NN \XeTeXcharglyph \xetex_charglyph:D
- \@@_primitive:NN \XeTeXcountfeatures \xetex_countfeatures:D
- \@@_primitive:NN \XeTeXcountglyphs \xetex_countglyphs:D
- \@@_primitive:NN \XeTeXcountselectors \xetex_countselectors:D
- \@@_primitive:NN \XeTeXcountvariations \xetex_countvariations:D
- \@@_primitive:NN \XeTeXdefaultencoding \xetex_defaultencoding:D
- \@@_primitive:NN \XeTeXdashbreakstate \xetex_dashbreakstate:D
- \@@_primitive:NN \XeTeXfeaturecode \xetex_featurecode:D
- \@@_primitive:NN \XeTeXfeaturename \xetex_featurename:D
- \@@_primitive:NN \XeTeXfindfeaturebyname
- \xetex_findfeaturebyname:D
- \@@_primitive:NN \XeTeXfindselectorbyname
- \xetex_findselectorbyname:D
- \@@_primitive:NN \XeTeXfindvariationbyname
- \xetex_findvariationbyname:D
- \@@_primitive:NN \XeTeXfirstfontchar \xetex_firstfontchar:D
- \@@_primitive:NN \XeTeXfonttype \xetex_fonttype:D
- \@@_primitive:NN \XeTeXgenerateactualtext
- \xetex_generateactualtext:D
- \@@_primitive:NN \XeTeXglyph \xetex_glyph:D
- \@@_primitive:NN \XeTeXglyphbounds \xetex_glyphbounds:D
- \@@_primitive:NN \XeTeXglyphindex \xetex_glyphindex:D
- \@@_primitive:NN \XeTeXglyphname \xetex_glyphname:D
- \@@_primitive:NN \XeTeXinputencoding \xetex_inputencoding:D
- \@@_primitive:NN \XeTeXinputnormalization
- \xetex_inputnormalization:D
- \@@_primitive:NN \XeTeXinterchartokenstate
- \xetex_interchartokenstate:D
- \@@_primitive:NN \XeTeXinterchartoks \xetex_interchartoks:D
- \@@_primitive:NN \XeTeXisdefaultselector
- \xetex_isdefaultselector:D
- \@@_primitive:NN \XeTeXisexclusivefeature
- \xetex_isexclusivefeature:D
- \@@_primitive:NN \XeTeXlastfontchar \xetex_lastfontchar:D
- \@@_primitive:NN \XeTeXlinebreakskip \xetex_linebreakskip:D
- \@@_primitive:NN \XeTeXlinebreaklocale \xetex_linebreaklocale:D
- \@@_primitive:NN \XeTeXlinebreakpenalty \xetex_linebreakpenalty:D
- \@@_primitive:NN \XeTeXOTcountfeatures \xetex_OTcountfeatures:D
- \@@_primitive:NN \XeTeXOTcountlanguages \xetex_OTcountlanguages:D
- \@@_primitive:NN \XeTeXOTcountscripts \xetex_OTcountscripts:D
- \@@_primitive:NN \XeTeXOTfeaturetag \xetex_OTfeaturetag:D
- \@@_primitive:NN \XeTeXOTlanguagetag \xetex_OTlanguagetag:D
- \@@_primitive:NN \XeTeXOTscripttag \xetex_OTscripttag:D
- \@@_primitive:NN \XeTeXpdffile \xetex_pdffile:D
- \@@_primitive:NN \XeTeXpdfpagecount \xetex_pdfpagecount:D
- \@@_primitive:NN \XeTeXpicfile \xetex_picfile:D
- \@@_primitive:NN \XeTeXselectorname \xetex_selectorname:D
- \@@_primitive:NN \XeTeXtracingfonts \xetex_tracingfonts:D
- \@@_primitive:NN \XeTeXupwardsmode \xetex_upwardsmode:D
- \@@_primitive:NN \XeTeXuseglyphmetrics \xetex_useglyphmetrics:D
- \@@_primitive:NN \XeTeXvariation \xetex_variation:D
- \@@_primitive:NN \XeTeXvariationdefault \xetex_variationdefault:D
- \@@_primitive:NN \XeTeXvariationmax \xetex_variationmax:D
- \@@_primitive:NN \XeTeXvariationmin \xetex_variationmin:D
- \@@_primitive:NN \XeTeXvariationname \xetex_variationname:D
- \@@_primitive:NN \XeTeXrevision \xetex_XeTeXrevision:D
- \@@_primitive:NN \XeTeXversion \xetex_XeTeXversion:D
- \@@_primitive:NN \alignmark \luatex_alignmark:D
- \@@_primitive:NN \aligntab \luatex_aligntab:D
- \@@_primitive:NN \attribute \luatex_attribute:D
- \@@_primitive:NN \attributedef \luatex_attributedef:D
- \@@_primitive:NN \automaticdiscretionary
- \luatex_automaticdiscretionary:D
- \@@_primitive:NN \automatichyphenmode
- \luatex_automatichyphenmode:D
- \@@_primitive:NN \automatichyphenpenalty
- \luatex_automatichyphenpenalty:D
- \@@_primitive:NN \begincsname \luatex_begincsname:D
- \@@_primitive:NN \breakafterdirmode \luatex_breakafterdirmode:D
- \@@_primitive:NN \catcodetable \luatex_catcodetable:D
- \@@_primitive:NN \clearmarks \luatex_clearmarks:D
- \@@_primitive:NN \crampeddisplaystyle
- \luatex_crampeddisplaystyle:D
- \@@_primitive:NN \crampedscriptscriptstyle
- \luatex_crampedscriptscriptstyle:D
- \@@_primitive:NN \crampedscriptstyle \luatex_crampedscriptstyle:D
- \@@_primitive:NN \crampedtextstyle \luatex_crampedtextstyle:D
- \@@_primitive:NN \directlua \luatex_directlua:D
- \@@_primitive:NN \dviextension \luatex_dviextension:D
- \@@_primitive:NN \dvifeedback \luatex_dvifeedback:D
- \@@_primitive:NN \dvivariable \luatex_dvivariable:D
- \@@_primitive:NN \etoksapp \luatex_etoksapp:D
- \@@_primitive:NN \etokspre \luatex_etokspre:D
- \@@_primitive:NN \explicithyphenpenalty
- \luatex_explicithyphenpenalty:D
- \@@_primitive:NN \expanded \luatex_expanded:D
- \@@_primitive:NN \explicitdiscretionary
- \luatex_explicitdiscretionary:D
- \@@_primitive:NN \firstvalidlanguage \luatex_firstvalidlanguage:D
- \@@_primitive:NN \fontid \luatex_fontid:D
- \@@_primitive:NN \formatname \luatex_formatname:D
- \@@_primitive:NN \hjcode \luatex_hjcode:D
- \@@_primitive:NN \hpack \luatex_hpack:D
- \@@_primitive:NN \hyphenationbounds \luatex_hyphenationbounds:D
- \@@_primitive:NN \hyphenationmin \luatex_hyphenationmin:D
- \@@_primitive:NN \hyphenpenaltymode \luatex_hyphenpenaltymode:D
- \@@_primitive:NN \gleaders \luatex_gleaders:D
- \@@_primitive:NN \initcatcodetable \luatex_initcatcodetable:D
- \@@_primitive:NN \lastnamedcs \luatex_lastnamedcs:D
- \@@_primitive:NN \latelua \luatex_latelua:D
- \@@_primitive:NN \letcharcode \luatex_letcharcode:D
- \@@_primitive:NN \luaescapestring \luatex_luaescapestring:D
- \@@_primitive:NN \luafunction \luatex_luafunction:D
- \@@_primitive:NN \luatexbanner \luatex_luatexbanner:D
- \@@_primitive:NN \luatexrevision \luatex_luatexrevision:D
- \@@_primitive:NN \luatexversion \luatex_luatexversion:D
- \@@_primitive:NN \mathdelimitersmode \luatex_mathdelimitersmode:D
- \@@_primitive:NN \mathdisplayskipmode
- \luatex_mathdisplayskipmode:D
- \@@_primitive:NN \matheqnogapstep \luatex_matheqnogapstep:D
- \@@_primitive:NN \mathnolimitsmode \luatex_mathnolimitsmode:D
- \@@_primitive:NN \mathoption \luatex_mathoption:D
- \@@_primitive:NN \mathpenaltiesmode \luatex_mathpenaltiesmode:D
- \@@_primitive:NN \mathrulesfam \luatex_mathrulesfam:D
- \@@_primitive:NN \mathscriptsmode \luatex_mathscriptsmode:D
- \@@_primitive:NN \mathscriptboxmode \luatex_mathscriptboxmode:D
- \@@_primitive:NN \mathstyle \luatex_mathstyle:D
- \@@_primitive:NN \mathsurroundmode \luatex_mathsurroundmode:D
- \@@_primitive:NN \mathsurroundskip \luatex_mathsurroundskip:D
- \@@_primitive:NN \nohrule \luatex_nohrule:D
- \@@_primitive:NN \nokerns \luatex_nokerns:D
- \@@_primitive:NN \noligs \luatex_noligs:D
- \@@_primitive:NN \nospaces \luatex_nospaces:D
- \@@_primitive:NN \novrule \luatex_novrule:D
- \@@_primitive:NN \outputbox \luatex_outputbox:D
- \@@_primitive:NN \pagebottomoffset \luatex_pagebottomoffset:D
- \@@_primitive:NN \pageleftoffset \luatex_pageleftoffset:D
- \@@_primitive:NN \pagerightoffset \luatex_pagerightoffset:D
- \@@_primitive:NN \pagetopoffset \luatex_pagetopoffset:D
- \@@_primitive:NN \pdfextension \luatex_pdfextension:D
- \@@_primitive:NN \pdffeedback \luatex_pdffeedback:D
- \@@_primitive:NN \pdfvariable \luatex_pdfvariable:D
- \@@_primitive:NN \postexhyphenchar \luatex_postexhyphenchar:D
- \@@_primitive:NN \posthyphenchar \luatex_posthyphenchar:D
- \@@_primitive:NN \prebinoppenalty \luatex_prebinoppenalty:D
- \@@_primitive:NN \predisplaygapfactor
- \luatex_predisplaygapfactor:D
- \@@_primitive:NN \preexhyphenchar \luatex_preexhyphenchar:D
- \@@_primitive:NN \prehyphenchar \luatex_prehyphenchar:D
- \@@_primitive:NN \prerelpenalty \luatex_prerelpenalty:D
- \@@_primitive:NN \savecatcodetable \luatex_savecatcodetable:D
- \@@_primitive:NN \scantextokens \luatex_scantextokens:D
- \@@_primitive:NN \setfontid \luatex_setfontid:D
- \@@_primitive:NN \shapemode \luatex_shapemode:D
- \@@_primitive:NN \suppressifcsnameerror
- \luatex_suppressifcsnameerror:D
- \@@_primitive:NN \suppresslongerror \luatex_suppresslongerror:D
- \@@_primitive:NN \suppressmathparerror
- \luatex_suppressmathparerror:D
- \@@_primitive:NN \suppressoutererror \luatex_suppressoutererror:D
- \@@_primitive:NN \suppressprimitiveerror
- \luatex_suppressprimitiveerror:D
- \@@_primitive:NN \toksapp \luatex_toksapp:D
- \@@_primitive:NN \tokspre \luatex_tokspre:D
- \@@_primitive:NN \tpack \luatex_tpack:D
- \@@_primitive:NN \vpack \luatex_vpack:D
- \@@_primitive:NN \bodydir \luatex_bodydir:D
- \@@_primitive:NN \boxdir \luatex_boxdir:D
- \@@_primitive:NN \leftghost \luatex_leftghost:D
- \@@_primitive:NN \linedir \luatex_linedir:D
- \@@_primitive:NN \localbrokenpenalty \luatex_localbrokenpenalty:D
- \@@_primitive:NN \localinterlinepenalty
- \luatex_localinterlinepenalty:D
- \@@_primitive:NN \localleftbox \luatex_localleftbox:D
- \@@_primitive:NN \localrightbox \luatex_localrightbox:D
- \@@_primitive:NN \mathdir \luatex_mathdir:D
- \@@_primitive:NN \pagedir \luatex_pagedir:D
- \@@_primitive:NN \pardir \luatex_pardir:D
- \@@_primitive:NN \rightghost \luatex_rightghost:D
- \@@_primitive:NN \textdir \luatex_textdir:D
- \@@_primitive:NN \Uchar \utex_char:D
- \@@_primitive:NN \Ucharcat \utex_charcat:D
- \@@_primitive:NN \Udelcode \utex_delcode:D
- \@@_primitive:NN \Udelcodenum \utex_delcodenum:D
- \@@_primitive:NN \Udelimiter \utex_delimiter:D
- \@@_primitive:NN \Udelimiterover \utex_delimiterover:D
- \@@_primitive:NN \Udelimiterunder \utex_delimiterunder:D
- \@@_primitive:NN \Uhextensible \utex_hextensible:D
- \@@_primitive:NN \Umathaccent \utex_mathaccent:D
- \@@_primitive:NN \Umathaxis \utex_mathaxis:D
- \@@_primitive:NN \Umathbinbinspacing \utex_binbinspacing:D
- \@@_primitive:NN \Umathbinclosespacing \utex_binclosespacing:D
- \@@_primitive:NN \Umathbininnerspacing \utex_bininnerspacing:D
- \@@_primitive:NN \Umathbinopenspacing \utex_binopenspacing:D
- \@@_primitive:NN \Umathbinopspacing \utex_binopspacing:D
- \@@_primitive:NN \Umathbinordspacing \utex_binordspacing:D
- \@@_primitive:NN \Umathbinpunctspacing \utex_binpunctspacing:D
- \@@_primitive:NN \Umathbinrelspacing \utex_binrelspacing:D
- \@@_primitive:NN \Umathchar \utex_mathchar:D
- \@@_primitive:NN \Umathcharclass \utex_mathcharclass:D
- \@@_primitive:NN \Umathchardef \utex_mathchardef:D
- \@@_primitive:NN \Umathcharfam \utex_mathcharfam:D
- \@@_primitive:NN \Umathcharnum \utex_mathcharnum:D
- \@@_primitive:NN \Umathcharnumdef \utex_mathcharnumdef:D
- \@@_primitive:NN \Umathcharslot \utex_mathcharslot:D
- \@@_primitive:NN \Umathclosebinspacing \utex_closebinspacing:D
- \@@_primitive:NN \Umathcloseclosespacing
- \utex_closeclosespacing:D
- \@@_primitive:NN \Umathcloseinnerspacing
- \utex_closeinnerspacing:D
- \@@_primitive:NN \Umathcloseopenspacing \utex_closeopenspacing:D
- \@@_primitive:NN \Umathcloseopspacing \utex_closeopspacing:D
- \@@_primitive:NN \Umathcloseordspacing \utex_closeordspacing:D
- \@@_primitive:NN \Umathclosepunctspacing
- \utex_closepunctspacing:D
- \@@_primitive:NN \Umathcloserelspacing \utex_closerelspacing:D
- \@@_primitive:NN \Umathcode \utex_mathcode:D
- \@@_primitive:NN \Umathcodenum \utex_mathcodenum:D
- \@@_primitive:NN \Umathconnectoroverlapmin
- \utex_connectoroverlapmin:D
- \@@_primitive:NN \Umathfractiondelsize \utex_fractiondelsize:D
- \@@_primitive:NN \Umathfractiondenomdown
- \utex_fractiondenomdown:D
- \@@_primitive:NN \Umathfractiondenomvgap
- \utex_fractiondenomvgap:D
- \@@_primitive:NN \Umathfractionnumup \utex_fractionnumup:D
- \@@_primitive:NN \Umathfractionnumvgap \utex_fractionnumvgap:D
- \@@_primitive:NN \Umathfractionrule \utex_fractionrule:D
- \@@_primitive:NN \Umathinnerbinspacing \utex_innerbinspacing:D
- \@@_primitive:NN \Umathinnerclosespacing
- \utex_innerclosespacing:D
- \@@_primitive:NN \Umathinnerinnerspacing
- \utex_innerinnerspacing:D
- \@@_primitive:NN \Umathinneropenspacing \utex_inneropenspacing:D
- \@@_primitive:NN \Umathinneropspacing \utex_inneropspacing:D
- \@@_primitive:NN \Umathinnerordspacing \utex_innerordspacing:D
- \@@_primitive:NN \Umathinnerpunctspacing
- \utex_innerpunctspacing:D
- \@@_primitive:NN \Umathinnerrelspacing \utex_innerrelspacing:D
- \@@_primitive:NN \Umathlimitabovebgap \utex_limitabovebgap:D
- \@@_primitive:NN \Umathlimitabovekern \utex_limitabovekern:D
- \@@_primitive:NN \Umathlimitabovevgap \utex_limitabovevgap:D
- \@@_primitive:NN \Umathlimitbelowbgap \utex_limitbelowbgap:D
- \@@_primitive:NN \Umathlimitbelowkern \utex_limitbelowkern:D
- \@@_primitive:NN \Umathlimitbelowvgap \utex_limitbelowvgap:D
- \@@_primitive:NN \Umathnolimitsubfactor \utex_nolimitsubfactor:D
- \@@_primitive:NN \Umathnolimitsupfactor \utex_nolimitsupfactor:D
- \@@_primitive:NN \Umathopbinspacing \utex_opbinspacing:D
- \@@_primitive:NN \Umathopclosespacing \utex_opclosespacing:D
- \@@_primitive:NN \Umathopenbinspacing \utex_openbinspacing:D
- \@@_primitive:NN \Umathopenclosespacing \utex_openclosespacing:D
- \@@_primitive:NN \Umathopeninnerspacing \utex_openinnerspacing:D
- \@@_primitive:NN \Umathopenopenspacing \utex_openopenspacing:D
- \@@_primitive:NN \Umathopenopspacing \utex_openopspacing:D
- \@@_primitive:NN \Umathopenordspacing \utex_openordspacing:D
- \@@_primitive:NN \Umathopenpunctspacing \utex_openpunctspacing:D
- \@@_primitive:NN \Umathopenrelspacing \utex_openrelspacing:D
- \@@_primitive:NN \Umathoperatorsize \utex_operatorsize:D
- \@@_primitive:NN \Umathopinnerspacing \utex_opinnerspacing:D
- \@@_primitive:NN \Umathopopenspacing \utex_opopenspacing:D
- \@@_primitive:NN \Umathopopspacing \utex_opopspacing:D
- \@@_primitive:NN \Umathopordspacing \utex_opordspacing:D
- \@@_primitive:NN \Umathoppunctspacing \utex_oppunctspacing:D
- \@@_primitive:NN \Umathoprelspacing \utex_oprelspacing:D
- \@@_primitive:NN \Umathordbinspacing \utex_ordbinspacing:D
- \@@_primitive:NN \Umathordclosespacing \utex_ordclosespacing:D
- \@@_primitive:NN \Umathordinnerspacing \utex_ordinnerspacing:D
- \@@_primitive:NN \Umathordopenspacing \utex_ordopenspacing:D
- \@@_primitive:NN \Umathordopspacing \utex_ordopspacing:D
- \@@_primitive:NN \Umathordordspacing \utex_ordordspacing:D
- \@@_primitive:NN \Umathordpunctspacing \utex_ordpunctspacing:D
- \@@_primitive:NN \Umathordrelspacing \utex_ordrelspacing:D
- \@@_primitive:NN \Umathoverbarkern \utex_overbarkern:D
- \@@_primitive:NN \Umathoverbarrule \utex_overbarrule:D
- \@@_primitive:NN \Umathoverbarvgap \utex_overbarvgap:D
- \@@_primitive:NN \Umathoverdelimiterbgap
- \utex_overdelimiterbgap:D
- \@@_primitive:NN \Umathoverdelimitervgap
- \utex_overdelimitervgap:D
- \@@_primitive:NN \Umathpunctbinspacing \utex_punctbinspacing:D
- \@@_primitive:NN \Umathpunctclosespacing
- \utex_punctclosespacing:D
- \@@_primitive:NN \Umathpunctinnerspacing
- \utex_punctinnerspacing:D
- \@@_primitive:NN \Umathpunctopenspacing \utex_punctopenspacing:D
- \@@_primitive:NN \Umathpunctopspacing \utex_punctopspacing:D
- \@@_primitive:NN \Umathpunctordspacing \utex_punctordspacing:D
- \@@_primitive:NN \Umathpunctpunctspacing\utex_punctpunctspacing:D
- \@@_primitive:NN \Umathpunctrelspacing \utex_punctrelspacing:D
- \@@_primitive:NN \Umathquad \utex_quad:D
- \@@_primitive:NN \Umathradicaldegreeafter
- \utex_radicaldegreeafter:D
- \@@_primitive:NN \Umathradicaldegreebefore
- \utex_radicaldegreebefore:D
- \@@_primitive:NN \Umathradicaldegreeraise
- \utex_radicaldegreeraise:D
- \@@_primitive:NN \Umathradicalkern \utex_radicalkern:D
- \@@_primitive:NN \Umathradicalrule \utex_radicalrule:D
- \@@_primitive:NN \Umathradicalvgap \utex_radicalvgap:D
- \@@_primitive:NN \Umathrelbinspacing \utex_relbinspacing:D
- \@@_primitive:NN \Umathrelclosespacing \utex_relclosespacing:D
- \@@_primitive:NN \Umathrelinnerspacing \utex_relinnerspacing:D
- \@@_primitive:NN \Umathrelopenspacing \utex_relopenspacing:D
- \@@_primitive:NN \Umathrelopspacing \utex_relopspacing:D
- \@@_primitive:NN \Umathrelordspacing \utex_relordspacing:D
- \@@_primitive:NN \Umathrelpunctspacing \utex_relpunctspacing:D
- \@@_primitive:NN \Umathrelrelspacing \utex_relrelspacing:D
- \@@_primitive:NN \Umathskewedfractionhgap
- \utex_skewedfractionhgap:D
- \@@_primitive:NN \Umathskewedfractionvgap
- \utex_skewedfractionvgap:D
- \@@_primitive:NN \Umathspaceafterscript \utex_spaceafterscript:D
- \@@_primitive:NN \Umathstackdenomdown \utex_stackdenomdown:D
- \@@_primitive:NN \Umathstacknumup \utex_stacknumup:D
- \@@_primitive:NN \Umathstackvgap \utex_stackvgap:D
- \@@_primitive:NN \Umathsubshiftdown \utex_subshiftdown:D
- \@@_primitive:NN \Umathsubshiftdrop \utex_subshiftdrop:D
- \@@_primitive:NN \Umathsubsupshiftdown \utex_subsupshiftdown:D
- \@@_primitive:NN \Umathsubsupvgap \utex_subsupvgap:D
- \@@_primitive:NN \Umathsubtopmax \utex_subtopmax:D
- \@@_primitive:NN \Umathsupbottommin \utex_supbottommin:D
- \@@_primitive:NN \Umathsupshiftdrop \utex_supshiftdrop:D
- \@@_primitive:NN \Umathsupshiftup \utex_supshiftup:D
- \@@_primitive:NN \Umathsupsubbottommax \utex_supsubbottommax:D
- \@@_primitive:NN \Umathunderbarkern \utex_underbarkern:D
- \@@_primitive:NN \Umathunderbarrule \utex_underbarrule:D
- \@@_primitive:NN \Umathunderbarvgap \utex_underbarvgap:D
- \@@_primitive:NN \Umathunderdelimiterbgap
- \utex_underdelimiterbgap:D
- \@@_primitive:NN \Umathunderdelimitervgap
- \utex_underdelimitervgap:D
- \@@_primitive:NN \Unosubscript \utex_nosubscript:D
- \@@_primitive:NN \Unosuperscript \utex_nosuperscript:D
- \@@_primitive:NN \Uoverdelimiter \utex_overdelimiter:D
- \@@_primitive:NN \Uradical \utex_radical:D
- \@@_primitive:NN \Uroot \utex_root:D
- \@@_primitive:NN \Uskewed \utex_skewed:D
- \@@_primitive:NN \Uskewedwithdelims \utex_skewedwithdelims:D
- \@@_primitive:NN \Ustack \utex_stack:D
- \@@_primitive:NN \Ustartdisplaymath \utex_startdisplaymath:D
- \@@_primitive:NN \Ustartmath \utex_startmath:D
- \@@_primitive:NN \Ustopdisplaymath \utex_stopdisplaymath:D
- \@@_primitive:NN \Ustopmath \utex_stopmath:D
- \@@_primitive:NN \Usubscript \utex_subscript:D
- \@@_primitive:NN \Usuperscript \utex_superscript:D
- \@@_primitive:NN \Uunderdelimiter \utex_underdelimiter:D
- \@@_primitive:NN \Uvextensible \utex_vextensible:D
- \@@_primitive:NN \autospacing \ptex_autospacing:D
- \@@_primitive:NN \autoxspacing \ptex_autoxspacing:D
- \@@_primitive:NN \dtou \ptex_dtou:D
- \@@_primitive:NN \epTeXinputencoding \ptex_inputencoding:D
- \@@_primitive:NN \epTeXversion \ptex_epTeXversion:D
- \@@_primitive:NN \euc \ptex_euc:D
- \@@_primitive:NN \ifdbox \ptex_ifdbox:D
- \@@_primitive:NN \ifddir \ptex_ifddir:D
- \@@_primitive:NN \ifmdir \ptex_ifmdir:D
- \@@_primitive:NN \iftbox \ptex_iftbox:D
- \@@_primitive:NN \iftdir \ptex_iftdir:D
- \@@_primitive:NN \ifybox \ptex_ifybox:D
- \@@_primitive:NN \ifydir \ptex_ifydir:D
- \@@_primitive:NN \inhibitglue \ptex_inhibitglue:D
- \@@_primitive:NN \inhibitxspcode \ptex_inhibitxspcode:D
- \@@_primitive:NN \jcharwidowpenalty \ptex_jcharwidowpenalty:D
- \@@_primitive:NN \jfam \ptex_jfam:D
- \@@_primitive:NN \jfont \ptex_jfont:D
- \@@_primitive:NN \jis \ptex_jis:D
- \@@_primitive:NN \kanjiskip \ptex_kanjiskip:D
- \@@_primitive:NN \kansuji \ptex_kansuji:D
- \@@_primitive:NN \kansujichar \ptex_kansujichar:D
- \@@_primitive:NN \kcatcode \ptex_kcatcode:D
- \@@_primitive:NN \kuten \ptex_kuten:D
- \@@_primitive:NN \noautospacing \ptex_noautospacing:D
- \@@_primitive:NN \noautoxspacing \ptex_noautoxspacing:D
- \@@_primitive:NN \postbreakpenalty \ptex_postbreakpenalty:D
- \@@_primitive:NN \prebreakpenalty \ptex_prebreakpenalty:D
- \@@_primitive:NN \ptexminorversion \ptex_ptexminorversion:D
- \@@_primitive:NN \ptexrevision \ptex_ptexrevision:D
- \@@_primitive:NN \ptexversion \ptex_ptexversion:D
- \@@_primitive:NN \showmode \ptex_showmode:D
- \@@_primitive:NN \sjis \ptex_sjis:D
- \@@_primitive:NN \tate \ptex_tate:D
- \@@_primitive:NN \tbaselineshift \ptex_tbaselineshift:D
- \@@_primitive:NN \tfont \ptex_tfont:D
- \@@_primitive:NN \xkanjiskip \ptex_xkanjiskip:D
- \@@_primitive:NN \xspcode \ptex_xspcode:D
- \@@_primitive:NN \ybaselineshift \ptex_ybaselineshift:D
- \@@_primitive:NN \yoko \ptex_yoko:D
- \@@_primitive:NN \disablecjktoken \uptex_disablecjktoken:D
- \@@_primitive:NN \enablecjktoken \uptex_enablecjktoken:D
- \@@_primitive:NN \forcecjktoken \uptex_forcecjktoken:D
- \@@_primitive:NN \kchar \uptex_kchar:D
- \@@_primitive:NN \kchardef \uptex_kchardef:D
- \@@_primitive:NN \kuten \uptex_kuten:D
- \@@_primitive:NN \ucs \uptex_ucs:D
- \@@_primitive:NN \uptexrevision \uptex_uptexrevision:D
- \@@_primitive:NN \uptexversion \uptex_uptexversion:D
- }
- }
- \@@_primitives:
-\tex_endgroup:D
-%</package>
+local minus_tok = token.new(string.byte'-', 12)
+local zero_tok = token.new(string.byte'0', 12)
+local one_tok = token.new(string.byte'1', 12)
+luacmd('tex_strcmp:D', function()
+ local first = scan_string()
+ local second = scan_string()
+ if first < second then
+ put_next(minus_tok, one_tok)
+ else
+ put_next(first == second and zero_tok or one_tok)
+ end
+end, 'global')
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tex_Ucharcat:D}
+% Creating arbitrary chars using |tex.cprint|.
+% The alternative approach using |token.put_next(token.create(...))|
+% would be about 10\% slower.
+% \begin{macrocode}
+local cprint = tex.cprint
+luacmd('tex_Ucharcat:D', function()
+ local charcode = scan_int()
+ local catcode = scan_int()
+ cprint(catcode, utf8_char(charcode))
+end, 'global')
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tex_filesize:D}
+% Wrap the function from |ltxutils|.
+% \begin{macrocode}
+luacmd('tex_filesize:D', function()
+ local size = filesize(scan_string())
+ if size then write(size) end
+end, 'global')
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\tex_mdfivesum:D}
+% There are two cases: Either hash a file or a string.
+% Both are already implemented in l3luatex or built-in.
% \begin{macrocode}
-%</initex|package>
+luacmd('tex_mdfivesum:D', function()
+ local hash
+ if scan_keyword"file" then
+ hash = filemd5sum(scan_string())
+ else
+ hash = md5_HEX(scan_string())
+ end
+ if hash then write(hash) end
+end, 'global')
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tex_filemoddate:D}
+% A primitive for getting the modification date of a file.
+% \begin{macrocode}
+luacmd('tex_filemoddate:D', function()
+ local date = filemoddate(scan_string())
+ if date then write(date) end
+end, 'global')
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tex_filedump:D}
+% An emulated primitive for getting a hexdump from a (partial) file.
+% The length has a default of |0|. This is consistent with
+% \pdfTeX, but it effectivly makes the primitive useless without an
+% explicit |length|. Therefore we allow the keyword |whole| to be used
+% instead of a length, indicating that the whole remaining file should
+% be read.
+% \begin{macrocode}
+luacmd('tex_filedump:D', function()
+ local offset = scan_keyword'offset' and scan_int() or nil
+ local length = scan_keyword'length' and scan_int()
+ or not scan_keyword'whole' and 0 or nil
+ local data = filedump(scan_string(), offset, length)
+ if data then write(data) end
+end, 'global')
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</lua>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx b/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
index dc36f172faa..58f99438acc 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3pdf/l3pdf.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
@@ -2,7 +2,7 @@
%
%% File: l3pdf.dtx
%
-% Copyright(C) 2019,2020 The LaTeX3 Project
+% Copyright(C) 2019-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -11,7 +11,7 @@
%
% http://www.latex-project.org/lppl.txt
%
-% This file is part of the "l3experimental bundle" (The Work in LPPL)
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
% and all files in that bundle must be distributed together.
%
% -----------------------------------------------------------------------
@@ -22,9 +22,6 @@
%
% for those people who are interested.
%
-%<*driver|package>
-\RequirePackage{expl3}
-%</driver|package>
%<*driver>
\documentclass[full]{l3doc}
\begin{document}
@@ -38,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -46,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-01-12}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -56,7 +53,7 @@
%
% \subsection{Objects}
%
-% \begin{function}[added = 2019-06-02]{\pdf_object_new:nn}
+% \begin{function}[added = 2021-02-10]{\pdf_object_new:nn}
% \begin{syntax}
% \cs{pdf_object_new:nn} \Arg{object} \Arg{type}
% \end{syntax}
@@ -71,8 +68,14 @@
% The object may be referenced from this point on, and written later
% using \cs{pdf_object_write:nn}.
% \end{function}
-%
-% \begin{function}[added = 2019-06-02]
+% \begin{function}[EXP, pTF, added=2020-05-15]{\pdf_object_if_exist:n}
+% \begin{syntax}
+% \cs{pdf_object_if_exist_p:n} \Arg{object}
+% \cs{pdf_object_if_exist:nTF} \Arg{object}
+% \end{syntax}
+% Tests whether an object with name \Arg{object} has been defined.
+% \end{function}
+% \begin{function}[added = 2021-02-10]
% {\pdf_object_write:nn, \pdf_object_write:nx}
% \begin{syntax}
% \cs{pdf_object_write:nn} \Arg{object} \Arg{content}
@@ -91,7 +94,7 @@
% \end{itemize}
% \end{function}
%
-% \begin{function}[EXP, added = 2019-06-02]{\pdf_object_ref:n}
+% \begin{function}[EXP, added = 2021-02-10]{\pdf_object_ref:n}
% \begin{syntax}
% \cs{pdf_object_ref:n} \Arg{object}
% \end{syntax}
@@ -99,10 +102,10 @@
% in for example page resource allocation
% \end{function}
%
-% \begin{function}[added = 2019-06-02]
-% {\pdf_object_now:nn, \pdf_object_now:nx}
+% \begin{function}[added = 2021-02-10]
+% {\pdf_object_unnamed_write:nn, \pdf_object_unnamed_write:nx}
% \begin{syntax}
-% \cs{pdf_object_now:nn} \Arg{type} \Arg{content}
+% \cs{pdf_object_unnamed_write:nn} \Arg{type} \Arg{content}
% \end{syntax}
% Writes the \meta{content} as content of an anonymous object. Depending on the
% \meta{type}, the format required for the \meta{data} will vary
@@ -117,17 +120,24 @@
% \end{itemize}
% \end{function}
%
-% \begin{function}[EXP, added = 2019-06-02]{\pdf_object_last:}
+% \begin{function}[EXP, added = 2021-02-10]{\pdf_object_ref_last:}
% \begin{syntax}
-% \cs{pdf_object_last:}
+% \cs{pdf_object_ref_last:}
% \end{syntax}
% Inserts the appropriate information to reference the last \meta{object}
% created. This is particularly useful for anonymous objects.
% \end{function}
%
+% \begin{function}[EXP, added = 2021-02-10]{\pdf_pageobject_ref:n}
+% \begin{syntax}
+% \cs{pdf_pagobject_ref:n} \Arg{pageobject}
+% \end{syntax}
+% Inserts the appropriate information to reference the \meta{pageobject}.
+% \end{function}
+%
% \subsection{Version}
%
-% \begin{function}[pTF, EXP, added = 2019-06-02]{\pdf_version_compare:Nn}
+% \begin{function}[pTF, EXP, added = 2021-02-10]{\pdf_version_compare:Nn}
% \begin{syntax}
% \cs{pdf_version_compare:NnTF} \meta{comparator} \Arg{version} \Arg{true code} \Arg{false code}
% \end{syntax}
@@ -136,7 +146,7 @@
% or \meta{false code} will be left in the output stream.
% \end{function}
%
-% \begin{function}[added = 2019-06-02]
+% \begin{function}[added = 2021-02-10]
% {\pdf_version_gset:n, \pdf_version_min_gset:n}
% \begin{syntax}
% \cs{pdf_version_gset:n} \Arg{version}
@@ -149,7 +159,7 @@
% initialised.
% \end{function}
%
-% \begin{function}[EXP, added = 2019-06-02]
+% \begin{function}[EXP, added = 2021-02-10]
% {\pdf_version:, \pdf_version_major:, \pdf_version_minor:}
% \begin{syntax}
% \cs{pdf_version:}
@@ -159,7 +169,7 @@
%
% \subsection{Compression}
%
-% \begin{function}[added = 2019-06-02]{\pdf_uncompress:}
+% \begin{function}[added = 2021-02-10]{\pdf_uncompress:}
% \begin{syntax}
% \cs{pdf_uncompress:}
% \end{syntax}
@@ -169,6 +179,74 @@
% initialised.
% \end{function}
%
+% \subsection{Destinations}
+%
+% Destinations are the places a link jumped too.
+% Unlike the name may suggest they don't described
+% an exact location in the PDF. Instead a destination contains a reference to
+% a page along with an instruction how to display this page.
+% The normally used \enquote{XYZ \textit{top left zoom}} for example instructs
+% the viewer to show the page with the given \textit{zoom} and
+% the top left corner at the \textit{top left} coordinates---which then gives
+% the impression that there is an anchor at this position.
+%
+% If an instruction takes a coordinate, it is calculated by the following
+% commands relative to the location the command is issued.
+% So to get a specific coordinate one has to move the command to the right place.
+%
+% \begin{function}[added = 2021-01-03]
+% {\pdf_destination:nn}
+% \begin{syntax}
+% \cs{pdf_destination:nn} \Arg{name} \Arg{type or integer}
+% \end{syntax}
+% This creates a destination. \Arg{type or integer} can be one of |fit|, |fith|,
+% |fitv|, |fitb|, |fitbh|, |fitbv|, |fitr|, |xyz|
+% or an integer representing a scale factor in percent.
+% |fitr| here gives only a lightweight version of |/FitR|:
+% The backend code defines |fitr| so that it will with pdf\LaTeX{} and
+% Lua\LaTeX{} use the coordinates of the surrounding box,
+% with \texttt{dvips} and \texttt{dvipdfmx} it falls back to |fit|.
+% For full control use \cs{pdf_destination:nnnn}.
+%
+% The keywords match to the PDF names as described in the following tabular.
+%
+% \medskip
+% \noindent\begin{tabular}{ll>{\raggedright\arraybackslash}p{6cm}}
+% \toprule
+% Keyword & PDF & Remarks \\ \midrule
+% |fit| & |/Fit|
+% & Fits the page to the window\\
+% |fith| & |/FitH| \textit{top}
+% & Fits the width of the page to the window \\
+% |fitv| & |/FitV| \textit{left}
+% & Fits the height of the page to the window \\
+% |fitb| & |/FitB|
+% & Fits the page bounding box to the window \\
+% |fitbh|& |/FitBH| \textit{top}
+% & Fits the width of the page bounding box to the window. \\
+% |fitbv|& |/FitBV| \textit{left}
+% & Fits the height of the page bounding box to the window. \\
+% |fitr| & |/FitR| \textit{left bottom right top}
+% & Fits the rectangle specified by the four coordinates to the window
+% (see above for the restrictions)\\
+% |xyz| & |/XYZ| \textit{left top} null
+% & Sets a coordinate but doesn't change the zoom.\\
+% \Arg{integer} & |/XYZ| \textit{left top zoom}
+% & Sets a coordinate and a zoom meaning \Arg{integer}\%.
+% \\\bottomrule
+% \end{tabular}
+%
+% \end{function}
+%
+% \begin{function}[added = 2021-01-17]
+% {\pdf_destination:nnnn}
+% \begin{syntax}
+% \cs{pdf_destination:nnnn} \Arg{name} \Arg{width} \Arg{height} \Arg{depth}
+% \end{syntax}
+% This creates a destination with |/FitR| type with the given dimensions relative
+% to the current location. The destination is in a box of size zero, but it doesn't
+% switch to horizontal mode.
+% \end{function}
% \end{documentation}
%
% \begin{implementation}
@@ -176,32 +254,36 @@
% \section{\pkg{l3pdf} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
%<@@=pdf>
% \end{macrocode}
%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage{l3pdf}{2020-01-12}{}
- {L3 Experimental core PDF support}
-%</package>
+\scan_new:N \s_@@_stop
% \end{macrocode}
+% \end{variable}
%
% \begin{variable}{\g_@@_init_bool}
% A flag so we have some chance of avoiding setting things we are not
-% allowed to.
+% allowed to. As we are potentially early in the format, we have to work
+% a bit harder than ideal.
% \begin{macrocode}
\bool_new:N \g_@@_init_bool
-%<*package>
-\cs_if_exist:NT \documentclass
+\bool_lazy_and:nnT
+ { \str_if_eq_p:Vn \fmtname { LaTeX2e } }
+ { \tl_if_exist_p:N \@expl@finalise@setup@@@@ }
{
- \AtBeginDocument
- { \bool_gset_true:N \g_@@_init_bool }
+ \tl_gput_right:Nn \@expl@finalise@setup@@@@
+ {
+ \tl_gput_right:Nn \@kernel@after@begindocument
+ { \bool_gset_true:N \g_@@_init_bool }
+ }
}
-%</package>
% \end{macrocode}
% \end{variable}
%
@@ -224,26 +306,47 @@
% \subsection{Objects}
%
% \begin{macro}{\pdf_object_new:nn, \pdf_object_write:nn, \pdf_object_write:nx}
+% \begin{macro}[pTF]{\pdf_object_if_exist:n}
% \begin{macro}{\pdf_object_ref:n}
-% \begin{macro}{\pdf_object_now:nn, \pdf_object_now:nx}
-% \begin{macro}{\pdf_object_last:}
+% \begin{macro}{\pdf_object_unnamed_write:nn, \pdf_object_unnamed_write:nx}
+% \begin{macro}{\pdf_object_ref_last:}
% Simple to do.
% \begin{macrocode}
\cs_new_protected:Npn \pdf_object_new:nn #1#2
{ \@@_backend_object_new:nn {#1} {#2} }
+\prg_new_conditional:Npnn \pdf_object_if_exist:n #1 { p , T , F , TF }
+ {
+ \int_if_exist:cTF { c_@@_backend_object_ \tl_to_str:n {#1} _int }
+ { \prg_return_true: }
+ { \prg_return_false:}
+ }
\cs_new_protected:Npn \pdf_object_write:nn #1#2
- { \@@_backend_object_write:nn {#1} {#2} }
+ {
+ \@@_backend_object_write:nn {#1} {#2}
+ \bool_gset_true:N \g_@@_init_bool
+ }
\cs_generate_variant:Nn \pdf_object_write:nn { nx }
\cs_new:Npn \pdf_object_ref:n #1 { \@@_backend_object_ref:n {#1} }
-\cs_new_protected:Npn \pdf_object_now:nn #1#2
- { \@@_backend_object_now:nn {#1} {#2} }
-\cs_generate_variant:Nn \pdf_object_now:nn { nx }
-\cs_new:Npn \pdf_object_last: { \@@_backend_object_last: }
+\cs_new_protected:Npn \pdf_object_unnamed_write:nn #1#2
+ {
+ \@@_backend_object_now:nn {#1} {#2}
+ \bool_gset_true:N \g_@@_init_bool
+ }
+\cs_generate_variant:Nn \pdf_object_unnamed_write:nn { nx }
+\cs_new:Npn \pdf_object_ref_last: { \@@_backend_object_last: }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\pdf_pageobject_ref:n}
+% \begin{macrocode}
+\cs_new:Npn \pdf_pageobject_ref:n #1
+ { \@@_backend_pageobject_ref:n {#1} }
+% \end{macrocode}
+% \end{macro}
%
% \subsection{Version}
%
@@ -254,12 +357,12 @@
% @@_version_compare_<:w ,
% @@_version_compare_>:w
% }
-% \begin{macrocode}
% To compare version, we need to split the given value then deal with both
% major and minor version
+% \begin{macrocode}
\prg_new_conditional:Npnn \pdf_version_compare:Nn #1#2 { p , T , F , TF }
- { \use:c { @@_version_compare_ #1 :w } #2 . . \q_stop }
-\cs_new:cpn { @@_version_compare_=:w } #1 . #2 . #3 \q_stop
+ { \use:c { @@_version_compare_ #1 :w } #2 . . \s_@@_stop }
+\cs_new:cpn { @@_version_compare_=:w } #1 . #2 . #3 \s_@@_stop
{
\bool_lazy_and:nnTF
{ \int_compare_p:nNn \@@_backend_version_major: = {#1} }
@@ -267,7 +370,7 @@
{ \prg_return_true: }
{ \prg_return_false: }
}
-\cs_new:cpn { @@_version_compare_<:w } #1 . #2 . #3 \q_stop
+\cs_new:cpn { @@_version_compare_<:w } #1 . #2 . #3 \s_@@_stop
{
\bool_lazy_or:nnTF
{ \int_compare_p:nNn \@@_backend_version_major: < {#1} }
@@ -279,7 +382,7 @@
{ \prg_return_true: }
{ \prg_return_false: }
}
-\cs_new:cpn { @@_version_compare_>:w } #1 . #2 . #3 \q_stop
+\cs_new:cpn { @@_version_compare_>:w } #1 . #2 . #3 \s_@@_stop
{
\bool_lazy_or:nnTF
{ \int_compare_p:nNn \@@_backend_version_major: > {#1} }
@@ -300,13 +403,13 @@
% Split the version and set.
% \begin{macrocode}
\cs_new_protected:Npn \pdf_version_gset:n #1
- { \@@_version_gset:w #1 . . \q_stop }
+ { \@@_version_gset:w #1 . . \s_@@_stop }
\cs_new_protected:Npn \pdf_version_min_gset:n #1
{
\pdf_version_compare:NnT < {#1}
- { \@@_version_gset:w #1 . . \q_stop }
+ { \@@_version_gset:w #1 . . \s_@@_stop }
}
-\cs_new_protected:Npn \@@_version_gset:w #1 . #2 . #3\q_stop
+\cs_new_protected:Npn \@@_version_gset:w #1 . #2 . #3\s_@@_stop
{
\bool_if:NF \g_@@_init_bool
{
@@ -328,8 +431,26 @@
% \end{macrocode}
% \end{macro}
%
+% \subsection{Destinations}
+%
+% \begin{macro}{\pdf_destination:nn}
+% \begin{macrocode}
+\cs_new_protected:Npn \pdf_destination:nn #1#2
+ { \@@_backend_destination:nn {#1} {#2} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdf_destination:nnnn}
% \begin{macrocode}
-%</initex|package>
+\cs_new_protected:Npn \pdf_destination:nnnn #1#2#3#4
+ {
+ \hbox_to_zero:n
+ { \@@_backend_destination:nnnn {#1} {#2} {#3} {#4} }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
index 8058df1d862..e75ab65899f 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
@@ -2,7 +2,7 @@
%
%% File: l3prg.dtx
%
-% Copyright (C) 2005-2020 The LaTeX3 Project
+% Copyright (C) 2005-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -353,6 +353,8 @@
% check that the \meta{boolean} really is a boolean variable.
% \end{function}
%
+% \subsection{Scratch booleans}
+%
% \begin{variable}{\l_tmpa_bool, \l_tmpb_bool}
% A scratch boolean for local assignment. It is never used by
% the kernel code, and so is safe for use with any \LaTeX3-defined
@@ -770,7 +772,7 @@
% \TestFiles{m3prg001.lvt,m3prg002.lvt,m3prg003.lvt}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \subsection{Primitive conditionals}
@@ -778,8 +780,9 @@
% \begin{macro}{\if_bool:N}
% \begin{macro}{\if_predicate:w}
% Those two primitive \TeX{} conditionals are synonyms.
+% \cs{if_bool:N} is defined in \pkg{l3basics}, as it's needed
+% earlier to define quark test functions.
% \begin{macrocode}
-\cs_new_eq:NN \if_bool:N \tex_ifodd:D
\cs_new_eq:NN \if_predicate:w \tex_ifodd:D
% \end{macrocode}
% \end{macro}
@@ -916,6 +919,31 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_i_delimit_by_q_recursion_stop:nw}
+% Functions to gobble up to a quark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_i_delimit_by_q_recursion_stop:nw
+ #1 #2 \q_@@_recursion_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop_do:nn}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop_do:nn
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}[pTF]{\bool_if:N, \bool_if:c}
% \UnitTested
% Straight forward here. We could optimize here if we wanted to as
@@ -1213,7 +1241,7 @@
% \texttt{false} expression, then the result is \texttt{true}.
% \begin{macrocode}
\cs_new:Npn \bool_lazy_all_p:n #1
- { \@@_lazy_all:n #1 \q_recursion_tail \q_recursion_stop }
+ { \@@_lazy_all:n #1 \q_@@_recursion_tail \q_@@_recursion_stop }
\prg_new_conditional:Npnn \bool_lazy_all:n #1 { T , F , TF }
{
\if_predicate:w \bool_lazy_all_p:n {#1}
@@ -1224,9 +1252,9 @@
}
\cs_new:Npn \@@_lazy_all:n #1
{
- \quark_if_recursion_tail_stop_do:nn {#1} { \c_true_bool }
+ \@@_if_recursion_tail_stop_do:nn {#1} { \c_true_bool }
\bool_if:nF {#1}
- { \use_i_delimit_by_q_recursion_stop:nw { \c_false_bool } }
+ { \@@_use_i_delimit_by_q_recursion_stop:nw { \c_false_bool } }
\@@_lazy_all:n
}
% \end{macrocode}
@@ -1260,7 +1288,7 @@
% \texttt{true} expression, then the result is \texttt{false}.
% \begin{macrocode}
\cs_new:Npn \bool_lazy_any_p:n #1
- { \@@_lazy_any:n #1 \q_recursion_tail \q_recursion_stop }
+ { \@@_lazy_any:n #1 \q_@@_recursion_tail \q_@@_recursion_stop }
\prg_new_conditional:Npnn \bool_lazy_any:n #1 { T , F , TF }
{
\if_predicate:w \bool_lazy_any_p:n {#1}
@@ -1271,9 +1299,9 @@
}
\cs_new:Npn \@@_lazy_any:n #1
{
- \quark_if_recursion_tail_stop_do:nn {#1} { \c_false_bool }
+ \@@_if_recursion_tail_stop_do:nn {#1} { \c_false_bool }
\bool_if:nT {#1}
- { \use_i_delimit_by_q_recursion_stop:nw { \c_true_bool } }
+ { \@@_use_i_delimit_by_q_recursion_stop:nw { \c_true_bool } }
\@@_lazy_any:n
}
% \end{macrocode}
@@ -1606,10 +1634,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macrocode}
-%<@@=prg>
-% \end{macrocode}
-%
% \begin{variable}{\g__kernel_prg_map_int}
% A nesting counter for mapping.
% \begin{macrocode}
@@ -1626,13 +1650,12 @@
%
% \begin{macro}{\prg_break_point:}
% \begin{macro}{\prg_break:, \prg_break:n}
-% Also done in \pkg{l3basics} as in format mode these are needed within
-% \pkg{l3alloc}.
+% Also done in \pkg{l3basics}.
% \end{macro}
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
index 3bacdb13749..d8c7410aaa8 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
@@ -2,7 +2,7 @@
%
%% File: l3prop.dtx
%
-% Copyright (C) 1990-2020 The LaTeX3 Project
+% Copyright (C) 1990-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -146,13 +146,17 @@
% \begin{function}[updated = 2012-07-09]
% {
% \prop_put:Nnn, \prop_put:NnV, \prop_put:Nno, \prop_put:Nnx,
-% \prop_put:NVn, \prop_put:NVV, \prop_put:Non, \prop_put:Noo,
+% \prop_put:NVn, \prop_put:NVV, \prop_put:NVx, \prop_put:Nvx,
+% \prop_put:Non, \prop_put:Noo,, \prop_put:Nxx,
% \prop_put:cnn, \prop_put:cnV, \prop_put:cno, \prop_put:cnx,
-% \prop_put:cVn, \prop_put:cVV, \prop_put:con, \prop_put:coo,
+% \prop_put:cVn, \prop_put:cVV, \prop_put:cVx, \prop_put:cvx,
+% \prop_put:con, \prop_put:coo, \prop_put:cxx,
% \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nno, \prop_gput:Nnx,
-% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:Non, \prop_gput:Noo,
+% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:NVx, \prop_gput:Nvx,
+% \prop_gput:Non, \prop_gput:Noo, \prop_gput:Nxx,
% \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cno, \prop_gput:cnx,
-% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:con, \prop_gput:coo
+% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVx, \prop_gput:cvx,
+% \prop_gput:con, \prop_gput:coo, \prop_gput:cxx
% }
% \begin{syntax}
% \cs{prop_put:Nnn} \meta{property list} \Arg{key} \Arg{value}
@@ -186,8 +190,8 @@
%
% \begin{function}[updated = 2011-08-28]
% {
-% \prop_get:NnN, \prop_get:NVN, \prop_get:NoN,
-% \prop_get:cnN, \prop_get:cVN, \prop_get:coN,
+% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NoN,
+% \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:coN,
% }
% \begin{syntax}
% \cs{prop_get:NnN} \meta{property list} \Arg{key} \meta{tl var}
@@ -319,8 +323,8 @@
%
% \begin{function}[updated = 2012-05-19, TF]
% {
-% \prop_get:NnN, \prop_get:NVN, \prop_get:NoN,
-% \prop_get:cnN, \prop_get:cVN, \prop_get:coN
+% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NoN,
+% \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:coN
% }
% \begin{syntax}
% \cs{prop_get:NnNTF} \meta{property list} \Arg{key} \meta{token list variable} \\
@@ -521,7 +525,7 @@
% \TestFiles{m3prop001, m3prop002, m3prop003, m3prop004, m3show001}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -617,6 +621,34 @@
% \end{macrocode}
% \end{variable}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop:n}
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop:o}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop:n
+\cs_generate_variant:Nn \@@_if_recursion_tail_stop:n { o }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Allocation and initialisation}
%
% \begin{macro}[tested = m3prop001]{\prop_new:N, \prop_new:c}
@@ -718,9 +750,9 @@
% trailing~|=| that we added). For both splits trim spaces and call a
% function (first \cs{@@_from_keyval_key:w} then
% \cs{@@_from_keyval_value:w}), followed by the trimmed material,
-% \cs{q_nil}, the subsequent part of the item, and the trailing |=|'s
-% and \cs{q_stop}. After finding the \meta{key} just store it after
-% \cs{q_stop}. After finding the \meta{value} ignore completely empty
+% \cs{s_@@_mark}, the subsequent part of the item, and the trailing |=|'s
+% and \cs{s_@@_stop}. After finding the \meta{key} just store it after
+% \cs{s_@@_stop}. After finding the \meta{value} ignore completely empty
% items (both trailing~|=| were used as delimiters and all parts are
% empty); if the remaining part~|#2| consists exactly of the second
% trailing~|=| (namely there was exactly one |=|~in the item) then
@@ -754,27 +786,27 @@
\cs_new_protected:Npn \@@_from_keyval:n #1
{
\@@_from_keyval_loop:w \prg_do_nothing: #1 ,
- \q_recursion_tail , \q_recursion_stop
+ \q_@@_recursion_tail , \q_@@_recursion_stop
}
\cs_new_protected:Npn \@@_from_keyval_loop:w #1 ,
{
- \quark_if_recursion_tail_stop:o {#1}
+ \@@_if_recursion_tail_stop:o {#1}
\@@_from_keyval_split:Nw \@@_from_keyval_key:n
- #1 = = \q_stop {#1}
+ #1 = = \s_@@_stop {#1}
\@@_from_keyval_loop:w \prg_do_nothing:
}
\cs_new_protected:Npn \@@_from_keyval_split:Nw #1#2 =
{ \tl_trim_spaces_apply:oN {#2} #1 }
\cs_new_protected:Npn \@@_from_keyval_key:n #1
- { \@@_from_keyval_key:w #1 \q_nil }
-\cs_new_protected:Npn \@@_from_keyval_key:w #1 \q_nil #2 \q_stop
+ { \@@_from_keyval_key:w #1 \s_@@_mark }
+\cs_new_protected:Npn \@@_from_keyval_key:w #1 \s_@@_mark #2 \s_@@_stop
{
\@@_from_keyval_split:Nw \@@_from_keyval_value:n
- \prg_do_nothing: #2 \q_stop {#1}
+ \prg_do_nothing: #2 \s_@@_stop {#1}
}
\cs_new_protected:Npn \@@_from_keyval_value:n #1
- { \@@_from_keyval_value:w #1 \q_nil }
-\cs_new_protected:Npn \@@_from_keyval_value:w #1 \q_nil #2 \q_stop #3#4
+ { \@@_from_keyval_value:w #1 \s_@@_mark }
+\cs_new_protected:Npn \@@_from_keyval_value:w #1 \s_@@_mark #2 \s_@@_stop #3#4
{
\tl_if_empty:nF { #3 #1 #2 }
{
@@ -808,7 +840,7 @@
% \begin{quote}
% \cs{cs_set:Npn} \cs{@@_split_aux:w} |#1| \\
% \quad \cs{@@_pair:wn} \meta{key} \cs{s_@@} |#2| \\
-% \quad |#3| \cs{q_mark} |#4| |#5| \cs{q_stop} \\
+% \quad |#3| \cs{s_@@_mark} |#4| |#5| \cs{s_@@_stop} \\
% \quad |{| |#4| \Arg{true code} \Arg{false code} |}|
% \end{quote}
%
@@ -829,10 +861,10 @@
\cs_new_protected:Npn \@@_split_aux:NnTF #1#2#3#4
{
\cs_set:Npn \@@_split_aux:w ##1
- \@@_pair:wn #2 \s_@@ ##2 ##3 \q_mark ##4 ##5 \q_stop
+ \@@_pair:wn #2 \s_@@ ##2 ##3 \s_@@_mark ##4 ##5 \s_@@_stop
{ ##4 {#3} {#4} }
- \exp_after:wN \@@_split_aux:w #1 \q_mark \use_i:nn
- \@@_pair:wn #2 \s_@@ { } \q_mark \use_ii:nn \q_stop
+ \exp_after:wN \@@_split_aux:w #1 \s_@@_mark \use_i:nn
+ \@@_pair:wn #2 \s_@@ { } \s_@@_mark \use_ii:nn \s_@@_stop
}
\cs_new:Npn \@@_split_aux:w { }
% \end{macrocode}
@@ -883,8 +915,8 @@
{ \tl_set:Nn #3 {##2} }
{ \tl_set:Nn #3 { \q_no_value } }
}
-\cs_generate_variant:Nn \prop_get:NnN { NV , No }
-\cs_generate_variant:Nn \prop_get:NnN { c , cV , co }
+\cs_generate_variant:Nn \prop_get:NnN { NV , Nv , No }
+\cs_generate_variant:Nn \prop_get:NnN { c , cV , cv , co }
% \end{macrocode}
% \end{macro}
%
@@ -1010,16 +1042,20 @@
% \begin{macro}[tested = m3prop002]
% {
% \prop_put:Nnn, \prop_put:NnV, \prop_put:Nno, \prop_put:Nnx,
-% \prop_put:NVn, \prop_put:NVV, \prop_put:Non, \prop_put:Noo,
+% \prop_put:NVn, \prop_put:NVV, \prop_put:NVx, \prop_put:Nvx,
+% \prop_put:Non, \prop_put:Noo, \prop_put:Nxx,
% \prop_put:cnn, \prop_put:cnV, \prop_put:cno, \prop_put:cnx,
-% \prop_put:cVn, \prop_put:cVV, \prop_put:con, \prop_put:coo
+% \prop_put:cVn, \prop_put:cVV, \prop_put:cVx, \prop_put:cvx,
+% \prop_put:con, \prop_put:coo, \prop_put:cxx
% }
% \begin{macro}[tested = m3prop002]
% {
% \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nno, \prop_gput:Nnx,
-% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:Non, \prop_gput:Noo,
+% \prop_gput:NVn, \prop_gput:NVV, \prop_hput:NVx, \prop_hput:Nvx,
+% \prop_gput:Non, \prop_gput:Noo, \prop_gput:Nxx,
% \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cno, \prop_gput:cnx,
-% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:con, \prop_gput:coo
+% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVx, \prop_gput:cvx,
+% \prop_gput:con, \prop_gput:coo, \prop_gput:cxx
% }
% \begin{macro}{\@@_put:NNnn}
% Since the branches of \cs{@@_split:NnTF} are used as the replacement
@@ -1035,8 +1071,8 @@
% updated entry is placed at the same spot as the original \meta{key}
% in the property list, preserving the order of entries.
% \begin{macrocode}
-\cs_new_protected:Npn \prop_put:Nnn { \@@_put:NNnn \tl_set:Nx }
-\cs_new_protected:Npn \prop_gput:Nnn { \@@_put:NNnn \tl_gset:Nx }
+\cs_new_protected:Npn \prop_put:Nnn { \@@_put:NNnn \__kernel_tl_set:Nx }
+\cs_new_protected:Npn \prop_gput:Nnn { \@@_put:NNnn \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_put:NNnn #1#2#3#4
{
\tl_set:Nn \l_@@_internal_tl
@@ -1049,13 +1085,13 @@
{ #1 #2 { \exp_not:o {#2} \l_@@_internal_tl } }
}
\cs_generate_variant:Nn \prop_put:Nnn
- { NnV , Nno , Nnx , NV , NVV , No , Noo }
+ { NnV , Nno , Nnx , NV , NVV , NVx , Nvx , No , Noo , Nxx }
\cs_generate_variant:Nn \prop_put:Nnn
- { c , cnV , cno , cnx , cV , cVV , co , coo }
+ { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx }
\cs_generate_variant:Nn \prop_gput:Nnn
- { NnV , Nno , Nnx , NV , NVV , No , Noo }
+ { NnV , Nno , Nnx , NV , NVV , NVx , Nvx , No , Noo , Nxx }
\cs_generate_variant:Nn \prop_gput:Nnn
- { c , cnV , cno , cnx , cV , cVV , co , coo }
+ { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1072,9 +1108,9 @@
% convert the key to a string using \cs{tl_to_str:n}.
% \begin{macrocode}
\cs_new_protected:Npn \prop_put_if_new:Nnn
- { \@@_put_if_new:NNnn \tl_set:Nx }
+ { \@@_put_if_new:NNnn \__kernel_tl_set:Nx }
\cs_new_protected:Npn \prop_gput_if_new:Nnn
- { \@@_put_if_new:NNnn \tl_gset:Nx }
+ { \@@_put_if_new:NNnn \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_put_if_new:NNnn #1#2#3#4
{
\tl_set:Nn \l_@@_internal_tl
@@ -1147,7 +1183,7 @@
% most often empty. When the \meta{key} is found in the list,
% \cs{@@_if_in:N} receives \cs{@@_pair:wn}, and if it is
% found as the extra item, the function receives
-% \cs{q_recursion_tail}, easily recognizable.
+% \cs{q_@@_recursion_tail}, easily recognizable.
%
% Here, \cs{prop_map_function:NN} is not sufficient for the mapping,
% since it can only map a single token, and cannot carry the key that
@@ -1157,7 +1193,7 @@
{
\exp_last_unbraced:Noo \@@_if_in:nwwn { \tl_to_str:n {#2} } #1
\@@_pair:wn \tl_to_str:n {#2} \s_@@ { }
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:
}
\cs_new:Npn \@@_if_in:nwwn #1#2 \@@_pair:wn #3 \s_@@ #4
@@ -1168,7 +1204,7 @@
}
\cs_new:Npn \@@_if_in:N #1
{
- \if_meaning:w \q_recursion_tail #1
+ \if_meaning:w \q_@@_recursion_tail #1
\prg_return_false:
\else:
\prg_return_true:
@@ -1202,7 +1238,7 @@
{ \prg_return_false: }
}
\prg_generate_conditional_variant:Nnn \prop_get:NnN
- { NV , No , c , cV , co } { T , F , TF }
+ { NV , Nv , No , c , cV , cv , co } { T , F , TF }
% \end{macrocode}
% \end{macro}
%
@@ -1333,7 +1369,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
index 25d382e2fda..8177a2a5899 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
@@ -2,7 +2,7 @@
%
%% File: l3quark.dtx
%
-% Copyright (C) 1990-2020 The LaTeX3 Project
+% Copyright (C) 1990-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -260,7 +260,7 @@
% \cs[no-index]{\meta{type}_map_break:}.
% \end{function}
%
-% \section{An example of recursion with quarks}
+% \subsection{An example of recursion with quarks}
% \label{sec:l3quark:quark-example}
%
% Quarks are mainly used internally in the \pkg{expl3} code to define
@@ -354,7 +354,7 @@
% \TestFiles{m3quark001.lvt}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \subsection{Quarks}
@@ -399,9 +399,25 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\quark_if_recursion_tail_stop:N}
+% \begin{variable}{\s_@@}
+% Private scan mark used in \pkg{l3quark}. We don't have \pkg{l3scan}
+% yet, so we declare the scan mark here and add it to the scan mark pool
+% later.
+% \begin{macrocode}
+\cs_new_eq:NN \s_@@ \scan_stop:
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_nil}
+% Private quark use for some tests.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\quark_if_recursion_tail_stop:N}
% \UnitTested
-% \begin{macro}{\quark_if_recursion_tail_stop_do:Nn}
+% \begin{macro}[EXP]{\quark_if_recursion_tail_stop_do:Nn}
% \UnitTested
% When doing recursions, it is easy to spend a lot of time testing if the
% end marker has been found. To avoid this, a dedicated end marker is used
@@ -429,13 +445,13 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}
+% \begin{macro}[EXP]
% {\quark_if_recursion_tail_stop:n, \quark_if_recursion_tail_stop:o}
% \UnitTested
-% \begin{macro}
+% \begin{macro}[EXP]
% {\quark_if_recursion_tail_stop_do:nn, \quark_if_recursion_tail_stop_do:on}
% \UnitTested
-% \begin{macro}{\@@_if_recursion_tail:w}
+% \begin{macro}[EXP]{\@@_if_recursion_tail:w}
% See \cs{quark_if_nil:nTF} for the details. Expanding
% \cs{@@_if_recursion_tail:w} once in front of the tokens chosen here
% gives an empty result if and only if |#1|~is exactly
@@ -464,8 +480,8 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\quark_if_recursion_tail_break:NN}
-% \begin{macro}{\quark_if_recursion_tail_break:nN}
+% \begin{macro}[EXP]{\quark_if_recursion_tail_break:NN}
+% \begin{macro}[EXP]{\quark_if_recursion_tail_break:nN}
% Analogues of the \cs[index=quark_if_recursion_tail_stop:n]
% {quark_if_recursion_tail_stop\ldots{}} functions.
% Break the mapping using |#2|.
@@ -574,6 +590,353 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\__kernel_quark_new_test:N}
+% The function \cs{__kernel_quark_new_test:N} defines |#1| in a
+% similar way as \cs[no-index]{quark_if_recursion_tail_...} functions
+% (as described below), using
+% \cs[no-index]{q__\meta{namespace}_recursion_tail} as the test quark
+% and \cs[no-index]{q__\meta{namespace}_recursion_stop} as the
+% delimiter quark, where the \meta{namespace} is determined as the
+% first |_|-delimited part in~|#1|.
+%
+% There are six possible function types which this function can define,
+% and which is defined depends on the signature of the function being
+% defined:
+% \begin{description}
+% \def\makelabel#1{\texttt{:#1}~}
+% \item[n] gives an analogue of \cs{quark_if_recursion_tail_stop:n}
+% \item[nn] gives an analogue of \cs{quark_if_recursion_tail_stop_do:nn}
+% \item[nN] gives an analogue of \cs{quark_if_recursion_tail_break:nN}
+% \item[N] gives an analogue of \cs{quark_if_recursion_tail_stop:N}
+% \item[Nn] gives an analogue of \cs{quark_if_recursion_tail_stop_do:Nn}
+% \item[NN] gives an analogue of \cs{quark_if_recursion_tail_break:NN}
+% \end{description}
+% Any other signature causes an error, as does a function without signature.
+%
+% \begin{macro}{\__kernel_quark_new_conditional:Nn}
+% Similar to \cs{__kernel_quark_new_test:N}, but defines quark
+% branching conditionals like \cs{quark_if_nil:nTF} that test for the
+% quark \cs[no-index]{q__\meta{namespace}_\meta{name}}.
+% The \meta{namespace} and \meta{name} are determined from the
+% conditional~|#1|, which must take the rather rigid form
+% \cs[no-index]{__\meta{namespace}_quark_if_\meta{name}:\meta{arg spec}}.
+% There are only two cases for the \meta{arg spec} here:
+% \begin{description}
+% \def\makelabel#1{\texttt{:#1}~}
+% \item[n] gives an analogue of \cs[no-index]{quark_if_nil:n(TF)}
+% \item[N] gives an analogue of \cs[no-index]{quark_if_nil:N(TF)}
+% \end{description}
+% Any other signature causes an error, as does a function without signature.
+% We use low-level emptiness tests as \pkg{l3tl} is not available yet when these
+% functions are used; thankfully we only care about whether strings
+% are empty so a simple \cs{if_meaning:w} \cs{q_nil} \meta{string}
+% \cs{q_nil} suffices.
+%
+% \begin{macro}{\@@_new_test:NNNn, \@@_new_test:Nccn,
+% \@@_new_test_aux:nnNNnnnn}
+% \begin{macro}{\@@_new_conditional:Nnnn, \@@_new_conditional:Nxxn}
+% \begin{macrocode}
+\cs_new_protected:Npn \__kernel_quark_new_test:N #1
+ { \@@_new_test_aux:Nx #1 { \@@_module_name:N #1 } }
+\cs_new_protected:Npn \@@_new_test_aux:Nn #1 #2
+ {
+ \if_meaning:w \q_nil #2 \q_nil
+ \__kernel_msg_error:nnx { kernel } { invalid-quark-function }
+ { \token_to_str:N #1 }
+ \else:
+ \@@_new_test:Nccn #1
+ { q__#2_recursion_tail } { q__#2_recursion_stop } { __#2 }
+ \fi:
+ }
+\cs_generate_variant:Nn \@@_new_test_aux:Nn { Nx }
+\cs_new_protected:Npn \@@_new_test:NNNn #1
+ {
+ \exp_last_unbraced:Nf \@@_new_test_aux:nnNNnnnn
+ { \cs_split_function:N #1 }
+ #1 { test }
+ }
+\cs_generate_variant:Nn \@@_new_test:NNNn { Ncc }
+\cs_new_protected:Npn \__kernel_quark_new_conditional:Nn #1
+ {
+ \@@_new_conditional:Nxxn #1
+ { \@@_quark_conditional_name:N #1 }
+ { \@@_module_name:N #1 }
+ }
+\cs_new_protected:Npn \@@_new_conditional:Nnnn #1#2#3#4
+ {
+ \if_meaning:w \q_nil #2 \q_nil
+ \__kernel_msg_error:nnx { kernel } { invalid-quark-function }
+ { \token_to_str:N #1 }
+ \else:
+ \if_meaning:w \q_nil #3 \q_nil
+ \__kernel_msg_error:nnx { kernel } { invalid-quark-function }
+ { \token_to_str:N #1 }
+ \else:
+ \exp_last_unbraced:Nf \@@_new_test_aux:nnNNnnnn
+ { \cs_split_function:N #1 }
+ #1 { conditional }
+ {#2} {#3} {#4}
+ \fi:
+ \fi:
+ }
+\cs_generate_variant:Nn \@@_new_conditional:Nnnn { Nxx }
+\cs_new_protected:Npn \@@_new_test_aux:nnNNnnnn #1 #2 #3 #4 #5
+ {
+ \cs_if_exist_use:cTF { @@_new_#5_#2:Nnnn } { #4 }
+ {
+ \__kernel_msg_error:nnxx { kernel } { invalid-quark-function }
+ { \token_to_str:N #4 } {#2}
+ \use_none:nnn
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_new_test_n:Nnnn, \@@_new_test_nn:Nnnn,
+% \@@_new_test_N:Nnnn, \@@_new_test_Nn:Nnnn,
+% \@@_new_test_NN:Nnnn, \@@_new_test_NN:Nnnn,
+% }
+% These macros implement the six possibilities mentioned above, passing
+% the right arguments to \cs{@@_new_test_aux_do:nNNnnnnNNn},
+% which defines some auxiliaries, and then to
+% \cs{@@_new_test_define_tl:nNnNNn} (|:n(n)| variants) or to
+% \cs{@@_new_test_define_ifx:nNnNNn} (|:N(n)|) which define the
+% main conditionals.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_new_test_n:Nnnn #1 #2 #3 #4
+ {
+ \@@_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { none } { } { } { }
+ \@@_new_test_define_tl:nNnNNn #1 { }
+ }
+\cs_new_protected:Npn \@@_new_test_nn:Nnnn #1 #2 #3 #4
+ {
+ \@@_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { i } { n } {##1} {##2}
+ \@@_new_test_define_tl:nNnNNn #1 { \use_none:n }
+ }
+\cs_new_protected:Npn \@@_new_test_nN:Nnnn #1 #2 #3 #4
+ {
+ \@@_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { i } { n } {##1} {##2}
+ \@@_new_test_define_break_tl:nNNNNn #1 { }
+ }
+\cs_new_protected:Npn \@@_new_test_N:Nnnn #1 #2 #3 #4
+ {
+ \@@_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { none } { } { } { }
+ \@@_new_test_define_ifx:nNnNNn #1 { }
+ }
+\cs_new_protected:Npn \@@_new_test_Nn:Nnnn #1 #2 #3 #4
+ {
+ \@@_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { i } { n } {##1} {##2}
+ \@@_new_test_define_ifx:nNnNNn #1
+ { \else: \exp_after:wN \use_none:n }
+ }
+\cs_new_protected:Npn \@@_new_test_NN:Nnnn #1 #2 #3 #4
+ {
+ \@@_new_test_aux_do:nNNnnnnNNn {#4} #2 #3 { i } { n } {##1} {##2}
+ \@@_new_test_define_break_ifx:nNNNNn #1 { }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_new_test_aux_do:nNNnnnnNNn,
+% \@@_test_define_aux:NNNNnnNNn
+% }
+% \cs{@@_new_test_aux_do:nNNnnnnNNn} makes the control sequence names
+% which will be used by \cs{@@_test_define_aux:NNNNnnNNn}, and then later
+% by \cs{@@_new_test_define_tl:nNnNNn} or
+% \cs{@@_new_test_define_ifx:nNnNNn}. The control sequences defined
+% here are analogous to \cs{@@_if_recursion_tail:w} and to
+% \cs[no-index]{use_(none|i)_delimit_by_q_recursion_stop:(|n)w}.
+%
+% The name is composed by the name-space and the name of the quarks.
+% Suppose \cs{__kernel_quark_new_test:N} was used with:
+% \begin{verbatim}
+% \__kernel_quark_new_test:N \__test_quark_tail:n
+% \end{verbatim}
+% then the first auxiliary will be \cs[no-index]{__test_quark_recursion_tail:w},
+% and the second one will be
+% \cs[no-index]{__test_use_none_delimit_by_q_recursion_stop:w}.
+%
+% Note that the actual quarks are \emph{not} defined here. They should
+% be defined separately using \cs{quark_new:N}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_new_test_aux_do:nNNnnnnNNn #1 #2 #3 #4 #5
+ {
+ \exp_args:Ncc \@@_test_define_aux:NNNNnnNNn
+ { #1 _quark_recursion_tail:w }
+ { #1 _use_ #4 _delimit_by_q_recursion_stop: #5 w }
+ #2 #3
+ }
+\cs_new_protected:Npn \@@_test_define_aux:NNNNnnNNn #1 #2 #3 #4 #5 #6 #7
+ {
+ \cs_gset:Npn #1 ##1 #3 ##2 ? ##3 ?! { ##1 ##2 }
+ \cs_gset:Npn #2 ##1 #6 #4 {#5}
+ #7 {##1} #1 #2 #3
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_new_test_define_tl:nNnNNn,
+% \@@_new_test_define_ifx:nNnNNn
+% }
+% \begin{macro}{
+% \@@_new_test_define_break_tl:nNNNNn,
+% \@@_new_test_define_break_ifx:nNNNNn
+% }
+% Finally, these two macros define the main conditional function using
+% what's been set up before.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_new_test_define_tl:nNnNNn #1 #2 #3 #4 #5 #6
+ {
+ \cs_new:Npn #5 #1
+ {
+ \tl_if_empty:oTF
+ { #2 {} ##1 {} ?! #4 ??! }
+ {#3} {#6}
+ }
+ }
+\cs_new_protected:Npn \@@_new_test_define_ifx:nNnNNn #1 #2 #3 #4 #5 #6
+ {
+ \cs_new:Npn #5 #1
+ {
+ \if_meaning:w #4 ##1
+ \exp_after:wN #3
+ #6
+ \fi:
+ }
+ }
+\cs_new_protected:Npn \@@_new_test_define_break_tl:nNNNNn #1 #2 #3
+ { \@@_new_test_define_tl:nNnNNn {##1##2} #2 {##2} }
+\cs_new_protected:Npn \@@_new_test_define_break_ifx:nNNNNn #1 #2 #3
+ { \@@_new_test_define_ifx:nNnNNn {##1##2} #2 {##2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_new_conditional_n:Nnnn,
+% \@@_new_conditional_N:Nnnn,
+% }
+% These macros implement the two possibilities for branching quark
+% conditionals, passing
+% the right arguments to \cs{@@_new_conditional_aux_do:NNnnn},
+% which defines some auxiliaries and defines the
+% main conditionals.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_new_conditional_n:Nnnn
+ { \@@_new_conditional_aux_do:NNnnn \use_i:nn }
+\cs_new_protected:Npn \@@_new_conditional_N:Nnnn
+ { \@@_new_conditional_aux_do:NNnnn \use_ii:nn }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_new_conditional_aux_do:NNnnn,
+% \@@_new_conditional_define:NNNNn,
+% }
+% Similar to the previous macros, but branching conditionals only
+% require one auxiliary, so we take a shortcut. In
+% \cs{@@_new_conditional_define:NNNNn}, |#4| is \cs{use_i:nn} to
+% define the \texttt{n}-type function (which needs an auxiliary) and
+% is \cs{use_ii:nn} to define the \texttt{N}-type function.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_new_conditional_aux_do:NNnnn #1 #2 #3 #4
+ {
+ \exp_args:Ncc \@@_new_conditional_define:NNNNn
+ { __ #4 _if_quark_ #3 :w } { q__ #4 _ #3 } #2 #1
+ }
+\cs_new_protected:Npn \@@_new_conditional_define:NNNNn #1 #2 #3 #4 #5
+ {
+ #4 { \cs_gset:Npn #1 ##1 #2 ##2 ? ##3 ?! { ##1 ##2 } } { }
+ \exp_args:Nno \use:n { \prg_new_conditional:Npnn #3 ##1 {#5} }
+ {
+ #4 { \@@_if_empty_if:o { #1 {} ##1 {} ?! #2 ??! } }
+ { \if_meaning:w #2 ##1 }
+ \prg_return_true: \else: \prg_return_false: \fi:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_module_name:N}
+% \begin{macro}[EXP]{
+% \@@_module_name:w,
+% \@@_module_name_loop:w,
+% \@@_module_name_end:w
+% }
+% \cs{@@_module_name:N} takes a control sequence and returns its
+% \meta{module} name, determined as the first non-empty
+% non-single-character word, separated by |_| or~|:|. These rules
+% give the correct result for public functions
+% \cs[no-index]{\meta{module}_\ldots{}}, private functions
+% \cs[no-index]{__\meta{module}_\ldots{}}, and variables such as
+% \cs[no-index]{l_\meta{module}_\ldots{}}. If no valid module is
+% found the result is an empty string. The approach is to first cut
+% off everything after the (first) |:| if any is present, then
+% repeatedly grab |_|-delimited words until finding one of length at
+% least~$2$ (we use low-level tests as \pkg{l3tl} is not fully
+% available when \cs{__kernel_quark_new_test:N} is first used.
+% If no \meta{module} is found (such as in \cs{::n}) we
+% get the trailing marker \cs{use_none:n} |{}|, which expands to
+% nothing.
+% \begin{macrocode}
+\cs_set:Npn \@@_tmp:w #1#2
+ {
+ \cs_new:Npn \@@_module_name:N ##1
+ {
+ \exp_last_unbraced:Nf \@@_module_name:w
+ { \cs_to_str:N ##1 } #1 \s_@@
+ }
+ \cs_new:Npn \@@_module_name:w ##1 #1 ##2 \s_@@
+ { \@@_module_name_loop:w ##1 #2 \use_none:n { } #2 \s_@@ }
+ \cs_new:Npn \@@_module_name_loop:w ##1 #2
+ {
+ \use_i_ii:nnn \if_meaning:w \prg_do_nothing:
+ ##1 \prg_do_nothing: \prg_do_nothing:
+ \exp_after:wN \@@_module_name_loop:w
+ \else:
+ \@@_module_name_end:w ##1
+ \fi:
+ }
+ \cs_new:Npn \@@_module_name_end:w
+ ##1 \fi: ##2 \s_@@ { \fi: ##1 }
+ }
+\exp_after:wN \@@_tmp:w \tl_to_str:n { : _ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_quark_conditional_name:N, \@@_quark_conditional_name:w}
+% \cs{@@_quark_conditional_name:N} determines the quark name that the quark
+% conditional function~|##1| queries, as the part of the function name
+% between |_quark_if_| and the trailing~|:|. Again we define it
+% through \cs{@@_tmp:w}, which receives |:| as |#1| and |_quark_if_|
+% as |#2|. The auxiliary \cs{@@_quark_conditional_name:w} returns the part
+% between the first |_quark_if_| and the next~|:|, and we apply this
+% auxiliary to the function name followed by |:| (in case the function
+% name is lacking a signature), and |_quark_if_:| so that
+% \cs{@@_quark_conditional_name:N} returns an empty string if |_quark_if_| is
+% not present.
+% \begin{macrocode}
+\cs_set:Npn \@@_tmp:w #1 #2 \s_@@
+ {
+ \cs_new:Npn \@@_quark_conditional_name:N ##1
+ {
+ \exp_last_unbraced:Nf \@@_quark_conditional_name:w
+ { \cs_to_str:N ##1 } #1 #2 #1 \s_@@
+ }
+ \cs_new:Npn \@@_quark_conditional_name:w
+ ##1 #2 ##2 #1 ##3 \s_@@ {##2}
+ }
+\exp_after:wN \@@_tmp:w \tl_to_str:n { : _quark_if_ } \s_@@
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Scan marks}
%
% \begin{macrocode}
@@ -583,8 +946,9 @@
% \begin{variable}{\g_@@_marks_tl}
% \UnitTested
% The list of all scan marks currently declared.
+% No \pkg{l3tl} yet, so define this by hand.
% \begin{macrocode}
-\tl_new:N \g_@@_marks_tl
+\cs_gset:Npn \g_@@_marks_tl { }
% \end{macrocode}
% \end{variable}
%
@@ -612,12 +976,25 @@
% \UnitTested
% We only declare one scan mark here, more can be defined
% by specific modules.
+% Can't use \cs{scan_new:N} yet because \pkg{l3tl} isn't loaded,
+% so define \cs{s_stop} by hand and add it to \cs{g_@@_marks_tl}.
+% We also add \cs{s__quark} (declared earlier) to the pool here.
+% Since it lives in a different namespace, a little \pkg{l3docstrip}
+% cheating is necessary.
% \begin{macrocode}
-\scan_new:N \s_stop
+\cs_new_eq:NN \s_stop \scan_stop:
+\cs_gset_nopar:Npx \g_@@_marks_tl
+ {
+ \exp_not:o \g_@@_marks_tl
+ \s_stop
+%<@@=quark>
+ \s_@@
+%<@@=scan>
+ }
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\use_none_delimit_by_s_stop:w}
+% \begin{macro}[EXP]{\use_none_delimit_by_s_stop:w}
% \UnitTested
% Similar to \cs{use_none_delimit_by_q_stop:w}.
% \begin{macrocode}
@@ -626,7 +1003,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
index 6fbdb21eb84..ef7ab6becc5 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
@@ -2,7 +2,7 @@
%
%% File: l3regex.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -713,7 +713,7 @@
% |{n,}| quantifier? (I think not.)
% \item Quantifiers for |\u| and assertions.
% \item When matching, keep track of an explicit stack of
-% \texttt{current_state} and \texttt{current_submatches}.
+% \texttt{curr_state} and \texttt{curr_submatches}.
% \item If possible, when a state is reused by the same thread, kill
% other subthreads.
% \item Use an array rather than \cs[no-index]{l__regex_balance_tl}
@@ -811,7 +811,7 @@
% \section{\pkg{l3regex} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -845,12 +845,14 @@
% names).
% \begin{itemize}
% \item \emph{Group}: index of the capturing group, $-1$ for
-% non-capturing groups.
+% non-capturing groups. ^^A start/end index?
% \item \emph{Position}: each token in the query is labelled by an
% integer \meta{position}, with $\texttt{min_pos} - 1 \leq
% \meta{position} \leq \texttt{max_pos}$. The lowest and highest
-% positions correspond to imaginary begin and end markers (with
-% inaccessible category code and character code).
+% positions $\texttt{min_pos} - 1$ and $\texttt{max_pos}$
+% correspond to imaginary begin and end markers (with
+% non-existent category code and character code).
+% $\texttt{max_pos}$ is only set quite late in the processing.
% \item \emph{Query}: the token list to which we apply the regular
% expression.
% \item \emph{State}: each state of the \textsc{nfa} is labelled by an
@@ -865,8 +867,8 @@
% unique id for all the steps of the matching algorithm.
% \end{itemize}
%
-% We use \pkg{l3intarray} to manipulate arrays of integers (stored into
-% some dimension registers in scaled points). We also abuse \TeX{}'s
+% We use \pkg{l3intarray} to manipulate arrays of integers.
+% We also abuse \TeX{}'s
% \tn{toks} registers, by accessing them directly by number rather than
% tying them to control sequence using the \tn{newtoks} allocation
% functions. Specifically, these arrays and \tn{toks} are used as
@@ -876,21 +878,14 @@
% \begin{itemize}
% \item \cs{g_@@_state_active_intarray} holds the last \meta{step} in
% which each \meta{state} was active.
-% \item \cs{g_@@_thread_state_intarray} maps each \meta{thread} (with
-% $\texttt{min_active} \leq \meta{thread} < \texttt{max_active}$) to
-% the \meta{state} in which the \meta{thread} currently is. The
+% \item \cs{g_@@_thread_info_intarray} consists of blocks for each
+% \meta{thread} (with $\texttt{min_thread} \leq \meta{thread} <
+% \texttt{max_thread}$). Each block has
+% $1+2\cs{l_@@_capturing_group_int}$ entries: the \meta{state} in
+% which the \meta{thread} currently is, followed by the beginnings
+% of all submatches, and then the ends of all submatches. The
% \meta{threads} are ordered starting from the best to the least
% preferred.
-% \item \tn{toks}\meta{thread} holds the submatch information for the
-% \meta{thread}, as the contents of a property list.
-% \item \cs{g_@@_charcode_intarray} and \cs{g_@@_catcode_intarray} hold the
-% character codes and category codes of tokens at each
-% \meta{position} in the query.
-% \item \cs{g_@@_balance_intarray} holds the balance of begin-group and
-% end-group character tokens which appear before that point in the
-% token list.
-% \item \tn{toks}\meta{position} holds \meta{tokens} which \texttt{o}-
-% and \texttt{x}-expand to the \meta{position}-th token in the query.
% \item \cs{g_@@_submatch_prev_intarray}, \cs{g_@@_submatch_begin_intarray}
% and \cs{g_@@_submatch_end_intarray} hold, for each submatch (as would
% be extracted by \cs{regex_extract_all:nnN}), the place where the
@@ -901,6 +896,14 @@
% block corresponding to one match with all its submatches stored in
% consecutive entries.
% \end{itemize}
+% When actually building the result,
+% \begin{itemize}
+% \item \tn{toks}\meta{position} holds \meta{tokens} which \texttt{o}-
+% and \texttt{x}-expand to the \meta{position}-th token in the query.
+% \item \cs{g_@@_balance_intarray} holds the balance of begin-group and
+% end-group character tokens which appear before that point in the
+% token list.
+% \end{itemize}
%
% The code is structured as follows. Variables are introduced in the
% relevant section. First we present some generic helper functions. Then
@@ -914,13 +917,12 @@
%
% \subsection{Helpers}
%
-% \begin{macro}
-% {\@@_int_eval:w}
+% \begin{macro}{\@@_int_eval:w}
% Access the primitive: performance is key here, so we do not use
% the slower route \emph{via} \cs{int_eval:n}.
% \begin{macrocode}
\cs_new_eq:NN \@@_int_eval:w \tex_numexpr:D
-% \end{macrocode}
+% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_standard_escapechar:}
@@ -945,7 +947,7 @@
{ \@@_toks_set:Nn #1 { } }
\cs_new_eq:NN \@@_toks_set:Nn \tex_toks:D
\cs_new_protected:Npn \@@_toks_set:No #1
- { \@@_toks_set:Nn #1 \exp_after:wN }
+ { \tex_toks:D #1 \exp_after:wN }
% \end{macrocode}
% \end{macro}
%
@@ -976,13 +978,13 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_toks_put_left:Nx #1#2
{
- \cs_set:Npx \@@_tmp:w { #2 }
+ \cs_set_nopar:Npx \@@_tmp:w { #2 }
\tex_toks:D #1 \exp_after:wN \exp_after:wN \exp_after:wN
{ \exp_after:wN \@@_tmp:w \tex_the:D \tex_toks:D #1 }
}
\cs_new_protected:Npn \@@_toks_put_right:Nx #1#2
{
- \cs_set:Npx \@@_tmp:w {#2}
+ \cs_set_nopar:Npx \@@_tmp:w {#2}
\tex_toks:D #1 \exp_after:wN
{ \tex_the:D \tex_toks:D \exp_after:wN #1 \@@_tmp:w }
}
@@ -1001,11 +1003,38 @@
\cs_new:Npn \@@_curr_cs_to_str:
{
\exp_after:wN \exp_after:wN \exp_after:wN \cs_to_str:N
- \tex_the:D \tex_toks:D \l_@@_curr_pos_int
+ \l_@@_curr_token_tl
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_intarray_item:NnF, \@@_intarray_item_aux:nNF}
+% Item of intarray, with a default value.
+% \begin{macrocode}
+\cs_new:Npn \@@_intarray_item:NnF #1#2
+ { \exp_args:Nf \@@_intarray_item_aux:nNF { \int_eval:n {#2} } #1 }
+\cs_new:Npn \@@_intarray_item_aux:nNF #1#2
+ {
+ \if_int_compare:w #1 > \c_zero_int
+ \exp_after:wN \use_i:nn
+ \else:
+ \exp_after:wN \use_ii:nn
+ \fi:
+ { \__kernel_intarray_item:Nn #2 {#1} }
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_maplike_break:}
+% Analogous to \cs{tl_map_break:}, this correctly exits
+% \cs{tl_map_inline:nn} and similar constructions and jumps to the
+% matching \cs{prg_break_point:Nn} \cs{@@_maplike_break:} |{| |}|.
+% \begin{macrocode}
+\cs_new:Npn \@@_maplike_break:
+ { \prg_map_break:Nn \@@_maplike_break: { } }
+% \end{macrocode}
+% \end{macro}
+%
% \subsubsection{Constants and variables}
%
% \begin{macro}{\@@_tmp:w}
@@ -1057,19 +1086,6 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\g_@@_charcode_intarray, \g_@@_catcode_intarray, \g_@@_balance_intarray}
-% The first thing we do when matching is to go once through the query
-% token list and store the information for each token into
-% \cs{g_@@_charcode_intarray}, \cs{g_@@_catcode_intarray} and \tn{toks}
-% registers. We also store the balance of begin-group/end-group
-% characters into \cs{g_@@_balance_intarray}.
-% \begin{macrocode}
-\intarray_new:Nn \g_@@_charcode_intarray { 65536 }
-\intarray_new:Nn \g_@@_catcode_intarray { 65536 }
-\intarray_new:Nn \g_@@_balance_intarray { 65536 }
-% \end{macrocode}
-% \end{variable}
-%
% \begin{variable}{\l_@@_balance_int}
% During this phase, \cs{l_@@_balance_int} counts the balance of
% begin-group and end-group character tokens which appear before a
@@ -1080,15 +1096,6 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\l_@@_cs_name_tl}
-% This variable is used in \cs{@@_item_cs:n} to store the csname of
-% the currently-tested token when the regex contains a sub-regex for
-% testing csnames.
-% \begin{macrocode}
-\tl_new:N \l_@@_cs_name_tl
-% \end{macrocode}
-% \end{variable}
-%
% \subsubsection{Testing characters}
%
% \begin{macro}{\c_@@_ascii_min_int, \c_@@_ascii_max_control_int, \c_@@_ascii_max_int}
@@ -1105,6 +1112,42 @@
% \end{macrocode}
% \end{variable}
%
+% \subsubsection{Internal auxiliaries}
+%
+% \begin{variable}{\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{
+% \@@_use_none_delimit_by_q_recursion_stop:w,
+% \@@_use_i_delimit_by_q_recursion_stop:nw
+% }
+% Functions to gobble up to a quark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_q_recursion_stop:w
+ #1 \q_@@_recursion_stop { }
+\cs_new:Npn \@@_use_i_delimit_by_q_recursion_stop:nw
+ #1 #2 \q_@@_recursion_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_nil}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_nil:n}
+% Branching quark conditional.
+% \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:N { F }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_break_point:TF}
% \begin{macro}{\@@_break_true:w}
% When testing whether a character of the query token list matches
@@ -1166,7 +1209,7 @@
% \begin{macro}
% {\@@_item_caseless_equal:n, \@@_item_caseless_range:nn}
% For caseless matching, we perform the test both on the
-% \texttt{current_char} and on the \texttt{case_changed_char}. Before
+% \texttt{curr_char} and on the \texttt{case_changed_char}. Before
% doing the second set of tests, we make sure that
% \texttt{case_changed_char} has been computed.
% \begin{macrocode}
@@ -1273,7 +1316,8 @@
%
% \begin{macro}{\@@_item_exact:nn, \@@_item_exact_cs:n}
% This matches an exact \meta{category}-\meta{character code} pair, or
-% an exact control sequence, more precisely one of several possible control sequences.
+% an exact control sequence, more precisely one of several possible
+% control sequences, separated by \cs{scan_stop:}.
% \begin{macrocode}
\cs_new_protected:Npn \@@_item_exact:nn #1#2
{
@@ -1287,7 +1331,7 @@
{
\int_compare:nNnTF \l_@@_curr_catcode_int = 0
{
- \tl_set:Nx \l_@@_internal_a_tl
+ \__kernel_tl_set:Nx \l_@@_internal_a_tl
{ \scan_stop: \@@_curr_cs_to_str: \scan_stop: }
\tl_if_in:noTF { \scan_stop: #1 \scan_stop: }
\l_@@_internal_a_tl
@@ -1302,24 +1346,19 @@
% Match a control sequence (the argument is a compiled regex).
% First test the catcode of the current token to be zero.
% Then perform the matching test, and break if the csname
-% indeed matches. The three \cs{exp_after:wN} expand the contents
-% of the \tn{toks}\meta{current position} (of the form \cs{exp_not:n}
-% \Arg{control sequence}) to \meta{control sequence}.
-% We store the cs name before building states for the cs, as those
-% states may overlap with toks registers storing the user's input.
+% indeed matches.
% \begin{macrocode}
\cs_new_protected:Npn \@@_item_cs:n #1
{
\int_compare:nNnT \l_@@_curr_catcode_int = 0
{
\group_begin:
- \tl_set:Nx \l_@@_cs_name_tl { \@@_curr_cs_to_str: }
\@@_single_match:
\@@_disable_submatches:
\@@_build_for_cs:n {#1}
\bool_set_eq:NN \l_@@_saved_success_bool
\g_@@_success_bool
- \exp_args:NV \@@_match_cs:n \l_@@_cs_name_tl
+ \exp_args:Nx \@@_match_cs:n { \@@_curr_cs_to_str: }
\if_meaning:w \c_true_bool \g_@@_success_bool
\group_insert_after:N \@@_break_true:w
\fi:
@@ -1480,7 +1519,7 @@
\cs_set:Npn \@@_escape_escaped:N ##1 { #2 }
\cs_set:Npn \@@_escape_raw:N ##1 { #3 }
\@@_standard_escapechar:
- \tl_gset:Nx \g_@@_internal_tl
+ \__kernel_tl_gset:Nx \g_@@_internal_tl
{ \__kernel_str_to_other_fast:n {#4} }
\tl_put_right:Nx \l_@@_internal_a_tl
{
@@ -1787,7 +1826,7 @@
% \item \cs{@@_command_K:}
% \item \cs{@@_assertion:Nn} \meta{boolean} \Arg{assertion test},
% where the \meta{assertion test} is \cs{@@_b_test:} or
-% |{|\cs{@@_anchor:N} \meta{integer}|}|
+% \cs{@@_Z_test:} or \cs{@@_A_test:} or \cs{@@_G_test:}
% \end{itemize}
% Tests can be the following:
% \begin{itemize}
@@ -2628,73 +2667,56 @@
%
% \subsubsection{Anchoring and simple assertions}
%
-% \begin{macro}{\@@_compile_anchor:NF}
+% \begin{macro}{\@@_compile_anchor_letter:NNN}
+% \begin{macro}{\@@_compile_/A:, \@@_compile_/G:, \@@_compile_/Z:, \@@_compile_/z:, \@@_compile_/b:, \@@_compile_/B:}
% \begin{macro}+\@@_compile_^:+
-% \begin{macro}{\@@_compile_/A:, \@@_compile_/G:}
% \begin{macro}+\@@_compile_$:+
-% \begin{macro}{\@@_compile_/Z:, \@@_compile_/z:}
-% In modes where assertions are allowed, anchor to the start of the
-% query, the start of the match, or the end of the query, depending on
-% the integer |#1|. In other modes, |#2| treats the character as raw,
-% with an error for escaped letters (|$| is valid in a class, but |\A|
-% is definitely a mistake on the user's part).
+% In modes where assertions are forbidden, anchors such as |\A|
+% produce an error (|\A|~is invalid in classes); otherwise they add an
+% \cs{@@_assertion:Nn} test as appropriate (the only negative
+% assertion is~|\B|). The test functions are defined later. The
+% implementation for
+% |$| and |^| is only different from |\A| etc because these are valid
+% in a class.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_compile_anchor:NF #1#2
+\cs_new_protected:Npn \@@_compile_anchor_letter:NNN #1#2#3
{
- \@@_if_in_class_or_catcode:TF {#2}
+ \@@_if_in_class_or_catcode:TF { \@@_compile_raw_error:N #1 }
{
\tl_build_put_right:Nn \l_@@_build_tl
- { \@@_assertion:Nn \c_true_bool { \@@_anchor:N #1 } }
+ { \@@_assertion:Nn #2 {#3} }
}
}
-\cs_set_protected:Npn \@@_tmp:w #1#2
- {
- \cs_new_protected:cpn { @@_compile_/#1: }
- { \@@_compile_anchor:NF #2 { \@@_compile_raw_error:N #1 } }
- }
-\@@_tmp:w A \l_@@_min_pos_int
-\@@_tmp:w G \l_@@_start_pos_int
-\@@_tmp:w Z \l_@@_max_pos_int
-\@@_tmp:w z \l_@@_max_pos_int
+\cs_new_protected:cpn { @@_compile_/A: }
+ { \@@_compile_anchor_letter:NNN A \c_true_bool \@@_A_test: }
+\cs_new_protected:cpn { @@_compile_/G: }
+ { \@@_compile_anchor_letter:NNN G \c_true_bool \@@_G_test: }
+\cs_new_protected:cpn { @@_compile_/Z: }
+ { \@@_compile_anchor_letter:NNN Z \c_true_bool \@@_Z_test: }
+\cs_new_protected:cpn { @@_compile_/z: }
+ { \@@_compile_anchor_letter:NNN z \c_true_bool \@@_Z_test: }
+\cs_new_protected:cpn { @@_compile_/b: }
+ { \@@_compile_anchor_letter:NNN b \c_true_bool \@@_b_test: }
+\cs_new_protected:cpn { @@_compile_/B: }
+ { \@@_compile_anchor_letter:NNN B \c_false_bool \@@_b_test: }
\cs_set_protected:Npn \@@_tmp:w #1#2
{
\cs_new_protected:cpn { @@_compile_#1: }
- { \@@_compile_anchor:NF #2 { \@@_compile_raw:N #1 } }
+ {
+ \@@_if_in_class_or_catcode:TF { \@@_compile_raw:N #1 }
+ {
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \@@_assertion:Nn \c_true_bool {#2} }
+ }
+ }
}
-\exp_args:Nx \@@_tmp:w { \iow_char:N \^ } \l_@@_min_pos_int
-\exp_args:Nx \@@_tmp:w { \iow_char:N \$ } \l_@@_max_pos_int
+\exp_args:Nx \@@_tmp:w { \iow_char:N \^ } { \@@_A_test: }
+\exp_args:Nx \@@_tmp:w { \iow_char:N \$ } { \@@_Z_test: }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_compile_/b:, \@@_compile_/B:}
-% Contrarily to |^| and |$|, which could be implemented without really
-% knowing what precedes in the token list, this requires more
-% information, namely, the knowledge of the last character code.
-% \begin{macrocode}
-\cs_new_protected:cpn { @@_compile_/b: }
- {
- \@@_if_in_class_or_catcode:TF
- { \@@_compile_raw_error:N b }
- {
- \tl_build_put_right:Nn \l_@@_build_tl
- { \@@_assertion:Nn \c_true_bool { \@@_b_test: } }
- }
- }
-\cs_new_protected:cpn { @@_compile_/B: }
- {
- \@@_if_in_class_or_catcode:TF
- { \@@_compile_raw_error:N B }
- {
- \tl_build_put_right:Nn \l_@@_build_tl
- { \@@_assertion:Nn \c_false_bool { \@@_b_test: } }
- }
- }
-% \end{macrocode}
-% \end{macro}
%
% \subsubsection{Character classes}
%
@@ -2853,12 +2875,12 @@
\@@_two_if_eq:NNNNTF #5 #6 \@@_compile_special:N ^
{
\bool_set_false:N \l_@@_internal_bool
- \tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
+ \__kernel_tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
\@@_compile_class_posix_loop:w
}
{
\bool_set_true:N \l_@@_internal_bool
- \tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
+ \__kernel_tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
\@@_compile_class_posix_loop:w #5 #6
}
}
@@ -3239,10 +3261,10 @@
{
\@@_compile_end:
\flag_clear:n { @@_cs }
- \tl_set:Nx \l_@@_internal_a_tl
+ \__kernel_tl_set:Nx \l_@@_internal_a_tl
{
\exp_after:wN \@@_compile_cs_aux:Nn \l_@@_internal_regex
- \q_nil \q_nil \q_recursion_stop
+ \q_@@_nil \q_@@_nil \q_@@_recursion_stop
}
\exp_args:Nx \@@_compile_one:n
{
@@ -3260,12 +3282,13 @@
{
\scan_stop:
\@@_compile_cs_aux:NNnnnN #2
- \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil \q_recursion_stop
+ \q_@@_nil \q_@@_nil \q_@@_nil
+ \q_@@_nil \q_@@_nil \q_@@_nil \q_@@_recursion_stop
\@@_compile_cs_aux:Nn
}
{
- \quark_if_nil:NF #1 { \flag_raise_if_clear:n { @@_cs } }
- \use_none_delimit_by_q_recursion_stop:w
+ \@@_quark_if_nil:NF #1 { \flag_raise_if_clear:n { @@_cs } }
+ \@@_use_none_delimit_by_q_recursion_stop:w
}
}
\cs_new:Npn \@@_compile_cs_aux:NNnnnN #1#2#3#4#5#6
@@ -3284,12 +3307,12 @@
\@@_compile_cs_aux:NNnnnN
}
{
- \quark_if_nil:NF #1
+ \@@_quark_if_nil:NF #1
{
\flag_raise_if_clear:n { @@_cs }
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
}
- \use_none_delimit_by_q_recursion_stop:w
+ \@@_use_none_delimit_by_q_recursion_stop:w
}
}
% \end{macrocode}
@@ -3318,7 +3341,7 @@
{
\@@_two_if_eq:NNNNTF #1 #2 \@@_compile_special:N \c_left_brace_str
{
- \tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
+ \__kernel_tl_set:Nx \l_@@_internal_a_tl { \if_false: } \fi:
\@@_compile_u_loop:NN
}
{
@@ -3375,7 +3398,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_compile_u_in_cs:
{
- \tl_gset:Nx \g_@@_internal_tl
+ \__kernel_tl_gset:Nx \g_@@_internal_tl
{
\exp_args:No \__kernel_str_to_other_fast:n
{ \l_@@_internal_a_tl }
@@ -3476,7 +3499,9 @@
{ \bool_if:NF ##1 { negative~ } assertion:~##2 }
}
\cs_set:Npn \@@_b_test: { word~boundary }
- \cs_set_eq:NN \@@_anchor:N \@@_show_anchor_to_str:N
+ \cs_set:Npn \@@_Z_test: { anchor~at~end~(\iow_char:N\\Z) }
+ \cs_set:Npn \@@_A_test: { anchor~at~start~(\iow_char:N\\A) }
+ \cs_set:Npn \@@_G_test: { anchor~at~start~of~match~(\iow_char:N\\G) }
\cs_set_protected:Npn \@@_item_caseful_equal:n ##1
{ \@@_show_one:n { char~code~\int_eval:n{##1} } }
\cs_set_protected:Npn \@@_item_caseful_range:nn ##1##2
@@ -3619,24 +3644,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[rEXP]{\@@_show_anchor_to_str:N}
-% The argument is an integer telling us where the anchor is. We
-% convert that to the relevant info.
-% \begin{macrocode}
-\cs_new:Npn \@@_show_anchor_to_str:N #1
- {
- anchor~at~
- \str_case:nnF { #1 }
- {
- { \l_@@_min_pos_int } { start~(\iow_char:N\\A) }
- { \l_@@_start_pos_int } { start~of~match~(\iow_char:N\\G) }
- { \l_@@_max_pos_int } { end~(\iow_char:N\\Z) }
- }
- { <error:~'#1'~not~recognized> }
- }
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}{\@@_show_item_catcode:NnT}
% Produce a sequence of categories which the catcode bitmap |#2|
% contains, and show it, indenting the tests on which this catcode
@@ -3663,7 +3670,7 @@
\cs_new_protected:Npn \@@_show_item_exact_cs:n #1
{
\seq_set_split:Nnn \l_@@_internal_seq { \scan_stop: } {#1}
- \seq_set_map:NNn \l_@@_internal_seq
+ \seq_set_map_x:NNn \l_@@_internal_seq
\l_@@_internal_seq { \iow_char:N\\##1 }
\@@_show_one:n
{ control~sequence~ \seq_use:Nn \l_@@_internal_seq { ~or~ } }
@@ -3721,8 +3728,9 @@
% Each state of the \textsc{nfa} is stored in a \tn{toks}. The
% operations which can appear in the \tn{toks} are
% \begin{itemize}
-% \item \cs{@@_action_start_wildcard:} inserted at the start
-% of the regular expression to make it unanchored.
+% \item \cs{@@_action_start_wildcard:N} \meta{boolean} inserted at the
+% start of the regular expression, where a \texttt{true}
+% \meta{boolean} makes it unanchored.
% \item \cs{@@_action_success:} marks the exit state of the
% \textsc{nfa}.
% \item \cs{@@_action_cost:n} \Arg{shift} is a transition from the
@@ -3736,10 +3744,11 @@
% how they detect and avoid infinite loops. For now, we just need to
% know that the \texttt{group} variant must be used for transitions
% back to the start of a group.
-% \item \cs{@@_action_submatch:n} \Arg{key} where the \meta{key} is
-% a group number followed by |<| or |>| for the beginning or end of
-% group. This causes the current position in the query to be stored
-% as the \meta{key} submatch boundary.
+% \item \cs{@@_action_submatch:nN} \Arg{group} \meta{key} where the
+% \meta{key} is |<| or |>| for the beginning or end of group
+% numbered \meta{group}. This causes the current position in the
+% query to be stored as the \meta{key} submatch boundary.
+% \item One of these actions, within a conditional.
% \end{itemize}
%
% We strive to preserve the following properties while building.
@@ -3757,20 +3766,26 @@
% corresponding end-points of nested groups.
% \end{itemize}
%
-% \begin{macro}{\@@_build:n, \@@_build:N}
+% \begin{macro}{\@@_build:n, \@@_build_aux:Nn, \@@_build:N, \@@_build_aux:NN}
% The \texttt{n}-type function first compiles its argument. Reset some
% variables. Allocate two states, and put a wildcard in state $0$
% (transitions to state $1$ and $0$ state). Then build the regex
% within a (capturing) group numbered $0$ (current
% value of \texttt{capturing_group}). Finally, if the match reaches the
-% last state, it is successful.
+% last state, it is successful. A \texttt{false} boolean for argument
+% |#1| for the auxiliaries will suppress the wildcard and make the
+% match anchored: used for \cs{peek_regex:nTF} and similar.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_build:n #1
+\cs_new_protected:Npn \@@_build:n
+ { \@@_build_aux:Nn \c_true_bool }
+\cs_new_protected:Npn \@@_build:N
+ { \@@_build_aux:NN \c_true_bool }
+\cs_new_protected:Npn \@@_build_aux:Nn #1#2
{
- \@@_compile:n {#1}
- \@@_build:N \l_@@_internal_regex
+ \@@_compile:n {#2}
+ \@@_build_aux:NN #1 \l_@@_internal_regex
}
-\cs_new_protected:Npn \@@_build:N #1
+\cs_new_protected:Npn \@@_build_aux:NN #1#2
{
\@@_standard_escapechar:
\int_zero:N \l_@@_capturing_group_int
@@ -3778,8 +3793,8 @@
\@@_build_new_state:
\@@_build_new_state:
\@@_toks_put_right:Nn \l_@@_left_state_int
- { \@@_action_start_wildcard: }
- \@@_group:nnnN {#1} { 1 } { 0 } \c_false_bool
+ { \@@_action_start_wildcard:N #1 }
+ \@@_group:nnnN {#2} { 1 } { 0 } \c_false_bool
\@@_toks_put_right:Nn \l_@@_right_state_int
{ \@@_action_success: }
}
@@ -3790,19 +3805,14 @@
% The matching code relies on some global intarray variables, but only
% uses a range of their entries. Specifically,
% \begin{itemize}
-% \item \cs{g_@@_state_active_intarray} from \cs{l_@@_min_state_int}
-% to $\cs{l_@@_max_state_int}-1$;
-% \item \cs{g_@@_thread_state_intarray} from \cs{l_@@_min_active_int}
-% to $\cs{l_@@_max_active_int}-1$.
+% \item \cs{g_@@_state_active_intarray} from \cs{l_@@_min_state_int}
+% to $\cs{l_@@_max_state_int}-1$;
% \end{itemize}
-% In fact, some data is stored in \tn{toks} registers (local) in the
-% same ranges so these ranges mustn't overlap. This is done by
-% setting \cs{l_@@_min_active_int} to \cs{l_@@_max_state_int} after
-% building the \textsc{nfa}. Here, in this nested call to the
-% matching code, we need the new versions of these ranges to involve
+% Here, in this nested call to the
+% matching code, we need the new versions of this range to involve
% completely new entries of the intarray variables, so we begin by
% setting (the new) \cs{l_@@_min_state_int} to (the old)
-% \cs{l_@@_max_active_int} to use higher entries.
+% \cs{l_@@_max_state_int} to use higher entries.
%
% When using a regex to match a cs, we don't insert a wildcard, we
% anchor at the end, and since we ignore submatches, there is no need
@@ -3812,8 +3822,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_build_for_cs:n #1
{
- \int_set_eq:NN \l_@@_min_state_int \l_@@_max_active_int
- \int_set_eq:NN \l_@@_max_state_int \l_@@_min_state_int
+ \int_set_eq:NN \l_@@_min_state_int \l_@@_max_state_int
\@@_build_new_state:
\@@_build_new_state:
\@@_push_lr_states:
@@ -3821,7 +3830,7 @@
\@@_pop_lr_states:
\@@_toks_put_right:Nn \l_@@_right_state_int
{
- \if_int_compare:w \l_@@_curr_pos_int = \l_@@_max_pos_int
+ \if_int_compare:w -2 = \l_@@_curr_char_int
\exp_after:wN \@@_action_success:
\fi:
}
@@ -4159,8 +4168,8 @@
\cs_new_protected:Npn \@@_group_submatches:nNN #1#2#3
{
\if_int_compare:w #1 > - 1 \exp_stop_f:
- \@@_toks_put_left:Nx #2 { \@@_action_submatch:n { #1 < } }
- \@@_toks_put_left:Nx #3 { \@@_action_submatch:n { #1 > } }
+ \@@_toks_put_left:Nx #2 { \@@_action_submatch:nN {#1} < }
+ \@@_toks_put_left:Nx #3 { \@@_action_submatch:nN {#1} > }
\fi:
}
% \end{macrocode}
@@ -4309,16 +4318,14 @@
%
% \subsubsection{Others}
%
-% \begin{macro}{\@@_assertion:Nn, \@@_b_test:, \@@_anchor:N}
+% \begin{macro}{\@@_assertion:Nn, \@@_b_test:, \@@_A_test:, \@@_G_test:, \@@_Z_test:}
% Usage: \cs{@@_assertion:Nn} \meta{boolean} \Arg{test}, where the
% \meta{test} is either of the two other functions. Add a free
% transition to a new state, conditionally to the assertion test. The
% \cs{@@_b_test:} test is used by the |\b| and |\B| escape: check
% if the last character was a word character or not, and do the same
% to the current character. The boundary-markers of the string are
-% non-word characters for this purpose. Anchors at the start or end
-% of match use \cs{@@_anchor:N}, with a position controlled by the
-% integer |#1|.
+% non-word characters for this purpose.
% \begin{macrocode}
\cs_new_protected:Npn \@@_assertion:Nn #1#2
{
@@ -4338,12 +4345,6 @@
\bool_if:NT #1 { { } }
}
}
-\cs_new_protected:Npn \@@_anchor:N #1
- {
- \if_int_compare:w #1 = \l_@@_curr_pos_int
- \exp_after:wN \@@_break_true:w
- \fi:
- }
\cs_new_protected:Npn \@@_b_test:
{
\group_begin:
@@ -4353,6 +4354,24 @@
{ \group_end: \@@_item_reverse:n \@@_prop_w: }
{ \group_end: \@@_prop_w: }
}
+\cs_new_protected:Npn \@@_Z_test:
+ {
+ \if_int_compare:w -2 = \l_@@_curr_char_int
+ \exp_after:wN \@@_break_true:w
+ \fi:
+ }
+\cs_new_protected:Npn \@@_A_test:
+ {
+ \if_int_compare:w -2 = \l_@@_last_char_int
+ \exp_after:wN \@@_break_true:w
+ \fi:
+ }
+\cs_new_protected:Npn \@@_G_test:
+ {
+ \if_int_compare:w \l_@@_curr_pos_int = \l_@@_start_pos_int
+ \exp_after:wN \@@_break_true:w
+ \fi:
+ }
% \end{macrocode}
% \end{macro}
%
@@ -4365,7 +4384,7 @@
\@@_build_new_state:
\@@_toks_put_right:Nx \l_@@_left_state_int
{
- \@@_action_submatch:n { 0< }
+ \@@_action_submatch:nN { 0 } <
\bool_set_true:N \l_@@_fresh_thread_bool
\@@_action_free:n
{
@@ -4387,7 +4406,8 @@
% transitions, the instruction at the new state of the \textsc{nfa} is
% performed immediately. When a transition consumes a character, the
% new state is appended to a list of \enquote{active states}, stored in
-% \cs{g_@@_thread_state_intarray}: this thread is made active again when the next
+% \cs{g_@@_thread_info_intarray} (together with submatch information):
+% this thread is made active again when the next
% token is read from the query. At every step (for each token in the
% query), we unpack that list of active states and the corresponding
% submatch props, and empty those.
@@ -4431,11 +4451,10 @@
% }
% The tokens in the query are indexed from \texttt{min_pos} for the
% first to $\texttt{max_pos}-1$ for the last, and their information is
-% stored in several arrays and \tn{toks} registers with those numbers. We
-% don't start from $0$ because the \tn{toks} registers with low
-% numbers are used to hold the states of the \textsc{nfa}. We match
+% stored in several arrays and \tn{toks} registers with those numbers.
+% We match
% without backtracking, keeping all threads in lockstep at the
-% \texttt{current_pos} in the query. The starting point of the current
+% \texttt{curr_pos} in the query. The starting point of the current
% match attempt is \texttt{start_pos}, and \texttt{success_pos},
% updated whenever a thread succeeds, is used as the next starting
% position.
@@ -4452,20 +4471,26 @@
% {
% \l_@@_curr_char_int,
% \l_@@_curr_catcode_int,
+% \l_@@_curr_token_tl,
% \l_@@_last_char_int,
+% \l_@@_last_char_success_int,
% \l_@@_case_changed_char_int
% }
% The character and category codes of the token at the current
-% position; the character code of the token at the previous position;
+% position and a token list expanding to that token; the character
+% code of the token at the previous position;
+% the character code of the token just before a successful match;
% and the character code of the result of changing the case of the
% current token (|A-Z|$\leftrightarrow$|a-z|). This last integer is
% only computed when necessary, and is otherwise \cs{c_max_int}. The
-% \texttt{current_char} variable is also used in various other phases
+% \texttt{curr_char} variable is also used in various other phases
% to hold a character code.
% \begin{macrocode}
\int_new:N \l_@@_curr_char_int
\int_new:N \l_@@_curr_catcode_int
+\tl_new:N \l_@@_curr_token_tl
\int_new:N \l_@@_last_char_int
+\int_new:N \l_@@_last_char_success_int
\int_new:N \l_@@_case_changed_char_int
% \end{macrocode}
% \end{variable}
@@ -4481,18 +4506,17 @@
% \end{variable}
%
% \begin{variable}
-% {\l_@@_curr_submatches_prop, \l_@@_success_submatches_prop}
+% {\l_@@_curr_submatches_tl, \l_@@_success_submatches_tl}
% The submatches for the thread which is currently active are stored
-% in the \texttt{current_submatches} property list variable. This
-% property list is stored by \cs{@@_action_cost:n} into the
-% \tn{toks} register for the target state of the transition, to be
-% retrieved when matching at the next position. When a thread
-% succeeds, this property list is copied to
-% \cs{l_@@_success_submatches_prop}: only the last successful thread
+% in the \texttt{curr_submatches} list, which is almost a comma list,
+% but ends with a comma. This list is stored by \cs{@@_store_state:n}
+% into an intarray variable, to be retrieved when matching at the next
+% position. When a thread succeeds, this list is copied to
+% \cs{l_@@_success_submatches_tl}: only the last successful thread
% remains there.
% \begin{macrocode}
-\prop_new:N \l_@@_curr_submatches_prop
-\prop_new:N \l_@@_success_submatches_prop
+\tl_new:N \l_@@_curr_submatches_tl
+\tl_new:N \l_@@_success_submatches_tl
% \end{macrocode}
% \end{variable}
%
@@ -4515,28 +4539,44 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\l_@@_min_active_int, \l_@@_max_active_int}
+% \begin{variable}{\l_@@_min_thread_int, \l_@@_max_thread_int}
% All the currently active threads are kept in order of precedence in
-% \cs{g_@@_thread_state_intarray}, and the corresponding submatches in the
-% \tn{toks}. For our purposes, those serve as an array, indexed from
-% \texttt{min_active} (inclusive) to \texttt{max_active} (excluded).
-% At the start of every step, the whole array is unpacked, so that the
-% space can immediately be reused, and \texttt{max_active} is reset to
-% \texttt{min_active}, effectively clearing the array.
+% \cs{g_@@_thread_info_intarray} together with the corresponding
+% submatch information. Data in this intarray is organized as blocks
+% from \texttt{min_thread} (included) to \texttt{max_thread}
+% (excluded). At the start of every step, the whole array is
+% unpacked, so that the space can immediately be reused, and
+% \texttt{max_thread} is reset to \texttt{min_thread}, effectively
+% clearing the array.
% \begin{macrocode}
-\int_new:N \l_@@_min_active_int
-\int_new:N \l_@@_max_active_int
+\int_new:N \l_@@_min_thread_int
+\int_new:N \l_@@_max_thread_int
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\g_@@_state_active_intarray, \g_@@_thread_state_intarray}
+% \begin{variable}{\g_@@_state_active_intarray, \g_@@_thread_info_intarray}
% \cs{g_@@_state_active_intarray} stores the last \meta{step} in which
-% each \meta{state} was active. \cs{g_@@_thread_state_intarray} stores
+% each \meta{state} was active. \cs{g_@@_thread_info_intarray} stores
% threads to be considered in the next step, more precisely the
% states in which these threads are.
% \begin{macrocode}
\intarray_new:Nn \g_@@_state_active_intarray { 65536 }
-\intarray_new:Nn \g_@@_thread_state_intarray { 65536 }
+\intarray_new:Nn \g_@@_thread_info_intarray { 65536 }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_matched_analysis_tl, \l_@@_curr_analysis_tl}
+% The list \cs{l_@@_curr_analysis_tl} consists of a brace group
+% containing three brace groups corresponding to the current token,
+% with the same syntax as \cs{tl_analysis_map_inline:nn}. The list
+% \cs{l_@@_matched_analysis_tl} (constructed under the
+% \texttt{tl\_build} machinery) has one item for each token that has
+% already been treated so far in a given match attempt: each item
+% consists of three brace groups with the same syntax as
+% \cs{tl_analysis_map_inline:nn}.
+% \begin{macrocode}
+\tl_new:N \l_@@_matched_analysis_tl
+\tl_new:N \l_@@_curr_analysis_tl
% \end{macrocode}
% \end{variable}
%
@@ -4599,8 +4639,7 @@
%
% \begin{macro}{\@@_match:n, \@@_match_cs:n}
% \begin{macro}{\@@_match_init:}
-% First store the query into \tn{toks} registers and arrays (see
-% \cs{@@_query_set:nnn}). Then initialize the variables that should
+% Initialize the variables that should
% be set once for each user function (even for multiple
% matches). Namely, the overall matching is not yet successful; none of
% the states should be marked as visited (\cs{g_@@_state_active_intarray}), and
@@ -4611,38 +4650,26 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_match:n #1
{
- \int_zero:N \l_@@_balance_int
- \int_set:Nn \l_@@_curr_pos_int { 2 * \l_@@_max_state_int }
- \@@_query_set:nnn { } { -1 } { -2 }
- \int_set_eq:NN \l_@@_min_pos_int \l_@@_curr_pos_int
- \tl_analysis_map_inline:nn {#1}
- { \@@_query_set:nnn {##1} {"##3} {##2} }
- \int_set_eq:NN \l_@@_max_pos_int \l_@@_curr_pos_int
- \@@_query_set:nnn { } { -1 } { -2 }
\@@_match_init:
- \@@_match_once:
+ \@@_match_once_init:
+ \tl_analysis_map_inline:nn {#1}
+ { \@@_match_one_token:nnN {##1} {##2} ##3 }
+ \@@_match_one_token:nnN { } { -2 } F
+ \prg_break_point:Nn \@@_maplike_break: { }
}
\cs_new_protected:Npn \@@_match_cs:n #1
{
- \int_zero:N \l_@@_balance_int
- \int_set:Nn \l_@@_curr_pos_int
- {
- \int_max:nn { 2 * \l_@@_max_state_int - \l_@@_min_state_int }
- { \l_@@_max_pos_int }
- + 1
- }
- \@@_query_set:nnn { } { -1 } { -2 }
- \int_set_eq:NN \l_@@_min_pos_int \l_@@_curr_pos_int
+ \int_set_eq:NN \l_@@_min_thread_int \l_@@_max_thread_int
+ \@@_match_init:
+ \@@_match_once_init:
\str_map_inline:nn {#1}
{
- \@@_query_set:nnn { \exp_not:n {##1} }
- { \tl_if_blank:nTF {##1} { 10 } { 12 } }
- { `##1 }
+ \tl_if_blank:nTF {##1}
+ { \@@_match_one_token:nnN {##1} {`##1} A }
+ { \@@_match_one_token:nnN {##1} {`##1} C }
}
- \int_set_eq:NN \l_@@_max_pos_int \l_@@_curr_pos_int
- \@@_query_set:nnn { } { -1 } { -2 }
- \@@_match_init:
- \@@_match_once:
+ \@@_match_one_token:nnN { } { -2 } F
+ \prg_break_point:Nn \@@_maplike_break: { }
}
\cs_new_protected:Npn \@@_match_init:
{
@@ -4653,11 +4680,13 @@
\__kernel_intarray_gset:Nnn
\g_@@_state_active_intarray {##1} { 1 }
}
- \int_set_eq:NN \l_@@_min_active_int \l_@@_max_state_int
\int_zero:N \l_@@_step_int
+ \int_set:Nn \l_@@_min_pos_int { 2 }
\int_set_eq:NN \l_@@_success_pos_int \l_@@_min_pos_int
- \int_set:Nn \l_@@_min_submatch_int
- { 2 * \l_@@_max_state_int }
+ \int_set:Nn \l_@@_last_char_success_int { -2 }
+ \tl_build_begin:N \l_@@_matched_analysis_tl
+ \tl_clear:N \l_@@_curr_analysis_tl
+ \int_set:Nn \l_@@_min_submatch_int { 1 }
\int_set_eq:NN \l_@@_submatch_int \l_@@_min_submatch_int
\bool_set_false:N \l_@@_empty_success_bool
}
@@ -4665,21 +4694,24 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\@@_match_once:}
-% This function finds one match, then does some action defined by the
-% \texttt{every_match} token list, which may recursively call
-% \cs{@@_match_once:}. First initialize some variables: set the
+% \begin{macro}{\@@_match_once_init:}
+% This function resets various variables used when finding one match.
+% It is called before the loop through characters, and every time we
+% find a match, before searching for another match (this is controlled
+% by the \texttt{every_match} token list).
+%
+% First initialize some variables: set the
% conditional which detects identical empty matches; this match
% attempt starts at the previous \texttt{success_pos}, is not yet
% successful, and has no submatches yet; clear the array of active
% threads, and put the starting state $0$ in it. We are then almost
% ready to read our first token in the query, but we actually start
-% one position earlier than the start, and \texttt{get} that token, to
-% set \texttt{last_char} properly for word
-% boundaries. Then call \cs{@@_match_loop:}, which runs through the
-% query until the end or until a successful match breaks early.
+% one position earlier than the start because
+% \cs{@@_match_one_token:nnN} increments \cs{l_@@_curr_pos_int} and
+% saves \cs{l_@@_curr_char_int} as the \texttt{last_char} so that word
+% boundaries can be correctly identified.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_match_once:
+\cs_new_protected:Npn \@@_match_once_init:
{
\if_meaning:w \c_true_bool \l_@@_empty_success_bool
\cs_set:Npn \@@_if_two_empty_matches:F
@@ -4692,14 +4724,24 @@
\fi:
\int_set_eq:NN \l_@@_start_pos_int \l_@@_success_pos_int
\bool_set_false:N \l_@@_match_success_bool
- \prop_clear:N \l_@@_curr_submatches_prop
- \int_set_eq:NN \l_@@_max_active_int \l_@@_min_active_int
+ \tl_set:Nx \l_@@_curr_submatches_tl
+ { \prg_replicate:nn { 2 * \l_@@_capturing_group_int } { 0 , } }
+ \int_set_eq:NN \l_@@_max_thread_int \l_@@_min_thread_int
\@@_store_state:n { \l_@@_min_state_int }
\int_set:Nn \l_@@_curr_pos_int
{ \l_@@_start_pos_int - 1 }
- \@@_query_get:
- \@@_match_loop:
- \l_@@_every_match_tl
+ \int_set_eq:NN \l_@@_curr_char_int \l_@@_last_char_success_int
+ \tl_build_get:NN \l_@@_matched_analysis_tl \l_@@_internal_a_tl
+ \exp_args:NNf \@@_match_once_init_aux:
+ \tl_map_inline:nn
+ { \exp_after:wN \l_@@_internal_a_tl \l_@@_curr_analysis_tl }
+ { \@@_match_one_token:nnN ##1 }
+ \prg_break_point:Nn \@@_maplike_break: { }
+ }
+\cs_new_protected:Npn \@@_match_once_init_aux:
+ {
+ \tl_build_clear:N \l_@@_matched_analysis_tl
+ \tl_clear:N \l_@@_curr_analysis_tl
}
% \end{macrocode}
% \end{macro}
@@ -4717,108 +4759,78 @@
\bool_gset_eq:NN
\g_@@_success_bool
\l_@@_match_success_bool
+ \@@_maplike_break:
}
}
\cs_new_protected:Npn \@@_multi_match:n #1
{
\tl_set:Nn \l_@@_every_match_tl
{
- \if_meaning:w \c_true_bool \l_@@_match_success_bool
- \bool_gset_true:N \g_@@_success_bool
- #1
- \exp_after:wN \@@_match_once:
+ \if_meaning:w \c_false_bool \l_@@_match_success_bool
+ \exp_after:wN \@@_maplike_break:
\fi:
+ \bool_gset_true:N \g_@@_success_bool
+ #1
+ \@@_match_once_init:
}
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_match_loop:}
+% \begin{macro}{\@@_match_one_token:nnN}
% \begin{macro}[rEXP]{\@@_match_one_active:n}
% At each new position, set some variables and get the new character
% and category from the query. Then unpack the array of active
% threads, and clear it by resetting its length
-% (\texttt{max_active}). This results in a sequence of
-% \cs{@@_use_state_and_submatches:nn} \Arg{state} \Arg{prop}, and
+% (\texttt{max_thread}). This results in a sequence of
+% \cs{@@_use_state_and_submatches:w} \meta{state}|,|\meta{submatch-clist}|;| and
% we consider those states one by one in order. As soon as a thread
% succeeds, exit the step, and, if there are threads to consider at the
% next position, and we have not reached the end of the string,
-% repeat the loop. Otherwise, the last thread that succeeded is what
-% \cs{@@_match_once:} matches. We explain the \texttt{fresh_thread}
-% business when describing \cs{@@_action_wildcard:}.
+% repeat the loop. Otherwise, the last thread that succeeded is the
+% match. We explain the \texttt{fresh_thread} business when
+% describing \cs{@@_action_wildcard:}.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_match_loop:
+\cs_new_protected:Npn \@@_match_one_token:nnN #1#2#3
{
\int_add:Nn \l_@@_step_int { 2 }
\int_incr:N \l_@@_curr_pos_int
\int_set_eq:NN \l_@@_last_char_int \l_@@_curr_char_int
\int_set_eq:NN \l_@@_case_changed_char_int \c_max_int
- \@@_query_get:
+ \tl_set:Nn \l_@@_curr_token_tl {#1}
+ \int_set:Nn \l_@@_curr_char_int {#2}
+ \int_set:Nn \l_@@_curr_catcode_int { "#3 }
+ \tl_build_put_right:Nx \l_@@_matched_analysis_tl
+ { \exp_not:o \l_@@_curr_analysis_tl }
+ \tl_set:Nn \l_@@_curr_analysis_tl { { {#1} {#2} #3 } }
\use:x
{
- \int_set_eq:NN \l_@@_max_active_int \l_@@_min_active_int
+ \int_set_eq:NN \l_@@_max_thread_int \l_@@_min_thread_int
\int_step_function:nnN
- { \l_@@_min_active_int }
- { \l_@@_max_active_int - 1 }
+ { \l_@@_min_thread_int }
+ { \l_@@_max_thread_int - 1 }
\@@_match_one_active:n
}
\prg_break_point:
\bool_set_false:N \l_@@_fresh_thread_bool
- \if_int_compare:w \l_@@_max_active_int > \l_@@_min_active_int
- \if_int_compare:w \l_@@_curr_pos_int < \l_@@_max_pos_int
- \exp_after:wN \exp_after:wN \exp_after:wN \@@_match_loop:
+ \if_int_compare:w \l_@@_max_thread_int > \l_@@_min_thread_int
+ \if_int_compare:w -2 < \l_@@_curr_char_int
+ \exp_after:wN \exp_after:wN \exp_after:wN \use_none:n
\fi:
\fi:
+ \l_@@_every_match_tl
}
\cs_new:Npn \@@_match_one_active:n #1
{
- \@@_use_state_and_submatches:nn
- { \__kernel_intarray_item:Nn \g_@@_thread_state_intarray {#1} }
- { \@@_toks_use:w #1 }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_query_set:nnn}
-% The arguments are: tokens that \texttt{o} and \texttt{x} expand to
-% one token of the query, the catcode, and the character code. Store
-% those, and the current brace balance (used later to check for
-% overall brace balance) in a \tn{toks} register and some arrays,
-% then update the \texttt{balance}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_query_set:nnn #1#2#3
- {
- \__kernel_intarray_gset:Nnn \g_@@_charcode_intarray
- { \l_@@_curr_pos_int } {#3}
- \__kernel_intarray_gset:Nnn \g_@@_catcode_intarray
- { \l_@@_curr_pos_int } {#2}
- \__kernel_intarray_gset:Nnn \g_@@_balance_intarray
- { \l_@@_curr_pos_int } { \l_@@_balance_int }
- \@@_toks_set:Nn \l_@@_curr_pos_int {#1}
- \int_incr:N \l_@@_curr_pos_int
- \if_case:w #2 \exp_stop_f:
- \or: \int_incr:N \l_@@_balance_int
- \or: \int_decr:N \l_@@_balance_int
- \fi:
+ \@@_use_state_and_submatches:w
+ \__kernel_intarray_range_to_clist:Nnn
+ \g_@@_thread_info_intarray
+ { 1 + #1 * (\l_@@_capturing_group_int * 2 + 1) }
+ { (1 + #1) * (\l_@@_capturing_group_int * 2 + 1) }
+ ;
}
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\@@_query_get:}
-% Extract the current character and category codes at the current
-% position from the appropriate arrays.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_query_get:
- {
- \l_@@_curr_char_int
- = \__kernel_intarray_item:Nn \g_@@_charcode_intarray
- { \l_@@_curr_pos_int } \scan_stop:
- \l_@@_curr_catcode_int
- = \__kernel_intarray_item:Nn \g_@@_catcode_intarray
- { \l_@@_curr_pos_int } \scan_stop:
- }
-% \end{macrocode}
% \end{macro}
%
% \subsubsection{Using states of the \textsc{nfa}}
@@ -4843,20 +4855,20 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_use_state_and_submatches:nn}
+% \begin{macro}{\@@_use_state_and_submatches:w}
% This function is called as one item in the array of active threads
% after that array has been unpacked for a new step. Update the
-% \texttt{current_state} and \texttt{current_submatches} and use the
+% \texttt{curr_state} and \texttt{curr_submatches} and use the
% state if it has not yet been encountered at this step.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_use_state_and_submatches:nn #1 #2
+\cs_new_protected:Npn \@@_use_state_and_submatches:w #1 , #2 ;
{
\int_set:Nn \l_@@_curr_state_int {#1}
\if_int_compare:w
\__kernel_intarray_item:Nn \g_@@_state_active_intarray
{ \l_@@_curr_state_int }
< \l_@@_step_int
- \tl_set:Nn \l_@@_curr_submatches_prop {#2}
+ \tl_set:Nn \l_@@_curr_submatches_tl { #2 , }
\exp_after:wN \@@_use_state:
\fi:
\scan_stop:
@@ -4866,20 +4878,20 @@
%
% \subsubsection{Actions when matching}
%
-% \begin{macro}{\@@_action_start_wildcard:}
+% \begin{macro}{\@@_action_start_wildcard:N}
% For an unanchored match, state $0$ has a free transition to the next
% and a costly one to itself, to repeat at the next position. To catch
% repeated identical empty matches, we need to know if a successful
% thread corresponds to an empty match. The instruction resetting
% \cs{l_@@_fresh_thread_bool} may be skipped by a successful
-% thread, hence we had to add it to \cs{@@_match_loop:} too.
+% thread, hence we had to add it to \cs{@@_match_one_token:nnN} too.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_action_start_wildcard:
+\cs_new_protected:Npn \@@_action_start_wildcard:N #1
{
\bool_set_true:N \l_@@_fresh_thread_bool
\@@_action_free:n {1}
\bool_set_false:N \l_@@_fresh_thread_bool
- \@@_action_cost:n {0}
+ \bool_if:NT #1 { \@@_action_cost:n {0} }
}
% \end{macrocode}
% \end{macro}
@@ -4918,8 +4930,8 @@
}
\int_set:Nn \l_@@_curr_state_int
{ \int_use:N \l_@@_curr_state_int }
- \tl_set:Nn \exp_not:N \l_@@_curr_submatches_prop
- { \exp_not:o \l_@@_curr_submatches_prop }
+ \tl_set:Nn \exp_not:N \l_@@_curr_submatches_tl
+ { \exp_not:o \l_@@_curr_submatches_tl }
}
}
% \end{macrocode}
@@ -4942,21 +4954,26 @@
%
% \begin{macro}{\@@_store_state:n}
% \begin{macro}{\@@_store_submatches:}
-% Put the given state in \cs{g_@@_thread_state_intarray}, and increment
-% the length of the array. Also store the current submatch in the
-% appropriate \tn{toks}.
+% Put the given state and current submatch information in
+% \cs{g_@@_thread_info_intarray}, and increment the length of the
+% array.
% \begin{macrocode}
\cs_new_protected:Npn \@@_store_state:n #1
{
- \@@_store_submatches:
- \__kernel_intarray_gset:Nnn \g_@@_thread_state_intarray
- { \l_@@_max_active_int } {#1}
- \int_incr:N \l_@@_max_active_int
+ \exp_args:No \@@_store_submatches:nn
+ \l_@@_curr_submatches_tl {#1}
+ \int_incr:N \l_@@_max_thread_int
}
-\cs_new_protected:Npn \@@_store_submatches:
+\cs_new_protected:Npn \@@_store_submatches:nn #1#2
{
- \@@_toks_set:No \l_@@_max_active_int
- { \l_@@_curr_submatches_prop }
+ \__kernel_intarray_gset_range_from_clist:Nnn
+ \g_@@_thread_info_intarray
+ {
+ \@@_int_eval:w
+ 1 + \l_@@_max_thread_int *
+ (\l_@@_capturing_group_int * 2 + 1)
+ }
+ { #2 , #1 }
}
% \end{macrocode}
% \end{macro}
@@ -4970,21 +4987,37 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_disable_submatches:
{
- \cs_set_protected:Npn \@@_store_submatches: { }
- \cs_set_protected:Npn \@@_action_submatch:n ##1 { }
+ \cs_set_protected:Npn \@@_store_submatches:n ##1 { }
+ \cs_set_protected:Npn \@@_action_submatch:nN ##1##2 { }
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_action_submatch:n}
+% \begin{macro}{\@@_action_submatch:nN, \@@_action_submatch_aux:w, \@@_action_submatch_auxii:w, \@@_action_submatch_auxiii:w, \@@_action_submatch_auxiv:w}
% Update the current submatches with the information from the current
% position. Maybe a bottleneck.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_action_submatch:n #1
+\cs_new_protected:Npn \@@_action_submatch:nN #1#2
{
- \prop_put:Nno \l_@@_curr_submatches_prop {#1}
- { \int_use:N \l_@@_curr_pos_int }
+ \exp_after:wN \@@_action_submatch_aux:w
+ \l_@@_curr_submatches_tl ; {#1} #2
}
+\cs_new_protected:Npn \@@_action_submatch_aux:w #1 ; #2#3
+ {
+ \tl_set:Nx \l_@@_curr_submatches_tl
+ {
+ \prg_replicate:nn
+ { #2 \if_meaning:w > #3 + \l_@@_capturing_group_int \fi: }
+ { \@@_action_submatch_auxii:w }
+ \@@_action_submatch_auxiii:w
+ #1
+ }
+ }
+\cs_new:Npn \@@_action_submatch_auxii:w
+ #1 \@@_action_submatch_auxiii:w #2 ,
+ { #2 , #1 \@@_action_submatch_auxiii:w }
+\cs_new:Npn \@@_action_submatch_auxiii:w #1 ,
+ { \int_use:N \l_@@_curr_pos_int , }
% \end{macrocode}
% \end{macro}
%
@@ -5006,8 +5039,10 @@
\bool_set_eq:NN \l_@@_empty_success_bool
\l_@@_fresh_thread_bool
\int_set_eq:NN \l_@@_success_pos_int \l_@@_curr_pos_int
- \prop_set_eq:NN \l_@@_success_submatches_prop
- \l_@@_curr_submatches_prop
+ \int_set_eq:NN \l_@@_last_char_success_int \l_@@_last_char_int
+ \tl_build_clear:N \l_@@_matched_analysis_tl
+ \tl_set_eq:NN \l_@@_success_submatches_tl
+ \l_@@_curr_submatches_tl
\prg_break:
}
}
@@ -5098,6 +5133,14 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_replacement_exp_not:V}
+% This is used for the implementation of~|\u|, and it gets redefined
+% for \cs{peek_regex_replace_once:nnTF}.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_replacement_exp_not:V \exp_not:V
+% \end{macrocode}
+% \end{macro}
+%
% \subsubsection{Query and brace balance}
%
% \begin{macro}[rEXP]{\@@_query_range:nn}
@@ -5153,42 +5196,25 @@
% range is the difference between the brace balances at the
% \meta{max~pos} and \meta{min~pos}. These two positions are found in
% the corresponding \enquote{submatch} arrays.
-%^^A todo: understand when these int_compare are needed
% \begin{macrocode}
\cs_new_protected:Npn \@@_submatch_balance:n #1
{
\int_eval:n
- {
- \int_compare:nNnTF
- {
- \__kernel_intarray_item:Nn
- \g_@@_submatch_end_intarray {#1}
- }
- = 0
- { 0 }
- {
- \__kernel_intarray_item:Nn \g_@@_balance_intarray
- {
- \__kernel_intarray_item:Nn
- \g_@@_submatch_end_intarray {#1}
- }
- }
- -
- \int_compare:nNnTF
- {
- \__kernel_intarray_item:Nn
- \g_@@_submatch_begin_intarray {#1}
- }
- = 0
- { 0 }
- {
- \__kernel_intarray_item:Nn \g_@@_balance_intarray
- {
- \__kernel_intarray_item:Nn
- \g_@@_submatch_begin_intarray {#1}
- }
- }
- }
+ {
+ \@@_intarray_item:NnF \g_@@_balance_intarray
+ {
+ \__kernel_intarray_item:Nn
+ \g_@@_submatch_end_intarray {#1}
+ }
+ { 0 }
+ -
+ \@@_intarray_item:NnF \g_@@_balance_intarray
+ {
+ \__kernel_intarray_item:Nn
+ \g_@@_submatch_begin_intarray {#1}
+ }
+ { 0 }
+ }
}
% \end{macrocode}
% \end{macro}
@@ -5269,6 +5295,14 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\@@_replacement_put:n}
+% This gets redefined for \cs{peek_regex_replace_once:nnTF}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_replacement_put:n
+ { \tl_build_put_right:Nn \l_@@_build_tl }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_replacement_normal:n}
% Most characters are simply sent to the output by
% \cs{tl_build_put_right:Nn}, unless a particular category code has been
@@ -5278,11 +5312,13 @@
% sequence is non-empty there: it contains an empty entry
% corresponding to the initial value of
% \cs{l_@@_replacement_category_tl}.
+% The argument |#1| can be a space, otherwise it is a single
+% character.
% \begin{macrocode}
\cs_new_protected:Npn \@@_replacement_normal:n #1
{
\tl_if_empty:NTF \l_@@_replacement_category_tl
- { \tl_build_put_right:Nn \l_@@_build_tl {#1} }
+ { \@@_replacement_put:n {#1} }
{ % (
\token_if_eq_charcode:NNTF #1 )
{
@@ -5325,7 +5361,7 @@
%
% \subsubsection{Submatches}
%
-% \begin{macro}{\@@_replacement_put_submatch:n}
+% \begin{macro}{\@@_replacement_put_submatch:n, \@@_replacement_put_submatch_aux:n}
% Insert a submatch in the replacement text. This is dropped if the
% submatch number is larger than the number of capturing groups.
% Unless the submatch appears inside a |\c{...}| or |\u{...}|
@@ -5338,15 +5374,19 @@
\cs_new_protected:Npn \@@_replacement_put_submatch:n #1
{
\if_int_compare:w #1 < \l_@@_capturing_group_int
- \tl_build_put_right:Nn \l_@@_build_tl
- { \@@_query_submatch:n { \int_eval:n { #1 + ##1 } } }
- \if_int_compare:w \l_@@_replacement_csnames_int = 0 \exp_stop_f:
- \tl_put_right:Nn \l_@@_balance_tl
- {
- + \@@_submatch_balance:n
- { \exp_not:N \int_eval:n { #1 + ##1 } }
- }
- \fi:
+ \@@_replacement_put_submatch_aux:n {#1}
+ \fi:
+ }
+\cs_new_protected:Npn \@@_replacement_put_submatch_aux:n #1
+ {
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \@@_query_submatch:n { \int_eval:n { #1 + ##1 } } }
+ \if_int_compare:w \l_@@_replacement_csnames_int = 0 \exp_stop_f:
+ \tl_put_right:Nn \l_@@_balance_tl
+ {
+ + \@@_submatch_balance:n
+ { \exp_not:N \int_eval:n { #1 + ##1 } }
+ }
\fi:
}
% \end{macrocode}
@@ -5452,7 +5492,7 @@
{
\@@_two_if_eq:NNNNTF
#1 #2 \@@_replacement_normal:n \c_left_brace_str
- { \@@_replacement_cu_aux:Nw \exp_not:V }
+ { \@@_replacement_cu_aux:Nw \@@_replacement_exp_not:V }
{ \@@_replacement_error:NNN u #1#2 }
}
% \end{macrocode}
@@ -5543,7 +5583,7 @@
\cs_new_protected:Npn \@@_replacement_char:nNN #1#2#3
{
\tex_lccode:D 0 = `#3 \scan_stop:
- \tex_lowercase:D { \tl_build_put_right:Nn \l_@@_build_tl {#1} }
+ \tex_lowercase:D { \@@_replacement_put:n {#1} }
}
% \end{macrocode}
% \end{macro}
@@ -5589,7 +5629,7 @@
\cs_new_protected:Npn \@@_replacement_c_C:w #1#2
{
\tl_build_put_right:Nn \l_@@_build_tl
- { \exp_not:N \exp_not:N \exp_not:c {#2} }
+ { \exp_not:N \@@_replacement_exp_not:N \exp_not:c {#2} }
}
% \end{macrocode}
% \end{macro}
@@ -5676,7 +5716,7 @@
\__kernel_msg_error:nn { kernel } { replacement-null-space }
\fi:
\tex_lccode:D `\ = `#2 \scan_stop:
- \tex_lowercase:D { \tl_build_put_right:Nn \l_@@_build_tl {~} }
+ \tex_lowercase:D { \@@_replacement_put:n {~} }
}
% \end{macrocode}
% \end{macro}
@@ -5904,6 +5944,14 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\g_@@_balance_intarray}
+% The first thing we do when matching is to store the balance of
+% begin-group/end-group characters into \cs{g_@@_balance_intarray}.
+% \begin{macrocode}
+\intarray_new:Nn \g_@@_balance_intarray { 65536 }
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\@@_return:}
% This function triggers either \cs{prg_return_false:} or
% \cs{prg_return_true:} as appropriate to whether a match was found or
@@ -5920,6 +5968,36 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_query_set:n, \@@_query_set_aux:nN}
+% To easily extract subsets of the input once we found the positions
+% at which to cut, store the input tokens one by one into successive
+% \tn{toks} registers. Also store the brace balance (used to check
+% for overall brace balance) in an array.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_query_set:n #1
+ {
+ \int_zero:N \l_@@_balance_int
+ \int_zero:N \l_@@_curr_pos_int
+ \@@_query_set_aux:nN { } F
+ \tl_analysis_map_inline:nn {#1}
+ { \@@_query_set_aux:nN {##1} ##3 }
+ \@@_query_set_aux:nN { } F
+ \int_set_eq:NN \l_@@_max_pos_int \l_@@_curr_pos_int
+ }
+\cs_new_protected:Npn \@@_query_set_aux:nN #1#2
+ {
+ \int_incr:N \l_@@_curr_pos_int
+ \@@_toks_set:Nn \l_@@_curr_pos_int {#1}
+ \__kernel_intarray_gset:Nnn \g_@@_balance_intarray
+ { \l_@@_curr_pos_int } { \l_@@_balance_int }
+ \if_case:w "#2 \exp_stop_f:
+ \or: \int_incr:N \l_@@_balance_int
+ \or: \int_decr:N \l_@@_balance_int
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \subsubsection{Matching}
%
% \begin{macro}{\@@_if_match:nn}
@@ -5975,6 +6053,7 @@
#1
\@@_match:n {#2}
\@@_extract:
+ \@@_query_set:n {#2}
\@@_group_end_extract_seq:N #3
}
\cs_new_protected:Npn \@@_extract_all:nnN #1#2#3
@@ -5983,6 +6062,7 @@
\@@_multi_match:n { \@@_extract: }
#1
\@@_match:n {#2}
+ \@@_query_set:n {#2}
\@@_group_end_extract_seq:N #3
}
% \end{macrocode}
@@ -6022,7 +6102,7 @@
}
#1
\@@_match:n {#2}
-%<assert>\assert_int:n { \l_@@_curr_pos_int = \l_@@_max_pos_int }
+ \@@_query_set:n {#2}
\__kernel_intarray_gset:Nnn \g_@@_submatch_prev_intarray
{ \l_@@_submatch_int } { 0 }
\__kernel_intarray_gset:Nnn \g_@@_submatch_end_intarray
@@ -6073,7 +6153,7 @@
{ \flag_height:n { @@_end } }
{ \flag_height:n { @@_begin } }
}
- \seq_set_map:NNn \l_@@_internal_seq \l_@@_internal_seq {##1}
+ \seq_set_map_x:NNn \l_@@_internal_seq \l_@@_internal_seq {##1}
\exp_args:NNNo
\group_end:
\tl_set:Nn #1 { \l_@@_internal_seq }
@@ -6107,18 +6187,15 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}
-% {\@@_extract:, \@@_extract_b:wn, \@@_extract_e:wn}
-% Our task here is to extract from the property list
-% \cs{l_@@_success_submatches_prop} the list of end-points of
-% submatches, and store them in appropriate array entries, from
-% \cs{l_@@_zeroth_submatch_int} upwards. We begin by emptying those
-% entries. Then for each \meta{key}--\meta{value} pair in
-% the property list update the appropriate entry. This
-% is somewhat a hack: the \meta{key} is a non-negative integer
-% followed by |<| or |>|, which we use in a comparison to $-1$. At the
-% end, store the information about the position at which the match
-% attempt started, in \cs{g_@@_submatch_prev_intarray}.
+% \begin{macro}{\@@_extract:}
+% Our task here is to store the list of end-points of submatches, and
+% store them in appropriate array entries, from
+% \cs{l_@@_zeroth_submatch_int} upwards. First, we store in
+% \cs{g_@@_submatch_prev_intarray} the position at which the match
+% attempt started. We extract the rest from the comma list
+% \cs{l_@@_success_submatches_tl}, which starts with entries to be
+% stored in \cs{g_@@_submatch_begin_intarray} and continues with
+% entries for \cs{g_@@_submatch_end_intarray}.
% \begin{macrocode}
\cs_new_protected:Npn \@@_extract:
{
@@ -6126,34 +6203,26 @@
\int_set_eq:NN \l_@@_zeroth_submatch_int \l_@@_submatch_int
\prg_replicate:nn \l_@@_capturing_group_int
{
- \__kernel_intarray_gset:Nnn \g_@@_submatch_begin_intarray
- { \l_@@_submatch_int } { 0 }
- \__kernel_intarray_gset:Nnn \g_@@_submatch_end_intarray
- { \l_@@_submatch_int } { 0 }
\__kernel_intarray_gset:Nnn \g_@@_submatch_prev_intarray
{ \l_@@_submatch_int } { 0 }
\int_incr:N \l_@@_submatch_int
}
- \prop_map_inline:Nn \l_@@_success_submatches_prop
+ \__kernel_intarray_gset:Nnn \g_@@_submatch_prev_intarray
+ { \l_@@_zeroth_submatch_int } { \l_@@_start_pos_int }
+ \int_zero:N \l_@@_internal_a_int
+ \clist_map_inline:Nn \l_@@_success_submatches_tl
{
- \if_int_compare:w ##1 - 1 \exp_stop_f:
- \exp_after:wN \@@_extract_e:wn \int_value:w
+ \if_int_compare:w \l_@@_internal_a_int < \l_@@_capturing_group_int
+ \__kernel_intarray_gset:Nnn \g_@@_submatch_begin_intarray
+ { \@@_int_eval:w \l_@@_zeroth_submatch_int + \l_@@_internal_a_int } {##1}
\else:
- \exp_after:wN \@@_extract_b:wn \int_value:w
+ \__kernel_intarray_gset:Nnn \g_@@_submatch_end_intarray
+ { \@@_int_eval:w \l_@@_zeroth_submatch_int + \l_@@_internal_a_int - \l_@@_capturing_group_int } {##1}
\fi:
- \@@_int_eval:w \l_@@_zeroth_submatch_int + ##1 {##2}
+ \int_incr:N \l_@@_internal_a_int
}
- \__kernel_intarray_gset:Nnn \g_@@_submatch_prev_intarray
- { \l_@@_zeroth_submatch_int } { \l_@@_start_pos_int }
\fi:
}
-\cs_new_protected:Npn \@@_extract_b:wn #1 < #2
- {
- \__kernel_intarray_gset:Nnn
- \g_@@_submatch_begin_intarray {#1} {#2}
- }
-\cs_new_protected:Npn \@@_extract_e:wn #1 > #2
- { \__kernel_intarray_gset:Nnn \g_@@_submatch_end_intarray {#1} {#2} }
% \end{macrocode}
% \end{macro}
%
@@ -6178,18 +6247,19 @@
\group_begin:
\@@_single_match:
#1
- \@@_replacement:n {#2}
- \exp_args:No \@@_match:n { #3 }
+ \exp_args:No \@@_match:n {#3}
\if_meaning:w \c_false_bool \g_@@_success_bool
\group_end:
\else:
\@@_extract:
+ \exp_args:No \@@_query_set:n {#3}
+ \@@_replacement:n {#2}
\int_set:Nn \l_@@_balance_int
{
\@@_replacement_balance_one_match:n
{ \l_@@_zeroth_submatch_int }
}
- \tl_set:Nx \l_@@_internal_a_tl
+ \__kernel_tl_set:Nx \l_@@_internal_a_tl
{
\@@_replacement_do_one_match:n
{ \l_@@_zeroth_submatch_int }
@@ -6223,8 +6293,9 @@
\group_begin:
\@@_multi_match:n { \@@_extract: }
#1
- \@@_replacement:n {#2}
\exp_args:No \@@_match:n {#3}
+ \exp_args:No \@@_query_set:n {#3}
+ \@@_replacement:n {#2}
\int_set:Nn \l_@@_balance_int
{
0
@@ -6234,7 +6305,7 @@
{ \l_@@_submatch_int - 1 }
\@@_replacement_balance_one_match:n
}
- \tl_set:Nx \l_@@_internal_a_tl
+ \__kernel_tl_set:Nx \l_@@_internal_a_tl
{
\int_step_function:nnnN
{ \l_@@_min_submatch_int }
@@ -6284,7 +6355,375 @@
% \end{macrocode}
% \end{macro}
%
-% \subsubsection{Storing and showing compiled patterns}
+% \subsubsection{Peeking ahead}
+%
+% \begin{variable}{\l_@@_peek_true_tl, \l_@@_peek_false_tl}
+% True/false code arguments of \cs{peek_regex:nTF} or similar.
+% \begin{macrocode}
+\tl_new:N \l_@@_peek_true_tl
+\tl_new:N \l_@@_peek_false_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_replacement_tl}
+% When peeking in \cs{peek_regex_replace_once:nnTF} we need to store
+% the replacement text.
+% \begin{macrocode}
+\tl_new:N \l_@@_replacement_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_input_tl}
+% \begin{macro}{\@@_input_item:n}
+% Stores each token found as \cs{@@_input_item:n} \Arg{tokens}, where
+% the \meta{tokens} \texttt{o}-expand to the token found, as for
+% \cs{tl_analysis_map_inline:nn}.
+% \begin{macrocode}
+\tl_new:N \l_@@_input_tl
+\cs_new_eq:NN \@@_input_item:n ?
+% \end{macrocode}
+% \end{macro}
+% \end{variable}
+%
+% \begin{macro}[TF]
+% {\peek_regex:n, \peek_regex:N, \peek_regex_remove_once:n, \peek_regex_remove_once:N}
+% The |T| and |F| functions just call the corresponding |TF| function.
+% The four |TF| functions differ along two axes: whether to remove the
+% token or not, distinguished by using \cs{@@_peek_end:} or
+% \cs{@@_peek_remove_end:n} (the latter case needs an argument, as we
+% will see), and whether the regex has to be compiled or is already in
+% an |N|-type variable, distinguished by calling \cs{@@_build_aux:Nn}
+% or \cs{@@_build_aux:NN}. The first argument of these functions is
+% \cs{c_false_bool} to indicate that there should be no implicit
+% insertion of a wildcard at the start of the pattern: otherwise the
+% code would keep looking further into the input stream until matching
+% the regex.
+% \begin{macrocode}
+\cs_new_protected:Npn \peek_regex:nTF #1
+ {
+ \@@_peek:nnTF
+ { \@@_build_aux:Nn \c_false_bool {#1} }
+ { \@@_peek_end: }
+ }
+\cs_new_protected:Npn \peek_regex:nT #1#2
+ { \peek_regex:nTF {#1} {#2} { } }
+\cs_new_protected:Npn \peek_regex:nF #1 { \peek_regex:nTF {#1} { } }
+\cs_new_protected:Npn \peek_regex:NTF #1
+ {
+ \@@_peek:nnTF
+ { \@@_build_aux:NN \c_false_bool #1 }
+ { \@@_peek_end: }
+ }
+\cs_new_protected:Npn \peek_regex:NT #1#2
+ { \peek_regex:NTF #1 {#2} { } }
+\cs_new_protected:Npn \peek_regex:NF #1 { \peek_regex:NTF {#1} { } }
+\cs_new_protected:Npn \peek_regex_remove_once:nTF #1
+ {
+ \@@_peek:nnTF
+ { \@@_build_aux:Nn \c_false_bool {#1} }
+ { \@@_peek_remove_end:n {##1} }
+ }
+\cs_new_protected:Npn \peek_regex_remove_once:nT #1#2
+ { \peek_regex_remove_once:nTF {#1} {#2} { } }
+\cs_new_protected:Npn \peek_regex_remove_once:nF #1
+ { \peek_regex_remove_once:nTF {#1} { } }
+\cs_new_protected:Npn \peek_regex_remove_once:NTF #1
+ {
+ \@@_peek:nnTF
+ { \@@_build_aux:NN \c_false_bool #1 }
+ { \@@_peek_remove_end:n {##1} }
+ }
+\cs_new_protected:Npn \peek_regex_remove_once:NT #1#2
+ { \peek_regex_remove_once:NTF #1 {#2} { } }
+\cs_new_protected:Npn \peek_regex_remove_once:NF #1
+ { \peek_regex_remove_once:NTF #1 { } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_peek:nnTF, \@@_peek_aux:nnTF}
+% Store the user's true/false codes (plus \cs{group_end:}) into two
+% token lists. Then build the automaton with |#1|, without submatch
+% tracking, and aiming for a single match. Then start matching by
+% setting up a few variables like for any regex matching like
+% \cs{regex_match:nnTF}, with the addition of \cs{l_@@_input_tl}
+% that keeps track of the tokens seen, to reinsert them at the
+% end. Instead of \cs{tl_analysis_map_inline:nn} on the input, we
+% call \cs{peek_analysis_map_inline:n} to go through tokens in the
+% input stream. Since \cs{@@_match_one_token:nnN} calls
+% \cs{@@_maplike_break:} we need to catch that and break the
+% \cs{peek_analysis_map_inline:n} loop instead.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek:nnTF #1
+ {
+ \@@_peek_aux:nnTF
+ {
+ \@@_disable_submatches:
+ #1
+ }
+ }
+\cs_new_protected:Npn \@@_peek_aux:nnTF #1#2#3#4
+ {
+ \group_begin:
+ \tl_set:Nn \l_@@_peek_true_tl { \group_end: #3 }
+ \tl_set:Nn \l_@@_peek_false_tl { \group_end: #4 }
+ \@@_single_match:
+ #1
+ \@@_match_init:
+ \tl_build_clear:N \l_@@_input_tl
+ \@@_match_once_init:
+ \peek_analysis_map_inline:n
+ {
+ \tl_build_put_right:Nn \l_@@_input_tl
+ { \@@_input_item:n {##1} }
+ \@@_match_one_token:nnN {##1} {##2} ##3
+ \use_none:nnn
+ \prg_break_point:Nn \@@_maplike_break:
+ { \peek_analysis_map_break:n {#2} }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_peek_end:, \@@_peek_remove_end:n}
+% Once the regex matches (or permanently fails to match) we call
+% \cs{@@_peek_end:}, or \cs{@@_peek_remove_end:n} with argument the
+% last token seen. For \cs{peek_regex:nTF} we reinsert tokens seen by
+% calling \cs{@@_peek_reinsert:N} regardless of the result of the
+% match. For \cs{peek_regex_remove_once:nTF} we reinsert the tokens
+% seen only if the match failed; otherwise we just reinsert the
+% tokens~|#1|, with one expansion. To be more precise, |#1| consists
+% of tokens that \texttt{o}-expand and \texttt{x}-expand to the last
+% token seen, for example it is \cs{exp_not:N} \meta{cs} for a control
+% sequence. This means that just doing \cs{exp_after:wN}
+% \cs{l_@@_peek_true_tl} |#1| would be unsafe because the expansion of
+% \meta{cs} would be suppressed.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_end:
+ {
+ \bool_if:NTF \g_@@_success_bool
+ { \@@_peek_reinsert:N \l_@@_peek_true_tl }
+ { \@@_peek_reinsert:N \l_@@_peek_false_tl }
+ }
+\cs_new_protected:Npn \@@_peek_remove_end:n #1
+ {
+ \bool_if:NTF \g_@@_success_bool
+ { \exp_args:NNo \use:nn \l_@@_peek_true_tl {#1} }
+ { \@@_peek_reinsert:N \l_@@_peek_false_tl }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_peek_reinsert:N, \@@_reinsert_item:n}
+% Insert the true/false code |#1|, followed by the tokens found, which
+% were stored in \cs{l_@@_input_tl}. For this, loop through that
+% token list using \cs{@@_reinsert_item:n}, which expands |#1| once to
+% get a single token, and jumps over it to expand what follows, with
+% suitable \cs{exp:w} and \cs{exp_end:}. We cannot just use
+% \cs{use:e} on the whole token list because the result may be
+% unbalanced, which would stop the primitive prematurely, or let it
+% continue beyond where we would like.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_reinsert:N #1
+ {
+ \tl_build_end:N \l_@@_input_tl
+ \cs_set_eq:NN \@@_input_item:n \@@_reinsert_item:n
+ \exp_after:wN #1 \exp:w \l_@@_input_tl \exp_end:
+ }
+\cs_new_protected:Npn \@@_reinsert_item:n #1
+ {
+ \exp_after:wN \exp_after:wN
+ \exp_after:wN \exp_end:
+ \exp_after:wN \exp_after:wN
+ #1
+ \exp:w
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[noTF]
+% {\peek_regex_replace_once:nn, \peek_regex_replace_once:Nn}
+% Similar to \cs{peek_regex:nTF} above.
+% \begin{macrocode}
+\cs_new_protected:Npn \peek_regex_replace_once:nnTF #1
+ { \@@_peek_replace:nnTF { \@@_build_aux:Nn \c_false_bool {#1} } }
+\cs_new_protected:Npn \peek_regex_replace_once:nnT #1#2#3
+ { \peek_regex_replace_once:nnTF {#1} {#2} {#3} { } }
+\cs_new_protected:Npn \peek_regex_replace_once:nnF #1#2
+ { \peek_regex_replace_once:nnTF {#1} {#2} { } }
+\cs_new_protected:Npn \peek_regex_replace_once:nn #1#2
+ { \peek_regex_replace_once:nnTF {#1} {#2} { } { } }
+\cs_new_protected:Npn \peek_regex_replace_once:NnTF #1
+ { \@@_peek_replace:nnTF { \@@_build_aux:NN \c_false_bool #1 } }
+\cs_new_protected:Npn \peek_regex_replace_once:NnT #1#2#3
+ { \peek_regex_replace_once:NnTF #1 {#2} {#3} { } }
+\cs_new_protected:Npn \peek_regex_replace_once:NnF #1#2
+ { \peek_regex_replace_once:NnTF #1 {#2} { } }
+\cs_new_protected:Npn \peek_regex_replace_once:Nn #1#2
+ { \peek_regex_replace_once:NnTF #1 {#2} { } { } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_peek_replace:nnTF}
+% Same as \cs{@@_peek:nnTF} (used for \cs{peek_regex:nTF} above), but
+% without disabling submatches, and with a different end. The
+% replacement text |#2| is stored, to be analyzed later.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_replace:nnTF #1#2
+ {
+ \tl_set:Nn \l_@@_replacement_tl {#2}
+ \@@_peek_aux:nnTF {#1} { \@@_peek_replace_end: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_peek_replace_end:}
+% If the match failed \cs{@@_peek_reinsert:N} reinserts the tokens
+% found. Otherwise, finish storing the submatch information using
+% \cs{@@_extract:}, and store the input into \tn{toks}. Redefine a
+% few auxiliaries to change slightly their expansion behaviour as
+% explained below. Analyse the replacement text with
+% \cs{@@_replacement:n}, which as usual defines
+% \cs{@@_replacement_do_one_match:n} to insert the tokens from the
+% start of the match attempt to the beginning of the match, followed
+% by the replacement text. The \cs{use:x} expands for instance the
+% trailing \cs{@@_query_range:nn} down to a sequence of
+% \cs{@@_reinsert_item:n} \Arg{tokens} where \meta{tokens}
+% \texttt{o}-expand to a single token that we want to insert. After
+% \texttt{x}-expansion, \cs{use:x} does \cs{use:n}, so we have
+% \cs{exp_after:wN} \cs{l_@@_peek_true_tl} \cs{exp:w} \ldots{}
+% \cs{exp_end:}. This is set up such as to obtain
+% \cs{l_@@_peek_true_tl} followed by the replaced tokens (possibly
+% unbalanced) in the input stream.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_replace_end:
+ {
+ \bool_if:NTF \g_@@_success_bool
+ {
+ \@@_extract:
+ \@@_query_set_from_input_tl:
+ \cs_set_eq:NN \@@_replacement_put:n \@@_peek_replacement_put:n
+ \cs_set_eq:NN \@@_replacement_put_submatch_aux:n
+ \@@_peek_replacement_put_submatch_aux:n
+ \cs_set_eq:NN \@@_input_item:n \@@_reinsert_item:n
+ \cs_set_eq:NN \@@_replacement_exp_not:N \@@_peek_replacement_token:n
+ \cs_set_eq:NN \@@_replacement_exp_not:V \@@_peek_replacement_var:N
+ \exp_args:No \@@_replacement:n { \l_@@_replacement_tl }
+ \use:x
+ {
+ \exp_not:n { \exp_after:wN \l_@@_peek_true_tl \exp:w }
+ \@@_replacement_do_one_match:n
+ { \l_@@_zeroth_submatch_int }
+ \@@_query_range:nn
+ {
+ \__kernel_intarray_item:Nn \g_@@_submatch_end_intarray
+ { \l_@@_zeroth_submatch_int }
+ }
+ { \l_@@_max_pos_int }
+ \exp_end:
+ }
+ }
+ { \@@_peek_reinsert:N \l_@@_peek_false_tl }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_query_set_from_input_tl:, \@@_query_set_item:n}
+% The input was stored into \cs{l_@@_input_tl} as successive items
+% \cs{@@_input_item:n} \Arg{tokens}. Store that in successive
+% \tn{toks}. It's not clear whether the empty entries before and
+% after are both useful.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_query_set_from_input_tl:
+ {
+ \tl_build_end:N \l_@@_input_tl
+ \int_zero:N \l_@@_curr_pos_int
+ \cs_set_eq:NN \@@_input_item:n \@@_query_set_item:n
+ \@@_query_set_item:n { }
+ \l_@@_input_tl
+ \@@_query_set_item:n { }
+ \int_set_eq:NN \l_@@_max_pos_int \l_@@_curr_pos_int
+ }
+\cs_new_protected:Npn \@@_query_set_item:n #1
+ {
+ \int_incr:N \l_@@_curr_pos_int
+ \@@_toks_set:Nn \l_@@_curr_pos_int { \@@_input_item:n {#1} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_peek_replacement_put:n}
+% While building the replacement function
+% \cs{@@_replacement_do_one_match:n}, we often want to put simple
+% material, given as |#1|, whose \texttt{x}-expansion
+% \texttt{o}-expands to a single token. Normally we can just add the
+% token to \cs{l_@@_build_tl}, but for
+% \cs{peek_regex_replace_once:nnTF} we eventually want to do some
+% strange expansion that is basically using \cs{exp_after:wN} to jump
+% through numerous tokens (we cannot use \texttt{x}-expansion like for
+% \cs{regex_replace_once:nnNTF} because it is ok for the result to be
+% unbalanced since we insert it in the input stream rather than
+% storing it. When within a csname we don't do any such shenanigan
+% because \cs{cs:w} \ldots{} \cs{cs_end:} does all the expansion we
+% need.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_replacement_put:n #1
+ {
+ \if_case:w \l_@@_replacement_csnames_int
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \exp_not:N \@@_reinsert_item:n {#1} }
+ \else:
+ \tl_build_put_right:Nn \l_@@_build_tl {#1}
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_peek_replacement_token:n}
+% When hit with \cs{exp:w}, \cs{@@_peek_replacement_token:n}
+% \Arg{token} stops \cs{exp_end:} and does \cs{exp_after:wN}
+% \meta{token} \cs{exp:w} to continue expansion after it.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_replacement_token:n #1
+ { \exp_after:wN \exp_end: \exp_after:wN #1 \exp:w }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_peek_replacement_put_submatch_aux:n}
+% While analyzing the replacement we also have to insert submatches
+% found in the query. Since query items \cs{@@_input_item:n}
+% \Arg{tokens} expand correctly only when surrounded by \cs{exp:w}
+% \ldots{} \cs{exp_end:}, and since these expansion controls are not
+% there within csnames (because \cs{cs:w} \ldots{} \cs{cs_end:} make
+% them unnecessary in most cases), we have to put \cs{exp:w} and
+% \cs{exp_end:} by hand here.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_replacement_put_submatch_aux:n #1
+ {
+ \if_case:w \l_@@_replacement_csnames_int
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \@@_query_submatch:n { \int_eval:n { #1 + ##1 } } }
+ \else:
+ \tl_build_put_right:Nn \l_@@_build_tl
+ { \exp:w \@@_query_submatch:n { \int_eval:n { #1 + ##1 } } \exp_end: }
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_peek_replacement_var:N}
+% This is used for |\u| outside csnames. It makes sure to continue
+% expansion with \cs{exp:w} before expanding the variable~|#1| and
+% stopping the \cs{exp:w} that precedes.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_replacement_var:N #1
+ {
+ \exp_after:wN \exp_last_unbraced:NV
+ \exp_after:wN \exp_end:
+ \exp_after:wN #1
+ \exp:w
+ }
+% \end{macrocode}
+% \end{macro}
%
% \subsection{Messages}
%
@@ -6594,6 +7033,13 @@
}
% \end{macrocode}
%
+% Some escaped alphanumerics are not allowed everywhere.
+% \begin{macrocode}
+\__kernel_msg_new:nnnn { kernel } { backwards-quantifier }
+ { Quantifer~"{#1,#2}"~is~backwards. }
+ { The~values~given~in~a~quantifier~must~be~in~order. }
+% \end{macrocode}
+%
% Used when showing a regex.
% \begin{macrocode}
\__kernel_msg_new:nnn { kernel } { show-regex }
@@ -6680,7 +7126,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
@@ -6690,8 +7136,6 @@
%^^A NOT IMPLEMENTED
%^^A \p{xx} a character with the xx property
%^^A \P{xx} a character without the xx property
-%^^A [[:xxx:]] positive POSIX named set
-%^^A [[:^xxx:]] negative POSIX named set
%^^A (?=...) positive look ahead
%^^A (?!...) negative look ahead
%^^A (?<=...) positive look behind
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
index 44ce65943db..046f42b8c5e 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
@@ -2,7 +2,7 @@
%
%% File: l3seq.dtx
%
-% Copyright (C) 1990-2020 The LaTeX3 Project
+% Copyright (C) 1990-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -139,7 +139,7 @@
% this space trimming behaviour is identical to that of
% \pkg{l3clist} functions. Empty \meta{items} are preserved by
% \cs{seq_set_split:Nnn}, and can be removed afterwards using
-% \cs{seq_remove_all:Nn} \meta{sequence} \Arg{}.
+% \cs{seq_remove_all:Nn} \meta{sequence} |{}|.
% The \meta{delimiter} may not contain |{|, |}| or |#|
% (assuming \TeX{}'s normal category code r\'egime).
% If the \meta{delimiter} is empty, the \meta{token list} is split
@@ -551,14 +551,14 @@
% \end{syntax}
% Analogue of \cs{seq_map_function:NN} which maps several tokens
% instead of a single function. The \meta{code} receives each item in
-% the \meta{sequence} as two trailing brace groups. For instance,
+% the \meta{sequence} as a trailing brace group. For instance,
% \begin{verbatim}
% \seq_map_tokens:Nn \l_my_seq { \prg_replicate:nn { 2 } }
% \end{verbatim}
% expands to twice each item in the \meta{sequence}: for each item in
% |\l_my_seq| the function \cs{prg_replicate:nn} receives |2| and
% \meta{item} as its two arguments. The function
-% \cs{seq_map_inline:Nn} is typically faster but is not expandable.
+% \cs{seq_map_inline:Nn} is typically faster but it is not expandable.
% \end{function}
%
% \begin{function}[updated = 2012-06-29]
@@ -578,6 +578,26 @@
% \meta{items} are returned from left to right.
% \end{function}
%
+% \begin{function}[rEXP,added = 2018-05-03]{\seq_map_indexed_function:NN}
+% \begin{syntax}
+% \cs{seq_map_indexed_function:NN} \meta{seq~var} \meta{function}
+% \end{syntax}
+% Applies \meta{function} to every entry in the \meta{sequence
+% variable}. The \meta{function} should have signature |:nn|. It
+% receives two arguments for each iteration: the \meta{index} (namely
+% |1| for the first entry, then |2| and so on) and the \meta{item}.
+% \end{function}
+%
+% \begin{function}[added = 2018-05-03]{\seq_map_indexed_inline:Nn}
+% \begin{syntax}
+% \cs{seq_map_indexed_inline:Nn} \meta{seq~var} \Arg{inline function}
+% \end{syntax}
+% Applies \meta{inline function} to every entry in the \meta{sequence
+% variable}. The \meta{inline function} should consist of code which
+% receives the \meta{index} (namely |1| for the first entry, then |2|
+% and so on) as~|#1| and the \meta{item} as~|#2|.
+% \end{function}
+%
% \begin{function}[rEXP, updated = 2012-06-29]{\seq_map_break:}
% \begin{syntax}
% \cs{seq_map_break:}
@@ -633,6 +653,40 @@
% \end{texnote}
% \end{function}
%
+% \begin{function}[added = 2011-12-22, updated = 2020-07-16]
+% {\seq_set_map:NNn, \seq_gset_map:NNn}
+% \begin{syntax}
+% \cs{seq_set_map:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function}
+% \end{syntax}
+% Applies \meta{inline function} to every \meta{item} stored
+% within the \meta{sequence_2}. The \meta{inline function} should
+% consist of code which will receive the \meta{item} as |#1|.
+% The sequence resulting applying \meta{inline function} to each
+% \meta{item} is assigned to \meta{sequence_1}.
+% \begin{texnote}
+% Contrarily to other mapping functions, \cs{seq_map_break:} cannot
+% be used in this function, and would lead to low-level \TeX{} errors.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}[added = 2020-07-16]
+% {\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+% \begin{syntax}
+% \cs{seq_set_map_x:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function}
+% \end{syntax}
+% Applies \meta{inline function} to every \meta{item} stored
+% within the \meta{sequence_2}. The \meta{inline function} should
+% consist of code which will receive the \meta{item} as |#1|.
+% The sequence resulting from \texttt{x}-expanding
+% \meta{inline function} applied to each \meta{item}
+% is assigned to \meta{sequence_1}. As such, the code
+% in \meta{inline function} should be expandable.
+% \begin{texnote}
+% Contrarily to other mapping functions, \cs{seq_map_break:} cannot
+% be used in this function, and would lead to low-level \TeX{} errors.
+% \end{texnote}
+% \end{function}
+%
% \begin{function}[EXP, added = 2012-07-13]{\seq_count:N, \seq_count:c}
% \begin{syntax}
% \cs{seq_count:N} \meta{sequence}
@@ -934,7 +988,7 @@
% \TestFiles{m3seq002,m3seq003}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -985,6 +1039,14 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Private scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\@@_item:n}
% The delimiter is always defined, but when used incorrectly simply
% removes its argument and hits an undefined control sequence to
@@ -1103,22 +1165,22 @@
% \begin{macrocode}
\cs_new_protected:Npn \seq_set_from_clist:NN #1#2
{
- \tl_set:Nx #1
+ \__kernel_tl_set:Nx #1
{ \s_@@ \clist_map_function:NN #2 \@@_wrap_item:n }
}
\cs_new_protected:Npn \seq_set_from_clist:Nn #1#2
{
- \tl_set:Nx #1
+ \__kernel_tl_set:Nx #1
{ \s_@@ \clist_map_function:nN {#2} \@@_wrap_item:n }
}
\cs_new_protected:Npn \seq_gset_from_clist:NN #1#2
{
- \tl_gset:Nx #1
+ \__kernel_tl_gset:Nx #1
{ \s_@@ \clist_map_function:NN #2 \@@_wrap_item:n }
}
\cs_new_protected:Npn \seq_gset_from_clist:Nn #1#2
{
- \tl_gset:Nx #1
+ \__kernel_tl_gset:Nx #1
{ \s_@@ \clist_map_function:nN {#2} \@@_wrap_item:n }
}
\cs_generate_variant:Nn \seq_set_from_clist:NN { Nc }
@@ -1176,9 +1238,9 @@
% braces which are outermost after space trimming.
% \begin{macrocode}
\cs_new_protected:Npn \seq_set_split:Nnn
- { \@@_set_split:NNnn \tl_set:Nx }
+ { \@@_set_split:NNnn \__kernel_tl_set:Nx }
\cs_new_protected:Npn \seq_gset_split:Nnn
- { \@@_set_split:NNnn \tl_gset:Nx }
+ { \@@_set_split:NNnn \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_set_split:NNnn #1#2#3#4
{
\tl_if_empty:nTF {#3}
@@ -1198,7 +1260,7 @@
\@@_set_split_end:
\@@_set_split_auxi:w \prg_do_nothing:
}
- \tl_set:Nx \l_@@_internal_a_tl { \l_@@_internal_a_tl }
+ \__kernel_tl_set:Nx \l_@@_internal_a_tl { \l_@@_internal_a_tl }
}
#1 #2 { \s_@@ \l_@@_internal_a_tl }
}
@@ -1267,7 +1329,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \seq_put_left:Nn #1#2
{
- \tl_set:Nx #1
+ \__kernel_tl_set:Nx #1
{
\exp_not:n { \s_@@ \@@_item:n {#2} }
\exp_not:f { \exp_after:wN \@@_put_left_aux:w #1 }
@@ -1275,7 +1337,7 @@
}
\cs_new_protected:Npn \seq_gput_left:Nn #1#2
{
- \tl_gset:Nx #1
+ \__kernel_tl_gset:Nx #1
{
\exp_not:n { \s_@@ \@@_item:n {#2} }
\exp_not:f { \exp_after:wN \@@_put_left_aux:w #1 }
@@ -1386,9 +1448,9 @@
% \texttt{x}-type expansion (|#1 #2 {#2}|) ensures that nothing is lost.
% \begin{macrocode}
\cs_new_protected:Npn \seq_remove_all:Nn
- { \@@_remove_all_aux:NNn \tl_set:Nx }
+ { \@@_remove_all_aux:NNn \__kernel_tl_set:Nx }
\cs_new_protected:Npn \seq_gremove_all:Nn
- { \@@_remove_all_aux:NNn \tl_gset:Nx }
+ { \@@_remove_all_aux:NNn \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_remove_all_aux:NNn #1#2#3
{
\@@_push_item_def:n
@@ -1453,9 +1515,9 @@
% from the stack, and the memory consumption becomes linear.
% \begin{macrocode}
\cs_new_protected:Npn \seq_reverse:N
- { \@@_reverse:NN \tl_set:Nx }
+ { \@@_reverse:NN \__kernel_tl_set:Nx }
\cs_new_protected:Npn \seq_greverse:N
- { \@@_reverse:NN \tl_gset:Nx }
+ { \@@_reverse:NN \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_reverse:NN #1 #2
{
\cs_set_eq:NN \@@_tmp:w \@@_item:n
@@ -1525,9 +1587,11 @@
}
{
\group_begin:
- \cs_set_eq:NN \@@_item:n \@@_shuffle_item:n
\int_zero:N \l_@@_internal_a_int
+ \@@_push_item_def:
+ \cs_gset_eq:NN \@@_item:n \@@_shuffle_item:n
#2
+ \@@_pop_item_def:
\seq_gset_from_inline_x:Nnn \g_@@_internal_seq
{ \int_step_function:nN { \l_@@_internal_a_int } }
{ \tex_the:D \tex_toks:D ##1 }
@@ -1640,13 +1704,13 @@
% \begin{macrocode}
\cs_new_protected:Npn \seq_get_left:NN #1#2
{
- \tl_set:Nx #2
+ \__kernel_tl_set:Nx #2
{
\exp_after:wN \@@_get_left:wnw
- #1 \@@_item:n { \q_no_value } \q_stop
+ #1 \@@_item:n { \q_no_value } \s_@@_stop
}
}
-\cs_new:Npn \@@_get_left:wnw #1 \@@_item:n #2#3 \q_stop
+\cs_new:Npn \@@_get_left:wnw #1 \@@_item:n #2#3 \s_@@_stop
{ \exp_not:n {#2} }
\cs_generate_variant:Nn \seq_get_left:NN { c }
% \end{macrocode}
@@ -1668,9 +1732,9 @@
\cs_new_protected:Npn \seq_gpop_left:NN
{ \@@_pop:NNNN \@@_pop_left:NNN \tl_gset:Nn }
\cs_new_protected:Npn \@@_pop_left:NNN #1#2#3
- { \exp_after:wN \@@_pop_left:wnwNNN #2 \q_stop #1#2#3 }
+ { \exp_after:wN \@@_pop_left:wnwNNN #2 \s_@@_stop #1#2#3 }
\cs_new_protected:Npn \@@_pop_left:wnwNNN
- #1 \@@_item:n #2#3 \q_stop #4#5#6
+ #1 \@@_item:n #2#3 \s_@@_stop #4#5#6
{
#4 #5 { #1 #3 }
\tl_set:Nn #6 {#2}
@@ -1692,7 +1756,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \seq_get_right:NN #1#2
{
- \tl_set:Nx #2
+ \__kernel_tl_set:Nx #2
{
\exp_after:wN \use_i_ii:nnn
\exp_after:wN \@@_get_right_loop:nw
@@ -1733,9 +1797,9 @@
% finally stops the loop.
% \begin{macrocode}
\cs_new_protected:Npn \seq_pop_right:NN
- { \@@_pop:NNNN \@@_pop_right:NNN \tl_set:Nx }
+ { \@@_pop:NNNN \@@_pop_right:NNN \__kernel_tl_set:Nx }
\cs_new_protected:Npn \seq_gpop_right:NN
- { \@@_pop:NNNN \@@_pop_right:NNN \tl_gset:Nx }
+ { \@@_pop:NNNN \@@_pop_right:NNN \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \@@_pop_right:NNN #1#2#3
{
\cs_set_eq:NN \@@_tmp:w \@@_item:n
@@ -1747,7 +1811,7 @@
#2
{
\if_false: { \fi: }
- \tl_set:Nx #3
+ \__kernel_tl_set:Nx #3
}
{ } \use_none:nn
\cs_set_eq:NN \@@_item:n \@@_tmp:w
@@ -1795,10 +1859,10 @@
{ \@@_pop_TF:NNNN \@@_pop_left:NNN \tl_gset:Nn #1 #2 }
\prg_new_protected_conditional:Npnn \seq_pop_right:NN #1#2
{ T , F , TF }
- { \@@_pop_TF:NNNN \@@_pop_right:NNN \tl_set:Nx #1 #2 }
+ { \@@_pop_TF:NNNN \@@_pop_right:NNN \__kernel_tl_set:Nx #1 #2 }
\prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2
{ T , F , TF }
- { \@@_pop_TF:NNNN \@@_pop_right:NNN \tl_gset:Nx #1 #2 }
+ { \@@_pop_TF:NNNN \@@_pop_right:NNN \__kernel_tl_gset:Nx #1 #2 }
\prg_generate_conditional_variant:Nnn \seq_pop_left:NN { c }
{ T , F , TF }
\prg_generate_conditional_variant:Nnn \seq_gpop_left:NN { c }
@@ -1821,8 +1885,8 @@
% of being empty, terminating the loop and returning nothing at all.
% \begin{macrocode}
\cs_new:Npn \seq_item:Nn #1
- { \exp_after:wN \@@_item:wNn #1 \q_stop #1 }
-\cs_new:Npn \@@_item:wNn \s_@@ #1 \q_stop #2#3
+ { \exp_after:wN \@@_item:wNn #1 \s_@@_stop #1 }
+\cs_new:Npn \@@_item:wNn \s_@@ #1 \s_@@_stop #2#3
{
\exp_args:Nf \@@_item:nwn
{ \exp_args:Nf \@@_item:nN { \int_eval:n {#3} } #2 }
@@ -2008,6 +2072,89 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}
+% {
+% \seq_map_indexed_function:NN, \seq_map_indexed_inline:Nn,
+% \@@_map_indexed:nNN, \@@_map_indexed:Nw
+% }
+% Similar to \cs{seq_map_function:NN} but we keep track of the item
+% index as a |;|-delimited argument of \cs{@@_map_indexed:Nw}.
+% \begin{macrocode}
+\cs_new:Npn \seq_map_indexed_function:NN #1#2
+ {
+ \@@_map_indexed:NN #1#2
+ \prg_break_point:Nn \seq_map_break: { }
+ }
+\cs_new_protected:Npn \seq_map_indexed_inline:Nn #1#2
+ {
+ \int_gincr:N \g__kernel_prg_map_int
+ \cs_gset_protected:cpn
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w } ##1##2 {#2}
+ \exp_args:NNc \@@_map_indexed:NN #1
+ { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
+ \prg_break_point:Nn \seq_map_break:
+ { \int_gdecr:N \g__kernel_prg_map_int }
+ }
+\cs_new:Npn \@@_map_indexed:NN #1#2
+ {
+ \exp_after:wN \@@_map_indexed:Nw
+ \exp_after:wN #2
+ \int_value:w 1
+ \exp_after:wN \use_i:nn
+ \exp_after:wN ;
+ #1
+ \prg_break: \@@_item:n { } \prg_break_point:
+ }
+\cs_new:Npn \@@_map_indexed:Nw #1#2 ; #3 \@@_item:n #4
+ {
+ #3
+ #1 {#2} {#4}
+ \exp_after:wN \@@_map_indexed:Nw
+ \exp_after:wN #1
+ \int_value:w \int_eval:w 1 + #2 ;
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+% \begin{macro}{\@@_set_map_x:NNNn}
+% Very similar to \cs{seq_set_filter:NNn}. We could actually
+% merge the two within a single function, but it would have weird
+% semantics.
+% \begin{macrocode}
+\cs_new_protected:Npn \seq_set_map_x:NNn
+ { \@@_set_map_x:NNNn \__kernel_tl_set:Nx }
+\cs_new_protected:Npn \seq_gset_map_x:NNn
+ { \@@_set_map_x:NNNn \__kernel_tl_gset:Nx }
+\cs_new_protected:Npn \@@_set_map_x:NNNn #1#2#3#4
+ {
+ \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
+ #1 #2 { #3 }
+ \@@_pop_item_def:
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\seq_set_map:NNn, \seq_gset_map:NNn}
+% \begin{macro}{\@@_set_map:NNNn}
+% Similar to \cs{seq_set_map_x:NNn}, but prevents expansion of the
+% <inline function>.
+% \begin{macrocode}
+\cs_new_protected:Npn \seq_set_map:NNn
+ { \@@_set_map:NNNn \__kernel_tl_set:Nx }
+\cs_new_protected:Npn \seq_gset_map:NNn
+ { \@@_set_map:NNNn \__kernel_tl_gset:Nx }
+\cs_new_protected:Npn \@@_set_map:NNNn #1#2#3#4
+ {
+ \@@_push_item_def:n { \exp_not:n { \@@_item:n {#4} } }
+ #1 #2 { #3 }
+ \@@_pop_item_def:
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\seq_count:N, \seq_count:c}
% \begin{macro}{\@@_count:w, \@@_count_end:w}
% Since counting the items in a sequence is quite common, we optimize
@@ -2068,9 +2215,9 @@
}
{
\exp_after:wN \@@_use_setup:w #1 \@@_item:n
- \q_mark { \@@_use:nwwwwnwn {#3} }
- \q_mark { \@@_use:nwwn {#4} }
- \q_stop { }
+ \s_@@_mark { \@@_use:nwwwwnwn {#3} }
+ \s_@@_mark { \@@_use:nwwn {#4} }
+ \s_@@_stop { }
}
}
{
@@ -2083,12 +2230,12 @@
\cs_new:Npn \@@_use_setup:w \s_@@ { \@@_use:nwwwwnwn { } }
\cs_new:Npn \@@_use:nwwwwnwn
#1 \@@_item:n #2 \@@_item:n #3 \@@_item:n #4#5
- \q_mark #6#7 \q_stop #8
+ \s_@@_mark #6#7 \s_@@_stop #8
{
#6 \@@_item:n {#3} \@@_item:n {#4} #5
- \q_mark {#6} #7 \q_stop { #8 #1 #2 }
+ \s_@@_mark {#6} #7 \s_@@_stop { #8 #1 #2 }
}
-\cs_new:Npn \@@_use:nwwn #1 \@@_item:n #2 #3 \q_stop #4
+\cs_new:Npn \@@_use:nwwn #1 \@@_item:n #2 #3 \s_@@_stop #4
{ \exp_not:n { #4 #1 #2 } }
\cs_new:Npn \seq_use:Nn #1#2
{ \seq_use:Nnnn #1 {#2} {#2} {#2} }
@@ -2210,7 +2357,7 @@
% \end{variable}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
index 364ff13e324..97eaef163d2 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
@@ -2,8 +2,8 @@
%
%% File: l3skip.dtx
%
-% Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX3 Project
-% (C) 2012-2020 The LaTeX3 Project
+% Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX Project
+% (C) 2012-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -1065,7 +1065,7 @@
% \section{\pkg{l3skip} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -1087,18 +1087,33 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_none_delimit_by_s_stop:w}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Creating and initialising \texttt{dim} variables}
%
% \begin{macro}{\dim_new:N, \dim_new:c}
% Allocating \meta{dim} registers \ldots
% \begin{macrocode}
-%<*package>
\cs_new_protected:Npn \dim_new:N #1
{
\__kernel_chk_if_free_cs:N #1
\cs:w newdimen \cs_end: #1
}
-%</package>
\cs_generate_variant:Nn \dim_new:N { c }
% \end{macrocode}
% \end{macro}
@@ -1337,7 +1352,7 @@
\cs_new:Npn \@@_compare:w #1 \@@_compare_error:
{
\exp_after:wN \if_false: \exp:w \exp_end_continue_f:w
- \@@_compare:wNN #1 ? { = \@@_compare_end:w \else: } \q_stop
+ \@@_compare:wNN #1 ? { = \@@_compare_end:w \else: } \s_@@_stop
}
\exp_args:Nno \use:nn
{ \cs_new:Npn \@@_compare:wNN #1 } { \tl_to_str:n {pt} #2#3 }
@@ -1347,7 +1362,7 @@
\fi:
#1 pt \exp_stop_f:
\prg_return_false:
- \exp_after:wN \use_none_delimit_by_q_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_s_stop:w
\fi:
\reverse_if:N \if_dim:w #1 pt #2
\exp_after:wN \@@_compare:wNN
@@ -1361,7 +1376,7 @@
#1 \reverse_if:N #2 < #3 = { #1 #2 > #3 }
\cs_new:cpn { @@_compare_ > :w }
#1 \reverse_if:N #2 > #3 = { #1 #2 < #3 }
-\cs_new:Npn \@@_compare_end:w #1 \prg_return_false: #2 \q_stop
+\cs_new:Npn \@@_compare_end:w #1 \prg_return_false: #2 \s_@@_stop
{ #1 \prg_return_false: \else: \prg_return_true: \fi: }
\cs_new_protected:Npn \@@_compare_error:
{
@@ -1403,14 +1418,14 @@
\exp_args:Nf \@@_case:nnTF { \dim_eval:n {#1} } {#2} { } { }
}
\cs_new:Npn \@@_case:nnTF #1#2#3#4
- { \@@_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
+ { \@@_case:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
\cs_new:Npn \@@_case:nw #1#2#3
{
\dim_compare:nNnTF {#1} = {#2}
{ \@@_case_end:nw {#3} }
{ \@@_case:nw {#1} }
}
-\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
{ \exp_end: #1 #4 }
% \end{macrocode}
% \end{macro}
@@ -1766,16 +1781,21 @@
%<@@=skip>
% \end{macrocode}
%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\skip_new:N, \skip_new:c}
% Allocation of a new internal registers.
% \begin{macrocode}
-%<*package>
\cs_new_protected:Npn \skip_new:N #1
{
\__kernel_chk_if_free_cs:N #1
\cs:w newskip \cs_end: #1
}
-%</package>
\cs_generate_variant:Nn \skip_new:N { c }
% \end{macrocode}
% \end{macro}
@@ -1914,9 +1934,9 @@
{
\exp_after:wN \@@_if_finite:wwNw
\skip_use:N \tex_glueexpr:D ##1 ; \prg_return_false:
- #1 ; \prg_return_true: \q_stop
+ #1 ; \prg_return_true: \s_@@_stop
}
- \cs_new:Npn \@@_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \q_stop {##3}
+ \cs_new:Npn \@@_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \s_@@_stop {##3}
}
\exp_args:No \@@_tmp:w { \tl_to_str:n { fil } }
% \end{macrocode}
@@ -2020,13 +2040,11 @@
% \begin{macro}{\muskip_new:N, \muskip_new:c}
% And then we add muskips.
% \begin{macrocode}
-%<*package>
\cs_new_protected:Npn \muskip_new:N #1
{
\__kernel_chk_if_free_cs:N #1
\cs:w newmuskip \cs_end: #1
}
-%</package>
\cs_generate_variant:Nn \muskip_new:N { c }
% \end{macrocode}
% \end{macro}
@@ -2218,7 +2236,7 @@
% \end{variable}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
index d26ecdcf280..13b94daf67a 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
@@ -2,7 +2,7 @@
%
%% File l3sort.dtx
%
-% Copyright (C) 2012-2020 The LaTeX3 Project
+% Copyright (C) 2012-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -112,7 +112,7 @@
% \section{\pkg{l3sort} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -199,6 +199,14 @@
% \end{variable}
% \end{variable}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \subsection{Finding available \tn{toks} registers}
%
% \begin{macro}{\@@_shrink_range:}
@@ -263,12 +271,8 @@
% In \ConTeXt{} MkIV the range is from
% $|\c_syst_last_allocated_toks|+1$ to \cs{c_max_register_int}, and in
% MkII it is from $|\lastallocatedtoks|+1$ to \cs{c_max_register_int}.
-% In all these cases, call \cs{@@_shrink_range:}. The \LaTeX3 format
-% mode is easiest: no \tn{toks} are ever allocated so available
-% \tn{toks} range from $0$ to \cs{c_max_register_int} and we
-% precompute the result of \cs{@@_shrink_range:}.
+% In all these cases, call \cs{@@_shrink_range:}.
% \begin{macrocode}
-%<*package>
\cs_new_protected:Npn \@@_compute_range:
{
\int_set:Nn \l_@@_min_int { \tex_count:D 15 + 1 }
@@ -314,17 +318,6 @@
}
}
}
-%</package>
-%<*initex>
-\int_const:Nn \c_@@_max_length_int
- { ( \c_max_register_int + 1 ) * 3 / 4 }
-\cs_new_protected:Npn \@@_compute_range:
- {
- \int_set:Nn \l_@@_min_int { 0 }
- \int_set:Nn \l_@@_true_max_int { \c_max_register_int + 1 }
- \int_set:Nn \l_@@_max_int { \c_@@_max_length_int }
- }
-%</initex>
% \end{macrocode}
% \end{variable}
% \end{macro}
@@ -344,7 +337,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_main:NNNn #1#2#3#4
{
-%<package> \@@_disable_toksdef:
+ \@@_disable_toksdef:
\@@_compute_range:
\int_set_eq:NN \l_@@_top_int \l_@@_min_int
#1 #3
@@ -383,7 +376,7 @@
{
\group_begin:
\@@_main:NNNn \tl_map_inline:Nn \tl_map_break:n #2 {#3}
- \tl_gset:Nx \g_@@_internal_tl
+ \__kernel_tl_gset:Nx \g_@@_internal_tl
{ \@@_tl_toks:w \l_@@_min_int ; }
\group_end:
#1 #2 \g_@@_internal_tl
@@ -555,7 +548,7 @@
\prg_do_nothing:
\@@_return_mark:w
\@@_return_mark:w
- \q_mark
+ \s_@@_mark
\@@_return_none_error:
}
% \end{macrocode}
@@ -567,7 +560,7 @@
% Each comparison should call \cs{sort_return_same:} or
% \cs{sort_return_swapped:} exactly once. If neither is called,
% \cs{@@_return_none_error:} is called, since the \texttt{return_mark}
-% removes tokens until \cs{q_mark}. If one is called, the
+% removes tokens until \cs{s_@@_mark}. If one is called, the
% \texttt{return_mark} auxiliary removes everything except
% \cs{@@_return_same:w} (or its \texttt{swapped} analogue) followed by
% \cs{@@_return_none_error:}. Finally if two or more are called,
@@ -575,26 +568,26 @@
% so that it produces an error.
% \begin{macrocode}
\cs_new_protected:Npn \sort_return_same:
- #1 \@@_return_mark:w #2 \q_mark
+ #1 \@@_return_mark:w #2 \s_@@_mark
{
#1
#2
\@@_return_two_error:
\@@_return_mark:w
- \q_mark
+ \s_@@_mark
\@@_return_same:w
}
\cs_new_protected:Npn \sort_return_swapped:
- #1 \@@_return_mark:w #2 \q_mark
+ #1 \@@_return_mark:w #2 \s_@@_mark
{
#1
#2
\@@_return_two_error:
\@@_return_mark:w
- \q_mark
+ \s_@@_mark
\@@_return_swapped:w
}
-\cs_new_protected:Npn \@@_return_mark:w #1 \q_mark { }
+\cs_new_protected:Npn \@@_return_mark:w #1 \s_@@_mark { }
\cs_new_protected:Npn \@@_return_none_error:
{
\__kernel_msg_error:nnxx { kernel } { return-none }
@@ -707,7 +700,7 @@
% \tl_if_blank:nF {#1}
% {
% \__sort:nnNnn { } { } #2
-% #1 \q_recursion_tail \q_recursion_stop
+% #1 \q__sort_recursion_tail \q__sort_recursion_stop
% }
% }
% \cs_new:Npn \__sort:nnNnn #1#2#3#4#5
@@ -742,7 +735,7 @@
% ~~~~~~\meta{extra arguments}\\
% ~~|}|\\
% \cs{@@_loop:wNn}~\ldots{}~\meta{prepared tokens}\\
-% ~~\meta{end-loop}~|{}|~\cs{q_stop}
+% ~~\meta{end-loop}~|{}|~\cs{s_@@_stop}
% \end{quote}
% In this example, which matches the structure of
% \cs{@@_quick_split_i:NnnnnNn} and a few other functions below, the
@@ -782,13 +775,13 @@
%
% The third speed up is to avoid |\use:ff| using a continuation-passing
% style: \cs{@@_quick_split:NnNn} expects a list followed by
-% \cs{q_mark} \Arg{code}, and expands to \meta{code} \meta{sorted list}.
+% \cs{s_@@_mark} \Arg{code}, and expands to \meta{code} \meta{sorted list}.
% Sorting the two parts of the list around the pivot is done with
% \begin{quote}
% \ttfamily
-% \cs{@@_quick_split:NnNn} |#2| \ldots{} \cs{q_mark}\\
+% \cs{@@_quick_split:NnNn} |#2| \ldots{} \cs{s_@@_mark}\\
% ~~|{|\\
-% ~~~~\cs{@@_quick_split:NnNn} |#1| \ldots{} \cs{q_mark} \Arg{code}\\
+% ~~~~\cs{@@_quick_split:NnNn} |#1| \ldots{} \cs{s_@@_mark} \Arg{code}\\
% ~~~~\Arg{pivot}\\
% ~~|}|
% \end{quote}
@@ -823,7 +816,7 @@
% argument of the third \cs{use:n}, hence must remain in memory, and so
% on. The memory consumption grows quadratically with the number of
% nested \cs{use:n}. In practice, this means that we must read
-% everything until a trailing \cs{q_stop} once in a while, otherwise
+% everything until a trailing \cs{s_@@_stop} once in a while, otherwise
% sorting lists of more than a few thousand items would exhaust a
% typical \TeX{}'s memory.
%
@@ -846,8 +839,8 @@
% \texttt{prepare_end} auxiliary finds the prepared token list
% as~|#4|. The scene is then set up for \cs{@@_quick_split:NnNn},
% which sorts the prepared list and perform the post action placed
-% after \cs{q_mark}, namely removing the trailing \cs{s_stop} and
-% \cs{q_stop} and leaving \cs{exp_stop_f:} to stop
+% after \cs{s_@@_mark}, namely removing the trailing \cs{s_@@_stop} and
+% \cs{s_@@_stop} and leaving \cs{exp_stop_f:} to stop
% \texttt{f}-expansion.
% \begin{macrocode}
\cs_new:Npn \tl_sort:nN #1#2
@@ -859,7 +852,7 @@
\@@_quick_prepare:Nnnn #2 { } { }
#1
{ \prg_break_point: \@@_quick_prepare_end:NNNnw }
- \q_stop
+ \s_@@_stop
}
}
}
@@ -868,13 +861,13 @@
\prg_break: #4 \prg_break_point:
\@@_quick_prepare:Nnnn #1 { #2 #3 } { #1 {#4} }
}
-\cs_new:Npn \@@_quick_prepare_end:NNNnw #1#2#3#4#5 \q_stop
+\cs_new:Npn \@@_quick_prepare_end:NNNnw #1#2#3#4#5 \s_@@_stop
{
\@@_quick_split:NnNn #4 \@@_quick_end:nnTFNn { }
- \q_mark { \@@_quick_cleanup:w \exp_stop_f: }
- \s_stop \q_stop
+ \s_@@_mark { \@@_quick_cleanup:w \exp_stop_f: }
+ \s_@@_mark \s_@@_stop
}
-\cs_new:Npn \@@_quick_cleanup:w #1 \s_stop \q_stop {#1}
+\cs_new:Npn \@@_quick_cleanup:w #1 \s_@@_mark \s_@@_stop {#1}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -961,9 +954,9 @@
% auxiliaries here) and another copy~|#6| of the fake item. All those
% are discarded except the function~|#5|. This function receives
% lists~|#1| and~|#2| of items less than or greater than the
-% pivot~|#3|, then a continuation code~|#5| just after \cs{q_mark}.
+% pivot~|#3|, then a continuation code~|#5| just after \cs{s_@@_mark}.
% To avoid a memory problem described earlier, all of the ending
-% functions read~|#6| until \cs{q_stop} and place~|#6| back into the
+% functions read~|#6| until \cs{s_@@_stop} and place~|#6| back into the
% input stream. When the lists |#1| and~|#2| are empty, the
% \texttt{single} auxiliary simply places the continuation~|#5| before
% the pivot~|{#3}|. When |#2|~is empty, |#1|~is sorted and placed
@@ -976,30 +969,30 @@
% continuations are done in such a way to place the pivot in between.
% \begin{macrocode}
\cs_new:Npn \@@_quick_end:nnTFNn #1#2#3#4#5#6 {#5}
-\cs_new:Npn \@@_quick_single_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop
- { #5 {#3} #6 \q_stop }
-\cs_new:Npn \@@_quick_only_i_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop
+\cs_new:Npn \@@_quick_single_end:nnnwnw #1#2#3#4 \s_@@_mark #5#6 \s_@@_stop
+ { #5 {#3} #6 \s_@@_stop }
+\cs_new:Npn \@@_quick_only_i_end:nnnwnw #1#2#3#4 \s_@@_mark #5#6 \s_@@_stop
{
\@@_quick_split:NnNn #1
- \@@_quick_end:nnTFNn { } \q_mark {#5}
+ \@@_quick_end:nnTFNn { } \s_@@_mark {#5}
{#3}
- #6 \q_stop
+ #6 \s_@@_stop
}
-\cs_new:Npn \@@_quick_only_ii_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop
+\cs_new:Npn \@@_quick_only_ii_end:nnnwnw #1#2#3#4 \s_@@_mark #5#6 \s_@@_stop
{
\@@_quick_split:NnNn #2
- \@@_quick_end:nnTFNn { } \q_mark { #5 {#3} }
- #6 \q_stop
+ \@@_quick_end:nnTFNn { } \s_@@_mark { #5 {#3} }
+ #6 \s_@@_stop
}
-\cs_new:Npn \@@_quick_split_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop
+\cs_new:Npn \@@_quick_split_end:nnnwnw #1#2#3#4 \s_@@_mark #5#6 \s_@@_stop
{
- \@@_quick_split:NnNn #2 \@@_quick_end:nnTFNn { } \q_mark
+ \@@_quick_split:NnNn #2 \@@_quick_end:nnTFNn { } \s_@@_mark
{
\@@_quick_split:NnNn #1
- \@@_quick_end:nnTFNn { } \q_mark {#5}
+ \@@_quick_end:nnTFNn { } \s_@@_mark {#5}
{#3}
}
- #6 \q_stop
+ #6 \s_@@_stop
}
% \end{macrocode}
% \end{macro}
@@ -1028,7 +1021,6 @@
% \pkg{l3sort}. In format mode, none of this is needed since there is
% no \tn{toks} allocator.
% \begin{macrocode}
-%<*package>
\cs_new_protected:Npn \@@_disable_toksdef:
{ \cs_set_eq:NN \toksdef \@@_disabled_toksdef:n }
\cs_new_protected:Npn \@@_disabled_toksdef:n #1
@@ -1046,7 +1038,6 @@
\iow_char:N\\newtoks~
or~a~similar~command.~The~list~will~not~be~sorted.
}
-%</package>
% \end{macrocode}
% \end{macro}
%
@@ -1095,7 +1086,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
index 37a647c9dca..4cc29c2d21e 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
@@ -1,8 +1,8 @@
% \iffalse meta-comment
%
%% File: l3str-convert.dtx
-%
-% Copyright (C) 2013-2020 The LaTeX3 Project
+%
+% Copyright (C) 2013-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -68,7 +68,7 @@
% \item Bytes are translated to \TeX{} tokens through a given
% \enquote{escaping}. Those are defined for the most part by the
% \texttt{pdf} file format. See Table~\ref{tab:escapings} for a
-% list of escaping methods supported.\footnotemark
+% list of escaping methods supported.\footnotemark[\csname c@footnote\endcsname]
% \end{itemize}
%
% \begin{table}\centering
@@ -106,6 +106,8 @@
% \midrule
% \texttt{clist} & comma-list of integers \\
% \meta{empty} & native (Unicode) string \\
+% \texttt{default} & like \texttt{utf8} with 8-bit engines,
+% and like native with unicode-engines \\
% \bottomrule
% \end{tabular}
% \end{table}
@@ -186,17 +188,17 @@
% encoding. Instead, the \meta{false code} is performed.
% \end{function}
%
-% \section[Creating 8-bit mappings]{Creating $8$-bit mappings}
+% \section{Conversion by expansion (for PDF contexts)}
+%
+% A small number of expandable functions are provided for use in PDF string/name
+% contexts. These \emph{assume UTF-8} and \emph{no escaping} in the input.
%
-% \begin{function}{\str_declare_eight_bit_encoding:nnn}
+% \begin{function}[EXP]{\str_convert_pdfname:n}
% \begin{syntax}
-% \cs{str_declare_eight_bit_encoding:nnn} \Arg{name} \Arg{mapping} \Arg{missing}
+% \cs{str_convert_pdfname:n} \meta{string}
% \end{syntax}
-% Declares the encoding \meta{name} to map bytes to Unicode
-% characters according to the \meta{mapping}, and map those bytes
-% which are not mentioned in the \meta{mapping} either to the
-% replacement character (if they appear in \meta{missing}), or to
-% themselves.
+% As \cs{str_set_convert:Nnnn}, converts the \meta{string} on a byte-by-byte
+% basis with non-ASCII codepoints escaped using hashes.
% \end{function}
%
% \section{Possibilities, and things to do}
@@ -236,7 +238,7 @@
% \section{\pkg{l3str-convert} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -248,16 +250,13 @@
% \subsubsection{Variables and constants}
%
% \begin{macro}{\@@_tmp:w}
-% \begin{variable}{\l_@@_internal_int}
% \begin{variable}{\l_@@_internal_tl}
% Internal scratch space for some functions.
% \begin{macrocode}
\cs_new_protected:Npn \@@_tmp:w { }
\tl_new:N \l_@@_internal_tl
-\int_new:N \l_@@_internal_int
% \end{macrocode}
% \end{variable}
-% \end{variable}
% \end{macro}
%
% \begin{variable}{\g_@@_result_tl}
@@ -286,6 +285,20 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\s_@@}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_nil}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
% \begin{variable}{\g_@@_alias_prop}
% To avoid needing one file per encoding/escaping alias, we keep track
% of those in a property list.
@@ -306,6 +319,17 @@
\prop_gput:Nnn \g_@@_alias_prop { utf32le } { utf32 }
\prop_gput:Nnn \g_@@_alias_prop { utf32be } { utf32 }
\prop_gput:Nnn \g_@@_alias_prop { hexadecimal } { hex }
+\bool_lazy_any:nTF
+ {
+ \sys_if_engine_luatex_p:
+ \sys_if_engine_xetex_p:
+ }
+ {
+ \prop_gput:Nnn \g_@@_alias_prop { default } { }
+ }
+ {
+ \prop_gput:Nnn \g_@@_alias_prop { default } { utf8 }
+ }
% \end{macrocode}
% \end{variable}
%
@@ -331,39 +355,41 @@
%
% \subsection{String conditionals}
%
-% \begin{macro}[EXP]{\@@_if_contains_char:NNT, \@@_if_contains_char:NNTF}
-% \begin{macro}[EXP]{\@@_if_contains_char:nNTF}
-% \begin{macro}[EXP]{\@@_if_contains_char_aux:NN}
+% \begin{macro}[EXP]{\@@_if_contains_char:NnT, \@@_if_contains_char:NnTF}
+% \begin{macro}[EXP]{\@@_if_contains_char:nnTF}
+% \begin{macro}[EXP]{\@@_if_contains_char_aux:nn,\@@_if_contains_char_auxi:nN}
% \begin{macro}[EXP]{\@@_if_contains_char_true:}
% \begin{syntax}
-% \cs{@@_if_contains_char:nNTF} \Arg{token list} \meta{char}
+% \cs{@@_if_contains_char:nnTF} \Arg{token list} \meta{char}
% \end{syntax}
% Expects the \meta{token list} to be an \meta{other string}: the
% caller is responsible for ensuring that no (too-)special catcodes
-% remain. Spaces with catcode $10$ are ignored.
+% remain.
% Loop over the characters of the string, comparing character codes.
% The loop is broken if character codes match. Otherwise we return
% \enquote{false}.
% \begin{macrocode}
-\prg_new_conditional:Npnn \@@_if_contains_char:NN #1#2 { T , TF }
+\prg_new_conditional:Npnn \@@_if_contains_char:Nn #1#2 { T , TF }
{
- \exp_after:wN \@@_if_contains_char_aux:NN \exp_after:wN #2
- #1 { \prg_break:n { ? \fi: } }
+ \exp_after:wN \@@_if_contains_char_aux:nn \exp_after:wN {#1} {#2}
+ { \prg_break:n { ? \fi: } }
\prg_break_point:
\prg_return_false:
}
-\prg_new_conditional:Npnn \@@_if_contains_char:nN #1#2 { TF }
+\cs_new:Npn \@@_if_contains_char_aux:nn #1#2
+ { \@@_if_contains_char_auxi:nN {#2} #1 }
+\prg_new_conditional:Npnn \@@_if_contains_char:nn #1#2 { TF }
{
- \@@_if_contains_char_aux:NN #2 #1 { \prg_break:n { ? \fi: } }
+ \@@_if_contains_char_auxi:nN {#2} #1 { \prg_break:n { ? \fi: } }
\prg_break_point:
\prg_return_false:
}
-\cs_new:Npn \@@_if_contains_char_aux:NN #1#2
+\cs_new:Npn \@@_if_contains_char_auxi:nN #1#2
{
\if_charcode:w #1 #2
\exp_after:wN \@@_if_contains_char_true:
\fi:
- \@@_if_contains_char_aux:NN #1
+ \@@_if_contains_char_auxi:nN {#1}
}
\cs_new:Npn \@@_if_contains_char_true:
{ \prg_break:n { \prg_return_true: \use_none:n } }
@@ -442,7 +468,7 @@
% an empty result for the input $-1$.
% \begin{macrocode}
\group_begin:
- \tl_set:Nx \l_@@_internal_tl { \tl_to_str:n { 0123456789ABCDEF } }
+ \__kernel_tl_set:Nx \l_@@_internal_tl { \tl_to_str:n { 0123456789ABCDEF } }
\tl_map_inline:Nn \l_@@_internal_tl
{
\tl_map_inline:Nn \l_@@_internal_tl
@@ -528,7 +554,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_convert_gmap:N #1
{
- \tl_gset:Nx \g_@@_result_tl
+ \__kernel_tl_gset:Nx \g_@@_result_tl
{
\exp_after:wN \@@_convert_gmap_loop:NN
\exp_after:wN #1
@@ -553,17 +579,17 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_convert_gmap_internal:N #1
{
- \tl_gset:Nx \g_@@_result_tl
+ \__kernel_tl_gset:Nx \g_@@_result_tl
{
\exp_after:wN \@@_convert_gmap_internal_loop:Nww
\exp_after:wN #1
- \g_@@_result_tl \s__tl \q_stop \prg_break: \s__tl
+ \g_@@_result_tl \s_@@ \s_@@_stop \prg_break: \s_@@
\prg_break_point:
}
}
-\cs_new:Npn \@@_convert_gmap_internal_loop:Nww #1 #2 \s__tl #3 \s__tl
+\cs_new:Npn \@@_convert_gmap_internal_loop:Nww #1 #2 \s_@@ #3 \s_@@
{
- \use_none_delimit_by_q_stop:w #3 \q_stop
+ \@@_use_none_delimit_by_s_stop:w #3 \s_@@_stop
#1 {#3}
\@@_convert_gmap_internal_loop:Nww #1
}
@@ -626,7 +652,7 @@
% to a list of Unicode characters in an internal representation,
% with items of the form
% \begin{quote}
-% \meta{bytes} \cs{s__tl} \meta{Unicode code point} \cs{s__tl}
+% \meta{bytes} \cs{s_@@} \meta{Unicode code point} \cs{s_@@}
% \end{quote}
% where we have collected the \meta{bytes} which combined to form
% this particular Unicode character, and the \meta{Unicode code
@@ -677,14 +703,14 @@
{
\group_begin:
#1
- \tl_gset:Nx \g_@@_result_tl { \__kernel_str_to_other_fast:n {#4} }
+ \__kernel_tl_gset:Nx \g_@@_result_tl { \__kernel_str_to_other_fast:n {#4} }
\exp_after:wN \@@_convert:wwwnn
- \tl_to_str:n {#5} /// \q_stop
+ \tl_to_str:n {#5} /// \s_@@_stop
{ decode } { unescape }
\prg_do_nothing:
\@@_convert_decode_:
\exp_after:wN \@@_convert:wwwnn
- \tl_to_str:n {#6} /// \q_stop
+ \tl_to_str:n {#6} /// \s_@@_stop
{ encode } { escape }
\use_ii_i:nn
\@@_convert_encode_:
@@ -721,7 +747,7 @@
% was given, and only the encoding, |#1|, should be performed.
% \begin{macrocode}
\cs_new_protected:Npn \@@_convert:wwwnn
- #1 / #2 // #3 \q_stop #4#5
+ #1 / #2 // #3 \s_@@_stop #4#5
{
\@@_convert:nnn {enc} {#4} {#1}
\@@_convert:nnn {esc} {#5} {#2}
@@ -936,7 +962,7 @@
\cs_new_protected:Npn \@@_convert_unescape_:
{
\flag_clear:n { str_byte }
- \tl_gset:Nx \g_@@_result_tl
+ \__kernel_tl_gset:Nx \g_@@_result_tl
{ \exp_args:No \@@_filter_bytes:n \g_@@_result_tl }
\@@_if_flag_error:nnx { str_byte } { non-byte } { bytes }
}
@@ -967,7 +993,7 @@
\cs_new_protected:Npn \@@_convert_decode_:
{ \@@_convert_gmap:N \@@_decode_native_char:N }
\cs_new:Npn \@@_decode_native_char:N #1
- { #1 \s__tl \int_value:w `#1 \s__tl }
+ { #1 \s_@@ \int_value:w `#1 \s_@@ }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1032,14 +1058,14 @@
\cs_new_protected:Npn \@@_convert_decode_clist:
{
\clist_gset:No \g_@@_result_tl \g_@@_result_tl
- \tl_gset:Nx \g_@@_result_tl
+ \__kernel_tl_gset:Nx \g_@@_result_tl
{
\exp_args:No \clist_map_function:nN
\g_@@_result_tl \@@_decode_clist_char:n
}
}
\cs_new:Npn \@@_decode_clist_char:n #1
- { #1 \s__tl \int_eval:n {#1} \s__tl }
+ { #1 \s_@@ \int_eval:n {#1} \s_@@ }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1055,7 +1081,7 @@
\cs_new_protected:Npn \@@_convert_encode_clist:
{
\@@_convert_gmap_internal:N \@@_encode_clist_char:n
- \tl_gset:Nx \g_@@_result_tl { \tl_tail:N \g_@@_result_tl }
+ \__kernel_tl_gset:Nx \g_@@_result_tl { \tl_tail:N \g_@@_result_tl }
}
\cs_new:Npn \@@_encode_clist_char:n #1 { , #1 }
% \end{macrocode}
@@ -1064,159 +1090,193 @@
%
% \subsubsection{8-bit encodings}
%
-% This section will be entirely rewritten: it is not yet clear in what
-% situations 8-bit encodings are used, hence I don't know what exactly
-% should be optimized. The current approach is reasonably efficient to
-% convert long strings, and it scales well when using many different
-% encodings. An approach based on csnames would have a smaller constant
-% load time for each individual conversion, but has a large hash table
-% cost. Using a range of \tn{count} registers works for decoding, but
-% not for encoding: one possibility there would be to use a binary tree
-% for the mapping of Unicode characters to bytes, stored as a box, one
-% per encoding.
-%
-% Since the section is going to be rewritten, documentation lacks.
-%
-% All the 8-bit encodings which \pkg{l3str} supports rely on the same
-% internal functions.
-%
-% \begin{macro}{\str_declare_eight_bit_encoding:nnn}
-% All the 8-bit encoding definition file start with
-% \cs{str_declare_eight_bit_encoding:nnn} \Arg{encoding name}
-% \Arg{mapping} \Arg{missing bytes}. The \meta{mapping} argument is a
-% token list of pairs \Arg{byte} \Arg{Unicode} expressed in uppercase
-% hexadecimal notation. The \meta{missing} argument is a token list
-% of \Arg{byte}. Every \meta{byte} which does not appear in the
-% \meta{mapping} nor the \meta{missing} lists maps to the same code
-% point in Unicode.
-% \begin{macrocode}
-\cs_new_protected:Npn \str_declare_eight_bit_encoding:nnn #1#2#3
+% It is not clear in what situations 8-bit encodings are used, hence it
+% is not clear what should be optimized. The current approach is
+% reasonably efficient to convert long strings, and it scales well when
+% using many different encodings.
+%
+% The data needed to support a given 8-bit encoding is stored in a file
+% that consists of a single function call
+% \begin{quote}\ttfamily
+% \cs{@@_declare_eight_bit_encoding:nnnn} \Arg{name} \Arg{modulo}
+% \Arg{mapping} \Arg{missing}
+% \end{quote}
+% This declares the encoding \meta{name} to map bytes to Unicode
+% characters according to the \meta{mapping}, and map those bytes which
+% are not mentioned in the \meta{mapping} either to the replacement
+% character (if they appear in \meta{missing}), or to themselves. The
+% \meta{mapping} argument is a token list of pairs \Arg{byte}
+% \Arg{Unicode} expressed in uppercase hexadecimal notation. The
+% \meta{missing} argument is a token list of \Arg{byte}. Every
+% \meta{byte} which does not appear in the \meta{mapping} nor the
+% \meta{missing} lists maps to itself in Unicode, so for instance the
+% \texttt{latin1} encoding has empty \meta{mapping} and \meta{missing}
+% lists. The \meta{modulo} is a (decimal) integer between $256$ and
+% $558$ inclusive, modulo which all Unicode code points supported by the
+% encodings must be different.
+%
+% We use two integer arrays per encoding. When decoding we only use the
+% \texttt{decode} integer array, with entry $n+1$ (offset needed because
+% integer array indices start at~$1$) equal to the Unicode code point
+% that corresponds to the $n$-th byte in the encoding under
+% consideration, or $-1$ if the given byte is invalid in this encoding.
+% When encoding we use both arrays: upon seeing a code point~$n$, we
+% look up the entry ($1$~plus) $n$ modulo some number $M$ in the
+% \texttt{encode} array, which tells us the byte that might encode the
+% given Unicode code point, then we check in the \texttt{decode} array
+% that indeed this byte encodes the Unicode code point we want. Here,
+% $M$ is an encoding-dependent integer between $256$ and $558$ (it turns
+% out), chosen so that among the Unicode code points that can be validly
+% represented in the given encoding, no pair of code points have the
+% same value modulo~$M$.
+%
+% \begin{macro}
+% {
+% \@@_declare_eight_bit_encoding:nnnn,
+% \@@_declare_eight_bit_aux:NNnnn,
+% \@@_declare_eight_bit_loop:Nnn,
+% \@@_declare_eight_bit_loop:Nn
+% }
+% Loop through both lists of bytes to fill in the \texttt{decode}
+% integer array, then fill the \texttt{encode} array accordingly.
+% For bytes that are invalid in the given encoding, store $-1$ in the
+% \texttt{decode} array.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_declare_eight_bit_encoding:nnnn #1
{
\tl_set:Nn \l_@@_internal_tl {#1}
\cs_new_protected:cpn { @@_convert_decode_#1: }
{ \@@_convert_decode_eight_bit:n {#1} }
\cs_new_protected:cpn { @@_convert_encode_#1: }
{ \@@_convert_encode_eight_bit:n {#1} }
- \tl_const:cn { c_@@_encoding_#1_tl } {#2}
- \tl_const:cn { c_@@_encoding_#1_missing_tl } {#3}
+ \exp_args:Ncc \@@_declare_eight_bit_aux:NNnnn
+ { g_@@_decode_#1_intarray } { g_@@_encode_#1_intarray }
+ }
+\cs_new_protected:Npn \@@_declare_eight_bit_aux:NNnnn #1#2#3#4#5
+ {
+ \intarray_new:Nn #1 { 256 }
+ \int_step_inline:nnn { 0 } { 255 }
+ { \intarray_gset:Nnn #1 { 1 + ##1 } {##1} }
+ \@@_declare_eight_bit_loop:Nnn #1
+ #4 { \s_@@_stop \prg_break: } { }
+ \prg_break_point:
+ \@@_declare_eight_bit_loop:Nn #1
+ #5 { \s_@@_stop \prg_break: }
+ \prg_break_point:
+ \intarray_new:Nn #2 {#3}
+ \int_step_inline:nnn { 0 } { 255 }
+ {
+ \int_compare:nNnF { \intarray_item:Nn #1 { 1 + ##1 } } = { -1 }
+ {
+ \intarray_gset:Nnn #2
+ {
+ 1 +
+ \int_mod:nn { \intarray_item:Nn #1 { 1 + ##1 } }
+ { \intarray_count:N #2 }
+ }
+ {##1}
+ }
+ }
+ }
+\cs_new_protected:Npn \@@_declare_eight_bit_loop:Nnn #1#2#3
+ {
+ \@@_use_none_delimit_by_s_stop:w #2 \s_@@_stop
+ \intarray_gset:Nnn #1 { 1 + "#2 } { "#3 }
+ \@@_declare_eight_bit_loop:Nnn #1
+ }
+\cs_new_protected:Npn \@@_declare_eight_bit_loop:Nn #1#2
+ {
+ \@@_use_none_delimit_by_s_stop:w #2 \s_@@_stop
+ \intarray_gset:Nnn #1 { 1 + "#2 } { -1 }
+ \@@_declare_eight_bit_loop:Nn #1
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_convert_decode_eight_bit:n}
-% \begin{macro}{\@@_decode_eight_bit_load:nn}
-% \begin{macro}{\@@_decode_eight_bit_load_missing:n}
-% \begin{macro}[EXP]{\@@_decode_eight_bit_char:N}
-%^^A todo: document
+% \begin{macro}[rEXP]{\@@_decode_eight_bit_aux:n, \@@_decode_eight_bit_aux:Nn}
+% The map from bytes to Unicode code points is in the \texttt{decode}
+% array corresponding to the given encoding. Define \cs{@@_tmp:w} and
+% pass it successively all bytes in the string. It produces an
+% internal representation with suitable \cs{s_@@} inserted, and the
+% corresponding code point is obtained by looking it up in the integer
+% array. If the entry is $-1$ then issue a replacement character and
+% raise the flag indicating that there was an error.
% \begin{macrocode}
\cs_new_protected:Npn \@@_convert_decode_eight_bit:n #1
{
- \group_begin:
- \int_zero:N \l_@@_internal_int
- \exp_last_unbraced:Nx \@@_decode_eight_bit_load:nn
- { \tl_use:c { c_@@_encoding_#1_tl } }
- { \q_stop \prg_break: } { }
- \prg_break_point:
- \exp_last_unbraced:Nx \@@_decode_eight_bit_load_missing:n
- { \tl_use:c { c_@@_encoding_#1_missing_tl } }
- { \q_stop \prg_break: }
- \prg_break_point:
- \flag_clear:n { str_error }
- \@@_convert_gmap:N \@@_decode_eight_bit_char:N
- \@@_if_flag_error:nnx { str_error } { decode-8-bit } {#1}
- \group_end:
- }
-\cs_new_protected:Npn \@@_decode_eight_bit_load:nn #1#2
- {
- \use_none_delimit_by_q_stop:w #1 \q_stop
- \tex_dimen:D "#1 = \l_@@_internal_int sp \scan_stop:
- \tex_skip:D \l_@@_internal_int = "#1 sp \scan_stop:
- \tex_toks:D \l_@@_internal_int \exp_after:wN { \int_value:w "#2 }
- \int_incr:N \l_@@_internal_int
- \@@_decode_eight_bit_load:nn
+ \cs_set:Npx \@@_tmp:w
+ {
+ \exp_not:N \@@_decode_eight_bit_aux:Nn
+ \exp_not:c { g_@@_decode_#1_intarray }
+ }
+ \flag_clear:n { str_error }
+ \@@_convert_gmap:N \@@_tmp:w
+ \@@_if_flag_error:nnx { str_error } { decode-8-bit } {#1}
}
-\cs_new_protected:Npn \@@_decode_eight_bit_load_missing:n #1
+\cs_new:Npn \@@_decode_eight_bit_aux:Nn #1#2
{
- \use_none_delimit_by_q_stop:w #1 \q_stop
- \tex_dimen:D "#1 = \l_@@_internal_int sp \scan_stop:
- \tex_skip:D \l_@@_internal_int = "#1 sp \scan_stop:
- \tex_toks:D \l_@@_internal_int \exp_after:wN
- { \int_use:N \c_@@_replacement_char_int }
- \int_incr:N \l_@@_internal_int
- \@@_decode_eight_bit_load_missing:n
+ #2 \s_@@
+ \exp_args:Nf \@@_decode_eight_bit_aux:n
+ { \intarray_item:Nn #1 { 1 + `#2 } }
+ \s_@@
}
-\cs_new:Npn \@@_decode_eight_bit_char:N #1
+\cs_new:Npn \@@_decode_eight_bit_aux:n #1
{
- #1 \s__tl
- \if_int_compare:w \tex_dimen:D `#1 < \l_@@_internal_int
- \if_int_compare:w \tex_skip:D \tex_dimen:D `#1 = `#1 \exp_stop_f:
- \tex_the:D \tex_toks:D \tex_dimen:D
- \fi:
+ \if_int_compare:w #1 < \c_zero_int
+ \flag_raise:n { str_error }
+ \int_value:w \c_@@_replacement_char_int
+ \else:
+ #1
\fi:
- \int_value:w `#1 \s__tl
}
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
%
% \begin{macro}{\@@_convert_encode_eight_bit:n}
-% \begin{macro}{\@@_encode_eight_bit_load:nn}
-% \begin{macro}[rEXP]{\@@_encode_eight_bit_char:n}
-% \begin{macro}[rEXP]{\@@_encode_eight_bit_char_aux:n}
-%^^A todo: document
-% \begin{macrocode}
+% \begin{macro}[rEXP]{\@@_encode_eight_bit_aux:nnN, \@@_encode_eight_bit_aux:NNn}
+% It is not practical to make an integer array with indices in the
+% full Unicode range, so we work modulo some number, which is simply
+% the size of the \texttt{encode} integer array for the given
+% encoding. This gives us a candidate byte for representing a given
+% Unicode code point. Of course taking the modulo leads to collisions
+% so we check in the \texttt{decode} array that the byte we got is
+% indeed correct. Otherwise the Unicode code point we started from is
+% simply not representable in the given encoding.
+% \begin{macrocode}
+\int_new:N \l_@@_modulo_int
\cs_new_protected:Npn \@@_convert_encode_eight_bit:n #1
{
- \group_begin:
- \int_zero:N \l_@@_internal_int
- \exp_last_unbraced:Nx \@@_encode_eight_bit_load:nn
- { \tl_use:c { c_@@_encoding_#1_tl } }
- { \q_stop \prg_break: } { }
- \prg_break_point:
- \flag_clear:n { str_error }
- \@@_convert_gmap_internal:N \@@_encode_eight_bit_char:n
- \@@_if_flag_error:nnx { str_error } { encode-8-bit } {#1}
- \group_end:
- }
-\cs_new_protected:Npn \@@_encode_eight_bit_load:nn #1#2
- {
- \use_none_delimit_by_q_stop:w #1 \q_stop
- \tex_dimen:D "#2 = \l_@@_internal_int sp \scan_stop:
- \tex_skip:D \l_@@_internal_int = "#2 sp \scan_stop:
- \exp_args:NNf \tex_toks:D \l_@@_internal_int
- { \@@_output_byte:n { "#1 } }
- \int_incr:N \l_@@_internal_int
- \@@_encode_eight_bit_load:nn
+ \cs_set:Npx \@@_tmp:w
+ {
+ \exp_not:N \@@_encode_eight_bit_aux:NNn
+ \exp_not:c { g_@@_encode_#1_intarray }
+ \exp_not:c { g_@@_decode_#1_intarray }
+ }
+ \flag_clear:n { str_error }
+ \@@_convert_gmap_internal:N \@@_tmp:w
+ \@@_if_flag_error:nnx { str_error } { encode-8-bit } {#1}
}
-\cs_new:Npn \@@_encode_eight_bit_char:n #1
+\cs_new:Npn \@@_encode_eight_bit_aux:NNn #1#2#3
{
- \if_int_compare:w #1 > \c_max_register_int
- \flag_raise:n { str_error }
- \else:
- \if_int_compare:w \tex_dimen:D #1 < \l_@@_internal_int
- \if_int_compare:w \tex_skip:D \tex_dimen:D #1 = #1 \exp_stop_f:
- \tex_the:D \tex_toks:D \tex_dimen:D #1 \exp_stop_f:
- \exp_after:wN \exp_after:wN \exp_after:wN \use_none:nn
- \fi:
- \fi:
- \@@_encode_eight_bit_char_aux:n {#1}
- \fi:
+ \exp_args:Nf \@@_encode_eight_bit_aux:nnN
+ {
+ \intarray_item:Nn #1
+ { 1 + \int_mod:nn {#3} { \intarray_count:N #1 } }
+ }
+ {#3}
+ #2
}
-\cs_new:Npn \@@_encode_eight_bit_char_aux:n #1
+\cs_new:Npn \@@_encode_eight_bit_aux:nnN #1#2#3
{
- \if_int_compare:w #1 > \c_@@_max_byte_int
- \flag_raise:n { str_error }
- \else:
- \@@_output_byte:n {#1}
- \fi:
+ \int_compare:nNnTF { \intarray_item:Nn #3 { 1 + #1 } } = {#2}
+ { \@@_output_byte:n {#1} }
+ { \flag_raise:n { str_error } }
}
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
-% \end{macro}
%
% \subsection{Messages}
%
@@ -1315,7 +1375,7 @@
\group_begin:
\flag_clear:n { str_error }
\int_set:Nn \tex_escapechar:D { 92 }
- \tl_gset:Nx \g_@@_result_tl
+ \__kernel_tl_gset:Nx \g_@@_result_tl
{
\@@_output_byte:w "
\exp_last_unbraced:Nf \@@_unescape_hex_auxi:N
@@ -1394,7 +1454,7 @@
\flag_clear:n { str_byte }
\flag_clear:n { str_error }
\int_set:Nn \tex_escapechar:D { 92 }
- \tl_gset:Nx \g_@@_result_tl
+ \__kernel_tl_gset:Nx \g_@@_result_tl
{
\exp_after:wN #3 \g_@@_result_tl
#1 ? { ? \prg_break: }
@@ -1480,13 +1540,13 @@
\flag_clear:n { str_byte }
\flag_clear:n { str_error }
\int_set:Nn \tex_escapechar:D { 92 }
- \tl_gset:Nx \g_@@_result_tl
+ \__kernel_tl_gset:Nx \g_@@_result_tl
{
\exp_after:wN \@@_unescape_string_newlines:wN
\g_@@_result_tl \prg_break: ^^M ?
\prg_break_point:
}
- \tl_gset:Nx \g_@@_result_tl
+ \__kernel_tl_gset:Nx \g_@@_result_tl
{
\exp_after:wN \@@_unescape_string_loop:wNNN
\g_@@_result_tl #1 ?? { ? \prg_break: }
@@ -1581,8 +1641,8 @@
% \end{macro}
%
% \begin{macro}{\@@_convert_escape_name:}
-% \begin{macro}[rEXP]{\@@_escape_name_char:N}
-% \begin{macro}[rEXP]{\@@_if_escape_name:NTF}
+% \begin{macro}[rEXP]{\@@_escape_name_char:n}
+% \begin{macro}[rEXP]{\@@_if_escape_name:nTF}
% \begin{variable}{\c_@@_escape_name_str}
% \begin{variable}{\c_@@_escape_name_not_str}
% For each byte, test whether it should be output as is, or be
@@ -1595,22 +1655,22 @@
\str_const:Nn \c_@@_escape_name_not_str { ! " $ & ' } %$
\str_const:Nn \c_@@_escape_name_str { {}/<>[] }
\cs_new_protected:Npn \@@_convert_escape_name:
- { \@@_convert_gmap:N \@@_escape_name_char:N }
-\cs_new:Npn \@@_escape_name_char:N #1
+ { \@@_convert_gmap:N \@@_escape_name_char:n }
+\cs_new:Npn \@@_escape_name_char:n #1
{
- \@@_if_escape_name:NTF #1 {#1}
+ \@@_if_escape_name:nTF {#1} {#1}
{ \c_hash_str \@@_output_hexadecimal:n {`#1} }
}
-\prg_new_conditional:Npnn \@@_if_escape_name:N #1 { TF }
+\prg_new_conditional:Npnn \@@_if_escape_name:n #1 { TF }
{
\if_int_compare:w `#1 < "2A \exp_stop_f:
- \@@_if_contains_char:NNTF \c_@@_escape_name_not_str #1
+ \@@_if_contains_char:NnTF \c_@@_escape_name_not_str {#1}
\prg_return_true: \prg_return_false:
\else:
\if_int_compare:w `#1 > "7E \exp_stop_f:
\prg_return_false:
\else:
- \@@_if_contains_char:NNTF \c_@@_escape_name_str #1
+ \@@_if_contains_char:NnTF \c_@@_escape_name_str {#1}
\prg_return_false: \prg_return_true:
\fi:
\fi:
@@ -1638,8 +1698,8 @@
{
\@@_if_escape_string:NTF #1
{
- \@@_if_contains_char:NNT
- \c_@@_escape_string_str #1
+ \@@_if_contains_char:NnT
+ \c_@@_escape_string_str {#1}
{ \c_backslash_str }
#1
}
@@ -1669,28 +1729,28 @@
% \end{macro}
%
% \begin{macro}{\@@_convert_escape_url:}
-% \begin{macro}[rEXP]{\@@_escape_url_char:N}
-% \begin{macro}[rEXP]{\@@_if_escape_url:NTF}
+% \begin{macro}[rEXP]{\@@_escape_url_char:n}
+% \begin{macro}[rEXP]{\@@_if_escape_url:nTF}
% This function is similar to \cs{@@_convert_escape_name:}, escaping
% different characters.
% \begin{macrocode}
\cs_new_protected:Npn \@@_convert_escape_url:
- { \@@_convert_gmap:N \@@_escape_url_char:N }
-\cs_new:Npn \@@_escape_url_char:N #1
+ { \@@_convert_gmap:N \@@_escape_url_char:n }
+\cs_new:Npn \@@_escape_url_char:n #1
{
- \@@_if_escape_url:NTF #1 {#1}
+ \@@_if_escape_url:nTF {#1} {#1}
{ \c_percent_str \@@_output_hexadecimal:n { `#1 } }
}
-\prg_new_conditional:Npnn \@@_if_escape_url:N #1 { TF }
+\prg_new_conditional:Npnn \@@_if_escape_url:n #1 { TF }
{
\if_int_compare:w `#1 < "41 \exp_stop_f:
- \@@_if_contains_char:nNTF { "-.<> } #1
+ \@@_if_contains_char:nnTF { "-.<> } {#1}
\prg_return_true: \prg_return_false:
\else:
\if_int_compare:w `#1 > "7E \exp_stop_f:
\prg_return_false:
\else:
- \@@_if_contains_char:nNTF { [ ] } #1
+ \@@_if_contains_char:nnTF { [ ] } {#1}
\prg_return_false: \prg_return_true:
\fi:
\fi:
@@ -1762,17 +1822,17 @@
{ 32 } { 192 }
{ 16 } { 224 }
{ 8 } { 240 }
- \q_stop
+ \s_@@_stop
}
-\cs_new:Npn \@@_encode_utf_viii_loop:wwnnw #1; #2; #3#4 #5 \q_stop
+\cs_new:Npn \@@_encode_utf_viii_loop:wwnnw #1; #2; #3#4 #5 \s_@@_stop
{
\if_int_compare:w #1 < #3 \exp_stop_f:
\@@_output_byte:n { #1 + #4 }
- \exp_after:wN \use_none_delimit_by_q_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_s_stop:w
\fi:
\exp_after:wN \@@_encode_utf_viii_loop:wwnnw
\int_value:w \int_div_truncate:nn {#1} {64} ; #1 ;
- #5 \q_stop
+ #5 \s_@@_stop
\@@_output_byte:n { #2 - 64 * ( #1 - 2 ) }
}
% \end{macrocode}
@@ -1937,7 +1997,7 @@
\flag_clear:n { str_extra }
\flag_clear:n { str_overlong }
\flag_clear:n { str_overflow }
- \tl_gset:Nx \g_@@_result_tl
+ \__kernel_tl_gset:Nx \g_@@_result_tl
{
\exp_after:wN \@@_decode_utf_viii_start:N \g_@@_result_tl
{ \prg_break: \@@_decode_utf_viii_end: }
@@ -1949,7 +2009,7 @@
{
#1
\if_int_compare:w `#1 < "C0 \exp_stop_f:
- \s__tl
+ \s_@@
\if_int_compare:w `#1 < "80 \exp_stop_f:
\int_value:w `#1
\else:
@@ -1961,12 +2021,12 @@
\exp_after:wN \@@_decode_utf_viii_continuation:wwN
\int_value:w \int_eval:n { `#1 - "C0 } \exp_after:wN
\fi:
- \s__tl
- \use_none_delimit_by_q_stop:w {"80} {"800} {"10000} {"110000} \q_stop
+ \s_@@
+ \@@_use_none_delimit_by_s_stop:w {"80} {"800} {"10000} {"110000} \s_@@_stop
\@@_decode_utf_viii_start:N
}
\cs_new:Npn \@@_decode_utf_viii_continuation:wwN
- #1 \s__tl #2 \@@_decode_utf_viii_start:N #3
+ #1 \s_@@ #2 \@@_decode_utf_viii_start:N #3
{
\use_none:n #3
\if_int_compare:w `#3 <
@@ -1976,20 +2036,20 @@
\exp_after:wN \@@_decode_utf_viii_aux:wNnnwN
\int_value:w \int_eval:n { #1 * "40 + `#3 - "80 } \exp_after:wN
\else:
- \s__tl
+ \s_@@
\flag_raise:n { str_missing }
\flag_raise:n { str_error }
\int_use:N \c_@@_replacement_char_int
\fi:
- \s__tl
+ \s_@@
#2
\@@_decode_utf_viii_start:N #3
}
\cs_new:Npn \@@_decode_utf_viii_aux:wNnnwN
- #1 \s__tl #2#3#4 #5 \@@_decode_utf_viii_start:N #6
+ #1 \s_@@ #2#3#4 #5 \@@_decode_utf_viii_start:N #6
{
\if_int_compare:w #1 < #4 \exp_stop_f:
- \s__tl
+ \s_@@
\if_int_compare:w #1 < #3 \exp_stop_f:
\flag_raise:n { str_overlong }
\flag_raise:n { str_error }
@@ -1998,13 +2058,13 @@
#1
\fi:
\else:
- \if_meaning:w \q_stop #5
+ \if_meaning:w \s_@@_stop #5
\@@_decode_utf_viii_overflow:w #1
\fi:
\exp_after:wN \@@_decode_utf_viii_continuation:wwN
\int_value:w \int_eval:n { #1 - #4 } \exp_after:wN
\fi:
- \s__tl
+ \s_@@
#2 {#4} #5
\@@_decode_utf_viii_start:N
}
@@ -2017,10 +2077,10 @@
}
\cs_new:Npn \@@_decode_utf_viii_end:
{
- \s__tl
+ \s_@@
\flag_raise:n { str_missing }
\flag_raise:n { str_error }
- \int_use:N \c_@@_replacement_char_int \s__tl
+ \int_use:N \c_@@_replacement_char_int \s_@@
\prg_break:
}
% \end{macrocode}
@@ -2192,7 +2252,7 @@
% big-endianness. The three endianness cases are based on a common
% auxiliary whose first argument is $1$ for big-endian and $2$ for
% little-endian, and whose second argument, delimited by the scan mark
-% \cs{s_stop}, is expanded once (the string may be long; passing
+% \cs{s_@@_stop}, is expanded once (the string may be long; passing
% \cs{g_@@_result_tl} as an argument before expansion is cheaper).
%
% The \cs{@@_decode_utf_xvi:Nw} function defines \cs{@@_tmp:w} to
@@ -2202,13 +2262,13 @@
% \cs{@@_decode_utf_xvi_pair:NN} described below.
% \begin{macrocode}
\cs_new_protected:cpn { @@_convert_decode_utf16be: }
- { \@@_decode_utf_xvi:Nw 1 \g_@@_result_tl \s_stop }
+ { \@@_decode_utf_xvi:Nw 1 \g_@@_result_tl \s_@@_stop }
\cs_new_protected:cpn { @@_convert_decode_utf16le: }
- { \@@_decode_utf_xvi:Nw 2 \g_@@_result_tl \s_stop }
+ { \@@_decode_utf_xvi:Nw 2 \g_@@_result_tl \s_@@_stop }
\cs_new_protected:cpn { @@_convert_decode_utf16: }
{
\exp_after:wN \@@_decode_utf_xvi_bom:NN
- \g_@@_result_tl \s_stop \s_stop \s_stop
+ \g_@@_result_tl \s_@@_stop \s_@@_stop \s_@@_stop
}
\cs_new_protected:Npn \@@_decode_utf_xvi_bom:NN #1#2
{
@@ -2220,17 +2280,17 @@
{ \@@_decode_utf_xvi:Nw 1 #1#2 }
}
}
- \cs_new_protected:Npn \@@_decode_utf_xvi:Nw #1#2 \s_stop
+ \cs_new_protected:Npn \@@_decode_utf_xvi:Nw #1#2 \s_@@_stop
{
\flag_clear:n { str_error }
\flag_clear:n { str_missing }
\flag_clear:n { str_extra }
\flag_clear:n { str_end }
\cs_set:Npn \@@_tmp:w ##1 ##2 { ` ## #1 }
- \tl_gset:Nx \g_@@_result_tl
+ \__kernel_tl_gset:Nx \g_@@_result_tl
{
\exp_after:wN \@@_decode_utf_xvi_pair:NN
- #2 \q_nil \q_nil
+ #2 \q_@@_nil \q_@@_nil
\prg_break_point:
}
\@@_if_flag_error:nnx { str_error } { utf16-decode } { }
@@ -2271,8 +2331,8 @@
% range $[\hexnum{DC}, \hexnum{DF}]$ (trail surrogate). The test is
% similar to the test used for continuation bytes in the
% \textsc{utf-8} decoding functions. In the case where |#4#5| is
-% indeed a trail surrogate, leave |#1#2#4#5| \cs{s__tl}
-% \meta{code~point} \cs{s__tl}, and remove the pair |#4#5| before
+% indeed a trail surrogate, leave |#1#2#4#5| \cs{s_@@}
+% \meta{code~point} \cs{s_@@}, and remove the pair |#4#5| before
% looping with \cs{@@_decode_utf_xvi_pair:NN}. Otherwise, of course,
% complain about the missing surrogate.
%
@@ -2281,13 +2341,13 @@
% \hexnum{DC00} - \hexnum{10000}$.
%
% Every time we read a pair of bytes, we test for the end-marker
-% \cs{q_nil}. When reaching the end, we additionally check that the
+% \cs{q_@@_nil}. When reaching the end, we additionally check that the
% string had an even length. Also, if the end is reached when
% expecting a trail surrogate, we treat that as a missing surrogate.
% \begin{macrocode}
\cs_new:Npn \@@_decode_utf_xvi_pair:NN #1#2
{
- \if_meaning:w \q_nil #2
+ \if_meaning:w \q_@@_nil #2
\@@_decode_utf_xvi_pair_end:Nw #1
\fi:
\if_case:w
@@ -2295,14 +2355,14 @@
\or: \exp_after:wN \@@_decode_utf_xvi_quad:NNwNN
\or: \exp_after:wN \@@_decode_utf_xvi_extra:NNw
\fi:
- #1#2 \s__tl
- \int_eval:n { "100 * \@@_tmp:w #1#2 + \@@_tmp:w #2#1 } \s__tl
+ #1#2 \s_@@
+ \int_eval:n { "100 * \@@_tmp:w #1#2 + \@@_tmp:w #2#1 } \s_@@
\@@_decode_utf_xvi_pair:NN
}
\cs_new:Npn \@@_decode_utf_xvi_quad:NNwNN
#1#2 #3 \@@_decode_utf_xvi_pair:NN #4#5
{
- \if_meaning:w \q_nil #5
+ \if_meaning:w \q_@@_nil #5
\@@_decode_utf_xvi_error:nNN { missing } #1#2
\@@_decode_utf_xvi_pair_end:Nw #4
\fi:
@@ -2313,13 +2373,13 @@
\@@_tmp:w #4#5 < "E0
\fi:
\exp_stop_f:
- #1 #2 #4 #5 \s__tl
+ #1 #2 #4 #5 \s_@@
\int_eval:n
{
( "100 * \@@_tmp:w #1#2 + \@@_tmp:w #2#1 - "D7F7 ) * "400
+ "100 * \@@_tmp:w #4#5 + \@@_tmp:w #5#4
}
- \s__tl
+ \s_@@
\exp_after:wN \use_i:nnn
\else:
\@@_decode_utf_xvi_error:nNN { missing } #1#2
@@ -2329,20 +2389,20 @@
\cs_new:Npn \@@_decode_utf_xvi_pair_end:Nw #1 \fi:
{
\fi:
- \if_meaning:w \q_nil #1
+ \if_meaning:w \q_@@_nil #1
\else:
\@@_decode_utf_xvi_error:nNN { end } #1 \prg_do_nothing:
\fi:
\prg_break:
}
- \cs_new:Npn \@@_decode_utf_xvi_extra:NNw #1#2 \s__tl #3 \s__tl
+ \cs_new:Npn \@@_decode_utf_xvi_extra:NNw #1#2 \s_@@ #3 \s_@@
{ \@@_decode_utf_xvi_error:nNN { extra } #1#2 }
\cs_new:Npn \@@_decode_utf_xvi_error:nNN #1#2#3
{
\flag_raise:n { str_error }
\flag_raise:n { str_#1 }
- #2 #3 \s__tl
- \int_use:N \c_@@_replacement_char_int \s__tl
+ #2 #3 \s_@@
+ \int_use:N \c_@@_replacement_char_int \s_@@
}
% \end{macrocode}
% \end{macro}
@@ -2470,7 +2530,7 @@
%
% The structure is similar to \textsc{utf-16} decoding functions. If
% the endianness is not given, test the first $4$ bytes of the string
-% (possibly \cs{s_stop} if the string is too short) for the presence
+% (possibly \cs{s_@@_stop} if the string is too short) for the presence
% of a byte-order mark. If there is a byte-order mark, use that
% endianness, and remove the $4$ bytes, otherwise default to
% big-endian, and leave the $4$ bytes in place. The
@@ -2482,22 +2542,22 @@
% inside an \texttt{x}-expanding assignment to \cs{g_@@_result_tl}.
%
% The \texttt{_loop} auxiliary first checks for the end-of-string
-% marker \cs{s_stop}, calling the \texttt{_end} auxiliary if
-% appropriate. Otherwise, leave the \meta{4~bytes} \cs{s__tl} behind,
+% marker \cs{s_@@_stop}, calling the \texttt{_end} auxiliary if
+% appropriate. Otherwise, leave the \meta{4~bytes} \cs{s_@@} behind,
% then check that the code point is not overflowing: the leading byte
% must be $0$, and the following byte at most $16$.
%
% In the ending code, we check that there remains no byte: there
-% should be nothing left until the first \cs{s_stop}. Break the map.
+% should be nothing left until the first \cs{s_@@_stop}. Break the map.
% \begin{macrocode}
\cs_new_protected:cpn { @@_convert_decode_utf32be: }
- { \@@_decode_utf_xxxii:Nw 1 \g_@@_result_tl \s_stop }
+ { \@@_decode_utf_xxxii:Nw 1 \g_@@_result_tl \s_@@_stop }
\cs_new_protected:cpn { @@_convert_decode_utf32le: }
- { \@@_decode_utf_xxxii:Nw 2 \g_@@_result_tl \s_stop }
+ { \@@_decode_utf_xxxii:Nw 2 \g_@@_result_tl \s_@@_stop }
\cs_new_protected:cpn { @@_convert_decode_utf32: }
{
\exp_after:wN \@@_decode_utf_xxxii_bom:NNNN \g_@@_result_tl
- \s_stop \s_stop \s_stop \s_stop \s_stop
+ \s_@@_stop \s_@@_stop \s_@@_stop \s_@@_stop \s_@@_stop
}
\cs_new_protected:Npn \@@_decode_utf_xxxii_bom:NNNN #1#2#3#4
{
@@ -2509,26 +2569,26 @@
{ \@@_decode_utf_xxxii:Nw 1 #1#2#3#4 }
}
}
- \cs_new_protected:Npn \@@_decode_utf_xxxii:Nw #1#2 \s_stop
+ \cs_new_protected:Npn \@@_decode_utf_xxxii:Nw #1#2 \s_@@_stop
{
\flag_clear:n { str_overflow }
\flag_clear:n { str_end }
\flag_clear:n { str_error }
\cs_set:Npn \@@_tmp:w ##1 ##2 { ` ## #1 }
- \tl_gset:Nx \g_@@_result_tl
+ \__kernel_tl_gset:Nx \g_@@_result_tl
{
\exp_after:wN \@@_decode_utf_xxxii_loop:NNNN
- #2 \s_stop \s_stop \s_stop \s_stop
+ #2 \s_@@_stop \s_@@_stop \s_@@_stop \s_@@_stop
\prg_break_point:
}
\@@_if_flag_error:nnx { str_error } { utf32-decode } { }
}
\cs_new:Npn \@@_decode_utf_xxxii_loop:NNNN #1#2#3#4
{
- \if_meaning:w \s_stop #4
+ \if_meaning:w \s_@@_stop #4
\exp_after:wN \@@_decode_utf_xxxii_end:w
\fi:
- #1#2#3#4 \s__tl
+ #1#2#3#4 \s_@@
\if_int_compare:w \@@_tmp:w #1#4 > 0 \exp_stop_f:
\flag_raise:n { str_overflow }
\flag_raise:n { str_error }
@@ -2543,17 +2603,17 @@
{ \@@_tmp:w #2#3*"10000 + \@@_tmp:w #3#2*"100 + \@@_tmp:w #4#1 }
\fi:
\fi:
- \s__tl
+ \s_@@
\@@_decode_utf_xxxii_loop:NNNN
}
- \cs_new:Npn \@@_decode_utf_xxxii_end:w #1 \s_stop
+ \cs_new:Npn \@@_decode_utf_xxxii_end:w #1 \s_@@_stop
{
\tl_if_empty:nF {#1}
{
\flag_raise:n { str_end }
\flag_raise:n { str_error }
- #1 \s__tl
- \int_use:N \c_@@_replacement_char_int \s__tl
+ #1 \s_@@
+ \int_use:N \c_@@_replacement_char_int \s_@@
}
\prg_break:
}
@@ -2567,8 +2627,65 @@
\group_end:
% \end{macrocode}
%
+% \subsection{PDF names and strings by expansion}
+%
+% \begin{macro}[EXP]{\str_convert_pdfname:n}
+% \begin{macro}[EXP]{\@@_convert_pdfname:n}
+% \begin{macro}[EXP]
+% {\@@_convert_pdfname_bytes:n, \@@_convert_pdfname_bytes_aux:n}
+% \begin{macro}[EXP]{\@@_convert_pdfname_bytes_aux:nnn}
+% To convert to PDF names by expansion, we work purely on UTF-8 input. The
+% first step is to make a string with \enquote{other} spaces,
+% after which we use a simple token-by-token approach. In Unicode
+% engines, we break down everything before one-byte codepoints, but for
+% $8$-bit engines there is no need to worry. Actual escaping is covered
+% by the same code as used in the non-expandable route.
+% \begin{macrocode}
+\cs_new:Npn \str_convert_pdfname:n #1
+ {
+ \exp_args:Ne \tl_to_str:n
+ { \str_map_function:nN {#1} \@@_convert_pdfname:n }
+ }
+\bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_new:Npn \@@_convert_pdfname:n #1
+ {
+ \int_compare:nNnTF { `#1 } > { "7F }
+ { \@@_convert_pdfname_bytes:n {#1} }
+ { \@@_escape_name_char:n {#1} }
+ }
+ \cs_new:Npn \@@_convert_pdfname_bytes:n #1
+ {
+ \exp_args:Ne \@@_convert_pdfname_bytes_aux:n
+ { \char_to_utfviii_bytes:n {`#1} }
+ }
+ \cs_new:Npn \@@_convert_pdfname_bytes_aux:n #1
+ { \@@_convert_pdfname_bytes_aux:nnnn #1 }
+ \cs_new:Npx \@@_convert_pdfname_bytes_aux:nnnn #1#2#3#4
+ {
+ \c_hash_str \exp_not:N \@@_output_hexadecimal:n {#1}
+ \c_hash_str \exp_not:N \@@_output_hexadecimal:n {#2}
+ \exp_not:N \tl_if_blank:nF {#3}
+ {
+ \c_hash_str \exp_not:N \@@_output_hexadecimal:n {#3}
+ \exp_not:N \tl_if_blank:nF {#4}
+ {
+ \c_hash_str \exp_not:N \@@_output_hexadecimal:n {#4}
+ }
+ }
+ }
+ }
+ { \cs_new_eq:NN \@@_convert_pdfname:n \@@_escape_name_char:n }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \subsubsection{\textsc{iso 8859} support}
@@ -2578,7 +2695,7 @@
% family, we keep track only of differences, and of unassigned bytes.
% \begin{macrocode}
%<*iso88591>
-\str_declare_eight_bit_encoding:nnn { iso88591 }
+\@@_declare_eight_bit_encoding:nnnn { iso88591 } { 256 }
{
}
{
@@ -2588,7 +2705,7 @@
%
% \begin{macrocode}
%<*iso88592>
-\str_declare_eight_bit_encoding:nnn { iso88592 }
+\@@_declare_eight_bit_encoding:nnnn { iso88592 } { 399 }
{
{ A1 } { 0104 }
{ A2 } { 02D8 }
@@ -2655,7 +2772,7 @@
%
% \begin{macrocode}
%<*iso88593>
-\str_declare_eight_bit_encoding:nnn { iso88593 }
+\@@_declare_eight_bit_encoding:nnnn { iso88593 } { 384 }
{
{ A1 } { 0126 }
{ A2 } { 02D8 }
@@ -2700,7 +2817,7 @@
%
% \begin{macrocode}
%<*iso88594>
-\str_declare_eight_bit_encoding:nnn { iso88594 }
+\@@_declare_eight_bit_encoding:nnnn { iso88594 } { 383 }
{
{ A1 } { 0104 }
{ A2 } { 0138 }
@@ -2760,7 +2877,7 @@
%
% \begin{macrocode}
%<*iso88595>
-\str_declare_eight_bit_encoding:nnn { iso88595 }
+\@@_declare_eight_bit_encoding:nnnn { iso88595 } { 374 }
{
{ A1 } { 0401 }
{ A2 } { 0402 }
@@ -2864,7 +2981,7 @@
%
% \begin{macrocode}
%<*iso88596>
-\str_declare_eight_bit_encoding:nnn { iso88596 }
+\@@_declare_eight_bit_encoding:nnnn { iso88596 } { 344 }
{
{ AC } { 060C }
{ BB } { 061B }
@@ -2954,7 +3071,7 @@
%
% \begin{macrocode}
%<*iso88597>
-\str_declare_eight_bit_encoding:nnn { iso88597 }
+\@@_declare_eight_bit_encoding:nnnn { iso88597 } { 498 }
{
{ A1 } { 2018 }
{ A2 } { 2019 }
@@ -3043,7 +3160,7 @@
%
% \begin{macrocode}
%<*iso88598>
-\str_declare_eight_bit_encoding:nnn { iso88598 }
+\@@_declare_eight_bit_encoding:nnnn { iso88598 } { 308 }
{
{ AA } { 00D7 }
{ BA } { 00F7 }
@@ -3120,7 +3237,7 @@
%
% \begin{macrocode}
%<*iso88599>
-\str_declare_eight_bit_encoding:nnn { iso88599 }
+\@@_declare_eight_bit_encoding:nnnn { iso88599 } { 352 }
{
{ D0 } { 011E }
{ DD } { 0130 }
@@ -3136,7 +3253,7 @@
%
% \begin{macrocode}
%<*iso885910>
-\str_declare_eight_bit_encoding:nnn { iso885910 }
+\@@_declare_eight_bit_encoding:nnnn { iso885910 } { 383 }
{
{ A1 } { 0104 }
{ A2 } { 0112 }
@@ -3192,7 +3309,7 @@
%
% \begin{macrocode}
%<*iso885911>
-\str_declare_eight_bit_encoding:nnn { iso885911 }
+\@@_declare_eight_bit_encoding:nnnn { iso885911 } { 369 }
{
{ A1 } { 0E01 }
{ A2 } { 0E02 }
@@ -3293,7 +3410,7 @@
%
% \begin{macrocode}
%<*iso885913>
-\str_declare_eight_bit_encoding:nnn { iso885913 }
+\@@_declare_eight_bit_encoding:nnnn { iso885913 } { 399 }
{
{ A1 } { 201D }
{ A5 } { 201E }
@@ -3359,7 +3476,7 @@
%
% \begin{macrocode}
%<*iso885914>
-\str_declare_eight_bit_encoding:nnn { iso885914 }
+\@@_declare_eight_bit_encoding:nnnn { iso885914 } { 529 }
{
{ A1 } { 1E02 }
{ A2 } { 1E03 }
@@ -3400,7 +3517,7 @@
%
% \begin{macrocode}
%<*iso885915>
-\str_declare_eight_bit_encoding:nnn { iso885915 }
+\@@_declare_eight_bit_encoding:nnnn { iso885915 } { 383 }
{
{ A4 } { 20AC }
{ A6 } { 0160 }
@@ -3418,7 +3535,7 @@
%
% \begin{macrocode}
%<*iso885916>
-\str_declare_eight_bit_encoding:nnn { iso885916 }
+\@@_declare_eight_bit_encoding:nnnn { iso885916 } { 558 }
{
{ A1 } { 0104 }
{ A2 } { 0105 }
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
index efb99050c56..2a0b175bfee 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
@@ -2,7 +2,7 @@
%
%% File: l3str.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -306,7 +306,8 @@
% \end{syntax}
% Compares the content of two \meta{str variables} and
% is logically \texttt{true} if the two contain the same characters
-% in the same order.
+% in the same order. See \cs{tl_if_eq:NNTF} to compare tokens
+% (including their category codes) rather than characters.
% \end{function}
%
% \begin{function}[EXP,pTF, updated = 2018-06-18]
@@ -326,7 +327,8 @@
% \begin{verbatim}
% \str_if_eq_p:no { abc } { \tl_to_str:n { abc } }
% \end{verbatim}
-% is logically \texttt{true}.
+% is logically \texttt{true}. See \cs{tl_if_eq:nnTF} to compare
+% tokens (including their category codes) rather than characters.
% \end{function}
%
% \begin{function}[TF, added = 2017-10-08]{\str_if_in:Nn, \str_if_in:cn}
@@ -813,7 +815,7 @@
%
% \section{Constant token lists}
%
-% \begin{variable}[added = 2015-09-19]
+% \begin{variable}[added = 2015-09-19,updated=2020-12-22]
% {
% \c_ampersand_str,
% \c_atsign_str,
@@ -826,7 +828,8 @@
% \c_hash_str,
% \c_percent_str,
% \c_tilde_str,
-% \c_underscore_str
+% \c_underscore_str,
+% \c_zero_str
% }
% Constant strings, containing a single character token, with category
% code $12$.
@@ -855,13 +858,53 @@
% \section{\pkg{l3str} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
%<@@=str>
% \end{macrocode}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{
+% \@@_use_none_delimit_by_s_stop:w,
+% \@@_use_i_delimit_by_s_stop:nw
+% }
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{
+% \@@_if_recursion_tail_break:NN,
+% \@@_if_recursion_tail_stop_do:Nn
+% }
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_break:NN
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop_do:Nn
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Creating and setting string variables}
%
% \begin{macro}
@@ -978,20 +1021,20 @@
% issues if we are fed a token list variable. Then the code is a much
% simplified version of the token list code because neither the
% delimiter nor the replacement can contain macro parameters or
-% braces. The delimiter \cs{q_mark} cannot appear in the string to
+% braces. The delimiter \cs{s_@@_mark} cannot appear in the string to
% edit so it is used in all cases. Some |x|-expansion is unnecessary.
% There is no need to avoid losing braces nor to protect against
% expansion. The ending code is much simplified and does not need to
% hide in braces.
% \begin{macrocode}
\cs_new_protected:Npn \str_replace_once:Nnn
- { \@@_replace:NNNnn \prg_do_nothing: \tl_set:Nx }
+ { \@@_replace:NNNnn \prg_do_nothing: \__kernel_tl_set:Nx }
\cs_new_protected:Npn \str_greplace_once:Nnn
- { \@@_replace:NNNnn \prg_do_nothing: \tl_gset:Nx }
+ { \@@_replace:NNNnn \prg_do_nothing: \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \str_replace_all:Nnn
- { \@@_replace:NNNnn \@@_replace_next:w \tl_set:Nx }
+ { \@@_replace:NNNnn \@@_replace_next:w \__kernel_tl_set:Nx }
\cs_new_protected:Npn \str_greplace_all:Nnn
- { \@@_replace:NNNnn \@@_replace_next:w \tl_gset:Nx }
+ { \@@_replace:NNNnn \@@_replace_next:w \__kernel_tl_gset:Nx }
\cs_generate_variant:Nn \str_replace_once:Nnn { c }
\cs_generate_variant:Nn \str_greplace_once:Nnn { c }
\cs_generate_variant:Nn \str_replace_all:Nnn { c }
@@ -1018,9 +1061,9 @@
{
\@@_replace_next:w
#4
- \use_none_delimit_by_q_stop:w
+ \@@_use_none_delimit_by_s_stop:w
#5
- \q_stop
+ \s_@@_stop
}
}
\cs_new_eq:NN \@@_replace_next:w ?
@@ -1079,44 +1122,12 @@
% \end{macro}
%
% \begin{macro}[EXP]{\@@_if_eq:nn}
-% \begin{macro}[EXP]{\@@_escape:n}
-% String comparisons rely on the primitive \cs[index=pdfstrcmp]{(pdf)strcmp} if available:
-% \LuaTeX{} does not have it, so emulation is required. As the net result
-% is that we do not \emph{always} use the primitive, the correct approach
-% is to wrap up in a function with defined behaviour. That's done by
-% providing a wrapper and then redefining in the \LuaTeX{} case. Note that
-% the necessary Lua code is loaded in \pkg{l3boostrap}.
-% The need to detokenize and force
-% expansion of input arises from the case where a |#| token is used in the
-% input, \emph{e.g.}~|\__str_if_eq:nn {#} { \tl_to_str:n {#} }|, which
-% otherwise would fail as \cs{tex_luaescapestring:D} does not double
-% such tokens.
+% String comparisons rely on the primitive \cs[index=pdfstrcmp]{(pdf)strcmp},
+% so we define a new name for it.
% \begin{macrocode}
-\cs_new:Npn \@@_if_eq:nn #1#2 { \tex_strcmp:D {#1} {#2} }
-\cs_if_exist:NT \tex_luatexversion:D
- {
- \cs_set_eq:NN \lua_escape:e \tex_luaescapestring:D
- \cs_set_eq:NN \lua_now:e \tex_directlua:D
- \cs_set:Npn \@@_if_eq:nn #1#2
- {
- \lua_now:e
- {
- l3kernel.strcmp
- (
- " \@@_escape:n {#1} " ,
- " \@@_escape:n {#2} "
- )
- }
- }
- \cs_new:Npn \@@_escape:n #1
- {
- \lua_escape:e
- { \__kernel_tl_to_str:w \use:e { {#1} } }
- }
- }
+\cs_new_eq:NN \@@_if_eq:nn \tex_strcmp:D
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \begin{macro}[pTF, EXP]
% {
@@ -1214,7 +1225,7 @@
\@@_case:nnTF {#1} {#2}
}
\cs_new:Npn \@@_case:nnTF #1#2#3#4
- { \@@_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
+ { \@@_case:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
\cs_generate_variant:Nn \str_case:nn { V , o , nV , nv }
\prg_generate_conditional_variant:Nnn \str_case:nn
{ V , o , nV , nv } { T , F , TF }
@@ -1245,14 +1256,14 @@
\@@_case_e:nnTF {#1} {#2}
}
\cs_new:Npn \@@_case_e:nnTF #1#2#3#4
- { \@@_case_e:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop }
+ { \@@_case_e:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
\cs_new:Npn \@@_case_e:nw #1#2#3
{
\str_if_eq:eeTF {#1} {#2}
{ \@@_case_end:nw {#3} }
{ \@@_case_e:nw {#1} }
}
-\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
{ \exp_end: #1 #4 }
% \end{macrocode}
% \end{macro}
@@ -1280,12 +1291,12 @@
% These are received by \cs{@@_map_function:Nn}, which passes
% the space to |#1| and calls \cs{@@_map_function:w} to deal with the
% next space. The space before the braced space allows to optimize
-% the \cs{q_recursion_tail} test. Of course we need to include a
+% the \cs{q_@@_recursion_tail} test. Of course we need to include a
% trailing space (the question mark is needed to avoid losing the
% space when \TeX{} tokenizes the line).
% At the cost of about three more auxiliaries this code could get a $9$
% times speed up by testing only every $9$-th character for whether it
-% is \cs{q_recursion_tail} (also by converting $9$ spaces at a time in
+% is \cs{q_@@_recursion_tail} (also by converting $9$ spaces at a time in
% the \cs{str_map_function:nN} case).
%
% For the \texttt{map_variable} functions we use a string assignment
@@ -1297,7 +1308,7 @@
\exp_after:wN \@@_map_function:w
\exp_after:wN \@@_map_function:Nn \exp_after:wN #2
\__kernel_tl_to_str:w {#1}
- \q_recursion_tail ? ~
+ \q_@@_recursion_tail ? ~
\prg_break_point:Nn \str_map_break: { }
}
\cs_new:Npn \str_map_function:NN
@@ -1306,7 +1317,7 @@
{ #1 { ~ { ~ } \@@_map_function:w } }
\cs_new:Npn \@@_map_function:Nn #1#2
{
- \if_meaning:w \q_recursion_tail #2
+ \if_meaning:w \q_@@_recursion_tail #2
\exp_after:wN \str_map_break:
\fi:
#1 #2 \@@_map_function:Nn #1
@@ -1323,7 +1334,7 @@
\exp_not:c { @@_map_ \int_use:N \g__kernel_prg_map_int :w }
\__kernel_str_to_other_fast:n {#1}
}
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:Nn \str_map_break:
{ \int_gdecr:N \g__kernel_prg_map_int }
}
@@ -1332,7 +1343,7 @@
\cs_generate_variant:Nn \str_map_inline:Nn { c }
\cs_new:Npn \@@_map_inline:NN #1#2
{
- \quark_if_recursion_tail_break:NN #2 \str_map_break:
+ \@@_if_recursion_tail_break:NN #2 \str_map_break:
\exp_args:No #1 { \token_to_str:N #2 }
\@@_map_inline:NN #1
}
@@ -1343,14 +1354,14 @@
\exp_not:n { \@@_map_variable:NnN #2 {#3} }
\__kernel_str_to_other_fast:n {#1}
}
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:Nn \str_map_break: { }
}
\cs_new_protected:Npn \str_map_variable:NNn
{ \exp_args:No \str_map_variable:nNn }
\cs_new_protected:Npn \@@_map_variable:NnN #1#2#3
{
- \quark_if_recursion_tail_break:NN #3 \str_map_break:
+ \@@_if_recursion_tail_break:NN #3 \str_map_break:
\str_set:Nn #1 {#3}
\use:n {#2}
\@@_map_variable:NnN #1 {#2}
@@ -1378,17 +1389,17 @@
% \begin{macro}[EXP]{\@@_to_other_loop:w, \@@_to_other_end:w}
% First apply \cs{tl_to_str:n}, then replace all spaces by
% \enquote{other} spaces, $8$ at a time, storing the converted part of
-% the string between the \cs{q_mark} and \cs{q_stop} markers. The end
+% the string between the \cs{s_@@_mark} and \cs{s_@@_stop} markers. The end
% is detected when \cs{@@_to_other_loop:w} finds one of the trailing
% |A|, distinguished from any contents of the initial token list by
% their category. Then \cs{@@_to_other_end:w} is called, and finds
-% the result between \cs{q_mark} and the first |A| (well, there is
+% the result between \cs{s_@@_mark} and the first |A| (well, there is
% also the need to remove a space).
% \begin{macrocode}
\cs_new:Npn \__kernel_str_to_other:n #1
{
\exp_after:wN \@@_to_other_loop:w
- \tl_to_str:n {#1} ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \q_mark \q_stop
+ \tl_to_str:n {#1} ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \s_@@_mark \s_@@_stop
}
\group_begin:
\tex_lccode:D `\* = `\ %
@@ -1397,15 +1408,15 @@
{
\group_end:
\cs_new:Npn \@@_to_other_loop:w
- #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 ~ #7 ~ #8 ~ #9 \q_stop
+ #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 ~ #7 ~ #8 ~ #9 \s_@@_stop
{
\if_meaning:w A #8
\@@_to_other_end:w
\fi:
\@@_to_other_loop:w
- #9 #1 * #2 * #3 * #4 * #5 * #6 * #7 * #8 * \q_stop
+ #9 #1 * #2 * #3 * #4 * #5 * #6 * #7 * #8 * \s_@@_stop
}
- \cs_new:Npn \@@_to_other_end:w \fi: #1 \q_mark #2 * A #3 \q_stop
+ \cs_new:Npn \@@_to_other_end:w \fi: #1 \s_@@_mark #2 * A #3 \s_@@_stop
{ \fi: #2 }
}
% \end{macrocode}
@@ -1421,7 +1432,7 @@
\cs_new:Npn \__kernel_str_to_other_fast:n #1
{
\exp_after:wN \@@_to_other_fast_loop:w \tl_to_str:n {#1} ~
- A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \q_stop
+ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \s_@@_stop
}
\group_begin:
\tex_lccode:D `\* = `\ %
@@ -1438,7 +1449,7 @@
#1 * #2 * #3 * #4 * #5 * #6 * #7 * #8 * #9
\@@_to_other_fast_loop:w *
}
- \cs_new:Npn \@@_to_other_fast_end:w #1 * A #2 \q_stop {#1}
+ \cs_new:Npn \@@_to_other_fast_end:w #1 * A #2 \s_@@_stop {#1}
}
% \end{macrocode}
% \end{macro}
@@ -1481,25 +1492,25 @@
\exp_after:wN \@@_item:w
\int_value:w \int_eval:n {#2} \exp_after:wN ;
\int_value:w \@@_count:n {#1} ;
- #1 \q_stop
+ #1 \s_@@_stop
}
\cs_new:Npn \@@_item:w #1; #2;
{
\int_compare:nNnTF {#1} < 0
{
\int_compare:nNnTF {#1} < {-#2}
- { \use_none_delimit_by_q_stop:w }
+ { \@@_use_none_delimit_by_s_stop:w }
{
- \exp_after:wN \use_i_delimit_by_q_stop:nw
+ \exp_after:wN \@@_use_i_delimit_by_s_stop:nw
\exp:w \exp_after:wN \@@_skip_exp_end:w
\int_value:w \int_eval:n { #1 + #2 } ;
}
}
{
\int_compare:nNnTF {#1} > {#2}
- { \use_none_delimit_by_q_stop:w }
+ { \@@_use_none_delimit_by_s_stop:w }
{
- \exp_after:wN \use_i_delimit_by_q_stop:nw
+ \exp_after:wN \@@_use_i_delimit_by_s_stop:nw
\exp:w \@@_skip_exp_end:w #1 ; { }
}
}
@@ -1581,7 +1592,7 @@
\int_value:w \@@_count:n {#1} \exp_after:wN ;
\int_value:w \int_eval:n { (#2) - 1 } \exp_after:wN ;
\int_value:w \int_eval:n {#3} ;
- #1 \q_stop
+ #1 \s_@@_stop
}
\cs_new:Npn \@@_range:w #1; #2; #3;
{
@@ -1635,7 +1646,7 @@
% \@@_collect_end:wn, \@@_collect_end:nnnnnnnnw
% }
% Collects |max(#1,0)| characters, and removes everything else until
-% \cs{q_stop}. This is somewhat similar to \cs{@@_skip_exp_end:w}, but
+% \cs{s_@@_stop}. This is somewhat similar to \cs{@@_skip_exp_end:w}, but
% accepts integer expression arguments. This time we can only grab
% $7$ characters at a time. At the end, we use an \cs{if_case:w}
% trick again, so that the $8$ first arguments of
@@ -1668,7 +1679,7 @@
#1 \else: 0 \fi: \exp_stop_f:
\or: \or: \or: \or: \or: \or: \fi:
}
-\cs_new:Npn \@@_collect_end:nnnnnnnnw #1#2#3#4#5#6#7#8 #9 \q_stop
+\cs_new:Npn \@@_collect_end:nnnnnnnnw #1#2#3#4#5#6#7#8 #9 \s_@@_stop
{ #1#2#3#4#5#6#7#8 }
% \end{macrocode}
% \end{macro}
@@ -1695,13 +1706,13 @@
\exp_after:wN \@@_count_spaces_loop:w
\tl_to_str:n {#1} ~
X 7 ~ X 6 ~ X 5 ~ X 4 ~ X 3 ~ X 2 ~ X 1 ~ X 0 ~ X -1 ~
- \q_stop
+ \s_@@_stop
}
}
\cs_new:Npn \@@_count_spaces_loop:w #1~#2~#3~#4~#5~#6~#7~#8~#9~
{
\if_meaning:w X #9
- \use_i_delimit_by_q_stop:nw
+ \@@_use_i_delimit_by_s_stop:nw
\fi:
9 + \@@_count_spaces_loop:w
}
@@ -1755,13 +1766,13 @@
{ X 8 } { X 7 } { X 6 }
{ X 5 } { X 4 } { X 3 }
{ X 2 } { X 1 } { X 0 }
- \q_stop
+ \s_@@_stop
}
}
\cs_new:Npn \@@_count_loop:NNNNNNNNN #1#2#3#4#5#6#7#8#9
{
\if_meaning:w X #9
- \exp_after:wN \use_none_delimit_by_q_stop:w
+ \exp_after:wN \@@_use_none_delimit_by_s_stop:w
\fi:
9 + \@@_count_loop:NNNNNNNNN
}
@@ -1781,14 +1792,14 @@
% hands it to \cs{str_head:n}. To circumvent the fact that \TeX{}
% skips spaces when grabbing undelimited macro parameters,
% \cs{@@_head:w} takes an argument delimited by a space. If |#1|
-% starts with a non-space character, \cs{use_i_delimit_by_q_stop:nw}
+% starts with a non-space character, \cs{@@_use_i_delimit_by_s_stop:nw}
% leaves that in the input stream. On the other hand, if |#1| starts
% with a space, the \cs{@@_head:w} takes an empty argument, and the
% single (initially braced) space in the definition of \cs{@@_head:w}
% makes its way to the output. Finally, for an empty argument, the
% (braced) empty brace group in the definition of \cs{str_head:n}
% gives an empty result after passing through
-% \cs{use_i_delimit_by_q_stop:nw}.
+% \cs{@@_use_i_delimit_by_s_stop:nw}.
% \begin{macrocode}
\cs_new:Npn \str_head:N { \exp_args:No \str_head:n }
\cs_generate_variant:Nn \str_head:N { c }
@@ -1796,14 +1807,14 @@
{
\exp_after:wN \@@_head:w
\tl_to_str:n {#1}
- { { } } ~ \q_stop
+ { { } } ~ \s_@@_stop
}
\cs_new:Npn \@@_head:w #1 ~ %
- { \use_i_delimit_by_q_stop:nw #1 { ~ } }
+ { \@@_use_i_delimit_by_s_stop:nw #1 { ~ } }
\cs_new:Npn \str_head_ignore_spaces:n #1
{
- \exp_after:wN \use_i_delimit_by_q_stop:nw
- \tl_to_str:n {#1} { } \q_stop
+ \exp_after:wN \@@_use_i_delimit_by_s_stop:nw
+ \tl_to_str:n {#1} { } \s_@@_stop
}
% \end{macrocode}
% \end{macro}
@@ -1823,7 +1834,7 @@
% end-marker |X| be unexpandable and not a control sequence). The
% \texttt{_ignore_spaces} is rather simpler: after converting the
% input to a string, \cs{@@_tail_auxii:w} removes one undelimited
-% argument and leaves everything else until an end-marker \cs{q_mark}.
+% argument and leaves everything else until an end-marker \cs{s_@@_mark}.
% One can check that an empty (or blank) string yields an empty
% tail.
% \begin{macrocode}
@@ -1833,15 +1844,15 @@
{
\exp_after:wN \@@_tail_auxi:w
\reverse_if:N \if_charcode:w
- \scan_stop: \tl_to_str:n {#1} X X \q_stop
+ \scan_stop: \tl_to_str:n {#1} X X \s_@@_stop
}
-\cs_new:Npn \@@_tail_auxi:w #1 X #2 \q_stop { \fi: #1 }
+\cs_new:Npn \@@_tail_auxi:w #1 X #2 \s_@@_stop { \fi: #1 }
\cs_new:Npn \str_tail_ignore_spaces:n #1
{
\exp_after:wN \@@_tail_auxii:w
- \tl_to_str:n {#1} \q_mark \q_mark \q_stop
+ \tl_to_str:n {#1} \s_@@_mark \s_@@_mark \s_@@_stop
}
-\cs_new:Npn \@@_tail_auxii:w #1 #2 \q_mark #3 \q_stop { #2 }
+\cs_new:Npn \@@_tail_auxii:w #1 #2 \s_@@_mark #3 \s_@@_stop { #2 }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1880,7 +1891,7 @@
}
\cs_new:Npn \@@_change_case_aux:nn #1#2
{
- \@@_change_case_loop:nw {#2} #1 \q_recursion_tail \q_recursion_stop
+ \@@_change_case_loop:nw {#2} #1 \q_@@_recursion_tail \q_@@_recursion_stop
\@@_change_case_result:n { }
}
\cs_new:Npn \@@_change_case_output:nw #1#2 \@@_change_case_result:n #3
@@ -1888,12 +1899,12 @@
\cs_generate_variant:Nn \@@_change_case_output:nw { f }
\cs_new:Npn \@@_change_case_end:wn #1 \@@_change_case_result:n #2
{ \tl_to_str:n {#2} }
-\cs_new:Npn \@@_change_case_loop:nw #1#2 \q_recursion_stop
+\cs_new:Npn \@@_change_case_loop:nw #1#2 \q_@@_recursion_stop
{
\tl_if_head_is_space:nTF {#2}
{ \@@_change_case_space:n }
{ \@@_change_case_char:nN }
- {#1} #2 \q_recursion_stop
+ {#1} #2 \q_@@_recursion_stop
}
\exp_last_unbraced:NNNNo
\cs_new:Npn \@@_change_case_space:n #1 \c_space_tl
@@ -1903,7 +1914,7 @@
}
\cs_new:Npn \@@_change_case_char:nN #1#2
{
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ \@@_change_case_end:wn }
\@@_change_case_output:fw
{ \use:c { char_str_ #1 case:N } #2 }
@@ -1933,7 +1944,8 @@
% \c_hash_str,
% \c_percent_str,
% \c_tilde_str,
-% \c_underscore_str
+% \c_underscore_str,
+% \c_zero_str
% }
% For all of those strings, use \cs{cs_to_str:N} to get characters with
% the correct category code without worries
@@ -1950,6 +1962,7 @@
\str_const:Nx \c_percent_str { \cs_to_str:N \% }
\str_const:Nx \c_tilde_str { \cs_to_str:N \~ }
\str_const:Nx \c_underscore_str { \cs_to_str:N \_ }
+\str_const:Nx \c_zero_str { 0 }
% \end{macrocode}
% \end{variable}
%
@@ -1980,7 +1993,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
index 382b2a50703..9bcbee56a66 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
@@ -2,7 +2,7 @@
%
%% File: l3sys.dtx
%
-% Copyright (C) 2015-2020 The LaTeX3 Project
+% Copyright (C) 2015-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -105,6 +105,22 @@
% |luatex|, |pdftex|, |ptex|, |uptex| or |xetex|.
% \end{variable}
%
+% \begin{variable}[added = 2020-08-20]{\c_sys_engine_exec_str}
+% The name of the standard executable for the current \TeX{} engine given
+% as a lower case string: one of |luatex|,
+% |luahbtex|, |pdftex|, |eptex|, |euptex| or |xetex|.
+% \end{variable}
+%
+% \begin{variable}[added = 2020-08-20]{\c_sys_engine_format_str}
+% The name of the preloaded format for the current \TeX{} run given
+% as a lower case string: one of
+% |lualatex| (or |dvilualatex|),
+% |pdflatex| (or |latex|), |platex|, |uplatex| or |xelatex| for \LaTeX{},
+% similar names for plain \TeX{} (except \pdfTeX{} in DVI mode yields
+% |etex|), and |cont-en| for Con\TeX{}t (i.e.~the
+% \tn{fmtname}).
+% \end{variable}
+%
% \section{Output format}
%
% \begin{function}[added = 2015-09-19, EXP, pTF]
@@ -252,7 +268,7 @@
% Execute \meta{tokens} through shell escape at shipout.
% \end{function}
%
-% \subsection{Loading configuration data}
+% \section{Loading configuration data}
%
% \begin{function}[added = 2019-09-12]{\sys_load_backend:n}
% \begin{syntax}
@@ -277,7 +293,7 @@
% back deprecations, respectively.
% \end{function}
%
-% \subsection{Final settins}
+% \subsection{Final settings}
%
% \begin{function}[added = 2019-10-06]{\sys_finalise:}
% \begin{syntax}
@@ -300,7 +316,8 @@
% \subsection{Kernel code}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
+%<*tex>
% \end{macrocode}
%
% \subsubsection{Detecting the engine}
@@ -361,6 +378,75 @@
% \end{variable}
% \end{macro}
%
+% \begin{variable}{\c_sys_engine_exec_str,\c_sys_engine_format_str}
+% Take the functions defined above, and set up the engine and format
+% names. \cs{c_sys_engine_exec_str} differs from \cs{c_sys_engine_str}
+% as it is the \emph{actual} engine name, not a \enquote{filtered}
+% version. It differs for |ptex| and |uptex|, which have a leading
+% |e|, and for |luatex|, because \LaTeX{} uses the \Lua HB\TeX{}
+% engine.
+%
+% \cs{c_sys_engine_format_str} is quite similar to
+% \cs{c_sys_engine_str}, except that it differentiates |pdflatex| from
+% |latex| (which is \pdfTeX{} in DVI mode). This differentiation,
+% however, is reliable only if the user doesn't change
+% \cs{tex_pdfoutput:D} before loading this code.
+% \begin{macrocode}
+\group_begin:
+ \cs_set_eq:NN \lua_now:e \tex_directlua:D
+ \str_const:Nx \c_sys_engine_exec_str
+ {
+ \sys_if_engine_pdftex:T { pdf }
+ \sys_if_engine_xetex:T { xe }
+ \sys_if_engine_ptex:T { ep }
+ \sys_if_engine_uptex:T { eup }
+ \sys_if_engine_luatex:T
+ {
+ lua \lua_now:e
+ {
+ if (pcall(require, 'luaharfbuzz')) then ~
+ tex.print("hb") ~
+ end
+ }
+ }
+ tex
+ }
+\group_end:
+\str_const:Nx \c_sys_engine_format_str
+ {
+ \cs_if_exist:NTF \fmtname
+ {
+ \bool_lazy_or:nnTF
+ { \str_if_eq_p:Vn \fmtname { plain } }
+ { \str_if_eq_p:Vn \fmtname { LaTeX2e } }
+ {
+ \sys_if_engine_pdftex:T
+ { \int_compare:nNnT { \tex_pdfoutput:D } = { 1 } { pdf } }
+ \sys_if_engine_xetex:T { xe }
+ \sys_if_engine_ptex:T { p }
+ \sys_if_engine_uptex:T { up }
+ \sys_if_engine_luatex:T
+ {
+ \int_compare:nNnT { \tex_pdfoutput:D } = { 0 } { dvi }
+ lua
+ }
+ \str_if_eq:VnTF \fmtname { LaTeX2e }
+ { latex }
+ {
+ \bool_lazy_and:nnT
+ { \sys_if_engine_pdftex_p: }
+ { \int_compare_p:nNn { \tex_pdfoutput:D } = { 0 } }
+ { e }
+ tex
+ }
+ }
+ { \fmtname }
+ }
+ { unknown }
+ }
+% \end{macrocode}
+% \end{variable}
+%
% \subsubsection{Randomness}
%
% This candidate function is placed there because
@@ -415,22 +501,35 @@
\str_case:VnF #1
{
{ dvisvgm } { }
- { xdvipdfmx } { }
+ { xdvipdfmx } { \tl_gset:Nn #1 { xetex } }
+ { xetex } { }
}
{
\__kernel_msg_error:nnxx { sys } { wrong-backend }
- #1 { xdvipdfmx }
- \tl_gset:Nn #1 { xdvipdfmx }
+ #1 { xetex }
+ \tl_gset:Nn #1 { xetex }
}
}
{
\sys_if_output_pdf:TF
{
- \str_if_eq:VnF #1 { pdfmode }
+ \str_if_eq:VnTF #1 { pdfmode }
{
- \__kernel_msg_error:nnxx { sys } { wrong-backend }
- #1 { pdfmode }
- \tl_gset:Nn #1 { pdfmode }
+ \sys_if_engine_luatex:TF
+ { \tl_gset:Nn #1 { luatex } }
+ { \tl_gset:Nn #1 { pdftex } }
+ }
+ {
+ \bool_lazy_or:nnF
+ { \str_if_eq_p:Vn #1 { luatex } }
+ { \str_if_eq_p:Vn #1 { pdftex } }
+ {
+ \__kernel_msg_error:nnxx { sys } { wrong-backend }
+ #1 { \sys_if_engine_luatex:TF { luatex } { pdftex } }
+ \sys_if_engine_luatex:TF
+ { \tl_gset:Nn #1 { luatex } }
+ { \tl_gset:Nn #1 { pdftex } }
+ }
}
}
{
@@ -552,34 +651,78 @@
% \end{variable}
%
% \begin{macro}{\sys_shell_now:n}
+% \begin{macro}{\@@_shell_now:e}
% Execute commands through shell escape immediately.
+%
+% For \LuaTeX{}, we use a pseudo-primitive to do the actual work.
% \begin{macrocode}
+%</tex>
+%<*lua>
+do
+ local os_exec = os.execute
+
+ local function shellescape(cmd)
+ local status,msg = os_exec(cmd)
+ if status == nil then
+ write_nl("log","runsystem(" .. cmd .. ")...(" .. msg .. ")\n")
+ elseif status == 0 then
+ write_nl("log","runsystem(" .. cmd .. ")...executed\n")
+ else
+ write_nl("log","runsystem(" .. cmd .. ")...failed " .. (msg or "") .. "\n")
+ end
+ end
+ luacmd("@@_shell_now:e", function()
+ shellescape(scan_string())
+ end, "global", "protected")
+%</lua>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*tex>
\sys_if_engine_luatex:TF
{
\cs_new_protected:Npn \sys_shell_now:n #1
- {
- \lua_now:e
- { l3kernel.shellescape(" \lua_escape:e { \tl_to_str:n {#1} } ") }
- }
+ { \@@_shell_now:e { \exp_not:n {#1} } }
}
{
\cs_new_protected:Npn \sys_shell_now:n #1
{ \iow_now:Nn \c_@@_shell_stream_int {#1} }
}
\cs_generate_variant:Nn \sys_shell_now:n { x }
+%</tex>
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\sys_shell_shipout:n}
+% \begin{macro}{\@@_shell_shipout:e}
% Execute commands through shell escape at shipout.
+%
+% For \LuaTeX, we use the same helper as above but delayed to using a late_lua whatsit.
+% \begin{macrocode}
+%<*lua>
+ local whatsit_id = node.id'whatsit'
+ local latelua_sub = node.subtype'late_lua'
+ local node_new = node.direct.new
+ local setfield = node.direct.setwhatsitfield or node.direct.setfield
+ local node_write = node.direct.write
+
+ luacmd("@@_shell_shipout:e", function()
+ local cmd = scan_string()
+ local n = node_new(whatsit_id, latelua_sub)
+ setfield(n, 'data', function() shellescape(cmd) end)
+ node_write(n)
+ end, "global", "protected")
+end
+%</lua>
+% \end{macrocode}
+%
% \begin{macrocode}
+%<*tex>
\sys_if_engine_luatex:TF
{
\cs_new_protected:Npn \sys_shell_shipout:n #1
- {
- \lua_shipout_e:n
- { l3kernel.shellescape(" \lua_escape:e { \tl_to_str:n {#1} } ") }
- }
+ { \@@_shell_shipout:e { \exp_not:n {#1} } }
}
{
\cs_new_protected:Npn \sys_shell_shipout:n #1
@@ -588,6 +731,7 @@
\cs_generate_variant:Nn \sys_shell_shipout:n { x }
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \subsection{Dynamic (every job) code}
%
@@ -828,13 +972,17 @@
\tl_new:N \g_@@_backend_tl
\@@_finalise:n
{
- \tl_gset:Nx \g_@@_backend_tl
+ \__kernel_tl_gset:Nx \g_@@_backend_tl
{
\sys_if_engine_xetex:TF
- { xdvipdfmx }
+ { xetex }
{
\sys_if_output_pdf:TF
- { pdfmode }
+ {
+ \sys_if_engine_pdftex:TF
+ { pdftex }
+ { luatex }
+ }
{ dvips }
}
}
@@ -874,7 +1022,8 @@
% \end{variable}
%
% \begin{macrocode}
-%</initex|package>
+%</tex>
+%</package>
% \end{macrocode}
%
%\end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
index 44b06224b5f..19f6e85035b 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
@@ -2,7 +2,7 @@
%
%% File: l3text-case.dtx
%
-% Copyright (C) 2020 The LaTeX3 Project
+% Copyright (C) 2020,2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -56,7 +56,7 @@
% \section{\pkg{l3text-case} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -65,6 +65,14 @@
%
% \subsection{Case changing}
%
+% \begin{variable}{\l_text_titlecase_check_letter_bool}
+% Needed to determine the route used in titlecasing.
+% \begin{macrocode}
+\bool_new:N \l_text_titlecase_check_letter_bool
+\bool_set_true:N \l_text_titlecase_check_letter_bool
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}[EXP]
% {
% \text_lowercase:n,
@@ -147,12 +155,15 @@
% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnN}
% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnNw}
% \begin{macro}[EXP]{\@@_change_case_lower_sigma:NnnN}
+% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnnNN}
+% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnw}
+% \begin{macro}[EXP]{\@@_change_case_lower_sigma:nnN}
% \begin{macro}[EXP]
% {\@@_change_case_char_title:nnN, \@@_change_case_char_titleonly:nnN}
% \begin{macro}[EXP]
% {\@@_change_case_char_title:nN, \@@_change_case_char_titleonly:nN}
% \begin{macro}[EXP]{\@@_change_case_char_title:nnnN}
-% \begin{macro}[EXP]{\@@_change_case_char_char:nnnN}
+% \begin{macro}[EXP]{\@@_change_case_char:nnnN, \@@_change_case_char_aux:nnnN}
% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nnnNN}
% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nnnNNN}
% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nnnNNNNN}
@@ -198,8 +209,9 @@
\cs_new:Npn \@@_change_case_aux:nnn #1#2#3
{
\group_align_safe_begin:
+ \cs_if_exist_use:c { @@_change_case_boundary_ #2 _ #3 :Nnnw }
\@@_change_case_loop:nnw {#2} {#3} #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
\@@_change_case_result:n { }
}
% \end{macrocode}
@@ -219,7 +231,7 @@
% \end{macrocode}
% The main loop is the standard \texttt{tl action} type.
% \begin{macrocode}
-\cs_new:Npn \@@_change_case_loop:nnw #1#2#3 \q_recursion_stop
+\cs_new:Npn \@@_change_case_loop:nnw #1#2#3 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#3}
{ \@@_change_case_N_type:nnN }
@@ -228,9 +240,9 @@
{ \use:c { @@_change_case_group_ #1 :nnn } }
{ \@@_change_case_space:nnw }
}
- {#1} {#2} #3 \q_recursion_stop
+ {#1} {#2} #3 \q_@@_recursion_stop
}
-\cs_new:Npn \@@_change_case_break:w #1 \q_recursion_tail \q_recursion_stop
+\cs_new:Npn \@@_change_case_break:w #1 \q_@@_recursion_tail \q_@@_recursion_stop
{
\@@_change_case_store:n {#1}
\@@_change_case_end:w
@@ -288,6 +300,7 @@
}
{
\@@_change_case_store:n { ~ }
+ \cs_if_exist_use:c { @@_change_case_boundary_ #1 _ #2 :Nnnw }
\@@_change_case_loop:nnw {#1} {#2}
}
% \end{macrocode}
@@ -301,7 +314,7 @@
% \begin{macrocode}
\cs_new:Npn \@@_change_case_N_type:nnN #1#2#3
{
- \quark_if_recursion_tail_stop_do:Nn #3
+ \@@_if_recursion_tail_stop_do:Nn #3
{ \@@_change_case_end:w }
\@@_change_case_N_type_aux:nnN {#1} {#2} #3
}
@@ -313,16 +326,16 @@
\cs_new:Npn \@@_change_case_N_type:nnnN #1#2#3#4
{
\@@_change_case_math_search:nnNNN {#2} {#3} #4 #1
- \q_recursion_tail \q_recursion_tail
- \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_tail
+ \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_math_search:nnNNN #1#2#3#4#5
{
- \quark_if_recursion_tail_stop_do:Nn #4
+ \@@_if_recursion_tail_stop_do:Nn #4
{ \@@_change_case_cs_check:nnN {#1} {#2} #3 }
\token_if_eq_meaning:NNTF #3 #4
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{
\@@_change_case_store:n {#3}
\@@_change_case_math_loop:nnNw {#1} {#2} #5
@@ -330,7 +343,7 @@
}
{ \@@_change_case_math_search:nnNNN {#1} {#2} #3 }
}
-\cs_new:Npn \@@_change_case_math_loop:nnNw #1#2#3#4 \q_recursion_stop
+\cs_new:Npn \@@_change_case_math_loop:nnNw #1#2#3#4 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#4}
{ \@@_change_case_math_N_type:nnNN }
@@ -339,11 +352,11 @@
{ \@@_change_case_math_group:nnNn }
{ \@@_change_case_math_space:nnNw }
}
- {#1} {#2} #3 #4 \q_recursion_stop
+ {#1} {#2} #3 #4 \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_math_N_type:nnNN #1#2#3#4
{
- \quark_if_recursion_tail_stop_do:Nn #4
+ \@@_if_recursion_tail_stop_do:Nn #4
{ \@@_change_case_end:w }
\@@_change_case_store:n {#4}
\token_if_eq_meaning:NNTF #4 #3
@@ -394,15 +407,15 @@
\cs_new:Npn \@@_change_case_exclude:nnnN #1#2#3#4
{
\@@_change_case_exclude:nnNN {#2} {#3} #4 #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_exclude:nnNN #1#2#3#4
{
- \quark_if_recursion_tail_stop_do:Nn #4
+ \@@_if_recursion_tail_stop_do:Nn #4
{ \use:c { @@_change_case_letterlike_ #1 :nnN } {#1} {#2} #3 }
- \cs_if_eq:NNTF #3 #4
+ \str_if_eq:nnTF {#3} {#4}
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{ \@@_change_case_exclude:nnNn {#1} {#2} #3 }
}
{ \@@_change_case_exclude:nnNN {#1} {#2} #3 }
@@ -453,16 +466,10 @@
% is there the special case of a terminal sigma. If not, then we pass to
% a simple character mapping.
% \begin{macrocode}
-\cs_new:Npx \@@_change_case_char_lower:nnN #1#2#3
+\cs_new:Npn \@@_change_case_char_lower:nnN #1#2#3
{
- \exp_not:N \cs_if_exist_use:cF { @@_change_case_lower_ #2 :nnnN }
- {
- \bool_lazy_or:nnTF
- { \sys_if_engine_luatex_p: }
- { \sys_if_engine_xetex_p: }
- { \exp_not:N \@@_change_case_lower_sigma:nnnN }
- { \exp_not:N \@@_change_case_char:nnnN }
- }
+ \cs_if_exist_use:cF { @@_change_case_lower_ #2 :nnnN }
+ { \@@_change_case_lower_sigma:nnnN }
{#1} {#1} {#2} #3
}
\cs_new:Npn \@@_change_case_char_upper:nnN #1#2#3
@@ -477,7 +484,7 @@
% then there is a look-ahead phase: the logic here is simply based on letters.
% The one exception is Dutch: see below.
% \begin{macrocode}
-\bool_lazy_or:nnT
+\bool_lazy_or:nnTF
{ \sys_if_engine_luatex_p: }
{ \sys_if_engine_xetex_p: }
{
@@ -487,7 +494,7 @@
{ \@@_change_case_lower_sigma:nnNw {#2} {#3} #4 }
{ \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
}
- \cs_new:Npn \@@_change_case_lower_sigma:nnNw #1#2#3#4 \q_recursion_stop
+ \cs_new:Npn \@@_change_case_lower_sigma:nnNw #1#2#3#4 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#4}
{ \@@_change_case_lower_sigma:NnnN #3 }
@@ -496,7 +503,7 @@
{ \char_generate:nn { "03C2 } { \@@_char_catcode:N #3 } }
\@@_change_case_loop:nnw
}
- {#1} {#2} #4 \q_recursion_stop
+ {#1} {#2} #4 \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_lower_sigma:NnnN #1#2#3#4
{
@@ -510,6 +517,48 @@
}
}
% \end{macrocode}
+% In the $8$-bit engines, we have to look ahead once we find the first byte of the
+% possible hit.
+% \begin{macrocode}
+ {
+ \cs_new:Npn \@@_change_case_lower_sigma:nnnN #1#2#3#4
+ {
+ \int_compare:nNnTF { `#4 } = { "CE }
+ { \@@_change_case_lower_sigma:nnnNN }
+ { \@@_change_case_char:nnnN }
+ {#1} {#2} {#3} #4
+ }
+ \cs_new:Npn \@@_change_case_lower_sigma:nnnNN #1#2#3#4#5
+ {
+ \int_compare:nNnTF { `#5 } = { "A3 }
+ { \@@_change_case_lower_sigma:nnw {#2} {#3} }
+ { \@@_change_case_char:nnnN {#1} {#2} {#3} #4#5 }
+ }
+ \cs_new:Npn \@@_change_case_lower_sigma:nnw #1#2#3 \q_@@_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#3}
+ { \@@_change_case_lower_sigma:nnN }
+ {
+ \@@_change_case_store:V \c_@@_final_sigma_tl
+ \@@_change_case_loop:nnw
+ }
+ {#1} {#2} #3 \q_@@_recursion_stop
+ }
+ \cs_new:Npn \@@_change_case_lower_sigma:nnN #1#2#3
+ {
+ \bool_lazy_or:nnTF
+ { \token_if_letter_p:N #3 }
+ {
+ \bool_lazy_and_p:nn
+ { \token_if_active_p:N #3 }
+ { \int_compare_p:nNn { `#3 } > { "80 } }
+ }
+ { \@@_change_case_store:V \c_@@_sigma_tl }
+ { \@@_change_case_store:V \c_@@_final_sigma_tl }
+ \@@_change_case_loop:nnw {#1} {#2} #3
+ }
+ }
+% \end{macrocode}
% For titlecasing, we need to fully expand the new character to see if it
% is a letter (or active) But that means looking ahead in the $8$-bit case, so
% we have to grab the required tokens up-front. Life is a lot easier for Unicode
@@ -519,17 +568,21 @@
% \begin{macrocode}
\cs_new:Npx \@@_change_case_char_title:nnN #1#2#3
{
- \bool_lazy_or:nnTF
- { \sys_if_engine_luatex_p: }
- { \sys_if_engine_xetex_p: }
- { \exp_not:N \token_if_letter:NTF #3 }
+ \exp_not:N \bool_if:NTF \l_text_titlecase_check_letter_bool
{
- \exp_not:N \bool_lazy_or:nnTF
- { \exp_not:N \token_if_letter_p:N #3 }
- { \exp_not:N \token_if_active_p:N #3 }
+ \bool_lazy_or:nnTF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ { \exp_not:N \token_if_letter:NTF #3 }
+ {
+ \exp_not:N \bool_lazy_or:nnTF
+ { \exp_not:N \token_if_letter_p:N #3 }
+ { \exp_not:N \token_if_active_p:N #3 }
+ }
+ { \exp_not:N \use:c { @@_change_case_char_ #1 :nN } }
+ { \exp_not:N \@@_change_case_char_title:nnnN { title } {#1} }
}
{ \exp_not:N \use:c { @@_change_case_char_ #1 :nN } }
- { \exp_not:N \@@_change_case_char_title:nnnN { title } {#1} }
{#2} #3
}
\cs_new_eq:NN \@@_change_case_char_titleonly:nnN
@@ -556,19 +609,23 @@
% Unicode character, which is then used in a lookup. (As will become
% obvious below, there is no intention here of covering all of Unicode.)
% \begin{macrocode}
-\bool_lazy_or:nnTF
- { \sys_if_engine_luatex_p: }
- { \sys_if_engine_xetex_p: }
+\cs_new:Npn \@@_change_case_char:nnnN #1#2#3#4
{
- \cs_new:Npn \@@_change_case_char:nnnN #1#2#3#4
+ \token_if_active:NTF #4
+ { \@@_change_case_store:n {#4} }
{
\@@_change_case_store:e
{ \use:c { char_ #1 case :N } #4 }
- \use:c { @@_change_case_char_next_ #2 :nn } {#2} {#3}
}
+ \use:c { @@_change_case_char_next_ #2 :nn } {#2} {#3}
}
+\bool_lazy_or:nnF
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
{
- \cs_new:Npn \@@_change_case_char:nnnN #1#2#3#4
+ \cs_new_eq:NN \@@_change_case_char_aux:nnnN
+ \@@_change_case_char:nnnN
+ \cs_gset:Npn \@@_change_case_char:nnnN #1#2#3#4
{
\int_compare:nNnTF { `#4 } > { "80 }
{
@@ -581,10 +638,7 @@
}
{#1} {#2} {#3} #4
}
- {
- \@@_change_case_store:e{ \use:c { char_ #1 case :N } #4 }
- \use:c { @@_change_case_char_next_ #2 :nn } {#2} {#3}
- }
+ { \@@_change_case_char_aux:nnnN {#1} {#2} {#3} #4 }
}
\cs_new:Npn \@@_change_case_char_UTFviii:nnnNN #1#2#3#4#5
{ \@@_change_case_char_UTFviii:nnnn {#1} {#2} {#3} {#4#5} }
@@ -651,6 +705,9 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}[EXP]{\@@_change_case_upper_de-alt:nnnN}
% \begin{macro}[EXP]{\@@_change_case_upper_de-alt:nnnNN}
@@ -697,16 +754,28 @@
% \end{macro}
%
% \begin{macro}[EXP]{\@@_change_case_upper_el:nnnN}
-% \begin{macro}[EXP]{\@@_change_case_upper_el:nnnn}
-% \begin{macro}[EXP]{\@@_change_case_upper_el_aux:nnnN}
-% \begin{macro}[EXP]{\@@_change_case_upper_el_loop:nnw}
-% \begin{macro}[EXP]{\@@_change_case_upper_el:nnN}
-% \begin{macro}[EXP]{\@@_change_case_if_greek:nTF}
+% \begin{macro}[EXP]{\@@_change_case_upper_el:nnn}
+% \begin{macro}[EXP]{\@@_change_case_upper_el:nnNw}
+% \begin{macro}[EXP]{\@@_change_case_upper_el:NnnN}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_dialytika:nnN}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_dialytika:N}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_hiatus:nnNw}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_hiatus:nnN}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_gobble:nnw}
+% \begin{macro}[EXP]{\@@_change_case_upper_el_gobble:nnN}
+% \begin{macro}[EXP,TF]{\@@_change_case_if_greek:n}
+% \begin{macro}[EXP,pTF]{\@@_change_case_if_greek:n}
+% \begin{macro}[EXP,pTF]{\@@_change_case_if_greek_accent:n}
+% \begin{macro}[EXP,pTF]{\@@_change_case_if_greek_diacritic:n}
+% \begin{macro}[EXP,TF]{\@@_change_case_if_takes_dialytika:n}
% For Greek uppercasing, we need to know if characters \emph{in the Greek
% range} have accents. That means doing a \textsc{nfd} conversion first, then
% starting a search. As described by the Unicode \textsc{cldr}, Greek accents
% need to be found \emph{after} any U+0308 (diaeresis) and are done in two
-% groups to allow for the canonical ordering.
+% groups to allow for the canonical ordering. The implementation here follows
+% the data and examples from ICU
+% (\url{https://sites.google.com/site/icusite/design/case/greek-upper}),
+% although necessarily the implementation is somewhat different.
% \begin{macrocode}
\bool_lazy_or:nnT
{ \sys_if_engine_luatex_p: }
@@ -716,97 +785,233 @@
{
\@@_change_case_if_greek:nTF { `#4 }
{
- \exp_args:Ne \@@_change_case_upper_el:nnnn
- { \char_to_nfd:N #4 } {#1} {#2} {#3}
+ \exp_args:Ne \@@_change_case_upper_el:nnn
+ { \char_to_nfd:N #4 } {#2} {#3}
}
{ \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
}
- \cs_new:Npn \@@_change_case_upper_el:nnnn #1#2#3#4
- { \@@_change_case_upper_el_aux:nnnN {#2} {#3} {#4} #1 }
- \cs_new:Npn \@@_change_case_upper_el_aux:nnnN #1#2#3#4
- {
- \@@_change_case_store:e { \use:c { char_ #1 case:N } #4 }
- \@@_change_case_upper_el_loop:nnw {#2} {#3}
- }
- \cs_new:Npn \@@_change_case_upper_el_loop:nnw
- #1#2#3 \q_recursion_stop
+ \cs_new:Npn \@@_change_case_upper_el:nnn #1#2#3
+ { \@@_change_case_upper_el:nnNw {#2} {#3} #1 }
+% \end{macrocode}
+% At this stage we have the first NFD codepoint as |#3|. What we need to know
+% is whether after that we have another character token, either from the NFD or
+% directly in the input. If not, we store the changed character at this stage.
+% \begin{macrocode}
+ \cs_new:Npn \@@_change_case_upper_el:nnNw #1#2#3#4 \q_@@_recursion_stop
{
- \tl_if_head_is_N_type:nTF {#3}
- { \@@_change_case_upper_el:nnN }
- { \@@_change_case_loop:nnw }
- {#1} {#2} #3 \q_recursion_stop
+ \tl_if_head_is_N_type:nTF {#4}
+ { \@@_change_case_upper_el:NnnN #3 }
+ {
+ \@@_change_case_store:e { \char_uppercase:N #3 }
+ \@@_change_case_loop:nnw
+ }
+ {#1} {#2} #4 \q_@@_recursion_stop
}
% \end{macrocode}
-% In addition to the Greek accents, we list three cases here where an
-% accent outside the Greek range has a \text{nfd} that would make it
-% equivalent. That includes U+0344, which has to insert U+0308.
+% Now, we check the detail of the next codepoint: again we filter out the
+% not-a-char cases, before checking if it's an dialytika, accent or diacritic.
+% (The latter do not have the same hiatus behavior as accents.)
% \begin{macrocode}
- \cs_new:Npn \@@_change_case_upper_el:nnN #1#2#3
+ \cs_new:Npn \@@_change_case_upper_el:NnnN #1#2#3#4
{
- \token_if_cs:NTF #3
- { \@@_change_case_loop:nnw {#1} {#2} #3 }
+ \token_if_cs:NTF #4
{
- \int_compare:nNnTF { `#3 } = { "0308 }
- {
- \@@_change_case_store:n {#3}
- \@@_change_case_upper_el_loop:nnw {#1} {#2}
- }
+ \@@_change_case_store:e { \char_uppercase:N #1 }
+ \@@_change_case_loop:nnw {#2} {#3} #4
+ }
+ {
+ \int_compare:nNnTF { `#4 } = { "0308 }
+ { \@@_change_case_upper_el_dialytika:nnN {#2} {#3} #1 }
{
- \bool_lazy_any:nTF
+ \@@_change_case_if_greek_accent:nTF { `#4 }
+ { \@@_change_case_upper_el_hiatus:nnNw {#2} {#3} #1 }
{
- { \int_compare_p:nNn { `#3 } = { "0300 } }
- { \int_compare_p:nNn { `#3 } = { "0301 } }
- { \int_compare_p:nNn { `#3 } = { "0304 } }
- { \int_compare_p:nNn { `#3 } = { "0306 } }
- { \int_compare_p:nNn { `#3 } = { "0308 } }
- { \int_compare_p:nNn { `#3 } = { "0313 } }
- { \int_compare_p:nNn { `#3 } = { "0314 } }
- { \int_compare_p:nNn { `#3 } = { "0342 } }
- { \int_compare_p:nNn { `#3 } = { "0340 } }
- { \int_compare_p:nNn { `#3 } = { "0341 } }
- { \int_compare_p:nNn { `#3 } = { "0343 } }
- }
- { \@@_change_case_upper_el_loop:nnw {#1} {#2} }
- {
- \int_compare:nNnTF { `#3 } = { "0344 }
+ \@@_change_case_if_greek_diacritic:nTF { `#4 }
{
- \@@_change_case_store:e
- {
- \char_generate:nn { "0308 }
- { \@@_char_catcode:N #3 }
- }
- \@@_change_case_upper_el_loop:nnw {#1} {#2}
+ \@@_change_case_store:e { \char_uppercase:N #1 }
+ \@@_change_case_loop:nnw {#2} {#3}
}
{
- \int_compare:nNnTF { `#3 } = { "0345 }
- { \@@_change_case_loop:nnw {#1} {#2} }
- { \@@_change_case_loop:nnw {#1} {#2} #3 }
+ \@@_change_case_store:e { \char_uppercase:N #1 }
+ \@@_change_case_loop:nnw {#2} {#3} #4
}
}
}
}
}
- \prg_new_conditional:Npnn \@@_change_case_if_greek:n #1 { TF }
+% \end{macrocode}
+% We handle \emph{dialytika} in parts as it's also needed for the hiatus.
+% We know only two letters take it, so we can shortcut here on the second
+% part of the tests.
+% \begin{macrocode}
+ \cs_new:Npn \@@_change_case_upper_el_dialytika:nnN #1#2#3
+ {
+ \@@_change_case_if_takes_dialytika:nTF { `#3 }
+ { \@@_change_case_upper_el_dialytika:N #3 }
+ { \@@_change_case_store:e { \char_uppercase:N #3 } }
+ \@@_change_case_upper_el_gobble:nnw {#1} {#2}
+ }
+ \cs_new:Npn \@@_change_case_upper_el_dialytika:N #1
+ {
+ \@@_change_case_store:e
+ {
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn { `#1 } = { "0399 } }
+ { \int_compare_p:nNn { `#1 } = { "03B9 } }
+ { \char_generate:nn { "03AA } { \@@_char_catcode:N #1 } }
+ { \char_generate:nn { "03AB } { \@@_char_catcode:N #1 } }
+ }
+ }
+% \end{macrocode}
+% Adding a hiatus needs some of the same ideas, but if there is not one we
+% skip this code point, hence needing a separate function.
+% \begin{macrocode}
+ \cs_new:Npn \@@_change_case_upper_el_hiatus:nnNw
+ #1#2#3#4 \q_@@_recursion_stop
{
- \if_int_compare:w #1 < "0370 \exp_stop_f:
+ \@@_change_case_store:e { \char_uppercase:N #3 }
+ \tl_if_head_is_N_type:nTF {#4}
+ { \@@_change_case_upper_el_hiatus:nnN }
+ { \@@_change_case_loop:nnw }
+ {#1} {#2} #4 \q_@@_recursion_stop
+ }
+ \cs_new:Npn \@@_change_case_upper_el_hiatus:nnN #1#2#3
+ {
+ \token_if_cs:NTF #3
+ { \@@_change_case_loop:nnw {#1} {#2} #3 }
+ {
+ \@@_change_case_if_takes_dialytika:nTF { `#3 }
+ {
+ \@@_change_case_upper_el_dialytika:N #3
+ \@@_change_case_upper_el_gobble:nnw {#1} {#2}
+ }
+ { \@@_change_case_loop:nnw {#1} {#2} #3 }
+ }
+ }
+% \end{macrocode}
+% For clearing out trailing combining marks after we have dealt with
+% the first one.
+% \begin{macrocode}
+ \cs_new:Npn \@@_change_case_upper_el_gobble:nnw
+ #1#2#3 \q_@@_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#3}
+ { \@@_change_case_upper_el_gobble:nnN }
+ { \@@_change_case_loop:nnw }
+ {#1} {#2} #3 \q_@@_recursion_stop
+ }
+ \cs_new:Npn \@@_change_case_upper_el_gobble:nnN #1#2#3
+ {
+ \bool_lazy_or:nnTF
+ { \token_if_cs_p:N #3 }
+ {
+ ! \bool_lazy_or_p:nn
+ { \@@_change_case_if_greek_accent_p:n { `#3 } }
+ { \@@_change_case_if_greek_diacritic_p:n { `#3 } }
+ }
+ { \@@_change_case_loop:nnw {#1} {#2} #3 }
+ { \@@_change_case_upper_el_gobble:nnw {#1} {#2} }
+ }
+ }
+% \end{macrocode}
+% Luckily the Greek range is limited and clear.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_change_case_if_greek:n #1 { TF }
+ {
+ \if_int_compare:w #1 < "0370 \exp_stop_f:
+ \prg_return_false:
+ \else:
+ \if_int_compare:w #1 > "03FF \exp_stop_f:
+ \if_int_compare:w #1 < "1F00 \exp_stop_f:
\prg_return_false:
\else:
- \if_int_compare:w #1 > "03FF \exp_stop_f:
- \if_int_compare:w #1 < "1F00 \exp_stop_f:
- \prg_return_false:
+ \if_int_compare:w #1 > "1FFF \exp_stop_f:
+ \prg_return_false:
+ \else:
+ \prg_return_true:
+ \fi:
+ \fi:
+ \else:
+ \prg_return_true:
+ \fi:
+ \fi:
+ }
+% \end{macrocode}
+% We follow ICU in adding a few extras to the accent list here.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_change_case_if_greek_accent:n #1 { TF , p }
+ {
+ \if_int_compare:w #1 = "0300 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \if_int_compare:w #1 = "0301 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \if_int_compare:w #1 = "0342 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \if_int_compare:w #1 = "0302 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \if_int_compare:w #1 = "0303 \exp_stop_f:
+ \prg_return_true:
\else:
- \if_int_compare:w #1 > "1FFF \exp_stop_f:
- \prg_return_false:
- \else:
+ \if_int_compare:w #1 = "0311 \exp_stop_f:
\prg_return_true:
+ \else:
+ \prg_return_false:
\fi:
\fi:
- \else:
+ \fi:
+ \fi:
+ \fi:
+ \fi:
+ }
+\prg_new_conditional:Npnn \@@_change_case_if_greek_diacritic:n
+ #1 { TF , p }
+ {
+ \if_int_compare:w #1 = "0304 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \if_int_compare:w #1 = "0306 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \if_int_compare:w #1 = "0313 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \if_int_compare:w #1 = "0314 \exp_stop_f:
\prg_return_true:
+ \else:
+ \if_int_compare:w #1 = "0343 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
\fi:
\fi:
- }
+ \fi:
+ \fi:
}
+\prg_new_conditional:Npnn \@@_change_case_if_takes_dialytika:n #1 { TF }
+ {
+ \if_int_compare:w #1 = "0399 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \if_int_compare:w #1 = "03B9 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \if_int_compare:w #1 = "03A5 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \if_int_compare:w #1 = "03C5 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ \fi:
+ \fi:
+ \fi:
+ }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -814,6 +1019,76 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:Nnnw}
+% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnN}
+% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:nnNw}
+% \begin{macro}[EXP]{\@@_change_case_boundary_upper_el:NnnN}
+% There is one special case in Greek that needs to be picked up based on
+% being an isolated letter. We do that using a test similar to final sigma,
+% but it has to fire off from the space grabber.
+% \begin{macrocode}
+\bool_lazy_or:nnT
+ { \sys_if_engine_luatex_p: }
+ { \sys_if_engine_xetex_p: }
+ {
+ \cs_new:Npn \@@_change_case_boundary_upper_el:Nnnw
+ #1#2#3#4 \q_@@_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#4}
+ { \@@_change_case_boundary_upper_el:nnN }
+ { \@@_change_case_loop:nnw }
+ {#2} {#3} #4 \q_@@_recursion_stop
+ }
+ \cs_new:Npn \@@_change_case_boundary_upper_el:nnN #1#2#3
+ {
+ \bool_lazy_or:nnTF
+ { \token_if_cs_p:N #3 }
+ {
+ ! \bool_lazy_or_p:nn
+ { \int_compare_p:nNn { `#3 } = { "03AE } }
+ { \int_compare_p:nNn { `#3 } = { "1F22 } }
+ }
+ { \@@_change_case_loop:nnw }
+ { \@@_change_case_boundary_upper_el:nnNw }
+ {#1} {#2} #3
+ }
+ \cs_new:Npn \@@_change_case_boundary_upper_el:nnNw
+ #1#2#3#4 \q_@@_recursion_stop
+ {
+ \tl_if_head_is_N_type:nTF {#4}
+ { \@@_change_case_boundary_upper_el:NnnN #3 }
+ {
+ \@@_change_case_store:e
+ { \char_generate:nn { "0389 } { \@@_char_catcode:N #3 } }
+ \@@_change_case_loop:nnw
+ }
+ {#1} {#2} #4 \q_@@_recursion_stop
+ }
+ \cs_new:Npn \@@_change_case_boundary_upper_el:NnnN #1#2#3#4
+ {
+ \token_if_letter:NTF #4
+ { \@@_change_case_loop:nnw {#2} {#3} #1#4 }
+ {
+ \@@_change_case_store:e
+ { \char_generate:nn { "0389 } { \@@_char_catcode:N #1 } }
+ \@@_change_case_loop:nnw {#2} {#3} #4
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
% \begin{macro}[EXP]{\@@_change_case_title_el:nnnN}
% Titlecasing retains accents, but to prevent the uppercasing code
% from kicking in, there has to be an explicit function here.
@@ -903,12 +1178,12 @@
\@@_change_case_lower_lt:nnw {#2} {#3}
}
}
- \cs_new:Npn \@@_change_case_lower_lt:nnw #1#2#3 \q_recursion_stop
+ \cs_new:Npn \@@_change_case_lower_lt:nnw #1#2#3 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#3}
{ \@@_change_case_lower_lt:nnN }
{ \@@_change_case_loop:nnw }
- {#1} {#2} #3 \q_recursion_stop
+ {#1} {#2} #3 \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_lower_lt:nnN #1#2#3
{
@@ -970,12 +1245,12 @@
\@@_change_case_upper_lt:nnw {#2} {#3}
}
}
- \cs_new:Npn \@@_change_case_upper_lt:nnw #1#2#3 \q_recursion_stop
+ \cs_new:Npn \@@_change_case_upper_lt:nnw #1#2#3 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#3}
{ \@@_change_case_upper_lt:nnN }
{ \use:c { @@_change_case_char_next_ #1 :nn } }
- {#1} {#2} #3 \q_recursion_stop
+ {#1} {#2} #3 \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_upper_lt:nnN #1#2#3
{
@@ -1010,12 +1285,12 @@
}
{ \@@_change_case_char:nnnN {#1} {#2} {#3} #4 }
}
-\cs_new:Npn \@@_change_case_title_nl:nnw #1#2#3 \q_recursion_stop
+\cs_new:Npn \@@_change_case_title_nl:nnw #1#2#3 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#3}
{ \@@_change_case_title_nl:nnN }
{ \use:c { @@_change_case_char_next_ #1 :nn } }
- {#1} {#2} #3 \q_recursion_stop
+ {#1} {#2} #3 \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_title_nl:nnN #1#2#3
{
@@ -1071,7 +1346,7 @@
% combination is found both the dotless-I and the dot-above char have to
% be removed from the input.
% \begin{macrocode}
- \cs_new:Npn \@@_change_case_lower_tr:nnNw #1#2#3#4 \q_recursion_stop
+ \cs_new:Npn \@@_change_case_lower_tr:nnNw #1#2#3#4 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#4}
{ \@@_change_case_lower_tr:NnnN #3 }
@@ -1080,7 +1355,7 @@
{ \char_generate:nn { "0131 } { \@@_char_catcode:N #3 } }
\@@_change_case_loop:nnw
}
- {#1} {#2} #4 \q_recursion_stop
+ {#1} {#2} #4 \q_@@_recursion_stop
}
\cs_new:Npn \@@_change_case_lower_tr:NnnN #1#2#3#4
{
@@ -1185,14 +1460,17 @@
%
% \begin{variable}
% {
-% \c_@@_dotless_i_tl ,
-% \c_@@_dotted_I_tl ,
-% \c_@@_i_ogonek_tl ,
-% \c_@@_I_ogonek_tl ,
+% \c_@@_dotless_i_tl ,
+% \c_@@_dotted_I_tl ,
+% \c_@@_i_ogonek_tl ,
+% \c_@@_I_ogonek_tl ,
+% \c_@@_final_sigma_tl ,
+% \c_@@_sigma_tl ,
% \c_@@_grosses_Eszett_tl
% }
% For cases where there is an $8$-bit option in the |T1| font set up,
-% a variant is provided in both cases.
+% a variant is provided in both cases. There are also a few extras for
+% |LGR|.
% \begin{macrocode}
\group_begin:
\bool_lazy_or:nnF
@@ -1225,6 +1503,8 @@
\@@_tmp:w \c_@@_dotted_I_tl { 0130 }
\@@_tmp:w \c_@@_i_ogonek_tl { 012F }
\@@_tmp:w \c_@@_I_ogonek_tl { 012E }
+ \@@_tmp:w \c_@@_final_sigma_tl { 03C2 }
+ \@@_tmp:w \c_@@_sigma_tl { 03C3 }
\@@_tmp:w \c_@@_grosses_Eszett_tl { 1E9E }
}
\group_end:
@@ -1232,7 +1512,9 @@
% \end{variable}
%
% For $8$-bit engines we now need to define the case-change data for
-% the multi-octet mappings. These need a list of what code points are
+% the multi-octet mappings. This data is here not in the \pkg{char} module
+% as the multi-byte nature means they are never |N|-type.
+% These need a list of what code points are
% doable in |T1| so the list is hard coded (there's no saving in loading
% the mappings dynamically). All of the straight-forward ones have two
% octets, so that is taken as read.
@@ -1441,9 +1723,18 @@
{ 042E } { 044E }
{ 042F } { 044F }
% \end{macrocode}
-% Core Greek support: there may need to be a little more work here to
-% deal completely with accents.
+% Greek support: everything in the two-octet range.
% \begin{macrocode}
+ { 0370 } { 0371 }
+ { 0372 } { 0373 }
+ { 0376 } { 0377 }
+ { 03FD } { 037B }
+ { 03FE } { 037C }
+ { 03FF } { 037D }
+ { 0386 } { 03AC }
+ { 0388 } { 03AD }
+ { 0389 } { 03AE }
+ { 038A } { 03AF }
{ 0391 } { 03B1 }
{ 0392 } { 03B2 }
{ 0393 } { 03B3 }
@@ -1468,17 +1759,39 @@
{ 03A7 } { 03C7 }
{ 03A8 } { 03C8 }
{ 03A9 } { 03C9 }
+ { 03AA } { 03CA }
+ { 03AB } { 03CB }
+ { 038C } { 03CC }
+ { 038E } { 03CD }
+ { 038F } { 03CE }
+ { 03CF } { 03D7 }
{ 03D8 } { 03D9 }
{ 03DA } { 03DB }
{ 03DC } { 03DD }
{ 03DE } { 03DF }
{ 03E0 } { 03E1 }
+ { 03E2 } { 03E3 }
+ { 03E4 } { 03E5 }
+ { 03E6 } { 03E7 }
+ { 03E8 } { 03E9 }
+ { 03EA } { 03EB }
+ { 03EC } { 03ED }
+ { 03EE } { 03EF }
+ { 03F9 } { 03F2 }
+ { 037F } { 03F3 }
+ { 03F7 } { 03F8 }
+ { 03FA } { 03FB }
\q_recursion_tail ?
\q_recursion_stop
+% \end{macrocode}
+% Odds and ends for Greek; mainly symbols that are for compatibility,
+% but also things like the terminal sigma. Almost all are uppercase
+% mappings, but there is one that is not!
+% \begin{macrocode}
\cs_set_protected:Npn \@@_tmp:w #1#2#3
{
\group_begin:
- \cs_set_protected:Npn \@@_tmp:w ##1##2##3##4
+ \cs_set_protected:Npn \@@_tmp:w ##1##2##3##4##5##6##7##8
{
\tl_const:cx
{
@@ -1487,6 +1800,47 @@
\char_generate:nn {##2} { 12 }
_tl
}
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {##5} { 13 }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {##6} { 13 }
+ }
+ }
+ \use:x
+ {
+ \@@_tmp:w
+ \char_to_utfviii_bytes:n { "#1 }
+ \char_to_utfviii_bytes:n { "#2 }
+ }
+ \group_end:
+ }
+ \@@_tmp:w { 0345 } { 0399 } { upper }
+ \@@_tmp:w { 03C2 } { 03A3 } { upper }
+ \@@_tmp:w { 03D0 } { 0392 } { upper }
+ \@@_tmp:w { 03D1 } { 0398 } { upper }
+ \@@_tmp:w { 03D5 } { 03A6 } { upper }
+ \@@_tmp:w { 03D6 } { 03A0 } { upper }
+ \@@_tmp:w { 03F0 } { 039A } { upper }
+ \@@_tmp:w { 03F1 } { 03A1 } { upper }
+ \@@_tmp:w { 03F4 } { 03B8 } { lower }
+ \@@_tmp:w { 03F5 } { 0395 } { upper }
+% \end{macrocode}
+% Odds and ends that are not simple one-to-one mappings. These
+% are still two-octet code points.
+% \begin{macrocode}
+ \cs_set_protected:Npn \@@_tmp:w #1#2#3
+ {
+ \group_begin:
+ \cs_set_protected:Npn \@@_tmp:w ##1##2##3##4
+ {
+ \tl_const:cn
+ {
+ c_@@_ #3 case_
+ \char_generate:nn {##1} { 12 }
+ \char_generate:nn {##2} { 12 }
+ _tl
+ }
{#2}
}
\use:x
@@ -1496,8 +1850,182 @@
\@@_tmp:w { 00DF } { SS } { upper }
\@@_tmp:w { 00DF } { Ss } { title }
\@@_tmp:w { 0131 } { I } { upper }
- }
- \group_end:
+% \end{macrocode}
+% Greek support: the three-octet code points.
+% \begin{macrocode}
+ \cs_set_protected:Npn \@@_tmp:nnnnnn #1#2#3#4#5#6#7
+ {
+ \tl_const:cx
+ {
+ c_@@_ #1 case_
+ \char_generate:nn {#2} { 12 }
+ \char_generate:nn {#3} { 12 }
+ \char_generate:nn {#4} { 12 }
+ _tl
+ }
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#5} { 13 }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#6} { 13 }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#7} { 13 }
+ }
+ }
+ \cs_set_protected:Npn \@@_tmp:w #1#2#3#4#5#6#7#8
+ {
+ \tl_const:cx
+ {
+ c_@@_lowercase_
+ \char_generate:nn {#1} { 12 }
+ \char_generate:nn {#2} { 12 }
+ \char_generate:nn {#3} { 12 }
+ _tl
+ }
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#5} { 13 }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#6} { 13 }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {#7} { 13 }
+ }
+ \@@_tmp:nnnnnn { upper } {#5} {#6} {#7} {#1} {#2} {#3}
+ \@@_tmp:nnnnnn { title } {#5} {#6} {#7} {#1} {#2} {#3}
+ }
+ \@@_loop:nn
+ { 1F08 } { 1F00 }
+ { 1F09 } { 1F01 }
+ { 1F0A } { 1F02 }
+ { 1F0B } { 1F03 }
+ { 1F0C } { 1F04 }
+ { 1F0D } { 1F05 }
+ { 1F0E } { 1F06 }
+ { 1F0F } { 1F07 }
+ { 1F18 } { 1F10 }
+ { 1F19 } { 1F11 }
+ { 1F1A } { 1F12 }
+ { 1F1B } { 1F13 }
+ { 1F1C } { 1F14 }
+ { 1F1D } { 1F15 }
+ { 1F28 } { 1F20 }
+ { 1F29 } { 1F21 }
+ { 1F2A } { 1F22 }
+ { 1F2B } { 1F23 }
+ { 1F2C } { 1F24 }
+ { 1F2D } { 1F25 }
+ { 1F2E } { 1F26 }
+ { 1F2F } { 1F27 }
+ { 1F38 } { 1F30 }
+ { 1F39 } { 1F31 }
+ { 1F3A } { 1F32 }
+ { 1F3B } { 1F33 }
+ { 1F3C } { 1F34 }
+ { 1F3D } { 1F35 }
+ { 1F3E } { 1F36 }
+ { 1F3F } { 1F37 }
+ { 1F48 } { 1F40 }
+ { 1F49 } { 1F41 }
+ { 1F4A } { 1F42 }
+ { 1F4B } { 1F43 }
+ { 1F4C } { 1F44 }
+ { 1F4D } { 1F45 }
+ { 1F59 } { 1F51 }
+ { 1F5B } { 1F53 }
+ { 1F5D } { 1F55 }
+ { 1F5F } { 1F57 }
+ { 1F68 } { 1F60 }
+ { 1F69 } { 1F61 }
+ { 1F6A } { 1F62 }
+ { 1F6B } { 1F63 }
+ { 1F6C } { 1F64 }
+ { 1F6D } { 1F65 }
+ { 1F6E } { 1F66 }
+ { 1F6F } { 1F67 }
+ { 1FBA } { 1F70 }
+ { 1FBB } { 1F71 }
+ { 1FC8 } { 1F72 }
+ { 1FC9 } { 1F73 }
+ { 1FCA } { 1F74 }
+ { 1FCB } { 1F75 }
+ { 1FDA } { 1F76 }
+ { 1FDB } { 1F77 }
+ { 1FF8 } { 1F78 }
+ { 1FF9 } { 1F79 }
+ { 1FEA } { 1F7A }
+ { 1FEB } { 1F7B }
+ { 1FFA } { 1F7C }
+ { 1FFB } { 1F7D }
+ { 1F88 } { 1F80 }
+ { 1F89 } { 1F81 }
+ { 1F8A } { 1F82 }
+ { 1F8B } { 1F83 }
+ { 1F8C } { 1F84 }
+ { 1F8D } { 1F85 }
+ { 1F8E } { 1F86 }
+ { 1F8F } { 1F87 }
+ { 1F98 } { 1F90 }
+ { 1F99 } { 1F91 }
+ { 1F9A } { 1F92 }
+ { 1F9B } { 1F93 }
+ { 1F9C } { 1F94 }
+ { 1F9D } { 1F95 }
+ { 1F9E } { 1F96 }
+ { 1F9F } { 1F97 }
+ { 1FA8 } { 1FA0 }
+ { 1FA9 } { 1FA1 }
+ { 1FAA } { 1FA2 }
+ { 1FAB } { 1FA3 }
+ { 1FAC } { 1FA4 }
+ { 1FAD } { 1FA5 }
+ { 1FAE } { 1FA6 }
+ { 1FAF } { 1FA7 }
+ { 1FB8 } { 1FB0 }
+ { 1FB9 } { 1FB1 }
+ { 1FBC } { 1FB3 }
+ { 1FCC } { 1FC3 }
+ { 1FD8 } { 1FD0 }
+ { 1FD9 } { 1FD1 }
+ { 1FE8 } { 1FE0 }
+ { 1FE9 } { 1FE1 }
+ { 1FEC } { 1FE5 }
+ { 1FFC } { 1FF3 }
+ \q_recursion_tail ?
+ \q_recursion_stop
+% \end{macrocode}
+% One three-octet special case for Greek: it also moves to two-octets!
+% \begin{macrocode}
+ \cs_set_protected:Npn \@@_tmp:w #1#2#3
+ {
+ \group_begin:
+ \cs_set_protected:Npn \@@_tmp:w ##1##2##3##4##5##6##7##8
+ {
+ \tl_const:cx
+ {
+ c_@@_ #3 case_
+ \char_generate:nn {##1} { 12 }
+ \char_generate:nn {##2} { 12 }
+ \char_generate:nn {##3} { 12 }
+ _tl
+ }
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {##5} { 13 }
+ \exp_after:wN \exp_after:wN \exp_after:wN
+ \exp_not:N \char_generate:nn {##6} { 13 }
+ }
+ }
+ \use:x
+ {
+ \@@_tmp:w
+ \char_to_utfviii_bytes:n { "#1 }
+ \char_to_utfviii_bytes:n { "#2 }
+ }
+ \group_end:
+ }
+ \@@_tmp:w { 1FBE } { 0399 } { upper }
+ }
+\group_end:
% \end{macrocode}
%
% The (fixed) look-up mappings for letter-like control sequences.
@@ -1571,7 +2099,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
index fdddb254149..f939085021c 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
@@ -2,7 +2,7 @@
%
%% File: l3text-purify.dtx
%
-% Copyright (C) 2020 The LaTeX3 Project
+% Copyright (C) 2020,2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -53,10 +53,10 @@
%
% \begin{implementation}
%
-% \section{\pkg{l3text} implementation}
+% \section{\pkg{l3text-purify} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -65,46 +65,75 @@
%
% \subsection{Purifying text}
%
-% \begin{macro}[rEXP]{\text_purify:n, \@@_purify:n}
-% \begin{macro}[rEXP]{\@@_purify_loop:w}
-% \begin{macro}[rEXP]{\@@_purify_group:n}
-% \begin{macro}[rEXP]{\@@_purify_space:w}
-% \begin{macro}[rEXP]{\@@_purify_N_type:N, \@@_purify_N_type_aux:N}
-% \begin{macro}[rEXP]{\@@_purify_math_search:NNN}
-% \begin{macro}[rEXP]{\@@_purify_math_start:NNw}
-% \begin{macro}[rEXP]{\@@_purify_math_store:n}
-% \begin{macro}[rEXP]{\@@_purify_math_store:nw}
-% \begin{macro}[rEXP]{\@@_purify_math_end:w}
-% \begin{macro}[rEXP]{\@@_purify_math_loop:NNw}
-% \begin{macro}[rEXP]{\@@_purify_math_N_type:NNN}
-% \begin{macro}[rEXP]{\@@_purify_math_group:NNn}
-% \begin{macro}[rEXP]{\@@_purify_math_space:NNw}
-% \begin{macro}[rEXP]{\@@_purify_math_cmd:N}
-% \begin{macro}[rEXP]{\@@_purify_math_cmd:NN}
-% \begin{macro}[rEXP]{\@@_purify_math_cmd:Nn}
-% \begin{macro}[rEXP]{\@@_purify_replace:N}
-% \begin{macro}[rEXP]{\@@_purify_replace:n}
-% \begin{macro}[rEXP]{\@@_purify_expand:N, \@@_purify_protect:N}
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop:N}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop:N
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\text_purify:n, \@@_purify:n}
+% \begin{macro}[EXP]{\@@_purify_store:n}
+% \begin{macro}[EXP]{\@@_purify_store:nw}
+% \begin{macro}[EXP]{\@@_purify_end:w}
+% \begin{macro}[EXP]{\@@_purify_loop:w}
+% \begin{macro}[EXP]{\@@_purify_group:n}
+% \begin{macro}[EXP]{\@@_purify_space:w}
+% \begin{macro}[EXP]{\@@_purify_N_type:N, \@@_purify_N_type_aux:N}
+% \begin{macro}[EXP]{\@@_purify_math_search:NNN}
+% \begin{macro}[EXP]{\@@_purify_math_start:NNw}
+% \begin{macro}[EXP]{\@@_purify_math_store:n}
+% \begin{macro}[EXP]{\@@_purify_math_store:nw}
+% \begin{macro}[EXP]{\@@_purify_math_end:w}
+% \begin{macro}[EXP]{\@@_purify_math_loop:NNw}
+% \begin{macro}[EXP]{\@@_purify_math_N_type:NNN}
+% \begin{macro}[EXP]{\@@_purify_math_group:NNn}
+% \begin{macro}[EXP]{\@@_purify_math_space:NNw}
+% \begin{macro}[EXP]{\@@_purify_math_cmd:N}
+% \begin{macro}[EXP]{\@@_purify_math_cmd:NN}
+% \begin{macro}[EXP]{\@@_purify_math_cmd:Nn}
+% \begin{macro}[EXP]{\@@_purify_replace:N}
+% \begin{macro}[EXP]{\@@_purify_replace:n}
+% \begin{macro}[EXP]{\@@_purify_expand:N, \@@_purify_protect:N, \@@_purify_encoding:N}
+% \begin{macro}[EXP]{\@@_purify_encoding_escape:NN}
% As in the other parts of the module, we start off with a standard
-% \enquote{action} loop, with expansion applied up-front. Here, as there
-% will be no text commands left in the output, there is no concern about
-% using \cs{exp_not:n} and \texttt{e}-type expansion.
+% \enquote{action} loop, with expansion applied up-front.
% \begin{macrocode}
\cs_new:Npn \text_purify:n #1
{
+ \__kernel_exp_not:w \exp_after:wN
+ {
+ \exp:w
+ \exp_args:Ne \@@_purify:n
+ { \text_expand:n {#1} }
+ }
+ }
+\cs_new:Npn \@@_purify:n #1
+ {
\group_align_safe_begin:
- \exp_args:Ne \@@_purify:n
- { \text_expand:n {#1} }
+ \@@_purify_loop:w #1
+ \q_@@_recursion_tail \q_@@_recursion_stop
+ \@@_purify_result:n { }
+ }
+% \end{macrocode}
+% As for expansion, collect up the tokens for future use.
+% \begin{macrocode}
+\cs_new:Npn \@@_purify_store:n #1
+ { \@@_purify_store:nw {#1} }
+\cs_new:Npn \@@_purify_store:nw #1#2 \@@_purify_result:n #3
+ { #2 \@@_purify_result:n { #3 #1 } }
+\cs_new:Npn \@@_purify_end:w #1 \@@_purify_result:n #2
+ {
\group_align_safe_end:
+ \exp_end:
+ #2
}
-\cs_new:Npn \@@_purify:n #1
- { \@@_purify_loop:w #1 \q_recursion_tail \q_recursion_stop }
% \end{macrocode}
% The main loop is a standard \enquote{tl action}. Unlike the expansion
% or case changing, here any groups have to be run inline. Most of the
% business end is as before in the \texttt{N}-type token processing.
% \begin{macrocode}
-\cs_new:Npn \@@_purify_loop:w #1 \q_recursion_stop
+\cs_new:Npn \@@_purify_loop:w #1 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#1}
{ \@@_purify_N_type:N }
@@ -113,12 +142,12 @@
{ \@@_purify_group:n }
{ \@@_purify_space:w }
}
- #1 \q_recursion_stop
+ #1 \q_@@_recursion_stop
}
\cs_new:Npn \@@_purify_group:n #1 { \@@_purify_loop:w #1 }
\exp_last_unbraced:NNo \cs_new:Npn \@@_purify_space:w \c_space_tl
{
- \c_space_tl
+ \@@_purify_store:n { ~ }
\@@_purify_loop:w
}
% \end{macrocode}
@@ -128,30 +157,30 @@
% \begin{macrocode}
\cs_new:Npn \@@_purify_N_type:N #1
{
- \quark_if_recursion_tail_stop:N #1
+ \@@_if_recursion_tail_stop_do:Nn #1 { \@@_purify_end:w }
\@@_purify_N_type_aux:N #1
}
\cs_new:Npn \@@_purify_N_type_aux:N #1
{
\exp_after:wN \@@_purify_math_search:NNN
\exp_after:wN #1 \l_text_math_delims_tl
- \q_recursion_tail ?
- \q_recursion_stop
+ \q_@@_recursion_tail ?
+ \q_@@_recursion_stop
}
\cs_new:Npn \@@_purify_math_search:NNN #1#2#3
{
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ \@@_purify_math_cmd:N #1 }
\token_if_eq_meaning:NNTF #1 #2
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{ \@@_purify_math_start:NNw #2 #3 }
}
{ \@@_purify_math_search:NNN #1 }
}
-\cs_new:Npn \@@_purify_math_start:NNw #1#2#3 \q_recursion_stop
+\cs_new:Npn \@@_purify_math_start:NNw #1#2#3 \q_@@_recursion_stop
{
- \@@_purify_math_loop:NNw #1#2#3 \q_recursion_stop
+ \@@_purify_math_loop:NNw #1#2#3 \q_@@_recursion_stop
\@@_purify_math_result:n { }
}
\cs_new:Npn \@@_purify_math_store:n #1
@@ -160,12 +189,15 @@
{ #2 \@@_purify_math_result:n { #3 #1 } }
\cs_new:Npn \@@_purify_math_end:w #1 \@@_purify_math_result:n #2
{
- \exp_not:n { $ #2 $ }
+ \@@_purify_store:n { $ #2 $ }
\@@_purify_loop:w #1
}
\cs_new:Npn \@@_purify_math_stop:Nw #1 \@@_purify_math_result:n #2
- { \exp_not:n {#1#2} }
-\cs_new:Npn \@@_purify_math_loop:NNw #1#2#3 \q_recursion_stop
+ {
+ \@@_purify_store:n {#1#2}
+ \@@_purify_end:w
+ }
+\cs_new:Npn \@@_purify_math_loop:NNw #1#2#3 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#3}
{ \@@_purify_math_N_type:NNN }
@@ -174,11 +206,11 @@
{ \@@_purify_math_group:NNn }
{ \@@_purify_math_space:NNw }
}
- #1#2#3 \q_recursion_stop
+ #1#2#3 \q_@@_recursion_stop
}
\cs_new:Npn \@@_purify_math_N_type:NNN #1#2#3
{
- \quark_if_recursion_tail_stop_do:Nn #3
+ \@@_if_recursion_tail_stop_do:Nn #3
{ \@@_purify_math_stop:Nw #1 }
\token_if_eq_meaning:NNTF #3 #2
{ \@@_purify_math_end:w }
@@ -206,15 +238,15 @@
\cs_new:Npn \@@_purify_math_cmd:N #1
{
\exp_after:wN \@@_purify_math_cmd:NN \exp_after:wN #1
- \l_text_math_arg_tl \q_recursion_tail \q_recursion_stop
+ \l_text_math_arg_tl \q_@@_recursion_tail \q_@@_recursion_stop
}
\cs_new:Npn \@@_purify_math_cmd:NN #1#2
{
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ \@@_purify_replace:N #1 }
\cs_if_eq:NNTF #2 #1
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{ \@@_purify_math_cmd:n }
}
{ \@@_purify_math_cmd:NN #1 }
@@ -246,7 +278,8 @@
\token_if_cs:NTF #1
{ \@@_purify_expand:N #1 }
{
- \@@_token_to_explicit:N #1
+ \exp_args:Ne \@@_purify_store:n
+ { \@@_token_to_explicit:N #1 }
\@@_purify_loop:w
}
}
@@ -256,15 +289,31 @@
{
\str_if_eq:nnTF {#1} { \protect }
{ \@@_purify_protect:N }
+ { \@@_purify_encoding:N #1 }
+ }
+\cs_new:Npn \@@_purify_protect:N #1
+ {
+ \@@_if_recursion_tail_stop_do:Nn #1 { \@@_purify_end:w }
+ \@@_purify_loop:w
+ }
+% \end{macrocode}
+% Handle encoding commands, as detailed for expansion.
+% \begin{macrocode}
+\cs_new:Npn \@@_purify_encoding:N #1
+ {
+ \bool_lazy_or:nnTF
+ { \cs_if_eq_p:NN #1 \@current@cmd }
+ { \cs_if_eq_p:NN #1 \@changed@cmd }
+ { \@@_purify_encoding_escape:NN }
{
\@@_if_expandable:NTF #1
{ \exp_after:wN \@@_purify_loop:w #1 }
{ \@@_purify_loop:w }
}
}
-\cs_new:Npn \@@_purify_protect:N #1
+\cs_new:Npn \@@_purify_encoding_escape:NN #1#2
{
- \quark_if_recursion_tail_stop:N #1
+ \@@_purify_store:n {#1}
\@@_purify_loop:w
}
% \end{macrocode}
@@ -288,6 +337,10 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}
% {
@@ -361,12 +414,19 @@
\tiny
}
{ \text_declare_purify_equivalent:Nn #1 { } }
+\exp_args:Nc \text_declare_purify_equivalent:Nn
+ { @protected@testopt } { \use_none:nnn }
% \end{macrocode}
% Environments have to be handled by pure expansion.
+%
+% \begin{macro}{\@@_end_env:n}
% \begin{macrocode}
\text_declare_purify_equivalent:Nn \begin { \use:c }
-\text_declare_purify_equivalent:Nn \end { \use:c }
+\text_declare_purify_equivalent:Nn \end { \@@_end_env:n }
+\cs_new:Npn \@@_end_env:n #1 { \cs:w end #1 \cs_end: }
% \end{macrocode}
+% \end{macro}
+%
% Some common symbols and similar ideas.
% \begin{macrocode}
\text_declare_purify_equivalent:Nn \\ { }
@@ -775,7 +835,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
index 8d06641d956..046bf686772 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
@@ -2,7 +2,7 @@
%
%% File: l3text.dtx
%
-% Copyright (C) 2020 The LaTeX3 Project
+% Copyright (C) 2020,2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -107,6 +107,7 @@
% function name. The category code of letters are not changed by this
% process (at least where they can be represented by the engine as a single
% token: $8$-bit engines may require active characters).
+% \end{function}
%
% Upper- and lowercase have the obvious meanings. Titlecasing may be regarded
% informally as converting the first character of the \meta{tokens} to
@@ -163,7 +164,8 @@
% Unicode \TeX{} engines.
% \item Greek (\texttt{el}).
% Removes accents from Greek letters when uppercasing; titlecasing
-% leaves accents in place.
+% leaves accents in place. (At present this is implemented only
+% for Unicode engines.)
% \item Lithuanian (\texttt{lt}).
% The lowercase letters i and j should retain a dot above when the
% accents grave, acute or tilde are present. This is implemented for
@@ -178,11 +180,25 @@
% retains two separate letters, thus this transformation \emph{is}
% available using \pdfTeX{}.
% \end{itemize}
-% \end{function}
+%
+% For titlecasing, note that there are two functions available. The
+% function \cs{text_titlecase:n} applies (broadly) uppercasing to the first
+% letter of the input, then lowercasing to the remainder. In contrast,
+% \cs{text_titlecase_first:n} \emph{only} carries out the uppercasing operation,
+% and leaves the balance of the input unchanged. Determining whether
+% non-letter characters at the start of text should switch from upper- to
+% lowercasing is controllable. When \cs{l_text_titlecase_check_letter_bool} is
+% \texttt{true}, characters which are not letters (category code~$11$) are
+% left unchanged and \enquote{skipped}: the first \emph{letter} is uppercased.
+% (With $8$-bit engines, this is extended to active characters which form
+% part of a multi-byte letter codepoint.) When
+% \cs{l_text_titlecase_check_letter_bool} is \texttt{false}, the first
+% character is uppercased, and the rest lowercased, irrespective of the nature
+% of the character.
%
% \subsection{Removing formatting from text}
%
-% \begin{function}[rEXP, added = 2020-03-05]{\text_purify:n}
+% \begin{function}[EXP, added = 2020-03-05, updated = 2020-05-14]{\text_purify:n}
% \begin{syntax}
% \cs{text_purify:n} \Arg{text}
% \end{syntax}
@@ -234,10 +250,20 @@
% content \emph{may} be excluded from processing.
% \end{variable}
%
+% \begin{variable}{\l_text_case_exclude_arg_tl}
+% Lists commands which are excluded from case changing.
+% \end{variable}
+%
% \begin{variable}{\l_text_expand_exclude_tl}
% Lists commands which are excluded from expansion.
% \end{variable}
%
+% \begin{variable}{\l_text_titlecase_check_letter_bool}
+% Controls how the start of titlecasing is handled: when \texttt{true}, the
+% first \emph{letter} in text is considered. The standard setting is
+% \texttt{true}.
+% \end{variable}
+%
% \end{documentation}
%
% \begin{implementation}
@@ -245,13 +271,59 @@
% \section{\pkg{l3text} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
%<@@=text>
% \end{macrocode}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_nil}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_nil:n}
+% Branching quark conditional.
+% \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:n { TF }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_i_delimit_by_q_recursion_stop:nw}
+% Functions to gobble up to a quark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_i_delimit_by_q_recursion_stop:nw
+ #1 #2 \q_@@_recursion_stop {#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_stop_do:Nn}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_stop_do:Nn
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Utilities}
%
% \begin{macro}[EXP]
@@ -354,9 +426,9 @@
\if_catcode:w + #1 12 \else:
4 \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi:
\exp_after:wN ;
- \token_to_meaning:N #1 \q_stop
+ \token_to_meaning:N #1 \s_@@_stop
}
-\cs_new:Npn \@@_token_to_explicit_auxi:w #1 ; #2 \q_stop
+\cs_new:Npn \@@_token_to_explicit_auxi:w #1 ; #2 \s_@@_stop
{
\char_generate:nn
{
@@ -428,7 +500,7 @@
{
{ \token_if_protected_macro_p:N #1 }
{ \token_if_protected_long_macro_p:N #1 }
- { \token_if_eq_meaning_p:NN \q_recursion_tail #1 }
+ { \token_if_eq_meaning_p:NN \q_@@_recursion_tail #1 }
}
{ \prg_return_false: }
{ \prg_return_true: }
@@ -444,7 +516,6 @@
% Special cases for accents and letter-like symbols, which in some cases will
% need to be converted further.
% \begin{macrocode}
-%<*package>
\tl_new:N \l_text_accents_tl
\tl_set:Nn \l_text_accents_tl
{ \` \' \^ \~ \= \u \. \" \r \H \v \d \c \k \b \t }
@@ -463,7 +534,6 @@
\SS \ss
\TH \th
}
-%</package>
% \end{macrocode}
% \end{variable}
%
@@ -495,10 +565,8 @@
% Commands which need not to expand.
% \begin{macrocode}
\tl_new:N \l_text_expand_exclude_tl
-%<*package>
\tl_set:Nn \l_text_expand_exclude_tl
{ \begin \cite \end \label \ref }
-%</package>
% \end{macrocode}
% \end{variable}
%
@@ -566,6 +634,8 @@
% \begin{macro}[EXP]{\@@_expand_protect:N}
% \begin{macro}[EXP]{\@@_expand_protect:nN}
% \begin{macro}[EXP]{\@@_expand_protect:Nw}
+% \begin{macro}[EXP]{\@@_expand_testopt:N}
+% \begin{macro}[EXP]{\@@_expand_testopt:NNn}
% \begin{macro}[EXP]{\@@_expand_replace:N}
% \begin{macro}[EXP]{\@@_expand_replace:n}
% \begin{macro}[EXP]{\@@_expand_cs_expand:N}
@@ -590,7 +660,7 @@
{
\group_align_safe_begin:
\@@_expand_loop:w #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
\@@_expand_result:n { }
}
% \end{macrocode}
@@ -613,7 +683,7 @@
% recursively, while spaces are just passed through. Thus all of the
% action is in handling \texttt{N}-type tokens.
% \begin{macrocode}
-\cs_new:Npn \@@_expand_loop:w #1 \q_recursion_stop
+\cs_new:Npn \@@_expand_loop:w #1 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#1}
{ \@@_expand_N_type:N }
@@ -622,7 +692,7 @@
{ \@@_expand_group:n }
{ \@@_expand_space:w }
}
- #1 \q_recursion_stop
+ #1 \q_@@_recursion_stop
}
\cs_new:Npn \@@_expand_group:n #1
{
@@ -650,7 +720,7 @@
% \begin{macrocode}
\cs_new:Npx \@@_expand_N_type:N #1
{
- \exp_not:N \quark_if_recursion_tail_stop_do:Nn #1
+ \exp_not:N \@@_if_recursion_tail_stop_do:Nn #1
{ \exp_not:N \@@_expand_end:w }
\exp_not:N \bool_lazy_any:nTF
{
@@ -724,16 +794,16 @@
{
\exp_after:wN \@@_expand_math_search:NNN
\exp_after:wN #1 \l_text_math_delims_tl
- \q_recursion_tail \q_recursion_tail
- \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_tail
+ \q_@@_recursion_stop
}
\cs_new:Npn \@@_expand_math_search:NNN #1#2#3
{
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ \@@_expand_explicit:N #1 }
\token_if_eq_meaning:NNTF #1 #2
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{
\@@_expand_store:n {#1}
\@@_expand_math_loop:Nw #3
@@ -741,7 +811,7 @@
}
{ \@@_expand_math_search:NNN #1 }
}
-\cs_new:Npn \@@_expand_math_loop:Nw #1#2 \q_recursion_stop
+\cs_new:Npn \@@_expand_math_loop:Nw #1#2 \q_@@_recursion_stop
{
\tl_if_head_is_N_type:nTF {#2}
{ \@@_expand_math_N_type:NN }
@@ -750,11 +820,11 @@
{ \@@_expand_math_group:Nn }
{ \@@_expand_math_space:Nw }
}
- #1#2 \q_recursion_stop
+ #1#2 \q_@@_recursion_stop
}
\cs_new:Npn \@@_expand_math_N_type:NN #1#2
{
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ \@@_expand_end:w }
\@@_expand_store:n {#2}
\token_if_eq_meaning:NNTF #2 #1
@@ -785,19 +855,13 @@
\@@_expand_loop:w
}
}
+% \end{macrocode}
% Next we exclude math commands: this is mainly as there \emph{might} be an
% \cs{ensuremath}. We also handle accents, which are basically the same issue
% but are kept separate for semantic reasons.
% \begin{macrocode}
\cs_new:Npn \@@_expand_exclude:N #1
{
-%<*initex>
- \exp_after:wN \@@_expand_exclude:NN
- \l_text_math_arg_tl
- #1
- \q_recursion_tail \q_recursion_stop
-%</initex>
-%<*package>
\exp_args:Ne \@@_expand_exclude:nN
{
\exp_not:V \l_text_math_arg_tl
@@ -805,27 +869,19 @@
\exp_not:V \l_text_expand_exclude_tl
}
#1
-%</package>
}
-%<*package>
\cs_new:Npn \@@_expand_exclude:nN #1#2
{
\@@_expand_exclude:NN #2 #1
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
-%</package>
\cs_new:Npn \@@_expand_exclude:NN #1#2
{
- \quark_if_recursion_tail_stop_do:Nn #2
-%<*initex>
- { \@@_expand_cs:N #1 }
-%</initex>
-%<*package>
+ \@@_if_recursion_tail_stop_do:Nn #2
{ \@@_expand_letterlike:N #1 }
-%</package>
- \cs_if_eq:NNTF #2 #1
+ \str_if_eq:nnTF {#1} {#2}
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{ \@@_expand_exclude:Nn #1 }
}
{ \@@_expand_exclude:NN #1 }
@@ -839,20 +895,19 @@
% Another list of exceptions: these ones take no arguments so are
% easier to handle.
% \begin{macrocode}
-%<*package>
\cs_new:Npn \@@_expand_letterlike:N #1
{
\exp_after:wN \@@_expand_letterlike:NN \exp_after:wN
#1 \l_text_letterlike_tl
- \q_recursion_tail \q_recursion_stop
+ \q_@@_recursion_tail \q_@@_recursion_stop
}
\cs_new:Npn \@@_expand_letterlike:NN #1#2
{
- \quark_if_recursion_tail_stop_do:Nn #2
+ \@@_if_recursion_tail_stop_do:Nn #2
{ \@@_expand_cs:N #1 }
\cs_if_eq:NNTF #2 #1
{
- \use_i_delimit_by_q_recursion_stop:nw
+ \@@_use_i_delimit_by_q_recursion_stop:nw
{
\@@_expand_store:n {#1}
\@@_expand_loop:w
@@ -860,20 +915,22 @@
}
{ \@@_expand_letterlike:NN #1 }
}
-%</package>
% \end{macrocode}
% \LaTeXe{}'s \cs{protect} makes life interesting. Where possible, we
% simply remove it and replace with the \enquote{parent} command; of course,
% the \cs{protect} might be explicit, in which case we need to leave it alone
-% if it's required.
+% if it's required. There is also the case of a straight \tn{@protected@testopt}
+% to cover.
% \begin{macrocode}
\cs_new:Npx \@@_expand_cs:N #1
{
\exp_not:N \str_if_eq:nnTF {#1} { \exp_not:N \protect }
{ \exp_not:N \@@_expand_protect:N }
{
- \cs_if_exist:cTF { @current@cmd }
- { \exp_not:N \@@_expand_encoding:N #1 }
+ \bool_lazy_and:nnTF
+ { \cs_if_exist_p:N \fmtname }
+ { \str_if_eq_p:Vn \fmtname { LaTeX2e } }
+ { \exp_not:N \@@_expand_testopt:N #1 }
{ \exp_not:N \@@_expand_replace:N #1 }
}
}
@@ -883,10 +940,10 @@
{ \cs_to_str:N #1 } #1
}
\cs_new:Npn \@@_expand_protect:nN #1#2
- { \@@_expand_protect:Nw #2 #1 \q_nil #1 ~ \q_nil \q_nil \q_stop }
-\cs_new:Npn \@@_expand_protect:Nw #1 #2 ~ \q_nil #3 \q_nil #4 \q_stop
+ { \@@_expand_protect:Nw #2 #1 \q_@@_nil #1 ~ \q_@@_nil \q_@@_nil \s_@@_stop }
+\cs_new:Npn \@@_expand_protect:Nw #1 #2 ~ \q_@@_nil #3 \q_@@_nil #4 \s_@@_stop
{
- \quark_if_nil:nTF {#4}
+ \@@_quark_if_nil:nTF {#4}
{
\cs_if_exist:cTF {#2}
{ \exp_args:Ne \@@_expand_store:n { \exp_not:c {#2} } }
@@ -895,21 +952,27 @@
{ \@@_expand_store:n { \protect #1 } }
\@@_expand_loop:w
}
+\cs_new:Npn \@@_expand_testopt:N #1
+ {
+ \str_if_eq:nnTF {#1} { \@protected@testopt }
+ { \@@_expand_testopt:NNn }
+ { \@@_expand_encoding:N #1 }
+ }
+\cs_new:Npn \@@_expand_testopt:NNn #1#2#3
+ {
+ \@@_expand_store:n {#1}
+ \@@_expand_loop:w
+ }
% \end{macrocode}
% Deal with encoding-specific commands
% \begin{macrocode}
\cs_new:Npn \@@_expand_encoding:N #1
{
- \cs_if_eq:NNTF #1 \@current@cmd
+ \bool_lazy_or:nnTF
+ { \cs_if_eq_p:NN #1 \@current@cmd }
+ { \cs_if_eq_p:NN #1 \@changed@cmd }
{ \exp_after:wN \@@_expand_loop:w \@@_expand_encoding_escape:NN }
- {
- \cs_if_eq:NNTF #1 \@changed@cmd
- {
- \exp_after:wN \@@_expand_loop:w
- \@@_expand_encoding_escape:NN
- }
- { \@@_expand_replace:N #1 }
- }
+ { \@@_expand_replace:N #1 }
}
\cs_new:Npn \@@_expand_encoding_escape:NN #1#2 { \exp_not:n {#1} }
% \end{macrocode}
@@ -987,6 +1050,8 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}
% {
@@ -1005,7 +1070,7 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
index bdfc80f714c..51ad05c9952 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
@@ -2,7 +2,7 @@
%
%% File: l3tl-analysis.dtx
%
-% Copyright (C) 2011-2020 The LaTeX3 Project
+% Copyright (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -36,7 +36,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -52,10 +52,30 @@
%
% \section{\pkg{l3tl-analysis} documentation}
%
-% This module mostly provides internal functions for use in the
-% \pkg{l3regex} module. However, it provides as a side-effect a user
-% debugging function, very similar to the \cs{ShowTokens} macro from the
-% \pkg{ted} package.
+% This module provides functions that are particularly useful in the
+% \pkg{l3regex} module for mapping through a token list one \meta{token}
+% at a time (including begin-group/end-group tokens). For
+% \cs{tl_analysis_map_inline:Nn} or \cs{tl_analysis_map_inline:nn}, the
+% token list is given as an argument; the analogous function
+% \cs{peek_analysis_map_inline:n} documented in \pkg{l3token} finds
+% tokens in the input stream instead. In both cases the user provides
+% \meta{inline code} that receives three arguments for each
+% \meta{token}:
+% \begin{itemize}
+% \item \meta{tokens}, which both \texttt{o}-expand and
+% \texttt{x}-expand to the \meta{token}. The detailed form of
+% \meta{tokens} may change in later releases.
+% \item \meta{char code}, a decimal representation of the character
+% code of the \meta{token}, $-1$ if it is a control sequence.
+% \item \meta{catcode}, a capital hexadecimal digit which denotes the
+% category code of the \meta{token} (0:~control sequence,
+% 1:~begin-group, 2:~end-group, 3:~math shift, 4:~alignment tab,
+% 6:~parameter, 7:~superscript, 8:~subscript, A:~space, B:~letter,
+% C:~other, D:~active). This can be converted to an integer by
+% writing |"|\meta{catcode}.
+% \end{itemize}
+% In addition, there is a debugging function \cs{tl_analysis_show:n},
+% very similar to the \cs{ShowTokens} macro from the \pkg{ted} package.
%
% \begin{function}[added = 2018-04-09]{\tl_analysis_show:N, \tl_analysis_show:n}
% \begin{syntax}
@@ -74,23 +94,9 @@
% \end{syntax}
% Applies the \meta{inline function} to each individual \meta{token}
% in the \meta{token list}. The \meta{inline function} receives three
-% arguments:
-% \begin{itemize}
-% \item \meta{tokens}, which both \texttt{o}-expand and
-% \texttt{x}-expand to the \meta{token}. The detailed form of
-% \meta{token} may change in later releases.
-% \item \meta{char code}, a decimal representation of the character
-% code of the token, $-1$ if it is a control sequence (with
-% \meta{catcode} $0$).
-% \item \meta{catcode}, a capital hexadecimal digit which denotes
-% the category code of the \meta{token} (0: control sequence, 1:
-% begin-group, 2: end-group, 3: math shift, 4: alignment tab, 6:
-% parameter, 7: superscript, 8: subscript, A: space, B: letter,
-% C:other, D:active).
-% \end{itemize}
-% As all other mappings the mapping is done at the current group
-% level, \emph{i.e.}~any local assignments made by the \meta{inline
-% function} remain in effect after the loop.
+% arguments as explained above. As all other mappings the mapping is
+% done at the current group level, \emph{i.e.}~any local assignments
+% made by the \meta{inline function} remain in effect after the loop.
% \end{function}
%
% \end{documentation}
@@ -165,7 +171,7 @@
% ^^A which does not add the <active char> in memory.
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \subsection{Variables and helper functions}
@@ -182,18 +188,54 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{variable}{\l_@@_analysis_token}
-% \begin{variable}{\l_@@_analysis_char_token}
+% \begin{variable}
+% {\l_@@_analysis_token, \l_@@_analysis_char_token, \l_@@_analysis_next_token}
% The tokens in the token list are probed with the \TeX{} primitive
% \tn{futurelet}. We use \cs{l_@@_analysis_token} in that
% construction. In some cases, we convert the following token to a
% string before probing it: then the token variable used is
-% \cs{l_@@_analysis_char_token}.
+% \cs{l_@@_analysis_char_token}. When getting tokens from the input
+% stream we may need to look two tokens ahead, for which we use
+% \cs{l_@@_analysis_next_token}.
% \begin{macrocode}
\cs_new_eq:NN \l_@@_analysis_token ?
\cs_new_eq:NN \l_@@_analysis_char_token ?
+\cs_new_eq:NN \l_@@_analysis_next_token ?
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_peek_code_tl}
+% Holds some code to be run once the next token has been fully
+% analysed in \cs{peek_analysis_map_inline:n}.
+% \begin{macrocode}
+\tl_new:N \l_@@_peek_code_tl
% \end{macrocode}
% \end{variable}
+%
+% \begin{variable}{\c_@@_peek_catcodes_tl}
+% A token list containing the character number~$32$ (space) with all
+% possible category codes except $1$ and $2$ (begin-group and
+% end-group). Why $32$? Because some \LuaTeX{} versions only allow
+% creation of catcode~$10$ (space) tokens with this character code,
+% and because even in other engines it is much easier to produce since
+% \cs{char_generate:nn} refuses to produce spaces.
+% \begin{macrocode}
+\group_begin:
+\char_set_active_eq:NN \ \scan_stop:
+\tl_const:Nx \c_@@_peek_catcodes_tl
+ {
+ \char_generate:nn { 32 } { 3 } 3
+ \char_generate:nn { 32 } { 4 } 4
+ # \char_generate:nn { 32 } { 6 } 6
+ \char_generate:nn { 32 } { 7 } 7
+ \char_generate:nn { 32 } { 8 } 8
+ \c_space_tl \token_to_str:N A
+ \char_generate:nn { 32 } { 11 } \token_to_str:N B
+ \char_generate:nn { 32 } { 12 } \token_to_str:N C
+ \char_generate:nn { 32 } { 13 } \token_to_str:N D
+ }
+\group_end:
+% \end{macrocode}
% \end{variable}
%
% \begin{variable}{\l_@@_analysis_normal_int}
@@ -721,7 +763,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_analysis_b:n #1
{
- \tl_gset:Nx \g_@@_analysis_result_tl
+ \__kernel_tl_gset:Nx \g_@@_analysis_result_tl
{
\@@_analysis_b_loop:w 0; #1
\prg_break_point:
@@ -1075,6 +1117,358 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Peeking ahead}
+%
+% \begin{macro}[EXP]{\peek_analysis_map_break:, \peek_analysis_map_break:n}
+% The break statements use the general \cs{prg_map_break:Nn}.
+% \begin{macrocode}
+\cs_new:Npn \peek_analysis_map_break:
+ { \prg_map_break:Nn \peek_analysis_map_break: { } }
+\cs_new:Npn \peek_analysis_map_break:n
+ { \prg_map_break:Nn \peek_analysis_map_break: }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}{\l_@@_peek_charcode_int}
+% \begin{macrocode}
+\int_new:N \l_@@_peek_charcode_int
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_analysis_char_arg:Nw, \@@_analysis_char_arg_aux:Nw}
+% After a call to \tn{futurelet} \cs{l_@@_analysis_token} followed by
+% a stringified character token (either explicit space or catcode
+% other character), grab the argument and pass it to |#1|. We only
+% need to do anything in the case of a space.
+% \begin{macrocode}
+\cs_new:Npn \@@_analysis_char_arg:Nw
+ {
+ \if_meaning:w \l_@@_analysis_token \c_space_token
+ \exp_after:wN \@@_analysis_char_arg_aux:Nw
+ \fi:
+ }
+\cs_new:Npn \@@_analysis_char_arg_aux:Nw #1 ~ { #1 { ~ } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \peek_analysis_map_inline:n,
+% \@@_peek_analysis_loop:NNn, \@@_peek_analysis_test:,
+% \@@_peek_analysis_normal:N, \@@_peek_analysis_cs:,
+% \@@_peek_analysis_char:N, \@@_peek_analysis_char:nN,
+% \@@_peek_analysis_special:, \@@_peek_analysis_retest:,
+% \@@_peek_analysis_next:, \@@_peek_analysis_str:,
+% \@@_peek_analysis_str:w, \@@_peek_analysis_str:n,
+% \@@_peek_analysis_active_str:n, \@@_peek_analysis_explicit:n,
+% \@@_peek_analysis_escape:, \@@_peek_analysis_collect:w,
+% \@@_peek_analysis_collect:n, \@@_peek_analysis_collect_loop:,
+% \@@_peek_analysis_collect_test:, \@@_peek_analysis_collect_end:NNN
+% }
+% Save the user's code in a control sequence that is suitable for
+% nested maps. We may wish to pass to this function an \tn{outer}
+% control sequence or active character; for this we will undefine
+% potentially-\tn{outer} tokens within a group, closed after the
+% function receives its arguments. This user's code function also
+% calls the loop auxiliary, and includes the trailing
+% \cs{prg_break_point:Nn} for when the user wants to stop the loop.
+% The loop auxiliary must remove that break point because it must look
+% at the input stream.
+% \begin{macrocode}
+\cs_new_protected:Npn \peek_analysis_map_inline:n #1
+ {
+ \int_gincr:N \g__kernel_prg_map_int
+ \cs_set_protected:cpn
+ { @@_analysis_map_ \int_use:N \g__kernel_prg_map_int :nnN }
+ ##1##2##3
+ {
+ \group_end:
+ #1
+ \@@_peek_analysis_loop:NNn
+ \prg_break_point:Nn \peek_analysis_map_break: { }
+ }
+ \@@_peek_analysis_loop:NNn ? ? ?
+ }
+% \end{macrocode}
+% The loop starts a group (closed by the user-code function defined
+% above) with a normalized escape character, and checks if the next
+% token is special or \texttt{N}-type.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_analysis_loop:NNn #1#2#3
+ {
+ \group_begin:
+ \tl_set:Nx \l_@@_peek_code_tl
+ {
+ \exp_not:c
+ { @@_analysis_map_ \int_use:N \g__kernel_prg_map_int :nnN }
+ }
+ \int_set:Nn \tex_escapechar:D { `\\ }
+ \peek_after:Nw \@@_peek_analysis_test:
+ }
+\cs_new_protected:Npn \@@_peek_analysis_test:
+ {
+ \if_int_odd:w
+ \if_catcode:w \exp_not:N \l_peek_token { 0 \exp_stop_f: \fi:
+ \if_catcode:w \exp_not:N \l_peek_token } 0 \exp_stop_f: \fi:
+ \if_meaning:w \l_peek_token \c_space_token 0 \exp_stop_f: \fi:
+ 1 \exp_stop_f:
+ \exp_after:wN \exp_after:wN
+ \exp_after:wN \@@_peek_analysis_normal:N
+ \exp_after:wN \exp_not:N
+ \else:
+ \exp_after:wN \@@_peek_analysis_special:
+ \fi:
+ }
+% \end{macrocode}
+% Normal tokens are not too hard, but can be \tn{outer}, hence the
+% \cs{exp_not:N} in the code above. If the token is expandable then
+% it might be an \tn{outer} or a \TeX{} conditional, so to be safe we
+% set it to \cs{scan_stop:} (the assignment is local and stopped by
+% the \cs{group_end:} upon calling the user's code). Then distinguish
+% characters (including active ones and macro parameter characters)
+% from control sequences (whose string representation is more than one
+% character because the escape character is printable). For a control
+% sequence call the user code with suitable arguments.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_analysis_normal:N #1
+ {
+ \exp_after:wN \reverse_if:N \exp_after:wN \if_meaning:w
+ \exp_not:N #1 #1
+ \tex_let:D #1 \scan_stop:
+ \tl_put_right:Nn \l_@@_peek_code_tl { { \exp_not:N #1 } }
+ \else:
+ \tl_put_right:Nn \l_@@_peek_code_tl { { \exp_not:n {#1} } }
+ \fi:
+ \if_charcode:w
+ \scan_stop:
+ \exp_after:wN \use_none:n \token_to_str:N #1 \prg_do_nothing:
+ \scan_stop:
+ \exp_after:wN \@@_peek_analysis_char:N
+ \exp_after:wN #1
+ \else:
+ \exp_after:wN \@@_peek_analysis_cs:
+ \fi:
+ }
+\cs_new_protected:Npn \@@_peek_analysis_cs:
+ { \l_@@_peek_code_tl { -1 } 0 }
+\cs_new_protected:Npn \@@_peek_analysis_char:N #1
+ {
+ \char_set_lccode:nn { `#1 } { 32 }
+ \tex_lowercase:D { \@@_peek_analysis_char:nN {#1} } #1
+ }
+\cs_new_protected:Npn \@@_peek_analysis_char:nN #1#2
+ {
+ \cs_set_protected:Npn \@@_tmp:w ##1 #1 ##2 ##3 \scan_stop:
+ { \exp_args:No \l_@@_peek_code_tl { \int_value:w `#2 } ##2 }
+ \exp_after:wN \@@_tmp:w \c_@@_peek_catcodes_tl \scan_stop:
+ }
+% \end{macrocode}
+% For special characters the idea is to eventually act with
+% \cs{token_to_str:N}, then pick up one by one the characters of this
+% string representation until hitting the token that follows. First
+% determine the character code of (the meaning of) the \meta{token}
+% (which we know is a special token), make sure the escape character
+% is different from it, normalize the meanings of two active
+% characters and the empty control sequence, and filter out these
+% cases in \cs{@@_peek_analysis_retest:}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_analysis_special:
+ {
+ \tex_let:D \l_@@_analysis_token = ~ \l_peek_token
+ \int_set:Nn \l_@@_peek_charcode_int
+ { \@@_analysis_extract_charcode: }
+ \if_int_compare:w \l_@@_peek_charcode_int = \tex_escapechar:D
+ \int_set:Nn \tex_escapechar:D { `\/ }
+ \fi:
+ \char_set_active_eq:nN { \l_@@_peek_charcode_int } \scan_stop:
+ \char_set_active_eq:nN { \tex_escapechar:D } \scan_stop:
+ \cs_set_eq:cN { } \scan_stop:
+ \tex_futurelet:D \l_@@_analysis_token
+ \@@_peek_analysis_retest:
+ }
+\cs_new_protected:Npn \@@_peek_analysis_retest:
+ {
+ \if_meaning:w \l_@@_analysis_token \scan_stop:
+ \exp_after:wN \@@_peek_analysis_normal:N
+ \else:
+ \exp_after:wN \@@_peek_analysis_next:
+ \fi:
+ }
+% \end{macrocode}
+% At this point we know the meaning of the \meta{token} in the input
+% stream is \cs{l_peek_token}, either a space (32, 10) or a
+% begin-group or end-group token (catcode $1$ or~$2$), and we excluded
+% a few cases that would be difficult later (empty control sequence,
+% active character with the same character code as its meaning or as
+% the escape character). Now look at the \meta{next token} following
+% it using a combination of \tn{afterassignment} and \tn{futurelet}.
+% The syntax of this primitive is \tn{futurelet} \meta{peek token}
+% \meta{first token} \meta{next token}, and it sets \meta{peek token}
+% equal to \meta{next token}. Traditionally, one takes \meta{first
+% token} to be some macro that regains control of the code and, e.g.,
+% analyses \meta{peek token}. Here, both \meta{first token} and
+% \meta{next token} are mostly unknown tokens in the input stream (but
+% we know the \meta{first token} has catcode $1$, $2$ or $10$), where
+% \meta{first token} was already stored as \cs{l_peek_token}, and we
+% regain control using \tn{afterassignment}, which inserts its
+% argument after the assignment, hence after \meta{peek token} but
+% before \meta{first token}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_analysis_next:
+ {
+ \tl_if_empty:oT { \tex_the:D \tex_everyeof:D }
+ { \tex_everyeof:D { \scan_stop: } }
+ \tex_afterassignment:D \@@_peek_analysis_str:
+ \tex_futurelet:D \l_@@_analysis_next_token
+ }
+% \end{macrocode}
+% We then hit the \meta{first token} with \cs{token_to_str:N} and grab
+% characters until finding \cs{l_@@_analysis_next_token}. More
+% precisely, by looking at the first character in the string
+% representation of the \meta{first token} we distinguish three cases:
+% a stringified control sequence starts with the escape character; for
+% an explicit character we find that same character; for an explicit
+% character we find anything else (we made sure to exclude the case of
+% an active character whose string representation coincides with the
+% other two cases).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_analysis_str:
+ {
+ \exp_after:wN \tex_futurelet:D
+ \exp_after:wN \l_@@_analysis_token
+ \exp_after:wN \@@_peek_analysis_str:w
+ \token_to_str:N
+ }
+\cs_new_protected:Npn \@@_peek_analysis_str:w
+ { \@@_analysis_char_arg:Nw \@@_peek_analysis_str:n }
+\cs_new_protected:Npn \@@_peek_analysis_str:n #1
+ {
+ \int_case:nnF { `#1 }
+ {
+ { \l_@@_peek_charcode_int }
+ { \@@_peek_analysis_explicit:n {#1} }
+ { \tex_escapechar:D } { \@@_peek_analysis_escape: }
+ }
+ { \@@_peek_analysis_active_str:n {#1} }
+ }
+% \end{macrocode}
+% When |#1| is a stringified active character we pass appropriate
+% arguments to the user's code; thankfully \cs{char_generate:nn}
+% can make active characters.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_analysis_active_str:n #1
+ {
+ \tl_put_right:Nx \l_@@_peek_code_tl
+ {
+ { \char_generate:nn { `#1 } { 13 } }
+ { \int_value:w `#1 }
+ \token_to_str:N D
+ }
+ \l_@@_peek_code_tl
+ }
+% \end{macrocode}
+% When |#1| matches the character we had extracted from the meaning of
+% \cs{l_peek_token}, the token was an explicit character, which can be
+% a standard space, or a begin-group or end-group character with some
+% character code. In the latter two cases we call
+% \cs{char_generate:nn} with suitable arguments and put suitable
+% \cs{if_false:} \cs{fi:} constructions to make the result balanced
+% and such that \texttt{o}-expanding or \texttt{x}-expanding gives
+% back a single (unbalanced) begin-group or end-group character.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_analysis_explicit:n #1
+ {
+ \tl_put_right:Nx \l_@@_peek_code_tl
+ {
+ \if_meaning:w \l_peek_token \c_space_token
+ { ~ } { 32 } \token_to_str:N A
+ \else:
+ \if_catcode:w \l_peek_token \c_group_begin_token
+ {
+ \exp_not:N \exp_after:wN
+ \char_generate:nn { `#1 } { 1 }
+ \exp_not:N \if_false:
+ \if_false: { \fi: }
+ \exp_not:N \fi:
+ }
+ { \int_value:w `#1 }
+ 1
+ \else:
+ {
+ \exp_not:N \if_false:
+ { \if_false: } \fi:
+ \exp_not:N \fi:
+ \char_generate:nn { `#1 } { 2 }
+ }
+ { \int_value:w `#1 }
+ 2
+ \fi:
+ \fi:
+ }
+ \l_@@_peek_code_tl
+ }
+% \end{macrocode}
+% Finally there is the case of a special token whose string
+% representation starts with an escape character, namely the token was
+% a control sequence. In that case we could have grabbed the token
+% directly as an \texttt{N}-type argument, but of course we couldn't
+% know that until we had run all the various tests including
+% stringifying the token. We are thus left with the hard work of
+% picking up one by one the characters in the csname (being careful
+% about spaces), until finding a token that matches the \meta{next
+% token} picked up earlier (which was not stringified), such that the
+% control sequence that we found so far indeed has the expected
+% meaning \cs{l_peek_token}. This comparison with \cs{l_peek_token}
+% catches a reasonably common case like \cs{c_group_begin_token} |_|
+% in which the trailing |_| has category code other: without
+% comparison of the constructed csname with \cs{l_peek_token}
+% collection would stop at \cs[no-index]{c}, which is wrong.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_analysis_escape:
+ {
+ \tl_clear:N \l_@@_internal_a_tl
+ \tex_futurelet:D \l_@@_analysis_token
+ \@@_peek_analysis_collect:w
+ }
+\cs_new_protected:Npn \@@_peek_analysis_collect:w
+ { \@@_analysis_char_arg:Nw \@@_peek_analysis_collect:n }
+\cs_new_protected:Npn \@@_peek_analysis_collect:n #1
+ {
+ \tl_put_right:Nn \l_@@_internal_a_tl {#1}
+ \@@_peek_analysis_collect_loop:
+ }
+\cs_new_protected:Npn \@@_peek_analysis_collect_loop:
+ {
+ \tex_futurelet:D \l_@@_analysis_token
+ \@@_peek_analysis_collect_test:
+ }
+\cs_new_protected:Npn \@@_peek_analysis_collect_test:
+ {
+ \if_meaning:w \l_@@_analysis_token \l_@@_analysis_next_token
+ \exp_after:wN \if_meaning:w \cs:w \l_@@_internal_a_tl \cs_end: \l_peek_token
+ \@@_peek_analysis_collect_end:NNN
+ \fi:
+ \fi:
+ \@@_peek_analysis_collect:w
+ }
+% \end{macrocode}
+% End by calling the user code with suitable arguments (here |#1|,
+% |#2| are \cs{fi:}), which closes the group begun early on.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_peek_analysis_collect_end:NNN #1#2#3
+ {
+ #1 #2
+ \tl_put_right:Nx \l_@@_peek_code_tl
+ {
+ { \exp_not:N \exp_not:n { \exp_not:c { \l_@@_internal_a_tl } } }
+ { -1 }
+ 0
+ }
+ \l_@@_peek_code_tl
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Messages}
%
% \begin{variable}{\c_@@_analysis_show_etc_str}
@@ -1098,7 +1492,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
index 3fba28f01d1..c7038b08d12 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
@@ -2,7 +2,7 @@
%
%% File: l3tl.dtx
%
-% Copyright (C) 1990-2020 The LaTeX3 Project
+% Copyright (C) 1990-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -305,7 +305,8 @@
% This allows the \meta{tl~var} to contain material
% with category codes other than those that apply when \meta{tokens}
% are absorbed. The \meta{setup} is run within a group and may
-% contain any valid input, although only changes in category codes
+% contain any valid input, although only changes in category codes,
+% such as uses of \cs{cctab_select:N},
% are relevant. See also \cs{tl_rescan:nn}.
% \begin{texnote}
% The \meta{tokens} are first turned into a string (using
@@ -332,7 +333,8 @@
% by the \meta{setup} are those in force at the point of use of
% \cs{tl_rescan:nn}.)
% The \meta{setup} is run within a group and may
-% contain any valid input, although only changes in category codes
+% contain any valid input, although only changes in category codes,
+% such as uses of \cs{cctab_select:N},
% are relevant. See also \cs{tl_set_rescan:Nnn}, which is more
% robust than using \cs{tl_set:Nn} in the \meta{tokens} argument of
% \cs{tl_rescan:nn}.
@@ -401,6 +403,19 @@
% \tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl { true } { false }
% \end{verbatim}
% yields \texttt{false}.
+% See also \cs{str_if_eq:nnTF} for a comparison that ignores category codes.
+% \end{function}
+%
+% \begin{function}[TF, added = 2020-07-14]{\tl_if_eq:Nn, \tl_if_eq:cn}
+% \begin{syntax}
+% \cs{tl_if_eq:NnTF} \meta{tl~var_1} \Arg{token list_2} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{token list variable_1} and the \meta{token
+% list_2} contain the same list of tokens, both in respect of
+% character codes and category codes. This conditional is not
+% expandable: see \cs{tl_if_eq:NNTF} for an expandable version when
+% both token lists are stored in variables, or \cs{str_if_eq:nnTF} if
+% category codes are not important.
% \end{function}
%
% \begin{function}[TF]{\tl_if_eq:nn}
@@ -409,7 +424,9 @@
% \end{syntax}
% Tests if \meta{token list_1} and \meta{token list_2} contain the
% same list of tokens, both in respect of character codes and category
-% codes.
+% codes. This conditional is not expandable: see \cs{tl_if_eq:NNTF}
+% for an expandable version when token lists are stored in variables,
+% or \cs{str_if_eq:nnTF} if category codes are not important.
% \end{function}
%
% \begin{function}[TF]{\tl_if_in:Nn, \tl_if_in:cn}
@@ -556,16 +573,16 @@
% {\tl_map_tokens:Nn, \tl_map_tokens:cn, \tl_map_tokens:nn}
% \begin{syntax}
% \cs{tl_map_tokens:Nn} \meta{tl~var} \Arg{code}
-% \cs{tl_map_tokens:nn} \meta{tokens} \Arg{code}
+% \cs{tl_map_tokens:nn} \Arg{tokens} \Arg{code}
% \end{syntax}
% Analogue of \cs{tl_map_function:NN} which maps several tokens
% instead of a single function. The \meta{code} receives each item in
-% the \meta{tl~var} or \meta{tokens} as two trailing brace groups. For
+% the \meta{tl~var} or in \meta{tokens} as a trailing brace group. For
% instance,
% \begin{verbatim}
% \tl_map_tokens:Nn \l_my_tl { \prg_replicate:nn { 2 } }
% \end{verbatim}
-% expands to twice each item in the \meta{sequence}: for each item in
+% expands to twice each item in the \meta{tl~var}: for each item in
% |\l_my_tl| the function \cs{prg_replicate:nn} receives |2| and
% \meta{item} as its two arguments. The function
% \cs{tl_map_inline:Nn} is typically faster but is not expandable.
@@ -1203,7 +1220,7 @@
% will \emph{not} match the simple text input |-NoValue-|, \emph{i.e.}
% that
% \begin{verbatim}
-% \tl_if_eq:VnTF \c_novalue_tl { -NoValue- }
+% \tl_if_eq:NnTF \c_novalue_tl { -NoValue- }
% \end{verbatim}
% is logically \texttt{false}. The \cs{c_novalue_tl} marker is intended for
% use in creating document-level interfaces, where it serves as an indicator
@@ -1239,7 +1256,7 @@
% \section{\pkg{l3tl} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -1252,6 +1269,15 @@
%
% \subsection{Functions}
%
+% \begin{macro}{\__kernel_tl_set:Nx,\__kernel_tl_gset:Nx}
+% These two are supplied to get better performance for macros which would
+% otherwise use \cs{tl_set:Nx} or \cs{tl_gset:Nx} internally.
+% \begin{macrocode}
+\cs_new_eq:NN \__kernel_tl_set:Nx \cs_set_nopar:Npx
+\cs_new_eq:NN \__kernel_tl_gset:Nx \cs_gset_nopar:Npx
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\tl_new:N, \tl_new:c}
% Creating new token list variables is a case of checking for an
% existing definition and doing the definition.
@@ -1266,12 +1292,14 @@
% \end{macro}
%
% \begin{macro}{\tl_const:Nn, \tl_const:Nx, \tl_const:cn, \tl_const:cx}
-% Constants are also easy to generate.
+% Constants are also easy to generate. They use \cs{cs_gset_nopar:Npx} instead
+% of \cs{__kernel_tl_gset:Nx} so that the correct scope checking is applied if
+% \pkg{l3debug} is used.
% \begin{macrocode}
\cs_new_protected:Npn \tl_const:Nn #1#2
{
\__kernel_chk_if_free_cs:N #1
- \cs_gset_nopar:Npx #1 { \exp_not:n {#2} }
+ \cs_gset_nopar:Npx #1 { \__kernel_exp_not:w {#2} }
}
\cs_new_protected:Npn \tl_const:Nx #1#2
{
@@ -1333,9 +1361,21 @@
% \cs{scan_stop:} would lead to problems later on.
% \begin{macrocode}
\cs_new_protected:Npn \tl_concat:NNN #1#2#3
- { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
+ {
+ \__kernel_tl_set:Nx #1
+ {
+ \__kernel_exp_not:w \exp_after:wN {#2}
+ \__kernel_exp_not:w \exp_after:wN {#3}
+ }
+ }
\cs_new_protected:Npn \tl_gconcat:NNN #1#2#3
- { \tl_gset:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } }
+ {
+ \__kernel_tl_gset:Nx #1
+ {
+ \__kernel_exp_not:w \exp_after:wN {#2}
+ \__kernel_exp_not:w \exp_after:wN {#3}
+ }
+ }
\cs_generate_variant:Nn \tl_concat:NNN { ccc }
\cs_generate_variant:Nn \tl_gconcat:NNN { ccc }
% \end{macrocode}
@@ -1402,23 +1442,25 @@
% \enquote{by hand} as it is used quite a lot.
% \begin{macrocode}
\cs_new_protected:Npn \tl_set:Nn #1#2
- { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } }
+ { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w {#2} } }
\cs_new_protected:Npn \tl_set:No #1#2
- { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } }
+ { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#2} } }
\cs_new_protected:Npn \tl_set:Nx #1#2
- { \cs_set_nopar:Npx #1 {#2} }
+ { \__kernel_tl_set:Nx #1 {#2} }
\cs_new_protected:Npn \tl_gset:Nn #1#2
- { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } }
+ { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w {#2} } }
\cs_new_protected:Npn \tl_gset:No #1#2
- { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } }
+ { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#2} } }
\cs_new_protected:Npn \tl_gset:Nx #1#2
- { \cs_gset_nopar:Npx #1 {#2} }
-\cs_generate_variant:Nn \tl_set:Nn { NV , Nv , Nf }
+ { \__kernel_tl_gset:Nx #1 {#2} }
+\cs_generate_variant:Nn \tl_set:Nn { NV , Nv , Nf }
+\cs_generate_variant:Nn \tl_set:Nn { c, cV , cv , cf }
\cs_generate_variant:Nn \tl_set:Nx { c }
-\cs_generate_variant:Nn \tl_set:Nn { c, co , cV , cv , cf }
-\cs_generate_variant:Nn \tl_gset:Nn { NV , Nv , Nf }
+\cs_generate_variant:Nn \tl_set:No { c }
+\cs_generate_variant:Nn \tl_gset:Nn { NV , Nv , Nf }
+\cs_generate_variant:Nn \tl_gset:Nn { c, cV , cv , cf }
\cs_generate_variant:Nn \tl_gset:Nx { c }
-\cs_generate_variant:Nn \tl_gset:Nn { c, co , cV , cv , cf }
+\cs_generate_variant:Nn \tl_gset:No { c }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1436,21 +1478,45 @@
% Adding to the left is done directly to gain a little performance.
% \begin{macrocode}
\cs_new_protected:Npn \tl_put_left:Nn #1#2
- { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
+ {
+ \__kernel_tl_set:Nx #1
+ { \__kernel_exp_not:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} }
+ }
\cs_new_protected:Npn \tl_put_left:NV #1#2
- { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
+ {
+ \__kernel_tl_set:Nx #1
+ { \exp_not:V #2 \__kernel_exp_not:w \exp_after:wN {#1} }
+ }
\cs_new_protected:Npn \tl_put_left:No #1#2
- { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
+ {
+ \__kernel_tl_set:Nx #1
+ {
+ \__kernel_exp_not:w \exp_after:wN {#2}
+ \__kernel_exp_not:w \exp_after:wN {#1}
+ }
+ }
\cs_new_protected:Npn \tl_put_left:Nx #1#2
- { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } }
+ { \__kernel_tl_set:Nx #1 { #2 \__kernel_exp_not:w \exp_after:wN {#1} } }
\cs_new_protected:Npn \tl_gput_left:Nn #1#2
- { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } }
+ {
+ \__kernel_tl_gset:Nx #1
+ { \__kernel_exp_not:w {#2} \__kernel_exp_not:w \exp_after:wN {#1} }
+ }
\cs_new_protected:Npn \tl_gput_left:NV #1#2
- { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } }
+ {
+ \__kernel_tl_gset:Nx #1
+ { \exp_not:V #2 \__kernel_exp_not:w \exp_after:wN {#1} }
+ }
\cs_new_protected:Npn \tl_gput_left:No #1#2
- { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } }
+ {
+ \__kernel_tl_gset:Nx #1
+ {
+ \__kernel_exp_not:w \exp_after:wN {#2}
+ \__kernel_exp_not:w \exp_after:wN {#1}
+ }
+ }
\cs_new_protected:Npn \tl_gput_left:Nx #1#2
- { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } }
+ { \__kernel_tl_gset:Nx #1 { #2 \__kernel_exp_not:w \exp_after:wN {#1} } }
\cs_generate_variant:Nn \tl_put_left:Nn { c }
\cs_generate_variant:Nn \tl_put_left:NV { c }
\cs_generate_variant:Nn \tl_put_left:No { c }
@@ -1478,21 +1544,39 @@
% The same on the right.
% \begin{macrocode}
\cs_new_protected:Npn \tl_put_right:Nn #1#2
- { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
+ { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w \exp_after:wN { #1 #2 } } }
\cs_new_protected:Npn \tl_put_right:NV #1#2
- { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
+ {
+ \__kernel_tl_set:Nx #1
+ { \__kernel_exp_not:w \exp_after:wN {#1} \exp_not:V #2 }
+ }
\cs_new_protected:Npn \tl_put_right:No #1#2
- { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
+ {
+ \__kernel_tl_set:Nx #1
+ {
+ \__kernel_exp_not:w \exp_after:wN {#1}
+ \__kernel_exp_not:w \exp_after:wN {#2}
+ }
+ }
\cs_new_protected:Npn \tl_put_right:Nx #1#2
- { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } }
+ { \__kernel_tl_set:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#1} #2 } }
\cs_new_protected:Npn \tl_gput_right:Nn #1#2
- { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } }
+ { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN { #1 #2 } } }
\cs_new_protected:Npn \tl_gput_right:NV #1#2
- { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } }
+ {
+ \__kernel_tl_gset:Nx #1
+ { \__kernel_exp_not:w \exp_after:wN {#1} \exp_not:V #2 }
+ }
\cs_new_protected:Npn \tl_gput_right:No #1#2
- { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } }
+ {
+ \__kernel_tl_gset:Nx #1
+ {
+ \__kernel_exp_not:w \exp_after:wN {#1}
+ \__kernel_exp_not:w \exp_after:wN {#2}
+ }
+ }
\cs_new_protected:Npn \tl_gput_right:Nx #1#2
- { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } }
+ { \__kernel_tl_gset:Nx #1 { \__kernel_exp_not:w \exp_after:wN {#1} #2 } }
\cs_generate_variant:Nn \tl_put_right:Nn { c }
\cs_generate_variant:Nn \tl_put_right:NV { c }
\cs_generate_variant:Nn \tl_put_right:No { c }
@@ -1505,6 +1589,35 @@
% \end{macro}
% \end{macro}
%
+% \subsection{Internal quarks and quark-query functions}
+%
+% \begin{variable}{\q_@@_nil,\q_@@_mark,\q_@@_stop}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+\quark_new:N \q_@@_mark
+\quark_new:N \q_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_recursion_tail
+\quark_new:N \q_@@_recursion_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_if_recursion_tail_break:nN}
+% \begin{macro}[pTF]{\@@_if_recursion_tail_stop:n}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_test:N \@@_if_recursion_tail_break:nN
+\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:n { TF }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Reassigning token list category codes}
%
% \begin{variable}{\c_@@_rescan_marker_tl}
@@ -1528,6 +1641,7 @@
% \tl_gset_rescan:cnn, \tl_gset_rescan:cno, \tl_gset_rescan:cnx
% }
% \begin{macro}{\tl_rescan:nn}
+% \begin{macro}{\@@_rescan_aux:}
% \begin{macro}{\@@_set_rescan:NNnn, \@@_set_rescan_multi:nNN}
% \begin{macro}[EXP]{\@@_rescan:NNw}
% In a group, after some initial setup explained below and the user
@@ -1586,9 +1700,11 @@
\cs_new_protected:Npn \tl_rescan:nn #1#2
{
\tl_set_rescan:Nnn \l_@@_internal_a_tl {#1} {#2}
- \exp_after:wN \tl_clear:N \exp_after:wN \l_@@_internal_a_tl
+ \exp_after:wN \@@_rescan_aux:
\l_@@_internal_a_tl
}
+\exp_args:NNo \cs_new_protected:Npn \@@_rescan_aux:
+ { \tl_clear:N \l_@@_internal_a_tl }
\cs_new_protected:Npn \tl_set_rescan:Nnn
{ \@@_set_rescan:NNnn \tl_set:No }
\cs_new_protected:Npn \tl_gset_rescan:Nnn
@@ -1607,7 +1723,7 @@
}
\cs_new_protected:Npn \@@_set_rescan_multi:nNN #1#2#3
{
- \exp_args:No \tex_everyeof:D { \c_@@_rescan_marker_tl }
+ \tex_everyeof:D \exp_after:wN { \c_@@_rescan_marker_tl }
\exp_after:wN \@@_rescan:NNw
\exp_after:wN #2
\exp_after:wN #3
@@ -1630,6 +1746,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\@@_set_rescan:nNN}
% \begin{macro}{\@@_set_rescan_single:nnNN, \@@_set_rescan_single_aux:nnnNN}
@@ -1670,7 +1787,7 @@
% token list may contain a comment character, in which case the |'| we
% expected is not there. We fix this as follows: rather than just
% |::| we set \tn{everyeof} to |::|\Arg{code1} |'::|\Arg{code2}
-% \cs{q_stop}. The auxiliary \cs{@@_set_rescan_single:NNww} runs the
+% \cs{s_@@_stop}. The auxiliary \cs{@@_set_rescan_single:NNww} runs the
% \texttt{o}-expanding assignment, expanding either \meta{code1} or
% \meta{code2} before its the main argument~|#3|. In the typical case
% without comment character, \meta{code1} is expanded, removing the
@@ -1717,9 +1834,9 @@
{
#1 \use_none:n
#2 #1 { \exp:w \@@_set_rescan_single_aux:w }
- \q_stop
+ \s_@@_stop
}
- \cs_set:Npn \@@_rescan:NNw ##1##2##3 #2 #1 ##4 ##5 \q_stop
+ \cs_set:Npn \@@_rescan:NNw ##1##2##3 #2 #1 ##4 ##5 \s_@@_stop
{
\group_end:
##1 ##2 { ##4 ##3 }
@@ -1756,13 +1873,13 @@
% the \meta{tl~var} by \meta{token list}.
% \begin{macrocode}
\cs_new_protected:Npn \tl_replace_once:Nnn
- { \@@_replace:NnNNNnn \q_mark ? \@@_replace_wrap:w \tl_set:Nx }
+ { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_wrap:w \__kernel_tl_set:Nx }
\cs_new_protected:Npn \tl_greplace_once:Nnn
- { \@@_replace:NnNNNnn \q_mark ? \@@_replace_wrap:w \tl_gset:Nx }
+ { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_wrap:w \__kernel_tl_gset:Nx }
\cs_new_protected:Npn \tl_replace_all:Nnn
- { \@@_replace:NnNNNnn \q_mark ? \@@_replace_next:w \tl_set:Nx }
+ { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_next:w \__kernel_tl_set:Nx }
\cs_new_protected:Npn \tl_greplace_all:Nnn
- { \@@_replace:NnNNNnn \q_mark ? \@@_replace_next:w \tl_gset:Nx }
+ { \@@_replace:NnNNNnn \q_@@_mark ? \@@_replace_next:w \__kernel_tl_gset:Nx }
\cs_generate_variant:Nn \tl_replace_once:Nnn { c }
\cs_generate_variant:Nn \tl_greplace_once:Nnn { c }
\cs_generate_variant:Nn \tl_replace_all:Nnn { c }
@@ -1779,6 +1896,7 @@
% \@@_replace_auxi:NnnNNNnn,
% \@@_replace_auxii:nNNNnn,
% \@@_replace_next:w,
+% \@@_replace_next_aux:w,
% \@@_replace_wrap:w,
% }
% To implement the actual replacement auxiliary
@@ -1816,9 +1934,9 @@
% at most $O(n^{3/2})$. Bear in mind that these upper bounds are
% reached only in very contrived scenarios: we include the case
% \enquote{\meta{A}} in the list of delimiters to try, so that the
-% \meta{delimiter} is simply \cs{q_mark} in the most common
+% \meta{delimiter} is simply \cs{q_@@_mark} in the most common
% situation where neither the \meta{token list} nor the \meta{pattern}
-% contains \cs{q_mark}.
+% contains \cs{q_@@_mark}.
%
% Let us now ahead, optimizing for this most common case. First, two
% special cases: an empty \meta{pattern}~|#6| is an error, and if
@@ -1826,14 +1944,14 @@
% \meta{pattern}~|#6| then we can use it as the \meta{delimiter}
% through \cs{@@_replace_auxii:nNNNnn} |{#1}|. Otherwise, we end up
% calling \cs{@@_replace:NnNNNnn} repeatedly with the first two
-% arguments \cs{q_mark} |{?}|, |\?| |{??}|, |\??| |{???}|, and so on,
+% arguments \cs{q_@@_mark} |{?}|, |\?| |{??}|, |\??| |{???}|, and so on,
% until |#6|~does not contain the control sequence~|#1|, which we take
% as our~\meta{A}. The argument~|#2| only serves to collect~|?|
% characters for~|#1|. Note that the order of the tests means that
% the first two are done every time, which is wasteful (for instance,
% we repeatedly test for the emptyness of~|#6|). However, this is
% rare enough not to matter. Finally, choose~\meta{B} to be
-% \cs{q_nil} or~\cs{q_stop} such that it is not equal to~|#6|.
+% \cs{q_@@_nil} or~\cs{q_@@_stop} such that it is not equal to~|#6|.
%
% The \cs{@@_replace_auxi:NnnNNNnn} auxiliary receives \Arg{A} and
% |{|\meta{A}$^n$\meta{B}|}| as its arguments, initially with $n=1$.
@@ -1855,9 +1973,9 @@
\tl_if_in:nnTF {#6} {#1}
{ \exp_args:Nc \@@_replace:NnNNNnn {#2} {#2?} }
{
- \quark_if_nil:nTF {#6}
- { \@@_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_stop } }
- { \@@_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_nil } }
+ \@@_quark_if_nil:nTF {#6}
+ { \@@_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_@@_stop } }
+ { \@@_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_@@_nil } }
}
}
{ \@@_replace_auxii:nNNNnn {#1} }
@@ -1923,7 +2041,7 @@
{
\group_align_safe_begin:
\cs_set:Npn \@@_replace_wrap:w ##1 #1 ##2
- { \exp_not:o { \use_none:nn ##1 } ##2 }
+ { \__kernel_exp_not:w \exp_after:wN { \use_none:nn ##1 } ##2 }
\cs_set:Npx \@@_replace_next:w ##1 #5
{
\exp_not:N \@@_replace_wrap:w ##1
@@ -1933,9 +2051,7 @@
}
#3 #4
{
- \exp_after:wN \@@_replace_next:w
- \exp_after:wN { \exp_after:wN }
- \exp_after:wN { \exp_after:wN }
+ \exp_after:wN \@@_replace_next_aux:w
#4
#1
{
@@ -1946,6 +2062,7 @@
}
\group_align_safe_end:
}
+\cs_new:Npn \@@_replace_next_aux:w { \@@_replace_next:w { } { } }
\cs_new_eq:NN \@@_replace_wrap:w ?
\cs_new_eq:NN \@@_replace_next:w ?
% \end{macrocode}
@@ -1981,29 +2098,6 @@
%
% \subsection{Token list conditionals}
%
-% \begin{macro}[pTF]{\tl_if_blank:n, \tl_if_blank:V, \tl_if_blank:o}
-% \begin{macro}{\@@_if_blank_p:NNw}
-% \TeX{} skips spaces when reading a non-delimited arguments. Thus,
-% a \meta{token list} is blank if and only if \cs{use_none:n}
-% \meta{token list} |?| is empty after one expansion. The auxiliary
-% \cs{@@_if_empty_if:o} is a fast emptyness test, converting its
-% argument to a string (after one expansion) and using the test
-% \cs{if_meaning:w} \cs{q_nil} |...| \cs{q_nil}.
-% \begin{macrocode}
-\prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF }
- {
- \@@_if_empty_if:o { \use_none:n #1 ? }
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
- }
-\prg_generate_conditional_variant:Nnn \tl_if_blank:n
- { e , V , o } { p , T , F , TF }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \begin{macro}[pTF]{\tl_if_empty:N, \tl_if_empty:c}
% These functions check whether the token list in the argument is
% empty and execute the proper code from their argument(s).
@@ -2022,23 +2116,17 @@
% \end{macro}
%
% \begin{macro}[pTF]{\tl_if_empty:n, \tl_if_empty:V}
-% Convert the argument to a string: this is empty if and only if
-% the argument is. Then |\if_meaning:w \q_nil ... \q_nil| is
-% \texttt{true} if and only if the string |...| is empty.
-% It could be tempting to use |\if_meaning:w \q_nil #1 \q_nil| directly.
-% This fails on a token
-% list starting with \cs{q_nil} of course but more troubling is the
-% case where argument is a complete conditional such as \cs{if_true:}
-% a \cs{else:} b \cs{fi:} because then \cs{if_true:} is used by
-% \cs{if_meaning:w}, the test turns out \texttt{false}, the \cs{else:}
-% executes the \texttt{false} branch, the \cs{fi:} ends it and the
-% \cs{q_nil} at the end
-% starts executing\dots{}
+% The \cs{if:w} triggers the expansion of \cs{tl_to_str:n} which converts the
+% argument to a string: this is empty if and only if the argument is. Then
+% |\if:w \scan_stop: ... \scan_stop:| is \texttt{true} if and only if the
+% string |...| is empty.
+% It could be tempting to use |\if:w \scan_stop: #1 \scan_stop:| directly.
+% But this fails on a token list expanding to anything starting with
+% \cs{scan_stop:} leaving everything that follows in the input stream.
% \begin{macrocode}
\prg_new_conditional:Npnn \tl_if_empty:n #1 { p , TF , T , F }
{
- \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
- \tl_to_str:n {#1} \q_nil
+ \if:w \scan_stop: \tl_to_str:n {#1} \scan_stop:
\prg_return_true:
\else:
\prg_return_false:
@@ -2061,13 +2149,15 @@
% We don't put \cs{prg_return_true:} and so on in the definition of
% the auxiliary, because that would prevent an optimization applied to
% conditionals that end with this code.
+% Also the |\@@_if_empty_if:o| is expanded once in |\tl_if_empty:oTF| for
+% efficiency as well (and to reduce code doubling).
% \begin{macrocode}
\cs_new:Npn \@@_if_empty_if:o #1
{
- \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
- \__kernel_tl_to_str:w \exp_after:wN {#1} \q_nil
+ \if:w \scan_stop: \__kernel_tl_to_str:w \exp_after:wN {#1} \scan_stop:
}
-\prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F }
+\exp_args:Nno \use:n
+ { \prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F } }
{
\@@_if_empty_if:o {#1}
\prg_return_true:
@@ -2079,6 +2169,30 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}[pTF]{\tl_if_blank:n, \tl_if_blank:V, \tl_if_blank:o}
+% \begin{macro}{\@@_if_blank_p:NNw}
+% \TeX{} skips spaces when reading a non-delimited arguments. Thus,
+% a \meta{token list} is blank if and only if \cs{use_none:n}
+% \meta{token list} |?| is empty after one expansion. The auxiliary
+% \cs{@@_if_empty_if:o} is a fast emptyness test, converting its
+% argument to a string (after one expansion) and using the test
+% \cs{if:w} \cs{scan_stop:} |...| \cs{scan_stop:}.
+% \begin{macrocode}
+\exp_args:Nno \use:n
+ { \prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF } }
+ {
+ \@@_if_empty_if:o { \use_none:n #1 ? }
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+\prg_generate_conditional_variant:Nnn \tl_if_blank:n
+ { e , V , o } { p , T , F , TF }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}[pTF]{\tl_if_eq:NN, \tl_if_eq:Nc, \tl_if_eq:cN, \tl_if_eq:cc}
% Returns \cs{c_true_bool} if and only if the two token list variables are
% equal.
@@ -2096,8 +2210,34 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[TF]{\tl_if_eq:nn}
% \begin{variable}{\l_@@_internal_a_tl, \l_@@_internal_b_tl}
+% Temporary storage.
+% \begin{macrocode}
+\tl_new:N \l_@@_internal_a_tl
+\tl_new:N \l_@@_internal_b_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[TF]{\tl_if_eq:Nn}
+% A simple store and compare routine.
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \tl_if_eq:Nn #1#2 { T , F , TF }
+ {
+ \group_begin:
+ \tl_set:Nn \l_@@_internal_b_tl {#2}
+ \exp_after:wN
+ \group_end:
+ \if_meaning:w #1 \l_@@_internal_b_tl
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+\prg_generate_conditional_variant:Nnn \tl_if_eq:Nn { c } { TF , T , F }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[TF]{\tl_if_eq:nn}
% A simple store and compare routine.
% \begin{macrocode}
\prg_new_protected_conditional:Npnn \tl_if_eq:nn #1#2 { T , F , TF }
@@ -2113,10 +2253,7 @@
\prg_return_false:
\fi:
}
-\tl_new:N \l_@@_internal_a_tl
-\tl_new:N \l_@@_internal_b_tl
% \end{macrocode}
-% \end{variable}
% \end{macro}
%
% \begin{macro}[TF]{\tl_if_in:Nn, \tl_if_in:cn}
@@ -2200,34 +2337,34 @@
% \end{macro}
%
% \begin{macro}[EXP,pTF]{\tl_if_single:n}
-% \begin{macro}[EXP,pTF]{\@@_if_single:n}
+% \begin{macro}[EXP]{\@@_if_single:nnw}
% This test is similar to \cs{tl_if_empty:nTF}. Expanding
% \cs{use_none:nn} |#1| |??| once yields an empty result if |#1| is
% blank, a single~|?| if |#1| has a single item, and otherwise yields
-% some tokens ending with |??|. Then, \cs{tl_to_str:n} makes sure
+% some tokens ending with |??|. Then, \cs{__kernel_tl_to_str:w} makes sure
% there are no odd category codes. An earlier version would compare
% the result to a single~|?| using string comparison, but the Lua call
% is slow in \LuaTeX{}. Instead, \cs{@@_if_single:nnw} picks the
% second token in front of it. If |#1| is empty, this token is
-% the trailing~|?| and the catcode test yields \texttt{false}. If
-% |#1| has a single item, the token is~|^| and the catcode test
+% the trailing~|?| and the |\if:w| test yields \texttt{false}. If
+% |#1| has a single item, the token is~|\scan_stop:| and the |\if:w| test
% yields \texttt{true}. Otherwise, it is one of the characters
-% resulting from \cs{tl_to_str:n}, and the catcode test yields
-% \texttt{false}. Note that \cs{if_catcode:w} and
+% resulting from \cs{tl_to_str:n}, and the |\if:w| test yields
+% \texttt{false}. Note that \cs{if:w} and
% \cs{__kernel_tl_to_str:w} are primitives that take care of
% expansion.
% \begin{macrocode}
\prg_new_conditional:Npnn \tl_if_single:n #1 { p , T , F , TF }
{
- \if_catcode:w ^ \exp_after:wN \@@_if_single:nnw
+ \if:w \scan_stop: \exp_after:wN \@@_if_single:nnw
\__kernel_tl_to_str:w
- \exp_after:wN { \use_none:nn #1 ?? } ^ ? \q_stop
+ \exp_after:wN { \use_none:nn #1 ?? } \scan_stop: ? \s_@@_stop
\prg_return_true:
\else:
\prg_return_false:
\fi:
}
-\cs_new:Npn \@@_if_single:nnw #1#2#3 \q_stop {#2}
+\cs_new:Npn \@@_if_single:nnw #1#2#3 \s_@@_stop {#2}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2291,7 +2428,7 @@
\@@_case:NnTF #1 {#2}
}
\cs_new:Npn \@@_case:NnTF #1#2#3#4
- { \@@_case:Nw #1 #2 #1 { } \q_mark {#3} \q_mark {#4} \q_stop }
+ { \@@_case:Nw #1 #2 #1 { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
\cs_new:Npn \@@_case:Nw #1#2#3
{
\tl_if_eq:NNTF #1 #2
@@ -2306,14 +2443,14 @@
% one of the cases searched for, then |#1| is the code to insert,
% |#2| is the \emph{next} case to check on and |#3| is all of
% the rest of the cases code. That means that |#4| is the \texttt{true}
-% branch code, and |#5| tidies up the spare \cs{q_mark} and the
+% branch code, and |#5| tidies up the spare \cs{s_@@_mark} and the
% \texttt{false} branch. On the other hand, if none of the cases matched
% then we arrive here using the \enquote{termination} case of comparing
% the search with itself. That means that |#1| is empty, |#2| is
-% the first \cs{q_mark} and so |#4| is the \texttt{false} code (the
+% the first \cs{s_@@_mark} and so |#4| is the \texttt{false} code (the
% \texttt{true} code is mopped up by |#3|).
% \begin{macrocode}
-\cs_new:Npn \@@_case_end:nw #1#2#3 \q_mark #4#5 \q_stop
+\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
{ \exp_end: #1 #4 }
% \end{macrocode}
% \end{macro}
@@ -2333,14 +2470,14 @@
\cs_new:Npn \tl_map_function:nN #1#2
{
\@@_map_function:Nn #2 #1
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:Nn \tl_map_break: { }
}
\cs_new:Npn \tl_map_function:NN
{ \exp_args:No \tl_map_function:nN }
\cs_new:Npn \@@_map_function:Nn #1#2
{
- \quark_if_recursion_tail_break:nN {#2} \tl_map_break:
+ \@@_if_recursion_tail_break:nN {#2} \tl_map_break:
#1 {#2} \@@_map_function:Nn #1
}
\cs_generate_variant:Nn \tl_map_function:NN { c }
@@ -2363,7 +2500,7 @@
{ @@_map_ \int_use:N \g__kernel_prg_map_int :w } ##1 {#2}
\exp_args:Nc \@@_map_function:Nn
{ @@_map_ \int_use:N \g__kernel_prg_map_int :w }
- #1 \q_recursion_tail
+ #1 \q_@@_recursion_tail
\prg_break_point:Nn \tl_map_break:
{ \int_gdecr:N \g__kernel_prg_map_int }
}
@@ -2382,7 +2519,7 @@
\cs_new:Npn \tl_map_tokens:nn #1#2
{
\@@_map_tokens:nn {#2} #1
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:Nn \tl_map_break: { }
}
\cs_new:Npn \tl_map_tokens:Nn
@@ -2390,7 +2527,7 @@
\cs_generate_variant:Nn \tl_map_tokens:Nn { c }
\cs_new:Npn \@@_map_tokens:nn #1#2
{
- \quark_if_recursion_tail_break:nN {#2} \tl_map_break:
+ \@@_if_recursion_tail_break:nN {#2} \tl_map_break:
\use:n {#1} {#2}
\@@_map_tokens:nn {#1}
}
@@ -2410,14 +2547,14 @@
\cs_new_protected:Npn \tl_map_variable:nNn #1#2#3
{
\@@_map_variable:Nnn #2 {#3} #1
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:Nn \tl_map_break: { }
}
\cs_new_protected:Npn \tl_map_variable:NNn
{ \exp_args:No \tl_map_variable:nNn }
\cs_new_protected:Npn \@@_map_variable:Nnn #1#2#3
{
- \quark_if_recursion_tail_break:nN {#3} \tl_map_break:
+ \@@_if_recursion_tail_break:nN {#3} \tl_map_break:
\tl_set:Nn #1 {#3}
\use:n {#2}
\@@_map_variable:Nnn #1 {#2}
@@ -2518,18 +2655,16 @@
{
\int_eval:n
{
- \@@_act:NNNnn
- \@@_act_count_normal:nN
- \@@_act_count_group:nn
- \@@_act_count_space:n
- { }
+ \@@_act:NNNn
+ \@@_act_count_normal:N
+ \@@_act_count_group:n
+ \@@_act_count_space:
{#1}
}
}
-\cs_new:Npn \@@_act_count_normal:nN #1 #2 { 1 + }
-\cs_new:Npn \@@_act_count_space:n #1 { 1 + }
-\cs_new:Npn \@@_act_count_group:nn #1 #2
- { 2 + \tl_count_tokens:n {#2} + }
+\cs_new:Npn \@@_act_count_normal:N #1 { 1 + }
+\cs_new:Npn \@@_act_count_space: { 1 + }
+\cs_new:Npn \@@_act_count_group:n #1 { 2 + \tl_count_tokens:n {#1} + }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2538,24 +2673,24 @@
% \begin{macro}{\@@_reverse_items:nwNwn}
% \begin{macro}{\@@_reverse_items:wn}
% Reversal of a token list is done by taking one item at a time
-% and putting it after \cs{q_stop}.
+% and putting it after \cs{s_@@_stop}.
% \begin{macrocode}
\cs_new:Npn \tl_reverse_items:n #1
{
\@@_reverse_items:nwNwn #1 ?
- \q_mark \@@_reverse_items:nwNwn
- \q_mark \@@_reverse_items:wn
- \q_stop { }
+ \s_@@_mark \@@_reverse_items:nwNwn
+ \s_@@_mark \@@_reverse_items:wn
+ \s_@@_stop { }
}
-\cs_new:Npn \@@_reverse_items:nwNwn #1 #2 \q_mark #3 #4 \q_stop #5
+\cs_new:Npn \@@_reverse_items:nwNwn #1 #2 \s_@@_mark #3 #4 \s_@@_stop #5
{
#3 #2
- \q_mark \@@_reverse_items:nwNwn
- \q_mark \@@_reverse_items:wn
- \q_stop { {#1} #5 }
+ \s_@@_mark \@@_reverse_items:nwNwn
+ \s_@@_mark \@@_reverse_items:wn
+ \s_@@_stop { {#1} #5 }
}
-\cs_new:Npn \@@_reverse_items:wn #1 \q_stop #2
- { \exp_not:o { \use_none:nn #2 } }
+\cs_new:Npn \@@_reverse_items:wn #1 \s_@@_stop #2
+ { \__kernel_exp_not:w \exp_after:wN { \use_none:nn #2 } }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2570,22 +2705,28 @@
% }
% Trimming spaces from around the input is deferred to an internal
% function whose first argument is the token list to trim, augmented
-% by an initial \cs{q_mark}, and whose second argument is a
+% by an initial \cs{@@_trim_mark:}, and whose second argument is a
% \meta{continuation}, which receives as a braced argument
-% \cs{use_none:n} \cs{q_mark} \meta{trimmed token list}. In the case
-% at hand, we take \cs{exp_not:o} as our continuation, so that space
-% trimming behaves correctly within an \texttt{x}-type expansion.
+% \cs{@@_trim_mark:} \meta{trimmed token list}. The control sequence
+% \cs{@@_trim_mark:} expands to nothing in a single expansion. In the case
+% at hand, we take \cs{__kernel_exp_not:w} \cs{exp_after:wN} as our
+% continuation, so that space trimming behaves correctly within an
+% \texttt{x}-type expansion.
% \begin{macrocode}
\cs_new:Npn \tl_trim_spaces:n #1
- { \@@_trim_spaces:nn { \q_mark #1 } \exp_not:o }
+ {
+ \@@_trim_spaces:nn
+ { \@@_trim_mark: #1 }
+ { \__kernel_exp_not:w \exp_after:wN }
+ }
\cs_generate_variant:Nn \tl_trim_spaces:n { o }
\cs_new:Npn \tl_trim_spaces_apply:nN #1#2
- { \@@_trim_spaces:nn { \q_mark #1 } { \exp_args:No #2 } }
+ { \@@_trim_spaces:nn { \@@_trim_mark: #1 } { \exp_args:No #2 } }
\cs_generate_variant:Nn \tl_trim_spaces_apply:nN { o }
\cs_new_protected:Npn \tl_trim_spaces:N #1
- { \tl_set:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
+ { \__kernel_tl_set:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
\cs_new_protected:Npn \tl_gtrim_spaces:N #1
- { \tl_gset:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
+ { \__kernel_tl_gset:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } }
\cs_generate_variant:Nn \tl_trim_spaces:N { c }
\cs_generate_variant:Nn \tl_gtrim_spaces:N { c }
% \end{macrocode}
@@ -2598,228 +2739,79 @@
% \@@_trim_spaces_auxi:w, \@@_trim_spaces_auxii:w,
% \@@_trim_spaces_auxiii:w, \@@_trim_spaces_auxiv:w
% }
+% \begin{macro}{\@@_trim_mark:}
% Trimming spaces from around the input is done using delimited
% arguments and quarks, and to get spaces at odd places in the
% definitions, we nest those in \cs{@@_tmp:w}, which then receives
% a single space as its argument: |#1| is \verb*+ +.
% Removing leading spaces is done with \cs{@@_trim_spaces_auxi:w},
-% which loops until \cs{q_mark}\verb*+ + matches the end of the token
+% which loops until \cs{@@_trim_mark:}\verb*+ + matches the end of the token
% list: then |##1| is the token list and |##3| is
% \cs{@@_trim_spaces_auxii:w}. This hands the relevant tokens to the
% loop \cs{@@_trim_spaces_auxiii:w}, responsible for trimming
-% trailing spaces. The end is reached when \verb*+ + \cs{q_nil}
-% matches the one present in the definition of \cs{tl_trim_spacs:n}.
+% trailing spaces. The end is reached when \verb*+ + \cs{s_@@_nil}
+% matches the one present in the definition of \cs{tl_trim_spaces:n}.
% Then \cs{@@_trim_spaces_auxiv:w} puts the token list into a group,
-% with \cs{use_none:n} placed there to gobble a lingering \cs{q_mark},
-% and feeds this to the \meta{continuation}.
+% with a lingering \cs{@@_trim_mark:} at the start (which will expand to
+% nothing in one step of expansion), and feeds this to the
+% \meta{continuation}.
% \begin{macrocode}
-\cs_set:Npn \@@_tmp:w #1
+\cs_set_protected:Npn \@@_tmp:w #1
{
\cs_new:Npn \@@_trim_spaces:nn ##1
{
\@@_trim_spaces_auxi:w
##1
- \q_nil
- \q_mark #1 { }
- \q_mark \@@_trim_spaces_auxii:w
+ \s_@@_nil
+ \@@_trim_mark: #1 { }
+ \@@_trim_mark: \@@_trim_spaces_auxii:w
\@@_trim_spaces_auxiii:w
- #1 \q_nil
+ #1 \s_@@_nil
\@@_trim_spaces_auxiv:w
- \q_stop
+ \s_@@_stop
}
- \cs_new:Npn \@@_trim_spaces_auxi:w ##1 \q_mark #1 ##2 \q_mark ##3
+ \cs_new:Npn
+ \@@_trim_spaces_auxi:w ##1 \@@_trim_mark: #1 ##2 \@@_trim_mark: ##3
{
##3
\@@_trim_spaces_auxi:w
- \q_mark
+ \@@_trim_mark:
##2
- \q_mark #1 {##1}
+ \@@_trim_mark: #1 {##1}
}
\cs_new:Npn \@@_trim_spaces_auxii:w
- \@@_trim_spaces_auxi:w \q_mark \q_mark ##1
+ \@@_trim_spaces_auxi:w \@@_trim_mark: \@@_trim_mark: ##1
{
\@@_trim_spaces_auxiii:w
##1
}
- \cs_new:Npn \@@_trim_spaces_auxiii:w ##1 #1 \q_nil ##2
+ \cs_new:Npn \@@_trim_spaces_auxiii:w ##1 #1 \s_@@_nil ##2
{
##2
- ##1 \q_nil
+ ##1 \s_@@_nil
\@@_trim_spaces_auxiii:w
}
- \cs_new:Npn \@@_trim_spaces_auxiv:w ##1 \q_nil ##2 \q_stop ##3
- { ##3 { \use_none:n ##1 } }
+ \cs_new:Npn \@@_trim_spaces_auxiv:w ##1 \s_@@_nil ##2 \s_@@_stop ##3
+ { ##3 { ##1 } }
+ \cs_new:Npn \@@_trim_mark: {}
}
\@@_tmp:w { ~ }
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}
% {\tl_sort:Nn, \tl_sort:cn, \tl_gsort:Nn, \tl_gsort:cn, \tl_sort:nN}
% Implemented in \pkg{l3sort}.
% \end{macro}
%
-% \subsection{Token by token changes}
-%
-% \begin{variable}{\q_@@_act_mark, \q_@@_act_stop}
-% The \cs[no-index]{@@_act_\ldots{}} functions may be applied to any token list.
-% Hence, we use two private quarks, to allow any token, even quarks,
-% in the token list.
-% Only \cs{q_@@_act_mark} and \cs{q_@@_act_stop} may not appear
-% in the token lists manipulated by \cs{@@_act:NNNnn} functions.
-% No quark module yet, so do things by hand.
-% \begin{macrocode}
-\cs_new_nopar:Npn \q_@@_act_mark { \q_@@_act_mark }
-\cs_new_nopar:Npn \q_@@_act_stop { \q_@@_act_stop }
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}[EXP]{\@@_act:NNNnn}
-% \begin{macro}[EXP]{\@@_act_output:n, \@@_act_reverse_output:n}
-% \begin{macro}[EXP]{\@@_act_loop:w}
-% \begin{macro}[EXP]{\@@_act_normal:NwnNNN}
-% \begin{macro}[EXP]{\@@_act_group:nwnNNN}
-% \begin{macro}[EXP]{\@@_act_space:wwnNNN}
-% \begin{macro}[EXP]{\@@_act_end:w}
-% To help control the expansion, \cs{@@_act:NNNnn} should always
-% be proceeded by \cs{exp:w} and ends by producing \cs{exp_end:}
-% once the result has been obtained. Then loop over tokens,
-% groups, and spaces in |#5|. The marker \cs{q_@@_act_mark}
-% is used both to avoid losing outer braces and to detect the
-% end of the token list more easily. The result is stored
-% as an argument for the dummy function \cs{@@_act_result:n}.
-% \begin{macrocode}
-\cs_new:Npn \@@_act:NNNnn #1#2#3#4#5
- {
- \group_align_safe_begin:
- \@@_act_loop:w #5 \q_@@_act_mark \q_@@_act_stop
- {#4} #1 #2 #3
- \@@_act_result:n { }
- }
-% \end{macrocode}
-% In the loop, we check how the token list begins and act
-% accordingly. In the \enquote{normal} case, we may have
-% reached \cs{q_@@_act_mark}, the end of the list. Then
-% leave \cs{exp_end:} and the result in the input stream,
-% to terminate the expansion of \cs{exp:w}.
-% Otherwise, apply the relevant function to the
-% \enquote{arguments}, |#3|
-% and to the head of the token list. Then repeat the loop.
-% The scheme is the same if the token list starts with a
-% group or with a space. Some extra work is needed to
-% make \cs{@@_act_space:wwnNNN} gobble the space.
-% \begin{macrocode}
-\cs_new:Npn \@@_act_loop:w #1 \q_@@_act_stop
- {
- \tl_if_head_is_N_type:nTF {#1}
- { \@@_act_normal:NwnNNN }
- {
- \tl_if_head_is_group:nTF {#1}
- { \@@_act_group:nwnNNN }
- { \@@_act_space:wwnNNN }
- }
- #1 \q_@@_act_stop
- }
-\cs_new:Npn \@@_act_normal:NwnNNN #1 #2 \q_@@_act_stop #3#4
- {
- \if_meaning:w \q_@@_act_mark #1
- \exp_after:wN \@@_act_end:wn
- \fi:
- #4 {#3} #1
- \@@_act_loop:w #2 \q_@@_act_stop
- {#3} #4
- }
-\cs_new:Npn \@@_act_end:wn #1 \@@_act_result:n #2
- { \group_align_safe_end: \exp_end: #2 }
-\cs_new:Npn \@@_act_group:nwnNNN #1 #2 \q_@@_act_stop #3#4#5
- {
- #5 {#3} {#1}
- \@@_act_loop:w #2 \q_@@_act_stop
- {#3} #4 #5
- }
-\exp_last_unbraced:NNo
- \cs_new:Npn \@@_act_space:wwnNNN \c_space_tl #1 \q_@@_act_stop #2#3#4#5
- {
- #5 {#2}
- \@@_act_loop:w #1 \q_@@_act_stop
- {#2} #3 #4 #5
- }
-% \end{macrocode}
-% Typically, the output is done to the right of what was already output,
-% using \cs{@@_act_output:n}, but for the \cs{@@_act_reverse} functions,
-% it should be done to the left.
-% \begin{macrocode}
-\cs_new:Npn \@@_act_output:n #1 #2 \@@_act_result:n #3
- { #2 \@@_act_result:n { #3 #1 } }
-\cs_new:Npn \@@_act_reverse_output:n #1 #2 \@@_act_result:n #3
- { #2 \@@_act_result:n { #1 #3 } }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\tl_reverse:n, \tl_reverse:o, \tl_reverse:V}
-% \begin{macro}[EXP]{\@@_reverse_normal:nN}
-% \begin{macro}[EXP]{\@@_reverse_group_preserve:nn}
-% \begin{macro}[EXP]{\@@_reverse_space:n}
-% The goal here is to reverse without losing spaces nor braces.
-% This is done using the general internal function \cs{@@_act:NNNnn}.
-% Spaces and \enquote{normal} tokens are output on the left of the current
-% output. Grouped tokens are output to the left but without any reversal
-% within the group. All of the internal functions here drop one argument:
-% this is needed by \cs{@@_act:NNNnn} when changing case (to record
-% which direction the change is in), but not when reversing the tokens.
-% \begin{macrocode}
-\cs_new:Npn \tl_reverse:n #1
- {
- \__kernel_exp_not:w \exp_after:wN
- {
- \exp:w
- \@@_act:NNNnn
- \@@_reverse_normal:nN
- \@@_reverse_group_preserve:nn
- \@@_reverse_space:n
- { }
- {#1}
- }
- }
-\cs_generate_variant:Nn \tl_reverse:n { o , V }
-\cs_new:Npn \@@_reverse_normal:nN #1#2
- { \@@_act_reverse_output:n {#2} }
-\cs_new:Npn \@@_reverse_group_preserve:nn #1#2
- { \@@_act_reverse_output:n { {#2} } }
-\cs_new:Npn \@@_reverse_space:n #1
- { \@@_act_reverse_output:n { ~ } }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\tl_reverse:N, \tl_reverse:c, \tl_greverse:N, \tl_greverse:c}
-% This reverses the list, leaving \cs{exp_stop_f:} in front,
-% which stops the \texttt{f}-expansion.
-% \begin{macrocode}
-\cs_new_protected:Npn \tl_reverse:N #1
- { \tl_set:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
-\cs_new_protected:Npn \tl_greverse:N #1
- { \tl_gset:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
-\cs_generate_variant:Nn \tl_reverse:N { c }
-\cs_generate_variant:Nn \tl_greverse:N { c }
-% \end{macrocode}
-% \end{macro}
-%
% \subsection{The first token from a token list}
%
% \begin{macro}{\tl_head:N, \tl_head:n, \tl_head:V, \tl_head:v, \tl_head:f}
% \begin{macro}{\@@_head_auxi:nw, \@@_head_auxii:n}
-% \begin{macro}{\tl_head:w}
+% \begin{macro}{\tl_head:w,\@@_tl_head:w}
% \begin{macro}{\tl_tail:N, \tl_tail:n, \tl_tail:V, \tl_tail:v, \tl_tail:f}
% Finding the head of a token list expandably always strips braces, which
% is fine as this is consistent with for example mapping to a list. The
@@ -2827,35 +2819,53 @@
% empty result. The result is returned within the \tn{unexpanded} primitive.
% The approach here is to use \cs{if_false:} to allow us to use |}| as
% the closing delimiter: this is the only safe choice, as any other token
-% would not be able to parse it's own code. Using a marker, we can see if
-% what we are grabbing is exactly the marker, or there is anything else to
-% deal with. Is there is, there is a loop. If not, tidy up and leave the
-% item in the output stream. More detail in
+% would not be able to parse it's own code. If the \tn{expanded} primitive
+% is available it is used to get a fast and safe code variant in which we
+% don't have to ensure that the left-most token is an internal to not break
+% in an |f|-type expansion. If \tn{expanded} isn't available, using a marker,
+% we can see if what we are grabbing is exactly the marker, or there is
+% anything else to deal with. If there is, there is a loop. If not, tidy up
+% and leave the item in the output stream. More detail in
% \url{http://tex.stackexchange.com/a/70168}.
% \begin{macrocode}
-\cs_new:Npn \tl_head:n #1
- {
- \__kernel_exp_not:w
- \if_false: { \fi: \@@_head_auxi:nw #1 { } \q_stop }
- }
-\cs_new:Npn \@@_head_auxi:nw #1#2 \q_stop
+\cs_if_exist:NTF \tex_expanded:D
{
- \exp_after:wN \@@_head_auxii:n \exp_after:wN {
- \if_false: } \fi: {#1}
+ \cs_new:Npn \tl_head:n #1
+ {
+ \__kernel_exp_not:w \tex_expanded:D
+ { { \if_false: { \fi: \@@_head_aux:n #1 { } } } }
+ }
+ \cs_new:Npn \@@_head_aux:n #1
+ {
+ \__kernel_exp_not:w {#1}
+ \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
+ }
}
-\cs_new:Npn \@@_head_auxii:n #1
{
- \exp_after:wN \if_meaning:w \exp_after:wN \q_nil
- \__kernel_tl_to_str:w \exp_after:wN { \use_none:n #1 } \q_nil
- \exp_after:wN \use_i:nn
- \else:
- \exp_after:wN \use_ii:nn
- \fi:
- {#1}
- { \if_false: { \fi: \@@_head_auxi:nw #1 } }
+ \cs_new:Npn \tl_head:n #1
+ {
+ \__kernel_exp_not:w
+ \if_false: { \fi: \@@_head_auxi:nw #1 { } \s_@@_stop }
+ }
+ \cs_new:Npn \@@_head_auxi:nw #1#2 \s_@@_stop
+ {
+ \exp_after:wN \@@_head_auxii:n \exp_after:wN {
+ \if_false: } \fi: {#1}
+ }
+ \exp_args:Nno \use:n
+ { \cs_new:Npn \@@_head_auxii:n #1 }
+ {
+ \@@_if_empty_if:o { \use_none:n #1 }
+ \exp_after:wN \use_ii:nnn
+ \fi:
+ \use_ii:nn
+ {#1}
+ { \if_false: { \fi: \@@_head_auxi:nw #1 } }
+ }
}
\cs_generate_variant:Nn \tl_head:n { V , v , f }
\cs_new:Npn \tl_head:w #1#2 \q_stop {#1}
+\cs_new:Npn \@@_tl_head:w #1#2 \s_@@_stop {#1}
\cs_new:Npn \tl_head:N { \exp_args:No \tl_head:n }
% \end{macrocode}
% To correctly leave the tail of a token list, it's important \emph{not} to
@@ -2873,9 +2883,9 @@
% While we could optimise the test here, this would leave some tokens
% \enquote{banned} in the input, which we do not have with this definition.
% \begin{macrocode}
-\cs_new:Npn \tl_tail:n #1
+\exp_args:Nno \use:n { \cs_new:Npn \tl_tail:n #1 }
{
- \__kernel_exp_not:w
+ \exp_after:wN \__kernel_exp_not:w
\tl_if_blank:nTF {#1}
{ { } }
{ \exp_after:wN { \use_none:n #1 } }
@@ -2892,6 +2902,9 @@
% \begin{macro}[pTF]{\tl_if_head_eq_charcode:nN}
% \begin{macro}[pTF]{\tl_if_head_eq_charcode:fN}
% \begin{macro}[pTF]{\tl_if_head_eq_catcode:nN}
+% \begin{macro}[pTF]{\tl_if_head_eq_catcode:oN}
+% \begin{macro}[EXP]{\@@_head_exp_not:w}
+% \begin{macro}[EXP]{\@@_if_head_eq_empty_arg:w}
% Accessing the first token of a token list is tricky in three cases:
% when it has category code $1$ (begin-group token), when it is an
% explicit space, with category code $10$ and character code $32$, or
@@ -2911,21 +2924,17 @@
% cases, the first token is a character, and since we only care about
% its character code, we can use \cs{str_head:n} to access it (this
% works even if it is a space character). An empty argument
-% results in \cs{tl_head:w} leaving two tokens: |?| which is taken in
-% the \cs{if_charcode:w} test, and \cs{use_none:nn}, which ensures
-% that \cs{prg_return_false:} is returned regardless of whether the
-% charcode test was \texttt{true} or \texttt{false}.
+% results in \cs{tl_head:w} leaving two token: |^| and
+% \cs{@@_if_head_eq_empty_arg:w} which will result in the \cs{if_charcode:w}
+% test being false and remove \cs{exp_not:N} and |#2|.
% \begin{macrocode}
\prg_new_conditional:Npnn \tl_if_head_eq_charcode:nN #1#2 { p , T , F , TF }
{
\if_charcode:w
- \exp_not:N #2
\tl_if_head_is_N_type:nTF { #1 ? }
- {
- \exp_after:wN \exp_not:N
- \tl_head:w #1 { ? \use_none:nn } \q_stop
- }
+ { \@@_head_exp_not:w #1 { ^ \@@_if_head_eq_empty_arg:w } \s_@@_stop }
{ \str_head:n {#1} }
+ \exp_not:N #2
\prg_return_true:
\else:
\prg_return_false:
@@ -2939,24 +2948,20 @@
% first token is a begin-group token or an explicit space token, and
% produce the relevant token, either \cs{c_group_begin_token} or
% \cs{c_space_token}. Again, for an empty argument, a hack is used,
-% removing \cs{prg_return_true:} and \cs{else:} with \cs{use_none:nn}
-% in case the catcode test with the (arbitrarily chosen) |?| is
-% \texttt{true}.
+% removing the token given by the user and leaving two tokens in the input
+% stream which will make the \cs{if_catcode:w} test return \texttt{false}.
% \begin{macrocode}
\prg_new_conditional:Npnn \tl_if_head_eq_catcode:nN #1 #2 { p , T , F , TF }
{
\if_catcode:w
- \exp_not:N #2
\tl_if_head_is_N_type:nTF { #1 ? }
- {
- \exp_after:wN \exp_not:N
- \tl_head:w #1 { ? \use_none:nn } \q_stop
- }
+ { \@@_head_exp_not:w #1 { ^ \@@_if_head_eq_empty_arg:w } \s_@@_stop }
{
\tl_if_head_is_group:nTF {#1}
- { \c_group_begin_token }
- { \c_space_token }
+ \c_group_begin_token
+ \c_space_token
}
+ \exp_not:N #2
\prg_return_true:
\else:
\prg_return_false:
@@ -2969,7 +2974,8 @@
% the normal case, use \cs{tl_head:w}, with no \cs{exp_not:N} this
% time, since \cs{if_meaning:w} causes no expansion. With an empty
% argument, the test is \texttt{true}, and \cs{use_none:nnn} removes
-% |#2| and the usual \cs{prg_return_true:} and \cs{else:}.
+% |#2| and \cs{prg_return_true:} and \cs{else:} (it is safe this way here as
+% in this case \cs{prg_new_conditional:Npnn} didn't optimize these two away).
% In the special cases, we know that the first token is a character,
% hence \cs{if_charcode:w} and \cs{if_catcode:w} together are enough.
% We combine them in some order, hopefully faster than the reverse.
@@ -2979,14 +2985,14 @@
\prg_new_conditional:Npnn \tl_if_head_eq_meaning:nN #1#2 { p , T , F , TF }
{
\tl_if_head_is_N_type:nTF { #1 ? }
- { \@@_if_head_eq_meaning_normal:nN }
- { \@@_if_head_eq_meaning_special:nN }
+ \@@_if_head_eq_meaning_normal:nN
+ \@@_if_head_eq_meaning_special:nN
{#1} #2
}
\cs_new:Npn \@@_if_head_eq_meaning_normal:nN #1 #2
{
\exp_after:wN \if_meaning:w
- \tl_head:w #1 { ?? \use_none:nnn } \q_stop #2
+ \@@_tl_head:w #1 { ?? \use_none:nnn } \s_@@_stop #2
\prg_return_true:
\else:
\prg_return_false:
@@ -2995,11 +3001,11 @@
\cs_new:Npn \@@_if_head_eq_meaning_special:nN #1 #2
{
\if_charcode:w \str_head:n {#1} \exp_not:N #2
- \exp_after:wN \use:n
+ \exp_after:wN \use_ii:nn
\else:
\prg_return_false:
- \exp_after:wN \use_none:n
\fi:
+ \use_none:n
{
\if_catcode:w \exp_not:N #2
\tl_if_head_is_group:nTF {#1}
@@ -3012,48 +3018,79 @@
}
}
% \end{macrocode}
+%
+% Both \cs{tl_if_head_eq_charcode:nN} and \cs{tl_if_head_eq_catcode:nN} will
+% need to get the first token of their argument and apply \cs{exp_not:N} to
+% it. \cs{@@_head_exp_not:w} does exactly that.
+% \begin{macrocode}
+\cs_new:Npn \@@_head_exp_not:w #1 #2 \s_@@_stop
+ { \exp_not:N #1 }
+% \end{macrocode}
+%
+% If the argument of \cs{tl_if_head_eq_charcode:nN} and
+% \cs{tl_if_head_eq_catcode:nN} was empty \cs{@@_if_head_eq_empty_arg:w} will
+% be left in the input stream. This macro has to remove \cs{exp_not:N} and
+% the following token from the input stream to make sure no unbalanced
+% if-construct is created and leave tokens there which make the two tests
+% return \texttt{false}.
+% \begin{macrocode}
+\cs_new:Npn \@@_if_head_eq_empty_arg:w \exp_not:N #1
+ { ? }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}[pTF]{\tl_if_head_is_N_type:n}
-% \begin{macro}[EXP]{\@@_if_head_is_N_type:w}
+% \begin{macro}[EXP]
+% {
+% \@@_if_head_is_N_type_auxi:w ,
+% \@@_if_head_is_N_type_auxii:nn ,
+% \@@_if_head_is_N_type_auxiii:n
+% }
% A token list can be empty, can start with an explicit space
% character (catcode 10 and charcode 32), can start with a begin-group
% token (catcode 1), or start with an \texttt{N}-type argument. In
-% the first two cases, the line involving \cs{@@_if_head_is_N_type:w}
-% produces~|^| (and otherwise nothing). In the third case
-% (begin-group token), the lines involving \cs{exp_after:wN} produce a
+% the first two cases, the line involving \cs{@@_if_head_is_N_type_auxi:w}
+% produces~|f| (and otherwise nothing). In the third case
+% (begin-group token), the lines involving \cs{token_to_str:N} produce a
% single closing brace. The category code test is thus true exactly
% in the fourth case, which is what we want. One cannot optimize by
-% moving one of the |*| to the beginning: if |#1| contains primitive
-% conditionals, all of its occurrences must be dealt with before the
-% \cs{if_catcode:w} tries to skip the \texttt{true} branch of the
+% moving one of the \cs{scan_stop:} to the beginning: if |#1| contains
+% primitive conditionals, all of its occurrences must be dealt with before
+% the \cs{if:w} tries to skip the \texttt{true} branch of the
% conditional.
% \begin{macrocode}
\prg_new_conditional:Npnn \tl_if_head_is_N_type:n #1 { p , T , F , TF }
{
- \if_catcode:w
- \if_false: { \fi: \@@_if_head_is_N_type:w ? #1 ~ }
- \exp_after:wN \use_none:n
- \exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } }
- * *
+ \if:w
+ \if_false: { \fi: \@@_if_head_is_N_type_auxi:w \prg_do_nothing: #1 ~ }
+ { \exp_after:wN { \token_to_str:N #1 } }
+ \scan_stop: \scan_stop:
\prg_return_true:
\else:
\prg_return_false:
\fi:
}
-\cs_new:Npn \@@_if_head_is_N_type:w #1 ~
+\exp_args:Nno \use:n { \cs_new:Npn \@@_if_head_is_N_type_auxi:w #1 ~ }
{
- \tl_if_empty:oTF { \use_none:n #1 } { ^ } { }
- \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
+ \tl_if_empty:oTF { #1 }
+ { f \exp_after:wN \use_none:nn }
+ { \exp_after:wN \@@_if_head_is_N_type_auxii:n }
+ \exp_after:wN { \if_false: } \fi:
}
+\cs_new:Npn \@@_if_head_is_N_type_auxii:n #1
+ { \exp_after:wN \use_none:n \exp_after:wN }
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}[EXP,pTF]{\tl_if_head_is_group:n}
+% \begin{macro}[EXP]{\@@_if_head_is_group_fi_false:w}
% Pass the first token of |#1| through \cs{token_to_str:N}, then check
% for the brace balance. The extra \texttt{?} caters for an empty
% argument. This could be made faster, but we need all brace tricks
@@ -3062,54 +3099,243 @@
% \begin{macrocode}
\prg_new_conditional:Npnn \tl_if_head_is_group:n #1 { p , T , F , TF }
{
- \if_catcode:w
+ \if:w
\exp_after:wN \use_none:n
\exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } }
- * *
- \prg_return_false:
- \else:
+ \scan_stop: \scan_stop:
+ \@@_if_head_is_group_fi_false:w
+ \fi:
+ \if_true:
\prg_return_true:
+ \else:
+ \prg_return_false:
\fi:
}
+\cs_new:Npn \@@_if_head_is_group_fi_false:w \fi: \if_true: { \fi: \if_false: }
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}[EXP,pTF]{\tl_if_head_is_space:n}
% \begin{macro}[EXP]{\@@_if_head_is_space:w}
% The auxiliary's argument is all that is before the first explicit
-% space in |?#1?~|. If that is a single~|?| the test yields
-% \texttt{true}. Otherwise, that is more than one token, and the test
-% yields \texttt{false}. The work is done within braces (with an
+% space in |\prg_do_nothing:#1?~|. If that is a single~|\prg_do_nothing:| the
+% test yields \texttt{true}. Otherwise, that is more than one token, and the
+% test yields \texttt{false}. The work is done within braces (with an
% |\if_false: { \fi: ... }| construction) both to hide potential
% alignment tab characters from \TeX{} in a table, and to allow for
-% removing what remains of the token list after its first space. The
-% \cs{exp:w} and \cs{exp_end:} ensure that the result of a
-% single step of expansion directly yields a balanced token list (no
-% trailing closing brace).
+% removing what remains of the token list after its first space. The use of
+% \cs{if:w} ensures that the result of a single step of expansion directly
+% yields a balanced token list (no trailing closing brace).
% \begin{macrocode}
\prg_new_conditional:Npnn \tl_if_head_is_space:n #1 { p , T , F , TF }
{
- \exp:w \if_false: { \fi:
- \@@_if_head_is_space:w ? #1 ? ~ }
+ \if:w
+ \if_false: { \fi: \@@_if_head_is_space:w \prg_do_nothing: #1 ? ~ }
+ \scan_stop: \scan_stop:
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
}
-\cs_new:Npn \@@_if_head_is_space:w #1 ~
+\exp_args:Nno \use:n { \cs_new:Npn \@@_if_head_is_space:w #1 ~ }
{
- \tl_if_empty:oTF { \use_none:n #1 }
- { \exp_after:wN \exp_end: \exp_after:wN \prg_return_true: }
- { \exp_after:wN \exp_end: \exp_after:wN \prg_return_false: }
+ \@@_if_empty_if:o {#1} \else: f \fi:
\exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi:
}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
+% \subsection{Token by token changes}
+%
+% \begin{variable}{\s_@@_act_stop}
+% The \cs[no-index]{@@_act_\ldots{}} functions may be applied to any token list.
+% Hence, we use a private quark, to allow any token, even quarks,
+% in the token list.
+% Only \cs{s_@@_act_stop} may not appear in the token lists manipulated by
+% \cs{@@_act:NNNn} functions.
+% \begin{macrocode}
+\scan_new:N \s_@@_act_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_act:NNNn}
+% \begin{macro}[EXP]{\@@_act_output:n, \@@_act_reverse_output:n}
+% \begin{macro}[EXP]{\@@_act_loop:w}
+% \begin{macro}[EXP]{\@@_act_normal:NwNNN}
+% \begin{macro}[EXP]{\@@_act_group:nwNNN}
+% \begin{macro}[EXP]{\@@_act_space:wwNNN}
+% \begin{macro}[EXP]{\@@_act_end:w}
+% \begin{macro}[EXP]
+% {
+% \@@_act_if_head_is_space:nTF,
+% \@@_act_if_head_is_space:w,
+% \@@_act_if_head_is_space_true:w
+% }
+% \begin{macro}[EXP]{\@@_use_none_delimit_by_q_act_stop:w}
+% To help control the expansion, \cs{@@_act:NNNn} should always
+% be preceeded by \cs{exp:w} and ends by producing \cs{exp_end:}
+% once the result has been obtained. This way no internal token of it can be
+% accidentally end up in the input stream.
+% Because \cs{s_@@_act_stop} can't appear without braces around it in the
+% argument~|#1| of \cs{@@_act_loop:w}, we can use this marker to set up a fast
+% test for leading spaces.
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_tmp:w #1
+ {
+ \cs_new:Npn \@@_act_if_head_is_space:nTF ##1
+ {
+ \@@_act_if_head_is_space:w
+ \s_@@_act_stop ##1 \s_@@_act_stop \@@_act_if_head_is_space_true:w
+ \s_@@_act_stop #1 \s_@@_act_stop \use_ii:nn
+ }
+ \cs_new:Npn \@@_act_if_head_is_space:w
+ ##1 \s_@@_act_stop #1 ##2 \s_@@_act_stop
+ {}
+ \cs_new:Npn \@@_act_if_head_is_space_true:w
+ \s_@@_act_stop #1 \s_@@_act_stop \use_ii:nn ##1 ##2
+ {##1}
+ }
+\@@_tmp:w { ~ }
+% \end{macrocode}
+% (We expand the definition \cs{@@_act_if_head_is_space:nTF} when
+% setting up \cs{@@_act_loop:w}, so we can then undefine the auxiliary.)
+% In the loop, we check how the token list begins and act
+% accordingly. In the \enquote{group} case, we may have
+% reached \cs{s_@@_act_stop}, the end of the list. Then
+% leave \cs{exp_end:} and the result in the input stream,
+% to terminate the expansion of \cs{exp:w}.
+% Otherwise, apply the relevant function to the
+% \enquote{arguments}, |#3|
+% and to the head of the token list. Then repeat the loop.
+% The scheme is the same if the token list starts with an |N|-type
+% or with a space, making sure that
+% \cs{@@_act_space:wwNNN} gobbles the space.
+% \begin{macrocode}
+\exp_args:Nnx \use:n { \cs_new:Npn \@@_act_loop:w #1 \s_@@_act_stop }
+ {
+ \exp_not:o { \@@_act_if_head_is_space:nTF {#1} }
+ \exp_not:N \@@_act_space:wwNNN
+ {
+ \exp_not:o { \tl_if_head_is_group:nTF {#1} }
+ \exp_not:N \@@_act_group:nwNNN
+ \exp_not:N \@@_act_normal:NwNNN
+ }
+ \exp_not:n {#1} \s_@@_act_stop
+ }
+\cs_undefine:N \@@_act_if_head_is_space:nTF
+\cs_new:Npn \@@_act_normal:NwNNN #1 #2 \s_@@_act_stop #3
+ {
+ #3 #1
+ \@@_act_loop:w #2 \s_@@_act_stop
+ #3
+ }
+\cs_new:Npn \@@_use_none_delimit_by_s_act_stop:w #1 \s_@@_act_stop { }
+\cs_new:Npn \@@_act_end:wn #1 \@@_act_result:n #2
+ { \group_align_safe_end: \exp_end: #2 }
+\cs_new:Npn \@@_act_group:nwNNN #1 #2 \s_@@_act_stop #3#4#5
+ {
+ \@@_use_none_delimit_by_s_act_stop:w #1 \@@_act_end:wn \s_@@_act_stop
+ #5 {#1}
+ \@@_act_loop:w #2 \s_@@_act_stop
+ #3 #4 #5
+ }
+\exp_last_unbraced:NNo
+ \cs_new:Npn \@@_act_space:wwNNN \c_space_tl #1 \s_@@_act_stop #2#3
+ {
+ #3
+ \@@_act_loop:w #1 \s_@@_act_stop
+ #2 #3
+ }
+% \end{macrocode}
+% \cs{@@_act:NNNn} loops over tokens, groups, and spaces in |#4|.
+% |{\s_@@_act_stop}| serves as the end of token list marker, the |?| after it
+% avoids losing outer braces. The result is stored as an argument for the
+% dummy function \cs{@@_act_result:n}.
+% \begin{macrocode}
+\cs_new:Npn \@@_act:NNNn #1#2#3#4
+ {
+ \group_align_safe_begin:
+ \@@_act_loop:w #4 { \s_@@_act_stop } ? \s_@@_act_stop
+ #1 #3 #2
+ \@@_act_result:n { }
+ }
+% \end{macrocode}
+% Typically, the output is done to the right of what was already output,
+% using \cs{@@_act_output:n}, but for the \cs{@@_act_reverse} functions,
+% it should be done to the left.
+% \begin{macrocode}
+\cs_new:Npn \@@_act_output:n #1 #2 \@@_act_result:n #3
+ { #2 \@@_act_result:n { #3 #1 } }
+\cs_new:Npn \@@_act_reverse_output:n #1 #2 \@@_act_result:n #3
+ { #2 \@@_act_result:n { #1 #3 } }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\tl_reverse:n, \tl_reverse:o, \tl_reverse:V}
+% \begin{macro}[EXP]{\@@_reverse_normal:nN}
+% \begin{macro}[EXP]{\@@_reverse_group_preserve:nn}
+% \begin{macro}[EXP]{\@@_reverse_space:n}
+% The goal here is to reverse without losing spaces nor braces.
+% This is done using the general internal function \cs{@@_act:NNNn}.
+% Spaces and \enquote{normal} tokens are output on the left of the current
+% output. Grouped tokens are output to the left but without any reversal
+% within the group.
+% \begin{macrocode}
+\cs_new:Npn \tl_reverse:n #1
+ {
+ \__kernel_exp_not:w \exp_after:wN
+ {
+ \exp:w
+ \@@_act:NNNn
+ \@@_reverse_normal:N
+ \@@_reverse_group_preserve:n
+ \@@_reverse_space:
+ {#1}
+ }
+ }
+\cs_generate_variant:Nn \tl_reverse:n { o , V }
+\cs_new:Npn \@@_reverse_normal:N
+ { \@@_act_reverse_output:n }
+\cs_new:Npn \@@_reverse_group_preserve:n #1
+ { \@@_act_reverse_output:n { {#1} } }
+\cs_new:Npn \@@_reverse_space:
+ { \@@_act_reverse_output:n { ~ } }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\tl_reverse:N, \tl_reverse:c, \tl_greverse:N, \tl_greverse:c}
+% This reverses the list, leaving \cs{exp_stop_f:} in front,
+% which stops the \texttt{f}-expansion.
+% \begin{macrocode}
+\cs_new_protected:Npn \tl_reverse:N #1
+ { \__kernel_tl_set:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
+\cs_new_protected:Npn \tl_greverse:N #1
+ { \__kernel_tl_gset:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } }
+\cs_generate_variant:Nn \tl_reverse:N { c }
+\cs_generate_variant:Nn \tl_greverse:N { c }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Using a single item}
%
% \begin{macro}{\tl_item:nn, \tl_item:Nn, \tl_item:cn}
% \begin{macro}{\@@_item_aux:nn, \@@_item:nn}
% The idea here is to find the offset of the item from the left, then use
% a loop to grab the correct item. If the resulting offset is too large,
-% then \cs{quark_if_recursion_tail_stop:n} terminates the loop, and returns
+% then \cs{@@_if_recursion_tail_break:nN} terminates the loop, and returns
% nothing at all.
% \begin{macrocode}
\cs_new:Npn \tl_item:nn #1#2
@@ -3117,7 +3343,7 @@
\exp_args:Nf \@@_item:nn
{ \exp_args:Nf \@@_item_aux:nn { \int_eval:n {#2} } {#1} }
#1
- \q_recursion_tail
+ \q_@@_recursion_tail
\prg_break_point:
}
\cs_new:Npn \@@_item_aux:nn #1#2
@@ -3128,7 +3354,7 @@
}
\cs_new:Npn \@@_item:nn #1#2
{
- \quark_if_recursion_tail_break:nN {#2} \prg_break:
+ \@@_if_recursion_tail_break:nN {#2} \prg_break:
\int_compare:nNnTF {#1} = 1
{ \prg_break:n { \exp_not:n {#2} } }
{ \exp_args:Nf \@@_item:nn { \int_eval:n { #1 - 1 } } }
@@ -3304,7 +3530,10 @@
\cs_new_protected:Npn \@@_show:NN #1#2
{
\__kernel_chk_defined:NT #2
- { \exp_args:Nx #1 { \token_to_str:N #2 = \exp_not:o {#2} } }
+ {
+ \exp_args:Ne #1
+ { \token_to_str:N #2 = \__kernel_exp_not:w \exp_after:wN {#2} }
+ }
}
% \end{macrocode}
% \end{macro}
@@ -3331,7 +3560,7 @@
{ \iow_wrap:nnnN { >~ \tl_to_str:n {#1} . } { } { } \@@_show:n }
\cs_new_protected:Npn \@@_show:n #1
{
- \tl_set:Nf \l_@@_internal_a_tl { \@@_show:w #1 \q_stop }
+ \tl_set:Nf \l_@@_internal_a_tl { \@@_show:w #1 \s_@@_stop }
\__kernel_iow_with:Nnn \tex_newlinechar:D { 10 }
{
\__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
@@ -3341,7 +3570,7 @@
}
}
}
-\cs_new:Npn \@@_show:w #1 > #2 . \q_stop {#2}
+\cs_new:Npn \@@_show:w #1 > #2 . \s_@@_stop {#2}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -3355,6 +3584,18 @@
% \end{macrocode}
% \end{macro}
%
+% \subsection{Internal scan marks}
+%
+% \begin{variable}{\s_@@_nil,\s_@@_mark,\s_@@_stop}
+% Internal scan marks. These are defined here at the end because the
+% code for \cs{scan_new:N} depends on some \pkg{l3tl} functions.
+% \begin{macrocode}
+\scan_new:N \s_@@_nil
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \subsection{Scratch token lists}
%
% \begin{variable}{\g_tmpa_tl, \g_tmpb_tl}
@@ -3378,8 +3619,14 @@
% \end{macrocode}
% \end{variable}
%
+% We finally clean up a temporary control sequence that we have used at
+% various points to set up some definitions.
+% \begin{macrocode}
+\cs_undefine:N \@@_tmp:w
+% \end{macrocode}
+%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
index 2c7dac38985..31d4d7fcde9 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
@@ -2,7 +2,7 @@
%
%% File: l3token.dtx
%
-% Copyright (C) 2005-2020 The LaTeX3 Project
+% Copyright (C) 2005-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -414,7 +414,7 @@
% verbatim-like material at the document level as they are not of categories
% \meta{letter} (catcode~$11$) or \meta{other} (catcode~$12$). Each entry in
% the sequence consists of a single escaped token, for example |\\| for the
-% backslash or |\{| for an opening brace.^^A \}
+% backslash or |\{| for an opening brace. ^^A \}
% Escaped tokens should be added to the sequence when they are defined for
% general document use.
% \end{variable}
@@ -692,6 +692,14 @@
% Tests if the \meta{token} is defined to be a mathchardef.
% \end{function}
%
+% \begin{function}[EXP,pTF, added=2020-10-27]{\token_if_font_selection:N}
+% \begin{syntax}
+% \cs{token_if_font_selection_p:N} \meta{token} \\
+% \cs{token_if_font_selection:NTF} \meta{token} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{token} is defined to be a font selection command.
+% \end{function}
+%
% \begin{function}[EXP,pTF, updated=2012-01-20]{\token_if_dim_register:N}
% \begin{syntax}
% \cs{token_if_dim_register_p:N} \meta{token} \\
@@ -737,22 +745,51 @@
% (not used by \LaTeX3).
% \end{function}
%
-% \begin{function}[updated = 2011-05-23, EXP,pTF]{\token_if_primitive:N}
+% \begin{function}[updated = 2020-09-11, EXP,pTF]{\token_if_primitive:N}
% \begin{syntax}
% \cs{token_if_primitive_p:N} \meta{token} \\
% \cs{token_if_primitive:NTF} \meta{token} \Arg{true code} \Arg{false code}
% \end{syntax}
-% Tests if the \meta{token} is an engine primitive.
+% Tests if the \meta{token} is an engine primitive. In \LuaTeX{}
+% this includes primitive-like commands defined using |{token.set_lua}|.
+% \end{function}
+%
+% \begin{function}[added = 2020-12-03, EXP, noTF]
+% {\token_case_catcode:Nn, \token_case_charcode:Nn, \token_case_meaning:Nn}
+% \begin{syntax}
+% \cs{token_case_meaning:NnTF} \meta{test token} \\
+% ~~"{" \\
+% ~~~~\meta{token case_1} \Arg{code case_1} \\
+% ~~~~\meta{token case_2} \Arg{code case_2} \\
+% ~~~~\ldots \\
+% ~~~~\meta{token case_n} \Arg{code case_n} \\
+% ~~"}" \\
+% ~~\Arg{true code}
+% ~~\Arg{false code}
+% \end{syntax}
+% This function compares the \meta{test token} in turn with each of
+% the \meta{token cases}. If the two are equal (as described for
+% \cs{token_if_eq_catcode:NNTF}, \cs{token_if_eq_charcode:NNTF} and
+% \cs{token_if_eq_meaning:NNTF}, respectively) then the associated
+% \meta{code} is left in the input stream and other cases are
+% discarded. If any of the cases are matched, the \meta{true code} is
+% also inserted into the input stream (after the code for the
+% appropriate case), while if none match then the \meta{false code} is
+% inserted. The functions \cs{token_case_catcode:Nn},
+% \cs{token_case_charcode:Nn}, and \cs{token_case_meaning:Nn}, which
+% do nothing if there is no match, are also available.
% \end{function}
%
% \section{Peeking ahead at the next token}
%
% There is often a need to look ahead at the next token in the input
% stream while leaving it in place. This is handled using the
-% \enquote{peek} functions. The generic \cs{peek_after:Nw} is
-% provided along with a family of predefined tests for common cases.
-% As peeking ahead does \emph{not} skip spaces the predefined tests
-% include both a space-respecting and space-skipping version.
+% \enquote{peek} functions. The generic \cs{peek_after:Nw} is provided
+% along with a family of predefined tests for common cases. As peeking
+% ahead does \emph{not} skip spaces the predefined tests include both a
+% space-respecting and space-skipping version. In addition, using
+% \cs{peek_analysis_map_inline:n}, one can map through the following
+% tokens in the input stream and repeatedly perform some tests.
%
% \begin{function}{\peek_after:Nw}
% \begin{syntax}
@@ -971,6 +1008,128 @@
% (as appropriate to the result of the test).
% \end{function}
%
+% \begin{function}[added = 2020-12-03]{\peek_analysis_map_inline:n}
+% \begin{syntax}
+% \cs{peek_analysis_map_inline:n} \Arg{inline function}
+% \end{syntax}
+% Repeatedly removes one \meta{token} from the input stream and
+% applies the \meta{inline function} to it, until
+% \cs{peek_analysis_map_break:} is called. The \meta{inline function}
+% receives three arguments for each \meta{token} in the input stream:
+% \begin{itemize}
+% \item \meta{tokens}, which both \texttt{o}-expand and
+% \texttt{x}-expand to the \meta{token}. The detailed form of
+% \meta{tokens} may change in later releases.
+% \item \meta{char code}, a decimal representation of the character
+% code of the \meta{token}, $-1$ if it is a control sequence.
+% \item \meta{catcode}, a capital hexadecimal digit which denotes the
+% category code of the \meta{token} (0:~control sequence,
+% 1:~begin-group, 2:~end-group, 3:~math shift, 4:~alignment tab,
+% 6:~parameter, 7:~superscript, 8:~subscript, A:~space, B:~letter,
+% C:~other, D:~active). This can be converted to an integer by
+% writing |"|\meta{catcode}.
+% \end{itemize}
+% These arguments are the same as for \cs{tl_analysis_map_inline:nn}
+% defined in \pkg{l3tl-analysis}. The \meta{char code} and
+% \meta{catcode} do not take the meaning of a control sequence or
+% active character into account: for instance, upon encountering the
+% token \cs{c_group_begin_token} in the input stream,
+% \cs{peek_analysis_map_inline:n} calls the \meta{inline function}
+% with |#1| being \cs{exp_not:n} |{| \cs{c_group_begin_token} |}|
+% (with the current implementation),
+% |#2|~being~$-1$, and
+% |#3|~being~$0$, as for any other control sequence. In contrast,
+% upon encountering an explicit begin-group token~|{|, % ^^A |}|
+% the \meta{inline function} is called with arguments
+% \cs{exp_after:wN} |{| \cs{if_false:} |}| \cs{fi:}, $123$ and~$1$.
+%
+% The mapping is done at the current group level, \emph{i.e.}~any
+% local assignments made by the \meta{inline function} remain in
+% effect after the loop. Within the code, \cs{l_peek_token} is set
+% equal (as a token, not a token list) to the token under
+% consideration.
+% \end{function}
+%
+% \begin{function}[added = 2020-12-03]
+% {\peek_analysis_map_break:, \peek_analysis_map_break:n}
+% \begin{syntax}
+% \cs{peek_analysis_map_inline:n}
+% |{| \dots{} \cs{peek_analysis_map_break:n} \Arg{code} |}|
+% \end{syntax}
+% Stops the \cs{peek_analysis_map_inline:n} loop from seeking more
+% tokens, and inserts \meta{code} in the input stream (empty for
+% \cs{peek_analysis_map_break:}).
+% \end{function}
+%
+% \begin{function}[added = 2020-12-03, TF]{\peek_regex:n, \peek_regex:N}
+% \begin{syntax}
+% \cs{peek_regex:nTF} \Arg{regex} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{tokens} that follow in the input stream match the
+% \meta{regular expression}. Any \meta{tokens} that have been read
+% are left in the input stream after the \meta{true code} or
+% \meta{false code} (as appropriate to the result of the test). See
+% \pkg{l3regex} for documentation of the syntax of regular
+% expressions. The \meta{regular expression} is implicitly anchored
+% at the start, so for instance \cs{peek_regex:nTF}~|{|~|a|~|}| is
+% essentially equivalent to \cs{peek_charcode:NTF}~|a|.
+% \begin{texnote}
+% Implicit character tokens are correctly considered by
+% \cs{peek_regex:nTF} as control sequences, while functions that
+% inspect individual tokens (for instance \cs{peek_charcode:NTF})
+% only take into account their meaning.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}[added = 2020-12-03, TF]
+% {\peek_regex_remove_once:n, \peek_regex_remove_once:N}
+% \begin{syntax}
+% \cs{peek_regex_remove_once:nTF} \Arg{regex} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{tokens} that follow in the input stream match the
+% \meta{regex}. If the test is true, the \meta{tokens} are removed
+% from the input stream and the \meta{true code} is inserted, while if
+% the test is false, the \meta{false code} is inserted followed by the
+% \meta{tokens} that were originally in the input stream.
+% See \pkg{l3regex} for documentation of the syntax of
+% regular expressions. The \meta{regular expression} is implicitly
+% anchored at the start, so for instance
+% \cs{peek_regex_remove_once:nTF}~|{|~|a|~|}| is essentially equivalent to
+% \cs{peek_charcode_remove:NTF}~|a|.
+% \begin{texnote}
+% Implicit character tokens are correctly considered by
+% \cs{peek_regex_remove_once:nTF} as control sequences, while functions
+% that inspect individual tokens (for instance
+% \cs{peek_charcode:NTF}) only take into account their meaning.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}[added = 2020-12-03, noTF]
+% {\peek_regex_replace_once:nn, \peek_regex_replace_once:Nn}
+% \begin{syntax}
+% \cs{peek_regex_replace_once:nnTF} \Arg{regex} \Arg{replacement} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% If the \meta{tokens} that follow in the input stream match the
+% \meta{regex}, replaces them according to the \meta{replacement} as
+% for \cs{regex_replace_once:nnN}, and leaves the result in the input
+% stream, after the \meta{true code}. Otherwise, leaves \meta{false
+% code} followed by the \meta{tokens} that were originally in the
+% input stream, with no modifications. See \pkg{l3regex} for
+% documentation of the syntax of regular expressions and of the
+% \meta{replacement}: for instance |\0| in the \meta{replacement} is
+% replaced by the tokens that were matched in the input stream. The
+% \meta{regular expression} is implicitly anchored at the start. In
+% contrast to \cs{regex_replace_once:nnN}, no error arises if the
+% \meta{replacement} leads to an unbalanced token list: the tokens are
+% inserted into the input stream without issue.
+% \begin{texnote}
+% Implicit character tokens are correctly considered by
+% \cs{peek_regex_replace_once:nnTF} as control sequences, while
+% functions that inspect individual tokens (for instance
+% \cs{peek_charcode:NTF}) only take into account their meaning.
+% \end{texnote}
+% \end{function}
+%
% \section{Description of all possible tokens}
% \label{sec:l3token:all-tokens}
%
@@ -992,11 +1151,7 @@
% other engines) and category code~$13$.
% \item A character token, characterized by its character code and
% category code (one of $1$, $2$, $3$, $4$, $6$, $7$, $8$, $10$,
-% $11$ or~$12$ whose meaning is described below).\footnote{In
-% \LuaTeX{}, there is also the case of \enquote{bytes}, which behave as
-% character tokens of category code $12$~(other) and character code
-% between $1114112$ and~$1114366$. They are used to output
-% individual bytes to files, rather than UTF-8.}
+% $11$ or~$12$ whose meaning is described below).
% \end{itemize}
% There are also a few internal tokens. The following list may be
% incomplete in some engines.
@@ -1017,6 +1172,19 @@
% \item Tricky programming might access a frozen |\endwrite|.
% \item Some frozen tokens can only be accessed in interactive
% sessions: |\cr|, |\right|, |\endgroup|, |\fi|, |\inaccessible|.
+% \item In \LuaTeX{}, there is also the strange case of \enquote{bytes}
+% |^^^^^^1100|$x$$y$ where $x,y$ are any two lowercase hexadecimal
+% digits, so that the hexadecimal number ranges from
+% $"\text{110000}=1114112$ to~$"\text{1100ff}=1114367$. These are
+% used to output individual bytes to files, rather than UTF-8. For
+% the purposes of token comparisons they behave like non-expandable
+% primitive control sequences (\emph{not characters}) whose
+% \tn{meaning} is \verb*|the character | followed by the given byte.
+% If this byte is in the range |80|--|ff| this gives an ``invalid
+% utf-8 sequence'' error: applying \cs{token_to_str:N} or
+% \cs{token_to_meaning:N} to these tokens is unsafe. Unfortunately,
+% they don't seem to be detectable safely by any means except perhaps
+% Lua code.
% \end{itemize}
%
% The meaning of a (non-active) character token is fixed by its category
@@ -1028,7 +1196,7 @@
% \begin{itemize}
% \item[1] begin-group character (|group_begin|, often |{|),
% \item[2] end-group character (|group_end|, often |}|),
-% \item[3] math shift character (|math_toggle|, often |$|),
+% \item[3] math shift character (|math_toggle|, often |$|), %^^A $
% \item[4] alignment tab character (|alignment|, often |&|),
% \item[6] macro parameter character (|parameter|, often |#|),
% \item[7] superscript character (|math_superscript|, often |^|),
@@ -1058,18 +1226,16 @@
% \item a font selection command,
% \item undefined.
% \end{itemize}
-% Macros be \tn{protected} or not, \tn{long} or not (the opposite of
+% Macros can be \tn{protected} or not, \tn{long} or not (the opposite of
% what \LaTeX3 calls |nopar|), and \tn{outer} or not (unused in
% \LaTeX3). Their \tn{meaning} takes the form
% \begin{quote}
-% \meta{properties} |macro:|\meta{parameters}|->|\meta{replacement}
+% \meta{prefix} |macro:|\meta{argument}|->|\meta{replacement}
% \end{quote}
-% where \meta{properties} is among \tn{protected}\tn{long}\tn{outer},
-% \meta{parameters} describes parameters that the macro expects, such as
+% where \meta{prefix} is among \tn{protected}\tn{long}\tn{outer},
+% \meta{argument} describes parameters that the macro expects, such as
% |#1#2#3|, and \meta{replacement} describes how the parameters are
-% manipulated, such as~|#2/#1/#3|.
-%
-% ^^A todo Bruno: discuss here some other subtleties of space tokens? when looking for numbers, when looking for equal signs in let, in expressions, etc.
+% manipulated, such as~|\int_eval:n{#2+#1*#3}|.
%
% Now is perhaps a good time to mention some subtleties relating to
% tokens with category code $10$ (space). Any input character with this
@@ -1087,6 +1253,13 @@
% single tokens \enquote{N-type}, as they are suitable to be used as an
% argument for a function with the signature~\texttt{:N}.
%
+% When a macro takes a delimited argument \TeX{} scans ahead until
+% finding the delimiter (outside any pairs of begin-group/end-group
+% explicit characters), and the resulting list of tokens (with outer
+% braces removed) becomes the argument. Note that explicit space
+% characters at the start of the argument are \emph{not} ignored in this
+% case (and they prevent brace-stripping).
+%
% \end{documentation}
%
% \begin{implementation}
@@ -1094,13 +1267,40 @@
% \section{\pkg{l3token} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*tex>
% \end{macrocode}
%
% \begin{macrocode}
%<@@=char>
% \end{macrocode}
%
+% \subsection{Internal auxiliaries}
+%
+% \begin{variable}{\s_@@_stop}
+% Internal scan mark.
+% \begin{macrocode}
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_no_value}
+% Internal recursion quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_no_value
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_no_value:N}
+% Functions to query recursion quarks.
+% \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_no_value:N { TF }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Manipulating and interrogating character tokens}
%
% \begin{macro}{\char_set_catcode:nn}
@@ -1411,45 +1611,32 @@
% auxiliaries reflects that.
% \begin{macrocode}
\group_begin:
-%<*package>
\char_set_catcode_active:N \^^L
\cs_set:Npn ^^L { }
-%</package>
\char_set_catcode_other:n { 0 }
\if_int_odd:w 0
\sys_if_engine_luatex:T { 1 }
\sys_if_engine_xetex:T { 1 } \exp_stop_f:
- \sys_if_engine_luatex:TF
- {
- \cs_new:Npn \@@_generate_aux:nnw #1#2#3 \exp_end:
- {
- #3
- \exp_after:wN \exp_after:wN \exp_after:wN \exp_end:
- \lua_now:e { l3kernel.charcat(#1, #2) }
- }
- }
- {
- \cs_new:Npn \@@_generate_aux:nnw #1#2#3 \exp_end:
- {
- #3
- \exp_after:wN \exp_end:
- \tex_Ucharcat:D #1 \exp_stop_f: #2 \exp_stop_f:
- }
- \cs_if_exist:NF \tex_expanded:D
- {
- \cs_new_eq:NN \@@_generate_auxii:nnw \@@_generate_aux:nnw
- \cs_gset:Npn \@@_generate_aux:nnw #1#2#3 \exp_end:
- {
- #3
- \if_int_compare:w #2 = 13 \exp_stop_f:
- \__kernel_msg_expandable_error:nn { kernel } { char-active }
- \else:
- \@@_generate_auxii:nnw {#1} {#2}
- \fi:
- \exp_end:
- }
- }
- }
+ \cs_new:Npn \@@_generate_aux:nnw #1#2#3 \exp_end:
+ {
+ #3
+ \exp_after:wN \exp_end:
+ \tex_Ucharcat:D #1 \exp_stop_f: #2 \exp_stop_f:
+ }
+ \cs_if_exist:NF \tex_expanded:D
+ {
+ \cs_new_eq:NN \@@_generate_auxii:nnw \@@_generate_aux:nnw
+ \cs_gset:Npn \@@_generate_aux:nnw #1#2#3 \exp_end:
+ {
+ #3
+ \if_int_compare:w #2 = 13 \exp_stop_f:
+ \__kernel_msg_expandable_error:nn { kernel } { char-active }
+ \else:
+ \@@_generate_auxii:nnw {#1} {#2}
+ \fi:
+ \exp_end:
+ }
+ }
\else:
% \end{macrocode}
% For engines where \tn{Ucharcat} isn't available or emulated, we have
@@ -1467,7 +1654,7 @@
\tl_put_right:Nn \l_@@_tmp_tl { ^^@ \if_false: } }
\char_set_catcode_group_end:n { 0 }
\tl_put_right:Nn \l_@@_tmp_tl { { \fi: \exp_not:N \or: ^^@ } % }
- \tl_set:Nx \l_@@_tmp_tl { \l_@@_tmp_tl }
+ \__kernel_tl_set:Nx \l_@@_tmp_tl { \l_@@_tmp_tl }
\char_set_catcode_math_toggle:n { 0 }
\tl_put_right:Nn \l_@@_tmp_tl { \or: ^^@ }
\char_set_catcode_alignment:n { 0 }
@@ -1497,8 +1684,8 @@
% lists, one for each character code, using \tn{tex_lowercase:D} to
% convert |^^@| in each case. The \texttt{x}-type expansion ensures
% that \tn{tex_lowercase:D} receives the contents of the token list.
-% In package mode, |^^L| is awkward hence this is done in three parts.
-% Notice that at this stage |^^@| is active.
+% |^^L| is awkward hence this is done in three parts: up to |^^L|,
+% |^^L| itslef and above |^L|. Notice that at this stage |^^@| is active.
% \begin{macrocode}
\cs_set_protected:Npn \@@_tmp:n #1
{
@@ -1511,17 +1698,12 @@
{ \exp_not:o \l_@@_tmp_tl }
}
}
-%<*package>
\int_step_function:nnN { 0 } { 11 } \@@_tmp:n
\group_begin:
\tl_replace_once:Nnn \l_@@_tmp_tl { ^^@ } { \ERROR }
\@@_tmp:n { 12 }
\group_end:
\int_step_function:nnN { 13 } { 255 } \@@_tmp:n
-%</package>
-%<*initex>
- \int_step_function:nnN { 0 } { 255 } \@@_tmp:n
-%</initex>
% \end{macrocode}
% As \TeX{} is very unhappy if it finds an alignment character inside
% a primitive \tn{halign} even when skipping false branches, some
@@ -1667,12 +1849,12 @@
\exp_after:wN \exp_after:wN \exp_after:wN \@@_to_nfd:Nw
\exp_after:wN \exp_after:wN \exp_after:wN #1
\cs:w c_@@_nfd_ \token_to_str:N #1 _ tl \cs_end:
- \q_stop
+ \s_@@_stop
}
{ \exp_not:n {#1} }
}
\cs_set_eq:NN \@@_to_nfd:n \char_to_nfd:N
-\cs_new:Npn \@@_to_nfd:Nw #1#2#3 \q_stop
+\cs_new:Npn \@@_to_nfd:Nw #1#2#3 \s_@@_stop
{
\exp_args:Ne \@@_to_nfd:n
{ \char_generate:nn { `#2 } { \@@_change_case_catcode:N #1 } }
@@ -1744,13 +1926,13 @@
{ \char_generate:nn {#1} { \@@_change_case_catcode:N #2 } }
}
\cs_new:Npn \@@_change_case_multi:nN #1#2
- { \@@_change_case_multi:NNNNw #2 #1 \q_no_value \q_no_value \q_stop }
+ { \@@_change_case_multi:NNNNw #2 #1 \q_@@_no_value \q_@@_no_value \s_@@_stop }
\cs_generate_variant:Nn \@@_change_case_multi:nN { v }
-\cs_new:Npn \@@_change_case_multi:NNNNw #1#2#3#4#5 \q_stop
+\cs_new:Npn \@@_change_case_multi:NNNNw #1#2#3#4#5 \s_@@_stop
{
- \quark_if_no_value:NTF #4
+ \@@_quark_if_no_value:NTF #4
{
- \quark_if_no_value:NTF #3
+ \@@_quark_if_no_value:NTF #3
{ \@@_change_case:NN #1 #2 }
{ \@@_change_case:NNN #1 #2#3 }
}
@@ -1865,6 +2047,14 @@
%<@@=token>
% \end{macrocode}
%
+% \begin{variable}{\s_@@_mark, \s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
% \begin{macro}{\token_to_meaning:N, \token_to_meaning:c}
% \begin{macro}{\token_to_str:N, \token_to_str:c}
% These are all defined in \pkg{l3basics}, as they are needed
@@ -2136,10 +2326,10 @@
{
\exp_not:N \exp_after:wN \exp_not:N \@@_if_macro_p:w
\exp_not:N \token_to_meaning:N ##1 \tl_to_str:n { ma : }
- \exp_not:N \q_stop
+ \s_@@_stop
}
\cs_new:Npn \exp_not:N \@@_if_macro_p:w
- ##1 \tl_to_str:n { ma } ##2 \c_colon_str ##3 \exp_not:N \q_stop
+ ##1 \tl_to_str:n { ma } ##2 \c_colon_str ##3 \s_@@_stop
}
{
\str_if_eq:nnTF { #2 } { cro }
@@ -2191,6 +2381,7 @@
% \@@_delimit_by_char":w,
% \@@_delimit_by_count:w,
% \@@_delimit_by_dimen:w,
+% \@@_delimit_by_ font:w,
% \@@_delimit_by_macro:w,
% \@@_delimit_by_muskip:w,
% \@@_delimit_by_skip:w,
@@ -2200,8 +2391,11 @@
% conditionals which detect whether the \tn{meaning} of their
% argument begins with a particular string. Each auxiliary takes an
% argument delimited by a string, a second one delimited by
-% \cs{q_stop}, and returns the first one and its delimiter.
+% \cs{s_@@_stop}, and returns the first one and its delimiter.
% This result is eventually compared to another string.
+% Note that the ``font'' auxiliary is delimited by a space followed by
+% ``\texttt{font}''. This avoids an unnecessary check for the
+% \tn{font} primitive below.
% \begin{macrocode}
\group_begin:
\cs_set_protected:Npn \@@_tmp:w #1
@@ -2209,13 +2403,14 @@
\use:x
{
\cs_new:Npn \exp_not:c { @@_delimit_by_ #1 :w }
- ####1 \tl_to_str:n {#1} ####2 \exp_not:N \q_stop
+ ####1 \tl_to_str:n {#1} ####2 \s_@@_stop
{ ####1 \tl_to_str:n {#1} }
}
}
\@@_tmp:w { char" }
\@@_tmp:w { count }
\@@_tmp:w { dimen }
+\@@_tmp:w { ~ font }
\@@_tmp:w { macro }
\@@_tmp:w { muskip }
\@@_tmp:w { skip }
@@ -2229,6 +2424,7 @@
% \token_if_chardef:N, \token_if_mathchardef:N,
% \token_if_long_macro:N,
% \token_if_protected_macro:N, \token_if_protected_long_macro:N,
+% \token_if_font_selection:N,
% \token_if_dim_register:N, \token_if_int_register:N,
% \token_if_muskip_register:N,
% \token_if_skip_register:N, \token_if_toks_register:N,
@@ -2261,8 +2457,9 @@
% space after |\protected| but a space after |\long|, hence the
% mixture of \cs{token_to_str:N} and \cs{tl_to_str:n}.
%
-% For the first five conditionals, \cs{cs_if_exist:cT} turns out to
-% be \texttt{false}, and the code boils down to a string comparison
+% For the first six conditionals, \cs{cs_if_exist:cT} turns out to
+% be \texttt{false} (thanks to the leading space for \texttt{font}),
+% and the code boils down to a string comparison
% between the result of the auxiliary on the \tn{meaning} of the
% conditional's argument~|####1|, and~|#3|. Both are evaluated at
% run-time, as this is important to get the correct escape character.
@@ -2297,7 +2494,7 @@
\exp_not:N \exp_after:wN
\exp_not:c { @@_delimit_by_ #2 :w }
\exp_not:N \token_to_meaning:N ####1
- ? \tl_to_str:n {#2} \exp_not:N \q_stop
+ ? \tl_to_str:n {#2} \s_@@_stop
}
{ \exp_not:n {#3} }
{ \exp_not:N \prg_return_true: }
@@ -2317,6 +2514,7 @@
{ \tl_to_str:n { \protected } macro }
\@@_tmp:w { protected_long_macro } { macro }
{ \token_to_str:N \protected \tl_to_str:n { \long } macro }
+\@@_tmp:w { font_selection } { ~ font } { select ~ font }
\@@_tmp:w { dim_register } { dimen } { \token_to_str:N \dimen }
\@@_tmp:w { int_register } { count } { \token_to_str:N \count }
\@@_tmp:w { muskip_register } { muskip } { \token_to_str:N \muskip }
@@ -2332,7 +2530,8 @@
% \@@_if_primitive_nullfont:N,
% \@@_if_primitive_loop:N,
% \@@_if_primitive:Nw,
-% \@@_if_primitive_undefined:N}
+% \@@_if_primitive_undefined:N,
+% \@@_if_primitive_lua:N}
%^^A See http://groups.google.com/group/comp.text.tex/browse_thread/thread/0a72666873f8753d#
%
% We filter out macros first, because they cause endless trouble later
@@ -2356,7 +2555,7 @@
% nonexistent depending on \tn{endlinechar}), and takes care
% of three of the exceptions: \tn{space}, \tn{italiccorr}
% and \tn{hyphen}, whose meaning is at most two characters.
-% This leaves a string terminated by some |:|, and \cs{q_stop}.
+% This leaves a string terminated by some |:|, and \cs{s_@@_stop}.
%
% The meaning of each one of the five \tn[no-index]{...mark} primitives
% has the form \meta{letters}|:|\meta{user material}. In other words,
@@ -2377,69 +2576,210 @@
% \cs{tex_undefined:D}, and if it is |"| or a digit, then the token
% is not a primitive.
%
+% For \LuaTeX{} we use a different implementation which just looks at the
+% command code for the token and compaes it to a list of non-primitives.
+% Again, \tn{nullfont} is a special case because it is the only primitive
+% with the normally non-primitive |set_font| command code.
+%
% \begin{macrocode}
-\tex_chardef:D \c_@@_A_int = `A ~ %
-\use:x
+\sys_if_engine_luatex:TF
{
- \prg_new_conditional:Npnn \exp_not:N \token_if_primitive:N ##1
- { p , T , F , TF }
+%</tex>
+%<*lua>
+do
+ local get_next = token.get_next
+ local get_command = token.get_command
+ local get_index = token.get_index
+ local get_mode = token.get_mode or token.get_index
+ local cmd = token.command_id
+ local set_font = cmd'get_font'
+ local biggest_char = token.biggest_char()
+
+ local mode_below_biggest_char = {}
+ local index_not_nil = {}
+ local mode_not_null = {}
+ local non_primitive = {
+ [cmd'left_brace'] = true,
+ [cmd'right_brace'] = true,
+ [cmd'math_shift'] = true,
+ [cmd'mac_param'] = mode_below_biggest_char,
+ [cmd'sup_mark'] = true,
+ [cmd'sub_mark'] = true,
+ [cmd'endv'] = true,
+ [cmd'spacer'] = true,
+ [cmd'letter'] = true,
+ [cmd'other_char'] = true,
+ [cmd'tab_mark'] = mode_below_biggest_char,
+ [cmd'char_given'] = true,
+ [cmd'math_given'] = true,
+ [cmd'xmath_given'] = true,
+ [cmd'set_font'] = mode_not_null,
+ [cmd'undefined_cs'] = true,
+ [cmd'call'] = true,
+ [cmd'long_call'] = true,
+ [cmd'outer_call'] = true,
+ [cmd'long_outer_call'] = true,
+ [cmd'assign_glue'] = index_not_nil,
+ [cmd'assign_mu_glue'] = index_not_nil,
+ [cmd'assign_toks'] = index_not_nil,
+ [cmd'assign_int'] = index_not_nil,
+ [cmd'assign_attr'] = true,
+ [cmd'assign_dimen'] = index_not_nil,
+ }
+
+ luacmd("@@_if_primitive_lua:N", function()
+ local tok = get_next()
+ local is_non_primitive = non_primitive[get_command(tok)]
+ return put_next(
+ is_non_primitive == true
+ and false_tok
+ or is_non_primitive == nil
+ and true_tok
+ or is_non_primitive == mode_not_null
+ and (get_mode(tok) == 0 and true_tok or false_tok)
+ or is_non_primitive == index_not_nil
+ and (get_index(tok) and false_tok or true_tok)
+ or is_non_primitive == mode_below_biggest_char
+ and (get_mode(tok) > biggest_char and true_tok or false_tok))
+ end, "global")
+end
+%</lua>
+%<*tex>
+ \prg_new_conditional:Npnn \token_if_primitive:N #1 { p , T , F , TF }
{
- \exp_not:N \token_if_macro:NTF ##1
- \exp_not:N \prg_return_false:
- {
- \exp_not:N \exp_after:wN \exp_not:N \@@_if_primitive:NNw
- \exp_not:N \token_to_meaning:N ##1
- \tl_to_str:n { : : : } \exp_not:N \q_stop ##1
- }
+ \@@_if_primitive_lua:N #1
}
- \cs_new:Npn \exp_not:N \@@_if_primitive:NNw
- ##1##2 ##3 \c_colon_str ##4 \exp_not:N \q_stop
+ }
+ {
+ \tex_chardef:D \c_@@_A_int = `A ~ %
+ \use:x
{
- \exp_not:N \tl_if_empty:oTF
- { \exp_not:N \@@_if_primitive_space:w ##3 ~ }
+ \prg_new_conditional:Npnn \exp_not:N \token_if_primitive:N ##1
+ { p , T , F , TF }
{
- \exp_not:N \@@_if_primitive_loop:N ##3
- \c_colon_str \exp_not:N \q_stop
+ \exp_not:N \token_if_macro:NTF ##1
+ \exp_not:N \prg_return_false:
+ {
+ \exp_not:N \exp_after:wN \exp_not:N \@@_if_primitive:NNw
+ \exp_not:N \token_to_meaning:N ##1
+ \tl_to_str:n { : : : } \s_@@_stop ##1
+ }
+ }
+ \cs_new:Npn \exp_not:N \@@_if_primitive:NNw
+ ##1##2 ##3 \c_colon_str ##4 \s_@@_stop
+ {
+ \exp_not:N \tl_if_empty:oTF
+ { \exp_not:N \@@_if_primitive_space:w ##3 ~ }
+ {
+ \exp_not:N \@@_if_primitive_loop:N ##3
+ \c_colon_str \s_@@_stop
+ }
+ { \exp_not:N \@@_if_primitive_nullfont:N }
}
- { \exp_not:N \@@_if_primitive_nullfont:N }
+ }
+ \cs_new:Npn \@@_if_primitive_space:w #1 ~ { }
+ \cs_new:Npn \@@_if_primitive_nullfont:N #1
+ {
+ \if_meaning:w \tex_nullfont:D #1
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+ \cs_new:Npn \@@_if_primitive_loop:N #1
+ {
+ \if_int_compare:w `#1 < \c_@@_A_int %
+ \exp_after:wN \@@_if_primitive:Nw
+ \exp_after:wN #1
+ \else:
+ \exp_after:wN \@@_if_primitive_loop:N
+ \fi:
+ }
+ \cs_new:Npn \@@_if_primitive:Nw #1 #2 \s_@@_stop
+ {
+ \if:w : #1
+ \exp_after:wN \@@_if_primitive_undefined:N
+ \else:
+ \prg_return_false:
+ \exp_after:wN \use_none:n
+ \fi:
+ }
+ \cs_new:Npn \@@_if_primitive_undefined:N #1
+ {
+ \if_cs_exist:N #1
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
}
}
-\cs_new:Npn \@@_if_primitive_space:w #1 ~ { }
-\cs_new:Npn \@@_if_primitive_nullfont:N #1
- {
- \if_meaning:w \tex_nullfont:D #1
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
- }
-\cs_new:Npn \@@_if_primitive_loop:N #1
- {
- \if_int_compare:w `#1 < \c_@@_A_int %
- \exp_after:wN \@@_if_primitive:Nw
- \exp_after:wN #1
- \else:
- \exp_after:wN \@@_if_primitive_loop:N
- \fi:
- }
-\cs_new:Npn \@@_if_primitive:Nw #1 #2 \q_stop
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP, noTF]
+% {\token_case_catcode:Nn, \token_case_charcode:Nn, \token_case_meaning:Nn}
+% \begin{macro}[EXP]{\@@_case:NNnTF, \@@_case:NNw, \@@_case_end:nw}
+% The aim here is to allow the case statement to be evaluated
+% using a known number of expansion steps (two), and without
+% needing to use an explicit \enquote{end of recursion} marker.
+% That is achieved by using the test input as the final case,
+% as this is always true. The trick is then to tidy up
+% the output such that the appropriate case code plus either
+% the \texttt{true} or \texttt{false} branch code is inserted.
+% \begin{macrocode}
+\cs_new:Npn \token_case_catcode:Nn #1#2
+ { \exp:w \@@_case:NNnTF \token_if_eq_catcode:NNTF #1 {#2} { } { } }
+\cs_new:Npn \token_case_catcode:NnT #1#2#3
+ { \exp:w \@@_case:NNnTF \token_if_eq_catcode:NNTF #1 {#2} {#3} { } }
+\cs_new:Npn \token_case_catcode:NnF #1#2
+ { \exp:w \@@_case:NNnTF \token_if_eq_catcode:NNTF #1 {#2} { } }
+\cs_new:Npn \token_case_catcode:NnTF
+ { \exp:w \@@_case:NNnTF \token_if_eq_catcode:NNTF }
+\cs_new:Npn \token_case_charcode:Nn #1#2
+ { \exp:w \@@_case:NNnTF \token_if_eq_charcode:NNTF #1 {#2} { } { } }
+\cs_new:Npn \token_case_charcode:NnT #1#2#3
+ { \exp:w \@@_case:NNnTF \token_if_eq_charcode:NNTF #1 {#2} {#3} { } }
+\cs_new:Npn \token_case_charcode:NnF #1#2
+ { \exp:w \@@_case:NNnTF \token_if_eq_charcode:NNTF #1 {#2} { } }
+\cs_new:Npn \token_case_charcode:NnTF
+ { \exp:w \@@_case:NNnTF \token_if_eq_charcode:NNTF }
+\cs_new:Npn \token_case_meaning:Nn #1#2
+ { \exp:w \@@_case:NNnTF \token_if_eq_meaning:NNTF #1 {#2} { } { } }
+\cs_new:Npn \token_case_meaning:NnT #1#2#3
+ { \exp:w \@@_case:NNnTF \token_if_eq_meaning:NNTF #1 {#2} {#3} { } }
+\cs_new:Npn \token_case_meaning:NnF #1#2
+ { \exp:w \@@_case:NNnTF \token_if_eq_meaning:NNTF #1 {#2} { } }
+\cs_new:Npn \token_case_meaning:NnTF
+ { \exp:w \@@_case:NNnTF \token_if_eq_meaning:NNTF }
+\cs_new:Npn \@@_case:NNnTF #1#2#3#4#5
{
- \if:w : #1
- \exp_after:wN \@@_if_primitive_undefined:N
- \else:
- \prg_return_false:
- \exp_after:wN \use_none:n
- \fi:
+ \@@_case:NNw #1 #2 #3 #2 { }
+ \s_@@_mark {#4}
+ \s_@@_mark {#5}
+ \s_@@_stop
}
-\cs_new:Npn \@@_if_primitive_undefined:N #1
+\cs_new:Npn \@@_case:NNw #1#2#3#4
{
- \if_cs_exist:N #1
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
+ #1 #2 #3
+ { \@@_case_end:nw {#4} }
+ { \@@_case:NNw #1 #2 }
}
% \end{macrocode}
+% To tidy up the recursion, there are two outcomes. If there was a hit to
+% one of the cases searched for, then |#1| is the code to insert,
+% |#2| is the \emph{next} case to check on and |#3| is all of
+% the rest of the cases code. That means that |#4| is the \texttt{true}
+% branch code, and |#5| tidies up the spare \cs{s_@@_mark} and the
+% \texttt{false} branch. On the other hand, if none of the cases matched
+% then we arrive here using the \enquote{termination} case of comparing
+% the search with itself. That means that |#1| is empty, |#2| is
+% the first \cs{s_@@_mark} and so |#4| is the \texttt{false} code (the
+% \texttt{true} code is mopped up by |#3|).
+% \begin{macrocode}
+\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
+ { \exp_end: #1 #4 }
+% \end{macrocode}
% \end{macro}
% \end{macro}
%
@@ -2497,6 +2837,21 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP]{\@@_use_none_delimit_by_s_stop:w}
+% Functions to gobble up to a scan mark.
+% \begin{macrocode}
+\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\peek_after:Nw}
% \begin{macro}{\peek_gafter:Nw}
% Simple wrappers for \tn{futurelet}: no arguments absorbed
@@ -2759,7 +3114,7 @@
% \texttt{true} branch, we must detect outer tokens, without impacting
% performance too much for non-outer tokens. The first filter is to
% search for \texttt{outer} in the \tn{meaning} of \cs{l_peek_token}.
-% If that is absent, \cs{use_none_delimit_by_q_stop:w} cleans up, and
+% If that is absent, \cs{@@_use_none_delimit_by_s_stop:w} cleans up, and
% we call \cs{@@_true:w}. Otherwise, the token can be a non-outer
% macro or a primitive mark whose parameter or replacement text
% contains \texttt{outer}, it can be the primitive \tn{outer}, or it
@@ -2772,7 +3127,7 @@
% \cs{@@_token_generic:NNTF} function.
% \begin{macrocode}
\group_begin:
- \cs_set_protected:Npn \@@_tmp:w #1 \q_stop
+ \cs_set_protected:Npn \@@_tmp:w #1 \s_@@_stop
{
\cs_new_protected:Npn \@@_execute_branches_N_type:
{
@@ -2783,18 +3138,18 @@
1 \exp_stop_f:
\exp_after:wN \@@_N_type:w
\token_to_meaning:N \l_peek_token
- \q_mark \@@_N_type_aux:nnw
- #1 \q_mark \use_none_delimit_by_q_stop:w
- \q_stop
+ \s_@@_mark \@@_N_type_aux:nnw
+ #1 \s_@@_mark \@@_use_none_delimit_by_s_stop:w
+ \s_@@_stop
\exp_after:wN \@@_true:w
\else:
\exp_after:wN \@@_false:w
\fi:
}
- \cs_new_protected:Npn \@@_N_type:w ##1 #1 ##2 \q_mark ##3
+ \cs_new_protected:Npn \@@_N_type:w ##1 #1 ##2 \s_@@_mark ##3
{ ##3 {##1} {##2} }
}
- \exp_after:wN \@@_tmp:w \tl_to_str:n { outer } \q_stop
+ \exp_after:wN \@@_tmp:w \tl_to_str:n { outer } \s_@@_stop
\group_end:
\cs_new_protected:Npn \@@_N_type_aux:nnw #1 #2 #3 \fi:
{
@@ -2817,7 +3172,11 @@
% \end{macro}
%
% \begin{macrocode}
-%</initex|package>
+%</tex>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
index 90dd9057b41..a52823c1a2e 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
@@ -2,7 +2,7 @@
%
%% File: l3unicode.dtx
%
-% Copyright (C) 2018-2020 The LaTeX3 Project
+% Copyright (C) 2018-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -35,7 +35,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-18}
%
% \maketitle
%
@@ -60,7 +60,7 @@
% \section{\pkg{l3unicode} implementation}
%
% \begin{macrocode}
-%<*initex|package>
+%<*package>
% \end{macrocode}
%
% \begin{macrocode}
@@ -97,22 +97,9 @@
{
\exp_not:N \tex_unexpanded:D \exp_not:N \exp_after:wN
{
- \sys_if_engine_luatex:TF
- {
- \exp_not:N \tex_directlua:D
- {
- l3kernel.charcat
- (
- \exp_not:N \tex_number:D #1 ,
- \exp_not:N \tex_the:D \tex_catcode:D #1
- )
- }
- }
- {
- \exp_not:N \tex_Ucharcat:D
- #1 ~
- \tex_catcode:D #1 ~
- }
+ \exp_not:N \tex_Ucharcat:D
+ #1 ~
+ \tex_catcode:D #1 ~
}
}
% \end{macrocode}
@@ -280,7 +267,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</initex|package>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
index d6701c4519a..cd3f5206a95 100644
--- a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
+++ b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx
@@ -2,7 +2,7 @@
%
%% File: l3keys2e.dtx
%
-% Copyright (C) 2009,2011-2020 The LaTeX3 Project
+% Copyright (C) 2009,2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -54,7 +54,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -62,7 +62,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-02}
%
% \maketitle
%
@@ -139,7 +139,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{l3keys2e}{2020-03-06}{}
+\ProvidesExplPackage{l3keys2e}{2021-02-02}{}
{LaTeX2e option processing using LaTeX3 keys}
% \end{macrocode}
%
@@ -299,8 +299,8 @@
% so that there will always be a sign available.
% \begin{macrocode}
\cs_new:Npn \@@_latexe_remove_equals:n #1
- { \@@_latexe_remove_equals:w #1 = \q_stop }
-\cs_new:Npn \@@_latexe_remove_equals:w #1 = #2 \q_stop { \exp_not:n {#1} }
+ { \@@_latexe_remove_equals:w #1 = \s_@@_stop }
+\cs_new:Npn \@@_latexe_remove_equals:w #1 = #2 \s_@@_stop { \exp_not:n {#1} }
% \end{macrocode}
% \end{macro}
% \end{macro}
diff --git a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.ins b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.ins
index a5d2f4e3017..f5b81f896be 100644
--- a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.ins
+++ b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.ins
@@ -2,7 +2,7 @@
File: l3keys2e.ins
-Copyright (C) 2009,2011,2012,2016,2017,2019,2020 The LaTeX3 Project
+Copyright (C) 2009,2011,2012,2016,2017,2019-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -23,7 +23,7 @@ The released version of this bundle is available from CTAN.
\preamble
-Copyright (C) 2009-2020 The LaTeX3 Project
+Copyright (C) 2009-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
index afdd9e189cd..7a86c63782b 100644
--- a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
+++ b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx
@@ -2,7 +2,7 @@
%
%% File: xfp.dtx
%
-% Copyright (C) 2017-2020 The LaTeX3 Project
+% Copyright (C) 2017-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -56,7 +56,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -64,7 +64,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-02}
%
% \maketitle
%
@@ -167,7 +167,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xfp}{2020-03-06}{}
+\ProvidesExplPackage{xfp}{2021-02-02}{}
{L3 Floating point unit}
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.ins b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.ins
index 2439b0aae10..736445226bf 100644
--- a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.ins
+++ b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.ins
@@ -2,7 +2,7 @@
File: xfp.ins
-Copyright (C) 2017,2019,2020 The LaTeX3 Project
+Copyright (C) 2017,2019-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -23,7 +23,7 @@ The released version of this bundle is available from CTAN.
\preamble
-Copyright (C) 2017-2020 The LaTeX3 Project
+Copyright (C) 2017-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
index 7be07c978e6..dfdbf25f6aa 100644
--- a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
+++ b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx
@@ -3,7 +3,7 @@
%% File: xfrac.dtx
%
% Copyright (C) 2004,2008-2010 Morten Hoegholm
-% (C) 2011,2012,2014-2020 The LaTeX3 Project
+% (C) 2011,2012,2014-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -57,7 +57,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -65,7 +65,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-02}
%
% \maketitle
%
@@ -535,7 +535,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xfrac}{2020-03-06}{}
+\ProvidesExplPackage{xfrac}{2021-02-02}{}
{L3 Experimental split-level fractions}
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.ins b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.ins
index 9126baaab7b..d08a89b6d36 100644
--- a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.ins
+++ b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.ins
@@ -3,7 +3,7 @@
File: xfrac.ins
Copyright (C) 2004,2008-2010 Morten Hoegholm
- (C) 2011,2012,2016,2017,2019,2020 The LaTeX3 Project
+ (C) 2011,2012,2016,2017,2019-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -25,7 +25,7 @@ The released version of this bundle is available from CTAN.
\preamble
Copyright (C) 2004,2008-2010 Morten Hoegholm
- (C) 2011-2020 The LaTeX3 Project
+ (C) 2011-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
index f56bcdf5e97..3ea422301a5 100644
--- a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
+++ b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx
@@ -3,8 +3,8 @@
%% File: xparse.dtx
%
% Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle
-% (C) 2004-2008 Frank Mittelbach, The LaTeX3 Project
-% (C) 2009-2020 The LaTeX3 Project
+% (C) 2004-2008 Frank Mittelbach, The LaTeX Project
+% (C) 2009-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -59,7 +59,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -67,7 +67,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-02}
%
% \maketitle
%
@@ -304,7 +304,7 @@
% follow such a command. The most common example is the use of \cmd{\\} in
% \pkg{amsmath} environments. In \pkg{xparse} terms it has signature
% \begin{verbatim}
-% \DeclareDocumentCommad \\ { !s !o } { ... }
+% \DeclareDocumentCommand \\ { !s !o } { ... }
% \end{verbatim}
%
% \subsection{Required delimited arguments}
@@ -928,7 +928,7 @@
% \begin{function}{\GetDocumentCommandArgSpec, \GetDocumentEnvironmentArgSpec}
% \begin{syntax}
% \cs{GetDocumentCommandArgSpec} \meta{function}
-% \cs{GetDocumentEnvironmentArgSpec} \meta{environment}
+% \cs{GetDocumentEnvironmentArgSpec} \Arg{environment}
% \end{syntax}
% These functions transfer the current argument specification for the
% requested \meta{function} or \meta{environment} into the token list
@@ -942,7 +942,7 @@
% {\ShowDocumentCommandArgSpec, \ShowDocumentEnvironmentArgSpec}
% \begin{syntax}
% \cs{ShowDocumentCommandArgSpec} \meta{function}
-% \cs{ShowDocumentEnvironmentArgSpec} \meta{environment}
+% \cs{ShowDocumentEnvironmentArgSpec} \Arg{environment}
% \end{syntax}
% These functions show the current argument specification for the
% requested \meta{function} or \meta{environment} at the terminal. If
@@ -970,30 +970,95 @@
% \section{\pkg{xparse} implementation}
%
% \begin{macrocode}
-%<@@=xparse>
+%<*2ekernel|package>
% \end{macrocode}
%
% \begin{macrocode}
-%<*2ekernel>
+%<@@=cmd>
% \end{macrocode}
%
+% This package file, along with the frozen versions in
+% \pkg{xparse-2018-04-12}, \pkg{xparse-2020-10-01}, and
+% |xparse-generic.tex|, is intended to work across different \LaTeX{}
+% releases, respected the minimum \pkg{expl3} version required by
+% \pkg{xparse}.
+%
+% We can't use the \pkg{latexrelease} mechanism with \cs{DeclareRelease}
+% here because cases of rolling forwards or backwards differ, due to the
+% prefix change from |xparse| to |cmd|, so we do our own checks to
+% ensure the right version is loaded.
+%
+% All this loading assumes that if \pkg{latexrelease} should be loaded,
+% it is before \pkg{xparse}. The other way around was not tested at all
+% and is likely to break.
+%
+% In releases prior to 2020-10-01, \cs{NewDocumentCommand} is undefined,
+% so \pkg{xparse} was not loaded, thus we can load the full version from
+% \pkg{xparse-2018-04-12}. Otherwise we will load only the deprecated
+% argument types from \pkg{xparse-2020-10-01}. If we're in |2ekernel|
+% mode, it means rolling forward so load only the code code from
+% |xparse-generic.tex|.
+%
+% In |2ekernel| mode we anticipate the definition of two macros to parse
+% dates so that we can compare \cs{fmtdate} properly.
% \begin{macrocode}
-\everyjob\expandafter{\the\everyjob
- \message{xparse <2020-03-03>}%
-}
+%<*2ekernel>
+\def\@parse@version#1/#2/#3#4#5\@nil{%
+ \@parse@version@dash#1-#2-#3#4\@nil}
+\def\@parse@version@dash#1-#2-#3#4#5\@nil{%
+ \if\relax#2\relax\else#1\fi#2#3#4 }
+%</2ekernel>
\ExplSyntaxOn
+\cs_if_free:NTF \NewDocumentCommand
+ {
+ \ExplSyntaxOff
+ \ifnum\expandafter
+ \@parse@version\fmtversion//00\@nil <
+ \@parse@version 2020-10-01//00\@nil
+ \RequirePackage{xparse-2018-04-12}
+ \else
+%<2ekernel> \@@@@input xparse-generic.tex ~
+%<package> \RequirePackage{xparse-2020-10-01}
+ \fi
+ \file_input_stop:
+ }
+% \begin{macrocode}
+%
+% In case \cs{NewDocumentCommand} is already defined, we're either in
+% \LaTeX{} 2020-10-01 or later. In the former case, the code loaded in
+% the kernel has the |__xparse| prefix, so we'll load
+% \pkg{xparse-2020-10-01}, otherwise we'll continue in |xparse.sty|,
+% which contains the final remains of \pkg{xparse} with the |__cmd|
+% prefix. To check that we simply look at an internal command with the
+% |__cmd| prefix.
+% \end{macrocode}
+ {
+ \ExplSyntaxOff
+ \cs_if_exist:NF \@@_start:nNNnnn
+ {
+ \RequirePackage{xparse-2020-10-01}
+ \file_input_stop:
+ }
+ }
+\ExplSyntaxOff
% \end{macrocode}
%
% \begin{macrocode}
-%</2ekernel>
+%</2ekernel|package>
% \end{macrocode}
%
+% In older releases, the prefix was |xparse|, but since the 2021 Spring
+% release of \LaTeXe, the core code is included in the kernel, and this
+% file only holds the deprecated argument specifiers |G|, |l|, and |u|.
+% To match the prefix in the \LaTeXe{} kernel, so that the deprecated
+% types work if |xparse.sty| is loaded, the prefix has changed to |cmd|.
+%
% \begin{macrocode}
%<*package>
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xparse}{2020-03-06}{}
+\ProvidesExplPackage{xparse}{2021-02-02}{}
{L3 Experimental document command parser}
% \end{macrocode}
%
@@ -1007,1050 +1072,57 @@
\clist_new:N \l_@@_options_clist
\DeclareOption* { \clist_put_right:NV \l_@@_options_clist \CurrentOption }
\ProcessOptions \relax
-\keys_define:nn { xparse }
+\keys_define:nn { ltcmd }
{
log-declarations .bool_set:N = \l_@@_log_bool ,
log-declarations .initial:n = false
}
-\keys_set:nV { xparse } \l_@@_options_clist
+\keys_set:nV { ltcmd } \l_@@_options_clist
\bool_if:NF \l_@@_log_bool
- { \msg_redirect_module:nnn { LaTeX / xparse } { info } { none } }
-% \end{macrocode}
-% \end{variable}
-% \end{variable}
-%
-% \subsection{Reload check}
-%
-% A simple reload check.
-% \begin{macrocode}
-\cs_if_exist:NT \NewDocumentCommand
- { \file_input_stop: }
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</package>
-% \end{macrocode}
-%
-% \subsection{Variables and constants}
-%
-% \begin{macrocode}
-%<*package|2ekernel>
-% \end{macrocode}
-%
-% \begin{variable}{\c_@@_special_chars_seq}
-% In \IniTeX{} mode, we store special characters in a sequence.
-% Maybe |$| or |&| will have to be added later.
-% \begin{macrocode}
-%<*initex>
-\seq_new:N \c_@@_special_chars_seq
-\seq_set_split:Nnn \c_@@_special_chars_seq { }
- { \ \\ \{ \} \# \^ \_ \% \~ }
-%</initex>
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_arg_spec_tl}
-% Holds the argument specification after normalization of shorthands.
-% \begin{macrocode}
-\tl_new:N \l_@@_arg_spec_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_args_tl}
-% Token list variable for grabbed arguments.
-% \begin{macrocode}
-\tl_new:N \l_@@_args_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_args_i_tl, \l_@@_args_ii_tl}
-% Hold the modified arguments when dealing with default values or
-% processors.
-% \begin{macrocode}
-\tl_new:N \l_@@_args_i_tl
-\tl_new:N \l_@@_args_ii_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_current_arg_int}
-% The number of the current argument being set up: this is used to
-% make sure there are at most 9 arguments, then for creating the
-% expandable auxiliary functions and knowing how many arguments the
-% code function should take.
-% \begin{macrocode}
-\int_new:N \l_@@_current_arg_int
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_defaults_bool, \l_@@_defaults_tl}
-% The boolean indicates whether there are any argument with default
-% value other than |-NoValue-|; the token list holds the code to
-% determine these default values in terms of other arguments.
-% \begin{macrocode}
-\bool_new:N \l_@@_defaults_bool
-\tl_new:N \l_@@_defaults_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_environment_bool}
-% Generating environments uses the same mechanism as generating functions.
-% However, full processing of arguments is always needed for environments,
-% and so the function-generating code needs to know this.
-% This variable is also used at run time to give correct error messages.
-% \begin{macrocode}
-\bool_new:N \l_@@_environment_bool
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_environment_str}
-% Name of the environment, used at definition time and at run time.
-% \begin{macrocode}
-\str_new:N \l_@@_environment_str
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_expandable_bool}
-% Used to indicate if an expandable command is begin generated, as this
-% affects both the acceptable argument types and how they are implemented.
-% \begin{macrocode}
-\bool_new:N \l_@@_expandable_bool
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_expandable_aux_name_tl}
-% Used to create pretty-printing names for the auxiliaries: although the
-% immediate definition does not vary, the full expansion does and so it
-% does not count as a constant.
-% \begin{macrocode}
-\tl_new:N \l_@@_expandable_aux_name_tl
-\tl_set:Nn \l_@@_expandable_aux_name_tl
- {
- \l_@@_function_tl \c_space_tl
- ( arg~ \int_use:N \l_@@_current_arg_int )
- }
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\g_@@_grabber_int}
-% Used (in exceptional cases) to get unique names for grabbers used by
-% expandable commands.
-% \begin{macrocode}
-\int_new:N \g_@@_grabber_int
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_fn_tl}
-% For passing the pre-formed name of the auxiliary to be used as the
-% parsing function.
-% \begin{macrocode}
-\tl_new:N \l_@@_fn_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_fn_code_tl}
-% For passing the pre-formed name of the auxiliary that contains the
-% actual code.
-% \begin{macrocode}
-\tl_new:N \l_@@_fn_code_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_function_tl}
-% Holds the control sequence name of the function currently being
-% defined: used to avoid passing this as an argument and to avoid repeated
-% use of \cs{cs_to_str:N}.
-% \begin{macrocode}
-\tl_new:N \l_@@_function_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_grab_expandably_bool}
-% When defining a non-expandable command, indicates whether the
-% arguments can all safely be grabbed by expandable grabbers. This is
-% to support abuses of \pkg{xparse} that use protected functions
-% inside csname constructions.
-% \begin{macrocode}
-\bool_new:N \l_@@_grab_expandably_bool
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_obey_spaces_bool}
-% For trailing optionals.
-% \begin{macrocode}
-\bool_new:N \l_@@_obey_spaces_bool
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_last_delimiters_tl}
-% Holds the delimiters (first tokens) of all optional arguments since
-% the previous mandatory argument, to warn about cases where it would
-% be impossible to omit optional arguments completely because the
-% following mandatory argument has the same delimiter as one of the
-% optional arguments.
-% \begin{macrocode}
-\tl_new:N \l_@@_last_delimiters_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_long_bool}
-% Used to indicate that an argument is long, on a per-argument basis.
-% \begin{macrocode}
-\bool_new:N \l_@@_long_bool
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_m_args_int}
-% The number of \texttt{m} arguments: if this is the same as the total
-% number of arguments, then a short-cut can be taken in the creation of
-% the grabber code.
-% \begin{macrocode}
-\int_new:N \l_@@_m_args_int
+ { \msg_redirect_module:nnn { LaTeX / ltcmd } { info } { none } }
% \end{macrocode}
% \end{variable}
-%
-% \begin{variable}{\l_@@_prefixed_bool}
-% When preparing the signature of non-expandable commands, indicates
-% that the current argument is affected by a processor or by |+|
-% (namely is long).
-% \begin{macrocode}
-\bool_new:N \l_@@_prefixed_bool
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_process_all_tl, \l_@@_process_one_tl, \l_@@_process_some_bool}
-% When preparing the signature, the processors that will be applied to
-% a given argument are collected in \cs{l_@@_process_one_tl}, while
-% \cs{l_@@_process_all_tl} contains processors for all arguments. The
-% boolean indicates whether there are any processors (to bypass the
-% whole endeavour otherwise).
-% \begin{macrocode}
-\tl_new:N \l_@@_process_all_tl
-\tl_new:N \l_@@_process_one_tl
-\bool_new:N \l_@@_process_some_bool
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_saved_args_tl}
-% Stores \cs{l_@@_args_tl} to deal with space-trimming of
-% \texttt{b}-type arguments.
-% \begin{macrocode}
-\tl_new:N \l_@@_saved_args_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_signature_tl}
-% Used when constructing the signature (code for argument grabbing) to
-% hold what will become the implementation of the main function.
-% When arguments are grabbed (at point of use of the command/environment),
-% it also stores the code for grabbing the remaining arguments.
-% \begin{macrocode}
-\tl_new:N \l_@@_signature_tl
-% \end{macrocode}
% \end{variable}
%
-% \begin{variable}
-% {\l_@@_some_obey_spaces_bool, \l_@@_some_long_bool, \l_@@_some_short_bool}
-% These flags are set while normalizing the argument specification.
-% The \texttt{obey_spaces} one is used to detect when |!| is used on
-% an argument that is not a trailing optional argument.
-% The other two are used to check whether all short arguments appear
-% before long arguments: this is needed to grab arguments expandably.
-% As soon as the first long argument is seen (other than
-% \texttt{t}-type, whose long status is ignored) the
-% \texttt{some_long} flag is set. The \texttt{some_short} flag is
-% used for expandable commands, to know whether to define a short
-% auxiliary too.
-% \begin{macrocode}
-\bool_new:N \l_@@_some_obey_spaces_bool
-\bool_new:N \l_@@_some_long_bool
-\bool_new:N \l_@@_some_short_bool
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_tmp_prop, \l_@@_tmpa_tl, \l_@@_tmpb_tl}
-% \begin{macro}{\@@_tmp:w}
-% Scratch space.
-% \begin{macrocode}
-\prop_new:N \l_@@_tmp_prop
-\tl_new:N \l_@@_tmpa_tl
-\tl_new:N \l_@@_tmpb_tl
-\cs_new_eq:NN \@@_tmp:w ?
-% \end{macrocode}
-% \end{macro}
-% \end{variable}
-%
-% \subsection{Declaring commands and environments}
-%
-% \begin{macro}{\@@_declare_cmd:Nnn, \@@_declare_expandable_cmd:Nnn}
-% \begin{macro}{\@@_declare_cmd_aux:Nnn}
-% \begin{macro}
-% {\@@_declare_cmd_internal:Nnnn, \@@_declare_cmd_internal:cnxn}
-% The main functions for creating commands set the appropriate flag then
-% use the same internal code to do the definition.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_cmd:Nnn
- {
- \bool_set_false:N \l_@@_expandable_bool
- \@@_declare_cmd_aux:Nnn
- }
-\cs_new_protected:Npn \@@_declare_expandable_cmd:Nnn
- {
- \bool_set_true:N \l_@@_expandable_bool
- \@@_declare_cmd_aux:Nnn
- }
-% \end{macrocode}
-% The first stage is to log information, both for the user in the log and
-% for programmatic use in a property list of all declared commands.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_cmd_aux:Nnn #1#2#3
- {
- \cs_if_exist:NTF #1
- {
- \__kernel_msg_info:nnxx { xparse } { redefine-command }
- { \token_to_str:N #1 } { \tl_to_str:n {#2} }
- }
- {
- \bool_lazy_or:nnT
- { \cs_if_exist_p:c { \cs_to_str:N #1 ~ code } }
- { \cs_if_exist_p:c { \cs_to_str:N #1 ~ defaults } }
- {
- \__kernel_msg_warning:nnx { xparse } { unsupported-let }
- { \token_to_str:N #1 }
- }
- \__kernel_msg_info:nnxx { xparse } { define-command }
- { \token_to_str:N #1 } { \tl_to_str:n {#2} }
- }
- \bool_set_false:N \l_@@_environment_bool
- \@@_declare_cmd_internal:Nnnn #1 {#2} {#3} { }
- }
-% \end{macrocode}
-% At definition time, the variable \cs{l_@@_fn_tl} is only used for error messages.
-% The real business of defining a document command starts with setting up
-% the appropriate name, then normalizing the argument specification to get rid of
-% shorthands.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_cmd_internal:Nnnn #1#2#3#4
- {
- \tl_set:Nx \l_@@_function_tl { \cs_to_str:N #1 }
- \tl_set:Nx \l_@@_fn_tl
- { \exp_not:c { \l_@@_function_tl \c_space_tl } }
- \@@_normalize_arg_spec:n {#2}
- \exp_args:No \@@_prepare_signature:n \l_@@_arg_spec_tl
- \@@_declare_cmd_code:Nnn #1 {#2} {#3}
- #4
- \@@_break_point:n {#2}
- }
-\cs_generate_variant:Nn \@@_declare_cmd_internal:Nnnn { cnx }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_break_point:n}
-% A marker used to escape from creating a definition if necessary.
-% \begin{macrocode}
-\cs_new_eq:NN \@@_break_point:n \use_none:n
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_declare_cmd_code:Nnn}
-% \begin{macro}
-% {\@@_declare_cmd_code_aux:Nnn, \@@_declare_cmd_code_expandable:Nnn}
-% The appropriate auxiliary is called.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_cmd_code:Nnn
- {
- \bool_if:NTF \l_@@_grab_expandably_bool
- { \@@_declare_cmd_code_expandable:Nnn }
- { \@@_declare_cmd_code_aux:Nnn }
- }
-% \end{macrocode}
-% Standard functions call \cs{@@_start:nNNnnn}, which receives the
-% argument specification, an auxiliary used for
-% grabbing arguments, an auxiliary containing the code, and then the
-% signature, default arguments, and processors.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_cmd_code_aux:Nnn #1#2#3
- {
- \cs_generate_from_arg_count:cNnn
- { \l_@@_function_tl \c_space_tl code }
- \cs_set_protected:Npn \l_@@_current_arg_int {#3}
- \cs_set_protected_nopar:Npx #1
- {
- \bool_if:NTF \l_@@_environment_bool
- {
- \@@_start_env:nnnnn { \exp_not:n {#2} }
- { \l_@@_environment_str }
- }
- {
- \@@_start:nNNnnn { \exp_not:n {#2} }
- \exp_not:c { \l_@@_function_tl \c_space_tl }
- \exp_not:c { \l_@@_function_tl \c_space_tl code }
- }
- { \exp_not:o \l_@@_signature_tl }
- {
- \bool_if:NT \l_@@_defaults_bool
- { \exp_not:o \l_@@_defaults_tl }
- }
- {
- \bool_if:NT \l_@@_process_some_bool
- { \exp_not:o \l_@@_process_all_tl }
- }
- }
- }
-% \end{macrocode}
-% Expandable functions and functions whose arguments can be grabbed
-% expandably call \cs{@@_start_expandable:nNNNNn}, which receives the
-% argument specification, four auxiliaries (two for grabbing arguments, one for
-% the code, and one for default arguments), and finally the signature.
-% Non-expandable functions that take this branch should nevertheless
-% be protected, as well as their \texttt{code} function. They will
-% only be expanded in contexts such as constructing a csname.
-% The two grabbers (named after the function with one or two spaces)
-% are needed when there are both short and long arguments; otherwise
-% the same grabber is included twice in the definition. If all
-% arguments are long or all are short the (only) grabber is defined
-% correspondingly to be long/short. Otherwise two grabbers are
-% defined, one long, one short.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_cmd_code_expandable:Nnn #1#2#3
- {
- \exp_args:Ncc \cs_generate_from_arg_count:NNnn
- { \l_@@_function_tl \c_space_tl code }
- { cs_set \bool_if:NF \l_@@_expandable_bool { _protected } :Npn }
- \l_@@_current_arg_int {#3}
- \bool_if:NT \l_@@_defaults_bool
- {
- \use:x
- {
- \cs_generate_from_arg_count:cNnn
- { \l_@@_function_tl \c_space_tl defaults }
- \cs_set:Npn \l_@@_current_arg_int
- { \exp_not:o \l_@@_defaults_tl }
- }
- }
- \bool_if:NTF \l_@@_expandable_bool
- { \cs_set_nopar:Npx } { \cs_set_protected_nopar:Npx } #1
- {
- \exp_not:N \@@_start_expandable:nNNNNn
- { \exp_not:n {#2} }
- \exp_not:c { \l_@@_function_tl \c_space_tl }
- \exp_not:c
- {
- \l_@@_function_tl \c_space_tl
- \bool_if:NT \l_@@_some_short_bool
- { \bool_if:NT \l_@@_some_long_bool { \c_space_tl } }
- }
- \exp_not:c { \l_@@_function_tl \c_space_tl code }
- \bool_if:NTF \l_@@_defaults_bool
- { \exp_not:c { \l_@@_function_tl \c_space_tl defaults } }
- { ? }
- { \exp_not:o \l_@@_signature_tl }
- }
- \bool_if:NTF \l_@@_some_long_bool
- {
- \bool_if:NT \l_@@_some_short_bool
- {
- \cs_set_nopar:cpx { \l_@@_function_tl \c_space_tl \c_space_tl }
- ##1##2 { ##1 {##2} }
- }
- \cs_set:cpx
- }
- { \cs_set_nopar:cpx }
- { \l_@@_function_tl \c_space_tl } ##1##2 { ##1 {##2} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_declare_env:nnnn}
-% \begin{macro}{\@@_declare_env_internal:nnnn}
-% The lead-off to creating an environment is much the same as that for
-% creating a command: issue the appropriate message, store the argument
-% specification then hand off to an internal function.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_env:nnnn #1#2
- {
- \str_set:Nx \l_@@_environment_str {#1}
- \str_set:Nx \l_@@_environment_str
- { \tl_trim_spaces:o { \l_@@_environment_str } }
-%<*initex>
- \cs_if_exist:cTF { environment~ \l_@@_environment_str }
-%</initex>
-%<*package|2ekernel>
- \cs_if_exist:cTF { \l_@@_environment_str }
-%</package|2ekernel>
- {
- \__kernel_msg_info:nnxx { xparse } { redefine-environment }
- { \l_@@_environment_str } { \tl_to_str:n {#2} }
- }
- {
- \__kernel_msg_info:nnxx { xparse } { define-environment }
- { \l_@@_environment_str } { \tl_to_str:n {#2} }
- }
- \bool_set_false:N \l_@@_expandable_bool
- \bool_set_true:N \l_@@_environment_bool
- \exp_args:NV \@@_declare_env_internal:nnnn
- \l_@@_environment_str {#2}
- }
-% \end{macrocode}
-% Creating a document environment requires a few more steps than creating
-% a single command. In order to pass the arguments of the command to the
-% end of the function, it is necessary to store the grabbed arguments.
-% To do that, the function used at the end of the environment has to be
-% redefined to contain the appropriate information. To minimize the amount
-% of expansion at point of use, the code here is expanded now as well as
-% when used.
-% The last argument of \cs{@@_declare_cmd_internal:Nnnn} is only run
-% if the definition succeeded. In package mode this ensures that the
-% original definition of the environment is not changed if the
-% definition fails for any reason. This also avoids an error when
-% defining the \verb*|end aux | function when the user asks for more
-% than $9$ arguments.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_env_internal:nnnn #1#2#3#4
- {
- \@@_declare_cmd_internal:cnxn { environment~ #1 } {#2}
- {
- \cs_set_nopar:Npx \exp_not:c { environment~ #1 ~end~aux }
- {
- \exp_not:N \exp_not:N \exp_not:c { environment~ #1~end~aux~ }
- \exp_not:n { \exp_not:o \l_@@_args_tl }
- }
- \exp_not:n {#3}
- }
- {
- \cs_set_nopar:cpx { environment~ #1 ~end }
- { \exp_not:c { environment~ #1 ~end~aux } }
- \cs_generate_from_arg_count:cNnn
- { environment~ #1 ~end~aux~ } \cs_set:Npn
- \l_@@_current_arg_int {#4}
-%<*package|2ekernel>
- \cs_set_eq:cc {#1} { environment~ #1 }
- \cs_set_eq:cc { end #1 } { environment~ #1 ~end }
-%</package|2ekernel>
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Structure of \pkg{xparse} commands}
-%
-% \begin{macro}{\@@_start_env:nnnnn, \@@_start:nNNnnn}
-% For error messages that occur during run-time when getting arguments
-% of environments it is necessary to keep track of the environment
-% name. We begin non-expandable commands with a token equal to
-% \cs{scan_stop:}, whose name gives a reasonable error message if the
-% command is used inside a csname and protects against
-% \texttt{f}-expansion. This is useless for environments since
-% \cs{begin} is already not expandable.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_start_env:nnnnn #1#2
- {
-%<*package|2ekernel>
- \cs_if_exist_use:N \conditionally@traceoff
-%</package|2ekernel>
- \str_set:Nn \l_@@_environment_str {#2}
- \bool_set_true:N \l_@@_environment_bool
- \@@_start_aux:ccnnnn
- { environment~ \l_@@_environment_str \c_space_tl }
- { environment~ \l_@@_environment_str \c_space_tl code }
- {#1}
- }
-\cs_new_protected:Npx \@@_start:nNNnnn #1#2#3
- {
-%<*package|2ekernel>
- \exp_not:n { \cs_if_exist_use:N \conditionally@traceoff }
-%</package|2ekernel>
- \exp_not:c { xparse~function~is~not~expandable }
- \exp_not:n { \bool_set_false:N \l_@@_environment_bool }
- \exp_not:N \@@_start_aux:NNnnnn
- #2 #3 {#1}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_start_aux:NNnnnn, \@@_start_aux:ccnnnn}
-% This sets up a few variables to minimize the boilerplate code
-% included in all \pkg{xparse}-defined commands. It then runs the
-% grabbers~|#4|. Again, the argument specification |#1| is only for
-% diagnostics.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_start_aux:NNnnnn #1#2#3#4#5#6
- {
- \tl_clear:N \l_@@_args_tl
- \tl_set:Nn \l_@@_fn_tl {#1}
- \tl_set:Nn \l_@@_fn_code_tl {#2}
- \tl_set:Nn \l_@@_defaults_tl {#5}
- \tl_set:Nn \l_@@_process_all_tl {#6}
- #4 \@@_run_code:
- }
-\cs_generate_variant:Nn \@@_start_aux:NNnnnn { cc }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_run_code:}
-% After arguments are grabbed, this function is responsible for
-% inserting default values, running processors, and finally running
-% the code.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_run_code:
- {
- \tl_if_empty:NF \l_@@_defaults_tl { \@@_defaults: }
- \tl_if_empty:NF \l_@@_process_all_tl { \@@_args_process: }
-%<*package|2ekernel>
- \cs_if_exist_use:N \conditionally@traceon
-%</package|2ekernel>
- \exp_after:wN \l_@@_fn_code_tl \l_@@_args_tl
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_defaults:}
-% \begin{macro}{\@@_defaults_def:, \@@_defaults_def:nn, \@@_defaults_def:nnn}
-% \begin{macro}{\@@_defaults_aux:, \@@_defaults_error:w}
-% First construct \cs{@@_tmp:w} (see below) that will receive
-% the arguments found so far and determine default values for any
-% missing argument. Then call it repeatedly until the set of
-% arguments stabilizes. Since that could lead to an infinite loop we
-% only call it up to nine times, the maximal number needed for
-% stabilization if there is a chain of arguments that depend on each
-% other. If that fails to stabilize raise an error.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_defaults:
- {
- \@@_defaults_def:
- \tl_set_eq:NN \l_@@_args_i_tl \l_@@_args_tl
- \@@_defaults_aux: \@@_defaults_aux: \@@_defaults_aux:
- \@@_defaults_aux: \@@_defaults_aux: \@@_defaults_aux:
- \@@_defaults_aux: \@@_defaults_aux: \@@_defaults_aux:
- \@@_defaults_error:w
- \q_recursion_stop
- \tl_set_eq:NN \l_@@_args_tl \l_@@_args_i_tl
- }
-\cs_new_protected:Npn \@@_defaults_aux:
- {
- \tl_set:Nx \l_@@_args_ii_tl
- { \exp_after:wN \@@_tmp:w \l_@@_args_i_tl }
- \tl_if_eq:NNT \l_@@_args_ii_tl \l_@@_args_i_tl
- { \use_none_delimit_by_q_recursion_stop:w }
- \tl_set_eq:NN \l_@@_args_i_tl \l_@@_args_ii_tl
- }
-\cs_new_protected:Npn \@@_defaults_error:w \q_recursion_stop
- {
- \__kernel_msg_error:nnx { xparse } { loop-in-defaults }
- { \@@_environment_or_command: }
- }
-% \end{macrocode}
-% To construct \cs{@@_tmp:w}, first go through the arguments
-% found and the corresponding defaults, building a token list with
-% |{#|\meta{arg number}|}| for arguments found in the input (whose
-% default will not be used) and otherwise
-% |{|\cs{exp_not:n}\Arg{default}|}| for arguments whose default will
-% be used.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_defaults_def:
- {
- \tl_clear:N \l_@@_tmpa_tl
- \int_zero:N \l_@@_current_arg_int
- \@@_tl_mapthread_function:NNN \l_@@_args_tl \l_@@_defaults_tl
- \@@_defaults_def:nn
- \cs_generate_from_arg_count:NNVo \@@_tmp:w \cs_set:Npn
- \l_@@_current_arg_int \l_@@_tmpa_tl
- }
-\cs_generate_variant:Nn \cs_generate_from_arg_count:NNnn { NNVo }
-\cs_new_protected:Npn \@@_defaults_def:nn
- {
- \int_incr:N \l_@@_current_arg_int
- \exp_args:NV \@@_defaults_def:nnn \l_@@_current_arg_int
- }
-\cs_new_protected:Npn \@@_defaults_def:nnn #1#2#3
- {
- \tl_put_right:Nx \l_@@_tmpa_tl
- {
- {
- \exp_not:N \exp_not:n
- {
- \tl_if_novalue:nTF {#2}
- { \exp_not:o {#3} }
- { \exp_not:n { ## #1 } }
- }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_args_process:}
-% \begin{macro}{\@@_args_process_loop:nn, \@@_args_process_aux:n}
-% Loop through arguments (stored in \cs{l_@@_args_tl}) and the
-% corresponding processors (in \cs{l_@@_process_all_tl})
-% simultaneously, apply all processors for each argument and store the
-% result back into \cs{l_@@_args_tl}. To allow processors to depend
-% on other arguments, for every processor define a temporary auxiliary
-% that receives all arguments \cs{l_@@_args_tl}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_args_process:
- {
- \tl_clear:N \l_@@_args_ii_tl
- \@@_tl_mapthread_function:NNN
- \l_@@_args_tl
- \l_@@_process_all_tl
- \@@_args_process_loop:nn
- \tl_set_eq:NN \l_@@_args_tl \l_@@_args_ii_tl
- }
-\cs_new_protected:Npn \@@_args_process_loop:nn #1#2
- {
- \tl_set:Nn \ProcessedArgument {#1}
- \tl_if_novalue:nF {#1}
- { \tl_map_function:nN {#2} \@@_args_process_aux:n }
- \tl_put_right:No \l_@@_args_ii_tl
- { \exp_after:wN { \ProcessedArgument } }
- }
-\cs_new_protected:Npn \@@_args_process_aux:n #1
- {
- \cs_generate_from_arg_count:NNnn \@@_tmp:w \cs_set:Npn
- { \tl_count:N \l_@@_args_tl } {#1}
- \exp_args:NNNo \exp_after:wN \@@_tmp:w \l_@@_args_tl
- { \ProcessedArgument }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_start_expandable:nNNNNn}
-% This is called for all expandable commands. |#6| is the signature,
-% responsible for grabbing arguments. |#5| is used to determine
-% default values (or is |?| if there are none). |#4| is the code to run.
-% |#2|~and~|#3| are functions (named after the command) that grab a single
-% argument in the input stream (|#3|~is~short). The argument specification |#1| is
-% only used by diagnostic functions.
-% \begin{macrocode}
-\cs_new:Npn \@@_start_expandable:nNNNNn #1#2#3#4#5#6
- { #6 \@@_end_expandable:NNw #5 #4 \q_@@ #2#3 }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_end_expandable:NNw}
-% \begin{macro}[EXP]{\@@_end_expandable_aux:w}
-% \begin{macro}[EXP]{\@@_end_expandable_aux:nNNNN}
-% \begin{macro}[EXP]{\@@_end_expandable_defaults:nnnNNn}
-% \begin{macro}[EXP]{\@@_end_expandable_defaults:nnw}
-% \begin{macro}[EXP]{\@@_end_expandable_defaults:nw}
-% Followed by a function |#1| to determine default values (or |?| if
-% there are no defaults), the code
-% |#2|, arguments that have been grabbed, then \cs{q_@@} and two generic
-% grabbers. The idea to find default values is similar to the
-% non-expandable case but we cannot define an auxiliary function, so
-% at every step in the loop we need to go through all arguments
-% searching for which ones started out as |-NoValue-| and replacing
-% these by the newly computed values. In fact we need to keep track
-% of three versions of all arguments: the original version, the
-% previous version with default values, and the currently built
-% version (first argument of \cs{@@_end_expandable_defaults:nnnNNn}).
-% \begin{macrocode}
-\cs_new:Npn \@@_end_expandable:NNw #1#2
- { \@@_end_expandable_aux:w #1#2 \prg_do_nothing: }
-\cs_new:Npn \@@_end_expandable_aux:w #1#2#3 \q_@@
- { \exp_args:No \@@_end_expandable_aux:nNNNN {#3} #1 #2 }
-\cs_new:Npn \@@_end_expandable_aux:nNNNN #1#2#3#4#5
- {
- \token_if_eq_charcode:NNT ? #2 { \exp_after:wN \use_iv:nnnn }
- \@@_end_expandable_defaults:nnnNNn {#1} { } {#1} #2#3
- { } { } { } { } { } { } { } { } { } { }
- {
- \__kernel_msg_expandable_error:nnf
- { xparse } { loop-in-defaults }
- { \exp_args:Nf \tl_trim_spaces:n { \token_to_str:N #4 } }
- \use_iv:nnnn
- }
- \q_stop
- }
-\cs_new:Npn \@@_end_expandable_defaults:nnnNNn #1#2#3#4#5#6
- {
- #6
- \str_if_eq:nnTF {#1} {#2}
- { \use_i_delimit_by_q_stop:nw { #5 #1 } }
- {
- \exp_args:No \@@_tl_mapthread_function:nnN
- { #4 #1 } {#3}
- \@@_end_expandable_defaults:nnw
- \@@_end_expandable_defaults:nnnNNn { } {#1} {#3} #4 #5
- }
- }
-\cs_new:Npn \@@_end_expandable_defaults:nnw #1#2
- {
- \tl_if_novalue:nTF {#2}
- { \exp_args:No \@@_end_expandable_defaults:nw {#1} }
- { \@@_end_expandable_defaults:nw {#2} }
- }
-\cs_new:Npn \@@_end_expandable_defaults:nw
- #1#2 \@@_end_expandable_defaults:nnnNNn #3
- { #2 \@@_end_expandable_defaults:nnnNNn { #3 {#1} } }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
% \subsection{Normalizing the argument specifications}
%
-% The goal here is to expand aliases and check that the argument
-% specification is valid before the main parsing run. If it is not
-% valid the entire set up is abandoned to avoid any strange internal
-% errors. A function is provided for each argument type that will grab
-% any extra data items and call the loop function after performing the
-% following checks and tasks.
-% \begin{itemize}
-% \item Check that each argument has the correct number of data items
-% associated with it, and that where a single character is required,
-% one has actually been supplied.
-% \item Check that processors and the markers~|+| and~|!| are followed
-% by an argument for which they make sense, and are not redundant.
-% \item Check the absence of forbidden types for expandable commands,
-% namely \texttt{G}/\texttt{v} always, and \texttt{l}/\texttt{u}
-% after optional arguments (\pkg{xparse} may have inserted braces
-% due to a failed search for an optional argument).
-% \item Check that no optional argument is followed by a mandatory
-% argument with the same delimiter, as otherwise the optional
-% argument could never be omitted.
-% \item Keep track in \cs{l_@@_some_long_bool} and
-% \cs{l_@@_some_short_bool} of whether the command has some
-% long/short arguments.
-% \item Keep track in \cs{l_@@_grab_expandably_bool} of whether all
-% arguments are \texttt{m}/\texttt{l}/\texttt{u} type and short
-% arguments appear before long ones, in which case they can be
-% grabbed expandably just as safely as they could be grabbed
-% nonexpandably. Regardless of that, arguments of expandable
-% commands will be grabbed expandably and arguments of environments
-% will not (because the list of arguments built by non-expandable
-% grabbing is used to pass them to the end-environment code).
-% \end{itemize}
-% Further checks happen at the end of the loop:
-% \begin{itemize}
-% \item that there are at most $9$ arguments;
-% \item that an expandable command does not end with an optional
-% argument (this case is detected by using the fact that
-% \cs{l_@@_last_delimiters_tl} is cleared by every mandatory argument
-% and filled by every optional argument).
-% \end{itemize}
-%
-% \begin{macro}{\@@_normalize_arg_spec:n}
% \begin{macro}{\@@_normalize_arg_spec_loop:n}
% Loop through the argument specification, calling an auxiliary
% specific to each argument type. If any argument is unknown stop the
% definition.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_normalize_arg_spec:n #1
- {
- \int_zero:N \l_@@_current_arg_int
- \tl_clear:N \l_@@_last_delimiters_tl
- \tl_clear:N \l_@@_arg_spec_tl
- \bool_set_true:N \l_@@_grab_expandably_bool
- \bool_set_false:N \l_@@_obey_spaces_bool
- \bool_set_false:N \l_@@_long_bool
- \bool_set_false:N \l_@@_some_obey_spaces_bool
- \bool_set_false:N \l_@@_some_long_bool
- \bool_set_false:N \l_@@_some_short_bool
- \@@_normalize_arg_spec_loop:n #1
- \q_recursion_tail \q_recursion_tail \q_recursion_tail \q_recursion_stop
- \int_compare:nNnT \l_@@_current_arg_int > 9
- {
- \__kernel_msg_error:nnxx { xparse } { too-many-arguments }
- { \@@_environment_or_command: } { \tl_to_str:n {#1} }
- \@@_bad_def:wn
- }
- \bool_if:NT \l_@@_expandable_bool
- {
- \tl_if_empty:NF \l_@@_last_delimiters_tl
- {
- \__kernel_msg_error:nnxx { xparse } { expandable-ending-optional }
- { \iow_char:N \\ \l_@@_function_tl } { \tl_to_str:n {#1} }
- \@@_bad_def:wn
- }
- }
- \bool_if:NT \l_@@_expandable_bool
- { \bool_set_true:N \l_@@_grab_expandably_bool }
- \bool_if:NT \l_@@_environment_bool
- { \bool_set_false:N \l_@@_grab_expandably_bool }
- }
-\cs_new_protected:Npn \@@_normalize_arg_spec_loop:n #1
+\cs_gset_protected:Npn \@@_normalize_arg_spec_loop:n #1
{
\quark_if_recursion_tail_stop:n {#1}
\int_incr:N \l_@@_current_arg_int
\cs_if_exist_use:cF { @@_normalize_type_ \tl_to_str:n {#1} :w }
{
- \__kernel_msg_error:nnxx { xparse } { unknown-argument-type }
+ \__kernel_msg_error:nnxx { ltcmd } { unknown-argument-type }
{ \@@_environment_or_command: } { \tl_to_str:n {#1} }
\@@_bad_def:wn
}
}
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
-% \begin{macro}
-% {
-% \@@_normalize_type_d:w,
-% \@@_normalize_type_e:w,
-% \@@_normalize_type_g:w,
-% \@@_normalize_type_o:w,
-% \@@_normalize_type_O:w,
-% \@@_normalize_type_r:w,
-% \@@_normalize_type_s:w,
-% }
+% \begin{macro}{\@@_normalize_type_g:w}
% These argument types are aliases of more general ones, for example
-% with the default argument |-NoValue-|. To easily insert that marker
-% expanded in the definitions we call \cs{@@_tmp:w} with the argument
-% |-NoValue-|. For argument types that need additional data, check
-% that the data is present (not \cs{q_recursion_tail}) before
-% proceeding.
+% with the default argument |-NoValue-|.
% \begin{macrocode}
-\cs_set_protected:Npn \@@_tmp:w #1
- {
- \cs_new_protected:Npn \@@_normalize_type_d:w ##1##2
- {
- \quark_if_recursion_tail_stop_do:nn {##2} { \@@_bad_arg_spec:wn }
- \@@_normalize_type_D:w {##1} {##2} {#1}
- }
- \cs_new_protected:Npn \@@_normalize_type_e:w ##1
- {
- \quark_if_recursion_tail_stop_do:nn {##1} { \@@_bad_arg_spec:wn }
- \@@_normalize_type_E:w {##1} { }
- }
- \cs_new_protected:Npn \@@_normalize_type_g:w
- { \@@_normalize_type_G:w {#1} }
- \cs_new_protected:Npn \@@_normalize_type_o:w
- { \@@_normalize_type_D:w [ ] {#1} }
- \cs_new_protected:Npn \@@_normalize_type_O:w
- { \@@_normalize_type_D:w [ ] }
- \cs_new_protected:Npn \@@_normalize_type_r:w ##1##2
- {
- \quark_if_recursion_tail_stop_do:nn {##2} { \@@_bad_arg_spec:wn }
- \@@_normalize_type_R:w {##1} {##2} {#1}
- }
- \cs_new_protected:Npn \@@_normalize_type_s:w
- { \@@_normalize_type_t:w * }
- }
-\exp_args:No \@@_tmp:w { \c_novalue_tl }
+\cs_new_protected:Npx \@@_normalize_type_g:w
+ { \exp_not:N \@@_normalize_type_G:w { \exp_not:V \c_novalue_tl } }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}
-% {
-% \@@_normalize_type_>:w,
-% \@@_normalize_type_+:w,
-% \@@_normalize_type_!:w,
-% }
-% Check that these prefixes have arguments, namely that the next token
-% is not \cs{q_recursion_tail}, and remember to leave it after the
-% looping macro. Processors are forbidden in expandable commands.
-% If all is good, store the prefix in the cleaned up
-% \cs{l_@@_arg_spec_tl}, and decrement the argument number as prefixes
-% do not correspond to arguments.
-% \begin{macrocode}
-\cs_new_protected:cpn { @@_normalize_type_>:w } #1#2
- {
- \quark_if_recursion_tail_stop_do:nn {#2} { \@@_bad_arg_spec:wn }
- \bool_if:NT \l_@@_expandable_bool
- {
- \__kernel_msg_error:nnxx { xparse } { processor-in-expandable }
- { \iow_char:N \\ \l_@@_function_tl } { \tl_to_str:n {#1} }
- \@@_bad_def:wn
- }
- \tl_put_right:Nx \l_@@_arg_spec_tl { > { \tl_trim_spaces:n {#1} } }
- \int_decr:N \l_@@_current_arg_int
- \bool_set_false:N \l_@@_grab_expandably_bool
- \@@_normalize_arg_spec_loop:n {#2}
- }
-\cs_new_protected:cpn { @@_normalize_type_+:w } #1
- {
- \quark_if_recursion_tail_stop_do:nn {#1} { \@@_bad_arg_spec:wn }
- \bool_if:NT \l_@@_long_bool
- {
- \__kernel_msg_error:nnxx { xparse } { two-markers }
- { \@@_environment_or_command: } { + }
- \@@_bad_def:wn
- }
- \bool_set_true:N \l_@@_long_bool
- \int_decr:N \l_@@_current_arg_int
- \@@_normalize_arg_spec_loop:n {#1}
- }
-\cs_new_protected:cpn { @@_normalize_type_!:w } #1
- {
- \quark_if_recursion_tail_stop_do:nn {#1} { \@@_bad_arg_spec:wn }
- \bool_if:NT \l_@@_obey_spaces_bool
- {
- \__kernel_msg_error:nnxx { xparse } { two-markers }
- { \@@_environment_or_command: } { ! }
- \@@_bad_def:wn
- }
- \bool_set_true:N \l_@@_obey_spaces_bool
- \bool_set_true:N \l_@@_some_obey_spaces_bool
- \int_decr:N \l_@@_current_arg_int
- \@@_normalize_arg_spec_loop:n {#1}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \@@_normalize_type_D:w,
-% \@@_normalize_type_E:w,
-% \@@_normalize_type_G:w,
-% \@@_normalize_type_t:w,
-% }
-% \begin{macro}{\@@_normalize_E_unique_check:w}
+% \begin{macro}{\@@_normalize_type_G:w}
% Optional argument types. Check that all required data is present
% (and consists of single characters if applicable) and check for
-% forbidden types for expandable commands. For \texttt{E}-type
-% require that there is at least one embellishment, that each one is a
-% single character, and that there aren't more optional arguments than
-% embellishments; also remember that each embellishment counts as one
-% argument for \cs{l_@@_current_arg_int}. Then in each case
+% forbidden types for expandable commands. Then in each case
% store the data in \cs{l_@@_arg_spec_tl}, and
% for later checks store in \cs{l_@@_last_delimiters_tl} the tokens
% whose presence determines whether there is an optional argument (for
% braces store |{}|, seen later as an empty delimiter).
% \begin{macrocode}
-\cs_new_protected:Npn \@@_normalize_type_D:w #1#2#3
- {
- \quark_if_recursion_tail_stop_do:nn {#3} { \@@_bad_arg_spec:wn }
- \@@_single_token_check:n {#1} \@@_allowed_token_check:N #1
- \@@_single_token_check:n {#2}
- \@@_add_arg_spec:n { D #1 #2 {#3} }
- \tl_put_right:Nn \l_@@_last_delimiters_tl {#1}
- \bool_set_false:N \l_@@_grab_expandably_bool
- \@@_normalize_arg_spec_loop:n
- }
-\cs_new_protected:Npn \@@_normalize_type_E:w #1#2
- {
- \quark_if_recursion_tail_stop_do:nn {#2} { \@@_bad_arg_spec:wn }
- \tl_if_blank:nT {#1} { \@@_bad_arg_spec:wn }
- \tl_map_function:nN {#1} \@@_single_token_check:n
- \tl_map_function:nN {#1} \@@_allowed_token_check:N
- \@@_normalize_E_unique_check:w #1 \q_nil \q_stop
- \int_compare:nNnT { \tl_count:n {#2} } > { \tl_count:n {#1} }
- { \@@_bad_arg_spec:wn }
- \@@_add_arg_spec:n { E {#1} {#2} }
- \tl_put_right:Nn \l_@@_last_delimiters_tl {#1}
- \bool_set_false:N \l_@@_grab_expandably_bool
- \int_add:Nn \l_@@_current_arg_int { \tl_count:n {#1} - 1 }
- \@@_normalize_arg_spec_loop:n
- }
-\cs_new_protected:Npn \@@_normalize_E_unique_check:w #1#2 \q_stop
- {
- \quark_if_nil:NF #1
- {
- \tl_if_in:nnT {#2} {#1} { \@@_bad_arg_spec:wn }
- \@@_normalize_E_unique_check:w #2 \q_stop
- }
- }
\cs_new_protected:Npn \@@_normalize_type_G:w #1
{
\quark_if_recursion_tail_stop_do:nn {#1} { \@@_bad_arg_spec:wn }
@@ -2059,39 +1131,13 @@
\tl_put_right:Nn \l_@@_last_delimiters_tl { { } }
\@@_normalize_arg_spec_loop:n
}
-\cs_new_protected:Npn \@@_normalize_type_t:w #1
- {
- \quark_if_recursion_tail_stop_do:Nn #1 { \@@_bad_arg_spec:wn }
- \@@_single_token_check:n {#1} \@@_allowed_token_check:N #1
- \tl_put_right:Nx \l_@@_arg_spec_tl
- {
- \bool_if:NT \l_@@_obey_spaces_bool { ! }
- t \exp_not:n {#1}
- }
- \tl_put_right:Nn \l_@@_last_delimiters_tl {#1}
- \bool_set_false:N \l_@@_grab_expandably_bool
- \bool_set_false:N \l_@@_obey_spaces_bool
- \bool_set_false:N \l_@@_long_bool
- \@@_normalize_arg_spec_loop:n
- }
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
-% \begin{macro}
-% {
-% \@@_normalize_type_l:w,
-% \@@_normalize_type_m:w,
-% \@@_normalize_type_R:w,
-% \@@_normalize_type_u:w
-% \@@_normalize_type_v:w
-% }
+% \begin{macro}{\@@_normalize_type_l:w,\@@_normalize_type_u:w}
% Mandatory arguments. First check the required data is present,
% consists of single characters where applicable, and that the argument
-% type is allowed for expandable commands if applicable. For the
-% \texttt{m} and \texttt{R} argument types check that they do not
-% follow some optional argument with that delimiter as otherwise the
-% optional argument could not be omitted. Then save data in
+% type is allowed for expandable commands if applicable. Then save data in
% \cs{l_@@_arg_spec_tl}, count the mandatory argument, and empty the
% list of last delimiters.
% \begin{macrocode}
@@ -2101,22 +1147,6 @@
\@@_add_arg_spec_mandatory:n { l }
\@@_normalize_arg_spec_loop:n
}
-\cs_new_protected:Npn \@@_normalize_type_m:w
- {
- \@@_delimiter_check:nnn { } { m } { \iow_char:N \{ }
- \@@_add_arg_spec_mandatory:n { m }
- \@@_normalize_arg_spec_loop:n
- }
-\cs_new_protected:Npn \@@_normalize_type_R:w #1#2#3
- {
- \quark_if_recursion_tail_stop_do:nn {#3} { \@@_bad_arg_spec:wn }
- \@@_single_token_check:n {#1} \@@_allowed_token_check:N #1
- \@@_single_token_check:n {#2}
- \@@_delimiter_check:nnn {#1} { R/r } { \tl_to_str:n {#1} }
- \bool_set_false:N \l_@@_grab_expandably_bool
- \@@_add_arg_spec_mandatory:n { R #1 #2 {#3} }
- \@@_normalize_arg_spec_loop:n
- }
\cs_new_protected:Npn \@@_normalize_type_u:w #1
{
\quark_if_recursion_tail_stop_do:nn {#1} { \@@_bad_arg_spec:wn }
@@ -2124,360 +1154,11 @@
\@@_add_arg_spec_mandatory:n { u {#1} }
\@@_normalize_arg_spec_loop:n
}
-\cs_new_protected:Npn \@@_normalize_type_v:w
- {
- \@@_normalize_check_gv:N v
- \@@_add_arg_spec_mandatory:n { v }
- \@@_normalize_arg_spec_loop:n
- }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_normalize_type_b:w}
-% This argument type is not allowed for commands. This is only
-% allowed at the end of the argument specification, hence we check
-% that |#1| is the end.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_normalize_type_b:w #1
- {
- \bool_if:NF \l_@@_environment_bool
- {
- \__kernel_msg_error:nnxx
- { xparse } { invalid-command-arg }
- { \@@_environment_or_command: } { b }
- \@@_bad_def:wn
- }
- \tl_clear:N \l_@@_last_delimiters_tl
- \@@_add_arg_spec:n { b }
- \quark_if_recursion_tail_stop:n {#1}
- \__kernel_msg_error:nnxx { xparse } { arg-after-body }
- { \@@_environment_or_command: }
- { \tl_to_str:n {#1} }
- \@@_bad_def:wn
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_single_token_check:n}
-% Checks that the argument is a single (non-space) token (possibly
-% surrounded by spaces), and aborts the definition otherwise.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_single_token_check:n #1
- {
- \tl_trim_spaces_apply:nN {#1} \tl_if_single_token:nF
- {
- \__kernel_msg_error:nnxx { xparse } { not-single-token }
- { \@@_environment_or_command: } { \tl_to_str:n {#1} }
- \@@_bad_def:wn
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_allowed_token_check:N}
-% Some tokens are now allowed as delimiters for some argument types,
-% notably implicit begin/end-group tokens (|\bgroup|/|\egroup|).
-% The major problem with these tokens is that for |\peek_...| functions,
-% a literal~|{|$_1$. is virtually indistinguishable from a |\bgroup| or
-% other token which was |\let| to a~|{|$_1$, and the same goes
-% for~|}|$_2$. All other tokens can be easily distingushed from their
-% implicit counterparts by grabbing them and looking at the string
-% length (see \cs{@@_token_if_cs:NTF}), but for begin/end group tokens
-% that is not possible without the risk of mistakenly grabbing the
-% entire brace group (potentially leading to a~\texttt{!~Runaway argument}
-% error) or trying to grab a |}|$_2$, leading to a~\texttt{!~Argument
-% of~\dots~has an extra~|}|}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_allowed_token_check:N #1
- {
- \token_if_eq_meaning:NNTF #1 \c_group_begin_token
- { \use:n }
- {
- \token_if_eq_meaning:NNTF #1 \c_group_end_token
- { \use:n }
- { \use_none:n }
- }
- {
- \__kernel_msg_error:nnxxx
- { xparse } { forbidden-implicit-group-token }
- { \@@_environment_or_command: } { \tl_to_str:n {#1} }
- {
- \token_if_eq_meaning:NNTF #1 \c_group_begin_token
- { begin } { end }
- }
- \@@_bad_def:wn
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_normalize_check_gv:N, \@@_normalize_check_lu:N}
-% Called for arguments that are always forbidden, or forbidden after
-% an optional argument, for expandable commands.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_normalize_check_gv:N #1
- {
- \bool_if:NT \l_@@_expandable_bool
- {
- \__kernel_msg_error:nnxx
- { xparse } { invalid-expandable-argument-type }
- { \iow_char:N \\ \l_@@_function_tl } { \tl_to_str:n {#1} }
- \@@_bad_def:wn
- }
- \bool_set_false:N \l_@@_grab_expandably_bool
- }
-\cs_new_protected:Npn \@@_normalize_check_lu:N #1
- {
- \bool_if:NT \l_@@_expandable_bool
- {
- \tl_if_empty:NF \l_@@_last_delimiters_tl
- {
- \__kernel_msg_error:nnxx
- { xparse } { invalid-after-optional-expandably }
- { \iow_char:N \\ \l_@@_function_tl } { \tl_to_str:n {#1} }
- \@@_bad_def:wn
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_delimiter_check:nnn}
-% Called for \texttt{m} and \texttt{R} arguments. Checks that the
-% leading token does not coincide with the token denoting the presence
-% of a previous optional argument. Instead of dealing with braces for
-% the \texttt{m}-type we use an empty delimiter to denote that case.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_delimiter_check:nnn #1#2#3
- {
- \tl_map_inline:Nn \l_@@_last_delimiters_tl
- {
- \tl_if_eq:nnT {##1} {#1}
- {
- \__kernel_msg_warning:nnxx { xparse } { optional-mandatory }
- {#2} {#3}
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_bad_arg_spec:wn, \@@_bad_def:wn}
-% If the argument specification is wrong, this provides an escape from
-% the entire definition process.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_bad_arg_spec:wn #1 \@@_break_point:n #2
- {
- \__kernel_msg_error:nnxx { xparse } { bad-arg-spec }
- { \@@_environment_or_command: } { \tl_to_str:n {#2} }
- }
-\cs_new_protected:Npn \@@_bad_def:wn #1 \@@_break_point:n #2 { }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_arg_spec:n, \@@_add_arg_spec_mandatory:n}
-% When adding an argument to the argument specification, set the
-% \texttt{some_long} or \texttt{some_short} booleans as appropriate
-% and clear the booleans keeping track of |+| and |!| markers.
-% Before that, test for a short argument following some long
-% arguments: this is forbidden for expandable commands and prevents
-% grabbing arguments expandably.
-%
-% For mandatory arguments do some more work, in particular complain if
-% they were preceeded by~|!|.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_arg_spec:n #1
- {
- \bool_lazy_and:nnT
- { ! \l_@@_long_bool }
- { \l_@@_some_long_bool }
- {
- \bool_if:NT \l_@@_expandable_bool
- {
- \__kernel_msg_error:nnx { xparse } { inconsistent-long }
- { \iow_char:N \\ \l_@@_function_tl }
- \@@_bad_def:wn
- }
- \bool_set_false:N \l_@@_grab_expandably_bool
- }
- \bool_if:NTF \l_@@_long_bool
- { \bool_set_true:N \l_@@_some_long_bool }
- { \bool_set_true:N \l_@@_some_short_bool }
- \tl_put_right:Nx \l_@@_arg_spec_tl
- {
- \bool_if:NT \l_@@_long_bool { + }
- \bool_if:NT \l_@@_obey_spaces_bool { ! }
- \exp_not:n {#1}
- }
- \bool_set_false:N \l_@@_long_bool
- \bool_set_false:N \l_@@_obey_spaces_bool
- }
-\cs_new_protected:Npn \@@_add_arg_spec_mandatory:n #1
- {
- \bool_if:NT \l_@@_some_obey_spaces_bool
- {
- \__kernel_msg_error:nnxx { xparse } { non-trailing-obey-spaces }
- { \@@_environment_or_command: } { \tl_to_str:n {#1} }
- \@@_bad_def:wn
- }
- \tl_clear:N \l_@@_last_delimiters_tl
- \@@_add_arg_spec:n {#1}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Preparing the signature: general mechanism}
-%
-% \begin{macro}{\@@_prepare_signature:n}
-% \begin{macro}{\@@_prepare_signature:N}
-% \begin{macro}{\@@_prepare_signature_bypass:N}
-% Actually creating the signature uses the same loop approach as
-% normalizing the signature. There are first a number of variables which need
-% to be set to track what is going on. Many of these variables are unused
-% when defining expandable commands.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_prepare_signature:n #1
- {
- \int_zero:N \l_@@_current_arg_int
- \bool_set_false:N \l_@@_long_bool
- \bool_set_false:N \l_@@_obey_spaces_bool
- \int_zero:N \l_@@_m_args_int
- \bool_set_false:N \l_@@_defaults_bool
- \tl_clear:N \l_@@_defaults_tl
- \tl_clear:N \l_@@_process_all_tl
- \tl_clear:N \l_@@_process_one_tl
- \bool_set_false:N \l_@@_process_some_bool
- \tl_clear:N \l_@@_signature_tl
- \@@_prepare_signature:N #1 \q_recursion_tail \q_recursion_stop
- \bool_if:NF \l_@@_expandable_bool { \@@_flush_m_args: }
- }
-% \end{macrocode}
-% The main looping function does not take an argument, but carries out the
-% reset on the processor boolean. This is split off from the rest of the
-% process so that when actually setting up processors the flag-reset can
-% be bypassed.
-%
-% For each known argument type there is an appropriate function to actually
-% do the addition to the signature. These are separate for expandable and
-% standard functions, as the approaches are different.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_prepare_signature:N
- {
- \bool_set_false:N \l_@@_prefixed_bool
- \@@_prepare_signature_bypass:N
- }
-\cs_new_protected:Npn \@@_prepare_signature_bypass:N #1
- {
- \quark_if_recursion_tail_stop:N #1
- \use:c
- {
- @@_add
- \bool_if:NT \l_@@_grab_expandably_bool { _expandable }
- _type_ \token_to_str:N #1 :w
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
% \subsection{Setting up a standard signature}
%
-% Each argument-adding function appends to the signature a grabber (and
-% for some types, the delimiters or default value), except the one for
-% \texttt{m} arguments. These are collected and added to the signature
-% all at once by \cs{@@_flush_m_args:}, called for every other argument
-% type. All of the functions then call the loop function
-% \cs{@@_prepare_signature:N}. Default values of arguments are
-% collected by \cs{@@_add_default:n} rather than being stored with the
-% argument; this function and \cs{@@_add_default:} are also responsible
-% for keeping track of \cs{l_@@_current_arg_int}.
-%
-% \begin{macro}{\@@_add_type_+:w}
-% Making the next argument long means setting the flag. The \texttt{m}
-% arguments are recorded here as
-% this has to be done for every case where there is then a long argument.
-% \begin{macrocode}
-\cs_new_protected:cpn { @@_add_type_+:w }
- {
- \@@_flush_m_args:
- \bool_set_true:N \l_@@_long_bool
- \bool_set_true:N \l_@@_prefixed_bool
- \@@_prepare_signature_bypass:N
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_type_!:w}
-% Much the same for controlling trailing optional arguments.
-% \begin{macrocode}
-\cs_new_protected:cpn { @@_add_type_!:w }
- {
- \@@_flush_m_args:
- \bool_set_true:N \l_@@_obey_spaces_bool
- \bool_set_true:N \l_@@_prefixed_bool
- \@@_prepare_signature_bypass:N
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_type_>:w}
-% When a processor is found, the processor code is stored. It will be
-% used by \cs{@@_args_process:} once arguments are all found. Here too
-% the loop calls \cs{@@_prepare_signature_bypass:N} rather than
-% \cs{@@_prepare_signature:N} so that the flag is not reset.
-% \begin{macrocode}
-\cs_new_protected:cpn { @@_add_type_>:w } #1
- {
- \@@_flush_m_args:
- \bool_set_true:N \l_@@_prefixed_bool
- \bool_set_true:N \l_@@_process_some_bool
- \tl_put_left:Nn \l_@@_process_one_tl { {#1} }
- \@@_prepare_signature_bypass:N
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_type_b:w}
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_type_b:w
- {
- \@@_flush_m_args:
- \@@_add_default:
- \@@_add_grabber:N b
- \@@_prepare_signature:N
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_type_D:w}
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_type_D:w #1#2#3
- {
- \@@_flush_m_args:
- \@@_add_default:n {#3}
- \@@_add_grabber:N D
- \tl_put_right:Nn \l_@@_signature_tl { #1 #2 }
- \@@_prepare_signature:N
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_type_E:w}
-% The \texttt{E}-type argument needs a special handling of default
-% values.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_type_E:w #1#2
- {
- \@@_flush_m_args:
- \@@_add_default_E:nn {#1} {#2}
- \@@_add_grabber:N E
- \tl_put_right:Nn \l_@@_signature_tl { {#1} }
- \@@_prepare_signature:N
- }
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}{\@@_add_type_G:w}
% For the \texttt{G} type, the grabber and the default are added to the
% signature.
@@ -2506,54 +1187,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_add_type_m:w}
-% The \texttt{m} type is special as short arguments which are not
-% post-processed are simply counted at this stage. Thus there is a check
-% to see if either of these cases apply. If so, a one-argument grabber
-% is added to the signature. On the other hand, if a standard short
-% argument is required it is simply counted at this stage, to be
-% added later using \cs{@@_flush_m_args:}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_type_m:w
- {
- \@@_add_default:
- \bool_if:NTF \l_@@_prefixed_bool
- { \@@_add_grabber:N m }
- { \int_incr:N \l_@@_m_args_int }
- \@@_prepare_signature:N
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_type_R:w}
-% The \texttt{R}-type argument is very similar to the \texttt{D}-type.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_type_R:w #1#2#3
- {
- \@@_flush_m_args:
- \@@_add_default:n {#3}
- \@@_add_grabber:N R
- \tl_put_right:Nn \l_@@_signature_tl { #1 #2 }
- \@@_prepare_signature:N
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_type_t:w}
-% Setting up a \texttt{t} argument means collecting one token for the test,
-% and adding it along with the grabber to the signature.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_type_t:w #1
- {
- \@@_flush_m_args:
- \@@_add_default:
- \@@_add_grabber:N t
- \tl_put_right:Nn \l_@@_signature_tl {#1}
- \@@_prepare_signature:N
- }
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}{\@@_add_type_u:w}
% At the set up stage, the \texttt{u} type argument is identical to the
% \texttt{G} type except for the name of the grabber function.
@@ -2569,216 +1202,8 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_add_type_v:w}
-% At this stage, the \texttt{v} argument is identical to \texttt{l}
-% except that since the grabber may fail to read a verbatim argument
-% we need a default value.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_type_v:w
- {
- \@@_flush_m_args:
- \exp_args:No \@@_add_default:n \c_novalue_tl
- \@@_add_grabber:N v
- \@@_prepare_signature:N
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_flush_m_args:}
-% As \texttt{m} arguments are simply counted, there is a need to add
-% them to the token register in a block. As this function can only
-% be called if something other than \texttt{m} turns up, the flag can
-% be switched here.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_flush_m_args:
- {
- \int_compare:nNnT \l_@@_m_args_int > 0
- {
- \tl_put_right:Nx \l_@@_signature_tl
- { \exp_not:c { @@_grab_m_ \int_use:N \l_@@_m_args_int :w } }
- \tl_put_right:Nx \l_@@_process_all_tl
- { \prg_replicate:nn { \l_@@_m_args_int } { { } } }
- }
- \int_zero:N \l_@@_m_args_int
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_grabber:N}
-% To keep the various checks needed in one place, adding the grabber
-% to the signature is done here. The only questions are whether the
-% grabber should be long or not, and whether to obey spaces. The
-% \cs{l_@@_obey_spaces_bool} boolean can only be \texttt{true} for
-% trailing optional arguments. In that case spaces will not be
-% ignored when looking for that optional argument.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_grabber:N #1
- {
- \tl_put_right:Nx \l_@@_signature_tl
- {
- \exp_not:c
- {
- @@_grab_ #1
- \bool_if:NT \l_@@_long_bool { _long }
- \bool_if:NT \l_@@_obey_spaces_bool { _obey_spaces }
- :w
- }
- }
- \bool_set_false:N \l_@@_long_bool
- \bool_set_false:N \l_@@_obey_spaces_bool
- \tl_put_right:Nx \l_@@_process_all_tl
- { { \exp_not:o \l_@@_process_one_tl } }
- \tl_clear:N \l_@@_process_one_tl
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_default:n, \@@_add_default:, \@@_add_default_E:nn}
-% Store the default value of an argument, or rather code that gives
-% that default value (it may involve other arguments). This is
-% \cs{c_novalue_tl} for arguments with no actual default or with
-% default |-NoValue-|; and (in a brace group) \cs{prg_do_nothing:}
-% followed by a default value for others. For \texttt{E}-type
-% arguments, pad the defaults |#2| with some \cs{c_novalue_tl}
-% until there are as many as embellishments~|#1|. These functions are
-% also used when defining expandable commands.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_default:n #1
- {
- \tl_if_novalue:nTF {#1}
- { \@@_add_default: }
- {
- \int_incr:N \l_@@_current_arg_int
- \bool_set_true:N \l_@@_defaults_bool
- \tl_put_right:Nn \l_@@_defaults_tl { { \prg_do_nothing: #1 } }
- }
- }
-\cs_new_protected:Npn \@@_add_default:
- {
- \int_incr:N \l_@@_current_arg_int
- \tl_put_right:Nn \l_@@_defaults_tl { \c_novalue_tl }
- }
-\cs_new_protected:Npn \@@_add_default_E:nn #1#2
- {
- \tl_map_function:nN {#2} \@@_add_default:n
- \prg_replicate:nn
- { \tl_count:n {#1} - \tl_count:n {#2} }
- { \@@_add_default: }
- }
-% \end{macrocode}
-% \end{macro}
-%
% \subsection{Setting up expandable types}
%
-% The approach here is not dissimilar to that for standard types, but fewer types
-% are supported. There is
-% also a need to define the per-function auxiliaries: this is done here, while
-% the general grabbers are dealt with later.
-%
-% \begin{macro}{\@@_add_expandable_type_+:w}
-% We have already checked that short arguments are before long
-% arguments, so \cs{l_@@_long_bool} only changes from \texttt{false}
-% to \texttt{true} once (and there is no need to reset it after each
-% argument). Also knock back the argument count because |+| is not an
-% argument. Continue the loop.
-% \begin{macrocode}
-\cs_new_protected:cpn { @@_add_expandable_type_+:w }
- {
- \bool_set_true:N \l_@@_long_bool
- \@@_prepare_signature:N
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_expandable_type_D:w}
-% \begin{macro}{\@@_add_expandable_type_D_aux:NNNn}
-% \begin{macro}{\@@_add_expandable_type_D_aux:NNN}
-% \begin{macro}{\@@_add_expandable_type_D_aux:NN}
-% The set up for \texttt{D}-type arguments involves constructing a
-% rather complex auxiliary which is used
-% repeatedly when grabbing. There is an auxiliary here so that the
-% \texttt{R}-type can share code readily: |#1| is |D| or~|R|.
-% The |_aux:NN| auxiliary is needed if the two delimiting tokens are
-% identical: in contrast to the non-expandable route, the grabber here
-% has to act differently for this case.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_expandable_type_D:w
- { \@@_add_expandable_type_D_aux:NNNn D }
-\cs_new_protected:Npn \@@_add_expandable_type_D_aux:NNNn #1#2#3#4
- {
- \@@_add_default:n {#4}
- \tl_if_eq:nnTF {#2} {#3}
- { \@@_add_expandable_type_D_aux:NN #1 #2 }
- { \@@_add_expandable_type_D_aux:NNN #1 #2 #3 }
- \@@_prepare_signature:N
- }
-\cs_new_protected:Npn \@@_add_expandable_type_D_aux:NNN #1#2#3
- {
- \bool_if:NTF \l_@@_long_bool
- { \cs_set:cpx }
- { \cs_set_nopar:cpx }
- { \l_@@_expandable_aux_name_tl } ##1 ##2 #2 ##3 \q_@@ ##4 #3
- { ##1 {##2} {##3} {##4} }
- \@@_add_expandable_grabber:nn {#1}
- {
- \exp_not:c { \l_@@_expandable_aux_name_tl }
- \exp_not:n { #2 #3 }
- }
- }
-\cs_new_protected:Npn \@@_add_expandable_type_D_aux:NN #1#2
- {
- \bool_if:NTF \l_@@_long_bool
- { \cs_set:cpx }
- { \cs_set_nopar:cpx }
- { \l_@@_expandable_aux_name_tl } ##1 #2 ##2 #2
- { ##1 {##2} }
- \@@_add_expandable_grabber:nn { #1_alt }
- {
- \exp_not:c { \l_@@_expandable_aux_name_tl }
- \exp_not:n {#2}
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_expandable_type_E:w}
-% \begin{macro}{\@@_add_expandable_type_E_aux:n}
-% For each embellishment, use \cs{@@_get_grabber:NN} to obtain an
-% auxiliary delimited by that token and store a pair constituted of
-% the auxiliary and the token in \cs{l_@@_tmpb_tl}, before appending
-% the whole set of these pairs to the signature, and an equal number
-% of |-NoValue-| markers (regardless of the default values of
-% arguments). Set the current argument appropriately.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_expandable_type_E:w #1#2
- {
- \@@_add_default_E:nn {#1} {#2}
- \tl_clear:N \l_@@_tmpb_tl
- \tl_map_function:nN {#1} \@@_add_expandable_type_E_aux:n
- \@@_add_expandable_grabber:nn
- { E \bool_if:NT \l_@@_long_bool { _long } }
- {
- { \exp_not:o \l_@@_tmpb_tl }
- {
- \prg_replicate:nn { \tl_count:n {#1} }
- { { \c_novalue_tl } }
- }
- }
- \@@_prepare_signature:N
- }
-\cs_new_protected:Npn \@@_add_expandable_type_E_aux:n #1
- {
- \@@_get_grabber:NN #1 \l_@@_tmpa_tl
- \tl_put_right:Nx \l_@@_tmpb_tl
- { \exp_not:o \l_@@_tmpa_tl \exp_not:N #1 }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \begin{macro}{\@@_add_expandable_type_l:w}
% Reuse type \texttt{u}, thanks to the fact that \TeX{} macros whose
% parameter text ends with |#| in fact end up being delimited by an
@@ -2789,47 +1214,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_add_expandable_type_m:w}
-% Unlike the standard case, when working expandably each argument is always
-% grabbed separately.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_expandable_type_m:w
- {
- \@@_add_default:
- \@@_add_expandable_grabber:nn
- { m \bool_if:NT \l_@@_long_bool { _long } } { }
- \@@_prepare_signature:N
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_expandable_type_R:w}
-% The \texttt{R}-type is very similar to the \texttt{D}-type
-% argument, and so the same internals are used.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_expandable_type_R:w
- { \@@_add_expandable_type_D_aux:NNNn R }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_expandable_type_t:w}
-% An auxiliary delimited by |#1| is built now. It will be used to
-% test for the presence of that token.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_expandable_type_t:w #1
- {
- \@@_add_default:
- \@@_get_grabber:NN #1 \l_@@_tmpa_tl
- \@@_add_expandable_grabber:nn { t }
- {
- \exp_not:o \l_@@_tmpa_tl
- \exp_not:N #1
- }
- \@@_prepare_signature:N
- }
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}{\@@_add_expandable_type_u:w}
% Define an auxiliary that will be used directly in the signature. It
% grabs one argument delimited by |#1| and places it before \cs{q_@@}.
@@ -2849,398 +1233,8 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_add_expandable_grabber:nn}
-% This is called for all arguments to place the right grabber in the
-% signature.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_expandable_grabber:nn #1#2
- {
- \tl_put_right:Nx \l_@@_signature_tl
- { \exp_not:c { @@_expandable_grab_ #1 :w } #2 }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_get_grabber:NN}
-% \begin{macro}{\@@_get_grabber_auxi:NN}
-% \begin{macro}{\@@_get_grabber_auxii:NN}
-% Given a token |#1|, defines an expandable function delimited by that
-% token and stores it in the token list~|#2|. The function is named
-% after the token, unless that function name is already taken by some
-% other grabber (this can happen in the rare case where delimiters
-% with different category codes are used in the same document): in
-% that case use a global counter to get a unique name. Since the
-% grabbers are not named after \pkg{xparse} commands they should not
-% be used to get material from the input stream.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_get_grabber:NN #1#2
- {
- \cs_set:Npn \@@_tmp:w ##1 #1 {##1}
- \exp_args:Nc \@@_get_grabber_auxi:NN
- { @@_grabber_ \token_to_str:N #1 :w } #2
- }
-\cs_new_protected:Npn \@@_get_grabber_auxi:NN #1#2
- {
- \cs_if_eq:NNTF \@@_tmp:w #1
- { \tl_set:Nn #2 {#1} }
- {
- \cs_if_exist:NTF #1
- {
- \int_gincr:N \g_@@_grabber_int
- \exp_args:Nc \@@_get_grabber_auxi:NN
- {
- @@_grabber_
- - \int_use:N \g_@@_grabber_int :w
- }
- #2
- }
- { \@@_get_grabber_auxii:NN #1 #2 }
- }
- }
-\cs_new_protected:Npn \@@_get_grabber_auxii:NN #1#2
- {
- \cs_set_eq:NN #1 \@@_tmp:w
- \tl_set:Nn #2 {#1}
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
% \subsection{Grabbing arguments}
%
-% All of the grabbers follow the same basic pattern. The initial
-% function stores in \cs{l_@@_signature_tl} the code to grab further
-% arguments, defines (the function in) \cs{l_@@_fn_tl} that will grab
-% the argument, and calls it.
-%
-% Defining \cs{l_@@_fn_tl} means determining whether to use
-% \cs{cs_set:Npn} or \cs{cs_set_nopar:Npn}, and for optional arguments
-% whether to skip spaces. Once the argument is found, \cs{l_@@_fn_tl}
-% calls \cs{@@_add_arg:n}, responsible for calling processors and
-% grabbing further arguments.
-%
-% \begin{macro}
-% {
-% \@@_grab_b:w,
-% \@@_grab_b_long:w,
-% \@@_grab_b_obey_spaces:w,
-% \@@_grab_b_long_obey_spaces:w,
-% \@@_grab_b_aux:NNw,
-% \@@_grab_b_end:Nw
-% }
-% This uses the well-tested code of \texttt{D}-type arguments,
-% skipping the peeking step because the \texttt{b}-type argument is
-% always present, and adding a cleanup stage at the end by hijacking
-% the signature. The clean-up consists of properly
-% dealing with \cs{l_@@_args_tl} and also putting back the \cs{end}
-% that served as an end-delimiter: this \cs{end} receives the
-% environment name as its argument and is run normally. The
-% \texttt{D}-type code stores the argument found (body of the
-% environment) as a brace group in \cs{l_@@_args_tl} and depending on
-% the presence of a prefix~|!| we trim spaces or not before adding
-% this braced argument into the saved \cs{l_@@_args_tl}.
-% The strange \verb*|\begin | control sequence is there for display
-% purposes only: it has to look like |\begin| in the terminal but
-% not to delimited arguments.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_b:w
- { \@@_grab_b_aux:NNw \cs_set_protected_nopar:Npn \tl_trim_spaces:n }
-\cs_new_protected:Npn \@@_grab_b_long:w
- { \@@_grab_b_aux:NNw \cs_set_protected:Npn \tl_trim_spaces:n }
-\cs_new_protected:Npn \@@_grab_b_obey_spaces:w
- { \@@_grab_b_aux:NNw \cs_set_protected_nopar:Npn \exp_not:n }
-\cs_new_protected:Npn \@@_grab_b_long_obey_spaces:w
- { \@@_grab_b_aux:NNw \cs_set_protected:Npn \exp_not:n }
-\cs_new_protected:Npn \@@_grab_b_aux:NNw #1#2#3 \@@_run_code:
- {
- \@@_grab_D_aux:NNnN \begin \end {#3} #1
- \tl_put_left:Nn \l_@@_signature_tl { \@@_grab_b_end:Nw #2 }
- \tl_set_eq:NN \l_@@_saved_args_tl \l_@@_args_tl
- \tl_clear:N \l_@@_args_tl
- \exp_args:Nc \l_@@_fn_tl { begin ~ }
- }
-\cs_new_protected:Npn \@@_grab_b_end:Nw #1#2 \@@_run_code:
- {
- \tl_set:Nx \l_@@_args_tl
- {
- \exp_not:V \l_@@_saved_args_tl
- { \exp_after:wN #1 \l_@@_args_tl }
- }
- #2
- \@@_run_code:
- \end
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_grab_D:w}
-% \begin{macro}{\@@_grab_D_long:w}
-% \begin{macro}{\@@_grab_D_obey_spaces:w}
-% \begin{macro}{\@@_grab_D_long_obey_spaces:w}
-% The generic delimited argument grabber. The auxiliary function does
-% a peek test before calling \cs{@@_grab_D_call:Nw}, so that the
-% optional nature of the argument works as expected.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_D:w #1#2#3 \@@_run_code:
- {
- \@@_grab_D_aux:NNnNN #1 #2 {#3} \cs_set_protected_nopar:Npn
- \@@_peek_nonspace_remove:NTF
- }
-\cs_new_protected:Npn \@@_grab_D_long:w #1#2#3 \@@_run_code:
- {
- \@@_grab_D_aux:NNnNN #1 #2 {#3} \cs_set_protected:Npn
- \@@_peek_nonspace_remove:NTF
- }
-\cs_new_protected:Npn \@@_grab_D_obey_spaces:w #1#2#3 \@@_run_code:
- {
- \@@_grab_D_aux:NNnNN #1 #2 {#3} \cs_set_protected_nopar:Npn
- \@@_peek_meaning_remove:NTF
- }
-\cs_new_protected:Npn \@@_grab_D_long_obey_spaces:w #1#2#3 \@@_run_code:
- {
- \@@_grab_D_aux:NNnNN #1 #2 {#3} \cs_set_protected:Npn
- \@@_peek_meaning_remove:NTF
- }
-% \end{macrocode}
-% \begin{macro}{\@@_grab_D_aux:NNnNN}
-% \begin{macro}{\@@_grab_D_aux:NNnN}
-% This is a bit complicated. The idea is that, in order to check for
-% nested optional argument tokens (\texttt{[[...]]} and so on) the
-% argument needs to be grabbed without removing any braces at all. If
-% this is not done, then cases like |[{[}]| fail. So after testing for
-% an optional argument, it is collected piece-wise. Inserting a quark
-% prevents loss of braces, and there is then a test to see if there are
-% nested delimiters to handle.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_D_aux:NNnNN #1#2#3#4#5
- {
- \@@_grab_D_aux:NNnN #1#2 {#3} #4
- #5 #1
- { \@@_grab_D_call:Nw #1 }
- { \@@_add_arg:o \c_novalue_tl }
- }
-% \end{macrocode}
-% Inside the \enquote{standard} grabber, there is a test to see if the
-% grabbed argument is entirely enclosed by braces. There are a couple of
-% extra factors to allow for: the argument might be entirely empty, and
-% spaces at the start and end of the input must be retained around a brace
-% group. Also notice that a \emph{blank} argument might still contain
-% spaces.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_D_aux:NNnN #1#2#3#4
- {
- \tl_set:Nn \l_@@_signature_tl {#3}
- \exp_after:wN #4 \l_@@_fn_tl ##1 #2
- {
- \tl_if_in:nnTF {##1} {#1}
- { \@@_grab_D_nested:NNnN #1 #2 {##1} #4 }
- {
- \tl_if_blank:oTF { \use_none:n ##1 }
- { \@@_add_arg:o { \use_none:n ##1 } }
- {
- \str_if_eq:eeTF
- { \exp_not:o { \use_none:n ##1 } }
- { { \exp_not:o { \use_ii:nnn ##1 \q_nil } } }
- { \@@_add_arg:o { \use_ii:nn ##1 } }
- { \@@_add_arg:o { \use_none:n ##1 } }
- }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \begin{macro}{\@@_grab_D_nested:NNnN}
-% \begin{macro}{\@@_grab_D_nested:w}
-% \begin{macro}{\l_@@_nesting_a_tl}
-% \begin{macro}{\l_@@_nesting_b_tl}
-% \begin{macro}{\q_@@}
-% Catching nested optional arguments means more work. The aim here is
-% to collect up each pair of optional tokens without \TeX{} helping out,
-% and without counting anything. The code above will already have
-% removed the leading opening token and a closing token, but the
-% wrong one. The aim is then to work through the material grabbed
-% so far and divide it up on each opening token, grabbing a closing
-% token to match (thus working in pairs). Once there are no opening
-% tokens, then there is a second check to see if there are any
-% opening tokens in the second part of the argument (for things
-% like |[][]|). Once everything has been found, the entire collected
-% material is added to the output as a single argument. The only tricky part
-% here is ensuring that any grabbing function that might run away is named
-% after the function currently being parsed and not after \pkg{xparse}. That
-% leads to some rather complex nesting! There is also a need to prevent the
-% loss of any braces, hence the insertion and removal of quarks along the
-% way.
-% \begin{macrocode}
-\tl_new:N \l_@@_nesting_a_tl
-\tl_new:N \l_@@_nesting_b_tl
-\quark_new:N \q_@@
-\cs_new_protected:Npn \@@_grab_D_nested:NNnN #1#2#3#4
- {
- \tl_clear:N \l_@@_nesting_a_tl
- \tl_clear:N \l_@@_nesting_b_tl
- \exp_after:wN #4 \l_@@_fn_tl ##1 #1 ##2 \q_@@ ##3 #2
- {
- \tl_put_right:No \l_@@_nesting_a_tl { \use_none:n ##1 #1 }
- \tl_put_right:No \l_@@_nesting_b_tl { \use_i:nn #2 ##3 }
- \tl_if_in:nnTF {##2} {#1}
- {
- \l_@@_fn_tl
- \q_nil ##2 \q_@@ \ERROR
- }
- {
- \tl_put_right:Nx \l_@@_nesting_a_tl
- { \@@_grab_D_nested:w \q_nil ##2 \q_stop }
- \tl_if_in:NnTF \l_@@_nesting_b_tl {#1}
- {
- \tl_set_eq:NN \l_@@_tmpa_tl \l_@@_nesting_b_tl
- \tl_clear:N \l_@@_nesting_b_tl
- \exp_after:wN \l_@@_fn_tl \exp_after:wN
- \q_nil \l_@@_tmpa_tl \q_nil \q_@@ \ERROR
- }
- {
- \tl_put_right:No \l_@@_nesting_a_tl
- \l_@@_nesting_b_tl
- \@@_add_arg:V \l_@@_nesting_a_tl
- }
- }
- }
- \l_@@_fn_tl #3 \q_nil \q_@@ \ERROR
- }
-\cs_new:Npn \@@_grab_D_nested:w #1 \q_nil \q_stop
- { \exp_not:o { \use_none:n #1 } }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \begin{macro}{\@@_grab_D_call:Nw}
-% For \texttt{D} and \texttt{R}-type arguments, to avoid losing any
-% braces, a token needs to be inserted before the argument to be grabbed.
-% If the argument runs away because the closing token is missing then this
-% inserted token shows up in the terminal. Ideally, |#1| would therefore be
-% used directly, but that is no good as it will mess up the rest of the
-% grabber. Instead, a copy of |#1| with an altered category code is used,
-% as this will look right in the terminal but will not mess up the grabber.
-% The only issue then is that the category code of |#1| is unknown. So there
-% is a quick test to ensure that the inserted token can never be matched by
-% the grabber. (This assumes that the open and close delimiters are not the
-% same character with different category codes, but that really should not
-% happen in any sensible document-level syntax.)
-% An exception is when |#1| is a control sequence token, in which case the
-% character-token treatment is no good because if hit with \cs{token_to_str:N}
-% it would add sputios tokens to the argument. In this case a different
-% branch is taken. The token inserted is then the same \meta{csname} as |#1|,
-% but with a space appended, so that the grabber don't see it as another
-% of the same delimiter.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_grab_D_call:Nw #1
- {
- \token_if_eq_catcode:NNTF + #1
- {
- \exp_after:wN \exp_after:wN \exp_after:wN
- \l_@@_fn_tl \char_generate:nn { `#1 } { 11 }
- }
- {
- \@@_token_if_cs:NTF #1
- {
- \exp_after:wN \l_@@_fn_tl
- \cs:w \cs_to_str:N #1 ~ \cs_end:
- }
- {
- \exp_after:wN \l_@@_fn_tl
- \token_to_str:N #1
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \@@_grab_E:w, \@@_grab_E_long:w,
-% \@@_grab_E_obey_spaces:w, \@@_grab_E_long_obey_spaces:w
-% }
-% \begin{macro}{\@@_grab_E:nnNN}
-% \begin{macro}{\@@_grab_E_loop:NnN}
-% \begin{macro}{\@@_grab_E_finalise:}
-% Everything here needs to point to a loop.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_E:w #1#2 \@@_run_code:
- {
- \@@_grab_E:nnNN {#1} {#2}
- \cs_set_protected_nopar:Npn
- \@@_peek_nonspace_remove:NTF
- }
-\cs_new_protected:Npn \@@_grab_E_long:w #1#2 \@@_run_code:
- {
- \@@_grab_E:nnNN {#1} {#2}
- \cs_set_protected:Npn
- \@@_peek_nonspace_remove:NTF
- }
-\cs_new_protected:Npn \@@_grab_E_obey_spaces:w #1#2 \@@_run_code:
- {
- \@@_grab_E:nnNN {#1} {#2}
- \cs_set_protected_nopar:Npn
- \@@_peek_meaning_remove:NTF
- }
-\cs_new_protected:Npn \@@_grab_E_long_obey_spaces:w #1#2 \@@_run_code:
- {
- \@@_grab_E:nnNN {#1} {#2}
- \cs_set_protected:Npn
- \@@_peek_meaning_remove:NTF
- }
-% \end{macrocode}
-% A loop is needed here to allow a random ordering of keys. These are
-% searched for one at a time, with any not found needing to be tracked:
-% they can appear later. The grabbed values are held in a property list
-% which is then turned into an ordered list to be passed back to the user.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_E:nnNN #1#2#3#4
- {
- \exp_after:wN #3 \l_@@_fn_tl ##1##2##3
- {
- \prop_put:Nnn \l_@@_tmp_prop {##1} {##3}
- \@@_grab_E_loop:NnN #4 { } ##2 \q_recursion_stop
- }
- \prop_clear:N \l_@@_tmp_prop
- \tl_set:Nn \l_@@_signature_tl {#2}
- \cs_set_protected:Npn \@@_grab_E_finalise:
- {
- \tl_map_inline:nn {#1}
- {
- \prop_get:NnNF \l_@@_tmp_prop {####1} \l_@@_tmpb_tl
- { \tl_set_eq:NN \l_@@_tmpb_tl \c_novalue_tl }
- \tl_put_right:Nx \l_@@_args_tl
- { { \exp_not:V \l_@@_tmpb_tl } }
- }
- \l_@@_signature_tl \@@_run_code:
- }
- \@@_grab_E_loop:NnN #4 { } #1 \q_recursion_tail \q_recursion_stop
- }
-\cs_new_protected:Npn \@@_grab_E_loop:NnN #1#2#3#4 \q_recursion_stop
- {
- \cs_if_eq:NNTF #3 \q_recursion_tail
- { \@@_grab_E_finalise: }
- {
- #1 #3
- { \l_@@_fn_tl #3 {#2#4} }
- { \@@_grab_E_loop:NnN #1 {#2#3} #4 \q_recursion_stop }
- }
- }
-\cs_new_protected:Npn \@@_grab_E_finalise: { }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
% \begin{macro}{\@@_grab_G:w}
% \begin{macro}{\@@_grab_G_long:w}
% \begin{macro}{\@@_grab_G_obey_spaces:w}
@@ -3306,166 +1300,6 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\@@_grab_m:w}
-% \begin{macro}{\@@_grab_m_long:w}
-% Collecting a single mandatory argument is quite easy.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_m:w #1 \@@_run_code:
- {
- \tl_set:Nn \l_@@_signature_tl {#1}
- \exp_after:wN \cs_set_protected_nopar:Npn \l_@@_fn_tl ##1
- { \@@_add_arg:n {##1} }
- \l_@@_fn_tl
- }
-\cs_new_protected:Npn \@@_grab_m_long:w #1 \@@_run_code:
- {
- \tl_set:Nn \l_@@_signature_tl {#1}
- \exp_after:wN \cs_set_protected:Npn \l_@@_fn_tl ##1
- { \@@_add_arg:n {##1} }
- \l_@@_fn_tl
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_grab_m_1:w}
-% \begin{macro}{\@@_grab_m_2:w}
-% \begin{macro}{\@@_grab_m_3:w}
-% \begin{macro}{\@@_grab_m_4:w}
-% \begin{macro}{\@@_grab_m_5:w}
-% \begin{macro}{\@@_grab_m_6:w}
-% \begin{macro}{\@@_grab_m_7:w}
-% \begin{macro}{\@@_grab_m_8:w}
-% \begin{macro}{\@@_grab_m_9:w}
-% \begin{macro}{\@@_grab_m_aux:Nnnnnnnnn}
-% Grabbing 1--8 mandatory arguments is done by giving 8--1 known
-% arguments to a 9-argument function that stores them in
-% \cs{l_@@_args_tl}. For simplicity, grabbing 9 mandatory arguments
-% is done by grabbing 5 then 4 arguments.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_grab_m_aux:Nnnnnnnnn #1#2#3#4#5#6#7#8#9
- {
- \tl_put_right:No \l_@@_args_tl
- { #1 {#2} {#3} {#4} {#5} {#6} {#7} {#8} {#9} }
- \l_@@_signature_tl \@@_run_code:
- }
-\cs_new_protected:cpn { @@_grab_m_1:w } #1 \@@_run_code:
- {
- \tl_set:Nn \l_@@_signature_tl {#1}
- \exp_after:wN \cs_set_eq:NN \l_@@_fn_tl \@@_grab_m_aux:Nnnnnnnnn
- \l_@@_fn_tl \use_none:nnnnnnn { } { } { } { } { } { } { }
- }
-\cs_new_protected:cpn { @@_grab_m_2:w } #1 \@@_run_code:
- {
- \tl_set:Nn \l_@@_signature_tl {#1}
- \exp_after:wN \cs_set_eq:NN \l_@@_fn_tl \@@_grab_m_aux:Nnnnnnnnn
- \l_@@_fn_tl \use_none:nnnnnn { } { } { } { } { } { }
- }
-\cs_new_protected:cpn { @@_grab_m_3:w } #1 \@@_run_code:
- {
- \tl_set:Nn \l_@@_signature_tl {#1}
- \exp_after:wN \cs_set_eq:NN \l_@@_fn_tl \@@_grab_m_aux:Nnnnnnnnn
- \l_@@_fn_tl \use_none:nnnnn { } { } { } { } { }
- }
-\cs_new_protected:cpn { @@_grab_m_4:w } #1 \@@_run_code:
- {
- \tl_set:Nn \l_@@_signature_tl {#1}
- \exp_after:wN \cs_set_eq:NN \l_@@_fn_tl \@@_grab_m_aux:Nnnnnnnnn
- \l_@@_fn_tl \use_none:nnnn { } { } { } { }
- }
-\cs_new_protected:cpn { @@_grab_m_5:w } #1 \@@_run_code:
- {
- \tl_set:Nn \l_@@_signature_tl {#1}
- \exp_after:wN \cs_set_eq:NN \l_@@_fn_tl \@@_grab_m_aux:Nnnnnnnnn
- \l_@@_fn_tl \use_none:nnn { } { } { }
- }
-\cs_new_protected:cpn { @@_grab_m_6:w } #1 \@@_run_code:
- {
- \tl_set:Nn \l_@@_signature_tl {#1}
- \exp_after:wN \cs_set_eq:NN \l_@@_fn_tl \@@_grab_m_aux:Nnnnnnnnn
- \l_@@_fn_tl \use_none:nn { } { }
- }
-\cs_new_protected:cpn { @@_grab_m_7:w } #1 \@@_run_code:
- {
- \tl_set:Nn \l_@@_signature_tl {#1}
- \exp_after:wN \cs_set_eq:NN \l_@@_fn_tl \@@_grab_m_aux:Nnnnnnnnn
- \l_@@_fn_tl \use_none:n { }
- }
-\cs_new_protected:cpn { @@_grab_m_8:w } #1 \@@_run_code:
- {
- \tl_set:Nn \l_@@_signature_tl {#1}
- \exp_after:wN \cs_set_eq:NN \l_@@_fn_tl \@@_grab_m_aux:Nnnnnnnnn
- \l_@@_fn_tl \prg_do_nothing:
- }
-\cs_new_protected:cpx { @@_grab_m_9:w }
- {
- \exp_not:c { @@_grab_m_5:w }
- \exp_not:c { @@_grab_m_4:w }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_grab_R:w, \@@_grab_R_long:w}
-% \begin{macro}{\@@_grab_R_aux:NNnN}
-% The grabber for \texttt{R}-type arguments is basically the same as
-% that for \texttt{D}-type ones, but always skips spaces (as it is mandatory)
-% and has a hard-coded error message.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_R:w #1#2#3 \@@_run_code:
- { \@@_grab_R_aux:NNnN #1 #2 {#3} \cs_set_protected_nopar:Npn }
-\cs_new_protected:Npn \@@_grab_R_long:w #1#2#3 \@@_run_code:
- { \@@_grab_R_aux:NNnN #1 #2 {#3} \cs_set_protected:Npn }
-\cs_new_protected:Npn \@@_grab_R_aux:NNnN #1#2#3#4
- {
- \@@_grab_D_aux:NNnN #1 #2 {#3} #4
- \@@_peek_nonspace_remove:NTF #1
- { \@@_grab_D_call:Nw #1 }
- {
- \__kernel_msg_error:nnxx { xparse } { missing-required }
- { \@@_environment_or_command: }
- { \token_to_str:N #1 }
- \@@_add_arg:o \c_novalue_tl
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_grab_t:w}
-% \begin{macro}{\@@_grab_t_obey_spaces:w}
-% \begin{macro}{\@@_grab_t_aux:NNw}
-% Dealing with a token is quite easy. Check the match, remove the
-% token if needed and add a flag to the output.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_t:w
- { \@@_grab_t_aux:NNw \@@_peek_nonspace_remove:NTF }
-\cs_new_protected:Npn \@@_grab_t_obey_spaces:w
- { \@@_grab_t_aux:NNw \@@_peek_meaning_remove:NTF }
-\cs_new_protected:Npn \@@_grab_t_aux:NNw #1#2#3 \@@_run_code:
- {
- \tl_set:Nn \l_@@_signature_tl {#3}
- \exp_after:wN \cs_set_protected:Npn \l_@@_fn_tl
- {
- #1 #2
- { \@@_add_arg:n { \BooleanTrue } }
- { \@@_add_arg:n { \BooleanFalse } }
- }
- \l_@@_fn_tl
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
% \begin{macro}{\@@_grab_u:w}
% \begin{macro}{\@@_grab_u_long:w}
% \begin{macro}{\@@_grab_u_aux:nnN}
@@ -3488,654 +1322,6 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\@@_grab_v:w}
-% \begin{macro}{\@@_grab_v_long:w}
-% \begin{macro}{\@@_grab_v_aux:w}
-% \begin{macro}{\@@_grab_v_group_end:}
-% \begin{variable}{\l_@@_v_arg_tl}
-% The opening delimiter is the first non-space token, and is never
-% read verbatim. This is required by consistency with the case where
-% the preceding argument was optional and absent: then \TeX{} has
-% already read and tokenized that token when looking for the optional
-% argument. The first thing is thus to check is that this delimiter
-% is a character, and to distinguish the case of a left brace (in that
-% case, \cs{group_align_safe_end:} is needed to compensate for the
-% begin-group character that was just seen). Then set verbatim
-% catcodes with \cs{@@_grab_v_aux_catcodes:}.
-%
-% The group keep catcode changes local, and
-% \cs{group_align_safe_begin/end:} allow to use a character
-% with category code~$4$ (normally |&|) as the delimiter.
-% It is ended by \cs{@@_grab_v_group_end:}, which smuggles
-% the collected argument out of the group.
-% \begin{macrocode}
-\tl_new:N \l_@@_v_arg_tl
-\cs_new_protected:Npn \@@_grab_v:w
- {
- \bool_set_false:N \l_@@_long_bool
- \@@_grab_v_aux:w
- }
-\cs_new_protected:Npn \@@_grab_v_long:w
- {
- \bool_set_true:N \l_@@_long_bool
- \@@_grab_v_aux:w
- }
-\cs_new_protected:Npn \@@_grab_v_aux:w #1 \@@_run_code:
- {
- \tl_set:Nn \l_@@_signature_tl {#1}
- \group_begin:
- \group_align_safe_begin:
- \tex_escapechar:D = 92 \scan_stop:
- \tl_clear:N \l_@@_v_arg_tl
- \peek_remove_spaces:n
- {
- \peek_meaning_remove:NTF \c_group_begin_token
- {
- \group_align_safe_end:
- \@@_grab_v_bgroup:
- }
- {
- \peek_N_type:TF
- { \@@_grab_v_aux_test:N }
- { \@@_grab_v_aux_abort:n { } }
- }
- }
- }
-\cs_new_protected:Npn \@@_grab_v_group_end:
- {
- \group_align_safe_end:
- \exp_args:NNNo
- \group_end:
- \tl_set:Nn \l_@@_v_arg_tl { \l_@@_v_arg_tl }
- }
-% \end{macrocode}
-% \end{variable}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_grab_v_aux_test:N}
-% \begin{macro}
-% {
-% \@@_grab_v_aux_loop:N,
-% \@@_grab_v_aux_loop:NN,
-% \@@_grab_v_aux_loop_end:
-% }
-% Check that the opening delimiter is a character, setup category codes,
-% then start reading tokens one by one, keeping the delimiter as an argument.
-% If the verbatim was not nested, we will be grabbing one character
-% at each step. Unfortunately, it can happen that what follows the
-% verbatim argument is already tokenized. Thus, we check at each step
-% that the next token is indeed a \enquote{nice}
-% character, \emph{i.e.}, is not a character with
-% category code $1$ (begin-group), $2$ (end-group)
-% or $6$ (macro parameter), nor the space character,
-% with category code~$10$ and character code~$32$,
-% nor a control sequence.
-% The partially built argument is stored in \cs{l_@@_v_arg_tl}.
-% If we ever meet a token which we cannot grab (non-N-type),
-% or which is not a character according to
-% \cs{@@_grab_v_token_if_char:NTF}, then we bail out with
-% \cs{@@_grab_v_aux_abort:n}. Otherwise, we stop at the first
-% character matching the delimiter.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_v_aux_test:N #1
- {
- \@@_grab_v_token_if_char:NTF #1
- {
- \@@_grab_v_aux_put:N #1
- \@@_grab_v_aux_catcodes:
- \@@_grab_v_aux_loop:N #1
- }
- { \@@_grab_v_aux_abort:n {#1} #1 }
- }
-\cs_new_protected:Npn \@@_grab_v_aux_loop:N #1
- {
- \peek_N_type:TF
- { \@@_grab_v_aux_loop:NN #1 }
- { \@@_grab_v_aux_abort:n { } }
- }
-\cs_new_protected:Npn \@@_grab_v_aux_loop:NN #1#2
- {
- \@@_grab_v_token_if_char:NTF #2
- {
- \token_if_eq_charcode:NNTF #1 #2
- { \@@_grab_v_aux_loop_end: }
- {
- \@@_grab_v_aux_put:N #2
- \@@_grab_v_aux_loop:N #1
- }
- }
- { \@@_grab_v_aux_abort:n {#2} #2 }
- }
-\cs_new_protected:Npn \@@_grab_v_aux_loop_end:
- {
- \@@_grab_v_group_end:
- \@@_add_arg:x { \tl_tail:N \l_@@_v_arg_tl }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_grab_v_bgroup:}
-% \begin{macro}{\@@_grab_v_bgroup_loop:}
-% \begin{macro}{\@@_grab_v_bgroup_loop:N}
-% \begin{variable}{\l_@@_v_nesting_int}
-% If the opening delimiter is a left brace, we keep track of
-% how many left and right braces were encountered so far in
-% \cs{l_@@_v_nesting_int} (the methods used for optional
-% arguments cannot apply here), and stop as soon as it reaches~$0$.
-%
-% Some care was needed when removing the opening delimiter, which
-% has already been assigned category code~$1$: using
-% \cs{peek_meaning_remove:NTF} in the \cs{@@_grab_v_aux:w}
-% function would break within alignments. Instead, we first
-% convert that token to a string, and remove the result as a
-% normal undelimited argument.
-% \begin{macrocode}
-\int_new:N \l_@@_v_nesting_int
-\cs_new_protected:Npx \@@_grab_v_bgroup:
- {
- \exp_not:N \@@_grab_v_aux_catcodes:
- \exp_not:n { \int_set:Nn \l_@@_v_nesting_int { 1 } }
- \exp_not:N \@@_grab_v_aux_put:N \iow_char:N \{
- \exp_not:N \@@_grab_v_bgroup_loop:
- }
-\cs_new_protected:Npn \@@_grab_v_bgroup_loop:
- {
- \peek_N_type:TF
- { \@@_grab_v_bgroup_loop:N }
- { \@@_grab_v_aux_abort:n { } }
- }
-\cs_new_protected:Npn \@@_grab_v_bgroup_loop:N #1
- {
- \@@_grab_v_token_if_char:NTF #1
- {
- \token_if_eq_charcode:NNTF \c_group_end_token #1
- {
- \int_decr:N \l_@@_v_nesting_int
- \int_compare:nNnTF \l_@@_v_nesting_int > 0
- {
- \@@_grab_v_aux_put:N #1
- \@@_grab_v_bgroup_loop:
- }
- { \@@_grab_v_aux_loop_end: }
- }
- {
- \token_if_eq_charcode:NNT \c_group_begin_token #1
- { \int_incr:N \l_@@_v_nesting_int }
- \@@_grab_v_aux_put:N #1
- \@@_grab_v_bgroup_loop:
- }
- }
- { \@@_grab_v_aux_abort:n {#1} #1 }
- }
-% \end{macrocode}
-% \end{variable}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_grab_v_aux_catcodes:}
-% \begin{macro}{\@@_grab_v_aux_abort:n}
-% In a standalone format, the list of special characters is kept
-% as a sequence, \cs{c_@@_special_chars_seq}, and we use
-% \tn{dospecials} in package mode.
-% The approach for short verbatim arguments is to make the end-line
-% character a macro parameter character: this is forbidden by the
-% rest of the code. Then the error branch can check what caused the
-% bail out and give the appropriate error message.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_v_aux_catcodes:
- {
-%<*initex>
- \seq_map_function:NN
- \c_@@_special_chars_seq
- \char_set_catcode_other:N
-%</initex>
-%<*package|2ekernel>
- \cs_set_eq:NN \do \char_set_catcode_other:N
- \dospecials
-%</package|2ekernel>
- \tex_endlinechar:D = `\^^M \scan_stop:
- \bool_if:NTF \l_@@_long_bool
- { \char_set_catcode_other:n { \tex_endlinechar:D } }
- { \char_set_catcode_parameter:n { \tex_endlinechar:D } }
- }
-\cs_new_protected:Npn \@@_grab_v_aux_abort:n #1
- {
- \@@_grab_v_group_end:
- \exp_after:wN \exp_after:wN \exp_after:wN
- \peek_meaning_remove:NTF \char_generate:nn { \tex_endlinechar:D } { 6 }
- {
- \__kernel_msg_error:nnxxx { xparse } { verbatim-newline }
- { \@@_environment_or_command: }
- { \tl_to_str:N \l_@@_v_arg_tl }
- { \tl_to_str:n {#1} }
- \@@_add_arg:o \c_novalue_tl
- }
- {
- \__kernel_msg_error:nnxxx { xparse } { verbatim-tokenized }
- { \@@_environment_or_command: }
- { \tl_to_str:N \l_@@_v_arg_tl }
- { \tl_to_str:n {#1} }
- \@@_add_arg:o \c_novalue_tl
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_grab_v_aux_put:N}
-% Storing one token in the collected argument. Most tokens are
-% converted to category code $12$, with the exception of active
-% characters, and spaces (not sure what should be done for those).
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_v_aux_put:N #1
- {
- \tl_put_right:Nx \l_@@_v_arg_tl
- {
- \token_if_active:NTF #1
- { \exp_not:N #1 } { \token_to_str:N #1 }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_grab_v_token_if_char:NTF}
-% This function assumes that the escape character is printable.
-% Then the string representation of control sequences is at least
-% two characters, and \cs{str_tail:n} only removes the escape
-% character. Macro parameter characters are doubled by
-% \cs{tl_to_str:n}, and will also yield a non-empty result,
-% hence are not considered as characters.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_grab_v_token_if_char:NTF #1
- { \str_if_eq:eeTF { } { \str_tail:n {#1} } }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_add_arg:n, \@@_add_arg:V, \@@_add_arg:o, \@@_add_arg:x}
-% When an argument is found it is stored, then further arguments are
-% grabbed by calling \cs{l_@@_signature_tl}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_add_arg:n #1
- {
- \tl_put_right:Nn \l_@@_args_tl { {#1} }
- \l_@@_signature_tl \@@_run_code:
- }
-\cs_generate_variant:Nn \@@_add_arg:n { V , o , x }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Grabbing arguments expandably}
-%
-% \begin{macro}[EXP]{\@@_expandable_grab_D:w}
-% \begin{macro}[EXP]{\@@_expandable_grab_D:NNNwNNn}
-% \begin{macro}[EXP]{\@@_expandable_grab_D:NNNwNNnnn}
-% \begin{macro}[EXP]{\@@_expandable_grab_D:Nw}
-% \begin{macro}[EXP]{\@@_expandable_grab_D:nnNNNwNN}
-% The first step is to grab the first token or group. The generic grabbers
-% \cs{\meta{function}}\verb*| | and \cs{\meta{function}}\verb*| | are just after \cs{q_@@}, we go and find
-% them (and use the long one).
-% \begin{macrocode}
-\cs_new:Npn \@@_expandable_grab_D:w #1 \q_@@ #2#3
- { #2 { \@@_expandable_grab_D:NNNwNNn #1 \q_@@ #2 #3 } }
-% \end{macrocode}
-% We then wish to test whether |#7|, which we just grabbed, is exactly |#2|.
-% A preliminary test is whether their string representations coincide, then
-% expand the only grabber function we have, |#1|, once: the two strings below
-% are equal if and only if |#7| matches |#2| exactly.\footnote{It is obvious
-% that if \texttt{\#7} matches \texttt{\#2} then the strings are equal. We
-% must check the converse. The right-hand-side of \cs{str_if_eq:onTF} does
-% not end with \texttt{\#3}, implying that the grabber function took
-% everything as its arguments. The first brace group can only be empty if
-% \texttt{\#7} starts with \texttt{\#2}, otherwise the brace group preceding
-% \texttt{\#7} would not vanish. The third brace group is empty, thus the
-% \cs{q_@@} that was used by our grabber \texttt{\#1} must be the one
-% that we inserted (not some token in \texttt{\#7}), hence the second brace
-% group contains the end of \texttt{\#7} followed by \texttt{\#2}. Since this
-% is \texttt{\#2} on the right-hand-side, and no brace can be lost there,
-% \texttt{\#7} must contain nothing else than its leading \texttt{\#2}.}
-% The preliminary test is needed as |#7| could validly contain
-% \tn{par} (because a later mandatory argument could be long) and our
-% grabber may be short. If
-% |#7| does not match |#2|, then the optional argument is missing, we use the
-% default |-NoValue-|, and put back the argument |#7| in the input stream.
-%
-% If it does match, then interesting things need to be done. We will grab the
-% argument piece by piece, with the following pattern:
-% \begin{quote}
-% \meta{grabber} \Arg{tokens} \\
-% ~~\cs{q_nil} \Arg{piece 1} \meta{piece 2} \cs{ERROR} \cs{q_@@}\\
-% ~~\cs{q_nil} \meta{input stream}
-% \end{quote}
-% The \meta{grabber} will find an opening delimiter in \meta{piece 2}, take
-% the \cs{q_@@} as a second delimiter, and find more material delimited
-% by the closing delimiter in the \meta{input stream}. We then move the part
-% before the opening delimiter from \meta{piece 2} to \meta{piece 1}, and the
-% material taken from the \meta{input stream} to the \meta{piece 2}. Thus,
-% the argument moves gradually from the \meta{input stream} to the
-% \meta{piece 2}, then to the \meta{piece 1} when we have made sure to find
-% all opening and closing delimiters. This two-step process ensures that
-% nesting works: the number of opening delimiters minus closing delimiters in
-% \meta{piece 1} is always equal to the number of closing delimiters in
-% \meta{piece 2}. We stop grabbing arguments once the \meta{piece 2} contains
-% no opening delimiter any more, hence the balance is reached, and the final
-% argument is \meta{piece 1} \meta{piece 2}.
-% The indirection via \cs{@@_tmp:w} allows to insert |-NoValue-| expanded.
-% \begin{macrocode}
-\cs_set_protected:Npn \@@_tmp:w #1
- {
- \cs_new:Npn \@@_expandable_grab_D:NNNwNNn ##1##2##3##4 \q_@@ ##5##6##7
- {
- \str_if_eq:nnTF {##2} {##7}
- {
- \str_if_eq:onTF
- { ##1 { } { } ##7 ##2 \q_@@ ##3 }
- { { } {##2} { } }
- }
- { \use_ii:nn }
- {
- ##1
- { \@@_expandable_grab_D:NNNwNNnnn ##1##2##3##4 \q_@@ ##5##6 }
- \q_nil { } ##2 \ERROR \q_@@ \ERROR
- }
- { ##4 {#1} \q_@@ ##5 ##6 {##7} }
- }
- }
-\exp_args:No \@@_tmp:w { \c_novalue_tl }
-% \end{macrocode}
-% At this stage, |#7| is \cs{q_nil} \Arg{piece 1} \meta{more for piece 1},
-% and we want to concatenate all that, removing \cs{q_nil}, and keeping the
-% opening delimiter |#2|. Simply use \cs{use_ii:nn}. Also, |#8| is
-% \meta{remainder of piece 2} \cs{ERROR}, and |#9| is \cs{ERROR} \meta{more
-% for piece 2}. We concatenate those, replacing the two \cs{ERROR} by the
-% closing delimiter |#3|.
-% \begin{macrocode}
-\cs_new:Npn \@@_expandable_grab_D:NNNwNNnnn #1#2#3#4 \q_@@ #5#6#7#8#9
- {
- \exp_args:Nof \@@_expandable_grab_D:nnNNNwNN
- { \use_ii:nn #7 #2 }
- { \@@_expandable_grab_D:Nw #3 \exp_stop_f: #8 #9 }
- #1#2#3 #4 \q_@@ #5 #6
- }
-\cs_new:Npn \@@_expandable_grab_D:Nw #1#2 \ERROR \ERROR { #2 #1 }
-% \end{macrocode}
-% Armed with our two new \meta{pieces}, we are ready to loop. However, we
-% must first see if \meta{piece 2} (here |#2|) contains any opening
-% delimiter |#4|. Again, we expand |#3|, this time removing its whole output
-% with \cs{use_none:nnn}. The test is similar to \cs{tl_if_in:nnTF}. The
-% token list is empty if and only if |#2| does not contain the opening
-% delimiter. In that case, we are done, and put the argument (from which we
-% remove a spurious pair of delimiters coming from how we started the loop).
-% Otherwise, we go back to looping with
-% \cs{@@_expandable_grab_D:NNNwNNnnn}. The code to deal with brace stripping
-% is much the same as for the non-expandable case.
-% \begin{macrocode}
-\cs_new:Npn \@@_expandable_grab_D:nnNNNwNN #1#2#3#4#5#6 \q_@@ #7#8
- {
- \exp_args:No \tl_if_empty:oTF
- { #3 { \use_none:nnn } #2 \q_@@ #5 #4 \q_@@ #5 }
- {
- \tl_if_blank:oTF { \use_none:nn #1#2 }
- { \@@_put_arg_expandable:ow { \use_none:nn #1#2 } }
- {
- \str_if_eq:eeTF
- { \exp_not:o { \use_none:nn #1#2 } }
- { { \exp_not:o { \use_iii:nnnn #1#2 \q_nil } } }
- { \@@_put_arg_expandable:ow { \use_iii:nnn #1#2 } }
- { \@@_put_arg_expandable:ow { \use_none:nn #1#2 } }
- }
- #6 \q_@@ #7 #8
- }
- {
- #3
- { \@@_expandable_grab_D:NNNwNNnnn #3#4#5#6 \q_@@ #7 #8 }
- \q_nil {#1} #2 \ERROR \q_@@ \ERROR
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_expandable_grab_D_alt:w}
-% \begin{macro}[EXP]{\@@_expandable_grab_D_alt:NNwNNn}
-% \begin{macro}[EXP]{\@@_expandable_grab_D_alt:Nwn}
-% When the delimiters are identical, nesting is not possible and a simplified
-% approach is used. The test concept here is the same as for the case where
-% the delimiters are different but there cannot be any nesting.
-% \begin{macrocode}
-\cs_new:Npn \@@_expandable_grab_D_alt:w #1 \q_@@ #2#3
- { #2 { \@@_expandable_grab_D_alt:NNwNNn #1 \q_@@ #2 #3 } }
-\cs_set_protected:Npn \@@_tmp:w #1
- {
- \cs_new:Npn \@@_expandable_grab_D_alt:NNwNNn ##1##2##3 \q_@@ ##4##5##6
- {
- \str_if_eq:nnTF {##6} {##2}
- {
- \str_if_eq:onTF
- { ##1 { } ##6 ##2 ##2 }
- { { } ##2 }
- }
- { \use_ii:nn }
- {
- ##1
- { \@@_expandable_grab_D_alt:NNwn ##4 ##5 ##3 \q_@@ }
- ##6 \ERROR
- }
- { ##3 {#1} \q_@@ ##4 ##5 {##6} }
- }
- }
-\exp_args:No \@@_tmp:w { \c_novalue_tl }
-\cs_new:Npn \@@_expandable_grab_D_alt:NNwn #1#2#3 \q_@@ #4
- {
- \tl_if_blank:oTF { \use_none:n #4 }
- { \@@_put_arg_expandable:ow { \use_none:n #4 } }
- {
- \str_if_eq:eeTF
- { \exp_not:o { \use_none:n #4 } }
- { { \exp_not:o { \use_ii:nnn #4 \q_nil } } }
- { \@@_put_arg_expandable:ow { \use_ii:nn #4 } }
- { \@@_put_arg_expandable:ow { \use_none:n #4 } }
- }
- #3 \q_@@ #1 #2
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_expandable_grab_E:w, \@@_expandable_grab_E_long:w}
-% \begin{macro}[EXP]{\@@_expandable_grab_E_aux:w}
-% \begin{macro}[EXP]{\@@_expandable_grab_E_test:nnw}
-% \begin{macro}[EXP]{\@@_expandable_grab_E_loop:nnnNNw}
-% \begin{macro}[EXP]{\@@_expandable_grab_E_find:w}
-% \begin{macro}[EXP]{\@@_expandable_grab_E_find:nnw}
-% \begin{macro}[EXP]{\@@_expandable_grab_E_end:nnw}
-% We keep track of long/short by placing the appropriate grabber as
-% the third token after \cs{q_@@}; it is eventually removed by the
-% \texttt{end:nnw} auxiliary. The \texttt{aux:w} auxiliary will be
-% called repeatedly with two arguments: the set
-% of pairs \meta{parser} \meta{token}, and the set of arguments found
-% so far (initially all |{-NoValue-}|). At each step, grab what
-% follows in the input stream then call the \texttt{loop:nnnNNw}
-% auxiliary to compare it with each possible embellishment in turn.
-% This auxiliary's |#1| is what was found in the input, |#2| collects
-% \meta{parser} \meta{token} pairs that did not match, |#3| collects
-% the corresponding arguments found previously, |#4| and |#5| is the
-% current pair, |#6| is the remaining pairs, |#7| is empty or two
-% \cs{q_nil}, and |#8| is the current argument. If none of the pairs
-% matched (determined by \cs{quark_if_nil:NTF}) then call the
-% \texttt{end} auxiliary to stop looking for embellishments,
-% remembering to put what was grabbed in the input back where it
-% belongs, and storing the arguments found just before \cs{q_@@}. If
-% the current argument |#8| is not |-NoValue-| or if the input |#1|
-% does not match |#5| (see \texttt{t}-type arguments below for a
-% similar \cs{str_if_eq:onTF} test) then carry on the loop.
-% Otherwise, we found a new embellishment: grab the corresponding
-% argument in the input using the \texttt{find:w} auxiliary. To avoid
-% losing braces around that auxiliary's argument we include a
-% space, which will be eliminated in the next loop through
-% embellishments.
-% \begin{macrocode}
-\cs_new:Npn \@@_expandable_grab_E:w #1 \q_@@ #2#3
- { \@@_expandable_grab_E_aux:w #1 \q_@@ #2 #3 #3 }
-\cs_new:Npn \@@_expandable_grab_E_long:w #1 \q_@@ #2#3
- { \@@_expandable_grab_E_aux:w #1 \q_@@ #2 #3 #2 }
-\cs_new:Npn \@@_expandable_grab_E_aux:w #1 \q_@@ #2#3#4
- { #2 { \@@_expandable_grab_E_test:nnw #1 \q_@@ #2 #3 #4 } }
-\cs_new:Npn \@@_expandable_grab_E_test:nnw #1#2#3 \q_@@ #4#5#6#7
- {
- \@@_expandable_grab_E_loop:nnnNNw {#7} { } { }
- #1 \q_nil \q_nil \q_nil \q_mark #2 \q_nil
- #3 \q_@@ #4 #5 #6
- }
-\cs_new:Npn \@@_expandable_grab_E_loop:nnnNNw
- #1#2#3#4#5#6 \q_nil #7 \q_mark #8
- {
- \quark_if_nil:NTF #4
- { \@@_expandable_grab_E_end:nnw {#1} {#3} }
- {
- \tl_if_novalue:nTF {#8}
- { \str_if_eq:onTF { #4 { } #1 #5 } {#5} }
- { \use_ii:nn }
- { \@@_expandable_grab_E_find:w { #2 #4 #5 #6 } {#3} ~ }
- {
- \@@_expandable_grab_E_loop:nnnNNw
- {#1} { #2 #4 #5 } { #3 {#8} }
- #6 \q_nil #7 \q_mark
- }
- }
- }
-\cs_new:Npn \@@_expandable_grab_E_find:w #1 \q_@@ #2#3#4
- { #4 { \@@_expandable_grab_E_find:nnw #1 \q_@@ #2 #3 #4 } }
-\cs_new:Npn \@@_expandable_grab_E_find:nnw #1#2#3 \q_nil #4 \q_@@ #5#6#7#8
- { \@@_expandable_grab_E_aux:w {#1} { #2 {#8} #3 } #4 \q_@@ #5 #6 #7 }
-\cs_new:Npn \@@_expandable_grab_E_end:nnw #1#2#3 \q_@@ #4#5#6
- { #3 #2 \q_@@ #4 #5 {#1} }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_expandable_grab_m:w, \@@_expandable_grab_m_long:w}
-% \begin{macro}[EXP]{\@@_expandable_grab_m_aux:wNn}
-% The mandatory case is easy: find the auxiliary after the \cs{q_@@},
-% and use it directly to grab the argument, then correctly position
-% the argument before \cs{q_@@}.
-% \begin{macrocode}
-\cs_new:Npn \@@_expandable_grab_m:w #1 \q_@@ #2#3
- { #3 { \@@_expandable_grab_m_aux:wNn #1 \q_@@ #2 #3 } }
-\cs_new:Npn \@@_expandable_grab_m_long:w #1 \q_@@ #2#3
- { #2 { \@@_expandable_grab_m_aux:wNn #1 \q_@@ #2 #3 } }
-\cs_new:Npn \@@_expandable_grab_m_aux:wNn #1 \q_@@ #2#3#4
- { #1 {#4} \q_@@ #2 #3 }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_expandable_grab_R:w}
-% \begin{macro}[EXP]{\@@_expandable_grab_R_aux:NNNwNNn}
-% Much the same as for the \texttt{D}-type argument, with only the lead-off
-% function varying.
-% \begin{macrocode}
-\cs_new:Npn \@@_expandable_grab_R:w #1 \q_@@ #2#3
- { #2 { \@@_expandable_grab_R_aux:NNNwNNn #1 \q_@@ #2#3 } }
-\cs_set_protected:Npn \@@_tmp:w #1
- {
- \cs_new:Npn \@@_expandable_grab_R_aux:NNNwNNn ##1##2##3##4 \q_@@ ##5##6##7
- {
- \str_if_eq:nnTF {##7} {##2}
- {
- \str_if_eq:onTF
- { ##1 { } { } ##7 ##2 \q_@@ ##3 }
- { { } {##2} { } }
- }
- { \use_ii:nn }
- {
- ##1
- { \@@_expandable_grab_D:NNNwNNnnn ##1##2##3##4 \q_@@ ##5##6 }
- \q_nil { } ##2 \ERROR \q_@@ \ERROR
- }
- {
- \__kernel_msg_expandable_error:nnff
- { xparse } { missing-required }
- { \exp_args:Nf \tl_trim_spaces:n { \token_to_str:N ##5 } }
- { \tl_to_str:n {##2} }
- ##4 {#1} \q_@@ ##5 ##6 {##7}
- }
- }
- }
-\exp_args:No \@@_tmp:w { \c_novalue_tl }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_expandable_grab_R_alt:w}
-% \begin{macro}[EXP]{\@@_expandable_grab_R_alt_aux:NNwNNn}
-% When the delimiters are identical, nesting is not possible and a simplified
-% approach is used. The test concept here is the same as for the case where
-% the delimiters are different.
-% \begin{macrocode}
-\cs_new:Npn \@@_expandable_grab_R_alt:w #1 \q_@@ #2#3
- { #2 { \@@_expandable_grab_R_alt_aux:NNwNNn #1 \q_@@ #2#3 } }
-\cs_set_protected:Npn \@@_tmp:w #1
- {
- \cs_new:Npn \@@_expandable_grab_R_alt_aux:NNwNNn ##1##2##3 \q_@@ ##4##5##6
- {
- \str_if_eq:nnTF {##6} {##2}
- {
- \str_if_eq:onTF
- { ##1 { } ##6 ##2 ##2 }
- { { } ##2 }
- }
- { \use_ii:nn }
- {
- ##1
- { \@@_expandable_grab_D_alt:NNwn ##4 ##5 ##3 \q_@@ }
- ##6 \ERROR
- }
- {
- \__kernel_msg_expandable_error:nnff
- { xparse } { missing-required }
- { \exp_args:Nf \tl_trim_spaces:n { \token_to_str:N ##4 } }
- { \tl_to_str:n {##2} }
- ##3 {#1} \q_@@ ##4 ##5 {##6}
- }
- }
- }
-\exp_args:No \@@_tmp:w { \c_novalue_tl }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\@@_expandable_grab_t:w}
-% \begin{macro}[EXP]{\@@_expandable_grab_t_aux:NNwn}
-% As for a \texttt{D}-type argument, here we compare the grabbed tokens using
-% the only parser we have in order to work out if |#2| is exactly equal to
-% the output of the grabber.
-% \begin{macrocode}
-\cs_new:Npn \@@_expandable_grab_t:w #1 \q_@@ #2#3
- { #2 { \@@_expandable_grab_t_aux:NNwn #1 \q_@@ #2 #3 } }
-\cs_new:Npn \@@_expandable_grab_t_aux:NNwn #1#2#3 \q_@@ #4#5#6
- {
- \str_if_eq:onTF { #1 { } #6 #2 } {#2}
- { #3 { \BooleanTrue } \q_@@ #4 #5 }
- { #3 { \BooleanFalse } \q_@@ #4 #5 {#6} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \begin{macro}[EXP]{\@@_expandable_grab_u:w}
% It turns out there is nothing to do: this is followed by an
% auxiliary named after the function, that does everything.
@@ -4144,986 +1330,8 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]
-% {\@@_put_arg_expandable:nw, \@@_put_arg_expandable:ow}
-% A useful helper, to store arguments when they are ready.
-% \begin{macrocode}
-\cs_new:Npn \@@_put_arg_expandable:nw #1#2 \q_@@ { #2 {#1} \q_@@ }
-\cs_generate_variant:Nn \@@_put_arg_expandable:nw { o }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Argument processors}
-%
-% \begin{macro}{\@@_bool_reverse:N}
-% A simple reversal.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_bool_reverse:N #1
- {
- \bool_if:NTF #1
- { \tl_set:Nn \ProcessedArgument { \c_false_bool } }
- { \tl_set:Nn \ProcessedArgument { \c_true_bool } }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{variable}{\l_@@_split_list_seq, \l_@@_split_list_tl}
-% \begin{macro}{\@@_split_list:nn}
-% \begin{macro}{\@@_split_list_multi:nn, \@@_split_list_multi:nV}
-% \begin{macro}{\@@_split_list_single:Nn}
-% Splitting can take place either at a single token or at a longer
-% identifier. To deal with single active tokens, a two-part procedure is
-% needed.
% \begin{macrocode}
-\seq_new:N \l_@@_split_list_seq
-\tl_new:N \l_@@_split_list_tl
-\cs_new_protected:Npn \@@_split_list:nn #1#2
- {
- \tl_if_single:nTF {#1}
- {
- \token_if_cs:NTF #1
- { \@@_split_list_multi:nn {#1} {#2} }
- { \@@_split_list_single:Nn #1 {#2} }
- }
- { \@@_split_list_multi:nn {#1} {#2} }
- }
-\cs_new_protected:Npn \@@_split_list_multi:nn #1#2
- {
- \seq_set_split:Nnn \l_@@_split_list_seq {#1} {#2}
- \tl_clear:N \ProcessedArgument
- \seq_map_inline:Nn \l_@@_split_list_seq
- { \tl_put_right:Nn \ProcessedArgument { {##1} } }
- }
-\cs_generate_variant:Nn \@@_split_list_multi:nn { nV }
-\group_begin:
-\char_set_catcode_active:N \^^@
-\cs_new_protected:Npn \@@_split_list_single:Nn #1#2
- {
- \tl_set:Nn \l_@@_split_list_tl {#2}
- \group_begin:
- \char_set_lccode:nn { `\^^@ } { `#1 }
- \tex_lowercase:D
- {
- \group_end:
- \tl_replace_all:Nnn \l_@@_split_list_tl { ^^@ }
- } {#1}
- \@@_split_list_multi:nV {#1} \l_@@_split_list_tl
- }
-\group_end:
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{variable}
-%
-% \begin{macro}{\@@_split_argument:nnn}
-% \begin{macro}{\@@_split_argument_aux:nnnn}
-% \begin{macro}[EXP]{\@@_split_argument_aux:n}
-% \begin{macro}[rEXP]{\@@_split_argument_aux:wn}
-% Splitting to a known number of items is a special version of splitting
-% a list, in which the limit is hard-coded and where there will always be
-% exactly the correct number of output items. An auxiliary function is
-% used to save on working out the token list length several times.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_split_argument:nnn #1#2#3
- {
- \@@_split_list:nn {#2} {#3}
- \exp_args:Nf \@@_split_argument_aux:nnnn
- { \tl_count:N \ProcessedArgument }
- {#1} {#2} {#3}
- }
-\cs_new_protected:Npn \@@_split_argument_aux:nnnn #1#2#3#4
- {
- \int_compare:nNnF {#1} = { #2 + 1 }
- {
- \int_compare:nNnTF {#1} > { #2 + 1 }
- {
- \tl_set:Nx \ProcessedArgument
- {
- \exp_last_unbraced:NnNo
- \@@_split_argument_aux:n
- { #2 + 1 }
- \use_none_delimit_by_q_stop:w
- \ProcessedArgument
- \q_stop
- }
- \__kernel_msg_error:nnxxx { xparse } { split-excess-tokens }
- { \tl_to_str:n {#3} } { \int_eval:n { #2 + 1 } }
- { \tl_to_str:n {#4} }
- }
- {
- \tl_put_right:Nx \ProcessedArgument
- {
- \prg_replicate:nn { #2 + 1 - (#1) }
- { { \exp_not:V \c_novalue_tl } }
- }
- }
- }
- }
-% \end{macrocode}
-% Auxiliaries to leave exactly the correct number of arguments in
-% \cs{ProcessedArgument}.
-% \begin{macrocode}
-\cs_new:Npn \@@_split_argument_aux:n #1
- { \prg_replicate:nn {#1} { \@@_split_argument_aux:wn } }
-\cs_new:Npn \@@_split_argument_aux:wn #1 \use_none_delimit_by_q_stop:w #2
- {
- \exp_not:n { {#2} }
- #1
- \use_none_delimit_by_q_stop:w
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_trim_spaces:n}
-% This one is almost trivial.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_trim_spaces:n #1
- { \tl_set:Nx \ProcessedArgument { \tl_trim_spaces:n {#1} } }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Access to the argument specification}
-%
-% \begin{macro}{\@@_get_arg_spec_error:N, \@@_get_arg_spec_error:n}
-% \begin{macro}{\@@_get_arg_spec_error_aux:n}
-% Provide an informative error when trying to get the argument
-% specification of a non-\pkg{xparse} command or environment.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_get_arg_spec_error:N #1
- {
- \bool_set_false:N \l_@@_environment_bool
- \tl_set:Nn \l_@@_fn_tl {#1}
- \@@_get_arg_spec_error_aux:n { \cs_if_exist:NTF #1 }
- }
-\cs_new_protected:Npn \@@_get_arg_spec_error:n #1
- {
- \bool_set_true:N \l_@@_environment_bool
- \str_set:Nx \l_@@_environment_str {#1}
- \@@_get_arg_spec_error_aux:n
- { \cs_if_exist:cTF { \l_@@_environment_str } }
- }
-\cs_new_protected:Npn \@@_get_arg_spec_error_aux:n #1
- {
- #1
- {
- \__kernel_msg_error:nnx { xparse } { non-xparse }
- { \@@_environment_or_command: }
- }
- {
- \__kernel_msg_error:nnx { xparse } { unknown }
- { \@@_environment_or_command: }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_get_arg_spec:NTF}
-% If the command is not an \pkg{xparse} command, complain. If it is,
-% its second \enquote{item} is the argument specification.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_get_arg_spec:NTF #1#2#3
- {
- \@@_cmd_if_xparse:NTF #1
- {
- \tl_set:Nx \ArgumentSpecification { \tl_item:Nn #1 { 2 } }
- #2
- }
- {#3}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_get_arg_spec:N}
-% \begin{macro}{\@@_get_arg_spec:n}
-% \begin{variable}{\ArgumentSpecification}
-% Recovering the argument specification is now trivial.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_get_arg_spec:N #1
- {
- \@@_get_arg_spec:NTF #1 { }
- { \@@_get_arg_spec_error:N #1 }
- }
-\cs_new_protected:Npn \@@_get_arg_spec:n #1
- {
- \exp_args:Nc \@@_get_arg_spec:NTF
- { environment~ \tl_to_str:n {#1} }
- { }
- { \@@_get_arg_spec_error:n {#1} }
- }
-\tl_new:N \ArgumentSpecification
-% \end{macrocode}
-% \end{variable}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_show_arg_spec:N}
-% \begin{macro}{\@@_show_arg_spec:n}
-% Showing the argument specification simply means finding it and then
-% calling the \cs{tl_show:N} function.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_show_arg_spec:N #1
- {
- \@@_get_arg_spec:NTF #1
- { \tl_show:N \ArgumentSpecification }
- { \@@_get_arg_spec_error:N #1 }
- }
-\cs_new_protected:Npn \@@_show_arg_spec:n #1
- {
- \exp_args:Nc \@@_get_arg_spec:NTF
- { environment~ \tl_to_str:n {#1} }
- { \tl_show:N \ArgumentSpecification }
- { \@@_get_arg_spec_error:n {#1} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Utilities}
-%
-% \begin{macro}{\@@_check_definable:nNT, \@@_check_definable_aux:nN}
-% Check that a token list is appropriate as a first argument of
-% \cs{NewDocumentCommand} and similar functions and otherwise
-% produce an error. First trim whitespace to allow for spaces around
-% the actual command to be defined. If the result has multiple
-% tokens, it is not a valid argument. The single token is a control
-% sequence exactly if its string representation has more than one
-% character (using \cs{token_to_str:N} rather than \cs{tl_to_str:n}
-% to avoid problems with macro parameter characters, and setting
-% \cs{tex_escapechar:D} to prevent it from being non-printable).
-% Finally, check for an active character: this is done by lowercasing
-% the token to fix its character code (arbitrarily to that of~|?|)
-% and comparing the result to an active~|?|. Both control sequences
-% and active characters are valid arguments, and non-active character
-% tokens are not. In all cases, the group opened to keep assignments
-% local must be closed.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_check_definable:nNT #1
- { \tl_trim_spaces_apply:nN {#1} \@@_check_definable_aux:nN }
-\group_begin:
- \char_set_catcode_active:n { `? }
- \cs_new_protected:Npn \@@_check_definable_aux:nN #1#2
- {
- \group_begin:
- \tl_if_single_token:nTF {#1}
- {
- \int_set:Nn \tex_escapechar:D { 92 }
- \exp_args:Nx \tl_if_empty:nTF
- { \exp_args:No \str_tail:n { \token_to_str:N #1 } }
- {
- \exp_args:Nx \char_set_lccode:nn
- { ` \str_head:n {#1} } { `? }
- \tex_lowercase:D { \tl_if_eq:nnTF {#1} } { ? }
- { \group_end: \use_iii:nnn }
- { \group_end: \use_i:nnn }
- }
- { \group_end: \use_iii:nnn }
- }
- { \group_end: \use_ii:nnn }
- {
- \__kernel_msg_error:nnxx { xparse } { not-definable }
- { \tl_to_str:n {#1} } { \token_to_str:N #2 }
- }
- {
- \__kernel_msg_error:nnxx { xparse } { not-one-token }
- { \tl_to_str:n {#1} } { \token_to_str:N #2 }
- }
- }
-\group_end:
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_token_if_cs:NTF}
-% Based on the definition of \cs{@@_check_definable_aux:nN} above, but
-% only checks for an actual control sequence (\emph{i.e.},
-% \cs[no-index]{\meta{anything}}). \cs{tex_escapechar:D} is
-% temporarily changed to a known value and then it checks if
-% |\string#1| contains more than one character: if it does, it's a
-% control sequence. This test differs from \cs{token_if_cs:NTF} for
-% example in \verb|\token_if_cs:NTF \c_group_begin_token {T}{F}|,
-% where \cs{token_if_cs:NTF} returns false.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_token_if_cs:NTF #1
- {
- \group_begin:
- \int_set:Nn \tex_escapechar:D { 92 }
- \exp_args:Nx \tl_if_empty:nTF
- { \exp_args:No \str_tail:n { \token_to_str:N #1 } }
- { \group_end: \use_ii:nn }
- { \group_end: \use_i:nn }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_tl_mapthread_function:NNN, \@@_tl_mapthread_function:nnN}
-% \begin{macro}{\@@_tl_mapthread_loop:w}
-% Analogue of \cs{seq_mapthread_function:NNN} for token lists.
-% \begin{macrocode}
-\cs_new:Npn \@@_tl_mapthread_function:NNN #1#2#3
- {
- \exp_after:wN \exp_after:wN
- \exp_after:wN \@@_tl_mapthread_loop:w
- \exp_after:wN \exp_after:wN
- \exp_after:wN #3
- \exp_after:wN #1
- \exp_after:wN \q_recursion_tail
- \exp_after:wN \q_mark
- #2
- \q_recursion_tail
- \q_recursion_stop
- }
-\cs_new:Npn \@@_tl_mapthread_function:nnN #1#2#3
- {
- \@@_tl_mapthread_loop:w #3
- #1 \q_recursion_tail \q_mark
- #2 \q_recursion_tail \q_recursion_stop
- }
-\cs_new:Npn \@@_tl_mapthread_loop:w #1#2#3 \q_mark #4
- {
- \quark_if_recursion_tail_stop:n {#2}
- \quark_if_recursion_tail_stop:n {#4}
- #1 {#2} {#4}
- \@@_tl_mapthread_loop:w #1#3 \q_mark
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_cmd_if_xparse:NTF}
-% \begin{macro}{\@@_cmd_if_xparse_aux:N}
-% To determine whether the command is an \pkg{xparse} command check
-% that its |arg_spec| is empty (this also excludes non-macros) and
-% that its |replacement_spec| starts with either \cs{@@_start:nNNnnn}
-% (non-expandable command) or \cs{@@_start_expandable:nNNNNn}
-% (expandable command) or \cs{@@_start_env:nnnnn} (environment).
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_cmd_if_xparse:NTF #1
- {
- \exp_args:Nf \str_case_e:nnTF
- {
- \exp_args:Nf \tl_if_empty:nT { \cs_argument_spec:N #1 }
- {
- \exp_last_unbraced:Nf \@@_cmd_if_xparse_aux:w
- { \cs_replacement_spec:N #1 } ~ \q_stop
- }
- }
- {
- { \token_to_str:N \@@_start:nNNnnn } { }
- { \token_to_str:N \@@_start_expandable:nNNNNn } { }
- { \token_to_str:N \@@_start_env:nnnnn } { }
- }
- }
-\cs_new:Npn \@@_cmd_if_xparse_aux:w #1 ~ #2 \q_stop {#1}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_peek_nonspace:NTF, \@@_peek_nonspace_remove:NTF, \@@_peek_nonspace_aux:nNNTF}
-% Collect spaces in a loop, and put the collected spaces back in the
-% false branch of a call to \cs{peek_meaning:NTF} or
-% \cs{peek_meaning_remove:NTF}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_peek_nonspace:NTF
- { \@@_peek_nonspace_aux:nNNTF { } \@@_peek_meaning:NTF }
-\cs_new_protected:Npn \@@_peek_nonspace_remove:NTF
- { \@@_peek_nonspace_aux:nNNTF { } \@@_peek_meaning_remove:NTF }
-\cs_new_protected:Npn \@@_peek_nonspace_aux:nNNTF #1#2#3#4#5
- {
- \peek_meaning_remove:NTF \c_space_token
- { \@@_peek_nonspace_aux:nNNTF { #1 ~ } #2 #3 {#4} {#5} }
- { #2 #3 { #4 } { #5 #1 } }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_peek_meaning:NTF, \@@_peek_meaning_remove:NTF}
-% \begin{macro}{\@@_peek_cs_check_equal:NNN, \@@_peek_meaning_aux:NNTF, \@@_peek_true_remove:NNw}
-% Peek ahead for a token with a given meaning. In case the search
-% token is a control sequence, also check that the \meta{csname} is
-% the same as the control sequence peeked at. This extra verification
-% is necessary when the command is delimited by control sequence tokens
-% (as opposed to character tokens), and we want the the exact same
-% control sequence to match.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_peek_meaning:NTF
- { \@@_peek_meaning_aux:NNTF \c_false_bool }
-\cs_new_protected:Npn \@@_peek_meaning_remove:NTF
- { \@@_peek_meaning_aux:NNTF \c_true_bool }
-\cs_new_protected:Npn \@@_peek_meaning_aux:NNTF #1#2#3#4
- {
- \tl_set:Nn \l_@@_tmpa_tl {#3}
- \tl_set:Nn \l_@@_tmpb_tl {#4}
- \peek_meaning:NTF #2
- {
- \token_if_eq_meaning:NNTF #2 \c_group_begin_token
- { \@@_peek_true_remove:Nw #1 }
- {
- \@@_token_if_cs:NTF #2
- { \@@_peek_cs_check_equal:NNN #1 #2 }
- { \@@_peek_true_remove:Nw #1 }
- }
- }
- { \l_@@_tmpb_tl }
- }
-\cs_new_protected:Npn \@@_peek_cs_check_equal:NNN #1#2#3
- {
- \str_if_eq:nnTF {#2} {#3}
- { \@@_peek_true_remove:Nw #1 }
- { \l_@@_tmpb_tl }
- #3
- }
-\cs_new_protected:Npn \@@_peek_true_remove:Nw #1
- {
- \bool_if:NTF #1
- {
- \tex_afterassignment:D \l_@@_tmpa_tl
- \cs_set_eq:NN \@@_tmp:w
- }
- { \l_@@_tmpa_tl }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Messages}
-%
-% \begin{macro}{\@@_environment_or_command:}
-% \begin{variable}{\c_@@_ignore_def_tl}
-% Two texts used in several messages.
-% \begin{macrocode}
-\cs_new:Npn \@@_environment_or_command:
- {
- \bool_if:NTF \l_@@_environment_bool
- { environment ~ ' \l_@@_environment_str ' }
- {
- command ~ '
- \exp_args:Nf \tl_trim_spaces:n
- { \exp_after:wN \token_to_str:N \l_@@_fn_tl }
- '
- }
- }
-\tl_const:Nn \c_@@_ignore_def_tl
- { \\ \\ LaTeX~will~ignore~this~entire~definition. }
-% \end{macrocode}
-% \end{variable}
-% \end{macro}
-%
-% Some messages intended as errors when defining commands/environments.
-% \begin{macrocode}
-\__kernel_msg_new:nnnn { xparse } { arg-after-body }
- { In~the~definition~of~#1,~b~(body)~argument~must~be~last. }
- {
- The~'body'~argument~type~is~followed~by~'#2'~in~the~argument~
- specification~of~the~#1.~This~is~not~allowed.
- \c_@@_ignore_def_tl
- }
-\__kernel_msg_new:nnnn { xparse } { bad-arg-spec }
- { Bad~argument~specification~'#2'~for~#1. }
- {
- The~argument~specification~provided~was~not~valid:~
- one~or~more~mandatory~pieces~of~information~were~missing.
- \c_@@_ignore_def_tl
- }
-\__kernel_msg_new:nnnn { xparse } { command-already-defined }
- { Command~'#1'~already~defined! }
- {
- You~have~used~#2~
- with~a~command~that~already~has~a~definition. \\ \\
- The~existing~definition~of~'#1'~will~not~be~altered.
- }
-\__kernel_msg_new:nnnn { xparse } { command-not-yet-defined }
- { Command ~'#1'~not~yet~defined! }
- {
- You~have~used~#2~
- with~a~command~that~was~never~defined.
- \c_@@_ignore_def_tl
- }
-\__kernel_msg_new:nnnn { xparse } { environment-already-defined }
- { Environment~'#1'~already~defined! }
- {
- You~have~used~\NewDocumentEnvironment
- with~an~environment~that~already~has~a~definition. \\ \\
- The~existing~definition~of~'#1'~will~not~be~altered.
- }
-\__kernel_msg_new:nnnn { xparse } { environment-not-yet-defined }
- { Environment~'#1'~not~yet~defined! }
- {
- You~have~used~\RenewDocumentEnvironment
- with~an~environment~that~was~never~defined.
- \c_@@_ignore_def_tl
- }
-\__kernel_msg_new:nnnn { xparse } { expandable-ending-optional }
- {
- Argument~specification~'#2'~for~expandable~command~'#1'~
- ends~with~optional~argument.
- }
- {
- Expandable~commands~must~have~a~final~mandatory~argument~
- (or~no~arguments~at~all).~You~cannot~have~a~terminal~optional~
- argument~with~expandable~commands.
- }
-\__kernel_msg_new:nnnn { xparse } { inconsistent-long }
- { Inconsistent~long~arguments~for~expandable~command~'#1'. }
- {
- The~arguments~for~an~expandable~command~must~not~involve~short~
- arguments~after~long~arguments.~You~have~tried~to~mix~the~two~types.
- }
-\__kernel_msg_new:nnnn { xparse } { invalid-command-arg }
- { Argument~type~'#2'~not~available~for~#1. }
- {
- The~letter~'#2'~can~only~be~used~in~environment~argument~
- specifications,~not~for~commands.
- \\ \\
- LaTeX~will~ignore~this~entire~definition.
- }
-\__kernel_msg_new:nnnn { xparse } { invalid-expandable-argument-type }
- { Argument~type~'#2'~not~available~for~expandable~command~'#1'. }
- {
- The~letter~'#2'~specifies~an~argument~type~which~cannot~be~used~
- in~an~expandable~command.
- \c_@@_ignore_def_tl
- }
-\__kernel_msg_new:nnnn { xparse } { invalid-after-optional-expandably }
- {
- Argument~type~'#2'~not~available~after~optional~argument~
- for~expandable~command~'#1'.
- }
- {
- The~letter~'#2'~specifies~an~argument~type~which~cannot~be~used~
- in~an~expandable~command~after~an~optional~argument.
- \c_@@_ignore_def_tl
- }
-\__kernel_msg_new:nnnn { xparse } { non-trailing-obey-spaces }
- { Prefix~'!'~used~before~mandatory~argument~'#2'~of~#1. }
- {
- The~prefix~'!'~can~only~apply~to~trailing~optional~arguments.
- \c_@@_ignore_def_tl
- }
-\__kernel_msg_new:nnnn { xparse } { not-definable }
- { First~argument~of~'#2'~must~be~a~command. }
- {
- The~first~argument~of~'#2'~should~be~the~document~command~that~will~
- be~defined.~The~provided~argument~'#1'~is~a~character.~Perhaps~a~
- backslash~is~missing?
- \c_@@_ignore_def_tl
- }
-\__kernel_msg_new:nnnn { xparse } { not-one-token }
- { First~argument~of~'#2'~must~be~a~command. }
- {
- The~first~argument~of~'#2'~should~be~the~document~command~that~will~
- be~defined.~The~provided~argument~'#1'~contains~more~than~one~
- token.~Perhaps~a~backslash~is~missing?
- \c_@@_ignore_def_tl
- }
-\__kernel_msg_new:nnnn { xparse } { not-single-token }
- {
- Argument~delimiter~'#2'~for~the~#1~should~be~
- a~single~non-space~token.
- }
- {
- The~argument~specification~provided~was~not~valid:~in~a~place~
- where~a~single~token~is~required,~LaTeX~found~'#2'.
- \c_@@_ignore_def_tl
- }
-\__kernel_msg_new:nnnn { xparse } { forbidden-implicit-group-token }
- { Argument~delimiter~'#2'~for~the~#1~is~not~allowed. }
- {
- The~argument~specification~provided~was~not~valid:~the~implicit~
- #3-group~token~'#2'~is~not~allowed~as~an~argument~delimiter.
- \c_@@_ignore_def_tl
- }
-\__kernel_msg_new:nnnn { xparse } { processor-in-expandable }
- { Argument~processor~'>{#2}'~cannot~be~used~for~the~expandable~command~'#1'. }
- {
- The~argument~specification~for~#1~contains~a~processor~function:~
- this~is~only~supported~for~standard~robust~commands.
- \c_@@_ignore_def_tl
- }
-\__kernel_msg_new:nnnn { xparse } { too-many-arguments }
- { Too~many~arguments~in~argument~specification~'#2'~of~#1. }
- {
- The~argument~specification~provided~has~more~than~9~arguments.~
- This~cannot~be~implemented.
- \c_@@_ignore_def_tl
- }
-\__kernel_msg_new:nnnn { xparse } { two-markers }
- { Two~'#2'~apply~to~the~same~argument~in~argument~specification~of~#1. }
- {
- The~argument~specification~provided~has~two~markers~'#2'~applying~
- to~the~same~argument;~these~are~redundant.
- }
-\__kernel_msg_new:nnnn { xparse } { unknown-argument-type }
- { Unknown~argument~type~'#2'~for~the~#1. }
- {
- The~letter~'#2'~does~not~specify~a~known~argument~type.
- \c_@@_ignore_def_tl
- }
-% \end{macrocode}
-%
-% Errors when using commands/environments. The \texttt{if-boolean}
-% message is always used in expandable errors. The
-% \texttt{loop-in-defaults} and \texttt{missing-required} messages can
-% be expandable or not expandable.
-% \begin{macrocode}
-\__kernel_msg_new:nnn { xparse } { if-boolean }
- { Invalid~use~\iow_char:N\\IfBooleanTF~{#1} }
-\__kernel_msg_new:nnnn { xparse } { loop-in-defaults }
- { Defaults~of~#1~have~circular~dependency. }
- {
- The~default~values~of~two~or~more~arguments~of~the~#1~
- depend~on~each~other~in~a~way~that~cannot~be~resolved.
- }
-\__kernel_msg_new:nnnn { xparse } { missing-required }
- { Missing~required~argument~for~#1. }
- {
- The~current~#1~expects~an~argument~starting~with~'#2'.~
- LaTeX~did~not~find~it,~and~will~insert~a~default~value~to~be~processed.
- }
-\__kernel_msg_new:nnnn { xparse } { non-xparse }
- { \str_uppercase:n #1~not~defined~using~xparse. }
- {
- You~have~asked~for~the~argument~specification~for~the~#1,~
- but~this~was~not~defined~using~xparse.
- }
-\__kernel_msg_new:nnnn { xparse } { split-excess-tokens }
- { Too~many~'#1'~tokens~when~trying~to~split~argument. }
- {
- LaTeX~was~asked~to~split~the~input~'#3'~
- at~each~occurrence~of~the~token~'#1',~up~to~a~maximum~of~#2~parts.~
- There~were~too~many~'#1'~tokens.
- }
-\__kernel_msg_new:nnnn { xparse } { unknown }
- { Unknown~document~#1. }
- {
- You~have~asked~for~the~argument~specification~for~the~#1,~
- but~it~is~not~defined.
- }
-\__kernel_msg_new:nnnn { xparse } { verbatim-newline }
- { Verbatim~argument~of~#1~ended~by~end~of~line. }
- {
- The~verbatim~argument~of~the~#1~cannot~contain~more~than~one~line,~
- but~the~end~
- of~the~current~line~has~been~reached.~You~may~have~forgotten~the~
- closing~delimiter.
- \\ \\
- LaTeX~will~ignore~'#2'.
- }
-\__kernel_msg_new:nnnn { xparse } { verbatim-tokenized }
- { The~verbatim~#1~cannot~be~used~inside~an~argument. }
- {
- The~#1~takes~a~verbatim~argument.~
- It~may~not~appear~within~the~argument~of~another~function.~
- It~received~an~illegal~token \tl_if_empty:nF {#3} { ~'#3' } .
- \\ \\
- LaTeX~will~ignore~'#2'.
- }
-% \end{macrocode}
-%
-% Intended more for information.
-% \begin{macrocode}
-\__kernel_msg_new:nnn { xparse } { define-command }
- {
- Defining~command~#1~
- with~sig.~'#2'~\msg_line_context:.
- }
-\__kernel_msg_new:nnn { xparse } { define-environment }
- {
- Defining~environment~'#1'~
- with~sig.~'#2'~\msg_line_context:.
- }
-\__kernel_msg_new:nnn { xparse } { redefine-command }
- {
- Redefining~command~#1~
- with~sig.~'#2'~\msg_line_context:.
- }
-\__kernel_msg_new:nnn { xparse } { redefine-environment }
- {
- Redefining~environment~'#1'~
- with~sig.~'#2'~\msg_line_context:.
- }
-\__kernel_msg_new:nnn { xparse } { optional-mandatory }
- {
- Since~the~mandatory~argument~'#1'~has~the~same~delimiter~'#2'~
- as~a~previous~optional~argument,~it~will~not~be~possible~to~
- omit~all~optional~arguments~when~calling~this~command.
- }
-\__kernel_msg_new:nnn { xparse } { unsupported-let }
- {
- The~command~'#1'~was~undefined~but~not~the~associated~commands~
- '#1~code'~and/or~'#1~defaults'.~Maybe~you~tried~using~
- \iow_char:N\\let.~This~may~lead~to~an~infinite~loop.
- }
-% \end{macrocode}
-%
-% \subsection{User functions}
-%
-% The user functions are more or less just the internal functions
-% renamed.
-%
-% \begin{macro}{\BooleanFalse}
-% \begin{macro}{\BooleanTrue}
-% Design-space names for the Boolean values.
-% \begin{macrocode}
-\cs_new_eq:NN \BooleanFalse \c_false_bool
-\cs_new_eq:NN \BooleanTrue \c_true_bool
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\NewDocumentCommand}
-% \begin{macro}{\RenewDocumentCommand}
-% \begin{macro}{\ProvideDocumentCommand}
-% \begin{macro}{\DeclareDocumentCommand}
-% The user macros are pretty simple wrappers around the internal ones.
-% There is however a check that the first argument is a single token,
-% possibly surrounded by spaces (hence the strange \cs{use:nnn}), and
-% is definable.
-% \begin{macrocode}
-\cs_new_protected:Npn \NewDocumentCommand #1#2#3
- {
- \@@_check_definable:nNT {#1} \NewDocumentCommand
- {
- \cs_if_exist:NTF #1
- {
- \__kernel_msg_error:nnxx { xparse } { command-already-defined }
- { \use:nnn \token_to_str:N #1 { } }
- { \token_to_str:N \NewDocumentCommand }
- }
- { \@@_declare_cmd:Nnn #1 {#2} {#3} }
- }
- }
-\cs_new_protected:Npn \RenewDocumentCommand #1#2#3
- {
- \@@_check_definable:nNT {#1} \RenewDocumentCommand
- {
- \cs_if_exist:NTF #1
- { \@@_declare_cmd:Nnn #1 {#2} {#3} }
- {
- \__kernel_msg_error:nnxx { xparse } { command-not-yet-defined }
- { \use:nnn \token_to_str:N #1 { } }
- { \token_to_str:N \RenewDocumentCommand }
- }
- }
- }
-\cs_new_protected:Npn \ProvideDocumentCommand #1#2#3
- {
- \@@_check_definable:nNT {#1} \ProvideDocumentCommand
- { \cs_if_exist:NF #1 { \@@_declare_cmd:Nnn #1 {#2} {#3} } }
- }
-\cs_new_protected:Npn \DeclareDocumentCommand #1#2#3
- {
- \@@_check_definable:nNT {#1} \DeclareDocumentCommand
- { \@@_declare_cmd:Nnn #1 {#2} {#3} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\NewDocumentEnvironment}
-% \begin{macro}{\RenewDocumentEnvironment}
-% \begin{macro}{\ProvideDocumentEnvironment}
-% \begin{macro}{\DeclareDocumentEnvironment}
-% Very similar for environments.
-% \begin{macrocode}
-\cs_new_protected:Npn \NewDocumentEnvironment #1#2#3#4
- {
- \cs_if_exist:cTF {#1}
- { \__kernel_msg_error:nnx { xparse } { environment-already-defined } {#1} }
- { \@@_declare_env:nnnn {#1} {#2} {#3} {#4} }
- }
-\cs_new_protected:Npn \RenewDocumentEnvironment #1#2#3#4
- {
- \cs_if_exist:cTF {#1}
- { \@@_declare_env:nnnn {#1} {#2} {#3} {#4} }
- { \__kernel_msg_error:nnx { xparse } { environment-not-yet-defined } {#1} }
- }
-\cs_new_protected:Npn \ProvideDocumentEnvironment #1#2#3#4
- { \cs_if_exist:cF {#1} { \@@_declare_env:nnnn {#1} {#2} {#3} {#4} } }
-\cs_new_protected:Npn \DeclareDocumentEnvironment #1#2#3#4
- { \@@_declare_env:nnnn {#1} {#2} {#3} {#4} }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\NewExpandableDocumentCommand}
-% \begin{macro}{\RenewExpandableDocumentCommand}
-% \begin{macro}{\ProvideExpandableDocumentCommand}
-% \begin{macro}{\DeclareExpandableDocumentCommand}
-% The expandable versions are essentially the same as the basic
-% functions. The strange \cs{use:nnn} is there in case |#1| is
-% surrounded with spaces, as can happen with usual document catcodes
-% in \cs{RenewExpandableDocumentCommand} |{| |\!| |}| \ldots{}
-% \begin{macrocode}
-\cs_new_protected:Npn \NewExpandableDocumentCommand #1#2#3
- {
- \@@_check_definable:nNT {#1} \NewExpandableDocumentCommand
- {
- \cs_if_exist:NTF #1
- {
- \__kernel_msg_error:nnxx { xparse } { command-already-defined }
- { \use:nnn \token_to_str:N #1 { } }
- { \token_to_str:N \NewExpandableDocumentCommand }
- }
- { \@@_declare_expandable_cmd:Nnn #1 {#2} {#3} }
- }
- }
-\cs_new_protected:Npn \RenewExpandableDocumentCommand #1#2#3
- {
- \@@_check_definable:nNT {#1} \RenewExpandableDocumentCommand
- {
- \cs_if_exist:NTF #1
- { \@@_declare_expandable_cmd:Nnn #1 {#2} {#3} }
- {
- \__kernel_msg_error:nnxx { xparse } { command-not-yet-defined }
- { \use:nnn \token_to_str:N #1 { } }
- { \token_to_str:N \RenewExpandableDocumentCommand }
- }
- }
- }
-\cs_new_protected:Npn \ProvideExpandableDocumentCommand #1#2#3
- {
- \@@_check_definable:nNT {#1} \ProvideExpandableDocumentCommand
- {
- \cs_if_exist:NF #1
- { \@@_declare_expandable_cmd:Nnn #1 {#2} {#3} }
- }
- }
-\cs_new_protected:Npn \DeclareExpandableDocumentCommand #1#2#3
- {
- \@@_check_definable:nNT {#1} \DeclareExpandableDocumentCommand
- { \@@_declare_expandable_cmd:Nnn #1 {#2} {#3} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\IfBooleanT, \IfBooleanF, \IfBooleanTF}
-% The logical \meta{true} and \meta{false} statements are just the
-% normal \cs{c_true_bool} and \cs{c_false_bool} so \cs{bool_if:NTF} is
-% almost enough. However, this code-level function blows up badly
-% when passed invalid input. We want \cs{IfBooleanTF} to accept a
-% single (non-space) token equal to \cs{c_true_bool} or
-% \cs{c_false_bool}, possibly surrounded by spaces. If the input is
-% blank or multiple items, jump to the error and pick the false
-% branch. If the input, ignoring spaces (we do this by omitting
-% braces in the \cs{tl_if_single_token:nF} test), is not a single
-% token then jump to the error as well. It is then safe to compare
-% the token to the two booleans, picking the appropriate branch. If
-% neither matches, we jump to the error as well.
-% \begin{macrocode}
-\cs_new:Npn \IfBooleanTF #1
- {
- \tl_if_single:nF {#1}
- { \prg_break:n { \use:n } }
- \tl_if_single_token:nF #1
- { \prg_break:n { \use:n } }
- \token_if_eq_meaning:NNT #1 \c_true_bool
- { \prg_break:n { \use_ii:nnn } }
- \token_if_eq_meaning:NNT #1 \c_false_bool
- { \prg_break:n { \use_iii:nnn } }
- \prg_break:n { \use:n }
- \prg_break_point:
- {
- \__kernel_msg_expandable_error:nnn { xparse } { if-boolean } {#1}
- \use_ii:nn
- }
- }
-\cs_new:Npn \IfBooleanT #1#2 { \IfBooleanTF {#1} {#2} { } }
-\cs_new:Npn \IfBooleanF #1 { \IfBooleanTF {#1} { } }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\IfNoValueT, \IfNoValueF, \IfNoValueTF}
-% Simple re-naming.
-% \begin{macrocode}
-\cs_new_eq:NN \IfNoValueF \tl_if_novalue:nF
-\cs_new_eq:NN \IfNoValueT \tl_if_novalue:nT
-\cs_new_eq:NN \IfNoValueTF \tl_if_novalue:nTF
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\IfValueT, \IfValueF, \IfValueTF}
-% Inverted logic.
-% \begin{macrocode}
-\cs_new:Npn \IfValueF { \tl_if_novalue:nT }
-\cs_new:Npn \IfValueT { \tl_if_novalue:nF }
-\cs_new:Npn \IfValueTF #1#2#3 { \tl_if_novalue:nTF {#1} {#3} {#2} }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ProcessedArgument}
-% Processed arguments are returned using this name, which is reserved
-% here although the definition will change.
-% \begin{macrocode}
-\tl_new:N \ProcessedArgument
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ReverseBoolean, \SplitArgument, \SplitList, \TrimSpaces}
-% Simple copies.
-% \begin{macrocode}
-\cs_new_eq:NN \ReverseBoolean \@@_bool_reverse:N
-\cs_new_eq:NN \SplitArgument \@@_split_argument:nnn
-\cs_new_eq:NN \SplitList \@@_split_list:nn
-\cs_new_eq:NN \TrimSpaces \@@_trim_spaces:n
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ProcessList}
-% To support \cs{SplitList}.
-% \begin{macrocode}
-\cs_new_eq:NN \ProcessList \tl_map_function:nN
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\GetDocumentCommandArgSpec}
-% \begin{macro}{\GetDocumentEnvironmentArgSpec}
-% \begin{macro}{\ShowDocumentCommandArgSpec}
-% \begin{macro}{\ShowDocumentEnvironmentArgSpec}
-% More simple mappings, with a check that the argument is a single
-% control sequence or active character.
-% \begin{macrocode}
-\cs_new_protected:Npn \GetDocumentCommandArgSpec #1
- {
- \@@_check_definable:nNT {#1} \GetDocumentCommandArgSpec
- { \@@_get_arg_spec:N #1 }
- }
-\cs_new_eq:NN \GetDocumentEnvironmentArgSpec \@@_get_arg_spec:n
-\cs_new_protected:Npn \ShowDocumentCommandArgSpec #1
- {
- \@@_check_definable:nNT {#1} \ShowDocumentCommandArgSpec
- { \@@_show_arg_spec:N #1 }
- }
-\cs_new_eq:NN \ShowDocumentEnvironmentArgSpec \@@_show_arg_spec:n
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macrocode}
-%<*2ekernel>
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ExplSyntaxOff
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</2ekernel>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</package|2ekernel>
+%</package>
% \end{macrocode}
%
% \end{implementation}
diff --git a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.ins b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.ins
index d40f7cd6f2a..da55996744b 100644
--- a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.ins
+++ b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.ins
@@ -2,7 +2,7 @@
File: xparse.ins
-Copyright (C) 2000-2012,2016,2017,2019,2020 The LaTeX3 Project
+Copyright (C) 2000-2012,2016,2017,2019-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -23,7 +23,7 @@ The released version of this bundle is available from CTAN.
\preamble
-Copyright (C) 2009-2020 The LaTeX3 Project
+Copyright (C) 2009-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
@@ -42,7 +42,7 @@ and all files in that bundle must be distributed together.
\keepsilent
-\generate{\file{xparse.sty} {\from{xparse.dtx} {package}}
- \file{xparse.ltx} {\from{xparse.dtx} {2ekernel}}}
+\generate{\file{xparse.sty}{\from{xparse.dtx}{package}}
+ \file{xparse.ltx}{\from{xparse.dtx}{2ekernel}}}
\endbatchfile
diff --git a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
index 2236b30f979..a20b55892e2 100644
--- a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
+++ b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx
@@ -3,8 +3,8 @@
%% File: xtemplate.dtx
%
% Copyright (C) 1999 Frank Mittelbach, Chris Rowley, David Carlisle
-% (C) 2004-2010 Frank Mittelbach, The LaTeX3 Project
-% (C) 2011-2020 The LaTeX3 Project
+% (C) 2004-2010 Frank Mittelbach, The LaTeX Project
+% (C) 2011-2021 The LaTeX Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -55,7 +55,7 @@
% }
%
% \author{^^A
-% The \LaTeX3 Project\thanks
+% The \LaTeX{} Project\thanks
% {^^A
% E-mail:
% \href{mailto:latex-team@latex-project.org}
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2020-03-06}
+% \date{Released 2021-02-02}
%
% \maketitle
%
@@ -365,7 +365,7 @@
%
% \begin{function}{\EvaluateNow}
% \begin{syntax}
-% \cs{EvaluteNow} \Arg{expression}
+% \cs{EvaluateNow} \Arg{expression}
% \end{syntax}
% The standard method when creating an instance from a template is to
% evaluate the \meta{expression} when the instance is used. However, it may
@@ -682,7 +682,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xtemplate}{2020-03-06}{}
+\ProvidesExplPackage{xtemplate}{2021-02-02}{}
{L3 Experimental prototype document functions}
% \end{macrocode}
%
@@ -858,6 +858,28 @@
% \end{macrocode}
% \end{variable}
%
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+% Internal scan marks.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\q_@@_nil}
+% Internal quarks.
+% \begin{macrocode}
+\quark_new:N \q_@@_nil
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[pTF]{\@@_quark_if_nil:n}
+% Branching quark conditional.
+% \begin{macrocode}
+\__kernel_quark_new_conditional:Nn \@@_quark_if_nil:N { F }
+% \end{macrocode}
+% \end{macro}
+%
% \subsection{Variant of prop functions}
%
% \begin{macro}[TF]{\prop_get:NoN}
@@ -1300,7 +1322,7 @@
{
\tl_clear:N \l_@@_key_name_tl
\exp_after:wN \@@_split_keytype_aux:w
- \l_@@_tmp_tl \q_stop
+ \l_@@_tmp_tl \s_@@_stop
}
}
{
@@ -1311,7 +1333,7 @@
\use:x
{
\cs_new_protected:Npn \exp_not:N \@@_split_keytype_aux:w
- ##1 \token_to_str:N : ##2 \exp_not:N \q_stop
+ ##1 \token_to_str:N : ##2 \s_@@_stop
{
\tl_put_right:Nx \exp_not:N \l_@@_key_name_tl
{ \exp_not:N \tl_to_str:n {##1} }
@@ -1319,7 +1341,7 @@
{
\tl_put_right:Nn \exp_not:N \l_@@_key_name_tl
{ \token_to_str:N : }
- \exp_not:N \@@_split_keytype_aux:w ##2 \exp_not:N \q_stop
+ \exp_not:N \@@_split_keytype_aux:w ##2 \s_@@_stop
}
{
\exp_not:N \tl_if_empty:NTF \exp_not:N \l_@@_key_name_tl
@@ -1357,7 +1379,7 @@
\tl_if_in:nnT {#1} {##1}
{
\cs_set:Npn \@@_split_keytype_arg_aux:w
- ####1 ##1 ####2 \q_stop
+ ####1 ##1 ####2 \s_@@_stop
{
\tl_if_empty:nT {####1}
{
@@ -1366,7 +1388,7 @@
\seq_map_break:
}
}
- \@@_split_keytype_arg_aux:w #1 \q_stop
+ \@@_split_keytype_arg_aux:w #1 \s_@@_stop
}
}
\seq_map_function:NN \c_@@_keytypes_arg_seq
@@ -1374,7 +1396,7 @@
}
\cs_generate_variant:Nn \@@_split_keytype_arg:n { o }
\cs_new:Npn \@@_split_keytype_arg_aux:n #1 { }
-\cs_new:Npn \@@_split_keytype_arg_aux:w #1 \q_stop { }
+\cs_new:Npn \@@_split_keytype_arg_aux:w #1 \s_@@_stop { }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1628,7 +1650,7 @@
}
{
\tl_if_in:nnTF {#1} { global }
- { \@@_parse_vars_elt_aux:w #1 \q_stop }
+ { \@@_parse_vars_elt_aux:w #1 \s_@@_stop }
{
\msg_error:nnx { xtemplate } { bad-variable }
{ \tl_to_str:n {#1} }
@@ -1637,7 +1659,7 @@
}
}
}
-\cs_new_protected:Npn \@@_parse_vars_elt_aux:w #1 global #2 \q_stop
+\cs_new_protected:Npn \@@_parse_vars_elt_aux:w #1 global #2 \s_@@_stop
{
\tl_if_empty:nTF {#1}
{
@@ -2060,10 +2082,10 @@
\bool_set_false:N \l_@@_global_bool
\tl_if_in:onT \l_@@_var_tl { global }
{
- \exp_after:wN \@@_find_global_aux:w \l_@@_var_tl \q_stop
+ \exp_after:wN \@@_find_global_aux:w \l_@@_var_tl \s_@@_stop
}
}
-\cs_new_protected:Npn \@@_find_global_aux:w #1 global #2 \q_stop
+\cs_new_protected:Npn \@@_find_global_aux:w #1 global #2 \s_@@_stop
{
\tl_set:Nn \l_@@_var_tl {#2}
\bool_set_true:N \l_@@_global_bool
@@ -2377,16 +2399,16 @@
\l_@@_value_tl
{
\exp_after:wN \@@_key_to_value_auxii:w \l_@@_value_tl
- \q_mark global \q_nil \q_stop
+ \s_@@_mark global \q_@@_nil \s_@@_stop
}
{
\msg_error:nnx { xtemplate } { unknown-attribute }
{ \l_@@_tmp_tl }
}
}
-\cs_new_protected:Npn \@@_key_to_value_auxii:w #1 global #2#3 \q_stop
+\cs_new_protected:Npn \@@_key_to_value_auxii:w #1 global #2#3 \s_@@_stop
{
- \quark_if_nil:NF #2
+ \@@_quark_if_nil:NF #2
{ \tl_set:Nn \l_@@_value_tl {#2} }
}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.ins b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.ins
index 43dfb266206..3e88b5e52c4 100644
--- a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.ins
+++ b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.ins
@@ -2,7 +2,7 @@
File: xtemplate.ins
-Copyright (C) 2000-2012,2016,2017,2019,2020 The LaTeX3 Project
+Copyright (C) 2000-2012,2016,2017,2019-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -34,7 +34,7 @@ license information is placed in the derived files.
\preamble
-Copyright (C) 2011-2020 The LaTeX3 Project
+Copyright (C) 2011-2021 The LaTeX Project
It may be distributed and/or modified under the conditions of
the LaTeX Project Public License (LPPL), either version 1.3c of
diff --git a/Master/texmf-dist/source/latex/langsci-affiliations/langsci-affiliations.dtx b/Master/texmf-dist/source/latex/langsci-affiliations/langsci-affiliations.dtx
new file mode 100644
index 00000000000..1cbb13c3ec2
--- /dev/null
+++ b/Master/texmf-dist/source/latex/langsci-affiliations/langsci-affiliations.dtx
@@ -0,0 +1,492 @@
+% \iffalse meta-comment
+% !TeX program = xelatex
+% !TeX encoding = utf-8
+%<*internal>
+\begingroup
+%</internal>
+%<*install>
+\input{l3docstrip.tex}
+\keepsilent
+\askforoverwritefalse
+\preamble
+------------------------------------------------------------------------------
+
+langsci-affiliations collects, orders, and outputs author-affiliation pairs.
+It makes use of data types from LaTeX3.
+
+The package is aimed to be helpful to class authors, i.e. those who design
+and maintain document templates in publishing houses, universities, etc. The
+package is probably of only limited use to document authors/end users.
+
+langsci-affiliations was developed at Language Science Press to help in the
+production of scientific texts in linguistics.
+
+Copyright (C) 2021 by Felix Kopecky, Language Science Press
+
+This work consists of the file langsci-affiliations.dtx
+ and the derived files langsci-affiliations.ins,
+ langsci-affiliations.pdf.
+
+It may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version. The latest version
+of this license is at <http://www.latex-project.org/lppl.txt>.
+
+This work is ``maintained'' (per LPPL maintenance status) by
+Felix Kopecky <felix.kopecky@langsci-press.org>.
+
+The development version can be found at
+
+ https://github.com/langsci/langsci-affiliations
+
+for those who are interested. Pull requests are welcome.
+
+Please report any bugs or feature requests to
+
+ https://github.com/langsci/langsci-affiliations/issues
+
+------------------------------------------------------------------------------
+\endpreamble
+\declarepreamble\minimalpreamble
+\endpreamble
+\postamble
+\endpostamble
+\usedir{tex/latex/langsci-affiliations}
+\generate{\file{\jobname.sty}{\from{\jobname.dtx}{package}}}
+%</install>
+%<install>\endbatchfile
+%<*internal>
+\usepreamble\minimalpreamble
+\usepostamble\defaultpostamble
+\usedir{source/latex/langsci-affiliations}
+\generate{\file{\jobname.ins}{\from{\jobname.dtx}{install}}}
+\endgroup
+%</internal>
+%<*driver>
+\documentclass{l3doc}
+\usepackage{langsci-affiliations}
+\usepackage[british]{babel}
+\usepackage{tikz}
+ \usetikzlibrary{arrows, arrows.meta, positioning}
+\usepackage{enumitem}
+ \setlist[description]{font=\normalfont}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+% \title{\pkg{langsci-affiliations}}
+% \author{Felix Kopecky\thanks{\protect\url{mailto:felix.kopecky@langsci-press.org}.
+% Please submit bug reports and feature requests to
+% \protect\url{https://github.com/langsci/langsci-affiliations/issues}.
+% }}
+% \date{Version 1.0.0 -- \today}
+% \maketitle
+% \frenchspacing
+% \begin{documentation}
+% \section{User guide}
+% This package provides a command \cmd{\ResolveAffiliations}, which collects author--affiliation pairs and outputs them according to the user configuration. It is aimed at class authors, i.e. maintainers of document templates in publishing houses, universities, etc. It is probably not that useful to document authors.
+
+% \begin{function}{\ResolveAffiliations}
+% \begin{syntax}
+% \cs{ResolveAffiliations} \oarg{options} \marg{pairs of authors and affiliations}
+% \end{syntax}
+% Takes the \marg{pairs of authors and affiliations}, orders them internally and outputs them according to the \oarg{options}.
+%
+% \marg{Pairs of authors and affiliations} is a list of authors and affiliations, where authors are separated by \verb+and+ and affiliations by \verb+;+. Affiliations are given within a phantom command \cs{affiliation} within the \marg{pairs} argument -- i.e. the command is not defined by this package and possibly existing definitions are left unchanged.
+%
+% For example:
+%
+% \begin{verbatim}
+% \ResolveAffiliations{
+% A. U. Thor\affiliation{University of the Moon; University of Mars}
+% and B. U. Thor\affiliation{University of Mars}
+% }
+% \end{verbatim}
+% results in:\\
+%
+% \noindent\ResolveAffiliations[output authors font=\normalsize]{
+% A. U. Thor\affiliation{University of the Moon; University of Mars}
+% and B. U. Thor\affiliation{University of Mars}
+% }\\
+%
+% The output can be customised using the \oarg{options}. They are described below.
+% \end{function}
+
+% \begin{function}{\SetupAffiliations}
+% \begin{syntax}
+% \cs{SetupAffiliations} \marg{options}
+% \end{syntax}
+% Options can be set either globally or locally. With \cs{SetupAffiliations}\marg{options}, they apply globally. If they are set with \cs{ResolveAffiliations}\oarg{options}, they apply locally.
+%
+% \begin{description}[style=nextline]
+% \item[|mark style =| \meta{style}\hfill (initially |alphabetic|)] Controls which markers should be used in the indexes of affiliations. Can be a either of \{|alphabetic|, |numeric|, |circled|, |none|\}.
+% \item[|output affiliation =| \meta{boolean}\hfill (initially |true|)] Affiliations are output if true, otherwise not.
+% \item[|output in groups =| \meta{boolean}\hfill (initially |true|)] If |true|, authors and affiliations are output in the same line. When |false| each author and affiliation gets its own line.
+% \item[|output authors font =| \meta{font commands}\hfill (initially |\cs{Large}|)] Stores the font settings for the ouput of authors.
+% \item[|output affiliation font =| \meta{font commands}\hfill (initially |\cs{normalsize}|)] Stores the font settings for outputting affiliations.
+% \end{description}
+%
+% \noindent Output separators between authors and affiliations are customisable as well:
+%
+% \begin{description}[style=nextline]
+% \item[|separator between two =| \meta{tokens}\hfill (initially |\char`~\&\char`~|)]
+% If there are only two authors, use these \meta{tokens} to separate them.
+% \item[|separator between multiple =| \meta{tokens}\hfill (initially |,\char`~|)]
+% If there are more than two authors, use these \meta{tokens} to separate every pair except the last one.
+% \item[|separator between final two =| \meta{tokens}\hfill (initially |\char`~\&\char`~|)]
+% Use these \meta{tokens} to separate the last pair of authors if ther are more than two.
+% \item[|separator between affiliations =| \meta{tokens}\hfill (initially |,|)]
+% Use these to separate affiliations after each authors. The affiliations in the affiliation line are always separated by a space ().
+% \end{description}
+%
+% \noindent The way the input is digested can be customised with these two settings:
+%
+% \begin{description}[style=nextline]
+% \item[|input names separator =| \meta{tokens}\hfill (initially |\char`~and\char`~|)]
+% Separates the author names in the input.
+% \item[|input affiliation separator =| \meta{tokens}\hfill (intially |;|)]
+% Separates the affiliations in the input, within dummy command \cs{affiliation}.
+% \end{description}
+%
+% \end{function}
+% \end{documentation}
+%
+% \newpage
+%
+% \begin{implementation}
+% \section{Implementation}
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+% \begin{macrocode}
+%<@@=affiliations>
+% \end{macrocode}
+% \begin{macrocode}
+\RequirePackage{xparse}
+\ProvidesExplPackage {langsci-affiliations}
+{2021-02-17} {1.0.0}
+{A LaTeX3 package to collect and order authors and affiliations}
+% \end{macrocode}
+
+% \begin{macro}{\ResolveAffiliations}
+% The top-level document command. It is grouped to keep assignments local.
+% \begin{macrocode}
+\NewDocumentCommand{\ResolveAffiliations}{ O{} +m }
+ {%
+ \group_begin:
+ \keys_set:nn { affiliations } { #1 }%
+ \exp_args:No \affiliations_resolve:n { #2 }%
+ \group_end:
+ }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\SetupAffiliations}
+% A command to define options.
+% \begin{macrocode}
+\NewDocumentCommand{\SetupAffiliations}{ m }
+ {%
+ \keys_set:nn { affiliations } { #1 }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\keys_define:nn { affiliations }
+ {
+ mark~style .tl_set:N
+ = \l__affiliations_style_tl,
+ mark~style .initial:n
+ = { alphabetic },
+ output~affiliation .bool_set:N
+ = \l__affiliations_output_affiliation_bool,
+ output~affiliation .initial:n
+ = { true },
+ output~in~groups .bool_set:N
+ = \l__affiliations_output_grouped_bool,
+ output~in~groups .initial:n
+ = { true },
+ separator~between~two .tl_set:N
+ = \l__affiliations_separator_between_two_tl,
+ separator~between~two .initial:n
+ = {~\&~},
+ separator~between~multiple .tl_set:N
+ = \l__affiliations_separator_between_mult_tl,
+ separator~between~multiple .initial:n
+ = {,~},
+ separator~between~final~two .tl_set:N
+ = \l__affiliations_separator_between_last_two_tl,
+ separator~between~final~two .initial:n
+ = {~\&~},
+ separator~between~affiliations .tl_set:N
+ = \l__affiliations_afil_separator_tl,
+ separator~between~affiliations .initial:n
+ = {,},
+ output~authors~font .cs_set:Np
+ = \__affiliations_output_authors_font:,
+ output~authors~font .initial:n
+ = {\Large},
+ output~affiliation~font .cs_set:Np
+ = \__affiliations_output_affiliation_font:,
+ output~affiliation~font .initial:n
+ = {\normalsize},
+ input~names~separator .tl_set:N
+ = \l__affiliations_input_names_sep_tl,
+ input~names~separator .initial:n
+ = {~and~},
+ input~affiliation~separator .tl_set:N
+ = \l_affiliations_input_afil_sep_tl,
+ input~affiliation~separator .initial:n
+ = {;}
+ }
+% \end{macrocode}
+% \begin{variable}[int]{
+% \prop_put:Nxx,
+% \prop_put:Nnx,
+% \seq_set_split:Nvn,
+% \l__affiliations_tmpa_clist,
+% \l__affiliations_tmpa_int,
+% \l__affiliations_affiliations_seq,
+% \l__affiliations_authors_seq,
+% \l__affiliations_names_seq,
+% \l__affiliations_tmpa_seq,
+% \l__affiliations_tmpb_seq,
+% \l__affiliations_tmpa_tl,
+% \l__affiliations_tmpb_tl,
+% \l__affiliations_output_prop,
+% \l__affiliations_affiliations_prop}
+% Internal variants and variables
+% \begin{macrocode}
+
+\cs_generate_variant:Nn \prop_put:Nnn { Nxx }
+\cs_generate_variant:Nn \prop_put:Nnn { Nnx }
+\cs_generate_variant:Nn \seq_set_split:Nnn { NVn }
+\clist_new:N \l__affiliations_tmpa_clist
+\int_new:N \l__affiliations_tmpa_int
+\prop_new:N \l__affiliations_tmpa_prop
+\seq_new:N \l__affiliations_affiliations_seq
+\seq_new:N \l__affiliations_authors_seq
+\seq_new:N \l__affiliations_names_seq
+\seq_new:N \l__affiliations_tmpa_seq
+\seq_new:N \l__affiliations_tmpb_seq
+\tl_new:N \l__affiliations_tmpa_tl
+\tl_new:N \l__affiliations_tmpb_tl
+\prop_new:N \l__affiliations_output_prop
+\prop_new:N \l__affiliations_affiliations_prop
+% \end{macrocode}
+% \end{variable}
+% \begin{variable}[int]{\l__affiliations_icons_prop}
+% The data for the |circled| mark style. Since this uses the \cs{char}, it is
+% only available in XeLaTeX.
+% \begin{macrocode}
+\prop_const_from_keyval:Nn \l__affiliations_icons_prop
+ {
+ 0 = \char"2460, 1 = \char"2461, 2 = \char"2462, 3 = \char"2463,
+ 4 = \char"2464, 5 = \char"2465, 6 = \char"2466, 7 = \char"2467,
+ 8 = \char"2468, 9 = \char"2469, 10 = \char"246A, 11 = \char"246B,
+ 12 = \char"246C, 13 = \char"246D, 14 = \char"246E, 15 = \char"246F,
+ 16 = \char"2470, 17 = \char"2471, 18 = \char"2472, 19 = \char"2473
+ }
+% \end{macrocode}
+% \end{variable}
+% \begin{macro}[int]{\__affiliations_resolve_affiliations:}
+% A helper macro to order affiliations. Is called by
+% \cs{affiliations_resolve:n}.
+% \begin{macrocode}
+\cs_new:Npn \__affiliations_resolve_affiliations: #1#2
+ {
+ \clist_clear:N \l__affiliations_tmpa_clist
+ \tl_if_empty:nTF {#2}
+ {
+ \prop_put:Nnn \l__affiliations_output_prop {#1} {}
+ }
+ {
+ \seq_set_split:NVn \l__affiliations_tmpa_seq
+ \l_affiliations_input_afil_sep_tl
+ { #2 }
+ \seq_map_inline:Nn \l__affiliations_tmpa_seq
+ {
+ \prop_get:NnNTF \l__affiliations_affiliations_prop
+ {##1}
+ \l__affiliations_tmpa_tl
+ {
+ \clist_put_right:NV \l__affiliations_tmpa_clist
+ \l__affiliations_tmpa_tl
+ }
+ {
+ %Not yet present
+ \clist_put_right:Nx \l__affiliations_tmpa_clist
+ {
+ \prop_count:N \l__affiliations_affiliations_prop
+ }
+ \prop_put:Nnx \l__affiliations_affiliations_prop {##1}
+ { \prop_count:N \l__affiliations_affiliations_prop }
+ }
+ }
+ \prop_put:NnV \l__affiliations_output_prop
+ {#1}
+ \l__affiliations_tmpa_clist
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[int]{\__affiliations_output_affiliations:}
+% A helper macro that outputs the list of affiliations, usually below
+% the list of authors.
+% \begin{macrocode}
+\cs_new:Nn \__affiliations_output_affiliations:
+ {
+ \prop_map_inline:Nn \l__affiliations_affiliations_prop
+ {
+ \int_set:Nn \l__affiliations_tmpa_int { ##2 }
+ \str_case_e:nn { \l__affiliations_style_tl }
+ {
+ {alphabetic}
+ {
+ \textsuperscript{\int_to_alph:n{ \int_eval:n
+ { \l__affiliations_tmpa_int + 1 }
+ } }
+ }
+ {numeric}
+ { \textsuperscript{\int_eval:n {\l__affiliations_tmpa_int + 1} } }
+ {circled}
+ {
+ \prop_item:Nn \l__affiliations_icons_prop
+ {\l__affiliations_tmpa_int}
+ }
+ {none} { }
+ }
+ ##1 ~
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[int]{\__affiliations_return_afil_text:n}
+% A helper macro that returns the affiliation marks.
+% \begin{macrocode}
+\cs_new:Npn \__affiliations_return_afil_text:n #1
+ {
+ \int_set:Nn \l__affiliations_tmpa_int { #1 }
+ \str_case_e:nn { \l__affiliations_style_tl }
+ {
+ {alphabetic}
+ {
+ \seq_put_right:Nx \l__affiliations_tmpb_seq
+ { \int_to_alph:n{ \int_eval:n {#1 + 1} } }
+ }
+ {numeric}
+ {
+ \seq_put_right:Nx \l__affiliations_tmpb_seq
+ { \int_eval:n {\l__affiliations_tmpa_int + 1} }
+ }
+ {circled}
+ {
+ \seq_put_right:Nx \l__affiliations_tmpb_seq
+ { \prop_item:Nn \l__affiliations_icons_prop
+ { \l__affiliations_tmpa_int} }
+ }
+ {none} { }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}[int]{\__affiliations_output_authors:}
+% A helper macro to output the list of authors, with affiliation marks (if any).
+% \begin{macrocode}
+\cs_new:Nn \__affiliations_output_authors:
+ {
+ \seq_clear:N \l__affiliations_tmpa_seq
+ \prop_map_inline:Nn \l__affiliations_output_prop
+ {
+ \seq_clear:N \l__affiliations_tmpb_seq
+ \clist_map_function:nN {##2} \__affiliations_return_afil_text:n
+ \tl_set:Nn \l__affiliations_tmpb_tl
+ {
+ \seq_use:Nn \l__affiliations_tmpb_seq
+ {\l__affiliations_afil_separator_tl}
+ }
+ \seq_put_right:Nx \l__affiliations_tmpa_seq
+ {
+ \tl_rescan:nn {} {##1}
+ \exp_not:N \textsuperscript{\tl_use:N \l__affiliations_tmpb_tl}
+ }
+ }
+ \seq_use:Nnnn \l__affiliations_tmpa_seq
+ {\l__affiliations_separator_between_two_tl}
+ {\l__affiliations_separator_between_mult_tl}
+ {\l__affiliations_separator_between_last_two_tl}
+ }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}[int]{\affiliations_resolve:n}
+% The main macro.
+% \begin{macrocode}
+\cs_new:Npn \affiliations_resolve:n #1
+ {
+ \seq_set_split:NVn \l__affiliations_names_seq
+ \l__affiliations_input_names_sep_tl
+ { #1 }
+ \seq_map_inline:Nn \l__affiliations_names_seq
+ {
+ \seq_clear_new:N \l__affiliations_names_tmp_seq
+ \seq_set_split:Nnn \l__affiliations_names_tmp_seq { \affiliation }
+ { ##1 }
+ \prop_put:Nxx \l__affiliations_tmpa_prop
+ { \seq_item:Nn \l__affiliations_names_tmp_seq {1} }
+ { \seq_item:Nn \l__affiliations_names_tmp_seq {2} }
+ }
+ \bool_if:NTF \l__affiliations_output_affiliation_bool
+ {
+ \bool_if:NTF \l__affiliations_output_grouped_bool
+ {
+ \prop_map_function:NN \l__affiliations_tmpa_prop
+ \__affiliations_resolve_affiliations:
+ \group_begin:
+ \__affiliations_output_authors_font:
+ \__affiliations_output_authors:
+ \group_end:\\[0.5ex]
+ \group_begin:
+ \__affiliations_output_affiliation_font:
+ \__affiliations_output_affiliations:
+ \group_end:
+ }
+ {
+ \prop_map_inline:Nn \l__affiliations_tmpa_prop
+ {
+ \__affiliations_output_authors_font:
+ \tl_rescan:nn {} {##1}\\[0.5ex]
+ \group_begin:
+ \__affiliations_output_affiliation_font:
+ \tl_rescan:nn {} {##2}
+ \group_end:
+ \medskip\\
+ }
+ }
+ }
+ {
+ \group_begin:
+ \__affiliations_output_authors_font:
+ \seq_clear:N \l__affiliations_tmpa_seq
+ \prop_map_inline:Nn \l__affiliations_tmpa_prop
+ {
+ \seq_put_right:Nx \l__affiliations_tmpa_seq
+ {\tl_rescan:nn {} {##1} }
+ }
+ \seq_use:Nnnn \l__affiliations_tmpa_seq
+ {\l__affiliations_separator_between_two_tl}
+ {\l__affiliations_separator_between_mult_tl}
+ {\l__affiliations_separator_between_last_two_tl}
+ \group_end:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \end{implementation}
+
+% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/langsci-avm/langsci-avm.dtx b/Master/texmf-dist/source/latex/langsci-avm/langsci-avm.dtx
index 1d507aa4996..72346d4f51a 100644
--- a/Master/texmf-dist/source/latex/langsci-avm/langsci-avm.dtx
+++ b/Master/texmf-dist/source/latex/langsci-avm/langsci-avm.dtx
@@ -11,15 +11,23 @@
\preamble
------------------------------------------------------------------------------
-langsci-avm: Attribute-value matrices (AVMs) and feature structures in LaTeX3.
+langsci-avm is aimed at typesetting beautiful feature structures,
+also known as attribute-value matrices (AVMs), for use in linguistics.
+
+The package provides a minimal and easy to read syntax.
+It depends only on the array package and can be placed almost everywhere,
+in particular in footnotes or graphs and tree structures. The package is meant
+as an update to, and serves the same purpose as, Christopher Manning’s
+avm package, but shares no code base with that package.
+
+langsci-avm was developed at Language Science Press to help in the
+production of scientific texts in linguistics.
Copyright (C) 2020 by Felix Kopecky, Language Science Press
-This work consists of the file langsci-avm.dtx &
- include/smallcaps-standalone.pdf.
+This work consists of the file langsci-avm.dtx
and the derived files langsci-avm.ins,
- langsci-avm.pdf,
- langsci-avm.sty.
+ langsci-avm.pdf.
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -29,7 +37,7 @@ of this license is at <http://www.latex-project.org/lppl.txt>.
This work is ``maintained'' (per LPPL maintenance status) by
Felix Kopecky <felix.kopecky@langsci-press.org>.
-The development version of the bundle can be found at
+The development version can be found at
https://github.com/langsci/langsci-avm
@@ -75,25 +83,24 @@ Please report any bugs or feature requests to
% Please submit bug reports and feature requests to
% \protect\url{https://github.com/langsci/langsci-avm/issues}.
% }}
-% \date{Version 0.1.0-beta -- 11th March 2020}
+% \date{Version 0.2.1 -- 15th July 2020}
% \maketitle
% \frenchspacing
% \begin{documentation}
% \section{Introduction}
% \pkg{langsci-avm} is a \LaTeX3 package aimed at typesetting beautiful feature structures, also known as \emph{attribute-value matrices}, for use in linguistics. The package provides a minimal and easy to read syntax. It depends only on the \pkg{array} package and can be placed almost everywhere, in particular in footnotes or graphs and tree structures. The package is meant as an update to, and serves the same purpose as, Christopher Manning's \pkg{avm} package, but shares no code base with that package. When you come from \pkg{avm}, please see Section~\ref{sec:switching} for a quick conversion guide.
%
-% To start using \pkg{langsci-avm}, place |\usepackage{langsci-avm}| in your preamble.
+% To start using \pkg{langsci-avm}, place |\usepackage{langsci-avm}| in your preamble.\\\\
+% \emph{This document is structured as follows:} Section~\ref{sec:basiccommands} describes the input syntax for AVMs and their parts. Ways to customise your AVM's layout follow in Section~\ref{sec:options}, and selected usage cases are presented in Section~\ref{sec:applications}. There's also an administrative and \TeX nical appendix at the end of this document, in case you are interested.
%
% \subsection{Example}
% \begin{verbatim}
% \avm{
-% [ ctxt & [ max-qud \\
-% sal-utt & \{ [ cat \\
-% cont <ind & i>
-% ]
-% \}
-% ]
-% ]
+% [ ctxt & [ max-qud \\
+% sal-utt & \{ [ cat \\
+% cont <ind & i> ] \}
+% ]
+% ]
% }
% \end{verbatim}
% {\centering\avm{
@@ -105,42 +112,20 @@ Please report any bugs or feature requests to
% \subsection{Acknowledgements}
% Thanks to Phelype Oleinik for help on recursion and expansion with \LaTeX3. Thanks to Ahmet Bilal Özdemir and Stefan Müller for their contributions in planning and testing this package.
%
-% \section{User interface}
-% \subsection{Typing structures and settings}\label{sec:options}
+% \section{Structuring AVMs}
+% \label{sec:basiccommands}
%
% \begin{function}{\avm}
% \begin{syntax}
% \cs{avm} \oarg{options} \marg{structure}
% \end{syntax}
-% The heart of this package and its root document comand is |\avm|. It currently runs only in text mode, but can be run in math mode if it is escaped with |$\avm$|. In the scope of the command, delimiter characters are processed to open and close (sub-)structures, as described in Section~\ref{sec:commands}. For a description of the \meta{options}, see |\avmsetup|.
-% \end{function}
+% The heart of this package and its root document comand is |\avm|. In the scope of the command, delimiter characters are processed to open and close (sub-)structures, as described in Section~\ref{sec:commands}. Special elements are described in Section~\ref{sec:specialcommands}. For a description of the layout \meta{options}, see Section~\ref{sec:options}.
%
-% \begin{function}{\avmsetup}
-% \begin{syntax}
-% \cs{avmsetup} \marg{options}
-% \end{syntax}
-% \meta{options} is a comma-separated list of |key = value| settings. The \marg{options} are the same as in \cs{avm}\oarg{options}. When inserted in \cs{avm}\oarg{options}, they apply locally, and globally if given to \cs{avmsetup}. Local settings always override global ones, and you can have any feasible number of \cs{avmsetup}s in your document.
-%
-% \begin{description}[style=nextline]
-% \item[|stretch =| \meta{factor} \hfill (initially |1.15|)] Define \cs{arraystretch}, i.e. the factor of line spacing. Increasing this may be useful if there is too little vertical space between delimiters in subsequent rows.
-%
-% \item[|columnsep =| \meta{length} \hfill (initially |0.5ex|)] Define the \cs{arraycolsep}, i.e. horizontal space before and after any column. The first and second column will have |1\columnsep| to the left and right, respectively. Between the two the distance is |2\columnsep|. Using relative units (like |ex| or |em|) may be a good idea so that |columnsep| scales well with changes in font size.
-%
-% \item[|delimfactor =| \meta{factor} \hfill (initially |1000|)] Sets \cs{delimiterfactor}. The calculation for the minimum height of a delimiter is $y \cdot f /1000$, where $y$ is the height of the content and $f$ the value of \cmd{delimfactor}. The default |1000| ensure that the delimiters' height is at least that of the structure.
-%
-% \item[|delimfall =| \meta{length} \hfill (initially |0pt|)] Controls \cs{delimitershortfall}, i.e. the maximum height that the delimiters can be shorter than the enclosed structure. The default |0pt| ensure that the delimiters are not shorter than the contents.
-%
-% \item[|attributes =| \meta{font settings} \hfill (initially |\textbackslash scshape|)] The font for attributes, i.e. the first column of each structure.
-%
-% \item[|values =| \meta{font settings} \hfill (initially |\textbackslash itshape|)] The font for values, i.e. the second column of each structure.
-%
-% \item[|types =| \meta{font settings} \hfill (initially |\textbackslash itshape|)] The font used in \cs{type} and \cs{type*}.
-% \item[|tags =| \meta{format settings} \hfill (initially |\textbackslash footnotesize|)] The font (size) used in \cs{tag} and the shortcuts \cs{1}...\cs{9}.
-% \item[|switch =| \meta{token} \hfill (initially |!|)] Define the escape token. Change this if you need to use ``!'' as a text glyph.
-% \end{description}
+% A \meta{structure} is basically the content of a stylised \cmd{tabular}: The columns are separated by \cmd{&} and a new line is entered with \cmd{\\}.
% \end{function}
-%
-% \subsection{Commands available in the scope of \texttt{\textbackslash avm}}\label{sec:commands}
+%
+% \subsection{Entering (sub-)structures within \texttt{\textbackslash avm}}
+% \label{sec:commands}
%
% \begin{function}{[...],<...>,(...),\{...\}}
% \begin{syntax}
@@ -149,11 +134,9 @@ Please report any bugs or feature requests to
% \cmd{(} \meta{structure} \cmd{)}
% \cmd{\{} \meta{structure} \cmd{\}}
% \end{syntax}
-% Within the scope of \cs{avm}, these delimiters create (sub-)structures that are enclosed by the respective delimiter. Due to the special meaning that curly braces have in \LaTeX, they are the only ones that need to be run with an escape token (|\|). It is currently possible to mix delimiters, e.g. with |<|\meta{structure}|)|, but this may change in future versions.
-%
-% A \meta{structure} is basically the content of a stylised \cmd{array}: The columns are separated by \cmd{&} and a new line is entered with \cmd{\\}.
+% Within the scope of \cs{avm}, these delimiters create (sub-)structures that are enclosed by the respective delimiter. Due to the special meaning that curly braces have in \LaTeX, these are the only ones that need to be run with an escape token (|\|). It is currently possible to mix delimiters, e.g. with |<|\meta{structure}|)|, but this may change in future versions.
%
-% \pkg{langsci-avm} expects your (sub-)structures to have \emph{at most two columns}, so that for every line in each (sub-)structure, there should be no more than one \cmd{&}. It is recommended to have exactly one \cmd{&} in your \meta{structure}. In the current beta version, display issues may appear in some structures if none is given.\bigskip\\
+% \pkg{langsci-avm} expects your (sub-)structures to have \emph{at most two columns}, so that for every line in each (sub-)structure, there should be no more than one \cmd{&}. It is recommended to have at least some lines with a \cmd{&} in your \meta{structure}. Currently, display issues may appear in some structures if none are given.\bigskip\\
% \noindent\begin{minipage}[c]{.5\linewidth}
% \begin{verbatim}
% \avm{
@@ -184,15 +167,16 @@ Please report any bugs or feature requests to
% \begin{syntax}
% \cmd{!} \meta{text} \cmd{!}
% \end{syntax}
-% Escapes the |avm| mode so that all delimiters can be used as usual characters. If you need |!| as a regular character, see \cs{avmsetup} to change the |switch| option.
+% Escapes the |avm| mode so that all delimiters can be used as usual characters. If you need |!| as a regular character, see Section~\ref{sec:options} for how to change the |switch|.
% \end{function}
%
-% \begin{function}{\tag,\1,...,\9}
+% \subsection{Commands for tags, types, unusal lines, and relations}\label{sec:specialcommands}
+% \begin{function}[updated=2020-04-29]{\tag,\0,\1,...,\9}
% \begin{syntax}
% \cs{tag} \marg{identifier}
-% \cmd{\1, \2, \3, \4, \5, \6, \7, \8, \9}
+% \cmd{\0, \1, \2, \3, \4, \5, \6, \7, \8, \9}
% \end{syntax}
-% \cs{tag} puts its \marg{identifier} in a box, more precisely an \cs{fbox}. Within the box, the |tags| font is applied. \cs{1}, ..., \cs{9} are shortcuts to \cs{tag} and place the respective number in the box. For example, \cs{4} is equivalent to |\tag{4}|. The shortcuts do not take any arguments.
+% \cs{tag} puts its \marg{identifier} in a box, more precisely an \cs{fbox}. Within the box, the |tags| font is applied. \cs{0}, \cs{1}, ..., \cs{9} are shortcuts to \cs{tag} and place the respective number in the box. For example, \cs{4} is equivalent to |\tag{4}|. The shortcuts do not take any arguments.
%
% If you want to use this command outside an AVM, you can obtain, for example, \avm{\4}, by using |\avm{\4}|, or the equivalent |{\fboxsep.25ex\fbox{\footnotesize 4}}|.\bigskip\\
% \noindent\begin{minipage}{.6\linewidth}
@@ -208,11 +192,11 @@ Please report any bugs or feature requests to
% \end{minipage}
% \end{function}
%
-% \begin{function}{\type,\type*}
+% \begin{function}[updated=2020-03-30]{\type,\type*}
% \begin{syntax}
% \cs{type}\meta{*} \marg{type}
% \end{syntax}
-% Will typeset the \meta{type} in the |types| font (roman italics by default). The starred variant \cs{type*} will span the complete (sub-)structure and \emph{can only be placed in the first column} of this structure. After the starred \cs{type*}, a |\\| is recommended, but can be omitted in ``normal'' cases.\bigskip\\
+% Will output the \meta{type} in the |types| font (roman italics by default). The starred variant \cs{type*} will span the complete (sub-)structure and \emph{can only be placed in the first column} of this structure. After the starred \cs{type*}, a |\\| is recommended, but can usually be omitted.\bigskip\\
% \noindent\begin{minipage}{.6\linewidth}
% \begin{verbatim}
% \avm{[ \type*{A type spanning a line}
@@ -238,23 +222,186 @@ Please report any bugs or feature requests to
% \avm{[ attr1 & val1\\
% \punk{a quite long attr2}{val2} ]}
% attr3 & val3\\
-% attr4 & val4\\
+% attr4 & val4
+% ]}
% \end{verbatim}
% \end{minipage}\begin{minipage}{.4\linewidth}
% \avm{[
% attr1 & val1\\
% \punk{a quite long attr2}{val2}
% attr3 & val3\\
-% attr4 & val4\\
+% attr4 & val4
% ]}
% \end{minipage}
% \end{function}
%
-% \begin{function}{+}
-% In the scope of \cs{avm}, \cmd{+} comes out as ``$\oplus$''. To obtain ``+'', please use the escape mode, as in |!+!|.
+% \begin{function}[updated=2020-03-16]{\+}
+% In the scope of \cs{avm}, \cs{+} comes out as ``$\oplus$''. ``+'' can be obtained normally. \textit{In the earlier Version 0.1.0-beta, \cmd{+} produced ``$\oplus$''.}
+% \end{function}
+%
+% \begin{function}[added=2020-03-17]{\-}
+% In the scope of \cs{avm}, \cs{-} comes out as ``$\ominus$''. To use the ``optional hyphenation'' meaning of \cs{-}, please write |!\-!|.
+% \end{function}
+%
+% \begin{function}[added=2020-03-17]{\shuffle}
+% In the scope of \cs{avm}, \cs{shuffle} is a shortcut for ``$\bigcirc$'' to mark the shuffle relation.
+% \end{function}
+%
+% \section{AVM layout}\label{sec:options}
+%
+% \subsection{Defining styles}
+%
+% You can customise many aspects of how an AVM is printed, including the fonts or spacing between delimiters and content. You can apply them locally via the \oarg{options} of \cs{avm} or by using \cs{avmsetup}. And you can also define your own styles and use them via the \oarg{style = } option in \cs{avm}.
+%
+% \begin{function}{\avmsetup}
+% \begin{syntax}
+% \cs{avmsetup} \marg{options}
+% \end{syntax}
+% \marg{options} is a comma-separated list of |key = value| settings. See the list below for all user-configurable options. The \marg{options} are the same as in \cs{avm}\oarg{options}. When inserted in \cs{avm}\oarg{options}, they apply locally, and globally if given to \cs{avmsetup}. Local settings always override global ones, and you can have any feasible number of \cs{avmsetup}s in your document.
+%
+% \end{function}
+%
+% \begin{function}[added=2020-05-11]{\avmdefinestyle}
+% \begin{syntax}
+% \cs{avmdefinestyle} \marg{name} \marg{settings}
+% \end{syntax}
+% Instead of applying settings globally or per AVM, you can also define styles and assign them to AVMs, as in |\avm[style=|\meta{name}|]{...}|. The \meta{settings} are a comma-separated list of |key = value| settings, and should be a subset of the settings from \cs{avmsetup}. For example, the following |plain| style highlights neither attributes, values, nor types:
+%
+% \begin{verbatim}
+% \avmdefinestyle{plain}{attributes=\normalfont,
+% values=\normalfont,
+% types=\normalfont}
+% \end{verbatim}
+% The style is applied with |\avm[style=plain]{...}|.
+% \end{function}
+%
+% \bigskip
+%
+% \noindent Now to the list of settings you can actually apply:
+%
+% \begin{description}[style=nextline]
+% \item[|style =| \meta{name} \hfill (initially empty)] In addition to any style that you possibly define yourself, a style |narrow| is pre-defined in the package (see Section~\ref{sec:spacing}).
+%
+% \item[|stretch =| \meta{factor} \hfill (initially |0.9|)] Define \cs{arraystretch}, i.e. a factor in the determination of line height.
+%
+% \item[|columnsep =| \meta{length} \hfill (initially |0.5ex|)] Define the \cs{tabcolsep}, i.e. horizontal space between columns. The first and second column will have |0\columnsep| to the left and right, respectively. Between the two the distance is |2\columnsep|. Using relative units (like |ex| or |em|) may be a good idea so that |columnsep| scales well with changes in font size.
+%
+% \item[|delimfactor =| \meta{factor} \hfill (initially |1000|)] Sets \cs{delimiterfactor}. The calculation for the minimum height of a delimiter is $y \cdot f /1000$, where $y$ is the height of the content and $f$ the value of \cmd{delimfactor}. The default |1000| ensure that the delimiters' height is at least that of the structure.
+%
+% \item[|delimfall =| \meta{length} \hfill (initially |0pt|)] Controls \cs{delimitershortfall}, i.e. the maximum height that the delimiters can be shorter than the enclosed structure. The default |0pt| ensure that the delimiters are not shorter than the contents.
+%
+% \item[|extraskip| = \meta{length} \hfill (initially \cs{smallskipamount})] If a substructure is immediately followed by a \cmd{\\}, an extra amount of vertical skip is added so that the content of the next line, possibly another delimiter, does not clash with the delimiter in that line. This automatic skip insertion can be circumvented with placing a \cs{relax} before the linebreak, i.e. |\relax\\|.
+%
+% \item[|attributes =| \meta{font settings} \hfill (initially |\textbackslash scshape|)] The font for attributes, i.e. the first column of each structure.
+%
+% \item[|values =| \meta{font settings} \hfill (initially |\textbackslash itshape|)] The font for values, i.e. the second column of each structure.
+%
+% \item[|apptovalues=| \meta{code} \hfill (initially \cs{/})] The \meta{code} is applied after the second column (``append to''). This is useful if |values| is set to |\itshape|, since \cs{itshape} does not automatically insert italic correction.
+%
+% \item[|types =| \meta{font settings} \hfill (initially |\textbackslash itshape|)] The font used in \cs{type} and \cs{type*}.
+% \item[|tags =| \meta{format settings} \hfill (initially |\textbackslash footnotesize|)] The font (size) used in \cs{tag} and the shortcuts \cs{1}...\cs{9}.
+% \item[|switch =| \meta{token} \hfill (initially |!|)] Define the escape token. Change this if you need to use ``!'' as a text glyph.
+% \item[|customise = | \meta{settings} \hfill (initially empty)] An interface to input custom commands to be run at the beginning of every \cs{avm}.
+% \end{description}
+%
+% \subsection{Defining input patterns}
+%
+% \begin{function}[added=2020-06-29]{\avmdefinecommand}
+% \begin{syntax}
+% \cs{avmdefinecommand} \marg{name} \oarg{label} \marg{settings}
+% \end{syntax}
+% Sub-structures often come in patterns. For example, AVMs often have a \textsc{phon} attribute, which is mapped to a list, the entries of which are in italics. \cs{avmdefinecommand} can account for this and other input patterns. For example,
+%
+% \begin{verbatim}
+% \avmdefinecommand{custom}{...}
+% \end{verbatim}
+% will create a command \cs{custom} available only in the scope of \cs{avm} (this means that you can have a different meaning in the rest of your document). The \meta{settings} will then be applied to the scope in which \cs{custom} is called. If an optional \meta{label} is given, the label will be printed, in the current font, before the \meta{settings} are applied.
+%
+% \cs{custom} generated in this way automatically advances to the value column after the \meta{label} is printed. This means that commands generated with \cs{avmdefinecommand} should be called in the attribute column of an existing structure. This behaviour can be circumvented with the starred variant \cs{name*}, which is automatically generated by \cs{avmdefinecommand} as well. However, it seems advisable to use the starred variants sparingly.
+%
+% Here's an example for the aforementioned \text{phon} pattern:
+%
+% \begin{verbatim}
+% \avmdefinecommand{phon}[phon]
+% {
+% attributes = \itshape,
+% delimfactor = 900,
+% delimfall = 10pt
+% }
+% \end{verbatim}
+%
+% This creates a command \cs{phon} (and the variant \cs{phon*}) within the scope of any \cs{avm}. It will print the label \texttt{phon} in the current font and then apply three settings locally: italics for the attribute (first) column, and two settings for very narrow delimiter fitting.
+%
+% This results in: (The font of this documentation has little support for IPA.)\avmdefinecommand{phon}[phon] {attributes = \itshape,delimfactor = 900, delimfall = 10pt}\\\\
+% \noindent\begin{minipage}[c]{.5\linewidth}
+% \begin{verbatim}
+% \avm{
+% [\type*{word}
+% \phon <lin'gwistiks>\\
+% synsem & [ ... ]
+% ]
+% }
+% \end{verbatim}
+% \end{minipage}\begin{minipage}[c]{.5\linewidth}
+% \avm{
+% [\type*{word}
+% \phon <lin'gwistiks>\\
+% synsem & [ ... ]
+% ]
+% }
+% \end{minipage}
+%
+% Note that any other structure type would have worked instead of \avm{<>}. But \avm{<>} and any other markers for sub-structures are left unchanged by \cs{phon} and other custom commands. This is why the \emph{attribute} font is changed by \cs{phon}, although \emph{lin'gwistiks} is technically a value. Remember that \cmd{<} creates a new list sub-substructure, and the first content is printed in its attribute font.
% \end{function}
%
-% \section{Applications}
+% \section{Applications}\label{sec:applications}
+%
+% \subsection{Spacing and size of delimiters}\label{sec:spacing}
+% \pkg{langsci-avm} automatically detects if the end of a sub-structure is followed by a line break. This is useful to find cases in which two sub-structures are printed immediately below each other, and to add extra spacing (the |extraskip| from the options). This automatic detection can be suppressed with \cs{relax}. See below for the effect of that detection:\bigskip\\
+% \noindent\begin{minipage}[c]{.5\textwidth}\centering
+% \begin{verbatim}
+% \avm{[ [attr1 & val1 \\
+% attr2 & val2 ] \\
+% [attr1 & val1 \\
+% attr2 & val2 ]
+% ]}
+% \end{verbatim}
+%
+% \avm{[ [attr1 & val1 \\
+% attr2 & val2 ] \\
+% [attr1 & val1 \\
+% attr2 & val2 ]
+% ]}
+% \end{minipage}\begin{minipage}[c]{.5\textwidth}\centering
+% \begin{verbatim}
+% \avm{[ [attr1 & val1 \\
+% attr2 & val2 ] \relax\\
+% [attr1 & val1 \\
+% attr2 & val2 ]
+% ]}
+% \end{verbatim}
+%
+% \avm{[ [attr1 & val1 \\
+% attr2 & val2 ] \relax\\
+% [attr1 & val1 \\
+% attr2 & val2 ]
+% ]}
+% \end{minipage}\\\\
+%
+% If many delimiters are nested, this occasionally results in larger delimiter sizes. There is a pre-defined |narrow| style that resets |delimfall| (to |5pt|) and |delimfactor| (to |997|), which are the values recommended in the \textit{\TeX book}. This results in a more compact appearance:\bigskip\\
+% \noindent\begin{minipage}[t]{.5\textwidth}\centering
+% \begin{verbatim}
+% \avm{[ attr \{<\1>\}]}
+% \end{verbatim}
+%
+% \avm{[ attr <\{\1\}>]}
+% \end{minipage}\begin{minipage}[t]{.5\textwidth}\centering
+% \begin{verbatim}
+% \avm[style=narrow]{[ attr \{<\1>\}]}
+% \end{verbatim}
+%
+% \avm[style=narrow]{[ attr <\{\1\}>]}
+% \end{minipage}
%
% \subsection{Disjunctions and other relations}
% Sometimes AMVs are placed beside other content to express disjunctions or other relations. In \pkg{langsci-avm} this is done naturally:\bigskip\\
@@ -289,7 +436,7 @@ Please report any bugs or feature requests to
% attribute3 & value3 ] }
% \end{minipage}
%
-% \subsection{Use as a vector}
+% \pagebreak\subsection{Use as a vector}
% It's possible to use \pkg{langsci-avm} for feature vectors rather than matrices, as may be useful in generative grammar.\medskip\\
% \noindent\begin{minipage}[c]{.8\textwidth}
% \begin{verbatim}
@@ -299,7 +446,7 @@ Please report any bugs or feature requests to
% \avm[attributes=\normalfont]{[v1\\v2\\v3]}$\varphi$
% \end{minipage}
%
-% \subsection{Combinations with \pkg{gb4e} and \pkg{expex}}
+% \subsection{Combinations with \pkg{gb4e}, \pkg{expex}, and \pkg{linguex}}
%
% This package works fine with \pkg{gb4e} and its fork \pkg{langsci-gb4e}. To align the example number at the top of your structure, please use \cs{attop} from \pkg{gb4e}:\bigskip\\
% \noindent\begin{minipage}[c]{.5\textwidth}
@@ -322,7 +469,7 @@ Please report any bugs or feature requests to
% \end{exe}
% \end{minipage}\bigskip\\
%
-% \noindent The same can be achieved with \pkg{expex} using an \emph{experimental} syntax:
+% \noindent The same can be achieved with \pkg{expex} using \cs{envup} from \pkg{lingmacros} (see below) or using this \emph{experimental} syntax:
%
% \begin{verbatim}
% \ex \vtop{\strut\vskip-\baselineskip{
@@ -333,7 +480,14 @@ Please report any bugs or feature requests to
% \xe
% \end{verbatim}
%
-% \noindent A future version of \pkg{langsci-avm} will include a more user-friendly approach. There is currently no known way of adjusting the alignment with \pkg{linguex}.
+% \noindent Examples typed with \pkg{linguex} can be combined with \cs{evnup} from \pkg{lingmacros} to align AVMs (many thanks to Jamie Findlay for pointing this out):
+%
+% \begin{verbatim}
+% \ex. \envup{\avm{[ attr1 & val1\\
+% attr2 & val2\\
+% attr3 & val3]}
+% }
+% \end{verbatim}
%
% \subsection{Combinations with \pkg{forest}}
% This package also works fine with \pkg{forest}. As per the \pkg{forest} documentation, it is recommended to protect any \cs{avm}-statements with |{}| in nodes:\bigskip\\
@@ -353,29 +507,36 @@ Please report any bugs or feature requests to
% \end{forest}
% \end{minipage}
%
+% It may happen that extensive AVMs protrude into the space reserved for other \pkg{forest} nodes or edges. In this case, the \pkg{forest} setting \cmd{for children = \{anchor=north\}} may be useful: (If you like, try this tree without that setting.)\bigskip\\
+% \noindent\begin{minipage}[c]{.6\textwidth}
+% \begin{verbatim}
+% \begin{forest}
+% [A, for children = {anchor=north}
+% [B] [{\avm{[attr1 & val1\\
+% attr2 & a long value val2\\
+% attr3 & val3\\
+% attr4 & val4\\
+% attr5 & val5]}} ]
+% ]
+% \end{forest}
+% \end{verbatim}
+% \end{minipage}\begin{minipage}[c]{.4\textwidth}
+% \begin{forest}
+% [A, for children = {anchor=north} [B] [{\avm{[attr1 & val1\\
+% attr2 & a long value val2\\
+% attr3 & val3\\
+% attr4 & val4\\
+% attr5 & val5]}} ] ]
+% \end{forest}
+% \end{minipage}
+%
% \subsection{Switching from Christopher Manning's \pkg{avm} package}\label{sec:switching}
-% Switching from \pkg{avm} to \pkg{langsci-avm} will require some, though hopefully minimal, changes to the code. In particular, the ``active mode'' has disappeared, there is now a single way of sorting (see \cs{type}), and tags are now produced without |@| (\cs{4} instead of \cmd{@4}, etc.). Please refer to Section~\ref{sec:caveats} for features known from \pkg{avm} that are not yet available in \pkg{langsci-avm}.
+% Switching from \pkg{avm} to \pkg{langsci-avm} will require some, though hopefully minimal, changes to the code. In particular, \pkg{langsci-avm} doesn't distinguish between ``active'' and ``passive'' modes, there is now a single way of sorting (see \cs{type}, which replaces \cs{asort} and \cs{osort}), and tags are now produced without |@| (\cs{4} instead of \cmd{@4}, etc.).
%
-% \subsection{Tweaking the \texttt{attribute} font with with \pkg{fontspec}}
-% The attributes in your structure are usually type set in \textsc{small caps}. That means that your input should usually be lowercase, unless capitals along small capitals in that attribute's description make sense. Some fonts also provide ``old style'' figures (also known as ``text'' or ``medieval'' figures). Those can be enabled with \pkg{fontspec}'s |Numbers=OldStyle| feature.
+% Paths can be printed with a normal \cmd{|}, and $\oplus$ and other relation symbols can be input more easily (see Section~\ref{sec:commands}), though the package will also work with \verb+$|$+ and \verb+$\oplus$+.
%
+% \pkg{langsci-avm} is not yet able to draw lines in elements of AVMs. This feature is planned for Version 0.3.
%
-% \textit{The following example is output in Libertinus, since the font for this documentation does not support the necessary font features.}\bigskip\\
-% \begin{minipage}[c]{.7\linewidth}
-% \begin{verbatim}
-% % Preamble
-% \usepackage{fontspec}
-% \usepackage{libertinus}
-% % Document
-% \avm[attributes={\addfontfeatures{
-% Numbers=OldStyle,
-% Letters=SmallCaps}
-% }
-% ] { [attr1 & val2] }
-% \end{verbatim}
-% \end{minipage}\begin{minipage}[c]{.3\linewidth}
-% \includegraphics{include/smallcaps-standalone.pdf}
-% \end{minipage}
%
% \subsection{Spanning both columns}
% You can use the \pkg{multicol} package to span both columns in a (sub-)structure. Please remember that every structure has two columns, so the only sensible usage is
@@ -389,11 +550,10 @@ Please report any bugs or feature requests to
% \section{Caveats and planned features}\label{sec:caveats}
% \begin{enumerate}
% \item There are currently no error messages. If you do not receive the intended output, please make sure that your code fits the syntax described in this documentation. If your code is fine but the output is not, please submit a bug report or feature request at \url{https://github.com/langsci/langsci-avm/issues}.
-% \item The package currently assumes that it is called in text mode.
% \item[] These features are planned for the future:
% \item A check whether the delimiters are balanced, i.e. whether all (sub-)structures are closed by a \verb+]+, \verb+}+, etc.
% \item Introduce the ability to draw (curved) lines between structures and elements.
-% \item Improve the appearance of angle brackets so that they vertically span the complete structure they enclose, maybe using \pkg{scalerel}.
+% \item Improve the appearance of (very) large angle brackets so that they vertically span the complete structure they enclose, maybe using \pkg{scalerel}.
% \end{enumerate}
%
% \section{Feedback and bug reports}
@@ -415,19 +575,21 @@ Please report any bugs or feature requests to
%
% \begin{macrocode}
\ProvidesExplPackage {langsci-avm}
- {2020-03-11} {0.1.0-beta}
+ {2020-07-15} {0.2.1}
{AVMs and feature structures in LaTeX3}
% \end{macrocode}
% \begin{macro}{\avm}
% This document command initialises an AVM. The first, optional argumet is a key-value list of settings (see \cs{keys_define:nn} below) and the second is the AVM itself, given in the syntax described in this documentation.
%
-% \cs{avm} enters a group so that keys- and macro-assignemts remain local. It then initialises the commands and shortcuts made locally available, sets its mode to |true| and assigns the keys as given in the optional argument (if any). After the wrapper \cs{avm_wrap:n} is called, the group is closed.
+% \cs{avm} enters a group so that keys- and macro-assignemts remain local. It then initialises the commands and shortcuts and any user customisation, sets its mode to |true| and assigns the keys as given in the optional argument (if any). After the wrapper \cs{avm_wrap:n} is called, the group is closed.
%
% \begin{macrocode}
\NewDocumentCommand{\avm}{ O{} +m }
{
\c_group_begin_token
\__avm_initialise_document_commands:
+ \__avm_initialise_custom_commands:
+ \tl_use:N \l__avm_defined_commands_tl
\bool_set_true:N \l__avm_mode_bool
\keys_set:nn { avm } { #1 }
\__avm_wrap:n { #2 }
@@ -435,9 +597,9 @@ Please report any bugs or feature requests to
}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\avmsetup}
-% Forward the key-value settings given as the optional argument to \cs{avm} to the keys defined in |\keys_define:nn { avm }|. For the meaning of these keys and initial values, see Section~\ref{sec:options}.
+% Forward the key-value settings given as the optional argument to \cs{avm} to the keys defined in |\keys_define:nn { avm }|. For the meaning of these keys and initial values, see Section~\ref{sec:basiccommands}.
%
% \begin{macrocode}
\NewDocumentCommand{\avmsetup}{ m }
@@ -445,13 +607,13 @@ Please report any bugs or feature requests to
\keys_define:nn { avm }
{
- stretch .code:n = {\def\arraystretch{#1}},
- stretch .initial:n = {1.15},
- columnsep .dim_set:N = \arraycolsep,
+ stretch .tl_set:N = \l__avm_arraystretch_tl,
+ stretch .initial:n = {0.9},
+ columnsep .dim_set:N = \l__avm_tabcolsep_dim,
columnsep .initial:n = {.5ex},
- delimfactor .int_set:N = \delimiterfactor,
+ delimfactor .int_set:N = \l__avm_delimfactor_int,
delimfactor .initial:n = {1000},
- delimfall .dim_set:N = \delimitershortfall,
+ delimfall .dim_set:N = \l__avm_delimshortfall_dim,
delimfall .initial:n = {0pt},
attributes .code:n = {\cs_set:Nn \__avm_font_attribute: {#1}},
attributes .initial:n = {\scshape},
@@ -460,19 +622,58 @@ Please report any bugs or feature requests to
values .code:n = {\cs_set:Nn \__avm_font_value: {#1}},
values .initial:n = {\itshape},
tags .code:n = {\cs_set:Nn \__avm_font_tag: {#1}},
- tags .initial:n = {\footnotesize},
+ tags .initial:n = {\footnotesize},
+ apptovalues .code:n = {\cs_set:Nn \__avm_deinit_second_column: {#1}},
+ apptovalues .initial:n = {\/},
+ singleton .code:n = {\cs_set:Nn \__avm_font_singleton: {#1}},
+ singleton .initial:n = {\normalfont},
switch .code:n = {\tl_set:Nn \__avm_mode_switch_character {#1}},
- switch .initial:n = { ! }
+ switch .initial:n = { ! },
+ extraskip .dim_set:N = \l__avm_extra_skip_dim,
+ extraskip .initial:n = {\smallskipamount},
+ customise .code:n = {\cs_set:Nn \__avm_initialise_custom_commands: {#1}},
+ customise .initial:n = { },
+ style .choice:,
+ style / narrow .code:n = {\delimiterfactor=997\delimitershortfall5pt},
+ }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\avmdefinestyle}
+% Define a style to be used together with the |style| key.
+% \begin{macrocode}
+\NewDocumentCommand{\avmdefinestyle}{ m m }
+ {
+ \keys_define:nn { avm }
+ {
+ style / #1 .code:n = { \keys_set:nn { avm } { #2 } }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\avmdefinecommand}
+% A factory function that creates commands for the layout of sub-structures and saves them to \cs{l__avm_defined_commands_tl}. The first argument describes the command's name, the second any (optional) label. The manufactured definitions are activated in the AVM group so that they remain local.
+% \begin{macrocode}
+\NewDocumentCommand{\avmdefinecommand}{ m O{} m }
+ {
+ \tl_put_right:Nn \l__avm_defined_commands_tl
+ {
+ \exp_args:Nc \DeclareDocumentCommand { #1 } { s }
+ {
+ #2 \IfBooleanF { ##1 } { & } \avmsetup{ #3 }
+ }
+ }
}
% \end{macrocode}
% \end{macro}
-% \begin{variable}{\l__avm_math_bool, \l__avm_mode_bool, \l__avm_parens_tracker}
-% We need an auxiliary variable to store the current mode. The math mode boolean is already created, but it will have an effect only in a later version which will include a check whether \cs{avm} is called in math mode. \cs{l__avm_parens_tracker} is a stack for a future check whether the delimiters given to \cs{avm} are balanced.
+% \begin{variable}{\l__avm_mode_bool, \l__avm_parens_tracker, \l__avm_defined_commands_tl}
+% We need an auxiliary variable to store the current mode. \cs{l__avm_parens_tracker} is a stack for a future check whether the delimiters given to \cs{avm} are balanced. \cs{l__avm_defined_commands_tl} is a token list that stores any commands provided by the user via \cs{avmdefinecommand}
% \begin{macrocode}
-\bool_new:N \l__avm_math_bool
\bool_new:N \l__avm_mode_bool
\seq_new:N \l__avm_parens_tracker
+\tl_new:N \l__avm_defined_commands_tl
% \end{macrocode}
% \end{variable}
@@ -483,91 +684,158 @@ Please report any bugs or feature requests to
% \end{macrocode}
% \end{macro}
+% \begin{variable}{\l__avm_in_first_column}
+% A boolean to check whether we are in the first column (value |true|) or in the second (value |false|).
+% \begin{macrocode}
+\bool_new:N \l__avm_in_first_column
+% \end{macrocode}
+% \end{variable}
+
+% \begin{macro}[int]{\__avm_init_first_column:, \__avm_init_second_column:}
+% These macros apply the settings for the columns in a (sub-)structure. They take care of font selection and report the currently active column back to the system. Knowing which column is active is important when closing the (sub-)structure. If the structure is closed without a second column present, we need to skip back |2\tabcolsep|.
+% \begin{macrocode}
+\cs_new:Nn \__avm_init_first_column:
+ {
+ \bool_set_true:N \l__avm_in_first_column
+ \normalfont\__avm_font_attribute:
+ }
+
+\cs_new:Nn \__avm_init_second_column:
+ {
+ \bool_set_false:N \l__avm_in_first_column
+ \normalfont\__avm_font_value:
+ }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}[int]{\__avm_kern_unused_columns:}
+% A helper macro to fill the horizontal space if a row is ended prematurely, i.e. if no \cmd{&} is present.
+% \begin{macrocode}
+\cs_new:Nn \__avm_kern_unused_columns:
+ {
+ \bool_if:NTF \l__avm_in_first_column
+ { \span\hspace*{-2\tabcolsep} }
+ { }
+ }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}[int]{\__avm_extra_skip:}
+% This function is used together with the delimiter replacements. It checks whether the delimiter is followed by a line break, in which case an extra skip is automatically inserted
+% \begin{macrocode}
+\cs_new:Nn \__avm_extra_skip:
+ {
+ \peek_meaning_ignore_spaces:NTF \\ {\vspace*{\l__avm_extra_skip_dim}} {}
+ }
+% \end{macrocode}
+% \end{macro}
% \begin{macro}[int]{\__avm_module_begin:,\__avm_module_end:,etc.}
% The replacement instructions for \cs{__avm_parse:n}
% \begin{macrocode}
\cs_new:Nn \__avm_module_begin:
{
- \begin{array}{
- >{\c_math_toggle_token\normalfont\__avm_font_attribute:}l
- <\c_math_toggle_token
- >{\c_math_toggle_token\normalfont\__avm_font_value:}l
- <\c_math_toggle_token}
+ \begin{tabular}{@{}
+ >{\__avm_init_first_column:}l
+ >{\__avm_init_second_column:}l
+ <{\__avm_deinit_second_column:}
+ @{}}
}
\cs_new:Nn \__avm_module_end:
- { \end{array} }
+ {
+ \__avm_kern_unused_columns:
+ \end{tabular}
+ }
\cs_new:Nn \__avm_replace_lbrace:
{
\__avm_parse_output:nw
- { \c_math_toggle_token\left\lbrace\__avm_module_begin: }
+ { \c_math_toggle_token\left\lbrace\__avm_module_begin: }
}
\cs_new:Nn \__avm_replace_rbrace:
{
\__avm_parse_output:nw
- { \__avm_module_end:\right\rbrace\c_math_toggle_token }
+ { \__avm_module_end:\right\rbrace\c_math_toggle_token\__avm_extra_skip: }
}
\cs_new:Nn \__avm_replace_lbrack:
{
\__avm_parse_output:nw
- { \c_math_toggle_token\left\lbrack\__avm_module_begin: }
+ { \c_math_toggle_token\left\lbrack\__avm_module_begin: }
}
\cs_new:Nn \__avm_replace_rbrack:
{
\__avm_parse_output:nw
- { \__avm_module_end:\right\rbrack\c_math_toggle_token }
+ { \__avm_module_end:\right\rbrack\c_math_toggle_token\__avm_extra_skip: }
}
-\cs_new:Nn \__avm_replace_lparen:
- {
+\cs_new:Nn \__avm_replace_lparen:
+ {
\__avm_parse_output:nw
- { \c_math_toggle_token\left(\__avm_module_begin: }
+ { \c_math_toggle_token\left(\__avm_module_begin: }
}
\cs_new:Nn \__avm_replace_rparen:
{
\__avm_parse_output:nw
- { \__avm_module_end:\right)\c_math_toggle_token }
+ { \__avm_module_end:\right)\c_math_toggle_token\__avm_extra_skip: }
}
\cs_new:Nn \__avm_replace_langle:
{
\__avm_parse_output:nw
- { \c_math_toggle_token\left<\__avm_module_begin: }
+ { \c_math_toggle_token\left<\__avm_module_begin: }
}
\cs_new:Nn \__avm_replace_rangle:
{
\__avm_parse_output:nw
- { \__avm_module_end:\right>\c_math_toggle_token }
+ { \__avm_module_end:\right>\c_math_toggle_token\__avm_extra_skip: }
}
\cs_new:Nn \__avm_replace_plus:
{
- \__avm_parse_output:nw { \ensuremath { \oplus } }
+ \__avm_parse_output:nw { \ensuremath { \oplus \! } }
+ }
+\cs_new:Nn \__avm_replace_minus:
+ {
+ \__avm_parse_output:nw { \ensuremath { \ominus \! } }
+ }
+\cs_new:Nn \__avm_replace_circle:
+ {
+ \__avm_parse_output:nw { \ensuremath { \bigcirc \, } }
}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\tag,\type,\punk}
+% \begin{macro}[updated=2020-03-30]{\tag,\type,\punk}
% \begin{macrocode}
\cs_new:Npn \__avm_controls_tag:n #1
{ \fboxsep.25ex\fbox{\normalfont\__avm_font_tag: #1} }
\cs_new:Npn \__avm_controls_type:n #1
- {\normalfont\__avm_font_type: #1}
+ { \c_group_begin_token\normalfont\__avm_font_type: #1\c_group_end_token }
\cs_new_protected:Npn \__avm_controls_type_starred:n #1
{
- \normalfont\__avm_font_type: #1\span
+ \bool_set_false:N \l__avm_in_first_column
+ \normalfont\__avm_font_type: #1
+ \__avm_deinit_second_column:\span\hspace*{-2\tabcolsep}
\peek_meaning_ignore_spaces:NTF \\ {} {\\}
}
\cs_new_protected:Npn \__avm_controls_punk:nn #1 #2
{
- \normalfont\c_group_begin_token\__avm_font_attribute:#1%
- \c_group_end_token\hspace{2\arraycolsep}%
- \c_group_begin_token\__avm_font_type: #2\c_group_end_token%
- \span\peek_meaning_ignore_spaces:NTF \\ {} {\\}
+ \bool_set_false:N \l__avm_in_first_column
+ \normalfont\c_group_begin_token\__avm_font_attribute:#1%
+ \c_group_end_token\hspace{2\tabcolsep}%
+ \c_group_begin_token\__avm_font_type: #2\c_group_end_token%
+ \__avm_deinit_second_column:\span\hspace*{-2\tabcolsep}
+ \peek_meaning_ignore_spaces:NTF \\ {} {\\}
}
\cs_new:Nn \__avm_initialise_document_commands:
{
+ \def\arraystretch{\tl_use:N \l__avm_arraystretch_tl}
+ \tabcolsep=\l__avm_tabcolsep_dim
+ \delimiterfactor=\l__avm_delimfactor_int
+ \delimitershortfall=\l__avm_delimshortfall_dim
\cs_if_exist:NTF \tag
{ \RenewDocumentCommand{\tag}{m}{ \__avm_controls_tag:n {##1} } }
{ \NewDocumentCommand{\tag}{m}{ \__avm_controls_tag:n {##1} } }
+ \cs_if_exist:NTF \0
+ { \RenewDocumentCommand{\0}{}{ \__avm_controls_tag:n {0} } }
+ { \NewDocumentCommand{\0}{}{ \__avm_controls_tag:n {0} } }
\cs_if_exist:NTF \1
{ \RenewDocumentCommand{\1}{}{ \__avm_controls_tag:n {1} } }
{ \NewDocumentCommand{\1}{}{ \__avm_controls_tag:n {1} } }
@@ -637,7 +905,7 @@ Please report any bugs or feature requests to
% \end{macro}
% \begin{macro}{\__avm_parse:n}
-% Finnaly, the parser. It is build on \cs{@@_act:NNNnn} from \cmd{l3tl} (see the sub-section \emph{Token by token changes}). Many thanks to Phelype Oleinik for help on this, and in particular on help with expansion.
+% Finnaly, the parser. It is build on \cs{@@@@_act:NNNnn} from \cmd{l3tl} (see the sub-section \emph{Token by token changes}). Many thanks to Phelype Oleinik for help on this, and in particular on help with expansion.
% \begin{macrocode}
\cs_new:Npn \__avm_parse:n #1
{
@@ -685,7 +953,9 @@ Please report any bugs or feature requests to
{
\str_case:nnF {#1}
{
- { + }{ \__avm_replace_plus: }
+ { \+ }{ \__avm_replace_plus: }
+ { \- }{ \__avm_replace_minus: }
+ { \shuffle }{ \__avm_replace_circle: }
{ [ }{ \__avm_replace_lbrack: }
{ ] }{ \__avm_replace_rbrack: }
{ ( }{ \__avm_replace_lparen: }
diff --git a/Master/texmf-dist/source/latex/langsci-avm/langsci-avm.ins b/Master/texmf-dist/source/latex/langsci-avm/langsci-avm.ins
index 23df5f5846c..a60e9b54e25 100644
--- a/Master/texmf-dist/source/latex/langsci-avm/langsci-avm.ins
+++ b/Master/texmf-dist/source/latex/langsci-avm/langsci-avm.ins
@@ -12,15 +12,23 @@
\preamble
------------------------------------------------------------------------------
-langsci-avm: Attribute-value matrices (AVMs) and feature structures in LaTeX3.
+langsci-avm is aimed at typesetting beautiful feature structures,
+also known as attribute-value matrices (AVMs), for use in linguistics.
+
+The package provides a minimal and easy to read syntax.
+It depends only on the array package and can be placed almost everywhere,
+in particular in footnotes or graphs and tree structures. The package is meant
+as an update to, and serves the same purpose as, Christopher Manning’s
+avm package, but shares no code base with that package.
+
+langsci-avm was developed at Language Science Press to help in the
+production of scientific texts in linguistics.
Copyright (C) 2020 by Felix Kopecky, Language Science Press
-This work consists of the file langsci-avm.dtx &
- include/smallcaps-standalone.pdf.
+This work consists of the file langsci-avm.dtx
and the derived files langsci-avm.ins,
- langsci-avm.pdf,
- langsci-avm.sty.
+ langsci-avm.pdf.
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -30,7 +38,7 @@ of this license is at <http://www.latex-project.org/lppl.txt>.
This work is ``maintained'' (per LPPL maintenance status) by
Felix Kopecky <felix.kopecky@langsci-press.org>.
-The development version of the bundle can be found at
+The development version can be found at
https://github.com/langsci/langsci-avm
diff --git a/Master/texmf-dist/source/latex/latexbug/latexbug.dtx b/Master/texmf-dist/source/latex/latexbug/latexbug.dtx
index 822c52fc73e..0e16a4071ce 100644
--- a/Master/texmf-dist/source/latex/latexbug/latexbug.dtx
+++ b/Master/texmf-dist/source/latex/latexbug/latexbug.dtx
@@ -2,7 +2,7 @@
%
% Package latexbug for use with LaTeX2e
%
-% Copyright 2016-2019
+% Copyright 2016-2021
%
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
@@ -231,7 +231,7 @@
% \begin{macrocode}
%<*package>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{latexbug}[2019/10/15 v1.0g Bug-classification]
+\ProvidesPackage{latexbug}[2021/01/02 v1.0i Bug-classification]
% \end{macrocode}
%
% \begin{macro}{\latexbug@empty}
@@ -726,24 +726,28 @@ upsy.fd = us ,
upzd.fd = us ,
utopia.sty = us ,
%--------------------------------- expl3
-expl3.sty = us* ,
-l3sort.sty = us* ,
-l3regex.sty = us* ,
-l3tl-analysis.sty = us* ,
-xfrac.sty = us* ,
-xparse.sty = us* ,
-xtemplate.sty = us* ,
-xfrac.sty = us* ,
-xcoffins.sty = us* ,
-xgalley.sty = us* ,
-l3keys2e.sty = us* ,
expl3-code.tex = ignore ,
-l3deprecation.def = ignore ,
+expl3.sty = us* ,
l3backend-dvipdfmx.def = ignore ,
l3backend-dvips.def = ignore ,
l3backend-dvisvgm.def = ignore ,
+l3backend-luatex.def = ignore ,
l3backend-pdfmode.def = ignore ,
+l3backend-pdftex.def = ignore ,
l3backend-xdvipdfmx.def = ignore ,
+l3backend-xetex.def = ignore ,
+l3debug.def = us* ,
+l3deprecation.def = ignore ,
+l3keys2e.sty = us* ,
+l3regex.sty = us* ,
+l3sort.sty = us* ,
+l3tl-analysis.sty = us* ,
+xcoffins.sty = us* ,
+xfrac.sty = us* ,
+xfrac.sty = us* ,
+xgalley.sty = us* ,
+xparse.sty = us* ,
+xtemplate.sty = us* ,
%--------------------------------- HYPERREF
hluatex.def = ignore ,
hpdftex.def = ignore ,
diff --git a/Master/texmf-dist/source/latex/latexgit/latexgit.dtx b/Master/texmf-dist/source/latex/latexgit/latexgit.dtx
index 100d1d16a8d..2d8435fc7ba 100644
--- a/Master/texmf-dist/source/latex/latexgit/latexgit.dtx
+++ b/Master/texmf-dist/source/latex/latexgit/latexgit.dtx
@@ -16,7 +16,7 @@ latexgit
Author: Camil Staps <info@camilstaps.nl>
\endpreamble
\postamble
-Copyright (c) 2016 Camil Staps <info@camilstaps.nl>
+Copyright (c) 2016-2020 Camil Staps <info@camilstaps.nl>
Licensed under GPL v3.
\endpostamble
\usedir{tex/latex/latexgit}
@@ -226,11 +226,15 @@ Licensed under GPL v3.
%
%\DescribeMacro{\gitcommitdate}
% This macro displays the \git{} commit date.
-% The following example shows a usage example and shows the results of the
-% options
+% The following example shows the effect of the options
% \gitopt{formatDate}, \gitopt{formatTime} and \gitopt{showTimeZone}.
% \LTXinputExample[pos=b,numbers=none]{exmp/gitcommitdate.tex}
%
+%\DescribeMacro{\gitcommand}
+% This macro executes an arbitrary \git{} command and directly typesets the
+% result. It only accepts the option \gitopt{directory}.
+% \LTXinputExample[pos=b,numbers=none]{exmp/gitcommand.tex}
+%
%\section{Implementation}
%\label{sec:implementation}
%Define the package and load required packages.
@@ -240,7 +244,7 @@ Licensed under GPL v3.
% \end{comment}
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{latexgit}[2020/03/18]
+\ProvidesPackage{latexgit}[2020/04/20]
\RequirePackage{pgfkeys}
\RequirePackage{datetime}
@@ -319,6 +323,17 @@ Licensed under GPL v3.
% \end{macrocode}
%\end{macro}
%
+%\begin{macro}{\gitcommand}
+% A wrapper around \cs{git@command} and \cs{git@result}, to directly typeset the
+% result of arbitrary commands.
+% \begin{macrocode}
+\newcommand{\gitcommand}[2][]{%
+ \pgfkeys{/git,default,#1}%
+ \git@command{git #2}%
+ \git@result}
+% \end{macrocode}
+%\end{macro}
+%
%In what follows, \verb$%$ may be used in calls to \git{}. Therefore we use
%\verb$&$ as comment character.
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/latexgit/latexgit.ins b/Master/texmf-dist/source/latex/latexgit/latexgit.ins
index 532ab7ac2d1..e73c6f02b2e 100644
--- a/Master/texmf-dist/source/latex/latexgit/latexgit.ins
+++ b/Master/texmf-dist/source/latex/latexgit/latexgit.ins
@@ -15,7 +15,7 @@ latexgit
Author: Camil Staps <info@camilstaps.nl>
\endpreamble
\postamble
-Copyright (c) 2016 Camil Staps <info@camilstaps.nl>
+Copyright (c) 2016-2020 Camil Staps <info@camilstaps.nl>
Licensed under GPL v3.
\endpostamble
\usedir{tex/latex/latexgit}
@@ -23,7 +23,7 @@ Licensed under GPL v3.
\file{\jobname.sty}{\from{\jobname.dtx}{package}}
}
\endbatchfile
-%% Copyright (c) 2016 Camil Staps <info@camilstaps.nl>
+%% Copyright (c) 2016-2020 Camil Staps <info@camilstaps.nl>
%% Licensed under GPL v3.
%%
%% End of file `latexgit.ins'.
diff --git a/Master/texmf-dist/source/latex/leaflet/leaflet.dtx b/Master/texmf-dist/source/latex/leaflet/leaflet.dtx
index da7360318c2..1e1ead32055 100644
--- a/Master/texmf-dist/source/latex/leaflet/leaflet.dtx
+++ b/Master/texmf-dist/source/latex/leaflet/leaflet.dtx
@@ -1,11 +1,11 @@
% \iffalse meta-comment
%
%
-% (c) 1998 J\"urgen Schlegelmilch <schlegel@informatik.uni-rostock.de>
+% (c) 1998 Jürgen Schlegelmilch <schlegel@informatik.uni-rostock.de>
% (c) 2000 Walter Schmidt <w.a.schmidt@gmx.net>
-% (c) 2002/2004 Rolf Niepraschk <Rolf.Niepraschk@gmx.de> and
-% Hubert G\"a\ss{}lein
-% (c) 2012,... Rolf Niepraschk <Rolf.Niepraschk@gmx.de>
+% (c) 2002-2004 Rolf Niepraschk <Rolf.Niepraschk@gmx.de> and
+% Hubert Gäßlein
+% (c) 2012-2020 Rolf Niepraschk <Rolf.Niepraschk@gmx.de>
%
% This file may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -20,16 +20,15 @@
% \fi
%
% \iffalse
-%<class>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<class>\ProvidesClass{leaflet}
-%<class> [2015/12/27 v1.1a LaTeX document class (JS,WaS,RN,HjG)]
+%<class> [2020/11/06 v2.1a LaTeX document class (JS,WaS,RN,HjG)]
%
%<*driver|manual>
%<driver>\def\filename{leaflet.dtx}
%<manual>\def\filename{leaflet-manual.tex}
-\def\fileversion{v1.1b} % change this when leaflet-manual changed, too.
-\def\filedate{2017/03/17}
-\def\docdate {2015/12/27} % change this when leaflet-manual changed, too.
+\def\fileversion{v2.1a} % change this when leaflet-manual changed, too.
+\def\filedate{2020/11/06}
+\def\docdate {2020/11/06} % change this when leaflet-manual changed, too.
%</driver|manual>
%<*driver>
\listfiles
@@ -52,7 +51,7 @@
%</driver>
% \fi
%
-% \CheckSum{1303}
+% \CheckSum{1290}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -86,6 +85,8 @@
% \changes{v1.0d}{2012/06/04}{Options `twopart/notwopart' suggested
% by Luis Rivera. No more `final' in \cmd{\ExecuteOptions} suggested
% by Axel Berger (RN)}
+% \changes{v2.0d}{2020/10/25}{Using UTF8 in the preamble for author names
+% to prevent unpacking issue. (RN)}
%
% \DoNotIndex{\newcommand,\renewcommand,\newenvironment,\renewenvironment}
% \DoNotIndex{\providecommand,\def,\edef,\let,\gdef,\xdef,\global,\newtoks}
@@ -144,16 +145,30 @@
%<*class>
% \end{macrocode}
%
+% \subsection{Test whether the LaTeX format is new enough}
+% We use the 'shipout/before' hook.
+% \begin{macrocode}
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}{}{%
+ \ClassError{leaflet}{%
+ LaTeX version equal to or newer \MessageBreak
+ than '2020/10/01' is required%
+ }{%
+ Renew your TeX installation.%
+ }%
+}
+% \end{macrocode}
% \subsection{Saving some internal macros\dots}
%
% \begin{macrocode}
-\let\LL@shipout\shipout \let\LL@outputpage\@outputpage
-\let\LL@begindvi\@begindvi \let\LL@@end\@@end
+\let\LL@begindvi\@begindvi
% \end{macrocode}
% \subsection{Option processing}
%
% \changes{v1.0b}{2004/08/12}{New option
-% \texttt{nospecialtricks} for testing purposes. (RN)}
+% \texttt{nospecialtricks} for testing purposes. (RN)}
+% \changes{v2.0a}{2020/10/13}{The macro \cmd{\LenToUnit} is no longer
+% required. (RN)}
% \begin{macrocode}
\@ifundefined{iflandscape}{\newif\iflandscape}{}%
\@ifundefined{iftumble}{\newif\iftumble}{}%
@@ -213,10 +228,10 @@
\DeclareOption{foldmark}{%
\def\LL@foldmark{%
\begingroup
- \linethickness{\LenToUnit{\foldmarkrule}}%
+ \linethickness{\foldmarkrule}%
\@tempdima=\dimexpr\paperheight-\LL@tmargin
- \put(0,\LenToUnit{\@tempdima}){%
- \line(0,-1){\LenToUnit{\foldmarklength}}}%
+ \put(0,\@tempdima){%
+ \line(0,-1){\foldmarklength}}%
\endgroup}%
}
% \end{macrocode}
@@ -284,13 +299,12 @@
% \begin{macro}{\write}
% \begin{macro}{\openout}
% \begin{macro}{\closeout}
-% Im Folgenden definieren wir die \TeX{} primitives \cmd{\immediate},
-% \cmd{\write}, \cmd{\openout} und \cmd{\closeout} um. Alle nicht
-% ``immediate'' ausgef\"uhrten Anweisungen werden dem Makro
-% \cmd{\@@@pending@outs} (Kommaliste) hinzugef\"ugt. So k\"onnen speziell die
-% \cmd{\write}-Anweisungen unabh\"angig von \TeX's \cmd{\shipout}
-% zu einem g\"unstigen Zeitpunkt ausgef\"uhrt werden. For V\TeX\ we
-% must keep in mind that \cmd{\immediate}\cmd{\special} exist.
+% In the following we redefine the \TeX{} primitives \cmd{\immediate},
+% \cmd{\write}, \cmd{\openout}, and \cmd{\closeout}. All of them not
+% ``immediate'' executed statements are added to the macro
+% \cmd{\@@@pending@outs} (comma list). So especially the \cmd{\write}
+% statements independent of \TeX's \cmd{\shipout} run at a convenient time. For
+% V\TeX\ we must keep in mind that \cmd{\immediate}\cmd{\special} exist.
% \changes{v1.0b}{2004/08/12}{\cmd{\special} must be processed similar
% to e.\,g. \cmd{\write} (V\TeX). (RN)}
% \begin{macrocode}
@@ -425,21 +439,22 @@
% remaining commands must still wait until the next output page is
% ready. It works only for output commands in the main text which moved to
% the next page but not for floating output commands.
+% \changes{v2.0c}{2020/10/14}{Missing \cmd{\set@display@protect} (RN)}
% \begin{macrocode}
- \newcommand*\@@@exec@outs{%
- \begingroup
+\newcommand*\@@@exec@outs{%
+ \begingroup
% \end{macrocode}
% Pending io's $=\cmd{\@tempcntb} = \mbox{TOTAL-OUTS}\,-\,\mbox{LAST-EXEC}$
% \begin{macrocode}
- \@tempcntb\c@@@total@outs\advance\@tempcntb-\c@@@last@exec%
- \edef\reserved@a{\botmarks\@@@out@mark}%
- \ifx\reserved@a\@empty\@tempcnta\z@\else\@tempcnta\reserved@a\fi%
- \LL@debug@info{PENDING-OUTS:\the\@tempcntb\space\space
- TOTAL-OUTS:\the\c@@@total@outs\space\space
- LAST-EXEC:\the\c@@@last@exec\space\space
- TOPMARK:\topmarks\@@@out@mark\space\space
- FIRSTMARK:\firstmarks\@@@out@mark\space\space
- BOTMARK:\botmarks\@@@out@mark}%
+ \@tempcntb\c@@@total@outs\advance\@tempcntb-\c@@@last@exec%
+ \edef\reserved@a{\botmarks\@@@out@mark}%
+ \ifx\reserved@a\@empty\@tempcnta\z@\else\@tempcnta\reserved@a\fi%
+ \LL@debug@info{PENDING-OUTS:\the\@tempcntb\space\space
+ TOTAL-OUTS:\the\c@@@total@outs\space\space
+ LAST-EXEC:\the\c@@@last@exec\space\space
+ TOPMARK:\topmarks\@@@out@mark\space\space
+ FIRSTMARK:\firstmarks\@@@out@mark\space\space
+ BOTMARK:\botmarks\@@@out@mark}%
% \end{macrocode}
% Last valid pending entry $ = \cmd{\@tempcntb} =
% \mbox{PENDING-OUTS}\,-\,\mbox{TOTAL-OUTS}\,+\,\mbox{BOTMARK} $
@@ -447,33 +462,34 @@
% Number of invalid (moved) out's $ = \cmd{\@tempcnta} =
% \mbox{TOTAL-OUTS}\,-\,\mbox{BOTMARK} $
% \begin{macrocode}
- \advance\@tempcnta-\c@@@total@outs \advance\@tempcntb\@tempcnta
- \@tempcnta-\@tempcnta%
- \ifnum\@tempcnta>\z@
- \LL@debug@info{%
- >>> resave \the\@tempcnta\space output command(s).
- Too early to execute! <<<}%
- \fi
- \@tempcnta\z@ \def\reserved@b{}%
- \@for\reserved@a :=\@@@pending@outs\do{%
- \ifx\reserved@a\@empty\else
- \ifnum\@tempcnta<\@tempcntb%
- \reserved@a% execute output's related to the current page box.
- \global\advance\c@@@last@exec\@ne
- \LL@debug@info{>>> execute output command number
- \the\c@@@last@exec\space<<<}%
- \else
+ \advance\@tempcnta-\c@@@total@outs \advance\@tempcntb\@tempcnta
+ \@tempcnta-\@tempcnta%
+ \ifnum\@tempcnta>\z@
+ \LL@debug@info{%
+ >>> resave \the\@tempcnta\space output command(s).
+ Too early to execute! <<<}%
+ \fi
+ \@tempcnta\z@ \def\reserved@b{}%
+ \set@display@protect
+ \@for\reserved@a :=\@@@pending@outs\do{%
+ \ifx\reserved@a\@empty\else
+ \ifnum\@tempcnta<\@tempcntb%
+ \reserved@a% execute output's related to the current page box.
+ \global\advance\c@@@last@exec\@ne
+ \LL@debug@info{>>> execute output command number
+ \the\c@@@last@exec\space<<<}%
+ \else
% \end{macrocode}
% Other output's must be resaved and still pending.
% \begin{macrocode}
- \expandafter\g@addto@macro\expandafter\reserved@b\expandafter{%
- \reserved@a,}%
- \fi
- \advance\@tempcnta\@ne%
- \fi}%
- \expandafter\@temptokena\expandafter{\reserved@b}%
- \xdef\@@@pending@outs{\the\@temptokena}%
- \endgroup}%
+ \expandafter\g@addto@macro\expandafter\reserved@b\expandafter{%
+ \reserved@a,}%
+ \fi
+ \advance\@tempcnta\@ne%
+ \fi}%
+ \expandafter\@temptokena\expandafter{\reserved@b}%
+ \xdef\@@@pending@outs{\the\@temptokena}%
+ \endgroup}%
% \end{macrocode}
% \end{macro}
% \begin{macrocode}
@@ -498,13 +514,6 @@
\if@nobreak\ifvmode\nobreak\fi\fi}%
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\shipout}
-% We make \LaTeX's \cmd{\shipout} inefficacious (no more shipout at
-% all).
-% \begin{macrocode}
- \def\shipout{\deadcycles\z@\setbox\@tempboxa=}
-% \end{macrocode}
-% \end{macro}
% \begin{macro}{\@begindvi}
% Delay \cmd{\@begindvi} to be executed until the real page output.
% \begin{macrocode}
@@ -519,7 +528,7 @@
% package `calc'.(RN)}
% \begin{macrocode}
\LoadClass{article}
-\RequirePackage{everyshi,graphicx}
+\RequirePackage{graphicx}
% \end{macrocode}
% \begin{macro}{\LL@pagesize@specials}
% Now the graphics driver is known.
@@ -540,27 +549,27 @@
\if@tempswa
\ClassInfo{leaflet}{Generating code for dvips}%
\def\LL@pagesize@specials#1#2{%
- \@tempdima=#1\@tempdimb=#2%
+ \@tempdima=#1\@tempdimb=#2 %
\AtBeginDvi{\special{papersize=\the\@tempdima,\the\@tempdimb}}}%
\fi
\def\reserved@a{pdftex}%
\ifx\filename@base\reserved@a
\ClassInfo{leaflet}{Generating code for pdfTeX}%
\def\LL@pagesize@specials#1#2{%
- \@tempdima=#1\@tempdimb=#2%
+ \@tempdima=#1\@tempdimb=#2 %
\pdfpagewidth\@tempdima\pdfpageheight\@tempdimb}%
\fi
\def\reserved@a{luatex}%
\ifx\filename@base\reserved@a
\ClassInfo{leaflet}{Generating code for LuaTeX}%
- \ifx\pdfvariable\@undefined
+ \ifx\pdfpagewidth\@undefined
\def\LL@pagesize@specials#1#2{%
- \@tempdima=#1\@tempdimb=#2%
- \pdfpagewidth\@tempdima\pdfpageheight\@tempdimb}%
+ \@tempdima=#1\@tempdimb=#2 %
+ \pagewidth\@tempdima\pageheight\@tempdimb}%
\else
\def\LL@pagesize@specials#1#2{%
- \@tempdima=#1\@tempdimb=#2%
- \pagewidth\@tempdima\pageheight\@tempdimb}%
+ \@tempdima=#1\@tempdimb=#2 %
+ \pdfpagewidth\@tempdima\pdfpageheight\@tempdimb}%
\fi
\fi
\def\reserved@a{xetex}%
@@ -814,42 +823,32 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \begin{macro}{\LenToUnit}
-% \changes{v1.0a}{2004/08/08}{New macro \cmd{\LenToUnit}. (RN)}
-% \changes{v1.1a}{2015/12/27}{\cmd{\providecommand} instead of
-% \cmd{\newcommand}. (RN)}
-% \cmd{\LenToUnit}\marg{dimension} can be used in a
-% |picture| environment instead of multiples of \cmd{\unitlength}.
-% \begin{macrocode}
-\providecommand\LenToUnit[1]{#1\@gobble}
-% \end{macrocode}
-% \end{macro}
% \begin{macro}{\CutLine}
+% \changes{v2.1a}{2020/11/06}{Optional parameter for line type}
% \begin{macro}{\CutLine*}
% \begin{macro}{\Scissors}
-% Adds a dotted line with two scissors on the left side of the page given as
-% parameter |#1|.
-% The starred version draws only the dotted line.
+% Adds a line with two scissors on the left side of the page given as
+% parameter |#1|. The starred version draws only the line.
% \begin{macrocode}
\newcommand*\CutLine{%
\@ifstar{\@tempswatrue\LL@CutLine}{\@tempswafalse\LL@CutLine}}
\@onlypreamble\CutLine
-\newcommand*\LL@CutLine[1]{%
+\newcommand*\LL@CutLine[2][.]{%
\ifLL@combine
\ifx\Scissors\@empty\@tempswatrue\fi
- \if@tempswa
- \AddToBackground{#1}{%
- \put(0,0){%
- \rotatebox{90}{\makebox(\LenToUnit{\paperheight},0){%
- \normalsize
- \dotfill}}}}%
- \else
- \AddToBackground{#1}{%
- \put(0,0){%
- \rotatebox{90}{\makebox(\LenToUnit{\paperheight},0){%
- \normalsize
- \dotfill\Scissors\dotfill\dotfill\Scissors\dotfill}}}}%
- \fi
+ \if .#1%
+ \def\@tempa{\dotfill}%
+ \else\if -#1%
+ \def\@tempa{\hrulefill}%
+ \fi\fi
+ \edef\@tempb{%
+ \noexpand\AddToBackground{#2}{%
+ \noexpand\put(0,0){%
+ \noexpand\rotatebox{90}{\noexpand\makebox(\paperheight,0){%
+ \noexpand\normalsize\@tempa\if@tempswa\else\noexpand\Scissors%
+ \@tempa\@tempa\noexpand\Scissors\@tempa\fi}}}}%
+ }%
+ \@tempb
\fi}
\IfFileExists{pifont.sty}
{\RequirePackage{pifont}%
@@ -876,7 +875,7 @@
% \end{macro}
% We use our own page saving macro instead of real \LaTeX\ output.
% \begin{macrocode}
-\AtBeginDocument{\EveryShipout{\LL@savePage}}
+\AtBeginDocument{\AddToHook{shipout/before}{\LL@processPage}}
% \end{macrocode}
% \begin{macro}{LL@page}
% A counter for the small pages (absolute counting).
@@ -885,14 +884,20 @@
\newcommand\LL@tempa{}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\LL@savePage}
+% \begin{macro}{\LL@processPage}
% With ``combine'' option the six small pages will be saved in box registers
% (\cmd{\LL@boxI}\dots \cmd{\LL@boxVI}).
-% The box255 with the page content must be a bit moved to get a
-% ``normal-sized'' box.
+% The \cmd{\ShipoutBox} with the page content must be a bit moved to get a
+% ``normal-sized'' box. In ``nocombine'' mode only put the background picture.
% \changes{v1.1a}{2015/12/27}{Additions for new option `foldcorr'. (RN)}
-% \begin{macrocode}
-\newcommand*\LL@savePage{%
+% \changes{v2.0a}{2020/10/13}{Do not call \cmd{\@@@exec@outs} temporarily. (RN)}
+% \changes{v2.0a}{2020/10/13}{Using \LaTeX's new 'shipout/before' hook. (RN)}
+% \changes{v2.0b}{2020/10/14}{Renamed \cmd{\LL@savePage} to
+% \cmd{\LL@processPage}. (RN)}
+% \changes{v2.0c}{2020/10/14}{Activated \cmd{\@@@exec@outs} again. (RN)}
+% \begin{macrocode}
+\newcommand*\LL@processPage{%
+ \ifLL@combine\DiscardShipoutBox\fi
\ifnum\c@LL@page<7\relax
\LL@tempdima=\paperwidth
\ifLL@combine
@@ -910,16 +915,17 @@
\fi
\@@@exec@outs
\expandafter\newsavebox\csname LL@box\Roman{LL@page}\endcsname%
- \setbox\@cclv=\vbox{\vskip1in\unvbox\@cclv}%
- \setbox\@cclv=\vbox{\moveright1in\box\@cclv}%
- \setbox\@cclv=\hb@xt@\paperwidth{\box\@cclv\hss}%
- \iffoldcorr\setbox\@cclv=\hb@xt@\LL@tempdima{\hss\box\@cclv\hss}\fi
+ \setbox\ShipoutBox=\vbox{\vskip1in\unvbox\ShipoutBox}%
+ \setbox\ShipoutBox=\vbox{\moveright1in\box\ShipoutBox}%
+ \setbox\ShipoutBox=\hb@xt@\paperwidth{\box\ShipoutBox\hss}%
+ \iffoldcorr
+ \setbox\ShipoutBox=\hb@xt@\LL@tempdima{\hss\box\ShipoutBox\hss}\fi
% \end{macrocode}
% Add a background picture to a single small page (`combine').
% \begin{macrocode}
- \setbox\@cclv=\vb@xt@\paperheight{%
+ \setbox\ShipoutBox=\vb@xt@\paperheight{%
\vbox{%
- \pictur@(0,0)(0,\LenToUnit{\paperheight})%
+ \pictur@(0,0)(0,\paperheight)%
\begingroup
\set@typeset@protect
\paperwidth=\LL@tempdima
@@ -927,26 +933,26 @@
\endgroup
\endpicture
}%
- \nointerlineskip\box\@cclv\vss
+ \nointerlineskip\box\ShipoutBox\vss
}%
\global\expandafter\setbox
- \csname LL@box\Roman{LL@page}\endcsname=\box\@cclv
+ \csname LL@box\Roman{LL@page}\endcsname=\box\ShipoutBox
\typeout{\@spaces[\the\c@LL@page] ==> [\Roman{LL@page}]}%
\else
% \end{macrocode}
% Add a background picture to a single small page (`nocombine').
% \begin{macrocode}
- \setbox\@cclv\vbox{%
+ \setbox\ShipoutBox\vbox{%
\vbox{\@tempdima=1in\relax
\@tempdimb=\paperheight\advance\@tempdimb-\@tempdima
- \pictur@(0,0)(\LenToUnit{\@tempdima},\LenToUnit{\@tempdimb})%
+ \pictur@(0,0)(\@tempdima,\@tempdimb)%
\begingroup
\set@typeset@protect
\@nameuse{LL@smallPic\Roman{LL@page}}%
\endgroup
\endpicture
}%
- \nointerlineskip\box\@cclv
+ \nointerlineskip\box\ShipoutBox
}%
\fi
\fi
@@ -967,53 +973,57 @@
% \end{macrocode}
% \end{macro}
%
-% \subsubsection{Generating missing small pages}
-%
-% NOTE TO OURSELVES:
+% \noindent NOTE TO OURSELVES:
% All the following must be done if the document code is already
-% processed.
-% \begin{macrocode}
-\ifLL@combine
-% \end{macrocode}
-% \begin{macro}{\@@end}
-% \begin{macrocode}
- \def\@@end{%
- \clearpage\pagestyle{empty}%
+% processed.
+%
+% \changes{v2.0b}{2020/10/14}{Using hooks instead of redefinition
+% of \cmd{\@@end}. (RN)}
+% \begin{macro}{\LL@add@empty@pages}
+% Generating missing small pages
+% \begin{macrocode}
+\newcommand*\LL@add@empty@pages{%
+ \clearpage\pagestyle{empty}%
+ \loop\ifnum\c@LL@page<7\relax
+ \ClassInfo{leaflet}{Generating empty page \the\c@page}%
+ \null\newpage
+ \repeat
+}
% \end{macrocode}
-% Restore the original \cmd{\@outputpage} command (removing any related
-% background pictures).
+% \end{macro}
+% \begin{macro}{\LL@shipout@combined@pages}
% \begin{macrocode}
- \let\@outputpage\LL@outputpage
+\newcommand*\LL@shipout@combined@pages{%
% \end{macrocode}
-% Suppresses all everyshi's clients (removing other kinds of
-% background pictures) but our page saving macro is still needed for
+%
+% \subsubsection{Reassembling the small pages}
+%
+% Suppresses all shipout hook's clients (removing other kinds of
+% background pictures). Our page saving macro is still needed for
% the next step and must be set again.
+% \changes{v2.0b}{2020/10/14}{Suppress other background images. (RN)}
% \begin{macrocode}
- \def\@EveryShipout@Hook{}%
- \def\@EveryShipout@AtNextHook{}%
- \EveryShipout{\LL@savePage}%
+ \RemoveFromHook{shipout/foreground}[*]
+ \RemoveFromHook{shipout/background}[*]
+ \RemoveFromHook{shipout/lastpage}[*]
+ \RemoveFromHook{shipout/before}[*]
+ \AddToHook{shipout/before}{\LL@processPage}
% \end{macrocode}
% Create empty pages if necessary.
% \begin{macrocode}
- \loop\ifnum\c@LL@page<7\relax
- \ClassInfo{leaflet}{Generating empty page \the\c@page}%
- \null\newpage
- \repeat
+ \LL@add@empty@pages
% \end{macrocode}
-%
-% \subsubsection{Reassembling the small pages}
-%
-% Here begins the real output using \LaTeX's original \cmd{\shipout}.
-% The \textsf{everyshi} package isn't active any more.
-% The begin dvi hook is reactivated.
-% \begin{macrocode}
- \let\shipout\LL@shipout \let\@begindvi\LL@begindvi
- \paperwidth=3\paperwidth
- \iflandscape
- \LL@pagesize@specials{\paperwidth}{\paperheight}%
- \else
- \LL@pagesize@specials{\paperheight}{\paperwidth}%
- \fi
+% Here begins the real output. LaTeX's \cmd{\shipout} will no more suppressed.
+% The begin dvi hook is reactivated. Final removing content from the hook.
+% \begin{macrocode}
+ \RemoveFromHook{shipout/before}[*]
+ \let\@begindvi\LL@begindvi
+ \paperwidth=3\paperwidth
+ \iflandscape
+ \LL@pagesize@specials{\paperwidth}{\paperheight}%
+ \else
+ \LL@pagesize@specials{\paperheight}{\paperwidth}%
+ \fi
% \end{macrocode}
% \begin{macro}{\LL@shipoutPage}
% \changes{v1.0c}{2004/08/13}{Fix \cmd{\protect}-ion problems. (RN/HjG)}
@@ -1024,22 +1034,22 @@
% Helper macros for page output: reassemble the small pages.
%
% \begin{macrocode}
- \newcommand*\LL@shipoutPage[1]{%
+ \newcommand*\LL@shipoutPage[1]{%
% \set@display@protect
- \let \protect \noexpand
- \shipout\vb@xt@\paperheight{%
- \set@typeset@protect
- \vskip-1in%
- \@begindvi\hb@xt@\paperwidth{\hskip-1in##1\hss}\vss}}%
- \newcommand*\LL@preparePages[3]{%
- \typeout{[\@Roman{##1}\space\@Roman{##2}\space\@Roman{##3}] ==>}%
+ \let \protect \noexpand
+ \shipout\vb@xt@\paperheight{%
+ \set@typeset@protect
+ \vskip-1in%
+ \@begindvi\hb@xt@\paperwidth{\hskip-1in##1\hss}\vss}}%
+ \newcommand*\LL@preparePages[3]{%
+ \typeout{[\@Roman{##1}\space\@Roman{##2}\space\@Roman{##3}] ==>}%
% \end{macrocode}
% Add a background picture to a large page.
% \begin{macrocode}
- \pictur@(0,0)\@nameuse{LL@largePic\Roman{page}}\endpicture%
- \LL@preparePage{##1}\LL@preparePage{##2}\LL@preparePage{##3}}%
- \newcommand*\LL@preparePage[1]{%
- \expandafter\box\csname LL@box\@Roman{##1}\endcsname}%
+ \pictur@(0,0)\@nameuse{LL@largePic\Roman{page}}\endpicture%
+ \LL@preparePage{##1}\LL@preparePage{##2}\LL@preparePage{##3}}%
+ \newcommand*\LL@preparePage[1]{%
+ \expandafter\box\csname LL@box\@Roman{##1}\endcsname}%
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1049,35 +1059,31 @@
% order, to allow the typesetting of a 4 page leaflet and a detachable 2 page
% form, for summaries, fill-in forms, applications, questionnaires, etc.
% \begin{macrocode}
- \LL@selectOutput
- \iftwopart
- {\setcounter{page}{1}%
- \LL@shipoutPage{\LL@rotate@I{\LL@preparePages{6}{4}{1}}}}%
- {\setcounter{page}{2}%
- \LL@shipoutPage{\LL@rotate@II{\LL@preparePages{2}{3}{5}}}}%
- \else
- {\setcounter{page}{1}%
- \LL@shipoutPage{\LL@rotate@I{\LL@preparePages{5}{6}{1}}}}%
- {\setcounter{page}{2}%
- \LL@shipoutPage{\LL@rotate@II{\LL@preparePages{2}{3}{4}}}}%
- \fi
- \LL@@end
- }%
+ \LL@selectOutput
+ \iftwopart
+ {\setcounter{page}{1}%
+ \LL@shipoutPage{\LL@rotate@I{\LL@preparePages{6}{4}{1}}}}%
+ {\setcounter{page}{2}%
+ \LL@shipoutPage{\LL@rotate@II{\LL@preparePages{2}{3}{5}}}}%
+ \else
+ {\setcounter{page}{1}%
+ \LL@shipoutPage{\LL@rotate@I{\LL@preparePages{5}{6}{1}}}}%
+ {\setcounter{page}{2}%
+ \LL@shipoutPage{\LL@rotate@II{\LL@preparePages{2}{3}{4}}}}%
+ \fi
+}%
% \end{macrocode}
-% End of the redefinition of \cmd{\@@end}.
% \end{macro}
-% \begin{macrocode}
+% \begin{macrocode}
+\ifLL@combine
+ \AddToHook{enddocument/end}{\LL@shipout@combined@pages}
\else
% \end{macrocode}
% Create empty pages if necessary and then call the normal \LaTeX\ end.
% \begin{macrocode}
\LL@pagesize@specials{\paperwidth}{\paperheight}%
\AtEndDocument{%
- \clearpage\pagestyle{empty}%
- \loop\ifnum\c@LL@page<7\relax
- \ClassInfo{leaflet}{Generating empty page \the\c@page}%
- \null\newpage
- \repeat
+ \LL@add@empty@pages
}
\fi
%</class>
@@ -1138,8 +1144,7 @@
\MakeShortVerb{\|}
\usepackage{url}
\usepackage{graphicx}
-\usepackage[dvipsnames,usenames]{color}
-\definecolor{LIGHTGRAY}{gray}{.9}
+\usepackage[svgnames]{xcolor}
%%%%\renewcommand{\descfont}{\normalfont}
\newcommand\Lpack[1]{\textsf{#1}}
@@ -1156,17 +1161,17 @@
Hubert G\"a\ss lein}
\date{Last updated~\docdate\\printed \today}
-\CutLine*{1}% Dotted line without scissors
-\CutLine{6}% Dotted line with scissors
+\CutLine*{1}% Dotted line without scissors (same as \CutLine*[.]{1})
+\CutLine[-]{6}% Solid line with scissors
\AddToBackground{5}{% Background of a small page
- \put(0,0){\textcolor{Cerulean}{\rule{\paperwidth}{\paperheight}}}}
+ \put(0,0){\textcolor{LightSkyBlue}{\rule{\paperwidth}{\paperheight}}}}
\AddToBackground*{2}{% Background of a large page
- \put(\LenToUnit{.5\paperwidth},\LenToUnit{.5\paperheight}){%
+ \put(.5\paperwidth,.5\paperheight){%
\makebox(0,0)[c]{%
\resizebox{.9\paperwidth}{!}{\rotatebox{35.26}{%
- \textsf{\textbf{\textcolor{LIGHTGRAY}{BACKGROUND}}}}}}}}
+ \textsf{\textbf{\textcolor{LightGray}{BACKGROUND}}}}}}}}
\begin{document}
@@ -1208,10 +1213,6 @@ document is created in PostScript or PDF format, using
\end{itemize}
(Some other drivers supported by standard \LaTeX{} work as well.)
-The non-standard macro package \Lpack{everyshi} \cite{cit:everyshi} is
-used by the \Lclass{leaflet} class.
-
-
\section{Features}
Basically the \Lclass{leaflet} class provides the same features as the
@@ -1401,9 +1402,6 @@ this document class.
\bibitem{cit:latex-man}
\textsc{L.\,Lamport}: \LaTeX. A Document Preparation System.
\textit{User's Guide And Reference Manual.} Second Edition. 1994.
-\bibitem{cit:everyshi}
- \textsc{M.\,Schr\"oder}: The \Lpack{everyshi} package. 2001.
- CTAN: \url{macros/latex/contrib/ms/everyshi.dtx}
\end{thebibliography}
\loggingall
diff --git a/Master/texmf-dist/source/latex/leaflet/leaflet.ins b/Master/texmf-dist/source/latex/leaflet/leaflet.ins
index af980d0555d..50b802b47f2 100644
--- a/Master/texmf-dist/source/latex/leaflet/leaflet.ins
+++ b/Master/texmf-dist/source/latex/leaflet/leaflet.ins
@@ -3,15 +3,19 @@
\preamble
-Copyright (C) 2003, 2004, ...
-Rolf Niepraschk, Rolf.Niepraschk@gmx.de
-Hubert Gaesslein, hubertjg@gmx.de
+(c) 1998 Jürgen Schlegelmilch <schlegel@informatik.uni-rostock.de>
+(c) 2000 Walter Schmidt <w.a.schmidt@gmx.net>
+(c) 2002-2004 Rolf Niepraschk <Rolf.Niepraschk@gmx.de> and
+ Hubert Gäßlein
+(c) 2012-2020 Rolf Niepraschk <Rolf.Niepraschk@gmx.de>
-This work may be distributed and/or modified under the
+This file 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
- http://www.latex-project.org/lppl.txt
+The latest version of this license is in:
+
+ http://www.latex-project.org/lppl.txt
+
and version 1.3 or later is part of all distributions of LaTeX
version 2003/12/01 or later.
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/fonts/README-emmentaler b/Master/texmf-dist/source/latex/lilyglyphs/fonts/README-emmentaler
new file mode 100644
index 00000000000..4208f11aa0f
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/fonts/README-emmentaler
@@ -0,0 +1,8 @@
+The archive emmentaler-2-18-0 contains
+the Metafont sources used to create the
+Emmentaler OpenType fonts in the /fonts
+directory.
+They were taken from LilyPond's original
+Git repository at
+http://savannah.gnu.org/git/?group=lilypond
+with the 2.18.0 release checked out.
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/fonts/emmentaler-2-18-0.zip b/Master/texmf-dist/source/latex/lilyglyphs/fonts/emmentaler-2-18-0.zip
new file mode 100644
index 00000000000..7b2cbc3284c
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/fonts/emmentaler-2-18-0.zip
Binary files differ
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/_template.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/_template.ly
new file mode 100644
index 00000000000..53e4b907d9c
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/_template.ly
@@ -0,0 +1,54 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This file defines a set of glyphs to be compiled in LilyPond %
+% %
+% EXAMPLE %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\version "2.17.5"
+
+%%lilyglyphs
+% example comment
+exampleCommand = {
+ g'4
+}
+
+\markup { exampleCommand}
+symbol = \exampleCommand
+\include "score.ily"
+
+% Example ends here
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/beamednotes.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/beamednotes.ly
new file mode 100644
index 00000000000..542fe054fcd
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/beamednotes.ly
@@ -0,0 +1,111 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This file defines a set of glyphs to be compiled in LilyPond %
+% %
+% Beamed notes %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\version "2.17.5"
+
+%%%%%%%%%%%%%%%%%%%%%%%
+% Groups with two beams
+
+%%lilyglyphs
+% two beamed quavers with diagonal beam
+%%protected
+twoBeamedQuavers = {
+ \override Beam#'damping = 0
+ d'8[ e']
+}
+
+\markup { twoBeamedQuavers }
+symbol = \twoBeamedQuavers
+\include "score.ily"
+
+%%%%%%%%%%%%%%%%%%%%%%%%%
+% Groups with three beams
+
+%%lilyglyphs
+% raise=-0.6
+% scale=0.9
+% three beamed quavers
+%%protected
+threeBeamedQuavers = {
+ \override Beam #'positions = #'(1 . 1)
+ e'8[ e' e']
+}
+
+\markup { threeBeamedQuavers }
+symbol = \threeBeamedQuavers
+\include "score.ily"
+
+%%lilyglyphs
+% three beamed quavers, second dotted
+%%protected
+threeBeamedQuaversI = {
+ \override Beam #'positions = #'(1 . 1)
+ \override Score.SpacingSpanner #'common-shortest-duration = #(ly:make-moment 1/8)
+ e'8[ e'8. e'16]
+}
+
+\markup { threeBeamedQuaversI }
+symbol = \threeBeamedQuaversI
+\include "score.ily"
+
+%%lilyglyphs
+% three beamed quavers, first dotted
+%%protected
+threeBeamedQuaversII = {
+ \override Beam #'positions = #'(1 . 1)
+ \override Score.SpacingSpanner #'common-shortest-duration = #(ly:make-moment 1/12)
+ e'8.[ e'16 e'8]
+}
+
+\markup { threeBeamedQuaversII }
+symbol = \threeBeamedQuaversII
+\include "score.ily"
+
+%%lilyglyphs
+% three beamed quavers, last dotted
+%%protected
+threeBeamedQuaversIII = {
+ \override Beam #'positions = #'(1 . 1)
+ \override Score.SpacingSpanner #'common-shortest-duration = #(ly:make-moment 1/12)
+ e'16[ e'8. e'8]
+}
+
+\markup { threeBeamedQuaversIII }
+symbol = \threeBeamedQuaversIII
+\include "score.ily"
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/dynamicsigns.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/dynamicsigns.ly
new file mode 100644
index 00000000000..70e39770428
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/dynamicsigns.ly
@@ -0,0 +1,62 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This file defines a set of glyphs to be compiled in LilyPond %
+% %
+% Beamed notes %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\version "2.17.5"
+
+
+%%lilyglyphs
+% crescendo hairpin
+crescHairpin = {
+ s1\< s4\!
+}
+
+\markup { crescHairpin }
+symbol = \crescHairpin
+\include "score.ily"
+
+
+%%lilyglyphs
+% decrescendo hairpin
+decrescHairpin = {
+ s1\> s4\!
+}
+
+\markup { decrescHairpin }
+symbol = \decrescHairpin
+\include "score.ily"
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/fancyexamples.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/fancyexamples.ly
new file mode 100644
index 00000000000..b065b1450b1
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/fancyexamples.ly
@@ -0,0 +1,61 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This file defines a set of glyphs to be compiled in LilyPond %
+% %
+% EXAMPLE %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\version "2.17.5"
+
+%{ template for a single entry
+ replace 'EXAMPLE_...' by actual content %}
+
+%%lilyglyphs
+% example of a fancy notation
+lilyFancyExample = \relative e' {
+ \override NoteHead.transparent = ##t
+ \override Stem #'length = #4
+ \override Stem #'thickness = #1.6
+ e4-.( e-. e-. e-.) \glissando
+ s4 \stemDown a4 \laissezVibrer
+}
+
+\markup { lilyFancyExample }
+symbol = \fancyExample
+\include "score.ily"
+
+% Example ends here
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/score.ily b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/score.ily
new file mode 100644
index 00000000000..2f98d32dc1b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/score.ily
@@ -0,0 +1,49 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This file is to be included in the definitions .ly files %
+% %
+% Use it to have a LilyPond-compilable .ly file if you want %
+% to visually check your new glyphs before creating the %
+% LaTeX commands %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \symbol
+} \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/singlenotes.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/singlenotes.ly
new file mode 100644
index 00000000000..a30853c49bc
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/definitions/singlenotes.ly
@@ -0,0 +1,377 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This file defines a set of glyphs to be compiled in LilyPond %
+% %
+% Single notes %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\version "2.17.5"
+
+%{ template for a single entry
+ replace 'EXAMPLE_...' by actual content %}
+%%lilyglyphs
+%%protected (use this line if you don't want the command to be generated)
+% EXAMPLE_comment
+EXAMPLE_command_name = {
+ g'4
+}
+
+\markup { EXAMPLE_command_name }
+symbol = \EXAMPLE_command_name
+\include "score.ily"
+
+% Example ends here
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%lilyglyphs
+% half note with upward stem
+%%protected
+halfNote = {
+ \override Stem#'length = 5
+ g'2
+}
+
+\markup { halfNote }
+symbol = \halfNote
+\include "score.ily"
+
+%%lilyglyphs
+% half note with downward stem
+% scale=0.75
+% raise=-0.4
+%%protected
+halfNoteDown = {
+ \stemDown
+ \override Stem#'length = 5
+ g'2
+}
+
+%%lilyglyphs
+% dotted half note with upward stem
+%%protected
+halfNoteDotted = {
+ \override Stem#'length = 5
+ g'2.
+}
+
+\markup { halfNoteDotted }
+symbol = \halfNoteDotted
+\include "score.ily"
+
+%%lilyglyphs
+% dotted half note with downward stem
+%%protected
+halfNoteDottedDown = {
+ \stemDown
+ \override Stem#'length = 5
+ g'2.
+}
+
+%%lilyglyphs
+% doubledotted half note with upward stem
+%%protected
+halfNoteDottedDouble = {
+ \override Stem#'length = 5
+ g'2..
+}
+
+\markup { halfNoteDottedDouble }
+symbol = \halfNoteDottedDouble
+\include "score.ily"
+
+%%lilyglyphs
+% doubledotted half note with downward stem
+%%protected
+halfNoteDottedDoubleDown = {
+ \stemDown
+ \override Stem#'length = 5
+ g'2..
+}
+
+%%lilyglyphs
+% crotchet with upward stem
+%%protected
+crotchet = {
+ \override Stem#'length = 5
+ g'4
+}
+
+\markup { crotchet }
+symbol = \crotchet
+\include "score.ily"
+
+%%lilyglyphs
+% crotchet with downward stem
+%%protected
+crotchetDown = {
+ \stemDown
+ \override Stem#'length = 5
+ g'4
+}
+
+%%lilyglyphs
+% dotted crotchet with upward stem
+%%protected
+crotchetDotted = {
+ \override Stem#'length = 5
+ g'4.
+}
+
+\markup { crotchetDotted }
+symbol = \crotchetDotted
+\include "score.ily"
+
+%%lilyglyphs
+% dotted crotchet with downward stem
+%%protected
+crotchetDottedDown = {
+ \stemDown
+ \override Stem#'length = 5
+ g'4.
+}
+
+%%lilyglyphs
+% doubledotted crotchet with upward stem
+%%protected
+crotchetDottedDouble = {
+ \override Stem#'length = 5
+ g'4..
+}
+
+\markup { crotchetDottedDouble }
+symbol = \crotchetDottedDouble
+\include "score.ily"
+
+
+%%lilyglyphs
+% doubledotted crotchet with upward stem
+%%protected
+crotchetDottedDoubleDown = {
+ \stemDown
+ \override Stem#'length = 5
+ g'4..
+}
+
+%%lilyglyphs
+% quaver with upward stem
+%%protected
+quaver = {
+ \override Stem#'length = 6
+ g'8
+}
+
+%%lilyglyphs
+% quaver with downward stem
+%%protected
+quaverDown = {
+ \stemDown
+ \override Stem#'length = 6
+ g'8
+}
+
+\markup { quaver }
+symbol = \quaver
+\include "score.ily"
+
+%%lilyglyphs
+% dotted quaver with upward stem
+%%protected
+quaverDotted = {
+ \override Stem#'length = 6
+ g'8.
+}
+
+\markup { quaverDotted }
+symbol = \quaverDotted
+\include "score.ily"
+
+
+%%lilyglyphs
+% dotted quaver with downward stem
+%%protected
+quaverDottedDown = {
+ \stemDown
+ \override Stem#'length = 6
+ g'8.
+}
+
+%%lilyglyphs
+% doubledotted quaver with upward stem
+%%protected
+quaverDottedDouble = {
+ \override Stem#'length = 6
+ g'8..
+}
+
+\markup { quaverDottedDouble }
+symbol = \quaverDottedDouble
+\include "score.ily"
+
+%%lilyglyphs
+% doubledotted quaver with downward stem
+%%protected
+quaverDottedDoubleDown = {
+ \stemDown
+ \override Stem#'length = 6
+ g'8..
+}
+
+%%lilyglyphs
+% semiquaver with upward stem
+%%protected
+semiquaver = {
+ \override Stem#'length = #6.5
+ g'16
+}
+
+\markup { semiquaver }
+symbol = \semiquaver
+\include "score.ily"
+
+
+%%lilyglyphs
+% semiquaver with downward stem
+%%protected
+semiquaverDown = {
+ \stemDown
+ \override Stem#'length = #6.5
+ g'16
+}
+
+%%lilyglyphs
+% dotted semiquaver with upward stem
+%%protected
+semiquaverDotted = {
+ \override Stem#'length = #6.5
+ g'16.
+}
+
+\markup { semiquaverDotted }
+symbol = \semiquaverDotted
+\include "score.ily"
+
+%%lilyglyphs
+% dotted semiquaver with downward stem
+%%protected
+semiquaverDottedDown = {
+ \stemDown
+ \override Stem#'length = #6.5
+ g'16.
+}
+
+%%lilyglyphs
+% doubledotted semiquaver with upward stem
+%%protected
+semiquaverDottedDouble = {
+ \override Stem#'length = #6.5
+ g'16..
+}
+
+\markup { semiquaverDottedDouble }
+symbol = \semiquaverDottedDouble
+\include "score.ily"
+
+%%lilyglyphs
+% doubledotted semiquaver with downward stem
+%%protected
+semiquaverDottedDoubleDown = {
+ \stemDown
+ \override Stem#'length = #6.5
+ g'16..
+}
+
+%%lilyglyphs
+% demisemiquaver with upward stem
+%%protected
+demisemiquaver = {
+ \override Stem#'length = #7.5
+ g'32
+}
+
+\markup { demisemiquaver }
+symbol = \demisemiquaver
+\include "score.ily"
+
+
+%%lilyglyphs
+% demisemiquaver with downward stem
+%%protected
+demisemiquaverDown = {
+ \stemDown
+ \override Stem#'length = #7.5
+ g'32
+}
+
+%%lilyglyphs
+% dotted demisemiquaver with upward stem
+%%protected
+demisemiquaverDotted = {
+ \override Stem#'length = #7.5
+ g'32.
+}
+
+\markup { demisemiquaverDotted }
+symbol = \demisemiquaverDotted
+\include "score.ily"
+
+%%lilyglyphs
+% dotted demisemiquaver with downward stem
+%%protected
+demisemiquaverDottedDown = {
+ \stemDown
+ \override Stem#'length = #7.5
+ g'32.
+}
+
+%%lilyglyphs
+% doubledotted demisemiquaver with upward stem
+%%protected
+demisemiquaverDottedDouble = {
+ \override Stem#'length = #7.5
+ g'32..
+}
+
+\markup { demisemiquaverDottedDouble }
+symbol = \demisemiquaverDottedDouble
+\include "score.ily"
+
+%%lilyglyphs
+% doubledotted demisemiquaver with downward stem
+%%protected
+demisemiquaverDottedDoubleDown = {
+ \stemDown
+ \override Stem#'length = #7.5
+ g'32..
+}
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crescHairpin.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crescHairpin.ly
new file mode 100644
index 00000000000..416a76f2578
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crescHairpin.ly
@@ -0,0 +1,69 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% crescHairpin.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-09
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+crescendo hairpin
+%}
+
+crescHairpin = {
+ s1\< s4\!
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \crescHairpin
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchet.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchet.ly
new file mode 100644
index 00000000000..0cbe3b372f9
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchet.ly
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% crotchet.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-09
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+crotchet with upward stem
+%}
+
+crotchet = {
+ \override Stem#'length = 5
+ g'4
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \crotchet
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDotted.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDotted.ly
new file mode 100644
index 00000000000..af16947f74f
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDotted.ly
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% crotchetDotted.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-09
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+dotted crotchet with upward stem
+%}
+
+crotchetDotted = {
+ \override Stem#'length = 5
+ g'4.
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \crotchetDotted
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDottedDouble.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDottedDouble.ly
new file mode 100644
index 00000000000..f3492e3eae6
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDottedDouble.ly
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% crotchetDottedDouble.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-09
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+doubledotted crotchet with upward stem
+%}
+
+crotchetDottedDouble = {
+ \override Stem#'length = 5
+ g'4..
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \crotchetDottedDouble
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDottedDoubleDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDottedDoubleDown.ly
new file mode 100644
index 00000000000..cff9a90e5f9
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDottedDoubleDown.ly
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% crotchetDottedDoubleDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+doubledotted crotchet with upward stem
+%}
+
+crotchetDottedDoubleDown = {
+ \stemDown
+ \override Stem#'length = 5
+ g'4..
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \crotchetDottedDoubleDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDottedDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDottedDown.ly
new file mode 100644
index 00000000000..39f042100f4
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDottedDown.ly
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% crotchetDottedDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+dotted crotchet with downward stem
+%}
+
+crotchetDottedDown = {
+ \stemDown
+ \override Stem#'length = 5
+ g'4.
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \crotchetDottedDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDown.ly
new file mode 100644
index 00000000000..00e0a719849
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-crotchetDown.ly
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% crotchetDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+crotchet with downward stem
+%}
+
+crotchetDown = {
+ \stemDown
+ \override Stem#'length = 5
+ g'4
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \crotchetDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-decrescHairpin.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-decrescHairpin.ly
new file mode 100644
index 00000000000..1f43d7ba45d
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-decrescHairpin.ly
@@ -0,0 +1,69 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% decrescHairpin.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-09
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+decrescendo hairpin
+%}
+
+decrescHairpin = {
+ s1\> s4\!
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \decrescHairpin
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaver.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaver.ly
new file mode 100644
index 00000000000..a829678420f
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaver.ly
@@ -0,0 +1,71 @@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% demisemiquaver.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by lily-image-commands.py on 2013-11-21
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+demisemiquaver with upward stem
+%}
+
+demisemiquaver = {
+ \override Stem#'length = #7.5
+ g'32
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \demisemiquaver
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDotted.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDotted.ly
new file mode 100644
index 00000000000..3e1f112b3ec
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDotted.ly
@@ -0,0 +1,71 @@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% demisemiquaverDotted.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by lily-image-commands.py on 2013-11-21
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+dotted demisemiquaver with upward stem
+%}
+
+demisemiquaverDotted = {
+ \override Stem#'length = #7.5
+ g'32.
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \demisemiquaverDotted
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDottedDouble.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDottedDouble.ly
new file mode 100644
index 00000000000..afb6f6f71a9
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDottedDouble.ly
@@ -0,0 +1,71 @@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% demisemiquaverDottedDouble.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by lily-image-commands.py on 2013-11-21
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+doubledotted demisemiquaver with upward stem
+%}
+
+demisemiquaverDottedDouble = {
+ \override Stem#'length = #7.5
+ g'32..
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \demisemiquaverDottedDouble
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDottedDoubleDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDottedDoubleDown.ly
new file mode 100644
index 00000000000..1dc8d900a10
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDottedDoubleDown.ly
@@ -0,0 +1,72 @@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% demisemiquaverDottedDoubleDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by lily-image-commands.py on 2013-11-21
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+doubledotted demisemiquaver with downward stem
+%}
+
+demisemiquaverDottedDoubleDown = {
+ \stemDown
+ \override Stem#'length = #7.5
+ g'32..
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \demisemiquaverDottedDoubleDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDottedDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDottedDown.ly
new file mode 100644
index 00000000000..ebffc5a99dd
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDottedDown.ly
@@ -0,0 +1,72 @@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% demisemiquaverDottedDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by lily-image-commands.py on 2013-11-21
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+dotted demisemiquaver with downward stem
+%}
+
+demisemiquaverDottedDown = {
+ \stemDown
+ \override Stem#'length = #7.5
+ g'32.
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \demisemiquaverDottedDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDown.ly
new file mode 100644
index 00000000000..ddb9be80bce
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-demisemiquaverDown.ly
@@ -0,0 +1,72 @@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% demisemiquaverDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by lily-image-commands.py on 2013-11-21
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+demisemiquaver with downward stem
+%}
+
+demisemiquaverDown = {
+ \stemDown
+ \override Stem#'length = #7.5
+ g'32
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \demisemiquaverDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-fancyExample.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-fancyExample.ly
new file mode 100644
index 00000000000..280e51e69ec
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-fancyExample.ly
@@ -0,0 +1,74 @@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% fancyExample.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by genImageCommands.py on 2013-09-07
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+example of a fancy notation
+%}
+
+fancyExample = {
+ \override NoteHead.transparent = ##t
+ \override Stem #'length = #4
+ \override Stem #'thickness = #1.6
+ e4-.( e-. e-. e-.) \glissando
+ s4 \stemDown a4 \laissezVibrer
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \fancyExample
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNote.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNote.ly
new file mode 100644
index 00000000000..bf24de1a11f
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNote.ly
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% halfNote.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-09
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+half note with upward stem
+%}
+
+halfNote = {
+ \override Stem#'length = 5
+ g'2
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \halfNote
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDotted.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDotted.ly
new file mode 100644
index 00000000000..5657c74cd79
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDotted.ly
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% halfNoteDotted.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-09
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+dotted half note with upward stem
+%}
+
+halfNoteDotted = {
+ \override Stem#'length = 5
+ g'2.
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \halfNoteDotted
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDottedDouble.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDottedDouble.ly
new file mode 100644
index 00000000000..244b3d3eac2
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDottedDouble.ly
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% halfNoteDottedDouble.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-09
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+doubledotted half note with upward stem
+%}
+
+halfNoteDottedDouble = {
+ \override Stem#'length = 5
+ g'2..
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \halfNoteDottedDouble
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDottedDoubleDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDottedDoubleDown.ly
new file mode 100644
index 00000000000..4a4ac50bbaa
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDottedDoubleDown.ly
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% halfNoteDottedDoubleDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+doubledotted half note with downward stem
+%}
+
+halfNoteDottedDoubleDown = {
+ \stemDown
+ \override Stem#'length = 5
+ g'2..
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \halfNoteDottedDoubleDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDottedDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDottedDown.ly
new file mode 100644
index 00000000000..4b8ec94bb29
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDottedDown.ly
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% halfNoteDottedDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+dotted half note with downward stem
+%}
+
+halfNoteDottedDown = {
+ \stemDown
+ \override Stem#'length = 5
+ g'2.
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \halfNoteDottedDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDown.ly
new file mode 100644
index 00000000000..09e8e68b76b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-halfNoteDown.ly
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% halfNoteDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+half note with downward stem
+%}
+
+halfNoteDown = {
+ \stemDown
+ \override Stem#'length = 5
+ g'2
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \halfNoteDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaver.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaver.ly
new file mode 100644
index 00000000000..8d5752f1f2c
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaver.ly
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% quaver.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-09
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+quaver with upward stem
+%}
+
+quaver = {
+ \override Stem#'length = 6
+ g'8
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \quaver
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDotted.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDotted.ly
new file mode 100644
index 00000000000..7c7708cd5b0
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDotted.ly
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% quaverDotted.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+dotted quaver with upward stem
+%}
+
+quaverDotted = {
+ \override Stem#'length = 6
+ g'8.
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \quaverDotted
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDouble.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDouble.ly
new file mode 100644
index 00000000000..0c9467b5af3
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDouble.ly
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% quaverDottedDouble.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+doubledotted quaver with upward stem
+%}
+
+quaverDottedDouble = {
+ \override Stem#'length = 6
+ g'8..
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \quaverDottedDouble
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDoubleDdown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDoubleDdown.ly
new file mode 100644
index 00000000000..ccfc490ddb2
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDoubleDdown.ly
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% quaverDottedDoubleDdown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+doubledotted quaver with downward stem
+%}
+
+quaverDottedDoubleDdown = {
+ \stemDown
+ \override Stem#'length = 6
+ g'8..
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \quaverDottedDoubleDdown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDoubleDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDoubleDown.ly
new file mode 100644
index 00000000000..16e4e8bfbca
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDoubleDown.ly
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% quaverDottedDoubleDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+doubledotted quaver with downward stem
+%}
+
+quaverDottedDoubleDown = {
+ \stemDown
+ \override Stem#'length = 6
+ g'8..
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \quaverDottedDoubleDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDown.ly
new file mode 100644
index 00000000000..fa323b3c953
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDottedDown.ly
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% quaverDottedDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+dotted quaver with downward stem
+%}
+
+quaverDottedDown = {
+ \stemDown
+ \override Stem#'length = 6
+ g'8.
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \quaverDottedDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDown.ly
new file mode 100644
index 00000000000..1302109e4f9
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-quaverDown.ly
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% quaverDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+quaver with downward stem
+%}
+
+quaverDown = {
+ \stemDown
+ \override Stem#'length = 6
+ g'8
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \quaverDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaver.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaver.ly
new file mode 100644
index 00000000000..088738f2206
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaver.ly
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% semiquaver.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-09
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+semiquaver with upward stem
+%}
+
+semiquaver = {
+ \override Stem#'length = #6.5
+ g'16
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \semiquaver
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDotted.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDotted.ly
new file mode 100644
index 00000000000..aed113504ac
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDotted.ly
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% semiquaverDotted.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2013-08-30
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+dotted semiquaver with upward stem
+%}
+
+semiquaverDotted = {
+ \override Stem#'length = #6.5
+ g'16.
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \semiquaverDotted
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDottedDouble.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDottedDouble.ly
new file mode 100644
index 00000000000..288578ca7f0
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDottedDouble.ly
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% semiquaverDottedDouble.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+doubledotted semiquaver with upward stem
+%}
+
+semiquaverDottedDouble = {
+ \override Stem#'length = #6.5
+ g'16..
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \semiquaverDottedDouble
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDottedDoubleDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDottedDoubleDown.ly
new file mode 100644
index 00000000000..ed385bdc50f
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDottedDoubleDown.ly
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% semiquaverDottedDoubleDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+doubledotted semiquaver with downward stem
+%}
+
+semiquaverDottedDoubleDown = {
+ \stemDown
+ \override Stem#'length = #6.5
+ g'16..
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \semiquaverDottedDoubleDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDottedDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDottedDown.ly
new file mode 100644
index 00000000000..da62c6769a6
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDottedDown.ly
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% semiquaverDottedDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+dotted semiquaver with downward stem
+%}
+
+semiquaverDottedDown = {
+ \stemDown
+ \override Stem#'length = #6.5
+ g'16.
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \semiquaverDottedDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDown.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDown.ly
new file mode 100644
index 00000000000..bb61aee5174
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-semiquaverDown.ly
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% semiquaverDown.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-13
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+semiquaver with downward stem
+%}
+
+semiquaverDown = {
+ \stemDown
+ \override Stem#'length = #6.5
+ g'16
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \semiquaverDown
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuavers.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuavers.ly
new file mode 100644
index 00000000000..2ec79c79f9e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuavers.ly
@@ -0,0 +1,71 @@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% threeBeamedQuavers.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by lily-image-commands.py on 2013-11-21
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+three beamed quavers
+%}
+
+threeBeamedQuavers = {
+ \override Beam #'positions = #'(1 . 1)
+ e'8[ e' e']
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \threeBeamedQuavers
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuaversI.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuaversI.ly
new file mode 100644
index 00000000000..f5bee0c84d4
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuaversI.ly
@@ -0,0 +1,72 @@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% threeBeamedQuaversI.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by lily-image-commands.py on 2013-11-21
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+three beamed quavers, second dotted
+%}
+
+threeBeamedQuaversI = {
+ \override Beam #'positions = #'(1 . 1)
+ \override Score.SpacingSpanner #'common-shortest-duration = #(ly:make-moment 1/8)
+ e'8[ e'8. e'16]
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \threeBeamedQuaversI
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuaversII.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuaversII.ly
new file mode 100644
index 00000000000..f60dcd06745
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuaversII.ly
@@ -0,0 +1,72 @@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% threeBeamedQuaversII.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by lily-image-commands.py on 2013-11-21
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+three beamed quavers, first dotted
+%}
+
+threeBeamedQuaversII = {
+ \override Beam #'positions = #'(1 . 1)
+ \override Score.SpacingSpanner #'common-shortest-duration = #(ly:make-moment 1/12)
+ e'8.[ e'16 e'8]
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \threeBeamedQuaversII
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuaversIII.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuaversIII.ly
new file mode 100644
index 00000000000..fe3715b1d4d
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-threeBeamedQuaversIII.ly
@@ -0,0 +1,72 @@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% threeBeamedQuaversIII.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by lily-image-commands.py on 2013-11-21
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+three beamed quavers, last dotted
+%}
+
+threeBeamedQuaversIII = {
+ \override Beam #'positions = #'(1 . 1)
+ \override Score.SpacingSpanner #'common-shortest-duration = #(ly:make-moment 1/12)
+ e'16[ e'8. e'8]
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \threeBeamedQuaversIII
+}
+
diff --git a/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-twoBeamedQuavers.ly b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-twoBeamedQuavers.ly
new file mode 100644
index 00000000000..15c8c71306f
--- /dev/null
+++ b/Master/texmf-dist/source/latex/lilyglyphs/glyphimages/generated_src/lily-twoBeamedQuavers.ly
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file is part of the 'lilyglyphs' LaTeX package. %
+% ========== %
+% %
+% https://github.com/openlilylib/lilyglyphs %
+% http://www.openlilylib.org/lilyglyphs %
+% %
+% Copyright 2012-2020 Urs Liska and others, ul@openlilylib.org %
+% %
+% 'lilyglyphs' is free software: you can redistribute it and/or modify %
+% it under the terms of the LaTeX Project Public License, either %
+% version 1.3 of this license or (at your option) any later version. %
+% You may find the latest version of this license at %
+% http://www.latex-project.org/lppl.txt %
+% more information on %
+% http://latex-project.org/lppl/ %
+% 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 Urs Liska (see above). %
+% %
+% This work consists of the files listed in the file 'manifest.txt' %
+% which can be found in the 'license' directory. %
+% %
+% This program is distributed in the hope that it will be useful, %
+% but WITHOUT ANY WARRANTY; without even the implied warranty of %
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% This file defines a single glyph to be created with LilyPond: %
+% %
+% twoBeamedQuavers.ly %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% created by buildglyphimages.py on 2012-11-09
+
+\version "2.16.2"
+
+#(set-global-staff-size 14)
+
+\paper {
+ indent = 0
+}
+\header {
+ tagline = ""
+}
+
+%{
+two beamed quavers with diagonal beam
+%}
+
+twoBeamedQuavers = {
+ \override Beam#'damping = 0
+ d'8[ e']
+}
+
+ \score {
+ \new Staff \with {
+ \remove "Staff_symbol_engraver"
+ \remove "Clef_engraver"
+ \remove "Time_signature_engraver"
+ }
+ \twoBeamedQuavers
+}
+
diff --git a/Master/texmf-dist/source/latex/localloc/localloc.drv b/Master/texmf-dist/source/latex/localloc/localloc.drv
deleted file mode 100644
index 666c1f88d3a..00000000000
--- a/Master/texmf-dist/source/latex/localloc/localloc.drv
+++ /dev/null
@@ -1,57 +0,0 @@
-%%
-%% This is file `localloc.drv',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% localloc.dtx (with options: `driver')
-%%
-%% This is a file of the `localloc' package reimplementing
-%% plain-TeX's and LaTeX's basic allocation macros to allow
-%% local allocation of registers.
-%%
-%% -- Copyright (C) 1991-1995 Bernd Raichle. All rights reserved --
-%%
-%% This package is distributed in the hope that it will be useful,
-%% but WITHOUT ANY WARRANTY; without even the implied warranty of
-%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-%%
-%%
-%% IMPORTANT NOTICE:
-%%
-%% 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
-%% localloc.dtx, localloc.doc, localloc.tex, or localloc.sty.
-%%
-%% For error reports see original source file `localloc.dtx'.
-%%
- \NeedsTeXFormat{LaTeX2e}
- \ProvidesFile{localloc.dtx}%
- [1995/09/24 v1.1b %
- Additional LaTeX Kernel Macros (local allocation)]
-\NeedsTeXFormat{LaTeX2e}
-\documentclass[a4paper]{ltxdoc}
-\GetFileInfo{localloc.dtx}
-\begin{document}
- \DocInput{\filename}
-\end{document}
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
-%%
-\endinput
-%%
-%% End of file `localloc.drv'.
diff --git a/Master/texmf-dist/source/latex/localloc/localloc.dtx b/Master/texmf-dist/source/latex/localloc/localloc.dtx
deleted file mode 100644
index ad770b5d85a..00000000000
--- a/Master/texmf-dist/source/latex/localloc/localloc.dtx
+++ /dev/null
@@ -1,1026 +0,0 @@
-% \iffalse
-%
-% Package `localloc' to use with LaTeX 2e/2.09 and plain-TeX
-% Copyright (C) 1991,1994,1995 Bernd Raichle. 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
-% localloc.dtx, localloc.doc, localloc.tex, or localloc.sty.
-% This restriction helps ensure that all styles developed here
-% remain identical.
-%
-% Error reports in case of UNCHANGED versions please to:
-% Bernd Raichle
-% Stettener Str. 73
-% D-73732 Esslingen
-% Federal Republic of Germany
-% Email: raichle@Informatik.Uni-Stuttgart.DE
-%
-%
-% ========== INSTALLATION GUIDE: ==========
-%
-% The complete distribution consists of a set of files, which are
-% packed and documented in _one_ `docstrip archive file' called
-% `localloc.dtx' (the file you are currently reading). This archive
-% file can be unpacked to create the necessary files containing the
-% macros, documentation, etc.
-%
-% To unpack the archive file you need:
-%
-% * `localloc.dtx' (it is the file you are currently reading)
-%
-% * `docstrip.tex' version 2.x or newer
-% (You can find this file in the LaTeX 2e release.)
-%
-% Then run `localloc.dtx' through plainTeX or LaTeX to unpack the
-% archive file:
-%
-% tex localloc.dtx
-% or
-% latex localloc.dtx
-%
-% This will create a set of file which contain the macro code or
-% code to produce the documentation of the `localloc' package.
-%
-% --------------- start of docstrip archive file ------------------
-% \fi
-%
-% \CheckSum{369}
-%
-% \iffalse
-%<*install>
-\def\batchfile{localloc.dtx}
-\input docstrip.tex
-\preamble
-
-This is a file of the `localloc' package reimplementing
-plain-TeX's and LaTeX's basic allocation macros to allow
-local allocation of registers.
-
--- Copyright (C) 1991-1995 Bernd Raichle. All rights reserved --
-
-This package is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-
-IMPORTANT NOTICE:
-
-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
- localloc.dtx, localloc.doc, localloc.tex, or localloc.sty.
-
-For error reports see original source file `localloc.dtx'.
-
-\endpreamble
-%\generateFile{localloc.ins}{t}{\from{localloc.dtx}{install}}
-\generateFile{localloc.sty}{t}{\from{localloc.dtx}{package}}
-\generateFile{localloc.drv}{t}{\from{localloc.dtx}{driver}}
-\generateFile{localtst.tex}{t}{\from{localloc.dtx}{test}}
-
-\Msg{***********************************************************}
-\Msg{*}
-\Msg{* To finish the installation you have to move the following}
-\Msg{* file into a directory searched by TeX:}
-\Msg{*}
-\Msg{* \space\space localloc.sty}
-\Msg{*}
-\Msg{* To produce the documentation of this archive file run the}
-\Msg{* file `localloc.drv' through LaTeX 2e:}
-\Msg{*}
-\Msg{* \space\space latex localloc.drv}
-\Msg{*}
-\Msg{* Happy TeXing}
-\Msg{***********************************************************}
-\relax\endinput
-%</install>
-% \fi
-%
-% \changes{v1.1b}{95/09/24}{Released after a long sleep in my
-% archives; prefixed some tokens with \cs{lcllc@}.}
-% \changes{v1.1a}{94/10/16}{English documentation; added support for
-% \LaTeXe; added self unpacking archive code.}
-% \changes{v1.0b}{91/09/06}{Error in \cs{newinsert}: consecutive calls
-% return the same insertion register number.}
-% \changes{v1.0a}{91/09/04}{All macros in {plain.tex} replaced.}
-%
-% \DoNotIndex{\fileversion,\filedate,\docdate,\filename}
-% \DoNotIndex{\begingroup,\endgroup,\def,\relax}
-% \DoNotIndex{\ifnum,\ifcase,\else,\fi}
-% \DoNotIndex{\expandafter,\the}
-% \DoNotIndex{\@ne,\m@ne,\next}
-%
-%
-% \newcommand{\PiCTeX}{\protect\pPiCTeX}
-% \newcommand{\pPiCTeX}{\relax
-% P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC\kern-.11em\TeX}
-%
-%
-% \title{An Enhanced Implementation of the Allocation Macros in \LaTeXe,
-% \LaTeX~2.09, and plain-\TeX}
-% \date{\filedate~(\fileversion)}
-% \author{Bernd Raichle\\
-% Stettener Str.~73\\
-% D-73732 Esslingen, FRG\\
-% Email: {\tt raichle@Informatik.Uni-Stuttgart.DE}}
-%
-% \maketitle
-%
-% \begin{abstract}
-% This style option reimplements the allocation command macros
-% provided by plain-\TeX\ and adds macros to allow allocation
-% of local registers inside groups.
-% \end{abstract}
-%
-%^^A \tableofcontents
-%
-% \section{Introduction}
-%
-% \subsection{Restrictions of {\tt plain.tex}'s Register Allocation Macros}
-%
-% In {\tt plain.tex}, Donald E.\ Knuth writes about the macros for
-% register allocation~\cite[lines 149ff]{plain.tex-3.14159}:
-% \begin{quote}
-% When a register is used only temporarily, it need not be
-% allocated; grouping can be used, making the value previously in
-% the register return after the close of the group. The main use
-% of these macros is for registers that are defined by one macro
-% and used by others, possibly at different nesting levels. All
-% such registers should be defined through these macros; otherwise
-% conflicts may occur, especially when two or more more macro
-% packages are being used at once.
-% \end{quote}
-% Additional remarks can be read in the TeXbook~\cite[p.~346]{DEK91}:
-% \begin{quote}
-% {\it Allocation of registers.\/} The second major part of the
-% {\tt plain.tex} file provides a foundation on which systems of
-% independently developed macros can coexist peacefully without
-% interfering in their usage of registers. The idea is that macro
-% writers should abide by the macro conventions following ground
-% rules: [\ldots]
-% (4)~Furthermore, it's possible to use any register in a group, if
-% you ensure that \TeX's grouping mechanism will restore the
-% register when you're done with the group, and if you are certain
-% that other macros will not make global assignments to that
-% register when you need it. \
-% (5)~But when a register is used by several macros, or over long
-% spans of time, it should be allocated by \verb+\newcount+,
-% \verb+\newdimen+, \verb+\newbox+, etc. \ (6)~Similar remarks apply
-% [\ldots]
-% to insertions (which require \verb+\box+, \verb+\count+,
-% \verb+\dimen+, and \verb+\skip+ registers all having the same
-% number).
-% \end{quote}
-%
-% This means, that within plain-\TeX\ and all formats based on
-% plain-\TeX\ a user can not allocate a register for temporary use
-% using the given mechanisms. Nonetheless there is often the need
-% for a allocated register which is only used within a rather small
-% piece of document text and should be set free for reuse in the rest
-% of the formatting run:
-%
-% If a macro~\verb+\macroa+ needs a register which should never be
-% destroyed by another macro~\verb+\macrob+ which is called by
-% \verb+\macroa+, you either have to know about the realisation of
-% \verb+\macrob+ or you have to allocate a new register.
-%
-% The name of this newly allocated register is only known to the
-% macro package in which macro~\verb+\macroa+ resides. If you have
-% a lot of macros which needs registers by their own it is possible
-% that all of the 256~registers of one type will be allocated. In
-% most cases it would be possible to share some of these registers by
-% more than one macro because the register is only needed within (an
-% environment delimited by) a group. To share registers---if they are
-% used only locally---it will be necessary to provide a mechanism to
-% allocate registers locally. Unfortunately {\tt plain.tex} and all
-% derived formats, like \LaTeX, misses this mechanism leading to the
-% problem that some macro packages cannot be combined.
-%
-% In the following example it is necessary to call two macros
-% |\macroa| and |macrob| in the same group (e.g.\ because |\macroa|
-% performs special actions at the begin and |\macrob| at the end of
-% an environment). Further you do not have any knowledge about the
-% use of scratch register in |\macroa|, |\macrob| or the text in the
-% argument specified by the user. Therefore it is impossible to use
-% a scratch register to save the current value of |\hsize|; we have
-% to allocate a new register to save it.
-%\begin{verbatim}
-% \newdimen\savedhsize
-%\end{verbatim}
-%\begin{verbatim}
-% \def\callAandB#1{\begingroup
-% \savedhsize=\hsize
-% \hsize=0.8\hsize \macroa
-% #1\relax
-% \hsize=\savedhsize \macrob
-% \endgroup}
-%\end{verbatim}
-% If there will be a mechanism, e.g. by a macro |\lnewdimen|, to
-% allocate a local register it is possible to use this local register
-% inside the group without worrying about possible dependencies
-% between the macros and the user specified text. Additionally after
-% leaving the group, the dimen register will be free to be used by
-% other macros.
-%\begin{verbatim}
-% \def\callAandB#1{\begingroup
-% \lnewdimen\savedhsize \savedhsize=\hsize
-% \hsize=0.8\hsize \macroa
-% #1\relax
-% \hsize=\savedhsize \macrob
-% \endgroup}
-%\end{verbatim}
-%
-%
-% \subsection{Local Register Allocation Macros}
-%
-% \DescribeMacro{\newcount}
-% \DescribeMacro{\newdimen}
-% \DescribeMacro{\newskip}
-% \DescribeMacro{\newbox}
-% {\let\newinsert=\relax \DescribeMacro{\newinsert}}^^A
-% When using this reimplementation of the allocation macros, the {\tt
-% plain.tex} macros |\newcount|, |\newdimen|, |\newskip|, and
-% |\newbox| will have a changed behaviour in two aspects:
-% \begin{itemize}
-% \item Do not assume that registers which are allocated consecutively
-% have consecutive register numbers. In general you should not
-% make any assumption about the order of register numbers.
-% \item It is possible that a register was locally allocated and used
-% in the past. After leaving the group the register is set to free
-% and the old value---normally zero---is restored. Nonetheless
-% you should not assume that a newly allocated register is
-% initialised with the value zero.
-% \end{itemize}
-%
-% {\let\newmuskip=\relax \DescribeMacro{\newmuskip}}
-% {\let\newtoks=\relax \DescribeMacro{\newtoks}}^^A
-% The behaviour of the macros |\newmuskip| and |\newtoks| are not
-% changed because they are not used for insertions. Nonetheless this
-% can be changed in a future version.
-%
-% \DescribeMacro{\lnewcount}
-% \DescribeMacro{\lnewdimen}
-% \DescribeMacro{\lnewskip}
-% \DescribeMacro{\lnewmuskip}
-% \DescribeMacro{\lnewbox}
-% \DescribeMacro{\lnewtoks}
-% |\lnewcount|, |\lnewdimen|, |\lnewskip|, |\lnewmuskip|, |\lnewbox|,
-% and |\lnewtoks| are the set of new macros to allocate registers
-% within the scope of the current group. At the end of the current
-% group the allocated register is freed.
-%
-% As with their global counterparts you should not assume that the
-% registers are allocated in a consecutive order---neither increasing
-% nor decreasing---or that the allocated register is initialised with
-% zero.
-%
-%
-% \subsection{Usage Examples}
-%
-% \subsubsection{\LaTeX's Picture Environment}
-%
-% \LaTeX's picture environment uses the box register |\@picbox| and
-% the dimen register |\@picht| to save the contents of a picture and
-% the user specified height of this picture at the beginning of the
-% environment. These two registers are set at the beginning and used
-% at the end of the |picture| environment. Because the two registers
-% are used nowhere else, it is possible to share them by only
-% allocating them within the environment.
-%
-% This is the simplified code for the |\begin{picture}| and
-% |\end{picture}| commands; the macros |\begin| and |\end| start and
-% end a new group:
-%\begin{verbatim}
-%\newbox\@picbox
-%\newdimen\@picht
-%\end{verbatim}
-%\begin{verbatim}
-%\def\picture(#1,#2){%
-% \@picht = #2\unitlength % save picture height
-% \setbox\@picbox = \hbox to #1\unitlength\bgroup
-% \ignorespaces}
-%\end{verbatim}
-%\begin{verbatim}
-%\def\endpicture{%
-% \hss
-% \egroup % close picture box
-% \ht\@picbox = \@picht % set box height to save picture height
-% \dp\@picbox = 0pt % set box depth to 0pt
-% \mbox{\box\@picbox}} % output this box
-%\end{verbatim}
-%
-% Using the new local allocation macros the code changes is simple:
-% Move the |\newbox| and |\newdimen| command within the |\picture|
-% macro definition and rename them to |\lnewbox| and |\lnewdimen|:
-%\begin{verbatim}
-% %\newbox\@picbox
-% %\newdimen\@picht
-%\end{verbatim}
-%\begin{verbatim}
-%\def\picture(#1,#2){%
-% \lnewbox\@picbox
-% \lnewdimen\@picht
-% \@picht = #2\unitlength % save picture height
-% \setbox\@picbox = \hbox to #1\unitlength\bgroup
-% \ignorespaces}
-%\end{verbatim}
-%
-% Additionally we can use a property of the usage pattern of these
-% two registers:
-% Within a nested use of the |picture| environment---you can use
-% subpictures within a picture---these registers are allocated for
-% each nesting level. This is not really necessary because the box
-% and the dimen register is always used in a group and is never
-% changed globally.
-% It is possible to add tests to avoid a (local) reallocation of
-% these registers:
-%\begin{verbatim}
-%\let\@picbox=\relax % mark register as not yet allocated
-%\let\@picht =\relax % mark register as not yet allocated
-%\end{verbatim}
-%\begin{verbatim}
-%\def\picture(#1,#2){%
-% \ifx\@picbox\relax \lnewbox\@picbox \fi
-% \ifx\@picht\relax \lnewdimen\@picht \fi
-% \@picht = #2\unitlength % save picture height
-% \setbox\@picbox = \hbox to #1\unitlength\bgroup
-% \ignorespaces}
-%\end{verbatim}
-%
-%
-% \subsubsection{\LaTeX's {\tt\protect\bslash multiput} Macro}
-%
-% Another example of registers which are used only in one rarely
-% used macro, are the count register |\@multicnt| and the two dimen
-% registers |\@xdim| and |\@ydim| for the |\multiput| command. To
-% change it according to the scheme above you have to insert an
-% additional grouping.
-%
-% In \LaTeXe\ these three rarely used registers and some more are
-% shared with the |\bezier| command, whose definition has to be
-% changed accordingly. This shows the need---and advantage---of a
-% better allocation scheme.
-%
-% \subsubsection{\PiCTeX}
-%
-% The macro package \PiCTeX\ uses a lot of dimen registers. A subset
-% of these registers are only used within a picture or within a set
-% of drawing and parameter setting commands.
-%
-% As an example the dimen registers |\totalarclength| is only used in
-% a very restrictic set of commands, i.e., it can be allocated within
-% the scope of the higher level commands or within \PiCTeX's
-% |\beginpicture| \ldots\ |\endpicture| environment.
-%
-%
-% \StopEventually{^^A
-% \begin{thebibliography}{0}
-% \bibitem{DEK91} Donald E.\ Knuth,
-% {\it The \TeX{}book},
-% Addison-Wesley Publ., Reading, Mass., Juni 1991.
-% \bibitem{plain.tex-3.14159} File {\tt plain.tex},
-% version 3.14159,
-% March 1995.
-% \end{thebibliography}
-% }
-%
-%
-%
-% \section{Implementation}
-%
-%
-% \subsection{Prolog, \LaTeXe\ Package Declarations, etc.}
-%
-% 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
-% |\lnewcount| is defined. If so, we just stop reading this file.
-% \begin{macrocode}
-%<+package>\expandafter\ifx\csname lnewcount\endcsname\relax
-%<+package>\else \expandafter\endinput \fi
-% \end{macrocode}
-%
-% For the sake of \LaTeXe\ users declarations for this package are
-% included. The additional group hack is needed to prevent the
-% definition of |\ProvidesPackage| as |\relax| if it is undefined.
-% \begin{macrocode}
-%<+package|test>\begingroup\expandafter\expandafter\expandafter\endgroup
-%<+package|test>\expandafter\ifx\csname ProvidesPackage\endcsname\relax
-%<+package|test>\else
- \NeedsTeXFormat{LaTeX2e}
-%<+package> \ProvidesPackage{localloc}%
-%<+test> \ProvidesFile{localtst.tex}%
-%<*!package&!test>
- \ProvidesFile{localloc.dtx}%
-%</!package&!test>
- [1995/09/24 v1.1b %
- Additional LaTeX Kernel Macros (local allocation)]
-%<+package|test>\fi
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<*package>
-% \end{macrocode}
-%
-% To allow the use of this file within a plain-\TeX\ job, we have
-% to change the category code of the `at' character~{\tt @}.
-% \begin{macrocode}
-\expandafter\chardef\csname lcllc@at\endcsname=\catcode`\@
-\catcode`\@=11 % \makeatletter
-% \end{macrocode}
-%
-%
-% \subsection{Accessing the {\tt muskip} registers}
-%
-% Beside the well-known \TeX\ registers, like |\count| or |\box|,
-% there is another set of registers which are used only in few
-% macros. The |\muskip| registers are normally used in math mode
-% only and the coercion of the value in a |\muskip| register to an
-% integer (|\count|), dimension (|\dimen|), or glue (|\glue|)
-% produces an error.
-%
-% The unit of a |\muskip| value is~$1$\,mu---there are $18$\,mu in
-% $1$\,em of the current font in {\em math family~2}. If you
-% assign a value to a |\muskip| register, this value is represented
-% in the unit~mu, not in~pt. The dimension of the |\muskip| value
-% is computed, if this value is used by |\mskip| or |\mkern|.
-%
-% To use a |\muskip| register as a replacement for a |\count|
-% register, it is necessary to do assignments, additions, and other
-% operations in units of~mu. If you want to coerce an
-% integer to a |\muskip| register, you have to get the value with
-% |\the| and add the keyword~|mu| while scanning the number. To get
-% the integer value of a |\muskip| register, you can use the
-% following macro~|\lcllc@cnvmutocnt|.
-%
-% \begin{macro}{\lcllc@cnvmutocnt}
-% The macro |\lcllc@cnvmutocnt| ist called with a |\muskip| register
-% or a value in~|mu| units as its argument. It will expand to the
-% integer value. To get the value of a register, we first expand
-% the value of this register to a list of tokens with \TeX's |\the|
-% primitive.
-% Example: if the register has the value~$3.4$\,mu, the expansion of
-% |\the| produces the tokens $\mbox{\tt 3}_{12} \mbox{\tt .}_{12}
-% \mbox{\tt 4}_{12} \mbox{\tt m}_{12} \mbox{\tt u}_{12}$.
-% \begin{macrocode}
-\def\lcllc@cnvmutocnt#1{\expandafter\lcllc@delmukey\the#1}
-% \end{macrocode}
-%
-% After we have expanded the value of the register, it is necessary
-% to strip of the unit keyword~|mu| and the fraction of the value.
-% To do this, we have to use tokens with {\em category code}~12 to
-% match the expansion string produced by~|\the|.
-% \begin{macrocode}
-\begingroup \catcode`\M=12 \catcode`\U=12 \catcode`\.=12
- \lowercase{\endgroup
-\def\lcllc@delmukey#1.#2MU{#1}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Allocation registers}
-%
-% \subsubsection{Registers defined in {\tt plain.tex}}
-%
-% Plain-\TeX's allocation macros use a fixed set of |count|
-% registers containing a set of numbers with the highest allocated
-% register number. To make the following macro code more readable,
-% alias names for these |count| registers are defined.
-% \begin{macrocode}
-\countdef\count@ptr = 10
-\countdef\dimen@ptr = 11
-\countdef\skip@ptr = 12
-\countdef\muskip@ptr = 13
-\countdef\box@ptr = 14
-\countdef\toks@ptr = 15
-\countdef\read@ptr = 16
-\countdef\write@ptr = 17
-\countdef\mathfam@ptr = 18
-% \end{macrocode}
-% {\tt plain.tex} for \TeX~3 introduces a new allocation command
-% needing an additional allocation count register. To simplify the
-% code of this package with older versions of {\tt plain.tex}, a
-% dummy count register is allocated and used.
-% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname newlanguage\endcsname\relax
- \csname newcount\endcsname\language@ptr
-\else
- \countdef\language@ptr = 19
-\fi
-% \end{macrocode}
-%
-% The allocation command for insertion uses another register, which
-% is already aliased as |\insc@unt|.
-%\begin{verbatim}
-%\countdef\insc@unt = 20 % = 19 in older versions of `plain.tex'
-%\end{verbatim}
-%
-%
-% \subsubsection{Additional Registers}
-%
-% For the new local allocation macros additional registers are
-% needed containing the boundaries for all types of locally
-% allocated registers. Whereas all globally allocated registers
-% are located in the lower region of the register numbers (with the
-% exception of the set of registers needed for an insertion),
-% locally allocated registers are taken from the higher region of
-% the register numbers---from top towards the bottom.
-%
-% To avoid using six additional count registers we use |\muskip|
-% registers to save the current lower boundary of the allocatable
-% register region. These boundaries are initialised either
-% with~$256$ or the actual boundary of the insertion allocation
-% register.
-% \begin{macrocode}
-\newmuskip\count@limit \count@limit = \the\insc@unt mu
-\newmuskip\dimen@limit \dimen@limit = \the\insc@unt mu
-\newmuskip\skip@limit \skip@limit = \the\insc@unt mu
-\newmuskip\box@limit \box@limit = \the\insc@unt mu
-\newmuskip\muskip@limit \muskip@limit = 256mu
-\newmuskip\toks@limit \toks@limit = 256mu
-% \end{macrocode}
-%
-% To simplify the code of the following allocation macros and to
-% save macro space, two additional |\muskip| registers are
-% allocated and initialised with the constants $16$ and~$256$.
-% \begin{macrocode}
-\newmuskip\cclvi@mu \cclvi@mu = 256mu
-\newmuskip\xvi@mu \xvi@mu = 16mu
-% \end{macrocode}
-%
-%
-% \subsection{Allocation Macros for the ``End User''}
-%
-% \subsubsection{Global Allocation Macros}
-%
-% \begin{macro}{\newcount} \begin{macro}{\newdimen}
-% \begin{macro}{\newskip} \begin{macro}{\newmuskip}
-% \begin{macro}{\newbox} \begin{macro}{\newtoks}
-% \begin{macro}{\newread} \begin{macro}{\newwrite}
-% \begin{macro}{\newfam} \begin{macro}{\newlanguage}
-% We have to replace the original macros in {\tt plain.tex} by new
-% ones to allow locally allocated registers. Otherwise it will be
-% possible that the two regions, the lower one with globally
-% allocated registers and the higher one with locally allocated
-% registers, will overlap resulting in a double use of the same
-% register.
-%
-% With the new macros it will be unnecessary to un-outer the {\tt
-% plain.tex} macros, because the local allocation macros have to be
-% non outer. Nonetheless we want to use this package in
-% conjunction with \LaTeX\ and therefore we have to define some of
-% them as non outer.
-%
-% The top level macros use the low level macro |\alloc@| which has
-% the following parameters:
-% The boundaries of the lower and the higher region, the type of
-% the allocated register, a flag if we have to check on overlapping
-% with insertion registers, the \TeX\ primitive to be used to
-% define this register, and the user given control sequence.
-% \begin{macrocode}
-%\outer
-\def\newcount {\alloc@\count@ptr \count@limit \count 1\countdef }
-%\outer
-\def\newdimen {\alloc@\dimen@ptr \dimen@limit \dimen 1\dimendef }
-%\outer
-\def\newskip {\alloc@\skip@ptr \skip@limit \skip 1\skipdef }
-% \outer
-\def\newmuskip {\alloc@\muskip@ptr \muskip@limit\muskip 0\muskipdef}
-%\outer
-\def\newbox {\alloc@\box@ptr \box@limit \box 1\chardef }
-% \outer
-\def\newtoks {\alloc@\toks@ptr \toks@limit \toks 0\toksdef }
-% \outer
-\def\newread {\alloc@\read@ptr \xvi@mu \read 0\chardef }
-%\outer
-\def\newwrite {\alloc@\write@ptr \xvi@mu \write 0\chardef }
-%\outer
-\def\newfam {\alloc@\mathfam@ptr\xvi@mu \fam 0\chardef }
-% \outer
-\def\newlanguage{\alloc@\lang@ptr \cclvi@mu \language0\chardef }
-% \end{macrocode}
-% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
-% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
-%
-% |\newinsert| needs additional code because this macro has to
-% allocate a set of |\box|, |\count|, |\dimen|, and |\skip|
-% registers with the restriction that all registers have to have
-% the same number. |\newinsert| is redefined at the end of this
-% file.
-%
-%
-% \subsubsection{Local Allocation Macros}
-%
-%
-% \begin{macro}{\lnewcount} \begin{macro}{\lnewdimen}
-% \begin{macro}{\lnewskip} \begin{macro}{\lnewmuskip}
-% \begin{macro}{\lnewbox} \begin{macro}{\lnewtoks}
-% There is an equivalent set of macros to allocate registers
-% locally. Instead of using the low level macro |\alloc@| it uses
-% the macro |\lalloc@| with the same set of parameters.
-% \begin{macrocode}
-\def\lnewcount {\lalloc@\count@ptr \count@limit \count 1\countdef }
-\def\lnewdimen {\lalloc@\dimen@ptr \dimen@limit \dimen 1\dimendef }
-\def\lnewskip {\lalloc@\skip@ptr \skip@limit \skip 1\skipdef }
-\def\lnewmuskip{\lalloc@\muskip@ptr\muskip@limit\muskip 0\muskipdef}
-\def\lnewbox {\lalloc@\box@ptr \box@limit \box 1\chardef }
-\def\lnewtoks {\lalloc@\toks@ptr \toks@limit \toks 0\toksdef }
-% \end{macrocode}
-% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
-%
-% Local allocation macros for |\read|, |\write| streams, math
-% |\fam|, |language| numbers, or insertions are possible but not
-% very useful because of the global nature of these resources.
-%
-%
-% \subsection{Low Level Allocation Macros}
-%
-% The allocation scheme used by the macros in {\tt plain.tex} is
-% simple:
-% \begin{itemize}
-% \item all allocations are global,
-% \item register, math family, language, input/output stream
-% numbers are allocated using the lowest possible number, i.e.,
-% it is done from lower number to higher numbers,
-% \item the set of insertion registers (|box|, |count|, |skip|, and
-% |dimen|), which have to have the same register number, are
-% allocated beginning from~$255$ to lower numbers.
-% \end{itemize}
-%
-% Contrary to this simple scheme this package uses numbers for
-% locally allocated registers from top to bottom interfering with
-% the original insertion register allocation scheme {\it and\/} the
-% simple test for a register number overflow.
-%
-% \begin{macro}{\lcllc@insnums}
-% Insertion registers are now allocated in a non-monotonous order
-% using the lowest possible number (because the allocation of the
-% needed set of registers is done in a global way). To allow the
-% checking of overlapping of globally or locally allocated
-% registers with the registers used for insertions, the insertion
-% register numbers are saved as a list in |\lcllc@insnums|.
-% Each entry in this list is saved as \mbox{\tt\string\do$\langle
-% n\rangle$.}; the list is initialised as empty.
-% \begin{macrocode}
-\def\lcllc@insnums{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\lcllc@checkins}
-% Whenever a new |box|, |count|, |skip|, or |dimen| register is
-% allocated it has to be checked first, if the next possible
-% free register is already allocated for an insertion.
-%
-% To detect a collision between a possibly free register number and
-% the set of insertion registers, the macro |\lcllc@checkins| is
-% called with the register number to be tested in
-% |\allocationnumber|. The argument of this macro has to be either
-% $1$ or~$-1$ and is used to get the next register number to be
-% tested against the insertion number list if an additional
-% iteration is needed. The result is a register number in
-% |\allocationnumber| which is not used for an insertion. (Note:
-% Nonetheless it can be an out-of-region register number of an
-% already used register!)
-% \begin{macrocode}
-\def\lcllc@checkins#1{%
- \begingroup
-% \end{macrocode}
-% After opening a new group, the macro |\do| is defined to read the
-% next insertion number delimited by a simple dot. It then tests
-% this number against the current |\allocationnumber| and if the
-% register numbers are equal, |\allocationnumber| is advanced by the
-% given argument (which is $1$ or~$-1$).
-%
-% To avoid a global change of |\allocationnumber|, a group hack
-% with expansion is used: If the list |\lcllc@insnums| is expanded
-% with this definition of |\do|, the result is empty if the
-% register number is not used for an insertion. Otherwise it
-% expands to the |\advance| command followed by an additional
-% |lcllc@checkins| (which has to be protected by |\noexpand|) to
-% start another iteration with the changed |\allocationnumber|.
-% \begin{macrocode}
- \def\do##1.{%
- \ifnum##1=\allocationnumber
- \advance\allocationnumber#1\relax
- \noexpand\lcllc@checkins{#1}%
- \fi}%
-% \end{macrocode}
-% The following expanded definition text of |\x| contains code to
-% close the group and the expansion of |\lcllc@insnums|, which is
-% either empty or contains the change of |\allocationnumber| and an
-% iterative call of |\lcllc@checkins|. After the definition is
-% completed, the code is executed which closes the group.
-% \begin{macrocode}
- \edef\x{\endgroup \lcllc@insnums}%
- \x}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\alloc@}
-% |\alloc@| is the low level macro for global allocation, which is
-% called with six arguments. The macro itself only uses the first
-% four argument: The two boundaries, the item type to be allocated,
-% and a flag if this item is propably used for an insertion. The
-% remaining two arguments, the \TeX\ primitive and the control
-% sequence to assign the allocated number is used by
-% |\lcllc@def|.
-% \begin{macrocode}
-\def\alloc@#1#2#3#4{%
-% \end{macrocode}
-% In the first step we assign the boundary of the lower region for
-% this item type to |\allocationnumber| and increment it by one.
-% \begin{macrocode}
- \allocationnumber#1%
- \advance\allocationnumber\@ne
-% \end{macrocode}
-% If this item type is used by insertion, we have to check for
-% collision with the |\lcllc@checkins| macro. After the execution of
-% this macro, |\allocationnumber| contains the next free number to
-% be used for allocation. This number is assigned globally to the
-% register containing the boundary.
-% \begin{macrocode}
- \ifnum#4=\@ne \lcllc@checkins\@ne \fi
- \global#1\allocationnumber
-% \end{macrocode}
-% We now have found an unused register. Nonetheless it is possible
-% that the register number is either not in the range of existing
-% register number or it is used for a locally allocated register.
-% |\ch@ck| is used to test these things.
-% \begin{macrocode}
- \ch@ck#1#2#3%
-% \end{macrocode}
-% At the end the \meta{control sequence} is defined using the
-% found |\allocationnumber|.
-% \begin{macrocode}
- \lcllc@def\global{}#3}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\lalloc@}
-% |\lalloc@| is the low level macro for local allocation. The
-% definition of this macro a copy of |\alloc@| with some small
-% changes.
-% \begin{macrocode}
-\def\lalloc@#1#2#3#4{%
-% \end{macrocode}
-% In the first step we assign the boundary of the {\it higher\/}
-% region and {\it decrement\/} it by one. Because the higher
-% boundary is saved in a |\muskip| register, we have to use
-% |\lcllc@cnvmutocnt| to get the boundary value.
-% \begin{macrocode}
- \allocationnumber\lcllc@cnvmutocnt#2%
- \advance\allocationnumber\m@ne
-% \end{macrocode}
-% The check for insertion number collisions is called with~$-1$ to
-% decrement the register number to get the next free register
-% number. The |\allocationnumber| is then assigned {\it locally\/}
-% to the |\muskip| register containing the boundary.
-% \begin{macrocode}
- \ifnum#4=\@ne \lcllc@checkins\m@ne \fi
- #2\the\allocationnumber mu %
-% \end{macrocode}
-% The check for an already used globally allocated register or a
-% range underflow is needed, too.
-% \begin{macrocode}
- \ch@ck#1#2#3%
-% \end{macrocode}
-% At the end the \meta{control sequence} is defined using the
-% found |\allocationnumber|.
-% \begin{macrocode}
- \lcllc@def\relax{(local)}#3}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\ch@ck}
-% The test macro |\ch@ck| for a collision of the globally and
-% locally allocated registers from {\tt plain.tex} has to be
-% changed because the higher boundary is given as a |\muskip| value
-% instead of a normal integer.
-% \begin{macrocode}
-\def\ch@ck#1#2#3{%
- \ifnum#1<\lcllc@cnvmutocnt#2\relax \else
- \errmessage{No room for a new #3}%
- % \allocationnumber\m@ne
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\lcllc@def}
-% |\lcllc@def| is used to assign the found |\allocationnumber|
-% to the \meta{control sequence} using the \TeX\ primitive.
-% Additionally an entry is written to the {\tt log} file.
-% \begin{macrocode}
-\def\lcllc@def#1#2#3#4#5{%
- #1#4#5=\allocationnumber
- \wlog{\string#5#2=\string#3\the\allocationnumber}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsubsection{Low Level Insertion Allocation Macros}
-%
-% Insertions need a set of registers with the same register number.
-% To find a new register number when allocating an insertion, we
-% have to get the maximum of all boundaries used for an insertion.
-%
-% \begin{macro}{\lcllc@getmax}
-% |\lcllc@getmax| is used to assign |\allocationnumber| to the
-% maximum of |\allocationnumber| and its argument.
-% \begin{macrocode}
-\def\lcllc@getmax#1{%
- \ifnum#1<\allocationnumber \else
- \allocationnumber#1\advance\allocationnumber\@ne
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\newinsert}
-% |\newinsert| globally allocates a set of registers used for an
-% insertion.
-% \begin{macrocode}
-\outer\def\newinsert{%
-% \end{macrocode}
-% First we have to find the maximum of all globally allocated
-% register number used for an insertion. We start
-% by setting |\allocationnumber| to~$-1$\,\ldots
-% \begin{macrocode}
- \allocationnumber\m@ne
-% \end{macrocode}
-% \ldots\,and get the maxmimum of the boundaries for |count|,
-% |dimen|, |skip|, and |box| registers.
-% \begin{macrocode}
- \lcllc@getmax\count@ptr \lcllc@getmax\dimen@ptr
- \lcllc@getmax\skip@ptr \lcllc@getmax\box@ptr
-% \end{macrocode}
-% Then we have to check if this |\allocationnumber| is already used
-% for another insertion.
-% \changes{v1.0b}{91/09/06}{\cs{lcllc@checkins} inserted}
-% \begin{macrocode}
- \lcllc@checkins\@ne
-% \end{macrocode}
-% At last we have to check if this |\allocationnumber| is used for
-% one of the locally allocated registers.
-% \begin{macrocode}
- \ch@ck\allocationnumber\count@limit\count
- \ch@ck\allocationnumber\dimen@limit\dimen
- \ch@ck\allocationnumber\skip@limit\skip
- \ch@ck\allocationnumber\box@limit\box
-% \end{macrocode}
-% The found register number for insertions is then (globally)
-% inserted into the list of insertion numbers.
-% \begin{macrocode}
- \begingroup
- \let\do\relax
- \xdef\lcllc@insnums{\do\the\allocationnumber.\lcllc@insnums}%
- \endgroup
-% \end{macrocode}
-% At the end the \meta{control sequence} is defined using the
-% found |\allocationnumber|.
-% \begin{macrocode}
- \lcllc@def\global{}\insert\chardef}
-% \end{macrocode}
-% \end{macro}
-%
-% The register |\insc@unt| which is used to contain the boundary
-% number for insertion registers in the original {\tt plain.tex}
-% macro is not used anymore.
-%
-%
-% Finally, the category code of the `at' character~{\tt @} is reset
-% to its original value.
-% \begin{macrocode}
-\catcode`\@=\lcllc@at
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</package>
-% \end{macrocode}
-%
-%
-% \iffalse
-%<*driver>
-\NeedsTeXFormat{LaTeX2e}
-\documentclass[a4paper]{ltxdoc}
-\GetFileInfo{localloc.dtx}
-\begin{document}
- \DocInput{\filename}
-\end{document}
-%</driver>
-% \fi
-%
-% \iffalse
-%
-% \section{Test File}
-%
-% A first version of a test file which can be used for plain-TeX,
-% \LaTeX~2.09, and \LaTeXe. The result shows the allocated register
-% numbers. You should notice that the insertions and global box
-% registers are not contiguously allocated but interfere. Further
-% from one to the next line there is a new global register number
-% greater than the former one. Whereas the local register numbers
-% are set to zero when leaving a group and they are recycled in the
-% next lines.
-%
-% \begin{macrocode}
-%<*test>
-% This test file can be used with plain-TeX & LaTeX 2.09/2e.
-%
-\edef\FORMAT{%
- \expandafter\ifx\csname documentstyle\endcsname\relax 0%
- \else\expandafter\ifx\csname documentclass\endcsname\relax
- 1\else 2\fi\fi}
-\immediate\write16{=====>>> You are using %
- \ifcase\FORMAT plainTeX\or LaTeX 2.09\or LaTeX 2e\else ??\fi}
-\ifcase\FORMAT
- \input localloc.sty\relax \or
- \documentstyle[localloc]{article}\begin{document}\or
- \documentclass{article}\usepackage{localloc}\begin{document}\fi
-\tracingstats=1
-% some macros
-\def\Message#1{\immediate\write16{#1}}
-\def\RegVal#1{\the\csname test#1\endcsname}
-\def\ShowSet#1{\if l#1local\else global\fi:
- \RegVal{i#1} \RegVal{ii#1}/\RegVal{iii#1}
- \RegVal{iv#1}}
-\def\ShowAll#1{\Message{#1 -- \ShowSet{g} -- \ShowSet{l}}}
-\def\ShowIns{\Message{Insertions:
- \the\testinsi, \the\testinsii, \the\testinsiii}}
-% initialise
-\chardef\testig=0 \chardef\testil=0
-\chardef\testiig=0 \chardef\testiil=0
-\chardef\testiiig=0 \chardef\testiiil=0
-\chardef\testivg=0 \chardef\testivl=0
-\chardef\testinsii=0 \chardef\testinsiii=0
-% allocate an insertion/set of registers
-\newinsert\testinsi
-% make sure that a collision boxes/insertions occurs
-{\count0=\testinsi \advance\count0 -2
- \loop\csname newbox\endcsname\testig
- \ifnum\testig<\count0\repeat}
-%
-\newbox\testig \lnewbox\testil
-\ShowAll{Level 0}
-\begingroup
- \lnewbox\testiil \newbox\testiig
- \ShowAll{Level 1}
- \begingroup
- \newbox\testivg \lnewbox\testivl
- \ShowAll{Level 2}\ShowIns
- \endgroup
- \lnewbox\testiiil \newbox\testiiig
- \ShowAll{Level 1b}
- \csname newinsert\endcsname\testinsii
- \ShowIns
- \begingroup
- \newbox\testivg \lnewbox\testivl
- \ShowAll{Level 2}
- \endgroup
- \ShowAll{Level 1b}
-\endgroup
-\newinsert\testinsiii
-\ShowAll{Level 0}\ShowIns
-\begingroup
- \lnewbox\testiil \newbox\testiig
- \lnewbox\testiiil \newbox\testiiig
- \ShowAll{Level 1}
- \begingroup
- \newbox\testivg \lnewbox\testivl
- \newbox\testvg \lnewbox\testvl
- \ShowAll{Level 2}\ShowIns
- \endgroup
- \ShowAll{Level 1}
-\endgroup
-\ShowAll{Level 0}
-\end{document}
-%</test>
-% \end{macrocode}
-%
-% \fi
-%
-% \Finale
-%
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
-%%
-%
-\endinput
diff --git a/Master/texmf-dist/source/latex/ltxcmds/ltxcmds.dtx b/Master/texmf-dist/source/latex/ltxcmds/ltxcmds.dtx
deleted file mode 100644
index f9169a21db4..00000000000
--- a/Master/texmf-dist/source/latex/ltxcmds/ltxcmds.dtx
+++ /dev/null
@@ -1,2425 +0,0 @@
-% \iffalse meta-comment
-%
-% File: ltxcmds.dtx
-% Version: 2019/12/15 v1.24
-% Info: LaTeX kernel commands for general use
-%
-% Copyright (C)
-% 2009-2011 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
-% https://github.com/ho-tex/ltxcmds/issues
-%
-% 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. This version of this license is in
-% https://www.latex-project.org/lppl/lppl-1-3c.txt
-% and 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 Maintainers of this work are
-% Heiko Oberdiek and the Oberdiek Package Support Group
-% https://github.com/ho-tex/ltxcmds/issues
-%
-% The Base Interpreter refers to any `TeX-Format',
-% because some files are installed in TDS:tex/generic//.
-%
-% This work consists of the main source file ltxcmds.dtx
-% and the derived files
-% ltxcmds.sty, ltxcmds.pdf, ltxcmds.ins, ltxcmds.drv,
-% ltxcmds-test1.tex, ltxcmds-test-gobble.tex,
-% ltxcmds-test-ifempty.tex, ltxcmds-test-zapspace.tex,
-% ltxcmds-test-ifboxempty.tex, ltxcmds-test-nextchar.tex,
-% ltxcmds-test-carcdr.tex.
-%
-% Distribution:
-% CTAN:macros/latex/contrib/ltxcmds/ltxcmds.dtx
-% CTAN:macros/latex/contrib/ltxcmds/ltxcmds.pdf
-%
-% Unpacking:
-% (a) If ltxcmds.ins is present:
-% tex ltxcmds.ins
-% (b) Without ltxcmds.ins:
-% tex ltxcmds.dtx
-% (c) If you insist on using LaTeX
-% latex \let\install=y\input{ltxcmds.dtx}
-% (quote the arguments according to the demands of your shell)
-%
-% Documentation:
-% (a) If ltxcmds.drv is present:
-% latex ltxcmds.drv
-% (b) Without ltxcmds.drv:
-% latex ltxcmds.dtx; ...
-% The class ltxdoc loads the configuration file ltxdoc.cfg
-% if available. Here you can specify further options, e.g.
-% use A4 as paper format:
-% \PassOptionsToClass{a4paper}{article}
-%
-% Programm calls to get the documentation (example):
-% pdflatex ltxcmds.dtx
-% makeindex -s gind.ist ltxcmds.idx
-% pdflatex ltxcmds.dtx
-% makeindex -s gind.ist ltxcmds.idx
-% pdflatex ltxcmds.dtx
-%
-% Installation:
-% TDS:tex/generic/ltxcmds/ltxcmds.sty
-% TDS:doc/latex/ltxcmds/ltxcmds.pdf
-% TDS:source/latex/ltxcmds/ltxcmds.dtx
-%
-%<*ignore>
-\begingroup
- \catcode123=1 %
- \catcode125=2 %
- \def\x{LaTeX2e}%
-\expandafter\endgroup
-\ifcase 0\ifx\install y1\fi\expandafter
- \ifx\csname processbatchFile\endcsname\relax\else1\fi
- \ifx\fmtname\x\else 1\fi\relax
-\else\csname fi\endcsname
-%</ignore>
-%<*install>
-\input docstrip.tex
-\Msg{************************************************************************}
-\Msg{* Installation}
-\Msg{* Package: ltxcmds 2019/12/15 v1.24 LaTeX kernel commands for general use (HO)}
-\Msg{************************************************************************}
-
-\keepsilent
-\askforoverwritefalse
-
-\let\MetaPrefix\relax
-\preamble
-
-This is a generated file.
-
-Project: ltxcmds
-Version: 2019/12/15 v1.24
-
-Copyright (C)
- 2009-2011 Heiko Oberdiek
- 2016-2019 Oberdiek Package Support Group
-
-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. This version of this license is in
- https://www.latex-project.org/lppl/lppl-1-3c.txt
-and 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 Maintainers of this work are
-Heiko Oberdiek and the Oberdiek Package Support Group
-https://github.com/ho-tex/ltxcmds/issues
-
-
-The Base Interpreter refers to any `TeX-Format',
-because some files are installed in TDS:tex/generic//.
-
-This work consists of the main source file ltxcmds.dtx
-and the derived files
- ltxcmds.sty, ltxcmds.pdf, ltxcmds.ins, ltxcmds.drv,
- ltxcmds-test1.tex, ltxcmds-test-gobble.tex,
- ltxcmds-test-ifempty.tex, ltxcmds-test-zapspace.tex,
- ltxcmds-test-ifboxempty.tex, ltxcmds-test-nextchar.tex,
- ltxcmds-test-carcdr.tex.
-
-\endpreamble
-\let\MetaPrefix\DoubleperCent
-
-\generate{%
- \file{ltxcmds.ins}{\from{ltxcmds.dtx}{install}}%
- \file{ltxcmds.drv}{\from{ltxcmds.dtx}{driver}}%
- \usedir{tex/generic/ltxcmds}%
- \file{ltxcmds.sty}{\from{ltxcmds.dtx}{package}}%
-}
-
-\catcode32=13\relax% active space
-\let =\space%
-\Msg{************************************************************************}
-\Msg{*}
-\Msg{* To finish the installation you have to move the following}
-\Msg{* file into a directory searched by TeX:}
-\Msg{*}
-\Msg{* ltxcmds.sty}
-\Msg{*}
-\Msg{* To produce the documentation run the file `ltxcmds.drv'}
-\Msg{* through LaTeX.}
-\Msg{*}
-\Msg{* Happy TeXing!}
-\Msg{*}
-\Msg{************************************************************************}
-
-\endbatchfile
-%</install>
-%<*ignore>
-\fi
-%</ignore>
-%<*driver>
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{ltxcmds.drv}%
- [2019/12/15 v1.24 LaTeX kernel commands for general use (HO)]%
-\documentclass{ltxdoc}
-\usepackage{holtxdoc}[2011/11/22]
-\usepackage{zref-savepos}
-\usepackage{paralist}
-\hfuzz=1pt
-\begin{document}
- \DocInput{ltxcmds.dtx}%
-\end{document}
-%</driver>
-% \fi
-%
-%
-%
-% \GetFileInfo{ltxcmds.drv}
-%
-% \title{The \xpackage{ltxcmds} package}
-% \date{2019/12/15 v1.24}
-% \author{Heiko Oberdiek\thanks
-% {Please report any issues at \url{https://github.com/ho-tex/ltxcmds/issues}}}
-%
-% \maketitle
-%
-% \begin{abstract}
-% The package \xpackage{ltxcmds} exports some utility macros
-% from the \LaTeX\ kernel into a separate namespace and
-% also provides them for other formats such as plain-\TeX.
-% \end{abstract}
-%
-% \tableofcontents
-%
-% \newcounter{to}
-% \renewcommand*{\theto}{to\arabic{to}}
-% \newlength\tolength
-% \tolength=\dimexpr .5\linewidth+\oddsidemargin+1in+15mm\relax
-% \newcommand*{\TO}{^^A
-% \quad
-% \stepcounter{to}^^A
-% \zsavepos\theto
-% \ifdim\zposx\theto sp>0pt
-% \ifdim\zposx\theto sp<\tolength
-% \kern\dimexpr\tolength-\zposx\theto sp\relax
-% \fi
-% \fi
-% $\rightarrow$\quad
-% \ignorespaces
-% }
-%
-% \section{Documentation}
-%
-% \subsection{Introduction}
-%
-% Many of my packages also support other formats such as plain-\TeX.
-% Because I am rather familiar with the utility macros from
-% \LaTeX's kernel (e.g. \cs{@gobble}, \cs{@firstoftwo}), I found
-% myself rewriting them again and again, because they are lacking
-% in plain-\TeX.
-%
-% Therefore this package provides often used macros and similar
-% ones with the name prefix \cs{ltx@}. This avoids also faulty
-% redefinitions. I remember an example where a package redefined
-% \cs{@firstoftwo} with forgetting \cs{long}.
-%
-% \subsection{Numbers}
-%
-% \begin{declcs}{ltx@zero} \TO 0\\
-% \cs{ltx@one} \TO 1\\
-% \cs{ltx@two} \TO 2\\
-% \cs{ltx@cclv} \TO 255\\
-% \cs{ltx@minusone} \TO -1
-% \end{declcs}
-% These commands are numbers 0, 1, 2, 255 and -1. They are not digits
-% and a space is not gobbled afterwards. Macro \cs{ltx@minusone}
-% is available since version 2010/12/12 v1.15.
-%
-% \subsection{Scratch registers}
-%
-% Following the conventions of \hologo{plainTeX} and \hologo{LaTeX}
-% the first ten registers are free to use. Even numbered registers
-% are for local, odd numbered for global use.
-%
-% \begin{declcs}{ltx@(Loc,Glob)(Toks,Dimen,Skip)(A,B,C,D,E)}
-% \end{declcs}
-% The name consists of the prefix \cs{ltx@}, then
-% \texttt{Loc} or \texttt{Glob} for local or global usage follows.
-% The register type is given by \texttt{Toks} for token register,
-% \texttt{Dimen} for dimen register and \texttt{Skip} for skip
-% register. As last part the registers are numbered from \texttt{A}
-% to \texttt{E}. Example: \cs{ltx@LocToksA}.
-%
-% Since 2011/04/14 v1.19.
-%
-% \subsection{Argument killers}
-%
-% \begin{declcs}{ltx@gobble} \M{1} \TO\\
-% \cs{ltx@gobbletwo} \M{1} \M{2} \TO\\
-% \cs{ltx@gobblethree} \M{1} \M{2} \M{3} \TO\\
-% \cs{ltx@gobblefour} \M{1} \M{2} \M{3} \M{4} \TO
-% \end{declcs}
-%
-% \begin{declcs}{ltx@GobbleNum} \M{num} \M{1} \M{2} \dots\space
-% \M{\meta{num}} \TO
-% \end{declcs}
-% The first argument \meta{num} of macro \cs{ltx@GobbleNum} specifies,
-% how many following arguments are eaten. Macro \cs{ltx@GobbleNum}
-% is expandable in exact two expansion steps.
-%
-% \subsection{Argument grabbers}
-%
-% \begin{declcs}{ltx@firstofone} \M{1} \TO \meta{1}\\[1ex]
-% \cs{ltx@firstoftwo} \M{1} \M{2} \TO \meta{1}\\
-% \cs{ltx@secondoftwo} \M{1} \M{2} \TO \meta{2}\\[1ex]
-% \cs{ltx@firstofthree} \M{1} \M{2} \M{3} \TO \meta{1}\\
-% \cs{ltx@secondofthree} \M{1} \M{2} \M{3} \TO \meta{2}\\
-% \cs{ltx@thirdofthree} \M{1} \M{2} \M{3} \TO \meta{3}\\
-% \cs{ltx@firstoffour} \M{1} \M{2} \M{3} \M{4} \TO \meta{1}\\
-% \cs{ltx@secondoffour} \M{1} \M{2} \M{3} \M{4} \TO \meta{2}\\
-% \cs{ltx@thirdoffour} \M{1} \M{2} \M{3} \M{4} \TO \meta{3}\\
-% \cs{ltx@fourthoffour} \M{1} \M{2} \M{3} \M{4} \TO \meta{4}
-% \end{declcs}
-% Macros \cs{ltx@firstofthree}, \cs{ltx@secondofthree}
-% and \cs{ltx@thirdofthree} were added in version
-% 2010/11/12 v1.11.
-% Macros \cs{ltx@firstoffour}, \dots, \cs{ltx@fourthoffour}
-% were added in version 2011/02/04 v1.16.
-%
-% \subsection{List helpers}
-%
-% \begin{declcs}{ltx@carzero} \dots\ \cs{@nil} \TO\\
-% \cs{ltx@cdrzero} \dots\ \cs{@nil} \TO \dots
-% \end{declcs}
-%
-% \begin{declcs}{ltx@car} \M{1} \dots\ \cs{@nil} \TO \meta{1}\\
-% \cs{ltx@cdr} \M{1} \dots\ \cs{@nil} \TO \dots
-% \end{declcs}
-%
-% \begin{declcs}{ltx@cartwo} \M{1} \M{2} \dots\ \cs{@nil}
-% \TO \meta{1}\meta{2}\\
-% \cs{ltx@carsecond} \M{1} \M{2} \dots\ \cs{@nil} \TO \meta{2}\\
-% \cs{ltx@cdrtwo} \M{1} \M{2} \dots\ \cs{@nil} \TO \dots
-% \end{declcs}
-%
-% \begin{declcs}{ltx@carthree} \M{1} \M{2} \M{3} \dots\ \cs{@nil}
-% \TO \meta{1}\meta{2}\meta{3}\\
-% \cs{ltx@carthird} \M{1} \M{2} \M{3} \dots\ \cs{@nil}
-% \TO \meta{3}\\
-% \cs{ltx@cdrthree} \M{1} \M{2} \M{3} \dots\ \cs{@nil} \TO \dots
-% \end{declcs}
-%
-% \begin{declcs}{ltx@carfour} \M{1} \M{2} \M{3} \M{4} \dots\ \cs{@nil}
-% \TO \meta{1}\meta{2}\meta{3}\meta{4}\\
-% \cs{ltx@carfourth} \M{1} \M{2} \M{3} \M{4} \dots\ \cs{@nil}
-% \TO \meta{4}\\
-% \cs{ltx@cdrfour} \M{1} \M{2} \M{3} \M{4} \dots\ \cs{@nil} \TO \dots
-% \end{declcs}
-%
-% \begin{declcs}{ltx@CarNum} \M{num} \M{1} \dots\ \M{\meta{num}}
-% \M{\meta{num}+1} \dots\ \cs{@nil}\\
-% \TO \M{1} \dots\ \M{\meta{num}} \dots\\
-% \cs{ltx@CarNumth} \M{num} \M{1} \dots\ \M{\meta{num}}
-% \M{\meta{num}+1} \dots\ \cs{@nil}\\
-% \TO \M{\meta{num}} \dots\\
-% \cs{ltx@CdrNum} \M{num} \M{1} \dots\ \M{\meta{num}}
-% \M{\meta{num}+1} \dots\ \cs{@nil}\\
-% \TO \M{\meta{num}+1} \dots
-% \end{declcs}
-%
-% Macros with uppercase letters are expandable in two expansion steps.
-% Changes in version 2019/12/15 v1.24:
-% \begin{itemize}
-% \item
-% Macros \cs{ltx@carsecond}, \cs{ltx@carthird}, \cs{ltx@carfourth},
-% \cs{ltx@CarNumth} added.
-% \item
-% Macros \cs{ltx@cdr}, \cs{ltx@cdrtwo}, \cs{ltx@cdrthree}, \cs{ltx@cdrfour},
-% \cs{ltx@CdrNum} are expandable in two expansion steps and retain
-% spaces and braces after the first gobbled arguments.
-% \end{itemize}
-%
-% \subsection{Tail recursion}
-%
-% \begin{declcs}{ltx@ReturnAfterFi} \M{1} \cs{fi} \TO \cs{fi} \meta{1}\\
-% \cs{ltx@ReturnAfterElseFi} \M{1} \cs{else} \M{2} \cs{fi}
-% \TO \cs{fi} \meta{1}
-% \end{declcs}
-%
-% \subsection{Empty macro}
-%
-% \begin{declcs}{ltx@empty} \TO
-% \end{declcs}
-%
-% \subsection{Characters}
-%
-% \begin{declcs}{ltx@space} \TO \verb*| |\\
-% \cs{ltx@percentchar} \TO \texttt{\%}\\
-% \cs{ltx@backslashchar} \TO
-% \makeatletter\texttt{\@backslashchar}\\
-% \cs{ltx@hashchar} \TO \texttt{\#}\qquad(since v1.7)\\
-% \cs{ltx@leftbracechar} \TO \texttt{\textbraceleft}\qquad(since v1.8)\\
-% \cs{ltx@rightbracechar} \TO \texttt{\textbraceright}\qquad(since v1.8)
-% \end{declcs}
-%
-% \subsection{Boolean switch}
-%
-% \begin{declcs}{ltx@newif} \M{cmd}
-% \end{declcs}
-% \cs{ltx@newif} defines a new boolean switch \meta{cmd} like \cs{newif}.
-% Unlike \plainTeX's \cs{newif}, \cs{ltx@newif} is not \cs{outer}.
-% The command \meta{cmd} must start with the two characters |if|.
-%
-% \begin{declcs}{ltx@newglobalif} \M{cmd}
-% \end{declcs}
-% \cs{ltx@newglobalif} defines a new boolean switch \meta{cmd}
-% like \cs{ltx@newif}. However the switch setting commands,
-% \meta{cmd} without the prefix |if| and followed by |true| or |false|
-% are acting globally.
-%
-% \subsection{Command definitions}
-%
-% \begin{declcs}{ltx@ifundefined} \M{cmd} \M{yes} \M{no}
-% \end{declcs}
-% If \eTeX\ is available, \cs{ifcsname} is used that does
-% not have the side effect of defining undefined commands
-% with meaning of \cs{relax}. This command is always expandable.
-% Change in version 1.1: Also the meaning \cs{relax} is
-% always considered ``undefined''.
-%
-% \begin{declcs}{ltx@IfUndefined} \M{cmd} \M{yes} \M{no}
-% \end{declcs}
-% If \eTeX\ is available, \cs{ifcsname} is used that does
-% not have the side effect of defining undefined commands
-% with meaning of \cs{relax}. Also it always checks for
-% the meaning of \cs{relax} and considers this as undefined.
-% This macro is not expandable without \eTeX.
-%
-% \begin{declcs}{ltx@LocalExpandAfter}
-% \end{declcs}
-% It expands the token after the next token but in a local
-% context. That is the difference to \cs{expandafter}.
-% The local context discards the side effect of \cs{csname}
-% and let the command undefined after the expansion step.
-%
-% \subsection{Stripping}
-%
-% \begin{declcs}{ltx@RemovePrefix}\\
-% \cs{ltx@StripPrefix}
-% \end{declcs}
-% All tokens up to and including the next available character
-% `\textgreater' are thrown away. Usually it is used to strip
-% the first part of the output of the commands \cs{meaning}
-% or \cs{pdflastmatch}. Macro \cs{ltx@RemovePrefix}
-% has the same meaning as \LaTeX's \cs{strip@prefix}, whereas
-% macro \cs{ltx@StripPrefix} expands the next token
-% once before stripping the prefix.
-%
-% \begin{declcs}{ltx@onelevel@sanitize} \M{macro}
-% \end{declcs}
-% Macro \cs{ltx@onelevel@sanitize} provides \hologo{LaTeX}'s
-% \cs{@onelevel@sanitize}. The macro is expanded once and
-% the contents is converted to characters with catcode 12 (other)
-% and space tokens with catcode 10 (space). Then then sanitized
-% contents is stored into the macro again. Since version 1.12.
-%
-% \subsection{File management}
-%
-% All macros in this section are expandable like
-% the counterparts of the \LaTeX\ kernel. Also they
-% can be used after the preamble.
-%
-% \subsubsection{File extensions}
-%
-% \begin{declcs}{ltx@clsextension}\\
-% \cs{ltx@pkgextension}
-% \end{declcs}
-% Macros \cs{ltx@clsextension} and \cs{ltx@styextension}
-% stores the strings |cls| and |sty|. In opposite to \hologo{LaTeX}'s
-% \cs{@clsextension} and \cs{@styextension} they can also be
-% used after |\begin{document}|.
-%
-% \subsubsection{Load check}
-%
-% \begin{declcs}{ltx@ifclassloaded} \M{class} \M{yes} \M{no}\\
-% \cs{ltx@ifpackageloaded} \M{package} \M{yes} \M{no}
-% \end{declcs}
-% Macros \cs{ltx@ifclassloaded}\slash\cs{ltx@ifpackageloaded}
-% execute \meta{yes}, if the \meta{class} or \meta{package} is loaded,
-% otherwise \meta{no} is called.
-% Both \meta{class} and \meta{package} are specified without
-% extension. The macros can also be used after |\begin{document}|.
-%
-% \begin{declcs}{ltx@iffileloaded} \M{file} \M{yes} \M{no}
-% \end{declcs}
-% If \LaTeX's \cs{ProvidesFile} macro was called before
-% using \meta{file} as argument, then \cs{ltx@iffileloaded}
-% calls \meta{yes}, otherwise \meta{no}.
-% Therefore it is possible
-% that the \meta{file} is loaded, but \meta{no} is executed because
-% of a missing \cs{ProvidesFile}. The \LaTeX\ kernel does not have
-% a counterpart of \cs{ltx@iffileloaded}.
-%
-% Note that the file name used in \cs{ProvidesFile} and
-% \cs{ltx@iffileloaded} must match. For example, if \TeX's
-% default extension \xext{tex} was given in the first command,
-% then it must also specified in the latter command and vice versa.
-%
-% \subsubsection{Version date check}
-%
-% \begin{declcs}{ltx@ifclasslater} \M{class} \M{date} \M{yes} \M{no}\\
-% \cs{ltx@ifpackagelater} \M{package} \M{date} \M{yes} \M{no}\\
-% \cs{ltx@iffilelater} \M{file} \M{date} \M{yes} \M{no}
-% \end{declcs}
-% If a \cs{ProvidesClass}\slash\cs{ProvidesPackage}\slash
-% \cs{ProvidesFile} command with exact the same class\slash package\slash
-% file was executed before with an optional
-% argument that starts with a \LaTeX\ version date, then
-% this version date is compared with the argument \meta{date}.
-% If they are equal or if the version date is the later date,
-% then \meta{yes} is called. In all other cases \meta{no} is executed.
-%
-% A \LaTeX\ date has the format |YYYY/MM/DD| with |YYYY| as year
-% with four digits, |MM| as month with two digits and |DD| as day
-% with two digits. If \pdfTeX's \cs{pdfmatch} is available, then
-% it is used to detect the version date, to reject invalid
-% date formats and to reject some invalid dates.
-% Dates before 1994/01/01 are always invalid, because version
-% dates are introduced with \LaTeXe\ in 1994.
-%
-% \subsection{Macro additions}
-%
-% \begin{declcs}{ltx@GlobalAppendToMacro} \M{cmd} \M{addition}\\
-% \cs{ltx@LocalAppendToMacro} \M{cmd} \M{addition}
-% \end{declcs}
-% The \meta{addition} is appended to the parameterless macro \meta{cmd}.
-% If \meta{cmd} is undefined or has the meaning \cs{relax}, then
-% it will be initialized as empty macro beforehand. Due to a bug \meta{addition}
-% must not contain \cs{par} before version 2010/10/25 v1.9.
-%
-% \begin{declcs}{ltx@GlobalPrependToMacro} \M{cmd} \M{addition}\\
-% \cs{ltx@LocalPrependToMacro} \M{cmd} \M{addition}
-% \end{declcs}
-% The \meta{addition} is prepended to the parameterless macro \meta{cmd}.
-% If \meta{cmd} is undefined or has the meaning \cs{relax}, then
-% it will be initialized as empty macro beforehand. The macros
-% were added in version 2011/08/22 v1.21.
-%
-% \subsection{Next character detection}
-%
-% \begin{declcs}{ltx@ifnextchar} \M{char} \M{yes} \M{no}
-% \end{declcs}
-% If next character is \meta{char} then \meta{yes} is called,
-% otherwise \meta{no}. The character is not removed.
-% Spaces are silently removed when looking for \meta{char}
-% as \hologo{LaTeX}'s version \cs{kernel@ifnextchar} does.
-% But there are also small differences:
-% \begin{itemize}
-% \item The space can be used as \meta{char}. In this case
-% optional spaces before \meta{char} are not supported of course.
-% \item If the optional space is a command that is a character
-% (defined by \cs{let} or \cs{futurelet}), then
-% \cs{kernel@ifnextchar} breaks with an \hologo{TeX} error.
-% \cs{ltx@ifnextchar} silently removes this token as
-% optional space.
-% \end{itemize}
-% Since 2010/03/01 v1.3.
-%
-% \begin{declcs}{ltx@ifnextchar@nospace} \M{char} \M{yes} \M{no}
-% \end{declcs}
-% Macro \cs{ltx@ifnextchar@nospace} behaves like
-% macro \cs{ltx@ifnextchar} with the exception that
-% optional spaces are not supported before \meta{char}.
-% Since 2011/04/14 v1.19.
-%
-% \subsection{\cs{ltx@leavevmode}, \cs{ltx@mbox}}
-%
-% \begin{declcs}{ltx@leavevmode}
-% \end{declcs}
-% Macro \cs{ltx@leavevmode} calls \hologo{pdfTeX}'s \cs{quitvmode}.
-% Otherwise \cs{leavevmode} is used and defined if it is necessary.
-%
-% \begin{declcs}{ltx@mbox}
-% \end{declcs}
-% Macro \cs{ltx@mbox} reimplements \cs{mbox} with two changes.
-% Instead of \cs{leavevmode} it uses \cs{ltx@leavevmode} and
-% stops right after \cs{hbox}. Especially it does not grab
-% the argument and allows the extended syntax of \cs{hbox}.
-%
-% \subsection{Expandable test for emptiness}
-%
-% \begin{declcs}{ltx@ifempty} \M{stuff} \M{yes} \M{no}
-% \end{declcs}
-% Macro \cs{ltx@ifempty} checks in exact two expansion steps
-% whether \meta{stuff}
-% is empty or contains token. Depending on the result
-% \meta{yes} or \meta{no} is executed. The token in \meta{stuff}
-% may contain \cs{par} and unmatched conditionals (\cs{if}, \cs{else},
-% \cs{fi}, \dots). Since version 2010/11/12 v1.11.
-%
-% \begin{declcs}{ltx@ifblank} \M{stuff} \M{yes} \M{no}
-% \end{declcs}
-% Macro \cs{ltx@ifblank} tests in exact two expansion steps
-% if \meta{stuff} is empty or contain only blank spaces.
-% In this case argument \meta{yes} is called. If \meta{stuff}
-% contains other tokens than spaces then \meta{no} is executed.
-% Since version 2010/12/04 v1.13.
-%
-% \subsection{Stripping spaces}
-%
-% \begin{declcs}{ltx@zapspace} \M{stuff}
-% \end{declcs}
-% Macro \cs{ltx@zapspace} strips spaces from \meta{stuff}
-% that are not hidden inside curly braces. Like \hologo{LaTeX}'s
-% \cs{zap@space} it is expandable. Differences:
-% \begin{itemize}
-% \item
-% Syntax: \cs{zap@space} also expects a space token
-% and \cs{@empty} after \meta{stuff}.
-% \item
-% Macro \cs{ltx@zapspace} is expandable in exact two
-% expansion steps.
-% \item
-% Macro \cs{ltx@zapspace} always retains curly braces.
-% \item
-% Macro \cs{zap@space} has a bug. It stops stripping spaces
-% after a token group in curly braces if the first two tokens
-% inside the group are equal.
-% \item
-% Macro \cs{ltx@zapspace} also works with \cs{par}
-% and conditionals (\cs{if}, \cs{else}, \cs{fi}, \dots).
-% \end{itemize}
-% Macro \cs{ltx@zapspace} is available since version
-% 2010/12/07 v1.14.
-%
-% \subsection{Check for emptiness of boxes}
-%
-% \begin{declcs}{ltx@IfBoxEmpty} \M{box register number}
-% \M{yes} \M{no}
-% \end{declcs}
-% Macro \cs{ltx@IfBoxEmpty} calls \meta{yes} if
-% the box exists (\cs{ifvoid} returns false) and the box
-% does not contain any content. Otherwise if the box
-% is void or contains something, then \meta{no} is executed.
-% Thus being empty means that the box exists and is either
-% an \cs{hbox} or a \cs{vbox} and may even have dimensions other than
-% 0.0\,pt, but the box does not contain anything.
-% Macro \cs{ltx@IfBoxEmpty} is available since 2010/02/04 v1.16.
-%
-% \begin{declcs}{ltx@IfBoxVoidOrEmpty} \M{box register number}
-% \M{yes} \M{no}
-% \end{declcs}
-% Macro \cs{ltx@IfBoxVoidOrEmpty} calls \meta{yes} if
-% the box is either void or does not contain any content.
-% Otherwise \meta{no} is executed.
-% Macro \cs{ltx@IfBoxVoidOrEmpty} is available since 2010/02/04 v1.16.
-%
-% \StopEventually{
-% }
-%
-% \section{Implementation}
-%
-% \subsection{Identification}
-%
-% \begin{macrocode}
-%<*package>
-% \end{macrocode}
-% Reload check, especially if the package is not used with \LaTeX.
-% \begin{macrocode}
-\begingroup\catcode61\catcode48\catcode32=10\relax%
- \catcode13=5 % ^^M
- \endlinechar=13 %
- \catcode35=6 % #
- \catcode39=12 % '
- \catcode44=12 % ,
- \catcode45=12 % -
- \catcode46=12 % .
- \catcode58=12 % :
- \catcode64=11 % @
- \catcode123=1 % {
- \catcode125=2 % }
- \expandafter\let\expandafter\x\csname ver@ltxcmds.sty\endcsname
- \ifx\x\relax % plain-TeX, first loading
- \else
- \def\empty{}%
- \ifx\x\empty % LaTeX, first loading,
- % variable is initialized, but \ProvidesPackage not yet seen
- \else
- \expandafter\ifx\csname PackageInfo\endcsname\relax
- \def\x#1#2{%
- \immediate\write-1{Package #1 Info: #2.}%
- }%
- \else
- \def\x#1#2{\PackageInfo{#1}{#2, stopped}}%
- \fi
- \x{ltxcmds}{The package is already loaded}%
- \aftergroup\endinput
- \fi
- \fi
-\endgroup%
-% \end{macrocode}
-% Package identification:
-% \begin{macrocode}
-\begingroup\catcode61\catcode48\catcode32=10\relax%
- \catcode13=5 % ^^M
- \endlinechar=13 %
- \catcode35=6 % #
- \catcode39=12 % '
- \catcode40=12 % (
- \catcode41=12 % )
- \catcode44=12 % ,
- \catcode45=12 % -
- \catcode46=12 % .
- \catcode47=12 % /
- \catcode58=12 % :
- \catcode64=11 % @
- \catcode91=12 % [
- \catcode93=12 % ]
- \catcode123=1 % {
- \catcode125=2 % }
- \expandafter\ifx\csname ProvidesPackage\endcsname\relax
- \def\x#1#2#3[#4]{\endgroup
- \immediate\write-1{Package: #3 #4}%
- \xdef#1{#4}%
- }%
- \else
- \def\x#1#2[#3]{\endgroup
- #2[{#3}]%
- \ifx#1\@undefined
- \xdef#1{#3}%
- \fi
- \ifx#1\relax
- \xdef#1{#3}%
- \fi
- }%
- \fi
-\expandafter\x\csname ver@ltxcmds.sty\endcsname
-\ProvidesPackage{ltxcmds}%
- [2019/12/15 v1.24 LaTeX kernel commands for general use (HO)]%
-% \end{macrocode}
-%
-% \begin{macrocode}
-\begingroup\catcode61\catcode48\catcode32=10\relax%
- \catcode13=5 % ^^M
- \endlinechar=13 %
- \catcode123=1 % {
- \catcode125=2 % }
- \catcode64=11 % @
- \def\x{\endgroup
- \expandafter\edef\csname LTXcmds@AtEnd\endcsname{%
- \endlinechar=\the\endlinechar\relax
- \catcode13=\the\catcode13\relax
- \catcode32=\the\catcode32\relax
- \catcode35=\the\catcode35\relax
- \catcode61=\the\catcode61\relax
- \catcode64=\the\catcode64\relax
- \catcode123=\the\catcode123\relax
- \catcode125=\the\catcode125\relax
- }%
- }%
-\x\catcode61\catcode48\catcode32=10\relax%
-\catcode13=5 % ^^M
-\endlinechar=13 %
-\catcode35=6 % #
-\catcode64=11 % @
-\catcode123=1 % {
-\catcode125=2 % }
-\def\TMP@EnsureCode#1#2{%
- \edef\LTXcmds@AtEnd{%
- \LTXcmds@AtEnd
- \catcode#1=\the\catcode#1\relax
- }%
- \catcode#1=#2\relax
-}
-\TMP@EnsureCode{36}{3}% $
-\TMP@EnsureCode{38}{4}% &
-\TMP@EnsureCode{40}{12}% (
-\TMP@EnsureCode{41}{12}% )
-\TMP@EnsureCode{45}{12}% -
-\TMP@EnsureCode{46}{12}% .
-\TMP@EnsureCode{47}{12}% /
-\TMP@EnsureCode{60}{12}% <
-\TMP@EnsureCode{62}{12}% >
-\TMP@EnsureCode{91}{12}% [
-\TMP@EnsureCode{96}{12}% `
-\TMP@EnsureCode{93}{12}% ]
-\TMP@EnsureCode{94}{12}% ^ (superscript) (!)
-\TMP@EnsureCode{124}{12}% |
-\edef\LTXcmds@AtEnd{\LTXcmds@AtEnd\noexpand\endinput}
-% \end{macrocode}
-%
-% \subsection{Numbers}
-%
-% \begin{macro}{\ltx@zero}
-% \begin{macrocode}
-\chardef\ltx@zero=0 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@one}
-% \begin{macrocode}
-\chardef\ltx@one=1 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@two}
-% \begin{macrocode}
-\chardef\ltx@two=2 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@active}
-% \begin{macrocode}
-\chardef\ltx@active=13 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@cclv}
-% \begin{macrocode}
-\chardef\ltx@cclv=255 %
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@minusone}
-% \begin{macrocode}
-\def\ltx@minusone{%
- -\ltx@one
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Scratch registers}
-%
-% \begin{macro}{\ltx@LocToksA}
-% \begin{macrocode}
-\toksdef\ltx@LocToksA=0 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocToksB}
-% \begin{macrocode}
-\toksdef\ltx@LocToksB=2 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocToksC}
-% \begin{macrocode}
-\toksdef\ltx@LocToksC=4 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocToksD}
-% \begin{macrocode}
-\toksdef\ltx@LocToksD=6 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocToksE}
-% \begin{macrocode}
-\toksdef\ltx@LocToksE=8 %
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@GlobToksA}
-% \begin{macrocode}
-\toksdef\ltx@GlobToksA=1 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@GlobToksB}
-% \begin{macrocode}
-\toksdef\ltx@GlobToksB=3 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@GlobToksC}
-% \begin{macrocode}
-\toksdef\ltx@GlobToksC=5 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@GlobToksD}
-% \begin{macrocode}
-\toksdef\ltx@GlobToksD=7 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@GlobToksE}
-% \begin{macrocode}
-\toksdef\ltx@GlobToksE=9 %
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@LocDimenA}
-% \begin{macrocode}
-\dimendef\ltx@LocDimenA=0 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocDimenB}
-% \begin{macrocode}
-\dimendef\ltx@LocDimenB=2 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocDimenC}
-% \begin{macrocode}
-\dimendef\ltx@LocDimenC=4 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocDimenD}
-% \begin{macrocode}
-\dimendef\ltx@LocDimenD=6 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocDimenE}
-% \begin{macrocode}
-\dimendef\ltx@LocDimenE=8 %
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@GlobDimenA}
-% \begin{macrocode}
-\dimendef\ltx@GlobDimenA=1 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@GlobDimenB}
-% \begin{macrocode}
-\dimendef\ltx@GlobDimenB=3 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@GlobDimenC}
-% \begin{macrocode}
-\dimendef\ltx@GlobDimenC=5 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@GlobDimenD}
-% \begin{macrocode}
-\dimendef\ltx@GlobDimenD=7 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@GlobDimenE}
-% \begin{macrocode}
-\dimendef\ltx@GlobDimenE=9 %
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@LocSkipA}
-% \begin{macrocode}
-\skipdef\ltx@LocSkipA=0 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocSkipB}
-% \begin{macrocode}
-\skipdef\ltx@LocSkipB=2 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocSkipC}
-% \begin{macrocode}
-\skipdef\ltx@LocSkipC=4 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocSkipD}
-% \begin{macrocode}
-\skipdef\ltx@LocSkipD=6 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocSkipE}
-% \begin{macrocode}
-\skipdef\ltx@LocSkipE=8 %
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@GlobSkipA}
-% \begin{macrocode}
-\skipdef\ltx@GlobSkipA=1 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@GlobSkipB}
-% \begin{macrocode}
-\skipdef\ltx@GlobSkipB=3 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@GlobSkipC}
-% \begin{macrocode}
-\skipdef\ltx@GlobSkipC=5 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@GlobSkipD}
-% \begin{macrocode}
-\skipdef\ltx@GlobSkipD=7 %
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@GlobSkipE}
-% \begin{macrocode}
-\skipdef\ltx@GlobSkipE=9 %
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \subsection{Argument killers}
-%
-% \begin{macro}{\ltx@gobble}
-% \begin{macrocode}
-\long\def\ltx@gobble#1{}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@gobbletwo}
-% \begin{macrocode}
-\long\def\ltx@gobbletwo#1#2{}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@gobblethree}
-% \begin{macrocode}
-\long\def\ltx@gobblethree#1#2#3{}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@gobblefour}
-% \begin{macrocode}
-\long\def\ltx@gobblefour#1#2#3#4{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@GobbleNum}
-% \begin{macrocode}
-\def\ltx@GobbleNum#1{%
- \romannumeral
- \csname ltx@zero%
- \expandafter\LTXcmds@GobbleNum
- \romannumeral\LTXcmds@num{#1}000{m\endcsname}%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@GobbleNum}
-% \begin{macrocode}
-\def\LTXcmds@GobbleNum#1{%
- \csname LTXcmds@G#1\LTXcmds@GobbleNum
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@Gm}
-% \begin{macrocode}
-\long\def\LTXcmds@Gm#1{%
- \endcsname
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Argument grabbers}
-%
-% \begin{macro}{\ltx@firstofone}
-% \begin{macrocode}
-\long\def\ltx@firstofone#1{#1}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@firstoftwo}
-% \begin{macrocode}
-\long\def\ltx@firstoftwo#1#2{#1}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@secondoftwo}
-% \begin{macrocode}
-\long\def\ltx@secondoftwo#1#2{#2}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@firstofthree}
-% \begin{macrocode}
-\long\def\ltx@firstofthree#1#2#3{#1}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@secondofthree}
-% \begin{macrocode}
-\long\def\ltx@secondofthree#1#2#3{#2}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@thirdofthree}
-% \begin{macrocode}
-\long\def\ltx@thirdofthree#1#2#3{#3}%
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@firstoffour}
-% \begin{macrocode}
-\long\def\ltx@firstoffour#1#2#3#4{#1}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@secondoffour}
-% \begin{macrocode}
-\long\def\ltx@secondoffour#1#2#3#4{#2}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@thirdoffour}
-% \begin{macrocode}
-\long\def\ltx@thirdoffour#1#2#3#4{#3}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@fourthoffour}
-% \begin{macrocode}
-\long\def\ltx@fourthoffour#1#2#3#4{#4}%
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{List helpers}
-%
-% \begin{macro}{\ltx@carzero}
-% \begin{macrocode}
-\long\def\ltx@carzero#1\@nil{}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@cdrzero}
-% \begin{macrocode}
-\long\def\LTXcmds@cdrzero#1\@nil{#1}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@cdrzero}
-% \begin{macrocode}
-\def\ltx@cdrzero{%
- \romannumeral\LTXcmds@cdrzero\ltx@zero
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@car}
-% \begin{macrocode}
-\long\def\ltx@car#1#2\@nil{#1}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@cdr}
-% \begin{macrocode}
-\long\def\ltx@cdr#1{%
- \romannumeral\LTXcmds@cdrzero\ltx@zero
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@cartwo}
-% \begin{macrocode}
-\long\def\ltx@cartwo#1#2#3\@nil{#1#2}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@carsecond}
-% \begin{macrocode}
-\long\def\ltx@carsecond#1#2#3\@nil{#2}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@cdrtwo}
-% \begin{macrocode}
-\long\def\ltx@cdrtwo#1#2{%
- \romannumeral\LTXcmds@cdrzero\ltx@zero
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@carthree}
-% \begin{macrocode}
-\long\def\ltx@carthree#1#2#3#4\@nil{#1#2#3}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@carthird}
-% \begin{macrocode}
-\long\def\ltx@carthird#1#2#3#4\@nil{#3}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@cdrthree}
-% \begin{macrocode}
-\long\def\ltx@cdrthree#1#2#3{%
- \romannumeral\LTXcmds@cdrzero\ltx@zero
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@carfour}
-% \begin{macrocode}
-\long\def\ltx@carfour#1#2#3#4#5\@nil{#1#2#3#4}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@carfourth}
-% \begin{macrocode}
-\long\def\ltx@carfourth#1#2#3#4#5\@nil{#4}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@cdrfour}
-% \begin{macrocode}
-\long\def\ltx@cdrfour#1#2#3#4{%
- \romannumeral\LTXcmds@cdrzero\ltx@zero
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@CarNum}
-% \begin{macrocode}
-\def\ltx@CarNum#1{%
- \romannumeral
- \csname LTXcmds@CarNumFinish%
- \expandafter\LTXcmds@CarNum
- \romannumeral\LTXcmds@num{#1}000{x\endcsname}%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@CarNum}
-% \begin{macrocode}
-\def\LTXcmds@CarNum#1{%
- \csname LTXcmds@C#1\LTXcmds@CarNum
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@Cm}
-% \begin{macrocode}
-\long\def\LTXcmds@Cm#1#2{%
- \endcsname{#1#2}%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@Cx}
-% \begin{macrocode}
-\def\LTXcmds@Cx#1{%
- \endcsname{}%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@CarNumFinish}
-% \begin{macrocode}
-\long\def\LTXcmds@CarNumFinish#1#2\@nil{%
- \ltx@zero
- #1%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@CarNumth}
-% \begin{macrocode}
-\def\ltx@CarNumth#1{%
- \romannumeral
- \expandafter\expandafter\expandafter
- \LTXcmds@CarNumth
- \ltx@GobbleNum{#1}{}%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@CarNumth}
-% \begin{macrocode}
-\long\def\LTXcmds@CarNumth#1#2\@nil{%
- \ltx@zero
- #1%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@CdrNum}
-% \begin{macrocode}
-\def\ltx@CdrNum#1{%
- \romannumeral%
- \expandafter\expandafter\expandafter\ltx@cdrzero
- \expandafter\expandafter\expandafter\ltx@zero
- \ltx@GobbleNum{#1}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Tail recursion}
-%
-% \begin{macro}{\ltx@ReturnAfterFi}
-% \begin{macrocode}
-\long\def\ltx@ReturnAfterFi#1\fi{\fi#1}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@ReturnAfterElseFi}
-% \begin{macrocode}
-\long\def\ltx@ReturnAfterElseFi#1\else#2\fi{\fi#1}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Empty macro}
-%
-% \begin{macro}{\ltx@empty}
-% \begin{macrocode}
-\def\ltx@empty{}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Characters}
-%
-% \begin{macro}{\ltx@space}
-% \begin{macrocode}
-\def\ltx@space{ }
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@percentchar}
-% \begin{macrocode}
-\begingroup
- \lccode`0=`\%\relax
-\lowercase{\endgroup
- \def\ltx@percentchar{0}%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@backslashchar}
-% \begin{macrocode}
-\begingroup
- \lccode`0=`\\\relax
-\lowercase{\endgroup
- \def\ltx@backslashchar{0}%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@hashchar}
-% \begin{macrocode}
-\begingroup
- \lccode`0=`\#\relax
-\lowercase{\endgroup
- \def\ltx@hashchar{0}%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@leftbracechar}
-% \begin{macrocode}
-\begingroup
- \lccode`0=`\{\relax
-\lowercase{\endgroup
- \def\ltx@leftbracechar{0}%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@rightbracechar}
-% \begin{macrocode}
-\begingroup
- \lccode`0=`\}\relax
-\lowercase{\endgroup
- \def\ltx@rightbracechar{0}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Boolean switch}
-%
-% \begin{macro}{\ltx@newif}
-% \begin{macrocode}
-\def\ltx@newif#1{%
- \begingroup
- \escapechar=-1 %
- \expandafter\endgroup
- \expandafter\LTXcmds@newif\string#1\@nil
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@newif}
-% \begin{macrocode}
-\begingroup
- \escapechar=-1 %
-\expandafter\endgroup
-\expandafter\def\expandafter\LTXcmds@newif\string\if#1\@nil{%
- \expandafter\edef\csname#1true\endcsname{%
- \let
- \expandafter\noexpand\csname if#1\endcsname
- \noexpand\iftrue
- }%
- \expandafter\edef\csname#1false\endcsname{%
- \let
- \expandafter\noexpand\csname if#1\endcsname
- \noexpand\iffalse
- }%
- \csname#1false\endcsname
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@newglobalif}
-% \begin{macrocode}
-\def\ltx@newglobalif#1{%
- \begingroup
- \escapechar=-1 %
- \expandafter\endgroup
- \expandafter\LTXcmds@newglobalif\string#1\@nil
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@newglobalif}
-% \begin{macrocode}
-\begingroup
- \escapechar=-1 %
-\expandafter\endgroup
-\expandafter
-\def\expandafter\LTXcmds@newglobalif\string\if#1\@nil{%
- \expandafter\edef\csname#1true\endcsname{%
- \global\let
- \expandafter\noexpand\csname if#1\endcsname
- \noexpand\iftrue
- }%
- \expandafter\edef\csname#1false\endcsname{%
- \global\let
- \expandafter\noexpand\csname if#1\endcsname
- \noexpand\iffalse
- }%
- \csname#1false\endcsname
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Command definitions}
-%
-% \begin{macro}{\ltx@LocalExpandAfter}
-% \begin{macrocode}
-\def\ltx@LocalExpandAfter{%
- \begingroup
- \expandafter\expandafter\expandafter
- \endgroup
- \expandafter
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\ltx@LocalExpandAfter
-\ifx\csname ifcsname\endcsname\relax
-% \end{macrocode}
-% \begin{macro}{\ltx@ifundefined}
-% \begin{macrocode}
- \def\ltx@ifundefined#1{%
- \expandafter\ifx\csname #1\endcsname\relax
- \expandafter\ltx@firstoftwo
- \else
- \expandafter\ltx@secondoftwo
- \fi
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@IfUndefined}
-% \begin{macrocode}
- \def\ltx@IfUndefined#1{%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname #1\endcsname\relax
- \expandafter\ltx@firstoftwo
- \else
- \expandafter\ltx@secondoftwo
- \fi
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
- \expandafter\ltx@gobble
-\else
- \expandafter\ltx@firstofone
-\fi
-{%
-% \end{macrocode}
-% \begin{macro}{\ltx@ifundefined}
-% \begin{macrocode}
- \def\ltx@ifundefined#1{%
- \ifcsname #1\endcsname
- \expandafter\ifx\csname #1\endcsname\relax
- \expandafter\expandafter\expandafter\ltx@firstoftwo
- \else
- \expandafter\expandafter\expandafter\ltx@secondoftwo
- \fi
- \else
- \expandafter\ltx@firstoftwo
- \fi
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@IfUndefined}
-% \begin{macrocode}
- \let\ltx@IfUndefined\ltx@ifundefined
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-}
-% \end{macrocode}
-%
-% \subsection{Stripping}
-%
-% \begin{macro}{\ltx@RemovePrefix}
-% \begin{macrocode}
-\def\ltx@RemovePrefix#1>{}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@StripPrefix}
-% \begin{macrocode}
-\def\ltx@StripPrefix{%
- \expandafter\ltx@RemovePrefix
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@onelevel@sanitize}
-% \begin{macrocode}
-\def\ltx@onelevel@sanitize#1{%
- \edef#1{%
- \expandafter
- \ltx@RemovePrefix\meaning#1%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{File management}
-%
-% \subsubsection{File extensions}
-%
-% \begin{macro}{\ltx@clsextension}
-% \begin{macrocode}
-\def\ltx@clsextension{cls}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@pkgextension}
-% \begin{macrocode}
-\def\ltx@pkgextension{sty}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Load check}
-%
-% \begin{macro}{\ltx@iffileloaded}
-% \begin{macrocode}
-\def\ltx@iffileloaded#1{%
- \ltx@ifundefined{ver@#1}\ltx@secondoftwo\ltx@firstoftwo
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@ifclassloaded}
-% \begin{macrocode}
-\def\ltx@ifclassloaded#1{%
- \ltx@iffileloaded{#1.\ltx@clsextension}%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@ifpackageloaded}
-% \begin{macrocode}
-\def\ltx@ifpackageloaded#1{%
- \ltx@iffileloaded{#1.\ltx@pkgextension}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Version date check}
-%
-% \begin{macro}{\ltx@iffilelater}
-% \begin{macrocode}
-\def\ltx@iffilelater#1#2{%
- \ltx@iffileloaded{#1}{%
- \expandafter\LTXcmds@IfLater\expandafter{%
- \number
- \expandafter\expandafter\expandafter\LTXcmds@ParseVersion
- \expandafter\expandafter\expandafter{%
- \csname ver@#1\endcsname
- }%
- \expandafter}\expandafter{%
- \number
- \expandafter\LTXcmds@ParseVersion\expandafter{#2}%
- }%
- }\ltx@secondoftwo
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@IfLater}
-% \begin{macrocode}
-\def\LTXcmds@IfLater#1#2{%
- \ifcase 0%
- \ifnum#1<19940101 %
- \else
- \ifnum#2<19940101 %
- \else
- \ifnum#2>#1 %
- \else
- 1%
- \fi
- \fi
- \fi
- \ltx@space
- \expandafter\ltx@secondoftwo
- \else
- \expandafter\ltx@firstoftwo
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@ifclasslater}
-% \begin{macrocode}
-\def\ltx@ifclasslater#1{%
- \ltx@iffilelater{#1.\ltx@clsextension}%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@ifpackagelater}
-% \begin{macrocode}
-\def\ltx@ifpackagelater#1{%
- \ltx@iffilelater{#1.\ltx@pkgextension}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\ltx@IfUndefined{pdfmatch}{%
-% \end{macrocode}
-% \begin{macro}{\LTXcmds@ParseVersion}
-% \begin{macrocode}
- \def\LTXcmds@ParseVersion#1{%
- \LTXcmds@@ParseVersion#10000/00/00\@nil
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@@ParseVersion}
-% \begin{macrocode}
- \def\LTXcmds@@ParseVersion#1#2#3#4/#5#6/#7#8#9\@nil{%
- #1#2#3#4#5#6#7#8%
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-}{%
-% \end{macrocode}
-% \begin{macro}{\LTXcmds@ParseVersion}
-% \begin{macrocode}
- \def\LTXcmds@ParseVersion#1{%
- \ifnum\pdfmatch{%
- ^%
- (199[4-9]|[2-9][0-9][0-9][0-9])/%
- (0[1-9]|1[0-2])/%
- (0[1-9]|[1-2][0-9]|3[0-1])%
- }{#1}=1 %
- \ltx@StripPrefix\pdflastmatch1 %
- \ltx@StripPrefix\pdflastmatch2 %
- \ltx@StripPrefix\pdflastmatch3 %
- \else
- 0%
- \fi
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-}
-% \end{macrocode}
-%
-% \subsection{Macro additions}
-%
-% \begin{macro}{\ltx@GlobalAppendToMacro}
-% \begin{macrocode}
-\long\def\ltx@GlobalAppendToMacro#1#2{%
- \ifx\ltx@undefined#1%
- \let#1\ltx@empty
- \else
- \ifx\relax#1%
- \let#1\ltx@empty
- \fi
- \fi
- \begingroup
- \ltx@LocToksA\expandafter{#1#2}%
- \xdef#1{\the\ltx@LocToksA}%
- \endgroup
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocalAppendToMacro}
-% \begin{macrocode}
-\long\def\ltx@LocalAppendToMacro#1#2{%
- \global\let\LTXcmds@gtemp#1%
- \ifx\ltx@undefined\LTXcmds@gtemp
- \global\let\LTXcmds@gtemp\ltx@empty
- \else
- \ifx\relax\LTXcmds@gtemp
- \global\letLTXcmds@gtemp\ltx@empty
- \fi
- \fi
- \begingroup
- \ltx@LocToksA\expandafter{\LTXcmds@gtemp#2}%
- \xdef\LTXcmds@gtemp{\the\ltx@LocToksA}%
- \endgroup
- \let#1\LTXcmds@gtemp
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@GlobalPrependToMacro}
-% \begin{macrocode}
-\long\def\ltx@GlobalPrependToMacro#1#2{%
- \ifx\ltx@undefined#1%
- \let#1\ltx@empty
- \else
- \ifx\relax#1%
- \let#1\ltx@empty
- \fi
- \fi
- \begingroup
- \ltx@LocToksA{#2}%
- \ltx@LocToksB\expandafter{#1}%
- \xdef#1{\the\ltx@LocToksA\the\ltx@LocToksB}%
- \endgroup
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@LocalPrependToMacro}
-% \begin{macrocode}
-\long\def\ltx@LocalPrependToMacro#1#2{%
- \global\let\LTXcmds@gtemp#1%
- \ifx\ltx@undefined\LTXcmds@gtemp
- \global\let\LTXcmds@gtemp\ltx@empty
- \else
- \ifx\relax\LTXcmds@gtemp
- \global\letLTXcmds@gtemp\ltx@empty
- \fi
- \fi
- \begingroup
- \ltx@LocToksA{#2}%
- \ltx@LocToksB\expandafter{\LTXcmds@gtemp}%
- \xdef\LTXcmds@gtemp{\the\ltx@LocToksA\the\ltx@LocToksB}%
- \endgroup
- \let#1\LTXcmds@gtemp
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Next character detection}
-%
-% \begin{macro}{\ltx@ifnextchar}
-% \begin{macrocode}
-\long\def\ltx@ifnextchar#1#2#3{%
- \begingroup
- \let\LTXcmds@CharToken= #1\relax
- \ltx@LocToksA{\endgroup#2}%
- \ltx@LocToksB{\endgroup#3}%
- \futurelet\LTXcmds@LetToken\LTXcmds@ifnextchar
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@ifnextchar}
-% \begin{macrocode}
-\def\LTXcmds@ifnextchar{%
- \ifx\LTXcmds@LetToken\LTXcmds@CharToken
- \the\expandafter\ltx@LocToksA
- \else
- \expandafter
- \ifx\csname LTXcmds@LetToken\endcsname\LTXcmds@SpaceToken
- \expandafter\expandafter\expandafter\LTXcmds@@ifnextchar
- \else
- \the\expandafter\expandafter\expandafter\ltx@LocToksB
- \fi
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@@ifnextchar}
-% \cs{futurelet} does not distinguish between a
-% character and a command that is a character
-% (defined by using \cs{let} or \cs{futurelet}).
-% Therefore the space is catched by \cs{romannumeral}
-% with negative character constant that gobbles one
-% optional space.
-% \begin{macrocode}
-\def\LTXcmds@@ifnextchar{%
- \expandafter\futurelet
- \expandafter\LTXcmds@LetToken
- \expandafter\LTXcmds@ifnextchar
- \romannumeral-`\.%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@SpaceToken}
-% \begin{macrocode}
-\ltx@firstofone{\let\LTXcmds@SpaceToken= } %
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@ifnextchar@nospace}
-% \begin{macrocode}
-\long\def\ltx@ifnextchar@nospace#1#2#3{%
- \begingroup
- \let\LTXcmds@CharToken= #1\relax
- \ltx@LocToksA{\endgroup#2}%
- \ltx@LocToksB{\endgroup#3}%
- \futurelet\LTXcmds@LetToken\LTXcmds@ifnextchar@nospace
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@ifnextchar@nospace}
-% \begin{macrocode}
-\def\LTXcmds@ifnextchar@nospace{%
- \the
- \ifx\LTXcmds@LetToken\LTXcmds@CharToken
- \expandafter\ltx@LocToksA
- \else
- \expandafter\ltx@LocToksB
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \subsection{\cs{ltx@leavevmode}, \cs{ltx@mbox}}
-%
-% \begin{macro}{\ltx@leavevmode}
-% \begin{macrocode}
-\ltx@IfUndefined{quitvmode}{%
- \ltx@IfUndefined{leavevmode}{%
- \ltx@IfUndefined{voidb@x}{%
- \ltx@IfUndefined{newbox}{%
- \def\ltx@leavevmode{%
- \begingroup
- \setbox\ltx@zero=\hbox{}%
- \begingroup
- \setbox\ltx@zero=\hbox{\box\ltx@zero}%
- \endgroup
- \unhbox\ltx@zero
- \endgroup
- }%
- }{%
- \csname newbox\endcsname\LTXcmds@VoidBox
- \ifvoid\LTXcmds@VoidBox
- \else
- \setbox\LTXcmds@VoidBox=\hbox{}%
- \begingroup
- \setbox\LTXcmds@VoidBox=\hbox{\box\LTXcmds@VoidBox}%
- \endgroup
- \fi
- \def\ltx@leavevmode{\unhbox\LTXcmds@VoidBox}%
- }%
- }{%
- \def\ltx@leavevmode{\unhbox\voidb@x}%
- }%
- }{%
- \let\ltx@leavevmode\leavevmode
- }%
-}{%
- \let\ltx@leavevmode\quitvmode
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@mbox}
-% \begin{macrocode}
-\def\ltx@mbox{%
- \ltx@leavevmode
- \hbox
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Help macros}
-%
-% \begin{macro}{\LTXcmds@num}
-% \begin{macrocode}
-\ltx@IfUndefined{numexpr}{%
- \def\LTXcmds@num#1{%
- \expandafter\ltx@firstofone\expandafter{%
- \number#1%
- }%
- }%
-}{%
- \def\LTXcmds@num#1{%
- \expandafter\ltx@firstofone\expandafter{%
- \the\numexpr#1%
- }%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Expandable test for emptiness}
-%
-% \begin{macrocode}
-\ltx@IfUndefined{detokenize}{%
-% \end{macrocode}
-%
-% \subsubsection{Vanilla \hologo{TeX}}
-%
-% \begin{macro}{\ltx@ifempty}
-% The macro is based on \cs{@ifempty} of Robert R. Schneck
-% \cite{ifempty:schneck}
-% and \cs{@ifnull} of Ulrich Diez \cite{ifnull:diez}.
-% There are three cases to consider:
-% \begin{compactenum}
-% \item |#1| is empty,
-% \item |#1| is not empty and the first token
-% is not a begingroup character,
-% \item |#1| starts with a begingroup character (catcode 1).
-% \end{compactenum}
-% \begin{macrocode}
- \def\LTXcmds@temp#1{%
- \long\def\ltx@ifempty##1{%
- \romannumeral0%
- \iffalse{\fi
- \expandafter\ltx@gobble\expandafter{%
- \expandafter{\string##1}%
- \expandafter\ltx@gobble\string
- }%
- \expandafter\ltx@firstofthree\expandafter
- {\iffalse}\fi
- \expandafter#1\ltx@secondoftwo
- }%
- \expandafter#1\ltx@firstoftwo
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\ltx@ifblank}
-% \begin{macrocode}
- \long\def\ltx@ifblank##1{%
- \romannumeral0%
- \iffalse{\fi
- \expandafter\expandafter\expandafter\ltx@gobble
- \expandafter\expandafter\expandafter{%
- \expandafter\expandafter\expandafter{%
- \expandafter\string\ltx@gobble##1.%
- }%
- \expandafter\ltx@gobble\string
- }%
- \expandafter\ltx@firstofthree\expandafter
- {\iffalse}\fi
- \expandafter#1\ltx@secondoftwo
- }%
- \expandafter#1\ltx@firstoftwo
- }%
- }%
- \LTXcmds@temp{ }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-}{%
-% \end{macrocode}
-%
-% \subsubsection{With \cs{detokenize}}
-%
-% Ahmed Musa provided \cs{ifstrempty} using \cs{detokenize}
-% and \cs{pdfstrcmp} \cite{ifstrempty:musa}. Ulrich Diez, GL,
-% Heiko Oberdiek
-% improved it further by removing \cs{pdfstrcmp} and
-% taking three arguments
-% \cite{ifstrempty:diez1,ifstrempty:diez2,ifstrempty:diez3,^^A
-% ifstrempty:gl,ifstrempty:ho}.
-%
-% \begin{macro}{\ltx@ifempty}
-% \begin{macrocode}
- \long\def\ltx@ifempty#1{%
- \romannumeral%
- \csname
- LTXcmds@ifempty%
- \ifcat$\detokenize{#1}$%
- @%
- \fi
- \endcsname
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@ifempty@}
-% \begin{macrocode}
- \long\def\LTXcmds@ifempty@#1#2{0 #1}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@ifempty}
-% \begin{macrocode}
- \long\def\LTXcmds@ifempty#1#2{0 #2}%
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{\cs{ltx@ifblank}}
-%
-% \begin{macro}{\ltx@ifblank}
-% \begin{macrocode}
- \long\def\ltx@ifblank#1{%
- \romannumeral%
- \csname
- LTXcmds@ifempty%
- \ifcat$\detokenize\expandafter{\ltx@gobble#1.}$%
- @%
- \fi
- \endcsname
- }%
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-}
-% \end{macrocode}
-%
-% \subsection{\cs{ltx@zapspace}}
-%
-% \begin{macro}{\ltx@zapspace}
-% \begin{macrocode}
-\long\def\ltx@zapspace#1{%
- \romannumeral
- \LTXcmds@zapspace\ltx@zero#1 \@nil
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\LTXcmds@zapspace}
-% \begin{macrocode}
-\long\def\LTXcmds@zapspace#1 #2\@nil{%
- \ltx@ifempty{#2}{%
- #1%
- }{%
- \LTXcmds@zapspace#1#2\@nil
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{\cs{ltx@IfBoxEmpty}}
-%
-% In case of \hologo{eTeX} the test for an empty box
-% is done via \cs{lastnodetype} as suggested
-% by David Kastrup \cite{ifboxempty:dak}.
-% \begin{macrocode}
-\ltx@IfUndefined{lastnodetype}{%
- \catcode`\$=9 %
- \catcode`\&=14 %
-}{%
- \catcode`\$=14 %
- \catcode`\&=9 %
-}
-% \end{macrocode}
-% \begin{macro}{\ltx@IfBoxEmpty}
-% \begin{macrocode}
-\def\ltx@IfBoxEmpty#1{%
- \ifvoid#1\relax
- \expandafter\ltx@secondoftwo
- \else
-% \end{macrocode}
-% Implementation using \hologo{eTeX}'s \cs{lastnodetype}.
-% \begin{macrocode}
-& \begingroup
-& \setbox\ltx@zero=\ifhbox#1\hbox\else\vbox\fi{%
-& \ifhmode\unhcopy\else\unvcopy\fi#1\relax
-& \expandafter
-& }%
-& \expandafter\endgroup
-& \ifnum\lastnodetype<\ltx@zero
-& \expandafter\expandafter\expandafter\ltx@firstoftwo
-& \else
-& \expandafter\expandafter\expandafter\ltx@secondoftwo
-& \fi
-% \end{macrocode}
-% Implementation without \hologo{eTeX} using a signature
-% at the beginning of the test box.
-% \begin{macrocode}
-$ \begingroup
-$ \setbox\ltx@zero=\ifhbox#1\hbox\else\vbox\fi{%
-$ \penalty\ltx@one
-$ \ifhmode\unhcopy\else\unvcopy\fi#1\relax
-$ \expandafter
-$ }%
-$ \ifnum\lastpenalty=\ltx@one
-% \end{macrocode}
-% Box 0 has been changed and is restored by
-% closing the group.
-% \begin{macrocode}
-$ \endgroup
-$ \begingroup
-$ \setbox\ltx@zero=\ifhbox#1\hbox\else\vbox\fi{%
-$ \penalty\ltx@two
-$ \ifhmode\unhcopy\else\unvcopy\fi#1\relax
-$ \expandafter
-$ }%
-$ \ifnum\lastpenalty=\ltx@two
-$ \def\next{\endgroup\expandafter\ltx@firstoftwo}%
-$ \else
-$ \def\next{\endgroup\expandafter\ltx@secondoftwo}%
-$ \fi
-$ \else
-$ \def\next{\endgroup\expandafter\ltx@secondoftwo}%
-$ \fi
-$ \next
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\ltx@IfBoxVoidOrEmpty}
-% \begin{macrocode}
-\def\ltx@IfBoxVoidOrEmpty#1{%
- \ifvoid#1\relax
- \expandafter\ltx@thirdoffour
- \fi
- \ltx@IfBoxEmpty{#1}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\LTXcmds@AtEnd%
-%</package>
-% \end{macrocode}
-%% \section{Installation}
-%
-% \subsection{Download}
-%
-% \paragraph{Package.} This package is available on
-% CTAN\footnote{\CTANpkg{ltxcmds}}:
-% \begin{description}
-% \item[\CTAN{macros/latex/contrib/ltxcmds/ltxcmds.dtx}] The source file.
-% \item[\CTAN{macros/latex/contrib/ltxcmds/ltxcmds.pdf}] Documentation.
-% \end{description}
-%
-%
-% \paragraph{Bundle.} All the packages of the bundle `ltxcmds'
-% are also available in a TDS compliant ZIP archive. There
-% the packages are already unpacked and the documentation files
-% are generated. The files and directories obey the TDS standard.
-% \begin{description}
-% \item[\CTANinstall{install/macros/latex/contrib/ltxcmds.tds.zip}]
-% \end{description}
-% \emph{TDS} refers to the standard ``A Directory Structure
-% for \TeX\ Files'' (\CTANpkg{tds}). Directories
-% with \xfile{texmf} in their name are usually organized this way.
-%
-% \subsection{Bundle installation}
-%
-% \paragraph{Unpacking.} Unpack the \xfile{ltxcmds.tds.zip} in the
-% TDS tree (also known as \xfile{texmf} tree) of your choice.
-% Example (linux):
-% \begin{quote}
-% |unzip ltxcmds.tds.zip -d ~/texmf|
-% \end{quote}
-%
-% \subsection{Package installation}
-%
-% \paragraph{Unpacking.} The \xfile{.dtx} file is a self-extracting
-% \docstrip\ archive. The files are extracted by running the
-% \xfile{.dtx} through \plainTeX:
-% \begin{quote}
-% \verb|tex ltxcmds.dtx|
-% \end{quote}
-%
-% \paragraph{TDS.} Now the different files must be moved into
-% the different directories in your installation TDS tree
-% (also known as \xfile{texmf} tree):
-% \begin{quote}
-% \def\t{^^A
-% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
-% ltxcmds.sty & tex/generic/ltxcmds/ltxcmds.sty\\
-% ltxcmds.pdf & doc/latex/ltxcmds/ltxcmds.pdf\\
-% ltxcmds.dtx & source/latex/ltxcmds/ltxcmds.dtx\\
-% \end{tabular}^^A
-% }^^A
-% \sbox0{\t}^^A
-% \ifdim\wd0>\linewidth
-% \begingroup
-% \advance\linewidth by\leftmargin
-% \advance\linewidth by\rightmargin
-% \edef\x{\endgroup
-% \def\noexpand\lw{\the\linewidth}^^A
-% }\x
-% \def\lwbox{^^A
-% \leavevmode
-% \hbox to \linewidth{^^A
-% \kern-\leftmargin\relax
-% \hss
-% \usebox0
-% \hss
-% \kern-\rightmargin\relax
-% }^^A
-% }^^A
-% \ifdim\wd0>\lw
-% \sbox0{\small\t}^^A
-% \ifdim\wd0>\linewidth
-% \ifdim\wd0>\lw
-% \sbox0{\footnotesize\t}^^A
-% \ifdim\wd0>\linewidth
-% \ifdim\wd0>\lw
-% \sbox0{\scriptsize\t}^^A
-% \ifdim\wd0>\linewidth
-% \ifdim\wd0>\lw
-% \sbox0{\tiny\t}^^A
-% \ifdim\wd0>\linewidth
-% \lwbox
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \end{quote}
-% If you have a \xfile{docstrip.cfg} that configures and enables \docstrip's
-% TDS installing feature, then some files can already be in the right
-% place, see the documentation of \docstrip.
-%
-% \subsection{Refresh file name databases}
-%
-% If your \TeX~distribution
-% (\TeX\,Live, \mikTeX, \dots) relies on file name databases, you must refresh
-% these. For example, \TeX\,Live\ users run \verb|texhash| or
-% \verb|mktexlsr|.
-%
-% \subsection{Some details for the interested}
-%
-% \paragraph{Unpacking with \LaTeX.}
-% The \xfile{.dtx} chooses its action depending on the format:
-% \begin{description}
-% \item[\plainTeX:] Run \docstrip\ and extract the files.
-% \item[\LaTeX:] Generate the documentation.
-% \end{description}
-% If you insist on using \LaTeX\ for \docstrip\ (really,
-% \docstrip\ does not need \LaTeX), then inform the autodetect routine
-% about your intention:
-% \begin{quote}
-% \verb|latex \let\install=y\input{ltxcmds.dtx}|
-% \end{quote}
-% Do not forget to quote the argument according to the demands
-% of your shell.
-%
-% \paragraph{Generating the documentation.}
-% You can use both the \xfile{.dtx} or the \xfile{.drv} to generate
-% the documentation. The process can be configured by the
-% configuration file \xfile{ltxdoc.cfg}. For instance, put this
-% line into this file, if you want to have A4 as paper format:
-% \begin{quote}
-% \verb|\PassOptionsToClass{a4paper}{article}|
-% \end{quote}
-% An example follows how to generate the
-% documentation with pdf\LaTeX:
-% \begin{quote}
-%\begin{verbatim}
-%pdflatex ltxcmds.dtx
-%makeindex -s gind.ist ltxcmds.idx
-%pdflatex ltxcmds.dtx
-%makeindex -s gind.ist ltxcmds.idx
-%pdflatex ltxcmds.dtx
-%\end{verbatim}
-% \end{quote}
-%
-% \begin{thebibliography}{9}
-% \raggedright
-%
-% \bibitem{ifempty:schneck}
-% Robert R. Schneck:
-% \textit{Re: \cs{ifempty} solution %
-% (was Macro puzzle: maximally general \cs{ifempty})};
-% newsgroup \xnewsgroup{comp.text.tex},
-% \url{news:3eef1ada_6@corp.newsgroups.com},
-% 2003-06-17.\\
-% {\small
-% \url{https://groups.google.com/group/comp.text.tex/msg/be03a159ec374895}}
-%
-% \bibitem{ifnull:diez}
-% Ulrich Diez:
-% \textit{Re: TeX refuses to strip outer braces in argument};
-% newsgroup \xnewsgroup{comp.text.tex},
-% \url{news:ibk3t8$ee7$1@news.albasani.net},
-% 2010-11-12.\\
-% {\small
-% \url{https://groups.google.com/group/comp.text.tex/msg/803bd57221a04996}}
-%
-% \bibitem{ifstrempty:musa}
-% Ahmed Musa:
-% \textit{Re: TeX refuses to strip outer braces in argument};
-% newsgroup \xnewsgroup{comp.text.tex},
-% \url{news:f5496afe-40ed-42bd-b629-a2419ecf7c0d@o14g2000prn.googlegroups.com},
-% 2010-12-03.\\
-% {\small
-% \url{https://groups.google.com/group/comp.text.tex/msg/fbf7d61a0c3a807d}}
-%
-% \bibitem{ifstrempty:diez1}
-% Ulrich Diez:
-% \textit{Re: TeX refuses to strip outer braces in argument};
-% newsgroup \xnewsgroup{comp.text.tex},
-% \url{news:idbo94$uka$1@four.albasani.net},
-% 2010-12-03.\\
-% {\small
-% \url{https://groups.google.com/group/comp.text.tex/msg/0c230ee479487962}}
-%
-% \bibitem{ifstrempty:diez2}
-% Ulrich Diez:
-% \textit{Re: TeX refuses to strip outer braces in argument};
-% newsgroup \xnewsgroup{comp.text.tex},
-% \url{news:idbpu4$cg1$1@news.albasani.net},
-% 2010-12-03.\\
-% {\small
-% \url{https://groups.google.com/group/comp.text.tex/msg/bbef4263390d647b}}
-%
-% \bibitem{ifstrempty:diez3}
-% Ulrich Diez:
-% \textit{Re: TeX refuses to strip outer braces in argument};
-% newsgroup \xnewsgroup{comp.text.tex},
-% \url{news:idd4ga$r83$1@four.albasani.net},
-% 2010-12-04.\\
-% {\small
-% \url{https://groups.google.com/group/comp.text.tex/msg/00dfd1ec103cd272}}
-%
-% \bibitem{ifstrempty:gl}
-% GL:
-% \textit{Re: TeX refuses to strip outer braces in argument};
-% newsgroup \xnewsgroup{comp.text.tex},
-% \url{news:4cfa2e27$0$7389$426a74cc@news.free.fr},
-% 2010-12-04.\\
-% {\small
-% \url{https://groups.google.com/group/comp.text.tex/msg/d3a75995c1cf267e}}
-%
-% \bibitem{ifstrempty:ho}
-% Heiko Oberdiek:
-% \textit{Re: TeX refuses to strip outer braces in argument};
-% newsgroup \xnewsgroup{comp.text.tex},
-% \url{news:iddhq1$3kj$1@news.eternal-september.org},
-% 2010-12-04.\\
-% {\small
-% \url{https://groups.google.com/group/comp.text.tex/msg/5f7a23e3ab70e347}}
-%
-% \bibitem{ifboxempty:dak}
-% David Kastrup:
-% \textit{How to detect if \cs{vbox} is empty};
-% newsgroup \xnewsgroup{comp.text.tex},
-% 2011-02-04.\\
-% {\small
-% \url{https://groups.google.com/group/comp.text.tex/msg/8d3cb89496a4d86d}}
-%
-% \end{thebibliography}
-%
-% \begin{History}
-% \begin{Version}{2009/08/05 v1.0}
-% \item
-% First version.
-% \end{Version}
-% \begin{Version}{2009/12/12 v1.1}
-% \item
-% Short title shortened.
-% \item
-% \cs{ltx@IfUndefined} added.
-% \end{Version}
-% \begin{Version}{2010/01/28 v1.2}
-% \item
-% \cs{ltx@RemovePrefix} and \cs{ltx@StripPrefix} added.
-% \item
-% \cs{ltx@ifclassloaded}, \cs{ltx@ifpackageloaded},
-% \cs{ltx@iffileloaded},
-% \cs{ltx@ifclasslater}, \cs{ltx@ifpackagelater},
-% \cs{ltx@iffilelater},
-% \cs{ltx@clsextension}, \cs{ltx@pkgextension} added.
-% \item
-% \cs{ltx@GlobalAppendToMacro}, \cs{ltx@LocalAppendToMacro} added.
-% \end{Version}
-% \begin{Version}{2010/03/01 v1.3}
-% \item
-% \cs{ltx@newif} added.
-% \item
-% \cs{ltx@ifnextchar} added.
-% \item
-% Numbers \cs{ltx@zero}, \cs{ltx@one}, \cs{ltx@two}, \cs{ltx@cclv} added.
-% \end{Version}
-% \begin{Version}{2010/03/09 v1.4}
-% \item
-% \cs{ltx@pkgextension} and \cs{ltx@clsextension} are hardcoded to
-% avoid trouble with \cs{@onlypreamble}.
-% \end{Version}
-% \begin{Version}{2010/04/08 v1.5}
-% \item
-% \cs{ltx@cartwo}, \cs{ltx@cdrtwo},
-% \cs{ltx@carthree}, \cs{ltx@cdrthree},
-% \cs{ltx@carfour}, \cs{ltx@cdrfour} added.
-% \item
-% \cs{ltx@ReturnAfterFi} and \cs{ltx@ReturnAfterElseFi} fixed.
-% \end{Version}
-% \begin{Version}{2010/04/16 v1.6}
-% \item
-% \cs{ltx@leavevmode}, \cs{ltx@mbox} added.
-% \end{Version}
-% \begin{Version}{2010/04/26 v1.7}
-% \item
-% \cs{ltx@GobbleNum}, \cs{ltx@CdrNum}, \cs{ltx@CarNum} added.
-% \item
-% \cs{ltx@carzero}, \cs{ltx@cdrzero} added.
-% \item
-% \cs{ltx@hashchar} added.
-% \end{Version}
-% \begin{Version}{2010/09/11 v1.8}
-% \item
-% \cs{ltx@leftbracechar}, \cs{ltx@rightbracechar} added.
-% \end{Version}
-% \begin{Version}{2010/10/25 v1.9}
-% \item
-% \cs{ltx@LocalAppendToMacro} and \cs{ltx@GlobalAppendToMacro} are
-% now \cs{long}.
-% \end{Version}
-% \begin{Version}{2010/10/31 v1.10}
-% \item
-% \cs{ltx@newglobalif} added.
-% \end{Version}
-% \begin{Version}{2010/11/12 v1.11}
-% \item
-% \cs{ltx@ifempty} added.
-% \item
-% \cs{ltx@firstofthree}, \cs{ltx@secondofthree}, \cs{ltx@thirdofthree}
-% added.
-% \end{Version}
-% \begin{Version}{2010/12/02 v1.12}
-% \item
-% \cs{ltx@onelevel@sanitize} added.
-% \item
-% \cs{LTXcmds@num} fixed for the case with \cs{numexpr}
-% (bug found by GL).
-% \end{Version}
-% \begin{Version}{2010/12/04 v1.13}
-% \item
-% \cs{ltx@ifblank} added.
-% \item
-% Optimization for \cs{ltx@ifempty}.
-% \end{Version}
-% \begin{Version}{2010/12/07 v1.14}
-% \item
-% \cs{ltx@zapspace} added.
-% \end{Version}
-% \begin{Version}{2010/12/12 v1.15}
-% \item
-% \cs{ltx@minusone} added.
-% \end{Version}
-% \begin{Version}{2011/02/04 v1.16}
-% \item
-% \cs{ltx@IfBoxEmpty} and \cs{ltx@IfBoxVoidOrEmpty} added.
-% \item
-% \cs{ltx@firstoffour}, \dots, \cs{ltx@fourthoffour} added.
-% \end{Version}
-% \begin{Version}{2011/02/05 v1.17}
-% \item
-% \cs{ltx@IfBoxEmpty}: an empty box may have non-zero dimensions.
-% \end{Version}
-% \begin{Version}{2011/03/16 v1.18}
-% \item
-% \cs{ltx@ifclasslater} fixed.
-% \end{Version}
-% \begin{Version}{2011/04/14 v1.19}
-% \item
-% \cs{ltx@ifnextchar}: detection of optional spaces modified.
-% \item
-% \cs{ltx(Loc,Glob)(Toks,Dimen,Skip)(A,B,C,D,E)} added.
-% \end{Version}
-% \begin{Version}{2011/04/18 v1.20}
-% \item
-% \cs{ltx@ifnextchar} with conditional support (thanks GL for
-% bug report).
-% \end{Version}
-% \begin{Version}{2011/08/22 v1.21}
-% \item
-% \cs{ltx@GlobalPrependToMacro}, \cs{ltx@LocalPrependToMacro} added
-% (feature request of Martin M\"unch).
-% \end{Version}
-% \begin{Version}{2011/11/09 v1.22}
-% \item
-% \cs{ltx@carsecond}, \cs{ltx@carthird}, \cs{ltx@carfourth},
-% \cs{ltx@CarNumth} added.
-% \item
-% \cs{ltx@cdrzero}, \cs{ltx@cdr}, \cs{ltx@cdrtwo}, cs{ltx@cdrthree},
-% \cs{ltx@cdrfour}, \cs{ltx@CdrNum} modified to retain braces and spaces.
-% They are expandable in two expansion steps.
-% \end{Version}
-% \begin{Version}{2016/05/16 v1.23}
-% \item
-% Documentation updates.
-% \end{Version}
-% \begin{Version}{2019/12/15 v1.24}
-% \item
-% Documentation updates.
-% \end{Version}
-% \end{History}
-%
-% \PrintIndex
-%
-% \Finale
-\endinput
diff --git a/Master/texmf-dist/source/latex/marathi/marathi.dtx b/Master/texmf-dist/source/latex/marathi/marathi.dtx
new file mode 100644
index 00000000000..dace360ba1b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/marathi/marathi.dtx
@@ -0,0 +1,1140 @@
+% \iffalse meta-comment
+%
+% File: marathi.dtx
+% ---------------------------------------------------------------------------
+% आज्ञासंच: marathi
+% लेखक: निरंजन
+% माहिती: लुआलाटेक् व झीलाटेक् ह्यांच्यासह मराठीचा सुलभ वापर करण्यासाठी.
+% संग्राहिका: https://gitlab.com/niranjanvikastambe/marathi
+% अडचणी: https://gitlab.com/niranjanvikastambe/marathi/-/issues
+% परवाना: आलोक नित्यमुक्त परवाना. आवृत्ती १.० किंवा त्यापुढील तसेच
+% ग्नू पब्लिक परवाना आवृत्ती ३.०+
+% ---------------------------------------------------------------------------
+% हे काम आलोक नित्यमुक्त परवाना तसेच ग्नू पब्लिक परवान्याच्या अटींचे पालन करून वितरित केले जाऊ
+% शकते तसेच सुधारले जाऊ शकते.
+%
+% ह्या परवान्यांची नवीनतम आवृत्ती पुढील दुव्यांवर पाहता येऊ शकते.
+%
+% https://gitlab.com/aalok/nityamukta-parwana
+% https://www.gnu.org/licenses/gpl-3.0.txt
+%
+% ह्या आज्ञासंचाची लाटेक् प्रकल्पाच्या नियमांनुसार देखरेख केली जात आहे.
+%
+% ह्या आज्ञासंचाचा लेखक व पालक निरंजन आहे.
+%
+% ह्या कामात marathi.dtx, marathi.ins तसेच त्यांपासून निर्माण केलेली
+% marathi.sty ही धारिका समाविष्ट आहे.
+% ---------------------------------------------------------------------------
+%
+% \fi
+% \iffalse
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+आज्ञासंच: marathi
+लेखक: निरंजन
+आवृत्ती: १.६.१ (१५ जानेवारी, २०२१)
+माहिती: लुआलाटेक् व झीलाटेक् ह्यांच्यासह मराठीचा
+ सुलभ वापर करण्यासाठी. इथून पुढे लाटेक्-वरील मराठीच्या
+ स्थानिकीकरणाचे काम ह्या आज्ञासंचामार्फत केले जाईल.
+ तूर्त expex व blindtext ह्या आज्ञासंचांचे स्थानिकीकरण
+ ह्या आज्ञासंचामार्फत पुरवले आहे.
+संग्राहिका: https://gitlab.com/niranjanvikastambe/marathi
+अडचणी: https://gitlab.com/niranjanvikastambe/marathi/-/issues
+परवाना: आलोक नित्यमुक्त परवाना. आवृत्ती १.० किंवा त्यापुढील.
+ दुवा - https://gitlab.com/aalok/nityamukta-parwana
+ आणि
+ ग्नू पब्लिक परवाना. आवृत्ती ३.० किंवा त्यापुढील
+ दुवा - https://www.gnu.org/licenses/gpl-3.0.txt
+--------------------------------------------------------------------------
+काही सूचना -
+पुढील धारिका texmf-dist/tex/latex/marathi ह्या पत्त्यावर उतरवून घ्या.
+१) namuna-article.tex
+२) namuna-book.tex
+३) namuna-report.tex
+४) namuna-beamer.tex
+५) namuna-letter.tex
+६) namuna-report.tex
+--------------------------------------------------------------------------
+Package: marathi
+Author: Niranjan
+Version: 1.6.1 (15 January, 2021)
+Description: For conveniently typesetting Marathi
+ language with LuaLaTeX and XeLaTeX. This package
+ will now onwards host localizations needed for Marathi
+ language. Currently the package localizes package
+ blindtext and package expex.
+Repository: https://gitlab.com/niranjanvikastambe/marathi
+Bug tracker: https://gitlab.com/niranjanvikastambe/marathi/-/issues
+License: `आलोक' copyleft license v1.0 or later.
+ Link - https://gitlab.com/aalok/nityamukta-parwana
+ and
+ GPL v3.0+
+ Link - https://www.gnu.org/licenses/gpl-3.0.txt
+--------------------------------------------------------------------------
+Installation instructions -
+Copy the following files in the following path texmf-dist/tex/latex/marathi
+1) namuna-article.tex
+2) namuna-book.tex
+3) namuna-report.tex
+4) namuna-beamer.tex
+5) namuna-letter.tex
+6) namuna-report.tex
+%</readme>
+%<*internal>
+\fi
+%</internal>
+%<*driver>
+\documentclass[10pt]{l3doc}
+\usepackage{fontspec}
+\usepackage{xcolor}
+\definecolor{गिटलॅब}{HTML}{fc6d26}
+\usepackage{hyperref}
+\hypersetup{
+ unicode,
+ pdfauthor={निरंजन},
+ pdftitle={मराठी (आवृत्ती १.६.१, जानेवारी २०२१)},
+ pdfsubject={लुआलाटेक् व झीलाटेक्-सह मराठीत अक्षरजुळणी.},
+ pdfkeywords={मराठी, लुआलाटेक्, झीलाटेक्, बेबल, पॉलिग्लॉसिया},
+ pdfproducer={हायपर्रेफ्-सह लुआलाटेक्},
+ pdfcreator={हायपर्रेफ्-सह लुआलाटेक्},
+ colorlinks,
+ linkcolor={red!50!black},
+ citecolor={blue!50!black},
+ urlcolor={blue!80!black}
+}
+\usepackage{devanagaridigits}
+\usepackage{capt-of}
+\renewcommand{\tablename}{कोष्टक}
+\renewcommand{\arraystretch}{1.2}
+\usepackage{standalone}
+\makeatletter
+\RequirePackage{devanagaridigits}
+\def\@arabic#1{\expandafter\devanagaridigits\expandafter{\number#1}}
+\makeatother
+\renewcommand{\theCodelineNo}{{\scriptsize\arabic{CodelineNo}}\quad}
+\setmainfont[
+Renderer=Harfbuzz,
+Script=Devanagari
+]{Shobhika}
+\setmonofont[
+Renderer=Harfbuzz,
+Script=Devanagari
+]{Mukta}
+\usepackage{fontawesome5}
+\renewcommand{\glossaryname}{संज्ञासूची}
+\renewcommand{\abstractname}{सारांश}
+\renewcommand{\contentsname}{अनुक्रमणिका}
+\renewcommand{\baselinestretch}{1.5}
+\newcommand{\होय}{%
+ \textcolor{green!70!black}{\faIcon{thumbs-up}}
+}%
+\newcommand{\नाही}{%
+ \textcolor{red!70!black}{\faIcon{thumbs-down}}
+}%
+\usepackage[sort=use]{glossaries}
+\makenoidxglossaries
+\input{glossaries.gls}
+\begin{document}
+\DocInput{marathi.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+%
+% \title{मराठी}
+% \author{निरंजन}
+% \date^^A
+% {^^A
+% आवृत्ती १.६.१ \textemdash\ १५ जानेवारी, २०२१\\[1ex]^^A
+% {\small\textcolor{गिटलॅब}{\faIcon{gitlab}}\quad\url{https://gitlab.com/niranjanvikastambe/marathi}}^^A
+% }^^A
+%
+% \maketitle
+%
+% \begin{abstract}
+% युनिकोडाचा वापर करून मराठीत \gls{अक्षरजुळणी}\footnote{ह्या दस्तऐवजात
+% लाटेक्-मध्ये प्रचलित असणाऱ्या अनेक इंग्रजी संज्ञांसाठी पर्यायी मराठी
+% संज्ञा वापरण्यात आल्या आहेत, हे सर्व प्रयोग तुलनेने नवे असल्याने ह्याच
+% दस्तऐवजात शेवटी दिलेल्या संज्ञासूचीत सर्व संज्ञांचे इंग्रजी अर्थ दिले
+% आहेत.} शक्य आहे, परंतु सुलभ नाही. लाटेक्-सह मराठीत अक्षरजुळणी करताना आपली
+% \gls{बीजधारिका} अनेक आज्ञांनी भरून जाते. हा \gls{आज्ञासंच} अशा सर्व
+% उपयुक्त \gls{आज्ञा} आधीच लिहून ठेवतो. त्यामुळे नव्या वापरकर्त्यांना त्या
+% नव्याने शिकाव्या लागत नाहीत. शिवाय \pkg{blindtext} ह्या आज्ञासंचाप्रमाणे
+% मराठीकरिता नमुना मजकूर उत्पन्न करण्यासाठीची सोय ह्या आज्ञासंचात करण्यात
+% आली आहे.
+% \end{abstract}
+%
+% \tableofcontents
+% \clearpage
+% \hspace{0pt}
+% \vfill
+% \section*{परवाना}
+% {%
+% \setlength{\parindent}{0pt}
+% © २०२१ निरंजन.
+%
+% ह्या सामग्रीच्या वितरणाचे व प्रतिमुद्रणाचे अधिकार आलोक नित्यमुक्त परवान्यासह मुक्त करण्यात येत
+% आहेत. ह्या सामग्रीची यथामूल अथवा परिवर्तित प्रतिमुद्रणे व्यावसायिक अथवा अव्यावसायिक
+% स्वरूपात वितरित करण्यास प्रतिमुद्राधिकारधारक संमती देत आहे, परंतु असे करताना वितरकाने
+% प्रतिमुद्राधिकारांचा योग्य श्रेयनिर्देश करणे व सामग्री परिवर्तित असल्यास ती ह्याच अटींसह
+% वितरित करणे बंधनकारक आहे. ही सामग्री जशी आहे तशी पुरवण्यात येत आहे, पुरवणारा/पुरवणारी
+% हिच्याबाबत कोणतीही हमी देत नाही. ह्या (व ह्यावर आधारित) सामग्रीचे अमुक्त वितरण
+% बेकायदेशीर मानले जाईल. आलोक नित्यमुक्त परवान्याचा संपूर्ण मसुदा पुढील दुव्यावर वाचता
+% येईल.
+%
+% \url{https://gitlab.com/aalok/nityamukta-parwana}
+%
+% \rule{\linewidth}{0.5mm}
+%
+% \fontfamily{lmr}\selectfont
+% Copyright © 2021 Niranjan.
+%
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.3
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% A copy of the license is included in the section entitled ``GNU
+% Free Documentation License''.
+%
+% \url{https://www.gnu.org/licenses/fdl}
+% }%
+%
+% \vfill
+% \begin{documentation}
+% \section{प्रस्तावना}
+% \subsection*{देवनागरी दिसण्यासाठी टाकावयाच्या आज्ञा}
+% लाटेक्-मध्ये मराठीचा वापर करताना सर्वात महत्त्वाची गरज म्हणजे देवनागरी
+% लिपी नीट दिसणे. लाटेक् विकसित झाले तेव्हा युनिकोड ही प्रणाली अस्तित्वात
+% नसल्याने टेक्, लाटेक् ह्यांसारख्या चालकांसह युनिकोड अक्षरे वापरता येत
+% नाहीत, परंतु लवकरच युनिकोड अक्षरांचा वापर लाटेक्-मध्ये करता यावा ह्याकरिता
+% झीलाटेक् तसेच लुआलाटेक् ह्या नव्या चालकांचा विकास
+% झाला. \pkg{fontspec} ह्या आज्ञासंचासह एखादा युनिकोड-आधारित \gls{टंक}
+% वापरणे व युनिकोड-मजकूर थेट झीलाटेक् अथवा लुआलाटेक्-सोबत चालवणे हे ह्या
+% नव्या चालकांचे प्रमुख उद्दिष्ट होते, परंतु हे काम अतिशय गुंतागुंतीचे होते.
+% २०२० चे \gls{टेक्-वितरण} येईपर्यंत व त्यात हर्फ़बझ नावाची नवी \gls{आज्ञावली}
+% येेईपर्यंत लुआलाटेक् देवनागरी हाताळू शकलेच नाही. झीलाटेक्-सह
+% मात्र देवनागरी व्यवस्थित दिसणे शक्य होत होते. देवनागरी योग्य तऱ्हेने दिसण्यासाठी काही
+% आज्ञांचा वापर करणे अनिवार्य आहे. सध्याच्या व्यवस्थेनुसार जोडाक्षरे तुटक दिसतात
+% (उदा. नमस्‌कार). त्यासाठी \verb|\setmainfont| ह्या आज्ञेस
+% \verb|Script=Devanagari| असे \gls{प्राचल} द्यावे लागते. लाटेक्-तर्फे आपोआप पुरवले
+% जाणारे आकडे (उदा. पृष्ठक्रमांक, तळटिपांचे क्रमांक) देवनागरीत येत नाहीत. त्याकरिता
+% ह्याच आज्ञेस \verb|Mapping=devanagarinumerals| असे आणखी एक प्राचल द्यावे लागते,
+% परंतु हे प्राचल केवळ झीलाटेक्-सह काम करते. शिवाय लाटेक्-ला इंग्रजीव्यतिरिक्त इतर
+% कोणतीही भाषा कळत नसल्यामुळे पूर्वस्थित इंग्रजी शब्दांची भाषांतरे पुरवणारे बेबल अथवा
+% पॉलिग्लॉसिया ह्यांसारखे आज्ञासंच वापरून भाषा निवडावी लागते. रोहित होळकरांच्या
+% \href{https://ctan.org/pkg/latex-mr?lang=en}{\pkg{latex-mr}} ह्या पुस्तिकेत
+% ह्या सर्व अडचणींची गोष्टींची तपशीलवार चर्चा झाली आहे.
+%
+% सद्यपरिस्थितीत लाटेक्-चे किमान ज्ञान असलेल्या नव्या वापरकर्त्याला मराठी लिहिण्यासाठी
+% एवढा सगळा प्रपंच करायला लावणे म्हणजे ज्या फांदीवर आपण बसलो आहोत तीच तोडण्यासारखे
+% आहे. त्यामुळे कोणत्याही वापरकर्त्याला केवळ लाटेक्-च्या किमान ज्ञानासह
+% \verb|\usepackage{marathi}| एवढी एक आज्ञा लिहून उत्तम देवनागरी अक्षरजुळणी करता
+% यावी हा ह्या आज्ञासंचाचा उद्देश आहे. ह्या आज्ञासंचात पुढील आज्ञांचा समावेश आहे.
+%
+% \begin{function}{\परिच्छेद}
+% ही आज्ञा केवळ एक नमुना परिच्छेद निर्माण करते. ही आज्ञा एकामागोमाग एक अनेकदा
+% टाकल्याने तितके परिच्छेद निर्माण केले जाऊ शकतात.
+% \end{function}
+%
+% \begin{function}{\नमुना}
+% नमुना ही आज्ञा सर्वप्रथम वापरला गेलेला \gls{लाटेक्-वर्ग} पाहते व त्यानुसार त्या
+% वर्गाच्या किमान क्षमता दर्शवणारी एक \gls{फलित-धारिका} निर्माण करते. उदाहरणादाखल
+% \verb|article, book, report, beamer| व \verb|letter| ह्या लाटेक्-वर्गांसह
+% \verb|\नमुना| ही आज्ञा चालवून पाहा. एकाच बीजधारिकेत केवळ लाटेक्-वर्ग बदलत असाल,
+% तर लाटेक्-ने तयार केलेल्या \gls{साहाय्यक धारिका} काही वेळा अनपेक्षित \gls{अडचण}
+% दाखवतात. जुनी माहिती शिल्लक असल्याने त्या दिल्या जातात. घाबरून न जाता, बीजधारिका
+% दोनदा चालवावी. सर्व अडचणी सुटतात.
+% \end{function}
+%
+% \begin{function}{\टंक}
+% \begin{syntax}
+% \cs{टंक} \marg{टंकाचे नाव}
+% \end{syntax}
+% ह्या आज्ञासंचात शोभिका हा \gls{मूलटंक} म्हणून निवडून ठेवला आहे. तो बदलायचा असेल तर
+% \verb|\टंक| ह्या आज्ञेची सोय करण्यात आली आहे. ह्या आज्ञेसह देवनागरी टंकांसाठी आवश्यक
+% असणारी \verb|Renderer=Harfbuzz, Script=Devanagari| (लुआलाटेक्),
+% \verb|Script=Devanagari, Mapping=devanagarinumerals| (झीलाटेक्) ही प्राचले
+% आपोआप लिहून ठेवली आहेत. शिवाय \verb|\setmainfont|{\meta{टंकाचे नाव}} ही आज्ञा
+% नेहमीप्रमाणे चालतेच. टंकाचे नाव हा ह्या आज्ञेचा \gls{कार्यघटक} आहे.
+% \end{function}
+%
+% \begin{function}{\दुसराटंक}
+% \begin{syntax}
+% \cs{दुसराटंक}\marg{टंकासाठीची आज्ञा}\marg{टंकाचे नाव}
+% \end{syntax}
+% दस्तऐवजात मूलटंकाखेरीज आणखी एखादा टंक वापरण्याची गरजदेखील पडू शकते. त्याकरिता
+% \verb|\दुसराटंक| ही आज्ञा पुढीलप्रमाणे वापरावी.
+% \begin{verbatim}
+% \documentclass{article}
+% \usepackage{marathi}
+% \दुसराटंक{\नवाटंक}{Mukta}
+%
+% \begin{document}
+% नमस्कार, हा मजकूर शोभिका टंकात छापला गेला आहे, परंतु {\नवाटंक हा मजकूर मुक्त टंकात छापला गेला आहे.}
+% \end{document}
+% \end{verbatim}
+% \end{function}
+%
+% \begin{function}{अंतर}
+% हे प्राचल वापरल्यास आज्ञासंचातर्फे दोन ओळींमधील अंतरात कोणताही हस्तक्षेप केला जात
+% नाही. अधिक माहितीसाठी \ref{अंतर} वाचा. ह्या प्राचलाला किंमतदेखील देता
+% येते. उदा. \verb|\usepackage[अंतर=2]{marathi}| अशा प्रकारे आज्ञासंच वापरल्यास
+% ओळींमधले अंतर दुप्पट होते. कोणत्याही प्राचलाशिवाय वापरल्यास आज्ञासंचातर्फे मूलभूत
+% अंतराच्या दीडपट अंतर पुरवले जाते. पुढील कोष्टकाने अंतर ह्या प्राचलाचा वापर अधिक स्पष्ट
+% होईल.\label{प्राचल}
+%
+% \begin{center}
+% \begin{tabular}{ll}
+% \hline
+% आज्ञासंचा वापर & ओळींमधले अंतर\\
+% \hline
+% \verb|\usepackage{marathi}| & मूळ अंतराच्या दीडपट\\
+% \verb|\usepackage[अंतर]{marathi}| & मूळ अंतरात कोणताही फरक नाही.\\
+% \verb|\usepackage[अंतर=2]{marathi}| & मूळ अंतराच्या दुप्पट\\
+% \end{tabular}
+% \captionof{table}{अंतर}
+% \end{center}
+% \end{function}
+% \begin{function}{\अंतरबदल}
+% \begin{syntax}
+% \cs{अंतरबदल}\marg{किंमत}
+% \end{syntax}
+% दस्तऐवजात कुठेही अंतर बदलावयाचे असल्यास ह्या आज्ञेने ते बदलता येते. ह्या आज्ञेला एक
+% कार्यघटक आहे. त्यात ओळींमधले मूळ अंतर जितक्या पटींनी बदलायचे आहे ती किंमत
+% टाकावी. पुढील उदाहरण पाहा.
+% \begin{verbatim}
+% \documentclass{article}
+% \usepackage{marathi}
+%
+% \begin{document}
+% \परिच्छेद
+% \अंतरबदल{5}
+% \परिच्छेद
+% \end{document}
+% \end{verbatim}
+% \end{function}
+% \end{documentation}
+% \begin{implementation}
+% \section{आज्ञासंचाची घडण}
+% आता आपण आज्ञासंचाची घडण व त्यातील आज्ञांचा उपयोग लक्षात घेऊयात.
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+% \begin{macrocode}
+\ProvidesPackage{marathi}[2021-01-15 v1.6 झीलाटेक् व लुआलाटेक्-सह मराठीचा सुलभ वापर]
+\NeedsTeXFormat{LaTeX2e}
+% \end{macrocode}
+% ह्या आज्ञांसह आज्ञासंचाची पायाभूत माहिती पुरवली. डेव्हिड कार्लआयल ह्यांनी गिट
+% प्रकल्पावर नोंदवलेल्या
+% \href{https://gitlab.com/niranjanvikastambe/marathi/-/issues/1}{ह्या}
+% तक्रारीमुळे आज्ञासंचाची संक्षिप्त माहिती पुरवण्याची पद्धत मला वापरता आली.
+%
+% \subsection{अडचण दाखवणे}
+% ह्या आज्ञासंचाच्या गिट प्रकल्पावर नोंदवलेल्या
+% \href{https://gitlab.com/niranjanvikastambe/marathi/-/issues/4}{तक्रारीचा}
+% विचार करून झी-लाटेक् अथवा लुआलाटेक् ह्या चालकांव्यतिरिक्त एखादा चालक वापरला गेल्यास
+% वापरकर्त्यास चालक बदलण्याची सूचना दिली जावी ह्याकरिता पुढील आज्ञावली लिहिण्यात
+% आली आहे.
+% \begin{macrocode}
+\RequirePackage{iftex}
+\iftutex
+\else
+\PackageError{marathi}{%
+ चालक बदला | Unsupported engine
+}%
+{%
+ लुआलाटेक् अथवा झीलाटेक् वापरा.\MessageBreak
+ Only LuaLaTeX or XeLaTeX supported.
+}%
+\expandafter\endinput
+\fi
+% \end{macrocode}
+
+% \subsection{अंतर}\label{अंतर}
+% इंग्रजीमधली g, j, y अशी अक्षरे सोडली तर ह्याहून जास्त खोल असणारा मजकूर त्या लिपीत
+% आढळत नाही. देवनागरीचे तसे नाही. क ह्या अक्षराहून क्क थोडे अधिक खोल. ट्ट त्याहून थोडे
+% अधिक व ट्टू त्याहून. अशा असमान उंचीच्या अक्षरांमुळे लाटेक् आपोआप दोन ओळींमधले अंतर बदलते
+% व त्यामुळे ओळींची उंची असमान दिसू लागते. साध्या मजकुरातील ओळींप्रमाणेच कोष्टकेदेखील कुरूप
+% दिसू लागतात. ह्यावर तोडगा काय? ह्याची दोन उत्तरे आहेत. पहिले उत्तर मराठीच्या
+% आजवरच्या छपाईच्या इतिहासाचा अभ्यास करून, मराठी लिहिताना दोन ओळींमध्ये सोडले गेलेले
+% सरासरी अंतर किती ह्याचे संशोधन करणे व त्यानुसार सर्व ठिकाणी ते अंतर लागू करणे. हा
+% मार्ग सहज नाही. त्याकरिता टंकाच्या आकाराचे व त्यानुसार बदलणाऱ्या ओळींच्या अंतराचे
+% प्रमाण काळजीपूर्वक अभ्यासावे लागेल. हे सर्व करणे जरी इष्ट व आवश्यक असले, तरी हे संशोधन
+% पूर्ण होईस्तोवर सामान्य वापरकर्त्याला असमान उंचीच्या ओळींचा जो त्रास सहन करावा
+% लागतो, तो कसा टाळावा? त्यासाठी तात्पुरता तोडगा काढावा लागतो. तो असा की
+% ओळींमधले अंतर दस्तऐवजाच्या सुरुवातीलाच (अंदाजे) वाढवून ठेवायचे.
+%
+% आमच्या काही सहकाऱ्यांच्या मते हा निर्णय अतिशय उग्र आहे. त्यामुळे दस्तऐवजातील इतर काही
+% ठिकाणच्या अंतरांवर सूक्ष्म परिणाम घडतात, जे टाळणे अधिक इष्ट. त्यांच्या ह्या मताचा
+% विचार करून ह्या आज्ञासंचाकरिता \textbf{अंतर} नावाचे प्राचल विकसित केले आहे. त्याचा
+% वापर कसा केला जावा ही माहिती आपण \ref{प्राचल} मध्ये वाचलीच आहे. हे प्राचल
+% वापरल्यास आज्ञासंचातर्फे ओळींमधल्या अंतरात कोणताही हस्तक्षेप केला जात नाही. ह्या
+% गुंतागुंतीच्या रचनेकरिता पुढील आज्ञा समाविष्ट केल्या आहेत. ह्या आज्ञांसाठी जोनाथन स्प्राट
+% व जूल वोऊ ह्यांच्या टॉप-आन्सर्सवरील उत्तरांची मदत झाली.
+% \begin{macrocode}
+\RequirePackage{setspace}
+\RequirePackage{pgfkeys}
+\def\बदल#1{\pgfqkeys{/marathi}{#1}}
+\newcommand*\मराठीअंतर{1.5}
+\pgfkeys
+{%
+ marathi/.is family, marathi/.cd,
+ अंतर/.store in=\मराठीअंतर,
+ अंतर/.default=1
+}%
+\AtBeginDocument
+{%
+ \@ifclassloaded{memoir}
+ {%
+ \setSingleSpace{\मराठीअंतर}\SingleSpacing
+ \pgfkeys{marathi/अंतर/.code=\setSingleSpace{#1}\SingleSpacing}
+ }%
+ {%
+ \setstretch{\मराठीअंतर}
+ \pgfkeys{marathi/अंतर/.code=\setstretch{#1}}
+ }%
+}%
+\DeclareOption*{\expandafter\बदल\expandafter{\CurrentOption}}
+\providecommand{\अंतरबदल}[1]{\बदल{अंतर=#1}}
+\ProcessOptions\relax
+\def\arraystretch{1.2}
+% \end{macrocode}
+% \subsection{भाषा व टंक}
+% लाटेक्-ला भाषा पुरवणारे \pkg{babel} व \pkg{polyglossia} हे दोन आज्ञासंच
+% आहेत. \pkg{babel} आज्ञासंच लुआलाटेक् व झीलाटेक्-सह चांगले फलित देतो, त्यामुळे ह्या
+% आज्ञासंचाला मूलभूत भाषांतरे पुरवणारा आज्ञासंच मानून \pkg{polyglossia} हा आज्ञासंच
+% वैकल्पिक ठेवला आहे. \pkg{polyglossia} आज्ञासंच केवळ झीलाटेक्-सह योग्य फलित
+% देतो. डेव्हिड कार्लआयल ह्यांनी नोंदवलेल्या
+% \href{https://gitlab.com/niranjanvikastambe/marathi/-/issues/2}{ह्या}
+% तक्रारीमुळे भाषांतरे पुरवणारा आज्ञासंच निवडण्यात खूप मदत झाली. शोभिका हा उत्कृष्ट
+% देवनागरी टंक टेक्-वितरणासह येत असल्याने त्याची निवड मूलटंक म्हणून करण्यात आली
+% आहे. \verb|\टंक| ह्या आज्ञेसह मूलटंक बदलता येतो. \verb|\दुसराटंक| ह्या आज्ञेसह अधिकचे
+% टंक निवडता येतात.
+%
+% \begin{macrocode}
+\RequirePackage{fontspec}
+\ifluatex
+\setmainfont[%
+Script=Devanagari,%
+Renderer=Harfbuzz%
+]{Shobhika}
+\providecommand{\टंक}[1]{%
+ \setmainfont[%
+ Script=Devanagari,%
+ Renderer=Harfbuzz%
+ ]{#1}%
+}%
+\providecommand{\दुसराटंक}[2]{%
+ \newfontfamily{#1}[%
+ Renderer=Harfbuzz,%
+ Script=Devanagari%
+ ]{#2}%
+}%
+\else
+\setmainfont[%
+Script=Devanagari,%
+Mapping=devanagarinumerals%
+]{Shobhika}%
+\providecommand{\टंक}[1]{%
+ \setmainfont[%
+ Script=Devanagari,%
+ Mapping=devanagarinumerals%
+ ]{#1}%
+}%
+\providecommand{\दुसराटंक}[2]{%
+ \newfontfamily{#1}[%
+ Script=Devanagari,%
+ Mapping=devanagarinumerals%
+ ]{#2}%
+}%
+\fi
+\@ifpackageloaded{polyglossia}{%
+ \setdefaultlanguage{marathi}%
+ \ifluatex
+ \setmainfont[%
+ Script=Devanagari,%
+ Renderer=Harfbuzz%
+ ]{Shobhika}%
+ \else
+ \setmainfont[%
+ Script=Devanagari,%
+ Mapping=devanagarinumerals%
+ ]{Shobhika}%
+ \fi
+}%
+{%
+ \usepackage{babel}%
+ \babelprovide[import, main, maparabic, mapdigits,
+ counters/स्वर = अ आ इ ई उ ऊ ए ऐ ओ औ अं अः ॲ ऋ ऌ ऑ,
+ alph=स्वर,
+ counters/anka = एक दोन तीन चार पाच सहा सात आठ नऊ दहा अकरा बारा
+ तेरा चौदा पंधरा सोळा सतरा अठरा एकोणीस वीस एकवीस बावीस तेवीस
+ चोवीस पंचवीस सव्वीस सत्तावीस अठ्ठावीस एकोणतीस तीस एकतीस बत्तीस
+ तेहतीस चौतीस पस्तीस छत्तीस सदतीस अडतीस एकोणचाळीस चाळीस
+ एकेचाळीस बेचाळीस त्रेचाळीस चव्वेचाळीस पंचेचाळीस शेहेचाळीस सत्तेचाळीस
+ अठ्ठेचाळीस एकोणपन्नास पन्नास एकावन्न बावन्न त्रेपन्न चौपन्न पंचावन्न छप्पन्न
+ सत्तावन्न अठ्ठावन्न एकोणसाठ साठ एकसष्ट बासष्ट त्रेसष्ट चौसष्ट पासष्ट सहासष्ट
+ सदुष्ट अडुसष्ट एकोणसत्तर सत्तर एकाहत्तर बाहत्तर त्र्याहत्तर चौऱ्याहत्तर पंचाहत्तर
+ शाहत्तर सत्त्याहत्तर अठ्ठ्याहत्तर एकोणऐंशी ऐंशी एक्याऐंशी ब्याऐंशी त्र्याऐंशी
+ चौऱ्याऐंशी पंच्याऐंशी श्याऐंशी सत्त्याऐंशी अठ्ठ्याऐंशी एकोणनव्वद नव्वद एक्याण्णव
+ ब्याण्णव त्र्याण्णव चौऱ्याण्णव पंचाण्णव शहाण्णव सत्त्याण्णव अठ्याण्णव नव्याण्णव शंभर,
+ counters/व्यंजन = क ख ग घ ङ
+ च छ ज झ ञ
+ ट ठ ड ढ ण
+ त थ द ध न
+ प फ ब भ म
+ य र ल व श ष स ह ळ,
+ Alph=व्यंजन
+ ]{marathi}
+ \renewcommand\thepart{\localecounter{स्वर}{part}}%
+ \renewcommand\theenumiii{\localecounter{व्यंजन}{enumiii}}%
+}%
+% \end{macrocode}
+% ह्या आज्ञांमुळे धारिका लुआलाटेक् अथवा झीलाटेक् ह्यांपैकी कोणत्याही चालकासह चालवता
+% येते. \pkg{polyglossia} हा आज्ञासंच शक्यतो वापरू नये व वापरल्यास केवळ झीलाटेक् हाच
+% चालक वापरावा असा सल्ला मी देईन. कारण सध्या चालक व आज्ञासंचांची क्षमता पाहता पुढील
+% गोष्टी मराठी आज्ञासंचासह पुरवल्या जातात.
+
+% \begin{center}
+% \begin{tabular}{|c|ccc|}
+% \hline
+% चालक & अचूक अक्षरे & अचूक भाषांतरे & देवनागरी अंक \\
+% \hline
+% \pkg{babel} + झीलाटेक् & \होय & \होय & \होय \\
+% \pkg{babel} + लुआलाटेक् & \होय & \होय & \होय \\
+% \pkg{polyglossia} + झीलाटेक् & \होय & \होय & \होय \\
+% \pkg{polyglossia} + लुआलाटेक् & \होय & \होय & \नाही \\
+% \hline
+% \end{tabular}
+% \captionof{table}{चालक व आज्ञासंचांची तुलना}
+% \end{center}
+% \subsubsection{गणित}
+% लाटेक्-मधील \gls{गणित-क्षेत्र} हे केवळ इंग्रजी अक्षरांची अक्षरजुळणी करू शकते, त्यात देवनागरी
+% अक्षरे व अंक ह्यांचा समावेश करण्याकरिता काही आज्ञांचा समावेश करणे आवश्यक
+% ठरते. \url{https://tex.stackexchange.com/a/535738/174620} ह्या उत्तरातील
+% आज्ञावलीचा वापर करून, त्यात देवनागरी युनिकोड क्रमांकांचा समावेश केल्यामुळे आता लाटेक्-च्या
+% गणित-क्षेत्रात देवनागरी आकडे व अक्षरे समाविष्ट करण्यात आली आहेत.
+% \begin{macrocode}
+\DeclareSymbolFont{devletters}{\encodingdefault}{Shobhika(0)}{}{}
+\ExplSyntaxOn
+\int_step_inline:nnn { "0900 } { "097F }
+{
+ \Umathcode #1 = "0 ~ \use:c{ symdevletters } ~ #1
+}
+\ExplSyntaxOff
+% \end{macrocode}
+% \subsection{नमुना मजकूर}
+% \subsubsection{परिच्छेद}
+% परिच्छेद ही आज्ञा दस्तऐवजात कुठेही वापरली तरी एक लहानसा परिच्छेद आपोआप छापला
+% जातो. त्याकरिता एक मजकूर धारिका आज्ञासंचासोबत येते. ती आज्ञासंचात पुढील आज्ञांनी
+% समाविष्ट करून घेतली आहे.
+% \begin{macrocode}
+\providecommand{\परिच्छेद}{
+ \input{namuna-para}
+}
+% \end{macrocode}
+% \subsubsection{दस्तऐवज}
+% मागे म्हटल्याप्रमाणे नमुना मजकूर तयार करण्यासाठी ह्या आज्ञासंचाचा वापर करता येतो, परंतु
+% त्याकरिता लाटेक्-ला थोडी माहिती पुरवावी लागते. उदा. दस्तऐवजाचा/ची लेखक/लेखिका,
+% दस्तऐवजाचं शीर्षक इत्यादी. ही माहिती पुरवण्याचे विशिष्ट स्थान आहे. लाटेक्-मध्ये मूळ
+% दस्तऐवज सुरू होण्यापूर्वी ही माहिती पुरविण्याकरिता \gls{आज्ञापीठ} असते, तिथे ही
+% माहिती पुरवली जाते, परंतु ह्यामुळे फलित-धारिकेच्या \gls{पायाभूत माहिती}त ती नावे दिसू
+% लागतात. ह्यासाठी आज्ञासंचात ही माहिती पुरवली गेली नाही आहे, ह्याउलट सोबत जोडलेल्या
+% वेगवेगळ्या दस्तऐवजांमध्ये ती माहिती पुरवली गेली आहे. त्या धारिका केवळ नमुना मजकूर
+% पुरवण्यासाठी आहेत. निरनिराळ्या लाटेक्-वर्गांसाठी संबंधित धारिका निवडणे व दस्तऐवजात
+% लिहिलेला लाटेक्-वर्ग कोणता आहे हे पाहून त्यानुसार नमुना मजकूर छापणे ह्यासाठीच्या आज्ञा
+% पुढीलप्रमाणे.
+% \begin{macrocode}
+\newcounter{क्र}
+\@ifclassloaded{article}{%
+ \setcounter{क्र}{1}%
+}{}%
+\@ifclassloaded{book}{%
+ \setcounter{क्र}{2}%
+}{}%
+\@ifclassloaded{report}{%
+ \setcounter{क्र}{3}%
+}{}%
+\@ifclassloaded{beamer}{%
+ \setcounter{क्र}{4}%
+}{}%
+\@ifclassloaded{letter}{%
+ \setcounter{क्र}{5}%
+}{}%
+\providecommand{\नमुना}{%
+ \ifnum\value{क्र}=1\input{namuna-article}\else
+ \ifnum\value{क्र}=2\input{namuna-book}\else
+ \ifnum\value{क्र}=3\input{namuna-report}\else
+ \ifnum\value{क्र}=4\input{namuna-beamer}\else
+ \input{namuna-letter}\relax\fi\fi\fi\fi
+}%
+% \end{macrocode}
+% \verb|beamer| लाटेक्-वर्ग वापरताना \verb|serif| ही टंकछटा निवडावी लागते,
+% त्याशिवाय देवनागरी लिपी दिसत नाही. त्यासाठीची आज्ञा पुढीलप्रमाणे.
+% \begin{macrocode}
+\@ifclassloaded{beamer}{%
+ \usefonttheme{serif}%
+}{}%
+% \end{macrocode}
+% \verb|expex| आज्ञासंचाचे स्थानिकीकरणदेखील पुढील आज्ञांमध्ये समाविष्ट आहे.
+% \begin{macrocode}
+\@ifpackageloaded{expex}{%
+ \definelabeltype{devanagari}%
+ {%
+ labelgen=list,%
+ labellist={अ,आ,इ,ई,उ,ऊ,ए,ऐ,ओ,औ,अं,अः},%
+ labelformat=A.,%
+ fullrefformat=XA,%
+ labelalign=left,%
+ labelwidth=1.5em%
+ }%
+ \lingset{labeltype=devanagari}%
+}{}%
+% \end{macrocode}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+% \end{implementation}
+% \pagebreak
+% {%
+% \fontfamily{lmr}\selectfont
+% \phantomsection
+% \addcontentsline{toc}{section}{GNU Free Documentation License}
+% \section*{\centering GNU Free Documentation License}
+% \begin{center}
+%
+% Version 1.3, 3 November 2008
+%
+%
+% Copyright \copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+%
+% \bigskip
+%
+% \texttt{<https://fsf.org/>}
+%
+% \bigskip
+%
+% Everyone is permitted to copy and distribute verbatim copies
+% of this license document, but changing it is not allowed.
+% \end{center}
+%
+%
+% \begin{center}
+% {\bf\large Preamble}
+% \end{center}
+%
+% The purpose of this License is to make a manual, textbook, or other
+% functional and useful document ``free'' in the sense of freedom: to
+% assure everyone the effective freedom to copy and redistribute it,
+% with or without modifying it, either commercially or noncommercially.
+% Secondarily, this License preserves for the author and publisher a way
+% to get credit for their work, while not being considered responsible
+% for modifications made by others.
+%
+% This License is a kind of ``copyleft'', which means that derivative
+% works of the document must themselves be free in the same sense. It
+% complements the GNU General Public License, which is a copyleft
+% license designed for free software.
+%
+% We have designed this License in order to use it for manuals for free
+% software, because free software needs free documentation: a free
+% program should come with manuals providing the same freedoms that the
+% software does. But this License is not limited to software manuals;
+% it can be used for any textual work, regardless of subject matter or
+% whether it is published as a printed book. We recommend this License
+% principally for works whose purpose is instruction or reference.
+%
+%
+% \begin{center}
+% {\Large\bf 1. APPLICABILITY AND DEFINITIONS\par}
+% \end{center}
+%
+% This License applies to any manual or other work, in any medium, that
+% contains a notice placed by the copyright holder saying it can be
+% distributed under the terms of this License. Such a notice grants a
+% world-wide, royalty-free license, unlimited in duration, to use that
+% work under the conditions stated herein. The ``\textbf{Document}'', below,
+% refers to any such manual or work. Any member of the public is a
+% licensee, and is addressed as ``\textbf{you}''. You accept the license if you
+% copy, modify or distribute the work in a way requiring permission
+% under copyright law.
+%
+% A ``\textbf{Modified Version}'' of the Document means any work containing the
+% Document or a portion of it, either copied verbatim, or with
+% modifications and/or translated into another language.
+%
+% A ``\textbf{Secondary Section}'' is a named appendix or a front-matter section of
+% the Document that deals exclusively with the relationship of the
+% publishers or authors of the Document to the Document's overall subject
+% (or to related matters) and contains nothing that could fall directly
+% within that overall subject. (Thus, if the Document is in part a
+% textbook of mathematics, a Secondary Section may not explain any
+% mathematics.) The relationship could be a matter of historical
+% connection with the subject or with related matters, or of legal,
+% commercial, philosophical, ethical or political position regarding
+% them.
+%
+% The ``\textbf{Invariant Sections}'' are certain Secondary Sections whose titles
+% are designated, as being those of Invariant Sections, in the notice
+% that says that the Document is released under this License. If a
+% section does not fit the above definition of Secondary then it is not
+% allowed to be designated as Invariant. The Document may contain zero
+% Invariant Sections. If the Document does not identify any Invariant
+% Sections then there are none.
+%
+% The ``\textbf{Cover Texts}'' are certain short passages of text that are listed,
+% as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+% the Document is released under this License. A Front-Cover Text may
+% be at most 5 words, and a Back-Cover Text may be at most 25 words.
+%
+% A ``\textbf{Transparent}'' copy of the Document means a machine-readable copy,
+% represented in a format whose specification is available to the
+% general public, that is suitable for revising the document
+% straightforwardly with generic text editors or (for images composed of
+% pixels) generic paint programs or (for drawings) some widely available
+% drawing editor, and that is suitable for input to text formatters or
+% for automatic translation to a variety of formats suitable for input
+% to text formatters. A copy made in an otherwise Transparent file
+% format whose markup, or absence of markup, has been arranged to thwart
+% or discourage subsequent modification by readers is not Transparent.
+% An image format is not Transparent if used for any substantial amount
+% of text. A copy that is not ``Transparent'' is called ``\textbf{Opaque}''.
+%
+% Examples of suitable formats for Transparent copies include plain
+% ASCII without markup, Texinfo input format, LaTeX input format, SGML
+% or XML using a publicly available DTD, and standard-conforming simple
+% HTML, PostScript or PDF designed for human modification. Examples of
+% transparent image formats include PNG, XCF and JPG. Opaque formats
+% include proprietary formats that can be read and edited only by
+% proprietary word processors, SGML or XML for which the DTD and/or
+% processing tools are not generally available, and the
+% machine-generated HTML, PostScript or PDF produced by some word
+% processors for output purposes only.
+%
+% The ``\textbf{Title Page}'' means, for a printed book, the title page itself,
+% plus such following pages as are needed to hold, legibly, the material
+% this License requires to appear in the title page. For works in
+% formats which do not have any title page as such, ``Title Page'' means
+% the text near the most prominent appearance of the work's title,
+% preceding the beginning of the body of the text.
+%
+% The ``\textbf{publisher}'' means any person or entity that distributes
+% copies of the Document to the public.
+%
+% A section ``\textbf{Entitled XYZ}'' means a named subunit of the Document whose
+% title either is precisely XYZ or contains XYZ in parentheses following
+% text that translates XYZ in another language. (Here XYZ stands for a
+% specific section name mentioned below, such as ``\textbf{Acknowledgements}'',
+% ``\textbf{Dedications}'', ``\textbf{Endorsements}'', or ``\textbf{History}''.)
+% To ``\textbf{Preserve the Title}''
+% of such a section when you modify the Document means that it remains a
+% section ``Entitled XYZ'' according to this definition.
+%
+% The Document may include Warranty Disclaimers next to the notice which
+% states that this License applies to the Document. These Warranty
+% Disclaimers are considered to be included by reference in this
+% License, but only as regards disclaiming warranties: any other
+% implication that these Warranty Disclaimers may have is void and has
+% no effect on the meaning of this License.
+%
+%
+% \begin{center}
+% {\Large\bf 2. VERBATIM COPYING\par}
+% \end{center}
+%
+% You may copy and distribute the Document in any medium, either
+% commercially or noncommercially, provided that this License, the
+% copyright notices, and the license notice saying this License applies
+% to the Document are reproduced in all copies, and that you add no other
+% conditions whatsoever to those of this License. You may not use
+% technical measures to obstruct or control the reading or further
+% copying of the copies you make or distribute. However, you may accept
+% compensation in exchange for copies. If you distribute a large enough
+% number of copies you must also follow the conditions in section~3.
+%
+% You may also lend copies, under the same conditions stated above, and
+% you may publicly display copies.
+%
+%
+% \begin{center}
+% {\Large\bf 3. COPYING IN QUANTITY\par}
+% \end{center}
+%
+%
+% If you publish printed copies (or copies in media that commonly have
+% printed covers) of the Document, numbering more than 100, and the
+% Document's license notice requires Cover Texts, you must enclose the
+% copies in covers that carry, clearly and legibly, all these Cover
+% Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+% the back cover. Both covers must also clearly and legibly identify
+% you as the publisher of these copies. The front cover must present
+% the full title with all words of the title equally prominent and
+% visible. You may add other material on the covers in addition.
+% Copying with changes limited to the covers, as long as they preserve
+% the title of the Document and satisfy these conditions, can be treated
+% as verbatim copying in other respects.
+%
+% If the required texts for either cover are too voluminous to fit
+% legibly, you should put the first ones listed (as many as fit
+% reasonably) on the actual cover, and continue the rest onto adjacent
+% pages.
+%
+% If you publish or distribute Opaque copies of the Document numbering
+% more than 100, you must either include a machine-readable Transparent
+% copy along with each Opaque copy, or state in or with each Opaque copy
+% a computer-network location from which the general network-using
+% public has access to download using public-standard network protocols
+% a complete Transparent copy of the Document, free of added material.
+% If you use the latter option, you must take reasonably prudent steps,
+% when you begin distribution of Opaque copies in quantity, to ensure
+% that this Transparent copy will remain thus accessible at the stated
+% location until at least one year after the last time you distribute an
+% Opaque copy (directly or through your agents or retailers) of that
+% edition to the public.
+%
+% It is requested, but not required, that you contact the authors of the
+% Document well before redistributing any large number of copies, to give
+% them a chance to provide you with an updated version of the Document.
+%
+%
+% \begin{center}
+% {\Large\bf 4. MODIFICATIONS\par}
+% \end{center}
+%
+% You may copy and distribute a Modified Version of the Document under
+% the conditions of sections 2 and 3 above, provided that you release
+% the Modified Version under precisely this License, with the Modified
+% Version filling the role of the Document, thus licensing distribution
+% and modification of the Modified Version to whoever possesses a copy
+% of it. In addition, you must do these things in the Modified Version:
+%
+% \begin{itemize}
+% \item[A.]
+% Use in the Title Page (and on the covers, if any) a title distinct
+% from that of the Document, and from those of previous versions
+% (which should, if there were any, be listed in the History section
+% of the Document). You may use the same title as a previous version
+% if the original publisher of that version gives permission.
+%
+% \item[B.]
+% List on the Title Page, as authors, one or more persons or entities
+% responsible for authorship of the modifications in the Modified
+% Version, together with at least five of the principal authors of the
+% Document (all of its principal authors, if it has fewer than five),
+% unless they release you from this requirement.
+%
+% \item[C.]
+% State on the Title page the name of the publisher of the
+% Modified Version, as the publisher.
+%
+% \item[D.]
+% Preserve all the copyright notices of the Document.
+%
+% \item[E.]
+% Add an appropriate copyright notice for your modifications
+% adjacent to the other copyright notices.
+%
+% \item[F.]
+% Include, immediately after the copyright notices, a license notice
+% giving the public permission to use the Modified Version under the
+% terms of this License, in the form shown in the Addendum below.
+%
+% \item[G.]
+% Preserve in that license notice the full lists of Invariant Sections
+% and required Cover Texts given in the Document's license notice.
+%
+% \item[H.]
+% Include an unaltered copy of this License.
+%
+% \item[I.]
+% Preserve the section Entitled ``History'', Preserve its Title, and add
+% to it an item stating at least the title, year, new authors, and
+% publisher of the Modified Version as given on the Title Page. If
+% there is no section Entitled ``History'' in the Document, create one
+% stating the title, year, authors, and publisher of the Document as
+% given on its Title Page, then add an item describing the Modified
+% Version as stated in the previous sentence.
+%
+% \item[J.]
+% Preserve the network location, if any, given in the Document for
+% public access to a Transparent copy of the Document, and likewise
+% the network locations given in the Document for previous versions
+% it was based on. These may be placed in the ``History'' section.
+% You may omit a network location for a work that was published at
+% least four years before the Document itself, or if the original
+% publisher of the version it refers to gives permission.
+%
+% \item[K.]
+% For any section Entitled ``Acknowledgements'' or ``Dedications'',
+% Preserve the Title of the section, and preserve in the section all
+% the substance and tone of each of the contributor acknowledgements
+% and/or dedications given therein.
+%
+% \item[L.]
+% Preserve all the Invariant Sections of the Document,
+% unaltered in their text and in their titles. Section numbers
+% or the equivalent are not considered part of the section titles.
+%
+% \item[M.]
+% Delete any section Entitled ``Endorsements''. Such a section
+% may not be included in the Modified Version.
+%
+% \item[N.]
+% Do not retitle any existing section to be Entitled ``Endorsements''
+% or to conflict in title with any Invariant Section.
+%
+% \item[O.]
+% Preserve any Warranty Disclaimers.
+% \end{itemize}
+%
+% If the Modified Version includes new front-matter sections or
+% appendices that qualify as Secondary Sections and contain no material
+% copied from the Document, you may at your option designate some or all
+% of these sections as invariant. To do this, add their titles to the
+% list of Invariant Sections in the Modified Version's license notice.
+% These titles must be distinct from any other section titles.
+%
+% You may add a section Entitled ``Endorsements'', provided it contains
+% nothing but endorsements of your Modified Version by various
+% parties---for example, statements of peer review or that the text has
+% been approved by an organization as the authoritative definition of a
+% standard.
+%
+% You may add a passage of up to five words as a Front-Cover Text, and a
+% passage of up to 25 words as a Back-Cover Text, to the end of the list
+% of Cover Texts in the Modified Version. Only one passage of
+% Front-Cover Text and one of Back-Cover Text may be added by (or
+% through arrangements made by) any one entity. If the Document already
+% includes a cover text for the same cover, previously added by you or
+% by arrangement made by the same entity you are acting on behalf of,
+% you may not add another; but you may replace the old one, on explicit
+% permission from the previous publisher that added the old one.
+%
+% The author(s) and publisher(s) of the Document do not by this License
+% give permission to use their names for publicity for or to assert or
+% imply endorsement of any Modified Version.
+%
+%
+% \begin{center}
+% {\Large\bf 5. COMBINING DOCUMENTS\par}
+% \end{center}
+%
+%
+% You may combine the Document with other documents released under this
+% License, under the terms defined in section~4 above for modified
+% versions, provided that you include in the combination all of the
+% Invariant Sections of all of the original documents, unmodified, and
+% list them all as Invariant Sections of your combined work in its
+% license notice, and that you preserve all their Warranty Disclaimers.
+%
+% The combined work need only contain one copy of this License, and
+% multiple identical Invariant Sections may be replaced with a single
+% copy. If there are multiple Invariant Sections with the same name but
+% different contents, make the title of each such section unique by
+% adding at the end of it, in parentheses, the name of the original
+% author or publisher of that section if known, or else a unique number.
+% Make the same adjustment to the section titles in the list of
+% Invariant Sections in the license notice of the combined work.
+%
+% In the combination, you must combine any sections Entitled ``History''
+% in the various original documents, forming one section Entitled
+% ``History''; likewise combine any sections Entitled ``Acknowledgements'',
+% and any sections Entitled ``Dedications''. You must delete all sections
+% Entitled ``Endorsements''.
+%
+% \begin{center}
+% {\Large\bf 6. COLLECTIONS OF DOCUMENTS\par}
+% \end{center}
+%
+% You may make a collection consisting of the Document and other documents
+% released under this License, and replace the individual copies of this
+% License in the various documents with a single copy that is included in
+% the collection, provided that you follow the rules of this License for
+% verbatim copying of each of the documents in all other respects.
+%
+% You may extract a single document from such a collection, and distribute
+% it individually under this License, provided you insert a copy of this
+% License into the extracted document, and follow this License in all
+% other respects regarding verbatim copying of that document.
+%
+%
+% \begin{center}
+% {\Large\bf 7. AGGREGATION WITH INDEPENDENT WORKS\par}
+% \end{center}
+%
+%
+% A compilation of the Document or its derivatives with other separate
+% and independent documents or works, in or on a volume of a storage or
+% distribution medium, is called an ``aggregate'' if the copyright
+% resulting from the compilation is not used to limit the legal rights
+% of the compilation's users beyond what the individual works permit.
+% When the Document is included in an aggregate, this License does not
+% apply to the other works in the aggregate which are not themselves
+% derivative works of the Document.
+%
+% If the Cover Text requirement of section~3 is applicable to these
+% copies of the Document, then if the Document is less than one half of
+% the entire aggregate, the Document's Cover Texts may be placed on
+% covers that bracket the Document within the aggregate, or the
+% electronic equivalent of covers if the Document is in electronic form.
+% Otherwise they must appear on printed covers that bracket the whole
+% aggregate.
+%
+%
+% \begin{center}
+% {\Large\bf 8. TRANSLATION\par}
+% \end{center}
+%
+%
+% Translation is considered a kind of modification, so you may
+% distribute translations of the Document under the terms of section~4.
+% Replacing Invariant Sections with translations requires special
+% permission from their copyright holders, but you may include
+% translations of some or all Invariant Sections in addition to the
+% original versions of these Invariant Sections. You may include a
+% translation of this License, and all the license notices in the
+% Document, and any Warranty Disclaimers, provided that you also include
+% the original English version of this License and the original versions
+% of those notices and disclaimers. In case of a disagreement between
+% the translation and the original version of this License or a notice
+% or disclaimer, the original version will prevail.
+%
+% If a section in the Document is Entitled ``Acknowledgements'',
+% ``Dedications'', or ``History'', the requirement (section~4) to Preserve
+% its Title (section~1) will typically require changing the actual
+% title.
+%
+%
+% \begin{center}
+% {\Large\bf 9. TERMINATION\par}
+% \end{center}
+%
+%
+% You may not copy, modify, sublicense, or distribute the Document
+% except as expressly provided under this License. Any attempt
+% otherwise to copy, modify, sublicense, or distribute it is void, and
+% will automatically terminate your rights under this License.
+%
+% However, if you cease all violation of this License, then your license
+% from a particular copyright holder is reinstated (a) provisionally,
+% unless and until the copyright holder explicitly and finally
+% terminates your license, and (b) permanently, if the copyright holder
+% fails to notify you of the violation by some reasonable means prior to
+% 60 days after the cessation.
+%
+% Moreover, your license from a particular copyright holder is
+% reinstated permanently if the copyright holder notifies you of the
+% violation by some reasonable means, this is the first time you have
+% received notice of violation of this License (for any work) from that
+% copyright holder, and you cure the violation prior to 30 days after
+% your receipt of the notice.
+%
+% Termination of your rights under this section does not terminate the
+% licenses of parties who have received copies or rights from you under
+% this License. If your rights have been terminated and not permanently
+% reinstated, receipt of a copy of some or all of the same material does
+% not give you any rights to use it.
+%
+%
+% \begin{center}
+% {\Large\bf 10. FUTURE REVISIONS OF THIS LICENSE\par}
+% \end{center}
+%
+%
+% The Free Software Foundation may publish new, revised versions
+% of the GNU Free Documentation License from time to time. Such new
+% versions will be similar in spirit to the present version, but may
+% differ in detail to address new problems or concerns. See
+% \texttt{https://www.gnu.org/licenses/}.
+%
+% Each version of the License is given a distinguishing version number.
+% If the Document specifies that a particular numbered version of this
+% License ``or any later version'' applies to it, you have the option of
+% following the terms and conditions either of that specified version or
+% of any later version that has been published (not as a draft) by the
+% Free Software Foundation. If the Document does not specify a version
+% number of this License, you may choose any version ever published (not
+% as a draft) by the Free Software Foundation. If the Document
+% specifies that a proxy can decide which future versions of this
+% License can be used, that proxy's public statement of acceptance of a
+% version permanently authorizes you to choose that version for the
+% Document.
+%
+%
+% \begin{center}
+% {\Large\bf 11. RELICENSING\par}
+% \end{center}
+%
+%
+% ``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+% World Wide Web server that publishes copyrightable works and also
+% provides prominent facilities for anybody to edit those works. A
+% public wiki that anybody can edit is an example of such a server. A
+% ``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+% site means any set of copyrightable works thus published on the MMC
+% site.
+%
+% ``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+% license published by Creative Commons Corporation, a not-for-profit
+% corporation with a principal place of business in San Francisco,
+% California, as well as future copyleft versions of that license
+% published by that same organization.
+%
+% ``Incorporate'' means to publish or republish a Document, in whole or
+% in part, as part of another Document.
+%
+% An MMC is ``eligible for relicensing'' if it is licensed under this
+% License, and if all works that were first published under this License
+% somewhere other than this MMC, and subsequently incorporated in whole
+% or in part into the MMC, (1) had no cover texts or invariant sections,
+% and (2) were thus incorporated prior to November 1, 2008.
+%
+% The operator of an MMC Site may republish an MMC contained in the site
+% under CC-BY-SA on the same site at any time before August 1, 2009,
+% provided the MMC is eligible for relicensing.
+%
+%
+% \begin{center}
+% {\Large\bf ADDENDUM: How to use this License for your documents\par}
+% \end{center}
+%
+% To use this License in a document you have written, include a copy of
+% the License in the document and put the following copyright and
+% license notices just after the title page:
+%
+% \bigskip
+% \begin{quote}
+% Copyright \copyright{} YEAR YOUR NAME.
+% Permission is granted to copy, distribute and/or modify this document
+% under the terms of the GNU Free Documentation License, Version 1.3
+% or any later version published by the Free Software Foundation;
+% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+% A copy of the license is included in the section entitled ``GNU
+% Free Documentation License''.
+% \end{quote}
+% \bigskip
+%
+% If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+% replace the ``with \dots\ Texts.''\ line with this:
+%
+% \bigskip
+% \begin{quote}
+% with the Invariant Sections being LIST THEIR TITLES, with the
+% Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+% \end{quote}
+% \bigskip
+%
+% If you have Invariant Sections without Cover Texts, or some other
+% combination of the three, merge those two alternatives to suit the
+% situation.
+%
+% If your document contains nontrivial examples of program code, we
+% recommend releasing these examples in parallel under your choice of
+% free software license, such as the GNU General Public License,
+% to permit their use in free software.
+% }%
+% \pagebreak
+% \printnoidxglossaries \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/marathi/marathi.ins b/Master/texmf-dist/source/latex/marathi/marathi.ins
new file mode 100644
index 00000000000..c19cb84ce0d
--- /dev/null
+++ b/Master/texmf-dist/source/latex/marathi/marathi.ins
@@ -0,0 +1,76 @@
+% File: marathi.ins
+\input l3docstrip.tex
+
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+--------------------------------------------------------------------------
+लाटेक् आज्ञासंच मराठी आवृत्ती १.६.१
+© २०२१ निरंजन
+
+ह्या सामग्रीच्या वितरणाचे व प्रतिमुद्रणाचे अधिकार आलोक नित्यमुक्त परवान्यासह मुक्त करण्यात येत
+आहेत. ह्या सामग्रीची यथामूल अथवा परिवर्तित प्रतिमुद्रणे व्यावसायिक अथवा अव्यावसायिक
+स्वरूपात वितरित करण्यास प्रतिमुद्राधिकारधारक संमती देत आहे, परंतु असे करताना वितरकाने
+प्रतिमुद्राधिकारांचा योग्य श्रेयनिर्देश करणे व सामग्री परिवर्तित असल्यास ती ह्याच अटींसह
+वितरित करणे बंधनकारक आहे. ही सामग्री जशी आहे तशी पुरवण्यात येत आहे, पुरवणारा/पुरवणारी
+हिच्याबाबत कोणतीही हमी देत नाही. ह्या (व ह्यावर आधारित) सामग्रीचे अमुक्त वितरण
+बेकायदेशीर मानले जाईल. आलोक नित्यमुक्त परवान्याचा संपूर्ण मसुदा पुढील दुव्यावर वाचता
+येईल.
+
+https://gitlab.com/aalok/nityamukta-parwana
+--------------------------------------------------------------------------
+LaTeX Package marathi v1.6.1
+© 2021 Niranjan
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <https://www.gnu.org/licenses/>.
+--------------------------------------------------------------------------
+आज्ञासंच: marathi
+लेखक: निरंजन
+माहिती: लुआलाटेक् व झीलाटेक् ह्यांच्यासह मराठीचा सुलभ वापर करण्यासाठी.
+दुवा: https://gitlab.com/niranjanvikastambe/marathi
+अडचणी: https://gitlab.com/niranjanvikastambe/marathi/-/issues
+परवाना: आलोक नित्यमुक्त परवाना. आवृत्ती १.०+
+ दुवा : https://gitlab.com/aalok/nityamukta-parwana
+ आणि
+ ग्नू पब्लिक परवाना. आवृत्ती ३.०+
+ दुवा : https://www.gnu.org/licenses/gpl
+--------------------------------------------------------------------------
+हे काम आलोक नित्यमुक्त परवान्याच्या अटींचे पालन करून वितरित केले जाऊ शकते
+तसेच सुधारले जाऊ शकते.
+
+ह्या परवान्याची नवीनतम आवृत्ती पुढील दुव्यावर पाहता येऊ शकते.
+
+https://gitlab.com/aalok/nityamukta-parwana
+
+ह्या आज्ञासंचाची लाटेक् प्रकल्पाच्या नियमांनुसार देखरेख केली जात आहे.
+
+ह्या आज्ञासंचाचा लेखक व पालक निरंजन आहे.
+
+ह्या कामात marathi.dtx, marathi.ins तसेच त्यांपासून निर्माण केलेली
+marathi.sty ही धारिका समाविष्ट आहे.
+\endpreamble
+
+\usedir{tex/latex/\jobname}
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+
+\nopreamble\nopostamble
+\usedir{doc/latex/\jobname}
+\generate{
+ \file{README.txt}{\from{\jobname.dtx}{readme}}
+}
+
+\endbatchfile \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/marginfix/marginfix.dtx b/Master/texmf-dist/source/latex/marginfix/marginfix.dtx
index 1e7b43ea06b..914f95b96db 100644
--- a/Master/texmf-dist/source/latex/marginfix/marginfix.dtx
+++ b/Master/texmf-dist/source/latex/marginfix/marginfix.dtx
@@ -12,10 +12,10 @@
%
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{marginfix}%
- [2013/09/08 v1.1 Fix Margin Paragraphs]
+ [2020/05/06 v1.2 Fix Margin Paragraphs]
%<*driver>
\documentclass{ltxdoc}
-\CheckSum{1197}
+\CheckSum{1159}
%\OnlyDescription % (un)comment this line to show (hide) source code
\RecordChanges
\EnableCrossrefs
@@ -70,6 +70,9 @@
% {(SDH) Globally calculate margin phantoms over 4 passes.}
% \changes{v1.1}{2013/09/08}
% {(SDH) Add \cs{topskip} to notes at the top of the margin.}
+% \changes{v1.2}{2020/05/06}
+% {(SDH) Fix long-standing bug where margin notes called out in
+% the last few points of a page were being entirely dropped.}
%
% \GetFileInfo{marginfix.dtx}
% \title{\Lopt{marginfix} package documentation}
@@ -225,8 +228,7 @@
% \begin{macros}{\MFX@debug}
% We have some optionally-included code for debugging. \cs{MFX@debug}
% prints a new line followed by ``|MFX: |'' and then the message.
-% The newline can be suppressed with a |*|. We'll also ask for more
-% error context in the debug mode.
+% We'll also ask for more error context in the debug mode.
% \begin{macrocode}
%<*debug>
\def\MFX@debug{\message{^^JMFX:}\message}
@@ -234,8 +236,6 @@
\def\MFX@mac#1{\expandafter\MFX@@mac\meaning#1>>>}
\def\MFX@@mac#1->{<<<}
\def\MFX@htdp#1{\ht#1=\the\ht#1, \dp#1=\the\dp#1}
-\showboxbreadth=100
-\showboxdepth=10
%</debug>
% \end{macrocode}
% \end{macros}
@@ -511,11 +511,11 @@
% \end{macrocode}
% \end{macros}
%
-% \begin{macros}{\MFX@cons,\MFX@snoc,\MFX@run@clear}
+% \begin{macros}{\MFX@cons,\MFX@snoc}
% In passing we'll define the cons macro, which fully-expands
% its second argument, but makes sure to only expand the first
% one once, so that any fragile control sequences in it are
-% corectly protected. We also define snoc, which prepends.
+% correctly protected. We also define snoc, which prepends.
% Note that we could put the \cs{temp@} definition into a group
% if it was really gonna matter\ldots
% \begin{macrocode}
@@ -533,6 +533,9 @@
\expandafter\expandafter\expandafter{\expandafter\temp@#1}%
}
% \end{macrocode}
+% \end{macros}
+%
+% \begin{macros}{\MFX@run@clear}
% Finally, \cs{MFX@run@clear} is a quick trick to expand the
% contents of a macro and then clear it (to \cs{@empty}) before
% any of its tokens are consumed.
@@ -602,7 +605,7 @@
% \end{macros}
%
% \section{Shipout-time patches}
-% \begin{macros}{\@combinefloats,\MFX@combinefloats@before}
+% \begin{macros}{\@combinefloats}
% We need to patch in somewhere before \cs{@combinefloats} at the latest,
% so that any heights calculated from \cs{@pageht} are correct---otherwise
% the top figures will confuse us. So we'll start by simply adding our
@@ -611,7 +614,9 @@
\expandafter\def\expandafter\@combinefloats\expandafter{\expandafter
\MFX@combinefloats@before\@combinefloats}
% \end{macrocode}
-%
+% \end{macros}
+%
+% \begin{macros}{\MFX@combinefloats@before}
% \cs{MFX@combinefloats@before} is then responsible for picking the
% needed notes from \cs{mfx@marginlist}, building them into a box, and
% attaching that box onto the correct side of \cs{@outputbox}. We also
@@ -636,25 +641,11 @@
\def\MFX@attachmargin{%
%<debug>\MFX@debug{attachmargin}%
% \end{macrocode}
-% First, we need to make sure that the boxes we're combining are the
-% same size.
+% We start by moving the reference point of \cs{Mfx@marginbox} to the top.
% \begin{macrocode}
%<debug>\MFX@debug{attachmargin: \MFX@htdp\@outputbox, \MFX@htdp\Mfx@marginbox}%
- %<debug>\showbox\@outputbox
- %<debug>\showbox\Mfx@marginbox
\setbox\Mfx@marginbox\vtop{%
\vskip\z@\unvbox\Mfx@marginbox}%
- %% \ifdim\ht\@outputbox<\ht\Mfx@marginbox
- %% \setbox\Mfx@marginbox\vbox to \ht\@outputbox{%
- %% \unvbox\Mfx@marginbox
- %% \vskip\z@ shrink 1filll\relax
- %% }%
- %% \else
- %% \setbox\Mfx@marginbox\vbox to \ht\@outputbox{%
- %% \unvbox\Mfx@marginbox
- %% \vfill
- %% }%
- %% \fi
% \end{macrocode}
% Next we need to figure out which side of \cs{@outputbox} to attach
% the \cs{Mfx@marginbox} on. We now use \cs{columnwidth} instead of
@@ -665,10 +656,10 @@
% might have unintended consequences w.r.t. any glue being retained that
% should have been swallowed. This will require further investigation.
% \begin{macrocode}
- \setbox\@outputbox\vbox{% to \ht\@outputbox{%
+ \setbox\@outputbox\vbox{%
\begingroup
- \setbox\@tempboxa\vbox{% to \ht\@outputbox{%
- \hbox{% to \wd\@outputbox{%
+ \setbox\@tempboxa\vbox{%
+ \hbox{%
\if\MFX@leftmargin
\llap{\box\Mfx@marginbox\hskip\marginparsep}%
\else
@@ -683,7 +674,6 @@
\unskip
\unvbox\@outputbox
}%
- %<debug>\showbox\@outputbox
}
% \end{macrocode}
% \end{macros}
@@ -704,7 +694,7 @@
% line up the notes with their callouts). This procedure happens in
% four passes. But first, we initialize \cs{Mfx@marginheight} to
% \cs{@colroom}, which is the height of the page minus any floats that
-% have been added to the top of bottom (these floats may extend into the
+% have been added to the top or bottom (these floats may extend into the
% margins: in the future we may look into detecting this and using the
% whole page, with overwide floats blocked off as phantoms). We add
% \cs{@colroom} rather than assigning it because any global or per-page
@@ -794,12 +784,10 @@
% \end{macrocode}
% \end{macros}
%
-% \begin{macros}{\MFX@margin@note@down,\MFX@margin@skip@down,
-% \MFX@margin@clear@down}
% We now define the various |\MFX@margin@...@down| macros.
% At this stage in the game, the only difference between notes
% and skips is that we ignore skips before any notes by setting
-% \cs{mfx@build@note} initially to \cs{@gobble}. Once we've
+% \cs{mfx@build@skip} initially to \cs{@gobble}. Once we've
% seen the first note, skips are treated exactly the same: as
% fixed-height material. If there is room in the current piece
% for the given height, then we prepend it to \cs{mfx@marginout},
@@ -808,6 +796,7 @@
% \cs{mfx@pieceheights} and try again, until \cs{mfx@pieceheights}
% is empty and we simply defer everything to later pages.
%
+% \begin{macros}{\MFX@margin@note@down}
% Upon seeing a note, we must do several things:
% \begin{enumerate}
% \item determine which box (left or right) is needed for the
@@ -836,7 +825,9 @@
\fi
}
% \end{macrocode}
+% \end{macros}
%
+% \begin{macros}{\MFX@margin@skip@down}
% Skips are similar. A skip needs only to save itself back into
% \cs{mfx@marginout}, provided it fits. If not, there is no need
% to defer it because it will just get gobbled at the top of the
@@ -851,7 +842,9 @@
\fi
}
% \end{macrocode}
+% \end{macros}
%
+% \begin{macros}{\MFX@margin@clear@down}
% Finally, \cs{MFX@margin@clear@down} is the only place we actually
% need to handle full-margin clears, since the downward pass does not
% ever push \cs{mfx@build@clear} onto \cs{mfx@marginout}. When we
@@ -870,7 +863,7 @@
% \end{macrocode}
% \end{macros}
%
-% \begin{macros}{\MFX@check@fit,\MFX@popdimen}
+% \begin{macros}{\MFX@check@fit}
% We factored out some of the common functionality between the
% note and skip routines, so that must now be defined. The
% \cs{MFX@check@fit} macro acts as a conditional and should be
@@ -901,6 +894,8 @@
\if@tempswa % start a new \if
}
% \end{macrocode}
+% \end{macros}
+% \begin{macros}{\MFX@popdimen}
% Here is a quick convenience routine. \cs{MFX@popdimen}\marg{dimen}%
% \marg{list} removes the first dimension from \emph{list} and stores
% it into \emph{dimen}.
@@ -917,7 +912,7 @@
% \end{macrocode}
% \end{macros}
%
-% \begin{macros}{\MFX@whichbox,\MFX@leftmargin}
+% \begin{macros}{\MFX@whichbox}
% We also need to determine which box should be used, since they
% may have different heights. The macro \cs{MFX@whichbox}%
% \marg{target-box}\marg{left-box}\marg{right-box} checks which margin
@@ -933,9 +928,11 @@
%<debug>\MFX@debug{whichbox: \@marbox (\the\dimexpr\ht#1+\dp#1)}%
}
% \end{macrocode}
+% \end{macros}
%
-% And here is the logic to figure out which margin were in, based
-% on the page number and other flags. This is another conditional-like
+% \begin{macros}{\MFX@leftmargin}
+% And here is the logic to figure out which margin we're in, based on
+% the page number and other flags. This is another conditional-like
% macro, and should be used after an \cs{if}, as in
% \cs{if}\cs{MFX@leftmargin}\ldots\cs{else}\ldots\cs{fi}.
%
@@ -1022,7 +1019,7 @@
% \end{macrocode}
% \end{macros}
%
-% \begin{macros}{\MFX@margin@note@up,\MFX@margin@skip@up}
+% \begin{macros}{\MFX@margin@note@up}
% We must again define the specific behavior of each build command.
% These macros simply reuse \cs{MFX@check@fit}, but ask it to
% decrement the piece counter when a piece runs out of space.
@@ -1045,7 +1042,7 @@
% look for a piece that can fit this note, making sure to decrement
% the piece count and pop off a phantom for each new piece we check.
% Once it's found, we add the note back to \cs{mfx@marginout} with
-% the corect piece.
+% the correct piece.
% \begin{macrocode}
\if\MFX@check@fit{\advance\Mfx@piece@count\m@ne
\MFX@popdimen\dimen@\mfx@phantomheights}{\ht#1+\dp#1}%
@@ -1055,6 +1052,9 @@
\else\MFX@AssertionError\fi
}
% \end{macrocode}
+% \end{macros}
+%
+% \begin{macros}{\MFX@margin@skip@up}
% Skips are similar, but we have the added complication of handling
% margin phantoms. When we cross between phantom and piece, we split
% the skip so that we can use the simplest recursion possible.
@@ -1095,7 +1095,7 @@
% \end{macros}
%
% \subsection{Margin pieces}
-% \begin{macros}{\MFX@buildmargin@pieces,\MFX@buildmargin@piece}
+% \begin{macros}{\MFX@buildmargin@pieces}
% Before we can start the third and fourth passes, we need to set up
% a loop over the pieces so that each piece can do these passes at
% one time. In case we didn't use up all the pieces in the second
@@ -1114,10 +1114,12 @@
\let\@elt\MFX@buildmargin@piece
\MFX@run@clear\mfx@marginpieces
\let\@elt\relax
- \Mfx@piece@count\z@
+ \global\Mfx@piece@count\z@
}
% \end{macrocode}
+% \end{macros}
%
+% \begin{macros}{\MFX@buildmargin@piece}
% The \cs{MFX@buildmargin@piece} macro is called for each piece of
% the margin, and is passed the top and bottom positions of the piece.
% Here we need to do a few things. First, if the output so far is
@@ -1185,7 +1187,7 @@
% \end{macrocode}
% \end{macros}
%
-% \begin{macros}{\MFX@piece@note@down,\MFX@piece@skip@down,\MFX@piece@clear}
+% \begin{macros}{\MFX@piece@note@down}
% We again define each of our building macros. First, the note builder.
% When we encounter a note, we first zero out \cs{Mfx@marginspace}. Then
% we need to decide whether to put it in the current piece, or whether
@@ -1261,7 +1263,9 @@
\fi
}
% \end{macrocode}
+% \end{macros}
%
+% \begin{macros}{\MFX@piece@skip@down}
% Skips are a bit more complicated now. We no longer gobble the
% initial skips (since the skips at the top and bottom of the page
% have already been eaten). Instead, we need to look at
@@ -1301,7 +1305,9 @@
\fi
}
% \end{macrocode}
+% \end{macros}
%
+% \begin{macros}{\MFX@piece@clear}
% Finally, we need to handle the case of deferring material. By
% analogy with the previous two passes, we'll continue to refer to
% this as clearing. In this case, we need to redefine the note and
@@ -1365,7 +1371,7 @@
% \end{macrocode}
% \end{macros}
%
-% \begin{macros}{\MFX@piece@note@up,\MFX@piece@skip@up}
+% \begin{macros}{\MFX@piece@note@up}
% Now that we've taken care of late deferrals, we can define the
% standard behavior without worrying as much about that.
% These macros finally set their contents into \cs{Mfx@piece@content},
@@ -1379,6 +1385,8 @@
\let\mfx@build@skip\MFX@piece@skip@up
}
% \end{macrocode}
+% \end{macros}
+% \begin{macros}{\MFX@piece@skip@up}
% Skips are also straightforward.
% \begin{macrocode}
\def\MFX@piece@skip@up#1#2{%
@@ -1451,13 +1459,15 @@
% \end{macrocode}
% \end{macros}
%
-% \begin{macros}{\clearmargin,\softclearmargin}
+% \begin{macros}{\clearmargin}
% Likewise, \cs{clearmargin} is easy too.
% \begin{macrocode}
\def\clearmargin{%
\MFX@cons\mfx@marginlist{\noexpand\mfx@build@clear}%
}
% \end{macrocode}
+% \end{macros}
+% \begin{macros}{\softclearmargin}
% While we call \cs{softclearmargin} a ``clear margin'', it's
% actually just a big \cs{marginskip}. This allows us to stack
% multiple copies without backing them all up.
diff --git a/Master/texmf-dist/source/latex/mcmthesis/mcmthesis.dtx b/Master/texmf-dist/source/latex/mcmthesis/mcmthesis.dtx
index e23d77dcf0f..83b3cbae275 100644
--- a/Master/texmf-dist/source/latex/mcmthesis/mcmthesis.dtx
+++ b/Master/texmf-dist/source/latex/mcmthesis/mcmthesis.dtx
@@ -50,7 +50,7 @@ version 2005/12/01 or later.
This work has the LPPL maintenance status `maintained'.
-The Current Maintainer of this work is Liam Huang.
+The Current Maintainer of this work is latexstudio.net.
\endpreamble
\postamble
@@ -104,7 +104,7 @@ and the derived files \jobname.cls,
%</internal>
%<*driver>
\ProvidesFile{mcmthesis.dtx}
- [2020/01/22 v6.3 The Thesis Template Designed For MCM/ICM]
+ [2021/01/05 v6.3.1 The Thesis Template Designed For MCM/ICM]
\documentclass{ltxdoc}
\EnableCrossrefs
\CodelineIndex
@@ -146,7 +146,7 @@ and the derived files \jobname.cls,
%</driver>
% \fi
%
-% \CheckSum{526}
+% \CheckSum{530}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -164,7 +164,7 @@ and the derived files \jobname.cls,
% Grave accent \` Left brace \{ Vertical bar \|
% Right brace \} Tilde \~}
%
-% \changes{v1.0}{2013/05/12}{首次公开。}
+% \changes{v6.3.1}{2021/01/05}{更新版面尺寸,细节格式。}
%
% \GetFileInfo{\jobname.dtx}
%
@@ -177,7 +177,7 @@ and the derived files \jobname.cls,
% \makebox[0pt][l]{\hspace{1.5cm}\hyperlink{English}%
% {\large$ \to $ English Version}}
% }
-% \author{\LaTeX Studio \\ \texttt{latexstudio.net}\and 黄晨成 \\ \texttt{liamhuang0205+\jobname@gmail.com}}
+% \author{\LaTeX Studio \\ \texttt{latexstudio@qq.com}\and 黄晨成 \\ \texttt{liamhuang0205+\jobname@gmail.com}}
% \date{\filedate}
%
% \maketitle
@@ -361,8 +361,8 @@ xelatex mcmthesis-demo.tex
%
% 模板支持多种编译方式:
% \begin{itemize}
-% \item \XeLaTeX \textbf{这是推荐的方式};
-% \item pdf\LaTeX;
+% \item \XeLaTeX (若含中文);
+% \item pdf\LaTeX \textbf{这是推荐的方式};
% \item \LaTeX{} + DVIPDFMx。
% \end{itemize}
%
@@ -398,6 +398,7 @@ xelatex mcmthesis-demo.tex
% \item [6.2] 可定制的 headset。
% \item [6.2.1] 将默认字号由 |11pt| 修改为 |12pt|。
% \item [6.3] 修改summary的版面样式。
+% \item [6.3.1] 将默认的版面尺寸由 |a4paper| 修改为 |letterpaper|。
% \end{description}
%
% \title{\hypertarget{English}{%
@@ -609,8 +610,8 @@ xelatex mcmthesis-demo.tex
%
% The template supports various kinds of compilation workflow:
% \begin{itemize}
-% \item \XeLaTeX\ (\textbf{recommend});
-% \item pdf\LaTeX;
+% \item \XeLaTeX (If with chinese and so on);
+% \item pdf\LaTeX\ (\textbf{recommend});
% \item \LaTeX{} + DVIPDFMx。
% \end{itemize}
%
@@ -633,6 +634,7 @@ xelatex mcmthesis-demo.tex
% \item [6.2] Making headset of the Summary Sheet modifible.
% \item [6.2.1] Change default fontsize, from |11pt| to |12pt|.
% \item [6.3] Change summary sheet layout and demo code.
+% \item [6.3.1] Change the default papersize, frome |a4paper| to |letterpaper|.
% \end{description}
%
% \StopEventually{}
@@ -642,9 +644,9 @@ xelatex mcmthesis-demo.tex
%<*class>
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesClass{mcmthesis}
- [2020/01/18 v6.3 The Thesis Template Designed For MCM/ICM]
+ [2021/01/05 v6.3.1 The Thesis Template Designed For MCM/ICM]
\typeout{The Thesis Template Designed For MCM/ICM}
-\def\MCMversion{v6.3}
+\def\MCMversion{v6.3.1}
% \end{macrocode}
% \subsection{Options}
%
@@ -695,7 +697,7 @@ xelatex mcmthesis-demo.tex
%
% Loading document class.
% \begin{macrocode}
-\LoadClass[a4paper, 12pt]{article}
+\LoadClass[letterpaper, 12pt]{article}
% \end{macrocode}
%
% User interface.
@@ -759,7 +761,7 @@ xelatex mcmthesis-demo.tex
% \subsection{Page Layout}
% Setting paper size and margin sep.
% \begin{macrocode}
-\geometry{a4paper, margin = 1in}
+\geometry{letterpaper, margin = 1in}
% \end{macrocode}
%
% Making the footer and header.
@@ -908,22 +910,22 @@ xelatex mcmthesis-demo.tex
\begingroup
\setlength{\parindent}{0pt}
\begin{minipage}[t]{0.33\linewidth}
- \bfseries\centering%
- Problem Chosen\\[0.7pc]
- {\Huge\textbf{\MCM@opt@problem}}\\[2.8pc]
+ \centering%
+ \textbf{Problem Chosen}\\[0.7pc]
+ {\fontsize{20pt}{\baselineskip}\selectfont{\MCM@opt@problem}}\\[2.8pc]
\end{minipage}%
\begin{minipage}[t]{0.33\linewidth}
\centering%
\textbf{\headset}%
\end{minipage}%
\begin{minipage}[t]{0.33\linewidth}
- \centering\bfseries%
- Team Control Number\\[0.7pc]
- {\Huge\textbf{\MCM@opt@tcn}}\\[2.8pc]
+ \centering%
+ \textbf{Team Control Number}\\[0.7pc]
+ {\fontsize{20pt}{\baselineskip}\selectfont{\MCM@opt@tcn}}\\[2.8pc]
\end{minipage}\par
- \rule{\linewidth}{0.8pt}\par
+ \rule{\linewidth}{1.5pt}
\endgroup
- \vskip 10pt%
+ \vskip 5pt%
\ifMCM@opt@titleinsheet
\normalfont \LARGE \@title \par
\fi
@@ -1026,11 +1028,11 @@ xelatex mcmthesis-demo.tex
% define the section fonts and spaces.
% \begin{macrocode}
\renewcommand\section{\@startsection{section}{1}{\z@}%
- {-0pt\@plus -.2ex \@minus -.2ex}%
+ {-1sp\@plus -.2ex \@minus -.2ex}%
{1pt \@plus .2ex}%
{\rmfamily\Large\bfseries}}
\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
- {-0pt\@plus -.2ex \@minus -.2ex}%
+ {-1sp\@plus -.2ex \@minus -.2ex}%
{1pt \@plus .2ex}%
{\rmfamily\large\bfseries}}
\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
@@ -1119,12 +1121,22 @@ xelatex mcmthesis-demo.tex
\usepackage{newtxtext}%\usepackage{palatino}
\usepackage{lipsum}
\title{The \LaTeX{} Template for MCM Version \MCMversion}
-\author{\small \href{http://www.latexstudio.net/}
+\author{\small \href{https://www.latexstudio.net/}
{\includegraphics[width=7cm]{mcmthesis-logo}}}
\date{\today}
\begin{document}
\begin{abstract}
-\lipsum[1]
+Use this template to begin typing the first page (summary page) of your electronic report. This template uses a 12-point Times New Roman font. Submit your paper as an Adobe PDF electronic file (e.g. 1111111.pdf), typed in English, with a readable font of at least 12-point type.
+
+Do not include the name of your school, advisor, or team members on this or any page.
+
+Papers must be within the 25 page limit.
+
+Be sure to change the control number and problem choice above.
+You may delete these instructions as you begin to type your report here.
+
+Follow us @COMAPMath on Twitter or COMAPCHINAOFFICIAL on Weibo for the most up to date contest information.
+
\begin{keywords}
keyword1; keyword2
\end{keywords}
@@ -1155,8 +1167,7 @@ and commercial implementations. \LaTeX\ can be used for any kind
of document, but it is especially suited to those with complex
structures, repetitive formatting, or notations like
mathematics. Install the software from
-\url{www.tug.org/texlive/} or \url{https://www.latexstudio.net/archives/texsoftware}
-.
+\url{www.tug.org/texlive/}.
\subsection{Creating and typesetting your document}
\subsection{Syntax (how to type \LaTeX\ commands --- these
@@ -1270,8 +1281,7 @@ Mathematical Society and Addison-Wesley
Publishing Company , 1984-1986.
\bibitem{2}Lamport, Leslie, \LaTeX{}: `` A Document Preparation System '',
Addison-Wesley Publishing Company, 1986.
-\bibitem{3}\url{http://www.latexstudio.net/}
-\bibitem{4}\url{http://www.chinatex.org/}
+\bibitem{3}\url{https://www.latexstudio.net/}
\end{thebibliography}
\begin{appendices}
diff --git a/Master/texmf-dist/source/latex/media9/media9.tex b/Master/texmf-dist/source/latex/media9/media9.tex
index 202fc0bd582..cdeca7d1000 100644
--- a/Master/texmf-dist/source/latex/media9/media9.tex
+++ b/Master/texmf-dist/source/latex/media9/media9.tex
@@ -8,6 +8,10 @@
%\pdfobjcompresslevel=0
\listfiles
\documentclass[a4paper]{article}
+\RequirePackage[enable-debug]{expl3}
+\ExplSyntaxOn
+\debug_on:n{deprecation}
+\ExplSyntaxOff
\frenchspacing
\usepackage[utf8]{inputenc}
\usepackage{textcomp}
diff --git a/Master/texmf-dist/source/latex/memoir/memoir.dtx b/Master/texmf-dist/source/latex/memoir/memoir.dtx
index 1d45b947278..123d6371c1a 100644
--- a/Master/texmf-dist/source/latex/memoir/memoir.dtx
+++ b/Master/texmf-dist/source/latex/memoir/memoir.dtx
@@ -20,7 +20,7 @@
% This work consists of the files listed in the README file.
%
% \fi
-% \CheckSum{31149}
+% \CheckSum{31219}
%
% \changes{v0.1}{2001/05/20}{First public alpha release}
% \changes{v0.2}{2001/06/03}{First beta release}
@@ -121,6 +121,10 @@
% \changes{v3.7j}{2019/11/21}{Typo in embeded textcase, now that it is
% inside \cs{IfFileExists} \# needs to be doubled}
% \changes{v3.7k}{2020/03/25}{Maintenance}
+% \changes{v3.7l}{2020/06/02}{Small preparation for october kernel update}
+% \changes{v3.7m}{2020/09/10}{More preparations for october kernel update}
+% \changes{v3.7n}{2020/10/04}{Foced # doubling in AtBegin/EndX macros
+% to ensure backwards compatability}
%
% \def\dtxfile{memoir.dtx}
%
@@ -180,6 +184,9 @@
% \def\fileversion{v3.7i} \def\filedate{2019/11/15}
% \def\fileversion{v3.7j} \def\filedate{2019/11/21}
% \def\fileversion{v3.7k} \def\filedate{2020/03/25}
+% \def\fileversion{v3.7l} \def\filedate{2020/06/02}
+% \def\fileversion{v3.7m} \def\filedate{2020/09/10}
+% \def\fileversion{v3.7n} \def\filedate{2020/10/04}
% \title{The LaTeX \Lpack{memoir} class for configurable book
% typesetting: Source code\thanks{This
% file (\texttt{\dtxfile}) has version number \fileversion, last revised
@@ -410,11 +417,11 @@
% Announce the name, option files and version for LaTeX2e files:
% \begin{macrocode}
%<class>\ProvidesClass{memoir}%
-%<class> [2020/03/25 v3.7k configurable book, report, article document class]
+%<class> [2020/10/04 v3.7n configurable book, report, article document class]
% \end{macrocode}
% In the manual it is useful to know the current version.
% \begin{macrocode}
-%<class>\newcommand\memversion{v3.7k, 2020/03/25}
+%<class>\newcommand\memversion{v3.7n, 2020/10/04}
%<9pt>\ProvidesFile{mem9.clo}%
%<9pt> [2008/01/30 v0.4 memoir class 9pt size option]
%<10pt>\ProvidesFile{mem10.clo}%
@@ -577,6 +584,26 @@
% \end{macro}
% \end{macro}
%
+%
+% \changes{v3.7m}{2020/08/05}{Added \cs{IfFormatAtLeastTF}}
+% \begin{macro}{\IfFormatAtLeastTF}
+% Credit to Frank Mittelbach. Using
+% \cs{IfFormatAtLeastTF}\marg{date}\marg{true}\marg{false} we can
+% execute \meta{true} if the format is dated after the given
+% \meta{date} (in {\scriptsize\ttfamily YYYY/MM/DD} format) and
+% \meta{false} otherwise. The main use is for when we get info that
+% certain features are being added to the \LaTeX\ format, features
+% that we want to base class features on. Then this is an easy method
+% for providing the code only avaiable on newer formats and code left
+% over for those still using the older \LaTeX\ formats.\footnote{The \dots TF is a
+% \LaTeX3 convention.}
+% \begin{macrocode}
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+
+% \end{macrocode}
+% \end{macro}
+%
+%
% \begin{macro}{\ifsamename}
% \begin{macro}{\nametest}
% The macro \cs{nametest}\marg{name1}\marg{name2} tests whether the
@@ -876,7 +903,99 @@
% \end{macrocode}
% \end{macro}
-%
+%
+% \noindent
+% From 2020/10/01 format onwards we will implement file hooks via the
+% features provided by the \LaTeX\ kernel. This makes our code easier
+% to do (actually, users really ought to use these hook macros instead
+% of the ones the class provides) and it eliminates the need for us to
+% redefine \cmd{\InputIfFileExists}.
+% \changes{v3.7m}{2020/08/06}{Reimplemented file/package/class hooks}
+% \begin{macrocode}
+\IfFormatAtLeastTF{2020/10/01}{
+% \end{macrocode}
+% As mentioned in \cite{LTHOOKS,LTFILEHOOK} the kernel provides hooks
+% at the start of files, packages and classes. The class you implement
+% the latter via our definition of the file hook. We will now instead
+% use the separate hooks. Note that we will \emph{not} be adding any
+% extra labels to these hooks and will provide no interface to do
+% so. If more control is needed, please use the kernel interface directly.
+% \begin{macro}{\AtBeginFile}
+% \begin{macro}{\AtEndFile}
+% \cs{AtBeginFile}\marg{file}\marg{code} inserts \meta{code}
+% just before \meta{file} is input. Similarly \cs{AtEndFile} inserts
+% just after input.
+%
+% \textbf{Breaking change:} In the old implemenation
+% \verb!\AtEndFile{file}! worked for \texttt{file.tex} even if one
+% did not speficy the extension. Now you will need to use
+% \verb!\AtEndFile{file.tex}! explicitly.
+% \changes{v3.7n}{2020/10/04}{The old AtXFile code required \#\
+% doubling. The new does not, and this is not backwards compatible. By
+% suggestion from David Carlisle we change the code a little such that
+% \#\ is needed}
+% We add a \cs{temp} trick suggested by David Carlisle as the old code
+% required \#\ doubling and the new does not. To be backwards
+% compatible we force required \#\ doubling.
+% \begin{macrocode}
+ \newcommand\AtBeginFile[2]{\def\temp{\AddToHook{file/before/#1}{#2}}\temp}
+ \newcommand\AtEndFile[2]{\def\temp{\AddToHook{file/after/#1}{#2}}\temp}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\AtBeginPackage}
+% \begin{macro}{\AtEndPackage}
+% \begin{macro}{\RequireAtEndPackage}
+% \cs{AtBeginPackage}\marg{pack}\marg{code} inserts \meta{code}
+% just before the \meta{pack} package is input, and \cs{AtEndPackage}
+% is the equivalent for after input. \cs{RequireAtEndPackage} inserts
+% \meta{code} either at the end of \meta{pack}, or immediately if
+% \meta{pack} has already been input.
+% \changes{v3.7n}{2020/10/04}{The old AtXPackage code required \#\
+% doubling. The new does not, and this is not backwards compatible. By
+% suggestion from David Carlisle we change the code a little such that
+% \#\ is needed}
+% We add a \cs{temp} trick suggested by David Carlisle as the old code
+% required \#\ doubling and the new does not. To be backwards
+% compatible we force required \#\ doubling.
+% \begin{macrocode}
+ \newcommand\AtBeginPackage[2]{\def\temp{\AddToHook{package/before/#1}{#2}}\temp}
+ \newcommand\AtEndPackage[2]{\def\temp{\AddToHook{package/after/#1}{#2}}\temp}
+ \newcommand{\RequireAtEndPackage}[2]{%
+ \@ifpackageloaded{#1}{#2}{\AtEndPackage{#1}{#2}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\AtBeginClass}
+% \begin{macro}{\AtEndClass}
+% \begin{macro}{\RequireAtEndClass}
+% \cs{AtBeginClass}\marg{class}\marg{code} and friends are the class
+% equivalents of \cs{AtBeginPackage} and friends.
+% \changes{v3.7n}{2020/10/04}{The old AtXPackage code required \#\
+% doubling. The new does not, and this is not backwards compatible. By
+% suggestion from David Carlisle we change the code a little such that
+% \#\ is needed}
+% We add a \cs{temp} trick suggested by David Carlisle as the old code
+% required \#\ doubling and the new does not. To be backwards
+% compatible we force required \#\ doubling.
+% \begin{macrocode}
+ \newcommand\AtBeginClass[2]{\def\temp{\AddToHook{class/before/#1}{#2}}\temp}
+ \newcommand\AtEndClass[2]{\def\temp{\AddToHook{class/after/#1}{#2}}\temp}
+ \newcommand{\RequireAtEndClass}[2]{%
+ \@ifclassloaded{#1}{#2}{\AtEndClass{#1}{#2}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macrocode}
+}{% back to the code for older formats
+% \end{macrocode}
+% \noindent
+% Here follows the old code, which will still be used on older formats:
%
% Code, based on a hint from Morten H{\o}gholm\footnote{CTT posting
% 2005/11/08, \textit{Re: Checking for packages froma class...
@@ -911,26 +1030,26 @@
% \changes{3.7i}{2019/10/22}{Added latest kernel changes, special
% thanks to Phelype Oleinik}
% \begin{macrocode}
-\ifcsname InputIfFileExists \endcsname% looking for an explicit space
- % here aka the robust version
- \DeclareRobustCommand \InputIfFileExists[2]{%
- \IfFileExists{#1}%
- {%
- \expandafter\@swaptwoargs\expandafter
- {\@filef@und\m@matendf{#1}\killm@matf{#1}}{%
- #2\@addtofilelist{#1}\m@matbeginf{#1}\@@input%
+ \ifcsname InputIfFileExists \endcsname% looking for an explicit space
+ % here aka the robust version
+ \DeclareRobustCommand \InputIfFileExists[2]{%
+ \IfFileExists{#1}%
+ {%
+ \expandafter\@swaptwoargs\expandafter
+ {\@filef@und\m@matendf{#1}\killm@matf{#1}}{%
+ #2\@addtofilelist{#1}\m@matbeginf{#1}\@@input%
+ }%
}%
- }%
- }
-\else
- % Old definition
-\renewcommand{\InputIfFileExists}[2]{%
- \IfFileExists{#1}%
- {#2\@addtofilelist{#1}\m@matbeginf{#1}%
- \@@input \@filef@und
- \m@matendf{#1}%
- \killm@matf{#1}}}
-\fi
+ }
+ \else
+ % Old definition
+ \renewcommand{\InputIfFileExists}[2]{%
+ \IfFileExists{#1}%
+ {#2\@addtofilelist{#1}\m@matbeginf{#1}%
+ \@@input \@filef@und
+ \m@matendf{#1}%
+ \killm@matf{#1}}}
+ \fi
% \end{macrocode}
% \end{macro}
@@ -941,10 +1060,10 @@
% is defined. Similarly \cs{m@matendf}\marg{file} calls
% \cs{file-m@mfe} if it is defined.
% \begin{macrocode}
-\newcommand{\m@matbeginf}[1]{\@ifundefined{#1-m@mfb}{}%
- {\@nameuse{#1-m@mfb}}}
-\newcommand{\m@matendf}[1]{\@ifundefined{#1-m@mfe}{}%
- {\@nameuse{#1-m@mfe}}}
+ \newcommand{\m@matbeginf}[1]{\@ifundefined{#1-m@mfb}{}%
+ {\@nameuse{#1-m@mfb}}}
+ \newcommand{\m@matendf}[1]{\@ifundefined{#1-m@mfe}{}%
+ {\@nameuse{#1-m@mfe}}}
% \end{macrocode}
% \end{macro}
@@ -953,10 +1072,66 @@
% \begin{macro}{\killm@matf}
% \cs{killm@matf}\marg{file} undefines the \cs{file-m@mfb} and
% \cs{file-m@mfe} macros.
+% ^^A \begin{macrocode}
+% ^^A we use the better defintion below
+% ^^A % \newcommand*{\killm@matf}[1]{%
+% ^^A % \@namelet{#1-m@mfb}\relax
+% ^^A % \@namelet{#1-m@mfe}\relax}
+% ^^A
+% ^^A \end{macrocode}
+%
+% ^^A \subsection{Input files into tabulars, and etex}
+%
+% M.J. Williams (CTT \textit{\cs{noalign} problem with \cs{input} and
+% tabular in memoir class}, 28 Aug 2007) reported that using \cs{input} in a
+% tabular resulted in errors. His example was:
+% \begin{verbatim}
+% ...
+% \begin{tabular}{c|c} \hline
+% 1 & 2 \\ \hline
+% \input{data} \hline
+% 5 & 6 \\ \hline
+% \end{tabular}
+% \end{verbatim}
+% where \texttt{data.tex} contains the single line (and no newline) \\
+% \verb?3 & 4 \\?
+%
+% Morten H{\o}gholm noted that the problem
+% was caused by \Lpack{memoir}'s extension to \cs{input}
+% and gave a solution that depends on processing via
+% \texttt{etex} rather than \texttt{tex}.
+%
+% Here's Morten's fix. Quoting, in part:
+% \begin{quotation}
+% \Lpack{memoir} extends the file loading mechanism by providing
+% \cs{AtBeginFile} and \cs{AtEndFile} whose arguments are executed as
+% the names indicate. \ldots after inputting a file the storage bins are
+% emptied. The problem [in your case] is that this emptying is an
+% assignment and so starts a new tabular cell and \cs{hline} is only
+% allowed after \verb?\\? or other \cs{hline}s.
+%
+% \ldots the tabular environment wraps each tabular cell in additional
+% groups so one can do an explicit test for which type of group we are in.
+% If tested to be in an align group \emph{and} in vertical mode it means
+% TeX hasn't found something to start a new cell and
+% then \cs{noalign} can be used.
+% \end{quotation}
+%
% \begin{macrocode}
-\newcommand*{\killm@matf}[1]{%
- \@namelet{#1-m@mfb}\relax
- \@namelet{#1-m@mfe}\relax}
+ %% \ifetex
+ \newcommand*{\killm@matf}[1]{%
+ \ifnum 6=\currentgrouptype
+ \ifvmode
+ \expandafter\expandafter\expandafter\@firstoftwo
+ \expandafter\expandafter\expandafter\noalign
+ \fi
+ \fi
+ \@firstofone
+ {\@namelet{#1-m@mfb}\relax
+ \@namelet{#1-m@mfe}\relax
+ }%
+ }
+ %% \fi
% \end{macrocode}
% \end{macro}
@@ -967,12 +1142,12 @@
% just before \meta{file} is input. Similarly \cs{AtEndFile} inserts
% just after input.
% \begin{macrocode}
-\newcommand{\AtBeginFile}[2]{\@ifundefined{#1-m@mfb}%
- {\@namedef{#1-m@mfb}{#2}}%
- {\expandafter\addtodef\csname #1-m@mfb\endcsname{}{#2}}}
-\newcommand{\AtEndFile}[2]{\@ifundefined{#1-m@mfe}%
- {\@namedef{#1-m@mfe}{#2}}%
- {\expandafter\addtodef\csname #1-m@mfe\endcsname{}{#2}}}
+ \newcommand{\AtBeginFile}[2]{\@ifundefined{#1-m@mfb}%
+ {\@namedef{#1-m@mfb}{#2}}%
+ {\expandafter\addtodef\csname #1-m@mfb\endcsname{}{#2}}}
+ \newcommand{\AtEndFile}[2]{\@ifundefined{#1-m@mfe}%
+ {\@namedef{#1-m@mfe}{#2}}%
+ {\expandafter\addtodef\csname #1-m@mfe\endcsname{}{#2}}}
% \end{macrocode}
% \end{macro}
@@ -987,13 +1162,13 @@
% \meta{code} either at the end of \meta{pack}, or immediately if
% \meta{pack} has already been input.
% \begin{macrocode}
-\newcommand{\AtBeginPackage}[2]{%
- \AtBeginFile{#1.\@pkgextension}{#2}}
-\newcommand{\AtEndPackage}[2]{%
- \AtEndFile{#1.\@pkgextension}{#2}}
-\newcommand{\RequireAtEndPackage}[2]{%
- \@ifpackageloaded{#1}{#2}%
- {\AtEndFile{#1.\@pkgextension}{#2}}}
+ \newcommand{\AtBeginPackage}[2]{%
+ \AtBeginFile{#1.\@pkgextension}{#2}}
+ \newcommand{\AtEndPackage}[2]{%
+ \AtEndFile{#1.\@pkgextension}{#2}}
+ \newcommand{\RequireAtEndPackage}[2]{%
+ \@ifpackageloaded{#1}{#2}%
+ {\AtEndFile{#1.\@pkgextension}{#2}}}
% \end{macrocode}
% \end{macro}
@@ -1006,19 +1181,22 @@
% \cs{AtBeginClass}\marg{class}\marg{code} and friends are the class
% equivalents of \cs{AtBeginPackage} and friends.
% \begin{macrocode}
-\newcommand{\AtBeginClass}[2]{%
- \AtBeginFile{#1.\@clsextension}{#2}}
-\newcommand{\AtEndClass}[2]{%
- \AtEndFile{#1.\@clsextension}{#2}}
-\newcommand{\RequireAtEndClass}[2]{%
- \@ifclassloaded{#1}{#2}%
- {\AtEndFile{#1.\@clsextension}{#2}}}
+ \newcommand{\AtBeginClass}[2]{%
+ \AtBeginFile{#1.\@clsextension}{#2}}
+ \newcommand{\AtEndClass}[2]{%
+ \AtEndFile{#1.\@clsextension}{#2}}
+ \newcommand{\RequireAtEndClass}[2]{%
+ \@ifclassloaded{#1}{#2}%
+ {\AtEndFile{#1.\@clsextension}{#2}}}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
+% \begin{macrocode}
+} % end of els part of format check
+% \end{macrocode}
%
%
%
@@ -18624,61 +18802,6 @@
% \end{macrocode}
%
%
-% \subsection{Input files into tabulars, and etex}
-%
-% M.J. Williams (CTT \textit{\cs{noalign} problem with \cs{input} and
-% tabular in memoir class}, 28 Aug 2007) reported that using \cs{input} in a
-% tabular resulted in errors. His example was:
-% \begin{verbatim}
-% ...
-% \begin{tabular}{c|c} \hline
-% 1 & 2 \\ \hline
-% \input{data} \hline
-% 5 & 6 \\ \hline
-% \end{tabular}
-% \end{verbatim}
-% where \texttt{data.tex} contains the single line (and no newline) \\
-% \verb?3 & 4 \\?
-%
-% Morten H{\o}gholm noted that the problem
-% was caused by \Lpack{memoir}'s extension to \cs{input}
-% and gave a solution that depends on processing via
-% \texttt{etex} rather than \texttt{tex}.
-%
-% Here's Morten's fix. Quoting, in part:
-% \begin{quotation}
-% \Lpack{memoir} extends the file loading mechanism by providing
-% \cs{AtBeginFile} and \cs{AtEndFile} whose arguments are executed as
-% the names indicate. \ldots after inputting a file the storage bins are
-% emptied. The problem [in your case] is that this emptying is an
-% assignment and so starts a new tabular cell and \cs{hline} is only
-% allowed after \verb?\\? or other \cs{hline}s.
-%
-% \ldots the tabular environment wraps each tabular cell in additional
-% groups so one can do an explicit test for which type of group we are in.
-% If tested to be in an align group \emph{and} in vertical mode it means
-% TeX hasn't found something to start a new cell and
-% then \cs{noalign} can be used.
-% \end{quotation}
-%
-% \begin{macrocode}
-\ifetex
- \renewcommand*{\killm@matf}[1]{%
- \ifnum 6=\currentgrouptype
- \ifvmode
- \expandafter\expandafter\expandafter\@firstoftwo
- \expandafter\expandafter\expandafter\noalign
- \fi
- \fi
- \@firstofone
- {\@namelet{#1-m@mfb}\relax
- \@namelet{#1-m@mfe}\relax
- }%
- }
-\fi
-
-% \end{macrocode}
-%
%
% \subsection{Continuous tabulars}
%
@@ -30560,18 +30683,35 @@
% \changes{v1.4}{2003/11/22}{Fiddled \cs{protect} in \cs{trimmaks}
% (from patch v1.7)}
% \changes{v3.6h}{2010/12/05}{Added \cs{trimmarkscolor}}
+% \changes{v3.7m}{2020/08/05}{From the 2020/10/01 format, we don't
+% need the \cs{vskip}\texttt{-1in} and \cs{hskip}\texttt{-1in} as the
+% trimmarks are added in a different manner}
% \begin{macrocode}
\newcommand*\trimmarkscolor{}
+% \end{macrocode}
+% \changes{v3.7m}{2020/08/05}{Factored out two skips}
+% Factoring out two skips to make it easy to remove them in the
+% 2020/10/01 onwards.
+% \begin{macrocode}
+\newcommand\mem@trimmarks@initial@vskip{\vskip-1in}
+\newcommand\mem@trimmarks@initial@hskip{\hskip-1in}
\newcommand*{\trimmarks}{%
- \vbox to \z@{\vskip-1in \vskip\trimtop % top of logical page
- \hb@xt@\z@{\hskip-1in
+ \vbox to \z@{%
+ \mem@trimmarks@initial@vskip%
+ \vskip\trimtop % top of logical page
+ \hb@xt@\z@{%
+ \mem@trimmarks@initial@hskip%
\ifodd\c@page
- \hskip\stockwidth \hskip-\trimedge \hskip-\paperwidth
+ \hskip\stockwidth
+ \hskip-\trimedge
+ \hskip-\paperwidth
\else
\if@twoside
\hskip\trimedge % left of logical page
\else
- \hskip\stockwidth \hskip-\trimedge \hskip-\paperwidth
+ \hskip\stockwidth
+ \hskip-\trimedge
+ \hskip-\paperwidth
\fi
\fi
\vbox to \paperheight{%
@@ -30581,8 +30721,8 @@
\hb@xt@\paperwidth{\trimmarkscolor\tmarkml\hfil\tmarkmr}%
\vfil
\hb@xt@\paperwidth{\trimmarkscolor\tmarkbl\hfil\tmarkbm\hfil\tmarkbr}}%
- \hss}%
- \vss}}
+ \hss}%
+ \vss}}
% \end{macrocode}
% \end{macro}
@@ -30659,47 +30799,78 @@
\put(-24,-24){\line(0,1){48}}
\put(-24,0){\oval(12,12)}
\end{picture}}}
-\renewcommand*{\trimmarks}{%
-%% \special{papersize=\the\stockwidth,\the\stockheight}
- {%
- \vbox to \z@{\vskip-1in \vskip\trimtop % top of logical page
- \hb@xt@\z@{\hskip-1in
- \ifodd\c@page
- \hskip\stockwidth \hskip-\trimedge \hskip-\paperwidth
- \else
- \if@twoside
- \hskip\trimedge % left of logical page
- \else
- \hskip\stockwidth \hskip-\trimedge \hskip-\paperwidth
- \fi
- \fi
- \vbox to \paperheight{%
- \let\protect\relax % <- v1.4 addition
+% \end{macrocode}
+%
+% \changes{v3.7m}{2020/08/05}{Removed redefinition of \cs{trimmarks}
+% inside \cs{quarkmarks}, it only adds an extra group compared to the
+% normal \cs{trimmarks}}
+% Removed redefintion of \cmd{\trimmarks}, seemingly no need for it.
+% \begin{macrocode}
+%% \renewcommand*{\trimmarks}{%
+%% %% \special{papersize=\the\stockwidth,\the\stockheight}
+%% {%
+%% \vbox to \z@{\vskip-1in \vskip\trimtop % top of logical page
+%% \hb@xt@\z@{\hskip-1in
+%% \ifodd\c@page
+%% \hskip\stockwidth \hskip-\trimedge \hskip-\paperwidth
+%% \else
+%% \if@twoside
+%% \hskip\trimedge % left of logical page
+%% \else
+%% \hskip\stockwidth \hskip-\trimedge \hskip-\paperwidth
+%% \fi
+%% \fi
+%% \vbox to \paperheight{%
+%% \let\protect\relax % <- v1.4 addition
% \end{macrocode}
% We remember to add \cs{trimmarkscolor}
% \changes{v3.6h}{2010/12.05}{added \cs{trimmarkscolor}}
% \begin{macrocode}
- \hb@xt@\paperwidth{\trimmarkscolor\tmarktl\hfil\tmarktm\hfil\tmarktr}%
- \vfil
- \hb@xt@\paperwidth{\trimmarkscolor\tmarkml\hfil\tmarkmr}%
- \vfil
- \hb@xt@\paperwidth{\trimmarkscolor\tmarkbl\hfil\tmarkbm\hfil\tmarkbr}}%
- \hss}%
- \vss}}%
-}}
+%% \hb@xt@\paperwidth{\trimmarkscolor\tmarktl\hfil\tmarktm\hfil\tmarktr}%
+%% \vfil
+%% \hb@xt@\paperwidth{\trimmarkscolor\tmarkml\hfil\tmarkmr}%
+%% \vfil
+%% \hb@xt@\paperwidth{\trimmarkscolor\tmarkbl\hfil\tmarkbm\hfil\tmarkbr}}%
+%% \hss}%
+%% \vss}}%
+%% }
+}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
-% Any marks are put onto the pages by adding to the \cs{shipout}
+% As of the format update 2020/10/01 a hooking mechanism was added
+% to the kernel. One of these provides a hook into the background of
+% the shipped out pages, ideal for adding trimmarks. This hooking
+% system saves us from messing with \cmd{\shipout} direction (in
+% potentially incompatible ways).
+%
+% \changes{v3.7m}{2020/08/05}{Applying a format check and adding
+% trimmarks via hook if available}
+%
+% Note that the hook will be named \texttt{memoir/trimmarks} of easy
+% reference if one ever need to do some order readjustments. See
+% \cite{LTHOOKS,LTSHIPOUT} for more details on the hooking system. The
+% extra \cmd{\ifshowtrims} inside the hook is to accommodate for the
+% \cmd{\showtrimson}/\cmd{\showtrimsoff} commands.
+% \begin{macrocode}
+\IfFormatAtLeastTF{2020/10/01}{
+ \renewcommand\mem@trimmarks@initial@vskip{}
+ \renewcommand\mem@trimmarks@initial@hskip{}
+ \ifshowtrims
+ \AddToHook{shipout/background}[./trimmarks]{\ifshowtrims\put(0,0){\trimmarks}\fi}
+ \fi
+}{
+% \end{macrocode}
+% Here follows then the old code where Any marks are put onto the pages by adding to the \cs{shipout}
% routine.
%
% \begin{macro}{\mem@oldshipout}
% Keep a copy of the current version of \cs{shipout} in \cs{mem@oldshipout}.
% \begin{macrocode}
-\let\mem@oldshipout\shipout
+ \let\mem@oldshipout\shipout
% \end{macrocode}
% \end{macro}
%
@@ -30717,13 +30888,13 @@
% \changes{v1.6180339c}{2009/11/13}{Replaced Dans fix with a fix from
% Heiko Oberdiek}
% \begin{macrocode}
-\newcommand*{\mem@shipi}{%
- \ifvoid\@cclv\expandafter\aftergroup\fi\mem@shipii}
-\newcommand*\mem@shipii{%
- \ifvoid\@cclv
- \mem@oldshipout\box\@cclv
- \else
- \ifshowtrims
+ \newcommand*{\mem@shipi}{%
+ \ifvoid\@cclv\expandafter\aftergroup\fi\mem@shipii}
+ \newcommand*\mem@shipii{%
+ \ifvoid\@cclv
+ \mem@oldshipout\box\@cclv
+ \else
+ \ifshowtrims
% \end{macrocode}
% Heiko Oberdiek responded to a problem reported by Rolf
% Niepraschk. The earlier implementation might cause the output box to
@@ -30738,15 +30909,15 @@
% Heiko also provided the fix used below. Actually Heikos fix also
% fixes a problem that might cause glue settings to disappear.
% \begin{macrocode}
- \mem@oldshipout\vbox{%
- \trimmarks
- \nointerlineskip
- \box\@cclv
- }%
- \else
- \mem@oldshipout\box\@cclv
- \fi
- \fi}
+ \mem@oldshipout\vbox{%
+ \trimmarks
+ \nointerlineskip
+ \box\@cclv
+ }%
+ \else
+ \mem@oldshipout\box\@cclv
+ \fi
+ \fi}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -30756,13 +30927,15 @@
% \Lopt{showtrims} option. This adds \cs{mem@shipi} to the page box
% which then calls the original version of \cs{shipout}.
% \begin{macrocode}
-\ifshowtrims
- \renewcommand*{\shipout}{\afterassignment\mem@shipi\setbox\@cclv=}
-\fi
-
+ \ifshowtrims
+ \renewcommand*{\shipout}{\afterassignment\mem@shipi\setbox\@cclv=}
+ \fi
% \end{macrocode}
% \end{macro}
-%
+% \begin{macrocode}
+} % end format check, else part
+
+% \end{macrocode}
%
% \section{Verbatims, boxes, and files}
%
@@ -34454,6 +34627,14 @@
% the kernel's \\
% \verb?\, (\thinspace) = 3/18 em?
% \changes{v1.4}{2003/11/16}{Extra text spacing macros from patch v1.4}
+% \changes{v3.7l}{2020/06/02}{Added kernel wrapper}
+% As of the kernel/format update for october 2020, these will be moved
+% to the kernel, so we remove them of you are using that kernel.
+% \begin{macrocode}
+\@ifl@t@r\fmtversion{2020-10-01}{
+ % nothing to do with newer kernel
+}{%
+% \end{macrocode}
% \begin{macro}{\medspace}
% \begin{macro}{\:}
% Medium space \verb?\: (\medspace) = 4/18 em?
@@ -34473,6 +34654,7 @@
\DeclareRobustCommand{\!}{%
\relax\ifmmode\mskip-\thinmuskip\else\negthinspace\fi}
+} % end kernel version wrapper
% \end{macrocode}
% \end{macro}
%
@@ -36460,11 +36642,12 @@
% \begin{macrocode}
%%% revert changes to captioning macros if the caption package is used.
\AtBeginPackage{caption}{
- \ClassWarningNoLine{memoir}{%
+ %\ClassWarningNoLine{memoir}{%
+ \ClassInfo{memoir}{%
For the caption package to function properly with memoir,
- we will now reset\string\caption\space and friends to
- kernel defaults and then let the caption package take over.
- Remember: all caption configuration now goves via the caption
+ we will now reset \string\caption\space and friends to
+ kernel defaults and then let the^^Jcaption package take over.
+ Remember: all caption configuration now goes via the caption
package interface, not the interface from the memoir class.
}
@@ -36758,7 +36941,7 @@ keyword "\\glossaryentry"
%
% \bibitem[GMS94]{GOOSSENS94}
% Michel Goossens, Frank Mittelbach, and Alexander Samarin.
-% \newblock {\em The LaTeX Companion}.
+% \newblock \emph{The LaTeX Companion}.
% \newblock Addison-Wesley Publishing Company, 1994.
%
%
@@ -36803,6 +36986,21 @@ keyword "\\glossaryentry"
% \newblock (Available from CTAN in
% \texttt{/macros/latex/required/tools})
%
+% \bibitem[Mit2020a]{LTFILEHOOK}
+% Frank Mittelbach
+% \newblock \emph{The ltfilehook package}
+% \newblock July 2020.
+%
+% \bibitem[Mit2020b]{LTHOOKS}
+% Frank Mittelbach
+% \newblock \emph{The lthooks package}
+% \newblock July 2020.
+%
+% \bibitem[Mit2020c]{LTSHIPOUT}
+% Frank Mittelbach
+% \newblock \emph{The ltshipout package}
+% \newblock July 2020.
+%
% \bibitem[Oos96]{FANCYHDR}
% Piet van Oostrum.
% \newblock \emph{Page layout in LaTeX}.
diff --git a/Master/texmf-dist/source/latex/menucard/menucard.dtx b/Master/texmf-dist/source/latex/menucard/menucard.dtx
new file mode 100644
index 00000000000..da45e9a78f4
--- /dev/null
+++ b/Master/texmf-dist/source/latex/menucard/menucard.dtx
@@ -0,0 +1,323 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2020 by Sascha Frank <menucard@sascha-frank.com>
+% -------------------------------------------------------
+%
+% This file 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:
+%
+% http://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.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{menucard.dtx}
+%</driver>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{menucard}
+%<*package>
+ [2020/06/17 v0.1 menucards ]
+\RequirePackage[x11names]{xcolor}
+\RequirePackage{soul}
+%</package>
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{menucard}[2020/06/17]
+\usepackage{hyperref}
+\usepackage{parskip}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{menucard.dtx}
+ \PrintChanges
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{162}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% \changes{v0.1}{2020/06/17}{Initial version}
+%
+% \GetFileInfo{menucard.dtx}
+%
+% \DoNotIndex{\newcommand,\newenvironment}
+%
+%
+% \title{The \textsf{menucard} package\thanks{This document
+% corresponds to \textsf{menucard}~\fileversion, dated \filedate.}}
+% \author{Sascha Frank \\ \texttt{menucard@sascha-frank.com}}
+%
+% \maketitle
+% \begin{abstract}
+% The reason for this package was that I did not find a package for creating menus.
+% \end{abstract}
+%
+% \section{Introduction}
+% The usepackage is based on the answer of Gonzalo Medina\footnote{See also \href{https://tex.stackexchange.com/questions/38091}{https://tex.stackexchange.com/questions/38091}} to the question about a document class for restaurant menus.\cite{medina}
+%
+%
+% \section{What you need}
+% It requires the usepackages soul and xcolor.
+% \section{Loading}
+% Load the package with: \verb+\usepackage{menucard}+
+%
+% \section{Usage}
+% \DescribeMacro{\ColTextColor}
+% This macro sets the color of the menu heading. Default is Goldenrod3. Change color:
+% \begin{verbatim}
+% \definecolor{plumt}{rgb}{0.56, 0.27, 0.52}
+% \renewcommand{\ColTextColor}{plumt}
+% \end{verbatim}
+%
+% \DescribeMacro{\ColSubTextColor}
+% To set the color for the second heading. By default 50\% opacity of the first color.
+%
+% \DescribeMacro{\zapf}
+% With the command \verb+\zapf+ the font for the numbering can be changed. For example change to sans serif font \verb+\renewcommand{\zapf}{\sffamily}+ or to use normalfont \verb+\renewcommand{\zapf}{}+.
+%
+% \DescribeMacro{\Allergens}
+% To label allergenes and additives.
+% \begin{verbatim}
+% \Allergens{A,B,C}
+% \end{verbatim}
+%
+%
+% \subsection{menugroup}
+% There are three new environments, for each there is an additional star alternative. The variant without a star is intended for the case that the menus are to be numbered consecutively. In the variant with a star, the menus are not numbered consecutively. For this reason there are two different commands to insert entries. One is the command \verb+\Entry+ for the star environments and \verb+\Entrycount+ for the others.
+%
+% The environments Group and Group* have one parameter.
+%
+% \DescribeEnv{Group*}
+% Creates a two-column table over the width of the text, with the first column left-aligned (p-column) and the second column right-aligned.
+%
+% \begin{verbatim}
+% \begin{Group*}{heading}
+% ...
+% \end{Group*}
+% \end{verbatim}
+%
+% \DescribeEnv{Group}
+%Creates a three-column table of the width of the text, with the first two columns left-aligned (p-columns) and the third column right-aligned. The first column is intended for numbering.
+%
+% \begin{verbatim}
+% \begin{Group}{heading}
+% ...
+% \end{Group}
+% \end{verbatim}
+%
+% The following environments have two parameters.
+%
+% \DescribeEnv{menugroup*}
+%Creates a two-column table over the width of the column, where the first two columns are left-aligned (p-column) and the second column is right-aligned. The text size is \verb+\huge+ for the first heading and \verb+\LARGE+ for the second heading. The colors of the heading are Goldenrod3 respectively 50\% of it by default. A horizontal line is drawn after the headings.
+%
+% \begin{verbatim}
+% \begin{menugroup*}{first heading}{second heading}
+% ...
+% \end{menugroup*}
+% \end{verbatim}
+%
+% \DescribeEnv{menugroup}
+%Like menugroup* but with an additional third column for numbering.
+%
+% \begin{verbatim}
+% \begin{menugroup}{first heading}{second heading}
+% ...
+% \end{menugroup}
+% \end{verbatim}
+%
+% \DescribeEnv{menugroupsc*}
+%Like menugroup* only that the headings are set in small caps.
+%
+% \begin{verbatim}
+% \begin{menugroupsc*}{first heading}{second heading}
+% ...
+% \end{menugroupsc*}
+% \end{verbatim}
+%
+% \DescribeEnv{menugroupsc}
+%Like menugroup only that the headings are set in small caps.
+%
+% \begin{verbatim}
+% \begin{menugroupsc}{first heading}{second heading}
+% ...
+% \end{menugroupsc}
+% \end{verbatim}
+%
+% To set the menu entries within the environments the commands \verb+\Entry+ or \verb+\Entrycount+. Within these commands, the command \verb+\Expl+ can be used to insert additional explanations.
+%
+% \DescribeMacro{\Entry}
+% Used within the star environments with \verb+\Entry{left}{right}+ respectively with \verb+\Entry{left, \Expl{more}}{right}+.
+%
+% \DescribeMacro{\Entrycount}
+% Used within the no star environments with \verb+\Entrycount{left}{right}+ respectively with \verb+\Entrycount{left, \Expl{more}}{right}+.
+%
+% \DescribeMacro{\Expl}
+% Can be used within \verb+\Entry+ respectively \verb+\Entrycount+ to write sub entries.
+%
+%
+%
+% \StopEventually{}
+%
+% \section{Implementation}
+%
+% Setting color
+% \begin{macro}{\ColTextColor}
+% \begin{macrocode}
+\newcommand{\ColTextColor}{Goldenrod3}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ColSubTextColor}
+% \begin{macrocode}
+\newcommand{\ColSubTextColor}{\ColTextColor!50}
+% \end{macrocode}
+% \end{macro}
+% Text color first heading
+% \begin{macro}{\ColText}
+% \begin{macrocode}
+\newcommand*\ColText[1]{\textcolor{\ColTextColor}{#1}}
+% \end{macrocode}
+% \end{macro}
+% Text color second heading
+% \begin{macro}{\ColSubText}
+% \begin{macrocode}
+\newcommand*\ColSubText[1]{\textcolor{\ColSubTextColor}{#1}}
+% \end{macrocode}
+% \end{macro}
+% Counter
+% \begin{macro}{menucount}
+% \begin{macrocode}
+\newcounter{menucount}
+% \end{macrocode}
+% \end{macro}
+% New font for numbers
+% \begin{macro}{\zapf}
+% \begin{macrocode}
+\newcommand{\zapf}{\fontfamily{pzc}\selectfont}
+% \end{macrocode}
+% \end{macro}
+% Allergens
+% \begin{macro}{\Allergens}
+% \begin{macrocode}
+\newcommand{\Allergens}[1]{\textsuperscript{\tiny\sffamily #1}}
+% \end{macrocode}
+% \end{macro}
+% to format each entry in ENV*
+% \begin{macro}{\Entry}
+% \begin{macrocode}
+\newcommand*\Entry[2]{%
+ \sffamily#1 & #2}
+% \end{macrocode}
+% \end{macro}
+% to format each subentry
+% \begin{macro}{\Expl}
+% \begin{macrocode}
+\newcommand*\Expl[1]{%
+ \hspace*{1em}\footnotesize #1}
+% \end{macrocode}
+% \end{macro}
+% to format each entry in ENV
+% \begin{macro}{\Entrycount}
+% \begin{macrocode}
+\newcommand*\Entrycount[2]{\stepcounter{menucount} %
+ \zapf{\themenucount}\hspace*{1em} & \sffamily#1 & #2 }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{Group*}
+% a tabular* for each food group
+% \begin{macrocode}
+\newenvironment{Group*}[1]{
+ \noindent\begin{tabular*}{\textwidth}{@{}p{.8\linewidth}@{\extracolsep{\fill}}r@{}}
+ {\fontsize{24}{29}\selectfont\ColText{#1}}\\[0.8em]}
+ {\end{tabular*}}
+% \end{macrocode}
+% \end{environment}
+% adding an extra column for counting
+% \begin{environment}{Group}
+% \begin{macrocode}
+\newenvironment{Group}[1]
+ {\noindent\begin{tabular*}{\textwidth}{p{2em}@{}p{.8\linewidth}@{\extracolsep{\fill}}r@{}}
+ \multicolumn{3}{l}{{\fontsize{24}{29}\selectfont\ColText{#1}}}\\[0.8em]}
+ {\end{tabular*}}
+% \end{macrocode}
+%\end{environment}
+% Change width and font size and added two headings
+% \begin{environment}{menugroup*}
+% \begin{macrocode}
+\newenvironment{menugroup*}[2]
+ {
+\noindent\begin{tabular*}{\columnwidth}{@{}p{.8\linewidth}@{\extracolsep{\fill}}r@{}}
+ {\huge\textcolor{\ColTextColor}{#1}\hspace*{0.1em}
+ \LARGE\textcolor{\ColSubTextColor}{#2}}\\[0.2em]
+ \noindent\rule{\columnwidth}{0.4pt} & \\[0.8em]}
+ {\end{tabular*}}
+% \end{macrocode}
+%\end{environment}
+% Adding an extra column for counting
+% \begin{environment}{menugroup}
+% \begin{macrocode}
+\newenvironment{menugroup}[2]
+ {
+\noindent\begin{tabular*}{\columnwidth}{p{2em}@{}p{.8\linewidth}@{\extracolsep{\fill}}r@{}}
+ \multicolumn{3}{l}{\hspace*{-0.5em}{\huge\textcolor{\ColTextColor}{#1}\hspace*{0.1em} \LARGE\textcolor{\ColSubTextColor}{#2}}}\\[0.2em]
+ \noindent\hspace*{-0.55em}\rule{\columnwidth}{0.4pt} & \\[0.8em]}
+ {\end{tabular*}}
+% \end{macrocode}
+% \end{environment}
+% Adding caps for headings
+% \begin{environment}{menugroupsc*}
+% \begin{macrocode}
+\newenvironment{menugroupsc*}[2]
+ {
+\noindent\begin{tabular*}{\columnwidth}{@{}p{.8\linewidth}@{\extracolsep{\fill}}r@{}}
+ {\huge\textcolor{\ColTextColor}{\caps{#1}}\hspace*{0.1em} \LARGE\textcolor{\ColSubTextColor}{\caps{#2}}}\\[0.2em]
+ \noindent\rule{\columnwidth}{0.4pt} & \\[0.8em]}
+ {\end{tabular*}}
+% \end{macrocode}
+%\end{environment}
+% Adding an extra column for counting
+% \begin{environment}{menugroupsc}
+% \begin{macrocode}
+\newenvironment{menugroupsc}[2]
+ {
+\noindent\begin{tabular*}{\columnwidth}{p{2em}@{}p{.8\linewidth}@{\extracolsep{\fill}}r@{}}
+ \multicolumn{3}{l}{\hspace*{-0.5em}{\huge\textcolor{\ColTextColor}{\caps{#1}}\hspace*{0.1em} \LARGE\textcolor{\ColSubTextColor}{\caps{#2}}}}\\[0.2em]
+ \noindent\hspace*{-0.55em}\rule{\columnwidth}{0.4pt} & \\[0.8em]}
+ {\end{tabular*}}
+% \end{macrocode}
+%\end{environment}
+%
+%
+%\begin{thebibliography}{9}
+%\bibitem{medina}{Gonzalo Medina, 2011/12/13, class for a restaurant menu,\\ \href{https://tex.stackexchange.com/questions/38091/document-class-for-a-restaurant-menu}{https://tex.stackexchange.com/questions/38091/document-class-for-a-restaurant-menu}}
+%\end{thebibliography}
+%\bibliographystyle{unsrtdin}
+% \Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/ellipsis/ellipsis.ins b/Master/texmf-dist/source/latex/menucard/menucard.ins
index 34cc622656b..d7bbcefaff2 100644
--- a/Master/texmf-dist/source/latex/ellipsis/ellipsis.ins
+++ b/Master/texmf-dist/source/latex/menucard/menucard.ins
@@ -1,41 +1,41 @@
%%
-%% Copyright (C) 2003 by Peter Heslin <p.j.heslin@dur.ac.uk>
+%% Copyright (C) 2020 by Sascha Frank <menucard@sascha-frank.com>
%%
%% This file may be distributed and/or modified under the conditions of
-%% the LaTeX Project Public License, either version 1.2 of this license
+%% 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:
%%
%% http://www.latex-project.org/lppl.txt
%%
-%% and version 1.2 or later is part of all distributions of LaTeX version
-%% 1999/12/01 or later.
+%% and version 1.3 or later is part of all distributions of LaTeX version
+%% 2005/12/01 or later.
%%
\input docstrip.tex
\keepsilent
-\usedir{tex/latex/ellipsis}
+\usedir{tex/latex/menucard}
\preamble
This is a generated file.
-Copyright (C) 2003 by Peter Heslin <p.j.heslin@dur.ac.uk>
+Copyright (C) 2020 by Sascha Frank <menucard@sascha-frank.com>
This file may be distributed and/or modified under the conditions of
-the LaTeX Project Public License, either version 1.2 of this license
+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:
http://www.latex-project.org/lppl.txt
-and version 1.2 or later is part of all distributions of LaTeX version
-1999/12/01 or later.
+and version 1.3 or later is part of all distributions of LaTeX version
+2005/12/01 or later.
\endpreamble
-\generate{\file{ellipsis.sty}{\from{ellipsis.dtx}{package}}}
+\generate{\file{menucard.sty}{\from{menucard.dtx}{package}}}
\obeyspaces
\Msg{*************************************************************}
@@ -43,9 +43,9 @@ and version 1.2 or later is part of all distributions of LaTeX version
\Msg{* To finish the installation you have to move the following *}
\Msg{* file into a directory searched by TeX: *}
\Msg{* *}
-\Msg{* ellipsis.sty *}
+\Msg{* menucard.sty *}
\Msg{* *}
-\Msg{* To produce the documentation run the file ellipsis.dtx *}
+\Msg{* To produce the documentation run the file menucard.dtx *}
\Msg{* through LaTeX. *}
\Msg{* *}
\Msg{* Happy TeXing! *}
@@ -53,4 +53,3 @@ and version 1.2 or later is part of all distributions of LaTeX version
\Msg{*************************************************************}
\endbatchfile
-
diff --git a/Master/texmf-dist/source/latex/menukeys/menukeys.dtx b/Master/texmf-dist/source/latex/menukeys/menukeys.dtx
index 02a3c5904fe..d7fcb2684c5 100644
--- a/Master/texmf-dist/source/latex/menukeys/menukeys.dtx
+++ b/Master/texmf-dist/source/latex/menukeys/menukeys.dtx
@@ -1,24 +1,17 @@
% \iffalse meta-comment
-%
-% Copyright (c) 2016 by Tobias Weh
-% www.tobias-weh.de
-%
-% This file 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:
-%
-% http://www.latex-project.org/lppl.txt
-%
-% and version 1.2 or later is part of all distributions of
-% LaTeX version 1999/12/01 or later.
%
-% \fi
-%
-% \iffalse
+%% File: menukeys.dtx Copyright (c) Tobias Weh
+%%
+%% This file may be distributed and/or modified under the conditions of the
+%% LaTeX Project Public License (LPPL), either version 1.3c of this
+%% license or (at your option) any later version. The latest version
+%% of this license is in the file
+%%
+%% https://www.latex-project.org/lppl.txt
+%%
%<package>\NeedsTeXFormat{LaTeX2e}[2009/01/01]
%<package>\ProvidesPackage{menukeys}
-%<package> [2016/08/08 v1.5 -- A package to format menus, paths and shortcuts]
+%<package> [2020/12/19 v1.6.1 -- A package to format menus, paths and shortcuts]
%
%<*driver>
\documentclass{ltxdoc}
@@ -29,7 +22,6 @@
\usepackage[english]{babel}
\usepackage{menukeys}
\usepackage{xspace}
-\usepackage{lmodern}
\usepackage[hang]{footmisc}
\usepackage{dblfnote}
\setlength{\footnotemargin}{1em}
@@ -183,6 +175,7 @@
}{blacknwhite}
\newmenumacro{\filefolder}[/]{pathswithblackfolder}
\newmenumacro{\MENU}[,]{menusbig}
+\newcommand\email[1]{\href{mailto:#1}{\texttt{#1}}}
\makeatother
\EnableCrossrefs
@@ -229,7 +222,7 @@
%
% \GetFileInfo{menukeys.sty}
%
-% \DoNotIndex{\?,\.,\@M,\@@input,\@Alph,\@alph,\@addtoreset,\@arabic}
+% \DoNotIndex{\?,\_,\.,\@M,\@@input,\@Alph,\@alph,\@addtoreset,\@arabic}
% \DoNotIndex{\@badmath,\@centercr,\@cite}
% \DoNotIndex{\@dotsep,\@empty,\@float,\@gobble,\@gobbletwo,\@ignoretrue}
% \DoNotIndex{\@input,\@ixpt,\@m,\@minus,\@mkboth}
@@ -269,10 +262,10 @@
% \DoNotIndex{\viipt,\vipt,\vskip,\vspace}
% \DoNotIndex{\wd,\xiipt,\year,\z@}
% \expandafter\DoNotIndex{\,}
-% \DoNotIndex{\next,\unexpanded,\xifinsetTF,\robust@def,\@backslashchar,
-% \@ifundefinedcolor,\@nameuse,\detokenize,\cpt@parserlist,\cptexpanded
-% \cptrobustify,\cpttrimspaces,\cslet,\csname,\edef,\endcsname,\iflastindris,
-% \indrisloop,\indrisnr,\NewDocumentCommand,\cptexpanded}
+% \DoNotIndex{\next,\unexpanded,\@backslashchar,
+% \@ifundefinedcolor,\@nameuse,\detokenize,
+% \cslet,\csname,\edef,\endcsname,
+% \NewDocumentCommand}
% \DoNotIndex{\@afterheading,\@afterindentfalse,\@ifpackageloaded,\ ,
% \appto,\AtBeginDocument,\AtEndPreamble,\baselineskip,\BODY,
% \centering,\contentspage,\CurrentOption,\dots,\endquote,\fill,\filright,
@@ -285,18 +278,24 @@
% \DoNotIndex{\lccode,\listof,\lowercase,\PackageWarningNoLine,\PackageError,
% \PackageWarning,\renewenvironment,\romannumeral,\string,\strut}
% \DoNotIndex{\csdef,\cslet\csletcs,\letcs,\DeclareDocumentCommand,\ifcsundef,
-% \RenewDocumentCommand,\NewDocumentCommand,\hspace,\IfBooleanTF,\IfSubStr}
+% \RenewDocumentCommand,\ProvideDocumentCommand,\NewDocumentCommand,\hspace,
+% \IfBooleanTF,\IfSubStr}
% \DoNotIndex{\tikz,\node,\draw,\definecolor,\colorlet,\usetikzlibrary,
% \texttt,\textcolor,\raisebox,\maxsizebox,\small,\ttfamily,\DeclareBoolOption}
% \DoNotIndex{\value,\usebox,\sbox,\providecommand,\ProcessKeyvalOptions,\newbox,
% \IfStrEq,\hyphenchar,\expandonce,\encodingdefault,\DeclareStringOption}
%
% \title{\Huge\MENU[,]{M,E,N,U,K,E,Y,S}}
-% \author{Tobias Weh\\
-% \normalsize\href{mailto:mail@tobiw.de}{\texttt{mail@tobiw.de}}\\
-% \normalsize\url{http://tobiw.de/en}\\
-% \normalsize\url{http://github.com/tweh/menukeys}\\
-% \normalsize\url{http://www.ctan.org/pkg/menukeys}\\
+% \author{^^A
+% Tobias Weh\\
+% {\normalsize\email{mail@tobiw.de}}\\
+% {\normalsize\url{https://tobiw.de/en}}\\[\medskipamount]
+% ^^A
+% Jonathan P.\@ Spratte\\
+% {\normalsize\email{jspratte@yahoo.de}}\\[\medskipamount]
+% ^^A
+% \normalsize\url{https://github.com/tweh/menukeys}\\
+% \normalsize\url{https://www.ctan.org/pkg/menukeys}\\
% \normalsize\filefolder{macros/latex/contrib/menukeys}}
% \date{\filedate{} --- \fileversion}
% \thispagestyle{empty}
@@ -310,17 +309,18 @@
% If you like to support this package -- especially improving or proofreading the
% manual -- send me an e-mail, please.
% \par\bigskip\noindent
-% \emph{Many thanks to Ahmed Musa, who provided the list parsing code at
-% \url{http://tex.stackexchange.com/a/44989/4918}.}
-% \end{abstract}
+% \emph{Many thanks to Ahmed Musa, who provided the original list parsing
+% code at \url{https://tex.stackexchange.com/a/44989/4918}.}
+% \par
+% \end{abstract}
%
% \newpage\tableofcontents\newpage
%
% \section{Introduction}\label{intro}
% The \menukeys package is mainly designed to parse and print
-% sequences of software menus, folders and files or keystrokes.
-% The most predefined styles use the power of \TikZ\footnote{See
-% \url{http://www.ctan.org/pkg/pgf}.} to format the output.
+% sequences of software menus, folders and files, or keystrokes.
+% Most predefined styles use the power of \TikZ\footnote{See
+% \url{https://www.ctan.org/pkg/pgf}.} to format the output.
%
% For example if you want to tell the reader of a manual how to set the ruler
% unit you may type
@@ -330,9 +330,9 @@
% to view the rulers is \keys{cmd + R}. Pressing these keys again
% will hide the rulers.
%
-% The standard path for saving your document is \directory{Macintosh HD/Users/
-% Your Name/Documents} but you can change it at \menu{Extras > Settings
-% > Saving} by clicking \menu{Change save path}.
+% The standard path for saving your document is \directory{Macintosh HD/
+% Users/Your Name/Documents} but you can change it at \menu{Extras >
+% Settings > Saving} by clicking \menu{Change save path}.
% \end{verbatim}
% and get this:
%
@@ -342,9 +342,9 @@
% to view the rulers is \keys{cmd + R}. Pressing these keys again
% will hide the rulers.
%
-% The standard path for saving your document is \directory{Macintosh HD/Users/
-% Your Name/Documents} but you can change it at \menu{Extras > Settings
-% > Saving} by clicking \menu{Change save path}.
+% The standard path for saving your document is \directory{Macintosh HD/
+% Users/Your Name/Documents} but you can change it at \menu{Extras >
+% Settings > Saving} by clicking \menu{Change save path}.
%
% \bigskip\noindent
% The package is loaded as usual via
@@ -369,10 +369,12 @@
% \end{verbatim}
%
% \section{Package loading and options}\label{options}
-% Since \menukeys uses \pkg{catoptions}, which does some heavy changes on key-value
-% options, it is recommended to load \menukeys as the \textbf{last package}
-% (even after \pkg{hyperref}\footnote{See \url{http://tex.stackexchange.com/q/237683/4918}
-% and \url{https://github.com/tweh/menukeys/issues/41}.})!
+% \changes{v1.6}{2020/10/27}{Load order no longer important}
+% Since \menukeys used to use \pkg{catoptions}, which does some heavy changes on key-value
+% options, it \textbf{was} recommended to load \menukeys as the last package
+% (even after \pkg{hyperref}\footnote{See \url{https://tex.stackexchange.com/q/237683/4918}
+% and \url{https://github.com/tweh/menukeys/issues/41}.}).
+% \textbf{This is no longer the case!}
%
% These are the possible options:
% \begin{description}
@@ -394,8 +396,7 @@
% value is |symbols|.
% \item [os:] You can specify the OS \DO{os} by saying |os=mac| or |os=win|. This will cause
% some key macros to be rendered differently. The default value is |mac|.
-% \item [hyperrefcolorlinks:] Use this if you want \pkg{hyperref}'s \DO{hyperrefcolorlinks}
-% colored links, since you can't use the \pkg{hyperref} option \opt{colorlinks} directly
+% \item [hyperrefcolorlinks:] \emph{Obsolete}
% (see sec.~\ref{sec:issues} and~\ref{sec:hyperref-colorlinks}).
% \end{description}
%
@@ -741,20 +742,19 @@
% loaded after it. Otherwise some key macros get corrupted.
% \item \changes{v1.1}{2012/02/26}{Load \pkg{xcolor} before \menukeys.}
% \menukeys must be loaded after \pkg{xcolor}, if you load
-% the latter with options. Otherwise you'll get an option clash
+% the latter with options. Otherwise you'll get an option clash.
% Since \menukeys loads \pkg{xcolor} internally you may pass
-% options as global options via |\documentclass|.
+% options as global options via |\documentclass| or directly to it via
+% |\PassOptionsToPackage|.
% \example Set \pkg{xcolor} to |cmyk| model:
% \begin{verbatim}
-% \documentclass[cmyk]{article}
+% \documentclass{article}
+% \PassOptionsToPackage{cmyk}{xcolor}
% \usepackage{menukeys}
% \begin{document}
% Hello World!
% \end{document}
% \end{verbatim}
-% \item Using \pkg{hyperref} with the \opt{colorlinks} options causes
-% an option clash. If you want colored links please load \pkg{hyperref}
-% \emph{without} this option and load \pkg{menukeys} with \opt{hyperrefcolorlinks}.
% \end{itemize}
%
% If you find something to add to this list please send me an e-mail or report a
@@ -764,6 +764,7 @@
%
% \section{Implementation}
% \subsection{Required packages}
+% \changes{v1.6}{2020/10/27}{Don't load \pkg{catoptions}}
% Load the required packages
% \begin{macrocode}
\RequirePackage{xparse}
@@ -787,9 +788,103 @@
\RequirePackage{relsize}
% \end{macrocode}
% To define the list parsing commands and allow |\| as
-% a separator we load \pkg{catoptions}
+% a separator we used to load \pkg{catoptions}. Instead we now use some
+% \pkg{expl3} functions to replace the macros we required from \pkg{catoptions}.
+%
+% The first few of these functions are more or less direct equivalents. A bit of
+% attention has to be paid for |\tw@mk@xifinsetTF| as it requires the arguments
+% to get swapped.
+% \begin{macrocode}
+\ExplSyntaxOn
+\cs_new_eq:NN \tw@mk@trimspaces \tl_trim_spaces:n
+\cs_new_eq:NN \tw@mk@exp@Nnno \exp_args:Nnno
+\cs_new_eq:NN \tw@mk@string \cs_to_str:N
+\prg_generate_conditional_variant:Nnn \tl_if_in:nn { xx } { TF }
+\cs_new:Npn \tw@mk@xifinsetTF #1 #2
+ {
+ \tl_if_in:xxTF {#2} {#1}
+ }
+% \end{macrocode}
+% The replacement for |\indrisloop| will not set the conditional
+% |\iflastindris|, instead we can check whether the sequence is empty to see
+% whether this is the last element. This test will not use a TeX-like
+% |\iflastindris...\else...\fi| construct but instead two branches.
+% \begin{macrocode}
+\cs_new:Npn \tw@mk@iflastindris
+ {
+ \seq_if_empty:NTF \l__twmk_indris_seq
+ }
+% \end{macrocode}
+% Replacing |\indrisloop| is a bit more work as it requires us to push some
+% values to a stack (to allow nested usage, this may not be necessary for
+% \pkg{menukeys}, but it is part of the original |\indrisloop| so we should
+% play nice here). First we'll need a few variables.
+% \begin{macrocode}
+\seq_new:N \l__twmk_indris_seq
+\int_new:N \l__twmk_indris_int
+\tl_new:N \l__twmk_indris_tl
+\cs_new_eq:NN \tw@mk@indrisnr \l__twmk_indris_int
+\seq_new:N \l__twmk_indris_seqstack_seq
+\seq_new:N \l__twmk_indris_intstack_seq
+% \end{macrocode}
+% Our stack will use another sequence in which the definitions of the parent
+% call will be stored for the sequence and the integer. The other variables put
+% on a stack by |\indrisloop| aren't required. The synopsis of
+% |\tw@mk@indrisloop| will be different to the one provided by \pkg{catoptions}.
+% The delimiter will be a mandatory argument (not in brackets), and there is no
+% starred version.
+% \begin{macrocode}
+\cs_new_protected:Npn \__twmk_pushseq:
+ {
+ \seq_push:No \l__twmk_indris_seqstack_seq \l__twmk_indris_seq
+ }
+\cs_new_protected:Npn \__twmk_pushint:
+ {
+ \seq_push:NV \l__twmk_indris_intstack_seq \l__twmk_indris_int
+ }
+\cs_new_protected:Npn \__twmk_popseq:
+ {
+ \seq_if_empty:NTF \l__twmk_indris_seqstack_seq
+ { \seq_clear:N \l__twmk_indris_seq }
+ { \seq_pop:NN \l__twmk_indris_seqstack_seq \l__twmk_indris_seq }
+ }
+\cs_new_protected:Npn \__twmk_popint:
+ {
+ \seq_if_empty:NTF \l__twmk_indris_intstack_seq
+ { \int_zero:N \l__twmk_indris_int }
+ {
+ \group_begin:
+ \seq_pop:NN \l__twmk_indris_intstack_seq \l__twmk_indris_tl
+ \exp_args:NNNo
+ \group_end:
+ \int_set:Nn \l__twmk_indris_int \l__twmk_indris_tl
+ }
+ }
+% \end{macrocode}
+% The real loop works by first splitting the input into a sequence according to
+% the delimiter in |#1|. Then this sequence is stepped through, but instead of
+% using |\seq_map:NN| we'll have to pop the sequence into a local variable so
+% that our test for the last element works. The parameter |#2| has to be
+% expanded once as it is handed in as a token storing the real argument in later
+% use.
% \begin{macrocode}
-\RequirePackage{catoptions}[2011/12/07]
+\cs_generate_variant:Nn \seq_set_split:Nnn { Noo }
+\cs_new_protected:Npn \tw@mk@indrisloop #1 #2 #3
+ {
+ \__twmk_pushseq:
+ \__twmk_pushint:
+ \seq_set_split:Noo \l__twmk_indris_seq {#1} {#2}
+ \int_zero:N \l__twmk_indris_int
+ \bool_do_while:nn { \bool_not_p:n { \seq_if_empty_p:N \l__twmk_indris_seq } }
+ {
+ \int_incr:N \l__twmk_indris_int
+ \seq_pop_left:NN \l__twmk_indris_seq \l__twmk_indris_tl
+ \exp_args:No #3 \l__twmk_indris_tl
+ }
+ \__twmk_popseq:
+ \__twmk_popint:
+ }
+\ExplSyntaxOff
% \end{macrocode}
%
% \subsection{Helper macros}
@@ -853,32 +948,22 @@
% \end{macrocode}
%
% \subsection{Workarounds}
-% Some workarounds to ``slove'' some incompatibilities:
+% Some workarounds to ``solve'' some incompatibilities:
% \subsubsection{\pkg{hyperref}'s \opt{colorlinks} option}\label{sec:hyperref-colorlinks}
+% \changes{v1.6}{2020/10/27}{\opt{hyperrefcolorlinks} obsolete}
% \changes{v1.5}{2016/08/08}{New option \opt{hyperrefcolorlinks}}
-% Since the \opt{colorlinks} option of \pkg{hyperref} loads \pkg{color} (with
-% some kind of |\AtBeginDocument|) it results in an option clas due to the
-% changes made by \pkg{catoptions}. Thus one can't use \opt{colorlinks}. Here we
-% provide the code to activate colored links without the extra loading of
-% \pkg{color}.
+% There used to be an issue with using the \opt{colorlinks} option of
+% \pkg{hyperref} due to \pkg{catoptions} being loaded. Since \pkg{catoptions}
+% isn't required any more, this workaround isn't necessary. For backwards
+% compatibility the \opt{hyperrefcolorlinks} option is still evaluated and just
+% uses |\hypersetup| or |\PassOptionsToPackage| depending on whether
+% \pkg{hyperref} is already loaded.
% \begin{macrocode}
\iftw@mk@hyperrefcolorlinks
- \Hy@AtBeginDocument{% (hyperref.sty, line 4790)
- \def\@pdfborder{0 0 0}% (hyperref.sty, line 4806...)
- \let\@pdfborderstyle\@empty
-% \ifHy@typexml% <--------------+
-% \else% | This part
-% \Hy@CatcodeWrapper{% | bust be
-% \RequirePackage{color}% | omitted
-% }% |
-% \fi% <------------------------+
- \def\Hy@colorlink#1{%
- \begingroup
- \HyColor@UseColor#1%
- }%
- \def\Hy@endcolorlink{\endgroup}%
- \Hy@Info{Link coloring ON}%
- }
+ \tw@mk@warning{The option `hyperrefcolorlinks' is obsolete}
+ \@ifpackageloaded{hyperref}
+ {\hypersetup{colorlinks}}
+ {\PassOptionsToPackage{colorlinks}{hyperref}}
\fi
% \end{macrocode}
%
@@ -1492,7 +1577,7 @@
% \begin{macro}{\tw@default@input@sep}
% First we define our default input separator
% \begin{macrocode}
-\edef\tw@default@input@sep{,}
+\def\tw@default@input@sep{,}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\CurrentMenuElement} and the |\CurrentMenuElement| dummy
@@ -1501,92 +1586,130 @@
% \end{macrocode}
% \end{macro}
% \begin{macro}{\tw@define@menu@macro}
+% \changes{v1.6.1}{2020/12/19}{Handles default input separator.}
+% \begin{macro}{\tw@define@menu@macro@}
% \changes{v1.1a}{2013/05/28}{Fixed minor bug, that causes a warning about robustifying (issue \#23),
% by deleting the line to make the command robust.}
% \changes{v1.2}{2013/07/23}{Replaced \cs{edef} by \cs{protected@edef}}
% \changes{v1.2c}{2013/07/23}{Replaced \cs{protected@edef} by \cs{def}}
-% \changes{v1.2}{2013/07/23}{Addded \cs{leavevmode}}
+% \changes{v1.2}{2013/07/23}{Added \cs{leavevmode}}
+% \changes{v1.6}{2020/10/27}{Don't use \cs{NewDocumentCommand}}
+% \changes{v1.6.1}{2020/12/19}{Renamed from \cs{tw@define@menu@macro}}
+% \changes{v1.6.1}{2020/12/19}{No x-type expansion on the separator to call the
+% loop}
% Then we set up the internal command to create new menu macros.
% The list parsing code was essentially provided by Ahmed Musa at
-% \url{http://tex.stackexchange.com/a/44989/4918}. Thank you very much!
+% \url{https://tex.stackexchange.com/a/44989/4918}. Jonathan P.\@ Spratte
+% made some major changes to make \pkg{menukeys} work without \pkg{catoptions}
+% and reimplemented the parsing code using \LaTeX3. Thank you both very much!
% \begin{macrocode}
\begingroup
\lccode`\,=1
\lowercase{\endgroup
- \robust@def*\tw@mk@test@input@sep#1{%
- \xifinsetTF{,\cpttrimspaces{#1},}{,bslash,backslash,directory,location,}%
- }%
-}
-\NewDocumentCommand{\tw@define@menu@macro}{%
- m O{\tw@default@input@sep} m
-}{%
- \ifcsundef{tw@style@#3@sep}{%
- \tw@mk@error{Can't define menu macro \string#1\space,\MessageBreak
- because the style '#3' is not available!}
- }{%
- \csdef{tw@parse@menu@list@\expandafter\@gobble\string#1}##1{%
- \iflastindris
- \ifnum\indrisnr=\@ne
- \def\CurrentMenuElement{##1}%
- \@nameuse{tw@style@#3@single}%
- \else
- \def\CurrentMenuElement{##1}%
- \@nameuse{tw@style@#3@sep}\@nameuse{tw@style@#3@last}%
- \fi
- \else
- \ifnum\indrisnr=\@ne
- \def\CurrentMenuElement{##1}%
- \@nameuse{tw@style@#3@first}%
- \else
- \def\CurrentMenuElement{##1}%
- \@nameuse{tw@style@#3@sep}\@nameuse{tw@style@#3@mid}%
- \fi
- \fi
- }%
- \expandafter\newcommand\csname\expandafter\@gobble\string#1\endcsname[2][#2]{%
- \leavevmode%
- {\def\tw@current@color@theme{\csname tw@style@#3@color@theme\endcsname}%
- \@nameuse{tw@style@#3@pre}%
- \tw@mk@test@input@sep{##1}{%
- \edef\tw@menu@list{\detokenize{##2}}\edef\tw@mk@tempa{\@backslashchar}%
- }{%
- \edef\tw@menu@list{\unexpanded{##2}}\edef\tw@mk@tempa{\cpttrimspaces{##1}}%
- }%
- {\letcs{\tw@mk@tempb}{tw@parse@menu@list@\expandafter\@gobble\string#1}%
- \cptexpanded{\indrisloop*[\tw@mk@tempa]}\tw@menu@list\tw@mk@tempb}%
- \@nameuse{tw@style@#3@post}}%
+ \@ifdefinable\tw@mk@test@input@sep
+ {%
+ \protected\def\tw@mk@test@input@sep#1{%
+ \tw@mk@xifinsetTF
+ {,\tw@mk@trimspaces{#1},}{,bslash,backslash,directory,location,}%
}%
- }%
+ }%
}
-\edef\cpt@parserlist{\cpt@parserlist\@backslashchar}
+\newcommand\tw@define@menu@macro[3]
+ {%
+ \IfNoValueTF{#3}
+ {\tw@mk@exp@Nnno\tw@define@menu@macro@{#1}{#2}\tw@default@input@sep}
+ {\tw@define@menu@macro@{#1}{#2}{#3}}%
+ }
+\newcommand\tw@define@menu@macro@[4]
+ {%
+ \ifcsundef{tw@style@#4@sep}
+ {%
+ \tw@mk@error
+ {%
+ Can't define menu macro \string#2\space,\MessageBreak
+ because the style '#4' is not available!%
+ }%
+ }
+ {%
+ \csdef{tw@parse@menu@list@\tw@mk@string#2}##1%
+ {%
+ \def\CurrentMenuElement{##1}%
+ \tw@mk@iflastindris
+ {%
+ \ifnum\tw@mk@indrisnr=\@ne
+ \@nameuse{tw@style@#4@single}%
+ \else
+ \@nameuse{tw@style@#4@sep}%
+ \@nameuse{tw@style@#4@last}%
+ \fi
+ }
+ {%
+ \ifnum\tw@mk@indrisnr=\@ne
+ \@nameuse{tw@style@#4@first}%
+ \else
+ \@nameuse{tw@style@#4@sep}%
+ \@nameuse{tw@style@#4@mid}%
+ \fi
+ }%
+ }%
+ #1#2{+O{#3}+m}%
+ {%
+ \leavevmode
+ \begingroup
+ \def\tw@current@color@theme
+ {\csname tw@style@#4@color@theme\endcsname}%
+ \@nameuse{tw@style@#4@pre}%
+ \tw@mk@test@input@sep{##1}
+ {%
+ \edef\tw@menu@list{\detokenize{##2}}%
+ \edef\tw@mk@tempa{\@backslashchar}%
+ }
+ {%
+ \edef\tw@menu@list{\unexpanded{##2}}%
+ \edef\tw@mk@tempa{\tw@mk@trimspaces{##1}}%
+ }%
+ \begingroup
+ \letcs{\tw@mk@tempb}{tw@parse@menu@list@\tw@mk@string#2}%
+ \tw@mk@indrisloop\tw@mk@tempa\tw@menu@list\tw@mk@tempb
+ \endgroup
+ \@nameuse{tw@style@#4@post}%
+ \endgroup
+ }%
+ }%
+ }
% \end{macrocode}
% \end{macro}
+% \end{macro}
% \subsubsection{User-level commands}
% \begin{macro}{\newmenumacro}
% \changes{v1.1a}{2013/05/28}{Added a line to make a new macro robust.}
+% \changes{v1.6}{2020/10/27}{use \cs{NewDocumentCommand}}
+% \changes{v1.6.1}{2020/12/19}{default handled by \cs{tw@define@menu@macro}}
% \begin{macro}{\renewmenumacro}
+% \changes{v1.6}{2020/10/27}{use \cs{RenewDocumentCommand}}
+% \changes{v1.6.1}{2020/12/19}{default handled by \cs{tw@define@menu@macro}}
% \begin{macro}{\providemenumacro}
+% \changes{v1.6}{2020/10/27}{use \cs{ProvideDocumentCommand}}
+% \changes{v1.6.1}{2020/12/19}{default handled by \cs{tw@define@menu@macro}}
% Now it's time to build the user-level commands
% \begin{macrocode}
-\NewDocumentCommand{\newmenumacro}{m O{\tw@default@input@sep} m}{%
- \ifcsundef{\expandafter\@gobble\string#1}{%
- \tw@define@menu@macro{#1}[#2]{#3}%
- \expandafter\cptrobustify\csname\expandafter\@gobble\string#1\endcsname
- }{
+\NewDocumentCommand{\newmenumacro}{m o m}{%
+ \ifcsundef{\tw@mk@string#1}{%
+ \tw@define@menu@macro\NewDocumentCommand{#1}{#2}{#3}%
+ }{%
\tw@mk@error{Menu macro '\string#1' already defined!\MessageBreak
- Use \string\renewmenustyle\space instead.}
+ Use \string\renewmenustyle\space instead.}%
}%
}
-\NewDocumentCommand{\renewmenumacro}{m O{\tw@default@input@sep} m}{%
- \cslet{\expandafter\@gobble\string#1}{\relax}%
- \tw@define@menu@macro{#1}[#2]{#3}%
+\NewDocumentCommand{\renewmenumacro}{m o m}{%
+ \tw@define@menu@macro\RenewDocumentCommand{#1}{#2}{#3}%
}
-\NewDocumentCommand{\providemenumacro}{m O{\tw@default@input@sep} m}{%
- \ifcsundef{\expandafter\@gobble\string#1}{%
- \tw@define@menu@macro{#1}[#2]{#3}%
- }{
+\NewDocumentCommand{\providemenumacro}{m o m}{%
+ \ifcsundef{\tw@mk@string#1}{%
+ \tw@define@menu@macro\ProvideDocumentCommand{#1}{#2}{#3}%
+ }{%
\tw@mk@warning{Menu macro '\string#1' already defined!\MessageBreak
- Use \string\renewmenustyle\space to redefine it.}
+ Use \string\renewmenustyle\space to redefine it.}%
}%
}
% \end{macrocode}
@@ -1650,25 +1773,25 @@
% \begin{macrocode}
\NewDocumentCommand{\tw@make@key@macro}{s m}{%
\IfBooleanTF{#1}{%
- \expandafter\providecommand\csname\expandafter\@gobble\string#2\endcsname{%
+ \expandafter\providecommand\csname\tw@mk@string#2\endcsname{%
\expandonce{\maxsizebox{!}{1.8ex}{%
- \@nameuse{tw@mk@\expandafter\@gobble\string#2@\tw@mk@os}}%
+ \@nameuse{tw@mk@\tw@mk@string#2@\tw@mk@os}}%
}%
}%
- \expandafter\providecommand\csname\expandafter\@gobble\string#2mac\endcsname{%
+ \expandafter\providecommand\csname\tw@mk@string#2mac\endcsname{%
\expandonce{\maxsizebox{!}{1.8ex}{%
- \@nameuse{tw@mk@\expandafter\@gobble\string#2@mac}}%
+ \@nameuse{tw@mk@\tw@mk@string#2@mac}}%
}%
}%
- \expandafter\providecommand\csname\expandafter\@gobble\string#2win\endcsname{%
+ \expandafter\providecommand\csname\tw@mk@string#2win\endcsname{%
\expandonce{\maxsizebox{!}{1.8ex}{%
- \@nameuse{tw@mk@\expandafter\@gobble\string#2@win}}%
+ \@nameuse{tw@mk@\tw@mk@string#2@win}}%
}%
}%
}{%
- \expandafter\providecommand\csname\expandafter\@gobble\string#2\endcsname{%
+ \expandafter\providecommand\csname\tw@mk@string#2\endcsname{%
\expandonce{\maxsizebox{!}{1.8ex}{%
- \@nameuse{tw@mk@\expandafter\@gobble\string#2}}%
+ \@nameuse{tw@mk@\tw@mk@string#2}}%
}%
}%
}%
@@ -1989,4 +2112,4 @@
%
%
% \Finale
-\endinput \ No newline at end of file
+\endinput
diff --git a/Master/texmf-dist/source/latex/menukeys/menukeys.ins b/Master/texmf-dist/source/latex/menukeys/menukeys.ins
index 79a6792f6fb..8999ea72759 100644
--- a/Master/texmf-dist/source/latex/menukeys/menukeys.ins
+++ b/Master/texmf-dist/source/latex/menukeys/menukeys.ins
@@ -1,17 +1,15 @@
-%%
-%% Copyright (C) 2016 by Tobias Weh
-%% www.tobiw.de/en
-%%
-%% This file 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:
-%%
-%% http://www.latex-project.org/lppl.txt
-%%
-%% and version 1.2 or later is part of all distributions of
-%% LaTeX version 1999/12/01 or later.
-%%
+\iffalse meta-comment
+
+File menukeys.ins Copyright (c) Tobias Weh
+
+This file may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version. The latest version
+of this license is in the file
+
+ https://www.latex-project.org/lppl.txt
+
+\fi
\input docstrip.tex
\keepsilent
@@ -30,7 +28,7 @@ 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:
- http://www.latex-project.org/lppl.txt
+ https://www.latex-project.org/lppl.txt
and version 1.2 or later is part of all distributions of
LaTeX version 1999/12/01 or later.
@@ -55,4 +53,4 @@ LaTeX version 1999/12/01 or later.
\Msg{* *}
\Msg{****************************************************}
-\endbatchfile \ No newline at end of file
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/metastr/metastr.dtx b/Master/texmf-dist/source/latex/metastr/metastr.dtx
index 474c224f9af..4a68d29a963 100644
--- a/Master/texmf-dist/source/latex/metastr/metastr.dtx
+++ b/Master/texmf-dist/source/latex/metastr/metastr.dtx
@@ -18,10 +18,10 @@
% and the derived files metastr.sty and metasamp.tex.
%
%<package|sample>\NeedsTeXFormat{LaTeX2e}[1996/12/01]
-%<package>\ProvidesPackage{metastr}[2020/02/06 v1.0 Metadata Strings Storage]
-%<sample>\ProvidesFile{metasamp.tex}[2020/02/06 v1.0 sample for metastr]
+%<package>\ProvidesPackage{metastr}[2020/09/02 v1.1.2 Metadata Strings Storage]
+%<sample>\ProvidesFile{metasamp.tex}[2020/09/02 v1.1.2 sample for metastr]
%<*driver>
-\def\thedate#1{2020/02/06}\def\theversion#1{v1.0}
+\def\thedate#1{2020/09/02}\def\theversion#1{v1.1.2}
\ProvidesFile{metastr.dtx}[\thedate{} \theversion{} metastr reference manual file]
\PassOptionsToClass{10pt,a4paper}{article}
\documentclass{ltxdoc}
@@ -95,6 +95,7 @@ facilitate basic internationalisation and localisation.
\tableofcontents
\endgroup
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Introduction}
@@ -184,14 +185,20 @@ The basic set of registers consists of:
\\
|keywords| & (a list of) keywords describing the document
\\
+|titlematter| & composition register for title matter
+\\
|titletext| & composition register for title
+\\
+|authortext| & composition register for author
+\\
+|datatext| & composition register for location and date
\end{tabular}
\end{center}
%
The register |titletext| composes information
for printing the title
-(such as |title|, |subtitle|, |author|, |location| and |date|).
+(such as |title|, |subtitle| but also |author|, |location| and |date|).
It can serve a similar purpose as the \LaTeX{} command |\maketitle|.
Finally, there are some auxiliary registers:
@@ -212,6 +219,9 @@ name of the source file
\\
|draft| &
indicator of draft version
+\\
+|linebreak| &
+expands to linebreak when printed or space otherwise
\end{tabular}
\end{center}
%
@@ -231,7 +241,6 @@ it should therefore be set by the command:
The starred version declares the language for PDF metadata
rather than the document contents.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Working with Strings}
\label{sec:work}
@@ -313,6 +322,7 @@ see \secref{sec:language}.
Moreover, certain attributes related to the registers
could be stored in additional variants.
+\DescribeMacro{titletext}
For example, the register |titletext| exists in
the default variant (mainly intended for writing out metadata)
and the |print| variant
@@ -331,17 +341,20 @@ The |print| variant is accessed by the command:
|\metapick[print]{titletext}|
\end{center}
%
-It expands to four lines
-containing |title|, |subtitle| + |draft|, |author| and |location| + |date|
+It expands to two lines containing |title| and |subtitle| + |draft|
(as far as filled):
%
\begin{center}
\textit{title}\\
-\textit{subtitle} |\par| \textit{draft}\\
-\textit{author}\\
-\textit{location}, \textit{date}
+\textit{subtitle} |\par| \textit{draft}
\end{center}
%
+In fact, the legacy behaviour of |titletext|
+also adds two lines containing |author| and |location| + |date|,
+as in the new composition register |titlematter| to be explained below;
+this behaviour needs to be disabled explicitly
+for purposes of backwards compatibility
+by the package option |titlematter|.
The formatting style of each line is given
by the variant |style| of the first register on this line;
the vertical space above each line is
@@ -350,10 +363,29 @@ Two items on a single line are separated by the variant |sep|
of the second register;
an unfilled |sep| variant puts the two items on individual lines
(by default this applies to |subtitle| and |draft|).
-In this way the layout of the title display on the title page
-can be adjusted conveniently
-(by default it mimics the \LaTeX{} command |\maketitle|
-in the class \textsf{article}).
+
+\DescribeMacro{titlematter}
+The composition register |titlematter| (in |print| variant):
+%
+\begin{center}
+|\metapick[print]{titlematter}|
+\end{center}
+%
+collects extended information
+on the documents for display on the title page
+(it substitutes the \LaTeX{} command |\maketitle| in the class \textsf{article}
+whose display it mimics):
+%
+\begin{center}
+\textit{title}\\
+\textit{subtitle} |\par| \textit{draft}\\
+\textit{author}\\
+\textit{location}, \textit{date}
+\end{center}
+%
+By adjusting the definitions,
+the layout of the title display on the title page
+can be adjusted conveniently.
Variants are always specified by an argument |[|\textit{var}|]|
in square brackets preceding the register |{|\textit{reg}|}|.
@@ -411,6 +443,9 @@ When this register is accessed by
it will read the default variant of \textit{reg1}
which will pass on to \textit{reg2} in \textit{var}
(rather than in the default variant).
+A useful application within title declarations
+is |\metapick[#1]{linebreak}| which expands to a line break
+when the title is displayed and to a space when the title is used elsewhere.
\DescribeMacro{\metaifpick}
\DescribeMacro{\metacompose}
@@ -464,14 +499,18 @@ as |[|\textit{var}|]| is \emph{mandatory}:
%
Here, the default variant is accessed by an empty argument \textit{var}.
+\DescribeMacro{titletext}
+\DescribeMacro{\metatitleline}
+\DescribeMacro{\metatitlelinetwo}
To illustrate a construction using variants,
-let us consider the above register |titletext|.
+let us consider the above register |titletext|
+(with activated package option |titlematter|).
It is defined in the generic variant as:
%
\begin{center}
\begin{tabular}{l}
|\metaset{titletext}{%|\\
-| \metacompose[#1]{draft}{}{: }{}%|\\
+| \metacompose[#1]{draft}{}{\metaget[sep]{draft}}{}%|\\
| \metapick[#1]{title}%|\\
| \metacompose[#1]{subtitle}{\metaget[sep]{subtitle}}{}{}}|
\end{tabular}
@@ -486,9 +525,7 @@ The |print| variant to output a full title for the document is defined by:
\begin{tabular}{l}
|\metaset[print]{titletext}{%|\\
| \metatitleline[print]{title}%|\\
-| \metatitlelinetwo[print]{subtitle}[print]{draft}%|\\
-| \metatitleline[print]{author}%|\\
-| \metatitlelinetwo[print]{location}[print]{date}}|
+| \metatitlelinetwo[print]{subtitle}[print]{draft}|
\end{tabular}
\end{center}
%
@@ -510,6 +547,26 @@ this expands to the vertical skip defined by the variant |skip|
and an encapsulated paragraph of the register value
in the layout defined by the variant |style|.
+\DescribeMacro{authortext}
+\DescribeMacro{datetext}
+\DescribeMacro{titlematter}
+The composition registers |authortext| and |datetext| work in
+a similar fashion as |titletext| and compose
+the registers |author| and |location| + |date|, respectively.
+The composition register |titlematter| (in variant |print|)
+prints out the title, author and date information
+and serves a similar purpose as the \LaTeX{} command |\maketitle|:
+%
+\begin{center}
+\begin{tabular}{l}
+|\metaset{titlematter}{%|\\
+| \metapick[#1]{titletext}%|\\
+| \metapick[#1]{authortext}%|\\
+| \metapick[#1]{datatext}%|\\
+| \metaget[skip]{titlematter}}|
+\end{tabular}
+\end{center}
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Write Document Metadata}
\label{sec:meta}
@@ -528,7 +585,7 @@ and \textsf{hyperref} |\hypersetup| options is given by:
\begin{tabular}{l@{\quad$\to$\quad}l}
|titletext| & |pdftitle|
\\
-|author| & |pdfauthor|
+|authortext| & |pdfauthor|
\\
|subject| & |pdfsubject|
\\
@@ -538,6 +595,8 @@ and \textsf{hyperref} |\hypersetup| options is given by:
%
Here, |titletext| is used instead of |title| to compose information
from the registers |draft|, |title| and |subtitle| (as far as filled).
+Similarly, |authortext| composes information on the author,
+typically just |author|.
Note that |\metawritepdfinfo| will be effective
only when invoked before the contents of the first page are written out.
@@ -825,7 +884,7 @@ The appropriate license URL and CC logo is selected
by the command as well, e.g.
%
\begin{center}
-\includegraphics{doclicense-CC-by-sa}\\
+\includegraphics{doclicense-CC-by-sa-88x31}\\
\url{https://creativecommons.org/licenses/by-sa/4.0/}
\end{center}
%
@@ -1073,6 +1132,9 @@ display CC logo from \textsf{doclicense} package.
\item |cclogocurr=dollar|\textbar|euro|\textbar|yen|
(initially set to |dollar|) --
select currency symbol for Creative Commons NonCommercial logos.
+\item |cclogoshape=box|\textbar|slim|
+(initially set to |box|) --
+select shape of Creative Commons NonCommercial logos.
\item |xmppdfinfo|[|=true|\textbar|false|]
(no value implies |true|, initially set to |true|) --
write the basic PDF info block
@@ -1082,6 +1144,12 @@ if this option is set,
\item |draft|[|=true|\textbar|false|]
(no value implies |true|, initially set to |false|) --
fill |draft| register with ``DRAFT''.
+\item |titlematter|[|=true|\textbar|false|]
+(no value implies |true|, initially set to |false|) --
+when set to |true|, composition register |titletext|
+prints only the title; when set to |false|,
+|titletext| also prints authorship, location and date information
+(legacy behaviour).
\item |course|[|=true|\textbar|false|]
(no value implies |true|, initially set to |false|) --
Setup extended registers for course materials, see \secref{sec:extras}.
@@ -1103,6 +1171,15 @@ Available internationalisations currently consist of:
\end{itemize}
%
+Selected package options can be adjusted after the package
+has been loaded by the command:
+%
+\begin{center}
+|\metasetup{|\textit{opts}|}|
+\end{center}
+%
+Presently, only |draft| can be adjusted.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Extras}
\label{sec:extras}
@@ -1130,8 +1207,8 @@ upon setting the package option |course|:
\end{center}
%
-The variant |course| of the register |titletext| displays a
-compilation of these registers for display on a title page:
+The variant |course| of the register |titlematter| (or |titletext|)
+displays a compilation of these registers for display on a title page:
%
\begin{center}
\textit{course}\\
@@ -1224,13 +1301,13 @@ This package can use the package
\href{http://ctan.org/pkg/hyperxmp}{\textsf{hyperxmp}}
to write extended metadata to a PDF file.
Compatibility with the \textsf{hyperxmp} package
-has been tested with v4.1 (2019/04/05).
+has been tested with v5.4 (2020/06/19).
\item
This package can use the Creative Commons license icon files
included in the package
\href{http://ctan.org/pkg/doclicense}{\textsf{doclicense}}.
Compatibility with the \textsf{doclicense} package
-has been tested with v1.10.0 (2019/06/05).
+has been tested with v2.0.1 (2020/06/26).
\item
This package can use the Creative Commons license icon fonts
included in the package
@@ -1292,7 +1369,6 @@ or&|\metaunset[auto]{writepdf}|
\end{tabular}
\end{center}
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Feature Suggestions}
\label{sec:suggestions}
@@ -1312,11 +1388,66 @@ Further translations of copyright and license statements.
Export translations to files
\item
Make use of the \textsf{babel} package for translations of basic terms.
+% load babel when not only en?
+%\item
+%title translations via titletext?
+%\item
+%perhaps use \textsf{xparse} to generate robust commands for optional variants
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{Revision History}
+\iffalse
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{vXXX+:} YYYY/MM/DD+
+
+\begin{itemize}
+\item
+\ldots
+\end{itemize}
+
+\fi
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{v1.1.2:} 2020/09/02
+
+\begin{itemize}
+\item
+improve hook processing to set |pdflang| at the right moment
+\end{itemize}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{v1.1.1:} 2020/08/27
+
+\begin{itemize}
+\item
+introduce |skip| variant for |titlematter| register
+\item
+adjust hook to new \LaTeXe\ (2020-10) hook processing
+\end{itemize}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\paragraph{v1.1:} 2020/06/28
+
+\begin{itemize}
+\item
+|\metasetup| to adjust some package options (|draft|)
+\item
+|titlematter|, |authortext|, |datatext| composition registers added;
+legacy behaviour of |titletext| preserved,
+can be changed by package option |titlematter|
+\item
+|linebreak| register added
+\item
+fix saving of PDF info (|keeppdfinfo|) with updated \textsf{hyperxmp} package
+\item
+fix package options |hyperref|, |hyperxmp|, |checkdef|, |xmppdfinfo|
+\item
+fix compatibility with updated \textsf{doclicense} package (v2)
+\end{itemize}
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paragraph{v1.0:} 2020/02/06
@@ -1325,6 +1456,7 @@ Make use of the \textsf{babel} package for translations of basic terms.
first version, published on CTAN
\end{itemize}
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1380,20 +1512,20 @@ first version, published on CTAN
% Set some options for the \textsf{metastr} package:
% \begin{macrocode}
-\PassOptionsToPackage{draft}{metastr}
\PassOptionsToPackage{loadlang=en|de|fr|es}{metastr}
%%\PassOptionsToPackage{loadlang=en|fr|es}{metastr}
%%\PassOptionsToPackage{loadlang=de|en}{metastr}
\PassOptionsToPackage{cclogocurr=euro}{metastr}
+%%\PassOptionsToPackage{cclogoshape=slim}{metastr}
% \end{macrocode}
% Include the \textsf{metastr} package along with
% \textsf{graphicx}, \textsf{babel}
% and \textsf{ccicons} (where available):
% \begin{macrocode}
-\usepackage{metastr}
+\usepackage[titlematter]{metastr}
\usepackage{graphicx}
-\usepackage{babel}
+\usepackage[english]{babel}
\IfFileExists{ccicons.sty}{\usepackage{ccicons}}{}
% \end{macrocode}
@@ -1462,6 +1594,7 @@ first version, published on CTAN
\metaset{date}{2020/02/06}
\metaset{partof}{The metastr Package}
\metaset[print]{partof}{The \textsf{metastr} Package}
+\metasetup{draft=true}
% \end{macrocode}
% Copyright settings:
@@ -1504,7 +1637,7 @@ first version, published on CTAN
% \begin{macrocode}
\pdfbookmark[1]{\metaterm{title}}{title}
\begin{center}
-\metapick[print]{titletext}
+\metapick[print]{titlematter}
\end{center}
% \end{macrocode}
@@ -1611,6 +1744,7 @@ some representations of the selected license:
% \macro{checkdef}
% \macro{cclogo}
% \macro{cclogocurr}
+% \macro{cclogoshape}
% \macro{xmppdfinfo}
% Store the selected package options in some corresponding internal macros:
% \begin{macrocode}
@@ -1620,23 +1754,28 @@ some representations of the selected license:
\newif\ifmstr@opt@xmppdfinfo\mstr@opt@xmppdfinfotrue
\newif\ifmstr@opt@course\mstr@opt@coursefalse
\newif\ifmstr@opt@draft\mstr@opt@draftfalse
+\newif\ifmstr@opt@titlematter\mstr@opt@titlematterfalse
\newif\ifmstr@opt@cclogo\mstr@opt@cclogotrue
\def\mstr@opt@cclogocurr{dollar}
+\def\mstr@opt@cclogoshape{box}
\def\mstr@opt@loadlang{en}
\def\mstr@group{mstr@}
-\define@key{\mstr@group}{hyperref}[true]
- {\csname mstr@opt@hyperref#1\endcsname}
-\define@key{\mstr@group}{hyperxmp}[true]
- {\csname mstr@opt@hyperxmp#1\endcsname}
-\define@key{\mstr@group}{checkdef}[true]
- {\csname mstr@opt@checkdef#1\endcsname}
-\define@key{\mstr@group}{xmppdfinfo}[true]
- {\csname mstr@opt@xmppdfinfo#1\endcsname}
+\define@key{\mstr@group}{hyperref}[true]{%
+ \csname mstr@opt@hyperref#1\endcsname}
+\define@key{\mstr@group}{hyperxmp}[true]{%
+ \csname mstr@opt@hyperxmp#1\endcsname}
+\define@key{\mstr@group}{checkdef}[true]{%
+ \csname mstr@opt@checkdef#1\endcsname}
+\define@key{\mstr@group}{xmppdfinfo}[true]{%
+ \csname mstr@opt@xmppdfinfo#1\endcsname}
\define@key{\mstr@group}{cclogo}[true]{\csname mstr@opt@cclogo#1\endcsname}
\define@key{\mstr@group}{cclogocurr}{\def\mstr@opt@cclogocurr{#1}}
+\define@key{\mstr@group}{cclogoshape}{\def\mstr@opt@cclogoshape{#1}}
\define@key{\mstr@group}{loadlang}{\def\mstr@opt@loadlang{#1}}
\define@key{\mstr@group}{course}[true]{\csname mstr@opt@course#1\endcsname}
\define@key{\mstr@group}{draft}[true]{\csname mstr@opt@draft#1\endcsname}
+\define@key{\mstr@group}{titlematter}[true]{%
+ \csname mstr@opt@titlematter#1\endcsname}
% \end{macrocode}
% Pass undeclared options on to \textsf{keyval} processing:
@@ -1650,6 +1789,14 @@ some representations of the selected license:
\ProcessOptions
% \end{macrocode}
+% \macro{\metasetup}
+% |\metasetup| processes package options
+% when the package has already been loaded:
+% \begin{macrocode}
+\def\mstr@setup{mstr@setup}
+\newcommand{\metasetup}[1]{\setkeys\mstr@setup{#1}}
+% \end{macrocode}
+
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \subsection{Definitions}
% \label{sec:imp-def}
@@ -1666,6 +1813,7 @@ some representations of the selected license:
% \begin{macrocode}
\ifmstr@opt@hyperref\RequirePackage{hyperref}\fi
\ifmstr@opt@hyperxmp\RequirePackage{hyperxmp}\fi
+\ifmstr@opt@xmppdfinfo\ifdefined\xmptilde\hypersetup{keeppdfinfo}\fi\fi
% \end{macrocode}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1971,22 +2119,40 @@ some representations of the selected license:
% \end{macrocode}
% \macro{\mstr@begindoc}
+% \macro{\mstr@begindocpreamble}
% Hook for writing data to PDF file;
-% this is the last chance to write the preamble set of data to the PDF:
+% this is the last chance to write the preamble set of data to the PDF
+% (|pdflang| must be declared before \textsf{hyperxmp}
+% detects languages at the end of the preamble
+% and before \textsf{hyperref} sets it at the beginning of the document):
% \begin{macrocode}
\newcommand{\mstr@begindoc}{%
- \mstr@ifwritepdf[preamble]{\metawritepdfpreamble}%
- \mstr@ifwritepdf[auto]{\metawritepdf}%
-}
+ \mstr@ifwritepdf[auto]{\metawritepdf}}
+\newcommand{\mstr@begindocpreamble}{%
+ \mstr@ifwritepdf[preamble]{\metawritepdfpreamble}}
% \end{macrocode}
% Hook |\mstr@begindoc| to begining of |document| block
-% before all other hooks are called:
-% \begin{macrocode}
+% (before hooks by \textsf{hyperref} and \textsf{hyperxmp} are called,
+% just in case);
+% hook |\mstr@begindocpreamble| to begining of |document| block
+% before hooks by \textsf{hyperxmp} are called;
+% legacy code for latex releases earlier than 2020-10
+% to add hook before all other hooks are called:
+% \begin{macrocode}
+\ifdefined\AddToHook
+\DeclareHookRule{begindocument}{metastr}{before}{hyperref}
+\DeclareHookRule{begindocument}{metastr}{before}{hyperxmp}
+\AddToHook{begindocument}{\mstr@begindoc}
+\DeclareHookRule{begindocument/before}{metastr}{before}{hyperxmp}
+\AddToHook{begindocument/before}{\mstr@begindocpreamble}
+\else
+\AtBeginDocument{\mstr@begindoc}
\begingroup
-\toks@\expandafter{\expandafter\mstr@begindoc\@begindocumenthook}%
-\xdef\@begindocumenthook{\the\toks@}%
+\toks@\expandafter{\expandafter\mstr@begindocpreamble\@begindocumenthook}
+\xdef\@begindocumenthook{\the\toks@}
\endgroup
+\fi
% \end{macrocode}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -2003,11 +2169,14 @@ some representations of the selected license:
% \begin{macrocode}
\metadef{draft}
% \end{macrocode}
-% Set draft text (if |draft| option set):
+% Set draft text (if |draft| option set), declare |draft| option:
% \begin{macrocode}
-\ifmstr@opt@draft
-\metaset{draft}{\metatranslate[#1]{draft}}
-\fi
+\newcommand{\mstr@set@draft}{%
+ \ifmstr@opt@draft\metaset{draft}{\metatranslate[##1]{draft}}%
+ \else\metaunset{draft}\fi}
+\define@key{\mstr@setup}{draft}[true]{%
+ \csname mstr@opt@draft#1\endcsname\mstr@set@draft}%
+\mstr@set@draft
% \end{macrocode}
% \macro{title}
@@ -2028,13 +2197,28 @@ some representations of the selected license:
\metadef{keywords}
% \end{macrocode}
+% \macro{linebreak}
+% Declare an auxiliary register to break a line in |print| variant
+% and display a space otherwise:
+% \begin{macrocode}
+\metadef{linebreak}
+\metaset[]{linebreak}{ }
+\metaset[print]{linebreak}{\\}
+% \end{macrocode}
+
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \paragraph{Title Composition.}
+% \paragraph{Title and Author Composition.}
%
+% \macro{titlematter}
% \macro{titletext}
+% \macro{authortext}
+% \macro{datatext}
% Declare register to compose title display (analogous to |\maketitle|):
% \begin{macrocode}
+\metadef{titlematter}
\metadef{titletext}
+\metadef{authortext}
+\metadef{datatext}
% \end{macrocode}
% \macro{\metatitleline}
@@ -2074,19 +2258,45 @@ some representations of the selected license:
\metaset[skip]{date}{\vspace{1.5em}}
\metaset[sep]{subtitle}{ -- }
\metaset[sep]{date}{, }
+\metaset[sep]{draft}{: }
% \end{macrocode}
-% Preset for |titletext| in generic and |print| variants:
+% Preset for |titlematter|, |titletext|, |authortext| and |datatext|
+% in generic and |print| variants:
% \begin{macrocode}
\metaset{titletext}{%
- \metacompose[#1]{draft}{}{: }{}%
+ \metacompose[#1]{draft}{}{\metaget[sep]{draft}}{}%
\metapick[#1]{title}%
\metacompose[#1]{subtitle}{\metaget[sep]{subtitle}}{}{}}
+\metaset{authortext}{\metapick[#1]{author}}
+\metaset{datatext}{%
+ \metacompose[#1]{location}{}{\metaget[sep]{date}}{}%
+ \metapick[#1]{date}}
+\metaset{titlematter}{%
+ \metapick[#1]{titletext}%
+ \metapick[#1]{authortext}%
+ \metapick[#1]{datatext}%
+ \metaget[skip]{titlematter}}
\metaset[print]{titletext}{%
\metatitleline[print]{title}%
- \metatitlelinetwo[print]{subtitle}[print]{draft}%
- \metatitleline[print]{author}%
+ \metatitlelinetwo[print]{subtitle}[print]{draft}}
+\metaset[print]{authortext}{%
+ \metatitleline[print]{author}}
+\metaset[print]{datatext}{%
\metatitlelinetwo[print]{location}[print]{date}}
% \end{macrocode}
+% Legacy presets:
+% \begin{macrocode}
+\ifmstr@opt@titlematter\else
+\metaset{titlematter}{%
+ \metapick[#1]{titletext}%
+ \metaget[skip]{titlematter}}
+\metaset[print]{titletext}{%
+ \metatitleline[print]{title}%
+ \metatitlelinetwo[print]{subtitle}[print]{draft}%
+ \metapick[print]{authortext}%
+ \metapick[print]{datatext}}
+\fi
+% \end{macrocode}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \paragraph{Further Registers.}
@@ -2138,8 +2348,6 @@ some representations of the selected license:
% before the start of the document:
% \begin{macrocode}
\newcommand{\metawritepdfpreamble}{\ifdefined\hypersetup
- \ifmstr@opt@xmppdfinfo
- \ifdefined\xmptilde\hypersetup{keeppdfinfo}\fi\fi
\metaif[]{language}
{\hypersetup{pdflang={\metaget[]{language}}}}{}%
\ifdefined\xmptilde
@@ -2155,7 +2363,7 @@ some representations of the selected license:
% \begin{macrocode}
\newcommand{\metawritepdfinfo}{\ifdefined\hypersetup
\metaifpick[\mstr@lang@meta]{author}
- {\hypersetup{pdfauthor={\metapick[\mstr@lang@meta]{author}}}}{}%
+ {\hypersetup{pdfauthor={\metapick[\mstr@lang@meta]{authortext}}}}{}%
\metaifpick[\mstr@lang@meta]{title}
{\hypersetup{pdftitle={\metapick[\mstr@lang@meta]{titletext}}}}{}%
\metaifpick[\mstr@lang@meta]{subject}
@@ -2313,7 +2521,9 @@ some representations of the selected license:
\centerline{\metapick[#1]{licenselogo}}}
\metaset[cmd]{licenselogo}{\includegraphics{#1}}
\metaset[print]{licenselogo}{%
- \mstr@getbare[cmd]{licenselogo}{\metaget[]{licenselogo}}}
+ \IfFileExists{\metaget[]{licenselogo}.pdf}%
+ {\mstr@getbare[cmd]{licenselogo}{\metaget[]{licenselogo}}}%
+ {\mstr@getbare[cmd]{licenselogo}{\metaget[nocurr]{licenselogo}}}}
% \end{macrocode}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -2668,12 +2878,16 @@ some representations of the selected license:
\metaset[logo]{cc@by-nc-sa}{doclicense-CC-by-nc-sa}
\metaset[logo]{cc@by-nc-nd}{doclicense-CC-by-nc-nd}
% \end{macrocode}
-% Use euro sign versions:
+% Select currency versions:
% \begin{macrocode}
-\mstr@iftext\mstr@opt@cclogocurr{euro}{
-\metaset[logo]{cc@by-nc}{doclicense-CC-by-nc-eu}
-\metaset[logo]{cc@by-nc-sa}{doclicense-CC-by-nc-sa-eu}
-\metaset[logo]{cc@by-nc-nd}{doclicense-CC-by-nc-nd-eu}}
+\mstr@iftext\mstr@opt@cclogocurr{dollar}{\metaset[curr]{licenselogo}{}}
+\mstr@iftext\mstr@opt@cclogocurr{euro}{\metaset[curr]{licenselogo}{-eu}}
+\mstr@iftext\mstr@opt@cclogocurr{yen}{\metaset[curr]{licenselogo}{-jp}}
+% \end{macrocode}
+% Select shape versions:
+% \begin{macrocode}
+\mstr@iftext\mstr@opt@cclogoshape{box}{\metaset[shape]{licenselogo}{-88x31}}
+\mstr@iftext\mstr@opt@cclogoshape{slim}{\metaset[shape]{licenselogo}{-80x15}}
% \end{macrocode}
% \macro{\mstr@setcclogo}
@@ -2684,8 +2898,13 @@ some representations of the selected license:
\ifmstr@opt@cclogo
\IfFileExists{doclicense.sty}{%
\ifdefined\includegraphics
+ \IfFileExists{doclicense-CC-by-88x31.pdf}
+ {\metaset[size]{licenselogo}{-88x31}}{}
\metaset{licenselogo}{%
- \metapick[logo]{licensecc}}
+ \metapick[logo]{licensecc}\metaget[curr]{licenselogo}%
+ \metaget[shape]{licenselogo}}%
+ \metaset[nocurr]{licenselogo}{%
+ \metapick[logo]{licensecc}\metaget[shape]{licenselogo}}%
\fi}{\GenericWarning{please install package `doclicense'}}%
\fi}
% \end{macrocode}
@@ -2884,11 +3103,31 @@ some representations of the selected license:
% Fill |titletext| in |course| variant to display
% relevant title data for the course material:
% \begin{macrocode}
+\metaset[course]{titlematter}{%
+ \metapick[course]{titletext}%
+ \metapick[course]{datatext}%
+ \metapick[course]{authortext}%
+ \metaget[skip]{titlematter}}
\metaset[course]{titletext}{%
\metatitleline[print]{course}%
- \metatitlelinetwo[print]{material}[print]{draft}%
- \metatitlelinetwo[print]{institution}[print]{period}%
+ \metatitlelinetwo[print]{material}[print]{draft}}
+\metaset[course]{authortext}{%
\metatitleline[print]{instructor}}
+\metaset[course]{datatext}{%
+ \metatitlelinetwo[print]{institution}[print]{period}}
+% \end{macrocode}
+% Legacy presets:
+% \begin{macrocode}
+\ifmstr@opt@titlematter\else
+\metaset[course]{titlematter}{%
+ \metapick[course]{titletext}%
+ \metaget[skip]{titlematter}}
+\metaset[course]{titletext}{%
+ \metatitleline[print]{course}%
+ \metatitlelinetwo[print]{material}[print]{draft}%
+ \metapick[course]{datatext}%
+ \metapick[course]{authortext}}
+\fi
% \end{macrocode}
% Inherit title, subtitle, author and date:
diff --git a/Master/texmf-dist/source/latex/microtype/microtype-utf.dtx b/Master/texmf-dist/source/latex/microtype/microtype-utf.dtx
index 36b08620a2d..7bc673f3de8 100644
--- a/Master/texmf-dist/source/latex/microtype/microtype-utf.dtx
+++ b/Master/texmf-dist/source/latex/microtype/microtype-utf.dtx
@@ -1,11 +1,11 @@
%\iffalse meta-comment
% !Mode:: "TeX:DTX:UK"
% !smartQuote:: "English"
-% !DTXversion:: "2.7d"
+% !DTXversion:: "2.8"
% ------------------------------------------------------------------------
% The `microtype' package
% Subliminal refinements towards typographical perfection
-% Copyright (c) 2004--2019 R Schlicht <w.m.l@gmx.net>
+% Copyright (c) 2004--2020 R Schlicht <w.m.l@gmx.net>
%
% 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
@@ -26,7 +26,7 @@
%
\ProvidesFile
%<*driver>
- {\jobname.dtx}[2019/11/18 v2.7d]
+ {\jobname.dtx}[2020/12/07 v2.8]
%</driver>
%<CharisSIL> {mt-CharisSIL.cfg}[2017/07/07 v1.1 microtype config. file: Charis SIL (RS)]
%<LatinModernRoman> {mt-LatinModernRoman.cfg}[2013/03/13 v1.0 microtype config. file: Latin Modern Roman (RS)]
@@ -113,6 +113,7 @@ luatexbase.add_to_callback("pre_linebreak_filter", nodeprocessor, "replace missi
% \fi
%\StopEventually{}
%
+% ^^A -------------------------------------------------------------------------
%\GeneralChanges{Documentation}
%\changes{v2.5a}{2013/05/15}{include OpenType configuration files}
%\changes{v2.6}{2015/12/07}{missing characters printed with Charis <SIL>}
diff --git a/Master/texmf-dist/source/latex/microtype/microtype.dtx b/Master/texmf-dist/source/latex/microtype/microtype.dtx
index 9f92e7296f9..698eec07723 100644
--- a/Master/texmf-dist/source/latex/microtype/microtype.dtx
+++ b/Master/texmf-dist/source/latex/microtype/microtype.dtx
@@ -1,11 +1,11 @@
%\iffalse meta-comment
% !Mode:: "TeX:DTX:UK"
% !smartQuote:: "English"
-% !DTXversion:: "2.7d"
+% !DTXversion:: "2.8"
% ------------------------------------------------------------------------
% The `microtype' package
% Subliminal refinements towards typographical perfection
-% Copyright (c) 2004--2019 R Schlicht <w.m.l@gmx.net>
+% Copyright (c) 2004--2020 R Schlicht <w.m.l@gmx.net>
%
% 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
@@ -37,7 +37,7 @@
%<luatex-def> {microtype-luatex.def}
%<xetex-def> {microtype-xetex.def}
%<*package|letterspace|m-t|pdftex-def|luatex-def|xetex-def>
- [2019/11/18 v2.7d
+ [2020/12/07 v2.8
%<package> Micro-typographical refinements
%<letterspace> Robust letterspacing
%<m-t> microtype main configuration file
@@ -51,8 +51,8 @@
%<luafile>local microtype = microtype
%<luafile>microtype.module = {
%<luafile> name = "microtype",
-%<luafile> version = "2.7d",
-%<luafile> date = "2019/11/18",
+%<luafile> version = "2.8",
+%<luafile> date = "2020/12/07",
%<luafile> description = "microtype module.",
%<luafile> author = "E. Roux, R. Schlicht and P. Gesang",
%<luafile> copyright = "E. Roux, R. Schlicht and P. Gesang",
@@ -91,7 +91,7 @@
\def\SourceSansPro@scale{1.02}
\def\ttdefault{blg}
{\ttfamily\selectfont
- \DeclareFontShape{T1}{blg}{k}{n}{<-> ssub * blg/b/n}{}}
+ \DeclareFontShape{T1}{blg}{eb}{n}{<-> ssub * blg/b/n}{}}
\usepackage{textcomp}
\usepackage{iftex}
%<*!docsty>
@@ -192,11 +192,11 @@
\def\PackageFont{\sffamily}
\def\match{\textbullet}
\usepackage{amssymb} % \varnothing
- \let\OrigTeX\TeX
+ \expandafter\let\expandafter\OrigTeX\csname TeX \endcsname
\DeclareRobustCommand\TeX{\textoractual{\OrigTeX}{TeX}}
\setlength\textheight{49\baselineskip}
\else
- \def\bfdefault{b}
+ \let\bfdefault\bfdefault@previous % undo mathdesign's \def\bdefault{b}
\def\Module#1{{\color{theblue}\textoractual{$\langle$}{<}\textit{#1}\textoractual{$\rangle$}{>}}}
\DeclareRobustCommand\TeX{\textoractual{T\kern-.1em\lower.4ex\hbox{E}\kern-.075emX\@}{TeX}}
\DeclareRobustCommand\LaTeX{\textoractual{L\kern-.26em{\sbox\z@ T\vbox to\ht\z@{%
@@ -206,6 +206,7 @@
\def\match{{\large\raisebox{-.15em}{\textbullet}}}
{\catcode`\`=\active % indiscernible from ' in Bitstream Letter Gothic
\g@addto@macro\macro@code{\let`\textasciigrave}}
+ \DeclareEncodingSubset{TS1}{blg}{1} % for \textasciigrave
\linespread{1.07}\normalfont
\setlength\textheight{48\baselineskip}
\fi
@@ -217,15 +218,15 @@
\def\section{\@startsection {section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
- {\normalfont\Large\ifcmr\fontseries{bx}\else\fontseries{k}\fi\sffamily\color{sectioning}}}
+ {\normalfont\Large\ifcmr\fontseries{bx}\else\fontseries{eb}\fi\sffamily\color{sectioning}}}
\def\subsection{\@startsection{subsection}{2}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
- {\normalfont\large\ifcmr\fontseries{bx}\else\fontseries{k}\fi\sffamily\color{sectioning}}}
+ {\normalfont\large\ifcmr\fontseries{bx}\else\fontseries{eb}\fi\sffamily\color{sectioning}}}
\def\subsubsection{\@startsection{subsubsection}{3}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
- {\normalfont\normalsize\ifcmr\fontseries{bx}\else\fontseries{k}\fi\sffamily\color{sectioning}}}
+ {\normalfont\normalsize\ifcmr\fontseries{bx}\else\fontseries{eb}\fi\sffamily\color{sectioning}}}
\def\paragraph{\@startsection{paragraph}{4}%
{0pt}{8pt plus 2pt minus 1pt}{-1em}%
{\normalfont\normalsize\itshape}}
@@ -559,7 +560,8 @@
colorlinks,linkcolor=theblue,citecolor=theblue,urlcolor=thered,
hyperindex=false,hyperfootnotes=false]
{hyperref}
- \usepackage{hyperxmp}
+ \PassOptionsToPackage{nodvi}{totpages} % remove annoying log output
+ \usepackage{hyperxmp} % (hyperxmp loads totpages)
\usepackage{attachfile}
\usepackage{pdfpages}
\hypersetup{
@@ -569,7 +571,7 @@
pdfkeywords={TeX, LaTeX, pdfTeX, LuaTeX, XeTeX, typography, micro-typography,
character protrusion, margin kerning, optical alignment, font expansion,
font scaling, hz, kerning, spacing, glue, letterspacing, tracking, ligatures},
- pdfcopyright={\textcopyright\ 2004--2019 R Schlicht\012%
+ pdfcopyright={\textcopyright\ 2004--2020 R Schlicht\012%
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.\012%
@@ -607,7 +609,7 @@
\href{https://www.ctan.org/pkg/#1}{\nolinkurl{pkg/#1}}}
\DeclareRobustCommand\mailto[1]{\href{mailto:#1}{\nolinkurl{#1}}}
\def\mailtoRS{\href % some PDF viewers don't like spaces:
- {mailto:<w.m.l@gmx.net>\%20Robert\%20Schlicht?subject=[microtype\%20\fileversion]}
+ {mailto:Robert\%20Schlicht\%3cw.m.l@gmx.net\%3e?subject=[microtype\%20\fileversion]}
{\texttt{w.m.l@gmx.net}}}
% the samples in the introduction, utilising nested optional content groups (aka. layers):
\ifnum\pdftexversion<140 \else
@@ -812,7 +814,7 @@
% other extensions (see section~\ref{sec:lettersp}).
%
%\bigskip\noindent
-% This package is copyright \textcopyright\ 2004\kern.09em--2019 R Schlicht.
+% This package is copyright \textcopyright\ 2004\kern.09em--2020 R Schlicht.
% It may be distributed and/or modified under the conditions of the
% \IfFileExists{lppl.tex}{\hyperref[LPPL:LPPL]}{\href{http://www.latex-project.org/lppl/}}
% {\LaTeX\ Project Public License},
@@ -823,7 +825,7 @@
%
%\newpage
%\emptypdfpageresources ^^A layers of the logo
-%{\sffamily\def\familydefault{\sfdefault}\ifcmr\else\def\bfdefault{sb}\fi
+%{\sffamily\def\familydefault{\sfdefault}\ifcmr\else\DeclareFontSeriesDefault[sf]{bf}{sb}\fi
% \tableofcontents
% \listoftables
%}
@@ -972,8 +974,8 @@
% the well-known |key=value| syntax. In the following, you will find a
% description of all \key{keys} and their possible |values|
% (`|true|' may be omitted; multiple values, where allowed, must be enclosed in
-% braces; the default value is shown on the right, preceded by an asterisk
-% if it is contingent on the \TeX\ engine, version and/or the output mode).
+% braces; the default value is shown on the right -- if preceded by an asterisk,
+% this default only applies when running an up-to-date \pdftex\ in <PDF> mode).
%
%
%\subsection{Enabling the micro-typographic features}\label{sub:options-microtype}
@@ -989,7 +991,7 @@
% output mode (see section~\ref{sub:options-misc}), or with \xetex.
% In other words, \microtype\ will try to apply as much micro-typography as
% can safely be expected to work under the respective conditions (hence, it is
-% usually not necessary to load the package with different options for <PDF>
+% usually not necessary to load the package with different options, \eg, for <PDF>
% resp. <DVI> mode).
%
% Protrusion and expansion may be enabled or disabled independently from each
@@ -1068,15 +1070,15 @@
% & $\less$ 0.14f & <DVI>/<PDF> & _ & _ & _ & _ & _ & _\\
% & $\geq$ 0.14f & <DVI>/<PDF> & ! & ? & _ & _ & _ & _\\
% & $\geq$ 1.20 & <DVI> & ! & ? & _ & _ & _ & _\\
-% & & <PDF> & ! & ! & ! & _ & _ & _\\
+% & & <PDF> & ! & ? & ! & _ & _ & _\\
% & $\geq$ 1.40 & <DVI> & ! & ? & _ & ? & ? & _\\
-% & & <PDF> & ! & ! & ! & ? & ? & ?\\^^A\,\textsuperscript{\itshape a}\\
+% & & <PDF> & ! & ? & ! & ? & ? & ?\\
%\cmidrule(r){1-3}
-% \luatex ^^A we will have to re-model kerning, spacing and tracking with \luatex
+% \luatex ^^A we will have to re-model kerning and spacing with \luatex
% & $\geq$ 0.30 & <DVI> & ! & ? & _ & _ & _ & _\\
-% & & <PDF> & ! & ! & ! & _ & _ & _\\
-% & $\geq$ 0.62 & <DVI> & ! & ? & ?\,\textsuperscript{\itshape a} & _ & _ & ?\,\textsuperscript{\itshape a}\\
-% & & <PDF> & ! & ! & ! & _ & _ & ?\\
+% & & <PDF> & ! & ? & ! & _ & _ & _\\
+% & $\geq$ 0.62 & <DVI> & ! & _ & \hskip1em\llap{(}\textcolor{theblue}{$\boxtimes$})\textsuperscript{\itshape a} & _ & _ & ?\\
+% & & <PDF> & ! & _ & ! & _ & _ & ?\\
%\cmidrule(r){1-3}
% \let\textoractual\@firstoftwo ^^A why?
% \xetex
@@ -1084,14 +1086,13 @@
%\bottomrule
%\end{tabular}^^A
%\vskip4pt\footnotesize
-%\hskip-.8em
+%\hskip-1em
% ! = enabled\quad
% ? = not enabled\quad
% _ = not available
%\hfill
-% ^^A \textit{a}\quad $\geq$ 1.40.4 recommended
-% \textit{a}\quad for legacy (<TFM>) fonts only
-%\vskip3pt
+% \textit{a}\quad by means of variable tracking\hskip1em
+%\vskip4pt
%\end{minipage}^^A
%}\kern-\dimexpr\fboxsep+\fboxrule\relax ^^A end \fcolorbox
%\end{table}
@@ -1138,7 +1139,13 @@
% instances of the fonts may be calculated automatically and at run-time instead
% of the user having to prepare them in advance. This option is true
% by default provided that you are using a \TeX\ engine with this capability
-% and the output mode is <PDF>.
+% and the output mode is <PDF>.\footnote{
+% With \pdftex, automatic font expansion does not work with bitmap fonts.
+% Therefore, if you are using the Computer Modern Roman fonts in <T1> encoding,
+% you should either install the \pkg{cm-super} package or use the Latin Modern
+% fonts (package \pkg{lmodern}).}
+%\changes{v1.9}{2005/08/27}{add remark about Type\,1 fonts required for
+% automatic font expansion}
% If \opt{auto} is set to false, the font instances for all expansion steps must exist
% (with files called \meta{font~name}\texttt{\textpm}\meta{expansion value},
% \eg, \file{cmr12+10}, as described in the \cite{pdftexman}).
@@ -1146,23 +1153,17 @@
% If expanded instances of the fonts are available, they will be used
% regardless whether \opt{auto} is true or not.
%\fi
+% With \luatex, expansion is always automatic.
%
-%\changes{v1.9}{2005/08/27}{add remark about Type\,1 fonts required for
-% automatic font expansion}
-% With \pdftex, automatic font expansion does not work with bitmap fonts. Therefore, if you
-% are using the Computer Modern Roman fonts in <T1> encoding,
-%\iffalse
-% \footnote{
-% En passant, it may be noted that Type\,1 format and <T1> encoding are in
-% no other way related than that both start with a `T' and end with a `1'.}
-%\fi
-% you should either install the \pkg{cm-super} fonts or use the Latin Modern
-% fonts (package \pkg{lmodern}).
-%\changes{v2.7}{2017/07/06}{add remark about automatic font expansion with \texttt{dvilualatex}}
-% With \luatex, expansion is always automatic, and also works in <DVI> mode
-% (|dvilualatex|), however, because postprocessing programs like |dvips|
-% or |dvipdfmx| are not (yet) capable of dealing with OpenType fonts,
-% only for legacy fonts.
+% When generating <DVI> files, font expansion has to be enabled explicitly.
+% With \pdftex, \emph{automatic} font expansion will not work because
+% the postprocessing drivers (|dvips|, |dvipdfm|, etc.) resp. the <DVI> viewer
+% are not able to generate the fonts on the fly.
+%^^A\changes{v2.7}{2017/07/06}{add remark about automatic font expansion with \texttt{dvilualatex}}
+%\changes{v2.8}{2020/02/09}{squash fake news about automatic font expansion with \texttt{dvilualatex}}^^A
+% With \luatex, on the other hand, expansion in <DVI> mode is realised by
+% modifying the inter-letter spacing (tracking) instead of the glyphs
+% themselves, which may or may not be desired.
%
%\medskip
%\Describe{Option}{stretch}{:integer}[20]
@@ -1212,36 +1213,11 @@
% to +1000.
%
%
-%\enlargethispage{\baselineskip} ^^A layout
%\subsection{Miscellaneous options}\label{sub:options-misc}
%
-%\Describe{Option}{DVIoutput}{true,*false}
-% \pdftex\ and \luatex\ are not only able to generate <PDF> output but can also
-% spit out <DVI> files.\footnote{
-% All recent \TeX\ systems are using \pdftex\ as the default engine also for
-% <DVI> output.}
-% The latter can be ordered with the option \opt{DVIoutput}, which will set
-% \cmd\pdfoutput\ to zero.
-% For \xetex, this option is not applicable.
-%
-%\changes{v1.5}{2004/12/15}{add note about \opt{DVIoutput} option}
-% Note that this will confuse packages that depend on the value of
-% \cmd\pdfoutput\ if they were loaded earlier, as they had been made believe
-% that they were called to generate <PDF> output where they actually weren't.
-% These packages are, among others: \pkg{graphics}, \pkg{color},
-% \pkg{hyperref}, \pkg{pstricks} and, obviously, \pkg{ifpdf}. Either load these
-% packages after \microtype\ or else issue the command |\pdfoutput=0| earlier
-% -- in the latter case, the \opt{DVIoutput} option is redundant.
-%
-% When generating <DVI> files, font expansion has to be enabled explicitly.
-% With \pdftex, neither letterspacing nor \emph{automatic} font expansion will work because
-% the postprocessing drivers (|dvips|, |dvipdfm|, etc.) resp. the <DVI> viewer
-% are not able to generate the fonts on the fly.
-%
%\changes{v2.0}{2006/11/28}{add remark about `\opt{draft}' option disabling \microtype\
% (noted by \contributor Michalis Miatidis <miatidis\at informatik.rwth-aachen.de>)}
% ^^A private mail, 2006/11/26
-%\medskip
%\Describe{Option}{draft}{true,!false}
%\DescribeOption{final}
% If the \opt{draft} option is passed to the package, \emph{all
@@ -1276,6 +1252,31 @@
% You can have a different configuration file loaded instead by specifying its
% name \emph{without the extension}, \eg, |config=mycrotype|.
%
+%\medskip
+%\Describe{Option}{DVIoutput}{true,*false}
+% \pdftex\ and \luatex\ are not only able to generate <PDF> output but can also
+% spit out <DVI> files. In fact, all recent \TeX\ systems are using \pdftex\ as
+% the default engine also for <DVI> output, and \luatex\ too can be called
+% in <DVI> mode. However, since changing the output mode inside the document
+% may have undesired effects, this option should be considered deprecated;
+% instead, it is recommended to just call the respective program (|latex| resp.
+% |dvilualatex|).
+%\changes{v2.8}{2020/04/02}{declare \opt{DVIoutput} option deprecated}
+% For \xetex, this option is not applicable.
+%
+%\iffalse
+%\changes{v1.5}{2004/12/15}{add note about \opt{DVIoutput} option}
+% The latter can be ordered with the option \opt{DVIoutput}, which will set
+% \cmd\pdfoutput\ to zero.
+% Note that this will confuse packages that depend on the value of
+% \cmd\pdfoutput\ if they were loaded earlier, as they had been made believe
+% that they were called to generate <PDF> output where they actually weren't.
+% These packages are, among others: \pkg{graphics}, \pkg{color},
+% \pkg{hyperref}, \pkg{pstricks} and, obviously, \pkg{ifpdf}. Either load these
+% packages after \microtype\ or else issue the command |\pdfoutput=0| earlier
+% -- in the latter case, the \opt{DVIoutput} option is redundant.
+%\fi
+%
%\iffalse ^^A ... waiting for bug reports before documenting yet another option ...
%\medskip
%\Describe{Option}{defersetup}{!true,false}
@@ -1301,7 +1302,7 @@
% expansion settings with a |context| keyword are encountered. If these
% settings are loaded after the preamble, however, it is too late, and you
% should set the \opt{copyfonts} option manually.
-% This only works with \pdftex\ 1.40.4 or later.
+% This only works with \pdftex\ 1.40.4 or later, or \luatex.
%\fi
%
%
@@ -1413,20 +1414,13 @@
% normal font. Size selection commands are possible, too, however, ranges are
% not allowed.
%
-%\medskip\noindent
-% Table~\ref{tab:predefined-font-sets} lists the eleven predefined font sets.
-% They may also be activated by passing their name to the feature options
-% \opt{protrusion}, \opt{expansion}, \opt{tracking}, \opt{kerning} and
-% \opt{spacing} when loading the package, for example:
-%\begin{verbatim}
-%\usepackage[protrusion=allmath,tracking=smallcaps]{microtype}
-%\end{verbatim}
-%
+%\newcounter{nrfontsets}
%\begin{table}\microtypesetup{protrusion=false}\small
%\caption{Predefined font sets}\label{tab:predefined-font-sets}
%\catcode`\!=13 \def!{\textcolor{thered}{$\varnothing$}}
%\catcode`\/=13 \def/#1/{\textcolor{thegreen}{#1}}
%\def<#1>{\textcolor{theblue}{\acronym{#1}}}
+%\def\s#1{|#1|\stepcounter{nrfontsets}}
%\setlength\fboxsep{4pt}
%\leavevmode\kern-\dimexpr\fboxsep+\fboxrule\relax
%\fcolorbox{theframe}{white}{^^A
@@ -1443,56 +1437,56 @@
% & \footnotesize Size\\
%\cmidrule(r){1-1}\cmidrule(r){2-2}\cmidrule(r){3-3}
%\cmidrule(r){4-4}\cmidrule(r){5-5}\cmidrule{6-6}
-% |all|
+% \s{all}
% & !
% & !
% & !
% & !
% & ! \\
%\cmidrule(r){1-1}
-% |alltext|\linebreak(|allmath|)
+% \s{alltext}\linebreak(\s{allmath})
% & Text encodings, <TS1>\linebreak (<OML>, <OMS>, <U>)
% & !
% & !
% & !
% & ! \\
%\cmidrule(r){1-1}
-% |alltext-nott|\linebreak(|allmath-nott|)
+% \s{alltext-nott}\linebreak(\s{allmath-nott})
% & Text encodings, <TS1>\linebreak (<OML>, <OMS>, <U>)
% & /\cmd\rm|*|/,\linebreak/\cmd\sf|*|/
% & !
% & !
% & ! \\
%\cmidrule(r){1-1}
-% |basictext|\linebreak(|basicmath|)
+% \s{basictext}\linebreak(\s{basicmath})
% & Text encodings \linebreak (<OML>, <OMS>)
% & /\cmd\rm|*|/,\linebreak/\cmd\sf|*|/
% & /\cmd\md|*|/
% & !
% & /\cmd\normalsize/, /\cmd\footnotesize/, /\cmd\small/, /\cmd\large/\\
%\cmidrule(r){1-1}
-% |smallcaps|
+% \s{smallcaps}
% & Text encodings
% & !
% & !
% & /\cmd\sc|*|/,/si/,/scit/
% & ! \\
%\cmidrule(r){1-1}
-% |footnotesize|
+% \s{footnotesize}
% & Text encodings, <TS1>
% & !
% & !
% & !
% & |-|/\cmd\small/\\
%\cmidrule(r){1-1}
-% |scriptsize|
+% \s{scriptsize}
% & Text encodings, <TS1>
% & !
% & !
% & !
% & |-|/\cmd\footnotesize/\\
%\cmidrule(r){1-1}
-% |normalfont|
+% \s{normalfont}
% & /\cmd\encoding|*|/
% & /\cmd\family|*|/
% & /\cmd\series|*|/
@@ -1504,11 +1498,23 @@
% `Text encodings' = <OT1>, <T1>, <T2A>, <LY1>, <OT4>, <QX>, <T5>, <EU1>, <EU2>, <TU>
%\hfill
% `/\bslash\,\dots|*|/' = `/\bslash\,\dots|default|/'
-%\vskip3pt
+%\vskip4pt
%\end{minipage}^^A
%}\kern-\dimexpr\fboxsep+\fboxrule\relax ^^A end \fcolorbox
+%\ifcase\c@nrfontsets\or\or\or\or\or\or\or\or\or\or\or
+% \def\@currentlabel{eleven}\or \def\@currentlabel{twelve}\else
+% \PackageError{\MT@MT}{I cannot count any further}{}\fi\label{nrfontsets}
%\end{table}
%
+%\medskip\noindent
+% Table~\ref{tab:predefined-font-sets} lists the \ref*{nrfontsets} predefined font sets.
+% They may also be activated by passing their name to the feature options
+% \opt{protrusion}, \opt{expansion}, \opt{tracking}, \opt{kerning} and
+% \opt{spacing} when loading the package, for example:
+%\begin{verbatim}
+%\usepackage[protrusion=allmath,tracking=smallcaps]{microtype}
+%\end{verbatim}
+%
%\ifcmr\else\pagebreak\fi ^^A layout
%\medskip
%\Describe{Macro}{\UseMicrotypeSet}{?features,set name}
@@ -1521,8 +1527,8 @@
%\Describe{Macro}{\DeclareMicrotypeSetDefault}{?features,set name}
% If a feature is enabled but no font set has been chosen explicitly, the sets
% declared by this command will be activated. By default, the `|alltext|' font
-% set will be used for character protrusion and additional kerning, the
-% `|basictext|' set for font expansion and interword spacing, and the
+% set will be activated for character protrusion and additional kerning, the
+% `|alltext-nott|' set for font expansion and interword spacing, and the
% `|smallcaps|' set for tracking.
%
%\medskip\noindent
@@ -1625,7 +1631,7 @@
% (since the value that comes last will take precedence). Font settings
% will be loaded recursively.
% The following options will affect all loaded lists, in other words,
-% any options from the loaded lists will be ignored:
+% any options from the loaded lists will be ignored:\looseness=-1 ^^A layout
%\changes{v1.8}{2005/06/23}{add example for \texttt{factor} option}
% \item[\key{factor}] This option can be used to influence all protrusion
% factors of the list, overriding any global \opt{factor} setting (see
@@ -1736,12 +1742,13 @@
% This paragraph contains a `fussy' widow.}
%\end{verbatim}
% This method of employing contexts to temporarily apply different
-% expansion parameters only works with \pdftex\ version 1.40.4 or later.^^A
+% expansion parameters only works with \pdftex\ version 1.40.4 or later,^^A
% \footnote{For older versions, a dirty trick is laid out in
% section~\ref{ssec:font-setup} on page~\pageref{exp-hack}.}
-% Also note that \pdftex\ prohibits the use of fonts with different expansion
+% or with \luatex.
+% Also note that both \pdftex\ and \luatex\ prohibit the use of fonts with different expansion
% limits or steps (even of different fonts) within one paragraph, hence
-% the |sloppy| context has to be applied to complete paragraphs.
+% the |sloppy| context would have to be applied to complete paragraphs.
% \item[\key{factor}]
% This option provides a different method to alter expansion settings for
% certain fonts, working around the restriction just mentioned. The
@@ -1936,7 +1943,7 @@
% is, whenever a particular character appears in the text, the specified
% kerning will be inserted, regardless of which character precedes resp.
% follows it.
-% (Put in another way, this feature allows to modify the left or right
+% (Put differently, this feature allows modifying the left or right
% \textit{sidebearings} of specific glyphs.)
%
%\emptypdfpageresources ^^A layers of letterspacing illustration
@@ -2116,6 +2123,7 @@
% This package ships with configuration files for a number of font families.
% Table~\ref{tab:fonts} lists them all.
%
+%\enlargethispage{\baselineskip} ^^A layout
%\begin{table}[t]\small
%\changes{v1.6a}{2005/02/02}{add table of fonts with tailored protrusion settings}
%\caption{Fonts with tailored protrusion settings}\label{tab:fonts}
@@ -2125,10 +2133,10 @@
%\begin{minipage}{\textwidth}
%\def\arraystretch{1.2}
%\long\def\@makefntext#1{%
-% \leftskip 0pt
-% \parindent 0pt
-% \everypar{\parindent 0pt}%
-% \leavevmode\hbox to 15pt{\@thefnmark\hss}#1}
+% \leftskip 1em
+% \parindent -1em
+% \everypar{\parindent -1em}%
+% \leavevmode\hbox to 1em{\@thefnmark\hss}#1}
%\let\footnoterule\relax
%\def\fnref#1{\textsuperscript{\itshape\ifpdf\ref*{#1}\else\ref{#1}\fi}}
%\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}*3l@{}}
@@ -2141,7 +2149,7 @@
% Generic
% & <OT1>, <T1>, <T2A>, <LY1>, <QX>, (<TS1>)\footnote{Incomplete\label{fn:incmpl}}
% & n, (it, sl, sc)\fnref{fn:incmpl} \\
-% Computer Modern Roman (|cmr|)\footnote{Aliases: Latin Modern (|lmr|),
+% Computer Modern Roman (|cmr|)\footnote{Aliases: Latin Modern Roman (|lmr|),
% \pkg{ae} (|aer|), \pkg{zefonts} (|zer|),
% \pkg{eco} (|cmor|), \pkg{hfoldsty} (|hfor|)}
% & <OT1>, <OT4>, <T1>, <T2A>, <T5>, <LY1>, <TS1>
@@ -2164,15 +2172,15 @@
% & n, it, (sl)\fnref{fn:it-sl}, sc, si\\
% Palatino (|ppl|, |pplx|, |pplj|)\footnote{Aliases: \pkg{pxfonts} (|pxr|),
% \pkg{qfonts}/QuasiPalatino, \TeX\ Gyre Pagella (|qpl|),
-% \pkg{newpx}, <FPL> Neu (|fp9x|, |fp9j|)}
+% \pkg{newpx}, <FPL> Neu (|fp9x|, |fp9j|), \pkg{domitian}}
% & <OT1>, <OT4>, <T1>, <LY1>, (<TS1>)\fnref{fn:incmpl}
% & n, it, (sl)\fnref{fn:it-sl}, sc \\
% Times (|ptm|, |ptmx|, |ptmj|)\footnote{Aliases: \pkg{txfonts} (|txr|),
% \pkg{qfonts}/QuasiTimes, \TeX\ Gyre Termes (|qtm|),
-% \pkg{newtx}, \pkg{tempora}}
+% \pkg{newtx}, \pkg{tempora}, \pkg{step}, \pkg{stix}/\pkg{stix2}}
% & <OT1>, <OT4>, <T1>, <LY1>, <QX>, (<TS1>)\fnref{fn:incmpl}
% & n, it, (sl)\fnref{fn:it-sl}, sc \\
-% Latin Modern Roman
+% Latin Modern Roman\footnote{Alias: New Computer Modern}
% & <EU1>/<2>, <TU> [Latin, Greek]
% & n, it, (sl)\fnref{fn:it-sl}\\
% Charis <SIL>
@@ -2183,7 +2191,7 @@
% & <EU1>/<2>, <TU> [Latin, Cyrillic, Greek]
% & n, it, sc, si\\
%\fi
-% Palatino Linotype\footnote{Aliases: \TeX\ Gyre Pagella, Palatino <LT> Std, Palatino}
+% Palatino Linotype\footnote{Aliases: \TeX\ Gyre Pagella, Palatino <LT> Std, Palatino, Domitian}
% & <EU1>/<2>, <TU> [Latin]
% & n, it, sc\\
% Computer Modern math (|cmsy|, |cmm|)\footnote{Aliases: Latin Modern (|lmsy|, |lmm|)}
@@ -2619,8 +2627,8 @@
%\end{verbatim}
% This error message will occur if you are trying to employ font expansion
% while creating <DVI> output. Remember that \emph{automatic} font expansion
-% only works when running \pdftex\ in <PDF> mode. Although expansion is also
-% possible in <DVI> mode, it requires that all instances of the expanded fonts
+% only works when running \pdftex\ or \luatex\ in <PDF> mode. Although expansion is also
+% possible in <DVI> mode with \pdftex, it requires that all instances of the expanded fonts
% exist on your \TeX\ system.
%
%\changes{v2.2}{2007/06/13}{add hint about error message with \pdftex\ 1.40}
@@ -2652,7 +2660,7 @@
% distributions, this can be changed in the file \file{updmap.cfg} by setting
% |pdftexDownloadBase14| to |true|.
%
-%\pagebreak ^^A layout
+%\ifcmr\else\pagebreak\fi ^^A layout
%\changes{v1.9a}{2005/11/15}{add explanation for error message with non-Type\,1 fonts}
% \item
%\begin{verbatim}
@@ -2871,10 +2879,14 @@
% \contributor Phelype Oleinik <phe.h.o1\at gmail.com>,
% \contributor Falk Hanisch <falk.hanisch\at tu-dresden.de>,
% \contributor Markus Kohm <komascript\at gmx.info>,
-% \contributor Paolo Polesana <@\at @>, ^^A https://tex.stackexchange.com/users/95083/paolo-polesana
-% \contributor Oliver Kopp <koppdev\at gmail.com>
+% \contributor Paolo Polesana <@\at @>, ^^A https://tex.stackexchange.com/users/95083/paolo-polesana
+% \contributor Oliver Kopp <koppdev\at gmail.com>,
+% \contributor Hironori Kitagawa <h_kitagawa2001\at yahoo.co.jp>,
+% `\contributor d909 <@\at @>', ^^A https://tex.stackexchange.com/users/176404/d909
+% \contributor Daniel Benjamin Miller <dbmiller\at dbmiller.org>,
+% \contributor Md Ayquassar <mdayq0\at lenta.ru>
% and
-% \contributor Hironori Kitagawa <h_kitagawa2001\at yahoo.co.jp>.
+% \contributor Marcel Kr\"uger <tex\at 2krueger.de>.
%
%
%\iffalse
@@ -2946,9 +2958,9 @@
% \newblock (Online at \url{http://www.tug.org/TUGboat/Articles/tb29-1/tb91thanh-fonts.pdf})
%
% \bibitem[\pdftex\ manual]{pdftexman}
-% \thanh, Sebastian Rahtz, Hans Hagen, Hartmut Henkel, Pawe\l\ Jackowski, Martin Schr\"oder,
+% \thanh, Sebastian Rahtz, Hans Hagen, Hartmut Henkel, Pawe\l\ Jackowski, Martin Schr\"oder, Karl Berry,
% \emph{The \pdftex\ user manual},
-% \newblock 2~January 2018.
+% \newblock 2~March 2020.
% \newblock (\ctanurl{systems/doc/pdftex/manual/pdftex-a.pdf})
% ^^A latest version at \url{http://sarovar.org/projects/pdftex/}
% ^^A or even \url{http://foundry.supelec.fr/scm/?group_id=23}
@@ -2960,19 +2972,19 @@
%
% \bibitem[\LaTeXe\ font selection]{fntguide}
% \LaTeX3 Project Team, \emph{\LaTeXe\ font selection},
-% \newblock July 2019.
+% \newblock July 2020.
% \newblock (\ctanurl{macros/latex/base/fntguide.pdf})
%
% \bibitem[\pkg{fontspec}]{fontspec}
% Will Robertson,
% \emph{The \pkg{fontspec} package: Font selection for \xe\LaTeX\ and Lua\LaTeX},
-% \newblock 19~October 2019.
+% \newblock 21~February 2020.
% \newblock (\ctanpkgurl{fontspec})
%
% \bibitem[\pkg{luaotfload}]{luaotfload}
% \'Elie Roux, Khaled Hosny, Philipp Gesang, Ulrike Fischer, Marcel Kr\"uger,
% \emph{The \pkg{luaotfload} package},
-% \newblock 10~November 2019.
+% \newblock 2~September 2020.
% \newblock (\ctanpkgurl{luaotfload})
%
% \bibitem[\pkg{pdfcprot}]{pdfcprot}
@@ -3023,7 +3035,11 @@
%
%\begin{History}
%
-%\VersionDate{\expandafter\@gobble\fileversion}{\filedate}
+%\Version{\expandafter\@gobble\fileversion}{\filedate}
+% \item New default font sets for expansion and spacing: `|alltext-nott|'
+% \refsection{\ref{sec:font-sets}, table~\ref{tab:predefined-font-sets}}
+%
+%\VersionDate{2.7d}{2019/11/18}
%
%\VersionDate{2.7c}{2019/10/10}
%
@@ -3277,6 +3293,7 @@
% \setlength{\linewidth}{\textwidth}
% \footnotesize
%}
+%
%\def\LPPLSettings{
%\changes{v1.9e}{2006/06/13}{include <LPPL>}
% \let\LPPLicense\empty
@@ -3353,9 +3370,9 @@
%^^A \tagcode,\letterspacefont,\pdfcopyfont,\pdffontexpand,\pdfnoligatures,
%^^A \pdfprotrudechars,\pdfadjust(interwordglue,spacing),\pdf(ap,pre)pendkern,
%^^A \pdftracingfonts} ^^A pdftex
-%\DoNotIndex{\XeTeXversion,\XeTeXrevision} ^^A xetex
-%^^A\DoNotIndex{\XeTeXcharglyph,\XeTeXcountglyphs,\XeTeXfonttype,\XeTeXglyph,
-%^^A \XeTeXglyphindex,\XeTeXglyphname,\XeTeXprotrudechars}
+%\DoNotIndex{\XeTeXversion,\XeTeXrevision,\strcmp} ^^A xetex
+%^^A\DoNotIndex{\XeTeXcharglyph,\XeTeXfonttype,\XeTeXglyph,\XeTeXglyphindex,
+%^^A \XeTeXglyphname,\XeTeXlastfontchar,\XeTeXprotrudechars}
%\DoNotIndex{\directlua,\luatexversion} ^^A luatex
%^^A\DoNotIndex{\adjustspacing,\copyfont,\expandglyphsinfont,
%^^A \ignoreligaturesinfont,\outputmode,\protrudechars,\tracingfonts}
@@ -3396,7 +3413,7 @@
%\DoNotIndex{\RequireLuaModule} ^^A luatexbase
%\DoNotIndex{\pdf@escapestring} ^^A pdftexcmds
%\DoNotIndex{\py@macron} ^^A pinyin
-%\DoNotIndex{\SOUL@,\soulregister} ^^A soul
+%\DoNotIndex{\SOUL@,\SOUL@doword,\soulregister} ^^A soul
%\DoNotIndex{\tikz@expandcount} ^^A tikz
%\DoNotIndex{\conditionally@traceoff} ^^A trace
%\DoNotIndex{\@xspace,\@xspace@firsttrue} ^^A xspace
@@ -3495,11 +3512,11 @@
\def\MT@fix@catcode#1#2{%
\edef\MT@restore@catcodes{%
\MT@restore@catcodes
- \catcode#1 \the\catcode#1\relax
+ \catcode#1=\the\catcode#1\relax
}%
- \catcode#1 #2\relax
+ \catcode#1=#2\relax
}
-%<package>\MT@fix@catcode{17}{14}% ^^Q (comment)
+\MT@fix@catcode{17}{14}% ^^Q (comment)
\MT@fix@catcode{24} {9}% ^^X (ignore)
%<package>\MT@fix@catcode{33}{12}% !
%<package>\MT@fix@catcode{34}{12}% "
@@ -3780,6 +3797,7 @@
%\end{macro}
%\changes{v2.2}{2007/05/01}{use catcode trickery for \etex\ test}
%^^A\changes{v2.3a}{2007/12/29}{removed} ^^A \MT@maybe@etex
+%\changes{v2.8}{2020/05/26}{\letterspace\ works with \etex\ only}
% For definitions that depend on \etex\ features.
% \begin{macrocode}
\ifcase 0%
@@ -3791,6 +3809,8 @@
\else
\catcode`\^^Q=9 \catcode`\^^X=14
\fi
+%<letterspace>^^Q\MT@warning@nl{This package requires the etex extensions.
+%<letterspace>^^Q \MessageBreak Exiting}\MT@restore@catcodes\endinput
%<debug>\MT@dinfo@nl{0}{this is
%<debug>^^Q not
%<debug> etex}
@@ -3850,9 +3870,11 @@
\ifnum\luatexversion < 62 \def\MT@engine@tooold{0}
\else
\def\MT@engine@tooold{1}
+ \let\MT@lua\directlua
\ifnum\luatexversion > 84
\let\pdfoutput\outputmode
\let\pdfprotrudechars\protrudechars
+ \let\pdfadjustspacing\adjustspacing
\fi
\fi
%</letterspace>
@@ -3968,7 +3990,11 @@
% \item N/A
% \item \luatex\ ($\less$~0.36)
% \item + \cmd\directlua\ without state number ($\geq$~0.36)
-% \item + \cmd\letterspacefont\ ($\geq$~0.62)
+% \item + \cmd\letterspacefont; non-automatic expansion doesn't work anymore,
+% and automatic expansion in <DVI> mode is realised by modifying the tracking,
+% not the glyphs\footnote{This may have been changed earlier, but I'm no longer able
+% to find out when (the last version that actually works for me is 0.40).}
+% ($\geq$~0.62)
% \item + almost all of the \pdftex\ primitives have been renamed ($\geq$~0.85)
% \item + default \cmd\efcode\,=\,1000;
% \cmd\protrusionboundary\ [not yet supported] ($\geq$~0.90)
@@ -3988,7 +4014,7 @@
% number.
%\changes{v2.3d}{2009/03/25}{update for \luatex\ 0.36}
% \begin{macrocode}
-\def\MT@lua{\directlua}
+\let\MT@lua\directlua
\def\MT@luatex@no{5}
\ifnum\luatexversion<90
\def\MT@luatex@no{4}
@@ -4094,6 +4120,7 @@
%\end{macro}
%\end{macro}
%\end{macro}
+% [This line intentionally left blank.]
%\begin{macro}{\MT@pr@level}
%\begin{macro}{\MT@ex@level}
%\begin{macro}{\MT@pr@factor}
@@ -4224,7 +4251,7 @@
%<pdftex-def> \MT@pdftex@no
%<luatex-def> \MT@luatex@no
<#1 \expandafter\@secondoftwo\else\expandafter\@firstoftwo\fi}
-%<luatex-def&debug>\MT@requires@luatex4{\directlua{tex.enableprimitives('pdf',{'tracingfonts'})}}\relax
+%<luatex-def&debug>\MT@requires@luatex4{\MT@lua{tex.enableprimitives('pdf',{'tracingfonts'})}}\relax
%<pdftex-def&debug>\MT@requires@pdftex6{
%<debug>\pdftracingfonts=1
%<pdftex-def&debug>}\relax
@@ -4249,8 +4276,9 @@
% load \pkg{fontspec} before \microtype.
% There will hardly be any \luatex\ documents that don't load this package, anyway.
%\changes{v2.6}{2013/06/19}{load \pkg{luaotfload} with \luatex}
+% Since 2017/01/01, it is already loaded in the format.
% \begin{macrocode}
-\RequirePackage{luaotfload}
+\@ifl@t@r\fmtversion{2017/01/01}\relax{\RequirePackage{luaotfload}}
\MT@lua{require("microtype")}
%</luatex-def>
% \end{macrocode}
@@ -4262,6 +4290,7 @@
% \contributor Ulrike Fischer <news3\at nililand.de>)}
% ^^A private mail, 2019/02/19
% ^^A private mail, 2019/02/26
+%\changes{v2.8}{2020/05/26}{fix for \pkg{luatexbase}}
% \begin{macrocode}
%<*luafile>
@@ -4277,7 +4306,7 @@ local catpackage
if luatexbase.registernumber then
catpackage = luatexbase.registernumber("catcodetable@atletter") -- LaTeX
else
- catpackage = luatexbase.catcodetables.CatcodeTableAtletter -- luatexbase
+ catpackage = luatexbase.catcodetables.CatcodeTableLaTeXAtLetter -- luatexbase
end
function microtype.sprint (...)
tex.sprint(catpackage, ...)
@@ -4589,19 +4618,21 @@ microtype.if_dimen = if_dimen
% (found by \contributor Wiebke Petersen <petersew\at uni-duesseldorf.de>)}
% ^^A MID: <esmd6k$954$1@news1.rz.uni-duesseldorf.de>
%\changes{v2.2}{2007/05/10}{employ \luatex\ features if available}
+%\changes{v2.8}{2020/06/18}{use \xetex's \cmd\stringcmp}
% \begin{macrocode}
-%<*pdftex-def>
-\MT@requires@pdftex5{
+%<*pdftex-def|xetex-def>
+%<pdftex-def>\MT@requires@pdftex5{
\def\MT@ifstreq#1#2{%
- \ifcase\pdfstrcmp{#1}{#2}\relax
+%<pdftex-def> \ifnum\pdfstrcmp{#1}{#2}=\z@
+%<xetex-def> \ifnum\strcmp{#1}{#2}=\z@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
+%</pdftex-def|xetex-def>
+%<*pdftex-def>
}{
-%</pdftex-def>
-%<*pdftex-def|xetex-def>
\def\MT@ifstreq#1#2{%
\edef\MT@res@a{#1}%
\edef\MT@res@b{#2}%
@@ -4611,8 +4642,8 @@ microtype.if_dimen = if_dimen
\expandafter\@secondoftwo
\fi
}
-%</pdftex-def|xetex-def>
-%<pdftex-def>}
+}
+%</pdftex-def>
%<luatex-def>\def\MT@ifstreq#1#2{\csname\MT@lua{microtype.if_str_eq([[#1]],[[#2]])}\endcsname}
%<*luafile>
local function if_str_eq(s1, s2)
@@ -4842,21 +4873,45 @@ microtype.if_str_eq = if_str_eq
% \end{macrocode}
%\end{macro}
%\changes{v2.6a}{2016/05/03}{fixes for \letterspace\ package with \luatex}
+%\begin{macro}{\MT@if@luaotf@font}
+%\changes{v2.8}{2019/11/27}{use \texttt{lua} function}
+% For fonts loaded by \pkg{luaotfload} we query the font's table.
+% \begin{macrocode}
+%<letterspace>\MT@pdf@or@lua{\let\MT@if@luaotf@font\@secondoftwo}{
+%<luatex-def|letterspace>\def\MT@if@luaotf@font{\csname\MT@lua{%
+%<luatex-def> microtype.if_luaotf_font()
+%<*luafile|letterspace>
+%<luafile>local function if_luaotf_font()
+ local thefont = font.getfont(font.current())
+ if thefont and ( thefont.format == "opentype" or thefont.format == "truetype" )
+ then tex.write("@firstoftwo")
+ else tex.write("@secondoftwo")
+ end
+%<luafile>end
+%<luafile>microtype.if_luaotf_font = if_luaotf_font
+%<luafile>
+%</luafile|letterspace>
+%<luatex-def|letterspace> }\endcsname
+%<luatex-def|letterspace>}
+%<letterspace>}
+% \end{macrocode}
+%\end{macro}
%\begin{macro}{\MT@do@font}
% Execute \meta{\#1} 256 times,
% \begin{macrocode}
%<pdftex-def|letterspace>\def\MT@do@font{\MT@while@num\z@\@cclvi}
% \end{macrocode}
-% resp. for the whole font for \luatex, if loaded by \pkg{fontspec}/\pkg{luaotfload}.
+% resp. for the whole font for \luatex, if it's a Unicode font.
%\changes{v2.5}{2010/08/14}{adapt for \luatex}
%\changes{v2.6}{2013/07/14}{speed up for \luatex}
%\changes{v2.6a}{2015/05/10}{fix \texttt{lua} function
% (reported by \contributor Herbert Vo\ss{} <Herbert.Voss\at FU-Berlin.DE>)}
% ^^A private mail, 2016/05/10
+%\changes{v2.8}{2020/06/20}{simplify \texttt{lua} function}
% \begin{macrocode}
%<*luatex-def>
\def\MT@do@font#1{%
- \MT@if@fontspec@font{%
+ \MT@if@luaotf@font{%
\def\MT@dofont@function{#1}%
\MT@lua{microtype.do_font()}%
}{\MT@while@num\z@\@cclvi{#1}}%
@@ -4864,23 +4919,15 @@ microtype.if_str_eq = if_str_eq
%</luatex-def>
% \end{macrocode}
% This is the |lua| function, which is much faster than looping through all glyphs
-% in \TeX. Legacy fonts (which this function might be fed with, because \pkg{fontspec}
-% isn't always getting it right) don't contain a |v.index| field.
+% in \TeX. Legacy fonts (which this function should never work on) don't contain a |v.index| field.
% \begin{macrocode}
%<*luafile>
local function do_font()
- if fonts then
- local thefont
- if fonts.ids then --- legacy luaotfload
- thefont = fonts.ids[font.current()]
- else --- new location
- thefont = fonts.hashes.identifiers[font.current()]
- end
- if thefont then
- for i,v in next,thefont.characters do
- if v.index == nil or v.index > 0 then
- microtype.sprint([[\@tempcnta=]]..i..[[\relax\MT@dofont@function]])
- end
+ local thefont = font.getfont(font.current())
+ if thefont then
+ for i,v in next,thefont.characters do
+ if v.index == nil or v.index > 0 then
+ microtype.sprint([[\@tempcnta=]]..i..[[\relax\MT@dofont@function]])
end
end
end
@@ -4889,15 +4936,17 @@ microtype.do_font = do_font
%</luafile>
% \end{macrocode}
-% The \xetex\ variant.
+% The \xetex\ variant (it's slow~\dots!).
%\changes{v2.5}{2010/05/18}{adapt for \xetex}
+%\changes{v2.8}{2020/02/06}{fix for \xetex}
% \begin{macrocode}
%<*xetex-def>
\def\MT@do@font#1{%
\@tempcnta=\z@
- \MT@loop #1%
- \advance\@tempcnta \@ne
- \ifnum\@tempcnta < \XeTeXcountglyphs\MT@font \MT@repeat
+ \MT@loop
+ \iffontchar\MT@font\@tempcnta #1\fi
+ \advance\@tempcnta\@ne
+ \ifnum\@tempcnta < \XeTeXlastfontchar\MT@font \MT@repeat
}
%</xetex-def>
%<*package>
@@ -5219,27 +5268,8 @@ microtype.do_font = do_font
% \begin{macrocode}
\newif\ifMT@xunicode
\MT@with@package@T{xunicode}\MT@xunicodetrue
-%</package>
\newif\ifMT@fontspec
-%<letterspace>\MT@requires@latex2{
\MT@with@package@T{fontspec}\MT@fontspectrue
-%<letterspace>}{\MT@fontspecfalse}
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\begin{macro}{\MT@if@fontspec@font}
-%\begin{macro}{\MT@fontspec@setup}
-%\changes{v2.6}{2016/04/23}{fix \cs{MT@if@fontspec@font} ABD}
-% For fonts loaded by \pkg{fontspec} (or, rather, \pkg{luaotfload}) we can
-% use some of the features the latter package provides.
-% \begin{macrocode}
-\let\MT@if@fontspec@font\@secondoftwo
-\def\MT@fontspec@setup{%
- \@ifpackagelater{fontspec}{2013/05/23}{
- \MT@let@cn\MT@if@fontspec@font{fontspec_if_fontspec_font:TF}%
- }\relax
-}
-\ifMT@fontspec\MT@fontspec@setup\fi
% \end{macrocode}
%\end{macro}
%\end{macro}
@@ -5255,7 +5285,6 @@ microtype.do_font = do_font
% lest we disturb \pkg{tikz}. This is used in \cs{MT@afteraftergroup}, and we
% don't need it for \letterspace.
% \begin{macrocode}
-%<*package>
\let\MT@maybe@gobble@with@tikz\@firstofone
\def\MT@tikz@setup{%
\def\MT@maybe@gobble@with@tikz{%
@@ -5359,11 +5388,7 @@ time will almost certainly lead to undesired results. Have your choice!}%
\MT@with@package@T {eledmac}\MT@ledmac@setup
\MT@with@package@T{reledmac}\MT@ledmac@setup
\MT@with@package@T{xunicode}\MT@xunicodetrue
-%</package>
-%<plain> \MT@requires@latex2{
- \MT@with@package@T{fontspec}{\MT@fontspectrue\MT@fontspec@setup}%
-%<plain> }\relax
-%<*package>
+ \MT@with@package@T{fontspec}\MT@fontspectrue
% \end{macrocode}
% We can clean up \cs{MT@setupfont@hook} now.
%\changes{v2.6}{2014/03/17}{redefine \cs{MT@setupfont@hook} globally
@@ -5426,9 +5451,9 @@ time will almost certainly lead to undesired results. Have your choice!}%
% \begin{macrocode}
\MT@with@package@T{listings}{%
\g@addto@macro\MT@cfg@catcodes{%
- \MT@while@num{"30}{"3A}{\catcode\@tempcnta 12\relax}%
- \MT@while@num{"41}{"5B}{\catcode\@tempcnta 11\relax}%
- \MT@while@num{"61}{"7B}{\catcode\@tempcnta 11\relax}%
+ \MT@while@num{"30}{"3A}{\catcode\@tempcnta=12\relax}%
+ \MT@while@num{"41}{"5B}{\catcode\@tempcnta=11\relax}%
+ \MT@while@num{"61}{"7B}{\catcode\@tempcnta=11\relax}%
}%
% \end{macrocode}
% \dots~and the backslash (which would lead to problems in \cs{MT@get@slot}).
@@ -5437,7 +5462,7 @@ time will almost certainly lead to undesired results. Have your choice!}%
% ^^A private mail, 2006/09/15
% \begin{macrocode}
\g@addto@macro\MT@setupfont@hook{%
- \catcode`\\\z@
+ \catcode`\\=\z@
% \end{macrocode}
% Inside a listing, \cmd\space\ is redefined.
%\changes{v2.5}{2011/05/03}{restore \cmd\space\ inside \pkg{listings}
@@ -5445,7 +5470,7 @@ time will almost certainly lead to undesired results. Have your choice!}%
% ^^A private mail, 2011/04/30
% ^^A (beta:07)
% \begin{macrocode}
- \def\space{ }%
+ \def\space{ }%
% \end{macrocode}
%\changes{v1.9b}{2005/12/23}{compatibility with the \texttt{extendedchar} option of
% the \pkg{listings} package}
@@ -5462,24 +5487,23 @@ time will almost certainly lead to undesired results. Have your choice!}%
% Of course, using both \pkg{soul}'s and \microtype's letterspacing mechanisms
% at the same time doesn't make much sense. But \pkg{soul} can do more, \eg,
% underlining. The optional argument to \cs{textls} may not be used.
+%\changes{v2.8}{2020/04/11}{compatibility with \pkg{soul}: patch for font change
+% (reported by \contributor Md Ayquassar <mdayq0\at lenta.ru>)}
+% ^^A https://github.com/latex3/babel/issues/53#issuecomment-598307655
+% Also, we have to disable expansion within \pkg{soul}'s trial run.
+%\changes{v2.3a}{2008/01/06}{fix test for \pkg{soul} under plain \TeX}
+% Under plain \TeX, \pkg{soul} doesn't register itself the \LaTeX\ way, so
+% we just test for its main command.
% \begin{macrocode}
%</package>
-%<plain> \MT@requires@latex2{
- \MT@with@package@T{soul}{%
+ \ifx\SOUL@\@undefined\else
\soulregister\lsstyle 0%
\soulregister\textls 1%
- }%
-% \end{macrocode}
-%\changes{v2.3a}{2008/01/06}{fix test for \pkg{soul} under plain \TeX}
-% Under plain \TeX, \pkg{soul} doesn't register itself the \LaTeX\ way, hence
-% we have to use a different test in this case.
-% \begin{macrocode}
-%<*plain>
- }{\ifx\SOUL@\@undefined\else
- \soulregister\lsstyle 0%
- \soulregister\textls 1%
- \fi}%
-%</plain>
+ \ifx\XeTeXrevision\@undefined
+ \let\MT@SOUL@doword\SOUL@doword
+ \def\SOUL@doword{\pdfadjustspacing=\z@ \MT@SOUL@doword}%
+ \fi
+ \fi
%<*package>
\MT@with@package@T{tikz}\MT@tikz@setup
% \end{macrocode}
@@ -5667,12 +5691,12 @@ time will almost certainly lead to undesired results. Have your choice!}%
% \end{macrocode}
%\end{macro}
% Even though \luatex\ also provides the primitive from \pdftex\ (even renamed to
-% \cmd\copyfont, that is, `promoted' as per the \luatex\ manual), it is crippled
-% in that OpenType features will be lost. ^^A see https://mailman.ntg.nl/pipermail/ntg-context/2016/087541.html
+% \cmd\copyfont, that is, `promoted' as per the \luatex\ manual), it is seriously
+% crippled in that OpenType features will be lost. ^^A see https://mailman.ntg.nl/pipermail/ntg-context/2016/087541.html seqq.
%\changes{v2.7d}{2019/11/17}{in \luatex, don't use the \cmd\copyfont\ primitive, but load the font anew
% (reported by \contributor Paolo Polesana <@\at @> and
% \contributor Oliver Kopp <koppdev\at gmail.com>)}
-% ^^A http://tex.stackexchange.com/questions/338942/cancellation-of-color-fontspec-font-settings-while-defining-microtype-context
+% ^^A https://tex.stackexchange.com/questions/338942/cancellation-of-color-fontspec-font-settings-while-defining-microtype-context
% ^^A https://tex.stackexchange.com/questions/419288/microtypecontext-with-lualatex
% Therefore, we do not copy the font but load it anew.
% \begin{macrocode}
@@ -5695,9 +5719,7 @@ time will almost certainly lead to undesired results. Have your choice!}%
\let\font@name\MT@font@copy
% \end{macrocode}
% But we have to properly substitute the font after we're done.
-% In \luatex, for some reason, one expansion step more.
% \begin{macrocode}
-%<luatex-def> \aftergroup\MT@exp@two@c
\aftergroup\let\aftergroup\font@name\aftergroup\MT@font@copy
}
% \end{macrocode}
@@ -5751,6 +5773,39 @@ time will almost certainly lead to undesired results. Have your choice!}%
% prevent a different design size being selected.
%
%\bigskip
+%\begin{macro}{\MT@fix@fontdimen@six}
+%\changes{v1.8}{2005/05/03}{new macro: test whether \fontdim6 is defined}
+%\changes{v2.3e}{2009/08/31}{fix: gobbling settings with tracking failed
+% (reported by \contributor Leo <sdl.web\at gmail.com>)}
+% ^^A MID: <m0vdk4g8t2.fsf@cam.ac.uk>
+%\changes{v2.8}{2020/05/25}{try to fix zero \fontdim6}
+%\begin{macro}{\MT@dimen@six}
+% If \fontdim6 is zero, character protrusion, spacing, kerning and tracking
+% won't work, and we could skip the settings (for example, the \pkg{dsfont}
+% fonts don't specify this dimension; this is probably a bug -- the \pkg{fourier}
+% and \pkg{newpx}/\pkg{newtx} packages have been fixed in the meantime).
+% However, we can fix it ourselves -- only tracking still doesn't work (it seems
+% that \cmd\letterspacefont\ uses the \fontdim6 from the original font).
+% \xetex\ doesn't provide an equivalent to \cmd\pdffontsize, so we use the
+% nominal size instead.
+% \begin{macrocode}
+%<*pdftex-def|luatex-def|xetex-def>
+\def\MT@fix@fontdimen@six{%
+ \ifnum\fontdimen6\MT@font=\z@
+ \fontdimen6\MT@font=%
+%<pdftex-def> \pdffontsize\MT@font
+%<luatex-def> \MT@requires@luatex4{\pdffeedback fontsize}{\pdffontsize}\MT@font
+%<xetex-def> \MT@size pt
+ \MT@info{Fixing zero \string\fontdimen 6 for font `\MT@@font'\MessageBreak
+ (new value: \the\fontdimen6\MT@font)}%
+ \MT@glet@nc{\MT@@font-fake6}\@empty
+ \fi
+ \edef\MT@dimen@six{\number\fontdimen6\MT@font}%
+}
+%</pdftex-def|luatex-def|xetex-def>
+% \end{macrocode}
+%\end{macro}
+%\end{macro}
%\begin{macro}{\MT@split@name}
%\changes{v1.7}{2005/02/27}{don't define \cs{MT@encoding} \&c. \cmd\global ly}
%\changes{v2.0}{2006/12/19}{adjust to possible letterspacing}
@@ -5774,6 +5829,7 @@ time will almost certainly lead to undesired results. Have your choice!}%
\def\MT@series {#3}%
\def\MT@shape {#4}%
\def\MT@size {#5}%
+ \MT@fix@fontdimen@six
% \end{macrocode}
%\begin{macro}{\MT@familyalias}
% Alias family?
@@ -6035,57 +6091,30 @@ time will almost certainly lead to undesired results. Have your choice!}%
\MT@glet@nc{\MT@encoding-\MT@family-settings}\@empty
}%
\fi
- \MT@get@font@dimen@six{%
- \MT@get@opt
- \MT@reset@pr@codes
+ \MT@get@opt
+ \MT@reset@pr@codes
% \end{macrocode}
% Get the name of the inheritance list and parse it.
% \begin{macrocode}
- \MT@get@inh@list
+ \MT@get@inh@list
% \end{macrocode}
% Set an input encoding?
% \begin{macrocode}
- \MT@set@inputenc{c}%
+ \MT@set@inputenc{c}%
% \end{macrocode}
% Load additional lists?
% \begin{macrocode}
- \MT@load@list\MT@pr@c@name
- \MT@set@listname
+ \MT@load@list\MT@pr@c@name
+ \MT@set@listname
% \end{macrocode}
% Load the main list.
% \begin{macrocode}
- \MT@let@cn\@tempc{MT@pr@c@\MT@pr@c@name}%
- \expandafter\MT@set@codes\@tempc,\relax,}%
+ \MT@let@cn\@tempc{MT@pr@c@\MT@pr@c@name}%
+ \expandafter\MT@set@codes\@tempc,\relax,%
}\MT@reset@pr@codes
}
% \end{macrocode}
%\end{macro}
-%\begin{macro}{\MT@get@font@dimen@six}
-%\changes{v1.8}{2005/05/03}{new macro: test whether \fontdim6 is defined}
-%\changes{v2.3e}{2009/08/31}{fix: gobbling settings with tracking failed
-% (reported by \contributor Leo <sdl.web\at gmail.com>)}
-% ^^A MID: <m0vdk4g8t2.fsf@cam.ac.uk>
-%\begin{macro}{\MT@dimen@six}
-% If \fontdim6 is zero, character protrusion, spacing, kerning and tracking
-% won't work, and we can skip the settings (for example, the \pkg{dsfont} and
-% \pkg{fourier} fonts don't specify this dimension; this is probably a bug in
-% the fonts).
-% \begin{macrocode}
-\def\MT@get@font@dimen@six{%
- \ifnum\fontdimen6\MT@font=\z@
- \MT@warning@nl{%
- Font `\MT@@font' does not specify its\MessageBreak
- \@backslashchar fontdimen 6 (width of an `em')! Therefore,\MessageBreak
- \@nameuse{MT@abbr@\MT@feat} will not work with this font}%
- \expandafter\@gobble
- \else
- \edef\MT@dimen@six{\number\fontdimen6\MT@font}%
- \expandafter\@firstofone
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
%\begin{macro}{\MT@set@all@pr}
%\changes{v2.2}{2007/06/16}{(et al.) allow empty values}
% Set all protrusion codes of the font.
@@ -6372,7 +6401,8 @@ time will almost certainly lead to undesired results. Have your choice!}%
%\end{macro}
%\begin{macro}{\MT@get@opt}
% The optional argument to the configuration commands (except for
-% \cs{SetExpansion}, which is being dealt with in \cs{MT@get@ex@opt}).
+% \cs{SetExpansion} and \cs{SetTracking}, which are being dealt with
+% in \cs{MT@get@ex@opt} and \cs{MT@get@tr@opt}, resp.).
% \begin{macrocode}
\def\MT@get@opt{%
\MT@set@listname
@@ -6554,8 +6584,8 @@ time will almost certainly lead to undesired results. Have your choice!}%
% \begin{macrocode}
%<*pdftex-def|xetex-def|luatex-def>
\def\MT@set@pr@heirs#1{%
- \lpcode\MT@font #1 =\lpcode\MT@font\MT@char\relax
- \rpcode\MT@font #1 =\rpcode\MT@font\MT@char\relax
+ \lpcode\MT@font #1=\lpcode\MT@font\MT@char\relax
+ \rpcode\MT@font #1=\rpcode\MT@font\MT@char\relax
%<debug>\MT@dinfo@nl{2}{-- heir of \MT@char: #1}%
%<debug>\MT@dinfo@nl{4}{;;; lp/rp (#1): \number\lpcode\MT@font\MT@char\space/%
%<debug> \number\rpcode\MT@font\MT@char\space}%
@@ -6671,7 +6701,7 @@ time will almost certainly lead to undesired results. Have your choice!}%
\let\MT@stretch@ \MT@stretch
\let\MT@shrink@ \MT@shrink
\let\MT@step@ \MT@step
-%<pdftex-def> \let\MT@auto@ \MT@auto
+ \let\MT@auto@ \MT@auto
\let\MT@ex@factor@\MT@ex@factor
}%
\MT@reset@ef@codes
@@ -6690,30 +6720,33 @@ time will almost certainly lead to undesired results. Have your choice!}%
% \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@expandfont}
-% Expand the font.
+% Expand the font. For some reason, older \luatex\ versions freeze if
+% the |autoexpand| modifier is missing. Can't be bothered to find out why.
+% For newer versions, we could also use the function |font.setexpansion|,
+% or, in the future, \pkg{luaotfload}'s expansion font feature. ^^A https://github.com/latex3/luaotfload/commit/4907e23407c52437cca56966d11d3b4548bba585
+%\iffalse
% In \luatex, we try to go the |lua| way, if the |font.setexpansion| function exists.
%\changes{v2.7d}{2019/11/17}{use \luatex\ function \texttt{font.}\penalty\exhyphenpenalty\texttt{setexpansion} if available}
+%\fi
% \begin{macrocode}
%<*luatex-def>
-\directlua{\detokenize{
- if font.setexpansion == nil then
- tex.print("\\@firstoftwo")
- else
- tex.print("\\@secondoftwo")
- end
-}}{
+\MT@requires@luatex3{
\MT@requires@luatex4{\let\pdffontexpand\expandglyphsinfont}\relax
-%</luatex-def>
+\ifnum\luatexversion<79
\def\MT@expandfont{%
- \pdffontexpand\MT@font \MT@stretch@ \MT@shrink@ \MT@step@ \MT@auto@\relax
+ \pdffontexpand\MT@font \MT@stretch@ \MT@shrink@ \MT@step@ autoexpand\relax
}
-%<*luatex-def>
-}{
+\else
\def\MT@expandfont{%
- \directlua{font.setexpansion(font.current(),\MT@stretch@,\MT@shrink@,\MT@step@)}%
-}
+ \pdffontexpand\MT@font \MT@stretch@ \MT@shrink@ \MT@step@\relax
}
+\fi
+}{
%</luatex-def>
+\def\MT@expandfont{%
+ \pdffontexpand\MT@font \MT@stretch@ \MT@shrink@ \MT@step@ \MT@auto@\relax
+}
+%<luatex-def>}
% \end{macrocode}
%\end{macro}
%\begin{macro}{\MT@set@all@ex}
@@ -6809,8 +6842,9 @@ time will almost certainly lead to undesired results. Have your choice!}%
\MT@get@ex@opt@{stretch}{Setting stretch limit to \number\MT@stretch@}%
\MT@get@ex@opt@{shrink} {Setting shrink limit to \number\MT@shrink@}%
\MT@get@ex@opt@{step} {Setting expansion step to \number\MT@step@}%
-%<pdftex-def> \def\@tempa{autoexpand}%
-%<pdftex-def> \MT@get@ex@opt@{auto}{\ifx\@tempa\MT@auto@ En\else Dis\fi abling automatic expansion}%
+%<luatex-def> \MT@requires@luatex3\relax{%
+ \MT@get@ex@opt@{auto}{\MT@ifstreq{\MT@auto@}{autoexpand}{En}{Dis}abling automatic expansion}%
+%<luatex-def> }%
\MT@ifdefined@n@T{MT@ex@c@\MT@ex@c@name @preset}{%
\MT@preset@ex
\let\MT@reset@ef@codes\relax
@@ -6870,15 +6904,14 @@ time will almost certainly lead to undesired results. Have your choice!}%
% \begin{macrocode}
\def\MT@set@sp@codes{%
\MT@if@list@exists{%
- \MT@get@font@dimen@six{%
- \MT@get@opt
- \MT@reset@sp@codes
- \MT@get@inh@list
- \MT@set@inputenc{c}%
- \MT@load@list\MT@sp@c@name
- \MT@set@listname
- \MT@let@cn\@tempc{MT@sp@c@\MT@sp@c@name}%
- \expandafter\MT@set@codes\@tempc,\relax,}%
+ \MT@get@opt
+ \MT@reset@sp@codes
+ \MT@get@inh@list
+ \MT@set@inputenc{c}%
+ \MT@load@list\MT@sp@c@name
+ \MT@set@listname
+ \MT@let@cn\@tempc{MT@sp@c@\MT@sp@c@name}%
+ \expandafter\MT@set@codes\@tempc,\relax,%
}\MT@reset@sp@codes
}
% \end{macrocode}
@@ -6987,15 +7020,14 @@ time will almost certainly lead to undesired results. Have your choice!}%
% \begin{macrocode}
\def\MT@set@kn@codes{%
\MT@if@list@exists{%
- \MT@get@font@dimen@six{%
- \MT@get@opt
- \MT@reset@kn@codes
- \MT@get@inh@list
- \MT@set@inputenc{c}%
- \MT@load@list\MT@kn@c@name
- \MT@set@listname
- \MT@let@cn\@tempc{MT@kn@c@\MT@kn@c@name}%
- \expandafter\MT@set@codes\@tempc,\relax,}%
+ \MT@get@opt
+ \MT@reset@kn@codes
+ \MT@get@inh@list
+ \MT@set@inputenc{c}%
+ \MT@load@list\MT@kn@c@name
+ \MT@set@listname
+ \MT@let@cn\@tempc{MT@kn@c@\MT@kn@c@name}%
+ \expandafter\MT@set@codes\@tempc,\relax,%
}\MT@reset@kn@codes
}
% \end{macrocode}
@@ -7120,12 +7152,23 @@ time will almost certainly lead to undesired results. Have your choice!}%
% The tracking amount is determined by the optional argument to \cs{textls},
% settings from \cs{SetTracking}, or the global \opt{letterspace} option, in
% this order.
+%
+% Tracking won't work if the original font's \fontdim6 is zero, in which
+% case we issue a warning (once for every font).
% \begin{macrocode}
%<*pdftex-def|luatex-def|letterspace>
\def\MT@set@tr@codes{%
%<*pdftex-def|luatex-def>
\MT@vinfo{Tracking font `\MT@@font'\on@line}%
- \MT@get@font@dimen@six{%
+ \MT@ifdefined@n@TF{\MT@@font-fake6}{%
+ \expandafter\ifx\csname\MT@@font-fake6\endcsname\@empty
+ \MT@warning@nl{%
+ Font `\MT@@font' does not specify its\MessageBreak
+ \@backslashchar fontdimen 6 (width of an `em')! Therefore,\MessageBreak
+ \@nameuse{MT@abbr@\MT@feat} will not work with this font}%
+ \MT@glet@nc{\MT@@font-fake6}\relax
+ \fi
+ }{%
\MT@if@list@exists
\MT@get@tr@opt
\relax
@@ -7170,8 +7213,8 @@ time will almost certainly lead to undesired results. Have your choice!}%
% than the \pdftex\ primitive \cmd\letterspacefont.
% \begin{macrocode}
%<*luatex-def|letterspace>
- \MT@if@fontspec@font{%
-%<luatex-def&debug>\MT@dinfo@nl{1}{... fontspec font: \MessageBreak
+ \MT@if@luaotf@font{%
+%<luatex-def&debug>\MT@dinfo@nl{1}{... luaotf font: \MessageBreak
%<luatex-def&debug> \expandafter\fontname\font@name}%
\ifnum\MT@letterspace@<\z@\def\MT@minus{-}\else\let\MT@minus\@empty\fi
\global\expandafter\font\MT@lsfont=%
@@ -7231,7 +7274,7 @@ time will almost certainly lead to undesired results. Have your choice!}%
% (reported by \contributor Wolfram Schaalo <schaalo\at gmx.net>)}
% ^^A private mail, 2008/05/12
% \begin{macrocode}
-%<luatex-def|letterspace> \MT@if@fontspec@font\relax{%
+%<luatex-def|letterspace> \MT@if@luaotf@font\relax{%
%<debug>\MT@dinfo@nl{2}{... compensating for tracking (\number\MT@letterspace@)}%
\MT@do@font{\lpcode\MT@lsfont\@tempcnta=\numexpr\MT@letterspace@/2\relax
\rpcode\MT@lsfont\@tempcnta=\numexpr\MT@letterspace@/2\relax}%
@@ -7245,7 +7288,7 @@ time will almost certainly lead to undesired results. Have your choice!}%
% \begin{macrocode}
\aftergroup\MT@set@lsfont
%<pdftex-def|luatex-def> \let\MT@font\MT@lsfont
-%<luatex-def> \MT@if@fontspec@font\MT@font\relax
+%<luatex-def> \MT@if@luaotf@font\MT@font\relax
% \end{macrocode}
%\begin{macro}{\MT@set@curr@ls}
%\begin{macro}{\MT@curr@ls}
@@ -7367,23 +7410,26 @@ time will almost certainly lead to undesired results. Have your choice!}%
%<*pdftex-def|luatex-def>
\def\MT@get@tr@opt{%
\MT@set@listname
- \MT@ifdefined@n@T{MT@tr@c@\MT@tr@c@name}{%
- \MT@let@cn\MT@letterspace{MT@tr@c@\MT@tr@c@name}%
+ \let\MT@tr@factor@\@m
% \end{macrocode}
%\begin{macro}{\MT@tr@unit@}
-% Different unit?
+% Different unit (for |letterspace| and/or |(outer)spacing|)?
+%\changes{v2.8}{2020/11/22}{fix: allow unit regardless whether letterspacing is set}
% \begin{macrocode}
- \MT@ifdefined@n@T{MT@tr@c@\MT@tr@c@name @unit}{%
- \MT@let@cn\MT@tr@unit@{MT@tr@c@\MT@tr@c@name @unit}%
- \ifdim\MT@tr@unit@=1em
- \let\MT@tr@unit@\@undefined
- \else
- \MT@let@cn\@tempb{MT@tr@c@\MT@tr@c@name}%
- \MT@get@unit\MT@tr@unit@
- \let\MT@tr@factor@\@m
- \MT@scale@to@em
- \edef\MT@letterspace{\number\@tempcntb}%
- \fi
+ \MT@ifdefined@n@T{MT@tr@c@\MT@tr@c@name @unit}{%
+ \MT@let@cn\MT@tr@unit@{MT@tr@c@\MT@tr@c@name @unit}%
+ \ifdim\MT@tr@unit@=1em
+ \let\MT@tr@unit@\@undefined
+ \else
+ \MT@get@unit\MT@tr@unit@
+ \fi
+ }%
+ \MT@ifdefined@n@T{MT@tr@c@\MT@tr@c@name}{%
+ \MT@let@cn\MT@letterspace{MT@tr@c@\MT@tr@c@name}%
+ \MT@ifdefined@c@T\MT@tr@unit@{%
+ \let\@tempb\MT@letterspace
+ \MT@scale@to@em
+ \edef\MT@letterspace{\number\@tempcntb}%
}%
}%
% \end{macrocode}
@@ -7448,12 +7494,18 @@ time will almost certainly lead to undesired results. Have your choice!}%
%\changes{v2.7}{2016/08/03}{fix: prevent infinite loop with \pkg{psnfss} and \pkg{exscale} packages
% (reported by \contributor user11126 <@\at @>,
% solution by \contributor Ulrike Fischer <fischer\at troubleshooting-tex.de>)}
-% Setting \cmd\glb@currsize\ to \cmd\@empty\ (our previous solution) could
+% ^^A https://tex.stackexchange.com/questions/316231/microtype-and-exscale-crashing-in-texlive-2016#comment771828_316252
+% Setting \cmd\glb@currsize\ globally to \cmd\@empty\ (our previous solution) could
% throw us into an infinite loop (\eg, with the \pkg{psnfss} packages,
% via \cmd\every@math@size), so we issue \cmd\glb@settings\ instead.
+%\changes{v2.8}{2020/05/26}{fix: enforce math setup, again}
+% However, in certain situations, we may still miss some math fonts, so
+% let's try to also enforce it by emptying \cmd\glb@currsize, fingers crossed.
+% The overhead seems small.
% \begin{macrocode}
\DeclareRobustCommand\lsstyle{%
\not@math@alphabet\lsstyle\textls
+ \let\glb@currsize\@empty
%<pdftex-def|luatex-def> \MT@maybe@gobble@with@tikz{\aftergroup\glb@settings}%
%<pdftex-def|luatex-def> \def\MT@feat{tr}%
\let\MT@tracking\MT@set@tr@codes
@@ -7598,16 +7650,15 @@ time will almost certainly lead to undesired results. Have your choice!}%
%\begin{macro}{\MT@tr@set@space@}
% If settings for outer spacing \meta{\#2} don't exist, they will be inherited
% from the inner spacing settings \meta{\#1}.
+%\changes{v2.8}{2020/11/24}{simplified}
% \begin{macrocode}
\def\MT@tr@set@space@#1#2#3#4{%
\MT@ifempty{#2}{%
- \MT@ifempty{#1}{%
- \edef\MT@temp{\MT@temp#4\the\fontdimen#3\MT@lsfont}%
- }{%
+ \MT@ifempty{#1}\relax{%
\MT@tr@set@space@@{#1}{#3}{1000}%
- \edef\MT@temp{\MT@temp#4\the\@tempdima}%
\fontdimen#3\MT@lsfont=\@tempdima
}%
+ \edef\MT@temp{\MT@temp#4\the\fontdimen#3\MT@lsfont}%
}{%
\MT@tr@set@space@@{#2}{#3}{2000}%
\edef\MT@temp{\MT@temp#4\the\@tempdima}%
@@ -7629,8 +7680,7 @@ time will almost certainly lead to undesired results. Have your choice!}%
\MT@ifdefined@c@TF\MT@tr@unit@
{\edef\@tempb{#1}\MT@scale@to@em}
{\@tempcntb=#1\relax}%
- \@tempdima=\dimexpr \dimexpr\@tempcntb sp*\MT@dimen@six/1000\relax
- -\fontdimen#2\MT@lsfont\relax
+ \@tempdima=\dimexpr\@tempcntb sp*\MT@dimen@six/1000\relax
% \end{macrocode}
% For \fontdim2, we also have to subtract the kerning that letterspacing adds
% to each side of the characters (only half if it's for outer spacing).
@@ -7638,7 +7688,6 @@ time will almost certainly lead to undesired results. Have your choice!}%
\ifnum#2=\tw@
\advance\@tempdima -\dimexpr\MT@letterspace@ sp*\MT@dimen@six/#3\relax
\fi
- \@tempdima=\dimexpr \fontdimen#2\MT@lsfont+\@tempdima\relax
}{%
\MT@ifempty\@tempa{\let\@tempa\MT@letterspace@}\relax
\@tempdima=\dimexpr \numexpr1000+\@tempa sp *\fontdimen#2\MT@lsfont/1000\relax
@@ -8061,7 +8110,7 @@ time will almost certainly lead to undesired results. Have your choice!}%
% in a table (used by the \pkg{luaotfload} function |keepligature|).
%\changes{v2.6}{2016/04/20}{use \pkg{luaotfload} function to keep\slash inhibit ligatures}
% \begin{macrocode}
-%<luatex-def> \MT@if@fontspec@font
+%<luatex-def> \MT@if@luaotf@font
%<luatex-def> {\MT@lua{microtype.noligatures([[#1]],[[\MT@char]])}}\relax
\fi
}%
@@ -8074,7 +8123,7 @@ time will almost certainly lead to undesired results. Have your choice!}%
}%
}{%
\pdfnoligatures#1%
-%<luatex-def> \MT@if@fontspec@font
+%<luatex-def> \MT@if@luaotf@font
%<luatex-def> {\MT@lua{microtype.noligatures([[#1]],"_all_")}}\relax
\MT@vinfo{... Disabling all ligatures}%
}%
@@ -8739,17 +8788,17 @@ else
local function name_to_slot(name, unsafe)
if fonts then
local unicodes
- if fonts.ids then --- legacy luaotfload
+ if fonts.ids then -- legacy luaotfload
local tfmdata = fonts.ids[font.current()]
if not tfmdata then return end
unicodes = tfmdata.shared.otfdata.luatex.unicodes
- else --- new location
+ else -- new location
local tfmdata = fonts.hashes.identifiers[font.current()]
if not tfmdata then return end
unicodes = tfmdata.resources.unicodes
end
local unicode = unicodes[name]
- if unicode then --- does the 'or' branch actually exist?
+ if unicode then -- does the 'or' branch actually exist?
return type(unicode) == "number" and unicode or unicode[1]
end
end
@@ -9067,10 +9116,12 @@ end
%\end{macro}
%\end{macro}
%\begin{macro}{\MT@is@tlig}
-% This might have to change again with the next \LaTeX\ release. ^^A see https://github.com/latex3/latex2e/issues/165
+% This might have to change again with the next \LaTeX\ release, ^^A see https://github.com/latex3/latex2e/issues/165
+% \dots\ or so I feared, but it still seems to be fine.
% \begin{macrocode}
\def\MT@is@tlig#1#2{%
\ifx#1\remove@tlig
+%<debug> \MT@dinfo@nl{3}{> `\the\MT@toks' (removing remove@tlig)}%
\MT@is@number #2\relax\relax
\fi
}
@@ -9619,15 +9670,24 @@ end
% ^^A MID: <46ab4fbb$0$31632$9b4e6d93@newsspool3.arcor-online.net>
%\changes{v2.6}{2014/03/26}{allow \texttt{activate} shortcut (reported by \contributor Karl Berry <karl\at freefriends.org>)}
% ^^A private mail, 2014/03/21
+%\changes{v2.8}{2019/11/25}{fix \texttt{activate} shortcut}
+%\changes{v2.8}{2019/12/12}{ignore spaces}
+%\begin{macro}{\MT@microtypecontext}
% The user may change the context, so that different setups are possible. This
% is especially useful for multi-lingual documents.
%
-% Inside the preamble, it shouldn't actually do anything but remember it for
+% Inside the preamble, this command shouldn't actually do anything but remember itself for
% later.
% \begin{macrocode}
-\def\microtypecontext#1{\MT@addto@setup{\microtypecontext{#1}}}
+\def\microtypecontext{\MT@begin@catcodes\MT@microtypecontext}
+\def\MT@microtypecontext#1{\MT@end@catcodes\MT@addto@setup{\microtypecontext{#1}}}
\MT@addto@setup{%
- \DeclareRobustCommand\microtypecontext[1]{%
+ \DeclareRobustCommand\microtypecontext{%
+ \MT@begin@catcodes
+ \MT@microtypecontext
+ }%
+ \def\MT@microtypecontext#1{%
+ \MT@end@catcodes
\MT@setup@contexts
\let\MT@reset@context\relax
% \end{macrocode}
@@ -9643,13 +9703,21 @@ end
}
% \end{macrocode}
%\end{macro}
+%\end{macro}
%\begin{macro}{\textmicrotypecontext}
%\changes{v2.2}{2007/07/03}{new command: wrapper around \cs{microtypecontext}}
+%\changes{v2.8}{2019/12/12}{ignore spaces}
+%\begin{macro}{\MT@textmicrotypecontext}
+%\begin{macro}{\MT@text@microtypecontext}
% This is just a wrapper around \cs{microtypecontext}.
% \begin{macrocode}
-\DeclareRobustCommand\textmicrotypecontext[2]{{\microtypecontext{#1}#2}}
+\DeclareRobustCommand\textmicrotypecontext{\MT@begin@catcodes\MT@textmicrotypecontext}
+\def\MT@textmicrotypecontext#1{\MT@end@catcodes\MT@text@microtypecontext{#1}}
+\def\MT@text@microtypecontext#1#2{{\microtypecontext{#1}#2}}
% \end{macrocode}
%\end{macro}
+%\end{macro}
+%\end{macro}
%\begin{macro}{\MT@reset@context}
%\changes{v1.9f}{2006/08/03}{only reset context if it has actually been changed}
%\begin{macro}{\MT@reset@context@}
@@ -9701,6 +9769,7 @@ end
\def\MT@reset@context{\aftergroup\MT@reset@context@}%
% \end{macrocode}
% The next time we see the font, we have to reset \emph{all} factors.
+%^^A TODO: only for pdftex? or why at all?
% \begin{macrocode}
\MT@glet@nn{MT@reset@\@tempb @codes}{MT@reset@\@tempb @codes@}%
% \end{macrocode}
@@ -9721,8 +9790,8 @@ end
% We also allow the |activate| shortcut.
% \begin{macrocode}
\define@key{MTC}{activate}[]{%
- \setkeys{MT}{protrusion={#1}}%
- \setkeys{MT}{expansion={#1}}%
+ \setkeys{MTC}{protrusion={#1}}%
+ \setkeys{MTC}{expansion={#1}}%
}
% \end{macrocode}
%\begin{macro}{\MT@pr@context}
@@ -9888,7 +9957,7 @@ end
Ignoring `#1 = {\@tempa*}' in font set\MessageBreak`\MT@curr@set@name'}%
\let\MT@val\@empty}%
% \end{macrocode}
-% In contrast to earlier version, these values will not be expanded immediately
+% In contrast to earlier versions, these values will not be expanded immediately,
% but at the end of the preamble.
%\changes{v1.2}{2004/09/26}{check whether defaults have changed}
%\changes{v1.5}{2004/12/02}{don't test defaults if called after begin document}
@@ -10978,23 +11047,19 @@ end
%\changes{v1.7}{2005/03/07}{disallow automatic expansion if \pdftex\ too old}
%\changes{v2.7a}{2017/08/08}{disallow non-automatic expansion with \luatex}
% \begin{macrocode}
-%<*pdftex-def>
- \MT@requires@pdftex4{%
- \MT@gdef@n{MT@ex@c@\MT@curr@set@name @auto}{autoexpand}%
- }{%
- \MT@warning{pdftex too old for automatic font expansion}%
- }
-%</pdftex-def>
+%<pdftex-def> \MT@requires@pdftex4%
+%<luatex-def> \MT@requires@luatex3\relax
+ {\MT@gdef@n{MT@ex@c@\MT@curr@set@name @auto}{autoexpand}}%
+%<pdftex-def> {\MT@warning{pdftex too old for automatic font expansion}}%
\else
-%<*pdftex-def>
- \MT@requires@pdftex4{%
- \MT@glet@nc{MT@ex@c@\MT@curr@set@name @auto}\@empty
- }\relax
-%</pdftex-def>
+%<pdftex-def> \MT@requires@pdftex4%
%<*luatex-def>
- \MT@warning{Non-automatic font expansion doesn't work with\MessageBreak
- luatex}%
+ \MT@requires@luatex3{%
+ \MT@warning{Non-automatic font expansion doesn't work with\MessageBreak
+ luatex}}%
%</luatex-def>
+ {\MT@glet@nc{MT@ex@c@\MT@curr@set@name @auto}\@empty}%
+%<pdftex-def> \relax
\fi
}
% \end{macrocode}
@@ -12238,11 +12303,30 @@ end
% For <DVI> output, the user must have explicitly passed the \opt{expansion}
% option to the package.
%\changes{v1.5}{2004/12/02}{defaults: turn off expansion for <DVI> output}
+% Under \luatex, expansion works quite differently: the glyphs will be
+% positioned as if they were transformed, without actually being transformed.
+% Since this could still be considered a viable option, we don't disable
+% the feature completely, but issue a warning.
+%\changes{v2.8}{2020/02/09}{warning when expanding in <DVI> mode with \luatex\
+% (reported by \contributor d909 <@\at @>)}
+% ^^A https://tex.stackexchange.com/questions/531413/dvipdfmx-and-dvips-do-not-expand-fonts-properly-with-lualatex-in-dvi-mode
% \begin{macrocode}
%<*pdftex-def|luatex-def>
\def\MT@setup@expansion{%
\ifnum\pdfoutput<\@ne
- \ifMT@opt@expansion \else
+ \ifMT@opt@expansion
+%<*luatex-def>
+ \ifMT@expansion
+ \MT@requires@luatex3{%
+ \MT@warning@nl{Font expansion doesn't work properly with luatex in\MessageBreak
+ DVI mode: the glyphs won't be actually transformed,\MessageBreak
+ but will only be shifted. You might want to use\MessageBreak
+ pdflatex instead. I'll continue anyway ..}%
+ %\MT@expansionfalse
+ }\relax
+ \fi
+%</luatex-def>
+ \else
\MT@expansionfalse
\fi
\fi
@@ -12316,14 +12400,13 @@ end
% (reported by \contributor Ulrike Fischer <news3\at nililand.de>)}
% ^^A private mail, 2017/10/29
% In \luatex\ 1.0.6, the `|autoexpand|' option seems to have been removed altogether
-% and would trigger an error.
+% and would trigger a warning.
% \begin{macrocode}
-%<luatex-def> \let\MT@auto@\@empty
-%<pdftex-def> \let\MT@auto\@empty
+ \let\MT@auto\@empty
\ifMT@auto
% \end{macrocode}
%\end{macro}
-% We turn off automatic expansion if output mode is <DVI> and we're running \pdftex.
+% We turn off automatic expansion if output mode is <DVI>.
%\changes{v1.5}{2004/12/02}{disable automatic expansion for <DVI> output}
%\changes{v2.7}{2017/07/02}{don't disable automatic expansion for <DVI> output with \luatex}
% \begin{macrocode}
@@ -12359,6 +12442,7 @@ end
\def\MT@auto{1000 }%
}%
%</pdftex-def>
+%<luatex-def> \MT@requires@luatex3\relax{\def\MT@auto{autoexpand}}%
\else
%<*pdftex-def>
% \end{macrocode}
@@ -12369,10 +12453,13 @@ end
}%
%</pdftex-def>
%<*luatex-def>
- \ifMT@opt@auto
- \MT@error{Non-automatic font expansion does not work with\MessageBreak
- luatex}{Remove `auto=false' from the package options, or use pdftex.}%
- \fi
+ \MT@requires@luatex3{%
+ \ifMT@opt@auto
+ \MT@error{Non-automatic font expansion does not work with\MessageBreak
+ luatex}{Remove `auto=false' from the package options, or use pdftex.}%
+ \MT@autotrue
+ \fi
+ }\relax
%</luatex-def>
\fi
% \end{macrocode}
@@ -12917,13 +13004,15 @@ end
% \end{macrocode}
% The default sets.
%\changes{v2.2}{2007/04/15}{default set for tracking: \texttt{smallcaps}}
+%\changes{v2.8}{2019/12/04}{default set for expansion: \texttt{alltext-nott}}
+%\changes{v2.8}{2019/12/04}{default set for spacing: \texttt{alltext-nott}}
% \begin{macrocode}
%%% -----------------------------------------------------------------------
%%% DEFAULT SETS
\DeclareMicrotypeSetDefault[protrusion]{alltext}
-\DeclareMicrotypeSetDefault[expansion] {basictext}
-\DeclareMicrotypeSetDefault[spacing] {basictext}
+\DeclareMicrotypeSetDefault[expansion] {alltext-nott}
+\DeclareMicrotypeSetDefault[spacing] {alltext-nott}
\DeclareMicrotypeSetDefault[kerning] {alltext}
\DeclareMicrotypeSetDefault[tracking] {smallcaps}
@@ -12932,13 +13021,11 @@ end
%\subsection{Font variants and aliases}
%\GeneralChanges{Font aliases}
%
-% \begin{macrocode}
-%%% -----------------------------------------------------------------------
-%%% FONT VARIANTS AND ALIASES
-% \end{macrocode}
% These are the variants I happen to be using (expert encoding, oldstyle
% numerals, swashes, alternative, display, inferior and superior numerals):
% \begin{macrocode}
+%%% -----------------------------------------------------------------------
+%%% FONT VARIANTS AND ALIASES
\DeclareMicrotypeVariants{x,j,w,a,d,0,1}
% \end{macrocode}
@@ -12968,9 +13055,10 @@ end
\fi
\ifMT@fontspec\MT@if@true\fi
\ifMT@if@
+%% -- Computer/Latin Modern Roman
\DeclareMicrotypeAlias{lmr}{Latin Modern Roman}
\else
-\DeclareMicrotypeAlias{lmr}{cmr} % lmodern
+\DeclareMicrotypeAlias{lmr}{cmr} % lmodern
\fi
% \end{macrocode}
% The Latin Modern fonts, the virtual fonts from the
@@ -12986,12 +13074,17 @@ end
% (reported by \contributor Jonas Hogstrom <hjb981\at gmail.com>)}
% ^^A https://tex.stackexchange.com/questions/63558/how-to-get-microtype-to-work-with-mathematical-minus-sign-and-package-lmodern
% \begin{macrocode}
-\DeclareMicrotypeAlias{lmsy}{cmsy}
-\DeclareMicrotypeAlias{lmm} {cmm}
-\DeclareMicrotypeAlias{aer} {cmr} % ae
-\DeclareMicrotypeAlias{zer} {cmr} % zefonts
-\DeclareMicrotypeAlias{cmor}{cmr} % eco
-\DeclareMicrotypeAlias{hfor}{cmr} % hfoldsty
+\DeclareMicrotypeAlias{lmsy}{cmsy} % "
+\DeclareMicrotypeAlias{lmm} {cmm} % "
+\DeclareMicrotypeAlias{aer} {cmr} % ae
+\DeclareMicrotypeAlias{zer} {cmr} % zefonts
+\DeclareMicrotypeAlias{cmor}{cmr} % eco
+\DeclareMicrotypeAlias{hfor}{cmr} % hfoldsty
+% \end{macrocode}
+% Another, new Computer Modern extension.
+%\changes{v2.8}{2019/11/22}{declare New Computer Modern as an alias of Latin Modern Roman}
+% \begin{macrocode}
+\DeclareMicrotypeAlias{New Computer Modern}{Latin Modern Roman}
% \end{macrocode}
% The packages \pkg{pxfonts} and \pkg{txfonts} fonts inherit Palatino and Times
% settings respectively,
@@ -13001,67 +13094,84 @@ end
%\changes{v1.9}{2005/08/16}{declare \texttt{qpl} and \texttt{qtm} (\pkg{qfonts}, \TeX\ Gyre)
% as aliases of \texttt{ppl} resp. \texttt{ptm}}
% \begin{macrocode}
-\DeclareMicrotypeAlias{pxr} {ppl} % pxfonts
-\DeclareMicrotypeAlias{qpl} {ppl} % TeX Gyre Pagella (formerly: qfonts/QuasiPalatino)
+%% -- Palatino
+\DeclareMicrotypeAlias{pxr} {ppl} % pxfonts
+\DeclareMicrotypeAlias{qpl} {ppl} % TeX Gyre Pagella (formerly: qfonts/QuasiPalatino)
% \end{macrocode}
% The `<FPL> Neu' fonts, a `re-implementation' of Palatino.
%\changes{v2.2}{2007/05/27}{declare \texttt{fp9x}, \texttt{fp9j} (<FPL> Neu) as aliases of \texttt{ppl[xj]}}
% \begin{macrocode}
-\DeclareMicrotypeAlias{fp9x}{pplx} % FPL Neu
-\DeclareMicrotypeAlias{fp9j}{pplj} % "
+\DeclareMicrotypeAlias{fp9x}{pplx} % FPL Neu
+\DeclareMicrotypeAlias{fp9j}{pplj} % "
% \end{macrocode}
% The \pkg{newpx} package, a replacement for \pkg{pxfonts}.
%\changes{v2.7}{2017/03/13}{declare aliases for \pkg{newpx}}
% \begin{macrocode}
-\DeclareMicrotypeAlias{zpllf}{ppl} % newpxtext
-\DeclareMicrotypeAlias{zplosf}{ppl} % "
-\DeclareMicrotypeAlias{zpltlf}{ppl} % "
-\DeclareMicrotypeAlias{zpltosf}{ppl} % "
-\DeclareMicrotypeAlias{txr} {ptm} % txfonts
-% \end{macrocode}
-% The \pkg{newtx} package, a replacement for \pkg{txfonts}.
-%\changes{v2.7}{2017/02/25}{declare aliases for \pkg{newtx}}
-% \begin{macrocode}
-\DeclareMicrotypeAlias{ntxlf}{ptm} % newtxtext
-\DeclareMicrotypeAlias{ntxosf}{ptm} % "
-\DeclareMicrotypeAlias{ntxtlf}{ptm} % "
-\DeclareMicrotypeAlias{ntxtosf}{ptm} % "
+\DeclareMicrotypeAlias{zpllf}{pplx} % newpxtext
+\DeclareMicrotypeAlias{zplosf}{pplj} % "
+\DeclareMicrotypeAlias{zpltlf}{pplx} % "
+\DeclareMicrotypeAlias{zpltosf}{pplj} % "
% \end{macrocode}
-% The \pkg{tempora} package.
-%\changes{v2.7}{2017/02/25}{declare aliases for \pkg{tempora}}
+% The \pkg{domitian} package.
+%\changes{v2.8}{2020/03/07}{declare aliases for \pkg{step} and \pkg{domitian}
+% (notified by \contributor Daniel Benjamin Miller <dbmiller\at dbmiller.org>)}
+% ^^A private mail, 2020/02/27
% \begin{macrocode}
-\DeclareMicrotypeAlias{Tempora-TLF}{ptm} % tempora
-\DeclareMicrotypeAlias{Tempora-TOsF}{ptm}% "
-\DeclareMicrotypeAlias{qtm} {ptm} % TeX Gyre Termes (formerly: qfonts/QuasiTimes)
+\DeclareMicrotypeAlias{Domitian-TLF} {pplx}% domitian
+\DeclareMicrotypeAlias{Domitian-TOsF}{pplj}% "
% \end{macrocode}
% The OpenType versions:
%
%\changes{v2.5}{2012/03/29}{declare TeX Gyre Pagella, Asana Math, Palatino <LT> Std, and Palatino
% as aliases of Palatino Linotype (OpenType version)}
% \begin{macrocode}
+\DeclareMicrotypeAlias{Domitian} {Palatino Linotype}
\DeclareMicrotypeAlias{TeX Gyre Pagella}{Palatino Linotype}
\DeclareMicrotypeAlias{Palatino LT Std} {Palatino Linotype}
\DeclareMicrotypeAlias{Palatino} {Palatino Linotype}
\DeclareMicrotypeAlias{Asana Math} {Palatino Linotype}
+%% -- Times New Roman
+\DeclareMicrotypeAlias{txr}{ptm} % txfonts
+% \end{macrocode}
+% The \pkg{newtx} package, a replacement for \pkg{txfonts}.
+%\changes{v2.7}{2017/02/25}{declare aliases for \pkg{newtx}}
+% \begin{macrocode}
+\DeclareMicrotypeAlias{ntxlf}{ptmx} % newtxtext
+\DeclareMicrotypeAlias{ntxosf}{ptmj} % "
+\DeclareMicrotypeAlias{ntxtlf}{ptmx} % "
+\DeclareMicrotypeAlias{ntxtosf}{ptmj} % "
+% \end{macrocode}
+% The \pkg{tempora} package.
+%\changes{v2.7}{2017/02/25}{declare aliases for \pkg{tempora}}
+% \begin{macrocode}
+\DeclareMicrotypeAlias{Tempora-TLF}{ptmx} % tempora
+\DeclareMicrotypeAlias{Tempora-TOsF}{ptmj} % "
+\DeclareMicrotypeAlias{qtm}{ptm} % TeX Gyre Termes (formerly: qfonts/QuasiTimes)
+% \end{macrocode}
+% The \pkg{step} package.
+% \begin{macrocode}
+\DeclareMicrotypeAlias{STEP-TLF}{ptmx} % step
+\DeclareMicrotypeAlias{STEP-TOsF}{ptmj} % "
+% \end{macrocode}
+% The \pkg{stix} and \pkg{stix2} packages (the latter has departed a bit from being
+% a Times clone, but still seems close enough).
+%\changes{v2.8}{2020/05/31}{declare aliases for \pkg{stix} and \pkg{stix2} fonts}
+% \begin{macrocode}
+\DeclareMicrotypeAlias{stix} {ptm} % stix
+\DeclareMicrotypeAlias{stix2}{ptm} % stix2
% \end{macrocode}
%\todo{check Times variants}
% More Times variants, to be checked: |pns|, |mns| (TimesNewRomanPS); |mnt|
% (Times\-NewRomanMT, TimesNRSevenMT), |mtm| (TimesSmallTextMT); |pte|
% (TimesEuropa); |ptt| (TimesTen); TimesEighteen; TimesModernEF.
%
-% The \pkg{eulervm} package virtually extends the Euler fonts.
-%\changes{v1.9e}{2006/07/28}{declare \texttt{zeur} and \texttt{zeus} (\pkg{eulervm})
-% as aliases of \texttt{eur} resp. \texttt{eus} (\pkg{euler})}
-% \begin{macrocode}
-\DeclareMicrotypeAlias{zeur}{eur} % Euler VM
-\DeclareMicrotypeAlias{zeus}{eus} % "
-% \end{macrocode}
% MicroPress's Charter version (\pkg{chmath}).
%\changes{v2.2}{2007/06/08}{declare \texttt{chr} (\pkg{chmath}) as an alias of \texttt{bch}
% (reported by \contributor Geoff Vallis <gkv\at Princeton.EDU>)}
% ^^A private mail, 2007/06/07
% \begin{macrocode}
-\DeclareMicrotypeAlias{chr} {bch} % CH Math
+%% -- Charter
+\DeclareMicrotypeAlias{chr}{bch} % CH Math
% \end{macrocode}
%\changes{v2.7}{2017/03/13}{declare aliases for \pkg{XCharter}}
% The \pkg{XCharter} package extends the Charter fonts.
@@ -13074,29 +13184,38 @@ end
% as an alias of \texttt{bch}}
% and <URW> Garamond.
% \begin{macrocode}
-\DeclareMicrotypeAlias{mdbch}{bch} % mathdesign/Charter
-\DeclareMicrotypeAlias{mdugm}{ugm} % mathdesign/URW Garamond
+\DeclareMicrotypeAlias{mdbch}{bch} % mathdesign/Charter
+%% -- Garamond
+\DeclareMicrotypeAlias{mdugm}{ugm} % mathdesign/URW Garamond
% \end{macrocode}
% The \pkg{garamondx} package, an extension of <URW> Garamond, providing
% small caps and oldstyle figures.
%\changes{v2.5}{2013/02/20}{declare \texttt{zgmx} etc. (\pkg{garamondx})
% as aliases of \texttt{ugm}}
% \begin{macrocode}
-\DeclareMicrotypeAlias{zgmx}{ugm} % garamondx
-\DeclareMicrotypeAlias{zgmj}{ugm} % "
-\DeclareMicrotypeAlias{zgmI}{ugm} % "
-\DeclareMicrotypeAlias{zgmq}{ugm} % "
+\DeclareMicrotypeAlias{zgmx}{ugm} % garamondx
+\DeclareMicrotypeAlias{zgmj}{ugm} % "
+\DeclareMicrotypeAlias{zgmI}{ugm} % "
+\DeclareMicrotypeAlias{zgmq}{ugm} % "
+%% --
% \end{macrocode}
% <URW> Letter Gothic is similar enough to Bitstream Letter Gothic to share the
% configuration.
% \begin{macrocode}
-\DeclareMicrotypeAlias{ulg} {blg} % URW LetterGothic -> Bitstream LetterGothic12Pitch
+\DeclareMicrotypeAlias{ulg}{blg} % URW LetterGothic -> Bitstream LetterGothic12Pitch
+% \end{macrocode}
+% The \pkg{eulervm} package virtually extends the Euler fonts.
+%\changes{v1.9e}{2006/07/28}{declare \texttt{zeur} and \texttt{zeus} (\pkg{eulervm})
+% as aliases of \texttt{eur} resp. \texttt{eus} (\pkg{euler})}
+% \begin{macrocode}
+\DeclareMicrotypeAlias{zeur}{eur} % Euler VM
+\DeclareMicrotypeAlias{zeus}{eus} % "
% \end{macrocode}
% Euro symbol fonts, to save some files.
% \begin{macrocode}
-\DeclareMicrotypeAlias{zpeus} {zpeu} % Adobe Euro sans -> serif
-\DeclareMicrotypeAlias{eurosans}{zpeu} % Adobe Euro sans -> serif
-\DeclareMicrotypeAlias{euroitcs}{euroitc}% ITC Euro sans -> serif
+\DeclareMicrotypeAlias{zpeus} {zpeu} % Adobe Euro sans -> serif
+\DeclareMicrotypeAlias{eurosans}{zpeu} % Adobe Euro sans -> serif
+\DeclareMicrotypeAlias{euroitcs}{euroitc} % ITC Euro sans -> serif
% \end{macrocode}
%
@@ -13145,7 +13264,7 @@ end
% encoding with \cmd\DeclareTextSymbol\ or \cmd\DeclareTextComposite.
% Characters defined via \cmd\chardef\ are also possible.
%
-% Ligatures and \cmd\mathchardef ed symbols have to be specified numerically.
+% Ligatures and \cmd\mathchardef'ed symbols have to be specified numerically.
% Of course, numerical identification is possible in any other case, too.
%
%\changes{v1.1}{2004/09/14}{remove 8-bit characters from the configuration files
@@ -13157,7 +13276,8 @@ end
% combination with the `|inputenc|' key.
%
% With \xetex\ or \luatex, in contrast, it is advisable to use the proper
-% Unicode characters.
+% Unicode characters, or the font-specific glyph names prefixed with `|/|'
+% (cf. section \ref{sec:OpenType}).
%
%\subsection{Character inheritance}
%\GeneralChanges{Inheritance}
@@ -16971,9 +17091,9 @@ end
%
%\IfFileExists{microtype-utf.pdf}
% {\includepdf[pages=-,
-% addtotoc={1,section,1,OpenType configuration files,section.\thesection,
-% \utfsectioni,subsection,2,Character inheritance,subsection.\thesection.1,
-% \utfsectionii,subsection,2,Character protrusion,subsection.\thesection.2}]
+% addtotoc={1,section,1,OpenType configuration files,sec:OpenType,
+% \utfsectioni,subsection,2,Character inheritance,sub:OT-inheritance,
+% \utfsectionii,subsection,2,Character protrusion,sub:OT-protrusion}]
% {microtype-utf.pdf}}
% {\section{OpenType configuration settings}
% To view the OpenType configuration settings, first typeset
@@ -17134,7 +17254,7 @@ normal, and shrunk by 5\%:
% Grave accent \` Left brace \{ Vertical bar \|
% Right brace \} Tilde \~}
%
-% \CheckSum{10666}
+% \CheckSum{10748}
%
% \Finale
%
diff --git a/Master/texmf-dist/source/latex/microtype/microtype.ins b/Master/texmf-dist/source/latex/microtype/microtype.ins
index 7fa515b8657..e26326e802d 100644
--- a/Master/texmf-dist/source/latex/microtype/microtype.ins
+++ b/Master/texmf-dist/source/latex/microtype/microtype.ins
@@ -10,7 +10,7 @@
The `microtype' package
Subliminal refinements towards typographical perfection
- Copyright (c) 2004--2019 R Schlicht <w.m.l@gmx.net>
+ Copyright (c) 2004--2020 R Schlicht <w.m.l@gmx.net>
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
diff --git a/Master/texmf-dist/source/latex/mismath/mismath.dtx b/Master/texmf-dist/source/latex/mismath/mismath.dtx
index 769ee63a873..a2c59ce7e8f 100644
--- a/Master/texmf-dist/source/latex/mismath/mismath.dtx
+++ b/Master/texmf-dist/source/latex/mismath/mismath.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+% Copyright (C) 2019-2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
%
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3 of this license
@@ -20,7 +20,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{mismath}
- [2019/12/27 v1.7 .dtx mismath file]
+ [2020/11/15 v1.8 .dtx mismath file]
%</package>
%<*driver>
\documentclass{ltxdoc}
@@ -58,7 +58,7 @@
%</driver>
% \fi
%
-%% \CheckSum{1867}
+%% \CheckSum{419}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -94,6 +94,8 @@
% \changes{v1.5}{2019/06/22}{small corrections in documentation}
% \changes{v1.6}{2019/09/06}{Removing mathfixs package}
% \changes{v1.7}{2019/12/27}{Adding a table of contents to the documentation}
+% \changes{v1.8}{2020/11/15}{Incompatibility and solution mentioned when using i
+% with accent in beamer titles small changes in documentation}
%
% \GetFileInfo{mismath.sty}
%
@@ -101,7 +103,7 @@
% corresponds to \textsf{mismath}~\fileversion, dated \filedate.
% Thanks to François Bastouil for help in English translation.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
-% \date{December 27, 2019}
+% \date{November 15, 2020}
%
% \maketitle
% \tableofcontents
@@ -161,8 +163,8 @@
%
% \medskip
% A recommendation, seldom observed, is to typeset uppercase Greek letters in italic shape
-% like other variables~\cite{ICTNS}. This is automatically done with the \textsf{fixmath} package
-% by Walter Schmidt~\cite{FIXM},
+% like other variables~\cite{ICTNS}. This is automatically done with
+% the \textsf{fixmath} package by Walter Schmidt~\cite{FIXM},
% but this feature is not implemented in \textsf{mismath} because this rule is conflicting
% to the one used for instance in France where all mathematics capitals
% have to be typeset in upright shape\footnote{The \textsf{frenchmath} package~\cite{FR}
@@ -189,22 +191,26 @@
% \DescribeMacro{\e} \DescribeMacro{\i} \DescribeMacro{\j}
% the package provides |\e| command for the base of the natural logarithm
% and |\i| or |\j| for imaginary numbers.
-% One can notice that |\i| and |\j| already exist in \LaTeX:
+% Let's notice that |\i| and |\j| already exist in \LaTeX:
% using in LR mode, they produce ``\i'' and ``\j'' without the point
-% so one can place accents on them, and in mathematical mode they produce
+% so you can place accents on them, and in mathematical mode they produce
% ``Latex warning: Command invalid in math mode''.
-% Redefining |\i| and |\j| only concerns mathematical mode.
+% Redefining |\i| and |\j| concerns only mathematical mode\footnote{Due to this
+% \texttt{\bslash i} command redefinition, there is an incompatibility with
+% \textsf{beamer} when using i with accents in beamer titles.
+% A solution is to use the classic \texttt{\bslash \textasciicircum i}
+% command to produce î in beamer titles for example.}.
%
% \medskip
% \DescribeMacro{\enumber} \DescribeMacro{\inumber} \DescribeMacro{\jnumber}
-% Nevertheless, it can be tiresome to type a lot of backslashes in a document with many formulas
-% containing $\e$ or $\i$.
+% Nevertheless, it can be tiresome to type a lot of backslashes in a document
+% with many formulas containing $\e$ or $\i$.
% So a way is proposed here to free of it by placing |\enumber|, |\inumber| or |\jnumber|
% in the preamble:
% $\e$, $i$ or $\j$ will then automatically be set in upright shape
% in the whole document, no need to type |\e|, |\i| or |\j|,
% let's hope that there are not many other $\mathit{e}$, $\mathit{i}$ or $j$ as variables.
-% However, one can still get italicized
+% However, you can still get italicized
% $\mathit{e}$, $\mathit{i}$ or $\mathit{j}$ with \LaTeX\ command
% |\mathit| or |\mathnormal|. Of course, this does not fully comply with \LaTeX\ philosophy:
% in the document body, objects should be pointed out
@@ -431,7 +437,8 @@
% in \LaTeX, are also provided by \textsf{mismath}:
% \begin{center}
% \begin{tabular}{rlrlrl}
-% |\arccot| & $\arccot$\qquad\mbox{} & |\arsinh| & $\arsinh$\qquad\mbox{} & |\arcoth| & $\arcoth$\\
+% |\arccot| & $\arccot$\qquad\mbox{} & |\arsinh| & $\arsinh$\qquad\mbox{}
+% & |\arcoth| & $\arcoth$ \\
% |\sech| & $\sech$ & |\arcosh| & $\arcosh$ & |\arsech| & $\arsech$ \\
% |\csch| & $\csch$ & |\artanh| & $\artanh$ & |\arcsch| & $\arcsch$
% \end{tabular}
@@ -445,19 +452,19 @@
% \subsection{A few useful aliases}
%
% In the tradition of Bourbaki and D.~Knuth, proper use requires
-% that classics sets of numbers are typeset in bold roman:
+% that classic sets of numbers are typeset in bold roman:
% $\R, \C, \Z, \N, \Q$,
-% ``openwork'' letters ($\mathbb{R}, \mathbb{Z}, \ldots$)
-% being restricted to writing at blakboard~\cite{LSHORT};
+% whereas ``openwork'' letters ($\mathbb{R}, \mathbb{Z}, \ldots$)
+% are reserved for writing at blakboard~\cite{LSHORT};
% and likewise to designate a field: $\F$ or $\K$ (Körper in German).
-% We get these symbols with the following macros:
+% We get these symbols with the macros:
% \begin{center}
% |\R|, |\C|, |\Z|, |\N|, |\Q|, |\F|, |\K|.
% \end{center}
%
% \DescribeMacro{\mathset}
-% The |\mathset| command enables to change in a global way the behavior of all these macros:
-% by default, |\mathset| is an alias for |\mathbf|, but if one prefer openwork letters,
+% The |\mathset| command enables to change the behavior of all these macros in a global way:
+% by default, |\mathset| is an alias for |\mathbf|, but if you prefer openwork letters,
% just place |\renewcommand\mathset{\mathbb}| in the preamble,
% after loading \textsf{amsfonts} package (which provides the ``blackboard bold'' typeface,
% also loaded by \textsf{amssymb}).
@@ -489,7 +496,7 @@
% \DescribeMacro{\lbar} \DescribeMacro{\hlbar}
% Large bars over expressions are obtained with |\overline|
% or, shorter, its alias |\lbar|, to get for instance $\lbar{z_1z_2}$.
-% Such as for vectors, one can raise the bar (from the height of $h$) with
+% Such as for vectors, you can raise the bar (from the height of $h$) with
% the |\hlbar| command, in order to correct uneven bars heights.
% \begin{center}
% $\lbar{z+z'}=\lbar{z}+\lbar{z'}$ is less than $\lbar{z+z'}=\hlbar{z}+\lbar{z'}$,
@@ -572,7 +579,6 @@
% $\sin\left(\frac{\pi}{3}\right)\mul 2$ is less than $\sin\paren{\frac{\pi}{3}}\mul 2$
% obtained with \\[1ex] |\sin\paren{\frac{\pi}{3}}\mul 2|.
% \end{center}
-% \pagebreak ^^A for proper positioning of the footnote
%
% \DescribeMacro{\pow}
% When typesetting an exponent after a closing \emph{big} parenthesis produced by |\right)|,
@@ -620,13 +626,13 @@
% \end{cases}$
% \end{center}
% In our code, $[$ and $]$ symbols are not defined anymore as delimiters.
-% One can regret it because a line break could occur between the two,
-% but in addition to the fact that it works very well like that for spaces
-% (because these symbols are most of the time preceded or followed by relational,
-% binary or punctuation symbols), it is always possible to transform them
+% Thereby a line break could occur between the two, but
+% it is always possible to transform them
% into delimiters with |\left| and |\right|\footnote{Is \LaTeX\ definition
% of [ as |mathopen| really appropriate
% where this symbol could almost also logically have been defined as |mathclose|?}.
+% And consider that these symbols are most of the time preceded or followed by relational,
+% binary or punctuation symbols and therefore spaces are correct without a delimiter definition.
%
% \subsection{Environments for systems of equations and small matrices}
%
@@ -649,7 +655,7 @@
% from \textsf{amsmath} package, although \texttt{cases} places mathematical expressions
% closer to the bracket (which makes sense considering it's use).
% |\systemsep| enables to set the gap between the bracket and the expressions,
-% set by default to |\medspace|. This gap may be reduce, for instance:
+% set by default to |\medspace|. This gap may be reduced, for instance:
% |\renewcommand{\systemsep}{\thinspace}|,
% or enlarged with |\thickspace| (and with |\renewcommand\systemsep}{}|
% we get back to what \texttt{cases} do).
@@ -722,8 +728,8 @@
% \subsection{Displaymath in double columns}
%
% \DescribeEnv{mathcols}
-% The \texttt{mathcols} environment activates mathematical mode and enables to arrange ``long''
-% calculation in double columns, separated with a central rule,
+% The \texttt{mathcols} environment activates mathematical mode and enables to arrange
+% ``long''calculation in double columns, separated with a central rule,
% as shown in the following example.
% But you have to load the \textsf{multicol} package in the preamble.
% \begin{mathcols}
@@ -754,6 +760,7 @@
%\end{mathcols}
% \end{verbatim}
%
+% \StopEventually{}
% \vspace{-4ex}
% \section{Implementation}
%
@@ -1001,11 +1008,11 @@
% Günter Milde, CTAN, v0.6.1 04/06/2012.
% \bibitem{INT} \emph{The \textsf{interval} package}. Lars Madsen, CTAN,
% v0.3 2014/08/04.
-% \bibitem{SYST} \emph{L'extension pour \TeX\ et \LaTeX\ \textsf{systeme}}. Christian Tellechea,
-% CTAN v0.32 2019/01/13.
+% \bibitem{SYST} \emph{L'extension pour \TeX\ et \LaTeX\ \textsf{systeme}}.
+% Christian Tellechea, CTAN v0.32 2019/01/13.
% \bibitem{SPAL} \emph{The \textsf{spalign} package}. Joseph Rabinoff, CTAN, 2016/10/05.
-% \bibitem{FR} \emph{L'extension \textsf{frenchmath}}. Antoine Missier, CTAN, v1.4 2019/05/22.
-% \bibitem{LSHORT} \emph{The Not So Short Introduction to \LaTeXe}. \texttt{lshort} package by
+% \bibitem{FR} \emph{L'extension \textsf{frenchmath}}. Antoine Missier, CTAN, v1.5 2020/11/02.
+% \bibitem{LSHORT} \emph{The Not So Short Introduction to \LaTeXe}. \textsf{lshort} package by
% Tobias Oetiker, Hubert Partl, Irene Hyna and Elisabeth Schlegl, CTAN, v6.2 2018/02/28.
% \bibitem{COMP} \emph{The \LaTeX\ Companion}. Frank Mittelbach, Michel Goossens,
% Johannes Braams, David Carlisle, Chris Rowley, 2nd edition, Pearson Education, 2004.
diff --git a/Master/texmf-dist/source/latex/mismath/mismath.ins b/Master/texmf-dist/source/latex/mismath/mismath.ins
index 13befa8d377..e1eb94888ba 100644
--- a/Master/texmf-dist/source/latex/mismath/mismath.ins
+++ b/Master/texmf-dist/source/latex/mismath/mismath.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2019 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+%% Copyright (C) 2019-2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
%%
%% This file may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.3 of this license
@@ -21,7 +21,7 @@
This is a generated file.
-Copyright (C) 2019 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+Copyright (C) 2019-2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
This file may be distributed and/or modified under the conditions of
the LaTeX Project Public License, either version 1.3 of this license
diff --git a/Master/texmf-dist/source/latex/mlacls/mla.dtx b/Master/texmf-dist/source/latex/mlacls/mla.dtx
index ba5c6784ab5..2ea31fb52fc 100644
--- a/Master/texmf-dist/source/latex/mlacls/mla.dtx
+++ b/Master/texmf-dist/source/latex/mlacls/mla.dtx
@@ -27,7 +27,7 @@
%<mla>\NeedsTeXFormat{LaTeX2e}
%<mla>\ProvidesClass{mla}
%<*mla>
- [2019/05/29 v0.6 MLA Paper Class]
+ [2020/11/07 v0.9 MLA Paper Class]
%</mla>
%<*driver>
@@ -47,7 +47,6 @@
\usepackage{verbatim}
%% A couple things are cited in the docs
-\usepackage{filecontents}
\begin{filecontents}{mla.bib}
@book{mlahb,
author = {{Modern Language Association of America}},
@@ -92,12 +91,7 @@
\DeclareAcronym{SE}{short=SE,long=Stack Exchange}
%% For a few different things
-%%\usepackage{semantic-markup}
-\usepackage{csquotes}
-\newcommand{\foreign}[1]{\textit{#1}}
-\newcommand{\term}[1]{\textit{#1}}
-\newcommand{\soCalled}[1]{\textquote{#1}}
-\newcommand{\mentioned}[1]{\textquote{#1}}
+\usepackage{semantic-markup}
%% Reset footnotes per page
\usepackage[perpage]{footmisc}
@@ -106,7 +100,7 @@
\interfootnotelinepenalty=10000
%% Technical info
-\def\myemail{ssterling@firemail.cc}
+\def\myemail{sprice623@aol.com}
%% For the sake of consistency, I guess
\GlossaryPrologue{\section{Change history}}
@@ -137,7 +131,7 @@
%
% \fi
%
-% \CheckSum{291}
+% \CheckSum{401}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -214,6 +208,7 @@
% (see section~\ref{sec:the_header}).
%
% \changes{v0.2}{2019/05/02}{Added macro}
+% \changes{v0.7}{2019/08/30}{Added August to month list}
% \begin{macrocode}
\newcommand{\mladate}{%
\the\day\
@@ -225,6 +220,7 @@
\or May
\or June
\or July
+ \or August
\or September
\or October
\or November
@@ -238,19 +234,37 @@
% \begin{macro}{\MLA@seven}
% \begin{macro}{\MLA@eight}
% \begin{macro}{\MLA@eightalt}
+% \begin{macro}{\MLA@figures}
+% \begin{macro}{\MLA@notes}
% \begin{macro}{\MLA@microtype}
+% \begin{macro}{\MLA@paperheader}
+% \begin{macro}{\MLA@pageheader}
+% \begin{macro}{\MLA@plainheadings}
+% \begin{macro}{\MLA@fullpage}
% The following are true/false switches to toggle certain features.
%
% \begin{macrocode}
\newif\ifMLA@seven
\newif\ifMLA@eight
\newif\ifMLA@eightalt
+\newif\ifMLA@figures
+\newif\ifMLA@notes
\newif\ifMLA@microtype
+\newif\ifMLA@paperheader
+\newif\ifMLA@pageheader
+\newif\ifMLA@plainheadings
+\newif\ifMLA@fullpage
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \section{Options}
% \label{sec:options}
@@ -283,6 +297,17 @@
\DeclareOption{mla8alt}{\MLA@sevenfalse\MLA@eightfalse\MLA@eightalttrue}
% \end{macrocode}
%
+% For those who do not plan on using figures and/or footnotes,
+% some time (and dependency disk space) might be saved by using the
+% \Dopt{nofigures} and/or \Dopt{nonotes} options, as they are enabled
+% by default.
+% \begin{macrocode}
+\MLA@figurestrue
+\MLA@notestrue
+\DeclareOption{nofigures}{\MLA@figuresfalse}
+\DeclareOption{nonotes}{\MLA@notesfalse}
+% \end{macrocode}
+%
% The \Dpkg{microtype} package can be optionally included
% with the \Dopt{microtype} option to offset the pain of using
% the Times typeface.
@@ -290,6 +315,43 @@
\DeclareOption{microtype}{\MLA@microtypetrue}
% \end{macrocode}
%
+% \changes{v0.9}{2020/10/05}{Added \Dopt{nopaperheader},
+% \Dopt{nopageheader} and \Dopt{noheaders} options to enable
+% omission of paper headers, page headers or both paper
+% and page headers respectively}
+% For rare cases in which the paper and page headers are omitted
+% or must be custom, the options \Dopt{nopaperheader} and
+% \Dopt{nopageheader} may be used respectively, or
+% \Dopt{noheaders} to omit both.
+% \begin{macrocode}
+\MLA@paperheadertrue
+\MLA@pageheadertrue
+\DeclareOption{nopaperheader}{\MLA@paperheaderfalse}
+\DeclareOption{nopageheader}{\MLA@pageheaderfalse}
+\DeclareOption{noheaders}{\MLA@paperheaderfalse\MLA@pageheaderfalse}
+% \end{macrocode}
+%
+% \changes{v0.9}{2020/10/05}{Added \Dopt{plainheadings} option to
+% forego small-caps and auto-numbering in section headings}
+% For professors and/or writers who desire to format the section
+% headings manually and individually (and forego \cs{titleformat\{\}},
+% the \Dopt{plainheadings} option may be used.
+% \begin{macrocode}
+\MLA@plainheadingsfalse
+\DeclareOption{plainheadings}{\MLA@plainheadingstrue}
+% \end{macrocode}
+%
+% \changes{v0.9}{2020/11/07}{Added \Dopt{fullpage} option to explicitly
+% allow widows and orphans}
+% Another edge case is in which a professor may require strict 24-line
+% papers, i.\,e.\ explicitly allowing orphans and widows, enabled using
+% the \Dopt{fullpage} option\footnote{In versions of \Dcls{mlacls}
+% prior to v0.9, disallowing widows and orphans was default behavior.}.
+% \begin{macrocode}
+\MLA@fullpagefalse
+\DeclareOption{fullpage}{\MLA@fullpagetrue}
+% \end{macrocode}
+%
% \subsection{Processing}
% \label{sec:processing}
%
@@ -328,14 +390,12 @@
% \changes{v0.6}{2019/05/29}{Added \Dpkg{float} package}
% \changes{v0.7}{2019/06/01}{Changed \Dpkg{microtype} package
% to only load through \Dopt{microtype} class option}
+% \changes{v0.9}{2020/08/20}{Added \Dopt{nofigures} and \Dopt{nonotes}
+% options to prevent loading unused dependencies}
% \begin{macrocode}
-\RequirePackage{caption}
-\RequirePackage{enotez}
\RequirePackage{enumitem}
\RequirePackage{fancyhdr}
-\RequirePackage{float}
\RequirePackage{fullpage}
-\RequirePackage{graphicx}
\RequirePackage{ragged2e}
\RequirePackage{newtxtext}
\RequirePackage{titlesec}
@@ -371,6 +431,27 @@
\fi
% \end{macrocode}
%
+% The \Dpkg{caption}, \Dpkg{float} and \Dpkg{graphicx} packages
+% are loaded by default, but can be disabled using the
+% \Dopt{nofigures} option.
+%
+% \begin{macrocode}
+\ifMLA@figures
+ \RequirePackage{caption}
+ \RequirePackage{float}
+ \RequirePackage{graphicx}
+\fi
+% \end{macrocode}
+%
+% Likewise, the \Dpkg{enotez} package can be disabled with
+% \Dopt{nonotes}.
+%
+% \begin{macrocode}
+\ifMLA@notes
+ \RequirePackage{enotez}
+\fi
+% \end{macrocode}
+%
% The \Dpkg{microtype} package is loaded if the \Dopt{microtype}
% option is specified.
%
@@ -452,23 +533,10 @@
% The \citetitle{mlahb} specifies half-inch first-line indentation
% for every paragraph and no extra spacing in between.
%
-% \begin{macro}{\MLA@indent}
-% \changes{v0.7}{2019/06/05}{Added macro}
-% In case the indent should be changed, several other macros relying
-% on it might be broken.
-% Using an internal like \cs{MLA@indent} prevents this.
-%
-% \begin{macrocode}
-\newlength{\MLA@indent}
-\setlength{\MLA@indent}{0.5in}
-% \end{macrocode}
-% \end{macro}
-%
-%
% \changes{v0.6}{2019-05-29}{Explicitly set \cs{partopset} to 0pt}
% \begin{macrocode}
-\setlength{\parindent}{\MLA@indent}
-\setlength{\RaggedRightParindent}{\MLA@indent}
+\setlength{\parindent}{0.5in}
+\setlength{\RaggedRightParindent}{\parindent}
\setlength{\parskip}{0em}
\setlength{\topsep}{0em}
\setlength{\partopsep}{0em}
@@ -484,16 +552,24 @@
\@afterindenttrue
% \end{macrocode}
%
-% And, for the sake of consistent 24-line papers,
-% orphans and widows are explicitly allowed.
+% Orphans and widows are explicitly banned\footnote{According to the
+% \ac{MLA} itself: \url{https://style.mla.org/orphaned-words/}}.
+% For the odd case in which papers must be consistently 24 lines
+% (i.\,e.\ explicitly allowing orphans and widows), the
+% \Dopt{fullpage} option may be used (see section~\ref{sec:options}).
%
% \begin{macrocode}
-\widowpenalty=0
-\clubpenalty=0
-\interlinepenalty=0
+\ifMLA@fullpage
+ \widowpenalty=0
+ \clubpenalty=0
+ \interlinepenalty=0
+\else
+ \widowpenalty=10000
+ \clubpenalty=10000
+\fi
% \end{macrocode}
%
-% For a final heinous crime against typesetting,
+% As a heinous crime against the art of typesetting,
% the \citetitle{mlahb} advises flush-left/ragged-right alignment.
% (This is acheived with the \Dpkg{ragged2e} package.)
%
@@ -539,7 +615,9 @@
% \label{sec:running_head}
%
% The running head in \ac{MLA} style is simply the author's surname
-% followed by the current page number, right-aligned.
+% (if defined) followed by the current page number, right-aligned,
+% unless specified otherwise using the \Dopt{nopageheader} option
+% (see section~\ref{sec:options}).
% This is managed using the \Dpkg{fancyhdr} and \Dpkg{xstring} packages.
%
% \begin{macrocode}
@@ -550,7 +628,13 @@
\fancyhf{}
\pagestyle{headings}
\pagestyle{norule}
-\fancyhead[RO]{{\StrBehind{\@author}{ }[\last]\last} \thepage}
+\ifMLA@pageheader
+ \ifx\@author\@empty
+ \fancyhead[RO]{\thepage}
+ \else
+ \fancyhead[RO]{{\StrBehind{\@author}{ }[\last]\last} \thepage}
+ \fi
+\fi
% \end{macrocode}
%
% The following code is largely a hack to align the header
@@ -585,7 +669,7 @@
%
% \begin{macro}{\professor}
% The instructor who assigned the paper, i.e.
-% \mentioned{Dr. Marjorie Stewart}.
+% \mentioned{Dr.\ Marjorie Stewart}.
%
% \begin{macrocode}
\newcommand*{\professor}[1]{\gdef\@professor{#1}}
@@ -621,15 +705,20 @@
% \term{day month year}}
% \changes{v0.4.1}{2019/05/15}{Changed date format back to whatever
% is inside \cs{@date}}
+% \changes{v0.9}{2020/10/05}{Changed to ignore (not print) undefined
+% header macros}
+% \changes{v0.9}{2020/10/05}{Fix weird bug where paragraph immediately
+% after \cs{begin\{paper\}} (with no newline) is not indented}
% \begin{macrocode}
\newcommand{\makemlaheader}{%
\begin{noindent}
- \@author \\
- \@professor \\
- \@course \\
- \@date \\
- \begin{center}\@title\end{center}
+ \ifx\@author\@empty\else\@author\\\fi
+ \ifx\@professor\@empty\else\@professor\\\fi
+ \ifx\@course\@empty\else\@course\\\fi
+ \ifx\@date\@empty\else\@date\\\fi
+ \ifx\@title\@empty\else\begin{center}\@title\end{center}\fi
\end{noindent}
+ % for some reason, this blank line is necessary
}
% \end{macrocode}
% \end{macro}
@@ -641,17 +730,25 @@
\renewcommand{\maketitle}{\makemlaheader}
% \end{macrocode}
%
-% Finally, the header will print at the beginning of every document.
+% Finally, the header will print at the beginning of every document
+% unless specified otherwise using the \Dopt{nopaperheader} option
+% (see section~\ref{sec:options}).
%
% \changes{v0.5}{2019/05/18}{Moved header-printing process to
% \cs{AtBeginDocument}}
% \begin{macrocode}
-\AtBeginDocument{\maketitle}
+\ifMLA@paperheader
+ \AtBeginDocument{\maketitle}
+\fi
% \end{macrocode}
%
% \subsection{Sectioning}
% \label{sec:sectioning}
%
+% \changes{v0.7}{2019/08/30}{Replaced regular space after dot
+% in section headings with \cs{enspace}}
+% \changes{v0.8}{2020/08/16}{Removed extraneous spacing and newlines
+% in section headings}
% \begin{macro}{\section}
% \changes{v0.2}{2019/05/02}{Changed heading to small-caps}
% \begin{macro}{\subsection}
@@ -668,7 +765,12 @@
% the popular, oft-referenced \ac{OWL}: \citeurl{owlmla}.}.
%
% However, for the sake of clarity, the section headings in this class
-% will be set in small-caps.
+% will be set in small-caps by default.
+% Plain, unnumbered and entirely unformatted section headings can
+% be acheived using the \Dopt{plainheadings} option
+% (see section~\ref{sec:options}).
+% For custom headings other than these, refer to the
+% \Dpkg{fancyhdr} package documentation.
%
% \begin{macrocode}
\renewcommand{\thesection}{\@arabic\c@section}
@@ -680,13 +782,22 @@
% the \Dpkg{titlesec} package.
%
% \begin{macrocode}
-\titleformat*{\section}{\normalsize\sc}
-\titleformat*{\subsection}{\normalsize\sc}
-\titleformat*{\subsubsection}{\normalsize\sc}
+\ifMLA@plainheadings
+ \titleformat{\section}[block]{\normalsize}{}{0pt}{}[]
+ \titleformat{\subsection}[block]{\normalsize}{}{0pt}{}[]
+ \titleformat{\subsubsection}[block]{\normalsize}{}{0pt}{}[]
+\else
+ \titleformat{\section}[block]{\normalsize\sc}{\thetitle.\enspace}{0pt}{}[]
+ \titleformat{\subsection}[block]{\normalsize\sc}{\thetitle.\enspace}{0pt}{}[]
+ \titleformat{\subsubsection}[block]{\normalsize\sc}{\thetitle.\enspace}{0pt}{}[]
+\fi
\titlespacing*{\section}{0pt}{0pt}{0pt}
\titlespacing*{\subsection}{0pt}{0pt}{0pt}
\titlespacing*{\subsubsection}{0pt}{0pt}{0pt}
-\titlelabel{\thetitle. }
+\titlelabel{}
+\patchcmd{\ttl@select}{\strut}{}{}{}
+\patchcmd{\ttlh@hang}{\strut}{}{}{}
+\patchcmd{\ttlh@hang}{\strut}{}{}{}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -699,7 +810,6 @@
% \changes{v0.4}{2019/05/12}{Added list type}
% \begin{environment}{enumerate}
% \changes{v0.4}{2019/05/12}{Added list type}
-% \changes{v0.7}{2019/06/05}{Changed length to use \cs{MLA@indent}}
% To the user, \Dlst{itemize} and \Dlst{enumerate} lists
% will function exactly as expected.
% However, the formatting of the lists must be modified as to
@@ -713,13 +823,13 @@
parsep=0pt,
itemsep=0pt,
topsep=0pt,
- leftmargin=\MLA@indent
+ leftmargin=\parindent
}
\setlist[enumerate]{%
parsep=0pt,
itemsep=0pt,
topsep=0pt,
- leftmargin=\MLA@indent
+ leftmargin=\parindent
}
% \end{macrocode}
% \end{environment}
@@ -736,12 +846,11 @@
%
% \changes{v0.2}{2019/04/28}{Countered unexplained vertical space
% after environment}
-% \changes{v0.7}{2019/06/05}{Changed length to use \cs{MLA@indent}}
% \begin{macrocode}
\renewenvironment{blockquote}{%
- \list{}{\leftmargin \MLA@indent}
+ \list{}{\leftmargin 0.5in}
\item[]
- \setlength{\parindent}{\MLA@indent}
+ \setlength{\parindent}{0.5in}
\vspace{-\topsep}
}{%
\endlist
@@ -767,15 +876,17 @@
% seems customary and logical.
%
% \begin{macrocode}
-\setlength{\floatsep}{\baselineskip}
-\setlength{\intextsep}{\baselineskip}
-\setlength{\textfloatsep}{\baselineskip}
-\g@addto@macro\@floatboxreset\centering
+\ifMLA@figures
+ \setlength{\floatsep}{\baselineskip}
+ \setlength{\intextsep}{\baselineskip}
+ \setlength{\textfloatsep}{\baselineskip}
+ \g@addto@macro\@floatboxreset\centering
+\fi
% \end{macrocode}
%
% Thanks to a bug inherited from the \Dpkg{here} package
% which has remained unfixed since 1987\footnote{See the \cs{par}
-% on p. 11, line 249 of \Dfile{ltfloat.dtx} from the \LaTeX\ kernel.},
+% on p.\ 11, line 249 of \Dfile{ltfloat.dtx} from the \LaTeX\ kernel.},
% there is not only extra space after the figure but the inability to
% insert a figure within a paragraph.
% Miraculously, there is a fix for this\footnote{See David Carlisle's
@@ -783,12 +894,14 @@
% \url{https://tex.stackexchange.com/a/310793}}.
%
% \begin{macrocode}
-\renewcommand{\float@endH}{%
- \vspace{-12pt}
- \@endfloatbox\vskip\intextsep
- \if@flstyle\setbox\@currbox\float@makebox\columnwidth\fi
- \box\@currbox\vskip\intextsep\relax\@doendpe
-}
+\ifMLA@figures
+ \renewcommand{\float@endH}{%
+ \vspace{-12pt}
+ \@endfloatbox\vskip\intextsep
+ \if@flstyle\setbox\@currbox\float@makebox\columnwidth\fi
+ \box\@currbox\vskip\intextsep\relax\@doendpe
+ }
+\fi
% \end{macrocode}
%
% \end{environment}
@@ -801,21 +914,25 @@
% \Dpkg{caption} package.
%
% \begin{macrocode}
-\captionsetup{%
- font={normalfont},
- labelformat=simple,
- labelsep=period,
- position=bottom,
- aboveskip=6pt,
- belowskip=-10pt
-}
+\ifMLA@figures
+ \captionsetup{%
+ font={normalfont},
+ labelformat=simple,
+ labelsep=period,
+ position=bottom,
+ aboveskip=6pt,
+ belowskip=-10pt
+ }
+\fi
% \end{macrocode}
%
% In the author's personal experience, most \ac{MLA}-style papers
% use \mentioned{Fig.} and not \mentioned{Figure}.
%
% \begin{macrocode}
-\captionsetup[figure]{name=Fig.}
+\ifMLA@figures
+ \captionsetup[figure]{name=Fig.}
+\fi
% \end{macrocode}
%
% \end{environment}
@@ -854,7 +971,6 @@
% to \Dlst{mla}}
% \changes{v0.4}{2019/05/12}{Removed extra \cs{vspace}}
% \changes{v0.5}{2019/05/18}{Moved \cs{newpage} to beginning of environment}
-% \changes{v0.7}{2019/06/05}{Changed length to use \cs{MLA@indent}}
% \begin{macrocode}
\newenvironment{notes}{%
\newpage
@@ -872,25 +988,29 @@
% This is acheived with the \Dpkg{enumitem} package.
%
% \begin{macrocode}
-\newlist{mlanotes}{description}{1}
-\setlist[mlanotes]{%
- parsep=0pt,
- itemsep=0pt,
- topsep=0pt,
- leftmargin=\MLA@indent
-}
+\ifMLA@notes
+ \newlist{mlanotes}{description}{1}
+ \setlist[mlanotes]{%
+ parsep=0pt,
+ itemsep=0pt,
+ topsep=0pt,
+ leftmargin=\parindent
+ }
+\fi
% \end{macrocode}
%
% The following initializes the \Dpkg{enotez} package to use
% the \Dlst{mlanotes} list format.
%
% \begin{macrocode}
-\DeclareInstance{enotez-list}{mla}{list}{%
- heading = {},
- format = \normalsize\normalfont,
- list-type = mlanotes
-}
-\setenotez{list-name={},list-style=mla,backref}
+\ifMLA@notes
+ \DeclareInstance{enotez-list}{mla}{list}{%
+ heading = {},
+ format = \normalsize\normalfont,
+ list-type = mlanotes
+ }
+ \setenotez{list-name={},list-style=mla,backref}
+\fi
% \end{macrocode}
%
% \subsubsection{Bibliography}
@@ -904,7 +1024,7 @@
% \changes{v0.2}{2019/04/28}{Countered unexplained vertical space
% after heading}
% \changes{v0.5}{2019/05/18}{Moved \cs{newpage} to beginning of environment}
-% \changes{v0.7}{2019/06/05}{Changed length to use \cs{MLA@indent}}
+% \changes{v0.7}{2019/08/30}{Changed correction spacing from 16pt to 10pt}
% \begin{macrocode}
\newenvironment{workscited}{%
\newpage
@@ -912,7 +1032,7 @@
\pdfbookmark[0]{Works Cited}{workscited}
\begin{center}Works Cited\end{center}
\end{noindent}
- \vspace{-16pt} % XXX to counter unexplained space
+ \vspace{-10pt} % XXX to counter unexplained space
}{}
% \end{macrocode}
% \end{environment}
@@ -923,7 +1043,7 @@
% defined by the \Dpkg{biblatex} package.
%
% \begin{macrocode}
-\setlength{\bibhang}{\MLA@indent}
+\setlength{\bibhang}{\parindent}
% \end{macrocode}
%
% \appendix
diff --git a/Master/texmf-dist/source/latex/mluexercise/mluexercise.dtx b/Master/texmf-dist/source/latex/mluexercise/mluexercise.dtx
new file mode 100644
index 00000000000..4692e9b6a15
--- /dev/null
+++ b/Master/texmf-dist/source/latex/mluexercise/mluexercise.dtx
@@ -0,0 +1,813 @@
+%\iffalse
+%!TEX program = pdfLaTeX
+%<*internal>
+\iffalse
+%</internal>
+%<*license>
+MIT License
+
+Copyright (c) 2020 Fachschaftsrat Mathematik/Informatik der Studierendenschaft der Martin-Luther-Universität Halle-Wittenberg K.d.ö.R.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+%</license>
+%<*readme>
+# The `mluexercise` class
+
+Template class for exercises/homework, maintained by the [Computer Science Student's Council](https://fachschaft.mathinf.uni-halle.de) at [Martin Luther University Halle-Wittenberg](https://uni-halle.de).
+
+## Contact
+
+We are happy to accept pull requests and feature requests on [GitHub](https://github.com/fsrmatheinfo/mluexercise).
+Alternatively, you can contact us via email: [fachschaft@mathinf.uni-halle.de](mailto:fachschaft@mathinf.uni-halle.de)
+
+## License
+
+The `mluexercise` LaTeX class is distributed under the [MIT license](https://ctan.org/license/mit).
+%</readme>
+%<*internal>
+\fi
+\def\nameofplainTeX{plain}\ifx\fmtname\nameofplainTeX\else\expandafter\begingroup\fi
+%</internal>
+%<*install>
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\usedir{tex/latex/\jobname}
+\generate{
+ \file{\jobname.cls}{\from{\jobname.dtx}{class}}
+}
+%\endbatchfile
+%</install>
+%<*internal>
+\usedir{source/latex/\jobname}
+\generate{
+ \file{\jobname.ins}{\from{\jobname.dtx}{install}}
+}
+\nopreamble\nopostamble
+\usedir{doc/latex/\jobname}
+\generate{
+ \file{README.md}{\from{\jobname.dtx}{readme}}
+ \file{LICENSE.txt}{\from{\jobname.dtx}{license}}
+}
+\ifx\fmtname\nameofplainTeX\expandafter\endbatchfile\else\expandafter\endgroup\fi
+%</internal>
+%<*driver>
+\documentclass[a4paper,english]{ltxdoc}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{babel}
+\usepackage{libertine}
+\usepackage{eulervm}
+\usepackage[ttdefault]{sourcecodepro}
+\usepackage[colorlinks=false]{hyperref}
+\usepackage{relsize}
+\newcommand{\ttsmallfont}{\ttfamily\smaller}
+\renewcommand{\UrlFont}{\ttsmallfont}
+\renewcommand{\texttt}[1]{{\ttsmallfont #1}}
+\renewcommand{\MacroFont}{\ttfamily\footnotesize}
+\usepackage{listings}
+\usepackage{csquotes}
+\usepackage{booktabs}
+\usepackage[sf,bf]{titlesec}
+\lstset{
+ language=TeX,
+ basicstyle=\ttfamily\footnotesize,
+ breakatwhitespace=false,
+ breaklines=true,
+ prebreak={\mbox{\(\hookleftarrow\)}},
+ numbers=left,
+ numberstyle=\scriptsize,
+ numbersep=1pt,
+ keepspaces=true,
+ tabsize=4,
+ xleftmargin=1em,
+}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+^^A \OnlyDescription
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+%<*class>
+%\fi
+%
+%\renewcommand{\filedate}{2020/11/12}
+%\renewcommand{\fileversion}{v2.0}
+%
+%\title{\sffamily\bfseries The \texttt{\jobname} class\footnote{This document describes version \fileversion{}, last revised \filedate{}.}}
+%\author{\sffamily %
+% Jan Heinrich Reimer \\
+% Fachschaftsrat Mathematik/Informatik%
+% \footnote{Fachschaftsrat Mathematik/Informatik der Studierendenschaft der Martin-Luther-Universität Halle-Wittenberg K.d.ö.R., Von-Seckendorff-Platz~1, 06120~Halle~ (Saale), Germany} \\
+% \url{https://fachschaft.mathinf.uni-halle.de} \\
+% \texttt{fachschaft@mathinf.uni-halle.de}
+%}
+%\date{\sffamily Released \filedate{}}
+%
+%\maketitle
+%\tableofcontents
+%
+%\section{Introduction}
+%
+%The \texttt{mluexercise} class is a template class for solving weekly exercises at the Institute for Computer Science of Martin Luther University Halle-Wittenberg.\footnote{\url{https://uni-halle.de/}}
+%The class can be used by all students---especially first semesters---to typeset their exercises with a low-effort in beautiful \LaTeX{}.
+% We include a bunch of handy macros that are used throughout many lectures during the bachelor's degree program.
+%
+%\changes{v1.0}{2018/10/03}{Initial draft}
+%\changes{v2.0}{2020/11/12}{First public release}
+%
+%\section{Usage}
+%
+%\DescribeMacro{\documentclass}
+%Load the \texttt{mluexercise} class at the start of your preamble.
+%
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}[gobble=4]
+ \documentclass{mluexercise}
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%
+%\paragraph{Languages}
+%
+%As in many classes, you can define your main document language.
+%This will help \LaTeX{} in hyphenating words and structural texts (e.g.,~sections) are being translated automatically.
+%
+%\DescribeMacro{english}
+%The \texttt{english} option selects English language for texts and hyphenation.
+%
+%\DescribeMacro{ngerman}
+%The \texttt{ngerman} option selects German language (with new spelling) for texts and hyphenation.
+%
+%While you do not have to specify a language, it is a meaningful information for writers (including yourself) to explicitly state the desired language that should be used consistently throughout the whole document. If no language is specified, English language is used.
+%
+%\paragraph{Styles}
+%
+%\DescribeMacro{dataminingstyle}
+%The \texttt{dataminingstyle} option may be used for the \textquote{Data Mining} lecture and overwrites some mathematical symbols to match the lecture's definition's.
+%
+%\subsection{Exercise Metadata}
+%
+%Define the exercise's metadata and your identity. The below macros should be used only in the preamble, that is before \lstinline|\begin{document}|.
+%
+%\DescribeMacro{\lecture}
+%The \cs{lecture}\marg{name} macro sets the name of the lecture you are writing exercises for.
+%
+%\DescribeMacro{\semester}
+%The semester is automatically set to the current semester. You can overwrite the default value with the \cs{semester}\marg{semester} macro if you are compiling exercises for another semester.
+%
+%\DescribeMacro{\exercise}
+%The \cs{exercise}\marg{number} macro sets the number of the exercise you are working on.
+%
+%\DescribeMacro{\task}
+%The \cs{task}\marg{number} macro sets the number of the first task.
+%This is useful if you submit single PDF files for each task within the exercise.
+%If you omit this option, numbering starts at~1.
+%
+%\DescribeMacro{\group}
+%Sometimes tutors allow to submit exercises in groups.
+%You can use the optional \cs{group}\marg{number} macro to set the group number.
+%If no group number is given, the group number is not displayed.
+%
+%\DescribeMacro{\title}
+%The \cs{title}\marg{lecture name} macro is an alias for \cs{lecture}\marg{lecture name}.
+%
+%\DescribeMacro{\date}
+%The date is automatically set to the current date.
+%You can overwrite the default value with the \cs{date}\marg{date} macro.
+%
+%\subsection{Student Metadata}
+%
+%The following commands should be used to include identification in your exercise in order to assign your work.
+%
+%\DescribeMacro{\studentname}
+%You must define your full name with the \cs{studentname}\marg{full name} macro.
+%If you are working in a group, you can enter more names separated with commas and/or line breaks.
+%
+%\DescribeMacro{\studentnumber}
+%The \cs{studentnumber}\marg{matriculation number} macro specifies your student matriculation number (e.g.,~234\,567\,890). This is the same number as on your student ID card.
+%
+%\DescribeMacro{\studentsymbol}
+%The \cs{studentsymbol}\marg{shorthand symbol} macro specifies your shorthand symbol used for university IT services (e.g.,~abcde). This is the same username used for Stud.IP, university mail etc.
+%
+%Both \cs{studentnumber} an \cs{studentsymbol} are optional.
+%Though, most tutors require specifying either student number or symbol.
+%
+%\paragraph{Multiple Students}
+%
+%While you can use commas and line breaks in the above macros, we would suggest one of the following two options to submit work in groups with multiple students:
+%\begin{itemize}
+% \item Either use the services offered by the university to check-in your group members online~(e.g.,~in the Institute for Computer Science's \textquote{Übungsportal}).
+% In this case you don't need to specify multiple names in the preamble, but just your own name.
+% \item Or, if you cannot specify group members elsewhere, we recommend to add a footnote on the first page. That way you can list all other students but do not waste too much paper.
+%\end{itemize}
+%
+%\subsection{Included Packages}
+%
+%The \texttt{\jobname} class loads a number of useful \LaTeX{} packages listed in Table~\ref{tab:packages}.
+%Those are needed to typeset exercises during the Computer Science bachelor's degree programme at Martin Luther University Halle-Wittenberg.
+%We recommend reading the introductions of each package's documentation on CTAN\footnote{\url{https://ctan.org/}}.
+%\begin{table}
+% \caption{Packages included in the class.}
+% \label{tab:packages}
+% \begin{tabular}{lll}
+% \toprule
+% \textbf{Package} & \textbf{Purpose} & \textbf{Link} \\
+% \midrule
+% \texttt{babel} & hyphenation, localization & {\smaller\url{https://ctan.org/pkg/babel}} \\
+% \texttt{amsmath} & mathematics & {\smaller\url{https://ctan.org/pkg/amsmath}} \\
+% \texttt{amsthm} & & {\smaller\url{https://ctan.org/pkg/amsthm}} \\
+% \texttt{amssymb} & & {\smaller\url{https://ctan.org/pkg/amssymb}} \\
+% \texttt{amstext} & & {\smaller\url{https://ctan.org/pkg/amstext}} \\
+% \texttt{array} & & {\smaller\url{https://ctan.org/pkg/array}} \\
+% \texttt{cancel} & & {\smaller\url{https://ctan.org/pkg/cancel}} \\
+% \texttt{inputenc} & UTF8 encoding & {\smaller\url{https://ctan.org/pkg/inputenc}} \\
+% \texttt{fontenc} & T1 encoding & {\smaller\url{https://ctan.org/pkg/fontenc}} \\
+% \texttt{booktabs} & tables & {\smaller\url{https://ctan.org/pkg/booktabs}} \\
+% \texttt{graphicx} & images, graphics & {\smaller\url{https://ctan.org/pkg/graphicx}} \\
+% \texttt{xcolor} & color definitions & {\smaller\url{https://ctan.org/pkg/xcolor}} \\
+% \texttt{tikz} & drawing vector graphics & {\smaller\url{https://ctan.org/pkg/tikz}} \\
+% \texttt{pgfplots} & plotting & {\smaller\url{https://ctan.org/pkg/pgfplots}} \\
+% \texttt{algorithm2e} & pseudocode, algorithms & {\smaller\url{https://ctan.org/pkg/algorithm2e}} \\
+% \texttt{listings} & code listings & {\smaller\url{https://ctan.org/pkg/listings}} \\
+% \texttt{listingsutf8} & & {\smaller\url{https://ctan.org/pkg/listingsutf8}} \\
+% \texttt{subcaption} & sub-figures & {\smaller\url{https://ctan.org/pkg/subcaption}} \\
+% \texttt{csquotes} & quotation & {\smaller\url{https://ctan.org/pkg/csquotes}} \\
+% \bottomrule
+% \end{tabular}
+%\end{table}
+%
+%\section{Design Goals}
+%
+%The \texttt{\jobname} class should:
+%
+%\begin{itemize}
+% \item be usable for first semester students with rather little LaTeX experience,
+% \item be consistent with Martin Luther University brand guidelines\footnote{\url{https://www.pr.uni-halle.de/download/logo/}}, especially with respect to font families and colors, and
+% \item include packages frequently needed by students.
+%\end{itemize}
+%
+%\section{Implementation}
+%
+%\subsection{Setup}
+%
+%We specify the \LaTeX{} version, define and parse options and then load the base class \texttt{scrartcl}\footnote{\url{https://ctan.org/pkg/scrartcl}} with all remaining options.
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{mluexercise}[2020/11/12 v2.0]
+% \end{macrocode}
+%
+%\paragraph{Options}
+%
+% \begin{macrocode}
+\newif\ifdataminingstyle\dataminingstylefalse
+\DeclareOption{dataminingstyle}{%
+ \dataminingstyletrue
+}
+% \end{macrocode}
+%
+%Process options and load base class with remaining options.
+%
+% \begin{macrocode}
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrartcl}}
+\ProcessOptions*
+\LoadClass{scrartcl}
+% \end{macrocode}
+%
+%To enable support for UTF8 and some other useful basics, we load a bunch of packages.
+%
+% \begin{macrocode}
+\RequirePackage[utf8]{inputenc}
+\RequirePackage[T1]{fontenc}
+\RequirePackage{ifthen} % Conditional branches and loops.
+\RequirePackage{etoolbox} % Hooks for executing code.
+\RequirePackage{hyperref} % Hyperlinks.
+\RequirePackage{xcolor} % Color definitions.
+% \end{macrocode}
+%
+%As we'd like to be able to switch between English and German with proper hyphenation, load language support packages.%
+%\footnote{If you'd like to add a language, please contact us.}
+%
+% \begin{macrocode}
+\RequirePackage{babel}
+\RequirePackage{iflang}
+\newcommand{\IfGerman}[2]{\IfLanguagePatterns{german}{#1}{%
+ \IfLanguagePatterns{ngerman}{#1}{#2}}}
+% \end{macrocode}
+%
+%\subsection{Global Variables}
+%
+%The class can be configured with the lecture's and student's details. We define global variables for that and redefine some built in \LaTeX{} commands to ease the migration from standard classes.
+%
+% \begin{macrocode}
+\newcommand{\@checkoption}[3]{%
+ \AtEndPreamble{%
+ \ifthenelse{\equal{\the#1}{}}{%
+ \ClassError{mluexercise}{Missing #2}{%
+ Set #2 using the \protect#3 command.%
+ }%
+ }{}%
+ }%
+}
+\newtoks\@lecture
+\newcommand{\lecture}[1]{\global\@lecture{#1}}
+\let\title\lecture % Redefine standard \title command.
+\@checkoption{\@lecture}{lecture name}{\lecture}
+\newtoks\@semester
+\newcommand{\semester}[1]{\global\@semester{#1}}
+\global\@semester{ % Automatically set semester based on current date.
+ \ifnum\month<4 % Winter semester, including previous year.
+ WS~{\advance\year by -1 \the\year\advance\year by 1}/\the\year%
+ \else\ifnum\month<10 % Summer semester.
+ SS~\the\year%
+ \else % Winter semester, including next year.
+ WS~\the\year/{\advance\year by 1 \the\year\advance\year by -1}%
+ \fi\fi%
+}
+\newtoks\@exercise
+\newcommand{\exercise}[1]{\global\@exercise{#1}}
+\@checkoption{\@exercise}{exercise number}{\exercise}
+\newtoks\@task
+\newcommand{\task}[1]{\global\@task{#1}}
+\global\@task{1}
+\newtoks\@group
+\newcommand{\group}[1]{\global\@group{#1}}
+\global\@group{0}
+\newtoks\@studentname
+\newcommand{\studentname}[1]{\global\@studentname{#1}}
+\let\author\studentname % Redefine standard \title command.
+\@checkoption{\@studentname}{student name}{\studentname}
+\newtoks\@studentnumber
+\newcommand{\studentnumber}[1]{\global\@studentnumber{#1}}
+\newtoks\@studentsymbol
+\newcommand{\studentsymbol}[1]{\global\@studentsymbol{#1}}
+% \end{macrocode}
+%
+%\subsection{Layout, Text}
+%
+%Set up a reasonable page layout and define text styles that comply with Martin Luther University brand guidelines.
+%
+% \begin{macrocode}
+\RequirePackage{calc}
+\RequirePackage[
+ a4paper,
+ inner=2cm,
+ outer=2cm,
+ top=3cm,
+ bottom=3cm,
+ head=0.75cm,
+ headsep=0.25cm,
+ foot=0.75cm,
+]{geometry}
+\renewcommand{\baselinestretch}{1.15}
+\setlength{\parindent}{0em} % Disable paragraph indentation.
+\setlength{\parskip}{1ex} % Instead enable paragraph margins.
+% \end{macrocode}
+%
+%\paragraph{Font Families}
+%
+%We use Libertine as main font as that is the closest free font to the proprietary URW~Classico font used by the university. For mathematics we use the more modern Euler~Maths font and for source code the \emph{true} monospace font Source~Code~Pro, as otherwise copying from the PDF is broken. For clarity reasons we do not want code ligatures.
+%
+% \begin{macrocode}
+\RequirePackage{libertine}
+\RequirePackage{eulervm}
+\RequirePackage[ttdefault]{sourcecodepro}
+\RequirePackage{microtype}
+\DisableLigatures{family=tt*}
+% \end{macrocode}
+%
+%\paragraph{Text Styles}
+%
+% \begin{macrocode}
+\newcommand{\strong}[1]{\textbf{#1}}
+\newcommand{\italic}[1]{\textit{#1}}
+\newcommand{\code}[1]{\texttt{#1}}
+% Double underline.
+\newcommand{\Underline}[1]{\underline{\underline{#1}}}
+% Abbreviated plural ("Lineare Algebra" lecture).
+\newcommand{\plural}[1]{\textsuperscript{\underline{#1}}}
+\newcommand{\pl}[1]{\plural{#1}}
+\RequirePackage[autostyle=true,german=quotes]{csquotes}
+% \end{macrocode}
+%
+%\paragraph{URL / Link Font}
+%
+% \begin{macrocode}
+\RequirePackage{relsize}
+\newcommand{\ttsmallfont}{\ttfamily\smaller}
+\renewcommand{\UrlFont}{\ttsmallfont}
+\newcommand{\textttsmall}[1]{{\ttsmallfont #1}}
+\newcommand{\query}[1]{{\ttsmallfont #1}}
+\newcommand{\domain}[1]{\href{http://#1}{\mbox{\ttsmallfont #1}}}
+\newcommand{\email}[1]{\href{mailto:#1}{\mbox{\ttsmallfont #1}}}
+% \end{macrocode}
+%
+%\paragraph{Headings}
+%
+% \begin{macrocode}
+\setkomafont{sectioning}{\sffamily\mdseries}
+\setkomafont{section}{\LARGE}
+\setkomafont{subsection}{\Large}
+\setkomafont{subsubsection}{\large}
+\setkomafont{paragraph}{\large}
+\setkomafont{subparagraph}{\normalsize}
+\renewcommand{\thesection}{%
+ \bfseries\upshape \IfGerman{Aufgabe}{Task} \arabic{section}}
+\renewcommand{\thesubsection}{%
+ \bfseries\upshape \alph{subsection})}
+\renewcommand{\thesubsubsection}{%
+ \upshape (\roman{subsubsection})}
+\renewcommand{\autodot}{}
+% \end{macrocode}
+%
+%\paragraph{Title}
+%
+% \begin{macrocode}
+\newcommand{\Rom}[1]{\uppercase\expandafter{\romannumeral#1\relax}}
+\newcommand{\groupstring}{\ifnum\the\@group>0{,
+ \IfGerman{Gruppe}{Group} \Rom{\the\@group}}\fi}
+\author{}
+\setkomafont{title}{\sffamily\bfseries\huge\centering}
+\setkomafont{date}{\sffamily\large\centering}
+\newlength{\approxtitlewidth}
+\renewcommand{\maketitle}{%
+ \settowidth{\approxtitlewidth}{%
+ \usefontofkomafont{title}\the\@lecture}%
+ \ifthenelse{\lengthtest{\approxtitlewidth>\textwidth}}{%
+ \addtokomafont{title}{\LARGE}}{}%
+ \begin{center}%
+ \usefontofkomafont{title}\the\@lecture \\
+ \usefontofkomafont{date}\@date, \the\@semester\groupstring
+ \end{center}
+}
+% \end{macrocode}
+%
+%\paragraph{Head, Foot}
+%
+% \begin{macrocode}
+\RequirePackage[headsepline,footsepline]{scrlayer-scrpage}
+\RequirePackage{totpages}
+\pagestyle{scrheadings}
+\clearscrheadfoot
+\setkomafont{pageheadfoot}{\sffamily}
+\setkomafont{pagenumber}{\sffamily}
+\ofoot{\thepage~von~\ref{TotPages}}
+% \end{macrocode}
+%
+%\subsection{Mathematics}
+%
+%We rely on AMS packages for rendering mathematical equations, proofs, and symbols.
+%Additionally we load packages for arrays in math mode and cancellations
+%
+% \begin{macrocode}
+\RequirePackage{amsmath}
+\RequirePackage{amsthm}
+\RequirePackage{amssymb}
+\RequirePackage{amstext}
+\RequirePackage{array}
+\RequirePackage{cancel}
+% \end{macrocode}
+%
+%Now we define (more readable) macros for the mathematical symbols and functions most commonly used at Martin Luther University.
+%
+% \begin{macrocode}
+\newcommand{\union}{\cup}
+\newcommand{\disjunction}{\uplus}
+\newcommand{\intersection}{\cap}
+\newcommand{\intersect}{\cap}
+\newcommand{\infinity}{\infty}
+\newcommand{\corresponds}{\triangleq}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand{\C}{\mathbb{C}} % Complex numbers.
+\newcommand{\complexnumbers}{\C}
+\newcommand{\R}{\mathbb{R}} % Real numbers.
+\newcommand{\realnumbers}{\R}
+\newcommand{\Q}{\mathbb{Q}} % Rational numbers.
+\newcommand{\rationalnumbers}{\Q}
+\newcommand{\Z}{\mathbb{Z}} % Whole numbers.
+\newcommand{\wholenumbers}{\Z}
+\newcommand{\N}{\mathbb{N}} % Natural numbers.
+\newcommand{\naturalnumbers}{\N}
+\newcommand{\B}{\mathbb{B}} % Binary numbers.
+\newcommand{\binarynumbers}{\B}
+% \end{macrocode}
+%
+% \begin{macrocode}
+% Equivalence transformation
+\newcommand{\eqtransform}{\ensuremath{\qquad\big|\,\,}}
+% "Ditto" sign
+\newcommand{\ditto}{\textquotedbl} \newcommand{\dito}{\ditto}
+% End of proof: "quod erat demonstrandum"
+\renewcommand{\qed}{\nopagebreak\hfill\ensuremath{\square}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand{\mland}{\(\land\)} % \land in text.
+\newcommand{\mlor}{\(\lor\)} % \lor in text.
+% \end{macrocode}
+%
+%Many maths symbols can have alternatives for stylistic choices. We enable the variants most liked by our tutors.
+%
+% \begin{macrocode}
+\let\tmp\mod \let\mod\bmod \let\bmod\tmp
+\let\varemptyset\emptyset \let\emptyset\varnothing
+\let\tmp\epsilon \let\epsilon\varepsilon \let\varepsilon\tmp
+\let\tmp\phi \let\phi\varphi \let\varphi\tmp
+% \end{macrocode}
+%
+%For some specific lectures we provide more detailed macros for symbols and functions.
+%
+%\paragraph{Lecture \textquote{Lineare Algebra}}
+%
+% \begin{macrocode}
+\newcommand{\base}[1]{\mathcal{#1}} % Base (caligraphic)
+\DeclareMathOperator{\im}{im} % Image
+\DeclareMathOperator{\id}{id} % Identity
+\DeclareMathOperator{\sel}{sel} % Selection
+\DeclareMathOperator{\dom}{dom} % Domain
+\DeclareMathOperator{\ran}{ran} % Range
+\DeclareMathOperator{\Hom}{Hom} % Homomorphism
+\DeclareMathOperator{\End}{End} % Endomorphism
+% \end{macrocode}
+%
+%\paragraph{Lecture \textquote{Datenstrukturen und effiziente Algorithmen}}
+%
+% \begin{macrocode}
+\renewcommand{\O}{\mathcal{O}} % asymptotic O-Notation (Landau)
+\DeclareMathOperator{\indeg}{indeg} % Indegree
+\DeclareMathOperator{\outdeg}{outdeg} % Outdegree
+% \end{macrocode}
+%
+%\paragraph{Lecture \textquote{Einführung in Data Science}}
+%
+% \begin{macrocode}
+\renewcommand{\P}{\ifdataminingstyle p\else\mathbf{P}\fi}
+\newcommand{\E}{\ifdataminingstyle\mathbb{E}\else\mathbf{E}\fi}
+\DeclareMathOperator{\var}{var}
+\DeclareMathOperator{\Var}{Var}
+\DeclareMathOperator{\cov}{cov}
+\DeclareMathOperator{\Cov}{Cov}
+\DeclareMathOperator{\Bin}{Bin}
+\DeclareMathOperator{\Exp}{Exp}
+\DeclareMathOperator{\Dir}{Dir}
+\DeclareMathOperator{\Mult}{Mult}
+\newcommand{\Normal}{\mathcal{N}}
+\newcommand{\Norm}{\Normal}
+% \end{macrocode}
+%
+%\paragraph{Table Columns}
+%
+%The handy \texttt{tabular} column definitions below can be used to typeset a whole column in math mode, to avoid repetetive opening/closing brackets.
+%
+% \begin{macrocode}
+\newcolumntype{L}{>{\(}l<{\)}}
+\newcolumntype{R}{>{\(}r<{\)}}
+\newcolumntype{C}{>{\(}c<{\)}}
+% \end{macrocode}
+%
+%\paragraph{Calculus Environments}
+%
+%Calculus environments are currently work in progress, subject to change, and may not work as expected.
+%However, they can simplify writing logical consequences in the \textquote{Mathematische Grundlagen der Informatik und Konzepte der Modellierung} lecture.
+%
+% \begin{macrocode}
+\newcounter{calculusRowCount}
+\RequirePackage{pgfkeys}
+\newenvironment{calculus}[1]{
+\pgfkeys{/mlu/calculus/.cd,show index=false,
+ context=\Gamma,context command=context,#1}
+\setcounter{calculusRowCount}{0}
+\newcommand{\calculusSymbol}{\text{
+ \sffamily\itshape\pgfkeysvalueof{/mlu/calculus/symbol}}}
+\newcommand{\calculusContext}{\ensuremath{
+ \pgfkeysvalueof{/mlu/calculus/context}}}
+\expandafter\let\csname \pgfkeysvalueof{/mlu/calculus/context command}%
+ \endcsname\calculusContext
+\par\vspace{0.5em}
+\begin{minipage}{\textwidth}\begin{tabular}{
+ @{\stepcounter{calculusRowCount}
+ (\arabic{calculusRowCount})\hspace{1em}} R
+ @{\hspace{0.4em}
+ \(
+ \vdash_{%
+ \ifthenelse{%
+ \equal{\pgfkeysvalueof{/mlu/calculus/show index}}{true}
+ }{
+ \ifthenelse{%
+ \equal{\pgfkeysvalueof{/mlu/calculus/symbol}}{}%
+ }{}{%
+ \calculusSymbol%
+ }%
+ }{%
+ \hspace{-0.1em}%
+ }%
+ }%
+ \)\hspace{0.6em}}
+ L l
+ }
+}{
+\end{tabular}\end{minipage}\vspace{0.5em}
+\let\calculusContext\undefined \let\calculusSymbol\undefined
+\expandafter\let\csname \pgfkeysvalueof{/mlu/calculus/context command}%
+ \endcsname\undefined
+}
+\newenvironment{eqcalc}[1][]{\begin{calculus}[
+ symbol=E,show index=true,context={\calculusSymbol_{#1}},
+ context command=E]}{\end{calculus}} % Equation calculus
+\newenvironment{seqcalc}{\begin{calculus}[
+ symbol=S,show index=true, context={\calculusSymbol},
+ context command=seq]}{\end{calculus}} % Sequence calculus
+% \end{macrocode}
+%
+%\subsection{Algorithms, Pseudocode}
+%\label{sec:implementation-pseudocode}
+%
+% \begin{macrocode}
+\RequirePackage[vlined,linesnumbered]{algorithm2e}
+\DontPrintSemicolon % Hide semicolons.
+\SetKwProg{Function}{function}{\ is}{end function}
+\SetKwComment{Comment}{\quad\(\triangleright\)~}{} % Comment style.
+\SetCommentSty{itshape} % Comment font.
+\SetKw{Continue}{continue}
+\SetKwBlock{Repeat}{repeat}{}
+\SetNlSty{tiny}{}{} % Line number font.
+\SetNlSkip{0.5em} % Line number skip.
+\SetAlgoNlRelativeSize{0}
+\SetAlFnt{\footnotesize}
+% \end{macrocode}
+%
+%\subsection{Code Listings}
+%
+%For syntax highlighting and including source code listings, we use the \texttt{listings} package.
+%With \texttt{listingsutf8} we can include listings that contain Unicode characters.
+%
+% \begin{macrocode}
+\RequirePackage{listings}
+\RequirePackage{listingsutf8} % UTF8 support in included listings.
+% \end{macrocode}
+%
+%Define colors for syntax highlighting.
+%
+% \begin{macrocode}
+\definecolor{lsnumber}{rgb}{0,0,0} % Zeilennummerfarbe
+\definecolor{lscomment}{rgb}{0.25,0.5,0.35} % Kommentarfarbe
+\definecolor{lskeyword}{rgb}{0.5,0,0.35} % Schlüsselwörterfarbe
+\definecolor{lsstring}{rgb}{0.6,0,0} % Zeichenkettenfarbe
+% \end{macrocode}
+%
+%The default listing style below is enabled automatically and should guarantee consistency with the appearance of pseudocode (see Section~\ref{sec:implementation-pseudocode}).
+%
+% \begin{macrocode}
+\lstset{
+ language=C,
+ basicstyle=\ttfamily,
+ breakatwhitespace=false,
+ breaklines=true,
+ prebreak={\mbox{\footnotesize\(\hookleftarrow\)}},
+ numbers=left,
+ numberstyle=\color{lsnumber}\tiny,
+ numbersep=0.5em,
+ stepnumber=1,
+ commentstyle=\color{lscomment},
+ morecomment=[s][\color{lscomment}]{/**}{*/},
+ keepspaces=true,
+ keywordstyle=\bfseries\color{lskeyword},
+ stringstyle=\color{lsstring},
+ showtabs=false, showspaces=false,
+ showstringspaces=false,
+ tabsize=2,
+}
+% \end{macrocode}
+%
+%\paragraph{Haskell Language Definition}
+%
+%Refine the Haskell language definition and code style for use in the \textquote{Konzepte der Programmierung} lecture.
+%
+% \begin{macrocode}
+\lstdefinelanguage[Zimmermann]{haskell}[]{haskell}{
+ escapeinside={*'}{'*},
+ showstringspaces=false,
+ morecomment=[l]\%,
+ captionpos=b,
+ emphstyle={\bfseries},
+}
+\lstalias[]{zhaskell}[Zimmermann]{haskell}
+% Deprecated. Use `language=zhaskell` instead of `style=haskell`.
+\lstdefinestyle{haskell}{language=zhaskell}
+% \end{macrocode}
+%
+%\paragraph{Assembler Language Definition}
+%Introduce a new language definition for Prof.~Molitor's Assembler dialect used in \textquote{Einführung in Rechnerarchitektur}.
+%
+% \begin{macrocode}
+\lstdefinelanguage[Molitor]{Assembler}[x86masm]{Assembler}{
+ morekeywords={
+ ldd,sto,shl,shr,rol,ror,sub,add,shli,shri,roli,rori,
+ subi,addi,or,and,xor,xnor,jmp,beq,bneq,bgt,bo,ldpc,stpc
+ },
+ comment=[l]{\#},
+}
+\lstalias[]{massembler}[Molitor]{Assembler}
+% Deprecated. Use `language=massembler` instead of `style=massembler`.
+\lstdefinestyle{massembler}{language=massembler}
+% \end{macrocode}
+%
+%\subsection{Graphics, Drawing, Plots}
+%
+%We add packages for including images and graphics, for drawing vector graphics, and for plotting data or functions.
+%
+% \begin{macrocode}
+\RequirePackage{booktabs}
+\RequirePackage{graphicx}
+\RequirePackage{float}
+\RequirePackage{subcaption}
+\RequirePackage{tikz}
+\RequirePackage{pgfplots}
+\RequirePackage{rotating}
+\usetikzlibrary{positioning}
+\usetikzlibrary{automata}
+\usetikzlibrary{trees}
+\tikzset{
+ >=latex,
+ font=\sffamily,
+}
+\pgfplotsset{compat=1.16}
+% \end{macrocode}
+%
+%\subsection{Document Hooks}
+%
+%The following \LaTeX{} code should be inserted just before \lstinline|\begin{document}|.
+%
+% \begin{macrocode}
+\AtEndPreamble{
+% \end{macrocode}
+%
+%Update exercise and task number as specified in the preamble. (Set first section number to task number.)
+%
+% \begin{macrocode}
+ \setcounter{section}{\the\@task} \addtocounter{section}{-1}
+ \newcommand{\@exercisestring}{\IfGerman{%
+ \the\@exercise.~Übungsserie}{Exercise~\the\@exercise}}
+% \end{macrocode}
+%
+%Set up page head/foot with metadata.
+%
+% \begin{macrocode}
+ \ihead{\the\@studentname}
+ \chead{\textbf{\@exercisestring}}
+ \ohead{
+ \the\@studentnumber%
+ \ifthenelse{\equal{\the\@studentnumber}{} \OR
+ \equal{\the\@studentsymbol}{}}{}{\ /\,}%
+ \the\@studentsymbol%
+ }
+% \end{macrocode}
+%
+%Set up PDF metadata.
+%
+% \begin{macrocode}
+ \hypersetup{
+ pdfauthor={\the\@studentname},
+ pdftitle={\@exercisestring - \the\@lecture}
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+}
+% \end{macrocode}
+%
+%\iffalse
+%</class>
+%\fi
+%
+%\StopEventually{
+% \PrintChanges
+%}
+%
+%\Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/mluexercise/mluexercise.ins b/Master/texmf-dist/source/latex/mluexercise/mluexercise.ins
new file mode 100644
index 00000000000..afbe0a0d131
--- /dev/null
+++ b/Master/texmf-dist/source/latex/mluexercise/mluexercise.ins
@@ -0,0 +1,32 @@
+%%
+%% This is file `mluexercise.ins',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% mluexercise.dtx (with options: `install')
+%%
+%% IMPORTANT NOTICE:
+%%
+%% For the copyright see the source file.
+%%
+%% Any modified versions of this file must be renamed
+%% with new filenames distinct from mluexercise.ins.
+%%
+%% For distribution of the original source see the terms
+%% for copying and modification in the file mluexercise.dtx.
+%%
+%% This generated file may be distributed as long as the
+%% original source files, as listed above, are part of the
+%% same distribution. (The sources need not necessarily be
+%% in the same archive or directory.)
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\usedir{tex/latex/\jobname}
+\generate{
+ \file{\jobname.cls}{\from{\jobname.dtx}{class}}
+}
+\endinput
+%%
+%% End of file `mluexercise.ins'.
diff --git a/Master/texmf-dist/source/latex/moderntimeline/moderntimeline.dtx b/Master/texmf-dist/source/latex/moderntimeline/moderntimeline.dtx
index ff31f0fcdc4..6fcef55c708 100644
--- a/Master/texmf-dist/source/latex/moderntimeline/moderntimeline.dtx
+++ b/Master/texmf-dist/source/latex/moderntimeline/moderntimeline.dtx
@@ -26,12 +26,12 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{moderntimeline}
%<*package>
- [2015/08/31 0.9 Add timelines to moderncv entries]
+ [2020/06/11 0.11 Add timelines to moderncv entries]
%</package>
%
%<*driver>
\documentclass{ltxdoc}
-\usepackage{moderntimeline}[2012/04/26]
+\usepackage{moderntimeline}[2020/06/11]
\EnableCrossrefs
\CodelineIndex
\RecordChanges
@@ -43,7 +43,7 @@
%</driver>
% \fi
%
-% \CheckSum{352}
+% \CheckSum{413}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -62,6 +62,7 @@
% Right brace \} Tilde \~}
%
%
+% \changes{0.11}{2020/06/11}{Add support for timeline bar marks, thanks to jordieh}
% \changes{0.10}{2019/03/04}{Add support to specify label for end date, thanks to ypid and Astrinus}
% \changes{0.9}{2015/08/31}{Add month support, thanks to Astrinus}
% \changes{0.8}{2015/02/25}{Add the tlsetnotshadedfraction command, thanks to Stefano Gronchi}
@@ -102,12 +103,16 @@
% and can be loaded with:
%
% \begin{verbatim}
-% \usepackage[firstyear=1999,lastyear=2012]{moderntimeline}
+% \usepackage[firstyear=1999,lastyear=2012,
+% marksyr=0.4ex,marksmo=0.2ex
+% ]{moderntimeline}
% \end{verbatim}
%
% The \texttt{firstyear} and \texttt{lastyear} options indicate the maximum dates used
% to calibrate the time line. They are not mandatory and can be set later
% by means of the |\ltmaxdates| macro.
+% The \texttt{marksyr} and \texttt{marksmo} options behave exactly the same as
+% the |\tlenablemarksyr| and |\tlenablemarksmo| (and associated) macros.
%
% \subsection{Settings}
%
@@ -228,6 +233,21 @@
% the beginning of the year, so is not advisable to use months in dates.
% Default.
%
+% \DescribeMacro{\tlenablemarksmo}
+% This macro places vertical lines on the timeline bar at every month and year.
+% You can set the height of the marks with |\tlmarkheightmo| (default = 0.2ex).
+%
+% \DescribeMacro{\tlenablemakrsyr}
+% This macro places vertical lines on the timeline bar at every year.
+% You can set the height of the marks with |\tlmarkheightyr| (default = 0.4ex).
+%
+% \DescribeMacro{\tldisablemarksyr}
+% Disables the vertical lines marking years on the timeline bar.
+% This is the opposite of |\tlenablemarksyr|.
+%
+% \DescribeMacro{\tldisablemarksmo}
+% Disables the vertical lines marking months and years on the timeline bar.
+% This is the opposite of |\tlenablemarksmo|.
%
% \subsection{CV entries}
%
@@ -341,6 +361,8 @@
}
\DeclareStringOption{firstyear}
\DeclareStringOption{lastyear}
+\DeclareStringOption{marksmo}[0.2ex]
+\DeclareStringOption{marksyr}[0.4ex]
\ProcessKeyvalOptions*
\newif\ifstartyear
\newif\ifissince
@@ -371,6 +393,22 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\tlmarkheightmo}
+% \begin{macrocode}
+\newcommand{\tlmarkheightmo}[1]{%
+ \def\tl@marksmo{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tlmarkheightyr}
+% \begin{macrocode}
+\newcommand{\tlmarkheightyr}[1]{%
+ \def\tl@marksyr{#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\tlsince}
% \begin{macrocode}
\newcommand{\tlsince}[1]{%
@@ -469,6 +507,42 @@
% \end{macro}
%
%
+% \begin{macro}{\tldisablemarksyr}
+% \begin{macrocode}
+\newcommand{\tldisablemarksyr}{%
+ \def\tl@marksyr{}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\tlenablemarksyr}
+% \begin{macrocode}
+\newcommand{\tlenablemarksyr}{%
+ \def\tl@marksyr{0.4ex}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\tldisablemarksmo}
+% \begin{macrocode}
+\newcommand{\tldisablemarksmo}{%
+ \def\tl@marksmo{}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\tlenablemarksmo}
+% \begin{macrocode}
+\newcommand{\tlenablemarksmo}{%
+ \def\tl@marksmo{0.2ex}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
% Defaults
% \begin{macrocode}
\tltext{\scriptsize}
@@ -532,6 +606,28 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\tl@tlcvbar}
+% \begin{macrocode}
+\newcommand{\tl@tlcvbar}{
+ \pgfmathsetmacro\tl@yearrange{\tl@lastyear-\tl@firstyear}
+ \pgfmathsetmacro\tl@totalmonths{12*\tl@yearrange}%
+ \pgfmathsetmacro\tl@tickdistmo{\hintscolumnwidth/\tl@totalmonths}%
+ \pgfmathsetmacro\tl@tickdistyr{\hintscolumnwidth/\tl@yearrange}%
+ \useasboundingbox (0,-1.5ex) rectangle (\hintscolumnwidth,1ex);
+ \fill [\tl@runningcolor] (0,0)
+ rectangle (\hintscolumnwidth,\tl@runningwidth);
+ \ifx\tl@marksyr\empty\relax\else
+ \foreach \x in {0, ..., \tl@yearrange}
+ \draw [\tl@runningcolor](\x*\tl@tickdistyr pt,0ex) -- (\x*\tl@tickdistyr pt,\tl@marksyr);
+ \fi
+ \ifx\tl@marksmo\empty\relax\else
+ \foreach \x in {0, ..., \tl@totalmonths}
+ \draw [\tl@runningcolor](\x*\tl@tickdistmo pt,0ex) -- (\x*\tl@tickdistmo pt,\tl@marksmo);
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\tl@splitlabels}
% \begin{macrocode}
\newcommand{\tl@splitlabels}[1]{
@@ -605,9 +701,7 @@
\issincefalse
\tl@formatstartyear{#2}
\cventry{\tikz[baseline=0pt]{
- \useasboundingbox (0,-1.5ex) rectangle (\hintscolumnwidth,1ex);
- \fill [\tl@runningcolor] (0,0)
- rectangle (\hintscolumnwidth,\tl@runningwidth);
+ \tl@tlcvbar
\fill [#1] (0,0)
++(\tl@startfraction*\hintscolumnwidth,0pt)
node [tl@startyear] {#3}
@@ -627,9 +721,7 @@
\issincefalse
\tl@formatstartyear{#2}
\cventry{\tikz[baseline=0pt]{
- \useasboundingbox (0,-1.5ex) rectangle (\hintscolumnwidth,1ex);
- \fill [\tl@runningcolor] (0,0)
- rectangle (\hintscolumnwidth,\tl@runningwidth);
+ \tl@tlcvbar
\fill [#1] (0,0)
++(\tl@startfraction*\hintscolumnwidth,0pt)
node [tl@singleyear] {#2}
@@ -649,9 +741,7 @@
\tl@formatendyear{#3}
\tl@formatstartyear{#2}
\cventry{\tikz[baseline=0pt]{
- \useasboundingbox (0,-1.5ex) rectangle (\hintscolumnwidth,1ex);
- \fill [\tl@runningcolor] (0,0)
- rectangle (\hintscolumnwidth,\tl@runningwidth);
+ \tl@tlcvbar
\fill [#1] (0,0)
++(\tl@startfraction*\hintscolumnwidth,0pt)
node [tl@startyear] {\tl@startlabel}
@@ -665,7 +755,7 @@
(\tl@startfraction*\hintscolumnwidth,0)
rectangle (\fullcolorwidth,\tl@width);
\shade [left color=#1] (\fullcolorwidth,0)
- rectangle (\tl@endfraction*\hintscolumnwidth,\tl@width);
+ rectangle (\tl@endfraction*\hintscolumnwidth + 1,\tl@width);
\else
\fill [#1] (\tl@startfraction*\hintscolumnwidth,0)
rectangle (\tl@endfraction*\hintscolumnwidth,\tl@width);
@@ -686,10 +776,7 @@
\tl@formatstartyear{#2}
\tl@splitlabels{#4}
\cventry{\tikz[baseline=0pt]{
- \fill [\tl@runningcolor] (0,0)
- rectangle (\hintscolumnwidth,\tl@runningwidth);
- \useasboundingbox (0,-1.5ex)
- rectangle (\hintscolumnwidth,1ex);
+ \tl@tlcvbar
\fill [#1] (0,0)
++(\tl@startfraction*\hintscolumnwidth,0pt)
node [tl@startyear] {\tl@startlabel}
diff --git a/Master/texmf-dist/source/latex/moodle/makefile b/Master/texmf-dist/source/latex/moodle/makefile
new file mode 100644
index 00000000000..b77b462daa0
--- /dev/null
+++ b/Master/texmf-dist/source/latex/moodle/makefile
@@ -0,0 +1,90 @@
+PROJECT_NAME=moodle
+FILE_CLEAN=*.sty *.log *.aux *.auxlock *.out *.blg *.bbl *.toc *.xml *.bcf *.synctex.gz *~ *.nav *.snm *.idx *.ilg *.ind _minted-* *.glo *.gls *.dpth
+LATEX=latex
+PDFLATEX=lualatex
+LATEXFLAGS=-interaction=nonstopmode -shell-escape
+DIFFTOOL=meld
+MAKEINDEX=makeindex
+TESTDIR=test
+RECURSIVE_TARGETS= all clean distclean test
+RERUNLATEX= '(There were undefined references|Rerun to get (cross-references|the bars) right)'
+
+ifndef DEBUG
+ DEBUG=> /dev/null
+endif
+
+.DEFAULT_GOAL := all
+
+.PHONY: all clean distclean test dist install
+
+all: $(PROJECT_NAME).pdf $(PROJECT_NAME).sty
+
+clean: $(TESTDIR)/clean
+ rm -rf $(FILE_CLEAN)
+
+distclean: clean
+
+distclean: $(TESTDIR)/distclean
+ rm -rf *.pdf *.xml *.zip
+ rm -rf texmf/ ./$(PROJECT_NAME)/
+
+test: $(TESTDIR)/test
+
+dist: test $(PROJECT_NAME).zip
+ @mv $(PROJECT_NAME).zip $(PROJECT_NAME)_$(shell date +"%Y-%m-%d").zip
+ @mv $(PROJECT_NAME).tds.zip $(PROJECT_NAME)_$(shell date +"%Y-%m-%d").tds.zip
+ @cp $(PROJECT_NAME).pdf $(PROJECT_NAME)_$(shell date +"%Y-%m-%d").pdf
+ @$(MAKE) clean -C .
+
+$(PROJECT_NAME).zip: $(PROJECT_NAME).tds.zip $(PROJECT_NAME).pdf
+ @mkdir -p ./$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).dtx ./$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).ins ./$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).pdf ./$(PROJECT_NAME)/
+ @cp README.ctan ./$(PROJECT_NAME)/README.md
+ zip -r9 $(PROJECT_NAME).zip $(PROJECT_NAME).tds.zip $(PROJECT_NAME)
+
+$(PROJECT_NAME).tds.zip : $(PROJECT_NAME).pdf $(PROJECT_NAME).sty
+ @mkdir -p ./texmf/tex/latex/$(PROJECT_NAME)/
+ @mkdir -p ./texmf/source/latex/$(PROJECT_NAME)/
+ @mkdir -p ./texmf/doc/latex/$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).sty ./texmf/tex/latex/$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).dtx ./texmf/source/latex/$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).ins ./texmf/source/latex/$(PROJECT_NAME)/
+ @cp makefile ./texmf/source/latex/$(PROJECT_NAME)/
+ @cp $(PROJECT_NAME).pdf ./texmf/doc/latex/$(PROJECT_NAME)/
+ @cp README.ctan ./texmf/doc/latex/$(PROJECT_NAME)/README.md
+ @cp LICENSE ./texmf/doc/latex/$(PROJECT_NAME)/
+ @$(MAKE) distclean -C $(TESTDIR)
+ @rsync -avq --exclude='$(TESTDIR)/extra' --exclude='$(TESTDIR)/media' --exclude='$(TESTDIR)/dev_*.tex' $(TESTDIR) ./texmf/doc/latex/$(PROJECT_NAME)
+ @cd texmf/ ; zip -r9 ../$(PROJECT_NAME).tds.zip tex source doc
+
+install: $(PROJECT_NAME).tds.zip
+ @unzip -d ~/texmf ./$(PROJECT_NAME).tds.zip
+
+$(PROJECT_NAME).sty: $(PROJECT_NAME).dtx
+
+$(PROJECT_NAME).pdf: $(PROJECT_NAME).dtx $(PROJECT_NAME).gls
+
+%.glo: %.dtx
+ $(PDFLATEX) $(LATEXFLAGS) $< $(DEBUG)
+
+%.gls: %.glo
+ $(MAKEINDEX) -s gglo.ist -o $@ $< $(DEBUG)
+
+%.pdf: %.tex
+ $(PDFLATEX) $(LATEXFLAGS) $< $(DEBUG)
+
+%.pdf: %.dtx
+ $(PDFLATEX) $(LATEXFLAGS) $< $(DEBUG)
+ @if egrep -q $(RERUNLATEX) $(basename $@).log ; then \
+ echo "\trequires a new $(PDFLATEX) pass..."; \
+ $(PDFLATEX) $(LATEXFLAGS) $< $(DEBUG); \
+ fi
+
+%.sty: %.ins
+ rm -rf $@
+ $(LATEX) $(LATEXFLAGS) $< $(DEBUG)
+
+$(RECURSIVE_TARGETS:%=$(TESTDIR)/%) :
+ @$(MAKE) $(notdir $@) -C $(dir $@)
diff --git a/Master/texmf-dist/source/latex/moodle/moodle.dtx b/Master/texmf-dist/source/latex/moodle/moodle.dtx
index 02b43f79238..9e932fb5760 100644
--- a/Master/texmf-dist/source/latex/moodle/moodle.dtx
+++ b/Master/texmf-dist/source/latex/moodle/moodle.dtx
@@ -1,7 +1,8 @@
% \iffalse meta-comment
%
% moodle.dtx
-% Copyright 2016 by Anders O.F. Hendrickson (anders.hendrickson@snc.edu)
+% Copyright 2016 by Anders O.F. Hendrickson (anders.o.f.hendrickson AT gmail.com)
+% and 2019-2021 by Matthieu Guerquin-Kern (guerquin-kern AT crans.org).
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -13,10 +14,10 @@
%
% This work has the LPPL maintenance status `maintained'.
%
-% The Current Maintainer of this work is Anders O.F. Hendrickson.
+% The Current Maintainer of this work is Matthieu Guerquin-Kern.
%
% This work consists of the files moodle.dtx and moodle.ins
-% and the derived files moodle.sty and getitems.sty.
+% and the derived file moodle.sty.
%
% \fi
%
@@ -27,27 +28,38 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{moodle}
%<*package>
- [2016/01/11 v0.5 Moodle quiz XML generation]
+ [2021/02/07 v0.9 Moodle quiz XML generation]
%</package>
%
%<*driver>
-\documentclass{ltxdoc}
-\usepackage{moodle}
-\usepackage{amssymb}
-\usepackage{fancyvrb}
+\documentclass[a4paper]{ltxdoc}
+\usepackage{iftex}
+\ifPDFTeX
+ \usepackage[utf8]{inputenc} % necessary
+ \usepackage[T1]{fontenc} % necessary
+ \usepackage[protrusion=true,expansion]{microtype}
+ \usepackage[ttscale=.875]{libertine}
+\else % assuming LuaLaTeX or XeLaTeX
+ \usepackage{fontspec}
+ \setmainfont[Mapping=tex-text]{Linux Libertine O}
+\fi
+%\usepackage{moodle}[2020/07/09]
+\usepackage{amssymb,metalogo,multirow,threeparttable,booktabs}
+\usepackage{hyperref,tikz,minted,changelog}
+\usetikzlibrary{arrows,positioning,decorations.text}
+%\usemintedstyle{Wombat}
\EnableCrossrefs
\CodelineIndex
\OnlyDescription
\RecordChanges
\begin{document}
\DocInput{moodle.dtx}
- \PrintChanges
- %\PrintIndex
+ %\PrintChanges
\end{document}
%</driver>
% \fi
%
-% \CheckSum{3827}
+% \CheckSum{7729} ^^A Comment \OnlyDescription above to adjust
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -66,9 +78,7 @@
% Right brace \} Tilde \~}
%
%
-% \changes{v0.5}{2016/01/05}{Initial version}
-%
-% \GetFileInfo{moodle.sty}
+% \GetFileInfo{\jobname.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment,\def}
%
@@ -77,8 +87,12 @@
% generating Moodle quizzes via \LaTeX%
% \thanks{This document
% corresponds to \textsf{moodle.sty}~\fileversion, dated \filedate.}}
-% \author{Anders Hendrickson\\ St.~Norbert College, De~Pere, WI, USA \\ \url{anders.hendrickson@snc.edu}}
-% \date{January 11, 2016}
+% \author{Anders Hendrickson\footnote{original author of the package (\texttt{v0.5}), inactive.}\\
+% \texttt{anders.o.f.hendrickson AT gmail.com} \and
+% Matthieu Guerquin-Kern\footnote{current maintainer, author of the updates (\texttt{v0.6}
+% to \texttt{v0.9}), partially funded in 2019 by \href{https://www.ensea.fr/en/}{ENSEA Graduate School}, France.}\\
+% \href{mailto:guerquin-kern AT crans.org}{guerquin-kern AT crans.org}}
+% \date{February 7, 2021}
%
% \maketitle
%
@@ -87,8 +101,8 @@
% \section{Motivation}
%
% The acronym Moodle stands for ``Modular Object-Oriented Dynamic Learning Environment.''
-% It is an open source learning management system employed by many universities, colleges,
-% and high schools to provide digital access to course materials, such as
+% It is an open source learning management system (LMS) employed by many universities,
+% colleges, and high schools to provide digital access to course materials, such as
% notes, video lectures, forums, and the like; see
% \url{https://moodle.com/moodle-lms/} for more information.
% One of the many useful
@@ -148,64 +162,121 @@
% and the PDF may be previewed onscreen or printed out for ease of proofreading.
% Mathematical graphics can be integrated within the main file through \TikZ,
% and of course \LaTeX\ macros can be customized.
-% Using the present \textsf{moodle.sty} package,
+% Using the present \textsf{moodle} package,
% a quiz author can type a quiz using familiar \LaTeX\ syntax and document
% structure. Upon compilation, \LaTeX\ will generate both a well-organized
% PDF that is easy to proofread and an XML file that can be uploaded directly
% to Moodle. The entire process is far faster than using Moodle's own
% web-based editor, makes it easier to catch one's mistakes,
% and the ultimate source code of one's work is a human-readable |.tex| file
-% that can be archived, browsed, and edited offline.
+% that can be archived, versioned, browsed, and edited offline.
+%
+% Strictly speaking, the \textsf{moodle} package does not generate quizzes:
+% it generates question banks that can be imported in the LMS. The teacher
+% still needs to compose manually a quiz from the question banks. Hopefully,
+% two Moodle features supported by the package make this task easier:
+% categories and tags.
+%
+% In this documentation the LMS is referred to as Moodle (uppercase M and
+% roman font) while the \LaTeX\ package that is documented here is referred
+% to as \textsf{moodle} (all lower case and sans serif font).
%
% \section{Workflow}
-% The process of creating a quiz in Moodle using this package is as follows:
+% The process of creating a quiz in Moodle using this package is depicted in
+% Figure~\ref{fig:workflow}. It follows a few steps:
% \begin{enumerate}
-% \item Write a \LaTeX\ document using |\usepackage{moodle}| as described below.
-% \item Compile the document to PDF using pdf\LaTeX. This will also produce the file
-% \meta{jobname}|-moodle.xml|.
+% \item Write a \LaTeX\ document using |\usepackage{moodle}| as described
+% below.
+% \item Compile the document to PDF using pdf\LaTeX\, \XeLaTeX\ or \LuaLaTeX.
+% This will also produce the file \meta{jobname}|-moodle.xml|.
% \item Open Moodle, navigate to the desired course,
% and under ``Question bank'' select ``Import.''
% \item Select ``Moodle XML format,'' choose the XML file to upload, and press ``Import.''
% \item After Moodle verifies that the questions have been imported correctly,
% you may add them to your quizzes.
% \end{enumerate}
-%
-% \section{Usage}\label{sect:usage}
-% \subsection{Example Document}
+% \begin{figure}[tbp]
+% \centering
+% \begin{tikzpicture}[node distance=1,auto,bend
+% angle=45,box/.style={rectangle,draw=blue!50,rounded corners=3,top
+% color=white,bottom color=black!20,thick,align=center,text
+% width=2.5cm},elmt/.style={font=\itshape,align=left},
+% cmnt/.style={font=\footnotesize,align=center},
+% bigcmnt/.style={font=\normalsize,align=center},pre/.style={<-,>=stealth',thick},
+% post/.style={->,>=stealth',thick}, prepost/.style={<->,>=stealth',thick}]
+% \draw[white,fill=orange!20,rounded corners=10]
+% (-1.5,-.7)--++(0,1.4)--++(10.3,0)--++(0,-3.3)--++(-6.7,0)--++(-.25,1.725)--cycle;
+% \node[orange!80!black,above] (dev) at (7.5,-2.6) {\textit{Developpement}};
+% \fill[green,fill opacity=.2,rounded corners=10]
+% (-1.5,.7)--++(3,0)--++(0.5,-3.4)--++(6.8,0)--++(0,-2)--++(-10.3,0)--cycle;
+% \node[green!80!black,below] (dev) at (7.5,-2.7) {\textit{Publishing}};
+% \node[box,text width=2cm] (tex) {\texttt{.tex} source file};
+% \node[rectangle,fill=white,draw,align=center,text
+% width=1.5cm,below=of tex] (compfinal) {\LaTeX{}\\ engine};
+% \node[rectangle,fill=white,draw,align=center,text width=1.5cm,right=of tex,xshift=4.5cm]
+% (compdraft) {\LaTeX{}\\ engine};
+% \node[box,right=of compfinal,xshift=.5cm] (pdf) {\texttt{.pdf} file for proofreading};
+% \node[rectangle,fill=white,draw,align=center,text width=2cm,below=of compfinal] (extern)
+% {Picture\\processing};
+% \draw (pdf|-extern) node[box,anchor=center] (xml) {\texttt{.xml} file\\\footnotesize(pictures embedded)};
+% \draw (compdraft|-xml)
+% node[rectangle,fill=white,draw,align=center,text width=1.5cm,anchor=center] (moodle)
+% {Moodle\\Server};
+% \draw (tex) edge [post,bend right=10] node[cmnt,pos=.5,left] {\texttt{final}} (compfinal);
+% \draw (tex) edge [post,bend left=10] node[cmnt,pos=.5,below] {\texttt{draft}} (compdraft);
+% \draw (compdraft) edge [post,bend left=10] (pdf);
+% \draw (compfinal) edge [post] (pdf);
+% \draw (compfinal) edge [post,bend left=10] (xml);
+% \draw (compfinal) edge [post,bend right=30] node[cmnt,black!40,pos=.5,text width=1cm,left]
+% {\texttt{tikz}, \texttt{.png}, \texttt{.jpg}} (extern);
+% \draw (extern) edge [post,green,bend right=30] node[cmnt,black!40,pos=.5,below,right]
+% {\texttt{base64}} (compfinal);
+% \draw (pdf) edge [post,red,bend right=15] node[sloped,cmnt,pos=.5,above] {improve} (tex);
+% \draw (xml) edge [post,red] node[cmnt,pos=.5,below] {import} (moodle);
+% \end{tikzpicture}
+% \caption{Block diagram describing a typical workflow using the \textsf{moodle} package.}
+% \label{fig:workflow}
+% \end{figure}
%
+% \section{Usage}\label{sect:usage}
% The following pages presume the reader already has some familiarity with creating
% and editing Moodle quizzes through the web interface.
+% Users that are not familiar with Moodle quizzes can learn more in the Moodle
+% documentation. For instance, \url{https://docs.moodle.org/310/en/Question_types}.
+%
% The |xkeyval| package is used to provide a key-value interface.
+%
+% \subsection{Example Document}
+%
% Here is a simple example document:
-% \begin{verbatim}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
% \documentclass[12pt]{article}
-% \usepackage{moodle}
-%
+% \usepackage[section]{moodle}
+% \moodleregisternewcommands
+% \newcommand\monomial[1]{x^{#1}}
+% \newcommand\sillyanswer{What!?}
% \begin{document}
-%
% \begin{quiz}{My first quiz}
% \begin{numerical}[points=2]{Basic addition}
% What is $8+3$?
% \item 11
% \end{numerical}
-%
-% \begin{shortanswer}[case sensitive=true]{Newton's name}
+% \begin{shortanswer}[usecase]{Newton's name}
% What was Newton's first name?
% \item Isaac
-% \item[fraction=0, feedback={No, silly!}] Fig
-% \item{fraction=0} Sir
+% \item[fraction=0, feedback={\sillyanswer}] Fig
+% \item[fraction=0] Sir
% \end{shortanswer}
-%
% \begin{multi}[points=3]{A first derivative}
-% What is the first derivative of $x^3$?
-% \item $\frac{1}{4} x^4+C$
-% \item* $3x^2$
-% \item $51$
+% What is the first derivative of $\monomial{3}$?
+% \item $\frac{1}{4}\monomial{4}+C$
+% \item[feedback={yes!}]* $3\monomial{2}$
+% \item[feedback={\sillyanswer}] $51$
% \end{multi}
% \end{quiz}
-%
% \end{document}
-% \end{verbatim}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=lines]{latex}{minted.doc.out}
% Key features to note in this first example are that a |quiz| environment
% contains several question environments.
% Each question takes a name as a mandatory argument,
@@ -214,39 +285,102 @@
% such as |itemize| or |enumerate|, in that answers are set off by
% |\item|'s, but the question itself is the text that occurs before
% the first |\item|.
+%
+%^^A \DescribeMacro{\moodleregisternewcommands}\DescribeMacro{\htmlregister}
+%^^A Calling |\moodleregisternewcommands| tells the package to treat
+%^^A specifically the macros defined subsequently.
+%^^A This way, the macros that Moodle's \LaTeX\ renderer does not know
+%^^A about can be properly expanded in the XML file.
+%^^A This mechanism applies only to the macros defined using |\newcommand|
+%^^A and \emph{without} optional argument.
+%^^A Using |\htmlregister|\marg{macroname}, lets you declare a specific
+%^^A macro for expansion. This mechanism, instead, also applies to the
+%^^A macros defined using \TeX's primitive |\def|.
%
+% \subsection{Package Options}
% \DescribeMacro{draft}
-% If the package option |draft| is invoked, by calling |\usepackage[draft]{moodle}|,
-% then no XML file will be generated. This is especially useful while editing a quiz
-% containing graphics, so as to avoid the time spent converting image files.
+% \DescribeMacro{final}
+% If the package option |draft| is invoked, by calling
+% |\usepackage[draft]{moodle}| or |\documentclass[draft]{...}|, then no
+% XML file will be generated. This is especially useful while editing a
+% quiz containing graphics, so as to avoid the time spent converting
+% image files. The package option |final| might be useful if one wants
+% to avoid the option |draft| to be inherited from the |documentclass|.
+%
+% \DescribeMacro{handout}
+% If the package option |handout| is invoked (|\usepackage[handout]{moodle}|),
+% the PDF file is generated clean from teacher-only information (answers,
+% points, penalty, feedback, tags) and, hence, can be given to students for
+% classroom work. In particular, as would Moodle do, answers in
+% \texttt{matching} questions are shuffled and the option \texttt{shuffle}
+% triggers the shuffling of choices offered (\texttt{multi} and
+% \texttt{matching}). This is achieved thanks to the package
+% \texttt{randomlist}, loaded if the option is invoked.
+% The XML file is generated as usual.
+%
+% \DescribeMacro{nostamp}
+% By default, the package will output a stamp as a comment in the XML
+% file. This stamp contains information gathered about the TeX engine,
+% the operating system used and the package version. For instance:
+% \begin{quote}\small
+% |<!-- This file was generated on 2021-01-07 by LuaLaTeX -->|\\
+% |<!-- running on Linux with the package moodle |\texttt{\fileversion}| -->|
+% \end{quote}
+% The package option
+% |nostamp| prevents this stamp to be written in the XML file.
+%
+% \DescribeMacro{section}
+% \DescribeMacro{section*}
+% \DescribeMacro{subsection}
+% \DescribeMacro{subsection*}
+% If the package option |section| is invoked (|\usepackage[section]{moodle}|),
+% then each quiz is represented by a different \LaTeX\ section. Starred
+% variants correspond to unnumbered sections or subsections. To preserve
+% compatibility with Version 0.5 of this package, the default is |subsection*|.
+% Consequently, |\usepackage{moodle}| is equivalent to
+% |\usepackage[subsection*]{moodle}|.
+%
+% \DescribeMacro{tikz} The package option \texttt{tikz} is described in section
+% \ref{subsec:tikz}.
+%
+% \DescribeMacro{svg} The package option \texttt{svg} is described in section
+% \ref{subsec:svg}.
%
-% \newpage
% \subsection{Quiz and Question Environments}
%
% \DescribeMacro{quiz}
% A |.tex| document to generate Moodle quizzes contains one or more
% |quiz| environments, within which various question environments are nested.
-% The required argument to the |quiz| environment names the ``question bank''
-% to which the questions inside will belong after being uploaded to moodle.
+% The required argument to the |quiz| environment names a category for Moodles
+% ``question bank'': after import, the questions defined in this environment
+% will be gathered in this category.
% \begin{center}
-% |\begin{quiz}|\oarg{options}\marg{question bank name}%
+% |\begin{quiz}|\oarg{options}\marg{category name}%
% \end{center}
% There are no |quiz|-specific options,
% but any \meta{options} set with |\begin{quiz}|
% will be inherited by all questions contained within that |quiz| environment.
%
% \DescribeMacro{\moodleset}
-% Options may also be set at any time with |\moodleset|\marg{options};
-% these changes are local to \TeX-groups.
-% \bigskip
+% Options may also be set outside question environments with
+% |\moodleset|\marg{options}; these changes are local to \TeX-groups.
+%
+% \DescribeMacro{\setcategory}\DescribeMacro{\setsubcategory}
+% Although the |quiz| environment defines a category by its own, one can change
+% the current category inside the quiz environment and in between questions,
+% using the macro |\setcategory|\marg{category name}. A subcategory can also be
+% defined with |\setsubcategory|\marg{subcategory name}. The categories and
+% subcategories are reflected in the PDF file as sections, subsections, or
+% subsubsections, in accordance to the package setting |section|, |section*|,
+% |subsection|, or |subsection*|.
%
% The syntax for each question environment is
% \begin{quote}
% |\begin|\marg{question type}\oarg{question options}\marg{question name} \\
% \rule{2em}{0pt}\meta{question text} \\
-% \rule{2em}{0pt}|\item| \meta{item} \\
+% \rule{2em}{0pt}|\item|\oarg{item options} \meta{item} \\
% \rule{2em}{0pt}\quad$\vdots$ \\
-% \rule{2em}{0pt}|\item| \meta{item} \\
+% \rule{2em}{0pt}|\item|\oarg{item options} \meta{item} \\
% |\end|\marg{question type}
% \end{quote}
% The meaning of the \meta{item}s varies depending on the question type,
@@ -268,13 +402,54 @@
% \DescribeMacro{fraction}
% In most question types, it is possible to designate some answers as being
% worth partial credit---that is, some fraction of a completely correct answer.
-% The |fraction| key may be set to any integer from |0| (entirely wrong) to |100| (entirely correct).
+% The |fraction| key may be set to any of the values given in Table~\ref{tab:fraction},
+% from |0| (entirely wrong) to |100| (entirely correct).
+%
+% \begin{table}[tbp]
+% \centering
+% \caption{\href{https://github.com/moodle/moodle/blob/MOODLE\_310\_STABLE/question/engine/bank.php\#L339}{Valid positive options} for the \texttt{fraction} key: $100\cdot(p/q)$.}
+% \label{tab:fraction}
+% \footnotesize
+% \begin{tabular}{l*{10}{l}}
+% \toprule
+% Denominator $q$ & \multicolumn{10}{c}{Numerator $p$}\\
+% \cmidrule{2-11}
+% & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9\\
+% \cmidrule(lr){1-1}\cmidrule(lr){2-2}\cmidrule(lr){3-3}\cmidrule(lr){4-4}
+% \cmidrule(lr){5-5}\cmidrule(lr){6-6}\cmidrule(lr){7-7}\cmidrule(lr){8-8}
+% \cmidrule(lr){9-9}\cmidrule(lr){10-10}\cmidrule(lr){11-11}
+% 20 & 0&5&&&&&&&&\\\cmidrule(lr){1-1}
+% 10 & &10&20&30&40&50&60&70&80&90\\\cmidrule(lr){1-1}
+% 9 & &11.11111&&&&&&&&100\\\cmidrule(lr){1-1}
+% 8 & &12.5&&&&&&&100&\\\cmidrule(lr){1-1}
+% 7 & &14.28571&&&&&&100&&\\\cmidrule(lr){1-1}
+% 6 & &16.66667&&&&83.33333&100&&&\\\cmidrule(lr){1-1}
+% 5 & &20&&&80&100&&&&\\\cmidrule(lr){1-1}
+% 4 & &25&&75&100&&&&&\\\cmidrule(lr){1-1}
+% 3 & &33.33333&66.66667&100&&&&&&\\\cmidrule(lr){1-1}
+% 2 & &50&100&&&&&&&\\\cmidrule(lr){1-1}
+% 1 & 0&100&&&&&&&&\\\cmidrule(lr){1-1}
+% \bottomrule
+% \end{tabular}
+% \end{table}
+% In questions where several choices can be selected (see |multi| with the option
+% |multiple|), positive fractions must sum up to exactly 100. It is also possible to set
+% negative fractions (from -100 to 0) for wrong choices, in order to prevent the
+% selection of all choices from leading to a good grade.
+% In this case, the value ranging from -100 to 0 must be the opposite of one of the
+% values listed in Table~\ref{tab:fraction}.
%
+% \DescribeMacro{fractiontol}
+% The package tries to match the |fraction| key to one of the admissible values.
+% To this end, the tolerance is controlled by the |fractiontol| key. It defaults
+% to |0.01| but may be changed. When no admissible fraction value is matched, the
+% package throws an error.
+%
% \DescribeMacro{feedback}
% The |feedback| key sets text that will appear to the student after completing the quiz.
% For example, one might set
% \begin{center}
-% |feedback={A question like this will appear on the exam.}|
+% |feedback={This question might show up in the final exam.}|
% \end{center}
% The desired feedback should be included in braces.
%
@@ -282,14 +457,63 @@
% question, then that feedback will appear to each student regardless of the student's answer.
% Answer-specific feedback (perhaps explaining a common mistake)
% may also be given by setting the |feedback| key \emph{at the individual answer}.
+%
+% \DescribeMacro{tags}
+% The |tags| key sets a list of keywords for the question that will be taken into account
+% by Moodle for filtering purposes or classification of questions inside the question bank.
+% It is possible for instance to build a quiz with questions cherry-picked among the set of
+% questions holding a particular tag.
+% For example, one might set
+% \begin{center}
+% |tags={easy}|
+% \end{center}
+% The desired tag should be specified in between braces. Multiple tags can be set as a
+% comma-separated list:
+% \begin{center}
+% |tags={tag1,tag2,{ leading whitespace},{including, comma}}|
+% \end{center}
+%
+% Tags can be assigned at two levels. If the |tags| key is set at the quiz level,
+% then that tag list will serve as a default for each question of the quiz.
+% Question-specific tags can be assigned by setting the |tags| key \emph{at the question level}.
+% The question-level |tags| key overrides eventual quiz-level tags.
+%
+% Users willing to specify a same tag for all questions of the quiz could
+% also rely on Moodle's category mechanism.
%
-% \newpage
-% \subsection{Question Types}
+% \subsection{\href{https://docs.moodle.org/en/Question_types}{Question Types}}
%
-% We next discuss the various question types supported by \textsf{moodle.sty}
+% We next discuss the various question types supported by \textsf{moodle}
% and the options that may be set.
+%
+%\subsubsection{\href{https://docs.moodle.org/en/True/False_question_type}{True/False}}
+%
+% \DescribeMacro{truefalse}
+% The syntax for a True/False question is as follows:
+% \begin{quote}
+% |\begin{truefalse}|\oarg{question options}\marg{question name} \\
+% \rule{2em}{0pt}\meta{question text} \\
+% \rule{2em}{0pt}|\item*| \meta{feedback when ``true" is chosen} \\
+% \rule{2em}{0pt}|\item| \meta{feedback when ``false" is chosen} \\
+% |\end{truefalse}|
+% \end{quote}
+% The correct answer is designated by the asterisk |*| after the |\item|;
+% it need not appear first in the list.
+%
+% Answer-specific feedback can also be defined as an item option, similarly to
+% other types.
+% \begin{quote}
+% |\begin{truefalse}|\oarg{question options}\marg{question name} \\
+% \rule{2em}{0pt}\meta{question text} \\
+% \rule{2em}{0pt}|\item[feedback={|\meta{When ``true" is chosen}|}]*| \\
+% |\end{truefalse}|
+% \end{quote}
+% Note that, in this example, no feedback is defined for the incorrect answer
+% ``False": the corresponding item can be omitted.
%
-% \subsubsection{Multiple Choice}
+% With the True/False question type, the |penalty| key has no effect.
+%
+% \subsubsection{\href{https://docs.moodle.org/310/Multiple_Choice_question_type}{Multiple Choice}}
%
% \DescribeMacro{multi}
% The syntax for a classic multiple choice question,
@@ -319,56 +543,83 @@
% which mirror the usual \LaTeX\ syntax:
% |alph|, |Alph|, |arabic|, |roman|, |Roman|, and |none|.
% Calling |numbering=none| produces an unnumbered list of answers.
-% The Moodle syntax of |abc|, |ABC|, |123|, |iii|, and |IIII| is also acceptable,
-% but note that it requires \emph{four} |I|'s to obtain upper-case Roman numerals this way.
+% The Moodle syntax of |abc|, |ABCD|, |123|, |iii|, and |IIII| is also
+% acceptable,
+% but note that it requires \emph{four} capital letters to obtain
+% upper-case Roman or alphabetic numerals this way.
%
% \DescribeMacro{fraction}
% The |fraction| key can be used to designate some wrong answers
% as being worth partial credit. For example, a question might read thus:
-% \begin{verbatim}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
% \begin{multi}{my question}
% Compute $\int 4x^3\,dx$.
% \item* $x^4+C$
% \item[fraction=50] $x^4$
% \item $12x^2$
% \end{multi}
-% \end{verbatim}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=lines]{latex}{minted.doc.out}
% Thus the asterisk |*| is shorthand for |fraction=100|,
% whereas a bare |\item| sets |fraction=0|.
%
-% \DescribeMacro{single}\DescribeMacro{multiple}
+% \DescribeMacro{single}
% By default, the |multi| environment produces
-% a multiple choice question operates with only one correct answer;
+% a multiple choice question with only one correct answer;
% this is called |single| mode, and on Moodle it appears with radio buttons.
-% It is also possible to write questions with more than one correct answer,
-% asking the user to check all correct answers.
-% To do this, use the key |multiple| or |single=false|.
-%
+%
+% \DescribeMacro{multiple}
+% It is also possible to write questions with possibly more than one correct answer,
+% asking the user to check all correct answers. To do this, use the key |multiple|
+% or |single=false|.
% The worth of each correct answers in |multiple| mode may be set by |fraction|,
-% but Moodle will require that all the fractions add up to at least 100.
-% If you simply designate each correct answer with |\item*|, then \textsf{moodle.sty}
-% will divide the 100\% equally among those answers.
-% For example, the following two examples produce equivalent results:
-% \begin{verbatim}
+% but Moodle asks that all the fractions add up to \emph{exactly} 100.
+% If you simply designate each correct answer with |\item*|, then \textsf{moodle}
+% will divide equally among those answers the points lefts for a sum of 100\%.
+% Items that are not given a |fraction| are considered incorrect and selecting them
+% results in negative points such that the sum of all incorrect answers is -100\%.
+% For example, the following two examples are equivalent:
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
% \begin{multi}[multiple]{my question}
% Which numbers are prime?
+% \item[fraction=20] 2
% \item* 5
-% \item 6
% \item* 7
+% \item[fraction=-10] 1
+% \item 6
% \item 8
% \end{multi}
-% \end{verbatim}
-% \begin{verbatim}
+%
% \begin{multi}[multiple]{my question}
% Which numbers are prime?
-% \item[fraction=50] 5
-% \item 6
-% \item[fraction=50] 7
-% \item 8
+% \item[fraction=20] 2
+% \item[fraction=40] 5
+% \item[fraction=40] 7
+% \item[fraction=-10] 1
+% \item[fraction=-45] 6
+% \item[fraction=-45] 8
% \end{multi}
-% \end{verbatim}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=lines]{latex}{minted.doc.out}
+% Note that, in this example, negative fractions are set for wrong choices. This
+% prevents students selecting all options to obtain a good grade with no merit.
%
-% \subsubsection{Numerical}
+% \DescribeMacro{allornothing}
+% There also exists a \href{https://moodle.org/plugins/qtype_multichoiceset}
+% {``All-or-Nothing Multiple Choice''} plugin for Moodle that introduces a
+% question type similar to a multiple choice with multiple correct answers,
+% with the specificity that the points are given if and only if the student
+% selects all correct answers. This kind of question is set up using the
+% |allornothing| key.
+% The recommended way for designating correct answers is with |\item*|. If instead
+% the |fraction| is used, \textsf{moodle} moodle will consider that non-negative
+% fractions ($>0$) designate correct answers and negative fractions ($\leq 0$)
+% designate incorrect choices.
+% The option |allornothing| supersedes the options |multiple| and |single|.
+% To the best of our knowledge, Moodle does not offer the all-or-nothing behavior
+% for multiple choice questions embedded inside a cloze question.
+%
+% \subsubsection{\href{https://docs.moodle.org/en/Numerical_question_type}{Numerical}}
%
% A numerical question in Moodle requires the student
% to input a real number in decimal form.
@@ -387,9 +638,42 @@
% \begin{quote}\footnotesize
% |\item[fraction=0,feedback={You forgot to antidifferentiate!}]| \meta{incorrect answer}
% \end{quote}
+%
+% \DescribeMacro{tolerance}
+% The |tolerance| key can be used to specify the validity of answers within some margin.
+% This key can be set at different levels: quiz, question, item.
+% For example, with the question
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% \begin{numerical}[tolerance=0.01]{my question}
+% Approximate value of $\sqrt{2}$?
+% \item[tolerance={1e-1}] 1.4142
+% \item[fraction=20,feedback={twice this!}] 7.0711e-1
+% \item[fraction=0,feedback={Wrong!}] *
+% \end{numerical}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=lines]{latex}{minted.doc.out}
+% In this example,
+% \begin{itemize}
+% \item any answer in the range $[1.4042,1.4242]$ will be validated,
+% \item any answer in the range $[0.69711,0.71711]$ will get the specific feedback
+% \emph{twice this!} and 20\% of points,
+% \item any other answer is incorrect and will get the specific feedback
+% \emph{Wrong!}.
+% \end{itemize}
+%
+% When feedback is to be given for any non-specified answer, one can add a \emph{last} answer
+% item containing the wilcard character |*| only. In this case, the |tolerance| key is irrelevant.
+%
+% Both answers and tolerance can be specified with the comma (|,|) as a decimal separator.
+% Exponent notation is accepted. After import, Moodle will recognize indifferently |0.000165|,
+% |0,000165|, |1.65E-4|, |1.65e-4|, |1,65E-4|, and |1,65e-4|.
+%
+% If the \textsf{siunitx} package is loaded, \textsf{moodle} will detect it and
+% numbers will be rendered nicely in the PDF output.
%
-% \newpage
-% \subsubsection{Short Answer}
+% Units, unit-handling and multipliers are currently unsupported.
+%
+% \subsubsection{\href{https://docs.moodle.org/en/Short-Answer_question_type}{Short Answer}}
% A short answer question resembles a numerical question: the student is to fill
% in a text box with a missing word or phrase.
% \begin{quote}
@@ -403,25 +687,40 @@
% You can make the text box appear as part of the question with the
% control sequence |\blank|. For example,
% your question might read
-% \begin{verbatim}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
% \begin{shortanswer}{Leibniz}
% Newton's rival was Gottfried Wilhelm \blank.
% \item Leibniz
% \item Leibniz.
% \end{shortanswer}
-% \end{verbatim}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=lines]{latex}{minted.doc.out}
% Note that as the blank occurred at the end of a sentence,
% we included two answers,
% lest students get the question wrong merely by
% including or omitting a period.
%
% \DescribeMacro{case sensitive}\DescribeMacro{usecase}
-% By default, Moodle ignores the distinction between upper- and lower-case letters
-% when grading a short answer question.
+% The default setting when creating a Short Answer question in Moodle
+% is to ignore the distinction between upper- and lower-case letters
+% when grading a short answer question. This default is preserved by
+% \textsf{moodle}.
% You can make a question case-sensitive with the key |case sensitive|
% or its shorter synonym |usecase|.
+%
+% The wildcard character |*| can used to grab answers that match
+% a specific pattern. For instance:
+% \begin{itemize}
+% \item ``\emph{Sir Isaac Newton}'', ``\emph{Isaac Newton}'' and
+% ``\emph{Newton}'' will match the pattern |*Newton|,
+% \item ``\emph{Gaston}'' and ``\emph{Wellington}'' will match the
+% pattern |*ton|,
+% \item ``\emph{Isaac}'' and ``\emph{Isaac Newton}'' will match the
+% pattern |Isaac*|,
+% \item any non empty answer will match the pattern |*| (wildcard alone).
+% \end{itemize}
%
-% \subsubsection{Essay Questions}
+% \subsubsection{\href{https://docs.moodle.org/en/Essay_question_type}{Essay}}\label{subsubsect:essay}
% Instructors may ask essay questions on a Moodle quiz,
% although Moodle's software is not up to the task of grading them!
% Instead each essay question answer must be graded manually by the
@@ -443,26 +742,33 @@
% If the |response required| key is set, Moodle will insist that the student
% enter something in the blank before accepting the quiz as completed.
%
-% \newpage
% \DescribeMacro{response format}
% Moodle offers five different ways for students to enter and/or upload their
% answers to an essay question. You may choose one of these five options:
% \begin{description}
-% \item[{\tt html}] An editor with the ability to format HTML responses
+% \item[{\ttfamily html}] An editor with the ability to format HTML responses
% including markup for italics, boldface, etc. This is the default.
-% \item[{\tt file}] A file picker allowing the student to upload a file, such as
-% a PDF or DOC file, containing the essay.
-% \item[{\tt html+file}] The same HTML editor as above, but with the ability
-% to upload files as well. This permits some students to type answers
-% directly into the web form, and others to compose their essays in
-% another program first.
-% \item[{\tt text}] This editor allows only for entering plain text without any markup.
-% \item[{\tt monospaced}] This yields a plain text editor, without any markup,
-% and with a fixed-width font. This could be useful for entering code snippets, for example.
+% \item[{\ttfamily file}] A file picker allowing the student to upload a
+% file, such as a PDF or DOC file, containing the essay.
+% \item[{\ttfamily html+file}] The same HTML editor as above, but with the
+% ability to upload files as well. This permits some students to type
+% answers directly into the web form, and others to compose their
+% essays in another program first.
+% \item[{\ttfamily text}] This editor allows only for entering plain text
+% without any markup.
+% \item[{\ttfamily monospaced}] This yields a plain text editor, without any
+% markup, and with a fixed-width font. This could be useful for
+% entering code snippets, for example.
% \end{description}
%
% \DescribeMacro{response field lines}
% The key |response field lines| controls the height of the input box.
+% For Moodle, the admissible values are: 5, 10, 15, 20, 25, 30, 35, and 40.
+% If the value set is not admissible, \textsf{moodle} will approximate the value:
+% \begin{itemize}
+% \item with either 5 or 40 if the value set was out of range, or
+% \item with the next multiple of 5 otherwise.
+% \end{itemize}
% The default is |response field lines=15|.
%
% \DescribeMacro{attachments allowed}
@@ -473,16 +779,16 @@
% You may also require the student to upload a certain number of attachments
% by setting |attachments required| to |0|, |1|, |2|, or |3|.
%
-% \DescribeMacro{response template}
+% \DescribeMacro{template}
% Finally, you may preload the essay question with a template that the student
-% will edit and/or type over, with the key |response template=|\marg{template}.
+% will edit and/or type over, with the key |template=|\marg{template}.
% The \meta{template} should be enclosed in braces.
%
-% \subsection{Matching Questions}
+% \subsubsection{\href{https://docs.moodle.org/en/Matching_question_type}{Matching}}
%
% A matching question offers a series of subquestions
% and a set of possible answers from which to choose.
-% If there are $m$ questions and $n$ possible answers,
+% If there are $m$ questions and $n\geq m$ possible answers,
% a matching question will look like this:
%
% \begin{quote}
@@ -508,19 +814,20 @@
% permute the questions and answers; by default |shuffle=true|.
%
% \DescribeMacro{drag and drop}\DescribeMacro{dd}
-% Moodle has two formats for matching questions.
-% The older matching question offered a dropdown box
-% for choosing the answer to each question;
-% the newer ``drag and drop matching'' format
+% The standard matching question offered by Moodle corresponds to
+% a dropdown box for choosing the answer to each question.
+% There also exists a \href{https://docs.moodle.org/310/en/Drag_and_drop_matching_question_type}
+% {``drag and drop matching''} plugin for Moodle that
% shows all questions in one column,
% all answers in a second column, and allows students to drag the correct
% answer to the question using a mouse.
-% To enable drag-and-drop matching, use the key `|drag and drop|' or `|dd|' for
-% short. The default is |dd=false|. If you choose the older format,
-% then due to the limitations of dropdown boxes, no \LaTeX\ or HTML code can be used
-% in the answers.
+% In this package, to enable drag-and-drop matching, use the key
+% `|drag and drop|' or `|dd|' for short. The default is |dd=false|.
+% If you choose the standard format, then due to the limitations of
+% dropdown boxes, no \LaTeX\ or HTML code can be used in the answers.
%
-% \subsection{Cloze Questions}
+% \subsubsection{\href{https://docs.moodle.org/en/Embedded_Answers_(Cloze)_question_type}
+% {Cloze Questions and Subquestions}}
%
% A ``cloze question'' has one or more subquestions embedded within a passage of text.
% For example, you might ask students to fill in several missing words within
@@ -528,10 +835,10 @@
% To encode cloze questions in \LaTeX\ using this package is easy:
% you simply nest one or more |multi|, |shortanswer|, or |numerical| environments
% within a |cloze| environment, as in the following example:
-% \begin{verbatim}
-% \begin{cloze}{my cloze question} \\
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% \begin{cloze}{my cloze question}
% Thanks to calculus, invented by Isaac
-% \begin{shortanswer}
+% \begin{shortanswer}[usecase]
% \item Newton
% \end{shortanswer},
% we know that the derivative of $x^2$ is
@@ -542,80 +849,224 @@
% \end{multi}
% and that $\int_0^2 x^2\,dx$ equals
% \begin{numerical}
-% \item[tolerance=0.0004] 2.667
+% \item[tolerance={4e-4}] 2.667
% \end{numerical}.
% Thanks, Isaac!
% \end{cloze}
-% \end{verbatim}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=lines]{latex}{minted.doc.out}
% Note that when used as a subquestion within a cloze question,
% |\begin{multi}| is \emph{not} followed by name in braces;
% the same is true for the |shortanswer| and |numerical|
% environments.
%
-% \DescribeMacro{vertical}\DescribeMacro{horizontal}
-% Within a cloze question, by default a multiple choice question is implemented
-% as an inline dropdown box. This is visually compact, but it also prevents the
-% use of mathematical or HTML formatting.
+% \DescribeMacro{single=true}\DescribeMacro{single=false}\DescribeMacro{multiple}
+% Before Moodle version 3.5, within a cloze question, a multiple choice question
+% was necessarily of type |single|, i.e. with a single good answer. If you intend
+% to export your quiz to Moodle 3.5+, the option |multiple| can be used, when
+% multiple good answers are to be found.
+%
+% \DescribeMacro{vertical}\DescribeMacro{horizontal}\DescribeMacro{inline}
+% Within a cloze question, by default, a multiple choice question is implemented
+% as an |inline| dropdown box. This is visually compact, but it also prevents
+% the use of mathematical or HTML formatting.
% Adding the option |vertical| displays the subquestion as a vertical column
% of radio buttons instead; likewise the option |horizontal| creates a horizontal
% row of radio buttons.
+% The option |inline| is incompatible with |multiple| or |single=false|
+% (dropdown boxes don't let you pick up several answers!).
+%
+% \DescribeMacro{shuffle}
+% Starting from Moodle version 3.0, within a cloze question, the items of a
+% multiple choice question can be shuffled. Setting |shuffle=false| will
+% guarantee that the answer appear in the order they were typed; the
+% default is |shuffle=true|.
+%
+% \DescribeMacro{case sensitive}\DescribeMacro{usecase}
+% Within a cloze question, the short answer question can be made case sensitive.
+% This option, disabled by default, is selected with |case sensitive| or |usecase|.
+%
+%\subsubsection{\href{https://docs.moodle.org/en/Description_question_type}{Description}}
+%
+% The Moodle description type is not really a question. It is more like a label.
+% One can set a |feedback| that the student gets when reviewing the submission.
+% Tags can be set as well.
+%
+% For descriptions, \textsf{moodle} redefines the existing |description| environment.
+%
+% The syntax for a Description question is as follows:
+% \begin{quote}
+% |\begin{description}|\oarg{question options}\marg{question name} \\
+% \rule{2em}{0pt}\meta{question text} \\
+% |\end{description}|
+% \end{quote}
+%
+% \subsection{Summary of the Key Options}
+%
+% Table~\ref{tab:key-options} summarizes the key options available at the question
+% and answer levels depending on the question type. For the essay questions,
+% please refer to section~\ref{subsubsect:essay}.
+%
+% \begin{table}[tbp]
+% \centering
+% \caption{Options offered at the question and answer levels for each question type.}
+% \label{tab:key-options}
+% \small
+% \begin{tabular}{*{15}{l}}
+% \toprule
+% & \multicolumn{11}{l}{Question} & \multicolumn{3}{l}{Answer}\\
+% \cmidrule(lr){2-12}\cmidrule(lr){13-15}
+% Question type & \rotatebox{90}{points} &
+% \rotatebox{90}{penalty} & \rotatebox{90}{feedback} & \rotatebox{90}{tags} &
+% \rotatebox{90}{shuffle} & \rotatebox{90}{numbering} & \rotatebox{90}{multiple} &
+% \rotatebox{90}{allornothing} &\rotatebox{90}{usecase} & \rotatebox{90}{tolerance} &
+% \rotatebox{90}{dd} & \rotatebox{90}{fraction} & \rotatebox{90}{feedback} &
+% \rotatebox{90}{tolerance}\\\cmidrule(lr){1-1}\cmidrule(lr){2-2}\cmidrule(lr){3-3}
+% \cmidrule(lr){4-4}\cmidrule(lr){5-5}\cmidrule(lr){6-6}\cmidrule(lr){7-7}
+% \cmidrule(lr){8-8}\cmidrule(lr){9-9}\cmidrule(lr){10-10}\cmidrule(lr){11-11}
+% \cmidrule(lr){12-12}\cmidrule(lr){13-13}\cmidrule(lr){14-14}\cmidrule(lr){15-15}
+% \href{https://docs.moodle.org/35/en/Multiple_Choice_question_type}
+% {Multichoice} & $\bullet$ & $\bullet$ & $\bullet$ & $\bullet$ &
+% $\bullet$ & $\bullet$ & $\bullet$ & $\bullet$ & & & & $\bullet$ & $\bullet$ \\
+% \href{https://docs.moodle.org/35/en/Numerical_question_type}{Numerical}
+% & $\bullet$ & $\bullet$ & $\bullet$ & $\bullet$ & & & &
+% & & $\bullet$ & & $\bullet$ & $\bullet$ & $\bullet$ \\
+% \href{https://docs.moodle.org/35/en/Short-Answer_question_type}{Short
+% Answer} & $\bullet$ & $\bullet$ & $\bullet$ & $\bullet$ & & & &
+% & $\bullet$ & & & $\bullet$ & $\bullet$ \\
+% \href{https://docs.moodle.org/35/en/Matching_question_type}{Matching}
+% & $\bullet$ & $\bullet$ & $\bullet$ & $\bullet$ & $\bullet$ & & &
+% & & & $\bullet$ & $\bullet$ & \\
+% \href{https://docs.moodle.org/35/en/True/False_question_type}
+% {True/False} & $\bullet$ & & $\bullet$ & $\bullet$ & & & &
+% & & & & & $\bullet$ \\
+% \href{https://docs.moodle.org/35/en/Description_question_type}
+% {Description} & & & $\bullet$ & $\bullet$ & & & &
+% & & & & & \\
+% ^^A\href{https://docs.moodle.org/35/en/Essay_question_type}{Essay} & \\\hline%
+% \href{https://docs.moodle.org/35/en/Embedded_Answers_(Cloze)_question_type}{Cloze}
+% & & $\bullet$ & $\bullet$ & $\bullet$ & & & &
+% & & & & & \\\cmidrule(lr){1-1}
+% \hspace{1em}Numerical & $\bullet$ & & & & & & &
+% & &$\bullet$ & & $\bullet$ & $\bullet$ & $\bullet$ \\
+% \hspace{1em}Short Answer & $\bullet$ & & & & & & &
+% & $\bullet$ & & & $\bullet$ & $\bullet$ \\
+% \hspace{1em}Multi (inline) & $\bullet$ & & & & $\bullet$ & & &
+% & & & & $\bullet$ & $\bullet$ \\
+% \hspace{1em}Multi (horizontal)& $\bullet$ & & & & $\bullet$ & & $\bullet$
+% & & & & & $\bullet$ & $\bullet$ \\
+% \hspace{1em}Multi (vertical)& $\bullet$ & & & & $\bullet$ & & $\bullet$
+% & & & & & $\bullet$ & $\bullet$ \\
+% \bottomrule
+% \end{tabular}
+% \end{table}
%
% \section{Conversion to HTML}
%
% Questions should be typed as usual for \LaTeX,
-% including |\$| to obtain dollar signs, |$|'s for math shifts,
-% |$$|'s for display math, et cetera.
+% including |\$| to obtain dollar signs, |$|'s or |\(|...|\)| for math shifts,
+% |$$|'s or |\[|...|\]| for display math, et cetera.
% The package \textsf{moodle.sty} automatically converts
% this \LaTeX\ code into HTML for web display.
%
-% The following table lists \LaTeX\ commands and environments that
-% will be converted to HTML:
-% \begin{center}
-% \begin{tabular}{lll}
-% |~| & |\#| & |\$| \\
-% |\&| & |\\| & |\S| \\
-% |\{| & |\}| & {\tt\catcode`\ =12\relax\catcode`\\=12\relax\ }\\
-% |\emph| & |\textbf| & |\par| \\
-% |\ldots| & |\dots| & |\relax| \\
-% |\euro| & |\texteuro| \\
-% |\begin{center}| \\
-% |\begin{enumerate}| \\
-% |\begin{itemize}| \\
-% |\begin{tikzpicture}| \\
-% \end{tabular}
-% \end{center}
-% Single and double quotation marks and the diacritical commands |\^|, |\'|, |\`|, |\"|, |\~|, and |\H| are also handled,
-% as are the characters |\aa|, |\ae|, |\o|, |\ss|, |\l|, and their capitalizations.
+% Table~\ref{tab:html} lists \LaTeX\ macros, commands, and environments that
+% are specifically converted to HTML.
+% \begin{table}[tbp]
+% \centering
+% \caption{Conversion of \LaTeX\ material to HTML.}
+% \label{tab:html}
+% \begin{tabular}{llll}
+% \toprule
+% \multicolumn{2}{l}{Macros} & Commands & Environnments \\
+% \cmidrule(lr){1-2}\cmidrule(lr){3-3}\cmidrule(lr){4-4}
+% |\%| & |\#| &|\emph{}| & |\begin{center}|\\
+% |\$| & |\&| &|\textbf{}| & |\begin{enumerate}|\\
+% |\\| & |\par| &|\textit{}| & |\begin{itemize}|\\
+% |\&| & |\S| & |\texttt{}| & |\begin{tikzpicture}|\\
+% |\{| & |\}| & |\textsc{}| & \\
+% |\|\textvisiblespace & |\relax| & |\underline{}| &\\
+% |\,| & |\thinspace| & |\textsuperscript{}| & \\
+% |\dots| & |\ldots| & |\up{}| & \\
+% |\euro| & |\texteuro| & |\fup{}| & \\
+% |\TeX| & |\LaTeX|& |\textsubscript{}| & \\
+% |\_| & |\textbackslash| & |\url{}| & \\
+% |~| & & |\href{}{}| & \\
+% & & |\tikz[]{}| & \\
+% & & |\includegraphics[]{}| & \\
+% & & |\verbatiminput{}| & \\
+% & & |\VerbatimInput[]{}| & \\
+% & & |\LVerbatimInput[]{}| & \\
+% & & |\BVerbatimInput[]{}| & \\
+% & & |\inputminted[]{}{}| & \\
+% \bottomrule
+% \end{tabular}
+% \end{table}
+% Single and double quotation marks (with german variants), french quotation marks,
+% inverted exclamation and question marks, and the diacritical
+% commands |\^|, |\'|, |\`|, |\"|, |\~|, |\c|, |\H|, |\k|, |\u| and |\v| are
+% also handled, as are the characters |\aa|, |\ae|, |\l|, |\oe|,
+% |\o|, |\ss|, and their capitalizations. See Tables~\ref{tab:diacritical},
+% \ref{tab:ligatures}, and \ref{tab:other} for more details.
%
% In addition, |<| and |>| will be converted to |&lt;| and |&gt;| \emph{within math mode only}.
% If they should be typed outside of math mode, they will be passed as typed to
% the HTML, and probably interpreted by students' browsers as HTML tags
% or other unpredicated results.
+% A doubled dash will be converted to en-dash |&ndash;| \emph{outside math mode}.
%
-% Be aware that \emph{\textsf{moodle.sty} does not know how to convert any
+% Be aware that \emph{\textsf{moodle} does not know how to convert any
% other \TeX\ or \LaTeX\ commands to HTML.}
% If other sequences are used, they may be passed verbatim to the XML file
% or may cause unpredicted results.
%
-% If you think of another \LaTeX\ command that should be changed to an HTML equivalent,
-% please contact the author at \url{anders.hendrickson@snc.edu}
-% so that it may be added to a future revision of the package.
+% \DescribeMacro{\htmlonly}The |\htmlonly|\oarg{Content for traditional output}
+% \marg{HTML content} command is to be used inside question environments (text,
+% answers, or feedback). It lets you pass directly code to the XML file while being
+% ignored for the traditional output (PDF). The HTML content passed as an argument
+% is subject to no particular processing and users should not expect to be able to
+% pass dangerous characters like |\|, |%|, or |#|. An optional argument allows to
+% pass contents to be processed for the traditional output. This argument is
+% ignored for the XML output.
+% For instance, one can write code like this in a question environment
+% \begin{quote}
+% |\htmlonly[\fbox{PDF contents}]{|\\
+% |<div style="border: 1px solid green; display: inline-block;">|\\
+% \rule{10em}{0pt}|HTML contents</div>|\\
+% |}|
+% \end{quote}
+%
+% \DescribeMacro{\htmlregister}The |\htmlregister| command lets you specify
+% the macros that must be expanded in the XML file. It works only when no
+% optional argument is used.
+%
+% \DescribeMacro{\moodleregisternewcommands}
+% When the list of macros is long, it becomes cumbersome to record them
+% individually for expansion.
+% Calling |\moodleregisternewcommands| triggers the automatic
+% expansion of macros defined subsequently using |\newcommand|,
+% |\renewcommand|, |\providecommand|, or their starred variants.
+% Again, this works only if the macros are defined \emph{without} optional
+% argument.
+%
+% If you think of another \LaTeX\ command that should be changed to an HTML
+% equivalent, please have a look at Section~\ref{sec:dev}.
%
% \section{Graphics}
-% The \textsf{moodle.sty} package can handle two kinds of graphics seamlessly.
+% The \textsf{moodle} package can handle two kinds of graphics seamlessly.
% External graphics files may be included with the |\includegraphics| command
-% from the |graphicx| package,
-% and graphics may be generated internally using \TikZ. In either case, the
-% graphics will be embedded in base-64 encoding directly within
+% from the |graphicx| package, and graphics may be generated internally using \TikZ.
+% In either case, the graphics will be embedded in base-64 encoding directly within
% the Moodle~XML produced. This prevents the hassle of managing separate
% graphics files on the Moodle server, as Moodle will store the picture
% within the question in the question bank.
%
+% \subsection{Default \texttt{includegraphics}}
% \DescribeMacro{\includegraphics}\DescribeMacro{height}\DescribeMacro{width}
% When using |\includegraphics|, the only options currently supported
% are |height| and |width|. Attempts to use other |\includegraphics| options,
% such as |scale| or |angle|, will affect the PDF but not the XML output.
-% The dimensions set by |height| and |width| are \TeX\ dimensions such as |4in| or |2.3cm|.
+% The dimensions set by |height| and |width| are \TeX\ dimensions such as \texttt{4\,in}
+% or \texttt{2.3\,cm}.
% In order to prepare the image for web viewing, this package converts those
% dimensions to pixels using a default of
% 103 pixels per inch.\footnote{This
@@ -627,11 +1078,54 @@
% That value may be changed by setting the |ppi| key (e.g., |ppi=72|);
% this is probably best done for the entire document with a |\moodleset| command,
% rather than image-by-image.
+% \DescribeMacro{\graphicspath}
+% You can use |\graphicspath{{|\emph{path}|}}| to specify a directory where the
+% pictures to be included are located.
+%
+% A special rule was added for the inclusion of GIF pictures (|.gif| extension).
+% These files are passed as-is to the XML, preserving potential animations.
+% However, as pdf\TeX\ engines do not support the GIF format, the picture is
+% passed to the PDF output after a conversion to the PNG format. When the GIF
+% file is animated, only its first frame is passed to the PDF.
+%
+%^^A \DescribeMacro{\DeclareGraphicsAlien} Users may declare other graphic
+%^^A formats with the command |\DeclareGraphicsAlien|\marg{alien extension}
+%^^A \marg{native extension}\marg{command line for conversion}.
+%
+% \subsection{\TikZ\ Pictures}
+% \TikZ\ is a user-friendly syntax layer for PGF, the macro \LaTeX\ package for creating
+% graphics. Users that are not familiar with TikZ\ can learn more here:
+% \url{https://ctan.org/pkg/pgf}.
%
-% The mechanism used is somewhat fragile and relies upon one \TikZ\ library and three free external programs.
+% When \TikZ\ is loaded and used to define pictures, \textsf{moodle} invokes
+% the |external| \TikZ\ library, so that each |tikzpicture| environment is compiled
+% to a freestanding PDF file.
+%
+% \subsection{Package Option \texttt{tikz}}\label{subsec:tikz}
+% \DescribeMacro{tikz}
+% The \textsf{moodle} package admits a \texttt{tikz} option which has the following effects:
+% \begin{itemize}
+% \item the package \texttt{tikz} is loaded.
+% \item \texttt{includegraphics} is embedded in a \TikZ\ picture. Consequences are that
+% \begin{itemize}
+% \item the pictures encoded in the XML file are resampled. This prevents encoding
+% images at a higher resolution than rendered by Moodle.
+% \item the full set of \texttt{includegraphics} options is accessible,
+% e.g.~|scale=.5|, |angle=90|, or |width=.2\textwidth|.
+% \end{itemize}
+% \item \DescribeMacro{\embedaspict} a macro |\embedaspict{...}| is provided for the
+% inclusion of inline \LaTeX\ material as images. This can serve as a workaround to
+% overcome limitations of this package---like the conversion of tabulars to HTML---
+% or limitations of Moodle itself.
+% For the definition of this macro, the package \texttt{varwidth} is loaded.
+% \item optimizations of the \TikZ-external library are disabled. Compilation might get
+% sensibly slower.
+% \end{itemize}
+%
+% \subsection{External Tools}
+% The mechanisms used for handling graphics are somewhat fragile and rely upon
+% three free external programs.
% \begin{enumerate}
-% \item \textsf{moodle.sty} invokes |\usetikzlibrary{external}|,
-% so that each |tikzpicture| environment is compiled to a freestanding PDF file.
% \item GhostScript (\url{www.ghostscript.com}) is used to convert the PDF output
% from \TikZ\ into a PNG raster graphics file.
% The default command line is presumed to be |gswin64c.exe|
@@ -639,75 +1133,515 @@
% or |gs| (if |\ifwindows| returns false).
% If your system requires a different command line to invoke Ghostscript,
% \DescribeMacro{\ghostscriptcommand}
-% you may change it by invoking |\ghostscriptcommand|\marg{executable filename}.
-% \item When external graphics files such as JPG or GIF are included,
+% you may change it by invoking:
+% \begin{quote}
+% |\ghostscriptcommand|\marg{executable filename}
+% \end{quote}
+% \item When external graphics files such as PDF are included,
% the open-source ImageMagick software (\url{www.imagemagick.org})
% converts each file to PNG format.
% The command line for ImageMagick is the nondescript word |convert|,
% \DescribeMacro{\imagemagickcommand}
% but may be changed by invoking |\imagemagickcommand|\marg{executable filename}.
-% \item Finally, the OpenSSL toolkit (\url{www.openssl.org}) is used to base64-encode
-% the PNG file so that it can be included directly in the text of the XML file.
-% The command line is presumed to be |openssl|, but can be changed with
-% \DescribeMacro{\opensslcommand}
-% |\opensslcommand|\marg{executable filename}.
+% \item OptiPNG (\url{http://optipng.sourceforge.net/}) is used to optimize the PNG images.
+% The command line is presumed to be |optipng|, but can be changed with
+% \DescribeMacro{\optipngcommand} |\optipngcommand|\marg{executable filename}.
% \end{enumerate}
%
% Please note the following vital points to make the graphics handling work:
% \begin{itemize}
% \item As of now, graphics are only supported when compiling directly to a PDF
-% with |pdflatex|. Including PS graphics or using \TikZ\ with the DVI$\to$PS workflow is not
+% with |pdflatex|. Including PS graphics or using \TikZ\ with the DVI$\to$PS workflow is not
% yet supported.
-% \item Filenames should not contains spaces or special characters like |_| or |\|.
-% \item You must have Ghostscript, ImageMagick, and OpenSSL installed on your system
-% to fully use the graphics-handling capabilities of \textsf{moodle.sty}.
+%^^A \item Filenames should not contains spaces or, under windows, special characters like |_| or |\|.
+% \item You must have Ghostscript and ImageMagick installed on your system
+% to fully use the graphics-handling capabilities of \textsf{moodle}.
+% \item If OptiPNG is not installed, the corresponding system calls will fail with otherwise no
+% impact on the compilation process: PNG files are passed unoptimized to the XML output.
% \item \LaTeX\ must be able to call system commands; that is, |\write18| must be enabled.
% For Mik\TeX, this means adding |--enable-write18| to the command line of |pdflatex|;
% for \TeX Live, this means adding |--shell-escape=true|.
+% \item Due to security issues with old versions of Ghostcript, some systems default to a
+% policy that prevents the conversion of PDF and PS to PNG. Assuming that, as a user of
+% \textsf{moodle} which requires shell escape capabilities, you either use a sandboxed
+% environment or trust the files handled at the system-level, you may want to disable this
+% over-zelous security policy. For example,
+% \href{https://stackoverflow.com/a/52661288/14608059}{see this}.
+% \item Users of the |circuitikz| package (\url{https://www.ctan.org/pkg/circuitikz}) must
+% enclose their circuits' \TikZ\ code in the |tikzpicture| environment instead of
+% the historical |circuitikz| environment. That is required, as of \TikZ\ 2.1,
+% by the |external| library.
+% \end{itemize}
+%
+% \subsection{Package Option \texttt{svg}}\label{subsec:svg}
+%
+% \paragraph{Important Notice} \emph{The \texttt{svg} option is an experimental feature
+% introduced in \textsf{moodle} v0.8. It has been tested exclusively under Linux, with
+% TeXLive 2020, Inkscape v1.0.1 and Scour 0.38.2.}
+%
+% \DescribeMacro{svg} The \textsf{moodle} package admits an experimental \texttt{svg}
+% option which has the following effects:
+% \begin{itemize}
+% \item |\includegraphics| can be used to import SVG graphic files directly
+% (extension |.svg| or |.SVG|). In this case, the SVG file is passed as-is to the
+% XML output and is converted using \href{https://inkscape.org/}
+% {Inkscape} (must be installed) for inclusion in the PDF output.
+% \item the graphic files in PDF format are converted to the SVG format using
+% \href{https://inkscape.org/}{Inkscape} (must be installed), rather than beeing
+% rasterized. Before inclusion to the XML output, the SVG file is optimized using
+% the \href{https://github.com/scour-project/scour}{Scour} utility. This
+% optimization step is optional in the sense that, if the Scour call fails,
+% the unoptimized SVG file will be passed to the XML output.
+% Two processes benefit from this PDF$\to$SVG conversion:
+% \begin{itemize}
+% \item inclusion of PDF graphics with |\includegraphics|, and
+% \item Tikz pictures that are externalized.
+% \end{itemize}
% \end{itemize}
+%
+% \DescribeMacro{\PDFtoSVGcommand}\DescribeMacro{\SVGtoPDFcommand}
+% \DescribeMacro{\optiSVGcommand} The call of external tools can be changed using
+% the macros |\PDFtoSVGcommand| \marg{\dots}, |\SVGtoPDFcommand|\marg{\dots} and
+% |\optiSVGcommand|\marg{\dots}.
+%
+% \section{Verbatim Code}
+% Because, for HTML translation, \textsf{moodle} parses the body of questions, the use of
+% verbatim code results in compilation errors. This is why the use of |\verb|,
+% |\begin{verbatim}| and other standard utilities is not supported.
+%
+% However, using the following three utilities, verbatim code can be imported from an external file:
+% \begin{enumerate}
+% \item \DescribeMacro{\verbatiminput}|\verbatiminput|\marg{filename} from the \textsf{verbatim}
+% package inserts verbatim code in both the PDF and the XML for moodle, without fancy additions.
+% \item \DescribeMacro{\VerbatimInput}The macro |\VerbatimInput|\marg{options}\marg{filename} from
+% \textsf{fancyvrb} or \textsf{fvextra} does more, with several options and settings offered
+% (see below).
+% The variants \DescribeMacro{\BVerbatimInput}|\VBerbatimInput| and
+% \DescribeMacro{\LVerbatimInput}|\LVerbatimInput| are also supported, with identical
+% effect on the XML output.
+% The variants with a star are unsupported and result in errors when used.
+% \item \DescribeMacro{\inputminted}On top of that |\inputminted|\oarg{options}\marg{lang}
+% \marg{filename}from the \textsf{minted} package offers syntaxic highlighting tailored to the
+% specified language.
+% \end{enumerate}
+% The \textsf{moodle} package handles these three commands to pass the code in the output XML.
+% With |\inputminted|, an external Python tool, \textsc{pygmentize}, performs syntax analysis and
+% its HTML formatter is used to populate the XML. With the other commands, the contents of the
+% file is passed as-is to the XML. A drawback of this approach, is that characters |<|, |>|,
+% |&|, |'|, and |"| are likely to mislead the web browser rendering the question on Moodle.
+%
+% With |\VerbatimInput| and |\inputminted|, the options that are taken care of for XML
+% generation are listed in Table~\ref{tab:verbatim-options}. Using |\fvset|\marg{key=value,...},
+% options can be set globally. Equivalently, with \textsf{minted},
+% |\setminted|\oarg{lang}\marg{key=value,...} is available.
+%
+% \begin{table}[tbp]
+% \centering
+% \begin{threeparttable}[b]
+% \caption{Options and corresponding values considered for XML generation of verbatim material
+% with \texttt{VerbatimInput} and \texttt{inputminted}.}
+% \label{tab:verbatim-options}
+% \begin{tabular}{ll}
+% \toprule
+% Option keys & Possible values\\\cmidrule(lr){1-1}\cmidrule(lr){2-2}
+% ^^A\texttt{commentchar} & \meta{character}\\
+% \texttt{gobble} & \meta{integer}\\
+% \texttt{autogobble}\tnote{1} & \texttt{true} or \texttt{false}\\
+% \texttt{tabsize} & \meta{integer}\\
+% \texttt{numbers} & \texttt{none}, \texttt{left}, \texttt{right}, or \texttt{both}\tnote{2}\\
+% \texttt{firstnumber} & \texttt{auto}, \texttt{last}, or \meta{integer}\\
+% \texttt{firstline} & \meta{integer}\\
+% \texttt{lastline} & \meta{integer}\\
+% \texttt{numberblanklines} & \texttt{true} or \texttt{false}\\
+% \texttt{highlightlines}\tnote{2} & \marg{coma-separated list of integers or ranges}\\
+% \texttt{style}\tnote{1} & \meta{string}\\
+% \bottomrule
+% \end{tabular}
+%\begin{tablenotes}
+%\item[1] \texttt{autogobble}, \texttt{numbers=both}, and \texttt{style} are offered only by \textsf{minted}.
+%\item[2] line highlighting is offered only with \textsf{fvextra} or \textsf{minted} loaded.
+%\end{tablenotes}
+%\end{threeparttable}
+%\end{table}
+%
+% In order to define the verbatim code from the \LaTeX\ document itself, it is still possible
+% to use, outside the scope of the \textsf{moodle} questions, the environments |filecontents*| (from the
+% \textsf{filecontents} package or \LaTeX\ kernel itself since 2019) or |VerbatimOut|
+% (from the \textsf{fancyvrb} and \textsf{fvextra} packages).
+%
+% Here is an example:
+% \begin{VerbatimOut}[gobble=2]{minted.doc.out}
+% \documentclass[12pt,a4paper]{article}
+% \usepackage[section]{moodle}
+% \usepackage{minted}
+% \begin{document}
+% \begin{quiz}[tags={minted}]{LaTeX Quiz}
+% \begin{filecontents*}{excerpt.tex}
+% % !TeX encoding = UTF-8
+% % !TeX spellcheck = en_US
+% % !TEX TS-program = lualatex
+% \documentclass{article}
+% \usepackage[nostamp]{moodle}
+% \ifPDFTeX % FOR LATEX and PDFLATEX
+% \usepackage[utf8]{inputenc} % necessary
+% \usepackage[T1]{fontenc} % necessary
+% \else % assuming XELATEX or LUALATEX
+% \usepackage{fontspec}
+% \fi
+% \end{filecontents*}
+% \begin{numerical}[tolerance=0]{Loading a Class}
+% Consider the following \LaTeX\ code excerpt.\\
+% \inputminted[numbers=left]{latex}{excerpt.tex}
+% On which line is the class loaded?
+% \item[feedback={
+% yes! \inputminted[highlightlines={4}]{latex}{excerpt.tex}
+% } ] 4
+% \item[feedback={No. On line 3, there is only a comment.},
+% fraction=0] 3
+% \item[feedback={No. On line 5, the package \texttt{moodle} is loaded.},
+% fraction=0] 5
+% \end{numerical}
+% \begin{multi}[single]{IDE}
+% Consider the following \LaTeX\ code excerpt.\\
+% \inputminted[numbers=left]{latex}{excerpt.tex}
+% Which \TeX\ engine will be used by the IDE for compilation.
+% \item[feedback={Have a closer look at line 3}] \texttt{tex}
+% \item[feedback={Have a closer look at line 3}] \texttt{latex}
+% \item[feedback={Have a closer look at line 3}] \texttt{pdflatex}
+% \item[feedback={Have a closer look at line 3}] \texttt{xelatex}
+% \item* \texttt{lualatex}
+% \end{multi}
+% \end{quiz}
+% \end{document}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=lines]{latex}{minted.doc.out}
+%
+% When code decorated with left-side line numbers is placed in question items, the output PDF could
+% show a collision between numbers of the item and the first line. To avoid this, |\LVerbatimInput| or
+% |\BVerbatimInput| can be used. Instead, when \textsf{minted} is used, the ``left-right'' mode can be
+% enforced with the \LaTeX\ command:
+% \begin{quote}
+% |\RecustomVerbatimEnvironment{Verbatim}{LVerbatim}{}|
+% \end{quote}
+%
+% When using utilities from \textsf{fancyvrb}, \textsf{fvextra}, or \textsf{minted}, \textsf{moodle}
+% sets framing options for the display of code in the output PDF:
+% \begin{quote}
+% |\fvset{frame=lines,label={[Beginning of code]End of code},|\\
+% | framesep=3mm,numbersep=9pt}|
+% \end{quote}
+% These settings can be overidden using |\fvset| after the preamble.
+%
+% \section{Calculated Questions}
+% Moodle's calculated questions are not supported by this package.
+%
+% However, as \href{https://github.com/avohns/python-latex-moodle-quiz}{demonstrated by A.
+% Vohns}, an advanced scripting language may be used to generate a series of questions sharing
+% the same prototype.
+%
+% We suggest to apply a specific tag to these questions. After import in Moodle, when creating
+% a quizz, this tag can be selected to narrow down a random selection of questions.
+% This would mimic the behavior of calculated questions while bringing the flexibility of your
+% favorite scripting language.
+%
+% Here are two examples inspired from the work of A. Vohns. The first one relies on the
+% native Lua capabilities of \LuaLaTeX.
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% \begin{quiz}[tags={calculated}]{Example Quiz}
+% \directlua{
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=topline]{latex}{minted.doc.out}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% function clozenum_print(pair,op,result)
+% tex.print("\\begin{numerical}$"..pair[1].." "..op.." "..pair[2].."
+% =$".."\\item ",result,"\\end{numerical}")
+% end
+% function cloze_print(pair,points)
+% tex.print("\\begin{cloze}[points="..points.."]{Arithmetic Quiz
+% ("..pair[1]..", "..pair[2]..")}Solve the following tasks!\\\\")
+% clozenum_print(pair,"+",pair[1]+pair[2])
+% clozenum_print(pair,"-",pair[1]-pair[2])
+% clozenum_print(pair,"*",pair[1]*pair[2])
+% if pair[1]/pair[2]==math.floor(pair[1]/pair[2]) then
+% clozenum_print(pair,":",math.floor(pair[1]/pair[2]))
+% end
+% tex.print("\\end{cloze}")
+% end
+% for x = 2,4 do
+% for y = 2,4 do
+% if x>y then
+% if x/y==math.floor(x/y) then points=4 else points=3 end
+% cloze_print({x,y},points)
+% end
+% end
+% end
+% \end{VerbatimOut}
+% \inputminted[]{lua}{minted.doc.out}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% }
+% \end{quiz}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=bottomline]{latex}{minted.doc.out}
+% The second example makes use of the \textsf{python} package (|\usepackage{python}|).
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% \begin{quiz}[tags={calculated}]{Example Quiz}
+% \begin{python}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=topline]{latex}{minted.doc.out}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% def clozenum_print(pair,op,result):
+% print(rf"""\begin{{numerical}}
+% ${pair[0]} {op} {pair[1]} =$\item {result}
+% \end{{numerical}}""")
+% def cloze_print(pair,points):
+% print(rf"""\begin{{cloze}}[points={points}]{{Arithmetic Quiz
+% {(pair[0],pair[1])}}}Solve the following tasks!\\""")
+% clozenum_print([x,y],"+",x+y)
+% clozenum_print([x,y],"-",x-y)
+% clozenum_print([x,y],"*",x*y)
+% if pair[0]/pair[1] == pair[0]//pair[1]:
+% clozenum_print([x,y],":",x//y)
+% print("\end{cloze}")
+% for x in range(2,5):
+% for y in range(2,5):
+% if x > y:
+% if x/y == x//y:
+% points=4
+% else:
+% points=3
+% cloze_print([x,y],points)
+% \end{VerbatimOut}
+% \inputminted[]{python}{minted.doc.out}
+% \begin{VerbatimOut}[gobble=1]{minted.doc.out}
+% \end{python}
+% \end{quiz}
+% \end{VerbatimOut}
+% \inputminted[gobble=2,frame=bottomline]{latex}{minted.doc.out}
+% These two codes yield the same XML content.
%
-% \newpage
% \section{Known Limitations and Call for Bug Reports}
-% Some features of Moodle quizzes have not yet been implemented in \textsf{moodle.sty}.
+% Table~\ref{tab:support-limitations} lists some features supported, limitations, and
+% bugs.
+%\begin{table}[tbp]
+%\centering
+%\begin{threeparttable}[b]
+%\caption{Content enrichment (pictures, equations) support after XML import in Moodle v3.5.7,
+% depending on the question type.}
+%\label{tab:support-limitations}
+%\begin{tabular}{lccc}
+% \toprule
+% & \multicolumn{3}{l}{XML rendering in\dots}\\\cmidrule(lr){2-4}
+%Question type & Question & Answer & Feedback\\\cmidrule(lr){1-1}\cmidrule(lr){2-2}
+%\cmidrule(lr){3-3}\cmidrule(lr){4-4}
+% \href{https://docs.moodle.org/35/en/Multiple_Choice_question_type}{Multichoice}
+%& yes & yes & yes \\
+% \href{https://docs.moodle.org/35/en/Numerical_question_type}{Numerical}
+%& yes & no\tnote{1} & yes \\
+% \href{https://docs.moodle.org/35/en/Short-Answer_question_type}{Short Answer}
+% & yes & no\tnote{1} & yes \\
+% Matching (\href{https://docs.moodle.org/35/en/Matching_question_type}{std})
+%& yes & no\tnote{2} & no\tnote{3} \\
+% Matching (\href{https://docs.moodle.org/35/en/Drag_and_drop_matching_question_type}{dd})
+% & yes & yes\tnote{4} & no\tnote{3} \\
+% \href{https://docs.moodle.org/35/en/Essay_question_type}{Essay}
+%& yes & yes\tnote{5,6} & yes\tnote{5} \\
+% \href{https://docs.moodle.org/35/en/True/False_question_type}{True/False}
+%& yes & no & yes \\
+% \href{https://docs.moodle.org/35/en/Description_question_type}{Description}
+%& yes & $\varnothing$ & yes \\
+%\href{https://docs.moodle.org/35/en/Embedded_Answers_(Cloze)_question_type}{Cloze} &
+%yes & $\varnothing$& $\varnothing$ \\\cmidrule(lr){1-1}
+%\hspace{1em}Numerical & yes & no\tnote{1} & yes \\
+%\hspace{1em}Short Answer & yes & no\tnote{1} & yes\tnote{7} \\
+%\hspace{1em}Multi (inline) & yes & no\tnote{2} & yes\tnote{7} \\
+%\hspace{1em}Multi (horizontal) & yes & yes & yes \\
+%\hspace{1em}Multi (vertical) & yes & yes & yes \\\bottomrule
+%\end{tabular}
+%\begin{tablenotes}
+%\item[1] Moodle prompts the student for an answer and then compares it to the
+%solutions provided. This is text-only.
+%\item[2] Moodle uses a dropdown list to let one choose among the possible
+%answers. This forbids either picture inclusion and \LaTeX\ rendering.
+%\item[3] Not supported by Moodle (in this context, answer-specific feedback
+%represents lots of possible combinations).
+%\item[4] The drag-and-drop-matching plugin seems broken before version 1.6
+%20190409. Moodle's XML import fails with a \textsf{dmlwriteexception} when
+%the field content exceeds few hundreds characters. This prevents the inclusion
+%of most base64 images and maybe some complicated equations.
+%\item[5] For this question type and in the context of XML generation, the
+%Answer column represents the ``template" while the Feedback column represents
+%the ``notes for the grader". Obviously, the grading process is not automatic
+%and there is no answer-specific feedback.
+%\item[6] Picture and \LaTeX\ rendering could be done, but only after
+%submission and only if the keyval ``response format" is set to ``html".
+%\item[7] Moodle only reveals the feedback when hovering the checkmark or X
+%mark with the mouse.
+%\end{tablenotes}
+%\end{threeparttable}
+%\end{table}
+% Tables~\ref{tab:diacritical}, \ref{tab:ligatures}, and \ref{tab:other} describe the current
+% state of support special characters, accents and other diacritical marks.
+%\begin{table}[tbp]
+% \centering
+% \caption{Support for diacritical marks
+% in a UTF8-coded \TeX~document compiled with (pdf)\LaTeX\ (packages
+% \texttt{inputenc} with option \texttt{utf8} and \texttt{fontenc} with option \texttt{T1}),
+% \LuaLaTeX\ or \XeLaTeX\ (package \texttt{fontspec}).}
+% \label{tab:diacritical}
+% \begin{threeparttable}[t]
+% \begin{tabular}{*{6}{l}}
+% \toprule
+% \multicolumn{4}{l}{Input type} & \multicolumn{2}{l}{Engine support}\\
+% \cmidrule(lr){1-4}\cmidrule(lr){5-6}
+% \multicolumn{2}{l}{Unicode} & \multicolumn{2}{l}{\LaTeX} & \XeLaTeX\ or \LuaLaTeX & (pdf)\LaTeX \\
+% \cmidrule(lr){1-2}\cmidrule(lr){3-4}\cmidrule(lr){5-5}\cmidrule(lr){6-6}
+% \aa & \AA & \verb|\aa| & \verb|\AA| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \`a & \`A & \verb|\`a| & \verb|\`A| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \^a & \^A & \verb|\^a| & \verb|\^A| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \~a & \~A & \verb|\~a| & \verb|\~A| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \'e & \'E & \verb|\'e| & \verb|\'E| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \`e & \`E & \verb|\`e| & \verb|\`E| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \"e & \"E & \verb|\"e| & \verb|\"E| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \^e & \^E & \verb|\^e| & \verb|\^E| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \^i & \^I & \verb|\^i| & \verb|\^I| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \"i & \"I & \verb|\"i| & \verb|\"I| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \~n & \~N & \verb|\~n| & \verb|\~N| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \~o & \~O & \verb|\~o| & \verb|\~O| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \"o & \"O & \verb|\"o| & \verb|\"O| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \^o & \^O & \verb|\^o| & \verb|\^O| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \`u & \`U & \verb|\`u| & \verb|\`U| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \"u & \"U & \verb|\"u| & \verb|\"U| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \^u & \^U & \verb|\^u| & \verb|\^U| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \c{c} & \c{C} & \verb|\c{c}| & \verb|\c{C}| & Unicode and \LaTeX & Unicode and \LaTeX \\
+% \c{s} & \c{S} & \verb|\c{s}| & \verb|\c{S}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \c{t} & \c{T} & \verb|\c{t}| & \verb|\c{T}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \H{o} & \H{O} & \verb|\H{o}| & \verb|\H{O}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \H{u} & \H{U} & \verb|\H{u}| & \verb|\H{U}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \"y & \"Y & \verb|\"y| & \verb|\"Y| & Unicode and \LaTeX & \LaTeX only\\
+% \k{a} & \k{A} & \verb|\k{a}| & \verb|\k{A}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \k{e} & \k{E} & \verb|\k{e}| & \verb|\k{E}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \k{i} & \k{I} & \verb|\k{i}| & \verb|\k{I}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \k{o} & \k{O} & \verb|\k{o}| & \verb|\k{O}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \k{u} & \k{U} & \verb|\k{u}| & \verb|\k{U}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \u{a} & \u{A} & \verb|\u{a}| & \verb|\u{A}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \u{e} & \u{E} & \verb|\u{e}| & \verb|\u{E}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \u{g} & \u{G} & \verb|\u{g}| & \verb|\u{G}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \u{\i} & \u{I} & \verb|\u{\i}| & \verb|\u{I}| & Unicode and \LaTeX & \LaTeX\ only\tnote{1}\\
+% \u{o} & \u{O} & \verb|\u{o}| & \verb|\u{O}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{c} & \v{C} & \verb|\v{c}| & \verb|\v{C}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{d} & \v{D} & \verb|\v{d}| & \verb|\v{D}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{e} & \v{E} & \verb|\v{e}| & \verb|\v{E}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{l} & \v{L} & \verb|\v{l}| & \verb|\v{L}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{n} & \v{N} & \verb|\v{n}| & \verb|\v{N}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{r} & \v{R} & \verb|\v{r}| & \verb|\v{R}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{s} & \v{S} & \verb|\v{s}| & \verb|\v{S}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{t} & \v{T} & \verb|\v{t}| & \verb|\v{T}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \v{z} & \v{Z} & \verb|\v{z}| & \verb|\v{Z}| & Unicode and \LaTeX & \LaTeX\ only\\
+% \bottomrule
+% \end{tabular}
+% \begin{tablenotes}
+% \item[1] The rendering of |\u{i}| is flawed in (pdf)\LaTeX's traditional output.
+% ^^A \XeLaTeX\ renders correctly |\u{i}|, that is, without a superscript dot.
+% ^^A Instead, with (pdf)\LaTeX\ the rendering of |\u{i}| is flawed by the
+% ^^A superposition of the superscript dot and the breve diacritical mark.
+% ^^A Both engines render |\u{\i}| as expected.
+% \end{tablenotes}
+% \end{threeparttable}
+% \end{table}
+%
+%\begin{table}[tbp]
+% \centering
+% \begin{threeparttable}[t]
+% \caption{Support for ligatures in a UTF8-coded \TeX~document compiled with (pdf)\LaTeX\ (packages
+% \texttt{inputenc} with option \texttt{utf8}, \texttt{fontenc} with option \texttt{T1}),
+% \LuaLaTeX\ or \XeLaTeX\ (package \texttt{fontspec}).}
+% \label{tab:ligatures}
+% \begin{tabular}{llllll}
+% \toprule
+% \multicolumn{4}{l}{Input type} & \multicolumn{2}{l}{Engine support}\\
+% \cmidrule(lr){1-4}\cmidrule(lr){5-6}
+% \multicolumn{2}{l}{Unicode} & \multicolumn{2}{l}{\LaTeX} & \XeLaTeX \ or \LuaLaTeX& (pdf)\LaTeX \\
+% \cmidrule(lr){1-2}\cmidrule(lr){3-4}\cmidrule(lr){5-6}\cmidrule(lr){6-6}
+% \ae & \AE & \verb|\ae| & \verb|\AE| & Unicode and \LaTeX & \LaTeX\ only\\
+% \oe & \OE & \verb|\oe| & \verb|\OE| & Unicode and \LaTeX & \LaTeX\ only\\
+% \ss & \SS & \verb|\ss| & \verb|\SS| & Unicode and \LaTeX\tnote{1} & \LaTeX\ only\tnote{2}\\
+% \bottomrule
+% \end{tabular}
+% \begin{tablenotes}[b]
+% \item[1] the Libertine font, used in this documentation and available for instance via the
+% package |libertine|, defines the glyph \SS. Most fonts do not define this glyph.
+% \item[2] \LaTeX\ defines the \verb|\SS| macro but (pdf)\LaTeX\ renders it as a doubled capital S.
+% \end{tablenotes}
+% \end{threeparttable}
+% \end{table}
+%
+%\begin{table}[tbp]
+% \centering
+% \begin{threeparttable}[b]
+% \caption{Support for other glyphs and punctuation marks in a UTF8-coded \TeX~document compiled
+% with (pdf)\LaTeX\ (packages \texttt{inputenc} with option \texttt{utf8}, \texttt{fontenc} with
+% option \texttt{T1}), \LuaLaTeX\ or \XeLaTeX\ (package \texttt{fontspec}).}
+% \label{tab:other}
+% \begin{tabular}{llllll}
+% \toprule
+% \multicolumn{4}{l}{Input type} & \multicolumn{2}{l}{Engine support}\\
+% \cmidrule(lr){1-4}\cmidrule(lr){5-6}
+% \multicolumn{2}{l}{Unicode} & \multicolumn{2}{l}{\LaTeX} & \XeLaTeX\ or \LuaLaTeX & (pdf)\LaTeX \\
+% \cmidrule(lr){1-2}\cmidrule(lr){3-4}\cmidrule(lr){5-5}\cmidrule(lr){6-6}
+% \l & \L & \verb|\l| & \verb|\L| & Unicode and \LaTeX & \LaTeX\ only\\
+% \o & \O & \verb|\o| & \verb|\O| & Unicode and \LaTeX & \LaTeX\ only\\
+% « & & \verb|\guillemotleft|\tnote{1} & & Unicode and \LaTeX & \LaTeX\ only\\
+% » & & \verb|\guillemotright|\tnote{1} & & Unicode and \LaTeX & \LaTeX\ only\\
+% ¿ & & \verb|\textquestiondown| & & Unicode and \LaTeX & \LaTeX\ only\\
+% ¡ & & \verb|\textexclamdown| & & Unicode and \LaTeX & \LaTeX\ only\\
+% \bottomrule
+% \end{tabular}
+% \begin{tablenotes}
+% \item[1] for the same symbols the package |babel| defines |\flqq| and |\frqq|, and
+% if loaded with option |french| defines |\og| and |\fg|. These commands
+% are also supported by \textsf{moodle}.
+% \end{tablenotes}
+% \end{threeparttable}
+% \end{table}
+%
+% Some features of Moodle quizzes have not yet been implemented in \textsf{moodle}.
% Here is a non-exhaustive list.
% \begin{itemize}
% \item Moodle's feature of designating feedback for correct,
% partially correct, and incorrect answers.
-% \item Calculated questions; that is, automatically generated numerical questions
-% using randomly chosen numbers.
+%^^A \item Calculated questions; that is, automatically generated numerical questions
+%^^A using randomly chosen numbers.
% \item Hints
-% \item Keywords
-% \item So-called ``description'' questions.
-% \item Shuffled answers in multiple choice cloze subquestions.
+% \item Units handling in numerical questions
% \end{itemize}
-% I have used Version 0.5 for one semester's teaching,
-% but if other users adopt this package, I fully expect them to find bugs.
-% \emph{Please} send all bugs you find to \url{anders.hendrickson@snc.edu},
-% so that I can fix them for subsequent versions.
+% The authors have used this package together with a limited number of colleagues
+% for a few semesters of teaching. If other users adopt this package, we fully expect them
+% to find bugs. If you run into a problem, please have a look at Section~\ref{sec:dev}.
%
% \section{Compatibility}
-% This package has been written for and tested with the implementation of
+% This package has been originally written for and tested with the implementation of
% Moodle 2.9 run by Moodlerooms for St.~Norbert College in January 2016.
-% Future versions of this package will probably include some support for
-% specifying your version of Moodle in the |.tex| file to help ensure compatability.
+% Since then, it has been successfully combined with Moodle 3.5.
+% Future versions of this package might include some support for
+% specifying your version of Moodle in the |.tex| file to help ensure compatibility.
%
% As the ultimate purpose of this package is the generation of XML files,
-% future versions of \textsf{moodle.sty} will attempt to maintain backwards
-% compatability with earlier versions of regarding the XML output, apart from
-% bug fixes.
+% future versions of \textsf{moodle} will attempt to maintain backwards
+% compatibility with earlier versions regarding the XML output, apart from
+% bug fixes.
% Backwards compatibility of the PDF output is not yet guaranteed, however,
% in case the author or users discover better ways for the PDF to display
% the underlying XML data to be proofread.
%
% In other words, compiling your current |.tex| file with a future version
-% of \textsf{moodle.sty} should produce the same XML file it does now
+% of \textsf{moodle} should produce the same XML file it does now
% (apart from bug fixes),
% but it might produce a more informative, and hence different,
% PDF output.
%
%
% \section{Unrelated Tip: Quality of Moodle \TeX\ Images}
-% This has nothing to do with |moodle.sty|, but is a Frequently Asked Question
+% This has nothing to do with \textsf{moodle}, but is a Frequently Asked Question
% in is own right.
% On some servers, at least, Moodle's default ``\TeX\ Filter'' for
% displaying mathematical notation is of abysmally poor quality, rending mathematics
@@ -716,40 +1650,267 @@
% but turn ``MathJax'' \emph{on}. This forces \TeX\ code to be rendered by MathJax
% instead of Moodle, producing much higher-quality results.
%
+% \clearpage
+% \section{Package Development}\label{sec:dev}
+% This package is developed as a collaborative project, currently hosted
+% on the Gitlab server instance \url{https://framagit.org/mattgk/moodle}.
+% The project's activity can be monitored there: reported issues, last
+% modifications, \dots
+%
+% Contributions, either bug reports or fixes, are welcome. Users willing to
+% help can either sign-in with an existing \textsf{GitHub}, \textsf{Gitlab.com}, or
+% \textsf{Bitbucket} account or register a new account.
+%
+% Of course, getting in touch with the package maintainer by
+% \href{mailto:guerquin-kernATcrans.org}{email} works as well.
+%
+% When experiencing a problem and before reporting it, please check whether
+% or not something similar has already been filed as an issue
+% \href{https://framagit.org/mattgk/moodle/-/issues?scope=all&state=all}{here}.
+% If the problem appears to be new, please report it by following these steps:
+% \begin{enumerate}
+% \item Prepare a \emph{minimal} working example, i.e. a |.tex| file shunk down
+% to the strict minimum (loaded packages, code, \dots) while still showing the
+% faulty behavior upon compilation.
+% \item Gather and send the |*.tex|, |*.log| and |*-moodle.xml| files together
+% with an explanation about
+% \begin{itemize}
+% \item your working environment (\TeX\ engine and distribution, operating
+% system, \dots),
+% \item the faulty behavior, and
+% \item what you expected instead.
+% \end{itemize}
+% \end{enumerate}
+%
+% ^^A\clearpage
+% \changes{v0.5}{2016/01/05}{Initial version}
+% \changes{v0.6}{2019/02/18}{Bux-fixing release}
+% \changes{v0.7}{2020/07/09}{Feature extensions}
+% \changes{v0.8}{2021/01/04}{Bug fixes and feature extensions}
+% \changes{v0.9}{2021/02/07}{Bug fixes and feature extensions}
+% \begin{changelog}[title={Version History},author={Matthieu Guerquin-Kern}]
+% \begin{version}[version=0.9,date=2021-02-07]
+% \added
+% \item Support for \href{https://docs.moodle.org/310/en/All_or_nothing_multiple_choice_question_type}
+% {all-or-nothing multiple choice} questions.
+% \item Support for the ogonek diacritical mark via |\k|\marg{\dots}.
+% \item Warn user of the \texttt{babel} package set for a German-related language
+% that using the character |"| will not play well with \textsf{moodle}.
+% \item Support for \textsf{babel} commands related to German quotes.
+% \item Support for en-dash (--) outside of math mode.
+% \item Support for |\%| in conversion to HTML.
+% \item Command |\htmlonly[]{}| to pass HTML contents directly to the XML file.
+% \changed
+% \item An error is issued when a graphics conversion step fails.
+% \item Irrelevant points are no longer written at the cloze question level in PDF and XML.
+% \item The total number of marks is shown in the PDF at the end of each quiz.
+% \item The |tags| key can now be used to specify a comma-separated list of tags.
+% \fixed
+% \item Answer text of shortanswer questions is converted to HTML.
+% \item Paragraph breaks in multi and essay items no longer break compilation.
+% \item Question text in Essays was not shown in PDF file.
+% \item Commands |\textsc|, |\underline|, |\url|, and |\href| yielded HTML code with
+% inadequate double quotation marks.
+% \item Broken base64-encoding pipeline for images under Windows (thanks to Andreas Vohns).
+% \item Repeated single right quotation marks no longer merged in math mode
+% (thanks to Alberto Albano).
+% \end{version}
+% \begin{version}[version=0.8,date=2021-01-04]
+% \added
+% \item Support for inclusion of GIF pictures.
+% \item Added package option |svg| to avoid the rasterization of vector graphics.
+% \item New macro |\setsubcategory| to define subcategories, reflected in PDF and XML.
+% \item Package option |handout| for sharing PDF with students.
+% \item Extensions can be omitted when including pictures.
+% \item Description question type.
+% \item \LuaLaTeX\ is now supported (and recommended for UTF8-coded sources).
+% \item Examples of ways to reproduce the behavior of calculated questions.
+% \item Command to trigger the automatic recording of new commands.
+% \item Mechanism to match |fraction| key to values accepted by Moodle.
+% \item A |fractiontol| key to control the tolerance in this mechanism.
+% \item Support for inverted punctuation marks |¿| and |¡|.
+% \item Support for |\_| and |\textbackslash|.
+% \item Support for the wildcard character as an answer in numerical questions.
+% \changed
+% \item Template of Essay questions is now shown in PDF.
+% \item The macro |\setcategory| is reflected by a new section in PDF.
+% \item In matching questions, warnings are raised if the number of items is insufficient.
+% \item Improved display of matching questions in PDF.
+% \item The package \textsf{iftex} is now required.
+% \item An error is thrown when |fraction| is set to an invalid value.
+% \item In numerical questions, the tolerance can be set in exponent form.
+% \item Nicer PDF rendering of numbers in numerical questions if \textsf{siunitx} is loaded.
+% \item Included PNG and JPEG files are now directly converted to base64.
+% \fixed
+% \item TeX's inline math (|$...$|) can now contain escaped dollar signs (|\$|).
+% \item Closing braces escaped in cloze subquestions outside math environment.
+% \item The scope of the |tolerance| key is now respected.
+% \end{version}
+% \begin{version}[version=0.7,date=2020-09-06]
+% \added
+% \item Support for inclusion of verbatim code.
+% \item Package option \texttt{tikz}.
+% \item Support for |\"Y| and |\"y|.
+% \item New commands converted to XML.
+% \item Adding a stamp comment in XML, package option offered to disable
+% this behavior.
+% \item Support for the |\tikz| command.
+% \item A different directory can be specified for picture inclusion.
+% \item Warn user of the \texttt{babel} package set for french that autospacing
+% must be deactivated.
+% \item Square bracket math delimiters are recognized and converted properly.
+% \item Support of breve and caron diacritical marks.
+% \changed
+% \item In multi with multiple answers allowed, choosing all options no longer
+% results in a good grade. An automatic penalty mechanism is introduced.
+% Can be overridden by manually setting fractions.
+% \removed
+% \item Irrelevant \texttt{penalty} tag in cloze subquestions.
+% \fixed
+% \item Non-integer fractions can now be specified in cloze subquestions.
+% \item Significantly squeeze PNG images size by skipping ancillary data.
+% \item Enumerate or itemize environment can now be nested in question items.
+% \item Several pictures can be included in a question without being mixed
+% in the XML file.
+% \item Management and rendering of fraction in questions.
+% \item Correctly handling a \LaTeX\ command starting the last item of a question.
+% \item Closing braces escaped in cloze subquestions. This allows \LaTeX\
+% equations or images to be included.
+% \item Image inclusion with macOS.
+% \end{version}
+% \begin{version}[version=0.6b,date=2019-11-27]
+% \added
+% \item New package options to set section or subsection at the quiz level.
+% \item True/False question type is now supported.
+% \item Moodle tags can now be specified for questions (and rendered in PDF
+% as well).
+% \item In cloze questions, the \texttt{multiresponse} subquestion type is
+% now supported.
+% \removed
+% \item External dependency on \texttt{OpenSSL}.
+% \item Irrelevant tags were written in XML for matching questions.
+% \fixed
+% \item \TikZ\ externalization now works when using \XeLaTeX.
+% \item It is now possible to set points manually among several correct
+% answers in multichoice questions.
+% \item General feedbacks can now contain backslashes.
+% \item Several quizzes can now be defined in a single source file, each
+% specifying a category for Moodle's question bank.
+% \item Correct encoding information is now written in XML depending on
+% the \LaTeX\ compiler used.
+% \end{version}
+% \begin{version}[version=0.6a,date=2019-06-21]
+% \added
+% \item \XeLaTeX\ is now recommended when using UTF8-encoded sources (support
+% of accents).
+% \item Feedbacks are now displayed in the PDF file produced.
+% \item The \texttt{optipng} utility is used to reduce the size
+% of images embedded in the XML file.
+% \item Question options and settings are now displayed in the PDF file
+% \item Supporting more \LaTeX\ macros for symbols and accents (mostly
+% diacritical marks and ligatures).
+% \item Introduce shuffle options in cloze-multi subquestions.
+% \item Package option \texttt{final}.
+% \changed
+% \item In draft mode, \TikZ\ externalization is no longer triggered.
+% \fixed
+% \item In the different question types, the feedback fields are now converted
+% for HTML allowing \LaTeX\ equation and images.
+% \item Documentation improvements (limitations and previously undocumented
+% features).
+% \end{version}
+% \shortversion{version=0.5,date=2016-01-05,simple,changes=Initial version,author={Anders O.F. Hendrickson}}
+% \end{changelog}
+%
% \StopEventually{}
%
% \section{Implementation}
% \subsection{Packages, Options, and Utilities}
% \begin{macrocode}
\newif\ifmoodle@draftmode
+\newif\ifmoodle@handout
+\newif\ifmoodle@stampmode
+\newif\ifmoodle@tikz
\newif\ifmoodle@tikzloaded
+\newif\ifmoodle@svg
+\newif\ifmoodle@section
+\newif\ifmoodle@subsection
+\newif\ifmoodle@numbered
%%DECLARATION OF OPTIONS
\DeclareOption{draft}{\moodle@draftmodetrue}
+\DeclareOption{handout}{\moodle@handouttrue}
+\DeclareOption{final}{\moodle@draftmodefalse}
+\DeclareOption{nostamp}{\moodle@stampmodefalse}
+\DeclareOption{tikz}{\moodle@tikztrue}
+\DeclareOption{svg}{\moodle@svgtrue}
+\DeclareOption{section}{\moodle@sectiontrue\moodle@numberedtrue}
+\DeclareOption{section*}{\moodle@sectiontrue\moodle@numberedfalse}
+\DeclareOption{subsection}{\moodle@sectionfalse\moodle@numberedtrue}
+\DeclareOption{subsection*}{\moodle@sectionfalse\moodle@numberedfalse}
\moodle@draftmodefalse
+\moodle@handoutfalse
+\moodle@stampmodetrue
+\moodle@tikzfalse
\moodle@tikzloadedfalse
+\moodle@svgfalse
+\moodle@subsectiontrue
+\moodle@numberedfalse
\ProcessOptions
\RequirePackage{environ} %To be able to take environment body as a macro argument
\RequirePackage{xkeyval} %For key-handling
\RequirePackage{amssymb} %For \checkmark symbol
-\RequirePackage{trimspaces} %To remove extra spaces from strings
-\RequirePackage{etex} %Expansion control, detokenization, etc.
+%\RequirePackage{trimspaces} %To remove extra spaces from strings (loaded by environ)
+\@ifpackageloaded{iftex}{}{\RequirePackage{iftex}}
+% iftex already required by recent versions of ifplatform. Needed to know:
+% 1) whether we can convert output from PDF to PNG (ifpdf),
+% 2) when output pdf is latin1-encoded (ifpdf)
+% 3) when output xml is utf8-encoded (if?tex)
+\@ifundefined{ifeTeX}{% version of 'iftex' prior to November 2019.
+ \RequirePackage{etex}{}
+}{
+ \ifeTeX\else
+ \RequirePackage{etex}{} % Recent (2015+) TeX engines should be e-TeX.
+ %This is needed for expansion control, detokenization, etc.
+ \fi
+}
\RequirePackage{etoolbox}%List management
\RequirePackage{xpatch} %To patch commands easily in HTML mode
\RequirePackage{array} %For formatting tables in the LaTeX mode of Clozes
\RequirePackage{ifplatform} % To choose Ghostscript commands
-\RequirePackage{ifpdf} % Needed to know whether we can convert output from PDF to PNG
-
+\@ifundefined{ifpdf}{\RequirePackage{ifpdf}}{}% old iftex would not define the conditional
+\RequirePackage{shellesc} %Luatex-compatible way of getting system access
+\RequirePackage{fancybox} %For fancy LaTeX tags
\RequirePackage{getitems} %To gather the header and items
+\ifmoodle@handout
+ \RequirePackage[seed=42]{randomlist} %To randomize answers in matching questions
+\fi
+\ifmoodle@svg
+ \RequirePackage{graphicx} %To include graphics
+\fi
\let\xa=\expandafter
\def\@star{*}%
\def\@hundred{100}%
+\def\@fifty{50}%
\def\@moodle@empty{}%
\def\@relax{\relax}%
+\def\@moodle@par{\par}%
+
+% Taken from https://tex.stackexchange.com/questions/47576/combining-ifxetex-and-ifluatex-with-the-logical-or-operation
+\@ifundefined{ifTUTeX}{
+ \newif\ifTUTeX % a new conditional starts as false
+ \ifnum 0\ifXeTeX 1\fi\ifLuaTeX 1\fi>0%
+ \TUTeXtrue
+ \fi
+}{}%
+\newif\ifpdfoutput % a new conditional starts as false
+\ifnum 0\ifTUTeX 1\fi\ifPDFTeX\ifpdf 1\fi\fi>0%
+ \pdfoutputtrue
+\fi
% \end{macrocode}
% As the package involves a fair bit of file processing,
% we automate the naming of auxiliary files.
@@ -787,9 +1948,42 @@
\newwrite\moodle@outfile
\def\openmoodleout{%
\immediate\openout\moodle@outfile=\outputfilename\relax
- \writetomoodle{<?xml version="1.0" encoding="UTF-8"?>}%
+ \ifPDFTeX % latin1-based engines (pdflatex or latex)
+ \writetomoodle{<?xml version="1.0" encoding="iso-8859-1"?>}%
+ \else
+ \ifTUTeX % UTF8-based engines (XeTeX or LuaTeX)
+ \writetomoodle{<?xml version="1.0" encoding="UTF-8"?>}%
+ \else % what shall we do?
+ \writetomoodle{<?xml version="1.0" encoding="UTF-8"?>}%
+ %\stop
+ \fi
+ \fi
+ \ifmoodle@stampmode
+ \def\moodle@stamp{This file was generated on \the\year-\two@digits\month-\two@digits\day}
+ \ifPDFTeX % pdflatex or latex
+ \ifpdf % pdflatex
+ \g@addto@macro{\moodle@stamp}{ by pdfLaTeX }%
+ \else % latex
+ \g@addto@macro{\moodle@stamp}{ by LaTeX }%
+ \fi
+ \else
+ \ifXeTeX % xetex
+ \g@addto@macro{\moodle@stamp}{ by XeLaTeX }%
+ \else
+ \ifLuaTeX % luatex
+ \g@addto@macro{\moodle@stamp}{ by LuaLaTeX }%
+ \else
+ \g@addto@macro{\moodle@stamp}{ a TeX engine }%
+ \fi
+ \fi
+ \fi
+ \writetomoodle{<!-- \moodle@stamp -->}%
+ \def\moodle@stamp{running on \platformname}%
+ \g@addto@macro{\moodle@stamp}{ with the package moodle v0.9 }%
+ \writetomoodle{<!-- \moodle@stamp -->}%
+ \fi
+ \immediate\write\moodle@outfile{}%
\writetomoodle{<quiz>}%
- \writetomoodle{ }%
}%
\def\closemoodleout{%
\writetomoodle{ }%
@@ -797,6 +1991,7 @@
\immediate\closeout\moodle@outfile
}%
% \end{macrocode}
+%
% To both make this |.sty| file and the XML output more readable,
% we create a mechanism for writing to the output file with indents.
% The macro |\calculateindent|\marg{$n$} globally defines
@@ -836,27 +2031,73 @@
% We now create the main |quiz| environment that will contain
% the questions we write. It outputs to XML as a |<question type="category">| tag.
% \begin{macrocode}
-\newenvironment{quiz}[2][]%
- {\setkeys{moodle}{#1}%
- \@moodle@ifgeneratexml{%
- \openmoodleout%
- \setcategory{#2}%
- }{}%
- \subsection*{#2}%
- \begin{enumerate}%
- }
- {\end{enumerate}%
- \@moodle@ifgeneratexml{\closemoodleout}{}}
-
-{\catcode`\$=12\catcode`\ =12%
-\gdef\setcategory#1{%
+{\catcode`\$=12\catcode`\ =12% in this context we cannot indent with spaces...
+\gdef\moodle@write@category@xml#1{%
+\@moodle@ifgeneratexml{%
+\writetomoodle{ }%
\writetomoodle{<question type="category">}%
\writetomoodle{ <category>}%
-\writetomoodle{ <text>$module$/#1</text>}%
+\writetomoodle{ <text>$course$/top/#1</text>}%
\writetomoodle{ </category>}%
\writetomoodle{</question>}%
\writetomoodle{ }%
+}{}%
}}%
+\newcommand*\@enumeratename{enumerate}%
+\newdimen\moodle@totalmarks \moodle@totalmarks=0pt%
+\newenvironment{quiz}[2][]{%
+ \setkeys{moodle}{#1}%
+ \gdef\setcategory##1{%
+ % At first call (end of \begin{quiz}) enumerate is not started yet
+ \ifx\@currenvir\@enumeratename
+ % In case no question is defined between two calls of \setcategory
+ \def\@noitemerr{}%\@latex@warning{Empty question list}
+ \end{enumerate}%
+ \fi
+ \gdef\moodle@currentcategory{##1}%
+ \moodle@write@category@xml{##1}%
+ \ifmoodle@section
+ \ifmoodle@numbered
+ \section{##1}%
+ \else
+ \section*{##1}%
+ \fi
+ \else
+ \ifmoodle@numbered
+ \subsection{##1}%
+ \else
+ \subsection*{##1}%
+ \fi
+ \fi
+ \begin{enumerate}%
+ }%
+ \gdef\setsubcategory##1{%
+ \def\@noitemerr{}%\@latex@warning{Empty question list}
+ \end{enumerate}%
+ \moodle@write@category@xml{\moodle@currentcategory/##1}%
+ \ifmoodle@section
+ \ifmoodle@numbered
+ \subsection{##1}%
+ \else
+ \subsection*{##1}%
+ \fi
+ \else
+ \ifmoodle@numbered
+ \subsubsection{##1}%
+ \else
+ \subsubsection*{##1}%
+ \fi
+ \fi
+ \begin{enumerate}%
+ }%
+ \setcategory{#2}%
+}{%
+ \end{enumerate}%
+ \emph{Total of marks: \strip@pt\moodle@totalmarks}%
+ \let\setcategory\relax
+ \let\setsubcategory\relax
+}%
+
% \end{macrocode}
% The next utility takes a single macro control sequence |#1|,
% and allows that macro's current value to persist
@@ -888,6 +2129,19 @@
}%
}
% \end{macrocode}
+% Now the macros |openmoodleout| and |closemoodleout| are triggered at Begin and End Document, respectively
+% \begin{macrocode}
+\AfterEndPreamble{
+ \@moodle@ifgeneratexml{%
+ \openmoodleout%
+ }{}%
+}
+\AtEndDocument{
+ \@moodle@ifgeneratexml{%
+ \closemoodleout%
+ }{}%
+}
+% \end{macrocode}
%
% \subsection{Key-Value Pairs for Quiz Questions}
%
@@ -902,7 +2156,7 @@
% to the output XML file.
%
% The ordinary version |\generate@moodle@write@code| passes its output text |#3|
-% through the HTMLizer, producing HTML code, while the starred version
+% through the HTMLizer, producing HTML code, while the starred variant
% |\generate@moodle@write@code*| passes |#3| verbatim as text.
%
% For example,
@@ -951,6 +2205,23 @@
}%
}%
+\def\generate@moodle@write@html@noptag#1<#2>#3{%
+ % No <P>..</P> introduced
+ % #1 = NAME for \moodle@writeNAME
+ % #2 = HTML tag
+ % #3 = what, exactly, to write
+ \xa\gdef\csname moodle@write#1\endcsname{%
+ \xa\def\xa\test@iii\xa{#3}%
+ \ifx\test@iii\@moodle@empty
+ \writetomoodle[2]{ <#2 format="html"><text/></#2>}%
+ \else
+ \xa\converttohtmlmacro\xa\moodle@htmltowrite\xa{#3}%
+ \writetomoodle[2]{ <#2 format="html">}%
+ \writetomoodle[4]{ <text><![CDATA[\moodle@htmltowrite]]></text>}%
+ \writetomoodle[2]{ </#2>}%
+ \fi
+ }%
+}%
\def\generate@moodle@write@data*#1<#2>#3{%
% #1 = NAME for \moodle@writeNAME
@@ -961,16 +2232,41 @@
}%
}%
+\def\moodle@writetags{%
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \writetomoodle[2]{ <tags>}%
+ \renewcommand*{\do}[1]{%
+ \def\moodle@tagtext{##1}%
+ \xa\converttohtmlmacro\xa\moodle@htmltowrite\xa{\moodle@tagtext}%
+ \writetomoodle[4]{ <tag><text><![CDATA[\moodle@htmltowrite]]></text></tag>}%
+ }
+ \xa\docsvlist\xa{\moodle@tags}%
+ \writetomoodle[2]{ </tags>}%
+ \fi
+}%
+\newif\ifmoodle@firsttag
+\moodle@firsttagtrue
+\def\moodle@latex@writetags{%
+ \xa\xdef\xa\test@iii\xa{\moodle@tags}%
+ \ifx\test@iii\@moodle@empty\relax\else
+ \hfill tags: %
+ \renewcommand*{\do}[1]{\ifmoodle@firsttag\moodle@firsttagfalse\else, \fi\texttt{##1}}%
+ \xa\docsvlist\xa{\test@iii}%
+ \fi
+}%
% \end{macrocode}
% \subsubsection{Keys for all question types}
% \begin{macrocode}
%% QUESTIONNAME
\define@cmdkey{moodle}[moodle@]{questionname}{}%
- \gdef\moodle@writequestionname{%
- \writetomoodle[2]{<name>}%
- \writetomoodle[4]{ <text>\moodle@questionname</text>}%
- \writetomoodle[2]{</name>}%
- }%
+% \gdef\moodle@writequestionname{%
+% \writetomoodle[2]{<name>}%
+% \writetomoodle[4]{ <text>\moodle@questionname</text>}%
+% \writetomoodle[2]{</name>}%
+% }%
+%\generate@moodle@write@code{questionname}<name>{\moodle@questionname}%
+\generate@moodle@write@html@noptag{questionname}<name>{\moodle@questionname}%
%% QUESTIONTEXT
%I tried to use questiontext as a key, but it doesn't seem to work.
@@ -986,9 +2282,9 @@
\generate@moodle@write@code{questiontext}<questiontext>{\moodle@questiontext}%{%
%% PENALTY FOR WRONG ATTEMPT
- \define@cmdkey{moodle}[moodle@]{penalty}[0.1000000]{}%
+ \define@cmdkey{moodle}[moodle@]{penalty}[0.10]{}%
\generate@moodle@write@code*{penalty}<penalty>{\moodle@penalty}%
- \moodleset{penalty}%
+ \moodleset{penalty=0.10}%
%% FEEDBACK
% Moodle allows for feedback tailored to each question,
@@ -1002,7 +2298,7 @@
\define@cmdkey{moodle}[moodle@]{feedback}[]{}%
\generate@moodle@write@code{generalfeedback}<generalfeedback>{\moodle@feedback}%
\generate@moodle@write@code{feedback}<feedback>{\moodle@feedback}%
- \moodleset{feedback}%
+ \moodleset{feedback={}}%
%% DEFAULT GRADE
%The next line creates \moodle@defaultgrade,
@@ -1028,7 +2324,12 @@
\moodle@writehidden%
}%
-% TO DO: 'tags' (i.e., keywords)
+%% TAGS
+ %The next line creates \moodle@tags,
+ %which defines a "tag" (i.e., keyword) for the question.
+ %Key calls like [tags={random}] set \moodle@tags.
+ \define@cmdkey{moodle}[moodle@]{tags}[]{}%
+ \moodleset{tags={}}%
% \end{macrocode}
% \subsubsection{Keys for all answers}
@@ -1039,13 +2340,18 @@
%the XML within the answer tag, like <answer fraction="75">.
\moodleset{fraction=100} %This sets the default.
% \end{macrocode}
+% \begin{macrocode}
+%% FRACTIONTOL -- the tolerance for fractions with respect to valid values
+ \define@cmdkey{moodle}[moodle@]{fractiontol}[0.1]{}%
+ \moodleset{fractiontol=0.1} %This sets the default.
+% \end{macrocode}
% \subsubsection{Keys for multiple choice questions}
% \begin{macrocode}
%% SINGLE and MULTIPLE -- for multichoice, is there 1 right answer or more than 1?
\define@boolkey{moodle}[moodle@]{single}[true]{}%
\generate@moodle@write@code*{single}<single>{\ifmoodle@single true\else false\fi}%
- \moodleset{single}%
+ \moodleset{single=true}%
%The key 'multiple' is an antonym to 'single'.
\define@boolkey{moodle}[moodle@]{multiple}[true]{\ifmoodle@multiple\moodle@singlefalse\else\moodle@singletrue\fi}%
@@ -1054,15 +2360,20 @@
\generate@moodle@write@code*{shuffle}<shuffleanswers>{\ifmoodle@shuffle 1\else 0\fi}%
\moodleset{shuffle=true}%
-%% TO DO: CORRECTFEEDBACK
-%% TO DO: PARTIALLYCORRECTFEEDBACK
-%% TO DO: INCORRECTFEEDBACK
-%% TO DO: NUMCORRECT key
+%% ALLORNOTHING -- for multichoice with multiple answers where all the points are given
+% if and only if all the correct answers are selected.
+ \define@boolkey{moodle}[moodle@]{allornothing}[true]{}%
+ \moodleset{allornothing=false}%
+
+%% TODO: CORRECTFEEDBACK
+%% TODO: PARTIALLYCORRECTFEEDBACK
+%% TODO: INCORRECTFEEDBACK
+%% TODO: NUMCORRECT key
%% NUMBERING -- for numbering of multichoice questions
\define@choicekey{moodle}{numbering}%
{alpha,alph,Alpha,Alph,arabic,roman,Roman,%
- abc,ABC,123,iii,IIII,none}[abc]{%
+ abc,ABCD,123,iii,IIII,none}[abc]{%
\def\moodle@numbering{#1}%
\def\test@@i{#1}%
\ifx\test@@i\@moodle@alpha
@@ -1070,9 +2381,9 @@
\ifx\test@@i\@moodle@alph
\def\moodle@numbering{abc}\fi
\ifx\test@@i\@moodle@Alpha
- \def\moodle@numbering{ABC}\fi
+ \def\moodle@numbering{ABCD}\fi
\ifx\test@@i\@moodle@Alph
- \def\moodle@numbering{ABC}\fi
+ \def\moodle@numbering{ABCD}\fi
\ifx\test@@i\@moodle@arabic
\def\moodle@numbering{123}\fi
\ifx\test@@i\@moodle@roman
@@ -1094,7 +2405,7 @@
\def\@moodle@roman{roman}%
\def\@moodle@Roman{Roman}%
\def\@moodle@abc{abc}%
- \def\@moodle@ABC{ABC}%
+ \def\@moodle@ABCD{ABCD}%
\def\@moodle@arabicnumbers{123}%
\def\@moodle@iii{iii}%
\def\@moodle@IIII{IIII}%
@@ -1103,7 +2414,7 @@
\ifx\moodle@numbering\@moodle@abc
\renewcommand\theenumii{\alph{enumii}}%
\fi
- \ifx\moodle@numbering\@moodle@ABC
+ \ifx\moodle@numbering\@moodle@ABCD
\renewcommand\theenumii{\Alph{enumii}}%
\fi
\ifx\moodle@numbering\@moodle@arabicnumbers
@@ -1119,7 +2430,7 @@
\renewcommand\labelenumii{$\bullet$~}%
\fi
}
- %TO DO: * In the PDF, how should 'none' in a multi look different from
+ %TODO: * In the PDF, how should 'none' in a multi look different from
% short answer or numerical options?
% * Instead of \theenumi and \labelenumi,
% use \@enumdepth to automatically set the correct depth.
@@ -1140,7 +2451,7 @@
%tolerance is given within the answer tag,
%like <answer fraction=100 tolerance=0.03>.
-% TO DO: implement unit-handling for numerical questions!
+% TODO: implement unit-handling for numerical questions!
% \end{macrocode}
% \subsubsection{Keys for short answer questions}
% \begin{macrocode}
@@ -1215,7 +2526,7 @@
%% RESPONSE REQUIRED
\define@boolkey{moodle}[moodle@]{response required}[true]{}%
- % TO DO: Make synonym 'required'
+ % TODO: Make synonym 'required'
\generate@moodle@write@code*{responserequired}<responserequired>{\csname ifmoodle@response required\endcsname 1\else 0\fi}%
\moodleset{response required=false}%
@@ -1245,7 +2556,7 @@
%% RESPONSE TEMPLATE
\define@key{moodle}{template}{\long\def\moodle@responsetemplate{#1}}%
- \generate@moodle@write@code{responsetemplate}<responsetemplate>{\moodle@responsetemplate}
+ \generate@moodle@write@html@noptag{responsetemplate}<responsetemplate>{\moodle@responsetemplate}
\moodleset{template={}}%
% \end{macrocode}
% \subsubsection{Hint tags}
@@ -1269,7 +2580,7 @@
}%
\moodleset{clearwrong=false}%
-% TO DO: Implement hints
+% TODO: Implement hints
% \end{macrocode}
%
% \subsection{Answer handling}
@@ -1305,21 +2616,6 @@
% \subsubsection{Not yet implemented}
%
% \begin{macrocode}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% TRUE/FALSE QUESTIONS %%%%%%%%%%%%%%%%%
-
-% TODO: implement the \writetruefalsequestion
-% and a front-end.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% DESCRIPTION 'QUESTIONS' %%%%%%%%%%%%%
-
-% TODO: implement the \writedescription and a suitable front-end.
-% Should this be \begin{description}...\end{description},
-% or should \begin{quiz}...\end{quiz} just scoop up all
-% text outside question environments and package it in descriptions?
-
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% CALCULATED %%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1354,63 +2650,177 @@
% \end{Verbatim}
%
% \begin{macrocode}
-\def\moodle@makefrontend#1{%
+
+\def\moodle@makelatextagbox#1{%
+% \ifmoodle@tikzloaded
+% \tikzset{external/export next=false}
+% \tikz[baseline]{\node[draw,minimum height=1.2em,rounded corners,fill=black!20] {\tiny #1};}
+% % Fancy but interferes with the tikzexternalize counter
+% \else
+ \Ovalbox{\tiny #1}
+ %\ovalbox{\tiny #1}
+ %\shadowbox{\tiny #1}
+% \fi
+}%
+
+\def\moodle@makelatextag@qtype#1{%
+ \doublebox{\tiny \textsc{#1}}
+}%
+
+\def\moodle@makelatextag@value#1#2{%
+ \moodle@makelatextagbox{\csname moodle@#1\endcsname~#2}
+}%
+
+\def\moodle@makelatextag@key#1{%
+ \moodle@makelatextagbox{\csname moodle@#1\endcsname}
+}%
+
+\def\moodle@marks#1{point\ifdim#1pt=1pt \else s\fi}
+
+\def\moodle@makefrontend#1#2{%
\NewEnviron{#1}[2][]{%
\bgroup
\setkeys{moodle}{##1,questionname={##2}}%
+ \global\advance\moodle@totalmarks by \csname moodle@default grade\endcsname pt
\expandafter\gatheritems\xa{\BODY}%
\let\moodle@questionheader=\gatheredheader
%First, the LaTeX processing
- \item \textbf{\moodle@questionname}\par
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout
+ \moodle@makelatextag@qtype{#1}
+ \else
+ \moodle@latex@writetags
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{#1}
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@value{penalty}{penalty}
+ \fi
+ #2\par
\noindent
\moodle@questionheader
+ \edef\moodle@generalfeedback{\expandonce\moodle@feedback}
\csname moodle@#1@latexprocessing\endcsname
%Now, writing information to XML
\@moodle@ifgeneratexml{%
\xa\questiontext\xa{\moodle@questionheader}% Save the question text.
+ \csname write#1question\endcsname
\bgroup
\gdef\moodle@answers@xml{}%
\setkeys{moodle}{feedback={}}%
\xa\loopthroughitemswithcommand\xa{\csname save#1answer\endcsname}%
\passvalueaftergroup{\moodle@answers@xml}%
\egroup
- \csname write#1question\endcsname
+ \moodle@writeanswers%
+ \moodle@writetags%
+ \writetomoodle{</question>}%
}{}%
\egroup
}%
}
% \end{macrocode}
%
-% \subsubsection{Essay Question Front-End}
-% The essay question is the only question type whose front end
+% \subsubsection{Description Question Front-End}
+% Description and essay questions are the only question types whose front end
% is not yet created by |\moodle@makefrontend|.
-% This is because of what it must do with its |\item|'s.
+% This is because of what need to be done with their contents.
+%
+% Description blocks can be empty. In this case, nothing is done.
+%
+% \begin{macrocode}
+\AfterEndPreamble{% in case something like \usepackage[french]{babel} is loaded
+ \let\description\relax% remove the meaning of existing \description and \enddescription
+ \let\enddescription\relax
+
+ \NewEnviron{description}[2][]{%
+ \bgroup
+ \setkeys{moodle}{#1,questionname={#2}}%
+ \let\moodle@questiontext=\BODY
+ \trim@spaces@in\moodle@questiontext
+ \ifx\moodle@questiontext\@empty\relax\else%
+ %First, the LaTeX processing.
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout\else
+ \moodle@latex@writetags
+ \par
+ \noindent
+ \fi
+ \moodle@makelatextag@qtype{description}\par
+ \noindent
+ \moodle@questiontext\par
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax\else
+ \fbox{\parbox{\linewidth}{\emph{\moodle@feedback}}}%
+ \fi
+ \fi
+ %Now, writing information to memory.
+ \@moodle@ifgeneratexml{%
+ \writetomoodle{<question type="description">}%
+ \moodle@writecommondata
+ \moodle@writetags%
+ \writetomoodle{</question>}%
+ }{}%
+ \fi
+ \egroup
+ }%
+}%
+% \end{macrocode}
+%
+% \subsubsection{Essay Question Front-End}
+% The front end is not yet created by |\moodle@makefrontend| because of
+% what must must be done with the |\item|'s.
%
% \begin{macrocode}
\def\moodle@essay@latexprocessing{%
% Moodle cannot automatically grade an essay,
% but if the user puts \item's in, we can list them in an itemize as notes.
+ \par\noindent \emph{Notes for grader:}
\ifnum\c@numgathereditems>0\relax
- \par\noindent Notes: (not included in XML)
\begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
\loopthroughitemswithcommand{\moodle@print@essay@answer}%
\end{itemize}%
\fi
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
}
\NewEnviron{essay}[2][]{%
\bgroup
\setkeys{moodle}{#1,questionname={#2}}%
+ \global\advance\moodle@totalmarks by \csname moodle@default grade\endcsname pt
+ \moodle@checkresponsefieldlines
\expandafter\gatheritems\expandafter{\BODY}%
\let\moodle@questionheader=\gatheredheader
%First, the LaTeX processing.
- \item \textbf{\moodle@questionname}\par
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout
+ \moodle@makelatextag@qtype{essay}
+ \else
+ \moodle@latex@writetags
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{essay}
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@value{penalty}{penalty}
+ \moodle@makelatextag@key{responseformat}
+ \fi
+ \par
\noindent
\moodle@questionheader
- \csname moodle@essay@latexprocessing\endcsname
+ \long\def\@lempty{}%
+ \ifx\moodle@responsetemplate\@lempty\else
+ \par\noindent \emph{Template:}
+ \par\fbox{\parbox{\linewidth}{\moodle@responsetemplate}}\par
+ \fi
+ \edef\moodle@generalfeedback{\expandonce\moodle@feedback}
+ \ifmoodle@handout\else
+ \csname moodle@essay@latexprocessing\endcsname
+ \fi
%Now, writing information to memory.
\@moodle@ifgeneratexml{%
\xa\questiontext\xa{\moodle@questionheader}% Save the question text.
+ \writeessayquestion
\bgroup
\gdef\moodle@answers@xml{}%
%
@@ -1430,12 +2840,40 @@
%
\passvalueaftergroup{\moodle@answers@xml}%
\egroup
- \writeessayquestion
+ \moodle@writeanswers% The 'answers' XML really contains the grader info.
+ \moodle@writeresponsetemplate%
+ \moodle@writetags%
+ \writetomoodle{</question>}%
}{}%
\egroup
}%
-%%%% TO DO
+\def\moodle@checkresponsefieldlines{%
+ \newcount\a\a=\number\csname moodle@response field lines\endcsname
+ \newcount\b\b=5%
+ \ifnum\the\a>40% if the value was more than 40
+ \a=40%
+ \fi
+ \ifnum\the\a<5% if the value was less than 5
+ \a=5%
+ \fi
+ \divide\a by\b% integer division by 5
+ \multiply\a by\b% multiply by 5
+ \ifnum\a=\csname moodle@response field lines\endcsname% equality holds if we had 5, 10, 15, 20, 25, 30, or 40
+ \else
+ \ifnum\csname moodle@response field lines\endcsname>5%
+ \ifnum\csname moodle@response field lines\endcsname<40%
+ \advance\a by\b% approximate with the next multiple of 5
+ \fi
+ \fi
+ \PackageWarning{moodle}{"response field lines" admits only multiples of 5 between 5 and 40
+ (You tried to set \csname moodle@response field lines\endcsname). The value
+ \the\a\space will be used.}%
+ \setkeys{moodle}{response field lines=\the\a}%
+ \fi
+}%
+
+%%%% TODO
%%%% To make essay work will be tough.
%%%% Every line from \ifnum\c@numgathereditems=0\relax through its \else and \fi,
%%%% with the exception of
@@ -1477,17 +2915,15 @@
\moodle@writeresponsefieldlines%
\moodle@writeattachmentsallowed%
\moodle@writeattachmentsrequired%
- \moodle@writeanswers% The 'answers' XML really contains the grader info.
- \moodle@writeresponsetemplate%
- \writetomoodle{</question>}%
}%
-\def\moodle@print@essay@answer#1{%
+\long\def\moodle@print@essay@answer#1{%
\item #1%
}%
-\def\moodle@savegraderinfo#1{%
+\long\def\moodle@savegraderinfo#1{%
+ %\def\ds{#1}\show\ds
\bgroup
\moodle@savegraderinfo@int#1\moodle@answer@rdelim
\passvalueaftergroup{\moodle@answers@xml}%
@@ -1497,8 +2933,9 @@
\setkeys{moodle}{fraction=0,#1}%
\moodle@savegraderinfo@int@int%
}%
-\def\moodle@savegraderinfo@int@int#1\moodle@answer@rdelim{%
- \xa\converttohtmlmacro\xa\moodle@answertext@html\xa{#1}%
+\long\def\moodle@savegraderinfo@int@int#1\moodle@answer@rdelim{%
+ \def\moodle@answertext{#1}
+ \xa\converttohtmlmacro\xa\moodle@answertext@html\xa{\moodle@answertext}%
%\trim@spaces@in\moodle@answertext
\ifnum\c@numgathereditems>1\relax
\addto@xml[6]{\moodle@answers@xml}{<li>\moodle@answertext@html</li>}%
@@ -1512,17 +2949,21 @@
%
% \begin{macrocode}
\def\blank{\rule{1in}{0.5pt}}%
-% TO DO: Make an optional argument for width? This wouldn't affect Moodle,
+% TODO: Make an optional argument for width? This wouldn't affect Moodle,
% only the appearance in the PDF. It doesn't seem worth it.
-% \NewEnviron{shortanswer}[2][]{%
+%\NewEnviron{shortanswer}[2][]{%
% \bgroup
% \setkeys{moodle}{#1,questionname={#2}}%
% \expandafter\gatheritems\xa{\BODY}%
% \let\moodle@questionheader=\gatheredheader
% %First, the LaTeX processing.
-% \bigskip\par\noindent
-% \fbox{\textbf{\moodle@questionname}}\par
+% \item \textbf{\moodle@questionname}
+% \csname ifmoodle@case sensitive\endcsname
+% \framebox{\tiny Case-Sensitive}\relax
+% \fi
+% \framebox{\tiny\csname moodle@default grade\endcsname~points}
+% \framebox{\tiny\csname moodle@penalty\endcsname~penalty}\par
% \noindent
% \moodle@questionheader
% \csname moodle@shortanswer@latexprocessing\endcsname
@@ -1532,7 +2973,8 @@
% \bgroup
% \gdef\moodle@answers@xml{}%
% \setkeys{moodle}{feedback={}}%
-% \xa\loopthroughitemswithcommand\xa{\csname saveshortansweranswer\endcsname}%
+% \xa\loopthroughitemswithcommand\xa{\csname
+% saveshortansweranswer\endcsname}%
% \passvalueaftergroup{\moodle@answers@xml}%
% \egroup
% \csname writeshortanswerquestion\endcsname
@@ -1540,16 +2982,33 @@
% \egroup
% }%
-\moodle@makefrontend{shortanswer}%
+\moodle@makefrontend{shortanswer}{\moodle@makelatextag@shortanswer}%
% LATEX PROCESSING
-\def\moodle@shortanswer@latexprocessing{%
- \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
- \loopthroughitemswithcommand{\moodle@print@shortanswer@answer}%
- \end{itemize}%
+
+\def\moodle@makelatextag@shortanswer{%
+ \csname ifmoodle@case sensitive\endcsname
+ \moodle@makelatextagbox{Case-Sensitive}\relax
+ \else
+ \moodle@makelatextagbox{Case-Insensitive}\relax
+ \fi
}
+\ifmoodle@handout
+ \let\moodle@shortanswer@latexprocessing\relax
+\else
+ \def\moodle@shortanswer@latexprocessing{%
+ \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
+ \loopthroughitemswithcommand{\moodle@print@shortanswer@answer}%
+ \end{itemize}%
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ }
+\fi
+
\def\moodle@print@shortanswer@answer#1{%
+ \let\moodle@feedback=\@empty
\moodle@print@shortanswer@answer@int#1\@rdelim
}%
\newcommand\moodle@print@shortanswer@answer@int[1][]{%
@@ -1558,9 +3017,13 @@
}%
\def\moodle@print@shortanswer@answer@int@int#1\@rdelim{%
\ifx\moodle@fraction\@hundred
- \item #1\quad$\checkmark$%
+ \item #1$~\checkmark$%
\else
- \item #1\quad (\moodle@fraction\%)%
+ \moodle@checkfraction
+ \item #1$~(\moodle@fraction\%)$%
+ \fi
+ \ifx\moodle@feedback\@empty\relax\else
+ \hfill \emph{$\rightarrow$ \moodle@feedback}
\fi
}%
@@ -1577,10 +3040,15 @@
}%
\def\saveshortansweranswer@int@int#1\moodle@answer@rdelim{%
\def\moodle@answertext{#1}%
+ \trim@spaces@in\moodle@answertext
+ \moodle@checkfraction
\addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="plain_text">}%
- \addto@xml[4]{\moodle@answers@xml}{ <text>\moodle@answertext</text>}%
+ \xa\converttohtmlmacro\xa\moodle@answertext@html\xa{\moodle@answertext}%
+ \addto@xml[4]{\moodle@answers@xml}{ <text>\moodle@answertext@html</text>}%
\ifx\moodle@feedback\@empty\relax\else
- \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback</p>]]></text></feedback>}%
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
\fi
\addto@xml[2]{\moodle@answers@xml}{</answer>}%
}%
@@ -1590,40 +3058,63 @@
\writetomoodle{<question type="shortanswer">}%
\moodle@writecommondata%
\moodle@writeusecase%
- \moodle@writeanswers%
- \writetomoodle{</question>}%
}%
% \end{macrocode}
%
% \subsubsection{Numerical Question Front-End}
%
% \begin{macrocode}
-\moodle@makefrontend{numerical}%
+\moodle@makefrontend{numerical}{\moodle@makelatextag@numerical}%
% LATEX PROCESSING
-\def\moodle@numerical@latexprocessing{%
- \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
- \loopthroughitemswithcommand{\moodle@print@numerical@answer}%
- \end{itemize}%
+
+\def\moodle@makelatextag@numerical{}
+
+\AtEndPreamble{
+ \@ifpackageloaded{siunitx}{\def\moodle@printnum{\num[omit-uncertainty,copy-decimal-marker]}}{\let\moodle@printnum\trim@spaces}%
}
+\ifmoodle@handout
+ \let\moodle@numerical@latexprocessing\relax
+\else
+ \def\moodle@numerical@latexprocessing{%
+ \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
+ \loopthroughitemswithcommand{\moodle@print@numerical@answer}%
+ \end{itemize}%
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ }
+\fi
+
\def\moodle@print@numerical@answer#1{%
- \moodle@print@numerical@answer@int#1\@rdelim
+ \let\moodle@feedback=\@empty
+ \bgroup
+ \moodle@print@numerical@answer@int#1\@rdelim
+ \egroup
}%
\newcommand\moodle@print@numerical@answer@int[1][]{%
\setkeys{moodle}{#1}%
\moodle@print@numerical@answer@int@int%
}%
\def\moodle@print@numerical@answer@int@int#1\@rdelim{%
- \ifdim0pt=\moodle@tolerance pt\relax
- \def\moodle@numericalprint@tolerance{}%
+ \xdef\test@i{\trim@spaces{#1}}%
+ \ifx\test@i\@star
+ \item \test@i
\else
- \edef\moodle@numericalprint@tolerance{\noexpand\pm\moodle@tolerance}%
+ \item \moodle@printnum{#1}%
+ \ifnum\z@=\moodle@tolerance\else
+ $\,\pm\,$\moodle@printnum{\moodle@tolerance}%
+ \fi
\fi
\ifx\moodle@fraction\@hundred
- \item $#1\moodle@numericalprint@tolerance\quad\checkmark$%
+ $~\checkmark$%
\else
- \item $#1\moodle@numericalprint@tolerance$\quad (\moodle@fraction\%)%
+ \moodle@checkfraction
+ $~(\moodle@fraction\%)$%
+ \fi
+ \ifx\moodle@feedback\@empty\relax\else
+ \hfill \emph{$\rightarrow$ \moodle@feedback}%
\fi
}%
@@ -1640,11 +3131,17 @@
}%
\def\savenumericalanswer@int@int#1\moodle@answer@rdelim{%
\def\moodle@answertext{#1}%
+ \trim@spaces@in\moodle@answertext
+ \moodle@checkfraction
\addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="plain_text">}%
\addto@xml[4]{\moodle@answers@xml}{ <text>\moodle@answertext</text>}%
- \addto@xml[4]{\moodle@answers@xml}{ <tolerance>\moodle@tolerance</tolerance>}%
+ \ifx\moodle@answertext\@star\else
+ \addto@xml[4]{\moodle@answers@xml}{ <tolerance>\moodle@tolerance</tolerance>}%
+ \fi
\ifx\moodle@feedback\@empty\relax\else
- \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback</p>]]></text></feedback>}%
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
\fi
\addto@xml[2]{\moodle@answers@xml}{</answer>}%
}%
@@ -1654,8 +3151,6 @@
\gdef\writenumericalquestion{%
\writetomoodle{<question type="numerical">}%
\moodle@writecommondata%
- \moodle@writeanswers%
- \writetomoodle{</question>}%
}%
% \end{macrocode}
%
@@ -1670,96 +3165,263 @@
% \item 11
% \end{multi}%
-\moodle@makefrontend{multi}
+\moodle@makefrontend{multi}{\moodle@makelatextag@multi}%
% LATEX PROCESSING
+
+\def\moodle@makelatextag@multi{%
+ \ifmoodle@allornothing
+ \ifx\endmulti\endclozemulti
+ \PackageError{moodle}{Unsupported option "allornothing" for a multichoice subquestion}
+ {Please set "allornothing=false"}%
+ \else
+ \moodle@makelatextagbox{All-or-nothing}%
+ \fi
+ \else
+ \ifmoodle@multiple
+ \moodle@makelatextagbox{Multiple}%
+ \else
+ \moodle@makelatextagbox{Single}%
+ \fi
+ \fi
+ \ifmoodle@handout\else
+ \ifmoodle@shuffle
+ \moodle@makelatextagbox{Shuffle}\relax%
+ \fi
+ \fi
+}
+
\def\moodle@multi@latexprocessing{%
- \moodle@countcorrectanswers
- \begin{enumerate}\moodle@obeynumberingstyle
- %\renewcommand{\theenumi}{\alph{enumi}}%
- \setlength\itemsep{0pt}\setlength\parskip{0pt}%
- \loopthroughitemswithcommand{\moodle@print@multichoice@answer}%
- \end{enumerate}%
+ \ifmoodle@allornothing
+ \moodle@singletrue
+ \fi
+ \moodle@countcorrectanswers%
+ \ifmoodle@handout\NewList{answerlist}\fi
+ \begin{enumerate}\moodle@obeynumberingstyle%
+ %\renewcommand{\theenumi}{\alph{enumi}}%
+ \setlength\itemsep{0pt}\setlength\parskip{0pt}%
+ \loopthroughitemswithcommand{\moodle@print@multichoice@answer}%
+ \ifmoodle@handout
+ \ifmoodle@shuffle
+ \let\moodle@multi@loop=\ForEachRandomItem
+ \else
+ \let\moodle@multi@loop=\ForEachFirstItem
+ \fi
+ \moodle@multi@loop{answerlist}{Answer}{\Answer}%
+ \fi
+ \end{enumerate}%
+ \ifmoodle@handout\else
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ \fi
}
- \def\moodle@print@multichoice@answer#1{%
- \moodle@print@multichoice@answer@int#1\@rdelim
+ \long\def\moodle@print@multichoice@answer#1{%
+ \let\moodle@feedback=\@empty%
+ \moodle@print@multichoice@answer@int#1 \@rdelim%
}%
\newcommand\moodle@print@multichoice@answer@int[1][]{%
- \setkeys{moodle}{fraction=0,#1}%
- \moodle@print@multichoice@answer@int@int
+ \let\moodle@fraction\@empty%
+ \setkeys{moodle}{#1}%
+ \moodle@print@multichoice@answer@int@int%
}%
- \def\moodle@print@multichoice@answer@int@int#1#2\@rdelim{%
+ \long\def\moodle@print@multichoice@answer@int@int#1#2\@rdelim{%
\def\test@i{#1}%
- \ifmoodle@single
- \ifx\test@i\@star
- \item #2$~\checkmark$%
+ \def\test@ii{#2}%
+ \def\moodle@answertext{\item }%
+ \ifx\test@i\@star%
+ \g@addto@macro\moodle@answertext{#2}%
+ \ifmoodle@single%
+ \setkeys{moodle}{fraction=100}%
\else
- \item #1#2%
+ \setkeys{moodle}{fraction=\moodle@autopoints}%
\fi
\else
- \ifx\test@i\@star
- \item #2%
- \setkeys{moodle}{fraction=\moodle@autopoints}%
- \else
- \item #1#2%
+ \g@addto@macro\moodle@answertext{#1#2}%
+ \fi
+ \trim@spaces@in\moodle@answertext%
+ \trim@spaces@in\moodle@answertext%
+ \ifmoodle@handout\else
+ \ifmoodle@single%
+ \ifx\moodle@fraction\@empty\relax%
+ \setkeys{moodle}{fraction=0}%
+ \fi
+ \moodle@checkfraction
+ \ifx\moodle@fraction\@hundred%
+ \trim@spaces@in\moodle@answertext%
+ \g@addto@macro\moodle@answertext{$~\checkmark$}%
+ \else
+ \ifdim0pt=\moodle@fraction pt\relax\else%
+ \g@addto@macro\moodle@answertext{$~(\moodle@fraction\%)$}%
+ \fi
+ \fi
+ \else% multiple
+ \ifx\moodle@fraction\@empty\relax%
+ \setkeys{moodle}{fraction=\moodle@autosanctions}%
+ \fi
+ \moodle@checkfraction
+ \g@addto@macro\moodle@answertext{$~(\moodle@fraction\%)$}%
+ \fi
+ \fi
+ \ifmoodle@handout
+ \def\temp{\InsertLastItem{answerlist}}%
+ \xa\temp\xa{\moodle@answertext}%
+ \else
+ \ifx\moodle@feedback\@empty\relax\else%
+ \g@addto@macro\moodle@answertext{\hfill \emph{$\rightarrow$ \moodle@feedback}}%
\fi
- $~(\moodle@fraction\%)$
+ \moodle@answertext
\fi
}%
-% COMMON UTILITY: COUNTING CORRECT ANSWERS
- \newcounter{moodle@numcorrectanswers}%
+% COMMON UTILITY: COUNTING CORRECT ANSWERS (AND A BIT MORE...)
+ \newcounter{moodle@numcorrectanswers}% count the stars
+ \newcounter{moodle@numincorrectanswers}% count the items without fraction key indicated
\newlength{\moodle@pointspercorrect}%
+ \newlength{\moodle@pointsperincorrect}%
+ \newlength{\moodle@sumofpositivefractions}% sums user-set positive fractions
+ \newlength{\moodle@sumofnegativefractions}% sums user-set negative fractions
\def\moodle@countcorrectanswers{%
\setcounter{moodle@numcorrectanswers}{0}%
+ \setcounter{moodle@numincorrectanswers}{0}%
\global\setlength{\moodle@pointspercorrect}{100pt}%
+ \global\setlength{\moodle@pointsperincorrect}{-100pt}%
+ \global\setlength{\moodle@sumofpositivefractions}{0pt}%
+ \global\setlength{\moodle@sumofnegativefractions}{0pt}%
\loopthroughitemswithcommand{\moodle@countcorrectanswers@a}%
- \ifnum0=\c@moodle@numcorrectanswers\relax
- \PackageError{moodle}{No correct answers given for multiple choice question.}{Please mark at least one answer correct.}%
- \gdef\moodle@autopoints{0}%
+ \global\advance\moodle@pointspercorrect by-\moodle@sumofpositivefractions\relax%
+ \def\ds{\strip@pt\moodle@sumofpositivefractions}%
+ \ifnum0=\c@moodle@numcorrectanswers\relax%
+ % autopoints will never be used but we check if the sum of positive fractions is 100%
+ \ifdim\moodle@pointspercorrect<-\moodle@fractiontol pt\relax%
+ \PackageWarning{moodle}{Positive fractions sum up to more than 100 (here: \ds)}%
+ \else
+ \ifdim\moodle@pointspercorrect>\moodle@fractiontol pt\relax%
+ \PackageError{moodle}{Positive fractions sum up to less than 100 (here: \ds)}%
+ \fi
+ \fi
\else
- \global\divide\moodle@pointspercorrect by \c@moodle@numcorrectanswers\relax
- \edef\moodle@autopoints{\strip@pt\moodle@pointspercorrect}%
+ \ifdim0pt<\moodle@pointspercorrect\relax\else%
+ % we have starred items so the sum of user-set positive fractions must be less than 100%
+ % otherwise, starred items would lead to penalties
+ \PackageError{moodle}{Positive fractions sum up to 100 or more (here: \ds):
+ there is no positive points left to be given to starred items.}%
+ \fi
+ \global\divide\moodle@pointspercorrect by \c@moodle@numcorrectanswers\relax%
\fi
+ \gdef\moodle@autopoints{\strip@pt\moodle@pointspercorrect}%
+ \global\advance\moodle@pointsperincorrect by-\moodle@sumofnegativefractions\relax%
+ \def\ds{\strip@pt\moodle@sumofnegativefractions}%
+ \ifnum0=\c@moodle@numincorrectanswers\relax%
+ % autosanctions will never be used and
+ % we do not care about the sum of negative fractions (might be less than -100)
+ \else
+ \ifdim0pt<\moodle@pointsperincorrect\relax%
+ % we have items without fractions set: to prevent auto sanctions from becoming bonuses,
+ % such items are neutralized.
+ \PackageWarning{moodle}{Negative fractions sum up to -100 or less (here: \ds):
+ items with no fraction key set will be considered as neutral.}%
+ \global\setlength{\moodle@pointsperincorrect}{0pt}%
+ \fi
+ \global\divide\moodle@pointsperincorrect by \c@moodle@numincorrectanswers\relax%
+ \fi
+ \gdef\moodle@autosanctions{\strip@pt\moodle@pointsperincorrect}%
}
- \def\moodle@countcorrectanswers@a#1{%
+ \long\def\moodle@countcorrectanswers@a#1{%
%The grouping is to keep key answer-specific key changes local.
\bgroup
\moodle@countcorrectanswers@b#1\moodle@answer@rdelim
\egroup
}%
\newcommand\moodle@countcorrectanswers@b[1][]{%
- \setkeys{moodle}{fraction=0,#1}%
- \moodle@countcorrectanswers@c%
+ %\ifx&#1&%
+ \let\moodle@fraction\@empty%
+ \setkeys{moodle}{#1}%
+ \moodle@countcorrectanswers@c%
+ %\fi
}%
- \def\moodle@countcorrectanswers@c#1#2\moodle@answer@rdelim{%
+ \long\def\moodle@countcorrectanswers@c#1#2\moodle@answer@rdelim{%
\def\test@i{#1}%
\ifx\test@i\@star
\stepcounter{moodle@numcorrectanswers}%
\else
- \global\addtolength{\moodle@pointspercorrect}{-\moodle@fraction pt}%
+ \ifx\moodle@fraction\@empty\relax%
+ \stepcounter{moodle@numincorrectanswers}%
+ \else
+ \ifdim0pt<\moodle@fraction pt\relax%
+ \global\addtolength{\moodle@sumofpositivefractions}{\moodle@fraction pt}%
+ \else
+ \global\addtolength{\moodle@sumofnegativefractions}{\moodle@fraction pt}%
+ \fi
+ \fi
\fi
}%
- \def\moodle@setautopoints#1pt{%
- \gdef\moodle@autopoints{#1}%
+ \newlength{\test@fraction}%
+ \newlength{\test@lower}%
+ \newlength{\test@upper}%
+ \def\moodle@fractionerror{%
+ \def\ds{\moodle@fraction}%
+ \PackageError{moodle}{the current fraction is not a valid value (here: \ds)}%
}
-
-% TODO: What if rounding errors make the percentages not add to 100%? Will Moodle complain?
-% TODO: Verify that negative scores are handled correctly.
+ {\catcode`|=3\relax
+ \gdef\moodle@validfractionlist{0|5|10|11.11111|12.5|14.28571|16.66667|20|25|30|33.33333|40|50|60|66.66667|70|75|80|83.33333|90|100}}%
+ \def\moodle@isfractionnear#1{%
+ \setlength{\test@lower}{#1 pt}%
+ \addtolength{\test@lower}{-\moodle@fractiontol pt}%
+ \setlength{\test@upper}{#1 pt}%
+ \addtolength{\test@upper}{\moodle@fractiontol pt}%
+ \ifdim\test@upper>\test@fraction\relax
+ \ifdim\test@lower<\test@fraction\relax
+ \gdef\test@fractionmatched{#1}%
+ \fi
+ \fi
+ }
+ \def\moodle@checkfraction{%
+ \ifmoodle@allornothing
+ \ifnum\moodle@fraction>0%
+ \setkeys{moodle}{fraction=100}%
+ \fi
+ \ifnum\moodle@fraction<0%
+ \setkeys{moodle}{fraction=0}%
+ \fi
+ \else
+ %\def\test@i{#1}%
+ \setlength{\test@fraction}{\moodle@fraction pt}%
+ % take the absolute value
+ \ifdim0pt>\test@fraction\relax%
+ \setlength{\test@fraction}{-\moodle@fraction pt}%
+ \fi
+ % test if the fraction is an admissible value
+ \let\test@fractionmatched\@empty
+ \forlistloop{\moodle@isfractionnear}{\moodle@validfractionlist}%
+ \ifx\test@fractionmatched\@empty\relax
+ \moodle@fractionerror%
+ \fi
+ \ifdim\moodle@fraction pt<-\moodle@fractiontol pt\relax%
+ \setkeys{moodle}{fraction=-\test@fractionmatched}%
+ \else
+ \setkeys{moodle}{fraction=\test@fractionmatched}%
+ \fi
+ \fi
+ }
% TODO: Put these macros in same order as other sections'.
% SAVING ANSWERS TO MEMORY
-\def\savemultianswer#1{%
+\long\def\savemultianswer#1{%
\bgroup
- \savemultianswer@int#1\moodle@answer@rdelim
+ \savemultianswer@int#1 \moodle@answer@rdelim
\passvalueaftergroup{\moodle@answers@xml}%
\egroup
}%
\newcommand\savemultianswer@int[1][]{%
- \setkeys{moodle}{fraction=0,#1}%
+ \let\moodle@fraction\@empty%
+ \setkeys{moodle}{#1}%
+ \ifmoodle@allornothing
+ \moodle@singletrue
+ \fi
\savemultianswer@int@int%
}%
- \def\savemultianswer@int@int#1#2\moodle@answer@rdelim{%
+ \long\def\savemultianswer@int@int#1#2\moodle@answer@rdelim{%
\def\test@i{#1}%
\ifx\test@i\@star
\ifmoodle@single
@@ -1771,67 +3433,380 @@
\else
\def\moodle@answertext{#1#2}%
\fi
+ \ifx\moodle@fraction\@empty\relax%
+ \ifmoodle@single\relax
+ \setkeys{moodle}{fraction=0}%
+ \else% multiple
+ \setkeys{moodle}{fraction=\moodle@autosanctions}%
+ \fi
+ \fi
\trim@spaces@in\moodle@answertext
+ \trim@spaces@in\moodle@answertext
+ \moodle@checkfraction
\addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="html">}%
\xa\converttohtmlmacro\xa\moodle@answertext@html\xa{\moodle@answertext}%
\addto@xml[4]{\moodle@answers@xml}{ <text><![CDATA[<p>\moodle@answertext@html</p>]]></text>}%
\ifx\moodle@feedback\@empty\relax\else
- \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback</p>]]></text></feedback>}%
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
\fi
\addto@xml[2]{\moodle@answers@xml}{</answer>}%
}%
% WRITING QUESTION TO XML FILE
\gdef\writemultiquestion{%
- \writetomoodle{<question type="multichoice">}%
+
+ \writetomoodle{<question type="multichoice\ifmoodle@allornothing set\fi">}%
\moodle@writecommondata%
- \moodle@writesingle%
+ \ifmoodle@allornothing\else
+ \moodle@writesingle%
+ \fi
\moodle@writeshuffle%
\moodle@writeanswernumbering%
- \moodle@writeanswers%
- \writetomoodle{</question>}%
}%
% \end{macrocode}
%
-% \subsubsection{Matching Question Front-End}
+% \subsubsection{True/False Question Front-End}
%
% \begin{macrocode}
-\let\answer=\hfill
+% True/False has structure
+% \begin{truefalse}[options]{name}%
+% This is a matching question.
+% \item[feedback={feedback for student answering incorrectly "true"}] % first item is for true
+% \item* this is an other way of specifying answer-specific feedback
+% \end{truefalse}%
-\moodle@makefrontend{matching}
+%\moodle@makefrontend{truefalse}{}% We dont use the generic frontend because truefalse has no tunable penalty
+
+\NewEnviron{truefalse}[2][]{%
+ \bgroup
+ \setkeys{moodle}{#1,questionname={#2}}%
+ \global\advance\moodle@totalmarks by \csname moodle@default grade\endcsname pt
+ \expandafter\gatheritems\xa{\BODY}%
+ \let\moodle@questionheader=\gatheredheader
+ %First, the LaTeX processing
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout
+ \moodle@makelatextag@qtype{truefalse}
+ \else
+ \moodle@latex@writetags
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{truefalse}
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \fi
+ \par
+ \noindent
+ \moodle@questionheader
+ \edef\moodle@generalfeedback{\expandonce\moodle@feedback}
+ \moodle@truefalse@latexprocessing
+ %Now, writing information to XML
+ \@moodle@ifgeneratexml{%
+ \setkeys{moodle}{penalty=1}%
+ \xa\questiontext\xa{\moodle@questionheader}% Save the question text.
+ \csname writetruefalsequestion\endcsname
+ \bgroup
+ \gdef\moodle@answers@xml{}%
+ \setkeys{moodle}{feedback={}}%
+ \xa\loopthroughitemswithcommand\xa{\xa\savetruefalseanswer}%
+ \ifnum\c@numgathereditems=1\relax%
+ \setcounter{currentitemnumber}{2}%
+ \savetruefalseanswer{}
+ \fi
+ \passvalueaftergroup{\moodle@answers@xml}%
+ \egroup
+ \moodle@writeanswers%
+ \moodle@writetags%
+ \writetomoodle{</question>}%
+ }{}%
+ \egroup
+ }%
% LATEX PROCESSING
-\def\moodle@matching@latexprocessing{%
+
+\def\moodle@truefalse@latexprocessing{%
+% \ifnum\c@numgathereditems>2\relax%
+% \PackageError{moodle}{Expecting at max two answers with truefalse type}
+% \fi
+ \setcounter{moodle@numcorrectanswers}{0}%
+ \begin{itemize} \setlength\itemsep{0pt}\setlength\parskip{0pt}%
+ \loopthroughitemswithcommand{\moodle@print@truefalse@answer}%
+ \ifnum\c@currentitemnumber=2%
+ \item \textbf{False}%
+ \fi
+ \end{itemize}
+ \ifmoodle@handout\else
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ \fi
+ \ifnum\c@moodle@numcorrectanswers=0\relax%
+ \PackageError{moodle}{No answer is explicitly marked as correct (*). Be sure one answer leads to points.}%
+ \fi
+ \ifnum\c@moodle@numcorrectanswers>1\relax%
+ \PackageError{moodle}{Two answers are explicitly marked as correct (*). Be sure only one answer leads to points.}%
+ \fi
+}
+
+ \def\moodle@print@truefalse@answer#1{% here # is all what comes after "\item", that is "[options]* text"
+ \let\moodle@feedback=\@empty
+ \moodle@print@truefalse@answer@int#1\@rdelim % add an end delimiter:
+ }%
+ \newcommand\moodle@print@truefalse@answer@int[1][]{% with the optional argument, catch options and set them as keys
+ \setkeys{moodle}{#1}%
+ \moodle@print@truefalse@answer@int@int% applies to the rest: "* text\@rdelim"
+ }%
+ \def\moodle@print@truefalse@answer@int@int#1\@rdelim{% this is just to treat appart the case where nothing follows
+ \def\test@i{#1}
+ \trim@spaces@in\test@i
+ \ifx\test@i\@empty\relax
+ \moodle@print@truefalse@answer@int@int@empty
+ \else
+ \moodle@print@truefalse@answer@int@int@int#1\@rdelim
+ \fi
+ }%
+ \def\moodle@print@truefalse@answer@int@int@empty{%
+ \ifnum\c@currentitemnumber=1%
+ \def\moodle@answertext{True}%
+ \fi
+ \ifnum\c@currentitemnumber=2%
+ \def\moodle@answertext{False}%
+ \fi
+ \item \textbf{\moodle@answertext}%
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax\else
+ ~\hfill \emph{$\rightarrow$ \moodle@feedback}%
+ \fi
+ \fi
+ }%
+ \def\moodle@print@truefalse@answer@int@int@int#1#2\@rdelim{%
+ \ifnum\c@currentitemnumber=1%
+ \def\moodle@answertext{True}%
+ \fi
+ \ifnum\c@currentitemnumber=2%
+ \def\moodle@answertext{False}%
+ \fi
+ \item \textbf{\moodle@answertext}%
+ \ifnum\c@currentitemnumber<3%
+ \def\test@i{#1}%
+ %\trim@spaces@in\test@i
+ \ifx\test@i\@star
+ \ifmoodle@handout\else
+ ~$\checkmark$%
+ \fi
+ \stepcounter{moodle@numcorrectanswers}%
+ \else
+ ~%
+ \fi
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax
+ \def\test@ii{#2}%
+ \trim@spaces@in\test@ii
+ \ifx\test@ii\@empty\relax\else
+ \ifx\test@i\@star%
+ \hfill \emph{$\rightarrow$ #2}%
+ \else%
+ \hfill \emph{$\rightarrow$ #1#2}%
+ \fi
+ \fi
+ \else
+ \hfill \emph{$\rightarrow$ \moodle@feedback}%
+ \fi
+ \fi
+ \fi
+ }%
+
+% SAVING ANSWERS TO MEMORY
+\def\savetruefalseanswer#1{%
\bgroup
- \let\answer=\hfill
- \begin{enumerate}\renewcommand{\theenumi}{\alph{enumi}}\setlength\itemsep{0pt}\setlength\parskip{0pt}%
- \loopthroughitemswithcommand{\moodle@print@matching@answer}%
- \end{enumerate}%
+ \savetruefalseanswer@int#1\moodle@answer@rdelim
+ \passvalueaftergroup{\moodle@answers@xml}%
\egroup
-}
- \long\def\moodle@print@matching@answer#1{%
- \moodle@print@matching@answer@int#1\@rdelim
+}%
+ \newcommand\savetruefalseanswer@int[1][]{%
+ \setkeys{moodle}{#1}%
+ \savetruefalseanswer@int@int%
+ }%
+ \def\savetruefalseanswer@int@int#1\moodle@answer@rdelim{%
+ \def\test@i{#1}
+ \trim@spaces@in\test@i
+ \ifx\test@i\@empty\relax
+ \savetruefalseanswer@int@int@empty
+ \else
+ \savetruefalseanswer@int@int@int#1\moodle@answer@rdelim
+ \fi
}%
- \newcommand\moodle@print@matching@answer@int[1][]{%
- \moodle@print@matching@answer@int@int\relax
+ \def\savetruefalseanswer@int@int@empty{%
+ \setkeys{moodle}{fraction=0}%
+ \ifnum\c@currentitemnumber=1%
+ \def\moodle@answertext{true}%
+ \fi
+ \ifnum\c@currentitemnumber=2%
+ \def\moodle@answertext{false}%
+ \fi
+ \ifnum\c@currentitemnumber<3%
+ \addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="plain_text">}%
+ \addto@xml[4]{\moodle@answers@xml}{ <text>\moodle@answertext</text>}%
+ \ifx\moodle@feedback\@empty\relax\else
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
+ \fi
+ \addto@xml[2]{\moodle@answers@xml}{</answer>}%
+ \fi
}%
- \long\def\moodle@print@matching@answer@int@int#1\answer#2\@rdelim{%
- \item #1\hfill #2%
+ \def\savetruefalseanswer@int@int@int#1#2\moodle@answer@rdelim{%
+ \def\test@i{#1}%
+ \ifx\test@i\@star
+ \setkeys{moodle}{fraction=100}%
+ \else
+ \setkeys{moodle}{fraction=0}%
+ \fi
+ \ifnum\c@currentitemnumber=1%
+ \def\moodle@answertext{true}%
+ \fi
+ \ifnum\c@currentitemnumber=2%
+ \def\moodle@answertext{false}%
+ \fi
+ \ifnum\c@currentitemnumber<3%
+ \addto@xml[2]{\moodle@answers@xml}{<answer fraction="\moodle@fraction" format="plain_text">}%
+ \addto@xml[4]{\moodle@answers@xml}{ <text>\moodle@answertext</text>}%
+ \ifx\moodle@feedback\@empty\relax
+ \def\test@ii{#2}
+ \ifx\test@ii\@empty\relax\else
+ \ifx\test@i\@star
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{#2}%
+ \else%
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{#1#2}%
+ \fi%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
+ \fi
+ \else
+ \trim@spaces@in\moodle@feedback
+ \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+ \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
+ \fi
+ \addto@xml[2]{\moodle@answers@xml}{</answer>}%
+ \fi
}%
+% WRITING QUESTION TO XML FILE
+\gdef\writetruefalsequestion{%
+ \writetomoodle{<question type="truefalse">}%
+ \moodle@writecommondata%
+}%
+% \end{macrocode}
+%
+% \subsubsection{Matching Question Front-End}
+%
+% \begin{macrocode}
+%\let\answer=\hfill
+
+\moodle@makefrontend{matching}{\moodle@makelatextag@matching}%
+
+% LATEX PROCESSING
+
+\def\moodle@makelatextag@matching{%
+ \ifmoodle@handout\else
+ \ifmoodle@draganddrop
+ \moodle@makelatextagbox{Drag and drop}\relax%
+ \fi
+ \ifmoodle@shuffle
+ \moodle@makelatextagbox{Shuffle}\relax%
+ \fi
+ \fi
+}
+
+\def\moodle@matching@latexprocessing{%
+ \bgroup
+ %\let\answer=\hfill
+ \par%\noindent
+ \ifmoodle@handout
+ \NewList{questionlist}
+ \NewList{answerlist}
+ \fi
+ \def\matching@table@text{}%
+ % \ifnum\c@numgathereditems>2\relax%
+% \PackageError{moodle}{Expecting at max two answers with truefalse type}
+% \fi
+ \setcounter{moodle@numcorrectanswers}{0}% Here this counter is for "questions" (items on the left column)
+ \loopthroughitemswithcommand{\moodle@print@matching@answer}%
+ \ifnum\c@numgathereditems<3%
+ \PackageWarning{moodle}{Moodle expects at least three "answers" with matching type}%
+ \fi
+ \ifnum\c@moodle@numcorrectanswers<2%
+ \PackageWarning{moodle}{Moodle expects at least two "questions" with the matching type}%
+ \fi
+ \ifmoodle@handout
+ \ifmoodle@shuffle
+ \let\moodle@matching@loop=\ForEachRandomItem
+ \else
+ \let\moodle@matching@loop=\ForEachFirstItem
+ \fi
+ \moodle@matching@loop{questionlist}{Question}{
+ \xdef\test@i{\Question}%
+ \ExtractRandomItem{answerlist}{Answer}%
+ \ifx\test@i\@empty
+ \xdef\matching@table@text{\expandonce\matching@table@text & & $\bullet$~\expandonce\Answer\\}%
+ \else
+ \xdef\matching@table@text{\expandonce\matching@table@text\expandonce\Question~$\bullet$ & & $\bullet$~\expandonce\Answer\\}%
+ \fi
+ }%
+ \fi
+ \begin{tabular}{@{}>{\raggedleft}p{.45\linewidth}p{.1\linewidth}p{.45\linewidth}@{}}%
+ \matching@table@text
+ \end{tabular}%
+ \par
+ \ifmoodle@handout\else
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ \fi
+ \egroup
+}
+
+\long\def\moodle@print@matching@answer#1{%
+ \moodle@print@matching@answer@int#1 \@rdelim
+}%
+\newcommand\moodle@print@matching@answer@int[1][]{%
+ \moodle@print@matching@answer@int@int
+}%
+\long\def\moodle@print@matching@answer@int@int#1\answer#2\@rdelim{%
+ %\typeout{\string#1 \answer \string#2}%
+ \def\test@i{#1}%
+ \trim@spaces@in\test@i
+ \ifmoodle@handout
+ \ifx\test@i\@empty
+ \InsertLastItem{questionlist}{\@empty}%
+ \else
+ \InsertLastItem{questionlist}{#1}%
+ \fi
+ \InsertLastItem{answerlist}{#2}%
+ \else
+ \ifx\test@i\@empty
+ \g@addto@macro\matching@table@text{&&$\bullet$~#2\\}%
+ \else
+ \stepcounter{moodle@numcorrectanswers}%
+ \xa\g@addto@macro\xa\matching@table@text\xa{\test@i~$\bullet$&\leavevmode\cleaders\hb@xt@.44em{\hss$\cdot$\hss}\hfill\kern\z@&$\bullet$~#2\\}%
+ \fi
+ \fi
+}%
+
% SAVING ANSWERS TO MEMORY
\long\def\savematchinganswer#1{%
\bgroup
- \savematchinganswer@int#1\moodle@answer@rdelim%
+ \savematchinganswer@int#1 \moodle@answer@rdelim%
\passvalueaftergroup{\moodle@answers@xml}%
\egroup
}%
\newcommand\savematchinganswer@int[1][]{%
\setkeys{moodle}{#1}%
- \xa\savematchinganswer@int@int\space%
+ \savematchinganswer@int@int%\space
}%
\long\def\savematchinganswer@int@int#1\answer#2\moodle@answer@rdelim{%
+ %\typeout{\string#1 \answer \string#2}%
% Note that #1 may simply be \relax.
\def\moodle@subquestiontext{#1}%
\def\moodle@subanswertext{#2}%
@@ -1854,9 +3829,12 @@
% \show\moodle@subanswertext
\addto@xml[4]{\moodle@answers@xml}{ <answer><text>\moodle@subanswertext</text></answer>}%
\fi
- \ifx\moodle@feedback\@empty\relax\else
- \addto@xml[4]{\moodle@answers@xml}{ <feedback format="html"><text><![CDATA[<p>\moodle@feedback</p>]]></text></feedback>}%
- \fi
+% \ifx\moodle@feedback\@empty\relax\else
+% \trim@spaces@in\moodle@feedback
+% \xa\converttohtmlmacro\xa\moodle@feedback@html\xa{\moodle@feedback}%
+% \addto@xml[4]{\moodle@answers@xml}{ <feedback
+%format="html"><text><![CDATA[<p>\moodle@feedback@html</p>]]></text></feedback>}%
+% \fi
\addto@xml[2]{\moodle@answers@xml}{</subquestion>}%
}%
@@ -1868,12 +3846,9 @@
\writetomoodle{<question type="matching">}%
\fi
\moodle@writecommondata%
- \moodle@writesingle%
+% \moodle@writesingle% %irrelevant for the matching type
\moodle@writeshuffle%
- \moodle@writeanswernumbering%
- \moodle@writeanswers%
- \writetomoodle{</question>}%
-% \gdef\moodle@answ
+% \moodle@writeanswernumbering% %irrelevant for the matching type
}%
% \end{macrocode}
%
@@ -1896,6 +3871,8 @@
% LATEX PROCESSING
% SAVING ANSWERS TO MEMORY
+\newif\ifmoodle@clozemode
+\moodle@clozemodefalse
\NewEnviron{cloze}[2][]{%
\bgroup
\setkeys{moodle}{default grade=1}%
@@ -1903,9 +3880,26 @@
% A cloze question won't have any \item's in it, so we just use \BODY.
\moodle@enableclozeenvironments
%First, the LaTeX processing.
- \item \textbf{\moodle@questionname}\par
+ \item \textbf{\moodle@questionname}
+ \ifmoodle@handout
+ \moodle@makelatextag@qtype{cloze}
+ \else
+ \moodle@latex@writetags
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{cloze}
+ \moodle@makelatextag@value{penalty}{penalty}
+ \fi
+ \par
\noindent
\BODY
+ \edef\moodle@generalfeedback{\expandonce\moodle@feedback}
+ %\csname moodle@cloze@latexprocessing\endcsname
+ \ifmoodle@handout\else
+ \ifx\moodle@generalfeedback\@empty\relax\else%
+ \fbox{\parbox{\linewidth}{\emph{\moodle@generalfeedback}}}%
+ \fi
+ \fi
%Now, writing information to memory.
\@moodle@ifgeneratexml{%
\xa\questiontext\xa{\BODY}% Save the question text as HTML.
@@ -1926,7 +3920,12 @@
% WRITING QUESTION TO XML FILE
\gdef\writeclozequestion{%
\writetomoodle{<question type="cloze">}%
- \moodle@writecommondata%
+ \moodle@writequestionname%
+ \moodle@writequestiontext%
+ \moodle@writegeneralfeedback%
+ \moodle@writepenalty%
+ \moodle@writehidden%
+ \moodle@writetags%
\writetomoodle{</question>}%
}%
% \end{macrocode}
@@ -1934,7 +3933,6 @@
% \subsubsection{Cloze Multiple Choice Questions}
%
% \begin{macrocode}
-% TODO: Guard against [single=false] option
\NewEnviron{clozemulti}[1][]{%
\bgroup
@@ -1947,40 +3945,89 @@
\def\moodle@clozemulti@output{}%
\xa\g@addto@macro\xa\moodle@clozemulti@output\xa{\moodle@questionheader}%
\def\clozemulti@coding{}%
- \edef\clozemulti@coding{\otherlbrace\csname moodle@default grade\endcsname:}%
+ \edef\clozemulti@coding{\csname moodle@default grade\endcsname:}%
+ \ifmoodle@multiple
+ \PackageWarning{moodle}{Cloze Multiresponse only supported by Moodle 3.5+}
+ \g@addto@macro{\clozemulti@coding}{MULTIRESPONSE}%
+ \else
+ \g@addto@macro{\clozemulti@coding}{MULTICHOICE}%
+ \fi
\ifcase\moodle@multi@mode\relax
- % Case 0: dropdown box style
- \g@addto@macro{\clozemulti@coding}{MULTICHOICE:}%
+ % Case 0: dropdown box style
+ \ifmoodle@shuffle
+ \g@addto@macro{\clozemulti@coding}{_}%
+ \fi
\or
% Case 1: vertical style
- \g@addto@macro{\clozemulti@coding}{MULTICHOICE_V:}%
+ \ifmoodle@multiple
+ \PackageError{moodle}{Vertical mode (dropdown box) incompatible with multiresponse.}
+ \else
+ \g@addto@macro{\clozemulti@coding}{_V}%
+ \fi
\else
% Case 2: horizontal radio buttons
- \g@addto@macro{\clozemulti@coding}{MULTICHOICE_H:}%
+ \g@addto@macro{\clozemulti@coding}{_H}%
+ \fi
+ \ifmoodle@shuffle
+ \PackageWarning{moodle}{Cloze Multi Shuffling only supported by Moodle 3.0+}
+ \g@addto@macro{\clozemulti@coding}{S:}%
+ \else
+ \g@addto@macro{\clozemulti@coding}{:}%
\fi
\bgroup
\setkeys{moodle}{feedback={}}%
\loopthroughitemswithcommand{\saveclozemultichoiceanswer}%
\egroup
- \xa\g@addto@macro\xa\clozemulti@coding\xa{\otherrbrace}%
- \xa\g@addto@macro\xa\moodle@clozemulti@output\xa{\clozemulti@coding}%
+ %\xa\g@addto@macro\xa\clozemulti@coding\xa{\clozerbrace}%
+ \xa\g@addto@macro\xa\moodle@clozemulti@output\xa{\xa\clozelbrace\clozemulti@coding\clozerbrace}%
+ %\show\moodle@clozemulti@output
\xa\gdef\xa\htmlize@afteraction@hook\xa{\moodle@clozemulti@output}%
\def\endclozemulti@code{\htmlize@patchendenvironment}%
\else
%LaTeX version
+ \global\advance\moodle@totalmarks by \csname moodle@default grade\endcsname pt
\moodle@questionheader% %Any introductory text just continues to be typeset.
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{multi}
+ \ifmoodle@handout\else
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@multi
+ \fi
\def\cloze@multichoice@table@text{}%
+ \ifmoodle@handout\NewList{answerlist}\fi
+ %\let\moodle@feedback=\@empty
\loopthroughitemswithcommand{\moodle@print@clozemultichoice@answer}%
+ \ifmoodle@handout
+ \ifmoodle@shuffle
+ \let\moodle@clozemult@loop=\ForEachRandomItem
+ \else
+ \let\moodle@clozemult@loop=\ForEachFirstItem
+ \fi
+ \moodle@clozemult@loop{answerlist}{Answer}{
+ \xdef\cloze@multichoice@table@text{\expandonce\cloze@multichoice@table@text\expandonce\Answer}%
+ }%
+ \fi
\ifcase\moodle@multi@mode\relax
%Case 0: dropdown box style
- \begin{tabular}[t]{|l|}\firsthline% (\firsthline is from the array package.)
+ \par\noindent
+ \ifmoodle@handout
+ \begin{tabular}[t]{|p{.45\linewidth}|}
+ \else
+ \begin{tabular}[t]{|p{.45\linewidth}|p{.45\linewidth}|}
+% answer & feedback \\\hline\hline
+ \fi
+ \firsthline% (\firsthline is from the array package.)
\cloze@multichoice@table@text%
\end{tabular}%
+ \par%
\or
%Case 1: vertical style
+ \par\noindent
\begin{itemize}\setlength\itemsep{0pt}\setlength\parskip{0pt}%
\cloze@multichoice@table@text%
\end{itemize}%
+ \par%
\else
%Case 2: horizontal radio buttons
\par{\cloze@multichoice@table@text}\par%
@@ -1993,48 +4040,83 @@
}[\endclozemulti@code]%
-\def\moodle@print@clozemultichoice@answer#1{%
- \moodle@print@clozemultichoice@answer@int#1\@rdelim%
+\long\def\moodle@print@clozemultichoice@answer#1{%
+ \let\moodle@feedback=\@empty
+ \moodle@print@clozemultichoice@answer@int#1 \@rdelim%
}%
\newcommand\moodle@print@clozemultichoice@answer@int[1][]{%
+ \setkeys{moodle}{fraction=0,#1}%
\moodle@print@clozemultichoice@answer@int@int%
}%
-\def\moodle@print@clozemultichoice@answer@int@int#1#2\@rdelim{%
+\long\def\moodle@print@clozemultichoice@answer@int@int#1#2\@rdelim{%
+ \def\moodle@answertext{}%
% Case 0: "(answer) \\ \hline"
% Case 1: "\item (answer)"
% Case 2: "$\bullet~$(answer)\hfill"
\ifcase\moodle@multi@mode\relax
\relax% Case 0
\or
- \g@addto@macro\cloze@multichoice@table@text{\item}% Case 1
+ \g@addto@macro\moodle@answertext{\item}% Case 1
\else
- \g@addto@macro\cloze@multichoice@table@text{$\bullet~$}% Case 2
+ \g@addto@macro\moodle@answertext{$\bullet~$}% Case 2
\fi
\def\test@i{#1}%
\ifx\test@i\@star
- \g@addto@macro\cloze@multichoice@table@text{#2$~\checkmark$}%
+ \setkeys{moodle}{fraction=100}%
+ \g@addto@macro\moodle@answertext{#2}%
\else
- \g@addto@macro\cloze@multichoice@table@text{#1#2}%
+ \g@addto@macro\moodle@answertext{#1#2}%
+ \fi
+ \trim@spaces@in\moodle@answertext
+ \trim@spaces@in\moodle@answertext
+ \ifmoodle@handout\else
+ \ifx\moodle@fraction\@hundred
+ \g@addto@macro\moodle@answertext{$~\checkmark$}%
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else
+ \xdef\moodle@answertext{\expandonce\moodle@answertext$~(\moodle@fraction\%)$}%
+ \fi
+ \fi
\fi
\ifcase\moodle@multi@mode\relax
- \g@addto@macro{\cloze@multichoice@table@text}{\\ \hline}% Case 0
- \or
- \relax% Case 1
+ % Case 0
+ \ifmoodle@handout\else
+ \xdef\moodle@answertext{\expandonce\moodle@answertext &\expandonce\emph{\expandonce\moodle@feedback}}%
+ \fi
+ \g@addto@macro\moodle@answertext{\\\hline}
+ \or % Case 1
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax\else
+ \xdef\moodle@answertext{\expandonce\moodle@answertext \hfill \expandonce\emph{$\rightarrow$ \expandonce\moodle@feedback}}%
+ \fi
+ \fi
+ \else % otherwise
+ \ifmoodle@handout\else
+ \ifx\moodle@feedback\@empty\relax\else
+ \xdef\moodle@answertext{\expandonce\moodle@answertext\,\expandonce\emph{$\rightarrow$ \expandonce\moodle@feedback}}%
+ \fi
+ \fi
+ \g@addto@macro\moodle@answertext{\hfill}% Case 2
+ \fi
+ \ifmoodle@handout
+ \def\temp{\InsertLastItem{answerlist}}%
+ \xa\temp\xa{\moodle@answertext}%
\else
- \g@addto@macro{\cloze@multichoice@table@text}{\hfill}% Case 2
+ \xdef\cloze@multichoice@table@text{\expandonce\cloze@multichoice@table@text\expandonce\moodle@answertext}%
\fi
}%
-\def\saveclozemultichoiceanswer#1{%
+\long\def\saveclozemultichoiceanswer#1{%
\bgroup
- \saveclozemultichoiceanswer@int#1\moodle@answer@rdelim
+ \saveclozemultichoiceanswer@int#1 \moodle@answer@rdelim
\egroup
}%
\newcommand\saveclozemultichoiceanswer@int[1][]{%
\setkeys{moodle}{fraction=0,#1}%
\saveclozemultichoiceanswer@int@int%
}%
-\def\saveclozemultichoiceanswer@int@int#1#2\moodle@answer@rdelim{%
+\long\def\saveclozemultichoiceanswer@int@int#1#2\moodle@answer@rdelim{%
\def\test@i{#1}%
\ifgatherbeginningofloop\else
\xa\gdef\xa\clozemulti@coding\xa{\clozemulti@coding\clozetilde}% separator between answers
@@ -2046,17 +4128,18 @@
\def\moodle@answertext{#1#2}%
\fi
\trim@spaces@in\moodle@answertext
+ \trim@spaces@in\moodle@answertext
\ifx\moodle@fraction\@hundred
\g@addto@macro\clozemulti@coding{=}%
- \fi
- \ifnum0<\moodle@fraction\relax
- \ifnum\moodle@fraction<100\relax
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else
\xdef\clozemulti@coding{\expandonce\clozemulti@coding\otherpercent\moodle@fraction\otherpercent}%
\fi
\fi
\xdef\clozemulti@coding{\expandonce\clozemulti@coding\expandonce\moodle@answertext}%
\ifx\moodle@feedback\@empty\else
- \xdef\clozemulti@coding{\expandonce\clozemulti@coding\otherbackslash\otherhash\moodle@feedback}%
+ \xdef\clozemulti@coding{\expandonce\clozemulti@coding\otherbackslash\otherhash\expandonce\moodle@feedback}%
\fi
}%
% \end{macrocode}
@@ -2075,23 +4158,36 @@
\def\moodle@clozenumerical@output{}%
\xa\g@addto@macro\xa\moodle@clozenumerical@output\xa{\moodle@questionheader}%
\def\clozenumerical@coding{}%
- \edef\clozenumerical@coding{\otherlbrace\csname moodle@default grade\endcsname:NUMERICAL:}%
+ \edef\clozenumerical@coding{\csname moodle@default grade\endcsname:NUMERICAL:}%
\bgroup
\setkeys{moodle}{feedback={}}%
\loopthroughitemswithcommand{\saveclozenumericalanswer}%
\egroup
- \xa\g@addto@macro\xa\clozenumerical@coding\xa{\otherrbrace}%
- \xa\g@addto@macro\xa\moodle@clozenumerical@output\xa{\clozenumerical@coding}%
+ %\xa\g@addto@macro\xa\clozenumerical@coding\xa{\otherrbrace}%
+ \xa\g@addto@macro\xa\moodle@clozenumerical@output\xa{\xa\clozelbrace\clozenumerical@coding\clozerbrace}%
\xa\gdef\xa\htmlize@afteraction@hook\xa{\moodle@clozenumerical@output}%
\def\endclozenumerical@code{\htmlize@patchendenvironment}%
\else
%LaTeX version
+ \global\advance\moodle@totalmarks by \csname moodle@default grade\endcsname pt
\moodle@questionheader% %Any introductory text just continues to be typeset.
- \def\cloze@numerical@table@text{}%
- \loopthroughitemswithcommand{\moodle@print@clozenumerical@answer}%
- \begin{tabular}[t]{|ll|}\firsthline
- \cloze@numerical@table@text\hline%
- \end{tabular}%
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{numerical}
+ \ifmoodle@handout\else
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@numerical
+ \par
+ \noindent
+ \def\cloze@numerical@table@text{}%
+ \loopthroughitemswithcommand{\moodle@print@clozenumerical@answer}%
+ \begin{tabular}[t]{|p{.45\linewidth}|p{.45\linewidth}|}
+ \firsthline% (\firsthline is from the array package.)
+% answer & feedback \\\hline\hline
+ \cloze@numerical@table@text%
+ \end{tabular}%
+ \par%
+ \fi
\def\endclozenumerical@code{\relax}%
\fi
\passvalueaftergroup\endclozenumerical@code%
@@ -2100,6 +4196,7 @@
}[\endclozenumerical@code]%
\def\moodle@print@clozenumerical@answer#1{%
+ \let\moodle@feedback=\@empty
\bgroup
\moodle@print@clozenumerical@answer@int#1\@rdelim
\egroup
@@ -2110,17 +4207,23 @@
}%
\def\moodle@print@clozenumerical@answer@int@int#1\@rdelim{%
\ifx\moodle@fraction\@hundred
- \def\moodle@clozenumericalprint@fraction{$\checkmark$}%
+ \def\moodle@clozenumericalprint@fraction{$~\checkmark$}%
\else
- \edef\moodle@clozenumericalprint@fraction{(\moodle@fraction\%)}%
+ \moodle@checkfraction
+ \edef\moodle@clozenumericalprint@fraction{$(~\moodle@fraction\%)$}%
\fi
- \ifdim0pt=\moodle@tolerance pt\relax
+ \ifnum\z@=\moodle@tolerance
\def\moodle@clozenumericalprint@tolerance{}%
\else
- \edef\moodle@clozenumericalprint@tolerance{\noexpand\pm\moodle@tolerance}%
+ \edef\moodle@clozenumericalprint@tolerance{$\,\pm\,$\moodle@printnum{\moodle@tolerance}}%
+ \fi
+ \xdef\test@i{\trim@spaces{#1}}%
+ \ifx\test@i\@star
+ \xdef\moodle@clozenumericalprint@line{#1~\moodle@clozenumericalprint@fraction & \expandonce\emph{\expandonce\moodle@feedback}}%
+ \else
+ \xdef\moodle@clozenumericalprint@line{\moodle@printnum{#1}\moodle@clozenumericalprint@tolerance~\moodle@clozenumericalprint@fraction & \expandonce\emph{\expandonce\moodle@feedback}}%
\fi
- \xdef\moodle@clozenumericalprint@line{$#1\moodle@clozenumericalprint@tolerance$ & \moodle@clozenumericalprint@fraction}%
- \xa\g@addto@macro\xa\cloze@numerical@table@text\xa{\moodle@clozenumericalprint@line \\}%
+ \xa\g@addto@macro\xa\cloze@numerical@table@text\xa{\moodle@clozenumericalprint@line \\\hline}%
}%
@@ -2142,15 +4245,20 @@
\trim@spaces@in\moodle@answertext
\ifx\moodle@fraction\@hundred
\g@addto@macro\clozenumerical@coding{=}%
- \fi
- \ifnum0<\moodle@fraction\relax
- \ifnum\moodle@fraction<100\relax
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else
\xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\otherpercent\moodle@fraction\otherpercent}%
\fi
\fi
- \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\moodle@answertext:\moodle@tolerance}%
+ \ifx\moodle@answertext\@star
+ \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\moodle@answertext}%
+ \else
+ \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\moodle@answertext:\moodle@tolerance}%
+ \fi
\ifx\moodle@feedback\@empty\else
- \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\otherbackslash\otherhash\moodle@feedback}%
+ %\trim@spaces@in\moodle@feedback
+ \xdef\clozenumerical@coding{\expandonce\clozenumerical@coding\otherbackslash\otherhash\expandonce\moodle@feedback}%
\fi
}%
% \end{macrocode}
@@ -2177,29 +4285,39 @@
\xa\g@addto@macro\xa\moodle@clozeshortanswer@output\xa{\moodle@questionheader}%
\def\clozeshortanswer@coding{}%
\ifnum\count0=1\relax
- \edef\clozeshortanswer@coding{\otherlbrace\csname moodle@default grade\endcsname:SHORTANSWER_C:}%
+ \edef\clozeshortanswer@coding{\csname moodle@default grade\endcsname:SHORTANSWER_C:}%
\else
- \edef\clozeshortanswer@coding{\otherlbrace\csname moodle@default grade\endcsname:SHORTANSWER:}%
+ \edef\clozeshortanswer@coding{\csname moodle@default grade\endcsname:SHORTANSWER:}%
\fi
\bgroup
\setkeys{moodle}{feedback={}}%
\loopthroughitemswithcommand{\saveclozeshortansweranswer}%
\egroup
- \xa\g@addto@macro\xa\clozeshortanswer@coding\xa{\otherrbrace}%
- \xa\g@addto@macro\xa\moodle@clozeshortanswer@output\xa{\clozeshortanswer@coding}%
+ %\xa\g@addto@macro\xa\clozeshortanswer@coding\xa{\otherrbrace}%
+ \xa\g@addto@macro\xa\moodle@clozeshortanswer@output\xa{\xa\clozelbrace\clozeshortanswer@coding\clozerbrace}%
\xa\gdef\xa\htmlize@afteraction@hook\xa{\moodle@clozeshortanswer@output}%
\def\endclozeshortanswer@code{\htmlize@patchendenvironment}%
\else
%LaTeX version
+ \global\advance\moodle@totalmarks by \csname moodle@default grade\endcsname pt
\moodle@questionheader% %Any introductory text just continues to be typeset.
- \def\cloze@shortanswer@table@text{}%
- \loopthroughitemswithcommand{\moodle@print@clozeshortanswer@answer}%
- \ifnum\count0=1\relax
- \marginpar{\tiny\mbox{(Case-Sensitive)}}%
+ \par
+ \noindent
+ \moodle@makelatextag@qtype{shortanswer}
+ \ifmoodle@handout\else
+ \moodle@makelatextag@value{default grade}{\moodle@marks{\csname moodle@default grade\endcsname}}
+ \moodle@makelatextag@shortanswer
+ \par
+ \noindent
+ \def\cloze@shortanswer@table@text{}%
+ \loopthroughitemswithcommand{\moodle@print@clozeshortanswer@answer}%
+ \begin{tabular}[t]{|p{.45\linewidth}|p{.45\linewidth}|}
+ \firsthline% (\firsthline is from the array package.)
+% answer & feedback \\\hline\hline
+ \cloze@shortanswer@table@text%
+ \end{tabular}%
+ \par%
\fi
- \begin{tabular}[t]{|ll|}\firsthline
- \cloze@shortanswer@table@text\hline%
- \end{tabular}%
\def\endclozeshortanswer@code{\relax}%
\fi
\passvalueaftergroup\endclozeshortanswer@code%
@@ -2208,6 +4326,7 @@
}[\endclozeshortanswer@code]%
\def\moodle@print@clozeshortanswer@answer#1{%
+ \let\moodle@feedback=\@empty
\bgroup
\moodle@print@clozeshortanswer@answer@int#1\@rdelim
\egroup
@@ -2218,12 +4337,13 @@
}%
\def\moodle@print@clozeshortanswer@answer@int@int#1\@rdelim{%
\ifx\moodle@fraction\@hundred
- \def\moodle@clozeshortanswerprint@fraction{$\checkmark$}%
+ \def\moodle@clozeshortanswerprint@fraction{$~\checkmark$}%
\else
- \edef\moodle@clozeshortanswerprint@fraction{(\moodle@fraction\%)}%
+ \moodle@checkfraction
+ \edef\moodle@clozeshortanswerprint@fraction{$~(\moodle@fraction\%)$}%
\fi
- \xdef\moodle@clozeshortanswerprint@line{#1 & \moodle@clozeshortanswerprint@fraction}%
- \xa\g@addto@macro\xa\cloze@shortanswer@table@text\xa{\moodle@clozeshortanswerprint@line \\}%
+ \xdef\moodle@clozeshortanswerprint@line{#1~\moodle@clozeshortanswerprint@fraction & \expandonce\emph{\expandonce\moodle@feedback}}%
+ \xa\g@addto@macro\xa\cloze@shortanswer@table@text\xa{\moodle@clozeshortanswerprint@line \\\hline}%
}%
@@ -2245,15 +4365,15 @@
\trim@spaces@in\moodle@answertext
\ifx\moodle@fraction\@hundred
\g@addto@macro\clozeshortanswer@coding{=}%
- \fi
- \ifnum0<\moodle@fraction\relax
- \ifnum\moodle@fraction<100\relax
+ \else
+ \moodle@checkfraction
+ \ifdim0pt=\moodle@fraction pt\relax\else
\xdef\clozeshortanswer@coding{\expandonce\clozeshortanswer@coding\otherpercent\moodle@fraction\otherpercent}%
\fi
\fi
\xdef\clozeshortanswer@coding{\expandonce\clozeshortanswer@coding\moodle@answertext}%
\ifx\moodle@feedback\@empty\else
- \xdef\clozeshortanswer@coding{\expandonce\clozeshortanswer@coding\otherbackslash\otherhash\moodle@feedback}%
+ \xdef\clozeshortanswer@coding{\expandonce\clozeshortanswer@coding\otherbackslash\otherhash\expandonce\moodle@feedback}%
\fi
}%
% \end{macrocode}
@@ -2270,15 +4390,20 @@
\catcode`\&=12\gdef\otherampersand{&}%
\catcode`\^=12\gdef\othercaret{^}%
\catcode`\$=12\gdef\otherdollar{$}%
- \catcode`\%=12\gdef\otherpercent{%}}%
+ \catcode`\%=12\gdef\otherpercent{%}
+ \catcode`\%=12\gdef\otherlbracket{[}
+ \catcode`\%=12\gdef\otherrbracket{]}}%
{\catcode`\ =12\gdef\otherspace{ }}%
-{\tt\catcode`\|=0\catcode`\\=12\relax|gdef|otherbackslash{\}}%
+{\ttfamily\catcode`\|=0\catcode`\\=12\relax|gdef|otherbackslash{\}}%
{\catcode`\[=1\catcode`\]=2\catcode`\{=12\catcode`\}=12%
- \gdef\otherlbrace[{]\gdef\otherrbrace[}]]
-
+ \gdef\otherlbrace[{]\gdef\otherrbrace[}]\gdef\clozelbrace[{]\gdef\clozerbrace[}]]%
\edef\@otherlbrace{\otherlbrace}%
\edef\@otherrbrace{\otherrbrace}%
+\edef\@otherlbracket{\otherlbracket}%
+\edef\@otherrbracket{\otherrbracket}%
+\edef\@clozelbrace{\clozelbrace}%
+\edef\@clozerbrace{\clozerbrace}%
\edef\@otherdollar{\otherdollar}%
\edef\@otherbackslash{\otherbackslash}%
\edef\@othertilde{\othertilde}%
@@ -2381,9 +4506,16 @@
% \end{macrocode}
%
% \subsection{Level-Tracking}
+%
+% \subsubsection{TeX groups}
+% While parsing, we'll need to keep track of how deeply nested in \TeX\ groups we are.
+% \begin{macrocode}
+\newcount\grouplevel
+% \end{macrocode}
+%
+% \subsubsection{Math mode}
% While parsing, we'll need to keep track of whether
-% we are in math mode (and how many levels deep the math mode might be nested),
-% and also how deeply nested in \TeX\ groups we are.
+% we are in math mode (and how many levels deep the math mode might be nested).
% \begin{macrocode}
\newcount\moodle@mathmodedepth
\moodle@mathmodedepth=0\relax
@@ -2393,12 +4525,15 @@
\else
#2%
\fi
-}
-
-\newcount\grouplevel
+}%
+% \end{macrocode}
+%
+% \subsubsection{Nested Lists}
+% While parsing, we'll need to keep track levels of nested list.
+% \begin{macrocode}
+\newcount\moodle@listdepth
+\moodle@listdepth=0\relax
-\newif\ifhtmlizer@active
-\htmlizer@activefalse
% \end{macrocode}
%
% \subsection{Separation}
@@ -2436,6 +4571,8 @@
% \subsection{Main Code: the HTMLizer}
%
% \begin{macrocode}
+\newif\ifhtmlizer@active
+\htmlizer@activefalse
\newif\ifhtmlize@actioncs
\newif\ifhtmlize@expandcs
\newif\ifhtmlize@passcs
@@ -2456,13 +4593,14 @@
\advance\grouplevel by 1\relax
\bgroup
\ultradetokenize@to@macro\htmlize@texttoscan{#1}%
- \xa\htmlize@recursive@i\htmlize@texttoscan\@htmlize@stop\@htmlize@stop\@htmlize@stop\htmlize@rdelim@i
+ \xa\htmlize@recursive@i\htmlize@texttoscan\@htmlize@stop\@htmlize@stop\@htmlize@stop\htmlize@rdelim@i%
\egroup
\advance\grouplevel by -1\relax
}%
\def\@lt{<}%
\def\@gt{>}%
+\def\@dash{-}%
\long\def\htmlize@recursive@i#1#2#3\htmlize@rdelim@i{%
% #1#2#3 is a sequence of tokens. All should be categories 11 (letter) or 12 (other).
@@ -2502,7 +4640,13 @@
\gdef\htmlize@scrap{\converttohtml@int}%
\xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\htmlize@blockinbraces}}%
\g@addto@macro\htmlize@scrap{\g@addto@macro\htmlize@output}%
- \xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\otherrbrace}}%
+ \ifmoodle@clozemode
+ \xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\otherbackslash\otherrbrace}}%
+% \moodle@ifmathmode{\xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\otherbackslash}}}%
+% {}%
+ \else
+ \xa\g@addto@macro\xa\htmlize@scrap\xa{\xa{\otherrbrace}}%
+ \fi
\g@addto@macro\htmlize@scrap{\htmlize@recursive@i}%
\xa\g@addto@macro\xa\htmlize@scrap\xa{\htmlize@remainder@detokenized\@htmlize@stop\@htmlize@stop\@htmlize@stop\htmlize@rdelim@i}%
% Okay, that's done. It's stored in a global macro.
@@ -2519,10 +4663,10 @@
\htmlize@displaymathshift@replace#1#2#3\htmlize@rdelim@iii%
\else
% Single dollar sign, so we're entering inline math mode.
- % We grab everything between $$...$$, sanitize it, and add it verbatim to
+ % We grab everything between $...$, sanitize it, and add it verbatim to
% our output.
\htmlize@inlinemathshift@replace#1#2#3\htmlize@rdelim@iii%
- \fi
+ \fi% \ifx\test@ii\@otherdollar
% Now we resume work.
% The \htmlize@xxxxxxmathshift@replace macro stored the remaining text in \htmlize@remaining@text.
% Note that since we never detokenized and retokenized #1#2#3,
@@ -2647,9 +4791,9 @@
%\edef\ds{Must pass on \xa\string\@htmlize@cs}\show\ds
\g@addto@macro\htmlize@output{#1}%
\def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \fi
- \fi
- \fi
+ \fi% \ifhtmlize@expandcs
+ \fi% \ifhtmlize@actioncs
+ \fi% \ifx\@htmlize@cs\@@begin@cs
\else%
\ifx\test@i\@othertilde%
% The ~ becomes non-breaking space &nbsp;
@@ -2664,17 +4808,18 @@
\else
\g@addto@macro\htmlize@output{\otherampersand lsquo;}%
\def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \fi
+ \fi% \ifx\test@ii\@lsinglequote%
\else
\ifx\test@i\@rsinglequote%
- \ifx\test@ii\@rsinglequote%
- %Double right quote
- \g@addto@macro\htmlize@output{\otherampersand rdquo;}%
+ \ifx\test@ii\@rsinglequote% Double right quote
+ %AAedit 2021.01.06: in math mode, you should write 2 single right quotes, for second derivatives
+ \moodle@ifmathmode{\g@addto@macro\htmlize@output{\otherampersand rsquo;\otherampersand rsquo;}}%
+ {\g@addto@macro\htmlize@output{\otherampersand rdquo;}}%
\def\htmlize@next@i{\htmlize@recursive@i#3\htmlize@rdelim@i}%
- \else
+ \else% Single right quote
\g@addto@macro\htmlize@output{\otherampersand rsquo;}%
\def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \fi
+ \fi% \ifx\test@ii\@rsinglequote%
\else
\ifx\test@i\@doublequote
\g@addto@macro\htmlize@output{\otherampersand rdquo;}%
@@ -2689,20 +4834,31 @@
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\otherampersand gt;}}%
{\g@addto@macro\htmlize@output{>}}%
\def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \else
- % Default case: write first token to output, call self on remaining tokens.
- \g@addto@macro\htmlize@output{#1}%
- \def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
+ \else
+ \ifx\test@i\@dash
+ \ifx\test@ii\@dash% en-dash (--)
+ \moodle@ifmathmode{\g@addto@macro\htmlize@output{--}}%
+ {\g@addto@macro\htmlize@output{\otherampersand ndash;}}%
+ \def\htmlize@next@i{\htmlize@recursive@i#3\htmlize@rdelim@i}%
+ \else
+ \g@addto@macro\htmlize@output{-}%
+ \def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
+ \fi
+ \else
+ % Default case: write first token to output, call self on remaining tokens.
+ \g@addto@macro\htmlize@output{#1}%
+ \def\htmlize@next@i{\htmlize@recursive@i#2#3\htmlize@rdelim@i}%
+ \fi% \ifx\test@i\@dash
+ \fi% \ifx\test@i\@gt
+ \fi% \ifx\test@i\@lt
+ \fi% \ifx\test@i\@doublequote
+ \fi% \ifx\test@i\@rsinglequote%
+ \fi% \ifx\test@i\@lsinglequote%
+ \fi% \ifx\test@i\@othertilde%
+ \fi% \ifx\test@i\@otherbackslash%
+ \fi% \ifx\test@i\@otherdollar%
+ \fi% \ifx\test@i\@otherlbrace%
+ \fi% \ifx\test@i\@@htmlize@stop
\htmlize@next@i
}%
@@ -2721,16 +4877,38 @@
\edef\inlinemathleftdelim{\otherbackslash(}%
\def\inlinemathrightdelim#1{\advancemathmodecounter{-1}%
\g@addto@macro\htmlize@output{\otherbackslash)}}%
-\edef\displaymathleftdelim{<CENTER>\otherbackslash[}%
+\edef\displaymathleftdelim{\otherbackslash[}%
\def\displaymathrightdelim#1{\advancemathmodecounter{-1}%
- \g@addto@macro\htmlize@output{\otherbackslash]</CENTER>}}%
+ \g@addto@macro\htmlize@output{\otherbackslash]}}%
+\long\def\htmlize@inlinemath@recursive@i#1#2#3\htmlize@rdelim@i{%
+ % inspired by \htmlize@recursive@i
+ \def\test@i{#1}%
+ \ifx\test@i\@@htmlize@stop
+ \let\htmlize@next@i=\relax
+ \else
+ \ifx\test@i\@otherbackslash
+ \g@addto@macro\mathtext{#1#2}%
+ \def\htmlize@next@i{\xa\htmlize@inlinemath@recursive@i#3\htmlize@rdelim@i}%
+ \else
+ \ifx\test@i\@otherdollar
+ \let\htmlize@next@i=\relax
+ \g@addto@macro\aftertext{#2#3}%
+ \else
+ \g@addto@macro\mathtext{#1}%
+ \def\htmlize@next@i{\xa\htmlize@inlinemath@recursive@i#2#3\htmlize@rdelim@i}%
+ \fi
+ \fi
+ \fi
+ \htmlize@next@i
+}
{\catcode`\$=12\relax%
- \gdef\htmlize@inlinemathshift@replace$#1$#2\htmlize@rdelim@iii{%
+ \gdef\htmlize@inlinemathshift@replace#1#2\htmlize@rdelim@iii{%
%\def\ds{inline math shift has '#1' and '#2'}\show\ds
\xa\g@addto@macro\xa\htmlize@output\xa{\inlinemathleftdelim}%
\advancemathmodecounter{1}%
- \def\mathtext{#1}%
- \def\aftertext{#2}%
+ \gdef\mathtext{}%
+ \gdef\aftertext{}%
+ \htmlize@inlinemath@recursive@i#2\htmlize@rdelim@i%
\xdef\htmlize@remaining@text{\expandonce\mathtext%
\otherbackslash inlinemathrightdelim{}%
\expandonce\aftertext}%
@@ -2746,6 +4924,7 @@
\expandonce\aftertext}%
}%
}
+
% \end{macrocode}
%
% \subsection{Engines for Control Sequences}
@@ -2847,6 +5026,25 @@
\xa\g@addto@macro\xa\htmlize@activate@css\xa{\htmlize@scrap}%
\xa\def\csname html@\string#1\endcsname% %And this \def\html@\oldcsname is follows by the remainder of the definition.
}
+\def\html@action@newcommand#1[#2][#3]#4{%
+ %\message{>>> Defining #1[#2][#3]{...} ^^J}
+ \ifmoodle@draftmode
+ \else
+ \xa\html@action@def\csname #1\endcsname{\csname moodle@#1@int\endcsname}%
+ \fi
+ % Note that \htmlize@do@actioncs will 'patch' this by putting
+ % '\xa\htmlize@proceedwiththerest\htmlize@afteraction@hook'
+ % at the end. We want those 3 tokens to occur instead after
+ % the graphics filename.
+ \xa\csdef{moodle@#1@int}##1##2##3{\csname moodle@#1@int@int\endcsname}%
+ % This gobbles up those three spurious tokens,
+ % which we will re-insert after our work is done.
+ \xa\newcommand\csname moodle@#1@int@int\endcsname[#2][#3]{%
+ #4%
+ % Now we re-insert the code to get the HTMLizing going again.
+ \xa\htmlize@proceedwiththerest\htmlize@afteraction@hook
+ }%
+}
% \end{macrocode}
%
% \subsubsection{Engine for expansion control sequences}
@@ -2868,6 +5066,24 @@
}
\let\htmlregister=\htmlize@record@expand
% \end{macrocode}
+% Often users define a list of macros at the end of the preamble.
+% It can be cumbersome to record individually these macros for expansion.
+% By calling |\moodleregisternewcommands| they trigger the automatic
+% expansion of macros defined subsequently using |\newcommand|,
+% |\renewcommand|, |\providecommand| or their starred variants.
+% \begin{macrocode}
+\def\moodleregisternewcommands{%
+ %% INSPIRED FROM
+ %https://tex.stackexchange.com/questions/73271/how-to-redefine-or-patch-the-newcommand-command
+ \newcommand*{\saved@ifdefinable}{}
+ \let\saved@ifdefinable\@ifdefinable
+ \renewcommand{\@ifdefinable}[2]{%
+ \saved@ifdefinable{##1}{##2}%
+ \htmlregister{##1}
+ }%
+ \let\@@ifdefinable\@ifdefinable
+}%
+% \end{macrocode}
% On the other hand, if an alternate version of the macro is
% needed for HTML purposes, you can define its HTML version with
% |\html@def\mymacro...|
@@ -2901,20 +5117,50 @@
\htmlize@record@environment{shortanswer}
\html@newenvironment{center}{\xdef\htmlize@afteraction@hook{<CENTER>\expandonce\BODY</CENTER>}}%
-\html@newenvironment{enumerate}{%
- \xa\gatheritems\xa{\BODY}%
- \gdef\htmlize@afteraction@hook{<OL>}%
- \loopthroughitemswithcommand{\moodle@itemtoLI}%
- \g@addto@macro\htmlize@afteraction@hook{</OL>}%
-}%
-\html@newenvironment{itemize}{%
- \xa\gatheritems\xa{\BODY}%
- \gdef\htmlize@afteraction@hook{<UL>}%
- \loopthroughitemswithcommand{\moodle@itemtoLI}%
- \g@addto@macro\htmlize@afteraction@hook{</UL>}%
+
+\def\moodle@save@getitems@state{%
+ \global\xa\xdef\csname moodle@currentitemnumber@level@\the\moodle@listdepth\xa\endcsname\xa{\thecurrentitemnumber}%
+ \global\xa\xdef\csname moodle@numgathereditems@level@\the\moodle@listdepth\xa\endcsname\xa{\thenumgathereditems}%
+ \moodle@saveitems{\thenumgathereditems}%
+}%
+\def\moodle@restore@getitems@state{%
+ \setcounter{numgathereditems}{\csname moodle@numgathereditems@level@\the\moodle@listdepth\endcsname}%
+ \setcounter{currentitemnumber}{\csname moodle@currentitemnumber@level@\the\moodle@listdepth\endcsname}%
+ \moodle@restoreitems{\thenumgathereditems}%
+}%
+\def\moodle@saveitems#1{%
+ \ifnum#1>0%
+ \global\csletcs{moodle@level@\the\moodle@listdepth @item@#1}{getitems@item@#1}%
+ \xa\moodle@saveitems\xa{\number\numexpr#1-1\expandafter}%
+ \fi
+}%
+\def\moodle@restoreitems#1{%
+ \ifnum#1>0%
+ \global\csletcs{getitems@item@#1}{moodle@level@\the\moodle@listdepth @item@#1}%
+ \global\xa\let\csname moodle@level@\the\moodle@listdepth @item@#1\endcsname=\@undefined
+ \xa\moodle@restoreitems\xa{\number\numexpr#1-1\expandafter}%
+ \fi
}%
+\def\moodle@makelistenv#1#2{%
+ \html@newenvironment{#1}{%
+ \advance\moodle@listdepth by 1\relax
+ \moodle@save@getitems@state%
+ \xa\gatheritems\xa{\BODY}%
+ \gdef\htmlize@afteraction@hook{<#2>}%
+ \loopthroughitemswithcommand{\moodle@itemtoLI}%
+ \g@addto@macro\htmlize@afteraction@hook{</#2>}%
+ \moodle@restore@getitems@state%
+ \advance\moodle@listdepth by -1\relax
+ }%
+}%
+
+\moodle@makelistenv{enumerate}{OL}%
+\moodle@makelistenv{itemize}{UL}%
+
\def\moodle@itemtoLI#1{%
- \g@addto@macro\htmlize@afteraction@hook{<LI>#1</LI>}%
+ \g@addto@macro\htmlize@afteraction@hook{<LI>#1}%
+ \trim@spaces@in\htmlize@afteraction@hook%
+ \g@addto@macro\htmlize@afteraction@hook{</LI>}%
}%
% \end{macrocode}
@@ -2925,13 +5171,18 @@
\def\advancemathmodecounter#1{%
\global\advance\moodle@mathmodedepth by #1\relax
}
+\def\openclozemode{%
+ \global\moodle@clozemodetrue\relax
+}
+\def\endclozemode{%
+ \global\moodle@clozemodefalse\relax
+}
\htmlize@record@action{\advancemathmodecounter}%
-
-
-
-
+\htmlize@record@action{\openclozemode}%
+\htmlize@record@action{\endclozemode}%
\htmlize@record@action{\relax}%
+\html@action@def\%{\g@addto@macro\htmlize@output{\otherpercent}}%
\html@action@def\#{\g@addto@macro\htmlize@output{\otherhash}}%
\html@action@def\&{\g@addto@macro\htmlize@output{\otherampersand}}%
\html@action@def\\{\moodle@ifmathmode{\g@addto@macro\htmlize@output{\otherbackslash\otherbackslash}}%
@@ -2942,15 +5193,32 @@
}%
\html@action@def\}{%
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\otherbackslash\otherrbrace}}%
- {\g@addto@macro\htmlize@output{\otherrbrace}}%
+ {\ifmoodle@clozemode\g@addto@macro\htmlize@output{\otherbackslash}\fi
+ \g@addto@macro\htmlize@output{\otherrbrace}}%
+ }%
+\html@action@def\[{%
+ \advancemathmodecounter{1}
+ \g@addto@macro\htmlize@output{\otherbackslash\otherlbracket}%
+ }%
+\html@action@def\]{%
+ \g@addto@macro\htmlize@output{\otherbackslash\otherrbracket}%
+ \advancemathmodecounter{-1}
+ }%
+\html@action@def\({%
+ \advancemathmodecounter{1}
+ \g@addto@macro\htmlize@output{\otherbackslash(}%
+ }%
+\html@action@def\){%
+ \g@addto@macro\htmlize@output{\otherbackslash)}%
+ \advancemathmodecounter{-1}
}%
\html@action@def\ldots{%
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\string\ldots}}%
- {\g@addto@macro\htmlize@output{...}}%
+ {\g@addto@macro\htmlize@output{\otherampersand hellip\othersemicol}}%
}%
\html@action@def\dots{%
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\string\dots}}%
- {\g@addto@macro\htmlize@output{...}}%
+ {\g@addto@macro\htmlize@output{\otherampersand hellip\othersemicol}}%
}%
\html@action@def\ {%
\moodle@ifmathmode{\g@addto@macro\htmlize@output{\otherbackslash\otherspace}}%
@@ -2959,12 +5227,28 @@
\html@action@def\${%
\g@addto@macro\htmlize@output{\otherdollar}%
}%
-
+\html@action@def\@dquote{%
+ \g@addto@macro\htmlize@output{"}%
+ }%
\html@action@def\clozetilde{%
\xa\g@addto@macro\xa\htmlize@output\xa{\othertilde}%
}%
+\html@action@def\clozelbrace{%
+ \openclozemode
+ \xa\g@addto@macro\xa\htmlize@output\xa{\otherlbrace}%
+ }%
+\html@action@def\clozerbrace{%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\otherrbrace}%
+ \endclozemode
+ }%
+\html@action@def\TeX{%
+ \g@addto@macro\htmlize@output{\otherbackslash(\otherbackslash rm\otherbackslash TeX\otherbackslash)}
+ }%
+\html@action@def\LaTeX{%
+ \g@addto@macro\htmlize@output{\otherbackslash(\otherbackslash rm\otherbackslash LaTeX\otherbackslash)}
+ }%
-
+{\catcode`;=12\relax\gdef\othersemicol{;}}
%Diacritical marks over vowels
{\catcode`|=3\relax
@@ -2974,32 +5258,40 @@
\g@addto@macro\htmlize@activate@css{%
\def#1##1{%
\ifinlist{##1}{\htmlize@vowels}%
- {\g@addto@macro\htmlize@output{\otherampersand##1#2;}}%
+ {\g@addto@macro\htmlize@output{\otherampersand##1#2\othersemicol}}%
{\xa\g@addto@macro\htmlize@output\xa{\string#1##1}}%
}%
}%
}
\htmlize@define@diacritic{\^}{circ}%
\htmlize@define@diacritic{\'}{acute}%
-\htmlize@define@diacritic{\"}{uml}%
\htmlize@define@diacritic{\`}{grave}%
+%Diaeresis/Tréma/Umlaut
+{\catcode`|=3\relax
+ \gdef\htmlize@diaeresis{a|e|i|o|u|y|A|E|I|O|U|Y|}}
+\html@action@def\"#1{%
+ \ifinlist{#1}{\htmlize@diaeresis}%
+ {\g@addto@macro\htmlize@output{\otherampersand#1uml\othersemicol}}%
+ {\xa\g@addto@macro\htmlize@output\xa{\string\"#1}}%
+}%
+
%Hungarian long-umlaut diacritics
\def\@o{o}\def\@O{O}\def\@u{u}\def\@U{U}%
\html@action@def\H#1{%
\bgroup
\def\test@i{#1}%
\ifx\test@i\@O
- \def\toadd{\otherampersand\otherhash337;}%
+ \def\toadd{\otherampersand\otherhash336\othersemicol}%
\else
\ifx\test@i\@o
- \def\toadd{\otherampersand\otherhash337;}%
+ \def\toadd{\otherampersand\otherhash337\othersemicol}%
\else
- \ifx\test@i\U
- \def\toadd{\otherampersand\otherhash368;}%
+ \ifx\test@i\@U
+ \def\toadd{\otherampersand\otherhash368\othersemicol}%
\else
- \ifx\test@i\u
- \def\toadd{\otherampersand\otherhash369;}%
+ \ifx\test@i\@u
+ \def\toadd{\otherampersand\otherhash369\othersemicol}%
\else
\def\toadd{\otherbackslash\otherlbrace#1\otherrbrace}%
\fi
@@ -3010,50 +5302,329 @@
\egroup
}%
+%Cedilla
+\def\@c{c}\def\@C{C}\def\@s{s}\def\@S{S}\def\@t{t}\def\@T{T}%
+\html@action@def\c#1{%
+ \bgroup
+ \def\test@i{#1}%
+ \ifx\test@i\@c
+ \def\toadd{\otherampersand ccedil\othersemicol}%
+ \else
+ \ifx\test@i\@C
+ \def\toadd{\otherampersand Ccedil\othersemicol}%
+ \else
+ \ifx\test@i\@s
+ \def\toadd{\otherampersand\otherhash351\othersemicol}%
+ \else
+ \ifx\test@i\@S
+ \def\toadd{\otherampersand\otherhash350\othersemicol}%
+ \else
+ \ifx\test@i\@t
+ \def\toadd{\otherampersand\otherhash355\othersemicol}%
+ \else
+ \ifx\test@i\@T
+ \def\toadd{\otherampersand\otherhash354\othersemicol}%
+ \else
+ \def\toadd{\otherbackslash\otherlbrace#1\otherrbrace}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \xa\g@addto@macro\xa\htmlize@output\xa{\toadd}%
+ \egroup
+}%
%Tilde over a, n, o
{\catcode`|=3\relax
\gdef\htmlize@tilde{A|N|O|a|n|o|}}
\html@action@def\~#1{%
\ifinlist{#1}{\htmlize@tilde}%
- {\g@addto@macro\htmlize@output{\otherampersand#1tilde;}}%
+ {\g@addto@macro\htmlize@output{\otherampersand#1tilde\othersemicol}}%
{\xa\g@addto@macro\htmlize@output\xa{\string\~#1}}%
- }%
+}%
+
+% breve diacritics
+{\catcode`|=3\relax
+ \gdef\htmlize@breve{A|G|U|a|g|u|}}
+\def\@e{e}\def\@E{E}\def\@i{i}\def\@ii{\i}\def\@I{I}\def\@o{o}\def\@O{O}%
+\html@action@def\u#1{%
+ \ifinlist{#1}{\htmlize@breve}%
+ {\g@addto@macro\htmlize@output{\otherampersand#1breve\othersemicol}}%
+ {
+ \bgroup
+ \def\test@i{#1}%
+ \ifx\test@i\@E
+ \def\toadd{\otherampersand\otherhash276\othersemicol}%
+ \else
+ \ifx\test@i\@e
+ \def\toadd{\otherampersand\otherhash277\othersemicol}%
+ \else
+ \ifx\test@i\@I
+ \def\toadd{\otherampersand\otherhash300\othersemicol}%
+ \else
+ \ifx\test@i\@i
+ \def\toadd{\otherampersand\otherhash301\othersemicol}%
+ \else
+ \ifx\test@i\@ii
+ \def\toadd{\otherampersand\otherhash301\othersemicol}%
+ \else
+ \ifx\test@i\@O
+ \def\toadd{\otherampersand\otherhash334\othersemicol}%
+ \else
+ \ifx\test@i\@o
+ \def\toadd{\otherampersand\otherhash335\othersemicol}%
+ \else
+ \def\toadd{\otherbackslash\otherlbrace#1\otherrbrace}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \xa\g@addto@macro\xa\htmlize@output\xa{\toadd}%
+ \egroup
+ }%
+}%
+
+% caron diacritics
+{\catcode`|=3\relax
+ \gdef\htmlize@caron{C|D|E|L|N|R|S|T|Z|c|d|e|l|n|r|s|t|z|}}
+\html@action@def\v#1{%
+ \ifinlist{#1}{\htmlize@caron}%
+ {\g@addto@macro\htmlize@output{\otherampersand#1caron\othersemicol}}%
+ {\xa\g@addto@macro\htmlize@output\xa{\string\v#1}}%
+}%
+
+% Ogonek diacritics
+{\catcode`|=3\relax
+ \gdef\htmlize@ogonek{A|E|I|U|a|e|i|u|}}
+\html@action@def\k#1{%
+ \ifinlist{#1}{\htmlize@ogonek}%
+ {\g@addto@macro\htmlize@output{\otherampersand#1ogon\othersemicol}}%
+ {
+ \bgroup
+ \def\test@i{#1}%
+ \ifx\test@i\@O
+ \def\toadd{\otherampersand\otherhash490\othersemicol}%
+ \else
+ \ifx\test@i\@o
+ \def\toadd{\otherampersand\otherhash491\othersemicol}%
+ \else
+ \def\toadd{\otherbackslash\otherlbrace#1\otherrbrace}%
+ \fi
+ \fi
+ \xa\g@addto@macro\xa\htmlize@output\xa{\toadd}%
+ \egroup
+ }%
+}%
% \end{macrocode}
%
% \subsubsection{Command sequences for Expansion}
%
% \begin{macrocode}
-\html@def\underline#1{<SPAN STYLE="text-decoration: underline;">#1</SPAN>}
+\html@def\underline#1{<SPAN STYLE=\@dquote text-decoration: underline;\@dquote>#1</SPAN>}%
\html@def\emph#1{<EM>#1</EM>}%
+\html@def\textit#1{<I>#1</I>}%
\html@def\textbf#1{<B>#1</B>}%
+\html@def\texttt#1{<CODE>#1</CODE>}%
+\html@def\textsc#1{<SPAN STYLE=\@dquote font-variant: small-caps;\@dquote>#1</SPAN>}%
+\html@def\url#1{<A href=\@dquote #1\@dquote>#1</A>}%
+\html@def\href#1#2{<A href=\@dquote #1\@dquote>#2</A>}%
+\html@def\textsuperscript#1{<SUP>#1</SUP>}%
+\html@def\up#1{<SUP>#1</SUP>}%
+\html@def\fup#1{<SUP>#1</SUP>}%
+\html@def\textsubscript#1{<SUB>#1</SUB>}%
\html@def\blank{____________}%
-\html@def\par{</P><P>}%
+\html@def\par{<BR/>}%
\html@def\aa{\&aring;}%
\html@def\AA{\&Aring;}%
\html@def\ae{\&aelig;}%
\html@def\AE{\&AElig;}%
+\html@def\oe{\&oelig;}%
+\html@def\OE{\&OElig;}%
\html@def\S{\&sect;}%
\html@def\euro{\&euro;}%
\html@def\texteuro{\&euro;}%
\html@def\o{\&oslash;}%
\html@def\O{\&Oslash;}%
\html@def\ss{\&szlig;}%
+\html@def\SS{\&\#7838;}%
\html@def\l{\&lstrok;}%
\html@def\L{\&Lstrok;}%
+\html@def\og{\&laquo;\&\#8239;}%
+\html@def\guillemotleft{\&laquo;\&\#8239;}%
+\html@def\fg{\&\#8239;\&raquo;}%
+\html@def\guillemotright{\&\#8239;\&raquo;}%
+\html@def\glqq{\&bdquo;}%
+\html@def\grqq{\&ldquo;}%
+\html@def\glq{\&sbquo;}%
+\html@def\grq{\&lsquo;}%
+\html@def\flqq{\&laquo;\&\#8239;}%
+\html@def\frqq{\&\#8239;\&raquo;}%
+\html@def\flq{\&lsaquo;}%
+\html@def\frq{\&rsaquo;}%
+\html@def\dq{\&quot;}%
+\html@def\,{\&\#8239;}%
+\html@def\thinspace{\&\#8239;}%
+\html@def\textbackslash{\&\#92;}%
+\html@def\_{\&\#95;}%
+\html@def\textquestiondown{\&iquest;}%
+\html@def\textexclamdown{\&iexcl;}%
% AH CUSTOM MACROS TO EXPAND --- remove these before publishing!
-\htmlize@record@expand{\inv}%
-\htmlize@record@expand{\rec}%
+%\htmlize@record@expand{\inv}%
+%\htmlize@record@expand{\rec}%
\htmlize@record@action\inlinemathrightdelim
\htmlize@record@action\displaymathrightdelim
-
% \end{macrocode}
+%
+% \subsubsection{Passing Code to XML Only}
+% Users may want to include pieces of HTML code to the XML file only.
+% When producing the traditional output, the optional argument, empty
+% by default, is used.
+% \begin{macrocode}
+\newcommand\htmlonly[2][]{#1}%
+% \end{macrocode}
+% When producing the XML file, the mandatory argument is passed as-is.
+% \begin{macrocode}
+\html@action@newcommand{htmlonly}[2][]{%
+ \g@addto@macro\htmlize@output{#2}%
+}%
+% \end{macrocode}
+%
+% \subsection{Graphics via {\ttfamily\string\includegraphics}}
%
-% \subsection{Graphics via {\tt\string\includegraphics}}
-%
+% \subsubsection{Finding Media Files}
+% The following code is adapted from the command |\Ginclude@graphics| as
+% found in |graphics.sty|.
+% Calling |\moodle@media@find|\marg{filename} looks for the file the
+% same way |\includegraphics| does, with or without extension provided,
+% in the current folder and in folders specified with |\graphicspath{}|.
+% The allowed extensions and their relative priorities can be set
+% via |\DeclareGraphicsExtensions{}|.
+% The outcome is that the macros |\moodle@media@base| and |\moodle@media@ext|
+% are set with the basename, including path, and extension, respectively.
+%
+% \begin{macrocode}
+\AtEndPreamble{%
+ \@ifpackageloaded{graphics}{%
+ \@ifpackagelater{graphics}{2019/10/08}{}{%
+ \PackageError{moodle}{`moodle' is made to interact with the `graphics'
+ package not older than 2019/10/08.}%
+ }%
+ }{}%
+}%
+\def\moodle@media@find#1{%
+ \ifx\detokenize\@undefined\else
+ \edef\Gin@extensions{\detokenize\expandafter{\Gin@extensions}}%
+ \fi
+ \begingroup
+ \let\input@path\Ginput@path
+ \set@curr@file{#1}%
+ \expandafter\filename@parse\expandafter{\@curr@file}%
+ \ifx\filename@ext\Gin@gzext
+ \expandafter\filename@parse\expandafter{\filename@base}%
+ \ifx\filename@ext\relax
+ \let\filename@ext\Gin@gzext
+ \else
+ \edef\Gin@ext{\Gin@ext\Gin@sepdefault\Gin@gzext}%
+ \fi
+ \fi
+ \ifx\filename@ext\relax
+ \@for\Gin@temp:=\Gin@extensions\do{%
+ \ifx\Gin@ext\relax
+ \Gin@getbase\Gin@temp
+ \fi}%
+ \else
+ \Gin@getbase{\Gin@sepdefault\filename@ext}%
+ \ifnum0%
+ \ifx\Gin@ext\relax 1%
+ \else \@ifundefined{Gin@rule@\Gin@ext}{1}{0}%
+ \fi >0
+ \let\Gin@ext\relax
+ \let\Gin@savedbase\filename@base
+ \let\Gin@savedext\filename@ext
+ \edef\filename@base{\filename@base\Gin@sepdefault\filename@ext}%
+ \let\filename@ext\relax
+ \@for\Gin@temp:=\Gin@extensions\do{%
+ \ifx\Gin@ext\relax
+ \Gin@getbase\Gin@temp
+ \fi}%
+ \ifx\Gin@ext\relax
+ \let\filename@base\Gin@savedbase
+ \let\filename@ext\Gin@savedext
+ \fi
+ \fi
+ \ifx\Gin@ext\relax
+ \@warning{File `#1' not found}%
+ \def\Gin@base{\filename@area\filename@base}%
+ \edef\Gin@ext{\Gin@sepdefault\filename@ext}%
+ \fi
+ \fi
+ \ifx\Gin@ext\relax
+ \@latex@error{File `#1' not found}%
+ {I could not locate the file with any of these extensions:^^J%
+ \Gin@extensions^^J\@ehc}%
+ \else
+ % begin modified part
+ \xdef\moodle@media@base{\detokenize\xa{\Gin@base}}%
+ \xdef\moodle@media@ext{\detokenize\xa{\Gin@ext}}%
+ % end modfied part
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+% \begin{macrocode}
+%See
+% * https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types
+% * https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers
+\def\moodle@media@formats{}
+\newcommand{\DeclareMediaFormat}[3]{%
+ \xdef\moodle@media@formats{\ifx\moodle@media@formats\empty\else\moodle@media@formats,\fi#1}%
+ \csgdef{moodle@media@#1list}{#2}%
+ \csgdef{moodle@media@#1mime}{#3}%
+}%
+% Image Formats
+\DeclareMediaFormat{PNG}{.png,.PNG}{image/png}%
+\DeclareMediaFormat{JPEG}{.jpg,.JPG,.jpeg,.JPEG}{image/jpeg}%
+\DeclareMediaFormat{SVG}{.svg,.SVG}{image/svg+xml}%
+\DeclareMediaFormat{GIF}{.gif}{image/gif}%
+% Audio Formats
+\DeclareMediaFormat{WAV}{.wav,.WAV}{audio/wave}%
+\DeclareMediaFormat{MP3}{.mp3,.MP3}{audio/mpeg}%
+\DeclareMediaFormat{OGG}{.ogg,.opus,.og&}{audio/ogg}%
+%\DeclareMediaFormat{FLAC}{.flac,.FLAC}{audio/flac}%
+% Video Formats
+\DeclareMediaFormat{WEBM}{.webm,.webm}{video/webm}%
+\DeclareMediaFormat{MP4}{.mp4,.MP4,.m4v,.M4V}{video/mp4}%
+\DeclareMediaFormat{OGV}{.ogv,.OGV}{video/ogg}%
+% \end{macrocode}
+% \begin{macrocode}
+\def\moodle@media@mime@identify#1{%
+ \edef\test@i{\detokenize\xa{#1}}%
+ \let\moodle@media@mime@current\relax
+ \edef\moodle@media@formats{\detokenize\xa{\moodle@media@formats}}%
+ \@for\@format:=\moodle@media@formats\do{%
+ \edef\@templist{\csname moodle@media@\@format list\endcsname}%
+ \@for\@ext:=\@templist\do{%
+ \ifx\moodle@media@mime@current\relax
+ \edef\@ext{\detokenize\xa{\@ext}}%
+ \ifx\test@i\@ext
+ \message{<<extension \@ext (\@format) identified>>^^J}%
+ \xdef\moodle@media@mime@current{\csname moodle@media@\@format mime\endcsname}%
+ \xdef\moodle@media@ext@current{#1}%
+ \fi
+ \fi
+ }%
+ }%
+}
+% \end{macrocode}
+%
% \subsubsection{External program command lines}
% We first set up commands for the external programs.
% \begin{macrocode}
@@ -3068,20 +5639,68 @@
\expandafter\def\htmlize@executable@macro{#1}%
}
-\def\ghostscriptcommand{\htmlize@setexecutable\gs}
-\def\opensslcommand{\htmlize@setexecutable\openssl}
-\def\imagemagickcommand{\htmlize@setexecutable\htmlize@imagemagick@convert}
+\def\ghostscriptcommand{\htmlize@setexecutable\gs}%
+\def\baselxivcommand{\htmlize@setexecutable\baselxiv}%
+\def\imagemagickcommand{\htmlize@setexecutable\htmlize@imagemagick@convert}%
+\def\optipngcommand{\htmlize@setexecutable\optipng}%
+\def\PDFtoSVGcommand{\htmlize@setexecutable\PDFtoSVG}%
+\def\SVGtoPDFcommand{\htmlize@setexecutable\SVGtoPDF}%
+\def\optiSVGcommand{\htmlize@setexecutable\optiSVG}%
+\def\DeleteFilecommand{\htmlize@setexecutable\DeleteFiles}%
\ifwindows%
- \ghostscriptcommand{gswin64c.exe}%
+ \ghostscriptcommand{gswin64c.exe -dBATCH -dNOPAUSE -sDEVICE=pngalpha}%
+ \baselxivcommand{certutil}%
+ \DeleteFilecommand{del}%
\else%
- \ghostscriptcommand{gs}%
+ \ghostscriptcommand{gs -dBATCH -dNOPAUSE -sDEVICE=pngalpha}%
+ \baselxivcommand{base64}%
+ \DeleteFilecommand{rm -f}%
\fi%
-\opensslcommand{openssl}%
-\imagemagickcommand{convert}%
+\imagemagickcommand{convert -colorspace RGB}%
+\optipngcommand{optipng -clobber -strip all -quiet}%
+\PDFtoSVGcommand{inkscape --export-type=svg --export-area-page --vacuum-defs}%--pdf-poppler
+% remove the "--pdf-poppler" import option if you want to preserve text (avoid conversion to path)
+\SVGtoPDFcommand{inkscape --export-type=pdf --export-area-page}%
+\optiSVGcommand{scour -q --enable-id-stripping --enable-comment-stripping
+ --shorten-ids --indent=none --remove-descriptive-elements}%
% \end{macrocode}
%
+% \subsubsection{Conversion and inclusion of non-native formats}
+% \begin{macrocode}
+\AtEndPreamble{%
+ \@ifpackageloaded{graphicx}{%
+ \def\@firstofthree#1#2#3{#1}%
+ \def\@secondofthree#1#2#3{#2}%
+ \newcommand{\DeclareGraphicsAlien}[3]{%
+ \edef\Gin@extensions{\Gin@extensions,#1}%
+ \DeclareGraphicsRule{#1}{\@gobble#1}{#1}{}%
+ \csdef{Gread@\@gobble#1}##1{%
+ \edef\SourceFile{\Gin@base\Gin@ext}%
+ \edef\Gin@base{\Gin@base-\@gobble#1-converted-to}%
+ \edef\Gin@ext{#2}%
+ \edef\OutputFile{\Gin@base\Gin@ext}%
+ \edef\targetfmt{\expandafter\expandafter\expandafter
+ \@firstofthree\csname Gin@rule@\Gin@ext\endcsname\relax}%
+ \edef\targetext{\expandafter\expandafter\expandafter
+ \@secondofthree\csname Gin@rule@\Gin@ext\endcsname\relax}%
+ \IfFileExists{\OutputFile}{}{\ShellEscape{#3}}%
+ \csletcs{Ginclude@\@gobble#1}{Ginclude@\targetfmt}%
+ \csname Gread@\targetfmt\endcsname{\Gin@base\targetext}%
+ }%
+ }%
+% Support for GIF files: passed as-is in XML but converted in PNG for PDF output.
+% In case the GIF is animated, we pick up the first frame in this conversion.
+% While the picture will be animated after Moodle import, it will not be in the PDF
+% output, whatever the viewer is.
+ \DeclareGraphicsAlien{.gif}{.png}{\htmlize@imagemagick@convert\otherspace '\SourceFile[0]' \OutputFile}%
+ }{
+ \newcommand\includegraphics[2][]{\PackageError{moodle}{"\string\includegraphics" is not defined}%
+ {Add "\string\usepackage{graphicx}" to you preamble.}}{}%}%
+ }%
+}%
+% \end{macrocode}
% \subsubsection{Graphics key-handling}
% Next, we get ready to handle keys like |height=4cm| or |width=3cm| or |ppi=72|.
% \begin{macrocode}
@@ -3110,25 +5729,63 @@
% \end{macrocode}
%
% \subsubsection{Graphics conversion to HTML}
+% If the |tikz| option is loaded, we define the |embedaspict| command.
+% Furthermore, |includegraphics| is packed into a TikZ node.
+% This allows externalization with regular options for |includegraphics|.
+% Otherwise, |includegraphics| is redefined with a limited set of options supported.
+%
+% Option SVG
% \begin{macrocode}
-\html@action@def\includegraphics{\moodle@includegraphics@int}%
- % Note that \htmlize@do@actioncs will 'patch' this by putting
- % '\xa\htmlize@proceedwiththerest\htmlize@afteraction@hook'
- % at the end. We want those 3 tokens to occur instead after
- % the graphics filename.
-\def\moodle@includegraphics@int#1#2#3{\moodle@includegraphics@int@int}%
- % This gobbles up those three spurious tokens,
- % which we will re-insert after our work is done.
-\newcommand\moodle@includegraphics@int@int[2][]{%
+\ifmoodle@svg
+ \AtEndPreamble{%
+% Declaring SVG to PDF conversion rule for includegraphics
+% \edef\Gin@extensions{\Gin@extensions,.svg,.SVG}%
+% \DeclareGraphicsRule{.svg}{pdf}{.pdf}{%
+% `\SVGtoPDF\otherspace '#1' \noexpand\Gin@base-svg-converted-to.pdf}%
+% \DeclareGraphicsRule{.SVG}{pdf}{.pdf}{%
+% `\SVGtoPDF\otherspace '#1' \noexpand\Gin@base-SVG-converted-to.pdf}%
+ \DeclareGraphicsAlien{.svg}{.pdf}{%
+ \SVGtoPDF\otherspace '\SourceFile' -o '\OutputFile' 2>/dev/null}%
+ \DeclareGraphicsAlien{.SVG}{.pdf}{%
+ \SVGtoPDF\otherspace '\SourceFile' -o '\OutputFile' 2>/dev/null}%
+ }%
+\fi
+\def\moodle@checkconversionsuccess#1#2{%
+ \IfFileExists{#1}{}{%
+ \PackageError{moodle}{#2 failed}%
+ {If the XML file is not of importance to you: use package option "draft"}%
+ }%
+}%
+\ifmoodle@tikz
+ \AfterEndPreamble{%
+ %\htmlize@record@expand{\embedaspict}%
+ \let\oldincludegraphics=\includegraphics
+ % patching includegraphics to trigger externalization
+ \renewcommand{\includegraphics}[2][]{%
+ %\message{moodle.sty: Processing \string\includegraphics[#1]{#2} for HTML^^J}%
+ \tikz{\node[inner sep=0pt]{\oldincludegraphics[#1]{#2}};}%
+ }%
+ % externalized images must be included with the regular command
+ \pgfkeys{/pgf/images/include external/.code={\oldincludegraphics{#1}}}%
+ \html@action@newcommand{includegraphics}[2][]{%
+ \message{moodle.sty: Processing \string\includegraphics[#1]{#2} ^^J}
+ \global\advance\numpicturesread by 1\relax
+ \edef\htmlize@imagetag{<IMG SRC="data:\TikzExportMIME;base64,\csname picbaselxiv@\the\numpicturesread\endcsname">}%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\htmlize@imagetag}%
+ }%
+ }%
+\else
+\html@action@newcommand{includegraphics}[2][]{%
\bgroup% The grouping is to localize the changes caused by \setkeys.
\message{moodle.sty: Processing \string\includegraphics[#1]{#2} for HTML...^^J}
\setkeys*{moodle@includegraphics}{#1}%
% Height or width should be given in TeX dimensions like cm or pt or in,
% and are converted to pixels for web use using the ppi key.
- % TO DO: Can we modify \includegraphics to accept height or width in
+ % TODO: Can we modify \includegraphics to accept height or width in
% pixels?
- % TO DO: What about \includegraphics[scale=0.7] ?
+ % TODO: What about \includegraphics[scale=0.7] ?
% Other keys: keepaspectratio=true|false, angle (rotation), clip & trim
+ % -> the package option 'tikz' offers a workaround for this
\ifnum\moodle@graphics@height@pixels=0\relax
\ifnum\moodle@graphics@width@pixels=0\relax
% No size specified. Default to height of 200 pixels.
@@ -3150,28 +5807,91 @@
\edef\moodle@graphics@htmlgeometry{width=\number\moodle@graphics@width@pixels\otherspace height=\number\moodle@graphics@height@pixels}%
\fi
\fi
- %First, convert it to PNG
- \edef\cmdline{\htmlize@imagemagick@convert\otherspace #2 -resize \moodle@graphics@geometry\otherspace #2.png}%
- \message{moodle.sty: Converting '#2' to PNG...^^J}%
- \expandafter\immediate\expandafter\write18\expandafter{\cmdline}%
- %Next, convert the PNG to base64 encoding
- \def\cmdline{\openssl\otherspace enc -base64 -in #2.png -out #2.enc}%
- \message{moodle.sty: Converting '#2.png' to base64...^^J}%
- \expandafter\immediate\expandafter\write18\expandafter{\cmdline}%
+ %Look for the file, even if no extension is provided
+ \moodle@media@find{#2}%
+ %\message{<<\moodle@media@base>>^^J}
+ %\message{<<\moodle@media@ext>>^^J}
+ %Try to identify corresponding MIME-type
+ \moodle@media@mime@identify{\moodle@media@ext}%
+ \ifx\moodle@media@mime@current\relax
+ % conversion needed
+ \edef\moodle@media@pdf{\detokenize{.pdf}}%
+ \edef\moodle@media@ext{\detokenize\xa{\moodle@media@ext}}%
+ \ifnum0\ifx\moodle@media@ext\moodle@media@pdf1\fi\ifmoodle@svg1\fi=11% PDF file and SVG option active
+ \def\moodle@media@ext@current{.svg}%
+ \edef\moodle@media@mime@current{\moodle@media@SVGmime}%
+ \edef\cmdline{\PDFtoSVG\otherspace "\moodle@media@base\moodle@media@ext" -o "\moodle@media@base\moodle@media@ext@current" 2>/dev/null}%
+ \message{moodle.sty: Converting '#2' to SVG...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ \moodle@checkconversionsuccess{\moodle@media@base\moodle@media@ext@current}{PDFtoSVG conversion}%
+ %Next, optimize inline
+ \ifwindows\else
+ \edef\cmdline{\optiSVG < "\moodle@media@base\moodle@media@ext@current" >
+ "\moodle@media@base.tmp.svg" && mv "\moodle@media@base.tmp.svg"
+ "\moodle@media@base\moodle@media@ext@current"}%
+ \message{moodle.sty: Optimizing '\moodle@media@base\moodle@media@ext@current'...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ \moodle@checkconversionsuccess{\moodle@media@base\moodle@media@ext@current}{SVG optimization}%
+ \fi
+ \else% call ImageMagick
+ \def\moodle@media@ext@current{.png}%
+ \def\moodle@media@mime@current{image/png}%
+ \edef\cmdline{\htmlize@imagemagick@convert\otherspace "\moodle@media@base\moodle@media@ext" -resize \moodle@graphics@geometry\otherspace "\moodle@media@base\moodle@media@ext@current"}%
+ \message{moodle.sty: Converting '#2' to PNG...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ \moodle@checkconversionsuccess{\moodle@media@base\moodle@media@ext@current}{ImageMagick conversion}%
+ %Next, optimize inline
+ \edef\cmdline{\optipng\otherspace "\moodle@media@base\moodle@media@ext@current"}%
+ \message{moodle.sty: Optimizing '\moodle@media@base\moodle@media@ext@current'...^^J}%
+ \xa\ShellEscape\xa{\cmdline}%
+ \moodle@checkconversionsuccess{\moodle@media@base\moodle@media@ext@current}{PNG optimization}%
+ \fi
+ \fi
+ %Next, convert the file to base64 encoding
+ \ConvertToBaseLXIV{\moodle@media@base}{\moodle@media@ext@current}%
%Now, save that base64 encoding in a TeX macro
\def\moodle@newpic@baselxiv{}%
- \message{moodle.sty: Reading base64 file '#2.enc'...^^J}%
- \openin\baseLXIVdatafile=#2.enc\relax
+ \message{moodle.sty: Reading base64 file '\moodle@media@base.enc'...^^J}%
+ \openin\baseLXIVdatafile="\moodle@media@base.enc"
\savebaselxivdata@recursive
\closein\baseLXIVdatafile
+ %Clean up files
+ \ifx\moodle@media@ext@current\moodle@media@ext
+ \ShellEscape{\DeleteFiles\otherspace "\moodle@media@base.enc"}%
+ \else
+ \ShellEscape{\DeleteFiles\otherspace "\moodle@media@base.enc" "\moodle@media@base\moodle@media@ext@current"}%
+ \fi
\xa\global\xa\let\csname picbaselxiv@graphics@#2\endcsname=\moodle@newpic@baselxiv%
- \edef\htmlize@imagetag{<IMG \moodle@graphics@htmlgeometry\otherspace SRC="data:image/png;base64,\csname picbaselxiv@graphics@#2\endcsname">}%
+ \edef\htmlize@imagetag{<IMG \moodle@graphics@htmlgeometry\otherspace SRC="data:\moodle@media@mime@current;base64,\csname picbaselxiv@graphics@#2\endcsname">}%
\xa\g@addto@macro\xa\htmlize@output\xa{\htmlize@imagetag}%
\message{moodle.sty: <IMG> tag inserted.^^J}%
\egroup
- % Now we re-insert the code to get the HTMLizing going again.
- \xa\htmlize@proceedwiththerest\htmlize@afteraction@hook
-}
+}%
+\fi
+% \end{macrocode}
+% This macro is in charge of throwing a system call to convert local files to base64.
+% \begin{macrocode}
+\def\ConvertToBaseLXIV#1#2{%
+ \message{moodle.sty: Converting '#1#2' to base64...^^J}%
+ \ConvertToBaseLXIV@int{#1}{#2}
+ \xa\ShellEscape\xa{\cmdline}%
+ \moodle@checkconversionsuccess{#1.enc}{Base64 conversion}%
+}%
+\ifwindows
+ \def\ConvertToBaseLXIV@int#1#2{%
+ \def\cmdline{\baselxiv\otherspace -encode "#1#2"\otherspace tmp.b64 && findstr /vbc:"---" tmp.b64 > "#1.enc" && del tmp.b64}%
+ }% Starting from Windows 7, CertUtil is included by default. There should be no windows XP still running
+\else
+ \ifmacosx
+ \def\ConvertToBaseLXIV@int#1#2{%
+ \def\cmdline{\baselxiv\otherspace -b 64 -i "#1#2"\otherspace -o "#1.enc"}%
+ }%
+ \else % Linux, Cygwin
+ \def\ConvertToBaseLXIV@int#1#2{%
+ \def\cmdline{\baselxiv\otherspace "#1#2"\otherspace > "#1.enc"}%
+ }% base64 is part of coreutils, add "-w 64" to get exactly the previous behavior %
+ \fi
+\fi
% \end{macrocode}
% The following code accomplishes the reading of an |.enc| file into memory.
% It is also used by the \TikZ\ code below.
@@ -3201,32 +5921,69 @@
% are undefined.
% Our solution is to wait until |\AtBeginDocument| and then test whether
% \TikZ\ is loaded. If so, we make the appropriate definitions.
+% \begin{macro}{TikZ}
+% \changes{v0.7}{2020/07/14}{Support \emph{tikz}\ command}
% \begin{macrocode}
-\newif\ifmoodle@tikzloaded
-\moodle@tikzloadedfalse
\AtBeginDocument{
\ifx\tikzpicture\@undefined
\moodle@tikzloadedfalse
\else
\moodle@tikzloadedtrue
\fi
+ \ifmoodle@draftmode
+ \long\def\tikzifexternalizing#1#2{#2}%
+ \else
\ifmoodle@tikzloaded
- \usetikzlibrary{external}
+ \usetikzlibrary{external}%
\tikzexternalize%
\tikzset{external/force remake}%
-
- \ifpdf
- \def\pdftopng{\edef\gscmdline{\gs\otherspace -dBATCH -dNOPAUSE -sDEVICE=pngalpha -sOutputFile=\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.png -r200 \tikzexternalrealjob-tikztemp-\the\numconvertedpictures.pdf}%
- \expandafter\immediate\expandafter\write18\expandafter{\gscmdline}}%
+ \def\moodle@basename{\tikzexternalrealjob-tikztemp-\the\numconvertedpictures}%
+ \ifmoodle@svg
+ \def\TikzExportExtension{.svg}%
+ \def\TikzExportMIME{image/svg+xml}%
+ \ifpdfoutput% tex engines defaulting to PDF output (pdflatex, xelatex, lualatex)
+ \def\ExportTikz{ \message{moodle.sty: Converting picture '\moodle@basename.pdf' to SVG...^^J}%
+ \edef\cmdline{\PDFtoSVG\otherspace "\moodle@basename.pdf" -o "\moodle@basename\TikzExportExtension" 2>/dev/null}%
+ \xa\ShellEscape\xa{\cmdline}%
+ \moodle@checkconversionsuccess{\moodle@basename\TikzExportExtension}{PDFtoSVG conversion}%
+ }%
+ \else % latex
+ \def\ExportTikz{ \message{moodle.sty: Converting picture '\moodle@basename.ps' to SVG...^^J}%
+ \edef\cmdline{\PDFtoSVG\otherspace "\moodle@basename.ps" -o "\moodle@basename\TikzExportExtension" 2>/dev/null}%
+ \xa\ShellEscape\xa{\cmdline}%
+ \moodle@checkconversionsuccess{\moodle@basename\TikzExportExtension}{PStoSVG conversion}%
+ }%
+ \fi
+ \def\OptimizeExport{ \message{moodle.sty: Optimizing '\moodle@basename.svg'...^^J}%
+ \edef\cmdline{\optiSVG\otherspace < "\moodle@basename\TikzExportExtension" >
+ "\moodle@basename.tmp.svg" && mv "\moodle@basename.tmp.svg"
+ "\moodle@basename\TikzExportExtension" }%
+ \xa\ShellEscape\xa{\cmdline}%
+ \moodle@checkconversionsuccess{\moodle@basename\TikzExportExtension}{SVG optimization}%
+ }%
\else
- \def\pstopng{\edef\gscmdline{\gs\otherspace -dBATCH -dNOPAUSE -sDEVICE=pngalpha -sOutputFile=\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.png -r200 \tikzexternalrealjob-tikztemp-\the\numconvertedpictures.ps}%
- \expandafter\immediate\expandafter\write18\expandafter{\gscmdline}}%
+ \def\TikzExportExtension{.png}%
+ \def\TikzExportMIME{image/png}%
+ \ifpdfoutput% tex engines defaulting to PDF output (pdflatex, xelatex, lualatex)
+ \def\ExportTikz{ \message{moodle.sty: Converting picture '\moodle@basename.pdf' to PNG...^^J}%
+ \edef\gscmdline{\gs\otherspace -sOutputFile=\moodle@basename\TikzExportExtension\otherspace -r150 \moodle@basename.pdf}%
+ \xa\ShellEscape\xa{\gscmdline}%
+ \moodle@checkconversionsuccess{\moodle@basename\TikzExportExtension}{Ghostscript conversion}%
+ }%
+ \else % latex
+ \def\ExportTikz{ \message{moodle.sty: Converting picture '\moodle@basename.ps' to PNG...^^J}%
+ \edef\gscmdline{\gs\otherspace -sOutputFile=\moodle@basename\TikzExportExtension\otherspace -r150 \\moodle@basename.ps}%
+ \xa\ShellEscape\xa{\gscmdline}%
+ \moodle@checkconversionsuccess{\moodle@basename\TikzExportExtension}{Ghostscript conversion}%
+ }%
+ \fi
+ \def\OptimizeExport{ \message{moodle.sty: Optimizing '\moodle@basename.png'...^^J}%
+ \edef\cmdline{\optipng\otherspace \moodle@basename\TikzExportExtension}%
+ \xa\ShellEscape\xa{\cmdline}%
+ \moodle@checkconversionsuccess{\moodle@basename\TikzExportExtension}{PNG optimization}%
+ }%
\fi
- \def\pngtobaselxiv{\edef\opensslcmdline{\openssl\otherspace enc -base64 -in \tikzexternalrealjob-tikztemp-\the\numconvertedpictures.png -out \tikzexternalrealjob-tikztemp-\the\numconvertedpictures.enc}%
- \expandafter\immediate\expandafter\write18\expandafter{\opensslcmdline}}%
-
\let\moodle@oldtikzpicture=\tikzpicture
-
%The following code lets us run things *before* the normal \begin{tikzpicture}.
\renewenvironment{tikzpicture}{%
\global\advance\numconvertedpictures by 1\relax
@@ -3238,43 +5995,64 @@
% However, the tikz externalize library does *not* run \end{tikzpicture}.
% In order to run commands after the tikz picture is done compiling, we need to
% use a hook into \tikzexternal@closeenvironments.
-
\g@addto@macro{\tikzexternal@closeenvironments}{%
\moodle@endtikzpicture@hook
}
+% The following could replace calls to \pdftopng, \pngoptim and \pngtobaselxiv
+% \tikzset{external/system call/.add={}{;
+% gs -dBATCH -dNOPAUSE -sDEVICE=pngalpha -sOutputFile="\image.png" -r150 "\image.pdf";
+% optipng -clobber -strip all -quiet "\image.png";
+% base64 "\image.png" > "\image.enc"
+% }
+% }
+% With the following mechanism, we could trigger something when the externalized images are included back.
+% \pgfkeys{/pgf/images/include external/.code={\pgfimage{#1}\@moodle@ifgeneratexml{\savebaselxivdata}{}}}
+%
\def\moodle@endtikzpicture@hook{%
\@moodle@ifgeneratexml{%
- \ifpdf
- \message{moodle.sty: Converting picture '\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.pdf' to PNG...^^J}%
- \pdftopng
- \else
- \pstopng
- \fi
- \message{moodle.sty: Converting '\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.png' to base64...^^J}%
- \pngtobaselxiv
+ \ExportTikz
+ \OptimizeExport
+ \ConvertToBaseLXIV{\moodle@basename}{\TikzExportExtension}%
+ \IfFileExists{\moodle@basename.enc}{}{\PackageError{moodle}{Conversion failed}{Check your base64 conversion utiliy}}%
\message{moodle.sty: Reading base64 file '\tikzexternalrealjob-tikztemp-\the\numconvertedpictures.enc'...^^J}%
\savebaselxivdata
\message{moodle.sty: base64 data saved.^^J}%
}{}%
}
- \tikzset{external/optimize=true}
- \tikzset{external/optimize command away={\VerbatimInput}{1}}
+ \ifmoodle@tikz
+ \tikzset{external/optimize=false}% due to redefinition, includegraphics must not be optimized away
+ \else
+ \tikzset{external/optimize=true}%
+ \tikzset{external/optimize command away={\VerbatimInput}{1}}%
+ \fi
%
% The HTMLizer version of the tikzpicture environment,
% which writes an <IMG> tag to the XML file.
- \htmlize@record@environment{tikzpicture}
+ \htmlize@record@environment{tikzpicture}%
\g@addto@macro\htmlize@activate@environments{%
\let\tikzpicture\relax\let\endtikzpicture\relax
\NewEnviron{tikzpicture}[1][]{%
\global\advance\numpicturesread by 1\relax
- \edef\htmlize@imagetag{<IMG SRC="data:image/png;base64,\csname picbaselxiv@\the\numpicturesread\endcsname">}%
+ \edef\htmlize@imagetag{<IMG SRC="data:\TikzExportMIME;base64,\csname picbaselxiv@\the\numpicturesread\endcsname">}%
\xa\g@addto@macro\xa\htmlize@output\xa{\htmlize@imagetag}%
}[\htmlize@patchendenvironment]%
}%
+ \html@action@newcommand{tikz}[2][]{%
+% \message{>>> Processing \string\tikz[#1]{...} ^^J}
+ \global\advance\numpicturesread by 1\relax
+ \edef\htmlize@imagetag{<IMG SRC="data:\TikzExportMIME;base64,\csname picbaselxiv@\the\numpicturesread\endcsname">}%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\htmlize@imagetag}%
+ }%
\else
%TikZ not loaded. Provide dummy definitions for commands.
\long\def\tikzifexternalizing#1#2{#2}%
\fi
+ \fi
+ \ifmoodle@tikz
+ \tikzstyle{moodlepict}=[minimum height=1em,inner sep=0pt,execute at begin node={\begin{varwidth}{\linewidth}},execute at end node={\end{varwidth}}]
+ \newcommand\embedaspict[1]{\tikz[baseline=-\the\dimexpr\fontdimen22\textfont2\relax]{\node[moodlepict]{\mbox{#1}};}}
+ \htmlize@record@expand{\embedaspict}
+ \fi
}
\newcount\numconvertedpictures
@@ -3290,27 +6068,477 @@
\xa\global\xa\let\csname picbaselxiv@\the\numconvertedpictures\endcsname=\moodle@newpic@baselxiv%
}
-\def\@moodle@par{\par}%
+\ifmoodle@tikz
+ \ifmoodle@tikzloaded
+ \PackageWarning{moodle}{With package option 'tikz', you should not load TikZ manually.}%
+ \fi
+ \RequirePackage{tikz}%
+ \RequirePackage{varwidth}% for the command |embedaspict|
+\fi
% \end{macrocode}
% Finally, we clean up our mess by deleting the temporary PDF, PNG, and ENC
% files we created.
+% With XeTeX, we cannot clean pictures pdf's because they are actually included in the final pdf afterwards, by xdvipdfmx.
+% With LuaTeX, it looks like |\AtEndDocument| is too early to for this cleaning step.
% \begin{macrocode}
-\AtEndDocument{%
+\AfterEndDocument{%
\ifmoodle@tikzloaded
\@moodle@ifgeneratexml{%
- \ifwindows
- \immediate\write18{del \tikzexternalrealjob-tikztemp-*.*}%
+ \ifXeTeX
+ % we must keep picture pdf's for subsequent linking (xdvipdfmx)
+ \ifwindows
+ \ShellEscape{powershell.exe -noexit "del * -include \tikzexternalrealjob-tikztemp-*.* -exclude *.pdf}%
+ \else
+ \ShellEscape{find . -type f -name "\tikzexternalrealjob-tikztemp-*.*" -not -name "*.pdf" -delete}%
+ \fi
\else
- \immediate\write18{rm \tikzexternalrealjob-tikztemp-*.*}%
+ \ShellEscape{\DeleteFiles\otherspace \tikzexternalrealjob-tikztemp-*.*}%
\fi
}{}%
\fi
}
-
-% TO DO:
+% \end{macrocode}
+% TODO:
% * sizing options for TikZ pictures?
-% * In cloze multi, how to handle HTML or TeX in answers? In particular, what about ~?
+%\end{macro}
+%
+% \subsection{Other Media}
+% Support for other media comes through the |\url|\marg{link} and |\href|\marg{link}\marg{text}
+% commands.
+\AtEndPreamble{%
+ \@ifpackageloaded{hyperref}{%
+ \let\oldhref\href
+ \let\oldurl\url
+ \def\moodle@hyper@readexternallink#1#2#3#4:#5:#6\\#7{%
+% 1) The link type (the string "link" in the cases I observed)
+% 2) The URL fragment (i.e. what comes after # in the end),
+% 3) the text replacement,
+% 4) the URL scheme (http, https, mailto, file, run etc),
+% 5) the URL details (in general, that is whole authority + path + query).
+% If the URL contains a column (specification of a password in userinfo or a
+% port in authority), we get here whatever comes before the first column (:)
+% 6) empty is URL contains no column. Otherwise, filled with whatever follows
+% a first column (:) after the scheme,
+% 7) the whole URL again (fragment removed).
+ \def\filename@ext{}%
+ \def\filename@area{}%
+ \def\filename@base{}%
+ \ifx\\#6\\% if ##6 is empty (the URL contains no column -> no scheme -> local)
+ %\@hyper@linkfile file:#7\\{#3}{#2}{#7}% local file
+ %Local file (##1|##2|##3|##4|##5|##6): ##7\par
+ \filename@parse{#4}%
+ \ConvertToBaseLXIV{\filename@area\filename@base}{.\filename@ext}%
+ \else
+ \ifx\\#4\\%if ##4 is empty (no scheme was specified -> local file)
+% %\@hyper@linkfile file:#7\\{#3}{#2}{#7}% Mac filename ?
+% Local file (Mac? ##1|##2|##3|##4|##5|##6): ##7\par
+ \filename@parse{#4}%
+ \ConvertToBaseLXIV{\filename@area\filename@base}{.\filename@ext}%
+ \else
+ \def\@pdftempa{#4}%
+ \ifx\@pdftempa\@pdftempwordfile% scheme is "file:"
+% %\@hyper@linkfile#7\\{#3}{#2}{#7}% file
+% Local file (no column ##1|##2|##3|##4|##5|##6): ##7\par
+ \filename@parse{#5}%
+ \ConvertToBaseLXIV{\filename@area\filename@base}{.\filename@ext}%
+ \else
+ \ifx\@pdftempa\@pdftempwordrun% scheme is "run:"
+ \ifHy@pdfa
+ \Hy@Error{%
+ PDF/A: Launch action is prohibited%
+ }\@ehc
+ \begingroup
+ \leavevmode
+% ##2%
+ \endgroup
+ \else% not in PDF/A mode -> run is allowed
+ %\@hyper@launch#7\\{#3}{#2}% run local file
+% Run local file (##1|##2|##3|##4|##5|##6): ##7\par
+ \filename@parse{#5}%
+ \ConvertToBaseLXIV{\filename@area\filename@base}{.\filename@ext}%
+ \fi
+ \else% scheme is neither "file" nor "run", assuming it is a web protocol
+ %\hyper@linkurl{#3}{#7\ifx\\#2\\\else\hyper@hash#2\fi}% URL
+% URL (##1|##2|##3|##4|##5|##6): ##7\par
+ \filename@parse{#7}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \xdef\moodle@media@ext{.\filename@ext}%
+ \xdef\moodle@media@base{\filename@area\filename@base}%
+ }%
+% \html@action@newcommand{href}[3][]{%
+% \bgroup% The grouping is to localize the changes caused by \setkeys.
+% \message{moodle.sty: Processing \string\href[#1]{#2}{#3} for HTML...^^J}%
+% the following macro is a modified version of hyperref's |\hyper@readexternallink|
+% \let\@hyper@readexternallink\moodle@hyper@readexternallink
+% \oldhref[#1]{#2}{#3}%
+ %\message{<<\moodle@media@base>>^^J}
+ %\message{<<\moodle@media@ext>>^^J}
+ %Try to identify corresponding MIME-type
+% \moodle@media@mime@identify{\moodle@media@ext}%
+ %\edef\moodle@media@mime@current{\detokenize\xa{\moodle@media@mime@current}}%
+% \xa\message\xa{moodle.sty: \moodle@media@mime@current^^J}%
+% \ifx\moodle@media@mime@current\relax
+% \xa\g@addto@macro\xa\htmlize@output\xa{<A href=\otherampersand\otherhash34;\moodle@media@base\moodle@media@ext\otherampersand\otherhash34;>#3</A>}%
+% \message{moodle.sty: <A> tag inserted.^^J}%
+% \else
+% \filename@parse{\moodle@media@mime@current}%
+% \def\@tmp{audio/}
+% \ifx\filename@area\@tmp
+% \IfFileExists{\moodle@media@base.enc}{%
+% \def\moodle@newpic@baselxiv{}%
+% \openin\baseLXIVdatafile=\moodle@media@base.enc\relax
+% \savebaselxivdata@recursive
+% \closein\baseLXIVdatafile
+% \xa\g@addto@macro\xa\htmlize@output\xa{<audio controls src="data:\moodle@media@mime@current;base64,\moodle@newpic@baselxiv">#3</audio>}%
+% }{%
+% \xa\g@addto@macro\xa\htmlize@output\xa{<audio controls src="\moodle@media@base\moodle@media@ext">#3</audio>}%
+% }%
+% \message{moodle.sty: <audio> tag inserted.^^J}%
+% \else
+% \def\@tmp{video/}
+% \ifx\filename@area\@tmp
+% \IfFileExists{\moodle@media@base.enc}{%
+% \def\moodle@newpic@baselxiv{}%
+% \openin\baseLXIVdatafile=\moodle@media@base.enc\relax
+% \savebaselxivdata@recursive
+% \closein\baseLXIVdatafile
+% \xa\g@addto@macro\xa\htmlize@output\xa{<video controls src="data:\moodle@media@mime@current;base64,\moodle@newpic@baselxiv">#3</video>}%
+% }{%
+% \xa\g@addto@macro\xa\htmlize@output\xa{<video controls src="\moodle@media@base\moodle@media@ext">#3</video>}%
+% }%
+% \message{moodle.sty: <video> tag inserted.^^J}%
+% \else
+% \PackageWarning{moodle}{cannot recognize MIME type of #2. Ignoring it.}%
+% \fi
+% \fi
+% \fi
+% \egroup
+% }%
+% \html@action@def\url#1{%
+% \bgroup% The grouping is to localize the changes caused by \setkeys.
+% \message{moodle.sty: Processing \string\url{#1} for HTML...^^J}%
+% the following macro is a modified version of hyperref's |\hyper@readexternallink|
+% \let\@hyper@readexternallink\moodle@hyper@readexternallink
+% \oldhref{#1}{#1}%
+% \xa\g@addto@macro\xa\htmlize@output\xa{<A href=\otherampersand\otherhash34;\moodle@media@base\moodle@media@ext\otherampersand\otherhash34;>#1</A>}%
+% \message{moodle.sty: <A> tag inserted.^^J}%
+% \egroup
+% }%
+ }{}%
+}%
+%
+% \subsection{Verbatim Code}
+%
+% We start by defining a macro to parameter a style for code box display in Moodle
+% \begin{macrocode}
+\def\xmlDisplayVerbatimBox{border-top: thin solid; border-bottom: thin solid}%
+% \end{macrocode}
+% First, let us handle |\verbatiminput| from the `verbatim' package
+% \begin{macrocode}
+\html@action@def\verbatiminput#1{%
+ \message{moodle.sty: Processing \string\verbatiminput{#1} for HTML ^^J}%
+ \g@addto@macro\htmlize@output{<PRE style="\xmlDisplayVerbatimBox"><CODE>}%
+ %%%%%%%%%%%%%% from verbatim %%%%%%%%%%%%%%%%%
+ \@bsphack
+ \let\do\@makeother\dospecials
+ \catcode`\^^M\active
+ \def\verbatim@processline{\xa\g@addto@macro\xa\htmlize@output\xa{\the\verbatim@line<BR/>}}
+ \verbatim@readfile{#1}%
+ \@esphack
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \g@addto@macro\htmlize@output{</CODE></PRE>}%
+}%
+% \end{macrocode}
+% Second, we deal with |\VerbatimInput| from `fancyvrb' or `fvextra'
+% \begin{macrocode}
+\@ifpackageloaded{minted}{\PackageError{moodle}{'moodle' should be loaded before 'minted'.}%
+{'moodle' loads 'fancybox' which, unfortunately, redefines verbatim commands.}}{\relax}%
+\@ifpackageloaded{fvextra}{\PackageError{moodle}{'moodle' should be loaded before 'fvextra'.}%
+{'moodle' loads 'fancybox' which, unfortunately, redefines verbatim commands.}}{\relax}%
+\@ifpackageloaded{fancyvrb}{\PackageError{moodle}{'moodle' should be loaded before 'fancyvrb'.}%
+{'moodle' loads 'fancybox' which, unfortunately, redefines verbatim commands.}}{\relax}%
+
+\html@action@newcommand{VerbatimInput}[2][]{%
+ \message{moodle.sty: Processing \string\VerbatimInput[#1]{#2} for HTML ^^J}%
+ \def\FV@KeyValues{#1}%
+ \FV@UseKeyValues% import options defined in #1
+ \moodle@VerbatimInput{#2}%
+}%
+\html@action@newcommand{LVerbatimInput}[2][]{%
+ \message{moodle.sty: Processing \string\LVerbatimInput[#1]{#2} for HTML ^^J}%
+ \def\FV@KeyValues{#1}%
+ \FV@UseKeyValues% import options defined in #1
+ \moodle@VerbatimInput{#2}%
+}%
+\html@action@newcommand{BVerbatimInput}[2][]{%
+ \message{moodle.sty: Processing \string\BVerbatimInput[#1]{#2} for HTML ^^J}%
+ \def\FV@KeyValues{#1}%
+ \FV@UseKeyValues% import options defined in #1
+ \moodle@VerbatimInput{#2}%
+}%
+\def\moodle@VerbatimInput#1{%
+ \g@addto@macro\htmlize@output{<PRE style="\xmlDisplayVerbatimBox"><CODE>}%
+ %%%%%%%% using material from fancyvrb and fvextra %%%%%%%%
+ %\begingroup
+ \def\moodle@verbatim@addlinenumber##1{%
+ \g@addto@macro\htmlize@output{<span style="font-size: 80\otherpercent;
+ background-color: \otherhash f0f0f0; padding: 0 5px 0 5px; display:
+ inline-block; width: 16pt; ##1">}%
+ \if@FV@NumberBlankLines
+ \xa\g@addto@macro\xa\htmlize@output\xa{\the\c@FancyVerbLine</span>}%
+ \else
+ \ifx\FV@Line\empty
+ \xa\g@addto@macro\xa\htmlize@output\xa{\otherampersand nbsp;</span>}%
+ \else
+ \xa\g@addto@macro\xa\htmlize@output\xa{\the\c@FancyVerbLine</span>}%
+ \fi
+ \fi
+ }
+ % redefine the ProcessLine routine ('fancyvrb' and 'fvextra') for XML output
+ \def\FV@ProcessLine##1{%
+ \ifcsname FV@HighlightLine:\number\c@FancyVerbLine\endcsname
+ \xdef\moodle@FV@tagB{<mark>}% fvextra triggered highlighting for this line
+ \xdef\moodle@FV@tagE{</mark>}%
+ \else
+ \xdef\moodle@FV@tagB{}% no highlighting
+ \xdef\moodle@FV@tagE{}%
+ \fi
+ \catcode`\`=12%
+ \def\FV@Line{##1}%
+ \ifx\FV@LeftListNumber\relax
+
+ \else% line numbers displayed on the left side
+ \moodle@verbatim@addlinenumber{text-align: right}%
+ \fi
+ \xa\g@addto@macro\xa\htmlize@output\xa{\moodle@FV@tagB}%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\FV@Line}%
+ \xa\g@addto@macro\xa\htmlize@output\xa{\moodle@FV@tagE}%
+ \ifx\FV@RightListNumber\relax\else% line numbers on the right side
+ \moodle@verbatim@addlinenumber{text-align: left; float: right}%
+ \fi
+ \g@addto@macro\htmlize@output{<BR/>}%linebreak
+ }
+ \global\FV@CodeLineNo\z@% reset codeline counter
+ \frenchspacing% Cancels special punctuation spacing.
+ \FV@DefineWhiteSpace
+ \def\FV@Space{\space}
+ \FV@DefineTabOut% replace tabs with a series a whitespaces
+ \ifdefined\FV@HighlightLinesPrep
+ \FV@HighlightLinesPrep% prepare highlighting if 'fvextra' is loaded
+ \fi
+ \FV@Input{#1}%
+ %\endgroup
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ \g@addto@macro\htmlize@output{</CODE></PRE>}%
+}%
+\AtEndPreamble{%
+ \@ifpackageloaded{fancyvrb}{%
+ % custom settings for display
+ \fvset{frame=lines,label={[Beginning of code]End of code},framesep=3mm,numbersep=9pt}%
+ }{\relax}%
+}
% \end{macrocode}
+% Third, we patch `minted' so that it also calls pygmentize to generate HTML code.
+% \begin{macrocode}
+\AtEndPreamble{% this definition should prevail because `minted' gets loaded after `moodle'
+\@ifpackageloaded{minted}{%
+ \newcounter{moodle@pygmentizecounter}%
+ \renewcommand{\minted@pygmentize}[2][\minted@outputdir\minted@jobname.pyg]{%
+ \minted@checkstyle{\minted@get@opt{style}{default}}%
+ \stepcounter{minted@pygmentizecounter}%
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}%
+ {\def\minted@codefile{\minted@outputdir\minted@jobname.pyg}}%
+ {\def\minted@codefile{#1}}%
+ \ifthenelse{\boolean{minted@isinline}}%
+ {\def\minted@optlistcl@inlines{%
+ \minted@optlistcl@g@i
+ \csname minted@optlistcl@lang\minted@lang @i\endcsname}}%
+ {\let\minted@optlistcl@inlines\@empty}%
+ \def\minted@cmdtemplate##1##2{%
+ \ifminted@kpsewhich
+ \ifwindows
+ \detokenize{for /f "usebackq tokens=*"}\space\@percentchar\detokenize{a
+ in (`kpsewhich}\space\minted@codefile\detokenize{`) do}\space
+ \fi
+ \fi
+ \MintedPygmentize\space -l #2 -f ##1 -F tokenmerge
+ \minted@optlistcl@g \csname minted@optlistcl@lang\minted@lang\endcsname
+ \minted@optlistcl@inlines
+ \minted@optlistcl@cmd -o \minted@outputdir##2\space
+ \ifminted@kpsewhich
+ \ifwindows
+ \@percentchar\detokenize{a}%
+ \else
+ \detokenize{`}kpsewhich \minted@codefile\space
+ \detokenize{||} \minted@codefile\detokenize{`}%
+ \fi
+ \else
+ \minted@codefile
+ \fi}%
+ \def\minted@cmd{\minted@cmdtemplate{latex -P commandprefix=PYG}{\minted@infile}}
+ % For debugging, uncomment: %%%%
+ \immediate\typeout{\minted@cmd}%
+ % %%%%
+ \def\minted@cmdHTML{\minted@cmdtemplate{html -P noclasses -P
+ nowrap -P hl_lines="\FV@HighlightLinesList" -P
+ style="\minted@get@opt{style}{default}"}{\csname minted@infileHTML\the\c@minted@pygmentizecounter\endcsname}}%
+ \def\minted@cmdPNG{\minted@cmdtemplate{png -P
+ line_numbers=True}{\minted@infilePNG}}%
+ \def\minted@cmdSVG{\minted@cmdtemplate{svg -P
+ linenos=True}{\minted@infileSVG}}%
+ \ifthenelse{\boolean{minted@cache}}%
+ {%
+ \ifminted@frozencache
+ \else
+ \ifx\XeTeXinterchartoks\minted@undefined
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}%
+ {\edef\minted@hash{\pdf@filemdfivesum{#1}%
+ \pdf@mdfivesum{\minted@cmd autogobble(\ifx\FancyVerbStartNum\z@
+ 0\else\FancyVerbStartNum\fi-\ifx\FancyVerbStopNum\z@
+ 0\else\FancyVerbStopNum\fi)}}}%
+ {\edef\minted@hash{\pdf@filemdfivesum{#1}%
+ \pdf@mdfivesum{\minted@cmd}}}%
+ \else
+ \ifx\mdfivesum\minted@undefined
+ \immediate\openout\minted@code\minted@jobname.mintedcmd\relax
+ \immediate\write\minted@code{\minted@cmd}%
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}%
+ {\immediate\write\minted@code{autogobble(\ifx\FancyVerbStartNum\z@
+ 0\else\FancyVerbStartNum\fi-\ifx\FancyVerbStopNum\z@
+ 0\else\FancyVerbStopNum\fi)}}{}%
+ \immediate\closeout\minted@code
+ \edef\minted@argone@esc{#1}%
+ \StrSubstitute{\minted@argone@esc}{\@backslashchar}{\@backslashchar\@backslashchar}[\minted@argone@esc]%
+ \StrSubstitute{\minted@argone@esc}{"}{\@backslashchar"}[\minted@argone@esc]%
+ \edef\minted@tmpfname@esc{\minted@outputdir\minted@jobname}%
+ \StrSubstitute{\minted@tmpfname@esc}{\@backslashchar}{\@backslashchar\@backslashchar}[\minted@tmpfname@esc]%
+ \StrSubstitute{\minted@tmpfname@esc}{"}{\@backslashchar"}[\minted@tmpfname@esc]%
+ %Cheating a little here by using ASCII codes to write `{` and `}`
+ %in the Python code
+ \def\minted@hashcmd{%
+ \detokenize{python -c "import hashlib; import os;
+ hasher = hashlib.sha1();
+ f =
+ open(os.path.expanduser(os.path.expandvars(\"}\minted@tmpfname@esc.mintedcmd\detokenize{\")),
+ \"rb\");
+ hasher.update(f.read());
+ f.close();
+ f =
+ open(os.path.expanduser(os.path.expandvars(\"}\minted@argone@esc\detokenize{\")),
+ \"rb\");
+ hasher.update(f.read());
+ f.close();
+ f =
+ open(os.path.expanduser(os.path.expandvars(\"}\minted@tmpfname@esc.mintedmd5\detokenize{\")),
+ \"w\");
+ macro = \"\\edef\\minted@hash\" + chr(123) + hasher.hexdigest()
+ + chr(125) + \"\";
+ f.write(\"\\makeatletter\" + macro +
+ \"\\makeatother\\endinput\n\");
+ f.close();"}}%
+ \ShellEscape{\minted@hashcmd}%
+ \minted@input{\minted@outputdir\minted@jobname.mintedmd5}%
+ \else
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}%
+ {\edef\minted@hash{\mdfivesum file {#1}%
+ \mdfivesum{\minted@cmd autogobble(\ifx\FancyVerbStartNum\z@
+ 0\else\FancyVerbStartNum\fi-\ifx\FancyVerbStopNum\z@
+ 0\else\FancyVerbStopNum\fi)}}}%
+ {\edef\minted@hash{\mdfivesum file {#1}%
+ \mdfivesum{\minted@cmd}}}%
+ \fi
+ \fi
+ \edef\minted@infile{\minted@cachedir/\minted@hash.pygtex}%
+ \edef\minted@temp@infileHTML{\minted@cachedir/\minted@hash.html}%
+ \global\cslet{minted@infileHTML\the\c@minted@pygmentizecounter}{\minted@temp@infileHTML}%
+ %\global\edef\minted@infilePNG{\minted@cachedir/\minted@hash.png}%
+ %\global\edef\minted@infileSVG{\minted@cachedir/\minted@hash.svg}%
+ \IfFileExists{\minted@infile}{}{%
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}{%
+ \minted@autogobble{#1}}{}%
+ \ShellEscape{\minted@cmd}%
+ \ShellEscape{\minted@cmdHTML}%
+ %\ShellEscape{\minted@cmdPNG}%
+ %\ShellEscape{\minted@cmdSVG}%
+ }%
+ \fi
+ \ifthenelse{\boolean{minted@finalizecache}}%
+ {%
+ \edef\minted@cachefilename{listing\arabic{minted@pygmentizecounter}.pygtex}%
+ \edef\minted@actualinfile{\minted@cachedir/\minted@cachefilename}%
+ \ifwindows
+ \StrSubstitute{\minted@infile}{/}{\@backslashchar}[\minted@infile@windows]
+ \StrSubstitute{\minted@actualinfile}{/}{\@backslashchar}[\minted@actualinfile@windows]
+ \ShellEscape{move /y
+ \minted@outputdir\minted@infile@windows\space\minted@outputdir\minted@actualinfile@windows}%
+ \else
+ \ShellEscape{mv -f
+ \minted@outputdir\minted@infile\space\minted@outputdir\minted@actualinfile}%
+ \fi
+ \let\minted@infile\minted@actualinfile
+ \expandafter\minted@addcachefile\expandafter{\minted@cachefilename}%
+ }%
+ {\ifthenelse{\boolean{minted@frozencache}}%
+ {%
+ \edef\minted@cachefilename{listing\arabic{minted@pygmentizecounter}.pygtex}%
+ \edef\minted@infile{\minted@cachedir/\minted@cachefilename}%
+ \expandafter\minted@addcachefile\expandafter{\minted@cachefilename}}%
+ {\expandafter\minted@addcachefile\expandafter{\minted@hash.pygtex}}%
+ }%
+ \minted@inputpyg}%
+ {%
+ \ifthenelse{\equal{\minted@get@opt{autogobble}{false}}{true}}{%
+ \minted@autogobble{#1}}{}%
+ \ShellEscape{\minted@cmd}%
+ \ShellEscape{\minted@cmdHTML}%
+ %\ShellEscape{\minted@cmdPNG}%
+ %\ShellEscape{\minted@cmdSVG}%
+ \minted@inputpyg}%
+ }%
+}{}%
+}%
+\html@action@newcommand{inputminted}[3][]{%
+ \message{moodle.sty: Processing \string\inputminted[#1]{#2}{#3} for HTML ^^J}%
+ % arguments #2 and #3 are thrown away: the job is done previously by minted when
+ % calling pygmentize. The file |\minted@infileHTML| generated with our hack will be used.
+ % Since minted is based upon `fvextra' the macro |\moodle@VerbatimInput| works here.
+ \minted@configlang{#2}% grab options set for this specific language
+ \setkeys{minted@opt@cmd}{#1}% grab options in #1
+ \minted@fvset% import options
+ \stepcounter{moodle@pygmentizecounter}
+ \xa\moodle@VerbatimInput\xa{\csname minted@infileHTML\the\c@moodle@pygmentizecounter\endcsname}%
+}%
+% \end{macrocode}
+%
+% \subsection{Warning users of \texttt{babel}}
+% Users of the |babel| package loaded with the 'french' option may experience problems
+% related to autospacing when using |pdfLaTeX|. We shall warn them.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \def\moodle@babel@german@warn{\PackageWarning{moodle}{Be careful when using moodle
+ and German-related babel package options. The symbol " is made active and your umlauts
+ will confuse moodle. You can either 1) compile with xelatex/lualatex with UTF-8 coded
+ characters or 2) avoid the babel option.}
+ }
+ \@ifpackagewith{babel}{german}{\moodle@babel@german@warn}{\relax}%
+ \@ifpackagewith{babel}{austrian}{\moodle@babel@german@warn}{\relax}%
+ \@ifpackagewith{babel}{swissgerman}{\moodle@babel@german@warn}{\relax}%
+ \@ifpackagewith{babel}{swissgerman.toss}{\moodle@babel@german@warn}{\relax}%
+ \@ifpackagewith{babel}{ngerman}{\moodle@babel@german@warn}{\relax}%
+ \@ifpackagewith{babel}{naustrian}{\moodle@babel@german@warn}{\relax}%
+ \@ifpackagewith{babel}{nswissgerman}{\moodle@babel@german@warn}{\relax}%
+ \@ifpackagewith{babel}{nswissgerman.toss}{\moodle@babel@german@warn}{\relax}%
+ \ifPDFTeX % pdflatex or latex
+ \@ifpackagewith{babel}{french}{%
+ \PackageWarning{moodle}{Be careful when using LaTeX, moodle, and the babel package with option 'french'. Autospacing produces in undesired symbols in the XML. You can either 1) compile with xelatex/lualatex or 2) add '\NoAutoSpacing' after '\begin{quiz}'.}%
+ }{\relax}%
+ \fi
+}%
+% \end{macrocode}
+%
%
% \Finale
\endinput
diff --git a/Master/texmf-dist/source/latex/moodle/moodle.ins b/Master/texmf-dist/source/latex/moodle/moodle.ins
index 16afd4503b5..b118c1beabc 100644
--- a/Master/texmf-dist/source/latex/moodle/moodle.ins
+++ b/Master/texmf-dist/source/latex/moodle/moodle.ins
@@ -1,5 +1,6 @@
%% moodle.ins
-%% Copyright 2016 by Anders O.F. Hendrickson
+%% Copyright 2016 by Anders O.F. Hendrickson and 2019-2021
+%% by Matthieu Guerquin-Kern.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -11,7 +12,7 @@
%%
%% This work has the LPPL maintenance status `maintained'.
%%
-%% The Current Maintainer of this work is Anders O.F. Hendrickson.
+%% The Current Maintainer of this work is Matthieu Guerquin-Kern.
%%
%% This work consists of the files moodle.dtx and moodle.ins
%% and the derived file moodle.sty.
@@ -25,7 +26,8 @@
This is a generated file.
-Copyright (C) 2016 by Anders Hendrickson <anders.hendrickson@snc.edu>
+Copyright 2016 by Anders O.F. Hendrickson (anders.o.f.hendrickson AT gmail.com)
+and 2019-2021 by Matthieu Guerquin-Kern (guerquin-kern AT crans.org).
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
diff --git a/Master/texmf-dist/source/latex/ms/everysel.drv b/Master/texmf-dist/source/latex/ms/everysel.drv
deleted file mode 100644
index ffe715702d1..00000000000
--- a/Master/texmf-dist/source/latex/ms/everysel.drv
+++ /dev/null
@@ -1,69 +0,0 @@
-%%
-%% This is file `everysel.drv',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% everysel.dtx (with options: `driver')
-%% Copyright (C) 1996..2009 Martin Schroeoder.
-%%
-%% This file is part of the EverySel package
-%% -----------------------------------------
-%%
-%% To produce the documentation in the way you like you are allowed
-%% to change this driver file.
-%%
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesFile{everysel.drv}
- [2009/05/30 v1.1 Driver for EverySelectfont Package (MS)]
-\documentclass[a4paper]{ltxdoc}
-\usepackage[T1]{fontenc}
-\usepackage{url}
-\usepackage[toc]{multitoc}
-\usepackage{lmodern,microtype,svn}
-\usepackage{hypdoc}
-\usepackage{geometry}
-\usepackage{everysel}
-\GetFileInfo{everysel.sty}
-\RecordChanges % Gather update information
-\EnableCrossrefs
-%%\DisableCrossrefs% Say \DisableCrossrefs if index is ready
-\CodelineIndex % Index code by line number
-%%\OldMakeIndex % use if your MakeIndex is pre-v2.9
-\setcounter{IndexColumns}{2}
-\makeatletter
- \renewenvironment{theglossary}{%
- \glossary@prologue
- \setlength\emergencystretch{5em}
- \GlossaryParms \let\item\@idxitem \ignorespaces}{}
-\makeatother
-\setlength{\IndexMin}{40ex}
-\setlength{\columnseprule}{.4pt}
-\addtolength{\oddsidemargin}{2cm}
-\addtolength{\textwidth}{-2cm}
-\raggedright % otherwise we get over/underfull hboxes
-\begin{document}
- \DocInput{everysel.dtx}
- \PrintIndex\PrintChanges
- % Make sure that the index is not printed twice
- % (ltxdoc.cfg might have a second \PrintIndex command)
- \let\PrintChanges\relax
-\end{document}
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
-\endinput
-%%
-%% End of file `everysel.drv'.
diff --git a/Master/texmf-dist/source/latex/ms/everysel.ins b/Master/texmf-dist/source/latex/ms/everysel.ins
deleted file mode 100644
index dab9e781a20..00000000000
--- a/Master/texmf-dist/source/latex/ms/everysel.ins
+++ /dev/null
@@ -1,108 +0,0 @@
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{everysel.ins}
- [2009/05/30 v1.1 Installation script for EverySelectfont Package (MS)]
-%%
-%% Copyright (C) 1996..2009 by Martin Schroeder.
-%%
-%% 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
-%% http://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 Martin Schr\"oder.
-%%
-%% This work consists of the files everysel.dtx and everysel.ins
-%% and the derived file everysel.sty.
-%%
-%% $Id: everysel.ins 1373 2009-05-30 20:22:19Z oneiros $
-%% --------------- start of docstrip commands ------------------
-\input docstrip.tex
-{\ifx\endbatchfile\undefined
-\Msg{**********************************************}
-\Msg{*}
-\Msg{* This installation requires docstrip}
-\Msg{* version 2.4d or later.}
-\Msg{*}
-\Msg{* An older version of docstrip has been input}
-\Msg{*}
-\Msg{**********************************************}
-\errhelp{Move or rename old docstrip.tex.}
-\errmessage{Old docstrip in input path}
-\batchmode
-\csname @@end\endcsname
-\fi}
-
-\Msg{***********************************************************}
-\Msg{*}
-\Msg{* The everysel distribution contains these files:}
-\Msg{*}
-\Msg{* \space\space everysel.dtx}
-\Msg{* \space\space everysel.ins}
-\Msg{*}
-\Msg{* If you receive only some of these files from someone, complain!}
-\Msg{*}
-\Msg{***********************************************************}
-
-\preamble
-
-Copyright (C) 1996..2009 by Martin Schroeder.
-
-This file is part of the EverySel package
------------------------------------------
-
-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
- http://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 Martin Schroeder.
-
-This work consists of the files everysel.dtx and everysel.ins
-and the derived file everysel.sty.
-
-\endpreamble
-\declarepreamble\driverpreamble
-Copyright (C) 1996..2009 Martin Schroeoder.
-
-This file is part of the EverySel package
------------------------------------------
-
-To produce the documentation in the way you like you are allowed
-to change this driver file.
-
-\endpreamble
-
-% Don't display progress
-\keepsilent
-\askforoverwritefalse
-\generate{\file{everysel.sty}{\from{everysel.dtx}{package}}
- \usepreamble\driverpreamble
- \file{everysel.drv}{\from{everysel.dtx}{driver}}
- }
-
-\Msg{***********************************************************}
-\Msg{*}
-\Msg{* To finish the installation you have to move the following}
-\Msg{* style files into a directory searched by TeX:}
-\Msg{*}
-\Msg{* \space\space everysel.sty}
-\Msg{*}
-\Msg{* To produce the documentation run the file everysel.drv}
-\Msg{* through LaTeX.}
-\Msg{*}
-\Msg{* Happy TeXing}
-\Msg{***********************************************************}
-\endbatchfile
-%%
-%% End of file `everysel.ins'.
-%% vim:tw=70:ts=2:syntax=tex
diff --git a/Master/texmf-dist/source/latex/ms/everyshi.drv b/Master/texmf-dist/source/latex/ms/everyshi.drv
deleted file mode 100644
index 66922029456..00000000000
--- a/Master/texmf-dist/source/latex/ms/everyshi.drv
+++ /dev/null
@@ -1,74 +0,0 @@
-%%
-%% This is file `everyshi.drv',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% everyshi.dtx (with options: `driver')
-%% This file is part of the EveryShi package
-%% -----------------------------------------
-%%
-%% Copyright (C) [1994..1999] Martin Schroder. All rights reserved.
-%%
-%% To produce the documentation in the way you like you are allowed
-%% to change this driver file.
-%% File: everyshi.dtx Copyright (C) 2001 Martin Schr\"oder
-\ProvidesFile{everyshi.drv}
- [1999/06/08 v2.03 Driver for EveryShipout Package (MS)]
-\documentclass{ltxdoc}
-\usepackage{url}
-\usepackage[toc]{multitoc}
-\usepackage{everyshi}
-\GetFileInfo{everyshi.sty}
-\setcounter{IndexColumns}{2}
-\EnableCrossrefs
-%%\DisableCrossrefs% Say \DisableCrossrefs if index is ready
-\CodelineIndex % Index code by line number
-\OnlyDescription % comment out for implementation details
-%%\OldMakeIndex % use if your MakeIndex is pre-v2.9
-\setcounter{IndexColumns}{2}
-\setlength{\IndexMin}{30ex}
-\setlength{\columnseprule}{.4pt}
-\begin{document}
- \DocInput{everyshi.dtx}
-\end{document}
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
-%%
-%% \iffalse meta-comment
-%% ===================================================================
-%% @LaTeX-package-file{
-%% author = {Martin Schr\"oder},
-%% version = "3.00",
-%% date = "15 May 2001",
-%% filename = "everyshi.sty",
-%% address = {Martin Schr\"oder
-%% Cr\"usemannallee 3
-%% 28213 Bremen
-%% Germany},
-%% telephone = "+49-421-2239425",
-%% email = "martin@oneiros.de",
-%% pgp-Key = "2048 bit / KeyID 292814E5",
-%% pgp-fingerprint = "7E86 6EC8 97FA 2995 82C3 FEA5 2719 090E",
-%% docstring = "LaTeX package which provides hooks into
-%% \cs{shipout}.
-%% }
-%% ===================================================================
-%% \fi
-
-\endinput
-%%
-%% End of file `everyshi.drv'.
diff --git a/Master/texmf-dist/source/latex/ms/everyshi.ins b/Master/texmf-dist/source/latex/ms/everyshi.ins
deleted file mode 100644
index be7a2398805..00000000000
--- a/Master/texmf-dist/source/latex/ms/everyshi.ins
+++ /dev/null
@@ -1,113 +0,0 @@
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{everysel.ins}
- [1998/06/08 v2.03 Installation script for EveryShipout Package (MS)]
-%%
-%% Copyright (C) [1994..1999] by Martin Schr"oder. All rights reserved.
-%%
-%% This program may be redistributed and/or modified under the terms
-%% of the LaTeX Project Public License, either version 1.0 of this
-%% license, or (at your option) any later version.
-%% The latest version of this license is in
-%% CTAN:macros/latex/base/lppl.txt.
-%%
-%% Happy users are requested to send me a postcard. :-)
-%%
-%% checksum = "36957 126 454 3799"
-%%
-%% 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.
-%%
-%% --------------- start of docstrip commands ------------------
-\input docstrip.tex
-{\ifx\endbatchfile\undefined
-\Msg{**********************************************}
-\Msg{*}
-\Msg{* This installation requires docstrip}
-\Msg{* version 2.4d or later.}
-\Msg{*}
-\Msg{* An older version of docstrip has been input}
-\Msg{*}
-\Msg{**********************************************}
-\errhelp{Move or rename old docstrip.tex.}
-\errmessage{Old docstrip in input path}
-\batchmode
-\csname @@end\endcsname
-\fi}
-
-\Msg{***********************************************************}
-\Msg{*}
-\Msg{* The everyshi distribution contains these files:}
-\Msg{*}
-\Msg{* \space\space everyshi.asc}
-\Msg{* \space\space everyshi.dtx}
-\Msg{* \space\space everyshi.dvi}
-\Msg{* \space\space everyshi.ins}
-\Msg{* \space\space everyshi.bug}
-\Msg{*}
-\Msg{* If you receive only some of these files from someone, complain!}
-\Msg{*}
-\Msg{***********************************************************}
-\preamble
-
-Copyright (C) [1994..1999] by Martin Schroeder. All rights reserved.
-
-This file is part of the EveryShi package
-
-This program may be redistributed and/or modified under the terms
-of the LaTeX Project Public License, either version 1.0 of this
-license, or (at your option) any later version.
-The latest version of this license is in
- CTAN:macros/latex/base/lppl.txt.
-
-Happy users are requested to send me a postcard. :-)
-
-The EveryShi package contains these files:
-
- everyshi.asc
- everyshi.dtx
- everyshi.dvi
- everyshi.ins
- everyshi.bug
-
-Error Reports in case of UNCHANGED versions to
-
- Martin Schr"oder
- Cr"usemannallee 3
- D-28213 Bremen
- Martin.Schroeder@ACM.org
-
-\endpreamble
-\declarepreamble\driverpreamble
-This file is part of the EveryShi package
------------------------------------------
-
-Copyright (C) [1994..1999] Martin Schroder. All rights reserved.
-
-To produce the documentation in the way you like you are allowed
-to change this driver file.
-\endpreamble
-
-\keepsilent
-\askforoverwritefalse
-\generate{\file{everyshi.sty}{\from{everyshi.dtx}{package}}
- \usepreamble\driverpreamble
- \file{everyshi.drv}{\from{everyshi.dtx}{driver}}
- }
-
-\Msg{***********************************************************}
-\Msg{*}
-\Msg{* To finish the installation you have to move the following}
-\Msg{* style files into a directory searched by TeX:}
-\Msg{*}
-\Msg{* \space\space everyshi.sty}
-\Msg{*}
-\Msg{* To produce the documentation run the file everysel.dtx}
-\Msg{* through LaTeX.}
-\Msg{*}
-\Msg{* Happy TeXing}
-\Msg{***********************************************************}
-\endbatchfile
-%%
-%% End of file `everyshi.ins'.
diff --git a/Master/texmf-dist/source/latex/ms/prelim2e.drv b/Master/texmf-dist/source/latex/ms/prelim2e.drv
deleted file mode 100644
index 4dd499b8d29..00000000000
--- a/Master/texmf-dist/source/latex/ms/prelim2e.drv
+++ /dev/null
@@ -1,89 +0,0 @@
-%%
-%% This is file `prelim2e.drv',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% prelim2e.dtx (with options: `driver')
-%%
-%% Copyright (C) 1995..2009 Martin Schroeder.
-%%
-%% This file is part of the Prelim2e package
-%% -----------------------------------------
-%%
-%% To produce the documentation in the way you like you are allowed
-%% to change this driver file.
-%%
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesFile{prelim2e.drv}
- [2009/05/29 v1.3 Driver for prelim2e Package (MS)]
-\documentclass[a4paper]{ltxdoc}
-\usepackage[T1]{fontenc}
-\usepackage{url}
-\usepackage[toc]{multitoc}
-\usepackage{lmodern,microtype,svn}
-\usepackage{hypdoc}
-\usepackage{geometry}
-\usepackage[scrtime]{prelim2e}
-\GetFileInfo{prelim2e.sty}
-\EnableCrossrefs
-\RecordChanges % Gather update information
-%%\DisableCrossrefs% Say \DisableCrossrefs if index is ready
-\CodelineIndex % Index code by line number
-%%\OldMakeIndex % use if your MakeIndex is pre-v2.9
-\setcounter{IndexColumns}{2}
-\makeatletter
- \renewenvironment{theglossary}{%
- \glossary@prologue
- \setlength\emergencystretch{5em}
- \GlossaryParms \let\item\@idxitem \ignorespaces}{}
-\makeatother
-\setlength{\IndexMin}{40ex}
-\setlength{\columnseprule}{.4pt}
-\addtolength{\oddsidemargin}{2cm}
-\addtolength{\textwidth}{-2cm}
-\begin{document}
- \DocInput{prelim2e.dtx}
- \PrintIndex\PrintChanges
- % Make sure that the index is not printed twice
- % (ltxdoc.cfg might have a second \PrintIndex command)
- \let\PrintChanges\relax
- \let\PrintIndex\relax
-\end{document}
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
-%%
-%% \iffalse meta-comment
-%% ===================================================================
-%% @LaTeX-package-file{
-%% author = {Martin Schr\"oder},
-%% version = "1.3",
-%% date = "29 May 2009",
-%% filename = "prelim2e.sty",
-%% address = {Martin Schr\"oder
-%% Barmer Stra\"se 14
-%% 44137 Dortmund
-%% Germany},
-%% telephone = "+49-231-1206574",
-%% email = "martin@oneiros.de",
-%% docstring = "LaTeX package which allows the marking of
-%% preliminary versions of a document."
-%% }
-%% ===================================================================
-%% \fi
-\endinput
-%%
-%% End of file `prelim2e.drv'.
diff --git a/Master/texmf-dist/source/latex/ms/prelim2e.ins b/Master/texmf-dist/source/latex/ms/prelim2e.ins
deleted file mode 100644
index 00a57b54699..00000000000
--- a/Master/texmf-dist/source/latex/ms/prelim2e.ins
+++ /dev/null
@@ -1,110 +0,0 @@
-%\NeedsTeXFormat{LaTeX2e}
-%\ProvidesFile{prelim2e.ins}
-% [2009/05/29 v1.3 Installation script for prelim2e Package (MS)]
-%%
-%% Copyright (C) 1995..2009 by Martin Schroeder.
-%%
-%% 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
-%% http://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 Martin Schr\"oder.
-%%
-%% This work consists of the files prelim2e.dtx and prelim2e.ins
-%% and the derived file prelim2e.sty.
-%%
-%% $Id: prelim2e.ins 1374 2009-05-30 20:23:36Z oneiros $
-%% --------------- start of docstrip commands ------------------
-\input docstrip.tex
-{\ifx\endbatchfile\undefined
-\Msg{**********************************************}
-\Msg{*}
-\Msg{* This installation requires docstrip}
-\Msg{* version 2.4d or later.}
-\Msg{*}
-\Msg{* An older version of docstrip has been input}
-\Msg{*}
-\Msg{**********************************************}
-\errhelp{Move or rename old docstrip.tex.}
-\errmessage{Old docstrip in input path}
-\batchmode
-\csname @@end\endcsname
-\fi}
-
-\Msg{***********************************************************}
-\Msg{*}
-\Msg{* The prelim2e distribution contains these files:}
-\Msg{*}
-\Msg{* \space\space prelim2e.dtx}
-\Msg{* \space\space prelim2e.ins}
-\Msg{*}
-\Msg{* If you receive only some of these files from someone, complain!}
-\Msg{*}
-\Msg{***********************************************************}
-
-\preamble
-
-Copyright (C) 1995..2009 by Martin Schroeder.
-
-This file is part of the Prelim2e package
------------------------------------------
-
-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
- http://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 Martin Schroeder.
-
-This work consists of the files prelim2e.dtx and prelim2e.ins
-and the derived file prelim2e.sty.
-
-\endpreamble
-\declarepreamble\driverpreamble
-
-Copyright (C) 1995..2009 Martin Schroeder.
-
-This file is part of the Prelim2e package
------------------------------------------
-
-To produce the documentation in the way you like you are allowed
-to change this driver file.
-
-\endpreamble
-
-
-% Don't display progress
-\keepsilent
-\askforoverwritefalse
-\generate{\file{prelim2e.sty}{\from{prelim2e.dtx}{package}}
- \usepreamble\driverpreamble
- \file{prelim2e.drv}{\from{prelim2e.dtx}{driver}}
- }
-
-\Msg{***********************************************************}
-\Msg{*}
-\Msg{* To finish the installation you have to move the following}
-\Msg{* files into a directory searched by TeX:}
-\Msg{*}
-\Msg{* \space\space prelim2e.sty}
-\Msg{*}
-\Msg{* To produce the documentation run the file prelim2e.drv}
-\Msg{* through LaTeX.}
-\Msg{*}
-\Msg{* Happy TeXing}
-\Msg{***********************************************************}
-\endbatchfile
-%%
-%% End of file `prelim2e.ins'.
-%% vim:syntax=tex:tw=70:ts=2
diff --git a/Master/texmf-dist/source/latex/muling/muling.dtx b/Master/texmf-dist/source/latex/muling/muling.dtx
new file mode 100644
index 00000000000..e7a5ccf9d19
--- /dev/null
+++ b/Master/texmf-dist/source/latex/muling/muling.dtx
@@ -0,0 +1,365 @@
+% \iffalse meta-comment
+%
+% File: muling.dtx
+% ---------------------------------------------------------------------------
+% Class: muling
+% Author: Niranjan
+% Description: A class file for the Department of Linguistics, University of
+% Mumbai
+% Repository: https://gitlab.com/niranjanvikastambe/muling
+% Bug tracker: https://gitlab.com/niranjanvikastambe/muling/-/issues
+% License: The LaTeX Project Public License v1.3c or later.
+% ---------------------------------------------------------------------------
+% 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
+%
+% http://www.latex-project.org/lppl.txt.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Niranjan.
+%
+% This work consists of the files muling.dtx
+% muling.ins
+% and the derived file muling.cls.
+% \fi
+% \iffalse
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+--------------------------------------------------------------------------
+Class: muling
+Author: Niranjan
+Version: 0.1 (12 November, 2020)
+Description: A class file for the Department of Linguistics, University of
+ Mumbai
+Repository: https://gitlab.com/niranjanvikastambe/muling
+Bug tracker: https://gitlab.com/niranjanvikastambe/muling/-/issues
+License: The LaTeX Project Public License v1.3c or later.
+--------------------------------------------------------------------------
+%</readme>
+%<*internal>
+\fi
+%</internal>
+%<*driver|class>
+\def\mulingClassName{muling}
+\def\mulingClassVersion{0.1}
+\def\mulingClassDate{2020/11/12}
+\def\mulingClassDescription{A class file for the Department of Linguistics,
+ University of Mumbai
+}
+%</driver|class>
+%<*driver>
+\documentclass{l3doc}
+\usepackage{hyperref}
+\usepackage{xcolor}
+\hypersetup{
+ colorlinks,
+ linkcolor=red!60!black,
+ citecolor=green!60!black,
+ urlcolor=blue!60!black
+}
+\usepackage{fontawesome5}
+\begin{document}
+\DocInput{\mulingClassName.dtx}
+\end{document}
+%</driver>
+% \fi
+% \title{The \cls{\mulingClassName} class}
+% \author{Niranjan}
+% \date^^A
+% {^^A
+% Version \mulingClassVersion\ --- \mulingClassDate\\[1ex]
+% {\small\faIcon{link}\quad\url{https://ctan.org/pkg/muling}}\\
+% {\small\faIcon{gitlab}\quad\url{https://gitlab.com/niranjanvikastambe/muling}}
+% }
+% \maketitle
+% \begin{abstract}
+% This is a class-file written for the students of the Department of
+% Linguistics, University of Mumbai. It uses the standard layout prescribed
+% by the university, loads some necessary packages for
+% typesetting a thesis in linguistics \textit{\&} adds the declaration
+% needed by the university from the submitter.
+% \end{abstract}
+% \tableofcontents
+% \begin{documentation}
+% \section{Package macros}
+% This package has the following commands. It is recommended to use all of
+% them in the preamble only.
+% \begin{function}{\subtitle}
+% \begin{syntax}
+% \cs{subtitle}\marg{a subtitle}
+% \end{syntax}
+% The subtitle is printed exactly under the title on the title page.
+% \end{function}
+% \begin{function}{\shorttitle}
+% \begin{syntax}
+% \cs{shorttitle}\marg{a short title}
+% \end{syntax}
+% The short title is printed on the top right corner of the page with the
+% year of submission.
+% \end{function}
+% \begin{function}{\supervisor}
+% \begin{syntax}
+% \cs{supervisor}\marg{name of the supervisor}
+% \end{syntax}
+% Name of the supervisor is printed on the title-page, in the declaration
+% text \textit{\&} under the name of the supervisor for the signature.
+% \end{function}
+% \section{Package options}
+% \begin{function}{digital}
+% This package option is developed for getting a read-only version of
+% the thesis. By default the thesis is formatted as a print-ready
+% document as the per the university requirements. If you want to submit a
+% digital copy of the thesis, use this option.
+% \end{function}
+% \begin{function}{lof}
+% This package option is developed for getting a list of figures after the
+% list of tables. Every thesis might not need a list of figures, therefore
+% it isn't added by default.
+% \end{function}
+% \section{Example code}
+% Try this sample document.
+% \begin{verbatim}
+% \documentclass[digital,lof]{muling} % Remove `digital' for a print-version.
+% \title{Linguistic profile of Konkani}
+% \author{Niranjan}
+% \supervisor{Dr.\ Renuka Ozarkar}
+% \shorttitle{Konkani}
+% \subtitle{Phonological \& morphological description of the Konkani language}
+%
+% \begin{document}
+% \maketitle
+%
+% \chapter{Test chapter}
+% \pex
+% Department of linguistics
+% \xe
+% \begin{center}
+% \begin{forest}
+% [NP
+% [\head{N}\\
+% Department]
+% [PP
+% [\head{P}\\
+% of]
+% [NP
+% [\head{N}\\
+% linguistics]
+% ]
+% ]
+% ]
+% \end{forest}
+% \end{center}
+% \end{document}
+% \end{verbatim}
+% \end{documentation}
+% \begin{implementation}
+% \section{Implementation}
+% \begin{macrocode}
+%<*class>
+% \end{macrocode}
+% \begin{macrocode}
+\ProvidesClass{muling}[2020/11/12 v0.1
+A class file for the Department of Linguistics,
+University of Mumbai]
+\DeclareOption{digital}{\PassOptionsToClass{oneside}{book}}
+\newif\iflof
+\DeclareOption{lof}{\loftrue}
+\ProcessOptions
+\iflof
+\def\@printlof{%
+ \thispagestyle{empty}%
+ \phantomsection
+ \addcontentsline{toc}{section}{List of figures}%
+ \listoffigures
+ \clearpage\pagebreak
+}%
+\else
+\let\@printlof\@empty
+\fi
+\LoadClass{book}
+% \end{macrocode}
+% This part of code loads the \cls{book} class \textit{\&} provides the option
+% \verb|digital| for typesetting a document with read-only format \textit{\&}
+% option \verb|lof| for automatically adding list of figures.
+% \begin{macrocode}
+\RequirePackage{hyperref}
+\hypersetup{
+ colorlinks,
+ linkcolor=red!60!black,
+ citecolor=green!60!black,
+ urlcolor=blue!60!black
+}
+\RequirePackage[backend=biber,style=apa]{biblatex}
+\RequirePackage[linguistics]{forest}
+\RequirePackage{tipa}
+\RequirePackage{leipzig}
+\RequirePackage{expex}
+\RequirePackage{ling-macros}
+% \end{macrocode}
+% This part of code loads some other essential packages for typesetting
+% documents with linguistic content.
+% \begin{macrocode}
+\makeatletter
+\let\@supervisor\@empty
+\def\supervisor#1{%
+ \def\@supervisor{#1}%
+}%
+\let\@shorttitle\@empty
+\def\shorttitle#1{%
+ \def\@shorttitle{#1}%
+}%
+\let\@subtitle\@empty
+\def\subtitle#1{%
+ \def\@subtitle{#1}%
+}%
+% \end{macrocode}
+% This code enables three additional entries required in the title-page.
+% \textit{\&} at various other places.
+% \begin{macrocode}
+\RequirePackage{fancyhdr}
+\pagestyle{fancy}
+\cfoot{\thepage}
+\rhead{}
+\lhead{%
+ \begin{tabular}{l}
+ \@author\\%
+ \textsc{%
+ \footnotesize University of Mumbai%
+ }%
+ \end{tabular}%
+ \hfill
+ \@shorttitle
+}%
+% \end{macrocode}
+% This part of code adds the name of the author, the name of the university and
+% a short-title with the year of submission at the top right corner of every
+% page. \href{https://tex.stackexchange.com/a/525452/174620}{This} answer helped
+% me for developing this code.
+% \begin{macrocode}
+\newlength{\shift}
+\setlength{\shift}{0.3in}
+% \end{macrocode}
+% A new length is created for typesetting the title-page at the center of the
+% page like in the \cls{article}
+% class. \href{https://tex.stackexchange.com/a/514536/174620}{This} answer
+% helped me for developing this code.
+% \begin{macrocode}
+\renewcommand{\maketitle}{%
+ \thispagestyle{empty}%
+ \addtolength{\oddsidemargin}{\shift}%
+ \fboxsep3em
+ \noindent\fbox{%
+ \begin{minipage}
+ [c][\dimexpr\textheight-2\fboxsep-2\fboxrule]
+ [c]{\dimexpr\linewidth-2\fboxsep-2\fboxrule}
+ \begin{center}
+ \bigskip
+ \hrule
+ \vspace{2ex}
+ \textbf{%
+ {\LARGE \@title}\\%
+ \vspace{0.2cm}%
+ {\textsc\@subtitle}%
+ }
+ \vspace{2ex}
+ \hrule
+ \vfill
+ {\large
+ \textsc{%
+ \@author%
+ }%
+ }\\%
+ \vspace{0.5in}%
+ {\large
+ \textsc{%
+ supervisor : \@supervisor%
+ }%
+ }\\%
+ \vspace{0.5in}%
+ {\large
+ \textsc{%
+ a dissertation submitted in\\ the partial fulfillment of the
+ requirements for the masters of linguistics%
+ }%
+ }\\%
+ \vspace{0.5in}%
+ \textsc{%
+ department of linguistics\\%
+ university of mumbai, kalina%
+ }\\%
+ \smallskip
+ \bigskip
+ \textsc{\@date}%
+ \end{center}
+ \end{minipage}
+ \makeatother
+ \addtolength{\oddsidemargin}{-\shift}
+ }
+ \clearpage\pagebreak
+ \thispagestyle{empty}
+ \tableofcontents
+ \clearpage\pagebreak
+ \thispagestyle{empty}
+ \phantomsection
+ \addcontentsline{toc}{section}{Abbreviations}
+ \printglossary
+ \clearpage\pagebreak
+ \thispagestyle{empty}
+ \phantomsection
+ \addcontentsline{toc}{section}{List of tables}
+ \listoftables
+ \clearpage\pagebreak
+ \thispagestyle{empty}
+ \phantomsection
+ \begin{center}
+ \texttt{%
+ \LARGE
+ \textsc{%
+ declaration%
+ }%
+ }%
+ \end{center}
+ \bigskip
+ \texttt{%
+ As required by the University Regulation No: R. 1972 I wish to state that the
+ work embodied in this thesis titled \@title{} : \@subtitle{} forms my own
+ contribution to the research work carried out under the guidance of
+ \@supervisor{} at the University of Mumbai.\\
+ \indent This work has not been submitted for any other degree of this or any
+ other university. Whenever references have been made to previous works of
+ others, it has been clearly indicated as such and included in the
+ bibliography.\\
+ \bigskip
+ \texttt{%
+ \flushright{%
+ Date : \@date\\
+ \vspace{0.5in}
+ }%
+ Signature of the candidate :\\
+ \hfill Name : \@author
+ }\\%
+ \bigskip
+ \flushleft{%
+ Certified by -\\
+ \vspace{0.5in}
+ Signature of the guide :\\
+ Name : \@supervisor
+ }%
+ }%
+}%
+% \end{macrocode}
+% This code typesets a customized title-page, adds a table of contents, list of
+% tables\footnote{Having a list of figures is optional as seen earlier.} and the
+% declaration text with all the details filled \textit{\&} some blank space left
+% for the signature.
+% \begin{macrocode}
+%</class>
+% \end{macrocode}
+% \end{implementation}
+% \Finale \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/muling/muling.ins b/Master/texmf-dist/source/latex/muling/muling.ins
new file mode 100644
index 00000000000..f833ba10ace
--- /dev/null
+++ b/Master/texmf-dist/source/latex/muling/muling.ins
@@ -0,0 +1,48 @@
+% File: muling.ins
+\input l3docstrip.tex
+
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+---------------------------------------------------------------------------
+Class: muling
+Author: Niranjan
+Description: A class file for the Department of Linguistics, University of
+ Mumbai
+Repository: https://gitlab.com/niranjanvikastambe/muling
+Bug tracker: https://gitlab.com/niranjanvikastambe/muling/-/issues
+License: The LaTeX Project Public License v1.3c or later.
+---------------------------------------------------------------------------
+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
+
+ http://www.latex-project.org/lppl.txt.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is Niranjan.
+
+This work consists of the files muling.dtx
+ muling.ins
+and the derived file muling.cls.
+---------------------------------------------------------------------------
+
+\endpreamble
+
+\usedir{tex/latex/\jobname}
+\generate{
+ \file{\jobname.cls}{\from{\jobname.dtx}{class}}
+}
+
+\nopreamble\nopostamble
+\usedir{doc/latex/\jobname}
+\generate{
+ \file{README.txt}{\from{\jobname.dtx}{readme}}
+}
+
+\endbatchfile \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/multicolrule/multicolrule.dtx b/Master/texmf-dist/source/latex/multicolrule/multicolrule.dtx
index ac6d017a183..33c04e76a5c 100644
--- a/Master/texmf-dist/source/latex/multicolrule/multicolrule.dtx
+++ b/Master/texmf-dist/source/latex/multicolrule/multicolrule.dtx
@@ -54,7 +54,7 @@ See http://www.latex-project.org/lppl.txt
\endpreamble
\postamble
-Copyright (C) 2018-2019 by Karl Hagen <latex@polysyllabic.com>
+Copyright (C) 2018-2020 by Karl Hagen <latex@polysyllabic.com>
This file may be distributed and/or modified under the
conditions of the LaTeX Project Public License (LPPL), either
@@ -276,11 +276,10 @@ and the derived files multicolrule.ins,
% or the \LaTeX{} kernel, depending on the mode of operation. If \pkg{bidi} is
% loaded, it will also patch that. It will have no effect if you use a class or
% package that outputs column text via alternate mechanisms. This includes
-% \pkg{parcolumns}, and probably other classes and packages designed to typeset
-% parallel-column text as well, although I have not done a survey to determine
-% whether this is the case. If you would like support for one of these, please
-% send me an email or file a feature request on github and I'll see what I can
-% do.
+% \pkg{parcolumns}, \pkg{paracol}, and probably any other class that does its
+% own multi-column formatting. If you would like support for one of these,
+% please send me an email or file a feature request on github and I'll see what
+% I can do.
%
% The line styles that work by repeating elements in a tiled pattern may have
% significant gaps at the end of columns, particularly for larger patterns.
@@ -302,7 +301,7 @@ and the derived files multicolrule.ins,
% \begin{multicols}{2}[\subsection{License}]
% \SetMCRule{width=ultra-thick,line-style=dotted}
% The\stydsc{\texttt{line-style=dotted, width=ultra-thick}} \mcrule{}
-% package is copyright 2018--2019 by Karl Hagen. It may be distributed and/or
+% package is copyright 2018--2020 by Karl Hagen. 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
@@ -333,12 +332,12 @@ and the derived files multicolrule.ins,
% others look better with it. The default behavior of \mcrule{} depends on the
% status of the \pkg{tikz} package at the time \mcrule{} is loaded. If
% \mcrule{} detects that \pkg{tikz} is already loaded, then tikz support will
-% be enabled by default. Otherwise, you need the \opt{tikz} to enable it. This
-% option also accepts explicit boolean values, so you can pass |tikz=false| if
-% you want to explicitly disable tikz support. If tikz support is not enabled
-% (or if it is explicitly disabled), the line styles marked \emph{tikz only}
-% in section \ref{sec:linestyles} will be unavailable and errors will result
-% if you try to use them.
+% be enabled by default. Otherwise, you need to provide the \opt{tikz} option
+% to enable it. This option also accepts explicit boolean values, so you can
+% pass |tikz=false| if you want to explicitly disable tikz support. If tikz
+% support is not enabled (or if it is explicitly disabled), the line styles
+% marked \emph{tikz only} in section \ref{sec:linestyles} will be unavailable
+% and errors will result if you try to use them.
%
% \subsection{Option `twocolumn'}
% \DescribeOption{twocolumn}
@@ -380,7 +379,7 @@ and the derived files multicolrule.ins,
% a page unless you close out one \env{multicols} environment and begin another.
%
% Table \ref{table:mcrulekeys} summarizes the keys available in \cs{SetMCRule}.
-% The functions of each is described in detail in the sections that follow.
+% The functions of each are described in detail in the sections that follow.
% \end{multicols}
%
% \begin{longtable}{lp{3.5in}}
@@ -569,7 +568,7 @@ and the derived files multicolrule.ins,
%
% The rule in this section uses the \cs{SparkleBold} symbol from
% \pkg{bbding}. Notice that when you use the \kvdesc{custom-tile} parameter,
-% of any of the other custom key commands, you do \emph{not} specify a separate
+% or any of the other custom key commands, you do \emph{not} specify a separate
% \kvdesc{line-style}. If you try to provide both, the last style given in the
% list will be the one that is kept.
% \end{multicols}
@@ -891,7 +890,7 @@ and the derived files multicolrule.ins,
%\subsection{Preliminaries}
%
% \begin{macrocode}
-\ProvidesExplPackage {multicolrule} {2019/10/01} {1.3}
+\ProvidesExplPackage {multicolrule} {2020/09/14} {1.3a}
{Decorative vertical rules between columns}
% \end{macrocode}
%
@@ -922,6 +921,7 @@ and the derived files multicolrule.ins,
% \begin{macrocode}
\bool_new:N \g_@@_twocolumn_bool
\bool_new:N \g_@@_use_tikz_bool
+\bool_new:N \g_@@_paracol_bool
% \end{macrocode}
%\end{variable}
%
@@ -987,8 +987,11 @@ and the derived files multicolrule.ins,
\keys_define:nn {mcrule-opts}
{
twocolumn .bool_gset:N = \g_@@_twocolumn_bool,
+ twocolumn .default:n = true,
tikz .bool_gset:N = \g_@@_use_tikz_bool,
tikz .default:n = true,
+ paracol .bool_gset:N = \g_@@_paracol_bool,
+ paracol .default:n = true,
}
\ProcessKeysOptions{mcrule-opts}
% \end{macrocode}
@@ -1102,9 +1105,10 @@ and the derived files multicolrule.ins,
% after \pkg{xcolor}, \pkg{tikz}, \emph{and} \pkg{multicol}, so it must always
% be loaded after us. We use \cs{AfterPackage} from \pkg{scrlfile} to insert
% the patch if \pkg{bidi} is loaded later on.
+% \changes{v1.3a}{2020/9/14}{Update scrlfile command because of API change in that package.}
%
% \begin{macrocode}
- \AfterPackage!{bidi}
+ \AfterAtEndOfPackage*{bidi}
{
\@@_patch_twocol_output:N \RTL@outputdblcol
\@@_patch_twocol_output:N \LTR@outputdblcol
@@ -1771,6 +1775,10 @@ and the derived files multicolrule.ins,
% \end{macrocode}
%\end{macro}
%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
%\end{implementation}
%
% \PrintChanges
diff --git a/Master/texmf-dist/source/latex/multicolrule/multicolrule.ins b/Master/texmf-dist/source/latex/multicolrule/multicolrule.ins
deleted file mode 100644
index 6d74aaf21d0..00000000000
--- a/Master/texmf-dist/source/latex/multicolrule/multicolrule.ins
+++ /dev/null
@@ -1,71 +0,0 @@
-%%
-%% This is file `multicolrule.ins',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% multicolrule.dtx (with options: `install')
-%% ----------------------------------------------------------------
-%% multicolrule --- Decorative rules between columns
-%% Author: Karl Hagen
-%% Email: latex@polysyllabic.com
-%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
-%% ----------------------------------------------------------------
-%%
-\input l3docstrip.tex
-\keepsilent
-\askforoverwritefalse
-\preamble
-----------------------------------------------------------------
-multicolrule --- Decorative rules between columns
-Author: Karl Hagen
-Email: latex@polysyllabic.com
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
-\endpreamble
-\postamble
-Copyright (C) 2018-2019 by Karl Hagen <latex@polysyllabic.com>
-
-This file may be distributed and/or modified under the
-conditions of the LaTeX Project Public License (LPPL), either
-version 1.3c of this license or (at your option) any later
-version. The latest version of this license is in the file:
- https://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
- Karl Hagen.
-
-This work consists of the files multicolrule.dtx and
- mcrule-examples.tex,
-and the derived files multicolrule.ins,
- multicolrule.sty,
- multicolrule.pdf, and
- mcrule-examples.pdf.
-\endpostamble
-\usedir{tex/latex/multicolrule}
-\generate{
- \file{\jobname.sty}{\from{\jobname.dtx}{package}}
-}
-\endbatchfile
-%% Copyright (C) 2018-2019 by Karl Hagen <latex@polysyllabic.com>
-%%
-%% This file may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License (LPPL), either
-%% version 1.3c of this license or (at your option) any later
-%% version. The latest version of this license is in the file:
-%% https://www.latex-project.org/lppl.txt
-%%
-%% This work is "maintained" (as per LPPL maintenance status) by
-%% Karl Hagen.
-%%
-%% This work consists of the files multicolrule.dtx and
-%% mcrule-examples.tex,
-%% and the derived files multicolrule.ins,
-%% multicolrule.sty,
-%% multicolrule.pdf, and
-%% mcrule-examples.pdf.
-%%
-%% End of file `multicolrule.ins'.
diff --git a/Master/texmf-dist/source/latex/multirow/multirow.dtx b/Master/texmf-dist/source/latex/multirow/multirow.dtx
index a91cb832ec0..139e0ed25b5 100644
--- a/Master/texmf-dist/source/latex/multirow/multirow.dtx
+++ b/Master/texmf-dist/source/latex/multirow/multirow.dtx
@@ -1,9 +1,9 @@
% \iffalse meta-comment
%
% Parts of this file, Copyright (C) 1994 by Jerry Leichter
-% Copyright (C) 2016, 2018, 2019 by Piet van Oostrum <piet@vanoostrum.org>
+% Copyright (C) 2016-2021 by Pieter van Oostrum <pieter@vanoostrum.org>
% -------------------------------------------------------
-%
+%
% This file 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.
@@ -11,7 +11,7 @@
%
% http://www.latex-project.org/lppl.txt
%
-% and version 1.3 or later is part of all distributions of LaTeX
+% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% \fi
@@ -21,10 +21,10 @@
\ProvidesFile{\jobname.dtx}
%</driver>
% This is the variable part of the preamble
-%
+%
%<multirow|bigstrut>%% Copyright (C) 1994 by Jerry Leichter
%<bigdelim>%% Copyright (C) 1994 by \O ystein Bache
-%% Copyright (C) 2016 , 2018, 2019 by Piet van Oostrum <piet@vanoostrum.org>
+%% Copyright (C) 2016-2021 by Pieter van Oostrum <pieter@vanoostrum.org>
%%
%
% \begin{macrocode}
@@ -32,7 +32,7 @@
%<multirow>\ProvidesPackage{multirow}%
%<bigstrut>\ProvidesPackage{bigstrut}
%<bigdelim>\ProvidesPackage{bigdelim}
-%<multirow|bigstrut|bigdelim> [2019/05/31 v2.5
+%<multirow|bigstrut|bigdelim> [2021/01/29 v2.7
%<multirow> Span multiple rows of a table]%
%<bigstrut> Provide larger struts in tabulars]
%<bigdelim> Create big delimiters in tabular or array]
@@ -42,22 +42,23 @@
\documentclass[a4paper]{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage{multirow,bigstrut,bigdelim,colortbl}
+\usepackage[table]{xcolor}
\usepackage{tabulary}
\usepackage{longtable}
\usepackage{booktabs}
\usepackage{calc}
\usepackage{url}
+\usepackage[colorlinks, urlcolor=blue, linktocpage]{hyperref}
\usepackage{tikz}
\usepackage{hhline}
-\usepackage{color}
\usepackage{etoolbox}
\AtBeginEnvironment{macrocode}{\color{red}}
\newcommand{\minitab}[2][l]{\begin{tabular}{#1}#2\end{tabular}}
\DisableCrossrefs
\CodelineIndex
\RecordChanges
-\let\environment\texttt
-\let\Package\textsf
+\newcommand{\env}[1]{\texttt{#1}}
+\newcommand{\Package}[1]{\textsf{#1}}
\def\bsbs{\cs{\char`\\}}
\begin{document}
\DeleteShortVerb{\|}
@@ -102,7 +103,7 @@
% \title{The \Package{multirow},
% \Package{bigstrut} and
% \Package{bigdelim} packages}
-% \author{Piet van Oostrum\thanks{catalogued ``active author''}\\
+% \author{Pieter van Oostrum\thanks{catalogued ``active author''}\\
% \O ystein Bache\\
% Jerry Leichter\thanks{Documentation originally put together by Robin
% Fairbairns}}
@@ -115,7 +116,7 @@
%
% \section{Introduction}
% These packages offer a series of extensions to the standard \LaTeX{}
-% \texttt{tabular} environment. Their respective functions are:
+% \env{tabular} environment. Their respective functions are:
% \begin{description}
% \item[\Package{multirow}] which provides a construction for table cells
% that span more than one row of the table;
@@ -129,6 +130,29 @@
% \section{Changes in version 2}
% \label{sec:changes-2}
%
+%\subsection*{version 2.7}
+%
+%\begin{itemize}
+%\item Make \cs{@xmultirow} and \cs{multirow@setcolwidth} \cs{long} to allow
+% multi-paragraph text.
+% See \url{https://github.com/pietvo/multirow/issues/1}
+%\end{itemize}
+%
+%\subsection*{version 2.6}
+%
+% \begin{itemize}
+% \item Make the \texttt{supertabular} option compatible with newer
+% versions of the \Package{supertabular} package
+% \item Initialize \cs{@arstrutbox} when not defined, to enable some
+% uses of the big delims outside of an \env{array} or \env{tabular}.
+% \end{itemize}
+%
+%\subsection*{version 2.5a}
+%
+% \begin{itemize}
+% \item Changed contact information
+% \end{itemize}
+%
%\subsection*{version 2.5}
%
% \begin{itemize}
@@ -155,7 +179,7 @@
% \begin{itemize}
% \item Support for fractional values of \meta{nrows}.
% \end{itemize}
-%
+%
%\subsection*{version 2.0}
%
% \begin{itemize}
@@ -178,7 +202,7 @@
% \section{Using \Package{multirow}}\label{sec:multirow}
%
% \DescribeMacro{\multirow}
-% \cs{multirow} sets a piece of text in a \environment{tabular} or
+% \cs{multirow} sets a piece of text in a \env{tabular} or
% similar environment, spanning multiple rows. We will call the block of
% rows and columns that the text spans the multirow block. Usually this
% covers one column, but by combining it with \cs{multicolumn} more
@@ -229,13 +253,13 @@
%
% If the width was given as \texttt{*} the text will be set in LR
% mode. If you want a multiline entry in this case you could use a
-% \texttt{tabular} or \texttt{array} environment in the text
-% parameter. See for example the \environment{minitab} below.
+% \env{tabular} or \env{array} environment in the text
+% parameter. See for example the \env{minitab} below.
%
% The width can also be given as \texttt{=} when the \cs{multirow} entry is given in a
% column that has a defined width, for example in a \texttt{p\{\}} column, an
-% \texttt{X} column in \environment{tabularx} or a \texttt{L}, \texttt{C},
-% \texttt{R} or \texttt{J} column in a \environment{tabulary} environment.
+% \texttt{X} column in \env{tabularx} or a \texttt{L}, \texttt{C},
+% \texttt{R} or \texttt{J} column in a \env{tabulary} environment.
% The text will be set in a \cs{parbox} of that width.
% If you give ``\texttt{=}'' in other situations, you will get strange
% results (usually a too wide column).
@@ -248,11 +272,11 @@
% document writer to include the \Package{calc} package;
% \Package{multirow} does not do this.
%
-% N.B. \cs{multirow} can be used in the \environment{tabular} environment and
-% most derivatives of it, for example \environment{tabularx},
-% \environment{tabulary}, \environment{supertabular}, \environment{ltablex},
-% \environment{xtab}, \environment{longtable}, \environment{tabu},
-% \environment{booktabs} and \environment{ctable}. For some of these you
+% N.B. \cs{multirow} can be used in the \env{tabular} environment and
+% most derivatives of it, for example \env{tabularx},
+% \env{tabulary}, \env{supertabular}, \env{ltablex},
+% \env{xtab}, \env{longtable}, \env{tabu},
+% \env{booktabs} and \env{ctable}. For some of these you
% have to pay special attention to certain cases, see below.
%
% \DescribeMacro{\multirowsetup}
@@ -371,7 +395,7 @@
% \end{quote}
% \vspace{1ex}
% An example with the ``\texttt{=}'' \meta{width} specifier in a
-% \environment{tabulary} (Note: The braces around the \texttt{=} may be omitted):
+% \env{tabulary} (Note: The braces around the \texttt{=} may be omitted):
%
% \begin{quote}
% \index{extrarowheight=\verb!*+\extrarowheight+|usage}
@@ -506,8 +530,8 @@
% chance that the \meta{vmove} will still be correct if you change the point
% size.)
%
-% \cs{multirow} is mainly designed for use with \environment{tabular}, as
-% opposed to \environment{array}, environments. It might not work well in an
+% \cs{multirow} is mainly designed for use with \env{tabular}, as
+% opposed to \env{array}, environments. It might not work well in an
% array environment if there are big formulas in some rows; in that case you can use the
% \meta{vmove} parameter to refine the result.
%
@@ -526,7 +550,7 @@
% . . .
% \begin{tabular}{cll}
% \toprule
-% \multirow[t]{5}{*}[-\shiftdown]{\Huge\bfseries B}
+% \multirow[t]{5}{*}[-\shiftdown]{\Huge\bfseries B}
% & foo & Lorem ipsum dolor sit \\
% & bar & Maecenas sed purus \\
% & baz & Nullam luctus id tellus \\
@@ -541,7 +565,7 @@
% \setlength{\shiftdown}{\heightof{\Huge\bfseries B}-\heightof{f}}
% \begin{tabular}{cll}
% \toprule
-% \multirow[t]{5}{*}[-\shiftdown]{\Huge\bfseries B}
+% \multirow[t]{5}{*}[-\shiftdown]{\Huge\bfseries B}
% & foo & Lorem ipsum dolor sit \\
% & bar & Maecenas sed purus \\
% & baz & Nullam luctus id tellus \\
@@ -554,8 +578,10 @@
%
% \subsection{Multirow and colored cells}\label{sec:mult-color-cells}
%
-% If you use \cs{multirow} with the \Package{colortbl} package you have
+% If you use \cs{multirow} with the \Package{colortbl} package (or the
% \index{colortbl=\Package{colortbl}|usage}
+% \Package{xcolor} package with the \texttt{[table]} option) you have
+% \index{xcolor=\Package{xcolor}|usage}
% to take precautions if you want to color the column that has the
% \cs{multirow} in it. The \Package{colortbl} package works by coloring each cell
% separately. So if you use \cs{multirow} with a positive \meta{nrows}
@@ -646,7 +672,7 @@
%
% \cs{multirow} can calculate the height of the required multirow box
% from \meta{nrows} and \meta{bigstruts}, supposed that all the rows
-% don't have ``unusual heights. However, there are cases when this is
+% don't have ``unusual'' heights. However, there are cases when this is
% not enough to properly position the box, especially when there is a
% \cs{bigstrut} on top of the first row and/or one on the bottom of the
% last row. In that case \cs{multirow} should be given additional
@@ -754,10 +780,10 @@
% \subsection{Use with \Package{longtable}}
% \label{sec:use-with-longtable}
%
-% \index{longtable=\environment{longtable}|usage}
-% \index{longtabu=\environment{longtabu}|usage}
-% It is possible to use \cs{multirow} in a \environment{longtable}
-% environment (as well as in its descendent \environment{longtabu}).
+% \index{longtable=\env{longtable}|usage}
+% \index{longtabu=\env{longtabu}|usage}
+% It is possible to use \cs{multirow} in a \env{longtable}
+% environment (as well as in its descendent \env{longtabu}).
% However, care must be taken that the longtable doesn't break the
% multirow entry when it is near the bottom of the page. For example:
%
@@ -828,8 +854,8 @@
% \subsection{Use with \Package{supertabular}}
% \label{sec:use-with-supertabular}
%
-% \index{supertabular=\environment{supertabular}|usage}
-% \index{xtab=\environment{xtab}|usage}
+% \index{supertabular=\env{supertabular}|usage}
+% \index{xtab=\env{xtab}|usage}
% With the package \Package{supertabular} (or the augmented version
% \Package{xtab}) there is the same requirement
% to keep the rows of a multirow together when a pagebreak occurs.
@@ -838,16 +864,16 @@
% suppress a pagebreak.
% Therefore \Package{multirow} provides a package option
% \texttt{supertabular} that redefines \verb+\\*+ inside a
-% \environment{supertabular} to suppress the pagebreak. You should use
+% \env{supertabular} to suppress the pagebreak. You should use
% this to end the intermediate rows in a multirow block. However, this
-% does not cause \environment{supertabular} to consider breaking the
-% page before the \cs{multirow}, contrary to \environment{longtable}.
+% does not cause \env{supertabular} to consider breaking the
+% page before the \cs{multirow}, contrary to \env{longtable}.
% Thus the table may become too long.
%
% \DescribeMacro{\STneed}
% Therefore when the \texttt{supertabular} option is given,
% \Package{multirow} also provides a command \cs{STneed} to be used
-% in a \environment{supertabular} that specifies how much space we need
+% in a \env{supertabular} that specifies how much space we need
% on the page. Then if there is not enough space, a pagebreak will occur
% at that place. For example:
% \begin{verbatim}
@@ -1074,7 +1100,7 @@
% \cs{bigstrut} in each row, that is 16pt per row, and as a \cs{bigstrut} is
% 2\cs{bigstrutjot}s, we set \cs{bigstrutjot} to 8pt. The
% \Package{booktabs} package adds some extra vertical space around the rules,
-% therefore when using the normal \environment{tabular} environment, it
+% therefore when using the normal \env{tabular} environment, it
% is probably better to make the struts a little bit bigger, or a bit
% smaller with \Package{booktabs}. After some experimentation it appeared
% that a \cs{bigstrutjot} of \texttt{7pt} was enough. Of course we added
@@ -1082,7 +1108,7 @@
% multirow. Please note that this is not possible with our own struts,
% unless we cheat.
%
-% \index{booktabs=\environment{booktabs}|usage}
+% \index{booktabs=\env{booktabs}|usage}
% Now with \Package{booktabs} the code becomes:
% \begin{verbatim}
% \newcommand{\mystrut}{\rule[-8pt]{0pt}{20pt}}
@@ -1157,7 +1183,7 @@
% \DescribeMacro{\bigstrutjot}
% \cs{bigstrut}\oarg{x} produces a strut (a rule with width 0) which is \cs{bigstrutjot}
% (\texttt{2pt} by default) higher, lower, or both than the standard
-% array/tabular strut. Use it in table entries that are adjacent to
+% \env{array}/\env{tabular} strut. Use it in table entries that are adjacent to
% \cs{hline}s to leave an extra bit of space\,---\,according to the
% TeXbook (page 246), ``This is a little touch that improves the
% appearance of boxed tables; look for it as a mark of quality.''
@@ -1186,7 +1212,7 @@
%
% \section{Using \Package{bigdelim}}
%
-% The package is for working in a \environment{tabular} or \environment{array}
+% The package is for working in a \env{tabular} or \env{array}
% environment, in which the \Package{multirow} package is also used.
%
% \DescribeMacro{\ldelim}
@@ -1196,8 +1222,8 @@
% \cs{ldelim} ( \marg{n}\marg{width}\oarg{text}\\
% \cs{rdelim} ) \marg{n}\marg{width}\oarg{text}
% \end{quote}
-% The commands are used in a column of a \environment{tabular} or
-% \environment{array}; they create a big parenthesis, brace or whatever
+% The commands are used in a column of a \env{tabular} or
+% \env{array}; they create a big parenthesis, brace or whatever
% delimiter that extends over the \meta{n} rows starting at the one
% containing the command. Corresponding cells in the following rows
% must be explicitly given as empty cells.
@@ -1285,14 +1311,97 @@
% Also the commands may be
% used in the last row of the extension with a negative \meta{n}
% \index{colortbl=\Package{colortbl}|usage}
-% argument. This is useful in combination with \Package{colortbl} (see
-% the discussion in section \ref{sec:multirow} on \Package{multirow}).
+% argument. This is useful in combination with the \Package{colortbl}
+% \index{xcolor=\Package{xcolor}|usage}
+% or \Package{xcolor} packages
+% (see the discussion in section \ref{sec:multirow} on \Package{multirow}).
% If there are unusually tall rows you may have to enlarge \meta{n}
% (you can use fractional values).
% If you have horizontal lines that interact with the braces you are
% \index{hhline=\Package{hhline}|usage}
% advised to use the \Package{hhline} package to make the lines.
%
+% If you decrease or eliminate the intercolumn space with \verb|@{}| and
+% use colored backgrounds with the \Package{colortbl} or
+% \Package{xcolor} packages (commands \verb|\columncolor|,
+% \verb|\rowcolor|, \verb|\rowcolors| or \verb|\cellcolor|),
+% \index{columncolor=\verb!*+\columncolor+|usage}
+% \index{rowcolor=\verb!*+\rowcolor+|usage}
+% \index{rowcolors=\verb!*+\rowcolors+|usage}
+% \index{cellcolor=\verb!*+\cellcolor+|usage}
+% you will notice that part of the brace will be cut off. In reality it
+% will be overwritten with the color of the next cell. See this example:
+%
+% \begin{quote}
+% \begin{minipage}{0.6\linewidth}
+% \begin{verbatim}
+% \rowcolors{2}{green!25}{green!75}
+% \begin{tabular}{ c @{}c c c }
+% & 1 & 2 & 3 \\
+% & 4 & 5 & 6 \\
+% \ldelim\{{-3}{*} & 7 & 8 & 9 \\
+% \end{tabular}
+% \end{verbatim}
+% \end{minipage}
+% \begin{minipage}{0.35\linewidth}
+% \rowcolors{2}{green!25}{green!75}
+% \begin{tabular}{ c @{}c c c }
+% & 1 & 2 & 3 \\
+% & 4 & 5 & 6 \\
+% \ldelim\{{-3}{*} & 7 & 8 & 9 \\
+% \end{tabular}
+% \\[2ex]
+% \end{minipage}
+% \end{quote}
+%
+% This is not a problem of \Package{multirow} or \Package{bigdelim};
+% it will also happen if there is normal text in the column before the
+% \verb|@{}|. The reason is that these color commands extend the color
+% to cover the intercolumn spaces on both sides to prevent gaps in the
+% color. The size of these so-called \textit{overhangs} is \verb|\tabcolsep| (or
+% \verb|\arraycolsep| when an \env{array} is used) on each side.
+% However, when \verb|@{}| is used there is no such intercolumn space
+% and the extension covers parts of the previous column.
+% This can be cured by setting the left \textit{overhang} explicitly to
+% 0pt with a \verb|\columncolor| command in the tabular header, like
+% \verb|>{\columncolor{white}[0pt][\tabcolsep]}|. Unfortunately the
+% explicit color \texttt{white}, removes the transparency of the column,
+% so if there are cells in that column that have no explicit color,
+% these cells are affected. If the background of the \env{tabular} is
+% white, this normally will not be noticed, but if the background color
+% is changed, for example with the \verb|\pagecolor| command, then that color
+% should be used rather than \texttt{white}. Unfortunately, there is no
+% command to specify the \textit{overhangs} without also specifying a
+% color.
+%
+% In the following example we have done this. In order to keep the table
+% header compact, we put the deinition in a \verb|\newcolumn| command
+% (using the \Package{array} package).
+%
+% \begin{quote}
+% \begin{minipage}{0.6\linewidth}
+% \begin{verbatim}
+% \newcolumntype{z}{@{}>{\columncolor{white}[0pt][\tabcolsep]}}
+% \rowcolors{2}{green!25}{green!75}
+% \begin{tabular}{ c zc c c }
+% & 1 & 2 & 3 \\
+% & 4 & 5 & 6 \\
+% \ldelim\{{-3}{*} & 7 & 8 & 9 \\
+% \end{tabular}
+% \end{verbatim}
+% \end{minipage}
+% \begin{minipage}{0.35\linewidth}
+% \newcolumntype{z}{@{}>{\columncolor{white}[0pt][\tabcolsep]}}
+% \rowcolors{2}{green!25}{green!75}
+% \begin{tabular}{ c zc c c }
+% & 1 & 2 & 3 \\
+% & 4 & 5 & 6 \\
+% \ldelim\{{-3}{*} & 7 & 8 & 9 \\
+% \end{tabular}
+% \\[2ex]
+% \end{minipage}
+% \end{quote}
+%
% In case you want to have a paragraph type text as optional parameter you could put it in a \cs{parbox}.
% Alternatively you could add an extra column with the text in a \cs{multirow}, like in
% \begin{quote}
@@ -1313,7 +1422,19 @@
% pdf & & \\
% \end{tabular}
% \end{quote}
-% Note that we used \texttt{@\{\}} to eliminate the intercolumn space to get the text tight to the brace.
+% Note that we used \texttt{@\{\}} to eliminate the intercolumn space to
+% get the text tight to the brace.
+% \section{Contact Information}
+%
+% Pieter van Oostrum\\
+% email: \texttt{pieter@vanoostrum.org}\\
+% www: \url{http://pieter.vanoostrum.org}
+% \\[1ex]
+% The source code can be found on Github:\\
+% \url{https://github.com/pietvo/multirow}\\
+% Bugs can be reported at\\
+% \url{https://github.com/pietvo/multirow/issues}
+%
% \StopEventually{%
% \PrintChanges
% \PrintIndex}
@@ -1328,22 +1449,22 @@
% \fi
%
% \changes{multirow v1.0}{}{distributed anonymously, based on a Usenet posting}
-% \changes{multirow v1.1}{}{allow it to work without bigstrut.sty (Piet van Oostrum)}
+% \changes{multirow v1.1}{}{allow it to work without bigstrut.sty (Pieter van Oostrum)}
% \changes{multirow v1.2}{}{modified by Jerry Leichter for the same goal, but using a
% different approach which will work properly with bigstrut.sty}
-% \changes{multirow v1.2a}{}{modified by Piet van Oostrum to use \cs{vskip}
+% \changes{multirow v1.2a}{}{modified by Pieter van Oostrum to use \cs{vskip}
% instead of \cs{raise} in positioning, avoiding making rows too high
% when the adjustment is large}
-% \changes{multirow v1.3}{}{modified by Piet van Oostrum to work properly in a p{} column
+% \changes{multirow v1.3}{}{modified by Pieter van Oostrum to work properly in a p{} column
% (\cs{leavevmode} added)}
-% \changes{multirow v1.4}{}{modified by Piet van Oostrum to check for the special case that
+% \changes{multirow v1.4}{}{modified by Pieter van Oostrum to check for the special case that
% the width is given as an *. In this case the natural
% width of the text argument will be used and the argument
% is processed in LR-mode.}
-% \changes{multirow v1.5}{}{modified by Piet van Oostrum: Added a \texttt{\%} after \texttt{\cs{hbox}\{\#5\}\cs{vfill}}.\\
+% \changes{multirow v1.5}{}{modified by Pieter van Oostrum: Added a \texttt{\%} after \texttt{\cs{hbox}\{\#5\}\cs{vfill}}.\\
% Added \cs{strut}s around \#5 for better vertical positioning.
% Additional coding for negative value of \meta{nrows}.}
-% \changes{multirow v1.6}{2004/05/05}{modified by Piet van Oostrum: Replace a space by \cs{relax} after
+% \changes{multirow v1.6}{2004/05/05}{modified by Pieter van Oostrum: Replace a space by \cs{relax} after
% \texttt{\cs{advance}\cs{multirow@dima}\#4}}
%
% \changes{v1.9a}{2016/09/23}{Implement the \texttt{debug} option.}
@@ -1369,7 +1490,7 @@
% The package option \texttt{longtable} redefines the \cs{cline} macro to
% work around a bug in \Package{longtable}. See section \ref{sec:use-with-longtable}\footnote{%
% Thanks to David Carlisle. See
-% \url{http://tex.stackexchange.com/questions/52100/longtable-multirow-problem-with-cline-and-nopagebreak#answer-52101} }.
+% \href{http://tex.stackexchange.com/questions/52100/longtable-multirow-problem-with-cline-and-nopagebreak\#answer-52101}{his answer on stackexchange}.}.
% First we check if the macro \cs{CT@arc} is defined. If so, this
% indocates that the \Package{colortbl} package is loaded. As
% \Package{colortbl} also redefines \cs{@cline}, we must take this into
@@ -1407,23 +1528,81 @@
% \changes{v1.9b}{2016/09/26}{Implement the \texttt{supertabular} option
% and the \cs{STneed} command.}
% The package option \texttt{supertabular} redefines \verb+\\*+ inside a
-% \environment{supertabular}.
+% \env{supertabular}.
% The redefinition is delayed until the \verb+\begin{document}+.
+%
+% \changes{v2.6}{2020/12/26}{Adapt the definition to be compatible with
+% modern versions of \texttt{supertabular}}
+% \texttt{Supertabular} version 4.1f and later need a call to
+% \cs{ST@save@lineno} to function properly, but earlier versions cannot
+% use this as it doesn't exist in these versions. So the definitions of
+% both \cs{ST@tabularcr} and \cs{MRST@cr} are different depending on whether
+% \cs{ST@save@lineno} is defined. There are also some other differences,
+% so some intermediate versions of \texttt{supertabular} might need more
+% subtle adaptations, but for now we leave it at that.
+%
% \begin{macrocode}
\DeclareOption{supertabular}{%
\AtBeginDocument{%
% \end{macrocode}
% \begin{macro}{\ST@tabularcr}
% This macro is the definition of \verb+\\+ inside a
-% \environment{supertabular}. We check for a \verb+*+, and if it is
+% \env{supertabular}. We check for a \verb+*+, and if it is
% present we call our own version, otherwise the
-% \environment{supertabular} version.
+% \env{supertabular} version. First we get the older version for
+% pre-4.1f \texttt{supertabular}, then the newer version.
% \begin{macrocode}
+\ifx\ST@save@lineno\undefined
\def\ST@tabularcr{%
{\ifnum0=`}\fi
\@ifstar{\MRST@xtabularcr}{\ST@xtabularcr}}
% \end{macrocode}
% \end{macro}
+% \begin{macro}{\MRST@cr}
+% \cs{MRST@cr} is a truncated copy of \cs{ST@cr}. It does all the bookkeeping
+% about the space the \env{longtable} occupies, but it doesn't
+% do the pagebreaking part.
+% \begin{macrocode}
+\def\MRST@cr{%
+ \noalign{%
+ \ifnum\ST@pboxht<\ST@lineht
+ \global\advance\ST@pageleft -\ST@lineht
+ \global\ST@prevht\ST@lineht
+ \else
+ \global\advance\ST@pageleft -\ST@pboxht
+ \global\advance\ST@pageleft -0.1\ST@pboxht
+ \global\advance\ST@pageleft -\ST@stretchht
+ \global\ST@prevht\ST@pboxht
+ \global\ST@pboxht\z@
+ \fi
+ \global\advance\ST@pageleft -\ST@toadd
+ \global\ST@toadd=\z@}}
+\else
+% \end{macrocode}
+% These are the newer versions.
+% \begin{macrocode}
+\def\ST@tabularcr{%
+ {\ifnum0=`}\fi
+ \ST@save@lineno
+ \@ifstar{\MRST@xtabularcr}{\ST@xtabularcr}}
+\def\MRST@cr{%
+ \noalign{%
+ \ifnum\ST@pboxht<\ST@lineht
+ \global\advance\ST@pageleft -\ST@lineht
+ \global\ST@prevht\ST@lineht
+ \else
+ \ST@trace@cr\thr@@{Added par box with height \the\ST@pboxht}%
+ \global\advance\ST@pageleft -\ST@pboxht
+ \global\advance\ST@pageleft -0.1\ST@pboxht
+ \global\ST@prevht\ST@pboxht
+ \global\ST@pboxht\z@
+ \fi
+ \global\advance\ST@pageleft -\ST@toadd
+ \global\ST@toadd=\z@
+ \ST@trace@cr\thr@@{Space left for tabular: \the\ST@pageleft}}}
+\fi
+% \end{macrocode}
+% \end{macro}
% \begin{macro}{\MRST@xtabularc}
% \begin{macro}{\MRST@argtabularc}
% \begin{macro}{\MRST@xargtabularc}
@@ -1448,35 +1627,14 @@
\noalign{\global\ST@toadd=#1}\MRST@cr}
\def\MRST@yargarraycr#1{%
\cr\noalign{\vskip #1\global\MRST@toadd=#1}\MRST@cr}
+}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
-% \begin{macro}{\MRST@cr}
-% This is a truncated copy of \cs{ST@cr}. It does all the bookkeeping
-% about the space the \environment{longtable} occupies, but it doesn't
-% do the pagebreaking part.
-% \begin{macrocode}
-\def\MRST@cr{%
- \noalign{%
- \ifnum\ST@pboxht<\ST@lineht
- \global\advance\ST@pageleft -\ST@lineht
- \global\ST@prevht\ST@lineht
- \else
- \global\advance\ST@pageleft -\ST@pboxht
- \global\advance\ST@pageleft -0.1\ST@pboxht
- \global\advance\ST@pageleft -\ST@stretchht
- \global\ST@prevht\ST@pboxht
- \global\ST@pboxht\z@
- \fi
- \global\advance\ST@pageleft -\ST@toadd
- \global\ST@toadd=\z@}}
-}
-% \end{macrocode}
-% \end{macro}
% \begin{macro}{\STneed}
-% This macro can be used in a \environment{supertabular} to indicate how
+% This macro can be used in a \env{supertabular} to indicate how
% much space a multirow entry needs. See section~\ref{sec:use-with-supertabular}.
% \begin{macrocode}
\def\STneed#1{\ifdim\ST@pageleft<#1\ST@newpage\ST@next\fi}
@@ -1512,16 +1670,18 @@
% \begin{macro}{\multirow@setcolwidth}
% This macro calculates \cs{multirow@colwidth} for an entry that has the
% \meta{width} given as ``\texttt{=}''. We check if we are inside a
-% \environment{tabulary} environment, by checking if \cs{TY@final} is defined.
-% If not, then \cs{multirow@colwidth} = \cs{hsize}. The \environment{tabulary}
+% \env{tabulary} environment, by checking if \cs{TY@final} is defined.
+% If not, then \cs{multirow@colwidth} = \cs{hsize}. The \env{tabulary}
% environment will make two passes. On the first pass, we set \cs{multirow@colwidth}
% to the size that the text would have in LR mode (with newlines replaced
-% by spaces), so that \environment{tabulary} will gives us enough space.
+% by spaces), so that \env{tabulary} will gives us enough space.
% On the second pass (characterized by \cs{TY@box} = \cs{TY@box@v}) we use
-% the value that \environment{tabulary} has given us in \cs{hsize}.
+% the value that \env{tabulary} has given us in \cs{hsize}.
% This algorithm is not perfect, but good enough in most cases.
+% \changes{v2.7}{2021/01/29}{Make \cs{multirow@setcolwidth} \cs{long} to allow
+% multi-paragraph text}
% \begin{macrocode}
-\def\multirow@setcolwidth#1{%
+\long\def\multirow@setcolwidth#1{%
\ifx\TY@final\multirow@undefined \multirow@colwidth=\hsize
\else
\ifx\TY@box\TY@box@v\multirow@colwidth=\hsize
@@ -1608,8 +1768,10 @@
% \cs{ifdim} by putting a unit (\texttt{pt}) after the number.
% \changes{v2.4}{2019/01/01}{Support calc compatible expressions for \meta{width} and
% \meta{vmove}.}
+% \changes{v2.7}{2021/01/29}{Make \cs{@xmultirow} \cs{long} to allow
+% multi-paragraph text}
% \begin{macrocode}
-\def\@xmultirow[#1]#2[#3]#4[#5]#6{%
+\long\def\@xmultirow[#1]#2[#3]#4[#5]#6{%
\expandafter\multirow@piii#3\relax\end%
\setlength\multirow@dima{#2\ht\@arstrutbox}%
\addtolength\multirow@dima{#2\dp\@arstrutbox}%
@@ -1723,7 +1885,7 @@
% at the beginning to force horizontal mode}
% \begin{macro}{\bigstrut}
% This macro inserts a strut. Depending on the optional parameter it extends
-% above and/or below the standard array/tabular strut.
+% above and/or below the standard \env{array}/\env{tabular} strut.
% \begin{macrocode}
\newcommand\bigstrut[1][x]{%
\leavevmode\unskip\@tempdima=\ht\@arstrutbox \@tempdimb=\dp\@arstrutbox
@@ -1751,12 +1913,17 @@
% This macro typesets a left delimiter. It calls \cs{multirow} with the proper arguments.
% The size of the delimiter is determined by putting a \cs{vbox} with the proper height and
% zero width next to it. The height is the one that \cs{multirow}
-% already has calculated in \cs{multirow@dima}.
+% already has calculated in \cs{multirow@dima}. That calculation uses
+% the size of \cs{@arstrutbox}, which is set by \texttt{tabular} or
+% \texttt{array} environments. In case it is not set, we initialize it
+% to a default value.
% \changes{bigdelim v2.3}{2018/08/03}{Replace \cs{textrm} by \cs{textnormal}}
+% \changes{bigdelim v2.6}{2020/12/26}{Initialize \cs{@arstrutbox} if not defined}
% \begin{macrocode}
\newcommand\ldelim[3]{\@ifnextchar[{\@ldelim{#1}{#2}{#3}}{\@ldelim{#1}{#2}{#3}[\null]}}
\def\@ldelim#1#2#3[#4]%
- {\multirow{#2}{#3}{%
+ {\ifvoid\@arstrutbox\setbox\@arstrutbox\hbox{\strut}\fi
+ \multirow{#2}{#3}{%
\ensuremath
{\left.\vcenter{\hsize=0pt\vrule height \multirow@dima width 0pt}%
\textnormal{#4}\right#1}}}
@@ -1767,10 +1934,12 @@
% This macro typesets a right delimiter. It calls \cs{multirow} with the
% proper arguments, similar to \cs{ldelim}.
% \changes{bigdelim v2.3}{2018/08/03}{Replace \cs{textrm} by \cs{textnormal}}
+% \changes{bigdelim v2.6}{2020/12/26}{Initialize \cs{@arstrutbox} if not defined}
% \begin{macrocode}
\newcommand\rdelim[3]{\@ifnextchar[{\@rdelim{#1}{#2}{#3}}{\@rdelim{#1}{#2}{#3}[\null]}}
\def\@rdelim#1#2#3[#4]%
- {\multirow{#2}{#3}{%
+ {\ifvoid\@arstrutbox\setbox\@arstrutbox\hbox{\strut}\fi
+ \multirow{#2}{#3}{%
\ensuremath
{\left#1\vcenter{\hsize=0pt\vrule height \multirow@dima width 0pt}%
\textnormal{#4}\right.}}}
diff --git a/Master/texmf-dist/source/latex/multirow/multirow.ins b/Master/texmf-dist/source/latex/multirow/multirow.ins
index 1d103af45b9..9a9ab7a4ff4 100644
--- a/Master/texmf-dist/source/latex/multirow/multirow.ins
+++ b/Master/texmf-dist/source/latex/multirow/multirow.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2016 by Piet van Oostrum <piet@vanoostrum.org>
+%% Copyright (C) 2016 by Pieter van Oostrum <pieter@vanoostrum.org>
%%
%% This file may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.3 of this license
diff --git a/Master/texmf-dist/source/latex/nameauth/Makefile b/Master/texmf-dist/source/latex/nameauth/Makefile
index ad3181780fe..d2a47efb83e 100644
--- a/Master/texmf-dist/source/latex/nameauth/Makefile
+++ b/Master/texmf-dist/source/latex/nameauth/Makefile
@@ -1,17 +1,51 @@
+#Copyright (C) 2020 by Charles P. Schaum <charles[dot]schaum@comcast.net>
+#-------------------------------------------------------
+#
+#This file 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:
+#
+# http://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.
+#
+# Name of package
NAME = nameauth
+# LaTeX engine to use for package; below is the default.
+# One can choose from latex, pdflatex, xelatex, lualatex, dvilualatex.
ENGINE ?= pdflatex
-# or latex, xelatex, lualatex, dvilualatex
+# Shell to use; default is bash
SHELL = bash
+# Value of current working directory
PWD = $(shell pwd)
+# Package version info
VERS = $(shell ltxfileinfo -v $(NAME).dtx|sed -e 's/^v//')
+# Local, system-wide tex tree
LOCAL = $(shell kpsewhich --var-value TEXMFLOCAL)
+# Tex tree in user's home directory
UTREE = $(shell kpsewhich --var-value TEXMFHOME)
+#
+# Default make target is release and its dependencies
release: $(NAME).pdf
+#
+# The testing target also compiles the examples file.
testing: $(NAME).pdf examples.pdf
+
+#
+# This is the recipe for examples.pdf. It will work also for dvi output.
examples.pdf : examples.tex
- $(ENGINE) examples >/dev/null
+ $(ENGINE) --interaction=nonstopmode examples > /dev/null
+ $(ENGINE) --interaction=nonstopmode examples > /dev/null
if [ -f examples.idx ]; then makeindex -o examples.ind examples.idx; fi
- $(ENGINE) examples > /dev/null
+ if [ -f examples.rdx ]; then makeindex -o examples.rnd examples.rdx; fi
+ $(ENGINE) --interaction=nonstopmode examples > /dev/null
+ $(ENGINE) --interaction=nonstopmode examples > /dev/null
+ if [ -f examples.dvi ]; then dvipdf examples; fi
+ if [ -f examples.out.ps ]; then rm examples.out.ps; fi
+#
+# This is the recipe for the package docs. It will work also for dvi output.
$(NAME).pdf : $(NAME).dtx
$(ENGINE) -shell-escape -recorder -interaction=batchmode $(NAME).dtx >/dev/null
$(ENGINE) --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
@@ -19,13 +53,24 @@ $(NAME).pdf : $(NAME).dtx
if [ -f $(NAME).idx ]; then makeindex -q -s gind.ist -o $(NAME).ind $(NAME).idx; fi
$(ENGINE) --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
$(ENGINE) --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
- test -e README.txt && mv README.txt README || exit 0
+ if [ -f $(NAME).dvi ]; then dvipdf $(NAME); fi
+#
+# Using this recipe deletes the auxiliary and log files
clean:
- rm -f $(NAME).{aux,fls,glo,gls,hd,idx,ilg,ind,ins,log,out,toc} README.txt
- rm -f examples.{aux,fls,glo,gls,hd,idx,ilg,ind,ins,log,out,toc}
+ rm -f $(NAME).{aux,fls,glo,gls,hd,idx,ilg,ind,ins,log,out,toc}
+ rm -f examples.{rdx,rnd,aux,fls,glo,gls,hd,idx,ilg,ind,ins,log,out,toc}
+#
+# Using this recipe cleans also all generated files
distclean: clean
- rm -f $(NAME).{dvi,pdf,sty,synctex.gz} README
- rm -f examples.{dvi,pdf,sty,synctex.gz}
+ rm -f $(NAME).{dvi,pdf,sty,synctex.gz,"synctex(busy)"} README.md
+ rm -f examples.{dvi,pdf,synctex.gz,"synctex(busy)",tex}
+#
+# Using this recipe deletes files for testong
+testclean:
+ rm -f examples.{aux,fls,glo,gls,hd,idx,ilg,ind,ins,log,out,toc}
+ rm -f examples.{dvi,pdf,synctex.gz,"synctex(busy)"}
+#
+# This recipe installs the package release into the user's tree
inst: release
mkdir -p $(UTREE)/{tex,source,doc}/latex/$(NAME)
cp $(NAME).dtx $(UTREE)/source/latex/$(NAME)
@@ -33,7 +78,9 @@ inst: release
cp $(NAME).sty $(UTREE)/tex/latex/$(NAME)
cp $(NAME).pdf $(UTREE)/doc/latex/$(NAME)
cp examples.tex $(UTREE)/doc/latex/$(NAME)
- cp README $(UTREE)/doc/latex/$(NAME)
+ cp README.md $(UTREE)/doc/latex/$(NAME)
+#
+# This recipe installs the package release into the system tree
install: release
sudo mkdir -p $(LOCAL)/{tex,source,doc}/latex/$(NAME)
sudo cp $(NAME).dtx $(LOCAL)/source/latex/$(NAME)
@@ -41,9 +88,10 @@ install: release
sudo cp $(NAME).sty $(LOCAL)/tex/latex/$(NAME)
sudo cp $(NAME).pdf $(LOCAL)/doc/latex/$(NAME)
sudo cp examples.tex $(LOCAL)/doc/latex/$(NAME)
- sudo cp README $(LOCAL)/doc/latex/$(NAME)
+ sudo cp README.md $(LOCAL)/doc/latex/$(NAME)
+#
+# This recipe creates a zip file for upload to CTAN
zip: release
ln -sf . $(NAME)
- zip -Drq $(PWD)/$(NAME)-$(VERS).zip $(NAME)/{README,examples.tex,Makefile,$(NAME).{pdf,dtx}}
+ zip -Drq $(PWD)/$(NAME)-$(VERS).zip $(NAME)/{README.md,examples.tex,Makefile,$(NAME).{pdf,dtx}}
rm $(NAME)
-
diff --git a/Master/texmf-dist/source/latex/nameauth/nameauth.dtx b/Master/texmf-dist/source/latex/nameauth/nameauth.dtx
index b523a087773..5a9d1ad1267 100644
--- a/Master/texmf-dist/source/latex/nameauth/nameauth.dtx
+++ b/Master/texmf-dist/source/latex/nameauth/nameauth.dtx
@@ -1,139 +1,179 @@
% \iffalse meta-comment
-% vim: textwidth=75
+%
+% Copyright (C) 2020 by Charles P. Schaum <charles[dot]schaum@comcast.net>
+% -------------------------------------------------------
+%
+% This file 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:
+%
+% http://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.
+%
%<*internal>
\iffalse
%</internal>
%<*readme>
-|
---------:| ----------------------------------------------------------------
-nameauth:| Name authority mechanism for consistency in text and index
- Author:| Charles P. Schaum
- E-mail:| charles dot schaum@comcast.net
- License:| Released under the LaTeX Project Public License 1.3c or later
- See:| http://www.latex-project.org/lppl.txt
-
-
-Short description:
+%<<readmevb
+# Short Description
-The nameauth package automates the correct formatting and indexing of names
+The `nameauth` package automates the correct formatting and indexing of names
for professional writing. This aids the use of a name authority and the
editing process without needing to retype name references.
-Files Distribution
+# Files
+
+|Filename |Description |
+|--------------|---------------------------------------|
+|`nameauth.dtx`|commented style file; source file |
+|`Makefile` |For use with GNU make; with source file|
+|`nameauth.ins`|installation driver (generated file) |
+|`nameauth.pdf`|Documentation (generated file) |
+|`README.md` |This file (generated file) |
+|`examples.tex`|example macros (generated file) |
+
+# Obtaining the Package
+
+1. Packaged in your current TeX distrbution: See the appropriate documentation.
+
+2. Otherwise, download `nameauth.zip` from [CTAN](www.ctan.org/tex-archive/macros/latex/contrib/nameauth).
+
+3. Unpack `nameauth.zip` in an appropriate directory.
+
+4. Change to the directory containing the `nameauth` files.
+
+# File Generation
-README This file
-nameauth.pdf Documentation
-examples.tex Some longer example macros from the documentation
+## Automatic Installation
-Makefile Automates building with GNU make 3.81
-nameauth.dtx Documented LaTeX file containing both code and documentation
+This method requires GNU `make` on a POSIX-compliant environment, such as GNU/Linux, various BSD flavors, perhaps MacOS (e.g., with various porting systems), and even Cygwin on Windows.
-Manual Installation
+0. A quick install in one's home directory using some of the included files from the `zip` archive just requires the following steps:
-Download the package from
+ tex nameauth.dtx
+ make inst
-www.ctan.org/tex-archive/macros/latex/contrib/nameauth
+Otherwise we use the LaTeX installation on the host machine to build the package. When using `make`, any `dvi` files that are created will also be converted to `pdf` format.
-Unpack nameauth.zip in an appropriate directory.
+1. Type `make distclean release` to generate the release files using `pdflatex`.
-If you have a make utility compatible with GNU make, either in
-GNU/Linux, a BSD variant, OSX, or Cygwin in Windows you can type
+2. To use another TeX engine, type one of the following:
+ make ENGINE=latex
+ make ENGINE=lualatex
+ make ENGINE=dvilualatex
+ make ENGINE=xelatex
- make inst
+3. Type `make inst` to install the files in the user's personal TDS-compliant directory tree.
-to install the package into your $TEXMFHOME tree or
+4. Type `sudo make install` to install the files in the system-wide, local TDS-compliant directory tree.
- make install
+## Manual Compilation
-to install the package into your $TEXMFLOCAL tree for all users.
-The latter requires sudo privileges.
+Otherwise, the following steps are used for manual installation. See the general information at the [TeX FAQ](https://www.texfaq.org/FAQ-installthings).
-Other useful targets include:
+0. To use some of the included files from the `zip` archive and only extract files from the `dtx` file, just do the following step and proceed to installation:
- (release process)
+ tex nameauth.dtx
- make release The default target, same as just ``make''.
+1. To build the package on the host system, generate the installation files and a copy of the documentation without the table of contents and cross-references. We use `pdflatex` by default:
- make clean Removes all intermediate files. Left are
- the files listed above plus nameauth.sty.
+ pdflatex --shell-escape --recorder --interaction=batchmode nameauth.dtx
- make distclean Leave only nameauth.dtx, examples.tex,
- and Makefile.
+2. Generate the TOC and cross-references for the documentation:
- make zip Generate a zip file ready for distribution.
+ pdflatex --recorder --interaction=nonstopmode nameauth.dtx
- (testing process)
+3. Generate the index files using `makeindex`:
- make testing Release files, plus compiles examples.tex.
+ makeindex -q -s gglo.ist -o nameauth.gls nameauth.glo
+ makeindex -q -s gind.ist -o nameauth.ind nameauth.idx
- make release ENGINE=<command>
- Here, <command> can be pdflatex (default),
- xelatex, lualatex, dvilualatex, or latex.
+4. Integrate the glossary (changes) and index into the documentation. The second run updates the TOC:
- make testing ENGINE=<command> See above.
-
-It is not necessary, however, to use GNU make. One can generate
-the package files manually. Since the files nameauth.ins and README.txt
-are contained in the .dtx file itself, the first step is to generate
-the installer driver nameauth.ins, plus the file README.txt, which will
-also trigger the extraction of nameauth.sty and produce the first pass of
-the package documentation nameauth.pdf:
+ pdflatex --recorder --interaction=nonstopmode nameauth.dtx
+ pdflatex --recorder --interaction=nonstopmode nameauth.dtx
- pdflatex -shell-escape -recorder -interaction=batchmode nameauth.dtx
+One can substitute, e.g., `latex`, `xelatex`, `lualatex`, and `dvilualatex` for `pdflatex`, but the documentation may look different in some cases.
-Next one adds a table of contents and all cross-references, this also
-should finalize page numbers for glossary and index input files:
+## File Installation
- pdflatex --recorder --interaction=nonstopmode nameauth.dtx
-
-The next commands generate the glossary/index output files:
-
- makeindex -q -s gglo.ist -o nameauth.gls nameauth.glo
- makeindex -q -s gind.ist -o nameauth.ind nameauth.idx
-
-The final two commands integrate the glossary (changes) and index:
-
- pdflatex --recorder --interaction=nonstopmode nameauth.dtx
- pdflatex --recorder --interaction=nonstopmode nameauth.dtx
+Different TeX distributions have somewhat different ways to store TDS-compliant configuration and package data. See, for example, [MikTeX](https://miktex.org/kb/texmf-roots) and the [TeX FAQ](https://www.texfaq.org/FAQ-privinst). Two approaches below conform generally to a Unix-based system:
-Now one can either keep README.txt or rename it to README, e.g.:
+## User's Home Directory
- mv README.txt README
+`TEXMFHOME` is a variable that points to the root of a TDS-compliant directory tree available to a user. Use `kpsewhich --var-value TEXMFHOME` to obtain its value. Quite often it is equivalent to `$HOME/texmf`. The dollar sign in front of the variable denotes the value of the variable instead of its name. So if `$HOME` is `/home/bob`, then `$TEXMFHOME` would be `/home/bob/texmf`, and we can understand the following paths to be under that directory:
-Normally one creates the following directories for a user:
+|Path |Description |
+|----------------------------------|---------------------------------------|
+|`$TEXMFHOME/source/latex/nameauth`|`ins` and `dtx` files, Makefile |
+|`$TEXMFHOME/tex/latex/nameauth` |`sty` file |
+|`$TEXMFHOME/doc/latex/nameauth` |`pdf` file, `README.md`, `examples.tex`|
- $TEXMFHOME/source/latex/nameauth dtx file
- $TEXMFHOME/tex/latex/nameauth sty file
- $TEXMFHOME/doc/latex/nameauth pdf file, README, examples.tex
-
-and creates the following directories for the local site:
+On older TeX distributions, run `mktexlsr` on $TEXMFHOME to complete the install process.
- $TEXMFLOCAL/source/latex/nameauth dtx file
- $TEXMFLOCAL/tex/latex/nameauth sty file
- $TEXMFLOCAL/doc/latex/nameauth pdf file, README, examples.tex
+## System-Wide Directory
-The above environment variables often are /usr/local/texlive/texmf-local
-and ~/texmf.
+`TEXMFLOCAL` is a variable that points to the root of a TDS-compliant directory tree available to all users on a local site, system-wide installation. Use `kpsewhich --var-value TEXMFLOCAL` to obtain its value. See the [TeX FAQ](https://www.texfaq.org/FAQ-what-TDS). We can understand the following paths to be under that directory:
-The make process normally renames the README.txt file created from the
-dtx file to just README by using mv (move / rename utility in the *nix
-userland). Windows distributions of TeX and LaTeX often keep the txt file
-because of using file extensions instead of ``magic numbers'' to identify
-files.
+|Path |Description |
+|-----------------------------------|---------------------------------------|
+|`$TEXMFLOCAL/source/latex/nameauth`|`ins` and `dtx` files, Makefile |
+|`$TEXMFLOCAL/tex/latex/nameauth` |`sty` file |
+|`$TEXMFLOCAL/doc/latex/nameauth` |`pdf` file, `README.md`, `examples.tex`|
-Run mktexlsr with the appropriate level of permissions to complete the
-install.
+Run `mktexlsr` with the appropriate permissions on `$TEXMFLOCAL` to complete the install process.
-Testing notes:
+# Testing
-See the nameauth manual.
+## Compiling `examples.tex`
-License
+1. Either go to the directory used when unpacking the `zip` file or copy the file `examples.tex` from the `doc/latex/nameauth` branch of whatever TDS-compliant tree to a directory of your choice.
-This material is subject to the LaTeX Project Public License:
-http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html
+2. If one has access to GNU `make`, use either `Makefile` in the directory where one unpacked the `zip` file or copy `Makefile` from either `src/latex/nameauth` or `doc/latex/nameauth` in whatever TDS-compliant tree it exists.
-Happy TeXing!
+When using `make`, any `dvi` files that are created will also be converted to `pdf` format.
+
+3. To compile the test file using `make` and `pdflatex`, simply type `make testing`.
+
+4. For multi-format testing using `make` in addition to that above, one can do the following:
+
+ make testing ENGINE=pdflatex
+ make testing ENGINE=latex
+ make testing ENGINE=lualatex
+ make testing ENGINE=dvilualatex
+ make testing ENGINE=xelatex
+
+5. If one does not have `make`, one can use the following commands, substituting, e.g., `latex`, `xelatex`, `lualatex`, and `dvilualatex` for `pdflatex`:
+
+ pdflatex --interaction=nonstopmode examples
+ pdflatex --interaction=nonstopmode examples
+ makeindex -o examples.ind examples.idx
+ makeindex -o examples.rnd examples.rdx
+ pdflatex --interaction=nonstopmode examples
+ pdflatex --interaction=nonstopmode examples
+
+The use of different extensions for the index results from using the `index` package to generate a persons index separate from a subject index.
+
+The manual is also a test suite.
+
+# Copyright
+
+Copyright (C) 2020 by Charles P. Schaum <charles[dot]schaum@comcast.net>
+-------------------------------------------------------
+
+This file 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:
+
+ [http://www.latex-project.org/lppl.txt](http://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.
+%readmevb
%</readme>
%<*internal>
\fi
@@ -146,35 +186,24 @@ Happy TeXing!
\input docstrip.tex
\keepsilent
\askforoverwritefalse
+
\preamble
---------:| ----------------------------------------------------------------
-nameauth:| Name authority mechanism for consistency in text and index
- Author:| Charles P. Schaum
- E-mail:| charles dot schaum@comcast.net
- License:| Released under the LaTeX Project Public License 1.3c or later
- See:| http://www.latex-project.org/lppl.txt
+This is a generated file.
-\endpreamble
-\postamble
+Copyright (C) 2020 by Charles P. Schaum <charles[dot]schaum@comcast.net>
-Copyright (C) 2020 by Charles P. Schaum <charles dot schaum@comcast.net>
+This file 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:
-This work may be distributed and / or modified under the
-conditions of the LaTeX Project Public License (LPPL), either
-version 1.3c of this license or (at your option) any later
-version. The latest version of this license is in the file:
+ http://www.latex-project.org/lppl.txt
-http://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 is "maintained" (as per LPPL maintenance status) by
-Charles P. Schaum.
-
-This work consists of the files nameauth.dtx, examples.tex, and a Makefile.
-These files generate README.txt / README, nameauth.ins, nameauth.sty, and
-nameauth.pdf, with other intermediate files, as a part of this work. See
-the README.txt or README for more information.
-\endpostamble
+\endpreamble
\usedir{tex/latex/nameauth}
\generate{
@@ -187,10 +216,14 @@ the README.txt or README for more information.
\generate{
\file{\jobname.ins}{\from{\jobname.dtx}{install}}
}
-\nopreamble\nopostamble
\usedir{doc/latex/nameauth}
+\nopostamble
+\generate{
+ \file{examples.tex}{\from{\jobname.dtx}{examples}}
+}
+\nopreamble
\generate{
- \file{README.txt}{\from{\jobname.dtx}{readme}}
+ \file{README.md}{\from{\jobname.dtx}{readme}}
}
\ifx\fmtname\nameofplainTeX
\expandafter\endbatchfile
@@ -204,15 +237,18 @@ the README.txt or README for more information.
%<*driver>
\ProvidesFile{nameauth.dtx}
%</driver>
-%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
%<package>\ProvidesPackage{nameauth}
%<*package>
- [2020/02/26 3.4 Name authority mechanism for consistency in text and index]
+ [2020/11/23 3.5 Name authority mechanism for consistency in text and index]
%</package>
+%
%<*driver>
\documentclass[11pt]{ltxdoc}
+
%^^A Below we check if our TL distribution has the iftex package and load it.
\IfFileExists{iftex.sty}{\usepackage{iftex}}{}
+
%^^A Only versions of iftex since 2019 have the macro \RequireTUTeX.
%^^A If the package is not loaded or if it is not new,
%^^A we load the older, transitional packages.
@@ -221,14 +257,15 @@ the README.txt or README for more information.
\usepackage{ifluatex}
\usepackage{ifpdf}
\fi
+
+%^^A We include packages depending on the LaTeX engine, mode,
+%^^A and version of TeX being used.
\ifxetex %^^A \ifpdf will not be true, but a pdf results.
\usepackage{fontspec}
\usepackage{polyglossia}
\setdefaultlanguage{american}
\setotherlanguage{german}
\newcommand\de[1]{\textgerman{#1}}
- \usepackage{tikz}
- \usepackage{tcolorbox}
\else
\ifluatex
\ifpdf %^^A pdf mode
@@ -237,8 +274,6 @@ the README.txt or README for more information.
\setdefaultlanguage{american}
\setotherlanguage{german}
\newcommand\de[1]{\textgerman{#1}}
- \usepackage{tikz}
- \usepackage{tcolorbox}
\else %^^A dvi mode
\IfFileExists{utf8-2018.def}{}{\usepackage[utf8]{inputenc}}
\usepackage[TS1,T1]{fontenc}
@@ -260,43 +295,62 @@ the README.txt or README for more information.
\DeclareTextSymbolDefault{\textlongs}{TS1}
\DeclareTextSymbol{\textlongs}{TS1}{115}
\newunicodechar{ſ}{\textlongs}
- \ifpdf %^^A These only get included for pdf.
- \usepackage{tikz}
- \usepackage{tcolorbox}
- \fi
\fi
\fi
+
+%^^A Used unconditionally because we convert the dvi to pdf
+%^^A Otherwise we would put this in \ifpdf...\fi
+\usepackage{tikz}
+\usepackage{tcolorbox}
+
+\usepackage{microtype}
+
%^^A Set up initial page layout to fit both letter and DIN A4.
-\usepackage[textwidth=137mm,textheight=237mm,right=25mm,marginparwidth=40mm,nohead]{geometry}
-%^^A Include only this version of the package.
-\usepackage{\jobname}[2020/02/26]
-%^^A Set up all tabular information.
+\usepackage[textwidth=137mm,textheight=237mm,
+ right=25mm,marginparwidth=39mm,nohead]{geometry}
+
+%^^A Include specifically the current version of the package.
+\usepackage{\jobname}[2020/11/23]
+
+%^^A Set up all tabular packages. Booktabs makes them pretty,
+%^^A colortabl shades rows, and tabularx allows some fiddly
+%^^A stuff when typesetting the nameauth environment as a table.
\usepackage{booktabs}
\usepackage{colortbl}
-\usepackage{tabularx}
+
%^^A Set up lists.
\usepackage{enumitem}
\setlist{rightmargin=\leftmargin,itemsep=0pt}
-%^^A Create indexes and set up the ``actual'' character in nameauth.
+
+%^^A Create indexes and set up the ``actual'' character in nameauth
+%^^A to conform to gind.ist.
\usepackage{makeidx}
\IndexActual{=}
+
%^^A Dangerous bend ahead...
\usepackage{manfnt}
+
%^^A Two-column TOC
\usepackage[toc]{multitoc}
+
%^^A Some examples get some stretch to aid clarity and readability.
\usepackage{setspace}
+
%^^A Color helps categorize information.
\usepackage{xcolor}
+
\colorlet{nared}{red!50!black}
\colorlet{nagreen}{green!35!black}
\colorlet{nablue}{blue!50!black}
-\colorlet{nabrown}{brown!55!black}
+\colorlet{nabrown}{brown!50!black}
\colorlet{naviolet}{violet!90!black}
\colorlet{nataupe}{yellow!40!black}
\colorlet{naslate}{cyan!45!black}
+\colorlet{grey}{black!7!white}
+
%^^A For example...
\usepackage{verbatim}
+
%^^A Have documentation with hyperlinks
\usepackage[numbered]{hypdoc}
@@ -320,8 +374,8 @@ the README.txt or README for more information.
\makeatother
%^^A Use color indicators in a couple of tables.
-\newcommand\NO{\bgroup\color{lightgray}\lower 0.075ex\hbox{\rule{1.5ex}{1.5ex}}\egroup}
-\newcommand\YES{\bgroup\color{darkgray}\lower 0.075ex\hbox{\rule{1.5ex}{1.5ex}}\egroup}
+\newcommand\NO{\bgroup\color{black!20!white}\lower 0.075ex\hbox{\rule{1.5ex}{1.5ex}}\egroup}
+\newcommand\YES{\bgroup\color{black!80!white}\lower 0.075ex\hbox{\rule{1.5ex}{1.5ex}}\egroup}
%^^A Stretch out some text for clarity.
\newcommand*\MyStretch{\setstretch{1.1}}
@@ -331,37 +385,43 @@ the README.txt or README for more information.
\newcommand*\BigBlank{{\large\itshape\vfil\leavevmode\hfil This space is intentionally left blank.}}
%^^A Macros for marginalia.
-\newcommand*\Version[1]{\unless\ifinner\marginpar{\strut\raggedleft\textsf{\bfseries#1}}\fi}
-\newcommand*\VersionWarn[1]{{\unless\ifinner\marginpar{\strut\raggedleft\textsf{\bfseries#1}\break\small\dbend}\fi}}
-\newcommand*\Warn{{\unless\ifinner\marginpar{\strut\small\raggedleft\dbend}\fi}}
-\newcommand*\Info[1]{{\unless\ifinner\marginpar{\strut\small\raggedleft#1}\fi}}
+\newcommand*\Version[1]{\unless\ifinner\marginpar{\raggedleft\strut\textsf{\bfseries#1}}\fi}
+\newcommand*\Warn{{\unless\ifinner\marginpar{\small\strut\raggedleft\raise0.7ex\hbox{\dbend}}\fi}}
+\newcommand*\Info[1]{{\MyStretch\unless\ifinner\marginpar{\small\raggedleft#1}\fi}}
+\newcommand*\SPatInfo[1]{{\MyStretch\unless\ifinner\marginpar{\footnotesize\raggedleft Simplified Name Pattern(s):\break\ttfamily#1}\fi}}
+\newcommand*\PatInfo[1]{{\MyStretch\unless\ifinner\marginpar{\footnotesize\raggedleft Name Pattern(s):\hfill\break\ttfamily#1}\fi}}
+\newcommand*\IdxInfo[1]{{\MyStretch\unless\ifinner\marginpar{\footnotesize\raggedleft Basic Index:\hfill\break#1}\fi}}
+\newcommand*\Illus{{\MyStretch\unless\ifinner\marginpar{\footnotesize\raggedleft
+ Name color and\\
+ typeface are only\\
+ illustrative, not\\
+ package defaults.}\fi}}
%^^A Use this example in the body text.
\newcommand\Orphan[2]{#1(\hyperpage{#2})}
\TagName[Lost]{Name}{\,\S|Orphan{perdit}}
\TagName{foo\Name {bar}}{\,\S|hyperpage}
-%^^A Redefine emphasis in the body text
+%^^A Redefine emphasis in the body text because italic has some dedicated uses.
\let\oldemph\emph
\let\emph\textbf
-%^^A Struts for framed boxes
-\newcommand*{\mystrut}{\rule[-0.25\baselineskip]{0pt}{\baselineskip}}
-
-%^^A Set up all the shorthands, but not all the names.
+%^^A Set up all the shorthands, but not all the names. Even if one does not set
+%^^A up all the names here, it is a very good idea to set up the (pre)tags just below,
+%^^A especially in a dtx file.
\begin{nameauth}
\< Adams & John & \noexpand\textSC{Adams} & >
\< Aeth & & Æthelred, II & >
- \< Anth & Susan B. & Anthony & >
\< Aris & & Aristotle & >
- \< Attil & & Attila, the Hun & >
+ \< Bailey & Betsey & Bailey & >
\< Cicero & M.T. & Cicero & >
\< Confucius & & Confucius & >
\< Dagb & & Dagobert & I >
\< SDJR & Sammy & \noexpand\textSC{Davis}, \noexpand\textSC{Jr}. & >
\< Dem & & Demetrius, I & >
- \< deSmet & Pierre-Jean & \noexpand\Fbox{\noexpand\AltCaps{d}e Smet} & >
- \< Soto & Hernando & de Soto & >
+ \< deSmet & Pierre-Jean & \noexpand\Fbox{\noexpand\AltCaps{d}e~Smet} & >
+ \< Soto & Hernando & de~Soto & >
+ \< Doug & Frederick & Douglass & >
\< DuBois & W.E.B. & Du~Bois & >
\< AltDuBois & W.E.B. & DuBois & >
\< Einstein & Albert & Einstein & >
@@ -373,6 +433,7 @@ the README.txt or README for more information.
\< Harnack & Adolf & Harnack & >
\< Henry & & Henry & VIII >
\< Jeff & Thomas & \noexpand\JEFF & >
+ \< Eriugena & & John, Eriugena & >
\< Lewis & Clive Staples & Lewis & >
\< CSL & Clive Staples & Lewis & C.S. >
\< Luth & Martin & \noexpand\textSC{Luther} & >
@@ -382,16 +443,13 @@ the README.txt or README for more information.
\< MSens & & Miyazaki, Hayao & Sensei >
\< Noguchi & Hideyo & Noguchi & >
\< Pat & George S. & Patton, Jr. & >
- \< JRIII & John David & \textSC{Rockefeller},\textSC{III} & >
- \< JRIV & John David & Rockefeller, IV & >
- \< JayR & John David & Rockefeller, IV & Jay >
+ \< JRIII & J.D. & \textSC{Rockefeller},\textSC{III} & >
+ \< JRIV & J.D. & Rockefeller, IV & >
+ \< JayR & J.D. & Rockefeller, IV & Jay >
\< Scipio & \noexpand\SCIPi & \noexpand\SCIPii & >
\< OScipio & Publius & \noexpand\CSA & >
\< Shak & \noexpand\WM & \noexpand\SHK & >
\< Striet & John & \de{Strietelmeier} & >
- \< Ches & Chesley B. & Sullenberger, III & >
- \< Sully & Chesley B. & Sullenberger, III & Sully >
- \< Sun & & Sun, Yat-sen & >
\< KempMed & & Thomas, à~Kempis & >
\< KempW & Thomas & à~Kempis & >
\< Tyson & Mike & Tyson & >
@@ -403,10 +461,11 @@ the README.txt or README for more information.
\< Yosh & & Yoshida & Shigeru >
\end{nameauth}
-%^^A Add sort tags for those needing them.
+%^^A Add sort tags here for those needing them. Especially for dtx files.
\PretagName[John]{\noexpand\textSC{Adams}}{Adams, John}
\PretagName{Æthelred, II}{Aethelred 2}
\PretagName{Atatürk}{Ataturk}
+\PretagName[W.H.]{Auden}{Auden, Wystan}
\PretagName{\textit{Doctor mellifluus}}{Doctor mellifluus}
\PretagName[Charles]{\textBF{Babbage}}{Babbage, Charles}
\PretagName{Bo\"ethius}{Boethius}
@@ -415,12 +474,12 @@ the README.txt or README for more information.
\PretagName[Sammy]{\noexpand\textSC{Davis}, \noexpand\textSC{Jr}.}{Davis, Sammy, Jr.}
\PretagName{Demetrius, I}{Demetrius 1}
\PretagName[Jacques]{De~Pamele}{Depamele, Jacques}
-\PretagName[Pierre-Jean]{\noexpand\Fbox{\noexpand\AltCaps{d}e Smet}}{desmet, Pierre-Jean}
-\PretagName[Hernando]{de Soto}{Desoto, Hernando}
-\PretagName[W.E.B.]{Du~Bois}{Dubois, W.E.B.}
-\PretagName[W.E.B.]{DuBois}{Dubois, W.E.B.}
-\PretagName[Charles]{du Fresne}{Dufresne, Charles}
-\PretagName{du Cange}{Ducange}
+\PretagName[Pierre-Jean]{\noexpand\Fbox{\noexpand\AltCaps{d}e~Smet}}{deSmet, Pierre-Jean}
+\PretagName[Hernando]{de~Soto}{Desoto, Hernando}
+\PretagName[W.E.B.]{Du~Bois}{Dubois, William}
+\PretagName[W.E.B.]{DuBois}{Dubois, William}
+\PretagName[Charles]{du~Fresne}{Dufresne, Charles}
+\PretagName{du~Cange}{Ducange}
\PretagName{Elizabeth, I}{Elizabeth 1}
\PretagName{\textUC{Fukuyama}, Takeshi}{Fukuyama Takeshi}
\PretagName[Greta]{\textSC{Garbo}}{Garbo, Greta}
@@ -428,14 +487,14 @@ the README.txt or README for more information.
\PretagName{Harun, \noexpand\textSC{\noexpand\AltCaps{a}l-Rashid}}{Harun Alrashid}
\PretagName[Thomas]{\noexpand\JEFF}{Jefferson, Thomas}
\PretagName[Ada]{\textIT{Lovelace}}{Lovelace, Ada}
-\PretagName[Jan]{Łukasiewicz}{Lukasiewicz, Jan}
\PretagName[Martin]{\noexpand\textSC{Luther}}{Luther, Martin}
\PretagName[Catherine \noexpand\AltCaps{d}e']{\noexpand\textSC{Medici}}{Medici, Catherine de}
\PretagName{\noexpand\textSC{Mencius}}{Mencius}
\PretagName{\noexpand\textSC{Meng}, Ke}{Meng Ke}
+\PretagName{\textSC{Misora}, Hibari}{Misora Hibari}
\PretagName[Frenec]{Molnár}{Molnar, Frenec}
-\PretagName[John David]{\textSC{Rockefeller},\textSC{III}}{Rockefeller, John David 3}
-\PretagName[John David]{Rockefeller, IV}{Rockefeller, John David 4}
+\PretagName[J.D.]{\textSC{Rockefeller},\textSC{III}}{Rockefeller, John D 3}
+\PretagName[J.D.]{Rockefeller, IV}{Rockefeller, John D 4}
\PretagName[Heinrich Wilhelm]{\textSC{Rühmann}}{Ruehmann, Heinrich Wilhelm}
\PretagName[\noexpand\SCIPi]{\noexpand\SCIPii}{Scipio Africanus}
\PretagName[Publius]{\noexpand\CSA}{Cornelius Scipio Africanus}
@@ -447,16 +506,16 @@ the README.txt or README for more information.
\PretagName[Thomas]{à~Kempis}{Akempis, Thomas}
\PretagName{\textUC{Tokugawa}, Ieyasu}{Tokugawa Ieyasu}
\PretagName{Vlad, Ţepeş}{Vlad Tepes}
-\PretagName[E.\,B.]{White}{White, E.B.}
+\PretagName[E.\,B.]{White}{White, Elwyn}
-%^^A Add index tags for all names.
+%^^A Add index tags for all names. Failing to do this here, especially in
+%^^A dtx files, can result in errors.
\TagName[John]{\noexpand\textSC{Adams}}{, pres.|hyperpage}
\TagName{Æthelred, II}{, king|hyperpage}
-\TagName[Susan B.]{Anthony}{|hyperpage}
-\TagName{Arai, Akino}{|hyperpage}
\TagName{Aristotle}{|hyperpage}
-\TagName{Attila, the Hun}{|hyperpage}
+\TagName[W.H.]{Auden}{|hyperpage}
\TagName[Charles]{\textBF{Babbage}}{|hyperpage}
+\TagName[Thomas Haynes]{Bayly}{|hyperpage}
\TagName{Bernard, of Clairvaux}{|hyperpage}
\TagName{Bo\"ethius}{|hyperpage}
\TagName[Robert]{\textSC{Burns}}{|hyperpage}
@@ -473,11 +532,13 @@ the README.txt or README for more information.
\TagName[Sammy]{\noexpand\textSC{Davis}, \noexpand\textSC{Jr}.}{|hyperpage}
\TagName{Demetrius, I}{ Soter, king|hyperpage}
\TagName[Jacques]{De~Pamele}{|hyperpage}
-\TagName[Pierre-Jean]{\noexpand\Fbox{\noexpand\AltCaps{d}e Smet}}{|hyperpage}
-\TagName[Hernando]{de Soto}{|hyperpage}
+\TagName[Pierre-Jean]{\noexpand\Fbox{\noexpand\AltCaps{d}e~Smet}}{|hyperpage}
+\TagName[Hernando]{de~Soto}{|hyperpage}
\TagName[Marc van]{Dongen}{|hyperpage}
+\TagName[Frederick]{Douglass}{|hyperpage}
+\TagName[Betsey]{Bailey}{|hyperpage}
\TagName[W.E.B.]{Du~Bois}{|hyperpage}
-\TagName[Charles]{du Fresne}{|hyperpage}
+\TagName[Charles]{du~Fresne}{|hyperpage}
\TagName[Albert]{Einstein}{|hyperpage}
\TagName{Elizabeth, I}{, queen|hyperpage}
\TagName{\textUC{Fukuyama}, Takeshi}{|hyperpage}
@@ -493,38 +554,36 @@ the README.txt or README for more information.
\TagName[Adolf]{Harnack}{|hyperpage}
\TagName{Harun, \noexpand\textSC{\noexpand\AltCaps{a}l-Rashid}}{|hyperpage}
\TagName[Lafcadio]{Hearn}{|hyperpage}
-\TagName{Henry}[VIII]{\ddag, king|hyperpage}
+\TagName{Henry}[VIII]{, king|hyperpage}
\TagName[Bob]{Hope}{|hyperpage}
\TagName{Ishida}[Yoko]{\ddag|hyperpage}
\TagName[Thomas]{\noexpand\JEFF}{, pres.|hyperpage}
\TagName{Jesus, Christ}{|hyperpage}
-\TagName[Yoko]{Kanno}{\dag|hyperpage}
+\TagName{John, Eriugena}{|hyperpage}
\TagName[Mustafa]{Kemal}{|hyperpage}
-\TagName[John Maynard]{Keynes}{|hyperpage}
\TagName[Martin Luther]{King, Jr.}{|hyperpage}
-\TagName[The Amazing]{Kreskin}{|hyperpage}
\TagName{Lao-tzu}{|hyperpage}
-\TagName{Leo, I}{, pope|hyperpage}
\TagName[Clive Staples]{Lewis}{|hyperpage}
\TagName{Louis, XIV}{, king|hyperpage}
\TagName[Ada]{\textIT{Lovelace}}{|hyperpage}
\TagName[Uwe]{Lueck}{|hyperpage}
\TagName[Dan]{Luecking}{|hyperpage}
-\TagName[Jan]{Łukasiewicz}{|hyperpage}
\TagName[Martin]{\noexpand\textSC{Luther}}{|hyperpage}
\TagName{Maimonides}{|hyperpage}
+\TagName{\textSC{Misora}, Hibari}{|hyperpage}
\TagName[Nicolas]{Malebranche}{|hyperpage}
\TagName[Catherine \noexpand\AltCaps{d}e']{\noexpand\textSC{Medici}}{|hyperpage}
\TagName{\noexpand\textSC{Mencius}}{|hyperpage}
\TagName{Miyazaki, Hayao}{|hyperpage}
\TagName[Frenec]{Molnár}{\dag|hyperpage}
\TagName[Hideyo]{Noguchi}{\dag|hyperpage}
+\TagName{Novalis}{|hyperpage}
\TagName[Heiko]{Oberdiek}{|hyperpage}
\TagName[George S.]{Patton, Jr.}{|hyperpage}
\TagName[Lucius]{Sergius Paulus}{|hyperpage}
\TagName{Rambam}{|hyperpage}
-\TagName[John David]{\textSC{Rockefeller},\textSC{III}}{|hyperpage}
-\TagName[John David]{Rockefeller, IV}{|hyperpage}
+\TagName[J.D.]{\textSC{Rockefeller},\textSC{III}}{|hyperpage}
+\TagName[J.D.]{Rockefeller, IV}{|hyperpage}
\TagName[Heinz]{\textSC{Rühmann}}{|hyperpage}
\TagName{Saul, of Tarsus}{|hyperpage}
\TagName[Robert]{Schlicht}{|hyperpage}
@@ -533,9 +592,9 @@ the README.txt or README for more information.
\TagName[\noexpand\WM]{\noexpand\SHK}{|hyperpage}
\TagName[R.]{Snel van Royen}{|hyperpage}
\TagName[W.]{Snel van Royen}{|hyperpage}
+\TagName[Gertrude]{Stein}{|hyperpage}
\TagName[Philipp]{Stephani}{|hyperpage}
\TagName[John]{\de{Strietelmeier}}{|hyperpage}
-\TagName[Chesley B.]{Sullenberger, III}{|hyperpage}
\TagName{Sun, Yat-sen}{, pres.|hyperpage}
\TagName{Thomas, à~Kempis}{|hyperpage}
\TagName{Thomas, Aquinas}{|hyperpage}
@@ -551,10 +610,11 @@ the README.txt or README for more information.
\TagName[E.\,B.]{White}{|hyperpage}
\TagName{William, I}{|hyperpage}
\TagName{Yamamoto, Isoroku}{|hyperpage}
-\TagName{Yohko}{|hyperpage}
\TagName{Yoshida}[Shigeru]{\ddag, PM|hyperpage}
\TagName[Caspar]{Ziegler}{|hyperpage}
+%^^A These options allow the index to focus on names in the index more like
+%^^A one might see in a normal document.
\DisableCrossrefs
\CodelineIndex
\RecordChanges
@@ -566,7 +626,7 @@ the README.txt or README for more information.
%</driver>
% \fi
%
-% \CheckSum{3799}
+% \CheckSum{3447}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -585,66 +645,104 @@ the README.txt or README for more information.
% Right brace \} Tilde \~}
%
% \changes{0.7}{2011/12/26}{Initial release}
+% \changes{0.75}{2012/01/19}{Standardized arguments}
+% \changes{0.85}{2012/02/05}{Show or hide commas}
% \changes{1.0}{2012/02/20}{Works with \textsf{microtype}, \textsf{memoir}}
-% \changes{2.0}{2015/11/11}{Use dtxgen; prevent bad args}
+% \changes{2.3}{2016/01/05}{New back-end for naming macros}
% \changes{2.5}{2016/04/06}{No default format}
-% \changes{3.3}{2020/02/20}{Update manual}
+% \changes{3.2}{2017/03/22}{Root, suffix macros renamed, redesigned}
% \changes{3.4}{2020/02/26}{Update manual, \texttt{examples.tex}}
+% \changes{3.5}{2020/11/23}{Updates to manual, \texttt{Readme.md}, \texttt{Makefile}, \texttt{examples.tex}, combine \texttt{Readme.md} and \texttt{examples.tex} files in \texttt{dtx}}
%
% \GetFileInfo{\jobname.dtx}
%
% \DoNotIndex{\@empty, \@gobble, \@period, \@token, \trim@spaces,
% \zap@space}
-%
+%
% \DoNotIndex{\begingroup, \bfseries, \bgroup, \csdef, \csgdef, \csname,
% \csundef, \DeclareOption, \def, \detokenize, \edef, \egroup, \else,
% \endcsname, \endgroup, \endinput, \ExecuteOptions, \expandafter, \fi,
% \futurelet, \global, \hbox, \if, \ifcsname, \ifx, \ignorespaces, \index,
% \itshape, \leavevmode, \let, \newcommand, \newcommandx, \newenvironment,
% \newif, \nobreakspace, \PackageError, \PackageWarning, \ProcessOptions,
-% \relax, \renewcommand, \RequirePackage, \scshape, \space, \textbackslash,
-% \uppercase}
-%
-% \newif\ifNoTag
-% \newif\ifDoTikZ
-% \ifxetex
-% \DoTikZtrue
-% \else
-% \ifluatex
-% \ifpdf
-% \DoTikZtrue
-% \fi
-% \else
-% \ifpdf
-% \DoTikZtrue
-% \fi
-% \fi
-% \fi
+% \relax, \renewcommand, \RequirePackage, \scshape, \textbackslash, \uppercase}
+%
+% \hfuzz=3pt
%
% \ClearNum
-% \ifDoTikZ
-% \tcbset{fonttitle=\bfseries\sffamily,box align=top,lower separated=false}
-% \fi
-%
-% \renewcommand*\FrontNamesFormat[1]{\color{nared}\sffamily #1}
-% \renewcommand*\FrontNameHook[1]{\color{nagreen}\sffamily #1}
-% \renewcommand*\NamesFormat[1]{\color{nablue}\sffamily #1}
-% \renewcommand*\MainNameHook[1]{\color{nabrown}\sffamily #1}
-% \newcommand*\ReturnLink{\ifDoTikZ
-% \begin{tcolorbox}\centering Back to Section~\ref{sec:Dashboard}\end{tcolorbox}\else
-% \medskip{\hfil\large Back to Section~\ref{sec:Dashboard}}\fi}
+% \tcbset{fonttitle=\bfseries\sffamily,box align=top,lower separated=false}
%
-% \newif\ifFontDebug
-%^^A \FontDebugtrue
+% \renewcommand*\FrontNamesFormat[1]{\color{red}\sffamily #1}
+% \renewcommand*\FrontNameHook[1]{\color{darkgray}\sffamily #1}
+% \renewcommand*\NamesFormat[1]{\color{blue}\sffamily #1}
+% \renewcommand*\MainNameHook[1]{\sffamily #1}
+% \newcommand*\ReturnLink{\leavevmode^^A
+% \begin{tcolorbox}\centering Back to Section~\ref{sec:Dashboard}\end{tcolorbox}^^A
+% \leavevmode}
%
+%^^A This helps track down any stray or unintended changes to font sizes.
+% \newif\ifFontDebug
+%^^A Uncomment the following line to debug font sizes.
+%^^A\FontDebugtrue
% \makeatletter
-% \@setpar{\ifFontDebug\edef\@FS{ \f@size pt}{\tiny\@FS}\fi\@@par}
+% \@setpar{^^A
+% \ifFontDebug
+% \edef\@FS{ \f@size pt}^^A
+% \unless\ifinner\marginpar{\scriptsize\normalfont\@FS}\fi
+% \fi
+% \@@par}
% \makeatother
%
-% \begingroup\FontDebugfalse
+%^^A Global definitions of conditionals for examples
+%^^A For Scipio Africanus
+% \newif\ifSkipGens
+% \newif\ifNoGens
+% \newif\ifSkipAgnomen
+% \newif\ifNoAgnomen
+%^^A For Thomas Jefferson
+% \newif\ifGenitive
+% \newif\ifDoGen
+%^^A For George Washington/Mustafa Kemal
+% \newif\ifNoTag
+%^^A For William Shakespeare
+% \newif\ifSpecialFN
+% \newif\ifSpecialSN
+% \newif\ifRevertSN
+%^^A For advanced hooks
+% \newif\ifFbox
+% \newif\ifFirstCap
+% \newif\ifInHook
+% \Fboxtrue
+% \newif\ifCaps
+%^^A Global definitions of macros for examples
+%^^A For Scipio Africanus
+% \newcommand*\SCIPi{\ifNoGens
+% Publius\else Publius Cornelius\fi}
+% \newcommand*\SCIPii{\ifNoAgnomen
+% Scipio\else Scipio Africanus\fi}
+% \newcommand*\ScipioOnly{\SkipAgnomentrue\Scipio}
+% \newcommand*\CSA{\ifNoGens\ifNoAgnomen
+% Scipio\else
+% Scipio Africanus\fi
+% \else\ifNoAgnomen
+% Cornelius Scipio\else
+% Cornelius Scipio Africanus\fi\fi}
+% \ExcludeName[Publius]{\noexpand\CSA}
+%^^A For Thomas Jefferson
+% \newcommand\JEFF{\ifDoGen\textSC{Jefferson's}\else\textSC{Jefferson}\fi}
+%^^A For William Shakespeare
+% \newcommand*\WM{\ifSpecialFN Wm.\else William\fi}
+% \newcommand*\SHK{\ifRevertSN \textSC{Shakespeare}\else
+% \ifSpecialSN \noexpand\AltCaps{t}he Bard\else
+% \textSC{Shakespeare}\fi\fi}
+% \newcommand*\Revert{\RevertSNtrue}
+%^^A End of global definitions for examples
+%
+% \begingroup^^A This group prevents font debugging on the title page.
+% \FontDebugfalse
% \title{\textsf{nameauth} --- Name authority mechanism\\ for consistency in text and
% index\thanks{This file describes version \fileversion, last revised \filedate.}}
-% \author{Charles P. Schaum\thanks{E-mail: charles dot schaum@comcast.net}}
+% \author{Charles P. Schaum\thanks{E-mail: charles[dot]schaum@comcast.net}}
% \date{Released \filedate}
%
% \maketitle
@@ -654,513 +752,548 @@ the README.txt or README for more information.
% \end{abstract}
%
% \bgroup\small\tableofcontents\egroup
-% \endgroup
+% \endgroup^^A End title page group.
+% \newpage
%
% \section{Quick Start}
+% \begin{tcolorbox}[colback=white,colframe=nared,adjusted title={\hfil Disclaimer}]
+% \small\noindent Names are about real people; examples should be too. This manual mentions notable figures both living and deceased. All names herein are meant to be used respectfully, for teaching purposes only. At no time is any disrespect or bias intended.
+% \end{tcolorbox}
%
-% \subsection{How to Use the Manual}
+% \subsection{Introduction}
+% A \emph{name authority} is a canonical, scholarly list of name forms to which all variant name forms and aliases must refer. The task dashboard (Section~\ref{sec:Dashboard}) guides one to various areas of interest. To load the defaults, simply type:
+% \begin{center}
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\texttt{\textbackslash usepackage\{nameauth\}}\\
+% \end{tabular}
+% }\smallskip
+% \end{center}
+%
+% The \textsf{nameauth} macros permit ambiguity because name forms are ambiguous unless they are put into a cultural context. Therefore, keep it simple. Use the quick interface. Use the fewest number of \textsf{nameauth} macros for one's use case.
%
-% A \emph{name authority} is a canonical, scholarly list of names to which all variants must refer. The task dashboard (Section~\ref{sec:Dashboard}) guides one to various areas of interest. Start with the basics and add features as needed. To load the defaults, simply type:
-% \begin{quote}
-% \fbox{\mystrut\ \texttt{\textbackslash usepackage\{nameauth\}} }
-% \end{quote}
+% \begin{center}\bfseries Package Design and Features\end{center}
%
-% \begin{center}\large\bfseries Package Design and Features\end{center}
-% \noindent With \textsf{nameauth} names become abstractions: verbs that alter state and nouns that have state. That improves accuracy and consistency:
+% The editorial process for book-length projects may require one to add, delete, or relocate text. Several issues emerge from this:
% \begin{itemize}
-% \item \emph{Automate} name forms used in professional writing. First uses of names will have full forms. Later uses have shorter forms. Names vary in the text, but stay constant in the index.
-% \item Permit \emph{complex name formatting}.
-% \item Many \emph{cross-cultural, multilingual naming conventions} are possible. More details appear in Sections~\ref{sec:ErrorProt}, \ref{sec:AltFormat}, \ref{sec:IndexSort}, and~\ref{sec:Hooksiii}.
-% \item \emph{Automatic sort keys and tags} aid indexing.
-% \item One can \emph{associate information with names.}
-% \item The standard used for implementing the \textsf{nameauth} indexing macros is Nancy C. Mulvany, \textit{Indexing Books} (Chicago: University of Chicago Press, 1994). All references [\hypertarget{Mulvany}{Mulvany}] refer to this edition.
-% \item In Section~\ref{sec:ErrorProt} we see how to avoid common errors.
-% \item Section~\ref{sec:TechNotes} contains \emph{thanks} and various technical notes.
+% \item Professional writing needs a full name form to introduce a person, using shorter forms thereafter. Moving text may require re-checking names.
+% \item If a name is keyed to another name or narrative event, moving text may require checking for anachronistic references.
+% \item Including special information in the index, such as including non-Latin script name forms with Latin script forms, can be complex and tedious.
+% \item Unless one is familiar with professional indexing, one might create incorrect index entries.
+% \item One must check if any names straddle page breaks and index them.
% \end{itemize}
%
-% \begin{center}\large\bfseries Special Signs\end{center}
-% \noindent As teaching aids, this manual uses markings that are not part of \textsf{nameauth}, but in some cases are implemented using it:
+% The \textsf{nameauth} package provides automated solutions for all points above at the time of writing. Names become abstractions; they are verbs that alter state and nouns that have state. That improves accuracy and consistency:
% \begin{itemize}
-% \item[\ \ ]We show \fbox{\mystrut\NamesFormat{first uses}} and \fbox{\mystrut\MainNameHook{subsequent uses}} of names (Sections~\ref{sec:Formatting}, \ref{sec:NameControl}).
+% \item \emph{Automate} name forms. First uses of names have long forms. Later uses are short by default. Names vary in the text, but not in the index.
+% \item Implement \emph{cross-cultural, multilingual naming conventions}.
+% \item Implement \emph{complex name formatting} using conditional elements.
+% \item Improve indexing with \emph{automatic sorting and tagging, and cross-reference control.} Indexing rules are based on Nancy C. Mulvany, \textit{Indexing Books} (Chicago: University of Chicago Press, 1994). All references [\hypertarget{Mulvany}{Mulvany}] refer to this edition.
+% \item \emph{Associate and retrieve information} bound to names.
+% \end{itemize}
+%
+% \begingroup
+% \renewcommand{\NamesFormat}{}
+% \renewcommand{\MainNameHook}{}
+% For example,\IdxInfo{\ShowIdxPageref*[Frederick]{Douglass}\break \ShowIdxPageref*[Betsey]{Bailey}} from a biography written a century ago, we show reordered paragraphs that require no subsequent changes. We use the ``quick interface'' and no name formatting (the package default). We ``forget'' names at the top of the right-hand column to simulate not using them yet (Section~\ref{sec:NameControl}):
+% \begin{quote}\small
+% \begin{multicols}{2}
+% |\Doug\| \Doug\ rose to eminence by sheer force of character and talents that neither slavery nor caste proscription could crush. Circumstances could not prevent him from becoming a freeman and a leader.
+%
+% |\Doug's| \Doug's early life is perhaps the most complete indictment of the slave system ever presented at the bar of public opinion.
+%
+% |\Doug\| \Doug\ was born in February, l8l7. His earliest memories centered around the private cabin of his grandmother, |\Bailey,| \Bailey, who was charged with only the duty of looking after young children.
+%
+% \columnbreak\ForgetName[Frederick]{Douglass}\ForgetName[Betsey]{Bailey}
+% |\Doug's| \Doug's early life is perhaps the most complete indictment of the slave system ever presented at the bar of public opinion.
+%
+% |\Doug\| \Doug\ was born in February, l8l7. His earliest memories centered around the private cabin of his grandmother, |\Bailey,| \Bailey, who was charged with only the duty of looking after young children.
+%
+% |\Doug\| \Doug\ rose to eminence by sheer force of character and talents that neither slavery nor caste proscription could crush. Circumstances could not prevent him from becoming a freeman and a leader.
+% \end{multicols}
+% \end{quote}
+% \endgroup
+%
+% \subsection{How to Use the Manual}
+% Topics in this manual that are more basic or frequent in use are toward the front. Topics that are more complex or less-used are toward the back. As topics get more advanced, various sections mutually inform each other.
+%
+% For reference, throughout this manual we show simplified and complete \emph{name patterns} in the margins (Section~\ref{sec:NamePatterns}). These patterns control name behavior. In the early pages of the manual we also show \emph{basic index entries} in the margins.
+%
+% \begin{center}\bfseries Special Signs\end{center}
+% \noindent This manual uses signs and illustrative typesetting that are not built-in defaults of \textsf{nameauth}, but in some cases are implemented using it:
+% \begin{itemize}
+% \item[\ \ ]We often highlight {\NamesFormat{first}} and {\MainNameHook{later}} uses of names (Sections~\ref{sec:Formatting}, \ref{sec:NameControl}).
% \item[\dag\ ]A dagger indicates ``non-native'' Eastern forms (Section~\ref{sec:Eastern}).
% \item[\ddag\ ]A double dagger shows usage of the obsolete syntax (Section~\ref{sec:Obsolete}).
% \item[\S\ ]A section mark denotes index entries of fictional names.
% \item[\(\leftarrow\)]Major\Version{3.0} changes have package version numbers in the margin.
% \item[\(\leftarrow\)]The\Warn{} ``dangerous bend'' shows where caution is needed.
% \end{itemize}
+% \vfill
%
-% \ifDoTikZ\begin{tcolorbox}[colback=white,colframe=nared,adjusted title={\hfil Disclaimer}]\else
-% \begin{center}\large\bfseries Disclaimer\end{center}\fi
-% \noindent Names are about real people. This manual mentions notable figures both living and deceased. All names herein are meant to be used respectfully, for teaching purposes only. At no time is any disrespect or bias intended.
-% \ifDoTikZ\end{tcolorbox}\fi
+% \begin{tcolorbox}[colback=white,colframe=nared,adjusted title={\hfil Thanks}]
+% \small\noindent Thanks to \Name[Marc van]{Dongen}, \Name[Enrico]{Gregorio}, \Name[Philipp]{Stephani}, \Name[Heiko]{Oberdiek}, \Name[Uwe]{Lueck}, \Name[Dan]{Luecking} and \Name[Robert]{Schlicht} for assistance in early versions of this package. Thanks also to users for valuable feedback.\vfil
+% \end{tcolorbox}
% \newpage
%
% \subsection{Task Dashboard}
% \label{sec:Dashboard}
%
% Here we link to sections by task in order to get things done quickly. Many sections have return links at their end that bring the reader back to this page.
-% \ifDoTikZ
-% \begin{tcolorbox}[colframe=naslate,adjusted title={\hfil Where do you want to go today?}]\centering
-% \tcbox[equal height group=Z,on line,tikznode,colframe=nabrown,colback=white,adjusted title={\bfseries\sffamily\hfil Quick Start}]{Sections~\ref{sec:QuickStart}, \ref{sec:TradStart},\\ \ref{sec:SimpleStart}, \ref{sec:SelectOver}, \ref{sec:Obsolete},\\ \ref{sec:NamePatterns}, \ref{sec:ErrorProt}}\hfill
-% \tcbox[equal height group=Z,on line,tikznode,colframe=nabrown,colback=white,adjusted title={\bfseries\sffamily\hfil Basics}]{Package options:\\ Section~\ref{sec:PkgOptions}}\hfill
-% \tcbox[equal height group=Z,on line,tikznode,colframe=nabrown,colback=white,adjusted title={\bfseries\sffamily\hfil Basics}]{Name macros:\\ Sections~\ref{sec:Naming},\\ \ref{sec:FName}}\bigskip
-%
-% \tcbox[equal height group=Zi,on line,tikznode,colframe=nagreen,colback=white,adjusted title={\bfseries\sffamily\hfil Intermediate}]{Variant forms:\\Sections~\ref{sec:VarNames},\\\ref{sec:NameParticles}, \ref{sec:IndexXref}}\hfill
-% \tcbox[equal height group=Zi,on line,tikznode,colframe=nagreen,colback=white,adjusted title={\bfseries\sffamily\hfil Intermediate}]{Avoid errors: Sec-\\tions~\ref{sec:Obsolete}, \ref{sec:NamePatterns}, \ref{sec:ErrorProt},\\ \ref{sec:NameParticles}, \ref{sec:Unicode}}\hfill
-% \tcbox[equal height group=Zi,on line,tikznode,colframe=naviolet,colback=white,adjusted title={\bfseries\sffamily\hfil Language}]{Western names:\\ Sections~\ref{sec:Affix},\\ \ref{sec:LastFirst}}\bigskip
-%
-% \tcbox[equal height group=Zii,on line,tikznode,colframe=naviolet,colback=white,adjusted title={\bfseries\sffamily\hfil Language}]{Eastern names:\\ Sections~\ref{sec:Affix},\\ \ref{sec:Eastern}}\hfill
-% \tcbox[equal height group=Zii,on line,tikznode,colframe=naviolet,colback=white,adjusted title={\bfseries\sffamily\hfil Language}]{Particles, medieval,\\ ancient names: Sec-\\ tions\,\ref{sec:NameParticles},\,\ref{sec:AltFormat},\,\ref{sec:Hooksiii}}\hfill
-% \tcbox[equal height group=Zii,on line,tikznode,colframe=nataupe,colback=white,adjusted title={\bfseries\sffamily\hfil Index}]{Index entries\\ and control:\\ Section~\ref{sec:IndexControl}}\bigskip
-%
-% \tcbox[equal height group=Ziii,on line,tikznode,colframe=nataupe,colback=white,adjusted title={\bfseries\sffamily\hfil Index}]{\hbox to 0.385\textwidth{\ Index cross-refs, automatic\ }\\ sorting, and auto-info: Sec-\\ tions~\ref{sec:IndexXref}, \ref{sec:IndexSort}, \ref{sec:IndexTag}, \ref{sec:AKA}}\hfill
-% \tcbox[equal height group=Ziii,on line,tikznode,colframe=nared,colback=white,adjusted title={\bfseries\sffamily\hfil Advanced}]{\hbox to 0.39\textwidth{Generally manage how names}\\ are typeset: Sections~\ref{sec:Formatting}, \ref{sec:AltFormat},\\ \ref{sec:NameControl}, \ref{sec:NameTests}, \ref{sec:Hooksi}\,--\,\ref{sec:Customize}}\bigskip
%
-% \tcbox[equal height group=Ziv,on line,tikznode,colframe=nared,colback=white,adjusted title={\bfseries\sffamily\hfil Advanced}]{\hbox to 0.385\textwidth{Generally manage names by}\\ using a name authority: Sec-\\ tions~\ref{sec:VarNames}, \ref{sec:Formatting}, \ref{sec:IndexControl}, \ref{sec:NameControl}}\hfill
-% \tcbox[equal height group=Ziv,on line,tikznode,colframe=nared,colback=white,adjusted title={\bfseries\sffamily\hfil Advanced}]{Make complex elements\\\hbox to 0.39\textwidth{determined automatically by}\\ names: Sections \ref{sec:TextTags}, \ref{sec:NameTests}}\bigskip
-%
-% \tcbox[equal height group=Zv,on line,tikznode,colframe=nablue,colback=white,adjusted title={\bfseries\sffamily\hfil Application}]{Use \textsf{nameauth} with \textsf{beamer}\\\hbox to 0.385\textwidth{overlays to get correct name}\\ forms: Sections~\ref{sec:Formatting}, \ref{sec:NameDecisions},\\ \ref{sec:NameControl}, \ref{sec:NameTests}}\hfill
-% \tcbox[equal height group=Zv,on line,tikznode,colframe=nablue,colback=white,adjusted title={\bfseries\sffamily\hfil Application}]{\hbox to 0.39\textwidth{History / game books, other}\\ complex layouts: Sections\\ \ref{sec:Formatting}, \ref{sec:IndexTag}, \ref{sec:TextTags}, \ref{sec:NameControl},\\ \ref{sec:NameTests}, \ref{sec:Hooksi}\,--\,\ref{sec:Hooksiii}}\smallskip
+% \begin{tcolorbox}[colframe=naslate,adjusted title={\hfil Where do you want to go today?}]\centering
+% \tcbox[equal height group=Z,on line,tikznode,colframe=nablue,colback=white,adjusted title={\bfseries\sffamily\hfil Quick Start}]{^^A
+% Basic concepts: \ref{sec:QuickStart}\\
+% Macros: \ref{sec:TradStart}, \ref{sec:SimpleStart}, \ref{sec:SelectOver}\\
+% Various hints: \ref{sec:Hints}}^^A
+% \hfill
+% \tcbox[equal height group=Z,on line,tikznode,colframe=nablue,colback=white,adjusted title={\bfseries\sffamily\hfil Basics}]{^^A
+% Package options: \ref{sec:PkgOptions}\\
+% Name macros: \ref{sec:Naming}, \ref{sec:FName}\\
+% Simple\,Variants\,(text/index): \ref{sec:VarNames}, \ref{sec:Indexing}}^^A
+% \vspace{9pt}
+%
+% \tcbox[equal height group=Zi,on line,tikznode,colframe=nagreen,colback=white,adjusted title={\bfseries\sffamily\hfil Language}]{^^A
+% Western names: \ref{sec:Affix}, \ref{sec:LastFirst}\\
+% Eastern names: \ref{sec:Affix}, \ref{sec:Eastern}\\
+% Particles: \ref{sec:NameParticles}, \ref{sec:AltFormat}, \ref{sec:Hooksiii}}^^A
+% \hfill
+% \tcbox[equal height group=Zi,on line,tikznode,colframe=nagreen,colback=white,adjusted title={\bfseries\sffamily\hfil Language}]{^^A
+% Medieval/Ancient: \ref{sec:NameAncient}, \ref{sec:Hooksi}\\
+% ``Continental'' typesetting:\\
+% \ref{sec:AltFormat}, \ref{sec:AltBasic}, \ref{sec:AltAdvanced}, \ref{sec:Hooksiii}}^^A
+% \vspace{9pt}
+%
+% \tcbox[equal height group=Zii,on line,tikznode,colframe=nataupe,colback=white,adjusted title={\bfseries\sffamily\hfil Index}]{^^A
+% Page entries, index\\
+% \,control, \& xrefs: \ref{sec:GeneralIndex}\,}^^A
+% \hfill
+% \tcbox[equal height group=Zii,on line,tikznode,colframe=nataupe,colback=white,adjusted title={\bfseries\sffamily\hfil Index}]{^^A
+% Setting up automatic sorting: \ref{sec:IndexSort}\\
+% Auto-add info to index entries: \ref{sec:IndexTag}}^^A
+% \vspace{9pt}
+%
+% \tcbox[equal height group=Ziii,on line,tikznode,colframe=nabrown,colback=white,adjusted title={\bfseries\sffamily\hfil Intermediate}]{^^A
+% Name info database: \ref{sec:TextTags}\\
+% Test for the presence of names:\\
+% \ref{sec:NameDecisions}, \ref{sec:NameControl}, \ref{sec:NameTests}}^^A
+% \hfill
+% \tcbox[equal height group=Ziii,on line,tikznode,colframe=nared,colback=white,adjusted title={\bfseries\sffamily\hfil Advanced}]{^^A
+% \hbox{\ }Various discussions about\hbox{\ }\\
+% errors: \ref{sec:NameParticles}, \ref{sec:Warnings}, \ref{sec:Errors},\\
+% \ref{sec:Obsolete}, \ref{sec:NamePatterns}, \ref{sec:Unicode}}^^A
+% \vspace{9pt}
+%
+% \tcbox[equal height group=Ziv,on line,tikznode,colframe=nared,colback=white,adjusted title={\bfseries\sffamily\hfil Advanced}]{^^A
+% Formatting: \ref{sec:Formatting}, \ref{sec:AltFormat}, \ref{sec:AltBasic},\\
+% \ref{sec:AltAdvanced}, \ref{sec:Hooksi}, \ref{sec:Hooksii}, \ref{sec:Hooksiii}\\
+% Customizing: \ref{sec:Customize}}^^A
+% \hfill
+% \tcbox[equal height group=Ziv,on line,tikznode,colframe=nared,colback=white,adjusted title={\bfseries\sffamily\hfil Advanced}]{^^A
+% Link names \& text to sequences\\
+% of time or ideas: \ref{sec:TextTags}, \ref{sec:NameTests}\\
+% (history/game books)}^^A
+% \vspace{9pt}
+%
+% \tcbox[equal height group=Zv,on line,tikznode,colframe=nared,colback=white,adjusted title={\bfseries\sffamily\hfil Advanced}]{^^A
+% Use different formats\\
+% to call out information: \ref{sec:TextTags},\\
+% \ \ref{sec:Formatting}, \ref{sec:AltFormat}, \ref{sec:NameTests},
+% \ref{sec:Hooksi}, \ref{sec:Hooksii},\ \ \ \\
+% \ref{sec:Hooksiii} (history/game books)}^^A
+% \hfill
+% \tcbox[equal height group=Zv,on line,tikznode,colframe=nared,colback=white,adjusted title={\bfseries\sffamily\hfil Advanced}]{^^A
+% Use \textsf{nameauth} with \textsf{beamer}\\
+% overlays to get correct name\\
+% forms: Sections~\ref{sec:Formatting}, \ref{sec:NameDecisions},\\
+% \ref{sec:NameControl}, \ref{sec:NameTests}}^^A
+% \vspace{4pt}
+%
+% \begin{tcolorbox}[colframe=nared,colback=white]
+% \centering For building the \textsf{nameauth} package, see \texttt{README.md},\\
+% located with this manual, and Section~\ref{sec:TechNotes}.
+% \end{tcolorbox}
+% \vspace{-3pt}
% \end{tcolorbox}
-% \else
-% \begin{center}
-% \begin{tabularx}{0.9\textwidth}{@{}X|X|X@{}}\toprule
-% &&\\
-% Concept overview: Sections~\ref{sec:QuickStart}, \ref{sec:TradStart}, \ref{sec:SimpleStart}, \ref{sec:SelectOver}, \ref{sec:Obsolete}, \ref{sec:NamePatterns}, \ref{sec:ErrorProt} & Package options: Section~\ref{sec:PkgOptions} & Basic macros: Section \ref{sec:Naming}, \ref{sec:FName}\\
-% &&\\\midrule
-% &&\\
-% Variant forms: Sections~\ref{sec:VarNames}, \ref{sec:NameParticles}, \ref{sec:IndexXref} & Avoid errors: Sections~\ref{sec:Obsolete}, \ref{sec:NamePatterns}, \ref{sec:ErrorProt}, \ref{sec:NameParticles}, \ref{sec:Unicode} & Western names: Sections~\ref{sec:Affix}, \ref{sec:LastFirst}\\
-% &&\\\midrule
-% &&\\
-% Eastern names: Sections~\ref{sec:Affix}, \ref{sec:Eastern} & Particles, medieval, ancient names: Sections~\ref{sec:NameParticles}, \ref{sec:AltFormat}, \ref{sec:Hooksiii} & Index entries and control: Section~\ref{sec:IndexControl}\\
-% &&\\\midrule
-% &&\\
-% Index cross-refs, automatic sorting, and auto-info: Sections~\ref{sec:IndexXref}, \ref{sec:IndexSort}, \ref{sec:IndexTag}, \ref{sec:AKA} & Generally manage how names are typeset: Sections~\ref{sec:Formatting}, \ref{sec:AltFormat}, \ref{sec:NameControl}, \ref{sec:NameTests}, \ref{sec:Hooksi}\,--\,\ref{sec:Customize} & Generally manage names by using a name authority: Sections~\ref{sec:VarNames}, \ref{sec:Formatting}, \ref{sec:IndexControl}, \ref{sec:NameControl}\\
-% &&\\\midrule
-% &&\\
-% Make complex elements determined automatically by names: Sections \ref{sec:TextTags}, \ref{sec:NameTests} & Use \textsf{nameauth} with \textsf{beamer} overlays to get correct name forms: Sections~\ref{sec:Formatting}, \ref{sec:NameDecisions}, \ref{sec:NameControl}, \ref{sec:NameTests} & History\,/\,game books, other complex layouts: Sections~\ref{sec:Formatting}, \ref{sec:IndexTag}, \ref{sec:TextTags}, \ref{sec:NameControl}, \ref{sec:NameTests}, \ref{sec:Hooksi}\,--\,\ref{sec:Hooksiii}\\
-% &&\\\bottomrule
-% \end{tabularx}
-% \end{center}
-% \fi
-% \newpage
%
-% \subsection{Basic Concepts}
+% \subsection{Basic Name Concepts}
% \label{sec:QuickStart}
%
% We encode names in macro arguments to address multiple naming systems. Required name elements are shown in \emph{black}; optional parts are in \emph{\color{nared}red}.\footnote{Compare [\hyperlink{Mulvany}{Mulvany}, 152--82] and the \textit{Chicago Manual of Style}.}
-% The arguments appear in the order \meta{FNN} \meta{SNN} \meta{Affix} \meta{Alternate}:
-%
-% \ifDoTikZ
-% \noindent\begin{tcolorbox}[colframe=naslate,adjusted title={Western Name}]\centering
-% \tcbox[equal height group=A,on line,tikznode,colback=white,adjusted title={\bfseries\sffamily Forename(s):\\ \meta{FNN}}]{%
-% Personal name(s):\\
-% \textit{baptismal name}\\
-% \textit{Christian name}\\
-% \textit{multiple names}\\
-% \textit{praenomen}\footnotemark\\
-% \hphantom{Family\,/\,clan name}}
-% \tcbox[equal height group=A,on line,tikznode,colback=white,adjusted title={\bfseries\sffamily Surname(s):\\ \meta{SNN}}]{%
-% Family name:\\
-% \textit{of father, mother}\\
-% \textit{ancestor, vocation}\\
-% \textit{origin, region}\\
-% \textit{nomen, cognomen}\\
-% \textit{patronym}\\
-% \vspace{-2ex}\hphantom{\textit{ancestor, vocation}}}
-% \tcbox[equal height group=A,on line,tikznode,colback=white,colframe=nared,adjusted title={\bfseries\sffamily Descriptor:\\ \meta{Affix}}]{%
-% Sobriquet\,/\,title:\\
-% \textit{Sr., Jr., III\dots}\\
-% \textit{notable attribute}\\
-% \textit{origin, region}}
-% \tcbox[tikznode,colback=white,colframe=nared,adjusted title={\bfseries\sffamily Alternate Name(s): \meta{Alternate}}]{\hbox to 0.913\textwidth{\hfil In the body text, not the index, \meta{Alternate} swaps with \meta{FNN}\hfil}\\ \hbox to 0.913\textwidth{\hfil for Western names and \meta{Affix} for all other name categories.\hfil}}
-% \end{tcolorbox}\medskip
-% \begin{tcolorbox}[colframe=naslate,adjusted title={Eastern Name}]\centering
-% \tcbox[equal height group=B,on line,tikznode,colback=white,adjusted title={\bfseries\sffamily Family name:\\ \meta{SNN}}]{Family\,/\,clan name}
-% \tcbox[equal height group=B,on line,tikznode,colback=white,adjusted title={\bfseries\sffamily Personal name:\\ \meta{Affix}}]{Seldom multiple\\
-% names; multi-\\
-% character okay.\\
-% \vspace{-2ex}\hphantom{\textit{ancestor, vocation}}}
-% \tcbox[equal height group=B,on line,tikznode,colback=white,colframe=nared,adjusted title={\bfseries\sffamily Descriptor:\\ \meta{Alternate}}]{%
-% Title, etc.\\
-% (old syntax for\\
-% personal names)\\
-% \vspace{-2ex}\hphantom{Sobriquet\,/\,title:}}
-% \end{tcolorbox}\medskip
-% \begin{tcolorbox}[colframe=naslate,adjusted title={Ancient name}]\centering
-% \tcbox[equal height group=C,on line,tikznode,colback=white,adjusted title={\bfseries\sffamily Personal name:\\ \meta{SNN}}]{Given name(s)\\
-% \hphantom{Family\,/\,clan name}}
-% \tcbox[equal height group=C,on line,tikznode,colback=white,colframe=nared,adjusted title={\bfseries\sffamily Descriptor:\\ \meta{Affix}}]{%
-% Sobriquet\,/\,title:\\
-% \textit{Sr., Jr., III\dots}\\
-% \textit{notable attribute}\\
-% \textit{origin, region}\\
-% \textit{patronym}\\
-% \vspace{-2ex}\hphantom{\textit{ancestor, vocation}}}
-% \tcbox[equal height group=C,on line,tikznode,colback=white,colframe=nared,adjusted title={\bfseries\sffamily Descriptor:\\ \meta{Alternate}}]{%
-% Alternate name\\
-% (old syntax for\\
-% titles, etc.)\\
-% \hphantom{Sobriquet\,/\,title:}}
+% The arguments appear in the order \meta{FNN} \meta{SNN} \meta{Affix} \meta{Alternate}. Section~\ref{sec:Obsolete} shows the obsolete syntax, which is usable but discouraged. Basic syntactic forms are:
+%
+% \noindent\begin{tcolorbox}[colframe=naslate,adjusted title={Western Name and ``Non-native'' Eastern Name}]
+% \tcbox[equal height group=A,on line,tikznode,colback=white,adjusted title={\bfseries\sffamily Forename(s):\\ \meta{FNN}}]{%
+% Personal name(s):\\
+% \textit{baptismal name}\\
+% \textit{Christian name}\\
+% \textit{multiple names}\\
+% \textit{praenomen}\footnotemark\\
+% \hphantom{Family/clan name}}\hfill
+% \tcbox[equal height group=A,on line,tikznode,colback=white,adjusted title={\bfseries\sffamily Surname(s):\\ \meta{SNN}}]{%
+% Family name:\\
+% \textit{of father, mother}\\
+% \textit{ancestor, vocation}\\
+% \textit{origin, region}\\
+% \textit{nomen, cognomen}\\
+% \textit{patronym}\\
+% \vspace{-2ex}\hphantom{\textit{ancestor, vocation}}}\hfill
+% \tcbox[equal height group=A,on line,tikznode,colback=white,colframe=nared,adjusted title={\bfseries\sffamily Descriptor:\\ \meta{Affix}}]{%
+% Sobriquet/title:\\
+% \textit{Sr., Jr., III\dots}\\
+% \textit{notable attribute}\\
+% \textit{origin, region}}
+%
+% \begin{tcolorbox}[colback=white,colframe=nared,adjusted title={\bfseries\sffamily Alternate Name(s): \meta{Alternate}}]
+% \centering In the body text, not the index, \meta{Alternate} swaps with \meta{FNN}\\
+% for Western names and \meta{Affix} for all other name categories.
+% \end{tcolorbox}
% \end{tcolorbox}
-% \else
-% \begin{enumerate}[noitemsep]
-% \item Western Name:\medskip\\
-% \begin{tabular}{p{0.28\textwidth}p{0.28\textwidth}p{0.28\textwidth}}
-% \strut\textbf{Forename(s)} &
-% \strut\textbf{Surname(s)} &
-% \strut\textbf{\color{nared}Descriptor}\smallskip\\
-% \strut Personal name(s): &
-% \strut Family name: &
-% \strut Sobriquet\,/\,title:\smallskip\\
-% \textit{baptismal name}\newline
-% \textit{Christian name}\newline
-% \textit{multiple names}\newline
-% \textit{praenomen}\footnotemark &
-% \textit{of father, mother}\newline
-% \textit{ancestor, vocation}\newline
-% \textit{origin, region}\newline
-% \textit{nomen, cognomen}\newline
-% \textit{patronym} &
-% \textit{Sr., Jr., III\dots}\newline
-% \textit{notable attribute}\newline
-% \textit{origin, region}\medskip\\
-% \end{tabular}\\
-%
-% \noindent \textbf{Alternate Name(s):} In the body text, not the index, \meta{Alternate} swaps with \meta{FNN} for Western names and \meta{Affix} for all other name categories.\medskip\\
-% \item Eastern Name:\medskip\\
-% \begin{tabular}{p{0.28\textwidth}p{0.28\textwidth}p{0.28\textwidth}}
-% \textbf{Family name} &
-% \textbf{Given name} &
-% \textbf{\color{nared}Descriptor}\smallskip\\
-% Family\,/\,clan name &
-% \textit{Seldom multiple}\newline
-% \textit{names; multi-}\newline
-% \textit{character okay.} &
-% Title, etc.\newline
-% \textit{(old syntax for}\newline
-% \textit{personal names)}\medskip\\
-% \end{tabular}
-%
-% \item Ancient name:\medskip\\
-% \begin{tabular}{p{0.28\textwidth}p{0.28\textwidth}p{0.28\textwidth}}
-% \textbf{Personal name} &
-% \textbf{\color{nared}Descriptor} &
-% \textbf{\color{nared}Alt. Desc.}\smallskip\\
-% Given name(s): &
-% Sobriquet\,/\,title: &
-% Alternate name:\smallskip\\
-% &
-% \textit{Sr., Jr., III\dots}\newline
-% \textit{notable attribute}\newline
-% \textit{origin, region}\newline
-% \textit{patronym} &
-% \textit{(old syntax for}\newline
-% \textit{titles, etc.)}\\
-% \end{tabular}
-% \end{enumerate}\fi
-%\begingroup
-%\newif\ifSkipGens
-%\newif\ifNoGens
-%\newif\ifSkipAgnomen
-%\newif\ifNoAgnomen
-%\newcommand*\SCIPi{\unless\ifNoGens Publius Cornelius\else Publius\fi}
-%\newcommand*\SCIPii{\unless\ifNoAgnomen Scipio Africanus\else Scipio\fi}
-%\newcommand*\ScipioOnly{\SkipAgnomentrue\Scipio}
-%\renewcommand*\NamesFormat[1]%^^A
-% {\sffamily\color{nablue}\ifSkipGens\NoGenstrue\fi\ifSkipAgnomen\NoAgnomentrue\fi#1%^^A
-% \global\SkipGensfalse\global\SkipAgnomenfalse}
-%\renewcommand*\MainNameHook[1]%^^A
-% {\sffamily\color{nabrown}\ifSkipGens\NoGenstrue\fi\ifSkipAgnomen\NoAgnomentrue\fi#1%^^A
-% \global\SkipGensfalse\global\SkipAgnomenfalse}
-% \footnotetext{How one handles Roman names depends on index entry form; some possible suggestions are given above. Explained on page~\pageref{page:Sobriquets} and following, we have a name \ScipioOnly\ that can be \SkipGenstrue\Scipio\ or just \SkipGenstrue\ScipioOnly, using macro expansion.}
-% \endgroup
+%
+% \begin{tcolorbox}[colframe=naslate,adjusted title={``Native'' Eastern Name}]\centering
+% \tcbox[equal height group=B,on line,tikznode,colback=white,adjusted title={\bfseries\sffamily Family name:\\ \meta{SNN}}]{Family/clan name}\hfill
+% \tcbox[equal height group=B,on line,tikznode,colback=white,adjusted title={\bfseries\sffamily Personal name:\\ \meta{Affix}}]{Few multiple\\
+% names; multi-\\
+% character okay.\\
+% \vspace{-2ex}\hphantom{\textit{ancestor, vocation}}}\hfill
+% \tcbox[equal height group=B,on line,tikznode,colback=white,colframe=nared,adjusted title={\bfseries\sffamily Descriptor:\\ \meta{Alternate}}]{%
+% Replaces \meta{Affix}\\
+% (new); personal\\
+% name (obsolete)\\
+% \vspace{-2ex}\hphantom{Sobriquet/title:}}
+% \end{tcolorbox}
+%
+% \begin{tcolorbox}[colframe=naslate,adjusted title={Royal/Medieval/Ancient Name}]\centering
+% \tcbox[equal height group=C,on line,tikznode,colback=white,adjusted title={\bfseries\sffamily Personal name:\\ \meta{SNN}}]{Given name(s)\\
+% \hphantom{Family/clan name}}\hfill
+% \tcbox[equal height group=C,on line,tikznode,colback=white,colframe=nared,adjusted title={\bfseries\sffamily Descriptor:\\ \meta{Affix}}]{%
+% Sobriquet/title:\\
+% \textit{Sr., Jr., III\dots}\\
+% \textit{notable attribute}\\
+% \textit{origin, region}\\
+% \textit{patronym}\\
+% \vspace{-2ex}\hphantom{\textit{ancestor, vocation}}}\hfill
+% \tcbox[equal height group=C,on line,tikznode,colback=white,colframe=nared,adjusted title={\bfseries\sffamily Descriptor:\\ \meta{Alternate}}]{%
+% Alternate name\\
+% Replaces \meta{Affix}\\
+% (new); titles,\\
+% etc. (obsolete)\\
+% \hphantom{Sobriquet/title:}}
+% \end{tcolorbox}
+%
+% \footnotetext{How one handles Roman names depends on index entry form; some possible suggestions are given above. See more on page~\pageref{page:Romani} and following.}
% \newpage
%
-% \subsubsection{Traditional Interface}
+% \subsection{Basic Interface}
% \label{sec:TradStart}
%
-% Mandatory arguments are shown in \emph{black}, with optional elements in \emph{\color{nared}red}. If the required argument \meta{SNN} expands to the empty string, \textsf{nameauth} will generate a package error. Extra spaces around each argument are stripped (Section~\ref{sec:ErrorProt}). The argument patterns shown here are used in many \textsf{nameauth} macros.
-%
-% \bgroup\ifDoTikZ
-% \begin{tcolorbox}[colframe=naslate,adjusted title={Western Names}]\centering
+% Using \textsf{nameauth}\Illus{} allows one to use names according to one's culture of origin. The name arguments in this section are used in many \textsf{nameauth} macros.
+% \begin{itemize}
+% \item The name form's required arguments are shown below in \emph{black}, with optional elements shown in \emph{\color{nared}red}.
+% \item If the required argument \meta{SNN} expands to the empty string, \textsf{nameauth} will generate a package error.
+% \item Extra spaces around each argument are stripped.
+% \item Always include all name arguments to have consistent index entries.
+% \item \cmd{\Name} prints first uses of names long, then short thereafter. \cmd{\Name*} always creates a long form. \cmd{\FName} prints a short form in later uses.
+% \end{itemize}\leavevmode
+%
+% \begin{tcolorbox}[colframe=naslate,adjusted title={\large\hfil Western Name}]\centering
% \begin{tabular}{l@{ }c@{ }c@{ }c}
% & \small Required & \small Required & \small Optional,\\
% & \small forename(s) & \small surname(s), & \small in text only \\
% & & \small optional \meta{Affix}\smallskip\\
-% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\strut \hbox{\cmd{\Name}\texttt{\space}}\\ \strut \cmd{\Name*}\\ \strut \cmd{\FName}} &
+% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\strut \hbox{\cmd{\Name}\texttt{ }}\\ \strut \cmd{\Name*}\\ \strut \cmd{\FName}} &
% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\oarg{FNN}} &
% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\marg{SNN\color{nared}, Affix}} &
% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\oarg{\color{nared}Alternate}}
% \end{tabular}
%
% Add braces \texttt{\bfseries\{\,\}} after {\bfseries\marg{SNN\color{nared}, Affix}} if other text in brackets \texttt{\bfseries[\,]} follows.
-% \end{tcolorbox}
-% \else
-% \bigskip\noindent{\bfseries Western Names}
-%
-% \bigskip\begin{tabular}{lccc}
-% & \small Required & \small Required surname(s), & \small Optional,\\
-% & \small forename(s) & \small optional \meta{Affix} & \small in text only\smallskip\\
-% \cmd{\Name}\\
-% \cmd{\Name*} & \bfseries\oarg{FNN} & \bfseries\marg{SNN\color{nared}, Affix} & \bfseries\oarg{\color{nared}Alternate}\\
-% \cmd{\FName}
-% \end{tabular}\\
+% \end{tcolorbox}\medskip
%
-% Add braces \texttt{\bfseries\{\,\}} after {\bfseries\marg{SNN\color{nared}, Affix}} if other text in brackets \texttt{\bfseries[\,]} follows.
-% \fi\egroup
-%
-% \begin{center}\bfseries Examples\end{center}
-%
-% \noindent Western names require the \meta{FNN} argument to be present. One always includes all arguments for consistent index entries. The simplified interface (Section~\ref{sec:SimpleStart}) cuts down the amount of typing in many cases.\medskip
-%
-% \bgroup\MyStretch\noindent%
-% |\Name [George]{Washington}|\dotfill\Name[George]{Washington}\\
-% |\Name*[George]{Washington}|\dotfill\Name*[George]{Washington}\\
-% |\Name [George]{Washington}|\dotfill\Name[George]{Washington}\\
-% |\FName[George]{Washington}|\dotfill\FName[George]{Washington}\smallskip\\
-% |\Name [George S.]{Patton, Jr.}|\dotfill\Name[George S.]{Patton, Jr.}\\
-% |\Name*[George S.]{Patton, Jr.}|\dotfill\Name*[George S.]{Patton, Jr.}\\
-% |\Name [George S.]{Patton, Jr.}|\dotfill\Name[George S.]{Patton, Jr.}\\
-% |\FName[George S.]{Patton, Jr.}|\dotfill\FName[George S.]{Patton, Jr.}\egroup\medskip
-%
-% The \meta{Alternate} argument will swap with \meta{FNN} in the text, not in the index or the name pattern (Section~\ref{sec:NamePatterns}). To see alternate names, one must use a macro that shows forenames (first use, \cmd{\Name*}, and \cmd{\FName}). Western names require a comma to delimit affixes (Section~\ref{sec:Affix}). Below we see alternate names:\medskip
-%
-% \bgroup\MyStretch\noindent%
-% |\DropAffix\Name*[George S.]{Patton, Jr.}[George]|\dotfill\DropAffix\Name*[George S.]{Patton, Jr.}[George]\smallskip\\
-% |\Name [John David]{Rockefeller, IV}|\dotfill\Name[John David]{Rockefeller, IV}\\
-% |\Name*[John David]{Rockefeller, IV}[Jay]|\dotfill\Name*[John David]{Rockefeller, IV}[Jay]\\
-% |\DropAffix\Name*[John David]{Rockefeller, IV}[Jay]|\dotfill\DropAffix\Name*[John David]{Rockefeller, IV}[Jay]\\
-% |\Name [John David]{Rockefeller, IV}[Jay]|\dotfill\Name[John David]{Rockefeller, IV}[Jay]\smallskip\\
-% |\Name [Clive Staples]{Lewis}|\dotfill\Name[Clive Staples]{Lewis}\\
-% |\Name*[Clive Staples]{Lewis}[C.S.]|\dotfill\Name*[Clive Staples]{Lewis}[C.S.]\\
-% |\FName[Clive Staples]{Lewis}[Jack]|\dotfill\FName[Clive Staples]{Lewis}[Jack]\egroup\medskip
-%
-% In addition to alternate forenames, one also can display alternate surnames, but that uses several different approaches (Sections~\ref{sec:VarNames}, \ref{sec:NameParticles}, \ref{sec:AltAdvanced}, \ref{sec:Hooksiii}).
+% \noindent
+% Within \textsf{nameauth}, Western names have distinct features:
+% \begin{itemize}
+% \item Western names must use the first optional \meta{FNN} argument.
+% \item They require a comma to delimit any affixes (Section~\ref{sec:Affix}).
+% \item Western index entries have two general forms: \meta{SNN}, \meta{FNN} and \meta{SNN}, \meta{FNN}, \meta{Affix}.
+% \item They do not share control patterns (Section~\ref{sec:NamePatterns}) and index entry forms with non-Western names.
+% \end{itemize}\smallskip
+%
+% \bgroup\MyStretch\noindent
+% |\Name [George]{Washington}|\SPatInfo{\ShowPattern[George]{Washington}\break\ShowPattern[George S.]{Patton, Jr.}}\dotfill \Name [George]{Washington}\\
+% |\Name*[George]{Washington}|\dotfill \Name*[George]{Washington}\\
+% |\Name [George]{Washington}|\dotfill \Name [George]{Washington}\\
+% |\FName[George]{Washington}|\IdxInfo{\ShowIdxPageref*[George]{Washington}\break\ShowIdxPageref*[George S.]{Patton, Jr.}}\dotfill \FName[George]{Washington}\medskip\\
+% |\Name [George S.]{Patton, Jr.}|\dotfill \Name [George S.]{Patton, Jr.}\\
+% |\Name*[George S.]{Patton, Jr.}|\dotfill \Name*[George S.]{Patton, Jr.}\\
+% |\Name [George S.]{Patton, Jr.}|\dotfill \Name [George S.]{Patton, Jr.}\\
+% |\FName[George S.]{Patton, Jr.}|\dotfill \FName[George S.]{Patton, Jr.}^^A
+% \egroup\medskip
+%
+% Below, \meta{Alternate} swaps with \meta{FNN} only in the text. Alternate forenames print in the text with a first use, \cmd{\Name*}, or \cmd{\FName}. Use \cmd{\DropAffix}, a prefix macro (Section~\ref{sec:SelectOver}), to drop affixes in long name forms, but only in the text.\medskip
% \newpage
%
-% \bgroup\ifDoTikZ
-% \begin{tcolorbox}[colframe=naslate,adjusted title={``Non-native'' Eastern Names, Western Index Entry}]\centering
+% \bgroup\MyStretch\noindent
+% |\Name*[George S.]{Patton, Jr.}|\SPatInfo{\ShowPattern[George S.]{Patton, Jr.}\break \ShowPattern[J.D.]{Rockefeller, IV}\break \ShowPattern[Clive Staples]{Lewis}}\dotfill \Name*[George S.]{Patton, Jr.}\\
+% |\DropAffix\Name*[George S.]{Patton, Jr.}[George]|\dotfill \DropAffix\Name*[George S.]{Patton, Jr.}[George]\medskip\\
+% |\Name [J.D.]{Rockefeller, IV}|\dotfill \Name [J.D.]{Rockefeller, IV}\\
+% |\Name*[J.D.]{Rockefeller, IV}[John David]|\dotfill \Name*[J.D.]{Rockefeller, IV}[John David]\\
+% \vspace{-2ex}\IdxInfo{\ShowIdxPageref*[George S.]{Patton, Jr.}\break \ShowIdxPageref*[J.D.]{Rockefeller, IV}\break \ShowIdxPageref*[Clive Staples]{Lewis}}\vspace{2ex}|\DropAffix\Name*[J.D.]{Rockefeller, IV}[Jay]|\dotfill \DropAffix\Name*[J.D.]{Rockefeller, IV}[Jay]\\
+% |\Name [J.D.]{Rockefeller, IV}[Jay]|\dotfill \Name [J.D.]{Rockefeller, IV}[Jay]\medskip\\
+% |\Name [Clive Staples]{Lewis}|\dotfill \Name [Clive Staples]{Lewis}\\
+% |\Name*[Clive Staples]{Lewis}[C.S.]|\dotfill \Name*[Clive Staples]{Lewis}[C.S.]\\
+% |\FName[Clive Staples]{Lewis}[Jack]|\dotfill \FName[Clive Staples]{Lewis}[Jack]^^A
+% \egroup\medskip
+%
+% Use the first name for sorting names instead of the initials, as with \DropAffix\Name*[J.D.]{Rockefeller, IV}: |\PretagName[J.D.]{Rockefeller, IV}{Rockefeller, John D 4}| (Section~\ref{sec:IndexSort}).
+% For alternate surnames see Sections~\ref{sec:VarNames}, \ref{sec:NameAncient}, \ref{sec:AltAdvanced}, \ref{sec:Hooksiii}.
+% \medskip
+%
+% \begin{tcolorbox}[colframe=naslate,adjusted title={\large\hfil ``Non-native'' Eastern Name}]\centering
% \begin{tabular}{l@{ }c@{ }c@{ }c}
% & \small Required & \small Required & \small Optional,\\
% & \small forename(s) & \small surname(s), & \small in text only \\
% & & \small no \meta{Affix}\smallskip\\
-% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\strut \hbox{\cmd{\Name}\texttt{\space}}\\ \strut \cmd{\Name*}\\ \strut \cmd{\FName}} &
+% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\strut \hbox{\cmd{\Name}\texttt{ }}\\ \strut \cmd{\Name*}\\ \strut \cmd{\FName}} &
% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\oarg{FNN}} &
% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\marg{SNN}} &
% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\oarg{\color{nared}Alternate}}
% \end{tabular}
%
% Add braces \texttt{\bfseries\{\,\}} after {\bfseries\marg{SNN}} if other text in brackets \texttt{\bfseries[\,]} follows.
-% \end{tcolorbox}
-% \else
-% \bigskip\noindent{\bfseries ``Non-native'' Eastern Names, Western Index Entry}
-%
-% \bigskip\begin{tabular}{lccc}
-% & \small Required & \small Required surname(s), & \small Optional,\\
-% & \small forename(s) & \small no \meta{Affix} & \small in text only\smallskip\\
-% \cmd{\Name}\\
-% \cmd{\Name*} & \bfseries\oarg{FNN} & \bfseries\marg{SNN} & \bfseries\oarg{\color{nared}Alternate}\\
-% \cmd{\FName}
-% \end{tabular}\\
-%
-% Add braces \texttt{\bfseries\{\,\}} after {\bfseries\marg{SNN}} if other text in brackets \texttt{\bfseries[\,]} follows.
-% \fi\egroup
-%
-%
-% \begin{center}\bfseries Examples\end{center}
-%
-% \noindent Below we start with ``regular'' Western name forms:\medskip
-%
-% \bgroup\noindent\MyStretch|\Name[Hideyo]{Noguchi}|\dotfill\Name[Hideyo]{Noguchi}\\
-% |\Name*[Hideyo]{Noguchi}[Doctor]|\dotfill\Name*[Hideyo]{Noguchi}[Doctor]\\
-% |\Name[Frenec]{Molnár}|\dotfill\Name[Frenec]{Molnár}\egroup\medskip
-%
-% To turn them into ``non-native'' Eastern names or proper Hungarian names [\hyperlink{Mulvany}{Mulvany}, 166] we use the reversing macros and leave the \meta{Alternate} argument empty (Section~\ref{sec:Eastern}). Index entries are in Western style: \meta{SNN}, \meta{FNN}:\medskip
+% \end{tcolorbox}\medskip
%
-% \bgroup\MyStretch\noindent|\CapName\RevName\Name*[Hideyo]{Noguchi}|\dotfill\CapName\RevName\Name*[Hideyo]{Noguchi}\dag\\
-% |\CapName\RevName\Name*[Hideyo]{Noguchi}[Sensei]|\dotfill\CapName\RevName\Name*[Hideyo]{Noguchi}[Sensei]\dag\\
-% |\RevName\Name*[Frenec]{Molnár}|\dotfill\RevName\Name*[Frenec]{Molnár}\dag\egroup\medskip
-%
-% Reversed Western forms do not work with the older syntax (Section~\ref{sec:Obsolete}) and \emph{they do not share name control sequences and index entries} with ``native'' Eastern names and ancient name forms (Section~\ref{sec:NamePatterns}).
+% \noindent
+% ``Non-native'' Eastern names (Section~\ref{sec:Eastern}) have these features:
+% \begin{itemize}
+% \item They must use the first optional \meta{FNN} argument.
+% \item They cannot use affixes; one would get \meta{FNN} \meta{Affix} \meta{SNN}.
+% \item Index entries have the Western form with no affix: \meta{SNN}, \meta{FNN}.
+% \item They do not share control patterns and index entry forms with non-Western names.
+% \item They do not work with the obsolete syntax (Section~\ref{sec:Obsolete}).
+% \end{itemize}
+% % Below we start with Western name forms:\medskip
+%
+% \bgroup\noindent\MyStretch
+% |\Name [Hideyo]{Noguchi}|\SPatInfo{\ShowPattern[Hideyo]{Noguchi}\break\ShowPattern[Frenec]{Molnár}}\dotfill \Name [Hideyo]{Noguchi}\hbox to 0.45em{\hfill}\\
+% |\Name*[Hideyo]{Noguchi}[Doctor]|\dotfill \Name*[Hideyo]{Noguchi}[Doctor]\hbox to 0.45em{\hfill}\\
+% |\Name [Frenec]{Molnár}|\dotfill \Name [Frenec]{Molnár}\footnote{With \texttt{pdflatex} and \texttt{latex}, in \texttt{\ShowPattern[Frenec]{Molnár}} the glyphs \texttt{Ãą} correspond to \cmd{\IeC\{\textbackslash\textquotesingle a\}}.}^^A
+% \egroup\medskip
+%
+% \vspace{1.5ex}\IdxInfo{\ShowIdxPageref*[Hideyo]{Noguchi}\break\ShowIdxPageref*[Frenec]{Molnár}}\vspace{-1.5ex}\noindent We use the prefix macros \cmd{\RevName} and optionally \cmd{\CapName} (Section~\ref{sec:SelectOver}) to print an Eastern or Hungarian name order in the text [\hyperlink{Mulvany}{Mulvany}, 166]. We see above that these macros work in context, not arbitrarily:\medskip
+%
+% \bgroup\vspace{2.4ex}\Info{Same name patterns and\break index entries as above.}\vspace{-2.4ex}\MyStretch\noindent
+% |\CapName\RevName\Name*[Hideyo]{Noguchi}[Sensei]|\dotfill \CapName\RevName\Name*[Hideyo]{Noguchi}[Sensei]\dag\\
+% |\CapName\RevName\Name [Hideyo]{Noguchi}[Sensei]|\dotfill \CapName\RevName\Name [Hideyo]{Noguchi}[Sensei]\dag\\
+% |\RevName\Name*[Frenec]{Molnár}|\dotfill \RevName\Name*[Frenec]{Molnár}\dag\\
+% |\RevName\Name [Frenec]{Molnár}|\dotfill \RevName\Name [Frenec]{Molnár}\dag^^A
+% \egroup
+% \newpage
%
-% \bgroup\ifDoTikZ
-% \begin{tcolorbox}[colframe=naslate,adjusted title={\bfseries ``Native'' Eastern Names in the Text, Eastern Index Entry}]\centering
+% \begin{tcolorbox}[colframe=naslate,adjusted title={\large\hfil ``Native'' Eastern Name}]\centering
% \begin{tabular}{l@{ }c@{ }c}
% & \small Required surname & \small Optional,\\
% & \small and forename & \small in text only\smallskip\\
-% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\strut \hbox{\cmd{\Name}\texttt{\space}}\\ \strut \cmd{\Name*}\\ \strut \cmd{\FName}} &
+% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\strut \hbox{\cmd{\Name}\texttt{ }}\\ \strut \cmd{\Name*}\\ \strut \cmd{\FName}} &
% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\marg{SNN, Affix}} &
% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\oarg{\color{nared}Alternate}}
% \end{tabular}
%
% Add braces \texttt{\bfseries\{\,\}} after {\bfseries\marg{SNN, Affix}} if other text in brackets \texttt{\bfseries[\,]} follows.
-% \end{tcolorbox}
-% \else
-% \bigskip\noindent{\bfseries ``Native'' Eastern Names in the Text, Eastern Index Entry}
+% \end{tcolorbox}\medskip
%
-% \bigskip\begin{tabular}{lcc}
-% & \small Required Surname & \small Optional,\\
-% & \small and forename & \small in text only\smallskip\\
-% \cmd{\Name}\\
-% \cmd{\Name*} & \bfseries\marg{SNN, Affix} & \bfseries\oarg{\color{nared}Alternate}\\
-% \cmd{\FName}
-% \end{tabular}\\
+% \noindent
+% These features denote ``native'' Eastern names in \textsf{nameauth}:
+% \begin{itemize}
+% \item They must \emph{leave empty} the \meta{FNN} argument.
+% \item They use instead the \meta{SNN, Affix} arguments.
+% \item Their index entries take the non-Western form: \meta{SNN Affix}.
+% \item They do not share control patterns and index entry forms with both Western names and ``non-native'' Eastern names.
+% \end{itemize}
%
-% Add braces \texttt{\bfseries\{\,\}} after {\bfseries\marg{SNN, Affix}} if text in brackets \texttt{\bfseries[\,]} follows.
-% \fi\egroup
+% The basic forms of ``native'' Eastern names are shown below. Notice that the macro \cmd{\FName} does not show the personal name by default. This design choice helps to prevent one from naively causing offense:\medskip
%
-% \begin{center}\bfseries Examples\end{center}
+% \bgroup\MyStretch\noindent
+% \SPatInfo{\ShowPattern{Miyazaki, Hayao}}|\Name {Miyazaki, Hayao}|\dotfill \Name {Miyazaki, Hayao}\\
+% |\Name {Miyazaki, Hayao}|\dotfill \Name {Miyazaki, Hayao}\\
+% \IdxInfo{\ShowIdxPageref*{Miyazaki, Hayao}}|\FName{Miyazaki, Hayao}|\dotfill \FName{Miyazaki, Hayao}^^A
+% \egroup\medskip
%
-% \noindent The comma-delimited required argument, \meta{SNN, Affix}, is the key to non-Western names, which always take the form \meta{SNN Affix} in the index. See Section~\ref{sec:Eastern}. ``Native'' Eastern names have Eastern name order from the start and \emph{they do not share name control sequences and index entries} with Western names (Section~\ref{sec:NamePatterns}). They can be reversed to have Western name order in the body text.
-% \newpage
+% If ``Native'' Eastern names are reversed, they will have Western name order in the text, but \emph{they will retain Eastern-form index entries.}
%
-% Except\Version{3.0} for mononyms, non-Western forms also can have alternate names. This is incompatible with the older syntax (see Section~\ref{sec:Obsolete}). Unless the index must have Western-style entries, ``native'' forms are best for Eastern names:\medskip
+% One must use the prefix macro \cmd{\ForceFN} (Section~\ref{sec:SelectOver}) with \cmd{\FName} to get a personal name. \meta{Alternate} swaps with \meta{FNN} (in long forms and in short forms using \cmd{\ForceFN}) in the text only. \meta{Alternate} does not work with the obsolete syntax (Section~\ref{sec:Obsolete}):\medskip
%
-% \bgroup\MyStretch\noindent|\Name{Yamamoto, Isoroku}|\dotfill\Name{Yamamoto, Isoroku}\\
-% |\Name{Yamamoto, Isoroku}|\dotfill\Name{Yamamoto, Isoroku}\\
-% |\RevName\Name*{Yamamoto, Isoroku}[Admiral]|\dotfill\RevName\Name*{Yamamoto, Isoroku}[Admiral]\smallskip\\
-% |\Name{Miyazaki, Hayao}|\dotfill\Name{Miyazaki, Hayao}\\
-% |\Name*{Miyazaki, Hayao}[Sensei]|\dotfill\Name*{Miyazaki, Hayao}[Sensei]\\
-% |\RevName\Name*{Miyazaki, Hayao}[Mr.]|\dotfill\RevName\Name*{Miyazaki, Hayao}[Mr.]\egroup\medskip
+% \bgroup\vspace{2.4ex}\Info{Same name patterns and\break index entries as above.}\vspace{-2.4ex}\MyStretch\noindent
+% |\ForceFN\FName{Miyazaki, Hayao}|\dotfill \ForceFN\FName{Miyazaki, Hayao}\\
+% |\CapName\Name*{Miyazaki, Hayao}[Sensei]|\dotfill \CapName\Name*{Miyazaki, Hayao}[Sensei]\\
+% |\ForceFN\FName{Miyazaki, Hayao}[Sensei]|\dotfill \ForceFN\FName{Miyazaki, Hayao}[Sensei]\\
+% |\RevName\Name*{Miyazaki, Hayao}[Mr.]|\dotfill \RevName\Name*{Miyazaki, Hayao}[Mr.]^^A
+% \egroup\medskip
+%
+% ``Native'' Eastern names have the same kind of macro parameters as do royal, medieval, and ancient names from Europe and the Near East (below). From the standpoint of how the macros work, one can identify ``non-western'' names with the form \meta{SNN, Affix}.
+%
+% Yet one should not confuse similarity in form with similarity in what the names themselves mean. Even though the syntactic form of non-Western names works the same, that form has different meanings in different contexts. For one context, \meta{SNN, Affix} refers to a family name and a personal name. For another context, \meta{SNN, Affix} refers to a person's name and any affixes thereto.
+% \newpage
%
-% \bgroup\ifDoTikZ
-% \begin{tcolorbox}[colframe=naslate,adjusted title={\bfseries Ancient and Medieval Names}]\centering
+% \begin{tcolorbox}[colframe=naslate,adjusted title={\large\hfil Royal/Medieval/Ancient Name}]\centering
% \begin{tabular}{l@{ }c@{ }c}
% & \small Required name & \small Optional,\\
% & \small optional \meta{Affix} & \small in text only\smallskip\\
-% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\strut \hbox{\cmd{\Name}\texttt{\space}}\\ \strut \cmd{\Name*}\\ \strut \cmd{\FName}} &
+% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\strut \hbox{\cmd{\Name}\texttt{ }}\\ \strut \cmd{\Name*}\\ \strut \cmd{\FName}} &
% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\marg{SNN\color{nared}, Affix}} &
% \tcbox[equal height group=D,colback=white,tikznode,left=1mm,right=1mm,valign=center]{\bfseries\oarg{\color{nared}Alternate}}
% \end{tabular}
%
% Add braces \texttt{\bfseries\{\,\}} after {\bfseries\marg{SNN\color{nared}, Affix}} if other text in brackets \texttt{\bfseries[\,]} follows.
-% \end{tcolorbox}
-% \else
-% \bigskip\noindent{\bfseries Ancient and Medieval Names}
-%
-% \bigskip\begin{tabular}{lcc}
-% & \small Required name & \small Optional,\\
-% & \small optional \meta{Affix} & \small in text only\smallskip\\
-% \cmd{\Name}\\
-% \cmd{\Name*} & \bfseries\marg{SNN\color{nared}, Affix} & \bfseries\oarg{\color{nared}Alternate}\\
-% \cmd{\FName}
-% \end{tabular}\\
-%
-% Add braces \texttt{\bfseries\{\,\}} after {\bfseries\marg{SNN\color{nared}, Affix}} if other text in brackets \texttt{\bfseries[\,]} follows.
-% \fi\egroup
+% \end{tcolorbox}\medskip
%
-% \begin{center}\bfseries Examples\end{center}
-%
-% \noindent These forms are meant for royalty and ancient figures. They can be mononyms or have multiple names, and may have an affix. Note the teaser for Section~\ref{sec:FName}:\medskip
-%
-% \bgroup\MyStretch\noindent|\Name{Aristotle}|\dotfill\Name{Aristotle}\\
-% |\Name{Aristotle}|\dotfill\Name{Aristotle}\smallskip\\
-% |\Name{Elizabeth, I}|\dotfill\Name{Elizabeth, I}\\
-% |\Name{Elizabeth, I}|\dotfill\Name{Elizabeth, I}\\
-% |\ForceFN\FName{Elizabeth, I}[Good Queen Bess]|\dotfill\ForceFN\FName{Elizabeth, I}[Good Queen Bess]\egroup
+% \noindent
+% These features denote royal, medieval, and ancient names in \textsf{nameauth}, grouped under the general rubric of ``non-Western'' name forms:
+% \begin{itemize}
+% \item They must \emph{leave empty} the \meta{FNN} argument.
+% \item They use instead the \meta{SNN, Affix} arguments or just \meta{SNN}.
+% \item Their index entries take the non-Western forms: \meta{SNN Affix} or \meta{SNN}.
+% \item Names\Version{3.0} with the form \meta{SNN, Affix} can use the \meta{Alternate} argument.
+% \item Names with the form \meta{SNN} cannot use \meta{Alternate}.
+% \item They do not share control patterns and index entry forms with both Western names and ``non-native'' Eastern names.
+% \end{itemize}
%
-% \subsubsection{Simplified Interface}
+% As with ``native'' Eastern names, \cmd{\FName} prints \meta{SNN} unless forced otherwise by \cmd{\ForceFN}. This guards against nonsense names in the text:\medskip
+%
+% \bgroup\MyStretch\noindent
+% |\Name {Elizabeth, I}|\SPatInfo{\ShowPattern{Elizabeth, I}\break \ShowPattern{John, Eriugena}\break \ShowPattern{Aristotle}}\dotfill \Name {Elizabeth, I}\\
+% |\Name {Elizabeth, I}|\dotfill \Name {Elizabeth, I}\\
+% |\FName{Elizabeth, I}|\dotfill \FName{Elizabeth, I}\\
+% |\ForceFN\FName{Elizabeth, I}|\dotfill \ForceFN\FName{Elizabeth, I}\\
+% |\ForceFN\FName{Elizabeth, I}[Good Queen Bess]|\IdxInfo{\ShowIdxPageref*{Elizabeth, I}\break \ShowIdxPageref*{John, Eriugena}\break \ShowIdxPageref*{Aristotle}}\dotfill \ForceFN\FName{Elizabeth, I}[Good Queen Bess]\medskip\\% |\Name{John, Eriugena}|\dotfill \Name{John, Eriugena}\\
+% |\Name{John, Eriugena}|\dotfill \Name{John, Eriugena}\\
+% |\ForceFN\FName{John, Eriugena}|\dotfill \ForceFN\FName{John, Eriugena}\medskip\\
+% |\Name{Aristotle}|\dotfill \Name{Aristotle}\\
+% |\Name{Aristotle}|\dotfill \Name{Aristotle}^^A
+% \egroup
+%
+% \subsection{Quick Interface}
% \label{sec:SimpleStart}
-%
% \DescribeEnv{nameauth}
-% Although not required, using the \texttt{nameauth} environment in the preamble guards against undefined macros. This environment defines a tabular-like macro:
+% To reduce typing, we replace frequently-used macros with the shorthand forms of the quick interface. Using the \texttt{nameauth} environment in the preamble guards against undefined macros. It defines a delimited macro \cmd{\<}, recalling a \texttt{tabular}:
% \begin{quote}
-% \fbox{\vbox{
-% \hbox{\mystrut\ \cmd{\begin\{nameauth\}}}\par
-% \hbox{\hspace{2em}\cmd{\<} \meta{arg1} \texttt{\&} \meta{arg2} \texttt{\&} \meta{arg3} \texttt{\&} \meta{arg4} \texttt{>} }\par
-% \hbox{\mystrut\ \cmd{\end\{nameauth\}}}}}
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\begin\{nameauth\}}\\
+% \hspace{2em}\cmd{\<} \meta{arg1} \texttt{\&} \meta{arg2}
+% \texttt{\&} \meta{arg3} \texttt{\&} \meta{arg4} \texttt{>}\vspace{-1pt}\\
+% {\Large\strut}\cmd{\end\{nameauth\}}\\
+% \end{tabular}
+% }
% \end{quote}
-% It uses \meta{arg1} as a basis to create three macros that are equivalent to:\medskip
+% \newpage
+%
+% \noindent
+% The macro \cmd{\<} uses \meta{arg1} as a basis to create three new macros per name:\medskip
%
-% \begin{tabular}{@{\quad}l@{\ \(\rightarrow\)\ }ll}
-% \texttt{\textbackslash}\meta{arg1} & \cmd{\Name}\oarg{arg2}\marg{arg3}\oarg{arg4} \\
+% \begin{tabular}{@{\quad}l@{\ same as: }ll}
+% \texttt{\textbackslash}\meta{arg1} & \cmd{\Name\ }\oarg{arg2}\marg{arg3}\oarg{arg4} \\
% \texttt{\textbackslash L}\meta{arg1} & \cmd{\Name*}\oarg{arg2}\marg{arg3}\oarg{arg4} & {\color{nared} |%| L for \textit{long}} \\
% \texttt{\textbackslash S}\meta{arg1} & \cmd{\FName}\oarg{arg2}\marg{arg3}\oarg{arg4} & {\color{nared} |%| S for \textit{short}} \\
% \end{tabular}\medskip\\
-% If either \meta{arg1} or \meta{arg3} are empty, or \meta{SNN} is empty, \textsf{nameauth} will generate a package error. Forgetting the backslash, ampersands, or angle brackets will cause errors. For more on \meta{arg4} see page~\pageref{page:ArgIV}.
-% \newpage
-%
-% Comments below are not part of the environment. Extra spaces in each argument are stripped (Section~\ref{sec:ErrorProt}). Put trailing braces \texttt{\{\,\}} or something else after the shorthand macros if text in brackets \texttt{[\,]} follows, so it does not become an optional argument. Below we introduce name forms with particles.
-%
-% \begin{center}\bfseries Examples\end{center}
-% \def\startrowa{\ \ \cmd{\< }}
-% \def\startrowb{\color{nared}\% }
-% \def\midrowa{\texttt{ \& }}
-% \def\midrowb{\texttt{\ \ \ }}
-% \def\endrowa{\texttt{ >}}
-% \def\endrowb{}
-% \def\startrow{\startrowb}
-% \def\midrow{\midrowb}
-% \def\endrow{\endrowb}
+% If either \meta{arg1} or \meta{arg3} are empty, or \meta{SNN} is empty, \textsf{nameauth} will generate a package error. Forgetting the backslash, any ampersand, argument, or angle bracket will cause errors. The \meta{Alternate} field is \meta{arg4} (see below).
+%
+% Here we do not show the obsolete syntax (Section~\ref{sec:Obsolete}). Comments are not part of the \texttt{nameauth} environment. Extra spaces around each argument are stripped. Put trailing braces \texttt{\{\,\}} after the shorthand macros if text in brackets \texttt{[\,]} follows. We introduce Western name forms with particles (followed by {\color{nared}\textit{W. part.}}).\medskip
+%
+% \def\startrowa{\ \ \cmd{\< }}^^A
+% \def\startrowb{\color{nared}\% }^^A
+% \def\midrowa{\texttt{ \& }}^^A
+% \def\midrowb{\texttt{\ \ \ }}^^A
+% \def\endrowa{\texttt{ >}}^^A
+% \def\endrowb{}^^A
+% \def\startrow{\startrowb}^^A
+% \def\midrow{\midrowb}^^A
+% \def\endrow{\endrowb}^^A
% \bgroup\noindent\ttfamily\small| \begin{nameauth}|\\
% \begin{tabular}{>{\startrow}l@{\midrow}l@{\midrow}l@{\midrow}l@{\endrow}l}
-% {\normalfont\color{nared}\quad\ \ \,\meta{arg1}}\gdef\startrow{\startrowa} & {\normalfont\color{nared}\meta{arg2}} & {\normalfont\color{nared}\meta{arg3}} & {\normalfont\color{nared}\meta{arg4}}\\\gdef\midrow{\midrowa}\gdef\endrow{\endrowa}%^^A
-% Wash & George & Washington & &{\color{nared} \% \normalfont\textit{Western}}\\
-% Harnack & Adolf & Harnack & &{\color{nared} \% \normalfont\textit{Western}}\\
-% Lewis & Clive Staples & Lewis & &{\color{nared} \% \normalfont\textit{Western}}\\
-% Pat & George S. & Patton, Jr. & &{\color{nared} \% \normalfont\textit{W. affix}}\\
-% JRIV & John David & Rockefeller, IV & &{\color{nared} \% \normalfont\textit{W. affix}}\\
-% Ches & Chesley B. & Sullenberger, III & &{\color{nared} \% \normalfont\textit{W. affix}}\\
-% Soto & Hernando & de Soto & &{\color{nared} \% \normalfont\textit{W. part.}}\\
-% JWG & J.W. von & Goethe & &{\color{nared} \% \normalfont\textit{W. part.}}\\
-% VBuren & Martin & Van Buren & &{\color{nared} \% \normalfont\textit{W. part.}}\\
-% Noguchi & Hideyo & Noguchi & &{\color{nared} \% \normalfont\textit{W. as E.}}\\
-% Miyaz & & Miyazaki, Hayao & &{\color{nared} \% \normalfont\textit{Eastern}}\\
-% Yamt & & Yamamoto, Isoroku & &{\color{nared} \% \normalfont\textit{Eastern}}\\
-% Aeth & & Æthelred, II & &{\color{nared} \% \normalfont\textit{Ancient}}\\
-% Attil & & Attila, the Hun & &{\color{nared} \% \normalfont\textit{Ancient}}\\
-% Dem & & Demetrius, I & &{\color{nared} \% \normalfont\textit{Ancient}}\\
-% Eliz & & Elizabeth, I & &{\color{nared} \% \normalfont\textit{Ancient}}\\
-% Aris & & Aristotle & &{\color{nared} \% \normalfont\textit{Mono}}\\
-% CSL & Clive Staples & Lewis & C.S. &{\color{nared} \% \normalfont\textit{W. alt.}}\\
-% MSens & & Miyazaki, Hayao & Sensei &{\color{nared} \% \normalfont\textit{E. alt.}}\\
+% {\normalfont\color{nared}\quad\ \ \,\meta{arg1}}\gdef\startrow{\startrowa} & {\normalfont\color{nared}\meta{arg2}} & {\normalfont\color{nared}\meta{arg3}} & {\normalfont\color{nared}\meta{arg4}}\\\gdef\midrow{\midrowa}\gdef\endrow{\endrowa}^^A
+% Wash & George & Washington & &{\color{nared} \%
+% \normalfont\textit{Western}}\\
+% Lewis & Clive Staples & Lewis & &{\color{nared} \%
+% \normalfont\textit{Western}}\\
+% Pat & George S. & Patton, Jr. & &{\color{nared} \%
+% \normalfont\textit{W. affix}}\\
+% JRIV & J.D. & Rockefeller, IV & &{\color{nared} \%
+% \normalfont\textit{W. affix}}\\
+% Soto & Hernando & de~Soto & &{\color{nared} \%
+% \normalfont\textit{W. part.}}\\
+% JWG & J.W. von & Goethe & &{\color{nared} \%
+% \normalfont\textit{W. part.}}\\
+% VBuren & Martin & Van Buren & &{\color{nared} \%
+% \normalfont\textit{W. part.}}\\
+% Noguchi & Hideyo & Noguchi & &{\color{nared} \%
+% \normalfont\textit{W. as E.}}\\
+% Molnar & Frenec & Molnár & &{\color{nared} \%
+% \normalfont\textit{W. as E.}}\\
+% Miyaz & & Miyazaki, Hayao & &{\color{nared} \%
+% \normalfont\textit{Eastern}}\\
+% Yamt & & Yamamoto, Isoroku & &{\color{nared} \%
+% \normalfont\textit{Eastern}}\\
+% Eliz & & Elizabeth, I & &{\color{nared} \%
+% \normalfont\textit{Royal}}\\
+% Aeth & & Æthelred, II & &{\color{nared} \%
+% \normalfont\textit{Royal}}\\
+% Eriugena & & John, Eriugena & &{\color{nared} \%
+% \normalfont\textit{Medieval}}\\
+% Aris & & Aristotle & &{\color{nared} \%
+% \normalfont\textit{Mono}}\\
+% CSL & Clive Staples & Lewis & C.S. &{\color{nared} \%
+% \normalfont\textit{W. alt.}}\\
+% MSens & & Miyazaki, Hayao & Sensei &{\color{nared} \%
+% \normalfont\textit{E. alt.}}\\
% \end{tabular}\\
-% | \end{nameauth}|\egroup\medskip
+% | \end{nameauth}|\egroup
%
-% \begin{center}\small\MyStretch
-% \begin{tabular}{rlp{0.41\textwidth}}\toprule
-% Output & Short Form & Long Form\\\midrule
-% \Wash & \cmd{\Wash} & \cmd{\Name}\texttt{[George]\{Washington\}}\\
-% \rowcolor{black!7!white}\LWash & \cmd{\LWash} & \cmd{\Name*}\texttt{[George]\{Washington\}}\\
-% \SWash & \cmd{\SWash} & \cmd{\FName}\texttt{[George]\{Washington\}}\\
-% \rowcolor{black!7!white}\JustIndex\Wash & \cmd{\JustIndex}\cmd{\Wash} & \cmd{\IndexName}\texttt{[George]\{Washington\}}\\
-% \Eliz & \cmd{\SubvertThis}\cmd{\Eliz} & \cmd{\SubvertThis}\cmd{\Name}\texttt{\{Elizabeth,I\}}\\
-% \rowcolor{black!7!white}\ForgetThis\Eliz & \cmd{\ForgetThis}\cmd{\Eliz} & \cmd{\ForgetThis}\cmd{\Name}\texttt{\{Elizabeth,I\}}\\\bottomrule
+% \begin{center}\bfseries \meta{Alternate} Tips\end{center}
+% \phantomsection
+% Two shorthands above use \meta{arg4}: \cmd{\CSL} and \cmd{\MSens}. Their similar forms \cmd{\Lewis} and \cmd{\Miyaz} leave \meta{arg4} empty. Here is how they are related:\label{page:ArgIV}
+% \begin{itemize}
+% \item They\SPatInfo{\ShowPattern[Clive Staples]{Lewis}\break \ShowPattern{Miyazaki, Hayao}} share name control patterns (Section~\ref{sec:NamePatterns}). Therefore, they have the same ``first-use'' and ``later-use'' conditions.
+% \item Usually, one adds alternate names to shorthands with an empty \meta{arg4}:\\[1ex]
+% \vspace{-7ex}\IdxInfo{\ShowIdxPageref*[Clive Staples]{Lewis}\break \ShowIdxPageref*{Miyazaki, Hayao}}\vspace{7ex}\leavevmode
+% \begin{tabular}{llll}\toprule
+% \cmd{\LLewis[C.S.]} & \LLewis[C.S.] & \cmd{\LCSL} & \LCSL\\
+% \rowcolor{grey}\cmd{\LMiyaz[Sensei]} & \LMiyaz[Sensei] & \cmd{\LMSens} & \LMSens\\\bottomrule
% \end{tabular}
-% \end{center}
+% \item The field \meta{arg4} contains either \meta{Alternate} or uses the obsolete syntax. Trying to add ``alternate names'' to shorthands that use \meta{arg4} fails:\\[1ex]
+% \begin{tabular}{ll}\toprule
+% \cmd{\LCSL[Jack]} & \LCSL[Jack]\\
+% \rowcolor{grey}\cmd{\LMSens[Sensei]} & \LMSens[Sensei]\\\bottomrule
+% \end{tabular}
+% \end{itemize}
+% \newpage
%
-% English and modern Romance languages keep the particle with the surname. German and other languages do not (cf. Sections~\ref{sec:NameParticles} and~\ref{sec:AltFormat}).\footnote{See also [\hyperlink{Mulvany}{Mulvany}, 152--82], and the \textit{Chicago Manual of Style}.}
+% \begin{center}\bfseries How Quick Is Quick?\end{center}
%
+% Prefix macros (Section~\ref{sec:SelectOver}) work with both interfaces. Here we show just a few examples showing how much typing we save with common macros:
% \begin{center}\small\MyStretch
-% \begin{tabular}{rll}\toprule
-% \bfseries Macro & \bfseries Body Text & \bfseries Index \\\midrule
-% \cmd{\VBuren} & \VBuren & \ShowIdxPageref*[Martin]{Van Buren}\\
-% \rowcolor{black!7!white}\cmd{\VBuren} & \VBuren & \ShowIdxPageref*[Martin]{Van Buren}\\
-% \cmd{\Soto} & \Soto & \ShowIdxPageref*[Hernando]{de Soto}\\
-% \rowcolor{black!7!white}\cmd{\CapThis}\cmd{\Soto} & \CapThis\Soto & \ShowIdxPageref*[Hernando]{de Soto}\\
-% \cmd{\JWG} & \JWG & \ShowIdxPageref*[J.W. von]{Goethe}\\
-% \rowcolor{black!7!white}\cmd{\JWG} & \JWG & \ShowIdxPageref*[J.W. von]{Goethe}\\\bottomrule
-% \end{tabular}
-% \end{center}
-% \newpage
-%
-% \begin{center}\bfseries \meta{Alternate} Tips\end{center}
+% \begin{tabular}{r@{\ \ \ }l@{\ \ }l}\toprule
+% Output & Short Form & Long Form\\\midrule
+% \rowcolor{grey}\Wash & \cmd{\Wash} & \cmd{\Name}\texttt{[George]\{Washington\}}\\
+% \LWash & \cmd{\LWash} & \cmd{\Name*}\texttt{[George]\{Washington\}}\\
+% \rowcolor{grey}\SWash & \cmd{\SWash} & \cmd{\FName}\texttt{[George]\{Washington\}}\\
+% \ForgetThis\Wash & \cmd{\ForgetThis}\cmd{\Wash} & \cmd{\ForgetName}\texttt{[George]\{Washington\}}\\
+% & & \cmd{\Name}\texttt{[George]\{Washington\}}\\
+% \rowcolor{grey}\SubvertThis\Wash & \cmd{\SubvertThis}\cmd{\Wash} & \cmd{\SubvertName}\texttt{[George]\{Washington\}}\\
+% \rowcolor{grey}& & \cmd{\Name}\texttt{[George]\{Washington\}}\\
+% \JustIndex\Wash & \cmd{\JustIndex}\cmd{\Wash} & \cmd{\IndexName}\texttt{[George]\{Washington\}}\\\bottomrule
+% \end{tabular}
+% \end{center}\leavevmode
%
+% \begin{center}\bfseries Name Variant Overview\end{center}
% \phantomsection
-% \noindent Above we listed two shorthands that had alternate names in \meta{arg4}: \cmd{\CSL} and \cmd{\MSens}. They have related shorthands whose \meta{arg4} are empty: \cmd{\Lewis} and \cmd{\Miyaz}. Here are how they are related (cf. Section~\ref{sec:FName}):\label{page:ArgIV}
-% \begin{itemize}
-% \item They share the same name patterns (Section~\ref{sec:NamePatterns}): |\ForgetThis\Lewis| \ForgetThis\Lewis; \cmd{\CSL} \CSL. |\ForgetThis\Miyaz| \ForgetThis\Miyaz; and \cmd{\MSens} \MSens.
-% \item More commonly, one produces alternate names with \cmd{\LLewis[C.S.]} \LLewis[C.S.] and \cmd{\LMiyaz[Sensei]} \LMiyaz[Sensei].
-% \item Both\Warn{} \cmd{\LCSL} \LCSL\ and \cmd{\LMSens} \LMSens\ already have \meta{Alternate} built in. They cannot take another optional argument. One must remember which shorthands have used \meta{arg4}.
-% \item If one should forget that, one will get errors: \cmd{\LCSL[C.S.]} \LCSL[C.S.] and \cmd{\LMsens[Sensei]} \LMSens[Sensei].
-% \end{itemize}
%
-% \begin{center}\bfseries Variant Overview\end{center}
+% \vspace{-2ex}\Illus{}\vspace{2ex}Below we use \cmd{\ForgetThis} (Section~\ref{sec:NameControl}) to simulate first uses of names as needed, then proceed with subsequent uses:\footnote{With \texttt{pdflatex} and \texttt{latex}, in \texttt{\ShowPattern{Æthelred, II}} the glyphs \texttt{ÃĘ} correspond to \cmd{\IeC\{}\cmd{\AE\}}.}
%
% \begin{center}\footnotesize\MyStretch
+% \leavevmode\SPatInfo{\ShowPattern[George]{Washington}\break \ShowPattern[Hernando]{de~Soto}\break \ShowPattern[George S.]{Patton, Jr.}\break \ShowPattern[J.D.]{Rockefeller, IV}\break \ShowPattern[Clive Staples]{Lewis}\break \ShowPattern{Aristotle}\break \ShowPattern{Æthelred, II}\break \ShowPattern{John, Eriugena}\break \ShowPattern[Hideyo]{Noguchi}\break \ShowPattern{Yamamoto, Isoroku}}\vspace{-2.3ex}
% \begin{tabular}{@{}p{18.4em}p{22.4em}@{}}
-% \textsc{Western:}\par
+% \textsc{Western:} \hfill (Sections~\ref{sec:Naming}, \ref{sec:FName})\par
% |\Wash|\dotfill \ForgetThis\Wash\par
% |\LWash|\dotfill \LWash\par
% |\Wash|\dotfill \Wash\par
@@ -1171,16 +1304,31 @@ the README.txt or README for more information.
% |\Soto|\dotfill \ForgetThis\Soto\par
% |\Soto|\dotfill \Soto\par
% |\CapThis\Soto|\dotfill \CapThis\Soto\par
-% \par\hbox{}\par
+% &
+% \textsc{Ancient Mononym} \hfill (trivial case)\par
+% |\Aris|\dotfill \ForgetThis\Aris\par
+% |\Aris|\dotfill \Aris \par
+% (This is the trivial case.)\par\hbox{}\par
+% \textsc{Royal and Medieval:} \hfill (Sections~\ref{sec:Eastern}, \ref{sec:NameAncient})\par
+% |\Aeth|\dotfill \ForgetThis\Aeth\par
+% |\Aeth|\dotfill \Aeth\par
+% |\LAeth[Unrædig]|\dotfill \LAeth[Unrædig]\par
+% |\Eriugena|\dotfill \ForgetThis\Eriugena\par
+% |\Eriugena|\dotfill \Eriugena\par
+% \\
+% \end{tabular}
+% \leavevmode\vspace{2ex}\IdxInfo{\ShowIdxPageref*[George]{Washington}\break \ShowIdxPageref*[Hernando]{de~Soto}\break \ShowIdxPageref*[George S.]{Patton, Jr.}\break \ShowIdxPageref*[J.D.]{Rockefeller, IV}\break \ShowIdxPageref*[Clive Staples]{Lewis}\break \ShowIdxPageref*{Aristotle}\break \ShowIdxPageref*{Æthelred, II}\break \ShowIdxPageref*{John, Eriugena}\break \ShowIdxPageref*[Hideyo]{Noguchi}\break \ShowIdxPageref*{Yamamoto, Isoroku}}\vspace{-2.5ex}
+% \begin{tabular}{@{}p{18.4em}p{22.4em}@{}}
% \textsc{Affixes:} \hfill (Section~\ref{sec:Affix})\par
% |\Pat|\dotfill \ForgetThis\Pat\par
% |\LPat|\dotfill \LPat\par
% |\DropAffix\LPat|\dotfill \DropAffix\LPat\par
% |\Pat|\dotfill \Pat\par
-% |\SPat|\dotfill \SPat\par
% \par\hbox{}\par
% \textsc{Nicknames:} \hfill (Section~\ref{sec:FName})\par
-% |\JRIV|\dotfill \ForgetThis\JRIV\par
+% |\DropAffix\LPat[George]|\dotfill \DropAffix\LPat[George]\par
+% |\SPat[George]|\dotfill \SPat[George]\par
+% |\JRIV[John D.]|\dotfill \ForgetThis\JRIV[John D.]\par
% |\DropAffix\LJRIV[Jay]|\dotfill \DropAffix\LJRIV[Jay]\par
% |\SJRIV[Jay]|\dotfill \SJRIV[Jay]\par
% |\Lewis|\dotfill \ForgetThis\Lewis\par
@@ -1189,17 +1337,6 @@ the README.txt or README for more information.
% |\LCSL|\dotfill \LCSL\par
% |\SCSL|\dotfill \SCSL
% &
-% \textsc{Ancient\,/\,Mononym}\par
-% |\Aris|\dotfill \ForgetThis\Aris\par
-% |\Aris|\dotfill \Aris \par
-% \par\hbox{}\par
-% \textsc{Ancient\,/\,Royal:} \hfill (Sections~\ref{sec:Eastern}, \ref{sec:NameParticles})\par
-% |\Aeth|\dotfill \ForgetThis\Aeth\par
-% |\Aeth|\dotfill \Aeth\par
-% |\LAeth[Unrædig]|\dotfill \LAeth[Unrædig]\par
-% |\Attil|\dotfill \ForgetThis\Attil\par
-% |\Attil|\dotfill \Attil\par
-% \par\hbox{}\par
% \textsc{``Non-native'' Eastern:} \hfill (Section~\ref{sec:Eastern})\par
% |\Noguchi|\dotfill \ForgetThis\Noguchi\par
% |\LNoguchi|\dotfill \LNoguchi\par
@@ -1218,278 +1355,153 @@ the README.txt or README for more information.
% |\SYamt|\dotfill \SYamt\par
% |\ForceFN\SYamt|\dotfill \ForceFN\SYamt
% \\
-% \end{tabular}
+% \end{tabular}\medskip
% \end{center}
-% Above we used \cmd{\ForgetThis} (Section~\ref{sec:NameControl}) to reset first uses of names. Now we set up examples on page~\pageref{page:ExPage} by invoking \cmd{\ExcludeName\{Attila, the Hun\}}\ExcludeName{Attila, the Hun} and \cmd{\AKA[John David]\{Rockefeller,IV\}[Jay]\{Rockefeller\}} \AKA[John David]{Rockefeller,IV}[Jay]{Rockefeller}. On why that form has a different index entry than |\DropAffix\LJRIV[Jay]| \DropAffix\LJRIV[Jay], see Sections~\ref{sec:IndexXref} and~\ref{sec:AKA}.
% \newpage
%
-% \subsubsection[Macro Overview]{Select Macro Overview}
+% \subsection[Macro Overview]{Select Macro Overview}
% \label{sec:SelectOver}
%
-% \noindent Below we have a partial selection of macros and their arguments in overview:
+% \begin{center}\bfseries Macros Taking Name Arguments\end{center}
+%
% \begin{center}\small\MySmallStretch
% \begin{tabular}{lrccl}\toprule
-% \meta{prefix macros} & \cmd{\Name} & \meta{optional *} & \meta{name args} & \\
+% \llap{Naming\qquad}\meta{prefix macros} & \cmd{\Name} & \meta{optional *} & \meta{name args} & \\
% \meta{prefix macros} & \cmd{\FName} & \meta{optional *} & \meta{name args} & \\
-% \rowcolor{black!7!white}\meta{prefix macros} & \cmd{\IndexName} & & \meta{name args} & \\
-% \rowcolor{black!7!white}\meta{prefix macros} & \cmd{\IndexRef} & & \meta{xref args} & \meta{target}\\
-% \meta{prefix macros} & \cmd{\AKA} & \meta{optional *} & \meta{target args} & \meta{xref args}\\
-% \rowcolor{black!7!white} & \cmd{\ExcludeName} & & \meta{name args} & \\
-% \rowcolor{black!7!white} & \cmd{\IncludeName} & \meta{optional *} & \meta{name args} & \\
-% & \cmd{\PretagName} & & \meta{name args} & \meta{sort key} \\
-% & \cmd{\TagName} & & \meta{name args} & \meta{tag} \\
-% & \cmd{\UntagName} & & \meta{name args} & \\
-% \rowcolor{black!7!white} & \cmd{\NameAddInfo} & & \meta{name args} & \meta{tag} \\
-% \rowcolor{black!7!white} & \cmd{\NameQueryInfo} & & \meta{name args} & \\
-% \rowcolor{black!7!white} & \cmd{\NameClearInfo} & & \meta{name args} & \\
-% & \cmd{\ForgetName} & & \meta{name args} & \\
-% & \cmd{\SubvertName} & & \meta{name args} & \\
-% \rowcolor{black!7!white} & \cmd{\IfMainName} & & \meta{name args} & \marg{y}\marg{n}\\
-% \rowcolor{black!7!white} & \cmd{\IfFrontName} & & \meta{name args} & \marg{y}\marg{n}\\
-% \rowcolor{black!7!white} & \cmd{\IfAKA} & & \meta{name args} & \marg{y}\marg{n}\marg{x}\\\bottomrule
+% \rowcolor{grey}\llap{Page ref\qquad}\cmd{\SeeAlso} & \cmd{\IndexName} & & \meta{name args} & \\
+% \rowcolor{grey}\llap{Only cross-ref\qquad}\cmd{\SeeAlso} & \cmd{\IndexRef} & & \meta{xref args} & \meta{target}\\
+% \llap{Prevent page ref\qquad} & \cmd{\ExcludeName} & & \meta{name args} & \\
+% \llap{Enable page ref\qquad} & \cmd{\IncludeName} & \meta{optional *} & \meta{name args} & \\
+% \rowcolor{grey}\llap{Sort index\qquad}& \cmd{\PretagName} & & \meta{name args} & \meta{sort key} \\
+% \rowcolor{grey}\llap{Append idx tag\qquad}& \cmd{\TagName} & & \meta{name args} & \meta{tag} \\
+% \rowcolor{grey}\llap{Delete idx tag\qquad}& \cmd{\UntagName} & & \meta{name args} & \\
+% \llap{Make text tag\qquad} & \cmd{\NameAddInfo} & & \meta{name args} & \meta{tag} \\
+% \llap{Show text tag\qquad} & \cmd{\NameQueryInfo} & & \meta{name args} & \\
+% \llap{Delete text tag\qquad} & \cmd{\NameClearInfo} & & \meta{name args} & \\
+% \rowcolor{grey}\llap{Delete name cs\qquad} & \cmd{\ForgetName} & & \meta{name args} & \\
+% \rowcolor{grey}\llap{Create name cs\qquad} & \cmd{\SubvertName} & & \meta{name args} & \\
+% \llap{Name cs tests\qquad} & \cmd{\IfMainName} & & \meta{name args} & \marg{y}\marg{n}\\
+% & \cmd{\IfFrontName} & & \meta{name args} & \marg{y}\marg{n}\\
+% & \cmd{\IfAKA} & & \meta{name args} & \marg{y}\marg{n}\marg{x}\\
+% \rowcolor{grey}\llap{Debugging\qquad} & \cmd{\ShowPattern} & & \meta{name args} & \\
+% \rowcolor{grey} & \cmd{\ShowIdxPageref} & \meta{optional *} & \meta{name args} & \\\bottomrule
% \end{tabular}
% \end{center}
+% Not shown above are \cmd{\AKA}, \cmd{\AKA*}, \cmd{\PName}, and \cmd{\PName*} (Section~\ref{sec:AKA}). These macros from the early days of \textsf{nameauth} have specialized arguments and issues.
+%
+% \begin{center}\bfseries Prefix Macros (One Use Per Name)\end{center}
%
-% \noindent The \meta{prefix macros} below have a one-time effect per name and they also stack. For example: |\CapThis\RevName\SkipIndex\Name[bar]{foo}|: \CapThis\RevName\SkipIndex\Name[bar]{foo}.
% \begin{center}\small\MySmallStretch
% \begin{tabular}{rp{0.72\textwidth}}\toprule
% & \bfseries Capitalization in the Text\\
+% \cmd{\CapName} & Cap entire \meta{SNN} in body text. Overrides \cmd{\CapThis}.\\
% \cmd{\CapThis} & Capitalize first letter of all name components in body text.\\
% \cmd{\AccentCapThis} & Fallback when Unicode detection cannot be done.\\
-% \cmd{\CapName} & Cap entire \meta{SNN} in body text. Overrides \cmd{\CapThis}.\\
-% \rowcolor{black!7!white} & \bfseries Reversing in the Text\\
-% \rowcolor{black!7!white}\cmd{\RevName} & Reverse order of any name in body text. Overrides \cmd{\RevComma}\\
-% \rowcolor{black!7!white}\cmd{\RevComma} & Reverse only Western names to \meta{SNN}, \meta{FNN}.\\
+% \rowcolor{grey} & \bfseries Reversing in the Text\\
+% \rowcolor{grey}\cmd{\RevName} & Reverse order of any name in body text. Overrides \cmd{\RevComma}\\
+% \rowcolor{grey}\cmd{\RevComma} & Reverse only Western names to \meta{SNN}, \meta{FNN}.\\
% & \bfseries Commas in the Text\\
% \cmd{\ShowComma} & Add comma between \meta{SNN} and \meta{Affix}.\\
% \cmd{\NoComma} & No comma between \meta{SNN} and \meta{Affix}. Overrides \cmd{\ShowComma}.\\
-% \rowcolor{black!7!white} & \bfseries Name Breaks in the Text\\
-% \rowcolor{black!7!white}\cmd{\DropAffix} & Drop affix only for a long Western name reference.\\
-% \rowcolor{black!7!white}\cmd{\KeepAffix} & Insert non-breaking space (NBSP) between \meta{SNN}, \meta{FNN/Affix}.\\
-% \rowcolor{black!7!white}\cmd{\KeepName} & Insert NBSP between all name elements. Overrides \cmd{\KeepAffix}.\\
-% & \bfseries Forcing Name Forms in the Text\\
+% \rowcolor{grey} & \bfseries Name Breaks in the Text\\
+% \rowcolor{grey}\cmd{\DropAffix} & Drop affix only for a long Western name reference.\\
+% \rowcolor{grey}\cmd{\KeepAffix} & Insert non-breaking space (NBSP) between \meta{SNN}, \meta{FNN/Affix}.\\
+% \rowcolor{grey}\cmd{\KeepName} & Insert NBSP between all name elements. Overrides \cmd{\KeepAffix}.\\
+% & \bfseries Forcing Name Forms via Control Sequence\\
% \cmd{\ForgetThis} & Force a first-time name use. Negates \cmd{\SubvertThis}.\\
% \cmd{\SubvertThis} & Force a subsequent use.\\
-% \cmd{\ForceName} & Force first-use formatting hooks.\\
-% \cmd{\ForceFN} & Force printing of \meta{Affix} in non-Western short forms.\\
-% \rowcolor{black!7!white} & \bfseries Indexing\\
-% % \rowcolor{black!7!white}\cmd{\SeeAlso} & Make a \textit{see also} reference instead of a page reference. Only for use with \cmd{\IndexRef}, \cmd{\AKA}, \cmd{\PName} and their starred variants.\\
-% \rowcolor{black!7!white}\cmd{\SkipIndex} & Do not create index entries.\\
-% \rowcolor{black!7!white}\cmd{\JustIndex} & Act like \cmd{\IndexName}; negated by \cmd{\AKA}, \cmd{\PName}.\\\bottomrule
+% \rowcolor{grey} & \bfseries Forcing Name Forms via Boolean Flags\\
+% \rowcolor{grey}\cmd{\ForceName} & Force first-use formatting hooks.\\
+% \rowcolor{grey}\cmd{\ForceFN} & Force printing of \meta{Affix} in non-Western short forms.\\
+% & \bfseries Indexing\\
+% \cmd{\SeeAlso} & For \cmd{\IndexName}, \cmd{\AKA}, and \cmd{\PName}; make a \textit{see also} xref.\\
+% \cmd{\SkipIndex} & For naming macros; do not create an index entry.\\
+% \cmd{\JustIndex} & For naming macros; index only (once); negated by \cmd{\AKA}, \cmd{\PName}.\\\bottomrule
% \end{tabular}
% \end{center}
-%
-% \ReturnLink
% \newpage
%
-% \subsection{Obsolete Syntax}
-% \label{sec:Obsolete}
-%
-% This ``ghost''\Warn{} of \textsf{nameauth} past limits alternate names and cross-references (Section~\ref{sec:AKA}), excludes comma-delimited names, and complicates indexing and tagging (Sections~\ref{sec:IndexTag} and~\ref{sec:TextTags}). When the \meta{FNN} and \meta{Affix} arguments are empty, \meta{Alternate} acts like \meta{Affix} and affects both name and index patterns (Section~\ref{sec:NamePatterns}). In this manual we designate these names with a double dagger (\ddag):
-%
-% \begin{quote}\small\MyStretch
-% |\Name{Henry}[VIII] | {\color{nared}|%| \textit{Ancient}}\\
-% |\Name{Chiang}[Kai-shek] | {\color{nared}|%| \textit{Eastern}}\\
-% |\begin{nameauth}|\\
-% | \< Dagb & & Dagobert & I > | {\color{nared}|%| \textit{Ancient}}\\
-% | \< Yosh & & Yoshida & Shigeru > | {\color{nared}|%| \textit{Eastern}}\\
-% |\end{nameauth}|\medskip
-% \end{quote}
-%
-% \begin{center}\small\MyStretch
-% \begin{tabular}{ll}\toprule
-% |\Name{Henry}[VIII]| & \Name{Henry}[VIII]\ddag\\
-% |\Name{Henry}[VIII]| & \Name{Henry}[VIII]\ddag\\
-% \rowcolor{black!7!white}|\Name{Chiang}[Kai-shek]| & \Name{Chiang}[Kai-shek]\ddag\\
-% \rowcolor{black!7!white}|\Name{Chiang}[Kai-shek]| & \Name{Chiang}[Kai-shek]\ddag\\
-% |\Dagb| & \Dagb\ddag\\
-% |\Dagb| & \Dagb\ddag\\
-% \rowcolor{black!7!white}|\CapName\Yosh| & \CapName\Yosh\ddag\\
-% \rowcolor{black!7!white}|\CapName\RevName\LYosh| & \CapName\RevName\LYosh\ddag\\\bottomrule
-% \end{tabular}
-% \end{center}
-%
-% |\Name{Henry}[VIII]|\Version{2.6} (older syntax) and |\Name{Henry, VIII}| (new syntax) share name patterns, tags, and index entries, as shown below. We recommend using the newer syntax unless otherwise needed.
-% \begin{quote}\small
-% \NameAddInfo{Henry}[VIII]{ (\textit{Defensor Fidei})}%
-% |\NameAddInfo{Henry}[VIII]{ (\textit{Defensor Fidei})}|{\color{nared}| % old|}\\
-% {.\,.\,.}\\
-% |\Name*{Henry, VIII}\NameQueryInfo{Henry, VIII} |{\color{nared}| % new|}\smallskip\\
-% \Name*{Henry, VIII}\NameQueryInfo{Henry, VIII}
-% \end{quote}
-%
-% \ReturnLink
-%
-% \subsection{Name Pattern Overview}
-% \label{sec:NamePatterns}
-%
-% The table below shows how the macro arguments generate name patterns central to \textsf{nameauth}. The \meta{Alternate} argument only affects patterns when using the obsolete syntax. The naming macro arguments create internal control sequences that affect names in both the text and the index:
-%
-% \begin{center}\MyStretch
-% \begin{tabular}{lll}\toprule
-% Macro Arguments & Patterns & Type\\\midrule
-% \rowcolor{black!7!white}\oarg{FNN}\marg{SNN} & \meta{FNN}!\meta{SNN} & \normalfont Western\\
-% \oarg{FNN}\marg{SNN, Affix} & \meta{FNN}!\meta{SNN},\meta{Affix} & \normalfont Western\\
-% \rowcolor{black!7!white}\hphantom{\oarg{FNN}}\marg{SNN, Affix} & \meta{SNN},\meta{Affix} & \normalfont non-Western\\
-% \hphantom{\oarg{FNN}}\marg{SNN}\oarg{Alt} & \meta{SNN},\meta{Alt} & \normalfont (obsolete)\\
-% \rowcolor{black!7!white}\hphantom{\oarg{FNN}}\marg{SNN} & \meta{SNN} & \normalfont mononym\\\bottomrule
-% \end{tabular}
-% \end{center}
-% \newpage
-%
-% \noindent We ``forget'' several names below to create first-use cases:
-% \begin{center}\footnotesize\MyStretch
-% \begin{tabular}{rll}\toprule
-% Macro & Body Text & \cmd{\ShowPattern}\\\midrule
-% \cmd{\Harnack[Adolf von]} & \Harnack[Adolf von] & \texttt{\ShowPattern[Adolf]{Harnack}}\\
-% \cmd{\LHarnack} & \LHarnack & \texttt{\ShowPattern[Adolf]{Harnack}}\\
-% \rowcolor{black!7!white}\cmd{\ForgetThis}\cmd{\Pat} & \ForgetThis\Pat & \texttt{\ShowPattern[George S.]{Patton, Jr.}}\\
-% \rowcolor{black!7!white}\cmd{\DropAffix}\cmd{\LPat} & \DropAffix\LPat & \texttt{\ShowPattern[George S.]{Patton, Jr.}}\\
-% \cmd{\ForgetThis}\cmd{\Noguchi} & \ForgetThis\Noguchi & \texttt{\ShowPattern[Hideyo]{Noguchi}}\\
-% \cmd{\RevName}\cmd{\LNoguchi} & \RevName\LNoguchi\dag & \texttt{\ShowPattern[Hideyo]{Noguchi}}\\
-% \rowcolor{black!7!white}\cmd{\ForgetThis}\cmd{\Yamt} & \ForgetThis\Yamt & \texttt{\ShowPattern{Yamamoto,Isoroku}}\\
-% \rowcolor{black!7!white}\cmd{\RevName}\cmd{\LYamt} & \RevName\LYamt & \texttt{\ShowPattern{Yamamoto,Isoroku}}\\
-% \cmd{\ForgetThis}\cmd{\Name\{Henry,VIII\}} & \ForgetThis\Name{Henry,VIII} & \texttt{\ShowPattern{Henry,VIII}}\\
-% \cmd{\Name*\{Henry\}[VIII]} & \Name*{Henry}[VIII]\ddag & \texttt{\ShowPattern{Henry,VIII}}\\
-% \rowcolor{black!7!white}\cmd{\Dem[I Soter]} & \Dem[I Soter] & \texttt{\ShowPattern{Demetrius,I}}\\
-% \rowcolor{black!7!white}\cmd{\LDem} & \LDem & \texttt{\ShowPattern{Demetrius,I}}\\
-% \cmd{\ForgetThis}\cmd{\Aris} & \ForgetThis\Aris & \texttt{\ShowPattern{Aristotle}}\\
-% \cmd{\Aris} & \Aris & \texttt{\ShowPattern{Aristotle}}\\\bottomrule
-% \end{tabular}
-% \ForgetName{Demetrius, I}\ForgetName[Adolf]{Harnack}
-% \end{center}\bigskip
-%
-% \noindent Six suffixes are appended to these patterns to create independent data sets:
-% \begin{center}\small\MyStretch
-% \begin{tabular}{llll}\toprule
-% Description & Pattern & Mnemonic & Example\\\midrule
-% \rowcolor{black!7!white}Front-matter names & \meta{pattern}\texttt{!NF} & ``name front'' & \texttt{\ShowPattern[Adolf]{Harnack}{!NF}}\\
-% Main-matter names & \meta{pattern}\texttt{!MN} & ``main name'' & \texttt{\ShowPattern[Hideyo]{Noguchi}{!MN}}\\
-% \rowcolor{black!7!white}Index cross-refs & \meta{pattern}\texttt{!PN} & ``pseudonym'' & \texttt{\ShowPattern{Yamamoto, Isoroku}{!PN}}\\
-% Index sorting tags & \meta{pattern}\texttt{!PRE} & ``pretag'' & \texttt{\ShowPattern{Henry, VIII}{!PRE}}\\
-% \rowcolor{black!7!white}Index info tags & \meta{pattern}\texttt{!TAG} & ``tag'' & \texttt{\ShowPattern{Demetrius, I}{!TAG}}\\
-% ``Text tag'' database & \meta{pattern}\texttt{!DB} & ``database'' & \texttt{\ShowPattern{Aristotle}{!DB}}\\\bottomrule
-% \end{tabular}
-% \end{center}\bigskip
-%
-% \noindent The following macros \emph{write} to these data sets; others also can read from them:
-% \begin{center}\small\MyStretch
-% \begin{tabular}{lcccccc}\toprule[1pt]
-% Macros & \ttfamily \,!NF\, & \ttfamily \,!MN\, & \ttfamily \,!PN\, & \ttfamily !PRE & \ttfamily !TAG & \ttfamily \,!DB\,\\\midrule
-% \cmd{\Name} \cmd{\Name*} \cmd{\FName} & \YES & \YES & \NO & \NO & \NO & \NO\\
-% \cmd{\ForgetName} \cmd{\SubvertName} & \YES & \YES & \NO & \NO & \NO & \NO\\\midrule
-% \cmd{\PName}\cmd{\PName*} & \YES & \YES & \YES & \NO & \NO & \NO\\\midrule
-% \cmd{\AKA} \cmd{\AKA*} \cmd{\IndexRef} & \NO & \NO & \YES & \NO & \NO & \NO\\
-% \cmd{\ExcludeName} & \NO & \NO & \YES & \NO & \NO & \NO\\
-% \cmd{\IncludeName} \cmd{\IncludeName*} & \NO & \NO & \YES & \NO & \NO & \NO\\\midrule
-% \cmd{\PretagName} & \NO & \NO & \NO & \YES & \NO & \NO\\\midrule
-% \cmd{\TagName} \cmd{\UntagName} & \NO & \NO & \NO & \NO & \YES & \NO\\\midrule
-% \cmd{\NameAddInfo} \cmd{\NameClearInfo} & \NO & \NO & \NO & \NO & \NO & \YES\\\bottomrule
-% \end{tabular}
-% \end{center}\bigskip
-%
-% \ReturnLink
-% \newpage
-%
-% \subsection[Debug and Avoid Errors]{Debugging and Avoiding Errors}
-% \label{sec:ErrorProt}
-%
-% \begin{center}\bfseries Debugging Macros\end{center}
-%
-% \DescribeMacro{\ShowPattern}
-% \cmd{\ShowPattern} displays how the name arguments create name patterns. One can debug pattern collisions and other issues with this macro:\Version{3.3}
-% \begin{quote}
-% \fbox{\mystrut\ \cmd{\ShowPattern}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }
-% \end{quote}
-% We used \cmd{\ShowPattern} in two of the tables on the previous page in order to illustrate name control patterns. We set the macro using a typewriter font, e.g.: |\texttt{\ShowPattern[Hernando]{de Soto}}|:\quad \texttt{\ShowPattern[Hernando]{de Soto}}\medskip
-%
-% \DescribeMacro{\ShowIdxPageref}
-% \cmd{\ShowIdxPageref} displays a full index entry in the text.
-% Its analogue is \cmd{\ShowIdxPageref*},
-% \DescribeMacro{\ShowIdxPageref*}
-% which shows a short index entry. Both only show names as page references, even if they are cross-references\Version{3.3}:
-% \begin{quote}
-% \fbox{\vbox{\hbox{\mystrut\ \cmd{\ShowIdxPageref\ }\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }\par
-% \hbox{\mystrut\ \cmd{\ShowIdxPageref*}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }}}
-% \end{quote}
-% The full entry produced by \cmd{\ShowIdxPageref} can be affected by both index styles and tags produced by \cmd{\PretagName} and \cmd{\TagName}, e.g.:
-% \begin{quote}
-% |\texttt{\ShowIdxPageref[Hernando]{de Soto}}:|\\
-% \ShowIdxPageref[Hernando]{de Soto}
-% \end{quote}
-% \cmd{\ShowIdxPageref*} appears throughout this manual to illustrate basic index entries, e.g.: |\ShowIdxPageref*[Hernando]{de Soto}|:\quad \ShowIdxPageref*[Hernando]{de Soto}
-%
-% \begin{center}\bfseries Avoiding Common Errors\end{center}
-%
+% \begin{center}\bfseries More on Prefix Macros\end{center}
% \begin{itemize}
-% \item Keep it simple! Avoid unneeded macros and use the simplified interface.
-% \item Compare index entries with names in the body text.
-% \item Check package warnings. Set the \texttt{verbose} option if needed.
-% \item Check arguments' braces and brackets to avoid errors like ``\texttt{Paragraph ended}'' and ``\texttt{Missing} \meta{grouping token} \texttt{inserted.}''
-% \item Do not format \meta{SNN},\meta{Affix} together as a pair. Format \meta{SNN} and \meta{Affix} separately (Section~\ref{sec:AltFormat}).
-% \item Sort names in the index with \cmd{\PretagName} (Section~\ref{sec:IndexSort}).
-% \item In package docs (\texttt{dtx} files) set up the \texttt{nameauth} environment and tags in the driver section to avoid errors.
+% \item Prefix macros stack:\\ \hbox{}\quad |\CapThis\RevName\SkipIndex\Name[bar]{foo}| \qquad \CapThis\RevName\SkipIndex\Name[bar]{foo}.
+% \item The Boolean flags governed by the prefix macros are reverted after the appropriate macros produce output in the text (or index) unless the output of the naming macros is suppressed.
+% \item Except for \cmd{\SeeAlso}, use prefix macros only before a naming macro that is designed to print output in the text.
+% \item Use \cmd{\SeeAlso}\Version{3.5} only with \cmd{\IndexRef}, \cmd{\AKA}, and \cmd{\PName}. Otherwise it will be reset by \cmd{\IndexName} and the naming macros.
+% \item Using \cmd{\JustIndex}\Version{3.5} will cause name form modifiers to be reset.
% \end{itemize}
-%
-% \begin{center}\bfseries Obsolete Syntax Caution\end{center}
%
+% Macros that do not take name arguments include:
% \begin{itemize}
-% \item The older syntax has restrictions (Section~\ref{sec:Obsolete}). Only the new syntax permits variant names, e.g.: \cmd{\Name*\{Henry, VIII\}[Tudor]} \Name*{Henry, VIII}[Tudor]. The new syntax is preferred.
-% \item A proper form for the old syntax is \cmd{\Name*\{Henry\}[VIII]}: \Name*{Henry}[VIII].
-% \item \bgroup\IndexInactive\cmd{\Name[Henry]\{VIII\}} is a malformed Western name: ``\Name*[Henry]{VIII}'' and ``\Name[Henry]{VIII}.'' Likewise \cmd{\Name[Henry]\{VIII\}[Tudor]}: ``\Name*[Henry]{VIII}[Tudor]'' and ``\Name[Henry]{VIII}[Tudor].'' Both have the incorrect index entry ``\ShowIdxPageref*[Henry]{VIII}''.\egroup
+% \item State-changing macros with broad effects (document, section, scope).
+% \item State-changing macros with single-use effects (prefix macros).
+% \item Macros that alter general \textsf{nameauth} package behavior.
+% \item Formatting macros.
% \end{itemize}
+%
+% \subsection{Various Hints}
+% \label{sec:Hints}
%
-% \begin{center}\bfseries Standard Warnings\end{center}
+% In this section we make a brief foray into some technical issues that are good to keep in mind, but not overwhelming at this point. Sections~\ref{sec:Warnings} and~\ref{sec:Errors} go into greater detail on the things that one can do to diagnose missteps and avoid errors. The point here is to keep the quick start quick.
%
-% \begin{itemize}
-% \item If one defines shorthand macros in the \texttt{nameauth} environment whose control sequence already exists, warnings always appear. For example:
-% \begin{quote}\small\StartNum
-% \begin{verbatim}
-%\PretagName[E.\,B.]{White}{White, E.B.}
-%\begin{nameauth}
-% \< White & E.B. & White & > % v.1
-% \< White & E.\,B. & White & > % v.2
-%\end{nameauth}\end{verbatim}
-% \end{quote}
-%\begin{nameauth}
-% \< White & E.B. & White & >
-% \< White & E.\,B. & White & >
-%\end{nameauth}
-% \item \cmd{\White} gives ``\White''. Its pattern is: \texttt{\ShowPattern[E.\,B.]{White}}. We lost the first version. We forget \White\ for later.\ForgetName[E.\,B.]{White} There should be two package warnings in this section for the redefinition of \cmd{\White}, because we defined it in the driver, then again here twice.
-% \item This could be a problem if a name shorthand replaces an actual macro that is used for something else and breaks that macro.
-% \item Then again, if one uses, e.g., a new \texttt{nameauth} environment per chapter, these warnings may be harmless. User discretion is advised.
-% \end{itemize}
+% \begin{center}\bfseries Automatic Stripping of Spaces\end{center}
+% The\SPatInfo{\ShowPattern[Martin Luther]{King, Jr.}} \textsf{nameauth} package trims extra spaces \emph{around} name arguments to prevent errors. Here, name arguments include \meta{FNN}, \meta{SNN}, \meta{Affix}, and \meta{Alternate}. For example,\IdxInfo{\ShowIdxPageref*[Martin Luther]{King, Jr.}} instead of being two different names, below we have the same name in a first, then subsequent use. We use no name formatting below in order to show this:\bigskip
%
-% \begin{center}\bfseries Verbose Warnings\end{center}
+% \begingroup^^A Local scope for format
+% \renewcommand*\NamesFormat{}
+% \renewcommand*\MainNameHook{}
+% \leavevmode\quad\begin{minipage}[c]{0.43\textwidth}\small
+% \StartNum
+% \begin{verbatim*}
+%\Name*[Martin Luther]
+%{King,Jr.}\\
+%\Name*[ Martin Luther ]
+%{ King, Jr. }\end{verbatim*}
+% \end{minipage}
+% \begin{minipage}[c]{0.45\textwidth}\small
+% \def\sep{\vrule width0.5pt\kern-0.5pt}%
+% \begin{tabular}{@{}ll@{}}
+% No spaces: & \sep\SubvertThis\FName[Martin Luther]{King,Jr.}\sep\ \sep\Name*[Martin Luther]{King,Jr.}[\ignorespaces]\sep\\
+% & \sep\hphantom{Martin Luther}\sep\ \sep\hphantom{King Jr.}\sep\\
+% Spaces: & \sep\FName[ Martin Luther ]
+% { King, Jr. }\sep\ \sep\Name*[ Martin Luther ]
+% { King, Jr. }[\ignorespaces]\sep\\
+% \end{tabular}
+% \end{minipage}\bigskip
%
-% \noindent Package warnings result from the following \emph{only} when the \texttt{verbose} option is used because we do not want the default to be ``chatty'':
-% \begin{itemize}
-% \item Creating an index page reference after using a name as an xref or excluding it. Not allowed.
-% \item Creating the same cross-reference multiple times. Not allowed.
-% \item Using \cmd{\ExcludeName} on an xref. Not allowed.
-% \item Using\Version{3.3} \cmd{\IncludeName} on an xref. Not allowed.
-% \item Using \cmd{\ExcludeName} to exclude a name that exists is allowed, but a warning still results.
-% \item \cmd{\PretagName} sorts xrefs, but also creates ``informational warnings.''
-% \item Using \cmd{\TagName} and \cmd{\UntagName} on xrefs. No tag allowed.
-% \end{itemize}
+% \IndexInactive
+% Using macros that expand to spaces will produce a totally different name:\bigskip
%
-% \begin{center}\bfseries Error Protection Strategies\end{center}
-%
-% \noindent The\Info{extra spaces} \textsf{nameauth} package trims extra spaces \emph{around} name arguments to prevent errors like multiple index entries that appear due to extra spaces. \LaTeX\ usually compacts internal spaces. For example, instead of being two different names, below we have the same name in a first, then subsequent use:
-%
-% \begin{center}\small\MyStretch\ForgetName[Martin Luther]{King, Jr.}
-% \begin{tabular}{ll}
-% \cmd{\Name*[Martin Luther]\{King,Jr.\}} & \Name*[Martin Luther]{King,Jr.}\\
-% \cmd{\Name*}\texttt{[\textvisiblespace\textvisiblespace Martin\textvisiblespace\textvisiblespace Luther\textvisiblespace\textvisiblespace]\{\textvisiblespace\textvisiblespace King\textvisiblespace\textvisiblespace,\textvisiblespace\textvisiblespace Jr.\textvisiblespace\textvisiblespace\}} & \Name*[ Martin Luther ]{ King , Jr. }\\
-% \end{tabular}
-% \end{center}
+% \leavevmode\quad\begin{minipage}[c]{0.43\textwidth}\small
+% \StartNum
+% \begin{verbatim*}
+%\Name*[ Martin Luther ]
+%{ King, Jr. }\\
+%\Name*[\ Martin Luther\ ]
+%{\ King, Jr.\ }\end{verbatim*}
+% \end{minipage}
+% \begin{minipage}[c]{0.45\textwidth}\small
+% \def\sep{\vrule width0.5pt\kern-0.5pt}%
+% \begin{tabular}{@{}ll@{}}
+% Spaces:\hphantom{No} & \sep\SubvertThis\FName[ Martin Luther ]{ King, Jr. }\sep\ \sep\Name*[ Martin Luther ]{ King, Jr. }[\ignorespaces]\sep\\
+% & \sep\hphantom{Martin Luther}\sep\ \sep\hphantom{King Jr.}\sep\\
+% Macros: & \sep\SubvertThis\FName[\ Martin Luther\ ]
+% {\ King, Jr.\ }\sep\ \sep\Name*[\ Martin Luther\ ]
+% {\ King, Jr.\ }[\ignorespaces]\sep\\
+% \end{tabular}\smallskip
%
-% This does not include explicit spaces from \cmd{\space}, etc. For example, the pattern \texttt{\ShowPattern[Martin Luther]{King, Jr.}} comes from \cmd{\Name[Martin Luther]\{King, Jr.\}} while \texttt{\ShowPattern[Martin~Luther]{King, Jr.}} comes from \cmd{\Name[Martin}|~|\texttt{Luther]\{King, Jr.\}}. The tilde appears as a non-breaking space in the text.
+% Simple Pattern:\\
+% \hphantom{Index: }\fbox{\texttt{\ShowPattern[\ Martin Luther\ ]{\ King, Jr.\ }}}\\
+% Index: \fbox{\ShowIdxPageref*[\ Martin Luther\ ]{\ King, Jr.\ }}
+% \end{minipage}\bigskip
+% \endgroup^^A Local scope for format
+%
+% Yet one may have to include a non-breaking space (active character |~|) after a name particle like \textit{de} to keep the name from breaking badly (Section~\ref{sec:NameParticles}). One must use that non-breaking space consistently to avoid errors.
% \newpage
-%
-% Full\Info{full stop\break detection} stops appear in one's initials and in affixes like ``Jr.'' (junior), ``Sr.'' (senior), ``d.\,J.'' (\textit{der Jüngere}), and ``d.\,Ä.'' (\textit{der Ältere}). The naming macros and some of the alternate name macros (Section~\ref{sec:AKA}) check if the printed name ends with a full stop and is followed by one. They gobble the extra full stop:
+%
+% \begin{center}\bfseries Full Stop Detection\end{center}
+% Full stops appear in one's initials and in affixes like ``Jr''. (junior), ``Sr''. (senior), ``d.\,J''. (\textit{der Jüngere}), and ``d.\,Ä''. (\textit{der Ältere}). The naming macros and some alternate name macros (Section~\ref{sec:AKA}) check if the printed name ends with a full stop and is followed by one. They gobble the extra full stop. Below we resume formatting and pretend that we have not seen Dr. King's name yet:
% \begin{quote}\small\ForgetName[Martin Luther]{King, Jr.}
-% |This is Rev. Dr. \Name[Martin Luther]{King, Jr.}.|\\
+% |This is Rev. Dr. \Name[Martin Luther]{King, Jr.}.|\SPatInfo{\ShowPattern[Martin Luther]{King,Jr.}}\\
% This is Rev. Dr. \Name[Martin Luther]{King, Jr.}. \hfill Full stop is gobbled.\\[2ex]
% |This is Rev. Dr. \Name[Martin Luther]{King, Jr.}.|\\
% This is Rev. Dr. \Name[Martin Luther]{King, Jr.}. \hfill Full stop is not gobbled.\\[2ex]
@@ -1501,176 +1513,228 @@ the README.txt or README for more information.
% His initials are \FName[Martin Luther]{King, Jr.}[M.L.]. \hfill Full stop is gobbled.
% \end{quote}
%
-% Take\Info{grouping\break issues} care when using braces and spaces with a name at the end of a sentence. Braces can change name arguments, even though they look the same. We disable indexing for the three points below:\IndexInactive
+% \begin{center}\bfseries Caveats with Grouping\end{center}
+% Take care when using braces and spaces with a name at the end of a sentence. Braces will change the control sequence patterns generated by name arguments. Put simply, this means that both the names and their index entries will be different and behave differently\,---\,even though they look the same (Sections~\ref{sec:IndexSort}, \ref{sec:NamePatterns}). We disable indexing for the three points below:\IndexInactive
% \begin{itemize}\small
-% \item If one encapsulates a name in braces, the punctuation detection fails:\\
+% \item If one\SPatInfo{\ShowPattern[Martin Luther]{King,Jr.}} encapsulates a name in braces, the punctuation detection fails:\\
% |This is Rev. Dr. {\Name*[Martin Luther]{King, Jr.}}.|\\
% This is Rev. Dr. {\Name*[Martin Luther]{King, Jr.}}. \hfill Full stop is not gobbled.
% \item[] A solution encapsulates both the name and the full stop:\\
% |This is Rev. Dr. {\Name*[Martin Luther]{King, Jr.}.}|\\
% This is Rev. Dr. {\Name*[Martin Luther]{King, Jr.}.} \hfill Full stop is gobbled.
-% \item If one encapsulates \meta{Affix} in braces, the punctuation detection fails:\\
+% \item If one\SPatInfo{\ShowPattern[Martin Luther]{King, {Jr.}}\break \ShowPattern[Martin Luther]{King, {Jr}.}} encapsulates \meta{Affix} in braces, the punctuation detection fails:\\
% |This is Rev. Dr. \Name*[Martin Luther]{King, {Jr.}}.|\\
% This is Rev. Dr. \Name*[Martin Luther]{King, {Jr.}}. \hfill Full stop is not gobbled.
-% \item[] The solution leaves the full stop in \meta{Affix} outside the braces:\\
+% \item[] A solution\vspace{-1ex}\IdxInfo{\ShowIdxPageref*[Martin Luther]{King, {Jr.}}\break \ShowIdxPageref*[Martin Luther]{King, {Jr}.}\break (Looks identical, but not.)}\vspace{1ex} leaves the full stop in \meta{Affix} outside the braces:\\
% |This is Rev. Dr. \Name*[Martin Luther]{King, {Jr}.}.|\\
% This is Rev. Dr. \Name*[Martin Luther]{King, {Jr}.}. \hfill Full stop is gobbled.
-% \item[] The name patterns, however, are different, creating different names:\\
-% \texttt{\ShowPattern[Martin Luther]{King, {Jr.}}}\\
-% \texttt{\ShowPattern[Martin Luther]{King, {Jr}.}}
-% \item If one leaves an extra space after a name, the punctuation detection fails:\\
+% \item[] Yet the name patterns (Section~\ref{sec:NamePatterns}) are different, creating two different names and two different index entries.
+% \item A space\SPatInfo{\ShowPattern[Martin Luther]{King,Jr.}} between a name and full stop hinders punctuation detection, except with the quick interface:\\
% |This is Rev. Dr. \Name*[Martin Luther]{King, Jr.}|\texttt{\textvisiblespace.}\\
% This is Rev. Dr. \Name*[Martin Luther]{King, Jr.} . \hfill Full stop is not gobbled.
% \item[] The solution removes the extra space:\\
% |This is Rev. Dr. \Name*[Martin Luther]{King, Jr.}.|\\
% This is Rev. Dr. \Name*[Martin Luther]{King, Jr.}. \hfill Full stop is gobbled.
% \end{itemize}\IndexActive
+% \newpage
%
-% Variations\Info{active chars\break and macros} in the use of active characters and control sequences also change name arguments and index sorting (Section~\ref{sec:IndexSort}; cf.~\ref{sec:Unicode} and~\ref{sec:TeXengines}):
-% \begin{itemize}\small
-% \item |\Name*{Æthelred, II}| \Name*{Æthelred, II};\hfill Pattern: \texttt{\ShowPattern{Æthelred, II}}\footnote{With \texttt{pdflatex} / \texttt{latex}, the glyphs \texttt{ÃĘ} correspond to \cmd{\IeC\{\textbackslash AE\}}.}\newline We have seen this name earlier.
-% \item |\SkipIndex\Name{\AE thelred, II}| \SkipIndex\Name{\AE thelred, II};\hfill Pattern: \texttt{\ShowPattern{\AE thelred, II}}\newline This is a new name that looks the same.\newpage
-% \item |\Name{Bo\"ethius}| \Name{Bo\"ethius};\hfill Pattern: \texttt{\ShowPattern{Bo\"ethius}}\newline We introduce this new name.
-% \item |\SkipIndex\Name{Boëthius}| \SkipIndex\Name{Boëthius} \hfill Pattern: \texttt{\ShowPattern{Boëthius}}\footnote{With \texttt{pdflatex} / \texttt{latex}, the glyphs \texttt{Ãń} correspond to \cmd{\IeC\{\textbackslash"e\}}.}\newline This is a different name that looks the same.
-% \item |\SkipIndex\Name{Bo{\"e}thius}| \SkipIndex\Name{Bo{\"e}thius};\hfill Pattern: \texttt{\ShowPattern{Bo{\"e}thius}}\newline This also is a different name that looks the same.
-% \end{itemize}
-%
-% Omit\Info{formatting\break initials} spaces between initials; see Bringhurst, \textit{Elements of Typographic Style}. If a style guide requires spaces, try thin spaces. Use \cmd{\PretagName} to sort those names (Section~\ref{sec:IndexSort}). Below we use no formatting:\bigskip
+% \begin{center}\bfseries Caveats with Active Characters\end{center}
+% Variations in the use of active characters and control sequences also change name arguments, name control patterns, and index sorting. These changes can depend on the \LaTeX\ engine being used, but often different names are just different, even if they appear the same (Section~\ref{sec:IndexSort}; cf.~\ref{sec:Unicode} and~\ref{sec:TeXengines}):
+% \begin{enumerate}\small
+% \item |\Name*{Æthelred, II}|\dotfill \Name*{Æthelred, II}\SPatInfo{\ShowPattern{Æthelred, II} \textrm{(1)}\break \ShowPattern{\AE thelred, II} \textrm{(2)}\break \ShowPattern{Bo\"ethius} \textrm{(3)}\break \ShowPattern{Boëthius} \textrm{(4)}\break \ShowPattern{Bo{\"e}thius} \textrm{(5)}}\footnote{With \texttt{pdflatex} and \texttt{latex}, in \texttt{\ShowPattern{Æthelred, II}} the glyphs \texttt{ÃĘ} correspond to \cmd{\IeC\{}\cmd{\AE\}}.}\newline We have seen this name earlier.
+% \item |\SkipIndex\Name{\AE thelred, II}|\dotfill \SkipIndex\Name{\AE thelred, II}\hbox to 0.45em{\hfill}\newline This is a new name that looks the same.
+% \item |\Name{Bo\"ethius}|\dotfill \Name{Bo\"ethius}\hbox to 0.45em{\hfill}\newline We introduce this new name.
+% \item |\SkipIndex\Name{Boëthius}|\dotfill \SkipIndex\Name{Boëthius}\footnote{With \texttt{pdflatex} and \texttt{latex}, in \texttt{\ShowPattern{Boëthius}} the glyphs \texttt{Ãń} correspond to \cmd{\IeC\{}\cmd{\"e\}}.}\newline This is a different name that looks the same.
+% \item |\SkipIndex\Name{Bo{\"e}thius}|\dotfill \SkipIndex\Name{Bo{\"e}thius}\hbox to 0.45em{\hfill}\newline This is a third, different name that looks the same.
+% \end{enumerate}
+%
+% \begin{center}\bfseries Formatting Initials\end{center}
+% This is a thorny topic. Some publishers are dead-set on having a space between initials. Many designers find that practice to be inelegant at best. Robert Bringhurst wisely advises one to omit spaces between initials.\footnote{Robert Bringhurst, \textit{Elements of Typographic Style} 3.2 ed. (Point Roberts, Washington: Hartley \& Marks, 2008.)}
+%
+% Yet fighting with one's editor will be a lost cause unless one already has sufficient \textit{gravitas}. If a style guide requires spaces, try thin spaces. Use \cmd{\PretagName} to sort those names (Section~\ref{sec:IndexSort}). Below we use no formatting:\bigskip
%
% \leavevmode\quad\begin{minipage}[c]{0.45\textwidth}\small
% \StartNum
% \begin{verbatim}
%\PretagName[E.\,B.]{White}%
-% {White, E.B.}
+% {White, Elwyn}
%\begin{nameauth}
% \< White & E.\,B. & White & >
%\end{nameauth}\end{verbatim}
% \end{minipage}
-% \begin{minipage}[c]{0.35\textwidth}\normalsize\renewcommand*\NamesFormat{}
+% \begin{minipage}[c]{0.35\textwidth}\renewcommand*\NamesFormat{}
% \def\sep{\vrule width0.5pt\kern-0.5pt}%
-% \begin{tabular}{@{}ll@{}}\hline
-% & \sep\hphantom{E.}\sep\,\sep\hphantom{B.}\sep\hphantom{\ }\sep\hphantom{White}\\
+% \begin{tabular}{@{}ll@{}}\toprule
% \cmd{\White} & \hspace{0.48pt}\White\\
% & \sep\hphantom{E.}\sep\,\sep\hphantom{B.}\sep\hphantom{\ }\sep\hphantom{White}\\\hline
% & \sep\hphantom{E.}\sep\ \sep\hphantom{B.}\sep\ \sep\hphantom{White}\\
-% Normal text:\hfill & E. B. White\\
-% & \sep\hphantom{E.}\sep\ \sep\hphantom{B.}\sep\ \sep\hphantom{White}\\\hline
+% Normal text:\hfill & E. B. White\\\bottomrule
% \end{tabular}
% \end{minipage}\bigskip
%
-% English\Info{hyphenation} contains names from many cultures. The rules for hyphenation go to the heart of how names with non-English origins should be pronounced. With \textsf{nameauth}, one can use either optional hyphens or the \textsf{babel}\,/\,\textsf{polyglossia} packages to handle such names:
-% \NameAddInfo[John]{\de{Strietelmeier}}{late professor at Valparaiso University}
+% \begin{center}\bfseries Multicultural Hyphenation\end{center}
+% Names can be hyphenated to reflect their cultural and linguistic origins. With \textsf{nameauth}, one can use either optional hyphens or the \textsf{babel}/\textsf{polyglossia} packages to handle such names. Below we offer a simplified example without alternate formatting (Section~\ref{sec:AltFormat}):
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
%\newcommand\de[1]{\foreignlanguage{ngerman}{#1}}
% % or polyglossia: \newcommand\de[1]{\textgerman{#1}}
%\NameAddInfo[John]{\de{Strietelmeier}}%
-% {late professor at Valparaiso University}
+% {a professor at Valparaiso University}
%\begin{nameauth}
% \< Striet & John & \de{Strietelmeier} & >
%\end{nameauth}
%\PretagName[John]{\de{Strietelmeier}}{Strietelmeier, John}\end{verbatim}
% \end{quote}
+% \newpage
+%
+% Now we demonstrate three different ways of engaging this problem. In the first example we use the default hyphenation. We omit this version from the index. One might think that the name were pronounced ``stree-et-el-mai-er'':\medskip
+%
+% \noindent \emph{Not fixed:}\SPatInfo{\ShowPattern[John]{Strietelmeier}}
+%
+% \noindent In English, some names come from other cultures. These names, like \SkipIndex\Name[John]{Strietelmeier}, |\SkipIndex\Name[John]{Strietelmeier},| can break badly.\medskip
+%
+% The next example uses discretionary hyphens. It is a different name from the one above and one must be consistent with the discretionary hyphens. We also omit this version from the index:\medskip
%
-% \noindent \emph{Not fixed:}\\
-% \noindent In English, some names come from other cultures. These names, like \SkipIndex\Name[John]{Strietelmeier} \cmd{\SkipIndex}\cmd{\Name[John]\{Strietelmeier\}} can break badly.\smallskip
+% \noindent \emph{Fixed with discretionary hyphens:}\SPatInfo{\ShowPattern[John]{Strie\-tel\-meier}}\medskip
%
-% \noindent \emph{Fixed with discretionary hyphens:}\\
-% \noindent In English, some names come from other cultures. These names, like \SkipIndex\Name[John]{Strie\-tel\-meier}, \cmd{\SkipIndex}\cmd{\Name[John]\{Strie\textbackslash-tel\textbackslash-meier\}} could break badly.\smallskip
+% \noindent In English, some names come from other cultures. These names, like \SkipIndex\Name[John]{Strie\-tel\-meier}, |\SkipIndex\Name[John]{Strie\-tel\-meier},| could break badly.\medskip
%
-% \noindent \emph{Fixed with language packages:}\\
-% \noindent In English, some names come from other cultures. These names, like \Striet, \cmd{\Striet} could break badly.\medskip
+% Finally we use what may be the best general solution, the \textsf{babel} or \textsf{polyglossia} packages. Since the leading element of \meta{SNN} is a macro, using \cmd{\CapThis} would halt \LaTeX\ with errors unless we used alternate formatting (Section~\ref{sec:AltFormat}):\medskip
%
-% \Striet\ (\NameQueryInfo[John]{\de{Strietelmeier}}) is neither pronounced nor hyphenated as ``Stri-etel-meier''; rather, it is pronounced and hyphenated as ``Strie-tel-meier''. See Sections~\ref{sec:NameParticles} and~\ref{sec:AltFormat} when using macros in name arguments.
-% Using \textsf{babel} or \textsf{polyglossia} likely is best.
+% \noindent \emph{Fixed with language packages:}\SPatInfo{\ShowPattern[John]{\de{Strietelmeier}}}\medskip
%
+% \noindent In English, some names come from other cultures. These names, like \Striet, \cmd{\Striet,} could break badly. \Striet\ was at Valparaiso University.
+%
+% \begin{center}\bfseries Obsolete Syntax Caution\end{center}
+% We moved the discussion of the obsolete syntax to Section~\ref{sec:Obsolete} because, as this package matures, we do not expect people to use it much anymore. There are more advantages to using the current syntax.
+%
+% \begin{enumerate}
+% \item Only\SPatInfo{\ShowPattern{Henry, VIII}[Tudor]\hfil \textrm{(1--2)}\break \ShowPattern[Henry]{VIII}[Tudor]\hfil \textrm{\ \ \ (3)}} the newer syntax permits variants: \cmd{\Name*\{Henry, VIII\}[Tudor]} \Name*{Henry, VIII}[Tudor]. The new syntax is preferred.
+% \item A proper form for the old syntax is \cmd{\Name*\{Henry\}[VIII]}: \Name*{Henry}[VIII]. Both\vspace{-2ex}\IdxInfo{\ShowIdxPageref*{Henry}[VIII]\hfil \textrm{(1--2)}\break \ShowIdxPageref*[Henry]{VIII}[Tudor]\hfil \textrm{\ \ (3)}}\vspace{2ex} old and new share name patterns (Section~\ref{sec:NamePatterns}).
+% \item \bgroup\IndexInactive\cmd{\Name[Henry]\{VIII\}} is a malformed Western name: ``\Name*[Henry]{VIII}'' and ``\Name[Henry]{VIII}''. Likewise \cmd{\Name[Henry]\{VIII\}[Tudor]}: ``\Name*[Henry]{VIII}[Tudor]'' and ``\Name[Henry]{VIII}[Tudor]''. Both have the incorrect index entry ``\ShowIdxPageref*[Henry]{VIII}''.\egroup
+% \end{enumerate}
+%
% \ReturnLink
+% \vfill
+%
+% \AltFormatActive^^A
+% \begin{verse}
+% 'Tis but thy name that is my enemy;\dots\\
+% What's in a name? That which we call a rose\\
+% By any other name would smell as sweet;\\
+% So Romeo would, were he not Romeo call'd,\\
+% Retain that dear perfection which he owes\\
+% Without that title. Romeo, doff thy name,\\
+% And for that name which is no part of thee\\
+% Take all myself.\\[1ex]\hfill---\Shak, \textit{Romeo and Juliet}, Act II, Scene II
+% \end{verse}
+% \AltFormatInactive^^A
% \newpage
%
% \section{Detailed Usage}
-%
+%
% \subsection{Package Options}
% \label{sec:PkgOptions}
%
% One includes the \textsf{nameauth} package thus:
% \begin{quote}
-% \fbox{\mystrut\ \cmd{\usepackage[}\meta{\(option_1\)}\texttt{,}\meta{\(option_2\)}\texttt{,}\dots\texttt{,}\meta{\(option_n\)}\texttt{]\{nameauth\} }}
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\usepackage[}\meta{\(option_1\)}\texttt{,}\meta{\(option_2\)}\texttt{,}\dots\texttt{,}\meta{\(option_n\)}\texttt{]\{nameauth\}}
+% \end{tabular}
+% }
% \end{quote}
% The options have no required order. Still, we discuss them from the general to the specific, as the headings below indicate. In the listings below, {\bfseries implicit default options are boldface and need not be invoked by the user.} {\color{nared}Non-default options are in red and must be invoked explicitly.}
%
% \begin{center}\bfseries Choosing Features\end{center}
%
-% \noindent{\bfseries Enable Package Warnings}\medskip\\
-% \bgroup\begin{tabular}{p{0.22\textwidth}p{0.6\textwidth}}
-% \leavevmode\color{nared}\quad\texttt{verbose} & \leavevmode\color{nared}Show warnings about index cross-references.\medskip\\
-% \end{tabular}\egroup
-%
-% \noindent The default\Version{3.0} suppresses package warnings from the indexing macros. Warnings from the \texttt{nameauth} environment are not suppressed.\bigskip
-%
-% \noindent{\bfseries Choose Formatting}\medskip\\
+% \noindent{\bfseries Choose Formatting System}\medskip\\
% \bgroup\begin{tabular}{p{0.22\textwidth}p{0.6\textwidth}}
-% \bfseries\quad\texttt{mainmatter} & \bfseries Start with ``main-matter names'' and formatting hooks (see also page~\pageref{page:PostProcess}).\smallskip\\
-% \leavevmode\color{nared}\quad\texttt{frontmatter} & \leavevmode\color{nared}Start with ``front-matter names'' and hooks.\smallskip\\
+% \bfseries\quad\texttt{mainmatter} & \bfseries Start with ``main-matter names'' and formatting hooks \normalfont (see also page~\pageref{page:PostProcess}).\smallskip\\
+% \leavevmode\color{nared}\quad\texttt{frontmatter} & \leavevmode\color{nared}Start with ``front-matter names'' and hooks until \cmd{\NamesActive} starts the main system.\smallskip\\
% \leavevmode\color{nared}\quad\texttt{alwaysformat} & \leavevmode\color{nared}Use only respective ``first use'' formatting hooks.\smallskip\\
-% \leavevmode\color{nared}\quad\texttt{formatAKA} & \leavevmode\color{nared}Format the first use of a name with \cmd{\AKA} like the first use of a name with \cmd{\Name}.\smallskip\\
-% \leavevmode\color{nared}\quad\texttt{oldAKA} & \leavevmode\color{nared}Force \cmd{\AKA*} to act like it did before version 3.0.\smallskip\\
-% \leavevmode\color{nared}\quad\texttt{oldreset} & \leavevmode\color{nared}Reset per-use name flags locally within the naming macros, as before version 3.3.\smallskip\\
-% \leavevmode\color{nared}\quad\texttt{oldpass} & \leavevmode\color{nared}When \cmd{\Justindex} is called, allow long\,/\,short flags to pass through, as before version 3.3.\medskip\\
+% \leavevmode\color{nared}\quad\texttt{formatAKA} & \leavevmode\color{nared}Format the first use of a name with \cmd{\AKA} like the first use of a name with \cmd{\Name}.\medskip\\
% \end{tabular}\egroup
-%
-% \noindent The \texttt{mainmatter} option and the \texttt{frontmatter} option enable two different systems of name use and formatting. They are mutually exclusive. \cmd{\NamesActive} starts the main matter system when \texttt{frontmatter} is used. See Section~\ref{sec:Formatting}.
-%
-% The \texttt{alwaysformat} option forces ``first use'' hooks globally in both naming systems. Its use is limited in current versions of \textsf{nameauth}.
%
-% The\Version{3.1} \texttt{formatAKA} option permits \cmd{\AKA} to use the ``first use'' formatting hooks. This enables \cmd{\ForceName} to trigger those hooks at will (Section~\ref{sec:AKA}). Otherwise \cmd{\AKA} uses ``subsequent use'' hooks.
+% \noindent The \texttt{mainmatter} and \texttt{frontmatter} options enable two respectively independent systems of name use and formatting. See Section~\ref{sec:Formatting}.
%
-% Using the\Version{3.0} \texttt{oldAKA} option forces \cmd{\AKA*} always to print a ``forename'' argument in the text, as in versions before 3.0. Otherwise the current behavior of \cmd{\AKA*} prints in the same fashion as \cmd{\FName} (see Sections~\ref{sec:FName} and~\ref{sec:AKA}).
+% The \texttt{alwaysformat} option forces ``first use'' hooks globally in both naming systems. Its use is limited in current versions of \textsf{nameauth}.
%
-% Used together,\Version{3.3} the next two options restore pre-version 3.3 handling of flags that could lead to undocumented behavior. The \texttt{oldreset} option causes all Boolean flags related to the prefix macros and long\,/\,short name forms to be reset locally. The new default is to reset them globally (Section~\ref{sec:Customize}). Likewise, the \texttt{oldpass} option allows the long\,/\,short flags to pass through \cmd{\JustIndex} instead of being reset (Section~\ref{sec:IndexControl}).
-% \newpage
+% The\Version{3.1} \texttt{formatAKA} option permits \cmd{\AKA} to use the ``first use'' formatting hooks. This enables \cmd{\ForceName} to trigger those hooks at will (Section~\ref{sec:AKA}). Otherwise \cmd{\AKA} only uses ``subsequent use'' formatting hooks.\bigskip
%
-% \noindent{\bfseries Enable\,/\,Disable Indexing}\medskip\\
+% \noindent{\bfseries Enable/Disable Indexing}\medskip\\
% \bgroup\begin{tabular}{p{0.22\textwidth}p{0.6\textwidth}}
% \quad\bfseries\texttt{index} & \bfseries Create index entries in place with names.\smallskip\\
% \leavevmode\color{nared}\quad\texttt{noindex} & \leavevmode\color{nared}Suppress indexing of names.\medskip\\
% \end{tabular}\egroup
-%
-% \noindent These options and related macros do not affect the normal use of \cmd{\index}. They apply only to the \textsf{nameauth} package macros. The default \texttt{index} option enables name indexing right away. The \texttt{noindex} option disables the indexing of names until \cmd{\IndexActive} enables it. \emph{Caution:}\Warn{} using \texttt{noindex} and \cmd{\IndexInactive} prevents index tags until you call \cmd{\IndexActive}, as explained also in Section~\ref{sec:IndexControl}.\bigskip
%
-% \noindent{\bfseries Enable\,/\,Disable Index Sorting}\medskip\\
+% \noindent These options and related macros apply only to the \textsf{nameauth} package macros. The default \texttt{index} option enables name indexing right away. The \texttt{noindex} option disables the indexing of names until \cmd{\IndexActive} enables it. \emph{Caution:}\Warn{} using \texttt{noindex} and \cmd{\IndexInactive} prevents index tags until you call \cmd{\IndexActive}, as explained also in Section~\ref{sec:GeneralIndex}. For indexing feature priority, see page~\pageref{page:Priorities}.\bigskip
+%
+% \noindent{\bfseries Enable/Disable Index Sorting}\medskip\\
% \bgroup\begin{tabular}{p{0.22\textwidth}p{0.6\textwidth}}
% \quad\bfseries\texttt{pretag} & \bfseries Create sort keys used with \texttt{makeindex}.\smallskip\\
% \leavevmode\color{nared}\quad\texttt{nopretag} & \leavevmode\color{nared}Do not create sort keys.\medskip\\
% \end{tabular}\egroup
-%
-% \noindent The default allows \cmd{\PretagName} to create sort keys used with \texttt{makeindex}. The \texttt{nopretag} option disables the sorting mechanism, e.g., if a different sorting method is used with \texttt{xindy}. See Section~\ref{sec:IndexSort}.
+%
+% \noindent The default allows \cmd{\PretagName} to create sort keys used with \texttt{makeindex}. The \texttt{nopretag} option disables the sorting mechanism and causes \cmd{\PretagName} only to emit warnings. That is designed for cases that use different sorting methods, such as \texttt{xindy}. See Section~\ref{sec:IndexSort}.\newpage
+%
+% \noindent{\bfseries Enable ``Global'' Decision Paths}\medskip\\
+% \bgroup\begin{tabular}{p{0.22\textwidth}p{0.6\textwidth}}
+% \leavevmode\color{nared}\quad\texttt{globaltest} & \leavevmode\color{nared}Do not put name decision paths in a local scope.\medskip\\
+% \end{tabular}\egroup
+%
+% \noindent The default puts the decision paths of \cmd{\IfMainName}, etc., into groups with local scope (Section~\ref{sec:NameTests}). This option removes that scoping.\bigskip
+%
+% \noindent{\bfseries Enable Package Warnings}\medskip\\
+% \bgroup\begin{tabular}{p{0.22\textwidth}p{0.6\textwidth}}
+% \leavevmode\color{nared}\quad\texttt{verbose} & \leavevmode\color{nared}Show more diagnostic warnings.\medskip\\
+% \end{tabular}\egroup
+%
+% \noindent The default suppresses all but the most essential package warnings. Increasing the warnings may help to debug index page entries, cross-references, and exclusions.\bigskip
+%
+% \noindent{\bfseries Choose Version Compatibility}\medskip\\
+% \textbf{Using these options will increase the chance of undocumented behavior.} They are included only for the sake of backward compatibility.\medskip\\
+% \bgroup\begin{tabular}{p{0.22\textwidth}p{0.6\textwidth}}
+% \leavevmode\color{nared}\quad\texttt{oldAKA} & \leavevmode\color{nared}Force \cmd{\AKA*} to act like it did before version 3.0, instead of like \cmd{\FName}.\smallskip\\
+% \leavevmode\color{nared}\quad\texttt{oldreset} & \leavevmode\color{nared}Reset per-use name flags locally; let \cmd{\ForgetThis} and \cmd{\SubvertThis} pass through \cmd{\AKA} (pre-v3.3). Let \cmd{\SeeAlso} pass through \cmd{\IndexName} and other macros. Keep \cmd{\IndexName} and \cmd{\IndexRef} from resetting \cmd{\SkipIndex} (pre-version 3.5).\smallskip\\
+% \leavevmode\color{nared}\quad\texttt{oldpass} & \leavevmode\color{nared}When \cmd{\Justindex} is called, allow long/short flags to pass through, as before version 3.3.\smallskip\\
+% \leavevmode\color{nared}\quad\texttt{oldtoks} & \leavevmode\color{nared}Token registers holding the arguments of the last-used name are set locally, as before version 3.5.\smallskip\\
+% \leavevmode\color{nared}\quad\texttt{oldsee} & \leavevmode\color{nared}Allow lax handling of \textit{see} references that are extant names, as before version 3.5.\medskip\\
+% \end{tabular}\egroup
+%
+% \noindent Previously, local scope for Boolean flags related to the prefix macros and long/short name forms could produce unexpected results, but that could hide the problems with some flags not being reset by \cmd{\AKA}, \cmd{\AKA*}, and the use of \cmd{\JustIndex}. Global name token registers are preferable, as is the newer, stricter control over \textit{see} references related to index page entries.
+%
+% \begin{center}
+% \begin{tabular}{rr}\toprule
+% \textsf{nameauth} version & compatibility options to approximate:\\\midrule
+% \rowcolor{grey}2.6 & \texttt{oldAKA,oldpass,oldreset,oldtoks,oldsee}\\
+% 3.0--3.2 & \texttt{oldpass,oldreset,oldtoks,oldsee}\\
+% \rowcolor{grey}3.3--3.4 & \texttt{oldreset,oldtoks,oldsee}\\\bottomrule
+% \end{tabular}
+% \end{center}\leavevmode
%
% \begin{center}\bfseries Affect the Syntax of Names\end{center}
%
-% \noindent{\bfseries Show\,/\,Hide Affix Commas}\medskip\\
+% \noindent{\bfseries Show/Hide Affix Commas}\medskip\\
% \bgroup\begin{tabular}{p{0.22\textwidth}p{0.6\textwidth}}
% \quad\bfseries\texttt{nocomma} & \bfseries Suppress commas between surnames and affixes, following the \textit{Chicago Manual of Style} and other conventions.\smallskip\\
% \leavevmode\color{nared}\quad\texttt{comma} & \leavevmode\color{nared}Retain commas between surnames and affixes.\medskip\\
% \end{tabular}\egroup
-%
-% \noindent If you use \emph{modern standards}, choose the default \texttt{nocomma} option to get, e.g., \Name[J.E.]{Carter, Jr.}[James Earl]. If you need to adopt \emph{older standards} that use commas between surnames and affixes, you have two choices:
+%
+% \noindent These options do not affect the index. On comma macro priority, see page~\pageref{page:Priorities}. If you use \emph{modern standards}, choose the default \texttt{nocomma} option to get, e.g., \Name[J.E.]{Carter, Jr.}[James Earl]. If you need to adopt \emph{older standards} that use commas between surnames and affixes, you have two choices:
% \begin{enumerate}
% \item The \texttt{comma} option globally produces, e.g., \ShowComma\Name*[J.E.]{Carter, Jr.}[James Earl].
% \item Section~\ref{sec:Affix} shows how one can use \cmd{\ShowComma} with the \texttt{nocomma} option and \cmd{\NoComma} with the \texttt{comma} option to get per-name results.
-% \end{enumerate}
-% In both cases, the display of commas (or the lack thereof) does not affect the appearance or the sorting of index entries.\bigskip
+% \end{enumerate}\medskip
%
% \noindent{\bfseries Capitalize Entire Surnames}\medskip\\
% \bgroup\begin{tabular}{p{0.22\textwidth}p{0.6\textwidth}}
% \quad\bfseries\texttt{normalcaps} & \bfseries Do not perform any special capitalization.\smallskip\\
-% \leavevmode\color{nared}\quad\texttt{allcaps} & \leavevmode\color{nared}Capitalize entire surnames, e.g., romanized Eastern names.\medskip\\
+% \leavevmode\color{nared}\quad\texttt{allcaps} & \leavevmode\color{nared}Capitalize entire surnames, e.g., romanized Eastern names, throughout the document.\medskip\\
% \end{tabular}\egroup
-%
-% \noindent This only capitalizes names printed in the body text. English standards usually do not propagate typographic changes into the index.
%
-% Still, you can use this package with non-English conventions (just not via these options). You can add, e.g., uppercase or small caps in surnames, formatting them also in the index. See also Sections~\ref{sec:AltFormat} and~\ref{sec:Hooksiii}. The simplified interface aids the embedding of control sequences in names. Section~\ref{sec:Eastern} deals with capitalization on a section-level and per-name basis.
-% \newpage
+% \noindent These options do not affect the index. See Section~\ref{sec:Eastern} for finer control. To capitalize names in the index, use all caps or alternate formatting (Section~\ref{sec:AltFormat}). On capitalization feature priority, see page~\pageref{page:Priorities}.\bigskip
%
% \noindent{\bfseries Reverse Name Order}\medskip\\
% \bgroup\begin{tabular}{p{0.22\textwidth}p{0.6\textwidth}}
@@ -1678,16 +1742,13 @@ the README.txt or README for more information.
% \leavevmode\color{nared}\quad\texttt{allreversed} & \leavevmode\color{nared}Print all name forms in ``smart'' reverse order.\smallskip\\
% \leavevmode\color{nared}\quad\texttt{allrevcomma} & \leavevmode\color{nared}Print all names in ``Surname, Forenames'' order, meant for Western names.\medskip\\
% \end{tabular}\egroup
-%
-% \noindent These three options are mutually exclusive. Section~\ref{sec:Eastern} speaks more about reversing. The \texttt{allreversed} option, \cmd{\ReverseActive}, and \cmd{\RevName} work with all names and override \texttt{allrevcomma} and its macros.
%
-% So-called ``last-comma-first'' lists of names via \texttt{allrevcomma} and the reversing macros \cmd{\ReverseCommaActive} and \cmd{\RevComma} (Section~\ref{sec:LastFirst}) are \emph{not} the same as the \texttt{comma} option. They only affect Western names.
+% \noindent These options do not affect the index and are mutually exclusive. See also Sections~\ref{sec:LastFirst} and~\ref{sec:Eastern}. Regarding which of these features overrides the other, see page~\pageref{page:Priorities}. So-called ``last-comma-first'' lists of names via \texttt{allrevcomma} and the reversing macros \cmd{\ReverseCommaActive} and \cmd{\RevComma} (Section~\ref{sec:LastFirst}) are \emph{not} the same as the \texttt{comma} option. They only affect Western names.
%
+% \begin{center}\bfseries Typographic Post-Processing\end{center}
% \phantomsection
% \label{page:PostProcess}
%
-% \begin{center}\bfseries Typographic Post-Processing\end{center}
-%
% \noindent{\bfseries Formatting Attributes}\medskip\\
% \bgroup\begin{tabular}{p{0.22\textwidth}p{0.6\textwidth}}
% \quad\bfseries\texttt{noformat} & \bfseries Do not define a default format.\smallskip\\
@@ -1695,12 +1756,13 @@ the README.txt or README for more information.
% \leavevmode\color{nared}\quad\texttt{italic} & \leavevmode\color{nared}First use of a main-matter name in italic.\smallskip\\
% \leavevmode\color{nared}\quad\texttt{boldface} & \leavevmode\color{nared}First use of a main-matter name in boldface.\medskip\\
% \end{tabular}\egroup
-%
-% \noindent Current\Version{2.5} versions assign no default formatting to names. Most users have preferred the \texttt{noformat} option as the default and then design their own hooks as needed.\footnote{For those that want the old default option from the early days of this package, one can recover that behavior with the \texttt{smallcaps} option.}
-% The options above are ``quick'' solutions based on English typography.
%
-% What\Version{2.4} was ``typographic formatting'' has become a generalized concept of ``post-processing'' via hook macros.\footnote{This package was designed with type hierarchies and flexibility in mind. See Robert Bringhurst, \textit{The Elements of Typographic Style}, version 3.2 (Point Roberts, Washington: Hartley \& Marks, 2008), 53--60. Typographic inspiration comes from Bernhard Lohse, \textit{Luthers Theologie} (G\"ottingen: Vandenhoeck \& Ruprecht, 1995) and Jaroslav J. Pelikan Jr., \textit{The Christian Tradition: A History of the Development of Doctrine}, 5 vols. (Chicago: Chicago UP, 1971--89).}
-% Post-processing does not affect the index. Sections \ref{sec:Formatting}, \ref{sec:Hooksi}, \ref{sec:Hooksii}, and~\ref{sec:Hooksiii} explain these hooks in greater detail:
+% \noindent The options above are ``quick'' definitions of \cmd{\NamesFormat} based on English typography.\footnote{For the old default, use the \texttt{smallcaps} option. See also Robert Bringhurst, \textit{The Elements of Typographic Style}, version 3.2 (Point Roberts, Washington: Hartley \& Marks, 2008), 53--60.}
+% The default is no formatting, the overwhelming user preference.
+%
+% The following macros are formatting hooks that do ``typographic post-processing'' of names in the text. Originally, \cmd{\NamesFormat} was the only such hook, which resulted in the organic development of the names of these macros. This development reflects the use of two naming systems, one for main-matter text (default) and one for front-matter text.
+%
+% Unlike alternate formatting, the hooks do not affect the index. Sections \ref{sec:Formatting}, \ref{sec:Hooksi}, \ref{sec:Hooksii}, and~\ref{sec:Hooksiii} explain these hooks and their redefinition in greater detail. Changes to the formatting hooks apply within the scope where they are made:
% \begin{itemize}
% \item \cmd{\NamesFormat} formats first uses of main-matter names.
% \item \cmd{\MainNameHook} formats subsequent uses of main-matter names.
@@ -1708,29 +1770,24 @@ the README.txt or README for more information.
% \item \cmd{\FrontNameHook} formats subsequent uses of front-matter names.
% \end{itemize}
%
-% Changes\Info{\cmd{\global}} to the formatting hooks apply within the scope where they are made. Use \cmd{\global} explicitly to alter that. \cmd{\NamesFormat} originally was the only hook, so any oddity in the naming of these hooks results from the need for backward compatibility with old versions.
-%
-% Section~\ref{sec:AKA} discusses how \cmd{\AKA} does not respect these formatting systems and uses the hooks differently. To avoid using the \texttt{formatAKA} option and \cmd{\ForceName} with \cmd{\AKA}, Section~\ref{sec:IndexXref} shows how to use \cmd{\IndexRef} and \cmd{\Name} instead.
-% \newpage
-%
+% Section~\ref{sec:AKA} discusses how \cmd{\AKA} does not respect these formatting systems and uses the hooks differently. To avoid using the \texttt{formatAKA} option and \cmd{\ForceName} with \cmd{\AKA}, Section~\ref{sec:GeneralIndex} shows how to use \cmd{\IndexRef} and \cmd{\Name} instead.
+%
% \begin{center}\bfseries Alternate or Continental Formatting\end{center}
%
% \noindent{\bfseries Alternate Formatting}\medskip\\
% \bgroup\begin{tabular}{p{0.22\textwidth}p{0.6\textwidth}}
% \leavevmode\color{nared}\quad\texttt{altformat} & \leavevmode\color{nared}Make available the alternate formatting framework from the start of the document. Activate formatting by default.\medskip\\
% \end{tabular}\egroup
-%
+%
% \noindent A built-in\Version{3.1} framework provides an alternate formatting mechanism that can be used for ``Continental'' formatting that one sees in German, French, and so on. Continental standards often format surnames only, both in the text and in the index. Section~\ref{sec:AltFormat} introduces the topic and should be sufficient for most users, while Section~\ref{sec:Hooksiii} goes into greater detail.
%
-% The previous methods that produced Continental formatting were rather complex compared to the current, simplified manner of doing so. Yet it is likely that these older solutions still ought to work. The error protection that prevents \cmd{\CapThis} from breaking alternately formatted names remains available to these older solutions by using \texttt{altformat} or the related macros (Section~\ref{sec:AltFormat}).\bigskip
+% Previous methods that produced Continental formatting were more complex than the current ones. Yet these older solutions still should work, as long as one uses the \texttt{altformat} option and related macros.
%
+% \begin{center}\bfseries Feature Priority\end{center}
% \phantomsection
% \label{page:Priorities}
-% \begin{center}\bfseries Feature Priority\end{center}
%
-% \noindent The following table shows the relative priority of package options and macros related to indexing, capitalization, and reversing. The darker the row, the lower the priority. Those macros or options in a particular category (column) that have higher priority (row) tend to override similar macros that have lower priority in that same category.
-%
-% Thus, \cmd{\IndexInactive} overrides \cmd{\JustIndex}, which overrides \cmd{\SkipIndex}; using \cmd{\SeeAlso} depends entirely on the interaction of the three others.
+% \noindent Below we see the relative priority of package options and macros, with darker rows showing lower priority. Within a column, high priority can override low priority. Thus, \cmd{\IndexInactive} overrides \cmd{\JustIndex}, which overrides \cmd{\SkipIndex}.
%
% \begin{center}\small\MyStretch
% \begin{tabular}{llll}\toprule
@@ -1740,13 +1797,13 @@ the README.txt or README for more information.
% \texttt{noindex} & \texttt{allcaps} & \texttt{allreversed} & \cmd{\DropAffix}\\
% \cmd{\IndexActive} & \cmd{\AllCapsInactive} & \cmd{\ReverseActive} \\
% \cmd{\IndexInactive} & \cmd{\AllCapsActive} & \cmd{\ReverseInactive} \\
-% \rowcolor{black!7!white}\cmd{\JustIndex} & \cmd{\CapName} & \cmd{\RevName} & \cmd{\SubvertThis}\\
-% \rowcolor{black!7!white} & & & \cmd{\ForceName}\\
-% \rowcolor{black!7!white} & & & \cmd{\NoComma}\\
+% \rowcolor{black!6!white}\cmd{\JustIndex} & \cmd{\CapName} & \cmd{\RevName} & \cmd{\SubvertThis}\\
+% \rowcolor{black!6!white} & & & \cmd{\ForceName}\\
+% \rowcolor{black!6!white} & & & \cmd{\NoComma}\\
% \rowcolor{black!12!white}\cmd{\SkipIndex} & \cmd{\AccentCapThis} & \texttt{allrevcomma} & \cmd{\KeepName}\\
% \rowcolor{black!12!white} & & \cmd{\RevCommaActive} & \cmd{\ForceFN}\\
% \rowcolor{black!12!white} & & \cmd{\RevCommaInactive} & \cmd{\ShowComma}\\
-% \rowcolor{black!17!white}\cmd{\SeeAlso} & \cmd{\CapThis} & \cmd{\RevComma} & \cmd{\KeepAffix}\\\bottomrule
+% \rowcolor{black!18!white}\cmd{\SeeAlso} & \cmd{\CapThis} & \cmd{\RevComma} & \cmd{\KeepAffix}\\\bottomrule
% \end{tabular}
% \end{center}
%
@@ -1755,7 +1812,7 @@ the README.txt or README for more information.
%
% \subsection{Naming Macros}
%
-% In this manual we modify the formatting hooks to show first and later name uses, forcing such uses as needed (Sections~\ref{sec:Formatting} and~\ref{sec:NameControl}). All naming macros create index entries before and after a name for when a name straddles a page break.
+% In this\Illus{} manual we modify the formatting hooks to show first and later name uses, forcing such uses as needed (Sections~\ref{sec:Formatting}--\ref{sec:NameControl}). All naming macros create index entries before and after a name for when a name straddles a page break.
%
% \subsubsection{\texttt{\textbackslash Name} and \texttt{\textbackslash Name*}}
% \label{sec:Naming}
@@ -1765,12 +1822,15 @@ the README.txt or README for more information.
% \DescribeMacro{\Name*}
% then usually just the \meta{SNN} argument thereafter. \cmd{\Name*} always prints the full name:
% \begin{quote}
-% \fbox{\vbox{\hbox{\mystrut\ \cmd{\Name}| |\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }\par
-% \hbox{\mystrut\ \cmd{\Name}|*|\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }}}
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\Name\ }\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\vspace{-2pt}\\
+% {\Large\strut}\cmd{\Name*}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\\
+% \end{tabular}
+% }
% \end{quote}
%
-% In\Version{3.0} the body text, not the index, the \meta{Alternate} argument replaces either \meta{FNN} or, if \meta{FNN} is absent, \meta{Affix}.\footnote{If \meta{Alternate} is \cmd{\ignorespaces}, the Western long form of \cmd{\Name} looks like the short form. ``Native'' Eastern and ancient forms would have an extra trailing space.}
-% If both \meta{FNN} and \meta{Affix} are absent, then the obsolete syntax is used (Section~\ref{sec:Obsolete}).
+% In the body text, not the index, the \meta{Alternate} argument replaces either \meta{FNN} or, if \meta{FNN} is absent, \meta{Affix}. If both \meta{FNN} and \meta{Affix} are absent when \meta{Alternate} is present, then the obsolete syntax is used (Section~\ref{sec:Obsolete}).
%
% \begin{quote}\small
% \StartNum
@@ -1783,28 +1843,37 @@ the README.txt or README for more information.
% \< Eliz & & Elizabeth, I & >
%\end{nameauth}\end{verbatim}
% \end{quote}
-%
-% \begin{center}\small\MyStretch
+%
+% \leavevmode\SPatInfo{\ShowPattern[Albert]{Einstein}\break \ShowPattern[M.T.]{Cicero}\break \ShowPattern{Confucius}\break \ShowPattern{Miyazaki, Hayao}\break \ShowPattern{Elizabeth, I}}\vspace{-4.25ex}
+%
+% \begin{center}\small\MyStretch\leavevmode\vspace{-26ex}\IdxInfo{\ShowIdxPageref*[Albert]{Einstein}\break \ShowIdxPageref*[M.T.]{Cicero}\break \ShowIdxPageref*{Confucius}\break \ShowIdxPageref*{Miyazaki, Hayao}\break \ShowIdxPageref*{Elizabeth, I}}\vspace{26ex}
% \begin{tabular}{ll}\toprule
% |\Name [Albert]{Einstein}| or |\Einstein| & \Name [Albert]{Einstein}\\
% |\Name*[Albert]{Einstein}| or |\LEinstein| & \LEinstein\\
% |\Name [Albert]{Einstein}| or |\Einstein| & \Einstein\\
-% \rowcolor{black!7!white}|\Name [M.T.]{Cicero}| or |\Cicero| & \Name [M.T.]{Cicero}\\
-% \rowcolor{black!7!white}|\Name*[M.T.]{Cicero}[Marcus Tullius]| & \Name*[M.T.]{Cicero}[Marcus Tullius]\\
-% \rowcolor{black!7!white}|\Name [M.T.]{Cicero}| or |\Cicero| & \Cicero\\
+% \rowcolor{grey}|\Name [M.T.]{Cicero}| or |\Cicero| & \Name [M.T.]{Cicero}\\
+% \rowcolor{grey}|\Name*[M.T.]{Cicero}[Marcus Tullius]| & \Name*[M.T.]{Cicero}[Marcus Tullius]\\
+% \rowcolor{grey}|\Name [M.T.]{Cicero}| or |\Cicero| & \Cicero\\
% |\Name {Confucius}|, |\Confucius| & \Confucius\\
% \footnotesize Same for all variants; no \meta{Affix} or \meta{Alternate}. & \Confucius\\
-% \rowcolor{black!7!white}|\Name {Miyazaki, Hayao}| or |\Miyaz| & \ForgetThis\Name {Miyazaki, Hayao}\\
-% \rowcolor{black!7!white}|\Name*{Miyazaki, Hayao}[Sensei]| & \Name*{Miyazaki, Hayao}[Sensei]\\
-% \rowcolor{black!7!white}|\Name {Miyazaki, Hayao}| or |\Miyaz| & \Name {Miyazaki, Hayao}\\
+% \rowcolor{grey}|\Name {Miyazaki, Hayao}| or |\Miyaz| & \ForgetThis\Name {Miyazaki, Hayao}\\
+% \rowcolor{grey}|\Name*{Miyazaki, Hayao}[Sensei]| & \Name*{Miyazaki, Hayao}[Sensei]\\
+% \rowcolor{grey}|\Name {Miyazaki, Hayao}| or |\Miyaz| & \Name {Miyazaki, Hayao}\\
% |\Name {Elizabeth, I}| or |\Eliz| & \ForgetThis\Eliz\\
% |\Name*{Elizabeth, I}| or |\LEliz| & \Name*{Elizabeth, I}\\
% |\Name {Elizabeth, I}| or |\Eliz| & \Name {Elizabeth, I}\\\bottomrule
% \end{tabular}
% \end{center}
%
-% When using the simplified interface, the preferred way to get alternate names is |\LCicero[Marcus Tullius]| and |\LMiyaz[Sensei]|: \LCicero[Marcus Tullius] and \LMiyaz[Sensei]. The alternate forename is not shown in subsequent short name references e.g., |\Cicero[Marcus Tullius]| \Cicero[Marcus Tullius].
-%
+% When using the quick interface, the preferred way to get alternate names is |\LCicero[Marcus Tullius]| and |\LMiyaz[Sensei]|: \LCicero[Marcus Tullius] and \LMiyaz[Sensei]. The alternate forename is not shown in subsequent short name references e.g., |\Cicero[Marcus Tullius]| \Cicero[Marcus Tullius]. Remember the following:
+% \begin{center}\small
+% \begin{tabular}{rll}\toprule
+% \rowcolor{grey}No: & \cmd{\LEinstein}\texttt{\ \ \ [said]\dots} & \LEinstein [said]\dots\\
+% \rowcolor{grey}No: & \cmd{\Einstein}\texttt{\ \ \ \ [said]\dots} & \Einstein [said]\dots\\
+% Yes: & \cmd{\LEinstein}\texttt{\{\} [said]\dots} & \LEinstein{} [said]\dots\\
+% Yes: & \cmd{\Einstein}\texttt{\{\}\ \ [said]\dots} & \Einstein{} [said]\dots\\\bottomrule
+% \end{tabular}
+% \end{center}
% \newpage
%
% \subsubsection{Forenames: \texttt{\textbackslash FName}}
@@ -1815,50 +1884,62 @@ the README.txt or README for more information.
% \DescribeMacro{\FName*}
% These synonyms let one add an \texttt{F} either to \cmd{\Name} or \cmd{\Name*} to get the same effect:
% \begin{quote}
-% \fbox{\vbox{\hbox{\mystrut\ \cmd{\FName\ }\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }\par
-% \hbox{\mystrut\ \cmd{\FName*}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }}}
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\FName\ }\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\vspace{-2pt}\\
+% {\Large\strut}\cmd{\FName*}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\\
+% \end{tabular}
+% }
% \end{quote}
%
% \DescribeMacro{\ForceFN}
-% These macros work with both Eastern and Western names, but to get an Eastern personal name, one must precede these macros with \cmd{\ForceFN}.
-% See\Version{3.0} also Sections~\ref{sec:NameParticles} and~\ref{sec:NameControl} on how to vary some of the forms below:
+% These macros work with both Eastern and Western names, but to get an Eastern personal name, one must precede these macros with \cmd{\ForceFN}.\Version{3.0} This was designed to discourage one from being too familiar and causing offense.
+% See also Sections~\ref{sec:NameParticles} and~\ref{sec:NameControl} on how to vary some of the forms below:
%
+% \vspace{1.5ex}\leavevmode\SPatInfo{\ShowPattern[Albert]{Einstein}\break \ShowPattern[M.T.]{Cicero}\break \ShowPattern{Confucius}\break \ShowPattern{Miyazaki, Hayao}\break \ShowPattern{Elizabeth, I}}\vspace{-4ex}
% \begin{center}\small\MyStretch
% \begin{tabular}{ll}\toprule
% |\FName[Albert]{Einstein}| or |\SEinstein| & \SEinstein\\
-% \rowcolor{black!7!white}|\FName[M.T.]{Cicero}[Marcus Tullius]| & \\
-% \rowcolor{black!7!white}or |\SCicero[Marcus Tullius]| & \SCicero[Marcus Tullius]\\
+% \rowcolor{grey}|\FName[M.T.]{Cicero}[Marcus Tullius]| & \\
+% \rowcolor{grey}or |\SCicero[Marcus Tullius]| & \SCicero[Marcus Tullius]\\
% |\FName{Confucius}| or |\SConfucius |& \FName{Confucius}\\
-% \rowcolor{black!7!white}|\FName{Miyazaki, Hayao}| or |\SMiyaz| & \FName{Miyazaki, Hayao}\\
+% \rowcolor{grey}|\FName{Miyazaki, Hayao}| or |\SMiyaz| & \FName{Miyazaki, Hayao}\\
% |\ForceFN\FName{Miyazaki, Hayao}| & \\
% or |\ForceFN\SMiyaz| & \ForceFN\FName{Miyazaki, Hayao} \\
-% \rowcolor{black!7!white}|\ForceFN\FName{Miyazaki, Hayao}[Sensei]| & \\
-% \rowcolor{black!7!white}or |\ForceFN\SMiyaz[Sensei]| & \ForceFN\FName{Miyazaki, Hayao}[Sensei]\\
+% \rowcolor{grey}|\ForceFN\FName{Miyazaki, Hayao}[Sensei]| & \\
+% \rowcolor{grey}or |\ForceFN\SMiyaz[Sensei]| & \ForceFN\FName{Miyazaki, Hayao}[Sensei]\\
% |\FName{Elizabeth, I}| or |\SEliz| & \SEliz\\
-% \rowcolor{black!7!white}|\ForceFN\SEliz[Good Queen Bess]| & \ForceFN\SEliz[Good Queen Bess]\\\bottomrule
+% \rowcolor{grey}|\ForceFN\SEliz[Good Queen Bess]| & \ForceFN\SEliz[Good Queen Bess]\\\bottomrule
% \end{tabular}
% \end{center}
%
-% The \meta{Alternate} argument replaces forenames in the text, which strongly shapes the use of \cmd{\FName}.\footnote{If \meta{Alternate} is \cmd{\ignorespaces}, the Western long form of \cmd{\FName} looks like the short form of \cmd{\Name}, while the Western short form of \cmd{\FName} acts like \cmd{\leavevmode} and prints nothing. ``Native'' Eastern and ancient forms would have an extra trailing space.}
-% We recap what we saw on page~\pageref{page:ArgIV}, emphasizing forenames:
+% The \meta{Alternate} argument replaces forenames in the text, which strongly shapes the use of \cmd{\FName}. We apply page~\pageref{page:ArgIV} to forenames:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
%\begin{nameauth}
% \< Lewis & Clive Staples & Lewis & >
% \< CSL & Clive Staples & Lewis & C.S. >
-% \< Ches & Chesley B. & Sullenberger, III & >
-% \< Sully & Chesley B. & Sullenberger, III & Sully >
% \< Miyaz & & Miyazaki, Hayao & >
% \< MSens & & Miyazaki, Hayao & Sensei >
%\end{nameauth}\end{verbatim}
% \end{quote}
%
-% These share name patterns: \cmd{\SCSL} \SCSL, \cmd{\SLewis} \SLewis; \cmd{\SChes} \SChes, \cmd{\SSully} \SSully; \cmd{\SMiyaz} \SMiyaz, \cmd{\SMSens} \SMSens.
-%
-% Equivalents: \cmd{\SCSL} \SCSL, \cmd{\SLewis[C.S.]} \SLewis[C.S.]; \cmd{\SSully} \SSully, \cmd{\SChes[Sully]} \SChes[Sully]; |\ForceFN\SMSens| \ForceFN\SMSens, |\ForceFN\SMiyaz[Sensei]|: \ForceFN\SMiyaz[Sensei].
-%
-% These\Warn{} fail: \cmd{\SCSL[Jack]}: \SCSL[Jack]; \cmd{\SSully[Chesley]}: \SSully[Chesley]; and |\ForceFN\SMSens[Hayao]|: \ForceFN\SMSens[Hayao]. Whenever \meta{arg4} of the \texttt{nameauth} environment is used, the respective shorthands cannot take optional arguments.
+% \begin{itemize}
+% \item They\SPatInfo{\ShowPattern[Clive Staples]{Lewis}\break \ShowPattern{Miyazaki, Hayao}} share name control patterns (Section~\ref{sec:NamePatterns}). Therefore, they have the same ``first-use'' and ``later-use'' conditions.
+% \item Usually, one adds alternate names to shorthands with an empty \meta{arg4}:\\[1ex]
+% \vspace{-11ex}\IdxInfo{\ShowIdxPageref*[Clive Staples]{Lewis}\break \ShowIdxPageref*{Miyazaki, Hayao}}\vspace{11ex}\leavevmode
+% \begin{tabular}{l@{\ }ll@{\ }l}\toprule
+% \cmd{\SLewis[C.S.]} & \SLewis[C.S.] & \cmd{\SCSL} & \SCSL\\
+% \rowcolor{grey}\cmd{\SMiyaz[Sensei]} & \SMiyaz[Sensei] & \cmd{\SMSens} & \SMSens\\
+% \cmd{\ForceFN}\cmd{\SMiyaz[Sensei]} & \ForceFN\SMiyaz[Sensei] & \cmd{\ForceFN}\cmd{\SMSens} & \ForceFN\SMSens\\\bottomrule
+% \end{tabular}
+% \item Trying to add ``alternate names'' to shorthands that use \meta{arg4} fails:\\[1ex]
+% \begin{tabular}{l@{\ }l}\toprule
+% \rowcolor{grey}\cmd{\SCSL[Jack]} & \SCSL[Jack]\\
+% \cmd{\ForceFN}\cmd{\SMSens[Sensei]} & \ForceFN\SMSens[Sensei]\\\bottomrule
+% \end{tabular}
+% \end{itemize}
%
% \ReturnLink
% \newpage
@@ -1866,9 +1947,9 @@ the README.txt or README for more information.
% \subsubsection{Variant Names}
% \label{sec:VarNames}
%
-% This\Version{3.1} section explains how to manage more complicated variants, which gives one the skills needed to implement a name authority. We draw from Sections~\ref{sec:Formatting}, \ref{sec:IndexXref}, \ref{sec:IndexSort}, \ref{sec:NameControl}, and \ref{sec:AKA}. One might want to consult those sections also.
-%
-% We\Info{variant forenames} begin with the easier kind of variant names, namely, variant forenames indexed under a canonical name entry:
+% This\Version{3.1} section explains how to manage more complicated variants, which gives one the skills needed to implement a name authority. We draw from Sections~\ref{sec:GeneralIndex}, \ref{sec:IndexSort}, \ref{sec:Formatting}, and \ref{sec:NameControl}. One might want to consult those sections also.\medskip
+%
+% We\Info{Variant forenames} begin with the easier kind of variant names, namely, variant forenames indexed under a canonical name entry:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -1876,15 +1957,20 @@ the README.txt or README for more information.
% \< Tyson & Mike & Tyson & >
% \< Iron & Mike & Tyson & Iron Mike >
%\end{nameauth}\end{verbatim}
+% \end{quote}
+%
+% Below,\SPatInfo{\ShowPattern[Mike]{Tyson}} all variants have the same pattern and index entry because they are based on the same name form:
%
-% \begin{tabular}{@{}lrlrl}
-% Same pattern: & \cmd{\Iron} & \Iron & \cmd{\LTyson} & \LTyson\\
-% & \cmd{\SIron} & \SIron & \cmd{\STyson} & \STyson\\
+% \begin{quote}\small\leavevmode\vspace{-8ex}\IdxInfo{\ShowIdxPageref*[Mike]{Tyson}}\vspace{8ex}
+% \begin{tabular}{rlrl}
+% \cmd{\Iron} & \Iron & \cmd{\LTyson[Iron Mike]} & \LTyson[Iron Mike]\\
+% \cmd{\LIron} & \LIron & \cmd{\LTyson} & \LTyson\\
+% \cmd{\SIron} & \SIron & \cmd{\STyson} & \STyson\\
% \end{tabular}
% \end{quote}
-% Since \LIron\ is indexed as ``\ShowIdxPageref*[Mike]{Tyson}'' throughout the document, we can use |\IndexRef{Iron Mike}{Tyson, Mike}| with no output in the text or |\AKA[Mike]{Tyson}{Iron Mike}| \AKA[Mike]{Tyson}{Iron Mike} to print a name. Both create the cross-reference ``Iron Mike \textit{see} Tyson, Mike'' in the index.
+% Since \LIron\ is indexed as ``\ShowIdxPageref*[Mike]{Tyson}'' throughout the document, we can use \cmd{\IndexRef\{Iron Mike\}\{Tyson, Mike\}}\IndexRef{Iron Mike}{Tyson, Mike}, which produces no output in the text. Thus we get ``Iron Mike \textit{see} Tyson, Mike'' as a cross-reference in the index.\medskip
%
-% Variant\Info{variant surnames} family names are more complicated than variant personal names. For surname variants, one can use the following method to get fairly good results, depending on the trade-offs that one wishes to accept:
+% Variant\Info{Variant surnames} family names are more complicated. The following method avoids using macros in name arguments (cf. Page~\pageref{page:Romani}) to get decent results:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -1892,27 +1978,28 @@ the README.txt or README for more information.
% \< DuBois & W.E.B. & Du~Bois & >
% \< AltDuBois & W.E.B. & DuBois & >
%\end{nameauth}
-%\PretagName[W.E.B.]{Du~Bois}{Dubois, W.E.B.}\end{verbatim}
+%\PretagName[W.E.B.]{Du~Bois}{Dubois, William}%
+%\PretagName[W.E.B.]{DuBois}{Dubois, William}\end{verbatim}
% \end{quote}
-% \begin{enumerate}
-% \item We decide the canonical name form: \cmd{\DuBois} \ForgetThis\DuBois.
-% \item Both\Warn{} \cmd{\Name[W.E.B.]\{Du Bois\}} and \cmd{\Name[W.E.B.]\{DuBois\}} have the pattern ``\texttt{\ShowPattern[W.E.B.]{Du Bois}}'' (Section~\ref{sec:NamePatterns}). Here we use |Du~Bois| as the argument because we want no breaks, giving us ``\texttt{\ShowPattern[W.E.B.]{Du~Bois}}''.
-% \item We set the sort key for both names to be \texttt{\{Dubois, W.E.B.\}}. If it were of the form \texttt{\{Du Bois, W.E.B.\}}, they would sort differently (Section~\ref{sec:IndexSort}). One must check a style manual for proper sorting.
+% \begin{itemize}
+% \item We decide\SPatInfo{\ShowPattern[W.E.B.]{Du~Bois}\break \ShowPattern[W.E.B.]{DuBois}} the canonical name form: \cmd{\DuBois} \ForgetThis\DuBois.
+% \item Both \cmd{\Name[W.E.B.]\{Du Bois\}} and \cmd{\Name[W.E.B.]\{DuBois\}} have the same pattern: \texttt{\ShowPattern[W.E.B.]{DuBois}} (Section~\ref{sec:NamePatterns}).
+% \item Here\vspace{-3ex}\IdxInfo{\ShowIdxPageref*[W.E.B.]{Du~Bois}\break \ShowIdxPageref*[W.E.B.]{DuBois}}\vspace{3ex} we use |\Name[W.E.B.]{Du~Bois}| to avoid bad breaks.
+% \item The sort key for both names is \texttt{\{Dubois, William\}}. Had we kept the space, the name would be sorted before \texttt{dual} (Section~\ref{sec:IndexSort}). One may have to spell out a name when sorting its initials.
% \item Instead of using \cmd{\SkipIndex}\cmd{\AltDuBois} many times, we create a cross-reference in the preamble so that no page entry for the alternate form will occur in the index:\IndexRef[W.E.B.]{DuBois}{Du Bois, W.E.B.}\smallskip\\
% | \IndexRef[W.E.B.]{DuBois}{Du Bois, W.E.B.}|
% \item We can use |\JustIndex\DuBois\AltDuBois| \JustIndex\DuBois\AltDuBois, keep full stop detection, and check if the name straddles a page break in order to append |\JustIndex\DuBois| if needed.
% \item If we create a macro like the one below, we lose full stop detection but then we do not have to check if the name straddles a page break. Normally, the name macros create two index entries each in order to handle this issue automatically:\smallskip\\
% | \newcommand\NewDuBois%|\\
% | {\JustIndex\DuBois\AltDubois\JustIndex\DuBois}|
-% \end{enumerate}
-%
+% \end{itemize}
+%
% \newpage
% \begin{center}\bfseries Example Name Authority\end{center}
-%
% Below are a couple of names from a name authority created for a translation of \textit{De Diaconis et Diaconissis Veteris Ecclesiae Liber Commentarius} by \Name[Caspar]{Ziegler}, of which the present author was the editor.\footnote{The book, \textit{The Diaconate of the Ancient and Medieval Church}, originally was typeset using \LaTeX, but had to be converted to a different format. Using \LaTeX, the present author has published Charles P. Schaum and Albert B. Collver III, \textit{Breath of God, Yet Work of Man: Scripture, Philosophy, Dialogue, and Conflict} (St. Louis: Concordia Publishing House, 2019).}
-%
+%
% Constructing that name authority was a challenge. In order to get the names right\,---\,the deceased translator unfortunately had left them in abbreviated Latin, as well as leaving many place names in Latin or translating them incorrectly\,---\,the present author used the following sources, among several others:
-%
+%
% \begin{itemize}
% \item CERL Thesaurus: \url{https://data.cerl.org/thesaurus/_search}
% \item Virtual International Authority File: \url{http://viaf.org/}
@@ -1920,12 +2007,13 @@ the README.txt or README for more information.
% \item WorldCat: \url{https://www.worldcat.org/}
% \item An older version of Graesse, \textit{Orbis Latinus}:\\ \url{http://www.columbia.edu/acis/ets/Graesse/contents.html}
% \end{itemize}
-%
-% This author followed the scholarly standards for determining the canonical name forms and used the alternate names (which were the ones actually in the original text) to refer to the canonical forms. I just translated all the place-names.
-%
-% Below we have candidates for sorting with \cmd{\PretagName} (Section~\ref{sec:IndexSort}) and potential use of \cmd{\CapThis} (Section~\ref{sec:NameParticles}). After using \cmd{\IndexRef} with a particular name, using \cmd{\Name} with that same name will not create a page reference from that point onward (Section~\ref{sec:IndexXref}).
-%
-% \begin{quote}
+%
+% This author used the vernacular forms as canonical, with the Latin versions as alternates. I translated all the place-names.
+%
+% Below we have candidates for sorting with \cmd{\PretagName} (Section~\ref{sec:IndexSort}) and potential use of \cmd{\CapThis} (Section~\ref{sec:NameParticles}). \emph{After} using \cmd{\IndexRef} with a particular name, using \cmd{\Name} with that same name will not create a page reference from that point onward (Section~\ref{sec:GeneralIndex}). If one were to use the alternate name \emph{before} using \cmd{\IndexRef}, then \cmd{\SeeAlso}\cmd{\IndexRef} would be used after all name references.
+%
+% \begin{quote}\small\vspace{3.5ex}\SPatInfo{\ShowPattern[Jacques]{De~Pamele}\break \ShowPattern[Jacobus]{Pamelius}\break \ShowPattern[Giovanni]{d'Andrea}\break \ShowPattern[Ioannes]{Andreae}}
+% \vspace{-3ex}
% \StartNum
% \begin{verbatim}
%\PretagName[Jacques]{De~Pamele}{Depamele, Jacques}
@@ -1938,59 +2026,62 @@ the README.txt or README for more information.
%\IndexRef[Ioannes]{Andreae}{d'Andrea, Giovanni}
%\Name[Ioannes]{Andreae}\end{verbatim}
%
-% \medskip \begin{tabular}{ll}\toprule
+% \leavevmode\vspace{-12ex}\IdxInfo{\ShowIdxPageref*[Jacques]{De~Pamele}\break \ShowIdxPageref*[Jacobus]{Pamelius}\break \ShowIdxPageref*[Giovanni]{d'Andrea}\break \ShowIdxPageref*[Ioannes]{Andreae}}\vspace{12ex}
+%
+% \begin{tabular}{ll}\toprule
% Canonical Name & Alternate Name\\\midrule
-% \Name[Jacques]{De~Pamele}[Jacques de~Joigny] &
-% \leavevmode\IndexRef[Jacobus]{Pamelius}{De~Pamele, Jacques}\Name[Jacobus]{Pamelius}\\
-% \rowcolor{black!7!white}\Name[Giovanni]{d'Andrea} &
-% \leavevmode\IndexRef[Ioannes]{Andreae}{d'Andrea, Giovanni}\Name[Ioannes]{Andreae}\\\bottomrule
+% \rowcolor{grey}\Name[Jacques]{De~Pamele}[Jacques de~Joigny]\IndexRef[Jacobus]{Pamelius}{De~Pamele, Jacques} &
+% \Name[Jacobus]{Pamelius}\\
+% \Name[Giovanni]{d'Andrea}\IndexRef[Ioannes]{Andreae}{d'Andrea, Giovanni} &
+% \Name[Ioannes]{Andreae}\\\bottomrule
% \end{tabular}
% \end{quote}
% \CapThis\Name[Giovanni]{d'Andrea} |\CapThis\Name[Giovanni]{d'Andrea}| can be used at the beginning of a sentence. |\Name[Jacques]{De~Pamele}| gives \Name[Jacques]{De~Pamele}.
-%
+%
% \ReturnLink
% \newpage
%
% \subsection{Language Topics}
% \label{sec:Lang}
-% This section looks at how \textsf{nameauth} addresses grammar, usage, and cultural standards. The concept of comma-delimited affixes dominates much of this section.
+% Here we focus on specific issues that are related to parts of names used differently in various cultures and kinds of names related to specific cultures. Comma-delimited affixes \meta{SNN, Affix} are a key concept here. Advanced topics in this section draw on Sections~\ref{sec:Indexing}, \ref{sec:Formatting}, \ref{sec:AltFormat}, and \ref{sec:NameDecisions}.
%
% \subsubsection[Affixes]{Affixes Require Commas}
% \label{sec:Affix}
%
-% A comma is required to separate a Western surname and affix, an Eastern family name and personal name, and an ancient name and affix. Yet we must take care because an example like \cmd{\Name\{}\cmd{\textsc\{a Name, Problem\}\}} will halt \LaTeX\ with errors (Section~\ref{sec:AltFormat}). Spaces around the comma are ignored (Section~\ref{sec:ErrorProt}).
+% A comma\SPatInfo{\ShowPattern[Oskar]{Hammerstein, II}\break \ShowPattern{Louis, XIV}\break \ShowPattern{Sun, Yat-sen}} separates a Western surname and affix; a ``native'' Eastern family name and personal name; and a royal, medieval, or ancient name and affix. To avoid errors, one must treat \meta{SNN, Affix} as two separate arguments (Section~\ref{sec:AltFormat}). Spaces around the comma are ignored.
%
-% \begin{center}\small\ForgetName{Sun, Yat-sen}\MyStretch
+% \begin{center}\small\ForgetName{Sun, Yat-sen}\IdxInfo{\ShowIdxPageref*[Oskar]{Hammerstein, II}\break \ShowIdxPageref*{Louis, XIV}\break \ShowIdxPageref*{Sun, Yat-sen}}\MyStretch
% \begin{tabular}{ll}\toprule
% |\Name[Oskar]{Hammerstein, II}| & \KeepAffix\Name[Oskar]{Hammerstein, II}\\
% |\Name[Oskar]{Hammerstein, II}| & \Name[Oskar]{Hammerstein, II}\\
-% \rowcolor{black!7!white}|\Name{Louis, XIV}| & \KeepAffix\Name{Louis, XIV}\\
-% \rowcolor{black!7!white}|\Name{Louis, XIV}| & \Name{Louis, XIV}\\
+% \rowcolor{grey}|\Name{Louis, XIV}| & \KeepAffix\Name{Louis, XIV}\\
+% \rowcolor{grey}|\Name{Louis, XIV}| & \Name{Louis, XIV}\\
% |\Name{Sun, Yat-sen}| & \KeepAffix\Name{Sun, Yat-sen}\\
% |\Name{Sun, Yat-sen}| & \Name{Sun, Yat-sen}\\\bottomrule
% \end{tabular}
% \end{center}
%
-% Western\Warn{} names with affixes must use the comma-delimited syntax. Using the obsolete syntax, |\SkipIndex\Name[Oskar]{Hammerstein}[II]| produces \SkipIndex\Name[Oskar]{Hammerstein}[II] which is an error. See also (Section~\ref{sec:AKA}).\medskip
-%
+% Western\SPatInfo{\ShowPattern[Oskar]{Hammerstein}[II]} names with affixes must use \meta{SNN, Affix}, never the obsolete syntax, which is meant for non-Western names and is discouraged. We get \SkipIndex\Name[Oskar]{Hammerstein}[II] and a bad index entry from, e.g., \cmd{\SkipIndex}\cmd{\Name[Oskar]\{Hammerstein\}[II]}.\medskip
+%
% \DescribeMacro{\KeepAffix}
-% In the text only, \cmd{\KeepAffix} turns the space \emph{between} \meta{SNN} and \meta{Affix} into a non-breaking space. This holds for a Western surname and affix, an ancient name and affix, and a ``native'' Eastern family name and personal name.\medskip
+% In the text only, \cmd{\KeepAffix} turns the space \emph{between} \meta{SNN} and \meta{Affix} into a non-breaking space if both \meta{SNN} and \meta{Affix} are displayed. This macro works with all name types, even with the obsolete syntax.\medskip
%
% \DescribeMacro{\KeepName}
-% In the text only, \cmd{\KeepName} turns all spaces \emph{between} name elements \meta{FNN}, \meta{SNN}, and \meta{Affix} into non-breaking spaces;\Version{3.1} |\KeepName\LJWG[von]| \KeepName\LJWG[von] will not break. This macro does not alter spaces \emph{within} name elements like \meta{FNN} (French or German forenames) and \meta{SNN} (Spanish surnames). Both \cmd{\KeepAffix} and \cmd{\KeepName} can affect \textsf{nameauth} macros that print in the text.\medskip
+% In the text only, \cmd{\KeepName} turns all spaces \emph{between} name elements \meta{FNN}, \meta{SNN}, and \meta{Affix} into non-breaking spaces if those elements are displayed.\Version{3.1} This macro does not alter spaces \emph{within} name elements that have multiple names like French or German forenames and Spanish surnames. As above, this macro works with all name types, even with the obsolete syntax.\medskip
%
% \DescribeMacro{\DropAffix}
-% Preceding the naming macros with \cmd{\DropAffix} will suppress an affix in a Western name. |\DropAffix\Name*[Oskar]{Hammerstein, II}| produces\Version{3.0} ``\DropAffix\Name*[Oskar]{Hammerstein, II}.'' This does not affect non-Western names.\medskip
+% Preceding the naming macros with \cmd{\DropAffix} will suppress an affix only in a Western name. |\DropAffix\Name*[Oskar]{Hammerstein, II}| produces\Version{3.0} ``\DropAffix\Name*[Oskar]{Hammerstein, II}''. This macro does not affect non-Western names.
+%
+% With non-Western names, the \meta{Affix} in the \meta{SNN, Affix} pair drops automatically in the text for subsequent uses, making \cmd{\DropAffix} redundant. We see that above in the case of \Name*{Louis,XIV}, who becomes \Name{Louis,XIV}.\medskip
%
% \DescribeMacro{\ShowComma}
-% \cmd{\ShowComma} forces a comma between a Western name and its affix. It works like the \texttt{comma} option on a per-name basis, and only in the body text.
+% \cmd{\ShowComma} forces a comma between a Western name and its affix. It works like the \texttt{comma} option on a per-name basis, and only in the text.
% \DescribeMacro{\NoComma}
-% \cmd{\NoComma} works like the \texttt{nocomma} option in the body text on a per-name basis.
-% Neither\Version{2.6} of these macros affect the use of \cmd{\RevComma}, which always prints a comma.
+% One uses \cmd{\ShowComma} with older publication styles that separate a Western name and affix with a comma. \cmd{\NoComma} works like the \texttt{nocomma} option in the body text on a per-name basis. Neither of these macros affect the use of \cmd{\RevComma}, which always prints a comma.
% \begin{center}\small\MyStretch
% \begin{tabular}{ll}\toprule
-% |\ShowComma\Name*[Louis]{Gossett, Jr.}| & \ShowComma\Name*[Louis]{Gossett, Jr.}\\
-% \rowcolor{black!7!white}|\NoComma\Name*[Louis]{Gossett, Jr.}| & \NoComma\Name*[Louis]{Gossett, Jr.}\\\bottomrule
+% \rowcolor{grey}|\ShowComma\LPat| & \ShowComma\LPat\\
+% |\NoComma\LPat| & \NoComma\LPat\\\bottomrule
% \end{tabular}
% \end{center}
%
@@ -1999,21 +2090,25 @@ the README.txt or README for more information.
%
% \subsubsection[Listing by Surname]{Listing Western names by Surname}
% \label{sec:LastFirst}
+%^^A Starting with this point, if there is an error in the docs then the aux files will
+%^^A be ruined and must be deleted. Above this point it will be okay. Why?
%
% \DescribeMacro{\ReverseCommaActive}
% In addition to the options for reversed comma listing (Section~\ref{sec:PkgOptions}), the macros \cmd{\ReverseCommaActive} and \cmd{\ReverseCommaInactive}
% \DescribeMacro{\ReverseCommaInactive}
% function the same way with blocks of text. They all override \cmd{\RevComma}.
% \DescribeMacro{\RevComma}
-% These all reorder long Western name forms (via \cmd{\Name*} and the like). The first two are broad toggles, while the third works on a per-name basis. These\Version{3.0} macros only affect Western and ``non-native'' Eastern name forms.
+% These all reorder only long Western and ``non-native'' Eastern name forms.\Version{3.0} The first two are broad toggles, while the third works on a per-name basis.
+%
+% \vspace{1.5ex}\leavevmode\SPatInfo{\ShowPattern[Oskar]{Hammerstein, II}\break \ShowPattern[Hideyo]{Noguchi}\break \ShowPattern{Æthelred,II}\break \ShowPattern{Sun, Yat-sen}\break \ShowPattern{Confucius}}\vspace{-4ex}
% \begin{center}\small\MyStretch
% \begin{tabular}{lll}\toprule
-% \ForgetThis\VBuren & \RevComma\LVBuren & OK\\
-% \ForgetThis\Name[Oskar]{Hammerstein, II} & \RevComma\Name*[Oskar]{Hammerstein, II} & OK\\
-% \ForgetThis\LNoguchi & \RevComma\LNoguchi\dag & OK\\
-% \rowcolor{black!7!white}\ForgetThis\Aeth & \RevComma\LAeth & no change\\
-% \rowcolor{black!7!white}\ForgetThis\Name{Chiang}[Kai-shek] & \RevComma\Name*{Chiang}[Kai-shek] & no change\\
-% \rowcolor{black!7!white}\ForceName\Name{Confucius} & \RevComma\Name{Confucius} & no change\\\bottomrule
+% \ForgetThis\VBuren & \RevComma\LVBuren & change\\
+% \ForgetThis\Name[Oskar]{Hammerstein, II} & \RevComma\Name*[Oskar]{Hammerstein, II} & change\\
+% \ForgetThis\LNoguchi & \RevComma\LNoguchi\dag & change\\
+% \rowcolor{grey}\ForgetThis\Aeth & \RevComma\LAeth & no change\\
+% \rowcolor{grey}\ForgetThis\Name{Sun, Yat-sen} & \RevComma\Name*{Sun, Yat-sen} & no change\\
+% \rowcolor{grey}\ForceName\Name{Confucius} & \RevComma\Name{Confucius} & no change\\\bottomrule
% \end{tabular}
% \end{center}
%
@@ -2024,44 +2119,54 @@ the README.txt or README for more information.
% \subsubsection{Eastern Names}
% \label{sec:Eastern}
%
-% One\Info{``non-native''} produces a ``non-native'' Eastern name in the text by reversing a Western without \meta{Affix} using \cmd{\RevName}:
+% All non-Western name forms using the \textsf{nameauth} macros omit the first optional argument. Yet the reversing macros can make Western names have Eastern name order, but only in the text, not in the index.\medskip
+%
+% One\Info{``Non-native''} produces a ``non-native'' Eastern name in the text by reversing a Western name without \meta{Affix} using \cmd{\RevName}, e.g.:
% \begin{quote}
-% \fbox{\mystrut\ \cmd{\RevName}\cmd{\Name*}\oarg{FNN}\marg{SNN}\oarg{Alternate} }
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\RevName}\cmd{\Name}\oarg{FNN}\marg{SNN}\oarg{Alternate}\\
+% \end{tabular}
+% }
% \end{quote}
-%
% The index entry of this name form looks like \meta{SNN}, \meta{FNN} (including the comma). This is a Western index entry. This form is used also for Hungarian names, e.g.: |\RevName\Name[Frenec]{Molnár}| \ForgetThis\RevName\Name[Frenec]{Molnár}\dag, \RevName\Name[Frenec]{Molnár}\dag.\medskip
%
-% In\Info{``native''} contrast, ``native'' Eastern names use either comma-delimited syntax or the obsolete syntax. They have Eastern-form index entries \meta{SNN} \meta{Affix/Alternate} (no comma). The new syntax permits alternate names; the obsolete does not. These forms work also with ancient and medieval names:
+% In\Info{``Native''} contrast, ``native'' Eastern names use either comma-delimited syntax or the obsolete syntax (Section~\ref{sec:Obsolete}). They have index entries appropriate to Eastern names: \meta{SNN} \meta{Affix} (no comma). The current syntax permits alternate names; the obsolete does not. These forms work also with ancient and medieval names:
%
% \begin{quote}
-% \fbox{\ \parbox{0.45\textwidth}{%
-% \mystrut\cmd{\Name}\marg{SNN, Affix}\oarg{Alternate}\\
-% \mystrut\cmd{\Name}\marg{SNN}\oarg{Alternate}}
-% \parbox{0.225\textwidth}{\color{nared}\mystrut\texttt{\%} \textit{new syntax}\\ \mystrut\texttt{\%} \textit{obsolete syntax}}}
+% \fbox{
+% \begin{tabular}{ll}
+% {\Large\strut}\cmd{\Name}\marg{SNN, Affix}\oarg{Alternate} & \color{nared}\texttt{\%} \textit{new syntax}\\
+% \end{tabular}
+% }
% \end{quote}
%
-% People\Info{avoid error} can make mistakes that these forms help one to avoid. For example, in an otherwise excellent German-language history textbook series, one finds an index entry for ``Yat-sen, Sun''. It should be ``Sun Yat-sen''.\footnote{See Immanuel Geiss, \textit{Personen: Die biographische Dimension der Weltgeschichte}, Geschichte Griffbereit vol. 2 (Munich: Wissen Media Verlag, 2002), 720. Errors arising from cultural differences and basic mistakes give justification for the design of \textsf{nameauth}.}
-% The form |\Name{Sun, Yat-sen}| \Sun\ ensures the correct entry.\medskip
+% People\Info{Avoid error} can make mistakes that these forms help one to avoid. For example, in an otherwise excellent German-language multi-volume history text, one finds the incorrect, Western-form index entry ``\ShowIdxPageref*[Sun]{Yat-Sen}''. It should be ``\ShowIdxPageref*{Sun, Yat-sen}''.\footnote{See Immanuel Geiss, \textit{Personen: Die biographische Dimension der Weltgeschichte}, Geschichte Griffbereit vol. 2 (Munich: Wissen Media Verlag, 2002), 720.}
+% The macro |\Name*{Sun, Yat-sen}| \Name*{Sun, Yat-sen} ensures the correct entry by using the correct form. The goal is to promote cross-cultural sensitivity.\medskip
+% \newpage
%
% \DescribeMacro{\ReverseActive}
% In addition to the options for reversing (Section~\ref{sec:PkgOptions}), \cmd{\ReverseActive} and \cmd{\ReverseInactive} reverse name order for blocks of text.
% \DescribeMacro{\ReverseInactive}
% These all override the use of \cmd{\RevName}, which reverses once per name.
% \DescribeMacro{\RevName}
-% These macros do not affect the index. They work also with \cmd{\AKA} and its derivatives. The reverse mechanism shows only in full names, but it does not force full names. ``Non-native'' forms are shown by a dagger (\dag) in the next table:
-% \begin{center}\small\MyStretch
+% These macros do not affect the index. They work also with \cmd{\AKA} and friends. Reversing only affects long name forms. ``Non-native'' forms are shown with a dagger (\dag):
+%
+% \vspace{1.5ex}\leavevmode\SPatInfo{\ShowPattern[Hideyo]{Noguchi}\break \ShowPattern{Miyazaki, Hayao}}\vspace{-3.5ex}
+% \begin{center}\small\MyStretch\leavevmode\vspace{-29ex}\IdxInfo{\ShowIdxPageref*[Hideyo]{Noguchi}\break \ShowIdxPageref*{Miyazaki, Hayao}}\vspace{29ex}
% \begin{tabular}{rll}\toprule
% & unchanged & |\RevName|\\\midrule
-% |\LNoguchi| & \LNoguchi & \RevName\LNoguchi\dag\\
-% |\LNoguchi[Doctor]| & \LNoguchi[Doctor] & \raise0.5ex\hbox to 5em{\hfil\rule{3em}{0.6pt}} \\
-% |\LNoguchi[Sensei]| & \raise0.5ex\hbox to 5em{\hfil\rule{3em}{0.6pt}} & \RevName\LNoguchi[Sensei]\dag\\
-% |\Noguchi| & \Noguchi & \RevName\Noguchi\dag\\
-% |\SNoguchi| & \SNoguchi & \RevName\SNoguchi\dag\\
-% \rowcolor{black!7!white}|\LYamt| & \LYamt & \RevName\LYamt\\
-% \rowcolor{black!7!white}|\LYamt[Admiral]| & \raise0.5ex\hbox to 5em{\hfil\rule{3em}{0.6pt}} & \RevName\LYamt[Admiral]\\
-% \rowcolor{black!7!white}|\Yamt| & \Yamt & \RevName\Yamt\\
-% \rowcolor{black!7!white}|\SYamt| & \SYamt & \RevName\SYamt\\
-% \rowcolor{black!7!white}|\ForceFN\SYamt| & \ForceFN\SYamt & \ForceFN\RevName\SYamt\\\bottomrule
+% \rowcolor{grey}|\LNoguchi| & \LNoguchi & \RevName\LNoguchi\dag\\
+% \rowcolor{grey}|\LNoguchi[Doctor]| & \LNoguchi[Doctor] & \raise0.5ex\hbox to 5em{\hfil\rule{3em}{0.6pt}} \\
+% \rowcolor{grey}|\LNoguchi[Sensei]| & \raise0.5ex\hbox to 5em{\hfil\rule{3em}{0.6pt}} & \RevName\LNoguchi[Sensei]\dag\\
+% \rowcolor{grey}|\Noguchi| & \Noguchi & \RevName\Noguchi\dag\\
+% \rowcolor{grey}|\SNoguchi| & \SNoguchi & \RevName\SNoguchi\dag\\
+% |\LMiyaz| & \LMiyaz & \RevName\LMiyaz\\
+% |\LMiyaz[Mr.]| & \raise0.5ex\hbox to 5em{\hfil\rule{3em}{0.6pt}} & \RevName\LMiyaz[Mr.]\\
+% |\LMiyaz[Sensei]| & \LMiyaz[Sensei] & \raise0.5ex\hbox to 5em{\hfil\rule{3em}{0.6pt}}\\
+% |\Miyaz| & \Miyaz & \RevName\Miyaz\\
+% |\SMiyaz| & \SMiyaz & \RevName\SMiyaz\\
+% |\ForceFN\SMiyaz| & \ForceFN\SMiyaz & \ForceFN\RevName\SMiyaz\\\bottomrule
% \end{tabular}\medskip\\
% \end{center}
%
@@ -2072,120 +2177,194 @@ the README.txt or README for more information.
% \DescribeMacro{\AllCapsInactive}
% All override \cmd{\CapName}, which works once per name.
% \DescribeMacro{\CapName}
-% These capitalize \meta{SNN} in the body text only. They also work with \cmd{\AKA} and friends. For caps in the text and index see Sections~\ref{sec:AltFormat} and~\ref{sec:Hooksiii}. We show ``non-native'' Eastern forms with a dagger ({\dag}) and the old syntax with a double dagger(\ddag).
+% These capitalize \meta{SNN} in the body text only. They also work with \cmd{\AKA} and friends. For caps in the text and index see Sections~\ref{sec:AltFormat} and~\ref{sec:Hooksiii}. We show ``non-native'' Eastern forms with a dagger ({\dag}):
%
% \begin{center}\small\MyStretch\AllCapsActive
% \begin{tabular}{lll}\toprule
% & |\CapName| only & |\CapName\RevName|\\\midrule
-% |\Name*[Yoko]{Kanno}| & \CapName\Name*[Yoko]{Kanno} & \CapName\RevName\Name*[Yoko]{Kanno}\dag\\
-% \rowcolor{black!7!white}|\Name*{Arai, Akino}| & \Name*{Arai, Akino} & \RevName\Name*{Arai, Akino}\\
-% |\Name*{Ishida}[Yoko]| & \CapName\Name*{Ishida}[Yoko]\ddag & \CapName\RevName\Name*{Ishida}[Yoko]\ddag\\
-% \rowcolor{black!7!white}|\Name*{Yohko}| & \Name*{Yohko} & \RevName\Name*{Yohko}\\\bottomrule
+% \rowcolor{grey}|\LNoguchi| & \CapName\LNoguchi & \RevName\LNoguchi\dag\\
+% |\LMiyaz| & \LMiyaz & \RevName\LMiyaz\\\bottomrule
% \end{tabular}\AllCapsInactive
% \end{center}
-%
+%
% Both\Info{\cmd{\global}} \cmd{\AllCapsActive} and \cmd{\AllCapsInactive} can be used either as a pair or singly within an explicitly local scope. Use \cmd{\global} to force a global effect.
%
% \ReturnLink
%
-% \subsubsection[Particles / Ancient]{Particles, Medieval Names, and Ancient Names}
+% \subsubsection[Particles]{Particles in Names}
% \label{sec:NameParticles}
%
-% English\Info{cap rules} names with particles \textit{de}, \textit{de\ la}, \textit{d'}, \textit{von}, \textit{van}, and \textit{ten} often keep them with the last name, using varied capitalization.\footnote{According to [\hyperlink{Mulvany}{Mulvany}, 165f.] and the \textit{Chicago Manual of Style}.} \textit{Le}, \textit{La}, and \textit{L'} always are capitalized unless preceded by \textit{de}. See also Sections~\ref{sec:SimpleStart}, \ref{sec:NamePatterns}, \ref{sec:VarNames}, and \ref{sec:AltFormat}.\medskip
+% Particles in names have specific rules:
+% \begin{itemize}
+% \item English use of \textit{de}, \textit{de\ la}, \textit{d'}, \textit{von}, \textit{van}, and \textit{ten} often keeps them with the surname with varied capitalization.
+% \item \textit{Le}, \textit{La}, and \textit{L'} always are capitalized unless preceded by \textit{de}.\footnote{According to [\hyperlink{Mulvany}{Mulvany}, 152–82] and the \textit{Chicago Manual of Style}.}
+% \item Modern Romance languages keep particles with the surname.
+% \item German and medieval Romance languages put particles with forenames.
+% \end{itemize}
+% \newpage
+%
+% \leavevmode\SPatInfo{\ShowPattern[Martin]{Van Buren}\break \ShowPattern[Hernando]{de~Soto}\break \ShowPattern[J.W. von]{Goethe}}
+% \vspace{-3ex}
+% \begin{center}\small\MyStretch\leavevmode\vspace{-12ex}\IdxInfo{\ShowIdxPageref*[Martin]{Van Buren}\break \ShowIdxPageref*[Hernando]{de~Soto}\break \ShowIdxPageref*[J.W. von]{Goethe}}\vspace{12ex}
+% \begin{tabular}{rll}\toprule
+% \bfseries Macro & \bfseries Body Text & \bfseries Index \\\midrule
+% \rowcolor{grey}\cmd{\ForgetThis}\cmd{\VBuren} & \ForgetThis\VBuren & \ShowIdxPageref*[Martin]{Van Buren}\\
+% \cmd{\VBuren} & \VBuren & \ShowIdxPageref*[Martin]{Van Buren}\\
+% \rowcolor{grey}\cmd{\ForgetThis}\cmd{\Soto} & \ForgetThis\Soto & \ShowIdxPageref*[Hernando]{de~Soto}\\
+% \cmd{\CapThis}\cmd{\Soto} & \CapThis\Soto & \ShowIdxPageref*[Hernando]{de~Soto}\\
+% \rowcolor{grey}\cmd{\ForgetThis}\cmd{\JWG} & \ForgetThis\JWG & \ShowIdxPageref*[J.W. von]{Goethe}\\
+% \cmd{\JWG} & \JWG & \ShowIdxPageref*[J.W. von]{Goethe}\\\bottomrule
+% \end{tabular}
+% \end{center}
%
-% We\Info{non-breaking\break spaces} recommend inserting a tilde (active character for a non-breaking space) or \cmd{\nobreakspace} between some particles and names to prevent bad breaks, sorting them with \cmd{\PretagName} (Section~\ref{sec:IndexSort}).
-% Some particles look similar: \textit{L'} (L+apostrophe) and \textit{d'} (d+apostrophe) are two separate glyphs each. In contrast, \textit{Ľ} (L+caron) and \textit{ď} (d+caron) are one Unicode glyph each (Section~\ref{sec:Unicode}).
-%\newpage
+% We\Info{A few tips} recommend inserting a tilde (active character for a non-breaking space) or \cmd{\nobreakspace} between some particles and names to prevent bad breaks, sorting them with \cmd{\PretagName} (Section~\ref{sec:IndexSort}).
+% Some particles look similar: \textit{L'} (L+apostrophe) and \textit{d'} (d+apostrophe) are two separate glyphs each. In contrast, \textit{Ľ} (L+caron) and \textit{ď} (d+caron) are one Unicode glyph each (Section~\ref{sec:Unicode}).\medskip
%
% \phantomsection
% \label{page:CapThis}
% \DescribeMacro{\CapThis}
-% In English and modern Romance languages, e.g., \ForgetThis\Soto\ shows that these particles go in the \meta{SNN} argument of \cmd{\Name}: \Soto. When the particle appears at the beginning of a sentence, one must capitalize it:
+% In English and modern Romance languages, e.g., \LSoto\ shows that these particles go in the \meta{SNN} argument of \cmd{\Name}: \Soto. When the particle appears at the beginning of a sentence, one must capitalize it:
% \begin{quote}\small
% |\CapThis\Soto\| \CapThis\Soto\ was a famous Spanish explorer in North America.
% \end{quote}
%
% \cmd{\CapName} overrides the \meta{SNN} created by \cmd{\CapThis}. \cmd{\CapThis}\Version{3.2} should work with all of the Unicode characters available in the T1 encoding (its mechanism is explained in Section~\ref{sec:Unicode} and on page~\pageref{page:CapSystem}). For a broader set of Unicode characters, consider using \texttt{xelatex} and \texttt{lualatex}.\medskip
%
-% For\Info{surname variants} another example, we mention poet \Name[e.e.]{cummings}. One can have formatted name caps and inflections, e.g.: \ExcludeName[e.e.]{cummings's}``\SubvertThis\CapThis\Name[e.e.]{cummings's} motif of the goat-footed balloon man has underlying sexual themes that nevertheless have a childish facade.'' The easiest way to do that is from Section~\ref{sec:IndexXref}:
+% For\Info{Surname variants} another example, we mention poet \Name[e.e.]{cummings}. One can have formatted name caps and inflections. The easiest way to do that is from Section~\ref{sec:GeneralIndex}:
+%
+% \vspace{1.5ex}\leavevmode\SPatInfo{\ShowPattern[e.e.]{cummings}\break \ShowPattern[e.e.]{cummings's}}\vspace{-4.5ex}
% \begin{quote}\small
-% |\ExcludeName[e.e.]{cummings's}|\\
-% . . .\\
-% |\SubvertThis\CapThis\Name[e.e.]{cummings's}%|\\
-% |\IndexName[e.e.]{cummings}|\dotfill \SubvertThis\CapThis\Name[e.e.]{cummings's}\IndexName[e.e.]{cummings}
+% \StartNum
+% \begin{verbatim}
+%\ExcludeName[e.e.]{cummings's}\IndexName[e.e.]{cummings}
+%\SubvertThis\CapThis\Name[e.e.]{cummings's} motif of the
+%goat-footed balloon man has underlying sexual themes that
+%nevertheless have a childish facade''.\end{verbatim}
+%
+%\vspace{1ex}\IdxInfo{\ShowIdxPageref*[e.e.]{cummings}}\vspace{-1ex}\ExcludeName[e.e.]{cummings's}\IndexName[e.e.]{cummings}
+%\SubvertThis\CapThis\Name[e.e.]{cummings's} motif of the
+%goat-footed balloon man has underlying sexual themes that
+%nevertheless have a childish facade''.
% \end{quote}
%
-% One\Warn{} must use \cmd{\SubvertThis} only for the first use to avoid ``\ForgetThis\CapThis\Name[e.e.]{cummings's}''; all name elements are capped with \cmd{\CapThis}. Using \cmd{\ExcludeName} keeps one from having to use \cmd{\SkipIndex} every time. With \textsf{nameauth} we can use both simple and complex solutions to name variation. See also Section~\ref{sec:VarNames}.
+% One\Warn{} must use \cmd{\SubvertThis} only for the first use to avoid ``\ForgetThis\CapThis\Name[e.e.]{cummings's}''; all name elements are capped with \cmd{\CapThis}. Using \cmd{\ExcludeName} keeps one from having to use \cmd{\SkipIndex} every time. See also Section~\ref{sec:VarNames}.
%
-% Section~\ref{sec:AltFormat} explains how to use \cmd{\CapThis} with alternate formatting when using macros in name arguments. Page~\pageref{page:Inflections} describes how automation lends itself to Continental (French, German, etc.) formats and grammatical inflections.\medskip
+% Section~\ref{sec:AltFormat} explains how to use \cmd{\CapThis} with alternate formatting when using macros in name arguments. Page~\pageref{page:Inflections} describes how automation lends itself to Continental formats (French, German, etc.) and grammatical inflections.\medskip
%
% \DescribeMacro{\AccentCapThis}
-% If one uses this package on a system that does not handle Unicode, one can use \cmd{\AccentCapThis} instead of \cmd{\CapThis}\Version{3.0} to handle active initial characters. Otherwise, one should not need to use \cmd{\AccentCapThis}.
+% If one uses this package on a system that does not support Unicode, one can use \cmd{\AccentCapThis} instead of \cmd{\CapThis}\Version{3.0} to handle active initial characters. Otherwise, one should not need to use \cmd{\AccentCapThis}.
%
-% \begin{center}\bfseries Examples\end{center}
+% \ReturnLink
+% \vfill
+%
+% \begin{verse}
+% ``Rose is a rose is a rose is a rose''\\\hfill---\Name[Gertrude]{Stein}, ``Sacred Emily'' in \textit{Geography and Plays}
+% \end{verse}
+% \newpage
+%
+% \subsubsection[Medieval/Ancient]{Medieval, Ancient, and Roman Names}
+% \label{sec:NameAncient}
+% \medskip
+%
+% \begin{center}\bfseries Medieval Names\end{center}
+% Medieval names present some interesting difficulties, often based on the expected standards of the context in which they are used. Some publications use them like Western names while others do not. In the following preamble snippet we have:
%
-% Medieval\Info{medieval names} names present some interesting difficulties, often based on the expected standards of the context in which they are used:
+% \vspace{1.5ex}\leavevmode\SPatInfo{\ShowPattern{Thomas, à~Kempis}\hfill \textrm{(1--4, 7)}\break \ShowPattern{Thomas,\`a~Kempis}\hfill \textrm{(5--6)}\break \ShowPattern[Thomas]{à~Kempis}\hfill \textrm{(8--10)}}\vspace{-4.5ex}
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
%\PretagName{Thomas, à~Kempis}{Thomas Akempis} % medieval
%\PretagName[Thomas]{à~Kempis}{Akempis, Thomas} % Western
-%\IndexRef[Thomas]{à~Kempis}{Thomas à~Kempis} % xref
+%\IndexRef[Thomas]{à~Kempis}{Thomas à~Kempis} % xref
%\ExcludeName{Thomas,\`a~Kempis} % alternate form excluded
%\begin{nameauth}
-% \< KempMed & & Thomas, à~Kempis & > % medieval
-% \< KempW & Thomas & à~Kempis & > % Western
+% \< KempMed & & Thomas, à~Kempis & > % medieval
+% \< KempW & Thomas & à~Kempis & > % Western
%\end{nameauth}\end{verbatim}
% \IndexRef[Thomas]{à~Kempis}{Thomas à~Kempis}
% \ExcludeName{Thomas,\`a~Kempis}
-% \end{quote}
+% \end{quote}\vspace{-9ex}\IdxInfo{\ShowIdxPageref*{Thomas, à~Kempis}\hfill (1--4, 7)\break \ShowIdxPageref*{Thomas,\`a~Kempis}\hfill (5--6)\break \ShowIdxPageref*[Thomas]{à~Kempis}\hfill (8--10)}\vspace{8ex}
%
-% The medieval forms\Version{3.1} \KempMed\ and \KempMed\ are indexed as ``\ShowIdxPageref*{Thomas, à~Kempis}.'' The place name |\ForceFN\SKempMed| ``\ForceFN\SKempMed'' (Latin for \textit{von Kempen}) technically is not a Western surname.
-% \CapThis\ForceFN\SKempMed\ |\CapThis\ForceFN\SKempMed| starts a sentence. \Name{Thomas,\`a~Kempis} |\Name{Thomas,\`a~Kempis}| is different. \CapThis\SubvertThis\ForceFN\FName{Thomas, \`a~Kempis} is |\CapThis\SubvertThis\ForceFN\FName{Thomas,\`a~Kempis}|.
-% One should use \cmd{\PretagName} to sort the index entry (Section~\ref{sec:IndexSort}). We excluded this alternate form (Section~\ref{sec:IndexXref}).
-% \newpage
+% \begin{enumerate}
+% \item \KempMed\Version{3.1} is indexed as ``\ShowIdxPageref*{Thomas, à~Kempis}''.
+% \item Later uses display \KempMed\ because ``\ForceFN\SKempMed'' |\ForceFN\SKempMed| is a place name, not a surname. It is Latin for \textit{von Kempen}.
+% \item \CapThis\ForceFN\SKempMed\ |\CapThis\ForceFN\SKempMed| starts a sentence.
+% \item We use \cmd{\PretagName} (Section~\ref{sec:IndexSort}) to sort the name.
+% \item \Name{Thomas,\`a~Kempis} |\Name{Thomas,\`a~Kempis}| is a different name. As above, we would sort this name with \cmd{\PretagName}.
+% \item We used \cmd{\ExcludeName} (Section~\ref{sec:GeneralIndex}) before using the alternate name to keep it out of the index.
+% \item We index the canonical form here with \JustIndex\KempMed|\JustIndex\KempMed|.
+% \item \KempW\ |\KempW| is a Western form with the index entry: ``\ShowIdxPageref*[Thomas]{à~Kempis}''.
+% \item \CapThis\KempW\ appears via |\CapThis\KempW|.
+% \item We created a cross-reference from the Western form to the medieval form, before we used the Western form, thus preventing any spurious page entries (Section~\ref{sec:GeneralIndex}). We index with the medieval form (7).
+% \end{enumerate}
%
-% Western forms\Warn{} like |\KempW|: \KempW\ are very different from medieval forms and create different index entries. |\CapThis\KempW| gives ``\CapThis\KempW'' in the text and ``\ShowIdxPageref*[Thomas]{à~Kempis}'' in the index.
-%
-% Above, we created a cross-reference from the Western form to the medieval form, preventing page entries (Section~\ref{sec:IndexXref}). If we sorted the cross-reference using |\PretagName[Thomas]{à~Kempis}{a Kempis, Thomas}|, it would precede \texttt{aardvark}. We use |\PretagName[Thomas]{à~Kempis}{Akempis, Thomas}|, which sorts the cross-reference between \texttt{ajar} and \texttt{alkaline}. One should check a style manual for correct sorting (Section~\ref{sec:IndexSort}).\medskip
+% Spaces count\Warn{} when sorting index entries (Section~\ref{sec:IndexSort}). Sorting the cross-reference with |\PretagName[Thomas]{à~Kempis}{a Kempis, Thomas}|, would put it before \texttt{aardvark}. |\PretagName[Thomas]{à~Kempis}{Akempis, Thomas}| sorts the cross-reference between \texttt{ajar} and \texttt{alkaline}.
+% \vfil
%
+% \begin{tcolorbox}[colback=white,colframe=nared]
+% From this point forward, we shall change what we show in the margin.
+% We shall show full name patterns that reflect naming systems,
+% index sorting tags, index entry tags, cross-references,
+% and name info (Section~\ref{sec:NamePatterns}).\\[2ex]
+% No longer shall we show index entries in the margins because they
+% shall become too complex for such display to work well.
+% \end{tcolorbox}
+% \newpage
+%
+% \begin{center}\bfseries Ancient Names\end{center}
% \phantomsection
% \label{page:Sobriquets}
-% \begingroup%^^A
-% \renewcommand*\NamesFormat{}%^^A
-% \renewcommand*\MainNameHook{}%^^A
-% Ancient\Info{ancient names} contexts may or may not bind particles to surnames. The \meta{alternate} argument, \cmd{\PretagName}, and \cmd{\TagName} address this (Sections~\ref{sec:IndexSort}, \ref{sec:IndexTag}).
+% \begingroup%^^A Local format hook redefinition
+% \renewcommand*\NamesFormat{}^^A
+% \renewcommand*\MainNameHook{}^^A
+% Ancient contexts may or may not bind particles or other name elements to surnames. One must handle these cases not only in the text, but also in the index. In the rest of this section the examples do not use the formatting conventions of this manual and present themselves as if they were in an ordinary \LaTeX\ document.
+%
+% \begin{itemize}
+% \item For name entries in the index, we can use \cmd{\PretagName} and \cmd{\TagName} to ensure that any ``long form'' information is displayed without using macros in the name arguments. See Sections~\ref{sec:IndexSort}, \ref{sec:IndexTag}.
+% \item In the text, we can use the \meta{Alternate} argument or the name information database (Section~\ref{sec:TextTags}) to add ``long form'' information as needed. Beyond that, we would have to use macros in the name arguments.
+% \end{itemize}
%
-% The next examples do not use the formatting conventions of this manual and sometimes hide details that are specific to this manual in order to keep things simple and reflect normal document usage. See the \texttt{dtx} source code for more information. First we use variants with \meta{alternate}:\footnote{Copies of these examples are in \texttt{examples.tex}, collocated with this manual.}
+% First we explore the easiest way to handle royal or ancient variants with extra ``long form'' information using the \meta{Alternate} argument. We use macros introduced in Sections~\ref{sec:IndexSort} and~\ref{sec:IndexTag}.\footnote{Copies of examples in this section are in \texttt{examples.tex}, located with this manual.}
+%
% \NameAddInfo{Demetrius, I}{ Soter}
+% \vspace{1.5ex}\leavevmode\PatInfo{\ShowPattern{Demetrius, I}!PRE\break \ShowPattern{Demetrius, I}!TAG\break \ShowPattern{Demetrius, I}!MN}\vspace{-4.5ex}
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
-%\NameAddInfo{Demetrius, I}{ Soter}
%\PretagName{Demetrius, I}{Demetrius 1}
%\TagName{Demetrius, I}{ Soter, king}
%\begin{nameauth}
% \< Dem & & Demetrius, I & >
%\end{nameauth}\end{verbatim}
-%
% \smallskip
+%
+% \MyStretch
% \begin{tabular}{ll}\toprule
-% |\Dem[I Soter]| & \Dem[I Soter]\\
-% \rowcolor{black!7!white}|\LDem| & \LDem\\
-% |\Dem| & \Dem\\\bottomrule
-% \end{tabular}
-% \end{quote}
+% \cmd{\Dem[I Soter]} & \Dem[I Soter]\\
+% \rowcolor{grey}^^A
+% \cmd{\LDem} & \LDem\\
+% \cmd{\Dem} & \Dem\\\bottomrule
+% \end{tabular}\smallskip
%
-% \makeatletter\renewcommand*\NamesFormat[1]{\begingroup%^^A
-% \protected@edef\temp{\endgroup{#1%^^A
+% \IndexActual{@}^^A
+% \TagName{Demetrius, I}{ Soter, king}^^A
+% Index (normal \LaTeX\ document): \texttt{\ShowIdxPageref{Demetrius, I}}^^A
+% \TagName{Demetrius, I}{ Soter, king\string|hyperpage}^^A
+% \end{quote}
+%
+% \makeatletter\renewcommand*\NamesFormat[1]{^^A
+% \begingroup^^A
+% \protected@edef\temp{\endgroup{#1^^A
% \noexpand\NameQueryInfo[\unexpanded\expandafter{\the\@nameauth@toksa}]
% {\unexpanded\expandafter{\the\@nameauth@toksb}}
% [\unexpanded\expandafter{\the\@nameauth@toksc}]}}\temp}\makeatother
-% For a more automated approach, we can use ``text tags'' in the formatting macros (see Sections~\ref{sec:TextTags}, \ref{sec:Hooksii}).
+% Using the name information database (``text tags'') with the formatting macros (Sections~\ref{sec:TextTags}, \ref{sec:Hooksii}), we can provide a more automatic approach:
%
+% \vspace{1.5ex}\leavevmode\PatInfo{\ShowPattern{Demetrius, I}!DB\break \ShowPattern{Demetrius, I}!MN}\vspace{-4.5ex}
% \begin{quote}\small
% \ContinueNum
% \begin{verbatim}
+%\NameAddInfo{Demetrius, I}{ Soter}
%\makeatletter
%\renewcommand*\NamesFormat[1]{%
% \begingroup%
@@ -2200,924 +2379,618 @@ the README.txt or README for more information.
%}
%\makeatother\end{verbatim}
%
-% \smallskip
+% \smallskip\MyStretch
% \begin{tabular}{ll}\toprule
-% |\ForgetThis\Dem| & \ForgetThis\Dem\\
-% \rowcolor{black!7!white}|\LDem| & \LDem\\
-% |\Dem| & \Dem\\\bottomrule
-% \end{tabular}
+% \cmd{\ForgetThis}\cmd{\Dem} & \ForgetThis\Dem\\
+% \rowcolor{grey}^^A
+% \cmd{\LDem} & \LDem\\
+% \cmd{\Dem} & \Dem\\\bottomrule
+% \end{tabular}\smallskip
+%
+% The index entry is the same as above.
% \end{quote}
-%
-% The Roman naming\Info{Roman names} system does present some challenges. As long as we do not use \cmd{\CapThis}, we do not need alternate formatting (Section~\ref{sec:AltFormat}). Earlier we treated \LCicero[Marcus Tullius] as a Western name. Now we show how to handle Roman names more properly.
-%
-% Roman names have a \textit{praenomen}, a personal name, then a \textit{nomen}, a clan name, followed by a \textit{cognomen}, a ``nickname,'' except it could be inherited from one's father to denote clan branches. Added to that are \textit{agnomina}, affixed names.
-%
-% Popular\Info{popular works} sources tend to treat the \textit{cognomen} as we might a surname, with the indexed form: \ShowIdxPageref*[\meta{praenomen} \meta{nomen}]{\meta{cognomen} \meta{agnomen}}.\footnote{See Geiss, \textit{Geschichte Griffbereit}; Kinder and Hilgemann, \textit{dtv-Atlas zur Weltgeschichte}, 2 vols., 29th printing (1964; Munich: Deutscher Taschenbuch Verlag, 1993). For further resources see: \url{http://books.infotoday.com/books/Indexing-names.shtml}. See also \url{https://en.wikipedia.org/wiki/Roman_naming_conventions}.}
-% We want all names in the index, so we define macros in \meta{FNN} and \meta{SNN} that expand to become one or two components: \textit{praenomen} and \textit{nomen}; \textit{cognomen} and \textit{agnomen}. We begin by defining a name with macros using \cmd{\noexpand} to prevent error:
+% \endgroup^^A Local format hook redefinition
+%
+% \newpage
+%
+% \leavevmode\begin{center}\bfseries Roman Names\end{center}
+% \phantomsection
+% \label{page:Romani}
+% Earlier we treated \Name*[M.T.]{Cicero}[Marcus Tullius] as a Western name. Now we handle Roman names properly. The examples below do not use this manual's standard formatting.
+% Roman names have the following format:
+% \begin{itemize}
+% \item A personal name: \textit{praenomen}
+% \item A clan name: \textit{nomen}
+% \item A nickname, often hereditary to denote clan branches: \textit{cognomen}
+% \item Affixed names: \textit{agnomina}
+% \end{itemize}
+%
+% Popular\Info{Popular works} sources tend to treat the \textit{cognomen} as if it were a Western surname.\footnote{See Geiss, \textit{Geschichte Griffbereit}; Kinder and Hilgemann, \textit{dtv-Atlas zur Weltgeschichte}, 2 vols., 29th printing (1964; Munich: Deutscher Taschenbuch Verlag, 1993). See also \href{http://books.infotoday.com/books/Indexing-names.shtml}{this page} on indexing and \href{https://en.wikipedia.org/wiki/Roman_naming_conventions}{Wikipedia} on Roman names.}
+% Using this approach, Roman names have the indexed form:
+% \begin{quote}
+% \ShowIdxPageref*[\meta{praenomen} \meta{nomen}]{\meta{cognomen} \meta{agnomen}}
+% \end{quote}
+%
+% Using \textsf{nameauth}, one can drop both \textit{praenomen} and \textit{nomen} automatically in subsequent uses in the text. We accomplish this by designing names using macros in their arguments. When doing so, here are a few tips:
+%
+% \begin{itemize}
+% \item Use alternate formatting (Sections~\ref{sec:AltFormat}) if the macros in the name arguments will be ``segmented'' in some way, as \cmd{\CapThis} does by separating the first letter from the rest.
+% \item Use \cmd{\noexpand} before the macros in the name arguments if they contain conditional statements. Otherwise one will get spurious index entries.
+% \item Ensure that the default state of any Boolean flags (\texttt{\textbackslash if}\meta{flag}) trigger expansion so that all the desired names appear in the index entry.
+% \end{itemize}
+% We define all macros and conditionals used in naming macro arguments in the preamble. We use \cmd{\noexpand} in the naming macro arguments to prevent error. Since we do not use \cmd{\CapThis} in the examples below, we skip alternate formatting for simplicity, yet we still recommend it.
+%
+%Since we have four name components, we need two Boolean flags to reflect local changes and two global flags to trigger the local changes without affecting the index. We define macros in \meta{FNN} and \meta{SNN} that expand one or two components: \textit{praenomen} and \textit{nomen}, \textit{cognomen} and \textit{agnomen}.
+%
+% \begin{quote}\small
+% \StartNum
+% \begin{verbatim}
%\newif\ifSkipGens
%\newif\ifNoGens
%\newif\ifSkipAgnomen
%\newif\ifNoAgnomen
-%\newcommand*\SCIPi{\ifNoGens Publius\else
-% Publius Cornelius\fi}
-%\newcommand*\SCIPii{\ifNoAgnomen Scipio\else
-% Scipio Africanus\fi}
+%\newcommand*\SCIPi{\ifNoGens
+% Publius\else Publius Cornelius\fi}
+%\newcommand*\SCIPii{\ifNoAgnomen
+% Scipio\else Scipio Africanus\fi}
%\newcommand*\ScipioOnly{\SkipAgnomentrue\Scipio}
-%\renewcommand*\NamesFormat[1]%^^A
-% {\ifSkipGens\NoGenstrue\fi\ifSkipAgnomen\NoAgnomentrue\fi#1%^^A
-% \global\SkipGensfalse\global\SkipAgnomenfalse}
-%\renewcommand*\MainNameHook[1]%^^A
-% {\ifSkipGens\NoGenstrue\fi\ifSkipAgnomen\NoAgnomentrue\fi#1%^^A
-% \global\SkipGensfalse\global\SkipAgnomenfalse}
-% \begin{quote}\small
-% \StartNum
-% \begin{verbatim}
%\begin{nameauth}
% \< Scipio & \noexpand\SCIPi & \noexpand\SCIPii & >
%\end{nameauth}
%\PretagName[\noexpand\SCIPi]{\noexpand\SCIPii}{Scipio Africanus}\end{verbatim}
% \end{quote}
%
-% We define the flags and macros by which the name will change. The global state of \cmd{\NoGens} and\cmd{\NoAgnomen} determine the index form. The local scope in the formatting hooks allows changes that are reset when exiting that scope. The logic is inverted; false prints long, true prints short:
+% We begin a new scope below, redefining the formatting hooks (Section~\ref{sec:Formatting}), which affect only names printed in the text. If the local Boolean flags are false, one gets longer name forms. If the flags are true, one gets shorter forms. This approach allows the global state of the flags to be false by default, meaning that one need not remember to set any of them true in the preamble. That results in one less thing to remember, and one less problem to fix.
+%\begingroup^^A Local format hook redefinition
+%\renewcommand*\NamesFormat[1]^^A
+% {\ifSkipGens\NoGenstrue\fi\ifSkipAgnomen\NoAgnomentrue\fi#1^^A
+% \global\SkipGensfalse\global\SkipAgnomenfalse}
+%\renewcommand*\MainNameHook[1]^^A
+% {\ifSkipGens\NoGenstrue\fi\ifSkipAgnomen\NoAgnomentrue\fi#1^^A
+% \global\SkipGensfalse\global\SkipAgnomenfalse}
% \begin{quote}\small
% \ContinueNum
% \begin{verbatim}
-%\newif\ifSkipGens
-%\newif\ifNoGens
-%\newif\ifSkipAgnomen
-%\newif\ifNoAgnomen
-%\newcommand*\SCIPi{\ifNoGens Publius\else
-% Publius Cornelius\fi}
-%\newcommand*\SCIPii{\ifNoAgnomen Scipio\else
-% Scipio Africanus\fi}
-%\newcommand*\ScipioOnly{\SkipAgnomentrue\Scipio}
-%\renewcommand*\NamesFormat[1]%^^A
+%\renewcommand*\NamesFormat[1]
% {\ifSkipGens\NoGenstrue\fi\ifSkipAgnomen\NoAgnomentrue\fi#1%
% \global\SkipGensfalse\global\SkipAgnomenfalse}
-%\renewcommand*\MainNameHook[1]%^^A
+%\renewcommand*\MainNameHook[1]
% {\ifSkipGens\NoGenstrue\fi\ifSkipAgnomen\NoAgnomentrue\fi#1%
% \global\SkipGensfalse\global\SkipAgnomenfalse}\end{verbatim}
-%\smallskip
-% \ForgetThis\ScipioOnly\ \cmd{\ScipioOnly} was born around 236 \textsc{bc} into the Scipio branch of the Cornelius clan, one of six large patrician clans. \ScipioOnly\ \cmd{\ScipioOnly} rose to military fame during the Second Punic War. Thereafter he was known as \Scipio\ \cmd{\Scipio}.
% \end{quote}
-%
-% An advantage of the popular format is that one can drop both \textit{praenomen} and \textit{nomen} automatically in subsequent uses. Yet in any case, one can define helper macros to change Boolean flags. The raw index entry is fairly lengthy by necessity, governed by the global state of the Boolean flags, and expanding to:
+%
+% The index always shows the name determined by the global state of \cmd{\NoGens} and \cmd{\NoAgnomen}, which we set up as false, meaning a maximally long name form. In the body text we have:
% \begin{quote}\small
-% \ShowIdxPageref[\noexpand\SCIPi]{\noexpand\SCIPii}
+% \ForgetThis\ScipioOnly\ \cmd{\ScipioOnly} was born around 236 \textsc{bc} into the Scipio branch of the Cornelius clan, one of six large patrician clans. \ScipioOnly\ \cmd{\ScipioOnly} rose to military fame during the Second Punic War. Thereafter he was known as \Scipio\ \cmd{\Scipio}.
% \end{quote}
-%
-% The\Info{scholarly works} \textit{Oxford Classical Dictionary} and other scholarly sources index under the \textit{nomen}. That requires a similar approach, but it moves the \textit{nomen} from \meta{FNN} to \meta{SNN}. Although we will not index the name, we will show how to set up \SkipGenstrue\Scipio\ to work in that alternate configuration.
-% \newpage
-%
-% We keep the Boolean flags and formatting hooks from above. We redefine the name in the following manner:
+%
+% Below we show more information about popular name forms by way of comparison with scholarly name forms.\medskip
+%
+% The\Info{Scholarly works} \textit{Oxford Classical Dictionary} and other scholarly sources index according to the \textit{nomen}. That approach moves the \textit{nomen} from \meta{FNN} to \meta{SNN}. They have the the indexed form:
+% \begin{quote}
+% \ShowIdxPageref*[\meta{praenomen}]{\meta{nomen} \meta{cognomen} \meta{agnomen}}
+% \end{quote}
+%
+% The two methods do not clash \textit{per se} in the text, but they make incompatible index entries. In this case, since we have indexed \ScipioOnly\ under the popular form above, we use \cmd{\ExcludeName} to exclude the scholarly form below.
+%
+% In the document preamble we define the following Boolean flags and macros. We use a nested conditional in \meta{SNN}. The default still is to show all names so that they can be indexed that way:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
+%\newif\ifSkipGens % These flags remain the same as above.
+%\newif\ifNoGens
+%\newif\ifSkipAgnomen
+%\newif\ifNoAgnomen
+%\global\def\CSA{\ifNoGens\ifNoAgnomen
+% Scipio\else
+% Scipio Africanus\fi
+% \else\ifNoAgnomen
+% Cornelius Scipio\else
+% Cornelius Scipio Africanus\fi\fi}
+%\ExcludeName[Publius]{\noexpand\CSA}
%\begin{nameauth}
-% \< OScipio & Publius & \noexpand\CSA & >
+% \< OScipio & Publius & \noexpand\CSA & > % O for Oxford
%\end{nameauth}
%\PretagName[Publius]{\noexpand\CSA}{Cornelius Scipio Africanus}\end{verbatim}
% \end{quote}
-%
-%\newcommand*\CSA{\ifNoGens
-% \ifNoAgnomen
-% Scipio\else
-% Scipio Africanus\fi
-% \else\ifNoAgnomen
-% Cornelius Scipio\else
-% Cornelius Scipio Africanus\fi\fi}
-% \ExcludeName[Publius]{\noexpand\CSA}
-% We use a nested conditional in \meta{SNN}. The default still is to show all names so that they can be indexed that way. This time we decided to index under the popular form instead of the scholarly one, so we exclude the scholarly form:
-% \begin{quote}\small
-% \StartNum
-% \begin{verbatim}
-%\newcommand*\CSA{\ifNoGens
-% \ifNoAgnomen
-% Scipio\else
-% Scipio Africanus\fi
-% \else\ifNoAgnomen
-% Cornelius Scipio\else
-% Cornelius Scipio Africanus\fi\fi}
-%\ExcludeName[Publius]{\noexpand\CSA}\end{verbatim}
-% \end{quote}
-%
-% The scholarly form has a different name pattern, so it is not compatible with the popular version. Nevertheless, we show what the raw index entry of the scholarly form would be. We include some of the more meaningful forms of both versions:
-% \begin{quote}\small
-% \cmd{\ShowPattern[Publius]\{}\cmd{\noexpand}\cmd{\CSA\}}:\\
-% \hbox{}\quad \ShowPattern[Publius]{\noexpand\CSA}
-%
-% \cmd{\ShowIdxPageref[Publius]\{}\cmd{\noexpand}\cmd{\CSA\}}:\\
-% \hbox{}\quad \ShowIdxPageref[Publius]{\noexpand\CSA}
-%
-% \textbf{First use:}\\[0.5ex]
-% \cmd{\OScipio}:\quad \OScipio\\
-% \cmd{\Scipio\ }:\quad \ForgetThis\Scipio
-%
-% \textbf{Subsequent use:}\\[0.5ex]
-% \hphantom{\cmd{\SkipGenstrue}}\cmd{\OScipio}:\quad \OScipio\\
-% \cmd{\SkipGenstrue}\cmd{\OScipio}:\quad \SkipGenstrue\OScipio\\
-% \hphantom{\cmd{\SkipGenstrue}}\cmd{\Scipio\ }:\quad \SkipGenstrue\Scipio
-%
-% \textbf{Subsequent use, full, no \textit{agnomen}:}\\[0.5ex]
-% \cmd{\SkipAgnomentrue}\cmd{\LOScipio}:\quad \SkipAgnomentrue\LOScipio\\
-% \cmd{\SkipAgnomentrue}\cmd{\LScipio\ }:\quad \SkipAgnomentrue\LScipio
-%
-% \textbf{Subsequent use, shortest forms:}\\[0.5ex]
-% \hphantom{\cmd{\SkipGenstrue}}\cmd{\SkipAgnomentrue}\cmd{\OScipio}:\quad \SkipAgnomentrue\OScipio\\
-% \cmd{\SkipGenstrue}\cmd{\SkipAgnomentrue}\cmd{\OScipio}:\quad \SkipGenstrue\SkipAgnomentrue\OScipio\\
-% \hphantom{\cmd{\SkipGenstrue}}\cmd{\SkipAgnomentrue}\cmd{\Scipio\ }:\quad \SkipAgnomentrue\Scipio
-%
-% \textbf{Subsequent use, personal name:}\\[0.5ex]
-% \hphantom{\cmd{\SkipGenstrue}}\cmd{\SOScipio}:\quad \SOScipio\\
-% \cmd{\SkipGenstrue}\cmd{\SScipio\ }:\quad \SkipGenstrue\SScipio
-% \end{quote}
-%
-% See Sections~\ref{sec:ErrorProt}, \ref{sec:AltFormat}, and \ref{sec:Hooks} for more guidance on avoiding errors when using name arguments that contain macros.
-% \endgroup
-%
-% \ReturnLink
-% \newpage
%
-% \subsection{Basic Formatting}
-% \label{sec:Formatting}
+% We keep the same formatting macros that we defined above. By the way, these formatting macros could work with regular names as well as Roman names, e.g., \LDem, because they have no side effects.
%
-% Below are many of the forms and formats that names can have:
-%
-% \ifDoTikZ
-% \begin{tcolorbox}[colframe=naslate,sidebyside,lower separated=true,adjusted title={\hfil Full Forms, Front Matter\hspace{5em} Short Forms, Front matter}]\centering
-% {\cmd{\NamesInactive}}\NamesInactive
-% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil First Use (Default)}]\small
-% \begin{tabular}{@{}ll@{}}
-% \cmd{\Name} & \ForgetThis\Pat\\
-% & \ForgetThis\Eliz\\
-% & \ForgetThis\Yamt\\
-% \cmd{\Name*} & \ForgetThis\LPat\\
-% \cmd{\FName} & \ForgetThis\SPat\\
-% \end{tabular}
-% \end{tcolorbox}
-% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (\texttt{*} or \cmd{\L}\meta{macro})}]\small
-% \begin{tabular}{@{}ll@{}}
-% \cmd{\Name*} & \LPat\\
-% & \LEliz\\
-% & \LYamt\\
-% \end{tabular}
-% \end{tcolorbox}
-% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Long, with \cmd{\DropAffix}}]\small
-% \begin{tabular}{@{}ll@{}}
-% \cmd{\DropAffix}\cmd{\LPat}\\ \SubvertThis\DropAffix\LPat\\
-% \end{tabular}
-% \end{tcolorbox}
-% \tcblower\centering
-% {\cmd{\NamesInactive}}\NamesInactive
-% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (Default)}]\small
-% \begin{tabular}{@{}ll@{}}
-% \cmd{\Name} & \SubvertThis\Pat; \SubvertThis\Eliz\\
-% & \SubvertThis\Yamt\\
-% \cmd{\FName}, & \SubvertThis\SPat; \SubvertThis\SEliz\\
-% \cmd{\S}\meta{macro} & \SubvertThis\SYamt\\
-% \end{tabular}
-% \end{tcolorbox}\vspace{1.4ex}
-% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (\cmd{\ForceName})}]\small
-% \begin{tabular}{@{}ll@{}}
-% \cmd{\Name} & \SubvertThis\ForceName\Pat; \SubvertThis\ForceName\Eliz\\
-% & \SubvertThis\ForceName\Yamt\\
-% \cmd{\FName}, & \SubvertThis\ForceName\SPat; \SubvertThis\ForceName\SEliz\\
-% \cmd{\S}\meta{macro} & \SubvertThis\ForceName\SYamt\\
-% \end{tabular}
-% \end{tcolorbox}\vspace{1.4ex}
-% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (\cmd{\ForceFN})}]\small
-% \begin{tabular}{@{}ll@{}}
-% \cmd{\FName}, \cmd{\S}\meta{macro} & \SubvertThis\ForceFN\SYamt\\
-% \end{tabular}
-% \end{tcolorbox}
-% \end{tcolorbox}
-% \vfil
-% \begin{tcolorbox}[colframe=naslate,sidebyside,lower separated=true,adjusted title={\hfil Full Forms, Main Matter\hspace{5em} Short Forms, Main Matter}]\centering
-% {\cmd{\NamesActive}}\NamesActive
-% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil First Use (Default)}]\small
-% \begin{tabular}{@{}ll@{}}
-% \cmd{\Name} & \ForgetThis\Pat\\
-% & \ForgetThis\Eliz\\
-% & \ForgetThis\Yamt\\
-% \cmd{\Name*} & \ForgetThis\LPat\\
-% \cmd{\FName} & \ForgetThis\SPat\\
-% \end{tabular}
-% \end{tcolorbox}
-% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (\texttt{*} or \cmd{\L}\meta{macro})}]\small
-% \begin{tabular}{@{}ll@{}}
-% \cmd{\Name*} & \LPat\\
-% & \LEliz\\
-% & \LYamt\\
-% \end{tabular}
-% \end{tcolorbox}
-% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Long, with \cmd{\DropAffix}}]\small
-% \begin{tabular}{@{}ll@{}}
-% \cmd{\DropAffix}\cmd{\LPat}\\ \SubvertThis\DropAffix\LPat\\
-% \end{tabular}
-% \end{tcolorbox}
-% \tcblower\centering
-% {\cmd{\NamesActive}}\NamesActive
-% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (Default)}]\small
-% \begin{tabular}{@{}ll@{}}
-% \cmd{\Name} & \SubvertThis\Pat; \SubvertThis\Eliz\\
-% & \SubvertThis\Yamt\\
-% \cmd{\FName}, & \SubvertThis\SPat; \SubvertThis\SEliz\\
-% \cmd{\S}\meta{macro} & \SubvertThis\SYamt\\
-% \end{tabular}
-% \end{tcolorbox}\vspace{1.4ex}
-% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (\cmd{\ForceName})}]\small
-% \begin{tabular}{@{}ll@{}}
-% \cmd{\Name} & \SubvertThis\ForceName\Pat; \SubvertThis\ForceName\Eliz\\
-% & \SubvertThis\ForceName\Yamt\\
-% \cmd{\FName}, & \SubvertThis\ForceName\SPat; \SubvertThis\ForceName\SEliz\\
-% \cmd{\S}\meta{macro} & \SubvertThis\ForceName\SYamt\\
-% \end{tabular}
-% \end{tcolorbox}\vspace{1.4ex}
-% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (\cmd{\ForceFN})}]\small
-% \begin{tabular}{@{}ll@{}}
-% \cmd{\FName}, \cmd{\S}\meta{macro} & \SubvertThis\ForceFN\SYamt\\
-% \end{tabular}
-% \end{tcolorbox}
-% \end{tcolorbox}
-% \else\bigskip
-% \begin{center}\small\NamesInactive
-% \begin{tabular}{@{\hspace{4em}}c@{\hspace{6em}}c}
-% Full Forms, Front Matter & Short Forms, Front Matter\\
-% \cmd{\NamesInactive} & \cmd{\NamesInactive}\medskip\\
-% \end{tabular}
-%
-% \begin{tabular}{llll}\toprule
-% \cmd{\Name} & \ForgetThis\Pat & \cmd{\Name} & \SubvertThis\Pat, \SubvertThis\Eliz\\
-% & \ForgetThis\Eliz & & \SubvertThis\Yamt\\
-% & \ForgetThis\Yamt & \cmd{\FName}, & \SubvertThis\SPat; \SubvertThis\SEliz\\
-% \cmd{\Name*} & \ForgetThis\LPat & \cmd{\S}\meta{macro} & \SubvertThis\SYamt\\
-% \cmd{\FName} & \ForgetThis\SPat & \\\midrule
-% & & Using \cmd{\ForceName} \\
-% \cmd{\Name*}, & \LPat & \cmd{\Name} & \SubvertThis\ForceName\Pat; \SubvertThis\ForceName\Eliz\\
-% \cmd{\L}\meta{macro} & \LEliz & & \SubvertThis\ForceName\Yamt\\
-% & \LYamt & \cmd{\FName}, & \SubvertThis\ForceName\SPat; \SubvertThis\ForceName\SEliz\\
-% & & \cmd{\S}\meta{macro} & \SubvertThis\ForceName\SYamt\\\midrule
-% & & Using \cmd{\ForceFN} \\
-% \cmd{\DropAffix}\cmd{\LPat} & \SubvertThis\DropAffix\LPat & \cmd{\FName}, \cmd{\S}\meta{macro} & \SubvertThis\ForceFN\SYamt\\\bottomrule% \end{tabular}
-% \end{center}\bigskip
-% \begin{center}\small\NamesActive
-% \begin{tabular}{@{\hspace{4em}}c@{\hspace{6em}}c}
-% Full Forms, Main Matter & Short Forms, Main Matter\\
-% \cmd{\NamesActive} & \cmd{\NamesActive}\medskip\\
-% \end{tabular}
-%
-% \begin{tabular}{llll}\toprule
-% \cmd{\Name} & \ForgetThis\Pat & \cmd{\Name} & \SubvertThis\Pat; \SubvertThis\Eliz\\
-% & \ForgetThis\Eliz & & \SubvertThis\Yamt\\
-% & \ForgetThis\Yamt & \cmd{\FName}, & \SubvertThis\SPat; \SubvertThis\SEliz\\
-% \cmd{\Name*} & \ForgetThis\LPat & \cmd{\S}\meta{macro} & \SubvertThis\SYamt\\
-% \cmd{\FName} & \ForgetThis\SPat & \\\midrule
-% & & Using \cmd{\ForceName} \\
-% \cmd{\Name*}, & \LPat & \cmd{\Name} & \SubvertThis\ForceName\Pat; \SubvertThis\ForceName\Eliz\\
-% \cmd{\L}\meta{macro} & \LEliz & & \SubvertThis\ForceName\Yamt\\
-% & \LYamt & \cmd{\FName}, & \SubvertThis\ForceName\SPat; \SubvertThis\ForceName\SEliz\\
-% & & \cmd{\S}\meta{macro} & \SubvertThis\ForceName\SYamt\\\midrule
-% & & Using \cmd{\ForceFN} \\
-% \cmd{\DropAffix}\cmd{\LPat} & \SubvertThis\DropAffix\LPat & \cmd{\FName}, \cmd{\S}\meta{macro} & \SubvertThis\ForceFN\SYamt\\\bottomrule
+% The scholarly form of Roman names has a different name pattern, so it is not compatible with the popular version. Nevertheless, we show what the index entries would be in a normal \LaTeX\ document without hyperlinks. Since we have excluded the scholarly form in order to suppress any spurious index entries, we only index the popular form below:
+%
+% \begin{center}\footnotesize\IndexActual{@}
+% \begin{tabular}{ll}
+% \multicolumn{2}{l}{\small\textbf{Simplified Name Patterns:}}\\
+% Scholarly: & \texttt{\ShowPattern[Publius]{\noexpand\CSA}}\\
+% Popular: & \texttt{\ShowPattern[\noexpand\SCIPi]{\noexpand\SCIPii}}\\[2ex]
+%
+% \multicolumn{2}{l}{\small\textbf{Full Index Entries:}}\\
+% \UntagName[Publius]{\noexpand\CSA}^^A
+% \UntagName[\noexpand\SCIPi]{\noexpand\SCIPii}^^A
+% Scholarly: & \texttt{\ShowIdxPageref[Publius]{\noexpand\CSA}}\\
+% Popular: & \texttt{\ShowIdxPageref[\noexpand\SCIPi]{\noexpand\SCIPii}}^^A
+% \TagName[Publius]{\noexpand\CSA}{\string|hyperpage}^^A
+% \TagName[\noexpand\SCIPi]{\noexpand\SCIPii}{\string|hyperpage}\\[2ex]
+%
+% \multicolumn{2}{l}{\small\textbf{Basic Index Entries:}}\\
+% \UntagName[Publius]{\noexpand\CSA}^^A
+% Scholarly: & \ShowIdxPageref*[Publius]{\noexpand\CSA}\\
+% Popular: & \ShowIdxPageref*[\noexpand\SCIPi]{\noexpand\SCIPii}^^A
+% \TagName[Publius]{\noexpand\CSA}{\string|hyperpage}\\
% \end{tabular}
% \end{center}
-% \fi
-% \newpage
-%
-% These formatting features of \textsf{nameauth} can work with name control macros (Section~\ref{sec:NameControl}) in, for example, \textsf{beamer} overlays to define consistently the context and outcome of how names appear. There are two kinds of formatting at work that interact with each other:
-% \begin{enumerate}\small
-% \item \emph{Syntactic Formatting:} Reversing and caps normally occur only in the body text, not the index. Yet macros in name arguments affect both text and index.
-% \item \emph{Name Post-Processing:} Hook macros apply formatting only to the printed form of a name after parsing. See also Section~\ref{sec:Hooksiii}.
-% \end{enumerate}
-%
-% \DescribeMacro{\NamesFormat}
-% Independent ``main-matter'' and ``front-matter'' systems are used to format first and subsequent name uses.
-% \DescribeMacro{\MainNameHook}
-% The main-matter system uses \cmd{\NamesFormat} to post-process first occurrences of names and \cmd{\MainNameHook} for subsequent uses.
-% \DescribeMacro{\FrontNamesFormat}
-% The front-matter system uses \cmd{\FrontNamesFormat} for first uses and
-% \DescribeMacro{\FrontNameHook}
-% \cmd{\FrontNameHook} for subsequent uses. The \texttt{alwaysformat} option\Version{2.5} causes only \cmd{\NamesFormat} and \cmd{\FrontNamesFormat} to be used (cf. Section~\ref{sec:NamePatterns}).\footnote{The names of these macros may seem poorly conceived. When starting work on this package, this author was ignorant of the breadth of how names might be handled. Designed to meet the needs of a master's thesis, this package has evolved to meet the needs of several published works. At one time, \cmd{\NamesFormat} was the only macro that did any formatting. The rest came later. A certain degree of cargo cult programming arose, to be corrected in the 3.0 series of \textsf{nameauth}.}\medskip
-%
-% \DescribeMacro{\NamesActive}
-% \cmd{\NamesInactive} and the \texttt{frontmatter} option make names use the front matter system. \cmd{\NamesActive} switches names to the main matter system.
-% \DescribeMacro{\NamesInactive}\medskip
-%
-% These\Info{\cmd{\global}} two macros can be used explicitly as a pair or singly within an explicit local scope. Use \cmd{\global} to force a global effect.\medskip
-%
-% The two formatting systems are distinct, useful for front matter and main matter, text and footnotes, etc. We show this with different colors:
-% \begin{quote}\small
-% \StartNum
-% \begin{verbatim}
-%\colorlet{nared}{red!50!black}
-%\colorlet{nagreen}{green!35!black}
-%\colorlet{nablue}{blue!50!black}
-%\colorlet{nabrown}{brown!55!black}
-%\renewcommand*\FrontNamesFormat[1]{\color{nared}\sffamily #1}
-%\renewcommand*\FrontNameHook[1]{\color{nagreen}\sffamily #1}
-%\renewcommand*\NamesFormat[1]{\color{nablue}\sffamily #1}
-%\renewcommand*\MainNameHook[1]{\color{nabrown}\sffamily #1}\end{verbatim}
-% \end{quote}
%
-% \begin{center}\small\MyStretch
-% \NamesInactive
-% \begin{tabular}{ll}\toprule
-% Front-matter system: & \cmd{\NamesInactive}\\\midrule
-% |\Name[Rudolph]{Carnap}| & \Name[Rudolph]{Carnap}\\
-% \rowcolor{black!7!white}|\Name[Rudolph]{Carnap}| & \Name[Rudolph]{Carnap}\\
-% |\Name[Nicolas]{Malebranche}| & \Name[Nicolas]{Malebranche}\\
-% \rowcolor{black!7!white}|\Name[Nicolas]{Malebranche}| & \Name[Nicolas]{Malebranche}\\\bottomrule
-% \end{tabular}\vfil
+% Below we compare some differences between the scholarly and popular forms, and how to get equivalent forms in the text while understanding that they would be two separate forms in the index.
%
-% \NamesActive
-% \begin{tabular}{ll}\toprule
-% Main-matter system: & \cmd{\NamesActive}\\\midrule
-% |\Name[Rudolph]{Carnap}| & \Name[Rudolph]{Carnap}\\
-% \rowcolor{black!7!white}|\Name[Rudolph]{Carnap}| & \Name[Rudolph]{Carnap}\\
-% |\Name[Nicolas]{Malebranche}| & \Name[Nicolas]{Malebranche}\\
-% \rowcolor{black!7!white}|\Name[Nicolas]{Malebranche}| & \Name[Nicolas]{Malebranche}\\\bottomrule
+% \begin{center}\footnotesize
+% \begin{tabular}{p{0.51\textwidth}l}
+% \multicolumn{2}{l}{\small\textbf{First use:}}\\
+% scholarly:\dotfill \cmd{\OScipio} & \OScipio\\
+% popular:\dotfill \cmd{\Scipio} & \ForgetThis\Scipio\\[2ex]
+%
+% \multicolumn{2}{l}{\small\textbf{Subsequent use:}}\\
+% scholarly:\dotfill \cmd{\OScipio} & \OScipio\\
+% scholarly:\dotfill \cmd{\SkipGenstrue}\cmd{\OScipio} & \SkipGenstrue\OScipio\\
+% popular:\dotfill \cmd{\Scipio} & \SkipGenstrue\Scipio\\[2ex]
+%
+% \multicolumn{2}{l}{\small\textbf{Subsequent use, full, no \textit{agnomen}:}}\\
+% scholarly:\dotfill \cmd{\SkipAgnomentrue}\cmd{\LOScipio} & \SkipAgnomentrue\LOScipio\\
+% popular:\dotfill \cmd{\SkipAgnomentrue}\cmd{\LScipio} & \SkipAgnomentrue\LScipio\\[2ex]
+%
+% \multicolumn{2}{l}{\small\textbf{Subsequent use, shortest forms:}}\\
+% scholarly:\dotfill \cmd{\SkipAgnomentrue}\cmd{\OScipio} & \SkipAgnomentrue\OScipio\\
+% \hfill\cmd{\SkipGenstrue}\cmd{\SkipAgnomentrue}\cmd{\OScipio} & \SkipGenstrue\SkipAgnomentrue\OScipio\\
+% popular:\dotfill \cmd{\SkipAgnomentrue}\cmd{\Scipio\ } & \SkipAgnomentrue\Scipio\\[2ex]
+%
+% \multicolumn{2}{l}{\small\textbf{Subsequent use, personal name:}}\\
+% scholarly:\dotfill \cmd{\SOScipio} & \SOScipio\\
+% popular:\dotfill \cmd{\SScipio} & \SScipio\\
+% popular:\dotfill \cmd{\SkipGenstrue}\cmd{\SScipio} & \SkipGenstrue\SScipio
% \end{tabular}
% \end{center}
-% \newpage
-%
-% \DescribeMacro{\ForceName}
-% Use this prefix macro to force ``first use'' formatting for the next \cmd{\Name}, etc. This will not force a full name reference like \cmd{\ForgetThis}.\Version{3.1} One must use the \texttt{formatAKA} option when using this with \cmd{\AKA}, etc. We show \cmd{\ForceName} in Sections~\ref{sec:NameControl}, \ref{sec:AKA}, and~\ref{sec:Hooksii}.\medskip
+% \endgroup^^A Local format hook redefinition
%
-% Below\Info{\texttt{alwaysformat}} we simulate the \texttt{alwaysformat} option by manipulating the package internals. Using first-use hooks will not force full name references. This option made more sense when \cmd{\NamesFormat} was the only formatting hook.
-% \makeatletter\@nameauth@AlwaysFormattrue\makeatother%
-% \ForgetName[M.T.]{Cicero}\ForgetName{Elizabeth, I}%
-% \begin{itemize}
-% \item \NamesInactive Using \texttt{alwaysformat} in the front matter will produce: \Name[Albert]{Einstein}, then \Name[Albert]{Einstein}; \Name{Confucius}, then \Name{Confucius}.
-% \item \global\NamesActive Using \texttt{alwaysformat} in the main matter will produce: \Name[M.T.]{Cicero}[Marcus Tullius], then \Name[M.T.]{Cicero}[Marcus Tullius]; \Name{Elizabeth, I}, then \Name{Elizabeth, I}.
-% \end{itemize}
-% \makeatletter\@nameauth@AlwaysFormatfalse\makeatother
-%
-% The internal\Info{hook caveats} hook dispatcher calls the formatting hooks using the pattern \cmd{\bgroup}\meta{Hook}\texttt{\{\#1\}}\cmd{\egroup}. Thus one can use, e.g., \cmd{\itshape} in a local scope. One also can use macros that take one argument (cf. Section~\ref{sec:Hooksiii}), e.g., |\renewcommand*\NamesFormat{\sffamily\color{nablue}\textit}| will create\break the forms \bgroup\renewcommand*\NamesFormat{\sffamily\color{nablue}\textit}\ForgetThis\Einstein\ and \Einstein.\egroup\medskip
-%
-% The\Info{applied to\break footnotes} independent systems or ``species'' of names fit independent text elements, like front matter or even footnotes. Names in the body text, such as \Name[John Maynard]{Keynes}, also affect names in the footnotes.\footnote{We have \Name[John Maynard]{Keynes} from \cmd{\Name}\texttt{[John Maynard]\{Keynes\}} instead of \ForgetThis\Name[John Maynard]{Keynes}.}
-% In footnote \arabic{footnote} \cmd{\MainNameHook} is called instead of \cmd{\NamesFormat} because \Name[John Maynard]{Keynes} already had occurred above.
-%
-% If we wanted to format names differently in the footnotes than in the body text, an easy way to do that is to use the front-matter system. For example:
-%
-% \makeatletter
-% \let\@oldfntext\@makefntext
-% \long\def\@makefntext#1{\NamesInactive\@oldfntext{#1}\NamesActive}
-% \makeatother
-% \begin{quote}\small
-% \StartNum
-% \begin{verbatim}
-%\makeatletter
-% \let\@oldfntext\@makefntext
-% \long\def\@makefntext#1{\NamesInactive\@oldfntext{#1}\NamesActive}
-%\makeatother\end{verbatim}
-% \end{quote}
-%
-% When we create another footnote, we see very different results.\footnote{We have \Name[John Maynard]{Keynes} from \cmd{\Name}\texttt{[John Maynard]\{Keynes\}}, then \Name[John Maynard]{Keynes}.}
-% Footnote \arabic{footnote} shows a completely independent formatting. One also can synchronize the two systems with \cmd{\ForgetThis} and \cmd{\SubvertThis} (Section~\ref{sec:NameDecisions} and its subsections).
-%
-% To finish this example, we change footnotes back to normal:
-% \begin{quote}\small
-% \ContinueNum
-% \begin{verbatim}
-%\makeatletter
-%\let\@makefntext\@oldfntext
-%\makeatother\end{verbatim}
-% \end{quote}
-% \makeatletter\let\@makefntext\@oldfntext\makeatother
-%
-% Of cource, one can force long and short forms as needed (Section~\ref{sec:NameControl}). Yet the main point of \textsf{nameauth} is to do the complex work once, then use that in automated fashion for the rest of the document.
-%
% \ReturnLink
-% \newpage
-%
-% \subsection{Alternate Formatting}
-% \label{sec:AltFormat}
-% \begingroup\AltFormatActive
-%
-% \noindent The formatting hooks only affect names in the body text. Continental formatting occurs in both the text and in the index. One needs to format those names with macros in the name arguments. The basic way formats names in both text and index. The advanced way allows changes in the text, but keeps the index consistent.
-%
-% \subsubsection{Basic Features}
-% \label{sec:AltBasic}
-%
-%Section~\ref{sec:ErrorProt} showed us that changing a control sequence will change the index entry of a name, even if one cannot see differences on the page. Alternate formatting helps one avert spurious index entries.
-%
-% Using,\Warn{} e.g., \cmd{\Name\{}\cmd{\textsc\{a Name, Problem\}\}} will halt \LaTeX\ because the comma tries to break \cmd{\textsc} and its argument into two elements. We fix that with: \cmd{\Name\{}\cmd{\textsc\{a Name\},} \cmd{\textsc\{Problem\}\}}. Yet \cmd{\CapThis} still needs alternate formatting, given that \cmd{\textsc} is robust (Section~\ref{sec:AltAdvanced}).\footnote{Pre-version 3.1 methods of Continental formatting should work if one uses the \texttt{altformat} option or \cmd{\AltFormatActive} to protect against the default behavior of \cmd{\CapThis}.}\medskip
-%
-% \DescribeMacro{\AltFormatActive}
-% Both the \texttt{altformat} option and \cmd{\AltFormatActive} enable and activate alternate formatting. Both cause \cmd{\CapThis} to work via \cmd{\AltCaps} instead of the normal way. \cmd{\AltFormatActive} countermands \cmd{\AltFormatActive*}.
-% \begin{itemize}
-% \item \emph{Enabled} means that the alternate formatting mechanism inhibits the normal behavior of \cmd{\CapThis}.
-% \item \emph{Activated} means that \cmd{\textSC} and other alternate formatting macros (see below) format their arguments. When deactivated, they do not format their arguments.
-% \end{itemize}
-%
-% At\Version{3.1} the start of this section we used \cmd{\AltFormatActive} to enable alternate formatting and ``switch on'' the alternate formatting macros. That is the basic set of conditions for the simple use of alternate formatting. \medskip
-%
-% \DescribeMacro{\AltFormatActive*}
-% The starred form \cmd{\AltFormatActive*} enables alternate formatting but deactivates the special formatting macros, preventing them from changing their arguments. It countermands both the \texttt{altformat} option and \cmd{\AltFormatActive}. It causes \cmd{\CapThis} only to work via \cmd{\AltCaps}.\medskip
+% \vfill
%
-% \DescribeMacro{\AltFormatInactive}
-% To both disable alternate formatting and deactivate the alternate formatting macros, use \cmd{\AltFormatInactive}. This reverts globally to standard formatting and the normal function of \cmd{\CapThis}.
-%
-% \begin{center}
-% \begin{tabular}{lcc}
-% & Enabled & Activated\\\midrule
-% \cmd{\AltFormatActive} & \YES & \YES\\
-% \cmd{\AltFormatActive*} & \YES & \NO\\
-% \cmd{\AltFormatInactive} & \NO & \NO\\\bottomrule
-% \end{tabular}
-% \end{center}
-%
-% On the next page we describe the formatting macros that are built in to \textsf{nameauth} in order to use the basic features of alternate formatting and provide a foundation for the advanced features. One should use \cmd{\PretagName} (Section~\ref{sec:IndexSort}) to sort the related index entries for these names.
+% \begin{verse}
+% Oft fühl ich jetzt \dots [und] je tiefer ich einsehe, dass\\
+% Schicksal und Gemüt Namen eines Begriffes sind.\\[1ex]\hfill---\Name{Novalis}, \textit{Heinrich von Ofterdingen}
+% \end{verse}
% \newpage
%
-% \DescribeMacro{\textSC}
-% Continental formatting can be as simple as using the short macro \cmd{\textSC}. Three other macros also implement alternate formatting.
-% \DescribeMacro{\textIT}
-% These macros make changes only when alternate formatting is active.
-% \DescribeMacro{\textBF}
-% We sort the index entry with \cmd{\PretagName} and demonstrate the formatting.
-% \DescribeMacro{\textUC}
-% \begin{quote}\small
-% \StartNum
-% \begin{verbatim}
-%\PretagName[Greta]{\textSC{Garbo}}{Garbo, Greta}
-%\PretagName[Ada]{\textIT{Lovelace}}{Lovelace, Ada}
-%\PretagName[Charles]{\textBF{Babbage}}{Babbage, Charles}
-%\PretagName{\textUC{Tokugawa}, Ieyasu}{Tokugawa Ieyasu}\end{verbatim}
-%
-% \smallskip\MyStretch
-% |\Name[Greta]{\textSC{Garbo}}|\dotfill \Name[Greta]{\textSC{Garbo}}; \Name[Greta]{\textSC{Garbo}}\\
-% |\Name[Ada]{\textIT{Lovelace}}|\dotfill \Name[Ada]{\textIT{Lovelace}}; \Name[Ada]{\textIT{Lovelace}}\\
-% |\Name[Charles]{\textBF{Babbage}}|\dotfill \Name[Charles]{\textBF{Babbage}}; \Name[Charles]{\textBF{Babbage}}\\
-% |\Name{\textUC{Tokugawa}, Ieyasu}|\dotfill \Name{\textUC{Tokugawa}, Ieyasu}; \Name{\textUC{Tokugawa}, Ieyasu}
-% \end{quote}
-%
-% Since we switch to Latin Modern Sans in the formatting hooks, the switch to small caps in \Name[Greta]{\textSC{Garbo}} forces a substitution to Latin Modern Roman. This action varies with the font being used.
-%
-% Using basic alternate formatting, these macros \emph{always format their arguments} with the \texttt{altformat} option or \cmd{\AltFormatActive}. Likewise, they \emph{never format their arguments} when \cmd{\AltFormatActive*} is used. To change the formatting of the name arguments, one must use the advanced features. Whenever\Warn{} a naming macro writes to the index, the formatting macros must be in the same Boolean state to avoid spurious index entries. The next section explains more.
-%
-% As with normal formatting, \cmd{\CapName} interacts with alternate formatting only in the text. Thus \CapName\Name*[Greta]{\textSC{Garbo}} instead of \Name[Greta]{\textSC{Garbo}}. \cmd{\RevComma} likewise gives \RevComma\Name*[Ada]{\textIT{Lovelace}}. \cmd{\RevName} produces \RevName\Name*{\textUC{Tokugawa}, Ieyasu}.\medskip
+% \subsection{Indexing Macros}
+% \label{sec:Indexing}
%
-% A comma\Info{comma karma} delimiter splits the mandatory macro argument into a root and an affix. To avoid errors, format the name and suffix separately.
-% \begin{quote}\small
-% \StartNum
-% \begin{verbatim}
-%\PretagName[John David]{\textSC{Rockefeller},\textSC{III}}
-% {Rockefeller, John David 3}
-%\PretagName{\textUC{Fukuyama}, Takeshi}{Fukuyama Takeshi}
-%\begin{nameauth}
-% \< JRIII & John David & \textSC{Rockefeller},\textSC{III} & >
-% \< Fukuyama & & \textUC{Fukuyama}, Takeshi & >
-% \< OFukuyama & & \textUC{Fukuyama} & Takeshi >
-%\end{nameauth}\end{verbatim}
-% \end{quote}
+% The strictness\Version{3.5} of the \textsf{nameauth} indexing macros and the detail of index-related warnings, especially with the \texttt{verbose} option, are comparable to professional indexing software. In addition to the macros below, please see also:
%
-% From above we get \JRIII, then \JRIII. For non-Western names, the new syntax and the older syntax produce the same control sequence that identifies names. Again we are careful to avoid putting the comma delimiter within a container macro.
% \begin{center}\small\MyStretch
-% \begin{tabular}{rl}\toprule
-% |\Fukuyama| & \Fukuyama\\
-% \rowcolor{black!7!white}|\OFukuyama| & \OFukuyama\\
-% |\LOFukuyama| & \LOFukuyama\\
-% \rowcolor{black!7!white}|\Fukuyama| & \Fukuyama\\\bottomrule
-% \end{tabular}
+% \begin{tabular}{ll}\toprule
+% error prevention & page~\pageref{page:IdxErrors}\\
+% \rowcolor{grey}index-related prefix macros & page~\pageref{page:IdxPrefix}\\
+% variant names and cross-references & page~\pageref{page:IdxVariants}\\\bottomrule
+% \end{tabular}
% \end{center}
%
-% Only the new syntax allows one to use alternate names in the text (Section~\ref{sec:FName}). For example, ``|\LFukuyama[Sensei]| \LFukuyama[Sensei] wrote \textit{Nihon Fukuin R\=uteru Ky\=okai Shi} in 1954, after studying in the US in the 1930s.''
-% \newpage
-%
-% \subsubsection{Advanced Features}
-% \label{sec:AltAdvanced}
-%
-% \noindent A more complex version of alternate formatting allows us to make formatting and other changes in the text while keeping the index consistent. In order to do this, we will be using \cmd{\textSC}, \cmd{\textIT}, \cmd{\textBF}, and \cmd{\textUC} with \cmd{\noexpand} and special triggering macros. Below we briefly see the difference:
+% Here also are the general protection rules for the indexing macros:
% \begin{center}\small\MyStretch
-% \begin{tabular}{ll}
-% |\Name[Martin]{\textSC{Luther}}| & {\color{nared}|%| \textit{basic alternate formatting}}\\
-% |\Name[Martin]{\noexpand\textSC{Luther}}| & {\color{nared}|%| \textit{advanced version}}\\
+% \begin{tabular}{c@{\ \ }c@{\ \ }p{0.6\textwidth}}\toprule
+% Permit & Ignore & Attempted Action \\\midrule
+% \NO & \YES & Use \cmd{\IndexRef} with an extant name.\\
+% \YES & \NO & Use \cmd{\SeeAlso}\cmd{\IndexRef} with an extant name.\\
+% \NO & \YES & Create page references to a name after \cmd{\IndexRef} created a cross-reference using that name.\\\midrule
+% \NO & \YES & Try to make the same cross-reference multiple times.\\
+% \NO & \YES & Use \cmd{\IndexName} with a cross-reference.\\
+% \NO & \YES & Use \cmd{\ExcludeName} with a cross-reference.\\
+% \NO & \YES & Use \cmd{\IncludeName} with a cross-reference.\\
+% \YES & \NO & Use \cmd{\IncludeName*} with a cross-reference.\\
+% \YES & \NO & Use \cmd{\PretagName} to sort a cross-reference.\\
+% \NO & \YES & Use \cmd{\TagName} and \cmd{\UntagName} with a cross-reference.\\\bottomrule
% \end{tabular}
-% \end{center}
-% The reason for this approach is that indexing operations occur outside the formatting hooks, never within the hooks, and \cmd{\noexpand} keeps the two separate.
-%
-% \ifDoTikZ
+% \end{center}\smallskip
+%
% \begin{tcolorbox}[colback=white,colframe=nared]
-% \centering Using \cmd{\noexpand} is key to consistent index entries.
-% \end{tcolorbox}\bigskip
-% \else
-% \begin{center}\bfseries Using \cmd{\noexpand} is key to consistent index entries.\end{center}
-% \fi
+% \centering We test \cmd{\ExcludeName\{Gregory, I\}}\ExcludeName{Gregory, I} here. See page~\pageref{page:ExPage}.
+% \end{tcolorbox}
%
-% \cmd{\CapThis}\DescribeMacro{\AltCaps}\ causes \cmd{\AltCaps} to cap its argument only in a formatting hook. It is enabled whenever alternate formatting is enabled. \cmd{\AltCaps} works independently of \cmd{\AltOn} and \cmd{\AltOff}:
-% \begin{quote}
-% \fbox{\mystrut\ \cmd{\noexpand}\cmd{\AltCaps}\marg{Arg} }
-% \end{quote}
-% In the example below we redefine \cmd{\MainNameHook} to suppress formatting:
-% \renewcommand*\MainNameHook{\color{nabrown}\sffamily\AltOff}
-% \begin{quote}\small
-% \StartNum
-% \begin{verbatim}
-%\renewcommand*\MainNameHook%
-% {\color{nabrown}\sffamily\AltOff}% we match the manual
+% \subsubsection[General Macros]{General Indexing Macros}
+% \label{sec:GeneralIndex}
+%
+% \begin{center}\bfseries General Control\end{center}
+% \DescribeMacro{\IndexInactive}
+% \cmd{\IndexInactive} deactivates the indexing functions of the naming macros, \cmd{\IndexName}, and \cmd{\IndexRef}.
+% \DescribeMacro{\IndexActive}
+% \cmd{\IndexActive} enables indexing.
+% These can be used throughout the document.
%
-%\IndexInactive
-%What's in a \Name{\noexpand\AltCaps{a} Name}?
-%\CapThis\Name{\noexpand\AltCaps{a} Name} smells not,
-%but a rose does. We avoid \Name{
-% \noexpand\textSC{\noexpand\AltCaps{a} Name},
-% \noexpand\textSC{Problem}}.
-%\CapThis\Name*{
-% \noexpand\textSC{\noexpand\AltCaps{a} Name},
-% \noexpand\textSC{Problem}} will not occur,
-% even if it smells like a rose.\end{verbatim}
-%
-% \smallskip\IndexInactive
-% What's in a \Name{\noexpand\AltCaps{a} Name}?
-% \CapThis\Name{\noexpand\AltCaps{a} Name} smells not,
-% but a rose does. We avoid \Name{
-% \noexpand\textSC{\noexpand\AltCaps{a} Name},
-% \noexpand\textSC{Problem}}.
-% \CapThis\Name*{
-% \noexpand\textSC{\noexpand\AltCaps{a} Name},
-% \noexpand\textSC{Problem}} will not occur,
-% even if it smells like a rose.
-% \end{quote}
-%
-% Like\DescribeMacro{\AltOff}\ a manual automobile clutch and gearbox, \cmd{\AltOff} deactivates \cmd{\textSC}, \cmd{\textBF}, \cmd{\textIT}, and \cmd{\textUC} only in a formatting hook.\medskip
-%
-% \cmd{\AltOn}\DescribeMacro{\AltOn}\ activates \cmd{\textSC}, \cmd{\textBF}, \cmd{\textIT}, and \cmd{\textUC} only in a formatting hook. To summarize:
-%
% \begin{itemize}
-% \item \cmd{\AltFormatActive} and \cmd{\AltFormatActive*} set global states.
-% \item \cmd{\AltFormatActive} causes formatting in the text and index, as well as forcing the use of \cmd{\AltCaps}.
-% \item With \cmd{\AltFormatActive*} inhibits formatting, but still requires one to use \cmd{\AltCaps}.
-% \item \cmd{\AltOn} and \cmd{\AltOff} change local state only in the formatting hooks.
-% \item The user adds \cmd{\AltOn} and \cmd{\AltOff} to the hooks as needed.
-% \item The actual formatting happens via macros in the name arguments.
+% \item \cmd{\IndexInactive} broadly suppresses \cmd{\IndexName}, \cmd{\IndexRef}, the page entry indexing components of the naming macros, and the cross-referencing components of \cmd{\AKA} and \cmd{\PName}.
+% \item For a fine degree of control, use \cmd{\ExcludeName} and \cmd{\IncludeName}.
% \end{itemize}
-% \newpage
+%
+% \cmd{\IndexActive}\Info{\cmd{\global}} and \cmd{\IndexInactive} can be used as a pair or singly within a group. They have top priority (page~\pageref{page:Priorities}). Use \cmd{\global} to force a global effect.\medskip
%
-% Keeping the \cmd{\MainNameHook} example above, we have:
-% \begin{quote}\small
-% \StartNum
-% \begin{verbatim}
-%\begin{nameauth}
-% \< Luth & Martin & \noexpand\textSC{Luther} & >
-%\end{nameauth}
-%\PretagName[Martin]{\noexpand\textSC{Luther}}{Luther, Martin}\end{verbatim}
-% \end{quote}
+% \DescribeMacro{\IndexProtect}
+% This macro causes all naming macros to do nothing. \cmd{\IndexProtect} is local in scope, e.g., |{\IndexProtect\Name{Error}}|{\IndexProtect\Name{Error}} is isolated.\Version{3.3}
+% The naming macros and \cmd{\AKA} have locks that prevent them from being used in their own arguments to prevent errors. To prevent unlikely errors in the index, one can use \cmd{\IndexProtect} right before \cmd{\printindex} to eliminate spurious output.\footnote{This manual uses the tag \S\ for \cmd{\Name\{foo}\cmd{\Name\{bar\}\}}, not shown in the example.}
%
-% We first mention \cmd{\Luth} \Luth. Then again, \cmd{\Luth} \Luth. Medieval Italian differs from modern Italian with respect to particles. Below the index entry should be ``\ShowIdxPageref*[Catherine \noexpand\AltCaps{d}e']{\noexpand\textSC{Medici}}\,'' instead of ``\ShowIdxPageref*[Catherine]{de~\textSC{Medici}}'':
-% \begin{quote}\small
-% \StartNum
-% \begin{verbatim}
-%\begin{nameauth}
-% \< Cath & Catherine \noexpand\AltCaps{d}e'
-% & \noexpand\textSC{Medici} & >
-%\end{nameauth}
-%\PretagName[Catherine \noexpand\AltCaps{d}e']
-% {\noexpand\textSC{Medici}}{Medici, Catherine de}\end{verbatim}
-% \end{quote}
-%This gives us \Cath\ and \Cath. To get \ForceName\CapThis\LCath[\noexpand\AltCaps{d}e'] and \CapThis\LCath[\noexpand\AltCaps{d}e'] in the text, use |\CapThis\LCath[\noexpand\AltCaps{d}e']|.\medskip
+% \begin{center}\small\MyStretch
+% \begin{tabular}{llll}\toprule
+% \bfseries Macro & \bfseries Text & \bfseries \texttt{.ind} file & \bfseries Index\\\midrule
+% \rowcolor{grey}|\Name{foo\Name{bar}}| & \Name{foo\Name{bar}} & |\item foo\Name {bar}| & foo{\NamesFormat bar}\\
+% \rowcolor{grey}\cmd{\printindex} (next iteration adds) \(\rightarrow\) & & |\item bar| & bar\\
+% |\Name{foo\Name{bar}}| & \Name{foo\Name{bar}} & |\item foo\Name {bar}| & foo\\
+% \cmd{\IndexProtect}\cmd{\printindex} & & (no further output) & \\\bottomrule
+% \end{tabular}
+% \end{center}
%
-% \phantomsection
-% \label{page:Inflections}
-% We\Info{name inflections\break\dbend} can use alternate formatting for grammatical inflections (cf. Section~\ref{sec:Hooksiii}). We tell the same set of lies that we did on page~\pageref{page:Sobriquets}. \cmd{\DoGentrue} occurs only in the formatting hook, thereby keeping the index entries consistent:\footnote{A copy of this example is in \texttt{examples.tex}, collocated with this manual.}
+% \DescribeMacro{\NameauthIndex}
+% \LaTeX\ has various ways to produce multiple indexes. \cmd{\NameauthIndex}, which is defined as \cmd{\index}, can be redefined to implement multiple indexes of names.\Version{3.5} Below we use the \textsf{index} package to do this, but other alternatives also are possible.\footnote{See also \href{https://www.texfaq.org/FAQ-multind}{this} on multiple indexes and the test in \texttt{examples.tex}, located with this manual.}
%
-% \newif\ifGenitive
-% \newif\ifDoGen
-% \renewcommand*\NamesFormat[1]{\ifGenitive\DoGentrue\fi#1\global\Genitivefalse}
-% \renewcommand*\MainNameHook[1]{\ifGenitive\DoGentrue\fi\AltOff#1\global\Genitivefalse}
-% \newcommand\JEFF{\ifDoGen\textSC{Jefferson's}\else\textSC{Jefferson}\fi}
-% \begin{quote}\small
-% \StartNum
-% \begin{verbatim}
-%\newif\ifGenitive
-%\newif\ifDoGen
-%\renewcommand*\NamesFormat[1]
-% {\ifGenitive\DoGentrue\fi#1\global\Genitivefalse}
-%\renewcommand*\MainNameHook[1]
-% {\ifGenitive\DoGentrue\fi\AltOff#1\global\Genitivefalse}
-%\begin{nameauth}
-% \< Jeff & Thomas & \noexpand\JEFF & >
-%\end{nameauth}
-%\PretagName[Thomas]{\noexpand\JEFF}{Jefferson, Thomas}
-%\TagName[Thomas]{\noexpand\JEFF}{, pres.|hyperpage}
-%\newcommand\JEFF{\ifDoGen\textSC{Jefferson's}\else
-% \textSC{Jefferson}\fi}
+%\begin{quote}\small\StartNum
+%\begin{verbatim}
+%\documentclass{article}
+%\usepackage[T1]{fontenc}
+%\usepackage{index}
+%\usepackage{nameauth}
%
-%Consider \Genitivetrue\Jeff\ legacy. More on \Jeff\ later.
-%\Genitivetrue\Jeff\ reputation has declined in recent decades.\end{verbatim}
+%\makeindex % Default index
+%\newindex{per}{rdx}{rnd}{Index of Persons} % Other index
+%\renewcommand\NameauthIndex{\index[per]}
%
-% \smallskip
-% Consider \Genitivetrue\Jeff\ legacy. More on \Jeff\ later.
-% \Genitivetrue\Jeff\ reputation has declined in recent decades.
-% \end{quote}
-%
-% For highly inflected languages, this would require two Boolean flags per case and nested conditional statements. Now we resume normal formatting with \cmd{\AltFormatInactive} and we do not use the names in this section outside of it.\footnote{In a \texttt{dtx} file it is best to put the \texttt{nameauth} environment, \cmd{\PretagName}, and \cmd{\TagName} macros in the driver section, especially when names contain macros.}
-% \AltFormatInactive\endgroup
-%
-% \ReturnLink
-% \newpage
+%\begin{document}
+% Electric Boogaloo\index{Boogaloo, Electric}% to main index
+% by \Name{Ollie~\& Jerry}% to name index
%
-% \subsection{Indexing Macros}
+% \printindex[per]% Shows the entry: Ollie & Jerry, 1
%
-% \subsubsection[Entries \& Control]{Index Entries and Control}
-% \label{sec:IndexControl}
+% \renewcommand\indexname{Index of Subjects}
+% \printindex % Shows the entry: Boogaloo, Electric, 1
+%\end{document}\end{verbatim}
+% \end{quote}
%
+% \begin{center}\bfseries Page Entries\end{center}
% \DescribeMacro{\IndexName}
% Both package users and the naming macros themselves use this macro to create index entries. It prints nothing in the body text:
% \begin{quote}
-% \fbox{\mystrut\ \cmd{\IndexName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\IndexName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\\
+% \end{tabular}
+% }
% \end{quote}
%
-% If \meta{FNN} is present, it ignores \meta{Alternate} for Western and ``native'' Eastern name forms. If \meta{FNN} is absent, \cmd{\IndexName} may use the current or obsolete non-Western syntax (Section~\ref{sec:Obsolete}). Indexing follows [\hyperlink{Mulvany}{Mulvany}, 152--82].
-%
-% If \cmd{\IndexInactive} or the \texttt{noindex} option are used, this macro does nothing until \cmd{\IndexActive} appears. Additionally, it will not create index entries for cross-references made by \cmd{\IndexRef} and \cmd{\AKA}. It will not index names excluded by \cmd{\ExcludeName}. This provides some error protection for professional indexing.
+% If \meta{FNN} is present, it ignores \meta{Alternate} for Western and ``native'' Eastern name forms. If \meta{FNN} is absent, \cmd{\IndexName} can use either the current or the obsolete non-Western syntax (Section~\ref{sec:Obsolete}). Indexing follows [\hyperlink{Mulvany}{Mulvany}, 152--82].
%
-% \cmd{\IndexName} and \cmd{\IndexRef} call \cmd{\@nameauth@Index}, a macro that assembles an index entry from the sort tag (Section~\ref{sec:IndexXref}), name arguments, and index tag (Section~\ref{sec:IndexTag}).
-% Different standards exist for index entries and cross-references. Check with your publisher, style guide, and docs for \textsf{xindy} and \textsf{makeindex}.\medskip
-%
-% \DescribeMacro{\IndexActive}
-% The \texttt{noindex} option deactivates the indexing function of this package until \cmd{\IndexActive} enables indexing.
-% \DescribeMacro{\IndexInactive}
-% Another macro, \cmd{\IndexInactive}, will deactivate indexing again. These can be used throughout the document. {\bfseries \cmd{\IndexInactive} suppresses index sorting and tagging macros.} Compare the use of macros \cmd{\ExcludeName} and \cmd{\IncludeName} (Section~\ref{sec:IndexXref}).\medskip
-%
-% \DescribeMacro{\IndexProtect}
-% Both the core name engine \cmd{\@nameauth@Name} and \cmd{\AKA} have locks that prevent them from being re-entrant.\VersionWarn{3.3} This protects the text. Usually, one does not put naming macros in the index. Just in case, now one can use \cmd{\IndexProtect} right before \cmd{\printindex} to prevent \textsf{nameauth} macros from producing any output.
-%
-% This example shows the difference between the effects of the older and newer approaches. We use the tag \S\ in this manual's index, but not below:
-% \begin{center}\small
-% \begin{tabular}{llll}\toprule
-% \bfseries Macro & \bfseries Text & \bfseries \texttt{.ind} file & \bfseries Index\\\midrule
-% no protection\\
-% |\Name{foo\Name{bar}}| & \Name{foo\Name{bar}} & |\item foo\Name {bar}| & foo{\NamesFormat bar}\\
-% (next iteration adds) \(\rightarrow\) & & |\item bar| & bar\\
-% \rowcolor{black!7!white}\cmd{\IndexProtect} & & & \\
-% \rowcolor{black!7!white}|\Name{foo\Name{bar}}| & \Name{foo\Name{bar}} &
-% |\item foo\Name {bar}| & foo\\
-% \rowcolor{black!7!white}(no further output results) & & & \\\bottomrule
-% \end{tabular}
-% \end{center}
-%
-% \cmd{\IndexActive}\Info{\cmd{\global}} and \cmd{\IndexInactive} can be used as a pair or singly within a group. These macros override any prefix macros. \cmd{\IndexProtect} also can be used in a local scope. Use \cmd{\global} with these macros to force a global effect.\medskip
-%
-% \DescribeMacro{\SkipIndex}
-% The prefix macro \cmd{\SkipIndex} will suppress indexing for just one instance of a naming or cross-referencing macro.\VersionWarn{3.1} It will not alter name forms or formatting. For example, |\SkipIndex\Name[Monty]{Python}| produces \SkipIndex\Name[Monty]{Python} in the text with no index entry. The same thing again yields \SkipIndex\Name[Monty]{Python}. Since prefix macros are meant for macros that print a name, both \cmd{\IndexName} and \cmd{\IndexRef} ignore \cmd{\SkipIndex} and allow the Boolean flags set by the prefix macros, to ``pass through'' to the next naming macro. That may seem counter-intuitive.
-% \newpage
+% Currently,\Version{3.5} we assume that if one wants to use \cmd{\IndexName}, one really wants to index something. That means \cmd{\IndexName} will not respect \cmd{\SkipIndex}. Using \cmd{\IndexInactive} will still suppress indexing. The naming macros have used the following for some time, which causes \cmd{\IndexName} to obey \cmd{\SkipIndex}:
+% \begin{quote}\small
+% |\unless\if@nameauth@SkipIndex \IndexName|\dots|\fi.|
+% \end{quote}
%
-% \DescribeMacro{\JustIndex}
-% This prefix macro makes \cmd{\Name}, \cmd{\Name*}, \cmd{\Fname}, and the shorthands act like a one-time call to \cmd{\IndexName}.\VersionWarn{3.3} Flags set by the prefix macros ``pass through'' to the next naming macro except these three: \cmd{\@nameauth@JustIndexfalse} (obviously), but also \cmd{\@nameauth@FullNamefalse} and \cmd{\@nameauth@FirstNamefalse}.
+% The stricter indexing control\Version{3.5} in place means that:
% \begin{itemize}
-% \item Both \cmd{\AKA} and \cmd{\PName} ignore and reset the flag set by \cmd{\JustIndex}.
-% \item \cmd{\SkipIndex} \cmd{\JustIndex} \cmd{\Name\{A\}} \cmd{\Name\{B\}} is just like \cmd{\JustIndex} \cmd{\Name\{A\}} \cmd{\SkipIndex} \cmd{\Name\{B\}}. See the table on page~\pageref{page:Priorities}.
-% \item Version 3.3 eliminates the undocumented behavior that used to occur when not using, e.g., \cmd{\JustIndex}\cmd{\Wash}. Now any version will do:\smallskip\\
-% \bgroup\small\begin{tabular}{ll@{ }ll@{ }l}
-% |\JustIndex\LWash \Wash| & old: & \makeatletter\@nameauth@OldPasstrue\makeatother\JustIndex\LWash \Wash & new: & \Wash\\
-% |\JustIndex\SWash \Wash| & old: & \makeatletter\@nameauth@OldPasstrue\makeatother\JustIndex\SWash \Wash & new: & \Wash\\
-% \end{tabular}\egroup
-% \item The \texttt{oldpass} option restores the old behavior. Cf. Section~\ref{sec:Customize}.
+% \item \cmd{\IndexName} will not index names excluded by \cmd{\ExcludeName}, as well as cross-references. This has been true for quite a while.
+% \item \cmd{\IndexName} resets the effects of both \cmd{\SeeAlso} and \cmd{\SkipIndex} unless one uses the \texttt{oldreset} option.
% \end{itemize}
%
-% \ReturnLink
+% \DescribeMacro{\SkipIndex}
+% The prefix macro \cmd{\SkipIndex} will suppress indexing for just one instance of a naming macro.\Version{3.1} See also page~\pageref{page:IdxPrefix}. |\SkipIndex\Name[Monty]{Python}| produces \SkipIndex\Name[Monty]{Python} and \SkipIndex\Name[Monty]{Python} in the text, but with no index entry.\medskip
%
-% \subsubsection{Cross-References}
-% \label{sec:IndexXref}
+% \DescribeMacro{\JustIndex}
+% This prefix macro makes \cmd{\Name}, \cmd{\Name*}, \cmd{\FName}, and the quick interface shorthand macros act similar to a one-time call to \cmd{\IndexName}.\Version{3.5} \cmd{\JustIndex} suppresses name output in the text, but it resets flags for long and first name forms as if the naming macro had produced output. Using the \texttt{oldreset} option prevents these flags from being reset. See also page~\pageref{page:IdxPrefix}.
%
+% \begin{center}\bfseries Cross-References\end{center}
% \DescribeMacro{\IndexRef}
-% This macro emerged from the macros in Section~\ref{sec:AKA}. By default, \cmd{\IndexRef} creates a \textit{see} reference\Version{3.0} from the name defined by its first three arguments to the target in its final argument:
-% \begin{quote}\small
-% \fbox{\mystrut\ \cmd{\IndexRef}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\marg{reference target} }
+% By default, \cmd{\IndexRef} creates a \textit{see} reference from the name defined by its first three arguments to the target in its final argument:
+% \begin{quote}
+% \fbox{
+% \begin{tabular}{@{}l@{}}
+% {\Large\strut}\small\cmd{\IndexRef}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\marg{reference target}\\
+% \end{tabular}
+% }
% \end{quote}
%
-% The name parsing is like \cmd{\IndexName}, except that the final argument is neither parsed nor checked if a target entry exists. For example, to cross-reference ``Sun King'' with \Name*{Louis, XIV} use: \cmd{\IndexRef}\texttt{\{Sun King\}\{Louis XIV\}}\IndexRef{Sun King}{Louis XIV}.
-%
-% When\Warn{} \cmd{\IndexRef} calls \cmd{\@nameauth@Index}, a preexisting tag of the form \meta{some text}\texttt{\textbar}\meta{some macro} is reduced to \meta{some text}. One cannot tag an extant cross-reference, but one can tag a name, then later create a \textit{see also} reference. For related warnings activated by the \texttt{verbose} option, see Section~\ref{sec:ErrorProt}.
-%
-% Next we look at variant names and cross-references. Some can be handled with the \meta{Alternate} argument. Others require more work to implement (Section~\ref{sec:VarNames}).
+% The stricter indexing control\Version{3.5} in place means that:
% \begin{itemize}
-% \item Variant names potentially can have page numbers in index entries. Cross-references cannot have page numbers.
-% \item |\DropAffix\ForgetThis\Name[J.E.]{Carter, Jr.}[Jimmy]| gives a variant name: \DropAffix\ForgetThis\Name[J.E.]{Carter, Jr.}[Jimmy] indexed under ``\ShowIdxPageref*[J.E.]{Carter, Jr.}''
-% \item |\IndexRef[Jimmy]{Carter}{Carter, J.E., Jr.}| makes an xref but prints nothing. We need only create this cross-reference once.\IndexRef[Jimmy]{Carter}{Carter, J.E., Jr.}
-% \item By contrast, \cmd{\AKA} automatically formats the cross-reference name in the text and in the index.
-% \item Yet \cmd{\AKA} has limited formatting. Instead, after creating the xref with \cmd{\IndexRef}, one can use |\SubvertThis\Name*[Jimmy]{Carter}| \SubvertThis\Name*[Jimmy]{Carter} with full formatting, but without creating any page entries.
-% \item \cmd{\SubvertThis} syncs the variant with the canonical form \cmd{\DropAffix} \cmd{\Name*[J.E.]\{Carter, Jr.\}[Jimmy]} \DropAffix\Name*[J.E.]{Carter, Jr.}[Jimmy]. Otherwise, they would act as different names. See also Section~\ref{sec:NameTests}.
-% \item If we use |\Name[Jimmy]{Carter}| \Name[Jimmy]{Carter} we have to index this alternate name with the canonical one: |\IndexName[J.E.]{Carter, Jr.}|
+% \item \cmd{\IndexRef} will not cross-reference names excluded by \cmd{\ExcludeName}, as well as cross-references. This has been true for quite a while.
+% \item \cmd{\IndexRef} will not index any extant names used with \cmd{\Name} and friends, as well as the quick interface, unless one uses the \texttt{oldsee} option.
+% \item \cmd{\IndexName} resets the effects of both \cmd{\SeeAlso} and \cmd{\SkipIndex} unless one uses the \texttt{oldreset} option.
+% \item To have multiple names and cross-references interact, see page~\pageref{page:IdxVariants}.
% \end{itemize}
%
-% \DescribeMacro{\SeeAlso}
-% Put \cmd{\SeeAlso} before \cmd{\IndexRef}, \cmd{\AKA}, and \cmd{\PName} to make a \textit{see also} reference for a name that has appeared already in the index.\Version{3.0}
-% Yet one should mind the caveats:
-% \begin{itemize}
-% \item If |\SeeAlso\IndexRef{Bar}{Foo}| occurs on page 10, \cmd{\Name\{Bar\}} will not create index entries thereafter. A \textit{see also} ref follows all page refs.
-% \item If |\SeeAlso\IndexRef{Bar}{Foo}| occurs on page 10, \cmd{\Name\{Foo\}} will create index entries thereafter because it is the target of ``Bar.''
-% \item If |\Name{Baz}| occurs on page 12 and |\IndexRef{Baz}{Meschugge}| on page 16, no xref will be created. A \textit{see} reference has no page refs.
-% \end{itemize}
+% \cmd{\IndexRef} prints nothing in the text. The name parsing is like \cmd{\IndexName}. The final argument is not checked in any way. For example:
+% \begin{quote}\leavevmode\Info{\vspace{-4ex}\break \strut\footnotesize Name Pattern(s):\hfill \break\ttfamily\ShowPattern{Sun King}!PN}
+% \begin{tabular}{ll}
+% source: & \cmd{\IndexRef}\texttt{\{Sun King\}\{Louis XIV\}}\IndexRef{Sun King}{Louis XIV}\\
+% index: & Sun King \textit{see} Louis XIV\\
+% \end{tabular}
+% \end{quote}
%
+% \DescribeMacro{\SeeAlso}
+% Put \cmd{\SeeAlso} before \cmd{\IndexRef}, \cmd{\AKA}, and \cmd{\PName} to make a \textit{see also} reference for a name that has appeared already in the index.\Version{3.5} If enabled before invoking \cmd{\PName}, \cmd{\SeeAlso} will be disabled when the regular name is generated, then enabled when the cross-reference is generated. Currently \cmd{\IndexName} and any macros that use it will reset the Boolean flag governed by \cmd{\SeeAlso} unless one uses the \texttt{oldreset} option. This does not change the intended behavior of \cmd{\SeeAlso}. Rather, it prevents a stray use of the macro from affecting the index.\medskip
+%
% \DescribeMacro{\ExcludeName}
% This macro prevents a name from being used as either an index entry or as an index cross-reference.\Version{3.0} It will not exclude extant cross-references:
% \begin{quote}
-% \fbox{\mystrut\ \cmd{\ExcludeName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\ExcludeName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\\
+% \end{tabular}
+% }
% \end{quote}
-% \cmd{\IndexRef} works best if one needs a cross-reference from a variant to the canonical name. If no cross-reference is needed, then \cmd{\ExcludeName} is used. Unlike \cmd{\IndexInactive} and \cmd{\IndexActive}, this macro works only on a per-name basis. Below we keep specific names and cross-references out of the index:\ExcludeName[Kris]{Kringle}\ExcludeName[Santa]{Claus}\ExcludeName{Grinch}\vspace{2.5ex}
+% Unlike \cmd{\IndexInactive} and \cmd{\IndexActive}, which inhibit indexing altogether, this macro only excludes a specific name from being printed as a page reference or cross-reference in the index. See the following example, as well as examples in Sections~\ref{sec:VarNames} and \ref{sec:NameParticles}:
+% \newpage
%
-%\leavevmode\quad\begin{minipage}[b]{0.9\textwidth}\small
-% \StartNum
+% \begin{quote}\small\leavevmode\PatInfo{\ShowPattern[Kris]{Kringle}!PN\break \ShowPattern[Santa]{Claus}!PN\break \ShowPattern{Grinch}!PN\break \ShowPattern[Kris]{Kringle}!MN\break \ShowPattern[Santa]{Claus}!MN\break \ShowPattern{Grinch}!MN}
+% \ExcludeName[Kris]{Kringle}\ExcludeName[Santa]{Claus}\ExcludeName{Grinch}
+% \StartNum\vspace{-5ex}
% \begin{verbatim}
%\ExcludeName[Kris]{Kringle}
%\ExcludeName[Santa]{Claus}
-%\ExcludeName{Grinch}\end{verbatim}
-% \end{minipage}\medskip
+%\ExcludeName{Grinch}
+%\Name[Kris]{Kringle}, a.k.a. \Name[Santa]{Claus}
+%even likes the \Name{Grinch}.\end{verbatim}
%
-%\leavevmode\quad\begin{minipage}[b]{0.5\textwidth}\small
-% \ContinueNum
-% \begin{verbatim}
-%\Name[Kris]{Kringle}
-%\Name[Kris]{Kringle}
-%\AKA[Kris]{Kringle}[Santa]{Claus}\end{verbatim}
-% \end{minipage}
-% \begin{minipage}[b]{0.3\textwidth}\small
-% \Name[Kris]{Kringle}\\
-% \Name[Kris]{Kringle}\\
-% \AKA[Kris]{Kringle}[Santa]{Claus}
-% \end{minipage}\vspace{2ex}
-%
-% For more examples of using \cmd{\ExcludeName} to handle variants, see Sections~\ref{sec:VarNames} and \ref{sec:NameParticles}, among others. We will check on the \Name{Grinch} later.\medskip
+% \Name[Kris]{Kringle}, a.k.a. \Name[Santa]{Claus}
+% even likes the \Name{Grinch}.
+% \end{quote}
%
-% \phantomsection
-% \label{page:ExPage}
% \DescribeMacro{\IncludeName}
-% For those who might need to break the indexing rules set by \textsf{nameauth}, these two macros get the job done.
+% Use these macros to break a few indexing rules. They remove the protections used for exclusion and cross-referencing.
% \DescribeMacro{\IncludeName*}
-% They remove the protections used for exclusion and cross-referencing. These macros have the same syntax as \cmd{\ExcludeName}:\Version{3.0}
+% They have the same syntax as \cmd{\ExcludeName}:
% \begin{quote}
-% \fbox{\vbox{\hbox{\mystrut\ \cmd{\IncludeName\ }\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }\par
-% \hbox{\mystrut\ \cmd{\IncludeName*}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }}}
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\IncludeName\ }\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\vspace{-2pt}\\
+% {\Large\strut}\cmd{\IncludeName*}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\\
+% \end{tabular}
+% }
% \end{quote}
%
-% \cmd{\IncludeName} only removes an excluded reference created by \cmd{\ExcludeName} while \cmd{\IncludeName*} completely un-protects a cross-reference. Thereafter, one may create page entries for it like a name.
+% \phantomsection
+% \label{page:ExPage}
+% \cmd{\IncludeName} only voids an exclusion created by \cmd{\ExcludeName}. The more extreme \cmd{\IncludeName*} completely un-protects a cross-reference. Thereafter, one may create page entries for it as a name. For example:
+%
+% \begin{itemize}
+% \item As an\PatInfo{\ShowPattern{Gregory, I}!PN\break \ShowPattern{Gregory, I}!MN} excluded name, |\Name*{Gregory, I}| \Name*{Gregory, I} does not create an index entry.
+% \item \cmd{\IfAKA\{Gregory, I\}}|{|\meta{an xref}|}{|\meta{a name}|}{|\meta{excluded}|}| tells us that \Name{Gregory, I} is \IfAKA{Gregory, I}{\meta{an xref}}{\meta{a name}}{\meta{excluded}} (cf. Section~\ref{sec:NameTests}).
+% \end{itemize}
%
-% For example, we used |\ExcludeName{Attila, the Hun}| at the end of Section~\ref{sec:SimpleStart}. Using \cmd{\IfAKA\{Attila, the Hun\}}|{|\meta{an xref}|}{|\meta{no xref}|}{|\meta{excluded}|}| tells us that he is \IfAKA{Attila, the Hun}{\meta{an xref}}{\meta{no xref}}{\meta{excluded}} (cf. Section~\ref{sec:NameTests}).
-%
-% Once we use |\IncludeName{Attila, the Hun}|\IncludeName{Attila, the Hun}, using |\LAttil| \LAttil\ will create a name and an index entry on this page. \cmd{\IfAKA} now tells us that he is \IfAKA{Attila, the Hun}{\meta{an xref}}{\meta{no xref}}{\meta{excluded}}. We again have a name that can be indexed.
+% After using |\IncludeName{Gregory, I}|\IncludeName{Gregory, I}, the following points are true:
+% \begin{itemize}
+% \item |\Name*{Gregory, I}| displays \Name*{Gregory, I} and creates an index entry.
+% \item \cmd{\IfAKA\{Gregory, I\}}|{|\meta{an xref}|}{|\meta{a name}|}{|\meta{excluded}|}| now tells us that \Name{Gregory, I} has become \IfAKA{Gregory, I}{\meta{an xref}}{\meta{a name}}{\meta{excluded}}.
+% \end{itemize}
%
-% Cross-references get more protection. \cmd{\IfAKA[Jay]\{Rockefeller\}} (a reference from Section~\ref{sec:SimpleStart}) tells us that he is \IfAKA[Jay]{Rockefeller}{\meta{an xref}}{\meta{no xref}}{}. If we follow the previous example and use |\IncludeName[Jay]{Rockefeller}|\IncludeName[Jay]{Rockefeller} he still is \IfAKA[Jay]{Rockefeller}{\meta{an xref}}{\meta{no xref}}{}. After using |\IncludeName*[Jay]{Rockefeller}|\IncludeName*[Jay]{Rockefeller} he finally becomes \IfAKA[Jay]{Rockefeller}{\meta{an xref}}{\meta{no xref}}{}, removing all protection from that cross-reference.
+% Cross-references get more protection.\PatInfo{\ShowPattern[J.D.]{Rockefeller, IV}!MN\break \ShowPattern[Jay]{Rockefeller}!PN\break \ShowPattern[Jay]{Rockefeller}!MN} We have seen \DropAffix\LJRIV[Jay] indexed under ``\ShowIdxPageref*[J.D.]{Rockefeller, IV}'' with |\DropAffix\LJRIV[Jay]|. We create the cross-index \IndexRef[Jay]{Rockefeller}{Rockefeller, J.D., IV}|\IndexRef[Jay]{Rockefeller}{Rockefeller, J.D., IV}|.
+% \begin{itemize}
+% \item \cmd{\IfAKA[Jay]\{Rockefeller\}}|{|\meta{xref}|}{|\meta{name}|}{}| calls \SJRIV[Jay] an \IfAKA[Jay]{Rockefeller}{\meta{xref}}{\meta{name}}{}.
+% \item After |\IncludeName[Jay]{Rockefeller}|\IncludeName[Jay]{Rockefeller} he still is an \IfAKA[Jay]{Rockefeller}{\meta{xref}}{\meta{name}}{}.
+% \item After |\IncludeName*[Jay]{Rockefeller}|\IncludeName*[Jay]{Rockefeller} he becomes a \IfAKA[Jay]{Rockefeller}{\meta{xref}}{\meta{name}}{}.
+% \item Now \cmd{\Name[Jay]\{Rockefeller\}} will create page entries.
+% \end{itemize}
%
+% Analogous to how \cmd{\IncludeName*} allows one to turn an xref into a name with page references, \cmd{\ForgetName} and possibly \cmd{\ForgetThis} (Section~\ref{sec:NameControl}) allow one to assign a \textit{see} reference to an extant name. This is bad when using one index, but desirable when using multiple indexes.\medskip
+%
+% \begin{center}\bfseries Error Prevention\end{center}
% \phantomsection
-% \label{page:ManualXref}
-% \begin{center}\bfseries Advanced Cross-Referencing\end{center}
+% \label{page:IdxErrors}
+% \cmd{\IndexName} and \cmd{\IndexRef}\Version{3.5} strictly enforce professional indexing practices. Now they are more sensitive to order of use. Both \cmd{\ForgetName} and \cmd{\ForgetThis} (Section~\ref{sec:NameControl}) can affect this mechanism. The \texttt{verbose} option aids debugging.
+% \begin{itemize}
+% \item[]
+% \bgroup\small\MyStretch\begin{tabular}{rp{0.38\textwidth}@{\ }p{0.23\textwidth}}\toprule
+% Page & Macro & Index Result\\\midrule
+% \rowcolor{grey}1 & \cmd{\Name\{bar\}}\dotfill \hbox{} & bar, 1\\
+% 2 & \cmd{\Name\{bar\}}\dotfill \hbox{} & bar, 1, 2\\
+% \end{tabular}\egroup\smallskip
+%
+% \item A \textit{see also} reference to a certain name must follow all page references to that name. The use of \cmd{\SeeAlso}\cmd{\IndexRef\{bar\}\{foo\}} on page~3 prevents \cmd{\Name\{bar\}} from creating an index page reference on page~4:\\[1.5ex]
+% \bgroup\small\MyStretch\begin{tabular}{rp{0.38\textwidth}@{\ }p{0.23\textwidth}}
+% \phantom{Page} & \phantom{Macro} & \phantom{Index Result}\\[-2.5ex]
+% \rowcolor{grey}3 & \cmd{\SeeAlso}\cmd{\IndexRef\{bar\}\{foo\}} & bar, 1, 2, \textit{see also} foo\\
+% 4 & \cmd{\Name\{bar\}}\dotfill \hbox{} & bar, 1, 2, \textit{see also} foo\\
+% \end{tabular}\egroup\smallskip
+%
+% \item Targets of cross-references are not affected by this. \cmd{\Name\{foo\}} creates index page entries because it is the target, not the xref:\\[1.5ex]
+% \bgroup\small\begin{tabular}{rp{0.38\textwidth}@{\ }p{0.23\textwidth}}
+% \phantom{Page} & \phantom{Macro} & \phantom{Index Result}\\[-2.5ex]
+% \rowcolor{grey}5 & \cmd{\Name\{foo\}}\dotfill \hbox{} & bar, 1, 2, \textit{see also} foo\\
+% \rowcolor{grey}& & foo, 5\\
+% \end{tabular}\egroup
%
-% \noindent \cmd{\IndexRef}\Info{combining xrefs} will not merge multiple cross-references. One must manually merge cross-references: |\IndexRef{Bar}{Baz; Foo}| makes the index entry ``Bar, \textit{see} Baz; Foo.'' The preferred standard (in the humanities) suggests that one avoid something like |\IndexRef{Bar}{Baz} \IndexRef{Bar}{Foo}|.\medskip
+% \item A \textit{see}\Version{3.5} reference is supposed to have no page references; a \textit{see also} reference does have page references, but only before it is created. Trying to use an extant name as a \textit{see} reference is strictly ignored:\\[1.5ex]
+% \bgroup\small\begin{tabular}{rp{0.38\textwidth}@{\ }p{0.23\textwidth}}
+% \phantom{Page} & \phantom{Macro} & \phantom{Index Result}\\[-2.5ex]
+% 6 & \cmd{\Name\{baz\}}\dotfill \hbox{} & bar, 1, 2, \textit{see also} foo\\
+% & & baz, 6\\
+% & & foo, 5\\
+% \rowcolor{grey}7 & \cmd{\IndexRef\{baz\}\{meschugge\}}\dotfill \hbox{} & bar, 1, 2, \textit{see also} foo\\
+% \rowcolor{grey}& & baz, 6\\
+% \rowcolor{grey}& & foo, 5\\\bottomrule
+% \end{tabular}\egroup
+% \end{itemize}\leavevmode
%
-% There\Info{one xref\break many targets} is a special case where one cross-reference can point to multiple targets, such as demonstrated in the example below:
-% \begin{quote}\small
-% \StartNum
-% \begin{verbatim}
-%\PretagName{\textit{Snellius}}{Snellius}
-%\IndexRef{\textit{Snellius}}{Snel van Royen, R.; Snel van Royen, W.}
+% \begin{center}\bfseries Prefix Macros and Indexing Macros\end{center}
+% \phantomsection
+% \label{page:IdxPrefix}
+% Indexing macros ignore Boolean flags meant for naming macros. Yet there are three prefix macros that affect indexing: \cmd{\SeeAlso}, \cmd{\SkipIndex}, and \cmd{\JustIndex}.
%
-%Both \Name[W.]{Snel van Royen}[Willebrord] and
-%his son \Name[R.]{Snel van Royen}[Rudolph] were known
-%by the Latin moniker \Name{\textit{Snellius}}.\end{verbatim}
+% \begin{itemize}
+% \item \cmd{\SeeAlso} works with and is reset by \cmd{\IndexRef}, \cmd{\AKA}, and \cmd{\PName} (see also Section~\ref{sec:AKA}). There are few, if any, side effects.\medskip
+% \item \cmd{\SkipIndex} works with the naming macros. Side effects include:
+% \begin{itemize}
+% \item Unless the \texttt{oldreset} option is used,\Version{3.5} both \cmd{\IndexName} and \cmd{\IndexRef} issue warnings if \cmd{\SkipIndex} precedes them, ignore \cmd{\SkipIndex}, and reset its flag.
+% \item Only when the \texttt{oldreset} option is used, both \cmd{\PName}\Version{3.5} and \cmd{\PName*} issue warnings when \texttt{\textbackslash if@nameauth@SkipIndex} is true on exit.
+% \end{itemize}
+% \item \cmd{\JustIndex} makes the naming macros act like \cmd{\IndexName}. That affects both the printing and indexing flags governed by prefix macros.
+% \end{itemize}
%
-% \smallskip
-% \IndexRef{\textit{Snellius}}{Snel van Royen, R.; Snel van Royen, W.}
-% Both \Name[W.]{Snel van Royen}[Willebrord] and
-% his son \Name[R.]{Snel van Royen}[Rudolph] were known
-% by the Latin moniker \Name{\textit{Snellius}}.
-% \end{quote}
+% There are many potential side effects related to \cmd{\JustIndex}:
+% \begin{itemize}
+% \item Both \cmd{\AKA} and \cmd{\PName} ignore \cmd{\JustIndex} and go on about their business. They also set \cmd{\@nameauth@JustIndexfalse}.
+% \item \cmd{\JustIndex} causes the naming macros to imitate \cmd{\IndexName} and ignore most flags, except for those discussed in the next bullet point. That makes the following two lines equivalent:
+% \begin{quote}\small\MyStretch
+% \cmd{\SkipIndex} \cmd{\JustIndex} \cmd{\Name\{A\}} \cmd{\Name\{B\}}\\
+% \cmd{\JustIndex} \cmd{\Name\{A\}} \cmd{\SkipIndex} \cmd{\Name\{B\}}
+% \end{quote}
+% According to the table on page~\pageref{page:Priorities}, \cmd{\JustIndex} takes priority with \cmd{\Name\{A\}} and passes \cmd{\@nameauth@SkipIndextrue} to \cmd{\Name\{B\}}.
+% \item Currently,\Version{3.3} the naming macros always reset \cmd{\@nameauth@FullNamefalse} and \cmd{\@nameauth@FirstNamefalse}. For example:\\[1.5ex]
+% \bgroup\small\vspace{-17ex}\PatInfo{\ShowPattern[George]{Washington}!MN}\vspace{17ex}\MyStretch\begin{tabular}{ll}\toprule
+% Source & Output\\\midrule
+% \rowcolor{grey}|\JustIndex\FName[George]{Washington}%| & \\
+% \rowcolor{grey}| \Name[George]{Washington}| &
+% \JustIndex\FName[George]{Washington}\Name[George]{Washington}\\
+% \rowcolor{grey}|\JustIndex\SWash \Wash| & \JustIndex\SWash \Wash \hphantom{ George}\\
+% |\JustIndex\Name*[George]{Washington}%| & \\
+% | \Name[George]{Washington}| &
+% \JustIndex\Name*[George]{Washington}\Name[George]{Washington}\\
+% |\JustIndex\LWash \Wash| & \JustIndex\LWash \Wash\\
+% \end{tabular}\egroup\smallskip
+%
+% \item The \texttt{oldpass} option restores the old behavior, which did not always reset the name length modifier. For example:\\[1.5ex]
+% \bgroup\makeatletter\@nameauth@OldPasstrue\makeatother%
+% \small\vspace{-17ex}\PatInfo{\ShowPattern[George]{Washington}!MN}\vspace{17ex}\MyStretch\begin{tabular}{ll}
+% \rowcolor{grey}|\JustIndex\FName[George]{Washington}%| & \\
+% \rowcolor{grey}| \Name[George]{Washington}| &
+% \JustIndex\FName[George]{Washington}\Name[George]{Washington}\\
+% \rowcolor{grey}|\JustIndex\SWash \Wash| & \JustIndex\SWash \Wash\\
+% |\JustIndex\Name*[George]{Washington}%| & \\
+% | \Name[George]{Washington}| &
+% \JustIndex\Name*[George]{Washington}\Name[George]{Washington}\\
+% |\JustIndex\LWash \Wash| & \JustIndex\LWash \Wash\\\bottomrule
+% \end{tabular}\egroup
+% \end{itemize}\leavevmode
%
-% \cmd{\IndexRef}\Info{location matters} prevents page numbers in cross-references, so one must plan how to set up complex cross-references. Above, |\Name{\textit{Snellius}}| produces no index entry because \cmd{\IndexRef} comes first.\medskip
+% \begin{center}\bfseries Variant Names and Cross-References\end{center}
+% \phantomsection
+% \label{page:IdxVariants}
+% Here we show differences among variants and cross-references. We can choose to index variants under the canonical name or we can set up cross-references with variants. The order in which we do that is significant:
+% \begin{enumerate}
+% \item We use\PatInfo{\ShowPattern[J.E.]{Carter, Jr.}!MN\hfill \textrm{(1--2)}\break \ShowPattern[Jimmy]{Carter}!PN\hfill \textrm{(3, 6)}\break \ShowPattern[Jimmy]{Carter}!MN\hfill \textrm{(4)}\break \ShowPattern[J.E.]{Carter, Jr.}!PN\hfill \textrm{(5)}} the canonical name to create page references:\smallskip\\
+% \hbox{}\quad|\Name*[J.E.]{Carter, Jr.}|\dotfill \Name*[J.E.]{Carter, Jr.}
+% \item Variants that use \meta{Alternate} in the text create page entries under the canonical form, not the variant form:\smallskip\\
+% \hbox{}\quad|\DropAffix\Name*[J.E.]{Carter, Jr.}[Jimmy]|\dotfill \DropAffix\Name*[J.E.]{Carter, Jr.}[Jimmy]\\
+% \hbox{}\quad|\ShowIdxPageref*[J.E.]{Carter, Jr.}[Jimmy]|\dotfill \ShowIdxPageref*[J.E.]{Carter, Jr.}[Jimmy]
+% \item We must create\Version{3.5} a \textit{see} reference from an alternate form to a canonical form \emph{before} using the alternate form in a naming macro, or it will be ignored and a warning will result:\smallskip\\
+% \hbox{}\quad|\IndexRef[Jimmy]{Carter}{Carter, J.E., Jr.}|\IndexRef[Jimmy]{Carter}{Carter, J.E., Jr.}
+% \item No page references will occur below because we made the \textit{see} reference first. Note how the alternate form is an independent name:\smallskip\\
+% \hbox{}\quad|\Name[Jimmy]{Carter}|\dotfill \Name[Jimmy]{Carter}
+% \item If we want to index the alternate name, we have to use the canonical name instead of the alternate name:\smallskip\\
+% \hbox{}\quad|\IndexName[J.E.]{Carter, Jr.}|
+% \item If instead we wanted to make a \textit{see also} reference, we would use both the canonical name and the alternate name, then create the cross-reference \emph{after} all uses of the alternate name (at the end of the document), e.g.:\smallskip\\
+% \hbox{}\quad|\SeeAlso\IndexRef[Jimmy]{Carter}{Carter, J.E., Jr.}|
+% \end{enumerate}
%
% Below,\Info{Multiple\break connections} two names are indexed with page numbers. They have \textit{see also} cross-references to each other. One of those names also has a \textit{see} reference to it:
-% \begin{itemize}
-% \item We use the canonical name to set up page references:\smallskip\\
-% \hbox{}\qquad|\Name{Maimonides}|\dotfill\Name{Maimonides}
+% \begin{enumerate}
+% \item We use\PatInfo{\ShowPattern{Maimonides}!MN \textrm{(1)}\break \ShowPattern{Moses, ben-Maimon}!PN \textrm{(2)}\break \ShowPattern{Moses, ben-Maimon}!MN \textrm{(3)}\break \ShowPattern{Rambam}!MN \textrm{(4)}\break \ShowPattern{Rambam}!PN \textrm{(5)}} the canonical name to set up page references:\smallskip\\
+% \hbox{}\qquad|\Name{Maimonides}|\dotfill \Name{Maimonides}
% \item \Name{Maimonides} has two other names, one more used than the other. We set up his least-used name as the \textit{see} reference:\smallskip\\
-% \hbox{}\qquad|\IndexRef{Moses, ben-Maimon}{Maimonides}|\IndexRef{Moses, ben-Maimon}{Maimonides}\\
-% \hbox{}\qquad|\Name{Moses, ben-Maimon}|\dotfill\Name{Moses, ben-Maimon}
-% \item We now have a main name with a page entry and a ``\textit{see} reference'' to that name. \Name*{Moses, ben-Maimon} has no page entries because we made the xref before we started to use the name.
+% \hbox{}\qquad|\IndexRef{Moses, ben-Maimon}{Maimonides}|\IndexRef{Moses, ben-Maimon}{Maimonides}
+% \item We now have a main name with a page entry and a ``\textit{see} reference'' to that name. No page references will occur below because we made the \textit{see} reference first:\smallskip\\
+% \hbox{}\qquad|\Name{Moses, ben-Maimon}|\dotfill \Name{Moses, ben-Maimon}
% \item Before creating \textit{see also} cross-references, we use the other alternate name so that all the page entries precede the cross-references:\smallskip\\
-% \hbox{}\qquad|\Name{Rambam}|\dotfill\Name{Rambam}
+% \hbox{}\qquad|\Name{Rambam}|\dotfill \Name{Rambam}
% \item All \textit{see also} references must come after all page references. For example, one could put both of these macros at the end of the document:\smallskip\\
% \hbox{}\qquad|\SeeAlso\IndexRef{Maimonides}{Rambam}|\SeeAlso\IndexRef{Maimonides}{Rambam}\\
% \hbox{}\qquad|\SeeAlso\IndexRef{Rambam}{Maimonides}|\SeeAlso\IndexRef{Rambam}{Maimonides}
-% \end{itemize}
-%
-% \BigBlank
-% \newpage
-%
-% \begin{center}\bfseries Continental Format Reference Work\end{center}
-%
-% Let us create a macro for entries in a reference work using the basic form of Continental formatting from Section~\ref{sec:AltBasic}. We enable alternate formatting, set up tags, and define an article with head-words:
-% \AltFormatActive
-%\newcommand{\RefArticle}[4]{%^^A
-% \def\check{#2}%^^A
-% \ifx\check\empty
-% \noindent\ForgetThis#1\ {#4}
-% \else
-% \noindent\ForceName#1\ ``\ForceName#2''
-% \ForceName#3\ {#4}
-% \fi
-%}
-% \begin{quote}\small
-% \StartNum
-% \begin{verbatim}
-%\AltFormatActive
-%\PretagName[Greta]{\textSC{Garbo}}{Garbo, Greta}
-%\PretagName[Heinz]{\textSC{Rühmann}}{Ruehmann, Heinz}
-%\PretagName[Heinrich Wilhelm]{\textSC{Rühmann}}%
-% {Ruehmann, Heinrich Wilhelm}
+% \end{enumerate}
%
-%\newcommand{\RefArticle}[4]{%
-% \def\check{#2}%
-% \ifx\check\empty
-% \noindent\ForgetThis#1\ {#4}
-% \else
-% \noindent\ForceName#1\ ``\ForceName#2''
-% \ForceName#3\ {#4}
-% \fi
-%}\end{verbatim}
+% \cmd{\IndexRef}\Info{Combining xrefs} will not merge multiple cross-references and it will not allow more than one cross-reference. For multiple cross-references one must use something like:
+% \begin{quote}
+% \begin{tabular}{ll}
+% source: & |\IndexRef{bar}{baz; foo}|\\[0.5ex]
+% index: & bar, \textit{see} baz; foo\\
+% \end{tabular}
% \end{quote}
%
-% \cmd{\RefArticle} either formats the name from the first argument and appends the fourth argument, ignoring the others if the second is empty, or it formats the first three arguments and appends the fourth. We determine what those arguments mean by including specific naming macros.
-% \begin{quote}\small
-% \ContinueNum
+% There\Info{Multiple targets} is a special case where one cross-reference can point to multiple targets, such as demonstrated in the example below:
+%
+% \begin{quote}\small\leavevmode\PatInfo{\ShowPattern{\textit{Snellius}}!PRE\break \ShowPattern{\textit{Snellius}}!PN\break \ShowPattern[W.]{Snel van Royen}!MN\break \ShowPattern[R.]{Snel van Royen}!MN}\vspace{-5ex}
+% \StartNum
% \begin{verbatim}
-%\RefArticle%
-% {\Name[Greta]{\textSC{Garbo}}}%
-% {}{}%
-% {(18 September 1905\,--\,15 April 1990) was a Swedish
-% film actress during the 1920s and 1930s.}
+%\PretagName{\textit{Snellius}}{Snellius}
+%\IndexRef{\textit{Snellius}}
+% {Snel van Royen, R.; Snel van Royen, W.}
+%Both \Name[W.]{Snel van Royen}[Willebrord] and
+%his son \Name[R.]{Snel van Royen}[Rudolph] were known
+%by the Latin moniker \Name{\textit{Snellius}}.\end{verbatim}
%
-%\RefArticle%
-% {%
-% \IndexRef[Heinrich Wilhelm]{\textSC{Rühmann}}%
-% {\textSC{Rühmann}, Heinz}%
-% \SubvertThis\FName[Heinrich Wilhelm]{\textSC{Rühmann}}%
-% }%
-% {\SubvertThis\FName[Heinz]{\textSC{Rühmann}}}%
-% {\Name[Heinz]{\textSC{Rühmann}}}%
-% {(7 March 1902\,--\,3 October 1994) was a German actor
-% in over 100 films.}
-%
-%\AltFormatInactive\end{verbatim}
+% \smallskip
+% \IndexRef{\textit{Snellius}}
+% {Snel van Royen, R.; Snel van Royen, W.}
+% Both \Name[W.]{Snel van Royen}[Willebrord] and
+% his son \Name[R.]{Snel van Royen}[Rudolph] were known
+% by the Latin moniker \Name{\textit{Snellius}}.
% \end{quote}
%
-% \begin{quote}
-%\RefArticle%^^A
-% {\Name[Greta]{\textSC{Garbo}}}%^^A
-% {}{}%^^A
-% {(18 September 1905\,--\,15 April 1990) was a Swedish
-% film actress during the 1920s and 1930s.}
-%
-%\RefArticle%^^A
-% {%^^A
-% \IndexRef[Heinrich Wilhelm]{\textSC{Rühmann}}%^^A
-% {\textSC{Rühmann}, Heinz}%^^A
-% \SubvertThis\FName[Heinrich Wilhelm]{\textSC{Rühmann}}%^^A
-% }%^^A
-% {\SubvertThis\FName[Heinz]{\textSC{Rühmann}}}%^^A
-% {\Name[Heinz]{\textSC{Rühmann}}}%^^A
-% {(7 March 1902\,--\,3 October 1994) was a German actor
-% in over 100 films.}
-% \end{quote}
+% \cmd{\IndexRef}\Info{Location matters} prevents page numbers in cross-references, so one must plan how to set up complex cross-references. Above, |\Name{\textit{Snellius}}| produces no index entry because \cmd{\IndexRef} comes first.
%
-% \AltFormatInactive
% \ReturnLink
% \newpage
%
% \subsubsection{Index Sorting}
% \label{sec:IndexSort}
%
+% Here we introduce the index sorting macros, with examples of error prevention:
+% \begin{center}\small\MyStretch
+% \begin{tabular}{ll}\toprule
+% potential sorting problems & page~\pageref{page:DebugSort}\\
+% \rowcolor{grey}example reference work & page~\pageref{page:ContinentalXref}\\\bottomrule
+% \end{tabular}
+% \end{center}
+%
% \DescribeMacro{\IndexActual}
-% The general practice for sorting with \texttt{makeindex -s} involves creating your own |.ist| file (pages 659--65 in \textit{The Latex Companion}). The following form works with both \texttt{makeindex} and \texttt{texindy}: |\index{|\meta{sort key}|@|\meta{actual}|}|. By default, the ``actual'' character is |@|. If one needs to change the ``actual'' character, such as when using \texttt{gind.ist} with \texttt{.dtx} files, one would put |\IndexActual{=}| in the preamble (or driver section) before using \cmd{\PretagName}.\medskip
+% Using \cmd{\index\{}\meta{sort key}\texttt{@}\meta{actual}\texttt{\}} works with both \texttt{makeindex} and \texttt{texindy}.\footnote{The general practice for sorting with \texttt{makeindex -s} involves creating an \texttt{.ist} file (pages 659--65 in \textit{The Latex Companion}).}
+% By default, the ``actual'' character is |@|. If one needs to change the ``actual'' character, such as when using \texttt{gind.ist} with \texttt{.dtx} files, one would put |\IndexActual{=}| in the preamble (or driver section) before using \cmd{\PretagName}.\medskip
%
+% Effects of \cmd{\IndexActual}\Info{\cmd{\global}} are local in scope. Use \cmd{\global} to make it otherwise, but that will affect every use of \cmd{\PretagName} thereafter. We demonstrate this scoping below as it pertains to \texttt{gind.ist} in a \texttt{dtx} file:
+% \begin{quote}\small\leavevmode\PatInfo{\ShowPattern{Ægidius}!PRE}\vspace{-5ex}
+% \StartNum
+% \begin{verbatim}
+%\PretagName{Ægidius}{Aegidius}
+%\begingroup
+% \IndexActual{@}
+% \ShowIdxPageref{Ægidius}\qquad
+%\endgroup
+%\ShowIdxPageref{Ægidius}\end{verbatim}
+%
+%\PretagName{Ægidius}{Aegidius}
+%\begingroup
+% \IndexActual{@}
+% \ShowIdxPageref{Ægidius}\qquad
+%\endgroup
+%\ShowIdxPageref{Ægidius}
+% \end{quote}
+%
% \noindent \DescribeMacro{\PretagName}
-% The \textsf{nameauth} package enables automatic index sorting using a ``pretag'' (see Section~\ref{sec:NamePatterns}).\Version{2.0} \cmd{\PretagName} creates a sort key terminated with the ``actual'' character. Do not put the ``actual'' character in the ``pretag'':
+% The \textsf{nameauth} package enables automatic index sorting using a ``pretag'' (cf. Section~\ref{sec:NamePatterns}). Unless the \texttt{nopretag} option is used (which results in warnings), \cmd{\PretagName} creates a sort key terminated with the ``actual'' character. Do not put the ``actual'' character in the ``pretag'':
+%
% \begin{quote}
-% \fbox{\mystrut\ \cmd{\PretagName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\marg{tag} }
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\PretagName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\marg{tag}\\
+% \end{tabular}
+% }
% \end{quote}
%
-% One need only ``pretag'' names once in the preamble. Thereafter, they will be sorted automatically. For example:
-% \begin{quote}\small
+% One can ``pretag'' any name, any cross-reference, and even excluded names. Once made, sorting tags cannot be unmade. If one uses \cmd{\PretagName} in the preamble, those names will be sorted automatically. For example:
+%
+% \begin{quote}\small\leavevmode\PatInfo{\ShowPattern{Æthelred, II}!PRE\break \ShowPattern[W.E.B.]{Du~Bois}!PRE\break \ShowPattern{Æthelred, II}!MN\break \ShowPattern[W.E.B.]{Du~Bois}!MN}\vspace{-5ex}
% \StartNum
% \begin{verbatim}
-%\PretagName[Jan]{Łukasiewicz}{Lukasiewicz, Jan}
%\PretagName{Æthelred, II}{Aethelred 2}
-%\PretagName[W.E.B.]{Du~Bois}{Dubois, W.E.B.}\end{verbatim}
+%\PretagName[W.E.B.]{Du~Bois}{Dubois, William}\end{verbatim}
% \end{quote}
%
-% Every reference to \Name*[Jan]{Łukasiewicz}, \LAeth, and \LDuBois\ is automatically tagged and sorted. One also must ``pretag'' names that contain spaces, macros, active characters, control spaces, non-breaking spaces, and anything that is not basic ASCII. That can differ when using \texttt{xindy} and Unicode-based \LaTeX.\medskip
-%
-% For example, the\Info{particles and\break languages} sort tag \texttt{de Soto} precedes \texttt{deal} due to the space: \texttt{de\textvisiblespace}. The sort tag \texttt{Desoto} falls between \texttt{derp} and \texttt{determinism}. German \textsf{ä ö ü ß} map to English \textsf{ae oe ue ss}. Yet Norwegian \textsf{æ ø å} follow \textsf{z} in that order. Check a style guide regarding collating sequences, spaces, and sorting. This is where using \texttt{xindy} can be very helpful. See also Section~\ref{sec:NameParticles}.\medskip
-%
-% One\Info{sub-entries} can sort names by creating sub-entries, which depends on the index style and formatting files: \cmd{\PretagName[Some]\{Name\}\{}\meta{category}\texttt{!Name, Some\}}. See the documentation for \texttt{xindy} and \texttt{makeindex}.
-%
-% Below we show how \cmd{\PretagName} helps one to avoid manually sorting cross-references (cf. Section~\ref{sec:NameParticles}):
+% Every reference to \LAeth\ and \LDuBois\ is automatically tagged and sorted. One should ``pretag'' all names that contain active characters or macros. That can differ when using \texttt{xindy} and Unicode-based \LaTeX. We keep this example simple and do not use alternate formatting (cf. Sections~\ref{sec:NameAncient}, \ref{sec:AltFormat}). The name patterns are: \texttt{\ShowPattern{\textit{Doctor angelicus}}!PRE \ShowPattern{\textit{Doctor angelicus}}!PN \ShowPattern{Thomas, Aquinas}!MN \ShowPattern{\textit{Doctor angelicus}}!MN}:
%
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
%\PretagName{\textit{Doctor angelicus}}{Doctor angelicus}
-%\IndexRef{\textit{Doctor angelicus}}{Thomas, Aquinas}
+%\IndexRef{\textit{Doctor angelicus}}{Thomas Aquinas}
%
%Perhaps the greatest medieval theologian was
%\Name{Thomas, Aquinas}, later known as
@@ -3125,64 +2998,69 @@ the README.txt or README for more information.
%
% \smallskip
% \PretagName{\textit{Doctor angelicus}}{Doctor Angelicus}
-% \IndexRef{\textit{Doctor angelicus}}{Thomas, Aquinas}
+% \IndexRef{\textit{Doctor angelicus}}{Thomas Aquinas}
% Perhaps the greatest medieval theologian was
% \Name{Thomas, Aquinas}, later known as
% \Name{\textit{Doctor angelicus}}.
% \end{quote}
%
-% \cmd{\PretagName} differs from the other tagging macros because its function is sorting entries, not appending information to entries:
-% \begin{itemize}
-% \item You can ``pretag'' any name and any cross-reference.
-% \item You can ``tag'' and ``untag'' only page-reference names, not xrefs, but you can turn a page-reference name into a \textit{see also} xref.
-% \item You can undo a ``tag'' but you cannot undo a ``pretag.''
-% \end{itemize}
-% \newpage
-%
-% \begin{center}\bfseries Debugging Problems with Sorting\end{center}
+% Spaces change sorting. For example, the\Info{Particles and\break languages} sort tag \texttt{De\textvisiblespace Soto} precedes \texttt{deal} due to the space therein. The sort tag \texttt{DeSoto} falls between \texttt{derp} and \texttt{determinism}. German \textsf{ä ö ü ß} map to English \textsf{ae oe ue ss}. Yet Norwegian \textsf{æ ø å} follow \textsf{z} in that order. Check a style guide regarding collating sequences, spaces, and sorting. This is where using \texttt{xindy} can be very helpful. See also Section~\ref{sec:NameParticles}.\medskip
+%
+% One\Info{Sub-entries} can sort names by creating sub-entries, which depends on the index style and formatting files: \cmd{\PretagName[Some]\{Name\}\{}\meta{category}\texttt{!Name, Some\}}. See also the documentation for \texttt{xindy} and \texttt{makeindex}.
%
-% \bgroup If an entry is incorrect in the index, check the following:
+% \begin{center}\bfseries Potential Sorting Problems\end{center}
+% \phantomsection
+% \label{page:DebugSort}
+% If an entry is sorted incorrectly in the index, check the following:
% \begin{itemize}
% \item Are there any active characters, internal spaces, or control sequences in the name arguments? Use \cmd{\PretagName}.
% \item Is alternate formatting used consistently? Are any names used within sections of alternate formatting ever used outside of them?
% \item Are macros in the name arguments that can expand differently under different conditions preceded by \cmd{\noexpand}?
% \end{itemize}
%
-% Since 2018 changes in the way that Unicode characters are handled in \texttt{pdflatex} and \texttt{latex} have made indexing simpler and more intuitive, e.g.\medskip
-%
+% Since 2018, changes in the way that \texttt{pdflatex} and \texttt{latex} handle Unicode characters have made indexing simpler and more intuitive, e.g.
+%
% \def\arrow{\ \(\rightarrow\)\ }
% \def\midrowa{\arrow\quad}
% \def\midrowb{\hphantom{\arrow}\quad}
% \def\midrow{\midrowb}
% \begin{center}\MyStretch
-% \begin{tabular}{ll>{\hspace{-1em}\midrow}lll>{\hspace{-1em}\midrow}l}\toprule
+% \begin{tabular}{l@{\ }l>{\hspace{-1em}\midrow}ll@{\ }l>{\hspace{-1em}\midrow}l}\toprule
% pre-2018 & text & index & post-2018 & text & index\gdef\midrow{\midrowa}\\\midrule
-% & ä & \texttt{\cmd{\IeC\textvisiblespace}\{\cmd{\"a}\}} & & ä & \texttt{ä}\\
-% \rowcolor{black!7!white} & æ & \texttt{\cmd{\IeC\textvisiblespace}\{\cmd{\ae\textvisiblespace}\}}
-% & & æ & \texttt{æ}\\\bottomrule
+% \rowcolor{grey} & ä & \texttt{\cmd{\IeC\textvisiblespace}\{\cmd{\"a}\}} & & ä & \texttt{ä}\\
+% & æ & \texttt{\cmd{\IeC\textvisiblespace}\{\cmd{\ae\textvisiblespace}\}}
+% & & æ & \texttt{æ}\\\bottomrule
% \end{tabular}
% \end{center}
+%
% One can test for this change and take different approaches with:
-% \begin{quote}
+% \begin{quote}\small
% \cmd{\IfFileExists\{utf8-2018.def\}}\marg{yes}\marg{no}
% \end{quote}
+%
% One also should look at the entries in the \texttt{.idx} or \texttt{.ind} files to see how the name arguments and other index entry components are turned into index entries. If there are entries that do not work, one can find the corresponding page numbers in order to identify the problem.
%
-% Extra spaces\Warn{} are significant when sorting index entries, yet usually are not significant in the body text. Hidden spaces, tokens, macros, and control sequences create unique index entries that look similar, yet expand and sort differently. Some macros can add spaces to index entries. For example, index tags in this manual that include \cmd{\dag} show up as \cmd{\dag\textvisiblespace\textvisiblespace} in the index (two trailing spaces). Below we show a general form of macro that adds extra spaces to index entries:
+% Extra spaces\Warn{} are significant when sorting index entries, yet usually are not significant in the body text. Hidden spaces, tokens, macros, and control sequences create unique index entries that look similar, yet expand and sort differently. Some macros can add spaces to index entries.
+%
+% This is not an issue with the \textsf{nameauth} package as such. Rather, it stems from the use of \cmd{\protected@edef}. This package requires \cmd{\protected@edef} in any situation where the macros that generate index entries are written to the \texttt{aux} file for execution there, such as in the \textsf{memoir} class. Without \cmd{\protected@edef}, any active Unicode characters would start expanding, thus making different index entries than those one might make by hand. Since we do not want a ``package way'' to index names and a ``regular way'' that is different and hard to integrate with the ``package way'', this is an unavoidable necessity.
+% \newpage
+%
+% Below we show the general minimal working example:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
%\newcommand\Idx[1]{%
% \protected@edef\arg{#1}%
% \index{\arg}}\end{verbatim}
-% \end{quote}
+% \medskip
%
-% \begin{center}\MyStretch\footnotesize
-% \begin{tabular}{l>{\hspace{-1em}\arrow\ }l}\toprule
-% |\Idx{\textsc{football}}| & \cmd{\indexentry}\texttt{\{\cmd{\textsc\textvisiblespace\textvisiblespace}\{football\}\}\{}\meta{page}\texttt{\}}\\
-% \rowcolor{black!7!white}|\index{\textsc{football}}| & \cmd{\indexentry}\texttt{\{\cmd{\textsc}\{football\}\}\{}\meta{page}\texttt{\}}\\\bottomrule
-% \end{tabular}
-% \end{center}\egroup
+% The macro \cmd{\Idx\{}\cmd{\textsc\{football\}\}} produces:\\
+% \hbox{}\qquad\cmd{\indexentry}\texttt{\{\cmd{\textsc\textvisiblespace\textvisiblespace}\{football\}\}\{}\meta{page}\texttt{\}}\\[1ex]
+% The macro \cmd{\index\{}\cmd{\textsc\{football\}\}} produces:\\
+% \hbox{}\qquad\cmd{\indexentry}\texttt{\{\cmd{\textsc}\{football\}\}\{}\meta{page}\texttt{\}}
+% \end{quote}
+%
+% The debugging macros will not help at this point. We must inspect the \texttt{idx} file. The problem with the debugging macros is that they show how an index entry will appear on the page, more or less, but not how it will appear in the \texttt{idx} file, which determines sorting.
%
% \ReturnLink
%
@@ -3193,14 +3071,17 @@ the README.txt or README for more information.
% This macro creates a tag appended to all index entries for a corresponding \cmd{\Name}.
% \DescribeMacro{\UntagName}
% The tag persists until one changes it with \cmd{\TagName} or destroys it with \cmd{\UntagName}.
-% Tags can include life dates, regnal dates, and other information. Both \cmd{\TagName} and \cmd{\UntagName} handle their arguments like \cmd{\IndexName}:
+% Tags can include life dates, regnal dates, and other information. Both \cmd{\TagName} and \cmd{\UntagName} have \emph{global scope} and handle arguments like \cmd{\IndexName}:
% \begin{quote}
-% \fbox{\vbox{\hbox{\mystrut\ \cmd{\TagName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\marg{tag} }\par
-% \hbox{\mystrut\ \cmd{\UntagName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }}}
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\TagName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\marg{tag}\vspace{-2pt}\\
+% {\Large\strut}\cmd{\UntagName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\\
+% \end{tabular}
+% }
% \end{quote}
-% \newpage
-%
-% All the indexing macros are keyed to the name patterns. \cmd{\PretagName} generates the leading sort key. \cmd{\TagName} and \cmd{\UntagName} affect the trailing content:
+%
+% All the indexing macros are keyed to the name patterns. \cmd{\PretagName} generates the leading sort key. \cmd{\TagName} and \cmd{\UntagName} affect the trailing content. The following graphic illustrates the ``segments'' of an index entry and the \textsf{nameauth} macros that affect the respective segments:
%
% \begin{center}\small\MyStretch
% \begin{tabular}{r@{\,\vrule width0.5pt\,}c@{\,\vrule width0.5pt\,}c@{\,\vrule width0.5pt\,}l}
@@ -3210,29 +3091,25 @@ the README.txt or README for more information.
% & & & \quad\cmd{\UntagName}\\
% \end{tabular}
% \end{center}
-% \noindent
%
-% Tags\Info{scholarly\break helps} created by \cmd{\TagName} can be helpful in the indexes of academic texts by adding dates, titles, etc. \cmd{\TagName} causes the \textsf{nameauth} indexing macros to append ``\texttt{,\textvisiblespace pope}'' to the index entries for the popes below:
-% \begin{quote}\small
+% Tags\Info{Scholarly\break helps} created by \cmd{\TagName} can be helpful in the indexes of academic texts by adding dates, titles, etc. \cmd{\TagName} causes the \textsf{nameauth} indexing macros to append ``\texttt{,\textvisiblespace pope}'' to the index entries created below:
+% \begin{quote}\small\leavevmode\PatInfo{\ShowPattern{Gregory, I}!TAG\break \ShowPattern{Gregory, I}!MN\break \ShowPattern{Gregory, the Great}!PN}\vspace{-5ex}
% \StartNum
% \begin{verbatim}
-%\TagName{Leo, I}{, pope}
%\TagName{Gregory, I}{, pope}
-%Pope \Name{Leo, I} was known as \AKA{Leo, I}{Leo, the Great}.\\
-%Pope \Name{Gregory, I} was known as \Name{Gregory, I}
-%``\ForceFN\AKA*{Gregory, I}{Gregory, the Great}.''\end{verbatim}
+%Pope \Name*{Gregory, I} was known as \Name{Gregory, I}
+%``the Great''.\IndexRef{Gregory, the Great}{Gregory I}\end{verbatim}
%
% \smallskip
-% Pope \Name{Leo, I} was known as \AKA{Leo, I}{Leo, the Great}.\\
-% Pope \Name{Gregory, I} was known as \Name{Gregory, I}
-% ``\ForceFN\AKA*{Gregory, I}{Gregory, the Great}.''
+% Pope \Name*{Gregory, I} was known as \Name{Gregory, I}
+% ``the Great''.\IndexRef{Gregory, the Great}{Gregory I}
% \end{quote}
%
-% \cmd{\TagName} works with all names, but not with cross-references from \cmd{\IndexRef}, \cmd{\AKA}, etc. (cf. Sections~\ref{sec:IndexXref}, \ref{sec:AKA}). Tags also can be daggers, asterisks, and so on. For example, all fictional names in the index of this manual are tagged with \S. One must add any desired spaces to the start of the tag.\medskip
+% \cmd{\TagName} works with all names, but not with cross-references from \cmd{\IndexRef}, \cmd{\AKA}, etc. (cf. Sections~\ref{sec:GeneralIndex}, \ref{sec:AKA}). Tags also can be daggers, asterisks, and so on. For example, all fictional names in the index of this manual are tagged with \S. One must add any desired spaces to the start of the tag.\medskip
%
-% We\Info{same name\break game} can format and index one name as two different people with \cmd{\TagName} and \cmd{\ForgetThis} (Section~\ref{sec:NameControl}). The index tags group together their respective entries. In a normal \LaTeX\ document one would write, e.g.:
+% We\Info{Same name\break game} can format and index one name as two different people with \cmd{\TagName} and \cmd{\ForgetThis} (Section~\ref{sec:NameControl}). The index tags group together their respective entries. In a normal \LaTeX\ document one would write, e.g.:
%
-% \begin{quote}\small
+% \begin{quote}\small\leavevmode\PatInfo{\ShowPattern[E.]{Humperdinck}!TAG\break \ShowPattern[E.]{Humperdinck}!MN}\vspace{-4.5ex}
% \StartNum
% \begin{verbatim}
%\TagName[E.]{Humperdinck}{ (composer)}
@@ -3253,13 +3130,12 @@ the README.txt or README for more information.
% \ForgetThis\Name[E.]{Humperdinck}[Engelbert].
% \end{quote}
%
-% One\Info{special tags} can use \cmd{\TagName} to create ``special'' index entries for names with the general form \cmd{\TagName\{}\meta{Name}\texttt{\}\{\textbar}\meta{Macro}\texttt{\}}, when \cmd{\def}\texttt{\textbackslash}\meta{Macro}\texttt{\#1\{\#1\}} exists. These\Version{3.3} tags are compatible with \textsf{hyperref}.\footnote{Before version 3.3 these special tags did not work with \textsf{hyperref}. The fix was inspired by the answer of \Name[Heiko]{Oberdiek} in: \url{https://tex.stackexchange.com/questions/201720/index-produces-invalid-idx-entry-with-manual-style-commaparse-hyperref}}
+% One\Info{Special tags} can use \cmd{\TagName} to create ``special'' index entries for names with the general form \cmd{\TagName}\meta{name args}\texttt{\{\textbar}\meta{Macro}\texttt{\}},\Version{3.3} when \cmd{\def}\texttt{\textbackslash}\meta{Macro}\texttt{\#1\{\#1\}} exists. These tags are compatible with \textsf{hyperref}.\footnote{Before version 3.3 these special tags did not work with \textsf{hyperref}. The fix was inspired by \Name*[Heiko]{Oberdiek} in \href{https://tex.stackexchange.com/questions/201720/index-produces-invalid-idx-entry-with-manual-style-commaparse-hyperref}{this question}.}
+%
+% For example, using the \textsf{ltxdoc} class with \textsf{hypdoc} does not create hyperlinked page entries with \textsf{nameauth}. This behavior does not affect normal \LaTeX\ documents that use \textsf{nameauth} and \textsf{hyperref}. In this manual we had to tag every name with \cmd{\TagName}\meta{name args}\texttt{\{\textbar hyperpage\}} in the driver section of the \texttt{dtx} file.
+%
+% In the ``commented'' package documentation part of a \texttt{dtx} file, the vertical bar is active. This adds an extra layer of complexity. Index tags in the documentation part must use the form: \cmd{\TagName}\meta{name args}\texttt{\{}\cmd{\string}\texttt{\textbar hyperpage\}}.
%
-% For example, using the \textsf{ltxdoc} class with \textsf{hypdoc} does not create hyperlinked page entries with \textsf{nameauth}. This behavior does not affect normal \LaTeX\ documents that use \textsf{nameauth} and \textsf{hyperref}. When creating this manual, we had to tag every name with: \cmd{\TagName\{}\meta{Name}\}\texttt{\{\textbar hyperpage\}} in the driver section of the \texttt{dtx} file.
-%
-% In the ``commented'' package documentation part of a \texttt{dtx} file, the vertical bar is active. This adds an extra layer of complexity. Index tags in the documentation part must use the form: \cmd{\TagName\{}\meta{Name}\texttt{\}\{}\cmd{\string}\texttt{\textbar hyperpage\}}.
-% \newpage
-%
% Below we use the conventions of this manual to create a special tag:
% \begin{quote}\small
% \StartNum
@@ -3268,15 +3144,20 @@ the README.txt or README for more information.
%\TagName[Lost]{Name}{\,\S|Orphan{perdit}}
%\Name[Lost]{Name}\end{verbatim}
%
-% \smallskip
-% \MyStretch\Name[Lost]{Name}\\
+% \smallskip\MyStretch
+% \Name[Lost]{Name}\\
% \texttt{idx} file: |\indexentry{Name, Lost\,\S |\texttt{\textbar}|Orphan{perdit}}{|\meta{page}|}|\\
% \texttt{ind} file: |\item Name, Lost\,\S \pfill \Orphan{perdit}{|\meta{page}|}|
% \end{quote}
%
-% The \textsf{microtype} package and its \texttt{Spacing} environment may be the best solution to fix index entries and sub-entries that break badly across columns or pages. Suppose, however, that we wanted to insert manual breaks into an index at will, preferably after the final page reference in an entry.
+% When \cmd{\IndexRef}\Info{Error\break prevention} calls \cmd{\@nameauth@Index}, a tag of the form \meta{some text}\texttt{\textbar}\meta{some macro} is reduced to \meta{some text}, allowing a new \texttt{\textbar}\meta{cross-reference} macro to be added. This keeps cross-references from breaking.\medskip
+%
+% The \textsf{microtype}\Info{Manual breaks\break and entries} package and its \texttt{Spacing} environment may be the best solution to fix index entries and sub-entries that break badly across columns or pages. Suppose, however, that we wanted to insert manual breaks into an index at the very end of the editing and proofreading passes. That is fairly easy to do.
+%
+% We cannot just insert something like \cmd{\newpage} or \cmd{\columnbreak} directly into an index. Instead, we create a helper macro that takes an argument and adds a break after that argument. That is, for example, how macros like \cmd{\textbf} use implied page references: \cmd{\index\{Doe, John\string|textbf\}}.
%
-% We cannot just insert something like \cmd{\newpage}. In order to accomplish our goal, we need a helper macro that can take an argument. Below we use \cmd{\newpage}, but if we instead make use of the \textsf{multicol} or \textsf{idxlayout} packages we can replace that with \cmd{\columnbreak}. Two macros illustrate a similar concept:
+% Below we use \cmd{\newpage}, but if we instead make use of the \textsf{multicol} or \textsf{idxlayout} packages we can replace that with \cmd{\columnbreak}. On line 1 we define the \cmd{\Endbreak} macro that will break the index page or column at the end of an entry. On line 3 we do the same for somewhere in the middle of an index entry. In the latter case there will be a comma that we must \cmd{\@gobble} after a page reference:
+%
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -3286,27 +3167,36 @@ the README.txt or README for more information.
%\makeatother\end{verbatim}
% \end{quote}
%
-% Putting a break into the middle of an index entry is quite sketchy and probably should be avoided, but it can be done by using \cmd{\@gobble} to eat the comma after the break. Instead, breaking after the entry is preferable. That entry is a list of page numbers corresponding to several pages:
-% \begin{quote}
-% (page 10) \cmd{\Name\{Some, Name\}}\\
-% \dots\\
-% (page 15) \cmd{\Name\{Some, Name\}}\\
-% \dots\\
-% (page 18) \cmd{\TagName\{Some, Name\textbar EndBreak\}\%}\\
-% \hphantom{(page 18)} \cmd{\Name\{Some, Name\}}
-% \end{quote}
+% Using \cmd{\MidBreak} to insert a break into the middle of an index entry does work to some extent, but what it does is quite sketchy and error-prone. We avoid using it for these reasons, but we just wanted to show that it can be done.
%
-% If all instances of \cmd{\Name\{Some, Name\}} on page 18 have the same tag, there will be no duplicate page entries, \textsf{hyperref} will work, and the index will break after:
-% \begin{quote}
-% \texttt{Some Name \dots\ 10, 15, 18}
+% Instead, we use \cmd{\EndBreak} after the last page in a given entry. This method works for manual index entries and for the \textsf{nameauth} macros. If all instances of \cmd{\Name\{Some, Name\}} on page 18 have the same tag, there will be no duplicate page entries, hyperlinks will work, and the index will break as indicated:
+%
+% \begin{quote}\footnotesize\MyStretch
+% \begin{tabular}{p{0.055\textwidth}@{\ }p{0.4\textwidth}@{\ }l}\toprule
+% Page & Macro & Index Result\\\midrule
+% \rowcolor{grey}10 & \cmd{\Name\{Some, Name\}}\dotfill \hbox{} & Some Name, 10\\
+% \rowcolor{grey} & \cmd{\index\{Topic\}}\dotfill \hbox{} & Topic, 10\\
+% 15 & \cmd{\Name\{Some, Name\}}\dotfill \hbox{} & Some Name, 10, 15\\
+% & \cmd{\index\{Topic\}}\dotfill \hbox{} & Topic, 10, 15\\
+% \rowcolor{grey}18 & \cmd{\TagName\{Some, Name\textbar EndBreak\}\%} & \\
+% \rowcolor{grey} & \cmd{\Name\{Some, Name\}}\dotfill \hbox{} & Some Name, 10, 15, 18\meta{break}\\
+% \rowcolor{grey} & \cmd{\index\{Topic\textbar EndBreak\}}\dotfill \hbox{} & Topic, 10, 15, 18\meta{break}\\
+% \end{tabular}
% \end{quote}
-%
-% We\Info{manual entries} can use the same macros in manual index entries. We may need to look at the \texttt{idx} or \texttt{ind} files to craft matching entries on the page that corresponds to the placement of the break:\footnote{Results vary, depending on what distribution of \LaTeX\ is being used and how old it is. As we saw in the previous section, any name with active characters needs to be handled differently before 2018 than after 2018.}
-% \begin{quote}
-% (page 18) \cmd{\SkipIndex}\cmd{\Name\{Some, Name\}\%}\\
-% \hphantom{(page 18)} \cmd{\index\{Some Name\textbar EndBreak\}}
+%
+% We do not have to supply an argument to \cmd{\EndBreak} because, as with the font switching example above, the page reference is implied.
+%
+% We can intermix \textsf{nameauth} macros with manual index entries. We may need to look at the \texttt{idx} or \texttt{ind} files to craft matching entries on the page where the break occurs. Instead of using \cmd{\TagName}, we can do this:
+%
+% \begin{quote}\footnotesize\MyStretch
+% \begin{tabular}{p{0.055\textwidth}@{\ }p{0.4\textwidth}@{\ }l}
+% 18 & \cmd{\SkipIndex}\cmd{\Name\{Some, Name\}\%}\hfill\hbox{} & \\
+% & \cmd{\index\{Some Name\textbar EndBreak\}}\dotfill \hbox{} & Some Name, 10, 15, 18\meta{break}\\\bottomrule
+% \end{tabular}
% \end{quote}
-%
+%
+% Results for manual entries may vary, depending on what distribution of \LaTeX\ is being used and how old it is. As we saw in the previous section, any name with active characters needs to be handled differently before 2018 than after 2018. All instances of \cmd{\index\{Some Name\textbar EndBreak\}} must fall on the same page.
+%
% \ReturnLink
% \newpage
%
@@ -3316,22 +3206,30 @@ the README.txt or README for more information.
% \DescribeMacro{\NameAddInfo}
% Unlike index tags, ``text tags'' are not printed automatically with every name managed by \textsf{nameauth}. Sections~\ref{sec:NameTests} and~\ref{sec:Hooksii} have more examples. The macro is \cmd{\long}, allowing for some complexity in the \meta{tag} argument:
% \begin{quote}
-% \fbox{\mystrut\ \cmd{\NameAddInfo}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\marg{tag} }
-% \end{quote}
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\NameAddInfo}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\marg{tag}\\
+% \end{tabular}
+% }
+% \end{quote}\PatInfo{\ShowPattern[George]{Washington}!DB\break \ShowPattern[George]{Washington}!MN}
%
-% For example, |\NameAddInfo[George]{Washington}{(1732--99)}|\NameAddInfo[George]{Washington}{(1732--99)} makes a text tag but does not print whenever \cmd{\Wash} ``\Wash'' is used.\medskip
+% For example, |\NameAddInfo[George]{Washington}{(1732--99)}|\NameAddInfo[George]{Washington}{(1732--99)} makes a text tag but does not print whenever \cmd{\Wash} \Wash\ is used.\medskip
%
% \DescribeMacro{\NameQueryInfo}
% To print the text tag macro associated with a name, we use \cmd{\NameQueryInfo}, which calls the appropriate macro in the name info data set:
% \begin{quote}
-% \fbox{\mystrut\ \cmd{\NameQueryInfo}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\NameQueryInfo}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\\
+% \end{tabular}
+% }
% \end{quote}
%
% \NameAddInfo[Ulysses S.]{Grant}{(president from 1869 to 1877)}
% \NameAddInfo[Schuyler]{Colfax}{\footnote{He was the seventeenth
% US vice-president, holding office during the first term (1869--73)
% of \Name[Ulysses S.]{Grant} \NameQueryInfo[Ulysses S.]{Grant}.}}
-% |\NameQueryInfo[George]{Washington}| expands to \NameQueryInfo[George]{Washington}. One can insert a space at its start or use signs like asterisks, daggers, and even footnotes, such as one for \Name[Schuyler]{Colfax}.\NameQueryInfo[Schuyler]{Colfax} Below is the source for footnote \arabic{footnote}:
+% |\NameQueryInfo[George]{Washington}|\PatInfo{\ShowPattern[George]{Washington}!DB\break \ShowPattern[Ulysses S.]{Grant}!DB\break \ShowPattern[Schuyler]{Colfax}!DB\break \ShowPattern[Schuyler]{Colfax}!MN\break \ShowPattern[Ulysses S.]{Grant}!MN} expands to \NameQueryInfo[George]{Washington}. One can insert a space at its start or use signs like asterisks, daggers, and even footnotes, such as one for \Name[Schuyler]{Colfax}.\NameQueryInfo[Schuyler]{Colfax} Below is the source for footnote \arabic{footnote}:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -3343,13 +3241,13 @@ the README.txt or README for more information.
% \texttt{\dots}|\Name[Schuyler]{Colfax}.\NameQueryInfo[Schuyler]{Colfax}|
% \end{quote}
%
-% Since\Warn{} one can nest ``text tags'' or have them call each other, one can build complex relations. Yet one must protect against a stack overflow by using Boolean flags to stop the recursion:
+% One can\Warn{} nest ``text tags'' and have them call each other. Therefore, one must protect against a stack overflow by using Boolean flags to stop the recursion:
% \begin{quote}\small
% \newif\ifA
% \newif\ifB
-% \NameAddInfo{A}{%^^A
+% \NameAddInfo{A}{^^A
% \Atrue A \ifB Stop \else \NameQueryInfo{B} \fi \Afalse}
-% \NameAddInfo{B}{%^^A
+% \NameAddInfo{B}{^^A
% \Btrue B \ifA Stop \else \NameQueryInfo{A} \fi \Bfalse}
% \StartNum
% \begin{verbatim}
@@ -3361,27 +3259,644 @@ the README.txt or README for more information.
% \Btrue B \ifA Stop \else \NameQueryInfo{A} \fi \Bfalse}\end{verbatim}
% \medskip
%
-% \begin{tabular}{@{}l@{ \(\rightarrow\) }l}
+% \MyStretch\begin{tabular}{@{}l@{ \(\rightarrow\) }l}
% \cmd{\NameQueryInfo\{A\}} & \NameQueryInfo{A}\\
% \cmd{\NameQueryInfo\{B\}} & \NameQueryInfo{B}\\
% \end{tabular}
% \end{quote}
-%
+%
% \DescribeMacro{\NameClearInfo}
% \cmd{\NameAddInfo} will replace one text tag with another text tag, but it does not delete a text tag. That is the role of \cmd{\NameClearInfo}. The syntax is:
+% \begin{quote}
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\NameClearInfo}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\\
+% \end{tabular}
+% }
+% \end{quote}
+%
+% After using\PatInfo{\ShowPattern[George]{Washington}!DB} |\NameClearInfo[George]{Washington}|\NameClearInfo[George]{Washington}, the next attempt to query the tag |\NameQueryInfo[George]{Washington}| will produce nothing\NameQueryInfo[George]{Washington}.
+%
+% \ReturnLink
+% \newpage
+%
+% \subsection{Basic Formatting}
+% \label{sec:Formatting}
+%
+% Below are color-coded forms and formats of names, showing most (but not all) of the variations that can occur. The next several sections will explain such variations (and quite a few more) in detail:\medskip
+%
+% \begin{tcolorbox}[colframe=naslate,sidebyside,lower separated=true,adjusted title={\hfil Full Forms, Front Matter\hspace{5em} Short Forms, Front matter}]\centering
+% {\cmd{\NamesInactive}}\NamesInactive
+% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil First Use (Default)}]\small
+% \begin{tabular}{@{}ll@{}}
+% \cmd{\Name} & \ForgetThis\Pat\\
+% & \ForgetThis\Eliz\\
+% & \ForgetThis\Yamt\\
+% & (cf. Section~\ref{sec:NameControl})\\
+% \end{tabular}
+% \end{tcolorbox}
+% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (\texttt{*} or \cmd{\L}\meta{macro})}]\small
+% \begin{tabular}{@{}ll@{}}
+% \cmd{\Name*} & \LPat\\
+% & \LEliz\\
+% & \LYamt\\
+% \end{tabular}
+% \end{tcolorbox}
+% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Long, with \cmd{\DropAffix}}]\small
+% \begin{tabular}{@{}ll@{}}
+% \cmd{\DropAffix}\cmd{\L}\meta{macro}\\ \SubvertThis\DropAffix\LPat\\
+% \end{tabular}
+% \end{tcolorbox}
+% \tcblower\centering
+% {\cmd{\NamesInactive}}\NamesInactive
+% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (Default)}]\small
+% \begin{tabular}{@{}ll@{}}
+% \cmd{\Name} & \SubvertThis\Pat; \SubvertThis\Eliz\\
+% & \SubvertThis\Yamt\\
+% \cmd{\FName}, & \SubvertThis\SPat; \SubvertThis\SEliz\\
+% \cmd{\S}\meta{macro} & \SubvertThis\SYamt\\
+% \end{tabular}
+% \end{tcolorbox}
+% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (\cmd{\ForceName})}]\small
+% \begin{tabular}{@{}ll@{}}
+% \cmd{\Name} & \SubvertThis\ForceName\Pat; \SubvertThis\ForceName\Eliz\\
+% & \SubvertThis\ForceName\Yamt\\
+% \cmd{\FName}, & \SubvertThis\ForceName\SPat; \SubvertThis\ForceName\SEliz\\
+% \cmd{\S}\meta{macro} & \SubvertThis\ForceName\SYamt\\
+% \end{tabular}
+% \end{tcolorbox}
+% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (\cmd{\ForceFN})}]\small
+% \begin{tabular}{@{}ll@{}}
+% \cmd{\FName}, \cmd{\S}\meta{macro} & \SubvertThis\ForceFN\SYamt\\
+% \end{tabular}
+% \end{tcolorbox}
+% \end{tcolorbox}
+% \vfil
+% \begin{tcolorbox}[colframe=naslate,sidebyside,lower separated=true,adjusted title={\hfil Full Forms, Main Matter\hspace{5em} Short Forms, Main Matter}]\centering
+% \cmd{\NamesActive}\NamesActive
+% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil First Use (Default)}]\small
+% \begin{tabular}{@{}ll@{}}
+% \cmd{\Name} & \ForgetThis\Pat\\
+% & \ForgetThis\Eliz\\
+% & \ForgetThis\Yamt\\
+% & (cf. Section~\ref{sec:NameControl})\\
+% \end{tabular}
+% \end{tcolorbox}
+% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (\texttt{*} or \cmd{\L}\meta{macro})}]\small
+% \begin{tabular}{@{}ll@{}}
+% \cmd{\Name*} & \LPat\\
+% & \LEliz\\
+% & \LYamt\\
+% \end{tabular}
+% \end{tcolorbox}
+% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Long, with \cmd{\DropAffix}}]\small
+% \begin{tabular}{@{}ll@{}}
+% \cmd{\DropAffix}\cmd{\L}\meta{macro}\\ \SubvertThis\DropAffix\LPat\\
+% \end{tabular}
+% \end{tcolorbox}
+% \tcblower\centering
+% \cmd{\NamesActive}\NamesActive
+% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (Default)}]\small
+% \begin{tabular}{@{}ll@{}}
+% \cmd{\Name} & \SubvertThis\Pat; \SubvertThis\Eliz\\
+% & \SubvertThis\Yamt\\
+% \cmd{\FName}, & \SubvertThis\SPat; \SubvertThis\SEliz\\
+% \cmd{\S}\meta{macro} & \SubvertThis\SYamt\\
+% \end{tabular}
+% \end{tcolorbox}
+% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (\cmd{\ForceName})}]\small
+% \begin{tabular}{@{}ll@{}}
+% \cmd{\Name} & \SubvertThis\ForceName\Pat; \SubvertThis\ForceName\Eliz\\
+% & \SubvertThis\ForceName\Yamt\\
+% \cmd{\FName}, & \SubvertThis\ForceName\SPat; \SubvertThis\ForceName\SEliz\\
+% \cmd{\S}\meta{macro} & \SubvertThis\ForceName\SYamt\\
+% \end{tabular}
+% \end{tcolorbox}
+% \begin{tcolorbox}[left=2mm,right=2mm,bottom=1mm,colback=white,adjusted title={\sffamily\bfseries\hfil Later Use (\cmd{\ForceFN})}]\small
+% \begin{tabular}{@{}ll@{}}
+% \cmd{\FName}, \cmd{\S}\meta{macro} & \SubvertThis\ForceFN\SYamt\\
+% \end{tabular}
+% \end{tcolorbox}
+% \end{tcolorbox}
+% \newpage
+%
+% Since\Info{Naming system\break behavior} formatting is related closely to name usage (the existence of a name control sequence), we use similar descriptors for these distinct topics. A name's classification, elements, and control sequence are determined in the syntactic element layer. A name's displayed form is determined in the name display layer. Finally, a name's typographic form is determined by the format hook dispatcher and formatting hooks. Here is the general layout:
+%
+% \begin{tcolorbox}[colframe=naslate,colback=white,adjusted title={\bfseries Syntactic Element Layer}]
+% \cmd{\@nameauth@Parse}: Determine name category, capitalization, punctuation, elements to be used, and pass on to\dots
+% \begin{tcolorbox}[colframe=nablue,adjusted title={\sffamily\bfseries Name Display Layer}]
+% \cmd{\@nameauth@NonWest}: Consult rules, construct displayed form.\\
+% \cmd{\@nameauth@West}: Consult rules, construct displayed form.\\
+% \cmd{\@nameauth@Form}: ``Magic Eight Ball'' of rules for name forms. Includes checking if a name control sequence exists, checking which is the calling macro, and so on.
+% Pass the information to\dots
+% \begin{tcolorbox}[colframe=nared,colback=white,adjusted title={\sffamily\bfseries Format Hook Dispatcher}]
+% \cmd{\@nameauth@Hook}: Check the name to be printed for a final full stop. Check which naming system we are using. Call a formatting hook to print the name in the text.
+% \end{tcolorbox}
+% \end{tcolorbox}
+% \cmd{\@nameauth@Parse}: Instantiate name control sequence.
+% \end{tcolorbox}
+%
+% The different forms and formats seen on the previous page are a result of all three layers interacting. Sections~\ref{sec:Formatting} and~\ref{sec:AltFormat} (with its subsections) deal mostly with the format hook dispatcher and formatting hooks, but they also interact with the name display layer. Section~\ref{sec:NameDecisions} (with its subsections) deals mostly with the syntactic element and name display layers, but also in some cases with the format hook dispatcher and formatting hooks. The following concepts flow from this layout and affect both form and formatting:
+% \begin{itemize}
+% \item \textbf{Name first use}
+% \begin{itemize}
+% \item No name control sequence exists.
+% \item A name is printed with its long form (default).
+% \item The ``first-use'' formatting hook is used (default).
+% \item When the name is printed, a name control sequence is created.
+% \end{itemize}
+% \item \textbf{Name subsequent use}
+% \begin{itemize}
+% \item A name control sequence already exists.
+% \item A name is printed using a shorter form (default).
+% \item The ``subsequent-use'' formatting hook is used (default).
+% \end{itemize}
+% \end{itemize}
+%
+% The parser and related macros create name forms and formats only in the text. Macros in name arguments affect both text and index (Section~\ref{sec:AltFormat}).\medskip
+%
+% \DescribeMacro{\NamesActive}
+% Independent ``main-matter'' and ``front-matter'' systems are used to format first and subsequent name uses.
+% \DescribeMacro{\NamesInactive}
+% \cmd{\NamesInactive} and the \texttt{frontmatter} option enable the front-matter system. \cmd{\NamesActive}
+% switches names to the main-matter system. The \texttt{mainmatter} option is the default setting for names.
+% \medskip
+%
+% These\Info{\cmd{\global}} two macros can be used explicitly as a pair or singly within an explicit local scope. Use \cmd{\global} to force a global effect.\medskip
+%
+% \DescribeMacro{\NamesFormat}
+% The main-matter system uses \cmd{\NamesFormat} to post-process first occurrences of names and
+% \DescribeMacro{\MainNameHook}
+% \cmd{\MainNameHook} for subsequent uses. The front-matter system uses \cmd{\FrontNamesFormat}
+% \DescribeMacro{\FrontNamesFormat}
+% for first uses and \cmd{\FrontNameHook} for subsequent uses. The \texttt{alwaysformat}
+% \DescribeMacro{\FrontNameHook}
+% option causes only \cmd{\NamesFormat} and \cmd{\FrontNamesFormat} to be used.\footnote{The names of these macros grew from \cmd{\NamesFormat}, originally the only formatting hook.}
+% Section~\ref{sec:NamePatterns} shows how name control sequences are keyed either to the main-matter system or to the front-matter system.
+% The two formatting systems are distinct, useful for separate document elements. We color-code them below:\smallskip
+%
+% \begin{center}\small\vspace{2ex}\PatInfo{\textrm{front-matter}\hfill\break \ShowPattern[Rudolph]{Carnap}!NF\break \ShowPattern[Nicolas]{Malebranche}!NF\break \textrm{main-matter}\hfill\break \ShowPattern[Rudolph]{Carnap}!MN\break \ShowPattern[Nicolas]{Malebranche}!MN}\vspace{-2ex}\MyStretch
+% \NamesInactive
+% \begin{tabular}{ll}\toprule
+% Front-matter system: & \cmd{\NamesInactive}\\\midrule
+% \rowcolor{grey}|\Name[Rudolph]{Carnap}| & \Name[Rudolph]{Carnap}\\
+% |\Name[Rudolph]{Carnap}| & \Name[Rudolph]{Carnap}\\
+% \rowcolor{grey}|\Name[Nicolas]{Malebranche}| & \Name[Nicolas]{Malebranche}\\
+% |\Name[Nicolas]{Malebranche}| & \Name[Nicolas]{Malebranche}\\\bottomrule
+% \end{tabular}\\[4ex]
+%
+% \NamesActive
+% \begin{tabular}{ll}\toprule
+% Main-matter system: & \cmd{\NamesActive}\\\midrule
+% \rowcolor{grey}|\Name[Rudolph]{Carnap}| & \Name[Rudolph]{Carnap}\\
+% |\Name[Rudolph]{Carnap}| & \Name[Rudolph]{Carnap}\\
+% \rowcolor{grey}|\Name[Nicolas]{Malebranche}| & \Name[Nicolas]{Malebranche}\\
+% |\Name[Nicolas]{Malebranche}| & \Name[Nicolas]{Malebranche}\\\bottomrule
+% \end{tabular}
+% \end{center}
+%
+% We achieved that color coding using the following macros and the \textsf{xcolor} package:
+% \begin{quote}\small
+% \StartNum
+% \begin{verbatim}
+%\renewcommand*\FrontNamesFormat[1]{\color{red}\sffamily #1}
+%\renewcommand*\FrontNameHook[1]{\color{darkgray}\sffamily #1}
+%\renewcommand*\NamesFormat[1]{\color{blue}\sffamily #1}
+%\renewcommand*\MainNameHook[1]{\sffamily #1}\end{verbatim}
+% \end{quote}
+%
+% \DescribeMacro{\ForceName}
+% We show examples of \cmd{\ForceName} in Sections~\ref{sec:NameControl}, \ref{sec:AKA}, and~\ref{sec:Hooksii}. Use this prefix macro to force ``first use'' formatting for the next \cmd{\Name}, etc.,\Version{3.1} but without changing any name control sequences. Thus:
% \begin{quote}\small
-% \fbox{\mystrut\ \cmd{\NameClearInfo}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate} }
+% \hphantom{\cmd{\ForceName}}\PatInfo{\ShowPattern[Rudolph]{Carnap}!MN}\cmd{\Name[Rudolph]\{Carnap\}} \Name[Rudolph]{Carnap}\\
+% \cmd{\ForceName}\cmd{\Name[Rudolph]\{Carnap\}} \ForceName\Name[Rudolph]{Carnap}
% \end{quote}
%
-% After using |\NameClearInfo[George]{Washington}|\NameClearInfo[George]{Washington}, the next attempt to query the tag |\NameQueryInfo[George]{Washington}| will produce nothing\NameQueryInfo[George]{Washington}.\footnote{Had any information from a text tag been present, it would have appeared between ``nothing'' and the full stop.}
+% Below\Info{\texttt{alwaysformat}} we simulate \texttt{alwaysformat} via package internals:
+% \makeatletter\@nameauth@AlwaysFormattrue\makeatother%
+% \ForgetName[M.T.]{Cicero}\ForgetName{Elizabeth, I}%
+% \begin{itemize}
+% \item Front matter: \NamesInactive \Name[Albert]{Einstein}, \Name[Albert]{Einstein}; \Name{Confucius}, \Name{Confucius}.\\ Patterns: \texttt{\ShowPattern[Albert]{Einstein}!NF \ShowPattern{Confucius}!NF}
+% \item Main matter: \NamesActive \Name[M.T.]{Cicero}, \Name[M.T.]{Cicero}; \Name{Elizabeth, I}, \Name{Elizabeth, I}.\\ Patterns: \texttt{\ShowPattern[M.T.]{Cicero}!MN \ShowPattern{Elizabeth, I}!MN}
+% \end{itemize}
+% \makeatletter\@nameauth@AlwaysFormatfalse\makeatother
+% \newpage
+%
+% The name parser\Info{Hook caveats} determines what syntactic name elements exist and how they are constituted. It passes that information to macros that determine the form of non-Western or Western names to be displayed. They in turn call the format hook dispatcher for post-processing, which calls the formatting hooks using the pattern:
+% \begin{quote}\small
+% \cmd{\bgroup}\meta{Hook}\texttt{\{\#1\}}\cmd{\egroup}.
+% \end{quote}
+% Thus, one can create hooks that take either no arguments or one argument, e.g.:
+% \begin{quote}\small\MyStretch
+% \cmd{\renewcommand*}\cmd{\NamesFormat\{}\meta{content}\texttt{\}}\\
+% \cmd{\renewcommand*}\cmd{\NamesFormat[1]\{}\meta{content}\texttt{\}}
+% \end{quote}
+% A hook that takes one argument can discard it and invoke \cmd{\NameParser} (Page~\pageref{page:Intermediate}). Due to the dispatcher design, both the following achieve the same effect, giving the choice of non-robust and robust forms:
+% \begin{quote}\small\MyStretch
+% \cmd{\renewcommand*}\cmd{\NamesFormat\{}\cmd{\itshape}\texttt{\}}\\
+% \cmd{\renewcommand*}\cmd{\NamesFormat\{}\cmd{\textit}\texttt{\}}
+% \end{quote}
+%
+% The\Info{Applied to\break footnotes} independent systems of names work with footnotes. Names in the body text, such as \Harnack, normally affect name forms in the footnotes.\footnote{We have \Harnack\ from \cmd{\Harnack} instead of \ForgetThis\Harnack.}
+% In footnote \arabic{footnote} \cmd{\MainNameHook} is called instead of \cmd{\NamesFormat} because \Harnack\ already had occurred above. We can use the front-matter system to change that:
+% \makeatletter
+% \let\@oldfntext\@makefntext
+% \long\def\@makefntext#1{\NamesInactive\@oldfntext{#1}\NamesActive}
+% \makeatother
+% \begin{quote}\small\leavevmode\PatInfo{\ShowPattern[Adolf]{Harnack}!MN\break \ShowPattern[Adolf]{Harnack}!NF}\vspace{-5ex}
+% \StartNum
+% \begin{verbatim}
+%\begingroup
+%\makeatletter
+%\let\@oldfntext\@makefntext
+%\long\def\@makefntext#1{\NamesInactive\@oldfntext{#1}\NamesActive}
+%\makeatother\end{verbatim}
+% \end{quote}
%
+% When we create another footnote, we see very different results.\footnote{We have \Harnack\ from \cmd{\Harnack}, then \Harnack.}
+% Footnote \arabic{footnote} shows a different result. One can synchronize the two systems with \cmd{\ForgetThis} and \cmd{\SubvertThis} (Section~\ref{sec:NameControl}). Below we revert footnotes with:
+% \makeatletter
+% \let\@makefntext\@oldfntext
+% \makeatother
+% \begin{quote}\small
+% \ContinueNum
+% \begin{verbatim}
+% \makeatletter
+% \let\@makefntext\@oldfntext
+% \makeatother\end{verbatim}
+% \end{quote}
% \ReturnLink
+% \vfill
+%
+% \begingroup^^A Local format hook redefinition
+% \AltFormatActive
+% \begin{verse}
+% Eyn Chriſten menſch iſt eyn freyer herr / über alle ding /\\
+% \qquad und niemande unterthan.\\
+% Eyn Chriſten menſch iſt eyn dienſtpar knecht aller ding\\
+% \qquad und yderman unterthan.\\[1ex]\hfill---\Luth, \textit{Von der Freiheit eines Christenmenschen}
+% \end{verse}
+% \newpage
+%
+% \subsection{Alternate Formatting}
+% \label{sec:AltFormat}
+%
+% \noindent The\Info{In this section, the name patterns do not fit in the margin.} formatting hooks only affect names in the body text. Continental formatting occurs in both the text and in the index. One needs to format those names with macros in the name arguments.
+%
+% We already saw the use of macros in name arguments for Roman names (page~\pageref{page:Romani}). We did not use alternate formatting there because we knew that we would not use an \meta{SNN}\texttt{,}\meta{Affix} pair; we would not use \cmd{\CapThis}; and we used \cmd{\noexpand} before the macros in the arguments.
+%
+% In larger contexts, however, these constraints might not hold. The following scenarios, especially where there is segmentation of input, can be problematic:
+% \begin{itemize}
+% \item Using a comma-delimited required name argument pair as the argument of a robust macro like \cmd{\textsc} will halt \LaTeX\ with errors. The \textsf{nameauth} macros will split that pair, which will break the robust macro:\\[1ex]
+% \bgroup\small\MyStretch\begin{tabular}{@{\qquad}ll}
+% Bad & \cmd{\Name\{}\cmd{\textsc\{}\meta{SNN}\texttt{,}\meta{Affix}\texttt{\}\}}\\
+% Good & \cmd{\Name\{}\cmd{\textsc\{}\meta{SNN}\texttt{\},}\cmd{\textsc\{}\meta{Affix}\texttt{\}\}}\\
+% \end{tabular}\egroup\\[1ex]
+% Not even alternate formatting can fix this issue; one simply must avoid the problem when encoding names.
+% \item Using \cmd{\CapThis} with a name whose leading element in any one argument is neither a letter nor an active Unicode character, such as a macro. This may work in normal formatting or it may fail, depending on the macro. Use alternate formatting to have \cmd{\CapThis} activate the alternate capitalization mechanism.
+% \item In a name argument, using a macro that contains a conditional statement can cause the macro to expand to different results. When such conditional changes occur, spurious results follow. Use \cmd{\noexpand} in the name arguments to fix this.
+% \end{itemize}
+%
+% \subsubsection{Basic Features}
+% \label{sec:AltBasic}
+%
+% What we call ``basic'' alternate formatting is meant to be a temporary stop on the road to ``advanced'' usage, which is more robust. For reasons shown above, it is quite helpful to use \cmd{\noexpand} before macros in name arguments:
+%
+% \begin{center}\small\MyStretch
+% \begin{tabular}{ll}
+% |\Name[Martin]{\textSC{Luther}}| & {\color{nared}|%| \textit{basic; good}}\\
+% |\Name[Martin]{\noexpand\textSC{Luther}}| & {\color{nared}|%| \textit{advanced; better}}\\
+% \end{tabular}
+% \end{center}
+%
+% The reason why the basic features work is because the built-in formatting macros discussed below have their effects set when alternate formatting is enabled. If one does not use the macros in names apart from alternate formatting and one does not change the Boolean flags that govern them, the basic features may suffice.
+%
+% \begin{center}\bfseries Enabling and Disabling\end{center}
+% The first thing we need to know is how to enable and disable alternate formatting. The macros that accomplish this are global in scope and cannot be isolated in a local scope. Normally, they are used in pairs, except with the \texttt{altformat} option.
+%
+% At the start of this section we used \cmd{\AltFormatActive} to enable alternate formatting and activate the formatting macros (see below). At the end of this section we must use \cmd{\AltFormatInactive} to deactivate and disable them.\medskip
+%
+% \DescribeMacro{\AltFormatActive}
+% Both the \texttt{altformat} option and \cmd{\AltFormatActive} enable and activate alternate formatting. Both cause \cmd{\CapThis} to work via \cmd{\AltCaps} instead of the normal way. \cmd{\AltFormatActive} countermands \cmd{\AltFormatActive*}.
+% \begin{itemize}
+% \item \emph{Enabled} means that the alternate formatting mechanism inhibits the normal behavior of \cmd{\CapThis}.
+% \item \emph{Disabled} means that the normal behavior of \cmd{\CapThis} is again in force and alternate formatting is inhibited.
+% \item \emph{Activated} means that \cmd{\textSC} and other alternate formatting macros below format their arguments.
+% \item \emph{Deactivated} means that \cmd{\textSC} and other macros below do not format their arguments.
+% \end{itemize}
+%
+% \DescribeMacro{\AltFormatActive*}
+% The starred form \cmd{\AltFormatActive*} enables alternate formatting but deactivates the special formatting macros, preventing them from changing their arguments. It countermands both the \texttt{altformat} option and \cmd{\AltFormatActive}. It causes \cmd{\CapThis} only to work via \cmd{\AltCaps}.\medskip
+%
+% \DescribeMacro{\AltFormatInactive}
+% This macro both disables and deactivates alternate formatting. This reverts globally to standard formatting and the normal function of \cmd{\CapThis}.
+%
+% \begin{center}\MyStretch
+% \begin{tabular}{lcc}\toprule
+% Macro & Enabled & Activated\\\midrule
+% \cmd{\AltFormatActive} & \YES & \YES\\
+% \cmd{\AltFormatActive*} & \YES & \NO\\
+% \cmd{\AltFormatInactive} & \NO & \NO\\\bottomrule
+% \end{tabular}
+% \end{center}\leavevmode
+%
+% \begin{tcolorbox}[colback=white,colframe=nared]
+% \centering All three macros \emph{always} make global changes.\\ This differs from other macros in \textsf{nameauth}.
+% \end{tcolorbox}\smallskip
+%
+% \begin{center}\bfseries Basic Alternate Formatting\end{center}
+% \DescribeMacro{\textSC}
+% Continental formatting can be as simple as using the short macro \cmd{\textSC}. Three other macros also implement alternate formatting.
+% \DescribeMacro{\textIT}
+% These macros make changes only when alternate formatting is active.
+% \DescribeMacro{\textBF}
+% We sort the index entry with \cmd{\PretagName} (Section~\ref{sec:IndexSort}):
+% \DescribeMacro{\textUC}
+% \begin{quote}\small
+% \StartNum
+% \begin{verbatim}
+%\PretagName[Greta]{\textSC{Garbo}}{Garbo, Greta}
+%\PretagName[Ada]{\textIT{Lovelace}}{Lovelace, Ada}
+%\PretagName[Charles]{\textBF{Babbage}}{Babbage, Charles}
+%\PretagName{\textUC{Tokugawa}, Ieyasu}{Tokugawa Ieyasu}\end{verbatim}
+%
+% \smallskip\MyStretch
+% |\Name[Greta]{\textSC{Garbo}}|\dotfill \Name[Greta]{\textSC{Garbo}}; \Name[Greta]{\textSC{Garbo}}\\
+% |\Name[Ada]{\textIT{Lovelace}}|\dotfill \Name[Ada]{\textIT{Lovelace}}; \Name[Ada]{\textIT{Lovelace}}\\
+% |\Name[Charles]{\textBF{Babbage}}|\dotfill \Name[Charles]{\textBF{Babbage}}; \Name[Charles]{\textBF{Babbage}}\\
+% |\Name{\textUC{Tokugawa}, Ieyasu}|\dotfill \Name{\textUC{Tokugawa}, Ieyasu}; \Name{\textUC{Tokugawa}, Ieyasu}
+% \end{quote}
+%
+% Font substitutions might occur with these macros.\footnote{Since we switch to Latin Modern Sans in the formatting hooks, the switch to small caps forces a substitution to Latin Modern Roman. This action varies with the font being used.}
+% They \emph{always format their arguments} when using the \texttt{altformat} option or after \cmd{\AltFormatActive}. Likewise, they \emph{never format their arguments} when \cmd{\AltFormatActive*} is used. Still, \cmd{\CapName}, \cmd{\RevComma}, and \cmd{\RevName} can modify the effects of alternate formatting, but only in the text, not the index:
+%
+% \begin{center}\small\MyStretch
+% \begin{tabular}{rl}\toprule
+% |\CapName\Name*[Greta]{\textSC{Garbo}}| & \CapName\Name*[Greta]{\textSC{Garbo}}\\
+% \rowcolor{grey}|\RevComma\Name*[Ada]{\textIT{Lovelace}}| & \RevComma\Name*[Ada]{\textIT{Lovelace}}\\
+% |\RevName\Name*{\textUC{Tokugawa}, Ieyasu}| & \RevName\Name*{\textUC{Tokugawa}, Ieyasu}\\\bottomrule
+% \end{tabular}
+% \end{center}
+%
+% Here is a more practical example on how to format the required argument \marg{SNN\texttt{,\,}Affix} as two separate arguments:
+% \begin{quote}\small
+% \StartNum
+% \begin{verbatim}
+%\PretagName[J.D.]{\textSC{Rockefeller},\textSC{III}}
+% {Rockefeller, John D 3}
+%\PretagName{\textUC{Fukuyama}, Takeshi}{Fukuyama Takeshi}
+%\begin{nameauth}
+% \< JRIII & J.D. & \textSC{Rockefeller},\textSC{III} & >
+% \< Fukuyama & & \textUC{Fukuyama}, Takeshi & >
+%\end{nameauth}\end{verbatim}
+% \end{quote}
+%
+% From above we get \JRIII, then \JRIII. This works also for non-Western names. Applying the macros above, we get:
+% \begin{center}\small\MyStretch
+% \begin{tabular}{rl}\toprule
+% \rowcolor{grey}|\Fukuyama| & \Fukuyama \\
+% |\Fukuyama| & \Fukuyama \\\bottomrule
+% \end{tabular}
+% \end{center}
+%
+% Only the new syntax allows one to use alternate names in the text. For example, ``|\LFukuyama[Sensei]| \LFukuyama[Sensei] wrote \textit{Nihon Fukuin R\=uteru Ky\=okai Shi} in 1954, after studying in the US in the 1930s''.\smallskip
+%
+% \begin{tcolorbox}[colback=white,colframe=nared]
+% \centering Using names designed for alternate formatting also with regular formatting will produce inconsistent formatting and spurious index entries.
+% \end{tcolorbox}\leavevmode
+%
+% \begin{center}\bfseries Example Reference Work\end{center}
+% \phantomsection
+% \label{page:ContinentalXref}
+% This example uses basic Continental formatting. We build on our knowledge so far to construct head-words and articles. Below we use alternate formatting, sort index entries, set up a cross-reference, and define an article macro:
+% \AltFormatActive
+%\newcommand{\RefArticle}[3]{^^A
+% \def\check{#2}^^A
+% \ifx\check\empty
+% \noindent\ForgetThis#1\ #3
+% \else
+% \noindent\ForgetThis#1\ #2\ #3
+% \fi
+%}
+% \begin{quote}\small
+% \StartNum
+% \begin{verbatim}
+%\PretagName[Greta]{\textSC{Garbo}}{Garbo, Greta}
+%\PretagName{\textSC{Misora}, Hibari}{Misora Hibari}
+%\PretagName[Heinz]{\textSC{Rühmann}}{Ruehmann, Heinz}
+%\PretagName[Heinrich Wilhelm]{\textSC{Rühmann}}%
+% {Ruehmann, Heinrich Wilhelm}
+%\IndexRef[Heinrich Wilhelm]{\textSC{Rühmann}}%
+% {\textSC{Rühmann}, Heinz}%
+%
+%\newcommand{\RefArticle}[3]{%
+% \def\check{#2}%
+% \ifx\check\empty
+% \noindent\ForgetThis#1\ #3
+% \else
+% \noindent\ForgetThis#1\ #2\ #3
+% \fi
+%}\end{verbatim}
+% \end{quote}
+% \IndexRef[Heinrich Wilhelm]{\textSC{Rühmann}}{\textSC{Rühmann}, Heinz}
+%
+% \cmd{\RefArticle} either formats the name from the first argument and appends the third argument, ignoring the the second if it is empty, or it formats the first two arguments and appends the third. We determine what those arguments mean by including specific naming macros. That includes using \cmd{\RevComma} for Western names, but not for Eastern ones.
+% \begin{quote}\small
+% \ContinueNum
+% \begin{verbatim}
+%\RefArticle
+% {\RevComma\Name[Greta]{\textSC{Garbo}}}
+% {}
+% {(18 September 1905\,--\,15 April 1990) was a Swedish
+% film actress during the 1920s and 1930s.}
+%
+%\RefArticle
+% {\Name{\textSC{Misora}, Hibari}}
+% {}
+% {(W: ``\RevName\Name*{\textSC{Misora}, Hibari}'';
+% 29 May 1937\,--\,24 June 1989) was a Japanese singer
+% and actress noted for her positive message.}
+%
+%\RefArticle
+% {\RevComma\Name[Heinrich Wilhelm]{\textSC{Rühmann}}}
+% {``\SubvertThis\ForceName\FName[Heinz]{\textSC{Rühmann}}''}
+% {(7 March 1902\,--\,3 October 1994) was a German actor
+% in over 100 films.}
+%\AltFormatInactive\end{verbatim}
+% \end{quote}
+%
+% \begin{quote}\small
+%\RefArticle
+% {\RevComma\Name[Greta]{\textSC{Garbo}}}
+% {}
+% {(18 September 1905\,--\,15 April 1990) was a Swedish
+% film actress during the 1920s and 1930s.}
+%
+%\RefArticle
+% {\Name{\textSC{Misora}, Hibari}}
+% {}%
+% {(W: ``\RevName\Name*{\textSC{Misora}, Hibari}'';
+% 29 May 1937\,--\,24 June 1989) was a Japanese singer
+% and actress noted for her positive message.}
+%
+%\RefArticle
+% {\RevComma\Name[Heinrich Wilhelm]{\textSC{Rühmann}}}
+% {``\SubvertThis\ForceName\FName[Heinz]{\textSC{Rühmann}}''}
+% {(7 March 1902\,--\,3 October 1994) was a German actor
+% in over 100 films.}
+% \end{quote}
+%
+% \subsubsection[Advanced Features]{Advanced Formatting Features}
+% \label{sec:AltAdvanced}
+%
+% Advanced features involve a dance of sorts between the name argument macros and the formatting hooks. We are moving from immutability to changeability. Yet so far, we have heard that this could change conditional statements and create spurious index entries.
+%
+% Using \cmd{\noexpand} befor macros in name arguments that expand conditionally will solve this problem for us:
+% \begin{itemize}
+% \item The use of \cmd{\noexpand} isolates the global state of \cmd{\textSC} and the other formatting macros from local changes in the formatting hooks.
+% \item Indexing never occurs within the formatting hooks.
+% \item Special triggering macros in the formatting hooks isolate local changes.
+% \end{itemize}
+%
+% As a result of these points, advanced alternate formatting works as expected. It uses a similar approach as did the Boolean flags for Roman names (page~\pageref{page:Romani}).
+% \smallskip
+%
+% \begin{tcolorbox}[colback=white,colframe=nared]
+% \centering Using \cmd{\noexpand} is key to consistent index entries.
+% \end{tcolorbox}\smallskip
+% \newpage
+%
+% \begin{center}\bfseries Alternate Capitalization\end{center}
+% When alternate formatting is enabled, \cmd{\CapThis}\DescribeMacro{\AltCaps}\ causes \cmd{\AltCaps} to format its argument only in a formatting hook. It is enabled whenever alternate formatting is enabled, but it works independently of \cmd{\AltOn} and \cmd{\AltOff} below:
+% \begin{quote}
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\noexpand}\cmd{\AltCaps}\marg{Arg}\\
+% \end{tabular}
+% }
+% \end{quote}
+%
+% We introduce this macro with a silly example, disabling indexing in the process:
+% \IndexInactive
+% \begin{quote}\small
+% \StartNum
+% \begin{verbatim}
+%\IndexInactive
+%What's in \Name[\noexpand\AltCaps{a}]{Name}?
+%\CapThis\Name*[\noexpand\AltCaps{a}]{Name} smells not,
+%but a rose does, even if it has a
+%\Name[\noexpand\AltCaps{a}]{Name}.\end{verbatim}
+%
+% What's in \Name[\noexpand\AltCaps{a}]{Name}?
+% \CapThis\Name*[\noexpand\AltCaps{a}]{Name} smells not,
+% but a rose does, even if it has a
+% \Name[\noexpand\AltCaps{a}]{Name}.
+% \end{quote}
+%
+% \begin{center}\bfseries Advanced Alternate Formatting\end{center}
+% Advanced features come with ``some assembly required''. An author must put one of the trigger macros below into one or more of the \textsf{nameauth} formatting hooks. These macros change the state of the formatting macros.\medskip
+%
+% Vaguely reminiscent of\DescribeMacro{\AltOff}\ an automobile's manual clutch and gearbox, \cmd{\AltOff} deactivates \cmd{\textSC}, \cmd{\textBF}, \cmd{\textIT}, and \cmd{\textUC} only in a formatting hook.\medskip
+%
+% Likewise, \cmd{\AltOn}\DescribeMacro{\AltOn}\ activates \cmd{\textSC}, \cmd{\textBF}, \cmd{\textIT}, and \cmd{\textUC} only in a formatting hook.\medskip
+%
+% Continuing the example (indexing suppressed), we redefine \cmd{\MainNameHook} to suppress small caps. Note the copious use of \cmd{\noexpand}:
+% \renewcommand*\MainNameHook{\sffamily\AltOff}
+% \begin{quote}\small
+% \ContinueNum
+% \begin{verbatim}
+%\renewcommand*\MainNameHook%
+% {\sffamily\AltOff}% we match the manual
+%
+%\CapThis\Name
+% [\noexpand\textSC{\noexpand\AltCaps{a} Name}]
+% {\noexpand\textSC{Problem}}
+%will not become a \Name
+% [\noexpand\textSC{\noexpand\AltCaps{a} Name}]
+% {\noexpand\textSC{Problem}},
+%even if it smells like a rose.
+%\IndexActive\end{verbatim}
+%
+%\CapThis\Name
+% [\noexpand\textSC{\noexpand\AltCaps{a} Name}]
+% {\noexpand\textSC{Problem}}
+%will not become a \Name
+% [\noexpand\textSC{\noexpand\AltCaps{a} Name}]
+% {\noexpand\textSC{Problem}},
+%even if it smells like a rose.
+% \end{quote}
+% \IndexActive
+%
+% Now indexing is active again. Using the same \cmd{\MainNameHook} defined above, consider the following in a document preamble:
+% \begin{quote}\small
+% \StartNum
+% \begin{verbatim}
+%\begin{nameauth}
+% \< Luth & Martin & \noexpand\textSC{Luther} & >
+% \< Cath & Catherine \noexpand\AltCaps{d}e'
+% & \noexpand\textSC{Medici} & >
+%\end{nameauth}
+%\PretagName[Martin]{\noexpand\textSC{Luther}}{Luther, Martin}
+%\PretagName[Catherine \noexpand\AltCaps{d}e']
+% {\noexpand\textSC{Medici}}{Medici, Catherine de}\end{verbatim}
+% \end{quote}
+%
+% In the body text, we see \cmd{\ForgetThis}\cmd{\Luth} \ForgetThis\Luth\ and \cmd{\Luth} \Luth. Likewise \cmd{\Cath} \Cath, then \cmd{\Cath} \Cath. Medieval Italian differs from modern Italian with respect to particles. To get \LCath[\noexpand\AltCaps{d}e'] in the text, use |\LCath[\noexpand\AltCaps{d}e']|, with which \cmd{\CapThis} also works. The index entry should be ``\ShowIdxPageref*[Catherine \noexpand\AltCaps{d}e']{\noexpand\textSC{Medici}}\,'', instead of ``\ShowIdxPageref*[Catherine]{de'~\textSC{Medici}}''.\medskip
+%
+% \phantomsection
+% \label{page:Inflections}
+% We\Info{Name inflections} can design grammatical inflections either with or without alternate formatting. \cmd{\DoGentrue} occurs only in the formatting hook, keeping the index entries consistent via \cmd{\noexpand}. Highly inflected languages require two Boolean flags per case and nested conditional statements.\footnote{We hide the same information that we did on page~\pageref{page:Sobriquets}. A copy of this example is in \texttt{examples.tex}, located with this manual.} In the example below we do not use the formatting in this manual and we hide the special tags used herein. In the preamble of a document we would have:
+%
+% \begin{quote}\small
+% \StartNum
+% \begin{verbatim}
+%\newif\ifGenitive
+%\newif\ifDoGen
+%\newcommand*\JEFF{\ifDoGen\textSC{Jefferson's}\else
+% \textSC{Jefferson}\fi}
+%\begin{nameauth}
+% \< Jeff & Thomas & \noexpand\JEFF & >
+%\end{nameauth}
+%\PretagName[Thomas]{\noexpand\JEFF}{Jefferson, Thomas}
+%\TagName[Thomas]{\noexpand\JEFF}{, pres.}\end{verbatim}
+% \end{quote}
+%
+% In the preamble or document text, we can have:
+% \renewcommand*\NamesFormat[1]{\ifGenitive\DoGentrue\fi#1\global\Genitivefalse}
+% \renewcommand*\MainNameHook[1]{\ifGenitive\DoGentrue\fi\AltOff#1\global\Genitivefalse}
+% \begin{quote}\small
+% \ContinueNum
+% \begin{verbatim}
+%\renewcommand*\NamesFormat[1]
+% {\ifGenitive\DoGentrue\fi#1\global\Genitivefalse}
+%\renewcommand*\MainNameHook[1]
+% {\ifGenitive\DoGentrue\fi\AltOff#1\global\Genitivefalse}
+%
+%Consider \Genitivetrue\Jeff\ legacy. More on \Jeff\ later.
+%\Genitivetrue\Jeff\ reputation has declined in recent decades.\end{verbatim}
+%
+% \smallskip
+% Consider \Genitivetrue\Jeff\ legacy. More on \Jeff\ later.
+% \Genitivetrue\Jeff\ reputation has declined in recent decades.
+% \end{quote}
+%
+% Now we end the scope, resume normal formatting, and do not use the names in this section outside of it.\footnote{In a \texttt{dtx} file it is best to put the \texttt{nameauth} environment, \cmd{\PretagName}, and \cmd{\TagName} macros in the driver section, especially when names contain macros.}
+% \AltFormatInactive
+% \endgroup^^A Local format hook redefinition
+%
+% \ReturnLink
+% \vfill
+%
+% \noindent Perhaps one can use the \textsf{nameauth package}\dots
+% \begin{verse}
+% There in the ring where name and image meet\\[1ex]\hfill---\Name[W.H.]{Auden}, ``Perhaps''
+% \end{verse}
% \newpage
%
% \subsection{Name Decisions}
% \label{sec:NameDecisions}
%
-% The macros in this section force and detect name states. Below we keep names consistent with \textsf{beamer} overlays using some of the macros explained in this section. Otherwise, name forms will change as one advances the slides:\footnote{A copy of this example is in \texttt{examples.tex}, collocated with this manual.}
+% The macros in this section force and detect name states. Below we keep names consistent with \textsf{beamer} overlays using some of the macros explained in this section. Otherwise, name forms will change as one advances the slides:\footnote{A copy of this example is in \texttt{examples.tex}, located with this manual.}
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -3396,8 +3911,7 @@ the README.txt or README for more information.
% \begin{itemize}\footnotesize
% \item<1-> Original\ForgetName[George]{Washington}%
% \ForgetName[George]{Washington's}\\
-% \Name[Martin]{Van Buren} changes
-% after the first overlay.
+% This version of \Name[Ulysses S.]{Grant} changes.
% \begin{enumerate}
% \item<2-> \IfMainName[George]{Washington's}{He}%
% {\Name[George]{Washington}}
@@ -3411,7 +3925,7 @@ the README.txt or README for more information.
% \end{enumerate}
% \item<1-> Reordered\ForgetName[George]{Washington}%
% \ForgetName[George]{Washington's}\\
-% \ForgetThis\Name[Ulysses S.]{Grant}
+% This version of \ForgetThis\Name[Ulysses S.]{Grant}
% does not change.
% \begin{enumerate}
% \item<3-> \IfMainName[George]{Washington}{His}%
@@ -3429,7 +3943,6 @@ the README.txt or README for more information.
%
%\end{document}\end{verbatim}
%\IndexName[George]{Washington}
-%\IndexName[Martin]{Van Buren}
%\IndexName[Ulysses S.]{Grant}
% \end{quote}
%
@@ -3438,50 +3951,111 @@ the README.txt or README for more information.
% \subsubsection{Making Decisions}
% \label{sec:NameControl}
%
-% By\Info{Naming system\break behavior} default, the macros below produce global effects. They change both the \texttt{!MN} and \texttt{!NF} data sets (Section~\ref{sec:NamePatterns}). With \cmd{\ForceName} (Section~\ref{sec:Formatting}), they change formatting. Apart from \cmd{\ForceName}, they also change long or short name forms and the outcome of the testing macros in the next section:
-%
-% \begin{center}\small\MyStretch
-% \begin{tabular}{lccc}\toprule
-% \bfseries Defaults & \bfseries Name Length & \bfseries Format Hooks & \bfseries Test Path\\\midrule
-% \bfseries Pre-First Use & Long & First & False\\
-% \rowcolor{black!7!white}\bfseries Subsequent Use\quad\hbox{} & Long or short & Subsequent & True\\\bottomrule
-% \end{tabular}\medskip\\
+% By default, the macros below produce global effects. They change both the \texttt{!MN} and \texttt{!NF} data sets (Section~\ref{sec:NamePatterns}). With \cmd{\ForceName} (Section~\ref{sec:Formatting}), they change formatting. Apart from \cmd{\ForceName}, they also change long or short name forms and the outcome of both indexing error protection (Section~\ref{sec:GeneralIndex}) and the name testing macros (Section~\ref{sec:NameTests}).\medskip
%
-% \begin{tabular}{lll}\toprule
-% \bfseries Modifications & \bfseries Form & \bfseries Function\\\midrule
-% \hfill|\SubvertThis\LAnth| & \SubvertThis\LAnth & force subsequent use \hbox to 3.02em{\hfill}\\
-% & & force long form\\
-% \rowcolor{black!7!white} |\ForceName\SAnth| & \ForceName\SAnth & default subsequent use\\
-% \rowcolor{black!7!white} & & force first-use format\\
-% |\ForgetThis\SAnth| & \ForgetThis\SAnth & force first use; default long\\
-% & & default first-use format\\
-% \rowcolor{black!7!white}|\SAnth| & \SAnth & default subsequent use\\
-% \rowcolor{black!7!white} & & default short form\\\bottomrule
-% \end{tabular}
-% \end{center}
-%
% \DescribeMacro{\ForgetName}
-% This macro takes the same arguments as \cmd{\Name}. It ``forgets'' a name, forcing a ``pre-first use'' state that will trigger a first-time name use:
+% This macro takes the same arguments as \cmd{\Name}, but it prints no output. It ``forgets'' a name, forcing a ``pre-first use'' state that will trigger a first-time name use the next time a naming macro makes reference to the name:
% \begin{quote}
-% \fbox{\mystrut\ \cmd{\ForgetName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\ }
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\ForgetName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\\
+% \end{tabular}
+% }
% \end{quote}
-%
-% \DescribeMacro{\ForgetThis}
-% This prefix macro causes the next instance of a naming macro or shorthand to ``forget'' a name before printing it.\Version{3.1} After knowing |\Einstein| ``\Einstein'' we forget him and again have a first reference: |\ForgetThis\Einstein| ``\ForgetThis\Einstein.''\medskip
+% This macro ``unprotects'' names like \cmd{\IncludeName*} ``unprotects'' cross-references, allowing one to make a \textit{see} reference to a name, even if that name already has index page references. If one is using a single name index, that could be an error. If one is using multiple indexes for names, however, that could be necessary.\medskip
%
% \DescribeMacro{\SubvertName}
-% This macro takes the same arguments as \cmd{\Name}. It ``subverts'' a name, creating a name pattern control sequence and forcing a ``subsequent use'' case:
-% \begin{quote}\small
-% \fbox{\mystrut\ \cmd{\SubvertName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\ }
+% This macro takes the same arguments as \cmd{\Name}, but it produces no output in the text. It ``subverts'' a name by creating a name pattern control sequence, forcing a ``subsequent use'', and ``protecting'' a name from being used as a \textit{see} reference (similar to \cmd{\ExcludeName} and cross-references):
+% \begin{quote}
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\SubvertName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\\
+% \end{tabular}
+% }
% \end{quote}
%
+% \DescribeMacro{\ForgetThis}
+% This prefix macro causes the next instance of a naming macro or shorthand to ``forget'' a name before printing it.\Version{3.1} After knowing |\Einstein| ``\Einstein'' we forget him and again have a first reference: |\ForgetThis\Einstein| ``\ForgetThis\Einstein''.\medskip
+%
+% This\Warn{} macro does not affect the index unless one uses \cmd{\ForgetThis} in a situation where a naming macro produces no output in the text. That results in the same outcome as a careless use of \cmd{\ForgetName}:
+% \begin{center}\small\MyStretch
+% \begin{tabular}{c@{\ \ }p{0.43\textwidth}@{\ }p{0.22\textwidth}}\toprule
+% Page & Macro & Index Result\\\midrule
+% \rowcolor{grey}^^A
+% 10 & \cmd{\ForgetThis}\cmd{\JustIndex}\cmd{\Einstein} & Einstein, Albert, 10\\
+% 12 & \cmd{\IndexRef[Albert]\{Einstein\}\%} & \\
+% & \texttt{\{Smart Dude\}}\dotfill \hbox{} & Einstein, Albert, 10, \textit{see} Smart Dude\\\bottomrule
+% \end{tabular}
+% \end{center}
+%
+%
% \DescribeMacro{\SubvertThis}
-% This prefix macro causes the next instance of a naming macro or shorthand to ``subvert'' a name before printing it.\Version{3.1} As in the table on page~\pageref{page:Priorities}, \cmd{\ForgetThis} has a higher priority than \cmd{\SubvertThis} and nullifies it when used together.\medskip
+% This prefix macro causes the next instance of a naming macro or shorthand to ``subvert'' a name before printing it.\Version{3.1} As indicated in the table on page~\pageref{page:Priorities}, \cmd{\ForgetThis} has a higher priority than \cmd{\SubvertThis} and negates it. The caveat regarding naming macro output applies to both \cmd{\SubvertThis} and \cmd{\ForgetThis}.
+% \vfil
+%
+% \begin{tcolorbox}[colback=white,colframe=nared]
+% \centering We advise one to avoid using \cmd{\ForgetThis} and \cmd{\SubvertThis}\\ before any naming macro that produces no output in the text.
+% \end{tcolorbox}\medskip
+% \newpage
+%
+% \begin{center}\bfseries Name Decision and Formatting Summary\end{center}
+% \phantomsection
+%
+% \begin{itemize}\small
+% \item[First Use:] \cmd{\Bailey} \dotfill \ForgetThis\Bailey\\
+% Name control sequence (cseq) undefined, then created with text output. Index \textit{see} protection set.
+% Default name form (long). Default first-use format hooks.
+%
+% \item[Later Use:] \cmd{\Bailey} \dotfill \Bailey\\
+% No change to extant name cseq. No change to index \textit{see} protection.
+% Default name form (short). Default later-use format hooks.
+%
+% \item[Forgotten:] \cmd{\ForgetName[Betsey]\{Bailey\}} \dotfill (no output)\ForgetName[Betsey]{Bailey}\\
+% \emph{Name cseq deleted. Index \textit{see} protection removed. Force first use.}
+% Next use of \cmd{\Bailey} will be a first use.
+%
+% \item[Subverted:] \cmd{\SubvertName[Betsey]\{Bailey\}} \dotfill (no output)\SubvertName[Betsey]{Bailey}\\
+% \emph{Name cseq created. Index \textit{see} protection set. Force later use.}
+% Next use of \cmd{\Bailey} will be a later use.
+%
+% \item[\cmd{\ForgetThis}:] \cmd{\ForgetThis}\cmd{\Bailey} \dotfill \ForgetThis\Bailey\\
+% \emph{Name cseq deleted, then created. Index \textit{see} protection removed, then set. Force first use.} Default form (long). Default first-use format hooks. Next use of \cmd{\Bailey} will be a later use if output occurs.
+%
+% \item[\cmd{\SubvertThis}:] \cmd{\SubvertThis}\cmd{\Bailey} \dotfill \SubvertThis\Bailey\\
+% \emph{Name cseq created if undefined. Index \textit{see} protection set.
+% Force later use.} Default form (short). Default later-use format hooks. Next use of \cmd{\Bailey} will be a later use if output occurs.
+%
+% \item[Long Use:] \cmd{\LBailey} \dotfill \LBailey\\
+% No change to extant name cseq. No change to index \textit{see} protection.
+% \emph{Force long name form.} No change to format hooks.
+%
+% \item[``Short'', first:] \cmd{\ForgetThis}\cmd{\SBailey} \dotfill \ForgetThis\SBailey\\
+% \emph{Name cseq deleted, then created}. \emph{Index \textit{see} protection removed, then set}. \emph{First use forces long form.} Default first-use format hooks.
+%
+% \item[Short, later:] \cmd{\SBailey} \dotfill \SBailey\\
+% No change to extant name cseq. No change to index \textit{see} protection.
+% \emph{Force first name or short name.} No change to format hooks.
+%
+% \item[Forced, later:] \cmd{\ForceName}\cmd{\Bailey} \dotfill \ForceName\Bailey\\
+% No change to extant name cseq. No change to index \textit{see} protection. Default name form. \emph{Force first-use hooks.}
+%
+% \item[Forced, long:] \cmd{\ForceName}\cmd{\LBailey} \dotfill \ForceName\LBailey\\
+% No change to extant name cseq. No change to index \textit{see} protection. \emph{Force long name form. Force first-use hooks.}
+%
+% \item[Forced, short:] \cmd{\ForceName}\cmd{\SBailey} \dotfill \ForceName\SBailey\\
+% No change to extant name cseq. No change to index \textit{see} protection.
+% \emph{Force first name or short name if subsequent use. Force first-use hooks.}
+% \end{itemize}
+% \medskip
%
% \DescribeMacro{\LocalNames}
-% \cmd{\LocalNames} restricts the effects of the macros above to the current naming system.
+% By default, \cmd{\ForgetName}, \cmd{\SubvertName}, \cmd{\ForgetThis}, and \cmd{\SubvertThis} are not limited either by scope or by the active naming system.
% \DescribeMacro{\GlobalNames}
-% \cmd{\GlobalNames} restores the default behavior. We define a macro that reports whether a name exists in the main matter, front matter, both, or none:
+% \cmd{\LocalNames} restricts the effects of these macros to the current naming system, but not to scope. \cmd{\GlobalNames} restores the default behavior that affects both systems. Both macros always have global scope.
+%
+% To see how these two macros work, in the following example we define a macro that reports whether or not |\Name[Charlie]{Chaplin}| exists. This macro gives four possible results: the name exists in the main matter, it exists in the front matter, it exists in both systems, or it does not exist (see Section~\ref{sec:NameTests}):
+% \newpage
+%
% \def\CheckChuck{{\bfseries\IfFrontName[Charlie]{Chaplin}%
% {\IfMainName[Charlie]{Chaplin}{both}{front}}%
% {\IfMainName[Charlie]{Chaplin}{main}{none}}}}%
@@ -3492,130 +4066,187 @@ the README.txt or README for more information.
% {\IfMainName[Charlie]{Chaplin}{both}{front}}%
% {\IfMainName[Charlie]{Chaplin}{main}{none}}}}\end{verbatim}
% \end{quote}
-%
-% We start with no extant name:
-% \begin{quote}\small\MyStretch
-% |\CheckChuck|\dotfill\CheckChuck\qquad\qquad\qquad\hbox{}
+% \noindent
+% We start in the ``main-matter'' system with no extant name:
+% \begin{quote}\small\MyStretch\ForgetName[Charlie]{Chaplin}
+% |\CheckChuck|\dotfill \CheckChuck\qquad\qquad\qquad\hbox{}
% \end{quote}
-%
% We create a name in the ``main matter'':
% \begin{quote}\small\MyStretch
-% |\Name*[Charlie]{Chaplin}|\dotfill\Name*[Charlie]{Chaplin}\qquad\qquad\qquad\hbox{}\\
-% |\CheckChuck|\dotfill\CheckChuck\qquad\qquad\qquad\hbox{}
+% |\Name[Charlie]{Chaplin}|\dotfill \Name[Charlie]{Chaplin}\qquad\qquad\qquad\hbox{}\\
+% |\CheckChuck|\dotfill \CheckChuck\qquad\qquad\qquad\hbox{}
% \end{quote}
-%
-% We switch to the ``front-matter'' and create a name, but since we are using the \texttt{quote} environment, we add \cmd{\global}:
+% We switch to the ``front-matter'' system and create a name, but since we are using the \texttt{quote} environment, we add \cmd{\global}:
% \begin{quote}\small\MyStretch
% |\global\NamesInactive|\global\NamesInactive\\
-% |\Name*[Charlie]{Chaplin}|\dotfill\Name*[Charlie]{Chaplin}\qquad\qquad\qquad\hbox{}\\
-% |\CheckChuck|\dotfill\CheckChuck\qquad\qquad\qquad\hbox{}
+% |\Name[Charlie]{Chaplin}|\dotfill \Name[Charlie]{Chaplin}\qquad\qquad\qquad\hbox{}\\
+% |\CheckChuck|\dotfill \CheckChuck\qquad\qquad\qquad\hbox{}
% \end{quote}
+% We now have two names. Their patterns are: \texttt{\ShowPattern[Charlie]{Chaplin}!MN} for the main matter and \texttt{\ShowPattern[Charlie]{Chaplin}!NF} for the front matter (Section~\ref{sec:NamePatterns}).
%
-% We now have two names. Their patterns are:
-% \begin{quote}\small\MyStretch
-% \texttt{\ShowPattern[Charlie]{Chaplin}!MN}\\
-% \texttt{\ShowPattern[Charlie]{Chaplin}!NF}
-% \end{quote}
-%
-% We use \cmd{\Localnames} to make \cmd{\ForgetName} and \cmd{\SubvertName} work with only the front-matter system. Then we ``forget'' the front-matter name:
+% We use \cmd{\LocalNames} to make both \cmd{\ForgetName} and \cmd{\SubvertName} work with only the current system. When we ``forget'' the name, the current system is front matter, so we forget the front-matter name:
% \begin{quote}\small\MyStretch
% |\LocalNames|\LocalNames\\
% |\ForgetName[Charlie]{Chaplin}|\ForgetName[Charlie]{Chaplin}\\
-% |\CheckChuck|\dotfill\CheckChuck\qquad\qquad\qquad\hbox{}
+% |\CheckChuck|\dotfill \CheckChuck\qquad\qquad\qquad\hbox{}
% \end{quote}
-%
% Next we ``subvert'' the front-matter name to ``remember'' it again and switch to main matter, again using \cmd{\global} to ignore scoping.
% \begin{quote}\small\MyStretch
% |\SubvertName[Charlie]{Chaplin}|\SubvertName[Charlie]{Chaplin}\\
% |\global\NamesActive|\global\NamesActive\\
-% |\CheckChuck|\dotfill\CheckChuck\qquad\qquad\qquad\hbox{}
+% |\CheckChuck|\dotfill \CheckChuck\qquad\qquad\qquad\hbox{}
% \end{quote}
-%
-% We forget the main-matter name and additionally reset the default behavior so that \cmd{\ForgetName} and \cmd{\SubvertName} work with both systems:
+% Now the current system is main matter. We then forget the main-matter name only. Additionally, we use \cmd{\GlobalNames} to reset the default behavior so that \cmd{\ForgetName} and \cmd{\SubvertName} work with both systems again:
% \begin{quote}\small\MyStretch
% |\ForgetName[Charlie]{Chaplin}|\ForgetName[Charlie]{Chaplin}\\
% |\GlobalNames|\GlobalNames\\
-% |\CheckChuck|\dotfill\CheckChuck\qquad\qquad\qquad\hbox{}
+% |\CheckChuck|\dotfill \CheckChuck\qquad\qquad\qquad\hbox{}
% \end{quote}
-%
% Finally, we forget everything. Even though we are in a main-matter section, the front-matter name also goes away:
% \begin{quote}\small\MyStretch
% |\ForgetName[Charlie]{Chaplin}|\ForgetName[Charlie]{Chaplin}\\
-% |\CheckChuck|\dotfill\CheckChuck\qquad\qquad\qquad\hbox{}
+% |\CheckChuck|\dotfill \CheckChuck\qquad\qquad\qquad\hbox{}
% \end{quote}
-%
% \ReturnLink
-%
+% \newpage
+%
% \subsubsection{Testing Decisions}
% \label{sec:NameTests}
%
-% The macros in this section test for the presence or absence of a name, then expand based on the result. For example, they can synchronize information between a float and body text by each testing whether a name exists and making decisions about the information accordingly.\medskip
+% The macros in this section test for the presence or absence of a name, then expand to a result based on the outcome of the test.\medskip
+%
+% \DescribeMacro{\GlobalNameTest}
+% The default behavior encapsulates the decision paths in a local scope, insulating any changes therein.
+% \DescribeMacro{\LocalNameTest}
+% If this is not desired, use the \texttt{globaltest} option or \cmd{\GlobalNameTest}. \cmd{\LocalNameTest} will enable it again.\Version{3.5} These commands affect assignment statements in test paths. By default, one must explicitly use \cmd{\global} when desired. See also the example below.\medskip
%
% \DescribeMacro{\IfMainName}
% In order to test whether or not a ``main matter'' name control sequence exists, use this long macro that can accommodate paragraph breaks:
-% \begin{quote}\small
-% \fbox{\mystrut\ \cmd{\IfMainName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\marg{yes}\marg{no} }
+% \begin{quote}
+% \fbox{
+% \begin{tabular}{@{}l@{}}
+% {\Large\strut}\cmd{\IfMainName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\marg{yes}\marg{no}\\
+% \end{tabular}
+% }
% \end{quote}
-%
-% For example, because we have not seen the equivalent of |\Name[Bob]{Hope}| or |\SubvertName[Bob]{Hope}|, we try the following test and get:
-% \begin{quote}\small\MyStretch
-% |\IfMainName[Bob]{Hope}{Bob here!}{No Bob.}|\dotfill \IfMainName[Bob]{Hope}{Bob here!}{No Bob.}
+%
+% For example we have not encountered |\Name[Bob]{Hope}| yet. Using \cmd{\IndexName} does not affect the tests in this section. We could do the following test that will reflect whether or not the name is present:
+% \begin{quote}\small
+% \StartNum
+% \begin{verbatim}
+%I heard someone say: \IfMainName[Bob]{Hope}
+% {Bob here!}
+% {No Bob here.}\IndexName[Bob]{Hope}\end{verbatim}
+%
+% I heard someone say: \IfMainName[Bob]{Hope}
+% {Bob here!}
+% {No Bob.}\IndexName[Bob]{Hope}
% \end{quote}
%
-% Still, we can create an index entry here with \IndexName[Bob]{Hope}|\IndexName[Bob]{Hope}| and it will not affect the test above. Since, however, we have encountered the equivalent of |\Name{Elizabeth,I}| many times in the document, we get the following result:
+% Now we test for |\Name{Elizabeth,I}|, a name that has occurred, and we also show the difference between local and global test paths:
% \begin{quote}\small
-% |\IfMainName{Elizabeth,I}{Bess here!}{No Bess.}|\dotfill\IfMainName{Elizabeth,I}{Bess here!}{No Bess.}
+% \StartNum
+% \begin{verbatim}
+%\GlobalNameTest
+%\def\msg{We are unsure about \LEliz}
+%\IfMainName{Elizabeth,I}
+% {\def\msg{We really do know of \LEliz}}
+% {\def\msg{We do not know of \LEliz}}
+% \msg\quad (\cmd{\GlobalNameTest}).
+%
+%\LocalNameTest
+%\def\msg{We are unsure about \LEliz}
+%\IfMainName{Elizabeth,I}
+% {\def\msg{We really do know of \LEliz}}
+% {\def\msg{We do not know of \LEliz}}
+% \msg\quad (\cmd{\LocalNameTest}).\end{verbatim}
+% \smallskip
+%
+% \GlobalNameTest
+% \def\msg{We are unsure about \LEliz}
+% \IfMainName{Elizabeth,I}
+% {\def\msg{We really do know of \LEliz}}
+% {\def\msg{We do not know of \LEliz}}
+% \msg\quad (\cmd{\GlobalNameTest}).
+%
+% \LocalNameTest
+% \def\msg{We are unsure about \LEliz}
+% \IfMainName{Elizabeth,I}
+% {\def\msg{We really do know of \LEliz}}
+% {\def\msg{We do not know of \LEliz}}
+% \msg\quad (\cmd{\LocalNameTest}).
% \end{quote}
+% We see that the default keeps local any assignments made in the test paths.\medskip
%
% \DescribeMacro{\IfFrontName}
% In order to test whether or not a ``front matter'' name control sequence exists, use this long macro that can accommodate paragraph breaks. Its syntax is:
-% \begin{quote}\small
-% \fbox{\mystrut\ \cmd{\IfFrontName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\marg{yes}\marg{no} }
+% \begin{quote}
+% \fbox{
+% \begin{tabular}{@{}l@{}}
+% {\Large\strut}\cmd{\IfFrontName}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\marg{yes}\marg{no}\\
+% \end{tabular}
+% }
% \end{quote}
-% This macro works like \cmd{\IfMainName}, except using the ``front matter'' name control sequences as the test subject.
+% This macro works just like \cmd{\IfMainName}, except using the ``front matter'' name control sequences as the test subject. These testing macros prove their worth especially through combination. For example, on the next page we do a test based on Section~\ref{sec:Formatting}.
+% \newpage
%
% \phantomsection\label{page:Carnap}
-% For example, based on Section~\ref{sec:Formatting}, we see that ``\ignorespaces
-% \IfFrontName[Rudolph]{Carnap}%
-% {\IfMainName[Rudolph]{Carnap}%
-% {\Name[Rudolph]{Carnap} is both}%
-% {\Name[Rudolph]{Carnap} is only front-matter}}%
-% {\IfMainName[Rudolph]{Carnap}%
-% {\Name[Rudolph]{Carnap} is only main-matter}%
-% {\Name[Rudolph]{Carnap} is not mentioned}}'' a main-matter and front-matter name with the following test:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
-%\IfFrontName[Rudolph]{Carnap}%
+%\IfFrontName[Rudolph]{Carnap}
%{%
-% \IfMainName[Rudolph]{Carnap}%
-% {\Name[Rudolph]{Carnap} is both}%
-% {\Name[Rudolph]{Carnap} is only front-matter}%
+% \IfMainName[Rudolph]{Carnap}
+% {\Name[Rudolph]{Carnap} is in both main- and front-matter text.}
+% {\Name[Rudolph]{Carnap} is only in front-matter text.}
%}%
%{%
-% \IfMainName[Rudolph]{Carnap}%
-% {\Name[Rudolph]{Carnap} is only main-matter}%
-% {\Name[Rudolph]{Carnap} is not mentioned}%
+% \IfMainName[Rudolph]{Carnap}
+% {\Name[Rudolph]{Carnap} is only in main-matter text.}
+% {\Name[Rudolph]{Carnap} has not been mentioned.}
%}\end{verbatim}
+%
+% \IfFrontName[Rudolph]{Carnap}
+% {%
+% \IfMainName[Rudolph]{Carnap}
+% {\Name[Rudolph]{Carnap} is in both main- and front-matter text.}
+% {\Name[Rudolph]{Carnap} is only in front-matter text.}
+% }%
+% {%
+% \IfMainName[Rudolph]{Carnap}
+% {\Name[Rudolph]{Carnap} is only in main-matter text.}
+% {\Name[Rudolph]{Carnap} has not been mentioned.}
+% }
% \end{quote}
%
% \DescribeMacro{\IfAKA}
% This macro tests whether or not a regular or excluded form of cross-reference control sequence exists. The syntax is:
-% \begin{quote}\small
-% \fbox{\mystrut\ \cmd{\IfAKA}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\marg{y}\marg{n}\marg{excluded} }
+% \begin{quote}
+% \fbox{
+% \begin{tabular}{@{}l@{}}
+% {\Large\strut}^^A
+% \cmd{\IfAKA}\oarg{FNN}\marg{SNN|,|Affix}\oarg{Alternate}\marg{y}\marg{n}\marg{excl}\\
+% \end{tabular}
+% }
% \end{quote}
%
-% This macro works like \cmd{\IfMainName}, although it has an additional \meta{excluded} branch in order to detect the activity of \cmd{\ExcludeName} (Section~\ref{sec:IndexXref}).
-%
-% Cross-references are governed by name control sequences ending in \texttt{!PN} (Section~\ref{sec:NamePatterns}). Regular cross-reference control sequences (the \marg{y} path) expand to empty. Excluded control sequences (the \marg{excluded} path) expand to \texttt{!}.
+% This macro also works like \cmd{\IfMainName}, except that it has an additional \meta{excl} branch in order to detect the activity of \cmd{\ExcludeName} (Section~\ref{sec:GeneralIndex}).
%
-%\cmd{\ExcludeName} creates excluded xrefs; \cmd{\IncludeName} destroys them. Regular xrefs are created by \cmd{\IndexRef}, \cmd{\AKA}, \cmd{\AKA*}, and \cmd{\PName}; they are destroyed by \cmd{\IncludeName*}. Here is how we use this logic:
-%
-% \begin{enumerate}
-% \item In the text we refer to former pro-wrestler and Minnesota governor \Name[Jesse]{Ventura}, |\Name[Jesse]{Ventura}|.
-% \item We establish his lesser-known legal name as an alias: ``\IndexRef[James]{Janos}{Ventura, Jesse}\Name[James]{Janos},''\\ |\IndexRef[James]{Janos}{Ventura,|\,|Jesse}\Name[James]{Janos}|.
+% Cross-references\Version{3.5} are governed by name control sequences ending in \texttt{!PN} (Section~\ref{sec:NamePatterns}).
+% \begin{itemize}
+% \item Excluded control sequences (the \meta{excl} path) expand to the value of \cmd{\@nameauth@Exclude}.
+% \item Regular cross-references (the \meta{y} path) do not expand to that value. At present, they are empty.
+% \item \cmd{\ExcludeName} creates excluded xrefs. \cmd{\IncludeName} destroys them.
+% \item Regular xrefs are created by \cmd{\IndexRef}, \cmd{\AKA}, \cmd{\PName} and their starred forms. Regular xrefs are destroyed by \cmd{\IncludeName*}.
+% \end{itemize}
%
-% \item We get the result: ``\IfAKA[James]{Janos}{\Name*[Jesse]{Ventura} is a stage name}{\Name*[Jesse]{Ventura} is a regular name}{}.'' If we do not use \cmd{\ExcludeName}, we can leave the \marg{excluded} branch empty:
+% Based on the known facts above, here we offer some examples about how to use this logic:
+% \begin{enumerate}
+% \item In the\PatInfo{\ShowPattern[Jesse]{Ventura}!MN\break \ShowPattern[James]{Janos}!PN\break \ShowPattern[James]{Janos}!MN} text we refer to former pro-wrestler and Minnesota governor \Name[Jesse]{Ventura}, |\Name[Jesse]{Ventura}|.
+% \item We establish his lesser-known legal name as an alias: ``\IndexRef[James]{Janos}{Ventura, Jesse}\Name[James]{Janos}'',\\ |\IndexRef[James]{Janos}{Ventura,|\,|Jesse}\Name[James]{Janos}|.
+%
+% \item We get the result: ``\IfAKA[James]{Janos}{\Name*[Jesse]{Ventura} is a stage name}{\Name*[Jesse]{Ventura} is a regular name}{}''. If we do not use \cmd{\ExcludeName}, we can leave the \meta{excl} branch empty:
+% \end{enumerate}
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -3624,16 +4255,19 @@ the README.txt or README for more information.
% {\Name*[Jesse]{Ventura} is a regular name}%
% {}\end{verbatim}
% \end{quote}
-% \end{enumerate}
%
-% Otherwise, based on Section~\ref{sec:IndexXref}, we get: ``\IfAKA{Grinch}{\Name{Grinch} is an alias}{\Name{Grinch} is not an alias}{\Name{Grinch} is excluded}'':
-% \begin{quote}\small
+% Otherwise, based on Section~\ref{sec:GeneralIndex}, we get:
+% ``\IfAKA{Grinch}
+% {\Name{Grinch} is an alias}
+% {\Name{Grinch} is not an alias}
+% {\Name{Grinch} is excluded}'':
+% \begin{quote}\small\leavevmode\PatInfo{\ShowPattern{Grinch}!PN}\vspace{-5ex}
% \StartNum
% \begin{verbatim}
-%\IfAKA{Grinch}%
+%``\IfAKA{Grinch}%
% {\Name{Grinch} is an alias}%
% {\Name{Grinch} is not an alias}%
-% {\Name{Grinch} is excluded}\end{verbatim}
+% {\Name{Grinch} is excluded}''\end{verbatim}
% \end{quote}
%
% We can combine all these macros create a complete test:
@@ -3656,39 +4290,47 @@ the README.txt or README for more information.
% {excluded path}\end{verbatim}
% \end{quote}
%
-% We can use the text tag macros with the conditional macros to present information that depends on what names have already occurred. One must avoid unbounded recursion that results in a stack overflow (Section~\ref{sec:TextTags}):
-% \begin{quote}\small
+% If\Info{Sync with floats} one uses names in floats and in the text, the testing macros can synchronize a float with the text. Assume that we want to print a full name for whichever appears first, like \LJWG[Johann Wolfgang von] instead of \LJWG. In both the text and the float we use the following:
+% \begin{quote}\small\leavevmode\PatInfo{\ShowPattern[J.W. von]{Goethe}!MN}\vspace{-5ex}
+% \StartNum
+% \begin{verbatim}
+%\IfMainName[J.W. von]{Goethe}
+% {\Name*[J.W. von]{Goethe}}
+% {\Name*[J.W. von]{Goethe}[Johann Wolfgang von]}\end{verbatim}
+% \end{quote}
+%
+% Text tags can work\Info{Sync with events} with the conditional macros to prevent anachronistic references. This aids working with history texts, game books, and so on. One must avoid unbounded recursion that results in a stack overflow (Section~\ref{sec:TextTags}):
+% \begin{quote}\small\leavevmode\PatInfo{\ShowPattern{Paul}!PN\break \ShowPattern{Saul, of Tarsus}!DB\break \ShowPattern{Jesus, Christ}!MN\break \ShowPattern[Lucius]{Sergius Paulus}!MN\break \ShowPattern{Paul}!MN\break \ShowPattern{Saul, of Tarsus}!MN}\vspace{-5ex}
% \StartNum
% \begin{verbatim}
%\IndexRef{Paul}{Saul of Tarsus}
-%\NameAddInfo{Saul, of Tarsus}{\IfMainName{Jesus, Christ}
+%\NameAddInfo{Saul, of Tarsus}
+% {\IfMainName{Jesus, Christ}
% {\IfMainName[Lucius]{Sergius Paulus}
-% {renames himself \Name{Paul}}
+% {renamed himself \Name{Paul}}
% {a preacher to the Gentiles}}
% {wrote that he persecuted Christians}}
+%\Name{Saul, of Tarsus} \NameQueryInfo{Saul, of Tarsus}.
+%He saw a vision of \Name{Jesus, Christ} on the road to Damascus.
+%\Name{Saul, of Tarsus} became \NameQueryInfo{Saul, of Tarsus}.
+%After converting \Name[Lucius]{Sergius Paulus},
+%\Name{Saul, of Tarsus} \NameQueryInfo{Saul, of Tarsus}.\end{verbatim}
%
-%\Name{Saul, of Tarsus} \NameQueryInfo{Saul, of Tarsus}. He
-%saw a vision of \Name{Jesus, Christ} on the road to Damascus
-%and became \NameQueryInfo{Saul, of Tarsus}. After converting
-%\Name[Lucius]{Sergius Paulus}, \Name{Saul, of Tarsus}
-%\NameQueryInfo{Saul, of Tarsus} in honor of that.\end{verbatim}
-%
-% \smallskip
% \IndexRef{Paul}{Saul of Tarsus}
-% \NameAddInfo{Saul, of Tarsus}{\IfMainName{Jesus, Christ}
-% {\IfMainName[Lucius]{Sergius Paulus}
-% {renamed himself \Name{Paul}}
-% {a preacher to the Gentiles}}
-% {wrote that he persecuted Christians}}
-%
-% \Name{Saul, of Tarsus} \NameQueryInfo{Saul, of Tarsus}. He
-% saw a vision of \Name{Jesus, Christ} on the road to Damascus
-% and became \NameQueryInfo{Saul, of Tarsus}. After converting
-% \Name[Lucius]{Sergius Paulus}, \Name{Saul, of Tarsus}
-% \NameQueryInfo{Saul, of Tarsus} in honor of that.
+% \NameAddInfo{Saul, of Tarsus}
+% {\IfMainName{Jesus, Christ}
+% {\IfMainName[Lucius]{Sergius Paulus}
+% {renamed himself \Name{Paul}}
+% {a preacher to the Gentiles}}
+% {wrote that he persecuted Christians}}
+% \Name{Saul, of Tarsus} \NameQueryInfo{Saul, of Tarsus}.
+% He saw a vision of \Name{Jesus, Christ} on the road to Damascus.
+% \Name{Saul, of Tarsus} became \NameQueryInfo{Saul, of Tarsus}.
+% After converting \Name[Lucius]{Sergius Paulus},
+% \Name{Saul, of Tarsus} \NameQueryInfo{Saul, of Tarsus}.
% \end{quote}
%
-% Using these tests inside other macros or passing control sequences to them may create false results (see \textit{The \TeX book}, 212--15). That is why \textsf{nameauth} uses token registers to save name arguments (Section~\ref{sec:Hooksii}. Consider using \cmd{\noexpand} in macros passed as name arguments and see also Section~\ref{sec:Unicode}. Using the \textsf{trace} package, \cmd{\show}, or \cmd{\meaning} can help one mitigate problems.
+% Using these tests\Info{Caveats} inside other macros or passing control sequences to them may create false results (see \textit{The \TeX book}, 212--15). That is why \textsf{nameauth} uses token registers to save name arguments (Section~\ref{sec:Hooksii}. Consider using \cmd{\noexpand} in macros passed as name arguments and see also Section~\ref{sec:Unicode}. Using the \textsf{trace} package, \cmd{\show}, or \cmd{\meaning} can help one mitigate problems.
%
% \ReturnLink
% \newpage
@@ -3696,166 +4338,161 @@ the README.txt or README for more information.
% \subsection{Alternate Name Macros}
% \label{sec:AKA}
%
-% The\Version{3.0} macros in this section predate \cmd{\IndexRef} and have a syntax and behavior recalling early package versions.\footnote{Before version 3.0 the lack of modularity resulted in separate name parsing, name display, and indexing for the naming macros and the alternate name macros. The version 3 series has corrected many early missteps while remaining compatible.}
-% Using \cmd{\IndexRef} with \cmd{\Name} can be more flexible (cf. page~\pageref{page:ManualXref}). To save space, we show the syntax of these macros using \meta{SAFX} as the equivalent of \meta{SNN|,| Affix}. Common properties include:
+% The\Version{3.0} macros in this section predate \cmd{\IndexRef} and are less flexible than just using \cmd{\IndexRef} with \cmd{\Name} (cf. page~\pageref{page:IdxVariants}). We recommend the macros below only for backward compatibility, or if one likes using them. To save space, we show the syntax of these macros using \meta{SAFX} as the equivalent of \meta{SNN|,| Affix}.
%
% \begin{itemize}
% \item These macros do not create page references.
-% \item The target \oarg{FNN}\marg{SAFX} comes before the xref printed in the text: \oarg{xref FNN}\marg{xref SAFX}\oarg{xref Alternate}.
-% \item The obsolete syntax cannot be used with \oarg{FNN}\marg{SAFX}.
-% \item Only the \meta{SAFX} and \meta{xref SAFX} arguments are able to use comma-delimited suffixes.
+% \item Opposite of \cmd{\IndexRef}, the target \oarg{FNN}\marg{SAFX} comes first; then the cross-reference \oarg{xref FNN}\marg{xref SAFX}\oarg{xref Alternate}.
+% \item The obsolete syntax cannot be used with \oarg{FNN}\marg{SAFX}; it can be used with \oarg{xref FNN}\marg{xref SAFX}\oarg{xref Alternate}.
+% \item Only \meta{SAFX} and \meta{xref SAFX} can have comma-delimited suffixes.
% \item One cannot use \cmd{\TagName} with a cross-reference, but one can sort it with \cmd{\PretagName}\oarg{xref FNN}\marg{xref SAFX}\marg{sort tag}.
% \end{itemize}
%
% \DescribeMacro{\AKA}
% \cmd{\AKA} (\textit{also known as}) and its starred form display an alias in the text and create a cross-reference in the index.
% \DescribeMacro{\AKA*}
-% They display and format names differently than the name macros:
+% They format names differently than \cmd{\Name}, etc.:
% \begin{quote}\small
-% \fbox{\vbox{\hbox{\mystrut\ \cmd{\AKA\ }\oarg{FNN}\marg{SAFX}\oarg{xref FNN}\marg{xref SAFX}\oarg{xref Alternate} }\par
-% \hbox{\mystrut\ \cmd{\AKA*}\oarg{FNN}\marg{SAFX}\oarg{xref FNN}\marg{xref SAFX}\oarg{xref Alternate} }}}
+% \fbox{
+% \begin{tabular}{@{}l@{}}
+% {\Large\strut}\cmd{\AKA\ }\oarg{FNN}\marg{SAFX}\oarg{xref FNN}\marg{xref SAFX}\oarg{xref Alternate} \vspace{-2pt}\\
+% {\Large\strut}\cmd{\AKA*}\oarg{FNN}\marg{SAFX}\oarg{xref FNN}\marg{xref SAFX}\oarg{xref Alternate}\\
+% \end{tabular}
+% }
% \end{quote}
%
-% Both macros create a cross-reference in the index from the \meta{xref FNN}, \meta{xref SAFX}, and \meta{xref Alternate} arguments to a target defined by \meta{FNN} and \meta{SAFX}, regardless of whether that name exists. The order of the name and cross-reference in \cmd{\AKA} is opposite that of \cmd{\IndexRef}. Otherwise the \meta{xref Alternate} argument would be ambiguous with \meta{FNN}. \cmd{\AKA} prints a long form of the cross-reference name in the text. \cmd{\SeeAlso} works with \cmd{\AKA}, \cmd{\AKA*}, and \cmd{\PName}.
-%
-% \cmd{\AKA} prints the \meta{xref FNN} and \meta{xref SAFX} arguments in the body text. If \meta{xref Alternate} is present with \meta{xref FNN}, \cmd{\AKA} swaps them in the text. If \meta{xref Alternate} is present without \meta{xref FNN}, the old syntax is triggered, which we do not recommend. The caps and reversing macros work with \cmd{\AKA}.
-%
-% \cmd{\AKA*}\Version{3.0} prints short name references like \cmd{\FName}, meaning that \cmd{\ForceFN} works with it in the same manner. For the older behavior of \cmd{\AKA*} use the \texttt{oldAKA} option or always precede \cmd{\AKA*} with \cmd{\ForceFN}.
+% \begin{itemize}
+% \item Both macros create a cross-reference in the index from the \meta{xref FNN}, \meta{xref SAFX}, and \meta{xref Alternate} arguments to a target defined by \meta{FNN} and \meta{SAFX}.
+% \item The order of the name and cross-reference in \cmd{\AKA} is opposite that of \cmd{\IndexRef} in order to avoid ambiguity.
+% \item \cmd{\AKA} prints a long form of the cross-reference name in the text. \cmd{\SeeAlso} works with \cmd{\AKA}, \cmd{\AKA*}, \cmd{\PName}, and \cmd{\PName*}.
+% \item \cmd{\AKA} prints the \meta{xref FNN} and \meta{xref SAFX} arguments in the text.
+% \item If \meta{xref Alternate} is present with \meta{xref FNN}, or if \meta{xref Affix} when \meta{xref FNN} is absent, \cmd{\AKA} swaps them only in the text.
+% \item If \meta{xref Alternate} is present without \meta{xref FNN} and \meta{xref Affix}, the obsolete syntax is used.
+% \item \cmd{\AKA*}\Version{3.0} is analogous to \cmd{\FName} and \cmd{\ForceFN} works with it. The \texttt{oldAKA} option implies \cmd{\ForceFN} with every use of \cmd{\AKA*}.
+% \item Neither\Version{3.5} \cmd{\AKA} nor its derivatives permit the effects of \cmd{\ForgetThis} and \cmd{\SubvertThis} to ``pass through'' because they produce output in the text. The \texttt{oldreset} option negates this.
+% \end{itemize}
%
-% We make cross-references to \Name[Bob]{Hope}, where all of the forms below create the cross-reference ``\ShowIdxPageref*[Leslie Townes]{Hope} \textit{see} \ShowIdxPageref*[Bob]{Hope}'':
-% \begin{center}\small\MyStretch
+% We make cross-references to \Name[Bob]{Hope}; all of the forms below will create the cross-reference ``\ShowIdxPageref*[Leslie Townes]{Hope} \textit{see} \ShowIdxPageref*[Bob]{Hope}'':
+% \begin{center}\footnotesize\vspace{2ex}\Info{\strut\footnotesize Name Pattern(s):\hfill \break \ttfamily \ShowPattern[Bob]{Hope}!MN\break \ShowPattern[Leslie Townes]{Hope}!PN}\vspace{-2ex}\MyStretch
% \begin{tabular}{p{0.6\textwidth}l}\toprule
-% \footnotesize|\AKA[Bob]{Hope}[Leslie Townes]{Hope}| & \AKA[Bob]{Hope}[Leslie Townes]{Hope}\\
-% \rowcolor{black!7!white}\footnotesize|\RevComma\AKA[Bob]{Hope}[Leslie Townes]{Hope}| & \RevComma\AKA[Bob]{Hope}[Leslie Townes]{Hope}\\
-% \footnotesize|\AKA[Bob]{Hope}[Leslie Townes]{Hope}[Lester T.]| & \AKA[Bob]{Hope}[Leslie Townes]{Hope}[Lester T.]\\
-% \rowcolor{black!7!white}\footnotesize|\AKA*[Bob]{Hope}[Leslie Townes]{Hope}| & \AKA*[Bob]{Hope}[Leslie Townes]{Hope}\\
-% \footnotesize|\AKA*[Bob]{Hope}[Leslie Townes]{Hope}[Lester]| & \AKA*[Bob]{Hope}[Leslie Townes]{Hope}[Lester]\\\bottomrule
+% |\AKA[Bob]{Hope}[Leslie Townes]{Hope}| & \AKA[Bob]{Hope}[Leslie Townes]{Hope}\\
+% \rowcolor{grey}|\RevComma\AKA[Bob]{Hope}[Leslie Townes]{Hope}| & \RevComma\AKA[Bob]{Hope}[Leslie Townes]{Hope}\\
+% |\AKA[Bob]{Hope}[Leslie Townes]{Hope}[Lester T.]| & \AKA[Bob]{Hope}[Leslie Townes]{Hope}[Lester T.]\\
+% \rowcolor{grey}|\AKA*[Bob]{Hope}[Leslie Townes]{Hope}| & \AKA*[Bob]{Hope}[Leslie Townes]{Hope}\\
+% |\AKA*[Bob]{Hope}[Leslie Townes]{Hope}[Lester]| & \AKA*[Bob]{Hope}[Leslie Townes]{Hope}[Lester]\\\bottomrule
% \end{tabular}
% \end{center}
-% \newpage
%
-% Next we have references to \KeepAffix\Name*{Louis, XIV}, \Name{Lao-tzu}, and \KeepAffix\Name*{Gregory, I}, as well as \Name[Lafcadio]{Hearn} and \Name[Charles]{du Fresne}:
-% \begin{center}\small\MyStretch
-% \begin{tabular}{p{0.6\textwidth}l}\toprule
-% |\AKA{Louis, XIV}{Sun King}| & \AKA{Louis, XIV}{Sun King}\\
-% \rowcolor{black!7!white}|\AKA*{Louis, XIV}{Sun King}| & \AKA{Louis, XIV}{Sun King}\\
+% Next we refer to \KeepAffix\Name*{Louis, XIV}, and \Name{Lao-tzu}, as well as \Name[Lafcadio]{Hearn} and \Name[Charles]{du~Fresne}. The caps and reversing macros work. Even with \cmd{\ForceName}, the formatting hooks do not change. \cmd{\AKA} and its derivatives use only \cmd{\MainNamesHook} and \cmd{\FrontNamesHook}.
+%
+% \begin{center}\small\vspace{2ex}\PatInfo{\ShowPattern{Louis, XIV}!MN\break \ShowPattern{Lao-tzu}!MN\break \ShowPattern[Lafcadio]{Hearn}!MN\break \ShowPattern[Charles]{du~Fresne}!MN\break \ShowPattern{Sun King}!PN\break \ShowPattern{Li, Er}!PN\break \ShowPattern{du~Cange}!PN\break \ShowPattern{Koizumi, Yakumo}!PN}\vspace{-2ex}\MyStretch
+% \begin{tabular}{p{0.65\textwidth}l}\toprule
+% \rowcolor{grey}|\AKA{Louis, XIV}{Sun King}| & \AKA{Louis, XIV}{Sun King}\\
+% |\ForceName\AKA{Louis, XIV}{Sun King}| & \ForceName\AKA{Louis, XIV}{Sun King}\\
+% \rowcolor{grey}|\AKA*{Louis, XIV}{Sun King}| & \AKA{Louis, XIV}{Sun King}\\
% |\AKA{Lao-tzu}{Li, Er}| & \AKA{Lao-tzu}{Li, Er}\\
-% \rowcolor{black!7!white}|\AKA*{Lao-tzu}{Li, Er}| & \AKA*{Lao-tzu}{Li, Er}\\
-% |\AKA[Charles]{du Fresne}{du Cange}| & \AKA[Charles]{du Fresne}{du Cange}\\
-% \rowcolor{black!7!white}|\CapThis\AKA[Charles]{du Fresne}{du Cange}| & \CapThis\AKA[Charles]{du Fresne}{du Cange}\\
-% \footnotesize|\CapName\AKA[Lafcadio]{Hearn}{Koizumi, Yakumo}| & \CapName\AKA[Lafcadio]{Hearn}{Koizumi, Yakumo}\\
-% \rowcolor{black!7!white}\footnotesize|\RevName\AKA[Lafcadio]{Hearn}{Koizumi, Yakumo}| & \RevName\AKA[Lafcadio]{Hearn}{Koizumi, Yakumo}\\
-% \footnotesize|\AKA{Gregory, I}{Gregory}[the Great]| & \AKA{Gregory, I}{Gregory}[the Great]\\
-% \rowcolor{black!7!white}\footnotesize|\AKA*{Gregory, I}{Gregory}[the Great]| & \AKA*{Gregory, I}{Gregory}[the Great]\\
-% \footnotesize|\ForceFN\AKA*{Gregory, I}{Gregory}[the Great]| & \ForceFN\AKA*{Gregory, I}{Gregory}[the Great]\\\bottomrule
+% \rowcolor{grey}|\AKA*{Lao-tzu}{Li, Er}| & \AKA*{Lao-tzu}{Li, Er}\\
+% |\AKA[Charles]{du~Fresne}{du~Cange}| & \AKA[Charles]{du~Fresne}{du~Cange}\\
+% \rowcolor{grey}|\CapThis\AKA[Charles]{du~Fresne}{du~Cange}| & \CapThis\AKA[Charles]{du~Fresne}{du~Cange}\\
+% |\CapName\AKA[Lafcadio]{Hearn}{Koizumi, Yakumo}| & \CapName\AKA[Lafcadio]{Hearn}{Koizumi, Yakumo}\\
+% \rowcolor{grey}|\RevName\AKA[Lafcadio]{Hearn}{Koizumi, Yakumo}| & \RevName\AKA[Lafcadio]{Hearn}{Koizumi, Yakumo}\\\bottomrule
% \end{tabular}
% \end{center}\medskip
%
-% \noindent\cmd{\AKA}\Info{\texttt{formatAKA}} and its derivatives use \cmd{\MainNamesHook} and \cmd{\FrontNamesHook} to print the cross-reference because that helped keep cross-references distinct from names in early package versions.
-%
-% The \texttt{formatAKA} package option allows first-use formatting of alternate names, but cross-references use their own system for being ``first'' (Section~\ref{sec:NamePatterns}). We simulate \texttt{formatAKA} and use |\AKA{Elizabeth,I}[Good Queen]{Bess}|. The colors indicate which hooks are used.
-% \begin{quote}\small\MyStretch
-% \makeatletter\@nameauth@AKAFormattrue\makeatother\NamesInactive
-% \emph{Front Matter:} \ForgetThis\LEliz\ was known as ``\AKA{Elizabeth,I}[Good Queen]{Bess}.''\\
-% Again we mention Queen \Eliz, ``\AKA{Elizabeth, I}[Good Queen]{Bess}.''\\
-% \cmd{\ForceName}: \ForceName\AKA{Elizabeth, I}[Good Queen]{Bess}.
+% In order to format\Info{\texttt{formatAKA}} cross-references like names, either avoid using these older macros or use the \texttt{formatAKA} option. That allows \cmd{\ForceName} to work properly, but cross-references use their own system for being ``first'' (Section~\ref{sec:NamePatterns}). We simulate \texttt{formatAKA} and use |\AKA{Elizabeth,I}[Good Queen]{Bess}|:
%
-% \NamesActive
-% \emph{Main Matter:} \ForgetThis\LEliz\ was known as ``\AKA{Elizabeth,I}[Good Queen]{Bess}.''\\
-% Again we mention Queen \Eliz, ``\AKA{Elizabeth, I}[Good Queen]{Bess}.''\\
-% \cmd{\ForceName}: \ForceName\AKA{Elizabeth, I}[Good Queen]{Bess}.
-% \end{quote}
+% \begin{center}\small\vspace{2ex}\PatInfo{\ShowPattern{Elizabeth, I}!NF\break \ShowPattern[Good Queen]{Bess}!PN\break \ShowPattern{Elizabeth, I}!MN}\vspace{-2ex}\MyStretch
+% \makeatletter\@nameauth@AKAFormattrue\makeatother
+% \begin{tabular}{rlll}\toprule
+% \global\NamesInactive Front Matter: & \ForgetThis\Eliz & \Eliz & \AKA{Elizabeth,I}[Good Queen]{Bess}\\
+% \rowcolor{grey}\global\NamesActive Main Matter: & \ForgetThis\Eliz & \Eliz & \AKA{Elizabeth, I}[Good Queen]{Bess}\\
+% Using \cmd{\ForceName}: & & & \ForceName\AKA{Elizabeth, I}[Good Queen]{Bess}\\\bottomrule
+% \end{tabular}
+% \end{center}
+%
+% The first appearance of \AKA{Elizabeth,I}[Good Queen]{Bess} uses either \cmd{\NamesFormat} or \cmd{\FrontNamesFormat}. After that, only \cmd{\mainNameHook} and \cmd{\FrontNameHook} can be used without \cmd{\ForceName}, which triggers the first-use hooks.\medskip
%
-% The first appearance of the cross-reference uses the first-use hooks of whatever naming system is active. Thereafter we only use the subsequent-use hooks of both systems unless we use \cmd{\ForceName}.\medskip
-%
% Below\Info{\texttt{alwaysformat}} we compare the behavior of the \texttt{alwaysformat} option, where all regular names use only \cmd{\NamesFormat} and \cmd{\FrontNamesFormat}:
-%
-% \begin{quote}\small\MyStretch
-% \makeatletter\@nameauth@AlwaysFormattrue\makeatother\NamesInactive
-% \emph{Front Matter:} \ForgetThis\LEliz\ was known as ``\AKA{Elizabeth, I}[Good Queen]{Bess}.''\\
-% Again we mention Queen \Eliz, ``\AKA{Elizabeth, I}[Good Queen]{Bess}.''\\
-% \cmd{\ForceName}: \ForceName\AKA{Elizabeth, I}[Good Queen]{Bess}.
%
-% \NamesActive
-% \emph{Main Matter:} \ForgetThis\LEliz\ was known as ``\AKA{Elizabeth, I}[Good Queen]{Bess}.''\\
-% Again we mention Queen \Eliz, ``\AKA{Elizabeth, I}[Good Queen]{Bess}.''\\
-% \cmd{\ForceName}: \ForceName\AKA{Elizabeth, I}[Good Queen]{Bess}.
+% \begin{quote}\small\MyStretch
+% \makeatletter\@nameauth@AlwaysFormattrue\makeatother
+% \ForgetThis\LEliz\ was known as ``\AKA{Elizabeth,I}[Good Queen]{Bess}''. Again we mention Queen \Eliz, ``\AKA{Elizabeth, I}[Good Queen]{Bess}''. Using \cmd{\ForceName}: \ForceName\AKA{Elizabeth, I}[Good Queen]{Bess}.
% \end{quote}
%
% \DescribeMacro{\PName}
% These convenience macros (an early feature) print a main name and a cross-reference in parentheses:
% \DescribeMacro{\PName*}
% \begin{quote}\small
-% \fbox{\vbox{\hbox{\mystrut\ \cmd{\PName\ }\oarg{FNN}\marg{SAFX}\oarg{xref\,FNN}\marg{xref\,SAFX}\oarg{xref\,Alternate}\ }\par
-% \hbox{\mystrut\ \cmd{\PName*}\oarg{FNN}\marg{SAFX}\oarg{xref\,FNN}\marg{xref\,SAFX}\oarg{xref\,Alternate}\ }}}
+% \fbox{
+% \begin{tabular}{@{}l@{}}
+% {\Large\strut}\cmd{\PName\ }\oarg{FNN}\marg{SAFX}\oarg{xref\,FNN}\marg{xref\,SAFX}\oarg{xref\,Alternate}\vspace{-2pt}\\
+% {\Large\strut}\cmd{\PName*}\oarg{FNN}\marg{SAFX}\oarg{xref\,FNN}\marg{xref\,SAFX}\oarg{xref\,Alternate}\\
+% \end{tabular}
+% }
% \end{quote}
% The starred form \cmd{\PName*} is like the starred form \cmd{\Name*} to the extent that it prints a long form of \meta{FNN}\meta{SAFX}. It does not affect the cross-reference arguments \meta{xref FNN}\meta{xref SAFX}\meta{xref Alternate}.
-%
-% Except \cmd{\SkipIndex}, prefix macros only affect \meta{FNN}\meta{SAFX}, not the cross-reference, which always takes a long form. \cmd{\SkipIndex} keeps both names out of the index. \cmd{\PName} cannot use the obsolete syntax for the main name, but it can do so for the alternate name.
-%
-% \begin{center}\footnotesize\MyStretch
-% \begin{tabular}{p{0.45\textwidth}l}\toprule
-% \bfseries\small Recommended Macro\,/\,Output & \bfseries\small Index\\\midrule
-% |\PName[Mark]{Twain}%|\newline| [Samuel L.]{Clemens}| & \\
-% \PName[Mark]{Twain}[Samuel L.]{Clemens} & \ShowIdxPageref*[Samuel L.]{Clemens} \textit{see} \ShowIdxPageref*[Mark]{Twain}\\
-% \PName[Mark]{Twain}[Samuel L.]{Clemens} & \ShowIdxPageref*[Samuel L.]{Clemens} \textit{see} \ShowIdxPageref*[Mark]{Twain}\\
-% \rowcolor{black!7!white}|\PName*[Mark]{Twain}%|\newline| [Samuel L.]{Clemens}[Sam]| & \\
-% \rowcolor{black!7!white}\PName*[Mark]{Twain}[Samuel L.]{Clemens}[Sam] & \ShowIdxPageref*[Samuel L.]{Clemens} \textit{see} \ShowIdxPageref*[Mark]{Twain}\\
-% |\PName{Voltaire}%|\newline| [François-Marie]{Arouet}| & \\
-% \PName{Voltaire}[François-Marie]{Arouet} & \ShowIdxPageref*[François-Marie]{Arouet} \textit{see} \ShowIdxPageref*{Voltaire}\\
-% \PName{Voltaire}[François-Marie]{Arouet} & \ShowIdxPageref*[François-Marie]{Arouet} \textit{see} \ShowIdxPageref*{Voltaire}\\
-% \rowcolor{black!7!white}|\PName{William, I}%|\newline| {William, the Conqueror}| & \\
-% \rowcolor{black!7!white}\PName{William, I}{William, the Conqueror} & \ShowIdxPageref*{William, the Conqueror} \textit{see} \ShowIdxPageref*{William, I}\\
-% \rowcolor{black!7!white}\PName{William, I}{William, the Conqueror} & \ShowIdxPageref*{William, the Conqueror} \textit{see} \ShowIdxPageref*{William, I}\\
-% |\PName*{William, I}%|\newline| {William, the Conqueror}| & \\
-% \PName*{William, I}{William, the Conqueror} & \ShowIdxPageref*{William, the Conqueror} \textit{see} \ShowIdxPageref*{William, I}\\
-% \rowcolor{black!7!white}|\PretagName%|\newline| {\textit{Doctor mellifluus}}%|\newline| {Doctor mellifluus}| & \\
-% \rowcolor{black!7!white}|\PName{Bernard, of Clairvaux}%|\newline| {\textit{Doctor mellifluus}}| & \\
-% \rowcolor{black!7!white}\PName{Bernard, of Clairvaux}{\textit{Doctor mellifluus}} & \ShowIdxPageref*{\textit{Doctor mellifluus}} \textit{see} \ShowIdxPageref*{Bernard, of Clairvaux}\\
-% \rowcolor{black!7!white}\PName{Bernard, of Clairvaux}{\textit{Doctor mellifluus}} & \ShowIdxPageref*{\textit{Doctor mellifluus}} \textit{see} \ShowIdxPageref*{Bernard, of Clairvaux}\\
-% |\ForgetThis\PName{Lao-tzu}{Li, Er}| & \\
+%
+% \begin{itemize}
+% \item Most prefix macros only affect \meta{FNN}\meta{SAFX}, not the cross-reference, which always has a long form.
+% \item \cmd{\SkipIndex} keeps both names out of the index.
+% \item \cmd{\PName} allows the obsolete syntax only for the alternate name.
+% \item Even though it is permitted, please avoid using the obsolete syntax with the xref part of \cmd{\PName}, such as \cmd{\PName\{Lao-tzu\}\{Li\}[Er]} and \cmd{\PName\{William, I\}\{William\}[the Conqueror]}.
+% \end{itemize}
+%
+% Alternate names for the non-Western syntax do not work with the name portion of \cmd{\PName}; only the cross-reference portion can support it. If we attempted to use |\SkipIndex\PName*{William, I}[William]{the Conqueror}|, this macro would put ``\SkipIndex\PName*{William, I}[William]{the Conqueror}'' in the body text, but its index entry would be incorrect: ``\ShowIdxPageref*[William]{the Conqueror} \textit{see} \ShowIdxPageref*{William, I}''. We use |\ForgetName{William, I}|\ForgetName{William, I} to prepare for the example below that shows the preferred usage of these macros:\footnote{The xref pattern \texttt{\ShowPattern{\textit{Doctor mellifluus}}!PN} is too large for the margin note. With \texttt{pdflatex} and \texttt{latex}, in \texttt{\ShowPattern[François-Marie]{Arouet}!PN} the glyphs \texttt{Ãğ} correspond to the Unicode encoding macro \cmd{\IeC\{}\cmd{\c\ c\}}.}
+%
+% \begin{center}\small\vspace{2ex}\PatInfo{\scriptsize\ShowPattern[Mark]{Twain}!MN\break \ShowPattern[Samuel L.]{Clemens}!PN\break \ShowPattern{Voltaire}!MN\break \ShowPattern[François-Marie]{Arouet}!PN\break \ShowPattern{William, I}!MN\break \ShowPattern{William, the Conqueror}!PN\break \ShowPattern{Bernard, of Clairvaux}!MN\break \ShowPattern{Lao-tzu}!MN\break \ShowPattern{Li, Er}!PN}\vspace{-2ex}\MyStretch
+% \begin{tabular}{p{0.42\textwidth}@{\ \ }p{0.46\textwidth}}\toprule
+% \bfseries\small Macro/Output & \bfseries\small Index\\\midrule
+% \rowcolor{grey}\multicolumn{2}{l}{\cmd{\PName[Mark]\{Twain\}[Samuel L.]\{Clemens\}}}\\
+% \rowcolor{grey}\PName[Mark]{Twain}[Samuel L.]{Clemens} & \ShowIdxPageref*[Samuel L.]{Clemens} \textit{see} \ShowIdxPageref*[Mark]{Twain}\\
+% \rowcolor{grey}\PName[Mark]{Twain}[Samuel L.]{Clemens} & \ShowIdxPageref*[Samuel L.]{Clemens} \textit{see} \ShowIdxPageref*[Mark]{Twain}\\
+% \multicolumn{2}{l}{\cmd{\PName*[Mark]\{Twain\}[Samuel L.]\{Clemens\}[Sam]}}\\
+% \PName*[Mark]{Twain}[Samuel L.]{Clemens}[Sam] & \ShowIdxPageref*[Samuel L.]{Clemens} \textit{see} \ShowIdxPageref*[Mark]{Twain}\\
+% \rowcolor{grey}\multicolumn{2}{l}{\cmd{\PName\{Voltaire\}[François-Marie]\{Arouet\}}}\\
+% \rowcolor{grey}\PName{Voltaire}[François-Marie]{Arouet} & \ShowIdxPageref*[François-Marie]{Arouet} \textit{see} \ShowIdxPageref*{Voltaire}\\
+% \rowcolor{grey}\PName{Voltaire}[François-Marie]{Arouet} & \ShowIdxPageref*[François-Marie]{Arouet} \textit{see} \ShowIdxPageref*{Voltaire}\\
+% \multicolumn{2}{l}{\cmd{\PName\{William, I\}\{William, the Conqueror\}}}\\
+% \PName{William, I}{William, the Conqueror} & \ShowIdxPageref*{William, the Conqueror} \textit{see} \ShowIdxPageref*{William, I}\\
+% \PName{William, I}{William, the Conqueror} & \ShowIdxPageref*{William, the Conqueror} \textit{see} \ShowIdxPageref*{William, I}\\
+% \rowcolor{grey}\multicolumn{2}{l}{\cmd{\PretagName\{}\cmd{\textit\{Doctor mellifluus\}\}\{Doctor mellifluus\}}}\\
+% \rowcolor{grey}\multicolumn{2}{l}{\cmd{\PName\{Bernard, of Clairvaux\}\{}\cmd{\textit\{Doctor mellifluus\}}}\\
+% \rowcolor{grey}\PName{Bernard, of Clairvaux}{\textit{Doctor mellifluus}} & \ShowIdxPageref*{\textit{Doctor mellifluus}} \textit{see} \ShowIdxPageref*{Bernard, of Clairvaux}\\
+% \rowcolor{grey}\PName{Bernard, of Clairvaux}{\textit{Doctor mellifluus}} & \ShowIdxPageref*{\textit{Doctor mellifluus}} \textit{see} \ShowIdxPageref*{Bernard, of Clairvaux}\\
+% \multicolumn{2}{l}{\cmd{\ForgetThis}\cmd{\PName\{Lao-tzu\}\{Li, Er\}}}\\
% \ForgetThis\PName{Lao-tzu}{Li, Er} & \ShowIdxPageref*{Li, Er} \textit{see} \ShowIdxPageref*{Lao-tzu}\\
-% \PName{Lao-tzu}{Li, Er} & \ShowIdxPageref*{Li, Er} \textit{see} \ShowIdxPageref*{Lao-tzu}\\\midrule
-% \bfseries\small Discouraged Macro\,/\,Output & \bfseries\small Index\\\midrule
-% |\PName{William, I}{William}%|\newline| [the Conqueror]| & \\
-% \PName{William, I}{William}[the Conqueror] & \ShowIdxPageref*{William}[the Conqueror] \textit{see} \ShowIdxPageref*{William, I}\\
-% \rowcolor{black!7!white}|\PName{Lao-tzu}{Li}[Er]| & \\
-% \rowcolor{black!7!white}\PName{Lao-tzu}{Li}[Er] & \ShowIdxPageref*{Li}[Er] \textit{see} \ShowIdxPageref*{Lao-tzu}\\\bottomrule
+% \PName{Lao-tzu}{Li, Er} & \ShowIdxPageref*{Li, Er} \textit{see} \ShowIdxPageref*{Lao-tzu}\\\bottomrule
% \end{tabular}
% \end{center}
%
-% The newer non-Western syntax does not work with \cmd{\PName}. If we attempted to use |\SkipIndex\PName*{William, I}[William]{the Conqueror}|, this macro would put ``\SkipIndex\PName*{William, I}[William]{the Conqueror}'' in the body text, but its index entry would be incorrect: ``\ShowIdxPageref*[William]{the Conqueror} \textit{see} \ShowIdxPageref*{William, I}''.
-%
% \ReturnLink
+% \BigBlank
% \newpage
%
+% \begingroup^^A General format hook redefinition.
% \subsection{Longer Examples}
% \label{sec:Hooks}
%
-% Examples from the remainder of this manual are in \texttt{examples.tex}, included with the \textsf{nameauth} documentation.
-%
-% When\Info{\texttt{dtx} files} creating package documentation, any name that has a macro in its argument should be set up in the driver section (the \texttt{nameauth} environment and tags from \cmd{\PretagName} and \cmd{\TagName}). Otherwise, errors can result.
-%
-% \begingroup^^A Start of hook macro redefinition.
-% \subsubsection{Hooks: Intro}
-% \label{sec:Hooksi}
-%
-% In these sections on advanced topics we reset all formatting hooks to do nothing. This helps us focus on the modifications made hereafter.
+% For the rest of this manual, many examples are in \texttt{examples.tex} with the \textsf{nameauth} documentation. Here we set the formatting hooks to the package default.
% \renewcommand*\NamesFormat{}
% \renewcommand*\FrontNamesFormat{}
% \renewcommand*\MainNameHook{}
% \renewcommand*\FrontNameHook{}
%
-% Before we get to the use of text tags and name conditionals in name formatting, we seek to illustrate that something more complex than a font switch can occur in \cmd{\NamesFormat}. Below we put the first mention of a name in boldface, along with a marginal notation if possible.
+% A reminder: When\Info{\texttt{dtx} files} creating package documentation, any name that has a macro in its argument should be set up in the driver section (the \texttt{nameauth} environment and tags from \cmd{\PretagName} and \cmd{\TagName}). Otherwise, errors can result.
+%
+% \subsubsection{Hooks: Intro}
+% \label{sec:Hooksi}
+%
+% Before we get to the use of text tags and name conditionals in name formatting, we seek to illustrate that something more complex than a font switch can occur in \cmd{\NamesFormat}. Below we put the first mention of a name in boldface, along with a marginal notation if possible. Unlike the rest of this section, we do not change formatting macros within a scope. Instead, we illustrate a different approach using \cmd{\let} to save the old value, then restore it later.
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
%\let\OldFormat\NamesFormat
%\renewcommand*\NamesFormat[1]{\textbf{#1}\unless\ifinner
% \marginpar{\raggedleft\scriptsize #1}\fi}
-%\let\NamesFormat\OldFormat
%\PretagName{Vlad, Ţepeş}{Vlad Tepes} % for accented names
-%\TagName{Vlad, II}{ Dracul} % for index information
+%\TagName{Vlad, II}{ Dracul} % for index information
%\TagName{Vlad, III}{ Dracula}\end{verbatim}
%
% \medskip Within the document after the preamble:
@@ -3880,18 +4517,19 @@ the README.txt or README for more information.
% \end{quote}
% Now we have reverted to the default \cmd{\NamesFormat} and we get:
% \begin{itemize}
-% \item |\ForgetThis\Name{Vlad, III}[III Dracula]|\dotfill \ForgetThis\Name{Vlad, III}[III Dracula]
-% \item |\Name*{Vlad, III}|\dotfill \Name*{Vlad, III}
-% \item |\Name{Vlad, III}|\dotfill \Name{Vlad, III}
+% \item \cmd{\ForgetThis}\cmd{\Name\{Vlad, III\}[III Dracula]}\dotfill \ForgetThis\Name{Vlad, III}[III Dracula]
+% \item \cmd{\Name*\{Vlad, III\}}\dotfill \Name*{Vlad, III}
+% \item \cmd{\Name\{Vlad, III\}}\dotfill \Name{Vlad, III}
% \end{itemize}
-% We also set up the cross-reference |\IndexRef{Dracula}{Vlad III}|\IndexRef{Dracula}{Vlad III}. Compare the examples for \LDem\ in Section~\ref{sec:NameParticles}.
-%
+% We also set up the cross-reference \cmd{\IndexRef\{Dracula\}\{Vlad III\}}\IndexRef{Dracula}{Vlad III}. Compare the examples for \LDem\ in Section~\ref{sec:NameAncient}.
+%
% \ReturnLink
% \newpage
-%
+%
% \subsubsection{Hooks: Life Dates}
% \label{sec:Hooksii}
-% We can use name conditionals (Section~\ref{sec:NameTests}) and text tags (Section~\ref{sec:TextTags}) to add life information to names when desired.
+% \begingroup^^A Local format hook redefinition
+% We can use name conditionals (Section~\ref{sec:NameTests}) and text tags (Section~\ref{sec:TextTags}) to add life information to names when desired. We begin a local scope to isolate any changes to the formatting hooks.
%
% \DescribeMacro{\if@nameauth@InName}
% The example \cmd{\NamesFormat} below adds a text tag to the first occurrences of main-matter names.
@@ -3901,17 +4539,14 @@ the README.txt or README for more information.
% \DescribeMacro{\@nameauth@toksa}
% This package makes three token registers available to facilitate using the name conditional macros as we do below.
% \DescribeMacro{\@nameauth@toksb}
-% These registers are necessary for names that contain accents and diacritics.\footnote{In \cmd{\AKA} these registers correspond to the \emph{last} three arguments, the xref.}
-% \DescribeMacro{\@nameauth@toksc}
-%
+% These registers are necessary for names that contain accents and\DescribeMacro{\@nameauth@toksc}
+% diacritics.\footnote{In \cmd{\AKA} these registers correspond to the \emph{last} three arguments, the xref.}
%
-% Below the first use of a name is in small caps. Text tags are in boldface with naming macros, and roman with \cmd{\AKA}. Just because we set up a cross-reference does not mean that we use \cmd{\AKA} by default, as was the case in early versions of \textsf{nameauth}. We use \cmd{\ForceName} to use it more than once with \cmd{\AKA}:
+% Below the first use of a name is in small caps. Text tags are in boldface with naming macros, and roman with \cmd{\AKA}. Just because we set up a cross-reference does not mean that we have to use \cmd{\AKA}. We use \cmd{\ForceName} as needed with \cmd{\AKA}. In the document preamble we set up the following:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
-%\newif\ifNoTag% allows us to work around \ForgetName
-%\let\OldFormat\NamesFormat
-%\let\OldFrontFormat\FrontNamesFormat
+%\newif\ifNoTag
%\makeatletter
%\renewcommand*\NamesFormat[1]{\begingroup%
% \protected@edef\temp{\endgroup\textsc{#1}%
@@ -3931,11 +4566,9 @@ the README.txt or README for more information.
%\makeatother
%\let\FrontNamesFormat\NamesFormat\end{verbatim}
% \end{quote}
-% \let\OldFormat\NamesFormat
-% \let\OldFrontFormat\FrontNamesFormat
% \makeatletter
-% \renewcommand*\NamesFormat[1]{\begingroup%^^A
-% \protected@edef\temp{\endgroup\textsc{#1}%^^A
+% \renewcommand*\NamesFormat[1]{\begingroup^^A
+% \protected@edef\temp{\endgroup\textsc{#1}^^A
% \unless\ifNoTag
% \if@nameauth@InName
% {\bfseries\noexpand\NameQueryInfo
@@ -3947,12 +4580,13 @@ the README.txt or README for more information.
% [\unexpanded\expandafter{\the\@nameauth@toksa}]
% {\unexpanded\expandafter{\the\@nameauth@toksb}}
% [\unexpanded\expandafter{\the\@nameauth@toksc}]}\fi
-% \fi}\temp\global\NoTagfalse}%^^A
+% \fi}\temp\global\NoTagfalse}^^A
% \makeatother
+% \let\FrontNamesFormat\NamesFormat
%
% We print tags in the first use hooks unless \cmd{\NoTag} is set true. This method uses the two \(\epsilon\)-\TeX{} primitives \cmd{\noexpand} and \cmd{\unexpanded} to avoid repetition of \cmd{\expandafter}. Since \textsf{nameauth} depends on \textsf{etoolbox}, we assume \(\epsilon\)-\TeX.
-%
-% Before we can refer to any text tags, we must create them. Using the approach above, we include a leading space in the text tags. The leading space is needed only when a text tag appears.\footnote{Another way to add that space is to put it in the conditional path of the formatting hook and leave it out of the text tags entirely: \dots\texttt{\{ \}}\cmd{\noexpand}\cmd{\NameQueryInfo}\dots}
+%
+% Before we can refer to any text tags, we must create them. Using the approach above, we include a leading space in the text tags. The leading space is needed only when a text tag appears.\footnote{Another way to add that space is to put it in the conditional path of the formatting hook and leave it out of the text tags: \dots\texttt{\{ \}}\cmd{\noexpand}\cmd{\NameQueryInfo}\dots}
% We also set up a cross-reference, which we will use regardless of whether we also use \cmd{\AKA}. The cross-reference will be created only once and skipped thereafter:
% \begin{quote}\small
% \ContinueNum
@@ -3967,19 +4601,21 @@ the README.txt or README for more information.
% \NameAddInfo{Atatürk}{ (in 1934, a special surname)}
% \IndexRef{Atatürk}{Kemal, Mustafa}
% \newpage
-%
+%
% Now we begin with the first example, which, after all the setup, looks deceptively simple, but highly reusable without extra work:
% \begin{quote}\small
% \ContinueNum
% \begin{verbatim}
%\ForgetThis\Wash held office 1789--97.
%No tags: \Wash.\\
-%First use, dates suppressed: \NoTagtrue\ForgetThis\Wash.\end{verbatim}
+%First use, dates suppressed: \NoTagtrue\ForgetThis\Wash.\\
+%Subsequent use with format and dates: \ForceName\Wash.\end{verbatim}
%
% \smallskip
% \ForgetThis\Wash\ held office 1789--97.\\
% No tags: \Wash.\\
-% First use, dates suppressed: \NoTagtrue\ForgetThis\Wash.
+% First use, dates suppressed: \NoTagtrue\ForgetThis\Wash.\\
+% Subsequent use with format and dates: \ForceName\Wash.
% \end{quote}
%
% Since we already set up a cross-reference with \cmd{\IndexRef}, we can use just the the naming macros with ``Atatürk'' and get the desired formatting without any page references in the index:
@@ -4023,36 +4659,30 @@ the README.txt or README for more information.
% First use, no tag:
% \NoTagtrue\ForceName\AKA[Mustafa]{Kemal}{Atatürk}.
% \end{quote}%
-% Please remember to reset the formatting:
-% \begin{quote}\small
-% \ContinueNum
-% \begin{verbatim}
-%\let\NamesFormat\OldFormat
-%\let\FrontNamesFormat\OldFrontFormat\end{verbatim}
-% \end{quote}
-% \let\NamesFormat\OldFormat
-% \let\FrontNamesFormat\OldFrontFormat
+% Now we end the scope to revert any changes to formatting hooks.
+% \endgroup^^A Local format hook redefinition
%
% \ReturnLink
-% \newpage
-%
+%
% \subsubsection{Hooks: Advanced}
% \label{sec:Hooksiii}
-% \AltFormatActive\begingroup
+% \AltFormatActive
+% In this section we invoke \cmd{\AltFormatActive} and create several scopes containing respective examples. Some macros in this section normally should be defined in a document preamble. We define them locally and ensure that names do not use them when they are undefined. This is not best practices, but it makes sense for this manual's need for multiple redefinitions.
+% \newpage
%
-% \begin{center}\bfseries Alternate Formatting\end{center}
+% \begin{center}\bfseries Alternate Formatting: Details\end{center}
+% \phantomsection
+% Here we discuss the implementation details of alternate formatting, which will engage the rest of the section. This framework provides features that aid both error protection and ease of hook design. Names that use alternate formatting may cause spurious index entries if used also in the default formatting regime.
%
-% \noindent The\Version{3.1} alternate formatting framework provides features that aid both error protection and ease of use. This section uses \cmd{\AltFormatActive}. We do not use the names in this section elsewhere. A name designed for the alternate formatting regime may cause spurious index entries when used in the default formatting regime.
+% Both \cmd{\AltFormatActive} and \cmd{\AltFormatActive*} globally set the internal Boolean flag \cmd{\@nameauth@AltFormattrue}, enabling alternate formatting. \cmd{\AltFormatActive} globally sets \cmd{\@nameauth@DoAlttrue}, which activates formatting. Both flags are reset globally by \cmd{\AltFormatInactive} and normal formatting resumes.
%
-% Both \cmd{\AltFormatActive} and \cmd{\AltFormatActive*} set the internal Boolean flag \cmd{\@nameauth@AltFormattrue}, enabling alternate formatting. \cmd{\AltFormatActive} sets \cmd{\@nameauth@DoAlttrue}, which activates formatting. \cmd{\AltFormatInactive} sets both flags false.
+% \cmd{\AltFormatActive*} normally suppresses formatting changes but it still forces \cmd{\CapThis} to work through \cmd{\AltCaps}. One can leverage this to get the default look of \textsf{nameauth} while mitigating errors if many names use macros in their arguments.
%
-% \cmd{\AltFormatActive*} normally suppresses formatting changes but it still forces \cmd{\CapThis} to work through \cmd{\AltCaps}. This produces the default look of \textsf{nameauth} and prevents Continental formatting, but it also reduces spurious index entries and errors if many names use macros in their arguments.
-%
% Alternate formatting protects against errors created when \cmd{\@nameauth@Cap} (used by \cmd{\CapThis}) gets a failure result from \cmd{\@nameauthUTFtest}, but that result is neither a letter nor a macro that expands to a sequence of letters. Protected macros and other cases may create errors if \cmd{\MakeUppercase} is applied to them. \cmd{\AltCaps} and \cmd{\CapThis} work together to avoid this problem (Section~\ref{sec:AltFormat}).
%
-% \begin{center}\bfseries Continental Format\end{center}
-%
-% \noindent Here we look in greater detail at how \textsf{nameauth} implements the advanced version of Continental formatting. Font changes occur in the short macros \cmd{\textSC}, \cmd{\textIT}, \cmd{\textBF}, and \cmd{\textUC}. They all look similar to \cmd{\textSC}:
+% \begin{center}\bfseries Continental Format: Predefined\end{center}
+% \phantomsection
+% Here we look in greater detail at how \textsf{nameauth} implements the advanced version of Continental formatting. Font changes occur in the short macros \cmd{\textSC}, \cmd{\textIT}, \cmd{\textBF}, and \cmd{\textUC}. They all look similar to \cmd{\textSC}:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -4060,8 +4690,8 @@ the README.txt or README for more information.
% \if@nameauth@DoAlt\textsc{#1}\else#1\fi
%}\end{verbatim}
% \end{quote}
-%
-% If the \texttt{altformat} option or \cmd{\AltFormatActive} is used, formatting occurs in both the text and in the index. We want small caps on by default in the text and index, then off in subsequent uses. Thus, we use \cmd{\AltFormatActive}, then redefine \cmd{\MainNameHook} because it is the subsequent use hook. \cmd{\AltOff} deactivates formatting only in the formatting hooks:
+%
+% If the \texttt{altformat} option or \cmd{\AltFormatActive} is used, formatting occurs in both the text and in the index. \cmd{\AltOff} deactivates formatting only in the formatting hooks:
% \begin{quote}\small
% \ContinueNum
% \begin{verbatim}
@@ -4070,7 +4700,7 @@ the README.txt or README for more information.
%}\end{verbatim}
% \end{quote}
%
-% \cmd{\CapThis} now triggers \cmd{\AltCaps} to capitalize its argument:
+% \cmd{\CapThis} triggers \cmd{\AltCaps} to capitalize its argument:
% \begin{quote}\small
% \ContinueNum
% \begin{verbatim}
@@ -4083,18 +4713,23 @@ the README.txt or README for more information.
%
% We must put \cmd{\noexpand} before \cmd{\textSC}, \cmd{\AltCaps}, and so on to prevent them from expanding outside of the formatting hooks.
%
-% Before we alter the formatting hooks, we either can \cmd{\let} the hook macros to recall them later or we can use \cmd{\begingroup} and \cmd{\endgroup} to create a new scope that localizes any changes. We use scoping in this section.
+% Before we alter the formatting hooks, either we can \cmd{\let} the hook macros to recall them later or we can use \cmd{\begingroup} and \cmd{\endgroup} to create a new scope that localizes any changes. We use scoping in this section.
+% \newpage
%
-% This final step \emph{does not come} from the \textsf{nameauth} source. We must redefine the formatting hooks ourselves. One of the simplest ways to do this when using the \texttt{altformat} option or \cmd{\AltFormatActive} is:
+% \begin{center}\bfseries Continental Format: User-Defined\end{center}
+% \phantomsection
+% \begingroup^^A Local format hook redefinition
+% The user must implement this final step. We use \cmd{\AltFormatActive}, then redefine \cmd{\MainNameHook} to have small caps on by default in the index and first uses in the text, then off in subsequent uses in the text:
% \begin{quote}\small
-% \ContinueNum
+% \StartNum
% \begin{verbatim}
%\renewcommand*\MainNameHook{\AltOff}
%\let\FrontNameHook\MainNameHook\end{verbatim}
% \end{quote}
+%\renewcommand*\MainNameHook{\AltOff}
+%\let\FrontNameHook\MainNameHook
%
-% \renewcommand*\MainNameHook{\AltOff}\let\FrontNameHook\MainNameHook
-% To suppress all formatting in the front-matter text, one need simply to use |\let\FrontNamesFormat\MainNameHook|. Continental formatting usually alters at least one element in the required name argument, as we see below:
+% To suppress all formatting in the front-matter text, one need simply to use \cmd{\let}\cmd{\FrontNamesFormat}\cmd{\MainNameHook}. We do not do that here. Usually, we set up the names and any related macros in the preamble:
% \begin{quote}\small
% \ContinueNum
% \begin{verbatim}
@@ -4108,7 +4743,7 @@ the README.txt or README for more information.
%\end{nameauth}\end{verbatim}
% \end{quote}
%
-% Now we must ensure that these names are sorted properly in the index. When sorting names, be sure to use \cmd{\noexpand} before the macros:
+% Likewise in the preamble, we must ensure that these names are sorted properly in the index. When sorting names, be sure to use \cmd{\noexpand} as well:
% \begin{quote}\small
% \ContinueNum
% \begin{verbatim}
@@ -4124,27 +4759,27 @@ the README.txt or README for more information.
% \begin{center}
% \small\noindent\begin{tabular}{llll}\toprule
% First & Next & Long & Short \\\midrule
-% |\Adams| & |\Adams| & |\LAdams| & |\SAdams|\\
-% \Adams & \Adams & \LAdams & \SAdams\\
-% \rowcolor{black!7!white}|\SDJR| & |\SDJR| & |\LSDJR| & |\SSDJR|\\
-% \rowcolor{black!7!white}\SDJR & \SDJR & \LSDJR & \SSDJR\\
-% |\HAR| & |\HAR| & |\LHAR| & |\SHAR|\\
-% \HAR & \HAR & \LHAR & \SHAR\\
-% \rowcolor{black!7!white}|\Mencius| & |\Mencius| & |\LMencius| & |\SMencius|\\
-% \rowcolor{black!7!white}\Mencius & \Mencius & \LMencius & \SMencius\\\bottomrule
+% \rowcolor{grey}\cmd{\Adams} & \cmd{\Adams} & \cmd{\LAdams} & \cmd{\SAdams}\\
+% \rowcolor{grey}\Adams & \Adams & \LAdams & \SAdams\\
+% \cmd{\SDJR} & \cmd{\SDJR} & \cmd{\LSDJR} & \cmd{\SSDJR}\\
+% \SDJR & \SDJR & \LSDJR & \SSDJR\\
+% \rowcolor{grey}\cmd{\HAR} & \cmd{\HAR} & \cmd{\LHAR} & \cmd{\SHAR}\\
+% \rowcolor{grey}\HAR & \HAR & \LHAR & \SHAR\\
+% \cmd{\Mencius} & \cmd{\Mencius} & \cmd{\LMencius} & \cmd{\SMencius}\\
+% \Mencius & \Mencius & \LMencius & \SMencius\\\bottomrule
% \end{tabular}
% \end{center}
%
% \begin{itemize}\small
% \item Punctuation detection works: \ForceName\LSDJR. Also \LSDJR. Then \ForceName\SDJR. Now \SDJR. (We used \cmd{\ForceName} for formatting.)
-% \item \cmd{\ForceName}\cmd{\DropAffix}\cmd{\LSDJR} gives \ForceName\DropAffix\LSDJR. Otherwise, only using the macro \cmd{\DropAffix}\cmd{\LSDJR} gives \DropAffix\LSDJR.
+% \item \cmd{\ForceName}\cmd{\DropAffix}\cmd{\LSDJR} gives \ForceName\DropAffix\LSDJR. Otherwise, using the macro \cmd{\DropAffix}\cmd{\LSDJR} gives \DropAffix\LSDJR.
% \item \cmd{\RevComma}\cmd{\LAdams} yields \RevComma\LAdams. All the reversing macros work.
% \item \cmd{\ForceName}\cmd{\ForceFN}\cmd{\SHAR} produces \ForceName\ForceFN\SHAR. \cmd{\ForceFN}\cmd{\SHAR} produces \ForceFN\SHAR. If we add \cmd{\CapThis} we get \CapThis\ForceName\ForceFN\SHAR\ and \CapThis\ForceFN\SHAR.\footnote{The way that Continental resources treat certain affixes relates to similar issues in [\hyperlink{Mulvany}{Mulvany}, 168--73]. Handling non-Western names in Western sources can be a gray area. One ought take care to be culturally sensitive in these matters.}
% \item One must include all the macros in the name arguments.
% \end{itemize}
%
% \makeatletter\@nameauth@AKAFormattrue\makeatother
-% If we use the \texttt{formatAKA} option we can refer to \Mencius\ as \AKA{\noexpand\textSC{Mencius}}{\noexpand\textSC{Meng}, Ke}, and again \AKA{\noexpand\textSC{Mencius}}{\noexpand\textSC{Meng}, Ke}. We get that with:
+% With the \texttt{formatAKA} option we refer to \Mencius\ as \AKA{\noexpand\textSC{Mencius}}{\noexpand\textSC{Meng}, Ke} and \AKA{\noexpand\textSC{Mencius}}{\noexpand\textSC{Meng}, Ke}:
% \begin{quote}\small
% \ContinueNum
% \begin{verbatim}
@@ -4152,14 +4787,18 @@ the README.txt or README for more information.
%\AKA{\noexpand\textSC{Mencius}}{\noexpand\textSC{Meng}, Ke}\end{verbatim}
% \end{quote}
% \makeatletter\@nameauth@AKAFormatfalse\makeatother
+% \endgroup^^A Local format hook redefinition
%
% \begin{center}\bfseries Rolling Your Own: Basic\end{center}
+% \phantomsection
+% \begingroup^^A Local format hook redefinition
+% Here we set out on the path to custom formatting by using package features that have been implemented already and look similar to the solutions in Section~\ref{sec:AltFormat}.
%
-% \noindent Here we set out on the path to custom formatting by using package features that have been implemented already and look similar to the solutions in Section~\ref{sec:AltFormat}.
+% When\Warn{} redesigning formatting hooks, we recommend using \cmd{\AltFormatActive} or the \texttt{altformat} option to enable alternate formatting and prevent \cmd{\CapThis} from breaking custom formatting macros.
%
-% When\Warn{} redesigning formatting hooks, one should use \cmd{\AltFormatActive} or the \texttt{altformat} option to enable alternate formatting and prevent \cmd{\CapThis} from breaking custom formatting macros.
+% We recommend examining the internal package flag \cmd{\@nameauth@DoAlt}, which activates alternate formatting, \cmd{\@nameauth@DoCaps}, which handles capitalization, and \cmd{\@nameauth@InHook}, which is true when the formatting hooks are called. See page~\pageref{page:Hooks} and following. If you create your own macros, they will look similar.
%
-% We recommend examining the internal package flag \cmd{\@nameauth@DoAlt}, which activates alternate formatting, \cmd{\@nameauth@DoCaps}, which handles capitalization, and \cmd{\@nameauth@InHook}, which is true when the formatting hooks are called. See page~\pageref{page:Hooks} and following. If you create your own macros, they will look similar:
+% Normally we define a macro for use in name arguments in the document preamble in order to ensure that it is always defined:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -4178,42 +4817,48 @@ the README.txt or README for more information.
%\renewcommand*\MainNameHook{\AltOff}
%\let\FrontNameHook\MainNameHook\end{verbatim}
% \end{quote}
+%\renewcommand*\MainNameHook{\AltOff}
+%\let\FrontNameHook\MainNameHook
%
% When sorting names, be sure to use \cmd{\noexpand} as shown previously:
% \begin{quote}\small
% \ContinueNum
% \begin{verbatim}
-%\PretagName[Pierre-Jean]%
-% {\noexpand\Fbox{\noexpand\AltCaps{d}e Smet}}%
-% {de Smet, Pierre-Jean}
-%
%\begin{nameauth}
% \< deSmet & Pierre-Jean &
-% \noexpand\Fbox{\noexpand\AltCaps{d}e Smet} & >
-%\end{nameauth}\end{verbatim}
+% \noexpand\Fbox{\noexpand\AltCaps{d}e~Smet} & >
+%\end{nameauth}
+%
+%\PretagName[Pierre-Jean]%
+% {\noexpand\Fbox{\noexpand\AltCaps{d}e~Smet}}%
+% {de~Smet, Pierre-Jean}\end{verbatim}
% \end{quote}
%
% Now we show how the formatting hooks work in the body text. One can check the index to see that it is formatted properly and consistently.
%
-% \begin{center}\footnotesize
-% \begin{tabular}{llll}\toprule
-% First & Next & Long & Short \\\midrule
-% |\deSmet| & |\deSmet| & |\LdeSmet| & |\SdeSmet|\\
-% \deSmet & \deSmet & \LdeSmet & \SdeSmet\\\bottomrule
+% \begin{center}\small
+% \begin{tabular}{rll}\toprule
+% First & \cmd{\deSmet} & \deSmet\\
+% \rowcolor{grey}Next & \cmd{\deSmet} & \deSmet\\
+% Long & \cmd{\LdeSmet} & \LdeSmet\\
+% \rowcolor{grey}Short & \cmd{\SdeSmet} & \SdeSmet\\
+% & \cmd{\CapThis}\cmd{\deSmet} & \CapThis\deSmet\\
+% \rowcolor{grey} & \cmd{\ForceName}\cmd{\CapThis}\cmd{\deSmet} & \ForceName\CapThis\deSmet\\\bottomrule
% \end{tabular}
% \end{center}
%
-% The capitalized version |\CapThis\deSmet| is \CapThis\deSmet. This also works for a formatted use via \cmd{\ForceName}: \ForceName\CapThis\deSmet.
-%
% Some formatting, such as the use of \cmd{\textSC}, is fairly standard. Other formatting, such as \cmd{\Fbox} above, is ornamental and may be handled better with custom features (Section~\ref{sec:Customize}), but those features appear only in the text.
+% \endgroup^^A Local format hook redefinition
% \newpage
%
% \begin{center}\bfseries Rolling Your Own: Intermediate\end{center}
-%
-% \noindent \hspace{-0.47em}``Intermediate'' and ``advanced'' refer to the way hooks were designed before version 3.1. We begin the journey to more customized formatting by looking at \cmd{\NameParser}, whose logic Sections~\ref{sec:InternalMacros} and~\ref{sec:UserInterface} show in detail.\medskip
+% \phantomsection
+% \label{page:Intermediate}
+% \begingroup^^A Local format hook redefinition
+% ``Intermediate'' and ``advanced'' refer to the way that formatting hooks were designed before version 3.1. We begin the journey to more customized formatting by looking at \cmd{\NameParser}, whose logic Sections~\ref{sec:InternalMacros} and~\ref{sec:UserInterface} show in detail.\medskip
%
% \DescribeMacro{\NameParser}
-% This user-accessible parser (Section~\ref{sec:UserInterface}) builds a printed name from the internal macros \cmd{\FNN}, \cmd{\SNN}, \cmd{\rootb} and \cmd{\suffb}.\Version{3.1} It uses the following Boolean flags:\footnote{These exclude all capitalization macros.}
+% This user-accessible parser (Section~\ref{sec:UserInterface}) builds a printed name from internal, locally-scoped macros \cmd{\FNN}, \cmd{\SNN}, \cmd{\rootb} and \cmd{\suffb}.\Version{3.1} It uses only these Boolean flags:\footnote{The capitalization macros interact with the internal macros before the name parser, therefore, they do not directly engage the output of the name parser.}
% \begin{quote}\small\MyStretch
% Only one or the other of these can be true to avoid undocumented behavior.\smallskip\\
% |\if@nameauth@FullName|\hfill Print a full name if true.\\
@@ -4224,23 +4869,22 @@ the README.txt or README for more information.
% |\if@nameauth@RevThisComma|\hfill Reverse Western name, add comma.
% \end{quote}
%
-% We create a hook that can ignore ignore the output of \cmd{\@nameauth@Name}, which is the \texttt{\#1} in the hook dispatcher's code \cmd{\bgroup}\meta{Hook}\texttt{\{\#1\}}\cmd{\egroup}:
+% We create a hook that can ignore the output of \cmd{\@nameauth@Name}, which is the \texttt{\#1} in the hook dispatcher's code \cmd{\bgroup}\meta{Hook}\texttt{\{\#1\}}\cmd{\egroup}:
% \begin{quote}\small\MyStretch
-% |\renewcommand*|\meta{FirstHook}|[1]{|\texttt{\dots}\cmd{\NameParser}\texttt{\dots}|}|
+% \cmd{\renewcommand*}\meta{FirstHook}\texttt{[1]\{\dots}\cmd{\NameParser}\texttt{\dots\}}
% \end{quote}
%
% With the \texttt{altformat} option or \cmd{\AltFormatActive} we can design a subsequent-use hook that deactivates formatting inside of it:
% \begin{quote}\small\MyStretch
-% |\renewcommand*|\meta{SubsequentHook}|[1]{|\texttt{\dots}\cmd{\AltOff}\cmd{\NameParser}\texttt{\dots}|}|
+% \cmd{\renewcommand*}\meta{SubsequentHook}\texttt{[1]\{\dots}\cmd{\AltOff}\cmd{\NameParser}\texttt{\dots\}}
% \end{quote}
%
% If we used \cmd{\AltFormatActive*}, where the formatting macros are enabled, but deactivated, then we might want a hook that activates the macros:
% \begin{quote}\small\MyStretch
-% |\renewcommand*|\meta{Hook}|[1]{|\texttt{\dots}\cmd{\AltOn}\cmd{\NameParser}\texttt{\dots}|}|
+% \cmd{\renewcommand*}\meta{Hook}\texttt{[1]\{\dots}\cmd{\AltOn}\cmd{\NameParser}\texttt{\dots\}}
% \end{quote}
-%
-% Within the hooks we can use the user-level parser as often as we want. We also can change internal Boolean flags, for example:
-% \begingroup
+%
+% Within the hooks we can use the user-side parser as often as we want. We also can change internal Boolean flags, for example:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -4257,74 +4901,53 @@ the README.txt or README for more information.
%
% \smallskip
% \makeatletter
-% \renewcommand*\NamesFormat[1]{\small%^^A
-% \hbox to 3.5em{[now]\hfill}\space\NameParser\\%^^A
-% \@nameauth@FullNametrue%^^A
-% \hbox to 3.5em{[long]\hfill}\space\NameParser\\%^^A
-% \@nameauth@FullNamefalse%^^A
-% \@nameauth@FirstNametrue%^^A
+% \renewcommand*\NamesFormat[1]{\small^^A
+% \hbox to 3.5em{[now]\hfill}\space\NameParser\\^^A
+% \@nameauth@FullNametrue^^A
+% \hbox to 3.5em{[long]\hfill}\space\NameParser\\^^A
+% \@nameauth@FullNamefalse^^A
+% \@nameauth@FirstNametrue^^A
% \hbox to 3.5em{[short]\hfill}\space\NameParser}
% \makeatother
% \let\MainNameHook\NamesFormat
%
-% |\JRIV| displays:
-%
+% One instance of \cmd{\JRIV} displays:
+%
% \JRIV
% \end{quote}
-% \endgroup
%
-% The proof of concept above is interesting, but not very useful. Now we move on toward more useful designs, based on Sections~\ref{sec:Hooksi} and~\ref{sec:Hooksii}.
+% The proof of concept above is interesting, but not very useful in a practical setting. Now we move on toward more useful and practical designs.
% \newpage
-%
-% We begin by defining a name that is composed only of macros:
-% \begingroup
-% \newif\ifSpecialFN
-% \newif\ifSpecialSN
-% \newif\ifRevertSN
-% \newcommand*\WM{\ifSpecialFN Wm.\else William\fi}
-% \newcommand*\SHK{\ifRevertSN \textSC{Shakespeare}\else
-% \ifSpecialSN \noexpand\AltCaps{t}he Bard\else
-% \textSC{Shakespeare}\fi\fi}
-% \newcommand*\Revert{\RevertSNtrue}
+%
% \makeatletter
-% \renewcommand*\NamesFormat[1]{%^^A
-% \RevertSNfalse\SpecialFNfalse\SpecialSNfalse#1%^^A
-% \unless\ifinner\marginpar{%^^A
-% \footnotesize\raggedleft%^^A
-% \@nameauth@FullNametrue%^^A
-% \@nameauth@FirstNamefalse%^^A
-% \@nameauth@EastFNfalse%^^A
-% \SpecialFNtrue\SpecialSNfalse%^^A
-% \NameParser}%^^A
+% \renewcommand*\NamesFormat[1]{^^A
+% \RevertSNfalse\SpecialFNfalse\SpecialSNfalse#1^^A
+% \unless\ifinner\marginpar{^^A
+% \footnotesize\raggedleft^^A
+% \@nameauth@FullNametrue^^A
+% \@nameauth@FirstNamefalse^^A
+% \@nameauth@EastFNfalse^^A
+% \SpecialFNtrue\SpecialSNfalse^^A
+% \NameParser}^^A
% \fi\global\RevertSNfalse}
-% \renewcommand*\MainNameHook[1]{%^^A
-% \AltOff\SpecialFNfalse\SpecialSNtrue#1%^^A
+% \renewcommand*\MainNameHook[1]{^^A
+% \AltOff\SpecialFNfalse\SpecialSNtrue#1^^A
% \unless\ifinner
% \unless\ifRevertSN
-% \marginpar{%^^A
-% \footnotesize\raggedleft%^^A
-% \@nameauth@FullNamefalse%^^A
-% \@nameauth@FirstNamefalse%^^A
-% \@nameauth@EastFNfalse%^^A
-% \SpecialFNfalse\SpecialSNfalse%^^A
-% \NameParser}%^^A
+% \marginpar{^^A
+% \footnotesize\raggedleft^^A
+% \@nameauth@FullNamefalse^^A
+% \@nameauth@FirstNamefalse^^A
+% \@nameauth@EastFNfalse^^A
+% \SpecialFNfalse\SpecialSNfalse^^A
+% \NameParser}^^A
% \fi
% \fi\global\RevertSNfalse}
% \makeatother
+% We begin in the document preamble by defining a series of conditionals and macros whose default expansion produces the index entry, yet whose other expansions occur only in the formatting hooks. Then we create a name that is composed only of macros, using \cmd{\noexpand} with \cmd{\WM} and \cmd{\SHK}. We use \cmd{\PretagName} to sort the names. \cmd{\Revert} is used to print a last name without a margin note.
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
-%\begin{nameauth}
-% \< Shak & \noexpand\WM & \noexpand\SHK & >
-%\end{nameauth}
-%\PretagName[\noexpand\WM]{\noexpand\SHK}{Shakespeare, William}
-%\PretagName[Robert]{\textSC{Burns}}{Burns, Robert}\end{verbatim}
-% \end{quote}
-%
-% Now we define the flags by which the macros \cmd{\WM} and \cmd{\SHK} expand differently in the formatting hooks than in the index:
-% \begin{quote}\small
-% \ContinueNum
-% \begin{verbatim}
%\newif\ifSpecialFN
%\newif\ifSpecialSN
%\newif\ifRevertSN
@@ -4333,13 +4956,20 @@ the README.txt or README for more information.
% \ifSpecialSN \noexpand\AltCaps{t}he Bard\else
% \textSC{Shakespeare}\fi\fi}
%\newcommand*\Revert{\RevertSNtrue}
-%\makeatletter\end{verbatim}
+%
+%\begin{nameauth}
+% \< Shak & \noexpand\WM & \noexpand\SHK & >
+%\end{nameauth}
+%
+%\PretagName[\noexpand\WM]{\noexpand\SHK}{Shakespeare, William}
+%\PretagName[Robert]{\textSC{Burns}}{Burns, Robert}\end{verbatim}
% \end{quote}
%
-% Finally, we define the two formatting hooks that trigger these changes:
+% Below we define the two formatting hooks that structure the ways in which these macros can expand when printed in the text. \cmd{\NamesFormat} allows only the canonical name via \cmd{\RevertSNfalse}, \cmd{\SpecialFNfalse}, and \cmd{\SpecialSNfalse}. We print the canonical name in the body text. If allowed, we print a margin paragraph with an alternate full name using \cmd{\NameParser} and two flags. Both hooks set \cmd{\RevertSNfalse} so that \cmd{\Revert} works on a per-name basis. The subsequent-use hook disables formatting with \cmd{\AltOff}, but it allows variant forms.
% \begin{quote}\small
% \ContinueNum
% \begin{verbatim}
+%\makeatletter
%\renewcommand*\NamesFormat[1]{%
% \RevertSNfalse\SpecialFNfalse\SpecialSNfalse#1%
% \unless\ifinner\marginpar{%
@@ -4366,38 +4996,30 @@ the README.txt or README for more information.
%\makeatother\end{verbatim}
%
% \smallskip
-% \Shak\ \cmd{\Shak} is the national poet of England in much the same way as \Name[Robert]{\textSC{Burns}} |\Name[Robert]{\textSC{Burns}}| is that of Scotland. With the latter's rise of influence in the 1800s, \Revert\Shak\ \cmd{\Revert}\cmd{\Shak} became known as ``\Shak'' \cmd{\Shak}.
+% \ForgetThis\Shak\ \cmd{\ForgetThis}\cmd{\Shak} is the national poet of England in much the same way that \Name[Robert]{\textSC{Burns}} \cmd{\Name[Robert]\{}\cmd{\textSC\{Burns\}\}} is that of Scotland. With the latter's rise of influence in the 1800s, \Revert\Shak\ \cmd{\Revert}\cmd{\Shak} became known as ``\Shak'' \cmd{\Shak}.
% \end{quote}
-% \endgroup
-%
-% First, we put macros \cmd{\WM} and \cmd{\SHK} in name arguments using \cmd{\noexpand}. That will make the index work properly. We use \cmd{\PretagName} to sort the names. We set up three flags. One is for \cmd{\WM} and two are for \cmd{\SHK}. \cmd{\Revert} is used to print a last name without a margin note.
-%
-%In the first-use hook we allow only the canonical name via \cmd{\RevertSNfalse}, \cmd{\SpecialFNfalse}, and \cmd{\SpecialSNfalse}. The default global formatting state is set by \cmd{\AltFormatActive}. We print the canonical name in the body text. If not in inner horizontal mode, we print a margin paragraph with an alternate full name using \cmd{\NameParser} and two flags. Both hooks set \cmd{\RevertSNfalse} so that \cmd{\Revert} works on a per-name basis. The subsequent-use hook disables formatting with \cmd{\AltOff}, but it allows variant forms.
+% \endgroup^^A Local format hook redefinition
%
% \begin{center}\bfseries Rolling Your Own: Advanced\end{center}
-%
-% Here\Warn{} is how formatting hooks were designed before version 3.0. Updating these older hooks is helpful, but may not be necessary. Here we do not use the internal package macros. We only use \cmd{\NameParser} in the hooks to produce output. We still recommend using \cmd{\AltFormatActive} to prevent problems with \cmd{\CapThis}.
-%
-% \newif\ifFbox
-% \newif\ifFirstCap
-% \newif\ifInHook
-% \Fboxtrue
-% Three flags replace package internals. \texttt{\textbackslash @nameauth@DoAlt} activates formatting; \texttt{\textbackslash @nameauth@DoCaps} is set by \cmd{\CapThis}; and \texttt{\textbackslash @nameauth@InHook} is set by the hook dispatcher. Setting \texttt{\textbackslash Fboxtrue} is equivalent to using \cmd{\AltFormatActive}:
+% \phantomsection
+% \begingroup^^A Local format hook redefinition
+% Here is how formatting hooks were designed before version 3.0. Updating older hooks may be helpful, but is not necessary. We\Warn{} do not use the internal package macros. We only use \cmd{\NameParser} in the hooks to produce output. We still recommend using \cmd{\AltFormatActive} to mitigate errors. In the preamble, three flags replace package internals.\footnote{The internal flag \texttt{\textbackslash @nameauth@DoAlt} activates formatting, \cmd{\CapThis} sets \texttt{\textbackslash @nameauth@DoCaps} true, and \texttt{\textbackslash @nameauth@InHook} is set by the hook dispatcher.}
+% Setting \texttt{\textbackslash Fboxtrue} is equivalent to using \cmd{\AltFormatActive}:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
-%\newif\ifFbox% Replaces \@nameauth@DoAlt
-%\newif\ifFirstCap% Replaces \@nameauth@DoCaps
-%\newif\ifInHook% Replaces \@nameauth@InHook
+%\newif\ifFbox% Replaces \@nameauth@DoAlt
+%\newif\ifFirstCap% Replaces \@nameauth@DoCaps
+%\newif\ifInHook% Replaces \@nameauth@InHook
%\Fboxtrue\end{verbatim}
% \end{quote}
%
-% \renewcommand*\Fbox[1]{\ifFbox\protect\fbox{#1}\else#1\fi}
-% The formatting macro is like what we have seen, except it refers to \texttt{\textbackslash ifFbox}:
+% \newcommand*\Fbox[1]{\ifFbox\protect\fbox{#1}\else#1\fi}
+% Also in the preamble, the formatting macro is like what we have seen, except it refers to \texttt{\textbackslash ifFbox}:\footnote{As previously noted, we define \cmd{\Fbox} locally in this manual because it has multiple definitions, but are very careful where we use names with it.}
% \begin{quote}\small
% \ContinueNum
% \begin{verbatim}
-%\renewcommand*\Fbox[1]{%
+%\newcommand*\Fbox[1]{%
% \ifFbox\protect\fbox{#1}\else#1\fi
%}\end{verbatim}
% \end{quote}
@@ -4433,7 +5055,7 @@ the README.txt or README for more information.
%\renewcommand*\CapThis{\FirstCaptrue}\end{verbatim}
% \end{quote}
%
-% We have to reproduce the logic and macros that the package would have provided. That means defining everything, including \cmd{\NamesFormat}, from scratch:
+% We have to reproduce the logic and macros that the package would have provided. That means defining everything, including \cmd{\NamesFormat}, from scratch:
% \begin{quote}\small
% \ContinueNum
% \begin{verbatim}
@@ -4458,18 +5080,19 @@ the README.txt or README for more information.
% \end{quote}
%
% Because we use \cmd{\noexpand}, our ``old-style'' macros will index the following names under the same entry as the ``new-style'' macros.
-% \begin{center}\footnotesize
-% \begin{tabular}{llll}\toprule
-% First & Next & Long & Short \\\midrule
-% |\deSmet| & |\deSmet| & |\LdeSmet| & |\SdeSmet|\\
-% \ForgetThis\deSmet & \deSmet & \LdeSmet & \SdeSmet\\\bottomrule
+%
+% \begin{center}\small
+% \begin{tabular}{rll}\toprule
+% First & \cmd{\deSmet} & \ForgetThis\deSmet\\
+% \rowcolor{grey}Next & \cmd{\deSmet} & \deSmet\\
+% Long & \cmd{\LdeSmet} & \LdeSmet\\
+% \rowcolor{grey}Short & \cmd{\SdeSmet} & \SdeSmet\\
+% & \cmd{\CapThis}\cmd{\deSmet} & \CapThis\deSmet\\
+% \rowcolor{grey} & \cmd{\ForceName}\cmd{\CapThis}\cmd{\deSmet} & \ForceName\CapThis\deSmet\\\bottomrule
% \end{tabular}
% \end{center}
%
-% The capitalized version |\CapThis\deSmet| is \CapThis\deSmet. This also works for a formatted use via \cmd{\ForceName}: \ForceName\CapThis\deSmet.
-%
% We can reuse\Warn{} new-style names with old-style macros, shown below in abbreviated fashion. We keep the flags \texttt{\textbackslash ifFirstCap} and \texttt{\textbackslash ifInHook}. We also keep the redefined \cmd{\AltCaps}, \cmd{\CapThis}, and \cmd{\NamesFormat}. We then add:
-% \newif\ifCaps
% \Capstrue
% \renewcommand*\textSC[1]{\ifCaps\textsc{#1}\else#1\fi}
% \renewcommand*\MainNameHook[1]
@@ -4495,22 +5118,23 @@ the README.txt or README for more information.
% \begin{center}
% \small\noindent\begin{tabular}{llll}\toprule
% First & Next & Long & Short \\\midrule
-% \ForgetThis\Adams & \Adams & \LAdams & \SAdams\\
-% \rowcolor{black!7!white}\ForgetThis\SDJR & \SDJR & \LSDJR & \SSDJR\\
-% \ForgetThis\HAR & \HAR & \LHAR & \SHAR\\
-% \rowcolor{black!7!white}\ForgetThis\Mencius & \Mencius & \LMencius & \SMencius\\\bottomrule
+% \rowcolor{grey}\ForgetThis\Adams & \Adams & \LAdams & \SAdams\\
+% \ForgetThis\SDJR & \SDJR & \LSDJR & \SSDJR\\
+% \rowcolor{grey}\ForgetThis\HAR & \HAR & \LHAR & \SHAR\\
+% \ForgetThis\Mencius & \Mencius & \LMencius & \SMencius\\\bottomrule
% \end{tabular}
% \end{center}
%
% \begin{itemize}\small
% \item Punctuation detection works: \ForceName\LSDJR. Also \LSDJR. Then \ForceName\SDJR. Now \SDJR. (We used \cmd{\ForceName} for formatting.)
-% \item \cmd{\ForceName}\cmd{\DropAffix}\cmd{\LSDJR} gives \ForceName\DropAffix\LSDJR. Otherwise, only using the macro \cmd{\DropAffix}\cmd{\LSDJR} gives \DropAffix\LSDJR.
+% \item \cmd{\ForceName}\cmd{\DropAffix}\cmd{\LSDJR} gives \ForceName\DropAffix\LSDJR. Otherwise, using the macro \cmd{\DropAffix}\cmd{\LSDJR} gives \DropAffix\LSDJR.
% \item \cmd{\RevComma}\cmd{\LAdams} yields \RevComma\LAdams. All the reversing macros work.
% \item \cmd{\ForceName}\cmd{\ForceFN}\cmd{\SHAR} produces \ForceName\ForceFN\SHAR. \cmd{\ForceFN}\cmd{\SHAR} produces \ForceFN\SHAR. If we add \cmd{\CapThis} we get \CapThis\ForceName\ForceFN\SHAR\ and \CapThis\ForceFN\SHAR.
% \end{itemize}
%
-% We now resume normal formatting with \cmd{\AltFormatInactive} and close the scope that we began at the start of Section~\ref{sec:Hooksi}.
-% \AltFormatInactive\endgroup
+% We now close the scope of this current example and resume normal formatting.
+% \endgroup^^A Local format hook redefinition
+% \AltFormatInactive
%
% \ReturnLink
% \newpage
@@ -4527,7 +5151,7 @@ the README.txt or README for more information.
% \DescribeMacro{\NameauthFName}
% \cmd{\FName}, or an S-shorthand, sets \cmd{\@nameauth@FirstNametrue}, then calls \cmd{\NameauthFName}. One should not modify \cmd{\Name} and \cmd{\FName} directly.
%
-% Next we see a minimal working example that implements the obsolete syntax. We use few internal Boolean values, save those governing name forms. We do not implement short forms or any other features in \textsf{nameauth}. We must index the names with \cmd{\IndexName}. This example shows how to hook these redefined macros into the user interface:
+% Since \textsf{nameauth} depends on \textsf{xargs}, we use that in a minimal working example that implements the obsolete syntax (Section~\ref{sec:Obsolete}). We use few internal Boolean values, save those governing name forms. We do not implement short forms or any other features in \textsf{nameauth}. We must index the names with \cmd{\IndexName}. This example shows how to hook these redefined macros into the user interface. Note that the \texttt{quote} environment creates a local scope that we leverage below:
%
% \begin{quote}\small
% \StartNum
@@ -4560,10 +5184,10 @@ the README.txt or README for more information.
%\IndexName{Dagobert}[I]
%\IndexName{Aristotle}\end{verbatim}
% \makeatletter
-% \newcommandx*\MyName[3][1=\@empty, 3=\@empty]{%^^A
-% \protected@edef\a{\trim@spaces{#1}}%^^A
-% \protected@edef\b{\trim@spaces{#2}}%^^A
-% \protected@edef\c{\trim@spaces{#3}}%^^A
+% \newcommandx*\MyName[3][1=\@empty, 3=\@empty]{^^A
+% \protected@edef\a{\trim@spaces{#1}}^^A
+% \protected@edef\b{\trim@spaces{#2}}^^A
+% \protected@edef\c{\trim@spaces{#3}}^^A
% \ifx\b\empty fail \else
% \ifx\a\empty
% \ifx\c\empty \hbox to 5em{Mononym:\hfill} {\b}\else
@@ -4573,8 +5197,8 @@ the README.txt or README for more information.
% \hbox to 5em{Alternate:\hfill} {\c\ \b}\fi
% \fi
% \fi
-% \global\@nameauth@FullNamefalse%^^A
-% \global\@nameauth@FirstNamefalse%^^A
+% \global\@nameauth@FullNamefalse^^A
+% \global\@nameauth@FirstNamefalse^^A
% }
% \makeatother
% \let\MyLName\MyName
@@ -4598,29 +5222,30 @@ the README.txt or README for more information.
% The previous example is not particularly useful. There is, however, a more practical use for these macros. One could choose to implement additional features, then pass the information in the name argument token registers to the extant parsing macros of \textsf{nameauth} (cf. Section~\ref{sec:Hooksii}).
% \newpage
%
-% Below we introduce formatting that is additional to, inter-operative with, yet distinct from the formatting hooks:
+% We continue to use features of \textsf{xargs}, as well as the local scope of a \texttt{quote} environment. Below we introduce formatting that is additional to, inter-operative with, yet distinct from the formatting hooks:
+%
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
%\makeatletter
%\newcommandx*\MyName[3][1=\@empty, 3=\@empty]{%
-% \@nameauth@toksa\expandafter{#1}%
-% \@nameauth@toksb\expandafter{#2}%
-% \@nameauth@toksc\expandafter{#3}%
+% \global\@nameauth@toksa\expandafter{#1}%
+% \global\@nameauth@toksb\expandafter{#2}%
+% \global\@nameauth@toksc\expandafter{#3}%
% \hbox to 4em{Normal: \hfill}%
% \fcolorbox{black}{gray!25!white}{\@nameauth@Name[#1]{#2}[#3]}%
%}
%\newcommandx*\MyLName[3][1=\@empty, 3=\@empty]{%
-% \@nameauth@toksa\expandafter{#1}%
-% \@nameauth@toksb\expandafter{#2}%
-% \@nameauth@toksc\expandafter{#3}%
+% \global\@nameauth@toksa\expandafter{#1}%
+% \global\@nameauth@toksb\expandafter{#2}%
+% \global\@nameauth@toksc\expandafter{#3}%
% \hbox to 4em{Long: \hfill}%
% \fcolorbox{black}{green!25!white}{\@nameauth@Name[#1]{#2}[#3]}%
%}
%\newcommandx*\MyFName[3][1=\@empty, 3=\@empty]{%
-% \@nameauth@toksa\expandafter{#1}%
-% \@nameauth@toksb\expandafter{#2}%
-% \@nameauth@toksc\expandafter{#3}%
+% \global\@nameauth@toksa\expandafter{#1}%
+% \global\@nameauth@toksb\expandafter{#2}%
+% \global\@nameauth@toksc\expandafter{#3}%
% \hbox to 4em{Short: \hfill}%
% \fcolorbox{black}{yellow!25!white}{\@nameauth@Name[#1]{#2}[#3]}%
%}
@@ -4631,28 +5256,27 @@ the README.txt or README for more information.
%\renewcommand*\NameauthName{\MyName}
%\renewcommand*\NameauthLName{\MyLName}
%\renewcommand*\NameauthFName{\MyFName}\end{verbatim}
-%
% \makeatletter
-% \newcommandx*\MyName[3][1=\@empty, 3=\@empty]{%^^A
-% \@nameauth@toksa\expandafter{#1}%^^A
-% \@nameauth@toksb\expandafter{#2}%^^A
-% \@nameauth@toksc\expandafter{#3}%^^A
-% \hbox to 4em{Normal: \hfill}%^^A
-% \fcolorbox{black}{gray!25!white}{\@nameauth@Name[#1]{#2}[#3]}%^^A
+% \newcommandx*\MyName[3][1=\@empty, 3=\@empty]{^^A
+% \global\@nameauth@toksa\expandafter{#1}^^A
+% \global\@nameauth@toksb\expandafter{#2}^^A
+% \global\@nameauth@toksc\expandafter{#3}^^A
+% \hbox to 4em{Normal: \hfill}^^A
+% \fcolorbox{black}{gray!25!white}{\@nameauth@Name[#1]{#2}[#3]}^^A
% }
-% \newcommandx*\MyLName[3][1=\@empty, 3=\@empty]{%^^A
-% \@nameauth@toksa\expandafter{#1}%^^A
-% \@nameauth@toksb\expandafter{#2}%^^A
-% \@nameauth@toksc\expandafter{#3}%^^A
-% \hbox to 4em{Long: \hfill}%^^A
-% \fcolorbox{black}{green!25!white}{\@nameauth@Name[#1]{#2}[#3]}%^^A
+% \newcommandx*\MyLName[3][1=\@empty, 3=\@empty]{^^A
+% \global\@nameauth@toksa\expandafter{#1}^^A
+% \global\@nameauth@toksb\expandafter{#2}^^A
+% \global\@nameauth@toksc\expandafter{#3}^^A
+% \hbox to 4em{Long: \hfill}^^A
+% \fcolorbox{black}{green!25!white}{\@nameauth@Name[#1]{#2}[#3]}^^A
% }
-% \newcommandx*\MyFName[3][1=\@empty, 3=\@empty]{%^^A
-% \@nameauth@toksa\expandafter{#1}%^^A
-% \@nameauth@toksb\expandafter{#2}%^^A
-% \@nameauth@toksc\expandafter{#3}%^^A
-% \hbox to 4em{Short: \hfill}%^^A
-% \fcolorbox{black}{yellow!25!white}{\@nameauth@Name[#1]{#2}[#3]}%^^A
+% \newcommandx*\MyFName[3][1=\@empty, 3=\@empty]{^^A
+% \global\@nameauth@toksa\expandafter{#1}^^A
+% \global\@nameauth@toksb\expandafter{#2}^^A
+% \global\@nameauth@toksc\expandafter{#3}^^A
+% \hbox to 4em{Short: \hfill}^^A
+% \fcolorbox{black}{yellow!25!white}{\@nameauth@Name[#1]{#2}[#3]}^^A
% }
% \makeatother
% \renewcommand*\NamesFormat[1]{\hbox to 9em{\hfil\scshape#1\hfil}}
@@ -4662,107 +5286,455 @@ the README.txt or README for more information.
% \renewcommand*\NameauthFName{\MyFName}
%
% \smallskip
-% |\ForgetName[Adolf]{Harnack}|\ForgetName[Adolf]{Harnack}\\[1ex]
+% \cmd{\ForgetName[Adolf]\{Harnack\}}\ForgetName[Adolf]{Harnack}\\[1ex]
% \begin{tabular}{@{}rl}
-% |\Harnack| & \Harnack\\
-% |\LHarnack[Adolf von]| & \LHarnack[Adolf von]\\
-% |\Harnack| & \Harnack\\
-% |\SHarnack| & \SHarnack\\
+% \cmd{\Harnack} & \Harnack\\
+% \cmd{\LHarnack[Adolf von]} & \LHarnack[Adolf von]\\
+% \cmd{\Harnack} & \Harnack\\
+% \cmd{\SHarnack} & \SHarnack\\
% \end{tabular}
-% \end{quote}
+% \end{quote}\medskip
%
-% After\Version{3.3} the name is printed in the body text, the internal macros \emph{globally} set \cmd{\@nameauth@FullNamefalse} and \cmd{\@nameauth@FirstNamefalse}, as well as other flags related to the prefix macros. This prevents certain cases of undocumented behavior in versions of \textsf{nameauth} before 3.3, where resetting flags locally could cause unexpected name forms. If an existing document leverages the local resetting of flags, one can use the \texttt{oldreset} option. Compare Section~\ref{sec:IndexControl}.\medskip
+% After\Version{3.3} the name is printed in the body text, the internal macros \emph{globally} set \cmd{\@nameauth@FullNamefalse} and \cmd{\@nameauth@FirstNamefalse}, as well as other flags related to the prefix macros. This prevents certain cases of undocumented behavior in versions of \textsf{nameauth} before 3.3, where resetting flags locally could cause unexpected name forms. If an existing document leverages the local resetting of flags, one can use the \texttt{oldreset} option. Compare Section~\ref{sec:GeneralIndex}.\medskip
+%
+% Like\Info{\cmd{\global}} many of the macros in this package, these macros can be redefined or used locally within a scope without making global changes to the document unless you specifically use \cmd{\global}.
+% \endgroup^^A General format hook redefinition
%
-% Like\Info{\cmd{\global}} many of the macros in this package, these naming macros can be redefined or used locally within a scope without making global changes to the document unless you specifically use \cmd{\global}.
-%
% \ReturnLink
% \newpage
-% \endgroup^^A End of hook macro redefinition.
%
% \subsection{Technical Notes}
% \label{sec:TechNotes}
-%
-% \hfil This manual was created with
-% \fbox{\mystrut\ \bfseries\ifxetex xelatex (pdf)%^^A
+%
+% \subsubsection{General}
+% \label{sec:GenNotes}
+%
+% About the package itself:
+% \begin{itemize}
+% \item Current features\Version{3.5} allow \textsf{nameauth} to meet its goals: stability, professional features, and backward-compatibility.
+% \begin{itemize}
+% \item Internal macros not in a local scope start with \cmd{\@nameauth@}. No more assumptions of ``throwaway'' macro names.
+% \item Index control has become stricter and more sensitive to the order of both name and xref creation.
+% \item It is now easy to have a separate index of persons when using packages and classes that enable that.
+% \item Internals of all macros that handle name arguments use a standard, optimized logic.
+% \end{itemize}
+% \item We keep \textsf{xargs} for backward compatibility. Future package versions will use \textsf{xparse} instead of \textsf{xargs} and shed all compatibility options. A ``maintenance'' version will be preserved for backward compatibility.
+% \item The package works with both \texttt{texindy} and \texttt{makeindex}.
+% \end{itemize}
+%
+% \noindent About the manual (which is the test suite):
+% \begin{itemize}
+% \item It has been reworked and expanded. Many months of testing has yielded better explanations that reflect best practices.
+% \item We now emphasize current workflows and de-emphasize older, less-relevant macros and the obsolete syntax.
+% \item It is compatible with both A4 and US letter formats.
+% \item We mention when this manual changes package internals, does actions that are not visually discernible, or deviates from ``normal'' usage.
+% \end{itemize}
+%
+% \noindent About package building:
+% \begin{itemize}
+% \item Consult \texttt{README.md} for building instructions.
+% \item The \textsf{nameauth} package requires \textsf{etoolbox}, \textsf{suffix}, \textsf{trimspaces}, and \textsf{xargs}.
+% \item The package and manual build on current and older \LaTeX\ distributions.
+% \item The \texttt{dvi} test modes (\texttt{latex} and \texttt{dvilualatex}) use \texttt{dvipdf} to make \textit{TikZ} and \textsf{tcolorbox} render properly. The \texttt{pdf} test modes use \texttt{pdflatex}, \texttt{lualatex}, and \texttt{xelatex}. All modes use \texttt{makeindex}.
+% \item This release was tested ``officially'' on Linux (Manjaro; vanilla TL 2020 and 2017) and Windows 10 (Mik\TeX). The CTAN release is created with the latest vanilla TL release on Manjaro.
+% \end{itemize}\bigskip
+%
+% \begin{center}\bfseries This manual was created with
+% {\ttfamily\ifxetex xelatex (pdf)^^A
% \else
% \ifluatex
-% \ifpdf lualatex (pdf)%^^A
-% \else lualatex (dvi)%^^A
+% \ifpdf lualatex (pdf)^^A
+% \else lualatex (dvi)^^A
% \fi
% \else
-% \ifpdf pdflatex%^^A
-% \else latex (dvi)%^^A
+% \ifpdf pdflatex^^A
+% \else latex (dvi)^^A
% \fi
% \fi
-% \fi\ }
+% \fi}.\end{center}
%
-% \ifDoTikZ\begin{tcolorbox}[colback=white,colframe=nared,adjusted title={\hfil Thanks}]\else
-% \begin{center}\large\bfseries Thanks\end{center}\fi
-% \noindent Thanks to \Name[Marc van]{Dongen}, \Name[Enrico]{Gregorio}, \Name[Philipp]{Stephani}, \Name*[Heiko]{Oberdiek}, \Name[Uwe]{Lueck}, \Name[Dan]{Luecking} and \Name[Robert]{Schlicht} for assistance in early versions of this package. Thanks also to users for valuable feedback.\vfil
-% \ifDoTikZ\end{tcolorbox}\fi
-%
-% \subsubsection{General}
-% \label{sec:GenNotes}
-%
-% About the package itself:
+% \ReturnLink
+% \newpage
+%
+% \subsubsection{Package Warnings}
+% \label{sec:Warnings}
+% \medskip
+%
+% \begin{center}\bfseries Standard and Verbose Warnings\end{center}
+% Package warnings\Info{Standard warnings} result if one redefines name shorthands in the \texttt{nameauth} environment. That could be a problem. Yet if one uses, for example, a new \texttt{nameauth} environment per chapter, such warnings might be harmless. For example:
+% \begin{quote}\small\StartNum
+% \begin{verbatim}
+%\PretagName[E.\,B.]{White}{White, Elwyn}
+%\begin{nameauth}
+% \< White & E.B. & White & > % v.1
+% \< White & E.\,B. & White & > % v.2
+%\end{nameauth}\end{verbatim}
+%\begin{nameauth}
+% \< White & E.B. & White & >
+% \< White & E.\,B. & White & >
+%\end{nameauth}
+% \cmd{\White} gives ``\White''. We lost the first version when we redefined it. We ``forget'' \White\ for later (Section~\ref{sec:NameControl}) with |\ForgetName[E.\,B.]{White}|.\ForgetName[E.\,B.]{White}\footnote{There should be two package warnings for redefining \cmd{\White}. We defined it in the \texttt{dtx} driver, then redefined it twice above.}
+% \end{quote}
+%
+% Additionally,\Version{3.5} the following situations cause package warnings, especially since the indexing macros have been made stricter:
% \begin{itemize}
-% \item For version 3.2 behavior, use both the \texttt{oldpass} and \texttt{oldreset} options.
-% \item For version 2.6 behavior, use \texttt{oldpass}, \texttt{oldreset}, and \texttt{oldAKA}.
-% \item The package works with both \texttt{xindy} and \texttt{makeindex}.
-% \item Name\Version{3.0} output, index entry creation, and index cross-reference creation occur in independent modules.
-% \item Use\Version{3.0} the \texttt{verbose} option for warnings about indexing.
-% \item The \texttt{nameauth} environment always will emit warnings as needed.
-% \item The\Version{2.6} \texttt{comma} option and the older syntax are no longer restrictive, save with \cmd{\AKA} and its derivatives. See Sections~\ref{sec:Obsolete}, \ref{sec:Affix}, and~\ref{sec:AKA}.
-% \item No\Version{2.5} formatting is selected by default.
+% \item \emph{Ignore \& reset:} \cmd{\IndexName} and \cmd{\IndexRef} warn if \cmd{\SkipIndex} is active, and they reset its flag unless the \texttt{oldreset} option is used.
+% \item \emph{Ignore \& reset:} \cmd{\IndexName} warns if it or a naming macro that contains it was preceded by \cmd{\SeeAlso}, whose Boolean flag is then reset.
+% \item \emph{Ignore:} \cmd{\IndexRef} warns if one tries to create a \textit{see} reference from an extant name and ignores the attempt unless the \texttt{oldsee} option is used.
+% \item \emph{Ignore:} \cmd{\PretagName} warns if the \texttt{nopretag} option is used and it produces no sort tags in that case.
+% \item \emph{Warn:} \cmd{\PName} and \cmd{\PName*} warn if \cmd{\@nameauth@SkipIndextrue} on exit (only if the \texttt{oldreset} option is used).
% \end{itemize}
-% \noindent About the manual:
+%
+% Package warnings\Info{Verbose warnings} result from the following \emph{only} when using the \texttt{verbose} option. The macros either allow or ignore certain actions:
+%
% \begin{itemize}
-% \item This manual is the test suite.
-% \item This manual is designed for both current and older \LaTeX\ distributions.
-% \item This\Version{3.3} manual has been redesigned.
-% \item It is compatible with both A4 and US letter formats.
-% \item We mention when this manual changes package internals.
+% \item \emph{Allow:} \cmd{\ExcludeName} with an extant name.
+% \item \emph{Allow:} \cmd{\PretagName} to sort cross-references.
+% \item \emph{Allow:}\Version{3.5} \cmd{\IndexRef} with the \texttt{oldsee} option.
+% \item \emph{Ignore:} make an index page reference from an xref or excluded name.
+% \item \emph{Ignore:} make the same cross-reference multiple times.
+% \item \emph{Ignore:} use \cmd{\ExcludeName} with a cross-reference.
+% \item \emph{Ignore:} use \Version{3.3} \cmd{\IncludeName} with an xref (but \cmd{\IncludeName*} works.
+% \item \emph{Ignore:} use \cmd{\TagName} and \cmd{\UntagName} with a cross-reference.
% \end{itemize}
-% About package building:
+% \ReturnLink
+% \newpage
+%
+% \subsubsection[Debugging/Errors]{Debugging and Avoiding Errors}
+% \label{sec:Errors}
+% \medskip
+%
+% \begin{center}\bfseries Debugging Macros\end{center}
+% \DescribeMacro{\ShowPattern}
+% We use \cmd{\ShowPattern} in Section~\ref{sec:NamePatterns} to illustrate name control patterns. It displays how\Version{3.3} the name arguments create name patterns that form name control sequences. One can debug pattern collisions and other issues with this macro:
+% \begin{quote}
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\ShowPattern}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\\
+% \end{tabular}%
+% }
+% \end{quote}
+%
+% Thus, |\texttt{\ShowPattern[Hernando]{de~Soto}}| will produce the output \JustIndex\Soto\texttt{\ShowPattern[Hernando]{de~Soto}}. As we have seen above, using \textsf{inputenc}/\textsf{fontenc} will cause names like |\texttt{\ShowPattern{Boëthius}}| to produce \texttt{\ShowPattern{Boëthius}}\JustIndex\Name{Bo\"ethius}.\medskip
+%
+% \DescribeMacro{\ShowIdxPageref}
+% \cmd{\ShowIdxPageref} displays a full index entry in the text.
+% Its counterpart is \cmd{\ShowIdxPageref*},
+% \DescribeMacro{\ShowIdxPageref*}
+% which shows a short index entry. Both only show names formatted as page references, even if they are cross-references\Version{3.3}:
+% \begin{quote}
+% \fbox{
+% \begin{tabular}{l}
+% {\Large\strut}\cmd{\ShowIdxPageref\ }\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\vspace{-2pt}\\
+% {\Large\strut}\cmd{\ShowIdxPageref*}\oarg{FNN}\marg{SNN|,| Affix}\oarg{Alternate}\\
+% \end{tabular}
+% }
+% \end{quote}
+%
+% Index styles, \cmd{\PretagName}, and \cmd{\TagName} affect the output of \cmd{\ShowIdxPageref}. Active characters and macros appear as printed, not as in \texttt{idx} files. In a normal \LaTeX\ document without hyperlinks, for example, we would get:
+%
+% \begin{quote}\small
+% \StartNum
+% \begin{verbatim}
+%\PretagName[Hernando]{de~Soto}{Desoto, Hernando}
+%\texttt{\ShowIdxPageref[Hernando]{de~Soto}}\\\end{verbatim}
+%
+% \IndexActual{@}\UntagName[Hernando]{de~Soto}
+% \texttt{\ShowIdxPageref[Hernando]{de~Soto}}
+% \TagName[Hernando]{de~Soto}{\string|hyperpage}
+% \end{quote}
+%
+% Throughout this manual, \cmd{\ShowIdxPageref*} illustrates basic index entries that do not contain sorting information or tags. The simple index entry of \Name*[Hernando]{de~Soto} is |``\ShowIdxPageref*[Hernando]{de~Soto}''| ``\ShowIdxPageref*[Hernando]{de~Soto}''.
+%
+% \begin{center}\bfseries Avoiding Common Errors: General\end{center}
% \begin{itemize}
-% \item The \textsf{nameauth} package requires \textsf{etoolbox}, \textsf{suffix}, \textsf{trimspaces}, and \textsf{xargs}. The \texttt{dtx} file encoding is UTF-8; we assume Unicode support.
-% \item We tested this release in \texttt{dvi} mode (\texttt{latex} and \texttt{dvilualatex}), and in \texttt{pdf} mode (\texttt{pdflatex}, \texttt{lualatex}, and \texttt{xelatex}). We used \texttt{makeindex}.
-% \item This release has been tested on GNU/Linux (distro TL 2017 and vanilla TL 2019), and Windows (Mik\TeX, using GNU make via Cygwin.)
-% \item The release uploaded to CTAN is generated using \texttt{pdflatex} in GNU/Linux.
+% \item A missing square bracket or curly brace can cause errors like ``\texttt{Paragraph ended}'' and ``\texttt{Missing} \meta{grouping token} \texttt{inserted.}''
+% \item In the \texttt{nameauth} environment, \cmd{\<} \meta{arg1} \texttt{\&} \meta{arg2} \texttt{\&} \meta{arg3} \texttt{\&} \meta{arg4} \texttt{>}\\
+% is a macro that cannot miss a delimiter, an argument, or an ampersand.
+% \item Generally use \cmd{\noexpand} before macros in name arguments, which is required if the macros contain conditional statements.
+% \item Ensure that macros and conditionals used in name arguments are defined in the preamble or outermost scope (see below).
+% \item Do not format \meta{SNN},\meta{Affix} together as a pair. Format \meta{SNN} and \meta{Affix} separately (Section~\ref{sec:AltFormat}). The comma will segment the input into two arguments, which could cause errors.
+% \item Using \cmd{\CapThis} on a name with macros in its arguments while not using alternate formatting (Section~\ref{sec:AltFormat}) could trigger an error. Normally \cmd{\CapThis} also segments the input, which could cause errors.
+% \item Something like |\edef\foo{\CapThis\Name{bar}}| will fail. Yet one can use |\CapThis\Name{bar}| as an argument to a macro defined with either \cmd{\edef} or \cmd{\xdef}.
+% \item In \texttt{dtx} files, put the \texttt{nameauth} environment and tags in the \texttt{<driver>} section preamble that inputs the \texttt{dtx} file as documentation.
+% \item \cmd{\Name\ }\oarg{FNN}\marg{SNN}\texttt{[\cmd{\ignorespaces}]} prints only \meta{SNN}.\\
+% \cmd{\Name*}\oarg{FNN}\marg{SNN, Affix}\texttt{[\cmd{\ignorespaces}]} prints \meta{SNN} \meta{Affix}.\\
+% \cmd{\FName}\oarg{FNN}\marg{SNN}\texttt{[\cmd{\ignorespaces}]} either prints \meta{SNN}\\
+% \hbox{}\qquad or acts like the macro \cmd{\leavevmode}.\\
+% \cmd{\Name\ }\marg{SNN, Affix}\texttt{[\cmd{\ignorespaces}]} prints only \meta{SNN}^^A
+% \texttt{\textvisiblespace}.\\
+% \cmd{\FName}\marg{SNN, Affix}\texttt{[\cmd{\ignorespaces}]} either prints \meta{SNN}^^A
+% \texttt{\textvisiblespace}\\
+% \hbox{}\qquad or acts like the macros \cmd{\leavevmode}\cmd{\space}.
+% \end{itemize}
+%
+% \begin{center}\bfseries Avoiding Common Errors: Indexing\end{center}
+% \begin{itemize}
+% \item Be sure to define all \textit{see} references with \cmd{\IndexRef} \emph{before} making any \cmd{\Name} references to them. Otherwise \cmd{\IndexRef} will generate a warning that it could not create a \textit{see} reference.
+% \item Be sure to define all \textit{see also} references with \cmd{\SeeAlso}\cmd{\IndexRef} \emph{after} making all needed \cmd{\Name} references to the respective names. Otherwise \cmd{\IndexName} and the naming macros will not create page references to the respective \cmd{\Name} thereafter.
+% \item Two names may look identical on the page, but their internal name patterns can differ (Sections~\ref{sec:IndexSort} and~\ref{sec:NamePatterns}). This will create spurious index entries. Check the \texttt{idx} file and possibly use (below).
+% \item To fix spurious entries, compare index entries with names in the text.
+% \begin{itemize}
+% \item Check if naming macros always use the same arguments.
+% \item Check sorting tags (\cmd{\PretagName} (Section~\ref{sec:IndexSort}).
+% \item Check use of active Unicode characters (Section~\ref{sec:Unicode}).
+% \item Use \cmd{\ShowPattern} and \cmd{\ShowIdxPageref} (below).
+% \item Check if macros in name arguments did not follow \cmd{\noexpand}.
+% \end{itemize}
+% \item Check \textsf{nameauth} package warnings. Set the \texttt{verbose} option, which will offer a number of ``informational'' warnings that could be of assistance with the index.
+% \end{itemize}
+%
+% \begin{center}\bfseries Macros in Name Arguments\end{center}
+% \begin{itemize}
+% \item Use alternate formatting to avoid potential problems, especially when using \cmd{\CapThis} (Sections~\ref{sec:AltFormat}, \ref{sec:Hooksiii}).
+% \item Use \cmd{\noexpand}\meta{macro} in name macro arguments as a best practice. This is required for all such macros that contain conditional statements.
+% \item Macros used in name arguments must be defined either in the preamble or in the outermost document environment scope to avoid \texttt{Undefined control sequence} errors.
+% \item Boolean flags (\texttt{\textbackslash if}\meta{flag}) used in formatting hooks must be defined either in the preamble or in the outermost document scope.
+% \item The \cmd{\global} modifier does not work with \cmd{\newif} and \cmd{\newcommand}.\footnote{See \href{https://tex.stackexchange.com/questions/51733/global-renewcommand-equivalent-of-global-def}{this page} on redefining \cmd{\newcommand}, with the caveats that apply.}
+% Yet \cmd{\global} can precede a macro defined with \cmd{\newcommand}, and the first \cmd{\def} used therein may be global.
+% \end{itemize}
+%
+% \textit{The \TeX book}, pages 275--277, shows what \cmd{\global} can and cannot do. In the following example, we declare a Boolean flag and a macro in the outer scope, then make several declarations and assignments in the inner scope. After the inner scope ends, we test to see what has happened:
+%
+% \newif\ifCondA
+% \newcommand\MacroA{}
+% \begingroup^^A Demo local scope
+% \newif\ifCondB
+% \global\newif\ifCondC
+% \global\newcommand\MacroB{}
+% \newcommand\MacroC{\def\MacroD{}}
+% \global\MacroC
+% \global\CondAtrue
+% \endgroup^^A Demo local scope
+% \begin{quote}\small
+% \StartNum
+% \begin{verbatim}
+%\newif\ifCondA
+%\newcommand\MacroA{}
+%\begingroup
+% \newif\ifCondB
+% \global\newif\ifCondC
+% \global\newcommand\MacroB{}
+% \newcommand\MacroC{\def\MacroD{}}
+% \global\MacroC
+% \global\CondAtrue
+%\endgroup\end{verbatim}
+% \end{quote}
+%
+%\begin{itemize}
+% \item \ifdefined\CondAtrue \texttt{\textbackslash ifCondA} is defined \else \texttt{\textbackslash ifCondA} is not defined \fi in the outer scope (outer definition).
+% \item \ifdefined\MacroA \cmd{\MacroA} is \else \cmd{\MacroA} is not \fi defined in the outer scope (outer definition).
+% \item \ifdefined\CondBtrue \texttt{\textbackslash ifCondB} is defined \else \texttt{\textbackslash ifCondB} is not defined \fi in the outer scope (local definition).
+% \item \ifdefined\CondCtrue \texttt{\textbackslash ifCondC} is defined \else \texttt{\textbackslash ifCondC} is not defined \fi in the outer scope (no \cmd{\global}\cmd{\newif}).
+% \item \ifdefined\MacroB \cmd{\MacroB} is defined \else
+% \cmd{\MacroB} is not defined \fi in the outer scope (no \cmd{\global}\cmd{\newcommand}).
+% \item \cmd{\MacroC} \ifdefined\MacroC is defined \else is not defined \fi in the outer scope (local definition).
+% \item \cmd{\MacroD} \ifdefined\MacroD is defined \else is not defined \fi in the outer scope (\cmd{\global} affects \cmd{\def} in \cmd{\MacroC}).
+% \item \ifCondA \texttt{\textbackslash ifCondA} is true \else \texttt{\textbackslash ifCondA} is false \fi (\cmd{\global} assignment works, not instantiation).
% \end{itemize}
+%
+% Any macro that is used in the argument of a naming macro must be defined in all scopes in which that name is used. Below we deactivate indexing and show this:
+% \begin{quote}\small
+% \IndexInactive
+% \StartNum
+% \begin{verbatim}
+%\begin{nameauth}
+% \< Testi & & \noexpand\TESTi & >
+% \< Testii & & \noexpand\TESTii & >
+%\end{nameauth}
+%\def\TESTi{Test One}
+%\indent \hbox to 10em{(Outer 1) \Testi\hfill}
+%\bgroup
+% (Inner 1) \Testi\\
+% \def\TESTii{Test Two}
+% \hbox to 10em{(Inner 2) \Testii\hfill}
+%\egroup
+%(Outer 2) \unless\ifdefined\TESTii \cmd{\TESTii} undefined\fi\end{verbatim}
+%
+%\begin{nameauth}
+% \< Testi & & \noexpand\TESTi & >
+% \< Testii & & \noexpand\TESTii & >
+%\end{nameauth}
+%\def\TESTi{Test One}
+%\indent \hbox to 10em{(Outer 1) \Testi\hfill}
+%\bgroup
+% (Inner 1) \Testi\\
+% \def\TESTii{Test Two}
+% \hbox to 10em{(Inner 2) \Testii\hfill}
+%\egroup
+%(Outer 2) \unless\ifdefined\TESTii \cmd{\TESTii} undefined\fi
+% \end{quote}
+
+% \ReturnLink
% \newpage
+%
+% \subsubsection{Obsolete Syntax}
+% \label{sec:Obsolete}
+%
+% This non-Western syntax limits alternate names and xrefs, excludes comma-delimited names, and complicates indexing. It is a ghost of \textsf{nameauth} past.
+% \begin{quote}
+% \fbox{
+% \begin{tabular}{ll}
+% {\Large\strut}\cmd{\Name}\marg{SNN}\oarg{Alternate} & \color{nared}\texttt{\%} \textit{obsolete syntax}\\
+% \end{tabular}
+% }
+% \end{quote}
+%
+% \begin{itemize}
+% \item One must \emph{leave empty} the first optional \meta{FNN} argument.
+% \item One must \emph{never} use the comma-delimited argument \meta{SNN, Affix}.
+% \item Instead, these names \emph{always} use the final optional \meta{Alternate} argument, which acts like \meta{Affix} and affects both name and index patterns (Section~\ref{sec:NamePatterns}).
+% \item These names take the form \meta{SNN Alternate} in the index.
+% \end{itemize}
+% In this manual we designate these names with a double dagger (\ddag):
+%
+% \begin{quote}\small\MyStretch
+% |\Name{Henry}[VIII] | {\color{nared}|%| \textit{Ancient}}\\
+% |\Name{Chiang}[Kai-shek] | {\color{nared}|%| \textit{Eastern}}\\
+% |\begin{nameauth}|\\
+% | \< Dagb & & Dagobert & I > | {\color{nared}|%| \textit{Ancient}}\\
+% | \< Yosh & & Yoshida & Shigeru > | {\color{nared}|%| \textit{Eastern}}\\
+% | \< OFukuyama & & |\\
+% | \textUC{Fukuyama} & Takeshi > | {\color{nared}|%| \textit{Alt. format}}\\
+% |\end{nameauth}|
+% \end{quote}
+%
+% \begin{center}\small\PatInfo{\ShowPattern{Henry}[VIII]!MN\break \ShowPattern{Chiang}[Kai-shek]!MN\break \ShowPattern{Dagobert}[I]!MN\break \ShowPattern{Yoshida}[Shigeru]!MN}\MyStretch
+% \begin{tabular}{ll}\toprule
+% |\ForgetThis\Name{Henry}[VIII]| & \ForgetThis\Name{Henry}[VIII]\ddag\\
+% |\Name{Henry}[VIII]| & \Name{Henry}[VIII]\ddag\\
+% \rowcolor{grey}^^A
+% |\ForgetThis\Name{Chiang}[Kai-shek]| & \ForgetThis\Name{Chiang}[Kai-shek]\ddag\\
+% \rowcolor{grey}^^A
+% |\Name{Chiang}[Kai-shek]| & \Name{Chiang}[Kai-shek]\ddag\\
+% |\Dagb| & \Dagb\ddag\\
+% |\Dagb| & \Dagb\ddag\\
+% \rowcolor{grey}|\CapName\Yosh| & \CapName\Yosh\ddag\\
+% \rowcolor{grey}|\CapName\RevName\LYosh| & \CapName\RevName\LYosh\ddag\\
+% |\AltFormatActive| \AltFormatActive\\
+% |\ForgetThis\OFukuyama| & \ForgetThis\OFukuyama\ddag\\
+% |\OFukuyama| & \OFukuyama\ddag\\
+% |\AltFormatInactive| \AltFormatInactive\\\bottomrule
+% \end{tabular}
+% \end{center}
+%
+% Regardless of its flaws,\Version{2.6} the obsolete syntax shares name patterns, index tags, text tags, and index entries with the current syntax:
+% \begin{quote}\small\MyStretch
+% \begin{tabular}{@{}lll}
+% Obsolete syntax: & \cmd{\ForgetThis}\cmd{\Name\{Henry\}[VIII]} & \ForgetThis\Name{Henry}[VIII]\ddag\\
+% Current syntax: & \cmd{\Name\{Henry, VIII\}} & \Name{Henry, VIII}\\
+% \end{tabular}
+% \end{quote}
+%
+% \ReturnLink
+% \bigskip
+%
+% \subsubsection[Name Patterns]{Name Pattern Overview}
+% \label{sec:NamePatterns}
+%
+% The table below shows how the macro arguments generate name patterns central to \textsf{nameauth}. The \meta{Alternate} argument only affects patterns when using the obsolete syntax. The naming macro arguments create internal control sequences that affect names in both the text and the index:\medskip
+% \begin{center}\MyStretch
+% \begin{tabular}{lll}\toprule
+% Macro Arguments & Patterns & Type\\\midrule
+% \rowcolor{grey}\oarg{FNN}\marg{SNN} & \meta{FNN}!\meta{SNN} & \normalfont Western\\
+% \oarg{FNN}\marg{SNN, Affix} & \meta{FNN}!\meta{SNN},\meta{Affix} & \normalfont Western\\
+% \rowcolor{grey}\hphantom{\oarg{FNN}}\marg{SNN, Affix} & \meta{SNN},\meta{Affix} & \normalfont non-Western\\
+% \hphantom{\oarg{FNN}}\marg{SNN}\oarg{Alt} & \meta{SNN},\meta{Alt} & \normalfont obsolete\\
+% \rowcolor{grey}\hphantom{\oarg{FNN}}\marg{SNN} & \meta{SNN} & \normalfont non-Western\\\bottomrule
+% \end{tabular}
+% \end{center}\medskip
+%
+% The internal parser \cmd{\@nameauth@Parse} determines the type of name through the presence or absence of certain arguments. Then it assigns name control sequences keyed to the type of name pattern and the current naming system. Other macros do similar tasks with name control sequences associated with other data sets.
%
-% \subsubsection{Active Unicode}
-% \label{sec:Unicode}
+% First we show name patterns generated from name elements and the type of name. ``Non-native'' Eastern names are marked by a dagger (\dag); names that use the obsolete syntax are marked by a double dagger (\ddag).\medskip
+% \begin{center}\footnotesize\MyStretch
+% \begin{tabular}{rll}\toprule
+% Macro & Body Text & \cmd{\ShowPattern}\\\midrule
+% \rowcolor{grey}\cmd{\ForgetThis}\cmd{\Harnack[Adolf von]} & \ForgetThis\Harnack[Adolf von] & \texttt{\ShowPattern[Adolf]{Harnack}}\\
+% \rowcolor{grey}\cmd{\LHarnack} & \LHarnack & \texttt{\ShowPattern[Adolf]{Harnack}}\\
+% \cmd{\ForgetThis}\cmd{\Pat} & \ForgetThis\Pat & \texttt{\ShowPattern[George S.]{Patton, Jr.}}\\
+% \cmd{\DropAffix}\cmd{\LPat} & \DropAffix\LPat & \texttt{\ShowPattern[George S.]{Patton, Jr.}}\\
+% \rowcolor{grey}\cmd{\ForgetThis}\cmd{\Noguchi} & \ForgetThis\Noguchi & \texttt{\ShowPattern[Hideyo]{Noguchi}}\\
+% \rowcolor{grey}\cmd{\RevName}\cmd{\LNoguchi} & \RevName\LNoguchi\dag & \texttt{\ShowPattern[Hideyo]{Noguchi}}\\
+% \cmd{\ForgetThis}\cmd{\Yamt} & \ForgetThis\Yamt & \texttt{\ShowPattern{Yamamoto,Isoroku}}\\
+% \cmd{\RevName}\cmd{\LYamt} & \RevName\LYamt & \texttt{\ShowPattern{Yamamoto,Isoroku}}\\
+% \rowcolor{grey}\cmd{\ForgetThis}\cmd{\Name\{Henry,VIII\}} & \ForgetThis\Name{Henry,VIII} & \texttt{\ShowPattern{Henry,VIII}}\\
+% \rowcolor{grey}\cmd{\Name*\{Henry\}[VIII]} & \Name*{Henry}[VIII]\ddag & \texttt{\ShowPattern{Henry,VIII}}\\
+% \cmd{\ForgetThis}\cmd{\Dem[I Soter]} & \ForgetThis\Dem[I Soter] & \texttt{\ShowPattern{Demetrius,I}}\\
+% \cmd{\LDem} & \LDem & \texttt{\ShowPattern{Demetrius,I}}\\
+% \rowcolor{grey}\cmd{\ForgetThis}\cmd{\Aris} & \ForgetThis\Aris & \texttt{\ShowPattern{Aristotle}}\\
+% \rowcolor{grey}\cmd{\Aris} & \Aris & \texttt{\ShowPattern{Aristotle}}\\\bottomrule
+% \end{tabular}
+% \ForgetName{Demetrius, I}\ForgetName[Adolf]{Harnack}
+% \end{center}\medskip
+%
+% \noindent Six suffixes are appended to these patterns to create independent data sets:\medskip
+% \begin{center}\small\MyStretch
+% \begin{tabular}{llll}\toprule
+% Description & Pattern & Mnemonic & Example\\\midrule
+% \rowcolor{grey}Front-matter names & \meta{pattern}\texttt{!NF} & ``name front'' & \texttt{\ShowPattern[Adolf]{Harnack}{!NF}}\\
+% Main-matter names & \meta{pattern}\texttt{!MN} & ``main name'' & \texttt{\ShowPattern[Hideyo]{Noguchi}{!MN}}\\
+% \rowcolor{grey}Index cross-refs & \meta{pattern}\texttt{!PN} & ``pseudonym'' & \texttt{\ShowPattern{Yamamoto, Isoroku}{!PN}}\\
+% Index sorting tags & \meta{pattern}\texttt{!PRE} & ``pretag'' & \texttt{\ShowPattern{Henry, VIII}{!PRE}}\\
+% \rowcolor{grey}Index info tags & \meta{pattern}\texttt{!TAG} & ``tag'' & \texttt{\ShowPattern{Demetrius, I}{!TAG}}\\
+% ``Text tag'' database & \meta{pattern}\texttt{!DB} & ``database'' & \texttt{\ShowPattern{Aristotle}{!DB}}\\\bottomrule
+% \end{tabular}
+% \end{center}
+% \newpage
+%
+% \noindent The following macros \emph{write} to these data sets; others also can read from them:
+% \begin{center}\small\MyStretch
+% \begin{tabular}{lcccccc}\toprule[1pt]
+% Macros & \ttfamily \,!NF\, & \ttfamily \,!MN\, & \ttfamily \,!PN\, & \ttfamily !PRE & \ttfamily !TAG & \ttfamily \,!DB\,\\\midrule
+% \cmd{\Name} \cmd{\Name*} \cmd{\FName} & \YES & \YES & \NO & \NO & \NO & \NO\\
+% \cmd{\ForgetName} \cmd{\SubvertName} & \YES & \YES & \NO & \NO & \NO & \NO\\\midrule
+% \cmd{\PName}\cmd{\PName*} & \YES & \YES & \YES & \NO & \NO & \NO\\\midrule
+% \cmd{\AKA} \cmd{\AKA*} \cmd{\IndexRef} & \NO & \NO & \YES & \NO & \NO & \NO\\
+% \cmd{\ExcludeName} & \NO & \NO & \YES & \NO & \NO & \NO\\
+% \cmd{\IncludeName} \cmd{\IncludeName*} & \NO & \NO & \YES & \NO & \NO & \NO\\\midrule
+% \cmd{\PretagName} & \NO & \NO & \NO & \YES & \NO & \NO\\\midrule
+% \cmd{\TagName} \cmd{\UntagName} & \NO & \NO & \NO & \NO & \YES & \NO\\\midrule
+% \cmd{\NameAddInfo} \cmd{\NameClearInfo} & \NO & \NO & \NO & \NO & \NO & \YES\\\bottomrule
+% \end{tabular}
+% \end{center}\leavevmode
%
-% With |\usepackage[T1]{fontenc}| we can use many active Unicode characters automatically.\footnote{As of release, most documents typeset with \texttt{latex} and \texttt{pdflatex} do not require explicit loading of either \textsf{inputenc} or \textsf{inputenx}.}
-% We already covered using \cmd{\PretagName} to sort names with these characters (Section~\ref{sec:IndexSort}).
-% Below we group by accents and diacritical marks:
+% \ReturnLink
%
-% \begin{center}\small\setstretch{1.4}
+% \subsubsection[Active Unicode]{Active Unicode Characters}
+% \label{sec:Unicode}
+%
+% \leavevmode\begin{center}\bfseries General Information\end{center}
+% Below we group characters by accents and diacritical marks:
+% \begin{center}\large\setstretch{1.3}
% \def\Bullet#1{\setbox0\hbox{#1}\raise 0.4ex\hbox to\wd0{\hfil\tiny\textbullet\hfil}}
% \def\bullet#1{\setbox0\hbox{#1}\raise 0.2ex\hbox to\wd0{\hfil\tiny\textbullet\hfil}}
% \begin{tabular}{lll}\toprule
-% acute & Á Ć É Ǵ \Bullet{H} Í Ĺ Ń Ó Ŕ Ś Ú Ý Ź & á ć é ǵ \bullet{h} í ĺ ń ó ŕ ś ú ý ź \strut\\
-% \rowcolor{black!7!white}grave & À \Bullet{C} È \Bullet{G} \Bullet{H} Ì Ò Ù & à \bullet{c} è \bullet{g} \bullet{h} ì ò ù \strut\\
+% acute & Á Ć É Ǵ \Bullet{H} Í Ĺ & á ć é ǵ \bullet{h} í ĺ \strut\\
+% & Ń Ó Ŕ Ś Ú Ý Ź & ń ó ŕ ś ú ý ź \strut\\
+% \rowcolor{grey}grave & À \Bullet{C} È \Bullet{G} \Bullet{H} Ì Ò Ù & à \bullet{c} è \bullet{g} \bullet{h} ì ò ù \strut\\
% circumflex & Â Ĉ Ê Ĝ Ĥ Î Ĵ Ô Ŝ Û Ŵ Ŷ & â ĉ ê ĝ ĥ î ĵ ô ŝ û ŵ ŷ \strut\\
-% \rowcolor{black!7!white}tilde & Ã \Bullet{C} \Bullet{E} \Bullet{G} \Bullet{H} Ĩ Ñ Õ Ũ & ã \bullet{c} \bullet{e} \bullet{g} \Bullet{h} ĩ ñ õ ũ \strut\\
+% \rowcolor{grey}tilde & Ã \Bullet{C} \Bullet{E} \Bullet{G} \Bullet{H} Ĩ Ñ Õ Ũ & ã \bullet{c} \bullet{e} \bullet{g} \Bullet{h} ĩ ñ õ ũ \strut\\
% diaresis\footnotemark & Ä \Bullet{C} Ë \Bullet{G} \Bullet{H} Ï Ö Ü Ÿ & ä \bullet{c} ë \bullet{g} \bullet{h} ï ö ü ÿ \strut\\
-% \rowcolor{black!7!white}cedilla & \Bullet{A} Ç \Bullet{E} Ģ Ķ Ļ Ņ Ŗ Ş Ţ & \bullet{a} ç \bullet{e} ģ ķ ļ ņ ŗ ş ţ \strut\\
+% \rowcolor{grey}cedilla & \Bullet{A} Ç \Bullet{E} Ģ Ķ Ļ Ņ Ŗ Ş Ţ & \bullet{a} ç \bullet{e} ģ ķ ļ ņ ŗ ş ţ \strut\\
% macron & Ā \Bullet{C} Ē Ḡ \Bullet{H} Ī Ō Ū Ǣ Ȳ & ā \bullet{c} ē ḡ \bullet{h} ī ō ū ǣ ȳ \strut\\
-% \rowcolor{black!7!white}breve & Ă \Bullet{C} \Bullet{E} Ğ \Bullet{H} Ĭ Ŏ Ŭ & ă \bullet{c} \bullet{e} ğ \bullet {h} ĭ ŏ ŭ \strut\\
-% dot\,/\,dotless & Ḃ Ċ Ė Ġ \Bullet{H} İ Ż & ḃ ċ ė ġ \bullet{h} ı ż \strut\\
-% \rowcolor{black!7!white}ogonek & Ą \Bullet{C} Ę \Bullet{G} \Bullet{H} Į Ǫ Ų & ą \bullet{c} ę \bullet{g} \bullet{h} į ǫ ų \strut\\
-% caron & Ǎ Č Ď Ě Ǧ Ǐ Ǩ Ľ Ň Ǒ Ř Š Ť Ǔ Ž & ǎ č ď ě ǧ ǐ ǰ ǩ ľ ň ǒ ř š ť ǔ ž \strut\\
-% \rowcolor{black!7!white}various & Å Æ Ð (eth) Đ (stroke) IJ\ Ł Ŋ & å æ ð đ ij\ ł ŋ \strut\\
-% \rowcolor{black!7!white} & Ø Œ Ő Ů Ű Ș Ț Þ & ø œ ő ů ű ș ß ț þ \strut\\\bottomrule
+% \rowcolor{grey}breve & Ă \Bullet{C} \Bullet{E} Ğ \Bullet{H} Ĭ Ŏ Ŭ & ă \bullet{c} \bullet{e} ğ \bullet {h} ĭ ŏ ŭ \strut\\
+% dot/dotless & Ḃ Ċ Ė Ġ \Bullet{H} İ Ż & ḃ ċ ė ġ \bullet{h} ı ż \strut\\
+% \rowcolor{grey}ogonek & Ą \Bullet{C} Ę \Bullet{G} \Bullet{H} Į Ǫ Ų & ą \bullet{c} ę \bullet{g} \bullet{h} į ǫ ų \strut\\
+% caron & Ǎ Č Ď Ě Ǧ Ǐ Ǩ Ľ & ǎ č ď ě ǧ ǐ ǰ ǩ ľ \strut\\
+% & Ň Ǒ Ř Š Ť Ǔ Ž & ň ǒ ř š ť ǔ ž \strut\\
+% \rowcolor{grey}various & Å Æ Ð (eth) Đ (stroke) IJ\ Ł & å æ ð đ ij\ ł \strut\\
+% \rowcolor{grey} & Ŋ Ø Œ Ő Ů Ű Ș Ț Þ & ŋ ø œ ő ů ű ș ß ț þ \strut\\\bottomrule
% \end{tabular}
% \footnotetext{A diaresis mark is one way to indicate an umlaut, a sound change. German originally used a superscript \textsf{e} over \textsf{a}, \textsf{o}, and \textsf{u}. The cursive form of \textsf{e} simplified to a diaresis mark in the 1800s. A diaresis mark also signals a diaresis: reading a diphthong as two monophthongs.}
% \end{center}
-%
-% Additional Unicode characters can be made available when using fonts with TS1 glyphs (pages 455--463 in \textit{The Latex Companion}). Compare the list: \url{http://tug.ctan.org/info/symbols/comprehensive/} or \texttt{texdoc comprehensive}.
+% \newpage
+%
+% With |\usepackage[T1]{fontenc}|, \texttt{latex} and \texttt{pdflatex} can use many active Unicode characters automatically. Use \cmd{\PretagName} to sort names with these characters (Section~\ref{sec:IndexSort}). Currently, most documents typeset with \texttt{latex} and \texttt{pdflatex} do not require explicit loading of either \textsf{inputenc} or \textsf{inputenx}.
+%
+% Additional Unicode characters can be made available when using fonts with TS1 glyphs (pages 455--463 in \textit{The Latex Companion}). Compare the list on \href{http://tug.ctan.org/info/symbols/comprehensive/}{this page} or type \texttt{texdoc comprehensive} in a terminal window.
+%
+% Active Unicode characters work much like macros. When using a font with TS1 glyphs and slots, the following preamble snippet is an example of how one might add more Unicode characters, such as a long s (\textit{s-medialis}):
%
-% When using a font with TS1 glyphs and slots, the following preamble snippet lets one add more Unicode characters. That enables one to write, ``In Congreſs, July 4, 1776'' as |``In Congreſs, July 4, 1776''|:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -4772,12 +5744,25 @@ the README.txt or README for more information.
%\usepackage{newunicodechar}
%\DeclareTextSymbolDefault{\textlongs}{TS1}
%\DeclareTextSymbol{\textlongs}{TS1}{115}
-%\newunicodechar{ſ}{\textlongs}\end{verbatim}
+%\newunicodechar{ſ}{\textlongs}
+%
+%In Congreſs, July 4, 1776\end{verbatim}
+%
+%In Congreſs, July 4, 1776
% \end{quote}
-%
+%
% Many\Warn{} Unicode characters have native support in \texttt{xelatex} and \texttt{lualatex}, but not in \texttt{pdflatex}. Yet the latter has certain features (e.g., with respect to \textsf{microtype}) that others lack. The features of \texttt{makeindex} do not always equate to those in \texttt{xindy}. Those differences impact design choices.
%
-% Before\Warn{} 2018, some index styles excluded characters with macrons, e.g., \textsf{ā}. Even now, control sequences like \cmd{\=a} in the index create undocumented behavior when using \texttt{makeindex} and \texttt{gind.ist}, which changes the ``actual'' character from~\texttt{@} to~\texttt{=}. Since 2018, names like \ifPDFTeX\IfFileExists{utf8-2018.def}{\Name{Ghazāli}}{\Name{Ghazali}}\else\Name{Ghazāli}\fi\ work properly due to new Unicode conventions. We allow for backward compatibility using the \textsf{iftex} package thus:
+% \begin{center}\bfseries Compatibility: Old and New\end{center}
+% As mentioned\Warn{} in Section~\ref{sec:IndexSort}, before 2018, some index styles could not work with characters that contained macrons:
+% \begin{center}\large
+% \begin{tabular}{ll}
+% Ā Ē Ḡ Ī Ō Ū Ǣ Ȳ & ā ē ḡ ī ō ū ǣ ȳ\\
+% \end{tabular}
+% \end{center}
+% Since 2018, those restrictions have been removed due to better handling of Unicode characters in \texttt{latex} and \texttt{pdflatex}.
+%
+% If compiled on a recent version of \LaTeX, one will see a macron in the name below. To allow the manual to compile on older versions, the following code prints a version without the macron as needed:
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -4786,41 +5771,46 @@ the README.txt or README for more information.
% {\Name{Ghazāli}}{\Name{Ghazali}}%
% \else\Name{Ghazāli}%
%\fi\end{verbatim}
+%
+%\ifPDFTeX^^A
+% \IfFileExists{utf8-2018.def}^^A
+% {\Name{Ghazāli}}{\Name{Ghazali}}^^A
+% \else\Name{Ghazāli}\fi
% \end{quote}
%
+% Even now,\Warn{} although one can use the Unicode characters with macrons, control sequences like \cmd{\=a} in the index will cause undocumented behavior when using \texttt{makeindex} and \texttt{gind.ist}. The latter index style, used for \texttt{dtx} files, changes the ``actual'' character from~\texttt{@} to~\texttt{=}.
+% \newpage
+%
+% \begin{center}\bfseries Fragility of Active Unicode\end{center}
% \TeX\Warn{} macros that partition their arguments can break active Unicode characters. Consider the simple macro |\def\foo#1#2#3!{<#1#2><#3>}|. It takes three undelimited arguments and groups the first two, then the third:
%
% \begin{center}\MyStretch
% \def\foo#1#2#3!{<#1#2><#3>}
% \begin{tabular}{llll}\toprule
% Argument & Macro & Engine & Result\\\midrule
-% |abc| & |\foo abc!| & (any) & \foo abc!\\
-% |{æ}bc| & |\foo {æ}bc!| & (any) & \foo {æ}bc!\\
-% |\ae bc| & |\foo \ae bc!| & (any) & \foo \ae bc!\\
-% \rowcolor{black!7!white}|æbc| & |\foo æbc!| & \texttt{xelatex} & \ifxetex\foo æbc!\else<æb><c>\fi\\
-% \rowcolor{black!7!white}|æbc| & |\foo æbc!| & \texttt{lualatex} & \ifluatex\foo æbc!\else<æb><c>\fi\\
-% |æbc| & |\foo æbc!| & \texttt{pdflatex} & \unless\ifxetex\unless\ifluatex\foo æbc!\else<æ><bc>\fi\else<æ><bc>\fi\\
-% |æbc| & |\foo æbc!| & \texttt{latex} & \unless\ifxetex\unless\ifluatex\foo æbc!\else<æ><bc>\fi\else<æ><bc>\fi\\\bottomrule
+% \rowcolor{grey}|abc| & |\foo abc!| & (any) & \foo abc!\\
+% \rowcolor{grey}|{æ}bc| & |\foo {æ}bc!| & (any) & \foo {æ}bc!\\
+% \rowcolor{grey}|\ae bc| & |\foo \ae bc!| & (any) & \foo \ae bc!\\
+% |æbc| & |\foo æbc!| & \texttt{xelatex} & \ifxetex\foo æbc!\else<æb><c>\fi\\
+% |æbc| & |\foo æbc!| & \texttt{lualatex} & \ifluatex\foo æbc!\else<æb><c>\fi\\
+% \rowcolor{grey}|æbc| & |\foo æbc!| & \texttt{pdflatex} & \unless\ifxetex\unless\ifluatex\foo æbc!\else<æ><bc>\fi\else<æ><bc>\fi\\
+% \rowcolor{grey}|æbc| & |\foo æbc!| & \texttt{latex} & \unless\ifxetex\unless\ifluatex\foo æbc!\else<æ><bc>\fi\else<æ><bc>\fi\\\bottomrule
% \end{tabular}
% \end{center}
%
% The letter \texttt{a} is one argument. Since \texttt{\{æ\}} is in a group, it is one argument. The macro \cmd{\ae} also is one argument. Thus, the first two glyphs are grouped together in |#1#2| and \texttt{c} is left by itself in |#3|. Both \texttt{xelatex} and \texttt{lualatex} likewise treat the Unicode letter \texttt{æ} as one argument.
-%
+%
% In \texttt{latex} and \texttt{pdflatex}, however, \texttt{æ} is an active Unicode control sequence that uses two arguments: |#1#2|. The tail of the input, \texttt{bc}, is crowded into |#3|. Any macro where this |#1#2| pair is divided into |#1| and |#2| will produce one of two errors: \texttt{Unicode char \dots not set up for LaTeX} or \texttt{Argument of \textbackslash UTFviii@two@octets has an extra \}}.
%
+% \begin{center}\bfseries Testing for Fragility\end{center}
% We\Version{3.0} test if \cmd{\Umathchar} is not defined. If so, we check if the leading token of the argument matches the start of an active Unicode control sequence: If \cmd{\@car}\meta{test}\cmd{\@nil} is equal to \cmd{\@car ß}\cmd{\@nil} (page~\pageref{page:CapSystem}) we capitalize |#1#2|, otherwise just |#1|. Should |#1| be a protected macro or something that does not expand to a sequence of letters, we use alternate formatting and \cmd{\AltCaps} (Section~\ref{sec:AltAdvanced}).
%
-% A\Warn{} macro defined like |\edef\foo{\CapThis\Name{bar}}| will fail. However, |\CapThis\Name{bar}| can be an argument to a macro defined with \cmd{\edef} or \cmd{\xdef}.
-%
-% \LaTeX\Warn{} removes spaces between undelimited macro arguments, except the trailing argument. We use \cmd{\trim@spaces} to address this in \textsf{nameauth}. Explicit spacing macros change the results, but also require sorting with \cmd{\PretagName}. See also Sections~\ref{sec:ErrorProt} and~\ref{sec:NameParticles}, as well as Section~\ref{sec:IndexSort}.
-%
% \ReturnLink
-% \newpage
-%
+%
% \subsubsection{\LaTeX\ Engines}
% \label{sec:TeXengines}
-%
-% The following preamble snippet lets one build \textsf{nameauth} also with older TL versions. We do not load \texttt{iftex.sty} if it does not exist. We load the transitional packages when \textsf{iftex} is absent or older than 2019:\footnote{A copy of this example is in \texttt{examples.tex}, collocated with this manual.}
+%
+% This preamble snippet lets us build \textsf{nameauth}, e.g., on TL 2017. We load \texttt{iftex.sty} only if it exists. We load transitional packages when \textsf{iftex} is absent or old:\footnote{A copy of this example is in \texttt{examples.tex}, located with this manual.}
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -4832,17 +5822,21 @@ the README.txt or README for more information.
%\fi\end{verbatim}
% \end{quote}
%
-% Next we test for the \LaTeX\ engine and include packages accordingly. We could just include \textsf{inputenc} either way, but we are illustrating a point about testing. Some statements below should be modified, depending on one's workflow.
+% If we
+% Next we test for the \LaTeX\ engine and include packages accordingly. We could just include \textsf{inputenc} either way, but we are illustrating a point about testing.
+%
+% Some statements below should be modified at need. The font packages do affect \textsf{nameauth} indirectly. The use of \textit{TikZ} does not, but it is easy to let such concerns also use the test below. With \textsf{fontspec}, Latin Modern is the default. Otherwise, Computer Modern is the default. If we \emph{only} make \texttt{pdf} documents, the test below simplifies to a test for for \cmd{\Umathchar}, then loading either \textsf{fontspec} (success) or \textsf{fontenc} (failure).
+%
% \begin{quote}\small
% \ContinueNum
% \begin{verbatim}
-%\newif\ifDoTikZ % Perhaps not needed
+%\newif\ifDoTikZ % If dvi-only workflow
%\ifxetex
% \usepackage{fontspec}
% \usepackage{polyglossia}
% \setdefaultlanguage{american} % Use own language
% \usepackage{tikz}
-% \DoTikZtrue % Perhaps not needed
+% \DoTikZtrue % If dvi-only workflow
%\else
% \ifluatex
% \ifpdf
@@ -4850,7 +5844,7 @@ the README.txt or README for more information.
% \usepackage{polyglossia}
% \setdefaultlanguage{american} % Use own language
% \usepackage{tikz}
-% \DoTikZtrue % Perhaps not needed
+% \DoTikZtrue % If dvi-only workflow
% \else
% \IfFileExists{utf8-2018.def}{}
% {\usepackage[utf8]{inputenc}}
@@ -4865,26 +5859,39 @@ the README.txt or README for more information.
% \usepackage[TS1,T1]{fontenc}
% \usepackage[american]{babel} % Use own language
% \usepackage{lmodern}
-% \ifpdf % Perhaps not needed
-% \usepackage{tikz}
-% \DoTikZtrue % Perhaps not needed
+% \ifpdf
+% \usepackage{tikz} % If dvi-only workflow
+% \DoTikZtrue % If dvi-only workflow
% \fi
% \fi
%\fi\end{verbatim}
% \end{quote}
+%
+% To avoid problems, \texttt{\textbackslash ifDoTikZ} can help one conditionally load \textit{TikZ}. One can observe some \texttt{dvi} viewers (e.g., \texttt{yap}, \texttt{dviout}) crash either when loading or at some later point if one loads \textit{TikZ}. Neither \texttt{xdvi} nor \texttt{advi} crash.
+%
+% Using \texttt{xdvi} or \texttt{advi} (from \href{http://cristal.inria.fr/whizzytex/}{Whizzy\TeX}) may result in certain aspects of \textit{TikZ} not rendering correctly until conversion to \texttt{ps}/\texttt{pdf}. Using either \texttt{dvipdf} or \texttt{dvips} with \texttt{ps2pdf} will fix that. Using \texttt{dvipdfm} does not help here.
% \newpage
-%
-% For the sake of comparing \texttt{dvi} viewers \texttt{xdvi}, \texttt{yap}, and others, we load \textsf{tikz} only when making a \texttt{pdf} because some \texttt{dvi} viewers crash otherwise. This may be wholly unnecessary in a \texttt{dvips} workflow or the like. With \textsf{fontspec}, Latin Modern is the default. If we only make \texttt{pdf} documents, the test simplifies to testing for \cmd{\Umathchar}, then loading either \textsf{fontspec} (success) or \textsf{fontenc} (failure).
%
-%In the body text we can use something like the test below for \fbox{\ifDoTikZ doing \texttt{pdf} things\else doing \texttt{dvi} things\fi}
+% In the body text we can use something like the test below for:
+%
+% \begin{center}\fbox{\ifxetex doing \texttt{pdf} things\else \ifpdf doing \texttt{pdf} things\else doing \texttt{dvi} things\fi\fi}\end{center}
+%
% \begin{quote}\small
+% \StartNum
% \begin{verbatim}
-%\ifDoTikZ
-% doing \texttt{pdf} things\else
-% doing \texttt{dvi} things\fi\end{verbatim}
+%\ifxetex
+% doing \texttt{pdf} things
+%\else
+% \ifpdf
+% doing \texttt{pdf} things
+% \else
+% doing \texttt{dvi} things
+% \fi
+%\fi\end{verbatim}
% \end{quote}
%
% The following equivalent conditional statements can help a macro or just the body text to work under multiple engines:
+%
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -4901,7 +5908,7 @@ the README.txt or README for more information.
% \fi
%\fi\end{verbatim}
% \end{quote}
-%
+%
% \begin{quote}\small
% \StartNum
% \begin{verbatim}
@@ -4918,28 +5925,33 @@ the README.txt or README for more information.
%\else xelatex%
%\fi\end{verbatim}
% \end{quote}
-%
% \ReturnLink
% \BigBlank
% \newpage
-%
+%
% \StopEventually{^^A
+% \FontDebugfalse^^A prevents font debugging errors
% \let\emph\oldemph
% \newgeometry{textwidth=160mm,textheight=237mm,right=25mm}
% \IndexProtect\PrintChanges\newpage\PrintIndex
% }
-%
-% \section{Implementation}
-%
% \iffalse
%<*package>
% \fi
+%
+% \section{Implementation}
% \small
+%
% \subsection{Flags and Registers}
+% \begin{center}\normalsize\bfseries General Process Flow Control\end{center}
%
-% The flags below are grouped according to function. We begin with flow control\medskip
+% \noindent{\normalsize\bfseries Warning Levels}\medskip\\
+% This flag controls how many warnings you get. Defaults to few warnings. Verbose gives you plenty of warnings about cross-references and page entries in the index.
+% \begin{macrocode}
+\newif\if@nameauth@Verbose
+% \end{macrocode}\medskip
%
-% \noindent{\large\bfseries Who Called Me?}\medskip\\
+% \noindent{\normalsize\bfseries Who Called Me?}\medskip\\
% Various macros use these flags to protect against stack overflows or choose the right output.
% \begin{macrocode}
\newif\if@nameauth@InAKA
@@ -4947,16 +5959,29 @@ the README.txt or README for more information.
\newif\if@nameauth@Xref
% \end{macrocode}\smallskip
%
-% \noindent{\large\bfseries Core Macro Locks}\medskip\\
-% The macros \cmd{\@nameauth@Name} and \cmd{\AKA}, with some auxiliary macros, process names in a ``locked'' state to avoid a stack overflow. The \texttt{BigLock} always locks the macros, preventing execution. See also Sections~\ref{sec:Hooksii} and~\ref{sec:Hooksiii}.
+% \noindent{\normalsize\bfseries Core Macro Locks}\medskip\\
+% \cmd{\@nameauth@Name}, \cmd{\AKA}, and other macros use a lock to avoid a stack overflow. With \texttt{\textbackslash @nameauth@BigLock} one prevents execution. See also Sections~\ref{sec:Hooksii} and~\ref{sec:Hooksiii}.
% \begin{macrocode}
\newif\if@nameauth@Lock
\newif\if@nameauth@BigLock
\newif\if@nameauth@InHook
% \end{macrocode}\smallskip
%
-% \noindent{\large\bfseries Indexing}\medskip\\
-% The indexing flags permit or prevent indexing and tags. \cmd{\IndexActive} and \cmd{\IndexInctive} or the \texttt{index} and \texttt{noindex} options toggle the first flag; \cmd{\SkipIndex} toggles the second. \cmd{\JustIndex} toggles the third, which makes the core naming engine act like a call to \cmd{\IndexName}:
+% \noindent{\normalsize\bfseries Name Decision Paths}\medskip\\
+% \cmd{\IfMainName}, \cmd{\IfFrontName}, and \cmd{\IfAKA} use locally-scoped paths by default. This flag causes that scoping not to be used.
+% \begin{macrocode}
+\newif\if@nameauth@GlobalScope
+% \end{macrocode}\smallskip
+%
+% \noindent{\normalsize\bfseries Debugging}\medskip\\
+% Both flags below are used to show name patterns and index entries in the text.
+% \begin{macrocode}
+\newif\if@nameauth@IdxDebug
+\newif\if@nameauth@LongIdxDebug
+% \end{macrocode}\smallskip
+%
+% \noindent{\normalsize\bfseries Indexing}\medskip\\
+% The indexing flags permit or prevent indexing and tags. \cmd{\IndexActive} and \cmd{\IndexInctive} or the \texttt{index} and \texttt{noindex} options toggle the first flag; \cmd{\SkipIndex} toggles the second. \cmd{\JustIndex} toggles the third, which makes the core naming engine \cmd{\@nameauth@Name} act like a call to \cmd{\IndexName}:
% \begin{macrocode}
\newif\if@nameauth@DoIndex
\newif\if@nameauth@SkipIndex
@@ -4966,12 +5991,13 @@ the README.txt or README for more information.
% \begin{macrocode}
\newif\if@nameauth@Pretag
% \end{macrocode}
-% This flag determines whether \cmd{\IndexRef} creates a \textit{see} reference or a \textit{see also} reference.
+% The first flag determines whether \cmd{\IndexRef} creates a \textit{see} reference or a \textit{see also} reference. The second determines how strict to be with \textit{see} references.
% \begin{macrocode}
\newif\if@nameauth@SeeAlso
+\newif\if@nameauth@OldSee
% \end{macrocode}\smallskip
%
-% \noindent{\large\bfseries Formatting}\medskip\\
+% \noindent{\normalsize\bfseries Formatting}\medskip\\
% \cmd{\NamesActive} and \cmd{\NamesInactive}, with the \texttt{mainmatter} and \texttt{frontmatter} options, toggle formatting hooks via \texttt{\textbackslash if@nameauth@MainFormat}. \texttt{\textbackslash if@nameauth@AKAFormat} permits \cmd{\AKA} to call the first-use hooks once.
% \begin{macrocode}
\newif\if@nameauth@MainFormat
@@ -4981,10 +6007,11 @@ the README.txt or README for more information.
% \begin{macrocode}
\newif\if@nameauth@LocalNames
% \end{macrocode}\medskip
-% These two flags are used only for backward compatibility. The first broadly determines how per-name flags are reset, while the second affects the behavior of \cmd{\JustIndex}.
+% These three flags are used only for backward compatibility. The first broadly determines how per-name flags are reset; the second affects the behavior of \cmd{\JustIndex}; and the third toggles whether or not the name argument token registers are set globally.
% \begin{macrocode}
\newif\if@nameauth@OldReset
\newif\if@nameauth@OldPass
+\newif\if@nameauth@OldToks
% \end{macrocode}\medskip
% These two flags trigger \cmd{\ForgetName} and \cmd{\SubvertName} within \cmd{\@nameauth@Name}.
% \begin{macrocode}
@@ -4995,11 +6022,11 @@ the README.txt or README for more information.
% \begin{macrocode}
\newif\if@nameauth@FirstFormat
\newif\if@nameauth@AlwaysFormat
-% \end{macrocode}\medskip
+% \end{macrocode}
%
-% \noindent Next we move from general flow control to specific modification of name forms.\medskip
+% \begin{center}\normalsize\bfseries Specific Name Form Modifications\end{center}
%
-% \noindent{\large\bfseries Affix Commas}\medskip\\
+% \noindent{\normalsize\bfseries Affix Commas}\medskip\\
% The \texttt{comma} and \texttt{nocomma} options toggle the first flag value below. \cmd{\ShowComma} and \cmd{\NoComma} respectively toggle the second and third.
% \begin{macrocode}
\newif\if@nameauth@AlwaysComma
@@ -5007,20 +6034,20 @@ the README.txt or README for more information.
\newif\if@nameauth@NoComma
% \end{macrocode}\medskip
%
-% \noindent{\large\bfseries Name Breaking}\medskip\\
+% \noindent{\normalsize\bfseries Name Breaking}\medskip\\
% \cmd{\KeepAffix} toggles the first flag below, while \cmd{\KeepName} toggles the second. Both affect the use of non-breaking spaces in the text.
% \begin{macrocode}
\newif\if@nameauth@NBSP
\newif\if@nameauth@NBSPX
% \end{macrocode}\medskip
%
-% \noindent{\large\bfseries Detect Punctuation}\medskip\\
+% \noindent{\normalsize\bfseries Detect Punctuation}\medskip\\
% This Boolean value is used to prevent double full stops at the end of a name in the text.
% \begin{macrocode}
\newif\if@nameauth@Punct
% \end{macrocode}\medskip
%
-% \noindent{\large\bfseries Long and Short Names}\medskip\\
+% \noindent{\normalsize\bfseries Long and Short Names}\medskip\\
% \texttt{\textbackslash if@nameauth@FullName} is true for a long name reference. \texttt{\textbackslash if@nameauth@FirstName} disables full-name references and causes only Western forenames to be displayed. The default is to reset both globally on a per-name basis.
%
% \texttt{\textbackslash if@nameauth@AltAKA} is toggled respectively by \cmd{\AKA} and \cmd{\AKA*} to print a longer or shorter name. \texttt{\textbackslash if@nameauth@OldAKA} forces the pre-3.0 behavior of \cmd{\AKA*}.
@@ -5035,7 +6062,7 @@ the README.txt or README for more information.
\newif\if@nameauth@EastFN
% \end{macrocode}\medskip
%
-% \noindent{\large\bfseries Eastern Names}\medskip\\
+% \noindent{\normalsize\bfseries Eastern Names}\medskip\\
% The next flags values govern name reversing and full surname capitalization. The first of each pair is a global state. The second of each pair is an individual state.
% \begin{macrocode}
\newif\if@nameauth@RevAll
@@ -5044,14 +6071,14 @@ the README.txt or README for more information.
\newif\if@nameauth@AllThis
% \end{macrocode}\medskip
%
-% \noindent{\large\bfseries Last-Comma-First}\medskip\\
+% \noindent{\normalsize\bfseries Last-Comma-First}\medskip\\
% This pair of flags deals with Western names reordered in a list according to surname.
% \begin{macrocode}
\newif\if@nameauth@RevAllComma
\newif\if@nameauth@RevThisComma
% \end{macrocode}\medskip
%
-% \noindent{\large\bfseries Cap First Letter and Format}\medskip\\
+% \noindent{\normalsize\bfseries Cap First Letter and Format}\medskip\\
% The next flags deal with first-letter capitalization. \cmd{\CapThis} sets the first Boolean value. The second is triggered by \cmd{\@nameauth@UTFtest} when it encounters an active Unicode character. The third is a fallback triggered by \cmd{\AccentCapThis}. The fourth disables \cmd{\CapThis} for alternate formatting. The fifth toggles alternate formatting.
% \begin{macrocode}
\newif\if@nameauth@DoCaps
@@ -5059,37 +6086,31 @@ the README.txt or README for more information.
\newif\if@nameauth@Accent
\newif\if@nameauth@AltFormat
\newif\if@nameauth@DoAlt
-% \end{macrocode}\medskip
-%
-% \noindent{\large\bfseries Warning Levels}\medskip\\
-% This flag controls how many warnings you get. Defaults to few warnings. Verbose gives you plenty of warnings about cross-references in the index.
-% \begin{macrocode}
-\newif\if@nameauth@Verbose
-% \end{macrocode}\medskip
+% \end{macrocode}
%
-% \noindent{\large\bfseries Name Argument Token Registers}\vspace{-1.5ex}
+% \begin{center}\normalsize\bfseries Name Argument Token Registers\end{center}
% \begin{macro}{\@nameauth@toksa}
% \begin{macro}{\@nameauth@toksb}
% \begin{macro}{\@nameauth@toksc}
% These three token registers contain the current values of the name arguments passed to \cmd{\Name}, its variants, and the cross-reference arguments of \cmd{\AKA}. Users can access them especially in formatting hooks.
% \begin{macrocode}
-\newtoks\@nameauth@toksa%
-\newtoks\@nameauth@toksb%
-\newtoks\@nameauth@toksc%
+\newtoks\@nameauth@toksa
+\newtoks\@nameauth@toksb
+\newtoks\@nameauth@toksc
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% These three token registers contain the current values of the name arguments in each line of the \texttt{nameauth} environment.
% \begin{macrocode}
-\newtoks\@nameauth@etoksb%
-\newtoks\@nameauth@etoksc%
-\newtoks\@nameauth@etoksd%
+\newtoks\@nameauth@etoksb
+\newtoks\@nameauth@etoksc
+\newtoks\@nameauth@etoksd
% \end{macrocode}
%
% \subsection{Hooks}
% \begin{macro}{\NamesFormat}
-% Post-process ``first'' instance of final complete name form in text. See Sections~\ref{sec:Formatting} and~\ref{sec:Hooksi}f. Called when both |\@nameauth@MainFormat| and |\@nameauth@FirstFormat| are true.
+% Post-process ``first'' instance of final complete name form in text. See Sections~\ref{sec:Formatting} and~\ref{sec:Hooksi}. Called when both |\@nameauth@MainFormat| and |\@nameauth@FirstFormat| are true.
% \begin{macrocode}
\newcommand*\NamesFormat{}
% \end{macrocode}
@@ -5136,36 +6157,46 @@ the README.txt or README for more information.
\newcommand*\NameauthFName{\@nameauth@Name}
% \end{macrocode}
% \end{macro}
+% \begin{macro}{\NameauthIndex}
+% \changes{3.5}{2020/11/23}{Added}
+% Customization hook that allows one to redefine what happens when any naming or indexing function calls the equivalent of \cmd{\index}. See Section~\ref{sec:GeneralIndex}.
+% \begin{macrocode}
+\newcommand*\NameauthIndex{\index}
+% \end{macrocode}
+% \end{macro}
%
% \subsection{Package Options}
% The following package options interact with many of the prior Boolean values.
% \begin{macrocode}
-\DeclareOption{comma}{\@nameauth@AlwaysCommatrue}
-\DeclareOption{nocomma}{\@nameauth@AlwaysCommafalse}
\DeclareOption{mainmatter}{\@nameauth@MainFormattrue}
\DeclareOption{frontmatter}{\@nameauth@MainFormatfalse}
+\DeclareOption{alwaysformat}{\@nameauth@AlwaysFormattrue}
\DeclareOption{formatAKA}{\@nameauth@AKAFormattrue}
-\DeclareOption{oldAKA}{\@nameauth@OldAKAtrue}
-\DeclareOption{oldreset}{\@nameauth@OldResettrue}
-\DeclareOption{oldpass}{\@nameauth@OldPasstrue}
\DeclareOption{index}{\@nameauth@DoIndextrue}
\DeclareOption{noindex}{\@nameauth@DoIndexfalse}
\DeclareOption{pretag}{\@nameauth@Pretagtrue}
\DeclareOption{nopretag}{\@nameauth@Pretagfalse}
-\DeclareOption{allcaps}{\@nameauth@AllCapstrue}
+\DeclareOption{verbose}{\@nameauth@Verbosetrue}
+\DeclareOption{globaltest}{\@nameauth@GlobalScopetrue}
+\DeclareOption{oldAKA}{\@nameauth@OldAKAtrue}
+\DeclareOption{oldreset}{\@nameauth@OldResettrue}
+\DeclareOption{oldpass}{\@nameauth@OldPasstrue}
+\DeclareOption{oldtoks}{\@nameauth@OldTokstrue}
+\DeclareOption{oldsee}{\@nameauth@OldSeetrue}
+\DeclareOption{nocomma}{\@nameauth@AlwaysCommafalse}
+\DeclareOption{comma}{\@nameauth@AlwaysCommatrue}
\DeclareOption{normalcaps}{\@nameauth@AllCapsfalse}
+\DeclareOption{allcaps}{\@nameauth@AllCapstrue}
+\DeclareOption{notreversed}%
+ {\@nameauth@RevAllfalse\@nameauth@RevAllCommafalse}
\DeclareOption{allreversed}%
{\@nameauth@RevAlltrue\@nameauth@RevAllCommafalse}
\DeclareOption{allrevcomma}%
{\@nameauth@RevAllfalse\@nameauth@RevAllCommatrue}
-\DeclareOption{notreversed}%
- {\@nameauth@RevAllfalse\@nameauth@RevAllCommafalse}
-\DeclareOption{alwaysformat}{\@nameauth@AlwaysFormattrue}
+\DeclareOption{noformat}{\renewcommand*\NamesFormat{}}
\DeclareOption{smallcaps}{\renewcommand*\NamesFormat{\scshape}}
\DeclareOption{italic}{\renewcommand*\NamesFormat{\itshape}}
\DeclareOption{boldface}{\renewcommand*\NamesFormat{\bfseries}}
-\DeclareOption{noformat}{\renewcommand*\NamesFormat{}}
-\DeclareOption{verbose}{\@nameauth@Verbosetrue}
\DeclareOption{altformat}{%
\@nameauth@AltFormattrue\@nameauth@DoAlttrue}
\ExecuteOptions%
@@ -5174,31 +6205,58 @@ the README.txt or README for more information.
\ProcessOptions\relax
% \end{macrocode}
%
-% Now we load the required packages. They facilitate the first\,/\,subsequent name uses, the parsing of arguments, and the implementation of starred forms.
+% Now we load the required packages. They facilitate the first/subsequent name uses, the parsing of arguments, and the implementation of starred forms.
% \begin{macrocode}
\RequirePackage{etoolbox}
-\RequirePackage{suffix}
\RequirePackage{trimspaces}
+\RequirePackage{suffix}
\RequirePackage{xargs}
% \end{macrocode}
%
-% The \textsf{etoolbox} package is essential for processing name control sequences. Using \textsf{xargs} allows the optional arguments to work. Using \textsf{suffix} facilitated the starred form of macros. Finally, \textsf{trimspaces} helps the fault tolerance of name arguments.
-% \BigBlank
-% \newpage
-%
% \subsection{Internal Macros}
% \label{sec:InternalMacros}
%
-% \noindent{\large\bfseries Name Control Sequence: Who Am I?}
+% \noindent{\normalsize\bfseries Internal Values}
+% \begin{macro}{\@nameauth@Actual}
+% \changes{2.0}{2015/11/11}{Added}
+% \changes{3.5}{2020/11/23}{Use \cmd{\def}}
+% This sets the ``actual'' character used by \textsf{nameauth} for index sorting. This lets one use, for example, |\global\IndexActual{=}|.
+% \begin{macrocode}
+\def\@nameauth@Actual{@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@nameauth@Exclude}
+% \changes{3.5}{2020/11/23}{Added}
+% This makes an xref into an ``exclusion''. An exclusion is any name control sequence ending in \texttt{!PN} that expands to this value. See \cmd{\ExcludeName}.
+% \begin{macrocode}
+\newcommand*\@nameauth@Exclude{!}
+% \end{macrocode}
+% \end{macro}
+%
+% \noindent{\normalsize\bfseries Name Control Sequence: Who Am I?}
% \begin{macro}{\@nameauth@Clean}
-% Thanks to \Name*[Heiko]{Oberdiek}, this macro produces a ``sanitized'' string used to make a (hopefully) unique control sequence for a name. We can test the existence of that control string to determine first occurrences of a name or cross-reference.
+% Thanks to \Name*[Heiko]{Oberdiek}, this macro produces a ``sanitized'' string to make a control sequence for a name. Testing the existence of that control sequence is the core of \textsf{nameauth}.
% \begin{macrocode}
\newcommand*\@nameauth@Clean[1]
{\expandafter\zap@space\detokenize{#1} \@empty}
% \end{macrocode}
-% \end{macro}\medskip
+% \end{macro}
+%
+% \begin{macro}{\@nameauth@MakeCS}
+% \changes{3.5}{2020/11/23}{Added}
+% Unless we are in \cmd{\AKA}, create a name control sequence in the core name engine.
+% \begin{macrocode}
+\newcommand*\@nameauth@MakeCS[1]
+{%
+ \unless\ifcsname#1\endcsname
+ \unless\if@nameauth@InAKA\csgdef{#1}{}\fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
%
-% \noindent{\large\bfseries Parsing: Root and Suffix}
+% \noindent{\normalsize\bfseries Parsing: Root and Suffix}
% \begin{macro}{\@nameauth@Root}
% The following two macros return everything before a comma in \meta{SNN}.
% \begin{macrocode}
@@ -5219,7 +6277,7 @@ the README.txt or README for more information.
% \begin{macro}{\@nameauth@TrimTag}
% \changes{3.0}{2016/10/26}{Added}
% \changes{3.2}{2017/03/22}{Renamed}
-% The following two macros return everything before a vertical bar (\verb+|+) in an index tag.
+% The following two macros return everything before a vertical bar (\texttt{\textbar}) in an index tag.
% \begin{macrocode}
\newcommand*\@nameauth@TrimTag[1]{\@nameauth@@TrimTag#1|\\}
% \end{macrocode}
@@ -5248,8 +6306,9 @@ the README.txt or README for more information.
% \changes{3.2}{2017/03/22}{Renamed}
% Throw out the radix; return the suffix with no leading spaces. We use this when printing the suffix.
% \begin{macrocode}
-\def\@nameauth@@Suffix#1,#2,#3\\%
- {\ifx\\#2\\\@empty\else\trim@spaces{#2}\fi}
+\def\@nameauth@@Suffix#1,#2,#3\\{%
+ \ifx\\#2\\\@empty\else\trim@spaces{#2}\fi
+}
% \end{macrocode}
% \end{macro}
%
@@ -5269,33 +6328,39 @@ the README.txt or README for more information.
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Parsing: Capitalization}
+% \noindent{\normalsize\bfseries Parsing: Capitalization}
% \begin{macro}{\@nameauth@TestToks}
% \phantomsection
% \label{page:CapSystem}
% \changes{3.2}{2017/03/22}{Added}
+% \changes{3.5}{2020/11/23} {Fix namespace}
% Test if the leading token is the same as the leading token of an active Unicode character, using an \textit{Esszett} (\texttt{ß}) as the control. We only run this macro if we are in the \textsf{inputenc} regime.
% \begin{macrocode}
\newcommand*\@nameauth@TestToks[1]
{%
\toks@\expandafter{\@car#1\@nil}%
- \edef\one{\the\toks@}%
+ \edef\@nameauth@one{\the\toks@}%
\toks@\expandafter{\@carß\@nil}%
- \edef\two{\the\toks@}%
- \ifx\one\two\@nameauth@UTFtrue\else\@nameauth@UTFfalse\fi
+ \edef\@nameauth@two{\the\toks@}%
+ \ifx\@nameauth@one\@nameauth@two
+ \@nameauth@UTFtrue%
+ \else
+ \@nameauth@UTFfalse%
+ \fi
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@nameauth@UTFtest}
% \changes{3.0}{2016/10/26}{Added}
-% \changes{3.1}{2017/01/13}{Override bypasses test}
+% \changes{3.1}{2017/01/13}{Can skip test}
% \changes{3.2}{2017/03/22}{Non-suffix only}
-% Before we attempt at capitalizing anything, we need to determine if we are running under \texttt{xelatex} or \texttt{lualatex} by testing for \cmd{\Umathchar}. Then we see if \textsf{inputenc} is loaded. We set up the comparison and pass off to \cmd{\@nameauth@TestToks}.
+% \changes{3.5}{2020/11/23}{Fix namespace}
+% We choose how to capitalize a letter by determining if we are running under \texttt{xelatex} or \texttt{lualatex}. We test for \cmd{\Umathchar}. Then we see if \textsf{inputenc} is loaded. We set up the comparison and pass off to \cmd{\@nameauth@TestToks}.
% \begin{macrocode}
\newcommand*\@nameauth@UTFtest[1]
{%
- \def\testarg{#1}%
+ \def\@nameauth@testarg{#1}%
\ifdefined\Umathchar
\@nameauth@UTFfalse%
\else
@@ -5303,7 +6368,8 @@ the README.txt or README for more information.
\if@nameauth@Accent
\@nameauth@UTFtrue\@nameauth@Accentfalse%
\else
- \expandafter\@nameauth@TestToks\expandafter{\testarg}%
+ \expandafter\@nameauth@TestToks%
+ \expandafter{\@nameauth@testarg}%
\fi
\else
\@nameauth@UTFfalse%
@@ -5315,14 +6381,23 @@ the README.txt or README for more information.
%
% \begin{macro}{\@nameauth@UTFtestS}
% \changes{3.2}{2017/03/22}{Added}
+% \changes{3.5}{2020/11/23}{Fix namespace}
% This test is like the one above, but a special case when we have a suffix. We have to do a bit more in the way of expansion to get the comparison to work properly. Moreover, we only use this when the regular suffix macro is not \cmd{\@empty}.
% \begin{macrocode}
\newcommand*\@nameauth@UTFtestS[1]
{%
- \let\ex\expandafter%
- \ex\def\ex\testarg\ex{\@nameauth@GetSuff{#1}}%
- \ex\toks@\ex\ex\ex{\testarg}%
- \ex\def\ex\test@rg\ex{\the\toks@}%
+ \expandafter\def\expandafter\@nameauth@testarg%
+ \expandafter{\@nameauth@GetSuff{#1}}%
+% \end{macrocode}
+% This following token register assignment looks weird, but it is how we get a test that works.
+% \begin{macrocode}
+ \expandafter\toks@%
+ \expandafter\expandafter\expandafter{\@nameauth@testarg}%
+% \end{macrocode}
+% We take that token register and assign its value to a macro to do the test.
+% \begin{macrocode}
+ \expandafter\def\expandafter\@nameauth@test@rg%
+ \expandafter{\the\toks@}%
\ifdefined\Umathchar
\@nameauth@UTFfalse%
\else
@@ -5330,7 +6405,8 @@ the README.txt or README for more information.
\if@nameauth@Accent
\@nameauth@UTFtrue\@nameauth@Accentfalse%
\else
- \expandafter\@nameauth@TestToks\expandafter{\test@rg}%
+ \expandafter\@nameauth@TestToks%
+ \expandafter{\@nameauth@test@rg}%
\fi
\else
\@nameauth@UTFfalse%
@@ -5354,8 +6430,9 @@ the README.txt or README for more information.
% \changes{3.2}{2017/03/22}{Renamed, use \cmd{\MakeUppercase}}
% Helper macro for the one above.
% \begin{macrocode}
-\def\@nameauth@C@p#1#2\\%
- {\expandafter\trim@spaces\expandafter{\MakeUppercase{#1}#2}}
+\def\@nameauth@C@p#1#2\\{%
+ \expandafter\trim@spaces\expandafter{\MakeUppercase{#1}#2}%
+}
% \end{macrocode}
% \end{macro}
%
@@ -5372,80 +6449,424 @@ the README.txt or README for more information.
% \changes{3.2}{2017/03/22}{Use \cmd{\MakeUppercase}}
% Helper macro for the one above.
% \begin{macrocode}
-\def\@nameauth@C@pUTF#1#2#3\\%
- {\expandafter\trim@spaces\expandafter{\MakeUppercase{#1#2}#3}}
+\def\@nameauth@C@pUTF#1#2#3\\{%
+ \expandafter\trim@spaces\expandafter{\MakeUppercase{#1#2}#3}%
+}
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Parsing: Punctuation Detection}
+% \begin{macro}{\@nameauth@CapArgs}
+% \changes{3.5}{2020/11/23}{Added}
+% Capitalize the first letter of all name arguments. Implements capitalization on demand in the body text (not the index) when not in alternate formatting. We only use this macro in the local scope of \cmd{\@nameauth@Parse}.
+% \begin{macrocode}
+\newcommand*\@nameauth@CapArgs[3]
+{%
+ \ifdefined\@nameauth@InParser
+ \unless\if@nameauth@AltFormat
+ \let\carga\arga%
+ \let\crootb\rootb%
+ \let\csuffb\suffb%
+ \let\cargc\argc%
+% \end{macrocode}
+% We test the first argument for active Unicode characters, then cap the first letter.
+% \begin{macrocode}
+ \unless\ifx\arga\@empty
+ \def\test{#1}%
+ \expandafter\@nameauth@UTFtest\expandafter{\test}%
+% \end{macrocode}
+% Capitalize the first active Unicode character.
+% \begin{macrocode}
+ \if@nameauth@UTF
+ \expandafter\def\expandafter\carga\expandafter{%
+ \expandafter\@nameauth@CapUTF\expandafter{\test}}%
+% \end{macrocode}
+% Capitalize the first character (not active Unicode).
+% \begin{macrocode}
+ \else
+ \expandafter\def\expandafter\carga\expandafter{%
+ \expandafter\@nameauth@Cap\expandafter{\test}}%
+ \fi
+ \fi
+% \end{macrocode}
+% We test the root surname for active Unicode characters, then cap the first letter.
+% \begin{macrocode}
+ \def\test{#2}%
+ \expandafter\@nameauth@UTFtest\expandafter{\test}%
+% \end{macrocode}
+% Capitalize the first active Unicode character.
+% \begin{macrocode}
+ \if@nameauth@UTF
+ \expandafter\def\expandafter\crootb\expandafter{%
+ \expandafter\@nameauth@CapUTF\expandafter{\rootb}}%
+% \end{macrocode}
+% Capitalize the first character (not active Unicode).
+% \begin{macrocode}
+ \else
+ \expandafter\def\expandafter\crootb\expandafter{%
+ \expandafter\@nameauth@Cap\expandafter{\rootb}}%
+ \fi
+% \end{macrocode}
+% We test the suffix for active Unicode characters, then cap the first letter.
+% \begin{macrocode}
+ \unless\ifx\suffb\@empty
+ \def\test{#2}%
+ \expandafter\@nameauth@UTFtestS\expandafter{\test}%
+ \protected@edef\test{\@nameauth@GetSuff{#2}}%
+% \end{macrocode}
+% Capitalize the first active Unicode character.
+% \begin{macrocode}
+ \if@nameauth@UTF
+ \protected@edef\test{\@nameauth@Suffix{#2}}%
+ \expandafter\def\expandafter\csuffb\expandafter{%
+ \expandafter\@nameauth@CapUTF\expandafter{\test}}%
+% \end{macrocode}
+% Capitalize the first character (not active Unicode).
+% \begin{macrocode}
+ \else
+ \edef\@nameauth@test{\@nameauth@Suffix{#2}}%
+ \expandafter\def\expandafter\csuffb\expandafter{%
+ \expandafter\@nameauth@Cap\expandafter{\test}}%
+ \fi
+ \fi
+% \end{macrocode}
+% We test the final argument for active Unicode characters, then cap the first letter.
+% \begin{macrocode}
+ \unless\ifx\argc\@empty
+ \def\test{#3}%
+ \expandafter\@nameauth@UTFtest\expandafter{\test}%
+% \end{macrocode}
+% Capitalize the first active Unicode character.
+% \begin{macrocode}
+ \if@nameauth@UTF
+ \expandafter\def\expandafter\cargc\expandafter{%
+ \expandafter\@nameauth@CapUTF\expandafter{\test}}%
+% \end{macrocode}
+% Capitalize the first character (not active Unicode).
+% \begin{macrocode}
+ \else
+ \expandafter\def\expandafter\cargc\expandafter{%
+ \expandafter\@nameauth@Cap\expandafter{\test}}%
+ \fi
+ \fi
+% \end{macrocode}
+% Let the arguments be the macros with caps.
+% \begin{macrocode}
+ \let\arga\carga%
+ \let\rootb\crootb%
+ \let\suffb\csuffb%
+ \let\argc\cargc%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \noindent{\normalsize\bfseries Parsing: Punctuation Detection and Alteration}
% \begin{macro}{\@nameauth@TestDot}
-% This macro, based on a snippet by \Name*[Uwe]{Lueck}, checks for a period at the end of its argument. It determines whether we need to call \cmd{\@nameauth@CheckDot} below.
+% \changes{3.5}{2020/11/23}{Redesigned}
+% This macro, based on a snippet by \Name*[Uwe]{Lueck}, checks for a full stop at the end of its argument using the two internal helper macros below.
% \begin{macrocode}
\newcommand*\@nameauth@TestDot[1]
{%
- \def\TestDot##1.\TestEnd##2\\{\TestPunct{##2}}%
- \def\TestPunct##1{%
- \ifx\TestPunct##1\TestPunct%
+% \end{macrocode}
+% If no full stop is present, \texttt{\#\#1} is associated with the first \cmd{\@End.}. The second \cmd{\@End} gets absorbed as a parameter, leaving \texttt{\#\#2} empty. If a full stop is present, \texttt{\#\#2} will contain it.
+% \begin{macrocode}
+ \def\@nameauth@TestD@t##1.\@End##2\\{\@nameauth@TestPunct{##2}}%
+% \end{macrocode}
+% The two control sequences are equal if \texttt{\#\#1} is empty (no full stop). If \texttt{\#\#1} is not empty, it sets \cmd{\@nameauth@Puncttrue}, which triggers the call to \cmd{\@nameauth@CheckDot} below.
+% \begin{macrocode}
+ \def\@nameauth@TestPunct##1%
+ {%
+ \ifx\@nameauth@TestPunct##1\@nameauth@TestPunct
\else
- \@nameauth@Puncttrue%
+ \global\@nameauth@Puncttrue%
\fi
}%
- \@nameauth@Punctfalse%
- \TestDot#1\TestEnd.\TestEnd\\%
+ \global\@nameauth@Punctfalse%
+ \@nameauth@TestD@t#1\@End.\@End\\%
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@nameauth@CheckDot}
-% We assume that \cmd{\expandafter} precedes the invocation of \cmd{\@nameauth@CheckDot}, which only is called if the terminal character of the input is a period. We evaluate the lookahead \cmd{\@token} while keeping it on the list of input tokens.
+% We assume that \cmd{\expandafter} precedes the invocation of \cmd{\@nameauth@CheckDot}, which only is called if the terminal character of the input is a period. We evaluate the lookahead \cmd{\@nameauth@token} while keeping it on the list of input tokens.
% \begin{macrocode}
-\newcommand*\@nameauth@CheckDot%
- {\futurelet\@token\@nameauth@EvalDot}
+\newcommand*\@nameauth@CheckDot
+ {\futurelet\@nameauth@token\@nameauth@EvalDot}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@nameauth@EvalDot}
-% If \cmd{\@token} is a full stop, we gobble the token.
+% If \cmd{\@nameauth@token} is a full stop, we gobble the next token. Note that we cannot have this conditional statement span more than one line.
+% \begin{macrocode}
+\newcommand*\@nameauth@EvalDot
+{%
+ \let\@nameauth@stop=.%
+ \ifx\@nameauth@token\@nameauth@stop\expandafter\@gobble \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@nameauth@AddPunct}
+% \changes{3.5}{2020/11/23}{Added}
+% Here we govern whether spaces between name elements break or not, and whether to add commas or not. This all occurs in the text, not the index. The priority from highest to lowest is no commas, show commas, and always show commas. Much applies only to Western names, thus we check of \meta{FNN} is empty or not. We only use this macro in the local scope of \cmd{\@nameauth@Parse}.
+% \begin{macrocode}
+\newcommand*\@nameauth@AddPunct
+{%
+ \ifdefined\@nameauth@InParser
+ \def\Space{ }%
+ \def\SpaceX{ }%
+% \end{macrocode}
+% \cmd{\SpaceX} is used for the space between a Western name and an affix, specifically tied to \cmd{\KeepAffix}. \cmd{\Space} is used for all other spaces between name elements.
+% \begin{macrocode}
+ \if@nameauth@NBSP \edef\Space{\nobreakspace}\fi
+ \if@nameauth@NBSPX \edef\SpaceX{\nobreakspace}\fi
+% \end{macrocode}
+% Western names have a set of comma-use conventions that differ from all other name forms, so we only use the following logic if \meta{FNN} is not empty, thus, a Western name.
+% \begin{macrocode}
+ \unless\ifx\arga\@empty
+ \if@nameauth@AlwaysComma
+ \def\Space{, }%
+ \if@nameauth@NBSP \edef\Space{,\nobreakspace}\fi
+ \fi
+ \if@nameauth@ShowComma
+ \def\Space{, }%
+ \if@nameauth@NBSP \edef\Space{,\nobreakspace}\fi
+ \fi
+ \if@nameauth@NoComma
+ \def\Space{ }%
+ \if@nameauth@NBSP \edef\Space{\nobreakspace}\fi
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \noindent{\normalsize\bfseries Parsing: Name Argument Loading}
+% \begin{macro}{\@nameauth@LoadArgs}
+% \changes{3.5}{2020/11/23}{Added}
+% Assign name arguments to internal macros to determine name syntax. This is used in all macros that take name arguments.
+% \begin{macrocode}
+\newcommand*\@nameauth@LoadArgs[3]
+{%
+% \end{macrocode}
+% We want these arguments to expand to \cmd{\@empty} (or not) when we test them.
+% \begin{macrocode}
+ \protected@edef\@nameauth@A{\trim@spaces{#1}}%
+ \protected@edef\@nameauth@B{\@nameauth@Root{#2}}%
+ \protected@edef\@nameauth@SB{\@nameauth@Suffix{#2}}%
+ \protected@edef\@nameauth@C{\trim@spaces{#3}}%
+% \end{macrocode}
+% Make (usually) unique control sequence values from the name arguments.
+% \begin{macrocode}
+ \def\@nameauth@csb{\@nameauth@Clean{#2}}%
+ \def\@nameauth@csbc{\@nameauth@Clean{#2,#3}}%
+ \def\@nameauth@csab{\@nameauth@Clean{#1!#2}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \noindent{\normalsize\bfseries Parsing: Standard Parsing Logic}
+% \begin{macro}{\@nameauth@Choice}
+% \changes{3.5}{2020/11/23}{Added}
+% This standard logic applies to all macros that take name arguments.
+% \begin{macrocode}
+\newcommand\@nameauth@Choice[3]
+{%
+ \ifx\@nameauth@A\@empty
+ \ifx\@nameauth@C\@empty
+% \end{macrocode}
+% This decision path is for non-Western names. The \texttt{\#1} argument recurs below where \cmd{\@nameauth@SB} is present. Thus, for output to the text, the \texttt{\#1} argument must test both \cmd{\@nameauth@C} and \cmd{\@nameauth@SB}, and swap the former with the latter if necessary. For output to the index or for handling control sequences, one ignores \cmd{\@nameauth@C}.
+% \begin{macrocode}
+ #1%
+ \else
+ \ifx\@nameauth@SB\@empty
+% \end{macrocode}
+% The \texttt{\#2} argument is only for non-Western names that use the obsolete syntax. In the \texttt{\#2} argument \cmd{\@nameauth@SB} never occurs. For indexing and control sequences, one cannot ignore the use of \cmd{\@nameauth@C} in this path.
+% \begin{macrocode}
+ #2%
+ \else
+% \end{macrocode}
+% But if both \cmd{\@nameauth@SB} and \cmd{\@nameauth@C} are present, we invoke the \texttt{\#1} argument instead and let it do any further testing and processing.
+% \begin{macrocode}
+ #1%
+ \fi
+ \fi
+ \else
+% \end{macrocode}
+% This decision path is for Western names. In those cases where one must work with name forms in the text, somewhere in the \texttt{\#3} argument one must test for \cmd{\@nameauth@C} and swap it for \cmd{\@nameauth@A}, as well as accounting for the presence or absence of \cmd{\@nameauth@SB}. Otherwise, for indexing and control sequences, one ignores \cmd{\@nameauth@C} in this path and handles \cmd{\@nameauth@SB} appropriately.
+% \begin{macrocode}
+ #3%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@nameauth@Flags}
+% \changes{3.5}{2020/09/25}{Added}
+% Reset flags after the naming macros and \cmd{\AKA} and friends create output in the text. This is not the only place where formatting flags are reset, but the other places in the core naming engine and name parser are special-use cases designed for the use of \cmd{\JustIndex} and macros like \cmd{\PName}.
% \begin{macrocode}
-\newcommand*\@nameauth@EvalDot%
+\newcommand*\@nameauth@Flags
{%
- \let\@period=.%
- \ifx\@token\@period\expandafter\@gobble \fi
+ \if@nameauth@OldReset
+% \end{macrocode}
+% The \texttt{oldreset} option implies not only a difference in scope regarding how flags are reset, but it also lets the effects of \cmd{\ForgetThis} and \cmd{\SubvertThis} to pass through \cmd{\AKA} and \cmd{\AKA*}. Regardless, we only reset \texttt{\textbackslash if@nameauth@AltAKA} here due to macros like \cmd{\PName}.
+% \begin{macrocode}
+ \if@nameauth@InAKA
+ \@nameauth@AltAKAfalse%
+ \fi
+ \@nameauth@SkipIndexfalse%
+ \if@nameauth@InName
+ \@nameauth@Forgetfalse%
+ \@nameauth@Subvertfalse%
+ \fi
+ \@nameauth@NBSPfalse%
+ \@nameauth@NBSPXfalse%
+ \@nameauth@DoCapsfalse%
+ \@nameauth@Accentfalse%
+ \@nameauth@AllThisfalse%
+ \@nameauth@ShowCommafalse%
+ \@nameauth@NoCommafalse%
+ \@nameauth@RevThisfalse%
+ \@nameauth@RevThisCommafalse%
+ \@nameauth@ShortSNNfalse%
+ \@nameauth@EastFNfalse%
+ \else
+% \end{macrocode}
+% \newpage\noindent
+% The current way that the flags are reset makes them both global and more uniform, hopefully eliminating a few chances for errors that might be quite difficult to debug.
+% \begin{macrocode}
+ \if@nameauth@InAKA
+ \global\@nameauth@AltAKAfalse%
+ \fi
+ \global\@nameauth@SkipIndexfalse%
+ \global\@nameauth@Forgetfalse%
+ \global\@nameauth@Subvertfalse%
+ \global\@nameauth@NBSPfalse%
+ \global\@nameauth@NBSPXfalse%
+ \global\@nameauth@DoCapsfalse%
+ \global\@nameauth@Accentfalse%
+ \global\@nameauth@AllThisfalse%
+ \global\@nameauth@ShowCommafalse%
+ \global\@nameauth@NoCommafalse%
+ \global\@nameauth@RevThisfalse%
+ \global\@nameauth@RevThisCommafalse%
+ \global\@nameauth@ShortSNNfalse%
+ \global\@nameauth@EastFNfalse%
+ \fi
}
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Error Detection}
+% \noindent{\normalsize\bfseries Error Detection and Debugging}
% \begin{macro}{\@nameauth@Error}
% \changes{3.0}{2016/10/26}{Added}
% \changes{3.01}{2016/10/27}{Fixed}
-% One can cause \textsf{nameauth} to halt with an error by leaving a required name argument empty, providing an argument that expands to empty, or creating an empty root within a root\,/\,suffix pair.
+% \changes{3.5}{2020/11/23}{Fix namespace}
+% One can cause \textsf{nameauth} to halt with an error by leaving a required name argument empty, providing an argument that expands to empty, or creating an empty root within a malformed root/suffix pair. We provide meaningful feedback regarding these cases.
% \begin{macrocode}
\newcommand*\@nameauth@Error[2]
{%
- \edef\msga{#2 SNN arg empty}%
- \edef\msgb{#2 SNN arg malformed}%
- \protected@edef\testname{\trim@spaces{#1}}%
- \protected@edef\testroot{\@nameauth@Root{#1}}%
- \ifx\testname\@empty
- \PackageError{nameauth}{\msga}%
+ \edef\@nameauth@msga{#2 SNN arg empty}%
+ \edef\@nameauth@msgb{#2 SNN arg malformed}%
+ \protected@edef\@nameauth@testname{\trim@spaces{#1}}%
+ \protected@edef\@nameauth@testroot{\@nameauth@Root{#1}}%
+ \ifx\@nameauth@testname\@empty
+ \PackageError{nameauth}{\@nameauth@msga}%
\fi
- \ifx\testroot\@empty
- \PackageError{nameauth}{\msgb}%
+ \ifx\@nameauth@testroot\@empty
+ \PackageError{nameauth}{\@nameauth@msgb}%
\fi
}
% \end{macrocode}
% \end{macro}
-% \newpage
%
-% \noindent{\large\bfseries Core Name Engine}
+% \begin{macro}{\@nameauth@Debug}
+% \changes{3.3}{2020/02/20}{added}
+% \changes{3.5}{2020/11/23}{use index hook, optimize logic, fix namespace, use Boolean flags}
+% In this Swiss-army knife for debugging, we set up a local scope because we make changes that would otherwise affect normal \textsf{nameauth} output. We redefine \cmd{\NameauthIndex} to print an argument in the text instead of the index, and we force indexing to occur.
+% \begin{macrocode}
+\newcommandx*\@nameauth@Debug[3][1=\@empty, 3=\@empty]
+{%
+ \begingroup%
+ \def\NameauthIndex##1{##1}%
+ \@nameauth@DoIndextrue%
+% \end{macrocode}
+% Process and load the arguments into the appropriate macros.
+% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
+ \@nameauth@Error{#2}{macro \string\@nameauth@Debug}%
+% \end{macrocode}
+% \newpage\noindent
+% Below, given \cmd{\@nameauth@IdxDebugfalse} and \cmd{\@nameauth@LongIdxDebugfalse}, we produce the output of \cmd{\ShowPattern}.
+%
+% Otherwise we locally delete any tag and xref control sequences as needed. They will be restored when the scope ends. If \cmd{\ShowIdxPageref} set \cmd{\@nameauth@IdxDebugtrue} and \cmd{\@nameauth@LongIdxDebugtrue} we produce a full index entry that shows all the tags and the ``actual'' character as well as the name. If \cmd{\ShowIdxPageref*} set \cmd{\@nameauth@IdxDebugtrue} we produce a short index entry that shows only the name.
%
+% \begin{macrocode}
+ \@nameauth@Choice%
+% \end{macrocode}
+% Non-Western names, current syntax.
+% \begin{macrocode}
+ {%
+ \unless\if@nameauth@IdxDebug
+ \@nameauth@csb%
+ \else
+ \csundef{\@nameauth@csb!PN}%
+ \unless\if@nameauth@LongIdxDebug
+ \csundef{\@nameauth@csb!PRE}%
+ \csundef{\@nameauth@csb!TAG}%
+ \fi
+ \IndexName[#1]{#2}[#3]%
+ \fi
+ }%
+% \end{macrocode}
+% Non-Western names, obsolete syntax.
+% \begin{macrocode}
+ {%
+ \unless\if@nameauth@IdxDebug
+ \@nameauth@csbc%
+ \else
+ \csundef{\@nameauth@csbc!PN}%
+ \unless\if@nameauth@LongIdxDebug
+ \csundef{\@nameauth@csbc!PRE}%
+ \csundef{\@nameauth@csbc!TAG}%
+ \fi
+ \IndexName[#1]{#2}[#3]%
+ \fi
+ }%
+% \end{macrocode}
+% Western names.
+% \begin{macrocode}
+ {%
+ \unless\if@nameauth@IdxDebug
+ \@nameauth@csab%
+ \else
+ \csundef{\@nameauth@csab!PN}%
+ \unless\if@nameauth@LongIdxDebug
+ \csundef{\@nameauth@csab!PRE}%
+ \csundef{\@nameauth@csab!TAG}%
+ \fi
+ \IndexName[#1]{#2}[#3]%
+ \fi
+ }%
+% \end{macrocode}
+% We close the scope and reset the flags.
+% \begin{macrocode}
+ \endgroup%
+ \global\@nameauth@IdxDebugfalse%
+ \global\@nameauth@LongIdxDebugfalse%
+}
+% \end{macrocode}
+% \end{macro}
+% \newpage
+%
+% \noindent{\normalsize\bfseries Core Name Engine}
% \begin{macro}{\@nameauth@Name}
-% \changes{0.85}{2012/02/05}{Hide commas}
-% \changes{1.5}{2013/02/22}{Reversing\,/\,caps}
+% \changes{1.5}{2013/02/22}{Reversing/caps}
% \changes{2.0}{2015/11/11}{Trim spaces; fix tags}
% \changes{2.1}{2015/11/24}{Fix Unicode}
-% \changes{2.3}{2016/01/05}{Internal}
+% \changes{2.3}{2016/01/05}{Now internal}
% \changes{2.4}{2016/03/15}{Set token regs}
% \changes{2.41}{2016/03/17}{Fix token regs}
% \changes{2.5}{2016/04/06}{Fix old syntax}
@@ -5460,7 +6881,7 @@ the README.txt or README for more information.
% \end{macrocode}
% Both \cmd{\@nameauth@Name} and \cmd{\AKA} engage the lock below, preventing a stack overflow. Tell the formatting mechanism that it is being called from \cmd{\@nameauth@Name}.
% \begin{macrocode}
- \if@nameauth@BigLock\@nameauth@Locktrue\fi
+ \if@nameauth@BigLock \@nameauth@Locktrue\fi
\unless\if@nameauth@Lock
\@nameauth@Locktrue%
\@nameauth@InNametrue%
@@ -5488,277 +6909,169 @@ the README.txt or README for more information.
\fi
\else
% \end{macrocode}
-% Delete\,/\,create name cseq if directed. If the delete flag is set, the create flag is ignored. Ensure that names are printed in horizontal mode. Wrap the name with two index entries in case a page break occurs between name elements.
+% Create or delete name cseq if directed, with deletion override. Ensure that names are printed in horizontal mode. Wrap the name with two index entries in case a page break occurs between name elements.
% \begin{macrocode}
- \if@nameauth@Forget
- \ForgetName[#1]{#2}[#3]%
- \else
- \if@nameauth@Subvert
- \SubvertName[#1]{#2}[#3]%
- \fi
- \fi
+ \if@nameauth@Subvert \SubvertName[#1]{#2}[#3]\fi
+ \if@nameauth@Forget \ForgetName[#1]{#2}[#3]\fi
\leavevmode\hbox{}%
- \unless\if@nameauth@SkipIndex\IndexName[#1]{#2}[#3]\fi
+ \unless\if@nameauth@SkipIndex \IndexName[#1]{#2}[#3]\fi
\if@nameauth@MainFormat
- \@nameauth@Parse[#1]{#2}[#3]{!MN}%
+ \@nameauth@Parse{#1}{#2}{#3}{!MN}%
\else
- \@nameauth@Parse[#1]{#2}[#3]{!NF}%
+ \@nameauth@Parse{#1}{#2}{#3}{!NF}%
\fi
- \unless\if@nameauth@SkipIndex\IndexName[#1]{#2}[#3]\fi
+ \unless\if@nameauth@SkipIndex \IndexName[#1]{#2}[#3]\fi
% \end{macrocode}
-% Reset all the ``per name'' Boolean values. The default is global.
+% Reset all the ``per name'' Boolean values after printing a name. The default is global.
% \begin{macrocode}
- \if@nameauth@OldReset
- \@nameauth@SkipIndexfalse%
- \@nameauth@Forgetfalse%
- \@nameauth@Subvertfalse%
- \@nameauth@NBSPfalse%
- \@nameauth@NBSPXfalse%
- \@nameauth@DoCapsfalse%
- \@nameauth@Accentfalse%
- \@nameauth@AllThisfalse%
- \@nameauth@ShowCommafalse%
- \@nameauth@NoCommafalse%
- \@nameauth@RevThisfalse%
- \@nameauth@RevThisCommafalse%
- \@nameauth@ShortSNNfalse%
- \@nameauth@EastFNfalse%
- \else
- \global\@nameauth@SkipIndexfalse%
- \global\@nameauth@Forgetfalse%
- \global\@nameauth@Subvertfalse%
- \global\@nameauth@NBSPfalse%
- \global\@nameauth@NBSPXfalse%
- \global\@nameauth@DoCapsfalse%
- \global\@nameauth@Accentfalse%
- \global\@nameauth@AllThisfalse%
- \global\@nameauth@ShowCommafalse%
- \global\@nameauth@NoCommafalse%
- \global\@nameauth@RevThisfalse%
- \global\@nameauth@RevThisCommafalse%
- \global\@nameauth@ShortSNNfalse%
- \global\@nameauth@EastFNfalse%
- \fi
+ \@nameauth@Flags%
\fi
\@nameauth@Lockfalse%
\@nameauth@InNamefalse%
% \end{macrocode}
-% Close the ``locked'' branch.
+% Close the ``locked'' branch and complete the full stop detection and removal. This conditional statement must be on one line.
% \begin{macrocode}
\fi
-% \end{macrocode}
-% Call the full stop detection.
-% \begin{macrocode}
\if@nameauth@Punct\expandafter\@nameauth@CheckDot\fi
}
% \end{macrocode}
% \end{macro}
%
+% \noindent{\normalsize\bfseries Core Name Engine: Syntactic Element Layer}
% \begin{macro}{\@nameauth@Parse}
% \changes{3.0}{2016/10/26}{Added}
% \changes{3.1}{2017/01/13}{New workflow, caps}
% \changes{3.2}{2017/03/22}{Fix alt. format, affixes, use \cmd{\MakeUppercase}}
-% Parse and print a name in the text. The final required argument tells us which naming system we are in (Section~\ref{sec:NamePatterns}). Both \cmd{\@nameauth@Name} and \cmd{\AKA} call this parser.
+% \changes{3.5}{2020/11/23}{Global token regs, optimize logic, fix namespace}
+% Parse and print a name in the text. The final required argument tells us which naming system we are in (Section~\ref{sec:NamePatterns}). Both \cmd{\@nameauth@Name} and \cmd{\AKA} call this parser, which only works in a locked state.
% \begin{macrocode}
-\newcommandx*\@nameauth@Parse[4][1=\@empty, 3=\@empty]
+\newcommand\@nameauth@Parse[4]
{%
- \if@nameauth@BigLock\@nameauth@Lockfalse\fi
+ \if@nameauth@BigLock \@nameauth@Lockfalse\fi
\if@nameauth@Lock
- \let\ex\expandafter%
-% \end{macrocode}
-% We want these arguments to expand to \cmd{\@empty} (or not) when we test them.
-% \begin{macrocode}
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\rootb{\@nameauth@Root{#2}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \protected@edef\argc{\trim@spaces{#3}}%
-% \end{macrocode}
-% \newpage
-% \noindent If global caps. reversing, and commas are true, set the local flags true.
-% \begin{macrocode}
- \if@nameauth@AllCaps\@nameauth@AllThistrue\fi
- \if@nameauth@RevAll\@nameauth@RevThistrue\fi
- \if@nameauth@RevAllComma\@nameauth@RevThisCommatrue\fi
-% \end{macrocode}
-% Make (usually) unique control sequence values from the name arguments.
-% \begin{macrocode}
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
% \end{macrocode}
% Make token register copies of the current name args to be available for the hook macros.
% \begin{macrocode}
- \@nameauth@toksa\expandafter{#1}%
- \@nameauth@toksb\expandafter{#2}%
- \@nameauth@toksc\expandafter{#3}%
-% \end{macrocode}
-% Implement capitalization on demand in the body text if not in Continental mode.
-% \begin{macrocode}
- \if@nameauth@DoCaps
- \let\carga\arga%
- \let\crootb\rootb%
- \let\csuffb\suffb%
- \let\cargc\argc%
- \unless\if@nameauth@AltFormat
+ \if@nameauth@OldToks
+ \@nameauth@toksa\expandafter{#1}%
+ \@nameauth@toksb\expandafter{#2}%
+ \@nameauth@toksc\expandafter{#3}%
+ \else
+ \global\@nameauth@toksa\expandafter{#1}%
+ \global\@nameauth@toksb\expandafter{#2}%
+ \global\@nameauth@toksc\expandafter{#3}%
+ \fi
% \end{macrocode}
-% We test the first optarg for active Unicode characters. Then we capitalize the first letter.
+% If global caps. reversing, and commas are true, set the per-name flags true.
% \begin{macrocode}
- \unless\ifx\arga\@empty
- \def\test{#1}%
- \ex\@nameauth@UTFtest\ex{\test}%
- \if@nameauth@UTF
- \ex\def\ex\carga\ex{\ex\@nameauth@CapUTF\ex{\test}}%
- \else
- \ex\def\ex\carga\ex{\ex\@nameauth@Cap\ex{\test}}%
- \fi
- \fi
+ \if@nameauth@AllCaps \@nameauth@AllThistrue\fi
+ \if@nameauth@RevAll \@nameauth@RevThistrue\fi
+ \if@nameauth@RevAllComma \@nameauth@RevThisCommatrue\fi
% \end{macrocode}
-% We test the root surname for active Unicode characters. Then we capitalize the first letter.
+% Now we enter a local scope where we can use simple control strings without
+% needing to worry about collisions. We process and load the arguments into the appropriate macros.
% \begin{macrocode}
- \def\test{#2}%
- \ex\@nameauth@UTFtest\ex{\test}%
- \if@nameauth@UTF
- \ex\def\ex\crootb\ex{\ex\@nameauth@CapUTF\ex{\rootb}}%
- \else
- \ex\def\ex\crootb\ex{\ex\@nameauth@Cap\ex{\rootb}}%
- \fi
+ \begingroup%
+ \def\@nameauth@InParser{}%
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
% \end{macrocode}
-% We test the suffix for active Unicode characters. Then we capitalize the first letter.
+% Copy the protected control sequences to local, unprotected ones for backward compatibility and readability.
% \begin{macrocode}
- \unless\ifx\suffb\@empty
- \def\test{#2}%
- \ex\@nameauth@UTFtestS\ex{\test}%
- \protected@edef\test{\@nameauth@GetSuff{#2}}%
- \if@nameauth@UTF
- \protected@edef\test{\@nameauth@Suffix{#2}}%
- \ex\def\ex\csuffb\ex{\ex\@nameauth@CapUTF\ex{\test}}%
- \else
- \edef\test{\@nameauth@Suffix{#2}}%
- \ex\def\ex\csuffb\ex{\ex\@nameauth@Cap\ex{\test}}%
- \fi
- \fi
+ \let\arga\@nameauth@A%
+ \let\rootb\@nameauth@B%
+ \let\suffb\@nameauth@SB%
+ \let\argc\@nameauth@C%
% \end{macrocode}
-% We test the final optarg for active Unicode characters. Then we capitalize the first letter.
+% Capitalization on demand in the body text if not in alternate formatting.
% \begin{macrocode}
- \unless\ifx\argc\@empty
- \def\test{#3}%
- \ex\@nameauth@UTFtest\ex{\test}%
- \if@nameauth@UTF
- \ex\def\ex\cargc\ex{\ex\@nameauth@CapUTF\ex{\test}}%
- \else
- \ex\def\ex\cargc\ex{\ex\@nameauth@Cap\ex{\test}}%
- \fi
- \fi
+ \if@nameauth@DoCaps
+ \@nameauth@CapArgs{#1}{#2}{#3}%
\fi
- \let\arga\carga%
- \let\rootb\crootb%
- \let\suffb\csuffb%
- \let\argc\cargc%
- \fi
% \end{macrocode}
-% We capitalize the entire surname when desired; different from above.
+% We capitalize the entire surname when desired; different from above and overrides it.
% \begin{macrocode}
- \if@nameauth@AllThis
- \protected@edef\rootb{\MakeUppercase{\@nameauth@Root{#2}}}%
- \fi
+ \if@nameauth@AllThis
+ \protected@edef\rootb%
+ {\MakeUppercase{\@nameauth@Root{#2}}}%
+ \fi
% \end{macrocode}
% Use non-breaking spaces and commas as desired.
% \begin{macrocode}
- \edef\Space{\space}%
- \edef\SpaceX{\space}%
- \if@nameauth@NBSP\edef\Space{\nobreakspace}\fi
- \if@nameauth@NBSPX\edef\SpaceX{\nobreakspace}\fi
- \unless\ifx\arga\@empty
- \if@nameauth@AlwaysComma
- \edef\Space{,\space}%
- \if@nameauth@NBSP\edef\Space{,\nobreakspace}\fi
- \fi
- \if@nameauth@ShowComma
- \edef\Space{,\space}%
- \if@nameauth@NBSP\edef\Space{,\nobreakspace}\fi
- \fi
- \if@nameauth@NoComma
- \edef\Space{\space}%
- \if@nameauth@NBSP\edef\Space{\nobreakspace}\fi
- \fi
- \fi
+ \@nameauth@AddPunct%
% \end{macrocode}
% We parse names by attaching ``meaning'' to patterns of macro arguments primarily via \cmd{\FNN} and \cmd{\SNN}. Then we call the name printing macros, based on the optional arguments.
% \begin{macrocode}
- \let\SNN\rootb%
- \ifx\arga\@empty
- \ifx\argc\@empty
+ \let\SNN\rootb%
+ \@nameauth@Choice%
% \end{macrocode}
-% When \cmd{\arga}, \cmd{\argc}, and \cmd{\suffb} are empty, we have a mononym. When \cmd{\suffb} is not empty, we have a ``native'' Eastern name or non-Western name.
+% Non-Western names, current syntax.
+% We test \cmd{\argc} and \cmd{\suffb} as needed.
% \begin{macrocode}
- \let\FNN\suffb%
- \let\SNN\rootb%
- \@nameauth@NonWest{\csb#4}%
- \else
+ {%
+ \ifx\argc\@empty
+ \let\FNN\suffb%
+ \else
+ \let\FNN\argc%
+ \fi
+ \@nameauth@NonWest{\@nameauth@csb#4}%
+ \@nameauth@MakeCS{\@nameauth@csb#4}%
+ }%
% \end{macrocode}
-% When \cmd{\arga} and \cmd{\suffb} are empty, but \cmd{\argc} is not, we have the older syntax. When \cmd{\arga} is empty, but \cmd{\argc} and \cmd{\suffb} are not, we have alternate names for non-Western names.
+% Non-Western names, obsolete syntax. Here \cmd{\argc} is significant.
% \begin{macrocode}
- \ifx\suffb\@empty
- \let\FNN\argc%
- \let\SNN\rootb%
- \@nameauth@NonWest{\csbc#4}%
+ {%
+ \let\FNN\argc%
+ \@nameauth@NonWest{\@nameauth@csbc#4}%
+ \@nameauth@MakeCS{\@nameauth@csbc#4}%
+ }%
+% \end{macrocode}
+% Western names.
+% We test for \cmd{\argc} and swap it for \cmd{\arga} and account for \cmd{\suffb}.
+% \begin{macrocode}
+ {%
+ \ifx\argc\@empty
+ \let\FNN\arga%
\else
\let\FNN\argc%
- \let\SNN\rootb%
- \@nameauth@NonWest{\csb#4}%
\fi
- \fi
- \else
+ \unless\ifx\suffb\@empty
+ \def\SNN{\rootb\Space\suffb}%
+ \if@nameauth@ShortSNN
+ \let\SNN\rootb%
+ \fi
+ \fi
+ \@nameauth@West{\@nameauth@csab#4}%
+ \@nameauth@MakeCS{\@nameauth@csab#4}%
+ }%
% \end{macrocode}
-% When \cmd{\arga} is not empty, we have either a Western name or a ``non-native'' Eastern name. When \cmd{\argc} is not empty, we use alternate names. When \cmd{\suffb} is not empty we use suffixed forms.
+% We end the local group and reset the flags for name forms here.
% \begin{macrocode}
- \ifx\argc\@empty
- \let\FNN\arga%
- \else
- \let\FNN\argc%
- \fi
- \unless\ifx\suffb\@empty
- \def\SNN{\rootb\Space\suffb}%
- \if@nameauth@ShortSNN\let\SNN\rootb\fi
- \fi
- \@nameauth@West{\csab#4}%
+ \endgroup%
+ \if@nameauth@OldReset
+ \@nameauth@FullNamefalse%
+ \@nameauth@FirstNamefalse%
+ \@nameauth@FirstFormatfalse%
+ \else
+ \global\@nameauth@FullNamefalse%
+ \global\@nameauth@FirstNamefalse%
+ \global\@nameauth@FirstFormatfalse%
\fi
\fi
}
% \end{macrocode}
% \end{macro}
%
+% \noindent{\normalsize\bfseries Core Name Engine: Name Display Layer}
% \begin{macro}{\@nameauth@NonWest}
% \changes{3.0}{2016/10/26}{Added}
% \changes{3.02}{2016/11/01}{Restrict \cmd{\ForceFN}}
% \changes{3.3}{2020/02/20}{global flag reset}
-% Print non-Western names from \cmd{\@nameauth@name} and \cmd{\AKA}. We inherit internal macros from the parser and do nothing apart from the locked state.
+% Arrange forms of non-Western names. We inherit macros from the parser and only use this macro in the local scope of the parser.
% \begin{macrocode}
\newcommand*\@nameauth@NonWest[1]
{%
- \if@nameauth@BigLock\@nameauth@Lockfalse\fi
- \if@nameauth@Lock
- \unless\ifcsname#1\endcsname
- \@nameauth@FirstFormattrue%
- \fi
- \if@nameauth@InAKA
- \if@nameauth@AltAKA
- \if@nameauth@OldAKA\@nameauth@EastFNtrue\fi
- \@nameauth@FullNamefalse%
- \@nameauth@FirstNametrue%
- \else
- \@nameauth@FullNametrue%
- \@nameauth@FirstNamefalse%
- \fi
- \else
- \unless\ifcsname#1\endcsname
- \@nameauth@FullNametrue%
- \@nameauth@FirstNamefalse%
- \fi
- \fi
- \if@nameauth@FirstName
- \@nameauth@FullNamefalse%
- \fi
+ \ifdefined\@nameauth@InParser
+ \@nameauth@Form{#1}%
\ifx\FNN\@empty
\@nameauth@Hook{\SNN}%
\else
@@ -5780,19 +7093,6 @@ the README.txt or README for more information.
\fi
\fi
\fi
- \unless\ifcsname#1\endcsname
- \unless\if@nameauth@InAKA\csgdef{#1}{}\fi
- \fi
-% \end{macrocode}
-% We have to reset these flags here because both the naming and cross-referencing macros use the parser.
-% \begin{macrocode}
- \if@nameauth@OldReset
- \@nameauth@FullNamefalse%
- \@nameauth@FirstNamefalse%
- \else
- \global\@nameauth@FullNamefalse%
- \global\@nameauth@FirstNamefalse%
- \fi
\fi
}
% \end{macrocode}
@@ -5801,32 +7101,12 @@ the README.txt or README for more information.
% \begin{macro}{\@nameauth@West}
% \changes{3.0}{2016/10/26}{Added}
% \changes{3.3}{2020/02/20}{global flag reset}
-% Print Western names and ``non-native'' Eastern names from \cmd{\@nameauth@name} and \cmd{\AKA}. We inherit internal macros from the parser and do nothing apart from the locked state.
+% Arrange forms of Western names and ``non-native'' Eastern names. We inherit macros from the parser and only use this macro in the local scope of the parser.
% \begin{macrocode}
\newcommand*\@nameauth@West[1]
{%
- \if@nameauth@BigLock\@nameauth@Lockfalse\fi
- \if@nameauth@Lock
- \unless\ifcsname#1\endcsname
- \@nameauth@FirstFormattrue%
- \fi
- \if@nameauth@InAKA
- \if@nameauth@AltAKA
- \@nameauth@FullNamefalse%
- \@nameauth@FirstNametrue%
- \else
- \@nameauth@FullNametrue%
- \@nameauth@FirstNamefalse%
- \fi
- \else
- \unless\ifcsname#1\endcsname
- \@nameauth@FullNametrue%
- \@nameauth@FirstNamefalse%
- \fi
- \fi
- \if@nameauth@FirstName
- \@nameauth@FullNamefalse%
- \fi
+ \ifdefined\@nameauth@InParser
+ \@nameauth@Form{#1}%
\if@nameauth@FullName
\if@nameauth@RevThis
\@nameauth@Hook{\SNN\SpaceX\FNN}%
@@ -5845,230 +7125,165 @@ the README.txt or README for more information.
\@nameauth@Hook{\rootb}%
\fi
\fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@nameauth@Form}
+% \changes{3.5}{2020/11/23}{Added}
+% Set up the flags per the formatting rules for first, subsequent, long, and short uses. We only use this macro in the local scope of the parser.
+% \begin{macrocode}
+\newcommand*\@nameauth@Form[1]
+{%
+ \ifdefined\@nameauth@InParser
+% \end{macrocode}
+% If the name does not exist yet or if the \texttt{alwaysformat} option is used, force first-use formatting, force a long name, and inhibit a short name.
+% \begin{macrocode}
\unless\ifcsname#1\endcsname
- \unless\if@nameauth@InAKA\csgdef{#1}{}\fi
+ \@nameauth@FirstFormattrue%
+ \@nameauth@FullNametrue%
+ \@nameauth@FirstNamefalse%
+ \else
+ \if@nameauth@AlwaysFormat \@nameauth@FirstFormattrue\fi
\fi
% \end{macrocode}
-% We have to reset these flags here because both the naming and cross-referencing macros use the parser.
+% If we are not in \cmd{\AKA}, if a short name form is desired, inhibit a long form.
% \begin{macrocode}
- \if@nameauth@OldReset
- \@nameauth@FullNamefalse%
- \@nameauth@FirstNamefalse%
+ \unless\if@nameauth@InAKA
+ \if@nameauth@FirstName \@nameauth@FullNamefalse\fi
\else
- \global\@nameauth@FullNamefalse%
- \global\@nameauth@FirstNamefalse%
+% \end{macrocode}
+% If we are in \cmd{\AKA} use special formatting rules. \cmd{\AKA*} acts like \cmd{\FName}, while \cmd{\AKA} acts like \cmd{\Name*}. Both prefer using the subsequent-use hooks unless the \texttt{formatAKA} option or the \texttt{alwaysformat} option are used.
+% \begin{macrocode}
+ \if@nameauth@AltAKA
+ \if@nameauth@OldAKA \@nameauth@EastFNtrue\fi
+ \@nameauth@FullNamefalse%
+ \@nameauth@FirstNametrue%
+ \else
+ \@nameauth@FullNametrue%
+ \@nameauth@FirstNamefalse%
+ \fi
+ \unless\if@nameauth@AlwaysFormat
+ \unless\if@nameauth@AKAFormat
+ \@nameauth@FirstFormatfalse%
+ \fi
+ \fi
\fi
\fi
}
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Format Hook Dispatcher}
+% \noindent{\normalsize\bfseries Core Name Engine: Format Hook Dispatcher}
% \begin{macro}{\@nameauth@Hook}
% \changes{2.4}{2016/03/15}{Current form}
% \changes{2.5}{2016/04/06}{Improve hooks}
% \changes{3.0}{2016/10/26}{Fix punct. detection}
-% Flags help the dispatcher invoke the correct formatting hooks. The flags control which hook is called (first\,/\,subsequent use, name type). The first set of tests handles formatting within \cmd{\AKA}. The second set of tests handles regular name formatting.
+% \changes{3.5}{2020/11/23} {Fix namespace}
+% Boolean flags control which hook is called (first/subsequent use, name type). We only use this macro in the local scope of the parser.
% \begin{macrocode}
\newcommand*\@nameauth@Hook[1]
{%
- \if@nameauth@BigLock\@nameauth@Lockfalse\fi
- \if@nameauth@Lock
+ \ifdefined\@nameauth@InParser
+% \end{macrocode}
+% We tell the formatting hooks that they are in the hook dispatcher to enable alternate formatting. We test the printed name form to see if it has a trailing full stop.
+% \begin{macrocode}
\@nameauth@InHooktrue%
\protected@edef\test{#1}%
\expandafter\@nameauth@TestDot\expandafter{\test}%
- \if@nameauth@InAKA
- \if@nameauth@AlwaysFormat
- \@nameauth@FirstFormattrue%
- \else
- \unless\if@nameauth@AKAFormat
- \@nameauth@FirstFormatfalse\fi
- \fi
- \if@nameauth@MainFormat
- \if@nameauth@FirstFormat
- \bgroup\NamesFormat{#1}\egroup%
- \else
- \bgroup\MainNameHook{#1}\egroup%
- \fi
+ \if@nameauth@MainFormat
+% \end{macrocode}
+% We use the formatting hooks for the main-matter system.
+% \begin{macrocode}
+ \if@nameauth@FirstFormat
+ \bgroup\NamesFormat{#1}\egroup%
\else
- \if@nameauth@FirstFormat
- \bgroup\FrontNamesFormat{#1}\egroup%
- \else
- \bgroup\FrontNameHook{#1}\egroup%
- \fi
+ \bgroup\MainNameHook{#1}\egroup%
\fi
\else
- \if@nameauth@AlwaysFormat
- \@nameauth@FirstFormattrue%
- \fi
- \if@nameauth@MainFormat
- \if@nameauth@FirstFormat
- \bgroup\NamesFormat{#1}\egroup%
- \else
- \bgroup\MainNameHook{#1}\egroup%
- \fi
+% \end{macrocode}
+% We use the formatting hooks for the front-matter system.
+% \begin{macrocode}
+ \if@nameauth@FirstFormat
+ \bgroup\FrontNamesFormat{#1}\egroup%
\else
- \if@nameauth@FirstFormat
- \bgroup\FrontNamesFormat{#1}\egroup%
- \else
- \bgroup\FrontNameHook{#1}\egroup%
- \fi
+ \bgroup\FrontNameHook{#1}\egroup%
\fi
\fi
% \end{macrocode}
-% We have to reset this flag here because both the naming and cross-referencing macros use the parser.
+% We tell the formatting hooks that they are not in the hook dispatcher.
% \begin{macrocode}
- \if@nameauth@OldReset
- \@nameauth@FirstFormatfalse%
- \else
- \global\@nameauth@FirstFormatfalse%
- \fi
\@nameauth@InHookfalse%
\fi
}
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Indexing Internals}
+% \noindent{\normalsize\bfseries Indexing Internals: Entry Formatter}
% \begin{macro}{\@nameauth@Index}
% \changes{0.94}{2012/02/15}{Added}
% \changes{2.0}{2015/11/11}{New tagging}
-% \changes{3.3}{2020/02/20}{Tags support hyperref}
-% If the indexing flag is true, create an index entry, otherwise do nothing. Add tags automatically if they exist.
+% \changes{3.3}{2020/02/20}{Support hyperref}
+% \changes{3.5}{2020/11/23}{Fix namespace}
+% This is the core index mechanism. If the indexing flag is true, create an index entry, otherwise do nothing. Add any tags automatically if they exist.
% \begin{macrocode}
\newcommand*\@nameauth@Index[2]
{%
- \let\ex\expandafter%
\if@nameauth@DoIndex
+% \end{macrocode}
+% If an index tag exists for the entry, get it. Also create a short version of the tag without any vertical bar or trailing macro. If we are creating a cross-reference, use the short tag, otherwise use the long tag.
+% \begin{macrocode}
\ifcsname#1!TAG\endcsname
- \protected@edef\Tag{\csname#1!TAG\endcsname}%
- \ex\def\ex\ShortTag\ex{\ex\@nameauth@TrimTag\ex{\Tag}}%
+ \protected@edef\@nameauth@Tag{\csname#1!TAG\endcsname}%
+ \expandafter\def\expandafter\@nameauth@ShortTag\expandafter{%
+ \expandafter\@nameauth@TrimTag\expandafter{\@nameauth@Tag}}%
+% \end{macrocode}
+% Create entries with a sorting tag and an info tag.
+% \begin{macrocode}
\ifcsname#1!PRE\endcsname
- \protected@edef\Pre{\csname#1!PRE\endcsname}%
+ \protected@edef\@nameauth@Pre{\csname#1!PRE\endcsname}%
\if@nameauth@Xref
- \protected@edef\Entry{\Pre#2\ShortTag}%
+ \protected@edef\@nameauth@IdxEntry%
+ {\@nameauth@Pre#2\@nameauth@ShortTag}%
\else
- \protected@edef\Entry{\Pre#2\Tag}%
+ \protected@edef\@nameauth@IdxEntry%
+ {\@nameauth@Pre#2\@nameauth@Tag}%
\fi
\else
+% \end{macrocode}
+% Create entries with just an info tag.
+% \begin{macrocode}
\if@nameauth@Xref
- \protected@edef\Entry{#2\ShortTag}%
+ \protected@edef\@nameauth@IdxEntry%
+ {#2\@nameauth@ShortTag}%
\else
- \protected@edef\Entry{#2\Tag}%
+ \protected@edef\@nameauth@IdxEntry%
+ {#2\@nameauth@Tag}%
\fi
\fi
\else
+% \end{macrocode}
+% Create entries with just a sorting tag.
+% \begin{macrocode}
\ifcsname#1!PRE\endcsname
- \protected@edef\Pre{\csname#1!PRE\endcsname}%
- \protected@edef\Entry{\Pre#2}%
+ \protected@edef\@nameauth@Pre{\csname#1!PRE\endcsname}%
+ \protected@edef\@nameauth@IdxEntry{\@nameauth@Pre#2}%
\else
- \protected@edef\Entry{#2}%
+ \protected@edef\@nameauth@IdxEntry{#2}%
\fi
\fi
- \ex\index\ex{\Entry}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@nameauth@Actual}
-% \changes{2.0}{2015/11/11}{Added}
-% This sets the ``actual'' character used by \textsf{nameauth} for index sorting.
-% \begin{macrocode}
-\newcommand*\@nameauth@Actual{@}
% \end{macrocode}
-% \end{macro}
-%
-% \noindent{\large\bfseries Debugging Help}
-% \begin{macro}{\@nameauth@Debug}
-% \changes{3.3}{2020/02/20}{added}
-% This Swiss-army knife for debugging shows name control sequence patterns, full index entries with tags, and short index entries with just the name. Other macros call it to get the desired info. We set up a local scope, redefine \cmd{\index} to print an argument in the text, force indexing to occur, and ignore whether we are working with xrefs.
-% \begin{macrocode}
-\newcommandx*\@nameauth@Debug[3][1=\@empty, 3=\@empty]
-{%
- \bgroup%
- \def\index##1{##1}%
- \@nameauth@DoIndextrue%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
- \@nameauth@Error{#2}{macro \string\@nameauth@Debug}%
-% \end{macrocode}
-% We interleave printing name patterns (\cmd{\ShowPattern}), printing full index entries as if they were page refs (\cmd{\ShowIdxPageref*}), and printing short index entries (\cmd{\ShowIdxPageref}). Since we are in a local scope we delete the tag and xref control sequences as needed. They will be restored when the scope ends. We do not care about xrefs because we just want to see what happens with the name. We can always go to the \texttt{idx} and \texttt{ind} files if needed.
+% Create entries with no tag.
% \begin{macrocode}
- \ifx\arga\@empty
- \ifx\argc\@empty
- \ifdefined\ShortIdxEntry
- \csundef{\csb!PRE}%
- \csundef{\csb!TAG}%
- \csundef{\csb!PN}%
- \IndexName[#1]{#2}[#3]%
- \else
- \ifdefined\LongIdxEntry
- \csundef{\csb!PN}%
- \IndexName[#1]{#2}[#3]%
- \else
- \csb%
- \fi
- \fi
- \else
- \ifx\suffb\@empty
- \ifdefined\ShortIdxEntry
- \csundef{\csbc!PRE}%
- \csundef{\csbc!TAG}%
- \csundef{\csbc!PN}%
- \IndexName[#1]{#2}[#3]%
- \else
- \ifdefined\LongIdxEntry
- \csundef{\csbc!PN}%
- \IndexName[#1]{#2}[#3]%
- \else
- \csbc%
- \fi
- \fi
- \else
- \ifdefined\ShortIdxEntry
- \csundef{\csb!PRE}%
- \csundef{\csb!TAG}%
- \csundef{\csb!PN}%
- \IndexName[#1]{#2}[#3]%
- \else
- \ifdefined\LongIdxEntry
- \csundef{\csb!PN}%
- \IndexName[#1]{#2}[#3]%
- \else
- \csb%
- \fi
- \fi
- \fi
- \fi
- \else
- \ifdefined\ShortIdxEntry
- \csundef{\csab!PRE}%
- \csundef{\csab!TAG}%
- \csundef{\csab!PN}%
- \IndexName[#1]{#2}[#3]%
- \else
- \ifdefined\LongIdxEntry
- \csundef{\csab!PN}%
- \IndexName[#1]{#2}[#3]%
- \else
- \csab%
- \fi
- \fi
- \fi
- \global\undef{\LongIdxEntry}%
- \global\undef{\ShortIdxEntry}%
- \egroup%
+ \expandafter\NameauthIndex\expandafter{\@nameauth@IdxEntry}%
+ \fi
}
% \end{macrocode}
% \end{macro}
%
% \subsection[Prefix Macros]{User Interface Macros: Prefix Macros}
-% \noindent{\large\bfseries Syntactic Formatting\,---\,Capitalization}
+% \noindent{\normalsize\bfseries Syntactic Formatting\,---\,Capitalization}
% \begin{macro}{\CapThis}
% \changes{0.94}{2012/02/15}{Added}
% Tells the root capping macro to cap the first character of all name elements.
@@ -6081,8 +7296,11 @@ the README.txt or README for more information.
% \changes{2.1}{2015/11/24}{Added}
% Overrides the automatic test for active Unicode characters. This is a fall-back in case the automatic test for active Unicode characters fails.
% \begin{macrocode}
-\newcommand*\AccentCapThis%
- {\@nameauth@Accenttrue\@nameauth@DoCapstrue}
+\newcommand*\AccentCapThis
+{%
+ \@nameauth@Accenttrue%
+ \@nameauth@DoCapstrue%
+}
% \end{macrocode}
% \end{macro}
%
@@ -6110,7 +7328,7 @@ the README.txt or README for more information.
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Syntactic Formatting\,---\,Reversing}
+% \noindent{\normalsize\bfseries Syntactic Formatting\,---\,Reversing}
% \begin{macro}{\RevName}
% \changes{1.5}{2013/02/22}{Added}
% Reverse name order.
@@ -6143,41 +7361,40 @@ the README.txt or README for more information.
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Syntactic Formatting\,---\,Reversing with Commas}
+% \noindent{\normalsize\bfseries Syntactic Formatting\,---\,Reversing with Commas}
% \begin{macro}{\RevComma}
% \changes{1.5}{2013/02/22}{Added}
% Last name, comma, first name.
% \begin{macrocode}
-\newcommand*\RevComma%
- {\@nameauth@RevThisCommatrue}
+\newcommand*\RevComma{\@nameauth@RevThisCommatrue}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ReverseCommaInactive}
-% Turn off global ``last-name-comma-first.''
+% Turn off global ``last-name-comma-first''.
% \changes{1.5}{2013/02/22}{Added}
% \begin{macrocode}
-\newcommand*\ReverseCommaInactive%
- {\@nameauth@RevAllCommafalse}
+\newcommand*\ReverseCommaInactive{\@nameauth@RevAllCommafalse}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ReverseCommaActive}
-% Turn on global ``last-name-comma-first.'' Activates \cmd{\RevComma} for every name.
+% Turn on global ``last-name-comma-first''. Activates \cmd{\RevComma} for every name.
% \changes{1.5}{2013/02/22}{Added}
% \begin{macrocode}
-\newcommand*\ReverseCommaActive%
- {\@nameauth@RevAllCommatrue}
+\newcommand*\ReverseCommaActive{\@nameauth@RevAllCommatrue}
% \end{macrocode}
% \end{macro}
+% \newpage
%
-% \noindent{\large\bfseries Alternate Formatting}
+% \noindent{\normalsize\bfseries Alternate Formatting}
% \phantomsection\label{page:Hooks}
% \begin{macro}{\AltFormatActive}
% \changes{3.1}{2017/01/13}{Added}
% Turn on alternate formatting, engage the formatting macros.
% \begin{macrocode}
-\newcommand*\AltFormatActive{%
+\newcommand*\AltFormatActive
+{%
\global\@nameauth@AltFormattrue%
\global\@nameauth@DoAlttrue%
}
@@ -6188,7 +7405,8 @@ the README.txt or README for more information.
% \changes{3.1}{2017/01/13}{Added}
% Turn on alternate formatting, disengage the formatting macros.
% \begin{macrocode}
-\WithSuffix{\newcommand*}\AltFormatActive*{%
+\WithSuffix{\newcommand*}\AltFormatActive*
+{%
\global\@nameauth@AltFormattrue%
\global\@nameauth@DoAltfalse%
}
@@ -6199,7 +7417,8 @@ the README.txt or README for more information.
% Turn off alternate formatting altogether.
% \changes{3.1}{2017/01/13}{Added}
% \begin{macrocode}
-\newcommand*\AltFormatInactive{%
+\newcommand*\AltFormatInactive
+{%
\global\@nameauth@AltFormatfalse%
\global\@nameauth@DoAltfalse%
}
@@ -6210,9 +7429,12 @@ the README.txt or README for more information.
% Locally turn on alternate formatting.
% \changes{3.1}{2017/01/13}{Added}
% \begin{macrocode}
-\newcommand*\AltOn{%
+\newcommand*\AltOn
+{%
\if@nameauth@InHook
- \if@nameauth@AltFormat\@nameauth@DoAlttrue\fi
+ \if@nameauth@AltFormat
+ \@nameauth@DoAlttrue%
+ \fi
\fi
}
% \end{macrocode}
@@ -6222,9 +7444,12 @@ the README.txt or README for more information.
% Locally turn off alternate formatting.
% \changes{3.1}{2017/01/13}{Added}
% \begin{macrocode}
-\newcommand*\AltOff{%
+\newcommand*\AltOff
+{%
\if@nameauth@InHook
- \if@nameauth@AltFormat\@nameauth@DoAltfalse\fi
+ \if@nameauth@AltFormat
+ \@nameauth@DoAltfalse%
+ \fi
\fi
}
% \end{macrocode}
@@ -6235,10 +7460,16 @@ the README.txt or README for more information.
% \changes{3.2}{2017/03/22}{Use \cmd{\MakeUppercase}}
% Alternate discretionary capping macro triggered by \cmd{\CapThis}.
% \begin{macrocode}
-\newcommand*\AltCaps[1]{%
+\newcommand*\AltCaps[1]
+{%
\if@nameauth@InHook
- \if@nameauth@DoCaps\MakeUppercase{#1}\else#1\fi
- \else#1%
+ \if@nameauth@DoCaps
+ \MakeUppercase{#1}%
+ \else
+ #1%
+ \fi
+ \else
+ #1%
\fi
}
% \end{macrocode}
@@ -6248,40 +7479,64 @@ the README.txt or README for more information.
% \changes{3.1}{2017/01/13}{Added}
% Alternate formatting macro: small caps when active.
% \begin{macrocode}
-\newcommand*\textSC[1]{%
- \if@nameauth@DoAlt\textsc{#1}\else#1\fi}
+\newcommand*\textSC[1]
+{%
+ \if@nameauth@DoAlt
+ \textsc{#1}%
+ \else
+ #1%
+ \fi
+}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\textUC}
% \changes{3.1}{2017/01/13}{Added}
% \changes{3.2}{2017/03/22}{Use \cmd{\MakeUppercase}}
% Alternate formatting macro: uppercase when active.
% \begin{macrocode}
-\newcommand*\textUC[1]{%
- \if@nameauth@DoAlt\MakeUppercase{#1}\else#1\fi}
+\newcommand*\textUC[1]
+{%
+ \if@nameauth@DoAlt
+ \MakeUppercase{#1}%
+ \else
+ #1%
+ \fi
+}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\textIT}
% \changes{3.1}{2017/01/13}{Added}
% Alternate formatting macro: italic when active.
% \begin{macrocode}
-\newcommand*\textIT[1]{%
- \if@nameauth@DoAlt\textit{#1}\else#1\fi}
+\newcommand*\textIT[1]
+{%
+ \if@nameauth@DoAlt
+ \textit{#1}%
+ \else
+ #1%
+ \fi
+}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\textBF}
% \changes{3.1}{2017/01/13}{Added}
% Alternate formatting macro: boldface when active.
% \begin{macrocode}
-\newcommand*\textBF[1]{%
- \if@nameauth@DoAlt\textbf{#1}\else#1\fi}
+\newcommand*\textBF[1]
+{%
+ \if@nameauth@DoAlt
+ \textbf{#1}%
+ \else
+ #1%
+ \fi
+}
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Syntactic Formatting\,---\,Affixes}
+% \noindent{\normalsize\bfseries Syntactic Formatting\,---\,Affixes}
% \begin{macro}{\ShowComma}
% \changes{1.4}{2012/07/24}{Added}
% Put comma between name and suffix one time.
@@ -6318,11 +7573,15 @@ the README.txt or README for more information.
% \changes{3.1}{2017/01/13}{Added}
% Use non-breaking spaces between name syntactic forms.
% \begin{macrocode}
-\newcommand*\KeepName{\@nameauth@NBSPtrue\@nameauth@NBSPXtrue}
+\newcommand*\KeepName
+{%
+ \@nameauth@NBSPtrue%
+ \@nameauth@NBSPXtrue%
+}
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Post-Processing\,---\,Main Versus Front Matter}
+% \noindent{\normalsize\bfseries Post-Processing\,---\,Main Versus Front Matter}
% \begin{macro}{\NamesInactive}
% Switch to the ``non-formatted'' species of names.
% \begin{macrocode}
@@ -6337,7 +7596,7 @@ the README.txt or README for more information.
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Name Decisions\,---\,First\,/\,Subsequent Reference}
+% \noindent{\normalsize\bfseries Name Decisions\,---\,First/Subsequent Reference}
% \begin{macro}{\ForgetThis}
% \changes{3.1}{2017/01/13}{Added}
% Have the naming engine \cmd{\@nameauth@Name} call \cmd{\ForgetName} internally.
@@ -6362,7 +7621,23 @@ the README.txt or README for more information.
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Name Occurrence Tweaks}
+% \begin{macro}{\LocalNameTest}
+% \changes{3.5}{2020/11/23}{Added}
+% Causes decision paths in the name decision macros to be in a local scope.
+% \begin{macrocode}
+\newcommand*\LocalNameTest{\global\@nameauth@GlobalScopefalse}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\GlobalNameTest}
+% \changes{3.5}{2020/11/23}{Added}
+% Causes decision paths in the name decision macros to have no scoping.
+% \begin{macrocode}
+\newcommand*\GlobalNameTest{\global\@nameauth@GlobalScopetrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \noindent{\normalsize\bfseries Name Occurrence Tweaks}
% \begin{macro}{\LocalNames}
% \changes{2.3}{2016/01/05}{Added}
% \changes{2.4}{2016/03/15}{Ensure global}
@@ -6381,7 +7656,16 @@ the README.txt or README for more information.
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Index Operations}
+% \noindent{\normalsize\bfseries Index Operations}
+% \begin{macro}{\IndexActual}
+% \changes{2.0}{2015/11/11}{Added}
+% \changes{3.5}{2020/11/23}{Use \cmd{\def}}
+% Change the ``actual'' character from the default. This allows one to use, for example, |\global\IndexActual{=}|.
+% \begin{macrocode}
+\newcommand*\IndexActual[1]{\def\@nameauth@Actual{#1}}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\IndexInactive}
% \changes{0.94}{2012/02/15}{Added}
% Turn off global indexing of names.
@@ -6390,6 +7674,14 @@ the README.txt or README for more information.
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\IndexActive}
+% \changes{0.94}{2012/02/15}{Added}
+% Turn on global indexing of names.
+% \begin{macrocode}
+\newcommand*\IndexActive{\@nameauth@DoIndextrue}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\SkipIndex}
% \changes{3.1}{2017/01/13}{Added}
% Turn off the next instance of indexing in \cmd{\Name}, \cmd{\FName}, and starred forms.
@@ -6406,23 +7698,6 @@ the README.txt or README for more information.
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\IndexActive}
-% \changes{0.94}{2012/02/15}{Added}
-% Turn on global indexing of names.
-% \begin{macrocode}
-\newcommand*\IndexActive{\@nameauth@DoIndextrue}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\IndexActual}
-% \changes{2.0}{2015/11/11}{Added}
-% Change the ``actual'' character from the default.
-% \begin{macrocode}
-\newcommand*\IndexActual[1]
- {\global\renewcommand*\@nameauth@Actual{#1}}
-% \end{macrocode}
-% \end{macro}
-%
% \begin{macro}{\SeeAlso}
% \changes{3.0}{2016/10/26}{Added}
% Change the type of cross-reference from a \textit{see} reference to a \textit{see also} reference. Works once per xref, unless one uses \cmd{\Include*}, in which case, take care!
@@ -6435,7 +7710,7 @@ the README.txt or README for more information.
% \label{sec:UserInterface}
%
% \begin{macro}{\ShowPattern}
-% \changes{3.3}{2020/02/20}{added}
+% \changes{3.3}{2020/02/20}{Added}
% This displays the pattern that the name arguments generate; maybe useful for debugging.
% \begin{macrocode}
\newcommand*\ShowPattern{\@nameauth@Debug}
@@ -6443,75 +7718,58 @@ the README.txt or README for more information.
% \end{macro}
%
% \begin{macro}{\ShowIdxPageref}
-% \changes{3.3}{2020/02/20}{added}
-% This displays the index entry that will be generated. This may be useful for debugging.
+% \changes{3.3}{2020/02/20}{Added}
+% \changes{3.5}{2020/11/23}{Fix namespace, use Boolean flags}
+% This displays (expanded, as printed) the index entry that will be generated, but not exactly what is in the \texttt{idx} file. This may be useful for debugging.
% \begin{macrocode}
-\newcommand*\ShowIdxPageref%
- {\def\LongIdxEntry{}\ShowPattern}
+\newcommand*\ShowIdxPageref
+{%
+ \global\@nameauth@IdxDebugtrue%
+ \global\@nameauth@LongIdxDebugtrue%
+ \@nameauth@Debug%
+}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ShowIdxPageref*}
-% \changes{3.3}{2020/02/20}{added}
-% This displays an index entry with no tag. This may be useful for debugging.
+% \changes{3.3}{2020/02/20}{Added}
+% \changes{3.5}{2020/11/23}{Fix namespace, use Boolean flags}
+% This displays a basic index entry with no tag. This may be useful for debugging.
% \begin{macrocode}
-\WithSuffix{\newcommand*}\ShowIdxPageref*%
- {\def\ShortIdxEntry{}\ShowPattern}
+\WithSuffix{\newcommand*}\ShowIdxPageref*
+{%
+ \global\@nameauth@IdxDebugtrue%
+ \@nameauth@Debug%
+}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\NameParser}
% \changes{3.0}{2016/10/26}{Added}
-% \changes{3.03}{2016/11/01}{First name only for short forms}
+% \changes{3.03}{2016/11/01}{Restrict first names}
% \changes{3.1}{2017/01/13}{Fix old syntax; add NBSP}
% \changes{3.2}{2017/03/22}{Fix alt. format, affixes}
-% Generate a name form based on the current state of the \textsf{nameauth} macros in the locked path. Available for use only in the hook macros.
+% \changes{3.5}{2020/11/23}{Optimize logic}
+% Generate a name form based on the current state of the \textsf{nameauth} macros in the locked path. Available for use only in the hook macros. We only use this macro in the local scope of the parser.
% \begin{macrocode}
\newcommand*\NameParser
{%
\if@nameauth@InHook
\let\SNN\rootb%
- \ifx\arga\@empty
+ \@nameauth@Choice%
% \end{macrocode}
-% If the first optarg is empty, it is a non-Western name. The forename will be either the suffix or the final optarg.
+% Non-Western names.
+% We test both \cmd{\argc} and \cmd{\suffb} as needed.
% \begin{macrocode}
+ {%
\ifx\argc\@empty
\let\FNN\suffb%
\else
\let\FNN\argc%
\fi
- \ifx\suffb\@empty
-% \end{macrocode}
-% Mononym case
-% \begin{macrocode}
- \ifx\FNN\@empty
- \SNN%
- \else
-% \end{macrocode}
-% Eastern or ancient name, using the older syntax, with name reversing and forcing
-% \begin{macrocode}
- \if@nameauth@FullName%
- \if@nameauth@RevThis
- \FNN\Space\SNN%
- \else
- \SNN\Space\FNN%
- \fi
- \else
- \if@nameauth@FirstName
- \if@nameauth@EastFN
- \FNN%
- \else
- \SNN%
- \fi
- \else
- \SNN%
- \fi
- \fi
- \fi
+ \ifx\FNN\@empty
+ \SNN%
\else
-% \end{macrocode}
-% Eastern or ancient name, using the new syntax, with name reversing and forcing
-% \begin{macrocode}
\if@nameauth@FullName
\if@nameauth@RevThis
\FNN\Space\SNN%
@@ -6530,10 +7788,36 @@ the README.txt or README for more information.
\fi
\fi
\fi
- \else
+ }%
+% \end{macrocode}
+% Non-Western names, obsolete syntax.
+% Using \cmd{\argc} in this path affects indexing.
+% \begin{macrocode}
+ {%
+ \let\FNN\argc%
+ \if@nameauth@FullName%
+ \if@nameauth@RevThis
+ \FNN\Space\SNN%
+ \else
+ \SNN\Space\FNN%
+ \fi
+ \else
+ \if@nameauth@FirstName
+ \if@nameauth@EastFN
+ \FNN%
+ \else
+ \SNN%
+ \fi
+ \else
+ \SNN%
+ \fi
+ \fi
+ }%
% \end{macrocode}
-% Western name with name reversing and suffixes
+% Western names.
+% We test for \cmd{\argc} and swap it for \cmd{\arga}, and account for \cmd{\suffb}.
% \begin{macrocode}
+ {%
\ifx\argc\@empty
\let\FNN\arga%
\else
@@ -6541,7 +7825,9 @@ the README.txt or README for more information.
\fi
\unless\ifx\suffb\@empty
\def\SNN{\rootb\Space\suffb}%
- \if@nameauth@ShortSNN\let\SNN\rootb\fi%
+ \if@nameauth@ShortSNN
+ \let\SNN\rootb%
+ \fi%
\fi
\if@nameauth@FullName
\if@nameauth@RevThis
@@ -6561,15 +7847,14 @@ the README.txt or README for more information.
\SNN%
\fi
\fi
- \fi
+ }%
\fi
}
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Traditional Naming Interface}
+% \noindent{\normalsize\bfseries Traditional Naming Interface}
% \begin{macro}{\Name}
-% \changes{2.3}{2016/01/05}{Interface macro}
% \cmd{\Name} calls \cmd{\NameauthName}, the interface hook.
% \begin{macrocode}
\newcommand\Name{\NameauthName}
@@ -6577,36 +7862,39 @@ the README.txt or README for more information.
% \end{macro}
%
% \begin{macro}{\Name*}
-% \changes{2.3}{2016/01/05}{Interface macro}
% \cmd{\Name*} sets up a long name reference and calls \cmd{\NameauthLName}, the interface hook.
% \begin{macrocode}
-\WithSuffix{\newcommand*}\Name*%
- {\@nameauth@FullNametrue\NameauthLName}
+\WithSuffix{\newcommand*}\Name*
+{%
+ \@nameauth@FullNametrue%
+ \NameauthLName%
+}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\FName}
% \changes{0.9}{2012/02/10}{Added}
-% \changes{2.3}{2016/01/05}{Interface macro}
% \cmd{\FName} sets up a short name reference and calls \cmd{\NameauthFName}, the interface hook.
% \begin{macrocode}
-\newcommand\FName{\@nameauth@FirstNametrue\NameauthFName}
+\newcommand\FName
+{%
+ \@nameauth@FirstNametrue%
+ \NameauthFName%
+}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\FName*}
-% \changes{2.3}{2016/01/05}{Interface macro}
% \cmd{\FName} and \cmd{\FName*} are identical in function.
% \begin{macrocode}
-\WithSuffix{\newcommand*}\FName*%
- {\@nameauth@FirstNametrue\NameauthFName}
+\WithSuffix{\newcommand*}\FName*{\FName}
% \end{macrocode}
% \end{macro}
-%
-% \noindent{\large\bfseries Index Operations}
+%
+% \noindent{\normalsize\bfseries Index Operations}
% \begin{macro}{\IndexProtect}
-% \changes{3.3}{2020/02/20}{added}
-% We shut down all output from the naming and indexing macros to protect against problems in the index in case a macro in an index entry should expand into one of the naming macros.
+% \changes{3.3}{2020/02/20}{Added}
+% We shut down all output from the naming and indexing macros to protect against problems in the index in case a macro in the index contains one of the naming macros.
% \begin{macrocode}
\newcommand*\IndexProtect
{%
@@ -6617,94 +7905,124 @@ the README.txt or README for more information.
% \end{macro}
%
% \begin{macro}{\IndexName}
-% \changes{0.75}{2012/01/19}{Current args}
-% \changes{0.85}{2012/02/05}{Hide commas}
% \changes{1.26}{2012/04/24}{Fix affixes}
% \changes{2.0}{2015/11/11}{Fix spaces, tagging}
% \changes{2.6}{2016/09/19}{Fix commas}
% \changes{3.0}{2016/10/26}{Redesigned}
% \changes{3.1}{2017/01/13}{Better tests}
-% This creates an index entry with page references. It issues warnings if the \texttt{verbose} option is selected. It prints nothing. First we make copies of the arguments.
+% \changes{3.5}{2020/11/23}{New warnings, new exclusion test, optimize logic, fix namespace}
+% This creates an index entry with page references. It warns if the \cmd{\SkipIndex} prefix macro was used before it was called. It issues additional warnings if the \texttt{verbose} option is selected. It prints nothing. First we make copies of the arguments.
% \begin{macrocode}
\newcommandx*\IndexName[3][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\rootb{\@nameauth@Root{#2}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
% \end{macrocode}
-% Test for malformed input.
+% Process and load the arguments into the appropriate macros.
+% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
+ \def\@nameauth@space{ }%
+% \end{macrocode}
+% Test for malformed input.
% \begin{macrocode}
\@nameauth@Error{#2}{macro \string\IndexName}%
% \end{macrocode}
-% We create the appropriate index entries, calling \cmd{\@nameauth@Index} to handle sorting and tagging. We do not create an index entry for a cross-reference (code !PN for pseudonym), used by \cmd{\IndexRef}, \cmd{\Excludename}, \cmd{\Includename}, \cmd{\AKA}, and \cmd{\PName}. If the first optarg is empty, it is a non-Western name.
+% Warn if \cmd{\SkipIndex} was called before \cmd{\IndexName}, and reset it unless the \texttt{oldreset} option was used.
% \begin{macrocode}
- \ifx\arga\@empty
- \ifx\argc\@empty
- \ifcsname\csb!PN\endcsname
- \if@nameauth@Verbose
+ \if@nameauth@SkipIndex
+ \PackageWarning{nameauth}%
+ {\SkipIndex precedes \IndexName; check for problems}%
+ \unless\if@nameauth@OldReset
+ \@nameauth@SkipIndexfalse%
+ \fi
+ \fi
+% \end{macrocode}
+% Warn if \cmd{\SeeAlso} was called before \cmd{\IndexName} and reset it.
+% \begin{macrocode}
+ \unless\if@nameauth@OldReset
+ \if@nameauth@SeeAlso
+ \global\@nameauth@SeeAlsofalse%
+ \PackageWarning{nameauth}%
+ {\SeeAlso precedes \IndexName or a naming macro and was reset}%
+ \fi
+ \fi
+% \end{macrocode}
+% We create the appropriate index entries, calling \cmd{\@nameauth@Index} to handle sorting and tagging. We do not create an index entry for a cross-reference or exclusion.
+% \begin{macrocode}
+ \@nameauth@Choice%
+% \end{macrocode}
+% Non-Western names.
+% We ignore \cmd{\@nameauth@C} and handle \cmd{\@nameauth@SB} appropriately.
+% \begin{macrocode}
+ {%
+ \ifcsname\@nameauth@csb!PN\endcsname
+ \if@nameauth@Verbose
+ \edef\@nameauth@testex{\csname\@nameauth@csb!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \PackageWarning{nameauth}%
+ {macro \IndexName: Exclusion: #2 exists}%
+ \else
\PackageWarning{nameauth}%
{macro \IndexName: XRef: #2 exists}%
\fi
+ \fi
+ \else
+ \ifx\@nameauth@SB\@empty
+ \@nameauth@Index{\@nameauth@csb}{\@nameauth@B}%
\else
- \ifx\suffb\@empty
+ \@nameauth@Index{\@nameauth@csb}%
+ {\@nameauth@B\@nameauth@space%
+ \@nameauth@SB}%
+ \fi
+ \fi
+ }%
% \end{macrocode}
-% mononym or Eastern\,/\,ancient name, new syntax
+% Non-Western names, obsolete syntax.
+% Using \cmd{\@nameauth@C} in this path affects indexing.
% \begin{macrocode}
- \@nameauth@Index{\csb}{\rootb}%
+ {%
+ \ifcsname\@nameauth@csbc!PN\endcsname
+ \if@nameauth@Verbose
+ \edef\@nameauth@testex{\csname\@nameauth@csbc!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \PackageWarning{nameauth}%
+ {macro \IndexName: Exclusion: #2 #3 exists}%
\else
- \@nameauth@Index{\csb}{\rootb\space\suffb}%
+ \PackageWarning{nameauth}%
+ {macro \IndexName: XRef: #2 #3 exists}%
\fi
\fi
\else
- \ifx\suffb\@empty
- \ifcsname\csbc!PN\endcsname
- \if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \IndexName: XRef: #2 #3 exists}%
- \fi
- \else
+ \@nameauth@Index{\@nameauth@csbc}%
+ {\@nameauth@B\@nameauth@space%
+ \@nameauth@C}%
+ \fi
+ }%
% \end{macrocode}
-% Eastern or ancient name, older syntax
+% Western names.
+% We ignore \cmd{\@nameauth@C} and handle \cmd{\@nameauth@SB} appropriately.
% \begin{macrocode}
- \@nameauth@Index{\csbc}{\rootb\space\argc}%
- \fi
- \else
- \ifcsname\csb!PN\endcsname
- \if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \IndexName: XRef: #2 exists}%
- \fi
+ {%
+ \ifcsname\@nameauth@csab!PN\endcsname
+ \if@nameauth@Verbose
+ \edef\@nameauth@testex{\csname\@nameauth@csab!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \PackageWarning{nameauth}%
+ {macro \IndexName: Exclusion: #1 #2 exists}%
\else
-% \end{macrocode}
-% Eastern or ancient name, new syntax, alternate name ignored
-% \begin{macrocode}
- \@nameauth@Index{\csb}{\rootb\space\suffb}%
+ \PackageWarning{nameauth}%
+ {macro \IndexName: XRef: #1 #2 exists}%
\fi
\fi
- \fi
- \else
- \ifcsname\csab!PN\endcsname
- \if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \IndexName: XRef: #1 #2 exists}%
- \fi
\else
-% \end{macrocode}
-% Western name, without and with affix
-% \begin{macrocode}
- \ifx\suffb\@empty
- \@nameauth@Index{\csab}%
- {\rootb,\space\arga}%
+ \ifx\@nameauth@SB\@empty
+ \@nameauth@Index{\@nameauth@csab}%
+ {\@nameauth@B,\@nameauth@space\@nameauth@A}%
\else
- \@nameauth@Index{\csab}%
- {\rootb,\space\arga,\space\suffb}%
+ \@nameauth@Index{\@nameauth@csab}%
+ {\@nameauth@B,\@nameauth@space%
+ \@nameauth@A,\@nameauth@space\@nameauth@SB}%
\fi
\fi
- \fi
+ }%
}
% \end{macrocode}
% \end{macro}
@@ -6712,131 +8030,276 @@ the README.txt or README for more information.
% \begin{macro}{\IndexRef}
% \changes{3.0}{2016/10/26}{Added}
% \changes{3.1}{2017/01/13}{Better tests}
-% \changes{3.3}{2020/02/20}{global flag reset}
-% This creates an index cross-reference that is not already a pseudonym. It prints nothing. First we make copies of the arguments to test them and make parsing decisions.
+% \changes{3.3}{2020/02/20}{Global flag reset}
+% \changes{3.5}{2020/11/23}{Strict \textit{see} refs, new warnings, new exclusion test, optimize logic, fix namespace}
+% Create a cross-reference that is not already an exclusion or a cross-reference. Print nothing.
% \begin{macrocode}
\newcommandx*\IndexRef[4][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\rootb{\@nameauth@Root{#2}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\target{#4}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
- \let\ex\expandafter%
+% \end{macrocode}
+% Process and load the arguments into the appropriate macros.
+% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
+ \protected@edef\@nameauth@Target{#4}%
+ \def\@nameauth@space{ }%
% \end{macrocode}
% Test for malformed input.
% \begin{macrocode}
\@nameauth@Error{#2}{macro \string\IndexRef}%
\@nameauth@Xreftrue%
% \end{macrocode}
-% We create either \textit{see also} entries or \textit{see} entries. The former are unrestricted. The latter are only created if they do not already exist as main entries.
+% Warn if \cmd{\SkipIndex} was called before \cmd{\IndexName}, and reset it unless the \texttt{oldreset} option was used.
% \begin{macrocode}
- \ifx\arga\@empty
- \ifx\argc\@empty
- \ifcsname\csb!PN\endcsname
- \if@nameauth@Verbose
+ \if@nameauth@SkipIndex
+ \PackageWarning{nameauth}%
+ {\SkipIndex preceded \IndexRef; check for problems}%
+ \unless\if@nameauth@OldReset
+ \@nameauth@SkipIndexfalse%
+ \fi
+ \fi
+% \end{macrocode}
+% We create either \textit{see also} entries or \textit{see} entries. The former are unrestricted with respect to names, not to extant cross-references. The latter are only created if they do not already exist as either page entries or cross-references.
+% \begin{macrocode}
+ \@nameauth@Choice%
+% \end{macrocode}
+% Mononym or Eastern/ancient name, new syntax. First check if an xref or excluded, and if so, do nothing except issue warnings if so desired.
+% \begin{macrocode}
+ {%
+ \ifcsname\@nameauth@csb!PN\endcsname
+ \if@nameauth@Verbose
+ \edef\@nameauth@testex{\csname\@nameauth@csb!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Exclusion: #2 exists}%
+ \else
\PackageWarning{nameauth}%
{macro \IndexRef: XRef: #2 exists}%
\fi
- \else
- \ifx\suffb\@empty
+ \fi
% \end{macrocode}
-% mononym or Eastern\,/\,ancient name, new syntax
+% If no xref or exclusion control sequence exists, either create a \textit{see also} or a \textit{see} reference. If the latter, forbid a \textit{see} reference to an extant name unless the \texttt{oldsee} option is used; then allow, but issue a warning.
% \begin{macrocode}
- \if@nameauth@SeeAlso
- \@nameauth@Index{\csb}{\rootb|seealso{\target}}%
+ \else
+ \ifx\@nameauth@SB\@empty
+ \if@nameauth@SeeAlso
+ \@nameauth@Index{\@nameauth@csb}%
+ {\@nameauth@B|seealso{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csb!PN}{}%
+ \else
+ \unless\if@nameauth@OldSee
+ \unless\ifcsname\@nameauth@csb!MN\endcsname
+ \unless\ifcsname\@nameauth@csb!NF\endcsname
+ \@nameauth@Index{\@nameauth@csb}%
+ {\@nameauth@B|see{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csb!PN}{}%
+ \else
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Extant name #2 stops see ref.}%
+ \fi
+ \else
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Extant name #2 stops see ref.}%
+ \fi
\else
- \@nameauth@Index{\csb}{\rootb|see{\target}}%
+ \if@nameauth@Verbose
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Non-strict XRef #2 created}%
+ \fi
+ \@nameauth@Index{\@nameauth@csb}%
+ {\@nameauth@B|see{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csb!PN}{}%
\fi
+ \fi
+% \end{macrocode}
+% \newpage\noindent
+% When the suffix is non-empty, either create a \textit{see also} or a \textit{see} reference. If the latter, forbid a \textit{see} reference to an extant name unless the \texttt{oldsee} option is used; then allow and warn.
+% \begin{macrocode}
+ \else
+ \if@nameauth@SeeAlso
+ \@nameauth@Index{\@nameauth@csb}%
+ {\@nameauth@B\@nameauth@space%
+ \@nameauth@SB|seealso{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csb!PN}{}%
\else
- \if@nameauth@SeeAlso
- \@nameauth@Index{\csb}%
- {\rootb\space\suffb|seealso{\target}}%
+ \unless\if@nameauth@OldSee
+ \unless\ifcsname\@nameauth@csb!MN\endcsname
+ \unless\ifcsname\@nameauth@csb!NF\endcsname
+ \@nameauth@Index{\@nameauth@csb}%
+ {\@nameauth@B\@nameauth@space%
+ \@nameauth@SB|see{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csb!PN}{}%
+ \else
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Extant name #2 stops see ref.}%
+ \fi
+ \else
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Extant name #2 stops see ref.}%
+ \fi
\else
- \@nameauth@Index{\csb}%
- {\rootb\space\suffb|see{\target}}%
+ \if@nameauth@Verbose
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Non-strict XRef #2 created}%
+ \fi
+ \@nameauth@Index{\@nameauth@csb}%
+ {\@nameauth@B\@nameauth@space%
+ \@nameauth@SB|see{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csb!PN}{}%
\fi
\fi
- \csgdef{\csb!PN}{}%
\fi
- \else
- \ifx\suffb\@empty
- \ifcsname\csbc!PN\endcsname
- \if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \IndexRef: XRef: #2 #3 exists}%
- \fi
- \else
+ \fi
+ }%
% \end{macrocode}
-% Eastern or ancient name, older syntax
+% Eastern or ancient name, obsolete syntax. First check if an xref or excluded.
% \begin{macrocode}
- \if@nameauth@SeeAlso
- \@nameauth@Index{\csbc}%
- {\rootb\space\argc|seealso{\target}}%
- \else
- \@nameauth@Index{\csbc}%
- {\rootb\space\argc|see{\target}}%
- \fi
- \csgdef{\csbc!PN}{}%
+ {%
+ \ifcsname\@nameauth@csbc!PN\endcsname
+ \if@nameauth@Verbose
+ \edef\@nameauth@testex{\csname\@nameauth@csbc!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Exclusion: #2 #3 exists}%
+ \else
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: XRef: #2 #3 exists}%
\fi
+ \fi
+% \end{macrocode}
+% \newpage\noindent
+% If no xref control sequence exists, either create a \textit{see also} or a \textit{see} reference. If the latter, forbid a \textit{see} reference to an extant name unless the \texttt{oldsee} option is used; then allow, but issue a warning.
+% \begin{macrocode}
+ \else
+ \if@nameauth@SeeAlso
+ \@nameauth@Index{\@nameauth@csbc}%
+ {\@nameauth@B\@nameauth@space%
+ \@nameauth@C|seealso{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csbc!PN}{}%
\else
- \ifcsname\csb!PN\endcsname
- \if@nameauth@Verbose
+ \unless\if@nameauth@OldSee
+ \unless\ifcsname\@nameauth@csbc!MN\endcsname
+ \unless\ifcsname\@nameauth@csbc!NF\endcsname
+ \@nameauth@Index{\@nameauth@csbc}%
+ {\@nameauth@B\@nameauth@space%
+ \@nameauth@C|see{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csbc!PN}{}%
+ \else
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Extant name #2 #3 stops see ref.}%
+ \fi
+ \else
\PackageWarning{nameauth}%
- {macro \IndexRef: XRef: #2 exists}%
+ {macro \IndexRef: Extant name #2 #3 stops see ref.}%
\fi
\else
-% \end{macrocode}
-% Eastern or ancient name, new syntax, alternate name ignored
-% \begin{macrocode}
- \if@nameauth@SeeAlso
- \@nameauth@Index{\csb}%
- {\rootb\space\suffb|seealso{\target}}%
- \else
- \@nameauth@Index{\csb}%
- {\rootb\space\suffb|see{\target}}%
+ \if@nameauth@Verbose
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Non-strict XRef #2 #3 created}%
\fi
- \csgdef{\csb!PN}{}%
+ \@nameauth@Index{\@nameauth@csbc}%
+ {\@nameauth@B\@nameauth@space%
+ \@nameauth@C|see{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csbc!PN}{}%
\fi
\fi
\fi
- \else
- \ifcsname\csab!PN\endcsname
+ }%
+% \end{macrocode}
+% Western name, without and with affix. First check if an xref or excluded.
+% \begin{macrocode}
+ {%
+ \ifcsname\@nameauth@csab!PN\endcsname
\if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \IndexRef: XRef: #1 #2 exists}%
+ \edef\@nameauth@testex{\csname\@nameauth@csab!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Exclusion: #1 #2 exists}%
+ \else
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: XRef: #1 #2 exists}%
+ \fi
\fi
- \else
% \end{macrocode}
-% Western name, without and with affix
+% \newpage\noindent
+% If no xref control sequence exists, either create a \textit{see also} or a \textit{see} reference. If the latter, forbid a \textit{see} reference to an extant name unless the \texttt{oldsee} option is used; then allow, but issue a warning.
% \begin{macrocode}
- \ifx\suffb\@empty
+ \else
+ \ifx\@nameauth@SB\@empty
\if@nameauth@SeeAlso
- \@nameauth@Index{\csab}%
- {\rootb,\space\arga|seealso{\target}}%
+ \@nameauth@Index{\@nameauth@csab}%
+ {\@nameauth@B,\@nameauth@space%
+ \@nameauth@A|seealso{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csab!PN}{}%
\else
- \@nameauth@Index{\csab}%
- {\rootb,\space\arga|see{\target}}%
+ \unless\if@nameauth@OldSee
+ \unless\ifcsname\@nameauth@csab!MN\endcsname
+ \unless\ifcsname\@nameauth@csab!NF\endcsname
+ \@nameauth@Index{\@nameauth@csab}%
+ {\@nameauth@B,\@nameauth@space%
+ \@nameauth@A|see{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csab!PN}{}%
+ \else
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Extant name #1 #2 stops see ref.}%
+ \fi
+ \else
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Extant name #1 #2 stops see ref.}%
+ \fi
+ \else
+ \if@nameauth@Verbose
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Non-strict XRef #1 #2 created}%
+ \fi
+ \@nameauth@Index{\@nameauth@csab}%
+ {\@nameauth@B,\@nameauth@space%
+ \@nameauth@A|see{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csab!PN}{}%
+ \fi
\fi
+% \end{macrocode}
+% When the suffix is non-empty, either create a \textit{see also} or a \textit{see} reference. If the latter, forbid a \textit{see} reference to an extant name unless the \texttt{oldsee} option is used; then allow and warn.
+% \begin{macrocode}
\else
\if@nameauth@SeeAlso
- \@nameauth@Index{\csab}%
- {\rootb,\space\arga,\space\suffb|seealso{\target}}%
+ \@nameauth@Index{\@nameauth@csab}%
+ {\@nameauth@B,\@nameauth@space%
+ \@nameauth@A,\@nameauth@space%
+ \@nameauth@SB|seealso{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csab!PN}{}%
\else
- \@nameauth@Index{\csab}%
- {\rootb,\space\arga,\space\suffb|see{\target}}%
+ \unless\if@nameauth@OldSee
+ \unless\ifcsname\@nameauth@csab!MN\endcsname
+ \unless\ifcsname\@nameauth@csab!NF\endcsname
+ \@nameauth@Index{\@nameauth@csab}%
+ {\@nameauth@B,\@nameauth@space%
+ \@nameauth@A,\@nameauth@space%
+ \@nameauth@SB|see{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csab!PN}{}%
+ \else
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Extant name #1 #2 stops see ref.}%
+ \fi
+ \else
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Extant name #1 #2 stops see ref.}%
+ \fi
+ \else
+ \if@nameauth@Verbose
+ \PackageWarning{nameauth}%
+ {macro \IndexRef: Non-strict XRef #1 #2 created}%
+ \fi
+ \@nameauth@Index{\@nameauth@csab}%
+ {\@nameauth@B,\@nameauth@space%
+ \@nameauth@A,\@nameauth@space%
+ \@nameauth@SB|see{\@nameauth@Target}}%
+ \csgdef{\@nameauth@csab!PN}{}%
+ \fi
\fi
\fi
- \csgdef{\csab!PN}{}%
\fi
- \fi
+ }%
\@nameauth@Xreffalse%
-% \end{macrocode}
-% This may not be necessary, but we do it for consistency.
-% \begin{macrocode}
\if@nameauth@OldReset
\@nameauth@SeeAlsofalse%
\else
@@ -6850,103 +8313,117 @@ the README.txt or README for more information.
% \changes{0.94}{2012/02/15}{Added}
% \changes{2.3}{2016/01/05}{New xref test}
% \changes{3.0}{2016/10/26}{Redesigned}
-% \changes{3.3}{2020/02/20}{More accurate warnings}
-% This macro prevents a name from being indexed.
+% \changes{3.3}{2020/02/20}{Better warnings}
+% \changes{3.5}{2020/11/23}{New warnings, new exclusion test, fix bug in old syntax, new logic, fix namespace}
+% Prevent a name from being indexed. Now, the set of macro expansions that comprise an exclusion contains one member: the value of \cmd{\@nameauth@Exclude}. Formerly, an exclusion was the set of all non-empty strings, preventing any other features from being added.
% \begin{macrocode}
\newcommandx*\ExcludeName[3][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
% \end{macrocode}
-% Below we parse the name arguments and create a non-empty pseudonym macro.
+% Process and load the arguments into the appropriate macros.
% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
\@nameauth@Error{#2}{macro \string\ExcludeName}%
- \ifx\arga\@empty
- \ifx\argc\@empty
+% \end{macrocode}
+% Below we parse the name arguments and create an excluded form of cross-reference, unless one already exists.
+% \begin{macrocode}
+ \@nameauth@Choice%
+% \end{macrocode}
+% Non-Western names. Verbose warnings let one know that an extant name is being excluded, but the operation is still allowed.
+% \begin{macrocode}
+ {%
+ \if@nameauth@Verbose
+ \ifcsname\@nameauth@csb!MN\endcsname
+ \PackageWarning{nameauth}%
+ {macro \ExcludeName: Name: #2 exists}%
+ \fi
+ \ifcsname\@nameauth@csb!NF\endcsname
+ \PackageWarning{nameauth}%
+ {macro \ExcludeName: Name: #2 exists}%
+ \fi
+ \fi
+% \end{macrocode}
+% One cannot exclude an extant cross-reference or exclusion. Verbose warnings only.
+% \begin{macrocode}
+ \ifcsname\@nameauth@csb!PN\endcsname
\if@nameauth@Verbose
- \ifcsname\csb!MN\endcsname
- \PackageWarning{nameauth}%
- {macro \ExcludeName: Reference: #2 exists}%
- \fi
- \ifcsname\csb!NF\endcsname
+ \edef\@nameauth@testex{\csname\@nameauth@csb!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
\PackageWarning{nameauth}%
- {macro \ExcludeName: Reference: #2 exists}%
- \fi
- \fi
- \ifcsname\csb!PN\endcsname
- \if@nameauth@Verbose
+ {macro \ExcludeName: Exclusion: #2 exists}%
+ \else
\PackageWarning{nameauth}%
- {macro \ExcludeName: Xref: #2 exists}%
+ {macro \ExcludeName: XRef: #2 exists}%
\fi
- \else
- \csgdef{\csb!PN}{!}%
\fi
\else
- \ifx\suffb\@empty
- \if@nameauth@Verbose
- \ifcsname\csbc!MN\endcsname
- \PackageWarning{nameauth}%
- {macro \ExcludeName: Reference: #2 #3 exists}%
- \fi
- \ifcsname\csbc!NF\endcsname
- \PackageWarning{nameauth}%
- {macro \ExcludeName: Reference: #2 #3 exists}%
- \fi
- \fi
- \csgdef{\csbc!PN}{!}%
- \ifcsname\csbc!PN\endcsname
- \if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \ExcludeName: Xref: #2 #3 exists}%
- \fi
- \else
- \csgdef{\csbc!PN}{!}%
- \fi
- \else
- \if@nameauth@Verbose
- \ifcsname\csb!MN\endcsname
- \PackageWarning{nameauth}%
- {macro \ExcludeName: Reference: #2 exists}%
- \fi
- \ifcsname\csb!NF\endcsname
- \PackageWarning{nameauth}%
- {macro \ExcludeName: Reference: #2 exists}%
- \fi
- \fi
- \ifcsname\csb!PN\endcsname
- \if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \ExcludeName: Xref: #2 exists}%
- \fi
+ \csxdef{\@nameauth@csb!PN}{\@nameauth@Exclude}%
+ \fi
+ }%
+% \end{macrocode}
+% Non-Western names, obsolete syntax. Verbose warnings let one know that an extant name is being excluded, but the operation is still allowed.
+% \begin{macrocode}
+ {%
+ \if@nameauth@Verbose
+ \ifcsname\@nameauth@csbc!MN\endcsname
+ \PackageWarning{nameauth}%
+ {macro \ExcludeName: Name: #2 #3 exists}%
+ \fi
+ \ifcsname\@nameauth@csbc!NF\endcsname
+ \PackageWarning{nameauth}%
+ {macro \ExcludeName: Name: #2 #3 exists}%
+ \fi
+ \fi
+% \end{macrocode}
+% One cannot exclude an extant cross-reference or exclusion. Verbose warnings only.
+% \begin{macrocode}
+ \ifcsname\@nameauth@csbc!PN\endcsname
+ \if@nameauth@Verbose
+ \edef\@nameauth@testex{\csname\@nameauth@csbc!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \PackageWarning{nameauth}%
+ {macro \ExcludeName: Exclusion: #2 #3 exists}%
\else
- \csgdef{\csb!PN}{!}%
+ \PackageWarning{nameauth}%
+ {macro \ExcludeName: XRef: #2 #3 exists}%
\fi
\fi
+ \else
+ \csxdef{\@nameauth@csbc!PN}{\@nameauth@Exclude}%
\fi
- \else
+ }%
+% \end{macrocode}
+% Western names. Verbose warnings let one know that an extant name is being excluded, but the operation is still allowed.
+% \begin{macrocode}
+ {%
\if@nameauth@Verbose
- \ifcsname\csab!MN\endcsname
+ \ifcsname\@nameauth@csab!MN\endcsname
\PackageWarning{nameauth}%
- {macro \ExcludeName: Reference: #1 #2 exists}%
+ {macro \ExcludeName: Name: #1 #2 exists}%
\fi
- \ifcsname\csab!NF\endcsname
+ \ifcsname\@nameauth@csab!NF\endcsname
\PackageWarning{nameauth}%
- {macro \ExcludeName: Reference: #1 #2 exists}%
+ {macro \ExcludeName: Name: #1 #2 exists}%
\fi
\fi
- \ifcsname\csab!PN\endcsname
+% \end{macrocode}
+% One cannot exclude an extant cross-reference or exclusion. Verbose warnings only.
+% \begin{macrocode}
+ \ifcsname\@nameauth@csab!PN\endcsname
\if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \ExcludeName: Xref: #1 #2 exists}%
+ \edef\@nameauth@testex{\csname\@nameauth@csab!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \PackageWarning{nameauth}%
+ {macro \ExcludeName: Exclusion: #1 #2 exists}%
+ \else
+ \PackageWarning{nameauth}%
+ {macro \ExcludeName: XRef: #1 #2 exists}%
+ \fi
\fi
\else
- \csgdef{\csab!PN}{!}%
+ \csxdef{\@nameauth@csab!PN}{\@nameauth@Exclude}%
\fi
- \fi
+ }%
}
% \end{macrocode}
% \end{macro}
@@ -6954,61 +8431,57 @@ the README.txt or README for more information.
% \begin{macro}{\IncludeName}
% \changes{3.0}{2016/10/26}{Added}
% \changes{3.3}{2020/02/20}{Added warnings}
-% This macro allows a name to be indexed if it is not a cross-reference.
+% \changes{3.5}{2020/11/23}{New exclusion test, optimize logic, fix namespace}
+% This macro allows a name to be indexed once again only if it had been excluded.
% \begin{macrocode}
\newcommandx*\IncludeName[3][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
% \end{macrocode}
-% Below we parse the name arguments and undefine only an ``excluded'' name.
+% Process and load the arguments into the appropriate macros.
% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
\@nameauth@Error{#2}{macro \string\IncludeName}%
- \ifx\arga\@empty
- \ifx\argc\@empty
- \ifcsname\csb!PN\endcsname
- \edef\testex{\csname\csb!PN\endcsname}%
- \unless\ifx\testex\@empty\global\csundef{\csb!PN}%
- \else
- \if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \IncludeName: Xref: #2 exists}%
- \fi
+ \@nameauth@Choice%
+% \end{macrocode}
+% Non-Western names.
+% \begin{macrocode}
+ {%
+ \ifcsname\@nameauth@csb!PN\endcsname
+ \edef\@nameauth@testex{\csname\@nameauth@csb!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \global\csundef{\@nameauth@csb!PN}%
+ \else
+ \if@nameauth@Verbose
+ \PackageWarning{nameauth}%
+ {macro \IncludeName: Xref: #2 exists}%
\fi
\fi
- \else
- \ifx\suffb\@empty
- \ifcsname\csbc!PN\endcsname
- \edef\testex{\csname\csbc!PN\endcsname}%
- \unless\ifx\testex\@empty\global\csundef{\csbc!PN}%
- \else
- \if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \IncludeName: Xref: #2 #3 exists}%
- \fi
- \fi
- \fi
+ \fi
+ }%
+% \end{macrocode}
+% Non-Western names, obsolete syntax.
+% \begin{macrocode}
+ {%
+ \ifcsname\@nameauth@csbc!PN\endcsname
+ \edef\@nameauth@testex{\csname\@nameauth@csbc!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \global\csundef{\@nameauth@csbc!PN}%
\else
- \ifcsname\csb!PN\endcsname
- \edef\testex{\csname\csb!PN\endcsname}%
- \unless\ifx\testex\@empty\global\csundef{\csb!PN}%
- \else
- \if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \IncludeName: Xref: #2 exists}%
- \fi
- \fi
+ \if@nameauth@Verbose
+ \PackageWarning{nameauth}%
+ {macro \IncludeName: Xref: #2 #3 exists}%
\fi
\fi
\fi
- \else
- \ifcsname\csab!PN\endcsname
- \edef\testex{\csname\csab!PN\endcsname}%
- \unless\ifx\testex\@empty\global\csundef{\csab!PN}%
+ }%
+% \end{macrocode}
+% Western names.
+% \begin{macrocode}
+ {%
+ \ifcsname\@nameauth@csab!PN\endcsname
+ \edef\@nameauth@testex{\csname\@nameauth@csab!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \global\csundef{\@nameauth@csab!PN}%
\else
\if@nameauth@Verbose
\PackageWarning{nameauth}%
@@ -7016,230 +8489,216 @@ the README.txt or README for more information.
\fi
\fi
\fi
- \fi
+ }%
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\IncludeName*}
% \changes{3.0}{2016/10/26}{Added}
-% \changes{3.1}{2017/01/13}{Fixed}
-% This macro allows any name to be indexed, undefining cross-references.
+% \changes{3.5}{2020/11/23}{Optimize logic, fix namespace}
+% This macro allows any name to be indexed by voiding any exclusion or cross-reference.
% \begin{macrocode}
\WithSuffix{\newcommandx*}\IncludeName*[3][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
-% \end{macrocode}
-% Below we parse the name arguments and undefine an xref control sequence.
-% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
\@nameauth@Error{#2}{macro \string\IncludeName*}%
- \ifx\arga\@empty
- \ifx\argc\@empty
- \global\csundef{\csb!PN}%
- \else
- \ifx\suffb\@empty
- \global\csundef{\csbc!PN}%
- \else
- \global\csundef{\csb!PN}%
- \fi
- \fi
- \else
- \global\csundef{\csab!PN}%
- \fi
+ \@nameauth@Choice%
+ {\global\csundef{\@nameauth@csb!PN}}%
+ {\global\csundef{\@nameauth@csbc!PN}}%
+ {\global\csundef{\@nameauth@csab!PN}}%
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\PretagName}
% \changes{2.0}{2015/11/11}{Added}
-% This creates an index entry tag that is applied before a name.
+% \changes{3.5}{2020/11/23}{New warnings, new exclusion test, optimize logic, fix namespace}
+% This creates an index entry tag that is applied before a name by \cmd{\@nameauth@Index}.
% \begin{macrocode}
\newcommandx*\PretagName[4][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
% \end{macrocode}
-% We parse the arguments, defining the sort tag control sequences used by\newline \cmd{\@nameauth@Index}.
+% Process and load the arguments into the appropriate macros.
% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
\@nameauth@Error{#2}{macro \string\PretagName}%
- \ifx\arga\@empty
- \ifx\argc\@empty
- \ifcsname\csb!PN\endcsname
+% \end{macrocode}
+% Sort only when permitted.
+% \begin{macrocode}
+ \if@nameauth@Pretag
+ \@nameauth@Choice%
+% \end{macrocode}
+% Non-Western names. Verbose warnings let us know if we are sorting either exclusions or cross-references. The former will be ignored. The latter will be used.
+% \begin{macrocode}
+ {%
+ \ifcsname\@nameauth@csb!PN\endcsname
\if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \PretagName: tagging xref: #2}%
+ \edef\@nameauth@testex{\csname\@nameauth@csb!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \PackageWarning{nameauth}%
+ {macro \PretagName: tagging exclusion: #2}%
+ \else
+ \PackageWarning{nameauth}%
+ {macro \PretagName: tagging xref: #2}%
+ \fi
\fi
\fi
- \if@nameauth@Pretag\csgdef{\csb!PRE}{#4\@nameauth@Actual}\fi
- \else
- \ifx\suffb\@empty
- \ifcsname\csbc!PN\endcsname
- \if@nameauth@Verbose
+ \csgdef{\@nameauth@csb!PRE}{#4\@nameauth@Actual}%
+ }%
+% \end{macrocode}
+% Non-Western names, obsolete syntax. Verbose warnings let us know if we are sorting either exclusions or cross-references. The former will be ignored. The latter will be used.
+% \begin{macrocode}
+ {%
+ \ifcsname\@nameauth@csbc!PN\endcsname
+ \if@nameauth@Verbose
+ \edef\@nameauth@testex{\csname\@nameauth@csbc!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \PackageWarning{nameauth}%
+ {macro \PretagName: tagging exclusion: #2 #3}%
+ \else
\PackageWarning{nameauth}%
{macro \PretagName: tagging xref: #2 #3}%
\fi
\fi
- \if@nameauth@Pretag\csgdef{\csbc!PRE}{#4\@nameauth@Actual}\fi
- \else
- \ifcsname\csb!PN\endcsname
- \if@nameauth@Verbose
+ \fi
+ \csgdef{\@nameauth@csbc!PRE}{#4\@nameauth@Actual}%
+ }%
+% \end{macrocode}
+% Western names. Verbose warnings let us know if we are sorting either exclusions or cross-references. The former will be ignored. The latter will be used.
+% \begin{macrocode}
+ {%
+ \ifcsname\@nameauth@csab!PN\endcsname
+ \if@nameauth@Verbose
+ \edef\@nameauth@testex{\csname\@nameauth@csab!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
\PackageWarning{nameauth}%
- {macro \PretagName: tagging xref: #2}%
+ {macro \PretagName: tagging exclusion: #1 #2}%
+ \else
+ \PackageWarning{nameauth}%
+ {macro \PretagName: tagging xref: #1 #2}%
\fi
\fi
- \if@nameauth@Pretag\csgdef{\csb!PRE}{#4\@nameauth@Actual}\fi
\fi
- \fi
+ \csgdef{\@nameauth@csab!PRE}{#4\@nameauth@Actual}%
+ }%
\else
- \ifcsname\csab!PN\endcsname
- \if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \PretagName: tagging xref: #1 #2}%
- \fi
- \fi
- \if@nameauth@Pretag\csgdef{\csab!PRE}{#4\@nameauth@Actual}\fi
+ \PackageWarning{nameauth}%
+ {macro \PretagName: deactivated}%
\fi
}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\TagName}
% \changes{1.2}{2012/02/25}{Added}
% \changes{1.9}{2015/07/09}{Fix cs collisions}
% \changes{2.0}{2015/11/11}{Redesign tagging}
-% This creates an index entry tag for a name that is not used as a cross-reference.
+% \changes{3.5}{2020/11/23}{New warnings, new exclusion test, optimize logic, fix namespace}
+% This creates an index entry tag for a name that is not either an exclusion or a cross-reference.
% \begin{macrocode}
\newcommandx*\TagName[4][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
% \end{macrocode}
-% We parse the arguments, defining the macros used by \cmd{\@nameauth@Index}.
+% Process and load the arguments into the appropriate macros.
% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
\@nameauth@Error{#2}{macro \string\TagName}%
- \ifx\arga\@empty
- \ifx\argc\@empty
- \ifcsname\csb!PN\endcsname
- \if@nameauth@Verbose
+ \@nameauth@Choice%
+% \end{macrocode}
+% Non-Western names.
+% \begin{macrocode}
+ {%
+ \ifcsname\@nameauth@csb!PN\endcsname
+ \if@nameauth@Verbose
+ \edef\@nameauth@testex{\csname\@nameauth@csb!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \PackageWarning{nameauth}%
+ {macro \TagName: not tagging exclusion: #2}%
+ \else
\PackageWarning{nameauth}%
{macro \TagName: not tagging xref: #2}%
\fi
- \else
- \csgdef{\csb!TAG}{#4}%
\fi
\else
- \ifx\suffb\@empty
- \ifcsname\csbc!PN\endcsname
- \if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \TagName: not tagging xref: #2 #3}%
- \fi
- \else
- \csgdef{\csbc!TAG}{#4}%
- \fi
- \else
- \ifcsname\csb!PN\endcsname
- \if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \TagName: not tagging xref: #2}%
- \fi
+ \csgdef{\@nameauth@csb!TAG}{#4}%
+ \fi
+ }%
+% \end{macrocode}
+% Non-Western names, obsolete syntax.
+% \begin{macrocode}
+ {%
+ \ifcsname\@nameauth@csbc!PN\endcsname
+ \if@nameauth@Verbose
+ \edef\@nameauth@testex{\csname\@nameauth@csbc!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \PackageWarning{nameauth}%
+ {macro \TagName: not tagging exclusion: #2 #3}%
\else
- \csgdef{\csb!TAG}{#4}%
+ \PackageWarning{nameauth}%
+ {macro \TagName: not tagging xref: #2 #3}%
\fi
\fi
+ \else
+ \csgdef{\@nameauth@csbc!TAG}{#4}%
\fi
- \else
- \ifcsname\csab!PN\endcsname
+ }%
+% \end{macrocode}
+% Western names.
+% \begin{macrocode}
+ {%
+ \ifcsname\@nameauth@csab!PN\endcsname
\if@nameauth@Verbose
- \PackageWarning{nameauth}%
- {macro \TagName: not tagging xref: #1 #2}%
+ \edef\@nameauth@testex{\csname\@nameauth@csab!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \PackageWarning{nameauth}%
+ {macro \TagName: not tagging exclusion: #1 #2}%
+ \else
+ \PackageWarning{nameauth}%
+ {macro \TagName: not tagging xref: #1 #2}%
+ \fi
\fi
\else
- \csgdef{\csab!TAG}{#4}%
+ \csgdef{\@nameauth@csab!TAG}{#4}%
\fi
- \fi
+ }%
}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\UntagName}
% \changes{1.2}{2012/02/25}{Added}
% \changes{1.9}{2015/07/09}{Global undef, no cs collisions}
% \changes{2.0}{2015/11/11}{Redesign tagging}
+% \changes{3.5}{2020/11/23}{Optimize logic, fix namespace}
% This deletes an index tag.
% \begin{macrocode}
\newcommandx*\UntagName[3][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
-% \end{macrocode}
-% We parse the arguments, undefining the index tag macros.
-% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
\@nameauth@Error{#2}{macro \string\UntagName}%
- \ifx\arga\@empty
- \ifx\argc\@empty
- \global\csundef{\csb!TAG}%
- \else
- \ifx\suffb\@empty
- \global\csundef{\csbc!TAG}%
- \else
- \global\csundef{\csb!TAG}%
- \fi
- \fi
- \else
- \global\csundef{\csab!TAG}%
- \fi
+ \@nameauth@Choice%
+ {\global\csundef{\@nameauth@csb!TAG}}%
+ {\global\csundef{\@nameauth@csbc!TAG}}%
+ {\global\csundef{\@nameauth@csab!TAG}}%
}
% \end{macrocode}
% \end{macro}
-%
-% \noindent{\large\bfseries Name Info Data Set: ``Text Tags''}
+%
+% \noindent{\normalsize\bfseries Name Info Data Set: ``Text Tags''}
% \begin{macro}{\NameAddInfo}
% \changes{2.4}{2016/03/15}{Added}
+% \changes{3.5}{2020/11/23}{Optimize logic, fix namespace}
% This creates a macro that expands to information associated with a given name, similar to an index tag, but usable in the body text.
% \begin{macrocode}
\newcommandx\NameAddInfo[4][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\Suff{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
-% \end{macrocode}
-% We parse the arguments, defining the text tag control sequences.
-% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
\@nameauth@Error{#2}{macro \string\NameAddInfo}%
- \ifx\arga\@empty
- \ifx\argc\@empty
- \csgdef{\csb!DB}{#4}%
- \else
- \ifx\Suff\@empty
- \csgdef{\csbc!DB}{#4}%
- \else
- \csgdef{\csb!DB}{#4}%
- \fi
- \fi
- \else
- \csgdef{\csab!DB}{#4}%
- \fi
+ \@nameauth@Choice%
+ {\csgdef{\@nameauth@csb!DB}{#4}}%
+ {\csgdef{\@nameauth@csbc!DB}{#4}}%
+ {\csgdef{\@nameauth@csab!DB}{#4}}%
}
% \end{macrocode}
% \end{macro}
@@ -7247,255 +8706,320 @@ the README.txt or README for more information.
% \begin{macro}{\NameQueryInfo}
% \changes{2.4}{2016/03/15}{Added}
% \changes{3.1}{2017/01/13}{Short macro}
-% \changes{3.3}{2020/02/20}{lock added}
+% \changes{3.3}{2020/02/20}{Lock added}
+% \changes{3.5}{2020/11/23}{Optimize logic, fix namespace}
% This prints the information created by \cmd{\NameAddInfo} if it exists.
% \begin{macrocode}
\newcommandx*\NameQueryInfo[3][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\Suff{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
\unless\if@nameauth@BigLock
-% \end{macrocode}
-% We parse the arguments, invoking the tag macros to expand to their contents.
-% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
\@nameauth@Error{#2}{macro \string\NameQueryInfo}%
- \ifx\arga\@empty
- \ifx\argc\@empty
- \ifcsname\csb!DB\endcsname\csname\csb!DB\endcsname\fi
- \else
- \ifx\Suff\@empty
- \ifcsname\csbc!DB\endcsname\csname\csbc!DB\endcsname\fi
- \else
- \ifcsname\csb!DB\endcsname\csname\csb!DB\endcsname\fi
- \fi
- \fi
- \else
- \ifcsname\csab!DB\endcsname\csname\csab!DB\endcsname\fi
- \fi
- \fi
+ \@nameauth@Choice%
+ {\ifcsname\@nameauth@csb!DB\endcsname
+ \csname\@nameauth@csb!DB\endcsname\fi}%
+ {\ifcsname\@nameauth@csbc!DB\endcsname
+ \csname\@nameauth@csbc!DB\endcsname\fi}%
+ {\ifcsname\@nameauth@csab!DB\endcsname
+ \csname\@nameauth@csab!DB\endcsname\fi}%
+ \fi
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\NameClearInfo}
% \changes{2.4}{2016/03/15}{Added}
+% \changes{3.5}{2020/11/23}{Optimize logic, fix namespace}
% This deletes a text tag. It has the same structure as \cmd{\UntagName}.
% \begin{macrocode}
\newcommandx*\NameClearInfo[3][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\Suff{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
-% \end{macrocode}
-% We parse the arguments, undefining the text tag control sequences.
-% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
\@nameauth@Error{#2}{macro \string\NameClearInfo}%
- \ifx\arga\@empty
- \ifx\argc\@empty
- \global\csundef{\csb!DB}%
- \else
- \ifx\Suff\@empty
- \global\csundef{\csbc!DB}%
- \else
- \global\csundef{\csb!DB}%
- \fi
- \fi
- \else
- \global\csundef{\csab!DB}%
- \fi
+ \@nameauth@Choice%
+ {\global\csundef{\@nameauth@csb!DB}}%
+ {\global\csundef{\@nameauth@csbc!DB}}%
+ {\global\csundef{\@nameauth@csab!DB}}%
}
% \end{macrocode}
% \end{macro}
-%
-% \noindent{\large\bfseries Name Decisions}
+% \BigBlank
+% \newpage
+%
+% \noindent{\normalsize\bfseries Name Decisions}
% \begin{macro}{\IfMainName}
% \changes{2.3}{2016/01/05}{Added}
-% This macro expands one path if a main matter name exists, or else the other.
+% \changes{3.5}{2020/11/23}{Optimize logic, fix namespace, local or global scope}
+% This macro expands one path if a main matter name exists, or else the other. The state of \texttt{\textbackslash if@nameauth@GlobalScope} determines whether or not the paths are in a local scope.
% \begin{macrocode}
\newcommandx\IfMainName[5][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
-% \end{macrocode}
-% Below we parse the name arguments and choose the path.
-% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
\@nameauth@Error{#2}{macro \string\IfMainName}%
- \ifx\arga\@empty
- \ifx\argc\@empty
- \ifcsname\csb!MN\endcsname{#4}\else{#5}\fi
+ \@nameauth@Choice%
+ {%
+ \ifcsname\@nameauth@csb!MN\endcsname
+ \if@nameauth@GlobalScope
+ #4%
+ \else
+ {#4}%
+ \fi
\else
- \ifx\suffb\@empty
- \ifcsname\csbc!MN\endcsname{#4}\else{#5}\fi
+ \if@nameauth@GlobalScope
+ #5%
\else
- \ifcsname\csb!MN\endcsname{#4}\else{#5}\fi
+ {#5}%
\fi
\fi
- \else
- \ifcsname\csab!MN\endcsname{#4}\else{#5}\fi
- \fi
+ }%
+ {%
+ \ifcsname\@nameauth@csbc!MN\endcsname
+ \if@nameauth@GlobalScope
+ #4%
+ \else
+ {#4}%
+ \fi
+ \else
+ \if@nameauth@GlobalScope
+ #5%
+ \else
+ {#5}%
+ \fi
+ \fi
+ }%
+ {%
+ \ifcsname\@nameauth@csab!MN\endcsname
+ \if@nameauth@GlobalScope
+ #4%
+ \else
+ {#4}%
+ \fi
+ \else
+ \if@nameauth@GlobalScope
+ #5%
+ \else
+ {#5}%
+ \fi
+ \fi
+ }%
}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\IfFrontName}
% \changes{2.3}{2016/01/05}{Added}
-% This macro expands one path if a front matter name exists, or else the other.
+% \changes{3.5}{2020/11/23}{Optimize logic, fix namespace, local or global scope}
+% This macro expands one path if a front matter name exists, or else the other. The state of \texttt{\textbackslash if@nameauth@GlobalScope} determines whether or not the paths are in a local scope.
% \begin{macrocode}
\newcommandx\IfFrontName[5][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
-% \end{macrocode}
-% Below we parse the name arguments and choose the path.
-% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
\@nameauth@Error{#2}{macro \string\IfFrontName}%
- \ifx\arga\@empty
- \ifx\argc\@empty
- \ifcsname\csb!NF\endcsname{#4}\else{#5}\fi
+ \@nameauth@Choice%
+ {%
+ \ifcsname\@nameauth@csb!NF\endcsname
+ \if@nameauth@GlobalScope
+ #4%
+ \else
+ {#4}%
+ \fi
\else
- \ifx\suffb\@empty
- \ifcsname\csbc!NF\endcsname{#4}\else{#5}\fi
+ \if@nameauth@GlobalScope
+ #5%
\else
- \ifcsname\csb!NF\endcsname{#4}\else{#5}\fi
+ {#5}%
\fi
\fi
- \else
- \ifcsname\csab!NF\endcsname{#4}\else{#5}\fi
- \fi
+ }%
+ {%
+ \ifcsname\@nameauth@csbc!NF\endcsname
+ \if@nameauth@GlobalScope
+ #4%
+ \else
+ {#4}%
+ \fi
+ \else
+ \if@nameauth@GlobalScope
+ #5%
+ \else
+ {#5}%
+ \fi
+ \fi
+ }%
+ {%
+ \ifcsname\@nameauth@csab!NF\endcsname
+ \if@nameauth@GlobalScope
+ #4%
+ \else
+ {#4}%
+ \fi
+ \else
+ \if@nameauth@GlobalScope
+ #5%
+ \else
+ {#5}%
+ \fi
+ \fi
+ }%
}
% \end{macrocode}
% \end{macro}
-%
+% \newpage
+%
% \begin{macro}{\IfAKA}
% \changes{2.3}{2016/01/05}{Added}
% \changes{2.4}{2016/03/15}{Test for excluded}
% \changes{3.0}{2016/10/26}{Redesigned}
-% This macro expands one path if a cross-reference exists, another if it does not exist, and a third if it is excluded.
+% \changes{3.5}{2020/11/23}{New exclusion test, optimize logic, fix namespace, local or global scope}
+% This macro expands one path if a cross-reference exists, another if it does not exist, and a third if it is excluded. The state of \texttt{\textbackslash if@nameauth@GlobalScope} determines whether or not the paths are in a local scope.
% \begin{macrocode}
\newcommandx\IfAKA[6][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
+ \@nameauth@Error{#2}{macro \string\IfAKA}%
% \end{macrocode}
% For each class of name we test first if a cross-reference exists, then if it is excluded.
% \begin{macrocode}
- \@nameauth@Error{#2}{macro \string\IfAKA}%
- \ifx\arga\@empty
- \ifx\argc\@empty
- \ifcsname\csb!PN\endcsname
- \edef\testex{\csname\csb!PN\endcsname}%
- \ifx\testex\@empty{#4}\else{#6}\fi
- \else{#5}\fi
+ \@nameauth@Choice%
+ {%
+ \ifcsname\@nameauth@csb!PN\endcsname
+ \edef\@nameauth@testex{\csname\@nameauth@csb!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \if@nameauth@GlobalScope
+ #6%
+ \else
+ {#6}%
+ \fi
+ \else
+ \if@nameauth@GlobalScope
+ #4%
+ \else
+ {#4}%
+ \fi
+ \fi
\else
- \ifx\suffb\@empty
- \ifcsname\csbc!PN\endcsname
- \edef\testex{\csname\csbc!PN\endcsname}%
- \ifx\testex\@empty{#4}\else{#6}\fi
- \else{#5}\fi
+ \if@nameauth@GlobalScope
+ #5%
\else
- \ifcsname\csb!PN\endcsname
- \edef\testex{\csname\csb!PN\endcsname}%
- \ifx\testex\@empty{#4}\else{#6}\fi
- \else{#5}\fi
+ {#5}%
\fi
\fi
- \else
- \ifcsname\csab!PN\endcsname
- \edef\testex{\csname\csab!PN\endcsname}%
- \ifx\testex\@empty{#4}\else{#6}\fi
- \else{#5}\fi
- \fi
+ }%
+ {%
+ \ifcsname\@nameauth@csbc!PN\endcsname
+ \edef\@nameauth@testex{\csname\@nameauth@csbc!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \if@nameauth@GlobalScope
+ #6%
+ \else
+ {#6}%
+ \fi
+ \else
+ \if@nameauth@GlobalScope
+ #4%
+ \else
+ {#4}%
+ \fi
+ \fi
+ \else
+ \if@nameauth@GlobalScope
+ #5%
+ \else
+ {#5}%
+ \fi
+ \fi
+ }%
+ {%
+ \ifcsname\@nameauth@csab!PN\endcsname
+ \edef\@nameauth@testex{\csname\@nameauth@csab!PN\endcsname}%
+ \ifx\@nameauth@testex\@nameauth@Exclude
+ \if@nameauth@GlobalScope
+ #6%
+ \else
+ {#6}%
+ \fi
+ \else
+ \if@nameauth@GlobalScope
+ #4%
+ \else
+ {#4}%
+ \fi
+ \fi
+ \else
+ \if@nameauth@GlobalScope
+ #5%
+ \else
+ {#5}%
+ \fi
+ \fi
+ }%
}
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Changing Name Decisions}
+% \noindent{\normalsize\bfseries Changing Name Decisions}
% \begin{macro}{\ForgetName}
-% \changes{0.75}{2012/01/19}{Current args}
% \changes{1.9}{2015/07/09}{Global undef}
% \changes{2.3}{2016/01/05}{Global or local}
-% This undefines a control sequence to force a ``first use.''
+% \changes{3.5}{2020/11/23}{Optimize logic, fix namespace}
+% This undefines a control sequence to force a ``first use''.
% \begin{macrocode}
\newcommandx*\ForgetName[3][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
+% \end{macrocode}
+% Process and load the arguments into the appropriate macros.
+% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
\@nameauth@Error{#2}{macro \string\ForgetName}%
% \end{macrocode}
% Now we parse the arguments, undefining the control sequences either by current name type (via |@nameauth@MainFormat|) or completely (toggled by |@nameauth@LocalNames|).
% \begin{macrocode}
- \ifx\arga\@empty
- \ifx\argc\@empty
- \if@nameauth@LocalNames
- \if@nameauth@MainFormat
- \global\csundef{\csb!MN}%
- \else
- \global\csundef{\csb!NF}%
- \fi
+ \@nameauth@Choice%
+% \end{macrocode}
+% Non-Western names.
+% \begin{macrocode}
+ {%
+ \if@nameauth@LocalNames
+ \if@nameauth@MainFormat
+ \global\csundef{\@nameauth@csb!MN}%
\else
- \global\csundef{\csb!MN}%
- \global\csundef{\csb!NF}%
+ \global\csundef{\@nameauth@csb!NF}%
\fi
\else
- \ifx\suffb\@empty
- \if@nameauth@LocalNames
- \if@nameauth@MainFormat
- \global\csundef{\csbc!MN}%
- \else
- \global\csundef{\csbc!NF}%
- \fi
- \else
- \global\csundef{\csbc!MN}%
- \global\csundef{\csbc!NF}%
- \fi
+ \global\csundef{\@nameauth@csb!MN}%
+ \global\csundef{\@nameauth@csb!NF}%
+ \fi
+ }%
+% \end{macrocode}
+% Non-Western names, obsolete syntax.
+% \begin{macrocode}
+ {%
+ \if@nameauth@LocalNames
+ \if@nameauth@MainFormat
+ \global\csundef{\@nameauth@csbc!MN}%
\else
- \if@nameauth@LocalNames
- \if@nameauth@MainFormat
- \global\csundef{\csb!MN}%
- \else
- \global\csundef{\csb!NF}%
- \fi
- \else
- \global\csundef{\csb!MN}%
- \global\csundef{\csb!NF}%
- \fi
+ \global\csundef{\@nameauth@csbc!NF}%
\fi
+ \else
+ \global\csundef{\@nameauth@csbc!MN}%
+ \global\csundef{\@nameauth@csbc!NF}%
\fi
- \else
+ }%
+% \end{macrocode}
+% Western names.
+% \begin{macrocode}
+ {%
\if@nameauth@LocalNames
\if@nameauth@MainFormat
- \global\csundef{\csab!MN}%
+ \global\csundef{\@nameauth@csab!MN}%
\else
- \global\csundef{\csab!NF}%
+ \global\csundef{\@nameauth@csab!NF}%
\fi
\else
- \global\csundef{\csab!MN}%
- \global\csundef{\csab!NF}%
+ \global\csundef{\@nameauth@csab!MN}%
+ \global\csundef{\@nameauth@csab!NF}%
\fi
- \fi
+ }%
}
% \end{macrocode}
% \end{macro}
@@ -7504,97 +9028,89 @@ the README.txt or README for more information.
% \changes{0.9}{2012/02/10}{Added}
% \changes{2.3}{2016/01/05}{Global or local}
% \changes{3.1}{2017/01/13}{Fix old syntax}
-% This defines a control sequence to force a ``subsequent use.''
+% \changes{3.5}{2020/11/23}{Optimize logic, fix namespace}
+% This defines a control sequence to force a ``subsequent use''.
% \begin{macrocode}
\newcommandx*\SubvertName[3][1=\@empty, 3=\@empty]
{%
- \protected@edef\arga{\trim@spaces{#1}}%
- \protected@edef\argc{\trim@spaces{#3}}%
- \protected@edef\suffb{\@nameauth@Suffix{#2}}%
- \def\csb{\@nameauth@Clean{#2}}%
- \def\csbc{\@nameauth@Clean{#2,#3}}%
- \def\csab{\@nameauth@Clean{#1!#2}}%
-% \end{macrocode}
-% We make copies of the arguments to test them.
-% \begin{macrocode}
+ \@nameauth@LoadArgs{#1}{#2}{#3}%
\@nameauth@Error{#2}{macro \string\SubvertName}%
% \end{macrocode}
% Now we parse the arguments, defining the control sequences either locally by section type or globally. |@nameauth@LocalNames| toggles the local or global behavior, while we select the type of name with |@nameauth@MainFormat|.
% \begin{macrocode}
- \ifx\arga\@empty
- \ifx\argc\@empty
- \if@nameauth@LocalNames
- \if@nameauth@MainFormat
- \csgdef{\csb!MN}{}%
- \else
- \csgdef{\csb!NF}{}%
- \fi
+ \@nameauth@Choice%
+% \end{macrocode}
+% Non-Western names.
+% \begin{macrocode}
+ {%
+ \if@nameauth@LocalNames
+ \if@nameauth@MainFormat
+ \csgdef{\@nameauth@csb!MN}{}%
\else
- \csgdef{\csb!MN}{}%
- \csgdef{\csb!NF}{}%
+ \csgdef{\@nameauth@csb!NF}{}%
\fi
\else
- \ifx\suffb\@empty
- \if@nameauth@LocalNames
- \if@nameauth@MainFormat
- \csgdef{\csbc!MN}{}%
- \else
- \csgdef{\csbc!NF}{}%
- \fi
- \else
- \csgdef{\csbc!MN}{}%
- \csgdef{\csbc!NF}{}%
- \fi
- \else
- \if@nameauth@LocalNames
- \if@nameauth@MainFormat
- \csgdef{\csb!MN}{}%
- \else
- \csgdef{\csb!NF}{}%
- \fi
- \else
- \csgdef{\csb!MN}{}%
- \csgdef{\csb!NF}{}%
- \fi
+ \csgdef{\@nameauth@csb!MN}{}%
+ \csgdef{\@nameauth@csb!NF}{}%
+ \fi
+ }%
+% \end{macrocode}
+% Non-Western names, obsolete syntax.
+% \begin{macrocode}
+ {%
+ \if@nameauth@LocalNames
+ \if@nameauth@MainFormat
+ \csgdef{\@nameauth@csbc!MN}{}%
+ \else
+ \csgdef{\@nameauth@csbc!NF}{}%
\fi
+ \else
+ \csgdef{\@nameauth@csbc!MN}{}%
+ \csgdef{\@nameauth@csbc!NF}{}%
\fi
- \else
+ }%
+% \end{macrocode}
+% Western names.
+% \begin{macrocode}
+ {%
\if@nameauth@LocalNames
\if@nameauth@MainFormat
- \csgdef{\csab!MN}{}%
+ \csgdef{\@nameauth@csab!MN}{}%
\else
- \csgdef{\csab!NF}{}%
+ \csgdef{\@nameauth@csab!NF}{}%
\fi
\else
- \csgdef{\csab!MN}{}%
- \csgdef{\csab!NF}{}%
+ \csgdef{\@nameauth@csab!MN}{}%
+ \csgdef{\@nameauth@csab!NF}{}%
\fi
- \fi
+ }%
}
% \end{macrocode}
% \end{macro}
-%
-% \noindent{\large\bfseries Alternate Names}
+%
+% \noindent{\normalsize\bfseries Alternate Names}
% \begin{macro}{\AKA}
-% \changes{0.85}{2012/02/05}{Hide commas}
% \changes{1.26}{2012/04/24}{Fix affixes}
-% \changes{1.5}{2013/02/22}{Reversing, caps}
-% \changes{2.0}{2015/11/11}{Trim spaces; fix tagging}
+% \changes{1.5}{2013/02/22}{Reversing/caps}
+% \changes{2.0}{2015/11/11}{Trim spaces; fix tags}
% \changes{2.1}{2015/11/24}{Fix Unicode}
% \changes{2.3}{2016/01/05}{Fix starred mode}
% \changes{2.41}{2016/03/17}{Fix token regs}
% \changes{2.6}{2016/09/19}{Fix index commas}
% \changes{3.0}{2016/10/26}{Redesigned}
% \changes{3.1}{2017/01/13}{Can skip index}
-% \changes{3.3}{2020/02/20}{global flag reset}
+% \changes{3.3}{2020/02/20}{Global flag reset}
+% \changes{3.5}{2020/11/23}{Fix namespace}
% \cmd{\AKA} prints an alternate name and creates index cross-references. It prevents multiple generation of cross-references and suppresses double periods.
% \begin{macrocode}
\newcommandx*\AKA[5][1=\@empty, 3=\@empty, 5=\@empty]
{%
% \end{macrocode}
-% Prevent entering \cmd{\AKA} via itself or \cmd{\@nameauth@Name}. Prevent the index-only flag. Tell the formatting system that \cmd{\AKA} is running.
+% Prevent entering \cmd{\AKA} via itself or \cmd{\@nameauth@Name}. Prevents and resets \cmd{\JustIndex}. Tell the formatting system that \cmd{\AKA} is running.
% \begin{macrocode}
- \if@nameauth@BigLock\@nameauth@Locktrue\fi
+ \if@nameauth@BigLock
+ \@nameauth@Locktrue%
+ \fi
\unless\if@nameauth@Lock
\@nameauth@Locktrue%
\@nameauth@InAKAtrue%
@@ -7612,69 +9128,45 @@ the README.txt or README for more information.
% Names occur in horizontal mode; we ensure that. Next we make copies of the target name arguments and we parse and print the cross-reference name.
% \begin{macrocode}
\leavevmode\hbox{}%
- \protected@edef\argi{\trim@spaces{#1}}%
- \protected@edef\rooti{\@nameauth@Root{#2}}%
- \protected@edef\suffi{\@nameauth@Suffix{#2}}%
- \@nameauth@Parse[#3]{#4}[#5]{!PN}%
+ \protected@edef\@nameauth@Ai{\trim@spaces{#1}}%
+ \protected@edef\@nameauth@Bi{\@nameauth@Root{#2}}%
+ \protected@edef\@nameauth@Si{\@nameauth@Suffix{#2}}%
+ \@nameauth@Parse{#3}{#4}{#5}{!PN}%
+ \def\@nameauth@space{ }%
% \end{macrocode}
+% \newpage\noindent
% Create an index cross-reference based on the arguments.
% \begin{macrocode}
\unless\if@nameauth@SkipIndex
- \ifx\argi\@empty
- \ifx\suffi\@empty
- \IndexRef[#3]{#4}[#5]{\rooti}%
+ \ifx\@nameauth@Ai\@empty
+ \ifx\@nameauth@Si\@empty
+ \IndexRef[#3]{#4}[#5]{\@nameauth@Bi}%
\else
- \IndexRef[#3]{#4}[#5]{\rooti\space\suffi}%
+ \IndexRef[#3]{#4}[#5]%
+ {\@nameauth@Bi\@nameauth@space%
+ \@nameauth@Si}%
\fi
\else
- \ifx\suffi\@empty
- \IndexRef[#3]{#4}[#5]{\rooti,\space\argi}%
+ \ifx\@nameauth@Si\@empty
+ \IndexRef[#3]{#4}[#5]%
+ {\@nameauth@Bi,\@nameauth@space\@nameauth@Ai}%
\else
- \IndexRef[#3]{#4}[#5]{\rooti,\space\argi,\space\suffi}%
+ \IndexRef[#3]{#4}[#5]%
+ {\@nameauth@Bi,\@nameauth@space%
+ \@nameauth@Ai,\@nameauth@space\@nameauth@Si}%
\fi
\fi
\fi
% \end{macrocode}
% Reset all the ``per name'' Boolean values. The default is global.
% \begin{macrocode}
- \if@nameauth@OldReset
- \@nameauth@SkipIndexfalse%
- \@nameauth@AltAKAfalse%
- \@nameauth@NBSPfalse%
- \@nameauth@NBSPXfalse%
- \@nameauth@DoCapsfalse%
- \@nameauth@Accentfalse%
- \@nameauth@AllThisfalse%
- \@nameauth@ShowCommafalse%
- \@nameauth@NoCommafalse%
- \@nameauth@RevThisfalse%
- \@nameauth@RevThisCommafalse%
- \@nameauth@ShortSNNfalse%
- \@nameauth@EastFNfalse%
- \else
- \global\@nameauth@SkipIndexfalse%
- \global\@nameauth@AltAKAfalse%
- \global\@nameauth@NBSPfalse%
- \global\@nameauth@NBSPXfalse%
- \global\@nameauth@DoCapsfalse%
- \global\@nameauth@Accentfalse%
- \global\@nameauth@AllThisfalse%
- \global\@nameauth@ShowCommafalse%
- \global\@nameauth@NoCommafalse%
- \global\@nameauth@RevThisfalse%
- \global\@nameauth@RevThisCommafalse%
- \global\@nameauth@ShortSNNfalse%
- \global\@nameauth@EastFNfalse%
- \fi
+ \@nameauth@Flags%
\@nameauth@Lockfalse%
\@nameauth@InAKAfalse%
% \end{macrocode}
-% Close the ``locked'' branch.
+% Close the ``locked'' branch and call the full stop detection. This conditional statement must be on one line.
% \begin{macrocode}
\fi
-% \end{macrocode}
-% Call the full stop detection.
-% \begin{macrocode}
\if@nameauth@Punct\expandafter\@nameauth@CheckDot\fi
}
% \end{macrocode}
@@ -7684,22 +9176,52 @@ the README.txt or README for more information.
% \changes{0.9}{2012/02/10}{Added}
% This starred form sets a Boolean to print only the alternate name argument, if that exists, and calls \cmd{\AKA}.
% \begin{macrocode}
-\WithSuffix{\newcommand*}\AKA*{\@nameauth@AltAKAtrue\AKA}
+\WithSuffix{\newcommand*}\AKA*{\@nameauth@AltAKAtrue \AKA}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\PName}
% \changes{2.3}{2016/01/05}{Work with hooks}
% \changes{3.1}{2017/01/13}{Can skip index}
-% \cmd{\PName} is a convenience macro that calls \cmd{\NameauthName}, then \cmd{\AKA}. It prevents the index-only feature from triggering.
+% \changes{3.5}{2020/11/23}{Warning and flag resets added}
+% \cmd{\PName} is a convenience macro that calls \cmd{\NameauthName}, then \cmd{\AKA}.
% \begin{macrocode}
\newcommandx*\PName[5][1=\@empty,3=\@empty,5=\@empty]
{%
- \@nameauth@JustIndexfalse%
+% \end{macrocode}
+% If we used \cmd{\JustIndex}, we ignore and reset its flag to false.
+% \begin{macrocode}
+ \if@nameauth@OldReset
+ \@nameauth@JustIndexfalse%
+ \else
+ \global\@nameauth@JustIndexfalse%
+ \fi
+% \end{macrocode}
+% If we used \cmd{\SkipIndex}, we reset the flag of \cmd{\SeeAlso} and activate \cmd{\SkipIndex}for both \cmd{\NameauthName} and \cmd{\AKA}.
+% \begin{macrocode}
\if@nameauth@SkipIndex
- \NameauthName[#1]{#2}\space(\SkipIndex\AKA[#1]{#2}[#3]{#4}[#5])%
+ \unless\if@nameauth@OldReset
+ \global\@nameauth@SeeAlsofalse%
+ \fi
+ \NameauthName[#1]{#2} (\SkipIndex\AKA[#1]{#2}[#3]{#4}[#5])%
\else
- \NameauthName[#1]{#2}\space(\AKA[#1]{#2}[#3]{#4}[#5])%
+% \end{macrocode}
+% Otherwise, if we used \cmd{\SeeAlso} we set the flag of \cmd{\SeeAlso} false for \cmd{\NameauthName} and true for \cmd{\AKA}. The ``normal'' case after that is trivial.
+% \begin{macrocode}
+ \if@nameauth@SeeAlso
+ \@nameauth@SeeAlsofalse\NameauthName[#1]{#2}
+ \@nameauth@SeeAlsotrue(\AKA[#1]{#2}[#3]{#4}[#5])%
+ \else
+ \NameauthName[#1]{#2}
+ (\AKA[#1]{#2}[#3]{#4}[#5])%
+ \fi
+ \fi
+% \end{macrocode}
+% Warn if \cmd{\SkipIndex} remains in effect (potentially due to the \texttt{oldreset} option). Normally, this state should not occur.
+% \begin{macrocode}
+ \if@nameauth@SkipIndex
+ \PackageWarning{nameauth}%
+ {\SkipIndex still active after \PName; check for problems}%
\fi
}
% \end{macrocode}
@@ -7708,108 +9230,111 @@ the README.txt or README for more information.
% \begin{macro}{\PName*}
% This sets up a long name reference and calls \cmd{\PName}.
% \begin{macrocode}
-\WithSuffix{\newcommand*}\PName*{\@nameauth@FullNametrue\PName}
+\WithSuffix{\newcommand*}\PName*{\@nameauth@FullNametrue \PName}
% \end{macrocode}
% \end{macro}
%
-% \noindent{\large\bfseries Simplified Interface}
+% \noindent{\normalsize\bfseries Quick Interface}
% \begin{environment}{nameauth}
% \changes{1.6}{2013/03/10}{Environment added}
-% \changes{1.9}{2015/07/09}{Bugfix}
% \changes{2.0}{2015/11/11}{Better arg handling}
-% \changes{2.11}{2015/11/29}{Bugfix}
% \changes{2.41}{2016/03/17}{No local \cmd{\newtoks}}
-% The \texttt{nameauth} environment creates macro shorthands. First we define a control sequence \cmd{\<} that takes four parameters, delimited by three ampersands and \texttt{>}.
+% \changes{3.5}{2020/11/23}{Fix namespace}
+% The \texttt{nameauth} environment creates macro shorthands. First we define a control sequence \cmd{\<} that takes four parameters, delimited by three ampersands and \texttt{>}. This macro is defined only within the \texttt{nameauth} environment, but the shorthand macros that it creates are globally defined.
% \begin{macrocode}
\newenvironment{nameauth}{%
\begingroup%
\let\ex\expandafter%
\csdef{<}##1&##2&##3&##4>{%
- \protected@edef\@arga{\trim@spaces{##1}}%
- \protected@edef\@testb{\trim@spaces{##2}}%
- \protected@edef\@testd{\trim@spaces{##4}}%
- \@nameauth@etoksb\expandafter{##2}%
- \@nameauth@etoksc\expandafter{##3}%
- \@nameauth@etoksd\expandafter{##4}%
+ \protected@edef\@arga@{\trim@spaces{##1}}%
+ \protected@edef\@larga@{L\trim@spaces{##1}}%
+ \protected@edef\@sarga@{S\trim@spaces{##1}}%
+ \protected@edef\@testb@{\trim@spaces{##2}}%
+ \protected@edef\@testd@{\trim@spaces{##4}}%
+ \@nameauth@etoksb\ex{##2}%
+ \@nameauth@etoksc\ex{##3}%
+ \@nameauth@etoksd\ex{##4}%
% \end{macrocode}
% The first argument must have some text to create a set of control sequences with it. The third argument is the required name argument. Redefining a shorthand creates a warning.
% \begin{macrocode}
- \ifx\@arga\@empty
+ \ifx\@arga@\@empty
\PackageError{nameauth}%
{environment nameauth: Control sequence missing}%
\fi
\@nameauth@Error{##3}{environment nameauth}%
- \ifcsname\@arga\endcsname
+ \ifcsname\@arga@\endcsname
\PackageWarning{nameauth}%
{environment nameauth: Shorthand macro already exists}%
\fi
% \end{macrocode}
-% Set up shorthands according to name form. We have to use \cmd{\expandafter}, not the \(\epsilon\)-\TeX{} way, due to \cmd{\protected@edef} in the naming macros.
+% Set up shorthands according to name form. We have to use \cmd{\ex}, not the \(\epsilon\)-\TeX{} way, due to \cmd{\protected@edef} in the naming macros.
+% \newpage
%
-% We begin with mononyms and non-Western names that use the new syntax. We use one \cmd{\expandafter} per token because we only have one argument to expand first.
+% We begin with mononyms and non-Western names that use the new syntax. We use one \cmd{\ex} per token because we only have one argument to expand first.
% \begin{macrocode}
- \ifx\@testd\@empty
- \ifx\@testb\@empty
- \ex\csgdef\ex{\ex\@arga\ex}%
+ \ifx\@testd@\@empty
+ \ifx\@testb@\@empty
+ \ex\csgdef\ex{\ex\@arga@\ex}%
\ex{\ex\NameauthName\ex{\the\@nameauth@etoksc}}%
- \ex\csgdef\ex{\ex L\ex\@arga\ex}%
+ \ex\csgdef\ex{\ex\@larga@\ex}%
\ex{\ex\@nameauth@FullNametrue%
\ex\NameauthLName\ex{\the\@nameauth@etoksc}}%
- \ex\csgdef\ex{\ex S\ex\@arga\ex}%
+ \ex\csgdef\ex{\ex\@sarga@\ex}%
\ex{\ex\@nameauth@FirstNametrue%
\ex\NameauthFName\ex{\the\@nameauth@etoksc}}%
\else
% \end{macrocode}
-% Next we have Western names with no alternate names. Here we have two arguments to expand in reverse order, so we need three, then one uses of \cmd{\expandafter} per token.
+% Next we have Western names with no alternate names. Here we have two arguments to expand in reverse order, so we need three, then one uses of \cmd{\ex} per token.
% \begin{macrocode}
- \ex\ex\ex\csgdef\ex\ex\ex{\ex\ex\ex\@arga\ex\ex\ex}%
+ \ex\ex\ex\csgdef\ex\ex\ex{\ex\ex\ex\@arga@\ex\ex\ex}%
\ex\ex\ex{\ex\ex\ex\NameauthName%
\ex\ex\ex[\ex\the\ex\@nameauth@etoksb\ex]%
\ex{\the\@nameauth@etoksc}}%
- \ex\ex\ex\csgdef\ex\ex\ex{\ex\ex\ex L\ex\ex\ex\@arga%
- \ex\ex\ex}\ex\ex\ex{\ex\ex\ex\@nameauth@FullNametrue%
+ \ex\ex\ex\csgdef\ex\ex\ex{\ex\ex\ex\@larga@\ex\ex\ex}%
+ \ex\ex\ex{\ex\ex\ex\@nameauth@FullNametrue%
\ex\ex\ex\NameauthLName%
\ex\ex\ex[\ex\the\ex\@nameauth@etoksb\ex]%
\ex{\the\@nameauth@etoksc}}%
- \ex\ex\ex\csgdef\ex\ex\ex{\ex\ex\ex S\ex\ex\ex\@arga%
- \ex\ex\ex}\ex\ex\ex{\ex\ex\ex\@nameauth@FirstNametrue%
+ \ex\ex\ex\csgdef\ex\ex\ex{\ex\ex\ex\@sarga@\ex\ex\ex}%
+ \ex\ex\ex{\ex\ex\ex\@nameauth@FirstNametrue%
\ex\ex\ex\NameauthFName%
\ex\ex\ex[\ex\the\ex\@nameauth@etoksb\ex]%
\ex{\the\@nameauth@etoksc}}%
\fi
\else
% \end{macrocode}
-% Below are ``native'' Eastern names with alternates and the older syntax. Again, we have three or one use of \cmd{\expandafter} per step before the respective arguments.
+% Below are ``native'' Eastern names with alternates and the older syntax. Again, we have three or one use of \cmd{\ex} per step before the respective arguments.
% \begin{macrocode}
- \ifx\@testb\@empty
- \ex\ex\ex\csgdef\ex\ex\ex{\ex\ex\ex\@arga\ex\ex\ex}%
+ \ifx\@testb@\@empty
+ \ex\ex\ex\csgdef\ex\ex\ex{\ex\ex\ex\@arga@\ex\ex\ex}%
\ex\ex\ex{\ex\ex\ex\NameauthName%
\ex\ex\ex{\ex\the\ex\@nameauth@etoksc\ex}%
\ex[\the\@nameauth@etoksd]}%
- \ex\ex\ex\csgdef\ex\ex\ex{\ex\ex\ex L\ex\ex\ex\@arga%
- \ex\ex\ex}\ex\ex\ex{\ex\ex\ex\@nameauth@FullNametrue%
+ \ex\ex\ex\csgdef\ex\ex\ex{\ex\ex\ex\@larga@\ex\ex\ex}%
+ \ex\ex\ex{\ex\ex\ex\@nameauth@FullNametrue%
\ex\ex\ex\NameauthLName%
\ex\ex\ex{\ex\the\ex\@nameauth@etoksc\ex}%
\ex[\the\@nameauth@etoksd]}%
- \ex\ex\ex\csgdef\ex\ex\ex{\ex\ex\ex S\ex\ex\ex\@arga%
- \ex\ex\ex}\ex\ex\ex{\ex\ex\ex\@nameauth@FirstNametrue%
+ \ex\ex\ex\csgdef\ex\ex\ex{\ex\ex\ex\@sarga@\ex\ex\ex}%
+ \ex\ex\ex{\ex\ex\ex\@nameauth@FirstNametrue%
\ex\ex\ex\NameauthFName%
\ex\ex\ex{\ex\the\ex\@nameauth@etoksc\ex}%
\ex[\the\@nameauth@etoksd]}%
\else
% \end{macrocode}
-% Here are Western names with alternates. We have three arguments to expand, so we have seven, three, and one respective use of \cmd{\expandafter}.
+% \newpage\noindent
+% Here are Western names with alternates. We have three arguments to expand, so we have seven, three, and one respective use of \cmd{\ex}.
% \begin{macrocode}
\ex\ex\ex\ex\ex\ex\ex\csgdef\ex\ex\ex\ex\ex\ex\ex{%
- \ex\ex\ex\ex\ex\ex\ex\@arga\ex\ex\ex\ex\ex\ex\ex}%
+ \ex\ex\ex\ex\ex\ex\ex\@arga@\ex\ex\ex\ex\ex\ex\ex}%
\ex\ex\ex\ex\ex\ex\ex{\ex\ex\ex\ex\ex\ex\ex\NameauthName%
\ex\ex\ex\ex\ex\ex\ex[\ex\ex\ex\the%
\ex\ex\ex\@nameauth@etoksb\ex\ex\ex]%
\ex\ex\ex{\ex\the\ex\@nameauth@etoksc\ex}%
\ex[\the\@nameauth@etoksd]}%
\ex\ex\ex\ex\ex\ex\ex\csgdef\ex\ex\ex\ex\ex\ex\ex{%
- \ex\ex\ex\ex\ex\ex\ex L\ex\ex\ex\ex\ex\ex\ex\@arga%
- \ex\ex\ex\ex\ex\ex\ex}\ex\ex\ex\ex\ex\ex\ex{%
+ \ex\ex\ex\ex\ex\ex\ex\@larga@\ex\ex\ex\ex\ex\ex\ex}%
+ \ex\ex\ex\ex\ex\ex\ex{%
\ex\ex\ex\ex\ex\ex\ex\@nameauth@FullNametrue%
\ex\ex\ex\ex\ex\ex\ex\NameauthLName%
\ex\ex\ex\ex\ex\ex\ex[\ex\ex\ex\the\ex\ex\ex%
@@ -7817,8 +9342,8 @@ the README.txt or README for more information.
\ex\ex\ex{\ex\the\ex\@nameauth@etoksc\ex}%
\ex[\the\@nameauth@etoksd]}%
\ex\ex\ex\ex\ex\ex\ex\csgdef\ex\ex\ex\ex\ex\ex\ex{%
- \ex\ex\ex\ex\ex\ex\ex S\ex\ex\ex\ex\ex\ex\ex\@arga%
- \ex\ex\ex\ex\ex\ex\ex}\ex\ex\ex\ex\ex\ex\ex{%
+ \ex\ex\ex\ex\ex\ex\ex\@sarga@\ex\ex\ex\ex\ex\ex\ex}%
+ \ex\ex\ex\ex\ex\ex\ex{%
\ex\ex\ex\ex\ex\ex\ex\@nameauth@FirstNametrue%
\ex\ex\ex\ex\ex\ex\ex\NameauthFName%
\ex\ex\ex\ex\ex\ex\ex[\ex\ex\ex\the\ex\ex\ex%
@@ -7832,7 +9357,1495 @@ the README.txt or README for more information.
% \end{macrocode}
% \end{environment}
% \Finale
-\endinput
-%\iffalse
+% \endinput
%</package>
-%\fi
+%<*examples>
+%<<examplesvb
+\documentclass[oneside]{article}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Backward compatibility for older distributions of LaTeX.
+%
+% Include the iftex package only if it exists. If the iftex
+% package is older than 2019, include additional packages
+% that aid using multiple LaTeX engines.
+%
+\IfFileExists{iftex.sty}{\usepackage{iftex}}{}
+\unless\ifdefined\RequireTUTeX
+ \usepackage{ifxetex}
+ \usepackage{ifluatex}
+ \usepackage{ifpdf}
+\fi
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Compatibility for multiple LaTeX engines.
+%
+\ifxetex
+ \usepackage{fontspec}
+ \usepackage{polyglossia}
+ \setdefaultlanguage{american}
+\else
+ \ifluatex
+ \ifpdf
+ \usepackage{fontspec}
+ \usepackage{polyglossia}
+ \setdefaultlanguage{american}
+ \else
+ \IfFileExists{utf8-2018.def}{}
+ {\usepackage[utf8]{inputenc}}
+ \usepackage[TS1,T1]{fontenc}
+ \usepackage[american]{babel}
+ \usepackage{lmodern}
+ \fi
+ \else
+ \IfFileExists{utf8-2018.def}{}
+ {\usepackage[utf8]{inputenc}}
+ \usepackage[TS1,T1]{fontenc}
+ \usepackage[american]{babel}
+ \usepackage{lmodern}
+ \fi
+\fi
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Remainder of package inclusions
+%
+\usepackage[textwidth=137mm,textheight=237mm,
+ right=25mm,marginparwidth=39mm,nohead]{geometry}
+\usepackage{booktabs}
+\usepackage{colortbl}
+\usepackage{index}
+\usepackage{nameauth}[2020/11/23]
+\usepackage{verbatim}
+\usepackage{xcolor}
+\colorlet{grey}{black!7!white}
+\usepackage[colorlinks=true]{hyperref}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% We set up indexing, put margin paragraphs on the left,
+% and set up the counter for line numbering in verbatim
+% environments.
+%
+\makeindex
+\newindex{per}{rdx}{rnd}{Index of Persons}
+\renewcommand\NameauthIndex{\index[per]}
+\reversemarginpar
+\newcounter{VerbLine}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Global definitions of conditionals for examples
+% For Scipio Africanus
+\newif\ifSkipGens
+\newif\ifNoGens
+\newif\ifSkipAgnomen
+\newif\ifNoAgnomen
+% For Thomas Jefferson
+\newif\ifGenitive
+\newif\ifDoGen
+% For George Washington/Mustafa Kemal
+\newif\ifNoTag
+% For William Shakespeare
+\newif\ifSpecialFN
+\newif\ifSpecialSN
+\newif\ifRevertSN
+% For advanced hooks
+\newif\ifFbox
+\newif\ifFirstCap
+\newif\ifInHook
+\Fboxtrue
+\newif\ifCaps
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Global definitions of macros for examples
+% For Scipio Africanus
+\newcommand*\SCIPi{\ifNoGens
+ Publius\else Publius Cornelius\fi}
+\newcommand*\SCIPii{\ifNoAgnomen
+ Scipio\else Scipio Africanus\fi}
+\newcommand*\ScipioOnly{\SkipAgnomentrue\Scipio}
+\newcommand*\CSA{\ifNoGens\ifNoAgnomen
+ Scipio\else
+ Scipio Africanus\fi
+ \else\ifNoAgnomen
+ Cornelius Scipio\else
+ Cornelius Scipio Africanus\fi\fi}
+\ExcludeName[Publius]{\noexpand\CSA}
+% For Thomas Jefferson
+\newcommand\JEFF{\ifDoGen\textSC{Jefferson's}\else\textSC{Jefferson}\fi}
+% For William Shakespeare
+\newcommand*\WM{\ifSpecialFN Wm.\else William\fi}
+\newcommand*\SHK{\ifRevertSN \textSC{Shakespeare}\else
+ \ifSpecialSN \noexpand\AltCaps{t}he Bard\else
+ \textSC{Shakespeare}\fi\fi}
+\newcommand*\Revert{\RevertSNtrue}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% We include a few macros from ltxdoc.cls and doc.sty.
+% These are copyright by the LaTeX dev team.
+%
+\makeatletter
+\DeclareRobustCommand\meta[1]{%
+ \ensuremath\langle
+ \ifmmode \expandafter \nfss@text \fi
+ {%
+ \meta@font@select
+ \edef\meta@hyphen@restore
+ {\hyphenchar\the\font\the\hyphenchar\font}%
+ \hyphenchar\font\m@ne
+ \language\l@nohyphenation
+ #1\/%
+ \meta@hyphen@restore
+ }\ensuremath\rangle
+}
+\def\meta@font@select{\itshape}
+\def\cmd#1{\cs{\expandafter\cmd@to@cs\string#1}}
+\def\cmd@to@cs#1#2{\char\number`#2\relax}
+\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}}
+\providecommand\marg[1]{%
+ {\ttfamily\char`\{}\meta{#1}{\ttfamily\char`\}}}
+\providecommand\oarg[1]{%
+ {\ttfamily[}\meta{#1}{\ttfamily]}}
+\providecommand\parg[1]{%
+ {\ttfamily(}\meta{#1}{\ttfamily)}}
+\makeatother
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% We establish name shorthands. Note the heavy use of \noexpand
+% in the macro arguments below. This is intrinsic to the proper
+% function of such arguments (advanced alternate formatting).
+%
+\begin{nameauth}
+ \< Adams & John & \noexpand\textSC{Adams} & >
+ \< SDJR & Sammy & \noexpand\textSC{Davis}, \noexpand\textSC{Jr}. & >
+ \< Dem & & Demetrius, I & >
+ \< deSmet & Pierre-Jean & \noexpand\Fbox{\noexpand\AltCaps{d}e~Smet} & >
+ \< HAR & & Harun, \noexpand\textSC{\noexpand\AltCaps{a}l-Rashid} & >
+ \< Harnack & Adolf & Harnack & >
+ \< Jeff & Thomas & \noexpand\JEFF & >
+ \< Mencius & & \noexpand\textSC{Mencius} & >
+ \< Scipio & \noexpand\SCIPi & \noexpand\SCIPii & >
+ \< OScipio & Publius & \noexpand\CSA & >
+ \< Shak & \noexpand\WM & \noexpand\SHK & >
+ \< Sutorius & Quintus & \noexpand\SUTOR & >
+ \< Wash & George & Washington & >
+\end{nameauth}
+%
+% We could add name info database tags (text tags) either
+% in the preamble or in the document environment. We will do
+% the latter in this example file.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Below we establish sort tags for names. We also can do that
+% later on in the body text. Note again the consistent use of
+% \noexpand with alternate formatting.
+%
+\PretagName[John]{\noexpand\textSC{Adams}}{Adams, John}
+\PretagName[Sammy]{\noexpand\textSC{Davis}, \noexpand\textSC{Jr}.}{Davis, Sammy, Jr.}
+\PretagName{Demetrius, I}{Demetrius 1}
+\PretagName[Pierre-Jean]{\noexpand\Fbox{\noexpand\AltCaps{d}e~Smet}}{de~Smet, Pierre-Jean}
+\PretagName{Harun, \noexpand\textSC{\noexpand\AltCaps{a}l-Rashid}}{Harun al-Rashid}
+\PretagName[Thomas]{\noexpand\JEFF}{Jefferson, Thomas}
+\PretagName{\noexpand\textSC{Mencius}}{Mencius}
+\PretagName{\noexpand\textSC{Meng}, Ke}{Meng Ke}
+\PretagName[\noexpand\SCIPi]{\noexpand\SCIPii}{Scipio Africanus}
+\PretagName[Publius]{\noexpand\CSA}{Cornelius Scipio Africanus}
+\PretagName[Quintus]{\noexpand\SUTOR}{Naevius Sutorius}
+\PretagName[\noexpand\WM]{\noexpand\SHK}{Shakespeare, William}
+\PretagName{Vlad, Ţepeş}{Vlad Tepes}
+\TagName[John]{\noexpand\textSC{Adams}}{, president}
+\TagName{Demetrius, I}{ Soter, king}
+\TagName[Thomas]{\noexpand\JEFF}{, president}
+\TagName{Vlad, II}{ Dracul}
+\TagName{Vlad, III}{ Dracula}
+\TagName[Martin]{Van Buren}{, president}
+\TagName[Ulysses S.]{Grant}{, president}
+\TagName[George]{Washington}{, president}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% We set up line numbering in verbatim environments.
+%
+\makeatletter
+\newcommand*\ClearNum{\def\verbatim@processline{\the\verbatim@line\par}}
+\newcommand*\StartNum{\setcounter{VerbLine}{0}\def\verbatim@processline{\stepcounter{VerbLine}\leavevmode\llap{\footnotesize\normalfont\theVerbLine\quad}\the\verbatim@line\par}}
+\newcommand*\ContinueNum{\def\verbatim@processline{\stepcounter{VerbLine}\leavevmode\llap{\footnotesize\normalfont\theVerbLine\quad}\the\verbatim@line\par}}
+\makeatother
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% The default verbatim format is no line numbers.
+% We add title, author, and date.
+%
+\ClearNum
+\title{\bfseries Longer Examples}
+\author{Charles P. Schaum}
+\date{2020/11/23}
+
+\begin{document}
+\maketitle
+
+\phantomsection
+\pdfbookmark[1]{\contentsname}{toc}
+\tableofcontents
+\newpage
+
+\section{Particles}
+
+First we use variants with the \meta{Alternate} argument:
+
+\NameAddInfo{Demetrius, I}{ Soter}
+\begin{quote}\small
+\StartNum
+\begin{verbatim}
+\NameAddInfo{Demetrius, I}{ Soter}
+\PretagName{Demetrius, I}{Demetrius 1}
+\TagName{Demetrius, I}{ Soter, king}
+\begin{nameauth}
+\< Dem & & Demetrius, I & >
+\end{nameauth}
+\end{verbatim}
+
+ \smallskip
+ \begin{tabular}{ll}\toprule
+ \cmd{\Dem[I Soter]} & \Dem[I Soter]\\
+ \rowcolor{grey}%
+ \cmd{\LDem} & \LDem\\
+ \cmd{\Dem} & \Dem\\\bottomrule
+ \end{tabular}
+ \end{quote}
+
+\begingroup%
+\makeatletter
+\renewcommand*\NamesFormat[1]{%
+ \begingroup%
+ \protected@edef\temp{\endgroup%
+ {#1\noexpand\NameQueryInfo
+ [\unexpanded\expandafter{\the\@nameauth@toksa}]
+ {\unexpanded\expandafter{\the\@nameauth@toksb}}
+ [\unexpanded\expandafter{\the\@nameauth@toksc}]%
+ }%
+ }%
+ \temp%
+}
+\makeatother
+For a more automated approach, we use ``text tags'':
+
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\makeatletter
+\makeatletter
+\renewcommand*\NamesFormat[1]{%
+ \begingroup%
+ \protected@edef\temp{\endgroup%
+ {#1\noexpand\NameQueryInfo
+ [\unexpanded\expandafter{\the\@nameauth@toksa}]
+ {\unexpanded\expandafter{\the\@nameauth@toksb}}
+ [\unexpanded\expandafter{\the\@nameauth@toksc}]%
+ }%
+ }%
+ \temp%
+}
+\makeatother
+\end{verbatim}
+
+\smallskip
+ \begin{tabular}{ll}\toprule
+ \cmd{\ForgetThis}\cmd{\Dem} & \ForgetThis\Dem\\
+ \rowcolor{grey}%
+ \cmd{\LDem} & \LDem\\
+ \cmd{\Dem} & \Dem\\\bottomrule
+ \end{tabular}
+\end{quote}
+\endgroup
+
+\vfil
+\noindent And now for something completely different\dots
+
+ We mention the Electric Boogaloo\index{Boogaloo, Electric}
+ by \Name{Ollie~\& Jerry}.\\
+
+\noindent The index references made here will put:
+
+ ``Boogaloo, Electric'' in the main index
+
+ and ``\ShowIdxPageref*{Ollie~\& Jerry}'' in the index of names.
+\newpage
+
+\section{Roman Names}
+
+ We define all macros and conditionals used in naming macro arguments in the preamble. We use \cmd{\noexpand} in the naming macro arguments to prevent error. Since we do not use \cmd{\CapThis} in the examples below, we skip alternate formatting for simplicity, yet we still recommend it:
+ \begin{quote}\small
+ \StartNum
+ \begin{verbatim}
+\newif\ifSkipGens
+\newif\ifNoGens
+\newif\ifSkipAgnomen
+\newif\ifNoAgnomen
+\newcommand*\SCIPi{\ifNoGens
+ Publius\else Publius Cornelius\fi}
+\newcommand*\SCIPii{\ifNoAgnomen
+ Scipio\else Scipio Africanus\fi}
+\newcommand*\ScipioOnly{\SkipAgnomentrue\Scipio}
+\begin{nameauth}
+ \< Scipio & \noexpand\SCIPi & \noexpand\SCIPii & >
+\end{nameauth}
+\PretagName[\noexpand\SCIPi]{\noexpand\SCIPii}{Scipio Africanus}\end{verbatim}
+ \end{quote}
+
+ We begin a new scope below, redefining the formatting hooks, which affect only names printed in the text. If the local Boolean flags are false, one gets longer name forms. If the flags are true, one gets shorter forms. This approach allows the global state of the flags to be false by default, meaning that one need not remember to set any of them true in the preamble. That results in one less thing to remember, and one less problem to fix.
+\begingroup
+\renewcommand*\NamesFormat[1]
+ {\ifSkipGens\NoGenstrue\fi\ifSkipAgnomen\NoAgnomentrue\fi#1%
+ \global\SkipGensfalse\global\SkipAgnomenfalse}
+\renewcommand*\MainNameHook[1]
+ {\ifSkipGens\NoGenstrue\fi\ifSkipAgnomen\NoAgnomentrue\fi#1%
+ \global\SkipGensfalse\global\SkipAgnomenfalse}
+ \begin{quote}\small
+ \ContinueNum
+ \begin{verbatim}
+\renewcommand*\NamesFormat[1]
+ {\ifSkipGens\NoGenstrue\fi\ifSkipAgnomen\NoAgnomentrue\fi#1%
+ \global\SkipGensfalse\global\SkipAgnomenfalse}
+\renewcommand*\MainNameHook[1]
+ {\ifSkipGens\NoGenstrue\fi\ifSkipAgnomen\NoAgnomentrue\fi#1%
+ \global\SkipGensfalse\global\SkipAgnomenfalse}\end{verbatim}
+ \end{quote}
+
+ The index always shows the name determined by the global state of \cmd{\NoGens} and \cmd{\NoAgnomen}, which we set up as false, meaning a maximally long name form. In the body text we have:
+ \begin{quote}\small
+ \ForgetThis\ScipioOnly\ \cmd{\ScipioOnly} was born around 236 \textsc{bc} into the Scipio branch of the Cornelius clan, one of six large patrician clans. \ScipioOnly\ \cmd{\ScipioOnly} rose to military fame during the Second Punic War. Thereafter he was known as \Scipio\ \cmd{\Scipio}.
+ \end{quote}
+
+ Below we show more information about popular name forms by way of comparison with scholarly name forms.\medskip
+
+ The \textit{Oxford Classical Dictionary} and other scholarly sources index according to the \textit{nomen}. That approach moves the \textit{nomen} from \meta{FNN} to \meta{SNN}.
+
+ The two methods do not clash \textit{per se} in the text, but they make incompatible index entries. In this case, since we have indexed \ScipioOnly\ under the popular form above, we use \cmd{\ExcludeName} to exclude the scholarly form below.
+
+ In the document preamble we define the following Boolean flags and macros. We use a nested conditional in \meta{SNN}. The default still is to show all names so that they can be indexed that way:
+ \begin{quote}\small
+ \StartNum
+ \begin{verbatim}
+\newif\ifSkipGens % These flags remain the same as above.
+\newif\ifNoGens
+\newif\ifSkipAgnomen
+\newif\ifNoAgnomen
+\global\def\CSA{\ifNoGens\ifNoAgnomen
+ Scipio\else
+ Scipio Africanus\fi
+ \else\ifNoAgnomen
+ Cornelius Scipio\else
+ Cornelius Scipio Africanus\fi\fi}
+\ExcludeName[Publius]{\noexpand\CSA}
+\begin{nameauth}
+ \< OScipio & Publius & \noexpand\CSA & > % O for Oxford
+\end{nameauth}
+\PretagName[Publius]{\noexpand\CSA}{Cornelius Scipio Africanus}\end{verbatim}
+ \end{quote}
+
+ We keep the same formatting macros that we defined above. By the way, these formatting macros could work with regular names as well as Roman names, e.g., \LDem, because they have no side effects.
+
+ The scholarly form of Roman names has a different name pattern, so it is not compatible with the popular version. Nevertheless, we show what the index entries would be in a normal \LaTeX\ document without hyperlinks:
+ \begin{quote}\small\IndexActual{@}
+ \textbf{Simplified Name Patterns:}\\
+ Scholarly: \texttt{\ShowPattern[Publius]{\noexpand\CSA}}\\
+ \setbox0\hbox{Scholarly:}\hbox to \wd0{Popular:\hfill} \texttt{\ShowPattern[\noexpand\SCIPi]{\noexpand\SCIPii}}\\
+
+ \textbf{Full Index Entries:}
+ \UntagName[Publius]{\noexpand\CSA}
+ \UntagName[\noexpand\SCIPi]{\noexpand\SCIPii}\\
+ Scholarly:\\ \hbox{}\quad\texttt{\ShowIdxPageref[Publius]{\noexpand\CSA}}\\
+ Popular:\\ \hbox{}\quad\texttt{\ShowIdxPageref[\noexpand\SCIPi]{\noexpand\SCIPii}}
+ \TagName[Publius]{\noexpand\CSA}{\string|hyperpage}
+ \TagName[\noexpand\SCIPi]{\noexpand\SCIPii}{\string|hyperpage}\\
+
+ \textbf{Basic Index Entries:}\\
+ \UntagName[Publius]{\noexpand\CSA}
+ Scholarly:\\ \hbox{}\quad\ShowIdxPageref*[Publius]{\noexpand\CSA}\\
+ Popular:\\ \hbox{}\quad\ShowIdxPageref*[\noexpand\SCIPi]{\noexpand\SCIPii}
+ \end{quote}
+
+ Below we compare some differences between the scholarly and popular forms, and how to get equivalent forms in the text while understanding that they would be two separate forms in the index.
+ \begin{center}\small
+ \begin{tabular}{p{0.51\textwidth}@{\ \ }l}
+ \multicolumn{2}{l}{\textbf{First use:}}\\
+ scholarly:\dotfill \cmd{\OScipio} & \OScipio\\
+ popular:\dotfill \cmd{\Scipio} & \ForgetThis\Scipio\\[2ex]
+
+ \multicolumn{2}{l}{\textbf{Subsequent use:}}\\
+ scholarly:\dotfill \cmd{\OScipio} & \OScipio\\
+ scholarly:\dotfill \cmd{\SkipGenstrue}\cmd{\OScipio} & \SkipGenstrue\OScipio\\
+ popular:\dotfill \cmd{\Scipio} & \SkipGenstrue\Scipio\\[2ex]
+
+ \multicolumn{2}{l}{\textbf{Subsequent use, full, no \textit{agnomen}:}}\\
+ scholarly:\dotfill \cmd{\SkipAgnomentrue}\cmd{\LOScipio} & \SkipAgnomentrue\LOScipio\\
+ popular:\dotfill \cmd{\SkipAgnomentrue}\cmd{\LScipio} & \SkipAgnomentrue\LScipio\\[2ex]
+
+ \multicolumn{2}{l}{\textbf{Subsequent use, shortest forms:}}\\
+ scholarly:\dotfill \cmd{\SkipAgnomentrue}\cmd{\OScipio} & \SkipAgnomentrue\OScipio\\
+ \hfill\cmd{\SkipGenstrue}\cmd{\SkipAgnomentrue}\cmd{\OScipio} & \SkipGenstrue\SkipAgnomentrue\OScipio\\
+ popular:\dotfill \cmd{\SkipAgnomentrue}\cmd{\Scipio\ } & \SkipAgnomentrue\Scipio\\[2ex]
+
+ \multicolumn{2}{l}{\textbf{Subsequent use, personal name:}}\\
+ scholarly:\dotfill \cmd{\SOScipio} & \SOScipio\\
+ popular:\dotfill \cmd{\SScipio} & \SScipio\\
+ popular:\dotfill \cmd{\SkipGenstrue}\cmd{\SScipio} & \SkipGenstrue\SScipio
+ \end{tabular}
+ \end{center}
+ \endgroup
+\newpage
+
+\section{Inflected Name Forms}
+
+\begingroup
+Below we use alternate formatting, sort index entries, and set up a cross-reference, then redefine the hook macros locally.
+\AltFormatActive
+ \renewcommand*\NamesFormat[1]{\ifGenitive\DoGentrue\fi#1\global\Genitivefalse}
+ \renewcommand*\MainNameHook[1]{\ifGenitive\DoGentrue\fi\AltOff#1\global\Genitivefalse}
+ \begin{quote}\small
+ \StartNum
+ \begin{verbatim}
+\begin{nameauth}
+ \< Jeff & Thomas & \noexpand\JEFF & >
+\end{nameauth}
+\PretagName[Thomas]{\noexpand\JEFF}{Jefferson, Thomas}
+\TagName[Thomas]{\noexpand\JEFF}{, president}
+\renewcommand*\NamesFormat[1]
+ {\ifGenitive\DoGentrue\fi#1\global\Genitivefalse}
+\renewcommand*\MainNameHook[1]
+ {\ifGenitive\DoGentrue\fi\AltOff#1\global\Genitivefalse}
+
+Consider \Genitivetrue\Jeff\ legacy. More on \Jeff\ later.
+\Genitivetrue\Jeff\ reputation has declined in recent decades.
+\end{verbatim}
+
+ \smallskip
+ Consider \Genitivetrue\Jeff\ legacy. More on \Jeff\ later.
+ \Genitivetrue\Jeff\ reputation has declined in recent decades.
+ \end{quote}
+\AltFormatInactive
+\endgroup
+\newpage
+
+\section{Example Reference Work}
+
+Below we use alternate formatting, sort index entries, set up a cross-reference, and define a reference article macro:
+
+\AltFormatActive
+\PretagName[Greta]{\textSC{Garbo}}{Garbo, Greta}
+\PretagName{\textSC{Misora}, Hibari}{Misora Hibari}
+\PretagName[Heinz]{\textSC{Rühmann}}{Ruehmann, Heinz}
+\PretagName[Heinrich Wilhelm]{\textSC{Rühmann}}%
+ {Ruehmann, Heinrich Wilhelm}
+\IndexRef[Heinrich Wilhelm]{\textSC{Rühmann}}%
+ {\textSC{Rühmann}, Heinz}%
+\newcommand{\RefArticle}[3]{%
+ \def\check{#2}%
+ \ifx\check\empty
+ \noindent\ForgetThis#1\ #3
+ \else
+ \noindent\ForgetThis#1\ #2\ #3
+ \fi
+}
+\begin{quote}\small
+\StartNum
+\begin{verbatim}
+\AltFormatActive
+\PretagName[Greta]{\textSC{Garbo}}{Garbo, Greta}
+\PretagName{\textSC{Misora}, Hibari}{Misora Hibari}
+\PretagName[Heinz]{\textSC{Rühmann}}{Ruehmann, Heinz}
+\PretagName[Heinrich Wilhelm]{\textSC{Rühmann}}%
+ {Ruehmann, Heinrich Wilhelm}
+\IndexRef[Heinrich Wilhelm]{\textSC{Rühmann}}%
+ {\textSC{Rühmann}, Heinz}%
+\newcommand{\RefArticle}[3]{%
+ \def\check{#2}%
+ \ifx\check\empty
+ \noindent\ForgetThis#1\ #3
+ \else
+ \noindent\ForgetThis#1\ #2\ #3
+ \fi
+}
+\end{verbatim}
+\end{quote}
+
+\cmd{\RefArticle} prints only the first and third arguments if the second is empty, else it prints all three. We determine what those arguments mean by including specific naming macros. That includes using \cmd{\RevComma} for Western names, but not for Eastern ones.
+
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\RefArticle
+ {\RevComma\Name[Greta]{\textSC{Garbo}}}
+ {}
+ {(18 September 1905\,--\,15 April 1990) was a Swedish
+ film actress during the 1920s and 1930s.}
+
+\RefArticle
+ {\Name{\textSC{Misora}, Hibari}}
+ {}
+ {(W: ``\RevName\Name*{\textSC{Misora}, Hibari}'';
+ 29 May 1937\,--\,24 June 1989) was a Japanese singer
+ and actress noted for her positive message.}
+
+\RefArticle
+ {\RevComma\Name[Heinrich Wilhelm]{\textSC{Rühmann}}}
+ {``\SubvertThis\ForceName\FName[Heinz]{\textSC{Rühmann}}''}
+ {(7 March 1902\,--\,3 October 1994) was a German actor
+ in over 100 films.}
+\AltFormatInactive
+\end{verbatim}
+\end{quote}
+
+\begin{quote}\small
+\RefArticle
+ {\RevComma\Name[Greta]{\textSC{Garbo}}}
+ {}
+ {(18 September 1905\,--\,15 April 1990) was a Swedish
+ film actress during the 1920s and 1930s.}
+
+\RefArticle
+ {\Name{\textSC{Misora}, Hibari}}
+ {}%
+ {(W: ``\RevName\Name*{\textSC{Misora}, Hibari}'';
+ 29 May 1937\,--\,24 June 1989) was a Japanese singer
+ and actress noted for her positive message.}
+
+\RefArticle
+ {\RevComma\Name[Heinrich Wilhelm]{\textSC{Rühmann}}}
+ {``\SubvertThis\ForceName\FName[Heinz]{\textSC{Rühmann}}''}
+ {(7 March 1902\,--\,3 October 1994) was a German actor
+ in over 100 films.}
+\end{quote}
+
+\AltFormatInactive
+\newpage
+
+\section{Beamer MWE}
+One must use the macros that control and detect names, otherwise name forms will change as one advances the slides:
+\begin{quote}\small
+\StartNum
+\begin{verbatim}
+\documentclass{beamer}
+\usepackage{nameauth}
+\mode<presentation>
+\beamerdefaultoverlayspecification{<+->}
+
+\begin{document}
+
+\begin{frame}{Move Text Without Retyping Names}
+ \begin{itemize}\footnotesize
+ \item<1-> Original\ForgetName[George]{Washington}%
+ \ForgetName[George]{Washington's}\\
+ This version of \Name[Ulysses S.]{Grant} changes.
+ \begin{enumerate}
+ \item<2-> \IfMainName[George]{Washington's}{He}%
+ {\Name[George]{Washington}}
+ became the first president
+ of the United States.
+ \item<3-> \IfMainName[George]{Washington}{His}%
+ {\SkipIndex\Name*[George]{Washington's}}
+ military successes during the Seven Years War
+ readied him to command the army
+ of the Continental Congress.
+ \end{enumerate}
+ \item<1-> Reordered\ForgetName[George]{Washington}%
+ \ForgetName[George]{Washington's}\\
+ This version of \ForgetThis\Name[Ulysses S.]{Grant}
+ does not change.
+ \begin{enumerate}
+ \item<3-> \IfMainName[George]{Washington}{His}%
+ {\SkipIndex\Name*[George]{Washington's}}
+ military successes during the Seven Years War
+ readied him to command the army
+ of the Continental Congress.
+ \item<2-> \IfMainName[George]{Washington's}{He}%
+ {\Name[George]{Washington}}
+ became the first president
+ of the United States.
+ \end{enumerate}
+ \end{itemize}
+\end{frame}
+
+\end{document}
+\end{verbatim}
+\IndexName[George]{Washington}
+\IndexName[Ulysses S.]{Grant}
+\end{quote}
+
+The overlays, numbered progressively from one to three, begin by deleting name control sequence patterns. Uncontrolled names will change. Name conditionals ensure specific, context-dependent forms based on what name has appeared. These conditionals allow the text to be order-independent.
+\newpage
+
+\section{Hooks: Intro}
+\label{sec:Hooksi}
+
+Here we show that something more complex than a font switch can occur in \cmd{\NamesFormat}. Below we put the first mention of a name in boldface, along with a marginal notation if possible.
+\begin{quote}\small
+\StartNum
+\begin{verbatim}
+\let\OldFormat\NamesFormat
+\renewcommand*\NamesFormat[1]{\textbf{#1}\unless\ifinner
+ \marginpar{\raggedleft\scriptsize #1}\fi}
+\PretagName{Vlad, Ţepeş}{Vlad Tepes} % for accented names
+\TagName{Vlad, II}{ Dracul} % for index information
+\TagName{Vlad, III}{ Dracula}
+\end{verbatim}
+
+\medskip Within the document after the preamble:
+\let\OldFormat\NamesFormat
+\renewcommand*\NamesFormat[1]{\textbf{#1}\unless\ifinner
+ \marginpar{\raggedleft\scriptsize #1}\fi}
+\ContinueNum
+\begin{verbatim}\Name{Vlad, III}[III Dracula], known as
+\AKA{Vlad III}{Vlad, Ţepeş} (the Impaler)
+after his death, was the son of \Name{Vlad, II}[II Dracul],
+a member of the Order of the Dragon. Later references to
+``\Name*{Vlad, III}'' and ``\Name{Vlad, III}'' appear thus.
+\end{verbatim}
+
+\Name{Vlad, III}[III Dracula], known as
+\AKA{Vlad III}{Vlad, Ţepeş} (the Impaler)
+after his death, was the son of \Name{Vlad, II}[II Dracul],
+a member of the Order of the Dragon. Later references to
+``\Name*{Vlad, III}'' and ``\Name{Vlad, III}'' appear thus.
+
+\let\NamesFormat\OldFormat
+\begin{verbatim}\let\NamesFormat\OldFormat\end{verbatim}
+\end{quote}
+Now we have reverted to the default \cmd{\NamesFormat} and we get:
+\begin{itemize}
+ \item \cmd{\ForgetThis}\cmd{\Name\{Vlad, III\}[III Dracula]}\dotfill \ForgetThis\Name{Vlad, III}[III Dracula]
+ \item \cmd{\Name*\{Vlad, III\}}\dotfill \Name*{Vlad, III}
+ \item \cmd{\Name\{Vlad, III\}}\dotfill \Name{Vlad, III}
+\end{itemize}
+We also set up the cross-reference \cmd{\IndexRef\{Dracula\}\{Vlad III\}}\IndexRef{Dracula}{Vlad III}.
+\newpage
+
+\section{Hooks: Life Dates}
+\label{sec:Hooksii}
+\begingroup
+Here we add name conditionals and ``text tags'' to add information to names when desired. The example \cmd{\NamesFormat} below adds a text tag to the first occurrences of main-matter names.
+
+Below we use the three token registers available in \textsf{nameauth} to use the name conditional macros. In \cmd{\AKA} these token registers are copies of the \textbf{last} three arguments, corresponding to the pseudonym. We assume that we will not be using the \texttt{alwaysformat} option, meaning that we only call this hook once for a first use of \cmd{\AKA}. We also use a different formatting for the naming macros on the one hand and \cmd{\AKA} on the other:
+
+The first use of a name is in small caps. Text tags are in boldface with naming macros, and roman with \cmd{\AKA}. Just because we set up a cross-reference does not mean that we have to use \cmd{\AKA}. We use \cmd{\ForceName} as needed with \cmd{\AKA}. In the document preamble we set up the following:
+\begin{quote}\small
+\StartNum
+\begin{verbatim}
+\newif\ifNoTag
+\makeatletter
+\renewcommand*\NamesFormat[1]{\begingroup%
+ \protected@edef\temp{\endgroup\textsc{#1}%
+ \unless\ifNoTag
+ \if@nameauth@InName
+ {\bfseries\noexpand\NameQueryInfo
+ [\unexpanded\expandafter{\the\@nameauth@toksa}]
+ {\unexpanded\expandafter{\the\@nameauth@toksb}}
+ [\unexpanded\expandafter{\the\@nameauth@toksc}]}\fi
+ \if@nameauth@InAKA
+ {\normalfont\noexpand\NameQueryInfo
+ [\unexpanded\expandafter{\the\@nameauth@toksa}]
+ {\unexpanded\expandafter{\the\@nameauth@toksb}}
+ [\unexpanded\expandafter{\the\@nameauth@toksc}]}\fi
+ \fi}\temp\global\NoTagfalse%
+}
+\makeatother
+\let\FrontNamesFormat\NamesFormat
+\end{verbatim}
+\end{quote}
+\makeatletter
+\renewcommand*\NamesFormat[1]{\begingroup%
+ \protected@edef\temp{\endgroup\textsc{#1}%
+ \unless\ifNoTag
+ \if@nameauth@InName
+ {\bfseries\noexpand\NameQueryInfo
+ [\unexpanded\expandafter{\the\@nameauth@toksa}]
+ {\unexpanded\expandafter{\the\@nameauth@toksb}}
+ [\unexpanded\expandafter{\the\@nameauth@toksc}]}\fi
+ \if@nameauth@InAKA
+ {\normalfont\noexpand\NameQueryInfo
+ [\unexpanded\expandafter{\the\@nameauth@toksa}]
+ {\unexpanded\expandafter{\the\@nameauth@toksb}}
+ [\unexpanded\expandafter{\the\@nameauth@toksc}]}\fi
+ \fi}\temp\global\NoTagfalse}%
+\makeatother
+\let\FrontNamesFormat\NamesFormat
+
+We print tags in the first use hooks unless \cmd{\NoTag} is set true. This method uses the two \(\epsilon\)-\TeX{} primitives \cmd{\noexpand} and \cmd{\unexpanded} to avoid repetition of \cmd{\expandafter}. Since \textsf{nameauth} depends on \textsf{etoolbox}, we assume \(\epsilon\)-\TeX.
+
+Before we can refer to any text tags, we must create them. Using the approach above, we include a leading space in the text tags. The leading space is needed only when a text tag appears.\footnote{Another way to add that space is to put it in the conditional path of the formatting hook and leave it out of the text tags entirely: \dots\texttt{\{ \}}\cmd{\noexpand}\cmd{\NameQueryInfo}\dots}
+We also set up a cross-reference, which we will use regardless of whether we also use \cmd{\AKA}. The cross-reference will be created only once and skipped thereafter:
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\NameAddInfo[George]{Washington}{ (1732--99)}
+\NameAddInfo[Mustafa]{Kemal}{ (1881--1938)}
+\NameAddInfo{Atatürk}{ (in 1934, a special surname)}
+\IndexRef{Atatürk}{Kemal, Mustafa}
+\end{verbatim}
+\end{quote}
+\NameAddInfo[George]{Washington}{ (1732--99)}
+\NameAddInfo[Mustafa]{Kemal}{ (1881--1938)}
+\NameAddInfo{Atatürk}{ (in 1934, a special surname)}
+\IndexRef{Atatürk}{Kemal, Mustafa}
+\pagebreak
+
+Now we begin with the first example, which, after all the setup, looks deceptively simple, but highly reusable without extra work:
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\ForgetThis\Wash held office 1789--97.
+No tags: \Wash.\\
+First use, dates suppressed: \NoTagtrue\ForgetThis\Wash.\\
+Subsequent use with format and dates: \ForceName\Wash.
+\end{verbatim}
+
+\smallskip
+\ForgetThis\Wash\ held office 1789--97.\\
+No tags: \Wash.\\
+First use, dates suppressed: \NoTagtrue\ForgetThis\Wash.\\
+Subsequent use with format and dates: \ForceName\Wash.
+\end{quote}
+
+Since we already set up a cross-reference with \cmd{\IndexRef}, we can use just the the naming macros with ``Atatürk'' and get the desired formatting without any page references in the index:
+
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\Name[Mustafa]{Kemal} was granted the name
+\Name{Atatürk}. We mention \Name[Mustafa]{Kemal}
+and \Name{Atatürk} again.
+
+First use, no tag:
+\NoTagtrue\ForgetThis\Name{Atatürk}.
+\end{verbatim}
+
+\smallskip
+\Name[Mustafa]{Kemal} was granted the name
+\Name{Atatürk}. We mention \Name[Mustafa]{Kemal}
+and \Name{Atatürk} again.
+
+First use, no tag:
+\NoTagtrue\ForgetThis\Name{Atatürk}.
+\end{quote}
+
+Since we set up distinct formatting for \cmd{\AKA} (\cmd{\normalfont} instead of boldface for text tags associated with cross-references), we now simulate the \texttt{formatAKA} package option and use \cmd{\ForceName} with \cmd{\AKA}:
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\makeatletter\@nameauth@AKAFormattrue\makeatother
+\ForgetThis\Name[Mustafa]{Kemal} was granted the name
+\ForceName\AKA[Mustafa]{Kemal}{Atatürk}. We mention
+\Name[Mustafa]{Kemal} and \AKA[Mustafa]{Kemal}{Atatürk} again.
+
+First use, no tag:
+\NoTagtrue\ForceName\AKA[Mustafa]{Kemal}{Atatürk}.
+\end{verbatim}
+
+\smallskip
+\makeatletter\@nameauth@AKAFormattrue\makeatother
+\ForgetThis\Name[Mustafa]{Kemal} was granted the name
+\ForceName\AKA[Mustafa]{Kemal}{Atatürk}. We mention
+\Name[Mustafa]{Kemal} and \AKA[Mustafa]{Kemal}{Atatürk} again.
+
+First use, no tag:
+\NoTagtrue\ForceName\AKA[Mustafa]{Kemal}{Atatürk}.
+\end{quote}
+
+We show an alternate part of this example on the next page that does not appear in the manual, but works identically to that above.
+\newpage
+
+We change the look of the page reference just to see if it works. Since we are in a local scope, note the use of \cmd{\global}:
+
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\global\def\fett#1{\textbf{\sffamily #1}}
+\TagName[Mustafa]{Kemal}{|fett}
+\end{verbatim}
+\end{quote}
+\global\def\fett#1{\textbf{\sffamily #1}}
+\TagName[Mustafa]{Kemal}{|fett}
+
+This version does not use $\epsilon$-\TeX primitives. We ``forget'' names as needed and replay the text on the previous page with the new version:
+
+\makeatletter
+\renewcommand*\NamesFormat[1]{%
+ \let\ex\expandafter%
+ \textsc{#1}%
+ \if@nameauth@InName
+ \ifNoTag
+ \else
+ \bfseries%
+ \ex\ex\ex\ex\ex\ex\ex\NameQueryInfo\ex\ex\ex\ex\ex\ex\ex[%
+ \ex\ex\ex\the\ex\ex\ex\@nameauth@toksa\ex\ex\ex]%
+ \ex\ex\ex{\ex\the\ex\@nameauth@toksb\ex}%
+ \ex[\the\@nameauth@toksc]%
+ \fi\fi
+ \if@nameauth@InAKA
+ \ifNoTag
+ \else
+ \normalfont%
+ \ex\ex\ex\ex\ex\ex\ex\NameQueryInfo\ex\ex\ex\ex\ex\ex\ex[%
+ \ex\ex\ex\the\ex\ex\ex\@nameauth@toksa\ex\ex\ex]%
+ \ex\ex\ex{\ex\the\ex\@nameauth@toksb\ex}%
+ \ex[\the\@nameauth@toksc]%
+ \fi\fi
+ \global\NoTagfalse}
+\makeatother
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\newif\ifNoTag
+\makeatletter
+\renewcommand*\NamesFormat[1]{%
+ \let\ex\expandafter%
+ \textsc{#1}%
+ \if@nameauth@InName
+ \ifNoTag
+ \else
+ \bfseries%
+ \ex\ex\ex\ex\ex\ex\ex\NameQueryInfo\ex\ex\ex\ex\ex\ex\ex[%
+ \ex\ex\ex\the\ex\ex\ex\@nameauth@toksa\ex\ex\ex]%
+ \ex\ex\ex{\ex\the\ex\@nameauth@toksb\ex}%
+ \ex[\the\@nameauth@toksc]%
+ \fi\fi
+ \if@nameauth@InAKA
+ \ifNoTag
+ \else
+ \normalfont%
+ \ex\ex\ex\ex\ex\ex\ex\NameQueryInfo\ex\ex\ex\ex\ex\ex\ex[%
+ \ex\ex\ex\the\ex\ex\ex\@nameauth@toksa\ex\ex\ex]%
+ \ex\ex\ex{\ex\the\ex\@nameauth@toksb\ex}%
+ \ex[\the\@nameauth@toksc]%
+ \fi\fi
+ \global\NoTagfalse}
+\makeatother
+\end{verbatim}
+
+\smallskip
+With \cmd{\Name}:\\
+\ForgetThis\Name[Mustafa]{Kemal} was granted the name
+\ForgetThis\Name{Atatürk}. We mention \Name[Mustafa]{Kemal}
+and \Name{Atatürk} again.
+
+First use, no tag: \NoTagtrue\ForgetThis\Name{Atatürk}.\bigskip
+
+With \cmd{\AKA}:\\
+\makeatletter\@nameauth@AKAFormattrue\makeatother
+\ForgetThis\Name[Mustafa]{Kemal} was granted the name
+\ForceName\AKA[Mustafa]{Kemal}{Atatürk}. We mention
+\Name[Mustafa]{Kemal} and \AKA[Mustafa]{Kemal}{Atatürk} again.
+
+First use, no tag: \NoTagtrue\ForceName\AKA[Mustafa]{Kemal}{Atatürk}.
+\end{quote}
+
+Now we end the scope.
+\endgroup
+\newpage
+
+\section{Hooks: Advanced}
+\label{sec:Hooksiii}
+\AltFormatActive
+In this section we invoke \cmd{\AltFormatActive} and create several scopes containing respective examples. Some macros in this section normally should be defined in a document preamble. We define them locally and ensure that names do not use them when they are undefined. This is not best practices, but it makes sense for this manual's need for multiple redefinitions.
+
+\begin{center}\bfseries Continental Format: User-Defined\end{center}
+\phantomsection
+\begingroup
+The user must implement this final step. We use \cmd{\AltFormatActive}, then redefine \cmd{\MainNameHook} to have small caps on by default in the index and first uses in the text, then off in subsequent uses in the text:
+\begin{quote}\small
+\StartNum
+\begin{verbatim}
+\renewcommand*\MainNameHook{\AltOff}
+\let\FrontNameHook\MainNameHook
+\end{verbatim}
+\end{quote}
+\renewcommand*\MainNameHook{\AltOff}
+\let\FrontNameHook\MainNameHook
+
+Usually, we set up the names and any related macros in the preamble:
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\begin{nameauth}
+ \< Adams & John & \noexpand\textSC{Adams} & >
+ \< SDJR & Sammy & \noexpand\textSC{Davis},
+ \noexpand\textSC{Jr}. & >
+ \< HAR & & Harun, \noexpand\textSC%
+ {\noexpand\AltCaps{a}l-Rashid} & >
+ \< Mencius & & \noexpand\textSC{Mencius} & >
+\end{nameauth}
+\end{verbatim}
+\end{quote}
+
+Likewise in the preamble, we must ensure that these names are sorted properly in the index. When sorting names, be sure to use \cmd{\noexpand} as well:
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\PretagName[John]{\noexpand\textSC{Adams}}{Adams, John}
+\PretagName[Sammy]%
+ {\noexpand\textSC{Davis}, \noexpand\textSC{Jr}.}%
+ {Davis, Sammy, Jr.}
+\PretagName{Harun, \noexpand\textSC%
+ {\noexpand\AltCaps{a}l-Rashid}}{Harun al-Rashid}
+\PretagName{\noexpand\textSC{Mencius}}{Mencius}
+\end{verbatim}
+\end{quote}
+
+\begin{center}
+\small\noindent\begin{tabular}{llll}\toprule
+ First & Next & Long & Short \\\midrule
+ \cmd{\Adams} & \cmd{\Adams} & \cmd{\LAdams} & \cmd{\SAdams}\\
+ \Adams & \Adams & \LAdams & \SAdams\\
+ \rowcolor{grey}\cmd{\SDJR} & \cmd{\SDJR} & \cmd{\LSDJR} & \cmd{\SSDJR}\\
+ \rowcolor{grey}\SDJR & \SDJR & \LSDJR & \SSDJR\\
+ \cmd{\HAR} & \cmd{\HAR} & \cmd{\LHAR} & \cmd{\SHAR}\\
+ \HAR & \HAR & \LHAR & \SHAR\\
+ \rowcolor{grey}\cmd{\Mencius} & \cmd{\Mencius} & \cmd{\LMencius} & \cmd{\SMencius}\\
+ \rowcolor{grey}\Mencius & \Mencius & \LMencius & \SMencius\\\bottomrule
+\end{tabular}
+\end{center}
+
+\begin{itemize}\small
+ \item Punctuation detection works: \ForceName\LSDJR. Also \LSDJR. Then \ForceName\SDJR. Now \SDJR. (We used \cmd{\ForceName} for formatting.)
+ \item \cmd{\ForceName}\cmd{\DropAffix}\cmd{\LSDJR} gives \ForceName\DropAffix\LSDJR. Just \cmd{\DropAffix}\cmd{\LSDJR} gives \DropAffix\LSDJR.
+ \item \cmd{\RevComma}\cmd{\LAdams} yields \RevComma\LAdams. All the reversing macros work.
+ \item \cmd{\ForceName}\cmd{\ForceFN}\cmd{\SHAR} produces \ForceName\ForceFN\SHAR. \cmd{\ForceFN}\cmd{\SHAR} produces \ForceFN\SHAR. If we add \cmd{\CapThis} we get \CapThis\ForceName\ForceFN\SHAR\ and \CapThis\ForceFN\SHAR.
+ \item One must include all the macros in the name arguments.
+\end{itemize}
+
+\makeatletter\@nameauth@AKAFormattrue\makeatother
+With the \texttt{formatAKA} option we refer to \Mencius\ as \AKA{\noexpand\textSC{Mencius}}{\noexpand\textSC{Meng}, Ke} and \AKA{\noexpand\textSC{Mencius}}{\noexpand\textSC{Meng}, Ke}:
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\PretagName{\noexpand\textSC{Meng}, Ke}{Meng Ke}
+\AKA{\noexpand\textSC{Mencius}}{\noexpand\textSC{Meng}, Ke}
+\end{verbatim}
+\end{quote}
+\makeatletter\@nameauth@AKAFormatfalse\makeatother
+\endgroup
+
+\begin{center}\bfseries Rolling Your Own: Basic\end{center}
+\phantomsection
+\begingroup
+Here we set out on the path to custom formatting by using package features that have been implemented already. When redesigning formatting hooks, we recommend using \cmd{\AltFormatActive} or the \texttt{altformat} option to enable alternate formatting and prevent \cmd{\CapThis} from breaking custom formatting macros.
+
+We recommend examining the internal package flag \cmd{\@nameauth@DoAlt}, which activates alternate formatting, \cmd{\@nameauth@DoCaps}, which handles capitalization, and finally \cmd{\@nameauth@InHook}, which is true when the formatting hooks are called. If you create your own macros, they will look similar.
+
+Normally we define a macro for use in name arguments in the document preamble in order to ensure that it is always defined:
+\begin{quote}\small
+\StartNum
+\begin{verbatim}
+\makeatletter
+\newcommand*\Fbox[1]{%
+ \if@nameauth@DoAlt\protect\fbox{#1}\else#1\fi
+}
+\makeatother
+\end{verbatim}
+\end{quote}
+\makeatletter
+\newcommand*\Fbox[1]{%
+ \if@nameauth@DoAlt\protect\fbox{#1}\else#1\fi
+}
+\makeatother
+
+Since \cmd{\AltCaps} is part of \textsf{nameauth}, you need not reinvent that wheel. Just use it. The final step is redefining the hooks, which can be as simple as:
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\renewcommand*\MainNameHook{\AltOff}
+\let\FrontNameHook\MainNameHook
+\end{verbatim}
+\end{quote}
+\renewcommand*\MainNameHook{\AltOff}
+\let\FrontNameHook\MainNameHook
+
+When sorting names, be sure to use \cmd{\noexpand} as shown previously:
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\begin{nameauth}
+ \< deSmet & Pierre-Jean &
+ \noexpand\Fbox{\noexpand\AltCaps{d}e~Smet} & >
+\end{nameauth}
+
+\PretagName[Pierre-Jean]%
+ {\noexpand\Fbox{\noexpand\AltCaps{d}e~Smet}}%
+ {de~Smet, Pierre-Jean}
+\end{verbatim}
+\end{quote}
+
+Now we show how the formatting hooks work in the body text. One can check the index to see that it is formatted properly and consistently.
+
+\begin{center}\small
+\begin{tabular}{rll}\toprule
+ First & \cmd{\deSmet} & \deSmet\\
+ \rowcolor{grey}Next & \cmd{\deSmet} & \deSmet\\
+ Long & \cmd{\LdeSmet} & \LdeSmet\\
+ \rowcolor{grey}Short & \cmd{\SdeSmet} & \SdeSmet\\
+ & \cmd{\CapThis}\cmd{\deSmet} & \CapThis\deSmet\\
+ \rowcolor{grey} & \cmd{\ForceName}\cmd{\CapThis}\cmd{\deSmet} & \ForceName\CapThis\deSmet\\\bottomrule
+\end{tabular}
+\end{center}
+
+With \cmd{\CapThis}\cmd{\deSmet}: \CapThis\deSmet. \cmd{\ForceName}\cmd{\CapThis}\cmd{\deSmet}: \ForceName\CapThis\deSmet.\medskip
+
+Some formatting, such as the use of \cmd{\textSC}, is fairly standard. Other formatting, such as \cmd{\Fbox} above, is ornamental and may be handled better with custom features, but those features appear only in the text.
+\endgroup
+
+\begin{center}\bfseries Rolling Your Own: Intermediate\end{center}
+\phantomsection
+\begingroup
+``Intermediate'' and ``advanced'' refer to the way that formatting hooks were designed before version 3.1. The user-accessible \cmd{\NameParser} builds a printed name from the internal, locally-scoped macros \cmd{\FNN}, \cmd{\SNN}, \cmd{\rootb} and \cmd{\suffb}.
+
+We create a hook that can ignore the output of \cmd{\@nameauth@Name}, which is the \texttt{\#1} in the hook dispatcher's code \cmd{\bgroup}\meta{Hook}\texttt{\{\#1\}}\cmd{\egroup}:
+\begin{quote}\small
+ \cmd{\renewcommand*}\meta{FirstHook}\texttt{[1]\{\dots}\cmd{\NameParser}\texttt{\dots\}}
+\end{quote}
+
+With the \texttt{altformat} option or \cmd{\AltFormatActive} we can design a subsequent-use hook that deactivates formatting inside of it:
+\begin{quote}\small
+ \cmd{\renewcommand*}\meta{SubsequentHook}\texttt{[1]\{\dots}\cmd{\AltOff}\cmd{\NameParser}\texttt{\dots\}}
+\end{quote}
+
+If we used \cmd{\AltFormatActive*}, where the formatting macros are enabled, but deactivated, then we might want a hook that activates the macros:
+\begin{quote}\small
+ \cmd{\renewcommand*}\meta{Hook}\texttt{[1]\{\dots}\cmd{\AltOn}\cmd{\NameParser}\texttt{\dots\}}
+\end{quote}
+
+\makeatletter
+\renewcommand*\NamesFormat[1]{%
+ \RevertSNfalse\SpecialFNfalse\SpecialSNfalse#1%
+ \unless\ifinner\marginpar{%
+ \footnotesize\raggedleft%
+ \@nameauth@FullNametrue%
+ \@nameauth@FirstNamefalse%
+ \@nameauth@EastFNfalse%
+ \SpecialFNtrue\SpecialSNfalse%
+ \NameParser}%
+ \fi\global\RevertSNfalse}
+\renewcommand*\MainNameHook[1]{%
+ \AltOff\SpecialFNfalse\SpecialSNtrue#1%
+ \unless\ifinner
+ \unless\ifRevertSN
+ \marginpar{%
+ \footnotesize\raggedleft%
+ \@nameauth@FullNamefalse%
+ \@nameauth@FirstNamefalse%
+ \@nameauth@EastFNfalse%
+ \SpecialFNfalse\SpecialSNfalse%
+ \NameParser}%
+ \fi
+ \fi\global\RevertSNfalse}
+\makeatother
+We begin in the document preamble by defining a series of conditionals and macros whose default expansion produces the index entry, yet whose other expansions occur only in the formatting hooks. Then we create a name that is composed only of macros, using \cmd{\noexpand} with \cmd{\WM} and \cmd{\SHK}. We use \cmd{\PretagName} to sort the names. \cmd{\Revert} is used to print a last name without a margin note.
+\begin{quote}\small
+\StartNum
+\begin{verbatim}
+\newif\ifSpecialFN
+\newif\ifSpecialSN
+\newif\ifRevertSN
+\newcommand*\WM{\ifSpecialFN Wm.\else William\fi}
+\newcommand*\SHK{\ifRevertSN \textSC{Shakespeare}\else
+ \ifSpecialSN \noexpand\AltCaps{t}he Bard\else
+ \textSC{Shakespeare}\fi\fi}
+\newcommand*\Revert{\RevertSNtrue}
+
+\begin{nameauth}
+ \< Shak & \noexpand\WM & \noexpand\SHK & >
+\end{nameauth}
+
+\PretagName[\noexpand\WM]{\noexpand\SHK}{Shakespeare, William}
+\PretagName[Robert]{\textSC{Burns}}{Burns, Robert}
+\end{verbatim}
+\end{quote}
+
+Below we define the two formatting hooks that structure the ways in which these macros can expand when printed in the text. \cmd{\NamesFormat} allows only the canonical name via \cmd{\RevertSNfalse}, \cmd{\SpecialFNfalse}, and \cmd{\SpecialSNfalse}. We print the canonical name in the body text. If allowed, we print a margin paragraph with an alternate full name using \cmd{\NameParser} and two flags. Both hooks set \cmd{\RevertSNfalse} so that \cmd{\Revert} works on a per-name basis. The subsequent-use hook disables formatting with \cmd{\AltOff}, but it allows variant forms.
+
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\makeatletter
+\renewcommand*\NamesFormat[1]{%
+ \RevertSNfalse\SpecialFNfalse\SpecialSNfalse#1%
+ \unless\ifinner\marginpar{%
+ \footnotesize\raggedleft%
+ \@nameauth@FullNametrue%
+ \@nameauth@FirstNamefalse%
+ \@nameauth@EastFNfalse%
+ \SpecialFNtrue\SpecialSNfalse%
+ \NameParser}%
+ \fi\global\RevertSNfalse}
+\renewcommand*\MainNameHook[1]{%
+ \AltOff\SpecialFNfalse\SpecialSNtrue#1%
+ \unless\ifinner
+ \unless\ifRevertSN
+ \marginpar{%
+ \footnotesize\raggedleft%
+ \@nameauth@FullNamefalse%
+ \@nameauth@FirstNamefalse%
+ \@nameauth@EastFNfalse%
+ \SpecialFNfalse\SpecialSNfalse%
+ \NameParser}%
+ \fi
+ \fi\global\RevertSNfalse}
+\makeatother
+\end{verbatim}
+
+\smallskip
+\Shak\ \cmd{\Shak} is the national poet of England in much the same way that \Name[Robert]{\textSC{Burns}} \cmd{\Name[Robert]\{}\cmd{\textSC\{Burns\}\}} is that of Scotland. With the latter's rise of influence in the 1800s, \Revert\Shak\ \cmd{\Revert}\cmd{\Shak} became known as ``\Shak'' \cmd{\Shak}.
+\end{quote}
+\endgroup
+
+\begin{center}\bfseries Rolling Your Own: Advanced\end{center}
+\phantomsection
+\begingroup
+Here is how formatting hooks were designed before version 3.0. Updating older hooks may be helpful, but is not necessary. We do not use the internal package macros. We only use \cmd{\NameParser} in the hooks to produce output. We still recommend using \cmd{\AltFormatActive} to mitigate errors. In the preamble, three flags replace package internals.\footnote{The internal flag \texttt{\textbackslash @nameauth@DoAlt} activates formatting, \cmd{\CapThis} sets \texttt{\textbackslash @nameauth@DoCaps} true, and \texttt{\textbackslash @nameauth@InHook} is set by the hook dispatcher.}
+Setting \texttt{\textbackslash Fboxtrue} is equivalent to using \cmd{\AltFormatActive}:
+\begin{quote}\small
+\StartNum
+\begin{verbatim}
+\newif\ifFbox% Replaces \@nameauth@DoAlt
+\newif\ifFirstCap% Replaces \@nameauth@DoCaps
+\newif\ifInHook% Replaces \@nameauth@InHook
+\Fboxtrue
+\end{verbatim}
+\end{quote}
+
+\newcommand*\Fbox[1]{\ifFbox\protect\fbox{#1}\else#1\fi}
+Also in the preamble, the formatting macro is like what we have seen, except it refers to \texttt{\textbackslash ifFbox}:\footnote{We define \cmd{\Fbox} locally because it has multiple definitions, but are very careful where we use names with it.}
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\newcommand*\Fbox[1]{%
+ \ifFbox\protect\fbox{#1}\else#1\fi
+}
+\end{verbatim}
+\end{quote}
+
+\renewcommand*\AltCaps[1]{%
+ \ifInHook
+ \ifFirstCap\MakeUppercase{#1}\else#1\fi
+ \else
+ #1%
+ \fi
+}
+Our new \cmd{\AltCaps} works like the built-in version, except it does not use the internal macros and flags:
+ \begin{quote}\small
+ \ContinueNum
+ \begin{verbatim}
+\renewcommand*\AltCaps[1]{%
+ \ifInHook
+ \ifFirstCap\MakeUppercase{#1}\else#1\fi
+ \else
+ #1%
+ \fi
+}
+\end{verbatim}
+\end{quote}
+
+\renewcommand*\CapThis{\FirstCaptrue}
+\renewcommand*\NamesFormat[1]
+ {\InHooktrue\NameParser\global\FirstCapfalse}
+\renewcommand*\MainNameHook[1]
+ {\Fboxfalse\InHooktrue\NameParser\global\FirstCapfalse}
+\let\FrontNamesFormat\Namesformat
+\let\FrontNameHook\MainNameHook
+Here we redefine \cmd{\CapThis} to use our flag instead of the internal flag:
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\renewcommand*\CapThis{\FirstCaptrue}
+\end{verbatim}
+\end{quote}
+
+We have to reproduce the logic and macros that the package would have provided. That means defining everything, including \cmd{\NamesFormat}, from scratch:
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\renewcommand*\NamesFormat[1]
+ {\InHooktrue\NameParser\global\FirstCapfalse}
+\end{verbatim}
+\end{quote}
+
+Changes to \texttt{\textbackslash ifInHook} (default false) and \texttt{\textbackslash ifFbox} (default true) are local to the scope in which the hook macros are called. \texttt{\textbackslash ifFirstCap} must be set globally. Below we reproduce the logic of \cmd{\AltOff} before \cmd{\NameParser}:
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\renewcommand*\MainNameHook[1]
+{\Fboxfalse\InHooktrue\NameParser\global\FirstCapfalse}
+\end{verbatim}
+\end{quote}
+
+We avoid spurious index entries in the front matter by using the same hooks.
+\begin{quote}\small
+\ContinueNum
+\begin{verbatim}
+\let\FrontNamesFormat\Namesformat
+\let\FrontNameHook\MainNameHook
+\end{verbatim}
+\end{quote}
+
+Because we use \cmd{\noexpand}, our ``old-style'' macros will index the following names under the same entry as the ``new-style'' macros.
+\begin{center}\small
+\begin{tabular}{rll}\toprule
+ First & \cmd{\deSmet} & \ForgetThis\deSmet\\
+ \rowcolor{grey}Next & \cmd{\deSmet} & \deSmet\\
+ Long & \cmd{\LdeSmet} & \LdeSmet\\
+ \rowcolor{grey}Short & \cmd{\SdeSmet} & \SdeSmet\\
+ & \cmd{\CapThis}\cmd{\deSmet} & \CapThis\deSmet\\
+ \rowcolor{grey} & \cmd{\ForceName}\cmd{\CapThis}\cmd{\deSmet} & \ForceName\CapThis\deSmet\\\bottomrule
+\end{tabular}
+\end{center}
+
+With \cmd{\CapThis}\cmd{\deSmet}: \CapThis\deSmet. \cmd{\ForceName}\cmd{\CapThis}\cmd{\deSmet}: \ForceName\CapThis\deSmet.\medskip
+
+We can reuse new-style names with old-style macros, shown below in abbreviated fashion. We keep the flags \texttt{\textbackslash ifFirstCap} and \texttt{\textbackslash ifInHook}. We also keep the redefined \cmd{\AltCaps}, \cmd{\CapThis}, and \cmd{\NamesFormat}. We then add:
+\Capstrue
+\renewcommand*\textSC[1]{%
+ \ifCaps\textsc{#1}\else#1\fi
+}
+\renewcommand*\MainNameHook[1]
+{%
+ \Capsfalse\InHooktrue\NameParser%
+ \global\FirstCapfalse%
+}
+\let\FrontNameHook\MainNameHook
+\begin{quote}\small
+\StartNum
+\begin{verbatim}
+\newif\ifCaps
+\Capstrue
+\renewcommand*\textSC[1]{%
+ \ifCaps\textsc{#1}\else#1\fi
+}
+\renewcommand*\MainNameHook[1]
+{%
+ \Capsfalse\InHooktrue\NameParser%
+ \global\FirstCapfalse%
+}
+\let\FrontNameHook\MainNameHook
+\end{verbatim}
+\end{quote}
+
+The names below have the same declarations and index entries as they did above. They look and work the same but use different back-end macros:
+\begin{center}
+\small\noindent\begin{tabular}{llll}\toprule
+ First & Next & Long & Short \\\midrule
+ \ForgetThis\Adams & \Adams & \LAdams & \SAdams\\
+ \rowcolor{grey}\ForgetThis\SDJR & \SDJR & \LSDJR & \SSDJR\\
+ \ForgetThis\HAR & \HAR & \LHAR & \SHAR\\
+ \rowcolor{grey}\ForgetThis\Mencius & \Mencius & \LMencius & \SMencius\\\bottomrule
+\end{tabular}
+\end{center}
+
+\begin{itemize}\small
+ \item Punctuation detection works: \ForceName\LSDJR. Also \LSDJR. Then \ForceName\SDJR. Now \SDJR. (We used \cmd{\ForceName} for formatting.)
+ \item \cmd{\ForceName}\cmd{\DropAffix}\cmd{\LSDJR} gives \ForceName\DropAffix\LSDJR. Just \cmd{\DropAffix}\cmd{\LSDJR} gives \DropAffix\LSDJR.
+ \item \cmd{\RevComma}\cmd{\LAdams} yields \RevComma\LAdams. All the reversing macros work.
+ \item \cmd{\ForceName}\cmd{\ForceFN}\cmd{\SHAR} produces \ForceName\ForceFN\SHAR. \cmd{\ForceFN}\cmd{\SHAR} produces \ForceFN\SHAR. If we add \cmd{\CapThis} we get \CapThis\ForceName\ForceFN\SHAR\ and \CapThis\ForceFN\SHAR.
+\end{itemize}
+
+We now close the scope of this current example and resume normal formatting.
+\endgroup
+\AltFormatInactive
+\newpage
+
+\section{Customization}
+
+Assuming that redefining hooks and adding control sequences is insufficient, one could redesign the core name macros partially or wholly, then hook those modifications into the \textsf{nameauth} package without needing to patch the style file itself.
+
+All these macros are set by default to \cmd{\@nameauth@Name}, the internal name parser. \cmd{\Name}, or an unmodified shorthand, calls \cmd{\NameauthName}. \cmd{\Name*}, or an L-shorthand, sets \cmd{\@nameauth@FullNametrue}, then calls \cmd{\NameauthLName}. \cmd{\FName}, or an S-shorthand, sets \cmd{\@nameauth@FirstNametrue}, then calls \cmd{\NameauthFName}. One should not modify \cmd{\Name} and \cmd{\FName} directly.
+
+We use features of \textsf{xargs}. Below we introduce formatting that is additional to, inter-operative with, yet distinct from the formatting hooks:
+\begin{quote}\small
+\StartNum
+\begin{verbatim}
+\makeatletter
+\newcommandx*\MyName[3][1=\@empty, 3=\@empty]{%
+ \global\@nameauth@toksa\expandafter{#1}%
+ \global\@nameauth@toksb\expandafter{#2}%
+ \global\@nameauth@toksc\expandafter{#3}%
+ \hbox to 4em{Normal: \hfill}%
+ \fcolorbox{black}{gray!25!white}{\@nameauth@Name[#1]{#2}[#3]}%
+}
+\newcommandx*\MyLName[3][1=\@empty, 3=\@empty]{%
+ \global\@nameauth@toksa\expandafter{#1}%
+ \global\@nameauth@toksb\expandafter{#2}%
+ \global\@nameauth@toksc\expandafter{#3}%
+ \hbox to 4em{Long: \hfill}%
+ \fcolorbox{black}{green!25!white}{\@nameauth@Name[#1]{#2}[#3]}%
+}
+\newcommandx*\MyFName[3][1=\@empty, 3=\@empty]{%
+ \global\@nameauth@toksa\expandafter{#1}%
+ \global\@nameauth@toksb\expandafter{#2}%
+ \global\@nameauth@toksc\expandafter{#3}%
+ \hbox to 4em{Short: \hfill}%
+ \fcolorbox{black}{yellow!25!white}{\@nameauth@Name[#1]{#2}[#3]}%
+}
+\makeatother
+\renewcommand*\NamesFormat[1]
+ {\hbox to 9em{\hfil\scshape#1\hfil}}
+\renewcommand*\MainNameHook[1]{\hbox to 9em{\hfil#1\hfil}}
+\renewcommand*\NameauthName{\MyName}
+\renewcommand*\NameauthLName{\MyLName}
+\renewcommand*\NameauthFName{\MyFName}
+\end{verbatim}
+
+\makeatletter
+\newcommandx*\MyName[3][1=\@empty, 3=\@empty]{%
+ \global\@nameauth@toksa\expandafter{#1}%
+ \global\@nameauth@toksb\expandafter{#2}%
+ \global\@nameauth@toksc\expandafter{#3}%
+ \hbox to 4em{Normal: \hfill}%
+ \fcolorbox{black}{gray!25!white}{\@nameauth@Name[#1]{#2}[#3]}%
+}
+\newcommandx*\MyLName[3][1=\@empty, 3=\@empty]{%
+ \global\@nameauth@toksa\expandafter{#1}%
+ \global\@nameauth@toksb\expandafter{#2}%
+ \global\@nameauth@toksc\expandafter{#3}%
+ \hbox to 4em{Long: \hfill}%
+ \fcolorbox{black}{green!25!white}{\@nameauth@Name[#1]{#2}[#3]}%
+}
+\newcommandx*\MyFName[3][1=\@empty, 3=\@empty]{%
+ \global\@nameauth@toksa\expandafter{#1}%
+ \global\@nameauth@toksb\expandafter{#2}%
+ \global\@nameauth@toksc\expandafter{#3}%
+ \hbox to 4em{Short: \hfill}%
+ \fcolorbox{black}{yellow!25!white}{\@nameauth@Name[#1]{#2}[#3]}%
+}
+\makeatother
+\renewcommand*\NamesFormat[1]{\hbox to 9em{\hfil\scshape#1\hfil}}
+\renewcommand*\MainNameHook[1]{\hbox to 9em{\hfil#1\hfil}}
+\renewcommand*\NameauthName{\MyName}%
+\renewcommand*\NameauthLName{\MyLName}%
+\renewcommand*\NameauthFName{\MyFName}
+
+\smallskip
+\cmd{\ForgetName[Adolf]\{Harnack\}}\ForgetName[Adolf]{Harnack}\\[1ex]
+\begin{tabular}{@{}rl}
+ \cmd{\Harnack} & \Harnack\\
+ \cmd{\LHarnack[Adolf von]} & \LHarnack[Adolf von]\\
+ \cmd{\Harnack} & \Harnack\\
+ \cmd{\SHarnack} & \SHarnack\\
+\end{tabular}
+\end{quote}
+\newpage
+
+\section{\protect\LaTeX\ Engines}
+
+We use \texttt{american} for the language; one should use one's own. We use Latin Modern. We could load \textsf{tikz} using \texttt{\textbackslash ifDoTikZ} to avoid crashing some \texttt{dvi} viewers in a \texttt{dvi}-only workflow.
+
+\begin{quote}\small
+\StartNum
+\begin{verbatim}
+\IfFileExists{iftex.sty}{\usepackage{iftex}}{}
+\unless\ifdefined\RequireTUTeX
+ \usepackage{ifxetex}
+ \usepackage{ifluatex}
+ \usepackage{ifpdf}
+\fi
+
+\newif\ifDoTikZ % If dvi-only workflow
+\ifxetex
+ \usepackage{fontspec}
+ \usepackage{polyglossia}
+ \setdefaultlanguage{american} % Use own language
+ \usepackage{tikz}
+ \DoTikZtrue % If dvi-only workflow
+\else
+ \ifluatex
+ \ifpdf
+ \usepackage{fontspec}
+ \usepackage{polyglossia}
+ \setdefaultlanguage{american} % Use own language
+ \usepackage{tikz}
+ \DoTikZtrue % If dvi-only workflow
+ \else
+ \IfFileExists{utf8-2018.def}{}
+ {\usepackage[utf8]{inputenc}}
+ \usepackage[TS1,T1]{fontenc}
+ \usepackage[american]{babel} % Use own language
+ \usepackage{lmodern}
+ % Perhaps add \usepackage{tikz}
+ \fi
+ \else
+ \IfFileExists{utf8-2018.def}{}
+ {\usepackage[utf8]{inputenc}}
+ \usepackage[TS1,T1]{fontenc}
+ \usepackage[american]{babel} % Use own language
+ \usepackage{lmodern}
+ \ifpdf
+ \usepackage{tikz} % If dvi-only workflow
+ \DoTikZtrue % If dvi-only workflow
+ \fi
+ \fi
+\fi
+\end{verbatim}
+\end{quote}
+\newpage
+
+In the body text we can use something like the test below for:
+
+\begin{center}\fbox{\ifxetex doing \texttt{pdf} things\else \ifpdf doing \texttt{pdf} things\else doing \texttt{dvi} things\fi\fi}\end{center}
+
+\begin{quote}\small
+\begin{verbatim}
+\ifxetex
+ doing \texttt{pdf} things
+\else
+ \ifpdf
+ doing \texttt{pdf} things
+ \else
+ doing \texttt{dvi} things
+ \fi
+\fi\end{verbatim}
+\end{quote}
+
+The following equivalent conditional statements can help a macro or just the body text to work under multiple engines:
+\begin{quote}\small
+\StartNum
+\begin{verbatim}
+\ifxetex xelatex%
+\else
+ \ifluatex
+ \ifpdf lualatex (pdf)%
+ \else lualatex (dvi)%
+ \fi
+ \else
+ \ifpdf pdflatex%
+ \else latex (dvi)%
+ \fi
+ \fi
+\fi
+\end{verbatim}
+
+\StartNum
+\begin{verbatim}
+\unless\ifxetex
+ \unless\ifluatex
+ \ifpdf pdflatex%
+ \else latex (dvi)%
+ \fi
+ \else
+ \ifpdf lualatex (pdf)%
+ \else lualatex (dvi)%
+ \fi
+ \fi
+\else xelatex%
+\fi
+\end{verbatim}
+\end{quote}
+\newpage
+
+\phantomsection
+\addcontentsline{toc}{section}{Index of Persons}
+\printindex[per]
+
+\renewcommand\indexname{Index of Subjects}
+\phantomsection
+\addcontentsline{toc}{section}{Index of Subjects}
+\printindex
+
+\end{document}
+%examplesvb
+%</examples>
+\endinput
diff --git a/Master/texmf-dist/source/latex/nameauth/nameauth.ins b/Master/texmf-dist/source/latex/nameauth/nameauth.ins
deleted file mode 100644
index 02e98a95e82..00000000000
--- a/Master/texmf-dist/source/latex/nameauth/nameauth.ins
+++ /dev/null
@@ -1,72 +0,0 @@
-%%
-%% This is file `nameauth.ins',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% nameauth.dtx (with options: `install')
-%%
-%% --------:| ----------------------------------------------------------------
-%% nameauth:| Name authority mechanism for consistency in text and index
-%% Author:| Charles P. Schaum
-%% E-mail:| charles dot schaum@comcast.net
-%% License:| Released under the LaTeX Project Public License 1.3c or later
-%% See:| http://www.latex-project.org/lppl.txt
-%%
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-\preamble
-
---------:| ----------------------------------------------------------------
-nameauth:| Name authority mechanism for consistency in text and index
- Author:| Charles P. Schaum
- E-mail:| charles dot schaum@comcast.net
- License:| Released under the LaTeX Project Public License 1.3c or later
- See:| http://www.latex-project.org/lppl.txt
-
-\endpreamble
-\postamble
-
-Copyright (C) 2020 by Charles P. Schaum <charles dot schaum@comcast.net>
-
-This work may be distributed and / or modified under the
-conditions of the LaTeX Project Public License (LPPL), either
-version 1.3c of this license or (at your option) any later
-version. The latest version of this license is in the file:
-
-http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
-Charles P. Schaum.
-
-This work consists of the files nameauth.dtx, examples.tex, and a Makefile.
-These files generate README.txt / README, nameauth.ins, nameauth.sty, and
-nameauth.pdf, with other intermediate files, as a part of this work. See
-the README.txt or README for more information.
-\endpostamble
-
-\usedir{tex/latex/nameauth}
-\generate{
- \file{\jobname.sty}{\from{\jobname.dtx}{package}}
-}
-\endbatchfile
-%%
-%% Copyright (C) 2020 by Charles P. Schaum <charles dot schaum@comcast.net>
-%%
-%% This work may be distributed and / or modified under the
-%% conditions of the LaTeX Project Public License (LPPL), either
-%% version 1.3c of this license or (at your option) any later
-%% version. The latest version of this license is in the file:
-%%
-%% http://www.latex-project.org/lppl.txt
-%%
-%% This work is "maintained" (as per LPPL maintenance status) by
-%% Charles P. Schaum.
-%%
-%% This work consists of the files nameauth.dtx, examples.tex, and a Makefile.
-%% These files generate README.txt / README, nameauth.ins, nameauth.sty, and
-%% nameauth.pdf, with other intermediate files, as a part of this work. See
-%% the README.txt or README for more information.
-%%
-%% End of file `nameauth.ins'.
diff --git a/Master/texmf-dist/source/latex/newverbs/newverbs.dtx b/Master/texmf-dist/source/latex/newverbs/newverbs.dtx
index f2a79d35fde..efc74a3981e 100644
--- a/Master/texmf-dist/source/latex/newverbs/newverbs.dtx
+++ b/Master/texmf-dist/source/latex/newverbs/newverbs.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%<=*COPYRIGHT>
-%% Copyright (C) 2012-2019 by Martin Scharrer <martin@scharrer-online.de>
+%% Copyright (C) 2012-2020 by Martin Scharrer <martin@scharrer-online.de>
%% --------------------------------------------------------------------
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -23,10 +23,10 @@
%<*driver>
\ProvidesFile{newverbs.dtx}[%
%<=*DATE>
- 2019/09/09
+ 2010/09/02
%<=/DATE>
%<=*VERSION>
- v1.4
+ v1.5
%<=/VERSION>
newverbs DTX file]
\documentclass{ydoc}
@@ -44,7 +44,7 @@
%</driver>
% \fi
%
-% \CheckSum{458}
+% \CheckSum{465}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -69,6 +69,7 @@
% \changes{v1.2a}{2011/03/19}{Removed spurious spaces.}
% \changes{v1.3}{2011/07/24}{Added macros to collect verbatim arguments.}
% \changes{v1.4}{2019/09/09}{Added several suggested changes.}
+% \changes{v1.5}{2020/09/02}{Added support for mathmode.}
%
% \DoNotIndex{\newcommand,\newenvironment,\providecommand}
%
@@ -294,6 +295,7 @@
\let\newverbs@end\@empty
\def\new@@verbcommand#1#2[#3]#4#5{%
#1*#2{%
+ \relax\ifmmode\hbox\else\leavevmode\null\fi
\bgroup
\newverbcommand@settings
\ifx\newverbs@end\@empty
diff --git a/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx b/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx
index 04dd13a9dd6..3b7f4d278ec 100644
--- a/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx
+++ b/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2018-2019 by F. Pantigny
+% Copyright (C) 2018-2021 by F. Pantigny
% -----------------------------------
%
% This file may be distributed and/or modified under the
@@ -15,8 +15,8 @@
%
% \fi
% \iffalse
-\def\myfileversion{3.14}
-\def\myfiledate{2020/03/23}
+\def\myfileversion{5.10}
+\def\myfiledate{2021/02/05}
%
%
%<*batchfile>
@@ -26,7 +26,7 @@
\usedir{tex/latex/nicematrix}
\preamble
-Copyright (C) 2018-2020 by F. Pantigny
+Copyright (C) 2018-2021 by F. Pantigny
-----------------------------------
This file may be distributed and/or modified under the
@@ -51,9 +51,8 @@ version 2005/12/01 or later.
\usepackage[xetex]{geometry}
\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
-\usepackage{colortbl}
\usepackage{tikz}
-\usetikzlibrary{fit}
+\usetikzlibrary{fit,patterns}
\usepackage{nicematrix}
\usepackage{siunitx}
@@ -66,13 +65,41 @@ version 2005/12/01 or later.
\titlespacing*{\section}{0pt}{6.5ex plus 1ex minus .2ex}{4.3ex plus .2ex}
\titlespacing*{\subsection}{0pt}{4.5ex plus 1ex minus .2ex}{2ex plus .2ex}
\usepackage{multicol}
-\usepackage{arydshln}
\setlength{\columnseprule}{0.4pt}
\usepackage{footnotehyper}
\usepackage{varwidth}
+\def\LetterAt{@}
\parindent 0pt
\EnableCrossrefs
+\makeatletter
+\ExplSyntaxOn
+\DoNotIndex{\begin,\end}
+\DoNotIndex{\c@iRow,\c@jCol,\theiRow,\thejCol}
+\DoNotIndex{\pgfpicture,\endpgfpicture,\tikzpicture,\endtikzpicture}
+\DoNotIndex{\pgfpoint,\pgfnode,\pgfnodealias,\pgfcoordinate}
+\DoNotIndex{\pgf@x,\pgf@y}
+\DoNotIndex{\int_add:Nn,\int_case:nnTF,\int_compare:nNnTF,\int_compare:nTF,
+ \int_compare_p:nNn,\int_decr:N,\int_eval:n,\int_add:Nn,\int_gdecr:N,\int_gincr:N
+ \int_gset:Nn,\int_gset_eq:NN,\int_gzero:N,\int_gzero_new:N,\int_if_odd:nTF,
+ \int_max:nn,\int_new:N,\int_set:Nn,\int_set_eq:NN,\int_step_inline:nnn,
+ \int_step_variable:nNn,\int_step_variable:nnNn,\int_sub:Nn,\int_use:N,\int_zero:N,
+ \int_zero_new:N,\g_tmpa_int,\l_tmpa_int,\l_tmpb_int}
+\DoNotIndex{\dim_abs:n,\dim_add:Nn,\dim_compare:nNnTF,\dim_compare_p:nNn,
+\dim_const:Nn,\dim_eval:n,\dim_gadd:Nn,\dim_gset:Nn,\dim_gset_eq:NN,
+\dim_gset:Nn,\dim_gset_eq:NN,\dim_gsub:Nn,\dim_gzero_new:N,\dim_max:nn,
+\dim_min:nn,\dim_new:N,\dim_ration:nn,\dim_set:Nn,\dim_set_eq:NN,\dim_sub:Nn,
+\dim_use:N,\dim_zero:N,\dim_zero_new:N,\g_tmpa_dim,\l_tmpa_dim,\l_tmpb_dim,
+\c_zero_dim}
+\DoNotIndex{\cs_new_protected:Npn,\cs_new:Npn,\cs_set_eq:NN,
+\cs_set_protected:Npn}
+\DoNotIndex{\bool_if:NTF,\bool_new:N,\bool_set_false:N,\bool_set_true:N,\l_tmpa_bool}
+\DoNotIndex{\group_begin:,\group_end:,\c_math_toggle_token}
+\DoNotIndex{\tl_set:Nn,\l_tmpa_tl}
+\ExplSyntaxOff
+\makeatother
+
+
\begin{document}
\DocInput{nicematrix.dtx}
\end{document}
@@ -85,8 +112,8 @@ version 2005/12/01 or later.
% {
% pdfinfo =
% {
-% Title = The extension 'nicematrix' ,
-% Subject = A LaTeX extension ,
+% Title = The package 'nicematrix' ,
+% Subject = A LaTeX package ,
% Author = F. Pantigny
% }
% }
@@ -96,39 +123,13 @@ version 2005/12/01 or later.
%
% \begin{abstract}
% The LaTeX package \pkg{nicematrix} provides new environments similar to the
-% classical environments |{array}| and |{matrix}| but with some additional
-% features. Among these features are the possibilities to fix the width of the
-% columns and to draw continuous ellipsis dots between the cells of the array.
+% classical environments |{tabular}|, |{array}| and |{matrix}| of \pkg{array}
+% and \pkg{amsmath} but with extended features.
% \end{abstract}
%
% \vspace{1cm}
-% \section{Presentation}
-%
-%
-% This package can be used with |xelatex|, |lualatex|, |pdflatex| but also by
-% the classical workflow |latex|-|dvips|-|ps2pdf| (or Adobe Distiller). Two or
-% three compilations may be necessary. This package requires and \textbf{loads}
-% the packages \pkg{expl3}, \pkg{l3keys2e}, \pkg{xparse}, \pkg{array},
-% \pkg{amsmath}, \pkg{pgfcore} and the module \pkg{shapes} of \textsc{pgf}
-% (\pkg{tikz} is \emph{not} loaded). The final user only has to load the
-% extension with |\usepackage{nicematrix}|.
-%
-%
-% \medskip
-% \begin{savenotes}
-% \begin{minipage}{0.6\linewidth}
-% This package provides some new tools to draw mathematical matrices. The main
-% features are the following:
-% \begin{itemize}\setlength{\itemsep}{0pt}
-% \item continuous dotted lines\footnote{If the class option |draft| is
-% used, these dotted lines will not be drawn for a faster compilation.};
-% \item exterior rows and columns for labels;
-% \item a control of the width of the columns.
-% \end{itemize}
-% \end{minipage}
-% \end{savenotes}
-% \hspace{1.4cm}
-% $\begin{bNiceArray}{CCCC}[first-row,first-col,
+% \hspace{1cm}
+% $\begin{bNiceArray}{cccc}[first-row,first-col,
% code-for-first-col=\color{blue}\scriptstyle,
% code-for-first-row=\color{blue}\scriptstyle,
% columns-width = auto]
@@ -137,99 +138,1642 @@ version 2005/12/01 or later.
% L_2 & a_{21} & a_{22} & \Cdots & a_{2n} \\
% \Vdots & \Vdots & \Vdots & \Ddots & \Vdots\\
% L_n & a_{n1} & a_{n2} & \Cdots & a_{nn}
-% \end{bNiceArray}$
+% \end{bNiceArray}$\hspace{2cm}
+% \begin{NiceTabular}{lSSSS}[code-before = \rowcolor{red!15}{1-2} \rowcolors{3}{blue!15}{}]
+% \toprule
+% \Block{2-1}{Product} & \multicolumn{3}{c}{dimensions (cm)} & \Block{2-1}{\rotate Price} \\
+% \cmidrule(rl){2-4}
+% & L & l & h \\
+% \midrule
+% small & 3 & 5.5 & 1 & 30 \\
+% standard & 5.5 & 8 & 1.5 & 50.5 \\
+% premium & 8.5 & 10.5 & 2 & 80 \\
+% extra & 8.5 & 10 & 1.5 & 85.5 \\
+% special & 12 & 12 & 0.5 & 70 \\
+% \bottomrule
+% \end{NiceTabular}
+%
+% \vspace{1cm}
+% The package \pkg{nicematrix} is entirely contained in the file
+% |nicematrix.sty|. This file may be put in the current directory or in a
+% |texmf| tree. However, the best is to install \pkg{nicematrix} with a TeX
+% distribution as MiKTeX or TeXlive.
+%
+% \bigskip
+% This package can be used with |xelatex|, |lualatex|, |pdflatex| but also by
+% the classical workflow |latex|-|dvips|-|ps2pdf| (or Adobe Distiller).
+% \textsl{However, the file nicematrix.dtx of the present documentation should
+% be compiled with XeLaTeX.}
+%
+% \bigskip
+% This package requires and \textbf{loads} the packages \pkg{l3keys2e},
+% \pkg{array}, \pkg{amsmath}, \pkg{pgfcore} and the module \pkg{shapes} of
+% \textsc{pgf} (\pkg{tikz}, which is a layer over \textsc{pgf} is \emph{not}
+% loaded). The final user only has to load the package with
+% |\usepackage{nicematrix}|.
+%
+%
+% \bigskip
+% The idea of \pkg{nicematrix} is to create \textsc{pgf} nodes under the cells
+% and the positions of the rules of the tabular created by \pkg{array} and to
+% use these nodes to develop new features. As usual with \textsc{pgf}, the
+% coordinates of these nodes are written in the |.aux| to be used on the next
+% compilation and that's why \pkg{nicematrix} may need \textbf{several
+% compilations}.
%
-% \medskip
+% \bigskip
+% Most features of \pkg{nicematrix} may be used without explicit use of
+% \textsc{pgf} or Tikz (which, in fact, is not loaded by default).
+%
+% \bigskip
% A command |\NiceMatrixOptions| is provided to fix the options (the
-% scope of the options fixed by this command is the current TeX group).
+% scope of the options fixed by this command is the current TeX group: they are
+% semi-global).
+%
+%
+% \bigskip
+% {\bfseries \color{red} Important
+%
+% Since the version 5.0 of \pkg{nicematrix}, one must use the letters |l|, |c| and
+% |r| in the preambles of the environments and no longer the letters |L|, |C| and
+% |R|.
+%
+% For sake of compatibility with the previous versions, there exists an option
+% |define-L-C-R| which must be used when loading \pkg{nicematrix}.
+% \begin{Verbatim}
+% \usepackage[define-L-C-R]{nicematrix}
+% \end{Verbatim}
+% }
+%
+% \newpage
+%
+% \section{The environments of this package}
+%
+% The package \pkg{nicematrix} defines the following new environments.
+%
+% \medskip
+% \begin{ttfamily}
+% \setlength{\tabcolsep}{3mm}
+% \begin{tabular}{llll}
+% \{NiceTabular\} & \{NiceArray\} & \{NiceMatrix\} \\
+% \{NiceTabular*\} & \{pNiceArray\} & \{pNiceMatrix\} \\
+% & \{bNiceArray\} & \{bNiceMatrix\} \\
+% & \{BNiceArray\} & \{BNiceMatrix\} \\
+% & \{vNiceArray\} & \{vNiceMatrix\} \\
+% & \{VNiceArray\} & \{VNiceMatrix\}
+% \end{tabular}
+% \end{ttfamily}
%
+%
+%
+%
+% \medskip
+% The environments |{NiceArray}|, |{NiceTabular}| and |{NiceTabular*}| are
+% similar to the environments |{array}|, |{tabular}| and |{tabular*}| of the
+% package \pkg{array} (which is loaded by \pkg{nicematrix}).
+%
+% \medskip
+% The environments |{pNiceArray}|, |{bNiceArray}|, etc. have no equivalent in
+% \pkg{array}.
+%
+% \medskip
+% The environments |{NiceMatrix}|, |{pNiceMatrix}|, etc. are similar to the
+% corresponding environments of \pkg{amsmath} (which is loaded by
+% \pkg{nicematrix}): |{matrix}|, |{pmatrix}|, etc.
+%
+% \medskip
+% All the environments of the package \pkg{nicematrix} accept, between square
+% brackets, an optional list of \textsl{key=value} pairs. \textbf{There must be
+% no space before the opening bracket (|[|) of this list of options.}
+%
+%\bigskip
+% \textbf{Important}
+%
+% Before the version 5.0, it was mandatory to use, for technical reasons, the
+% letters |L|, |C| et |R| instead of |l|, |c| et |r| in the preambles of the
+% environments of \pkg{nicematrix}. If we want to be able to go on using these
+% letters, \pkg{nicematrix} must be loaded with the option |define-L-C-R|.
+% \begin{Verbatim}
+% \usepackage[define-L-C-R]{nicematrix}
+% \end{Verbatim}
+%
+%
+% \section{The vertical space between the rows}
+%
+% It's well known that some rows of the arrays created by default with LaTeX
+% are, by default, too close to each other. Here is a classical example.
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
+% $\begin{pmatrix}
+% \frac12 & -\frac12 \\
+% \frac13 & \frac14 \\
+% \end{pmatrix}$
+% \end{BVerbatim}
+% $\begin{pmatrix}
+% \frac12 & -\frac12 \\
+% \frac13 & \frac14 \\
+% \end{pmatrix}$
%
% \bigskip
-% \textbf{An example for the continuous dotted lines}
+% Inspired by the package \pkg{cellspace} which deals with that problem, the
+% package \pkg{nicematrix} provides two keys |cell-space-top-limit| and
+% |cell-space-bottom-limit| similar to the parameters |\cellspacetoplimit| and
+% |\cellspacebottomlimit| of \pkg{cellspace}.
+%
+% \colorbox{yellow!50}{\bfseries{New 5.9}}\enskip
+% There is also a key |cell-space-limits| to set both parameters at once.
+%
+% The initial value of these parameters is $0$~pt in order to have for the
+% environments of \pkg{nicematrix} the same behaviour as those of \pkg{array}
+% and \pkg{amsmath}. However, a value of $1$~pt would probably be a good choice
+% and we suggest to set them with |\NiceMatrixOptions|.\footnote{One should
+% remark that these parameters apply also to the columns of type |S| of
+% \pkg{siunitx} whereas the package \pkg{cellspace} is not able to act on such
+% columns of type~|S|.}
%
% \medskip
-% \begin{minipage}{10cm}
-% For example, consider the following code which uses an environment |{pmatrix}|
-% of \pkg{amsmath}.
+% \begin{Verbatim}
+% \NiceMatrixOptions{~emphase#cell-space-limits = 1pt@}
+% \end{Verbatim}
+%
+% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
+% $\begin{pNiceMatrix}
+% \frac12 & -\frac12 \\
+% \frac13 & \frac14 \\
+% \end{pNiceMatrix}$
+% \end{BVerbatim}
+% \begin{scope}
+% \NiceMatrixOptions{cell-space-limits = 1pt}
+% $\begin{pNiceMatrix}
+% \frac12 & -\frac12 \\
+% \frac13 & \frac14 \\
+% \end{pNiceMatrix}$
+% \end{scope}
+%
+%
+%
%
+%
+% \bigskip
+% \section{The vertical position of the arrays}
+%
+% The package \pkg{nicematrix} provides a option |baseline| for the vertical
+% position of the arrays. This option takes in as value an integer which is the
+% number of the row on which the array will be aligned.
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
+% $A = \begin{pNiceMatrix}[~emphase#baseline=2@]
+% \frac{1}{\sqrt{1+p^2}} & p & 1-p \\
+% 1 & 1 & 1 \\
+% 1 & p & 1+p
+% \end{pNiceMatrix}$
+% \end{BVerbatim}
+% $A = \begin{pNiceMatrix}[baseline=2]
+% \frac{1}{\sqrt{1+p^2}} & p & 1-p \\
+% 1 & 1 & 1 \\
+% 1 & p & 1+p
+% \end{pNiceMatrix}$
+%
+%
+% \medskip
+% It's also possible to use the option |baseline| with one of the special values
+% |t|, |c| or |b|. These letters may also be used absolutely like the option of
+% the environments |{tabular}| and |{array}| of \pkg{array}. The initial value
+% of |baseline| is~|c|.
+%
+%
+% \medskip
+% In the following example, we use the option |t| (equivalent to |baseline=t|)
+% immediately after an |\item| of list. One should remark that the presence of a
+% |\hline| at the beginning of the array doesn't prevent the alignment of the
+% baseline with the baseline of the first row (with |{tabular}| or |{array}| of
+% \pkg{array}, one must use |\firsthline|.
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
+% \begin{enumerate}
+% \item an item
% \smallskip
-% \begin{BVerbatim}
-% $A = \begin{pmatrix}
-% 1 & \cdots & \cdots & 1 \\
-% 0 & \ddots & & \vdots \\
-% \vdots & \ddots & \ddots & \vdots \\
-% 0 & \cdots & 0 & 1
-% \end{pmatrix}$
+% \item \renewcommand{\arraystretch}{1.2}
+% $\begin{NiceArray}~emphase#[t]@{lcccccc}
+% \hline
+% n & 0 & 1 & 2 & 3 & 4 & 5 \\
+% u_n & 1 & 2 & 4 & 8 & 16 & 32
+% \hline
+% \end{NiceArray}$
+% \end{enumerate}
% \end{BVerbatim}
+% \begin{minipage}{5cm}
+% \begin{enumerate}
+% \item an item
+% \smallskip
+% \item \renewcommand{\arraystretch}{1.2}
+% $\begin{NiceArray}[t]{lcccccc}
+% \hline
+% n & 0 & 1 & 2 & 3 & 4 & 5 \\
+% u_n & 1 & 2 & 4 & 8 & 16 & 32 \\
+% \hline
+% \end{NiceArray}$
+% \end{enumerate}
+% \end{minipage}
+%
+% \medskip
+% However, it's also possible to use the tools of \pkg{booktabs}: |\toprule|,
+% |\bottomrule|, |\midrule|, etc.\par\nobreak
%
% \smallskip
-% This code composes the matrix $A$ on the right.
-% \end{minipage}\hspace{1cm}
-% $A = \begin{pmatrix}
-% 1 &\cdots &\cdots &1 \\
-% 0 &\ddots & &\vdots \\
-% \vdots &\ddots &\ddots &\vdots \\
-% 0 &\cdots &0 &1
-% \end{pmatrix}$
+% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
+% \begin{enumerate}
+% \item an item
+% \smallskip
+% \item
+% $\begin{NiceArray}[t]{lcccccc}
+% ~emphase#\toprule@
+% n & 0 & 1 & 2 & 3 & 4 & 5 \\
+% ~emphase#\midrule@
+% u_n & 1 & 2 & 4 & 8 & 16 & 32
+% ~emphase#\bottomrule@
+% \end{NiceArray}$
+% \end{enumerate}
+% \end{BVerbatim}
+% \begin{minipage}{5cm}
+% \begin{enumerate}
+% \item an item
+% \smallskip
+% \item
+% $\begin{NiceArray}[t]{lcccccc}
+% \toprule
+% n & 0 & 1 & 2 & 3 & 4 & 5 \\
+% \midrule
+% u_n & 1 & 2 & 4 & 8 & 16 & 32 \\
+% \bottomrule
+% \end{NiceArray}$
+% \end{enumerate}
+% \end{minipage}
+%
+% \bigskip
+% It's also possible to use the key |baseline| to align a matrix on an
+% horizontal rule (drawn by |\hline|). In this aim, one should give the value
+% |line-|\textsl{i} where \textsl{i} is the number of the row following the
+% horizontal rule.
+%
+% \smallskip
+% \begin{Verbatim}
+% \NiceMatrixOptions{cell-space-limits=1pt}
+% \end{Verbatim}
+%
+% \smallskip
+% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
+% $A=\begin{pNiceArray}{cc|cc}[baseline=line-3]
+% \dfrac1A & \dfrac1B & 0 & 0 \\
+% \dfrac1C & \dfrac1D & 0 & 0 \\
+% \hline
+% 0 & 0 & A & B \\
+% 0 & 0 & D & D \\
+% \end{pNiceArray}$
+% \end{BVerbatim}
+% \begin{scope}
+% \NiceMatrixOptions{cell-space-limits=1pt}
+% \raisebox{-5mm}{$A=\begin{pNiceArray}{cc|cc}[baseline=line-3]
+% \dfrac1A & \dfrac1B & 0 & 0 \\
+% \dfrac1C & \dfrac1D & 0 & 0 \\
+% \hline
+% 0 & 0 & A & B \\
+% 0 & 0 & D & D \\
+% \end{pNiceArray}$}
+% \end{scope}
+%
+%
+% \section{The blocks}
+% \label{Block}
+%
+% \subsection{General case}
+%
+% In the environments of \pkg{nicematrix}, it's possible to use the command
+% |\Block| in order to place an element in the center of a rectangle of merged
+% cells of the array.
+%
+% The command |\Block| must be used in the upper leftmost cell of the array with
+% two arguments.
+%
+% \begin{itemize}
+% \item The first argument is the size of the block with the syntax
+% $i$\verb|-|$j$ where $i$ is the number of rows of the block and $j$ its number
+% of columns.
+%
+% If this argument is empty, its default
+% value is |1-1|. If the number of rows is not specified, or equal to |*|, the
+% block extends until the last row (idem for the columns).
%
+% \item The second argument is the content of the block. It's possible to use
+% |\\| in that content to have a content on several lines. In |{NiceTabular}|
+% the content of the block is composed in text mode whereas, in the other
+% environments, it is composed in math mode.
+% \end{itemize}
%
+%
+% \interitem
+% Here is an example of utilisation of the command |\Block| in mathematical matrices.
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+% $\begin{bNiceArray}{ccc|c}[margin]
+% ~emphase#\Block{3-3}{A}@ & & & 0 \\
+% & \hspace*{1cm} & & \Vdots \\
+% & & & 0 \\
+% \hline
+% 0 & \Cdots& 0 & 0
+% \end{bNiceArray}$
+% \end{BVerbatim}
+% $\begin{bNiceArray}{ccc|c}[margin]
+% \Block{3-3}{A} & & & 0 \\
+% & \hspace*{1cm} & & \Vdots \\
+% & & & 0 \\
+% \hline
+% 0 & \Cdots& 0 & 0
+% \end{bNiceArray}$
+%
% \bigskip
+% One may wish to raise the size of the ``$A$'' placed in the block of the
+% previous example. Since this element is composed in math mode, it's not
+% possible to use directly a command like |\large|, |\Large| and |\LARGE|.
+% That's why the command |\Block| provides an option between angle brackets to
+% specify some TeX code which will be inserted before the beginning of the
+% math mode.\footnote{This argument between angular brackets may also be used to
+% insert a command of font such as |\bfseries| when the command |\\| is used in
+% the content of the block.}
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+% $\begin{bNiceArray}{ccc|c}[margin]
+% \Block{3-3}~emphase#<\Large>@{A} & & & 0 \\
+% & \hspace*{1cm} & & \Vdots \\
+% & & & 0 \\
+% \hline
+% 0 & \Cdots& 0 & 0
+% \end{bNiceArray}$
+% \end{BVerbatim}
% \begin{scope}
-% \NiceMatrixOptions{transparent}
-% \begin{minipage}{10cm}
-% Now, if we use the package \pkg{nicematrix} with the option \\
-% |transparent|, the same code will give the result on the right.
-% \end{minipage}\hspace{1cm}
-% $A = \begin{pmatrix}
-% 1 & \cdots & \cdots & 1 \\
-% 0 & \ddots & & \vdots \\
-% \vdots & \ddots & \ddots & \vdots \\
-% 0 & \cdots & 0 & 1
-% \end{pmatrix}$
+% $\begin{bNiceArray}{ccc|c}[margin]
+% \Block{3-3}<\Large>{A} & & & 0 \\
+% & \hspace*{1cm} & & \Vdots \\
+% & & & 0 \\
+% \hline
+% 0 & \Cdots& 0 & 0
+% \end{bNiceArray}$
% \end{scope}
%
+% \medskip
+% It's possible to set the horizontal position of the block with one of the keys
+% |l|, |c| and |r|.
%
-% \section{The environments of this extension}
%
-% The extension \pkg{nicematrix} defines the following new environments.
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+% $\begin{bNiceArray}{ccc|c}[margin]
+% \Block~emphase#[r]@{3-3}<\LARGE>{A} & & & 0 \\
+% & \hspace*{1cm} & & \Vdots \\
+% & & & 0 \\
+% \hline
+% 0 & \Cdots& 0 & 0
+% \end{bNiceArray}$
+% \end{BVerbatim}
+% $\begin{bNiceArray}{ccc|c}[margin]
+% \Block[r]{3-3}<\LARGE>{A} & & & 0 \\
+% & \hspace*{1cm} & & \Vdots \\
+% & & & 0 \\
+% \hline
+% 0 & \Cdots& 0 & 0
+% \end{bNiceArray}$
+%
+%
+% \interitem
+% {\bfseries One must remark that, by default, the commands |\Blocks| don't create space}.
+% There is exception only for the blocks mono-row and the blocks mono-column as
+% explained just below.
+%
+% \medskip
+% In the following example, we have had to enlarge by hand the columns 2 and 3
+% (with the construction |wc{...}| of \pkg{array}).
%
% \medskip
-% \begin{ttfamily}
-% \setlength{\tabcolsep}{3mm}
-% \begin{tabular}{llll}
-% \{NiceMatrix\} & \{NiceArray\} & \{pNiceArray\} \\
-% \{pNiceMatrix\} & & \{bNiceArray\} \\
-% \{bNiceMatrix\} & & \{BNiceArray\} \\
-% \{BNiceMatrix\} & & \{vNiceArray\} \\
-% \{vNiceMatrix\} & & \{VNiceArray\} \\
-% \{VNiceMatrix\} & & \{NiceArrayWithDelims\} \\
+% \begin{BVerbatim}
+% \begin{NiceTabular}~emphase#{cwc{2cm}wc{3cm}c}@
+% rose & tulipe & marguerite & dahlia \\
+% violette
+% & \Block[draw=red,fill=red!15]{2-2}{\LARGE De très jolies fleurs} & & souci \\
+% pervenche & & & lys \\
+% arum & iris & jacinthe & muguet
+% \end{NiceTabular}
+% \end{BVerbatim}
+%
+%
+% \medskip
+% \begin{center}
+% \begin{NiceTabular}{cwc{2cm}wc{3cm}c}
+% rose & tulipe & marguerite & dahlia \\
+% violette &
+% \Block[draw=red,fill=red!15]{2-2}{\LARGE De très jolies fleurs} & & souci \\
+% pervenche & & & lys \\
+% arum & iris & jacinthe & muguet
+% \end{NiceTabular}
+% \end{center}
+%
+% As we can see on this example, it's possible to fill the block by using the
+% key |fill| and to draw the frame with the key |draw|\footnote{If the key
+% |draw| is used without value, the default color the rules of the tabulars is
+% used}. It's also possible to change the width (thickness) of that rules with
+% the key |line-width|.
+%
+% \subsection{The mono-column blocks}
+%
+% The mono-column blocks have a special behaviour.
+%
+% \begin{itemize}
+% \item The natural width of the contents of these blocks is taken into account
+% for the width of the current column.
+%
+% \item The specification of the horizontal position provided by the type of
+% column (|c|, |r| or |l|) is taken into account for the blocks.
+%
+% \item The specifications of font specified for the column by a construction
+% |>{...}| in the preamble of the array are taken into account for the
+% mono-column blocks of that column (this behaviour is probably expected).
+% \end{itemize}
+%
+%
+% \bigskip
+% \begin{scope}
+% \hfuzz=10cm
+% \begin{BVerbatim}[baseline=c,boxwidth=12cm]
+% \begin{NiceTabular}{~LetterAt{}>{\bfseries}lr~LetterAt{}} \hline
+% \Block{2-1}{John} & 12 \\
+% & 13 \\ \hline
+% Steph & 8 \\ \hline
+% \Block{3-1}{Sarah} & 18 \\
+% & 17 \\
+% & 15 \\ \hline
+% Ashley & 20 \\ \hline
+% Henry & 14 \\ \hline
+% \Block{2-1}{Madison} & 15 \\
+% & 19 \\ \hline
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{@{}>{\bfseries}lr@{}}[baseline=c] \hline
+% \Block{2-1}{John} & 12 \\
+% & 13 \\ \hline
+% Steph & 8 \\ \hline
+% \Block{3-1}{Sarah} & 18 \\
+% & 17 \\
+% & 15 \\ \hline
+% Ashley & 20 \\ \hline
+% Henry & 14 \\ \hline
+% \Block{2-1}{Madison} & 15 \\
+% & 19 \\ \hline
+% \end{NiceTabular}
+% \end{scope}
+%
+%
+% \subsection{The mono-row blocks}
+%
+% For the mono-row blocks, the natural height and depth are taken into account
+% for the height and depth of the current row (as does a standard |\multicolumn|
+% of LaTeX).
+%
+% \subsection{The mono-cell blocks}
+%
+% A mono-cell block inherits all the properties of the mono-row blocks and
+% mono-column blocks.
+%
+% \medskip
+% At first sight, one may think that there is no point using a mono-cell block.
+% However, there are some good reasons to use such a block.
+% \begin{itemize}
+% \item It's possible to use the command |\\| in a (mono-cell) block.
+%
+% \item It's possible to use the option of horizontal alignment of the block in
+% derogation of the type of column given in the preamble of the array.
+%
+% \item It's possible do draw a frame around the cell with the key |draw| of the
+% command |\Block|.\footnote{If one wishes to color the background of a unique
+% celle, there is no point using the command |\Block|: it's possible to use the
+% command |\cellcolor| (when the key |colortbl-like| is used).}
+% \end{itemize}
+%
+% \bigskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% \begin{NiceTabular}{cc}
+% \toprule
+% Writer & ~emphase#\Block[l]{}{year\\ of birth}@ \\
+% \midrule
+% Hugo & 1802 \\
+% Balzac & 1799 \\
+% \bottomrule
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{cc}
+% \toprule
+% Writer & \Block[l]{}{year\\ of birth} \\
+% \midrule
+% Hugo & 1802 \\
+% Balzac & 1799 \\
+% \bottomrule
+% \end{NiceTabular}
+%
+% \medskip
+% We recall that if the first mandatory argument of |\Block| is left blank, the
+% block is mono-cell.\footnote{One may consider that the default value of the
+% first mandatory argument of |\Block| is |1-1|.}
+%
+%
+%
+%
+% \subsection{A small remark}
+%
+% One should remark that the horizontal centering of the contents of the blocks
+% is correct even when an instruction such as |!{\qquad}| has been used in the
+% preamble of the array in order to increase the space between two columns (this
+% is not the case with |\multicolumn|). In the following example, the header
+% ``First group'' is correctly centered.
+%
+% \medskip
+% \begin{center}
+% \fvset{commandchars=\~\#\+}
+% \begin{BVerbatim}
+% \begin{NiceTabular}{@{}c!{\qquad}ccc~emphase#!{\qquad}+ccc@{}}
+% \toprule
+% & ~emphase#\Block{1-3}{First group}+ & & & \Block{1-3}{Second group} \\
+% Rank & 1A & 1B & 1C & 2A & 2B & 2C \\
+% \midrule
+% 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
+% 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
+% 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
+% 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
+% \bottomrule
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \end{center}
+%
+% \bigskip
+% \begin{center}
+% \begin{NiceTabular}{@{}c!{\qquad}ccc!{\qquad}ccc@{}}
+% \toprule
+% & \Block{1-3}{First group} & & & \Block{1-3}{Second group} \\
+% Rank & 1A & 1B & 1C & 2A & 2B & 2C \\
+% \midrule
+% 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
+% 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
+% 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
+% 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
+% \bottomrule
+% \end{NiceTabular}
+% \end{center}
+%
+%
+%
+% \section{The rules}
+%
+% The usual techniques for the rules may be used in the environments of
+% \pkg{nicematrix} (excepted |\vline|). However, there is some small differences
+% with the classical environments.
+%
+% \bigskip
+% \subsection{Some differences with the classical environments}
+%
+% \subsubsection{The vertical rules}
+%
+% In the environments of \pkg{nicematrix}, the vertical rules specified by
+% \verb+|+ in the preambles of the environments are never broken, even by an
+% incomplete row or by a double horizontal rule specified by |\hline\hline|
+% (there is no need to use \pkg{hhline}). \footnote{This is the behaviour since
+% the version 5.1 of \pkg{nicematrix}. Prior to that version, the behaviour was
+% the standard behaviour of \pkg{array}.}
+%
+% \bigskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% \begin{NiceTabular}{|c|c|} \hline
+% First & Second \\ ~emphase#\hline\hline@
+% Peter \\ \hline
+% Mary & George\\ \hline
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{|c|c|}[c] \hline
+% First & Second \\ \hline\hline
+% Peter \\ \hline
+% Mary & George \\ \hline
+% \end{NiceTabular}
+%
+%
+% \bigskip
+% However, the vertical rules are not drawn in the blocks.
+%
+% \bigskip
+% If you use \pkg{booktabs} (which provides |\toprule|, |\midrule|,
+% |\bottomrule|, etc.) and if you really want to add vertical rules (which is
+% not in the spirit of \pkg{booktabs}), you should notice that the vertical rules
+% drawn by \pkg{nicematrix} are compatible with \pkg{booktabs}.
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10.5cm]
+% $\begin{NiceArray}{~emphase#|cccc|@} \toprule
+% a & b & c & d \\ \midrule
+% 1 & 2 & 3 & 4 \\
+% 1 & 2 & 3 & 4 \\ \bottomrule
+% \end{NiceArray}$
+% \end{BVerbatim}
+% $\begin{NiceArray}{|cccc|}
+% \toprule
+% a & b & c & d \\
+% \midrule
+% 1 & 2 & 3 & 4 \\
+% 1 & 2 & 3 & 4 \\
+% \bottomrule
+% \end{NiceArray}$
+%
+% \bigskip
+% However, it's still possible to define a specifier (named, for instance, |I|)
+% to draw vertical rules with the standard behaviour of \pkg{array}.
+%
+% \begin{Verbatim}
+% \newcolumntype{I}{!{\vrule}}
+% \end{Verbatim}
+%
+% However, in this case, it is probably more clever to add a command
+% |\OnlyMainNiceMatrix| (cf. p.~\pageref{OnlyMainNiceMatrix}):
+% \begin{Verbatim}
+% \newcolumntype{I}{!{\OnlyMainNiceMatrix{\vrule}}}
+% \end{Verbatim}
+%
+%
+% \bigskip
+% \subsubsection{The command \textbackslash cline}
+%
+%\label{remark-cline}
+%
+% The horizontal and vertical rules drawn by |\hline| and the specifier
+% ``\verb+|+'' make the array larger or wider by a quantity equal to the width
+% of the rule (with \pkg{array} and also with \pkg{nicematrix}).
+%
+% \smallskip
+% For historical reasons, this is not the case with the command |\cline|, as
+% shown by the following example.
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% \setlength{\arrayrulewidth}{2pt}
+% \begin{tabular}{cccc} \hline
+% A&B&C&D \\ ~emphase#\cline{2-2}@
+% A&B&C&D \\ \hline
% \end{tabular}
-% \end{ttfamily}
+% \end{BVerbatim}
+% \begin{scope}
+% \setlength{\arrayrulewidth}{2pt}
+% \begin{tabular}[c]{cccc}
+% \hline
+% A&B&C&D \\
+% \cline{2-2}
+% A&B&C&D \\
+% \hline
+% \end{tabular}
+% \end{scope}
+%
+% \medskip
+% In the environments of \pkg{nicematrix}, this situation is corrected (it's
+% still possible to go to the standard behaviour of |\cline| with the key |standard-cline|).
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% \setlength{\arrayrulewidth}{2pt}
+% \begin{NiceTabular}{cccc} \hline
+% A&B&C&D \\ ~emphase#\cline{2-2}@
+% A&B&C&D \\ \hline
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{scope}
+% \setlength{\arrayrulewidth}{2pt}
+% \begin{NiceTabular}[c]{cccc}
+% \hline
+% A&B&C&D \\
+% \cline{2-2}
+% A&B&C&D \\
+% \hline
+% \end{NiceTabular}
+% \end{scope}
+%
+%
+% \subsection{The thickness and the color of the rules}
+%
+% The environments of \pkg{nicematrix} provide a key |rules/width| to set the
+% width (in fact the thickness) of the rules in the current environment. In
+% fact, this key merely sets the value of the length |\arrayrulewidth|.
+%
+% \smallskip
+% It's well known that \pkg{colortbl} provides the command |\arrayrulecolor| in
+% order to specify the color of the rules.
+%
+% \smallskip
+% With \pkg{nicematrix}, it's possible to specify the color of the rules even
+% when \pkg{colortbl} is not loaded. For sake of compatibility, the command is
+% also named |\arrayrulecolor|. The environments of \pkg{nicematrix} also
+% provide a key |rules/color| to fix the color of the rules in the current
+% environment.
+%
+% \medskip
+% \begin{scope}
+% \hfuzz=10cm
+% \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
+% \begin{NiceTabular}{|ccc|}[~emphase#rules/color=[gray]{0.9},rules/width=1pt@]
+% \hline
+% rose & tulipe & lys \\
+% arum & iris & violette \\
+% muguet & dahlia & souci \\
+% \hline
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{|ccc|}[rules/color=[gray]{0.9},rules/width=1pt]
+% \hline
+% rose & tulipe & lys \\
+% arum & iris & violette \\
+% muguet & dahlia & souci \\
+% \hline
+% \end{NiceTabular}
+% \end{scope}
+%
+% \medskip
+% If one wishes to define new specifiers for columns in order to draw vertical
+% rules (for example with a specific color or thicker than the standard rules),
+% he should consider the command |\OnlyMainNiceMatrix| described on
+% page~\pageref{OnlyMainNiceMatrix}.
+%
+%
+%
+% \subsection{The keys hlines and vlines}
+%
+% The key |hlines| draws all the horizontal rules and the key |vlines| draws all
+% the vertical rules excepted in the blocks (and the virtual blocks determined
+% by dotted lines). In fact, in the environments with delimiters (as
+% |{pNiceMatrix}| or |{bNiceArray}|) the exteriors rules are not drawn (as
+% expected).
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+% $\begin{pNiceMatrix}[~emphase#vlines@,rules/width=0.2pt]
+% 1 & 2 & 3 & 4 & 5 & 6 \\
+% 1 & 2 & 3 & 4 & 5 & 6 \\
+% 1 & 2 & 3 & 4 & 5 & 6
+% \end{pNiceMatrix}$
+% \end{BVerbatim}
+% $\begin{pNiceMatrix}[vlines,rules/width=0.2pt]
+% 1 & 2 & 3 & 4 & 5 & 6 \\
+% 1 & 2 & 3 & 4 & 5 & 6 \\
+% 1 & 2 & 3 & 4 & 5 & 6
+% \end{pNiceMatrix}$
+%
+%
+%
+% \subsection{The key hvlines}
+% \label{hvlines}
+%
+% The key |hvlines| draws all the vertical and horizontal rules (excepted
+% in the blocks and the virtual blocks determined by dotted lines and excepted
+% the rules corresponding of the frame of the blocks using the key |draw| which
+% are drawn with their own characteristics).
+%
+% \medskip
+% \begin{Verbatim}
+% \setlength{\arrayrulewidth}{1pt}
+% \begin{NiceTabular}{cccc}[~emphase#hvlines@,rules/color=blue]
+% rose & tulipe & marguerite & dahlia \\
+% violette & \Block[draw=red]{2-2}{\LARGE fleurs} & & souci \\
+% pervenche & & & lys \\
+% arum & iris & jacinthe & muguet
+% \end{NiceTabular}
+% \end{Verbatim}
+%
+% \begin{center}
+% \setlength{\arrayrulewidth}{1pt}
+% \begin{NiceTabular}{cccc}[hvlines,rules/color=blue]
+% rose & tulipe & marguerite & dahlia \\
+% violette & \Block[draw=red]{2-2}{\LARGE fleurs} & & souci \\
+% pervenche & & & lys \\
+% arum & iris & jacinthe & muguet
+% \end{NiceTabular}
+% \end{center}
+%
+%
+% \subsection{The key hvlines-except-corners}
+%
+% The key |hvlines-except-corners| draws all the horizontal and vertical rules,
+% excepted in the blocks (and the virtual blocks determined by dotted lines) and
+% excepted in the empty corners.
+%
+% \medskip
+% \begin{Verbatim}
+% \begin{NiceTabular}{*{6}{c}}[~emphase#hvlines-except-corners@,cell-space-top-limit=3pt]
+% & & & & A \\
+% & & A & A & A \\
+% & & & A \\
+% & & A & A & A & A \\
+% A & A & A & A & A & A \\
+% A & A & A & A & A & A \\
+% & \Block{2-2}{B} & & A \\
+% & & & A \\
+% & A & A & A \\
+% \end{NiceTabular}
+% \end{Verbatim}
+% %
+% \begin{center}
+% \begin{NiceTabular}{*{6}{c}}[hvlines-except-corners,cell-space-top-limit=3pt]
+% & & & & A \\
+% & & A & A & A \\
+% & & & A \\
+% & & A & A & A & A \\
+% A & A & A & A & A & A \\
+% A & A & A & A & A & A \\
+% & \Block{2-2}{B} & & A \\
+% & & & A \\
+% & A & A & A \\
+% \end{NiceTabular}
+% \end{center}
+%
+% As we can see, an ``empty corner'' is composed by the reunion of all the empty
+% rectangles starting from the cell actually in the corner of the array.
+%
+% \bigskip
+% It's possible to give as value to the key |\hvlines-except-corners| a list of
+% the corners to take into consideration. The corners are designed by |NW|,
+% |SW|, |NE| and |SE| (\emph{north west}, \emph{south west}, \emph{north east}
+% and \emph{south east}).
+%
+% \bigskip
+% \begin{BVerbatim}[boxwidth=11cm,baseline=c]
+% \begin{NiceTabular}{*{6}{c}}%
+% [~emphase#hvlines-except-corners=NE@,cell-space-top-limit=3pt]
+% 1\\
+% 1&1\\
+% 1&2&1\\
+% 1&3&3&1\\
+% 1&4&6&4&1\\
+% 1&5&10&10&5&1
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{*{6}{c}}[c,hvlines-except-corners=NE,cell-space-top-limit=3pt]
+% 1\\
+% 1&1\\
+% 1&2&1\\
+% 1&3&3&1\\
+% 1&4&6&4&1\\
+% 1&5&10&10&5&1
+% \end{NiceTabular}
+%
+%
+% \subsection{The command \textbackslash diagbox}
+%
+% The command |\diagbox| (inspired by the package \pkg{diagbox}), allows, when
+% it is used in a cell, to slash that cell diagonally downwards.\footnote{The
+% author of this document considers that type of construction as graphically
+% poor.}.
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% $\begin{NiceArray}{*{5}{c}}[hvlines]
+% ~emphase#\diagbox{x}{y}@ & e & a & b & c \\
+% e & e & a & b & c \\
+% a & a & e & c & b \\
+% b & b & c & e & a \\
+% c & c & b & a & e
+% \end{NiceArray}$
+% \end{BVerbatim}
+% $\begin{NiceArray}{*{5}{c}}[hvlines]
+% \diagbox{x}{y} & e & a & b & c \\
+% e & e & a & b & c \\
+% a & a & e & c & b \\
+% b & b & c & e & a \\
+% c & c & b & a & e
+% \end{NiceArray}$
+%
+% \medskip
+% It's possible to use the command |\diagbox| in a |\Block|.
+%
+%
+% \subsection{Dotted rules}
+%
+%
+% In the environments of the package \pkg{nicematrix}, it's possible to use
+% the command |\hdottedline| (provided by \pkg{nicematrix}) which is a
+% counterpart of the classical commands |\hline| and |\hdashline| (the latter is
+% a command of \pkg{arydshln}).
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
+% \begin{pNiceMatrix}
+% 1 & 2 & 3 & 4 & 5 \\
+% ~emphase#\hdottedline@
+% 6 & 7 & 8 & 9 & 10 \\
+% 11 & 12 & 13 & 14 & 15
+% \end{pNiceMatrix}
+% \end{BVerbatim}
+% $\begin{pNiceMatrix}
+% 1 & 2 & 3 & 4 & 5 \\
+% \hdottedline
+% 6 & 7 & 8 & 9 & 10 \\
+% 11 & 12 & 13 & 14 & 15
+% \end{pNiceMatrix}$
+%
+%
+% \bigskip
+% In the environments with an explicit preamble (like |{NiceTabular}|,
+% |{NiceArray}|, etc.), it's possible to draw a vertical dotted line with the
+% specifier ``|:|''.
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
+% \left(\begin{NiceArray}{cccc~emphase#:@c}
+% 1 & 2 & 3 & 4 & 5 \\
+% 6 & 7 & 8 & 9 & 10 \\
+% 11 & 12 & 13 & 14 & 15
+% \end{NiceArray}\right)
+% \end{BVerbatim}
+% $\left(\begin{NiceArray}{cccc:c}
+% 1 & 2 & 3 & 4 & 5 \\
+% 6 & 7 & 8 & 9 & 10 \\
+% 11 & 12 & 13 & 14 & 15
+% \end{NiceArray}\right)$
+%
+% \bigskip
+% It's possible to change in \pkg{nicematrix} the letter used to specify a
+% vertical dotted line with the option |letter-for-dotted-lines| available in
+% |\NiceMatrixOptions|. Thus released, the letter ``|:|'' can be used otherwise
+% (for example by the package \pkg{arydshln}).
+%
+% \bigskip
+% \emph{Remark} : In the package \pkg{array} (on which the package
+% \pkg{nicematrix} relies), horizontal and vertical rules make the array larger
+% or wider by a quantity equal to the width of the rule\footnote{In fact, this
+% is true only for |\hline| and ``"|"'' but not for |\cline|: cf
+% p.~\pageref{remark-cline}}. In \pkg{nicematrix}, the dotted lines drawn by
+% |\hdottedline| and ``|:|'' do likewise.
+%
+%
+%
+%\section{The color of the rows and columns}
+%
+% \subsection{Use of colortbl}
+%
+% We recall that the package \pkg{colortbl} can be loaded directly with
+% |\usepackage{colortbl}| or by loading \pkg{xcolor} with the key |table|:
+% |\usepackage[table]{xcolor}|.
+%
+% \medskip
+% Since the package \pkg{nicematrix} is based on \pkg{array}, it's possible to
+% use \pkg{colortbl} with \pkg{nicematrix}.
+%
+% \medskip
+% However, there is two drawbacks:
+% \begin{itemize}
+% \item The package \pkg{colortbl} patches \pkg{array}, leading to some
+% incompatibilities (for example with the command |\hdotsfor|).
+%
+% \item The package \pkg{colortbl} constructs the array row by row, alterning
+% colored rectangles, rules and contents of the cells. The resulting
+% \textsc{pdf} is difficult to interpret by some \textsc{pdf} viewers and may
+% lead to artefacts on the screen.
+% \begin{itemize}
+% \item Some rules seem to disappear. This is because many PDF viewers give
+% priority to graphical element drawn posteriorly (which is in the spirit of the
+% ``painting model'' of PostScript and PDF). Concerning this problem, MuPDF
+% (which is used, for instance, by SumatraPDF) gives better results than Adobe
+% Reader).
+% \item A thin white line may appear between two cells of the same color. This
+% phenomenon occurs when each cell is colored with its own instruction |fill|
+% (the PostScript operator |fill| noted |f| in PDF). This is the case with
+% \pkg{colortbl}: each cell is colored on its own, even when |\columncolor| or
+% |\rowcolor| is used.
+%
+% As for this phenomenon, Adobe Reader gives better results than MuPDF.
+% \end{itemize}
+%
+% The package \pkg{nicematrix} provides tools to avoid those problems.
+% \end{itemize}
+%
+% \subsection{The tools of nicematrix in the code-before}
+%
+% The package \pkg{nicematrix} provides some tools (independent of
+% \pkg{colortbl}) to draw the colored panels first, and, then, the content
+% of the cells and the rules. This strategy is more conform to the ``painting
+% model'' of the formats PostScript and \textsc{pdf} and is more suitable for
+% the \textsc{pdf} viewers. However, it requires several compilations.
+%
+% \medskip
+% The extension \pkg{nicematrix} provides a key |code-before| for some code that
+% will be executed before the drawing of the tabular. In this |code-before|, new
+% commands are available: |\cellcolor|, |\rectanglecolor|, |\rowcolor|,
+% |\columncolor|, |\rowcolors| and |\chessboardcolors|.
+% \label{code-before}
+%
+% \medskip
+% All these commands accept an optional argument (between square brackets and
+% in first position) which is the color model for the specification of the colors.
+%
+% \medskip
+% \begin{itemize}
+% \item The command |\cellcolor| takes its name from the command |\cellcolor| of
+% \pkg{colortbl}.
+%
+% This command takes in as mandatory arguments a color and a list of cells, each
+% of which with the format $i$-$j$ where $i$ is the number of row and $j$ the
+% number of colummn of the cell.
+%
%
+% \medskip
+% \begin{scope}
+% \hfuzz=10cm
+% \begin{BVerbatim}[boxwidth=10cm,baseline=c]
+% \begin{NiceTabular}{|c|c|c|}[code-before =
+% ~emphase#\cellcolor{red!15}{3-1,2-2,1-3}@]
+% \hline
+% a & b & c \\ \hline
+% e & f & g \\ \hline
+% h & i & j \\ \hline
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{|c|c|c|}[code-before =
+% \cellcolor{red!15}{3-1,2-2,1-3}]
+% \hline
+% a & b & c \\ \hline
+% e & f & g \\ \hline
+% h & i & j \\ \hline
+% \end{NiceTabular}
+% \end{scope}
+%
+% \bigskip
+% \item The command |\rectanglecolor| takes three mandatory arguments. The first
+% is the color. The second is the upper-left cell of the rectangle and the third
+% is the lower-right cell of the rectangle.
%
% \medskip
-% By default, the environments |{NiceMatrix}|, |{pNiceMatrix}|, |{bNiceMatrix}|,
-% |{BNiceMatrix}|, |{vNiceMatrix}| and |{VNiceMatrix}| behave almost exactly as
-% the corresponding environments of \pkg{amsmath}: |{matrix}|, |{pmatrix}|,
-% |{bmatrix}|, |{Bmatrix}|, |{vmatrix}| and |{Vmatrix}|.
+% \begin{scope}
+% \hfuzz=10cm
+% \begin{BVerbatim}[boxwidth=10cm,baseline=c]
+% \begin{NiceTabular}{|c|c|c|}[code-before =
+% ~emphase#\rectanglecolor{blue!15}{2-2}{3-3}@]
+% \hline
+% a & b & c \\ \hline
+% e & f & g \\ \hline
+% h & i & j \\ \hline
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{|c|c|c|}[code-before =
+% \rectanglecolor{blue!15}{2-2}{3-3}]
+% \hline
+% a & b & c \\ \hline
+% e & f & g \\ \hline
+% h & i & j \\ \hline
+% \end{NiceTabular}
+% \end{scope}
%
%
+%
+% \bigskip
+% \item The command |\rowcolor| takes its name from the command |\rowcolor| of
+% \pkg{colortbl}. Its first mandatory argument is the color and the second is a
+% comma-separated list of rows or interval of rows with the form $a$-$b$ (an
+% interval of the form $a$- represent all the rows from the row $a$ until the end).
+%
% \medskip
-% The environment |{NiceArray}| is similar to the environment |{array}| of the
-% package |{array}|. However, for technical reasons, in the preamble of the
-% environment |{NiceArray}|, the user must use the letters |L|, |C| and~|R|
-% instead of |l|, |c| and |r|. It's possible to use the constructions
-% |w{...}{...}|, |W{...}{...}|\footnote{However, for the columns of type |w| and
-% |W|, the cells are composed in math mode (in the environments of
-% \pkg{nicematrix}) whereas in |{array}| of \pkg{array}, they are composed in
-% text mode.}, "|", |>{...}|, |<{...}|, |@{...}|, |!{...}| and |*{n}{...}| but
-% the letters |p|, |m| and |b| should not be used. See p.~\pageref{NiceArray}
-% the section relating to |{NiceArray}|.
+% \begin{scope}
+% \hfuzz = 10cm
+% \begin{BVerbatim}[boxwidth=9cm,baseline=c]
+% $\begin{NiceArray}{lll}[hvlines, ~emphase#code-before = \rowcolor{red!15}{1,3-5,8-}@]
+% a_1 & b_1 & c_1 \\
+% a_2 & b_2 & c_2 \\
+% a_3 & b_3 & c_3 \\
+% a_4 & b_4 & c_4 \\
+% a_5 & b_5 & c_5 \\
+% a_6 & b_6 & c_6 \\
+% a_7 & b_7 & c_7 \\
+% a_8 & b_8 & c_8 \\
+% a_9 & b_9 & c_9 \\
+% a_{10} & b_{10} & c_{10} \\
+% \end{NiceArray}$
+% \end{BVerbatim}
+% $\begin{NiceArray}{lll}[baseline=4,hvlines, code-before = \rowcolor{red!15}{1,3-5,8-}]
+% a_1 & b_1 & c_1 \\
+% a_2 & b_2 & c_2 \\
+% a_3 & b_3 & c_3 \\
+% a_4 & b_4 & c_4 \\
+% a_5 & b_5 & c_5 \\
+% a_6 & b_6 & c_6 \\
+% a_7 & b_7 & c_7 \\
+% a_8 & b_8 & c_8 \\
+% a_9 & b_9 & c_9 \\
+% a_{10} & b_{10} & c_{10} \\
+% \end{NiceArray}$
+% \end{scope}
+%
+%
+% \bigskip
+% \item The command |\columncolor| takes its name from the command
+% |\columncolor| of \pkg{colortbl}. Its syntax is similar to the syntax of
+% |\rowcolor|.
+%
+% \bigskip
+% \item The command |\rowcolors| (with a \emph{s}) takes its name from the
+% command |\rowcolors| of \pkg{xcolor}\footnote{The command |\rowcolors| of
+% \pkg{xcolor} is available when \pkg{xcolor} is loaded with the
+% option~|table|.}. The \emph{s} emphasizes the fact that there is \emph{two}
+% colors. This command colors alternately the rows of the tabular with the
+% tow colors (provided in second and third argument), beginning
+% with the row whose number is given in first (mandatory) argument.
+%
+% \colorbox{yellow!30}{New 5.8}\enskip In fact, the first (mandatory)
+% argument is, more generally, a comma separated list of intervals describing
+% the rows involved in the action of |\rowcolors| (an interval of the form
+% $i$|-| describes in fact the interval of all the rows of the tabular,
+% beginning with the row~$i$).
%
%
+%
+% \bigskip
+% The last argument of |\rowcolors| is an optional list of pairs key-value (the
+% optional argument in the first position corresponds to the colorimetric
+% space). The available keys are |cols|, |restart| and |respect-blocks|.
+% \begin{itemize}
+% \item \colorbox{yellow!30}{New 5.8}\enskip The key |cols| describes a
+% set of columns. The command |\rowcolors| will color only the cells of these
+% columns. The value is a comma-separated list of intervals of the form $i$-$j$.
+% \item \colorbox{yellow!30}{New 5.8}\enskip With the key |restart|,
+% each interval of rows (specified by the first mandatory argument) begins with
+% the same color.\footnote{Otherwise, the color of a given row relies only upon the
+% parity of its number.}
+% \item With the key |respect-blocks| the ``rows'' alternately colored may extend over
+% several rows if they have to incorporate blocks (created with the command |\Block|).
+% \end{itemize}
+%
+% \medskip
+% \begin{scope}
+% \hfuzz=10cm
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% \begin{NiceTabular}{clr}
+% [hvlines,code-before = ~emphase#{\rowcolors{2}{blue!10}{}[cols=2-3,restart]}@]
+% \Block{1-}{Results} \\
+% John & 12 \\
+% Stephen & 8 \\
+% Sarah & 18 \\
+% Ashley & 20 \\
+% Henry & 14 \\
+% Madison & 15
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{clr}[hvlines,code-before =
+% {\rowcolors{2}{blue!10}{}[cols=2-3,restart]},baseline=2]
+% \Block{1-}{Results} \\
+% \Block{2-1}{A}& John & 12 \\
+% & Stephen & 8 \\
+% \Block{4-1}{B}& Sarah & 18 \\
+% & Ashley & 20 \\
+% & Henry & 14 \\
+% & Madison & 15
+% \end{NiceTabular}
+% \end{scope}
+%
+% \vspace{1cm}
+% \begin{scope}
+% \hfuzz=10cm
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% \begin{NiceTabular}{lr}[hvlines,code-before =
+% ~emphase#\rowcolors{1}{blue!10}{}[respect-blocks]@]
+% \Block{2-1}{John} & 12 \\
+% & 13 \\
+% Steph & 8 \\
+% \Block{3-1}{Sarah} & 18 \\
+% & 17 \\
+% & 15 \\
+% Ashley & 20 \\
+% Henry & 14 \\
+% \Block{2-1}{Madison} & 15 \\
+% & 19
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{lr}[hvlines,code-before =
+% \rowcolors{1}{blue!10}{}[respect-blocks],baseline=c]
+% \Block{2-1}{John} & 12 \\
+% & 13 \\
+% Steph & 8 \\
+% \Block{3-1}{Sarah} & 18 \\
+% & 17 \\
+% & 15 \\
+% Ashley & 20 \\
+% Henry & 14 \\
+% \Block{2-1}{Madison} & 15 \\
+% & 19
+% \end{NiceTabular}
+% \end{scope}
+%
+%
+% \bigskip
+% \item The command |\chessboardcolors| takes in as mandatory arguments two colors
+% and it colors the cells of the tabular in quincunx with these colors.
+%
+% \medskip
+% \begin{scope}
+% \hfuzz=10cm
+% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
+% $\begin{pNiceMatrix}[r,margin, ~emphase#code-before=\chessboardcolors{red!15}{blue!15}@]
+% 1 & -1 & 1 \\
+% -1 & 1 & -1 \\
+% 1 & -1 & 1
+% \end{pNiceMatrix}$
+% \end{BVerbatim}
+% $\begin{pNiceMatrix}[r,baseline=1, margin, code-before = \chessboardcolors{red!15}{blue!15}]
+% 1 & -1 & 1 \\
+% -1 & 1 & -1 \\
+% 1 & -1 & 1
+% \end{pNiceMatrix}$
+% \end{scope}
+%
+% \medskip
+% We have used the key |r| which aligns all the columns rightwards (cf. p.~\pageref{key-R}).
+% \end{itemize}
+%
+%
+%
+% \bigskip
+% One should remark that these commands are compatible with the commands of
+% \pkg{booktabs} (|\toprule|, |\midrule|, |\bottomrule|, etc).
+%
+% \medskip
+% \begin{scope}
+% \hfuzz=10cm
+% \begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
+% \begin{NiceTabular}[c]{lSSSS}%
+% [code-before = \rowcolor{red!15}{1-2} \rowcolors{3}{blue!15}{}]
+% ~emphase#\toprule@
+% \Block{2-1}{Product} &
+% \Block{1-3}{dimensions (cm)} & & &
+% \Block{2-1}{\rotate Price} \\
+% ~emphase#\cmidrule(rl){2-4}@
+% & L & l & h \\
+% ~emphase#\midrule@
+% small & 3 & 5.5 & 1 & 30 \\
+% standard & 5.5 & 8 & 1.5 & 50.5 \\
+% premium & 8.5 & 10.5 & 2 & 80 \\
+% extra & 8.5 & 10 & 1.5 & 85.5 \\
+% special & 12 & 12 & 0.5 & 70 \\
+% ~emphase#\bottomrule@
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}[c]{lSSSS}[code-before = \rowcolor{red!15}{1-2}
+% \rowcolors{3}{blue!15}{}]
+% \toprule
+% \Block{2-1}{Product} &
+% \Block{1-3}{dimensions (cm)} & & &
+% \Block{2-1}{\rotate Price} \\
+% \cmidrule(rl){2-4}
+% & L & l & h \\
+% \midrule
+% small & 3 & 5.5 & 1 & 30 \\
+% standard & 5.5 & 8 & 1.5 & 50.5 \\
+% premium & 8.5 & 10.5 & 2 & 80 \\
+% extra & 8.5 & 10 & 1.5 & 85.5 \\
+% special & 12 & 12 & 0.5 & 70 \\
+% \bottomrule
+% \end{NiceTabular}
+% \end{scope}
+%
+% \medskip
+% We have used the type of column |S| of \pkg{siunitx}.
+%
+%
+% \subsection{Color tools with the syntax of colortbl}
+%
+% It's possible to access the preceding tools with a syntax close to the syntax
+% of \pkg{colortbl}. For that, one must use the key |colortbl-like| in the
+% current environment.\footnote{As of now, this key is not available in |\NiceMatrixOptions|.}
+%
+% There are three commands available (they are inspired by \pkg{colortbl} but
+% are \emph{independent} of \pkg{colortbl}):
+% \begin{itemize}
+% \item |\cellcolor| which colorizes a cell;
+% \item |\rowcolor| which must be used in a cell and which colorizes the end of
+% the row;
+% \item |\columncolor| which must be used in the preamble of the environment
+% with the same syntax as the corresponding command of
+% \pkg{colortbl} (however, unlike the command |\columncolor| of \pkg{colortbl},
+% this command |\columncolor| can appear within another command, itself used in the
+% preamble).
+% \end{itemize}
+%
+% \medskip
+% \begin{Verbatim}
+% \NewDocumentCommand { \Blue } { } { ~emphase#\columncolor{blue!15}@ }
+% \begin{NiceTabular}[colortbl-like]{>{\Blue}c>{\Blue}cc}
+% \toprule
+% ~emphase#\rowcolor{red!15}@
+% Last name & First name & Birth day \\
+% \midrule
+% Achard & Jacques & 5 juin 1962 \\
+% Lefebvre & Mathilde & 23 mai 1988 \\
+% Vanesse & Stephany & 30 octobre 1994 \\
+% Dupont & Chantal & 15 janvier 1998 \\
+% \bottomrule
+% \end{NiceTabular}
+% \end{Verbatim}
+%
+%
+% \begin{center}
+% \NewDocumentCommand { \Blue } { } { \columncolor{blue!15} }
+% \begin{NiceTabular}[colortbl-like]{>{\Blue}c>{\Blue}cc}
+% \toprule
+% \rowcolor{red!15}
+% Last name & First name & Birth day \\
+% \midrule
+% Achard & Jacques & 5 juin 1962 \\
+% Lefebvre & Mathilde & 23 mai 1988 \\
+% Vanesse & Stephany & 30 octobre 1994 \\
+% Dupont & Chantal & 15 janvier 1998 \\
+% \bottomrule
+% \end{NiceTabular}
+% \end{center}
+%
+%
+% \section{The width of the columns}
+% \label{width}
+%
+% In the environments with an explicit preamble (like |{NiceTabular}|,
+% |{NiceArray}|, etc.), it's possible to fix the width of a given column with
+% the standard letters |w| and |W| of the package \pkg{array}.
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
+% \begin{NiceTabular}{~emphase#Wc{2cm}@cc}[hvlines]
+% Paris & New York & Madrid \\
+% Berlin & London & Roma \\
+% Rio & Tokyo & Oslo
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{Wc{2cm}cc}[hvlines]
+% Paris & New York & Madrid \\
+% Berlin & London & Roma \\
+% Rio & Tokyo & Oslo
+% \end{NiceTabular}
+%
+%
+% \bigskip
+% In the environments of \pkg{nicematrix}, it's also possible to fix the \emph{minimal}
+% width of all the columns of an array directly with the key |columns-width|.
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% $\begin{pNiceMatrix}[~emphase#columns-width = 1cm@]
+% 1 & 12 & -123 \\
+% 12 & 0 & 0 \\
+% 4 & 1 & 2
+% \end{pNiceMatrix}$
+% \end{BVerbatim}
+% $\begin{pNiceMatrix}[columns-width = 1cm]
+% 1 & 12 & -123 \\
+% 12 & 0 & 0 \\
+% 4 & 1 & 2
+% \end{pNiceMatrix}$
+%
+% \medskip
+% Note that the space inserted between two columns (equal to 2 |\tabcolsep| in
+% |{NiceTabular}| and to 2 |\arraycolsep| in the other environments)
+% is not suppressed (of course, it's possible to suppress this space by setting
+% |\tabcolsep| or |\arraycolsep| equal to $0$~pt before the environment).
+%
+% \bigskip
+% It's possible to give the special value |auto| to the option |columns-width|:
+% all the columns of the array will have a width equal to the widest cell of the
+% array.\footnote{The result is achieved with only one compilation (but PGF/Tikz
+% will have written informations in the |.aux| file and a message requiring a
+% second compilation will appear).}\par\nobreak
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% $\begin{pNiceMatrix}[~emphase#columns-width = auto@]
+% 1 & 12 & -123 \\
+% 12 & 0 & 0 \\
+% 4 & 1 & 2
+% \end{pNiceMatrix}$
+% \end{BVerbatim}
+% $\begin{pNiceMatrix}[columns-width = auto]
+% 1 & 12 & -123 \\
+% 12 & 0 & 0 \\
+% 4 & 1 & 2
+% \end{pNiceMatrix}$
+%
+% \bigskip
+% Without surprise, it's possible to fix the minimal width of the columns of all
+% the matrices of a current scope with the command
+% |\NiceMatrixOptions|.\par\nobreak
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
+% ~emphase#\NiceMatrixOptions{columns-width=10mm}@
+% $\begin{pNiceMatrix}
+% a & b \\ c & d
+% \end{pNiceMatrix}
+% =
+% \begin{pNiceMatrix}
+% 1 & 1245 \\ 345 & 2
+% \end{pNiceMatrix}$
+% \end{BVerbatim}
+% \begin{scope}
+% \NiceMatrixOptions{columns-width=10mm}
+% $\begin{pNiceMatrix}
+% a & b \\
+% c & d
+% \end{pNiceMatrix}
+% =
+% \begin{pNiceMatrix}
+% 1 & 1245 \\
+% 345 & 2
+% \end{pNiceMatrix}$
+% \end{scope}
+%
+%
+% \bigskip
+% But it's also possible to fix a zone where all the matrices will have their
+% columns of the same width, equal to the widest cell of all the matrices. This
+% construction uses the environment |{NiceMatrixBlock}| with the option
+% |auto-columns-width|\footnote{At this time, this is the only usage of the
+% environment |{NiceMatrixBlock}| but it may have other usages in the future.}.
+% The environment |{NiceMatrixBlock}| has no direct link with the command
+% |\Block| presented previously in this document (cf.~p.~\pageref{Block}).
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
+% ~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@
+% $\begin{array}{c}
+% \begin{bNiceMatrix}
+% 9 & 17 \\ -2 & 5
+% \end{bNiceMatrix} \\ \\
+% \begin{bNiceMatrix}
+% 1 & 1245345 \\ 345 & 2
+% \end{bNiceMatrix}
+% \end{array}$
+% ~emphase#\end{NiceMatrixBlock}@
+% \end{BVerbatim}
+% \begin{NiceMatrixBlock}[auto-columns-width]
+% $\begin{array}{c}
+% \begin{bNiceMatrix}
+% 9 & 17 \\ -2 & 5
+% \end{bNiceMatrix} \\ \\
+% \begin{bNiceMatrix}
+% 1 & 1245345 \\ 345 & 2
+% \end{bNiceMatrix}
+% \end{array}$
+% \end{NiceMatrixBlock}
+%
+% \medskip
+% \textbf{Several compilations may be necessary to achieve the job.}
+%
+%
+%
+% \bigskip
+% \section{The exterior rows and columns}
+%
+% The options |first-row|, |last-row|, |first-col| and |last-col| allow the
+% composition of exterior rows and columns in the environments of
+% \pkg{nicematrix}.
+% \label{exterior}
+%
+% A potential ``first row'' (exterior) has the number $0$ (and not $1$). Idem
+% for the potential ``first column''.
+%
+% \begin{Verbatim}
+% $\begin{pNiceMatrix}[~emphase#first-row,last-row,first-col,last-col@]
+% $\begin{pNiceMatrix}[~emphase#first-row,last-row,first-col,last-col@,nullify-dots]
+% & C_1 & \Cdots & & C_4 & \\
+% L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
+% \Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
+% & a_{31} & a_{32} & a_{33} & a_{34} & \\
+% L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
+% & C_1 & \Cdots & & C_4 &
+% \end{pNiceMatrix}$
+% \end{pNiceMatrix}$
+% \end{Verbatim}
+%
+% \[\begin{pNiceMatrix}[first-row,last-row,first-col,last-col,nullify-dots]
+% & C_1 & \Cdots & & C_4 & \\
+% L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
+% \Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
+% & a_{31} & a_{32} & a_{33} & a_{34} & \\
+% L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
+% & C_1 & \Cdots & & C_4 &
+% \end{pNiceMatrix}\]
+%
+% \medskip
+% The dotted lines have been drawn with the tools presented p.~\pageref{Cdots}.
+%
+% \bigskip
+% We have several remarks to do.
+% \begin{itemize}[beginpenalty=10000]
+% \item For the environments with an explicit preamble (i.e. |{NiceArray}| and
+% its variants), no letter must be given in that preamble for the potential
+% first column and the potential last column: they will automatically (and
+% necessarily) be of type |r| for the first column and |l| for the last one.
+% \item One may wonder how \pkg{nicematrix} determines the number of rows and
+% columns which are needed for the composition of the ``last row'' and ``last
+% column''.
+% \begin{itemize}
+% \item For the environments with explicit preamble, like |{NiceTabular}| and
+% |{pNiceArray}|, the number of columns can obviously be computed from the
+% preamble.
+%
+% \item When the option |light-syntax| (cf. p. \pageref{light-syntax}) is used,
+% \pkg{nicematrix} has, in any case, to load the whole body of the environment
+% (and that's why it's not possible to put verbatim material in the array with
+% the option |light-syntax|). The analysis of this whole body gives the number
+% of rows (but not the number of columns).
+%
+% \item In the other cases, \pkg{nicematrix} compute the number of rows and
+% columns during the first compilation and write the result in the |aux| file
+% for the next run.
+%
+% \textsl{However, it's possible to provide the number of the last row and the
+% number of the last column as values of the options |last-row| and |last-col|,
+% tending to an acceleration of the whole compilation of the document.} That's
+% what we will do throughout the rest of the document.
+% \end{itemize}
+% \end{itemize}
+%
+% \bigskip
+% It's possible to control the appearance of these rows and columns with options
+% |code-for-first-row|, |code-for-last-row|, |code-for-first-col| and
+% |code-for-last-col|. These options
+% specify tokens that will be inserted before each cell of the corresponding row
+% or column.
+%
+%
+% \begin{Verbatim}
+% \NiceMatrixOptions{~emphase#code-for-first-row@ = \color{red},
+% ~emphase#code-for-first-col@ = \color{blue},
+% ~emphase#code-for-last-row@ = \color{green},
+% ~emphase#code-for-last-col@ = \color{magenta}}
+% $\begin{pNiceArray}{cc|cc}[first-row,last-row=5,first-col,last-col,nullify-dots]
+% & C_1 & \Cdots & & C_4 & \\
+% L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
+% \Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
+% \hline
+% & a_{31} & a_{32} & a_{33} & a_{34} & \\
+% L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
+% & C_1 & \Cdots & & C_4 &
+% \end{pNiceArray}$
+% \end{Verbatim}
+%
+% \begin{scope}
+% \NiceMatrixOptions{code-for-first-row = \color{red},
+% code-for-first-col = \color{blue},
+% code-for-last-row = \color{green},
+% code-for-last-col = \color{magenta}}
+% \begin{displaymath}
+% \begin{pNiceArray}{cc|cc}[first-row,last-row=5,first-col,last-col,nullify-dots]
+% & C_1 & \multicolumn1c{\Cdots} & & C_4 & \\
+% L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
+% \Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
+% \hline
+% & a_{31} & a_{32} & a_{33} & a_{34} & \\
+% L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
+% & C_1 & \multicolumn1c{\Cdots} & & C_4 &
+% \end{pNiceArray}
+% \end{displaymath}
+% \end{scope}
+%
+%
+% \emph{Remarks}
+% \begin{itemize}[beginpenalty=10000]
+% \item As shown in the previous example, the horizontal and vertical rules
+% doesn't extend in the exterior rows and columns.
+%
+% However, if one wishes to define new specifiers for columns in order to draw
+% vertical rules (for example thicker than the standard rules), he should
+% consider the command |\OnlyMainNiceMatrix| described on
+% page~\pageref{OnlyMainNiceMatrix}.
+%
+% \item A specification of color present in |code-for-first-row| also applies to
+% a dotted line draw in this exterior ``first row'' (excepted if a value has
+% been given to |xdots/color|). Idem for the other exterior rows and columns.
+%
+% \item Logically, the potential option |columns-width| (described
+% p.~\pageref{width}) doesn't apply to the ``first column'' and ``last column''.
+% \item For technical reasons, it's not possible to use the option of the
+% command |\\| after the ``first row'' or before the ``last row'' (the placement
+% of the delimiters would be wrong).
+% \end{itemize}
+%
+%
+%
+%
+%
% \section{The continuous dotted lines}
%
-% Inside the environments of the extension \pkg{nicematrix}, new commands are
+% \label{Cdots}
+% Inside the environments of the package \pkg{nicematrix}, new commands are
% defined: |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, and |\Iddots|. These commands
% are intended to be used in place of |\dots|, |\cdots|, |\vdots|, |\ddots| and
% |\iddots|.\footnote{The command |\iddots|, defined in \pkg{nicematrix}, is a
@@ -248,7 +1792,8 @@ version 2005/12/01 or later.
% |\Iddots| diagonal ones. It's possible to change the color of these lines
% with the option |color|.\footnote{It's also possible to change the color of
% all theses dotted lines with the option |xdots/color| (\textsl{xdots} to
-% remind that it works for |\Cdots|, |\Ldots|, |\Vdots|, etc.): cf. p. \pageref{customization}.}\par\nobreak
+% remind that it works for |\Cdots|, |\Ldots|, |\Vdots|, etc.): cf. p.
+% \pageref{customization}.}\par\nobreak
%
% \bigskip
% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -308,10 +1853,8 @@ version 2005/12/01 or later.
% \end{bNiceMatrix}$
%
% \bigskip
-% In the first column of this exemple, there are two instructions |\Vdots| but
-% only one dotted line is drawn (there is no overlapping graphic objects in the
-% resulting \textsc{pdf}\footnote{And it's not possible to draw a |\Ldots| and a
-% |\Cdots| line between the same cells.}).
+% In the first column of this exemple, there are two instructions |\Vdots| but,
+% of course, only one dotted line is drawn.
%
% \bigskip
% In fact, in this example, it would be possible to draw the same matrix more
@@ -372,12 +1915,12 @@ version 2005/12/01 or later.
% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
% $A = \begin{pmatrix}
% h & i & j & k & l & m \\
-% x & & & & & x \\
+% x & & & & & x
% \end{pmatrix}$
% \end{BVerbatim}
% $A = \begin{pmatrix}
% h & i & j & k & l & m \\
-% x & & & & & x \\
+% x & & & & & x
% \end{pmatrix}$
%
%
@@ -389,12 +1932,12 @@ version 2005/12/01 or later.
% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
% $B = \begin{pmatrix}
% h & i & j & k & l & m \\
-% x & \ldots & \ldots & \ldots & \ldots & x \\
+% x & \ldots & \ldots & \ldots & \ldots & x
% \end{pmatrix}$
% \end{BVerbatim}
% $B = \begin{pmatrix}
% h & i & j & k & l & m \\
-% x & \ldots & \ldots & \ldots & \ldots & x \\
+% x & \ldots & \ldots & \ldots & \ldots & x
% \end{pmatrix}$
%
% \bigskip
@@ -406,12 +1949,12 @@ version 2005/12/01 or later.
% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
% $C = \begin{pNiceMatrix}
% h & i & j & k & l & m \\
-% x & \Ldots & \Ldots & \Ldots & \Ldots & x \\
+% x & \Ldots & \Ldots & \Ldots & \Ldots & x
% \end{pNiceMatrix}$
% \end{BVerbatim}
% $C = \begin{pNiceMatrix}
% h & i & j & k & l & m \\
-% x & \Ldots & \Ldots & \Ldots & \Ldots & x \\
+% x & \Ldots & \Ldots & \Ldots & \Ldots & x
% \end{pNiceMatrix}$
%
% \bigskip
@@ -424,24 +1967,21 @@ version 2005/12/01 or later.
% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
% $D = \begin{pNiceMatrix}[~emphase#nullify-dots@]
% h & i & j & k & l & m \\
-% x & \Ldots & & & & x \\
+% x & \Ldots & & & & x
% \end{pNiceMatrix}$
% \end{BVerbatim}
% $D = \begin{pNiceMatrix}[nullify-dots]
% h & i & j & k & l & m \\
-% x & \Ldots & & & & x \\
+% x & \Ldots & & & & x
% \end{pNiceMatrix}$
%
% \medskip
% The option |nullify-dots| smashes the instructions |\Ldots| (and the variants)
% horizontally but also vertically.
%
-% \medskip
-% \textbf{There must be no space before the opening bracket (|[|) of the options
-% of the environment.}
%
%
-% \subsection{The command \textbackslash Hdotsfor}
+% \subsection{The commands \textbackslash Hdotsfor and \textbackslash Vdotsfor}
%
% Some people commonly use the command |\hdotsfor| of \pkg{amsmath} in order to
% draw horizontal dotted lines in a matrix. In the environments of
@@ -488,27 +2028,60 @@ version 2005/12/01 or later.
% 1 & 2 & 3 & 4 & 5
% \end{pNiceMatrix}$
%
-% \bigskip
-% The command |\hdotsfor| of \pkg{amsmath} takes an optional argument (between
-% square brackets) which is used for fine tuning of the space between two
-% consecutive dots. For homogeneity, |\Hdotsfor| has also an optional argument
-% but this argument is discarded silently.
%
% Remark: Unlike the command |\hdotsfor| of \pkg{amsmath}, the command
-% |\Hdotsfor| may be used when the extension \pkg{colortbl} is loaded (but you
+% |\Hdotsfor| may be used when the package \pkg{colortbl} is loaded (but you
% might have problem if you use |\rowcolor| on the same row as |\Hdotsfor|).
%
+% \bigskip
+% The package \pkg{nicematrix} also provides a command |\Vdotsfor| similar to
+% |\Hdotsfor| but for the vertical dotted lines.
+% \bigskip
+% The following example uses both |\Hdotsfor| and |\Vdotsfor|:
+%
+% \begin{Verbatim}[formatcom=\small\color{gray}]
+% \begin{bNiceMatrix}
+% C[a_1,a_1] & \Cdots & C[a_1,a_n]
+% & \hspace*{20mm} & C[a_1,a_1^{(p)}] & \Cdots & C[a_1,a_n^{(p)}] \\
+% \Vdots & \Ddots & \Vdots
+% & ~emphase#\Hdotsfor{1}@ & \Vdots & \Ddots & \Vdots \\
+% C[a_n,a_1] & \Cdots & C[a_n,a_n]
+% & & C[a_n,a_1^{(p)}] & \Cdots & C[a_n,a_n^{(p)}] \\
+% \rule{0pt}{15mm} & ~emphase#\Vdotsfor{1}@ & & \Ddots & & ~emphase#\Vdotsfor{1}@ \\
+% C[a_1^{(p)},a_1] & \Cdots & C[a_1^{(p)},a_n]
+% & & C[a_1^{(p)},a_1^{(p)}] & \Cdots & C[a_1^{(p)},a_n^{(p)}] \\
+% \Vdots & \Ddots & \Vdots
+% & ~emphase#\Hdotsfor{1}@ & \Vdots & \Ddots & \Vdots \\
+% C[a_n^{(p)},a_1] & \Cdots & C[a_n^{(p)},a_n]
+% & & C[a_n^{(p)},a_1^{(p)}] & \Cdots & C[a_n^{(p)},a_n^{(p)}]
+% \end{bNiceMatrix}
+% \end{Verbatim}
+%
+%
+% \[\begin{bNiceMatrix}
+% C[a_1,a_1] & \Cdots & C[a_1,a_n] & \hspace*{20mm} & C[a_1,a_1^{(p)}] & \Cdots & C[a_1,a_n^{(p)}] \\
+% \Vdots & \Ddots & \Vdots & \Hdotsfor{1} & \Vdots & \Ddots & \Vdots \\
+% C[a_n,a_1] & \Cdots & C[a_n,a_n] & & C[a_n,a_1^{(p)}] & \Cdots & C[a_n,a_n^{(p)}] \\
+% \rule{0pt}{15mm} & \Vdotsfor{1} & & \Ddots & & \Vdotsfor{1} \\
+% C[a_1^{(p)},a_1] & \Cdots & C[a_1^{(p)},a_n] & & C[a_1^{(p)},a_1^{(p)}] & \Cdots & C[a_1^{(p)},a_n^{(p)}] \\
+% \Vdots & \Ddots & \Vdots & \Hdotsfor{1} & \Vdots & \Ddots & \Vdots \\
+% C[a_n^{(p)},a_1] & \Cdots & C[a_n^{(p)},a_n] & & C[a_n^{(p)},a_1^{(p)}] & \Cdots & C[a_n^{(p)},a_n^{(p)}]
+% \end{bNiceMatrix}\]
+%
+%
+%
+%
% \subsection{How to generate the continuous dotted lines transparently}
%
-% The package \pkg{nicematrix} provides an option called |transparent| for using
-% existing code transparently in the environments of the \pkg{amsmath} :
-% |{matrix}|, |{pmatrix}|, |{bmatrix}|, etc. In fact, this
-% option is an alias for the conjonction of two options:
+% Imagine you have a document with a great number of mathematical matrices with
+% ellipsis. You may wish to use the dotted lines of \pkg{nicematrix} without
+% having to modify the code of each matrix. It's possible with the keys.
% |renew-dots| and |renew-matrix|.\footnote{The options |renew-dots|,
-% |renew-matrix| and |transparent| can be fixed with the command
+% |renew-matrix| can be fixed with the command
% |\NiceMatrixOptions| like the other options. However, they can also be fixed
-% as options of the command |\usepackage| (it's an exception for these three
-% specific options.)}
+% as options of the command |\usepackage|. There is also a key |transparent|
+% which is an alias for the conjonction of |renew-dots| and |renew-matrix| but it
+% must be considered as obsolete.}
%
% \smallskip
%
@@ -528,14 +2101,14 @@ version 2005/12/01 or later.
% \end{itemize}
%
% \bigskip
-% Therefore, with the option |transparent|, a classical code gives directly the
-% ouput of \pkg{nicematrix}.\par\nobreak
+% Therefore, with the keys |renew-dots| and |renew-matrix|, a classical code
+% gives directly the ouput of \pkg{nicematrix}.\par\nobreak
%
% \bigskip
% \begin{scope}
-% \NiceMatrixOptions{transparent}
+% \NiceMatrixOptions{renew-dots,renew-matrix}
% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% ~emphase#\NiceMatrixOptions{transparent}@
+% ~emphase#\NiceMatrixOptions{renew-dots,renew-matrix}@
% \begin{pmatrix}
% 1 & \cdots & \cdots & 1 \\
% 0 & \ddots & & \vdots \\
@@ -551,12 +2124,33 @@ version 2005/12/01 or later.
% \end{pmatrix}$
% \end{scope}
%
+% \subsection{The labels of the dotted lines}
+%
+% The commands |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, |\Iddots| and |\Hdotsfor|
+% (and the command |\line| in the |\CodeAfter| which is described
+% p.~\pageref{line-in-code-after}) accept two optional arguments specified
+% by the tokens |_| and |^| for labels positionned below and above the line. The
+% arguments are composed in math mode with |\scriptstyle|.
+%
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% $\begin{bNiceMatrix}
+% 1 & \hspace*{1cm} & 0 \\[8mm]
+% & ~emphase#\Ddots^{n \text{ times}}@ & \\
+% 0 & & 1
+% \end{bNiceMatrix}$
+% \end{BVerbatim}
+% $\begin{bNiceMatrix}
+% 1 & \hspace*{1cm} & 0 \\[8mm]
+% & \Ddots^{n \text{ times}} & \\
+% 0 & & 1
+% \end{bNiceMatrix}$
+%
% \subsection{Customization of the dotted lines}
%
% \label{customization}
% The dotted lines drawn by |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, |\Iddots|
-% and |\Hdotsfor| (and by the command |\line| in the |code-after| which is described
-% in p.~\pageref{line-in-code-after}) may be customized by three options (specified
+% and |\Hdotsfor| (and by the command |\line| in the |\CodeAfter| which is described
+% p.~\pageref{line-in-code-after}) may be customized by three options (specified
% between square brackets after the command):
% \begin{itemize}
% \item |color|;
@@ -613,7 +2207,7 @@ version 2005/12/01 or later.
%
% \medskip
% In order to provide lines with rounded dots in the style of those provided by
-% |\ldots| (at least with the \emph{Computer Modern} fonts), the extension
+% |\ldots| (at least with the \emph{Computer Modern} fonts), the package
% \pkg{nicematrix} embeds its own system to draw a dotted line (and this system
% uses \textsc{pgf} and not Tikz). This style is called |standard| and that's
% the initial value of the parameter |xdots/line-style|.
@@ -649,932 +2243,594 @@ version 2005/12/01 or later.
% \end{pNiceMatrix}\]
%
%
-%
-% \section{The PGF/Tikz nodes created by nicematrix}
-%
-% \label{name}
+% \subsection{The dotted lines and the rules}
%
-% The package \pkg{nicematrix} creates a PGF/Tikz node for each (non-empty) cell
-% of the considered array. These nodes are used to draw the dotted lines between
-% the cells of the matrix. However, the user may wish to use directly these
-% nodes. It's possible (if Tikz has been loaded\footnote{We remind that, since
-% the version 3.13, \pkg{nicematrix} doesn't load Tikz by default by only
-% \textsc{pgf} (Tikz is a layer over \textsc{pfg}).}). First, the user have to
-% give a name to the array (with the key called |name|). Then, the nodes are
-% accessible through the names ``\textsl{name}-$i$-$j$'' where \textsl{name} is
-% the name given to the array and $i$ and $j$ the numbers of the row and the
-% column of the considered cell.
+% \label{dotted-and-rules}
%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% $\begin{pNiceMatrix}[name=~emphase#mymatrix@]
-% 1 & 2 & 3 \\
-% 4 & 5 & 6 \\
-% 7 & 8 & 9
-% \end{pNiceMatrix}$
-% \tikz[remember picture,overlay]
-% \draw ~emphase#(mymatrix-2-2)@ circle (2mm) ;
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}[name=mymatrix]
-% 1 & 2 & 3 \\
-% 4 & 5 & 6 \\
-% 7 & 8 & 9
-% \end{pNiceMatrix}$
-% \tikz[remember picture,overlay]
-% \draw (mymatrix-2-2) circle (2mm) ;
+% The dotted lines determine virtual blocks which have the same behaviour
+% regarding the rules (the rules specified by the specifier \verb+|+ in the
+% preamble and by the keys |hlines|, |vlines|, |hvlines| and
+% |hvlines-except-corners| are not drawn within the blocks).
%
% \medskip
-% Don't forget the options |remember picture| and |overlay|.
-%
-% \bigskip
-% In the following example, we have underlined all the nodes of the matrix.
-% \[\begin{pNiceMatrix}[
-% code-after = {\begin{tikzpicture}
-% [every node/.style = {blend mode = multiply,
-% fill = red!15,
-% inner sep = 0 pt }]
-% \node [fit = (1-1)] {} ;
-% \node [fit = (1-3)] {} ;
-% \node [fit = (2-2)] {} ;
-% \node [fit = (3-1)] {} ;
-% \node [fit = (3-3)] {} ;
-% \node [fit = (1-2)] {} ;
-% \node [fit = (2-1)] {} ;
-% \node [fit = (2-3)] {} ;
-% \node [fit = (3-2)] {} ;
-% \end{tikzpicture}}]
-% a & a + b & a + b + c \\
-% a & a & a + b \\
-% a & a & a
-% \end{pNiceMatrix}\]
+% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+% $\begin{bNiceMatrix}[margin,~emphase#hvlines@]
+% \Block{3-3}<\LARGE>{A} & & & 0 \\
+% & \hspace*{1cm} & & \Vdots \\
+% & & & 0 \\
+% 0 & \Cdots& 0 & 0
+% \end{bNiceMatrix}$
+% \end{BVerbatim}
+% $\begin{bNiceMatrix}[margin,hvlines]
+% \Block{3-3}<\LARGE>{A} & & & 0 \\
+% & \hspace*{1cm} & & \Vdots \\
+% & & & 0 \\
+% 0 & \Cdots& 0 & 0
+% \end{bNiceMatrix}$
%
%
-% \bigskip
-% In fact, the package \pkg{nicematrix} can create ``extra nodes'': the ``medium
-% nodes'' and the ``large nodes''. The first ones
-% are created with the option |create-medium-nodes| and the second ones with the
-% option |create-large-nodes|.\footnote{There is also an option
-% |create-extra-nodes| which is an alias for the conjonction of
-% |create-medium-nodes| and |create-large-nodes|.}
%
-% \medskip
-% The names of the ``medium nodes'' are constructed by adding the suffix
-% ``|-medium|'' to the names of the ``normal nodes''. In the following example,
-% we have underlined the ``medium nodes''. We consider that this example is
-% self-explanatory.
-% \[\begin{pNiceMatrix}[
-% create-medium-nodes,
-% code-after = {\begin{tikzpicture}
-% [every node/.style = {fill = red!15,
-% blend mode = multiply,
-% inner sep = 0pt},
-% name suffix = -medium]
-% \node [fit = (1-1)] {} ;
-% \node [fit = (1-2)] {} ;
-% \node [fit = (1-3)] {} ;
-% \node [fit = (2-1)] {} ;
-% \node [fit = (2-2)] {} ;
-% \node [fit = (2-3)] {} ;
-% \node [fit = (3-1)] {} ;
-% \node [fit = (3-2)] {} ;
-% \node [fit = (3-3)] {} ;
-% \end{tikzpicture}}]
-% a & a + b & a + b + c \\
-% a & a & a + b \\
-% a & a & a
-% \end{pNiceMatrix}\]
+% \section{The \textbackslash CodeAfter}
%
+% \label{code-after}
+% The option |code-after| may be used to give some code that will be executed
+% after the construction of the matrix.\footnote{There is also a key
+% |code-before| described p.~\pageref{code-before}.}
%
% \medskip
-% The names of the ``large nodes'' are constructed by adding the suffix
-% ``|-large|'' to the names of the ``normal nodes''. In the following example,
-% we have underlined the ``large nodes''. We consider that this example is
-% self-explanatory.\footnote{There is no ``large nodes'' created in the exterior
-% rows and columns (for these rows and columns, cf. p.~\pageref{exterior}).}
-%
-% \[\begin{pNiceMatrix}[
-% create-large-nodes,
-% code-after = {\begin{tikzpicture}
-% [every node/.style = {blend mode = multiply,
-% inner sep = 0pt},
-% name suffix = -large]
-% \node [fit = (1-1),fill = red!15] {} ;
-% \node [fit = (1-3),fill = red!15] {} ;
-% \node [fit = (2-2),fill = red!15] {} ;
-% \node [fit = (3-1),fill = red!15] {} ;
-% \node [fit = (3-3),fill = red!15] {} ;
-% \node [fit = (1-2),fill = blue!15] {} ;
-% \node [fit = (2-1),fill = blue!15] {} ;
-% \node [fit = (2-3),fill = blue!15] {} ;
-% \node [fit = (3-2),fill = blue!15] {} ;
-% \end{tikzpicture}}]
-% a & a + b & a + b + c \\
-% a & a & a + b \\
-% a & a & a
-% \end{pNiceMatrix}\]
-%
+% For the legibility of the code, an alternative syntax is provided: it's
+% possible to give the instructions of the |\code-after| at the end of the
+% environment, after the keyword |\CodeAfter|.
%
% \medskip
-% The ``large nodes'' of the first column and last column may appear too small
-% for some usage. That's why it's possible to use the options |left-margin| and
-% |right-margin| to add space on both sides of the array and also space in the
-% ``large nodes'' of the first column and last column. In the following example,
-% we have used the options |left-margin| and |right-margin|.\footnote{The
-% options |left-margin| and |right-margin| take dimensions as values but, if no
-% value is given, the default value is used, which is |\arraycolsep| (by
-% default: 5~pt). There is also an option |margin| to fix both |left-margin| and
-% |right-margin| to the same value.}
-% \[\begin{pNiceMatrix}[
-% create-large-nodes,left-margin,right-margin,
-% code-after = {\begin{tikzpicture}
-% [every node/.style = {blend mode = multiply,
-% inner sep = 0pt},
-% name suffix = -large]
-% \node [fit = (1-1),fill = red!15] {} ;
-% \node [fit = (1-3),fill = red!15] {} ;
-% \node [fit = (2-2),fill = red!15] {} ;
-% \node [fit = (3-1),fill = red!15] {} ;
-% \node [fit = (3-3),fill = red!15] {} ;
-% \node [fit = (1-2),fill = blue!15] {} ;
-% \node [fit = (2-1),fill = blue!15] {} ;
-% \node [fit = (2-3),fill = blue!15] {} ;
-% \node [fit = (3-2),fill = blue!15] {} ;
-% \end{tikzpicture}}]
-% a & a + b & a + b + c \\
-% a & a & a + b \\
-% a & a & a
-% \end{pNiceMatrix}\]
+% Two special commands are available in the |\CodeAfter|: |line| and
+% |\SubMatrix|.
+%
+% \subsection{The command \textbackslash line in the \textbackslash CodeAfter}
%
-% \medskip
-% It's also possible to add more space on both side of the array with the
-% options |extra-left-margin| and |extra-right-margin|. These margins are not
-% incorporated in the ``large nodes''. It's possible to fix both values with the
-% option |extra-margin| and, in the following example, we use |extra-margin|
-% with the value $3$~pt.
-% \[\begin{pNiceMatrix}[
-% create-large-nodes,margin,extra-margin=3pt,
-% code-after = {\begin{tikzpicture}
-% [every node/.style = {blend mode = multiply,
-% inner sep = 0 pt},
-% name suffix = -large]
-% \node [fit = (1-1),fill = red!15] {} ;
-% \node [fit = (1-3),fill = red!15] {} ;
-% \node [fit = (2-2),fill = red!15] {} ;
-% \node [fit = (3-1),fill = red!15] {} ;
-% \node [fit = (3-3),fill = red!15] {} ;
-% \node [fit = (1-2),fill = blue!15] {} ;
-% \node [fit = (2-1),fill = blue!15] {} ;
-% \node [fit = (2-3),fill = blue!15] {} ;
-% \node [fit = (3-2),fill = blue!15] {} ;
-% \end{tikzpicture}}]
-% a & a + b & a + b + c \\
-% a & a & a + b \\
-% a & a & a
-% \end{pNiceMatrix}\]
+% The command |\line|draws directly dotted lines between nodes. It takes two
+% arguments for the two cells to rely, both of the form $i$-$j$ where is the
+% number of row and $j$ is the number of column. It may be used, for example, to
+% draw a dotted line between two adjacent cells. \label{line-in-code-after}
%
% \medskip
-% In this case, if we want a control over the height of the rows, we can add a
-% |\strut| in each row of the array.
-% \[\begin{pNiceMatrix}[
-% create-large-nodes,left-margin,right-margin,extra-right-margin=3pt,
-% extra-left-margin=3pt,
-% code-after = {\begin{tikzpicture}
-% [every node/.style = {blend mode = multiply,
-% inner sep = 0 pt},
-% name suffix = -large]
-% \node [fit = (1-1),fill = red!15] {} ;
-% \node [fit = (1-3),fill = red!15] {} ;
-% \node [fit = (2-2),fill = red!15] {} ;
-% \node [fit = (3-1),fill = red!15] {} ;
-% \node [fit = (3-3),fill = red!15] {} ;
-% \node [fit = (1-2),fill = blue!15] {} ;
-% \node [fit = (2-1),fill = blue!15] {} ;
-% \node [fit = (2-3),fill = blue!15] {} ;
-% \node [fit = (3-2),fill = blue!15] {} ;
-% \end{tikzpicture}}]
-% \strut a & a + b & a + b + c \\
-% \strut a & a & a + b \\
-% \strut a & a & a
-% \end{pNiceMatrix}\]
-%
-% \bigskip
-% We explain below how to fill the nodes created by \pkg{nicematrix} (cf. p.
-% \pageref{highlight}).
+% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
+% \NiceMatrixOptions{xdots/shorten = 0.6 em}
+% \begin{pNiceMatrix}
+% I & 0 & \Cdots &0 \\
+% 0 & I & \Ddots &\Vdots\\
+% \Vdots &\Ddots & I &0 \\
+% 0 &\Cdots & 0 &I
+% ~emphase#\CodeAfter \line{2-2}{3-3}@
+% \end{pNiceMatrix}
+% \end{BVerbatim}
+% \begin{scope}
+% \NiceMatrixOptions{xdots/shorten = 0.6 em}
+% $\begin{pNiceMatrix}
+% I & 0 & \Cdots &0 \\
+% 0 & I & \Ddots &\Vdots\\
+% \Vdots &\Ddots & I &0 \\
+% 0 &\Cdots & 0 &I
+% \CodeAfter \line{2-2}{3-3}
+% \end{pNiceMatrix}$
+% \end{scope}
%
-% \section{The code-after}
%
-% \label{code-after}
-% The option |code-after| may be used to give some code that will be excuted
-% after the construction of the matrix (and thus after the construction of
-% all the nodes).
-%
-% \smallskip
-% \textbf{If Tikz is loaded}\footnote{We remind that, since the version 3.13,
-% \pkg{nicematrix} doesn't load Tikz by default but only \textsc{pgf} (Tikz is a
-% layer over \textsc{pfg}).}, one may access to that nodes with classical Tikz
-% instructions. The nodes should be designed as $i$-$j$ (without the prefix
-% corresponding to the name of the environment).
+% \subsection{The command \textbackslash SubMatrix in the \textbackslash CodeAfter}
+%
+% \label{sub-matrix}
%
-% Moreover, a special command, called |\line|, is available to draw directly
-% dotted lines between nodes. \label{line-in-code-after}
+% \colorbox{yellow!50}{\textbf{New 5.10}}\enskip
+% The command |\SubMatrix| provides a way to put delimiters on an portion
+% of the array considered as a submatrix. The command |\SubMatrix| takes in five
+% arguments:
+% \begin{itemize}
+% \item the first argument is the left delimiter, which may be any extensible delimiter
+% provided by LaTeX : |(|, |[|, |\{|, |\langle|, |\lgroup|, |\lfloor|, etc. but also
+% the null delimiter |.|;
+% \item the second argument is the upper-left corner of the submatrix with the
+% syntax $i$|-|$j$ where $i$ the number of row and $j$ the number of column;
+% \item the third argument is the lower-right corner with the same syntax;
+% \item the fourth argument is the right delimiter;
+% \item the last argument, which is optional, is a list of key-value pairs.
+% \end{itemize}
+%
+% One should remark that the command |\SubMatrix| draws the delimiters after the
+% construction of the array: no space is inserted by the command |\SubMatrix|
+% itself. That's why, in the following example, we have used the key |margin|
+% and you have added by hand some space between the third and fourth column with
+% |@{\hspace{1.5em}}| in the preamble of the array.
%
% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=13cm]
-% $\begin{pNiceMatrix}[~emphase#code-after = {\line{1-1}{3-3}[color=blue]}@]
-% 0 & 0 & 0 \\
-% 0 & & 0 \\
-% 0 & 0 & 0
-% \end{pNiceMatrix}$
+% \begin{scope}
+% \fvset{commandchars=\~\#\+}%
+% \begin{BVerbatim}[boxwidth=11cm,baseline=c]
+% \[\begin{NiceArray}{ccc~emphase#@{\hspace{1.5em}}+c}%
+% [cell-space-limits=2pt,~emphase#margin+]
+% 1 & 1 & 1 & x \\
+% \dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\
+% 1 & 2 & 3 & z
+% \CodeAfter
+% ~emphase#\SubMatrix({1-1}{3-3})+
+% ~emphase#\SubMatrix({1-4}{3-4})+
+% \end{NiceArray}\]
% \end{BVerbatim}
-% $\begin{pNiceMatrix}[code-after = {\line{1-1}{3-3}[color=blue]}]
-% 0 & 0 & 0 \\
-% 0 & & 0 \\
-% 0 & 0 & 0
-% \end{pNiceMatrix}$
+% \end{scope}
+% $\begin{NiceArray}{ccc@{\hspace{1.5em}}c}[cell-space-limits=2pt,margin]
+% 1 & 1 & 1 & x \\
+% \dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\
+% 1 & 2 & 3 & z
+% \CodeAfter
+% \SubMatrix({1-1}{3-3})
+% \SubMatrix({1-4}{3-4})
+% \end{NiceArray}$
%
+% \bigskip
+% The options of the command |\SubMatrix| are as follows:
+% \begin{itemize}
+% \item |left-xshift| and |right-shift| shift horizontally the delimiters (there
+% exists also the key |xshift| which fixes both parameters);
+% \item |extra-height| adds a quantity to the total height of the delimiters
+% (height |\ht| + depth |\dp|);
+% \item |delimiters-color| fixes the color of the delimiters (also
+% available in |\NiceMatrixOptions|, in the environments with delimiters and as
+% option of the command |\CodeAfter|);
+% \item |slim| is a boolean key: when that key is in force, the horizontal
+% position of the delimiters is computed by using only the contents of the cells
+% of the submatrix whereas, in the general case, the position is computed by
+% taking into account the cells of the whole columns implied in the submatrix
+% (see example below).
+% \end{itemize}
%
-% \section{The environment \{NiceArray\}}
-% \label{NiceArray}
+% These keys are also available in |\NiceMatrixOptions|, at the level of the
+% environments of \pkg{nicematrix} or as option of the command |\CodeAfter| with
+% the prefix |sub-matrix| which means that their names are therefore
+% |sub-matrix/left-xshift|, |sub-matrix/right-xshift|, |sub-matrix/xshift|, etc.
%
-% The environment |{NiceArray}| is similar to the environment |{array}|. As for
-% |{array}|, the mandatory argument is the preamble of the array. However, for
-% technical reasons, in this preamble, the user must use the letters |L|, |C|
-% and~|R|\footnote{The column types |L|, |C| and |R| are defined locally inside
-% |{NiceArray}| with |\newcolumntype| of \pkg{array}. This definition overrides
-% an eventual previous definition. In fact, the column types |w| and |W| are
-% also redefined.} instead of |l|, |c| and |r|. It's possible
-% to use the constructions |w{...}{...}|, |W{...}{...}|, "|", |>{...}|,
-% |<{...}|, |@{...}|, |!{...}| and |*{n}{...}| but the letters |p|, |m| and |b|
-% should not be used.\footnote{In a command |\multicolumn|, one should also use
-% the letters |L|, |C|, |R|.}
+%
+% \bigskip
+% \begin{scope}
+% \fvset{commandchars=\~\#\!}%
+% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
+% $\begin{NiceArray}{cc@{\hspace{5mm}}l}%
+% [cell-space-limits=2pt]
+% & & \frac12 \\
+% & & \frac14 \\[1mm]
+% a & b & \frac12a+\frac14b \\
+% c & d & \frac12c+\frac14d \\
+% \CodeAfter
+% \SubMatrix({1-3}{2-3})
+% \SubMatrix({3-1}{4-2})
+% \SubMatrix({3-3}{4-3})
+% \end{NiceArray}$
+% \end{BVerbatim}
+% \end{scope}
+% $\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt]
+% & & \frac12 \\
+% & & \frac14 \\[1mm]
+% a & b & \frac12a+\frac14b \\
+% c & d & \frac12c+\frac14d \\
+% \CodeAfter
+% \SubMatrix({1-3}{2-3})
+% \SubMatrix({3-1}{4-2})
+% \SubMatrix({3-3}{4-3})
+% \end{NiceArray}$
%
% \medskip
-% The environment |{NiceArray}| accepts the options available for
-% |{pNiceMatrix}| and its variants but also a option |baseline| whose value is
-% an integer which indicates the number of the row whose baseline is used
-% as baseline for the environment |{NiceArray}|.
+% Here is the same example with the key |slim| used for one of the submatrices.
%
% \medskip
+% \begin{scope}
+% \fvset{commandchars=\~\#\!}%
% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% $A =
-% \begin{NiceArray}{CCCC}[hvlines,~emphase#baseline=2@]
-% 1 & 2 & 3 & 4 \\
-% 1 & 2 & 3 & 4 \\
-% 1 & 2 & 3 & 4 \\
+% $\begin{NiceArray}{cc@{\hspace{5mm}}l}%
+% [cell-space-limits=2pt]
+% & & \frac12 \\
+% & & \frac14 \\[1mm]
+% a & b & \frac12a+\frac14b \\
+% c & d & \frac12c+\frac14d \\
+% \CodeAfter
+% \SubMatrix({1-3}{2-3})[~emphase#slim!]
+% \SubMatrix({3-1}{4-2})
+% \SubMatrix({3-3}{4-3})
% \end{NiceArray}$
% \end{BVerbatim}
-% $A =
-% \begin{NiceArray}{CCCC}[hvlines,baseline=2]
-% 1 & 2 & 3 & 4 \\
-% 1 & 2 & 3 & 4 \\
-% 1 & 2 & 3 & 4 \\
+% \end{scope}
+% $\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt]
+% & & \frac12 \\
+% & & \frac14 \\[1mm]
+% a & b & \frac12a+\frac14b \\
+% c & d & \frac12c+\frac14d \\
+% \CodeAfter
+% \SubMatrix({1-3}{2-3})[slim]
+% \SubMatrix({3-1}{4-2})
+% \SubMatrix({3-3}{4-3})
% \end{NiceArray}$
-%
-% \small
-% (The option |hvlines| is presented further: cf. p. \pageref{hvlines}.)
-%
-% \medskip
-% It's also possible to use the option |baseline| with one of the special values
-% |t|, |c| or |b|. These letters may also be used absolutely like the option of
-% the environment |{array}| of \pkg{array}. The initial value of |baseline| is~|c|.
%
%
-% \medskip
-% In the following example, we use the option |t| (equivalent to |baseline=t|)
-% immediately after an |\item| of list. One should remark that the presence of
-% a |\hline| at the beginning of the array doesn't prevent the alignment of the
-% baseline with the baseline of the first row (with |{array}| of \pkg{array},
-% one must use |\firsthline|\footnote{It's also possible to use |\firsthline|
-% with |{NiceArray}|.}).
+% \bigskip
+% There is also a key |name| which gives a name to the submatrix created by
+% |\SubMatrix|. That name is used to created PGF/Tiks nodes: cf
+% p.~\pageref{node-sub-matrix}.
+%
+% \section{The notes in the tabulars}
+%
+% \label{s:notes}
+%
+% \subsection{The footnotes}
%
% \smallskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% \begin{enumerate}
-% \item an item
-% \smallskip
-% \item \renewcommand{\arraystretch}{1.2}
-% $\begin{NiceArray}~emphase#[t]@{LCCCCCC}
-% \hline
-% n & 0 & 1 & 2 & 3 & 4 & 5 \\
-% u_n & 1 & 2 & 4 & 8 & 16 & 32
-% \hline
-% \end{NiceArray}$
-% \end{enumerate}
-% \end{BVerbatim}
-% \begin{minipage}{5cm}
-% \begin{enumerate}
-% \item an item
+% The package \pkg{nicematrix} allows, by using \pkg{footnote} or
+% \pkg{footnotehyper}, the extraction of the notes inserted by |\footnote| in
+% the environments of \pkg{nicematrix} and their composition in the footpage
+% with the other notes of the document.
+%
% \smallskip
-% \item \renewcommand{\arraystretch}{1.2}
-% $\begin{NiceArray}[t]{LCCCCCC}
-% \hline
-% n & 0 & 1 & 2 & 3 & 4 & 5 \\
-% u_n & 1 & 2 & 4 & 8 & 16 & 32 \\
-% \hline
-% \end{NiceArray}$
-% \end{enumerate}
-% \end{minipage}
-%
-% \medskip
-% However, it's also possible to use the tools of \pkg{booktabs}: |\toprule|,
-% |\bottomrule| and |\midrule|.\par\nobreak
%
% \smallskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% \begin{enumerate}
-% \item an item
+% If \pkg{nicematrix} is loaded with the option |footnote| (with
+% |\usepackage[footnote]{nicematrix}| or with |\PassOptionsToPackage|), the
+% package \pkg{footnote} is loaded (if it is not yet loaded) and it is used to
+% extract the footnotes.
+%
% \smallskip
-% \item
-% $\begin{NiceArray}[t]{LCCCCCC}
-% ~emphase#\toprule@
-% n & 0 & 1 & 2 & 3 & 4 & 5 \\
-% ~emphase#\midrule@
-% u_n & 1 & 2 & 4 & 8 & 16 & 32
-% ~emphase#\bottomrule@
-% \end{NiceArray}$
-% \end{enumerate}
-% \end{BVerbatim}
-% \begin{minipage}{5cm}
-% \begin{enumerate}
-% \item an item
+% If \pkg{nicematrix} is loaded with the option |footnotehyper|, the package
+% \pkg{footnotehyper} is loaded (if it is not yet loaded) ant it is used to
+% extract footnotes.
+%
% \smallskip
-% \item
-% $\begin{NiceArray}[t]{LCCCCCC}
+% Caution: The packages \pkg{footnote} and \pkg{footnotehyper} are incompatible.
+% The package \pkg{footnotehyper} is the successor of the package \pkg{footnote}
+% and should be used preferently. The package \pkg{footnote} has some drawbacks,
+% in particular: it must be loaded after the package \pkg{xcolor} and it is not
+% perfectly compatible with \pkg{hyperref}.
+%
+%
+% \subsection{The notes of tabular}
+%
+% The package \pkg{nicematrix} also provides a command |\tabularnote| which gives
+% the ability to specify notes that will be composed at the end of the array
+% with a width of line equal to the width of the array (excepted the potential
+% exterior columns). With no surprise, that command is available only in the
+% environments without delimiters, that is to say |{NiceTabular}|, |{NiceArray}|
+% and |{NiceMatrix}|.
+%
+% In fact, this command is available only if the extension \pkg{enumitem} has
+% been loaded (before or after \pkg{nicematrix}). Indeed, the notes are composed
+% at the end of the array with a type of list provided by the package
+% \pkg{enumitem}.
+%
+% \begin{scope}
+% \fvset{commandchars=\~\#\!}
+% \begin{Verbatim}
+% \begin{NiceTabular}{@{}llr@{}}[first-row,code-for-first-row = \bfseries]
% \toprule
-% n & 0 & 1 & 2 & 3 & 4 & 5 \\
+% Last name & First name & Birth day \\
% \midrule
-% u_n & 1 & 2 & 4 & 8 & 16 & 32 \\
+% Achard\tabularnote{~emphase#Achard is an old family of the Poitou.!}
+% & Jacques & 5 juin 1962 \\
+% Lefebvre\tabularnote{~emphase#The name Lefebvre is an alteration of the name Lefebure.!}
+% & Mathilde & 23 mai 1988 \\
+% Vanesse & Stephany & 30 octobre 1994 \\
+% Dupont & Chantal & 15 janvier 1998 \\
% \bottomrule
-% \end{NiceArray}$
-% \end{enumerate}
-% \end{minipage}
-%
+% \end{NiceTabular}
+% \end{Verbatim}
+% \end{scope}
%
-% \vspace{1cm}
-% With |{NiceArray}|, it's possible to draw vertical rules:\par\nobreak
+% \begin{center}
+% \begin{NiceTabular}{@{}llr@{}}[first-row,code-for-first-row = \bfseries]
+% \toprule
+% Last name & First name & Birth day \\
+% \midrule
+% Achard\tabularnote{Achard is an old family of the Poitou.}
+% & Jacques & June 5, 2005 \\
+% Lefebvre\tabularnote{The name Lefebvre is an alteration of the name Lefebure.}
+% & Mathilde & January 23, 1975 \\
+% Vanesse & Stephany & October 30, 1994 \\
+% Dupont & Chantal & January 15, 1998 \\
+% \bottomrule
+% \end{NiceTabular}
+% \end{center}
%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $\left[\begin{NiceArray}{CCCC|C}
-% a_1 & ? & \Cdots & ? & ? \\
-% 0 & & \Ddots & \Vdots & \Vdots\\
-% \Vdots & \Ddots & \Ddots & ? \\
-% 0 & \Cdots & 0 & a_n & ?
-% \end{NiceArray}\right]$
-% \end{BVerbatim}
-% $\left[\begin{NiceArray}{CCCC|C}
-% a_1 & ? & \Cdots & ? & ? \\
-% 0 & & \Ddots & \Vdots & \Vdots\\
-% \Vdots & \Ddots & \Ddots & ? \\
-% 0 & \Cdots & 0 & a_n & ?
-% \end{NiceArray}\right]$
%
% \bigskip
-% In fact, there is also variants for the environment |{NiceArray}|:
-% |{pNiceArray}|, |{bNiceArray}|, |{BNiceArray}|, |{vNiceArray}| and
-% |{VNiceArray}|. The key |baseline| is not available for these environments.
-%
-% In the following example, we use an environment |{pNiceArray}| (we don't use
-% |{pNiceMatrix}| because we want to use the types |L| and |R|
-% --- in |{pNiceMatrix}|, all the columns are of type |C|).
+% \begin{itemize}
+% \item If you have several successive commands |\tabularnote{...}| \emph{with no
+% space at all between them}, the labels of the corresponding notes are composed
+% together, separated by commas (this is similar to the option |multiple| of
+% \pkg{footmisc} for the footnotes).
%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $\begin{pNiceArray}{LCR}
-% a_{11} & \Cdots & a_{1n} \\
-% a_{21} & & a_{2n} \\
-% \Vdots & & \Vdots \\
-% a_{n-1,1} & \Cdots & a_{n-1,n}
-% \end{pNiceArray}$
-% \end{BVerbatim}
-% $\begin{pNiceArray}{LCR}
-% a_{11} & \Cdots & a_{1n} \\
-% a_{21} & & a_{2n} \\
-% \Vdots & & \Vdots \\
-% a_{n-1,1} & \Cdots & a_{n-1,n}
-% \end{pNiceArray}$
+% \item If a command |\tabularnote{...}| is exactly at the end of a cell (with
+% no space at all after), the label of the note is composed in an overlapping
+% position (towards the right). This structure may provide a better alignment of
+% the cells of a given column.
%
+% \item If the key |notes/para| is used, the notes are composed at the end of
+% the array in a single paragraph (as with the key |para| of \pkg{threeparttable}).
%
-% \bigskip
-% In fact, the environment |{pNiceArray}| and its variants are based upon a
-% more general environment, called |{NiceArrayWithDelims}|. The first two
-% mandatory arguments of this environment are the left and right delimiters used
-% in the construction of the matrix. It's possible to use
-% |{NiceArrayWithDelims}| if we want to use atypical or asymetrical delimiters.
+% \item There is a key |tabularnote| which provides a way to insert some text in
+% the zone of the notes before the numbered tabular notes.
%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% $\begin{~emphase#NiceArrayWithDelims@}
-% {\downarrow}{\uparrow}{CCC}[margin]
-% 1 & 2 & 3 \\
-% 4 & 5 & 6 \\
-% 7 & 8 & 9 \\
-% \end{~emphase#NiceArrayWithDelims@}$
-% \end{BVerbatim}
-% $\begin{NiceArrayWithDelims}
-% {\downarrow}{\uparrow}{CCC}[margin]
-% 1 & 2 & 3 \\
-% 4 & 5 & 6 \\
-% 7 & 8 & 9 \\
-% \end{NiceArrayWithDelims}$
+% \item If the package \pkg{booktabs} has been loaded (before or after
+% \pkg{nicematrix}), the key |notes/bottomrule| draws a |\bottomrule| of
+% \pkg{booktabs} \emph{after} the notes.
%
+% \item The command |\tabularnote| may be used \emph{before}
+% the environment of \pkg{nicematrix}. Thus, it's possible to use it on the
+% title inserted by |\caption| in an environment |{table}| of LaTeX.
%
-% \bigskip
-% \section{The exterior rows and columns}
-% The options |first-row|, |last-row|, |first-col| and |last-col| allow the
-% composition of exterior rows and columns in the environments of
-% \pkg{nicematrix}.
-% \label{exterior}
+% \item It's possible to create a reference to a tabular note created by |\tabularnote|
+% (with the usual command |\label| used after the |\tabularnote|).
+% \end{itemize}
+% %
+% For an illustration of some of those remarks, see table
+% \ref{t:tabularnote}, p.~\pageref{t:tabularnote}. This table has been composed
+% with the following code.
%
-% A potential ``first row'' (exterior) has the number $0$ (and not $1$). Idem
-% for the potential ``first column''.
+% \begin{center}
+% \fvset{commandchars=\~\#\!}
+% \begin{BVerbatim}[formatcom=\small\color{gray}]
+% \begin{table}
+% \setlength{\belowcaptionskip}{1ex}
+% \centering
+% \caption{Use of \texttt{\textbackslash tabularnote}~emphase#\tabularnote{It's possible!
+% ~emphase#to put a note in the caption.}}!
+% \label{t:tabularnote}
+% \begin{NiceTabular}{@{}llc@{}
+% [~emphase#notes/bottomrule!, tabularnote = Some text before the notes.]
+% \toprule
+% Last name & First name & Length of life \\
+% \midrule
+% Churchill & Wiston & 91\\
+% Nightingale~emphase#\tabularnote{Considered as the first nurse of!
+% ~emphase#history.}\tabularnote{Nicknamed ``the Lady with the Lamp''.}!
+% & Florence & 90 \\
+% Schoelcher & Victor & 89~emphase#\tabularnote{The label of the note is overlapping.}!\\
+% Touchet & Marie & 89 \\
+% Wallis & John & 87 \\
+% \bottomrule
+% \end{NiceTabular}
+% \end{table}
+% \end{BVerbatim}
+% \end{center}
%
-% \begin{Verbatim}
-% $\begin{pNiceMatrix}[~emphase#first-row,last-row,first-col,last-col@]
-% $\begin{pNiceMatrix}[~emphase#first-row,last-row,first-col,last-col@,nullify-dots]
-% & C_1 & \Cdots & & C_4 & \\
-% L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
-% \Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
-% & a_{31} & a_{32} & a_{33} & a_{34} & \\
-% L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
-% & C_1 & \Cdots & & C_4 &
-% \end{pNiceMatrix}$
-% \end{pNiceMatrix}$
-% \end{Verbatim}
%
-% \[\begin{pNiceMatrix}[first-row,last-row,first-col,last-col,nullify-dots]
-% & C_1 & \Cdots & & C_4 & \\
-% L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
-% \Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
-% & a_{31} & a_{32} & a_{33} & a_{34} & \\
-% L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
-% & C_1 & \Cdots & & C_4 &
-% \end{pNiceMatrix}\]
+% \begin{table}
+% \setlength{\belowcaptionskip}{1ex}
+% \centering
+% \caption{Use of \texttt{\textbackslash tabularnote}\tabularnote{It's possible
+% to put a note in the caption.}}
+% \label{t:tabularnote}
+% \begin{NiceTabular}{@{}llc@{}}[notes/bottomrule,
+% tabularnote = Some text before the notes.]
+% \toprule
+% Last name & First name & Length of life \\
+% \midrule
+% Churchill & Wiston & 91\\
+% Nightingale\tabularnote{Considered as the first nurse of
+% history.}\tabularnote{Nicknamed ``the Lady with the Lamp''.}
+% & Florence & 90 \\
+% Schoelcher & Victor & 89\tabularnote{The label of the note is overlapping.}\\
+% Touchet & Marie & 89 \\
+% Wallis & John & 87 \\
+% \bottomrule
+% \end{NiceTabular}
+% \end{table}
%
%
-% \bigskip
-% We have several remarks to do.
-% \begin{itemize}
-% \item For the environments with an explicit preamble (i.e. |{NiceArray}| and
-% its variants), no letter must be given in that preamble for the potential
-% first column and the potential last column: they will automatically (and
-% necessarily) be of type |R| for the first column and |L| for the last one.
-% \item One may wonder how \pkg{nicematrix} determines the number of rows and
-% columns which are needed for the composition of the ``last row'' and ``last
-% column''.
-% \begin{itemize}
-% \item For the environments with explicit preamble, like |{NiceArray}| and
-% |{pNiceArray}|, the number of columns can obviously be computed from the
-% preamble.
+%\subsection{Customisation of the tabular notes}
%
-% \item When the option |light-syntax| (cf. p. \pageref{light-syntax}) is used,
-% \pkg{nicematrix} has, in any case, to load the whole body of the environment
-% (and that's why it's not possible to put verbatim material in the array with
-% the option |light-syntax|). The analysis of this whole body gives the number
-% of rows (but not the number of columns).
%
-% \item In the other cases, \pkg{nicematrix} compute the number of rows and
-% columns during the first compilation and write the result in the |aux| file
-% for the next run.
-%
-% \textsl{However, it's possible to provide the number of the last row and the number of
-% the last column as values of the options |last-row| and |last-col|, tending to
-% an acceleration of the whole compilation of the document.} That's what we will
-% do throughout the rest of the document.
-% \end{itemize}
+% The tabular notes can be customized with a set of keys available in
+% |\NiceMatrixOptions|. The name of these keys is prefixed by |notes|.
+% \begin{itemize}
+% \item |notes/para|
+% \item |notes/bottomrule|
+% \item |notes/style|
+% \item |notes/label-in-tabular|
+% \item |notes/label-in-list|
+% \item |notes/enumitem-keys|
+% \item |notes/enumitem-keys-para|
+% \item |notes/code-before|
% \end{itemize}
-%
+% For sake of commodity, it is also possible to set these keys in
+% |\NiceMatrixOptions| via a key |notes| which takes in as value a list of
+% pairs \textsl{key=value} where the name of the keys need no longer be
+% prefixed by |notes|:
+% \begin{center}
+% \begin{BVerbatim}[formatcom = \small \color{gray}]
+% \NiceMatrixOptions
+% {
+% notes =
+% {
+% bottomrule ,
+% style = ... ,
+% label-in-tabular = ... ,
+% enumitem-keys =
+% {
+% labelsep = ... ,
+% align = ... ,
+% ...
+% }
+% }
+% }
+% \end{BVerbatim}
+% \end{center}
+%
+%
% \bigskip
-% It's possible to control the appearance of these rows and columns with options
-% |code-for-first-row|, |code-for-last-row|, |code-for-first-col| and
-% |code-for-last-col|. These options
-% specify tokens that will be inserted before each cell of the corresponding row
-% or column.
-%
+% We detail these keys.
%
-% \begin{Verbatim}
-% \NiceMatrixOptions{~emphase#code-for-first-row@ = \color{red},
-% ~emphase#code-for-first-col@ = \color{blue},
-% ~emphase#code-for-last-row@ = \color{green},
-% ~emphase#code-for-last-col@ = \color{magenta}}
-% $\begin{pNiceArray}{CC|CC}[first-row,last-row=5,first-col,last-col,nullify-dots]
-% & C_1 & \Cdots & & C_4 & \\
-% L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
-% \Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
-% \hline
-% & a_{31} & a_{32} & a_{33} & a_{34} & \\
-% L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
-% & C_1 & \Cdots & & C_4 &
-% \end{pNiceArray}$
-% \end{Verbatim}
+% \begin{itemize}[itemsep=\medskipamount]
+% \item The key |notes/para| requires the composition of the notes (at the end of
+% the tabular) in a single paragraph.
%
-% \begin{scope}
-% \NiceMatrixOptions{code-for-first-row = \color{red},
-% code-for-first-col = \color{blue},
-% code-for-last-row = \color{green},
-% code-for-last-col = \color{magenta}}
-% \begin{displaymath}
-% \begin{pNiceArray}{CC|CC}[first-row,last-row=5,first-col,last-col,nullify-dots]
-% & C_1 & \multicolumn1C{\Cdots} & & C_4 & \\
-% L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
-% \Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
-% \hline
-% & a_{31} & a_{32} & a_{33} & a_{34} & \\
-% L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
-% & C_1 & \multicolumn1C{\Cdots} & & C_4 &
-% \end{pNiceArray}
-% \end{displaymath}
-% \end{scope}
+% Initial value: |false|
%
+% That key is also available within a given environment.
%
-% \emph{Remarks}
-% \begin{itemize}[beginpenalty=10000]
-% \item As shown in the previous example, an horizontal rule (drawn by |\hline|)
-% doesn't extend in the exterior columns and a vertical rule (specified by a
-% ``\verb+|+'' in the preamble of the array) doesn't extend in the exterior
-% rows.\footnote{The latter is not true when the extension \pkg{arydshln} is
-% loaded besides \pkg{nicematrix}. In fact, \pkg{nicematrix} and \pkg{arydhsln}
-% are not totally compatible because \pkg{arydshln} redefines many internals of
-% \pkg{array}. On another hand, if one really wants a vertical rule running in
-% the first and in the last row, he should use |!{\vline}| instead of \verb+|+
-% in the preamble of the array.}
-%
-% If one wishes to define new specifiers for columns in order to draw vertical
-% rules (for example thicker than the standard rules), he should consider the
-% command |\OnlyMainNiceMatrix| described on page~\pageref{OnlyMainNiceMatrix}.
+% \item The key |notes/bottomrule| adds a |\bottomrule| of \pkg{booktabs}
+% \emph{after} the notes. Of course, that rule is drawn only if there is really
+% notes in the tabular. The package \pkg{booktabs} must have been loaded (before
+% or after the package \pkg{nicematrix}). If it is not, an error is raised.
%
-% \item A specification of color present in |code-for-first-row| also applies to
-% a dotted line draw in this exterior ``first row'' (excepted if a value has
-% been given to |xdots/color|). Idem for the other exterior rows and columns.
+% Initial value: |false|
%
-% \item Logically, the potential option |columns-width| (described
-% p.~\pageref{width}) doesn't apply to the ``first column'' and ``last column''.
-% \item For technical reasons, it's not possible to use the option of the
-% command |\\| after the ``first row'' or before the ``last row'' (the placement
-% of the delimiters would be wrong).
-% \end{itemize}
-%
-%
-%
+% That key is also available within a given environment.
%
+% \item The key |notes/style| is a command whose argument is specified by |#1|
+% and which gives the style of numerotation of the notes. That style will be
+% used by |\ref| when referencing a tabular note marked with a command |\label|.
+% The labels formatted by that style are used, separated by commas, when the user
+% puts several consecutive commands |\tabularnote|. The marker |#1| is meant to
+% be the name of a LaTeX counter.
%
-% \section{The dotted lines to separate rows or columns}
+% Initial value: |\textit{\alph{#1}}|
%
+% Another possible value should be a mere |\arabic{#1}|
%
-% In the environments of the extension \pkg{nicematrix}, it's possible to use
-% the command |\hdottedline| (provided by \pkg{nicematrix}) which is a
-% counterpart of the classical commands |\hline| and |\hdashline| (the latter is
-% a command of \pkg{arydshln}).
+% \item The key |notes/label-in-tabular| is a command whose argument is
+% specified by |#1| which is used when formatting the label of a note in the
+% tabular. Internally, this number of note has already been formatted by
+% |notes/style| before sent to that command.
%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
-% \begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 & 5 \\
-% ~emphase#\hdottedline@
-% 6 & 7 & 8 & 9 & 10 \\
-% 11 & 12 & 13 & 14 & 15
-% \end{pNiceMatrix}
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 & 5 \\
-% \hdottedline
-% 6 & 7 & 8 & 9 & 10 \\
-% 11 & 12 & 13 & 14 & 15
-% \end{pNiceMatrix}$
+% Initial value: |\textsuperscript{#1}|
%
+% In French, it's a tradition of putting a small space before the label of note.
+% That tuning could be acheived by the following code:
+% %
+% \begin{Verbatim}
+% \NiceMatrixOptions{notes/label-in-tabular = \,\textsuperscript{~#1}}
+% \end{Verbatim}
%
-% \bigskip
-% In the environments with an explicit preamble (like |{NiceArray}|, etc.), it's
-% possible to draw a vertical dotted line with the specifier ``|:|''.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
-% \left(\begin{NiceArray}{CCCC~emphase#:@C}
-% 1 & 2 & 3 & 4 & 5 \\
-% 6 & 7 & 8 & 9 & 10 \\
-% 11 & 12 & 13 & 14 & 15
-% \end{NiceArray}\right)
-% \end{BVerbatim}
-% $\left(\begin{NiceArray}{CCCC:C}
-% 1 & 2 & 3 & 4 & 5 \\
-% 6 & 7 & 8 & 9 & 10 \\
-% 11 & 12 & 13 & 14 & 15
-% \end{NiceArray}\right)$
%
+% \item The key |notes/label-in-list| is a command whose argument is specified
+% by |#1| which is used when formatting the label in the list of notes at the
+% end of the tabular. Internally, this number of note has already been formatted by
+% |notes/style| before sent to that command.
%
-% \bigskip
-% These dotted lines do \emph{not} extend in the potential exterior rows and
-% columns.
+% Initial value: |\textsuperscript{#1}|
%
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
-% $\begin{pNiceArray}{CCC:C}[
-% first-row,last-col,
-% code-for-first-row = \color{blue}\scriptstyle,
-% code-for-last-col = \color{blue}\scriptstyle ]
-% C_1 & C_2 & C_3 & C_4 \\
-% 1 & 2 & 3 & 4 & L_1 \\
-% 5 & 6 & 7 & 8 & L_2 \\
-% 9 & 10 & 11 & 12 & L_3 \\
-% \hdottedline
-% 13 & 14 & 15 & 16 & L_4
-% \end{pNiceArray}$
-% \end{BVerbatim}
-% $\begin{pNiceArray}{CCC:C}[
-% first-row,last-col,
-% code-for-first-row = \color{blue}\scriptstyle,
-% code-for-last-col = \color{blue}\scriptstyle ]
-% C_1 & C_2 & C_3 & C_4 \\
-% 1 & 2 & 3 & 4 & L_1 \\
-% 5 & 6 & 7 & 8 & L_2 \\
-% 9 & 10 & 11 & 12 & L_3 \\
-% \hdottedline
-% 13 & 14 & 15 & 16 & L_4
-% \end{pNiceArray}$
-%
-% \bigskip
-% It's possible to change in \pkg{nicematrix} the letter used to specify a
-% vertical dotted line with the option |letter-for-dotted-lines| available in
-% |\NiceMatrixOptions|. For example, in this document, we have loaded the
-% extension \pkg{arydshln} which uses the letter ``|:|'' to specify a vertical
-% dashed line. Thus, by using |letter-for-dotted-lines|, we can use the
-% vertical lines of both \pkg{arydshln} and \pkg{nicematrix}.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
-% \NiceMatrixOptions{letter-for-dotted-lines = I}
-% \arrayrulecolor{blue}
-% \left(\begin{NiceArray}{~emphase#C|C:CIC@}
-% 1 & 2 & 3 & 4 \\
-% 5 & 6 & 7 & 8 \\
-% 9 & 10 & 11 & 12
-% \end{NiceArray}\right)
-% \arrayrulecolor{black}
-% \end{BVerbatim}
-% \begin{scope}
-% \NiceMatrixOptions{letter-for-dotted-lines = I}
-% \arrayrulecolor{blue}
-% $\left(\begin{NiceArray}{C|C:CIC}
-% 1 & 2 & 3 & 4 \\
-% 5 & 6 & 7 & 8 \\
-% 9 & 10 & 11 & 12
-% \end{NiceArray}\right)$
-% \arrayrulecolor{black}
-% \end{scope}
-%
-% \smallskip
-% We have used the command |\arrayrulecolor| (de \pkg{colortbl}) to draw in blue
-% the three rules.
+% In French, the labels of notes are not composed in upper position when
+% composing the notes. Such behaviour could be acheived by:
+% \begin{Verbatim}
+% \NiceMatrixOptions{notes/label-in-list = ~#1.\nobreak\hspace{0.25em}}
+% \end{Verbatim}
+% The command |\nobreak| is for the event that the option |para| is used.
%
-% \bigskip
-% \emph{Remark} : In the extension \pkg{array} (on which the extension
-% \pkg{nicematrix} relies), horizontal and vertical rules make the array larger
-% or wider by a quantity equal to the width of the rule\footnote{In fact, this
-% is true only for |\hline| and ``"|"'' but not for |\cline|.}. In
-% \pkg{nicematrix}, the dotted lines drawn by |\hdottedline| and ``|:|'' do
-% likewise.
%
-%
-%
-% \section{The width of the columns}
-% \label{width}
+% \item The notes are composed at the end of the tabular by using internally a
+% style of list of \pkg{enumitem}.
%
-% In the environments with an explicit preamble (like |{NiceArray}|,
-% |{pNiceArray}|, etc.), it's possible to fix the width of a given column with
-% the standard letters |w| and |W| of the package \pkg{array}. In the
-% environments of \pkg{nicematrix}, the cells of such columns are composed in
-% mathematical mode, whereas, in |{array}| of \pkg{array}, they are composed in
-% text mode.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $\left(\begin{NiceArray}{~emphase#wc{1cm}@CC}
-% 1 & 12 & -123 \\
-% 12 & 0 & 0 \\
-% 4 & 1 & 2
-% \end{NiceArray}\right)$
-% \end{BVerbatim}
-% $\left(\begin{NiceArray}{wc{1cm}CC}
-% 1 & 12 & -123 \\
-% 12 & 0 & 0 \\
-% 4 & 1 & 2
-% \end{NiceArray}\right)$
+% The key |notes/enumitem-keys| specifies a list of pairs
+% \textsl{key=value} (following the specifications of \pkg{enumitem}) to
+% customize that type of list.
%
+% Initial value:\quad |noitemsep , leftmargin = * , align = left , labelsep = 0pt|
%
-% \bigskip
-% In the environments of \pkg{nicematrix}, it's also possible to fix the \emph{minimal}
-% width of all the columns of a matrix directly with the option |columns-width|.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $\begin{pNiceMatrix}[~emphase#columns-width = 1cm@]
-% 1 & 12 & -123 \\
-% 12 & 0 & 0 \\
-% 4 & 1 & 2
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}[columns-width = 1cm]
-% 1 & 12 & -123 \\
-% 12 & 0 & 0 \\
-% 4 & 1 & 2
-% \end{pNiceMatrix}$
+% This initial value contains the specification |align = left| which requires a
+% composition of the label leftwards in the box affected to that label.
+% With that tuning, the notes are composed flush left, which is pleasant when
+% composing tabulars in the spirit of \pkg{booktabs} (see for example the
+% table \ref{t:tabularnote}, p.~\pageref{t:tabularnote}).
%
-% \medskip
-% Note that the space inserted between two columns (equal to 2 |\arraycolsep|)
-% is not suppressed (of course, it's possible to suppress this space by setting
-% |\arraycolsep| equal to $0$~pt).
%
-% \bigskip
-% It's possible to give the special value |auto| to the option |columns-width|:
-% all the columns of the array will have a width equal to the widest cell of
-% the array.\footnote{The result is achieved with only one compilation (but Tikz
-% will have written informations in the |.aux| file and a message requiring a
-% second compilation will appear).}\par\nobreak
+% \item The key |notes/enumitem-keys-para| is similar to the previous one but
+% corresponds to the type of list used when the option |para| is in force. Of
+% course, when the option |para| is used, a list of type |inline| (as called by
+% \pkg{enumitem}) is used and the pairs \textsl{key=value} should correspond to
+% such a list of type |inline|.
+%
+% Initial value:\quad |afterlabel = \nobreak, itemjoin = \quad|
+%
+%
+% \item The key |notes/code-before| est une token list inserted by \pkg{nicematrix}
+% just before the composition of the notes at the end of the tabular.
+%
+% Initial value: \textsl{empty}
+%
+% For example, if one wishes to compose all the notes in gray and |\footnotesize|,
+% he should use that key:
+% \begin{Verbatim}
+% \NiceMatrixOptions{notes/code-before = \footnotesize \color{gray}}
+% \end{Verbatim}
+% It's also possible to add |\raggedright| or |\RaggedRight| in that key (|\RaggedRight|
+% is a command of \pkg{ragged2e}).
+% \end{itemize}
+%
%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $\begin{pNiceMatrix}[~emphase#columns-width = auto@]
-% 1 & 12 & -123 \\
-% 12 & 0 & 0 \\
-% 4 & 1 & 2
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}[columns-width = auto]
-% 1 & 12 & -123 \\
-% 12 & 0 & 0 \\
-% 4 & 1 & 2
-% \end{pNiceMatrix}$
-%
-% \bigskip
-% Without surprise, it's possible to fix the minimal width of the columns of all
-% the matrices of a current scope with the command
-% |\NiceMatrixOptions|.\par\nobreak
%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
-% ~emphase#\NiceMatrixOptions{columns-width=10mm}@
-% $\begin{pNiceMatrix}
-% a & b \\ c & d \\
-% \end{pNiceMatrix}
-% =
-% \begin{pNiceMatrix}
-% 1 & 1245 \\ 345 & 2 \\
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% \begin{scope}
-% \NiceMatrixOptions{columns-width=10mm}
-% $\begin{pNiceMatrix}
-% a & b \\
-% c & d \\
-% \end{pNiceMatrix}
-% =
-% \begin{pNiceMatrix}
-% 1 & 1245 \\
-% 345 & 2 \\
-% \end{pNiceMatrix}$
-% \end{scope}
-%
-%
% \bigskip
-% But it's also possible to fix a zone where all the matrices will have their
-% columns of the same width, equal to the widest cell of all the matrices. This
-% construction uses the environment |{NiceMatrixBlock}| with the option
-% |auto-columns-width|\footnote{At this time, this is the only usage of the
-% environment |{NiceMatrixBlock}| but it may have other usages in the future.}.
-% The environment |{NiceMatrixBlock}| has no direct link with the command
-% |\Block| presented just below (cf.~p.~\pageref{Block}).
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
-% ~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@
-% $\begin{pNiceMatrix}
-% a & b \\ c & d \\
-% \end{pNiceMatrix}
-% =
-% \begin{pNiceMatrix}
-% 1 & 1245 \\ 345 & 2 \\
-% \end{pNiceMatrix}$
-% ~emphase#\end{NiceMatrixBlock}@
-% \end{BVerbatim}
-% \begin{NiceMatrixBlock}[auto-columns-width]
-% $\begin{pNiceMatrix}
-% a & b \\ c & d \\
-% \end{pNiceMatrix}
-% =
-% \begin{pNiceMatrix}
-% 1 & 1245 \\ 345 & 2 \\
-% \end{pNiceMatrix}$
-% \end{NiceMatrixBlock}
+% For an example of customization of the tabular notes, see p.~\pageref{ex:notes}.
%
-% \medskip
-% \textbf{Several compilations may be necessary to achieve the job.}
%
+% \subsection{Use of \{NiceTabular\} with threeparttable}
%
-% \section{Block matrices}
-% \label{Block}
%
-% This section has no direct link with the previous one where an environment
-% |{NiceMatrixBlock}| was introduced.
-%
-% In the environments of \pkg{nicematrix}, it's possible to use the command
-% |\Block| in order to place an element in the center of a rectangle of merged
-% cells of the array.
+% If you wish to use the environment |{NiceTabular}| or |{NiceTabular*}| in an
+% environment |{threeparttable}| of the eponymous package, you have to patch the
+% environment |{threeparttable}| with the following code (with a version of
+% LaTeX at least 2020/10/01).
+% \begin{Verbatim}[commandchars=\~\#\!]
+% \makeatletter
+% \AddToHook{env/threeparttable/begin}
+% {\TPT@hookin{NiceTabular}\TPT@hookin{NiceTabular*}}
+% \makeatother
+% \end{Verbatim}
%
-% The command |\Block| must be used in the upper leftmost cell of the array with
-% two arguments. The first argument is the size of the block with the syntax
-% $i$\verb|-|$j$ where $i$ is the number of rows of the block and $j$ its number
-% of columns. The second argument is the content of the block (composed in math
-% mode). A Tikz node corresponding to the merged cells is created with the name
-% ``$i$-$j$-block''. If the user has required the creation of the ``medium
-% nodes'', a node of this type is also created with a name suffixed by
-% |-medium|.
%
-% \medskip
-% In the following examples, we use the command |\arrayrulecolor| of
-% \pkg{colortbl}.
%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
-% \arrayrulecolor{cyan}
-% $\begin{bNiceArray}{CCC|C}[margin]
-% ~emphase#\Block{3-3}{A}@ & & & 0 \\
-% & \hspace*{1cm} & & \Vdots \\
-% & & & 0 \\
-% \hline
-% 0 & \Cdots& 0 & 0
-% \end{bNiceArray}$
-% \arrayrulecolor{black}
-% \end{BVerbatim}
-% \begin{scope}
-% \arrayrulecolor{cyan}
-% $\begin{bNiceArray}{CCC|C}[margin]
-% \Block{3-3}{A} & & & 0 \\
-% & \hspace*{1cm} & & \Vdots \\
-% & & & 0 \\
-% \hline
-% 0 & \Cdots& 0 & 0
-% \end{bNiceArray}$
-% \arrayrulecolor{black}
-% \end{scope}
+% \section{Other features}
%
-% \bigskip
-% One may wish to raise the size of the ``$A$'' placed in the block of the
-% previous example. Since this element is composed in math mode, it's not
-% possible to use directly a command like |\large|, |\Large| and |\LARGE|.
-% That's why the command |\Block| provides an option between angle brackets to
-% specify some TeX code which will be inserted before the beginning of the
-% math mode.
+% \subsection{Use of the column type S of siunitx}
%
+% If the package \pkg{siunitx} is loaded (before or after \pkg{nicematrix}),
+% it's possible to use the |S| column type of \pkg{siunitx} in the environments
+% of \pkg{nicematrix}. The implementation doesn't use explicitly any private
+% macro of \pkg{siunitx}.
+%
+%
% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
-% \arrayrulecolor{cyan}
-% $\begin{bNiceArray}{CCC|C}[margin]
-% \Block{3-3}~emphase#<\Large>@{A} & & & 0 \\
-% & \hspace*{1cm} & & \Vdots \\
-% & & & 0 \\
-% \hline
-% 0 & \Cdots& 0 & 0
-% \end{bNiceArray}$
-% \arrayrulecolor{black}
+% \begin{BVerbatim}[baseline = c, boxwidth = 10.5cm]
+% $\begin{pNiceArray}{~emphase#S@cWc{1cm}c}[nullify-dots,first-row]
+% {C_1} & \Cdots & & C_n \\
+% 2.3 & 0 & \Cdots & 0 \\
+% 12.4 & \Vdots & & \Vdots \\
+% 1.45 \\
+% 7.2 & 0 & \Cdots & 0
+% \end{pNiceArray}$
% \end{BVerbatim}
-% \begin{scope}
-% \arrayrulecolor{cyan}
-% $\begin{bNiceArray}{CCC|C}[margin]
-% \Block{3-3}<\Large>{A} & & & 0 \\
-% & \hspace*{1cm} & & \Vdots \\
-% & & & 0 \\
-% \hline
-% 0 & \Cdots& 0 & 0
-% \end{bNiceArray}$
-% \arrayrulecolor{black}
-% \end{scope}
-%
-% \medskip
-% For technical reasons, you can't write |\Block{|$i$|-|$j$|}{<}|. But you can
-% write |\Block{|$i$|-|$j$|}<>{<}| with the expected result.
-%
+% $\begin{pNiceArray}{ScWc{1cm}c}[nullify-dots,first-row]
+% {C_1} & \Cdots & & C_n \\
+% 2.3 & 0 & \Cdots & 0 \\
+% 12.4 & \Vdots & & \Vdots \\
+% 1.45 \\
+% 7.2 & 0 & \Cdots & 0
+% \end{pNiceArray}$
%
-% \section{Advanced features}
+% \medskip
+% On the other hand, the |d| columns of the package \pkg{dcolumn} are not
+% supported by \pkg{nicematrix}.
+%
%
+% \subsection{Alignment option in \{NiceMatrix\}}
%
-% \subsection{Alignement option in NiceMatrix}
+% \label{key-R}
%
% The environments without preamble (|{NiceMatrix}|, |{pNiceMatrix}|,
-% |{bNiceMatrix}|, etc.) provide two options |l| and |r| (equivalent at |L| and
-% |R|) which generate all the columns aligned leftwards (or
-% rightwards).\footnote{This is a part of the functionality provided by the
-% environments |{pmatrix*}|, |{bmatrix*}|, etc. of \pkg{mathtools}.}
+% |{bNiceMatrix}|, etc.) provide two options |l| and |r| which generate all the
+% columns aligned leftwards (or rightwards).
%
%
% \medskip
% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $\begin{bNiceMatrix}[R]
+% $\begin{bNiceMatrix}[r]
% \cos x & - \sin x \\
% \sin x & \cos x
% \end{bNiceMatrix}$
% \end{BVerbatim}
-% $\begin{bNiceMatrix}[R]
+% $\begin{bNiceMatrix}[r]
% \cos x & - \sin x \\
% \sin x & \cos x
% \end{bNiceMatrix}$
@@ -1598,7 +2854,7 @@ version 2005/12/01 or later.
% e_1 & e_2 & e_3 \\
% 1 & 2 & 3 & e_1 \\
% 4 & 5 & 6 & e_2 \\
-% 7 & 8 & 9 & e_3 \\
+% 7 & 8 & 9 & e_3
% \end{pNiceMatrix}$
% \end{BVerbatim}
% \begin{varwidth}{10cm}
@@ -1609,7 +2865,7 @@ version 2005/12/01 or later.
% e_1 & e_2 & e_3 \\
% 1 & 2 & 3 & e_1 \\
% 4 & 5 & 6 & e_2 \\
-% 7 & 8 & 9 & e_3 \\
+% 7 & 8 & 9 & e_3
% \end{pNiceMatrix}$
% \end{varwidth}
%
@@ -1626,7 +2882,7 @@ version 2005/12/01 or later.
% 1 & 2 & 3 & e_1 \\
% 4 & 5 & 6 & e_2 \\
% 7 & 8 & 9 & e_3 \\
-% \text{image of } e_1 & e_2 & e_3 \\
+% \text{image of } e_1 & e_2 & e_3
% \end{pNiceMatrix}$
% \end{BVerbatim}
% \begin{varwidth}{10cm}
@@ -1637,7 +2893,7 @@ version 2005/12/01 or later.
% 1 & 2 & 3 & e_1 \\
% 4 & 5 & 6 & e_2 \\
% 7 & 8 & 9 & e_3 \\
-% \text{image of } e_1 & e_2 & e_3 \\
+% \text{image of } e_1 & e_2 & e_3
% \end{pNiceMatrix}$
% \end{varwidth}
%
@@ -1647,29 +2903,29 @@ version 2005/12/01 or later.
%
% \label{small}
%
-% With the option |small|, the environments of the extension \pkg{nicematrix}
+% With the option |small|, the environments of the package \pkg{nicematrix}
% are composed in a way similar to the environment |{smallmatrix}| of the
-% extension \pkg{amsmath} (and the environments |{psmallmatrix}|,
-% |{bsmallmatrix}|, etc. of the extension \pkg{mathtools}).
+% package \pkg{amsmath} (and the environments |{psmallmatrix}|,
+% |{bsmallmatrix}|, etc. of the package \pkg{mathtools}).
%
% \bigskip
% \begin{Verbatim}
-% $\begin{bNiceArray}{CCCC|C}[~emphase#small@,
+% $\begin{bNiceArray}{cccc|c}[~emphase#small@,
% last-col,
% code-for-last-col = \scriptscriptstyle,
% columns-width = 3mm ]
% 1 & -2 & 3 & 4 & 5 \\
% 0 & 3 & 2 & 1 & 2 & L_2 \gets 2 L_1 - L_2 \\
-% 0 & 1 & 1 & 2 & 3 & L_3 \gets L_1 + L_3 \\
+% 0 & 1 & 1 & 2 & 3 & L_3 \gets L_1 + L_3
% \end{bNiceArray}$
% \end{Verbatim}
% %
-% \[\begin{bNiceArray}{CCCC|C}[small, last-col,
+% \[\begin{bNiceArray}{cccc|c}[small, last-col,
% code-for-last-col = \scriptscriptstyle,
% columns-width=3mm]
% 1 & -2 & 3 & 4 & 5 \\
% 0 & 3 & 2 & 1 & 2 & L_2 \gets 2 L_1 - L_2 \\
-% 0 & 1 & 1 & 2 & 3 & L_3 \gets L_1 + L_3 \\
+% 0 & 1 & 1 & 2 & 3 & L_3 \gets L_1 + L_3
% \end{bNiceArray}\]
%
%
@@ -1678,7 +2934,7 @@ version 2005/12/01 or later.
% One should note that the environment |{NiceMatrix}| with the option |small| is
% not composed \emph{exactly} as the environment |{smallmatrix}|. Indeed, all
% the environments of \pkg{nicematrix} are constructed upon |{array}| (of the
-% extension \pkg{array}) whereas the environment |{smallmatrix}| is constructed
+% package \pkg{array}) whereas the environment |{smallmatrix}| is constructed
% directly with an |\halign| of TeX.
%
% \medskip
@@ -1699,9 +2955,10 @@ version 2005/12/01 or later.
% exists) has also the number~$0$.}. Of course, the user must not change the
% value of these counters which are used internally by \pkg{nicematrix}.
%
-% In the |code-after| (cf. p. \pageref{code-after}), |iRow| represents the total
-% number of rows (excepted the potential exterior rows) and |jCol| represents
-% the total number of columns (excepted the potential exterior columns).
+% In the |code-before| (cf. p. \pageref{code-before}) and in the |\CodeAfter|
+% (cf. p. \pageref{code-after}), |iRow| represents the total number of rows
+% (excepted the potential exterior rows) and |jCol| represents the total number
+% of columns (excepted the potential exterior columns).
%
% \medskip
% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
@@ -1728,20 +2985,20 @@ version 2005/12/01 or later.
%
% \medskip
% If LaTeX counters called |iRow| and |jCol| are defined in the document by
-% extensions other than \pkg{nicematrix} (or by the user), they are shadowed in
-% the environments of \pkg{nicematrix}.
+% packages other than \pkg{nicematrix} (or by the final user), they are shadowed
+% in the environments of \pkg{nicematrix}.
%
% \bigskip
-% The extension \pkg{nicematrix} also provides commands in order to compose
+% The package \pkg{nicematrix} also provides commands in order to compose
% automatically matrices from a general pattern. These commands are
-% |\pAutoNiceMatrix|, |\bAutoNiceMatrix|, |\vAutoNiceMatrix|,
+% |\AutoNiceMatrix|, |\pAutoNiceMatrix|, |\bAutoNiceMatrix|, |\vAutoNiceMatrix|,
% |\VAutoNiceMatrix| and |\BAutoNiceMatrix|.
%
-% These commands take two mandatory arguments. The first is the format of the
+% These commands take in two mandatory arguments. The first is the format of the
% matrix, with the syntax $n$-$p$ where $n$ is the number of rows and $p$ the
% number of columns. The second argument is the pattern (it's a list of tokens
% which are inserted in each cell of the constructed matrix, excepted in the
-% cells of the eventual exterior rows and columns).
+% cells of the potential exterior rows and columns).
%
% \medskip
% \begin{Verbatim}
@@ -1749,107 +3006,21 @@ version 2005/12/01 or later.
% \end{Verbatim}
%
%
-% $C = \pAutoNiceMatrix{3-3}{C_{\arabic{iRow},\arabic{jCol}}}$
-%
-% \subsection{The options hlines, vlines and hvlines}
-%
-% \label{hvlines}
-% You can add horizontal rules between rows in the environments of
-% \pkg{nicematrix} with the usual command |\hline| and you can use the specifier
-% ``"|"'' to add vertical rules. However, by convenience, the extension
-% \pkg{nicematrix} also provides the option |hlines| (resp. |vlines|) which will
-% draw all the horizontal (resp. vertical) rules (excepted, of course, the
-% exterior rules corresponding to the exterior rows and columns). The key
-% |hvlines| is an alias for the conjonction for the keys |hlines| et |vlines|.
-%
-% % \medskip
-% In the following example, we use the command |\arrayrulecolor| of
-% \pkg{colortbl}.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% \arrayrulecolor{cyan}
-% $\begin{NiceArray}{CCCC}%
-% [~emphase#hvlines@,first-row,first-col]
-% % & e & a & b & c \\
-% e & e & a & b & c \\
-% a & a & e & c & b \\
-% b & b & c & e & a \\
-% c & c & b & a & e
-% \end{NiceArray}$
-% \arrayrulecolor{black}
-% \end{BVerbatim}
-% \arrayrulecolor{cyan}
-% $\begin{NiceArray}{CCCC}[hvlines,first-row,first-col]
-% & e & a & b & c \\
-% e & e & a & b & c \\
-% a & a & e & c & b \\
-% b & b & c & e & a \\
-% c & c & b & a & e
-% \end{NiceArray}$
-% \arrayrulecolor{black}
-%
-% \bigskip
-% However, there is a difference between the key |vlines| and the use of
-% the specifier ``"|"'' in the preamble of the environment: the rules drawn by
-% |vlines| completely cross the double-rules drawn by |\hline\hline|.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11.5cm]
-% $\begin{NiceArray}{CCCC}[vlines] \hline
-% a & b & c & d \\ \hline \hline
-% 1 & 2 & 3 & 4 \\
-% 1 & 2 & 3 & 4 \\ \hline
-% \end{NiceArray}$
-% \end{BVerbatim}
-% $\begin{NiceArray}{CCCC}[vlines]
-% \hline
-% a & b & c & d \\
-% \hline \hline
-% 1 & 2 & 3 & 4 \\
-% 1 & 2 & 3 & 4 \\
-% \hline
-% \end{NiceArray}$
-%
-% \bigskip
-% For the environments with delimiters (for example |{pNiceArray}| or
-% |{pNiceMatrix}|), the option |vlines| don't draw vertical rules on both sides,
-% where are the delimiters (fortunately).
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
-% \setlength{\arrayrulewidth}{0.2pt}
-% $\begin{pNiceMatrix}[vlines]
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% \begin{scope}
-% \setlength{\arrayrulewidth}{0.2pt}
-% $\begin{pNiceMatrix}[vlines]
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% \end{pNiceMatrix}$
-% \end{scope}
+% \[C = \pAutoNiceMatrix{3-3}{C_{\arabic{iRow},\arabic{jCol}}}\]
%
%
% \subsection{The option light-syntax}
%
% \label{light-syntax}
-% The option |light-syntax|\footnote{This option is inspired by the extension
-% \pkg{spalign} of Joseph Rabinoff.} allows the user to compose the arrays with a
-% lighter syntax, which gives a more readable TeX source.
+% The option |light-syntax| (inpired by the package \pkg{spalign}) allows the
+% user to compose the arrays with a lighter syntax, which gives a better
+% legibility of the TeX source.
%
% When this option is used, one should use the semicolon for the end of a row
% and spaces or tabulations to separate the columns. However, as usual in the
% TeX world, the spaces after a control sequence are discarded and the elements
% between curly braces are considered as a whole.
%
-% \bigskip
-% The following example has been composed with XeLaTeX with \pkg{unicode-math},
-% which allows the use of greek letters directly in the TeX source.
%
% \medskip
% \begin{scope}
@@ -1879,36 +3050,588 @@ version 2005/12/01 or later.
% analyzed. The environment doesn't behave in that case as a standard
% environment of LaTeX which only put TeX commands before and after the content.}
%
-% \subsection{Use of the column type S of siunitx}
%
-% If the package \pkg{siunitx} is loaded (before or after \pkg{nicematrix}),
-% it's possible to use the |S| column type of \pkg{siunitx} in the environments
-% of \pkg{nicematrix}. The implementation doesn't use explicitly any private
-% macro of \pkg{siunitx}.
+% \subsection{Color of the delimiters}
+%
+% For the environements with delimiters (|{pNiceArray}|, |{pNiceMatrix}|, etc.),
+% it's possible to change the color of the delimiters with the key
+% |delimiters-color|.
+%
+% \medskip
+% \begin{BVerbatim}[boxwidth=12cm,baseline=c]
+% $\begin{bNiceMatrix}[delimiters-color=red]
+% 1 & 2 \\
+% 3 & 4
+% \end{bNiceMatrix}$
+% \end{BVerbatim}
+% $\begin{bNiceMatrix}[delimiters-color=red]
+% 1 & 2 \\
+% 3 & 4
+% \end{bNiceMatrix}$
+%
+%
+% \subsection{The environment \{NiceArrayWithDelims\}}
+%
+% In fact, the environment |{pNiceArray}| and its variants are based upon a
+% more general environment, called |{NiceArrayWithDelims}|. The first two
+% mandatory arguments of this environment are the left and right delimiters used
+% in the construction of the matrix. It's possible to use
+% |{NiceArrayWithDelims}| if we want to use atypical or asymetrical delimiters.
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
+% $\begin{~emphase#NiceArrayWithDelims@}
+% {\downarrow}{\uparrow}{ccc}[margin]
+% 1 & 2 & 3 \\
+% 4 & 5 & 6 \\
+% 7 & 8 & 9
+% \end{~emphase#NiceArrayWithDelims@}$
+% \end{BVerbatim}
+% $\begin{NiceArrayWithDelims}
+% {\downarrow}{\uparrow}{ccc}[margin]
+% 1 & 2 & 3 \\
+% 4 & 5 & 6 \\
+% 7 & 8 & 9
+% \end{NiceArrayWithDelims}$
+%
+%
%
+% \section{Use of Tikz with nicematrix}
%
+% \label{name}
+% \subsection{The nodes corresponding to the contents of the cells}
+%
+% The package \pkg{nicematrix} creates a PGF/Tikz node for each (non-empty) cell
+% of the considered array. These nodes are used to draw the dotted lines between
+% the cells of the matrix (inter alia).
+%
+%
+% \smallskip
+% \textbf{Caution} : By default, no node is created in a empty cell.
+%
+% \smallskip
+% However, it's possible to impose the creation of a node with the command |\NotEmpty|.
+% \footnote{One should note that, with that command, the cell is considered as
+% non-empty, which has consequencies for the continuous dotted lines (cf.
+% p.~\pageref{Cdots}).}
+%
% \medskip
-% \begin{BVerbatim}[baseline = c, boxwidth = 10.5cm]
-% $\begin{pNiceArray}{~emphase#S@CWc{1cm}C}[nullify-dots,first-row]
-% {C_1} & \Cdots & & C_n \\
-% 2.3 & 0 & \Cdots & 0 \\
-% 12.4 & \Vdots & & \Vdots \\
-% 1.45 \\
-% 7.2 & 0 & \Cdots & 0
-% \end{pNiceArray}$
+% The nodes of a document must have distinct names. That's why the names of the
+% nodes created by \pkg{nicematrix} contains the number of the current
+% environment. Indeed, the environments of \pkg{nicematrix} are numbered by a
+% internal global counter.
+%
+% \smallskip
+% In the environment with the number $n$, the node of the row $i$ and
+% column~$j$ has for name |nm-|$n$|-|$i$|-|$j$.
+%
+% \smallskip
+% The command |\NiceMatrixLastEnv| provides the number of the last environment
+% of \pkg{nicematrix} (for LaTeX, it's a ``fully expandable'' command and not a
+% counter).
+%
+% \smallskip
+% However, it's advisable to use instead the key |name|. This key gives a name
+% to the current environment. When the environment has a name, the nodes are
+% accessible with the name ``\textsl{name}-$i$-$j$'' where \textsl{name} is the
+% name given to the array and $i$ and $j$ the numbers of row and column. It's
+% possible to use these nodes with \textsc{pgf} but the final user will
+% probably prefer to use Tikz (which is a convenient layer upon \textsc{pgf}).
+% However, one should remind that \pkg{nicematrix} doesn't load Tikz by default.
+% In the following examples, we assume that Tikz has been loaded.
+%
+% \bigskip
+% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
+% $\begin{pNiceMatrix}[name=~emphase#mymatrix@]
+% 1 & 2 & 3 \\
+% 4 & 5 & 6 \\
+% 7 & 8 & 9
+% \end{pNiceMatrix}$
+% \tikz[remember picture,overlay]
+% \draw ~emphase#(mymatrix-2-2)@ circle (2mm) ;
% \end{BVerbatim}
-% $\begin{pNiceArray}{SCWc{1cm}C}[nullify-dots,first-row]
-% {C_1} & \Cdots & & C_n \\
-% 2.3 & 0 & \Cdots & 0 \\
-% 12.4 & \Vdots & & \Vdots \\
-% 1.45 \\
-% 7.2 & 0 & \Cdots & 0
-% \end{pNiceArray}$
+% $\begin{pNiceMatrix}[name=mymatrix]
+% 1 & 2 & 3 \\
+% 4 & 5 & 6 \\
+% 7 & 8 & 9
+% \end{pNiceMatrix}$
+% \tikz[remember picture,overlay]
+% \draw (mymatrix-2-2) circle (2mm) ;
+%
+% \medskip
+% Don't forget the options |remember picture| and |overlay|.
+%
+% \bigskip
+% In the |\CodeAfter|, the things are easier : one must refer to the nodes with
+% the form $i$-$j$ (we don't have to indicate the environment which is of
+% course the current environment).
+%
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
+% $\begin{pNiceMatrix}
+% 1 & 2 & 3 \\
+% 4 & 5 & 6 \\
+% 7 & 8 & 9
+% \CodeAfter
+% \tikz \draw ~emphase#(2-2)@ circle (2mm) ;
+% \end{pNiceMatrix}$
+% \end{BVerbatim}
+% $\begin{pNiceMatrix}
+% 1 & 2 & 3 \\
+% 4 & 5 & 6 \\
+% 7 & 8 & 9
+% \CodeAfter
+% \tikz \draw (2-2) circle (2mm) ;
+% \end{pNiceMatrix}$
+%
+%
+% \bigskip
+% In the following example, we have underlined all the nodes of the matrix (we
+% explain below the technic used : cf. p. \pageref{highlight}).
+%
+% \[\begin{pNiceMatrix}[
+% code-after = {\begin{tikzpicture}
+% [every node/.style = {blend mode = multiply,
+% fill = red!15,
+% inner sep = 0 pt }]
+% \node [fit = (1-1)] {} ;
+% \node [fit = (1-3)] {} ;
+% \node [fit = (2-2)] {} ;
+% \node [fit = (3-1)] {} ;
+% \node [fit = (3-3)] {} ;
+% \node [fit = (1-2)] {} ;
+% \node [fit = (2-1)] {} ;
+% \node [fit = (2-3)] {} ;
+% \node [fit = (3-2)] {} ;
+% \end{tikzpicture}}]
+% a & a + b & a + b + c \\
+% a & a & a + b \\
+% a & a & a
+% \end{pNiceMatrix}\]
+%
+%
%
+% \subsection{The ``medium nodes'' and the ``large nodes''}
+%
+% In fact, the package \pkg{nicematrix} can create ``extra nodes'': the ``medium
+% nodes'' and the ``large nodes''. The first ones
+% are created with the option |create-medium-nodes| and the second ones with the
+% option |create-large-nodes|.\footnote{There is also an option
+% |create-extra-nodes| which is an alias for the conjonction of
+% |create-medium-nodes| and |create-large-nodes|.}
+%
% \medskip
-% On the other hand, the |d| columns of the package \pkg{dcolumn} are not
-% supported by \pkg{nicematrix}.
+% These nodes are not used by \pkg{nicematrix} by default, and that's why they
+% are not created by default.
%
+% \medskip
+% The names of the ``medium nodes'' are constructed by adding the suffix
+% ``|-medium|'' to the names of the ``normal nodes''. In the following example,
+% we have underlined the ``medium nodes''. We consider that this example is
+% self-explanatory.
+% \[\begin{pNiceMatrix}[
+% create-medium-nodes,
+% code-after = {\begin{tikzpicture}
+% [every node/.style = {fill = red!15,
+% blend mode = multiply,
+% inner sep = 0pt},
+% name suffix = -medium]
+% \node [fit = (1-1)] {} ;
+% \node [fit = (1-2)] {} ;
+% \node [fit = (1-3)] {} ;
+% \node [fit = (2-1)] {} ;
+% \node [fit = (2-2)] {} ;
+% \node [fit = (2-3)] {} ;
+% \node [fit = (3-1)] {} ;
+% \node [fit = (3-2)] {} ;
+% \node [fit = (3-3)] {} ;
+% \end{tikzpicture}}]
+% a & a + b & a + b + c \\
+% a & a & a + b \\
+% a & a & a
+% \end{pNiceMatrix}\]
+%
+%
+% \medskip
+% The names of the ``large nodes'' are constructed by adding the suffix
+% ``|-large|'' to the names of the ``normal nodes''. In the following example,
+% we have underlined the ``large nodes''. We consider that this example is
+% self-explanatory.\footnote{There is no ``large nodes'' created in the exterior
+% rows and columns (for these rows and columns, cf. p.~\pageref{exterior}).}
+%
+% \[\begin{pNiceMatrix}[
+% create-large-nodes,
+% code-after = {\begin{tikzpicture}
+% [every node/.style = {blend mode = multiply,
+% inner sep = 0pt},
+% name suffix = -large]
+% \node [fit = (1-1),fill = red!15] {} ;
+% \node [fit = (1-3),fill = red!15] {} ;
+% \node [fit = (2-2),fill = red!15] {} ;
+% \node [fit = (3-1),fill = red!15] {} ;
+% \node [fit = (3-3),fill = red!15] {} ;
+% \node [fit = (1-2),fill = blue!15] {} ;
+% \node [fit = (2-1),fill = blue!15] {} ;
+% \node [fit = (2-3),fill = blue!15] {} ;
+% \node [fit = (3-2),fill = blue!15] {} ;
+% \end{tikzpicture}}]
+% a & a + b & a + b + c \\
+% a & a & a + b \\
+% a & a & a
+% \end{pNiceMatrix}\]
+%
+%
+% \medskip
+% The ``large nodes'' of the first column and last column may appear too small
+% for some usage. That's why it's possible to use the options |left-margin| and
+% |right-margin| to add space on both sides of the array and also space in the
+% ``large nodes'' of the first column and last column. In the following example,
+% we have used the options |left-margin| and |right-margin|.\footnote{The
+% options |left-margin| and |right-margin| take dimensions as values but, if no
+% value is given, the default value is used, which is |\arraycolsep| (by
+% default: 5~pt). There is also an option |margin| to fix both |left-margin| and
+% |right-margin| to the same value.}
+% \[\begin{pNiceMatrix}[
+% create-large-nodes,left-margin,right-margin,
+% code-after = {\begin{tikzpicture}
+% [every node/.style = {blend mode = multiply,
+% inner sep = 0pt},
+% name suffix = -large]
+% \node [fit = (1-1),fill = red!15] {} ;
+% \node [fit = (1-3),fill = red!15] {} ;
+% \node [fit = (2-2),fill = red!15] {} ;
+% \node [fit = (3-1),fill = red!15] {} ;
+% \node [fit = (3-3),fill = red!15] {} ;
+% \node [fit = (1-2),fill = blue!15] {} ;
+% \node [fit = (2-1),fill = blue!15] {} ;
+% \node [fit = (2-3),fill = blue!15] {} ;
+% \node [fit = (3-2),fill = blue!15] {} ;
+% \end{tikzpicture}}]
+% a & a + b & a + b + c \\
+% a & a & a + b \\
+% a & a & a
+% \end{pNiceMatrix}\]
+%
+% \medskip
+% It's also possible to add more space on both side of the array with the
+% options |extra-left-margin| and |extra-right-margin|. These margins are not
+% incorporated in the ``large nodes''. It's possible to fix both values with the
+% option |extra-margin| and, in the following example, we use |extra-margin|
+% with the value $3$~pt.
+% \[\begin{pNiceMatrix}[
+% create-large-nodes,margin,extra-margin=3pt,
+% code-after = {\begin{tikzpicture}
+% [every node/.style = {blend mode = multiply,
+% inner sep = 0 pt},
+% name suffix = -large]
+% \node [fit = (1-1),fill = red!15] {} ;
+% \node [fit = (1-3),fill = red!15] {} ;
+% \node [fit = (2-2),fill = red!15] {} ;
+% \node [fit = (3-1),fill = red!15] {} ;
+% \node [fit = (3-3),fill = red!15] {} ;
+% \node [fit = (1-2),fill = blue!15] {} ;
+% \node [fit = (2-1),fill = blue!15] {} ;
+% \node [fit = (2-3),fill = blue!15] {} ;
+% \node [fit = (3-2),fill = blue!15] {} ;
+% \end{tikzpicture}}]
+% a & a + b & a + b + c \\
+% a & a & a + b \\
+% a & a & a
+% \end{pNiceMatrix}\]
+%
+%
+%
+% \bigskip
+% \textbf{Be careful} : These nodes are reconstructed from the contents of the
+% contents cells of the array. Usually, they do not correspond to the cells
+% delimited by the rules (if we consider that these rules are drawn).
+%
+% \bigskip
+% \begin{minipage}[c]{7.6cm}
+% Here is an array composed with the following code:
+%
+% \medskip
+% \begin{BVerbatim}
+% \large
+% \begin{NiceTabular}{wl{2cm}ll}[hvlines]
+% fraise & amande & abricot \\
+% prune & pêche & poire \\[1ex]
+% noix & noisette & brugnon
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \end{minipage}
+% \hspace{0.9cm}
+% \begin{scope}
+% \large
+% \begin{NiceTabular}[c]{wl{2cm}ll}[hvlines]
+% fraise & amande & abricot \\
+% prune & pêche & poire \\[1ex]
+% noix & noisette & brugnon
+% \end{NiceTabular}
+% \end{scope}
+%
+% \vspace{1cm}
+% \begin{minipage}[c]{7cm}
+% Here, we have colored all the cells of the array with |\chessboardcolors|.
+% \end{minipage}
+% \hspace{1.5cm}
+% \begin{scope}
+% \large
+% \begin{NiceTabular}[c]{wl{2cm}ll}[hvlines,code-before = \chessboardcolors{red!15}{blue!15}]
+% fraise & amande & abricot \\
+% prune & pêche & poire \\[1ex]
+% noix & noisette & brugnon
+% \end{NiceTabular}
+% \end{scope}
+%
+%
+% \vspace{1cm}
+% \begin{minipage}[c]{7cm}
+% Here are the ``large nodes'' of this array (without use of |margin|
+% nor |extra-margin|).
+% \end{minipage}
+% \hspace{1.5cm}
+% \begin{scope}
+% \large
+% \begin{NiceTabular}[c]{wl{2cm}ll}[hvlines,
+% create-large-nodes,
+% code-after = {\begin{tikzpicture}
+% [every node/.style = {blend mode = multiply,
+% inner sep = 0 pt},
+% name suffix = -large]
+% \node [fit = (1-1),fill = red!15] {} ;
+% \node [fit = (1-3),fill = red!15] {} ;
+% \node [fit = (2-2),fill = red!15] {} ;
+% \node [fit = (3-1),fill = red!15] {} ;
+% \node [fit = (3-3),fill = red!15] {} ;
+% \node [fit = (1-2),fill = blue!15] {} ;
+% \node [fit = (2-1),fill = blue!15] {} ;
+% \node [fit = (2-3),fill = blue!15] {} ;
+% \node [fit = (3-2),fill = blue!15] {} ;
+% \end{tikzpicture}}]
+% fraise & amande & abricot \\
+% prune & pêche & poire \\[1ex]
+% noix & noisette & brugnon
+% \end{NiceTabular}
+% \end{scope}
+%
+%
+%
+%
+% \subsection{The ``row-nodes'' and the ``col-nodes''}
+%
+% The package \pkg{nicematrix} creates a PGF/Tikz node indicating the potential
+% position of each horizontal rule (with the names |row-|$i$) and each vertical
+% rule (with the names |col-|$j$), as described in the following figure. These
+% nodes are available in the |code-before| and the |\CodeAfter|.
+% \begin{center}
+% \begin{NiceTabular}{ccc}[hvlines,rules/width=1pt,rules/color=gray]
+% rose & tulipe & lys \\
+% arum & iris & violette \\
+% muguet & dahlia & souci
+% \CodeAfter
+% \tiny
+% \begin{tikzpicture}
+% \foreach \i in {1,2,3,4}
+% {
+% \fill [red] (row-\i) circle (0.5mm) ;
+% \node [red,anchor=east] at (row-\i) {row-\i} ;
+% }
+% \foreach \j in {1,2,3,4}
+% {
+% \fill [blue] (col-\j) circle (0.5mm) ;
+% \node [blue,anchor=north] at (col-\j) {col-\j} ;
+% }
+% \end{tikzpicture}
+% \end{NiceTabular}
+% \end{center}
+%
+% \bigskip
+% If we use Tikz (we remind that \pkg{nicematrix} does not load Tikz by
+% default), we can access (in the |code-before| and the |\CodeAfter|) to the
+% intersection of the horizontal rule~$i$ and the vertical rule~$j$ with the
+% syntax |(row-|$i$\verb+-|col-+$j$|)|.
+%
+% \medskip
+% \begin{Verbatim}
+% \[\begin{NiceMatrix}[
+% code-before =
+% {
+% ~emphase# \tikz \draw [fill = red!15] @
+% ~emphase# (row-7-|col-4) -- (row-8-|col-4) -- (row-8-|col-5) -- @
+% ~emphase# (row-9-|col-5) -- (row-9-|col-6) |- cycle ; @
+% }
+% ]
+% 1 \\
+% 1 & 1 \\
+% 1 & 2 & 1 \\
+% 1 & 3 & 3 & 1 \\
+% 1 & 4 & 6 & 4 & 1 \\
+% 1 & 5 & 10 & 10 & 5 & 1 \\
+% 1 & 6 & 15 & 20 & 15 & 6 & 1 \\
+% 1 & 7 & 21 & 35 & 35 & 21 & 7 & 1 \\
+% 1 & 8 & 28 & 56 & 70 & 56 & 28 & 8 & 1
+% \end{NiceMatrix}\]
+% \end{Verbatim}
+% \[\begin{NiceMatrix}[
+% code-before =
+% {
+% \tikz \draw [fill = red!15]
+% (row-7-|col-4) -- (row-8-|col-4) -- (row-8-|col-5) --
+% (row-9-|col-5) -- (row-9-|col-6) |- cycle ;
+% }
+% ]
+% 1 \\
+% 1 & 1 \\
+% 1 & 2 & 1 \\
+% 1 & 3 & 3 & 1 \\
+% 1 & 4 & 6 & 4 & 1 \\
+% 1 & 5 & 10 & 10 & 5 & 1 \\
+% 1 & 6 & 15 & 20 & 15 & 6 & 1 \\
+% 1 & 7 & 21 & 35 & 35 & 21 & 7 & 1 \\
+% 1 & 8 & 28 & 56 & 70 & 56 & 28 & 8 & 1
+% \end{NiceMatrix}\]
+%
+% \subsection{The nodes corresponding to the command \textbackslash SubMatrix}
+%
+% \label{node-sub-matrix}
+%
+% The command |\SubMatrix| available in the |\CodeAfter| has been described
+% p.~\pageref{sub-matrix}.
+%
+% \smallskip
+% If a command |\SubMatrix| has been used with the key |name| with an expression
+% such as |name=|\textsl{\ttfamily MyName} three PGF/Tikz nodes are created
+% with the names \textsl{\ttfamily MyName}|-left|, \textsl{\ttfamily MyName} and
+% \textsl{\ttfamily MyName}|-right|.
+%
+% \smallskip
+% The nodes \textsl{\ttfamily MyName}|-left| and \textsl{\ttfamily
+% MyName}|-right| correspond to the delimiters left and right and the node
+% \textsl{\ttfamily MyName} correspond to the submatrix itself.
+%
+% \medskip
+% In the following example, we have highlighted these nodes (the submatrix itself has
+% been created with |\SubMatrix\{{2-2}{3-3}\}|).
+%
+% \[\begin{pNiceMatrix}
+% 121 & 23 & 345 & 345\\
+% 45 & 346 & 863 & 444\\
+% 3462 & 38458 & 34 & 294 \\
+% 34 & 7 & 78 & 309 \\
+% \CodeAfter
+% \SubMatrix\{{2-2}{3-3}\}[name=A]
+% \begin{tikzpicture}
+% [every node/.style = {blend mode = multiply,
+% inner sep = 0 pt}]
+% \node [fit = (A),fill = red!15] {} ;
+% \node [fit = (A-left),fill = blue!15] {} ;
+% \node [fit = (A-right),fill = blue!15] {} ;
+% \end{tikzpicture}
+% \end{pNiceMatrix}\]
+%
+% \section{API for the developpers}
+%
+% The package \pkg{nicematrix} provides two variables which are internal but
+% public\footnote{According to the LaTeX3 conventions,
+% each variable with name beginning with |\g_nicematrix| ou |\l_nicematrix| is
+% public and each variable with name beginning with |\g__nicematrix| or
+% |\l__nicematrix| is private.}:
+% \begin{itemize}
+% \item |\g_nicematrix_code_before_tl| ;
+% \item |\g_nicematrix_code_after_tl|.
+% \end{itemize}
+%
+%
+% \medskip
+% These variables contain the code of what we have called the ``|code-before|''
+% and the ``|code-after|''. The developper can use them to add code from a cell
+% of the array (the affectation must be global, allowing to exit the cell, which
+% is a TeX group).
+%
+% \medskip
+% One should remark that the use of |\g_nicematrix_code_before_tl| needs one
+% compilation more (because the instructions are written on the |aux| file to be
+% used during the next run).
+%
+% \bigskip
+% \emph{Example} : We want to write a command |\hatchcell| to hatch the current
+% cell (with an optional argument between brackets for the color). It's possible
+% to program such command |\hatchcell| as follows, explicitely using the public
+% variable |\g_nicematrix_code_before_tl| (this code requires the Tikz library
+% \pkg{patterns}: |\usetikzlibrary{patterns}|).
+%
+%
+% \begin{scope}
+% \fvset{commandchars=\§\¤\μ}
+% \begin{Verbatim}
+%\ExplSyntaxOn
+% \cs_new_protected:Nn \__pantigny_hatchcell:nnn
+% {
+% \begin { tikzpicture }
+% \fill [ pattern = north~west~lines , pattern~color = #3 ]
+% ( row - #1 -| col - #2)
+% rectangle
+% ( row - \int_eval:n { #1 + 1 } -| col - \int_eval:n { #2 + 1 } ) ;
+% \end { tikzpicture }
+% }
+%
+% \NewDocumentCommand \hatchcell { ! O { black } }
+% {
+% \tl_gput_right:Nx §emphase¤\g_nicematrix_code_before_tlμ
+% {
+% \__pantigny_hatchcell:nnn
+% { \int_use:c { c@iRow } }
+% { \int_use:c { c@jCol } }
+% { #1 }
+% }
+% }
+% \ExplSyntaxOff
+% \end{Verbatim}
+% \end{scope}
+%
+%
+%\ExplSyntaxOn
+% \cs_new_protected:Nn \__pantigny_hatchcell:nnn
+% {
+% \begin { tikzpicture }
+% \fill [ pattern = north~west~lines , pattern~color = #3 ]
+% ( row - #1 -| col - #2)
+% rectangle
+% ( row - \int_eval:n { #1 + 1 } -| col - \int_eval:n { #2 + 1 } ) ;
+% \end { tikzpicture }
+% }
+%
+% \NewDocumentCommand \hatchcell { ! O { black } }
+% {
+% \tl_gput_right:Nx \g_nicematrix_code_before_tl
+% {
+% \__pantigny_hatchcell:nnn
+% { \int_use:c { c@iRow } }
+% { \int_use:c { c@jCol } }
+% { #1 }
+% }
+% }
+% \ExplSyntaxOff
+%
+%
+% \bigskip
+% Here is an example of use:
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
+% \begin{NiceTabular}{ccc}[hvlines]
+% Tokyo & Paris & London \\
+% Roma & ~emphase#\hatchcell[blue!30]@Oslo & Miami \\
+% Los Angeles & Madrid & Roma
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{ccc}[hvlines]
+% Tokyo & Paris & London \\
+% Lima & \hatchcell[blue!30]Oslo & Miami \\
+% Los Angeles & Madrid & Roma
+% \end{NiceTabular}
%
%
% \section{Technical remarks}
@@ -1917,10 +3640,10 @@ version 2005/12/01 or later.
%
% \label{OnlyMainNiceMatrix}
%
-% The extension \pkg{nicematrix} provides the command |\OnlyMainNiceMatrix|
+% The package \pkg{nicematrix} provides the command |\OnlyMainNiceMatrix|
% which is meant to be used in definitions of new column types. Its argument is
% evaluated if and only if we are in the main part of the array, that is to say
-% not in an eventual exterior row.
+% not in an potential exterior row.
%
% For example, one may wish to define a new column type |?| in order to draw a
% (black) heavy rule of width 1~pt. The following definition will do the
@@ -1930,20 +3653,22 @@ version 2005/12/01 or later.
% \newcolumntype{?}{!{\OnlyMainNiceMatrix{\vrule width 1 pt}}}
% \end{Verbatim}
%
-% The heavy vertical rule won't extend in the exterior rows:
+% The heavy vertical rule won't extend in the exterior rows.\footnote{Of course,
+% such rule is defined by the classical technics of \pkg{nicematrix} and, for
+% this reason, won't cross the double rules of |\hline\hline|.}
% \medskip
% \begin{scope}
% \newcolumntype{?}{!{\OnlyMainNiceMatrix{\vrule width 1 pt}}}
%
% \begin{BVerbatim}[baseline = c, boxwidth = 10.5cm]
-% $\begin{pNiceArray}{CC?CC}[first-row,last-row=3]
+% $\begin{pNiceArray}{cc?cc}[first-row,last-row=3]
% C_1 & C_2 & C_3 & C_4 \\
% a & b & c & d \\
% e & f & g & h \\
% C_1 & C_2 & C_3 & C_4
% \end{pNiceArray}$
% \end{BVerbatim}
-% $\begin{pNiceArray}{CC?CC}[first-row,last-row=3]
+% $\begin{pNiceArray}{cc?cc}[first-row,last-row=3]
% C_1 & C_2 & C_3 & C_4 \\
% a & b & c & d \\
% e & f & g & h \\
@@ -1952,63 +3677,10 @@ version 2005/12/01 or later.
% \end{scope}
%
% \medskip
-% The specifier |?| may be used in a standard environment |{array}| (of the
-% package \pkg{array}) and, in this case, the command |\OnlyMainNiceMatrix| is
-% no-op.
-%
-%
-% \subsection{Intersections of dotted lines}
-%
-% Since the version 3.1 of \pkg{nicematrix}, the dotted lines created by
-% |\Cdots|, |\Ldots|, |\Vdots|, etc. can't intersect.\footnote{On the contrary,
-% dotted lines created by |\hdottedline|, the letter ``|:|'' in the preamble
-% of the array and the command |\line| in the |code-after| can have
-% intersections with other dotted lines.}
-%
-% That means that a dotted line created by one these commands automatically
-% stops when it arrives on a dotted line already drawn. Therefore, the order in
-% which dotted lines are drawn is important. Here's that order (by design) :
-% |\Hdotsfor|, |\Vdots|, |\Ddots|, |\Iddots|, |\Cdots| and |\Ldots|.
-%
-% With this structure, it's possible to draw the following matrix.
-%
-% \medskip
-% \begin{BVerbatim}[baseline = c, boxwidth = 10.5cm]
-% $\begin{pNiceMatrix}[nullify-dots]
-% 1 & 2 & 3 & \Cdots & n \\
-% 1 & 2 & 3 & \Cdots & n \\
-% \Vdots & \Cdots & & \Hspace*{15mm} & \Vdots \\
-% & \Cdots & & & \\
-% & \Cdots & & & \\
-% & \Cdots & & & \\
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% % $\begin{pNiceMatrix}[nullify-dots]
-% 1 & 2 & 3 & \Cdots & n \\
-% 1 & 2 & 3 & \Cdots & n \\
-% \Vdots & \Cdots & & \Hspace*{15mm} & \Vdots \\
-% & \Cdots & & & \\
-% & \Cdots & & & \\
-% & \Cdots & & & \\
-% \end{pNiceMatrix}$
-%
-% \subsection{The names of the PGF nodes created by nicematrix}
-%
-% We have said that, when a name is given to an environment of \pkg{nicematrix},
-% it's possible to access the PGF/Tikz nodes through this name (cf.
-% p.~\pageref{name}).
+% This specifier |?| may be used in the standard environments |{tabular}| and
+% |{array}| (of the package \pkg{array}) and, in this case, the command
+% |\OnlyMainNiceMatrix| is no-op.
%
-% That's the recommended way to access these nodes. However, we describe now the
-% internal names of these nodes.
-%
-% The environments created by \pkg{nicematrix} are numbered by an internal
-% global counter. The command |\NiceMatrixLastEnv| provides the number of the
-% last environment of \pkg{nicematrix} (for LaTeX, it's a ``fully expandable''
-% command and not a counter).
-%
-% For the environment of number~$n$, the node in row~$i$ and column~$j$ has the
-% name |nm-|$n$|-|$i$|-|$j$. The |medium| and |large| nodes have the same name,
-% suffixed by |-medium| and |-large|.
%
%
% \subsection{Diagonal lines}
@@ -2079,20 +3751,19 @@ version 2005/12/01 or later.
% a+b & \Cdots & a+b & 1
% \end{pNiceMatrix}$
%
-%
% \end{scope}
%
+% It's possible to specify the instruction |\Ddots| which will be drawn first
+% (and which will be used to draw the other diagonal dotted lines when the
+% parallelization is in force) with the key |draw-first|: |\Ddots[draw-first]|.
+%
% \subsection{The ``empty'' cells}
%
% \label{empty-cells}
% An instruction like |\Ldots|, |\Cdots|, etc. tries to determine the first
-% non-empty cells on both sides. However, an empty cell is not necessarily a
+% non-empty cell on both sides. However, an ``empty cell'' is not necessarily a
% cell with no TeX content (that is to say a cell with no token between the two
-% ampersands~|&|). Indeed, a cell which only contains |\hspace*{1cm}| may be
-% considered as empty.
-%
-% \interitem
-% For \pkg{nicematrix}, the precise rules are as follow.
+% ampersands~|&|). The precise rules are as follow.
%
% \begin{itemize}
% \item An implicit cell is empty. For example, in the following matrix:
@@ -2109,6 +3780,9 @@ version 2005/12/01 or later.
% \medskip
% \item Each cell whose TeX ouput has a width equal to zero is empty.
%
+% \medskip
+% \item A cell containing the command |\NotEmpty| is not empty (and a PGF/Tikz
+% node) is created in that cell.
%
% \medskip
% \item A cell with a command |\Hspace| (or |\Hspace*|) is empty. This command
@@ -2134,7 +3808,7 @@ version 2005/12/01 or later.
% |\hskip -\arraycolsep|\footnote{And not by inserting |@{}| on both sides of the
% preamble of the array. As a consequence, the length of the |\hline| is not
% modified and may appear too long, in particular when using square brackets}.
-% The extension \pkg{nicematrix} does the same in all its environments,
+% The package \pkg{nicematrix} does the same in all its environments,
% |{NiceArray}| included. However, if the user wants the environment
% |{NiceArray}| behaving by default like the environment |{array}| of
% \pkg{array} (for example, when adapting an existing document) it's possible to
@@ -2144,103 +3818,127 @@ version 2005/12/01 or later.
% environments of \pkg{nicematrix} are not affected).
%
%
-% \subsection{The class option draft}
%
-% When the class option |draft| is used, the dotted lines are not drawn, for a
-% faster compilation.
-%
-% \subsection{A technical problem with the argument of
-% \textbackslash\textbackslash}
-%
+% \subsection{Incompatibilities}
%
-% For technical, reasons, if you use the optional argument of the command |\\|,
-% the vertical space added will also be added to the ``normal'' node
-% corresponding at the previous node.
+% The package \pkg{nicematrix} is not fully compatible with the package
+% \pkg{arydshln} (because this package redefines many internal of \pkg{array}).
%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% \begin{pNiceMatrix}
-% a & \frac AB \\~emphase#[2mm]@
-% b & c
-% \end{pNiceMatrix}
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}[
-% code-after = {\tikz \node [inner sep = 0pt,
-% fill = red!15,
-% blend mode = multiply,
-% fit = (1-2) ] {} ; } ]
-% a & \frac AB \\[2mm]
-% b & c
-% \end{pNiceMatrix}$
+% Anyway, in order to use \pkg{arydshln}, one must first free the letter ``|:|''
+% by giving a new letter for the vertical dotted rules of \pkg{nicematrix}:
+%
+% \begin{Verbatim}
+% \NiceMatrixOptions{letter-for-dotted-lines=;}
+% \end{Verbatim}
%
% \bigskip
-% There are two solutions to solve this problem. The first solution is to use a
-% TeX command to insert space between the rows.
+% As of now, the package \pkg{nicematrix} is not compatible with
+% \cls{aastex63}. If you want to use \pkg{nicematrix} with \cls{aastex63}, send
+% me an email and I will try to solve the incompatibilies.
+%
+% \section{Examples}
%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% \begin{pNiceMatrix}
-% a & \frac AB \\
-% ~emphase#\noalign{\kern2mm}@
-% b & c
-% \end{pNiceMatrix}
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}[
-% code-after = {\tikz \node [inner sep = 0pt,
-% fill = red!15,
-% blend mode = multiply,
-% fit = (1-2) ] {} ; } ]
-% a & \frac AB \\
-% \noalign{\kern2mm}
-% b & c
-% \end{pNiceMatrix}$
+% \subsection{Notes in the tabulars}
%
+% \label{ex:notes}
%
-% \bigskip
-% The other solution is to use the command |\multicolumn| in the previous cell.
+% The tools provided by \pkg{nicematrix} for the composition of the tabular
+% notes have been presented in the section \ref{s:notes} p.~\pageref{s:notes}.
%
% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% \begin{pNiceMatrix}
-% a & ~emphase#\multicolumn1C{\frac AB}@ \\[2mm]
-% b & c
-% \end{pNiceMatrix}
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}[
-% code-after = {\tikz \node [inner sep = 0pt,
-% fill = red!15,
-% blend mode = multiply,
-% fit = (1-2) ] {} ; } ]
-% a & \multicolumn1C{\frac AB} \\[2mm]
-% b & c
-% \end{pNiceMatrix}$
+% Let's consider that we wish to number the notes of a tabular with
+% stars.\footnote{Of course, it's realistic only when there is very few notes in
+% the tabular.}
+%
+% \medskip
+% First, we write a command |\stars| similar the well-known commands
+% |\arabic|, |\alph|, |\Alph|, etc. which produces a number of stars equal to
+% its argument \footnote{In fact: the value of its argument.}
+% \begin{Verbatim}
+% \ExplSyntaxOn
+% \NewDocumentCommand ~emphase#\stars@ { m }
+% { \prg_replicate:nn { \value { ~#1 } } { $ \star $ } }
+% \ExplSyntaxOff
+% \end{Verbatim}
+% %
+% Of course, we change the style of the labels with the key |notes/style|.
+% However, it would be interesting to change also some parameters in the type of
+% list used to compose the notes at the end of the tabular.
+% First, we required a composition flush right for the labels with the setting
+% |align=right|.
+% Moreover, we want the labels to be composed on a width equal to the width of
+% the widest label. The widest label is, of course, the label with the greatest
+% number of stars. We know that number: it is equal to |\value{tabularnote}|
+% (because |tabularnote| is the LaTeX counter used by |\tabularnote| and,
+% therefore, at the end of the tabular, its value is equal to the total number
+% of tabular notes). We use the key |widest*| of \pkg{enumitem} in order to
+% require a width equal to that value: |widest*=\value{tabularnote}|.
+% \begin{Verbatim}
+% \NiceMatrixOptions
+% {
+% notes =
+% {
+% ~emphase#style = \stars{~#1} , @
+% ~emphase#enumitem-keys = @
+% ~emphase# { @
+% ~emphase# widest* = \value{tabularnote} ,@
+% ~emphase# align = right @
+% ~emphase# } @
+% }
+% }
+% \end{Verbatim}
%
%
-% \subsection{Obsolete environments}
-%
-% The version 3.0 of \pkg{nicematrix} has introduced the environment
-% |{pNiceArray}| (and its variants) with the options |first-row|, |last-row|,
-% |first-col| and |last-col|.
%
-% Consequently the following environments present in previous versions of
-% \pkg{nicematrix} are deprecated:
-% %
-% \begin{itemize}
-% \item |{NiceArrayCwithDelims}| ;
-% \item |{pNiceArrayC}|, |{bNiceArrayC}|, |{BNiceArrayC}|, |{vNiceArrayC}|,
-% |{VNiceArrayC}| ;
-% \item |{NiceArrayRCwithDelims}| ;
-% \item |{pNiceArrayRC}|, |{bNiceArrayRC}|, |{BNiceArrayRC}|, |{vNiceArrayRC}|,
-% |{VNiceArrayRC}|.
-% \end{itemize}
-%
-% Since the version 3.12, the only way to use these environments is loading
-% \pkg{nicematrix} with the option |obsolete-environments|.
+% \begin{scope}
+% \ExplSyntaxOn
+% \NewDocumentCommand \stars { m }
+% { \prg_replicate:nn { \value { #1 } } { $ \star $ } }
+% \NiceMatrixOptions
+% {
+% notes =
+% {
+% style = \stars{#1} ,
+% enumitem-keys =
+% {
+% widest* = \value{tabularnote} ,
+% align = right
+% }
+% }
+% }
+% \ExplSyntaxOff
+% \begin{Verbatim}
+% \begin{NiceTabular}{~@{}llr~@{}}[first-row,code-for-first-row = \bfseries]
+% \toprule
+% Last name & First name & Birth day \\
+% \midrule
+% Achard\tabularnote{~emphase#Achard is an old family of the Poitou.@}
+% & Jacques & 5 juin 1962 \\
+% Lefebvre\tabularnote{~emphase#The name Lefebvre is an alteration of the name Lefebure.@}
+% & Mathilde & 23 mai 1988 \\
+% Vanesse & Stephany & 30 octobre 1994 \\
+% Dupont & Chantal & 15 janvier 1998 \\
+% \bottomrule
+% \end{NiceTabular}
+% \end{Verbatim}
+%
+% \begin{center}
+% \begin{NiceTabular}{@{}llr@{}}[first-row,code-for-first-row = \bfseries]
+% \toprule
+% Last name & First name & Birth day \\
+% \midrule
+% Achard\tabularnote{Achard is an old family of the Poitou.}
+% & Jacques & June 5, 2005 \\
+% Lefebvre\tabularnote{The name Lefebvre is an alteration of the name Lefebure.}
+% & Mathilde & January 23, 1975 \\
+% Vanesse & Stephany & October 30, 1994 \\
+% Dupont & Chantal & January 15, 1998 \\
+% \bottomrule
+% \end{NiceTabular}
+% \end{center}
+% \end{scope}
%
-% However, these environments will certainly be completely deleted in a future
-% version of \pkg{nicematrix}.
%
-% \section{Examples}
%
% \subsection{Dotted lines}
%
@@ -2310,7 +4008,7 @@ version 2005/12/01 or later.
% \[\begin{BNiceMatrix}[nullify-dots]
% 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\\
% 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10\\
-% \Cdots & & \multicolumn{6}{C}{10 \text{ other rows}} & \Cdots \\
+% \Cdots & & \multicolumn{6}{c}{10 \text{ other rows}} & \Cdots \\
% 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10
% \end{BNiceMatrix}\]
%
@@ -2345,7 +4043,7 @@ version 2005/12/01 or later.
% \bigskip
% \begin{BVerbatim}
% \setlength{\extrarowheight}{1mm}
-% \[\begin{vNiceArray}{CCCC:CCC}[columns-width=6mm]
+% \[\begin{vNiceArray}{cccc:ccc}[columns-width=6mm]
% a_0 & && &b_0 & & \\
% a_1 &\Ddots&& &b_1 &\Ddots& \\
% \Vdots&\Ddots&& &\Vdots &\Ddots&b_0 \\
@@ -2360,7 +4058,7 @@ version 2005/12/01 or later.
%
% \begin{scope}
% \setlength{\extrarowheight}{1mm}
-% \[\begin{vNiceArray}{CCCC:CCC}[columns-width=6mm]
+% \[\begin{vNiceArray}{cccc:ccc}[columns-width=6mm]
% a_0 & && &b_0 & & \\
% a_1 &\Ddots&& &b_1 &\Ddots& \\
% \Vdots&\Ddots&& &\Vdots &\Ddots&b_0 \\
@@ -2372,12 +4070,10 @@ version 2005/12/01 or later.
% \end{scope}
%
% \vspace{2cm}
-% An example for a linear system (the vertical rule has been drawn in cyan with
-% the tools of \pkg{colortbl}):\par\nobreak
+% An example for a linear system:\par\nobreak
%
% \begin{Verbatim}
-% \arrayrulecolor{cyan}
-% $\begin{pNiceArray}{*6C|C}[nullify-dots,last-col,code-for-last-col={\scriptstyle}]
+% $\begin{pNiceArray}{*6c|c}[nullify-dots,last-col,code-for-last-col=\scriptstyle]
% 1 & 1 & 1 &\Cdots & & 1 & 0 & \\
% 0 & 1 & 0 &\Cdots & & 0 & & L_2 \gets L_2-L_1 \\
% 0 & 0 & 1 &\Ddots & & \Vdots & & L_3 \gets L_3-L_1 \\
@@ -2385,12 +4081,10 @@ version 2005/12/01 or later.
% \Vdots & & &\Ddots & & 0 & \\
% 0 & & &\Cdots & 0 & 1 & 0 & L_n \gets L_n-L_1
% \end{pNiceArray}$
-% \arrayrulecolor{black}
% \end{Verbatim}
%
-% \arrayrulecolor{cyan}
-% \[\begin{pNiceArray}{*6C|C}[nullify-dots,last-col,
-% code-for-last-col={\scriptstyle}]
+%
+% \[\begin{pNiceArray}{*6c|c}[nullify-dots,last-col,code-for-last-col=\scriptstyle]
% 1 & 1 & 1 &\Cdots & & 1 & 0 & \\
% 0 & 1 & 0 &\Cdots & & 0 & & L_2 \gets L_2-L_1 \\
% 0 & 0 & 1 &\Ddots & & \Vdots & & L_3 \gets L_3-L_1 \\
@@ -2398,9 +4092,42 @@ version 2005/12/01 or later.
% \Vdots & & &\Ddots & & 0 & \\
% 0 & & &\Cdots & 0 & 1 & 0 & L_n \gets L_n-L_1
% \end{pNiceArray}\]
-% \arrayrulecolor{black}
%
%
+%
+% \subsection{Dotted lines which are no longer dotted}
+%
+% The option |line-style| controls the style of the lines drawn by |\Ldots|,
+% |\Cdots|, etc. Thus, it's possible with these commands to draw lines which are
+% not longer dotted.
+%
+% \begin{Verbatim}
+% \NiceMatrixOptions
+% {nullify-dots,code-for-first-col = \color{blue},code-for-first-col=\color{blue}}
+% $\begin{pNiceMatrix}[first-row,first-col]
+% & & \Ldots[line-style={solid,<->},shorten=0pt]^{n \text{ columns}} \\
+% & 1 & 1 & 1 & \Ldots & 1 \\
+% & 1 & 1 & 1 & & 1 \\
+% \Vdots[line-style={solid,<->}]_{n \text{ rows}} & 1 & 1 & 1 & & 1 \\
+% & 1 & 1 & 1 & & 1 \\
+% & 1 & 1 & 1 & \Ldots & 1
+% \end{pNiceMatrix}$
+% \end{Verbatim}
+%
+%
+% \begin{scope}
+% \NiceMatrixOptions
+% {nullify-dots,code-for-first-col = \color{blue},code-for-first-row=\color{blue}}
+% \[\begin{pNiceMatrix}[first-row,first-col]
+% & & \Ldots[line-style={solid,<->},shorten=0pt]^{n \text{ columns}} \\
+% & 1 & 1 & 1 & \Ldots & 1 \\
+% & 1 & 1 & 1 & & 1 \\
+% \Vdots[line-style={solid,<->}]_{n \text{ rows}} & 1 & 1 & 1 & & 1 \\
+% & 1 & 1 & 1 & & 1 \\
+% & 1 & 1 & 1 & \Ldots & 1
+% \end{pNiceMatrix}\]
+% \end{scope}
+%
% \subsection{Width of the columns}
%
%
@@ -2412,159 +4139,144 @@ version 2005/12/01 or later.
% \bigskip
% \begin{BVerbatim}
% ~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@
-% \NiceMatrixOptions{code-for-last-col = \color{blue}\scriptstyle}
+% \NiceMatrixOptions
+% { last-col,code-for-last-col = \color{blue}\scriptstyle,light-syntax}
% \setlength{\extrarowheight}{1mm}
-% \quad $\begin{pNiceArray}{CCCC:C}[last-col]
-% 1&1&1&1&1&\\
-% 2&4&8&16&9&\\
-% 3&9&27&81&36&\\
-% 4&16&64&256&100&
+% $\begin{pNiceArray}{cccc:c}
+% 1 1 1 1 1 {} ;
+% 2 4 8 16 9 ;
+% 3 9 27 81 36 ;
+% 4 16 64 256 100
+% \end{pNiceArray}$
+% \medskip
+% $\begin{pNiceArray}{cccc:c}
+% 1 1 1 1 1 ;
+% 0 2 6 14 7 { L_2 \gets -2 L_1 + L_2 } ;
+% 0 6 24 78 33 { L_3 \gets -3 L_1 + L_3 } ;
+% 0 12 60 252 96 { L_4 \gets -4 L_1 + L_4 }
% \end{pNiceArray}$
% ...
% ~emphase#\end{NiceMatrixBlock}@
% \end{BVerbatim}
-%
+%
% \bigskip
-%
+%
% \begin{multicols}{2}
% \begin{NiceMatrixBlock}[auto-columns-width]
-% \NiceMatrixOptions{code-for-last-col = \color{blue}\scriptstyle}
+% \NiceMatrixOptions{last-col,code-for-last-col = \color{blue}\scriptstyle,light-syntax}
% \setlength{\extrarowheight}{1mm}
%
-% \enskip $\begin{pNiceArray}{CCCC:C}[last-col]
-% 1&1&1&1&1&\\
-% 2&4&8&16&9&\\
-% 3&9&27&81&36&\\
-% 4&16&64&256&100&
+% \enskip $\begin{pNiceArray}{cccc:c}
+% 1 1 1 1 1 {} ;
+% 2 4 8 16 9 ;
+% 3 9 27 81 36 ;
+% 4 16 64 256 100
% \end{pNiceArray}$
%
% \medskip
%
-% \enskip $\begin{pNiceArray}{CCCC:C}[last-col]
-% 1&1&1&1&1&\\
-% 0&2&6&14&7&L_2\gets-2L_1+L_2 \\
-% 0&6&24&78&33&L_3\gets-3L_1+L_3 \\
-% 0&12&60&252&96&L_4\gets-4L_1+L_4
+% \enskip $\begin{pNiceArray}{cccc:c}
+% 1 1 1 1 1 ;
+% 0 2 6 14 7 { L_2 \gets -2 L_1 + L_2 } ;
+% 0 6 24 78 33 { L_3 \gets -3 L_1 + L_3 } ;
+% 0 12 60 252 96 { L_4 \gets -4 L_1 + L_4 }
% \end{pNiceArray}$
%
% \medskip
%
-% \enskip $\begin{pNiceArray}{CCCC:C}[last-col]
-% 1&1&1&1&1&\\
-% 0&1&3&7&\frac72&L_2\gets\frac12L_2\\
-% 0&3&12&39&\frac{33}2&L_3\gets\frac12L_3 \\
-% 0&1&5&21&8&L_4\gets\frac1{12}L_4
+% \enskip $\begin{pNiceArray}{cccc:c}
+% 1 1 1 1 1 ;
+% 0 1 3 7 \frac72 { L_2 \gets \frac12 L_2 } ;
+% 0 3 12 39 \frac{33}2 { L_3 \gets \frac12 L_3 } ;
+% 0 1 5 21 8 { L_4 \gets \frac1{12} L_4 }
% \end{pNiceArray}$
%
% \medskip
%
-% \enskip $\begin{pNiceArray}{CCCC:C}[last-col]
-% 1&1&1&1&1&\\
-% 0&1&3&7&\frac72&\\
-% 0&0&3&18&6&L_3 \gets -3L_2+L_3 \\
-% 0&0&-2&-14&-\frac92&L_4 \gets L_2-L_4
+% \enskip $\begin{pNiceArray}{cccc:c}
+% 1 1 1 1 1 ;
+% 0 1 3 7 \frac72 ;
+% 0 0 3 18 6 { L_3 \gets -3 L_2 + L_3 } ;
+% 0 0 -2 -14 -\frac92 { L_4 \gets L_2 - L_4 }
% \end{pNiceArray}$
%
% \medskip
%
-% \enskip $\begin{pNiceArray}{CCCC:C}[last-col]
-% 1&1&1&1&1&\\
-% 0&1&3&7&\frac72&\\
-% 0&0&1&6&2&L_3 \gets \frac13L_3\\
-% 0&0&-2&-14&-\frac92&
+% \enskip $\begin{pNiceArray}{cccc:c}
+% 1 1 1 1 1 ;
+% 0 1 3 7 \frac72 ;
+% 0 0 1 6 2 { L_3 \gets \frac13 L_3 } ;
+% 0 0 -2 -14 -\frac92
% \end{pNiceArray}$
%
% \medskip
%
-% \enskip $\begin{pNiceArray}{CCCC:C}[last-col]
-% 1&1&1&1&1&\\
-% 0&1&3&7&\frac72&\\
-% 0&0&1&6&2& \\
-% 0&0&0&-2&-\frac12 & L_4 \gets 2L_3+L_4
+% \enskip $\begin{pNiceArray}{cccc:c}
+% 1 1 1 1 1 ;
+% 0 1 3 7 \frac72 ;
+% 0 0 1 6 2 ;
+% 0 0 0 -2 -\frac12 { L_4 \gets L_3 + L_4 }
% \end{pNiceArray}$
% \end{NiceMatrixBlock}
% \end{multicols}
+%
%
-%
-% \subsection{How to highlight cells of the matrix}
+% \subsection{How to highlight cells of a matrix}
%
%
% \label{highlight}
-% The following examples require Tikz (by default, \pkg{nicematrix} only loads
-% \textsc{pgf}) and the Tikz library |fit|. The following lines in the preamble
-% of your document may do the job:
-% \begin{verbatim}
-% \usepackage{tikz}
-% \usetikzlibrary{fit}
-% \end{verbatim}
%
% \medskip
-% In order to highlight a cell of a matrix, it's possible to ``draw'' one of the
-% correspondant nodes (the ``normal node'', the ``medium node'' or the ``large
-% node''). In the following example, we use the ``large nodes'' of the diagonal
-% of the matrix (with the Tikz key ``|name suffix|'', it's easy to use the
-% ``large nodes'').
+% In order to highlight a cell of a matrix, it's possible to ``draw'' that cell
+% with the key |draw| of the command |\Block| (this is one of the uses of a
+% mono-cell block\footnote{We recall that, if the first mandatory argument of
+% the command |\Block| is left empty, that means that the block is a mono-cell block}).
+%
+% \label{example-CodeAfter}
%
-% We redraw the nodes with other nodes by using the Tikz library |fit|. Since we
-% want to redraw the nodes exactly, we have to set |inner sep = 0 pt| (if we
-% don't do that, the new nodes will be larger that the nodes created by
-% \pkg{nicematrix}).
%
% \begin{Verbatim}
-% $\begin{pNiceArray}{>{\strut}CCCC}%
-% [create-large-nodes,margin,extra-margin = 2pt ,
-% code-after = {\begin{tikzpicture}
-% [~emphase#name suffix = -large@,
-% every node/.style = {draw,
-% ~emphase#inner sep = 0 pt@}]
-% \node [fit = (1-1)] {} ;
-% \node [fit = (2-2)] {} ;
-% \node [fit = (3-3)] {} ;
-% \node [fit = (4-4)] {} ;
-% \end{tikzpicture}}]
-% a_{11} & a_{12} & a_{13} & a_{14} \\
-% a_{21} & a_{22} & a_{23} & a_{24} \\
-% a_{31} & a_{32} & a_{33} & a_{34} \\
-% a_{41} & a_{42} & a_{43} & a_{44}
+% $\begin{pNiceArray}{>{\strut}cccc}[margin,rules/color=blue]
+% ~emphase#\Block[draw]{}{a_{11}}@ & a_{12} & a_{13} & a_{14} \\
+% a_{21} & \Block[draw]{}{a_{22}} & a_{23} & a_{24} \\
+% a_{31} & a_{32} & \Block[draw]{}{a_{33}} & a_{34} \\
+% a_{41} & a_{42} & a_{43} & \Block[draw]{}{a_{44}} \\
% \end{pNiceArray}$
% \end{Verbatim}
-%
-%
-% \[\begin{pNiceArray}{>{\strut}CCCC}[
-% create-large-nodes,margin,extra-margin = 2pt,
-% code-after = {\begin{tikzpicture}[name suffix = -large,
-% every node/.style = {draw,
-% inner sep = 0 pt}]
-% \node [fit = (1-1)] {} ;
-% \node [fit = (2-2)] {} ;
-% \node [fit = (3-3)] {} ;
-% \node [fit = (4-4)] {} ;
-% \end{tikzpicture}}]
-% a_{11} & a_{12} & a_{13} & a_{14} \\
-% a_{21} & a_{22} & a_{23} & a_{24} \\
-% a_{31} & a_{32} & a_{33} & a_{34} \\
-% a_{41} & a_{42} & a_{43} & a_{44}
+% \[\begin{pNiceArray}{>{\strut}cccc}[margin,rules/color=blue]
+% \Block[draw]{}{a_{11}} & a_{12} & a_{13} & a_{14} \\
+% a_{21} & \Block[draw]{}{a_{22}} & a_{23} & a_{24} \\
+% a_{31} & a_{32} & \Block[draw]{}{a_{33}} & a_{34} \\
+% a_{41} & a_{42} & a_{43} & \Block[draw]{}{a_{44}} \\
% \end{pNiceArray}\]
%
% We should remark that the rules we have drawn are drawn \emph{after} the
-% construction of the array and thus, they don't spread the cells of the
-% array. We recall that, on the other side, the command |\hline|, the specifier
-% ``"|"'' and the options |hlines| and |vlines| spread the cells (when the
-% package \pkg{array} is loaded but, when the package \pkg{nicematrix} is
-% loaded, \pkg{array} is always loaded).\footnote{On the other side, the command
-% |\cline| doesn't spread the rows of the array.}
+% construction of the array and thus, they don't spread the cells of the array.
+% We recall that, on the other side, the command |\hline|, the specifier ``"|"''
+% and the options |hlines|, |vlines| and |hvlines| spread the
+% cells.\footnote{For the command |\cline|, see the remark
+% p.~\pageref{remark-cline}.}
%
%
% \vspace{1cm}
-% The package \pkg{nicematrix} is constructed upon the environment |{array}|
-% and, therefore, it's possible to use the package \pkg{colortbl} in the
-% environments of \pkg{nicematrix}. However, it's not always easy to do a fine
-% tuning of \pkg{colortbl}. That's why we propose another method to highlight a
-% row of the matrix. We create a rectangular Tikz node which encompasses the
-% nodes of the second row with the Tikz library \pkg{fit}. This Tikz node is
-% filled after the construction of the matrix. In order to see the text
-% \emph{under} this node, we have to use transparency with the |blend mode|
-% equal to |multiply|.
+% It's possible to color a row with |\rowcolor| in the |code-before| (or with
+% |\rowcolor| in the first cell of the row if the key |colortbl-like| is used).
+% However, it's not possible to do a fine tuning. That's why we describe now a
+% method to highlight a row of the matrix. We create a rectangular Tikz node
+% which encompasses the nodes of the second row with the Tikz library \pkg{fit}.
+% This Tikz node is filled after the construction of the matrix. In order to see
+% the text \emph{under} this node, we have to use transparency with the
+% |blend mode| equal to |multiply|.
+%
+%
+% \medskip
+% That example and the following ones require Tikz (by default, \pkg{nicematrix}
+% only loads \textsc{pgf}) and the Tikz library |fit|. The following lines in
+% the preamble of your document do the job:
+% \begin{verbatim}
+% \usepackage{tikz}
+% \usetikzlibrary{fit}
+% \end{verbatim}
%
% \tikzset{highlight/.style={rectangle,
% fill=red!15,
@@ -2582,41 +4294,22 @@ version 2005/12/01 or later.
% inner sep=1pt,
% fit = ~#1}}
%
-% $\begin{bNiceMatrix}[~emphase#code-after = {\tikz \node [highlight = (2-1) (2-3)] {} ;}@]
+%
+% $\begin{bNiceMatrix}
% 0 & \Cdots & 0 \\
% 1 & \Cdots & 1 \\
-% 0 & \Cdots & 0
+% 0 & \Cdots & 0 \\
+% ~emphase#\CodeAfter \tikz \node [highlight = (2-1) (2-3)] {} ;@
% \end{bNiceMatrix}$
% \end{Verbatim}
-%
-% \[\begin{bNiceMatrix}[code-after = {\tikz \node [highlight = (2-1) (2-3)] {} ;}]
+% \[\begin{bNiceMatrix}
% 0 & \Cdots & 0 \\
% 1 & \Cdots & 1 \\
-% 0 & \Cdots & 0
+% 0 & \Cdots & 0 \\
+% \CodeAfter \tikz \node [highlight = (2-1) (2-3)] {} ;
% \end{bNiceMatrix}\]
-%
-%
-% \bigskip
-% This code fails with |latex|-|dvips|-|ps2pdf| because Tikz for |dvips|, as for
-% now, doesn't support blend modes. However, the following code, in the
-% preamble, should activate blend modes in this way of compilation.
-%
-%
-% \begin{scope} \small
-% |\ExplSyntaxOn|
-%
-% |\makeatletter|
%
-% |\tl_set:Nn \l_tmpa_tl {pgfsys-dvips.def}|
%
-% |\tl_if_eq:NNT \l_tmpa_tl \pgfsysdriver|
-%
-% | {\cs_set:Npn\pgfsys@blend@mode#1{\special{ps:~/\tl_upper_case:n #1~.setblendmode}}}|
-%
-% |\makeatother|
-%
-% |\ExplSyntaxOff|
-% \end{scope}
%
% \vspace{1cm}
% We recall that, for a rectangle of merged cells (with the command |\Block|), a
@@ -2628,44 +4321,38 @@ version 2005/12/01 or later.
%
% \medskip
% \begin{BVerbatim}[baseline=c,boxwidth=11.6cm]
-% $\begin{pNiceMatrix}%
-% [
-% margin,
-% create-medium-nodes,
-% code-after =
-% { \tikz \node [~emphase#highlight = (1-1-block-medium)@] {} ; }
-% ]
-% \Block{3-3}<\Large>{A} & & & 0 \\
-% & \hspace*{1cm} & & \Vdots \\
-% & & & 0 \\
-% 0 & \Cdots& 0 & 0
+% $\begin{pNiceMatrix}[margin,create-medium-nodes]
+% \Block{3-3}<\Large>{A} & & & 0 \\
+% & \hspace*{1cm} & & \Vdots \\
+% & & & 0 \\
+% 0 & \Cdots& 0 & 0
+% \CodeAfter
+% \tikz \node [~emphase#highlight = (1-1-block-medium)@] {} ;
% \end{pNiceMatrix}$
% \end{BVerbatim}
-% $\begin{pNiceMatrix}[
-% margin,
-% create-medium-nodes,
-% code-after =
-% { \tikz \node [highlight = (1-1-block-medium)] {} ; }
-% ]
+% $\begin{pNiceMatrix}[margin,create-medium-nodes]
% \Block{3-3}<\Large>{A} & & & 0 \\
% & \hspace*{1cm} & & \Vdots \\
% & & & 0 \\
% 0 & \Cdots& 0 & 0
+% \CodeAfter
+% \tikz \node [highlight = (1-1-block-medium)] {} ;
% \end{pNiceMatrix}$
+%
%
% \vspace{1cm}
% Consider now the following matrix which we have named |example|.
%
% \medskip
% \begin{Verbatim}
-% $\begin{pNiceArray}{CCC}[~emphase#name=example@,last-col,create-medium-nodes]
+% $\begin{pNiceArray}{ccc}[~emphase#name=example@,last-col,create-medium-nodes]
% a & a + b & a + b + c & L_1 \\
% a & a & a + b & L_2 \\
% a & a & a & L_3
% \end{pNiceArray}$
% \end{Verbatim}
%
-% \[\begin{pNiceArray}{CCC}[last-col]
+% \[\begin{pNiceArray}{ccc}[last-col]
% a & a + b & a + b + c & L_1 \\
% a & a & a + b & L_2 \\
% a & a & a & L_3
@@ -2706,7 +4393,7 @@ version 2005/12/01 or later.
% \medskip
% We obtain the following matrix.
%
-% \[\begin{pNiceArray}{CCC}[
+% \[\begin{pNiceArray}{ccc}[
% last-col,
% code-after = {\begin{tikzpicture}[every node/.style = {fill = red!15,
% blend mode = multiply,
@@ -2735,7 +4422,7 @@ version 2005/12/01 or later.
% \medskip
% We obtain the following matrix.
%
-% \[\begin{pNiceArray}{CCC}[
+% \[\begin{pNiceArray}{ccc}[
% last-col,
% create-medium-nodes,
% code-after = {\begin{tikzpicture}[highlight/.style = {fill = red!15,
@@ -2759,41 +4446,37 @@ version 2005/12/01 or later.
% In the following example, we use the ``large nodes'' to highlight a zone of
% the matrix.\par\nobreak
% \begin{Verbatim}
-% \begin{pNiceArray}{>{\strut}CCCC}%
-% [create-large-nodes,margin,extra-margin=2pt,
-% code-after = {\tikz \path [~emphase#name suffix = -large@,
-% fill = red!15,
-% blend mode = multiply]
-% (1-1.north west)
-% |- (2-2.north west)
-% |- (3-3.north west)
-% |- (4-4.north west)
-% |- (4-4.south east)
-% |- (1-1.north west) ; } ]
-% A_{11} & A_{12} & A_{13} & A_{14} \\
-% A_{21} & A_{22} & A_{23} & A_{24} \\
-% A_{31} & A_{32} & A_{33} & A_{34} \\
-% A_{41} & A_{42} & A_{43} & A_{44}
+% \begin{pNiceArray}{>{\strut}cccc}[create-large-nodes,margin,extra-margin=2pt]
+% A_{11} & A_{12} & A_{13} & A_{14} \\
+% A_{21} & A_{22} & A_{23} & A_{24} \\
+% A_{31} & A_{32} & A_{33} & A_{34} \\
+% A_{41} & A_{42} & A_{43} & A_{44}
+% \CodeAfter
+% \tikz \path [~emphase#name suffix = -large@,fill = red!15, blend mode = multiply]
+% (1-1.north west)
+% |- (2-2.north west)
+% |- (3-3.north west)
+% |- (4-4.north west)
+% |- (4-4.south east)
+% |- (1-1.north west) ;
% \end{pNiceArray}
% \end{Verbatim}
%
-% \[ \begin{pNiceArray}{>{\strut}CCCC}[
-% create-large-nodes,margin,extra-margin=2pt,
-% code-after = {\tikz \path [name suffix = -large,
-% fill = red!15,
-% blend mode = multiply]
-% (1-1.north west)
-% |- (2-2.north west)
-% |- (3-3.north west)
-% |- (4-4.north west)
-% |- (4-4.south east)
-% |- (1-1.north west) ; } ]
-% A_{11} & A_{12} & A_{13} & A_{14} \\
-% A_{21} & A_{22} & A_{23} & A_{24} \\
-% A_{31} & A_{32} & A_{33} & A_{34} \\
-% A_{41} & A_{42} & A_{43} & A_{44}
-% \end{pNiceArray}\]
%
+% \[\begin{pNiceArray}{>{\strut}cccc}[create-large-nodes,margin,extra-margin=2pt]
+% A_{11} & A_{12} & A_{13} & A_{14} \\
+% A_{21} & A_{22} & A_{23} & A_{24} \\
+% A_{31} & A_{32} & A_{33} & A_{34} \\
+% A_{41} & A_{42} & A_{43} & A_{44}
+% \CodeAfter
+% \tikz \path [name suffix = -large,fill = red!15, blend mode = multiply]
+% (1-1.north west)
+% |- (2-2.north west)
+% |- (3-3.north west)
+% |- (4-4.north west)
+% |- (4-4.south east)
+% |- (1-1.north west) ;
+% \end{pNiceArray}\]
%
% \subsection{Direct use of the Tikz nodes}
%
@@ -2822,7 +4505,7 @@ version 2005/12/01 or later.
% The matrix $B$ has a ``first row'' (for $C_j$) and that's why we use the key
% |first-row|.
% \begin{Verbatim}
-% \begin{bNiceArray}{C>{\strut}CCCC}[name=B,first-row]
+% \begin{bNiceArray}{c>{\strut}cccc}[name=B,first-row]
% & & C_j \\
% b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\
% \Vdots & & \Vdots & & \Vdots \\
@@ -2835,19 +4518,19 @@ version 2005/12/01 or later.
% The matrix $A$ has a ``first column'' (for $L_i$) and that's why we use the
% key |first-col|.
% \begin{Verbatim}
-% \begin{bNiceArray}{CC>{\strut}CCC}[name=A,first-col]
+% \begin{bNiceArray}{cc>{\strut}ccc}[name=A,first-col]
% & a_{11} & \Cdots & & & a_{1n} \\
% & \Vdots & & & & \Vdots \\
% L_i & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} \\
% & \Vdots & & & & \Vdots \\
-% & a_{n1} & \Cdots & & & a_{nn} \\
+% & a_{n1} & \Cdots & & & a_{nn}
% \end{bNiceArray}
% &
% \end{Verbatim}
%
% In the matrix product, the two dotted lines have an open extremity.
% \begin{Verbatim}
-% \begin{bNiceArray}{CC>{\strut}CCC}
+% \begin{bNiceArray}{cc>{\strut}ccc}
% & & & & \\
% & & \Vdots \\
% \Cdots & & c_{ij} \\
@@ -2872,7 +4555,7 @@ version 2005/12/01 or later.
% \NiceMatrixOptions{nullify-dots}
% $\begin{array}{cc}
% &
-% \begin{bNiceArray}{C>{\strut}CCCC}[name=B,first-row]
+% \begin{bNiceArray}{c>{\strut}cccc}[name=B,first-row]
% & & C_j \\
% b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\
% \Vdots & & \Vdots & & \Vdots \\
@@ -2880,7 +4563,7 @@ version 2005/12/01 or later.
% & & \Vdots \\
% b_{n1} & \Cdots & b_{nj} & \Cdots & b_{nn}
% \end{bNiceArray} \\ \\
-% \begin{bNiceArray}{CC>{\strut}CCC}[name=A,first-col]
+% \begin{bNiceArray}{cc>{\strut}ccc}[name=A,first-col]
% & a_{11} & \Cdots & & & a_{1n} \\
% & \Vdots & & & & \Vdots \\
% L_i & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} \\
@@ -2888,7 +4571,7 @@ version 2005/12/01 or later.
% & a_{n1} & \Cdots & & & a_{nn} \\
% \end{bNiceArray}
% &
-% \begin{bNiceArray}{CC>{\strut}CCC}
+% \begin{bNiceArray}{cc>{\strut}ccc}
% & & & & \\
% & & \Vdots \\
% \Cdots & & c_{ij} \\
@@ -2907,7 +4590,7 @@ version 2005/12/01 or later.
%
%
%
-% \section{Implementation}
+%\section{Implementation}
%
% By default, the package \pkg{nicematrix} doesn't patch any existing code.
%
@@ -2930,10 +4613,10 @@ version 2005/12/01 or later.
%
%
% \bigskip
-% \subsection*{Declaration of the package and extensions loaded}
+% \subsection*{Declaration of the package and packages loaded}
%
%
-% The prefix |nicematrix| has been registred for this extension.
+% The prefix |nicematrix| has been registred for this package.
%
% See: |http://mirrors.ctan.org/macros/latex/contrib/l3kernel/l3prefixes.pdf|
%
@@ -2945,7 +4628,6 @@ version 2005/12/01 or later.
% \begin{macrocode}
\RequirePackage{pgfcore}
\usepgfmodule{shapes}
-\RequirePackage{expl3}[2020/02/08]
% \end{macrocode}
%
%
@@ -2956,40 +4638,11 @@ version 2005/12/01 or later.
{nicematrix}
{\myfiledate}
{\myfileversion}
- {Mathematical matrices with PGF/TikZ}
+ {Enhanced arrays with the help of PGF/TikZ}
% \end{macrocode}
%
%
-% \medskip
-% The version of 2020/02/08 of \pkg{expl3} has replaced |\l_keys_key_tl| by
-% |\l_keys_key_str|. We have immediately changed in this file. Now, you test the
-% existence of |\l_keys_key_str| in order to detect whether the version of LaTeX
-% used by the final user is up to date.
-% \begin{macrocode}
-\msg_new:nnn { nicematrix } { expl3~too~old }
- {
- Your~version~of~LaTeX~(especially~expl3)~is~too~old.~
- You~can~go~on~but~you~will~probably~have~other~errors~
- if~you~use~the~functionalities~of~nicematrix.
- }
-\cs_if_exist:NF \l_keys_key_str
- { \msg_error:nn { nicematrix } { expl3~too~old } }
-% \end{macrocode}
-%
-%
% \bigskip
-% We test the class option |draft|. In this case, we raise the flag
-% |\c_@@_draft_bool| because we won't draw the dotted lines if the option
-% |draft| is used.
-% \begin{macrocode}
-\bool_new:N \c_@@_draft_bool
-\DeclareOption { draft } { \bool_set_true:N \c_@@_draft_bool }
-\DeclareOption* { }
-\ProcessOptions \relax
-% \end{macrocode}
-%
-%
-%
% The command for the treatment of the options of |\usepackage| is at the end of
% this package for technical reasons.
%
@@ -2998,7 +4651,6 @@ version 2005/12/01 or later.
% \begin{macrocode}
\RequirePackage { array }
\RequirePackage { amsmath }
-\RequirePackage { xparse } [ 2018-07-01 ]
% \end{macrocode}
%
% \bigskip
@@ -3021,21 +4673,42 @@ version 2005/12/01 or later.
% \bigskip
% \subsection*{Technical definitions}
%
+%
+% \medskip
+% \begin{macrocode}
+\bool_new:N \c_@@_in_preamble_bool
+\bool_set_true:N \c_@@_in_preamble_bool
+\AtBeginDocument { \bool_set_false:N \c_@@_in_preamble_bool }
+% \end{macrocode}
+%
% \begin{macrocode}
+\bool_new:N \c_@@_arydshln_loaded_bool
+\bool_new:N \c_@@_booktabs_loaded_bool
+\bool_new:N \c_@@_enumitem_loaded_bool
\bool_new:N \c_@@_tikz_loaded_bool
\AtBeginDocument
{
+ \@ifpackageloaded { arydshln }
+ { \bool_set_true:N \c_@@_arydshln_loaded_bool }
+ { }
+ \@ifpackageloaded { booktabs }
+ { \bool_set_true:N \c_@@_booktabs_loaded_bool }
+ { }
+ \@ifpackageloaded { enumitem }
+ { \bool_set_true:N \c_@@_enumitem_loaded_bool }
+ { }
\@ifpackageloaded { tikz }
{
% \end{macrocode}
% In some constructions, we will have to use a |{pgfpicture}| which \emph{must}
% be replaced by a |{tikzpicture}| if Tikz is loaded. However, this switch
-% between |{pgfpicture}| |{tikzpicture}| can't be done dynamically with a
-% conditional because, when the |external| Tikz library, the pair
-% |\tikzpicture|-|\endtikpicture| (or |\begin{tikzpicture}-\end{tikzpicture}|
-% must be statically ``visible'' (even when extenalization is not activated).
+% between |{pgfpicture}| and |{tikzpicture}| can't be done dynamically with a
+% conditional because, when the Tikz library |external| is loaded by the user,
+% the pair |\tikzpicture|-|\endtikpicture| (or
+% |\begin{tikzpicture}-\end{tikzpicture}|) must be statically ``visible'' (even
+% when externalization is not activated).
%
-% That's why we create these token lists |\c_@@_pgfortikzpicture_tl| and
+% That's why we create |\c_@@_pgfortikzpicture_tl| and
% |\c_@@_endpgfortikzpicture_tl| which will be used to construct in a
% |\AtBeginDocument| the correct version of some commands.
% \begin{macrocode}
@@ -3050,9 +4723,11 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
-% We test whether the current class is \cls{revtex4-1} or \cls{revtex4-2}
-% because these classes redefines |\array| (of \pkg{array}) in a way
-% incompatible with our programmation.
+% We test whether the current class is \cls{revtex4-1} (deprecated) or
+% \cls{revtex4-2} because these classes redefines |\array| (of \pkg{array}) in a
+% way incompatible with our programmation. As of january 2021, the current
+% version \cls{revtex4-2} is 4.2e (compatible with \pkg{booktabs}).
+%
% \begin{macrocode}
\bool_new:N \c_@@_revtex_bool
\@ifclassloaded { revtex4-1 }
@@ -3062,25 +4737,22 @@ version 2005/12/01 or later.
{ \bool_set_true:N \c_@@_revtex_bool }
{ }
% \end{macrocode}
-%
-%
-% The following message must be defined right now because it may be used during
-% the loading of the package.
+% Maybe one of the previous classes will be loaded inside another class... We
+% try to detect that situation.
% \begin{macrocode}
-\@@_msg_new:nn { Draft~mode }
- { The~compilation~is~in~draft~mode:~the~dotted~lines~won't~be~drawn. }
+\cs_if_exist:NT \rvtx@ifformat@geq { \bool_set_true:N \c_@@_revtex_bool }
% \end{macrocode}
%
+%
% \begin{macrocode}
-\bool_if:NT \c_@@_draft_bool { \msg_warning:nn { nicematrix } { Draft~mode } }
+\cs_generate_variant:Nn \tl_if_single_token_p:n { V }
% \end{macrocode}
%
-%
% \bigskip
% We define a command |\iddots| similar to |\ddots| ($\ddots$) but with dots
-% going forward ($\iddots$). We use |\ProvideDocumentCommand| of \pkg{xparse},
-% and so, if the command |\iddots| has already been defined (for example by the
-% package \pkg{mathdots}), we don't define it again.
+% going forward ($\iddots$). We use |\ProvideDocumentCommand| and so, if the
+% command |\iddots| has already been defined (for example by the package
+% \pkg{mathdots}), we don't define it again.
%
% \begin{macrocode}
\ProvideDocumentCommand \iddots { }
@@ -3102,6 +4774,360 @@ version 2005/12/01 or later.
% This definition is a variant of the standard definition of |\ddots|.
%
%
+% \bigskip
+% In the |aux| file, we will have the references of the PGF/Tikz nodes created
+% by \pkg{nicematrix}. However, when \pkg{booktabs} is used, some nodes (more
+% precisely, some |row| nodes) will be defined twice because their position will
+% be modified. In order to avoid an error message in this case, we will redefine
+% |\pgfutil@check@rerun| in the |aux| file.
+% \begin{macrocode}
+\AtBeginDocument
+ {
+ \@ifpackageloaded { booktabs }
+ { \iow_now:Nn \@mainaux \nicematrix@redefine@check@rerun }
+ { }
+ }
+\cs_set_protected:Npn \nicematrix@redefine@check@rerun
+ {
+ \cs_set_eq:NN \@@_old_pgfutil@check@rerun \pgfutil@check@rerun
+% \end{macrocode}
+% The new version of |\pgfutil@check@rerun| will not check the PGF nodes whose
+% names start with |nm-| (which is the prefix for the nodes creates by
+% \pkg{nicematrix}).
+% \begin{macrocode}
+ \cs_set_protected:Npn \pgfutil@check@rerun ##1 ##2
+ {
+ \str_if_eq:eeF { nm- } { \tl_range:nnn { ##1 } 1 3 }
+ { \@@_old_pgfutil@check@rerun { ##1 } { ##2 } }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We have to know whether \pkg{colortbl} is loaded in particular for the
+% redefinition of |\everycr|.
+% \begin{macrocode}
+\bool_new:N \c_@@_colortbl_loaded_bool
+\AtBeginDocument
+ {
+ \@ifpackageloaded { colortbl }
+ { \bool_set_true:N \c_@@_colortbl_loaded_bool }
+ {
+% \end{macrocode}
+% The command |\CT@arc@| is a command of \pkg{colortbl} which sets the color of
+% the rules in the array. We will use it to store the instruction of color for
+% the rules even if \pkg{colortbl} is not loaded. Idem for
+% \begin{macrocode}
+ \cs_set_protected:Npn \CT@arc@ { }
+ \cs_set:Npn \arrayrulecolor #1 # { \CT@arc { #1 } }
+ \cs_set:Npn \CT@arc #1 #2
+ {
+ \dim_compare:nNnT \baselineskip = \c_zero_dim \noalign
+ { \cs_gset:Npn \CT@arc@ { \color #1 { #2 } } }
+ }
+% \end{macrocode}
+% Idem for |\CT@drs@|.
+% \begin{macrocode}
+ \cs_set_protected:Npn \CT@drsc@ { }
+ \cs_set:Npn \doublerulesepcolor #1 # { \CT@drs { #1 } }
+ \cs_set:Npn\CT@drs #1 #2
+ {
+ \dim_compare:nNnT \baselineskip = \c_zero_dim \noalign
+ { \cs_gset:Npn \CT@drsc@ { \color #1 { #2 } } }
+ }
+ \cs_set:Npn \hline
+ {
+ \noalign { \ifnum 0 = `} \fi
+ \cs_set_eq:NN \hskip \vskip
+ \cs_set_eq:NN \vrule \hrule
+ \cs_set_eq:NN \@width \@height
+ { \CT@arc@ \vline }
+ \futurelet \reserved@a
+ \@xhline
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We have to redefine |\cline| for several reasons. The command |\@@_cline| will
+% be linked to |\cline| in the beginning of |{NiceArrayWithDelims}|. The
+% following commands must \emph{not} be protected.
+% \begin{macrocode}
+\cs_set:Npn \@@_standard_cline #1 { \@@_standard_cline:w #1 \q_stop }
+\cs_set:Npn \@@_standard_cline:w #1-#2 \q_stop
+ {
+ \int_compare:nNnT \l_@@_first_col_int = 0 { \omit & }
+ \int_compare:nNnT { #1 } > 1 { \multispan { \@@_pred:n { #1 } } & }
+ \multispan { \int_eval:n { #2 - #1 + 1 } }
+ {
+ \CT@arc@
+ \leaders \hrule \@height \arrayrulewidth \hfill
+% \end{macrocode}
+% The following |\skip_horizontal:N \c_zero_dim| is to prevent a potential
+% |\unskip| to delete the |\leaders|\footnote{See question 99041 on TeX
+% StackExchange.}
+% \begin{macrocode}
+ \skip_horizontal:N \c_zero_dim
+ }
+% \end{macrocode}
+% Our |\everycr| has been modified. In particular, the creation of the |row|
+% node is in the |\everycr| (maybe we should put it with the incrementation of
+% |\c@iRow|). Since the following |\cr| correspond to a ``false row'', we have
+% to nullify |\everycr|.
+% \begin{macrocode}
+ \everycr { }
+ \cr
+ \noalign { \skip_vertical:N -\arrayrulewidth }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following version of |\cline| spreads the array of a quantity equal
+% to |\arrayrulewidth| as does |\hline|. It will be loaded excepted if the key
+% |standard-cline| has been used.
+% \begin{macrocode}
+\cs_set:Npn \@@_cline
+% \end{macrocode}
+% We have to act in a fully expandable way since there may be |\noalign| (in the
+% |\multispan|) to detect. That's why we use |\@@_cline_i:en|.
+% \begin{macrocode}
+ { \@@_cline_i:en \l_@@_first_col_int }
+% \end{macrocode}
+% The command |\cline_i:nn| has two arguments. The first is the number of the
+% current column (it \emph{must} be used in that column). The second is a
+% standard argument of |\cline| of the form \textsl{i}-\textsl{j}.
+% \begin{macrocode}
+\cs_set:Npn \@@_cline_i:nn #1 #2 { \@@_cline_i:w #1-#2 \q_stop }
+\cs_set:Npn \@@_cline_i:w #1-#2-#3 \q_stop
+ {
+% \end{macrocode}
+% Now, |#1| is the number of the current column and we have to draw a line from
+% the column |#2| to the column |#3| (both included).
+% \begin{macrocode}
+ \int_compare:nNnT { #1 } < { #2 }
+ { \multispan { \int_eval:n { #2 - #1 } } & }
+ \multispan { \int_eval:n { #3 - #2 + 1 } }
+ {
+ \CT@arc@
+ \leaders \hrule \@height \arrayrulewidth \hfill
+ \skip_horizontal:N \c_zero_dim
+ }
+% \end{macrocode}
+% You look whether there is another |\cline| to draw (the final user may put
+% several |\cline|).
+% \begin{macrocode}
+ \peek_meaning_remove_ignore_spaces:NTF \cline
+ { & \@@_cline_i:en { \@@_succ:n { #3 } } }
+ { \everycr { } \cr }
+ }
+\cs_generate_variant:Nn \@@_cline_i:nn { e n }
+% \end{macrocode}
+%
+% \bigskip
+% The following commands are only for efficiency. They must \emph{not} be protected
+% because it will be used (for instance) in names of \textsc{pgf} nodes.
+% \begin{macrocode}
+\cs_new:Npn \@@_succ:n #1 { \the \numexpr #1 + 1 \relax }
+\cs_new:Npn \@@_pred:n #1 { \the \numexpr #1 - 1 \relax }
+% \end{macrocode}
+%
+% \bigskip
+% The following command is a small shortcut.
+% \begin{macrocode}
+\cs_new:Npn \@@_math_toggle_token:
+ { \bool_if:NF \l_@@_NiceTabular_bool \c_math_toggle_token }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_CT@arc@:
+ { \peek_meaning:NTF [ \@@_set_CT@arc@_i: \@@_set_CT@arc@_ii: }
+\cs_new_protected:Npn \@@_set_CT@arc@_i: [ #1 ] #2 \q_stop
+ { \cs_set:Npn \CT@arc@ { \color [ #1 ] { #2 } } }
+\cs_new_protected:Npn \@@_set_CT@arc@_ii: #1 \q_stop
+ { \cs_set:Npn \CT@arc@ { \color { #1 } } }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% \textbf{The column S of siunitx}\par\nobreak
+%
+% \medskip
+% We want to know whether the package \pkg{siunitx} is loaded and, if it is
+% loaded, we redefine the |S| columns of \pkg{siunitx}.
+% \begin{macrocode}
+\bool_new:N \c_@@_siunitx_loaded_bool
+\AtBeginDocument
+ {
+ \@ifpackageloaded { siunitx }
+ { \bool_set_true:N \c_@@_siunitx_loaded_bool }
+ { }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The command |\NC@rewrite@S| is a LaTeX command created by \pkg{siunitx} in
+% connection with the |S| column. In the code of \pkg{siunitx}, this command is
+% defined by:
+% \begin{Verbatim}[commandchars=\~\!\+, formatcom = \small]
+% \renewcommand*{\NC@rewrite@S}[1][]
+% {
+% \@temptokena \exp_after:wN
+% {
+% \tex_the:D \@temptokena
+% > { \__siunitx_table_collect_begin: S {#1} }
+% c
+% < { \__siunitx_table_print: }
+% }
+% \NC@find
+% }
+% \end{Verbatim}
+% We want to patch this command (in the environments of \pkg{nicematrix}) in
+% order to have:
+% \begin{Verbatim}[commandchars=\~\!\+, formatcom = \small]
+% \renewcommand*{\NC@rewrite@S}[1][]
+% {
+% \@temptokena \exp_after:wN
+% {
+% \tex_the:D \@temptokena
+% > { ~emphase!\@@_Cell:+ \__siunitx_table_collect_begin: S {#1} }
+% ~emphase!\@@_true_c:+
+% < { \__siunitx_table_print: ~emphase!\@@_end_Cell:+ }
+% }
+% \NC@find
+% }
+% \end{Verbatim}
+% However, we don't want do use explicitly any private command of \pkg{siunitx}.
+% That's why we will extract the name of the two |\__siunitx...| commands by
+% their position in the code of |\NC@rewrite@S|.
+%
+% Since the command |\NC@rewrite@S| appends some tokens to the \emph{toks} list
+% |\@temptokena|, we use the LaTeX command |\NC@rewrite@S| in a group
+% (|\group_begin:|--|\group_end:|) and we extract the two command names which
+% are in the toks |\@temptokena|. However, this extraction can be done only
+% when \pkg{siunitx} is loaded (and it may be loaded after \pkg{nicematrix})
+% and, in fact, after the beginning of the document --- because some
+% instructions of \pkg{siunitx} are executed in a |\AtBeginDocument|). That's
+% why this extraction will be done only at the first use of an
+% environment of \pkg{nicematrix} with the command |\@@_adapt_S_column:|.
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_adapt_S_column:
+ {
+ \bool_if:NT \c_@@_siunitx_loaded_bool
+ {
+ \group_begin:
+ \@temptokena = { }
+% \end{macrocode}
+% We protect |\NC@find| which is at the end of |\NC@rewrite@S|.
+% \begin{macrocode}
+ \cs_set_eq:NN \NC@find \prg_do_nothing:
+ \NC@rewrite@S { }
+% \end{macrocode}
+% Conversion of the \emph{toks} |\@temptokena| in a token list of \pkg{expl3}
+% (the toks are not supported by \pkg{expl3} but we can, nevertheless, use the
+% option |V| for |\tl_gset:NV|).
+% \begin{macrocode}
+ \tl_gset:NV \g_tmpa_tl \@temptokena
+ \group_end:
+ \tl_new:N \c_@@_table_collect_begin_tl
+ \tl_set:Nx \l_tmpa_tl { \tl_item:Nn \g_tmpa_tl 2 }
+ \tl_gset:Nx \c_@@_table_collect_begin_tl { \tl_item:Nn \l_tmpa_tl 1 }
+ \tl_new:N \c_@@_table_print_tl
+ \tl_gset:Nx \c_@@_table_print_tl { \tl_item:Nn \g_tmpa_tl { -1 } }
+% \end{macrocode}
+% The token lists |\c_@@_table_collect_begin_tl| and |\c_@@_table_print_tl|
+% contain now the two commands of \pkg{siunitx}.
+%
+% \smallskip
+% If the adaptation has been done, the command |\@@_adapt_S_column:| becomes
+% no-op (globally).
+% \begin{macrocode}
+ \cs_gset_eq:NN \@@_adapt_S_column: \prg_do_nothing:
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_renew_NC@rewrite@S:| will be used in each environment of
+% \pkg{nicematrix} in order to ``rewrite'' the |S| column in each environment.
+% \begin{macrocode}
+\AtBeginDocument
+ {
+ \bool_if:nTF { ! \c_@@_siunitx_loaded_bool }
+ { \cs_set_eq:NN \@@_renew_NC@rewrite@S: \prg_do_nothing: }
+ {
+ \cs_new_protected:Npn \@@_renew_NC@rewrite@S:
+ {
+ \renewcommand*{\NC@rewrite@S}[1][]
+ {
+ \@temptokena \exp_after:wN
+ {
+ \tex_the:D \@temptokena
+ > { \@@_Cell: \c_@@_table_collect_begin_tl S {##1} }
+% \end{macrocode}
+% |\@@_true_c:| will be replaced statically by |c| at the end of the construction
+% of the preamble.
+% \begin{macrocode}
+ \@@_true_c:
+ < { \c_@@_table_print_tl \@@_end_Cell: }
+ }
+ \NC@find
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following regex will be used to modify the preamble of the array when the
+% key |colortbl-like| is used.
+% \begin{macrocode}
+\regex_const:Nn \c_@@_columncolor_regex { \c { columncolor } }
+% \end{macrocode}
+%
+% \bigskip
+% If the final user uses \pkg{nicematrix}, PGF/Tikz will write instruction
+% |\pgfsyspdfmark| in the |aux| file. If he changes its mind and no longer loads
+% \pkg{nicematrix}, an error may occur at the next compilation because of
+% remanent instructions |\pgfsyspdfmark| in the |aux| file. With the following
+% code, we avoid that situation.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_provide_pgfsyspdfmark:
+ {
+ \iow_now:Nn \@mainaux
+ {
+ \ExplSyntaxOn
+ \cs_if_free:NT \pgfsyspdfmark
+ { \cs_set_eq:NN \pgfsyspdfmark \@gobblethree }
+ \ExplSyntaxOff
+ }
+ \cs_gset_eq:NN \@@_provide_pgfsyspdfmark: \prg_do_nothing:
+ }
+% \end{macrocode}
+%
+% \subsection*{Parameters}
+%
+% \bigskip
+% For compatibility with versions prior to 5.0, we provide a load-time option
+% |define_L_C_R|. With this option, it's possible the letters |L|, |C| and |R|
+% instead of |l|, |c| and |r| in the preamble of the environments of
+% \pkg{nicematrix} as it was mandatory before version~5.0.
+% \begin{macrocode}
+\bool_new:N \c_@@_define_L_C_R_bool
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_define_L_C_R:
+ {
+ \newcolumntype L l
+ \newcolumntype C c
+ \newcolumntype R r
+ }
+% \end{macrocode}
+%
% \bigskip
% The following counter will count the environments |{NiceArray}|. The value of
% this counter will be used to prefix the names of the Tikz nodes created in the
@@ -3109,15 +5135,37 @@ version 2005/12/01 or later.
% \begin{macrocode}
\int_new:N \g_@@_env_int
% \end{macrocode}
-%
+%
+% \bigskip
+% The following command is only a syntaxic shortcut. It must \emph{not} be
+% protected (it will be used in names of \textsc{pgf} nodes).
% \begin{macrocode}
\cs_new:Npn \@@_env: { nm - \int_use:N \g_@@_env_int }
-\cs_new_protected:Npn \@@_qpoint: #1
+% \end{macrocode}
+%
+% \bigskip
+% The command |\NiceMatrixLastEnv| is not used by the package \pkg{nicematrix}.
+% It's only a facility given to the final user. It gives the number of the last
+% environment (in fact the number of the current environment but it's meant to
+% be used after the environment in order to refer to that environment --- and
+% its nodes --- without having to give it a name). This command \emph{must} be
+% expandable since it will be used in \pkg{pgf} nodes.
+% \begin{macrocode}
+\NewExpandableDocumentCommand \NiceMatrixLastEnv { }
+ { \int_use:N \g_@@_env_int }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following command is only a syntaxic shortcut. The |q| in |qpoint| means
+% \emph{quick}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_qpoint:n #1
{ \pgfpointanchor { \@@_env: - #1 } { center } }
% \end{macrocode}
%
% \bigskip
-% We also define a counter to count the environments |{NiceMatrixBlock}|.
+% The following counter will count the environments |{NiceMatrixBlock}|.
% \begin{macrocode}
\int_new:N \g_@@_NiceMatrixBlock_int
% \end{macrocode}
@@ -3132,6 +5180,31 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \bigskip
+% The following token list will contain the type of the current cell (|l|, |c|
+% or |r|). It will be used by the blocks.
+% \begin{macrocode}
+\tl_new:N \l_@@_cell_type_tl
+\tl_set:Nn \l_@@_cell_type_tl { c }
+% \end{macrocode}
+%
+% \bigskip
+% When there is a mono-column block (created by the command |\Block|), we want
+% to take into account the width of that block for the width of the column.
+% That's why we compute the width of that block in the |\g_@@_blocks_wd_dim|
+% and, after the construction of the box |\l_@@_cell_box|, we change the width
+% of that box to take into account the length |\g_@@_blocks_wd_dim|.
+% \begin{macrocode}
+\dim_new:N \g_@@_blocks_wd_dim
+% \end{macrocode}
+%
+% \bigskip
+% Idem pour the blocks mono-row.
+% \begin{macrocode}
+\dim_new:N \g_@@_blocks_ht_dim
+\dim_new:N \g_@@_blocks_dp_dim
+% \end{macrocode}
+%
+% \bigskip
% The sequence |\g_@@_names_seq| will be the list of all the names of
% environments used (via the option |name|) in the document: two environments
% must not have the same name. However, it's possible to use the option
@@ -3140,108 +5213,87 @@ version 2005/12/01 or later.
\seq_new:N \g_@@_names_seq
% \end{macrocode}
%
-
% \bigskip
% We want to know if we are in an environment of \pkg{nicematrix} because we
% will raise an error if the user tries to use nested environments.
% \begin{macrocode}
\bool_new:N \l_@@_in_env_bool
% \end{macrocode}
-%
%
% \bigskip
-% If the user uses |{NiceArray}| (and not another environment relying upon
-% |{NiceArrayWithDelims}| like |{pNiceArray}|), we will raise the flag
-% |\l_@@_NiceArray_bool|. We have to know that, because, in |{NiceArray}|, we
-% won't use a structure with |\left| and |\right| and we will use the option of
-% position (|t|, |b| or |c|).
+% If the user uses |{NiceArray}| or |{NiceTabular}| the flag
+% |\l_@@_NiceArray_bool| will be raised.
% \begin{macrocode}
\bool_new:N \l_@@_NiceArray_bool
% \end{macrocode}
%
-%
% \bigskip
+% If the user uses |{NiceTabular}| or |{NiceTabular*}|, we will raise the
+% following flag.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_test_if_math_mode:
- {
- \if_mode_math: \else:
- \@@_fatal:n { Outside~math~mode }
- \fi:
- }
+\bool_new:N \l_@@_NiceTabular_bool
% \end{macrocode}
%
-%
-%
% \bigskip
-% We have to know whether \pkg{colortbl} is loaded for the redefinition of
-% |\everycr| and |\vline| and for the options |hlines| and |vlines|.
+% If the user uses |{NiceTabular*}|, the width of the tabular (in the first
+% argument of the environment |{NiceTabular*}|) will be stored in the following
+% dimension.
% \begin{macrocode}
-\bool_new:N \c_@@_colortbl_loaded_bool
-\AtBeginDocument
- {
- \@ifpackageloaded { colortbl }
- {
- \bool_set_true:N \c_@@_colortbl_loaded_bool
- \cs_set_protected:Npn \@@_vline_i: { { \CT@arc@ \vline } }
- }
- { }
- }
+\dim_new:N \l_@@_tabular_width_dim
% \end{macrocode}
-%
+%
+% \bigskip
+% If the user uses an environment without preamble, we will raise the following
+% flag.
% \begin{macrocode}
-\colorlet { nicematrix-last-col } { . }
-\colorlet { nicematrix-last-row } { . }
+\bool_new:N \l_@@_Matrix_bool
% \end{macrocode}
%
% \bigskip
-% The length |\l_@@_inter_dots_dim| is the distance between two dots for the
-% dotted lines. The default value is 0.45~em but it will be changed if the
-% option |small| is used.
+% The following boolean will be raised when the command |\rotate| is used.
% \begin{macrocode}
-\dim_new:N \l_@@_inter_dots_dim
-\dim_set:Nn \l_@@_inter_dots_dim { 0.45 em }
+\bool_new:N \g_@@_rotate_bool
% \end{macrocode}
%
% \bigskip
-% The length |\l_@@_xdots_shorten_dim| is the minimal distance between a
-% node (in fact an anchor of that node) and a dotted line (we say ``minimal''
-% because, by definition, a dotted line is not a continuous line and, therefore,
-% this distance may vary a little).
% \begin{macrocode}
-\dim_new:N \l_@@_xdots_shorten_dim
-\dim_set:Nn \l_@@_xdots_shorten_dim { 0.3 em }
+\cs_new_protected:Npn \@@_test_if_math_mode:
+ {
+ \if_mode_math: \else:
+ \@@_fatal:n { Outside~math~mode }
+ \fi:
+ }
% \end{macrocode}
+%
%
% \bigskip
-% The length |\l_@@_radius_dim| is the radius of the dots for the dotted lines
-% (for |\hdottedline| and |\dottedline| and for all the other dotted lines when
-% |line-style| is equal to |standard|, which is the initial value). The initial
-% value is 0.53~pt but it will be changed if the option |small| is used (to
-% 0.37~pt).
+% The following colors will be used to memorize le color of the potential ``first
+% col'' and the potential ``first row''.
% \begin{macrocode}
-\dim_new:N \l_@@_radius_dim
-\dim_set:Nn \l_@@_radius_dim { 0.53 pt }
+\colorlet { nicematrix-last-col } { . }
+\colorlet { nicematrix-last-row } { . }
% \end{macrocode}
-%
% \bigskip
-% The name of the current environment or the current command (despite the name
-% which contains \textsl{env}).
+% The following string is the name of the current environment or the current
+% command of \pkg{nicematrix} (despite its name which contains \textsl{env}).
% \begin{macrocode}
\str_new:N \g_@@_name_env_str
% \end{macrocode}
%
-% The string |\g_@@_com_or_env_str| will contain the word \emph{command} or
-% \emph{environment} whether we are in a command of \pkg{nicematrix} or a an
+% \bigskip
+% The following string will contain the word \emph{command} or
+% \emph{environment} whether we are in a command of \pkg{nicematrix} or in an
% environment of \pkg{nicematrix}. The default value is \emph{environment}.
-% \begin{macrocode}
-\str_new:N \g_@@_com_or_env_str
-\str_set:Nn \g_@@_com_or_env_str { environment }
+% \begin{macrocode}
+\tl_set:Nn \g_@@_com_or_env_str { environment }
% \end{macrocode}
%
-% The following control sequence will be able to reconstruct the full name of
-% the current command or environment (despite the name which contains
-% \textsl{env}). This command must \emph{not} be protected since it's used in
-% error messages.
+% \bigskip
+% The following command will be able to reconstruct the full name of the current
+% command or environment (despite its name which contains \textsl{env}). This
+% command must \emph{not} be protected since it will be used in error messages
+% and we have to use |\str_if_eq:VnTF| and not |\tl_if_eq:NnTF| because we need
+% to be fully expandable).
% \begin{macrocode}
\cs_new:Npn \@@_full_name_env:
{
@@ -3252,35 +5304,87 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \bigskip
+% The following token list corresponds to the option |code-after| (it's also
+% possible to set the value of that parameter with the keyword |\CodeAfter|).
+% \begin{macrocode}
+\tl_new:N \g_nicematrix_code_after_tl
+% \end{macrocode}
+%
+% \bigskip
+% The following token list has a function similar to
+% |\g_nicematrix_code_after_tl| but it is used internally by \pkg{nicematrix}.
+% In fact, we have to distinguish between |\g_nicematrix_code_after_tl| and
+% |\g_@@_internal_code_after_tl| because we must take care of the order in which
+% instructions stored in that paremeters are executed.
% \begin{macrocode}
\tl_new:N \g_@@_internal_code_after_tl
-\tl_new:N \g_@@_code_after_tl
% \end{macrocode}
%
-%
% \bigskip
-% The counters |\l_@@_save_iRow_int| and |\l_@@_save_jCol_int| will be used to
-% save the values of the eventual LaTeX counters |iRow| and |jCol|. These LaTeX
+% The counters |\l_@@_old_iRow_int| and |\l_@@_old_jCol_int| will be used to
+% save the values of the potential LaTeX counters |iRow| and |jCol|. These LaTeX
% counters will be restored at the end of the environment.
% \begin{macrocode}
-\int_new:N \l_@@_save_iRow_int
-\int_new:N \l_@@_save_jCol_int
+\int_new:N \l_@@_old_iRow_int
+\int_new:N \l_@@_old_jCol_int
% \end{macrocode}
%
% The TeX counters |\c@iRow| and |\c@jCol| will be created in the beginning of
% |{NiceArrayWithDelims}| (if they don't exist previously).
+%
+% \bigskip
+% The following token list corresponds to the key |rules/color| available
+% in the environments.
+% \begin{macrocode}
+\tl_new:N \l_@@_rules_color_tl
+% \end{macrocode}
+%
+%
+% \bigskip
+% This boolean will be used only to detect in an expandable way whether we are
+% at the beginning of the (potential) column zero, in order to raise an error if
+% |\Hdotsfor| is used in that column.
+% \begin{macrocode}
+\bool_new:N \g_@@_after_col_zero_bool
+% \end{macrocode}
%
+% \bigskip
+% A kind of false row will be inserted at the end of the array for the
+% construction of the |col| nodes (and also to fix the width of the columns when
+% |columns-width| is used). When this special row will be created, we will raise
+% the flag |\g_@@_row_of_col_done_bool| in order to avoid some actions set in
+% the redefinition of |\everycr| when the last |\cr| of the |\halign| will occur
+% (after that row of |col| nodes).
% \begin{macrocode}
\bool_new:N \g_@@_row_of_col_done_bool
% \end{macrocode}
%
+% \bigskip
+% It's possible to use the command |\NotEmpty| to specify explicitely that a
+% cell must be considered as non empty by \pkg{nicematrix} (the Tikz nodes are
+% constructed only in the non empty cells).
% \begin{macrocode}
-\tl_new:N \l_@@_initial_suffix_tl
-\tl_new:N \l_@@_initial_anchor_tl
-\tl_new:N \l_@@_final_suffix_tl
-\tl_new:N \l_@@_final_anchor_tl
+\bool_new:N \g_@@_not_empty_cell_bool
% \end{macrocode}
%
+% \bigskip
+% |\l_@@_code_before_tl| may contain two types of informations:
+% \begin{itemize}
+% \item A |code-before| written in the |aux| file by a previous run. When the
+% |aux| file is read, this |code-before| is stored in
+% |\g_@@_code_before_|\textsl{i}|_tl| (where \textsl{i} is the number of the
+% environment) and, at the beginning of the environment, it will be put in
+% |\l_@@_code_before_tl|.
+% \item The final user can explicitely add material in |\l_@@_code_before_tl| by
+% using the key |code-before|.
+% \end{itemize}
+% \begin{macrocode}
+\tl_new:N \l_@@_code_before_tl
+\bool_new:N \l_@@_code_before_bool
+% \end{macrocode}
+%
+% \bigskip
+% The following dimensions will be used when drawing the dotted lines.
% \begin{macrocode}
\dim_new:N \l_@@_x_initial_dim
\dim_new:N \l_@@_y_initial_dim
@@ -3288,24 +5392,144 @@ version 2005/12/01 or later.
\dim_new:N \l_@@_y_final_dim
% \end{macrocode}
%
+% \bigskip
+% \pkg{expl3} provides scratch dimensions |\l_tmpa_dim| and |\l_tmpb_dim|. We
+% creates two other in the same spirit (if they don't exist yet: that's why we
+% use |\dim_zero_new:N|).
% \begin{macrocode}
-\dim_new:N \l_tmpc_dim
-\dim_new:N \l_tmpd_dim
+\dim_zero_new:N \l_tmpc_dim
+\dim_zero_new:N \l_tmpd_dim
% \end{macrocode}
%
+% \bigskip
+% Some cells will be declared as ``empty'' (for example a cell with an
+% instruction |\Cdots|).
% \begin{macrocode}
\bool_new:N \g_@@_empty_cell_bool
% \end{macrocode}
%
+% \bigskip
+% The following dimension will be used to save the current value of
+% |\arraycolsep|.
+% \begin{macrocode}
+\dim_new:N \@@_old_arraycolsep_dim
+% \end{macrocode}
+%
+% \bigskip
+% The following dimensions will be used internally to compute the width of the
+% potential ``first column'' and ``last column''.
+% \begin{macrocode}
+\dim_new:N \g_@@_width_last_col_dim
+\dim_new:N \g_@@_width_first_col_dim
+% \end{macrocode}
+%
+% \bigskip
+% The following sequence will contain the characteristics of the blocks of the
+% array, specified by the command |\Block|. Each block is represented by 6
+% components surrounded by braces:
+%
+% |{|\textsl{imin}|}{|\textsl{jmin}|}{|\textsl{imax}|}{|\textsl{jmax}|}{|\textsl{options}|}{|\textsl{contents}|}|.
+%
+% The variable is global because it will be modified in the cells of the array.
+% \begin{macrocode}
+\seq_new:N \g_@@_blocks_seq
+% \end{macrocode}
+% We also manage a sequence of the \emph{positions} of the blocks. Of course,
+% it's redundant with the previous sequence, but it's for efficiency. In that
+% sequence, each block is represented by only the four first components:
+% |{|\textsl{imin}|}{|\textsl{jmin}|}{|\textsl{imax}|}{|\textsl{jmax}|}|.
+% \begin{macrocode}
+\seq_new:N \g_@@_pos_of_blocks_seq
+% \end{macrocode}
+% In fact, this sequence will also contain the positions of the cells with a
+% |\diagbox|. The sequence |\g_@@_pos_of_blocks_seq| will be used when we will
+% draw the rules (which respect the blocks).
+%
+% \bigskip
+% We will also manage a sequence for the positions of the dotted lines. These
+% dotted lines are created in the array by |\Cdots|, |\Vdots|, |\Ddots|, etc.
+% However, their positions, that is to say, their extremities, will be
+% determined only after the construction of the array. In this sequence, each
+% item contains four components:
+% |{|\textsl{imin}|}{|\textsl{jmin}|}{|\textsl{imax}|}{|\textsl{jmax}|}|.
+% \begin{macrocode}
+\seq_new:N \g_@@_pos_of_xdots_seq
+% \end{macrocode}
+% The sequence |\g_@@_pos_of_xdots_seq| will be used when we will draw the rules
+% required by the key |hvlines| (these rules won't be drawn within the virtual
+% blocks corresponding to the dotted lines).
+%
% \medskip
-% The token list |\l_@@_xdots_line_style_tl| corresponds to the option |tikz| of the
-% commands |\Cdots|, |\Ldots|, etc. and of the options |line-style| for the
-% environments and |\NiceMatrixOptions|. The constant |\c_@@_standard_tl| will
-% be used in some tests.
+% The final user may decide to ``stroke'' a block (using, for example, the key
+% |color=red!15| when using the command |\Block|). In that case, the rules
+% specified, for instance, by |hvlines| must not be drawn around the block.
+% That's why we keep the information of all that stroken blocks in the following
+% sequence.
% \begin{macrocode}
-\tl_new:N \l_@@_xdots_line_style_tl
-\tl_const:Nn \c_@@_standard_tl { standard }
-\tl_set_eq:NN \l_@@_xdots_line_style_tl \c_@@_standard_tl
+\seq_new:N \g_@@_pos_of_stroken_blocks_seq
+% \end{macrocode}
+%
+%
+% \medskip
+% The list of the names of the potential |\SubMatrix| in the |code-after| of an
+% environment. Unfortunately, that list has to be global (we have to use it
+% inside the group for the options of a given |\SubMatrix|).
+% \begin{macrocode}
+\seq_new:N \g_@@_submatrix_names_seq
+% \end{macrocode}
+%
+% \medskip
+% We are able to determine the number of columns specified in the preamble (for
+% the environments with explicit preamble, of course and without the potential
+% exterior columns).
+% \begin{macrocode}
+\int_new:N \g_@@_static_num_of_col_int
+% \end{macrocode}
+%
+% \medskip
+% The following token lists correspond to the keys |fill| and |draw| of
+% a command |\Block|.
+% \begin{macrocode}
+\tl_new:N \l_@@_fill_tl
+\tl_new:N \l_@@_draw_tl
+% \end{macrocode}
+%
+% \medskip
+% The following token list correspond to the key |color| of the command
+% |\Block|. However, as of now (v. 5.7 of \pkg{nicematrix}), the key |color|
+% linked to |fill| with an error. We will give to the key |color| of |\Block|
+% its new meaning in a few months (with its new definition, the key |color| will
+% draw the frame with the given color but also color the content of the block
+% (that is to say the text) as does the key |color| of a Tikz node).
+% \begin{macrocode}
+\tl_new:N \l_@@_color_tl
+% \end{macrocode}
+%
+% \medskip
+% Here is the dimension for the width of the rule when a block (created by
+% |\Block|) is stroked.
+% \begin{macrocode}
+\dim_new:N \l_@@_line_width_dim
+% \end{macrocode}
+%
+% \medskip
+% The parameter of position of the label of a block (|c|, |r| or |l|).
+% \begin{macrocode}
+\tl_new:N \l_@@_pos_of_block_tl
+\tl_set:Nn \l_@@_pos_of_block_tl { c }
+% \end{macrocode}
+%
+% \medskip
+% Used when the key |draw-first| is used for |\Ddots| or |\Iddots|.
+% \begin{macrocode}
+\bool_new:N \l_@@_draw_first_bool
+% \end{macrocode}
+%
+% \medskip
+% The blocks which use the key |-| will store their content in a box. These
+% boxes are numbered with the following counter.
+% \begin{macrocode}
+\int_new:N \g_@@_block_box_int
% \end{macrocode}
%
% \bigskip
@@ -3321,8 +5545,7 @@ version 2005/12/01 or later.
% \item \textbf{First row}\par\nobreak
% The integer |\l_@@_first_row_int| is the number of the first row of the
% array. The default value is $1$, but, if the option |first-row| is used,
-% the value will be~$0$. As usual, the global version is for the passage in the
-% |\group_insert_after:N|.
+% the value will be~$0$.
% \begin{macrocode}
\int_new:N \l_@@_first_row_int
\int_set:Nn \l_@@_first_row_int 1
@@ -3340,7 +5563,7 @@ version 2005/12/01 or later.
%
% \medskip
% \item \textbf{Last row}\par\nobreak
-% The counter |\l_@@_last_row_int| is the number of the eventual ``last row'',
+% The counter |\l_@@_last_row_int| is the number of the potential ``last row'',
% as specified by the key |last-row|. A value of $-2$ means that there is no
% ``last row''. A value of $-1$ means that there is a ``last row'' but we don't
% know the number of that row (the key |last-row| has been used without value
@@ -3370,12 +5593,13 @@ version 2005/12/01 or later.
% \medskip
% \item \textbf{Last column}\par\nobreak
%
-% For the eventual ``last column'', we use an integer. A value of $-2$ means
-% that there is no last column. A value of $-1$ means that there is a last
-% column but we don't know its value because the user has used the option
-% |last-col| without value (it's possible in an environment without preamble
-% like |{pNiceMatrix}|). A value of $0$ means that the option |last-col| has
-% been used in an environment with preamble (like |{pNiceArray}|).
+% For the potential ``last column'', we use an integer. A value of $-2$ means
+% that there is no last column. A value of $-1$ means that we are in an
+% environment without preamble (e.g. |{bNiceMatrix}|) and there is a last column
+% but we don't know its value because the user has used the option |last-col|
+% without value. A value of $0$ means that the option |last-col| has been used
+% in an environment with preamble (like |{pNiceArray}|): in this case, the key
+% was necessary without argument.
% \begin{macrocode}
\int_new:N \l_@@_last_col_int
\int_set:Nn \l_@@_last_col_int { -2 }
@@ -3384,7 +5608,7 @@ version 2005/12/01 or later.
% However, we have also a boolean. Consider the following code:
% \begin{center}
% \begin{BVerbatim}
-% \begin{pNiceArray}{CC}[last-col]
+% \begin{pNiceArray}{cc}[last-col]
% 1 & 2 \\
% 3 & 4
% \end{pNiceArray}
@@ -3398,139 +5622,204 @@ version 2005/12/01 or later.
% \end{macrocode}
% This boolean is set to |false| at the end of |\@@_pre_array:|.
% \end{itemize}
-%
+%
% \bigskip
-% \textbf{The column S of siunitx}\par\nobreak
+% \subsection*{The command \textbackslash tabularnote}
%
-% \medskip
-% We want to know whether the package \pkg{siunitx} is loaded and, if it is
-% loaded, we redefine the |S| columns of \pkg{siunitx}.
+% \bigskip
+% The LaTeX counter |tabularnote| will be used to count the tabular notes during
+% the construction of the array (this counter won't be used during the
+% composition of the notes at the end of the array). You use a LaTeX counter
+% because we will use |\refstepcounter| in order to have the tabular notes
+% referenceable.
% \begin{macrocode}
-\bool_new:N \c_@@_siunitx_loaded_bool
-\AtBeginDocument
- {
- \@ifpackageloaded { siunitx }
- { \bool_set_true:N \c_@@_siunitx_loaded_bool }
- { }
- }
+\newcounter { tabularnote }
% \end{macrocode}
-%
-% \medskip
-% The command |\NC@rewrite@S| is a LaTeX command created by \pkg{siunitx} in
-% connection with the |S| column. In the code of \pkg{siunitx}, this command is
-% defined by:
-% \begin{Verbatim}[commandchars=\~\!\+, formatcom = \small]
-% \renewcommand*{\NC@rewrite@S}[1][]
-% {
-% \@temptokena \exp_after:wN
-% {
-% \tex_the:D \@temptokena
-% > { \__siunitx_table_collect_begin: S {#1} }
-% c
-% < { \__siunitx_table_print: }
-% }
-% \NC@find
-% }
-% \end{Verbatim}
-% We want to patch this command (in the environments of \pkg{nicematrix}) in
-% order to have:
-% \begin{Verbatim}[commandchars=\~\!\+, formatcom = \small]
-% \renewcommand*{\NC@rewrite@S}[1][]
-% {
-% \@temptokena \exp_after:wN
-% {
-% \tex_the:D \@temptokena
-% > { ~emphase!\@@_Cell:+ \__siunitx_table_collect_begin: S {#1} }
-% c
-% < { \__siunitx_table_print: ~emphase!\@@_end_Cell:+ }
-% }
-% \NC@find
-% }
-% \end{Verbatim}
-% However, we don't want do use explicitly any private command of \pkg{siunitx}.
-% That's why we will extract the name of the two |\__siunitx...| commands by
-% their position in the code of |\NC@rewrite@S|.
%
-% Since the command |\NC@rewrite@S| appends some tokens to the \emph{toks} list
-% |\@temptokena|, we use the LaTeX command |\NC@rewrite@S| in a group
-% (|\group_begin:|--|\group_end:|) and we extract the two command names which
-% are in the toks |\@temptokena|. However, this extraction can be done only
-% when \pkg{siunitx} is loaded (and it may be loaded after \pkg{nicematrix})
-% and, in fact, after the beginning of the document --- because some
-% instructions of \pkg{siunitx} are executed in a |\AtBeginDocument|). That's
-% why this extraction will be done only at the first use of an
-% environment of \pkg{nicematrix} with the command |\@@_adapt_S_column:|.
+% \bigskip
+% We will store in the following sequence the tabular notes of a given array.
% \begin{macrocode}
-\cs_set_protected:Npn \@@_adapt_S_column:
- {
- \bool_if:NT \c_@@_siunitx_loaded_bool
- {
- \group_begin:
- \@temptokena = { }
+\seq_new:N \g_@@_tabularnotes_seq
% \end{macrocode}
-% We protect |\NC@find| which is at the end of |\NC@rewrite@S|.
+%
+% \bigskip
+% However, before the actual tabular notes, it's possible to put a text
+% specified by the key |tabularnote| of the environment. The token list
+% |\l_@@_tabularnote_tl| corresponds to the value of that key.
% \begin{macrocode}
- \cs_set_eq:NN \NC@find \prg_do_nothing:
- \NC@rewrite@S { }
+\tl_new:N \l_@@_tabularnote_tl
% \end{macrocode}
-% Conversion of the \emph{toks} |\@temptokena| in a token list of \pkg{expl3}
-% (the toks are not supported by \pkg{expl3} but we can, nevertheless, use the
-% option |V| for |\tl_gset:NV|).
+%
+% \bigskip
+% The following counter will be used to count the number of successive tabular
+% notes such as in
+% |\tabularnote{Note 1}\tabularnote{Note 2}\tabularnote{Note 3}|.
+% In the tabular, the labels of those nodes are composed as a comma
+% separated list (e.g. \textsuperscript{\textit{a},\textit{b},\textit{c}}).
% \begin{macrocode}
- \tl_gset:NV \g_tmpa_tl \@temptokena
- \group_end:
- \tl_new:N \c_@@_table_collect_begin_tl
- \tl_set:Nx \l_tmpa_tl { \tl_item:Nn \g_tmpa_tl 2 }
- \tl_gset:Nx \c_@@_table_collect_begin_tl { \tl_item:Nn \l_tmpa_tl 1 }
- \tl_new:N \c_@@_table_print_tl
- \tl_gset:Nx \c_@@_table_print_tl { \tl_item:Nn \g_tmpa_tl { -1 } }
+\int_new:N \l_@@_number_of_notes_int
% \end{macrocode}
-% The token lists |\c_@@_table_collect_begin_tl| and |\c_@@_table_print_tl|
-% contain now the two commands of \pkg{siunitx}.
%
-% \smallskip
-% If the adaptation has been done, the command |\@@_adapt_S_column:| becomes
-% no-op (globally).
+% \bigskip
+% The following function can be redefined by using the key |notes/style|.
% \begin{macrocode}
- \cs_gset_eq:NN \@@_adapt_S_column: \prg_do_nothing:
- }
- }
+\cs_new:Npn \@@_notes_style:n #1 { \textit { \alph { #1 } } }
+% \end{macrocode}
+%
+% \bigskip
+% The following fonction can be redefined by using the key
+% |notes/label-in-tabular|.
+% \begin{macrocode}
+\cs_new:Npn \@@_notes_label_in_tabular:n #1 { \textsuperscript { #1 } }
% \end{macrocode}
%
% \bigskip
-% The command |\@@_renew_NC@rewrite@S:| will be used in each environment of
-% \pkg{nicematrix} in order to ``rewrite'' the |S| column in each environment
-% (only if the boolean |\c_@@_siunitx_loaded_bool| is raised, of course).
+% The following function can be redefined by using the key |notes/label-in-list|.
+% \begin{macrocode}
+\cs_new:Npn \@@_notes_label_in_list:n #1 { \textsuperscript { #1 } }
+% \end{macrocode}
+%
+% \bigskip
+% We define |\thetabularnote| because it will be used by LaTeX if the user want
+% to reference a footnote which has been marked by a |\label|. The TeX group is
+% for the case where the user has put an instruction such as |\color{red}| in
+% |\@@_notes_style:n|.
+% \begin{macrocode}
+\cs_set:Npn \thetabularnote { { \@@_notes_style:n { tabularnote } } }
+% \end{macrocode}
+%
+% \bigskip
+% The tabular notes will be available for the final user only when
+% \pkg{enumitem} is loaded. Indeed, the tabular notes will be composed at the end
+% of the array with a list customized by \pkg{enumitem} (a list |tabularnotes|
+% in the general case and a list |tabularnotes*| if the key |para| is in force).
+% However, we can test whether \pkg{enumitem} has been loaded only at the
+% beginning of the document (we want to allow the user to load \pkg{enumitem}
+% after \pkg{nicematrix}).
% \begin{macrocode}
-\cs_new_protected:Npn \@@_renew_NC@rewrite@S:
+\AtBeginDocument
{
- \renewcommand*{\NC@rewrite@S}[1][]
- {
- \@temptokena \exp_after:wN
+ \bool_if:nTF { ! \c_@@_enumitem_loaded_bool }
+ {
+ \NewDocumentCommand \tabularnote { m }
+ { \@@_error:n { enumitem~not~loaded } }
+ }
+ {
+% \end{macrocode}
+% The type of list |tabularnotes| will be used to format the tabular notes at
+% the end of the array in the general case and |tabularnotes*| will be used if
+% the key |para| is in force.
+% \begin{macrocode}
+ \newlist { tabularnotes } { enumerate } { 1 }
+ \setlist [ tabularnotes ]
{
- \tex_the:D \@temptokena
- > { \@@_Cell: \c_@@_table_collect_begin_tl S {##1} }
- c
- < { \c_@@_table_print_tl \@@_end_Cell: }
+ topsep = 0pt ,
+ noitemsep ,
+ leftmargin = * ,
+ align = left ,
+ labelsep = 0pt ,
+ label =
+ \@@_notes_label_in_list:n { \@@_notes_style:n { tabularnotesi } } ,
+ }
+ \newlist { tabularnotes* } { enumerate* } { 1 }
+ \setlist [ tabularnotes* ]
+ {
+ afterlabel = \nobreak ,
+ itemjoin = \quad ,
+ label =
+ \@@_notes_label_in_list:n { \@@_notes_style:n { tabularnotes*i } }
}
- \NC@find
- }
- }
% \end{macrocode}
%
-% \bigskip
-% The following command is only for efficiency. It must \emph{not} be protected
-% because it will be used (for instance) in names of \textsc{pgf} nodes.
+% \medskip
+% The command |\tabularnote| is available in the whole document (and not only in
+% the environments of \pkg{nicematrix}) because we want it to be available in
+% the caption of a |{table}| (before the following |{NiceTabular}| or
+% |{NiceArray}|). That's also the reason why the variables |\c@tabularnote| and
+% |\g_@@_tabularnotes_seq| will be cleared at the end of the environment of
+% \pkg{nicematrix} (and not at the beginning).
+%
+% Unfortunately, if the package \pkg{caption} is loaded, the command |\caption|
+% evaluates its argument twice and since it is not aware (of course) of
+% |\tabularnote|, the command |\tabularnote| is, in fact, not usable in
+% |\caption| when \pkg{caption} is loaded.\footnote{We should try to find a
+% solution to that problem.}
% \begin{macrocode}
-\cs_new:Npn \@@_succ:n #1 { \the \numexpr #1 + 1 \relax }
-\cs_new:Npn \@@_pred:n #1 { \the \numexpr #1 - 1 \relax }
+ \NewDocumentCommand \tabularnote { m }
+ {
+ \bool_if:nTF { ! \l_@@_NiceArray_bool && \l_@@_in_env_bool }
+ { \@@_error:n { tabularnote~forbidden } }
+ {
+% \end{macrocode}
+% |\l_@@_number_of_notes_int| is used to count the number of successive tabular
+% notes such as in
+% |\tabularnote{Note 1}\tabularnote{Note 2}\tabularnote{Note 3}|.
+% We will have to compose the labels of theses notes as a comma separated list
+% (e.g. \textsuperscript{\emph{a},\emph{b},\emph{c}}).
+% \begin{macrocode}
+ \int_incr:N \l_@@_number_of_notes_int
+% \end{macrocode}
+% We expand the content of the note at the point of use of
+% |\tabularnote| as does |\footnote|.
+% \begin{macrocode}
+ \seq_gput_right:Nn \g_@@_tabularnotes_seq { #1 }
+ \peek_meaning:NF \tabularnote
+ {
+% \end{macrocode}
+% If the following token is \emph{not} a |\tabularnote|, we have finished the
+% sequence of successive commands |\tabularnote| and we have to format the
+% labels of these tabular notes (in the array). We compose those labels in a box
+% |\l_tmpa_box| because we will do a special construction in order to have this
+% box in a overlapping position if we are at the end of a cell.
+% \begin{macrocode}
+ \hbox_set:Nn \l_tmpa_box
+ {
+% \end{macrocode}
+% We remind that it is the command |\@@_notes_label_in_tabular:n| that will
+% (most of the time) put the labels in a |\textsuperscript|.
+% \begin{macrocode}
+ \@@_notes_label_in_tabular:n
+ {
+ \stepcounter { tabularnote }
+ \@@_notes_style:n { tabularnote }
+ \prg_replicate:nn { \l_@@_number_of_notes_int - 1 }
+ {
+ ,
+ \stepcounter { tabularnote }
+ \@@_notes_style:n { tabularnote }
+ }
+ }
+ }
+% \end{macrocode}
+% We use |\refstepcounter| in order to have the (last) tabular note referenceable
+% (with the standard command |\label|) and that's why we have to go back with a
+% decrementation of the counter |tabularnote| first.
+% \begin{macrocode}
+ \addtocounter { tabularnote } { -1 }
+ \refstepcounter { tabularnote }
+ \int_zero:N \l_@@_number_of_notes_int
+ \hbox_overlap_right:n { \box_use:N \l_tmpa_box }
% \end{macrocode}
+% If the command |\tabularnote| is used exactly at the end of the cell, the
+% |\unskip| (inserted by \pkg{array}?) will delete the skip we insert now
+% and the label of the footnote will be composed in an overlapping position (by
+% design).
+% \begin{macrocode}
+ \skip_horizontal:n { \box_wd:N \l_tmpa_box }
+ }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+%
%
% \subsection*{Command for creation of rectangle nodes}
%
%
-% The following command should be used in a |{pgfpicture}|. It creates an
-% rectangular (empty but with a name) when the four corners are given.
+% The following command should be used in a |{pgfpicture}|. It creates a
+% rectangle (empty but with a name).
%
% |#1| is the name of the node which will be created;
% |#2| and |#3| are the coordinates of one of the corner of the rectangle;
@@ -3598,21 +5887,91 @@ version 2005/12/01 or later.
% \bigskip
% \subsection*{The options}
%
+% By default, the commands |\cellcolor| and |\rowcolor| are available for the
+% user in the cells of the tabular (the user may use the commands provided by
+% |\colortbl|). However, if the key |colortbl-like| is used, these
+% commands are available.
+% \begin{macrocode}
+\bool_new:N \l_@@_colortbl_like_bool
+% \end{macrocode}
+%
+% \bigskip
+% By default, the behaviour of |\cline| is changed in the environments of
+% \pkg{nicematrix}: a |\cline| spreads the array by an amount equal to
+% |\arrayrulewidht|. It's possible to disable this feature with the key
+% |\l_@@_standard_line_bool|.
+% \begin{macrocode}
+\bool_new:N \l_@@_standard_cline_bool
+% \end{macrocode}
+%
+% \bigskip
+% The following dimensions correspond to the options |cell-space-top-limit| and co
+% (these parameters are inspired by the package \pkg{cellspace}).
+% \begin{macrocode}
+\dim_new:N \l_@@_cell_space_top_limit_dim
+\dim_new:N \l_@@_cell_space_bottom_limit_dim
+% \end{macrocode}
+%
+% \bigskip
+% The following dimension is the distance between two dots for the dotted lines
+% (when |line-style| is equal to |standard|, which is the initial value). The
+% initial value is 0.45~em but it will be changed if the option |small| is used.
+% \begin{macrocode}
+\dim_new:N \l_@@_inter_dots_dim
+\AtBeginDocument { \dim_set:Nn \l_@@_inter_dots_dim { 0.45 em } }
+% \end{macrocode}
+% The |\AtBeginDocument| is only a security in case \cls{revtex4-1} is used
+% (even though it is obsolete).
+%
+% \bigskip
+% The following dimension is the minimal distance between a node (in fact an
+% anchor of that node) and a dotted line (we say ``minimal'' because, by
+% definition, a dotted line is not a continuous line and, therefore, this
+% distance may vary a little).
+% \begin{macrocode}
+\dim_new:N \l_@@_xdots_shorten_dim
+\AtBeginDocument { \dim_set:Nn \l_@@_xdots_shorten_dim { 0.3 em } }
+% \end{macrocode}
+% The |\AtBeginDocument| is only a security in case \cls{revtex4-1} is used
+% (even though it is obsolete).
+%
+% \bigskip
+% The following dimension is the radius of the dots for the dotted lines (when
+% |line-style| is equal to |standard|, which is the initial value). The initial
+% value is 0.53~pt but it will be changed if the option |small| is used.
+% \begin{macrocode}
+\dim_new:N \l_@@_radius_dim
+\AtBeginDocument { \dim_set:Nn \l_@@_radius_dim { 0.53 pt } }
+% \end{macrocode}
+% The |\AtBeginDocument| is only a security in case \cls{revtex4-1} is used
+% (even if it is obsolete).
+%
+%
+% \bigskip
+% The token list |\l_@@_xdots_line_style_tl| corresponds to the option |tikz| of the
+% commands |\Cdots|, |\Ldots|, etc. and of the options |line-style| for the
+% environments and |\NiceMatrixOptions|. The constant |\c_@@_standard_tl| will
+% be used in some tests.
+% \begin{macrocode}
+\tl_new:N \l_@@_xdots_line_style_tl
+\tl_const:Nn \c_@@_standard_tl { standard }
+\tl_set_eq:NN \l_@@_xdots_line_style_tl \c_@@_standard_tl
+% \end{macrocode}
+%
+% \bigskip
% The boolean |\l_@@_light_syntax_bool| corresponds to the option |light-syntax|.
% \begin{macrocode}
\bool_new:N \l_@@_light_syntax_bool
% \end{macrocode}
%
% \bigskip
-% The token list |\l_@@_baseline_str| will contain one of the three values |t|,
-% |c| or |b| and will indicate the position of the environment as in the option
-% of the environment |{array}|. For the environment |{pNiceMatrix}|,
-% |{pNiceArray}| and their variants, the value will programmatically be fixed to
-% |c|. For the environment |{NiceArray}|, however, the three values |t|, |c| and
-% |b| are possible.
+% The string |\l_@@_baseline_tl| may contain one of the three values |t|,
+% |c| or |b| as in the option of the environment |{array}|. However, it may also
+% contain an integer (which represents the number of the row to which align the
+% array).
% \begin{macrocode}
-\str_new:N \l_@@_baseline_str
-\str_set:Nn \l_@@_baseline_str c
+\tl_new:N \l_@@_baseline_tl
+\tl_set:Nn \l_@@_baseline_tl c
% \end{macrocode}
%
% \bigskip
@@ -3633,12 +5992,36 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \bigskip
-% The flag |\l_@@_hlines_bool| corresponds to the option |\hlines| and the flag
-% |\l_@@_vlines_bool| to the option |\vlines|.
+% If the flag |\l_@@_vlines_bool| is raised, horizontal space will be reserved
+% in the the preamble of the array (for the vertical rules) and, after the
+% construction of the array, the vertical rules will be drawn.
% \begin{macrocode}
-\bool_new:N \l_@@_hlines_bool
\bool_new:N \l_@@_vlines_bool
% \end{macrocode}
+%
+% \bigskip
+% If the flag |\l_@@_hlines_bool| is raised, vertical space will be reserved
+% between the rows of the array (for the horizontal rules) and, after the
+% construction of the array, the vertical rules will be drawn.
+% \begin{macrocode}
+\bool_new:N \l_@@_hlines_bool
+% \end{macrocode}
+%
+% \bigskip
+% The flag |\l_@@_except_corners_bool| will be raised when the key
+% |except-corners| will be used. In that case, the corners will be computed
+% before we draw rules and the rules won't be drawn in the corners. As expected,
+% the key |hvlines-except-corners| raises the key |except-corners|.
+% \begin{macrocode}
+\clist_new:N \l_@@_except_corners_clist
+% \end{macrocode}
+%
+% \begin{macrocode}
+\dim_new:N \l_@@_notes_above_space_dim
+\AtBeginDocument { \dim_set:Nn \l_@@_notes_above_space_dim { 1 mm } }
+% \end{macrocode}
+% The |\AtBeginDocument| is only a security in case \cls{revtex4-1} is used
+% (even if it is obsolete).
%
% \bigskip
% The flag |\l_@@_nullify_dots_bool| corresponds to the option |nullify-dots|.
@@ -3661,7 +6044,7 @@ version 2005/12/01 or later.
%
%
% \bigskip
-% The token list |\l_@@_name_str| will contain the optional name of the
+% The string |\l_@@_name_str| will contain the optional name of the
% environment: this name can be used to access to the Tikz nodes created in the
% array from outside the environment.
% \begin{macrocode}
@@ -3686,13 +6069,6 @@ version 2005/12/01 or later.
\dim_new:N \l_@@_right_margin_dim
% \end{macrocode}
%
-% \bigskip
-% The following dimensions will be used internally to compute the width of the
-% potential ``first column'' and ``last column''.
-% \begin{macrocode}
-\dim_new:N \g_@@_width_last_col_dim
-\dim_new:N \g_@@_width_first_col_dim
-% \end{macrocode}
%
% \bigskip
% The dimensions |\l_@@_extra_left_margin_dim| and
@@ -3720,7 +6096,13 @@ version 2005/12/01 or later.
\tl_new:N \l_@@_xdots_color_tl
% \end{macrocode}
%
-% \medskip
+% \bigskip
+% The following token list corresponds to the key |delimiters-color|.
+% \begin{macrocode}
+\tl_new:N \l_@@_delimiters_color_tl
+% \end{macrocode}
+%
+% \bigskip
% Sometimes, we want to have several arrays vertically juxtaposed in order to
% have an alignment of the columns of these arrays. To acheive this goal, one
% may wish to use the same width for all the columns (for example with the
@@ -3736,42 +6118,84 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \bigskip
-% First, we define a set of keys ``|NiceMatrix / Global|'' which will be used
-% (with the mechanism of |.inherit:n|) by other sets of keys.
% \begin{macrocode}
\keys_define:nn { NiceMatrix / xdots }
{
line-style .code:n =
- {
- \bool_lazy_or:nnTF
+ {
+ \bool_lazy_or:nnTF
% \end{macrocode}
% We can't use |\c_@@_tikz_loaded_bool| to test whether \pkg{tikz} is loaded
% because |\NiceMatrixOptions| may be used in the preamble of the document.
% \begin{macrocode}
- { \cs_if_exist_p:N \tikzpicture }
- { \str_if_eq_p:nn { #1 } { standard } }
- { \tl_set:Nn \l_@@_xdots_line_style_tl { #1 } }
- { \@@_error:n { bad~option~for~line-style } }
- } ,
+ { \cs_if_exist_p:N \tikzpicture }
+ { \str_if_eq_p:nn { #1 } { standard } }
+ { \tl_set:Nn \l_@@_xdots_line_style_tl { #1 } }
+ { \@@_error:n { bad~option~for~line-style } }
+ } ,
line-style .value_required:n = true ,
color .tl_set:N = \l_@@_xdots_color_tl ,
color .value_required:n = true ,
shorten .dim_set:N = \l_@@_xdots_shorten_dim ,
shorten .value_required:n = true ,
+% \end{macrocode}
+% The options |down| and |up| are not documented for the final user because he
+% should use the syntax with |^| and |_|.
+% \begin{macrocode}
+ down .tl_set:N = \l_@@_xdots_down_tl ,
+ up .tl_set:N = \l_@@_xdots_up_tl ,
+% \end{macrocode}
+% The key |draw-first|, which is meant to be used only with |\Ddots| and
+% |\Iddots|, which be catched when |\Ddots| or |\Iddots| is used (during the
+% construction of the array and not when we draw the dotted lines).
+% \begin{macrocode}
+ draw-first .code:n = \prg_do_nothing: ,
unknown .code:n = \@@_error:n { Unknown~option~for~xdots }
}
% \end{macrocode}
%
-%
+%
+% \bigskip
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / rules }
+ {
+ color .tl_set:N = \l_@@_rules_color_tl ,
+ color .value_required:n = true ,
+ width .dim_set:N = \arrayrulewidth ,
+ width .value_required:n = true
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% First, we define a set of keys ``|NiceMatrix / Global|'' which will be used
+% (with the mechanism of |.inherit:n|) by other sets of keys.
+%
% \begin{macrocode}
\keys_define:nn { NiceMatrix / Global }
{
+ standard-cline .bool_set:N = \l_@@_standard_cline_bool ,
+ standard-cline .default:n = true ,
+ cell-space-top-limit .dim_set:N = \l_@@_cell_space_top_limit_dim ,
+ cell-space-top-limit .value_required:n = true ,
+ cell-space-bottom-limit .dim_set:N = \l_@@_cell_space_bottom_limit_dim ,
+ cell-space-bottom-limit .value_required:n = true ,
+ cell-space-limits .meta:n =
+ {
+ cell-space-top-limit = #1 ,
+ cell-space-bottom-limit = #1 ,
+ } ,
+ cell-spaces-limits .value_required:n = true ,
xdots .code:n = \keys_set:nn { NiceMatrix / xdots } { #1 } ,
max-delimiter-width .bool_set:N = \l_@@_max_delimiter_width_bool ,
light-syntax .bool_set:N = \l_@@_light_syntax_bool ,
light-syntax .default:n = true ,
end-of-row .tl_set:N = \l_@@_end_of_row_tl ,
end-of-row .value_required:n = true ,
+ first-col .code:n = \int_zero:N \l_@@_first_col_int ,
+ first-row .code:n = \int_zero:N \l_@@_first_row_int ,
+ last-row .int_set:N = \l_@@_last_row_int ,
+ last-row .default:n = -1 ,
code-for-first-col .tl_set:N = \l_@@_code_for_first_col_tl ,
code-for-first-col .value_required:n = true ,
code-for-last-col .tl_set:N = \l_@@_code_for_last_col_tl ,
@@ -3780,27 +6204,24 @@ version 2005/12/01 or later.
code-for-first-row .value_required:n = true ,
code-for-last-row .tl_set:N = \l_@@_code_for_last_row_tl ,
code-for-last-row .value_required:n = true ,
- small .bool_set:N = \l_@@_small_bool ,
hlines .bool_set:N = \l_@@_hlines_bool ,
vlines .bool_set:N = \l_@@_vlines_bool ,
- hvlines .meta:n = { hlines , vlines } ,
+ hvlines .code:n =
+ {
+ \bool_set_true:N \l_@@_vlines_bool
+ \bool_set_true:N \l_@@_hlines_bool
+ } ,
parallelize-diags .bool_set:N = \l_@@_parallelize_diags_bool ,
% \end{macrocode}
%
% \bigskip
-% With the option |renew-dots|, the command |\cdots|, |\ldots|, |\vdots| and
-% |\ddots| are redefined and behave like the commands |\Cdots|, |\Ldots|,
-% |\Vdots| and |\Ddots|.
+% With the option |renew-dots|, the command |\cdots|, |\ldots|, |\vdots|,
+% |\ddots|, etc. are redefined and behave like the commands |\Cdots|, |\Ldots|,
+% |\Vdots|, |\Ddots|, etc.
% \begin{macrocode}
renew-dots .bool_set:N = \l_@@_renew_dots_bool ,
renew-dots .value_forbidden:n = true ,
nullify-dots .bool_set:N = \l_@@_nullify_dots_bool ,
-% \end{macrocode}
-%
-% \bigskip
-% In some circonstancies, the ``medium nodes'' are created automatically, for
-% example when a dotted line has an ``open'' extremity (idem for the ``large nodes'').
-% \begin{macrocode}
create-medium-nodes .bool_set:N = \l_@@_medium_nodes_bool ,
create-large-nodes .bool_set:N = \l_@@_large_nodes_bool ,
create-extra-nodes .meta:n =
@@ -3815,7 +6236,7 @@ version 2005/12/01 or later.
extra-right-margin .dim_set:N = \l_@@_extra_right_margin_dim ,
extra-margin .meta:n =
{ extra-left-margin = #1 , extra-right-margin = #1 } ,
- extra-margin .value_required:n = true
+ extra-margin .value_required:n = true ,
}
% \end{macrocode}
%
@@ -3823,10 +6244,37 @@ version 2005/12/01 or later.
% We define a set of keys used by the environments of \pkg{nicematrix} (but not
% by the command |\NiceMatrixOptions|).
% \begin{macrocode}
-\keys_define:nn { NiceMatrix / Env }
- {
+\keys_define:nn { NiceMatrix / Env }
+ {
+ except-corners .clist_set:N = \l_@@_except_corners_clist ,
+ except-corners .default:n = { NW , SW , NE , SE } ,
+ hvlines-except-corners .code:n =
+ {
+ \clist_set:Nn \l_@@_except_corners_clist { #1 }
+ \bool_set_true:N \l_@@_vlines_bool
+ \bool_set_true:N \l_@@_hlines_bool
+ } ,
+ hvlines-except-corners .default:n = { NW , SW , NE , SE } ,
+ code-before .code:n =
+ {
+ \tl_if_empty:nF { #1 }
+ {
+ \tl_put_right:Nn \l_@@_code_before_tl { #1 }
+ \bool_set_true:N \l_@@_code_before_bool
+ }
+ } ,
+% \end{macrocode}
+% \bigskip
+% The options |c|, |t| and |b| of the environment |{NiceArray}| have the same
+% meaning as the option of the classical environment |{array}|.
+% \begin{macrocode}
+ c .code:n = \tl_set:Nn \l_@@_baseline_tl c ,
+ t .code:n = \tl_set:Nn \l_@@_baseline_tl t ,
+ b .code:n = \tl_set:Nn \l_@@_baseline_tl b ,
+ baseline .tl_set:N = \l_@@_baseline_tl ,
+ baseline .value_required:n = true ,
columns-width .code:n =
- \str_if_eq:nnTF { #1 } { auto }
+ \tl_if_eq:nnTF { #1 } { auto }
{ \bool_set_true:N \l_@@_auto_columns_width_bool }
{ \dim_set:Nn \l_@@_columns_width_dim { #1 } } ,
columns-width .value_required:n = true ,
@@ -3834,7 +6282,7 @@ version 2005/12/01 or later.
% \end{macrocode}
% We test whether we are in the measuring phase of an environment of
% \pkg{amsmath} (always loaded by \pkg{nicematrix}) because we want to avoid a
-% fallaicous message of duplicate name in this case.
+% fallacious message of duplicate name in this case.
% \begin{macrocode}
\legacy_if:nF { measuring@ }
{
@@ -3845,16 +6293,70 @@ version 2005/12/01 or later.
\str_set_eq:NN \l_@@_name_str \l_tmpa_str
} ,
name .value_required:n = true ,
- code-after .tl_gset:N = \g_@@_code_after_tl ,
+ code-after .tl_gset:N = \g_nicematrix_code_after_tl ,
code-after .value_required:n = true ,
- first-col .code:n = \int_zero:N \l_@@_first_col_int ,
- first-row .code:n = \int_zero:N \l_@@_first_row_int ,
- last-row .int_set:N = \l_@@_last_row_int ,
- last-row .default:n = -1 ,
+ colortbl-like .code:n =
+ \bool_set_true:N \l_@@_colortbl_like_bool
+ \bool_set_true:N \l_@@_code_before_bool ,
+ colortbl-like .value_forbidden:n = true
}
% \end{macrocode}
%
-%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / notes }
+ {
+ para .bool_set:N = \l_@@_notes_para_bool ,
+ para .default:n = true ,
+ code-before .tl_set:N = \l_@@_notes_code_before_tl ,
+ code-before .value_required:n = true ,
+ code-after .tl_set:N = \l_@@_notes_code_after_tl ,
+ code-after .value_required:n = true ,
+ bottomrule .bool_set:N = \l_@@_notes_bottomrule_bool ,
+ bottomrule .default:n = true ,
+ style .code:n = \cs_set:Nn \@@_notes_style:n { #1 } ,
+ style .value_required:n = true ,
+ label-in-tabular .code:n =
+ \cs_set:Nn \@@_notes_label_in_tabular:n { #1 } ,
+ label-in-tabular .value_required:n = true ,
+ label-in-list .code:n =
+ \cs_set:Nn \@@_notes_label_in_list:n { #1 } ,
+ label-in-list .value_required:n = true ,
+ enumitem-keys .code:n =
+ {
+ \bool_if:NTF \c_@@_in_preamble_bool
+ {
+ \AtBeginDocument
+ {
+ \bool_if:NT \c_@@_enumitem_loaded_bool
+ { \setlist* [ tabularnotes ] { #1 } }
+ }
+ }
+ {
+ \bool_if:NT \c_@@_enumitem_loaded_bool
+ { \setlist* [ tabularnotes ] { #1 } }
+ }
+ } ,
+ enumitem-keys .value_required:n = true ,
+ enumitem-keys-para .code:n =
+ {
+ \bool_if:NTF \c_@@_in_preamble_bool
+ {
+ \AtBeginDocument
+ {
+ \bool_if:NT \c_@@_enumitem_loaded_bool
+ { \setlist* [ tabularnotes* ] { #1 } }
+ }
+ }
+ {
+ \bool_if:NT \c_@@_enumitem_loaded_bool
+ { \setlist* [ tabularnotes* ] { #1 } }
+ }
+ } ,
+ enumitem-keys-para .value_required:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~notes }
+ }
+% \end{macrocode}
+%
% \bigskip
% We begin the construction of the major sets of keys (used by the different
% user commands and environments).
@@ -3862,28 +6364,40 @@ version 2005/12/01 or later.
\keys_define:nn { NiceMatrix }
{
NiceMatrixOptions .inherit:n =
- {
- NiceMatrix / Global ,
- } ,
+ { NiceMatrix / Global } ,
NiceMatrixOptions / xdots .inherit:n = NiceMatrix / xdots ,
+ NiceMatrixOptions / rules .inherit:n = NiceMatrix / rules ,
+ NiceMatrixOptions / notes .inherit:n = NiceMatrix / notes ,
+ NiceMatrixOptions / sub-matrix .inherit:n = NiceMatrix / sub-matrix ,
+ CodeAfter / xdots .inherit:n = NiceMatrix / xdots ,
NiceMatrix .inherit:n =
{
NiceMatrix / Global ,
NiceMatrix / Env ,
} ,
NiceMatrix / xdots .inherit:n = NiceMatrix / xdots ,
+ NiceMatrix / rules .inherit:n = NiceMatrix / rules ,
+ NiceTabular .inherit:n =
+ {
+ NiceMatrix / Global ,
+ NiceMatrix / Env
+ } ,
+ NiceTabular / xdots .inherit:n = NiceMatrix / xdots ,
+ NiceTabular / rules .inherit:n = NiceMatrix / rules ,
NiceArray .inherit:n =
{
NiceMatrix / Global ,
NiceMatrix / Env ,
} ,
NiceArray / xdots .inherit:n = NiceMatrix / xdots ,
+ NiceArray / rules .inherit:n = NiceMatrix / rules ,
pNiceArray .inherit:n =
{
NiceMatrix / Global ,
NiceMatrix / Env ,
} ,
- pNiceArray / xdots .inherit:n = NiceMatrix / xdots
+ pNiceArray / xdots .inherit:n = NiceMatrix / xdots ,
+ pNiceArray / rules .inherit:n = NiceMatrix / rules ,
}
% \end{macrocode}
%
@@ -3895,6 +6409,13 @@ version 2005/12/01 or later.
% \begin{macrocode}
\keys_define:nn { NiceMatrix / NiceMatrixOptions }
{
+ delimiters-color .tl_set:N = \l_@@_delimiters_color_tl ,
+ delimiters-color .value_required:n = true ,
+ last-col .code:n = \tl_if_empty:nF { #1 }
+ { \@@_error:n { last-col~non~empty~for~NiceMatrixOptions } }
+ \int_zero:N \l_@@_last_col_int ,
+ small .bool_set:N = \l_@@_small_bool ,
+ small .value_forbidden:n = true ,
% \end{macrocode}
%
% With the option |renew-matrix|, the environment |{matrix}| of \pkg{amsmath}
@@ -3903,7 +6424,15 @@ version 2005/12/01 or later.
% \begin{macrocode}
renew-matrix .code:n = \@@_renew_matrix: ,
renew-matrix .value_forbidden:n = true ,
- transparent .meta:n = { renew-dots , renew-matrix } ,
+% \end{macrocode}
+% The key |transparent| is now considered as obsolete (because its name is ambiguous).
+% \begin{macrocode}
+ transparent .code:n =
+ {
+ \@@_renew_matrix:
+ \bool_set_true:N \l_@@_renew_dots_bool
+ \@@_error:n { Key~transparent }
+ } ,
transparent .value_forbidden:n = true,
% \end{macrocode}
%
@@ -3922,13 +6451,13 @@ version 2005/12/01 or later.
% In |\NiceMatrixOptions|, the special value |auto| is not available.
% \begin{macrocode}
columns-width .code:n =
- \str_if_eq:nnTF { #1 } { auto }
+ \tl_if_eq:nnTF { #1 } { auto }
{ \@@_error:n { Option~auto~for~columns-width } }
{ \dim_set:Nn \l_@@_columns_width_dim { #1 } } ,
% \end{macrocode}
%
% \bigskip
-% Usually, an error is raised when the user tries to give the same to name two
+% Usually, an error is raised when the user tries to give the same name to two
% distincts environments of \pkg{nicematrix} (theses names are global and not
% local to the current TeX scope). However, the option |allow-duplicate-names|
% disables this feature.
@@ -3947,15 +6476,21 @@ version 2005/12/01 or later.
% \begin{macrocode}
letter-for-dotted-lines .code:n =
{
- \int_compare:nTF { \tl_count:n { #1 } = 1 }
+ \tl_if_single_token:nTF { #1 }
{ \str_set:Nx \l_@@_letter_for_dotted_lines_str { #1 } }
{ \@@_error:n { Bad~value~for~letter~for~dotted~lines } }
} ,
letter-for-dotted-lines .value_required:n = true ,
+ notes .code:n = \keys_set:nn { NiceMatrix / notes } { #1 } ,
+ notes .value_required:n = true ,
+ sub-matrix .code:n =
+ \keys_set:nn { NiceMatrix / sub-matrix } { #1 } ,
+ sub-matrix .value_required:n = true ,
unknown .code:n = \@@_error:n { Unknown~key~for~NiceMatrixOptions }
}
% \end{macrocode}
%
+%
% \begin{macrocode}
\str_new:N \l_@@_letter_for_dotted_lines_str
\str_set_eq:NN \l_@@_letter_for_dotted_lines_str \c_colon_str
@@ -3984,10 +6519,12 @@ version 2005/12/01 or later.
\int_set:Nn \l_@@_last_col_int { -1 }
}
{ \int_set:Nn \l_@@_last_col_int { #1 } } ,
- l .code:n = \tl_set:Nn \l_@@_type_of_col_tl L ,
- r .code:n = \tl_set:Nn \l_@@_type_of_col_tl R ,
- L .code:n = \tl_set:Nn \l_@@_type_of_col_tl L ,
- R .code:n = \tl_set:Nn \l_@@_type_of_col_tl R ,
+ l .code:n = \tl_set:Nn \l_@@_type_of_col_tl l ,
+ r .code:n = \tl_set:Nn \l_@@_type_of_col_tl r ,
+ small .bool_set:N = \l_@@_small_bool ,
+ small .value_forbidden:n = true ,
+ delimiters-color .tl_set:N = \l_@@_delimiters_color_tl ,
+ delimiters-color .value_required:n = true ,
unknown .code:n = \@@_error:n { Unknown~option~for~NiceMatrix }
}
% \end{macrocode}
@@ -4003,24 +6540,23 @@ version 2005/12/01 or later.
{
% \end{macrocode}
%
-% \bigskip
-% The options |c|, |t| and |b| of the environment |{NiceArray}| have the same
-% meaning as the option of the classical environment |{array}|.
-% \begin{macrocode}
- c .code:n = \str_set:Nn \l_@@_baseline_str c ,
- t .code:n = \str_set:Nn \l_@@_baseline_str t ,
- b .code:n = \str_set:Nn \l_@@_baseline_str b ,
- baseline .tl_set:N = \l_@@_baseline_str ,
- baseline .value_required:n = true ,
-% \end{macrocode}
-%
% In the environments |{NiceArray}| and its variants, the option |last-col| must
-% be used without value because the number of columns of the array can be read
-% in the preamble of the array.
+% be used without value because the number of columns of the array is read
+% from the preamble of the array.
% \begin{macrocode}
+ small .bool_set:N = \l_@@_small_bool ,
+ small .value_forbidden:n = true ,
last-col .code:n = \tl_if_empty:nF { #1 }
{ \@@_error:n { last-col~non~empty~for~NiceArray } }
\int_zero:N \l_@@_last_col_int ,
+ notes / para .bool_set:N = \l_@@_notes_para_bool ,
+ notes / para .default:n = true ,
+ notes / bottomrule .bool_set:N = \l_@@_notes_bottomrule_bool ,
+ notes / bottomrule .default:n = true ,
+ tabularnote .tl_set:N = \l_@@_tabularnote_tl ,
+ tabularnote .value_required:n = true ,
+ delimiters-color .tl_set:N = \l_@@_delimiters_color_tl ,
+ delimiters-color .value_required:n = true ,
unknown .code:n = \@@_error:n { Unknown~option~for~NiceArray }
}
% \end{macrocode}
@@ -4035,13 +6571,32 @@ version 2005/12/01 or later.
{ \@@_error:n { last-col~non~empty~for~NiceArray } }
\int_zero:N \l_@@_last_col_int ,
first-row .code:n = \int_zero:N \l_@@_first_row_int ,
- last-row .int_set:N = \l_@@_last_row_int ,
- last-row .default:n = -1 ,
+ small .bool_set:N = \l_@@_small_bool ,
+ small .value_forbidden:n = true ,
unknown .code:n = \@@_error:n { Unknown~option~for~NiceMatrix }
}
% \end{macrocode}
%
+% \bigskip
+% We finalise the definition of the set of keys ``|NiceMatrix / NiceTabular|''
+% with the options specific to |{NiceTabular}|.
%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / NiceTabular }
+ {
+ notes / para .bool_set:N = \l_@@_notes_para_bool ,
+ notes / para .default:n = true ,
+ notes / bottomrule .bool_set:N = \l_@@_notes_bottomrule_bool ,
+ notes / bottomrule .default:n = true ,
+ tabularnote .tl_set:N = \l_@@_tabularnote_tl ,
+ tabularnote .value_required:n = true ,
+ last-col .code:n = \tl_if_empty:nF {#1}
+ { \@@_error:n { last-col~non~empty~for~NiceArray } }
+ \int_zero:N \l_@@_last_col_int ,
+ unknown .code:n = \@@_error:n { Unknown~option~for~NiceTabular }
+ }
+% \end{macrocode}
+%
% \bigskip
% \subsection*{Important code used by \{NiceArrayWithDelims\} }
%
@@ -4054,6 +6609,12 @@ version 2005/12/01 or later.
\cs_new_protected:Npn \@@_Cell:
{
% \end{macrocode}
+% At the beginning of the cell, we link |\CodeAfter| to a command which do
+% \emph{not} begin with |\omit| (whereas the standard version of |\CodeAfter|
+% begins with |\omit|).
+% \begin{macrocode}
+ \cs_set_eq:NN \CodeAfter \@@_CodeAfter_i:n
+% \end{macrocode}
% We increment |\c@jCol|, which is the counter of the columns.
% \begin{macrocode}
\int_gincr:N \c@jCol
@@ -4068,12 +6629,15 @@ version 2005/12/01 or later.
% \end{macrocode}
% The content of the cell is composed in the box |\l_@@_cell_box| because we want
% to compute some dimensions of the box. The |\hbox_set_end:| corresponding to
-% this |\hbox_set:Nw| will be in the |\@@_end_Cell:| (and the
+% this |\hbox_set:Nw| will be in the |\@@_end_Cell:| (and the potential
% |\c_math_toggle_token| also).
% \begin{macrocode}
\hbox_set:Nw \l_@@_cell_box
- \c_math_toggle_token
- \bool_if:NT \l_@@_small_bool \scriptstyle
+ \bool_if:NF \l_@@_NiceTabular_bool
+ {
+ \c_math_toggle_token
+ \bool_if:NT \l_@@_small_bool \scriptstyle
+ }
% \end{macrocode}
%
% We will call \emph{corners} of the matrix the cases which are at the
@@ -4116,12 +6680,12 @@ version 2005/12/01 or later.
\pgfrememberpicturepositiononpagetrue
\pgfcoordinate
{ \@@_env: - row - \int_use:N \c@iRow - base }
- \pgfpointorigin
+ { \pgfpoint \c_zero_dim { 0.5 \arrayrulewidth } }
\str_if_empty:NF \l_@@_name_str
{
\pgfnodealias
- { \@@_env: - row - \int_use:N \c@iRow - base }
{ \l_@@_name_str - row - \int_use:N \c@iRow - base }
+ { \@@_env: - row - \int_use:N \c@iRow - base }
}
\endpgfpicture
}
@@ -4132,7 +6696,7 @@ version 2005/12/01 or later.
% The following code is used in each cell of the array. It actualises quantities
% that, at the end of the array, will give informations about the vertical
% dimension of the two first rows and the two last rows. If the user uses the
-% |last-row|, some lines will be dynamically added to this command.
+% |last-row|, some lines of code will be dynamically added to this command.
% \begin{macrocode}
\cs_new_protected:Npn \@@_update_for_first_and_last_row:
{
@@ -4153,18 +6717,66 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rotate_cell_box:
+ {
+ \box_rotate:Nn \l_@@_cell_box { 90 }
+ \int_compare:nNnT \c@iRow = \l_@@_last_row_int
+ {
+ \vbox_set_top:Nn \l_@@_cell_box
+ {
+ \vbox_to_zero:n { }
+ \skip_vertical:n { - \box_ht:N \@arstrutbox + 0.8 ex }
+ \box_use:N \l_@@_cell_box
+ }
+ }
+ \bool_gset_false:N \g_@@_rotate_bool
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_adjust_size_box:
+ {
+ \dim_compare:nNnT \g_@@_blocks_wd_dim > \c_zero_dim
+ {
+ \box_set_wd:Nn \l_@@_cell_box
+ { \dim_max:nn { \box_wd:N \l_@@_cell_box } \g_@@_blocks_wd_dim }
+ \dim_gzero:N \g_@@_blocks_wd_dim
+ }
+ \dim_compare:nNnT \g_@@_blocks_dp_dim > \c_zero_dim
+ {
+ \box_set_dp:Nn \l_@@_cell_box
+ { \dim_max:nn { \box_dp:N \l_@@_cell_box } \g_@@_blocks_dp_dim }
+ \dim_gzero:N \g_@@_blocks_dp_dim
+ }
+ \dim_compare:nNnT \g_@@_blocks_ht_dim > \c_zero_dim
+ {
+ \box_set_ht:Nn \l_@@_cell_box
+ { \dim_max:nn { \box_ht:N \l_@@_cell_box } \g_@@_blocks_ht_dim }
+ \dim_gzero:N \g_@@_blocks_ht_dim
+ }
+ }
+% \end{macrocode}
%
% \begin{macrocode}
\cs_new_protected:Npn \@@_end_Cell:
{
- \c_math_toggle_token
+ \@@_math_toggle_token:
\hbox_set_end:
+ \bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box:
+ \@@_adjust_size_box:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \box_set_ht:Nn \l_@@_cell_box
+ { \box_ht:N \l_@@_cell_box + \l_@@_cell_space_top_limit_dim }
+ \box_set_dp:Nn \l_@@_cell_box
+ { \box_dp:N \l_@@_cell_box + \l_@@_cell_space_bottom_limit_dim }
% \end{macrocode}
%
% We want to compute in |\g_@@_max_cell_width_dim| the width of the widest cell
% of the array (except the cells of the ``first column'' and the ``last
% column'').
-%
% \begin{macrocode}
\dim_gset:Nn \g_@@_max_cell_width_dim
{ \dim_max:nn \g_@@_max_cell_width_dim { \box_wd:N \l_@@_cell_box } }
@@ -4188,7 +6800,7 @@ version 2005/12/01 or later.
% \begin{itemize}
% \item if the width of the box |\l_@@_cell_box| (created with the content of
% the cell) is equal to zero, we consider the cell as empty (however,
-% this is not perfect since the user may have use a |\rlap|, a |\llap| or a
+% this is not perfect since the user may have used a |\rlap|, a |\llap| or a
% |\mathclap| of \pkg{mathtools}.
% \item the cells with a command |\Ldots| or |\Cdots|, |\Vdots|, etc.,
% should also be considered as empty; if |nullify-dots| is in force, there would
@@ -4200,16 +6812,16 @@ version 2005/12/01 or later.
% \end{itemize}
% \begin{macrocode}
\bool_if:NTF \g_@@_empty_cell_bool
- {
- \box_use_drop:N \l_@@_cell_box
- \bool_gset_false:N \g_@@_empty_cell_bool
- }
+ { \box_use_drop:N \l_@@_cell_box }
{
- \dim_compare:nNnTF { \box_wd:N \l_@@_cell_box } > \c_zero_dim
+ \bool_lazy_or:nnTF
+ \g_@@_not_empty_cell_bool
+ { \dim_compare_p:nNn { \box_wd:N \l_@@_cell_box } > \c_zero_dim }
\@@_node_for_the_cell:
{ \box_use_drop:N \l_@@_cell_box }
}
\bool_gset_false:N \g_@@_empty_cell_bool
+ \bool_gset_false:N \g_@@_not_empty_cell_bool
}
% \end{macrocode}
%
@@ -4244,9 +6856,9 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \interitem
-% The first argument of the following command |\@@_instruction_of_type:nn|
+% The second argument of the following command |\@@_instruction_of_type:nnn|
% defined below is the type of the instruction (|Cdots|, |Vdots|, |Ddots|,
-% etc.). The second argument is the list of options. This command writes in the
+% etc.). The third argument is the list of options. This command writes in the
% corresponding |\g_@@_|\textsl{type}|_lines_tl| the instruction which will
% actually draw the line after the construction of the matrix.
%
@@ -4258,13 +6870,13 @@ version 2005/12/01 or later.
% \begin{pNiceMatrix}
% 1 & 2 & 3 & 4 \\
% 5 & \Cdots & & 6 \\
-% 7 & \Cdots[color=red] \\
+% 7 & \Cdots[color=red]
% \end{pNiceMatrix}
% \end{BVerbatim}
% $\begin{pNiceMatrix}
% 1 & 2 & 3 & 4 \\
% 5 & \Cdots & & 6 \\
-% 7 & \Cdots[color=red] \\
+% 7 & \Cdots[color=red]
% \end{pNiceMatrix}$
%
% \smallskip
@@ -4280,32 +6892,25 @@ version 2005/12/01 or later.
%
%
% \bigskip
-% We begin with a test of the flag |\c_@@_draft_bool| because, if the key
-% |draft| is used, the dotted lines are not drawn.
+% The first argument is a boolean which indicates whether you must put the
+% instruction on the left or on the right on the list of instructions.
% \begin{macrocode}
-\bool_if:NTF \c_@@_draft_bool
- { \cs_set_protected:Npn \@@_instruction_of_type:nn #1 #2 { } }
- {
- \cs_new_protected:Npn \@@_instruction_of_type:nn #1 #2
- {
+\cs_new_protected:Npn \@@_instruction_of_type:nnn #1 #2 #3
+ {
% \end{macrocode}
% It's important to use a |\tl_gput_right:cx| and not a |\tl_gput_left:cx|
% because we want the |\Ddots| lines to be drawn in the order of appearance
% in the array (for parallelisation).
% \begin{macrocode}
- \tl_gput_right:cx
- { g_@@_ #1 _ lines _ tl }
- {
- \use:c { @@ _ draw _ #1 : nnn }
- { \int_use:N \c@iRow }
- { \int_use:N \c@jCol }
-% \end{macrocode}
-% Maybe we should prevent the expansion of the list of key-value.
-% \begin{macrocode}
- { #2 }
- }
- }
- }
+ \bool_if:nTF { #1 } \tl_gput_left:cx \tl_gput_right:cx
+ { g_@@_ #2 _ lines _ tl }
+ {
+ \use:c { @@ _ draw _ #2 : nnn }
+ { \int_use:N \c@iRow }
+ { \int_use:N \c@jCol }
+ { \exp_not:n { #3 } }
+ }
+ }
% \end{macrocode}
%
%
@@ -4316,23 +6921,41 @@ version 2005/12/01 or later.
% redefinition of |\array| incompatible with our use of |\array|.
%
% \begin{macrocode}
+\cs_new_protected:Npn \@@_revtex_array:
+ {
+ \cs_set_eq:NN \@acoll \@arrayacol
+ \cs_set_eq:NN \@acolr \@arrayacol
+ \cs_set_eq:NN \@acol \@arrayacol
+ \cs_set_nopar:Npn \@halignto { }
+ \@array@array
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
\cs_new_protected:Npn \@@_array:
{
\bool_if:NTF \c_@@_revtex_bool
+ \@@_revtex_array:
{
- \cs_set_eq:NN \@acoll \@arrayacol
- \cs_set_eq:NN \@acolr \@arrayacol
- \cs_set_eq:NN \@acol \@arrayacol
- \cs_set:Npn \@halignto { }
- \@array@array
+ \bool_if:NTF \l_@@_NiceTabular_bool
+ { \dim_set_eq:NN \col@sep \tabcolsep }
+ { \dim_set_eq:NN \col@sep \arraycolsep }
+ \dim_compare:nNnTF \l_@@_tabular_width_dim = \c_zero_dim
+ { \cs_set_nopar:Npn \@halignto { } }
+ { \cs_set_nopar:Npx \@halignto { to \dim_use:N \l_@@_tabular_width_dim } }
+% \end{macrocode}
+% It \pkg{colortbl} is loaded, |\@tabarray| has been redefined to incorporate
+% |\CT@start|.
+% \begin{macrocode}
+ \@tabarray
}
- \array
% \end{macrocode}
-% |\l_@@_baseline_str| may have the value |t|, |c| or |b|. However, if the value
+% |\l_@@_baseline_tl| may have the value |t|, |c| or |b|. However, if the value
% is |b|, we compose the |\array| (of \pkg{array}) with the option |t| and the
-% right translation will be done further.
+% right translation will be done further. Remark that |\str_if_eq:VnTF| is
+% fully expandable and you need something fully expandable here.
% \begin{macrocode}
- [ \str_if_eq:VnTF \l_@@_baseline_str c c t ]
+ [ \str_if_eq:VnTF \l_@@_baseline_tl c c t ]
}
% \end{macrocode}
%
@@ -4341,76 +6964,156 @@ version 2005/12/01 or later.
% |\ialign| in the environment |{NiceArrayWithDelims}| but restore the standard
% version for use in the cells of the array.
% \begin{macrocode}
-\cs_set_eq:NN \@@_standard_ialign: \ialign
+\cs_set_eq:NN \@@_old_ialign: \ialign
% \end{macrocode}
%
-% \bigskip
-% The following must \emph{not} be protected because it begins with |\noalign|.
-% \begin{macrocode}
-\cs_new:Npn \@@_everycr: { \noalign { \@@_everycr_i: } }
-% \end{macrocode}
%
+% The following command creates a |row| node (and not a row of nodes!).
% \begin{macrocode}
-\cs_new_protected:Npn \@@_everycr_i:
- {
- \int_gzero:N \c@jCol
+\cs_new_protected:Npn \@@_create_row_node:
+ {
% \end{macrocode}
% The |\hbox:n| (or |\hbox|) is mandatory.
% \begin{macrocode}
\hbox
{
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \vtop
+ {
+ \skip_vertical:N 0.5\arrayrulewidth
+ \pgfsys@markposition { \@@_env: - row - \@@_succ:n \c@iRow }
+ \skip_vertical:N -0.5\arrayrulewidth
+ }
+ }
\pgfpicture
\pgfrememberpicturepositiononpagetrue
\pgfcoordinate { \@@_env: - row - \@@_succ:n \c@iRow }
- \pgfpointorigin
+ { \pgfpoint \c_zero_dim { - 0.5 \arrayrulewidth } }
\str_if_empty:NF \l_@@_name_str
{
\pgfnodealias
- { \@@_env: - row - \int_use:N \c@iRow - row }
- { \l_@@_name_str - row - \int_use:N \c@iRow - row }
+ { \l_@@_name_str - row - \int_use:N \c@iRow }
+ { \@@_env: - row - \int_use:N \c@iRow }
}
\endpgfpicture
- }
+ }
+ }
% \end{macrocode}
-% We add the potential horizontal lines specified by the option |hlines|.
+%
+%
+%
+% \bigskip
+% The following must \emph{not} be protected because it begins with |\noalign|.
+% \begin{macrocode}
+\cs_new:Npn \@@_everycr: { \noalign { \@@_everycr_i: } }
+% \end{macrocode}
+%
+%
% \begin{macrocode}
- \bool_if:NT \l_@@_hlines_bool
+\cs_new_protected:Npn \@@_everycr_i:
+ {
+ \int_gzero:N \c@jCol
+ \bool_gset_false:N \g_@@_after_col_zero_bool
+ \bool_if:NF \g_@@_row_of_col_done_bool
{
+ \@@_create_row_node:
+% \end{macrocode}
+% We don't draw the rules of the key |hlines| (or |hvlines|) but we reserve the
+% vertical space for theses rules.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_hlines_bool
+ {
% \end{macrocode}
% The counter |\c@iRow| has the value $-1$ only if there is a ``first
% row'' and that we are before that ``first row'', i.e. just before the
% beginning of the array.
% \begin{macrocode}
- \int_compare:nNnT \c@iRow > { -1 }
- {
- \bool_if:NF \g_@@_row_of_col_done_bool
+ \int_compare:nNnT \c@iRow > { -1 }
{
\int_compare:nNnF \c@iRow = \l_@@_last_row_int
- {
- \bool_if:NTF \c_@@_colortbl_loaded_bool
- { { \CT@arc@ \hrule height \arrayrulewidth } }
- { \hrule height \arrayrulewidth }
- }
- }
- }
+% \end{macrocode}
+% The command |\CT@arc@| is a command of \pkg{colortbl} which sets the color of
+% the rules in the array. The package \pkg{nicematrix} uses it even if
+% \pkg{colortbl} is not loaded. We use a TeX group in order to limit the scope
+% of |\CT@arc@|.
+% \begin{macrocode}
+ { \hrule height \arrayrulewidth width \c_zero_dim }
+ }
+ }
}
}
% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_newcolumntype| is the command |\newcolumntype| of
+% \pkg{array} without the warnings for redefinitions of columns types (we will
+% use it to redefine the columns types |w| and |W|).
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_newcolumntype #1
+ {
+ \cs_set:cpn { NC @ find @ #1 } ##1 #1 { \NC@ { ##1 } }
+ \peek_meaning:NTF [
+ { \newcol@ #1 }
+ { \newcol@ #1 [ 0 ] }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% When the key |renew-dots| is used, the following code will be executed.
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_renew_dots:
+ {
+ \cs_set_eq:NN \ldots \@@_Ldots
+ \cs_set_eq:NN \cdots \@@_Cdots
+ \cs_set_eq:NN \vdots \@@_Vdots
+ \cs_set_eq:NN \ddots \@@_Ddots
+ \cs_set_eq:NN \iddots \@@_Iddots
+ \cs_set_eq:NN \dots \@@_Ldots
+ \cs_set_eq:NN \hdotsfor \@@_Hdotsfor:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% When the key |colortbl-like| is used, the following code will be executed.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_colortbl_like:
+ {
+ \cs_set_eq:NN \cellcolor \@@_cellcolor_tabular
+ \cs_set_eq:NN \rowcolor \@@_rowcolor_tabular
+ \cs_set_eq:NN \columncolor \@@_columncolor_preamble
+ }
+% \end{macrocode}
%
% \bigskip
% The following code |\@@_pre_array:| is used in |{NiceArrayWithDelims}|. It
-% exists as a standalone macro only for lisibility.
+% exists as a standalone macro only for legibility.
% \label{prearray}
%
% \begin{macrocode}
\cs_new_protected:Npn \@@_pre_array:
{
+% \end{macrocode}
+% If \pkg{booktabs} is loaded, we have to patch the macro |\@BTnormal| which is
+% a macro of \pkg{booktabs}. The macro |\@BTnormal| draws an horizontal rule but
+% it occurs after a vertical skip done by a low level TeX command. When this
+% macro |\@BTnormal| occurs, the |row| node has yet been inserted by
+% \pkg{nicematrix} \emph{before} the vertical skip (and thus, at a wrong place).
+% That why we decide to create a new |row| node (for the same row). We patch the
+% macro |\@BTnormal| to create this |row| node. This new |row| node will
+% overwrite the previous definition of that |row| node and we have managed to
+% avoid the error messages of that redefinition
+% \footnote{cf. |\nicematrix@redefine@check@rerun|}.
+% \begin{macrocode}
+ \bool_if:NT \c_@@_booktabs_loaded_bool
+ { \tl_put_left:Nn \@BTnormal \@@_create_row_node: }
\box_clear_new:N \l_@@_cell_box
\cs_if_exist:NT \theiRow
- { \int_set_eq:NN \l_@@_save_iRow_int \c@iRow }
+ { \int_set_eq:NN \l_@@_old_iRow_int \c@iRow }
\int_gzero_new:N \c@iRow
\cs_if_exist:NT \thejCol
- { \int_set_eq:NN \l_@@_save_jCol_int \c@jCol }
+ { \int_set_eq:NN \l_@@_old_jCol_int \c@jCol }
\int_gzero_new:N \c@jCol
\normalbaselines
% \end{macrocode}
@@ -4422,7 +7125,7 @@ version 2005/12/01 or later.
{
% \end{macrocode}
% \begin{macrocode}
- \cs_set:Npn \arraystretch { 0.47 }
+ \cs_set_nopar:Npn \arraystretch { 0.47 }
\dim_set:Nn \arraycolsep { 1.45 pt }
}
% \end{macrocode}
@@ -4434,7 +7137,7 @@ version 2005/12/01 or later.
% |\everycr| to |{ }| and we \emph{need} to have to change the value of
% |\everycr|.
% \begin{macrocode}
- \cs_set:Npn \ialign
+ \cs_set_nopar:Npn \ialign
{
\bool_if:NTF \c_@@_colortbl_loaded_bool
{
@@ -4450,7 +7153,7 @@ version 2005/12/01 or later.
%
% The box |\@arstrutbox| is a box constructed in the beginning of the
% environment |{array}|. The construction of that box takes into account the
-% current values of |\arraystretch|\footnote{The option |small| of
+% current value of |\arraystretch|\footnote{The option |small| of
% \pkg{nicematrix} changes (among other) the value of |\arraystretch|. This is
% done, of course, before the call of |{array}|.} and |\extrarowheight| (of
% \pkg{array}). That box is inserted (via |\@arstrut|) in the beginning of each
@@ -4473,56 +7176,46 @@ version 2005/12/01 or later.
% \end{macrocode}
% After its first use, the definition of |\ialign| will revert
% automatically to its default definition. With this programmation, we will
-% have, in the cells of the array, a clean version of |\ialign|.\footnote{The
-% user will probably not employ directly |\ialign| in the array... but more
-% likely environments that utilize |\ialign| internally (e.g.: |{substack}|).}
+% have, in the cells of the array, a clean version of |\ialign|.
% \begin{macrocode}
- \cs_set_eq:NN \ialign \@@_standard_ialign:
+ \cs_set_eq:NN \ialign \@@_old_ialign:
\halign
}
% \end{macrocode}
%
-% We define the new column types |L|, |C| and |R| that must be used instead of
-% |l|, |c| and |r| in the preamble of |{NiceArray}|.
-% \begin{macrocode}
- \newcolumntype L { > \@@_Cell: l < \@@_end_Cell: }
- \newcolumntype C { > \@@_Cell: c < \@@_end_Cell: }
- \newcolumntype R { > \@@_Cell: r < \@@_end_Cell: }
-% \end{macrocode}
% We keep in memory the old versions or |\ldots|, |\cdots|, etc. only because we
% use them inside |\phantom| commands in order that the new commands |\Ldots|,
% |\Cdots|, etc. give the same spacing (except when the option |nullify-dots| is
% used).
% \begin{macrocode}
- \cs_set_eq:NN \@@_ldots \ldots
- \cs_set_eq:NN \@@_cdots \cdots
- \cs_set_eq:NN \@@_vdots \vdots
- \cs_set_eq:NN \@@_ddots \ddots
- \cs_set_eq:NN \@@_iddots \iddots
- \cs_set_eq:NN \firsthline \hline
- \cs_set_eq:NN \lasthline \hline
+ \cs_set_eq:NN \@@_old_ldots \ldots
+ \cs_set_eq:NN \@@_old_cdots \cdots
+ \cs_set_eq:NN \@@_old_vdots \vdots
+ \cs_set_eq:NN \@@_old_ddots \ddots
+ \cs_set_eq:NN \@@_old_iddots \iddots
+ \bool_if:NTF \l_@@_standard_cline_bool
+ { \cs_set_eq:NN \cline \@@_standard_cline }
+ { \cs_set_eq:NN \cline \@@_cline }
\cs_set_eq:NN \Ldots \@@_Ldots
\cs_set_eq:NN \Cdots \@@_Cdots
\cs_set_eq:NN \Vdots \@@_Vdots
\cs_set_eq:NN \Ddots \@@_Ddots
\cs_set_eq:NN \Iddots \@@_Iddots
\cs_set_eq:NN \hdottedline \@@_hdottedline:
+ \cs_set_eq:NN \Hline \@@_Hline:
\cs_set_eq:NN \Hspace \@@_Hspace:
\cs_set_eq:NN \Hdotsfor \@@_Hdotsfor:
+ \cs_set_eq:NN \Vdotsfor \@@_Vdotsfor:
\cs_set_eq:NN \multicolumn \@@_multicolumn:nnn
\cs_set_eq:NN \Block \@@_Block:
\cs_set_eq:NN \rotate \@@_rotate:
\cs_set_eq:NN \OnlyMainNiceMatrix \@@_OnlyMainNiceMatrix:n
- \bool_if:NT \l_@@_renew_dots_bool
- {
- \cs_set_eq:NN \ldots \@@_Ldots
- \cs_set_eq:NN \cdots \@@_Cdots
- \cs_set_eq:NN \vdots \@@_Vdots
- \cs_set_eq:NN \ddots \@@_Ddots
- \cs_set_eq:NN \iddots \@@_Iddots
- \cs_set_eq:NN \dots \@@_Ldots
- \cs_set_eq:NN \hdotsfor \@@_Hdotsfor:
- }
+ \cs_set_eq:NN \dotfill \@@_old_dotfill:
+ \cs_set_eq:NN \CodeAfter \@@_CodeAfter:
+ \cs_set_eq:NN \diagbox \@@_diagbox:nn
+ \cs_set_eq:NN \NotEmpty \@@_NotEmpty:
+ \bool_if:NT \l_@@_colortbl_like_bool \@@_colortbl_like:
+ \bool_if:NT \l_@@_renew_dots_bool \@@_renew_dots:
% \end{macrocode}
%
%
@@ -4564,115 +7257,11 @@ version 2005/12/01 or later.
\cs_set_eq:NN \@ifnextchar \new@ifnextchar
% \end{macrocode}
%
-% We nullify the definitions of the column types |w| and |W| before their
-% redefinition because we want to avoid a warning in the log file for a
-% redefinition of a column type. We must put |\relax| and not
-% |\prg_do_nothing:|.
-% \begin{macrocode}
- \cs_set_eq:NN \NC@find@w \relax
- \cs_set_eq:NN \NC@find@W \relax
- \newcolumntype w [ 2 ]
- {
- > {
- \hbox_set:Nw \l_@@_cell_box
- \@@_Cell:
- }
- c
- < {
- \@@_end_Cell:
- \hbox_set_end:
-% \end{macrocode}
-% The |\str_lowercase:n| is only for giving the user the ability to write
-% |wC{1cm}| instead of |wc{1cm}| for homogeneity with the letters |L|, |C| and
-% |R| used elsewhere in the preamble instead of |l|, |c| and |r|.
-% \begin{macrocode}
- \makebox [ ##2 ] [ \str_lowercase:n { ##1 } ]
- { \box_use_drop:N \l_@@_cell_box }
- }
- }
- \newcolumntype W [ 2 ]
- {
- > {
- \hbox_set:Nw \l_@@_cell_box
- \@@_Cell:
- }
- c
- < {
- \@@_end_Cell:
- \hbox_set_end:
- \cs_set_eq:NN \hss \hfil
- \makebox [ ##2 ] [ \str_lowercase:n { ##1 } ]
- { \box_use_drop:N \l_@@_cell_box }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% By default, the letter used to specify a dotted line in the preamble of an
-% environment of \pkg{nicematrix} (for example in |{pNiceArray}|) is the letter
-% |:|. However, this letter is used by some extensions, for example
-% \pkg{arydshln}. That's why it's possible to change the letter used by
-% \pkg{nicematrix} with the option |letter-for-dotted-lines| which changes the
-% value of |\l_@@_letter_for_dotted_lines_str|. We rescan this string (which is
-% always of length~1) in particular for the case where |pdflatex| is used with
-% \pkg{french-babel} (the colon is activated by \pkg{french-babel} at the
-% beginning of the document).
% \begin{macrocode}
- \tl_set_rescan:Nno
- \l_@@_letter_for_dotted_lines_str { } \l_@@_letter_for_dotted_lines_str
- \exp_args:NV \newcolumntype \l_@@_letter_for_dotted_lines_str
- {
- !
- {
+ \@@_renew_NC@rewrite@S:
% \end{macrocode}
%
-% \medskip
-% The following code because we want the dotted line to have exactly the same
-% position as a vertical rule drawn by ``"|"'' (considering the rule having a
-% width equal to the diameter of the dots).
% \begin{macrocode}
- \int_compare:nNnF \c@iRow = 0
- {
- \int_compare:nNnF \c@iRow = \l_@@_last_row_int
- { \skip_horizontal:N 2\l_@@_radius_dim }
- }
-% \end{macrocode}
-%
-% \medskip
-% Consider the following code:
-% \begin{center}
-% \begin{BVerbatim}
-% \begin{NiceArray}{C:CC:C}
-% a & b
-% c & d \\
-% e & f & g & h \\
-% i & j & k & l
-% \end{NiceArray}
-% \end{BVerbatim}
-% \end{center}
-% The first ``|:|'' in the preamble will be encountered during the first row of
-% the environment |{NiceArray}| but the second one will be encountered only in
-% the third row. We have to issue a command |\vdottedline:n| in the |code-after|
-% only one time for each ``|:|'' in the preamble. That's why we keep a counter
-% |\g_@@_last_vdotted_col_int| and with this counter, we know whether a letter
-% ``|:|'' encountered during the parsing has already been taken into account in
-% the |code-after|.
-% \begin{macrocode}
- \int_compare:nNnT \c@jCol > \g_@@_last_vdotted_col_int
- {
- \int_gset_eq:NN \g_@@_last_vdotted_col_int \c@jCol
- \tl_gput_right:Nx \g_@@_internal_code_after_tl
-% \end{macrocode}
-% The command |\@@_vdottedline:n| is protected, and, therefore, won't be
-% expanded before writing on |\g_@@_internal_code_after_tl|.
-% \begin{macrocode}
- { \@@_vdottedline:n { \int_use:N \c@jCol } }
- }
- }
- }
- \int_gzero_new:N \g_@@_last_vdotted_col_int
- \bool_if:NT \c_@@_siunitx_loaded_bool \@@_renew_NC@rewrite@S:
- \int_gset:Nn \g_@@_last_vdotted_col_int { -1 }
\bool_gset_false:N \g_@@_last_col_found_bool
% \end{macrocode}
%
@@ -4686,9 +7275,16 @@ version 2005/12/01 or later.
\tl_gclear_new:N \g_@@_Vdots_lines_tl
\tl_gclear_new:N \g_@@_Ddots_lines_tl
\tl_gclear_new:N \g_@@_Iddots_lines_tl
- \tl_gclear_new:N \g_@@_Hdotsfor_lines_tl
- }
+ \tl_gclear_new:N \g_@@_HVdotsfor_lines_tl
% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+ \tl_gclear_new:N \g_nicematrix_code_before_tl
+ }
+% \end{macrocode}
+% This is the end of |\@@_pre_array:|.
+%
%
% \bigskip
% \subsection*{The environment \{NiceArrayWithDelims\}}
@@ -4696,30 +7292,66 @@ version 2005/12/01 or later.
% \begin{macrocode}
\NewDocumentEnvironment { NiceArrayWithDelims } { m m O { } m ! O { } }
{
+ \@@_provide_pgfsyspdfmark:
+ \bool_if:NT \c_@@_footnote_bool \savenotes
+% \end{macrocode}
+% The aim of the following |\bgroup| (the corresponding |\egroup| is, of course,
+% at the end of the environment) is to be able to put an exposant to a matrix in
+% a mathematical formula.
+% \begin{macrocode}
+ \bgroup
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
\tl_set:Nn \l_@@_left_delim_tl { #1 }
\tl_set:Nn \l_@@_right_delim_tl { #2 }
+ \tl_gset:Nn \g_@@_preamble_tl { #4 }
+% \end{macrocode}
+%
+%
+% \bigskip
+%
+% \begin{macrocode}
+ \int_gzero:N \g_@@_block_box_int
+ \dim_zero:N \g_@@_width_last_col_dim
+ \dim_zero:N \g_@@_width_first_col_dim
\bool_gset_false:N \g_@@_row_of_col_done_bool
\str_if_empty:NT \g_@@_name_env_str
{ \str_gset:Nn \g_@@_name_env_str { NiceArrayWithDelims } }
\@@_adapt_S_column:
- \@@_test_if_math_mode:
+ \bool_if:NTF \l_@@_NiceTabular_bool
+ \mode_leave_vertical:
+ \@@_test_if_math_mode:
\bool_if:NT \l_@@_in_env_bool { \@@_fatal:n { Yet~in~env } }
\bool_set_true:N \l_@@_in_env_bool
% \end{macrocode}
+% The command |\CT@arc@| contains the instruction of color for the rules of the
+% array\footnote{e.g. |\color[rgb]{0.5,0.5,0}|}. This command is used by |\CT@arc@| but
+% we use it also for compatibility with \pkg{colortbl}. But we want also to be
+% able to use color for the rules of the array when \pkg{colortbl} is \emph{not}
+% loaded. That's why we do the following instruction which is in the patch of
+% the beginning of arrays done by \pkg{colortbl}. Of course, we restore the
+% value of |\CT@arc@| at the end of our environment.
+% \begin{macrocode}
+ \cs_gset_eq:NN \@@_old_CT@arc@ \CT@arc@
+% \end{macrocode}
%
-% We deactivate Tikz externalization because we will use \textsc{pgf} pictures with the
-% options |overlay| and |remember picture| (or equivalent forms).
+% We deactivate Tikz externalization because we will use \textsc{pgf} pictures
+% with the options |overlay| and |remember picture| (or equivalent forms). We
+% deactivate with |\tikzexternaldisable| and not with
+% |\tikzset{external/export=false}| which is \emph{not} equivalent.
% \begin{macrocode}
\cs_if_exist:NT \tikz@library@external@loaded
{
- \tikzset { external / export = false }
+ \tikzexternaldisable
\cs_if_exist:NT \ifstandalone
{ \tikzset { external / optimize = false } }
}
% \end{macrocode}
%
% We increment the counter |\g_@@_env_int| which counts the environments
-% of the extension.
+% of the package.
% \begin{macrocode}
\int_gincr:N \g_@@_env_int
\bool_if:NF \l_@@_block_auto_columns_width_bool
@@ -4727,14 +7359,31 @@ version 2005/12/01 or later.
% \end{macrocode}
%
%
-% We do a redefinition of |\@arrayrule| because we want that the vertical rules
-% drawn by "|" in the preamble of the array don't extend in the potential
-% exterior rows.
+% The sequence |\g_@@_blocks_seq| will contain the carateristics of the blocks
+% (specified by |\Block|) of the array. The sequence |\g_@@_pos_of_blocks_seq|
+% will contain only the position of the blocks. Of course, this is redundant but
+% it's for efficiency.
% \begin{macrocode}
- \cs_set_protected:Npn \@arrayrule { \@addtopreamble \@@_vline: }
+ \seq_gclear:N \g_@@_blocks_seq
+ \seq_gclear:N \g_@@_pos_of_blocks_seq
% \end{macrocode}
-%
+% In fact, the sequence |\g_@@_pos_of_blocks_seq| will also contain the
+% positions of the cells with a |\diagbox|.
%
+% \begin{macrocode}
+ \seq_gclear:N \g_@@_pos_of_stroken_blocks_seq
+ \seq_gclear:N \g_@@_pos_of_xdots_seq
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \tl_if_exist:cT { g_@@_code_before_ \int_use:N \g_@@_env_int _ tl }
+ {
+ \bool_set_true:N \l_@@_code_before_bool
+ \exp_args:NNv \tl_put_right:Nn \l_@@_code_before_tl
+ { g_@@_code_before_ \int_use:N \g_@@_env_int _ tl }
+ }
+% \end{macrocode}
+%
% The set of keys is not exactly the same for |{NiceArray}| and for the variants
% of |{NiceArray}| (|{pNiceArray}|, |{bNiceArray}|, etc.) because, for
% |{NiceArray}|, we have the options |t|, |c|, |b| and |baseline|.
@@ -4744,7 +7393,105 @@ version 2005/12/01 or later.
{ \keys_set:nn { NiceMatrix / pNiceArray } }
{ #3 , #5 }
% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+ \tl_if_empty:NF \l_@@_rules_color_tl
+ { \exp_after:wN \@@_set_CT@arc@: \l_@@_rules_color_tl \q_stop }
+% \end{macrocode}
+%
%
+% \bigskip
+% If the key |code-before| is used, we have to create the |col| nodes and the
+% |row| nodes before the creation of the array. First, we have to test whether
+% the size of the array has been written in the |aux| file in a previous run. In
+% this case, a command |\@@_size_|{\slshape\ttfamily nb_of_env}|:| has been
+% created.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \seq_if_exist:cT { @@_size_ \int_use:N \g_@@_env_int _ seq }
+ {
+% \end{macrocode}
+% First, we give values to the LaTeX counters |iRow| and |jCol|. We remind that,
+% in the |code-before| (and in the |code-after|) they represent the numbers of
+% rows and columns of the array (without the potential last row and last column).
+% \begin{macrocode}
+ \int_zero_new:N \c@iRow
+ \int_set:Nn \c@iRow
+ { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 2 }
+ \int_zero_new:N \c@jCol
+ \int_set:Nn \c@jCol
+ { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 4 }
+% \end{macrocode}
+% We have to adjust the values of |\c@iRow| and |\c@jCol| to take into account
+% the potential last row and last column. A value of $-2$ for
+% |\l_@@_last_row_int| means that there is no last row. Idem for the columns.
+% \begin{macrocode}
+ \int_compare:nNnF \l_@@_last_row_int = { -2 }
+ { \int_decr:N \c@iRow }
+ \int_compare:nNnF \l_@@_last_col_int = { -2 }
+ { \int_decr:N \c@jCol }
+% \end{macrocode}
+%
+% Now, we will create all the |col| nodes and |row| nodes with the informations
+% written in the |aux| file. You use the technique described in the page~1229 of
+% |pgfmanual.pdf|, version~3.1.4b.
+% \begin{macrocode}
+ \pgfsys@markposition { \@@_env: - position }
+ \pgfsys@getposition { \@@_env: - position } \@@_picture_position:
+ \pgfpicture
+% \end{macrocode}
+% First, the creation of the |row| nodes.
+% \begin{macrocode}
+ \int_step_inline:nnn
+ { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 1 }
+ { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 2 + 1 }
+ {
+ \pgfsys@getposition { \@@_env: - row - ##1 } \@@_node_position:
+ \pgfcoordinate { \@@_env: - row - ##1 }
+ { \pgfpointdiff \@@_picture_position: \@@_node_position: }
+ }
+% \end{macrocode}
+% Now, the creation of the |col| nodes.
+% \begin{macrocode}
+ \int_step_inline:nnn
+ { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 3 }
+ { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 4 + 1 }
+ {
+ \pgfsys@getposition { \@@_env: - col - ##1 } \@@_node_position:
+ \pgfcoordinate { \@@_env: - col - ##1 }
+ { \pgfpointdiff \@@_picture_position: \@@_node_position: }
+ }
+ \endpgfpicture
+ \group_begin:
+ \bool_if:NT \c_@@_tikz_loaded_bool
+ {
+ \tikzset
+ {
+ every~picture / .style =
+ { overlay , name~prefix = \@@_env: - }
+ }
+ }
+ \cs_set_eq:NN \cellcolor \@@_cellcolor
+ \cs_set_eq:NN \rectanglecolor \@@_rectanglecolor
+ \cs_set_eq:NN \rowcolor \@@_rowcolor
+ \cs_set_eq:NN \rowcolors \@@_rowcolors
+ \cs_set_eq:NN \columncolor \@@_columncolor
+ \cs_set_eq:NN \chessboardcolors \@@_chessboardcolors
+% \end{macrocode}
+% We compose the |code-before| in math mode in order to nullify the spaces put
+% by the user between instructions in the |code-before|.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token
+ \seq_clear_new:N \l_@@_colors_seq
+ \l_@@_code_before_tl
+ \@@_actually_color:
+ \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token
+ \group_end:
+ }
+ }
+% \end{macrocode}
%
% A value of $-1$ for the counter |\l_@@_last_row_int| means that the user has
% used the option |last-row| without value, that is to say without specifying
@@ -4789,11 +7536,9 @@ version 2005/12/01 or later.
%
%
% A value of $-1$ for the counter |\l_@@_last_col_int| means that the user has
-% used the option |last-col| without value (it's possible in an environment
-% without preamble like |{NiceMatrix}| or |{pNiceMatrix}|), that is to say
-% without specifying the number of that last column. In this case, we try to
-% read that value from the |aux| file (if it has been written on a previous
-% run).
+% used the option |last-col| without value, that is to say without specifying
+% the number of that last column. In this case, we try to read that value from
+% the |aux| file (if it has been written on a previous run).
% \begin{macrocode}
\int_compare:nNnT \l_@@_last_col_int = { -1 }
{
@@ -4822,7 +7567,7 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \medskip
-% We compute the width of the two delimiters.
+% We compute the width of both delimiters.
% \begin{macrocode}
\dim_zero_new:N \l_@@_left_delim_dim
\dim_zero_new:N \l_@@_right_delim_dim
@@ -4835,9 +7580,9 @@ version 2005/12/01 or later.
% \end{macrocode}
% The command |\bBigg@| is a command of \pkg{amsmath}.
% \begin{macrocode}
- \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 #1 $ }
+ \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \l_@@_left_delim_tl $ }
\dim_set:Nn \l_@@_left_delim_dim { \box_wd:N \l_tmpa_box }
- \hbox_set:Nn \l_tmpa_box { $\bBigg@ 5 #2 $ }
+ \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \l_@@_right_delim_tl $ }
\dim_set:Nn \l_@@_right_delim_dim { \box_wd:N \l_tmpa_box }
}
% \end{macrocode}
@@ -4849,57 +7594,40 @@ version 2005/12/01 or later.
\box_clear_new:N \l_@@_the_array_box
% \end{macrocode}
%
-% \medskip
-% We construct the preamble of the array in |\l_tmpa_tl|.
+% \bigskip
+% If the user has loaded |nicematrix| with the option |define-L-C-R|, he will be
+% able to use |L|, |C| and |R| instead of |l|, |c| and |r| in the preambles of
+% the environments of \pkg{nicematrix} (it's a compatibility mode since |L|, |C|
+% and |R| were mandatory before version 5.0).
% \begin{macrocode}
- \tl_set:Nn \l_tmpa_tl { #4 }
- \int_compare:nNnTF \l_@@_first_col_int = 0
- { \tl_put_left:NV \l_tmpa_tl \c_@@_preamble_first_col_tl }
- {
- \bool_lazy_all:nT
- {
- \l_@@_NiceArray_bool
- { \bool_not_p:n \l_@@_vlines_bool }
- { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
- }
- { \tl_put_left:Nn \l_tmpa_tl { @ { } } }
- }
- \int_compare:nNnTF \l_@@_last_col_int > { -1 }
- { \tl_put_right:NV \l_tmpa_tl \c_@@_preamble_last_col_tl }
- {
- \bool_lazy_all:nT
- {
- \l_@@_NiceArray_bool
- { \bool_not_p:n \l_@@_vlines_bool }
- { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
- }
- { \tl_put_right:Nn \l_tmpa_tl { @ { } } }
- }
- \tl_put_right:Nn \l_tmpa_tl { > { \@@_error_too_much_cols: } l }
+ \bool_if:NT \c_@@_define_L_C_R_bool \@@_define_L_C_R:
+% \end{macrocode}
+%
+% \bigskip
+% The preamble will be constructed in |\g_@@_preamble_tl|.
+% \begin{macrocode}
+ \@@_construct_preamble:
% \end{macrocode}
+%
+% Now, the preamble is constructed in |\g_@@_preamble_tl|
+%
+%
+%
+% \bigskip
% Here is the beginning of the box which will contain the array. The
% |\hbox_set_end:| corresponding to this |\hbox_set:Nw| will be in the second
% part of the environment (and the closing |\c_math_toggle_token| also).
% \begin{macrocode}
- \hbox_set:Nw \l_@@_the_array_box
+ \hbox_set:Nw \l_@@_the_array_box
% \end{macrocode}
-% If the key |\vlines| is used, we increase |\arraycolsep| by
-% |0.5\arrayrulewidth| in order to reserve space for the width of the vertical
-% rules drawn with Tikz after the end of the array. However, the first
-% |\arraycolsep| is used once (between columns, |\arraycolsep| is used twice).
-% That's why we add a |0.5\arrayrulewidth| more.
+%
% \begin{macrocode}
- \bool_if:NT \l_@@_vlines_bool
- {
- \dim_add:Nn \arraycolsep { 0.5 \arrayrulewidth }
- \skip_horizontal:N 0.5\arrayrulewidth
- }
\skip_horizontal:N \l_@@_left_margin_dim
\skip_horizontal:N \l_@@_extra_left_margin_dim
\c_math_toggle_token
\bool_if:NTF \l_@@_light_syntax_bool
- { \begin { @@-light-syntax } }
- { \begin { @@-normal-syntax } }
+ { \use:c { @@-light-syntax } }
+ { \use:c { @@-normal-syntax } }
}
% \end{macrocode}
%
@@ -4907,26 +7635,18 @@ version 2005/12/01 or later.
% \begin{macrocode}
{
\bool_if:NTF \l_@@_light_syntax_bool
- { \end { @@-light-syntax } }
- { \end { @@-normal-syntax } }
+ { \use:c { end @@-light-syntax } }
+ { \use:c { end @@-normal-syntax } }
\c_math_toggle_token
\skip_horizontal:N \l_@@_right_margin_dim
\skip_horizontal:N \l_@@_extra_right_margin_dim
-% \end{macrocode}
-% If the key |\vlines| is used, we have increased |\arraycolsep| by
-% |0.5\arrayrulewidth| in order to reserve space for the width of the vertical
-% rules drawn with Tikz after the end of the array. However, the last
-% |\arraycolsep| is used once (between columns, |\arraycolsep| is used twice).
-% That's we add a |0.5 \arrayrulewidth| more.
-% \begin{macrocode}
- \bool_if:NT \l_@@_vlines_bool { \skip_horizontal:N 0.5\arrayrulewidth }
\hbox_set_end:
% \end{macrocode}
% End of the construction of the array (in the box |\l_@@_the_array_box|).
%
% \bigskip
% It the user has used the key |last-row| with a value, we control that the
-% given value is correct (since we have just contructed the array, we know the
+% given value is correct (since we have just constructed the array, we know the
% real number of rows of the array).
% \begin{macrocode}
\int_compare:nNnT \l_@@_last_row_int > { -2 }
@@ -4942,14 +7662,19 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
-% Now, the definition of |\c@jCol| and
-% |\g_@@_col_total_int| change: |\c@jCol| will be the number of
-% columns without the ``last column''; |\g_@@_col_total_int| will be the
-% number of columns with this ``last column''.\footnote{We remind that the
-% potential ``first column'' (exterior) has the number~$0$.}
+% Now, the definition of |\c@jCol| and |\g_@@_col_total_int| change: |\c@jCol|
+% will be the number of columns without the ``last column'';
+% |\g_@@_col_total_int| will be the number of columns with this ``last
+% column''.\footnote{We remind that the potential ``first column'' (exterior)
+% has the number~$0$.}
% \begin{macrocode}
\int_gset_eq:NN \c@jCol \g_@@_col_total_int
- \bool_if:nT \g_@@_last_col_found_bool { \int_gdecr:N \c@jCol }
+ \bool_if:nTF \g_@@_last_col_found_bool
+ { \int_gdecr:N \c@jCol }
+ {
+ \int_compare:nNnT \l_@@_last_col_int > { -1 }
+ { \@@_error:n { last~col~not~used } }
+ }
% \end{macrocode}
%
% We fix also the value of |\c@iRow| and |\g_@@_row_total_int| with the
@@ -4960,7 +7685,6 @@ version 2005/12/01 or later.
% \end{macrocode}
%
%
-%
% \bigskip
% \textbf{Now, we begin the real construction in the output flow of TeX}. First, we take
% into account a potential ``first column'' (we remind that this ``first
@@ -4970,78 +7694,26 @@ version 2005/12/01 or later.
% \begin{macrocode}
\int_compare:nNnT \l_@@_first_col_int = 0
{
- \skip_horizontal:N \arraycolsep
- \skip_horizontal:N \g_@@_width_first_col_dim
+ \skip_horizontal:N \col@sep
+ \skip_horizontal:N \g_@@_width_first_col_dim
}
% \end{macrocode}
%
-% The construction of the real box is different in |{NiceArray}| and in the
-% other environments because, in |{NiceArray}|, we have to take into account the
-% value of |baseline| and we have no delimiter to put. We begin with |{NiceArray}|.
+% The construction of the real box is different when |\l_@@_NiceArray_bool| is
+% true (|{NiceArray}| or |{NiceTabular}|) and in the other environments because,
+% in |{NiceArray}| or |{NiceTabular}|, we have no delimiter to put (but we have
+% tabular notes to put). We begin with this case.
+%
+% Remark that, in all cases, |@@_use_arraybox_with_notes_c:| is used.
% \begin{macrocode}
\bool_if:NTF \l_@@_NiceArray_bool
{
-% \end{macrocode}
-% Remember that, when the key |b| is used, the |\array| (of \pkg{array}) is
-% constructed with the option |t| (and not |b|). Now, we do the translation to
-% take into account the option |b|.
-% \begin{macrocode}
- \str_if_eq:VnTF \l_@@_baseline_str { b }
+ \str_case:VnF \l_@@_baseline_tl
{
- \pgfpicture
- \@@_qpoint: { row - 1 }
- \dim_gset_eq:NN \g_tmpa_dim \pgf@y
- \@@_qpoint: { row - \int_use:N \c@iRow - base }
- \dim_gsub:Nn \g_tmpa_dim \pgf@y
- \endpgfpicture
- \int_compare:nNnT \l_@@_first_row_int = 0
- {
- \dim_gadd:Nn \g_tmpa_dim
- { \g_@@_ht_row_zero_dim + \g_@@_dp_row_zero_dim }
- }
- \box_move_up:nn \g_tmpa_dim { \box_use_drop:N \l_@@_the_array_box }
- }
- {
- \str_if_eq:VnTF \l_@@_baseline_str { c }
- { \box_use_drop:N \l_@@_the_array_box }
- {
-% \end{macrocode}
-% We convert a value of |t| to a value of |1|.
-% \begin{macrocode}
- \str_if_eq:VnT \l_@@_baseline_str { t }
- { \str_set:Nn \l_@@_baseline_str { 1 } }
-% \end{macrocode}
-% Now, we convert the value of |\l_@@_baseline_str| (which should represent an
-% integer) to an integer stored in |\l_tmpa_int|.
-% \begin{macrocode}
- \int_set:Nn \l_tmpa_int \l_@@_baseline_str
- \bool_if:nT
- {
- \int_compare_p:nNn \l_tmpa_int < \l_@@_first_row_int
- || \int_compare_p:nNn \l_tmpa_int > \g_@@_row_total_int
- }
- {
- \@@_error:n { bad~value~for~baseline }
- \int_set:Nn \l_tmpa_int 1
- }
-% \end{macrocode}
-% We use a |{pgfpicture}| to extract coordinates (nothing is drawn).
-% \begin{macrocode}
- \pgfpicture
- \@@_qpoint: { row - 1 }
- \dim_gset_eq:NN \g_tmpa_dim \pgf@y
- \@@_qpoint: { row - \int_use:N \l_tmpa_int - base }
- \dim_gsub:Nn \g_tmpa_dim \pgf@y
- \endpgfpicture
- \int_compare:nNnT \l_@@_first_row_int = 0
- {
- \dim_gadd:Nn \g_tmpa_dim
- { \g_@@_ht_row_zero_dim + \g_@@_dp_row_zero_dim }
- }
- \box_move_up:nn \g_tmpa_dim
- { \box_use_drop:N \l_@@_the_array_box }
- }
+ b \@@_use_arraybox_with_notes_b:
+ c \@@_use_arraybox_with_notes_c:
}
+ \@@_use_arraybox_with_notes:
}
% \end{macrocode}
%
@@ -5062,8 +7734,8 @@ version 2005/12/01 or later.
% below the array (when the key |last-row| is used). A value of $-2$ for
% |\l_@@_last_row_int| means that there is no ``last row''.\footnote{A value of
% $-1$ for |\l_@@_last_row_int| means that there is a ``last row'' but the
-% number of that row is unknown (the user have not set the value with the option
-% |last row|).}
+% the user have not set the value with the option |last row| (and we are in the
+% first compilation).}
% \begin{macrocode}
\int_compare:nNnTF \l_@@_last_row_int > { -2 }
{
@@ -5077,7 +7749,9 @@ version 2005/12/01 or later.
\hbox_set:Nn \l_tmpa_box
{
\c_math_toggle_token
- \left #1
+ \tl_if_empty:NF \l_@@_delimiters_color_tl
+ { \color { \l_@@_delimiters_color_tl } }
+ \exp_after:wN \left \l_@@_left_delim_tl
\vcenter
{
% \end{macrocode}
@@ -5087,9 +7761,13 @@ version 2005/12/01 or later.
\skip_vertical:N -\l_tmpa_dim
\hbox
{
- \skip_horizontal:N -\arraycolsep
- \box_use_drop:N \l_@@_the_array_box
- \skip_horizontal:N -\arraycolsep
+ \bool_if:NTF \l_@@_NiceTabular_bool
+ { \skip_horizontal:N -\tabcolsep }
+ { \skip_horizontal:N -\arraycolsep }
+ \@@_use_arraybox_with_notes_c:
+ \bool_if:NTF \l_@@_NiceTabular_bool
+ { \skip_horizontal:N -\tabcolsep }
+ { \skip_horizontal:N -\arraycolsep }
}
% \end{macrocode}
% We take into account the ``last row'' (we have previously computed its total
@@ -5097,7 +7775,7 @@ version 2005/12/01 or later.
% \begin{macrocode}
\skip_vertical:N -\l_tmpb_dim
}
- \right #2
+ \exp_after:wN \right \l_@@_right_delim_tl
\c_math_toggle_token
}
% \end{macrocode}
@@ -5109,7 +7787,7 @@ version 2005/12/01 or later.
% \begin{macrocode}
\bool_if:NTF \l_@@_max_delimiter_width_bool
{ \@@_put_box_in_flow_bis:nn { #1 } { #2 } }
- \@@_put_box_in_flow:
+ \@@_put_box_in_flow:
}
% \end{macrocode}
%
@@ -5120,13 +7798,465 @@ version 2005/12/01 or later.
\bool_if:NT \g_@@_last_col_found_bool
{
\skip_horizontal:N \g_@@_width_last_col_dim
- \skip_horizontal:N \arraycolsep
+ \skip_horizontal:N \col@sep
+ }
+ \bool_if:NF \l_@@_Matrix_bool
+ {
+ \int_compare:nNnT \c@jCol < \g_@@_static_num_of_col_int
+ { \@@_error:n { columns~not~used } }
}
+ \group_begin:
+ \globaldefs = 1
+ \@@_msg_redirect_name:nn { columns~not~used } { error }
+ \group_end:
\@@_after_array:
+% \end{macrocode}
+% The aim of the following |\egroup| (the corresponding |\bgroup| is, of course,
+% at the beginning of the environment) is to be able to put an exposant to a matrix in
+% a mathematical formula.
+% \begin{macrocode}
+ \egroup
+ \bool_if:NT \c_@@_footnote_bool \endsavenotes
}
% \end{macrocode}
% This is the end of the environment |{NiceArrayWithDelims}|.
%
+% \vspace{1cm}
+% \subsection*{We construct the preamble of the array}
+%
+% The transformation of the preamble is an operation in several steps.
+%
+% \bigskip
+% The preamble given by the final use is in |\g_@@_preamble_tl| and the modified
+% version will be stored in |\g_@@_preamble_tl| also.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_construct_preamble:
+ {
+% \end{macrocode}
+% First, we will do an ``expansion'' of the preamble with the tools of the
+% package \pkg{array} itself. This ``expansion'' will expand all the constructions
+% with |*| and with all column types (defined by the user or by various packages
+% using |\newcolumntype|).
+%
+% Since we use the tools of \pkg{array} to do this expansion, we will have a
+% programmation which is not in the style of \pkg{expl3}.
+%
+%
+% \bigskip
+% We redefine the column types |w| and |W|. We use |\@@_newcolumntype| instead
+% of |\newcolumtype| because we don't want warnings for column types already
+% defined. These redefinitions are in fact \emph{protections} of the letters |w|
+% and |W|. We don't want these columns type expanded because we will do the
+% patch ourselves after. We want to be able the standard column types |w| and
+% |W| in potential |{tabular}| of \pkg{array} in some cells of our array. That's
+% why we do those redefinitions in a TeX group.
+% \begin{macrocode}
+ \group_begin:
+% \end{macrocode}
+%
+% If we are in an environment without explicit preamble, we have nothing to do
+% (excepted the treatment on both sides of the preamble which will be done at
+% the end).
+% \begin{macrocode}
+ \bool_if:NF \l_@@_Matrix_bool
+ {
+ \@@_newcolumntype w [ 2 ] { \@@_w: { ##1 } { ##2 } }
+ \@@_newcolumntype W [ 2 ] { \@@_W: { ##1 } { ##2 } }
+% \end{macrocode}
+%
+% First, we have to store our preamble in the token register |\@temptokena|
+% (those ``token registers'' are not supported by \pkg{expl3}).
+% \begin{macrocode}
+ \exp_args:NV \@temptokena \g_@@_preamble_tl
+% \end{macrocode}
+% Initialisation of a flag used by \pkg{array} to detect the end of the expansion.
+% \begin{macrocode}
+ \@tempswatrue
+% \end{macrocode}
+% The following line actually does the expansion (it's has been copied from
+% |array.sty|).
+% \begin{macrocode}
+ \@whilesw \if@tempswa \fi { \@tempswafalse \the \NC@list }
+% \end{macrocode}
+%
+%
+% \bigskip
+% Now, we have to ``patch'' that preamble by transforming some columns.
+% We will insert in the TeX flow the preamble in its actual form (that is to say
+% after the ``expansion'') following by a marker |\q_stop| and we will consume
+% these tokens constructing the (new form of the) preamble in
+% |\g_@@_preamble_tl|. This is done recursively with the command
+% |\@@_patch_preamble:n|. In the same time, we will count the columns with the
+% counter |\c@jCol|.
+% \begin{macrocode}
+ \int_gzero_new:N \c@jCol
+ \bool_if:NTF \l_@@_vlines_bool
+ {
+ \tl_gset:Nn \g_@@_preamble_tl
+ { ! { \skip_horizontal:N \arrayrulewidth } }
+ }
+ { \tl_gclear:N \g_@@_preamble_tl }
+% \end{macrocode}
+% The counter |\l_tmpa_int| will count the number of consecutive occurrences
+% of the symbol \verb+|+.
+% \begin{macrocode}
+ \int_zero:N \l_tmpa_int
+% \end{macrocode}
+% Now, we actually patch the preamble (and it is constructed in
+% |\g_@@_preamble_tl|).
+% \begin{macrocode}
+ \exp_after:wN \@@_patch_preamble:n \the \@temptokena \q_stop
+ \int_gset_eq:NN \g_@@_static_num_of_col_int \c@jCol
+ }
+% \end{macrocode}
+%
+% \medskip
+% Now, we replace |\columncolor| by |\@@_columncolor_preamble|.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_colortbl_like_bool
+ {
+ \regex_replace_all:NnN
+ \c_@@_columncolor_regex
+ { \c { @@_columncolor_preamble } }
+ \g_@@_preamble_tl
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We complete the preamble with the potential ``exterior columns''.
+% \begin{macrocode}
+ \int_compare:nNnTF \l_@@_first_col_int = 0
+ { \tl_gput_left:NV \g_@@_preamble_tl \c_@@_preamble_first_col_tl }
+ {
+ \bool_lazy_all:nT
+ {
+ \l_@@_NiceArray_bool
+ { \bool_not_p:n \l_@@_NiceTabular_bool }
+ { \bool_not_p:n \l_@@_vlines_bool }
+ { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
+ }
+ { \tl_gput_left:Nn \g_@@_preamble_tl { @ { } } }
+ }
+ \int_compare:nNnTF \l_@@_last_col_int > { -1 }
+ { \tl_gput_right:NV \g_@@_preamble_tl \c_@@_preamble_last_col_tl }
+ {
+ \bool_lazy_all:nT
+ {
+ \l_@@_NiceArray_bool
+ { \bool_not_p:n \l_@@_NiceTabular_bool }
+ { \bool_not_p:n \l_@@_vlines_bool }
+ { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
+ }
+ { \tl_gput_right:Nn \g_@@_preamble_tl { @ { } } }
+ }
+% \end{macrocode}
+% We add a last column to raise a good error message when the user put more
+% columns than allowed by its preamble. However, for technical reasons, it's not
+% possible to do that in |{NiceTabular*}| (|\l_@@_tabular_width_dim|=0pt).
+% \begin{macrocode}
+ \dim_compare:nNnT \l_@@_tabular_width_dim = \c_zero_dim
+ {
+ \tl_gput_right:Nn
+ \g_@@_preamble_tl
+ { > { \@@_error_too_much_cols: } l }
+ }
+% \end{macrocode}
+%
+% \medskip
+% Now, we have to close the TeX group which was opened for the redefinition of
+% the columns of type |w| and |W|.
+% \begin{macrocode}
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble:n #1
+ {
+ \str_case:nnF { #1 }
+ {
+ c { \@@_patch_preamble_i:n #1 }
+ l { \@@_patch_preamble_i:n #1 }
+ r { \@@_patch_preamble_i:n #1 }
+ > { \@@_patch_preamble_ii:nn #1 }
+ ! { \@@_patch_preamble_ii:nn #1 }
+ @ { \@@_patch_preamble_ii:nn #1 }
+ | { \@@_patch_preamble_iii:n #1 }
+ p { \@@_patch_preamble_iv:nnn t #1 }
+ m { \@@_patch_preamble_iv:nnn c #1 }
+ b { \@@_patch_preamble_iv:nnn b #1 }
+ \@@_w: { \@@_patch_preamble_v:nnnn { } #1 }
+ \@@_W: { \@@_patch_preamble_v:nnnn { \cs_set_eq:NN \hss \hfil } #1 }
+ \@@_true_c: { \@@_patch_preamble_vi:n #1 }
+ ( { \@@_patch_preamble_vii:n #1 }
+ [ { \@@_patch_preamble_vii:n #1 }
+ \{ { \@@_patch_preamble_vii:n #1 }
+ ) { \@@_patch_preamble_viii:n #1 }
+ ] { \@@_patch_preamble_viii:n #1 }
+ \} { \@@_patch_preamble_viii:n #1 }
+ C { \@@_error:nn { old~column~type } #1 }
+ L { \@@_error:nn { old~column~type } #1 }
+ R { \@@_error:nn { old~column~type } #1 }
+ \q_stop { }
+ }
+ {
+ \str_if_eq:VnTF \l_@@_letter_for_dotted_lines_str { #1 }
+ { \@@_patch_preamble_xi:n #1 }
+ {
+ \bool_lazy_and:nnTF
+ { \str_if_eq_p:nn { : } { #1 } }
+ \c_@@_arydshln_loaded_bool
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl { : }
+ \@@_patch_preamble:n
+ }
+ { \@@_fatal:nn { unknown~column~type } { #1 } }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% For |c|, |l| and |r|
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_i:n #1
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ {
+ > { \@@_Cell: \tl_set:Nn \l_@@_cell_type_tl { #1 } }
+ #1
+ < \@@_end_Cell:
+ }
+% \end{macrocode}
+%
+% We increment the counter of columns and then we test for the presence of a |<|.
+% \begin{macrocode}
+ \int_gincr:N \c@jCol
+ \@@_patch_preamble_x:n
+ }
+% \end{macrocode}
+%
+% \medskip
+% For |>|, |!| and |@|
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_ii:nn #1 #2
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl { #1 { #2 } }
+ \@@_patch_preamble:n
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% For \verb+|+
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_iii:n #1
+ {
+% \end{macrocode}
+% |\l_tmpa_int| is the number of successive occurrences of \verb+|+
+% \begin{macrocode}
+ \int_incr:N \l_tmpa_int
+ \@@_patch_preamble_iii_i:n
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_iii_i:n #1
+ {
+ \str_if_eq:nnTF { #1 } |
+ { \@@_patch_preamble_iii:n | }
+ {
+ \tl_gput_right:Nx \g_@@_preamble_tl
+ {
+ \exp_not:N !
+ {
+ \skip_horizontal:n
+ {
+ \dim_eval:n
+ {
+ \arrayrulewidth * \l_tmpa_int
+ + \doublerulesep * ( \l_tmpa_int - 1)
+ }
+ }
+ }
+ }
+ \tl_gput_right:Nx \g_@@_internal_code_after_tl
+ { \@@_vline:nn { \@@_succ:n \c@jCol } { \int_use:N \l_tmpa_int } }
+ \int_zero:N \l_tmpa_int
+ \@@_patch_preamble:n #1
+ }
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% For |p|, |m| and |b|
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_iv:nnn #1 #2 #3
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ {
+ > {
+ \@@_Cell:
+ \begin { minipage } [ #1 ] { #3 }
+ \mode_leave_vertical:
+ \arraybackslash % added in the version 5.8
+ \box_use:N \@arstrutbox
+ }
+ c
+ < { \box_use:N \@arstrutbox \end { minipage } \@@_end_Cell: }
+ }
+% \end{macrocode}
+% We increment the counter of columns, and then we test for the presence of a |<|.
+% \begin{macrocode}
+ \int_gincr:N \c@jCol
+ \@@_patch_preamble_x:n
+ }
+% \end{macrocode}
+%
+% \medskip
+% For |w| and |W|
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_v:nnnn #1 #2 #3 #4
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ {
+ > {
+ \hbox_set:Nw \l_@@_cell_box
+ \@@_Cell:
+ \tl_set:Nn \l_@@_cell_type_tl { #3 }
+ }
+ c
+ < {
+ \@@_end_Cell:
+ #1
+ \hbox_set_end:
+ \bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box:
+ \@@_adjust_size_box:
+ \makebox [ #4 ] [ #3 ] { \box_use_drop:N \l_@@_cell_box }
+ }
+ }
+% \end{macrocode}
+% We increment the counter of columns and then we test for the presence of a |<|.
+% \begin{macrocode}
+ \int_gincr:N \c@jCol
+ \@@_patch_preamble_x:n
+ }
+% \end{macrocode}
+%
+% \medskip
+% For |\@@_true_c:| which will appear in our redefinition of the columns of type
+% |S| (of \pkg{siunitx}).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_vi:n #1
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl { c }
+% \end{macrocode}
+% We increment the counter of columns and then we test for the presence of a |<|.
+% \begin{macrocode}
+ \int_gincr:N \c@jCol
+ \@@_patch_preamble_x:n
+ }
+% \end{macrocode}
+%
+% \medskip
+% For |(|, |[| and |\{|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_vii:n #1
+ {
+ \bool_if:NT \l_@@_small_bool
+ { \@@_fatal:n { Delimiter~with~small } }
+% \end{macrocode}
+% If we are before the column 1, we reserve space for the left delimiter.
+% \begin{macrocode}
+ \int_compare:nNnT \c@jCol = \c_zero_int
+ { \tl_gput_right:Nx \g_@@_preamble_tl { ! { \enskip } } }
+ \tl_gput_right:Nx \g_@@_internal_code_after_tl
+ { \@@_delimiter:nnn #1 { \@@_succ:n \c@jCol } \c_true_bool }
+ \@@_patch_preamble:n
+ }
+% \end{macrocode}
+%
+% \bigskip
+% For |)|, |]| and |\}|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_viii:n #1
+ {
+ \bool_if:NT \l_@@_small_bool
+ { \@@_fatal:n { Delimiter~with~small } }
+ \tl_gput_right:Nx \g_@@_internal_code_after_tl
+ { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool }
+% \end{macrocode}
+% After this closing delimiter, we have to test whether there is a opening
+% delimiter (we consider that there can't be a second closing delimiter) in
+% order to add an horizontal space (equal to 0.5 em).
+% \begin{macrocode}
+ \@@_patch_preamble_viii_i:n
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_viii_i:n #1
+ {
+ \bool_lazy_any:nT
+ {
+ { \str_if_eq_p:nn { #1 } ( }
+ { \str_if_eq_p:nn { #1 } [ }
+ { \str_if_eq_p:nn { #1 } \{ }
+ { \str_if_eq_p:nn { #1 } \q_stop }
+ }
+ { \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } }
+ \@@_patch_preamble:n #1
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_xi:n #1
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ { ! { \skip_horizontal:N 2\l_@@_radius_dim } }
+% \end{macrocode}
+% The command |\@@_vdottedline:n| is protected, and, therefore, won't be
+% expanded before writing on |\g_@@_internal_code_after_tl|.
+% \begin{macrocode}
+ \tl_gput_right:Nx \g_@@_internal_code_after_tl
+ { \@@_vdottedline:n { \int_use:N \c@jCol } }
+ \@@_patch_preamble:n
+ }
+% \end{macrocode}
+%
+% After a specifier of column, we have to test whether there is one or several
+% |<{..}| because, after those potential |<{...}|, we have to insert
+% |!{\skip_horizontal:N ...}| when the key |vlines| is used.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_x:n #1
+ {
+ \str_if_eq:nnTF { #1 } { < }
+ \@@_patch_preamble_ix:n
+ {
+ \bool_if:NT \l_@@_vlines_bool
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ { ! { \skip_horizontal:N \arrayrulewidth } }
+ }
+ \@@_patch_preamble:n { #1 }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_ix:n #1
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl { < { #1 } }
+ \@@_patch_preamble_x:n
+ }
+% \end{macrocode}
+%
+%
+%
% \bigskip
% The command |\@@_put_box_in_flow:| puts the box |\l_tmpa_box| (which contains
% the array) in the flow. It is used for the environments with delimiters.
@@ -5139,11 +8269,237 @@ version 2005/12/01 or later.
{
\box_set_ht:Nn \l_tmpa_box { \box_ht:N \l_tmpa_box + \l_tmpa_dim }
\box_set_dp:Nn \l_tmpa_box { \box_dp:N \l_tmpa_box + \l_tmpb_dim }
+ \tl_if_eq:NnTF \l_@@_baseline_tl { c }
+ { \box_use_drop:N \l_tmpa_box }
+ \@@_put_box_in_flow_i:
+ }
+% \end{macrocode}
+%
+% \medskip
+% The command |\@@_put_box_in_flow_i:| is used when the value of
+% |\l_@@_baseline_tl| is different of |c| (which is the initial value and the
+% most used).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_put_box_in_flow_i:
+ {
+ \pgfpicture
+ \@@_qpoint:n { row - 1 }
+ \dim_gset_eq:NN \g_tmpa_dim \pgf@y
+ \@@_qpoint:n { row - \@@_succ:n \c@iRow }
+ \dim_gadd:Nn \g_tmpa_dim \pgf@y
+ \dim_gset:Nn \g_tmpa_dim { 0.5 \g_tmpa_dim }
+% \end{macrocode}
+% Now, |\g_tmpa_dim| contains the $y$-value of the center of the array (the
+% delimiters are centered in relation with this value).
+% \begin{macrocode}
+ \str_if_in:NnTF \l_@@_baseline_tl { line- }
+ {
+ \int_set:Nn \l_tmpa_int
+ {
+ \str_range:Nnn
+ \l_@@_baseline_tl
+ 6
+ { \tl_count:V \l_@@_baseline_tl }
+ }
+ \@@_qpoint:n { row - \int_use:N \l_tmpa_int }
+ }
+ {
+ \str_case:VnF \l_@@_baseline_tl
+ {
+ { t } { \int_set:Nn \l_tmpa_int 1 }
+ { b } { \int_set_eq:NN \l_tmpa_int \c@iRow }
+ }
+ { \int_set:Nn \l_tmpa_int \l_@@_baseline_tl }
+ \bool_lazy_or:nnT
+ { \int_compare_p:nNn \l_tmpa_int < \l_@@_first_row_int }
+ { \int_compare_p:nNn \l_tmpa_int > \g_@@_row_total_int }
+ {
+ \@@_error:n { bad~value~for~baseline }
+ \int_set:Nn \l_tmpa_int 1
+ }
+ \@@_qpoint:n { row - \int_use:N \l_tmpa_int - base }
+% \end{macrocode}
+% We take into account the position of the mathematical axis.
+% \begin{macrocode}
+ \dim_gsub:Nn \g_tmpa_dim { \fontdimen22 \textfont2 }
+ }
+ \dim_gsub:Nn \g_tmpa_dim \pgf@y
+% \end{macrocode}
+% Now, |\g_tmpa_dim| contains the value of the $y$ translation we have to to.
+% \begin{macrocode}
+ \endpgfpicture
+ \box_move_up:nn \g_tmpa_dim { \box_use_drop:N \l_tmpa_box }
\box_use_drop:N \l_tmpa_box
}
% \end{macrocode}
%
% \bigskip
+% The following command is \emph{always} used by |{NiceArrayWithDelims}| (even
+% if, in fact, there is no tabular notes: in fact, it's not possible to know
+% whether there is tabular notes or not before the composition of the blocks).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_use_arraybox_with_notes_c:
+ {
+% \end{macrocode}
+% We need a |{minipage}| because we will insert a LaTeX list for the tabular
+% notes (that means that a |\vtop{\hsize=...}| is not enough).
+% \begin{macrocode}
+ \begin { minipage } [ t ] { \box_wd:N \l_@@_the_array_box }
+ \box_use_drop:N \l_@@_the_array_box
+% \end{macrocode}
+% We have to draw the blocks right now because there may be tabular notes in
+% some blocks (which are not mono-column: the blocks which are mono-column
+% have been composed in boxes yet)... and we have to create (potentially) the
+% extra nodes before creating the blocks since there are |medium| nodes to create
+% for the blocks.
+% \begin{macrocode}
+ \@@_create_extra_nodes:
+ \seq_if_empty:NF \g_@@_blocks_seq \@@_draw_blocks:
+ \bool_lazy_or:nnT
+ { \int_compare_p:nNn \c@tabularnote > 0 }
+ { ! \tl_if_empty_p:V \l_@@_tabularnote_tl }
+ \@@_insert_tabularnotes:
+ \end { minipage }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_insert_tabularnotes:
+ {
+ \skip_vertical:N 0.65ex
+% \end{macrocode}
+% The TeX group is for potential specifications in the
+% |\l_@@_notes_code_before_tl|.
+% \begin{macrocode}
+ \group_begin:
+ \l_@@_notes_code_before_tl
+ \tl_if_empty:NF \l_@@_tabularnote_tl { \l_@@_tabularnote_tl \par }
+% \end{macrocode}
+% We compose the tabular notes with a list of \pkg{enumitem}. The |\strut| and
+% the |\unskip| are designed to give the ability to put a |\bottomrule| at the
+% end of the notes with a good vertical space.
+% \begin{macrocode}
+ \int_compare:nNnT \c@tabularnote > 0
+ {
+ \bool_if:NTF \l_@@_notes_para_bool
+ {
+ \begin { tabularnotes* }
+ \seq_map_inline:Nn \g_@@_tabularnotes_seq { \item ##1 } \strut
+ \end { tabularnotes* }
+% \end{macrocode}
+% The following |\par| is mandatory for the event that the user has put
+% |\footnotesize| (for example) in the |notes/code-before|.
+% \begin{macrocode}
+ \par
+ }
+ {
+ \tabularnotes
+ \seq_map_inline:Nn \g_@@_tabularnotes_seq { \item ##1 } \strut
+ \endtabularnotes
+ }
+ }
+ \unskip
+ \group_end:
+ \bool_if:NT \l_@@_notes_bottomrule_bool
+ {
+ \bool_if:NTF \c_@@_booktabs_loaded_bool
+ {
+% \end{macrocode}
+% The two dimensions |\aboverulesep| et |\heavyrulewidth| are parameters defined
+% by \pkg{booktabs}.
+% \begin{macrocode}
+ \skip_vertical:N \aboverulesep
+% \end{macrocode}
+% |\CT@arc@| is the specification of color defined by \pkg{colortbl} but you use it
+% even if \pkg{colortbl} is not loaded.
+% \begin{macrocode}
+ { \CT@arc@ \hrule height \heavyrulewidth }
+ }
+ { \@@_error:n { bottomrule~without~booktabs } }
+ }
+ \l_@@_notes_code_after_tl
+ \seq_gclear:N \g_@@_tabularnotes_seq
+ \int_gzero:N \c@tabularnote
+ }
+% \end{macrocode}
+%
+% \medskip
+% The case of |baseline| equal to |b|. Remember that, when the key |b| is used,
+% the |{array}| (of \pkg{array}) is constructed with the option |t| (and not
+% |b|). Now, we do the translation to take into account the option |b|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_use_arraybox_with_notes_b:
+ {
+ \pgfpicture
+ \@@_qpoint:n { row - 1 }
+ \dim_gset_eq:NN \g_tmpa_dim \pgf@y
+ \@@_qpoint:n { row - \int_use:N \c@iRow - base }
+ \dim_gsub:Nn \g_tmpa_dim \pgf@y
+ \endpgfpicture
+ \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth
+ \int_compare:nNnT \l_@@_first_row_int = 0
+ {
+ \dim_gadd:Nn \g_tmpa_dim \g_@@_ht_row_zero_dim
+ \dim_gadd:Nn \g_tmpa_dim \g_@@_dp_row_zero_dim
+ }
+ \box_move_up:nn \g_tmpa_dim { \hbox { \@@_use_arraybox_with_notes_c: } }
+ }
+% \end{macrocode}
+%
+% \medskip
+% Now, the general case.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_use_arraybox_with_notes:
+ {
+% \end{macrocode}
+% We convert a value of |t| to a value of |1|.
+% \begin{macrocode}
+ \tl_if_eq:NnT \l_@@_baseline_tl { t }
+ { \tl_set:Nn \l_@@_baseline_tl { 1 } }
+% \end{macrocode}
+% Now, we convert the value of |\l_@@_baseline_tl| (which should represent an
+% integer) to an integer stored in |\l_tmpa_int|.
+% \begin{macrocode}
+ \pgfpicture
+ \@@_qpoint:n { row - 1 }
+ \dim_gset_eq:NN \g_tmpa_dim \pgf@y
+ \str_if_in:NnTF \l_@@_baseline_tl { line- }
+ {
+ \int_set:Nn \l_tmpa_int
+ {
+ \str_range:Nnn
+ \l_@@_baseline_tl
+ 6
+ { \tl_count:V \l_@@_baseline_tl }
+ }
+ \@@_qpoint:n { row - \int_use:N \l_tmpa_int }
+ }
+ {
+ \int_set:Nn \l_tmpa_int \l_@@_baseline_tl
+ \bool_lazy_or:nnT
+ { \int_compare_p:nNn \l_tmpa_int < \l_@@_first_row_int }
+ { \int_compare_p:nNn \l_tmpa_int > \g_@@_row_total_int }
+ {
+ \@@_error:n { bad~value~for~baseline }
+ \int_set:Nn \l_tmpa_int 1
+ }
+ \@@_qpoint:n { row - \int_use:N \l_tmpa_int - base }
+ }
+ \dim_gsub:Nn \g_tmpa_dim \pgf@y
+ \endpgfpicture
+ \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth
+ \int_compare:nNnT \l_@@_first_row_int = 0
+ {
+ \dim_gadd:Nn \g_tmpa_dim \g_@@_ht_row_zero_dim
+ \dim_gadd:Nn \g_tmpa_dim \g_@@_dp_row_zero_dim
+ }
+ \box_move_up:nn \g_tmpa_dim { \hbox { \@@_use_arraybox_with_notes_c: } }
+ }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
% The command |\@@_put_box_in_flow_bis:| is used when the option
% |max-delimiter-width| is used because, in this case, we have to adjust the
% widths of the delimiters. The arguments |#1| and |#2| are the delimiters
@@ -5166,7 +8522,7 @@ version 2005/12/01 or later.
{ \box_ht:N \l_tmpa_box + \box_dp:N \l_tmpa_box }
{ }
}
- \right .
+ \right .
\c_math_toggle_token
}
\dim_set:Nn \l_@@_real_left_delim_dim
@@ -5199,9 +8555,9 @@ version 2005/12/01 or later.
% \interitem
% The construction of the array in the environment |{NiceArrayWithDelims}| is,
% in fact, done by the environment |{@@-light-syntax}| or by the environment
-% |{@@-normal-syntax}| (whether the option |light-syntax| is used or not). When
-% the key |light-syntax| is not used, the construction is a standard
-% environment (and, thus, it's possible to use verbatim in the arrray).
+% |{@@-normal-syntax}| (whether the option |light-syntax| is in force or not).
+% When the key |light-syntax| is not used, the construction is a standard
+% environment (and, thus, it's possible to use verbatim in the array).
% \begin{macrocode}
\NewDocumentEnvironment { @@-normal-syntax } { }
% \end{macrocode}
@@ -5212,13 +8568,12 @@ version 2005/12/01 or later.
% by LaTeX for incorrect nested environments).
% \begin{macrocode}
{
- \peek_meaning_ignore_spaces:NTF \end
- { \@@_analyze_end:Nn }
+ \peek_meaning_ignore_spaces:NTF \end \@@_analyze_end:Nn
% \end{macrocode}
% Here is the call to |\array| (we have a dedicated macro |\@@_array:| because
% of compatibility with the classes \cls{revtex4-1} and \cls{revtex4-2}).
% \begin{macrocode}
- { \exp_args:NV \@@_array: \l_tmpa_tl }
+ { \exp_args:NV \@@_array: \g_@@_preamble_tl }
}
{
\@@_create_col_nodes:
@@ -5228,8 +8583,9 @@ version 2005/12/01 or later.
%
%
% \bigskip
-% When the key |light-syntax| is used, we use an environment which takes its whole
-% body as an argument (with the specifier |b| of \pkg{xparse}).
+% When the key |light-syntax| is in force, we use an environment which takes its
+% whole body as an argument (with the specifier |b| of \pkg{xparse}).
+% % \label{code-light-syntax}
% \begin{macrocode}
\NewDocumentEnvironment { @@-light-syntax } { b }
{
@@ -5241,14 +8597,38 @@ version 2005/12/01 or later.
\tl_if_empty:nT { #1 } { \@@_fatal:n { empty~environment } }
\tl_map_inline:nn { #1 }
{
- \tl_if_eq:nnT { ##1 } { & }
+ \str_if_eq:nnT { ##1 } { & }
{ \@@_fatal:n { ampersand~in~light-syntax } }
- \tl_if_eq:nnT { ##1 } { \\ }
+ \str_if_eq:nnT { ##1 } { \\ }
{ \@@_fatal:n { double-backslash~in~light-syntax } }
}
% \end{macrocode}
-% The body of the environment, which is stored in the argument |#1|, is now
-% splitted into items (and \emph{not} tokens)
+% Now, you extract the |code-after| of the body of the environment. Maybe, there
+% is no command |\CodeAfter| in the body. That's why you put a marker
+% |\CodeAfter| after |#1|. If there is yet a |\CodeAfter| in |#1|, this second
+% (or third...) |\CodeAfter| will be catched in the value of
+% |\g_nicematrix_code_after_tl|. That doesn't matter because |\CodeAfter| will
+% be set to \textsl{no-op} before the execution of
+% |\g_nicematrix_code_after_tl|.
+% \begin{macrocode}
+ \@@_light_syntax_i #1 \CodeAfter \q_stop
+ }
+% \end{macrocode}
+% Now, the second part of the environment. It is empty. That's not surprising
+% because we have caught the whole body of the environment with the specifier
+% |b| provided by \pkg{xparse}.
+% \begin{macrocode}
+ { }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_light_syntax_i #1\CodeAfter #2\q_stop
+ {
+ \tl_gput_right:Nn \g_nicematrix_code_after_tl { #2 }
+% \end{macrocode}
+% The body of the array, which is stored in the argument |#1|, is now
+% splitted into items (and \emph{not} tokens).
% \begin{macrocode}
\seq_gclear_new:N \g_@@_rows_seq
\tl_set_rescan:Nno \l_@@_end_of_row_tl { } \l_@@_end_of_row_tl
@@ -5265,7 +8645,7 @@ version 2005/12/01 or later.
% Here is the call to |\array| (we have a dedicated macro |\@@_array:| because
% of compatibility with the classes \cls{revtex4-1} and \cls{revtex4-2}).
% \begin{macrocode}
- \exp_args:NV \@@_array: \l_tmpa_tl
+ \exp_args:NV \@@_array: \g_@@_preamble_tl
% \end{macrocode}
% We need a global affectation because, when executing |\l_tmpa_tl|, we will
% exit the first cell of the array.
@@ -5277,11 +8657,10 @@ version 2005/12/01 or later.
\endarray
}
% \end{macrocode}
-% Now, the second part of the environment. It is empty. That's not surprising
-% because we have caught the whole body of the environment with the specifier
-% |b| provided by \pkg{xparse}.
+%
% \begin{macrocode}
- { }
+\cs_new_protected:Npn \@@_line_with_light_syntax:n #1
+ { \tl_if_empty:nF { #1 } { \\ \@@_line_with_light_syntax_i:n { #1 } } }
% \end{macrocode}
%
% \begin{macrocode}
@@ -5291,22 +8670,10 @@ version 2005/12/01 or later.
\seq_gset_split:Nnn \g_@@_cells_seq { ~ } { #1 }
\seq_gpop_left:NN \g_@@_cells_seq \l_tmpa_tl
\l_tmpa_tl
- \seq_map_function:NN \g_@@_cells_seq \@@_cell_with_light_syntax:n
+ \seq_map_inline:Nn \g_@@_cells_seq { & ##1 }
}
% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_line_with_light_syntax:n #1
- {
- \tl_if_empty:nF { #1 }
- { \\ \@@_line_with_light_syntax_i:n { #1 } }
- }
-% \end{macrocode}
%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_cell_with_light_syntax:n #1 { & #1 }
-% \end{macrocode}
-%
% \bigskip
% The following command is used by the code which detects whether the
% environment is empty (we raise a fatal error in this case: it's only a
@@ -5326,30 +8693,77 @@ version 2005/12/01 or later.
%
% \bigskip
% The command |\@@_create_col_nodes:| will construct a special last row.
-% That last row is a false row used to create the |col|-nodes and to fix the
+% That last row is a false row used to create the |col| nodes and to fix the
% width of the columns (when the array is constructed with an option which
% specify the width of the columns).
% \begin{macrocode}
\cs_new:Npn \@@_create_col_nodes:
{
\crcr
- \int_compare:nNnT \c@iRow = 0 { \@@_fatal:n { Zero~row } }
- \int_compare:nNnT \l_@@_first_col_int = 0 { \omit & }
+ \int_compare:nNnT \l_@@_first_col_int = 0
+ {
+ \omit
+ \hbox_overlap_left:n
+ {
+ \bool_if:NT \l_@@_code_before_bool
+ { \pgfsys@markposition { \@@_env: - col - 0 } }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate { \@@_env: - col - 0 } \pgfpointorigin
+ \str_if_empty:NF \l_@@_name_str
+ { \pgfnodealias { \l_@@_name_str - col - 0 } { \@@_env: - col - 0 } }
+ \endpgfpicture
+ \skip_horizontal:N 2\col@sep
+ \skip_horizontal:N \g_@@_width_first_col_dim
+ }
+ &
+ }
\omit
% \end{macrocode}
% The following instruction must be put after the instruction |\omit|.
% \begin{macrocode}
\bool_gset_true:N \g_@@_row_of_col_done_bool
% \end{macrocode}
-% First, we put a ``|col|'' node on the left of the first column (of course, we
+% First, we put a |col| node on the left of the first column (of course, we
% have to do that \emph{after} the |\omit|).
% \begin{macrocode}
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \pgfcoordinate { \@@_env: - col - 1 } \pgfpointorigin
- \str_if_empty:NF \l_@@_name_str
- { \pgfnodealias { \@@_env: - col - 1 } { \l_@@_name_str - col - 1 } }
- \endpgfpicture
+ \int_compare:nNnTF \l_@@_first_col_int = 0
+ {
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \hbox
+ {
+ \skip_horizontal:N -0.5\arrayrulewidth
+ \pgfsys@markposition { \@@_env: - col - 1 }
+ \skip_horizontal:N 0.5\arrayrulewidth
+ }
+ }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate { \@@_env: - col - 1 }
+ { \pgfpoint { - 0.5 \arrayrulewidth } \c_zero_dim }
+ \str_if_empty:NF \l_@@_name_str
+ { \pgfnodealias { \l_@@_name_str - col - 1 } { \@@_env: - col - 1 } }
+ \endpgfpicture
+ }
+ {
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \hbox
+ {
+ \skip_horizontal:N 0.5\arrayrulewidth
+ \pgfsys@markposition { \@@_env: - col - 1 }
+ \skip_horizontal:N -0.5\arrayrulewidth
+ }
+ }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate { \@@_env: - col - 1 }
+ { \pgfpoint { 0.5 \arrayrulewidth } \c_zero_dim }
+ \str_if_empty:NF \l_@@_name_str
+ { \pgfnodealias { \l_@@_name_str - col - 1 } { \@@_env: - col - 1 } }
+ \endpgfpicture
+ }
% \end{macrocode}
% We compute in |\g_tmpa_skip| the common width of the columns (it's a skip and
% not a dimension). We use a global variable because we are in a cell of an
@@ -5359,7 +8773,7 @@ version 2005/12/01 or later.
%
% \smallskip
% We give a default value for |\g_tmpa_skip| (|0 pt plus 1 fill|) but it will
-% just after erased by a fixed value in the concerned cases.
+% just after be erased by a fixed value in the concerned cases.
% \begin{macrocode}
\skip_gset:Nn \g_tmpa_skip { 0 pt~plus 1 fill }
\bool_if:NF \l_@@_auto_columns_width_bool
@@ -5370,16 +8784,26 @@ version 2005/12/01 or later.
{ \bool_not_p:n \l_@@_block_auto_columns_width_bool }
{ \skip_gset_eq:NN \g_tmpa_skip \g_@@_max_cell_width_dim }
{ \skip_gset_eq:NN \g_tmpa_skip \l_@@_columns_width_dim }
- \skip_gadd:Nn \g_tmpa_skip { 2 \arraycolsep }
+ \skip_gadd:Nn \g_tmpa_skip { 2 \col@sep }
}
- \skip_horizontal:N \g_tmpa_skip
+ \skip_horizontal:N \g_tmpa_skip
\hbox
{
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \hbox
+ {
+ \skip_horizontal:N -0.5\arrayrulewidth
+ \pgfsys@markposition { \@@_env: - col - 2 }
+ \skip_horizontal:N 0.5\arrayrulewidth
+ }
+ }
\pgfpicture
\pgfrememberpicturepositiononpagetrue
- \pgfcoordinate { \@@_env: - col - 2 } \pgfpointorigin
+ \pgfcoordinate { \@@_env: - col - 2 }
+ { \pgfpoint { - 0.5 \arrayrulewidth } \c_zero_dim }
\str_if_empty:NF \l_@@_name_str
- { \pgfnodealias { \@@_env: - col - 2 } { \l_@@_name_str - col - 2 } }
+ { \pgfnodealias { \l_@@_name_str - col - 2 } { \@@_env: - col - 2 } }
\endpgfpicture
}
% \end{macrocode}
@@ -5391,28 +8815,61 @@ version 2005/12/01 or later.
{ \prg_replicate:nn { \g_@@_col_total_int - 2 } }
{ \prg_replicate:nn { \g_@@_col_total_int - 1 } }
{
- &
- \omit
+ &
+ \omit
+ \int_gincr:N \g_tmpa_int
% \end{macrocode}
% The incrementation of the counter |\g_tmpa_int| must be done after the |\omit|
% of the cell.
% \begin{macrocode}
- \int_gincr:N \g_tmpa_int
- \skip_horizontal:N \g_tmpa_skip
+ \skip_horizontal:N \g_tmpa_skip
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \hbox
+ {
+ \skip_horizontal:N -0.5\arrayrulewidth
+ \pgfsys@markposition { \@@_env: - col - \@@_succ:n \g_tmpa_int }
+ \skip_horizontal:N 0.5\arrayrulewidth
+ }
+ }
% \end{macrocode}
-% We create the ``|col|'' node on the right of the current column.
+% We create the |col| node on the right of the current column.
% \begin{macrocode}
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \pgfcoordinate { \@@_env: - col - \@@_succ:n \g_tmpa_int }
- \pgfpointorigin
- \str_if_empty:NF \l_@@_name_str
- {
- \pgfnodealias
- { \@@_env: - col - \@@_succ:n \g_tmpa_int }
- { \l_@@_name_str - col - \@@_succ:n \g_tmpa_int }
- }
- \endpgfpicture
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate { \@@_env: - col - \@@_succ:n \g_tmpa_int }
+ { \pgfpoint { - 0.5 \arrayrulewidth } \c_zero_dim }
+ \str_if_empty:NF \l_@@_name_str
+ {
+ \pgfnodealias
+ { \l_@@_name_str - col - \@@_succ:n \g_tmpa_int }
+ { \@@_env: - col - \@@_succ:n \g_tmpa_int }
+ }
+ \endpgfpicture
+ }
+ \bool_if:NT \g_@@_last_col_found_bool
+ {
+ \hbox_overlap_right:n
+ {
+ % \skip_horizontal:N \col@sep
+ \skip_horizontal:N \g_@@_width_last_col_dim
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \pgfsys@markposition
+ { \@@_env: - col - \@@_succ:n \g_@@_col_total_int }
+ }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate { \@@_env: - col - \@@_succ:n \g_@@_col_total_int }
+ \pgfpointorigin
+ \str_if_empty:NF \l_@@_name_str
+ {
+ \pgfnodealias
+ { \l_@@_name_str - col - \@@_succ:n \g_@@_col_total_int }
+ { \@@_env: - col - \@@_succ:n \g_@@_col_total_int }
+ }
+ \endpgfpicture
+ }
}
\cr
}
@@ -5427,13 +8884,14 @@ version 2005/12/01 or later.
{
>
{
+ \bool_gset_true:N \g_@@_after_col_zero_bool
\@@_begin_of_row:
% \end{macrocode}
% The contents of the cell is constructed in the box |\l_@@_cell_box| because we
% have to compute some dimensions of this box.
% \begin{macrocode}
\hbox_set:Nw \l_@@_cell_box
- \c_math_toggle_token
+ \@@_math_toggle_token:
\bool_if:NT \l_@@_small_bool \scriptstyle
% \end{macrocode}
% We insert |\l_@@_code_for_first_col_tl|... but we don't insert it in the
@@ -5458,8 +8916,10 @@ version 2005/12/01 or later.
l
<
{
- \c_math_toggle_token
+ \@@_math_toggle_token:
\hbox_set_end:
+ \bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box:
+ \@@_adjust_size_box:
\@@_update_for_first_and_last_row:
% \end{macrocode}
% We actualise the width of the ``first column'' because we will use this width
@@ -5480,7 +8940,8 @@ version 2005/12/01 or later.
\skip_horizontal:N \l_@@_left_margin_dim
\skip_horizontal:N \l_@@_extra_left_margin_dim
}
- \skip_horizontal:N -2\arraycolsep
+ \bool_gset_false:N \g_@@_empty_cell_bool
+ \skip_horizontal:N -2\col@sep
}
}
% \end{macrocode}
@@ -5505,7 +8966,7 @@ version 2005/12/01 or later.
% have to compute some dimensions of this box.
% \begin{macrocode}
\hbox_set:Nw \l_@@_cell_box
- \c_math_toggle_token
+ \@@_math_toggle_token:
\bool_if:NT \l_@@_small_bool \scriptstyle
% \end{macrocode}
% We insert |\l_@@_code_for_last_col_tl|... but we don't insert it in the
@@ -5525,8 +8986,10 @@ version 2005/12/01 or later.
l
<
{
- \c_math_toggle_token
+ \@@_math_toggle_token:
\hbox_set_end:
+ \bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box:
+ \@@_adjust_size_box:
\@@_update_for_first_and_last_row:
% \end{macrocode}
% We actualise the width of the ``last column'' because we will use this width
@@ -5534,7 +8997,7 @@ version 2005/12/01 or later.
% \begin{macrocode}
\dim_gset:Nn \g_@@_width_last_col_dim
{ \dim_max:nn \g_@@_width_last_col_dim { \box_wd:N \l_@@_cell_box } }
- \skip_horizontal:N -2\arraycolsep
+ \skip_horizontal:N -2\col@sep
% \end{macrocode}
% The content of the cell is inserted in an overlapping position.
% \label{overlap-right}
@@ -5549,6 +9012,7 @@ version 2005/12/01 or later.
\@@_node_for_the_cell:
}
}
+ \bool_gset_false:N \g_@@_empty_cell_bool
}
}
% \end{macrocode}
@@ -5580,81 +9044,37 @@ version 2005/12/01 or later.
% We create the variants of the environment |{NiceArrayWithDelims}|.
%
% \begin{macrocode}
-\NewDocumentEnvironment { pNiceArray } { }
- {
- \str_if_empty:NT \g_@@_name_env_str
- { \str_gset:Nn \g_@@_name_env_str { pNiceArray } }
- \@@_test_if_math_mode:
- \NiceArrayWithDelims ( )
- }
- { \endNiceArrayWithDelims }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\NewDocumentEnvironment { bNiceArray } { }
- {
- \str_if_empty:NT \g_@@_name_env_str
- { \str_gset:Nn \g_@@_name_env_str { bNiceArray } }
- \@@_test_if_math_mode:
- \NiceArrayWithDelims [ ]
- }
- { \endNiceArrayWithDelims }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\NewDocumentEnvironment { BNiceArray } { }
+\cs_new_protected:Npn \@@_def_env:nnn #1 #2 #3
{
- \str_if_empty:NT \g_@@_name_env_str
- { \str_gset:Nn \g_@@_name_env_str { BNiceArray } }
- \@@_test_if_math_mode:
- \NiceArrayWithDelims \{ \}
- }
- { \endNiceArrayWithDelims }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\NewDocumentEnvironment { vNiceArray } { }
- {
- \str_if_empty:NT \g_@@_name_env_str
- { \str_gset:Nn \g_@@_name_env_str { vNiceArray } }
- \@@_test_if_math_mode:
- \NiceArrayWithDelims | |
+ \NewDocumentEnvironment { #1 NiceArray } { }
+ {
+ \str_if_empty:NT \g_@@_name_env_str
+ { \str_gset:Nn \g_@@_name_env_str { #1 NiceArray } }
+ \@@_test_if_math_mode:
+ \NiceArrayWithDelims #2 #3
+ }
+ { \endNiceArrayWithDelims }
}
- { \endNiceArrayWithDelims }
% \end{macrocode}
%
% \begin{macrocode}
-\NewDocumentEnvironment { VNiceArray } { }
- {
- \str_if_empty:NT \g_@@_name_env_str
- { \str_gset:Nn \g_@@_name_env_str { VNiceArray } }
- \@@_test_if_math_mode:
- \NiceArrayWithDelims \| \|
- }
- { \endNiceArrayWithDelims }
+\@@_def_env:nnn p ( )
+\@@_def_env:nnn b [ ]
+\@@_def_env:nnn B \{ \}
+\@@_def_env:nnn v | |
+\@@_def_env:nnn V \| \|
% \end{macrocode}
+%
%
% \bigskip
% \subsection*{The environment \{NiceMatrix\} and its variants}
%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_define_env:n #1
- {
- \NewDocumentEnvironment { #1 NiceMatrix } { ! O { } }
- {
- \str_gset:Nn \g_@@_name_env_str { #1 NiceMatrix }
- \tl_set:Nn \l_@@_type_of_col_tl C
- \keys_set:nn { NiceMatrix / NiceMatrix } { ##1 }
- \exp_args:Nnx \@@_begin_of_NiceMatrix:nn { #1 } \l_@@_type_of_col_tl
- }
- { \end { #1 NiceArray } }
- }
-% \end{macrocode}
%
% \begin{macrocode}
\cs_new_protected:Npn \@@_begin_of_NiceMatrix:nn #1 #2
{
- \begin { #1 NiceArray }
+ \bool_set_true:N \l_@@_Matrix_bool
+ \use:c { #1 NiceArray }
{
*
{
@@ -5662,21 +9082,59 @@ version 2005/12/01 or later.
\c@MaxMatrixCols
{ \@@_pred:n \l_@@_last_col_int }
}
- #2
+ { > \@@_Cell: #2 < \@@_end_Cell: }
}
}
% \end{macrocode}
%
% \begin{macrocode}
-\@@_define_env:n { }
-\@@_define_env:n p
-\@@_define_env:n b
-\@@_define_env:n B
-\@@_define_env:n v
-\@@_define_env:n V
+\clist_map_inline:nn { { } , p , b , B , v , V }
+ {
+ \NewDocumentEnvironment { #1 NiceMatrix } { ! O { } }
+ {
+ \str_gset:Nn \g_@@_name_env_str { #1 NiceMatrix }
+ \tl_set:Nn \l_@@_type_of_col_tl c
+ \keys_set:nn { NiceMatrix / NiceMatrix } { ##1 }
+ \exp_args:Nne \@@_begin_of_NiceMatrix:nn { #1 } \l_@@_type_of_col_tl
+ }
+ { \use:c { end #1 NiceArray } }
+ }
% \end{macrocode}
%
-%
+% \bigskip
+% The following command will be linked to |\NotEmpty| in the environments of
+% \pkg{nicematrix}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_NotEmpty:
+ { \bool_gset_true:N \g_@@_not_empty_cell_bool }
+% \end{macrocode}
+%
+% \bigskip
+% \subsection*{The environments \{NiceTabular\} and \{NiceTabular*\}}
+%
+% \begin{macrocode}
+\NewDocumentEnvironment { NiceTabular } { O { } m ! O { } }
+ {
+ \str_gset:Nn \g_@@_name_env_str { NiceTabular }
+ \keys_set:nn { NiceMatrix / NiceTabular } { #1 , #3 }
+ \bool_set_true:N \l_@@_NiceTabular_bool
+ \NiceArray { #2 }
+ }
+ { \endNiceArray }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentEnvironment { NiceTabular* } { m O { } m ! O { } }
+ {
+ \str_gset:Nn \g_@@_name_env_str { NiceTabular* }
+ \dim_set:Nn \l_@@_tabular_width_dim { #1 }
+ \keys_set:nn { NiceMatrix / NiceTabular } { #2 , #4 }
+ \bool_set_true:N \l_@@_NiceTabular_bool
+ \NiceArray { #3 }
+ }
+ { \endNiceArray }
+% \end{macrocode}
%
%
% \bigskip
@@ -5762,7 +9220,47 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
+% If the key |code-before| is used, we have to write on the |aux| file the actual
+% size of the array.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \iow_now:Nn \@mainaux \ExplSyntaxOn
+ \iow_now:Nx \@mainaux
+ { \seq_clear_new:c { @@_size _ \int_use:N \g_@@_env_int _ seq } }
+ \iow_now:Nx \@mainaux
+ {
+ \seq_gset_from_clist:cn { @@_size _ \int_use:N \g_@@_env_int _ seq }
+ {
+ \int_use:N \l_@@_first_row_int ,
+ \int_use:N \g_@@_row_total_int ,
+ \int_use:N \l_@@_first_col_int ,
+% \end{macrocode}
+% If the user has used a key |last-row| in an environment with preamble (like
+% |{pNiceArray}|) and that that last row has not been found, we have to
+% increment the value because it will be decreased when used in the |code-before|.
+% \begin{macrocode}
+ \bool_lazy_and:nnTF
+ { \int_compare_p:nNn \l_@@_last_col_int > { -2 } }
+ { \bool_not_p:n \g_@@_last_col_found_bool }
+ \@@_succ:n
+ \int_use:N
+ \g_@@_col_total_int
+ }
+% \end{macrocode}
+% We write also the potential content of |\g_@@_pos_of_blocks_seq| (it will be
+% useful if the commands |\rowcolors| is used with the key |respect-blocks|.
+% \begin{macrocode}
+ \seq_gset_from_clist:cn
+ { c_@@_pos_of_blocks_ \int_use:N \g_@@_env_int _ seq }
+ { \seq_use:Nnnn \g_@@_pos_of_blocks_seq , , , }
+ }
+ \iow_now:Nn \@mainaux \ExplSyntaxOff
+ }
+% \end{macrocode}
+%
%
+%
% By default, the diagonal lines will be parallelized\footnote{It's possible to
% use the option |parallelize-diags| to disable this parallelization.}. There
% are two types of diagonals lines: the $|\Ddots|$ diagonals and the |\Iddots|
@@ -5790,13 +9288,6 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \begin{macrocode}
- \bool_if:nTF \l_@@_medium_nodes_bool
- {
- \bool_if:NTF \l_@@_large_nodes_bool
- \@@_create_medium_and_large_nodes:
- \@@_create_medium_nodes:
- }
- { \bool_if:NT \l_@@_large_nodes_bool \@@_create_large_nodes: }
\int_zero_new:N \l_@@_initial_i_int
\int_zero_new:N \l_@@_initial_j_int
\int_zero_new:N \l_@@_final_i_int
@@ -5823,23 +9314,60 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
-%
% \bigskip
-% Now, we really draw the lines.
+% Now, we actually draw the dotted lines (specified by |\Cdots|, |\Vdots|,
+% etc.).
% \begin{macrocode}
\@@_draw_dotted_lines:
% \end{macrocode}
%
-% We draw the vertical rules of the option |vlines| before the
-% |internal-code-after| because the option |white| of a |\Block| may have to
-% erase these vertical rules.
+% \bigskip
+% The following computes the ``corners'' (made up of empty cells) but if there
+% is no corner to compute, it will do nothing.
+% \begin{macrocode}
+ \@@_compute_corners:
+% \end{macrocode}
+%
+% \bigskip
+% The sequence |\g_@@_pos_of_blocks_seq| must be ``adjusted'' (for the case
+% where the user have written something like |\Block{1-}|).
+% \begin{macrocode}
+ \@@_adjust_pos_of_blocks_seq:
+% \end{macrocode}
+%
+% \bigskip
+% The following code is only for efficiency. We determine whether the potential
+% horizontal and vertical rules are ``complete'', that is to say drawn in the
+% whole array. We are sure that all the rules will be complete when there is no
+% block, no virtual block (determined by a command such as |\Cdots|, |\Vdots|,
+% etc.) and no corners. In that case, we switch to a shortcut version of
+% |\@@_vline_i:nn| and |\@@_hline:nn|.
+% \begin{macrocode}
+ \bool_lazy_all:nT
+ {
+ { \seq_if_empty_p:N \g_@@_pos_of_blocks_seq }
+ { \seq_if_empty_p:N \g_@@_pos_of_xdots_seq }
+ { \seq_if_empty_p:N \l_@@_empty_corner_cells_seq }
+ }
+ {
+ \cs_set_eq:NN \@@_vline_i:nn \@@_vline_i_complete:nn
+ \cs_set_eq:NN \@@_hline_i:nn \@@_hline_i_complete:nn
+ }
+ \bool_if:NT \l_@@_hlines_bool \@@_draw_hlines:
+ \bool_if:NT \l_@@_vlines_bool \@@_draw_vlines:
+% \end{macrocode}
+%
% \begin{macrocode}
- \bool_if:NT \l_@@_vlines_bool \@@_draw_vlines:
\g_@@_internal_code_after_tl
\tl_gclear:N \g_@@_internal_code_after_tl
+% \end{macrocode}
+%
+% \bigskip
+% Now, the |code-after|.
+% \begin{macrocode}
\bool_if:NT \c_@@_tikz_loaded_bool
{
- \tikzset
+ \tikzset
{
every~picture / .style =
{
@@ -5850,15 +9378,125 @@ version 2005/12/01 or later.
}
}
\cs_set_eq:NN \line \@@_line
- \g_@@_code_after_tl
- \tl_gclear:N \g_@@_code_after_tl
+ \cs_set_eq:NN \SubMatrix \@@_SubMatrix
+% \end{macrocode}
+% When |light-syntax| is used, we insert systematically a |\CodeAfter| in the
+% flow. Thus, it's possible to have two instructions |\CodeAfter| and the second
+% may be in |\g_nicematrix_code_after_tl|. That's why we set
+% |\Code-after| to be \textsl{no-op} now.
+% \begin{macrocode}
+ \cs_set_eq:NN \CodeAfter \prg_do_nothing:
+% \end{macrocode}
+%
+% We clear the list of the names of the potential |\SubMatrix| that will appear
+% in the |code-after| (unfortunately, that list has to be global).
+% \begin{macrocode}
+ \seq_gclear:N \g_@@_submatrix_names_seq
+% \end{macrocode}
+% And here's the |code-after|. Since the |code-after| may begin with an
+% ``argument'' between square brackets of the options, we extract and treat that
+% potential ``argument'' with the command |\@@_CodeAfter_keys:|.
+% \begin{macrocode}
+ \exp_last_unbraced:NV \@@_CodeAfter_keys: \g_nicematrix_code_after_tl
+ \scan_stop:
+ \tl_gclear:N \g_nicematrix_code_after_tl
\group_end:
+% \end{macrocode}
+%
+%
+% \medskip
+% |\g_nicematrix_code_before_tl| is for instructions in the cells of the array such as
+% |\rowcolor| and |\cellcolor| (when the key |colortbl-like| is in
+% force). These instructions will be written on the |aux| file to be added to
+% the |code-before| in the next run.
+% \begin{macrocode}
+ \tl_if_empty:NF \g_nicematrix_code_before_tl
+ {
+% \end{macrocode}
+% The command |\rowcolor| in tabular will in fact use |\rectanglecolor| in order
+% to follow the behaviour of |\rowcolor| of \pkg{colortbl}. That's why there may
+% be a command |\rectanglecolor| in |\g_nicematrix_code_before_tl|. In order to avoid an
+% error during the expansion, we define a protected version of |\rectanglecolor|.
+% \begin{macrocode}
+ \cs_set_protected:Npn \rectanglecolor { }
+ \cs_set_protected:Npn \columncolor { }
+ \iow_now:Nn \@mainaux \ExplSyntaxOn
+ \iow_now:Nx \@mainaux
+ {
+ \tl_gset:cn
+ { g_@@_code_before_ \int_use:N \g_@@_env_int _ tl }
+ { \exp_not:V \g_nicematrix_code_before_tl }
+ }
+ \iow_now:Nn \@mainaux \ExplSyntaxOff
+ \bool_set_true:N \l_@@_code_before_bool
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
\str_gclear:N \g_@@_name_env_str
\@@_restore_iRow_jCol:
+% \end{macrocode}
+% The command |\CT@arc@| contains the instruction of color for the rules of the
+% array\footnote{e.g. |\color[rgb]{0.5,0.5,0}|}. This command is used by
+% |\CT@arc@| but we use it also for compatibility with \pkg{colortbl}. But we
+% want also to be able to use color for the rules of the array when
+% \pkg{colortbl} is \emph{not} loaded. That's why we do the following
+% instruction which is in the patch of the end of arrays done by \pkg{colortbl}.
+% \begin{macrocode}
+ \cs_gset_eq:NN \CT@arc@ \@@_old_CT@arc@
}
% \end{macrocode}
%
% \bigskip
+% The following command will extract the potential options (between square
+% brackets) at the beginning of the |code-after| (that is to say, when
+% |\CodeAfter| is used, the options of that ``command'' |\CodeAfter|).
+% \begin{macrocode}
+\NewDocumentCommand \@@_CodeAfter_keys: { O { } }
+ { \keys_set:nn { NiceMatrix / CodeAfter } { #1 } }
+% \end{macrocode}
+%
+%
+% \bigskip
+% We remind that the first mandatory argument of the command |\Block| is the
+% size of the block with the special format $i$|-|$j$. However, the user is
+% allowed to omit $i$ or $j$ (or both). This will be interpreted as: the last
+% row (resp. column) of the block will be the last row (resp. column) of the
+% block (without the potential exterior row---resp. column---of the array). By
+% convention, this is stored in |\g_@@_pos_of_blocks_seq| (and
+% |\g_@@_blocks_seq|) as a number of rows (resp. columns) for the block equal to
+% 100. It's possible, after the construction of the array, to replace these
+% values by the correct ones (since we know the number of rows and columns of
+% the array).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_adjust_pos_of_blocks_seq:
+ {
+ \seq_gset_map_x:NNn \g_@@_pos_of_blocks_seq \g_@@_pos_of_blocks_seq
+ { \@@_adjust_pos_of_blocks_seq_i:nnnn ##1 }
+ }
+% \end{macrocode}
+%
+% The following command must \emph{not} be protected.
+% \begin{macrocode}
+\cs_new:Npn \@@_adjust_pos_of_blocks_seq_i:nnnn #1 #2 #3 #4
+ {
+ { #1 }
+ { #2 }
+ {
+ \int_compare:nNnTF { #3 } > { 99 }
+ { \int_use:N \c@iRow }
+ { #3 }
+ }
+ {
+ \int_compare:nNnTF { #4 } > { 99 }
+ { \int_use:N \c@jCol }
+ { #4 }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
% We recall that, when externalization is used, |\tikzpicture| and
% |\endtikzpicture| (or |\pgfpicture| and |\endpgfpicture|) must be directly
% ``visible''. That's why we have to define the adequate version of
@@ -5883,7 +9521,7 @@ version 2005/12/01 or later.
{
\pgfrememberpicturepositiononpagetrue
\pgf@relevantforpicturesizefalse
- \g_@@_Hdotsfor_lines_tl
+ \g_@@_HVdotsfor_lines_tl
\g_@@_Vdots_lines_tl
\g_@@_Ddots_lines_tl
\g_@@_Iddots_lines_tl
@@ -5896,12 +9534,15 @@ version 2005/12/01 or later.
% \begin{macrocode}
\cs_new_protected:Npn \@@_restore_iRow_jCol:
{
- \cs_if_exist:NT \theiRow { \int_gset_eq:NN \c@iRow \l_@@_save_iRow_int }
- \cs_if_exist:NT \thejCol { \int_gset_eq:NN \c@jCol \l_@@_save_jCol_int }
+ \cs_if_exist:NT \theiRow { \int_gset_eq:NN \c@iRow \l_@@_old_iRow_int }
+ \cs_if_exist:NT \thejCol { \int_gset_eq:NN \c@jCol \l_@@_old_jCol_int }
}
% \end{macrocode}
%
+%
% \bigskip
+% \subsection*{We draw the dotted lines}
+%
% A dotted line will be said \emph{open} in one of its extremities when it stops
% on the edge of the matrix and \emph{closed} otherwise. In the following
% matrix, the dotted line is closed on its left extremity and open on its right.
@@ -5922,7 +9563,7 @@ version 2005/12/01 or later.
% \item the third argument is the $x$-value of the orientation vector of the
% line;
% \item the fourth argument is the $y$-value of the orientation vector of the
-% line;
+% line.
% \end{itemize}
%
% This command computes:
@@ -5954,7 +9595,8 @@ version 2005/12/01 or later.
% \end{macrocode}
% We will do two loops: one when determinating the initial cell and the other
% when determinating the final cell. The boolean |\l_@@_stop_loop_bool| will be
-% used to control these loops.
+% used to control these loops. In the first loop, we search the ``final''
+% extremity of the line.
% \begin{macrocode}
\bool_set_false:N \l_@@_stop_loop_bool
\bool_do_until:Nn \l_@@_stop_loop_bool
@@ -5967,8 +9609,12 @@ version 2005/12/01 or later.
\bool_set_false:N \l_@@_final_open_bool
\int_compare:nNnTF \l_@@_final_i_int > \c@iRow
{
- \int_compare:nNnT { #3 } = 1
+ \int_compare:nNnTF { #3 } = 1
{ \bool_set_true:N \l_@@_final_open_bool }
+ {
+ \int_compare:nNnT \l_@@_final_j_int > \c@jCol
+ { \bool_set_true:N \l_@@_final_open_bool }
+ }
}
{
\int_compare:nNnTF \l_@@_final_j_int < 1
@@ -6026,7 +9672,7 @@ version 2005/12/01 or later.
% \end{macrocode}
% If the case is empty, we declare that the cell as non-empty. Indeed, we will
% draw a dotted line and the cell will be on that dotted line. All the cells of
-% a dotted line have to be mark as ``dotted'' because we don't want
+% a dotted line have to be marked as ``dotted'' because we don't want
% intersections between dotted lines. We recall that the research of the
% extremities of the lines are all done in the same TeX group (the group of the
% environnement), even though, when the extremities are found, each line is
@@ -6058,8 +9704,12 @@ version 2005/12/01 or later.
\bool_set_false:N \l_@@_initial_open_bool
\int_compare:nNnTF \l_@@_initial_i_int < 1
{
- \int_compare:nNnT { #3 } = 1
+ \int_compare:nNnTF { #3 } = 1
{ \bool_set_true:N \l_@@_initial_open_bool }
+ {
+ \int_compare:nNnT \l_@@_initial_j_int = 0
+ { \bool_set_true:N \l_@@_initial_open_bool }
+ }
}
{
\int_compare:nNnTF \l_@@_initial_j_int < 1
@@ -6114,15 +9764,23 @@ version 2005/12/01 or later.
}
}
}
+% \end{macrocode}
+% We remind the rectangle described by all the dotted lines in order to respect
+% the corresponding virtual ``block'' when drawing the horizontal and vertical
+% rules.
+% \begin{macrocode}
+ \seq_gput_right:Nx \g_@@_pos_of_xdots_seq
+ {
+ { \int_use:N \l_@@_initial_i_int }
+ { \int_use:N \l_@@_initial_j_int }
+ { \int_use:N \l_@@_final_i_int }
+ { \int_use:N \l_@@_final_j_int }
+ }
}
% \end{macrocode}
%
% \medskip
% \begin{macrocode}
-\cs_new:Nn \@@_initial_cell:
- { \@@_env: - \int_use:N \l_@@_initial_i_int - \int_use:N \l_@@_initial_j_int }
-\cs_new:Nn \@@_final_cell:
- { \@@_env: - \int_use:N \l_@@_final_i_int - \int_use:N \l_@@_final_j_int }
\cs_new_protected:Npn \@@_set_initial_coords:
{
\dim_set_eq:NN \l_@@_x_initial_dim \pgf@x
@@ -6135,12 +9793,24 @@ version 2005/12/01 or later.
}
\cs_new_protected:Npn \@@_set_initial_coords_from_anchor:n #1
{
- \pgfpointanchor \@@_initial_cell: { #1 }
+ \pgfpointanchor
+ {
+ \@@_env:
+ - \int_use:N \l_@@_initial_i_int
+ - \int_use:N \l_@@_initial_j_int
+ }
+ { #1 }
\@@_set_initial_coords:
}
\cs_new_protected:Npn \@@_set_final_coords_from_anchor:n #1
{
- \pgfpointanchor \@@_final_cell: { #1 }
+ \pgfpointanchor
+ {
+ \@@_env:
+ - \int_use:N \l_@@_final_i_int
+ - \int_use:N \l_@@_final_j_int
+ }
+ { #1 }
\@@_set_final_coords:
}
% \end{macrocode}
@@ -6197,36 +9867,30 @@ version 2005/12/01 or later.
{
\bool_if:NTF \l_@@_initial_open_bool
{
- \@@_qpoint: { col - \int_use:N \l_@@_initial_j_int }
+ \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int }
\dim_set_eq:NN \l_@@_x_initial_dim \pgf@x
- \dim_add:Nn \l_@@_x_initial_dim \arraycolsep
- \@@_qpoint: { row - \int_use:N \l_@@_initial_i_int - base }
+ \dim_add:Nn \l_@@_x_initial_dim \col@sep
+ \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int - base }
\dim_set_eq:NN \l_@@_y_initial_dim \pgf@y
}
{ \@@_set_initial_coords_from_anchor:n { base~east } }
\bool_if:NTF \l_@@_final_open_bool
{
- \@@_qpoint: { col - \@@_succ:n \l_@@_final_j_int }
+ \@@_qpoint:n { col - \@@_succ:n \l_@@_final_j_int }
\dim_set_eq:NN \l_@@_x_final_dim \pgf@x
- \dim_sub:Nn \l_@@_x_final_dim \arraycolsep
- \@@_qpoint: { row - \int_use:N \l_@@_final_i_int - base }
+ \dim_sub:Nn \l_@@_x_final_dim \col@sep
+ \@@_qpoint:n { row - \int_use:N \l_@@_final_i_int - base }
\dim_set_eq:NN \l_@@_y_final_dim \pgf@y
}
{ \@@_set_final_coords_from_anchor:n { base~west } }
% \end{macrocode}
% We raise the line of a quantity equal to the radius of the dots because we
-% want the dots really ``on'' the line of texte.
+% want the dots really ``on'' the line of texte. Of course, maybe we should not
+% do that when the option |line-style| is used (?).
% \begin{macrocode}
\dim_add:Nn \l_@@_y_initial_dim \l_@@_radius_dim
\dim_add:Nn \l_@@_y_final_dim \l_@@_radius_dim
\@@_draw_line:
-% \end{macrocode}
-% The values of |\l_@@_x_initial_dim|, |\l_@@_y_initial_dim|, |\l_@@_x_final_dim|,
-% |\l_@@_y_final_dim|,
-%
-% |\l_@@_initial_open_bool| and |\l_@@_final_open_bool| are still available
-% after the |\@@_draw_line:|.
-% \begin{macrocode}
}
% \end{macrocode}
%
@@ -6280,25 +9944,25 @@ version 2005/12/01 or later.
{
\bool_if:NTF \l_@@_initial_open_bool
{
- \@@_qpoint: { col - \int_use:N \l_@@_initial_j_int }
+ \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int }
\dim_set_eq:NN \l_@@_x_initial_dim \pgf@x
- \dim_add:Nn \l_@@_x_initial_dim \arraycolsep
+ \dim_add:Nn \l_@@_x_initial_dim \col@sep
}
{ \@@_set_initial_coords_from_anchor:n { mid~east } }
\bool_if:NTF \l_@@_final_open_bool
{
- \@@_qpoint: { col - \@@_succ:n \l_@@_final_j_int }
+ \@@_qpoint:n { col - \@@_succ:n \l_@@_final_j_int }
\dim_set_eq:NN \l_@@_x_final_dim \pgf@x
- \dim_sub:Nn \l_@@_x_final_dim \arraycolsep
+ \dim_sub:Nn \l_@@_x_final_dim \col@sep
}
{ \@@_set_final_coords_from_anchor:n { mid~west } }
\bool_lazy_and:nnTF
\l_@@_initial_open_bool
\l_@@_final_open_bool
{
- \@@_qpoint: { row - \int_use:N \l_@@_initial_i_int }
+ \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int }
\dim_set_eq:NN \l_tmpa_dim \pgf@y
- \@@_qpoint: { row - \@@_succ:n \l_@@_initial_i_int }
+ \@@_qpoint:n { row - \@@_succ:n \l_@@_initial_i_int }
\dim_set:Nn \l_@@_y_initial_dim { ( \l_tmpa_dim + \pgf@y ) / 2 }
\dim_set_eq:NN \l_@@_y_final_dim \l_@@_y_initial_dim
}
@@ -6309,13 +9973,6 @@ version 2005/12/01 or later.
{ \dim_set_eq:NN \l_@@_y_final_dim \l_@@_y_initial_dim }
}
\@@_draw_line:
-% \end{macrocode}
-% The values of |\l_@@_x_initial_dim|, |\l_@@_y_initial_dim|, |\l_@@_x_final_dim|,
-% |\l_@@_y_final_dim|,
-%
-% |\l_@@_initial_open_bool| and |\l_@@_final_open_bool| are still available
-% after the |\@@_draw_line:|.
-% \begin{macrocode}
}
% \end{macrocode}
%
@@ -6325,7 +9982,6 @@ version 2005/12/01 or later.
% \begin{macrocode}
\cs_new_protected:Npn \@@_draw_Vdots:nnn #1 #2 #3
{
- \tl_if_empty:VF \l_@@_xdots_color_tl { \color { \l_@@_xdots_color_tl } }
\cs_if_free:cT { @@ _ dotted _ #1 - #2 }
{
\@@_find_extremities_of_line:nnnn { #1 } { #2 } 1 0
@@ -6342,6 +9998,8 @@ version 2005/12/01 or later.
{ \color { nicematrix-last-col } }
}
\keys_set:nn { NiceMatrix / xdots } { #3 }
+ \tl_if_empty:VF \l_@@_xdots_color_tl
+ { \color { \l_@@_xdots_color_tl } }
\@@_actually_draw_Vdots:
\group_end:
}
@@ -6358,12 +10016,14 @@ version 2005/12/01 or later.
% \item |\l_@@_final_j_int|
% \item |\l_@@_final_open_bool|.
% \end{itemize}
+%
+% The following function is also used by |\Vdotsfor|.
% \begin{macrocode}
\cs_new_protected:Npn \@@_actually_draw_Vdots:
{
% \end{macrocode}
-% The boolean |\l_tmpa_bool| indicates whether the column is of type |l| (|L| of
-% |{NiceArray}|) or may be considered as if.
+% The boolean |\l_tmpa_bool| indicates whether the column is of type |l| or may
+% be considered as if.
% \begin{macrocode}
\bool_set_false:N \l_tmpa_bool
\bool_lazy_or:nnF \l_@@_initial_open_bool \l_@@_final_open_bool
@@ -6374,18 +10034,18 @@ version 2005/12/01 or later.
{ \dim_compare_p:nNn \l_@@_x_initial_dim = \l_@@_x_final_dim }
}
% \end{macrocode}
-% Now, we try to determine whether the column is of type |c| (|C| of
-% |{NiceArray}|) or may be considered as if.
+% Now, we try to determine whether the column is of type |c| or may be
+% considered as if.
% \begin{macrocode}
\bool_if:NTF \l_@@_initial_open_bool
{
- \@@_qpoint: { row - 1 }
+ \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int }
\dim_set_eq:NN \l_@@_y_initial_dim \pgf@y
}
{ \@@_set_initial_coords_from_anchor:n { south } }
\bool_if:NTF \l_@@_final_open_bool
{
- \@@_qpoint: { row - \@@_succ:n \c@iRow }
+ \@@_qpoint:n { row - \@@_succ:n \l_@@_final_i_int }
\dim_set_eq:NN \l_@@_y_final_dim \pgf@y
}
{ \@@_set_final_coords_from_anchor:n { north } }
@@ -6393,11 +10053,27 @@ version 2005/12/01 or later.
{
\bool_if:NTF \l_@@_final_open_bool
{
- \@@_qpoint: { col - \int_use:N \l_@@_initial_j_int }
+ \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int }
\dim_set_eq:NN \l_tmpa_dim \pgf@x
- \@@_qpoint: { col - \@@_succ:n \l_@@_initial_j_int }
+ \@@_qpoint:n { col - \@@_succ:n \l_@@_initial_j_int }
\dim_set:Nn \l_@@_x_initial_dim { ( \pgf@x + \l_tmpa_dim ) / 2 }
\dim_set_eq:NN \l_@@_x_final_dim \l_@@_x_initial_dim
+% \end{macrocode}
+% We may think that the final user won't use a ``last column'' which contains
+% only a command |\Vdots|. However, if the |\Vdots| is in fact used to draw, not
+% a dotted line, but an arrow (to indicate the number of rows of the matrix), it
+% may be really encountered.
+% \begin{macrocode}
+ \int_compare:nNnT \l_@@_last_col_int > { -2 }
+ {
+ \int_compare:nNnT \l_@@_initial_j_int = \g_@@_col_total_int
+ {
+ \dim_set_eq:NN \l_tmpa_dim \l_@@_right_margin_dim
+ \dim_add:Nn \l_tmpa_dim \l_@@_extra_right_margin_dim
+ \dim_add:Nn \l_@@_x_initial_dim \l_tmpa_dim
+ \dim_add:Nn \l_@@_x_final_dim \l_tmpa_dim
+ }
+ }
}
{ \dim_set_eq:NN \l_@@_x_initial_dim \l_@@_x_final_dim }
}
@@ -6422,13 +10098,6 @@ version 2005/12/01 or later.
}
}
\@@_draw_line:
-% \end{macrocode}
-% The values of |\l_@@_x_initial_dim|, |\l_@@_y_initial_dim|, |\l_@@_x_final_dim|,
-% |\l_@@_y_final_dim|,
-%
-% |\l_@@_initial_open_bool| and |\l_@@_final_open_bool| are
-% still available after the |\@@_draw_line:|.
-% \begin{macrocode}
}
% \end{macrocode}
%
@@ -6475,17 +10144,17 @@ version 2005/12/01 or later.
{
\bool_if:NTF \l_@@_initial_open_bool
{
- \@@_qpoint: { row - \int_use:N \l_@@_initial_i_int }
+ \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int }
\dim_set_eq:NN \l_@@_y_initial_dim \pgf@y
- \@@_qpoint: { col - \int_use:N \l_@@_initial_j_int }
+ \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int }
\dim_set_eq:NN \l_@@_x_initial_dim \pgf@x
}
{ \@@_set_initial_coords_from_anchor:n { south~east } }
\bool_if:NTF \l_@@_final_open_bool
{
- \@@_qpoint: { row - \@@_succ:n \l_@@_final_i_int }
+ \@@_qpoint:n { row - \@@_succ:n \l_@@_final_i_int }
\dim_set_eq:NN \l_@@_y_final_dim \pgf@y
- \@@_qpoint: { col - \@@_succ:n \l_@@_final_j_int }
+ \@@_qpoint:n { col - \@@_succ:n \l_@@_final_j_int }
\dim_set_eq:NN \l_@@_x_final_dim \pgf@x
}
{ \@@_set_final_coords_from_anchor:n { north~west } }
@@ -6528,13 +10197,6 @@ version 2005/12/01 or later.
}
}
\@@_draw_line:
-% \end{macrocode}
-% The values of |\l_@@_x_initial_dim|, |\l_@@_y_initial_dim|, |\l_@@_x_final_dim|,
-% |\l_@@_y_final_dim|,
-%
-% |\l_@@_initial_open_bool| and |\l_@@_final_open_bool| are still available
-% after the |\@@_draw_line:|.
-% \begin{macrocode}
}
% \end{macrocode}
%
@@ -6579,17 +10241,17 @@ version 2005/12/01 or later.
{
\bool_if:NTF \l_@@_initial_open_bool
{
- \@@_qpoint: { row - \int_use:N \l_@@_initial_i_int }
+ \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int }
\dim_set_eq:NN \l_@@_y_initial_dim \pgf@y
- \@@_qpoint: { col - \@@_succ:n \l_@@_initial_j_int }
+ \@@_qpoint:n { col - \@@_succ:n \l_@@_initial_j_int }
\dim_set_eq:NN \l_@@_x_initial_dim \pgf@x
}
{ \@@_set_initial_coords_from_anchor:n { south~west } }
\bool_if:NTF \l_@@_final_open_bool
{
- \@@_qpoint: { row - \@@_succ:n \l_@@_final_i_int }
+ \@@_qpoint:n { row - \@@_succ:n \l_@@_final_i_int }
\dim_set_eq:NN \l_@@_y_final_dim \pgf@y
- \@@_qpoint: { col - \int_use:N \l_@@_final_j_int }
+ \@@_qpoint:n { col - \int_use:N \l_@@_final_j_int }
\dim_set_eq:NN \l_@@_x_final_dim \pgf@x
}
{ \@@_set_final_coords_from_anchor:n { north~east } }
@@ -6613,29 +10275,11 @@ version 2005/12/01 or later.
}
}
\@@_draw_line:
-% \end{macrocode}
-% The values of |\l_@@_x_initial_dim|, |\l_@@_y_initial_dim|, |\l_@@_x_final_dim|,
-% |\l_@@_y_final_dim|,
-%
-% |\l_@@_initial_open_bool| and |\l_@@_final_open_bool| are still available
-% after the |\@@_draw_line:|.
-% \begin{macrocode}
}
% \end{macrocode}
%
%
% \bigskip
-% The command |\NiceMatrixLastEnv| is not used by the package \pkg{nicematrix}.
-% It's only a facility given to the final user. It gives the number of the last
-% environment (in fact the number of the current environment but it's meant to
-% be used after the environment in order to refer to that environment --- and
-% its nodes --- without having to give it a name).
-% \begin{macrocode}
-\NewExpandableDocumentCommand \NiceMatrixLastEnv { }
- { \int_use:N \g_@@_env_int }
-% \end{macrocode}
-%
-% \bigskip
% \subsection*{The actual instructions for drawing the dotted line with Tikz}
%
% The command |\@@_draw_line:| should be used in a |{pgfpicture}|. It has six
@@ -6669,9 +10313,9 @@ version 2005/12/01 or later.
% \begin{macrocode}
\cs_new_protected:Npn \@@_draw_non_standard_dotted_line:
{
- \begin { scope }
- \exp_args:No \@@_draw_non_standard_dotted_line:n
- { \l_@@_xdots_line_style_tl , \l_@@_xdots_color_tl }
+ \begin { scope }
+ \exp_args:No \@@_draw_non_standard_dotted_line:n
+ { \l_@@_xdots_line_style_tl , \l_@@_xdots_color_tl }
}
% \end{macrocode}
% We have used the fact that, in \textsc{pgf}, un color name can be put directly
@@ -6682,6 +10326,16 @@ version 2005/12/01 or later.
% \begin{macrocode}
\cs_new_protected:Npn \@@_draw_non_standard_dotted_line:n #1
{
+ \@@_draw_non_standard_dotted_line:nVV
+ { #1 }
+ \l_@@_xdots_up_tl
+ \l_@@_xdots_down_tl
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_non_standard_dotted_line:nnn #1 #2 #3
+ {
\draw
[
#1 ,
@@ -6689,19 +10343,69 @@ version 2005/12/01 or later.
shorten~< = \l_@@_xdots_shorten_dim ,
]
( \l_@@_x_initial_dim , \l_@@_y_initial_dim )
- -- ( \l_@@_x_final_dim , \l_@@_y_final_dim ) ;
+% \end{macrocode}
+% Be careful: We can't put |\c_math_toggle_token| instead of |$| in the
+% following lines because we are in the contents of Tikz nodes (and they will be
+% \emph{rescanned} if the Tikz library \pkg{babel} is loaded).
+% \begin{macrocode}
+ -- node [ sloped , above ] { $ \scriptstyle #2 $ }
+ node [ sloped , below ] { $ \scriptstyle #3 $ }
+ ( \l_@@_x_final_dim , \l_@@_y_final_dim ) ;
\end { scope }
}
+\cs_generate_variant:Nn \@@_draw_non_standard_dotted_line:nnn { n V V }
% \end{macrocode}
%
% \bigskip
% The command |\@@_draw_standard_dotted_line:| draws the line with our system of points
-% (which give a dotted line with real round points).
+% (which gives a dotted line with real round points).
% \begin{macrocode}
\cs_new_protected:Npn \@@_draw_standard_dotted_line:
{
- \pgfrememberpicturepositiononpagetrue
- \pgf@relevantforpicturesizefalse
+ \bool_lazy_and:nnF
+ { \tl_if_empty_p:N \l_@@_xdots_up_tl }
+ { \tl_if_empty_p:N \l_@@_xdots_down_tl }
+ {
+ \pgfscope
+ \pgftransformshift
+ {
+ \pgfpointlineattime { 0.5 }
+ { \pgfpoint \l_@@_x_initial_dim \l_@@_y_initial_dim }
+ { \pgfpoint \l_@@_x_final_dim \l_@@_y_final_dim }
+ }
+ \pgftransformrotate
+ {
+ \fp_eval:n
+ {
+ atand
+ (
+ \l_@@_y_final_dim - \l_@@_y_initial_dim ,
+ \l_@@_x_final_dim - \l_@@_x_initial_dim
+ )
+ }
+ }
+ \pgfnode
+ { rectangle }
+ { south }
+ {
+ \c_math_toggle_token
+ \scriptstyle \l_@@_xdots_up_tl
+ \c_math_toggle_token
+ }
+ { }
+ { \pgfusepath { } }
+ \pgfnode
+ { rectangle }
+ { north }
+ {
+ \c_math_toggle_token
+ \scriptstyle \l_@@_xdots_down_tl
+ \c_math_toggle_token
+ }
+ { }
+ { \pgfusepath { } }
+ \endpgfscope
+ }
\group_begin:
% \end{macrocode}
% The dimension |\l_@@_l_dim| is the length $\ell$ of the line to draw. We use
@@ -6730,7 +10434,7 @@ version 2005/12/01 or later.
\bool_lazy_or:nnF
{ \dim_compare_p:nNn { \dim_abs:n \l_@@_l_dim } > \c_@@_max_l_dim }
{ \dim_compare_p:nNn \l_@@_l_dim = \c_zero_dim }
- \@@_actually_draw_line:
+ \@@_draw_standard_dotted_line_i:
\group_end:
}
% \end{macrocode}
@@ -6740,7 +10444,7 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \begin{macrocode}
-\cs_new_protected:Npn \@@_actually_draw_line:
+\cs_new_protected:Npn \@@_draw_standard_dotted_line_i:
{
% \end{macrocode}
% The integer |\l_tmpa_int| is the number of dots of the dotted line.
@@ -6771,7 +10475,7 @@ version 2005/12/01 or later.
\l_@@_inter_dots_dim
}
}
- {
+ {
\int_set:Nn \l_tmpa_int
{
\dim_ratio:nn
@@ -6854,68 +10558,153 @@ version 2005/12/01 or later.
% \pkg{nicematrix} rely upon |{NiceArray}|).
%
% The starred versions of these commands are deprecated since version~3.1 but,
-% as for now, they are still available with an error.
+% as of now, they are still available with an error.
+%
+%
+% \medskip
+% The syntax of these commands uses the character |_| as embellishment and
+% thats' why we have to insert a character |_| in the \emph{arg spec} of these
+% commands. However, we don't know the future catcode of |_| in the main
+% document (maybe the user will use \pkg{underscore}, and, in that case, the
+% catcode is $13$ because \pkg{underscore} activates |_|). That's why these
+% commands will be defined in a |\AtBeginDocument| and the \emph{arg spec} will
+% be rescanned.
+%
% \begin{macrocode}
-\NewDocumentCommand \@@_Ldots { s O { } }
- {
- \bool_if:nTF { #1 }
- { \@@_error:n { starred~commands } }
- { \@@_instruction_of_type:nn { Ldots } { #2 } }
- \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_ldots }
- \bool_gset_true:N \g_@@_empty_cell_bool
- }
+\AtBeginDocument
+ {
+ \tl_set:Nn \l_@@_argspec_tl { O { } E { _ ^ } { { } { } } }
+ \tl_set_rescan:Nno \l_@@_argspec_tl { } \l_@@_argspec_tl
+ \exp_args:NNV \NewDocumentCommand \@@_Ldots \l_@@_argspec_tl
+ {
+ \int_compare:nNnTF \c@jCol = 0
+ { \@@_error:nn { in~first~col } \Ldots }
+ {
+ \int_compare:nNnTF \c@jCol = \l_@@_last_col_int
+ { \@@_error:nn { in~last~col } \Ldots }
+ {
+ \@@_instruction_of_type:nnn \c_false_bool { Ldots }
+ { #1 , down = #2 , up = #3 }
+ }
+ }
+ \bool_if:NF \l_@@_nullify_dots_bool
+ { \phantom { \ensuremath { \@@_old_ldots } } }
+ \bool_gset_true:N \g_@@_empty_cell_bool
+ }
% \end{macrocode}
%
% \bigskip
% \begin{macrocode}
-\NewDocumentCommand \@@_Cdots { s O { } }
- {
- \bool_if:nTF { #1 }
- { \@@_error:n { starred~commands } }
- { \@@_instruction_of_type:nn { Cdots } { #2 } }
- \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_cdots }
- \bool_gset_true:N \g_@@_empty_cell_bool
- }
+ \exp_args:NNV \NewDocumentCommand \@@_Cdots \l_@@_argspec_tl
+ {
+ \int_compare:nNnTF \c@jCol = 0
+ { \@@_error:nn { in~first~col } \Cdots }
+ {
+ \int_compare:nNnTF \c@jCol = \l_@@_last_col_int
+ { \@@_error:nn { in~last~col } \Cdots }
+ {
+ \@@_instruction_of_type:nnn \c_false_bool { Cdots }
+ { #1 , down = #2 , up = #3 }
+ }
+ }
+ \bool_if:NF \l_@@_nullify_dots_bool
+ { \phantom { \ensuremath { \@@_old_cdots } } }
+ \bool_gset_true:N \g_@@_empty_cell_bool
+ }
% \end{macrocode}
%
% \bigskip
% \begin{macrocode}
-\NewDocumentCommand \@@_Vdots { s O { } }
- {
- \bool_if:nTF { #1 }
- { \@@_error:n { starred~commands } }
- { \@@_instruction_of_type:nn { Vdots } { #2 } }
- \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_vdots }
- \bool_gset_true:N \g_@@_empty_cell_bool
- }
+ \exp_args:NNV \NewDocumentCommand \@@_Vdots \l_@@_argspec_tl
+ {
+ \int_compare:nNnTF \c@iRow = 0
+ { \@@_error:nn { in~first~row } \Vdots }
+ {
+ \int_compare:nNnTF \c@iRow = \l_@@_last_row_int
+ { \@@_error:nn { in~last~row } \Vdots }
+ {
+ \@@_instruction_of_type:nnn \c_false_bool { Vdots }
+ { #1 , down = #2 , up = #3 }
+ }
+ }
+ \bool_if:NF \l_@@_nullify_dots_bool
+ { \phantom { \ensuremath { \@@_old_vdots } } }
+ \bool_gset_true:N \g_@@_empty_cell_bool
+ }
% \end{macrocode}
%
+%
% \bigskip
% \begin{macrocode}
-\NewDocumentCommand \@@_Ddots { s O { } }
- {
- \bool_if:nTF { #1 }
- { \@@_error:n { starred~commands } }
- { \@@_instruction_of_type:nn { Ddots } { #2 } }
- \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_ddots }
- \bool_gset_true:N \g_@@_empty_cell_bool
- }
+ \exp_args:NNV \NewDocumentCommand \@@_Ddots \l_@@_argspec_tl
+ {
+ \int_case:nnF \c@iRow
+ {
+ 0 { \@@_error:nn { in~first~row } \Ddots }
+ \l_@@_last_row_int { \@@_error:nn { in~last~row } \Ddots }
+ }
+ {
+ \int_case:nnF \c@jCol
+ {
+ 0 { \@@_error:nn { in~first~col } \Ddots }
+ \l_@@_last_col_int { \@@_error:nn { in~last~col } \Ddots }
+ }
+ {
+ \keys_set_known:nn { NiceMatrix / Ddots } { #1 }
+ \@@_instruction_of_type:nnn \l_@@_draw_first_bool { Ddots }
+ { #1 , down = #2 , up = #3 }
+ }
+
+ }
+ \bool_if:NF \l_@@_nullify_dots_bool
+ { \phantom { \ensuremath { \@@_old_ddots } } }
+ \bool_gset_true:N \g_@@_empty_cell_bool
+ }
% \end{macrocode}
%
% \bigskip
% \begin{macrocode}
-\NewDocumentCommand \@@_Iddots { s O { } }
- {
- \bool_if:nTF { #1 }
- { \@@_error:n { starred~commands } }
- { \@@_instruction_of_type:nn { Iddots } { #2 } }
- \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_iddots }
- \bool_gset_true:N \g_@@_empty_cell_bool
+ \exp_args:NNV \NewDocumentCommand \@@_Iddots \l_@@_argspec_tl
+ {
+ \int_case:nnF \c@iRow
+ {
+ 0 { \@@_error:nn { in~first~row } \Iddots }
+ \l_@@_last_row_int { \@@_error:nn { in~last~row } \Iddots }
+ }
+ {
+ \int_case:nnF \c@jCol
+ {
+ 0 { \@@_error:nn { in~first~col } \Iddots }
+ \l_@@_last_col_int { \@@_error:nn { in~last~col } \Iddots }
+ }
+ {
+ \keys_set_known:nn { NiceMatrix / Ddots } { #1 }
+ \@@_instruction_of_type:nnn \l_@@_draw_first_bool { Iddots }
+ { #1 , down = #2 , up = #3 }
+ }
+ }
+ \bool_if:NF \l_@@_nullify_dots_bool
+ { \phantom { \ensuremath { \@@_old_iddots } } }
+ \bool_gset_true:N \g_@@_empty_cell_bool
+ }
}
% \end{macrocode}
+% End of the |\AtBeginDocument|.
%
%
% \bigskip
+% Despite its name, the following set of keys will be used for |\Ddots| but also
+% for |\Iddots|.
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / Ddots }
+ {
+ draw-first .bool_set:N = \l_@@_draw_first_bool ,
+ draw-first .default:n = true ,
+ draw-first .value_forbidden:n = true
+ }
+% \end{macrocode}
+%
+% \bigskip
% The command |\@@_Hspace:| will be linked to |\hspace| in |{NiceArray}|.
% \begin{macrocode}
\cs_new_protected:Npn \@@_Hspace:
@@ -6933,65 +10722,120 @@ version 2005/12/01 or later.
\cs_set_eq:NN \@@_old_multicolumn \multicolumn
\cs_new:Npn \@@_multicolumn:nnn #1 #2 #3
{
- \@@_old_multicolumn { #1 } { #2 } { #3 }
- \int_compare:nNnT #1 > 1
+% \end{macrocode}
+% We have to act in an expandable way since it will begin by a |\multicolumn|.
+% \begin{macrocode}
+ \exp_args:NNe
+ \@@_old_multicolumn
+ { #1 }
+% \end{macrocode}
+% We will have to replace |\tl_lower_case:n| in the future since it seems to be
+% deprecated.
+% \begin{macrocode}
+ {
+ \exp_args:Ne \str_case:nn { \str_foldcase:n { #2 } }
+ {
+ l { > \@@_Cell: l < \@@_end_Cell: }
+ r { > \@@_Cell: r < \@@_end_Cell: }
+ c { > \@@_Cell: c < \@@_end_Cell: }
+ { l | } { > \@@_Cell: l < \@@_end_Cell: | }
+ { r | } { > \@@_Cell: r < \@@_end_Cell: | }
+ { c | } { > \@@_Cell: c < \@@_end_Cell: | }
+ { | l } { | > \@@_Cell: l < \@@_end_Cell: }
+ { | r } { | > \@@_Cell: r < \@@_end_Cell: }
+ { | c } { | > \@@_Cell: c < \@@_end_Cell: }
+ { | l | } { | > \@@_Cell: l < \@@_end_Cell: | }
+ { | r | } { | > \@@_Cell: r < \@@_end_Cell: | }
+ { | c | } { | > \@@_Cell: c < \@@_end_Cell: | }
+ }
+ }
+ { #3 }
+% \end{macrocode}
+% The |\peek_remove_spaces:n| is mandatory.
+% \begin{macrocode}
+ \peek_remove_spaces:n
{
- \seq_gput_left:Nx \g_@@_multicolumn_cells_seq
- { \int_eval:n \c@iRow - \int_use:N \c@jCol }
- \seq_gput_left:Nn \g_@@_multicolumn_sizes_seq { #1 }
- }
- \int_gadd:Nn \c@jCol { #1 - 1 }
+ \int_compare:nNnT #1 > 1
+ {
+ \seq_gput_left:Nx \g_@@_multicolumn_cells_seq
+ { \int_use:N \c@iRow - \int_use:N \c@jCol }
+ \seq_gput_left:Nn \g_@@_multicolumn_sizes_seq { #1 }
+ \seq_gput_right:Nx \g_@@_pos_of_blocks_seq
+ {
+ { \int_use:N \c@iRow }
+ { \int_use:N \c@jCol }
+ { \int_use:N \c@iRow }
+ { \int_eval:n { \c@jCol + #1 - 1 } }
+ }
+ }
+ \int_gadd:Nn \c@jCol { #1 - 1 }
+ \int_compare:nNnT \c@jCol > \g_@@_col_total_int
+ { \int_gset_eq:NN \g_@@_col_total_int \c@jCol }
+ }
}
% \end{macrocode}
%
%
% \bigskip
% The command |\@@_Hdotsfor| will be linked to |\Hdotsfor| in
-% |{NiceArrayWithDelims}|. This command uses an optional argument (as does
-% |\hdotsfor|) but this argument is discarded (in |\hdotsfor|, this argument is
-% used for fine tuning of the space between two consecutive dots). Tikz nodes
-% are created also the implicit cells of the |\Hdotsfor| (maybe we should modify
-% that point).
+% |{NiceArrayWithDelims}|. Tikz nodes are created also in the implicit cells of
+% the |\Hdotsfor| (maybe we should modify that point).
%
% \medskip
% This command must \emph{not} be protected since it begins with |\multicolumn|.
% \begin{macrocode}
\cs_new:Npn \@@_Hdotsfor:
{
- \multicolumn { 1 } { C } { }
- \@@_Hdotsfor_i
+ \bool_lazy_and:nnTF
+ { \int_compare_p:nNn \c@jCol = 0 }
+ { \int_compare_p:nNn \l_@@_first_col_int = 0 }
+ {
+ \bool_if:NTF \g_@@_after_col_zero_bool
+ {
+ \multicolumn { 1 } { c } { }
+ \@@_Hdotsfor_i
+ }
+ { \@@_fatal:n { Hdotsfor~in~col~0 } }
+ }
+ {
+ \multicolumn { 1 } { c } { }
+ \@@_Hdotsfor_i
+ }
}
% \end{macrocode}
%
-% The command |\@@_Hdotsfor_i| is defined with the tools of \pkg{xparse} because
-% it has an optional argument. Note that such a command defined by
+%
+% The command |\@@_Hdotsfor_i| is defined with |\NewDocumentCommand| because it
+% has an optional argument. Note that such a command defined by
% |\NewDocumentCommand| is protected and that's why we have put the
% |\multicolumn| before (in the definition of |\@@_Hdotsfor:|).
% \begin{macrocode}
-\bool_if:NTF \c_@@_draft_bool
+\AtBeginDocument
{
+ \tl_set:Nn \l_@@_argspec_tl { O { } m O { } E { _ ^ } { { } { } } }
+ \tl_set_rescan:Nno \l_@@_argspec_tl { } \l_@@_argspec_tl
% \end{macrocode}
% We don't put |!| before the last optionnal argument for homogeneity with
% |\Cdots|, etc. which have only one optional argument.
% \begin{macrocode}
- \NewDocumentCommand \@@_Hdotsfor_i { O { } m O { } }
- { \prg_replicate:nn { #2 - 1 } { & \multicolumn { 1 } { C } { } } }
- }
- {
- \NewDocumentCommand \@@_Hdotsfor_i { O { } m O { } }
+ \exp_args:NNV \NewDocumentCommand \@@_Hdotsfor_i \l_@@_argspec_tl
{
- \tl_gput_right:Nx \g_@@_Hdotsfor_lines_tl
+ \tl_gput_right:Nx \g_@@_HVdotsfor_lines_tl
{
\@@_Hdotsfor:nnnn
{ \int_use:N \c@iRow }
{ \int_use:N \c@jCol }
{ #2 }
- { #3 }
- }
- \prg_replicate:nn { #2 - 1 } { & \multicolumn { 1 } { C } { } }
+ {
+ #1 , #3 ,
+ down = \exp_not:n { #4 } , up = \exp_not:n { #5 }
+ }
+ }
+ \prg_replicate:nn { #2 - 1 } { & \multicolumn { 1 } { c } { } }
}
}
% \end{macrocode}
+% Enf of |\AtBeginDocument|.
%
% \medskip
% \begin{macrocode}
@@ -7069,45 +10913,115 @@ version 2005/12/01 or later.
{ \cs_set:cpn { @@ _ dotted _ #1 - ##1 } { } }
}
% \end{macrocode}
-%
%
-% \bigskip
-% The control sequence |\@@_rotate:| will be linked to |\rotate| in
-% |{NiceArrayWithDelims}|.
-%
-% The command will exit three levels of groups in order
-% to execute the command
-%
-% \qquad ``|\box_rotate:Nn \l_@@_cell_box { 90 }|''
+% \bigskip
+% \begin{macrocode}
+\AtBeginDocument
+ {
+ \tl_set:Nn \l_@@_argspec_tl { O { } m O { } E { _ ^ } { { } { } } }
+ \tl_set_rescan:Nno \l_@@_argspec_tl { } \l_@@_argspec_tl
+ \exp_args:NNV \NewDocumentCommand \@@_Vdotsfor: \l_@@_argspec_tl
+ {
+ \tl_gput_right:Nx \g_@@_HVdotsfor_lines_tl
+ {
+ \@@_Vdotsfor:nnnn
+ { \int_use:N \c@iRow }
+ { \int_use:N \c@jCol }
+ { #2 }
+ {
+ #1 , #3 ,
+ down = \exp_not:n { #4 } , up = \exp_not:n { #5 }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+% Enf of |\AtBeginDocument|.
%
-% just after the construction of the box |\l_@@_cell_box|.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_rotate: { \group_insert_after:N \@@_rotate_i: }
-\cs_new_protected:Npn \@@_rotate_i: { \group_insert_after:N \@@_rotate_ii: }
-\cs_new_protected:Npn \@@_rotate_ii: { \group_insert_after:N \@@_rotate_iii: }
-\cs_new_protected:Npn \@@_rotate_iii:
+\cs_new_protected:Npn \@@_Vdotsfor:nnnn #1 #2 #3 #4
{
- \box_rotate:Nn \l_@@_cell_box { 90 }
+ \bool_set_false:N \l_@@_initial_open_bool
+ \bool_set_false:N \l_@@_final_open_bool
% \end{macrocode}
-% If we are in the last row, we want all the boxes composed with the command
-% |\rotate| aligned upwards.
+% For the column, it's easy.
% \begin{macrocode}
- \int_compare:nNnT \c@iRow = \l_@@_last_row_int
+ \int_set:Nn \l_@@_initial_j_int { #2 }
+ \int_set_eq:NN \l_@@_final_j_int \l_@@_initial_j_int
+% \end{macrocode}
+% For the row, it's a bit more complicated.
+% \begin{macrocode}
+ \int_compare:nNnTF #1 = 1
{
- \vbox_set_top:Nn \l_@@_cell_box
+ \int_set:Nn \l_@@_initial_i_int 1
+ \bool_set_true:N \l_@@_initial_open_bool
+ }
+ {
+ \cs_if_exist:cTF
{
- \vbox_to_zero:n { }
+ pgf @ sh @ ns @ \@@_env:
+ - \int_eval:n { #1 - 1 }
+ - \int_use:N \l_@@_initial_j_int
+ }
+ { \int_set:Nn \l_@@_initial_i_int { #1 - 1 } }
+ {
+ \int_set:Nn \l_@@_initial_i_int { #1 }
+ \bool_set_true:N \l_@@_initial_open_bool
+ }
+ }
+ \int_compare:nNnTF { #1 + #3 -1 } = \c@iRow
+ {
+ \int_set:Nn \l_@@_final_i_int { #1 + #3 - 1 }
+ \bool_set_true:N \l_@@_final_open_bool
+ }
+ {
+ \cs_if_exist:cTF
+ {
+ pgf @ sh @ ns @ \@@_env:
+ - \int_eval:n { #1 + #3 }
+ - \int_use:N \l_@@_final_j_int
+ }
+ { \int_set:Nn \l_@@_final_i_int { #1 + #3 } }
+ {
+ \int_set:Nn \l_@@_final_i_int { #1 + #3 - 1 }
+ \bool_set_true:N \l_@@_final_open_bool
+ }
+ }
% \end{macrocode}
-% |0.8 ex| will be the distance between the principal part of the array and our
-% element (which is composed with |\rotate|.
+%
% \begin{macrocode}
- \skip_vertical:n { - \box_ht:N \@arstrutbox + 0.8 ex }
- \box_use:N \l_@@_cell_box
- }
+ \group_begin:
+ \int_compare:nNnTF { #2 } = 0
+ { \color { nicematrix-first-col } }
+ {
+ \int_compare:nNnT { #2 } = \g_@@_col_total_int
+ { \color { nicematrix-last-col } }
}
+ \keys_set:nn { NiceMatrix / xdots } { #4 }
+ \tl_if_empty:VF \l_@@_xdots_color_tl { \color { \l_@@_xdots_color_tl } }
+ \@@_actually_draw_Vdots:
+ \group_end:
+% \end{macrocode}
+%
+% \medskip
+% We declare all the cells concerned by the |\Vdotsfor| as ``dotted'' (for the
+% dotted lines created by |\Cdots|, |\Ldots|, etc., this job is done by
+% |\@@_find_extremities_of_line:nnnn|). This declaration is done by defining a
+% special control sequence (to nil).
+% \begin{macrocode}
+ \int_step_inline:nnn { #1 } { #1 + #3 - 1 }
+ { \cs_set:cpn { @@ _ dotted _ ##1 - #2 } { } }
}
% \end{macrocode}
%
+%
+% \vspace{1cm}
+% The command |\@@_rotate:| will be linked to |\rotate| in
+% |{NiceArrayWithDelims}|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rotate: { \bool_gset_true:N \g_@@_rotate_bool }
+% \end{macrocode}
+%
% \bigskip
% \subsection*{The command \textbackslash line accessible in code-after}
%
@@ -7126,46 +11040,48 @@ version 2005/12/01 or later.
{ \int_eval:n { #1 } - \int_eval:n { #2 } }
% \end{macrocode}
%
+%
% \medskip
% With the following construction, the command |\@@_double_int_eval:n| is
% applied to both arguments before the application of |\@@_line_i:nn| (the
% construction uses the fact the |\@@_line_i:nn| is protected and that
% |\@@_double_int_eval:n| is fully expandable).
% \begin{macrocode}
-\NewDocumentCommand \@@_line { O { } m m ! O { } }
+\AtBeginDocument
{
- \group_begin:
- \keys_set:nn { NiceMatrix / xdots } { #1 , #4 }
- \tl_if_empty:VF \l_@@_xdots_color_tl { \color { \l_@@_xdots_color_tl } }
- \use:x
- {
- \@@_line_i:nn
- { \@@_double_int_eval:n #2 \q_stop }
- { \@@_double_int_eval:n #3 \q_stop }
- }
- \group_end:
+ \tl_set:Nn \l_@@_argspec_tl { O { } m m ! O { } E { _ ^ } { { } { } } }
+ \tl_set_rescan:Nno \l_@@_argspec_tl { } \l_@@_argspec_tl
+ \exp_args:NNV \NewDocumentCommand \@@_line \l_@@_argspec_tl
+ {
+ \group_begin:
+ \keys_set:nn { NiceMatrix / xdots } { #1 , #4 , down = #5 , up = #6 }
+ \tl_if_empty:VF \l_@@_xdots_color_tl { \color { \l_@@_xdots_color_tl } }
+ \use:e
+ {
+ \@@_line_i:nn
+ { \@@_double_int_eval:n #2 \q_stop }
+ { \@@_double_int_eval:n #3 \q_stop }
+ }
+ \group_end:
+ }
}
% \end{macrocode}
%
% \begin{macrocode}
-\bool_if:NTF \c_@@_draft_bool
- { \cs_new_protected:Npn \@@_line_i:nn #1 #2 { } }
+\cs_new_protected:Npn \@@_line_i:nn #1 #2
{
- \cs_new_protected:Npn \@@_line_i:nn #1 #2
+ \bool_set_false:N \l_@@_initial_open_bool
+ \bool_set_false:N \l_@@_final_open_bool
+ \bool_if:nTF
{
- \bool_set_false:N \l_@@_initial_open_bool
- \bool_set_false:N \l_@@_final_open_bool
- \bool_if:nTF
- {
- \cs_if_free_p:c { pgf @ sh @ ns @ \@@_env: - #1 }
- ||
- \cs_if_free_p:c { pgf @ sh @ ns @ \@@_env: - #2 }
- }
- {
- \@@_error:nnn { unknown~cell~for~line~in~code-after } { #1 } { #2 }
- }
- { \@@_draw_line_ii:nn { #1 } { #2 } }
+ \cs_if_free_p:c { pgf @ sh @ ns @ \@@_env: - #1 }
+ ||
+ \cs_if_free_p:c { pgf @ sh @ ns @ \@@_env: - #2 }
}
+ {
+ \@@_error:nnn { unknown~cell~for~line~in~code-after } { #1 } { #2 }
+ }
+ { \@@_draw_line_ii:nn { #1 } { #2 } }
}
% \end{macrocode}
%
@@ -7188,16 +11104,16 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \bigskip
-% The following command \emph{must} be protected since it's used in the
-% construction of |\@@_draw_line_ii:nn|.
+% The following command \emph{must} be protected (it's used in the
+% construction of |\@@_draw_line_ii:nn|).
% \begin{macrocode}
\cs_new_protected:Npn \@@_draw_line_iii:nn #1 #2
{
\pgfrememberpicturepositiononpagetrue
- \pgfpointshapeborder { \@@_env: - #1 } { \@@_qpoint: { #2 } }
+ \pgfpointshapeborder { \@@_env: - #1 } { \@@_qpoint:n { #2 } }
\dim_set_eq:NN \l_@@_x_initial_dim \pgf@x
\dim_set_eq:NN \l_@@_y_initial_dim \pgf@y
- \pgfpointshapeborder { \@@_env: - #2 } { \@@_qpoint: { #1 } }
+ \pgfpointshapeborder { \@@_env: - #2 } { \@@_qpoint:n { #1 } }
\dim_set_eq:NN \l_@@_x_final_dim \pgf@x
\dim_set_eq:NN \l_@@_y_final_dim \pgf@y
\@@_draw_line:
@@ -7209,8 +11125,498 @@ version 2005/12/01 or later.
% this command because they have to do other settings (for example, the diagonal
% lines must be parallelized).
%
+% \bigskip
+% \subsection*{Colors of cells, rows and columns}
+%
+% We want to avoid the thin white lines that are shown in some \textsc{pdf}
+% viewers (eg: with the engine MuPDF used by SumatraPDF). That's why we try to
+% draw rectangles of the same color in the same instruction |\pgfusepathqfill|
+% (and they will be in the same instruction |fill|---coded |f|--- in the
+% resulting \textsc{pdf}).
+%
+% The commands |\@@_rowcolor|, |\@@_columncolor| and |\@@_rectanglecolor|
+% (which are linked to |\rowcolor|, |\columncolor| and |\rectanglecolor| before
+% the execution of the |code-before|) don't directly draw the corresponding
+% rectangles. Instead, they store their instructions color by color:
+% \begin{itemize}
+% \item A sequence |\l_@@_colors_seq| will be built containing all the colors
+% used by at least one of these instructions. Each \emph{color} may be prefixed
+% by it color model (eg: |[gray]{0.5}|).
+% \item For the color whose index in |\l_@@_colors_seq| is equal to~$i$, a list of
+% instructions which use that color will be constructed in the token list
+% |\l_@@_color_|$i$|_tl|. In that token list, the instructions will
+% |\@@_rowcolor:n|, |\@@_columncolor:n| and |\@@_rectanglecolor:nn|
+% (corresponding of |\@@_rowcolor|, |\@@_columncolor| and |\@@_rectanglecolor|).
+% \end{itemize}
+%
+%
+% bigskip
+% |#1| is the color and |#2| is an instruction using that color. Despite its
+% name, the command |\@@_add_to_color_seq| doesn't only add a color to
+% |\l_@@_colors_seq|: it also updates the corresponding token list
+% |\l_@@_color_|$i$|_tl|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_add_to_colors_seq:nn #1 #2
+ {
+% \end{macrocode}
+% Firt, we look for the number of the color and, if it's found, we store it in
+% |\l_tmpa_int|. If the color is not present in |\l_@@_colors_seq|,
+% |\l_tmpa_int| will remain equal to $0$.
+% \begin{macrocode}
+ \int_zero:N \l_tmpa_int
+ \seq_map_indexed_inline:Nn \l_@@_colors_seq
+ { \tl_if_eq:nnT { #1 } { ##2 } { \int_set:Nn \l_tmpa_int { ##1 } } }
+ \int_compare:nNnTF \l_tmpa_int = \c_zero_int
+% \end{macrocode}
+% First, the case where the color is a \emph{new} color (not in the sequence).
+% \begin{macrocode}
+ {
+ \seq_put_right:Nn \l_@@_colors_seq { #1 }
+ \tl_set:cn { l_@@_color _ \seq_count:N \l_@@_colors_seq _ tl } { #2 }
+ }
+% \end{macrocode}
+% Now, the case where the color is \emph{not} a new color (the color is in the
+% sequence at the position |\l_tmpa_int|).
+% \begin{macrocode}
+ { \tl_put_right:cn { l_@@_color _ \int_use:N \l_tmpa_int _tl } { #2 } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_generate_variant:Nn \@@_add_to_colors_seq:nn { x n }
+% \end{macrocode}
%
% \bigskip
+% The macro |\@@_actually_color:| will actually fill all the rectangles, color by
+% color (using the sequence |\l_@@_colors_seq| and all the token lists of the
+% form |\l_@@_color_|$i$|_tl|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_actually_color:
+ {
+ \pgfpicture
+ \pgf@relevantforpicturesizefalse
+ \seq_map_indexed_inline:Nn \l_@@_colors_seq
+ {
+ \color ##2
+ \use:c { l_@@_color _ ##1 _tl }
+ \pgfusepathqfill
+ }
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_cut_on_hyphen:w #1-#2\q_stop
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_set:Nn \l_tmpb_tl { #2 }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% Here is an example : |\@@_rowcolor {red!15} {1,3,5-7,10-}|
+% \begin{macrocode}
+\NewDocumentCommand \@@_rowcolor { O { } m m }
+ {
+ \tl_if_blank:nF { #2 }
+ {
+ \@@_add_to_colors_seq:xn
+ { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } }
+ { \@@_rowcolor:n { #3 } }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rowcolor:n #1
+ {
+ \tl_set:Nn \l_@@_rows_tl { #1 }
+ \tl_set:Nn \l_@@_cols_tl { - }
+% \end{macrocode}
+% The command |\@@_cartesian_path:| takes in two implicit arguments:
+% |\l_@@_cols_tl| and |\l_@@_row_tl|.
+% \begin{macrocode}
+ \@@_cartesian_path:
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% Here an example : |\@@_columncolor:nn {red!15} {1,3,5-7,10-}|
+% \begin{macrocode}
+\NewDocumentCommand \@@_columncolor { O { } m m }
+ {
+ \tl_if_blank:nF { #2 }
+ {
+ \@@_add_to_colors_seq:xn
+ { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } }
+ { \@@_columncolor:n { #3 } }
+ }
+ }
+% \end{macrocode}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_columncolor:n #1
+ {
+ \tl_set:Nn \l_@@_rows_tl { - }
+ \tl_set:Nn \l_@@_cols_tl { #1 }
+% \end{macrocode}
+% The command |\@@_cartesian_path:| takes in two implicit arguments:
+% |\l_@@_cols_tl| and |\l_@@_row_tl|.
+% \begin{macrocode}
+ \@@_cartesian_path:
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% Here is an example : |\@@_rectanglecolor{red!15}{2-3}{5-6}|
+% \begin{macrocode}
+\NewDocumentCommand \@@_rectanglecolor { O { } m m m }
+ {
+ \tl_if_blank:nF { #2 }
+ {
+ \@@_add_to_colors_seq:xn
+ { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } }
+ { \@@_rectanglecolor:nn { #3 } { #4 } }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rectanglecolor:nn #1 #2
+ {
+ \@@_cut_on_hyphen:w #1 \q_stop
+ \tl_clear_new:N \l_tmpc_tl
+ \tl_clear_new:N \l_tmpd_tl
+ \tl_set_eq:NN \l_tmpc_tl \l_tmpa_tl
+ \tl_set_eq:NN \l_tmpd_tl \l_tmpb_tl
+ \@@_cut_on_hyphen:w #2 \q_stop
+ \tl_set:Nx \l_@@_rows_tl { \l_tmpc_tl - \l_tmpa_tl }
+ \tl_set:Nx \l_@@_cols_tl { \l_tmpd_tl - \l_tmpb_tl }
+% \end{macrocode}
+% The command |\@@_cartesian_path:| takes in two implicit arguments:
+% |\l_@@_cols_tl| and |\l_@@_row_tl|.
+% \begin{macrocode}
+ \@@_cartesian_path:
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% Here is an example : |\@@_cellcolor[rgb]{0.5,0.5,0}{2-3,3-4,4-5,5-6}|
+% \begin{macrocode}
+\NewDocumentCommand \@@_cellcolor { O { } m m }
+ {
+ \clist_map_inline:nn { #3 }
+ { \@@_rectanglecolor [ #1 ] { #2 } { ##1 } { ##1 } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand \@@_chessboardcolors { O { } m m }
+ {
+ \int_step_inline:nn { \int_use:N \c@iRow }
+ {
+ \int_step_inline:nn { \int_use:N \c@jCol }
+ {
+ \int_if_even:nTF { ####1 + ##1 }
+ { \@@_cellcolor [ #1 ] { #2 } }
+ { \@@_cellcolor [ #1 ] { #3 } }
+ { ##1 - ####1 }
+ }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / rowcolors }
+ {
+ respect-blocks .bool_set:N = \l_@@_respect_blocks_bool ,
+ respect-blocks .default:n = true ,
+ cols .tl_set:N = \l_@@_cols_tl ,
+ restart .bool_set:N = \l_@@_rowcolors_restart_bool ,
+ restart .default:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~option~for~rowcolors }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The command |\rowcolors| (accessible in the |code-before|) is inspired by the
+% command |\rowcolors| of the package \pkg{xcolor} (with the option |table|).
+% However, the command |\rowcolors| of \pkg{nicematrix} has \emph{not} the
+% optional argument of the command |\rowcolors| of \pkg{xcolor}. Here is an
+% example: |\rowcolors{1}{blue!10}{}[respect-blocks]|.
+%
+% |#1| (optional) is the color space ;
+% |#2| is a list of intervals of rows ;
+% |#3| is the first color ;
+% |#4| is the second color ;
+% |#5| is for the optional list of pairs key-value.
+% \begin{macrocode}
+\NewDocumentCommand \@@_rowcolors { O { } m m m O { } }
+ {
+% \end{macrocode}
+% The group is for the options.
+% \begin{macrocode}
+ \group_begin:
+ \tl_clear_new:N \l_@@_cols_tl
+ \tl_set:Nn \l_@@_cols_tl { - }
+ \keys_set:nn { NiceMatrix / rowcolors } { #5 }
+% \end{macrocode}
+% The boolean |\l_tmpa_bool| will indicate whereas we are in a row of the first
+% color or of the second color.
+% \begin{macrocode}
+ \bool_set_true:N \l_tmpa_bool
+ \bool_lazy_and:nnT
+ \l_@@_respect_blocks_bool
+ {
+ \cs_if_exist_p:c
+ { c_@@_pos_of_blocks_ \int_use:N \g_@@_env_int _ seq } }
+ {
+% \end{macrocode}
+% We don't want to take into account a block which is completely in the ``first
+% column'' of (number $0$) or in the ``last column'' and that's why we filter
+% the sequence of the blocks (in a the sequence |\l_tmpa_seq|).
+% \begin{macrocode}
+ \seq_set_eq:Nc \l_tmpb_seq
+ { c_@@_pos_of_blocks_ \int_use:N \g_@@_env_int _ seq }
+ \seq_set_filter:NNn \l_tmpa_seq \l_tmpb_seq
+ { \@@_not_in_exterior_p:nnnn ##1 }
+ }
+ \pgfpicture
+ \pgf@relevantforpicturesizefalse
+ \clist_map_inline:nn { #2 }
+ {
+ \tl_set:Nn \l_tmpa_tl { ##1 }
+ \tl_if_in:NnTF \l_tmpa_tl { - }
+ { \@@_cut_on_hyphen:w ##1 \q_stop }
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@iRow } }
+% \end{macrocode}
+% The counter |\l_tmpa_int| will be the index of the loop.
+% \begin{macrocode}
+ \int_set:Nn \l_tmpa_int \l_tmpa_tl
+ \bool_if:NTF \l_@@_rowcolors_restart_bool
+ { \bool_set_true:N \l_tmpa_bool }
+ { \bool_set:Nn \l_tmpa_bool { \int_if_odd_p:n { \l_tmpa_tl } } }
+ \int_zero_new:N \l_tmpc_int
+ \int_set:Nn \l_tmpc_int \l_tmpb_tl
+ \int_do_until:nNnn \l_tmpa_int > \l_tmpc_int
+ {
+% \end{macrocode}
+% We will compute in |\l_tmpb_int| the last row of the ``block''.
+% \begin{macrocode}
+ \int_set_eq:NN \l_tmpb_int \l_tmpa_int
+% \end{macrocode}
+% If the key |respect-blocks| is in force, we have to adjust that value (of
+% course).
+% \begin{macrocode}
+ \bool_lazy_and:nnT
+ \l_@@_respect_blocks_bool
+ {
+ \cs_if_exist_p:c
+ { c_@@_pos_of_blocks_ \int_use:N \g_@@_env_int _ seq }
+ }
+ {
+ \seq_set_filter:NNn \l_tmpb_seq \l_tmpa_seq
+ { \@@_intersect_our_row_p:nnnn ####1 }
+ \seq_map_inline:Nn \l_tmpb_seq { \@@_rowcolors_i:nnnn ####1 }
+% \end{macrocode}
+% Now, the last row of the block is computed in |\l_tmpb_int|.
+% \begin{macrocode}
+ }
+ \tl_set:Nx \l_@@_rows_tl
+ { \int_use:N \l_tmpa_int - \int_use:N \l_tmpb_int }
+ \bool_if:NTF \l_tmpa_bool
+ {
+ \tl_if_blank:nF { #3 }
+ {
+ \tl_if_empty:nTF { #1 }
+ \color
+ { \color [ #1 ] }
+ { #3 }
+% \end{macrocode}
+% The command |\@@_cartesian_path:| takes in two implicit arguments:
+% |\l_@@_cols_tl| and |\l_@@_row_tl|.
+% \begin{macrocode}
+ \@@_cartesian_path:
+ \pgfusepathqfill
+ }
+ \bool_set_false:N \l_tmpa_bool
+ }
+ {
+ \tl_if_blank:nF { #4 }
+ {
+ \tl_if_empty:nTF { #1 }
+ \color
+ { \color [ #1 ] }
+ { #4 }
+% \end{macrocode}
+% The command |\@@_cartesian_path:| takes in two implicit arguments:
+% |\l_@@_cols_tl| and |\l_@@_row_tl|.
+% \begin{macrocode}
+ \@@_cartesian_path:
+ \pgfusepathqfill
+ }
+ \bool_set_true:N \l_tmpa_bool
+ }
+ \int_set:Nn \l_tmpa_int { \l_tmpb_int + 1 }
+ }
+ }
+ \endpgfpicture
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rowcolors_i:nnnn #1 #2 #3 #4
+ {
+ \int_compare:nNnT { #3 } > \l_tmpb_int
+ { \int_set:Nn \l_tmpb_int { #3 } }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+\prg_new_conditional:Nnn \@@_not_in_exterior:nnnn p
+ {
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn { #4 } = \c_zero_int }
+ { \int_compare_p:nNn { #2 } = { \@@_succ:n { \c@jCol } } }
+ \prg_return_false:
+ \prg_return_true:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following command return |true| when the block intersects the row
+% |\l_tmpa_int|.
+% \begin{macrocode}
+\prg_new_conditional:Nnn \@@_intersect_our_row:nnnn p
+ {
+ \bool_if:nTF
+ {
+ \int_compare_p:n { #1 <= \l_tmpa_int }
+ &&
+ \int_compare_p:n { \l_tmpa_int <= #3 }
+ }
+ \prg_return_true:
+ \prg_return_false:
+ }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The following command uses two implicit arguments : |\l_@@_rows_tl| and
+% |\l_@@_cols_tl| which are specifications for a set of rows and a set of
+% columns. It creates a path but does \emph{not} fill it. It must be filled by
+% another command after.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cartesian_path:
+ {
+% \end{macrocode}
+% We begin the loop over the columns.
+% \begin{macrocode}
+ \clist_map_inline:Nn \l_@@_cols_tl
+ {
+ \tl_set:Nn \l_tmpa_tl { ##1 }
+ \tl_if_in:NnTF \l_tmpa_tl { - }
+ { \@@_cut_on_hyphen:w ##1 \q_stop }
+ { \@@_cut_on_hyphen:w ##1 - ##1 \q_stop }
+ \tl_if_empty:NT \l_tmpa_tl { \tl_set:Nn \l_tmpa_tl { 1 } }
+ \tl_if_empty:NT \l_tmpb_tl
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@jCol } }
+ \int_compare:nNnT \l_tmpb_tl > \c@jCol
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@jCol } }
+ \@@_qpoint:n { col - \l_tmpa_tl }
+ \int_compare:nNnTF \l_@@_first_col_int = \l_tmpa_tl
+ { \dim_set:Nn \l_tmpc_dim { \pgf@x - 0.5 \arrayrulewidth } }
+ { \dim_set:Nn \l_tmpc_dim { \pgf@x + 0.5 \arrayrulewidth } }
+ \@@_qpoint:n { col - \@@_succ:n \l_tmpb_tl }
+ \dim_set:Nn \l_tmpa_dim { \pgf@x + 0.5 \arrayrulewidth }
+% \end{macrocode}
+% We begin the loop over the rows
+% \begin{macrocode}
+ \clist_map_inline:Nn \l_@@_rows_tl
+ {
+ \tl_set:Nn \l_tmpa_tl { ####1 }
+ \tl_if_in:NnTF \l_tmpa_tl { - }
+ { \@@_cut_on_hyphen:w ####1 \q_stop }
+ { \@@_cut_on_hyphen:w ####1 - ####1 \q_stop }
+ \tl_if_empty:NT \l_tmpa_tl { \tl_set:Nn \l_tmpa_tl { 1 } }
+ \tl_if_empty:NT \l_tmpb_tl
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@iRow } }
+ \int_compare:nNnT \l_tmpb_tl > \c@iRow
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@iRow } }
+% \end{macrocode}
+% Now, the numbers of both rows are in |\l_tmpa_tl| and |\l_tmpb_tl|.
+% \begin{macrocode}
+ \@@_qpoint:n { row - \@@_succ:n \l_tmpb_tl }
+ \dim_set:Nn \l_tmpb_dim { \pgf@y + 0.5 \arrayrulewidth }
+ \@@_qpoint:n { row - \l_tmpa_tl }
+ \dim_set:Nn \l_tmpd_dim { \pgf@y + 0.5 \arrayrulewidth }
+ \pgfpathrectanglecorners
+ { \pgfpoint \l_tmpc_dim \l_tmpd_dim }
+ { \pgfpoint \l_tmpa_dim \l_tmpb_dim }
+ }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% When the user uses the key |colortbl-like|, the following command will
+% be linked to |\cellcolor| in the tabular.
+% \begin{macrocode}
+\NewDocumentCommand \@@_cellcolor_tabular { O { } m }
+ {
+ \tl_gput_right:Nx \g_nicematrix_code_before_tl
+ { \cellcolor [ #1 ] { #2 } { \int_use:N \c@iRow - \int_use:N \c@jCol } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% When the user uses the key |colortbll-like|, the following command will
+% be linked to |\rowcolor| in the tabular.
+% \begin{macrocode}
+\NewDocumentCommand \@@_rowcolor_tabular { O { } m }
+ {
+ \tl_gput_right:Nx \g_nicematrix_code_before_tl
+ {
+ \exp_not:N \rectanglecolor [ #1 ] { #2 }
+ { \int_use:N \c@iRow - \int_use:N \c@jCol }
+ { \int_use:N \c@iRow - \exp_not:n { \int_use:N \c@jCol } }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand \@@_columncolor_preamble { O { } m }
+ {
+ \int_compare:nNnT \c@iRow = 1
+ {
+% \end{macrocode}
+% You use |gput_left| because we want the specification of colors for the
+% columns drawn before the specifications of color for the rows (and the cells).
+% \begin{macrocode}
+ \tl_gput_left:Nx \g_nicematrix_code_before_tl
+ { \exp_not:N \columncolor [ #1 ] { #2 } { \int_use:N \c@jCol } }
+ }
+ }
+% \end{macrocode}
+%
+%
+%
+%
+% \bigskip
% \subsection*{The vertical rules}
%
% We give to the user the possibility to define new types of columns (with
@@ -7266,140 +11672,635 @@ version 2005/12/01 or later.
% |\l_@@_last_row_int| may be equal to $-2$ or $-1$ (we can't write
% |\int_compare:nNnT \c@iRow < \l_@@_last_row_int|).
%
-%
-% \medskip
-% In fact, independently of |\OnlyMainNiceMatrix|, which is a convenience given
-% to the user, we have to modify the behaviour of the standard specifier ``"|"''.
%
-%
-% Remark first that the natural way to do that would be to redefine the
-% specifier ``"|"'' with |\newcolumntype|:
-% \begin{Verbatim}[commandchars=\~\#\+]
-% \newcolumntype { | } { ! { \OnlyMainNiceMatrix \vline } }
-% \end{Verbatim}
-%
-% However, this code fails if the user uses "\DefineShortVerb{\|}" of
-% \pkg{fancyvrb}. Moreover, it would not be able to deal correctly with two
-% consecutive specifiers ``"|"'' (in a preambule like "ccc||ccc").
+% \bigskip
+% The following command will be executed in the |internal-code-after|. The rule
+% will be drawn \emph{before} the column |#1|. |#2| is the number of consecutive
+% occurrences of \verb+|+.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_vline:nn #1 #2
+ {
+% \end{macrocode}
+% The following test is for the case where the user don't use all the columns
+% specified in the preamble of the environment (for instance, a preamble of
+% \verb+|c|c|c|+ but only two columns used).
+% \begin{macrocode}
+ \int_compare:nNnT { #1 } < { \c@jCol + 2 }
+ {
+ \pgfpicture
+ \@@_vline_i:nn { #1 } { #2 }
+ \endpgfpicture
+ }
+ }
+% \end{macrocode}
%
-% That's why we have done a redefinition of the macro |\@arrayrule| of
-% \pkg{array} and this redefinition will add |\@@_vline:| instead of |\vline| to
-% the preamble (that definition is in the beginning of |{NiceArrayWithDelims}|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_vline_i:nn #1 #2
+ {
+% \end{macrocode}
+% |\l_tmpa_tl| is the number of row and |\l_tmpb_tl| the number of column. When
+% we have found a row corresponding to a rule to draw, we note its number in
+% |\l_tmpc_tl|.
+% \begin{macrocode}
+ \tl_set:Nx \l_tmpb_tl { #1 }
+ \tl_clear_new:N \l_tmpc_tl
+ \int_step_variable:nNn \c@iRow \l_tmpa_tl
+ {
+% \end{macrocode}
+% The boolean |\g_tmpa_bool| indicates whether the small vertical rule will be
+% drawn. If we find that it is in a block (a real block, created by |\Block| or
+% a virtual block corresponding to a dotted line, created by |\Cdots|, |\Vdots|,
+% etc.), we will set |\g_tmpa_bool| to |false| and the small vertical rule won't
+% be drawn.
+% \begin{macrocode}
+ \bool_gset_true:N \g_tmpa_bool
+ \seq_map_inline:Nn \g_@@_pos_of_blocks_seq
+ { \@@_test_if_vline_in_block:nnnn ##1 }
+ \seq_map_inline:Nn \g_@@_pos_of_xdots_seq
+ { \@@_test_if_vline_in_block:nnnn ##1 }
+ \seq_map_inline:Nn \g_@@_pos_of_stroken_blocks_seq
+ { \@@_test_if_vline_in_stroken_block:nnnn ##1 }
+ \clist_if_empty:NF \l_@@_except_corners_clist
+ \@@_test_in_corner_v:
+ \bool_if:NTF \g_tmpa_bool
+ {
+ \tl_if_empty:NT \l_tmpc_tl
+% \end{macrocode}
+% We keep in memory that we have a rule to draw.
+% \begin{macrocode}
+ { \tl_set_eq:NN \l_tmpc_tl \l_tmpa_tl }
+ }
+ {
+ \tl_if_empty:NF \l_tmpc_tl
+ {
+ \@@_vline_ii:nnnn
+ { #1 }
+ { #2 }
+ \l_tmpc_tl
+ { \int_eval:n { \l_tmpa_tl - 1 } }
+ \tl_clear:N \l_tmpc_tl
+ }
+ }
+ }
+ \tl_if_empty:NF \l_tmpc_tl
+ {
+ \@@_vline_ii:nnnn
+ { #1 }
+ { #2 }
+ \l_tmpc_tl
+ { \int_use:N \c@iRow }
+ \tl_clear:N \l_tmpc_tl
+ }
+ }
+% \end{macrocode}
%
-% Here is the definition of |\@@_vline:|. This definition \emph{must} be
-% protected because you don't want that macro expanded during the construction
-% of the preamble (the tests in |\@@_OnlyMainNiceMatrix:n| must be effective in
-% each row and not once for all when the preamble is constructed).
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_in_corner_v:
+ {
+ \int_compare:nNnTF \l_tmpb_tl = { \@@_succ:n \c@jCol }
+ {
+ \seq_if_in:NxT
+ \l_@@_empty_corner_cells_seq
+ { \l_tmpa_tl - \@@_pred:n \l_tmpb_tl }
+ { \bool_set_false:N \g_tmpa_bool }
+ }
+ {
+ \seq_if_in:NxT
+ \l_@@_empty_corner_cells_seq
+ { \l_tmpa_tl - \l_tmpb_tl }
+ {
+ \int_compare:nNnTF \l_tmpb_tl = 1
+ { \bool_set_false:N \g_tmpa_bool }
+ {
+ \seq_if_in:NxT
+ \l_@@_empty_corner_cells_seq
+ { \l_tmpa_tl - \@@_pred:n \l_tmpb_tl }
+ { \bool_set_false:N \g_tmpa_bool }
+ }
+ }
+ }
+ }
+% \end{macrocode}
%
-% \medskip
+% \bigskip
+% |#1| is the number of the column; |#2| is the number of vertical rules to
+% draw (with potentially a color between); |#3| and |#4| are the number of the
+% rows between which the rule has to be drawn.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_vline: { \@@_OnlyMainNiceMatrix:n { \@@_vline_i: } }
+\cs_new_protected:Npn \@@_vline_ii:nnnn #1 #2 #3 #4
+ {
+ \pgfrememberpicturepositiononpagetrue
+ \pgf@relevantforpicturesizefalse
+ \@@_qpoint:n { row - #3 }
+ \dim_set_eq:NN \l_tmpa_dim \pgf@y
+ \@@_qpoint:n { col - #1 }
+ \dim_set_eq:NN \l_tmpb_dim \pgf@x
+ \@@_qpoint:n { row - \@@_succ:n { #4 } }
+ \dim_set_eq:NN \l_tmpc_dim \pgf@y
+ \bool_lazy_and:nnT
+ { \int_compare_p:nNn { #2 } > 1 }
+ { ! \tl_if_blank_p:V \CT@drsc@ }
+ {
+ \group_begin:
+ \CT@drsc@
+ \dim_add:Nn \l_tmpa_dim { 0.5 \arrayrulewidth }
+ \dim_sub:Nn \l_tmpc_dim { 0.5 \arrayrulewidth }
+ \dim_set:Nn \l_tmpd_dim
+ { \l_tmpb_dim - ( \doublerulesep + \arrayrulewidth ) * ( #2 - 1 ) }
+ \pgfpathrectanglecorners
+ { \pgfpoint \l_tmpb_dim \l_tmpa_dim }
+ { \pgfpoint \l_tmpd_dim \l_tmpc_dim }
+ \pgfusepathqfill
+ \group_end:
+ }
+ \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim }
+ \pgfpathlineto { \pgfpoint \l_tmpb_dim \l_tmpc_dim }
+ \prg_replicate:nn { #2 - 1 }
+ {
+ \dim_sub:Nn \l_tmpb_dim \arrayrulewidth
+ \dim_sub:Nn \l_tmpb_dim \doublerulesep
+ \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim }
+ \pgfpathlineto { \pgfpoint \l_tmpb_dim \l_tmpc_dim }
+ }
+ \CT@arc@
+ \pgfsetlinewidth { 1.1 \arrayrulewidth }
+ \pgfsetrectcap
+ \pgfusepathqstroke
+ }
% \end{macrocode}
%
-% If \pkg{colortbl} is loaded, the following macro will be redefined (in a
-% |\AtBeginDocument|) to take into account the color fixed by |\arrayrulecolor|
-% of \pkg{colortbl}.
+% \bigskip
+% The following draws a complete vertical rule in the column |#1| (|#2| is the
+% number of consecutive rules specified by the number of \verb+|+ in the
+% preamble). This command will be used if there is no block in the array (and
+% the key |except-corners| is not used).
% \begin{macrocode}
-\cs_set_eq:NN \@@_vline_i: \vline
+\cs_new_protected:Npn \@@_vline_i_complete:nn #1 #2
+ { \@@_vline_ii:nnnn { #1 } { #2 } 1 { \int_use:N \c@iRow } }
% \end{macrocode}
%
% \bigskip
-% The command |\@@_draw_vlines| will be executed when the user uses the option
-% |vlines| (which draws all the vlines of the array).
+% The command |\@@_draw_hlines:| draws all the vertical rules excepted in the
+% blocks, in the virtual blocks (determined by a command such as |\Cdots|) and in
+% the corners (if the key |except-corners| is used).
% \begin{macrocode}
\cs_new_protected:Npn \@@_draw_vlines:
{
- \group_begin:
+ \int_step_inline:nnn
+ { \bool_if:NTF \l_@@_NiceArray_bool 1 2 }
+ { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@jCol } \c@jCol }
+ { \@@_vline:nn { ##1 } 1 }
+ }
% \end{macrocode}
-% The command |\CT@arc@| is a command of color from \pkg{colortbl}.
+%
+%
+%
+% \subsection*{The horizontal rules}
+%
+% \bigskip
+% The following command will be executed in the |internal-code-after|. The rule
+% will be drawn \emph{before} the row |#1|. |#2| is the number of consecutive
+% occurrences of |\Hline|.
% \begin{macrocode}
- \bool_if:NT \c_@@_colortbl_loaded_bool \CT@arc@
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \pgf@relevantforpicturesizefalse
- \pgfsetlinewidth \arrayrulewidth
+\cs_new_protected:Npn \@@_hline:nn #1 #2
+ {
+ \pgfpicture
+ \@@_hline_i:nn { #1 } { #2 }
+ \endpgfpicture
+ }
% \end{macrocode}
-% First, we compute in |\l_tmpa_dim| the height of the rules we have to draw.
+%
% \begin{macrocode}
- \@@_qpoint: {row - 1 }
- \dim_set_eq:NN \l_tmpa_dim \pgf@y
- \pgfusepathqfill
- \@@_qpoint: { row - \@@_succ:n \c@iRow }
- \dim_sub:Nn \l_tmpa_dim \pgf@y
- \pgfusepathqfill
+\cs_new_protected:Npn \@@_hline_i:nn #1 #2
+ {
% \end{macrocode}
-% We translate vertically to take into account the potential ``last row''.
+% |\l_tmpa_tl| is the number of row and |\l_tmpb_tl| the number of column. Whe,
+% we have found a column corresponding to a rule to draw, we note its number in
+% |\l_tmpc_tl|.
% \begin{macrocode}
- \dim_zero:N \l_tmpb_dim
- \int_compare:nNnT \l_@@_last_row_int > { -1 }
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_clear_new:N \l_tmpc_tl
+ \int_step_variable:nNn \c@jCol \l_tmpb_tl
{
- \dim_set_eq:NN \l_tmpb_dim \g_@@_dp_last_row_dim
- \dim_add:Nn \l_tmpb_dim \g_@@_ht_last_row_dim
% \end{macrocode}
-% We adjust the value of |\l_tmpa_dim| by the width of the horizontal rule just
-% before the ``last row''.
+% The boolean |\g_tmpa_bool| indicates whether the small horizontal rule will be
+% drawn. If we find that it is in a block (a real block, created by |\Block| or
+% a virtual block corresponding to a dotted line, created by |\Cdots|, |\Vdots|,
+% etc.), we will set |\g_tmpa_bool| to |false| and the small horizontal rule won't
+% be drawn.
+% \begin{macrocode}
+ \bool_gset_true:N \g_tmpa_bool
+ \seq_map_inline:Nn \g_@@_pos_of_blocks_seq
+ { \@@_test_if_hline_in_block:nnnn ##1 }
+ \seq_map_inline:Nn \g_@@_pos_of_xdots_seq
+ { \@@_test_if_hline_in_block:nnnn ##1 }
+ \seq_map_inline:Nn \g_@@_pos_of_stroken_blocks_seq
+ { \@@_test_if_hline_in_stroken_block:nnnn ##1 }
+ \clist_if_empty:NF \l_@@_except_corners_clist \@@_test_in_corner_h:
+ \bool_if:NTF \g_tmpa_bool
+ {
+ \tl_if_empty:NT \l_tmpc_tl
+% \end{macrocode}
+% We keep in memory that we have a rule to draw.
+% \begin{macrocode}
+ { \tl_set_eq:NN \l_tmpc_tl \l_tmpb_tl }
+ }
+ {
+ \tl_if_empty:NF \l_tmpc_tl
+ {
+ \@@_hline_ii:nnnn
+ { #1 }
+ { #2 }
+ \l_tmpc_tl
+ { \int_eval:n { \l_tmpb_tl - 1 } }
+ \tl_clear:N \l_tmpc_tl
+ }
+ }
+ }
+ \tl_if_empty:NF \l_tmpc_tl
+ {
+ \@@_hline_ii:nnnn
+ { #1 }
+ { #2 }
+ \l_tmpc_tl
+ { \int_use:N \c@jCol }
+ \tl_clear:N \l_tmpc_tl
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
% \begin{macrocode}
- \@@_qpoint: { row - \@@_succ:n\c@iRow }
- \dim_add:Nn \l_tmpa_dim \pgf@y
- \@@_qpoint: { row - \@@_succ:n \g_@@_row_total_int }
- \dim_sub:Nn \l_tmpa_dim \pgf@y
- \dim_sub:Nn \l_tmpa_dim \l_tmpb_dim
+\cs_new_protected:Npn \@@_test_in_corner_h:
+ {
+ \int_compare:nNnTF \l_tmpa_tl = { \@@_succ:n \c@iRow }
+ {
+ \seq_if_in:NxT
+ \l_@@_empty_corner_cells_seq
+ { \@@_pred:n \l_tmpa_tl - \l_tmpb_tl }
+ { \bool_set_false:N \g_tmpa_bool }
}
+ {
+ \seq_if_in:NxT
+ \l_@@_empty_corner_cells_seq
+ { \l_tmpa_tl - \l_tmpb_tl }
+ {
+ \int_compare:nNnTF \l_tmpa_tl = 1
+ { \bool_set_false:N \g_tmpa_bool }
+ {
+ \seq_if_in:NxT
+ \l_@@_empty_corner_cells_seq
+ { \@@_pred:n \l_tmpa_tl - \l_tmpb_tl }
+ { \bool_set_false:N \g_tmpa_bool }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% |#1| is the number of the row; |#2| is the number of horizontal rules to
+% draw (with potentially a color between); |#3| and |#4| are the number of the
+% columns between which the rule has to be drawn.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_hline_ii:nnnn #1 #2 #3 #4
+ {
+ \pgfrememberpicturepositiononpagetrue
+ \pgf@relevantforpicturesizefalse
+ \@@_qpoint:n { col - #3 }
+ \dim_set_eq:NN \l_tmpa_dim \pgf@x
+ \@@_qpoint:n { row - #1 }
+ \dim_set_eq:NN \l_tmpb_dim \pgf@y
+ \@@_qpoint:n { col - \@@_succ:n { #4 } }
+ \dim_set_eq:NN \l_tmpc_dim \pgf@x
+ \bool_lazy_and:nnT
+ { \int_compare_p:nNn { #2 } > 1 }
+ { ! \tl_if_blank_p:V \CT@drsc@ }
+ {
+ \group_begin:
+ \CT@drsc@
+ \dim_set:Nn \l_tmpd_dim
+ { \l_tmpb_dim - ( \doublerulesep + \arrayrulewidth ) * ( #2 - 1 ) }
+ \pgfpathrectanglecorners
+ { \pgfpoint \l_tmpa_dim \l_tmpb_dim }
+ { \pgfpoint \l_tmpc_dim \l_tmpd_dim }
+ \pgfusepathqfill
+ \group_end:
+ }
+ \pgfpathmoveto { \pgfpoint \l_tmpa_dim \l_tmpb_dim }
+ \pgfpathlineto { \pgfpoint \l_tmpc_dim \l_tmpb_dim }
+ \prg_replicate:nn { #2 - 1 }
+ {
+ \dim_sub:Nn \l_tmpb_dim \arrayrulewidth
+ \dim_sub:Nn \l_tmpb_dim \doublerulesep
+ \pgfpathmoveto { \pgfpoint \l_tmpa_dim \l_tmpb_dim }
+ \pgfpathlineto { \pgfpoint \l_tmpc_dim \l_tmpb_dim }
+ }
+ \CT@arc@
+ \pgfsetlinewidth { 1.1 \arrayrulewidth }
+ \pgfsetrectcap
+ \pgfusepathqstroke
+ }
% \end{macrocode}
%
-% Now, we can draw the lines with a loop.
+% \bigskip
% \begin{macrocode}
+\cs_new_protected:Npn \@@_hline_i_complete:nn #1 #2
+ { \@@_hline_ii:nnnn { #1 } { #2 } 1 { \int_use:N \c@jCol } }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_draw_hlines:| draws all the horizontal rules excepted in the
+% blocks (even the virtual drawn determined by commands such as |\Cdots| and in
+% the corners (if the key |except-corners| is used).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_hlines:
+ {
\int_step_inline:nnn
- { \bool_if:NTF \l_@@_NiceArray_bool 1 2 }
- { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@jCol } \c@jCol }
- {
- \pgfpathmoveto
+ { \bool_if:NTF \l_@@_NiceArray_bool 1 2 }
+ { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@iRow } \c@iRow }
+ { \@@_hline:nn { ##1 } 1 }
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% The command |\@@_Hline:| will be linked to |\Hline| in the environments of \pkg{nicematrix}.
+% \begin{macrocode}
+\cs_set:Npn \@@_Hline: { \noalign { \ifnum 0 = `} \fi \@@_Hline_i:n { 1 } }
+% \end{macrocode}
+%
+% \medskip
+% The argument of the command |\@@_Hline_i:n| is the number of successive
+% |\Hline| found.
+% \begin{macrocode}
+\cs_set:Npn \@@_Hline_i:n #1
+ {
+ \peek_meaning_ignore_spaces:NTF \Hline
+ { \@@_Hline_ii:nn { #1 + 1 } }
+ { \@@_Hline_iii:n { #1 } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set:Npn \@@_Hline_ii:nn #1 #2 { \@@_Hline_i:n { #1 } }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set:Npn \@@_Hline_iii:n #1
+ {
+ \skip_vertical:n
+ {
+ \arrayrulewidth * ( #1 )
+ + \doublerulesep * ( \int_max:nn 0 { #1 - 1 } )
+ }
+ \tl_gput_right:Nx \g_@@_internal_code_after_tl
+ { \@@_hline:nn { \@@_succ:n { \c@iRow } } { #1 } }
+ \ifnum 0 = `{ \fi }
+ }
+% \end{macrocode}
+%
+% \subsection*{The key hvlines}
+%
+%
+% The following command tests wether the current position in the array (given by
+% |\l_tmpa_tl| for the row and |\l_tmpb_tl| for the col) would provide an
+% horizontal rule towards the right in the block delimited by the four arguments
+% |#1|, |#2|, |#3| and |#4|. If this rule would be in the block (it must not be
+% drawn), the boolean |\l_tmpa_bool| is set to |false|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_if_hline_in_block:nnnn #1 #2 #3 #4
+ {
+ \bool_lazy_all:nT
+ {
+ { \int_compare_p:nNn \l_tmpa_tl > { #1 } }
+ { \int_compare_p:nNn \l_tmpa_tl < { #3 + 1 } }
+ { \int_compare_p:nNn \l_tmpb_tl > { #2 - 1 } }
+ { \int_compare_p:nNn \l_tmpb_tl < { #4 + 1 } }
+ }
+ { \bool_gset_false:N \g_tmpa_bool }
+ }
+% \end{macrocode}
+%
+% The same for vertical rules.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_if_vline_in_block:nnnn #1 #2 #3 #4
+ {
+ \bool_lazy_all:nT
+ {
+ { \int_compare_p:nNn \l_tmpa_tl > { #1 - 1 } }
+ { \int_compare_p:nNn \l_tmpa_tl < { #3 + 1 } }
+ { \int_compare_p:nNn \l_tmpb_tl > { #2 } }
+ { \int_compare_p:nNn \l_tmpb_tl < { #4 + 1 } }
+ }
+ { \bool_gset_false:N \g_tmpa_bool }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_if_hline_in_stroken_block:nnnn #1 #2 #3 #4
+ {
+ \bool_lazy_all:nT
+ {
+ { \int_compare_p:nNn \l_tmpa_tl > { #1 - 1 } }
+ { \int_compare_p:nNn \l_tmpa_tl < { #3 + 2 } }
+ { \int_compare_p:nNn \l_tmpb_tl > { #2 - 1 } }
+ { \int_compare_p:nNn \l_tmpb_tl < { #4 + 1 } }
+ }
+ { \bool_gset_false:N \g_tmpa_bool }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_if_vline_in_stroken_block:nnnn #1 #2 #3 #4
+ {
+ \bool_lazy_all:nT
+ {
+ { \int_compare_p:nNn \l_tmpa_tl > { #1 - 1 } }
+ { \int_compare_p:nNn \l_tmpa_tl < { #3 + 1 } }
+ { \int_compare_p:nNn \l_tmpb_tl > { #2 - 1 } }
+ { \int_compare_p:nNn \l_tmpb_tl < { #4 + 2 } }
+ }
+ { \bool_gset_false:N \g_tmpa_bool }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsubsection*{The key except-corners}
+%
+% When the key |except-corners| is raised, the rules are not drawn in the
+% corners. Of course, we have to compute the corners before we begin to draw the
+% rules.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_compute_corners:
+ {
+% \end{macrocode}
+% The sequence |\l_@@_empty_corner_cells_seq| will be the sequence of all the
+% empty cells (and not in a block) considered in the corners of the array.
+% \begin{macrocode}
+ \seq_clear_new:N \l_@@_empty_corner_cells_seq
+ \clist_map_inline:Nn \l_@@_except_corners_clist
+ {
+ \str_case:nnF { ##1 }
{
- \pgfpointadd
- { \@@_qpoint: { col - ##1 } }
- {
- \pgfpoint
- {
- -0.5 \arrayrulewidth
- \int_compare:nNnT { ##1 } = 1
- {
- \int_compare:nNnT \l_@@_first_col_int = 1
- { + \arrayrulewidth }
- }
- }
- { \l_tmpb_dim }
- }
+ { NW }
+ { \@@_compute_a_corner:nnnnnn 1 1 1 1 \c@iRow \c@jCol }
+ { NE }
+ { \@@_compute_a_corner:nnnnnn 1 \c@jCol 1 { -1 } \c@iRow 1 }
+ { SW }
+ { \@@_compute_a_corner:nnnnnn \c@iRow 1 { -1 } 1 1 \c@jCol }
+ { SE }
+ { \@@_compute_a_corner:nnnnnn \c@iRow \c@jCol { -1 } { -1 } 1 1 }
+ }
+ { \@@_error:nn { bad~corner } { ##1 } }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% ``Computing a corner'' is determining all the empty cells (which are not in a
+% block) that belong to that corner. These cells will be added to the sequence
+% |\l_@@_empty_corner_cells_seq|.
+%
+% \medskip
+% The six arguments of |\@@_compute_a_corner:nnnnnn| are as follow:
+% \begin{itemize}
+% \item |#1| and |#2| are the number of row and column of the cell which is
+% actually in the corner;
+% \item |#3| and |#4| are the steps in rows and the step in columns when moving
+% from the corner;
+% \item |#5| is the number of the final row when scanning the rows from the
+% corner;
+% \item |#6| is the number of the final column when scanning the columns from
+% the corner.
+% \end{itemize}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_compute_a_corner:nnnnnn #1 #2 #3 #4 #5 #6
+ {
+% \end{macrocode}
+% For the explanations and the name of the variables, we consider that we are
+% computing the left-upper corner.
+%
+% First, we try to determine which is the last empty cell (and not in a block:
+% we won't add that precision any longer) in the column of number~$1$. The flag
+% |\l_tmpa_bool| will be raised when a non-empty cell is found.
+% \begin{macrocode}
+ \bool_set_false:N \l_tmpa_bool
+ \int_zero_new:N \l_@@_last_empty_row_int
+ \int_set:Nn \l_@@_last_empty_row_int { #1 }
+ \int_step_inline:nnnn { #1 } { #3 } { #5 }
+ {
+ \@@_test_if_cell_in_a_block:nn { ##1 } { \int_eval:n { #2 } }
+ \bool_lazy_or:nnTF
+ {
+ \cs_if_exist_p:c
+ { pgf @ sh @ ns @ \@@_env: - ##1 - \int_eval:n { #2 } }
+ }
+ \l_tmpb_bool
+ { \bool_set_true:N \l_tmpa_bool }
+ {
+ \bool_if:NF \l_tmpa_bool
+ { \int_set:Nn \l_@@_last_empty_row_int { ##1 } }
}
- \pgfpathlineto
+ }
+% \end{macrocode}
+% Now, you determine the last empty cell in the row of number~$1$.
+% \begin{macrocode}
+ \bool_set_false:N \l_tmpa_bool
+ \int_zero_new:N \l_@@_last_empty_column_int
+ \int_set:Nn \l_@@_last_empty_column_int { #2 }
+ \int_step_inline:nnnn { #2 } { #4 } { #6 }
+ {
+ \@@_test_if_cell_in_a_block:nn { \int_eval:n { #1 } } { ##1 }
+ \bool_lazy_or:nnTF
+ \l_tmpb_bool
{
- \pgfpointadd
- { \@@_qpoint: { col - ##1 } }
+ \cs_if_exist_p:c
+ { pgf @ sh @ ns @ \@@_env: - \int_eval:n { #1 } - ##1 }
+ }
+ { \bool_set_true:N \l_tmpa_bool }
+ {
+ \bool_if:NF \l_tmpa_bool
+ { \int_set:Nn \l_@@_last_empty_column_int { ##1 } }
+ }
+ }
+% \end{macrocode}
+% Now, we loop over the rows.
+% \begin{macrocode}
+ \int_step_inline:nnnn { #1 } { #3 } \l_@@_last_empty_row_int
+ {
+% \end{macrocode}
+% We treat the row number |##1| with another loop.
+% \begin{macrocode}
+ \bool_set_false:N \l_tmpa_bool
+ \int_step_inline:nnnn { #2 } { #4 } \l_@@_last_empty_column_int
+ {
+ \@@_test_if_cell_in_a_block:nn { ##1 } { ####1 }
+ \bool_lazy_or:nnTF
+ \l_tmpb_bool
+ {
+ \cs_if_exist_p:c
+ { pgf @ sh @ ns @ \@@_env: - ##1 - ####1 }
+ }
+ { \bool_set_true:N \l_tmpa_bool }
{
- \pgfpoint
+ \bool_if:NF \l_tmpa_bool
{
- -0.5 \arrayrulewidth
- \int_compare:nNnT { ##1 } = 1
- {
- \int_compare:nNnT \l_@@_first_col_int = 1
- { + \arrayrulewidth }
- }
- }
- { \l_tmpb_dim + \l_tmpa_dim }
+ \int_set:Nn \l_@@_last_empty_column_int { ####1 }
+ \seq_put_right:Nn
+ \l_@@_empty_corner_cells_seq
+ { ##1 - ####1 }
+ }
}
}
}
- \pgfusepathqstroke
- \endpgfpicture
- \group_end:
}
% \end{macrocode}
%
+% \bigskip
+% The following macro tests whether a cell is in (at least) one of
+% the blocks of the array (or in a cell with a |\diagbox|).
+%
+% The flag |\l_tmpb_bool| will be raised if the cell |#1|-|#2| is in a block (or
+% in a cell with a |\diagbox|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_if_cell_in_a_block:nn #1 #2
+ {
+ \int_set:Nn \l_tmpa_int { #1 }
+ \int_set:Nn \l_tmpb_int { #2 }
+ \bool_set_false:N \l_tmpb_bool
+ \seq_map_inline:Nn \g_@@_pos_of_blocks_seq
+ { \@@_test_if_cell_in_block:nnnnnnn \l_tmpa_int \l_tmpb_int ##1 }
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_if_cell_in_block:nnnnnnn #1 #2 #3 #4 #5 #6
+ {
+ \int_compare:nNnT { #3 } < { \@@_succ:n { #1 } }
+ {
+ \int_compare:nNnT { #1 } < { \@@_succ:n { #5 } }
+ {
+ \int_compare:nNnT { #4 } < { \@@_succ:n { #2 } }
+ {
+ \int_compare:nNnT { #2 } < { \@@_succ:n { #6 } }
+ { \bool_set_true:N \l_tmpb_bool }
+ }
+ }
+ }
+ }
+% \end{macrocode}
%
+%
% \bigskip
% \subsection*{The commands to draw dotted lines to separate columns and rows}
%
% These commands don't use the normal nodes, the medium nor the large nodes.
-% They only use the |col|-nodes and the |row|-nodes.
+% They only use the |col| nodes and the |row| nodes.
%
% \textbf{Horizontal dotted lines}\par\nobreak
%
@@ -7407,14 +12308,10 @@ version 2005/12/01 or later.
% The following command must \emph{not} be protected because it's meant to be
% expanded in a |\noalign|.
% \begin{macrocode}
-\bool_if:NTF \c_@@_draft_bool
- { \cs_new:Npn \@@_hdottedline: { } }
+\cs_new:Npn \@@_hdottedline:
{
- \cs_new:Npn \@@_hdottedline:
- {
- \noalign { \skip_vertical:N 2\l_@@_radius_dim }
- \@@_hdottedline_i:
- }
+ \noalign { \skip_vertical:N 2\l_@@_radius_dim }
+ \@@_hdottedline_i:
}
% \end{macrocode}
%
@@ -7424,7 +12321,7 @@ version 2005/12/01 or later.
\cs_new_protected:Npn \@@_hdottedline_i:
{
% \end{macrocode}
-% We write in the code-after the instruction that will eventually draw the
+% We write in the code-after the instruction that will actually draw the
% dotted line. It's not possible to draw this dotted line now because we don't
% know the length of the line (we don't even know the number of columns).
% \begin{macrocode}
@@ -7444,7 +12341,9 @@ version 2005/12/01 or later.
% \end{macrocode}
% We recall that, when externalization is used, |\tikzpicture| and
% |\endtikzpicture| (or |\pgfpicture| and |\endpgfpicture|) must be directly
-% ``visible''.
+% ``visible''. That's why we construct now a version of |\@@_hdottedline:n| with
+% the right environment (|\begin{pgfpicture}\end{pgfpicture}| or
+% |\begin{tikzpiture}...\end{tikzpicture}|).
% \begin{macrocode}
\cs_new_protected:Npx \@@_hdottedline:n #1
{
@@ -7463,7 +12362,7 @@ version 2005/12/01 or later.
\cs_new_protected:Npn \@@_hdottedline_i:n #1
{
\pgfrememberpicturepositiononpagetrue
- \@@_qpoint: { row - #1 }
+ \@@_qpoint:n { row - #1 }
% \end{macrocode}
% We do a translation par |-\l_@@_radius_dim| because we want the dotted line to
% have exactly the same position as a vertical rule drawn by ``"|"''
@@ -7489,7 +12388,7 @@ version 2005/12/01 or later.
% \hline
% 1 & 2 & 3 & 4 \\
% \hdottedline
-% 1 & 2 & 3 & 4 \\
+% 1 & 2 & 3 & 4
% \end{bNiceMatrix}
% \end{BVerbatim}
% $\begin{bNiceMatrix}
@@ -7497,7 +12396,7 @@ version 2005/12/01 or later.
% \hline
% 1 & 2 & 3 & 4 \\
% \hdottedline
-% 1 & 2 & 3 & 4 \\
+% 1 & 2 & 3 & 4
% \end{bNiceMatrix}$
%
% \smallskip
@@ -7511,7 +12410,7 @@ version 2005/12/01 or later.
% \hline
% 1 & 2 & 3 & 4 \\
% \hdottedline
-% 1 & 2 & 3 & 4 \\
+% 1 & 2 & 3 & 4
% \end{bNiceMatrix}
% \end{BVerbatim}
% $\begin{bNiceMatrix}[margin]
@@ -7519,17 +12418,29 @@ version 2005/12/01 or later.
% \hline
% 1 & 2 & 3 & 4 \\
% \hdottedline
-% 1 & 2 & 3 & 4 \\
+% 1 & 2 & 3 & 4
% \end{bNiceMatrix}$
%
% \medskip
% \begin{macrocode}
- \@@_qpoint: { col - 1 }
+ \@@_qpoint:n { col - 1 }
\dim_set:Nn \l_@@_x_initial_dim
- { \pgf@x + \arraycolsep - \l_@@_left_margin_dim }
- \@@_qpoint: { col - \@@_succ:n \c@jCol }
+ {
+ \pgf@x +
+% \end{macrocode}
+% We do a reduction by |\arraycolsep| for the environments with delimiters (and
+% not for the other).
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_NiceArray_bool \c_zero_dim \arraycolsep
+ - \l_@@_left_margin_dim
+ }
+ \@@_qpoint:n { col - \@@_succ:n \c@jCol }
\dim_set:Nn \l_@@_x_final_dim
- { \pgf@x - \arraycolsep + \l_@@_right_margin_dim }
+ {
+ \pgf@x -
+ \bool_if:NTF \l_@@_NiceArray_bool \c_zero_dim \arraycolsep
+ + \l_@@_right_margin_dim
+ }
% \end{macrocode}
% For reasons purely aesthetic, we do an adjustment in the case of a rounded
% bracket. The correction by |0.5 \l_@@_inter_dots_dim| is \emph{ad hoc} for a
@@ -7544,7 +12455,7 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \medskip
-% As for now, we have no option to control the style of the lines drawn by
+% As of now, we have no option to control the style of the lines drawn by
% |\hdottedline| and the specifier ``|:|'' in the preamble. That's why we impose
% the style |standard|.
% \begin{macrocode}
@@ -7561,29 +12472,25 @@ version 2005/12/01 or later.
%
% \medskip
% \begin{macrocode}
-\bool_if:nTF \c_@@_draft_bool
- { \cs_new_protected:Npn \@@_vdottedline:n #1 { } }
+\cs_new_protected:Npn \@@_vdottedline:n #1
{
- \cs_new_protected:Npn \@@_vdottedline:n #1
- {
- \bool_set_true:N \l_@@_initial_open_bool
- \bool_set_true:N \l_@@_final_open_bool
+ \bool_set_true:N \l_@@_initial_open_bool
+ \bool_set_true:N \l_@@_final_open_bool
% \end{macrocode}
% We recall that, when externalization is used, |\tikzpicture| and
% |\endtikzpicture| (or |\pgfpicture| and |\endpgfpicture|) must be directly
% ``visible''.
% \begin{macrocode}
- \bool_if:NTF \c_@@_tikz_loaded_bool
- {
- \tikzpicture
- \@@_vdottedline_i:n { #1 }
- \endtikzpicture
- }
- {
- \pgfpicture
- \@@_vdottedline_i:n { #1 }
- \endpgfpicture
- }
+ \bool_if:NTF \c_@@_tikz_loaded_bool
+ {
+ \tikzpicture
+ \@@_vdottedline_i:n { #1 }
+ \endtikzpicture
+ }
+ {
+ \pgfpicture
+ \@@_vdottedline_i:n { #1 }
+ \endpgfpicture
}
}
% \end{macrocode}
@@ -7593,11 +12500,13 @@ version 2005/12/01 or later.
\cs_new_protected:Npn \@@_vdottedline_i:n #1
{
% \end{macrocode}
-% The command |\CT@arc@| is a command of color from \pkg{colortbl}.
+% The command |\CT@arc@| is a command of \pkg{colortbl} which sets the color of
+% the rules in the array. The package \pkg{nicematrix} uses it even if \pkg{colortbl} is not
+% loaded.
% \begin{macrocode}
- \bool_if:NT \c_@@_colortbl_loaded_bool \CT@arc@
+ \CT@arc@
\pgfrememberpicturepositiononpagetrue
- \@@_qpoint: { col - \int_eval:n { #1 + 1 } }
+ \@@_qpoint:n { col - \int_eval:n { #1 + 1 } }
% \end{macrocode}
% We do a translation par |-\l_@@_radius_dim| because we want the dotted line to
% have exactly the same position as a vertical rule drawn by ``"|"''
@@ -7605,16 +12514,16 @@ version 2005/12/01 or later.
% \begin{macrocode}
\dim_set:Nn \l_@@_x_initial_dim { \pgf@x - \l_@@_radius_dim }
\dim_set:Nn \l_@@_x_final_dim { \pgf@x - \l_@@_radius_dim }
- \@@_qpoint: { row - 1 }
+ \@@_qpoint:n { row - 1 }
% \end{macrocode}
% We arbitrary decrease the height of the dotted line by a quantity equal to
% |\l_@@_inter_dots_dim| in order to improve the visual impact.
% \begin{macrocode}
\dim_set:Nn \l_@@_y_initial_dim { \pgf@y - 0.5 \l_@@_inter_dots_dim }
- \@@_qpoint: { row - \@@_succ:n \c@iRow }
+ \@@_qpoint:n { row - \@@_succ:n \c@iRow }
\dim_set:Nn \l_@@_y_final_dim { \pgf@y + 0.5 \l_@@_inter_dots_dim }
% \end{macrocode}
-% As for now, we have no option to control the style of the lines drawn by
+% As of now, we have no option to control the style of the lines drawn by
% |\hdottedline| and the specifier ``|:|'' in the preamble. That's why we impose
% the style |standard|.
% \begin{macrocode}
@@ -7623,7 +12532,7 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
-%
+%
%
% \bigskip
% \subsection*{The environment \{NiceMatrixBlock\}}
@@ -7682,7 +12591,7 @@ version 2005/12/01 or later.
\cs_gset:cpn
{ @@ _ max _ cell _ width _ \int_use:N \g_@@_NiceMatrixBlock_int }
% \end{macrocode}
-% For technical reasons, we have to include the width of an eventual rule on the
+% For technical reasons, we have to include the width of a potential rule on the
% right side of the cells.
% \begin{macrocode}
{ \dim_eval:n { \g_@@_max_cell_width_dim + \arrayrulewidth } }
@@ -7701,6 +12610,26 @@ version 2005/12/01 or later.
\cs_generate_variant:Nn \dim_max:nn { v n }
% \end{macrocode}
%
+%
+% \bigskip
+% The following command is called in |\@@_use_arraybox_with_notes_c:| just
+% before the construction of the blocks (if the creation of medium nodes is
+% required, medium nodes are also created for the blocks dans that construction
+% uses the standard medium nodes).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_create_extra_nodes:
+ {
+ \bool_if:nTF \l_@@_medium_nodes_bool
+ {
+ \bool_if:NTF \l_@@_large_nodes_bool
+ \@@_create_medium_and_large_nodes:
+ \@@_create_medium_nodes:
+ }
+ { \bool_if:NT \l_@@_large_nodes_bool \@@_create_large_nodes: }
+ }
+% \end{macrocode}
+%
+%
% \bigskip
% We have three macros of creation of nodes: |\@@_create_medium_nodes:|,
% |\@@_create_large_nodes:| and |\@@_create_medium_and_large_nodes:|.
@@ -7802,7 +12731,7 @@ version 2005/12/01 or later.
\dim_compare:nNnT
{ \dim_use:c { l_@@_row _ \@@_i: _ min _ dim } } = \c_max_dim
{
- \@@_qpoint: { row - \@@_i: - base }
+ \@@_qpoint:n { row - \@@_i: - base }
\dim_set:cn { l_@@_row _ \@@_i: _ max _ dim } \pgf@y
\dim_set:cn { l_@@_row _ \@@_i: _ min _ dim } \pgf@y
}
@@ -7812,7 +12741,7 @@ version 2005/12/01 or later.
\dim_compare:nNnT
{ \dim_use:c { l_@@_column _ \@@_j: _ min _ dim } } = \c_max_dim
{
- \@@_qpoint: { col - \@@_j: }
+ \@@_qpoint:n { col - \@@_j: }
\dim_set:cn { l_@@_column _ \@@_j: _ max _ dim } \pgf@y
\dim_set:cn { l_@@_column _ \@@_j: _ min _ dim } \pgf@y
}
@@ -7845,11 +12774,11 @@ version 2005/12/01 or later.
%
% \medskip
% The command |\@@_create_large_nodes:| must be used when we want to create only
-% the ``large nodes'' and not the medium ones (if we want to create both, we
-% have to use |\@@_create_medium_and_large_nodes:|). However, the
+% the ``large nodes'' and not the medium ones\footnote{If we want to create
+% both, we have to use |\@@_create_medium_and_large_nodes:|}. However, the
% computation of the mathematical coordinates of the ``large nodes'' needs the
-% computation of the mathematical coordinates of the ``medium nodes''. Hence,
-% we use first |\@@_computations_for_medium_nodes:| and then the command
+% computation of the mathematical coordinates of the ``medium nodes''. Hence, we
+% use first |\@@_computations_for_medium_nodes:| and then the command
% |\@@_computations_for_large_nodes:|.
% \begin{macrocode}
\cs_new_protected:Npn \@@_create_large_nodes:
@@ -7928,9 +12857,9 @@ version 2005/12/01 or later.
\dim_set_eq:cc { l_@@_column _ \@@_succ:n \@@_j: _ min _ dim }
{ l_@@_column _ \@@_j: _ max _ dim }
}
-% \end{macrocode}
+% \end{macrocode}
% Here, we have to use |\dim_sub:cn| because of the number 1 in the name.
-% \begin{macrocode}
+% \begin{macrocode}
\dim_sub:cn
{ l_@@_column _ 1 _ min _ dim }
\l_@@_left_margin_dim
@@ -7943,7 +12872,7 @@ version 2005/12/01 or later.
%
%
% \bigskip
-% The control sequence |\@@_create_nodes:| is used twice: for the construction
+% The command |\@@_create_nodes:| is used twice: for the construction
% of the ``medium nodes'' and for the construction of the ``large nodes''. The
% nodes are constructed with the value of all the dimensions
% \texttt{l_@@_row_\textsl{i}_min_dim}, \texttt{l_@@_row_\textsl{i}_max_dim},
@@ -7995,8 +12924,8 @@ version 2005/12/01 or later.
% \begin{macrocode}
\cs_new_protected:Npn \@@_extract_coords_values: #1 - #2 \q_stop
{
- \cs_set:Npn \@@_i: { #1 }
- \cs_set:Npn \@@_j: { #2 }
+ \cs_set_nopar:Npn \@@_i: { #1 }
+ \cs_set_nopar:Npn \@@_j: { #2 }
}
% \end{macrocode}
%
@@ -8024,26 +12953,57 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \bigskip
-% \subsection*{Block matrices}
+% \subsection*{The blocks}
%
-% The code in this section if for the construction of \emph{block matrices}. It
-% has no direct link with the environment |{NiceMatrixBlock}|.
+% The code deals with the command |\Block|. This command has no direct link with
+% the environment |{NiceMatrixBlock}|.
+%
+% \bigskip
+% The options of the command |\Block| will be analyzed first in the cell of the
+% array (and once again when the block will be put in the array).
+% Here is the set of keys for the first pass.
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / Block / FirstPass }
+ {
+ l .code:n = \tl_set:Nn \l_@@_pos_of_block_tl l ,
+ l .value_forbidden:n = true ,
+ r .code:n = \tl_set:Nn \l_@@_pos_of_block_tl r ,
+ r .value_forbidden:n = true ,
+ c .code:n = \tl_set:Nn \l_@@_pos_of_block_tl c ,
+ c .value_forbidden:n = true ,
+% \end{macrocode}
+% The two following lines will be uncommented when we will give to the key
+% |color| its new definition.
+% \begin{macrocode}
+ % color .tl_set:N = \l_@@_color_tl ,
+ % color .value_required:n = true ,
+ }
+% \end{macrocode}
%
%
-% The following command will be linked to |\Block| in the environments of
-% \pkg{nicematrix}. We define it with |\NewDocumentCommand| of \pkg{xparse}
-% because it has an optional argument between |<| and |>| (for TeX instructions
-% put before the math mode of the label)
+% The following command |\@@_Block:| will be linked to |\Block| in the
+% environments of \pkg{nicematrix}. We define it with
+% |\NewExpandableDocumentCommand| because it has an optional argument between
+% |<| and |>| (for TeX instructions put before the math mode of the label and
+% before the beginning of the small array of the block). It's mandatory to use
+% an expandable command.
%
% \begin{macrocode}
-\NewDocumentCommand \@@_Block: { O { } m D < > { } m }
- { \@@_Block_i #2 \q_stop { #1 } { #3 } { #4 } }
+\NewExpandableDocumentCommand \@@_Block: { O { } m D < > { } m }
+ {
+% \end{macrocode}
+% If the first mandatory argument of the command (which is the size of the block
+% with the syntax $i$|-|$j$) has not be provided by the user, you use |1-1|
+% (that is to say a block of only one cell).
+% \begin{macrocode}
+ \tl_if_blank:nTF { #2 } { \@@_Block_i 1-1 \q_stop } { \@@_Block_i #2 \q_stop }
+ { #1 } { #3 } { #4 }
+ }
% \end{macrocode}
%
% \medskip
-% The first mandatory argument of |\@@_Block:| has a special syntax. It must be
-% of the form $i$|-|$j$ where $i$ and $j$ are the size (in rows and columns) of
-% the block.
+% With the following construction, we extract the values of $i$ and $j$ in the
+% first mandatory argument of the command.
% \begin{macrocode}
\cs_new:Npn \@@_Block_i #1-#2 \q_stop { \@@_Block_ii:nnnnn { #1 } { #2 } }
% \end{macrocode}
@@ -8051,201 +13011,755 @@ version 2005/12/01 or later.
% \medskip
% Now, the arguments have been extracted: |#1| is $i$ (the number of rows of the
% block), |#2| is $j$ (the number of columns of the block), |#3| is the list of
-% key-values, |#4| are the tokens to put before the math mode and |#5| is the
-% label of the block.
+% key-values, |#4| are the tokens to put before the math mode and the beginning
+% of the small array of the block and |#5| is the label of the block.
% \begin{macrocode}
\cs_new_protected:Npn \@@_Block_ii:nnnnn #1 #2 #3 #4 #5
{
% \end{macrocode}
-% We write an instruction in the |code-after|. We write the instruction in the
-% beginning of the |code-after| (the |left| in |\tl_gput_left:Nx|) because we
-% want the Tikz nodes corresponding of the block created \emph{before} potential
-% instructions written by the user in the |code-after| (these instructions may
-% use the Tikz node of the created block).
+%
+% \medskip
+% We recall that |#1| and |#2| have been extracted from the first mandatory
+% argument of |\Block| (which is of the syntax $i$|-|$j$). However, the user is
+% allowed to omit $i$ or $j$ (or both). We detect that situation by replacing a
+% missing value by 100 (it's a convention: when the block will actually be drawn
+% these values will be detected and interpreted as \emph{maximal possible value}).
% \begin{macrocode}
- \tl_gput_left:Nx \g_@@_internal_code_after_tl
+ \bool_lazy_or:nnTF
+ { \tl_if_blank_p:n { #1 } }
+ { \str_if_eq_p:nn { #1 } { * } }
+ { \int_set:Nn \l_tmpa_int { 100 } }
+ { \int_set:Nn \l_tmpa_int { #1 } }
+ \bool_lazy_or:nnTF
+ { \tl_if_blank_p:n { #2 } }
+ { \str_if_eq_p:nn { #2 } { * } }
+ { \int_set:Nn \l_tmpb_int { 100 } }
+ { \int_set:Nn \l_tmpb_int { #2 } }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \int_compare:nNnTF \l_tmpb_int = 1
{
- \@@_Block_iii:nnnnnn
- { \int_use:N \c@iRow }
- { \int_use:N \c@jCol }
- { \int_eval:n { \c@iRow + #1 - 1 } }
- { \int_eval:n { \c@jCol + #2 - 1 } }
- { #3 }
- \exp_not:n { { #4 $ #5 $ } }
- }
+ \tl_if_empty:NTF \l_@@_cell_type_tl
+ { \tl_set:Nn \l_@@_pos_of_block_tl c }
+ { \tl_set_eq:NN \l_@@_pos_of_block_tl \l_@@_cell_type_tl }
+ }
+ { \tl_set:Nn \l_@@_pos_of_block_tl c }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+ \keys_set_known:nn { NiceMatrix / Block / FirstPass } { #3 }
% \end{macrocode}
-% It's not allowed to use the command |\Block| twice in the same cell of the
-% array. That's why, at the first use, we link the command |\Block|
-% to a special version. The scope of this link is the cell of the array.
+%
+%
+% \begin{macrocode}
+ \tl_set:Nx \l_tmpa_tl
+ {
+ { \int_use:N \c@iRow }
+ { \int_use:N \c@jCol }
+ { \int_eval:n { \c@iRow + \l_tmpa_int - 1 } }
+ { \int_eval:n { \c@jCol + \l_tmpb_int - 1 } }
+ }
+% \end{macrocode}
+% Now, |\l_tmpa_tl| contains an ``object'' corresponding to the position of the
+% block with four components, each of them surrounded by curly brackets:
+%
+% |{|\textsl{imin}|}{|\textsl{jmin}|}{|\textsl{imax}|}{|\textsl{jmax}|}|.
+%
+%
+% \medskip
+% If the block is mono-column or mono-row, we have a special treatment. That's
+% why we have two macros: |\@@_Block_iv:nnnnn| and |\@@_Block_v:nnnnn| (the five
+% arguments of those macros are provided by curryfication).
% \begin{macrocode}
- \cs_set_eq:NN \Block \@@_Block_error:nn
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn { \l_tmpa_int } = 1 }
+ { \int_compare_p:nNn { \l_tmpb_int } = 1 }
+ { \exp_args:Nxx \@@_Block_iv:nnnnn }
+ { \exp_args:Nxx \@@_Block_v:nnnnn }
+ { \l_tmpa_int } { \l_tmpb_int } { #3 } { #4 } { #5 }
}
% \end{macrocode}
%
+%
+% \bigskip
+% The following macro is for the case of a |\Block| which is mono-row or
+% mono-column (or both). In that case, the content of the block is composed
+% right now in a box (because we have to take into account the dimensions of
+% that box for the width of the current column or the height and the depth of the
+% current row). However, that box will be put in the array \emph{after the
+% construction of the array} (by using \textsc{pgf}).
% \begin{macrocode}
-\cs_new:Npn \@@_Block_error:nn #1 #2
- {
- \@@_error:n { Second~Block }
- \cs_set_eq:NN \Block \use:nn
+\cs_new_protected:Npn \@@_Block_iv:nnnnn #1 #2 #3 #4 #5
+ {
+ \int_gincr:N \g_@@_block_box_int
+ \cs_set_protected_nopar:Npn \diagbox ##1 ##2
+ {
+ \tl_gput_right:Nx \g_@@_internal_code_after_tl
+ {
+ \@@_actually_diagbox:nnnnnn
+ { \int_use:N \c@iRow }
+ { \int_use:N \c@jCol }
+ { \int_eval:n { \c@iRow + #1 - 1 } }
+ { \int_eval:n { \c@jCol + #2 - 1 } }
+ { \exp_not:n { ##1 } } { \exp_not:n { ##2 } }
+ }
+ }
+ \box_gclear_new:c
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ \hbox_gset:cn
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ {
+% \end{macrocode}
+% For a mono-column block, if the user has specified a color for the column in
+% the preamble of the array, we want to fix that color in the box we construct.
+% We do that with |\set@color| and not |\color_ensure_current:| because that
+% command seems to be bugged: it doesn't work in XeLaTeX when \pkg{fontspec} is
+% loaded.
+% \begin{macrocode}
+ \tl_if_empty:NTF \l_@@_color_tl
+ { \int_compare:nNnT { #2 } = 1 \set@color }
+ { \color { \l_@@_color_tl } }
+ \group_begin:
+ \cs_set:Npn \arraystretch { 1 }
+ \dim_set_eq:NN \extrarowheight \c_zero_dim
+ #4
+% \end{macrocode}
+% If the box is rotated (the key |\rotate| may be in the previous |#4|), the
+% tabular used for the content of the cell will be constructed with a format
+% |c|. In the other cases, the tabular will be constructed with a format equal
+% to the key of position of the box. In other words: the alignement internal to
+% the tabular is the same as the external alignment of the tabular (that is to
+% say the position of the block in its zone of merged cells).
+% \begin{macrocode}
+ \bool_if:NT \g_@@_rotate_bool { \tl_set:Nn \l_@@_pos_of_block_tl c }
+ \bool_if:NTF \l_@@_NiceTabular_bool
+ {
+ \exp_args:Nnx \begin { tabular }
+ { @ { } \l_@@_pos_of_block_tl @ { } }
+ #5
+ \end { tabular }
+ }
+ {
+ \c_math_toggle_token
+ \exp_args:Nnx \begin { array }
+ { @ { } \l_@@_pos_of_block_tl @ { } }
+ #5
+ \end { array }
+ \c_math_toggle_token
+ }
+ \group_end:
+ }
+ \bool_if:NT \g_@@_rotate_bool
+ {
+ \box_grotate:cn
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ { 90 }
+ \bool_gset_false:N \g_@@_rotate_bool
+ }
+% \end{macrocode}
+% If we are in a mono-column block, we take into account the width of that block
+% for the width of the column.
+% \begin{macrocode}
+ \int_compare:nNnT { #2 } = 1
+ {
+ \dim_gset:Nn \g_@@_blocks_wd_dim
+ {
+ \dim_max:nn
+ \g_@@_blocks_wd_dim
+ {
+ \box_wd:c
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ }
+ }
+ }
+% \end{macrocode}
+% If we are in a mono-row block, we take into account the height and the
+% depth of that block for the height and the depth of the row.
+% \begin{macrocode}
+ \int_compare:nNnT { #1 } = 1
+ {
+ \dim_gset:Nn \g_@@_blocks_ht_dim
+ {
+ \dim_max:nn
+ \g_@@_blocks_ht_dim
+ {
+ \box_ht:c
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ }
+ }
+ \dim_gset:Nn \g_@@_blocks_dp_dim
+ {
+ \dim_max:nn
+ \g_@@_blocks_dp_dim
+ {
+ \box_dp:c
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ }
+ }
+ }
+ \seq_gput_right:Nx \g_@@_blocks_seq
+ {
+ \l_tmpa_tl
+% \end{macrocode}
+% In the list of options |#3|, maybe there is a key for the horizontal alignment
+% (|l|, |r| or |c|). In that case, that key has been read and stored in
+% |\l_@@_pos_of_block_tl|. However, maybe there were no key of the horizontal
+% alignement and that's why we put a key corresponding to the value of
+% |\l_@@_pos_of_block_tl|, which is fixed by the type of current column.
+% \begin{macrocode}
+ { \exp_not:n { #3 } , \l_@@_pos_of_block_tl }
+ {
+ \box_use_drop:c
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ }
+ }
}
% \end{macrocode}
%
-% \medskip
+% \bigskip
+% The following macro is for the standard case, where the block is not mono-row
+% and not mono-column. In that case, the content of the block is \emph{not}
+% composed right now in a box. The composition in a box will be done further,
+% just after the construction of the array.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_Block_v:nnnnn #1 #2 #3 #4 #5
+ {
+ \seq_gput_right:Nx \g_@@_blocks_seq
+ {
+ \l_tmpa_tl
+ { \exp_not:n { #3 } }
+ \exp_not:n
+ {
+ {
+ \bool_if:NTF \l_@@_NiceTabular_bool
+ {
+ \group_begin:
+ \cs_set:Npn \arraystretch { 1 }
+ \dim_set_eq:NN \extrarowheight \c_zero_dim
+ #4
+% \end{macrocode}
+% If the box is rotated (the key |\rotate| may be in the previous |#4|), the
+% tabular used for the content of the cell will be constructed with a format
+% |c|. In the other cases, the tabular will be constructed with a format equal
+% to the key of position of the box. In other words: the alignement internal to
+% the tabular is the same as the external alignment of the tabular (that is to
+% say the position of the block in its zone of merged cells).
+% \begin{macrocode}
+ \bool_if:NT \g_@@_rotate_bool
+ { \tl_set:Nn \l_@@_pos_of_block_tl c }
+ \exp_args:Nnx \begin { tabular }
+ { @ { } \l_@@_pos_of_block_tl @ { } }
+ #5
+ \end { tabular }
+ \group_end:
+ }
+ {
+ \group_begin:
+ \cs_set:Npn \arraystretch { 1 }
+ \dim_set_eq:NN \extrarowheight \c_zero_dim
+ #4
+ \bool_if:NT \g_@@_rotate_bool
+ { \tl_set:Nn \l_@@_pos_of_block_tl c }
+ \c_math_toggle_token
+ \exp_args:Nnx \begin { array }
+ { @ { } \l_@@_pos_of_block_tl @ { } } #5 \end { array }
+ \c_math_toggle_token
+ \group_end:
+ }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We recall that the options of the command |\Block| are analyzed twice: first
+% in the cell of the array and once again when the block will be put in the
+% array \emph{after the construction of the array} (by using \textsc{pgf}).
+%
+% \medskip
% \begin{macrocode}
-\keys_define:nn { NiceMatrix / Block }
+\keys_define:nn { NiceMatrix / Block / SecondPass }
{
- tikz .tl_set:N = \l_@@_tikz_tl ,
- tikz .value_required:n = true ,
- white .bool_set:N = \l_@@_white_bool ,
- white .default:n = true ,
- white .value_forbidden:n = true ,
+ fill .tl_set:N = \l_@@_fill_tl ,
+ fill .value_required:n = true ,
+ draw .tl_set:N = \l_@@_draw_tl ,
+ draw .default:n = default ,
+% \end{macrocode}
+% The following definition for the key |color| will be deleted when we will give
+% to the key |color| of the command |\Block| its new definition. It will be
+% replaced by the line which is commented.
+% \begin{macrocode}
+ color .code:n =
+ \@@_error:n { Key~color~for~Block }
+ \tl_set:Nn \l_@@_fill_tl { #1 } ,
+ % color .code:n = \color { #1 } \tl_set:Nn \l_@@_draw_tl { #1 } ,
+ color .value_required:n = true ,
+ line-width .dim_set:N = \l_@@_line_width_dim ,
+ line-width .value_required:n = true ,
+ l .code:n = \tl_set:Nn \l_@@_pos_of_block_tl l ,
+ l .value_forbidden:n = true ,
+ r .code:n = \tl_set:Nn \l_@@_pos_of_block_tl r ,
+ r .value_forbidden:n = true ,
+ c .code:n = \tl_set:Nn \l_@@_pos_of_block_tl c ,
+ c .value_forbidden:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~Block }
}
% \end{macrocode}
%
+% \bigskip
+% The command |\@@_draw_blocks:| will draw all the blocks. This command is used
+% after the construction of the array. We have to revert to a clean version of
+% |\ialign| because there may be tabulars in the |\Block| instructions that will
+% be composed now.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_blocks:
+ {
+ \cs_set_eq:NN \ialign \@@_old_ialign:
+ \seq_map_inline:Nn \g_@@_blocks_seq { \@@_Block_iv:nnnnnn ##1 }
+ }
+% \end{macrocode}
%
-% \medskip
-% The following command |\@@_Block_iii:nnnnnn| will be used in the |code-after|.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_Block_iii:nnnnnn #1 #2 #3 #4 #5 #6
+\cs_new_protected:Npn \@@_Block_iv:nnnnnn #1 #2 #3 #4 #5 #6
+ {
+% \end{macrocode}
+% The integer |\l_@@_last_row_int| will be the last row of the block and
+% |\l_@@_last_col_int| its last column.
+% \begin{macrocode}
+ \int_zero_new:N \l_@@_last_row_int
+ \int_zero_new:N \l_@@_last_col_int
+% \end{macrocode}
+%
+% We remind that the first mandatory argument of the command |\Block| is the
+% size of the block with the special format $i$|-|$j$. However, the user is
+% allowed to omit $i$ or $j$ (or both). This will be interpreted as: the last
+% row (resp. column) of the block will be the last row (resp. column) of the
+% block (without the potential exterior row---resp. column---of the array). By
+% convention, this is stored in |\g_@@_blocks_seq| as a number of rows (resp.
+% columns) for the block equal to 100. That's what we detect now.
+% \begin{macrocode}
+ \int_compare:nNnTF { #3 } > { 99 }
+ { \int_set_eq:NN \l_@@_last_row_int \c@iRow }
+ { \int_set:Nn \l_@@_last_row_int { #3 } }
+ \int_compare:nNnTF { #4 } > { 99 }
+ { \int_set_eq:NN \l_@@_last_col_int \c@jCol }
+ { \int_set:Nn \l_@@_last_col_int { #4 } }
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn \l_@@_last_row_int > \g_@@_row_total_int }
+ { \int_compare_p:nNn \l_@@_last_col_int > \g_@@_col_total_int }
+ {
+ \int_compare:nTF
+ { \l_@@_last_col_int <= \g_@@_static_num_of_col_int }
+ {
+ \msg_error:nnnn { nicematrix } { Block~too~large~2 } { #1 } { #2 }
+ \@@_msg_redirect_name:nn { Block~too~large~2 } { none }
+ \group_begin:
+ \globaldefs = 1
+ \@@_msg_redirect_name:nn { columns~not~used } { none }
+ \group_end:
+ }
+ { \msg_error:nnnn { nicematrix } { Block~too~large~1 } { #1 } { #2 } }
+ }
+ { \@@_Block_v:nnnnnn { #1 } { #2 } { #3 } { #4 } { #5 } { #6 } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_Block_v:nnnnnn #1 #2 #3 #4 #5 #6
{
% \end{macrocode}
+% The sequence of the positions of the blocks will be used when drawing the rules
+% (in fact, there is also the |\multicolumn| and the |\diagbox| in that sequence).
+% \begin{macrocode}
+ \seq_gput_left:Nn \g_@@_pos_of_blocks_seq { { #1 } { #2 } { #3 } { #4 } }
+% \end{macrocode}
+%
% The group is for the keys.
% \begin{macrocode}
\group_begin:
- \keys_set:nn { NiceMatrix / Block } { #5 }
+ \keys_set:nn { NiceMatrix / Block / SecondPass } { #5 }
% \end{macrocode}
%
+%
% \begin{macrocode}
- \bool_if:nTF
- {
- \int_compare_p:nNn { #3 } > \c@iRow
- || \int_compare_p:nNn { #4 } > \c@jCol
- }
- { \msg_error:nnnn { nicematrix } { Block~too~large } { #1 } { #2 } }
+ \bool_lazy_or:nnT
+ { ! \tl_if_empty_p:N \l_@@_draw_tl }
+ { \dim_compare_p:nNn \l_@@_line_width_dim > \c_zero_dim }
{
+ \tl_gput_right:Nx \g_nicematrix_code_after_tl
+ {
+ \@@_stroke_block:nnn
+ { \exp_not:n { #5 } }
+ { #1 - #2 }
+ { \int_use:N \l_@@_last_row_int - \int_use:N \l_@@_last_col_int }
+ }
+ \seq_gput_right:Nn \g_@@_pos_of_stroken_blocks_seq
+ { { #1 } { #2 } { #3 } { #4 } }
+ }
% \end{macrocode}
-% We put the contents of the cell in the box |\l_@@_cell_box| because we want
-% the command |\rotate| used in the content to be able to rotate the box.
+%
% \begin{macrocode}
- \hbox_set:Nn \l_@@_cell_box { #6 }
+ \tl_if_empty:NF \l_@@_fill_tl
+ {
+ \tl_gput_right:Nx \g_nicematrix_code_before_tl
+ {
+ \exp_not:N \rectanglecolor
+ { \exp_not:V \l_@@_fill_tl }
+ { #1 - #2 }
+ { \int_use:N \l_@@_last_row_int - \int_use:N \l_@@_last_col_int }
+ }
+ }
% \end{macrocode}
-%
+%
% \medskip
-% The construction of the node corresponding to the merged cells.
% \begin{macrocode}
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \pgf@relevantforpicturesizefalse
- \@@_qpoint: { row - #1 }
- \dim_set_eq:NN \l_tmpa_dim \pgf@y
- \@@_qpoint: { col - #2 }
- \dim_set_eq:NN \l_tmpb_dim \pgf@x
- \@@_qpoint: { row - \@@_succ:n { #3 } }
- \dim_set_eq:NN \l_tmpc_dim \pgf@y
- \@@_qpoint: { col - \@@_succ:n { #4 } }
- \dim_set_eq:NN \l_tmpd_dim \pgf@x
+ \cs_set_protected_nopar:Npn \diagbox ##1 ##2
+ {
+ \tl_gput_right:Nx \g_@@_internal_code_after_tl
+ {
+ \@@_actually_diagbox:nnnnnn
+ { #1 }
+ { #2 }
+ { \int_use:N \l_@@_last_row_int }
+ { \int_use:N \l_@@_last_col_int }
+ { \exp_not:n { ##1 } } { \exp_not:n { ##2 } }
+ }
+ }
% \end{macrocode}
%
% \medskip
-% The following code doesn't work for the first vertical rule. You should allow
-% the option |white| if and only if the option |vlines| and |hlines| has been used.
% \begin{macrocode}
- \bool_if:NT \l_@@_white_bool
- {
- \begin { pgfscope }
- \pgfsetfillcolor { white }
+ \hbox_set:Nn \l_@@_cell_box { #6 }
+ \bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box:
% \end{macrocode}
-% Usually, the vertical rules are \emph{before} the |col|-nodes. But there is an
-% exception: if there is no ``first col'', the first vertical rule is after the
-% col node.\footnote{That's true for the vertical rules drawn by ``"|"'' due to
-% the conception of |{array}| (of \pkg{array}) and we have managed to have the
-% same behaviour with |vlines|.}
+%
+% \bigskip
+% Let's consider the following |{NiceTabular}|. Because of the instruction
+% |!{\hspace{1cm}}| in the preamble which increases the space between the
+% columns (by adding, in fact, that space to the previous column, that is to say
+% the second column of the tabular), we will create \emph{two} nodes relative to
+% the block: the node |1-1-block| and the node |1-1-block-short|. The latter
+% will be used by \pkg{nicematrix} to put the label of the node. The first one
+% won't be used explicitely.
+% \begin{Verbatim}
+% \begin{NiceTabular}{cc!{\hspace{1cm}}c}
+% \Block{2-2}{our block} & & one \\
+% & & two \\
+% three & four & five \\
+% six & seven & eight \\
+% \end{NiceTabular}
+% \end{Verbatim}
%
-% Since we don't want the white rectangle to erase a part of this
-% first rule, we have to do an adjustment in this case.
-% \emph{after} the ``col node''.
+% \tikzset{highlight/.style={rectangle,
+% fill=red!15,
+% blend mode = multiply,
+% rounded corners = 0pt,
+% inner sep=0pt,
+% fit = #1}}
+%
+% \begin{tabular}{c!{\hspace{1cm}}c}
+% We highlight the node |1-1-block|
+% & We highlight the node |1-1-block-short| \\[2mm]
+% \begin{NiceTabular}{cc!{\hspace{1cm}}c}
+% \Block{2-2}{our block} & & one \\
+% & & two \\
+% three & four & five \\
+% six & seven & eight \\
+% \CodeAfter
+% \tikz \node [highlight = (1-1-block)] { } ;
+% \end{NiceTabular}
+% &
+% \begin{NiceTabular}{cc!{\hspace{1cm}}c}
+% \Block{2-2}{our block} & & one \\
+% & & two \\
+% three & four & five \\
+% six & seven & eight \\
+% \CodeAfter
+% \tikz \node [highlight = (1-1-block-short)] { } ;
+% \end{NiceTabular}
+% \end{tabular}
+%
+%
+% \bigskip
+% The construction of the node corresponding to the merged cells.
% \begin{macrocode}
- \int_compare:nNnT { #2 } = 1
- {
- \int_compare:nNnT \l_@@_first_col_int = 1
- { \dim_add:Nn \l_tmpb_dim \arrayrulewidth }
- }
- \pgfpathrectanglecorners
- { \pgfpoint \l_tmpb_dim { \l_tmpa_dim - \arrayrulewidth } }
- { \pgfpoint { \l_tmpd_dim - \arrayrulewidth } \l_tmpc_dim }
- \pgfusepathqfill
- \end { pgfscope }
- }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf@relevantforpicturesizefalse
+ \@@_qpoint:n { row - #1 }
+ \dim_set_eq:NN \l_tmpa_dim \pgf@y
+ \@@_qpoint:n { col - #2 }
+ \dim_set_eq:NN \l_tmpb_dim \pgf@x
+ \@@_qpoint:n { row - \@@_succ:n { \l_@@_last_row_int } }
+ \dim_set_eq:NN \l_tmpc_dim \pgf@y
+ \@@_qpoint:n { col - \@@_succ:n { \l_@@_last_col_int } }
+ \dim_set_eq:NN \l_tmpd_dim \pgf@x
% \end{macrocode}
%
% We construct the node for the block with the name |(#1-#2-block)|.
-% The function |\@@_pgf_rect_node:nnnnn| takes as arguments the name of the node
+%
+% The function |\@@_pgf_rect_node:nnnnn| takes in as arguments the name of the node
% and the four coordinates of two opposite corner points of the rectangle.
% \begin{macrocode}
- \begin { pgfscope }
- \exp_args:Nx \pgfset { \l_@@_tikz_tl }
- \@@_pgf_rect_node:nnnnn
- { \@@_env: - #1 - #2 - block }
- \l_tmpb_dim \l_tmpa_dim \l_tmpd_dim \l_tmpc_dim
- \end { pgfscope }
+ \begin { pgfscope }
+ \@@_pgf_rect_node:nnnnn
+ { \@@_env: - #1 - #2 - block }
+ \l_tmpb_dim \l_tmpa_dim \l_tmpd_dim \l_tmpc_dim
+ \end { pgfscope }
+% \end{macrocode}
+%
+% \medskip
+% We construct the |short| node.
+% \begin{macrocode}
+ \dim_set_eq:NN \l_tmpb_dim \c_max_dim
+ \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int
+ {
+% \end{macrocode}
+% We recall that, when a cell is empty, no (normal) node is created in that
+% cell. That's why we test the existence of the node before using it.
+% \begin{macrocode}
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - #2 }
+ {
+ \seq_if_in:NnF \g_@@_multicolumn_cells_seq { ##1 - #2 }
+ {
+ \pgfpointanchor { \@@_env: - ##1 - #2 } { west }
+ \dim_set:Nn \l_tmpb_dim { \dim_min:nn \l_tmpb_dim \pgf@x }
+ }
+ }
+ }
+% \end{macrocode}
+% If all the cells of the column were empty, |\l_tmpb_dim| has still the same
+% value |\c_max_dim|. In that case, you use for |\l_tmpb_dim| the value of the
+% position of the vertical rule.
+% \begin{macrocode}
+ \dim_compare:nNnT \l_tmpb_dim = \c_max_dim
+ {
+ \@@_qpoint:n { col - #2 }
+ \dim_set_eq:NN \l_tmpb_dim \pgf@x
+ }
+ \dim_set:Nn \l_tmpd_dim { - \c_max_dim }
+ \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - \int_use:N \l_@@_last_col_int }
+ {
+ \seq_if_in:NnF \g_@@_multicolumn_cells_seq { ##1 - #2 }
+ {
+ \pgfpointanchor
+ { \@@_env: - ##1 - \int_use:N \l_@@_last_col_int }
+ { east }
+ \dim_set:Nn \l_tmpd_dim { \dim_max:nn \l_tmpd_dim \pgf@x }
+ }
+ }
+ }
+ \dim_compare:nNnT \l_tmpd_dim = { - \c_max_dim }
+ {
+ \@@_qpoint:n { col - \@@_succ:n { \l_@@_last_col_int } }
+ \dim_set_eq:NN \l_tmpd_dim \pgf@x
+ }
+ \@@_pgf_rect_node:nnnnn
+ { \@@_env: - #1 - #2 - block - short }
+ \l_tmpb_dim \l_tmpa_dim \l_tmpd_dim \l_tmpc_dim
% \end{macrocode}
-%
%
% \medskip
% If the creation of the ``medium nodes'' is required, we create a ``medium
-% node'' for the block. The function |\@@_pgf_rect_node:nnnnn| takes as
+% node'' for the block. The function |\@@_pgf_rect_node:nnnnn| takes in as
% arguments the name of the node and two \textsc{pgf} points.
% \begin{macrocode}
- \bool_if:NT \l_@@_medium_nodes_bool
- {
- \@@_pgf_rect_node:nnn
- { \@@_env: - #1 - #2 - block - medium }
- { \pgfpointanchor { \@@_env: - #1 - #2 - medium } { north~west } }
- { \pgfpointanchor { \@@_env: - #3 - #4 - medium } { south~east } }
- }
+ \bool_if:NT \l_@@_medium_nodes_bool
+ {
+ \@@_pgf_rect_node:nnn
+ { \@@_env: - #1 - #2 - block - medium }
+ { \pgfpointanchor { \@@_env: - #1 - #2 - medium } { north~west } }
+ {
+ \pgfpointanchor
+ { \@@_env:
+ - \int_use:N \l_@@_last_row_int
+ - \int_use:N \l_@@_last_col_int - medium
+ }
+ { south~east }
+ }
+ }
% \end{macrocode}
% \medskip
-% Now, we will put the label of the block.
+% Now, we will put the label of the block beginning with the case of a |\Block|
+% of one row.
% \begin{macrocode}
- \int_compare:nNnTF { #1 } = { #3 }
- {
+ \int_compare:nNnTF { #1 } = { #3 }
+ {
+% \end{macrocode}
+% We take into account the case of a block of one row in the ``first row'' or
+% the ``last row''.
+% \begin{macrocode}
+ \int_compare:nNnTF { #1 } = 0
+ { \l_@@_code_for_first_row_tl }
+ {
+ \int_compare:nNnT { #1 } = \l_@@_last_row_int
+ \l_@@_code_for_last_row_tl
+ }
% \end{macrocode}
% If the block has only one row, we want the label of the block perfectly
% aligned on the baseline of the row. That's why we have constructed a
% |\pgfcoordinate| on the baseline of the row, in the first column of the array.
% Now, we retrieve the $y$-value of that node and we store it in |\l_tmpa_dim|.
% \begin{macrocode}
- \pgfextracty \l_tmpa_dim { \@@_qpoint: { row - #1 - base } }
+ \pgfextracty \l_tmpa_dim { \@@_qpoint:n { row - #1 - base } }
% \end{macrocode}
% We retrieve (in |\pgf@x|) the $x$-value of the center of the block.
% \begin{macrocode}
- \@@_qpoint: { #1 - #2 - block }
+ \pgfpointanchor
+ { \@@_env: - #1 - #2 - block - short }
+ {
+ \str_case:Vn \l_@@_pos_of_block_tl
+ {
+ c { center }
+ l { west }
+ r { east }
+ }
+ }
% \end{macrocode}
% We put the label of the block which has been composed in |\l_@@_cell_box|.
% \begin{macrocode}
- \pgftransformshift { \pgfpoint \pgf@x \l_tmpa_dim }
- \pgfnode { rectangle } { base }
- { \box_use_drop:N \l_@@_cell_box } { } { }
- }
+ \pgftransformshift { \pgfpoint \pgf@x \l_tmpa_dim }
+ \pgfset { inner~sep = \c_zero_dim }
+ \pgfnode
+ { rectangle }
+ {
+ \str_case:Vn \l_@@_pos_of_block_tl
+ {
+ c { base }
+ l { base~west }
+ r { base~east }
+ }
+ }
+ { \box_use_drop:N \l_@@_cell_box } { } { }
+ }
% \end{macrocode}
%
% \medskip
-% If the number of rows is different of $1$, we put the label of the block in
-% the center of the node (the label of the block has been composed in
-% |\l_@@_cell_box|).
+% If the number of rows is different of $1$, we will put the label of the block
+% by using the short node (the label of the block has been composed in
+% |\l_@@_cell_box|).
% \begin{macrocode}
- {
- \pgftransformshift { \@@_qpoint: { #1 - #2 - block } }
- \pgfnode { rectangle } { center }
- { \box_use_drop:N \l_@@_cell_box } { } { }
- }
- \endpgfpicture
+ {
+% \end{macrocode}
+% If we are in the first column, we must put the block as if it was with the key~|r|.
+% \begin{macrocode}
+ \int_compare:nNnT { #2 } = 0
+ { \tl_set:Nn \l_@@_pos_of_block_tl r }
+ \bool_if:nT \g_@@_last_col_found_bool
+ {
+ \int_compare:nNnT { #2 } = \g_@@_col_total_int
+ { \tl_set:Nn \l_@@_pos_of_block_tl l }
+ }
+ \pgftransformshift
+ {
+ \pgfpointanchor
+ { \@@_env: - #1 - #2 - block - short }
+ {
+ \str_case:Vn \l_@@_pos_of_block_tl
+ {
+ c { center }
+ l { west }
+ r { east }
+ }
+ }
+ }
+ \pgfset { inner~sep = \c_zero_dim }
+ \pgfnode
+ { rectangle }
+ {
+ \str_case:Vn \l_@@_pos_of_block_tl
+ {
+ c { center }
+ l { west }
+ r { east }
+ }
+ }
+ { \box_use_drop:N \l_@@_cell_box } { } { }
+ }
+ \endpgfpicture
+ \group_end:
+ }
+% \end{macrocode}
+%
+%
+% % \bigskip
+% The first argument of |\@@_stroke_block:nnn| is a list of options for the
+% rectangle that you will stoke. The second argument is the upper-left cell of
+% the block (with, as usual, the syntex $i$|-|$j$) and the third is the last
+% cell of the block (with the same syntax).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_stroke_block:nnn #1 #2 #3
+ {
+ \group_begin:
+ \tl_clear:N \l_@@_draw_tl
+ \dim_set_eq:NN \l_@@_line_width_dim \arrayrulewidth
+ \keys_set_known:nn { NiceMatrix / BlockStroke } { #1 }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf@relevantforpicturesizefalse
+ \tl_if_empty:NF \l_@@_draw_tl
+ {
+% \end{macrocode}
+% If the user has used the key |color| of the command |\Block| without value,
+% the color fixed by |\arrayrulecolor| is used.
+% \begin{macrocode}
+ \str_if_eq:VnTF \l_@@_draw_tl { default }
+ { \CT@arc@ }
+ { \pgfsetstrokecolor { \l_@@_draw_tl } }
}
+ \@@_cut_on_hyphen:w #2 \q_stop
+ \bool_lazy_and:nnT
+ { \int_compare_p:n { \l_tmpa_tl <= \c@iRow } }
+ { \int_compare_p:n { \l_tmpb_tl <= \c@jCol } }
+ {
+ \@@_qpoint:n { row - \l_tmpa_tl }
+ \dim_set:Nn \l_tmpb_dim { \pgf@y }
+ \@@_qpoint:n { col - \l_tmpb_tl }
+ \dim_set:Nn \l_tmpc_dim { \pgf@x }
+ \@@_cut_on_hyphen:w #3 \q_stop
+ \int_compare:nNnT \l_tmpa_tl > \c@iRow
+ { \tl_set:Nx \l_tmpa_tl { \int_use:N \c@iRow } }
+ \int_compare:nNnT \l_tmpb_tl > \c@jCol
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@jCol } }
+ \@@_qpoint:n { row - \@@_succ:n \l_tmpa_tl }
+ \dim_set:Nn \l_tmpa_dim { \pgf@y }
+ \@@_qpoint:n { col - \@@_succ:n \l_tmpb_tl }
+ \dim_set:Nn \l_tmpd_dim { \pgf@x }
+ \pgfpathrectanglecorners
+ { \pgfpoint \l_tmpc_dim \l_tmpb_dim }
+ { \pgfpoint \l_tmpd_dim \l_tmpa_dim }
+ \pgfsetlinewidth { 1.1 \l_@@_line_width_dim }
+ \pgfusepathqstroke
+ }
+ \endpgfpicture
\group_end:
}
% \end{macrocode}
%
+% Here is the set of keys for the command |\@@_stroke_block:nnn|.
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / BlockStroke }
+ {
+% \end{macrocode}
+% We will uncomment the following line when we will give to the key |color| of
+% the command |\Block| its new definition.
+% \begin{macrocode}
+ % color .tl_set:N = \l_@@_draw_tl ,
+ draw .tl_set:N = \l_@@_draw_tl ,
+ draw .default:n = default ,
+ line-width .dim_set:N = \l_@@_line_width_dim ,
+ }
+% \end{macrocode}
+%
% \bigskip
+%
% \subsection*{How to draw the dotted lines transparently}
% \begin{macrocode}
\cs_set_protected:Npn \@@_renew_matrix:
@@ -8289,7 +13803,7 @@ version 2005/12/01 or later.
\int_zero_new:N \l_@@_nb_cols_int
\@@_set_size:n #4 \q_stop
\begin { NiceArrayWithDelims } { #1 } { #2 }
- { * { \l_@@_nb_cols_int } { C } } [ #3 , #5 , #7 ]
+ { * { \l_@@_nb_cols_int } { c } } [ #3 , #5 , #7 ]
\int_compare:nNnT \l_@@_first_row_int = 0
{
\int_compare:nNnT \l_@@_first_col_int = 0 { & }
@@ -8300,7 +13814,7 @@ version 2005/12/01 or later.
{
\int_compare:nNnT \l_@@_first_col_int = 0 { & }
% \end{macrocode}
-% You put |{ }| before |#6| to avoid a hasty expansion of an eventual
+% You put |{ }| before |#6| to avoid a hasty expansion of a potential
% |\arabic{iRow}| at the beginning of the row which would result in an incorrect
% value of that |iRow| (since |iRow| is incremented in the first cell of the row
% of the |\halign|).
@@ -8336,10 +13850,565 @@ version 2005/12/01 or later.
\@@_define_com:nnn V \| \|
\@@_define_com:nnn B \{ \}
% \end{macrocode}
+%
+% \bigskip
+% We define also an command |\AutoNiceMatrix| similar to the environment |{NiceMatrix}|.
+% \begin{macrocode}
+\NewDocumentCommand \AutoNiceMatrix { O { } m O { } m ! O { } }
+ {
+ \group_begin:
+ \bool_set_true:N \l_@@_NiceArray_bool
+ \AutoNiceMatrixWithDelims . . { #2 } { #4 } [ #1 , #3 , #5 ]
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsection*{The redefinition of the command \textbackslash dotfill }
+%
+% \begin{macrocode}
+\cs_set_eq:NN \@@_old_dotfill \dotfill
+\cs_new_protected:Npn \@@_dotfill:
+ {
+% \end{macrocode}
+% First, we insert |\@@_dotfill| (which is the saved version of |\dotfill|) in
+% case of use of |\dotfill| ``internally'' in the cell (e.g. |\hbox to 1cm {\dotfill}|).
+% \begin{macrocode}
+ \@@_old_dotfill
+ \bool_if:NT \l_@@_NiceTabular_bool
+ { \group_insert_after:N \@@_dotfill_ii: }
+ { \group_insert_after:N \@@_dotfill_i: }
+ }
+\cs_new_protected:Npn \@@_dotfill_i: { \group_insert_after:N \@@_dotfill_ii: }
+\cs_new_protected:Npn \@@_dotfill_ii: { \group_insert_after:N \@@_dotfill_iii: }
+% \end{macrocode}
+% Now, if the box if not empty (unfornately, we can't actually test whether the
+% box is empty and that's why we only consider it's width), we insert
+% |\@@_dotfill| (which is the saved version of |\dotfill|) in the cell of the
+% array, and it will extend, since it is no longer in |\l_@@_cell_box|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_dotfill_iii:
+ { \dim_compare:nNnT { \box_wd:N \l_@@_cell_box } = \c_zero_dim \@@_old_dotfill }
+% \end{macrocode}
+%
+% \bigskip
+% \subsection*{The command \textbackslash diagbox}
+%
+% The command |\diagbox| will be linked to |\diagbox:nn| in the environments of
+% \pkg{nicematrix}.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_diagbox:nn #1 #2
+ {
+ \tl_gput_right:Nx \g_@@_internal_code_after_tl
+ {
+ \@@_actually_diagbox:nnnnnn
+ { \int_use:N \c@iRow }
+ { \int_use:N \c@jCol }
+ { \int_use:N \c@iRow }
+ { \int_use:N \c@jCol }
+ { \exp_not:n { #1 } }
+ { \exp_not:n { #2 } }
+ }
+% \end{macrocode}
+% We put the cell with |\diagbox| in the sequence |\g_@@_pos_of_blocks_seq|
+% because a cell with |\diagbox| must be considered as non empty by the key
+% |except-corners|.
+% \begin{macrocode}
+ \seq_gput_right:Nx \g_@@_pos_of_blocks_seq
+ {
+ { \int_use:N \c@iRow }
+ { \int_use:N \c@jCol }
+ { \int_use:N \c@iRow }
+ { \int_use:N \c@jCol }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The command |\diagbox| is also redefined locally when we draw a block.
+%
+% \medskip
+% The first four arguments of |\@@_actually_diagbox:nnnnnn| correspond to the
+% rectangle (=block) to slash (we recall that it's possible to use |\diagbox| in
+% a |\Block|). The two other are the elements to draw below and above the
+% diagonal line.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_actually_diagbox:nnnnnn #1 #2 #3 #4 #5 #6
+ {
+ \pgfpicture
+ \pgf@relevantforpicturesizefalse
+ \pgfrememberpicturepositiononpagetrue
+ \@@_qpoint:n { row - #1 }
+ \dim_set_eq:NN \l_tmpa_dim \pgf@y
+ \@@_qpoint:n { col - #2 }
+ \dim_set_eq:NN \l_tmpb_dim \pgf@x
+ \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim }
+ \@@_qpoint:n { row - \@@_succ:n { #3 } }
+ \dim_set_eq:NN \l_tmpc_dim \pgf@y
+ \@@_qpoint:n { col - \@@_succ:n { #4 } }
+ \dim_set_eq:NN \l_tmpd_dim \pgf@x
+ \pgfpathlineto { \pgfpoint \l_tmpd_dim \l_tmpc_dim }
+ {
+% \end{macrocode}
+% The command |\CT@arc@| is a command of \pkg{colortbl} which sets the color of
+% the rules in the array. The package \pkg{nicematrix} uses it even if \pkg{colortbl} is not
+% loaded.
+% \begin{macrocode}
+ \CT@arc@
+ \pgfsetroundcap
+ \pgfusepathqstroke
+ }
+ \pgfset { inner~sep = 1 pt }
+ \pgfscope
+ \pgftransformshift { \pgfpoint \l_tmpb_dim \l_tmpc_dim }
+ \pgfnode { rectangle } { south~west }
+ { \@@_math_toggle_token: #5 \@@_math_toggle_token: } { } { }
+ \endpgfscope
+ \pgftransformshift { \pgfpoint \l_tmpd_dim \l_tmpa_dim }
+ \pgfnode { rectangle } { north~east }
+ { \@@_math_toggle_token: #6 \@@_math_toggle_token: } { } { }
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+%
+%
+%
+% \bigskip
+% \subsection*{The keyword \textbackslash CodeAfter}
+%
+%
+% The |code-after| (inserted with the key |code-after| or after the keyword
+% |\CodeAfter| can always begin with a list of pairs \emph{key-value} between
+% square brackets). Here the corresponding set of keys.
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / CodeAfter }
+ {
+ sub-matrix .code:n =
+ \keys_set:nn { NiceMatrix / sub-matrix } { #1 } ,
+ sub-matrix .value_required:n = true ,
+ delimiters-color .tl_set:N = \l_@@_delimiters_color_tl ,
+ delimiters-color .value_required:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~CodeAfter }
+ }
+% \end{macrocode}
+%
+% \medskip
+% In fact, in this subsection, we define the user command |\CodeAfter| for the
+% case of the ``normal syntax''. For the case of ``light-syntax'', see the
+% definition of the environment |{@@-light-syntax}| on
+% p.~\pageref{code-light-syntax}.
+%
+%
+% \medskip
+% In the environments of \pkg{nicematrix}, |\CodeAfter| will be linked to
+% |\@@_CodeAfter:|. That macro must \emph{not} be protected since it begins with
+% |\omit|.
+% \begin{macrocode}
+\cs_new:Npn \@@_CodeAfter: { \omit \@@_CodeAfter_i:n }
+% \end{macrocode}
+%
+% \medskip
+% However, in each cell of the environment, the command |\CodeAfter| will be
+% linked to the following command |\@@_CodeAfter_i:n| which do \emph{not} begin
+% with |\omit| (and thus, the user will be able to use |\CodeAfter| without
+% error and without the need to prefix by |\omit|.
+%
+% \smallskip
+% We have to catch everything until the end of the current environment (of
+% \pkg{nicematrix}). First, we go until the next command |\end|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_CodeAfter_i:n #1 \end
+ {
+ \tl_gput_right:Nn \g_nicematrix_code_after_tl { #1 }
+ \@@_CodeAfter_ii:n
+ }
+% \end{macrocode}
+%
+% We catch the argument of the command |\end| (in |#1|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_CodeAfter_ii:n #1
+ {
+% \end{macrocode}
+% If this is really the end of the current environment (of \pkg{nicematrix}), we
+% put back the command |\end| and its argument in the TeX flow.
+% \begin{macrocode}
+ \str_if_eq:eeTF \@currenvir { #1 }
+ { \end { #1 } }
+% \end{macrocode}
+% If this is not the |\end| we are looking for, we put those tokens in
+% |\g_nicematrix_code_after_tl| and we go on searching for the next command
+% |\end| with a recursive call to the command |\@@_CodeAfter:n|.
+% \begin{macrocode}
+ {
+ \tl_gput_right:Nn \g_nicematrix_code_after_tl { \end { #1 } }
+ \@@_CodeAfter_i:n
+ }
+ }
+% \end{macrocode}
+%
+%
+% \subsection*{The delimiters in the preamble}
+%
+% The command |\@@_delimiter:nnn| will be used to draw delimiters inside the
+% matrix when delimiters are specified in the preamble of the array. It does
+% \emph{not} concern the exterior delimiters added by |{NiceArrayWithDelims}|
+% (and |{pNiceArray}|, |{pNiceMatrix}|, etc.).
+%
+% A delimiter in the preamble of the array will write an instruction
+% |\@@_delimiter:nnn| in the |\g_@@_internal_code_after_tl| (and also
+% potentially add instructions in the preamble provided to |\array| in order to
+% add spaces between columns).
+%
+% \smallskip
+% The first argument is the type of delimiter (|(|, |[|, |\{|, |)|, |]| ou
+% |\}|). The second argument is the number of colummn. The third argument is a
+% boolean equal to |\c_true_bool| (resp. |\c_false_true|) when the delimiter
+% must be put on the left (resp. right) side.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_delimiter:nnn #1 #2 #3
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf@relevantforpicturesizefalse
+% \end{macrocode}
+%
+% \medskip
+% |\l_@@_y_initial_dim| and |\l_@@_y_final_dim| will be the $y$-values of the
+% extremities of the delimiter we will have to construct.
+% \begin{macrocode}
+ \@@_qpoint:n { row - 1 }
+ \dim_set_eq:NN \l_@@_y_initial_dim \pgf@y
+ \@@_qpoint:n { row - \@@_succ:n \c@iRow }
+ \dim_set_eq:NN \l_@@_y_final_dim \pgf@y
+% \end{macrocode}
+%
+% \medskip
+% We will compute in |\l_tmpa_dim| the $x$-value where we will have to put our
+% delimiter (on the left side or on the right side).
+% \begin{macrocode}
+ \bool_if:nTF { #3 }
+ { \dim_set_eq:NN \l_tmpa_dim \c_max_dim }
+ { \dim_set:Nn \l_tmpa_dim { - \c_max_dim } }
+ \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - #2 }
+ {
+ \pgfpointanchor
+ { \@@_env: - ##1 - #2 }
+ { \bool_if:nTF { #3 } { west } { east } }
+ \dim_set:Nn \l_tmpa_dim
+ { \bool_if:nTF { #3 } \dim_min:nn \dim_max:nn \l_tmpa_dim \pgf@x }
+ }
+ }
+% \end{macrocode}
+%
+%
+% Now we can put the delimiter with a node of \textsc{pgf}.
+% \begin{macrocode}
+ \pgfset { inner~sep = \c_zero_dim }
+ \dim_zero:N \nulldelimiterspace
+ \pgftransformshift
+ {
+ \pgfpoint
+ { \l_tmpa_dim }
+ { ( \l_@@_y_initial_dim + \l_@@_y_final_dim + \arrayrulewidth ) / 2 }
+ }
+ \pgfnode
+ { rectangle }
+ { \bool_if:nTF { #3 } { east } { west } }
+ {
+% \end{macrocode}
+% Here is the content of the \textsc{pgf} node, that is to say the delimiter,
+% constructed with its right size.
+% \begin{macrocode}
+ \nullfont
+ \c_math_toggle_token
+ \tl_if_empty:NF \l_@@_delimiters_color_tl
+ { \color { \l_@@_delimiters_color_tl } }
+ \bool_if:nTF { #3 } { \left #1 } { \left . }
+ \vcenter
+ {
+ \nullfont
+ \hrule \@height
+ \dim_eval:n { \l_@@_y_initial_dim - \l_@@_y_final_dim }
+ \@depth \c_zero_dim
+ \@width \c_zero_dim
+ }
+ \bool_if:nTF { #3 } { \right . } { \right #1 }
+ \c_math_toggle_token
+ }
+ { }
+ { }
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+% \subsection*{The command SubMatrix}
+%
%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / sub-matrix }
+ {
+ extra-height .dim_set:N = \l_@@_submatrix_extra_height_dim ,
+ extra-height .value_required:n = true ,
+ left-xshift .dim_set:N = \l_@@_submatrix_left_xshift_dim ,
+ left-xshift .value_required:n = true ,
+ right-xshift .dim_set:N = \l_@@_submatrix_right_xshift_dim ,
+ right-xshift .value_required:n = true ,
+ xshift .meta:n = { left-xshift = #1, right-xshift = #1 } ,
+ xshift .value_required:n = true ,
+ delimiters-color .tl_set:N = \l_@@_delimiters_color_tl ,
+ delimiters-color .value_required:n = true ,
+ slim .bool_set:N = \l_@@_submatrix_slim_bool ,
+ slim .default:n = true ,
+ }
+\keys_define:nn { NiceMatrix }
+ {
+ SubMatrix .inherit:n = NiceMatrix /sub-matrix ,
+ CodeAfter / sub-matrix .inherit:n = NiceMatrix / sub-matrix
+ }
+% \end{macrocode}
+%
+% \medskip
+% The following keys set is for the command |\SubMatrix| itself (not the tuning
+% of |\SubMatrix| that can be done elsewhere).
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / SubMatrix }
+ {
+ name .code:n =
+ \tl_if_empty:nTF { #1 }
+ { \@@_error:n { Invalid~name~format } }
+ {
+ \regex_match:nnTF { \A[A-Za-z][A-Za-z0-9]*\Z } { #1 }
+ {
+ \seq_if_in:NnTF \g_@@_submatrix_names_seq { #1 }
+ { \@@_error:nn { Duplicate~name~for~SubMatrix } { #1 } }
+ {
+ \str_set:Nn \l_@@_submatrix_name_str { #1 }
+ \seq_gput_right:Nn \g_@@_submatrix_names_seq { #1 }
+ }
+ }
+ { \@@_error:n { Invalid~name~format } }
+ } ,
+ name .value_required:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~SubMatrix }
+ }
+% \end{macrocode}
+%
% \bigskip
-% \subsection*{We process the options}
+% In the |code-after|, the following command |\@@_SubMatrix| will be linked to
+% |\SubMatrix|.
+% \begin{itemize}
+% \item |#1| is the left delimiter;
+% \item |#2| is the upper-left cell of the matrix with the format $i$-$j$;
+% \item |#2| is the lower-right cell of the matrix with the format $i$-$j$;
+% \item |#4| is the right delimiter;
+% \item |#5| is the list of options of the command.
+% \end{itemize}
+% \begin{macrocode}
+\NewDocumentCommand \@@_SubMatrix { m m m m ! O { } }
+ {
+ \group_begin:
+% \end{macrocode}
+% The command |\@@_cut_on_hyphen:w| cuts on the hyphen an argument of the form
+% $i$-$j$. The value of $i$ is stored in |\l_tmpa_tl| and the value of $j$ is
+% stored in |\l_tmpb_tl|.
+% \begin{macrocode}
+ \@@_cut_on_hyphen:w #3 \q_stop
+ \tl_clear_new:N \l_tmpc_tl
+ \tl_clear_new:N \l_tmpd_tl
+ \tl_set_eq:NN \l_tmpc_tl \l_tmpa_tl
+ \tl_set_eq:NN \l_tmpd_tl \l_tmpb_tl
+ \@@_cut_on_hyphen:w #2 \q_stop
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn \l_tmpc_tl > \g_@@_row_total_int }
+ { \int_compare_p:nNn \l_tmpd_tl > \g_@@_col_total_int }
+ { \@@_error:n { SubMatrix~too~large } }
+ {
+ \dim_zero_new:N \l_@@_submatrix_extra_height_dim
+ \dim_zero_new:N \l_@@_submatrix_left_xshift_dim
+ \dim_zero_new:N \l_@@_submatrix_right_xshift_dim
+ \str_clear_new:N \l_@@_submatrix_name_str
+ \keys_set:nn { NiceMatrix / SubMatrix } { #5 }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf@relevantforpicturesizefalse
+ \pgfset { inner~sep = \c_zero_dim }
+ \dim_set_eq:NN \l_@@_x_initial_dim \c_max_dim
+ \dim_set:Nn \l_@@_x_final_dim { - \c_max_dim }
+% \end{macrocode}
+% The last value of |\int_step_inline:nnn| is provided by currifycation.
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_submatrix_slim_bool
+ { \int_step_inline:nnn \l_tmpa_tl \l_tmpc_tl }
+ { \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int }
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - \l_tmpb_tl }
+ {
+ \pgfpointanchor { \@@_env: - ##1 - \l_tmpb_tl } { west }
+ \dim_set:Nn \l_@@_x_initial_dim
+ { \dim_min:nn \l_@@_x_initial_dim \pgf@x }
+ }
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - \l_tmpd_tl }
+ {
+ \pgfpointanchor { \@@_env: - ##1 - \l_tmpd_tl } { east }
+ \dim_set:Nn \l_@@_x_final_dim
+ { \dim_max:nn \l_@@_x_final_dim \pgf@x }
+ }
+ }
+ \@@_qpoint:n { row - \l_tmpa_tl - base }
+ \dim_set:Nn \l_@@_y_initial_dim
+ { \pgf@y + ( \box_ht:N \strutbox + \extrarowheight ) * \arraystretch }
+ \@@_qpoint:n { row - \l_tmpc_tl - base }
+ \dim_set:Nn \l_@@_y_final_dim
+ { \pgf@y - ( \box_dp:N \strutbox ) * \arraystretch }
+ \int_step_inline:nnn \l_@@_first_col_int \g_@@_col_total_int
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - \l_tmpa_tl - ##1 }
+ {
+ \pgfpointanchor { \@@_env: - \l_tmpa_tl - ##1 } { north }
+ \dim_set:Nn \l_@@_y_initial_dim
+ { \dim_max:nn \l_@@_y_initial_dim \pgf@y }
+ }
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - \l_tmpc_tl - ##1 }
+ {
+ \pgfpointanchor { \@@_env: - \l_tmpc_tl - ##1 } { south }
+ \dim_set:Nn \l_@@_y_final_dim
+ { \dim_min:nn \l_@@_y_final_dim \pgf@y }
+ }
+ }
+ \dim_set:Nn \l_tmpa_dim
+ {
+ \l_@@_y_initial_dim - \l_@@_y_final_dim +
+ \l_@@_submatrix_extra_height_dim - \arrayrulewidth
+ }
+ \dim_set_eq:NN \nulldelimiterspace \c_zero_dim
+% \end{macrocode}
+%
+% \medskip
+% If the key |name| has been used for the command |\SubMatrix|, we create a PGF
+% node with that name for the submatrix (this node does not take into account
+% the delimiters that we will put after).
+% \begin{macrocode}
+ \str_if_empty:NF \l_@@_submatrix_name_str
+ {
+ \@@_pgf_rect_node:nnnnn \l_@@_submatrix_name_str
+ \l_@@_x_initial_dim \l_@@_y_initial_dim
+ \l_@@_x_final_dim \l_@@_y_final_dim
+ }
+% \end{macrocode}
%
+% \medskip
+% Now, we deal with the left delimiter. Of course, the environment
+% |{pgfscope}| is for the |\pgftransformshift|.
+% \begin{macrocode}
+ \begin { pgfscope }
+ \pgftransformshift
+ {
+ \pgfpoint
+ { \l_@@_x_initial_dim - \l_@@_submatrix_left_xshift_dim }
+ { ( \l_@@_y_initial_dim + \l_@@_y_final_dim ) / 2 }
+ }
+ \str_if_empty:NTF \l_@@_submatrix_name_str
+ { \@@_node_left:nn #1 { } }
+ { \@@_node_left:nn #1 { \@@_env: - \l_@@_submatrix_name_str - left } }
+ \end { pgfscope }
+% \end{macrocode}
+%
+% \medskip
+% Now, we deal with the right delimiter.
+% \begin{macrocode}
+ \pgftransformshift
+ {
+ \pgfpoint
+ { \l_@@_x_final_dim + \l_@@_submatrix_right_xshift_dim }
+ { ( \l_@@_y_initial_dim + \l_@@_y_final_dim ) / 2 }
+ }
+ \str_if_empty:NTF \l_@@_submatrix_name_str
+ { \@@_node_right:nn #4 { } }
+ {
+ \@@_node_right:nn #4 { \@@_env: - \l_@@_submatrix_name_str - right }
+ }
+ \endpgfpicture
+ }
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \medskip
+% The command |\@@_node_left:nn| puts the left delimiter with the correct size.
+% The argument |#1| is the delimiter to put. The argument |#2| is the name we
+% will give to this PGF node (if the key |name| has been used in |\SubMatrix|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_node_left:nn #1 #2
+ {
+ \pgfnode
+ { rectangle }
+ { east }
+ {
+ \nullfont
+ \c_math_toggle_token
+ \tl_if_empty:NF \l_@@_delimiters_color_tl
+ { \color { \l_@@_delimiters_color_tl } }
+ \left #1
+ \vcenter
+ {
+ \nullfont
+ \hrule \@height \l_tmpa_dim
+ \@depth \c_zero_dim
+ \@width \c_zero_dim
+ }
+ \right .
+ \c_math_toggle_token
+ }
+ { #2 }
+ { }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The command |\@@_node_right:nn| puts the right delimiter with the correct size.
+% The argument |#1| is the delimiter to put. The argument |#2| is the name we
+% will give to this PGF node (if the key |name| has been used in |\SubMatrix|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_node_right:nn #1 #2
+ {
+ \pgfnode
+ { rectangle }
+ { west }
+ {
+ \nullfont
+ \c_math_toggle_token
+ \tl_if_empty:NF \l_@@_delimiters_color_tl
+ { \color { \l_@@_delimiters_color_tl } }
+ \left .
+ \vcenter
+ {
+ \nullfont
+ \hrule \@height \l_tmpa_dim
+ \@depth \c_zero_dim
+ \@width \c_zero_dim
+ }
+ \right #1
+ \c_math_toggle_token
+ }
+ { #2 }
+ { }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \subsection*{We process the options at package loading}
+%
+%
% We process the options when the package is loaded (with |\usepackage|) but we
% recommend to use |\NiceMatrixOptions| instead.
%
@@ -8349,59 +14418,149 @@ version 2005/12/01 or later.
%
% Of course, the command |\NiceMatrix| must be defined before such an
% instruction is executed.
+%
+% \medskip
+%% \medskip
+% The boolean |\g_@@_footnotehyper_bool| will indicate if the option
+% |footnotehyper| is used.
+% \begin{macrocode}
+\bool_new:N \c_@@_footnotehyper_bool
+% \end{macrocode}
+%
+% \medskip
+% The boolean |\c_@@_footnote_bool| will indicate if the option |footnote| is
+% used, but quicky, it will also be set to |true| if the option |footnotehyper|
+% is used.
+% \begin{macrocode}
+\bool_new:N \c_@@_footnote_bool
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~option~for~package }
+ {
+ The~key~'\l_keys_key_str'~is~unknown. \\
+ If~you~go~on,~it~will~be~ignored. \\
+ For~a~list~of~the~available~keys,~type~H~<return>.
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ define-L-C-R,~
+ footnote,~
+ footnotehyper,~
+ renew-dots,~and
+ renew-matrix.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { Key~transparent }
+ {
+ The~key~'transparent'~is~now~obsolete~(because~it's~name~
+ is~not~clear).~You~should~use~the~conjonction~of~'renew-dots'~
+ and~'renew-matrix'.~However,~you~can~go~on.
+ }
+% \end{macrocode}
+%
% \begin{macrocode}
-\bool_new:N \c_@@_obsolete_environments_bool
\keys_define:nn { NiceMatrix / Package }
{
+ define-L-C-R .bool_set:N = \c_@@_define_L_C_R_bool ,
+ define-L-C-R .default:n = true ,
renew-dots .bool_set:N = \l_@@_renew_dots_bool ,
renew-dots .value_forbidden:n = true ,
renew-matrix .code:n = \@@_renew_matrix: ,
renew-matrix .value_forbidden:n = true ,
- transparent .meta:n = { renew-dots , renew-matrix } ,
+ transparent .code:n =
+ {
+ \@@_renew_matrix:
+ \bool_set_true:N \l_@@_renew_dots_bool
+ \@@_error:n { Key~transparent }
+ } ,
transparent .value_forbidden:n = true,
- obsolete-environments .bool_set:N = \c_@@_obsolete_environments_bool ,
- obsolete-environments .value_forbidden:n = true ,
- obsolete-environments .default:n = true ,
- starred-commands .code:n =
- \@@_msg_redirect_name:nn { starred~commands } { none } ,
- starred-commands .value_forbidden:n = true ,
-
+ footnote .bool_set:N = \c_@@_footnote_bool ,
+ footnotehyper .bool_set:N = \c_@@_footnotehyper_bool ,
+ unknown .code:n = \@@_error:n { Unknown~option~for~package }
}
\ProcessKeysOptions { NiceMatrix / Package }
% \end{macrocode}
%
% \bigskip
-% \subsection*{Error messages of the package}
+% \begin{macrocode}
+\@@_msg_new:nn { footnote~with~footnotehyper~package }
+ {
+ You~can't~use~the~option~'footnote'~because~the~package~
+ footnotehyper~has~already~been~loaded.~
+ If~you~want,~you~can~use~the~option~'footnotehyper'~and~the~footnotes~
+ within~the~environments~of~nicematrix~will~be~extracted~with~the~tools~
+ of~the~package~footnotehyper.\\
+ If~you~go~on,~the~package~footnote~won't~be~loaded.
+ }
+% \end{macrocode}
%
-% The following command converts all the elements of a sequence (which are token
-% lists) into strings.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_convert_to_str_seq:N #1
- {
- \seq_clear:N \l_tmpa_seq
- \seq_map_inline:Nn #1
- {
- \seq_put_left:Nx \l_tmpa_seq { \tl_to_str:n { ##1 } }
+\@@_msg_new:nn { footnotehyper~with~footnote~package }
+ {
+ You~can't~use~the~option~'footnotehyper'~because~the~package~
+ footnote~has~already~been~loaded.~
+ If~you~want,~you~can~use~the~option~'footnote'~and~the~footnotes~
+ within~the~environments~of~nicematrix~will~be~extracted~with~the~tools~
+ of~the~package~footnote.\\
+ If~you~go~on,~the~package~footnotehyper~won't~be~loaded.
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\bool_if:NT \c_@@_footnote_bool
+ {
+% \end{macrocode}
+% The class \cls{beamer} has its own system to extract footnotes and that's why
+% we have nothing to do if \cls{beamer} is used.
+% \begin{macrocode}
+ \@ifclassloaded { beamer }
+ { \bool_set_false:N \c_@@_footnote_bool }
+ {
+ \@ifpackageloaded { footnotehyper }
+ { \@@_error:n { footnote~with~footnotehyper~package } }
+ { \usepackage { footnote } }
}
- \seq_set_eq:NN #1 \l_tmpa_seq
}
% \end{macrocode}
-%
-% The following command creates a sequence of strings (|str|) from a |clist|.
+%
% \begin{macrocode}
-\cs_new_protected:Npn \@@_set_seq_of_str_from_clist:Nn #1 #2
- {
- \seq_set_from_clist:Nn #1 { #2 }
- \@@_convert_to_str_seq:N #1
+\bool_if:NT \c_@@_footnotehyper_bool
+ {
+% \end{macrocode}
+% The class \cls{beamer} has its own system to extract footnotes and that's why
+% we have nothing to do if \cls{beamer} is used.
+% \begin{macrocode}
+ \@ifclassloaded { beamer }
+ { \bool_set_false:N \c_@@_footnote_bool }
+ {
+ \@ifpackageloaded { footnote }
+ { \@@_error:n { footnotehyper~with~footnote~package } }
+ { \usepackage { footnotehyper } }
+ }
+ \bool_set_true:N \c_@@_footnote_bool
}
% \end{macrocode}
-%
+% The flag |\c_@@_footnote_bool| is raised and so, we will only have to test
+% |\c_@@_footnote_bool| in order to know if we have to insert an environment
+% |{savenotes}|.
+%
+%
+% \bigskip
+% \subsection*{Error messages of the package}
+%
% \begin{macrocode}
-\@@_set_seq_of_str_from_clist:Nn \c_@@_types_of_matrix_seq
+\seq_new:N \c_@@_types_of_matrix_seq
+\seq_set_from_clist:Nn \c_@@_types_of_matrix_seq
{
NiceMatrix ,
pNiceMatrix , bNiceMatrix , vNiceMatrix, BNiceMatrix, VNiceMatrix
}
+\seq_set_map_x:NNn \c_@@_types_of_matrix_seq \c_@@_types_of_matrix_seq
+ { \tl_to_str:n { #1 } }
% \end{macrocode}
%
% \bigskip
@@ -8415,9 +14574,12 @@ version 2005/12/01 or later.
{
\seq_if_in:NVTF \c_@@_types_of_matrix_seq \g_@@_name_env_str
{
- \int_compare:nNnTF \l_@@_last_col_int = { -1 }
+ \int_compare:nNnTF \l_@@_last_col_int = { -2 }
{ \@@_fatal:n { too~much~cols~for~matrix } }
- { \@@_fatal:n { too~much~cols~for~matrix~with~last~col } }
+ {
+ \bool_if:NF \l_@@_last_col_without_value_bool
+ { \@@_fatal:n { too~much~cols~for~matrix~with~last~col } }
+ }
}
{ \@@_fatal:n { too~much~cols~for~array } }
}
@@ -8427,8 +14589,8 @@ version 2005/12/01 or later.
% \begin{macrocode}
\cs_new:Npn \@@_message_hdotsfor:
{
- \tl_if_empty:VF \g_@@_Hdotsfor_lines_tl
- { ~Maybe~your~use~of~\token_to_str:N \Hdotsfor\ is~incorrect.}
+ \tl_if_empty:VF \g_@@_HVdotsfor_lines_tl
+ { ~Maybe~your~use~of~\token_to_str:N \Hdotsfor\ is~incorrect.}
}
% \end{macrocode}
%
@@ -8438,8 +14600,8 @@ version 2005/12/01 or later.
{
You~try~to~use~more~columns~than~allowed~by~your~
\@@_full_name_env:.\@@_message_hdotsfor:\ The~maximal~number~of~
- columns~is~\int_eval:n { \l_@@_last_col_int - 1 }~(plus~the~potential~
- exterior~ones).~This~error~is~fatal.
+ columns~is~\int_eval:n { \l_@@_last_col_int - 1 }~(plus~the~
+ exterior~columns).~This~error~is~fatal.
}
% \end{macrocode}
%
@@ -8451,7 +14613,7 @@ version 2005/12/01 or later.
\@@_full_name_env:.\@@_message_hdotsfor:\ Recall~that~the~maximal~
number~of~columns~for~a~matrix~is~fixed~by~the~LaTeX~counter~
'MaxMatrixCols'.~Its~actual~value~is~\int_use:N \c@MaxMatrixCols.~
- This~error~is~fatal.
+ This~error~is~fatal.
}
% \end{macrocode}
%
@@ -8464,34 +14626,113 @@ version 2005/12/01 or later.
{
You~try~to~use~more~columns~than~allowed~by~your~
\@@_full_name_env:.\@@_message_hdotsfor:\ The~maximal~number~of~columns~is~
- \int_eval:n { \c@jCol - 1 }~(plus~the~potential~exterior~ones).~
+ \int_use:N \g_@@_static_num_of_col_int\
+ ~(plus~the~potential~exterior~ones).~
This~error~is~fatal.
}
% \end{macrocode}
%
-%
+% \begin{macrocode}
+\@@_msg_new:nn { last~col~not~used }
+ {
+ The~key~'last-col'~is~in~force~but~you~have~not~used~that~last~column~
+ in~your~\@@_full_name_env:.~However,~you~can~go~on.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { columns~not~used }
+ {
+ The~preamble~of~your~\@@_full_name_env:\ announces~\int_use:N
+ \g_@@_static_num_of_col_int\ columns~but~you~use~only~\int_use:N \c@jCol.\\
+ You~can~go~on~but~the~columns~you~did~not~used~won't~be~created.
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\@@_msg_new:nn { in~first~col }
+ {
+ You~can't~use~the~command~#1 in~the~first~column~(number~0)~of~the~array.\\
+ If~you~go~on,~this~command~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { in~last~col }
+ {
+ You~can't~use~the~command~#1 in~the~last~column~(exterior)~of~the~array.\\
+ If~you~go~on,~this~command~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { in~first~row }
+ {
+ You~can't~use~the~command~#1 in~the~first~row~(number~0)~of~the~array.\\
+ If~you~go~on,~this~command~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { in~last~row }
+ {
+ You~can't~use~the~command~#1 in~the~last~row~(exterior)~of~the~array.\\
+ If~you~go~on,~this~command~will~be~ignored.
+ }
+% \end{macrocode}
+%
+%
% \begin{macrocode}
\@@_msg_new:nn { bad~option~for~line-style }
{
Since~you~haven't~loaded~Tikz,~the~only~value~you~can~give~to~'line-style'~
- is~'standard'.~If~you~go~on,~this~option~will~be~ignored.
+ is~'standard'.~If~you~go~on,~this~key~will~be~ignored.
}
% \end{macrocode}
%
% \begin{macrocode}
\@@_msg_new:nn { Unknown~option~for~xdots }
{
- As~for~now~there~is~only~three~options~available~here:~'color',~'line-style'~
+ As~for~now~there~is~only~three~key~available~here:~'color',~'line-style'~
and~'shorten'~(and~you~try~to~use~'\l_keys_key_str').~If~you~go~on,~
- this~option~will~be~ignored.
+ this~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { Unknown~option~for~rowcolors }
+ {
+ As~for~now~there~is~only~two~keys~available~here:~'cols'~and~'respect-blocks'~
+ (and~you~try~to~use~'\l_keys_key_str').~If~you~go~on,~
+ this~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { Key~color~for~Block }
+ {
+ The~key~'color'~for~the~command~\token_to_str:N \Block\
+ is~deprecated:~you~should~use~'fill'~instead.\\
+ You~can~go~on~for~this~time~but~remember~that~that~key~
+ will~be~deleted~in~a~future~version.
}
% \end{macrocode}
%
% \begin{macrocode}
\@@_msg_new:nn { ampersand~in~light-syntax }
{
- You~can't~use~an~ampersand~(\token_to_str &)~to~separate~columns~because
- ~you~have~used~the~option~'light-syntax'.~This~error~is~fatal.
+ You~can't~use~an~ampersand~(\token_to_str:N &)~to~separate~columns~because~
+ ~you~have~used~the~key~'light-syntax'.~This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { SubMatrix~too~large }
+ {
+ Your~command~\token_to_str:N \SubMatrix\
+ can't~be~drawn~because~your~matrix~is~too~small.\\
+ If~you~go~on,~this~command~will~be~ignored.
}
% \end{macrocode}
%
@@ -8499,22 +14740,29 @@ version 2005/12/01 or later.
\@@_msg_new:nn { double-backslash~in~light-syntax }
{
You~can't~use~\token_to_str:N \\~to~separate~rows~because~you~have~used~
- the~option~'light-syntax'.~You~must~use~the~character~'\l_@@_end_of_row_tl'~
- (set~by~the~option~'end-of-row').~This~error~is~fatal.
+ the~key~'light-syntax'.~You~must~use~the~character~'\l_@@_end_of_row_tl'~
+ (set~by~the~key~'end-of-row').~This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { standard-cline~in~document }
+ {
+ The~key~'standard-cline'~is~available~only~in~the~preamble.\\
+ If~you~go~on~this~command~will~be~ignored.
}
% \end{macrocode}
%
% \begin{macrocode}
-\@@_msg_new:nn { starred~commands }
+\@@_msg_new:nn { old~column~type }
{
- The~starred~versions~of~\token_to_str:N \Cdots,~\token_to_str:N \Ldots,~
- \token_to_str:N \Vdots,~\token_to_str:N\Ddots\ and~\token_to_str:N\Iddots\
- are~deprecated.~However,~you~can~go~on~for~this~time.~If~you~don't~want~to~
- see~this~error~we~should~load~'nicematrix'~with~the~option~
- 'starred-commands'.
+ The~column~type~'#1'~is~no~longer~defined~in~'nicematrix'.~
+ Since~version~5.0,~you~have~to~use~'l',~'c'~and~'r'~instead~of~'L',~
+ 'C'~and~'R'.~You~can~also~use~the~key~'define-L-C-R'.\\
+ This~error~is~fatal.
}
% \end{macrocode}
-%
+%
% \begin{macrocode}
\@@_msg_new:nn { bad~value~for~baseline }
{
@@ -8525,12 +14773,13 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
-%
-% \begin{macrocode}
-\@@_msg_new:nn { Second~Block }
+% \begin{macrocode}
+\@@_msg_new:nn { Invalid~name~format }
{
- You~can't~use~\token_to_str:N \Block\ twice~in~the~same~cell~of~the~array.\\
- If~you~go~on,~this~command~(and~the~other)~will~be~ignored.
+ You~can't~give~the~name~'\l_keys_value_tl'~to~a~\token_to_str:N
+ \SubMatrix.\\
+ A~name~must~be~accepted~by~the~regular~expression~[A-Za-z][A-Za-z0-9]*.\\
+ If~you~go~on,~this~key~will~be~ignored.
}
% \end{macrocode}
%
@@ -8540,6 +14789,15 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \begin{macrocode}
+\@@_msg_new:nn { Delimiter~with~small }
+ {
+ You~can't~put~a~delimiter~in~the~preamble~of~your~\@@_full_name_env:\
+ because~the~key~'small'~is~in~force.\\
+ This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
\@@_msg_new:nn { unknown~cell~for~line~in~code-after }
{
Your~command~\token_to_str:N\line\{#1\}\{#2\}~in~the~'code-after'~
@@ -8548,11 +14806,54 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
-%
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Duplicate~name~for~SubMatrix }
+ {
+ The~name~'#1'~is~already~used~for~a~\token_to_str:N \SubMatrix\
+ in~this~\@@_full_name_env:.\\
+ If~you~go~on,~this~key~will~be~ignored.\\
+ For~a~list~of~the~names~already~used,~type~H~<return>.
+ }
+ {
+ The~names~already~defined~in~this~\@@_full_name_env:\ are:~
+ \seq_use:Nnnn \g_@@_submatrix_names_seq { ~and~ } { ,~ } { ~and~ }.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { Hdotsfor~in~col~0 }
+ {
+ You~can't~use~\token_to_str:N \Hdotsfor\ in~an~exterior~column~of~
+ the~array.~This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { bad~corner }
+ {
+ #1~is~an~incorrect~specification~for~a~corner~(in~the~keys~
+ 'except-corners'~and~'hvlines-except-corners').~The~available~
+ values~are:~NW,~SW,~NE~and~SE.\\
+ If~you~go~on,~this~specification~of~corner~will~be~ignored.
+ }
+% \end{macrocode}
+%
% \begin{macrocode}
\@@_msg_new:nn { last-col~non~empty~for~NiceArray }
{
- In~the~\@@_full_name_env:,~you~must~use~the~option~
+ In~the~\@@_full_name_env:,~you~must~use~the~key~
+ 'last-col'~without~value.\\
+ However,~you~can~go~on~for~this~time~
+ (the~value~'\l_keys_value_tl'~will~be~ignored).
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\@@_msg_new:nn { last-col~non~empty~for~NiceMatrixOptions }
+ {
+ In~\NiceMatrixoptions,~you~must~use~the~key~
'last-col'~without~value.\\
However,~you~can~go~on~for~this~time~
(the~value~'\l_keys_value_tl'~will~be~ignored).
@@ -8561,16 +14862,65 @@ version 2005/12/01 or later.
%
%
% \begin{macrocode}
-\@@_msg_new:nn { Block~too~large }
+\@@_msg_new:nn { Block~too~large~1 }
{
You~try~to~draw~a~block~in~the~cell~#1-#2~of~your~matrix~but~the~matrix~is~
too~small~for~that~block. \\
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { Block~too~large~2 }
+ {
+ The~preamble~of~your~\@@_full_name_env:\ announces~\int_use:N
+ \g_@@_static_num_of_col_int\
+ columns~but~you~use~only~\int_use:N \c@jCol\ and~that's~why~a~block~
+ specified~in~the~cell~#1-#2~can't~be~drawn.~You~should~add~some~ampersands~
+ (&)~at~the~end~of~the~first~row~of~your~
+ \@@_full_name_env:.\\
+ If~you~go~on,this~block~and~maybe~others~will~be~ignored.
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\@@_msg_new:nn { unknown~column~type }
+ {
+ The~column~type~'#1'~in~your~\@@_full_name_env:\
+ is~unknown. \\
+ This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { tabularnote~forbidden }
+ {
+ You~can't~use~the~command~\token_to_str:N\tabularnote\
+ ~in~a~\@@_full_name_env:.~This~command~is~available~only~in~
+ \{NiceTabular\},~\{NiceArray\}~and~\{NiceMatrix\}. \\
If~you~go~on,~this~command~will~be~ignored.
}
% \end{macrocode}
%
+% \begin{macrocode}
+\@@_msg_new:nn { bottomrule~without~booktabs }
+ {
+ You~can't~use~the~key~'tabular/bottomrule'~because~you~haven't~
+ loaded~'booktabs'.\\
+ If~you~go~on,~this~key~will~be~ignored.
+ }
+% \end{macrocode}
%
% \begin{macrocode}
+\@@_msg_new:nn { enumitem~not~loaded }
+ {
+ You~can't~use~the~command~\token_to_str:N\tabularnote\
+ ~because~you~haven't~loaded~'enumitem'.\\
+ If~you~go~on,~this~command~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
\@@_msg_new:nn { Wrong~last~row }
{
You~have~used~'last-row=\int_use:N \l_@@_last_row_int'~but~your~
@@ -8584,10 +14934,7 @@ version 2005/12/01 or later.
%
% \begin{macrocode}
\@@_msg_new:nn { Yet~in~env }
- {
- Environments~\{NiceArray\}~(or~\{NiceMatrix\},~etc.)~can't~be~nested.\\
- This~error~is~fatal.
- }
+ { Environments~of~nicematrix~can't~be~nested.\\ This~error~is~fatal. }
% \end{macrocode}
%
% \begin{macrocode}
@@ -8602,23 +14949,87 @@ version 2005/12/01 or later.
% \begin{macrocode}
\@@_msg_new:nn { Bad~value~for~letter~for~dotted~lines }
{
- The~value~of~key~'\tl_use:N\l_keys_key_str'~must~be~of~length~1.\\
+ The~value~of~key~'\l_keys_key_str'~must~be~of~length~1.\\
If~you~go~on,~it~will~be~ignored.
}
% \end{macrocode}
%
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~key~for~Block }
+ {
+ The~key~'\l_keys_key_str'~is~unknown~for~the~command~\token_to_str:N
+ \Block.\\ If~you~go~on,~it~will~be~ignored. \\
+ For~a~list~of~the~available~keys,~type~H~<return>.
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~-,~c,~draw,~fill,~l,~
+ line-width~and~r.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~key~for~CodeAfter }
+ {
+ The~key~'\l_keys_key_str'~is~unknown.\\
+ If~you~go~on,~it~will~be~ignored. \\
+ For~a~list~of~the~available~keys~in~\token_to_str:N
+ \CodeAfter,~type~H~<return>.
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ delimiters-color,~
+ sub-matrix~(several~subkeys)~
+ and~xdots~(several~subkeys).~
+ The~latter~is~for~the~command~\token_to_str:N \line.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { Unknown~key~for~SubMatrix }
+ {
+ The~key~'\l_keys_key_str'~is~unknown.\\
+ The~only~keys~available~here~are~'delimiters-color',~'extra-height',~
+ 'left-xshift',~'name',~'right-xshift',~'slim'~and~'xshift'.\\
+ If~you~go~on,~this~key~will~be~ignored. \\
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~key~for~notes }
+ {
+ The~key~'\l_keys_key_str'~is~unknown.\\
+ If~you~go~on,~it~will~be~ignored. \\
+ For~a~list~of~the~available~keys~about~notes,~type~H~<return>.
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ bottomrule,~
+ code-after,~
+ code-before,~
+ enumitem-keys,~
+ enumitem-keys-para,~
+ para,~
+ label-in-list,~
+ label-in-tabular~and~
+ style.
+ }
+% \end{macrocode}
%
% \begin{macrocode}
\@@_msg_new:nnn { Unknown~key~for~NiceMatrixOptions }
{
- The~key~'\tl_use:N\l_keys_key_str'~is~unknown~for~the~command~
+ The~key~'\l_keys_key_str'~is~unknown~for~the~command~
\token_to_str:N \NiceMatrixOptions. \\
If~you~go~on,~it~will~be~ignored. \\
- For~a~list~of~the~available~keys,~type~H~<return>.
+ For~a~list~of~the~*principal*~available~keys,~type~H~<return>.
}
{
- The~available~options~are~(in~alphabetic~order):~
+ The~available~keys~are~(in~alphabetic~order):~
allow-duplicate-names,~
+ cell-space-bottom-limit,~
+ cell-space-limits,~
+ cell-space-top-limit,~
code-for-first-col,~
code-for-first-row,~
code-for-last-col,~
@@ -8626,65 +15037,76 @@ version 2005/12/01 or later.
create-extra-nodes,~
create-medium-nodes,~
create-large-nodes,~
+ delimiters-color,~
end-of-row,~
- exterior-arraycolsep,~
+ first-col,~
+ first-row,~
hlines,~
hvlines,~
+ hvlines-except-corners,~
+ last-col,~
+ last-row,~
left-margin,~
letter-for-dotted-lines,~
light-syntax,~
+ notes~(several~subkeys),~
nullify-dots,~
- parallelize-diags,~
renew-dots,~
renew-matrix,~
right-margin,~
small,~
- transparent,~
+ sub-matrix~(several~subkeys),
vlines,~
- xdots/color,~
- xdots/shorten~and~
- xdots/line-style.
+ xdots~(several~subkeys).
}
% \end{macrocode}
%
% \begin{macrocode}
\@@_msg_new:nnn { Unknown~option~for~NiceArray }
{
- The~option~'\tl_use:N\l_keys_key_str'~is~unknown~for~the~environment~
+ The~key~'\l_keys_key_str'~is~unknown~for~the~environment~
\{NiceArray\}. \\
If~you~go~on,~it~will~be~ignored. \\
- For~a~list~of~the~available~options,~type~H~<return>.
+ For~a~list~of~the~*principal*~available~keys,~type~H~<return>.
}
{
- The~available~options~are~(in~alphabetic~order):~
+ The~available~keys~are~(in~alphabetic~order):~
b,~
baseline,~
c,~
+ cell-space-bottom-limit,~
+ cell-space-limits,~
+ cell-space-top-limit,~
code-after,~
code-for-first-col,~
code-for-first-row,~
code-for-last-col,~
code-for-last-row,~
+ colortbl-like,~
columns-width,~
create-extra-nodes,~
create-medium-nodes,~
create-large-nodes,~
- end-of-row,~
+ delimiters-color,~
extra-left-margin,~
extra-right-margin,~
first-col,~
first-row,~
hlines,~
hvlines,~
+ hvlines-except-corners,~
last-col,~
last-row,~
left-margin,~
light-syntax,~
name,~
+ notes/bottomrule,~
+ notes/para,~
nullify-dots,~
- parallelize-diags,~
renew-dots,~
right-margin,~
+ rules/color,~
+ rules/width,~
small,~
t,~
vlines,~
@@ -8697,45 +15119,108 @@ version 2005/12/01 or later.
% \medskip
% This error message is used for the set of keys |NiceMatrix/NiceMatrix| and
% |NiceMatrix/pNiceArray| (but not by |NiceMatrix/NiceArray| because, for this
-% set of keys, there is also the options |t|, |c| and~|b|).
+% set of keys, there is also the keys |t|, |c| and~|b|).
% \begin{macrocode}
\@@_msg_new:nnn { Unknown~option~for~NiceMatrix }
{
- The~option~'\tl_use:N\l_keys_key_str'~is~unknown~for~the~
+ The~key~'\l_keys_key_str'~is~unknown~for~the~
\@@_full_name_env:. \\
If~you~go~on,~it~will~be~ignored. \\
- For~a~list~of~the~available~options,~type~H~<return>.
+ For~a~list~of~the~*principal*~available~keys,~type~H~<return>.
}
{
- The~available~options~are~(in~alphabetic~order):~
+ The~available~keys~are~(in~alphabetic~order):~
+ b,~
+ baseline,~
+ c,~
+ cell-space-bottom-limit,~
+ cell-space-limits,~
+ cell-space-top-limit,~
code-after,~
code-for-first-col,~
code-for-first-row,~
code-for-last-col,~
code-for-last-row,~
+ colortbl-like,~
columns-width,~
create-extra-nodes,~
create-medium-nodes,~
create-large-nodes,~
- end-of-row,~
+ delimiters-color,~
extra-left-margin,~
extra-right-margin,~
first-col,~
first-row,~
hlines,~
hvlines,~
- l~(=L),~
+ hvlines-except-corners,~
+ l,~
last-col,~
last-row,~
left-margin,~
light-syntax,~
name,~
nullify-dots,~
- parallelize-diags,~
- r~(=R),~
+ r,~
renew-dots,~
right-margin,~
+ rules/color,~
+ rules/width,~
small,~
+ t,~
+ vlines,~
+ xdots/color,~
+ xdots/shorten~and~
+ xdots/line-style.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~option~for~NiceTabular }
+ {
+ The~key~'\l_keys_key_str'~is~unknown~for~the~environment~
+ \{NiceTabular\}. \\
+ If~you~go~on,~it~will~be~ignored. \\
+ For~a~list~of~the~*principal*~available~keys,~type~H~<return>.
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ b,~
+ baseline,~
+ c,~
+ cell-space-bottom-limit,~
+ cell-space-limits,~
+ cell-space-top-limit,~
+ code-after,~
+ code-for-first-col,~
+ code-for-first-row,~
+ code-for-last-col,~
+ code-for-last-row,~
+ colortbl-like,~
+ columns-width,~
+ create-extra-nodes,~
+ create-medium-nodes,~
+ create-large-nodes,~
+ extra-left-margin,~
+ extra-right-margin,~
+ first-col,~
+ first-row,~
+ hlines,~
+ hvlines,~
+ hvlines-except-corners,~
+ last-col,~
+ last-row,~
+ left-margin,~
+ light-syntax,~
+ name,~
+ notes/bottomrule,~
+ notes/para,~
+ nullify-dots,~
+ renew-dots,~
+ right-margin,~
+ rules/color,~
+ rules/width,~
+ t,~
vlines,~
xdots/color,~
xdots/shorten~and~
@@ -8751,129 +15236,38 @@ version 2005/12/01 or later.
the~same~environment~name~twice.~You~can~go~on,~but,~
maybe,~you~will~have~incorrect~results~especially~
if~you~use~'columns-width=auto'.~If~you~don't~want~to~see~this~
- message~again,~use~the~option~'allow-duplicate-names'.\\
+ message~again,~use~the~key~'allow-duplicate-names'~in~
+ '\token_to_str:N \NiceMatrixOptions'.\\
For~a~list~of~the~names~already~used,~type~H~<return>. \\
}
{
The~names~already~defined~in~this~document~are:~
- \seq_use:Nnnn \g_@@_names_seq { ,~ } { ,~ } { ~and~ }.
+ \seq_use:Nnnn \g_@@_names_seq { ~and~ } { ,~ } { ~and~ }.
}
% \end{macrocode}
%
% \begin{macrocode}
\@@_msg_new:nn { Option~auto~for~columns-width }
{
- You~can't~give~the~value~'auto'~to~the~option~'columns-width'~here.~
- If~you~go~on,~the~option~will~be~ignored.
+ You~can't~give~the~value~'auto'~to~the~key~'columns-width'~here.~
+ If~you~go~on,~the~key~will~be~ignored.
}
% \end{macrocode}
%
-% \begin{macrocode}
-\@@_msg_new:nn { Zero~row }
- {
- There~is~a~problem.~Maybe~you~have~used~l,~c~and~r~instead~of~L,~C~
- and~R~in~the~preamble~of~your~environment. \\
- This~error~is~fatal.
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% \subsection*{Obsolete environments}
-%
-% The following environments are loaded only when the package \pkg{nicematrix}
-% has been loaded with the option |obsolete-environments|. However, they will be
-% completly deleted in a future version.
-%
-% \begin{macrocode}
-\bool_if:NT \c_@@_obsolete_environments_bool
- {
- \NewDocumentEnvironment { pNiceArrayC } { }
- {
- \int_zero:N \l_@@_last_col_int
- \pNiceArray
- }
- { \endpNiceArray }
- \NewDocumentEnvironment { bNiceArrayC } { }
- {
- \int_zero:N \l_@@_last_col_int
- \bNiceArray
- }
- { \endbNiceArray }
- \NewDocumentEnvironment { BNiceArrayC } { }
- {
- \int_zero:N \l_@@_last_col_int
- \BNiceArray
- }
- { \endBNiceArray }
- \NewDocumentEnvironment { vNiceArrayC } { }
- {
- \int_zero:N \l_@@_last_col_int
- \vNiceArray
- }
- { \endvNiceArray }
- \NewDocumentEnvironment { VNiceArrayC } { }
- {
- \int_zero:N \l_@@_last_col_int
- \VNiceArray
- }
- { \endVNiceArray }
- \NewDocumentEnvironment { pNiceArrayRC } { }
- {
- \int_zero:N \l_@@_last_col_int
- \int_zero:N \l_@@_first_row_int
- \pNiceArray
- }
- { \endpNiceArray }
- \NewDocumentEnvironment { bNiceArrayRC } { }
- {
- \int_zero:N \l_@@_last_col_int
- \int_zero:N \l_@@_first_row_int
- \bNiceArray
- }
- { \endbNiceArray }
- \NewDocumentEnvironment { BNiceArrayRC } { }
- {
- \int_zero:N \l_@@_last_col_int
- \int_zero:N \l_@@_first_row_int
- \BNiceArray
- }
- { \endBNiceArray }
- \NewDocumentEnvironment { vNiceArrayRC } { }
- {
- \int_zero:N \l_@@_last_col_int
- \int_zero:N \l_@@_first_row_int
- \vNiceArray
- }
- { \endvNiceArray }
- \NewDocumentEnvironment { VNiceArrayRC } { }
- {
- \int_zero:N \l_@@_last_col_int
- \int_zero:N \l_@@_first_row_int
- \VNiceArray
- }
- { \endVNiceArray }
- \NewDocumentEnvironment { NiceArrayCwithDelims } { }
- {
- \int_zero:N \l_@@_last_col_int
- \NiceArrayWithDelims
- }
- { \endNiceArrayWithDelims }
- \NewDocumentEnvironment { NiceArrayRCwithDelims } { }
- {
- \int_zero:N \l_@@_last_col_int
- \int_zero:N \l_@@_first_row_int
- \NiceArrayWithDelims
- }
- { \endNiceArrayWithDelims }
- }
-% \end{macrocode}
-%
-%
+%
%
% \vspace{1cm}
% \section{History}
%
+% The successive versions of the file |nicematrix.sty| provided by TeXLive are available on the
+% \textsc{svn} server of TeXLive:
+%
+% {
+% \small
+% \url{https:www.tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty}
+% }
+%
+%
% \subsection*{Changes between versions 1.0 and 1.1}
%
% The dotted lines are no longer drawn with Tikz nodes but with Tikz circles
@@ -8932,13 +15326,11 @@ version 2005/12/01 or later.
% TeX StackExchange\footnote{cf.
% |tex.stackexchange.com/questions/450841/tikz-externalize-and-nicematrix-package|},
% Tikz externalization is now deactivated in the environments of the
-% extension \pkg{nicematrix}.\footnote{Before this version, there was an error
+% package \pkg{nicematrix}.\footnote{Before this version, there was an error
% when using \pkg{nicematrix} with Tikz externalization. In any case, it's not
% possible to externalize the Tikz elements constructed by \pkg{nicematrix}
% because they use the options |overlay| and |remember picture|.}
%
-% \subsection*{Changes between version 2.1 and 2.1.2}
-% Option |draft|: with this option, the dotted lines are not drawn (quicker).
%
% \subsection*{Changes between version 2.1.2 and 2.1.3}
%
@@ -8946,7 +15338,7 @@ version 2005/12/01 or later.
% the ``main matrix'' (not in the exterior column), the cells in the exterior
% column are considered as outside the matrix. That means that it's possible to
% do the following matrix with only a |\Cdots| command (and a single |\Vdots|).
-% \[\begin{pNiceArray}{Wc{5mm}CWc{5mm}}[first-row,last-col]
+% \[\begin{pNiceArray}{Wc{5mm}cWc{5mm}}[first-row,last-col]
% & C_j & \\
% \mbox{\Large $0$} & \Vdots & \mbox{\Large $0$} \\
% \strut & a & \Cdots & L_i \\
@@ -8991,9 +15383,6 @@ version 2005/12/01 or later.
%
% Option |hlines|.
%
-% A warning is issued when the |draft| mode is used. In this case, the dotted
-% lines are not drawn.
-%
%
% \subsection*{Changes between version 2.3 and 3.0}
%
@@ -9121,7 +15510,7 @@ version 2005/12/01 or later.
% $i$|-|$j$|-block| and, if the creation of the ``medium nodes'' is required, a
% node $i$|-|$j$|-block-medium| is created.
%
-% If the user try to use more columns than allowed by its environment, an error
+% If the user tries to use more columns than allowed by its environment, an error
% is raised by nicematrix (instead of a low-level error).
%
% The package must be loaded with the option |obsolete-environments| if we want
@@ -9148,13 +15537,148 @@ version 2005/12/01 or later.
% The code of \pkg{nicematrix} no longer uses Tikz but only \textsc{pgf}. By
% default, Tikz is \emph{not} loaded by \pkg{nicematrix}.
%
-% \subsection*{Changes between versions 3.12 and 3.13}
+% \subsection*{Changes between versions 3.13 and 3.14}
%
-% Correction of a bug (question 60761504 on |stakoverflow|).
+% Correction of a bug (question 60761504 on |stackoverflow|).
%
-% Best error messages when the user uses |&| or |\\| when |light-syntax| is in
+% Better error messages when the user uses |&| or |\\| when |light-syntax| is in
% force.
%
+% \subsection*{Changes between versions 3.14 and 3.15}
+%
+% It's possible to put labels on the dotted lines drawn by |\Ldots|, |\Cdots|,
+% |\Vdots|, |\Ddots|, |\Iddots|, |\Hdotsfor| and the command |\line| in the
+% |code-after| with the tokens |_| and |^|.
+%
+% The option |baseline| is now available in all the environments of
+% \pkg{nicematrix}. Before, it was available only in |{NiceArray}|.
+%
+% New keyword |\CodeAfter| (in the environments of \pkg{nicematrix}).
+%
+%
+% \subsection*{Changes between versions 3.15 and 4.0}
+%
+% New environment |{NiceTabular}|
+%
+% Commands to color cells, rows and columns with a perfect result in the \textsc{pdf}.
+%
+% \subsection*{Changes between versions 4.0 and 4.1}
+%
+% New keys |cell-space-top-limit| and |cell-space-bottom-limit|
+%
+% New command |\diagbox|
+%
+% The key |hvline| don't draw rules in the blocks (commands |\Block|) and in the
+% virtual blocks corresponding to the dotted lines.
+%
+% \subsection*{Changes between versions 4.1 and 4.2}
+%
+% It's now possible to write |\begin{pNiceMatrix}a&b\\c&d\end{pNiceMatrix}^2|
+% with the expected result.
+%
+% \subsection*{Changes between versions 4.2 and 4.3}
+%
+% The horizontal centering of the content of a |\Block| is correct even when an
+% instruction such as |!{\qquad}| is used in the preamble of the array.
+%
+% It's now possible to use the command |\Block| in the ``last row''.
+%
+% \subsection*{Changes between versions 4.3 and 4.4}
+%
+% New key |hvlines-except-corners|.
+%
+% \subsection*{Changes between versions 4.4 and 5.0}
+%
+% Use of the standard column types |l|, |c| and |r| instead of |L|, |C| and |R|.
+%
+% It's now possible to use the command |\diagbox| in a |\Block|.
+%
+% Command |\tabularnote|
+%
+% \subsection*{Changes between versions 5.0 and 5.1}
+%
+% The vertical rules specified by \verb+|+ in the preamble are not broken by
+% |\hline\hline| (and other).
+%
+% Environment |{NiceTabular*}|
+%
+% Command |\Vdotsfor| similar to |\Hdotsfor|
+%
+% The variable |\g_nicematrix_code_after_tl| is now public.
+%
+% \subsection*{Changes between versions 5.1 and 5.2}
+%
+% The vertical rules specified by \verb+|+ or \verb+||+ in the preamble respect
+% the blocks.
+%
+% Key |respect-blocks| for |\rowcolors| (with a \emph{s}) in the |code-before|.
+%
+% The variable |\g_nicematrix_code_before_tl| is now public.
+%
+% The key |baseline| can take in as value of the form \textsl{line-i} to align
+% the |\hline| in the row \textsl{i}.
+%
+% The key |hvlines-except-corners| may take in as value a list of corners (eg: NW,SE).
+%
+% \subsection*{Changes between versions 5.2 and 5.3}
+%
+% Keys |c|, |r| and |l| for the command |\Block|.
+%
+% It's possible to use the key |draw-first| with |\Ddots| and |\Iddots| to
+% specify which dotted line will be drawn first (the other lines will be drawn
+% parallel to that one if parallelization is activated).
+%
+% \subsection*{Changes between versions 5.3 and 5.4}
+%
+% Key |tabularnote|.
+%
+% Different behaviour for the mono-column blocks.
+%
+% \subsection*{Changes between versions 5.4 and 5.5}
+%
+% The user must never put |\omit| before |\CodeAfter|.
+%
+% Correction of a bug: the tabular notes |\tabularnotes| were not composed when
+% present in a block (except a mono-column block).
+%
+% \subsection*{Changes between versions 5.5 and 5.6}
+%
+% Different behaviour for the mono-row blocks.
+%
+% New command |\NotEmpty|.
+%
+% \subsection*{Changes between versions 5.6 and 5.7}
+%
+% New key |delimiters-color|
+%
+% Keys |fill|, |draw| and |line-width| for the command |\Block|.
+%
+% \subsection*{Changes between versions 5.7 and 5.8}
+%
+% Keys |cols| and |restart| of the command |\rowcolors| in the |code-before|.
+%
+% Modification of the behaviour of |\\| in the columns of type |p|, |m| or |b|
+% (for a behaviour similar to the environments of \pkg{array}).
+%
+% Better error messages for the command |\Block|.
+%
+% \subsection*{Changes between versions 5.8 and 5.9}
+%
+% Correction of a bug: in the previous versions, it was not possible to use the
+% key |line-style| for the continuous dotted lines when the Tikz library |babel|
+% was loaded.
+%
+% New key |cell-space-limits|.
+%
+% \subsection*{Changes between versions 5.9 and 5.10}
+%
+% New command |\SubMatrix| available in the |\CodeAfter|.
+%
+% It's possible to provide options (between brackets) to the command |\CodeAfter|.
+%
+% A (non fatal) error is raised when the key |transparent|, which is
+% deprecated, is used.
+%
% \PrintIndex
%
% \tableofcontents
@@ -9163,6 +15687,8 @@ version 2005/12/01 or later.
% Local Variables:
% TeX-fold-mode: t
% TeX-fold-preserve-comments: nil
+% flyspell-mode: nil
% fill-column: 80
% End:
+
diff --git a/Master/texmf-dist/source/latex/nicematrix/nicematrix.ins b/Master/texmf-dist/source/latex/nicematrix/nicematrix.ins
index 316530c421c..b6fbed12ca8 100644
--- a/Master/texmf-dist/source/latex/nicematrix/nicematrix.ins
+++ b/Master/texmf-dist/source/latex/nicematrix/nicematrix.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2017-2019 by F. Pantigny
+%% Copyright (C) 2018-2021 by F. Pantigny
%%
%%
%% This file may be distributed and/or modified under the
@@ -17,7 +17,7 @@
\usedir{tex/latex/nicematrix}
\preamble
-Copyright (C) 2017-2019 by F. Pantigny
+Copyright (C) 2018-2021 by F. Pantigny
This file may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
diff --git a/Master/texmf-dist/source/latex/nimsticks/nimsticks.dtx b/Master/texmf-dist/source/latex/nimsticks/nimsticks.dtx
new file mode 100644
index 00000000000..16e814d026a
--- /dev/null
+++ b/Master/texmf-dist/source/latex/nimsticks/nimsticks.dtx
@@ -0,0 +1,129 @@
+%\iffalse meta-comment
+%Copyright (c) 2020 Peter Rowlett
+%
+%Permission is hereby granted, free of charge, to any person obtaining a copy
+%of this software and associated documentation files (the "Software"), to deal
+%in the Software without restriction, including without limitation the rights
+%to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+%copies of the Software, and to permit persons to whom the Software is
+%furnished to do so, subject to the following conditions:
+%
+%The above copyright notice and this permission notice shall be included in all
+%copies or substantial portions of the Software.
+%
+%THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+%IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+%FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+%AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+%LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+%OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+%SOFTWARE.
+%\fi
+%\section{Background}
+%
+%\lstinline{nimsticks} is a package for \LaTeX{} that draws sticks for representating games of multi-pile Nim.
+%
+%Nim objects could be anything, of course, but conventionally sticks or stones are used. There are various types of dot in LaTeX that might look like stones, but somehow a line of dots didn't seem satisfactory. There are various ways to draw a line (e.g. just typing IIIII), including some tally markers (e.g. in hhcount). My problem with these (call me picky) is that they are all identical lines, and a `heap' of them just looks very organised. Really, I want a set of lines that looks like someone just threw them into heaps (though probably without crossings for the avoidance of ambiguity).
+%
+%The way this works is it draws a thick vertical line in TikZ with a little wobble added so each one doesn't look extremely well-lined-up with its neighbour, achieved by adding or subtracting a small random number to the top and bottom coordinate.
+%
+%It does this by providing two commands:
+%\begin{itemize}
+%\item \lstinline{\drawnimstick}: draws a single Nim stick with a little random wobble;
+%\item \lstinline{\nimgame}: takes a comma-separated list of numbers and draws a line of Nim heaps holding those number of sticks.
+%\end{itemize}
+%
+%\section{Usage}
+%
+%N.B. The precise look of example output in this section is affected by random wobble in the sticks.
+%
+%For example, the input \lstinline!\nimgame{5,3,4}! will produce output like this:
+%
+%\nimgame{5,3,4}
+%
+%This is designed to look like a 3-pile Nim game with 5 sticks in the first pile (or heap), 3 in the second and 4 in the third.
+%
+%\lstinline{\nimgame} will happily work with one heap, so for example the input \lstinline!\nimgame{7}! will produce output like this:
+%
+%\nimgame{7}
+%
+%The command \lstinline{\nimgame} presents the Nim game within \lstinline!\begin{center}...\end{center}!. An optional flag \lstinline{inline} can be used to produce the Nim game without the \lstinline{center} environment. For example, the command \lstinline!\nimgame[inline]{5,3,4}! will produce outline like this: \nimgame[inline]{5,3,4}
+%
+%One reason for this is that \lstinline{\nimgame} will not work in a \lstinline{standalone} document with the \lstinline{crop} option unless the \lstinline{inline} option is used.
+%
+%It is likely the user will want to use \lstinline{\nimgame} and not \lstinline{\drawnimstick} directly, but the input \lstinline{\drawnimstick} will produce output like this: \drawnimstick
+%
+%\section{Issues}
+%
+%There is no limit in the code to the number of piles or the number in a pile, but this code doesn't do anything to cope when line breaks start happening, and presumably there is a computational limit.
+%
+%In principle, if you add lots of piles it will just wrap onto multiple lines, though it will start to look less clear. For example, the input\\
+%\lstinline!\nimgame{1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1}!\\
+%will produce the output:
+%\nimgame{1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1}
+%Similarly, if you have a lot of sticks in the same heap, it will wrap and look confusing, for example the input \lstinline!\nimgame{128}! will produce the output:
+%\nimgame{256}
+%\iffalse
+%<*documentation>
+\documentclass{article}
+\usepackage{nimsticks}
+\usepackage{doc}
+\usepackage{listings}
+\lstset{basicstyle=\ttfamily\footnotesize,commentstyle=\color{white},language=TeX}
+\title{nimsticks v1.1}
+\author{Peter Rowlett}
+\begin{document}
+\maketitle
+ \DocInput{nimsticks.dtx}
+\end{document}
+%</documentation>
+%\fi
+
+%\iffalse
+%<*nimsticks>
+\ProvidesPackage{nimsticks}[2020/07/19 nimsticks 1.1]
+\RequirePackage[first=-100,last=100,seed=0]{lcg}
+\RequirePackage{tikz}
+\RequirePackage{ifthen}
+\@ifundefined{drawnimstick}{}
+ {\PackageWarning{nimsticks}{Command `drawnimstick' already defined}}
+\@ifundefined{nimgame}{}
+ {\PackageWarning{nimsticks}{Command `nimgame' already defined}}
+\@ifundefined{listofgames}{}
+ {\PackageWarning{nimsticks}{Command `listofgames' already defined}}
+\@ifundefined{c@topx}{}
+ {\PackageWarning{nimsticks}{Counter `topx' already defined}}
+\@ifundefined{topx}{}
+ {\PackageWarning{nimsticks}{Existing command `topx' conflicts with counter `topx'}}
+\@ifundefined{c@botx}{}
+ {\PackageWarning{nimsticks}{Counter `botx' already defined}}
+\@ifundefined{botx}{}
+ {\PackageWarning{nimsticks}{Existing command `botx' conflicts with counter `botx'}}
+\@ifundefined{c@heap}{}
+ {\PackageWarning{nimsticks}{Counter `heap' already defined}}
+\@ifundefined{heap}{}
+ {\PackageWarning{nimsticks}{Existing command `heap' conflicts with counter `heap'}}
+\@ifundefined{c@heapindex}{}
+ {\PackageWarning{nimsticks}{Counter `heapindex' already defined}}
+\@ifundefined{heapindex}{}
+ {\PackageWarning{nimsticks}{Existing command `heapindex' conflicts with counter `heapindex'}}
+\newcommand{\drawnimstick}{%
+ \rand\pgfmathsetmacro{\topx}{(\the\value{rand})/1000}%
+ \rand\pgfmathsetmacro{\botx}{(\the\value{rand})/1000}%
+ \begin{tikzpicture}%
+ \draw[very thick] (\topx,0) -- (\botx,0.5);%
+ \end{tikzpicture}%
+}
+\newcommand{\nimgame}[2][block]{%
+ \ifthenelse{\equal{#1}{inline}}{}{\begin{center}}%
+ \def\listofgames{#2}%
+ \foreach \heap in \listofgames {%
+ \foreach \heapindex in {1, ..., \heap} {%
+ \drawnimstick\hspace{0.5mm}%
+ }%
+ \hspace{10mm}%
+ }%
+ \ifthenelse{\equal{#1}{inline}}{}{\end{center}}%
+}
+%</nimsticks>
+%\fi
diff --git a/Master/texmf-dist/source/latex/nimsticks/nimsticks.ins b/Master/texmf-dist/source/latex/nimsticks/nimsticks.ins
new file mode 100644
index 00000000000..a0233b80d8c
--- /dev/null
+++ b/Master/texmf-dist/source/latex/nimsticks/nimsticks.ins
@@ -0,0 +1,30 @@
+\input{docstrip.tex}
+\keepsilent
+\usedir{tex/latex/nimsticks}
+\preamble
+Copyright (c) 2020 Peter Rowlett
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+\endpreamble
+\askforoverwritefalse
+\generate{
+ \file{nimsticks.sty}{\from{nimsticks.dtx}{nimsticks}}
+}
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/nnext/nnext.dtx b/Master/texmf-dist/source/latex/nnext/nnext.dtx
new file mode 100644
index 00000000000..21c244325ef
--- /dev/null
+++ b/Master/texmf-dist/source/latex/nnext/nnext.dtx
@@ -0,0 +1,644 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2020 by Nicholas LaCara
+%
+% This file 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:
+%
+% http://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.
+%
+% \fi
+%
+% \iffalse
+%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+%<package>\ProvidesPackage{nnext}
+%<package> [2020/10/06 v0.0 The nnext package]
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{url}
+\usepackage{charter}
+\usepackage{gb4e}
+\usepackage{nnext}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+\DocInput{nnext.dtx}
+\end{document}
+%</driver>
+% \fi
+% \CheckSum{0}
+%
+% \changes{v0.0}{2020/10/05}{Initial version}
+%
+% \GetFileInfo{nnext.sty}
+% \DoNotIndex{\newcommand,}
+%
+% \title{The \textsf{nnext} package}
+% \author{Nicholas LaCara \\ \texttt{nick.lacara@gmail.com}}
+%
+% \maketitle
+%
+% \abstract{This package is an add-on for the \textsf{gb4e} example package
+% used in linguistics. It implements the \cmd{\Next}, \cmd{\NNext},
+% \cmd{\Last}, and \cmd{\LLast} commands from the \textsf{linguex} package or
+% the \cmd{\nextx}, \cmd{\anextx}, \cmd{\lastx}, \cmd{\blastx}, and
+% \cmd{\bblastx} commands from the \textsf{expex} package.} The package takes
+% its name from the distinctively named \cmd{\NNext} command found in
+% \textsf{linguex}.
+%
+% \section{Introduction}
+%
+% The popular linguistics example package \textsf{linguex} and the less popular
+% (though more powerful) package \textsf{expex} allow users to refer to
+% previously or to-be defined examples through mnemonic commands such as
+% \cmd{\Next} or \cmd{\nextx}. The popular package \textsf{gb4e} lacks any such
+% functionality. The goal of this package is to provide this functionality for
+% \textsf{gb4e} and related packages so that users that need (or want) to use
+% \textsf{gb4e} but are more comfortable with \textsf{linguex} or
+% \textsf{expex} can still have access to these macros while using
+% \textsf{gb4e}.
+%
+% This package is currently compatible with the original \textsf{gb4e} package
+% as well as the modified version \textsf{langsci-gb4e} used by Language
+% Science Press and with \textsf{gb4e-emulate} by Alan Munn (which reimplements
+% \textsf{gb4e}'s functionality with the package \textsf{enumitem}).\footnote{%
+% Unfortunately, \textsf{gb4e-emulate} is not on \textsc{ctan}. It is, however,
+% available at its GitHub repository: %
+% \url{https://github.com/amunn/gb4e-emulate}}
+%
+% \section{Usage}
+%
+% \subsection{Loading the package}
+%
+% The package should be loaded in your preamble with |\usepackage{nnext}|. It
+% should be loaded \emph{after} \textsf{gb4e} (or whichever variant you are
+% using).
+%
+% \subsection{Package options}
+%
+% The package has a few options that may be specified when loaded:
+%
+% \begin{description}
+% \item[\texttt{linguex}] This option defines the macros \cmd{\Next},
+% \cmd{\NNext}, \cmd{\Last}, and \cmd{\LLast}, as found in the
+% \textsf{linguex} package. It is the default package option and does not
+% need to be specified.
+%
+% \item[\texttt{expex}] This option defines the macros \cmd{\nextx},
+% \cmd{\anextx}, \cmd{\lastx}, \cmd{\blastx}, and \cmd{\bblastx}, as
+% found in the \textsf{expex} package.
+%
+% \item[\texttt{noparens}] This option disables the use of parentheses around
+% example numbers that are on by default when \textsf{linguex} emulation
+% is used. This is the typical behavior for \textsf{gb4e} and
+% \textsf{expex}.
+%
+% \end{description}
+%
+% \subsection{Macros}
+%
+% \subsubsection{\textsf{linguex} emulation mode (default)}
+%
+% If the user loads the package with the \textsf{linguex} option or, indeed,
+% with no options specified, the package will provide the following macros.
+%
+% \begin{itemize}
+%
+% \item \DescribeMacro{\Next} The macro \cmd{\Next} will print the next
+% example number. So, if the previous example was (15), this will
+% print (16).
+%
+% \item \DescribeMacro{\NNext} The macro \cmd{\NNext} will print the
+% example number after next. So, if the previous example was (15),
+% this will print (17).
+%
+% \item \DescribeMacro{\Last} The macro \cmd{\Last} will print the
+% previous example number. So, if the previous example was (15),
+% this will print (15).
+%
+% \item \DescribeMacro{\LLast} The macro \cmd{\LLast} will print the
+% example number before last. So, if the previous example was (15),
+% this will print (14).
+%
+% \end{itemize}
+%
+% \noindent Usage of these macros is straightforward. Simply deploy
+% them in running text, as in the following code:
+%
+% \begin{verbatim}
+% If you want to refer to the next example, type \Next.
+% If you want to refer to the example after that, type \NNext.
+%
+% \begin{exe}
+% \ex[]{This is an example.}
+% \ex[*]{This are another example.}
+% \end{exe}
+%
+% \noindent If you want to refer to the previous example,
+% type \Last. If you want to refer to the example before
+% that, type \LLast.
+% \end{verbatim}
+%
+%
+% \noindent This code produces the following output:\medskip
+%
+% \framebox{\begin{minipage}{0.9\linewidth}
+%If you want to refer to the next example, type \Next.
+%If you want to refer to the example after that, type \NNext.
+%
+% \begin{exe}
+% \ex[]{This is an example.}
+% \ex[*]{This are another example.}
+% \end{exe}
+%
+%\noindent If you want to refer to the previous example, type \Last.
+%If you want to refer to the example before that,
+%type \LLast.
+%
+% \end{minipage}}
+%
+% \subsubsection{\textsf{expex} emulation mode}
+%
+% If the user loads the package with the \textsf{expex} option the package will
+% provide the following macros.
+%
+% \begin{itemize}
+%
+% \item \DescribeMacro{\nextx} The macro \cmd{\nextx} will print the next
+% example number. So, if the previous example was (15), this will
+% print (16).
+%
+% \item \DescribeMacro{\anextx} The macro \cmd{\anextx} will print the
+% example number after next. So, if the previous example was (15),
+% this will print (17).
+%
+% \item \DescribeMacro{\lastx} The macro \cmd{\lastx} will print the
+% previous example number. So, if the previous example was (15), this
+% will print (15).
+%
+% \item \DescribeMacro{\blastx} The macro \cmd{\blastx} will print the
+% example number before last. So, if the previous example was (15),
+% this will print (14).
+%
+% \item \DescribeMacro{\bblastx} The macro \cmd{\bblastx} will print the
+% example number before last. So, if the previous example was (15),
+% this will print (13).
+% \end{itemize}
+%
+% \noindent Usage of these macros is straightforward. Simply deploy
+% them in running text, as in the following code:
+%
+% \begin{verbatim}
+% If you want to refer to the next example, type (\nextx).
+% If you want to refer to the example after that, type (\anextx).
+%
+% \begin{exe}
+% \ex[]{This is an example.}
+% \ex[*]{This are another example.}
+% \end{exe}
+%
+% \noindent If you want to refer to the previous example,
+% type (\lastx). If you want to refer to the example before
+% that, type (\blastx). If you want to refer to the example
+% before that, type (\bblastx).
+% \end{verbatim}
+%
+%
+% \noindent This code produces the following output:\medskip
+%
+% \framebox{\begin{minipage}{0.9\linewidth}
+%If you want to refer to the next example, type \Next.
+%If you want to refer to the example after that, type \NNext.
+%
+% \begin{exe}
+% \ex[]{This is an example.}
+% \ex[*]{This are another example.}
+% \end{exe}
+%
+%\noindent If you want to refer to the previous example, type \Last.
+%If you want to refer to the example before that,
+%type \LLast. If you want to refer to the example
+% before that, type (2).
+%
+% \end{minipage}}
+%
+% \subsection{Class compatibility}
+%
+% I have tested the package with a variety of common \LaTeX\ document classes
+% (including the ams-\LaTeX\ classes, scr* group of classes,
+% \textsf{tufte-handout}, and the \textsf{exam} class, among several others)
+% and believe it should be broadly compatible with most people's set-ups (so
+% far I have only found it to be incompatible with the \textsf{standalone}
+% class). If you have an issue, drop me an email and I'll see if I can't make
+% it work for you.
+%
+%
+% \section{Rationale}
+%
+% This package is really just a quality-of-life add-on for people using the
+% \textsf{gb4e} example package.
+%
+% The initial motivation for this package came from a colleague who needed to
+% typeset a document for submission to a publisher but was unable to use
+% \textsf{linguex} due to constraints imposed by the publisher's class file.
+% She asked specifically if there was any way to get \textsf{gb4e} to replicate
+% the functionality of the \textsf{linguex} commands \cmd{\Next}, \cmd{\NNext},
+% and \cmd{\Last}, among others.
+%
+% I figured it wouldn't be too difficult to code up a solution and send it to
+% her (which I did!), but given that there are likely other people who, due to
+% various externally imposed requirements, might need to use \textsf{gb4e} when
+% they are used to another example pacakge, I thought a more robust solution
+% might be appropriate. This package attempts to provide that.
+%
+% I also hope that this package can help people migrate to \textsf{gb4e} from
+% \textsf{linguex}. There are several benefits to using \textsf{gb4e} over
+% \textsf{linguex}, including a more robust syntax that is more aligned with
+% standard \LaTeX\ syntax and less sensitive to code formatting such as
+% line-breaks. That said, \textsf{gb4e} is a little less user-friendly than
+% \textsf{linguex}, so I think that providing one of the features that
+% \textsf{linguex} users expect can help people to migrate if they so choose.
+%
+% \section{Some notes for \textsf{linguex} users}
+%
+% The \textsf{gb4e} package behaves slightly differently from \textsf{linguex}
+% in a handful of ways. A few of those differences may impact how you
+% experience using this package.
+%
+% \begin{itemize}
+%
+% \item \textsf{gb4e} handles example numbering in footnotes poorly, using
+% numbering from the main body of the text (\textsf{linguex} uses roman
+% numerals in footnotes, one of the ways in which it is better). This is
+% something to keep in mind if you put an example in a footnote.
+%
+% \item Relatedly, if you use \textsf{gb4e}'s commands for customizing example
+% label numbers (\emph{e.g.}, \cmd{\exi} and \cmd{\exr}), the code here will
+% not use those special labels.
+%
+% \end{itemize}
+%
+% \StopEventually{\PrintIndex\PrintChanges}
+%
+%
+% \section{Implementation}
+%
+% In the following section, I present the fully commented code for the package.
+%
+%
+% \subsection{Dependencies}
+%
+% I use the \textsf{xspace} package to make the spacing after example numbers
+% right when using the \cmd{\Next}, \cmd{\Last}, \emph{etc}., commands. This
+% mimics the behavior of \textsf{linguex}.
+%
+% \begin{macrocode}
+\RequirePackage{xspace}
+% \end{macrocode}
+%
+% \noindent I also use \textsf{ifthen} for various booleans set by the package
+% options.
+%
+% \begin{macrocode}
+\RequirePackage{ifthen}
+% \end{macrocode}
+%
+% Because this package is designed to work with a range of \textsf{gb4e}
+% variants, there is no line in the code for loading \textsf{gb4e}. Documents
+% loading \textsf{nnext} without loading a \textsf{gb4e} variant will compile
+% will compile, but using any of the included macros will cause an error.
+%
+%
+% \subsection{Booleans}
+%
+% Here I define what the booleans will be. The first will set the
+% package to emulate linguex's \cmd{\Next}, \cmd{\NNext}, \cmd{\Last}, and
+% \cmd{\LLast} commands. The boolean is set to `false' initially.
+%
+% \begin{macrocode}
+\newboolean{emulatelinguex}
+\setboolean{emulatelinguex}{false}
+% \end{macrocode}
+%
+% \noindent The next boolean will set the package to emulate expex's
+% \cmd{\nextx}, \cmd{\lastx}, \cmd{\blastx}, \cmd{\anextx}, and \cmd{\bblastx}
+% commands. The boolean is set to `false' initially.
+%
+% \begin{macrocode}
+\newboolean{emulateexpex}
+\setboolean{emulateexpex}{false}
+% \end{macrocode}
+%
+% \noindent The final boolean will set whether the example numbers in the text
+% should be set with surrounding parentheses or not. The boolean is set to
+% `true' initially.
+%
+% \begin{macrocode}
+\newboolean{parentheses}
+\setboolean{parentheses}{true}
+% \end{macrocode}
+%
+%
+% \subsection{Package options}
+%
+% Here is where various package options are defined. All the package options do
+% is manipulate the values of the booleans declared in the previous subsection.
+%
+% By using the package option \texttt{linguex}, the user sets the
+% \texttt{emulatelinguex} boolean to `true'.
+%
+% \begin{macrocode}
+\DeclareOption{linguex}{
+ \setboolean{emulatelinguex}{true}
+}
+% \end{macrocode}
+%
+% \noindent By using the package option \texttt{expex}, the user sets the
+% \texttt{emulateexpex} boolean to `true' and the \texttt{emulatelinguex} and
+% \texttt{parentheses} booleans to `false'.
+%
+% \begin{macrocode}
+\DeclareOption{expex}{
+ \setboolean{emulateexpex}{true}
+ \setboolean{emulatelinguex}{false}
+ \setboolean{parentheses}{false}
+}
+% \end{macrocode}
+%
+% \noindent By using the package option \texttt{noparens}, the user sets the
+% \texttt{parentheses} boolean to `false'.
+%
+% \begin{macrocode}
+\DeclareOption{noparens}{
+ \setboolean{parentheses}{false}
+}
+% \end{macrocode}
+%
+% \noindent After defining our package options, we tell \LaTeX\ to use
+% \textsf{linguex} emulation as the default mode.
+%
+% \begin{macrocode}
+\ExecuteOptions{linguex}
+\ProcessOptions\relax
+% \end{macrocode}
+%
+%
+% \subsection{Detecting \textsf{gb4e} variants}
+%
+% To make this compatible with different variants of \textsf{gb4e}, we need to
+% detect which variant of \textsf{gb4e} the user is using, since there is some
+% variation in what each variant uses for its example counter. Right now, the
+% code is compatible with the following gb4e-like packages:
+%
+% \begin{itemize}
+% \item \textsf{gb4e}
+% \item \textsf{langsci-gb4e} (for Language Science Press books)
+% \item \textsf{gb4e-emulate} (by Alan Munn, which
+% reimplements \textsf{gb4e} using the package \textsf{enumitem})
+% \end{itemize}
+%
+% The code below checks to see if \textsf{langsci-gb4e} is loaded; if it isn't,
+% it checks to see if \textsf{gb4e-emulate} is loaded; if it isn't, it checks
+% to see if \textsf{gb4e} is loaded. If this fails, the package defaults to
+% using the \texttt{exx} counter from \textsf{gb4e} on the assumption that the
+% most likely package to be used instead of \textsf{gb4e} is a modded version.
+% It also prints a warning to the terminal.
+%
+% The reason this needs to be done is because each of these packages uses a
+% different counter for example numbering under the hood:
+%
+% \begin{itemize}
+% \item \textsf{gb4e} uses the counter \texttt{exx}
+% \item \textsf{langsci-gb4e} uses the counter \texttt{equation}
+% \item \textsf{gb4e-emulate} uses the counter \texttt{exei}
+% \end{itemize}
+%
+% \begin{macro}{\@countername}
+% Once the right package is identified, the value of \cmd{\@countername} is
+% defined to match the counter used by that package. This allows the macros
+% defined below to get the current value of the example counter at any point in
+% the document regardless of what example package is being used.
+%
+% \begin{macrocode}
+\@ifpackageloaded{langsci-gb4e}%
+ {\newcommand{\@countername}{equation}}
+ {\@ifpackageloaded{gb4e-emulate}%
+ {\newcommand{\@countername}{exei}}
+ {\@ifpackageloaded{gb4e}%
+ {\newcommand{\@countername}{exx}}
+ {\PackageWarningNoLine{nnext}{No known compatible %
+ example package loaded! Examples may not be correctly %
+ referenced, or there may be fatal errors}%
+ \newcommand{\@countername}{exx}}}}%
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+% \subsection{Manipulating parentheses}
+%
+% \begin{macro}{\@lparens}
+% \begin{macro}{\@rparens}
+% \begin{macro}{\@afterspace}
+%
+% % \textsf{linguex} and \textsf{expex} behave differently with regard to
+% % whether the output of reference commands include parentheses:
+% \textsf{linguex} includes them; \textsf{expex} (like \textsf{gb4e}) does not.
+% The code here defines whether the macros include parentheses based on the
+% booleans defined above. It does this by setting the commands \cmd{\@lparens}
+% and \cmd{\@rparens} to either be parentheses or by defining them to be empty.
+% It also defines whether there should be space included after the number (as
+% in \textsf{linguex}) or not (as in \textsf{expex}). It does so, again, by
+% defining the macro \textsf{\@afterspace} to either to expand to \cmd{\xspace}
+% or to exapand to nothing. These macros are then used in the
+% \cmd{\printtmpcounter} macro below.
+%
+% \begin{macrocode}
+\ifthenelse{\boolean{emulatelinguex}%
+ \AND \boolean{parentheses}}{%
+ \newcommand{\@lparens}{(}
+ \newcommand{\@rparens}{)}
+ \newcommand{\@afterspace}{\xspace}}{%
+ \newcommand{\@lparens}{}
+ \newcommand{\@rparens}{}
+ \newcommand{\@afterspace}{}}%
+% \end{macrocode}
+%
+%\end{macro}
+%\end{macro}
+%\end{macro}
+%
+%
+% \subsection{Generic macros}
+%
+% \textsf{linguex} implements its commands by getting the current value of the
+% example counter, storing that value in a temporary counter, and then adding
+% or subtracting from that temporary counter. This is the approach that I take
+% below. To replicate this functionality with \textsf{gb4e}, we only have to do
+% this with the counter that it (or its variants) uses
+%
+%
+% \subsubsection{Setting up the temporary counter}
+%
+% First, we create a temporary counter, which will be used to store the value
+% of the next, last, or whichever example number the macro is looking for.
+%
+% \begin{macrocode}
+\newcounter{tmpcounter}
+% \end{macrocode}
+%
+%
+% \begin{macro}{\settmpcounter}
+%
+% Now we define the command \cmd{\settmpcounter}, which gets the value of
+% the \textsf{gb4e} example counter (the name of which is stored in
+% \cmd{\@countername}) and sets the value of the temporary counter to this
+% value plus some integer:
+%
+% \begin{macrocode}
+\newcommand{\settmpcounter}[1]{%
+\setcounter{tmpcounter}{\value{\@countername}}%
+ \addtocounter{tmpcounter}{#1}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\printtmpcounter}
+%
+% Now we define a command for printing the value of temporary counter with or
+% without parentheses and with or without the trailing space, depending on
+% whether \textsf{linguex} or \textsf{expex} is being emulated. This relies on
+% how \cmd{\@lparens}, \cmd{\@rparens}, and \cmd{\@afterspace} were defined
+% above.
+%
+% \begin{macrocode}
+\newcommand{\printtmpcounter}[1]{\settmpcounter{#1}%
+\@lparens\thetmpcounter\@rparens\@afterspace}
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+% \subsubsection{Generic definitions}
+%
+% Now we define some generic, under-the-hood macros for commands that add to or
+% subtract from the temporary counters and print those numbers as though they
+% were references. These under-the-hood commands will be assigned user-facing
+% names depending on whether \textsf{linguex} or \textsf{expex} is being
+% emulated.
+%
+% \begin{macro}{\@Next}
+%
+% The macro \cmd{\@Next} increments the tempory counter by one, which will be
+% the value of the next example:
+%
+% \begin{macrocode}
+\newcommand{\@Next}{\printtmpcounter{1}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\@NNext}
+%
+% The macro \cmd{\@NNext} increments the tempory counter by two, which will be
+% the value of the example after next:
+%
+% \begin{macrocode}
+\newcommand{\@NNext}{\printtmpcounter{2}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\@Last}
+%
+% The macro \cmd{\@Last} does not change the value of the temporary counter,
+% since this is the value of the previous example:
+%
+% \begin{macrocode}
+\newcommand{\@Last}{\printtmpcounter{0}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\@LLast}
+%
+% The macro \cmd{\@LLast} decreases the tempory counter by one, which will be
+% the value of the example before last:
+%
+% \begin{macrocode}
+\newcommand{\@LLast}{\printtmpcounter{-1}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+% \begin{macro}{\@LLLast}
+%
+% The macro \cmd{\@LLLast} decreases the tempory counter by two, which will be
+% the value of the example before the example before last:
+%
+% \begin{macrocode}
+\newcommand{\@LLLast}{\printtmpcounter{-2}}
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+% \subsection{Emulate \textsf{linguex}}
+%
+% \begin{macro}{\Next}
+% \begin{macro}{\NNext}
+% \begin{macro}{\Last}
+% \begin{macro}{\LLast}
+%
+% If the user chooses to emulate the \textsf{linguex} commands, then this
+% conditional uses the command names from \textsf{linguex} and defines them to
+% expand to the macros defined in the previous subsection.\bigskip
+%
+% \begin{macrocode}
+\ifthenelse{\boolean{emulatelinguex}}{%
+ \newcommand{\Next}{\@Next}
+ \newcommand{\NNext}{\@NNext}
+ \newcommand{\Last}{\@Last}
+ \newcommand{\LLast}{\@LLast}}{}
+% \end{macrocode}
+%
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Emulate \textsf{expex}}
+%
+% \begin{macro}{\nextx}
+% \begin{macro}{\anextx}
+% \begin{macro}{\lastx}
+% \begin{macro}{\blastx}
+% \begin{macro}{\bblastx}
+% If the user chooses to emulate the \textsf{linguex} commands, then this
+% conditional uses the command names from \textsf{linguex} and defines them to
+% expand to the macros defined in the previous subsection.\bigskip\medskip
+%
+% \begin{macrocode}
+\ifthenelse{\boolean{emulateexpex}}{%
+ \newcommand{\nextx}{\@Next}
+ \newcommand{\anextx}{\@NNext}
+ \newcommand{\lastx}{\@Last}
+ \newcommand{\blastx}{\@LLast}
+ \newcommand{\bblastx}{\@LLLast}}{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/nnext/nnext.ins b/Master/texmf-dist/source/latex/nnext/nnext.ins
new file mode 100644
index 00000000000..baa1cb6dbae
--- /dev/null
+++ b/Master/texmf-dist/source/latex/nnext/nnext.ins
@@ -0,0 +1,48 @@
+%%
+%% Copyright (C) 2020 by Nicholas LaCara
+%%
+%% This file 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:
+%%
+%% http://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.
+%%
+\input docstrip.tex
+\keepsilent
+\usedir{tex/latex/nnext}
+
+\preamble
+ This is a generated file.
+ Copyright (C) 2020 by Nicholas LaCara
+ This file 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:
+ http://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.
+\endpreamble
+
+\generate{\file{nnext.sty}{\from{nnext.dtx}{package}}}
+
+\Msg{=========================================================}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space nnext.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file nnext.dtx}
+\Msg{* through LaTeX. You will need to have gb4e installed}
+\Msg{* in order to compile the documentation.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{=========================================================}
+
+\endbatchfile
+
diff --git a/Master/texmf-dist/source/latex/nomencl/nomencl.drv b/Master/texmf-dist/source/latex/nomencl/nomencl.drv
index 8a4924ac0eb..252b66fc09b 100644
--- a/Master/texmf-dist/source/latex/nomencl/nomencl.drv
+++ b/Master/texmf-dist/source/latex/nomencl/nomencl.drv
@@ -16,7 +16,7 @@
%% version 1.2 of the license, or (at your option) any later version.
%%
\ProvidesFile{nomencl.drv}%
- [2020/03/01 v5.4 Nomenclature package]
+ [2020/12/29 v5.5 Nomenclature package]
\documentclass[11pt]{ltxdoc}%
\RequirePackage{fancyvrb}%
\RequirePackage{hypdoc}%
diff --git a/Master/texmf-dist/source/latex/nomencl/nomencl.dtx b/Master/texmf-dist/source/latex/nomencl/nomencl.dtx
index ff5f3dedcdd..3b9326f74b3 100644
--- a/Master/texmf-dist/source/latex/nomencl/nomencl.dtx
+++ b/Master/texmf-dist/source/latex/nomencl/nomencl.dtx
@@ -28,7 +28,7 @@
%<*package|driver>
% \fi
% \ProvidesFile{nomencl.dtx}%
- [2020/03/01 v5.4 Nomenclature package]
+ [2020/12/29 v5.5 Nomenclature package]
%
% \iffalse
%</package|driver>
@@ -352,7 +352,7 @@ follows easily.
% \item[nonomentbl] Do not print nomenclature in the |nomentbl| style, see
% Section~\ref{sec:nomentbl} (default).
% \item[\hspace{-\labelsep}]
-% \textbf{croatian, danish, english, french, german, italian,
+% \textbf{catalan, croatian, danish, english, french, german, italian,
% norwegian-bokmaal, norwegian-nynorsk, polish,
% portuguese, russian, slovene, spanish, ukrainian}
% The reference texts and the nomenclature title will appear in the
@@ -996,11 +996,12 @@ follows easily.
% The authors want to thank Stefan
% B\"ohm and Karl Heinz Marbaise who helped testing this package.
%
-% The translations were done by Branka Lon\v{c}arevi\'{c} (Croatian),
-% Brian Elmegaard (Danish), Denis B.~Roegel (French), Sani Egisto
-% (Italian), Artur Gorka (Polish), Pedro Areal (Portuguese), Alejandro
-% Lopez-Valencia (Spanish), joder (Slovene),
-% and Boris Veytsman (Russian and Ukrainian).
+% The translations were done by Joan Queralt (Catalan), Branka
+% Lon\v{c}arevi\'{c} (Croatian), Brian Elmegaard (Danish), Denis
+% B.~Roegel (French), Sani Egisto (Italian), wishfort36 (Norwegian),
+% Artur Gorka (Polish), Pedro Areal (Portuguese), joder (Slovene),
+% Alejandro Lopez-Valencia (Spanish), and Boris Veytsman (Russian and
+% Ukrainian).
%
%
% \subsection{Releases and Legal Issues}
@@ -1177,8 +1178,17 @@ follows easily.
% \changes{v5.1}{2019/02/08}{Changed \# to \#\# in options.}
% \changes{v5.3}{2019/11/23}{Added Slovene (joder)}
% \changes{v5.4}{2020/03/01}{Added Norwegian (wishfort36)}
+% \changes{v5.4}{2020/12/29}{Added Catalan (Joan Queralt)}
% If you can help out with translations for some other languages, let me know.
% \begin{macrocode}
+\DeclareOptionX{catalan}{%
+\def\eqdeclaration##1{, vegeu l'equaci\’o\nobreakspace(##1)}%
+\def\pagedeclaration##1{, p\`agina\nobreakspace##1}
+\def\nomname{Nomenclatura}
+\def\nomAname{Lletres llatines}%
+\def\nomGname{Lletres gregues}
+\def\nomXname{Super{\’\i}ndexs}%
+\def\nomZname{Sub{\’\i}ndexs}}
\DeclareOptionX{croatian}{%
\def\eqdeclaration##1{, vidi jednad\v{z}bu\nobreakspace(##1)}%
\def\pagedeclaration##1{, stranica\nobreakspace##1}%
diff --git a/Master/texmf-dist/source/latex/ntgclass/ntgclass.dtx b/Master/texmf-dist/source/latex/ntgclass/ntgclass.dtx
index 3c906338dee..233a01d19fd 100644
--- a/Master/texmf-dist/source/latex/ntgclass/ntgclass.dtx
+++ b/Master/texmf-dist/source/latex/ntgclass/ntgclass.dtx
@@ -59,7 +59,7 @@
%<*driver>
\ProvidesFile{ntgclass.drv}
%</driver>
- [2020/02/22 v2.1d
+ [2020-11-17 v2.1e
%<artikel|rapport|boek> NTG LaTeX document class]
%<10pt|11pt|12pt> NTG LaTeX file (size option)]
% \end{macrocode}
@@ -175,6 +175,7 @@
% \changes{v2.0x}{1997/09/08}{Repaired a few documentation bugs}
% \changes{v2.1c}{2020/02/18}{Update to synchronize with classes.dtx}
% \changes{v2.1c}{2020/02/18}{Various commands made robust}
+% \changes{v2.1d}{2020/02/20}{Upped version number for new upload to CTAN}
%
% \title{NTG Document Classes for \LaTeX{} version 2e\thanks{This file
% has version number \fileversion, last revised \filedate.}}
@@ -4805,8 +4806,9 @@
%
% \changes{v2.1b}{2020/02/18}{Prevent protrusion
% (\url{https://tex.stackexchange.com/q/172785/10109})}
+% \changes{v2.1e}{2020-11-17}{removed a superfluous closing brace}
% \begin{macrocode}
- \kern-\p@\kern\p@}}\par
+ \kern-\p@\kern\p@}\par
\endgroup}
% \end{macrocode}
% The new definition:
diff --git a/Master/texmf-dist/source/latex/oberdiek/README.txt b/Master/texmf-dist/source/latex/oberdiek/README.txt
deleted file mode 100644
index 0bf3fd182b5..00000000000
--- a/Master/texmf-dist/source/latex/oberdiek/README.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-README 2019/12/29
-
-This file describes the directory
- CTAN:macros/latex/contrib/oberdiek/
-
-It contains several packages:
- <package>.dtx: source code
- <package>.pdf: documentation
-
-Installation is easier, if you want to install all packages:
-Just download
- CTAN:install/macros/latex/contrib/oberdiek.tds.zip
-and unzip it in your preferred TDS (texmf) tree.
-
-
-Other files in the CTAN directory:
-* README: This file.
-* oberdiek.tex, oberdiek.pdf:
- Table of contents of all packages in the directory.
- It contains the table of contents and the abstract of the packages.
- The name is a convenience to users of the program `texdoc'.
-
-Happy TeXing
- Heiko Oberdiek
- and
- Oberdiek Package Support Group
- ho-tex@tug.org
- Preferred bug reporting address is now
- https://github.com/ho-tex/oberdiek/issues
diff --git a/Master/texmf-dist/source/latex/oberdiek/hypdestopt.dtx b/Master/texmf-dist/source/latex/oberdiek/hypdestopt.dtx
deleted file mode 100644
index ac257b9db1a..00000000000
--- a/Master/texmf-dist/source/latex/oberdiek/hypdestopt.dtx
+++ /dev/null
@@ -1,966 +0,0 @@
-% \iffalse meta-comment
-%
-% File: hypdestopt.dtx
-% Version: 2019/12/29 v2.6
-% Info: Hyperref destination optimizer
-%
-% Copyright (C)
-% 2006-2008, 2011 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
-% https://github.com/ho-tex/oberdiek/issues
-%
-% 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. This version of this license is in
-% https://www.latex-project.org/lppl/lppl-1-3c.txt
-% and 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 Maintainers of this work are
-% Heiko Oberdiek and the Oberdiek Package Support Group
-% https://github.com/ho-tex/oberdiek/issues
-%
-% This work consists of the main source file hypdestopt.dtx
-% and the derived files
-% hypdestopt.sty, hypdestopt.pdf, hypdestopt.ins, hypdestopt.drv.
-%
-% Distribution:
-% CTAN:macros/latex/contrib/oberdiek/hypdestopt.dtx
-% CTAN:macros/latex/contrib/oberdiek/hypdestopt.pdf
-%
-% Unpacking:
-% (a) If hypdestopt.ins is present:
-% tex hypdestopt.ins
-% (b) Without hypdestopt.ins:
-% tex hypdestopt.dtx
-% (c) If you insist on using LaTeX
-% latex \let\install=y\input{hypdestopt.dtx}
-% (quote the arguments according to the demands of your shell)
-%
-% Documentation:
-% (a) If hypdestopt.drv is present:
-% latex hypdestopt.drv
-% (b) Without hypdestopt.drv:
-% latex hypdestopt.dtx; ...
-% The class ltxdoc loads the configuration file ltxdoc.cfg
-% if available. Here you can specify further options, e.g.
-% use A4 as paper format:
-% \PassOptionsToClass{a4paper}{article}
-%
-% Programm calls to get the documentation (example):
-% pdflatex hypdestopt.dtx
-% makeindex -s gind.ist hypdestopt.idx
-% pdflatex hypdestopt.dtx
-% makeindex -s gind.ist hypdestopt.idx
-% pdflatex hypdestopt.dtx
-%
-% Installation:
-% TDS:tex/latex/oberdiek/hypdestopt.sty
-% TDS:doc/latex/oberdiek/hypdestopt.pdf
-% TDS:source/latex/oberdiek/hypdestopt.dtx
-%
-%<*ignore>
-\begingroup
- \catcode123=1 %
- \catcode125=2 %
- \def\x{LaTeX2e}%
-\expandafter\endgroup
-\ifcase 0\ifx\install y1\fi\expandafter
- \ifx\csname processbatchFile\endcsname\relax\else1\fi
- \ifx\fmtname\x\else 1\fi\relax
-\else\csname fi\endcsname
-%</ignore>
-%<*install>
-\input docstrip.tex
-\Msg{************************************************************************}
-\Msg{* Installation}
-\Msg{* Package: hypdestopt 2019/12/29 v2.6 Hyperref destination optimizer (HO)}
-\Msg{************************************************************************}
-
-\keepsilent
-\askforoverwritefalse
-
-\let\MetaPrefix\relax
-\preamble
-
-This is a generated file.
-
-Project: hypdestopt
-Version: 2019/12/29 v2.6
-
-Copyright (C)
- 2006-2008, 2011 Heiko Oberdiek
- 2016-2019 Oberdiek Package Support Group
-
-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. This version of this license is in
- https://www.latex-project.org/lppl/lppl-1-3c.txt
-and 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 Maintainers of this work are
-Heiko Oberdiek and the Oberdiek Package Support Group
-https://github.com/ho-tex/oberdiek/issues
-
-
-This work consists of the main source file hypdestopt.dtx
-and the derived files
- hypdestopt.sty, hypdestopt.pdf, hypdestopt.ins, hypdestopt.drv.
-
-\endpreamble
-\let\MetaPrefix\DoubleperCent
-
-\generate{%
- \file{hypdestopt.ins}{\from{hypdestopt.dtx}{install}}%
- \file{hypdestopt.drv}{\from{hypdestopt.dtx}{driver}}%
- \usedir{tex/latex/oberdiek}%
- \file{hypdestopt.sty}{\from{hypdestopt.dtx}{package}}%
-}
-
-\catcode32=13\relax% active space
-\let =\space%
-\Msg{************************************************************************}
-\Msg{*}
-\Msg{* To finish the installation you have to move the following}
-\Msg{* file into a directory searched by TeX:}
-\Msg{*}
-\Msg{* hypdestopt.sty}
-\Msg{*}
-\Msg{* To produce the documentation run the file `hypdestopt.drv'}
-\Msg{* through LaTeX.}
-\Msg{*}
-\Msg{* Happy TeXing!}
-\Msg{*}
-\Msg{************************************************************************}
-
-\endbatchfile
-%</install>
-%<*ignore>
-\fi
-%</ignore>
-%<*driver>
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{hypdestopt.drv}%
- [2019/12/29 v2.6 Hyperref destination optimizer (HO)]%
-\documentclass{ltxdoc}
-\usepackage{holtxdoc}[2011/11/22]
-\begin{document}
- \DocInput{hypdestopt.dtx}%
-\end{document}
-%</driver>
-% \fi
-%
-%
-%
-% \GetFileInfo{hypdestopt.drv}
-%
-% \title{The \xpackage{hypdestopt} package}
-% \date{2019/12/29 v2.6}
-% \author{Heiko Oberdiek\thanks
-% {Please report any issues at \url{https://github.com/ho-tex/oberdiek/issues}}}
-%
-% \maketitle
-%
-% \begin{abstract}
-% Package \xpackage{hypdestopt} supports \xpackage{hyperref}'s
-% \xoption{pdftex} driver. It removes unnecessary destinations
-% and shortens the destination names or uses numbered destinations
-% to get smaller PDF files.
-% \end{abstract}
-%
-% \tableofcontents
-%
-% \section{User interface}
-%
-% \subsection{Introduction}
-%
-% Before PDF-1.5 annotations and destinations cannot be compressed.
-% If the destination names are not needed for external use, the
-% file size can be decreased by the following means:
-% \begin{itemize}
-% \item Unused destinations are removed.
-% \item The destination names are shortened (option \xoption{name}).
-% \item Using numbered destinations (option \xoption{num}).
-% \end{itemize}
-%
-% \subsection{Requirements}
-%
-% \begin{itemize}
-% \item Package \xpackage{hyperref} 2006/06/01 v6.75a or newer
-% (\cite{hyperref}).
-% \item Package \xpackage{alphalph} 2006/05/30 v1.4 or newer
-% (\cite{alphalph}), if option \xoption{name} is used.
-% \item Package \xpackage{iftex}.
-% \item \pdfTeX\ 1.30.0 or newer.
-% \item \pdfTeX\ in PDF mode.
-% \item \eTeX\ extensions enabled.
-% \item Probably an additional compile run of \pdfLaTeX\ is necessary.
-% \end{itemize}
-%
-% In the first compile runs you can get warnings such as:
-%\begin{quote}
-%\begin{verbatim}
-%! pdfTeX warning (dest): name{...} has been referenced ...
-%\end{verbatim}
-%\end{quote}
-% These warnings should vanish in later compile runs.
-% However these warnings also can occur without this package.
-% The package does not cure them, thus these warnings will remain,
-% but the destination name can be different. In such cases test
-% without package, too.
-%
-% \subsection{Use}
-%
-% If the requirements are met, load the package:
-%\begin{quote}
-%\verb|\usepackage{hypdestopt}|
-%\end{quote}
-%
-% The following options are supported:
-% \begin{description}
-% \item[\xoption{verbose}:] Verbose debug output is enabled and written
-% in the protocol file.
-% \item[\xoption{num}:] Numbered destinations are used. The file size
-% is smaller, because names are no longer used.
-% This is the default.
-% \item[\xoption{name}:] Destinations are identified by names.
-% \end{description}
-%
-% \subsection{Limitations}
-%
-% \begin{itemize}
-% \item Forget this package, if you need preserved destination names.
-% \item Destination name strings use all bytes (0..255) except
-% the carriage return (13), left parenthesis (40), right
-% parenthesis (41), and backslash (92), because they
-% must be quoted in general and therefore occupy two bytes
-% instead of one.
-%
-% Further the zero byte (0) is avoided for programs
-% that implement strings using zero terminated C strings.
-% And 255 (0xFF) is avoided to get rid of a possible
-% unicode marker at the begin.
-%
-% So far I have not seen problems with:
-% \begin{itemize}
-% \item AcrobatReader 5.08/Linux
-% \item AcrobatReader 7.0/Linux
-% \item xpdf 3.00
-% \item Ghostscript 8.50
-% \item gv 3.5.8
-% \item GSview 4.6
-% \end{itemize}
-% But I have not tested all and all possible PDF viewers.
-% \item Use of named destinations (\cs{pdfdest}, \cs{pdfoutline},
-% \cs{pdfstartlink}, \dots) that are not supported by this
-% package.
-% \item Currently only \xpackage{hyperref} with \pdfTeX\ in PDF
-% mode is supported.
-% \end{itemize}
-%
-% \subsection{Future}
-%
-% A more general approach is a PDF postprocessor that takes
-% a PDF file, performs some transformations and writes the
-% result in a more optimized PDF file. Then it does not depend,
-% how the original PDF file was generated and further improvements
-% are easier to apply. For example, the destination names could be sorted:
-% often used destination names would then be shorter than seldom used ones.
-%
-% \StopEventually{
-% }
-%
-% \section{Implementation}
-%
-% \subsection{Identification}
-%
-% \begin{macrocode}
-%<*package>
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{hypdestopt}%
- [2019/12/29 v2.6 Hyperref destination optimizer (HO)]%
-% \end{macrocode}
-%
-% \subsection{Options}
-%
-% \subsubsection{Option \xoption{verbose}}
-%
-% \begin{macrocode}
-\newif\ifHypDest@Verbose
-\DeclareOption{verbose}{\HypDest@Verbosetrue}
-% \end{macrocode}
-%
-% \begin{macro}{\HypDest@VerboseInfo}
-% Wrapper for verbose messages.
-% \begin{macrocode}
-\def\HypDest@VerboseInfo#1{%
- \ifHypDest@Verbose
- \PackageInfo{hypdestopt}{#1}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Options \xoption{num} and \xoption{name}}
-%
-% The options \xoption{num} or \xoption{name} specify
-% the method, how destinations are referenced (by name or
-% number). Default is option \xoption{num}.
-% \begin{macrocode}
-\newif\ifHypDest@name
-\DeclareOption{num}{\HypDest@namefalse}
-\DeclareOption{name}{\HypDest@nametrue}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ProcessOptions*\relax
-% \end{macrocode}
-%
-% \subsection{Check requirements}
-%
-% First \pdfTeX\ must running in PDF mode.
-% \begin{macrocode}
-\RequirePackage{iftex}[2019/11/07]
-\RequirePackage{pdftexcmds}[2007/11/11]
-\ifpdf
-\else
- \PackageError{hypdestopt}{%
- This package requires pdfTeX in PDF mode%
- }\@ehc
- \expandafter\endinput
-\fi
-% \end{macrocode}
-% The version of \pdfTeX\ must not be too old, because
-% \cs{pdfescapehex} and \cs{pdfunescapehex} are used.
-% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname pdf@escapehex\endcsname\relax
- \PackageError{hypdestopt}{%
- This pdfTeX is too old, at least 1.30.0 is required%
- }\@ehc
- \expandafter\endinput
-\fi
-% \end{macrocode}
-% Features of \eTeX\ are used, e.g. \cs{numexpr}.
-% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname numexpr\endcsname\relax
- \PackageError{hypdestopt}{%
- e-TeX features are missing%
- }\@ehc
- \expandafter\endinput
-\fi
-% \end{macrocode}
-% Package \xpackage{alphalph} provides \cs{newalphalph} since
-% version 2006/05/30 v1.4.
-% \begin{macrocode}
-\ifHypDest@name
- \RequirePackage{alphalph}[2006/05/30]%
-\fi
-% \end{macrocode}
-% \begin{macrocode}
-\RequirePackage{auxhook}[2009/12/14]
-\RequirePackage{pdfescape}[2007/04/21]
-% \end{macrocode}
-%
-% \subsection{Preamble for auxiliary file}
-%
-% Provide dummy definitions for the macros that are used in the
-% auxiliary files. If the package is used no longer, then these
-% commands will not generate errors.
-%
-% \begin{macro}{\HypDest@PrependDocument}
-% We add our stuff in front of the \cs{AtBeginDocument} hook
-% to ensure that we are before \xpackage{hyperref}'s stuff.
-% \begin{macrocode}
-\long\def\HypDest@PrependDocument#1{%
- \begingroup
- \toks\z@{#1}%
- \toks\tw@\expandafter{\@begindocumenthook}%
- \xdef\@begindocumenthook{\the\toks\z@\the\toks\tw@}%
- \endgroup
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-\AddLineBeginAux{%
- \string\providecommand{\string\HypDest@Use}[1]{}%
-}
-% \end{macrocode}
-%
-% \subsection{Generation of destination names}
-%
-% Counter |HypDest| is used for identifying destinations.
-% \begin{macrocode}
-\newcounter{HypDest}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ifHypDest@name
-% \end{macrocode}
-%
-% \begin{macro}{\HypDest@HexChar}
-% Destination names are generated by automatically
-% numbering with the help of package \xpackage{alphalph}.
-% \cs{HypDest@HexChar} converts a number of the range 1 until 252
-% into the hexadecimal representation of the string character.
-% \begin{macrocode}
- \def\HypDest@HexChar#1{%
- \ifcase#1\or
-% \end{macrocode}
-% Avoid zero byte because of C strings in PDF viewer
-% applications.
-% \begin{macrocode}
- 01\or 02\or 03\or 04\or 05\or 06\or 07\or
-% \end{macrocode}
-% Omit carriage return (13/\verb|^^0d|).
-% It needs quoting, otherwise it would be converted
-% to line feed (10/\verb|^^0a|).
-% \begin{macrocode}
- 08\or 09\or 0A\or 0B\or 0C\or 0E\or 0F\or
- 10\or 11\or 12\or 13\or 14\or 15\or 16\or 17\or
- 18\or 19\or 1A\or 1B\or 1C\or 1D\or 1E\or 1F\or
- 20\or 21\or 22\or 23\or 24\or 25\or 26\or 27\or
-% \end{macrocode}
-% Omit left and right parentheses (40/\verb|^^28|, 41/\verb|^^39|),
-% they need quoting in general.
-% \begin{macrocode}
- 2A\or 2B\or 2C\or 2D\or 2E\or 2F\or
- 30\or 31\or 32\or 33\or 34\or 35\or 36\or 37\or
- 38\or 39\or 3A\or 3B\or 3C\or 3D\or 3E\or 3F\or
- 40\or 41\or 42\or 43\or 44\or 45\or 46\or 47\or
- 48\or 49\or 4A\or 4B\or 4C\or 4D\or 4E\or 4F\or
- 50\or 51\or 52\or 53\or 54\or 55\or 56\or 57\or
-% \end{macrocode}
-% Omit backslash (92/\verb|^^5C|), it needs quoting.
-% \begin{macrocode}
- 58\or 59\or 5A\or 5B\or 5D\or 5E\or 5F\or
- 60\or 61\or 62\or 63\or 64\or 65\or 66\or 67\or
- 68\or 69\or 6A\or 6B\or 6C\or 6D\or 6E\or 6F\or
- 70\or 71\or 72\or 73\or 74\or 75\or 76\or 77\or
- 78\or 79\or 7A\or 7B\or 7C\or 7D\or 7E\or 7F\or
- 80\or 81\or 82\or 83\or 84\or 85\or 86\or 87\or
- 88\or 89\or 8A\or 8B\or 8C\or 8D\or 8E\or 8F\or
- 90\or 91\or 92\or 93\or 94\or 95\or 96\or 97\or
- 98\or 99\or 9A\or 9B\or 9C\or 9D\or 9E\or 9F\or
- A0\or A1\or A2\or A3\or A4\or A5\or A6\or A7\or
- A8\or A9\or AA\or AB\or AC\or AD\or AE\or AF\or
- B0\or B1\or B2\or B3\or B4\or B5\or B6\or B7\or
- B8\or B9\or BA\or BB\or BC\or BD\or BE\or BF\or
- C0\or C1\or C2\or C3\or C4\or C5\or C6\or C7\or
- C8\or C9\or CA\or CB\or CC\or CD\or CE\or CF\or
- D0\or D1\or D2\or D3\or D4\or D5\or D6\or D7\or
- D8\or D9\or DA\or DB\or DC\or DD\or DE\or DF\or
- E0\or E1\or E2\or E3\or E4\or E5\or E6\or E7\or
- E8\or E9\or EA\or EB\or EC\or ED\or EE\or EF\or
- F0\or F1\or F2\or F3\or F4\or F5\or F6\or F7\or
-% \end{macrocode}
-% Avoid 255 (0xFF) to get rid of a possible unicode
-% marker at the begin of the string.
-% \begin{macrocode}
- F8\or F9\or FA\or FB\or FC\or FD\or FE%
- \fi
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{HypDest@HexString}
-% Now package \xpackage{alphalph} comes into play.
-% \cs{HypDest@HexString} is defined and converts
-% a positive number into a string, given in hexadecimal
-% representation.
-% \begin{macrocode}
- \newalphalph\HypDest@HexString\HypDest@HexChar{250}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\theHypDest}
-% For use, the hexadecimal string is converted back.
-% \begin{macrocode}
- \renewcommand*{\theHypDest}{%
- \pdf@unescapehex{\HypDest@HexString{\value{HypDest}}}%
- }%
-% \end{macrocode}
-% \end{macro}
-%
-% With option \xoption{num} we use the number directly.
-% \begin{macrocode}
-\else
- \renewcommand*{\theHypDest}{%
- \number\value{HypDest}%
- }%
-\fi
-% \end{macrocode}
-%
-% \subsection{Assign destination names}
-%
-% \begin{macro}{\HypDest@Prefix}
-% The new destination names are remembered in macros whose names
-% start with prefix \cs{HypDest@Prefix}.
-% \begin{macrocode}
-\edef\HypDest@Prefix{HypDest\string:}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\HypDest@Use}
-% During the first read of the auxiliary files, the used destinations
-% get fresh generated short destination names. Also for the old
-% destination names we use the hexadecimal representation. That
-% avoid problems with arbitrary names.
-% \begin{macrocode}
-\def\HypDest@Use#1{%
- \begingroup
- \edef\x{%
- \expandafter\noexpand
- \csname\HypDest@Prefix\pdf@unescapehex{#1}\endcsname
- }%
- \expandafter\ifx\x\relax
- \stepcounter{HypDest}%
- \expandafter\xdef\x{\theHypDest}%
- \let\on@line\@empty
- \ifHypDest@name
- \HypDest@VerboseInfo{%
- Use: (\pdf@unescapehex{#1}) -\string> %
- 0x\pdf@escapehex{\x} (\number\value{HypDest})%
- }%
- \else
- \HypDest@VerboseInfo{%
- Use: (\pdf@unescapehex{#1}) -\string> num \x
- }%
- \fi
- \fi
- \endgroup
-}
-% \end{macrocode}
-% \end{macro}
-%
-% After the first \xfile{.aux} file processing the destination names
-% are assigned and we can disable \cs{HypDest@Use}.
-% \begin{macrocode}
-\AtBeginDocument{%
- \let\HypDest@Use\@gobble
-}
-% \end{macrocode}
-%
-% \begin{macro}{\HypDest@MarkUsed}
-% Destinations that are actually used are marked by \cs{HypDest@MarkUsed}.
-% \cs{nofiles} is respected.
-% \begin{macrocode}
-\def\HypDest@MarkUsed#1{%
- \HypDest@VerboseInfo{%
- MarkUsed: (#1)%
- }%
- \if@filesw
- \immediate\write\@auxout{%
- \string\HypDest@Use{\pdf@escapehex{#1}}%
- }%
- \fi
-}%
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Redefinition of \xpackage{hyperref}'s hooks}
-%
-% Package \xpackage{hyperref} can be loaded later, therefore
-% we redefine \xpackage{hyperref}'s macros at |\begin{document}|.
-% \begin{macrocode}
-\HypDest@PrependDocument{%
-% \end{macrocode}
-%
-% Check hyperref version.
-% \begin{macrocode}
- \@ifpackagelater{hyperref}{2006/06/01}{}{%
- \PackageError{hypdestopt}{%
- hyperref 2006/06/01 v6.75a or later is required%
- }\@ehc
- }%
-% \end{macrocode}
-%
-% \subsubsection{Destination setting}
-%
-% luatex compatibility
-% \begin{macrocode}
-\ifx\pdfextension\@undefined\else
- \protected\def\pdfdest{\pdfextension dest }
-\fi
-% \end{macrocode}
-% \begin{macrocode}
- \ifHypDest@name
- \let\HypDest@Org@DestName\Hy@DestName
- \renewcommand*{\Hy@DestName}[2]{%
- \EdefUnescapeString\HypDest@temp{#1}%
- \@ifundefined{\HypDest@Prefix\HypDest@temp}{%
- \HypDest@VerboseInfo{%
- DestName: (\HypDest@temp) unused%
- }%
- }{%
- \HypDest@Org@DestName{%
- \csname\HypDest@Prefix\HypDest@temp\endcsname
- }{#2}%
- \HypDest@VerboseInfo{%
- DestName: (\HypDest@temp) %
- 0x\pdf@escapehex{%
- \csname\HypDest@Prefix\HypDest@temp\endcsname
- }%
- }%
- }%
- }%
- \else
- \renewcommand*{\Hy@DestName}[2]{%
- \EdefUnescapeString\HypDest@temp{#1}%
- \@ifundefined{\HypDest@Prefix\HypDest@temp}{%
- \HypDest@VerboseInfo{%
- DestName: (\HypDest@temp) unused%
- }%
- }{%
- \pdfdest num%
- \csname\HypDest@Prefix\HypDest@temp\endcsname#2\relax
- \HypDest@VerboseInfo{%
- DestName: (\HypDest@temp) %
- num \csname\HypDest@Prefix\HypDest@temp\endcsname
- }%
- }%
- }%
- \fi
-% \end{macrocode}
-%
-% \subsubsection{Links}
-%
-% \begin{macrocode}
- \let\HypDest@Org@StartlinkName\Hy@StartlinkName
- \ifHypDest@name
- \renewcommand*{\Hy@StartlinkName}[2]{%
- \HypDest@MarkUsed{#2}%
- \HypDest@Org@StartlinkName{#1}{%
- \@ifundefined{\HypDest@Prefix#2}{%
- #2%
- }{%
- \csname\HypDest@Prefix#2\endcsname
- }%
- }%
- }%
- \else
- \renewcommand*{\Hy@StartlinkName}[2]{%
- \HypDest@MarkUsed{#2}%
- \@ifundefined{\HypDest@Prefix#2}{%
- \HypDest@Org@StartlinkName{#1}{#2}%
- }{%
- \pdfstartlink attr{#1}%
- goto num\csname\HypDest@Prefix#2\endcsname
- \relax
- }%
- }%
- \fi
-% \end{macrocode}
-%
-% \subsubsection{Outlines of package \xpackage{hyperref}}
-%
-% \begin{macrocode}
- \let\HypDest@Org@OutlineName\Hy@OutlineName
- \ifHypDest@name
- \renewcommand*{\Hy@OutlineName}[4]{%
- \HypDest@Org@OutlineName{#1}{%
- \@ifundefined{\HypDest@Prefix#2}{%
- #2%
- }{%
- \csname\HypDest@Prefix#2\endcsname
- }%
- }{#3}{#4}%
- }%
- \else
- \renewcommand*{\Hy@OutlineName}[4]{%
- \@ifundefined{\HypDest@Prefix#2}{%
- \HypDest@Org@OutlineName{#1}{#2}{#3}{#4}%
- }{%
- \pdfoutline goto num\csname\HypDest@Prefix#2\endcsname
- count#3{#4}%
- }%
- }%
- \fi
-% \end{macrocode}
-% Because \cs{Hy@OutlineName} is called after the \xfile{.out} file
-% is written in the previous run. Therefore we mark the destination
-% earlier in \cs{@@writetorep}.
-% \begin{macrocode}
- \let\HypDest@Org@@writetorep\@@writetorep
- \renewcommand*{\@@writetorep}[5]{%
- \begingroup
- \edef\Hy@tempa{#5}%
- \ifx\Hy@tempa\Hy@bookmarkstype
- \HypDest@MarkUsed{#3}%
- \fi
- \endgroup
- \HypDest@Org@@writetorep{#1}{#2}{#3}{#4}{#5}%
- }%
-% \end{macrocode}
-%
-% \subsubsection{Outlines of package \xpackage{bookmark}}
-%
-% \begin{macrocode}
- \@ifpackageloaded{bookmark}{%
- \@ifpackagelater{bookmark}{2008/08/08}{%
- \renewcommand*{\BKM@DefGotoNameAction}[2]{%
- \@ifundefined{\HypDest@Prefix#2}{%
- \edef#1{goto name{hypdestopt\string :unknown}}%
- }{%
- \ifHypDest@name
- \edef#1{goto name{\csname\HypDest@Prefix#2\endcsname}}%
- \else
- \edef#1{goto num\csname\HypDest@Prefix#2\endcsname}%
- \fi
- }%
- }%
- \def\BKM@HypDestOptHook{%
- \ifx\BKM@dest\@empty
- \else
- \ifx\BKM@gotor\@empty
- \HypDest@MarkUsed\BKM@dest
- \fi
- \fi
- }%
- }{%
- \@PackageError{hypdestopt}{%
- Package `bookmark' is too old.\MessageBreak
- Version 2008/08/08 or later is needed%
- }\@ehc
- }%
- }{}%
-% \end{macrocode}
-%
-% \begin{macrocode}
-}
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-%</package>
-% \end{macrocode}
-%
-% \section{Installation}
-%
-% \subsection{Download}
-%
-% \paragraph{Package.} This package is available on
-% CTAN\footnote{\CTANpkg{hypdestopt}}:
-% \begin{description}
-% \item[\CTAN{macros/latex/contrib/oberdiek/hypdestopt.dtx}] The source file.
-% \item[\CTAN{macros/latex/contrib/oberdiek/hypdestopt.pdf}] Documentation.
-% \end{description}
-%
-%
-% \paragraph{Bundle.} All the packages of the bundle `oberdiek'
-% are also available in a TDS compliant ZIP archive. There
-% the packages are already unpacked and the documentation files
-% are generated. The files and directories obey the TDS standard.
-% \begin{description}
-% \item[\CTANinstall{install/macros/latex/contrib/oberdiek.tds.zip}]
-% \end{description}
-% \emph{TDS} refers to the standard ``A Directory Structure
-% for \TeX\ Files'' (\CTANpkg{tds}). Directories
-% with \xfile{texmf} in their name are usually organized this way.
-%
-% \subsection{Bundle installation}
-%
-% \paragraph{Unpacking.} Unpack the \xfile{oberdiek.tds.zip} in the
-% TDS tree (also known as \xfile{texmf} tree) of your choice.
-% Example (linux):
-% \begin{quote}
-% |unzip oberdiek.tds.zip -d ~/texmf|
-% \end{quote}
-%
-% \subsection{Package installation}
-%
-% \paragraph{Unpacking.} The \xfile{.dtx} file is a self-extracting
-% \docstrip\ archive. The files are extracted by running the
-% \xfile{.dtx} through \plainTeX:
-% \begin{quote}
-% \verb|tex hypdestopt.dtx|
-% \end{quote}
-%
-% \paragraph{TDS.} Now the different files must be moved into
-% the different directories in your installation TDS tree
-% (also known as \xfile{texmf} tree):
-% \begin{quote}
-% \def\t{^^A
-% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
-% hypdestopt.sty & tex/latex/oberdiek/hypdestopt.sty\\
-% hypdestopt.pdf & doc/latex/oberdiek/hypdestopt.pdf\\
-% hypdestopt.dtx & source/latex/oberdiek/hypdestopt.dtx\\
-% \end{tabular}^^A
-% }^^A
-% \sbox0{\t}^^A
-% \ifdim\wd0>\linewidth
-% \begingroup
-% \advance\linewidth by\leftmargin
-% \advance\linewidth by\rightmargin
-% \edef\x{\endgroup
-% \def\noexpand\lw{\the\linewidth}^^A
-% }\x
-% \def\lwbox{^^A
-% \leavevmode
-% \hbox to \linewidth{^^A
-% \kern-\leftmargin\relax
-% \hss
-% \usebox0
-% \hss
-% \kern-\rightmargin\relax
-% }^^A
-% }^^A
-% \ifdim\wd0>\lw
-% \sbox0{\small\t}^^A
-% \ifdim\wd0>\linewidth
-% \ifdim\wd0>\lw
-% \sbox0{\footnotesize\t}^^A
-% \ifdim\wd0>\linewidth
-% \ifdim\wd0>\lw
-% \sbox0{\scriptsize\t}^^A
-% \ifdim\wd0>\linewidth
-% \ifdim\wd0>\lw
-% \sbox0{\tiny\t}^^A
-% \ifdim\wd0>\linewidth
-% \lwbox
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \end{quote}
-% If you have a \xfile{docstrip.cfg} that configures and enables \docstrip's
-% TDS installing feature, then some files can already be in the right
-% place, see the documentation of \docstrip.
-%
-% \subsection{Refresh file name databases}
-%
-% If your \TeX~distribution
-% (\TeX\,Live, \mikTeX, \dots) relies on file name databases, you must refresh
-% these. For example, \TeX\,Live\ users run \verb|texhash| or
-% \verb|mktexlsr|.
-%
-% \subsection{Some details for the interested}
-%
-% \paragraph{Unpacking with \LaTeX.}
-% The \xfile{.dtx} chooses its action depending on the format:
-% \begin{description}
-% \item[\plainTeX:] Run \docstrip\ and extract the files.
-% \item[\LaTeX:] Generate the documentation.
-% \end{description}
-% If you insist on using \LaTeX\ for \docstrip\ (really,
-% \docstrip\ does not need \LaTeX), then inform the autodetect routine
-% about your intention:
-% \begin{quote}
-% \verb|latex \let\install=y\input{hypdestopt.dtx}|
-% \end{quote}
-% Do not forget to quote the argument according to the demands
-% of your shell.
-%
-% \paragraph{Generating the documentation.}
-% You can use both the \xfile{.dtx} or the \xfile{.drv} to generate
-% the documentation. The process can be configured by the
-% configuration file \xfile{ltxdoc.cfg}. For instance, put this
-% line into this file, if you want to have A4 as paper format:
-% \begin{quote}
-% \verb|\PassOptionsToClass{a4paper}{article}|
-% \end{quote}
-% An example follows how to generate the
-% documentation with pdf\LaTeX:
-% \begin{quote}
-%\begin{verbatim}
-%pdflatex hypdestopt.dtx
-%makeindex -s gind.ist hypdestopt.idx
-%pdflatex hypdestopt.dtx
-%makeindex -s gind.ist hypdestopt.idx
-%pdflatex hypdestopt.dtx
-%\end{verbatim}
-% \end{quote}
-%
-% \begin{thebibliography}{9}
-%
-% \bibitem{alphalph}
-% Heiko Oberdiek: \textit{The \xpackage{alphalph} package};
-% 2006/05/30 v1.4;
-% \CTANpkg{alphalph}.
-%
-% \bibitem{hyperref}
-% Sebastian Rahtz, Heiko Oberdiek:
-% \textit{The \xpackage{hyperref} package};
-% 2006/06/01 v6.75a;
-% \CTANpkg{hyperref}.
-%
-% \end{thebibliography}
-%
-% \begin{History}
-% \begin{Version}{2006/06/01 v1.0}
-% \item
-% First version.
-% \end{Version}
-% \begin{Version}{2006/06/01 v2.0}
-% \item
-% New method for referencing destinations by number; an idea
-% proposed by Lars Hellstr\"om in the mailing list LATEX-L.
-% \item
-% Options \xoption{name} and \xoption{num} added.
-% \end{Version}
-% \begin{Version}{2007/11/11 v2.1}
-% \item
-% Use of package \xpackage{pdftexcmds} for \LuaTeX\ support.
-% \end{Version}
-% \begin{Version}{2008/08/08 v2.2}
-% \item
-% Support for package \xpackage{bookmark} added.
-% \end{Version}
-% \begin{Version}{2011/05/13 v2.3}
-% \item
-% Fix for \cs{Hy@DestName} if the destination name contains
-% special characters.
-% \item
-% Fix for option \xoption{name} and package \xpackage{bookmark}.
-% \end{Version}
-% \begin{Version}{2016/05/16 v2.4}
-% \item
-% Documentation updates.
-% \end{Version}
-% \begin{Version}{2016/05/21 v2.5}
-% \item
-% LuaTeX compatibility
-% \end{Version}
-% \begin{Version}{2019/12/29 v2.6}
-% \item
-% use \xpackage{iftex} package.
-% \end{Version}
-% \end{History}
-%
-% \PrintIndex
-%
-% \Finale
-\endinput
diff --git a/Master/texmf-dist/source/latex/oberdiek/oberdiek.ins b/Master/texmf-dist/source/latex/oberdiek/oberdiek.ins
index 66a26e2564c..8914f4a7e5f 100644
--- a/Master/texmf-dist/source/latex/oberdiek/oberdiek.ins
+++ b/Master/texmf-dist/source/latex/oberdiek/oberdiek.ins
@@ -1,9 +1,9 @@
% oberdiek.ins
-% 2019/12/29
+% 2020/08/01
%
% Copyright (C)
% 1999, 2001, 2006 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
+% 2016-2020 Oberdiek Package Support Group
% https://github.com/ho-tex/oberdiek/issues
%
% This work may be distributed and/or modified under the
@@ -39,17 +39,14 @@
\batchinput{fibnum.dtx}
\batchinput{flags.dtx}
\batchinput{holtxdoc.dtx}
-\batchinput{hopatch.dtx}
\batchinput{hypbmsec.dtx}
\batchinput{hypcap.dtx}
-\batchinput{hypdestopt.dtx}
\batchinput{hypdoc.dtx}
\batchinput{hypgotoe.dtx}
\batchinput{hyphsubst.dtx}
\batchinput{ifdraft.dtx}
\batchinput{iflang.dtx}
\batchinput{pagegrid.dtx}
-\batchinput{pagesel.dtx}
\batchinput{pdfcol.dtx}
\batchinput{pdfcolfoot.dtx}
\batchinput{pdfcolparallel.dtx}
diff --git a/Master/texmf-dist/source/latex/oberdiek/oberdiek.tex b/Master/texmf-dist/source/latex/oberdiek/oberdiek.tex
index 929efdb784c..9b7cb6857f6 100644
--- a/Master/texmf-dist/source/latex/oberdiek/oberdiek.tex
+++ b/Master/texmf-dist/source/latex/oberdiek/oberdiek.tex
@@ -10,11 +10,11 @@
\newcommand*{\Author}{Heiko Oberdiek}
\newcommand*{\Email}{ho-tex at tug.org}
-\newcommand*{\Date}{2019/12/29}
+\newcommand*{\Date}{2020/09/02}
% Copyright (C) 2006-2016 by
% Heiko Oberdiek
-% Copyright (C) 2016-2019 by
+% Copyright (C) 2016-2020 by
% Oberdiek Package Support Group
%
% This work may be distributed and/or modified under the
@@ -200,14 +200,10 @@
[\entrysep]
\entry{holtxdoc}{Private additional ltxdoc support}%
[\entrysep]
-\entry{hopatch}{Wrapper for package hooks}%
-[\entrysep]
\entry{hypbmsec}{Bookmarks in sectioning commands}%
[\entrysep]
\entry{hypcap}{Adjusting the anchors of captions}%
[\entrysep]
-\entry{hypdestopt}{Hyperref destination optimizer}%
-[\entrysep]
\entry{hypdoc}{Hyper extensions for doc.sty}%
[\entrysep]
\entry{hypgotoe}{Links to embedded files}%
@@ -220,8 +216,6 @@
[\entrysep]
\entry{pagegrid}{Print page grid in background}%
[\entrysep]
-\entry{pagesel}{Select pages of a document for output}%
-[\entrysep]
\entry{pdfcol}{Handle new color stacks for \hologo{pdfTeX}}%
[\entrysep]
\entry{pdfcolfoot}{Color stack for footnotes with \hologo{pdfTeX}}%
@@ -396,16 +390,6 @@ that may be useful for others in package \xpackage{hypdoc}.
\tocinclude{holtxdoc}
\newpage
-\subsection{\pkgsectformat{hopatch}}
-\label{hopatch}
-\begin{abstract}
-This packages provides a wrapper to various package hooks
-provided by other packages or classes, but does not define
-own hooks.
-\end{abstract}
-\tocinclude{hopatch}
-
-\newpage
\subsection{\pkgsectformat{hypbmsec}}
\label{hypbmsec}
\begin{abstract}
@@ -430,17 +414,6 @@ the rest in the \cs{caption} command.
\tocinclude{hypcap}
\newpage
-\subsection{\pkgsectformat{hypdestopt}}
-\label{hypdestopt}
-\begin{abstract}
-Package \xpackage{hypdestopt} supports \xpackage{hyperref}'s
-\xoption{pdftex} driver. It removes unnecessary destinations
-and shortens the destination names or uses numbered destinations
-to get smaller PDF files.
-\end{abstract}
-\tocinclude{hypdestopt}
-
-\newpage
\subsection{\pkgsectformat{hypdoc}}
\label{hypdoc}
\begin{abstract}
@@ -498,14 +471,6 @@ The \LaTeX\ package prints a page grid in the background.
\tocinclude{pagegrid}
\newpage
-\subsection{\pkgsectformat{pagesel}}
-\label{pagesel}
-\begin{abstract}
-Single pages or page areas can be selected for output.
-\end{abstract}
-\tocinclude{pagesel}
-
-\newpage
\subsection{\pkgsectformat{pdfcol}}
\label{pdfcol}
\begin{abstract}
diff --git a/Master/texmf-dist/source/latex/oops/oops.dtx b/Master/texmf-dist/source/latex/oops/oops.dtx
deleted file mode 100644
index bc79a5dea82..00000000000
--- a/Master/texmf-dist/source/latex/oops/oops.dtx
+++ /dev/null
@@ -1,789 +0,0 @@
-% \iffalse meta-comment
-% !TEX program = pdfLaTeX
-%<*internal>
-\iffalse
-%</internal>
-%<*readme>
-----------------------------------------------------------------
-#### oops --- An object oriented practical scribe's package,
-#### typically for typesetting math
-- Source repository: https://github.com/rogard/oops
-- Released under the LaTeX Project Public License v1.3c or later
-- See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
-%</readme>
-%<*internal>
-\fi
-\def\nameofplainTeX{plain}
-\ifx\fmtname\nameofplainTeX\else
-\expandafter\begingroup
-\fi
-%</internal>
-%<*install>
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-\preamble
-----------------------------------------------------------------
-oops --- An object oriented practical scribe's package,
-typically for typesetting math
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
-\endpreamble
-\postamble
-
-Copyright (C) 2020 by Erwann Rogard
-
-This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License (LPPL), either
-version 1.3c of this license or (at your option) any later
-version. The latest version of this license is in the file:
-
-http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
-Erwann Rogard.
-
-This work consists of the file oops.dtx
-and the derived files oops.ins,
-oops.pdf and
-oops.sty.
-
-\endpostamble
-\generate{
- \file{\jobname.sty}{\from{\jobname.dtx}{package}}
-}
-%</install>
-%<install> \endbatchfile
-%<*internal>
-\generate{
- \file{\jobname.ins}{\from{\jobname.dtx}{install}}
-}
-\nopreamble\nopostamble
-\generate{
- \file{README.txt}{\from{\jobname.dtx}{readme}}
-}
-\nopreamble\nopostamble
-\generate{
- \file{README.md}{\from{\jobname.dtx}{readme}}
-}
-\ifx\fmtname\nameofplainTeX
-\expandafter\endbatchfile
-\else
-\expandafter\endgroup
-\fi
-%</internal>
-%<package> \RequirePackage{xparse}[2019/05/28]
-%<package> \ProvidesExplPackage
-%<package> {oops} % Package name
-%<package> {2020/03/11} % Release date
-%<package> {1.0} % Release version
-%<package> {An object oriented practical scribe's package} % Description
-%
-%<*driver>
-\documentclass[full]{l3doc}
-\usepackage{oops}
-\usepackage{tcolorbox}
-\tcbuselibrary{listings,breakable}
-\ExplSyntaxOn
-\tl_gset:Nn \partname {Part}
-\ExplSyntaxOff
-\EnableCrossrefs
-\CodelineIndex
-\RecordChanges
-% \AtEndDocument { \PrintChanges \PrintIndex } % TODO
-\providecommand\pkgdata{\texttt{\meta{data}}}
-\providecommand\pkgoptions{\texttt{\meta{kvl0}}}
-\providecommand\pkgkey{\dockey{Key}}
-\providecommand\pkgvalue{\dockey{Value}}
-\providecommand\pkggenobjdefault{\texttt{Math}}
-\providecommand\pkgobj[1]{object identified by #1}
-\providecommand\pkgsep[1]{\docmarg{\texttt{#1}}}
-\providecommand\pkgargobj{\texttt{\meta{tl1}}}
-\providecommand\pkgargexpi{\texttt{\meta{tl2}}}
-\providecommand\pkgarginneri{\texttt{\meta{code1}}}
-\providecommand\pkgargsep{\texttt{\pkgsep{\meta{tl3}}\pkgsep{\meta{tl4}}\pkgsep{\meta{tl5}}}}
-\providecommand\pkgargouter{\texttt{\meta{code2}}}
-\providecommand\pkgargdefi{\texttt{\meta{kvl1}}}
-\providecommand\pkgarginnerii{\texttt{\meta{code3}}}
-\providecommand\pkgargdefii{\texttt{\meta{kvl2}}}
-\providecommand\pkgargexpii{\texttt{\meta{tl6}}}
-\providecommand\docConv[1]{Convention~\ref{#1}}
-\providecommand\docconv[1]{convention~\ref{#1}}
-\providecommand\docmarg[1]{\texttt{\char`\{#1\char`\}}}
-\providecommand\docopto[1]{\texttt{[}#1\texttt{]}}
-\providecommand\docopte[2]{#1\docmarg{#2}}
-\providecommand\docinlcode{\textit{inline code}}
-\providecommand\docInlcode{\textit{Inline code}}
-\providecommand\docbody{\textit{body}}
-\providecommand\docemptyarg{\textit{empty}}
-\providecommand\dockey[1]{\texttt{#1}}
-\providecommand\dockeyval[2]{\texttt{#1=#2}}
-\providecommand\docnovalue{\textit{no value}}
-\providecommand\docpreamb{\textit{preamble}}
-\providecommand\doctl{\textit{token list}}
-\providecommand\docTl{\textit{Token list}}
-\providecommand\dockvl{\textit{keyval list}}
-\providecommand\docKvl{\textit{Keyval list}}
-\providecommand\dockl{\textit{key list}}
-\providecommand\doclist[1]{Listing~\autoref{listing:#1}}
-\begin{document}
-\DocInput{\jobname.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \GetFileInfo{\jobname.sty}
-%
-%
-% \title{^^A
-% \pkg{oops}, an object oriented practical scribe's package.\thanks{^^A
-% This file describes version \fileversion, last revised \filedate.^^A
-% }^^A
-% }
-% \author{Erwann Rogard\thanks{firstname dot lastname AusTria gmail dot com}}
-%
-% \date{Released \filedate}
-%
-% \maketitle
-%
-% \begin{abstract}\pkg{oops}~is a package for \LaTeX~(hence ``scribe'') that organizes (typically mathematical) definitions
-% along two dimensions: functions and objects, hence ``OO''. Such definitions are made \textit{inline} thanks to a minimalist interface built upon \pkg{xparse}\cite{xparse}. To make a definition, use \cs{OopsNew}\docmarg{\pkgargobj}, where \pkgargobj~identifies an object, followed by input that alternates between `text' and instructions.
-% The latter create and expand definitions using rules that can be modified at the package level or themselves inline.
-% This framework is suitable for instance where \pkgargobj~ is either of \texttt{ModelA} and \texttt{ModelB},
-% and each requires its own definition of, say, a \textit{space}. In this case, they would be encoded respectively as \cs{Space}\docmarg{\texttt{ModelA}} and \cs{Space}\docmarg{\texttt{ModelB}}. However, this would be verbose if most functions applied to just one object, so the package provides a generic one that is set by default to \pkggenobjdefault. For example, \verb|\OopsNew{Math}[Let~]{Space=\Omega}[~denote the sample space]{}|, followed by \verb|$\Space$|, expand to:
-% ``\OopsNew{Math}[Let~]{Space=\Omega}[~denote the sample space]{}'' and ``$\Space$''.
-% Other features automate repetitive formatting tasks. Altogether, ``practical''.
-% \end{abstract}
-%
-% \tableofcontents
-%
-% \part{Usage}\label{part:usage}
-%
-% \addtocounter{section}{1}
-% \addcontentsline{toc}{section}{\protect\numberline{\thesection}Convention}
-% \section*{Convention}%\label{usage:conv}
-%
-% \begin{enumerate}[label=\alph*)]
-% \item By default, all commands are declared in the \docbody~of \cs{documentclass}.
-% \item Arguments expecting a \doctl\cite{tex.stack:104023}, \dockvl\cite[l3keys]{interface3}, a character, and \docinlcode, are denoted respectively
-% \meta{tl}, \meta{kvl}, \meta{char}, and \meta{code}.
-% \item \marg{arg} is either \texttt{m} or \texttt{g} options\cite{xparse}, and \docopto{\meta{arg}} and \docopte{\meta{char}}{\meta{arg}} are \texttt{o} and \texttt{e} options\cite{xparse}.
-% \item If we say that \meta{option} can be used to override \meta{default}, and \meta{option} is \docnovalue\cite{xparse}, we will treat it as though \meta{option}$=$\meta{default}.
-% \item We say ``set the key to'' as shorthand for ``set the value associated with the key to''
-% \item We call \cs{code}\marg{arg}, \meta{code} with \verb|#1| replaced by \marg{arg}
-% \end{enumerate}
-%
-% The template for the description of functions and arguments is, where applicable:
-% \begin{description}
-% \item[Use it to]
-% \item[Requirement]
-% \item[Side effect]
-% \item[Expands to]
-% \item[Default]
-% \item[Example]
-% \item[Other]
-% \end{description}Only the items that cannot be deduced from other information, are given. For instance, the requirement that \pkgargobj~be a \doctl~is ommited.
-%
-%
-% \addtocounter{section}{1}
-% \addcontentsline{toc}{section}{\protect\numberline{\thesection}Loading the package}
-%
-% \begin{function}{\usepackage}
-% \begin{syntax}
-% \cs{usepackage}\docopto{\pkgoptions}\docmarg{\pkg{oops}}
-% \end{syntax}
-% \begin{description}
-% \item[Use it to] Load the package
-% \item[Requirement]\begin{enumerate}
-% \item \file{oops.sty} is in the path of the \LaTeX~engine. See \autoref{part:other}, \autoref{other:support}.
-% \item Declared in the \docpreamb~of \cs{documentclass}
-% \end{enumerate}
-% \item[Side effect] That of \cs{OopsOptions}\docmarg{\pkgoptions}
-% \end{description}
-% \end{function}
-%
-% \addtocounter{section}{1}
-% \addcontentsline{toc}{section}{\protect\numberline{\thesection}\cs{OopsOptions}}
-% \begin{function}{\OopsOptions}
-% \begin{syntax}
-% \cs{OopsOptions}\docmarg{\pkgoptions}
-% \end{syntax}
-% \begin{description}
-% \item[Use it to] Set default options for \cs{OopsNew}
-% \item[Other] Also works in the \docpreamb
-% \end{description}
-% \end{function}
-%
-% \DescribeOption{\meta{kvl}}
-% \begin{description}
-% \item[Requirement] Keys listed below.
-% \end{description}
-%
-% \addtocounter{subsection}{1}
-% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\dockey{GenericObject}}
-% \DescribeOption{GenericObject}
-% \begin{description}
-% \item[Requirement] See \cs{OopsNew}, \pkgargobj
-% \item[Default] \verb|Math|
-% \end{description}
-%
-% \addtocounter{subsection}{1}
-% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\dockey{Inner}}
-% \DescribeOption{Inner}
-% \begin{description}
-% \item[Requirement] See \cs{OopsNew}, \pkgarginneri
-% \item[Default] \verb|{#1}|
-% \end{description}
-%
-% \addtocounter{subsection}{1}
-% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\dockey{Separators}}
-% \DescribeOption{Separators}
-% \begin{description}
-% \item[Requirement] See \cite[Section 8 of \pkg{l3seq}]{interface3}
-% \item[Default] \verb|{\text{~and~}{\text{,~}}{\text{,~and~}}|
-% \end{description}
-%
-% \addtocounter{subsection}{1}
-% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\dockey{Outer}}
-% \DescribeOption{Outer}
-% \begin{description}
-% \item[Requirement] See \cs{OopsNew}, \pkgargouter
-% \item[Default] \verb|\ensuremath{#1}|
-% \end{description}
-%
-% \addtocounter{section}{1}
-% \addcontentsline{toc}{section}{\protect\numberline{\thesection}\cs{OopsClear}}
-% \begin{function}{\OopsClear}
-% \begin{syntax}
-% \cs{OopsClear}\docmarg{\pkgargobj}
-% \end{syntax}
-% \end{function}
-%
-% \begin{description}
-% \item[Side effect] Clears \pkgargobj~of any \pkgdata
-% \end{description}
-%
-% \addtocounter{section}{1}
-% \addcontentsline{toc}{section}{\protect\numberline{\thesection}\cs{OopsNew}}
-% \setcounter{subsection}{0}
-% \begin{function}{\OopsNew}
-% \begin{syntax}
-% \cs{OopsNew}\docmarg{\pkgargobj}
-% \docopto{\pkgargexpi}
-% \docopte{i}{\pkgarginneri}
-% \docopte{s}{\pkgargsep}
-% \docopte{o}{\pkgargouter}
-% \docmarg{\pkgargdefi}
-% \docopte{i}{\pkgarginnerii}
-% \docmarg{\pkgargdefii}
-% \docopto{\pkgargexpii}
-% \end{syntax}
-% \begin{description}
-% \item[Requirement] Only \pkgargobj~and \pkgargdefi~are mandatory
-% \end{description}
-% \end{function}
-%
-% \addtocounter{subsection}{1}
-% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docmarg{\pkgargobj}}
-% \DescribeOption{\pkgargobj}
-%
-% \begin{description}
-% \item[Use it to] Identify an object
-% \item[Side effect] Registers \pkgargobj~ as a new object, if applicable
-% \item[Example] \pkggenobjdefault, \verb|ModelA|, \verb|ModelB|
-% \end{description}
-%
-% \addtocounter{subsection}{1}
-% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docopto{\pkgargexpi}}
-% \DescribeOption{\pkgargexpi}
-%
-% \begin{description}
-% \item[Use it to] Bring about a definition
-% \item[Expands to] \pkgargexpi
-% \item[Example]\verb|Let~|
-% \end{description}
-%
-% \addtocounter{subsection}{1}
-% \phantomsection\addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docopte{i}{\pkgarginneri}}
-% \DescribeOption{\pkgarginneri}
-%
-% \begin{description}
-% \item[Use it to] Override \dockey{Inner}.
-% \item[Example] \verb|\mathbb{#1}|
-% \end{description}
-%
-% \addtocounter{subsection}{1}
-% \phantomsection\addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docopte{s}{\pkgargsep}}
-% \DescribeOption{\pkgargsep}
-%
-% \begin{description}
-% \item[Use it to] Override \dockey{Separators}
-% \item[Example] \verb|{~\&~}{,~}{~\&~}|
-% \end{description}
-%
-% \addtocounter{subsection}{1}
-% \phantomsection\addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docopte{o}{\pkgargouter}}
-% \DescribeOption{\pkgargouter}
-%
-% \begin{description}
-% \item[Use it to] Override \dockey{Outer}
-% \item[Example] \verb|\text{#1}|
-% \end{description}
-%
-% \addtocounter{subsection}{1}
-% \phantomsection\addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docmarg{\pkgargdefi}}
-% \DescribeOption{\pkgargdefi}
-%
-% \begin{description}
-% \item[Side effect] If \pkgkey~is a new key, attaches to it \pkgdata=\cs{\pkgarginneri}\docmarg{\pkgvalue}
-% \item[Expands to] If \pkgargexpi~is \docnovalue, none, otherwise,
-% \begin{enumerate}
-% \item
-% For each \pkgkey, calls \cs{\pkgkey}\pkgargobj. Call it \meta{seq}.
-% \item
-% Concatenates \meta{seq} using \pkgargsep. Call it \meta{tmp}.
-% \item Expands \cs{\pkgargouter}\marg{tmp}
-% \end{enumerate}
-% \item[Example] \verb|Sample=\Omega|
-% \end{description}
-%
-% The remaining options taken together forward to:
-%
-% \cs{OopsNew}\docmarg{\pkgargobj}
-% \docopte{o}{\pkgarginnerii}
-% \docmarg{\pkgargdefii}
-% \docopto{\pkgargexpii}
-%
-% \addtocounter{subsection}{1}
-% \phantomsection\addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docopte{i}{\pkgarginnerii}}
-% \DescribeOption{\pkgarginnerii}
-%
-% \addtocounter{subsection}{1}
-% \phantomsection\addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docmarg{\pkgargdefii}}
-% \DescribeOption{\pkgargdefii}
-%
-% \addtocounter{subsection}{1}
-% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docopto{\pkgargexpii}}
-% \DescribeOption{\pkgargexpii}
-%
-% \addtocounter{section}{1}
-% \addcontentsline{toc}{section}{\protect\numberline{\thesection}\cs{\meta{Key}}}
-% \setcounter{subsection}{0}
-%
-% \begin{function}{\<Key>}
-% \begin{syntax}
-% \cs{\meta{Key}}\docopto{\pkgargobj}
-% \end{syntax}
-% \begin{description}
-% \item[Side effect] Expands to \pkgdata~associated with \pkgargobj~and \dockey{\meta{Key}}, if applicable.
-% \end{description}
-% \end{function}
-%
-% \clearpage
-% \part{Listings}\label{part:listing}
-%
-% \newtcblisting[auto counter]
-% {listing}[2][]{
-% noparskip,
-% breakable,
-% colback=white,
-% colframe=black,
-% opacitybacktitle=.8,%
-% fonttitle=\bfseries,
-% title=Listing~\thetcbcounter. #1,
-% arc=0pt,
-% outer arc=0pt,
-% boxrule=1pt,
-% #2
-% }
-%
-% \phantomsection\addcontentsline{toc}{section}{\doclist{options:i}.}
-% \begin{listing}[]
-% {label=listing:options:i}
-% \OopsOptions
-% {
-% Inner = {#1},
-% Outer = {#1}
-% }
-% \end{listing}
-%
-% \phantomsection\addcontentsline{toc}{section}{\doclist{foo:i}.}
-% \begin{listing}[]{label=listing:foo:i}
-% \OopsNew{Foo}{ Barr = { a }, Baz = { b } }{ Qux = { c } }
-% \textless(\Barr[Foo]), (\Baz[Foo]) \& (\Qux[Foo])\textgreater
-% \end{listing}
-%
-% \phantomsection\addcontentsline{toc}{section}{\doclist{foo:ii}.}
-% \begin{listing}[]{label=listing:foo:ii}
-% \OopsNew{Foo}[]i{(#1)}s{{~\&~}{,~}{~\&~}}o{\textless#1\textgreater}{ Barr = { a }, Baz = { b }, Qux = { c } }
-% \end{listing}
-%
-% \phantomsection\addcontentsline{toc}{section}{\doclist{foo:iii}.}
-% \begin{listing}[]{label=listing:foo:iii}
-% \OopsOptions
-% {
-% Inner = {(#1)},
-% Separators = { {~\&~}{~,~}{~\&~} },
-% Outer = {\textless#1\textgreater}
-% }
-% \OopsNew{Foo}[]{ Barr = { a }, Baz = { b }, Qux = { c } }
-% \end{listing}
-%
-% \phantomsection\addcontentsline{toc}{section}{\doclist{foo:iv}.}
-% \begin{listing}[]
-% {label=listing:foo:iv}
-% \OopsOptions
-% {
-% Inner,
-% Separators,
-% Outer
-% }
-% \end{listing}
-%
-% \phantomsection\addcontentsline{toc}{section}{\doclist{math:i}.}
-% \begin{listing}[]
-% {label=listing:math:i}
-% \OopsNew{Math}[We call~]{Elems={\omega_1, \dots, \omega_n}}
-% [~the elementary events, and ]{}{Space=\Omega}
-% [\begin{equation*}\Space=(\Elems)\end{equation*}~the sample space.]
-% {}
-% \end{listing}
-%
-%
-% \phantomsection\addcontentsline{toc}{section}{Listing~\autoref{listing:math:ii}.}
-% \begin{listing}[]
-% {label=listing:math:ii}
-% \OopsClear{Math}
-% \OopsNew{Math}[Let ]s{{,}{,}{,}}o{\ensuremath{\{#1\}}}
-% {Space=\Omega, SigmaField=\mathcal{F}, Measure=\mathcal{P}}
-% [~denote the probability space, where $\SigmaField\subset 2^{\Space}$.]
-% {}
-% \end{listing}
-% \phantomsection\addcontentsline{toc}{section}{Listing~\autoref{listing:mvt}.}
-% \begin{listing}[]{label=listing:mvt}
-% \newtheorem{theorem}{Theorem}
-% \OopsNew{Math}
-% i{\mathbb{#1}}{ N = { N } , R = { R } }
-% [\begin{theorem}[Mittelwertsatz f\"ur $n$ Variable]Es sei~]
-% {}
-% {
-% OffeneMenge={D},
-% Ci={C^{1}},
-% Strecke={[x_0,x]}
-%^^A %Strecke={\char`[x_0,x\char`]} % Also works
-%^^A %Strecke={\[x_0,x\]} % BUG
-% }
-% [$n\in\N$, $\OffeneMenge\subseteq\N^n$ eine offene Menge und $f\in \Ci(\OffeneMenge,\R)$.
-% Dann gibt es auf jeder Strecke $\Strecke\subset\OffeneMenge$ einen Punkt $\xi\in\Strecke$, ]
-% {}
-% {
-% yDifferenz={f(x)-f(x_0)},
-% xDifferenz={x-x_0},
-% Steigung={\frac{\yDifferenz}{\xDifferenz}}
-% }
-% [so dass gilt \begin{equation*}\Steigung = \operatorname{grad} f(\xi)^{\top}\end{equation*}
-% \end{theorem}]
-% {}
-% \end{listing}
-%
-% \StopEventually{^^A
-% \PrintChanges
-% \PrintIndex
-% }
-% \part{Other}\label{part:other}
-% \section{Acknowledgment}
-%
-% This work has benefited from Q\&A's from the \LaTeX community. For specifics, see here: \url{https://tex.stackexchange.com/users/112708/erwann?tab=questions}
-% \doclist{math:i} and \doclist{math:ii} are from \cite{shir95}. \doclist{mvt} is from \pkg{tcolbox}\cite[17.3]{tcolbox}.
-%
-% \begin{thebibliography}{1}
-% \bibitem{shir95} A.N. Shiryaev {\em Probability} Springer, 1995
-% \bibitem{interface3} The \LaTeX3 Project Team {\em The \LaTeX3 interfaces}
-% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}
-% \bibitem{xparse} The \LaTeX3 Project Team {\em The \pkg{xparse} package}
-% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3packages/xparse.pdf}
-% \bibitem{tcolbox} Thomas F. Sturm {\em The \pkg{tcolorbox} package}
-% \url{http://www.texdoc.net/texmf-dist/doc/latex/tcolorbox/tcolorbox.pdf}
-% \bibitem{tex.stack:104023} \url{https://tex.stackexchange.com/questions/104023/what-is-a-token#104025}
-% \end{thebibliography}
-%
-% \section{Bug}\label{other:bug}
-%
-% See \doclist{math:ii}. Low priority as there are workarounds.
-%
-% \section{Disclaimer}\label{other:discl}
-%
-% This package has not been tested beyond \autoref{part:listing}.
-%
-% Option type \texttt{G} is supported but not recommended by \pkg{xparse}\cite{xparse}, but it's really practical in this case.
-
-% \section{Support}\label{other:support}
-%
-% This package is available from \url{https://www.ctan.org/pkg/oops} (release) or \url{https://github.com/rogard/oops} (development) where you can report issues.
-%
-% \section{To do}\label{other:todo}
-%
-% \begin{enumerate}
-% \item Continue \autoref{part:listing} based on \cite[Section 17.3]{tcolbox}
-% \end{enumerate}
-%
-%^^A \section{Changes}
-%
-% \changes{v1.0}{2019/03/08}{Initial version}
-%
-% \clearpage
-% \part{Implementation}\label{part:impl}
-%
-% \iffalse
-%<*package>
-% \fi
-% \section{Back end}
-% \subsection{Aux}
-% \subsubsection{Msg}
-% \begin{macrocode}
-\NeedsTeXFormat{LaTeX2e}[2019/10/01]
-\ExplSyntaxOn
-\msg_new:nnn
-{Oops}
-{generic}
-{#1}
-% \end{macrocode}
-% \subsubsection{Variables}
-% \begin{macrocode}
-\seq_new:N \__erw_oops_seq
-% \end{macrocode}
-% \subsubsection{Options}
-% \begin{macrocode}
-\keys_define:nn { Oops }
-{
- GenericObject .tl_gset:N = \__erw_oops_object_default_tl,
- GenericObject .value_required:n = false,
- GenericObject .default:n = {Math},
- GenericObject .initial:n = {Math},
- Inner .code:n =
- {
- \cs_gset:Npn \__erw_oops_inner_default:n ##1{#1}
- },
- Inner .value_required:n = false,
- Inner .default:n = {#1},
- Inner .initial:n = {#1},
- Separators .tl_gset:N = \__erw_oops_separators_default_tl,
- Separators .value_required:n = false,
- Separators .default:n = {{ \text{~and~}}{\text{,~}}{\text{,~and~}}},
- Separators .initial:n = {{ \text{~and~}}{\text{,~}}{\text{,~and~}}},
- Outer .code:n =
- {
- \cs_gset:Npn \__erw_oops_outer_default:n ##1{#1}
- },
- Outer .value_required:n = false,
- Outer .default:n = {\ensuremath{#1}},
- Outer .initial:n = {\ensuremath{#1}}
-}
-% \end{macrocode}
-% \subsection{Prop}
-% \subsubsection{name}
-% \begin{macrocode}
-\cs_new:Npn \__erw_oops_name:n #1{__erw_oops_#1}
-% \end{macrocode}
-% \subsubsection{new}
-% \begin{macrocode}
-\cs_new_protected:Nn \__erw_oops_new:n
-{
- \prop_new:c{\__erw_oops_name:n { #1 }}
-}
-\cs_new_protected:Nn \__erw_oops_clear_new:n
-{
- \prop_clear_new:c{\__erw_oops_name:n { #1 }}
-}
-% \end{macrocode}
-% \subsubsection{put}
-% \begin{macrocode}
-\cs_new_protected:Nn \__erw_oops_put:nnn
-{
- \prop_put:cnn { \__erw_oops_name:n { #1 } } { #2 } { #3 }
-}
-\cs_new_protected:Nn \__erw_oops_putinner:nnn
-{
- \__erw_oops_put:nnn{#1}
- {#2}
- {\__erw_oops_inner:n{#3}}
-}
-% \end{macrocode}
-% \subsubsection{item}
-% \begin{macrocode}
-\cs_new:Nn \__erw_oops_item:nn
-{
- \prop_item:cn { \__erw_oops_name:n { #1 } } { #2 }
-}
-\cs_new:Npn \__erw_oops_item:nnn #1 #2 #3
-{
- \__erw_oops_item:nn{#1}{#2}
-}
-\cs_new:Nn \__erw_oops_itemcmd:Nn
-{
- \ProvideDocumentCommand{#1}
- {O{\__erw_oops_object_default_tl}}
- {
- \__erw_oops_item:nn {##1}{ #2 }
- }
-}
-\cs_generate_variant:Nn \__erw_oops_itemcmd:Nn {c}
-\cs_new:Npn \__erw_oops_itemcmd:nnn
-#1
-#2
-#3
-{
- \__erw_oops_itemcmd:cn{#2}{#2}
-}
-\cs_new:Npn \__erw_oops_itemto_seq:nnn #1 #2 #3
-{
- \seq_put_right:Nn
- \__erw_oops_seq
- {\__erw_oops_item:nn{#1}{#2}}
-}
-% \end{macrocode}
-% \subsubsection{conditional}
-% \begin{macrocode}
-\cs_new:Nn \__erw_oops_if_exist:nTF
-{
- \prop_if_exist:cTF{\__erw_oops_name:n { #1 }}{#2}{#3}
-}
-% \end{macrocode}
-% \subsubsection{parse}
-% \begin{macrocode}
-\cs_set:Npn \__erw_oops_parse:Nnn
-#1 % fun
-#2 % prop name
-#3 % clist
-{
-
- \tl_if_blank:nTF{#3}
- {\c_empty_tl}
- {
- \seq_set_split:Nnn \l_tmpa_seq {,}{#3}
- \cs_set:Npn \__erw_oops_parse:w ##1 = ##2 \q_stop
- {
- #1
- {#2}
- {\tl_trim_spaces:n{##1}} % key
- {\tl_trim_spaces:n{##2}} % value
- }
- \cs_set:Npn \__erw_oops_parse:n ##1
- {
- \__erw_oops_parse:w ##1 \q_stop
- }
- \seq_map_function:NN \l_tmpa_seq \__erw_oops_parse:n
- }
-}
-% \end{macrocode}
-% \section{Front end}
-% \subsection{\cs{OopsOptions}}
-% \begin{macrocode}
-\NewDocumentCommand{\OopsOptions}
-{m}
-{
- \keys_set:nn { Oops } {#1}
-}
-% \ProcessKeysPackageOptions{ Oops }
-% \end{macrocode}
-% \subsection{\cs{OopsClear}}
-% \begin{macrocode}
-\NewDocumentCommand{\OopsClear}
-{m}
-{
- \__erw_oops_clear_new:n{#1}
-}
-% \end{macrocode}
-% \subsection{\cs{OopsNew}}
-% \begin{macrocode}
-\NewDocumentCommand{\OopsNew}
-{
- m
- +o
- E{iso}
- {
- {\__erw_oops_inner_default:n{##1}}
- {\__erw_oops_separators_default_tl}
- {\__erw_oops_outer_default:n{##1}}
- }
- m
- E{i}
- {
- {\__erw_oops_inner_default:n{##1}}
- }
- g
- +o
-}
-{
- \__erw_oops_if_exist:nTF{#1}
- {\c_empty_tl}
- {\__erw_oops_new:n{#1}}
-
- \IfValueTF{#2}
- {#2}
- {\c_empty_tl}
- \cs_gset:Npn
-
- \__erw_oops_inner:n ##1
- {#3}
- \__erw_oops_parse:Nnn
- \__erw_oops_putinner:nnn
- {#1}
- {#6}
-
- \__erw_oops_parse:Nnn
- \__erw_oops_itemcmd:nnn
- {#1}
- {#6}
-
- \IfValueTF{#2}
- {
- \seq_clear:N \__erw_oops_seq
- \__erw_oops_parse:Nnn
- \__erw_oops_itemto_seq:nnn
- {#1}
- {#6}
- \cs_gset:Npn
- \__erw_oops_outer:n ##1
- {#5}
- \__erw_oops_outer:n
- {\exp_last_unbraced:NNo
- \seq_use:Nnnn
- \__erw_oops_seq
- {#4}
- }
- }
- {\c_empty_tl}
-
- \IfValueTF{#8}
- {
- \IfValueTF{#9}
- {
- \exp_not:n{\OopsNew{#1}i{#7}{#8}[#9]}
- }
- {
- \exp_not:n{\OopsNew{#1}i{#7}{#8}}
- }
- }
- {
- \IfValueTF{#9}
- {
- \exp_not:n{\OopsNew{#1}[#9]}
- }
- {\c_empty_tl}
- }
-}
-% \end{macrocode}
-% \begin{macrocode}
-\ExplSyntaxOff
-% \end{macrocode}
-%
-% \iffalse
-%</package>
-% \fi
-% \Finale
-\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/oops/oops.ins b/Master/texmf-dist/source/latex/oops/oops.ins
deleted file mode 100644
index 373e7355120..00000000000
--- a/Master/texmf-dist/source/latex/oops/oops.ins
+++ /dev/null
@@ -1,71 +0,0 @@
-%%
-%% This is file `oops.ins',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% oops.dtx (with options: `install')
-%% ----------------------------------------------------------------
-%% oops --- An object oriented practical scribe's package,
-%% typically for typesetting math
-%% Released under the LaTeX Project Public License v1.3c or later
-%% See http://www.latex-project.org/lppl.txt
-%% ----------------------------------------------------------------
-%%
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-\preamble
-----------------------------------------------------------------
-oops --- An object oriented practical scribe's package,
-typically for typesetting math
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
-\endpreamble
-\postamble
-
-Copyright (C) 2020 by Erwann Rogard
-
-This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License (LPPL), either
-version 1.3c of this license or (at your option) any later
-version. The latest version of this license is in the file:
-
-http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
-Erwann Rogard.
-
-This work consists of the file oops.dtx
-and the derived files oops.ins,
-oops.pdf and
-oops.sty.
-
-\endpostamble
-\generate{
- \file{\jobname.sty}{\from{\jobname.dtx}{package}}
-}
- \endbatchfile
-
-%%
-%% Copyright (C) 2020 by Erwann Rogard
-%%
-%% This work may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License (LPPL), either
-%% version 1.3c of this license or (at your option) any later
-%% version. The latest version of this license is in the file:
-%%
-%% http://www.latex-project.org/lppl.txt
-%%
-%% This work is "maintained" (as per LPPL maintenance status) by
-%% Erwann Rogard.
-%%
-%% This work consists of the file oops.dtx
-%% and the derived files oops.ins,
-%% oops.pdf and
-%% oops.sty.
-%%
-%%
-%% End of file `oops.ins'.
diff --git a/Master/texmf-dist/source/latex/orcidlink/orcidlink.dtx b/Master/texmf-dist/source/latex/orcidlink/orcidlink.dtx
new file mode 100644
index 00000000000..016d225d0c4
--- /dev/null
+++ b/Master/texmf-dist/source/latex/orcidlink/orcidlink.dtx
@@ -0,0 +1,166 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2020 by Leo C. Stein <leo.stein@gmail.com>
+% ---------------------------------------------------------------------------
+% 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
+% http://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 Leo C. Stein.
+%
+% This work consists of the files orcidlink.dtx and orcidlink.ins
+% and the derived filebase orcidlink.sty.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{orcidlink.dtx}
+%</driver>
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[dvipsnames]{xcolor}
+\usepackage{orcidlink}[2020/11/21]
+\hypersetup{colorlinks,urlcolor=NavyBlue,citecolor=NavyBlue,linkcolor=NavyBlue,pdfusetitle}
+\usepackage{graphicx}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{orcidlink.dtx}
+ \PrintChanges
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{22}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% \changes{v1.0.0}{2020/11/19}{Converted to DTX file}
+% \changes{v1.0.1}{2020/11/21}{Bugfix due to misunderstanding of docstrip}
+% \changes{v1.0.2}{2020/11/21}{Fix fragility of command when inside of
+% author, and combined with hyperref's option pdfusetitle}
+%
+% \DoNotIndex{\newcommand,\newenvironment}
+%
+% \GetFileInfo{orcidlink.sty}
+% \title{The \textsf{orcidlink} package}
+% \author{Leo C.\ Stein\,\orcidlink{0000-0001-7559-9597} \\ \href{mailto:leo.stein@gmail.com}{leo.stein@gmail.com}}
+% \date{\fileversion~from \filedate}
+%
+% \maketitle
+%
+% \noindent Source repo:
+% \url{https://github.com/duetosymmetry/orcidlink-LaTeX-command}.
+%
+% \section{Introduction}
+%
+% This is a LaTeX style file to add a macro for inserting a linked
+% ORCiD logo. The package provides exactly one command, |\orcidlink|.
+%
+% \section{Usage}
+%
+% To use this package, in the preamble include
+% \begin{macrocode}
+% \usepackage{orcidlink}
+% \end{macrocode}
+%
+% \DescribeMacro{\orcidlink}
+% Insert the ORCiD logo (\orcidlink{}), which is hyperlinked to the URL
+% of the researcher whose iD was specified. Usage:
+%
+% |\orcidlink| \marg{orcid}\newline
+% Replace the mandatory argument \meta{orcid} with your
+% ORCiD --- just the digits, not your whole URL.
+% For example, the command
+% |\orcidlink{0000-0001-7559-9597}| will hyperlink to the URL
+% \url{https://orcid.org/0000-0001-7559-9597}.
+% This is most common in
+% the author list. For example, in the preamble of a RevTeX article,
+% if you write
+% \begin{macrocode}
+% \author{Emmy Noether\,\orcidlink{0000-0000-0000-0000}}
+% \end{macrocode}
+% then the article byline will look something like this:
+%
+% \includegraphics[width=0.5\textwidth]{preview}\newline{}
+% The macro is used in the author line of this documentation as well.
+%
+% \StopEventually{}
+%
+% \section{Implementation}
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1994/06/01]
+\ProvidesPackage{orcidlink}
+ [2020/11/21 v1.0.2 Linked ORCiD logo macro package]
+
+%% All I did was package up Milo's code on TeX.SE,
+%% see https://tex.stackexchange.com/a/445583/34063
+\RequirePackage{hyperref}
+\RequirePackage{scalerel}
+\RequirePackage{tikz}
+
+\ProcessOptions\relax
+
+\usetikzlibrary{svg.path}
+
+\definecolor{orcidlogocol}{HTML}{A6CE39}
+\tikzset{
+ orcidlogo/.pic={
+ \fill[orcidlogocol] svg{M256,128c0,70.7-57.3,128-128,128C57.3,256,0,198.7,0,128C0,57.3,57.3,0,128,0C198.7,0,256,57.3,256,128z};
+ \fill[white] svg{M86.3,186.2H70.9V79.1h15.4v48.4V186.2z}
+ svg{M108.9,79.1h41.6c39.6,0,57,28.3,57,53.6c0,27.5-21.5,53.6-56.8,53.6h-41.8V79.1z M124.3,172.4h24.5c34.9,0,42.9-26.5,42.9-39.7c0-21.5-13.7-39.7-43.7-39.7h-23.7V172.4z}
+ svg{M88.7,56.8c0,5.5-4.5,10.1-10.1,10.1c-5.6,0-10.1-4.6-10.1-10.1c0-5.6,4.5-10.1,10.1-10.1C84.2,46.7,88.7,51.3,88.7,56.8z};
+ }
+}
+% \end{macrocode}
+%
+% \begin{macro}{\orcidlink}
+% \begin{macrocode}
+
+\newcommand\orcidlink[1]{\texorpdfstring{\href{https://orcid.org/#1}{\mbox{\scalerel*{
+\begin{tikzpicture}[yscale=-1,transform shape]
+\pic{orcidlogo};
+\end{tikzpicture}
+}{|}}}}{}}
+
+\endinput
+% \end{macrocode}
+% \end{macro}
+%
+
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/orcidlink/orcidlink.ins b/Master/texmf-dist/source/latex/orcidlink/orcidlink.ins
new file mode 100644
index 00000000000..dcdd43c005b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/orcidlink/orcidlink.ins
@@ -0,0 +1,57 @@
+%% Copyright (C) 2020 by Leo C. Stein <leo.stein@gmail.com>
+%% --------------------------------------------------------------------------
+%% 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
+%% http://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 Leo C. Stein.
+%%
+%% This work consists of the files orcidlink.dtx and orcidlink.ins
+%% and the derived filebase orcidlink.sty.
+%%
+
+\input docstrip.tex
+\keepsilent
+
+\usedir{tex/latex/orcidlink}
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2020 by Leo C. Stein <leo.stein@gmail.com>
+--------------------------------------------------------------------------
+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
+ http://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.
+
+\endpreamble
+
+\generate{\file{orcidlink.sty}{\from{orcidlink.dtx}{package}}}
+
+\obeyspaces
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* orcidlink.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file orcidlink.dtx *}
+\Msg{* through LaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/oberdiek/pagesel.dtx b/Master/texmf-dist/source/latex/pagesel/pagesel.dtx
index b674f803d4c..68d030a934e 100644
--- a/Master/texmf-dist/source/latex/oberdiek/pagesel.dtx
+++ b/Master/texmf-dist/source/latex/pagesel/pagesel.dtx
@@ -1,13 +1,13 @@
% \iffalse meta-comment
%
% File: pagesel.dtx
-% Version: 2016/05/16 v1.9
+% Version: 2020-08-03 v1.10
% Info: Select pages of a document for output
%
% Copyright (C)
% 1999, 2003, 2006-2008 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
-% https://github.com/ho-tex/oberdiek/issues
+% 2016-2020 Oberdiek Package Support Group
+% https://github.com/ho-tex/pagesel/issues
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -23,15 +23,16 @@
%
% The Current Maintainers of this work are
% Heiko Oberdiek and the Oberdiek Package Support Group
-% https://github.com/ho-tex/oberdiek/issues
+% https://github.com/ho-tex/pagesel/issues
%
% This work consists of the main source file pagesel.dtx
% and the derived files
-% pagesel.sty, pagesel.pdf, pagesel.ins, pagesel.drv.
+% pagesel.sty, pagesel-2016-05-16.sty,
+% pagesel.pdf, pagesel.ins, pagesel.drv.
%
% Distribution:
-% CTAN:macros/latex/contrib/oberdiek/pagesel.dtx
-% CTAN:macros/latex/contrib/oberdiek/pagesel.pdf
+% CTAN:macros/latex/contrib/pagesel/pagesel.dtx
+% CTAN:macros/latex/contrib/pagesel/pagesel.pdf
%
% Unpacking:
% (a) If pagesel.ins is present:
@@ -60,9 +61,9 @@
% pdflatex pagesel.dtx
%
% Installation:
-% TDS:tex/latex/oberdiek/pagesel.sty
-% TDS:doc/latex/oberdiek/pagesel.pdf
-% TDS:source/latex/oberdiek/pagesel.dtx
+% TDS:tex/latex/pagesel/pagesel.sty
+% TDS:doc/latex/pagesel/pagesel.pdf
+% TDS:source/latex/pagesel/pagesel.dtx
%
%<*ignore>
\begingroup
@@ -79,7 +80,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: pagesel 2016/05/16 v1.9 Select pages of a document for output (HO)}
+\Msg{* Package: pagesel 2020-08-03 v1.10 Select pages of a document for output (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -91,11 +92,11 @@
This is a generated file.
Project: pagesel
-Version: 2016/05/16 v1.9
+Version: 2020-08-03 v1.10
Copyright (C)
1999, 2003, 2006-2008 Heiko Oberdiek
- 2016-2019 Oberdiek Package Support Group
+ 2016-2020 Oberdiek Package Support Group
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -111,12 +112,13 @@ This work has the LPPL maintenance status "maintained".
The Current Maintainers of this work are
Heiko Oberdiek and the Oberdiek Package Support Group
-https://github.com/ho-tex/oberdiek/issues
+https://github.com/ho-tex/pagesel/issues
This work consists of the main source file pagesel.dtx
and the derived files
- pagesel.sty, pagesel.pdf, pagesel.ins, pagesel.drv.
+ pagesel.sty, pagesel-2016-05-16.sty, pagesel.pdf,
+ pagesel.ins, pagesel.drv.
\endpreamble
\let\MetaPrefix\DoubleperCent
@@ -124,8 +126,9 @@ and the derived files
\generate{%
\file{pagesel.ins}{\from{pagesel.dtx}{install}}%
\file{pagesel.drv}{\from{pagesel.dtx}{driver}}%
- \usedir{tex/latex/oberdiek}%
+ \usedir{tex/latex/pagesel}%
\file{pagesel.sty}{\from{pagesel.dtx}{package}}%
+ \file{pagesel-2016-05-16.sty}{\from{pagesel.dtx}{packagefrozen}}
}
\catcode32=13\relax% active space
@@ -152,7 +155,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{pagesel.drv}%
- [2016/05/16 v1.9 Select pages of a document for output (HO)]%
+ [2020-08-03 v1.10 Select pages of a document for output (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}[2011/11/22]
\begin{document}
@@ -166,9 +169,9 @@ and the derived files
% \GetFileInfo{pagesel.drv}
%
% \title{The \xpackage{pagesel} package}
-% \date{2016/05/16 v1.9}
+% \date{2020-08-03 v1.10}
% \author{Heiko Oberdiek\thanks
-% {Please report any issues at \url{https://github.com/ho-tex/oberdiek/issues}}}
+% {Please report any issues at \url{https://github.com/ho-tex/pagesel/issues}}}
%
% \maketitle
%
@@ -284,12 +287,38 @@ and the derived files
% }
%
% \section{Implementation}
-% \subsection{Package}
% \begin{macrocode}
%<*package>
+% \end{macrocode}
+% \subsection{New implementation using the LaTeX kernel hooks}
+% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{pagesel}
- [2016/05/16 v1.9 Select pages of a document for output (HO)]%
+ [2020-08-03 v1.10 Select pages of a document for output (HO)]%
+% \end{macrocode}
+% \begin{macrocode}
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}{}{\input{pagesel-2016-05-16.sty}}
+\IfFormatAtLeastTF{2020/10/01}{}{\endinput}
+
+% \end{macrocode}
+% If the package is loaded twice, the package code does not
+% work. So stop loading the package, if it is already loaded.
+% \begin{macrocode}
+\@ifundefined{ps@oddpages}{}{%
+ \PackageWarningNoLine{pagesel}{Package already loaded.}%
+ \endinput
+}
+% \end{macrocode}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+% \subsection{Package}
+% \begin{macrocode}
+%<*packagefrozen>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{pagesel}
+ [2020-08-03 v1.10 Select pages of a document for output (legacy code) (HO)]%
% \end{macrocode}
%
% If the package is loaded twice, the package code does not
@@ -315,11 +344,13 @@ and the derived files
\deadcycles=\count@
\endgroup
}
+%</packagefrozen>
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ps@oddpages}
% \begin{macrocode}
+%<*package|packagefrozen>
\newcommand*\ps@oddpages{0}
\DeclareOption{odd}{\renewcommand*\ps@oddpages{1}}
\DeclareOption{even}{\renewcommand*\ps@oddpages{2}}
@@ -415,10 +446,14 @@ and the derived files
% \end{macrocode}
%
% \begin{macrocode}
+%</package|packagefrozen>
+%<*packagefrozen>
\RequirePackage{everyshi}
+%</packagefrozen>
% \end{macrocode}
%
% \begin{macrocode}
+%<*package|packagefrozen>
\ps@nofiles
% \end{macrocode}
%
@@ -482,7 +517,10 @@ and the derived files
% \end{macro}
%
% \begin{macrocode}
-\EveryShipout{%
+%</package|packagefrozen>
+%<packagefrozen>\EveryShipout{%
+%<package>\AddToHook{shipout/before}{%
+%<*package|packagefrozen>
\stepcounter{ps@count}%
\ifnum\value{ps@count}>\ps@lastpage\relax
\global\output{%
@@ -504,52 +542,57 @@ and the derived files
\let\ps@next\@empty
\ifx\ps@testlist\@empty
\else
- \let\ps@next\ps@makevoid
+%<packagefrozen> \let\ps@next\ps@makevoid
+%<package> \let\ps@next\DiscardShipoutBox
\ps@testlist
\fi
\ifnum\ps@oddpages=1 %
\ifodd\value{ps@count}%
\else
- \let\ps@next\ps@makevoid
+%<packagefrozen> \let\ps@next\ps@makevoid
+%<package> \let\ps@next\DiscardShipoutBox
\fi
\fi
\ifnum\ps@oddpages=2 %
\ifodd\value{ps@count}%
- \let\ps@next\ps@makevoid
+%<packagefrozen> \let\ps@next\ps@makevoid
+%<package> \let\ps@next\DiscardShipoutBox
\else
\fi
\fi
- \ps@begindvi
+%<packagefrozen> \ps@begindvi
\ps@next
}
+%</package|packagefrozen>
% \end{macrocode}
%
% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname currentiflevel\endcsname\relax
- \let\ps@cleanup@if\@empty
-\else
+%<*package|packagefrozen>
+%<packagefrozen>\begingroup\expandafter\expandafter\expandafter\endgroup
+%<packagefrozen>\expandafter\ifx\csname currentiflevel\endcsname\relax
+%<packagefrozen> \let\ps@cleanup@if\@empty
+%<packagefrozen>\else
\def\ps@cleanup@if{%
\ifnum\currentiflevel>\@ne
\csname fi\endcsname
\expandafter\ps@cleanup@if
\fi
}%
-\fi
+%<packagefrozen>\fi
% \end{macrocode}
% Because of \cs{aftergroup} it is too dangerous to perform
% a similar cleanup for groups.
% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname currentgrouplevel\endcsname\relax
- \let\ps@group@message\@empty
- \def\ps@message@ignore{%
- \typeout{%
- (pagesel) \space\space\@spaces\@spaces\@spaces
- Messages (\string\end\space occurred ...) can be ignored.%
- }%
- }%
-\else
+%<packagefrozen> \begingroup\expandafter\expandafter\expandafter\endgroup
+%<packagefrozen> \expandafter\ifx\csname currentgrouplevel\endcsname\relax
+%<packagefrozen> \let\ps@group@message\@empty
+%<packagefrozen> \def\ps@message@ignore{%
+%<packagefrozen> \typeout{%
+%<packagefrozen> (pagesel) \space\space\@spaces\@spaces\@spaces
+%<packagefrozen> Messages (\string\end\space occurred ...) can be ignored.%
+%<packagefrozen> }%
+%<packagefrozen> }%
+%<packagefrozen>\else
\def\ps@group@message{%
\ifnum\currentgrouplevel>\@ne
\def\ps@message@ignore{%
@@ -563,7 +606,8 @@ and the derived files
\let\ps@message@ignore\@empty
\fi
}%
-\fi
+%<packagefrozen>\fi
+%</package|packagefrozen>
% \end{macrocode}
%
% \subsection{AtBeginDvi hook support}
@@ -571,6 +615,7 @@ and the derived files
% The material of box \cs{@begindvibox} is recorded in parallel
% in box \cs{ps@begindvibox}.
% \begin{macrocode}
+%<*packagefrozen>
\newbox\ps@begindvibox
\ifvoid\@begindvibox
\else
@@ -614,7 +659,7 @@ and the derived files
% \end{macro}
%
% \begin{macrocode}
-%</package>
+%</packagefrozen>
% \end{macrocode}
%
% \section{Installation}
@@ -624,30 +669,11 @@ and the derived files
% \paragraph{Package.} This package is available on
% CTAN\footnote{\CTANpkg{pagesel}}:
% \begin{description}
-% \item[\CTAN{macros/latex/contrib/oberdiek/pagesel.dtx}] The source file.
-% \item[\CTAN{macros/latex/contrib/oberdiek/pagesel.pdf}] Documentation.
-% \end{description}
-%
-%
-% \paragraph{Bundle.} All the packages of the bundle `oberdiek'
-% are also available in a TDS compliant ZIP archive. There
-% the packages are already unpacked and the documentation files
-% are generated. The files and directories obey the TDS standard.
-% \begin{description}
-% \item[\CTANinstall{install/macros/latex/contrib/oberdiek.tds.zip}]
+% \item[\CTAN{macros/latex/contrib/pagesel/pagesel.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/pagesel/pagesel.pdf}] Documentation.
% \end{description}
-% \emph{TDS} refers to the standard ``A Directory Structure
-% for \TeX\ Files'' (\CTANpkg{tds}). Directories
-% with \xfile{texmf} in their name are usually organized this way.
%
-% \subsection{Bundle installation}
%
-% \paragraph{Unpacking.} Unpack the \xfile{oberdiek.tds.zip} in the
-% TDS tree (also known as \xfile{texmf} tree) of your choice.
-% Example (linux):
-% \begin{quote}
-% |unzip oberdiek.tds.zip -d ~/texmf|
-% \end{quote}
%
% \subsection{Package installation}
%
@@ -664,9 +690,9 @@ and the derived files
% \begin{quote}
% \def\t{^^A
% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
-% pagesel.sty & tex/latex/oberdiek/pagesel.sty\\
-% pagesel.pdf & doc/latex/oberdiek/pagesel.pdf\\
-% pagesel.dtx & source/latex/oberdiek/pagesel.dtx\\
+% pagesel.sty & tex/latex/pagesel/pagesel.sty\\
+% pagesel.pdf & doc/latex/pagesel/pagesel.pdf\\
+% pagesel.dtx & source/latex/pagesel/pagesel.dtx\\
% \end{tabular}^^A
% }^^A
% \sbox0{\t}^^A
@@ -846,6 +872,10 @@ and the derived files
% \item
% Documentation updates.
% \end{Version}
+% \begin{Version}{2020-08-03 v1.10}
+% \item Updated to follow the changes in the hook management
+% of LaTeX 2020/10/01
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/paresse/LISEZMOI b/Master/texmf-dist/source/latex/paresse/LISEZMOI
deleted file mode 100644
index 178de1082a5..00000000000
--- a/Master/texmf-dist/source/latex/paresse/LISEZMOI
+++ /dev/null
@@ -1,52 +0,0 @@
-% -*- coding: utf-8 -*-
-% Time-stamp: <2013-02-16 10:25:05 novatux>
-
-======================================================================
-
-PARESSE version 4.1 2013/02/16
-
-======================================================================
-
-Ce lot comprend
-
-LISEZMOI % ce fichier
-README % la version anglaise
-
-Makefile % pour les utilisateurs de *nix
-paresse.dtx % fichier source
-paresse.ins % fichier d'installation
-paresse.sty % le fichier de l'extension
-paresseold.sto % fichier d'option
-paresseutf8.sto % fichier d'option
-
-
-paresse.pdf % code documenté en anglais
-paresse-fr.pdf % documentation française
-paresse-en.pdf % documentation anglaise
-paresse-ex-fr.pdf % exemple en français
-paresse-ex-en.pdf % le même en anglais
-
-paresse-TEST.zip
-% archive contenant les fichiers de test:
- ex-com-utf8-tame.tex
- ex-com-utf8-wild.tex
- test-latex-8bits-tame.tlx
- test-latex-8bits-wild.tlx
- test-latex-utf8-tame.tlx
- test-latex-utf8-wild.tlx
- test-lualatex-tame.llx
- test-lualatex-wild.llx
- test-xelatex-tame.xlx
- test-xelatex-wild.xlx
-
-paresse.tds.zip % l'archive conforme à la TDS
-
-======================================================================
-
-Cette extension est faite pour taper « facilement » les lettres
-grecques avec un minimum d'effort ;) Elle ne concerne que les
-lettres grecques qui ont un nom de macro comme \alpha ou \Omega.
-
---
-Le \TeX nicien de surface
-Yvon.Henel@wanadoo.fr
diff --git a/Master/texmf-dist/source/latex/paresse/Makefile b/Master/texmf-dist/source/latex/paresse/Makefile
deleted file mode 100644
index c36bb56210f..00000000000
--- a/Master/texmf-dist/source/latex/paresse/Makefile
+++ /dev/null
@@ -1,203 +0,0 @@
-# ---------------------------------------------------------------
-# Time-stamp: <2013-02-16 10:51:17 novatux>
-# Makefile for the paresse package by Y. Henel
-# modified version of the Makefile of the kerntest package
-# many thanks to Harald Harders whose kerntest.xml I have also
-# hacked to obtain my paresse.xml
-# ---------------------------------------------------------------
-PKGNAME=paresse
-VERSION=4.1
-
-TESTSRCUTIL= \
- ex-com-utf8-tame.tex \
- ex-com-utf8-wild.tex \
-
-TESTSRCTEX= \
- test-latex-8bits-tame.tlx \
- test-latex-8bits-wild.tlx \
- test-latex-utf8-tame.tlx \
- test-latex-utf8-wild.tlx \
- test-lualatex-tame.llx \
- test-lualatex-wild.llx \
- test-xelatex-tame.xlx \
- test-xelatex-wild.xlx
-
-TESTSRC= \
- $(TESTSRCUTIL) \
- $(TESTSRCTEX)
-
-SOURCE= Makefile \
- $(PKGNAME).dtx \
- $(PKGNAME)-doc.dtx \
- $(PKGNAME).ins \
- LISEZMOI \
- README
-
-PDFDOC= $(PKGNAME).pdf \
- $(PKGNAME)-fr.pdf \
- $(PKGNAME)-en.pdf \
- $(PKGNAME)-ex-fr.pdf \
- $(PKGNAME)-ex-en.pdf
-
-PDFDOCSUP = \
- test-latex-8bits-tame.pdf \
- test-latex-8bits-wild.pdf \
- test-latex-utf8-tame.pdf \
- test-latex-utf8-wild.pdf \
- test-lualatex-tame.pdf \
- test-lualatex-wild.pdf \
- test-xelatex-tame.pdf \
- test-xelatex-wild.pdf
-
-SRCDOC= $(PKGNAME)-doc.dtx
-
-TEXDOC= $(PKGNAME)-fr.ltx \
- $(PKGNAME)-en.ltx \
- $(PKGNAME)-ex-fr.elx \
- $(PKGNAME)-ex-en.elx
-
-CTANDOC= $(PDFDOC)
-
-DECHETS= \
- $(TEXDOC)\
- $(PDFDOC)\
- $(PDFDOCSUP)
-
-REPERTS = \
- doc \
- tex \
- source
-
-TEX = $(PKGNAME).sty \
- $(PKGNAME)utf8.sto \
- $(PKGNAME)old.sto
-
-GARBAGE= $(wildcard *.aux)\
- $(wildcard *.log)\
- $(wildcard *.toc)\
- $(wildcard *.out)\
- $(wildcard *.glo)\
- $(wildcard *.gls)\
- $(wildcard *.ilg)\
- $(wildcard *.ind)\
- $(wildcard *.idx)\
- $(wildcard *.hd)\
- $(wildcard *.ltx)\
- $(wildcard *.elx)\
- $(wildcard *~)
-
-# ---------------------------------------------------------------
-
-.SUFFIXES: .sty .ins .dtx .pdf .ltx .tex .llx .xlx .tlx .elx
-
-# ---------------------------------------------------------------
-.ins.sty:
- latex $<
-
-.dtx.pdf:
- pdflatex $<
- pdflatex $<
- makeindex -s gind.ist $(*D)/$(*F)
- makeindex -s gglo.ist -o $(*D)/$(*F).gls $(*D)/$(*F).glo
- pdflatex $<
-
-.ltx.pdf:
- pdflatex $<
- pdflatex $<
- makeindex -s gind.ist $(*D)/$(*F)
- pdflatex $<
-
-.elx.pdf:
- pdflatex $<
- pdflatex $<
-
-.tlx.pdf:
- pdflatex $<
-
-.llx.pdf:
- lualatex $<
-
-.xlx.pdf:
- xelatex $<
-
-# ---------------------------------------------------------------
-
-all: $(PKGNAME).sty $(PDFDOC) $(PDFDOCSUP)\
- $(TEXDOC) $(PKGNAME).ins
-
-# ---------------------------------------------------------------
-
-help:
- @-echo "******************************************************"
- @-echo "** Choisir une des options : *"
- @-echo "== Choose one of the options: *"
- @-echo "** 'all' pour produire tous les fichiers *"
- @-echo "== 'all' to produce all the files *"
- @-echo "** 'clean' suppression des fichiers auxiliaires *"
- @-echo "== 'clean' delete the auxiliary files *"
- @-echo "** 'distclean' pour ne conserver que les sources *"
- @-echo "== 'distclean' to keep only the sources *"
- @-echo "******************************************************"
-
-# ---------------------------------------------------------------
-
-dist: all clean
-
-# ---------------------------------------------------------------
-
-clean:
- @-rm -f $(GARBAGE)
-
-distclean: clean
- @-rm -f $(DECHETS)
- @-rm -f $(TEX)
- @-rm -f common.tex
-
-# ---------------------------------------------------------------
-
-texlive: dist
- @-rm -rf $(REPERTS)
- @-mkdir -p tex/latex/$(PKGNAME)
- @-mkdir -p doc/latex/$(PKGNAME)
- @-mkdir -p source/latex/$(PKGNAME)
- @-mkdir -p TEST
- @-cp $(TEX) tex/latex/$(PKGNAME)
- @-cp $(CTANDOC) doc/latex/$(PKGNAME)
- @-cp $(SOURCE) source/latex/$(PKGNAME)
- @-cp $(TESTSRC) TEST
- @-zip -r $(PKGNAME)-TEST TEST/
- @-mv $(PKGNAME)-TEST.zip source/latex/$(PKGNAME)/
- @-rm -rf TEST/
- @-mkdir -p $(PKGNAME)
- @-cp $(CTANDOC) ./$(PKGNAME)
- @-cp $(SOURCE) ./$(PKGNAME)
- @-cp $(TEX) ./$(PKGNAME)
-
-# ---------------------------------------------------------------
-
-zip: texlive
- @-rm -f $(PKGNAME).zip
- @-zip -r $(PKGNAME) $(REPERTS)
- @-rm -rf $(REPERTS)
- @-mv $(PKGNAME).zip $(PKGNAME).tds.zip
- @-zip -r $(PKGNAME) $(PKGNAME)
- @-zip -r $(PKGNAME) $(PKGNAME).tds.zip
- @-rm -rf $(PKGNAME)
- @-rm -f $(PKGNAME).tds.zip
-
-# ---------------------------------------------------------------
-
-ctan: zip distclean
-
-# ---------------------------------------------------------------
-
-doc: $(PKGNAME).ins $(PKGNAME).pdf $(PKGNAME)-doc.dtx
-
-$(PKGNAME).sty: $(PKGNAME).ins $(PKGNAME).dtx
-$(TEXDOC): $(PKGNAME).ins $(PKGNAME).dtx $(PKGNAME)-doc.dtx
-$(PDFDOC): $(TEXDOC)
-# ---------------------------------------------------------------
-# echu e an abaden
-# Le \TeX nicien de surface 2011/04/17, 2013/02/16
-
-
diff --git a/Master/texmf-dist/source/latex/paresse/README b/Master/texmf-dist/source/latex/paresse/README
deleted file mode 100644
index d26dabd8924..00000000000
--- a/Master/texmf-dist/source/latex/paresse/README
+++ /dev/null
@@ -1,54 +0,0 @@
-% Time-stamp: <2013-02-16 10:28:53 novatux>
-
-======================================================================
-
-PARESSE version 4.1 2013/02/16
-
-======================================================================
-
-This bundle should contain
-
-README % this file
-LISEZMOI % French version
-
-Makefile % for *nix users
-paresse.dtx
-paresse.ins
-paresse.sty % the style file
-paresseold.sto % style option file
-paresseutf8.sto % style option file
-
-paresse.pdf % code documented in English
-paresse-en.pdf % English documentation
-paresse-fr.pdf % French documentation
-paresse-ex-en.pdf % English Example
-paresse-ex-fr.pdf % French Example
-
-paresse-TEST.zip
-% archive containing files for test:
- ex-com-utf8-tame.tex
- ex-com-utf8-wild.tex
- test-latex-8bits-tame.tlx
- test-latex-8bits-wild.tlx
- test-latex-utf8-tame.tlx
- test-latex-utf8-wild.tlx
- test-lualatex-tame.llx
- test-lualatex-wild.llx
- test-xelatex-tame.xlx
- test-xelatex-wild.xlx
-
-paresse.tds.zip % the tds compliant archive
-
-======================================================================
-
-This package provides a means of typing "easily" greek letters
-with the least possible effort ;) It takes care only of the
-letters which have a macro name as \alpha or \Omega.
-
-======================================================================
-
-Happy TeXing and all that.
-
---
-Le \TeX nicien de surface
-le.texnicien.de.surface@wanadoo.fr
diff --git a/Master/texmf-dist/source/latex/paresse/paresse-TEST.zip b/Master/texmf-dist/source/latex/paresse/paresse-TEST.zip
deleted file mode 100644
index 8944a7f180f..00000000000
--- a/Master/texmf-dist/source/latex/paresse/paresse-TEST.zip
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/source/latex/paresse/paresse-doc.dtx b/Master/texmf-dist/source/latex/paresse/paresse-doc.dtx
deleted file mode 100644
index 5bb05124199..00000000000
--- a/Master/texmf-dist/source/latex/paresse/paresse-doc.dtx
+++ /dev/null
@@ -1,796 +0,0 @@
-% \iffalse meta-comment
-%-*- coding: iso-8859-15 -*-
-% Time-stamp: <2013-02-16 10:40:24 novatux>
-% --------------------------------------------------------------------
-%
-% Copyright (C) 2011, 2013
-% by Yvon Henel alias le TeXnicien de surface
-% <le.texnicien.de.surface@wanadoo.fr>
-%
-% --------------------------------------------------------------------
-%
-% This file may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.2
-% 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.2 or later is part of all distributions of LaTeX
-% version 1999/12/01 or later.
-% \fi
-%
-% \iffalse
-%<*doc>
-\documentclass[a4paper]{ltxdoc}
-\usepackage[latin1]{inputenc}
-\usepackage[T1]{fontenc}
-\usepackage[tame]{paresse}
-\usepackage{xspace,url,array,ifthen,hologo}
-\IfFileExists{lmodern.sty}{\usepackage{lmodern}}{}
-%<fr>\usepackage[english,frenchb]{babel}
-%<en>\usepackage[frenchb,english]{babel}
-\usepackage[colorlinks=true,
- linkcolor=blue,
- urlcolor=blue,
- citecolor=blue]{hyperref}
-\input{common}
-\makeatletter
-\newcommand\DescribeOption[1]{\@bsphack \marginpar{\raggedleft
- \textsc{#1}}\index{#1 (option)}\@esphack}
-\newcommand*\PS{\texttt{\S}\xspace}
-\newcommand*\PSVerb[1]{\texttt{\S #1}}
-%<*fr>
-\GlossaryPrologue{%
- \section*{{Changements}}
- \markboth{{Changements}}{{Changements}}}
-\IndexPrologue{%
- \section*{Index}\markboth{Index}{Index}%
- Les nombres en italique renvoient la page o l'entre est dcrite;
- les nombres souligns renvoient la ligne de code de la dfinition;
- les nombres en caractres romains renvoient la ligne de code o
- l'entre est utilise.}
-\def\generalname{Gnral}
-\def\SpecialMainEnvIndex#1{%
- \@bsphack\special@index{%
- #1\actualchar
- {\string\ttfamily\space#1}
- (environnement)%
- \encapchar main}%
- \special@index{environnements:\levelchar#1\actualchar{%
- \string\ttfamily\space#1}\encapchar
- main}\@esphack}
-\makeatother
-\newcommand{\CAD}{c.--d.\xspace}
-%</fr>
-\newcommand{\TO}{\textemdash\ \ignorespaces}
-\newcommand{\TF}{\unskip\ \textemdash\xspace}
-\newcommand\BOP{\discretionary{}{}{}}
-\newcommand\Option[1]{\textsc{#1}}
-\newcommand\Pkg[1]{\textsf{#1}}
-\newcommand\NOUVO[1][1]{%
- \ifthenelse
- {\equal{#1}{5}}
- {\marginpar{\hspace*{\stretch{1}}%
- \textbf{N (v5)}\hspace*{.5em}}}%
- {}}
-
-
-\EnableCrossrefs
-\CodelineIndex
-
-\begin{document}
-
-%<*fr>
-\title{Le module \Pkg{paresse}\thanks{Ce document correspond au
- fichier \Pkg{paresse}~\fileversion, du \filedate.}}
-%</fr>
-%<*en>
-\title{The package \Pkg{paresse}\thanks{This document corresponds
- to the file \Pkg{paresse}~\fileversion, dated \filedate.}
- \mbox{}\thanks{English translation by the author. Any comment
- about the translation is welcome.}}
-%</en>
-\author{Le \TeX nicien de surface\\
- \href{mailto:le.texnicien.de.surface@wanadoo.fr}%
- {le.texnicien.de.surface@wanadoo.fr}}
-\maketitle{}
-
-%<*fr>
-\begin{abstract}
- Ce module, reprenant un exemple de T.~\textsc{Lachand-Robert}
- dans~\cite{tlachand}, fournit un moyen de taper des lettres grecques
- isoles l'aide du caractre \PS actif et redfini. Au lieu de
- |\(\alpha\)| ou tape |a| pour obtenir \(\alpha\).
-
- \textbf{Important} : Il doit tre charg \textbf{aprs}
- \Pkg{inputenc} si ce dernier est utilis. De plus, il faut que le
- signe soit une lettre pour \TeX.
-
- Le fichier \texttt{paresse.pdf} contient le code comment en
- anglais.
-\end{abstract}
-\begin{otherlanguage}{english}
- \begin{abstract}
- This is the French documentation for the final user of the package
- \Pkg{paresse}. The English documentation for the final user is
- available in the file \texttt{paresse-en.pdf}.
- \end{abstract}
-\end{otherlanguage}
-%</fr>
-%<*en>
-\begin{abstract}
- This package implements an example from T.~\textsc{Lachand-Robert}
- in~\cite{tlachand}. It provides a means of typing isolated greek
- letters with the character activated and redefined. Instead of
- |\(\alpha\)| one types |a| to obtain \(\alpha\).
-
-\end{abstract}
-\begin{otherlanguage}{french}
- \begin{abstract}
- La documentation franaise pour l'utilisateur de l'extension
- \Pkg{paresse} est dsormais disponible sous le nom de
- \texttt{paresse-fr.pdf}.
-
- Le fichier \texttt{paresse.pdf} contient le code comment en
- anglais.
- \end{abstract}
-\end{otherlanguage}
-%</en>
-
-\tableofcontents{}
-
-\newpage
-
-%<fr>\section{Introduction}
-%<en>\section{Introduction}
-
-%<*fr>
-Cette extension ne fournit qu'un accs \og rapide et conomique \fg
-aux lettres grecques qui s'obtiennent l'aide d'une macro comme
-\cs{alpha} ou \cs{Omega}. Elle fournit un environnement et une commande
-qui permettent d'utiliser pour taper ces lettres. Un \cs{ensuremath}
-nous dispense de nous placer explicitement \TO c'est--dire en
-tapant |$ $| ou bien |\( \)| ou encore |\[ \]| ou tout autre chose
-ayant le mme effet\TF en mode mathmatique pour obtenir une lettre
-grecque.
-%</fr>
-%<*en>
-This package provides only a `quick and low-cost' access to greek
-letters which one can obtain with a macro such as \cs{alpha} or
-\cs{Omega}. It provides also an environment and a macro which make
-possible the use of to type in those letters. Because of an
-\cs{ensuremath} we are not bound to explicitly enter ---i.e. by typing
-|$ $| or |\( \)| or else |\[ \]| or anything whatsoever with the same
-effect--- mathematics mode to obtain a greek letter.
-%</en>
-
-%<*fr>
-L'ide de la mthode est due T.~\textsc{Lachand-Robert} et est
-expose dans~\cite{tlachand}. Je n'ai fait qu'ajouter le
-\cs{ensuremath} bien agrable pour l'criture de macros.
-%</fr>
-%<*en>
-The idea of the method is from T.~\textsc{Lachand-Robert} and
-described in~\cite{tlachand}. I have just add the \cs{ensuremath} which
-is so agreeable to write macros.
-%</en>
-
-%<*fr>
-Bien entendu, on \textbf{ne} dispose \textbf{pas} de macros pour la
-minuscule omicron ni pour les majuscules alpha, beta\dots{} qui
-s'obtiennent l'aide des latines romaines de mme
-apparence\footnote{Je ne ferai aucune remarque sur les problmes de
- codage que cela pose.}. Je ne me suis pas senti le courage ni la
-force de fournir une solution qui permettent d'obtenir dans une
-formule baignant dans un texte en italique gras un alpha majuscule
-droit, romain, \&c.
-%</fr>
-%<*en>
-There is \emph{no} macros for the lowercase omicron nor for the
-uppercase alpha, beta\dots{} that one can obtain with the latin roman
-letters with the same look. I have not had the courage nor the
-strength to build a solution which would provide a means of obtaining
-an upright uppercase alpha in a math formula enbedded in an italic
-boldfaced text.
-%</en>
-
-%<*fr>
-Pour finir cette introduction, glosons le nom de cette
-extension. |paresse| vient de ce que le signe indique un \og
-paragraphe \fg en ayant une forme lointainement apparente au
-S et n'a donc aucun lien avec le \emph{dfaut} si frquent,
-encore que, bien y rflchir\dots
-%</fr>
-%<*en>
-Even if the meaning of the French `paresse' is just `lazyness' I would
-like to enphasize that the name of this package comes from the fact
-that the sign can be used to point at a paragraph and looks like an
-S. So there is no connection between the name and the not unfrequent
-sin of the same (French) name\dots{} or maybe\dots{}
-%</en>
-
-
-%<fr>\section{Pourquoi une 4\ieme version?}
-%<en>\section{Why a 4th Version?}
-
-%<*fr>
-Je ne sais plus bien quelle occasion \TO l'age et les pannes de
-machine avec \og crachage\fg de disque aidant\TF et encore moins quand
-\TO si ce n'est que cela remonte plus d'un an maintenant\TF
-Christian \textsc{Tellechea} me faisait part de son dsir d'utiliser
-\Pkg{paresse} avec des sources codes en utf-8 sous \hologo{LaTeX} \TO
-et non \hologo{XeLaTeX} ou \hologo{LuaLaTeX}.
-
-Une discussion s'engagea, Christian me fit parvenir du matriel en
-ordre de marche. Il me fit mme cadeau de deux versions, la deuxime
-amliorant la reconnaissance du codage dclar avec
-\Pkg{inputenc}. Toutefois, je procrastinais. Il se peut que ma vie
-personnelle et mon travail aient interfr avec le dveloppement de
-cette extension.
-
-Enfin, voici la chose.
-%</fr>
-%<*en>
-I don't remember exactly on what occasion \TO age, disk crash and
-computer mishap aiding\TF and even less when \TO more than a year ago,
-I'm afraid\TF Christian \textsc{Tellechea} wrote me that he would be
-glad to use \Pkg{paresse} in his utf-8 encoded sources with
-\hologo{LaTeX} \TO not with \hologo{XeLaTeX} nor \hologo{LuaLaTeX}.
-
-We exchanged emails, Christian sent me working material. He even made
-me the gift of two versions, the second better for the identification
-of the encoding passed, as an option, to \Pkg{inputenc}. However I
-procrastinated. My personal life and my job may have interfered with
-the development of this package.
-
-At last, here is the thing.
-%</en>
-
-%<*fr>
-Le plus nouveau devrait chapper l'utilisateur de \hologo{LuaLaTeX}
-ou \hologo{XeLaTeX} et mme de \hologo{LaTeX} chargeant \Pkg{inputenc}
-avec une option comme \texttt{latin1} ou \texttt{latin9}. Cependant,
-dsormais, on peut utiliser cette extension avec \hologo{LaTeX} en
-chargeant \Pkg{inputenc} avec l'option \texttt{utf8}.
-%</fr>
-%<*en>
-The newest feature should escape the user of \hologo{LuaLaTeX}
-or \hologo{XeLaTeX} and even of \hologo{LaTeX} loading \Pkg{inputenc}
-with an option such as \texttt{latin1} or \texttt{latin9}. However,
-henceforth, one can use this package with \hologo{LaTeX} loading
-\Pkg{inputenc} with option \texttt{utf8}.
-%</en>
-
-%<*fr>
-J'ai profit de cette nouvelle version pour ajouter une macro en \PS:
-\NOUVO\PSVerb{Z} qui produit \S, symbole dj accessible par |\S|, ce qui
-fait que je n'ose pas vraiment parler de \og raccourci\fg.
-%</fr>
-%<*en>
-I take advantage of this new version to add a \PS-macro:
-\NOUVO\PSVerb{Z} which produces \S, symbol already available with
-|\S|, so I don't dare to present it as a real ``shortcut''.
-%</en>
-
-%<fr>\section{Pourquoi une 3\ieme version?}
-%<en>\section{Why a 3rd Version?}
-
-%<*fr>
-C'est par courriel que Claudio \textsc{Beccari} m'a signal trs
-aimablement qu'il existait un codage de l'alphabet grec en lettres
-latines prs de 15~ans avant que je ne commette cette extension. Ce
-codage tait d Sylvio \textsc{Levi} qui l'avait mis au point, alors
-qu'il dessinait les premires fontes grecques pour \TeX, en s'appuyant
-sur la correspondance entre les claviers amricain et grec. Il me
-faisait remarquer juste titre que si quelqu'un avait pris l'habitude
-du codage de Sylvio \textsc{Levi}, il prfrerait conserver ses
-habitudes pour \Pkg{paresse}.
-%</fr>
-%<*en>
-With a mail Claudio \textsc{Beccari} kindly informed me that there was
-an encoding of the greek alphabet with latin letters some 15~years
-before I commited this extension. This encoding was devised by Sylvio
-\textsc{Levi} who, at the time, was designing the first greek font for
-\TeX, using the correspondance between greek and US keyboard. Claudio
-wrote to me, and I can't but agree with him, that if one is used to
-\textsc{Levi}'s encoding, one would rather keep one's habit in order
-to use \Pkg{paresse}.
-%</en>
-
-%<*fr>
-J'ai donc dcid de fournir un nouveau couple d'options exclusives
-l'une de l'autre que j'ai nommes, pour l'une, \Option{legacy} ---
-pour \og hritage\fg --- qui assure le codage originel de cette
-extension et qui est active par dfaut et, pour l'autre, \Option{Levi}
-qui assure le codage de Sylvio \textsc{Levi}.
-%</fr>
-%<*en>
-I, then, decided to provide a new couple of mutually exclusive
-options: the first one is \Option{legacy} with which one obtain the
-original encoding of this extension and which is active by default,
-the other one is \Option{Levi} which provides Sylvio \textsc{Levi}'s
-encoding.
-%</en>
-
-%<*fr>
-J'en profite pour faire quelques changements cosmtiques:
-dsormais toutes les macros internes \emph{secrtes} ont un nom qui
-commence par \cs{GA@};
-le fichier |.dtx| est rorganis pour faciliter la tache de
-traduction de la documentation.
-%</fr>
-%<*en>
-I take advantage of this update to make some cosmetic changes: from
-now on all inner \emph{secret} macros have a name which begins with
-\cs{GA@}; the |.dtx| file is reorganised to facilitate the translation
-of the documentation.
-%</en>
-
-%<fr>\section{Utilisation}
-%<en>\section{Usage}
-
-%<*fr>
-On charge cette extension avec |\usepackage{paresse}| \textbf{aprs}
-l'extension \Pkg{inputenc} quand on utilise \hologo{LaTeX}. Il faut
-que la \og caractre \fg soit reconnu par \TeX\ comme une lettre. On
-pourra, par exemple, utiliser l'option |latin1| de \Pkg{inputenc} pour
-obtenir cela.
-
-On obtiendra le mme comportement, l'exception signale
-page~\pageref{restriction} prs, avec \Pkg{inputenc} et l'option
-\texttt{utf8}.\NOUVO
-
-Il n'y a pas ce genre de restriction quand on travaille avec
-\hologo{LuaLaTeX} ou \hologo{XeLaTeX} sur un source cod en
-UTF-8.\NOUVO
-%</fr>
-%<*en>
-One loads the package with |\usepackage{paresse}| \textbf{after} the
-package \Pkg{inputenc} when using \hologo{LaTeX}. The sign must be
-recognised as a letter by \TeX. On can use for instance \Pkg{inputenc}
-with option |latin1| for such a purpose.
-
-One will obtain the same behaviour, but for the exception
-pointed out on page~\pageref{restriction}, with \Pkg{inputenc} and
-option \texttt{utf8}.\NOUVO
-
-There is no such restriction when one compiles with \hologo{LuaLaTeX}
-or \hologo{XeLaTeX} a source encoded in UTF-8.\NOUVO
-%</en>
-
-%<*fr>
-Par dfaut, l'extension est charge avec l'option |wild| ce qui
-signifie que les macros de la forme |a| sont disponibles. Si l'on
-prfre, on peut passer |paresse| l'option \Option{tame} avec
-|\usepackage[tame]{paresse}|. Il faut alors utiliser la commande
-\cs{ActiveLaParesse} ou l'environnement |ParesseActive| pour utiliser
-les macros en .
-%</fr>
-%<*en>
-By default the package is loaded with option |wild| and so the macros
-such as |a| are immediately available. If one prefers one can choose
-the option \Option{tame} by writing |\usepackage[tame]{paresse}|. One
-must then use the command \cs{ActiveLaParesse} or the environment
-|ParesseActive| to use the `-macros'.
-%</en>
-
-%<*fr>
-Lorsque la \og paresse est active \fg, il suffit de taper |a| pour
-obtenir \(\alpha\). On a de mme accs toutes les lettres grecques
-auxquelles sont consacres une macro comme \cs{alpha},
-voyez~\ref{codageorig} et~\ref{codagelevi}. On obtient, de mme,
-\(\alpha^{\beta}\) avec |\(a^{b}\)| lorsque est active.
-%</fr>
-%<*en>
-When `paresse' is active, one has just to type |a| in to obtain
-\(\alpha\). One has access, by the same means, to all the other greek
-letters to which a macro is devoted such as \cs{alpha}, see the
-tables~\ref{codageorig} and~\ref{codagelevi}. One obtains
-\(\alpha^{\beta}\) with |\(a^{b}\)| when is active.
-%</en>
-
-%<*fr>
-On notera que les accolades sont optionelles et qu'on obtient un
-rsultat identique avec |\(a^b\)|, \textbf{ moins que} l'on utilise
-un source cod en utf-8 avec \hologo{LaTeX}.\label{restriction}
-%</fr>
-%<*en>
-One will note that the curly braces are \emph{not} compulsory and that
-one obtains the same result with just |\(a^b\)| \textbf{unless} one
-uses a utf-8 encoded source with \hologo{LaTeX}.\label{restriction}
-%</en>
-
-%<fr>\subsection{Les options}
-%<en>\subsection{Options}
-
-\begin{itemize}
-%<*fr>
-\item \Option{tame}\DescribeOption{tame / wild} s'oppose
- \Option{wild} qui est l'option par dfaut. Lorsque \Option{tame}
- rgne, il \textbf{faut} un environnement |ParesseActive| ou une
- commande \cs{ActiveLaParesse} pour utiliser les macros .
-%</fr>
-%<*en>
-\item \Option{tame}\DescribeOption{tame / wild} is the contrary of
- \Option{wild} which is the option by default. When \Option{tame}
- reigns, one \textbf{must} use an environment |ParesseActive| or a
- command \cs{ActiveLaParesse} in order to use the -macros.
-%</en>
-
-
-%<*fr>
-\item \Option{Levi}\DescribeOption{legacy / Levi} s'oppose
- \Option{legacy} qui est l'option par dfaut. Avec l'option
- \Option{legacy} on utilise le codage \og originel\fg de
- \Pkg{paresse.sty} tel que le donne la
- table~\ref{codageorig}. Sinon, le codage est celui dfini par Sylvio
- \textsc{Levi}, cf. la table~\ref{codagelevi}.
-%</fr>
-%<*en>
-\item \Option{Levi}\DescribeOption{legacy / Levi} is the
- contrary of \Option{legacy} which is the default. With
- \Option{legacy} one uses the original encoding of
- \Pkg{paresse.sty} as it is given by the
- table~\ref{codageorig}. If the option \Option{Levi} is enforced, one
- uses the Sylvio \textsc{Levi} encoding, see the
- table~\ref{codagelevi}.
-%</en>
-
-%<*fr>
-\item \Option{ttau}\DescribeOption{ttau / ttheta} s'oppose
- \Option{ttheta} qui est l'option par dfaut. Lorsque \Option{ttheta}
- est active |t| donne \(\theta\) dans le cas contraire |t| donne
- \(\tau\). En tous cas, \(\theta\) est accessible par |v| et
- \(\tau\) par |y|. Cette option est inoprante si l'option
- \Option{Levi} a t choisie.
-%</fr>
-%<*en>
-\item \Option{ttau}\DescribeOption{ttau / ttheta} is the contrary of
- \Option{ttheta} which is selected by default. When \Option{ttheta}
- is active |t| gives \(\theta\) in the contrary |t| gives
- \(\tau\). In all cases, \(\theta\) is given by |v| and \(\tau\) by
- |y|. That option is ineffective when one has chosen
- \Option{Levi}.
-%</en>
-
-%<*fr>
- \textbf{Remarque :} quand l'option \Option{legacy} a t choisie,
- \(\Theta\) est obtenu par |V| de manire \og rgulire \fg et
- \emph{galement} par |T| quelle que soit l'option choisie. Dans
- le cas de l'option \Option{Levi}, |V| ne correspond aucune lettre
- grecque.
-%</fr>
-%<*en>
-\textbf{Remark:} when one has chosen the option
-\Option{legacy}, \(\Theta\) is `regularly' obtained with |V| and
-\emph{also} with |T| whatever is the chosen option. In the case of
-the option \Option{Levi}, |V| doesn't correspond to any greek letter.
-%</en>
-
-%<*fr>
-\item \Option{epsilon}\DescribeOption{epsilon / varepsilon} s'oppose
- \Option{varepsilon} qui est l'option par dfaut. Avec
- \Option{epsilon}, |e| donne \(\epsilon\) sinon |e| donne
- \(\varepsilon\).
-%</fr>
-%<*en>
-\item \Option{epsilon}\DescribeOption{epsilon / varepsilon} is the
- contrary of \Option{varepsilon} which is selected by default. With
- \Option{epsilon}, |e| gives \(\epsilon\) otherwise |e| gives
- \(\varepsilon\).
-%</en>
-
-%<*fr>
-\item Se comportent comme le couple \Option{epsilon},
- \Option{varepsilon} les couples suivants \Option{theta} et
- \Option{vartheta} ; \Option{pi} et \Option{varpi} ; \Option{rho} et
- \Option{varrho} ; \Option{sigma} et \Option{varsigma} \og |s| donne
- \(\varsigma\)\fg; \Option{phi} et \Option{varphi}.
-%</fr>
-%<*en>
-\item The following `couples' behave as \Option{epsilon},
- \Option{varepsilon}: \Option{theta} and \Option{vartheta};
- \Option{pi} and \Option{varpi}; \Option{rho} and \Option{varrho};
- \Option{sigma} and \Option{varsigma}; \Option{phi} and
- \Option{varphi}.
-%</en>
-\end{itemize}
-
-%<*fr>
-Par dfaut on a \Option{varepsilon}, \Option{theta}, \Option{pi},
-\Option{rho}, \Option{sigma}, \Option{varphi}, \Option{wild} et
-\Option{legacy}. Cela assure que cette version~3, se comporte,
-par dfaut, comme la prcdente.
-%</fr>
-%<*en>
-The default options are \Option{varepsilon}, \Option{theta},
-\Option{pi}, \Option{rho}, \Option{sigma}, \Option{varphi},
-\Option{wild} and \Option{legacy}. That ensures that this 3rd
-version behaves, by default, as the preceding one.
-%</en>
-
-%<fr>\subsection{Commandes et environnement}
-%<en>\subsection{Commands and Environment}
-
-\DescribeMacro{\makeparesseletter}
-%<*fr>
-Cette macro donne au \og caractre \fg le catcode d'une
-lettre. Aprs cela, on peut se servir de dans un nom de macro, par
-exemple. C'est le pendant de \cs{makeatletter}.
-%</fr>
-%<*en>
-This command gives the letter-catcode to the `character' . After that
-one can use in the name of a macro, for instance. It corresponds to
-the well-known |\makeatletter|.
-%</en>
-
-\DescribeMacro{\makeparesseother}
-%<*fr>
-Cette macro donne au caractre le catcode \emph{other}. C'est le \og
-contraire \fg de la prcdente. Cela quivaut au \cs{makeatother}.
-
-Cette macro est inactive avec un codage utf-8 sous
-\hologo{LaTeX}. Elle n'aurait d'ailleurs pas vraiment de sens. Son
-utilisation produit un avertissement dans le fichier |.log|.
-%</fr>
-%<*en>
-This macro gives the catcode \emph{other} to the character . It is
-the `contrary' of the preceding one. It corresponds to |\makeatother|.
-
-This macro is inactivated when one uses a utf-8 encoding with
-\hologo{LaTeX}. In such a case it wouldn't have a clear meaning. When
-used it issues a warning in the |.log| file.
-%</en>
-
-\DescribeMacro{\ActiveLaParesse}
-%<*fr>
-Cette macro active le caractre et permet ainsi d'accder aux
-macros dont le nom commence par comme |a|. Pour une liste de ces
-macros et leurs significations, voyez les tableaux~\ref{codageorig}
-et~\ref{codagelevi}.
-%</fr>
-%<*en>
-This macro makes active and thus enable one to access the macros the
-name of which begins with such as |a|. A list of these macros and
-theirs meanings is given in the tables~\ref{codageorig}
-and~\ref{codagelevi}.
-%</en>
-
-\DescribeEnv{ParesseActive}
-%<*fr>
-Dans cet environnement le caractre est actif ce qui permet
-d'utiliser les macros en . On utilisera cet environnement si l'on
-veut utiliser les macros quand on a charg l'extension
-\Pkg{paresse} avec l'option \texttt{tame}.
-%</fr>
-%<*en>
-In this environment is active and one can use the -macros. One
-could use this environment if one want to use the -macros when the
-package \texttt{paresse.sty} is loaded whith the option \texttt{tame}.
-%</en>
-
-%<fr>\subsection{Tableaux des macros}
-%<en>\subsection{Tables of the Macros}
-
-%<fr>\subsubsection{Codage originel de \Pkg{paresse.sty}}
-%<en>\subsubsection{\Pkg{paresse.sty}'s Original Encoding}
-
-%<*fr>
-C'est le codage actif lorsque l'on a choisit l'option \Option{legacy} qui
-est l'option par dfaut.
-%</fr>
-%<*en>
-This is the active encoding when one choses the option \Option{legacy}
-which is the default.
-%</en>
-
-\begin{center}\Large
-\begin{ParesseActive} \label{codageorig}
-\begin{tabular}{*4{||>{\ttfamily \}c|c}||}\hline
-a & a & b & b & g & g & d & d\\ \hline
-e & e & z & z & h & h & v & v\\ \hline
-i & i & k & k & l & l & m & m\\ \hline
-n & n & x & x & p & p & r & r\\ \hline
-s & s & y & y & u & u & f & f\\ \hline
-c & c & q & q & w & w &\multicolumn{1}{c|}{}&\\ \hline\hline
-G & G & D & D & V & V & L & L\\ \hline
-X & X & P & P & S & S & U & U\\ \hline
-F & F & Q & Q & W & W & Z & Z\\ \hline
-\end{tabular}
-\end{ParesseActive}
-\end{center}
-
-%<*fr>
-\paragraph{Remarques : } l'exception de {\ActiveLaParesse v, y
-et q} les lettres utilises dans les noms des macros sont charges
-de vertu mnmotechniques \texttt{:-)} et les majuscules grecques
-s'obtiennent l'aide de la majuscule correspondante.
-%</fr>
-%<*en>
-\paragraph{Remarks : } all the latin letters used in the name of the
--macros, but for {\ActiveLaParesse v, y and q}, are loaded with
-reminiscences, I hope \texttt{:-)} and the greek uppercases are
-obtained with the (latin) corresponding uppercases.
-%</en>
-
-\pagebreak[4]
-
-%<fr>\subsubsection{Codage de Sylvio \textsc{Levi}}
-%<en>\subsubsection{Sylvio \textsc{Levi}'s Encoding}
-
-%<*fr>
-On active ce codage avec l'option \Option{Levi}.
-%</fr>
-%<*en>
-One make this encoding active with the option \Option{Levi}.
-%</en>
-
-\begin{center}\Large
-\begin{ParesseActive} \label{codagelevi}
-\begin{tabular}{*4{||>{\ttfamily \}c|c}||}\hline
-a & a & b & b & g & g & d & d\\ \hline
-e & e & z & z & h & h & j & v\\ \hline
-i & i & k & k & l & l & m & m\\ \hline
-n & n & x & x & p & p & r & r\\ \hline
-s & s & t & y & u & u & f & f\\ \hline
-q & c & y & q & w & w & c & \(\varsigma\)\\ \hline\hline
-G & G & D & D & J & V & L & L\\ \hline
-X & X & P & P & S & S & U & U\\ \hline
-F & F & Y & Q & W & W & Z & Z\\ \hline
-\end{tabular}
-\end{ParesseActive}
-\end{center}
-
-%<*fr>
-Le codage de Sylvio \textsc{Levi} donne accs directement \cs{varsigma}
-(\(\varsigma\)) avec |c| et ne diffre du codage originel que pour
-les lettres {\ActiveLaParesse v, y, c et q}. Voici un rsum de
-ces diffrences:
-%</fr>
-%<*en>
-Sylvio \textsc{Levi}'s encoding gives a direct acces to \cs{varsigma}
-(\(\varsigma\)) with |c| and is different from the original encoding
-just for the letters {\ActiveLaParesse v, y, c et q}. Here is a
-summary of theses differences:
-%</en>
-
-\begin{center}
-\newcommand\CT[1]{\multicolumn{1}{c|}{\texttt{#1}}}
-\begin{ParesseActive}
-\begin{tabular}{|l|*{7}{c|}}\hline
-%<fr>lettres grecques
-%<en>greek letters
-& v & y & c & q & V & Q & \(\varsigma\)\\\hline
-%<fr>codage originel
-%<en>original encoding
-&\CT{\v/\t}&\CT{\y/\t}&\CT{\c}
-&\CT{\q}&\CT{\V/\T}&\CT{\Q}& --- \\\hline
-%<fr>codage de S. \textsc{Levi}
-%<en>S. \textsc{Levi}'s encoding
-&\CT{\j}&\CT{\t}&\CT{\q}&\CT{\y}
-&\CT{\J}&\CT{\Y} & \CT{\c}\\\hline
-\end{tabular}
-\end{ParesseActive}
-\end{center}
-
-\begin{thebibliography}{99}
-%<fr>\addcontentsline{toc}{section}{Bibliographie}
-%<en>\addcontentsline{toc}{section}{References}
-\bibitem{tlachand} T.~\textsc{Lachand-Robert}.
-\emph{La matrise de \TeX{} et \LaTeX{}}.
-Masson, Paris, Milan, Barcelone, \oldstylenums{1995}.\\
-\textsc{isbn} : \texttt{2-225-84832-7}.
-\end{thebibliography}
-\PrintIndex
-\end{document}
-%</doc>
-%<*exemple>
-\documentclass[a4paper,12pt]{article}
-\usepackage[latin1]{inputenc}
-\usepackage[T1]{fontenc}
-\usepackage[tame]{paresse}
-% \usepackage{amsmath}
-\usepackage{xspace,array,fancyvrb}
-%<fr>\usepackage[frenchb]{babel}
-%<en>\usepackage[english]{babel}
-\IfFileExists{lmodern.sty}{\usepackage{lmodern}}{}
-\setlength{\parindent}{0pt}
-\newcommand\BOP{\discretionary{}{}{}}
-\begin{document}
-\pagestyle{empty}
-\begin{center}\large
-%<fr>Exemples d'utilisation de l'extension \texttt{paresse}.\\
-%<en>Examples of \texttt{paresse} package usage.\\
- le \TeX nicien de surface\\
- 2011-04-19
-\end{center}
-
-%<*fr>
-Ce fichier charge
-% les extensions \texttt{amsmath} et,
-l'extension \texttt{lmodern}
-si elle est disponible localement.%, \texttt{lmodern}.
-
-\textbf{Attention}: l'extension \texttt{paresse} est charge avec
-l'option \texttt{tame} pour montrer l'utilisation de la commande
-\verb!\ActiveLaParesse! et de l'environnement
-\verb!Pares!\BOP\verb!se!\BOP\verb!Ac!\BOP\verb!tive!.
-%</fr>
-%<*en>
-This file loads %the \texttt{amsmath} package and,
-the \texttt{lmodern} package if it locally exists.
-
-\textbf{Caution}: the \texttt{paresse} package is loaded with the
-option \texttt{tame} to show the usage of macro
-\verb!\ActiveLaParesse! and environment \verb!ParesseActive!.
-%</en>
-
-\vspace{\baselineskip}
-
-%<fr>Avec la commande \verb!\ActiveLaParesse! pour activer le caractre .
-%<en>With the macro \verb!\ActiveLaParesse! to make the character active.
-%<*fr>
-\begin{Verbatim}[frame=single]
-{\ActiveLaParesse
-\(a^{b}_{g}\) et encore \(D^a_d\)
-}
-\end{Verbatim}
-%</fr>
-%<*en>
-\begin{Verbatim}[frame=single]
-{\ActiveLaParesse
-\(a^{b}_{g}\) and also \(D^a_d\)
-}
-\end{Verbatim}
-%</en>
-%<fr>pour obtenir :
-%<en>to obtain:
-{\ActiveLaParesse \(a^{b}_{g}\)
-%<fr> et encore
-%<en> and also
-\(D^a_d\)}
-\vspace{\baselineskip}
-
-%<fr>Avec l'environnement \verb!ParesseActive!.
-%<en>With the environment \verb!ParesseActive!.
-
-\begin{Verbatim}[frame=single]
-\begin{ParesseActive}\large
-\begin{tabular}{*4{||>{\ttfamily \}c|c}||} \hline
-a & a & b & b & g & g & d & d\\ \hline
-e & e & z & z & h & h & v & v\\ \hline
-...
-X & X & P & P & S & S & U & U\\ \hline
-F & F & Q & Q & W & W & Z & Z\\ \hline
-\end{tabular}
-\end{ParesseActive}
-\end{Verbatim}
-
-\medskip
-
-\begin{center}
-\begin{ParesseActive}\large
-\begin{tabular}{*4{||>{\ttfamily \}c|c}||} \hline
-a & a & b & b & g & g & d & d\\ \hline
-e & e & z & z & h & h & v & v\\ \hline
-i & i & k & k & l & l & m & m\\ \hline
-n & n & x & x & p & p & r & r\\ \hline
-s & s & y & y & u & u & f & f\\ \hline
-c & c & q & q & w & w &\multicolumn{1}{c|}{}& \\ \hline\hline
-G & G & D & D & V & V & L & L\\ \hline
-X & X & P & P & S & S & U & U\\ \hline
-F & F & Q & Q & W & W & Z & Z\\ \hline
-\end{tabular}
-\end{ParesseActive}
-\end{center}
-\end{document}
-%</exemple>
-% \fi
-\endinput
-%%% Local Variables:
-%%% mode: doctex
-%%% fill-column: 70
-%%% coding: iso-8859-15
-%%% TeX-master: t
-%%% End:
diff --git a/Master/texmf-dist/source/latex/paresse/paresse.dtx b/Master/texmf-dist/source/latex/paresse/paresse.dtx
index 7b413fdbcb3..0bf79afefe4 100644
--- a/Master/texmf-dist/source/latex/paresse/paresse.dtx
+++ b/Master/texmf-dist/source/latex/paresse/paresse.dtx
@@ -1,414 +1,1236 @@
% \iffalse meta-comment
-%-*- coding: iso-8859-15 -*-
-% Time-stamp: <2013-02-16 10:32:18 novatux>
-% --------------------------------------------------------------------
-%
-% Copyright (C) 2011, 2013
-% by Yvon Henel alias le TeXnicien de surface
-% <le.texnicien.de.surface@wanadoo.fr>
-%
-% --------------------------------------------------------------------
-%
-% This file may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.2
-% 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.2 or later is part of all distributions of LaTeX
-% version 1999/12/01 or later.
-% \fi
+%% File: paresse.dtx
+%% Copyright (C) 2020 Yvon Henel aka Le TeXnicien de surface
+%%
+%% It may be distributed and/or modified under the conditions of the
+%% LaTeX Project Public License (LPPL), either version 1.3c of this
+%% license or (at your option) any later version. The latest version
+%% of this license is in the file
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
%
-% \iffalse
-%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-%<*common>
-\def\fileversion{v4.1}
-\def\filedate{2013/02/16}
-\def\fileinfo{fichier paresse par le TeXnicien de surface}
-%</common>
-%<*package>
-\ProvidesPackage{paresse}
- [\filedate\space\fileversion\space\fileinfo]
-%</package>
-% \fi
-% \iffalse
+%<*driver|package|doc>
+\RequirePackage{expl3}[2020/09/24]
+\GetIdInfo$Id: paresse.dtx 5.0.1 2020-10-06 TdS $
+ {}
+%</driver|package|doc>
%<*driver>
-\documentclass[a4paper]{ltxdoc}
-\usepackage[latin1]{inputenc}
-\usepackage[T1]{fontenc}
-\usepackage[tame]{paresse}
-\usepackage{xspace,url,array, ifthen}
-\IfFileExists{lmodern.sty}{\usepackage{lmodern}}{}
-\usepackage[frenchb,english]{babel}
-\usepackage{hypdoc,hologo}
+\documentclass[full, english, draft]{l3doc}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{amsmath}
+\usepackage[french,main=english]{babel}
+\usepackage{xspace}
+
+\usepackage{paresse}[2020-10-06]
\newcommand*\PS{\texttt{\S}\xspace}
\newcommand*\PSVerb[1]{\texttt{\S #1}}
\newcommand\BOP{\discretionary{}{}{}}
\newcommand\Option[1]{\textsc{#1}}
-\newcommand\Pkg[1]{\textsf{#1}}
-\newcommand\NOUVO[1][1]{%
- \ifthenelse
- {\equal{#1}{4.1}}
- {\marginpar{\hspace*{\stretch{1}}%
- \textbf{N (v4.1)}\hspace*{.5em}}}%
- {}}
-
-% commentez la ligne suivante pour avoir un document avec le code
-% \OnlyDescription
-% comment the preceding line to obtain a document with the code
-% puis cherchez \StopEventually pour d'ventuels rglages
-% then look for \StopEventually to make a bit of setup
-\EnableCrossrefs
-\CodelineIndex
-\RecordChanges
\begin{document}
- \DocInput{paresse.dtx}
+ \DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
-% \CheckSum{592}
+% \title{^^A
+% The \pkg{paresse} package^^A
+% \thanks{This file describes v\ExplFileVersion, last revised \ExplFileDate.}^^A
+% }
%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
+% \author{^^A
+% Yvon Henel\thanks^^A
+% {^^A
+% E-mail:
+% \href{mailto:le.texnicien.de.surface@yvon-henel.fr}
+% {le.texnicien.de.surface@yvon-henel.fr}^^A
+% }^^A
+% }
%
+% \date{Released \ExplFileDate}
%
-% \changes{v0.0}{2004/02/07}{New name, some redefinitions,
-% first public version}
+% \maketitle
+%
+% \changes{v0.0}{2004/02/07}{New name, some redefinitions, first public version}
% \changes{v1}{2004/04/17}{Documentation updated}
-% \changes{v1a}{2005/03/01}{Correction of a bug in Infofile which prevented the loading of the package}
+% \changes{v1a}{2005/03/01}{Correction of a bug in Infofile which prevented the
+% loading of the package}
% \changes{v2}{2008/08/13}{A useless macro is deleted}
% \changes{v2}{2008/08/13}{Documentation reorganised}
% \changes{v2}{2008/08/13}{New wrapping to provide a tds.zip.}
-% \changes{v2.1}{2008/08/16}{Correction of a bug in Infofile, once again}
+% \changes{v2.1}{2008/08/16}{Correction of a bug in Infofile, once again}
% \changes{v3}{2010/03/19}{Option for Sylvio \textsc{Levi}'s encoding}
% \changes{v4}{2011/04/16}{Documentation of the code in English}
% \changes{v4}{2011/04/16}{paresse goes utf8}
% \changes{v4.1}{2013/02/16}{Using skeyval-bc instead of (moving forward) skeyval}
+% \changes{v5.0}{2020/10/06}{Uses expl3 to replace skeyval.}
+% \changes{v5.0}{2020/10/06}{Two sub-packages.}
+% \changes{v5.0}{2020/10/06}{\cs{varsigma} is added as \PSVerb{j} to legacy encoding.}
+% \changes{v5.0.1}{2020/10/10}{Bug correction: keys ttheta and ttau had disappeared.}
+% \changes{v5.0.1}{2020/10/10}{Some changes in documentation.}
%
-% \GetFileInfo{paresse.sty}
+% \thispagestyle{empty}
+%
+% \noindent\hrulefill
%
-% \DoNotIndex{\newcommand,\newenvironment,\i,\ae,\oe,\DeclareOption,^^A
-% \ifthenelse,\if,\else,\fi,\tr@@c,\ExecuteOptions,\ProcessOptions,^^A
-% \relax,\MessageBreak,\CurrentOption,\RequirePackage,\PackageError,^^A
-% \def,\endinput,\let,\boolean,\newboolean,\setboolean,\renewcommand,^^A
-% \afterassignment,\global,\aftergroup,\bgroup,\egroup,\csname,^^A
-% \endcsname,\emph,\catcode,\space,\string,\next,\active,\rmfamily,\rule,^^A
-% \textsl,\upshape, \alpha, \beta, \gamma, \delta, \epsilon, ^^A
-% \varepsilon, \zeta, \eta, \theta, \vartheta, \iota, \kappa, ^^A
-% \lambda, \mu, \nu, \xi, \pi, \varpi, \rho, \varrho, \sigma, ^^A
-% \varsigma, \tau, \upsilon, \phi, \varphi, \chi, \psi, \omega, ^^A
-% \Delta, \Gamma, \Theta, \Lambda, \Xi, \Pi, \Sigma, \Upsilon, ^^A
-% \ExecuteOptionsX,\ProcessOptionsX,\DeclareOptionX,^^A
-% \DeclareUnicodeCharacter, \parse@XML@charref, ^^A
-% \parse@UTFviii@a, \parse@UTFviii@b, \AtBeginDocument, ^^A
-% \@eha, \@firstofone, \@gobble,\@toks, \@latex@error, ^^A
-% \begingroup, \endgroup, \gdef, \IeC, \ifcat, \ifcsname, ^^A
-% \ifluatex, \ifxetex, \iftogoff, \iftogon, \UTFviii@tmp, ^^A
-% \UTFviii@four@octets, \UTFviii@three@octets, \UTFviii@two@octets,^^A
-% \ifx, \the, \wlog, \togoff, \togon, \@ifpackageloaded, ^^A
-% \expandafter, \futurelet, \makeatletter, \makeatother, ^^A
-% \inputencodingname, \InputIfFileExists, \PackageInfo,^^A
-% \PackageWarning, \newtog, \ProvidesFile, \PS, \PSVerb, ^^A
-% \stop, \S, \usepackage, \temp@a, \define@bitogkeys, ^^A
-% \Phi, \Psi, \Omega, \newif, \ifnum, \count@, \ensuremath, ^^A
-% \~, \", \^} ^^A
+% \bgroup
+% \begin{otherlanguage}{french}
+% \begin{abstract}
+% Cette extension, reprenant un exemple de T.~\textsc{Lachand-Robert}
+% dans~\cite{tlachand}, fournit un moyen de taper des lettres grecques isolées
+% à l'aide du caractère \PS actif et redéfini. Au lieu de |\(\alpha\)| ou tape
+% \PSVerb{a} pour obtenir \(\alpha\).
%
-% \title{The package \Pkg{paresse}\thanks{This document corresponds
-% to file \Pkg{paresse.sty}~\fileversion, dated \filedate.}}
-% \author{Le \TeX nicien de surface\\
-% \href{mailto:le.texnicien.de.surface@wanadoo.fr}%
-% {le.texnicien.de.surface@wanadoo.fr}}
+% \textbf{Important} : Il doit être chargé \textbf{après} \pkg{inputenc} si ce
+% dernier est utilisé. De plus, il faut que le signe \PS soit une lettre pour
+% \TeX.
+%
+% Depuis la version~4, on peut utiliser cette extension même dans un source
+% codé en utf-8 avec \hologo{LaTeX}, \hologo{LuaLaTeX} ou \hologo{XeLaTeX}.
+%
+% La documentation française pour l'utilisateur de l'extension \pkg{paresse}
+% est disponible sous le nom de \texttt{paresse-fra}.
+% \end{abstract}
+% \end{otherlanguage}
+% \egroup
+%
+% \noindent\hrulefill
%
-% \maketitle
% \begin{abstract}
% This package implements an example from T.~\textsc{Lachand-Robert}
-% in~\cite{tlachand}. It provides a means of typing isolated greek
-% letters with the character \PS activated and redefined. Instead of
-% |\(\alpha\)| one types \PSVerb{a} to obtain \(\alpha\).
+% in~\cite{tlachand}. It provides a means of typing isolated greek letters
+% with the character \PS activated and redefined. Instead of |\(\alpha\)| one
+% types \PSVerb{a} to obtain \(\alpha\).
%
-% \textbf{Important}: You have to load it \textbf{after} the
-% \Pkg{inputenc} package if the latter is used. Moreover the sign
-% \PS must be a letter for \TeX.
-%
-% \textbf{New}: with this version~4, one can use this package even
-% with utf8-encoded source for \hologo{LaTeX}, \hologo{LuaLaTeX}, or
-% \hologo{XeLaTeX}.
+% \textbf{Important}: You have to load it \textbf{after} the \pkg{inputenc}
+% package if the latter is used. Moreover the sign \PS must be a letter for
+% \TeX.
%
-% The English documentation for the final user of the package
-% \Pkg{paresse} is available in the file \texttt{paresse-en.pdf}.
+% Since version~4, one can use this package even with utf8-encoded source for
+% \hologo{LaTeX}, \hologo{LuaLaTeX}, or \hologo{XeLaTeX}.
%
+% The English documentation for the final user of the package \pkg{paresse} is
+% available in the file \texttt{paresse-eng}.
% \end{abstract}
-% \begin{otherlanguage}{french}
-% \begin{abstract}
-% Ce module, reprenant un exemple de T.~\textsc{Lachand-Robert}
-% dans~\cite{tlachand}, fournit un moyen de taper des lettres
-% grecques isoles l'aide du caractre \PS actif et redfini. Au
-% lieu de |\(\alpha\)| ou tape \PSVerb{a} pour obtenir
-% \(\alpha\).
-%
-% \textbf{Important} : Il doit tre charg \textbf{aprs}
-% \Pkg{inputenc} si ce dernier est utilis. De plus, il faut
-% que le signe \PS soit une lettre pour \TeX.
%
-% \textbf{Nouveau}: avec cette version~4, on peut utiliser cette
-% extension mme dans un source cod en utf-8 avec \hologo{LaTeX},
-% \hologo{LuaLaTeX} ou \hologo{XeLaTeX}.
+% \noindent\hrulefill
%
-% La documentation franaise pour l'utilisateur de l'extension
-% \Pkg{paresse} est disponible sous le nom de
-% \texttt{paresse-fr.pdf}.
-% \end{abstract}
-% \end{otherlanguage}
+% \DisableDocumentation
%
-% \tableofcontents{}
+% \begin{documentation}
+% \end{documentation}
%
-% \StopEventually{
-% \begin{thebibliography}{99}
-% \addcontentsline{toc}{section}{Bibliographie}
-% \bibitem{tlachand} T.~\textsc{Lachand-Robert}.
-% \emph{La matrise de \TeX{} et \LaTeX{}}.
-% Masson, Paris, Milan, Barcelone, \oldstylenums{1995}.\\
-% \textsc{isbn} : \texttt{2-225-84832-7}.
-% \end{thebibliography}
-% \PrintChanges \PrintIndex}
% \iffalse
-%<*package>
+%<*doc>
+%<FRA>\documentclass[full, french]{l3doc}
+%<ENG>\documentclass[full, english]{l3doc}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+%<FRA>\usepackage[english,main=french]{babel}
+%<ENG>\usepackage[french,main=english]{babel}
+\usepackage{xparse}
+\usepackage{xspace}
+
+\usepackage[tame]{paresse}[2020-10-06]
+
+\newcommand*\PS{\texttt{\S}\xspace}
+\newcommand*\PSVerb[1]{\texttt{\S #1}}
+\newcommand\BOP{\discretionary{}{}{}}
+\newcommand\Option[1]{\textsc{#1}}
+\newcommand{\TO}{\textemdash\ \ignorespaces}
+\newcommand{\TF}{\unskip\ \textemdash\xspace}
+
+\begin{document}
+%<*FRA>
+\title{Guide de l'utilisateur de \pkg{paresse}\thanks{Ce fichier décrit la
+ version~\ExplFileVersion, dernière révision~\ExplFileDate. Édition
+ \emph{Adieu à skeyval}.}}
+%</FRA>
+%<*ENG>
+\title{\pkg{paresse} user guide\thanks{This file describes
+ version~\ExplFileVersion, last revised~\ExplFileDate. \emph{Adieu to
+ skeyval} edition.}}
+%</ENG>
+\author{Yvon Henel\thanks{E-mail:
+ \href{mailto:le.texnicien.de.surface@yvon-henel.fr}
+ {le.texnicien.de.surface@yvon-henel.fr}}}
+\maketitle
+\noindent\hrulefill
+
+\begin{abstract}
+%<*FRA>
+ Cette extension, reprenant un exemple de T.~\textsc{Lachand-Robert}
+ dans~\cite{tlachand}, fournit un moyen de taper des lettres grecques isolées
+ à l'aide du caractère \PS actif et redéfini. Au lieu de |\(\alpha\)| ou tape
+ \PSVerb{a} pour obtenir \(\alpha\).
+
+ \textbf{Important} : Il doit être chargé \textbf{après} \pkg{inputenc} si ce
+ dernier est utilisé. De plus, il faut que le signe \PS soit une lettre pour
+ \TeX.
+
+ Depuis la version~4, on peut utiliser cette extension même dans un source
+ codé en utf-8 avec \hologo{LaTeX}, \hologo{LuaLaTeX} ou \hologo{XeLaTeX}.
+%</FRA>
+%<*ENG>
+ This package implements an example from T.~\textsc{Lachand-Robert}
+ in~\cite{tlachand}. It provides a means of typing isolated greek letters
+ with the character \PS activated and redefined. Instead of |\(\alpha\)| one
+ types \PSVerb{a} to obtain \(\alpha\).
+
+ \textbf{Important}: You have to load it \textbf{after} the \pkg{inputenc}
+ package if the latter is used. Moreover the sign \PS must be a letter for
+ \TeX.
+
+ Since version~4, one can use this package even with utf8-encoded source for
+ \hologo{LaTeX}, \hologo{LuaLaTeX}, or \hologo{XeLaTeX}.
+%</ENG>
+\end{abstract}
+
+\noindent\hrulefill
+
+%<FRA> \begin{otherlanguage}{english}
+%<ENG> \begin{otherlanguage}{french}
+\begin{abstract}
+%<*FRA>
+The English documentation for the final user of the package
+\pkg{paresse} is available in the file \texttt{paresse-eng}.
+%</FRA>
+%<*ENG>
+La documentation française pour l'utilisateur de l'extension
+\pkg{paresse} est disponible sous le nom de \texttt{paresse-fra}.
+%</ENG>
+\end{abstract}
+\end{otherlanguage}
+
+\noindent\hrulefill
+\vspace{\baselineskip}
+
+\tableofcontents{}
+
+%<*FRA>
+\section{Introduction}
+\label{sec:introduction}
+
+Cette extension ne fournit qu'un accès \og rapide et économique \fg aux lettres
+grecques qui s'obtiennent à l'aide d'une macro comme \cs{alpha} ou
+\cs{Omega}. Elle fournit un environnement et une commande qui permettent
+d'utiliser § pour taper ces lettres. Un \cs{ensuremath} nous dispense de nous
+placer explicitement \TO c'est-à-dire en tapant |$ $| ou bien |\( \)| ou encore
+|\[ \]| ou tout autre chose ayant le même effet\TF en mode mathématique pour
+obtenir une lettre grecque.
+%</FRA>
+
+
+%<*ENG>
+\section{Introduction}
+\label{sec:introduction}
+
+This package provides only a `quick and low-cost' access to greek letters
+which one can obtain with a macro such as \cs{alpha} or \cs{Omega}. It
+provides also an environment and a macro which make possible the use of §
+to type in those letters. Because of an \cs{ensuremath} we are not bound to
+explicitly enter ---i.e. by typing |$ $| or |\( \)| or else |\[ \]| or
+anything whatsoever with the same effect--- mathematics mode to obtain a
+greek letter.
+%</ENG>
+
+%<*FRA>
+L'idée de la méthode est due à T.~\textsc{Lachand-Robert} et est
+exposée dans~\cite{tlachand}. Je n'ai fait qu'ajouter le
+\cs{ensuremath} bien agréable pour l'écriture de macros.
+%</FRA>
+%<*ENG>
+The idea of the method is from T.~\textsc{Lachand-Robert} and described
+in~\cite{tlachand}. I have just add the \cs{ensuremath} which is so
+agreeable to write macros.
+%</ENG>
+
+%<*FRA>
+Bien entendu, on \textbf{ne} dispose \textbf{pas} de macros pour la
+minuscule omicron ni pour les majuscules alpha, beta\dots{} qui
+s'obtiennent à l'aide des latines romaines de même
+apparence\footnote{Je ne ferai aucune remarque sur les problèmes de
+ codage que cela pose.}. Je ne me suis pas senti le courage ni la
+force de fournir une solution qui permettent d'obtenir dans une
+formule baignant dans un texte en italique gras un alpha majuscule
+droit, romain, \&c.
+%</FRA>
+%<*ENG>
+There is \emph{no} macros for the lowercase omicron nor for the
+uppercase alpha, beta\dots{} that one can obtain with the latin roman
+letters with the same look. I have not had the courage nor the
+strength to build a solution which would provide a means of obtaining
+an upright uppercase alpha in a math formula enbedded in an italic
+boldfaced text.
+%</ENG>
+
+%<*FRA>
+Pour finir cette introduction, glosons le nom de cette
+extension. |paresse| vient de ce que le signe § indique un \og
+paragraphe \fg en ayant une forme lointainement apparentée au
+S et n'a donc aucun lien avec le \emph{défaut} si fréquent,
+encore que, à bien y réfléchir\dots
+%</FRA>
+%<*ENG>
+Even if the meaning of the French `paresse' is just `lazyness' I would
+like to enphasize that the name of this package comes from the fact
+that the sign § can be used to point at a paragraph and looks like an
+S. So there is no connection between the name and the not unfrequent
+sin of the same (French) name\dots{} or maybe\dots{}
+%</ENG>
+
+%<FRA>\subsection{Pourquoi une 5\ieme version?}
+%<ENG>\subsection{Why a 5th Version?}
+
+%<*FRA>
+\emph{Sur mon brin de laurier, je dormais comme un loir} en utilisant
+\pkg{paresse} presque quotidiennement quand il y a quelques jours, patatras!
+Plus rien ne va, je me fais insulter rien qu'à charger l'extension. Je passe sur
+les détails: la faute en revient à une modification du noyau qui vient perturber
+le code acrobatique de \pkg{skeyval}. Comme la mise à jour de la dite extension
+semble extrèmement improbable, j'ai décidé de réparer \pkg{paresse} en recourant
+aux commandes de expl3.
+
+Ce n'est donc que pour remettre en marche ce dont je me sers souvent que je
+viens soulever le capot de cette extension vieille de plus de 7~ans.
+%</FRA>
+%<*ENG>
+I was happily using \pkg{paresse} almost every day until when, some days ago,
+all hell broke loose! I was insulted just by loading \pkg{paresse}. To put it in
+a nutshell: the culprit is an improvement of the \LaTeXe{} kernel which wreaks
+havoc in the highly unconventional code of \pkg{skeyval}. As it seems very
+improbable that that package will be corrected any time soon, I've decided to
+rewrite some parts of \pkg{paresse} with expl3.
+
+So that is why I touch the more than seven-year-old code of this package.
+%</ENG>
+
+%<*FRA>
+Avec cette 5\ieme version, apparaissent deux \emph{sous}-extensions:
+\pkg{paresse-old} et \pkg{paresse-utf8} que l'on peut charger directement et qui
+offrent les mêmes options et les mêmes commandes. De fait, \pkg{paresse} charge
+l'une ou l'autre suivant la situation.
+%</FRA>
+%<*ENG>
+With this 5th version come two \emph{sub}-packages: \pkg{paresse-old} and
+\pkg{paresse-utf8} which are directly loadable. They have the same options and
+commands as \pkg{paresse} itself. In fact \pkg{paresse} loads one of them
+according to the situation.
+%</ENG>
+
+%<*FRA>
+On utilisera \pkg{paresse-utf8} uniquement si le source est codé en utf-8 et que
+l'on compile avec \texttt{latex} c.-à-d. avec le moteur \TeX{} et le format
+\LaTeX{}. Dans tous les autres cas de figure on utilisera \pkg{paresse-old}.
+%</FRA>
+%<*ENG>
+One will use \pkg{paresse-utf8} if and only if the source is utf-8 encoded and
+compiled with \texttt{latex} i.~e. with the \TeX-engine and the \LaTeX{}
+format. In all other case, on will use \pkg{paresse-old}.
+%</ENG>
+
+%<*FRA>
+La documentation de \pkg{paresse} couvre donc l'utilisation des trois
+extensions.
+%</FRA>
+%<*ENG>
+The documentation of \pkg{paresse} covers the use of the three packages.
+%</ENG>
+
+%<FRA>\subsection{Pourquoi une 4\ieme version?}
+%<ENG>\subsection{Why a 4th Version?}
+
+%<*FRA>
+Je ne sais plus bien à quelle occasion \TO l'age et les pannes de machine
+avec \og crachage\fg de disque aidant\TF et encore moins quand \TO si ce
+n'est que cela remonte à plus d'un an maintenant\footnote{J'ai écrit cette
+ section à l'occasion de la sortie de la 4\ieme version, en 2013.}\TF
+Christian \textsc{Tellechea} me faisait part de son désir d'utiliser
+\pkg{paresse} avec des sources codées en utf-8 sous \hologo{LaTeX} \TO et
+non \hologo{XeLaTeX} ou \hologo{LuaLaTeX}.
+
+Une discussion s'engagea, Christian me fit parvenir du matériel en
+ordre de marche. Il me fit même cadeau de deux versions, la deuxième
+améliorant la reconnaissance du codage déclaré avec
+\pkg{inputenc}. Toutefois, je procrastinais. Il se peut que ma vie
+personnelle et mon travail aient interféré avec le développement de
+cette extension.
+
+Enfin, voici la chose.
+%</FRA>
+%<*ENG>
+I don't remember exactly on what occasion \TO age, disk crash and computer
+mishap aiding\TF and even less when \TO more than a year ago, I'm
+afraid\footnote{I wrote this section in 2013 when the 4th version was
+ published.}\TF Christian \textsc{Tellechea} wrote me that he would be
+glad to use \pkg{paresse} in his utf-8 encoded sources with \hologo{LaTeX}
+\TO not with \hologo{XeLaTeX} nor \hologo{LuaLaTeX}.
+
+We exchanged emails, Christian sent me working material. He even made
+me the gift of two versions, the second better for the identification
+of the encoding passed, as an option, to \pkg{inputenc}. However I
+procrastinated. My personal life and my job may have interfered with
+the development of this package.
+
+At last, here is the thing.
+%</ENG>
+
+%<*FRA>
+Le plus nouveau devrait échapper à l'utilisateur de \hologo{LuaLaTeX}
+ou \hologo{XeLaTeX} et même de \hologo{LaTeX} chargeant \pkg{inputenc}
+avec une option comme \texttt{latin1} ou \texttt{latin9}. Cependant,
+désormais, on peut utiliser cette extension avec \hologo{LaTeX} en
+chargeant \pkg{inputenc} avec l'option \texttt{utf8}.
+%</FRA>
+%<*ENG>
+The newest feature should escape the user of \hologo{LuaLaTeX}
+or \hologo{XeLaTeX} and even of \hologo{LaTeX} loading \pkg{inputenc}
+with an option such as \texttt{latin1} or \texttt{latin9}. However,
+henceforth, one can use this package with \hologo{LaTeX} loading
+\pkg{inputenc} with option \texttt{utf8}.
+%</ENG>
+
+%<*FRA>
+J'ai profité de cette nouvelle version pour ajouter une macro en \PS:
+\PSVerb{Z} qui produit \S, symbole déjà accessible par |\S|, ce qui
+fait que je n'ose pas vraiment parler de \og raccourci\fg.
+%</FRA>
+%<*ENG>
+I take advantage of this new version to add a \PS-macro:
+\PSVerb{Z} which produces \S, symbol already available with
+|\S|, so I don't dare to present it as a real ``shortcut''.
+%</ENG>
+
+%<FRA>\subsection{Pourquoi une 3\ieme version?}
+%<ENG>\subsection{Why a 3rd Version?}
+
+%<*FRA>
+C'est par courriel que Claudio \textsc{Beccari} m'a signalé très
+aimablement qu'il existait un codage de l'alphabet grec en lettres
+latines près de 15~ans avant que je ne commette cette extension. Ce
+codage était dû à Sylvio \textsc{Levi} qui l'avait mis au point, alors
+qu'il dessinait les premières fontes grecques pour \TeX, en s'appuyant
+sur la correspondance entre les claviers américain et grec. Il me
+faisait remarquer à juste titre que si quelqu'un avait pris l'habitude
+du codage de Sylvio \textsc{Levi}, il préférerait conserver ses
+habitudes pour \pkg{paresse}.
+%</FRA>
+%<*ENG>
+With a mail Claudio \textsc{Beccari} kindly informed me that there was
+an encoding of the greek alphabet with latin letters some 15~years
+before I commited this extension. This encoding was devised by Sylvio
+\textsc{Levi} who, at the time, was designing the first greek font for
+\TeX, using the correspondance between greek and US keyboard. Claudio
+wrote to me, and I can't but agree with him, that if one is used to
+\textsc{Levi}'s encoding, one would rather keep one's habit in order
+to use \pkg{paresse}.
+%</ENG>
+
+%<*FRA>
+J'ai donc décidé de fournir un nouveau couple d'options exclusives
+l'une de l'autre que j'ai nommées, pour l'une, \Option{legacy} ---
+pour \og héritage\fg --- qui assure le codage originel de cette
+extension et qui est active par défaut et, pour l'autre, \Option{Levi}
+qui assure le codage de Sylvio \textsc{Levi}.
+%</FRA>
+%<*ENG>
+I, then, decided to provide a new couple of mutually exclusive
+options: the first one is \Option{legacy} with which one obtain the
+original encoding of this extension and which is active by default,
+the other one is \Option{Levi} which provides Sylvio \textsc{Levi}'s
+encoding.
+%</ENG>
+
+%<*FRA>
+J'en profite pour faire quelques changements cosmétiques:
+désormais toutes les macros internes \emph{secrètes}\footnote{À la mode
+ \LaTeXe{}, pour la version~5.0 j'utilise en partie expl3 et, dans ce cas,
+ le préfixe \texttt{paresse}.} ont un nom qui
+commence par \cs{GA@};
+le fichier |.dtx| est réorganisé pour faciliter la tache de
+traduction de la documentation.
+%</FRA>
+%<*ENG>
+I take advantage of this update to make some cosmetic changes: from now on
+all inner \emph{secret} macros\footnote{Macros \emph{à la mode}
+ \LaTeXe{}. As of version~5.0, partially \emph{translated} in expl3, when
+ dealing with expl3 commands and variables I use the prefix
+ \texttt{paresse}.} have a name which begins with \cs{GA@}; the |.dtx|
+file is reorganised to facilitate the translation of the documentation.
+%</ENG>
+
+%<FRA>\section{Utilisation}
+%<ENG>\section{Usage}
+
+%<*FRA>
+On charge cette extension avec |\usepackage{paresse}|. Quand on utilise
+\hologo{LaTeX} avec un codage 8-bits (comme \texttt{latin9} par exemple),
+on la charge \textbf{après} l'extension \pkg{inputenc} avec l'option
+idoine. Avec un \hologo{LaTeX} moderne \TO post 2019\TF et un source codé
+en utf-8, on n'a pas besoin de charger explicitement \pkg{inputenc}. Dans
+ce cas, \pkg{paresse} suppose que le source est codé en utf-8.
+
+Dans tous les cas il faut que le \og caractère \fg § soit reconnu par \TeX\
+comme une lettre.
+
+% On pourra, par exemple, utiliser l'option \texttt{latin1} de
+% \pkg{inputenc} pour obtenir cela.
+
+On obtiendra le même comportement, à l'exception \TO signalée dans le
+paragraphe intitulé \textbf{restriction} page~\pageref{restriction}\TF
+près, avec \pkg{inputenc} et l'option \texttt{utf8}.
+
+Il n'y a pas ce genre de restriction quand on travaille avec
+\hologo{LuaLaTeX} ou \hologo{XeLaTeX} sur un source codé en utf-8.
+%</FRA>
+%<*ENG>
+One loads the package with |\usepackage{paresse}|.
+When one uses \hologo{LaTeX} with an 8-bit encoded source
+(e.g. \texttt{latin9}), one must load \pkg{paresse} \textbf{after} the
+package \pkg{inputenc} whith the correct option.
+
+In all cases the sign § must be recognised as a letter by \TeX.
+
+% On can use for instance \pkg{inputenc} with option |latin1| for such a
+% purpose.
+
+One will obtain the same behaviour, but for the exception pointed out in
+paragraph \textbf{restriction} on page~\pageref{restriction}, with
+\pkg{inputenc} and option \texttt{utf8}.
+
+There is no such restriction when one compiles with \hologo{LuaLaTeX}
+or \hologo{XeLaTeX} a source encoded in utf-8.
+%</ENG>
+
+%<*FRA>
+Par défaut, l'extension est chargée avec l'option |wild| ce qui
+signifie que les macros de la forme |§a| sont disponibles. Si l'on
+préfère, on peut passer à \pkg{paresse} l'option \Option{tame} avec
+|\usepackage[tame]|\BOP|{paresse}|. Il faut alors utiliser la commande
+\cs{ActiveLaParesse} ou l'environnement |ParesseActive| pour utiliser
+les macros en~§.
+%</FRA>
+%<*ENG>
+By default the package is loaded with option |wild| and so the macros
+such as |§a| are immediately available. If one prefers one can choose
+the option \Option{tame} by writing |\usepackage[tame]|\BOP|{paresse}|. One
+must then use the command \cs{ActiveLaParesse} or the environment
+|ParesseActive| to use the `§-macros'.
+%</ENG>
+
+%<*FRA>
+Lorsque la \og paresse est active \fg, il suffit de taper |§a| pour
+obtenir \(\alpha\). On a de même accès à toutes les lettres grecques
+auxquelles sont consacrées une macro comme \cs{alpha},
+voyez~\ref{codageorig} et~\ref{codagelevi}. On obtient, de même,
+\(\alpha^{\beta}\) avec |\(§a^{§b}\)| lorsque § est active.
+%</FRA>
+%<*ENG>
+When `paresse' is active, one has just to type |§a| in to obtain
+\(\alpha\). One has access, by the same means, to all the other greek
+letters to which a macro is devoted such as \cs{alpha}, see the
+tables~\ref{codageorig} and~\ref{codagelevi}. One obtains
+\(\alpha^{\beta}\) with |\(§a^{§b}\)| when § is active.
+%</ENG>
+
+\paragraph{Restriction}
+%<*FRA>
+On notera que les accolades sont optionelles et qu'on obtient un
+résultat identique avec |\(§a^§b\)|, \textbf{à moins que} l'on utilise
+un source codé en utf-8 avec \hologo{LaTeX}.\label{restriction}
+%</FRA>
+%<*ENG>
+One will note that the curly braces are \emph{not} compulsory and that
+one obtains the same result with just |\(§a^§b\)| \textbf{unless} one
+uses a utf-8 encoded source with \hologo{LaTeX}.\label{restriction}
+%</ENG>
+
+%<*ENG>
+\section{The Package Options}
+\label{sec:keys}
+
+In the margin the default options are in boldface.
+
+%</ENG>
+
+%<*FRA>
+\section{Les options de l'extension}
+\label{sec:clefs}
+
+Dans la marge, les options par défaut sont données en gras.
+
+%</FRA>
+
+\begin{itemize}
+%<*FRA>
+\item \Option{tame} \DescribeOption{tame / \textbf{wild}} s'oppose à
+ \Option{wild} qui est l'option par défaut. Lorsque \Option{tame}
+ règne, il \textbf{faut} un environnement |ParesseActive| ou une
+ commande \cs{ActiveLaParesse} pour utiliser les macros à §.
+%</FRA>
+%<*ENG>
+\item \Option{tame} \DescribeOption{tame / \textbf{wild}} is the contrary of
+ \Option{wild} which is the option by default. When \Option{tame}
+ reigns, one \textbf{must} use an environment |ParesseActive| or a
+ command \cs{ActiveLaParesse} in order to use the §-macros.
+%</ENG>
+
+
+%<*FRA>
+\item \Option{Levi} \DescribeOption{\textbf{legacy} / Levi} s'oppose à
+ \Option{legacy} qui est l'option par défaut. Avec l'option
+ \Option{legacy} on utilise le codage \og originel\fg de
+ \pkg{paresse} tel que le donne la
+ table~\ref{codageorig}. Sinon, le codage est celui défini par Sylvio
+ \textsc{Levi}, cf. la table~\ref{codagelevi}.
+%</FRA>
+%<*ENG>
+\item \Option{Levi} \DescribeOption{\textbf{legacy} / Levi} is the
+ contrary of \Option{legacy} which is the default. With
+ \Option{legacy} one uses the original encoding of
+ \pkg{paresse} as it is given by the
+ table~\ref{codageorig}. If the option \Option{Levi} is enforced, one
+ uses the Sylvio \textsc{Levi} encoding, see the
+ table~\ref{codagelevi}.
+%</ENG>
+
+%<*FRA>
+\item \Option{ttau} \DescribeOption{ttau / \textbf{ttheta}} s'oppose à
+ \Option{ttheta} qui est l'option par défaut. Lorsque \Option{ttheta}
+ est active |§t| donne \(\theta\) dans le cas contraire |§t| donne
+ \(\tau\). En tous cas, \(\theta\) est accessible par |§v| et
+ \(\tau\) par |§y|. Cette option est inopérante si l'option
+ \Option{Levi} a été choisie.
+%</FRA>
+%<*ENG>
+\item \Option{ttau} \DescribeOption{ttau / \textbf{ttheta}} is the contrary of
+ \Option{ttheta} which is selected by default. When \Option{ttheta}
+ is active |§t| gives \(\theta\) in the contrary |§t| gives
+ \(\tau\). In all cases, \(\theta\) is given by |§v| and \(\tau\) by
+ |§y|. That option is ineffective when one has chosen
+ \Option{Levi}.
+%</ENG>
+
+%<*FRA>
+ \textbf{Remarque :} quand l'option \Option{legacy} a été choisie,
+ \(\Theta\) est obtenu par |§V| de manière \og régulière \fg et
+ \emph{également} par |§T| quelle que soit l'option choisie. Dans
+ le cas de l'option \Option{Levi}, |§V| ne correspond à aucune lettre
+ grecque.
+%</FRA>
+%<*ENG>
+\textbf{Remark:} when one has chosen the option
+\Option{legacy}, \(\Theta\) is `regularly' obtained with |§V| and
+\emph{also} with |§T| whatever is the chosen option. In the case of
+the option \Option{Levi}, |§V| doesn't correspond to any greek letter.
+%</ENG>
+
+%<*FRA>
+\item \Option{epsilon} \DescribeOption{epsilon / \textbf{varepsilon}} s'oppose à
+ \Option{varepsilon} qui est l'option par défaut. Avec
+ \Option{epsilon}, |§e| donne \(\epsilon\) sinon |§e| donne
+ \(\varepsilon\).
+%</FRA>
+%<*ENG>
+\item \Option{epsilon} \DescribeOption{epsilon / \textbf{varepsilon}} is the
+ contrary of \Option{varepsilon} which is selected by default. With
+ \Option{epsilon}, |§e| gives \(\epsilon\) otherwise |§e| gives
+ \(\varepsilon\).
+%</ENG>
+
+%<*FRA>
+\item Se comportent comme le couple \Option{epsilon},
+ \Option{varepsilon} les couples suivants \Option{theta} et
+ \Option{vartheta} ; \Option{pi} et \Option{varpi} ; \Option{rho} et
+ \Option{varrho} ; \Option{sigma} et \Option{varsigma} \og |§s| donne
+ \(\varsigma\)\fg; \Option{phi} et \Option{varphi}.
+%</FRA>
+%<*ENG>
+\item The following `couples' behave as \Option{epsilon},
+ \Option{varepsilon}: \Option{theta} and \Option{vartheta};
+ \Option{pi} and \Option{varpi}; \Option{rho} and \Option{varrho};
+ \Option{sigma} and \Option{varsigma}; \Option{phi} and
+ \Option{varphi}.
+%</ENG>
+\end{itemize}
+
+%<*FRA>
+Par défaut on a \Option{varepsilon}, \Option{theta}, \Option{pi},
+\Option{rho}, \Option{sigma}, \Option{varphi}, \Option{wild} et
+\Option{legacy}. Cela assure que cette version~3, se comporte,
+par défaut, comme la précédente.
+%</FRA>
+%<*ENG>
+The default options are \Option{varepsilon}, \Option{theta},
+\Option{pi}, \Option{rho}, \Option{sigma}, \Option{varphi},
+\Option{wild} and \Option{legacy}. That ensures that this 3rd
+version behaves, by default, as the preceding one.
+%</ENG>
+
+%<FRA>\section{Commandes et environnement}
+%<ENG>\section{Commands and Environment}
+
+\DescribeMacro{\makeparesseletter}
+%<*FRA>
+Cette macro donne au \og caractère \fg § le catcode d'une
+lettre. Après cela, on peut se servir de § dans un nom de macro, par
+exemple. C'est le pendant de \cs{makeatletter}.
+%</FRA>
+%<*ENG>
+This command gives the letter-catcode to the `character' §. After that
+one can use § in the name of a macro, for instance. It corresponds to
+the well-known |\makeatletter|.
+%</ENG>
+
+\DescribeMacro{\makeparesseother}
+%<*FRA>
+Cette macro donne au caractère § le catcode \emph{other}. C'est le \og
+contraire \fg de la précédente. Cela équivaut au \cs{makeatother}.
+
+Cette macro est inactive avec un codage utf-8 sous
+\hologo{LaTeX}. Elle n'aurait d'ailleurs pas vraiment de sens. Son
+utilisation produit un avertissement dans le fichier |.log|.
+%</FRA>
+%<*ENG>
+This macro gives the catcode \emph{other} to the character §. It is
+the `contrary' of the preceding one. It corresponds to |\makeatother|.
+
+This macro is inactivated when one uses a utf-8 encoding with
+\hologo{LaTeX}. In such a case it wouldn't have a clear meaning. When
+used it issues a warning in the |.log| file.
+%</ENG>
+
+\DescribeMacro{\ActiveLaParesse}
+%<*FRA>
+Cette macro active le caractère § et permet ainsi d'accéder aux
+macros dont le nom commence par § comme |§a|. Pour une liste de ces
+macros et leurs significations, voyez les tableaux~\ref{codageorig}
+et~\ref{codagelevi}.
+%</FRA>
+%<*ENG>
+This macro makes § active and thus enable one to access the macros the
+name of which begins with § such as |§a|. A list of these macros and
+theirs meanings is given in the tables~\ref{codageorig}
+and~\ref{codagelevi}.
+%</ENG>
+
+\DescribeEnv{ParesseActive}
+%<*FRA>
+Dans cet environnement le caractère § est actif ce qui permet
+d'utiliser les macros en §. On utilisera cet environnement si l'on
+veut utiliser les macros quand on a chargé l'extension
+\pkg{paresse} avec l'option \texttt{tame}.
+%</FRA>
+%<*ENG>
+In this environment § is active and one can use the §-macros. One
+could use this environment if one want to use the §-macros when the
+package \texttt{paresse} is loaded whith the option \texttt{tame}.
+%</ENG>
+
+\newpage{}
+
+%<FRA>\section{Tableaux des macros}
+%<ENG>\section{Tables of the Macros}
+
+%<FRA>\subsection{Codage originel de \pkg{paresse}}
+%<ENG>\subsection{\pkg{paresse}'s Original Encoding}
+
+%<*FRA>
+C'est le codage actif lorsque l'on a choisit les options \Option{legacy} et
+\Option{ttheta} qui sont des options par défaut.
+
+Cette version~5.0 ajoute \(\varsigma\) obtenu avec \PSVerb{j}.
+%</FRA>
+%<*ENG>
+This is the active encoding when one choses the options \Option{legacy} and
+\Option{ttheta} which are the default.
+
+This version~5.0 adds \(\varsigma\) obtained with \PSVerb{j}.
+%</ENG>
+
+\begin{center}\Large
+\begin{ParesseActive} \label{codageorig}
+\begin{tabular}{*4{||>{\ttfamily \S}c|c}||}\hline
+a & §a & b & §b & g & §g & d & §d\\ \hline
+e & §e & z & §z & h & §h & v & §v\\ \hline
+i & §i & k & §k & l & §l & m & §m\\ \hline
+n & §n & x & §x & p & §p & r & §r\\ \hline
+s & §s & y & §y & u & §u & f & §f\\ \hline
+c & §c & q & §q & w & §w & j & §j\\ \hline\hline
+G & §G & D & §D & V & §V & L & §L\\ \hline
+X & §X & P & §P & S & §S & U & §U\\ \hline
+F & §F & Q & §Q & W & §W & Z & §Z\\ \hline
+\end{tabular}
+\end{ParesseActive}
+\end{center}
+
+\vspace{2\baselineskip}
+
+\begin{center}\Large
+\begin{ParesseActive} \label{codageorig}
+\begin{tabular}{*7{||>{\ttfamily \S}c|c}||}\hline
+a&§a&b&§b&c&§c&d&§d&e&§e&f&§f\\ \hline
+g&§g&h&§h&i&§i&j&§j&k&§k&l&§l\\ \hline
+m&§m&n&§n&o& &p&§p&q&§q&r&§r\\ \hline
+s&§s&t&§t&u&§u&v&§v&w&§w&x&§x\\ \hline
+y&§y&z&§z&A& &B& &C& &D&§D\\ \hline
+E& &F&§F&G&§G&H& &I& &J& \\ \hline
+K& &L&§L&M& &N& &O& &P&§P\\ \hline
+Q&§Q&R& &S&§S&T&§T&U&§U&V&§V\\ \hline
+W&§W&X&§X&Y& &Z&§Z&\multicolumn{4}{c||}{}\\ \hline
+\end{tabular}
+\end{ParesseActive}
+\end{center}
+
+
+%<*FRA>
+\paragraph{Remarques : } à l'exception de {\ActiveLaParesse §v, §y, §q et §j}
+les lettres utilisées dans les noms des macros sont chargées de vertu
+mnémotechniques \texttt{:-)} et les capitales grecques, quand elles différent
+des capitales latines, s'obtiennent à l'aide de la majuscule correspondante.
+%</FRA>
+%<*ENG>
+\paragraph{Remarks : } all the latin letters used in the name of the
+§-macros, but for {\ActiveLaParesse §v, §y, §q and §j}, are loaded with
+reminiscences, I hope \texttt{:-)} and the greek uppercases are
+obtained with the (latin) corresponding uppercases.
+%</ENG>
+
+\pagebreak[4]
+
+%<FRA>\subsection{Codage de Sylvio \textsc{Levi}}
+%<ENG>\subsection{Sylvio \textsc{Levi}'s Encoding}
+
+%<*FRA>
+On active ce codage avec l'option \Option{Levi}.
+%</FRA>
+%<*ENG>
+One make this encoding active with the option \Option{Levi}.
+%</ENG>
+
+\begin{center}\Large
+\begin{ParesseActive} \label{codagelevi}
+\begin{tabular}{*4{||>{\ttfamily \S}c|c}||}\hline
+a & §a & b & §b & g & §g & d & §d\\ \hline
+e & §e & z & §z & h & §h & j & §v\\ \hline
+i & §i & k & §k & l & §l & m & §m\\ \hline
+n & §n & x & §x & p & §p & r & §r\\ \hline
+s & §s & t & §y & u & §u & f & §f\\ \hline
+q & §c & y & §q & w & §w & c & \(\varsigma\)\\ \hline\hline
+G & §G & D & §D & J & §V & L & §L\\ \hline
+X & §X & P & §P & S & §S & U & §U\\ \hline
+F & §F & Y & §Q & W & §W & Z & §Z\\ \hline
+\end{tabular}
+\end{ParesseActive}
+\end{center}
+
+%<*FRA>
+Le codage de Sylvio \textsc{Levi} donne accès directement à \cs{varsigma}
+(\(\varsigma\)) avec |§c| et ne diffère du codage originel que pour
+les lettres {\ActiveLaParesse §v, §y, §c et §q}. Voici un résumé de
+ces différences:
+%</FRA>
+%<*ENG>
+Sylvio \textsc{Levi}'s encoding gives a direct acces to \cs{varsigma}
+(\(\varsigma\)) with |§c| and is different from the original encoding
+just for the letters {\ActiveLaParesse §v, §y, §c et §q}. Here is a
+summary of theses differences:
+%</ENG>
+
+\begin{center}
+\newcommand\CT[1]{\multicolumn{1}{c|}{\texttt{#1}}}
+\begin{ParesseActive}
+\begin{tabular}{|l|*{7}{c|}}\hline
+%<FRA>lettres grecques
+%<ENG>greek letters
+& §v & §y & §c & §q & §V & §Q & \(\varsigma\)\\\hline
+%<FRA>codage originel
+%<ENG>original encoding
+&\CT{\S{}v/\S{}t}&\CT{\S{}y/\S{}t}&\CT{\S{}c}
+&\CT{\S{}q}&\CT{\S{}V/\S{}T}&\CT{\S{}Q}& \CT{\S{}j} \\\hline
+%<FRA>codage de S. \textsc{Levi}
+%<ENG>S. \textsc{Levi}'s encoding
+&\CT{\S{}j}&\CT{\S{}t}&\CT{\S{}q}&\CT{\S{}y}
+&\CT{\S{}J}&\CT{\S{}Y} & \CT{\S{}c}\\\hline
+\end{tabular}
+\end{ParesseActive}
+\end{center}
+
+
+\vspace{\stretch{2}}
+
+\begin{thebibliography}{99}
+\addcontentsline{toc}{section}{Bibliographie}
+\bibitem{tlachand} T.~\textsc{Lachand-Robert}.
+\emph{La maîtrise de \TeX{} et \LaTeX{}}.
+Masson, Paris, Milan, Barcelone, \oldstylenums{1995}.
+\textsc{isbn} : \texttt{2-225-84832-7}.
+\end{thebibliography}
+
+\vspace{\stretch{2}}
+
+\noindent\hspace*{0.2\textwidth}\hrulefill\hspace*{0.2\textwidth}
+\begin{center}
+ \textsl{Le TeXnicien de Surface scripsit.}
+\end{center}
+\noindent\hspace*{0.2\textwidth}\hrulefill\hspace*{0.2\textwidth}
+
+\vspace*{\stretch{2}}
+
+\end{document}
+%</doc>
% \fi
-% \section{The code}
-%
-%
-% \subsection{The sty file}
-%
-% From the 4th version, I have used \Pkg{skeyval} for it provides
-% toggle-keys. But times are a-changing and so is \Pkg{skeyval}.
-% From this version 4.1, I use \Pkg{skeyval-bc} which retains the old
-% ways of \Pkg{skeyval}. \Pkg{skeyval-bc} loads \Pkg{xkeyval} the
-% macros of which I use to manage options.
+% \begin{implementation}
+%
+% \section{\pkg{paresse} implementation}
%
-% \Pkg{ifluatex} and \Pkg{ifxetex} are required to take care of
-% \hologo{LuaLaTeX} and \hologo{XeLaTeX} respectively.
+% Three packages are coded below: the main one \pkg{paresse} loads one of the
+% other two \pkg{paresse-old} or \pkg{paresse-utf8} depending on the
+% \TeX{}-engine used and the encoding of the source.
%
+% \iffalse
+%<*package>
+% \fi
+% The prefix is \texttt{paresse} for the three packages.
% \begin{macrocode}
-\RequirePackage{skeyval-bc}
-\RequirePackage{ifluatex}
-\RequirePackage{ifxetex}
+%<@@=paresse>
% \end{macrocode}
-%
-% With \cmd{\define@bitogkeys}, from \Pkg{skeyval-bc}, I define nine
-% pairs of complementary toggle keys. If one of the pair is set to
-% \texttt{true}, the other will be automatically set to \texttt{false}
-% and vice-versa.
+%
+% \iffalse
+%<*MAIN>
+% \fi
+% The main package \pkg{paresse} begins here.
% \begin{macrocode}
-\define@bitogkeys[GA]{paresse.sty}[GA@]{legacy}[true]{levi}{}{}
-\define@bitogkeys[GA]{paresse.sty}[GA@]{wild}[true]{tame}{}{}
-\define@bitogkeys[GA]{paresse.sty}[GA@]{ttau}[true]{ttheta}{}{}
-\define@bitogkeys[GA]{paresse.sty}[GA@]{varepsilon}[true]{epsilon}{}{}
-\define@bitogkeys[GA]{paresse.sty}[GA@]{varphi}[true]{phi}{}{}
-\define@bitogkeys[GA]{paresse.sty}[GA@]{pi}[true]{varpi}{}{}
-\define@bitogkeys[GA]{paresse.sty}[GA@]{sigma}[true]{varsigma}{}{}
-\define@bitogkeys[GA]{paresse.sty}[GA@]{rho}[true]{varrho}{}{}
-\define@bitogkeys[GA]{paresse.sty}[GA@]{theta}[true]{vartheta}{}{}
+\ProvidesExplPackage
+ {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
% \end{macrocode}
-%
-% I set the behaviour of the package in case of an unknown option
-% with \cmd{\DeclareOptionX*}, from \Pkg{xkeyval}.
+% \iffalse
+%</MAIN>
+% \fi
+% \iffalse
+%<*OLD>
+% \fi
+% Header of \pkg{paresse-old}:
% \begin{macrocode}
-\DeclareOptionX*{\PackageError{paresse} {The option "\CurrentOption"
- is not known!\MessageBreak The default options are:\MessageBreak
- legacy, varepsilon, theta, pi, rho, sigma, and varphi.}%
- {Choose between `wild' (for an active Paresse in all the document)
- \MessageBreak and `tame', so that the character obtained by
- \string\S\MessageBreak prints the section symbol \string\S).
- \MessageBreak See the documentation for other options.}}
+\ProvidesExplPackage
+ {\ExplFileName-old}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
% \end{macrocode}
+% \iffalse
+%</OLD>
+% \fi
+% \iffalse
+%<*UTF>
+% \fi
+% Header of \pkg{paresse-utf8}:
+% \begin{macrocode}
+\ProvidesExplPackage
+ {\ExplFileName-utf8}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
+% \end{macrocode}
+% \iffalse
+%</UTF>
+% \fi
%
-% The default options are: |legacy|, |wild|, |varepsilon|,
-% |theta|, |pi|, |rho|, |sigma|, and |varphi|.
-% \changes{v3}{2010/03/20}{Default option |legacy| added}
+% The three packages require \pkg{xparse} and \pkg{l3keys2}:
+% \begin{macrocode}
+\RequirePackage{xparse}
+\RequirePackage{l3keys2e}
+% \end{macrocode}
+% \iffalse
+%<*MAIN>
+% \fi
+% but the main \pkg{paresse} alone requires \pkg{iftex} to proceed according to
+% the \TeX-engine.
% \begin{macrocode}
-\ExecuteOptionsX[GA]{legacy,wild,varepsilon,theta,pi,rho,sigma,varphi}
-\ProcessOptionsX[GA]\relax
+\RequirePackage{iftex}
% \end{macrocode}
+% \iffalse
+%</MAIN>
+% \fi
%
-% The prefix of the \emph{secret} macros of this package is
-% |GA@|. Here I define the macros which will print the correct
-% character according to the chosen options. \cs{iftogon} is provided
-% by \Pkg{skeyval-bc}.
+% \iffalse
+%<*!MAIN>
+% \fi
% \begin{macrocode}
-\iftogon{GA@varepsilon}{%
- \def\GA@epsilon{\varepsilon}}{\def\GA@epsilon{\epsilon}}
-\iftogon{GA@vartheta}{\def\GA@theta{\vartheta}}{\def\GA@theta{\theta}}
-\iftogon{GA@varpi}{\def\GA@pi{\varpi}}{\def\GA@pi{\pi}}
-\iftogon{GA@varrho}{\def\GA@rho{\varrho}}{\def\GA@rho{\rho}}
-\iftogon{GA@varsigma}{\def\GA@sigma{\varsigma}}{\def\GA@sigma{\sigma}}
-\iftogon{GA@varphi}{\def\GA@phi{\varphi}}{\def\GA@phi{\phi}}
+\cs_if_exist:NF \@@_main_package_loaded:
+{
% \end{macrocode}
+% \iffalse
+%</!MAIN>
+% \fi
%
+% \begin{macrocode}
+\keys_define:nn {paresse}
+{
+ encoding_is_legacy .bool_set:N = \g_@@_encoding_is_legacy_bool,
+ encoding_is_levi .bool_set_inverse:N =
+ \g_@@_encoding_is_legacy_bool,
+ legacy .meta:n = {
+ encoding_is_legacy = #1
+ },
+ legacy .default:n = {true},
+ legacy .initial:n = {true},
+ levi .meta:n = {
+ encoding_is_levi = #1
+ },
+ levi .default:n = {true},
+ levi .initial:n = {false},
+
+ mood_is_wild .bool_set:N = \g_@@_mood_is_wild_bool,
+ mood_is_tame .bool_set_inverse:N =
+ \g_@@_mood_is_wild_bool,
+ wild .meta:n = {
+ mood_is_wild = #1
+ },
+ wild .default:n = {true},
+ wild .initial:n = {true},
+ tame .meta:n = {
+ mood_is_tame = #1
+ },
+ tame .default:n = {true},
+ tame .initial:n = {false},
+
+ letter_t_is_theta .bool_set:N = \g_@@_letter_t_is_theta_bool,
+ letter_t_is_tau .bool_set_inverse:N =
+ \g_@@_letter_t_is_theta_bool,
+ ttheta .meta:n = {
+ letter_t_is_theta = #1
+ },
+ ttheta .default:n = {true},
+ ttheta .initial:n = {true},
+ ttau .meta:n = {
+ letter_t_is_tau = #1
+ },
+ ttau .default:n = {true},
+ ttau .initial:n = {false},
+
+ letter_theta_is_theta .bool_set:N = \g_@@_letter_theta_is_theta_bool,
+ letter_theta_is_vartheta .bool_set_inverse:N =
+ \g_@@_letter_theta_is_theta_bool,
+ theta .meta:n = {
+ letter_theta_is_theta = #1
+ },
+ theta .default:n = {true},
+ theta .initial:n = {true},
+ vartheta .meta:n = {
+ letter_theta_is_vartheta = #1
+ },
+ vartheta .default:n = {true},
+ vartheta .initial:n = {false},
+
+ letter_pi_is_pi .bool_set:N = \g_@@_letter_pi_is_pi_bool,
+ letter_pi_is_varpi .bool_set_inverse:N =
+ \g_@@_letter_pi_is_pi_bool,
+ pi .meta:n = {
+ letter_pi_is_pi = #1
+ },
+ pi .default:n = {true},
+ pi .initial:n = {true},
+ varpi .meta:n = {
+ letter_pi_is_varpi = #1
+ },
+ varpi .default:n = {true},
+ varpi .initial:n = {false},
+
+ letter_rho_is_rho .bool_set:N = \g_@@_letter_rho_is_rho_bool,
+ letter_rho_is_varrho .bool_set_inverse:N =
+ \g_@@_letter_rho_is_rho_bool,
+ rho .meta:n = {
+ letter_rho_is_rho = #1
+ },
+ rho .default:n = {true},
+ rho .initial:n = {true},
+ varrho .meta:n = {
+ letter_rho_is_varrho = #1
+ },
+ varrho .default:n = {true},
+ varrho .initial:n = {false},
+
+ letter_sigma_is_sigma .bool_set:N = \g_@@_letter_sigma_is_sigma_bool,
+ letter_sigma_is_varsigma .bool_set_inverse:N =
+ \g_@@_letter_sigma_is_sigma_bool,
+ sigma .meta:n = {
+ letter_sigma_is_sigma = #1
+ },
+ sigma .default:n = {true},
+ sigma .initial:n = {true},
+ varsigma .meta:n = {
+ letter_sigma_is_varsigma = #1
+ },
+ varsigma .default:n = {true},
+ varsigma .initial:n = {false},
+
+ letter_epsilon_is_epsilon .bool_set:N =
+ \g_@@_letter_epsilon_is_epsilon_bool,
+ letter_epsilon_is_varepsilon .bool_set_inverse:N =
+ \g_@@_letter_epsilon_is_epsilon_bool,
+ epsilon .meta:n = {
+ letter_epsilon_is_epsilon = #1
+ },
+ epsilon .default:n = {true},
+ epsilon .initial:n = {false},
+ varepsilon .meta:n = {
+ letter_epsilon_is_varepsilon = #1
+ },
+ varepsilon .default:n = {true},
+ varepsilon .initial:n = {true},
+
+ letter_phi_is_phi .bool_set:N = \g_@@_letter_phi_is_phi_bool,
+ letter_phi_is_varphi .bool_set_inverse:N =
+ \g_@@_letter_phi_is_phi_bool,
+ phi .meta:n = {
+ letter_phi_is_phi = #1
+ },
+ phi .default:n = {true},
+ phi .initial:n = {false},
+ varphi .meta:n = {
+ letter_phi_is_varphi = #1
+ },
+ varphi .default:n = {true},
+ varphi .initial:n = {true},
+}
+% \end{macrocode}
%
-% I test the engine, it it is \hologo{XeTeX} or \hologo{LuaTeX}, the
-% file \texttt{paresseold.sto} is loaded.
% \begin{macrocode}
-\ifluatex
- \PackageInfo{paresse}{compiling with luatex}
- \InputIfFileExists{paresseold.sto}{%
- \PackageInfo{paresse}{paresseold loaded}}{%
- \PackageInfo{paresse}{paresseold not loaded}}
-\else
- \ifxetex
- \PackageInfo{paresse}{compiling with xetex}
- \InputIfFileExists{paresseold.sto}{%
- \PackageInfo{paresse}{paresseold loaded}}{%
- \PackageInfo{paresse}{paresseold not loaded}}
- \else
+\ProcessKeysOptions {paresse}
% \end{macrocode}
-% We arrive here if the working engine is good old \hologo{TeX} (in
-% fact, good not so old \hologo{eTeX} I hope for some things could
-% depend on \hologo{eTeX}-nical internals).
%
-% First some useful macros to take care of the encoding. The macros
-% have been given to me by Christian \textsc{Tellechea} I do heartily
-% thank for his kindness.
+% \begin{macrocode}
+\bool_if:nTF {\g_@@_letter_epsilon_is_epsilon_bool}
+{\cs_new:Npn \@@_epsilon {\epsilon}}
+{\cs_new:Npn \@@_epsilon {\varepsilon}}
+
+\bool_if:nTF {\g_@@_letter_theta_is_theta_bool}
+{\cs_new:Npn \@@_theta {\theta}}
+{\cs_new:Npn \@@_theta {\vartheta}}
+
+\bool_if:nTF {\g_@@_letter_pi_is_pi_bool}
+{\cs_new:Npn \@@_pi {\pi}}
+{\cs_new:Npn \@@_pi {\varpi}}
+
+\bool_if:nTF {\g_@@_letter_rho_is_rho_bool}
+{\cs_new:Npn \@@_rho {\rho}}
+{\cs_new:Npn \@@_rho {\varrho}}
+
+\bool_if:nTF {\g_@@_letter_sigma_is_sigma_bool}
+{\cs_new:Npn \@@_sigma {\sigma}}
+{\cs_new:Npn \@@_sigma {\varsigma}}
+
+\bool_if:nTF {\g_@@_letter_phi_is_phi_bool}
+{\cs_new:Npn \@@_phi {\phi}}
+{\cs_new:Npn \@@_phi {\varphi}}
+
+\bool_new:c {g__paresse_file_encoding_is_utf8_bool}
+% \end{macrocode}
%
-% The first one takes care of problems of encoding.
+% \iffalse
+%<*!MAIN>
+% \fi
+% \begin{macrocode}
+}
+% \end{macrocode}
+% \iffalse
+%</!MAIN>
+% \fi
+% \iffalse
+%<*MAIN>
+% \fi
% \begin{macrocode}
-\newcommand\encoding@error{%
- \@latex@error{%
- paresse needs inputenc loaded with option "utf8"
- or option such as "latin1" (8 bits encodign).}{}\stop}
+\cs_new:Nn \__paresse_main_package_loaded: {}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ifluatex
% \end{macrocode}
-% The second checks that \Pkg{inputenc} has been loaded before
-% \Pkg{paresse}.
+% luatex specific code
% \begin{macrocode}
-\@ifpackageloaded{inputenc}\relax
-{\PackageError{paresse}{%
- Please, load inputenc package before paresse}{%
- With LaTeX, "paresse" needs to know the encoding to work well and so
- the package "inputenc" must be loaded, with \string\usepackage, before
- loading "paresse" itself}}
+\PackageInfo{paresse}{compiling~with~luatex}
+\RequirePackageWithOptions{paresse-old}
+\else
% \end{macrocode}
-% The test for \Pkg{inputenc} and encoding is delayed at the beginning
-% of the document where all things about encoding should be settled.
+% code for other engines
% \begin{macrocode}
-\AtBeginDocument{%
- \@ifpackageloaded{inputenc}\find@encoding\encoding@error}
+\ifxetex
% \end{macrocode}
-% I create a new toggle |GA@utf8| and set it to \texttt{false}. It
-% will be used later to chose the correct action.
+% xetex specific code
% \begin{macrocode}
-\newtog[GA@]{utf8}[false]
+\PackageInfo{paresse}{compiling~with~xetex}
+\RequirePackageWithOptions{paresse-old}
+\else
% \end{macrocode}
-% A bit of code to find the declared encoding and set up the toggle
-% |GA@utf8| accordingly. There again work by Christian
-% \textsc{Tellechea}.
+% nor luatex nor xetex
% \begin{macrocode}
-\newcommand\find@encoding{%
+
+\PackageInfo{paresse}{compiling~with~tex}
+
+\newcommand\default@encoding@message{
+ \bool_gset_true:c {g__paresse_file_encoding_is_utf8_bool}
+ \PackageWarningNoLine{paresse}{
+ The~package~"paresse"~expects~a~"utf8"~encoded~file.~
+ In~case~of~an~8~bits~encoding,~
+ please~use~inputenc~with~the~correct~option}
+}
+
+\newcommand\find@encoding{
\begingroup
- \def\utf@encoding{utf8}%
- \def\temp@a{\togoff{GA@utf8}%
- \PackageInfo{paresse}{8-bit encoding expected\@gobble}}
+ \def\utf@encoding{utf8}
+ \def\temp@a{
+ \bool_gset_false:c {g__paresse_file_encoding_is_utf8_bool}
+ \PackageInfo{paresse}{8-bit~encoding~expected\@gobble}
+ }
\ifx\utf@encoding\inputencodingname
- \def\temp@a{\togon{GA@utf8}%
- \PackageInfo{paresse}{utf8 encoding detected\@gobble}}
+ \def\temp@a{
+ \bool_gset_true:c {g__paresse_file_encoding_is_utf8_bool}
+ \PackageInfo{paresse}{utf8~encoding~detected\@gobble}
+ }
\fi
\expandafter\endgroup\temp@a}
-% \end{macrocode}
-%
-% The main action is then delayed at the beginning of the document for
-% reasons already given above. In case the utf8 encoding has been
-% detected, the file \texttt{paresseutf8.sto} is loaded, otherwise it
-% is \texttt{paresseold.sto} once again.
-%
-% \cs{makeatletter} is needed to mimic the loading of a \texttt{sty}
-% file for, at the beginning of the document, |@| is no more a
-% letter. Naturally, we must revert |@| to its non-letter status at
-% the end of the loading.
-% \begin{macrocode}
-\AtBeginDocument{%
+
+\@ifpackageloaded{inputenc}
+{
+ \PackageInfo{paresse}{inputenc~loaded}
+}
+{
+ \PackageInfo{paresse}{inputenc~not~loaded,~utf8~expected\@gobble}
+}
+
+\AtBeginDocument
+{
+ \@ifpackageloaded{inputenc} \find@encoding \default@encoding@message
+ \ExplSyntaxOn
\makeatletter
- \iftogoff{GA@utf8}{%
- \InputIfFileExists{paresseold.sto}{%
- \PackageInfo{paresse}{old loaded\@gobble}}{%
- \PackageError{paresse}{paresseold.sto not found}{%
- The package "paresse" needs to load the file "paresseold.sto"
- but can't find it. Something seems to be broken in your TeX
- system}}}{%
- \InputIfFileExists{paresseutf8.sto}{%
- \PackageInfo{paresse}{utf8 loaded\@gobble}}{%
- \PackageError{paresse}{paresseutf8 not found}{%
- The package "paresse" needs to load the file "paresseutf8.sto"
- but can't find it. Something seems to be broken in your TeX
- system}}}
- \makeatother}
-\fi
-\fi
+ \bool_if:nTF {\use:c{g__paresse_file_encoding_is_utf8_bool}}
+ {
+ \PackageInfo{paresse}{charge~utf8}
+ \RequirePackageWithOptions{paresse-utf8}
+ }
+ {
+ \PackageInfo{paresse}{charge~vieux}
+ \RequirePackageWithOptions{paresse-old}
+ }
+ \makeatother
+ \ExplSyntaxOff
+}
+
+\fi % END OF ifxetex
+\fi % END OF ifluatex
% \end{macrocode}
-%
-% And that's all for the main file.
% \iffalse
-%</package>
+%</MAIN>
% \fi
+%
% \iffalse
-%<*oldpack>
+%<*OLD>
% \fi
-%
-%\subsection{The file paresseold.sto}
-%
-% This file will be loaded in all cases except when the working engine is
-% \hologo{LaTeX} with |[utf8]{inputenc}| loaded. |^^a7| is \TeX nical
-% code for the character I type, on my French keypad, with key \S.
-%
-% This is almost the content of the version~3 of
-% \texttt{paresse.sty}. The changes are the use of toggles provided by
-% \Pkg{skeyval-bc} and the appearance of \PSVerb{Z} to obtain \S ---
-% which is always available through \cs{S}\footnote{So could I speak
-% of \PSVerb{Z} in terms of ``shortcut''?}.
-%
-% \begin{macrocode}
-\ProvidesFile{paresseold.sto}
-% \end{macrocode}
-% Presentations made, I save the current category code (catcode) of
-% the character \PS and its definition in \cs{GA@LaVieilleParesse}.
% \begin{macrocode}
\count@=\catcode`\^^a7
\let\GA@LaVieilleParesse= ^^a7
-% \end{macrocode}
-% For sake of convienience, \PS is def'ed as |\S|.
-% \begin{macrocode}
\def\^^a7{\S}
-% \end{macrocode}
-%
-% Come some end-user macros. \cs{makeparesseletter} changes the
-% \DescribeMacro{\makeparesseletter} catcode of \PS to~\(11\) which is
-% the code of letter and \DescribeMacro{\makeparesseother}
-% \cs{makeparesseother} changes that code to~\(12\) the code of other
-% characters.
-% \begin{macrocode}
\newcommand{\makeparesseletter}{\catcode `\^^a7=11\relax}
\newcommand{\makeparesseother}{\catcode `\^^a7=12\relax}
-% \end{macrocode}
-% \cs{GA@MakeParesseActive} is an internal macro to activate \PS.
-% \DescribeMacro{\GA@MakeParesseActive}
-% Then come two macros to activate \PS for the remaining part of the
-% file. On of them is applied according to the catcode of \PS at the
-% beginning --- catcode saved in |\count@|.
-% \begin{macrocode}
\newcommand{\GA@MakeParesseActive}{\catcode `\^^a7=\active}
\def\GA@ActiveLaParessexii{\catcode `\^^a7=\active}
\def\GA@ActiveLaParessexiii{\catcode `\^^a7=\active
@@ -418,27 +1240,15 @@
\else
\let\GA@ActiveLaParesse \GA@ActiveLaParessexiii
\fi
-% \end{macrocode}
-%
-% It's time to provide one end-user macro and one environment useful
-% \DescribeMacro{\ActiveLaParesse}
-% \DescribeEnv{ParesseActive}
-% when the package has been loaded with option \Option{tame} to
-% locally activate \PS.
-% \begin{macrocode}
\newcommand{\ActiveLaParesse}{\GA@ActiveLaParesse}
\newenvironment{ParesseActive}{\GA@ActiveLaParesse}{}
-% \end{macrocode}
-%
-% Now come the definitions of the meanings of the \PS-macros. For
-% these definitions to work, \PS is made a letter.
-% \begin{macrocode}
+
\makeparesseletter
\def\^^a7a {\alpha}
\def\^^a7b {\beta}
\def\^^a7g {\gamma}
\def\^^a7d {\delta}
-\def\^^a7e {\GA@epsilon}
+\def\^^a7e {\__paresse_epsilon}
\def\^^a7z {\zeta}
\def\^^a7h {\eta}
\def\^^a7i {\iota}
@@ -447,39 +1257,35 @@
\def\^^a7m {\mu}
\def\^^a7n {\nu}
\def\^^a7x {\xi}
-\def\^^a7p {\GA@pi}
-\def\^^a7r {\GA@rho}
-\def\^^a7s {\GA@sigma}
+\def\^^a7p {\__paresse_pi}
+\def\^^a7r {\__paresse_rho}
+\def\^^a7s {\__paresse_sigma}
\def\^^a7u {\upsilon}
-\def\^^a7f {\GA@phi}
+\def\^^a7f {\__paresse_phi}
\def\^^a7w {\omega}
-% \end{macrocode}
-% In case of option \Option{legacy}, definitions of \PSVerb{v},
-% \PSVerb{y}, \PSVerb{c}, and \PSVerb{q} as in the first two versions
-% of this package.
-% \begin{macrocode}
-\iftogon{GA@legacy}{%
- \def\^^a7v {\GA@theta}
+
+\bool_if:nTF {\g__paresse_encoding_is_legacy_bool}
+{
+ \def\^^a7j {\varsigma}
+ \def\^^a7v {\__paresse_theta}
\def\^^a7y {\tau}
\def\^^a7c {\chi}
\def\^^a7q {\psi}
-% \end{macrocode}
-% Care is taken of options \Option{ttau} and \Option{ttheta}.
-% \begin{macrocode}
- \iftogon{GA@ttau}{\def\^^a7t {\tau}}{\def\^^a7t {\GA@theta}}}{%
-% \end{macrocode}
-% Definitions of the same \PSVerb{v}, \PSVerb{y}, \PSVerb{c}, and
-% \PSVerb{q} with option \Option{levi}. In that case, options
-% \Option{ttau} and \Option{ttheta} are no-op.
-% \begin{macrocode}
- \def\^^a7j {\GA@theta}
+ \bool_if:nTF {\g__paresse_letter_t_is_theta_bool}
+ {
+ \def\^^a7t {\__paresse_theta}
+ }
+ {
+ \def\^^a7t {\tau}
+ }
+}
+{
+ \def\^^a7j {\__paresse_theta}
\def\^^a7t {\tau}
\def\^^a7q {\chi}
\def\^^a7y {\psi}
- \def\^^a7c {\varsigma}}
-% \end{macrocode}
-% Upper case letters are treated thence:
-% \begin{macrocode}
+ \def\^^a7c {\varsigma}
+}
\def\^^a7G {\Gamma}
\def\^^a7D {\Delta}
\def\^^a7L {\Lambda}
@@ -489,74 +1295,32 @@
\def\^^a7F {\Phi}
\def\^^a7X {\Xi}
\def\^^a7W {\Omega}
-% \end{macrocode}
-% Once again \Option{legacy} vs. \Option{levi}:
-% \begin{macrocode}
-\iftogon{GA@legacy}{%
+\bool_if:nTF {\g__paresse_encoding_is_legacy_bool}
+{
\def\^^a7V {\Theta}
\def\^^a7T {\Theta}
\def\^^a7Q {\Psi}
-}{%
+}
+{
\def\^^a7J {\Theta}
\def\^^a7Y {\Psi}
-}%
-% \changes{va4}{2011/04/17}{\PSVerb{Z} added to produce \PS}
+}
\def\^^a7Z {\S}
-% \end{macrocode}
-%
-% The end is near! \PS is made active and the \PS-macros defined. This
-% is old code --- directly from~\cite{tlachand}.
-% \begin{macrocode}
\catcode `\^^a7=\active
\def^^a7#1{\ensuremath{\csname \string^^a7#1\endcsname}}
-% \end{macrocode}
-% In case option \Option{tame} is chosen, \PS is given its first
-% catcode and meaning back.
-% \begin{macrocode}
-\iftogon{GA@tame}{%
+
+\bool_if:nF {\g__paresse_mood_is_wild_bool}
+{
\catcode`\^^a7=\count@
\ifnum\count@=13 \let ^^a7=\GA@LaVieilleParesse \fi
-}%
+}
% \end{macrocode}
-%
-% And that's all for \texttt{paresseold.sto}.
-%
% \iffalse
-%</oldpack>
+%</OLD>
% \fi
% \iffalse
-%<*utf8pack>
+%<*UTF>
% \fi
-%
-%\subsection{The file paresseutf8.sto}
-%
-% This part is brand new. It deals with the document encoded in utf8
-% via |\usepackage[utf8]{fontenc}| and compiled with \hologo{LaTeX}.
-%
-% It is at the request of Christian \textsc{Tellechea} that this
-% package now deals with such source. Most of the macros of this part
-% were created by the same Christian.
-%
-% First a bit of identification
-% \begin{macrocode}
-\ProvidesFile{paresseutf8.sto}
-% \end{macrocode}
-% followed by code partially taken from \texttt{utf8.def} for I wanted
-% to implement the option \Option{tame} and, to do so, needed to
-% redeclare the character \PS. Four macros are used in such a
-% redeclaration and they are made unavailable outside preamble in
-% \texttt{utf8.def}.
-%
-% The original \cs{DeclareUnicodeCharacter} depends on
-% \cs{parse@XML@charref} which itself depends on \cs{parse@UTFviii@a}
-% and \cs{parse@UTFviii@b}. Those two last macros are defined in terms
-% of accessible macros. Therefore, I first create an alias of the last
-% two and then define \cs{declareunicodecharacter} and
-% \cs{GA@parse@XML@charref} in terms of the \emph{localised} version
-% of \cs{parse@UTFviii@a} and \cs{parse@UTFviii@b}.
-%
-% To be on the safe side, I repeat the invocations of catcode of
-% \texttt{utf8.def}.
% \begin{macrocode}
\begingroup
\catcode`\"=12
@@ -568,125 +1332,68 @@
\catcode`\~=13
\global\let\GA@parse@UTFviii@a=\parse@UTFviii@a
\global\let\GA@parse@UTFviii@b=\parse@UTFviii@b
-\gdef\declareunicodecharacter#1#2{%
+\gdef\declareunicodecharacter#1#2{
\count@"#1\relax
- \wlog{\space\space Redefining Unicode char U+#1 (decimal \the\count@)}%
+ \wlog{\space\space Redefining~Unicode~char~U+#1~(decimal~\the\count@)}
\begingroup
\GA@parse@XML@charref
- \def\UTFviii@two@octets##1##2{\csname u8:##1\string##2\endcsname}%
- \def\UTFviii@three@octets##1##2##3{\csname u8:##1%
- \string##2\string##3\endcsname}%
- \def\UTFviii@four@octets##1##2##3##4{\csname u8:##1%
- \string##2\string##3\string##4\endcsname}%
+ \def\UTFviii@two@octets##1##2{\csname u8:##1\string##2\endcsname}
+ \def\UTFviii@three@octets##1##2##3{\csname u8:##1
+ \string##2\string##3\endcsname}
+ \def\UTFviii@four@octets##1##2##3##4{\csname u8:##1
+ \string##2\string##3\string##4\endcsname}
\expandafter\expandafter\expandafter
\expandafter\expandafter\expandafter
\expandafter
- \gdef\UTFviii@tmp{\IeC{#2}}%
+ \gdef\UTFviii@tmp{\IeC{#2}}
\endgroup}
-\gdef\GA@parse@XML@charref{%
+\gdef\GA@parse@XML@charref{
\ifnum\count@<"A0\relax
\PackageError{inputenc}{Cannot\space define\space Unicode\space
char\space value\space <\space 00A0}\@eha
\else\ifnum\count@<"800\relax
- \GA@parse@UTFviii@a,%
- \GA@parse@UTFviii@b C\UTFviii@two@octets.,%
+ \GA@parse@UTFviii@a,
+ \GA@parse@UTFviii@b C\UTFviii@two@octets.,
\else\ifnum\count@<"10000\relax
- \GA@parse@UTFviii@a;%
- \GA@parse@UTFviii@a,%
- \GA@parse@UTFviii@b E\UTFviii@three@octets.{,;}%
+ \GA@parse@UTFviii@a;
+ \GA@parse@UTFviii@a,
+ \GA@parse@UTFviii@b E\UTFviii@three@octets.{,;}
\else
- \GA@parse@UTFviii@a;%
- \GA@parse@UTFviii@a,%
- \GA@parse@UTFviii@a!%
- \GA@parse@UTFviii@b F\UTFviii@four@octets.{!,;}%
+ \GA@parse@UTFviii@a;
+ \GA@parse@UTFviii@a,
+ \GA@parse@UTFviii@a!
+ \GA@parse@UTFviii@b F\UTFviii@four@octets.{!,;}
\fi
\fi
\fi}
\endgroup
-% \end{macrocode}
-% Here ends the \emph{localisation}.
-%
-% I provide the same macros as in the preceding case but in such a
-% context \cs{makeparesseother} doesn't make sense. It just produces a
-% warning.
-% \begin{macrocode}
\newcommand{\makeparesseletter}{\DeclareUnicodeCharacter{00A7}\S}
-\newcommand{\makeparesseother}{%
- \PackageWarning{paresse}{%
- Command \string\makeparesseother disabled}{%
+\newcommand{\makeparesseother}{
+ \PackageWarning{paresse}{
+ Command \string\makeparesseother disabled}{
The command \string\makeparesseother would have been meaningless
in the current context}}
-% \end{macrocode}
-%
-% The end-user macro \cs{ActiveLaParesse} and the corresponding
-% environment |ParesseActive|.
-%
-% The Unicode character of code \texttt{00A7} is made equal to the
-% macro \cs{@paresse}.
-% \begin{macrocode}
\newcommand{\ActiveLaParesse}{\declareunicodecharacter{00A7}\@paresse}
\newenvironment{ParesseActive}{\ActiveLaParesse}{}
-% \end{macrocode}
-%
-% It's time to prepare the definition of the \PS-macros. To begin with
-% we activate the character \PS.
-% \begin{macrocode}
\ActiveLaParesse
-% \end{macrocode}
-%
-% And now for the \emph{working} code: when the paresse is active, the
-% byte \texttt{00A7} is an alias for \cs{@paresse} and, because of the
-% following, the code \cs{@paresse}\meta{token} is changed into
-% \cs{@i@paresse}\meta{token} with the side effect that \cs{@toks} is
-% let to \meta{token}.
-% \begin{macrocode}
\def\@paresse{\futurelet\@toks\@i@paresse}
-% \end{macrocode}
-% Then if \meta{token}, now ``in'' \cs{@toks}, has the same category
-% than \texttt{a} --- hopefully a letter --- then we obtain
-% \cs{@ii@paresse} else \cs{S}.
-%
-% \begin{macrocode}
-\def\@i@paresse{%
+\def\@i@paresse{
\csname\ifcat a\@toks @ii@paresse\else S\fi\endcsname}
-% \end{macrocode}
-% At that point, the code which was \cs{@paresse}\meta{token} is
-% either \cs{S}\meta{token} or \cs{@ii@paresse} which awaits for an
-% argument. That argument will be the still present \meta{token}.
-%
-% If the command \cs{@paresse@}\meta{token} is defined then it does
-% its job, else we obtain \cs{S}\meta{token}.
-% \begin{macrocode}
-\def\@ii@paresse#1{%
+\def\@ii@paresse#1{
\ifcsname @paresse@#1\endcsname
\csname @paresse@#1\endcsname\expandafter\@gobble
\else
\expandafter\@firstofone
\fi{\S#1}}
-% \end{macrocode}
-%
-% The next macro is used to define the \PS-macros.
-%
-% I have not used it in \texttt{paresseold.sto} for that definition
-% prevent a feature I'm attached to, to wit, obtaining
-% \(\alpha^{\beta}\) with |\(|\PSVerb{a}|^|\PSVerb{b}|\)|. I would
-% have been loath to force some of the users to change their until now
-% working sources.
-% \begin{macrocode}
-\def\define@paresse@car#1#2{%
+\def\define@paresse@car#1#2{
\expandafter\def\csname @paresse@#1\endcsname{\ensuremath{#2}}}
-% \end{macrocode}
-%
-% From now on, there are just definitions of \PS-macros.
-%
-% The first one, \PSVerb{Z} is new.
-% \begin{macrocode}
+
\define@paresse@car Z\S
\define@paresse@car a\alpha
\define@paresse@car b\beta
\define@paresse@car g\gamma
\define@paresse@car d\delta
-\define@paresse@car e\GA@epsilon
+\define@paresse@car e\__paresse_epsilon
\define@paresse@car z\zeta
\define@paresse@car h\eta
\define@paresse@car i\iota
@@ -695,25 +1402,36 @@
\define@paresse@car m\mu
\define@paresse@car n\nu
\define@paresse@car x\xi
-\define@paresse@car p\GA@pi
-\define@paresse@car r\GA@rho
-\define@paresse@car s\GA@sigma
+\define@paresse@car p\__paresse_pi
+\define@paresse@car r\__paresse_rho
+\define@paresse@car s\__paresse_sigma
\define@paresse@car u\upsilon
-\define@paresse@car f\GA@phi
+\define@paresse@car f\__paresse_phi
\define@paresse@car w\omega
-\iftogon{GA@legacy}{%
- \define@paresse@car v\GA@theta
+
+\bool_if:nTF {\g__paresse_encoding_is_legacy_bool}
+{
+ \define@paresse@car j\varsigma
+ \define@paresse@car v\__paresse_theta
\define@paresse@car y\tau
\define@paresse@car c\chi
\define@paresse@car q\psi
- \iftogon{GA@ttau}{%
- \define@paresse@car t\tau}{%
- \define@paresse@car t\GA@theta}}{%
- \define@paresse@car j\GA@theta
+
+ \bool_if:nTF {\g__paresse_letter_t_is_theta_bool}
+ {
+ \define@paresse@car t\__paresse_theta
+ }
+ {
+ \define@paresse@car t\tau
+ }
+}
+{
+ \define@paresse@car j\__paresse_theta
\define@paresse@car t\tau
\define@paresse@car q\chi
\define@paresse@car y\psi
- \define@paresse@car c\varsigma}
+ \define@paresse@car c\varsigma
+}
\define@paresse@car G\Gamma
\define@paresse@car D\Delta
\define@paresse@car L\Lambda
@@ -723,30 +1441,44 @@
\define@paresse@car F\Phi
\define@paresse@car X\Xi
\define@paresse@car W\Omega
-\iftogon{GA@legacy}{%
+
+\bool_if:nTF {\g__paresse_encoding_is_legacy_bool}
+{
\define@paresse@car V\Theta
\define@paresse@car T\Theta
- \define@paresse@car Q\Psi}{%
+ \define@paresse@car Q\Psi
+}
+{
\define@paresse@car J\Theta
- \define@paresse@car Y\Psi}%
-% \end{macrocode}
-%
-% At the end of the package, if the option \Option{tame} is chosen, \PS
-% is made a letter again.
-% \begin{macrocode}
-\iftogon{GA@tame}{\makeparesseletter}
+ \define@paresse@car Y\Psi
+}
+
+\bool_if:nF {\g__paresse_mood_is_wild_bool}{\makeparesseletter}
% \end{macrocode}
-%
-% And that's all for the file \texttt{paresseutf8.sto}.
% \iffalse
-%</utf8pack>
+%</UTF>
+% \fi
+%
+% \iffalse
+%</package>
% \fi
+%
+% \end{implementation}
+%
% \Finale
+% \begin{thebibliography}{99}
+% \addcontentsline{toc}{section}{Bibliographie}
+% \bibitem{tlachand} T.~\textsc{Lachand-Robert}.
+% \emph{La maîtrise de \TeX{} et \LaTeX{}}.
+% Masson, Paris, Milan, Barcelone, \oldstylenums{1995}.
+% \textsc{isbn} : \texttt{2-225-84832-7}.
+% \end{thebibliography}
+% \PrintChanges\PrintIndex
+%
\endinput
%%% Local Variables:
%%% mode: doctex
-%%% fill-column: 70
-%%% coding: iso-8859-15
+%%% coding: utf-8
+%%% fill-column: 80
%%% TeX-master: t
%%% End:
-
diff --git a/Master/texmf-dist/source/latex/paresse/paresse.ins b/Master/texmf-dist/source/latex/paresse/paresse.ins
index f5079fc407d..89440093c4f 100644
--- a/Master/texmf-dist/source/latex/paresse/paresse.ins
+++ b/Master/texmf-dist/source/latex/paresse/paresse.ins
@@ -1,64 +1,36 @@
-%%
-%% Copyright (C) 2011, 2013
-%% by Yvon Henel alias Le TeXnicien de surface
-%% <le.texnicien.de.surface@wanadoo.fr>
-%%
-%% This file may be distributed and/or modified under the conditions of
-%% the LaTeX Project Public License, either version 1.2 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.2 or later is part of all distributions of LaTeX version
-%% 1999/12/01 or later.
-%%
-\input docstrip.tex
-\keepsilent
-\preamble
-This is a generated file.
+\iffalse meta-comment
-Copyright (C) 2011, 2013
-by Yvon Henel, alias le TeXnicien de surface
-<le.texnicien.de.surface@wanadoo.fr>
+File paresse.ins Copyright (C) 2020 Yvon Henel
-This file may be distributed and/or modified under the conditions of
-the LaTeX Project Public License, either version 1.2 of this license
-or (at your option) any later version. The latest version of this
-license is in:
+It may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version. The latest version
+of this license is in the file
http://www.latex-project.org/lppl.txt
-and version 1.2 or later is part of all distributions of LaTeX
-version 1999/12/01 or later.
-\endpreamble
+\fi
+\input l3docstrip.tex
\askforoverwritefalse
+
+\preamble
+
+Do not distribute this file without also distributing the
+source files specified above.
+
+Do not distribute a modified version of this file.
+
+\endpreamble
+
+\keepsilent
+
\generate{
- \file{paresse.sty}{\from{paresse.dtx}{common,package}}
- \file{paresseold.sto}{\from{paresse.dtx}{oldpack}}
- \file{paresseutf8.sto}{\from{paresse.dtx}{utf8pack}}
- \file{common.tex}{\from{paresse.dtx}{common}}
- \file{paresse-en.ltx}{\from{paresse-doc.dtx}{doc,en}}
- \file{paresse-fr.ltx}{\from{paresse-doc.dtx}{doc,fr}}
- \file{paresse-ex-fr.elx}{\from{paresse-doc.dtx}{exemple,fr}}
- \file{paresse-ex-en.elx}{\from{paresse-doc.dtx}{exemple,en}}
- }
-\obeyspaces
-\Msg{*****************************************************************}
-\Msg{* *}
-\Msg{* To finish the installation you have to move the following *}
-\Msg{* file into a directory searched by TeX: *}
-\Msg{* paresse.sty *}
-\Msg{*****************************************************************}
-\Msg{* Pour finir l'installation vous devez placer *}
-\Msg{* le fichier suivant dans un dossier parcouru par TeX: *}
-\Msg{* paresse.sty *}
-\Msg{* *}
-\Msg{* To produce the documentation read the README file *}
-\Msg{* Pour produire la documentation lire le fichier LISEZMOI *}
-\Msg{* *}
-\Msg{** Happy TeXing **}
-\Msg{** TeXez dans la joie ! **}
-\Msg{*****************************************************************}
+ \file{paresse.sty}{\from{paresse.dtx}{package,MAIN}}
+ \file{paresse-old.sty}{\from{paresse.dtx}{package,OLD}}
+ \file{paresse-utf8.sty}{\from{paresse.dtx}{package,UTF}}
+ \file{paresse-fra.tex}{\from{paresse.dtx}{doc,FRA}}
+ \file{paresse-eng.tex}{\from{paresse.dtx}{doc,ENG}}
+}
+
\endbatchfile
diff --git a/Master/texmf-dist/source/latex/parskip/parskip.dtx b/Master/texmf-dist/source/latex/parskip/parskip.dtx
index dd0a6b07dfe..6b4f87b48b0 100644
--- a/Master/texmf-dist/source/latex/parskip/parskip.dtx
+++ b/Master/texmf-dist/source/latex/parskip/parskip.dtx
@@ -107,6 +107,12 @@
% specify the vertical space between paragraphs. If the option is
% not given (or given without a value) then \verb=.5\baselineskip=
% plus \texttt{2pt} of stretch is assumed.
+% \item[\option{tocskip}]
+% By default the \cs{parskip} is zero within \cs{tableofcontents}
+% and similar lists, regardless of its value elsewhere. With the
+% option \texttt{tocskip} it can be given a different value. If
+% used without an explicit value you get the same \cs{parskip} as elsewhere
+% within these lists.
% \item[\option{indent}]
% With the package option \texttt{indent} it is possible to explicitly set
% the paragraph indentation. Using this option without a value keeps the
@@ -177,7 +183,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesPackage{parskip}[2020-01-22 v2.0d non-zero parskip adjustments]
+\ProvidesPackage{parskip}[2020-06-15 v2.0f non-zero parskip adjustments]
% \end{macrocode}
%
%
@@ -213,11 +219,21 @@
% flexibility. If given, one need to provide an explicit value which
% is then used as a separation (and it needs to contain any extra
% stretch if that is wanted, i.e., there is no extra stretch added
-% in this case).
+% in this case).
+% \changes{v2.0f}{2020/06/15}{Allow \texttt{skip} key without value
+% without a package error (gh/14)}
% \begin{macrocode}
-\DeclareStringOption{skip}
+\DeclareStringOption{skip}[]
% \end{macrocode}
%
+% The key \option{tocskip} defines the vertical separation inside the lists
+% \cs{tableofcontents}, \cs{listoffigures} and \cs{listoftables}. By
+% default there is no extra separatation (i.e., \texttt{0pt}). If
+% specified without a value the standard \cs{parskip} is used,
+% otherwise the given value.
+% \begin{macrocode}
+\DeclareStringOption[0pt]{tocskip}[\parskip]
+% \end{macrocode}
%
% Execute any package options:
% \begin{macrocode}
@@ -230,11 +246,10 @@
\ifx\parskip@skip\@empty
% \end{macrocode}
% If no \option{skip} was given (or it was empty) set \cs{parskip}
-% to \verb=.5\baselineskip= plus \texttt{2pt} stretch. This has to
-% be done in 2 steps as \cs{baselineskip} might already contain a stretch.
+% to half of \verb=.5\baselineskip= plus \texttt{2pt} stretch. Stretch
+% or shrink inside \cs{baselineskip} is ignored in this case.
% \begin{macrocode}
- \parskip.5\baselineskip
- \advance\parskip 0pt plus 2pt\relax
+ \parskip=.5\baselineskip plus 2pt\relax
\else
% \end{macrocode}
% Otherwise set it to the specified value:
@@ -280,7 +295,8 @@
% \topsep = \z@ % add nothing to \parskip before first item
%\end{verbatim}
%
-% However, if the user explicitly asked for a zero parskip (via the \option{skip} option) we
+% However, if the user explicitly asked for a zero parskip (via the
+% \option{skip} option) we
% shouldn't do this but rather keep the default list settings, so
% we better check for this.
%
@@ -319,12 +335,39 @@
% Within a table of contents or a list of figures we don't want any
% additional vertical spacing just because the individual lines in
% such a list are implemented as one-line paragraphs. So we locally
-% set the \cs{parskip} to zero. Should be really something that is
+% set the \cs{parskip} to zero by default. Should be really something that is
% done already in \LaTeX{}.
+% \changes{v2.0e}{2020/05/19}{Fix space at start of \cs{@starttoc} (gh/12)}
% \begin{macrocode}
\patchcmd\@starttoc
{\begingroup \makeatletter}
- {\begingroup \makeatletter \parskip\z@}
+ {\begingroup \makeatletter
+% \end{macrocode}
+% Just setting \cs{parskip} to zero as it was done in the original
+% version of the package, does not always work. If the list starts
+% out with an ordinary paragraph (and not with \cs{addvspace} as it
+% usually does) we will get a zero \cs{parskip} but the heading
+% above assumes we get the normal \cs{parskip} and has therefore
+% removed that amount from its own vertical skip. As long as the
+% parskip value is not too large people didn't notice that heading
+% and list moved closer to each other but if you use, say,
+% \texttt{[skip=20pt]} you will even see an overlap.
+%
+% We therefore do the following: we look at the last skip, undo it
+% and then issue a skip that is equal to \cs{parskip} +
+% \cs{lastskip}.
+% This way the skip seen by any following code has the right value
+% which is important for \cs{addvspace} calulations. Only then we
+% locally set \cs{parskip} to zero or rather to
+% \cs{parskip@tocskip}, the parameter that the user can set through
+% an option.
+% \changes{v2.0e}{2020/05/19}{Add \texttt{tocskip} option}
+% \begin{macrocode}
+ \skip@\lastskip
+ \advance\skip@\parskip
+ \vskip-\lastskip
+ \vskip\skip@
+ \parskip\parskip@tocskip}
{}{\typeout{Couldn't patch \string\@starttoc}}
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/pbalance/pbalance.dtx b/Master/texmf-dist/source/latex/pbalance/pbalance.dtx
new file mode 100644
index 00000000000..63876d52935
--- /dev/null
+++ b/Master/texmf-dist/source/latex/pbalance/pbalance.dtx
@@ -0,0 +1,1105 @@
+% \iffalse meta-comment
+% Copyright 2020 Nelson Lago <lago@ime.usp.br>
+%
+% 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 can be
+% found at http://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 Nelson Lago <lago@ime.usp.br>.
+%
+% \fi
+% \iffalse
+%
+%<package>\NeedsTeXFormat{LaTeX2e}[2015/01/01]
+%<package>\ProvidesPackage{pbalance}[2020/12/16 v1.0.1 Poor man's balance]
+%
+%<*driver>
+
+\documentclass{ltxdoc}
+
+\usepackage[hyperref,svgnames,x11names,table]{xcolor}
+\usepackage{url}
+\urlstyle{sf}
+\usepackage{hyperref}
+\hypersetup{
+ pdfborder={0 0 .6},
+ pdfborderstyle={/S/U/W .6},
+ urlbordercolor=DodgerBlue,
+ citebordercolor=White,
+ linkbordercolor=White,
+ filebordercolor=White,
+}
+
+\usepackage[draft]{pbalance}
+\makeatletter
+\dimgdef\@PBtmpHeight{0pt}
+\dimgdef\@PBtmpLeftHeight{0pt}
+\dimgdef\@PBtmpLeftFloatsHeight{0pt}
+\dimgdef\@PBtmpRightHeight{0pt}
+\dimgdef\@PBtmpRightFloatsHeight{0pt}
+\dimgdef\@PBtmpUsedLeft{0pt}
+\dimgdef\@PBtmpUsedRight{0pt}
+\makeatother
+
+\usepackage{libertinus}
+\usepackage[scale=.85]{sourcecodepro}
+
+%%\EnableCrossrefs
+%%\CodelineIndex
+\RecordChanges
+
+\OnlyDescription
+
+\begin{document}
+\DocInput{pbalance.dtx}
+\end{document}
+
+%</driver>
+%
+% \fi
+%
+% \CheckSum{0}
+%
+% \changes{v1.0}{2020/09/14}{Initial version}
+% \changes{v1.0.1}{2020/12/16}{Improvements to documentation}
+%
+% \GetFileInfo{pbalance.sty}
+%
+% \title{The \textsf{pbalance} (poor man's balance) package\thanks{This
+% document corresponds to \textsf{pbalance}~\fileversion, dated~\filedate.}}
+%
+% \author{
+% Nelson Lago\\
+% \texttt{lago@ime.usp.br}\\
+% ~\\
+% \url{https://gitlab.com/lago/pbalance}
+%}
+%
+% \maketitle
+%
+% \begin{abstract}
+%
+% This package tries to \emph{safely} make the columns on the last page
+% of a two-column document have approximately the same height. It should
+% ``just work'' without user intervention, which is particularly useful
+% for class authors, but also offers the user a command to adjust the
+% height of the columns. There are, however, three caveats:
+%
+% \begin{enumerate}
+% \item Results are adequate, but often not optimal;
+% \item In some very rare cases, the package may give up (the document
+% is generated correctly but the last page is not balanced);
+% \item The package demands additional \LaTeX{} passes.
+% \end{enumerate}
+%
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% First things first: this package is a \textbf{hack}. It is also
+% \textbf{beta} quality. However, I believe it is \emph{safe},
+% i.e., it should not generate incorrect output.
+%
+% In a two-column document, it is desirable for the columns in the last
+% page to have the same height (the columns should be ``balanced''). Two
+% packages (\texttt{balance} and \texttt{flushend}) try to provide this
+% in \LaTeX, but both may generate defective output in some circumstances.
+% This package tries to solve this problem.
+%
+% Balancing is often not possible: imagine a document with an odd number
+% of lines on the last page, or with ten lines of text together with an
+% image that takes the height of fifteen lines of text, or a document where
+% making columns the same height would leave a sectioning comand at the
+% bottom of the first column etc. Since such cases happen often, we consider
+% it enough for the columns to be ``not too unequal'', even when equal
+% heights might be possible (the algorithm cannot deliver better results
+% and, in fact, striving to make columns exactly the same height with it
+% may sometimes yield poor results, so we do not even try).
+%
+% \section{Usage}
+%
+% To use the package, add \verb|\usepackage{pbalance}| to the preamble
+% and things should ``just work''. However, the document will take more
+% \LaTeX{} passes to compile, and minute changes to it that would normally
+% need one additional \LaTeX{} pass will likely demand three. If you load
+% the package with the \verb|draft| option (or pass the \verb|draft|
+% option to the document class), balancing is disabled, alleviating the
+% need for extra passes during document preparation.
+%
+% If the last page does not have floats, footnotes, or marginpars, the
+% package simply uses \verb|\balance|, from the \texttt{balance} package;
+% otherwise it uses its own algorithm. You may instead use
+% \verb|\shrinkLastPage{some-measurement}| to manually define how much
+% shorter the first column of the last page should be. This, however, will
+% not eliminate the need for extra passes (the package needs to find out
+% which page is the last).
+%
+% If there are many floats near the end of the document, the \LaTeX{}
+% float placement parameters (\verb|\topfraction|, \verb|topnumber|,
+% etc.) may interfere negatively with the algorithm. In some rare
+% cases\footnote{For example, imagine a document in which page 5 is
+% a float page that happens to be the last one. We will balance page
+% 4, which is the last text page. Balancing page 4 may move a float
+% from the left to the right column, but this may in turn exceed the
+% maximum number of floats in the right column. As a result, one or
+% more floats may be deferred to page 5. At the same time, a float of
+% a different kind from page 5 may be pulled back to the extra space
+% that just opened up in page 4. Depending on the size of this float,
+% the text may no longer fit in page 4, making some text spill onto
+% page 5. This means page 5 is now the last text page and should then
+% be balanced instead of page 4. Oops!}, this may force the package
+% to give up on balancing (the document is still generated correctly
+% in this case). To minimize the chances of this outcome, it is
+% probably a good idea to make the parameters a little more liberal
+% than the default, for example:
+%
+% \begin{verbatim}
+%\setcounter{totalnumber}{5} % default 3
+%\setcounter{topnumber}{3} % default 2
+%\renewcommand{\topfraction}{.85} % default .7
+%\renewcommand{\textfraction}{.15} % default .2
+%\renewcommand{\floatpagefraction}{.75} % default .5, must be < \topfraction
+% \end{verbatim}
+%
+% \section{How does it work}
+%
+% This package works on two fronts:
+%
+% \begin{enumerate}
+%
+% \item It uses a \LaTeX{} pass to gather information: which is the last page?
+% Does it have floats? Footnotes? How much free space in each column?
+%
+% \item It uses this information in a subsequent pass to balance the last
+% page. If there are no floats or footnotes, it uses the balance
+% package; otherwise it uses the measurements collected to shrink
+% the first column (using \verb|\enlargethispage|) by a
+% ``reasonable'' amount.
+%
+% \end{enumerate}
+%
+% If measurements change between passes, either the document was edited
+% or \LaTeX{} is still adding crossrefs, citations, etc. In both cases,
+% the previously gathered data is bogus, so we start over. However, the
+% package cannot detect changes that happen between the ``collect data''
+% pass and the ``balance for the first time'' pass: it has to assume
+% that any change at this point is caused by the fact that we started
+% balancing (it can, however, detect whether the last text page changed;
+% if this happens, we give up balancing). If a small change (such as an
+% updated crossref adding or removing a line somewhere) slips through,
+% that is acceptable: we are not aiming at balancing perfectly anyway.
+% However, if the change is big (for example, the addition of the
+% bibliography block after running bibtex/biber), results will suffer.
+%
+% To prevent this, it would be ideal to only start the process after all
+% passes needed to stabilize the document have run. In practice, however,
+% this would be too hard to detect (and demand even more passes). What
+% we do instead is simply wait for two consecutive passes to result
+% in columns of the same size in the last page. When this happens, we
+% proceed to balance in the next pass and assume (quite reasonably) that,
+% as long as the document is not modified, the effect of concurrent
+% changes during that pass in the last page is small, so ignoring it
+% disturbs the balancing only slightly\footnote{Like I said on the
+% introduction: this package is a hack.}.
+%
+% \section{TODO / wish list}
+%
+% Some useful stuff we should consider implementing:
+%
+% \begin{itemize}
+%
+% \item add \verb|\if@twocolumn| tests to prevent crashes and
+% other problems;
+%
+% \item add options to (1) allow using the balance package on pages with
+% floats and (2) completely disable the balance package;
+%
+% \item make the mechanism able to work with any page, not just the last,
+% and with more than one page at once. This is useful for the last
+% page of each chapter of a two-column book, for example;
+%
+% \item on top of that:
+% \begin{enumerate}
+% \item create command to manually indicate the page numbers to balance
+% \item create command similar to \verb|\balance| from the
+% \texttt{balance} package
+% \item allow user to set manual balancing for each page independently
+% \end{enumerate}
+%
+% \end{itemize}
+%
+% \StopEventually{\PrintChanges}
+%
+% \section{The implementation}
+%
+% We define \verb|\@PBlastPage| using \texttt{zref-abspage}; It is the page
+% number for the last page of text. This might \emph{not} be the last page
+% of the document: there may be one or more float pages after it. Still,
+% it \emph{is} the page we want to balance. We do not act on it, however;
+% instead, we save its value to the aux file as \verb|\@PBprevLastPage| and
+% proceed to balance on the next \LaTeX{} pass.
+%
+% We also define two toggles:
+%
+% \begin{description}
+% \item[\texttt{@PBstabilized}] There have been a few passes
+% already and the document has apparently stabilized.
+% \item[\texttt{@PBimpossible}] We tried to balance on a
+% previous pass and failed.
+% \end{description}
+%
+% \subsection{Initialization, required packages etc.}
+%
+% Besides some other required packages, here we load the \texttt{balance}
+% package; if there are no floats or footnotes involved, we will simply use
+% it. We need to load it after we modify \verb|\@outputdblcol|, so we use
+% \verb|\AtEndOfPackage|.
+%
+% We also define the \texttt{draft} option, which disables processing.
+%
+% \begin{macrocode}
+
+\RequirePackage{etoolbox}
+\RequirePackage{expl3}
+\RequirePackage{atbegshi} % Manipulate the page output routine
+\RequirePackage{atveryend} % Write to the aux file after processing ends
+\RequirePackage{zref-abspage} % Figure out the current page
+
+\AtEndOfPackage{\RequirePackage{balance}}
+
+% See https://github.com/latex3/latex2e/issues/399#issuecomment-703081793
+\gdef \@reinserts{%
+ \ifvbox\@kludgeins\insert\@kludgeins
+ {\unvbox\@kludgeins}\fi
+ \ifvoid\footins\else\insert\footins{\unvbox\footins}\fi
+}
+
+\providetoggle{@PBstabilized}
+\providetoggle{@PBimpossible}
+
+\newtoggle{@PBdraft}
+\DeclareOption{draft}{\toggletrue{@PBdraft}}
+\ProcessOptions\relax
+
+% \end{macrocode}
+
+% \subsection{The balancing front}
+%
+% The basic balancing process is reasonably simple: right before each
+% new page, check whether it should be balanced. If so, add the adequate
+% code to the top of the page (either call \verb|\balance|, from the
+% \texttt{balance} package, or add \verb|\enlargethispage|).
+%
+% \begin{macrocode}
+
+% Right before the first page
+\AtBeginDocument{
+ \@PBifShouldBalanceNascentPage
+ {\@PBStartBalancing}
+ {}
+}
+
+% Right before all other pages
+\AtBeginShipout{
+ \@PBifShouldBalanceNascentPage
+ {\@PBStartBalancing}
+ {}
+}
+
+\newcommand\@PBifShouldBalanceNascentPage[2]{
+ \ifboolexpr
+ {
+ togl {@PBdraft}
+ or not togl {@PBstabilized}
+ or test {\ifdefvoid{\@PBprevLastPage}}
+ }
+ {#2}
+ {
+ % abspage refers to the finished page, not the nascent page
+ \ifnumcomp{\@PBprevLastPage - 1}{=}{\value{abspage}}
+ {#1}
+ {#2}
+ }
+}
+
+% Let's give the user a chance to manually define what to do
+\newcommand\shrinkLastPage[1]{\dimgdef\@PBslack{#1}}
+
+\newcommand\@PBStartBalancing{
+ \ifdefvoid{\@PBslack}
+ {\@PBautomaticBalance}
+ {\@PBshrinkPage}
+}
+
+\newcommand\@PBautomaticBalance{
+ \@PBifBalancePossible
+ {
+ \@PBifBalancePkgPossible
+ {\balance} % easy peasy, use the balance package
+ {
+ \@PBifPoorBalancePossible
+ {
+ % use the poor man's balance algorithm
+ \@PBcalculateShrinkage
+ \@PBshrinkPage
+ }
+ {}
+ }
+ }
+ {}
+}
+
+% Calculate how much we should shrink the left column of the last
+% page based on the measurements we took on previous LaTeX passes.
+\newcommand\@PBcalculateShrinkage{
+
+ % Let's use some shorter names, please
+ \dimdef\@PBtmpH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}Height}}
+ \dimdef\@PBtmpUL{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}UsedLeft}}
+ \dimdef\@PBtmpUR{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}UsedRight}}
+
+ \dimdef\@PBtmpLH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}LeftHeight}}
+ \dimdef\@PBtmpLFH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}LeftFloatsHeight}}
+ \dimdef\@PBtmpRH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}RightHeight}}
+ \dimdef\@PBtmpRFH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}RightFloatsHeight}}
+
+ % Figure out the amount of unused space on the last page (both
+ % cols); we will reduce the first column height by half that amount
+ \dimgdef\@PBslack{2\dimexpr\@PBtmpH\relax - \@PBtmpUL - \@PBtmpUR}
+ \dimgdef\@PBslack{.5\dimexpr\@PBslack\relax}
+
+ % Actually, I lied. While half, as said above, sometimes yields
+ % perfectly balanced columns, that is often not the case (the page
+ % may have an odd number of lines, or textheight may not be a
+ % multiple of baselineskip, or there may be glues etc.). Sometimes
+ % the difference is very small, less than a line, which does not
+ % look good at all, and sometimes the right column is slightly
+ % higher than the left, which is also not ideal. Here, we force
+ % the left column to always be somewhat taller than the left; the
+ % result is often ``better''.
+ \dimgdef\@PBslack{\@PBslack - 1.5\baselineskip}
+
+ % If necessary, reduce @PBslack to prevent LaTeX from adding a page
+ \@PBsafetyCheck
+}
+
+\def\@PBshrinkPage{
+ % Zero obviously means ``do nothing''. We could
+ % ``enlarge'' by 0, but IDK, maybe that would
+ % trigger another LaTeX pass or something.
+ \ifdimcomp{\@PBslack}{=}{0pt}
+ {}
+ {
+ % Shrink the first column
+ \enlargethispage{-\@PBslack}
+
+ % Modify the behavior of \@outputdblcol
+ % to raise footnotes in the second column.
+ \global\let\@PBbalanceSecondColumn\@PBrealBalanceSecondColumn
+ }
+}
+
+% If there are footnotes on the right column, it is better to
+% ``push'' them up to be aligned with the end of the left column,
+% especially if there are footnotes on the left column too. We
+% do this by manipulating \@textbottom in \@outputdblcol.
+\pretocmd{\@outputdblcol}{\@PBbalanceSecondColumn}{}{}
+
+\let\@PBbalanceSecondColumn\relax
+
+\def\@PBrealBalanceSecondColumn{
+ \if@firstcolumn
+ % Affects the next column
+ \global\let\@PBorigtextbottom\@textbottom
+ \gdef\@textbottom{\vskip \@PBslack plus .0001fil minus 10000fill\relax \@PBorigtextbottom}
+ \else
+ % Back to normal before starting the next page
+ \global\let\@textbottom\@PBorigtextbottom
+ \global\let\@PBbalanceSecondColumn\relax
+ \fi
+}
+
+% \end{macrocode}
+
+% \subsection{The measuring front}
+% For the mechanism above to work, we need to know:
+%
+% \begin{enumerate}
+% \item The page number of the last page;
+% \item Whether the last page has floats, footnotes etc.;
+% \item The available height in the last page;
+% \item The height of the columns in the last page.
+% \end{enumerate}
+%
+% Let's collect this info for every page.
+%
+% \subsubsection{Are there floats, footnotes, or marginpars in the last page?}
+%
+% \begin{macrocode}
+
+% To check whether there are floats etc. in the last page,
+% we will copy the fancyhdr package:
+% https://tex.stackexchange.com/questions/56673/is-there-a-way-to-determine-if-there-is-a-float-on-a-page
+% But we add the tests to a different place.
+\newcommand\@PBifmidfloat[2]{\ifx\@midlist\empty #2\else #1\fi}
+\newcommand\@PBiftopfloat[2]{\ifx\@toplist\empty #2\else #1\fi}
+\newcommand\@PBifbotfloat[2]{\ifx\@botlist\empty #2\else #1\fi}
+\newcommand\@PBiffootnote[2]{\ifvoid\footins #2\else #1\fi}
+\newcommand\@PBiffloatcol[2]{\if@fcolmade #1\else #2\fi}
+% dbltop floats are apparently ok with the balance package
+%%%\newcommand\@PBifdbltopfloat[2]{\ifx\@dbltoplist\empty #2\else #1\fi}
+% dblbotlist only exists with package stfloats
+\newcommand\@PBifdblbotfloat[2]{%
+ \ifdefvoid{\@dblbotlist}
+ {#2}
+ {\ifx\@dblbotlist\empty #2\else #1\fi}%
+}
+
+% If there are footnotes, floats or marginpars in
+% the page, we should not use the balance package
+\newtoggle{@PBtmpHasFootnotes}
+\newtoggle{@PBtmpHasFloats}
+\newtoggle{@PBtmpHasMarginpars}
+
+\def\@PBcollectPageInfo{
+
+ \ifboolexpr
+ {
+ test {\@PBifmidfloat} or test {\@PBiftopfloat} or
+ test {\@PBifbotfloat} or test {\@PBifdblbotfloat}
+ }
+ {\global\toggletrue{@PBtmpHasFloats}}
+ {}
+
+ \@PBiffootnote
+ {\global\toggletrue{@PBtmpHasFootnotes}}
+ {}
+}
+
+\pretocmd{\@makecol}{\@PBcollectPageInfo}{}{}
+
+% This only gets called if there is a marginpar, so that's easy
+\pretocmd{\@addmarginpar}{\global\toggletrue{@PBtmpHasMarginpars}}{}{}
+
+% \end{macrocode}
+%
+% \subsubsection{What are the sizes of the floats in the left column?}
+%
+% \begin{macrocode}
+
+\ExplSyntaxOn
+\seq_gclear_new:N \@PBtmpLeftFloatHeights
+\seq_gclear_new:N \@PBtmpLeftFloatSpacesBelow
+\def\@PBcollectFloatHeights{
+ \if@firstcolumn
+ \dimdef\@PBfloatHeight{\@textfloatsheight - \@PBtmpHeightBefore}
+ \ifdimcomp{\@PBfloatHeight}{>}{0pt}
+ {
+ \global\seq_put_right:NV \@PBtmpLeftFloatHeights \@PBfloatHeight
+
+ \dimdef\@PBspaceBelow{\@colroom - \@pageht - \@PBfloatHeight}
+ % within \@addtocurcol, \@pageht corresponds to all
+ % currently used space in the column, including footnotes
+ % (check \@specialoutput in the LaTeX kernel). Let's
+ % exclude the footnotes, we only want the space below
+ % the float.
+ \ifvoid\footins\else
+ \dimdef\@PBspaceBelow{\@PBspaceBelow + \ht\footins + \skip\footins + \dp\footins}
+ \fi
+
+ % No idea why, but this can happen; maybe because of the page depth?
+ \ifdimcomp{\@PBspaceBelow}{<}{0pt}
+ {\dimdef\@PBspaceBelow{0pt}}
+ {}
+
+ \global\seq_put_right:NV \@PBtmpLeftFloatSpacesBelow \@PBspaceBelow
+ }
+ {}
+ \fi
+}
+\ExplSyntaxOff
+
+\pretocmd{\@addtocurcol}{\dimgdef{\@PBtmpHeightBefore}{\@textfloatsheight}}{}{}
+\apptocmd{\@addtocurcol}{\@PBcollectFloatHeights}{}{}
+
+% \end{macrocode}
+%
+% \subsubsection{What is the size of each column? Is there a float column / floatpage?}
+%
+% \begin{macrocode}
+
+% If there is a float column in the page, it makes no sense to try to
+% balance; if both columns are float columns, this page cannot be the
+% final text page, i.e., we want to balance some other page.
+\newtoggle{@PBtmpHasFloatcol}
+\newtoggle{@PBtmpIsFloatPage}
+
+\newcommand\@PBcollectColumnInfo{
+
+ \if@firstcolumn
+
+ \@PBiffloatcol
+ {\global\toggletrue{@PBtmpHasFloatcol}}
+ {}
+
+ % Available vertical space excluding
+ % dblfloats; the same for both columns
+ \dimgdef\@PBtmpHeight{\@colht}
+
+ % Available vertical space excluding top/bottom floats
+ \dimgdef\@PBtmpLeftHeight{\@colroom}
+
+ % Space used by \texttt{here} floats
+ \dimgdef\@PBtmpLeftFloatsHeight{\@textfloatsheight}
+
+ \else
+
+ \@PBiffloatcol
+ {
+ \iftoggle{@PBtmpHasFloatcol}
+ {\global\toggletrue{@PBtmpIsFloatPage}}
+ {\global\toggletrue{@PBtmpHasFloatcol}}
+ }
+ {}
+
+ \dimgdef\@PBtmpRightHeight{\@colroom}
+ \dimgdef\@PBtmpRightFloatsHeight{\@textfloatsheight}
+
+ \setbox\@tempboxa=\copy\@leftcolumn
+ \setbox\@tempboxa=\vbox{\unvbox\@tempboxa\unskip\unskip}
+ \dimgdef\@PBtmpUsedLeft{\ht\@tempboxa\relax}
+
+ \setbox\@tempboxa=\copy\@outputbox
+ \setbox\@tempboxa=\vbox{\unvbox\@tempboxa\unskip\unskip}
+ \dimgdef\@PBtmpUsedRight{\ht\@tempboxa\relax}
+ \fi
+}
+
+% The default LaTeX macro
+\pretocmd{\@outputdblcol}{\@PBcollectColumnInfo}{}{}
+
+% The version from the balance package
+\AtEndOfPackage{
+ \pretocmd{\@BAdblcol}{\@PBcollectColumnInfo}{}{}
+ % Revert \balance before next page if it exists (it might be a float page)
+ \patchcmd{\@BAdblcol}{\endgroup}{\endgroup\nobalance}{}{}
+}
+
+% \end{macrocode}
+%
+% \subsubsection{Analyze the obtained information}
+%
+% We have inserted the hooks we need to collect data during
+% the processing of each page and column. Now we inspect the
+% collected data after each page is finalized.
+%
+% \begin{macrocode}
+
+\ExplSyntaxOn
+\AtBeginShipout{
+ \ifboolexpr
+ {
+ % A float page is not the last text page, ignore
+ togl {@PBtmpIsFloatPage}
+ or
+ % A page with a float column on the left and an empty
+ % column on the right is not the last text page, ignore
+ (
+ togl {@PBtmpHasFloatcol}
+ and
+ test {\ifdimcomp{\@PBtmpUsedRight}{=}{\topskip}}
+ )
+ }
+ {}
+ {
+ % This page is a candidate to be the last page
+ \xdef\@PBlastPage{\the\value{abspage}}
+ \@PBcopyPageData{tmp}{candidate}
+ }
+
+ % Reset before processing next page
+ \global\togglefalse{@PBtmpHasFloats}
+ \global\togglefalse{@PBtmpHasFloatcol}
+ \global\togglefalse{@PBtmpHasFootnotes}
+ \global\togglefalse{@PBtmpHasMarginpars}
+ \global\togglefalse{@PBtmpIsFloatPage}
+
+ \seq_gclear_new:N \@PBtmpLeftFloatHeights
+ \seq_gclear_new:N \@PBtmpLeftFloatSpacesBelow
+}
+\ExplSyntaxOff
+
+% \end{macrocode}
+%
+% All pages processed, the last candidate page is actually the last page.
+% Instead of continuing to use the \texttt{@PBcandidate*} macros we already
+% have, we will keep the information we just gathered associated with the
+% page number. We do this because, in the future, we may want to add suport
+% for balancing multiple pages (such as the last page of each chapter) and
+% not only the last one. This also makes it easier to handle the situation
+% where the document was modified and the last page has changed.
+%
+% \begin{macrocode}
+
+\AfterLastShipout{\@PBcopyPageData{candidate}{pg\@Roman{\@PBlastPage}}}
+
+% \end{macrocode}
+%
+% \subsubsection{Saving measurements}
+% The whole document has already been processed and data about the last
+% page has been collected in macros with names \texttt{@PBpgNUM*}. We now
+% process this collected data and save whatever is relevant in the aux
+% file for the next \LaTeX{} pass.
+%
+% In the first \LaTeX{} pass, we will save data to the aux file in macros
+% with names \texttt{@PBunbalpgNUM*}. That is all we need for balancing.
+% However, to detect whether the document has changed and, therefore,
+% whether we should re-balance, we will also record the same data after
+% balancing (during the second pass) in macros with names
+% \texttt{@PBbalpgNUM*}. If, in the third or later \LaTeX{} passes,
+% \texttt{@PBbalpgNUM*} differ from \texttt{@PBpgNUM*}, the document
+% has been changed and we need to re-balance.
+%
+% So, we have:
+%
+% \begin{description}
+% \item[\texttt{@PBpgNUM*}] data collected during the current pass;
+% \item[\texttt{@PBunbalpgNUM*}] data collected in the first pass;
+% \item[\texttt{@PBbalpgNUM*}] data collected in the second pass (after
+% balancing); in subsequent passes, these should always be equal
+% to \texttt{@PBpgNUM*}.
+% \end{description}
+%
+% The last two are saved to / read from the aux file.
+%
+% \begin{macrocode}
+
+% Make sure the document has stabilized before using \@PBmanageBalancingPasses
+\AfterLastShipout{
+ % Reset \@PBimpossible if we are in draft mode,
+ % so the user can start over if they want to.
+ \iftoggle{@PBdraft}{\togglefalse{@PBimpossible}}{}
+
+ \ifboolexpr{togl {@PBdraft} or togl {@PBimpossible}}
+ {}
+ {
+ \ifdefvoid{\@PBprevLastPage}
+ {\@PBsaveUnbalancedInfo\@PBnotifyRerun} % First pass
+ {
+ \iftoggle{@PBstabilized}
+ {\@PBmanageBalancingPasses}
+ {
+ \@PBifSomethingChanged[unbal]
+ % Document still changing; discard data from previous pass
+ {\@PBsaveUnbalancedInfo[update]\@PBnotifyRerun}
+ % No changes, so let's balance from now on (once @PBstabilized
+ % becomes true, it never reverts back to false, unless the aux
+ % file is deleted).
+ {\toggletrue{@PBstabilized}\@PBsaveUnbalancedInfo\@PBnotifyRerun}
+ }
+ }
+ \@PBsaveToggle{@PBstabilized}
+ }
+
+ \@PBsaveToggle{@PBimpossible}
+ \immediate\write\@mainaux{\gdef\string\@PBprevLastPhysPage{\the\value{abspage}}}
+}
+
+\newcommand\@PBmanageBalancingPasses{
+ % This is the second pass or later after we started balancing
+
+ \providetoggle{@PBpg\@Roman{\@PBlastPage}alreadyBalanced}
+
+ \iftoggle{@PBpg\@Roman{\@PBlastPage}alreadyBalanced}
+ {
+ % Third pass or later; document was already
+ % balanced, so there should be no more changes
+ \@PBifSomethingChanged
+ % The document has changed, so we need to measure
+ % stuff again; clear aux file and start over.
+ {\@PBnotifyRerun}
+ % Nothing changed, just write the same info down
+ {\@PBsaveUnbalancedInfo\@PBsaveBalancedInfo}
+ }
+ % Second pass, which means something did change: we have just
+ % balanced the columns for the first time.
+ {
+ \xdef\@tempa{\the\value{abspage}}
+ \ifboolexpr
+ {
+ test {\ifdefstrequal{\@PBprevLastPage}{\@PBlastPage}}
+ and
+ test {\ifdefstrequal{\@PBprevLastPhysPage}{\@tempa}}
+ }
+ % All is well; save the new info
+ {\@PBsaveUnbalancedInfo\@PBsaveBalancedInfo}
+ % Oh, no! As we attempted to balance, we actually changed
+ % the number of pages (maybe we added a float page, maybe
+ % we turned the last float page into a text page etc.). If
+ % we continue, the document might never converge (endless
+ % ``please rerun LaTeX'' messages). Let's give up balancing.
+ {\toggletrue{@PBimpossible}}
+ }
+}
+
+% \end{macrocode}
+%
+% \subsection{Auxiliary macros}
+%
+% \begin{macrocode}
+
+\newcommand\@PBifBalancePossible[2]{
+ \iftoggle{@PBunbalpg\@Roman{\@PBprevLastPage}HasFloatcol}
+ {#2}
+ {#1}
+}
+
+% The balance package may fail badly in the presence of footnotes:
+% they may end up in the middle of the text. Marginpars may end up
+% on the wrong side of the page. Floats are usually ok, but in some
+% cases the columns may become very badly balanced. For ordinary
+% text, it works perfectly.
+\newcommand\@PBifBalancePkgPossible[2]{
+ \ifboolexpr
+ {
+ togl {@PBunbalpg\@Roman{\@PBprevLastPage}HasFloats}
+ or
+ togl {@PBunbalpg\@Roman{\@PBprevLastPage}HasFootnotes}
+ or
+ togl {@PBunbalpg\@Roman{\@PBprevLastPage}HasMarginpars}
+ }
+ {#2}
+ {#1}
+}
+
+% \end{macrocode}
+%
+% We only want to balance if:
+%
+% \begin{enumerate}
+%
+% \item The left column is higher than the right one. If that is not the
+% case, either things are already balanced or the right column is
+% higher, which means \LaTeX{} was forced into a bad solution already.
+%
+% \item This difference is ``large enough'' (6 lines), which means two things:
+% \begin{enumerate}
+%
+% \item There will be an actual improvement in the result.
+%
+% \item There is plenty of free space on the right column, so even if
+% our changes happen to take more space than before, \LaTeX{} will
+% hopefully not add a new page (but it might make the right
+% column higher than the left, which is not so great).
+% \end{enumerate}
+%
+% \end{enumerate}
+%
+% If there is material only on the left column, we want to balance even
+% if the difference in height is not ``large enough'', as long as there
+% are more than 4 lines to split among columns. This is actually quite
+% unlikely: if there is so little material, the page probably has only
+% normal text and we will use the balance package.
+%
+% \begin{macrocode}
+
+\newcommand\@PBifPoorBalancePossible[2]{
+
+ % Let's use some shorter names, please
+ \dimdef\@PBtmpH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}Height}}
+ \dimdef\@PBtmpUL{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}UsedLeft}}
+ \dimdef\@PBtmpUR{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}UsedRight}}
+
+ \dimdef\@PBtmpLH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}LeftHeight}}
+ \dimdef\@PBtmpLFH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}LeftFloatsHeight}}
+ \dimdef\@PBtmpRH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}RightHeight}}
+ \dimdef\@PBtmpRFH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}RightFloatsHeight}}
+
+ \ifboolexpr{
+ % Plenty of space on right column, difference is worth it
+ test {\ifdimcomp{\@PBtmpUL}{>}{\@PBtmpUR + 6\baselineskip}}
+ or
+ (
+ test {\ifdimcomp{\@PBtmpUL}{>}{4\baselineskip}}
+ and
+ test {\ifdimcomp{\@PBtmpUR}{=}{\topskip}} % column is empty
+ )
+ }{#1}{#2}
+}
+
+% \end{macrocode}
+%
+% If there are floats, things can get messy: imagine that we want to
+% shrink by 50pt, but there is a 250pt float near the end of the left
+% column that won't fit after we shrink, so it will move to the right.
+% What if there is no room for such a large float there? Here, we try
+% to prevent this situation and shrink by a smaller amount if there
+% is a float that won't fit. Note that, if the float goes to the
+% right column, there will be more room for text in the left column.
+% Therefore, a float will not fit only if the floats on the right
+% column take too much space. So, what we do here is, starting from
+% the bottom, check whether the accumulated height of the floats
+% from the left column fit in the right. If we find a float that
+% will not fit, we know that we should limit shrinking to the space
+% below that float.
+%
+% In the same vein, we do not want top/bottom floats from the left
+% column that were deferred from a previous page to be pushed to
+% the right column. To that end, we limit the shrinking amount to
+% the space on the left column not taken by top/bottom floats.
+
+% \textbf{TODO:} Top and bottom floats may appear in two cases: (1) they
+% were generated on a previous page and deferred or (2) the user
+% chose placement options \texttt{t} or \texttt{b}, without
+% \texttt{h}. Deferred floats are not a problem: we do not reduce
+% the space available for top/bottom floats, so they should
+% continue to fit. Floats on the left column with placement
+% options \texttt{t} and \texttt{b} without \texttt{h} can be
+% a problem: \LaTeX{} only considers putting a float on the
+% top/bottom of the current column if, at the point of its
+% definition, there is enough space for it. Since we are shrinking
+% the column, it may not fit and be deferred - something the
+% algorithm does not take into consideration. However, not all is
+% lost: most likely, the user will only use such placement
+% options when trying to manually adjust the page, which
+% means they will be able to detect and work around eventual
+% problems.
+%
+% \begin{macrocode}
+
+\ExplSyntaxOn
+\def\@PBsafetyCheck{
+
+ % Let's use some shorter names, please
+ \dimdef\@PBtmpH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}Height}}
+ \dimdef\@PBtmpUL{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}UsedLeft}}
+ \dimdef\@PBtmpUR{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}UsedRight}}
+
+ \dimdef\@PBtmpLH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}LeftHeight}}
+ \dimdef\@PBtmpLFH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}LeftFloatsHeight}}
+ \dimdef\@PBtmpRH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}RightHeight}}
+ \dimdef\@PBtmpRFH{\csuse{@PBunbalpg\@Roman{\@PBprevLastPage}RightFloatsHeight}}
+
+
+ % Make sure we do not push top/bottom floats out of the left col
+ \dimdef\@PBmaxSlack{\@PBtmpLH}
+
+ \dimdef\@PBtmpdim{0pt}
+
+ % Start from the bottom
+ \numdef{\@PBtmpcnt}{\seq_count:c {@PBunbalpg\@Roman{\@PBprevLastPage}LeftFloatHeights}}
+ \int_while_do:nNnn {\@PBtmpcnt} > {0}
+ {
+
+ \dimdef\@PBcurrentFloatHeight
+ {\seq_item:cn {@PBunbalpg\@Roman{\@PBprevLastPage}LeftFloatHeights} {\@PBtmpcnt}}
+
+ \dimdef\@PBcurrentFloatSpaceBelow
+ {\seq_item:cn {@PBunbalpg\@Roman{\@PBprevLastPage}LeftFloatSpacesBelow} {\@PBtmpcnt}}
+
+ \dimdef{\@PBtmpdim}{\@PBtmpdim + \@PBcurrentFloatHeight}
+
+ \ifboolexpr
+ {
+ % Does the float fit in the second column?
+ test {\ifdimcomp{\@PBtmpdim}{<}{\@PBtmpRH - \@PBtmpRFH}}
+ and
+ % Is there something above this float, i.e., if we move
+ % this float to the next column, will anything remain?
+ test
+ {
+ \ifdimcomp
+ {\@PBcurrentFloatSpaceBelow + \@PBcurrentFloatHeight}
+ {<}
+ {\@PBtmpLH - 6\baselineskip}
+ }
+ }
+ {\numdef{\@PBtmpcnt}{\@PBtmpcnt - 1}} % this one is ok; check next
+ {
+ % this one should not be moved, we found the limit
+ \ifdimcomp{\@PBmaxSlack}{>}{\@PBcurrentFloatSpaceBelow}
+ {\dimdef{\@PBmaxSlack}{\@PBcurrentFloatSpaceBelow}}
+ {}
+ \numdef{\@PBtmpcnt}{0} % exit the loop
+ }
+ }
+
+ \ifdimcomp{\@PBmaxSlack}{<}{\@PBslack}
+ {\dimgdef{\@PBslack}{\@PBmaxSlack}}
+ {}
+}
+\ExplSyntaxOff
+
+% Compare current measurements with previous ``bal'' or ``unbal'' measurements
+\newcommand\@PBifSomethingChanged[3][bal]{
+ \ifdefstrequal{\@PBprevLastPage}{\@PBlastPage}
+ {
+ \@PBifPageDataMatches
+ {pg\@Roman{\@PBlastPage}}
+ {#1pg\@Roman{\@PBlastPage}}
+ {#3}
+ {#2}
+ }
+ {#2}
+}
+
+\newcommand\@PBifPageDataMatches[4]{
+ \ifboolexpr{
+ test {\@PBifTogglesMatch{@PB#1HasFloats}{@PB#2HasFloats}}
+ and test {\@PBifTogglesMatch{@PB#1HasFloatcol}{@PB#2HasFloatcol}}
+ and test {\@PBifTogglesMatch{@PB#1HasFootnotes}{@PB#2HasFootnotes}}
+ and test {\@PBifTogglesMatch{@PB#1HasMarginpars}{@PB#2HasMarginpars}}
+ and test {\@PBifDimensionsMatch{@PB#1Height}{@PB#2Height}}
+ and test {\@PBifDimensionsMatch{@PB#1LeftHeight}{@PB#2LeftHeight}}
+ and test {\@PBifDimensionsMatch{@PB#1RightHeight}{@PB#2RightHeight}}
+ and test {\@PBifDimensionsMatch{@PB#1UsedLeft}{@PB#2UsedLeft}}
+ and test {\@PBifDimensionsMatch{@PB#1UsedRight}{@PB#2UsedRight}}
+ }
+ {#3}
+ {#4}
+}
+
+% https://en.wikipedia.org/wiki/XNOR_gate
+\newcommand\@PBifTogglesMatch[4]{
+ \ifboolexpr{(togl{#1} or not togl{#2}) and (togl{#2} or not togl{#1})}
+ {#3}
+ {#4}
+}
+
+\newcommand\@PBifDimensionsMatch[4]{
+ \ifdimcomp{\csuse{#1}}{=}{\csuse{#2}}
+ {#3}
+ {#4}
+}
+
+\newcommand\@PBsaveUnbalancedInfo[1][]{
+
+ \immediate\write\@mainaux{\gdef\string\@PBprevLastPage{\@PBlastPage}}
+
+ \ifboolexpr{test {\ifdefvoid{\@PBprevLastPage}} or test {\ifstrequal{#1}{update}}}
+ % Columns are currently unbalanced, either because this is
+ % the first pass (we do not have any previous information)
+ % or because the document has not stabilized yet, so any
+ % previous information is unreliable. Save the information
+ % we just collected as ``unbalanced''.
+ {\@PBsavePageDataAs{pg\@Roman{\@PBlastPage}}{unbalpg\@Roman{\@PBlastPage}}}
+ % Not the first pass, so columns are possibly balanced;
+ % to save the unbalanced information, repeat what was
+ % gathered during the first pass.
+ {\@PBsavePageData{unbalpg\@Roman{\@PBprevLastPage}}}
+}
+
+\def\@PBsaveBalancedInfo{
+ \global\toggletrue{@PBpg\@Roman{\@PBlastPage}alreadyBalanced}
+ \@PBsaveToggle{@PBpg\@Roman{\@PBlastPage}alreadyBalanced}
+
+ \@PBsavePageDataAs{pg\@Roman{\@PBlastPage}}{balpg\@Roman{\@PBlastPage}}
+}
+
+\def\@PBnotifyRerun{
+ \AtVeryEndDocument{
+ \PackageWarningNoLine{pbalance}
+ {Last page columns not balanced. Rerun LaTeX}
+ }
+}
+
+\ExplSyntaxOn
+\newcommand\@PBcopyPageData[2]{
+
+ \global\providetoggle{@PB#2HasFloats}
+ \global\providetoggle{@PB#2HasFloatcol}
+ \global\providetoggle{@PB#2HasFootnotes}
+ \global\providetoggle{@PB#2HasMarginpars}
+
+ \iftoggle{@PB#1HasFloats}
+ {\global\toggletrue{@PB#2HasFloats}}
+ {\global\togglefalse{@PB#2HasFloats}}
+
+ \iftoggle{@PB#1HasFloatcol}
+ {\global\toggletrue{@PB#2HasFloatcol}}
+ {\global\togglefalse{@PB#2HasFloatcol}}
+
+ \iftoggle{@PB#1HasFootnotes}
+ {\global\toggletrue{@PB#2HasFootnotes}}
+ {\global\togglefalse{@PB#2HasFootnotes}}
+
+ \iftoggle{@PB#1HasMarginpars}
+ {\global\toggletrue{@PB#2HasMarginpars}}
+ {\global\togglefalse{@PB#2HasMarginpars}}
+
+ \csdimgdef{@PB#2Height}{\csuse{@PB#1Height}}
+ \csdimgdef{@PB#2LeftHeight}{\csuse{@PB#1LeftHeight}}
+ \csdimgdef{@PB#2LeftFloatsHeight}{\csuse{@PB#1LeftFloatsHeight}}
+ \csdimgdef{@PB#2RightHeight}{\csuse{@PB#1RightHeight}}
+ \csdimgdef{@PB#2RightFloatsHeight}{\csuse{@PB#1RightFloatsHeight}}
+ \csdimgdef{@PB#2UsedLeft}{\csuse{@PB#1UsedLeft}}
+ \csdimgdef{@PB#2UsedRight}{\csuse{@PB#1UsedRight}}
+
+ \seq_gclear_new:c {@PB#2LeftFloatHeights}
+ \seq_gclear_new:c {@PB#2LeftFloatSpacesBelow}
+ \seq_gset_eq:cc {@PB#2LeftFloatHeights} {@PB#1LeftFloatHeights}
+ \seq_gset_eq:cc {@PB#2LeftFloatSpacesBelow} {@PB#1LeftFloatSpacesBelow}
+}
+\ExplSyntaxOff
+
+\newcommand\@PBsavePageDataAs[2]{
+ \@PBsaveDimAs{@PB#1Height}{@PB#2Height}
+ \@PBsaveDimAs{@PB#1LeftHeight}{@PB#2LeftHeight}
+ \@PBsaveDimAs{@PB#1LeftFloatsHeight}{@PB#2LeftFloatsHeight}
+ \@PBsaveDimAs{@PB#1RightHeight}{@PB#2RightHeight}
+ \@PBsaveDimAs{@PB#1RightFloatsHeight}{@PB#2RightFloatsHeight}
+ \@PBsaveDimAs{@PB#1UsedLeft}{@PB#2UsedLeft}
+ \@PBsaveDimAs{@PB#1UsedRight}{@PB#2UsedRight}
+
+ \@PBsaveToggleAs{@PB#1HasFloats}{@PB#2HasFloats}
+ \@PBsaveToggleAs{@PB#1HasFloatcol}{@PB#2HasFloatcol}
+ \@PBsaveToggleAs{@PB#1HasFootnotes}{@PB#2HasFootnotes}
+ \@PBsaveToggleAs{@PB#1HasMarginpars}{@PB#2HasMarginpars}
+
+ \@PBsaveSeqAs{@PB#1LeftFloatHeights}{@PB#2LeftFloatHeights}
+ \@PBsaveSeqAs{@PB#1LeftFloatSpacesBelow}{@PB#2LeftFloatSpacesBelow}
+}
+
+\newcommand\@PBsavePageData[1]{
+ \@PBsavePageDataAs{#1}{#1}
+}
+
+\newcommand\@PBsaveToggleAs[2]{
+ \immediate\write\@mainaux{\providetoggle{#2}}
+ \iftoggle{#1}
+ {\immediate\write\@mainaux{\global\toggletrue{#2}}}
+ {\immediate\write\@mainaux{\global\togglefalse{#2}}}
+}
+
+\newcommand\@PBsaveToggle[1]{
+ \@PBsaveToggleAs{#1}{#1}
+}
+
+\newcommand\@PBsaveDimAs[2]{
+ \immediate\write\@mainaux{\csdimgdef{#2}{\csuse{#1}}}
+}
+
+\newcommand\@PBsaveDim[1]{
+ \@PBsaveDimAs{#1}{#1}
+}
+
+\ExplSyntaxOn
+\newcommand\@PBsaveSeqAs[2]{
+ \immediate\write\@mainaux{\string\ExplSyntaxOn}
+ \immediate\write\@mainaux{\string\seq_gclear_new:c {#2}}
+ \seq_map_inline:cn {#1}
+ {\immediate\write\@mainaux{\string\global\string\seq_put_right:cn {#2}{##1}}}
+ \immediate\write\@mainaux{\string\ExplSyntaxOff}
+}
+\ExplSyntaxOff
+
+\newcommand\@PBsaveSeq[1]{
+ \@PBsaveSeqAs{#1}{#1}
+}
+
+% \end{macrocode}
+% \Finale
diff --git a/Master/texmf-dist/source/latex/pbalance/pbalance.ins b/Master/texmf-dist/source/latex/pbalance/pbalance.ins
new file mode 100644
index 00000000000..bb6356b0bf9
--- /dev/null
+++ b/Master/texmf-dist/source/latex/pbalance/pbalance.ins
@@ -0,0 +1,50 @@
+%% Copyright 2020 Nelson Lago <lago@ime.usp.br>
+%%
+%% 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 can be
+%% found at http://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 Nelson Lago <lago@ime.usp.br>.
+
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\usedir{tex/latex/pbalance}
+
+\preamble
+Copyright 2020 Nelson Lago <lago@ime.usp.br>
+
+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 can be
+found at http://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 Nelson Lago <lago@ime.usp.br>.
+
+\endpreamble
+
+\generate{\file{pbalance.sty}{\from{pbalance.dtx}{package}}}
+
+\obeyspaces
+\Msg{****************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the *}
+\Msg{* following file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* pbalance.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file *}
+\Msg{* pbalance.dtx through LaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{****************************************************}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/pdfoverlay/pdfoverlay.dtx b/Master/texmf-dist/source/latex/pdfoverlay/pdfoverlay.dtx
index 805ad91d63c..1f7064be067 100644
--- a/Master/texmf-dist/source/latex/pdfoverlay/pdfoverlay.dtx
+++ b/Master/texmf-dist/source/latex/pdfoverlay/pdfoverlay.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (c) 2018-2019 David Purton <dcpurton@marshwiggle.net>
+% Copyright (c) 2018-2020 David Purton <dcpurton@marshwiggle.net>
%
% This work may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3c of this license
@@ -19,20 +19,22 @@
% \fi
%
% \changes{v1.0}{2018/05/08}{First public release}
-% \changes{v1.1}{2019/11/03}{Fix depracated macros}
+% \changes{v1.1}{2019/11/03}{Fix deprecated macros}
+% \changes{v1.2}{2020/10/29}{Update to use \pkg{l3hooks}}
%
% \title{The \pkg{pdfoverlay} package}
% \author{David Purton\thanks{Email: \url{dcpurton@marshwiggle.net}}}
-% \date{2019/11/03 v1.1}
+% \date{2020/10/29 v1.2}
%
% \maketitle
%
% \begin{abstract}
% This \pkg{pdfoverlay} package provides a simple interface to overlay text
-% on to an existing PDF. The text to be overlayed is typeset and positioned
-% normally as you would any other \LaTeX{} document. Some or all of the pages
-% of the PDF can be included and not all pages of the PDF need have overlayed
-% text. It's also possible to include text between pages of the PDF.
+% on to an existing PDF. The text to be overlaid is typeset and positioned
+% normally as you would any other \LaTeX{} document. Some or all of the
+% pages of the PDF can be included and not all pages of the PDF need have
+% overlaid text. It's also possible to include text between pages of the
+% PDF.
% \end{abstract}
%
% \tableofcontents
@@ -41,32 +43,25 @@
%
% \section{Introduction}
%
-% It's often desirable to take an exisiting PDF and easily add annotations or
+% It's often desirable to take an existing PDF and easily add annotations or
% text overlaying the PDF. This might arise if you wish to add comments to a
% PDF, fill in a PDF form, or add text to a PDF where space has been left for
% notes.
%
% This package provides a simple interface to do this without having to resort
% to inserting one page at a time. Some or all of the pages of the PDF can be
-% included and not all pages of the PDF need have overlayed text. It's also
+% included and not all pages of the PDF need have overlaid text. It's also
% possible to include text between pages of the PDF.
%
-% Another advantage of this package is that the overlayed text can be set as
+% Another advantage of this package is that the overlaid text can be set as
% normal flowing from one page to another or with manual page breaks if you
% wish. It's also possible to use any standard method to position text at
% arbitrary places on a given page.
%
-% \section{Acknowlegements}
-%
-% This package is particularly indebted to the \pkg{pdfpages} package to count
-% the number of pages in the PDF file, the \pkg{eso-pic} package to output
-% pages from the PDF file in the document background, and the \pkg{everypage}
-% package to ensure that PDF pages are inserted at every page in the document.
-%
% \section{Bug Reports and Feature Requests}
%
% Bug reports and feature requests can be made at the \pkg{pdfoverlay} package
-% GitHub respoitory. See \url{https://github.com/dcpurton/pdfoverlay}.
+% GitHub repository. See \url{https://github.com/dcpurton/pdfoverlay}.
%
% \section{Documentation}
%
@@ -107,10 +102,12 @@
% \end{syntax}
% Set the \meta{Options} to be passed to \cs{includegraphics} when each page
% of the PDF is output. See the \pkg{graphicx} package documentation for
-% valid options. \textbf{Note} that it is not necessary to specify the
-% \texttt{page} option as this is appended automatically in the right format.
-% The default options are: \texttt{keepaspectratio,
-% width=}\cs{paperwidth}\texttt{, height=}\cs{paperheight}.
+% valid options.
+%
+% \textbf{Note} that it is not necessary to specify the \texttt{page} option
+% as this is appended automatically in the right format. The default
+% options are: \texttt{keepaspectratio, width=}\cs{paperwidth}\texttt{,
+% height=}\cs{paperheight}.
% \end{function}
%
% \begin{function}{\pdfoverlayIncludeToPage, \pdfoverlay_include_to_page:n}
@@ -165,34 +162,30 @@
% \end{macrocode}
%
% \begin{macrocode}
-\RequirePackage{xparse}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ProvidesExplPackage{pdfoverlay}{2019/11/03}{1.1}
+\NeedsTeXFormat{LaTeX2e}[2020-10-01]
+\ProvidesExplPackage{pdfoverlay}{2020/10/18}{1.2}
{Overlay text on an existing PDF document (DCP)}
% \end{macrocode}
%
-% \noindent The \pkg{everypage} and \pkg{pdfpages} packages are required.
+% \noindent The \pkg{graphicx} package is required.
%
% \begin{macrocode}
-\RequirePackage{everypage,pdfpages}
+\RequirePackage{graphicx}
% \end{macrocode}
%
-% \noindent Call \cs{@@_output_pdf_page:} on every page using the
-% \pkg{everypage} package.
+% \noindent Call \cs{@@_output_pdf_page:} on every page.
% \begin{macrocode}
-\AddEverypageHook { \@@_output_pdf_page: }
+\AddToHook { shipout/background } { \@@_output_pdf_page: }
% \end{macrocode}
%
-% \noindent Add \cs{null} to the end of the document if an action is pending.
-% This is required to ensure that the last requested page from the PDF file is
-% output even if there isn't any other content on the page.
+% \noindent Add an empty \cs{hbox:n} to the end of the document if an action
+% is pending. This is required to ensure that the last requested page from the
+% PDF file is output even if there isn't any other content on the page.
% \begin{macrocode}
\AtEndDocument {
\bool_if:NT \g_@@_action_pending_bool
{
- \null
+ \hbox:n { }
}
}
% \end{macrocode}
@@ -241,6 +234,26 @@
Specify~a~page~between~#2~and~#3. }
% \end{macrocode}
%
+% \noindent Error message when running in DVI mode. The \pkg{pdfoverlay}
+% package does not support DVI mode for either \texttt{pdflatex} or
+% \texttt{lualatex}.
+% \begin{macrocode}
+\msg_new:nnnn { pdfoverlay } { dvi-mode }
+ { DVI~mode~not~supported. }
+ { DVI~mode~of~#1~is~not~supported. \\
+ You~must~use~PDF~mode. }
+% \end{macrocode}
+%
+% \noindent Error message for unsupported engine. Only \texttt{pdftex},
+% \texttt{luatex}, and \texttt{xetex} are supported.
+% \begin{macrocode}
+\msg_new:nnnn { pdfoverlay } { unsupported-engine }
+ { #1~not~supported. }
+ { The~#1~engine~is~not~supported. \\
+ Use~one~of~pdftex,~luatex,~or~xetex. }
+% \end{macrocode}
+%
+%
% \subsection{Private Variables and Helper Functions}
%
% \begin{macro}{\g_@@_pdf_file_name_str}
@@ -296,9 +309,17 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\g_@@_pdf_page_coffin}
+% The current PDF page is set in this coffin which can then be positioned on
+% the page.
+% \begin{macrocode}
+\coffin_new:N \g_@@_pdf_page_coffin
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_output_pdf_page:}
% Main function to output the current page of the PDF file. This is called
-% before every page is shipped using the \pkg{everypage} package.
+% before every page is shipped using the \texttt{shipout/background} hook.
% \begin{macrocode}
\cs_new:Nn \@@_output_pdf_page:
{
@@ -317,18 +338,16 @@
}
{
% \end{macrocode}
-% Place requested page from the PDF file in the background of the
-% document page with the specified format.
-% \begin{macrocode}
- \AddToShipoutPictureBG*
- {
- \@@_format_pdf_page:
- }
-% \end{macrocode}
% Increment the current page counter.
% \begin{macrocode}
\int_gincr:N \g_@@_page_int
% \end{macrocode}
+% Place requested page from the PDF file in the background of the
+% document page with the specified format.
+% \begin{macrocode}
+ \@@_format_pdf_page:
+ \@@_place_pdf_page:
+% \end{macrocode}
% Set action pending flag to false.
% \begin{macrocode}
\bool_gset_false:N \g_@@_action_pending_bool
@@ -338,23 +357,100 @@
% \end{macro}
%
% \begin{macro}{\@@_format_pdf_page:}
-% Format the PDF page in the centre of the document page with options from
-% \cs{g_@@_graphics_options_clist}. Although marked as private, this function
-% could be redifined to position the PDF page at a different location on the
-% document page. See the \pkg{eso-pic} package documentation for hints on how
-% to position the PDF page.
+% Format the PDF page with options from \cs{g_@@_graphics_options_clist} and
+% place it in \cs{g_@@_pdf_page_coffin}.
% \begin{macrocode}
\cs_new:Nn \@@_format_pdf_page:
{
- \AtPageCenter
+ \hcoffin_gset:Nn \g_@@_pdf_page_coffin
+ {
+ \use:x
+ {
+ \exp_not:N \includegraphics
+ [ \clist_use:Nn \g_@@_graphics_options_clist { , } ]
+ { \g_@@_pdf_file_name_str }
+ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_place_pdf_page:}
+% Place the PDF page in the centre of the document page.
+%
+% Although marked as private, this function could be redefined to position
+% the PDF page at a different location on the document page.
+%
+% This macro is called from within the \texttt{shipout\slash background}
+% hook, which adds a picture environment into the background of the page
+% with the (0, 0) coordinate in the top-left corner using a \cs{unitlength}
+% of 1pt. It should therefore only receive \cs{put} commands or other
+% commands suitable in a picture environment and the vertical coordinate
+% values would normally be negative.
+%
+% The PDF page to be placed is available as the coffin
+% \cs{g_@@_pdf_page_coffin}.
+% \begin{macrocode}
+\cs_new:Nn \@@_place_pdf_page:
+ {
+ \put ( 0.5 \paperwidth, -0.5 \paperheight )
{
- \makebox (0, 0)
+ \coffin_typeset:Nnnnn \g_@@_pdf_page_coffin
+ { hc } { vc } { 0pt } { 0pt }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_count_pdf_pages:}
+% Count the number of pages in the current \cs{g_@@_pdf_file_name_str} and
+% store the result in \cs{g_@@_pdf_page_count_int}. If no PDF has been set
+% with \cs{pdfoverlay_set_pdf} then \cs{g_@@_pdf_page_count_int} is set to
+% zero.
+% \begin{macrocode}
+\cs_new:Nn \@@_count_pdf_pages:
+ {
+ \int_gzero:N \g_@@_page_count_int
+ \str_if_empty:NTF \g_@@_pdf_file_name_str
+ {
+ \msg_error:nn { pdfoverlay } { file-not-set }
+ }
+ {
+ \sys_if_engine_xetex:TF
{
- \use:x
+ \int_gset:Nn \g_@@_page_count_int
+ {
+ \XeTeXpdfpagecount " \g_@@_pdf_file_name_str "
+ }
+ }
+ {
+ \sys_if_output_pdf:TF
+ {
+ \sys_if_engine_pdftex:TF
+ {
+ \pdfximage { \g_@@_pdf_file_name_str }
+ \int_gset_eq:NN
+ \g_@@_page_count_int
+ \pdflastximagepages
+ }
+ {
+ \sys_if_engine_luatex:TF
+ {
+ \saveimageresource
+ { \g_@@_pdf_file_name_str }
+ \int_gset_eq:NN
+ \g_@@_page_count_int
+ \lastsavedimageresourcepages
+ }
+ {
+ \msg_error:nnx { pdfoverlay } { unsupported-engine }
+ { \c_sys_engine_str }
+ }
+ }
+ }
{
- \exp_not:N \includegraphics
- [ \clist_use:Nn \g_@@_graphics_options_clist { , } ]
- { \g_@@_pdf_file_name_str }
+ \msg_error:nnx { pdfoverlay } { dvi-mode }
+ { \c_sys_engine_str }
}
}
}
@@ -408,15 +504,13 @@
{
\str_gset:Nn \g_@@_pdf_file_name_str { #1 }
% \end{macrocode}
-% Use the \pkg{pdfpages} package to find the number of pages in the PDF file.
+% Find the number of pages in the PDF file.
% \begin{macrocode}
- \edef \AM@currentdocname { #1 }
- \AM@getpagecount
+ \@@_count_pdf_pages:
% \end{macrocode}
% Initialise variables.
% \begin{macrocode}
- \int_gset_eq:NN \g_@@_page_count_int \AM@pagecount
- \int_gset_eq:NN \g_@@_page_int \c_zero_int
+ \int_gzero:N \g_@@_page_int
\bool_gset_true:N \g_@@_output_active_bool
\bool_gset_false:N \g_@@_action_pending_bool
}
@@ -447,8 +541,8 @@
% \begin{macro}{\pdfoverlay_include_to_page:n}
% Output all pages in the PDF file up until the specified page. Since the
% actual PDF page is inserted by \cs{__pdfoverlay_output_pdf_page:} using the
-% \pkg{everypage} package before the page is shipped, we just insert the
-% required number of blank pages into the document.
+% \texttt{shipout/background} hook, we just insert the required number of
+% blank pages into the document.
% \begin{macrocode}
\cs_new:Npn \pdfoverlay_include_to_page:n #1
{
@@ -476,7 +570,7 @@
{ \int_compare_p:n { #1 != \g_@@_page_int + 1 } }
}
{
- \null
+ \hbox:n { }
\clearpage
}
% \end{macrocode}
@@ -484,12 +578,12 @@
% \begin{macrocode}
\int_while_do:nNnn { \g_@@_page_int } < { #1 - 1 }
{
- \null
+ \hbox:n { }
\clearpage
}
% \end{macrocode}
% Set the action pending flag, so final page is output even if no text is
-% overlayed on it.
+% overlaid on it.
% \begin{macrocode}
\bool_gset_true:N \g_@@_action_pending_bool
}
@@ -526,16 +620,16 @@
% \begin{macrocode}
\bool_if:nT { \g_@@_action_pending_bool }
{
- \null
+ \hbox:n { }
\clearpage
}
% \end{macrocode}
-% Set the page numer for the next page to be output.
+% Set the page number for the next page to be output.
% \begin{macrocode}
\int_gset:Nn \g_@@_page_int { #1 - 1 }
% \end{macrocode}
% Set the action pending flag, so final page is output even if no text is
-% overlayed on it.
+% overlaid on it.
% \begin{macrocode}
\bool_gset_true:N \g_@@_action_pending_bool
}
diff --git a/Master/texmf-dist/source/latex/pdfoverlay/pdfoverlay.ins b/Master/texmf-dist/source/latex/pdfoverlay/pdfoverlay.ins
index 7f2a4200f95..743dbdca593 100644
--- a/Master/texmf-dist/source/latex/pdfoverlay/pdfoverlay.ins
+++ b/Master/texmf-dist/source/latex/pdfoverlay/pdfoverlay.ins
@@ -1,6 +1,6 @@
\iffalse meta-comment
-Copyright (c) 2018-2019 David Purton <dcpurton@marshwiggle.net>
+Copyright (c) 2018-2020 David Purton <dcpurton@marshwiggle.net>
This work may be distributed and/or modified under the conditions of
the LaTeX Project Public License, either version 1.3c of this license
@@ -19,7 +19,7 @@ version 2005/12/01 or later.
This is a generated file.
-Copyright (c) 2018-2019 David Purton <dcpurton@marshwiggle.net>
+Copyright (c) 2018-2020 David Purton <dcpurton@marshwiggle.net>
This work may be distributed and/or modified under the conditions of
the LaTeX Project2 Public License, either version 1.3c of this license
diff --git a/Master/texmf-dist/source/latex/pdfpages/pdfpages.dtx b/Master/texmf-dist/source/latex/pdfpages/pdfpages.dtx
index 3cd8f9cb0f2..eb64a63b55e 100644
--- a/Master/texmf-dist/source/latex/pdfpages/pdfpages.dtx
+++ b/Master/texmf-dist/source/latex/pdfpages/pdfpages.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%<*(package,pppdftexdef,ppluatexdef,ppvtexdef,ppxetexdef,ppdvipsdef,ppdvipdfmxdef,ppnulldef)>
-%% Copyright (C) 2001-2020 Andreas MATTHIAS
+%% Copyright (C) 2001-2021 Andreas MATTHIAS
%%
%% This work may be distributed and/or modified under the conditions
%% of the LaTeX Project Public License, either version 1.3c
@@ -27,12 +27,12 @@
%<*dtx>
\makeatletter
%</dtx>
-\def\AM@fileversion{v0.5q}
+\def\AM@fileversion{v0.5s}
\def\AM@Git@Date@process$#1: #2 #3${\AM@Git@Date@process@i#2\END}
\def\AM@Git@Date@process@i#1-#2-#3\END{\def\AM@Git@Date{#1/#2/#3}}
\def\AM@Git@SHA@process$#1: #2${\def\AM@Git@SHA{#2}}
-\AM@Git@Date@process$Date: 2020-01-28 18:31:23 +0100 $
-\AM@Git@SHA@process$SHA-1: 105b2fdadf38120b838b3393c5cf83a7db30724e $
+\AM@Git@Date@process$Date: 2021-02-05 15:10:20 +0100 $
+\AM@Git@SHA@process$SHA-1: 96070951ed4fc4b97d5a7a910640f7dbd57cc928 $
%</!(example1,example2,example3,installer)>
%
%
@@ -84,7 +84,7 @@
%
% \GetFileInfo{pdfpages.dtx}
%
-% \CheckSum{5022}
+% \CheckSum{5060}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -108,6 +108,7 @@
\documentclass{ltxdoc}
\usepackage{array}
\usepackage{graphicx}
+\usepackage{booktabs}
\usepackage{cmap}
\usepackage{hypdoc}
\hypersetup{colorlinks, linkcolor=blue, pdfstartview={Fit},
@@ -173,7 +174,7 @@
% simple |\includegraphics{doc.pdf}| normally produces `|Overfull \hbox|'
% and `|Overfull \vbox|' warnings, because the size of the inserted pages
% does not match the print space.
-%
+%
% The |pdfpages| package makes it easy to insert pages of external \PDF\
% documents without worrying about the print space. Here are some
% features of the |pdfpages| package: Several logical pages can be
@@ -202,8 +203,8 @@
% However, there's a glimmer of hope. Some links may be extracted and later
% reinserted by a package called \emph{pax} which can be downloaded from
% CTAN \cite{pax}. Have a look at it!
-%
-%
+%
+%
% \section{Usage}
% \subsection{Package Options}
%
@@ -211,7 +212,7 @@
% |\usepackage[|\meta{options}|]{pdfpages}|
%
% \begin{quote}
-% \meta{option} --
+% \meta{option} --
% \begin{minipage}[t]{.8\linewidth}
% \setlength\leftmargini{3.5em}
% \begin{description}
@@ -230,14 +231,14 @@
%
%
% \subsection{Commands}
-%
+%
% \DescribeMacro{\includepdf}
% Inserts pages of an external \PDF\ document.
-%
+%
% \medskip\noindent
% \begin{minipage}{\linewidth}
% |\includepdf[|\meta{key=val}|]{|\meta{filename}|}|
-%
+%
% \begin{quote}
% \begin{tabular}{@{}l@{\,--~}>{\raggedright}p{.8\linewidth}}
% \meta{key=val} & A comma separated list of options
@@ -249,11 +250,11 @@
% \end{quote}
% \end{minipage}\bigskip
%
-%
+%
% \noindent
% The following list describes all possible options of
% |\includepdf|. All options are using the \meta{key=value} syntax.
-%
+%
% \newcommand*{\df}[1]{(Default: \mbox{|#1|})}
%
% \setlength{\leftmargini}{\parindent}
@@ -265,8 +266,8 @@
% \begin{description}
% \makeatletter\@beginparpenalty=10000\makeatother
% \item[pages] Selects pages to insert. The argument is a comma
-% separated list, containing page numbers
-% (|pages={3,5,6,8}|), ranges of page numbers
+% separated list, containing page numbers
+% (|pages={3,5,6,8}|), ranges of page numbers
% (|pages={4-9}|) or any combination.
% To insert empty pages use |{}|.
% \par
@@ -278,7 +279,7 @@
% \meta{m}|-|\meta{n}. This selects all pages from
% \meta{m} to \meta{n}. Omitting \meta{m} defaults
% to the first page; omitting \meta{n} defaults to
-% the last page of the document. Another way to
+% the last page of the document. Another way to
% select the last page of the document, is to use the
% keyword |last|. (This is only permitted in a
% page range.)
@@ -288,7 +289,7 @@
% all pages in reverse order.
% \par\df{pages=1}
% \item[nup] Puts multiple logical pages onto each sheet
-% of paper. The syntax of this option is:
+% of paper. The syntax of this option is:
% |nup=|\meta{xnup}|x|\meta{ynup}. Where
% \meta{xnup} and \meta{ynup} specify the number of
% logical pages in horizontal and vertical direction,
@@ -320,16 +321,16 @@
% \emph{top} margin, respectively, whereas in `twoside'
% documents positive values shift the pages to the
% \emph{outer} and to the \emph{top} margin,
-% respectively. See Chapter~\ref{sec:layout} and
+% respectively. See Chapter~\ref{sec:layout} and
% Figure~\ref{fig:layout}. \df{offset=0 0}
% \item[frame] Puts a frame around each logical page. The frame is
% made of lines of thickness |\fboxrule|. Either `true'
% or `false' (or no value, which is equivalent to `true').
% \df{frame=false}
-% \item[column] Pdfpages normally uses `row-major' layout, where
+% \item[column] Pdfpages normally uses `row-major' layout, where
% successive pages are placed in rows along the paper.
% The |column| option changes the output into a
-% `column-major' layout, where successive pages are
+% `column-major' layout, where successive pages are
% arranged in columns down the paper.
% Either `true' or `false' (or no value, which
% is equivalent to `true'). \df{column=false}
@@ -373,13 +374,13 @@
% \item[pagecommand] Declares \LaTeX\ commands, which are executed
% on each sheet of paper.
% \df{pagecommand=\{\bslash thispagestyle\{empty\}\}}
-% \item[turn] By default pages in landscape format are displayed
+% \item[turn] By default pages in landscape format are displayed
% in landscape orientation (if the \PDF\ viewer supports
% this). With \texttt{turn=false} this can be prohibited.
% Either `true' or `false' (or no value, which
% is equivalent to `true'). \df{turn=true}
% \item[noautoscale] By default pages are scaled automatically.
-% This can be suppressed with the
+% This can be suppressed with the
% \texttt{noautoscale} option.
% In combination with the \texttt{scale} option
% (from graphicx) the user has full control over
@@ -456,7 +457,7 @@
% the cutting edge is always on the inner side.
% Either `true' or `false' (or no value, which is
% equivalent to `true'). \df{doublepagestwist=false}
-% \item[doublepagestwistodd] Turns the pages such, that the
+% \item[doublepagestwistodd] Turns the pages such, that the
% cutting edge is always on the outer side.
% Either `true' or `false' (or no value, which is
% equivalent to `true'). \df{doublepagestwistodd=false}
@@ -488,14 +489,14 @@
% \begin{description}
% \makeatletter\@beginparpenalty=10000\makeatother
% \item[link] Inserted pages become a target
-% of a hyperlink. The name of the link is
+% of a hyperlink. The name of the link is
% `\texttt{\meta{filename}.\meta{page number}}'.
-% The filename extension of \meta{filename}
+% The filename extension of \meta{filename}
% \emph{must not} be stripped.
% Either `true' or `false' (or no value, which
% is equivalent to `true').
% \df{link=false}
-% \item[linkname] Changes the default linkname created by the option
+% \item[linkname] Changes the default linkname created by the option
% \texttt{link}. Instead of \meta{filename} the
% value of this option is used. E.g.~\texttt{
% linkname=mylink} produces the linknames
@@ -503,10 +504,10 @@
% \item[thread] Combines inserted pages to an article thread.
% Either `true' or `false' (or no value, which
% is equivalent to `true'). \df{thread=false}
-% \item[threadname] Several threads are distinguished by their
+% \item[threadname] Several threads are distinguished by their
% threadnames. By default the threadname is equal
% to the filename (plus filename extension), but it
-% can be changed with this option. This is useful if
+% can be changed with this option. This is useful if
% the same file is inserted twice or more times and
% should not be combined to one single thread.
% Or the other way round if pages from different
@@ -515,8 +516,8 @@
% \item[linktodoc] Lets the inserted pages be hyperlinks to the
% document from which they were extracted.
% Note that the \PDF-Viewer will not find the
-% file, if \meta{filename} has not filename
-% extension (.pdf).
+% file, if filename extension (.pdf) is missing
+% in \meta{filename}.
% Either `true' or `false' (or no value, which
% is equivalent to `true'). \df{linktodoc=false}
% \end{description}
@@ -540,7 +541,7 @@
%^^A \meta{right} \meta{top}},
%^^A \texttt{xyz \meta{left} \meta{top} \meta{zoom}},
% and \texttt{Region}.
-%
+%
% See \cite{PDFRef} for a details description of these
% \PDF\ destinations. The |region| destination was
% added by pdfpages and is not a real \PDF\
@@ -590,9 +591,9 @@
% \item[\meta{section}:] \LaTeX\ sectioning name
% -- e.g., section, subsection, \ldots
% \item[\meta{level}:] Number, denoting depth of
-% section -- e.g., 1 for section level, 2 for
+% section -- e.g., 1 for section level, 2 for
% subsection level, \ldots
-% \item[\meta{heading}:] Title inserted in the
+% \item[\meta{heading}:] Title inserted in the
% table of contents.
% \item[\meta{label}:] Name of the label. This label
% can be referred to with |\ref| and |\pageref|.
@@ -606,7 +607,7 @@
% The |addtotoc| option
% accepts multiple sets of the above mentioned five
% arguments, all separated by commas. The sets must
-% be sorted such that the \meta{page number}s are in
+% be sorted such that the \meta{page number}s are in
% ascending order. (Strictly speaking they must have
% the same order as the page numbers specified by
% the |pages| option.)
@@ -647,7 +648,7 @@
%
% Like \texttt{addtotoc}, \texttt{addtolist} accepts
% multiple sets of the above mentioned four arguments,
-% all separated by commas. The proper recursive
+% all separated by commas. The proper recursive
% definition is:
%
% \texttt{addtolist=}\{\meta{lof-list}\}
@@ -732,11 +733,11 @@
% |\externaldocument|.
% \df{xr-prefix=\{\}}
%
-%
+%
% \end{description}
%
% \end{itemize}
-%
+%
%
% \begin{figure}
% \centering
@@ -820,11 +821,11 @@
%
%
% \noindent
-% Internally the command |\includepdf|
-% makes use of the |\includegraphics| command from the |graphicx|
+% Internally the command |\includepdf|
+% makes use of the |\includegraphics| command from the |graphicx|
% (actually |graphics|) package. Hence it is possible to use
% all the options of |\includegraphics|, too.
-% Options which are not interpreted by |\includepdf|
+% Options which are not interpreted by |\includepdf|
% are passed directly to |\includegraphics|.
%
% Especially the `trim' and `clip' options of |\includegraphics|
@@ -833,7 +834,7 @@
% Just use the `trim' and `clip' options as if they were options
% of |\includepdf|. They will be passed to |\includegraphics|
% internally.
-%
+%
%
% \begin{samepage}
% \bigskip\noindent
@@ -851,7 +852,7 @@
% \meta{file-page-list} & \meta{filename}[\textbf{,}^^A
% \meta{page spec}]^^A
% [\textbf{,}\meta{file-page-list}]\\
-% A comma separated list of filenames and
+% A comma separated list of filenames and
% optional \meta{page spec} specifiers.
% A \meta{page spec} can be everything the
% option |pages| accepts.
@@ -860,12 +861,12 @@
% \end{quote}
% \end{samepage}
%
-% The |\includepdfmerge| command uses the same options as
+% The |\includepdfmerge| command uses the same options as
% |\includepdf| with
-% one exception. The option |pages| has no meaning for
+% one exception. The option |pages| has no meaning for
% |\includepdfmerge|. Instead the \meta{page spec} specifier
% is used to specify which pages should be inserted.
-% The \meta{page spec} specifier accepts the same values as
+% The \meta{page spec} specifier accepts the same values as
% the |pages| option. If no \meta{page spec} specifier is given,
% only the first page will be inserted.
%
@@ -884,7 +885,7 @@
% So it would be more pleasant to insert the title page of
% each document than the first page. This can be done with
% the \meta{page spec} specifier. The following example inserts
-% the second page of \textit{doc1.pdf} and the third page of
+% the second page of \textit{doc1.pdf} and the third page of
% \textit{doc2.pdf} and \textit{doc3.pdf}:
%
% \begin{quote}
@@ -932,19 +933,19 @@
% entries of a thread information dictionary in low-level \PDF\
% commands.
% (See \cite{PDFRef} for more information.)
-%
+%
% \smallskip
% |\renewcommand*{\threadinfodict}|\\\hspace*{\parindent}
% | {/Title (My first thread) /Author (That's me!)}|
-%
-%
+%
+%
%
% \subsection{The Layout}\label{sec:layout}
-%
+%
% The default layout can be changed by the options |delta|
% and |offset|. Figure~\ref{fig:layout} shows the
% meaning of these options.
-%
+%
% The inserted logical pages are being centered on the
% sheet of paper by default. To displace them use the |offset|
% option, which argument should be two dimensions. E.g.~
@@ -955,17 +956,17 @@
% the \emph{right} and to the \emph{top} margin, respectively,
% whereas in `twoside' documents positive values shift the pages
% to the \emph{outer} and to the \emph{top} margin, respectively.
-%
+%
% By default logical pages are being arranged side by side.
% To put some space between them, use the |delta| option,
% whose argument should be two dimensions.
% Figure~\ref{fig:layout} shows the meaning of |delta|.
-%
+%
% The layout options |delta| and |offset|
% \textit{always} refer to a sheet of paper in portrait
-% orientation. No matter whether you have set the
+% orientation. No matter whether you have set the
% |landscape| option to |true|, or not.
-%
+%
% If you are confused about horizontal\,(|x|)
% and vertical\,(|y|) directions, just set the option
% |turn=false|. Now your \PDF\ viewer shows the pages in
@@ -1000,8 +1001,8 @@
% \begin{description}
% \item[pagecolor]
% When setting the background color with |\pagecolor|
-% (a command from \textit{color.sty}), the first
-% |\pagecolor| \emph{must} precede |\usepackage{pdfpages}|.
+% (a command from \textit{color.sty}), the first
+% |\pagecolor| \emph{must} precede |\usepackage{pdfpages}|.
% \begin{quote}
% |\usepackage{color}|\\
% |\pagecolor{white}|\\
@@ -1056,13 +1057,13 @@
%
% \StopEventually{
% \begin{thebibliography}{9}
-%
+%
% \bibitem{pdftex}
% H\`an Th\^e\llap{\raise 0.5ex\hbox{\'{}}} Th\`anh,
% Sebastian Rahtz, Hans Hagen,
% \textit{The \pdfTeX\ user manual},
% \url{http://www.tug.org/applications/pdftex}
-%
+%
% \bibitem{PDFRef}
% \textit{PDF Reference}, Adobe Systems Incorporated,\\
% \url{http://www.adobe.com/devnet/pdf/pdf_reference.html}
@@ -1071,7 +1072,7 @@
% Heiko Oberdiek,
% \textit{pax: Extract and reinsert PDF annotations with pdfTeX}
% \url{http://www.ctan.org/pkg/pax}
-%
+%
% \end{thebibliography}
% }
%
@@ -1116,7 +1117,7 @@
\DeclareOption{null}{\def\AM@driver{null}}
% \end{macrocode}
% \begin{macrocode}
-\ProcessOptions
+\ProcessOptions
% \end{macrocode}
% \subsection{Detection of TeX-Engine}
%
@@ -1155,6 +1156,7 @@
\newif\ifAM@DVIoutput\AM@DVIoutputfalse
\newdimen\AM@pagewidth
\newdimen\AM@pageheight
+\newdimen\AM@fboxrule
\input{pp\AM@driver.def}
\ifx\AM@endinput\relax\expandafter\endinput\fi
\ifAM@pkg@survey
@@ -1238,6 +1240,28 @@
\newif\ifAM@memoir\AM@memoirfalse
\@ifclassloaded{memoir}{\AM@memoirtrue}{}
% \end{macrocode}
+% Pdfpages calls |\includegraphics| several times to retrieve necessary
+% information like width, height, or number of pages without actually
+% typesetting the image. Just the final call to |\includegraphics| will
+% eventually typeset the image. Packages which hook into
+% |\includegraphics| and whish to check whether or not this is the final
+% call to |\includegraphics| can do so by using the counter
+% |\pdfpages@includegraphics@status|:
+% \begin{quotation}
+% \begin{tabular}{@{}cl@{}}
+% \toprule
+% Status & Use of |\includegraphics| ...\\
+% \midrule
+% 0 & outside of pdfpages\\
+% 1 & inside of pdfpages: final call\\
+% 2 & inside of pdfpages: non-final call, for internal use\\
+% \bottomrule
+% \end{tabular}
+% \end{quotation}
+% \begin{macrocode}
+\newcount\pdfpages@includegraphics@status
+\pdfpages@includegraphics@status\z@
+% \end{macrocode}
% \subsection{Commands}
% Declare macro names and define default values.
% \begin{macrocode}
@@ -1347,11 +1371,12 @@
}
% \end{macrocode}
% \macro{\includepdf}
-% This command inserts any pages of an external
+% This command inserts any pages of an external
% \PDF\ document.
% \begin{macrocode}
\newcommand*{\includepdf}[2][]{%
\begingroup
+ \global\pdfpages@includegraphics@status\tw@
\AM@pagecnt\@ne
\let\AM@threadname\relax
\def\AM@tmp{pdfpages}
@@ -1410,6 +1435,7 @@
\AM@CheckAtEnd
\endgroup
\AM@ClearShipoutPicture
+ \global\pdfpages@includegraphics@status\z@
}
% \end{macrocode}
% \macro{\includepdfmerge}
@@ -1417,6 +1443,7 @@
% \begin{macrocode}
\newcommand*{\includepdfmerge}[2][]{%
\begingroup
+ \global\pdfpages@includegraphics@status\tw@
\AM@pagecnt\@ne
\let\AM@currentdocname\relax
\def\AM@tmp{pdfpages}
@@ -1430,6 +1457,7 @@
\AM@CheckAtEnd
\endgroup
\AM@ClearShipoutPicture
+ \global\pdfpages@includegraphics@status\z@
}
% \end{macrocode}
% \macro{\AM@CheckAtEnd}
@@ -1505,7 +1533,7 @@
{\def\AM@xnup{\@ne}\def\AM@ynup{\@ne}%
\def\AM@xnupminusi{\z@}\def\AM@ynupminusi{\z@}}{}%
\@ifundefined{AM@deltax}
- {\def\AM@deltax{-\fboxrule}\def\AM@deltay{-\fboxrule}}{}%
+ {\def\AM@deltax{-\AM@fboxrule}\def\AM@deltay{-\AM@fboxrule}}{}%
\@ifundefined{AM@xoffset}
{\def\AM@xoffset{\z@}\def\AM@yoffset{\z@}}{}%
\def\AM@xpos{\z@}\def\AM@ypos{\z@}%
@@ -1554,12 +1582,13 @@
\fi}{}%
% \end{macrocode}
% \begin{macrocode}
- \ifthenelse{\boolean{AM@frame}}
- {\global\let\AM@fbox\fbox}
+ \ifthenelse{\boolean{AM@frame}}%
+ {\global\let\AM@fbox\fbox
+ \setlength\AM@fboxrule{\fboxrule}}%
{\global\let\AM@fbox\relax
- \setlength{\fboxrule}{\z@}}%
- \ifthenelse{\boolean{AM@reflect}}
- {\global\let\AM@reflectbox\reflectbox}
+ \setlength\AM@fboxrule{\z@}}%
+ \ifthenelse{\boolean{AM@reflect}}%
+ {\global\let\AM@reflectbox\reflectbox}%
{\global\let\AM@reflectbox\relax}%
\setbox\AM@pagebox\null
% \end{macrocode}
@@ -1573,9 +1602,6 @@
% \begin{macrocode}
\AM@firstpagetrue
% \end{macrocode}
-% \begin{macrocode}
- \setlength{\fboxsep}{\z@}%
-% \end{macrocode}
% Determine scaling factor:
% The logical pages are scaled such, that they match on
% one sheet of paper.
@@ -1616,7 +1642,7 @@
% Calculate required scaling in horizontal direction.
% \begin{macrocode}
\def\AM@xscale{%
- (\AM@pagewidth - \tw@\fboxrule*\AM@xnup
+ (\AM@pagewidth - \tw@\AM@fboxrule*\AM@xnup
- \AM@deltax * \AM@xnupminusi) /
(\AM@xnup * \real{\strip@pt\wd\@tempboxa})
}%
@@ -1627,7 +1653,7 @@
% \begin{macrocode}
\setlength{\@tempdimb}{\ht\@tempboxa + \dp\@tempboxa}%
\def\AM@yscale{
- (\AM@pageheight - \tw@\fboxrule*\AM@ynup
+ (\AM@pageheight - \tw@\AM@fboxrule*\AM@ynup
- \AM@deltay *\AM@ynupminusi) /
(\AM@ynup * \real{\strip@pt\@tempdimb})
}%
@@ -1647,7 +1673,7 @@
\fi
% \end{macrocode}
% Determine horizontal and vertical margins.
-% |\AM@xoffset| and |\AM@yoffset| are \textit{not}
+% |\AM@xoffset| and |\AM@yoffset| are \textit{not}
% taken into account for this calculation.
% \begin{macrocode}
\let\AM@filelist@save\@filelist
@@ -1672,11 +1698,11 @@
\edef\AM@templateheight{\the\@tempdima}%
\setlength{\@tempdimb}{\ht\@tempboxa + \dp\@tempboxa}%
\def\AM@xmargin{%
- (\AM@pagewidth - (\wd\@tempboxa+\tw@\fboxrule)*\AM@xnup
+ (\AM@pagewidth - (\wd\@tempboxa+\tw@\AM@fboxrule)*\AM@xnup
- \AM@deltax * \AM@xnupminusi) * \real{.5}%
}%
\def\AM@ymargin{%
- (\AM@pageheight - (\@tempdimb+\tw@\fboxrule)*\AM@ynup
+ (\AM@pageheight - (\@tempdimb+\tw@\AM@fboxrule)*\AM@ynup
- \AM@deltay * \AM@ynupminusi) * \real{.5}%
}%
\setlength{\@tempdima}{\AM@xmargin}%
@@ -1788,7 +1814,7 @@
% Smaller pages are \emph{not} scaled up, just their local offset
% is adjusted.
% \begin{macrocode}
- \setlength{\@tempdima}{(\AM@templatewidth - \AM@localwd)
+ \setlength{\@tempdima}{(\AM@templatewidth - \AM@localwd)
* \real{.5}}%
\edef\AM@localxoff{\the\@tempdima}%
\setlength{\@tempdima}{(\AM@templateheight - \AM@localht)
@@ -1877,25 +1903,25 @@
\ifthenelse{\boolean{AM@landscape}}
{\def\AM@xpos{%
\AM@xmargin \AM@add\AM@xoffset + \AM@localxoff +
- (\AM@templatewidth + \AM@deltax + \tw@\fboxrule) *
+ (\AM@templatewidth + \AM@deltax + \tw@\AM@fboxrule) *
(\AM@ynupi - 1)
}%
\def\AM@ypos{%
\AM@texcoord +
\AM@ymargin + \AM@yoffset + \AM@localyoff +
- (\AM@templateheight + \AM@deltay + \tw@\fboxrule) *
+ (\AM@templateheight + \AM@deltay + \tw@\AM@fboxrule) *
(\AM@xnupi - 1)
}%
}
{\def\AM@xpos{%
\AM@xmargin \AM@add\AM@xoffset + \AM@localxoff +
- (\AM@templatewidth + \AM@deltax + \tw@\fboxrule) *
+ (\AM@templatewidth + \AM@deltax + \tw@\AM@fboxrule) *
(\AM@xnupi - 1)
}%
\def\AM@ypos{%
\AM@texcoord +
\AM@ymargin + \AM@yoffset + \AM@localyoff +
- (\AM@templateheight + \AM@deltay + \tw@\fboxrule) *
+ (\AM@templateheight + \AM@deltay + \tw@\AM@fboxrule) *
(\AM@ynup-\AM@ynupi)
}%
}%
@@ -1903,7 +1929,6 @@
\edef\AM@xpos{\strip@pt\@tempdima}%
\setlength{\@tempdima}{\AM@ypos}%
\edef\AM@ypos{\strip@pt\@tempdima}%
- \setlength{\fboxsep}{\z@}%
% \end{macrocode}
% Calculate |fitr| coordinates, if |linkfit=region|.
% \begin{macrocode}
@@ -1936,11 +1961,14 @@
\noexpand\raise \ht\@tempboxa \hbox{\AM@hyper@begin@i}%
% \end{macrocode}
% \begin{macrocode}
+ \global\pdfpages@includegraphics@status\@ne
+ \fboxsep=\z@
\AM@hyper@begin@ii\noexpand\AM@fbox{%
\noexpand\AM@ARBug@hook
\noexpand\AM@reflectbox{%
\expandafter\noexpand\expandafter
\includegraphics\AM@opts{\AM@docname}}}%
+ \global\pdfpages@includegraphics@status\tw@
\AM@hyper@end}}%
}%
\fi
@@ -2197,7 +2225,7 @@
\fi
\advance\@tempcntb\AM@inc
\whiledo{\@tempcnta\AM@rel\@tempcntb}{%
- \AM@checkpagenumber{\the\@tempcnta}%
+ \AM@checkpagenumber{\the\@tempcnta}%
\AM@append{\the\@tempcnta}%
\advance\@tempcnta\AM@inc
}%
@@ -2277,8 +2305,8 @@
% \macro{\AM@getfirst}
% \macro{\AM@getfirsti}
% \macro{\AM@getfirstii}
-% Parameter |#1| must be a macro containing a csv-list.
-% |\AM@getfirst| removes the first item of this list
+% Parameter |#1| must be a macro containing a csv-list.
+% |\AM@getfirst| removes the first item of this list
% \textit{and} stores it in |\toks@|.
% \begin{macrocode}
\newif\ifAM@endoflist\AM@endoflistfalse
@@ -2682,7 +2710,7 @@
% \macro{\AM@hyper@begin@i}
% \macro{\AM@hyper@begin@ii}
% \macro{\AM@hyper@end}
-% Add hypertext operations (targets, links and threads) to
+% Add hypertext operations (targets, links and threads) to
% the inserted pages.
% \begin{macrocode}
\newcommand{\AM@hyper@begin@i}{%
@@ -2750,7 +2778,7 @@
}
% \end{macrocode}
% \macro{\AM@filluppagelist}
-% The number of items in |\AM@pagelist| and
+% The number of items in |\AM@pagelist| and
% |\AM@doclist| should be a multiple of
% $|\AM@xnup|\nobreak\times\nobreak|\AM@ynup|$.
% If not, fill up the lists with empty items.
@@ -2847,7 +2875,7 @@
}%
\@tempcnta=\z@
\@tempcntb=\AM@signature\relax
- \whiledo{\@tempcnta<\@tempcntb}{%
+ \whiledo{\@tempcnta<\@tempcntb}{%
\ifAM@landscape
\ifAM@signaturestar
\AM@first\AM@last\AM@first\AM@last
@@ -2902,7 +2930,7 @@
\def\AM@gobble##1\END,{}%
\ifx\\#1\\%
\expandafter\AM@setphantompage
- \else
+ \else
\def\AM@phantompage{#1}%
\expandafter\AM@gobble
\fi
@@ -2912,21 +2940,21 @@
\newcommand{\AM@setphantomdoc}{}
\def\AM@setphantomdoc#1,#2\END{\edef\AM@phantomdoc{#1}}
% \end{macrocode}
-% \macro{\AM@addtotoc}
+% \macro{\AM@addtotoc}
% \macro{\AM@parse@toclist}
% \macro{\AM@parse@toclisti}
% \macro{\AM@rm@from@toclist}
% \macro{\AM@rm@from@toclisti}
% These macros add entries to the table of contents (toc).
-%
+%
% |\AM@parse@addtotoc| reads the next entries from the list
% |\AM@toclist| and prepares some macros (|\AM@toc@page|,
% |\AM@toc@section|, etc.), which are used by |\AM@addtotoc|.
-%
+%
% The list |\AM@toclist| is a comma separated list and must
% contain a multiple of five entries, which there are:
% \meta{page number}, \meta{section}, \meta{level},
-% \meta{heading} and \meta{label}.
+% \meta{heading} and \meta{label}.
% \meta{section} is e.g., `chapter', `section', `subsection', etc.
% and \meta{level} is a number, denoting depth of section e.g.,
% chapter=0, section=1, etc.
@@ -3043,7 +3071,7 @@
\def\AM@lof@heading{\ignorespaces #3}%
\edef\AM@lof@label{\AM@trim@space{#4}}%
\AM@checkinteger{\AM@lof@page}%
- \ifAM@integer\else
+ \ifAM@integer\else
\PackageError{pdfpages}
{Missing number.\MessageBreak
Page number in option `addtolist' is not a number}
@@ -3395,7 +3423,7 @@
%</ppluatexdef>
% \end{macrocode}
-% Check if the graphics package was loaded with an
+% Check if the graphics package was loaded with an
% incompatible driver option (e.g. dvips).
% \begin{macrocode}
%<*pppdftexdef>
@@ -3409,7 +3437,7 @@
\aftergroup\endinput}{}
\endgroup
% \end{macrocode}
-% Check for \texttt{pdftex.def} version \texttt{2000/05/12 v0.02u}
+% Check for \texttt{pdftex.def} version \texttt{2000/05/12 v0.02u}
% or higher:
% \begin{list}{$\ast$}{\versionlist}
% \makeatletter\@beginparpenalty=10000\makeatother
@@ -3450,12 +3478,12 @@
% is used repeatedly on the same file. Heiko is aware of this and will provide
% a solution in pdftex.def. Until then we will use the original graphicx's filename
% from |\Gread@@pdftex|.
-%
+%
% \def\AM@getpagecount{%
% \setbox\@tempboxa=\hbox{\includegraphics{\AM@currentdocname}}%
% \edef\AM@pagecount{\the\AM@lastsavedimageresourcepages}%
% }
-%
+%
% \begin{macrocode}
%<*(pppdftexdef,ppluatexdef)>
\let\AM@Gread@@pdftex\Gread@@pdftex
@@ -3625,7 +3653,7 @@
%
% \subsubsection{\VTeX\ driver}
%
-% Check if the graphics package was loaded with an
+% Check if the graphics package was loaded with an
% incompatible driver option (e.g. dvips).
% \begin{macrocode}
\begingroup
@@ -3752,7 +3780,7 @@
%
% \subsubsection{\XeTeX\ driver}
%
-% Check if the graphics package was loaded with an
+% Check if the graphics package was loaded with an
% incompatible driver option (e.g. dvips).
% \begin{macrocode}
\begingroup
@@ -4000,7 +4028,7 @@
\def\AM@getpagecount{%
\ifx\AM@pagecount\AM@undefined
\AM@notsupported{Page selections}
- \def\AM@pagecount{1}%
+ \def\AM@pagecount{1}%
\gdef\AM@getpagecount{%
\def\AM@pagecount{1}%
}%
@@ -4042,12 +4070,12 @@
% Link to original document.
% \begin{macrocode}
\def\AM@linktodoc@special@begin{Links}
-\let\AM@linktodoc@special@end\relax
+\let\AM@linktodoc@special@end\relax
% \end{macrocode}
% Survey.
% \begin{macrocode}
\def\AM@survey@special@begin{\AM@notsupported{Option survey}}
-\let\AM@survey@special@end\relax
+\let\AM@survey@special@end\relax
% \end{macrocode}
% Thread.
% \begin{macrocode}
@@ -4080,7 +4108,7 @@
\fi
}}{}
% \end{macrocode}
-%
+%
% \iffalse
%</ppdvipsdef>
%
@@ -4268,8 +4296,8 @@
% \end{macrocode}
% Survey.
% \begin{macrocode}
-\let\AM@survey@special@begin\relax
-\let\AM@survey@special@end\relax
+\let\AM@survey@special@begin\relax
+\let\AM@survey@special@end\relax
% \end{macrocode}
% Thread.
% \begin{macrocode}
@@ -4780,8 +4808,21 @@
% \item Option |openrighteach| added.
% \end{itemize}
%
+% \subsection*{2021/01/09 v0.5r}
+% \begin{itemize}
+% \item |\pdfpages@includegraphics@status| added.
+% \end{itemize}
+%
+% \subsection*{2021/02/05 v0.5s}
+% \begin{itemize}
+% \item Pdfpages redefined |\fboxsep| and |\fboxrule| inside
+% |\includepdf|. Thereby causing unexpected results if |\fbox| was used
+% inside option |picturecommand|. This bug is fixed. Now |\fboxsep| and
+% |\fboxrule| equal the values which were active just before
+% calling |\includepdf|.
+% \end{itemize}
% \Finale
-%
+%
% \iffalse
%<*example1>
\documentclass[a4paper,12pt]{article}
@@ -4837,10 +4878,10 @@ landscape orientation, you use a PDF viewer that
does not support this option.)
\begin{example}
-\includepdf[nup=1x2, landscape,
+\includepdf[nup=1x2, landscape,
pages=4-7, turn=false]{dummy.pdf}
\end{example}
-\includepdf[nup=1x2, landscape,
+\includepdf[nup=1x2, landscape,
pages=4-7, turn=false]{dummy.pdf}
\begin{example}
@@ -4869,7 +4910,7 @@ option \texttt{column}.
\noindent
Sometimes it might be useful to put an empty page
-at the beginning.
+at the beginning.
\begin{example}
\includepdf[nup=2x2, pages={{},5-7}]{dummy.pdf}
\end{example}
@@ -4879,7 +4920,7 @@ at the beginning.
\section{Changing Layout}
To put some space between the logical pages, use the option
-\texttt{delta}.
+\texttt{delta}.
Any options of \verb|\includegraphics| are allowed in
\verb|\includepdf| as well. See the \texttt{scale}
@@ -4910,7 +4951,7 @@ document use the \texttt{trim} and \texttt{clip}
options of the \texttt{graphicx} package.
\begin{example}
-\includepdf[nup=2x2, pages=1-4,
+\includepdf[nup=2x2, pages=1-4,
trim=0 40mm 0 40mm,
clip, pagecommand={}]{dummy.pdf}
\end{example}
@@ -4919,12 +4960,12 @@ options of the \texttt{graphicx} package.
\noindent The option
\verb|pagecommand={\thispagestyle{empty}}|
is set by default. If you don't want the page style
-to be set to empty, you can remove this default
+to be set to empty, you can remove this default
setting by using the \texttt{pagecommand} option
as follows:
\verb|pagecommand={}|.
-\includepdf[nup=2x2, pages=1-4,
+\includepdf[nup=2x2, pages=1-4,
trim=0 40mm 0 40mm,
clip, pagecommand={}]{dummy.pdf}
@@ -5017,7 +5058,7 @@ and the \hyperlink{dummy.pdf.2}{second page}.
\includepdf[pages=1-2, link]{dummy.pdf}
-Inserting the same page twice would result in two
+Inserting the same page twice would result in two
identical link names. To prevent this use the option
\texttt{linkname} to specify another name for the links.
@@ -5101,11 +5142,11 @@ The next pages were inserted using the following command:
\end{verbatim}
\noindent
-See Chapter \ref{cha:main} (\nameref{cha:main}) on page
+See Chapter \ref{cha:main} (\nameref{cha:main}) on page
\pageref{cha:main}.\par\noindent
-See Section \ref{sec:first} (\nameref{sec:first}) on page
+See Section \ref{sec:first} (\nameref{sec:first}) on page
\pageref{sec:first}.\par\noindent
-See Section \ref{sec:second} (\nameref{sec:second}) on page
+See Section \ref{sec:second} (\nameref{sec:second}) on page
\pageref{sec:second}.
\includepdf[pages=1-6,
diff --git a/Master/texmf-dist/source/latex/pdfpc/pdfpc.dtx b/Master/texmf-dist/source/latex/pdfpc/pdfpc.dtx
deleted file mode 100644
index ad5430f3240..00000000000
--- a/Master/texmf-dist/source/latex/pdfpc/pdfpc.dtx
+++ /dev/null
@@ -1,177 +0,0 @@
-%\iffalse
-%<*package>
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
-%</package>
-%\fi
-%\iffalse
-% Doc-Source file to use with LaTeX2e
-%
-% This file is part of pdfpc.
-% Copyright (C) 2020 Evgeny Stambulchik
-%
-% This program is free software; you can redistribute it and/or modify
-% it under the terms of the GNU General Public License as published by
-% the Free Software Foundation; either version 3 of the License, or
-% (at your option) any later version.
-%
-% This program is distributed in the hope that it will be useful,
-% but WITHOUT ANY WARRANTY; without even the implied warranty of
-% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-% GNU General Public License for more details.
-%
-% You should have received a copy of the GNU General Public License along
-% with this program; if not, write to the Free Software Foundation, Inc.,
-% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-% -------------------------------------------------------------------------------------------
-%
-% Allow for defining some meta data and simple textual notes for use
-% with the pdfpc presentation application <https://pdfpc.github.io>.
-%
-% -------------------------------------------------------------------------------------------
-%
-% Inspired by Carsten Brandt's <https://github.com/cebe/pdfpc-latex-notes>.
-%
-% -------------------------------------------------------------------------------------------
-%
-% Please report bugs and other problems as well as suggestions for improvements
-% to the issue tracker at github <https://github.com/pdfpc/pdfpc/>
-%
-% -------------------------------------------------------------------------------------------
-%\fi
-%
-% Identify the package and force \LaTeXe:
-% \begin{macrocode}
-\ProvidesPackage{pdfpc}[2019/12/03 v0.2.1 PDFPC]
-\NeedsTeXFormat{LaTeX2e}
-% \end{macrocode}
-%
-% Require additional packages needed by \sty{pdfpc}:
-% \begin{macrocode}
-\RequirePackage{kvoptions}
-\RequirePackage{xstring}
-\RequirePackage{pdfcomment}
-\RequirePackage{hyperxmp}
-% \end{macrocode}
-%
-\SetupKeyvalOptions{
- family=PDFPC,
- prefix=PDFPC@
-}
-%
-\DeclareStringOption{duration}
-\DeclareStringOption{starttime}
-\DeclareStringOption{endtime}
-\DeclareStringOption{enduserslide}
-\DeclareStringOption{lastminutes}
-\DeclareBoolOption{overridenote}
-\DeclareStringOption{notesposition}
-\DeclareDefaultOption{\@unknownoptionerror}
-%
-\ProcessKeyvalOptions*
-%
-\ifx\PDFPC@duration\@empty
-\else
- \IfInteger{\PDFPC@duration}{}
- {\PackageWarningNoLine{pdfpc}{`duration' should be an integer}}%
-\fi
-%
-\ifx\PDFPC@enduserslide\@empty
-\else
- \IfInteger{\PDFPC@enduserslide}{}
- {\PackageWarningNoLine{pdfpc}{`enduserslide' should be an integer}}%
-\fi
-%
-\ifx\PDFPC@lastminutes\@empty
-\else
- \IfInteger{\PDFPC@lastminutes}{}
- {\PackageWarningNoLine{pdfpc}{`lastminutes' should be an integer}}%
-\fi
-%
-\ifPDFPC@overridenote
- \renewcommand{\note}[2][]{%
- \IfStrEq{#1}{item}%
- % Imitate a bullet
- {\pdfpcnote{* #2}}%
- {\pdfpcnote{#2}}%
- }%
-\fi
-%
-\def\pdfpc@notespositionauto{auto}%
-\ifx\PDFPC@notesposition\@empty%
- \def\PDFPC@notesposition{auto}%
-\fi%
-%
-% Guesswork for beamer/pgfpages notes
-% \begin{macrocode}
-\ifx\PDFPC@notesposition\pdfpc@notespositionauto%
- \def\PDFPC@notesposition{none}%
- \def\pdfpc@onepaperheight{\paperheight}%
- \def\pdfpc@twopaperheight{2\paperheight}%
- \def\pdfpc@onepaperwidth{\paperwidth}%
- \def\pdfpc@twopaperwidth{2\paperwidth}%
- \def\pdfpc@pagecenter{\pgfpoint{.5\paperwidth}{.5\paperheight}}%
-
- \ifx\pgfpageoptiontwoheight\pdfpc@onepaperheight%
- \ifx\pgfpageoptiontwowidth\pdfpc@twopaperwidth%
- \ifx\pgfpageoptionfirstcenter\pdfpc@pagecenter%
- \def\PDFPC@notesposition{right}%
- \else%
- \def\PDFPC@notesposition{left}%
- \fi%
- \fi%
- \fi%
- \ifx\pgfpageoptiontwoheight\pdfpc@twopaperheight%
- \ifx\pgfpageoptiontwowidth\pdfpc@onepaperwidth%
- \ifx\pgfpageoptionfirstcenter\pdfpc@pagecenter%
- \def\PDFPC@notesposition{top}%
- \else%
- \def\PDFPC@notesposition{bottom}%
- \fi%
- \fi%
- \fi%
-\fi%
-% \end{macrocode}
-%
-% Our schema
-% \begin{macrocode}
-\newcommand*{\pdfpc@schema}{%
- \hyxmp@add@to@xml{%
-______<rdf:Description xmlns:pdfpc="https://github.com/pdfpc/pdfpc">^^J%
- }%
- \hyxmp@add@simple{pdfpc:Duration}{\PDFPC@duration}%
- \hyxmp@add@simple{pdfpc:StartTime}{\PDFPC@starttime}%
- \hyxmp@add@simple{pdfpc:EndTime}{\PDFPC@endtime}%
- \hyxmp@add@simple{pdfpc:EndUserSlide}{\PDFPC@enduserslide}%
- \hyxmp@add@simple{pdfpc:LastMinutes}{\PDFPC@lastminutes}%
- \hyxmp@add@simple{pdfpc:NotesPosition}{\PDFPC@notesposition}%
- \hyxmp@add@to@xml{%
-______</rdf:Description>^^J%
- }%
-}
-%
-% Piggybacking on the hyperxmp schema...
-% \begin{macrocode}
-\let\oldhyxmp@pdf@schema\hyxmp@pdf@schema
-\renewcommand{\hyxmp@pdf@schema}{{\oldhyxmp@pdf@schema}{\pdfpc@schema}}
-% \end{macrocode}
-
-% Note command
-% \begin{macrocode}
-\newcommand{\pdfpcnote}[1]{\pdfmargincomment{#1}}
-% \end{macrocode}
-%
-\endinput
diff --git a/Master/texmf-dist/source/latex/pdfpc/pdfpc.ins b/Master/texmf-dist/source/latex/pdfpc/pdfpc.ins
deleted file mode 100644
index 905306c93e3..00000000000
--- a/Master/texmf-dist/source/latex/pdfpc/pdfpc.ins
+++ /dev/null
@@ -1,38 +0,0 @@
-\input docstrip
-
-\preamble
- pdfpc.dtx
- Copyright (C) 2020 Evgeny Stambulchik
-
- This file is part of pdfpc.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
- This work consists of the files pdfpc.dtx, pdfpc.ins, and the derived file
- pdfpc.sty
-
-\endpreamble
-
-\askforoverwritefalse
-
-\generate
-{%
- \file{pdfpc.sty}{%
- \usepreamble\defaultpreamble
- \usepostamble\defaultpostamble
- \from{pdfpc.dtx}{pdfpc.sty,package}%
- }%
-}
-\endbatchfile
diff --git a/Master/texmf-dist/source/latex/pdftexcmds/pdftexcmds.dtx b/Master/texmf-dist/source/latex/pdftexcmds/pdftexcmds.dtx
deleted file mode 100644
index c7002222ea8..00000000000
--- a/Master/texmf-dist/source/latex/pdftexcmds/pdftexcmds.dtx
+++ /dev/null
@@ -1,2662 +0,0 @@
-% \iffalse meta-comment
-%
-% File: pdftexcmds.dtx
-% Version: 2019/11/24 v0.31
-% Info: Utility functions of pdfTeX for LuaTeX
-%
-% Copyright (C)
-% 2007, 2009-2011 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
-%
-% 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. This version of this license is in
-% https://www.latex-project.org/lppl/lppl-1-3c.txt
-% and 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 Maintainers of this work are
-% Heiko Oberdiek and the Oberdiek Package Support Group
-% https://github.com/ho-tex/pdftexcmds/issues
-%
-% The Base Interpreter refers to any `TeX-Format',
-% because some files are installed in TDS:tex/generic//.
-%
-% This work consists of the main source file pdftexcmds.dtx
-% and the derived files
-% pdftexcmds.sty, pdftexcmds.pdf, pdftexcmds.ins, pdftexcmds.drv,
-% pdftexcmds.bib, pdftexcmds-test1.tex, pdftexcmds-test2.tex,
-% pdftexcmds-test-shell.tex, pdftexcmds-test-escape.tex,
-% pdftexcmds.lua.
-%
-% Distribution:
-% CTAN:macros/latex/contrib/pdftexcmds/pdftexcmds.dtx
-% CTAN:macros/latex/contrib/pdftexcmds/pdftexcmds.pdf
-%
-% Unpacking:
-% (a) If pdftexcmds.ins is present:
-% tex pdftexcmds.ins
-% (b) Without pdftexcmds.ins:
-% tex pdftexcmds.dtx
-% (c) If you insist on using LaTeX
-% latex \let\install=y\input{pdftexcmds.dtx}
-% (quote the arguments according to the demands of your shell)
-%
-% Documentation:
-% (a) If pdftexcmds.drv is present:
-% latex pdftexcmds.drv
-% (b) Without pdftexcmds.drv:
-% latex pdftexcmds.dtx; ...
-% The class ltxdoc loads the configuration file ltxdoc.cfg
-% if available. Here you can specify further options, e.g.
-% use A4 as paper format:
-% \PassOptionsToClass{a4paper}{article}
-%
-% Programm calls to get the documentation (example):
-% pdflatex pdftexcmds.dtx
-% bibtex pdftexcmds.aux
-% makeindex -s gind.ist pdftexcmds.idx
-% pdflatex pdftexcmds.dtx
-% makeindex -s gind.ist pdftexcmds.idx
-% pdflatex pdftexcmds.dtx
-%
-% Installation:
-% TDS:tex/generic/pdftexcmds/pdftexcmds.sty
-% TDS:scripts/pdftexcmds/pdftexcmds.lua
-% TDS:doc/latex/pdftexcmds/pdftexcmds.pdf
-% TDS:source/latex/pdftexcmds/pdftexcmds.dtx
-%
-%<*ignore>
-\begingroup
- \catcode123=1 %
- \catcode125=2 %
- \def\x{LaTeX2e}%
-\expandafter\endgroup
-\ifcase 0\ifx\install y1\fi\expandafter
- \ifx\csname processbatchFile\endcsname\relax\else1\fi
- \ifx\fmtname\x\else 1\fi\relax
-\else\csname fi\endcsname
-%</ignore>
-%<*install>
-\input docstrip.tex
-\Msg{************************************************************************}
-\Msg{* Installation}
-\Msg{* Package: pdftexcmds 2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO)}
-\Msg{************************************************************************}
-
-\keepsilent
-\askforoverwritefalse
-
-\let\MetaPrefix\relax
-\preamble
-
-This is a generated file.
-
-Project: pdftexcmds
-Version: 2019/11/24 v0.31
-
-Copyright (C)
- 2007, 2009-2011 Heiko Oberdiek
- 2016-2019 Oberdiek Package Support Group
-
-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. This version of this license is in
- https://www.latex-project.org/lppl/lppl-1-3c.txt
-and 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 Maintainers of this work are
-Heiko Oberdiek and the Oberdiek Package Support Group
-https://github.com/ho-tex/pdftexcmds/issues
-
-
-The Base Interpreter refers to any `TeX-Format',
-because some files are installed in TDS:tex/generic//.
-
-This work consists of the main source file pdftexcmds.dtx
-and the derived files
- pdftexcmds.sty, pdftexcmds.pdf, pdftexcmds.ins, pdftexcmds.drv,
- pdftexcmds.lua.
-
-\endpreamble
-\let\MetaPrefix\DoubleperCent
-
-\generate{%
- \file{pdftexcmds.ins}{\from{pdftexcmds.dtx}{install}}%
- \file{pdftexcmds.drv}{\from{pdftexcmds.dtx}{driver}}%
- \nopreamble
- \nopostamble
- \file{pdftexcmds.bib}{\from{pdftexcmds.dtx}{bib}}%
- \usepreamble\defaultpreamble
- \usepostamble\defaultpostamble
- \usedir{tex/generic/pdftexcmds}%
- \file{pdftexcmds.sty}{\from{pdftexcmds.dtx}{package}}%
-% \usedir{doc/latex/pdftexcmds/test}%
-% \file{pdftexcmds-test1.tex}{\from{pdftexcmds.dtx}{test1}}%
-% \file{pdftexcmds-test2.tex}{\from{pdftexcmds.dtx}{test2}}%
-% \file{pdftexcmds-test-shell.tex}{\from{pdftexcmds.dtx}{test-shell}}%
-% \file{pdftexcmds-test-escape.tex}{\from{pdftexcmds.dtx}{test-escape}}%
- \nopreamble
- \nopostamble
-% \usedir{source/latex/pdftexcmds/catalogue}%
-% \file{pdftexcmds.xml}{\from{pdftexcmds.dtx}{catalogue}}%
-}
-\def\MetaPrefix{-- }
-\def\defaultpostamble{%
- \MetaPrefix^^J%
- \MetaPrefix\space End of File `\outFileName'.%
-}
-\def\currentpostamble{\defaultpostamble}%
-\generate{%
- \usedir{scripts/pdftexcmds}%
- \file{pdftexcmds.lua}{\from{pdftexcmds.dtx}{lua}}%
-}
-
-\catcode32=13\relax% active space
-\let =\space%
-\Msg{************************************************************************}
-\Msg{*}
-\Msg{* To finish the installation you have to move the following}
-\Msg{* file into a directory searched by TeX:}
-\Msg{*}
-\Msg{* pdftexcmds.sty}
-\Msg{*}
-\Msg{* And install the following script files:}
-\Msg{*}
-\Msg{* pdftexcmds.lua}
-\Msg{*}
-\Msg{* To produce the documentation run the file `pdftexcmds.drv'}
-\Msg{* through LaTeX.}
-\Msg{*}
-\Msg{* Happy TeXing!}
-\Msg{*}
-\Msg{************************************************************************}
-
-\endbatchfile
-%</install>
-%<*bib>
-@online{AndyThomas:Analog,
- author={Thomas, Andy},
- title={Analog of {\texttt{\csname textbackslash\endcsname}pdfelapsedtime} for
- {\hologo{LuaTeX}} and {\hologo{XeTeX}}},
- url={http://tex.stackexchange.com/a/32531},
- urldate={2011-11-29},
-}
-%</bib>
-%<*ignore>
-\fi
-%</ignore>
-%<*driver>
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{pdftexcmds.drv}%
- [2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO)]%
-\documentclass{ltxdoc}
-\usepackage{holtxdoc}[2011/11/22]
-\usepackage{paralist}
-\usepackage{csquotes}
-\usepackage[
- backend=bibtex,
- bibencoding=ascii,
- alldates=iso8601,
-]{biblatex}[2011/11/13]
-\bibliography{oberdiek-source}
-\bibliography{pdftexcmds}
-\begin{document}
- \DocInput{pdftexcmds.dtx}%
-\end{document}
-%</driver>
-% \fi
-%
-%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
-%
-% \GetFileInfo{pdftexcmds.drv}
-%
-% \title{The \xpackage{pdftexcmds} package}
-% \date{2019/11/24 v0.31}
-% \author{Heiko Oberdiek\thanks
-% {Please report any issues at \url{https://github.com/ho-tex/pdftexcmds/issues}}}
-%
-% \maketitle
-%
-% \begin{abstract}
-% \hologo{LuaTeX} provides most of the commands of \hologo{pdfTeX} 1.40. However
-% a number of utility functions are removed. This package tries to fill
-% the gap and implements some of the missing primitive using Lua.
-% \end{abstract}
-%
-% \tableofcontents
-%
-% \def\csi#1{\texttt{\textbackslash\textit{#1}}}
-%
-% \section{Documentation}
-%
-% Some primitives of \hologo{pdfTeX} \cite{pdftex-manual}
-% are not defined by \hologo{LuaTeX} \cite{luatex-manual}.
-% This package implements macro based solutions using Lua code
-% for the following missing \hologo{pdfTeX} primitives;
-% \begin{compactitem}
-% \item \cs{pdfstrcmp}
-% \item \cs{pdfunescapehex}
-% \item \cs{pdfescapehex}
-% \item \cs{pdfescapename}
-% \item \cs{pdfescapestring}
-% \item \cs{pdffilesize}
-% \item \cs{pdffilemoddate}
-% \item \cs{pdffiledump}
-% \item \cs{pdfmdfivesum}
-% \item \cs{pdfresettimer}
-% \item \cs{pdfelapsedtime}
-% \item |\immediate\write18|
-% \end{compactitem}
-% The original names of the primitives cannot be used:
-% \begin{itemize}
-% \item
-% The syntax for their arguments cannot easily
-% simulated by macros. The primitives using key words
-% such as |file| (\cs{pdfmdfivesum}) or |offset| and |length|
-% (\cs{pdffiledump}) and uses \meta{general text} for the other
-% arguments. Using token registers assignments, \meta{general text} could
-% be catched. However, the simulated primitives are expandable
-% and register assignments would destroy this important property.
-% (\meta{general text} allows something like |\expandafter\bgroup ...}|.)
-% \item
-% The original primitives can be expanded using one expansion step.
-% The new macros need two expansion steps because of the additional
-% macro expansion. Example:
-% \begin{quote}
-% |\expandafter\foo\pdffilemoddate{file}|\\
-% vs.\\
-% |\expandafter\expandafter\expandafter|\\
-% |\foo\pdf@filemoddate{file}|
-% \end{quote}
-% \end{itemize}
-%
-% \hologo{LuaTeX} isn't stable yet and thus the status of this package is
-% \emph{experimental}. Feedback is welcome.
-%
-% \subsection{General principles}
-%
-% \begin{description}
-% \item[Naming convention:]
-% Usually this package defines a macro |\pdf@|\meta{cmd} if
-% \hologo{pdfTeX} provides |\pdf|\meta{cmd}.
-% \item[Arguments:] The order of arguments in |\pdf@|\meta{cmd}
-% is the same as for the corresponding primitive of \hologo{pdfTeX}.
-% The arguments are ordinary undelimited \hologo{TeX} arguments,
-% no \meta{general text} and without additional keywords.
-% \item[Expandibility:]
-% The macro |\pdf@|\meta{cmd} is expandable if the
-% corresponding \hologo{pdfTeX} primitive has this property.
-% Exact two expansion steps are necessary (first is the macro
-% expansion) except for \cs{pdf@primitive} and \cs{pdf@ifprimitive}.
-% The latter ones are not macros, but have the direct meaning of the
-% primitive.
-% \item[Without \hologo{LuaTeX}:]
-% The macros |\pdf@|\meta{cmd} are mapped to the commands
-% of \hologo{pdfTeX} if they are available. Otherwise they are undefined.
-% \item[Availability:]
-% The macros that the packages provides are undefined, if
-% the necessary primitives are not found and cannot be
-% implemented by Lua.
-% \end{description}
-%
-% \subsection{Macros}
-%
-% \subsubsection[Strings]{Strings \cite[``7.15 Strings'']{pdftex-manual}}
-%
-% \begin{declcs}{pdf@strcmp} \M{stringA} \M{stringB}
-% \end{declcs}
-% Same as |\pdfstrcmp{|\meta{stringA}|}{|\meta{stringB}|}|.
-%
-% \begin{declcs}{pdf@unescapehex} \M{string}
-% \end{declcs}
-% Same as |\pdfunescapehex{|\meta{string}|}|.
-% The argument is a byte string given in hexadecimal notation.
-% The result are character tokens from 0 until 255 with
-% catcode 12 and the space with catcode 10.
-%
-% \begin{declcs}{pdf@escapehex} \M{string}\\
-% \cs{pdf@escapestring} \M{string}\\
-% \cs{pdf@escapename} \M{string}
-% \end{declcs}
-% Same as the primitives of \hologo{pdfTeX}. However \hologo{pdfTeX} does not
-% know about characters with codes 256 and larger. Thus the
-% string is treated as byte string, characters with more than
-% eight bits are ignored.
-%
-% \subsubsection[Files]{Files \cite[``7.18 Files'']{pdftex-manual}}
-%
-% \begin{declcs}{pdf@filesize} \M{filename}
-% \end{declcs}
-% Same as |\pdffilesize{|\meta{filename}|}|.
-%
-% \begin{declcs}{pdf@filemoddate} \M{filename}
-% \end{declcs}
-% Same as |\pdffilemoddate{|\meta{filename}|}|.
-%
-% \begin{declcs}{pdf@filedump} \M{offset} \M{length} \M{filename}
-% \end{declcs}
-% Same as |\pdffiledump offset| \meta{offset} |length| \meta{length}
-% |{|\meta{filename}|}|. Both \meta{offset} and \meta{length} must
-% not be empty, but must be a valid \hologo{TeX} number.
-%
-% \begin{declcs}{pdf@mdfivesum} \M{string}
-% \end{declcs}
-% Same as |\pdfmdfivesum{|\meta{string}|}|. Keyword |file| is supported
-% by macro \cs{pdf@filemdfivesum}.
-%
-% \begin{declcs}{pdf@filemdfivesum} \M{filename}
-% \end{declcs}
-% Same as |\pdfmdfivesum file{|\meta{filename}|}|.
-%
-% \subsubsection[Timekeeping]{Timekeeping \cite[``7.17 Timekeeping'']{pdftex-manual}}
-%
-% The timekeeping macros are based on Andy Thomas' work \cite{AndyThomas:Analog}.
-%
-% \begin{declcs}{pdf@resettimer}
-% \end{declcs}
-% Same as \cs{pdfresettimer}, it resets the internal timer.
-%
-% \begin{declcs}{pdf@elapsedtime}
-% \end{declcs}
-% Same as \cs{pdfelapsedtime}. It behaves like a read-only integer.
-% For printing purposes it can be prefixed by \cs{the} or \cs{number}.
-% It measures the time in scaled seconds (seconds multiplied with 65536)
-% since the latest call of \cs{pdf@resettimer} or start of
-% program/package. The resolution, the shortest time interval that
-% can be measured, depends on the program and system.
-% \begin{itemize}
-% \item \hologo{pdfTeX} with |gettimeofday|: $\ge$ 1/65536\,s
-% \item \hologo{pdfTeX} with |ftime|: $\ge$ 1\,ms
-% \item \hologo{pdfTeX} with |time|: $\ge$ 1\,s
-% \item \hologo{LuaTeX}: $\ge$ 10\,ms\\
-% (|os.clock()| returns a float number with two decimal digits in
-% \hologo{LuaTeX} beta-0.70.1-2011061416 (rev 4277)).
-% \end{itemize}
-%
-% \subsubsection[Miscellaneous]{Miscellaneous \cite[``7.21 Miscellaneous'']{pdftex-manual}}
-%
-% \begin{declcs}{pdf@draftmode}
-% \end{declcs}
-% If the \TeX\ compiler knows \cs{pdfdraftmode} or \cs{draftmode}
-% (\hologo{pdfTeX},
-% \hologo{LuaTeX}), then \cs{pdf@draftmode} returns, whether
-% this mode is enabled. The result is an implicit number:
-% one means the draft mode is available and enabled.
-% If the value is zero, then the mode is not active or
-% \cs{pdfdraftmode} is not available.
-% An explicit number is yielded by \cs{number}\cs{pdf@draftmode}.
-% The macro cannot
-% be used to change the mode, see \cs{pdf@setdraftmode}.
-%
-% \begin{declcs}{pdf@ifdraftmode} \M{true} \M{false}
-% \end{declcs}
-% If \cs{pdfdraftmode} is available and enabled, \meta{true} is
-% called, otherwise \meta{false} is executed.
-%
-% \begin{declcs}{pdf@setdraftmode} \M{value}
-% \end{declcs}
-% Macro \cs{pdf@setdraftmode} expects the number zero or one as
-% \meta{value}. Zero deactivates the mode and one enables the draft mode.
-% The macro does not have an effect, if the feature \cs{pdfdraftmode} is not
-% available.
-%
-% \begin{declcs}{pdf@shellescape}
-% \end{declcs}
-% Same as |\pdfshellescape|. It is or expands to |1| if external
-% commands can be executed and |0| otherwise. In \hologo{pdfTeX} external
-% commands must be enabled first by command line option or
-% configuration option. In \hologo{LuaTeX} option |--safer| disables
-% the execution of external commands.
-%
-% In \hologo{LuaTeX} before 0.68.0 \cs{pdf@shellescape} is not
-% available due to a bug in |os.execute()|. The argumentless form
-% crashes in some circumstances with segmentation fault.
-% (It is fixed in version 0.68.0 or revision 4167 of \hologo{LuaTeX}.
-% and packported to some version of 0.67.0).
-%
-% Hints for usage:
-% \begin{itemize}
-% \item Before its use \cs{pdf@shellescape} should be tested,
-% whether it is available. Example with package \xpackage{ltxcmds}
-% (loaded by package \xpackage{pdftexcmds}):
-%\begin{quote}
-%\begin{verbatim}
-%\ltx@IfUndefined{pdf@shellescape}{%
-% % \pdf@shellescape is undefined
-%}{%
-% % \pdf@shellescape is available
-%}
-%\end{verbatim}
-%\end{quote}
-% Use \cs{ltx@ifundefined} in expandable contexts.
-% \item \cs{pdf@shellescape} might be a numerical constant,
-% expands to the primitive, or expands to a plain number.
-% Therefore use it in contexts where these differences does not matter.
-% \item Use in comparisons, e.g.:
-% \begin{quote}
-% |\ifnum\pdf@shellescape=0 ...|
-% \end{quote}
-% \item Print the number: |\number\pdf@shellescape|
-% \end{itemize}
-%
-% \begin{declcs}{pdf@system} \M{cmdline}
-% \end{declcs}
-% It is a wrapper for |\immediate\write18| in \hologo{pdfTeX} or
-% |os.execute| in \hologo{LuaTeX}.
-%
-% In theory |os.execute|
-% returns a status number. But its meaning is quite
-% undefined. Are there some reliable properties?
-% Does it make sense to provide an user interface to
-% this status exit code?
-%
-% \begin{declcs}{pdf@primitive} \csi{cmd}
-% \end{declcs}
-% Same as \cs{pdfprimitive} in \hologo{pdfTeX} or \hologo{LuaTeX}.
-% In \hologo{XeTeX} the
-% primitive is called \cs{primitive}. Despite the current definition
-% of the command \csi{cmd}, it's meaning as primitive is used.
-%
-% \begin{declcs}{pdf@ifprimitive} \csi{cmd}
-% \end{declcs}
-% Same as \cs{ifpdfprimitive} in \hologo{pdfTeX} or
-% \hologo{LuaTeX}. \hologo{XeTeX} calls
-% it \cs{ifprimitive}. It is a switch that checks if the command
-% \csi{cmd} has it's primitive meaning.
-%
-% \subsubsection{Additional macro: \cs{pdf@isprimitive}}
-%
-% \begin{declcs}{pdf@isprimitive} \csi{cmd1} \csi{cmd2} \M{true} \M{false}
-% \end{declcs}
-% If \csi{cmd1} has the primitive meaning given by the primitive name
-% of \csi{cmd2}, then the argument \meta{true} is executed, otherwise
-% \meta{false}. The macro \cs{pdf@isprimitive} is expandable.
-% Internally it checks the result of \cs{meaning} and is therefore
-% available for all \hologo{TeX} variants, even the original \hologo{TeX}.
-% Example with \hologo{LaTeX}:
-%\begin{quote}
-%\begin{verbatim}
-%\makeatletter
-%\pdf@isprimitive{@@input}{input}{%
-% \typeout{\string\@@input\space is original\string\input}%
-%}{%
-% \typeout{Oops, \string\@@input\space is not the %
-% original\string\input}%
-%}
-%\end{verbatim}
-%\end{quote}
-%
-% \subsubsection{Experimental}
-%
-% \begin{declcs}{pdf@unescapehexnative} \M{string}\\
-% \cs{pdf@escapehexnative} \M{string}\\
-% \cs{pdf@escapenamenative} \M{string}\\
-% \cs{pdf@mdfivesumnative} \M{string}
-% \end{declcs}
-% The variants without |native| in the macro name are supposed to
-% be compatible with \hologo{pdfTeX}. However characters with more than
-% eight bits are not supported and are ignored. If \hologo{LuaTeX} is
-% running, then its UTF-8 coded strings are used. Thus the full
-% unicode character range is supported. However the result
-% differs from \hologo{pdfTeX} for characters with eight or more bits.
-%
-% \begin{declcs}{pdf@pipe} \M{cmdline}
-% \end{declcs}
-% It calls \meta{cmdline} and returns the output of the external
-% program in the usual manner as byte string (catcode 12, space with
-% catcode 10). The Lua documentation says, that the used |io.popen|
-% may not be available on all platforms. Then macro \cs{pdf@pipe}
-% is undefined.
-%
-% \StopEventually{
-% }
-%
-% \section{Implementation}
-%
-% \begin{macrocode}
-%<*package>
-% \end{macrocode}
-%
-% \subsection{Reload check and package identification}
-% Reload check, especially if the package is not used with \LaTeX.
-% \begin{macrocode}
-\begingroup\catcode61\catcode48\catcode32=10\relax%
- \catcode13=5 % ^^M
- \endlinechar=13 %
- \catcode35=6 % #
- \catcode39=12 % '
- \catcode44=12 % ,
- \catcode45=12 % -
- \catcode46=12 % .
- \catcode58=12 % :
- \catcode64=11 % @
- \catcode123=1 % {
- \catcode125=2 % }
- \expandafter\let\expandafter\x\csname ver@pdftexcmds.sty\endcsname
- \ifx\x\relax % plain-TeX, first loading
- \else
- \def\empty{}%
- \ifx\x\empty % LaTeX, first loading,
- % variable is initialized, but \ProvidesPackage not yet seen
- \else
- \expandafter\ifx\csname PackageInfo\endcsname\relax
- \def\x#1#2{%
- \immediate\write-1{Package #1 Info: #2.}%
- }%
- \else
- \def\x#1#2{\PackageInfo{#1}{#2, stopped}}%
- \fi
- \x{pdftexcmds}{The package is already loaded}%
- \aftergroup\endinput
- \fi
- \fi
-\endgroup%
-% \end{macrocode}
-% Package identification:
-% \begin{macrocode}
-\begingroup\catcode61\catcode48\catcode32=10\relax%
- \catcode13=5 % ^^M
- \endlinechar=13 %
- \catcode35=6 % #
- \catcode39=12 % '
- \catcode40=12 % (
- \catcode41=12 % )
- \catcode44=12 % ,
- \catcode45=12 % -
- \catcode46=12 % .
- \catcode47=12 % /
- \catcode58=12 % :
- \catcode64=11 % @
- \catcode91=12 % [
- \catcode93=12 % ]
- \catcode123=1 % {
- \catcode125=2 % }
- \expandafter\ifx\csname ProvidesPackage\endcsname\relax
- \def\x#1#2#3[#4]{\endgroup
- \immediate\write-1{Package: #3 #4}%
- \xdef#1{#4}%
- }%
- \else
- \def\x#1#2[#3]{\endgroup
- #2[{#3}]%
- \ifx#1\@undefined
- \xdef#1{#3}%
- \fi
- \ifx#1\relax
- \xdef#1{#3}%
- \fi
- }%
- \fi
-\expandafter\x\csname ver@pdftexcmds.sty\endcsname
-\ProvidesPackage{pdftexcmds}%
- [2019/11/24 v0.31 Utility functions of pdfTeX for LuaTeX (HO)]%
-% \end{macrocode}
-%
-% \subsection{Catcodes}
-%
-% \begin{macrocode}
-\begingroup\catcode61\catcode48\catcode32=10\relax%
- \catcode13=5 % ^^M
- \endlinechar=13 %
- \catcode123=1 % {
- \catcode125=2 % }
- \catcode64=11 % @
- \def\x{\endgroup
- \expandafter\edef\csname pdftexcmds@AtEnd\endcsname{%
- \endlinechar=\the\endlinechar\relax
- \catcode13=\the\catcode13\relax
- \catcode32=\the\catcode32\relax
- \catcode35=\the\catcode35\relax
- \catcode61=\the\catcode61\relax
- \catcode64=\the\catcode64\relax
- \catcode123=\the\catcode123\relax
- \catcode125=\the\catcode125\relax
- }%
- }%
-\x\catcode61\catcode48\catcode32=10\relax%
-\catcode13=5 % ^^M
-\endlinechar=13 %
-\catcode35=6 % #
-\catcode64=11 % @
-\catcode123=1 % {
-\catcode125=2 % }
-\def\TMP@EnsureCode#1#2{%
- \edef\pdftexcmds@AtEnd{%
- \pdftexcmds@AtEnd
- \catcode#1=\the\catcode#1\relax
- }%
- \catcode#1=#2\relax
-}
-\TMP@EnsureCode{0}{12}%
-\TMP@EnsureCode{1}{12}%
-\TMP@EnsureCode{2}{12}%
-\TMP@EnsureCode{10}{12}% ^^J
-\TMP@EnsureCode{33}{12}% !
-\TMP@EnsureCode{34}{12}% "
-\TMP@EnsureCode{38}{4}% &
-\TMP@EnsureCode{39}{12}% '
-\TMP@EnsureCode{40}{12}% (
-\TMP@EnsureCode{41}{12}% )
-\TMP@EnsureCode{42}{12}% *
-\TMP@EnsureCode{43}{12}% +
-\TMP@EnsureCode{44}{12}% ,
-\TMP@EnsureCode{45}{12}% -
-\TMP@EnsureCode{46}{12}% .
-\TMP@EnsureCode{47}{12}% /
-\TMP@EnsureCode{58}{12}% :
-\TMP@EnsureCode{60}{12}% <
-\TMP@EnsureCode{62}{12}% >
-\TMP@EnsureCode{91}{12}% [
-\TMP@EnsureCode{93}{12}% ]
-\TMP@EnsureCode{94}{7}% ^ (superscript)
-\TMP@EnsureCode{95}{12}% _ (other)
-\TMP@EnsureCode{96}{12}% `
-\TMP@EnsureCode{126}{12}% ~ (other)
-\edef\pdftexcmds@AtEnd{%
- \pdftexcmds@AtEnd
- \escapechar=\number\escapechar\relax
- \noexpand\endinput
-}
-\escapechar=92 %
-% \end{macrocode}
-%
-% \subsection{Load packages}
-%
-% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname RequirePackage\endcsname\relax
- \def\TMP@RequirePackage#1[#2]{%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname ver@#1.sty\endcsname\relax
- \input #1.sty\relax
- \fi
- }%
- \TMP@RequirePackage{infwarerr}[2007/09/09]%
- \TMP@RequirePackage{iftex}[2019/11/07]%%
- \TMP@RequirePackage{ltxcmds}[2010/12/02]%
-\else
- \RequirePackage{infwarerr}[2007/09/09]%
- \RequirePackage{iftex}[2019/11/07]%
- \RequirePackage{ltxcmds}[2010/12/02]%
-\fi
-% \end{macrocode}
-%
-% \subsection{Without \hologo{LuaTeX}}
-%
-% \begin{macrocode}
-\ifluatex
-\else
- \def\pdftexcmds@nopdftex{%
- \let\pdftexcmds@nopdftex\relax
- }%
- \def\pdftexcmds@temp#1{%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname
- \expandafter\ifx\csname pdf#1\endcsname\relax\else pdf\fi#1\endcsname\relax
- \pdftexcmds@nopdftex
- \else
- \expandafter\def\csname pdf@#1\expandafter\endcsname
- \expandafter{%
- \csname\expandafter\ifx\csname pdf#1\endcsname\relax\else pdf\fi#1\endcsname
- }%
- \fi
- }%
- \pdftexcmds@temp{strcmp}%
- \pdftexcmds@temp{escapehex}%
- \let\pdf@escapehexnative\pdf@escapehex
- \pdftexcmds@temp{unescapehex}%
- \let\pdf@unescapehexnative\pdf@unescapehex
- \pdftexcmds@temp{escapestring}%
- \pdftexcmds@temp{escapename}%
- \pdftexcmds@temp{filesize}%
- \pdftexcmds@temp{filemoddate}%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname pdfshellescape\endcsname\relax
- \pdftexcmds@nopdftex
- \ltx@IfUndefined{pdftexversion}{%
- }{%
- \ifnum\pdftexversion>120 % 1.21a supports \ifeof18
- \ifeof18 %
- \chardef\pdf@shellescape=0 %
- \else
- \chardef\pdf@shellescape=1 %
- \fi
- \fi
- }%
- \else
- \def\pdf@shellescape{%
- \pdfshellescape
- }%
- \fi
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname pdffiledump\endcsname\relax
- \pdftexcmds@nopdftex
- \else
- \def\pdf@filedump#1#2#3{%
- \pdffiledump offset#1 length#2{#3}%
- }%
- \fi
-% \end{macrocode}
-% \begin{macrocode}
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname pdfmdfivesum\endcsname\relax
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname mdfivesum\endcsname\relax
- \pdftexcmds@nopdftex
- \else
- \def\pdf@mdfivesum#{\mdfivesum}%
- \let\pdf@mdfivesumnative\pdf@mdfivesum
- \def\pdf@filemdfivesum#{\mdfivesum file}%
- \fi
- \else
- \def\pdf@mdfivesum#{\pdfmdfivesum}%
- \let\pdf@mdfivesumnative\pdf@mdfivesum
- \def\pdf@filemdfivesum#{\pdfmdfivesum file}%
- \fi
-% \end{macrocode}
-% \begin{macrocode}
- \def\pdf@system#{%
- \immediate\write18%
- }%
- \def\pdftexcmds@temp#1{%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname
- \expandafter\ifx\csname pdf#1\endcsname\relax\else pdf\fi#1\endcsname\relax
- \pdftexcmds@nopdftex
- \else
- \expandafter\let\csname pdf@#1\expandafter\endcsname
- \csname\expandafter\ifx\csname pdf#1\endcsname\relax\else pdf\fi#1\endcsname
- \fi
- }%
- \pdftexcmds@temp{resettimer}%
- \pdftexcmds@temp{elapsedtime}%
-\fi
-% \end{macrocode}
-%
-% \subsection{\cs{pdf@primitive}, \cs{pdf@ifprimitive}}
-%
-% Since version 1.40.0 \hologo{pdfTeX} has \cs{pdfprimitive} and
-% \cs{ifpdfprimitive}. And \cs{pdfprimitive} was fixed in
-% version 1.40.4.
-%
-% \hologo{XeTeX} provides them under the name \cs{primitive} and
-% \cs{ifprimitive}. \hologo{LuaTeX} knows both name variants,
-% but they have possibly to be enabled first (|tex.enableprimitives|).
-%
-% Depending on the format TeX Live uses a prefix |luatex|.
-%
-% Caution: \cs{let} must be used for the definition of
-% the macros, especially because of \cs{ifpdfprimitive}.
-%
-% \subsubsection{Using \hologo{LuaTeX}'s \texttt{tex.enableprimitives}}
-%
-% \begin{macrocode}
-\ifluatex
-% \end{macrocode}
-% \begin{macro}{\pdftexcmds@directlua}
-% \begin{macrocode}
- \ifnum\luatexversion<36 %
- \def\pdftexcmds@directlua{\directlua0 }%
- \else
- \let\pdftexcmds@directlua\directlua
- \fi
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
- \begingroup
- \newlinechar=10 %
- \endlinechar=\newlinechar
- \pdftexcmds@directlua{%
- if tex.enableprimitives then
- tex.enableprimitives(
- 'pdf@',
- {'primitive', 'ifprimitive', 'pdfdraftmode','draftmode'}
- )
- tex.enableprimitives('', {'luaescapestring'})
- end
- }%
- \endgroup %
-% \end{macrocode}
-%
-% \begin{macrocode}
-\fi
-% \end{macrocode}
-%
-% \subsubsection{Trying various names to find the primitives}
-%
-% \begin{macro}{\pdftexcmds@strip@prefix}
-% \begin{macrocode}
-\def\pdftexcmds@strip@prefix#1>{}
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-\def\pdftexcmds@temp#1#2#3{%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname pdf@#1\endcsname\relax
- \begingroup
- \def\x{#3}%
- \edef\x{\expandafter\pdftexcmds@strip@prefix\meaning\x}%
- \escapechar=-1 %
- \edef\y{\expandafter\meaning\csname#2\endcsname}%
- \expandafter\endgroup
- \ifx\x\y
- \expandafter\let\csname pdf@#1\expandafter\endcsname
- \csname #2\endcsname
- \fi
- \fi
-}
-% \end{macrocode}
-%
-% \begin{macro}{\pdf@primitive}
-% \begin{macrocode}
-\pdftexcmds@temp{primitive}{pdfprimitive}{pdfprimitive}% pdfTeX, oldLuaTeX
-\pdftexcmds@temp{primitive}{primitive}{primitive}% XeTeX, luatex
-\pdftexcmds@temp{primitive}{luatexprimitive}{pdfprimitive}% oldLuaTeX
-\pdftexcmds@temp{primitive}{luatexpdfprimitive}{pdfprimitive}% oldLuaTeX
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@ifprimitive}
-% \begin{macrocode}
-\pdftexcmds@temp{ifprimitive}{ifpdfprimitive}{ifpdfprimitive}% pdfTeX, oldLuaTeX
-\pdftexcmds@temp{ifprimitive}{ifprimitive}{ifprimitive}% XeTeX, luatex
-\pdftexcmds@temp{ifprimitive}{luatexifprimitive}{ifpdfprimitive}% oldLuaTeX
-\pdftexcmds@temp{ifprimitive}{luatexifpdfprimitive}{ifpdfprimitive}% oldLuaTeX
-% \end{macrocode}
-% \end{macro}
-%
-% Disable broken \cs{pdfprimitive}.
-% \begin{macrocode}
-\ifluatex\else
-\begingroup
- \expandafter\ifx\csname pdf@primitive\endcsname\relax
- \else
- \expandafter\ifx\csname pdftexversion\endcsname\relax
- \else
- \ifnum\pdftexversion=140 %
- \expandafter\ifx\csname pdftexrevision\endcsname\relax
- \else
- \ifnum\pdftexrevision<4 %
- \endgroup
- \let\pdf@primitive\@undefined
- \@PackageInfoNoLine{pdftexcmds}{%
- \string\pdf@primitive\space disabled, %
- because\MessageBreak
- \string\pdfprimitive\space is broken until pdfTeX 1.40.4%
- }%
- \begingroup
- \fi
- \fi
- \fi
- \fi
- \fi
-\endgroup
-\fi
-% \end{macrocode}
-%
-% \subsubsection{Result}
-%
-% \begin{macrocode}
-\begingroup
- \@PackageInfoNoLine{pdftexcmds}{%
- \string\pdf@primitive\space is %
- \expandafter\ifx\csname pdf@primitive\endcsname\relax not \fi
- available%
- }%
- \@PackageInfoNoLine{pdftexcmds}{%
- \string\pdf@ifprimitive\space is %
- \expandafter\ifx\csname pdf@ifprimitive\endcsname\relax not \fi
- available%
- }%
-\endgroup
-% \end{macrocode}
-%
-% \subsection{\hologo{XeTeX}}
-%
-% Look for primitives \cs{shellescape}, \cs{strcmp}.
-% \begin{macrocode}
-\def\pdftexcmds@temp#1{%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname pdf@#1\endcsname\relax
- \begingroup
- \escapechar=-1 %
- \edef\x{\expandafter\meaning\csname#1\endcsname}%
- \def\y{#1}%
- \def\z##1->{}%
- \edef\y{\expandafter\z\meaning\y}%
- \expandafter\endgroup
- \ifx\x\y
- \expandafter\def\csname pdf@#1\expandafter\endcsname
- \expandafter{%
- \csname#1\endcsname
- }%
- \fi
- \fi
-}%
-\pdftexcmds@temp{shellescape}%
-\pdftexcmds@temp{strcmp}%
-% \end{macrocode}
-%
-% \subsection{\cs{pdf@isprimitive}}
-%
-% \begin{macrocode}
-\def\pdf@isprimitive{%
- \begingroup\expandafter\expandafter\expandafter\endgroup
- \expandafter\ifx\csname pdf@strcmp\endcsname\relax
- \long\def\pdf@isprimitive##1{%
- \expandafter\pdftexcmds@isprimitive\expandafter{\meaning##1}%
- }%
- \long\def\pdftexcmds@isprimitive##1##2{%
- \expandafter\pdftexcmds@@isprimitive\expandafter{\string##2}{##1}%
- }%
- \def\pdftexcmds@@isprimitive##1##2{%
- \ifnum0\pdftexcmds@equal##1\delimiter##2\delimiter=1 %
- \expandafter\ltx@firstoftwo
- \else
- \expandafter\ltx@secondoftwo
- \fi
- }%
- \def\pdftexcmds@equal##1##2\delimiter##3##4\delimiter{%
- \ifx##1##3%
- \ifx\relax##2##4\relax
- 1%
- \else
- \ifx\relax##2\relax
- \else
- \ifx\relax##4\relax
- \else
- \pdftexcmds@equalcont{##2}{##4}%
- \fi
- \fi
- \fi
- \fi
- }%
- \def\pdftexcmds@equalcont##1{%
- \def\pdftexcmds@equalcont####1####2##1##1##1##1{%
- ##1##1##1##1%
- \pdftexcmds@equal####1\delimiter####2\delimiter
- }%
- }%
- \expandafter\pdftexcmds@equalcont\csname fi\endcsname
- \else
- \long\def\pdf@isprimitive##1##2{%
- \ifnum\pdf@strcmp{\meaning##1}{\string##2}=0 %
- \expandafter\ltx@firstoftwo
- \else
- \expandafter\ltx@secondoftwo
- \fi
- }%
- \fi
-}
-\ifluatex
-\ifx\pdfdraftmode\@undefined
- \let\pdfdraftmode\draftmode
-\fi
-\else
- \pdf@isprimitive
-\fi
-% \end{macrocode}
-%
-% \subsection{\cs{pdf@draftmode}}
-%
-%
-% \begin{macrocode}
-\let\pdftexcmds@temp\ltx@zero %
-\ltx@IfUndefined{pdfdraftmode}{%
- \@PackageInfoNoLine{pdftexcmds}{\ltx@backslashchar pdfdraftmode not found}%
-}{%
- \ifpdf
- \let\pdftexcmds@temp\ltx@one
- \@PackageInfoNoLine{pdftexcmds}{\ltx@backslashchar pdfdraftmode found}%
- \else
- \@PackageInfoNoLine{pdftexcmds}{%
- \ltx@backslashchar pdfdraftmode is ignored in DVI mode%
- }%
- \fi
-}
-\ifcase\pdftexcmds@temp
-% \end{macrocode}
-% \begin{macro}{\pdf@draftmode}
-% \begin{macrocode}
- \let\pdf@draftmode\ltx@zero
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@ifdraftmode}
-% \begin{macrocode}
- \let\pdf@ifdraftmode\ltx@secondoftwo
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdftexcmds@setdraftmode}
-% \begin{macrocode}
- \def\pdftexcmds@setdraftmode#1{}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-\else
-% \end{macrocode}
-% \begin{macro}{\pdftexcmds@draftmode}
-% \begin{macrocode}
- \let\pdftexcmds@draftmode\pdfdraftmode
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@ifdraftmode}
-% \begin{macrocode}
- \def\pdf@ifdraftmode{%
- \ifnum\pdftexcmds@draftmode=\ltx@one
- \expandafter\ltx@firstoftwo
- \else
- \expandafter\ltx@secondoftwo
- \fi
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@draftmode}
-% \begin{macrocode}
- \def\pdf@draftmode{%
- \ifnum\pdftexcmds@draftmode=\ltx@one
- \expandafter\ltx@one
- \else
- \expandafter\ltx@zero
- \fi
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdftexcmds@setdraftmode}
-% \begin{macrocode}
- \def\pdftexcmds@setdraftmode#1{%
- \pdftexcmds@draftmode=#1\relax
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-\fi
-% \end{macrocode}
-% \begin{macro}{\pdf@setdraftmode}
-% \begin{macrocode}
-\def\pdf@setdraftmode#1{%
- \begingroup
- \count\ltx@cclv=#1\relax
- \edef\x{\endgroup
- \noexpand\pdftexcmds@@setdraftmode{\the\count\ltx@cclv}%
- }%
- \x
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdftexcmds@@setdraftmode}
-% \begin{macrocode}
-\def\pdftexcmds@@setdraftmode#1{%
- \ifcase#1 %
- \pdftexcmds@setdraftmode{#1}%
- \or
- \pdftexcmds@setdraftmode{#1}%
- \else
- \@PackageWarning{pdftexcmds}{%
- \string\pdf@setdraftmode: Ignoring\MessageBreak
- invalid value `#1'%
- }%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Load Lua module}
-%
-% \begin{macrocode}
-\ifluatex
-\else
- \expandafter\pdftexcmds@AtEnd
-\fi%
-% \end{macrocode}
-%
-% \begin{macrocode}
-\pdftexcmds@directlua{%
- require("pdftexcmds")%
-}
-\ifnum\luatexversion>37 %
- \ifnum0%
- \pdftexcmds@directlua{%
- if status.ini_version then %
- tex.write("1")%
- end%
- }>0 %
- \everyjob\expandafter{%
- \the\everyjob
- \pdftexcmds@directlua{%
- require("pdftexcmds")%
- }%
- }%
- \fi
-\fi
-\begingroup
- \def\x{2019/11/24 v0.31}%
- \ltx@onelevel@sanitize\x
- \edef\y{%
- \pdftexcmds@directlua{%
- if oberdiek.pdftexcmds.getversion then %
- oberdiek.pdftexcmds.getversion()%
- end%
- }%
- }%
- \ifx\x\y
- \else
- \@PackageError{pdftexcmds}{%
- Wrong version of lua module.\MessageBreak
- Package version: \x\MessageBreak
- Lua module: \y
- }\@ehc
- \fi
-\endgroup
-% \end{macrocode}
-%
-% \subsection{Lua functions}
-%
-% \subsubsection{Helper macros}
-%
-% \begin{macro}{\pdftexcmds@toks}
-% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname newtoks\endcsname\relax
- \toksdef\pdftexcmds@toks=0 %
-\else
- \csname newtoks\endcsname\pdftexcmds@toks
-\fi
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pdftexcmds@Patch}
-% \begin{macrocode}
-\def\pdftexcmds@Patch{0}
-\ifnum\luatexversion>40 %
- \ifnum\luatexversion<66 %
- \def\pdftexcmds@Patch{1}%
- \fi
-\fi
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-\ifcase\pdftexcmds@Patch
- \catcode`\&=14 %
-\else
- \catcode`\&=9 %
-% \end{macrocode}
-% \begin{macro}{\pdftexcmds@PatchDecode}
-% \begin{macrocode}
- \def\pdftexcmds@PatchDecode#1\@nil{%
- \pdftexcmds@DecodeA#1^^A^^A\@nil{}%
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdftexcmds@DecodeA}
-% \begin{macrocode}
- \def\pdftexcmds@DecodeA#1^^A^^A#2\@nil#3{%
- \ifx\relax#2\relax
- \ltx@ReturnAfterElseFi{%
- \pdftexcmds@DecodeB#3#1^^A^^B\@nil{}%
- }%
- \else
- \ltx@ReturnAfterFi{%
- \pdftexcmds@DecodeA#2\@nil{#3#1^^@}%
- }%
- \fi
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdftexcmds@DecodeB}
-% \begin{macrocode}
- \def\pdftexcmds@DecodeB#1^^A^^B#2\@nil#3{%
- \ifx\relax#2\relax%
- \ltx@ReturnAfterElseFi{%
- \ltx@zero
- #3#1%
- }%
- \else
- \ltx@ReturnAfterFi{%
- \pdftexcmds@DecodeB#2\@nil{#3#1^^A}%
- }%
- \fi
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-\fi
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ifnum\luatexversion<36 %
-\else
- \catcode`\0=9 %
-\fi
-% \end{macrocode}
-%
-% \subsubsection[Strings]{Strings \cite[``7.15 Strings'']{pdftex-manual}}
-%
-% \begin{macro}{\pdf@strcmp}
-% \begin{macrocode}
-\long\def\pdf@strcmp#1#2{%
- \directlua0{%
- oberdiek.pdftexcmds.strcmp("\luaescapestring{#1}",%
- "\luaescapestring{#2}")%
- }%
-}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-\pdf@isprimitive
-% \end{macrocode}
-% \begin{macro}{\pdf@escapehex}
-% \begin{macrocode}
-\long\def\pdf@escapehex#1{%
- \directlua0{%
- oberdiek.pdftexcmds.escapehex("\luaescapestring{#1}", "byte")%
- }%
-}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@escapehexnative}
-% \begin{macrocode}
-\long\def\pdf@escapehexnative#1{%
- \directlua0{%
- oberdiek.pdftexcmds.escapehex("\luaescapestring{#1}")%
- }%
-}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@unescapehex}
-% \begin{macrocode}
-\def\pdf@unescapehex#1{%
-& \romannumeral\expandafter\pdftexcmds@PatchDecode
- \the\expandafter\pdftexcmds@toks
- \directlua0{%
- oberdiek.pdftexcmds.toks="pdftexcmds@toks"%
- oberdiek.pdftexcmds.unescapehex("\luaescapestring{#1}", "byte", \pdftexcmds@Patch)%
- }%
-& \@nil
-}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@unescapehexnative}
-% \begin{macrocode}
-\def\pdf@unescapehexnative#1{%
-& \romannumeral\expandafter\pdftexcmds@PatchDecode
- \the\expandafter\pdftexcmds@toks
- \directlua0{%
- oberdiek.pdftexcmds.toks="pdftexcmds@toks"%
- oberdiek.pdftexcmds.unescapehex("\luaescapestring{#1}", \pdftexcmds@Patch)%
- }%
-& \@nil
-}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@escapestring}
-% \begin{macrocode}
-\long\def\pdf@escapestring#1{%
- \directlua0{%
- oberdiek.pdftexcmds.escapestring("\luaescapestring{#1}")%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@escapename}
-% \begin{macrocode}
-\long\def\pdf@escapename#1{%
- \directlua0{%
- oberdiek.pdftexcmds.escapename("\luaescapestring{#1}", "byte")%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@escapenamenative}
-% \begin{macrocode}
-\long\def\pdf@escapenamenative#1{%
- \directlua0{%
- oberdiek.pdftexcmds.escapename("\luaescapestring{#1}")%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection[Files]{Files \cite[``7.18 Files'']{pdftex-manual}}
-%
-% \begin{macro}{\pdf@filesize}
-% \begin{macrocode}
-\def\pdf@filesize#1{%
- \directlua0{%
- oberdiek.pdftexcmds.filesize("\luaescapestring{#1}")%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@filemoddate}
-% \begin{macrocode}
-\def\pdf@filemoddate#1{%
- \directlua0{%
- oberdiek.pdftexcmds.filemoddate("\luaescapestring{#1}")%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@filedump}
-% \begin{macrocode}
-\def\pdf@filedump#1#2#3{%
- \directlua0{%
- oberdiek.pdftexcmds.filedump("\luaescapestring{\number#1}",%
- "\luaescapestring{\number#2}",%
- "\luaescapestring{#3}")%
- }%
-}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@mdfivesum}
-% \begin{macrocode}
-\long\def\pdf@mdfivesum#1{%
- \directlua0{%
- oberdiek.pdftexcmds.mdfivesum("\luaescapestring{#1}", "byte")%
- }%
-}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@mdfivesumnative}
-% \begin{macrocode}
-\long\def\pdf@mdfivesumnative#1{%
- \directlua0{%
- oberdiek.pdftexcmds.mdfivesum("\luaescapestring{#1}")%
- }%
-}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@filemdfivesum}
-% \begin{macrocode}
-\def\pdf@filemdfivesum#1{%
- \directlua0{%
- oberdiek.pdftexcmds.filemdfivesum("\luaescapestring{#1}")%
- }%
-}%
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection[Timekeeping]{Timekeeping \cite[``7.17 Timekeeping'']{pdftex-manual}}
-%
-% \begin{macro}{\protected}
-% \begin{macrocode}
-\let\pdftexcmds@temp=Y%
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname protected\endcsname\relax
- \pdftexcmds@directlua0{%
- if tex.enableprimitives then %
- tex.enableprimitives('', {'protected'})%
- end%
- }%
-\fi
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname protected\endcsname\relax
- \let\pdftexcmds@temp=N%
-\fi
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\numexpr}
-% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname numexpr\endcsname\relax
- \pdftexcmds@directlua0{%
- if tex.enableprimitives then %
- tex.enableprimitives('', {'numexpr'})%
- end%
- }%
-\fi
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname numexpr\endcsname\relax
- \let\pdftexcmds@temp=N%
-\fi
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\ifx\pdftexcmds@temp N%
- \@PackageWarningNoLine{pdftexcmds}{%
- Definitions of \ltx@backslashchar pdf@resettimer and%
- \MessageBreak
- \ltx@backslashchar pdf@elapsedtime are skipped, because%
- \MessageBreak
- e-TeX's \ltx@backslashchar protected or %
- \ltx@backslashchar numexpr are missing%
- }%
-\else
-% \end{macrocode}
-%
-% \begin{macro}{\pdf@resettimer}
-% \begin{macrocode}
- \protected\def\pdf@resettimer{%
- \pdftexcmds@directlua0{%
- oberdiek.pdftexcmds.resettimer()%
- }%
- }%
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pdf@elapsedtime}
-% \begin{macrocode}
- \protected\def\pdf@elapsedtime{%
- \numexpr
- \pdftexcmds@directlua0{%
- oberdiek.pdftexcmds.elapsedtime()%
- }%
- \relax
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-\fi
-% \end{macrocode}
-%
-% \subsubsection{Shell escape}
-%
-% \begin{macro}{\pdf@shellescape}
-%
-% \begin{macrocode}
-\ifnum\luatexversion<68 %
-\else
- \protected\edef\pdf@shellescape{%
- \numexpr\directlua{tex.sprint(%
- \number\catcodetable@string,status.shell_escape)}\relax}
-\fi
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pdf@system}
-% \begin{macrocode}
-\def\pdf@system#1{%
- \directlua0{%
- oberdiek.pdftexcmds.system("\luaescapestring{#1}")%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\pdf@lastsystemstatus}
-% \begin{macrocode}
-\def\pdf@lastsystemstatus{%
- \directlua0{%
- oberdiek.pdftexcmds.lastsystemstatus()%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\pdf@lastsystemexit}
-% \begin{macrocode}
-\def\pdf@lastsystemexit{%
- \directlua0{%
- oberdiek.pdftexcmds.lastsystemexit()%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\catcode`\0=12 %
-% \end{macrocode}
-%
-% \begin{macro}{\pdf@pipe}
-% Check availability of |io.popen| first.
-% \begin{macrocode}
-\ifnum0%
- \pdftexcmds@directlua{%
- if io.popen then %
- tex.write("1")%
- end%
- }%
- =1 %
- \def\pdf@pipe#1{%
-& \romannumeral\expandafter\pdftexcmds@PatchDecode
- \the\expandafter\pdftexcmds@toks
- \pdftexcmds@directlua{%
- oberdiek.pdftexcmds.toks="pdftexcmds@toks"%
- oberdiek.pdftexcmds.pipe("\luaescapestring{#1}", \pdftexcmds@Patch)%
- }%
-& \@nil
- }%
-\fi
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\pdftexcmds@AtEnd%
-%</package>
-% \end{macrocode}
-%
-% \subsection{Lua module}
-%
-% \begin{macrocode}
-%<*lua>
-% \end{macrocode}
-%
-% \begin{macrocode}
-oberdiek = oberdiek or {}
-local pdftexcmds = oberdiek.pdftexcmds or {}
-oberdiek.pdftexcmds = pdftexcmds
-local systemexitstatus
-function pdftexcmds.getversion()
- tex.write("2019/11/24 v0.31")
-end
-% \end{macrocode}
-%
-% \subsubsection[Strings]{Strings \cite[``7.15 Strings'']{pdftex-manual}}
-%
-% \begin{macrocode}
-function pdftexcmds.strcmp(A, B)
- if A == B then
- tex.write("0")
- elseif A < B then
- tex.write("-1")
- else
- tex.write("1")
- end
-end
-local function utf8_to_byte(str)
- local i = 0
- local n = string.len(str)
- local t = {}
- while i < n do
- i = i + 1
- local a = string.byte(str, i)
- if a < 128 then
- table.insert(t, string.char(a))
- else
- if a >= 192 and i < n then
- i = i + 1
- local b = string.byte(str, i)
- if b < 128 or b >= 192 then
- i = i - 1
- elseif a == 194 then
- table.insert(t, string.char(b))
- elseif a == 195 then
- table.insert(t, string.char(b + 64))
- end
- end
- end
- end
- return table.concat(t)
-end
-function pdftexcmds.escapehex(str, mode)
- if mode == "byte" then
- str = utf8_to_byte(str)
- end
- tex.write((string.gsub(str, ".",
- function (ch)
- return string.format("%02X", string.byte(ch))
- end
- )))
-end
-% \end{macrocode}
-% See procedure |unescapehex| in file \xfile{utils.c} of \hologo{pdfTeX}.
-% Caution: |tex.write| ignores leading spaces.
-% \begin{macrocode}
-function pdftexcmds.unescapehex(str, mode, patch)
- local a = 0
- local first = true
- local result = {}
- for i = 1, string.len(str), 1 do
- local ch = string.byte(str, i)
- if ch >= 48 and ch <= 57 then
- ch = ch - 48
- elseif ch >= 65 and ch <= 70 then
- ch = ch - 55
- elseif ch >= 97 and ch <= 102 then
- ch = ch - 87
- else
- ch = nil
- end
- if ch then
- if first then
- a = ch * 16
- first = false
- else
- table.insert(result, a + ch)
- first = true
- end
- end
- end
- if not first then
- table.insert(result, a)
- end
- if patch == 1 then
- local temp = {}
- for i, a in ipairs(result) do
- if a == 0 then
- table.insert(temp, 1)
- table.insert(temp, 1)
- else
- if a == 1 then
- table.insert(temp, 1)
- table.insert(temp, 2)
- else
- table.insert(temp, a)
- end
- end
- end
- result = temp
- end
- if mode == "byte" then
- local utf8 = {}
- for i, a in ipairs(result) do
- if a < 128 then
- table.insert(utf8, a)
- else
- if a < 192 then
- table.insert(utf8, 194)
- a = a - 128
- else
- table.insert(utf8, 195)
- a = a - 192
- end
- table.insert(utf8, a + 128)
- end
- end
- result = utf8
- end
-% \end{macrocode}
-% this next line added for current luatex; this is the only
-% change in the file. eroux, 28apr13. (v 0.21)
-% \begin{macrocode}
- local unpack = _G["unpack"] or table.unpack
- tex.settoks(pdftexcmds.toks, string.char(unpack(result)))
-end
-% \end{macrocode}
-% See procedure |escapestring| in file \xfile{utils.c} of \hologo{pdfTeX}.
-% \begin{macrocode}
-function pdftexcmds.escapestring(str, mode)
- if mode == "byte" then
- str = utf8_to_byte(str)
- end
- tex.write((string.gsub(str, ".",
- function (ch)
- local b = string.byte(ch)
- if b < 33 or b > 126 then
- return string.format("\\%.3o", b)
- end
- if b == 40 or b == 41 or b == 92 then
- return "\\" .. ch
- end
-% \end{macrocode}
-% Lua 5.1 returns the match in case of return value |nil|.
-% \begin{macrocode}
- return nil
- end
- )))
-end
-% \end{macrocode}
-% See procedure |escapename| in file \xfile{utils.c} of \hologo{pdfTeX}.
-% \begin{macrocode}
-function pdftexcmds.escapename(str, mode)
- if mode == "byte" then
- str = utf8_to_byte(str)
- end
- tex.write((string.gsub(str, ".",
- function (ch)
- local b = string.byte(ch)
- if b == 0 then
-% \end{macrocode}
-% In Lua 5.0 |nil| could be used for the empty string,
-% But |nil| returns the match in Lua 5.1, thus we use
-% the empty string explicitly.
-% \begin{macrocode}
- return ""
- end
- if b <= 32 or b >= 127
- or b == 35 or b == 37 or b == 40 or b == 41
- or b == 47 or b == 60 or b == 62 or b == 91
- or b == 93 or b == 123 or b == 125 then
- return string.format("#%.2X", b)
- else
-% \end{macrocode}
-% Lua 5.1 returns the match in case of return value |nil|.
-% \begin{macrocode}
- return nil
- end
- end
- )))
-end
-% \end{macrocode}
-%
-% \subsubsection[Files]{Files \cite[``7.18 Files'']{pdftex-manual}}
-%
-% \begin{macrocode}
-function pdftexcmds.filesize(filename)
- local foundfile = kpse.find_file(filename, "tex", true)
- if foundfile then
- local size = lfs.attributes(foundfile, "size")
- if size then
- tex.write(size)
- end
- end
-end
-% \end{macrocode}
-% See procedure |makepdftime| in file \xfile{utils.c} of \hologo{pdfTeX}.
-% \begin{macrocode}
-function pdftexcmds.filemoddate(filename)
- local foundfile = kpse.find_file(filename, "tex", true)
- if foundfile then
- local date = lfs.attributes(foundfile, "modification")
- if date then
- local d = os.date("*t", date)
- if d.sec >= 60 then
- d.sec = 59
- end
- local u = os.date("!*t", date)
- local off = 60 * (d.hour - u.hour) + d.min - u.min
- if d.year ~= u.year then
- if d.year > u.year then
- off = off + 1440
- else
- off = off - 1440
- end
- elseif d.yday ~= u.yday then
- if d.yday > u.yday then
- off = off + 1440
- else
- off = off - 1440
- end
- end
- local timezone
- if off == 0 then
- timezone = "Z"
- else
- local hours = math.floor(off / 60)
- local mins = math.abs(off - hours * 60)
- timezone = string.format("%+03d'%02d'", hours, mins)
- end
- tex.write(string.format("D:%04d%02d%02d%02d%02d%02d%s",
- d.year, d.month, d.day, d.hour, d.min, d.sec, timezone))
- end
- end
-end
-function pdftexcmds.filedump(offset, length, filename)
- length = tonumber(length)
- if length and length > 0 then
- local foundfile = kpse.find_file(filename, "tex", true)
- if foundfile then
- offset = tonumber(offset)
- if not offset then
- offset = 0
- end
- local filehandle = io.open(foundfile, "rb")
- if filehandle then
- if offset > 0 then
- filehandle:seek("set", offset)
- end
- local dump = filehandle:read(length)
- pdftexcmds.escapehex(dump)
- filehandle:close()
- end
- end
- end
-end
-function pdftexcmds.mdfivesum(str, mode)
- if mode == "byte" then
- str = utf8_to_byte(str)
- end
- pdftexcmds.escapehex(md5.sum(str))
-end
-function pdftexcmds.filemdfivesum(filename)
- local foundfile = kpse.find_file(filename, "tex", true)
- if foundfile then
- local filehandle = io.open(foundfile, "rb")
- if filehandle then
- local contents = filehandle:read("*a")
- pdftexcmds.escapehex(md5.sum(contents))
- filehandle:close()
- end
- end
-end
-% \end{macrocode}
-%
-% \subsubsection[Timekeeping]{Timekeeping \cite[``7.17 Timekeeping'']{pdftex-manual}}
-%
-% The functions for timekeeping are based on
-% Andy Thomas' work \cite{AndyThomas:Analog}.
-% Changes:
-% \begin{itemize}
-% \item Overflow check is added.
-% \item |string.format| is used to avoid exponential number
-% representation for sure.
-% \item |tex.write| is used instead of |tex.print| to get
-% tokens with catcode 12 and without appended \cs{endlinechar}.
-% \end{itemize}
-% \begin{macrocode}
-local basetime = 0
-function pdftexcmds.resettimer()
- basetime = os.clock()
-end
-function pdftexcmds.elapsedtime()
- local val = (os.clock() - basetime) * 65536 + .5
- if val > 2147483647 then
- val = 2147483647
- end
- tex.write(string.format("%d", val))
-end
-% \end{macrocode}
-%
-% \subsubsection[Miscellaneous]{Miscellaneous \cite[``7.21 Miscellaneous'']{pdftex-manual}}
-%
-% \begin{macrocode}
-function pdftexcmds.shellescape()
- if os.execute then
- if status
- and status.luatex_version
- and status.luatex_version >= 68 then
- tex.write(os.execute())
- else
- local result = os.execute()
- if result == 0 then
- tex.write("0")
- else
- if result == nil then
- tex.write("0")
- else
- tex.write("1")
- end
- end
- end
- else
- tex.write("0")
- end
-end
-function pdftexcmds.system(cmdline)
- systemexitstatus = nil
- texio.write_nl("log", "system(" .. cmdline .. ") ")
- if os.execute then
- texio.write("log", "executed.")
- systemexitstatus = os.execute(cmdline)
- else
- texio.write("log", "disabled.")
- end
-end
-function pdftexcmds.lastsystemstatus()
- local result = tonumber(systemexitstatus)
- if result then
- local x = math.floor(result / 256)
- tex.write(result - 256 * math.floor(result / 256))
- end
-end
-function pdftexcmds.lastsystemexit()
- local result = tonumber(systemexitstatus)
- if result then
- tex.write(math.floor(result / 256))
- end
-end
-function pdftexcmds.pipe(cmdline, patch)
- local result
- systemexitstatus = nil
- texio.write_nl("log", "pipe(" .. cmdline ..") ")
- if io.popen then
- texio.write("log", "executed.")
- local handle = io.popen(cmdline, "r")
- if handle then
- result = handle:read("*a")
- handle:close()
- end
- else
- texio.write("log", "disabled.")
- end
- if result then
- if patch == 1 then
- local temp = {}
- for i, a in ipairs(result) do
- if a == 0 then
- table.insert(temp, 1)
- table.insert(temp, 1)
- else
- if a == 1 then
- table.insert(temp, 1)
- table.insert(temp, 2)
- else
- table.insert(temp, a)
- end
- end
- end
- result = temp
- end
- tex.settoks(pdftexcmds.toks, result)
- else
- tex.settoks(pdftexcmds.toks, "")
- end
-end
-% \end{macrocode}
-% \begin{macrocode}
-%</lua>
-% \end{macrocode}
-%
-% \section{Test}
-%
-% \subsection{Catcode checks for loading}
-%
-% \begin{macrocode}
-%<*test1>
-% \end{macrocode}
-% \begin{macrocode}
-\catcode`\{=1 %
-\catcode`\}=2 %
-\catcode`\#=6 %
-\catcode`\@=11 %
-\expandafter\ifx\csname count@\endcsname\relax
- \countdef\count@=255 %
-\fi
-\expandafter\ifx\csname @gobble\endcsname\relax
- \long\def\@gobble#1{}%
-\fi
-\expandafter\ifx\csname @firstofone\endcsname\relax
- \long\def\@firstofone#1{#1}%
-\fi
-\expandafter\ifx\csname loop\endcsname\relax
- \expandafter\@firstofone
-\else
- \expandafter\@gobble
-\fi
-{%
- \def\loop#1\repeat{%
- \def\body{#1}%
- \iterate
- }%
- \def\iterate{%
- \body
- \let\next\iterate
- \else
- \let\next\relax
- \fi
- \next
- }%
- \let\repeat=\fi
-}%
-\def\RestoreCatcodes{}
-\count@=0 %
-\loop
- \edef\RestoreCatcodes{%
- \RestoreCatcodes
- \catcode\the\count@=\the\catcode\count@\relax
- }%
-\ifnum\count@<255 %
- \advance\count@ 1 %
-\repeat
-
-\def\RangeCatcodeInvalid#1#2{%
- \count@=#1\relax
- \loop
- \catcode\count@=15 %
- \ifnum\count@<#2\relax
- \advance\count@ 1 %
- \repeat
-}
-\def\RangeCatcodeCheck#1#2#3{%
- \count@=#1\relax
- \loop
- \ifnum#3=\catcode\count@
- \else
- \errmessage{%
- Character \the\count@\space
- with wrong catcode \the\catcode\count@\space
- instead of \number#3%
- }%
- \fi
- \ifnum\count@<#2\relax
- \advance\count@ 1 %
- \repeat
-}
-\def\space{ }
-\expandafter\ifx\csname LoadCommand\endcsname\relax
- \def\LoadCommand{\input pdftexcmds.sty\relax}%
-\fi
-\def\Test{%
- \RangeCatcodeInvalid{0}{47}%
- \RangeCatcodeInvalid{58}{64}%
- \RangeCatcodeInvalid{91}{96}%
- \RangeCatcodeInvalid{123}{255}%
- \catcode`\@=12 %
- \catcode`\\=0 %
- \catcode`\%=14 %
- \LoadCommand
- \RangeCatcodeCheck{0}{36}{15}%
- \RangeCatcodeCheck{37}{37}{14}%
- \RangeCatcodeCheck{38}{47}{15}%
- \RangeCatcodeCheck{48}{57}{12}%
- \RangeCatcodeCheck{58}{63}{15}%
- \RangeCatcodeCheck{64}{64}{12}%
- \RangeCatcodeCheck{65}{90}{11}%
- \RangeCatcodeCheck{91}{91}{15}%
- \RangeCatcodeCheck{92}{92}{0}%
- \RangeCatcodeCheck{93}{96}{15}%
- \RangeCatcodeCheck{97}{122}{11}%
- \RangeCatcodeCheck{123}{255}{15}%
- \RestoreCatcodes
-}
-\Test
-\csname @@end\endcsname
-\end
-% \end{macrocode}
-% \begin{macrocode}
-%</test1>
-% \end{macrocode}
-%
-% \subsection{Test for \cs{pdf@isprimitive}}
-%
-% \begin{macrocode}
-%<*test2>
-\catcode`\{=1 %
-\catcode`\}=2 %
-\catcode`\#=6 %
-\catcode`\@=11 %
-\input pdftexcmds.sty\relax
-\def\msg#1{%
- \begingroup
- \escapechar=92 %
- \immediate\write16{#1}%
- \endgroup
-}
-\long\def\test#1#2#3#4{%
- \begingroup
- #4%
- \def\str{%
- Test \string\pdf@isprimitive
- {\string #1}{\string #2}{...}: %
- }%
- \pdf@isprimitive{#1}{#2}{%
- \ifx#3Y%
- \msg{\str true ==> OK.}%
- \else
- \errmessage{\str false ==> FAILED}%
- \fi
- }{%
- \ifx#3Y%
- \errmessage{\str true ==> FAILED}%
- \else
- \msg{\str false ==> OK.}%
- \fi
- }%
- \endgroup
-}
-\test\relax\relax Y{}
-\test\foobar\relax Y{\let\foobar\relax}
-\test\foobar\relax N{}
-\test\hbox\hbox Y{}
-\test\foobar@hbox\hbox Y{\let\foobar@hbox\hbox}
-\test\if\if Y{}
-\test\if\ifx N{}
-\test\ifx\if N{}
-\test\par\par Y{}
-\test\hbox\par N{}
-\test\par\hbox N{}
-\csname @@end\endcsname\end
-%</test2>
-% \end{macrocode}
-%
-% \subsection{Test for \cs{pdf@shellescape}}
-%
-% \begin{macrocode}
-%<*test-shell>
-\catcode`\{=1 %
-\catcode`\}=2 %
-\catcode`\#=6 %
-\catcode`\@=11 %
-\input pdftexcmds.sty\relax
-\def\msg#{\immediate\write16}
-\def\MaybeEnd{}
-\ifx\luatexversion\UnDeFiNeD
-\else
- \ifnum\luatexversion<68 %
- \ifx\pdf@shellescape\@undefined
- \msg{SHELL=U}%
- \msg{OK (LuaTeX < 0.68)}%
- \else
- \msg{SHELL=defined}%
- \errmessage{Failed (LuaTeX < 0.68)}%
- \fi
- \def\MaybeEnd{\csname @@end\endcsname\end}%
- \fi
-\fi
-\MaybeEnd
-\ifx\pdf@shellescape\@undefined
- \msg{SHELL=U}%
-\else
- \msg{SHELL=\number\pdf@shellescape}%
-\fi
-\ifx\expected\@undefined
-\else
- \ifx\expected\relax
- \msg{EXPECTED=U}%
- \ifx\pdf@shellescape\@undefined
- \msg{OK}%
- \else
- \errmessage{Failed}%
- \fi
- \else
- \msg{EXPECTED=\number\expected}%
- \ifnum\pdf@shellescape=\expected\relax
- \msg{OK}%
- \else
- \errmessage{Failed}%
- \fi
- \fi
-\fi
-\csname @@end\endcsname\end
-%</test-shell>
-% \end{macrocode}
-%
-% \subsection{Test for escape functions}
-%
-% \begin{macrocode}
-%<*test-escape>
-\catcode`\{=1 %
-\catcode`\}=2 %
-\catcode`\#=6 %
-\catcode`\^=7 %
-\catcode`\@=11 %
-\errorcontextlines=1000 %
-\input pdftexcmds.sty\relax
-\def\msg#1{%
- \begingroup
- \escapechar=92 %
- \immediate\write16{#1}%
- \endgroup
-}
-% \end{macrocode}
-% \begin{macrocode}
-\begingroup
- \catcode`\@=11 %
- \countdef\count@=255 %
- \def\space{ }%
- \long\def\@whilenum#1\do #2{%
- \ifnum #1\relax
- #2\relax
- \@iwhilenum{#1\relax#2\relax}%
- \fi
- }%
- \long\def\@iwhilenum#1{%
- \ifnum #1%
- \expandafter\@iwhilenum
- \else
- \expandafter\ltx@gobble
- \fi
- {#1}%
- }%
- \gdef\AllBytes{}%
- \count@=0 %
- \catcode0=12 %
- \@whilenum\count@<256 \do{%
- \lccode0=\count@
- \ifnum\count@=32 %
- \xdef\AllBytes{\AllBytes\space}%
- \else
- \lowercase{%
- \xdef\AllBytes{\AllBytes^^@}%
- }%
- \fi
- \advance\count@ by 1 %
- }%
-\endgroup
-% \end{macrocode}
-% \begin{macrocode}
-\def\AllBytesHex{%
- 000102030405060708090A0B0C0D0E0F%
- 101112131415161718191A1B1C1D1E1F%
- 202122232425262728292A2B2C2D2E2F%
- 303132333435363738393A3B3C3D3E3F%
- 404142434445464748494A4B4C4D4E4F%
- 505152535455565758595A5B5C5D5E5F%
- 606162636465666768696A6B6C6D6E6F%
- 707172737475767778797A7B7C7D7E7F%
- 808182838485868788898A8B8C8D8E8F%
- 909192939495969798999A9B9C9D9E9F%
- A0A1A2A3A4A5A6A7A8A9AAABACADAEAF%
- B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF%
- C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF%
- D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF%
- E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF%
- F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF%
-}
-\ltx@onelevel@sanitize\AllBytesHex
-\expandafter\lowercase\expandafter{%
- \expandafter\def\expandafter\AllBytesHexLC
- \expandafter{\AllBytesHex}%
-}
-\begingroup
- \catcode`\#=12 %
- \xdef\AllBytesName{%
- #01#02#03#04#05#06#07#08#09#0A#0B#0C#0D#0E#0F%
- #10#11#12#13#14#15#16#17#18#19#1A#1B#1C#1D#1E#1F%
- #20!"#23$#25&'#28#29*+,-.#2F%
- 0123456789:;#3C=#3E?%
- @ABCDEFGHIJKLMNO%
- PQRSTUVWXYZ#5B\ltx@backslashchar#5D^_%
- `abcdefghijklmno%
- pqrstuvwxyz#7B|#7D\string~#7F%
- #80#81#82#83#84#85#86#87#88#89#8A#8B#8C#8D#8E#8F%
- #90#91#92#93#94#95#96#97#98#99#9A#9B#9C#9D#9E#9F%
- #A0#A1#A2#A3#A4#A5#A6#A7#A8#A9#AA#AB#AC#AD#AE#AF%
- #B0#B1#B2#B3#B4#B5#B6#B7#B8#B9#BA#BB#BC#BD#BE#BF%
- #C0#C1#C2#C3#C4#C5#C6#C7#C8#C9#CA#CB#CC#CD#CE#CF%
- #D0#D1#D2#D3#D4#D5#D6#D7#D8#D9#DA#DB#DC#DD#DE#DF%
- #E0#E1#E2#E3#E4#E5#E6#E7#E8#E9#EA#EB#EC#ED#EE#EF%
- #F0#F1#F2#F3#F4#F5#F6#F7#F8#F9#FA#FB#FC#FD#FE#FF%
- }%
-\endgroup
-\ltx@onelevel@sanitize\AllBytesName
-\edef\AllBytesFromName{\expandafter\ltx@gobble\AllBytes}
-\begingroup
- \def\|{|}%
- \edef\%{\ltx@percentchar}%
- \catcode`\|=0 %
- \catcode`\#=12 %
- \catcode`\~=12 %
- \catcode`\\=12 %
- |xdef|AllBytesString{%
- \000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017%
- \020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037%
- \040!"#$|%&'\(\)*+,-./%
- 0123456789:;<=>?%
- @ABCDEFGHIJKLMNO%
- PQRSTUVWXYZ[\\]^_%
- `abcdefghijklmno%
- pqrstuvwxyz{||}~\177%
- \200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217%
- \220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237%
- \240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257%
- \260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277%
- \300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317%
- \320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337%
- \340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357%
- \360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377%
- }%
-|endgroup
-\ltx@onelevel@sanitize\AllBytesString
-% \end{macrocode}
-% \begin{macrocode}
-\def\Test#1#2#3{%
- \begingroup
- \expandafter\expandafter\expandafter\def
- \expandafter\expandafter\expandafter\TestResult
- \expandafter\expandafter\expandafter{%
- #1{#2}%
- }%
- \ifx\TestResult#3%
- \else
- \newlinechar=10 %
- \msg{Expect:^^J#3}%
- \msg{Result:^^J\TestResult}%
- \errmessage{\string#2 -\string#1-> \string#3}%
- \fi
- \endgroup
-}
-\def\test#1#2#3{%
- \edef\TestFrom{#2}%
- \edef\TestExpect{#3}%
- \ltx@onelevel@sanitize\TestExpect
- \Test#1\TestFrom\TestExpect
-}
-\test\pdf@unescapehex{74657374}{test}
-\begingroup
- \catcode0=12 %
- \catcode1=12 %
- \test\pdf@unescapehex{740074017400740174}{t^^@t^^At^^@t^^At}%
-\endgroup
-\Test\pdf@escapehex\AllBytes\AllBytesHex
-\Test\pdf@unescapehex\AllBytesHex\AllBytes
-\Test\pdf@escapename\AllBytes\AllBytesName
-\Test\pdf@escapestring\AllBytes\AllBytesString
-% \end{macrocode}
-% \begin{macrocode}
-\csname @@end\endcsname\end
-%</test-escape>
-% \end{macrocode}
-%
-% \section{Installation}
-%
-% \subsection{Download}
-%
-% \paragraph{Package.} This package is available on
-% CTAN\footnote{\CTANpkg{pdftexcmds}}:
-% \begin{description}
-% \item[\CTAN{macros/latex/contrib/pdftexcmds/pdftexcmds.dtx}] The source file.
-% \item[\CTAN{macros/latex/contrib/pdftexcmds/pdftexcmds.pdf}] Documentation.
-% \end{description}
-%
-%
-% \paragraph{Bundle.} All the packages of the bundle `pdftexcmds'
-% are also available in a TDS compliant ZIP archive. There
-% the packages are already unpacked and the documentation files
-% are generated. The files and directories obey the TDS standard.
-% \begin{description}
-% \item[\CTANinstall{install/macros/latex/contrib/pdftexcmds.tds.zip}]
-% \end{description}
-% \emph{TDS} refers to the standard ``A Directory Structure
-% for \TeX\ Files'' (\CTAN{tds/tds.pdf}). Directories
-% with \xfile{texmf} in their name are usually organized this way.
-%
-% \subsection{Bundle installation}
-%
-% \paragraph{Unpacking.} Unpack the \xfile{pdftexcmds.tds.zip} in the
-% TDS tree (also known as \xfile{texmf} tree) of your choice.
-% Example (linux):
-% \begin{quote}
-% |unzip pdftexcmds.tds.zip -d ~/texmf|
-% \end{quote}
-%
-% \paragraph{Script installation.}
-% Check the directory \xfile{TDS:scripts/pdftexcmds/} for
-% scripts that need further installation steps.
-%
-% \subsection{Package installation}
-%
-% \paragraph{Unpacking.} The \xfile{.dtx} file is a self-extracting
-% \docstrip\ archive. The files are extracted by running the
-% \xfile{.dtx} through \plainTeX:
-% \begin{quote}
-% \verb|tex pdftexcmds.dtx|
-% \end{quote}
-%
-% \paragraph{TDS.} Now the different files must be moved into
-% the different directories in your installation TDS tree
-% (also known as \xfile{texmf} tree):
-% \begin{quote}
-% \def\t{^^A
-% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
-% pdftexcmds.sty & tex/generic/pdftexcmds/pdftexcmds.sty\\
-% pdftexcmds.lua & scripts/pdftexcmds/pdftexcmds.lua\\
-% pdftexcmds.pdf & doc/latex/pdftexcmds/pdftexcmds.pdf\\
-% pdftexcmds.dtx & source/latex/pdftexcmds/pdftexcmds.dtx\\
-% \end{tabular}^^A
-% }^^A
-% \sbox0{\t}^^A
-% \ifdim\wd0>\linewidth
-% \begingroup
-% \advance\linewidth by\leftmargin
-% \advance\linewidth by\rightmargin
-% \edef\x{\endgroup
-% \def\noexpand\lw{\the\linewidth}^^A
-% }\x
-% \def\lwbox{^^A
-% \leavevmode
-% \hbox to \linewidth{^^A
-% \kern-\leftmargin\relax
-% \hss
-% \usebox0
-% \hss
-% \kern-\rightmargin\relax
-% }^^A
-% }^^A
-% \ifdim\wd0>\lw
-% \sbox0{\small\t}^^A
-% \ifdim\wd0>\linewidth
-% \ifdim\wd0>\lw
-% \sbox0{\footnotesize\t}^^A
-% \ifdim\wd0>\linewidth
-% \ifdim\wd0>\lw
-% \sbox0{\scriptsize\t}^^A
-% \ifdim\wd0>\linewidth
-% \ifdim\wd0>\lw
-% \sbox0{\tiny\t}^^A
-% \ifdim\wd0>\linewidth
-% \lwbox
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \end{quote}
-% If you have a \xfile{docstrip.cfg} that configures and enables \docstrip's
-% TDS installing feature, then some files can already be in the right
-% place, see the documentation of \docstrip.
-%
-% \subsection{Refresh file name databases}
-%
-% If your \TeX~distribution
-% (\teTeX, \mikTeX, \dots) relies on file name databases, you must refresh
-% these. For example, \teTeX\ users run \verb|texhash| or
-% \verb|mktexlsr|.
-%
-% \subsection{Some details for the interested}
-%
-% \paragraph{Unpacking with \LaTeX.}
-% The \xfile{.dtx} chooses its action depending on the format:
-% \begin{description}
-% \item[\plainTeX:] Run \docstrip\ and extract the files.
-% \item[\LaTeX:] Generate the documentation.
-% \end{description}
-% If you insist on using \LaTeX\ for \docstrip\ (really,
-% \docstrip\ does not need \LaTeX), then inform the autodetect routine
-% about your intention:
-% \begin{quote}
-% \verb|latex \let\install=y\input{pdftexcmds.dtx}|
-% \end{quote}
-% Do not forget to quote the argument according to the demands
-% of your shell.
-%
-% \paragraph{Generating the documentation.}
-% You can use both the \xfile{.dtx} or the \xfile{.drv} to generate
-% the documentation. The process can be configured by the
-% configuration file \xfile{ltxdoc.cfg}. For instance, put this
-% line into this file, if you want to have A4 as paper format:
-% \begin{quote}
-% \verb|\PassOptionsToClass{a4paper}{article}|
-% \end{quote}
-% An example follows how to generate the
-% documentation with pdf\LaTeX:
-% \begin{quote}
-%\begin{verbatim}
-%pdflatex pdftexcmds.dtx
-%bibtex pdftexcmds.aux
-%makeindex -s gind.ist pdftexcmds.idx
-%pdflatex pdftexcmds.dtx
-%makeindex -s gind.ist pdftexcmds.idx
-%pdflatex pdftexcmds.dtx
-%\end{verbatim}
-% \end{quote}
-%
-% \printbibliography[
-% heading=bibnumbered,
-% ]
-%
-% \begin{History}
-% \begin{Version}{2007/11/11 v0.1}
-% \item
-% First version.
-% \end{Version}
-% \begin{Version}{2007/11/12 v0.2}
-% \item
-% Short description fixed.
-% \end{Version}
-% \begin{Version}{2007/12/12 v0.3}
-% \item
-% Organization of Lua code as module.
-% \end{Version}
-% \begin{Version}{2009/04/10 v0.4}
-% \item
-% Adaptation for syntax change of \cs{directlua} in
-% \hologo{LuaTeX} 0.36.
-% \end{Version}
-% \begin{Version}{2009/09/22 v0.5}
-% \item
-% \cs{pdf@primitive}, \cs{pdf@ifprimitive} added.
-% \item
-% \hologo{XeTeX}'s variants are detected for
-% \cs{pdf@shellescape}, \cs{pdf@strcmp}, \cs{pdf@primitive},
-% \cs{pdf@ifprimitive}.
-% \end{Version}
-% \begin{Version}{2009/09/23 v0.6}
-% \item
-% Macro \cs{pdf@isprimitive} added.
-% \end{Version}
-% \begin{Version}{2009/12/12 v0.7}
-% \item
-% Short info shortened.
-% \end{Version}
-% \begin{Version}{2010/03/01 v0.8}
-% \item
-% Required date for package \xpackage{ifluatex} updated.
-% \end{Version}
-% \begin{Version}{2010/04/01 v0.9}
-% \item
-% Use \cs{ifeof18} for defining \cs{pdf@shellescape} between
-% \hologo{pdfTeX} 1.21a (inclusive) and 1.30.0 (exclusive).
-% \end{Version}
-% \begin{Version}{2010/11/04 v0.10}
-% \item
-% \cs{pdf@draftmode}, \cs{pdf@ifdraftmode} and
-% \cs{pdf@setdraftmode} added.
-% \end{Version}
-% \begin{Version}{2010/11/11 v0.11}
-% \item
-% Missing \cs{RequirePackage} for package \xpackage{ifpdf} added.
-% \end{Version}
-% \begin{Version}{2011/01/30 v0.12}
-% \item
-% Already loaded package files are not input in \hologo{plainTeX}.
-% \end{Version}
-% \begin{Version}{2011/03/04 v0.13}
-% \item
-% Improved Lua function \texttt{shellescape} that also
-% uses the result of \texttt{os.execute()} (thanks to Philipp Stephani).
-% \end{Version}
-% \begin{Version}{2011/04/10 v0.14}
-% \item
-% Version check of loaded module added.
-% \item
-% Patch for bug in \hologo{LuaTeX} between 0.40.6 and 0.65 that
-% is fixed in revision 4096.
-% \end{Version}
-% \begin{Version}{2011/04/16 v0.15}
-% \item
-% \hologo{LuaTeX}: \cs{pdf@shellescape} is only supported
-% for version 0.70.0 and higher due to a bug, \texttt{os.execute()}
-% crashes in some circumstances. Fixed in \hologo{LuaTeX}
-% beta-0.70.0, revision 4167.
-% \end{Version}
-% \begin{Version}{2011/04/22 v0.16}
-% \item
-% Previous fix was not working due to a wrong catcode of digit
-% zero (due to easily support the old \cs{directlua0}).
-% The version border is lowered to 0.68, because some
-% beta-0.67.0 seems also to work.
-% \end{Version}
-% \begin{Version}{2011/06/29 v0.17}
-% \item
-% Documentation addition to \cs{pdf@shellescape}.
-% \end{Version}
-% \begin{Version}{2011/07/01 v0.18}
-% \item
-% Add Lua module loading in \cs{everyjob} for \hologo{iniTeX}
-% (\hologo{LuaTeX} only).
-% \end{Version}
-% \begin{Version}{2011/07/28 v0.19}
-% \item
-% Missing space in an info message added (Martin M\"unch).
-% \end{Version}
-% \begin{Version}{2011/11/29 v0.20}
-% \item
-% \cs{pdf@resettimer} and \cs{pdf@elapsedtime} added
-% (thanks Andy Thomas).
-% \end{Version}
-% \begin{Version}{2016/05/10 v0.21}
-% \item
-% local unpack added
-% (thanks \'{E}lie Roux).
-% \end{Version}
-% \begin{Version}{2016/05/21 v0.22}
-% \item
-% adjust \cs{textbackslas}h usage in bib file for biber bug.
-% \end{Version}
-% \begin{Version}{2016/10/02 v0.23}
-% \item
-% add file.close to lua filehandles (github pull request).
-% \end{Version}
-% \begin{Version}{2017/01/29 v0.24}
-% \item
-% Avoid loading luatex-loader for current luatex. (Use
-% pdftexcmds.lua not oberdiek.pdftexcmds.lua to simplify file
-% search with standard require)
-% \end{Version}
-% \begin{Version}{2017/03/19 v0.25}
-% \item
-% New \cs{pdf@shellescape} for Lua\TeX, see github issue 20.
-% \end{Version}
-% \begin{Version}{2018/01/21 v0.26}
-% \item
-% use rb not r mode for file open github issue 34.
-% \end{Version}
-% \begin{Version}{2018/01/30 v0.27}
-% \item
-% \cs{pdf@mdfivesum} for \hologo{XeTeX}
-% \end{Version}
-% \begin{Version}{2018/09/07 v0.28}
-% \item
-% Fix catcode regime in luatex sprint for \cs{pdf@shellescape} GH issue 45
-% \end{Version}
-% \begin{Version}{2018/09/10 v0.29}
-% \item
-% Actually do the fix described above in the code, not just document it.
-% \end{Version}
-% \begin{Version}{2019/07/25 v0.30}
-% \item
-% Remove uses of module function, see PR70
-% \end{Version}
-% \begin{Version}{2019/11/24 v0.31}
-% \item
-% Use \xpackage{iftex} directly rather than \xpackage{ifluatex} and \xpackage{ifpdf} wrappers.
-% \item detect \verb|\filmoddate| and other \hologo{XeTeX} commands.
-% \item Adjust \cs{pdf@escapestring} in \hologo{LuaTeX} to produce
-% the same as in \hologo{pdfTeX} in the 8bit
-% range and not drop all non ascii characters.
-% \end{Version}
-% \end{History}
-%
-% \PrintIndex
-%
-% \Finale
-\endinput
diff --git a/Master/texmf-dist/source/latex/penrose/penrose_code.dtx b/Master/texmf-dist/source/latex/penrose/penrose_code.dtx
index be7030312fe..cdc63569659 100644
--- a/Master/texmf-dist/source/latex/penrose/penrose_code.dtx
+++ b/Master/texmf-dist/source/latex/penrose/penrose_code.dtx
@@ -34,7 +34,7 @@ See http://www.latex-project.org/lppl.txt
\endpreamble
\postamble
-Copyright (C) 2014-2018 by Andrew Stacey <loopspace@mathforge.org>
+Copyright (C) 2014-2019 by Andrew Stacey <loopspace@mathforge.org>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License (LPPL), either
@@ -46,18 +46,18 @@ http://www.latex-project.org/lppl.txt
This work is "maintained" (as per LPPL maintenance status) by
Andrew Stacey.
-This work consists of the files penrose3.dtx
+This work consists of the files penrose_code.dtx
penrose.tex
and the derived files penrose.ins
- penrose3.pdf
+ penrose_code.pdf
penrose.pdf
tikzlibrarypenrose.code.tex
- README
+ README.txt
\endpostamble
\usedir{tex/latex/penrose}
\generate{
- \file{tikzlibrarypenrose.code.tex}{\from{\jobname.dtx}{library}}
+ \file{tikzlibrarypenrose.code.tex}{\from{\jobname.dtx}{package}}
}
%</install>
%<install>\endbatchfile
@@ -78,11 +78,11 @@ and the derived files penrose.ins
\fi
%</internal>
%<*driver>
-\documentclass[full]{l3doc}
+\documentclass{l3doc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{tikz}
-\usepackage{trace}
+%\usepackage{trace}
\usetikzlibrary{penrose}
%\traceoff
%\usepackage[numbered]{hypdoc}
@@ -139,6 +139,8 @@ and the derived files penrose.ins
%
%
% \changes{1.0}{2014/05/07}{Converted to DTX file}
+% \changes{1.2}{2019/02/23}{Added general tile creation code}
+% \changes{1.4}{2021/01/22}{Adapted to latest version of spath3}
%
% \DoNotIndex
% {
@@ -149,39 +151,50 @@ and the derived files penrose.ins
% \endcsname,
% }%
%
+%
% \providecommand*{\url}{\texttt}
+% \GetFileInfo{tikzlibrarypenrose.code.tex}
% \title{The \textsf{Penrose} package}
% \author{Andrew Stacey\texorpdfstring{\\ \url{loopspace@mathforge.org}}{}}
-% \date{1.0 from 2018/07/10}
+% \date{\fileversion~from \filedate}
%
%
% \maketitle
%
+% \tableofcontents
+%
+% \begin{documentation}
%
% \section{Introduction}
%
% This is a TikZ library for drawing Penrose tiles (kite/dart, rhombus, and pentagon versions).
% It provides two methods of drawing: one in which an automatic pattern is built, and one where the tiles can be placed ``by hand''.
% The tiles can be shaped and (hopefully!) still fit together.
-% For user documentation, see the \Verb+penrose.pdf+ file.
+% For full user documentation, see the \Verb+penrose.pdf+ file.
%
-% \StopEventually{}
%
-% \section{Implementation}
+% \end{documentation}
%
-% \iffalse
-%<*library>
-% \fi
-% \subsection{Initialisation}
+% \begin{implementation}
%
+% \section{Implementation}
%
% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+% \begin{macrocode}
%<@@=penrose>
% \end{macrocode}
+%
+% \subsection{Initialisation}
+%
+%
% We use the \Verb+spath3+ library for manipulating the paths that will make up the tiles.
%
% \begin{macrocode}
+\ProvidesExplFile {tikzlibrarypenrose.code.tex} {2021/01/22} {1.4} {TikZ pics for Penrose and other tiles}
\RequirePackage{spath3}
+\usetikzlibrary{spath3}
% \end{macrocode}
% Now we move in to the realm of \LaTeX3.
% \begin{macrocode}
@@ -189,50 +202,75 @@ and the derived files penrose.ins
% \end{macrocode}
%
% Start with some basic paths (lines) for the sides of the tiles so that we know that we have well-defined tiles at the outset.
-%
-% \begin{macrocode}
-\MakeSPath{Penrose path a}
- {
- \pgfsyssoftpath@movetotoken{0pt}{0pt}
- \pgfsyssoftpath@linetotoken{1pt}{0pt}
- }
-\SPathPrepare{Penrose path a}
-\CloneSPath {Penrose path a}{Penrose path b}
-\CloneSPath {Penrose path a}{Penrose path c}
-\CloneSPath {Penrose path a}{Penrose path d}
-\CloneSPath {Penrose path a}{Penrose path A}
-\CloneSPath {Penrose path a}{Penrose path B}
-\CloneSPath {Penrose path a}{Penrose path C}
-\CloneSPath {Penrose path a}{Penrose path D}
-% \end{macrocode}
-%
-% \begin{variable}{\l__penrose_tmpa_fp, \l__penrose_tmpb_fp, \l__penrose_tmpc_fp, \l__penrose_tmpa_tl, \l__penrose_tmpb_tl, \l__penrose_tmpc_tl}
+% These are globally defined as we will frequently want to define them in one tikzpicture and use them in another.
+%
+% \begin{macrocode}
+\tl_new:N \g_@@_side_a_tl
+\tl_new:N \g_@@_side_b_tl
+\tl_new:N \g_@@_side_c_tl
+\tl_new:N \g_@@_side_d_tl
+\tl_new:N \g_@@_side_e_tl
+\tl_new:N \g_@@_side_A_tl
+\tl_new:N \g_@@_side_B_tl
+\tl_new:N \g_@@_side_C_tl
+\tl_new:N \g_@@_side_D_tl
+\tl_new:N \g_@@_side_E_tl
+\tl_gset:Nn \g_@@_side_a_tl
+{
+ \pgfsyssoftpath@movetotoken{0pt}{0pt}
+ \pgfsyssoftpath@linetotoken{1pt}{0pt}
+}
+\tl_gset_eq:NN \g_@@_side_b_tl \g_@@_side_a_tl
+\tl_gset_eq:NN \g_@@_side_c_tl \g_@@_side_a_tl
+\tl_gset_eq:NN \g_@@_side_d_tl \g_@@_side_a_tl
+\tl_gset_eq:NN \g_@@_side_e_tl \g_@@_side_a_tl
+\tl_gset_eq:NN \g_@@_side_A_tl \g_@@_side_a_tl
+\tl_gset_eq:NN \g_@@_side_B_tl \g_@@_side_a_tl
+\tl_gset_eq:NN \g_@@_side_C_tl \g_@@_side_a_tl
+\tl_gset_eq:NN \g_@@_side_D_tl \g_@@_side_a_tl
+\tl_gset_eq:NN \g_@@_side_E_tl \g_@@_side_a_tl
+% \end{macrocode}
+%
+% \begin{variable}{\l_@@_tmpa_fp, \l_@@_tmpb_fp, \l_@@_tmpc_fp, \l_@@_tmpa_tl, \l_@@_tmpb_tl, \l_@@_tmpc_tl, \l_@@_tmpd_tl, \l_@@_tmpa_int, \l_@@_tmpb_int, \l_@@_xa_dim, \l_@@_ya_dim, \l_@@_xb_dim, \l_@@_yb_dim, \l_@@_tmpa_prop}
% We need a few temporary variables to hold intermediate calculations.
%
% \begin{macrocode}
-\fp_new:N \l__penrose_tmpa_fp
-\fp_new:N \l__penrose_tmpb_fp
-\fp_new:N \l__penrose_tmpc_fp
-\tl_new:N \l__penrose_tmpa_tl
-\tl_new:N \l__penrose_tmpb_tl
-\tl_new:N \l__penrose_tmpc_tl
+\fp_new:N \l_@@_tmpa_fp
+\fp_new:N \l_@@_tmpb_fp
+\fp_new:N \l_@@_tmpc_fp
+\str_new:N \l_@@_tmpa_str
+\str_new:N \l_@@_tmpb_str
+\tl_new:N \l_@@_tmpa_tl
+\tl_new:N \l_@@_tmpb_tl
+\tl_new:N \l_@@_tmpc_tl
+\tl_new:N \l_@@_tmpd_tl
+\tl_new:N \l_@@_tmp_tile_path_tl
+\tl_new:N \g_@@_smuggle_tl
+\int_new:N \l_@@_tmpa_int
+\int_new:N \l_@@_tmpb_int
+\dim_new:N \l_@@_xa_dim
+\dim_new:N \l_@@_ya_dim
+\dim_new:N \l_@@_xb_dim
+\dim_new:N \l_@@_yb_dim
+\prop_new:N \l_@@_tmpa_prop
% \end{macrocode}
% \end{variable}
%
% \subsection{Creating the Tiles}
%
-% \begin{macro}[internal]{\penrose_normalise_path:n}
+% \begin{macro}[internal]{\@@_normalise_path:Nn}
% When defining the path for a side, we normalise so that it starts at the origin and ends at \Verb+(1pt,0pt)+.
% \begin{macrocode}
-\cs_new_nopar:Npn \penrose_normalise_path:n #1
+\cs_new_nopar:Npn \@@_normalise_path:Nn #1#2
{
% \end{macrocode}
% Get the initial point of the path and convert to floating point.
% \begin{macrocode}
- \spath_get:nnN {#1} {initial point} \l__penrose_tmpa_tl
- \fp_set:Nn \l__penrose_tmpa_fp {\tl_head:N \l__penrose_tmpa_tl}
- \tl_set:Nx \l__penrose_tmpa_tl {\tl_tail:N \l__penrose_tmpa_tl}
- \fp_set:Nn \l__penrose_tmpb_fp {\tl_head:N \l__penrose_tmpa_tl}
+ \group_begin:
+ \spath_initialpoint:Nn \l_@@_tmpa_tl {#2}
+ \fp_set:Nn \l_@@_tmpa_fp {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \fp_set:Nn \l_@@_tmpb_fp {\tl_head:N \l_@@_tmpa_tl}
% \end{macrocode}
% Get the final point of the path, and compute the difference of the final and initial points.
%
@@ -245,71 +283,80 @@ and the derived files penrose.ins
% \]
%
% \begin{macrocode}
- \spath_get:nnN {#1} {final point} \l__penrose_tmpa_tl
- \fp_set:Nn \l__penrose_tmpa_fp
- {\tl_head:N \l__penrose_tmpa_tl - \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpa_tl {\tl_tail:N \l__penrose_tmpa_tl}
- \fp_set:Nn \l__penrose_tmpb_fp
- {\tl_head:N \l__penrose_tmpa_tl - \l__penrose_tmpb_fp}
+ \spath_finalpoint:Nn \l_@@_tmpa_tl {#2}
+ \fp_set:Nn \l_@@_tmpa_fp
+ {\tl_head:N \l_@@_tmpa_tl - \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \fp_set:Nn \l_@@_tmpb_fp
+ {\tl_head:N \l_@@_tmpa_tl - \l_@@_tmpb_fp}
% \end{macrocode}
% Now compute the square of the length of the path for scaling.
% \begin{macrocode}
- \fp_set:Nn \l__penrose_tmpc_fp
- {\l__penrose_tmpa_fp^2 + \l__penrose_tmpb_fp^2}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_tmpa_fp/\l__penrose_tmpc_fp}
- \fp_set:Nn \l__penrose_tmpb_fp {\l__penrose_tmpb_fp/\l__penrose_tmpc_fp}
- \fp_set:Nn \l__penrose_tmpc_fp {-\l__penrose_tmpb_fp}
+ \fp_set:Nn \l_@@_tmpc_fp
+ {\l_@@_tmpa_fp^2 + \l_@@_tmpb_fp^2}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_tmpa_fp/\l_@@_tmpc_fp}
+ \fp_set:Nn \l_@@_tmpb_fp {\l_@@_tmpb_fp/\l_@@_tmpc_fp}
+ \fp_set:Nn \l_@@_tmpc_fp {-\l_@@_tmpb_fp}
% \end{macrocode}
% Now construct the matrix.
% \begin{macrocode}
- \tl_set:Nx \l__penrose_tmpb_tl
+ \tl_set:Nx \l_@@_tmpb_tl
{
- {\fp_use:N \l__penrose_tmpa_fp}
- {\fp_use:N \l__penrose_tmpb_fp}
- {\fp_use:N \l__penrose_tmpc_fp}
- {\fp_use:N \l__penrose_tmpa_fp}
+ {\fp_use:N \l_@@_tmpa_fp}
+ {\fp_use:N \l_@@_tmpc_fp} % swapped
+ {\fp_use:N \l_@@_tmpb_fp} % swapped
+ {\fp_use:N \l_@@_tmpa_fp}
}
% \end{macrocode}
% Get the initial point back again for the translation part.
% \begin{macrocode}
- \spath_get:nnN {#1} {initial point} \l__penrose_tmpa_tl
+ \spath_initialpoint:Nn \l_@@_tmpa_tl {#2}
% \end{macrocode}
% But we need to premultiply by the matrix because of how the transformations are applied.
% \begin{macrocode}
- \fp_set:Nn \l__penrose_tmpa_fp
+ \fp_set:Nn \l_@@_tmpa_fp
{
- (-1) * \l__penrose_tmpa_fp * \tl_head:N \l__penrose_tmpa_tl
- + (-1) * \l__penrose_tmpb_fp * \tl_tail:N \l__penrose_tmpa_tl
+ (-1) * \l_@@_tmpa_fp * \tl_head:N \l_@@_tmpa_tl
+ + (-1) * \l_@@_tmpb_fp * \tl_tail:N \l_@@_tmpa_tl
}
- \fp_set:Nn \l__penrose_tmpb_fp
+ \fp_set:Nn \l_@@_tmpb_fp
{
- (-1) * \l__penrose_tmpa_fp * \tl_tail:N \l__penrose_tmpa_tl
- + \l__penrose_tmpb_fp * \tl_head:N \l__penrose_tmpa_tl
+ (-1) * \l_@@_tmpa_fp * \tl_tail:N \l_@@_tmpa_tl
+ + \l_@@_tmpb_fp * \tl_head:N \l_@@_tmpa_tl
}
% \end{macrocode}
% Finally, we apply the transformation to the path.
% \begin{macrocode}
- \tl_put_right:Nx \l__penrose_tmpb_tl {
- {\fp_to_dim:N \l__penrose_tmpa_fp}
- {\fp_to_dim:N \l__penrose_tmpb_fp}
+ \tl_put_right:Nx \l_@@_tmpb_tl {
+ {\fp_to_dim:N \l_@@_tmpa_fp}
+ {\fp_to_dim:N \l_@@_tmpb_fp}
}
- \spath_transform:nV {#1} \l__penrose_tmpb_tl
+ \spath_transform:NnV \l_@@_tmpa_tl {#2} \l_@@_tmpb_tl
+ \tl_gset_eq:NN \g_@@_smuggle_tl \l_@@_tmpa_tl
+ \group_end:
+ \tl_set_eq:NN #1 \g_@@_smuggle_tl
+ \tl_gclear:N \g_@@_smuggle_tl
}
+\cs_generate_variant:Nn \@@_normalise_path:Nn {NV, cn, cV}
+\cs_new_protected_nopar:Npn \@@_normalise_path:N #1
+{
+ \@@_normalise_path:NV #1#1
+}
+\cs_generate_variant:Nn \@@_normalise_path:N {c}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\SetPenrosePath}
+% \begin{function}{\SetPenrosePath}
% This sets the path corresponding to a particular side to the current path, and normalises it.
% \begin{macrocode}
\NewDocumentCommand \SetPenrosePath { m }
{
- \pgfsyssoftpath@getcurrentpath\l__penrose_tmpa_tl
- \spath_clear_new:n {Penrose path #1}
- \spath_put:nnV {Penrose path #1} {path} \l__penrose_tmpa_tl
- \penrose_normalise_path:n {Penrose path #1}
+ \pgfsyssoftpath@getcurrentpath\l_@@_tmpa_tl
+ \@@_normalise_path:N \l_@@_tmpa_tl
+ \tl_gset_eq:cN {g_@@_side_#1_tl} \l_@@_tmpa_tl
}
% \end{macrocode}
-% \end{macro}
+% \end{function}
%
% \begin{macro}[internal]{\tikz_scan_point:n}
% This is a wrapper around \Verb+\tikz@scan@one@point+ to make it easier to use with \LaTeX3 variables.
@@ -322,32 +369,32 @@ and the derived files penrose.ins
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\penrose_make_tile:nnn}
+% \begin{macro}[internal]{\@@_make_tile:nnn}
% This builds the tile path from its pieces.
% The arguments are the name of the tile, the descriptions of the sides, and a token list of the coordinates.
% \begin{macrocode}
-\cs_new_nopar:Npn \penrose_make_tile:nnn #1#2#3
+\cs_new_nopar:Npn \@@_make_tile:nnn #1#2#3
{
% \end{macrocode}
% Get the first coordinate and initialise the path with a move to this point.
% \begin{macrocode}
- \tl_set:Nn \l__penrose_tmpa_tl {#3}
- \tl_set:Nx \l__penrose_tmpb_tl {\tl_head:N \l__penrose_tmpa_tl}
- \tl_set:Nn \l__penrose_tmpa_tl {\pgfsyssoftpath@movetotoken}
- \tikz_scan_point:V \l__penrose_tmpb_tl
- \tl_put_right:Nx \l__penrose_tmpa_tl
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#3}
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nn \l_@@_tmpa_tl {\pgfsyssoftpath@movetotoken}
+ \tikz_scan_point:V \l_@@_tmpb_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl
{
{\dim_use:N \pgf@x}{\dim_use:N \pgf@y}
}
- \spath_clear_new:n {Penrose path tile #1}
- \spath_put:nnV {Penrose path tile #1} {path} \l__penrose_tmpa_tl
+ \tl_set_eq:NN \l_@@_tmp_tile_path_tl \l_@@_tmpa_tl
% \end{macrocode}
% Now we have our path initialised, we can start appending the side paths according to the specification in the second argument.
%
% We append the initial coordinate to the end of the list to make a closed cycle.
% \begin{macrocode}
- \tl_set:Nn \l__penrose_tmpa_tl {#3}
- \tl_put_right:Nx \l__penrose_tmpa_tl {{\tl_head:N \l__penrose_tmpa_tl}}
+ \tl_set:Nn \l_@@_tmpa_tl {#3}
+ \tl_put_right:Nx \l_@@_tmpa_tl {{\tl_head:N \l_@@_tmpa_tl}}
% \end{macrocode}
% Now we walk through the description of the sides, adding the specified paths to our tile path.
% \begin{macrocode}
@@ -355,66 +402,72 @@ and the derived files penrose.ins
% \end{macrocode}
% Clone the path for this side.
% \begin{macrocode}
- \spath_clone:nn {Penrose path ##1} {Penrose path tmpa}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_head:n {##1}}
+ \tl_set_eq:Nc \l_@@_tmpd_tl {g_@@_side_ \tl_use:N \l_@@_tmpc_tl _tl}
% \end{macrocode}
% Strip off the next coordinate, and convert it to a point.
% \begin{macrocode}
- \tl_set:Nx \l__penrose_tmpb_tl {\tl_head:N \l__penrose_tmpa_tl}
- \tl_set:Nx \l__penrose_tmpa_tl {\tl_tail:N \l__penrose_tmpa_tl}
- \tikz_scan_point:V \l__penrose_tmpb_tl
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \tikz_scan_point:V \l_@@_tmpb_tl
% \end{macrocode}
% Store the resulting coordinate.
% \begin{macrocode}
- \fp_set:Nn \l__penrose_tmpa_fp { \pgf@x }
- \fp_set:Nn \l__penrose_tmpb_fp { \pgf@y }
+ \fp_set:Nn \l_@@_tmpa_fp { \pgf@x }
+ \fp_set:Nn \l_@@_tmpb_fp { \pgf@y }
% \end{macrocode}
% Now get the next coordinate.
% \begin{macrocode}
- \tl_set:Nx \l__penrose_tmpb_tl {\tl_head:N \l__penrose_tmpa_tl}
- \tikz_scan_point:V \l__penrose_tmpb_tl
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tikz_scan_point:V \l_@@_tmpb_tl
% \end{macrocode}
% We want the difference between the two coordinates.
% \begin{macrocode}
- \fp_set:Nn \l__penrose_tmpa_fp {\pgf@x - \l__penrose_tmpa_fp}
- \fp_set:Nn \l__penrose_tmpb_fp {\pgf@y - \l__penrose_tmpb_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\pgf@x - \l_@@_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpb_fp {\pgf@y - \l_@@_tmpb_fp}
% \end{macrocode}
% This is converted into a transformation matrix.
% \begin{macrocode}
- \fp_set:Nn \l__penrose_tmpc_fp {-\l__penrose_tmpb_fp}
- \tl_set:Nx \l__penrose_tmpb_tl
+ \fp_set:Nn \l_@@_tmpc_fp {-\l_@@_tmpb_fp}
+ \tl_set:Nx \l_@@_tmpb_tl
{
- {\fp_use:N \l__penrose_tmpa_fp}
- {\fp_use:N \l__penrose_tmpc_fp}
- {\fp_use:N \l__penrose_tmpb_fp}
- {\fp_use:N \l__penrose_tmpa_fp}
+ {\fp_use:N \l_@@_tmpa_fp}
+ {\fp_use:N \l_@@_tmpb_fp} % not swapped
+ {\fp_use:N \l_@@_tmpc_fp} % not swapped
+ {\fp_use:N \l_@@_tmpa_fp}
{0}
{0}
}
% \end{macrocode}
% The transformation is applied to the cloned path.
% \begin{macrocode}
- \spath_transform:nV {Penrose path tmpa} \l__penrose_tmpb_tl
+ \spath_transform:NV \l_@@_tmpd_tl \l_@@_tmpb_tl
% \end{macrocode}
% And this is welded to the tile path.
% \begin{macrocode}
- \spath_weld:nn {Penrose path tile #1} {Penrose path tmpa}
+ \spath_weld:NV \l_@@_tmp_tile_path_tl \l_@@_tmpd_tl
}
% \end{macrocode}
% At the end we close the path.
% \begin{macrocode}
- \spath_close_path:n {Penrose path tile #1}
+ \spath_close:N \l_@@_tmp_tile_path_tl
+ \tl_gset_eq:NN \g_@@_smuggle_tl \l_@@_tmp_tile_path_tl
+ \group_end:
+ \tl_gclear_new:c {g_@@_tile_#1_tl}
+ \tl_gset_eq:cN {g_@@_tile_#1_tl} \g_@@_smuggle_tl
+ \tl_gclear:N \g_@@_smuggle_tl
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\penrose_make_tile:nn}
+% \begin{macro}[internal]{\@@_make_tile:nn}
% A wrapper around the above which allows us to specify the second two arguments as two items in a token list.
% \begin{macrocode}
-\cs_new_nopar:Npn \penrose_make_tile:nn #1#2
+\cs_new_nopar:Npn \@@_make_tile:nn #1#2
{
- \penrose_make_tile:nnn {#1} #2
+ \@@_make_tile:nnn {#1} #2
}
-\cs_generate_variant:Nn \penrose_make_tile:nn {nV}
+\cs_generate_variant:Nn \@@_make_tile:nn {nV}
% \end{macrocode}
% \end{macro}
%
@@ -422,21 +475,28 @@ and the derived files penrose.ins
%
% The tile specifications are contained in a \Verb+prop+.
% \begin{macrocode}
-\prop_new:N \g__penrose_tiles_prop
+\prop_new:N \g_@@_tiles_prop
% \end{macrocode}
%
-% \begin{macro}[internal]{\tl_add_coordinate:Nnn}
+% \begin{macro}[internal]{\@@_add_coordinate:Nnn, \@@_add_coordinate:w}
% Process a coordinate through \Verb+fp+ and adds it to a token list.
% \begin{macrocode}
-\cs_new_nopar:Npn \tl_add_coordinate:Nnn #1#2#3 {
- \fp_set:Nn \l__penrose_tmpa_fp{#2}
- \fp_set:Nn \l__penrose_tmpb_fp{#3}
+\cs_new_nopar:Npn \@@_add_coordinate:Nnn #1#2#3 {
+ \fp_set:Nn \l_@@_tmpa_fp{#2}
+ \fp_set:Nn \l_@@_tmpb_fp{#3}
\tl_put_right:Nx #1
{
- {(\fp_use:N \l__penrose_tmpa_fp, \fp_use:N \l__penrose_tmpb_fp)}
+ {(\fp_use:N \l_@@_tmpa_fp, \fp_use:N \l_@@_tmpb_fp)}
}
}
% \end{macrocode}
+% Wrapper around the add coordinate command to split at a comma.
+% \begin{macrocode}
+\cs_new_nopar:Npn \@@_add_coordinate:w #1#2,#3 \q_stop
+{
+ \@@_add_coordinate:Nnn \l_@@_tmpa_tl {#2}{#3}
+}
+% \end{macrocode}
% \end{macro}
%
% Now we specify the tiles.
@@ -446,182 +506,186 @@ and the derived files penrose.ins
% \begin{itemize}
% \item Thin Rhombus.
% \begin{macrocode}
-\tl_clear:N \l__penrose_tmpa_tl
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {0}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(18)}{sind(18)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {2*cosd(18)}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(18)}{-sind(18)}
+\tl_clear:N \l_@@_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{sind(18)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(18)}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{-sind(18)}
-\prop_gput:Nnx \g__penrose_tiles_prop {thin~ rhombus}
-{{a A B b} {\tl_use:N \l__penrose_tmpa_tl}}
+\prop_gput:Nnx \g_@@_tiles_prop {thin~ rhombus}
+{{a A B b} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \item Thick Rhombus.
% \begin{macrocode}
-\tl_clear:N \l__penrose_tmpa_tl
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {0}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(36)}{sind(36)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {2*cosd(36)}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(36)}{-sind(36)}
+\tl_clear:N \l_@@_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(36)}{sind(36)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(36)}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(36)}{-sind(36)}
-\prop_gput:Nnx \g__penrose_tiles_prop {thick~ rhombus}
-{{B a A b} {\tl_use:N \l__penrose_tmpa_tl}}
+\prop_gput:Nnx \g_@@_tiles_prop {thick~ rhombus}
+{{B a A b} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \item Dart.
% \begin{macrocode}
-\tl_clear:N \l__penrose_tmpa_tl
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {0}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl
+\tl_clear:N \l_@@_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl
{2*sind(18)*cosd(108)}{2*sind(18)*sind(108)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {2*sind(18)}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*sind(18)}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl
{2*sind(18)*cosd(108)}{-2*sind(18)*sind(108)}
-\prop_gput:Nnx \g__penrose_tiles_prop {dart}
-{{c a A C} {\tl_use:N \l__penrose_tmpa_tl}}
+\prop_gput:Nnx \g_@@_tiles_prop {dart}
+{{c a A C} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \item Kite.
% \begin{macrocode}
-\tl_clear:N \l__penrose_tmpa_tl
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {0}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(36)}{sind(36)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {1}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(36)}{-sind(36)}
+\tl_clear:N \l_@@_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(36)}{sind(36)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(36)}{-sind(36)}
-\prop_gput:Nnx \g__penrose_tiles_prop {kite}
-{{a c C A} {\tl_use:N \l__penrose_tmpa_tl}}
+\prop_gput:Nnx \g_@@_tiles_prop {kite}
+{{a c C A} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \item Golden Triangle.
% \begin{macrocode}
-\tl_clear:N \l__penrose_tmpa_tl
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {0}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(18)}{sind(18)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(18)}{-sind(18)}
+\tl_clear:N \l_@@_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{sind(18)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{-sind(18)}
-\prop_gput:Nnx \g__penrose_tiles_prop {golden~ triangle}
-{{a c b} {\tl_use:N \l__penrose_tmpa_tl}}
+\prop_gput:Nnx \g_@@_tiles_prop {golden~ triangle}
+{{a c b} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \item Reverse Golden Triangle.
% \begin{macrocode}
-\tl_clear:N \l__penrose_tmpa_tl
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {0}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(18)}{sind(18)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(18)}{-sind(18)}
+\tl_clear:N \l_@@_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{sind(18)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{-sind(18)}
-\prop_gput:Nnx \g__penrose_tiles_prop {reverse~ golden~ triangle}
-{{B C A} {\tl_use:N \l__penrose_tmpa_tl}}
+\prop_gput:Nnx \g_@@_tiles_prop {reverse~ golden~ triangle}
+{{B C A} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \item Golden Gnomon
% \begin{macrocode}
-\tl_clear:N \l__penrose_tmpa_tl
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {0}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(36)}{sind(36)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {2*cosd(36)}{0}
+\tl_clear:N \l_@@_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(36)}{sind(36)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(36)}{0}
-\prop_gput:Nnx \g__penrose_tiles_prop {golden~ gnomon}
-{{C b A} {\tl_use:N \l__penrose_tmpa_tl}}
+\prop_gput:Nnx \g_@@_tiles_prop {golden~ gnomon}
+{{C b A} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \item Reverse Golden Gnomon
% \begin{macrocode}
-\tl_clear:N \l__penrose_tmpa_tl
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {0}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {2*cosd(36)}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(36)}{-sind(36)}
-\prop_gput:Nnx \g__penrose_tiles_prop {reverse~ golden~ gnomon}
-{{a B c} {\tl_use:N \l__penrose_tmpa_tl}}
+\tl_clear:N \l_@@_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(36)}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(36)}{-sind(36)}
+\prop_gput:Nnx \g_@@_tiles_prop {reverse~ golden~ gnomon}
+{{a B c} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \item Primary Pentagon (pentagon 5)
% \begin{macrocode}
-\tl_clear:N \l__penrose_tmpa_tl
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {0}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(108)}{sind(108)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl
+\tl_clear:N \l_@@_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(108)}{sind(108)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl
{1+cosd(72)+cosd(144)}{sind(72)+sind(144)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {1+cosd(72)}{sind(72)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {1}{0}
-\prop_gput:Nnx \g__penrose_tiles_prop {pentagon~ 5}
-{{a a a a a} {\tl_use:N \l__penrose_tmpa_tl}}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1+cosd(72)}{sind(72)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1}{0}
+\prop_gput:Nnx \g_@@_tiles_prop {pentagon~ 5}
+{{a a a a a} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \item Secondary Pentagon (pentagon 3)
% \begin{macrocode}
-\prop_gput:Nnx \g__penrose_tiles_prop {pentagon~ 3}
-{{A b a a b} {\tl_use:N \l__penrose_tmpa_tl}}
+\prop_gput:Nnx \g_@@_tiles_prop {pentagon~ 3}
+{{A b a a b} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \item Tertiary Pentagon (pentagon 2)
% \begin{macrocode}
-\prop_gput:Nnx \g__penrose_tiles_prop {pentagon~ 2}
-{{d A c c A} {\tl_use:N \l__penrose_tmpa_tl}}
+\prop_gput:Nnx \g_@@_tiles_prop {pentagon~ 2}
+{{d A e c A} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \item Pentagram
% \begin{macrocode}
-\tl_clear:N \l__penrose_tmpa_tl
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {1}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {1-cosd(36)}{-sind(36)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl
+\tl_clear:N \l_@@_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1-cosd(36)}{-sind(36)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl
{1-cosd(36)-cosd(108)}{-sind(36)-sind(108)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(108)}{-sind(108)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(108)}{-sind(108)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl
{-1+3*cosd(108)+cosd(36)}{-sind(36)-sind(108)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl
{-1+2*cosd(108)+cosd(36)}{-sind(36)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {-1+2*cosd(108)}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {2*cosd(108)}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(108)}{sind(108)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {0}{0}
-\prop_gput:Nnx \g__penrose_tiles_prop {pentagram}
-{{C C C C C C C C C C} {\tl_use:N \l__penrose_tmpa_tl}}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {-1+2*cosd(108)}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(108)}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(108)}{sind(108)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0}
+\prop_gput:Nnx \g_@@_tiles_prop {pentagram}
+{{C E C E C E C E C E} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \item Boat
% \begin{macrocode}
-\tl_clear:N \l__penrose_tmpa_tl
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {-1+2*cosd(108)}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {2*cosd(108)}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(108)}{sind(108)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {0}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {1}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {1-cosd(36)}{-sind(36)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl
+\tl_clear:N \l_@@_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {-1+2*cosd(108)}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(108)}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(108)}{sind(108)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1-cosd(36)}{-sind(36)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl
{-1+2*cosd(108)+cosd(36)}{-sind(36)}
-\prop_gput:Nnx \g__penrose_tiles_prop {boat}
-{{C C C C B D B} {\tl_use:N \l__penrose_tmpa_tl}}
+\prop_gput:Nnx \g_@@_tiles_prop {boat}
+{{C E C E B D B} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \item Diamond.
% \begin{macrocode}
-\tl_clear:N \l__penrose_tmpa_tl
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {0}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(18)}{sind(18)}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {2*cosd(18)}{0}
-\tl_add_coordinate:Nnn \l__penrose_tmpa_tl {cosd(18)}{-sind(18)}
-\prop_gput:Nnx \g__penrose_tiles_prop {diamond}
-{{D B B D} {\tl_use:N \l__penrose_tmpa_tl}}
+\tl_clear:N \l_@@_tmpa_tl
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{sind(18)}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(18)}{0}
+\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{-sind(18)}
+\prop_gput:Nnx \g_@@_tiles_prop {diamond}
+{{D B B D} {\tl_use:N \l_@@_tmpa_tl}}
% \end{macrocode}
%
% \end{itemize}
%
-% \begin{macro}[internal]{\MakePenroseTile}
+% \begin{function}{\BakePenroseTile}
% This is the user wrapper around the tile creation macros.
% \begin{macrocode}
-\NewDocumentCommand \MakePenroseTile {m}
+\NewDocumentCommand \BakePenroseTile {m}
{
- \prop_get:NnN \g__penrose_tiles_prop {#1} \l__penrose_tmpa_tl
- \penrose_make_tile:nV {#1} \l__penrose_tmpa_tl
+ \prop_get:NnN \g_@@_tiles_prop {#1} \l_@@_tmpa_tl
+ \@@_make_tile:nV {#1} \l_@@_tmpa_tl
}
% \end{macrocode}
-% \end{macro}
+% For backwards compatibility.
+% \begin{macrocode}
+\cs_set_eq:NN \MakePenroseTile \BakePenroseTile
+% \end{macrocode}
+% \end{function}
%
-% \begin{macro}[internal]{\UsePenroseTile}
+% \begin{function}{\UsePenroseTile}
% This is the command that actually places a tile on the page.
% The first argument is optional and is for styling.
% \begin{macrocode}
@@ -631,36 +695,36 @@ and the derived files penrose.ins
% We need to transform the tile to correspond to the current transformation matrix.
% To ensure that we only transform the current tile, we clone it first.
% \begin{macrocode}
- \spath_clone:nn {Penrose path tile #2} {Penrose path tmpa}
+ \tl_set_eq:Nc \l_@@_tmp_tile_path_tl {g_@@_tile_#2_tl}
% \end{macrocode}
% The transformation matrix returned by PGF appears to be transposed from what it should be.
% (This needs a little more investigation, it might be that I've implemented the multiplication incorrectly here.)
% \begin{macrocode}
- \pgfgettransform \l__penrose_tmpa_tl
- \tl_clear:N \l__penrose_tmpb_tl
- \tl_set:Nx \l__penrose_tmpb_tl {{\tl_head:N \l__penrose_tmpa_tl}}
- \tl_set:Nx \l__penrose_tmpa_tl {\tl_tail:N \l__penrose_tmpa_tl}
- \tl_put_right:Nx \l__penrose_tmpb_tl
- {
- {\tl_item:Nn \l__penrose_tmpa_tl {2}}
- }
- \tl_put_right:Nx \l__penrose_tmpb_tl
- {
- {\tl_item:Nn \l__penrose_tmpa_tl {1}}
- }
- \tl_set:Nx \l__penrose_tmpa_tl {\tl_tail:N \l__penrose_tmpa_tl}
- \tl_set:Nx \l__penrose_tmpa_tl {\tl_tail:N \l__penrose_tmpa_tl}
- \tl_put_right:NV \l__penrose_tmpb_tl \l__penrose_tmpa_tl
+ \pgfgettransform \l_@@_tmpa_tl
+% \tl_clear:N \l_@@_tmpb_tl
+% \tl_set:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}}
+% \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+% \tl_put_right:Nx \l_@@_tmpb_tl
+% {
+% {\tl_item:Nn \l_@@_tmpa_tl {1}}
+% }
+% \tl_put_right:Nx \l_@@_tmpb_tl
+% {
+% {\tl_item:Nn \l_@@_tmpa_tl {2}}
+% }
+% \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+% \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+% \tl_put_right:NV \l_@@_tmpb_tl \l_@@_tmpa_tl
% \end{macrocode}
% Apply the transformation, protocol the path, and render it.
% \begin{macrocode}
- \spath_transform:nV {Penrose path tmpa} \l__penrose_tmpb_tl
- \spath_protocol_path:n {Penrose path tmpa}
- \spath_tikz_path:nn {#1}{Penrose path tmpa}
+ \spath_transform:NV \l_@@_tmp_tile_path_tl \l_@@_tmpa_tl
+ \spath_tikz_path:nV {#1} \l_@@_tmp_tile_path_tl
}
% \end{macrocode}
-% \end{macro}
+% \end{function}
%
+% \begin{macro}{save Penrose path}
% This is a style for a user to take a path and make it into the path for one of the sides.
% It needs to store both that side and the reverse.
% \begin{macrocode}
@@ -670,60 +734,395 @@ and the derived files penrose.ins
% \end{macrocode}
% Get the current path.
% \begin{macrocode}
- \pgfsyssoftpath@getcurrentpath\l__penrose_tmpa_tl
-% \end{macrocode}
-% Clear the receiving path, and store the current path in it.
-% \begin{macrocode}
- \spath_clear_new:n {Penrose path #1}
- \spath_put:nnV {Penrose path #1} {path} \l__penrose_tmpa_tl
+ \pgfsyssoftpath@getcurrentpath\l_@@_tmpa_tl
% \end{macrocode}
-% Normalise the path.
+% Normalise the path and save.
% \begin{macrocode}
- \penrose_normalise_path:n {Penrose path #1}
+ \@@_normalise_path:N \l_@@_tmpa_tl
+ \tl_gclear_new:c {g_@@_side_#1_tl}
+ \tl_gset_eq:cN {g_@@_side_#1_tl} \l_@@_tmpa_tl
% \end{macrocode}
% Now create the reverse path.
% The name is the upper case version.
% \begin{macrocode}
- \tex_uppercase:D {\tl_set:Nx \l__penrose_tmpa_tl {#1}}
+ \tl_set:Nx \l_@@_tmpb_tl {\str_uppercase:n {#1}}
% \end{macrocode}
-% Clone the path.
+% Reverse the path, and relocate to the interval \([0,1]\).
% \begin{macrocode}
- \spath_clone:nn {Penrose path #1}
- {Penrose path \tl_use:N \l__penrose_tmpa_tl }
-% \end{macrocode}
-% Reverse it.
-% \begin{macrocode}
- \spath_reverse:n {Penrose path \tl_use:N \l__penrose_tmpa_tl}
-% \end{macrocode}
-% Swap the start and end.
-% \begin{macrocode}
- \spath_transform:nnnnnnn {Penrose path \tl_use:N \l__penrose_tmpa_tl}
- {-1} {0} {0} {-1} {1} {0}
+ \spath_reverse:N \l_@@_tmpa_tl
+ \spath_transform:Nnnnnnn \l_@@_tmpa_tl {-1} {0} {0} {-1} {1} {0}
+ \tl_gclear_new:c {g_@@_side_ \tl_use:N \l_@@_tmpb_tl _tl}
+ \tl_gset_eq:cN {g_@@_side_ \tl_use:N \l_@@_tmpb_tl _tl} \l_@@_tmpa_tl
}
},
+ clone~ Penrose~ side~ path/.style~ 2~ args={
+ spath/set~ name=Penrose~side,
+ spath/clone~ global={#1}{#2}
+ },
+ spath/prefix/Penrose~side/.style={
+ spath/set~ prefix=g_@@_side_,
+ },
+ spath/suffix/Penrose~side/.style={
+ spath/set~ suffix=_tl,
+ },
+ clone~ Penrose~ tile~ path/.style~ 2~ args={
+ spath/set~ name=Penrose~tile,
+ spath/clone~ global={#1}{#2}
+ },
+ spath/prefix/Penrose~tile/.style={
+ spath/set~ prefix=g_@@_tile_,
+ },
+ spath/suffix/Penrose~tile/.style={
+ spath/set~ suffix=_tl,
+ },
expand~ key/.code={
\exp_args:NV \pgfkeysalso #1
}
}
% \end{macrocode}
+% \end{macro}
%
% Create the basic tile shapes.
% \begin{macrocode}
-\MakePenroseTile {thin~ rhombus}
-\MakePenroseTile {thick~ rhombus}
-\MakePenroseTile {dart}
-\MakePenroseTile {kite}
-\MakePenroseTile {golden~ triangle}
-\MakePenroseTile {reverse~ golden~ triangle}
-\MakePenroseTile {golden~ gnomon}
-\MakePenroseTile {reverse~ golden~ gnomon}
-\MakePenroseTile {pentagon~ 5}
-\MakePenroseTile {pentagon~ 3}
-\MakePenroseTile {pentagon~ 2}
-\MakePenroseTile {pentagram}
-\MakePenroseTile {boat}
-\MakePenroseTile {diamond}
+\BakePenroseTile {thin~ rhombus}
+\BakePenroseTile {thick~ rhombus}
+\BakePenroseTile {dart}
+\BakePenroseTile {kite}
+\BakePenroseTile {golden~ triangle}
+\BakePenroseTile {reverse~ golden~ triangle}
+\BakePenroseTile {golden~ gnomon}
+\BakePenroseTile {reverse~ golden~ gnomon}
+\BakePenroseTile {pentagon~ 5}
+\BakePenroseTile {pentagon~ 3}
+\BakePenroseTile {pentagon~ 2}
+\BakePenroseTile {pentagram}
+\BakePenroseTile {boat}
+\BakePenroseTile {diamond}
+% \end{macrocode}
+%
+%
+% \subsection{User-Definable Tiles}
+%
+% The commands in this section are for enabling a user to define their own tile.
+%
+%
+% \begin{macro}[internal]{\@@_transform_side:nn}
+% Apply a transformation to make a given side lie on the x-axis.
+% First argument is the tile, second is the side.
+% \begin{macrocode}
+\cs_new_nopar:Npn \@@_transform_side:nn #1#2
+{
+% \end{macrocode}
+% Get our tile data.
+% \begin{macrocode}
+ \prop_get:NnN \g_@@_tiles_prop {#1} \l_@@_tmpa_tl
+% \end{macrocode}
+% Start with the edge list.
+%
+% Initialise the counter.
+% \begin{macrocode}
+ \int_zero:N \l_@@_tmpb_int
+ \int_incr:N \l_@@_tmpb_int
+% \end{macrocode}
+% Get the path type list.
+%
+% \begin{macrocode}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_head:N \l_@@_tmpa_tl}
+% \end{macrocode}
+%
+% Iterate through the path type list, looking for the requested path.
+% \begin{macrocode}
+ \tl_map_inline:Nn \l_@@_tmpc_tl {
+ \str_if_eq:nnT {##1} {#2} {
+ \tl_map_break:
+ }
+ \int_incr:N \l_@@_tmpb_int
+ }
+% \end{macrocode}
+% Get the coordinate list.
+% \begin{macrocode}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpa_tl}
+% \end{macrocode}
+% Strip off the outer braces.
+% \begin{macrocode}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_item:Nn \l_@@_tmpc_tl {1}}
+% \end{macrocode}
+% Add the first coordinate at the end.
+% \begin{macrocode}
+ \tl_put_right:Nx \l_@@_tmpc_tl
+ {{\tl_item:Nn \l_@@_tmpc_tl {1}}}
+% \end{macrocode}
+% Get the coordinates for this edge.
+% \begin{macrocode}
+ \tl_set:Nx \l_@@_tmpa_tl
+ {\tl_item:Nn \l_@@_tmpc_tl {\int_use:N \l_@@_tmpb_int}}
+ \tl_set:Nx \l_@@_tmpb_tl
+ {\tl_item:Nn \l_@@_tmpc_tl {\int_use:N \l_@@_tmpb_int + 1}}
+% \end{macrocode}
+% Translate second to origin.
+% \begin{macrocode}
+ \tikz_scan_point:V \l_@@_tmpb_tl
+ \dim_set_eq:Nc \l_@@_xa_dim {pgf@x}
+ \dim_set_eq:Nc \l_@@_ya_dim {pgf@y}
+% \end{macrocode}
+% Rotate and scale first to unit x-vector.
+% \begin{macrocode}
+ \tikz_scan_point:V \l_@@_tmpa_tl
+ \dim_set_eq:Nc \l_@@_xb_dim {pgf@x}
+ \dim_set_eq:Nc \l_@@_yb_dim {pgf@y}
+
+ \dim_sub:Nn \l_@@_xb_dim {\l_@@_xa_dim }
+ \dim_sub:Nn \l_@@_yb_dim {\l_@@_ya_dim }
+% \end{macrocode}
+% And normalise the vector along it.
+% \begin{macrocode}
+ \pgfpointnormalised{\pgfpoint{\l_@@_xb_dim}{\l_@@_yb_dim}}
+ \dim_set_eq:Nc \l_@@_xb_dim {pgf@x}
+ \dim_set_eq:Nc \l_@@_yb_dim {pgf@y}
+% \end{macrocode}
+% Now rotate so that the \(x\)--axis lies along the edge.
+% \begin{macrocode}
+ \pgftransformtriangle%
+ {\pgfpoint{0pt}{0pt}}%
+ {\pgfpoint{\l_@@_xb_dim}{-\l_@@_yb_dim}}
+ {\pgfpoint{\l_@@_yb_dim}{\l_@@_xb_dim}}
+
+ \pgftransformshift{\pgfpoint{-\l_@@_xa_dim}{-\l_@@_ya_dim}}
+
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\cs_generate_variant:Nn \tl_if_eq:nnT {nVT}
+\cs_generate_variant:Nn \@@_transform_side:nn {nx,nV}
+% \end{macrocode}
+%
+% \begin{macro}[internal]{\TransformAlongSide}
+% Make this available outside the \LaTeX3 environment.
+% \begin{macrocode}
+\DeclareDocumentCommand \TransformAlongSide {m m}
+{
+ \@@_transform_side:nx {#1}{#2}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\@@_coordinates_at_vertices:n}
+% This places TikZ coordinates at the vertices of the tile.
+% \begin{macrocode}
+\cs_new_nopar:Npn \@@_coordinates_at_vertices:n #1
+{
+% \end{macrocode}
+% Get our tile data
+% \begin{macrocode}
+ \prop_get:NnN \g_@@_tiles_prop {#1} \l_@@_tmpa_tl
+% \end{macrocode}
+% Start with the edge list
+% \begin{macrocode}
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_head:N \l_@@_tmpa_tl}
+% \end{macrocode}
+% Get the coordinate list
+% \begin{macrocode}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpa_tl}
+% \end{macrocode}
+% Strip off the outer braces
+% \begin{macrocode}
+ \tl_set:Nx \l_@@_tmpc_tl
+ {\tl_item:Nn \l_@@_tmpc_tl {1}}
+% \end{macrocode}
+% Add the first coordinate at the end
+% \begin{macrocode}
+ \tl_put_right:Nx \l_@@_tmpc_tl
+ {{\tl_item:Nn \l_@@_tmpc_tl {1}}}
+% \end{macrocode}
+% Get the first coordinate
+% \begin{macrocode}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_head:N \l_@@_tmpc_tl}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+% \end{macrocode}
+% Iterate through the path type list, looking for the requested path
+% \begin{macrocode}
+ \tl_map_inline:Nn \l_@@_tmpb_tl {
+ \tl_set:Nx \l_@@_tmpd_tl {
+ \exp_not:N \coordinate
+ (-edge~ ##1~ start)~ at \tl_use:N \l_@@_tmpa_tl;
+ }
+ \tl_use:N \l_@@_tmpd_tl
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_head:N \l_@@_tmpc_tl}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ \tl_set:Nx \l_@@_tmpd_tl {
+ \exp_not:N \coordinate
+ (-edge~ ##1~ end)~ at \tl_use:N \l_@@_tmpa_tl;
+ }
+ \tl_use:N \l_@@_tmpd_tl
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\CoordinatesAtVertices}
+% User-accessible wrapper around the above.
+% \begin{macrocode}
+\DeclareDocumentCommand \CoordinatesAtVertices {m}
+{
+ \@@_coordinates_at_vertices:n {#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{function}{\DefineTile}
+% This is the user function for defining a tile.
+% \begin{macrocode}
+\DeclareDocumentCommand \DefineTile { m m m }
+{
+% \end{macrocode}
+% Clear the temporary variable.
+% \begin{macrocode}
+ \tl_clear:N \l_@@_tmpa_tl
+% \end{macrocode}
+% The 3rd parameter is a list of coordinates at vertices, iterate through them and add them to the list.
+% \begin{macrocode}
+ \tl_map_inline:nn {#3} {
+ \@@_add_coordinate:w \l_@@_tmpa_tl ##1 \q_stop
+ }
+% \end{macrocode}
+% Now we make a list of the edge types (from the 2nd parameter), using a prop to keep track of whether an edge is repeated.
+% \begin{macrocode}
+ \prop_clear:N \l_@@_tmpa_prop
+ \tl_map_inline:nn {#2} {
+ \prop_if_in:NnTF \l_@@_tmpa_prop {##1}
+ {
+ \prop_put:Nnn \l_@@_tmpa_prop {##1} {1}
+ }
+ {
+ \prop_put:Nnn \l_@@_tmpa_prop {##1} {0}
+ }
+ }
+% \end{macrocode}
+% Having established their multiplicity, we now create the edges with their names, appending numbers to their names if used more than once.
+% \begin{macrocode}
+ \tl_clear:N \l_@@_tmpb_tl
+ \tl_map_inline:nn {#2}
+ {
+ \tl_clear:N \l_@@_tmpc_tl
+ \tl_put_right:Nn \l_@@_tmpc_tl {##1}
+ \int_compare:nF {\prop_item:Nn \l_@@_tmpa_prop {##1} == 0} {
+ \tl_put_right:Nx \l_@@_tmpc_tl
+ {\prop_item:Nn \l_@@_tmpa_prop {##1}}
+ \prop_put:Nnx \l_@@_tmpa_prop {##1}
+ {\int_eval:n {\prop_item:Nn \l_@@_tmpa_prop {##1} + 1}}
+ }
+ \tl_put_right:Nx \l_@@_tmpb_tl {{ \l_@@_tmpc_tl }}
+ }
+% \end{macrocode}
+% Finally, we can create our tile and add it to the global tile prop.
+% \begin{macrocode}
+ \prop_gput:Nnx \g_@@_tiles_prop {#1}
+ {{\tl_use:N \l_@@_tmpb_tl} {\tl_use:N \l_@@_tmpa_tl}}
+% \end{macrocode}
+% Having created the tile, we make a TikZ pic to place it on the page.
+% \begin{macrocode}
+ \tikzset{
+ #1/.pic={
+ \begin{scope}
+% \end{macrocode}
+% Were we given a tile to align ourselves against?
+% \begin{macrocode}
+ \pgfkeysgetvalue{/tikz/Penrose/alignment~ location}{\prloc}
+ \ifx\prloc\pgfutil@empty
+ \else
+% \end{macrocode}
+% Yes, we were.
+% So we adjust our position accordingly.
+% The first job is to transform so that we're along the edge of the receiving tile.
+% \begin{macrocode}
+ \begingroup
+% \end{macrocode}
+% We get the locations of the start and end of the receiving tile.
+% As \Verb+pic+ sets the node prefix, we have to temporarily suspend that (hence working in a group).
+% \begin{macrocode}
+ \tikzset{name~ prefix~ ..}%
+ \tikz@scan@one@point\pgfutil@firstofone%
+ (\prloc-edge~ \pgfkeysvalueof{/tikz/Penrose/alignment~ edge}~ start)%
+ \global\pgf@xa=\pgf@x
+ \global\pgf@ya=\pgf@y
+ \tikz@scan@one@point\pgfutil@firstofone%
+ (\prloc-edge~ \pgfkeysvalueof{/tikz/Penrose/alignment~ edge}~ end)%
+ \global\pgf@xb=\pgf@x
+ \global\pgf@yb=\pgf@y
+ \endgroup
+% \end{macrocode}
+% We store the initial points in \Verb+\pgf@xa+ and \Verb+\pgf@ya+ but we want \Verb+\pgf@xb+ and \Verb+\pgf@yb+ to be a vector along the edge.
+% \begin{macrocode}
+ \advance\pgf@xb by -\pgf@xa
+ \advance\pgf@yb by -\pgf@ya
+% \end{macrocode}
+% We shift to the start of the edge.
+% \begin{macrocode}
+ \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}%
+% \end{macrocode}
+% And normalise the vector along it.
+% \begin{macrocode}
+ \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}}
+ \pgf@xb=\pgf@x
+ \pgf@yb=\pgf@y
+% \end{macrocode}
+% Now rotate so that the \(x\)--axis lies along the edge.
+% \begin{macrocode}
+ \pgftransformtriangle%
+ {\pgfpoint{0pt}{0pt}}%
+ {\pgfpoint{\pgf@xb}{\pgf@yb}}%
+ {\pgfpoint{-\pgf@yb}{\pgf@xb}}
+% \end{macrocode}
+% The next job is to shift and rotate the current tile so that the correct edge ends up against the receiving tile.
+% \begin{macrocode}
+ \str_set:Nx \l_@@_tmpa_str
+ {\pgfkeysvalueof{/tikz/Penrose/alignment~ edge}}
+ \str_set:Nx \l_@@_tmpa_str {\str_head:N \l_@@_tmpa_str}
+ \str_put_right:Nx \l_@@_tmpa_str
+ {\pgfkeysvalueof{/tikz/Penrose/alignment~ new~ edge}}
+ \str_set:Nx \l_@@_tmpb_str {\str_lowercase:f { \l_@@_tmpa_str}}
+ \str_if_eq:NNT \l_@@_tmpa_str \l_@@_tmpb_str
+ {
+ \str_set:Nx \l_@@_tmpb_str
+ {\str_uppercase:f { \l_@@_tmpa_str}}
+ }
+
+ \@@_transform_side:nV {#1} \l_@@_tmpb_str
+ \fi
% \end{macrocode}
+% Now that the transformation is finalised, we can render the tile.
+% We clip against the tile path so that the tiles don't ``bleed''.
+% If we didn't do this, drawing the tile would result in overlaps which can look a bit ugly.
+% On the other hand, tight clipping can lead to ``gaps'' between the tiles so we make this optional by enclosing it in a style.
+% \begin{macrocode}
+ \UsePenroseTile[
+ every~ Penrose~ tile~ clip/.try,
+ every~ #1~ clip/.try
+ ]{#1}
+ \UsePenroseTile[
+ every~ Penrose~ tile/.try,
+ every~ #1/.try,
+ pic~ actions
+ ]{#1}
+% Lastly, we put coordinates at each vertex, labelled by which edge they are.
+% \begin{macrocode}
+ \@@_coordinates_at_vertices:n {#1}
+ \end{scope}
+ },
+% \end{macrocode}
+% This is a shortcut for installing the \Verb+pic+ type.
+% \begin{macrocode}
+ #1/.style={
+ every~ Penrose~ pic/.try,
+ pic~ type=#1,
+ },
+ }
+}
+% \end{macrocode}
+% \end{function}
+%
%
% \subsection{Lindenmayer System}
%
@@ -735,32 +1134,32 @@ and the derived files penrose.ins
%
% These are the rules for generating rhombus tilings.
% \begin{macrocode}
-\prop_new:N \g__penrose_rhombus_lms_rule_prop
-\prop_put:Nnn \g__penrose_rhombus_lms_rule_prop {T} {[f*sT][f>g]}
-\prop_put:Nnn \g__penrose_rhombus_lms_rule_prop {t} {[f_st][f>G]}
-\prop_put:Nnn \g__penrose_rhombus_lms_rule_prop {G} {[f+sG][sf>g][sf*sT]}
-\prop_put:Nnn \g__penrose_rhombus_lms_rule_prop {g} {[f-sg][sf>G][sf_st]}
+\prop_new:N \g_@@_rhombus_lms_rule_prop
+\prop_gput:Nnn \g_@@_rhombus_lms_rule_prop {T} {[f*sT][f>g]}
+\prop_gput:Nnn \g_@@_rhombus_lms_rule_prop {t} {[f_st][f>G]}
+\prop_gput:Nnn \g_@@_rhombus_lms_rule_prop {G} {[f+sG][sf>g][sf*sT]}
+\prop_gput:Nnn \g_@@_rhombus_lms_rule_prop {g} {[f-sg][sf>G][sf_st]}
% \end{macrocode}
%
% These are the rules for generating kite and dart tilings.
% \begin{macrocode}
-\prop_new:N \g__penrose_kite_lms_rule_prop
-\prop_put:Nnn \g__penrose_kite_lms_rule_prop {T} {[f*sT][f>st][+sg]}
-\prop_put:Nnn \g__penrose_kite_lms_rule_prop {t} {[f_st][f>sT][-sG]}
-\prop_put:Nnn \g__penrose_kite_lms_rule_prop {G} {[f*+sG][sT]}
-\prop_put:Nnn \g__penrose_kite_lms_rule_prop {g} {[f-_sg][st]}
+\prop_new:N \g_@@_kite_lms_rule_prop
+\prop_gput:Nnn \g_@@_kite_lms_rule_prop {T} {[f*sT][f>st][+sg]}
+\prop_gput:Nnn \g_@@_kite_lms_rule_prop {t} {[f_st][f>sT][-sG]}
+\prop_gput:Nnn \g_@@_kite_lms_rule_prop {G} {[f*+sG][sT]}
+\prop_gput:Nnn \g_@@_kite_lms_rule_prop {g} {[f-_sg][st]}
% \end{macrocode}
%
% These are the rules for generating pentagon tilings.
% \begin{macrocode}
-\prop_new:N \g__penrose_pentagon_lms_rule_prop
-\prop_put:Nnn \g__penrose_pentagon_lms_rule_prop {P}
+\prop_new:N \g_@@_pentagon_lms_rule_prop
+\prop_gput:Nnn \g_@@_pentagon_lms_rule_prop {P}
{[s>P][1sF+Q][1+sF+Q][1*sF+Q][1-sF+Q][1_sF+Q]} % pentagon 5
-\prop_put:Nnn \g__penrose_pentagon_lms_rule_prop {Q}
+\prop_gput:Nnn \g_@@_pentagon_lms_rule_prop {Q}
{[s>P][1+sFR][1*sF*R][1-sF+Q][1_sF+Q][1sF+Q][->fsD]} % pentagon 3
-\prop_put:Nnn \g__penrose_pentagon_lms_rule_prop {R}
+\prop_gput:Nnn \g_@@_pentagon_lms_rule_prop {R}
{[s>P][1-sF+Q][1+sF*R][1*sFR][1_sF*R][1sFR][_>fsD][>fsD]} % pentagon 2
-\prop_put:Nnn \g__penrose_pentagon_lms_rule_prop {G}
+\prop_gput:Nnn \g_@@_pentagon_lms_rule_prop {G}
{
[s>G]
[se[>d+R][e1B]]
@@ -769,103 +1168,103 @@ and the derived files penrose.ins
[*se[>d+R][e1B]]
[_se[>d+R][e1B]]
} % pentagram
-\prop_put:Nnn \g__penrose_pentagon_lms_rule_prop {B}
+\prop_gput:Nnn \g_@@_pentagon_lms_rule_prop {B}
{
[s>G]
[se[>d+R][e1B]]
[+se[>d+R][e1B]]
[-se[>d+R][e1B]]
} % boat
-\prop_put:Nnn \g__penrose_pentagon_lms_rule_prop {D}
+\prop_gput:Nnn \g_@@_pentagon_lms_rule_prop {D}
{[s>d+R][s>eG][se1B]} % diamond
% \end{macrocode}
%
% Each of the standard tilings can also be drawn using triangles using the same rules.
% \begin{macrocode}
-\prop_set_eq:NN \g__penrose_rtriangle_lms_rule_prop
-\g__penrose_rhombus_lms_rule_prop
-\prop_set_eq:NN \g__penrose_ktriangle_lms_rule_prop
-\g__penrose_kite_lms_rule_prop
+\prop_gset_eq:NN \g_@@_rtriangle_lms_rule_prop
+\g_@@_rhombus_lms_rule_prop
+\prop_gset_eq:NN \g_@@_ktriangle_lms_rule_prop
+\g_@@_kite_lms_rule_prop
% \end{macrocode}
%
% These hold the various actions.
% \begin{macrocode}
-\prop_new:N \g__penrose_default_lms_action_prop
-\prop_new:N \g__penrose_rhombus_lms_action_prop
-\prop_new:N \g__penrose_kite_lms_action_prop
-\prop_new:N \g__penrose_rtriangle_lms_action_prop
-\prop_new:N \g__penrose_ktriangle_lms_action_prop
-\prop_new:N \g__penrose_pentagon_lms_action_prop
+\prop_new:N \g_@@_default_lms_action_prop
+\prop_new:N \g_@@_rhombus_lms_action_prop
+\prop_new:N \g_@@_kite_lms_action_prop
+\prop_new:N \g_@@_rtriangle_lms_action_prop
+\prop_new:N \g_@@_ktriangle_lms_action_prop
+\prop_new:N \g_@@_pentagon_lms_action_prop
% \end{macrocode}
%
% We need some parameters.
% \begin{macrocode}
-\dim_new:N \l__penrose_step_dim
-\dim_set:Nn \l__penrose_step_dim {1cm}
+\dim_new:N \l_@@_step_dim
+\dim_set:Nn \l_@@_step_dim {1cm}
% \end{macrocode}
%
% These are the defaults, which will be used in all the rule sets.
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_default_lms_action_prop {[} {\group_begin:}
-\prop_put:Nnn \g__penrose_default_lms_action_prop {]} {\group_end:}
-\prop_put:Nnn \g__penrose_default_lms_action_prop {f}
-{\pgftransformxshift{\l__penrose_step_dim}}
-\prop_put:Nnn \g__penrose_default_lms_action_prop {s} {
- \fp_set:Nn \l__penrose_tmpa_fp { 2 * sind(18) * \l__penrose_step_dim }
- \dim_set:Nn \l__penrose_step_dim {\fp_to_dim:N \l__penrose_tmpa_fp}
+\prop_gput:Nnn \g_@@_default_lms_action_prop {[} {\group_begin:}
+\prop_gput:Nnn \g_@@_default_lms_action_prop {]} {\group_end:}
+\prop_gput:Nnn \g_@@_default_lms_action_prop {f}
+{\pgftransformxshift{\l_@@_step_dim}}
+\prop_gput:Nnn \g_@@_default_lms_action_prop {s} {
+ \fp_set:Nn \l_@@_tmpa_fp { 2 * sind(18) * \l_@@_step_dim }
+ \dim_set:Nn \l_@@_step_dim {\fp_to_dim:N \l_@@_tmpa_fp}
}
% \end{macrocode}
%
% The rhombus rules need a variety of turns.
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_rhombus_lms_action_prop {+}
+\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {+}
{\pgftransformrotate{144}}
-\prop_put:Nnn \g__penrose_rhombus_lms_action_prop {*}
+\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {*}
{\pgftransformrotate{108}}
-\prop_put:Nnn \g__penrose_rhombus_lms_action_prop {-}
+\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {-}
{\pgftransformrotate{216}}
-\prop_put:Nnn \g__penrose_rhombus_lms_action_prop {_}
+\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {_}
{\pgftransformrotate{252}}
-\prop_put:Nnn \g__penrose_rhombus_lms_action_prop {>}
+\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {>}
{\pgftransformrotate{180}}
% \end{macrocode}
%
% Up to now, the actions for the rhombus and its triangle replacement are the same.
% \begin{macrocode}
-\prop_set_eq:NN \g__penrose_rtriangle_lms_action_prop
-\g__penrose_rhombus_lms_action_prop
+\prop_gset_eq:NN \g_@@_rtriangle_lms_action_prop
+\g_@@_rhombus_lms_action_prop
% \end{macrocode}
%
% Now we do the actions that actually draw something.
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_rhombus_lms_action_prop {T} {
+\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {T} {
\group_begin:
% \end{macrocode}
% As we go through, we keep track of how many tiles we've drawn.
% \begin{macrocode}
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
% \end{macrocode}
% Set up the position, size, and angle correctly.
% \begin{macrocode}
\pgftransformrotate{198}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim*2*cosd(18)}
- \pgftransformxshift{-\fp_to_dim:N \l__penrose_tmpa_fp}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*2*cosd(18)}
+ \pgftransformxshift{-\fp_to_dim:N \l_@@_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
% \end{macrocode}
% Now we draw the thin rhombus, applying every style we can possibly imagine.
% The \Verb+Penrose tile+ style gets the current tile and total tile numbers passed to it.
% \begin{macrocode}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ thin~ rhombus/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{thin~rhombus}
\group_end:
}
@@ -873,21 +1272,21 @@ and the derived files penrose.ins
%
% Same for the thick rhombus.
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_rhombus_lms_action_prop {G} {
+\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {G} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)/(2*cosd(36))}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \int_gincr:N \g_@@_tile_int
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)/(2*cosd(36))}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ thick~ rhombus/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{thick~rhombus}
\group_end:
}
@@ -895,59 +1294,59 @@ and the derived files penrose.ins
%
% Now we do the same for the kite and dart tiling.
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_kite_lms_action_prop {+} {\pgftransformrotate{36}}
-\prop_put:Nnn \g__penrose_kite_lms_action_prop {*} {\pgftransformrotate{108}}
-\prop_put:Nnn \g__penrose_kite_lms_action_prop {-} {\pgftransformrotate{-36}}
-\prop_put:Nnn \g__penrose_kite_lms_action_prop {_}
+\prop_gput:Nnn \g_@@_kite_lms_action_prop {+} {\pgftransformrotate{36}}
+\prop_gput:Nnn \g_@@_kite_lms_action_prop {*} {\pgftransformrotate{108}}
+\prop_gput:Nnn \g_@@_kite_lms_action_prop {-} {\pgftransformrotate{-36}}
+\prop_gput:Nnn \g_@@_kite_lms_action_prop {_}
{\pgftransformrotate{-108}}
-\prop_put:Nnn \g__penrose_kite_lms_action_prop {>} {\pgftransformrotate{180}}
+\prop_gput:Nnn \g_@@_kite_lms_action_prop {>} {\pgftransformrotate{180}}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_set_eq:NN \g__penrose_ktriangle_lms_action_prop
-\g__penrose_kite_lms_action_prop
+\prop_gset_eq:NN \g_@@_ktriangle_lms_action_prop
+\g_@@_kite_lms_action_prop
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_kite_lms_action_prop {T} {
+\prop_gput:Nnn \g_@@_kite_lms_action_prop {T} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
\pgftransformrotate{36}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ kite/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{kite}
\group_end:
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_kite_lms_action_prop {g} {
+\prop_gput:Nnn \g_@@_kite_lms_action_prop {g} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
\pgftransformrotate{144}
- \pgftransformxshift{-\l__penrose_step_dim * 2 * sin(18)}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \pgftransformxshift{-\l_@@_step_dim * 2 * sin(18)}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ dart/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{dart}
\group_end:
}
@@ -955,185 +1354,185 @@ and the derived files penrose.ins
%
% Now we set up the actions for the triangle variations.
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_rtriangle_lms_action_prop {T} {
+\prop_gput:Nnn \g_@@_rtriangle_lms_action_prop {T} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
\pgftransformrotate{18}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ reverse~ golden~ triangle/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{reverse~ golden~ triangle}
\group_end:
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_rtriangle_lms_action_prop {t} {
+\prop_gput:Nnn \g_@@_rtriangle_lms_action_prop {t} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
\pgftransformrotate{-18}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ golden~ triangle/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{golden~ triangle}
\group_end:
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_rtriangle_lms_action_prop {G} {
+\prop_gput:Nnn \g_@@_rtriangle_lms_action_prop {G} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
\pgftransformrotate{180}
- \pgftransformxshift{-\l__penrose_step_dim}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)/(2*cosd(36))}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \pgftransformxshift{-\l_@@_step_dim}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)/(2*cosd(36))}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ reverse~ golden~ gnomon/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{reverse~ golden~ gnomon}
\group_end:
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_rtriangle_lms_action_prop {g} {
+\prop_gput:Nnn \g_@@_rtriangle_lms_action_prop {g} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
\pgftransformrotate{180}
- \pgftransformxshift{-\l__penrose_step_dim}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)/(2*cosd(36))}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \pgftransformxshift{-\l_@@_step_dim}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)/(2*cosd(36))}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ golden~ gnomon/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{golden~ gnomon}
\group_end:
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_ktriangle_lms_action_prop {T} {
+\prop_gput:Nnn \g_@@_ktriangle_lms_action_prop {T} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
\pgftransformrotate{18}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ reverse~ golden~ triangle/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{reverse~ golden~ triangle}
\group_end:
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_ktriangle_lms_action_prop {t} {
+\prop_gput:Nnn \g_@@_ktriangle_lms_action_prop {t} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
\pgftransformrotate{-18}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ golden~ triangle/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{golden~ triangle}
\group_end:
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_ktriangle_lms_action_prop {G} {
+\prop_gput:Nnn \g_@@_ktriangle_lms_action_prop {G} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
\pgftransformrotate{180}
- \pgftransformxshift{-\l__penrose_step_dim}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)/(2*cosd(36))}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \pgftransformxshift{-\l_@@_step_dim}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)/(2*cosd(36))}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ reverse~ golden~ gnomon/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{reverse~ golden~ gnomon}
\group_end:
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_ktriangle_lms_action_prop {g} {
+\prop_gput:Nnn \g_@@_ktriangle_lms_action_prop {g} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
\pgftransformrotate{180}
- \pgftransformxshift{-\l__penrose_step_dim}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)/(2*cosd(36))}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \pgftransformxshift{-\l_@@_step_dim}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)/(2*cosd(36))}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ golden~ gnomon/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{golden~ gnomon}
\group_end:
}
@@ -1143,239 +1542,239 @@ and the derived files penrose.ins
%
% The rules need a variety of turns.
% \begin{macrocode}
-\int_new:N \l__penrose_pentagon_parity_int
-\seq_new:N \l__penrose_pentagon_parity_seq
-\seq_set_from_clist:Nn \l__penrose_pentagon_parity_seq {odd,even}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {1} {
- \int_set:Nn \l__penrose_pentagon_parity_int
- {3 - \l__penrose_pentagon_parity_int}
+\int_new:N \l_@@_pentagon_parity_int
+\seq_new:N \l_@@_pentagon_parity_seq
+\seq_set_from_clist:Nn \l_@@_pentagon_parity_seq {odd,even}
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {1} {
+ \int_set:Nn \l_@@_pentagon_parity_int
+ {3 - \l_@@_pentagon_parity_int}
}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {+}
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {+}
{\pgftransformrotate{72}}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {*}
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {*}
{\pgftransformrotate{144}}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {-}
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {-}
{\pgftransformrotate{288}}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {_}
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {_}
{\pgftransformrotate{216}}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {>}
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {>}
{\pgftransformrotate{180}}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {|}
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {|}
{\pgftransformxscale{-1}}
% \end{macrocode}
% The scale factor is different.
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {s} {
- \fp_set:Nn \l__penrose_tmpa_fp
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {s} {
+ \fp_set:Nn \l_@@_tmpa_fp
{
- 1/(2 + 2 * cosd(72) ) * \l__penrose_step_dim
+ 1/(2 + 2 * cosd(72) ) * \l_@@_step_dim
}
- \dim_set:Nn \l__penrose_step_dim {\fp_to_dim:N \l__penrose_tmpa_fp}
+ \dim_set:Nn \l_@@_step_dim {\fp_to_dim:N \l_@@_tmpa_fp}
}
% \end{macrocode}
% And we tend to work better vertically.
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {f} {
- \fp_set:Nn \l__penrose_tmpa_fp { tand(54)/2 * \l__penrose_step_dim }
- \pgftransformyshift{\fp_to_dim:N \l__penrose_tmpa_fp}
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {f} {
+ \fp_set:Nn \l_@@_tmpa_fp { tand(54)/2 * \l_@@_step_dim }
+ \pgftransformyshift{\fp_to_dim:N \l_@@_tmpa_fp}
}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {F} {
- \fp_set:Nn \l__penrose_tmpa_fp { tand(54) * \l__penrose_step_dim }
- \pgftransformyshift{\fp_to_dim:N \l__penrose_tmpa_fp}
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {F} {
+ \fp_set:Nn \l_@@_tmpa_fp { tand(54) * \l_@@_step_dim }
+ \pgftransformyshift{\fp_to_dim:N \l_@@_tmpa_fp}
}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {d} {
- \fp_set:Nn \l__penrose_tmpa_fp
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {d} {
+ \fp_set:Nn \l_@@_tmpa_fp
{
- (tand(54)/2 - tand(72)/2 + sind(36) ) * \l__penrose_step_dim
+ (tand(54)/2 - tand(72)/2 + sind(36) ) * \l_@@_step_dim
}
- \pgftransformyshift{\fp_to_dim:N \l__penrose_tmpa_fp}
+ \pgftransformyshift{\fp_to_dim:N \l_@@_tmpa_fp}
}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {e} {
- \fp_set:Nn \l__penrose_tmpa_fp
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {e} {
+ \fp_set:Nn \l_@@_tmpa_fp
{
- tand(54) * cosd(36) * \l__penrose_step_dim
+ tand(54) * cosd(36) * \l_@@_step_dim
}
- \pgftransformyshift{\fp_to_dim:N \l__penrose_tmpa_fp}
+ \pgftransformyshift{\fp_to_dim:N \l_@@_tmpa_fp}
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {P} {
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {P} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/2}
- \pgftransformxshift{-\fp_to_dim:N \l__penrose_tmpa_fp}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim*tand(54)/2}
- \pgftransformyshift{-\fp_to_dim:N \l__penrose_tmpa_fp}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \int_gincr:N \g_@@_tile_int
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/2}
+ \pgftransformxshift{-\fp_to_dim:N \l_@@_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*tand(54)/2}
+ \pgftransformyshift{-\fp_to_dim:N \l_@@_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ pentagon/.try,
every~
- \seq_item:Nn \l__penrose_pentagon_parity_seq
- {\l__penrose_pentagon_parity_int}
+ \seq_item:Nn \l_@@_pentagon_parity_seq
+ {\l_@@_pentagon_parity_int}
\space pentagon/.try,
every~ pentagon~ 5/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{pentagon~5}
\group_end:
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {Q} {
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {Q} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/2}
- \pgftransformxshift{-\fp_to_dim:N \l__penrose_tmpa_fp}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim*tand(54)/2}
- \pgftransformyshift{-\fp_to_dim:N \l__penrose_tmpa_fp}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \int_gincr:N \g_@@_tile_int
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/2}
+ \pgftransformxshift{-\fp_to_dim:N \l_@@_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*tand(54)/2}
+ \pgftransformyshift{-\fp_to_dim:N \l_@@_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ pentagon/.try,
every~
- \seq_item:Nn \l__penrose_pentagon_parity_seq
- {\l__penrose_pentagon_parity_int}
+ \seq_item:Nn \l_@@_pentagon_parity_seq
+ {\l_@@_pentagon_parity_int}
\space pentagon/.try,
every~ pentagon~ 3/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{pentagon~3}
\group_end:
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {R} {
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {R} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/2}
- \pgftransformxshift{-\fp_to_dim:N \l__penrose_tmpa_fp}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim*tand(54)/2}
- \pgftransformyshift{-\fp_to_dim:N \l__penrose_tmpa_fp}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \int_gincr:N \g_@@_tile_int
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/2}
+ \pgftransformxshift{-\fp_to_dim:N \l_@@_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*tand(54)/2}
+ \pgftransformyshift{-\fp_to_dim:N \l_@@_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ pentagon/.try,
every~
- \seq_item:Nn \l__penrose_pentagon_parity_seq
- {\l__penrose_pentagon_parity_int}
+ \seq_item:Nn \l_@@_pentagon_parity_seq
+ {\l_@@_pentagon_parity_int}
\space pentagon/.try,
every~ pentagon~ 2/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{pentagon~2}
\group_end:
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {G} {
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {G} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
% \pgftransformrotate{198}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim*cosd(72)}
- \pgftransformxshift{\fp_to_dim:N \l__penrose_tmpa_fp}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim*tand(54)*cosd(72)}
- \pgftransformyshift{\fp_to_dim:N \l__penrose_tmpa_fp}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*cosd(72)}
+ \pgftransformxshift{\fp_to_dim:N \l_@@_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*tand(54)*cosd(72)}
+ \pgftransformyshift{\fp_to_dim:N \l_@@_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ pentagram/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{pentagram}
\group_end:
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {B} {
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {B} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
% \pgftransformrotate{198}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim*cosd(72)}
- \pgftransformxshift{\fp_to_dim:N \l__penrose_tmpa_fp}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim*tand(54)*cosd(72)}
- \pgftransformyshift{\fp_to_dim:N \l__penrose_tmpa_fp}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*cosd(72)}
+ \pgftransformxshift{\fp_to_dim:N \l_@@_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*tand(54)*cosd(72)}
+ \pgftransformyshift{\fp_to_dim:N \l_@@_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ boat/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{boat}
\group_end:
}
% \end{macrocode}
%
% \begin{macrocode}
-\prop_put:Nnn \g__penrose_pentagon_lms_action_prop {D} {
+\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {D} {
\group_begin:
- \int_gincr:N \l__penrose_tile_int
+ \int_gincr:N \g_@@_tile_int
\pgftransformrotate{90}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim*cosd(18)}
- \pgftransformxshift{-\fp_to_dim:N \l__penrose_tmpa_fp}
- \fp_set:Nn \l__penrose_tmpa_fp {\l__penrose_step_dim/(1cm)}
- \pgftransformscale{\fp_use:N \l__penrose_tmpa_fp}
- \tl_set:Nx \l__penrose_tmpc_tl
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*cosd(18)}
+ \pgftransformxshift{-\fp_to_dim:N \l_@@_tmpa_fp}
+ \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)}
+ \pgftransformscale{\fp_use:N \l_@@_tmpa_fp}
+ \tl_set:Nx \l_@@_tmpc_tl
{
- {\int_use:N \l__penrose_tile_int}
- {\int_use:N \l__penrose_tiles_int}
+ {\int_use:N \g_@@_tile_int}
+ {\int_use:N \g_@@_tiles_int}
}
\UsePenroseTile[
every~ Penrose~ tile/.try,
every~ diamond/.try,
- Penrose~ tile~ \int_use:N \l__penrose_tile_int/.try,
- Penrose~ tile/.try/.expand~ once=\l__penrose_tmpc_tl
+ Penrose~ tile~ \int_use:N \g_@@_tile_int/.try,
+ Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl
]{diamond}
\group_end:
}
% \end{macrocode}
%
-% \begin{macro}[internal]{\penrose_make_lms:Nnnn}
+% \begin{macro}[internal]{\@@_make_lms:Nnnn}
% This creates the token list of actions, starting with the seed.
% The arguments are: a token list to store the result in, the name of the system, the number of iterations, and the initial state.
% \begin{macrocode}
-\cs_new_nopar:Npn \penrose_make_lms:Nnnn #1#2#3#4
+\cs_new_nopar:Npn \@@_make_lms:Nnnn #1#2#3#4
{
\group_begin:
% \end{macrocode}
% On the first time round, we start with the given seed.
% \begin{macrocode}
- \tl_set:Nn \l__penrose_tmpb_tl {#4}
+ \tl_set:Nn \l_@@_tmpb_tl {#4}
% \end{macrocode}
% We repeat the specified number of times.
% \begin{macrocode}
@@ -1383,50 +1782,50 @@ and the derived files penrose.ins
% \end{macrocode}
% Duplicate the current state.
% \begin{macrocode}
- \tl_set_eq:NN \l__penrose_tmpa_tl \l__penrose_tmpb_tl
+ \tl_set_eq:NN \l_@@_tmpa_tl \l_@@_tmpb_tl
% \end{macrocode}
% Clear the receiving token list.
% \begin{macrocode}
- \tl_clear:N \l__penrose_tmpb_tl
+ \tl_clear:N \l_@@_tmpb_tl
% \end{macrocode}
% Walk through the current list, appending to the receiving list according to the rules.
% \begin{macrocode}
- \tl_map_inline:Nn \l__penrose_tmpa_tl
+ \tl_map_inline:Nn \l_@@_tmpa_tl
{
% \end{macrocode}
% If a rule exists, copy that.
% \begin{macrocode}
- \prop_if_in:cnTF {g__penrose_#2_lms_rule_prop} {##1}
+ \prop_if_in:cnTF {g_@@_#2_lms_rule_prop} {##1}
{
- \tl_put_right:Nx \l__penrose_tmpb_tl
- {\prop_item:cn {g__penrose_#2_lms_rule_prop} {##1} }
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {\prop_item:cn {g_@@_#2_lms_rule_prop} {##1} }
}
{
% \end{macrocode}
% Otherwise, just copy the token.
% \begin{macrocode}
- \tl_put_right:Nn \l__penrose_tmpb_tl {##1}
+ \tl_put_right:Nn \l_@@_tmpb_tl {##1}
}
}
}
% \end{macrocode}
% We've done all this inside a group, now pass the result outside.
% \begin{macrocode}
- \tl_set:Nn \l__penrose_tmpa_tl {
+ \tl_set:Nn \l_@@_tmpa_tl {
\group_end:
\tl_set:Nn #1
}
- \tl_put_right:Nx \l__penrose_tmpa_tl {{\tl_use:N \l__penrose_tmpb_tl}}
- \tl_use:N \l__penrose_tmpa_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl {{\tl_use:N \l_@@_tmpb_tl}}
+ \tl_use:N \l_@@_tmpa_tl
}
-\cs_generate_variant:Nn \penrose_make_lms:Nnnn {Nnnx}
+\cs_generate_variant:Nn \@@_make_lms:Nnnn {Nnnx}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[internal]{\penrose_invoke_lms:Nn}
+% \begin{macro}[internal]{\@@_invoke_lms:Nn}
% This carries out the actions specified by the resulting rules.
% \begin{macrocode}
-\cs_new_nopar:Npn \penrose_invoke_lms:Nn #1#2
+\cs_new_nopar:Npn \@@_invoke_lms:Nn #1#2
{
\group_begin:
% \end{macrocode}
@@ -1435,14 +1834,14 @@ and the derived files penrose.ins
% Otherwise, just do nothing.
% \begin{macrocode}
\tl_map_inline:Nn #1 {
- \prop_if_in:cnTF {g__penrose_#2_lms_action_prop} {##1}
+ \prop_if_in:cnTF {g_@@_#2_lms_action_prop} {##1}
{
- \prop_item:cn {g__penrose_#2_lms_action_prop} {##1}
+ \prop_item:cn {g_@@_#2_lms_action_prop} {##1}
}
{
- \prop_if_in:cnT {g__penrose_default_lms_action_prop} {##1}
+ \prop_if_in:cnT {g_@@_default_lms_action_prop} {##1}
{
- \prop_item:cn {g__penrose_default_lms_action_prop} {##1}
+ \prop_item:cn {g_@@_default_lms_action_prop} {##1}
}
}
}
@@ -1453,11 +1852,11 @@ and the derived files penrose.ins
%
% We keep track of the number of tiles.
% \begin{macrocode}
-\int_new:N \l__penrose_tile_int
-\int_new:N \l__penrose_tiles_int
+\int_new:N \g_@@_tile_int
+\int_new:N \g_@@_tiles_int
% \end{macrocode}
%
-% \begin{macro}[internal]{\PenroseDecomposition}
+% \begin{function}{\PenroseDecomposition}
% This is the user macro to invoke the decomposition.
% The arguments are: optional styles, the name, number of iterations, and starting seed.
% \begin{macrocode}
@@ -1465,39 +1864,39 @@ and the derived files penrose.ins
{
\group_begin:
\tikzset{#1}
- \penrose_make_lms:Nnnx \l__penrose_tmpa_tl {#2} {#3} {#4}
- \penrose_count_lms:N \l__penrose_tmpa_tl
- \int_gzero:N \l__penrose_tile_int
- \int_gset:Nn \l__penrose_pentagon_parity_int {2}
- \penrose_invoke_lms:Nn \l__penrose_tmpa_tl {#2}
+ \@@_make_lms:Nnnx \l_@@_tmpa_tl {#2} {#3} {#4}
+ \@@_count_lms:N \l_@@_tmpa_tl
+ \int_gzero:N \g_@@_tile_int
+ \int_set:Nn \l_@@_pentagon_parity_int {2}
+ \@@_invoke_lms:Nn \l_@@_tmpa_tl {#2}
\group_end:
}
% \end{macrocode}
-% \end{macro}
+% \end{function}
%
-% \begin{macro}[internal]{\penrose_count_lms:N}
+% \begin{macro}[internal]{\@@_count_lms:N}
% This counts the number of tiles in the string.
% \begin{macrocode}
-\cs_new_nopar:Npn \penrose_count_lms:N #1
+\cs_new_nopar:Npn \@@_count_lms:N #1
{
- \int_gzero:N \l__penrose_tiles_int
+ \int_gzero:N \g_@@_tiles_int
\tl_map_inline:Nn #1
{
\tl_if_eq:nnT {##1} {T}
{
- \int_incr:N \l__penrose_tiles_int
+ \int_gincr:N \g_@@_tiles_int
}
\tl_if_eq:nnT {##1} {t}
{
- \int_incr:N \l__penrose_tiles_int
+ \int_gincr:N \g_@@_tiles_int
}
\tl_if_eq:nnT {##1} {G}
{
- \int_incr:N \l__penrose_tiles_int
+ \int_gincr:N \g_@@_tiles_int
}
\tl_if_eq:nnT {##1} {g}
{
- \int_incr:N \l__penrose_tiles_int
+ \int_gincr:N \g_@@_tiles_int
}
}
}
@@ -1508,7 +1907,7 @@ and the derived files penrose.ins
% \begin{macrocode}
\tikzset{
Penrose~ step/.code={
- \dim_set:Nn \l__penrose_step_dim {#1}
+ \dim_set:Nn \l_@@_step_dim {#1}
}
}
% \end{macrocode}
@@ -2717,8 +3116,11 @@ and the derived files penrose.ins
}
% \end{macrocode}
%
-% \iffalse
-%</library>
-% \fi
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
%\Finale
\endinput
diff --git a/Master/texmf-dist/source/latex/penrose/penrose.ins b/Master/texmf-dist/source/latex/penrose/penrose_code.ins
index 328a9328594..07f02d18a9a 100644
--- a/Master/texmf-dist/source/latex/penrose/penrose.ins
+++ b/Master/texmf-dist/source/latex/penrose/penrose_code.ins
@@ -1,10 +1,10 @@
%%
-%% This is file `penrose.ins',
+%% This is file `penrose_code.ins',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
-%% penrose.dtx (with options: `install')
+%% penrose_code.dtx (with options: `install')
%% ----------------------------------------------------------------
%% penrose --- TikZ library for producing Penrose tilings
%% E-mail: loopspace@mathforge.org
@@ -12,7 +12,7 @@
%% See http://www.latex-project.org/lppl.txt
%% ----------------------------------------------------------------
%%
-\input docstrip.tex
+\input l3docstrip.tex
\keepsilent
\askforoverwritefalse
\preamble
@@ -26,7 +26,7 @@ See http://www.latex-project.org/lppl.txt
\endpreamble
\postamble
-Copyright (C) 2014-2016 by Andrew Stacey <loopspace@mathforge.org>
+Copyright (C) 2014-2019 by Andrew Stacey <loopspace@mathforge.org>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License (LPPL), either
@@ -38,22 +38,22 @@ http://www.latex-project.org/lppl.txt
This work is "maintained" (as per LPPL maintenance status) by
Andrew Stacey.
-This work consists of the files penrose.dtx
- penrose_doc.tex
+This work consists of the files penrose_code.dtx
+ penrose.tex
and the derived files penrose.ins
penrose_code.pdf
- tikzlibrarypenrose.code.tex
penrose.pdf
- README
+ tikzlibrarypenrose.code.tex
+ README.txt
\endpostamble
\usedir{tex/latex/penrose}
\generate{
- \file{tikzlibrarypenrose.code.tex}{\from{\jobname.dtx}{library}}
+ \file{tikzlibrarypenrose.code.tex}{\from{\jobname.dtx}{package}}
}
\endbatchfile
%%
-%% Copyright (C) 2014-2016 by Andrew Stacey <loopspace@mathforge.org>
+%% Copyright (C) 2014-2019 by Andrew Stacey <loopspace@mathforge.org>
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License (LPPL), either
@@ -65,13 +65,13 @@ and the derived files penrose.ins
%% This work is "maintained" (as per LPPL maintenance status) by
%% Andrew Stacey.
%%
-%% This work consists of the files penrose.dtx
-%% penrose_doc.tex
+%% This work consists of the files penrose_code.dtx
+%% penrose.tex
%% and the derived files penrose.ins
%% penrose_code.pdf
-%% tikzlibrarypenrose.code.tex
%% penrose.pdf
-%% README
+%% tikzlibrarypenrose.code.tex
+%% README.txt
%%
%%
-%% End of file `penrose.ins'.
+%% End of file `penrose_code.ins'.
diff --git a/Master/texmf-dist/source/latex/philosophersimprint/Makefile b/Master/texmf-dist/source/latex/philosophersimprint/Makefile
new file mode 100644
index 00000000000..9075e9f1978
--- /dev/null
+++ b/Master/texmf-dist/source/latex/philosophersimprint/Makefile
@@ -0,0 +1,60 @@
+#
+# Makefile for philosophersimprint package
+#
+# This file is in public domain
+#
+# $Id: Makefile,v 1.10 2020/11/16 20:28:01 boris Exp $
+#
+
+PACKAGE=philosophersimprint
+
+SAMPLES = sample.tex
+
+PDF = $(PACKAGE).pdf ${SAMPLES:%.tex=%.pdf}
+
+all: ${PDF}
+
+
+%.pdf: %.dtx $(PACKAGE).cls
+ pdflatex $<
+ - bibtex $*
+ pdflatex $<
+ - makeindex -s gind.ist -o $*.ind $*.idx
+ - makeindex -s gglo.ist -o $*.gls $*.glo
+ pdflatex $<
+ while ( grep -q '^LaTeX Warning: Label(s) may have changed' $*.log) \
+ do pdflatex $<; done
+
+
+%.cls: %.ins %.dtx
+ pdflatex $<
+
+%.pdf: %.tex $(PACKAGE).cls
+ pdflatex $<
+ - bibtex $*
+ pdflatex $<
+ while ( grep -q '^LaTeX Warning: Label(s) may have changed' $*.log) \
+ do pdflatex $<; done
+
+
+
+.PRECIOUS: $(PACKAGE).cfg $(PACKAGE).cls
+
+
+clean:
+ $(RM) $(PACKAGE).cls *.log *.aux \
+ *.cfg *.glo *.idx *.toc \
+ *.ilg *.ind *.out *.lof \
+ *.lot *.bbl *.blg *.gls *.out \
+ *.dvi *.ps
+
+distclean: clean
+ $(RM) $(PDF)
+
+#
+# Archive for the distribution. Includes typeset documentation
+#
+archive: all clean
+ COPYFILE_DISABLE=1 tar -czvf $(PACKAGE).tgz -C .. --exclude '*~' \
+ --exclude '*.tgz' --exclude CVS \
+ --transform 's/latex/$(PACKAGE)/' latex
diff --git a/Master/texmf-dist/source/latex/philosophersimprint/philosophersimprint.dtx b/Master/texmf-dist/source/latex/philosophersimprint/philosophersimprint.dtx
index 34e537bb440..9f710a25896 100644
--- a/Master/texmf-dist/source/latex/philosophersimprint/philosophersimprint.dtx
+++ b/Master/texmf-dist/source/latex/philosophersimprint/philosophersimprint.dtx
@@ -1,8 +1,8 @@
% \iffalse
%<*gobble>
-% $Id: philosophersimprint.dtx,v 1.44 2016/07/20 20:15:04 boris Exp $
+% $Id: philosophersimprint.dtx,v 1.45 2020/11/11 01:28:17 boris Exp $
%
-% Copyright 2007, Boris Veytsman <boris@varphi.com>
+% Copyright 2007-2020, Boris Veytsman <boris@varphi.com>
% 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
@@ -20,7 +20,7 @@
% derived file philosophersimprint.cls
%
% \fi
-% \CheckSum{808}
+% \CheckSum{806}
%
%
%% \CharacterTable
@@ -52,7 +52,7 @@
\ProvidesFile{philosophersimprint.dtx}
%</gobble>
%<class>\ProvidesClass{philosophersimprint}
-[2016/07/20 v1.4 Typesetting articles for Philosophers' Imprint]
+[2020/11/10 v1.5 Typesetting articles for Philosophers' Imprint]
%<*gobble>
% \end{macrocode}
%
@@ -98,7 +98,7 @@
% \GetFileInfo{philosophersimprint.dtx}
% \newcommand{\progname}[1]{\textsf{#1}}
% \title{Typesetting Articles For Online Journal \emph{Philosophers'
-% Imprint}\thanks{\copyright 2007, Boris Veytsman}}
+% Imprint}\thanks{\copyright 2007--2020, Boris Veytsman}}
% \author{Boris Veytsman\thanks{%
% \href{mailto:borisv@lk.net}{\texttt{borisv@lk.net}},
% \href{mailto:boris@varphi.com}{\texttt{boris@varphi.com}}}}
@@ -1062,6 +1062,7 @@
% \end{macro}
%
% \begin{macro}{\titleimage}
+% \changes{v1.5}{2020/11/10}{Default title image is now a string}
% \begin{macro}{\affiliation}
% \begin{macro}{\copyrightinfo}
% \begin{macro}{\subject}
@@ -1069,7 +1070,7 @@
% A bunch of one parameter macros
% \begin{macrocode}
\newcommand*{\titleimage}[1]{\gdef\@titleimage{#1}}
-\titleimage{}
+\titleimage{NoSuchImageDotUse.pdf}
\newcommand*{\affiliation}[1]{\gdef\@affiliation{#1}}
\affiliation{}
\newcommand*{\copyrightinfo}[1]{\gdef\@copyrightinfo{#1}}
@@ -1380,15 +1381,14 @@
% \begin{macro}{\@makfntext}
% \changes{v0.7}{2007/04/19}{Introduced new footnote formatting}
% \changes{v1.1}{2011/11/25}{Changed indentation}
+% \changes{v1.5}{2020/11/10}{Changed indentation again}
% The journal prefers footnotes with text footnote marks and hanging
% indentation
% \begin{macrocode}
\renewcommand\@makefntext[1]{%
- \bgroup
- \parindent2\PHIM@baselength\relax
- \everypar{\hangindent=\PHIM@baselength\hangafter=1}%
- \noindent
- \makebox[\PHIM@baselength][l]{\@thefnmark.}#1\egroup}
+ \@tempdima=\hsize
+ \advance\@tempdima by -\PHIM@baselength\relax
+ \makebox[\PHIM@baselength][l]{\@thefnmark.}\parbox[t]{\@tempdima}{#1}}
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex/pict2e/pict2e.dtx b/Master/texmf-dist/source/latex/pict2e/pict2e.dtx
index 9c4baa4f3f8..5354514bc44 100644
--- a/Master/texmf-dist/source/latex/pict2e/pict2e.dtx
+++ b/Master/texmf-dist/source/latex/pict2e/pict2e.dtx
@@ -1,8 +1,6 @@
% \iffalse meta-comment
%
-%
-%
-% Copyright (C) 2003-2016
+% Copyright (C) 2003-2020
% Rolf Niepraschk, Rolf.Niepraschk@gmx.de
% Hubert Gaesslein, hubertjg@gmx.de
% Josef Tkadlec, j.tkadlec@email.cz
@@ -23,12 +21,12 @@
%
%<*package>
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-\ProvidesPackage{pict2e}[2019/08/20 v0.3c Improved picture commands (HjG,RN,JT)]
+\ProvidesPackage{pict2e}[2020/09/30 v0.4b Improved picture commands (HjG,RN,JT)]
%</package>
%
%<*driver>
\listfiles
-\errorcontextlines5
+\setcounter{errorcontextlines}{5}
\documentclass{ltxdoc}
\usepackage{pict2e} % [pstarrows]
%%\usepackage[debug]{pict2e}
@@ -37,13 +35,16 @@
\usepackage{color}
\usepackage{graphicx}
\usepackage{array}
-%%\usepackage{pstcol}
+\usepackage[T1]{fontenc}
+\usepackage{lmodern}
\usepackage{longtable}
\IfFileExists{geometry.sty}{%
\usepackage[left=\marginparwidth,textwidth=1.15\textwidth,%
top=20mm,bottom=30mm]{geometry}}{}
\IfFileExists{url.sty}{\usepackage{url}}
{\newcommand*\url[1]{\texttt{#1}}}
+\usepackage{hypdoc}
+
%\OnlyDescription
\AlsoImplementation
\EnableCrossrefs
@@ -60,9 +61,9 @@
% \fi
%
% \GetFileInfo{pict2e.sty}
-% \def\docdate{2016/01/09}
+% \def\docdate{2020/09/30}
%
-% \CheckSum{2158}
+% \CheckSum{2350}
%
% ^^A ========
%
@@ -184,6 +185,10 @@
% \changes{v0.2y}{2011/04/05}{Support for dvipdfmx. (JT)}
% \changes{v0.2z}{2014/01/12}{Conflict wit epic, eepic solved. (JT)}
% \changes{v0.3a}{2016/01/09}{Local line types, documentation fixes. (JT)}
+% \changes{v0.3d}{2020/06/13}{\cmd{\@sline} renamed \cmd{\pIIe@sline} (RN)}
+% \changes{v0.3e}{2020/06/20}{Added \cmd{\Vector}, \cmd{\polyvector}
+% suggested by FMi (RN)}
+% \changes{v0.4a}{2020/08/16}{Default lengths to match extended \LaTeX\ version}
% \fi
%
% \changes{v0.1a}{2003/07/18}{First version. (RN)}
@@ -688,7 +693,7 @@
%
% \subsubsection{Driver options}
%
-% \begin{minipage}{.5\textwidth}
+% \begin{minipage}{.55\textwidth}
% \begin{tabular}{@{}lc@{\qquad\qquad}lc@{}}
% driver & notes & driver & notes\\ \hline
% dvips & x & oztex & (x) \\
@@ -1280,26 +1285,32 @@
% An equivalent \cmd{\pIIearc} to \cmd{\arc} is defined to solve possible
% conflicts with other packages.
%
-% \subsubsection{Lines, polygons}
+% \subsubsection{Line, Vector, polyline, polyvector, and polygon}
% \label{sec:usage:lines+polygons}
%
% \DescribeMacro\Line
% \DescribeMacro\polyline
+% \DescribeMacro\Vector
+% \DescribeMacro\polyvector
% \DescribeMacro\polygon
% \DescribeMacro{\polygon*}
% |\Line|\parg{X1,Y1}\parg{X2,Y2}\\
% |\polyline|\parg{X1,Y1}\parg{X2,Y2}\dots\parg{Xn,Yn}\\
+% |\Vector|\parg{X1,Y1}\parg{X2,Y2}\\
+% |\polyvector|\parg{X1,Y1}\parg{X2,Y2}\dots\parg{Xn,Yn}\\
% |\polygon|\parg{X1,Y1}\parg{X2,Y2}\dots\parg{Xn,Yn}\\
% |\polygon*|\parg{X1,Y1}\parg{X2,Y2}\dots\parg{Xn,Yn}\\
% A natural way how to describe a line segment is to give the coordinates of
-% the endpoints. The syntax of the \cmd{\line} is different because
+% the endpoints. The syntax of the \cmd{\line}/\cmd{\vector} is different
+% because
% the lines in the standard \texttt{picture} environment are made from small
% line segments of a limited number of slopes given in a font. However, this
% package changes the \cmd{\line} command computing the coordinates of the
% endpoints and using an internal macro for drawing a line segment with given
% endpoints. Hence it would be crazy do not use this possibility directly.
-% This is done by the command \cmd{\Line}. The command \cmd{\polyline} draws a
-% stroken line connecting points with given coordinates. The command
+% This is done by the commands \cmd{\Line} and \cmd{\Vector}. The commands
+% \cmd{\polyline} and \cmd{\polyvector} draws a
+% stroken line/vector connecting points with given coordinates. The command
% \cmd{\polygon} draws a polygon with given vertices, the star variant gives
% filled polygon. At least two points should be given.
%
@@ -1489,6 +1500,27 @@
%
% \subsection{Preliminaries}
%
+% \begin{macro}{\@defaultunitsset}
+% Command to accept a number or length expression.
+% Added to \LaTeX\ 2020-10-01 release but provided here for older releases.
+%
+% Set a length register, |#1|,
+% accepting number or an etex length expression, |#2|,
+% with default unit, |#3|.
+%
+% |#3| can be a literal unit such as |cm| or a length register such
+% as |\unitlength|.
+%
+% This is used in all |picture| commands that take picture coordinates.
+% So |\put(2,2)| as previously but now |\put(\textwidth-5cm,0.4\texteight)|
+% Note that you can only use expressions with lengths, |\put(1+2,0)| is not
+% supported.
+% \begin{macrocode}
+\def\@defaultunitsset#1#2#3{%
+ \@defaultunits#1\dimexpr#2#3\relax\relax\@nnil}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\pIIe@mode}
% \begin{macro}{\pIIe@code}
% \begin{macro}{\Gin@driver}
@@ -1594,39 +1626,44 @@
}
% \end{macrocode}
% \end{macro}
-% Arrow shape options.
-% The values for \LaTeX-style arrows are ``hand optimized'';
-% they should be regarded as experimental,
-% i.e., they may change in future versions of this package.
-% The values for \PSTricks-style arrows are the default ones used by
-% that bundle.
-% If the \textsf{pstricks} package is actually loaded, then
-% \textsf{pict2e} will obey the current values of the corresponding
-% internal \PSTricks\ parameters;
-% this feature should be regarded as experimental,
-% i.e., it may change in future versions of this package.
+% \begin{macro}{\pIIe@FAL}
+% \begin{macro}{\pIIe@FAW}
+% \begin{macro}{\pIIe@CAW}
+% \begin{macro}{\pIIe@FAI}
+% Some macros to parametrize the shape of the vector outline.
+% The following values are “hand optimized” with the aim of emulating
+% \LaTeX-style arrows. They also seem suitable for our \PSTricks-style arrows.
+% See Figures~\ref{fig:vector:ltx} and~\ref{fig:vector:pst}.
+% \changes{v0.1x}{2003/11/27}{Introduce ``inset''. (RN,HjG)}
% \begin{macrocode}
-\DeclareOption{ltxarrows}{\AtEndOfPackage{%
+\newcommand*\pIIe@FAL{1.52}%
+\newcommand*\pIIe@FAW{3.2}%
+\newcommand*\pIIe@CAW{1.5pt}%
+\newcommand*\pIIe@FAI{0.25}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\ltxarrows}
+% \begin{macro}{\pstarrows}
+% The following user-level macros can be used to change the arrow style
+% (\LaTeX-style is the default).
+% \changes{v0.3d}{2020/06/13}{New user-level macros \cmd{\ltxarrows}
+% and \cmd{\pstarrows}. (RN)}
+% \begin{macrocode}
+\newcommand*\ltxarrows{%
\let\pIIe@vector=\pIIe@vector@ltx
- \def\pIIe@FAL{1.52}%
- \def\pIIe@FAW{3.2}%
- \def\pIIe@CAW{1.5pt}%
- \def\pIIe@FAI{0.25}%
- }}
-\DeclareOption{pstarrows}{\AtEndOfPackage{%
+}
+\newcommand*\pstarrows{%
\let\pIIe@vector=\pIIe@vector@pst
- \iffalse
- \def\pIIe@FAL{1.4}%
- \def\pIIe@FAW{2}%
- \def\pIIe@CAW{1.5pt}%
- \def\pIIe@FAI{0.4}%
- \else % These are the ltxarrows values, which looks better. (RN)
- \def\pIIe@FAL{1.52}%
- \def\pIIe@FAW{3.2}%
- \def\pIIe@CAW{1.5pt}%
- \def\pIIe@FAI{0.25}%
- \fi
- }}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macrocode}
+\DeclareOption{ltxarrows}{\AtEndOfPackage{\ltxarrows}}
+\DeclareOption{pstarrows}{\AtEndOfPackage{\pstarrows}}
% \end{macrocode}
%
% \begin{macro}{\pIIe@debug@comment}
@@ -2194,7 +2231,7 @@
% \]
% and $t = x/s$ and $\tau = 2(t-1/2)$.
% \end{quote}
-% \changes{v0.2r}{2005/07/15}{Two wrong global assignment changed. (RN)}
+% \changes{v0.2r}{2005/07/15}{Two wrong global assignments changed. (RN)}
% \begin{macrocode}
\newcommand*\pIIe@pyth[3]{%
\begingroup
@@ -2392,41 +2429,61 @@
% \changes{v0.2t}{2008/05/11}{All lines by \cmd{\@sline} (JT)}
% \begin{macrocode}
\def\line(#1,#2)#3{%
+ \begingroup
\pIIe@checkslopeargsline{#1}{#2}%
\@tempdima=#1pt\relax \@tempdimb=#2pt\relax
- \@linelen #3\unitlength
- \ifdim\@linelen<\z@ \@badlinearg \else \@sline \fi}
+ \@defaultunitsset\@linelen{#3}\unitlength
+ \ifdim\@linelen<\z@ \@badlinearg \else
+ \pIIe@sline
+ \pIIe@moveto\z@\z@
+ \pIIe@lineto\@xdim\@ydim
+ \pIIe@strokeGraph
+% \end{macrocode}
+% Simulated bounding box
+% \begin{macrocode}
+ \box\@tempboxa
+ \fi
+ \endgroup}
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\@sline}
-% (The implementation here is different from \cmd{\vector}!)
+% \begin{macro}{\pIIe@sline}
+% Common code for \cmd{\line} and \cmd{\vector}.
+% \changes{v0.3d}{2020/06/13}{Simulated bounding boxes for \cmd{\line}
+% and \cmd{\vector} suggested by Donald Arseneau (RN)}
+% \begin{macrocode}
+ \newcommand*\pIIe@sline{%
+% \end{macrocode}
+% Calculation of the endpoints \cmd{\@xdim}, \cmd{\@ydim}
+% (used for \cmd{\line} only).
% \begin{macrocode}
- \def\@sline{%
- \begingroup
\ifdim\@tempdima=\z@
\ifdim\@tempdimb<\z@\@linelen-\@linelen\fi
\@ydim=\@linelen
\@xdim=\z@
\else
+ \ifdim\@tempdima<\z@\@linelen-\@linelen\fi
\ifdim\@tempdimb=\z@
- \ifdim\@tempdima<\z@\@linelen-\@linelen\fi
\@xdim=\@linelen
\@ydim=\z@
\else
- \ifnum\@tempdima<\z@\@linelen-\@linelen\fi
\pIIe@divide\@tempdimb\@tempdima\dimen@
\@ydim=\strip@pt\dimen@\@linelen
\@xdim=\@linelen
\fi
\fi
- \pIIe@moveto\z@\z@
- \pIIe@lineto\@xdim\@ydim
- \pIIe@strokeGraph
- \endgroup}
+% \end{macrocode}
+% Prepare a box that can be used as a bounding box for \cmd{\line} and
+% \cmd{\vector} to achieve the same behavior as standard \LaTeX\ outside
+% of a picture environment.
+% \begin{macrocode}
+ \@ovxx=\ifnum\@xdim=\z@ \z@\else\@linelen\fi
+ \@ovyy=\ifnum\@ydim<\z@ \z@\else\@ydim\fi
+ \@ovdy=\ifnum\@ydim<\z@ -\@ydim\else\z@\fi
+ \setbox\@tempboxa\hbox{%
+ \vrule\@height \@ovyy \@depth \@ovdy \@width \z@
+ \vrule\@height \z@ \@depth \z@ \@width \@ovxx}}
% \end{macrocode}
% \end{macro}
-%
% \subsubsection{Vector}
% \label{sec:implementation:vector}
%
@@ -2448,12 +2505,13 @@
\begingroup
\pIIe@checkslopeargsvector{#1}{#2}%
\@tempdima=#1pt\relax \@tempdimb=#2pt\relax
- \@linelen#3\unitlength
+ \@defaultunitsset\@linelen{#3}\unitlength
\ifdim\@linelen<\z@ \@badlinearg \else
+ \pIIe@sline
+ \@defaultunitsset\@linelen{#3}\unitlength
\pIIe@pyth{\@tempdima}{\@tempdimb}\dimen@
- \ifdim\@tempdima=\z@
- \else\ifdim\@tempdimb=\z@
- \else
+ \ifdim\@tempdima=\z@ \else
+ \ifdim\@tempdimb=\z@ \else
% \end{macrocode}
% This calculation is only necessary, if the vector is actually
% sloped.
@@ -2469,14 +2527,20 @@
\pIIe@divide{\@tempdimb}\dimen@\@ydim
\pIIe@divide{\@tempdima}\dimen@\@xdim
% \end{macrocode}
-% Rotate the following vector\slash arrow outlines by angle $\theta$.
+% Rotate the following vector\slash arrow outlines by angle $\theta$:\par
+% \BigIndent
+% $\cos{\theta}$\quad$\sin{\theta}$\quad$-\sin{\theta}$\quad$\cos{\theta}$\quad $0\quad 0$
% \begin{macrocode}
\pIIe@concat\@xdim\@ydim{-\@ydim}\@xdim\z@\z@
% \end{macrocode}
-% Internal command to draw the outline of the vector\slash arrow.
+% Internal command to draw the outline of the vector\slash arrow.
% \begin{macrocode}
\pIIe@vector
\pIIe@fillGraph
+% \end{macrocode}
+% Simulated bounding box
+% \begin{macrocode}
+ \box\@tempboxa
\fi
\endgroup}
% \end{macrocode}
@@ -2492,51 +2556,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\pIIe@FAL}
-% \begin{macro}{\pIIe@FAW}
-% \begin{macro}{\pIIe@CAW}
-% \begin{macro}{\pIIe@FAI}
-% \changes{v0.1x}{2003/11/27}{Introduce ``inset''. (RN,HjG)}
-% \begin{macro}{\pIIe@@firstnum}
-% \changes{v0.1x}{2003/11/27}{New ancillary macro (RN,HjG)}
-% \begin{macro}{\pIIe@@secondnum}
-% \changes{v0.1x}{2003/11/27}{New ancillary macro (RN,HjG)}
-% Some macros to parametrize the shape of the vector outline.
-% ^^A Should be user-level macros or changeable via key-value interface.
-% ^^A (Defered to future version.)
-% See Figures~\ref{fig:vector:ltx} and~\ref{fig:vector:pst}.
-%\iffalse
-% Note that when the \textsf{pstricks} package has been loaded, its
-% arrow-drawing parameters will be dynamically evaluated;
-% of course,
-% this is only useful with the \textsf{pstarrows} package
-% option.
-% probably\slash most likely not useful with the default
-% \textsf{ltxarrows} package option.
-% \fi
-% \begin{macrocode}
- \newcommand*\pIIe@FAL{}\newcommand*\pIIe@FAW{}\newcommand*\pIIe@CAW{}
- \newcommand*\pIIe@FAI{}
- \newcommand*\pIIe@@firstnum{}\newcommand*\pIIe@@secondnum{}
- \iffalse% the pstricks values gives too small arrows. (RN)
- \AtBeginDocument{%
- \@ifpackageloaded{pstricks}{%
- \def\pIIe@FAL{\psk@arrowlength}%
- \def\pIIe@FAW{\expandafter\pIIe@@secondnum\psk@arrowsize}%
- \def\pIIe@CAW{\expandafter\pIIe@@firstnum\psk@arrowsize}%
- \def\pIIe@FAI{\psk@arrowinset}%
- \def\pIIe@@firstnum#1 #2 {#1\p@}%
- \def\pIIe@@secondnum#1 #2 {#2}%
- }{}%
- }
- \fi
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
%
% \paragraph{\LaTeX\ version}
%
@@ -2872,10 +2891,10 @@
% argument (RN,HjG)}
% \changes{v0.2n}{2004/04/22}{Allow zero diameter (RN/HjG)}
% \begin{macrocode}
- \@tempdima#1\unitlength
- \ifdim\@tempdima<\z@ \pIIe@badcircarg \fi
- \divide\@tempdima\tw@
- \pIIe@circle\@tempdima
+ \@defaultunitsset\pIIe@tempdima{#1}\unitlength
+ \ifdim\pIIe@tempdima<\z@ \pIIe@badcircarg \fi
+ \divide\pIIe@tempdima\tw@
+ \pIIe@circle\pIIe@tempdima
% \end{macrocode}
% With the current state of affairs, we could use
% \cmd{\pIIe@drawGraph} directly; but that would possibly be a case of
@@ -3039,16 +3058,12 @@
% \cite[p.~223]{LAMPORT} does not specify explicitly whether the
% \oarg{rad} argument should be given in terms of \cmd{\unitlength} or
% as an absolute length.
-% To implement this feature, we borrow from the \textsf{graphics}
-% package:
-% See \cmd{\Gin@defaultbp} and \cmd{\Gin@def@bp} from
-% \texttt{graphics.dtx}.
+% This is now re-implemented in terms of \cmd{@defaultunitsset}.
% \begin{macrocode}
\newcommand*\pIIe@defaultUL[2]{%
- \afterassignment\pIIe@def@UL\dimen@#2\unitlength\relax{#1}{#2}}
+ \@defaultunitsset\pIIe@tempdima{#2}\unitlength
+ \edef#1{\the\pIIe@tempdima}}
% \end{macrocode}
-% However, things are simpler in our case, since we always need the
-% value stored in \cmd{\dimen@}.
% Hence, we could\slash should omit the unnecessary argument!?)
% \changes{v0.2h}{2004/01/07}{Check for negative or zero radius
% argument (RN,HjG)}
@@ -3069,6 +3084,7 @@
%
% \begin{macro}{\oval}
% \begin{macro}{\pIIe@maxovalrad}
+% \begin{macro}{\pIIe@oval}
% The variant of \cmd{\oval} defined here takes an additional optional
% argument, which specifies the maximum radius of the rounded corners
% (default = 20\,pt, as given above).
@@ -3078,19 +3094,23 @@
% \changes{v0.2n}{2004/04/22}{Moved radius test from \cmd{\pIIe@def@UL}
% (RN/HjG)}
% \changes{v0.2n}{2004/04/22}{Allow zero diameter (RN/HjG)}
+% \changes{v0.3d}{2020/06/13}{Allow spaces after the first optional Argument
+% suggested by FMi (RN)}
% \begin{macrocode}
\newcommand*\pIIe@maxovalrad{}
+ \newcommand*\pIIe@oval{}
+ \def\pIIe@oval#1(#2,#3){\@ifnextchar[{\@oval(#2,#3)}{\@oval(#2,#3)[]}}
\renewcommand*\oval[1][\maxovalrad]{%
\begingroup \pIIe@defaultUL\pIIe@maxovalrad{#1}%
\ifdim\pIIe@maxovalrad<\z@ \pIIe@badcircarg \fi
% \end{macrocode}
% Can't close the group here, since arguments must be parsed.
-% (This is done by calling the saved original.)
% \begin{macrocode}
- \pIIe@oldoval}
+ \pIIe@oval}
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\@oval}
% (This is called in turn by the saved original.)
@@ -3099,16 +3119,16 @@
% \end{macrocode}
% In analogy to circles, we need only half of the size value.
% \begin{macrocode}
- \@ovxx#1\unitlength \divide\@ovxx\tw@
- \@ovyy#2\unitlength \divide\@ovyy\tw@
- \@tempdimc \ifdim\@ovyy>\@ovxx \@ovxx \else \@ovyy \fi
- \ifdim\pIIe@maxovalrad<\@tempdimc \@tempdimc\pIIe@maxovalrad\relax \fi
+ \@defaultunitsset\pIIe@tempdima{#1}\unitlength \divide\pIIe@tempdima\tw@
+ \@defaultunitsset\pIIe@tempdimb{#2}\unitlength \divide\pIIe@tempdimb\tw@
+ \pIIe@tempdimc \ifdim\pIIe@tempdimb>\pIIe@tempdima \pIIe@tempdima \else \pIIe@tempdimb \fi
+ \ifdim\pIIe@maxovalrad<\pIIe@tempdimc \pIIe@tempdimc\pIIe@maxovalrad\relax \fi
% \end{macrocode}
% Subtract the radius of the corners to get coordinates for the
% straight line segments.
% \begin{macrocode}
- \@xdim\@ovxx \advance\@xdim-\@tempdimc
- \@ydim\@ovyy \advance\@ydim-\@tempdimc
+ \pIIe@tempdimd\pIIe@tempdima \advance\pIIe@tempdimd-\pIIe@tempdimc
+ \pIIe@tempdime\pIIe@tempdimb \advance\pIIe@tempdime-\pIIe@tempdimc
% \end{macrocode}
% Determine which parts of the oval we have to draw.
% \begin{macrocode}
@@ -3131,7 +3151,8 @@
% Bits 3 and 0 set? (SE/NE)
% \begin{macrocode}
\ifnum9=\@tempcnta
- \pIIe@qoval\z@{-\@ovyy}{\@xdim}{-\@ovyy}\thr@@\@tempdimc\@ovxx\z@
+ \pIIe@qoval\z@{-\pIIe@tempdimb}{\pIIe@tempdimd}{-\pIIe@tempdimb}%
+ \thr@@\pIIe@tempdimc\pIIe@tempdima\z@
% \end{macrocode}
% Bit 0 set! (NE)
% \begin{macrocode}
@@ -3140,19 +3161,23 @@
% \end{macrocode}
% Bit 0 set? (NE)
% \begin{macrocode}
- \pIIe@qoval\@ovxx\z@\@ovxx\@ydim\z@\@tempdimc\z@\@ovyy
+ \pIIe@qoval\pIIe@tempdima\z@\pIIe@tempdima\pIIe@tempdime%
+ \z@\pIIe@tempdimc\z@\pIIe@tempdimb
% \end{macrocode}
% Bit 1 set? (NW)
% \begin{macrocode}
- \pIIe@qoval\z@\@ovyy{-\@xdim}\@ovyy\@ne\@tempdimc{-\@ovxx}\z@
+ \pIIe@qoval\z@\pIIe@tempdimb{-\pIIe@tempdimd}\pIIe@tempdimb%
+ \@ne\pIIe@tempdimc{-\pIIe@tempdima}\z@
% \end{macrocode}
% Bit 2 set? (SW)
% \begin{macrocode}
- \pIIe@qoval{-\@ovxx}\z@{-\@ovxx}{-\@ydim}\tw@\@tempdimc\z@{-\@ovyy}%
+ \pIIe@qoval{-\pIIe@tempdima}\z@{-\pIIe@tempdima}{-\pIIe@tempdime}%
+ \tw@\pIIe@tempdimc\z@{-\pIIe@tempdimb}%
% \end{macrocode}
% Bit 3 set? (SE)
% \begin{macrocode}
- \pIIe@qoval\z@{-\@ovyy}{\@xdim}{-\@ovyy}\thr@@\@tempdimc\@ovxx\z@
+ \pIIe@qoval\z@{-\pIIe@tempdimb}{\pIIe@tempdimd}{-\pIIe@tempdimb}%
+ \thr@@\pIIe@tempdimc\pIIe@tempdima\z@
% \end{macrocode}
% Now we've finished, draw the oval and finally close the group opened
% by \cmd{\oval} above.
@@ -3202,15 +3227,14 @@
% We abuse \cmd{\@setfpsbit} from the float processing modules of the
% kernel.
% ^^A (Should this go to section low-level?)
-% \begin{macrocode}
+% \begin{macrocode}
\newcommand*\pIIe@get@quadrants[1]{%
\@ovttrue \@ovbtrue \@ovltrue \@ovrtrue \@tempcnta\z@
\@tfor\reserved@a:=#1\do{\csname @ov\reserved@a false\endcsname}%
\if@ovr \if@ovb\@setfpsbit2\fi \if@ovt\@setfpsbit4\fi \fi
\if@ovl \if@ovb\@setfpsbit1\fi \if@ovt\@setfpsbit8\fi \fi}
-% \end{macrocode}
+% \end{macrocode}
% \end{macro}
-%
% \subsubsection{Quadratic Bezier Curve}
% \label{sec:implementation:bezier-curves}
%
@@ -3235,28 +3259,31 @@
% \begin{macrocode}
\@killglue
\begingroup
- \@ovxx#2\unitlength \@ovyy#3\unitlength
- \@ovdx#4\unitlength \@ovdy#5\unitlength
- \@xdim#6\unitlength \@ydim#7\unitlength
+ \@defaultunitsset\pIIe@tempdima{#2}\unitlength
+ \@defaultunitsset\pIIe@tempdimb{#3}\unitlength
+ \@defaultunitsset\pIIe@tempdimc{#4}\unitlength
+ \@defaultunitsset\pIIe@tempdimd{#5}\unitlength
+ \@defaultunitsset\pIIe@tempdime{#6}\unitlength
+ \@defaultunitsset\pIIe@tempdimf{#7}\unitlength
% \end{macrocode}
% \noindent
% \BigIndent $P_1 = P_m + 1/3 (P_0 - P_m)$
% \begin{macrocode}
- \pIIe@bezier@QtoC\@ovxx\@ovdx\@ovro
- \pIIe@bezier@QtoC\@ovyy\@ovdy\@ovri
+ \pIIe@bezier@QtoC\pIIe@tempdima\pIIe@tempdimc\@ovro
+ \pIIe@bezier@QtoC\pIIe@tempdimb\pIIe@tempdimd\@ovri
% \end{macrocode}
% \BigIndent $P_2 = P_m + 1/3 (P_3 - P_m)$
% \begin{macrocode}
- \pIIe@bezier@QtoC\@xdim\@ovdx\@clnwd
- \pIIe@bezier@QtoC\@ydim\@ovdy\@clnht
+ \pIIe@bezier@QtoC\pIIe@tempdime\pIIe@tempdimc\@clnwd
+ \pIIe@bezier@QtoC\pIIe@tempdimf\pIIe@tempdimd\@clnht
% \end{macrocode}
% \BigIndent $(P_{0x},P_{0y})$
% \begin{macrocode}
- \pIIe@moveto\@ovxx\@ovyy
+ \pIIe@moveto\pIIe@tempdima\pIIe@tempdimb
% \end{macrocode}
% \BigIndent $(P_{1x},P_{1y})$\quad$(P_{2x},P_{2y})$\quad$(P_{3x},P_{3y})$
% \begin{macrocode}
- \pIIe@curveto\@ovro\@ovri\@clnwd\@clnht\@xdim\@ydim
+ \pIIe@curveto\@ovro\@ovri\@clnwd\@clnht\pIIe@tempdime\pIIe@tempdimf
\pIIe@strokeGraph
\endgroup
\ignorespaces
@@ -3265,7 +3292,6 @@
\fi}
% \end{macrocode}
% \end{macro}
-%
% \begin{macro}{\pIIe@bezier@QtoC}
% \changes{v0.1u}{2003/11/21}{New ancillary macro (HjG)}
% Ancillary macro; saves us some tokens above.
@@ -3277,10 +3303,10 @@
% \noindent
% (Missing: Reference for mathematical formula. Or is this trivial?)
% \begin{macrocode}
- \newcommand*\pIIe@bezier@QtoC[3]{%
- \@tempdimc#1\relax \advance\@tempdimc-#2\relax
- \divide\@tempdimc\thr@@ \advance\@tempdimc #2\relax
- #3\@tempdimc}
+ \newcommand*\pIIe@bezier@QtoC[3]{%
+ \@tempdimc#1\relax \advance\@tempdimc-#2\relax
+ \divide\@tempdimc\thr@@ \advance\@tempdimc #2\relax
+ #3\@tempdimc}
% \end{macrocode}
% \end{macro}
%
@@ -3288,10 +3314,17 @@
% \label{sec:implementation:circle-arcs}
%
% We need some auxiliary dimensions.
+% \changes{v0.4b}{2020/09/30}{More auxiliary dimensions}
+% \changes{v0.4b}{2020/09/30}{Use of fewer system dimension registers}
% \begin{macrocode}
\ifx\undefined\@arclen \newdimen\@arclen \fi
\ifx\undefined\@arcrad \newdimen\@arcrad \fi
- \ifx\undefined\@tempdimd \newdimen\@tempdimd \fi
+ \ifx\undefined\pIIe@tempdima \newdimen\pIIe@tempdima \fi
+ \ifx\undefined\pIIe@tempdimb \newdimen\pIIe@tempdimb \fi
+ \ifx\undefined\pIIe@tempdimc \newdimen\pIIe@tempdimc \fi
+ \ifx\undefined\pIIe@tempdimd \newdimen\pIIe@tempdimd \fi
+ \ifx\undefined\pIIe@tempdime \newdimen\pIIe@tempdime \fi
+ \ifx\undefined\pIIe@tempdimf \newdimen\pIIe@tempdimf \fi
% \end{macrocode}
% \begin{macro}{\pIIe@arc}
% \#1: 0 (implicit) if we connect arc with a current point, 1 if we start
@@ -3372,11 +3405,11 @@
% Coordinates of the second control point:
% \begin{macrocode}
\@tempdimc \UseSin{#6}\@linelen \advance\@tempdimc \@tempdima
- \@tempdimd-\UseCos{#6}\@linelen \advance\@tempdimd \@tempdimb
+ \pIIe@tempdimd-\UseCos{#6}\@linelen \advance\pIIe@tempdimd \@tempdimb
% \end{macrocode}
% Adding the second control point and the endpoint to the path
% \begin{macrocode}
- \pIIe@add@nums\@tempdimc\@tempdimd
+ \pIIe@add@nums\@tempdimc\pIIe@tempdimd
\pIIe@add@CP\@tempdima\@tempdimb
\pIIe@addtoGraph\pIIe@curveto@op
\fi
@@ -3394,12 +3427,13 @@
{\@ifstar{\@tempswatrue\pIIe@arc@}{\@tempswafalse\pIIe@arc@}}
\newcommand*\pIIe@arc@[2][0,360]{\pIIe@arc@@(#1){#2}}
\def\pIIe@arc@@(#1,#2)#3{%
+ \@defaultunitsset\pIIe@tempdima{#3}\unitlength
\if@tempswa
\pIIe@moveto\z@\z@
- \pIIe@arc{\z@}{\z@}{#3\unitlength}{#1}{#2}%
+ \pIIe@arc{\z@}{\z@}{\pIIe@tempdima}{#1}{#2}%
\pIIe@closepath\pIIe@fillGraph
\else
- \pIIe@arc[1]{\z@}{\z@}{#3\unitlength}{#1}{#2}%
+ \pIIe@arc[1]{\z@}{\z@}{\pIIe@tempdima}{#1}{#2}%
\pIIe@strokeGraph
\fi}
\ifx\undefined\arc
@@ -3410,35 +3444,77 @@
% \end{macrocode}
% \end{macro}
%
-% \subsubsection{Lines and polygons}
-% \label{sec:implementation:lines-polygons}
+% \subsubsection{Line, Vector, polyline, polyvector, and polygon}
+% \label{sec:implementation:polyline-polyvector}
%
+% \changes{v0.3e}{2020/06/20}{Added \cmd{\Vector} and \cmd{\polyvector}
+% suggested by FMi. (RN)}
% \begin{macro}{\Line}
% \begin{macro}{\polyline}
+% \begin{macro}{\Vector}
+% \begin{macro}{\polyvector}
% \begin{macro}{\polygon}
-% We use recursive macros for \cmd{\polyline} and \cmd{\polygon}.
+% We use recursive macros for \cmd{\polyline}, \cmd{\polyvector}, and \cmd{\polygon}.
% \begin{macrocode}
\let\lp@r( \let\rp@r)
\def\Line(#1,#2)(#3,#4){\polyline(#1,#2)(#3,#4)}
\def\polyline(#1,#2){%
\@killglue
- \pIIe@moveto{#1\unitlength}{#2\unitlength}%
+ \@defaultunitsset\pIIe@tempdima{#1}\unitlength
+ \@defaultunitsset\pIIe@tempdimb{#2}\unitlength
+ \pIIe@moveto{\pIIe@tempdima}{\pIIe@tempdimb}%
\@ifnextchar\lp@r{\@polyline}{\PackageWarning{pict2e}%
{Polygonal lines require at least two vertices!}%
\ignorespaces}}
\def\@polyline(#1,#2){%
- \pIIe@lineto{#1\unitlength}{#2\unitlength}%
+ \@defaultunitsset\pIIe@tempdima{#1}\unitlength
+ \@defaultunitsset\pIIe@tempdimb{#2}\unitlength
+ \pIIe@lineto{\pIIe@tempdima}{\pIIe@tempdimb}%
\@ifnextchar\lp@r{\@polyline}{\pIIe@strokeGraph\ignorespaces}}
+ \def\Vector(#1,#2)(#3,#4){\polyvector(#1,#2)(#3,#4)}
+ \def\polyvector(#1,#2){%
+ \@killglue
+ \@ifnextchar\lp@r{\begingroup\@polyvector(#1,#2)}{%
+ \PackageWarning{pict2e}%
+ {Polygonal vectors require at least two vertices!}\ignorespaces}}
+ \def\@polyvector(#1,#2)(#3,#4){%
+% \end{macrocode}
+% See the similar definition for \cmd{\vector} (\ref{sec:implementation:vector})
+% \begin{macrocode}
+ \@defaultunitsset\pIIe@tempdima{#1}\unitlength
+ \@defaultunitsset\pIIe@tempdimb{#2}\unitlength
+ \@defaultunitsset\pIIe@tempdimc{#3}\unitlength
+ \@defaultunitsset\pIIe@tempdimd{#4}\unitlength
+ \advance\pIIe@tempdimc-\pIIe@tempdima \advance\pIIe@tempdimd-\pIIe@tempdimb
+ \ifdim\pIIe@tempdimc=\z@ \@linelen\pIIe@tempdimd \else
+ \ifdim\pIIe@tempdimd=\z@ \@linelen\pIIe@tempdimc \else
+ \pIIe@pyth\pIIe@tempdimc\pIIe@tempdimd\@linelen
+ \fi
+ \fi
+ \ifdim\@linelen<\z@ \@linelen-\@linelen\fi
+ \pIIe@divide{\pIIe@tempdimc}\@linelen\pIIe@tempdime
+ \pIIe@divide{\pIIe@tempdimd}\@linelen\pIIe@tempdimf
+% \end{macrocode}
+% Note the shift to the previous point in addition to the rotation.
+% \begin{macrocode}
+ \pIIe@concat\pIIe@tempdime\pIIe@tempdimf{-\pIIe@tempdimf}\pIIe@tempdime\pIIe@tempdima\pIIe@tempdimb
+ \pIIe@vector \pIIe@fillGraph
+ \@ifnextchar\lp@r{\@polyvector(#3,#4)}{\endgroup\ignorespaces}}
\def\polygon{%
\@killglue
\@ifstar{\begingroup\@tempswatrue\@polygon}%
{\begingroup\@tempswafalse\@polygon}}
\def\@polygon(#1,#2){%
- \pIIe@moveto{#1\unitlength}{#2\unitlength}%
+ \@defaultunitsset\pIIe@tempdima{#1}\unitlength
+ \@defaultunitsset\pIIe@tempdimb{#2}\unitlength
+ \pIIe@moveto{\pIIe@tempdima}{\pIIe@tempdimb}%
\@ifnextchar\lp@r{\@@polygon}{\PackageWarning{pict2e}%
{Polygons require at least two vertices!}%
\ignorespaces}}
- \def\@@polygon(#1,#2){\pIIe@lineto{#1\unitlength}{#2\unitlength}%
+ \def\@@polygon(#1,#2){%
+ \@defaultunitsset\pIIe@tempdima{#1}\unitlength
+ \@defaultunitsset\pIIe@tempdimb{#2}\unitlength
+ \pIIe@lineto{\pIIe@tempdima}{\pIIe@tempdimb}%
\@ifnextchar\lp@r{\@@polygon}{\pIIe@closepath
\if@tempswa\pIIe@fillGraph\else\pIIe@strokeGraph\fi
\endgroup
@@ -3447,6 +3523,8 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \subsubsection{Path commands}
% \label{sec:implementation:path-commands}
@@ -3462,20 +3540,33 @@
% \begin{macrocode}
\def\moveto(#1,#2){%
\@killglue
- \pIIe@moveto{#1\unitlength}{#2\unitlength}%
+ \@defaultunitsset\pIIe@tempdima{#1}\unitlength
+ \@defaultunitsset\pIIe@tempdimb{#2}\unitlength
+ \pIIe@moveto{\pIIe@tempdima}{\pIIe@tempdimb}%
\ignorespaces}
\def\lineto(#1,#2){%
\@killglue
- \pIIe@lineto{#1\unitlength}{#2\unitlength}%
+ \@defaultunitsset\pIIe@tempdima{#1}\unitlength
+ \@defaultunitsset\pIIe@tempdimb{#2}\unitlength
+ \pIIe@lineto{\pIIe@tempdima}{\pIIe@tempdimb}%
\ignorespaces}
\def\curveto(#1,#2)(#3,#4)(#5,#6){%
\@killglue
- \pIIe@curveto{#1\unitlength}{#2\unitlength}{#3\unitlength}{#4\unitlength}%
- {#5\unitlength}{#6\unitlength}%
+ \@defaultunitsset\pIIe@tempdima{#1}\unitlength
+ \@defaultunitsset\pIIe@tempdimb{#2}\unitlength
+ \@defaultunitsset\pIIe@tempdimc{#3}\unitlength
+ \@defaultunitsset\pIIe@tempdimd{#4}\unitlength
+ \@defaultunitsset\pIIe@tempdime{#5}\unitlength
+ \@defaultunitsset\pIIe@tempdimf{#6}\unitlength
+ \pIIe@curveto{\pIIe@tempdima}{\pIIe@tempdimb}{\pIIe@tempdimc}%
+ {\pIIe@tempdimd}{\pIIe@tempdime}{\pIIe@tempdimf}%
\ignorespaces}
\newcommand*\circlearc[6][0]{%
\@killglue
- \pIIe@arc[#1]{#2\unitlength}{#3\unitlength}{#4\unitlength}{#5}{#6}%
+ \@defaultunitsset\pIIe@tempdima{#2}\unitlength
+ \@defaultunitsset\pIIe@tempdimb{#3}\unitlength
+ \@defaultunitsset\pIIe@tempdimc{#4}\unitlength
+ \pIIe@arc[#1]{\pIIe@tempdima}{\pIIe@tempdimb}{\pIIe@tempdimc}{#5}{#6}%
\ignorespaces}
\def\closepath{\pIIe@closepath}
\def\strokepath{\pIIe@strokeGraph}
@@ -3561,9 +3652,17 @@
\def\pIIe@@cbezier#1)#2(#3)#4(#5)#6({\@cbezier#1)(#3)(#5)(}%
\def\@cbezier[#1](#2,#3)(#4,#5)(#6,#7)(#8,#9){%
\@killglue
- \pIIe@moveto{#2\unitlength}{#3\unitlength}%
- \pIIe@curveto{#4\unitlength}{#5\unitlength}%
- {#6\unitlength}{#7\unitlength}{#8\unitlength}{#9\unitlength}%
+ \@defaultunitsset\pIIe@tempdima{#2}\unitlength
+ \@defaultunitsset\pIIe@tempdimb{#3}\unitlength
+ \pIIe@moveto{\pIIe@tempdima}{\pIIe@tempdimb}%
+ \@defaultunitsset\pIIe@tempdima{#4}\unitlength
+ \@defaultunitsset\pIIe@tempdimb{#5}\unitlength
+ \@defaultunitsset\pIIe@tempdimc{#6}\unitlength
+ \@defaultunitsset\pIIe@tempdimd{#7}\unitlength
+ \@defaultunitsset\pIIe@tempdime{#8}\unitlength
+ \@defaultunitsset\pIIe@tempdimf{#9}\unitlength
+ \pIIe@curveto{\pIIe@tempdima}{\pIIe@tempdimb}{\pIIe@tempdimc}%
+ {\pIIe@tempdimd}{\pIIe@tempdime}{\pIIe@tempdimf}%
\pIIe@strokeGraph
\ignorespaces}%
}
diff --git a/Master/texmf-dist/source/latex/picture/picture.dtx b/Master/texmf-dist/source/latex/picture/picture.dtx
index 56cd8c8c477..7ffced525a0 100644
--- a/Master/texmf-dist/source/latex/picture/picture.dtx
+++ b/Master/texmf-dist/source/latex/picture/picture.dtx
@@ -1,12 +1,12 @@
% \iffalse meta-comment
%
% File: picture.dtx
-% Version: 2019/12/09 v1.5
+% Version: 2020-04-22 v1.6
% Info: Dimens for picture macros
%
% Copyright (C)
% 2006-2009 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
+% 2016-2020 Oberdiek Package Support Group
% https://github.com/ho-tex/picture/issues
%
% This work may be distributed and/or modified under the
@@ -81,7 +81,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: picture 2019/12/09 v1.5 Dimens for picture macros (HO)}
+\Msg{* Package: picture 2020-04-22 v1.6 Dimens for picture macros (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -93,11 +93,11 @@
This is a generated file.
Project: picture
-Version: 2019/12/09 v1.5
+Version: 2020-04-22 v1.6
Copyright (C)
2006-2009 Heiko Oberdiek
- 2016-2019 Oberdiek Package Support Group
+ 2016-2020 Oberdiek Package Support Group
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -157,7 +157,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{picture.drv}%
- [2019/12/09 v1.5 Dimens for picture macros (HO)]%
+ [2020-04-22 v1.6 Dimens for picture macros (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}[2011/11/22]
\begin{document}
@@ -171,7 +171,7 @@ and the derived files
% \GetFileInfo{picture.drv}
%
% \title{The \xpackage{picture} package}
-% \date{2019/12/09 v1.5}
+% \date{2020-04-22 v1.6}
% \author{Heiko Oberdiek\thanks
% {Please report any issues at \url{https://github.com/ho-tex/picture/issues}}}
%
@@ -268,7 +268,7 @@ and the derived files
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{picture}%
- [2019/12/09 v1.5 Dimens for picture macros (HO)]%
+ [2020-04-22 v1.6 Dimens for picture macros (HO)]%
% \end{macrocode}
%
% \subsection{Options}
@@ -546,6 +546,23 @@ and the derived files
}
% \end{macrocode}
%
+% \subsubsection{Package \xpackage{pict2e}}
+% Additions suggested in https://github.com/ho-tex/picture/issues/1
+% \begin{macrocode}
+\@ifpackageloaded{pict2e}{%
+ \AtBeginDocument{%
+ \picture@redefine\@cbezier{[#1](&2,&3)(&4,&5)(&6,&7)(&8,&9)}%
+ }
+ \picture@redefine\pIIe@arc@@{(#1,#2)&3}
+ \picture@redefine\polyline{(&1,&2)}
+ \picture@redefine\@polyline{(&1,&2)}
+ \picture@redefine\@polygon{(&1,&2)}
+ \picture@redefine\@@polygon{(&1,&2)}
+ \picture@redefine\moveto{(&1,&2)}
+ \picture@redefine\lineto{(&1,&2)}
+ \picture@redefine\curveto{(&1,&2)(&3,&4)(&5,&6)}
+}{}
+% \end{macrocode}
% \subsection{Check package loading order}
%
% \begin{macro}{\PC@checkpackage}
@@ -764,6 +781,9 @@ and the derived files
% \item
% Documentation updates.
% \end{Version}
+% \begin{Version}{2020-04-22 v1.6}
+% \item Added definitions for pict2e (https://github.com/ho-tex/picture/issues/1)
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/pm-isomath/pm-isomath.dtx b/Master/texmf-dist/source/latex/pm-isomath/pm-isomath.dtx
index 1db0734bd7b..106ca10d1dd 100644
--- a/Master/texmf-dist/source/latex/pm-isomath/pm-isomath.dtx
+++ b/Master/texmf-dist/source/latex/pm-isomath/pm-isomath.dtx
@@ -8,7 +8,7 @@
\preamble
______________________________________________________
The PM-ISOmath bundle
- Copyright (C) 2017 Claudio Beccari
+ Copyright (C) 2017-2020 Claudio Beccari
All rights reserved
License information appended
@@ -16,16 +16,15 @@
\endpreamble
\postamble
-Copyright 2017 Claudio Beccari
Distributable under the LaTeX Project Public License,
version 1.3c or higher (your choice). The latest version of
this license is at: http://www.latex-project.org/lppl.txt
-This work is "author-maintained"
+This work is "maintained"
-This work consists of this file pm-isomath.dtx, a README file
-the manifest.txt file, and the derived files:
+This work consists of this file pm-isomath.dtx, a README.txt file
+ and the derived files:
pm-isomath.sty, pm-isomath.pdf.
\endpostamble
@@ -33,6 +32,7 @@ the manifest.txt file, and the derived files:
\askforoverwritefalse
\generate{\file{pm-isomath.sty}{\from{pm-isomath.dtx}{style}}
+% \file{README.txt}{\from{pm-isomath.dtx}{txt}}
}
\def\tmpa{plain}
@@ -40,27 +40,11 @@ the manifest.txt file, and the derived files:
\endgroup
%</internal>
%
-% Copyright 2017 Claudio Beccari
+% Copyright 2017-2020 Claudio Beccari
%
% This file is part of the PM-ISOmath bundle
% -------------------------------------------
%
-% It 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
-% http://www.latex-project.org/lppl.txt
-% and version 1.3c or later is part of all distributions of LaTeX
-% version 2003/12/01 or later.
-%
-% This file has the LPPL maintenance status "author-maintained".
-%
-% The list of all files belonging to the PM-ISOmath bundle is
-% given in the file `manifest.txt'.
-%
-% The set of derived (unpacked) files belonging to the distribution
-% and covered by LPPL is created by the self unpacking file
-% pm-isomath.dtx which is the principal part of the distribution.
%
% \fi
%
@@ -71,10 +55,12 @@ the manifest.txt file, and the derived files:
\ProvidesFile{pm-isomath.dtx}[%
%</driver>
%<style>\ProvidesPackage{pm-isomath}[%
-%<*driver,style>
-2018/01/12 v.1.0.04
+%<txt>\ProvidesFile{README.txt}[%
+%<*driver,style,txt>
+ 2020/11/06 v.1.0.07
+%<txt> README file for pm-isomath.sty]
%<style>Poor man package for typesetting ISO compliant math when using pdfLaTeX]
-%</driver,style>
+%</driver,style,txt>
%<*driver>
]
%</driver>
@@ -88,7 +74,7 @@ the manifest.txt file, and the derived files:
\usepackage{metalogo,multicol,enumitem,url,booktabs}
\usepackage[utf8]{inputenc}
\usepackage[LGR,T1]{fontenc}
-\usepackage{lmodern}
+\usepackage{lmodern,textcomp}
\usepackage{pm-isomath}
\let\originalmeta\meta
\renewcommand\meta[1]{{\normalfont\originalmeta{#1}}}
@@ -117,7 +103,7 @@ the manifest.txt file, and the derived files:
%</driver>
% \fi
%
-% ^^A \CheckSum{}%
+% \CheckSum{436}%
% \begin{abstract}
% The ISO regulations for typesetting math in the field of physics
% and technology are pretty stringent and imply legal questions
@@ -142,10 +128,10 @@ the manifest.txt file, and the derived files:
% \section{Introduction}
% The ISO regulations (formerly ISO\,31/XI, now ISO\,80000) are
% stringent rules to typeset mathematics in the domains of physics
-% and applied sciences; their title explicitly mentions ``physics
-% and technology'', but their careful reading lets understand that
-% they apply to all sciences that use the ``mathematics of
-% quantities''. Such entities form a special group or space,
+% and applied sciences; their title explicitly mentions “physics
+% and technology”, but their careful reading lets understand that
+% they apply to all sciences that use the “mathematics of
+% quantities”. Such entities form a special group or space,
% where the elements are couples of two ordered entities $(x, y)$,
% where $y$ represents the unit of measure and $x$ represents the
% ratio of the quantity to the unit of measure. Such paired
@@ -168,9 +154,9 @@ the manifest.txt file, and the derived files:
% explain which symbol is used for which quantity. This is
% where the ISO regulations set some order and establish
% a long list of named quantities with their preferred symbols
-% and their ``normal'' units according to the prescriptions
+% and their “normal” units according to the prescriptions
% of the Comité International des Pois et Mésures, that
-% established the the International System of measures
+% established the International System of measures
% (Systhème International, SI).
%
% This ISO nomenclature is used uniformly by most, if not all,
@@ -210,7 +196,7 @@ the manifest.txt file, and the derived files:
% rules for writing text about mathematics and metrology. It
% is extremely valuable for anglophones, but, with the due
% differences concerning the mother languages, it is extremely
-% useful also for people using other languages than English.
+% useful also for people using languages different from English.
%
% \section{The \pdfLaTeX\ handicaps}
% Users of \pdfLaTeX, on the opposite are in trouble. In facts
@@ -271,7 +257,7 @@ the manifest.txt file, and the derived files:
% Several authors provided packages to help users produce
% perfect documents that fulfil the ISO regulations; I would
% like to cite the excellent Package |ISOmath| by Günter Milde,
-% entitled ``Mathematical style for science and technology''.
+% entitled “Mathematical style for science and technology”.
% It should be the perfect package to use in order to fulfil
% the ISO regulations; sometimes it succeeds with excellent
% results, but more often than not the results are just partial,
@@ -314,13 +300,13 @@ the manifest.txt file, and the derived files:
% is allowed, but serifed italics should be preferred unless
% the ISO rules prescribe a sans serif font. This implies that
% the differential symbol be in upright font to avoid confusion
-% with the physical quantity $d$; the Napier number `e' must be
+% with the physical quantity $d$; the Napier number ‘e’ must be
% set in upright font to avoid confusion with the elementary
% electric charge $e$; the imaginary unit j in electrical
% engineering, (i in other applied sciences) must be set in
% upright font in order to avoid confusion with the electric
% current density $j$ or the electric current $i$; more
-% difficult: the transcendental number $\ISOpi=3.14159\dots$
+% difficult: the transcendental number $\ISOpi=3.14159\dots$
% should be distinguished from the plane angle $\pi$; and similar
% other numerical constants represented by Latin or Greek letters.
% \item
@@ -334,7 +320,7 @@ the manifest.txt file, and the derived files:
% subscript $i$ is a variable because it represents the $i$-th
% element in a sequence, such as $V_0, V_1, V_2, \dots$; on
% the opposite $V_{\mathrm{i}}$ the subscript is an apposition
-% because `i' means, say, `input'.
+% because `i' means, say, ‘input’.
% \item
% Upright bold roman or black board bold symbols represent sets.
% \item
@@ -345,7 +331,7 @@ the manifest.txt file, and the derived files:
% ones are reserved for vectors; but in some sciences also vectors
% may have uppercase letters. Geometrical vectors that might be
% typeset with a medium series upper o lowercase italic letter
-% with an arrow on top of it are nor treated by the ISO
+% with an arrow on top of it are not treated by the ISO
% regulations that speak of vectors irrespective if they are
% considered as one column matrices or oriented segments;
% apparently oriented segments should be treated the same as
@@ -390,7 +376,7 @@ the manifest.txt file, and the derived files:
% Greek letters, especially those packages for French typography,
% where the national rules (in contrast with the ISO regulations)
% require that all math entities typeset with Greek letters be
-% upright. Among these the |fourier| and the |kpfonts|. Other
+% upright. Among such packages therenare |fourier| and |kpfonts|. Other
% packages such as |newpxmath| and |newtxmath| are intended for
% general use, but with suitable options and extra math groups
% let the user employ upright lowercase Greek letters as well as
@@ -428,7 +414,7 @@ the manifest.txt file, and the derived files:
% are the Latin Modern ones that allow a piecewise continuous
% scaling of any available particular font of the collection.
%
-% Needless to say, this poor man solution has advantages and
+% It goes without saying that this poor man solution has advantages and
% disadvantages over the other indicated solutions.
%
% The main advantage is that no math groups are involved,
@@ -436,7 +422,7 @@ the manifest.txt file, and the derived files:
% series and shape that family allows; the default
% family for Greek fonts are the Latin Modern compliant
% LGR encoded collection of CBfonts; they are always
-% available with any updated and complete \TeX\ system
+% available with any up to date and complete \TeX\ system
% installation.
%
% This is also a disadvantage, in the sense that Latin Modern
@@ -448,7 +434,7 @@ the manifest.txt file, and the derived files:
%
% Nevertheless they work very well with the ISO regulations
% and in spite of the disadvantages listed above, they are
-% usable without problems. 'This very documentation is typeset
+% usable without problems. This very documentation is typeset
% with Latin Modern fonts. The examples shown in a following
% section show the ease with which the ISO regulations may be
% fulfilled.
@@ -492,7 +478,12 @@ the manifest.txt file, and the derived files:
% specified with \marg{family}\oarg{series}\parg{shape} are all
% optional, including the first one in spite of being surrounded
% by curly braces. In both cases the default values for each
-% argument are respectively |lmr|, |m|, and |n| (normal upright).
+% argument are respectively |lmr|, |m|, and |n| (normal, upright).
+% Notice the codes: |lmr|, |m|, and |n| are the codes that appear in
+% the |.fd| file to declare the possible family, series, and shape
+% combinations available for a given family. Below further
+% information is given in table~\ref{tab:lmr-series-shapes} on
+% page~\pageref{tab:lmr-series-shapes}, and how to discover these codes.
%
% Such default values, after loading |pm-isomath|, may be globally
% redefined by using in the preamble:
@@ -502,17 +493,17 @@ the manifest.txt file, and the derived files:
%\cs{renewcommand}\Marg{ISOsha}\marg{shape}
%\end{ttsintassi}
% We discourage this global redefinitions unless the user really
-% knows what s/he is doing; in practice it must be checked that
+% knows what s/he is doing; in practice it must be checked that
% T1 encoded families and LGR encoded ones have the same family
% names. If the encoding+family|.fd| files are not available
-% either they have to be created, or such default values should
+% either they have to be created, or such default values should
% not be redefined.
%
% For Latin letters to use in the |\MathLatin| command mandatory
% argument there are no problems.
%
-% For Greek letters you might use |\MathGreek| and the math lette
-%r commands |\alpha|, |\beta|,\dots, |\Omega| commands, but it is
+% For Greek letters you might use |\MathGreek| and the math letter
+% commands |\alpha|, |\beta|,\dots, |\Omega| commands, but it is
% much simpler to avoid|\MathGreek| and
% use the package commands |\ISOalpha|, |\ISObeta|,\dots,
% |\ISOOmega|. All these commands follow the syntax:
@@ -542,7 +533,7 @@ the manifest.txt file, and the derived files:
% for the |\ohm| unit of measure and the |\micro| SI prefix;
% this latter macro uses a special shape of the CBfonts where
% an upright shape with serifed lowercase Greek letters is
-% available; if another family lacking this shape is being used,
+% available; if another family, lacking this shape, is being used,
% then the normal upright shape is used. In typesetting this
% documentation, evidently there are no problems, but with other
% font selections, especially with Greek fonts, there might be
@@ -554,7 +545,7 @@ the manifest.txt file, and the derived files:
%
% \section{Examples}
% \subparagraph{ISO Greek letters}
-% In example represented in table~\ref{tab:isoletters} we typeset
+% In the examples represented in table~\ref{tab:isoletters}, we typeset
% an array in math mode, where we show all the Greek letters that
% can be typeset with the \cs{ISO}\meta{lettername} macros; the
% array is typeset in normal math style, but the ISO letters are
@@ -567,25 +558,25 @@ the manifest.txt file, and the derived files:
%\begin{table}[!tb]
%\def\T#1{\cs{ISO#1} & \csuse{ISO#1}[bx]}
%\[\begin{array}{lclclclc}
-%\T{alpha} & \T{beta} &
-%\T{gamma} & \T{delta} \\
-%\T{epsilon} & \T{zeta} &
-%\T{eta} & \T{theta} \\
-%\T{iota} & \T{kappa} &
-%\T{lambda} & \T{mu} \\
-%\T{nu} & \T{xi} &
-%\T{omicron}& \T{pi} \\
-%\T{rho} & \T{sigma} &
-%\T{tau} & \T{upsilon} \\
-%\T{phi} & \T{chi} &
-%\T{psi} & \T{omega} \\
-%\T{Gamma} & \T{Delta} &
-%\T{Eta} & \T{Theta} \\
-%\T{Lambda} & \T{Xi} &
-%\T{Pi} & \T{Rho} \\
-%\T{Sigma} & \T{Upsilon} &
-%\T{Phi} & \T{Chi} \\
-%&&\T{Psi} & \T{Omega}
+%\T{alpha} & \T{beta} &
+%\T{gamma} & \T{delta} \\
+%\T{epsilon} & \T{zeta} &
+%\T{eta} & \T{theta} \\
+%\T{iota} & \T{kappa} &
+%\T{lambda} & \T{mu} \\
+%\T{nu} & \T{xi} &
+%\T{omicron} & \T{pi} \\
+%\T{rho} & \T{sigma} &
+%\T{tau} & \T{upsilon} \\
+%\T{phi} & \T{chi} &
+%\T{psi} & \T{omega} \\
+%\T{Gamma} & \T{Delta} &
+%\T{Eta} & \T{Theta} \\
+%\T{Lambda} & \T{Xi} &
+%\T{Pi} & \T{Rho} \\
+%\T{Sigma} & \T{Upsilon} &
+%\T{Phi} & \T{Chi} \\
+%&&\T{Psi} & \T{Omega}
%\end{array}\]
%\caption{The \cs{ISO}\meta{letter} macros and their rendering in bold style}
%\label{tab:isoletters}
@@ -600,7 +591,7 @@ the manifest.txt file, and the derived files:
% The resistivity of copper is $1.68\,\micro\ohm\,\mathrm{cm}$ (in text mode: 1.68\unit{\micro\ohm\,cm})
% is typeset with the following code
%\begin{verbatim}
-%$i.68\,\micro\ohm\,\mathrm{cm}$ (in text mode: 1.68\unit{\micro\ohm\,cm})
+%$1.68\,\micro\ohm\,\mathrm{cm}$ (in text mode: 1.68\unit{\micro\ohm\,cm})
%\end{verbatim}
%\subparagraph{A tensor}
%\[ \vectorsymbol{D} =\epsilon_0\tensorsymbol{\epsilon}\ped{r}\vectorsymbol{E}\]
@@ -697,8 +688,8 @@ the manifest.txt file, and the derived files:
% loading mechanism assures avoiding conflicts if packages are
% loaded without options; this is why if one of the three packages
% is loaded after this one but with some option specified, an
-% ``Option clash"" error flag is raised; this is where the
-% ``weak'' loading error becomes a very ``strong'' one.
+% “Option clash” error flag is raised; this is where the
+% “weak” loading error becomes a very “strong” one.
%\iffalse
%<*style>
@@ -735,12 +726,12 @@ the manifest.txt file, and the derived files:
% \end{macrocode}
% Actually this package accepts an option: |engineer|. This
% option is for deciding if the imaginary unit should be
-% defined as `i' or `j'. As we have remarked in the previous
+% defined as ‘i’ or ‘j’. As we have remarked in the previous
% documentation, engineers, especially those who deal with
% electricity and electrical quantities, but also electronics, control
-% and telecommunications engineers, use only `j'; all these
+% and telecommunications engineers, use ‘j’; all these
% varieties of engineers could not do anything in their profession
-% if they don't use complex numbers and quantities (the latter
+% if they don't use complex numbers and quantities (the latter
% called phasors). Possibly they are the applied scientists
% who use complex numbers more than any other scientist.
% Note: this option has \emph{not} been used to prepare this
@@ -802,10 +793,10 @@ the manifest.txt file, and the derived files:
% the default family is the Latin Modern regular (or roman);
% the series is medium and the shape is normal (or upright).
% The codes used are the same used in the font description
-% files with extension |.fd|. Their name is obtained by merging
-% the encoding name with the family name; Therefore the default
-% font description file for Latin characters is |t1lmr.fd|,
-% while the one for Greek characters is |lgrlmr.fd|; these
+% files with extension |.fd|. The name of these |.fd| files
+% is obtained by merging the encoding name with the family name;
+% therefore the default font description file for Latin characters
+% is |t1lmr.fd| while the one for Greek characters is |lgrlmr.fd|; these
% files define the series they contain and that are identified
% with codes such as |m| (medium); |bx| (bold extended);
% |b| (bold). Other fonts, with different series may have
@@ -817,7 +808,7 @@ the manifest.txt file, and the derived files:
% We should not care for the font names, but in order to use
% different font families, series, and shapes the user should
% know their codes. this is generally a difficult task, but
-% not impossible; it ``suffices'' to open the packages that
+% not impossible; it “suffices” to open the packages that
% allow to use the desired fonts, read the code and find out
% the names of the |.fd| files; then search these files on the
% trees of the \TeX\ system, and eventually find out the
@@ -843,18 +834,18 @@ the manifest.txt file, and the derived files:
% & & upright italics & ui & upright italics& ui \\
% & & small caps & sc & small caps & sc \\
%\midrule
-% bold & b & & & lipsian & li \\
-% & & normal & n & & \\
-% & & slanted & sl & & \\
+% bold & b & & & lipsian & li \\
+% & & normal & n & & \\
+% & & slanted & sl & & \\
%\midrule
-% bold extended& bx & normal & n & normal & n \\
-% & & italics & it & italics & it \\
-% & & slanted & sl & slanted & sl \\
-% & & & & lipsian & li \\
-% & & & & serif & rs \\
-% & & & & serif oblique & rs \\
-% & & & & upright italics & ui \\
-% & & & & small caps & sc \\
+% bold extended& bx & normal & n & normal & n \\
+% & & italics & it & italics & it \\
+% & & slanted & sl & slanted & sl \\
+% & & & & lipsian & li \\
+% & & & & serif & rs \\
+% & & & & serif oblique & rs \\
+% & & & & upright italics & ui \\
+% & & & & small caps & sc \\
%\bottomrule
%\end{tabular}
%\caption{Seres and shapes available with the Latin Modern regular family with Latin and Greek fonts}
@@ -982,17 +973,19 @@ the manifest.txt file, and the derived files:
% any math group), and sans serif in both normal and bold
% slanted shape.
% \begin{macrocode}
-\newcommand\mathbfit[1]{\MathLatin{#1}{lmr}[bx](it)}
-\newcommand\mathsfit[1]{\MathLatin{#1}{lmss}[m](sl)}
-\newcommand\mathsfbfit[1]{\MathLatin{#1}{lmss}[bx](sl)}
+\AtBeginDocument{%
+\providecommand\mathbfit[1]{\MathLatin{#1}{lmr}[bx](it)}
+\providecommand\mathsfit[1]{\MathLatin{#1}{lmss}[m](sl)}
+\providecommand\mathsfbfit[1]{\MathLatin{#1}{lmss}[bx](sl)}}
% \end{macrocode}
% Package |ISOmath| defines macros for typesetting vectors,
% matrices and tensors; we do the same, but avoid the
% abbreviation |sym| in place of |symbol|.
% \begin{macrocode}
+\AtBeginDocument{%
\let\vectorsymbol\mathbfit
\let\matrixsymbol\mathbfit
-\let\tensorsymbol\mathsfbfit
+\let\tensorsymbol\mathsfbfit}
% \end{macrocode}
%
% We now define some macros for setting some elements in the
@@ -1009,10 +1002,10 @@ the manifest.txt file, and the derived files:
% commands |\iunit| and |\junit| are still available to the
% user.
%
-% The Napier number `e' is defined in roman type, but as an
+% The Napier number ‘e’ is defined in roman type, but as an
% operator; this number is not an operator in the mathematical
% sense, but it is most often used as the base of an exponential;
-% therefore such math ``atom'' must be treated as an
+% therefore such math “atom” must be treated as an
% operator as well as when the official operator macro |\exp|
% is used.
%
@@ -1028,7 +1021,7 @@ the manifest.txt file, and the derived files:
%
% The differential symbol is not an operator, but it requires
% a special treatment; a macro |\diff| for the differential
-% symbol uses an empty`operator' and a negative shift to typeset
+% symbol uses an empty `operator' and a negative shift to typeset
% an upright letter `d' with an operator spacing on its left,
% so that proper spacing is used in math typesetting; notice
% that the given definition does not perform as the direct
@@ -1040,7 +1033,7 @@ the manifest.txt file, and the derived files:
% The command |\unit| for appending the units of measure to
% the numerical value of the measure is added if no packages
% have already defined it; package |siunitx| is a particularly
-% recommended one. Similar considerations hold true for the
+% recommended one. Similar considerations hold true for the
% |\ap| and |\ped| (apex and pedex, respectively; i.e\
% superscript and subscript); therefore such command definitions
% are deferred to the start of the document so as to be sure
@@ -1076,13 +1069,16 @@ the manifest.txt file, and the derived files:
\renewcommand*\diff{\ensuremath{\mathop{}\!\MathLatin{d}(n)}}
%
\providecommand*\micro{}
-\renewcommand*\micro{\textormath{\ifcsdef{textmicro}%
-{\textmicro}{\ISOmu(rs)}}{\ISOmu(rs)}}
-%
+\AtBeginDocument{\@ifpackageloaded{textcomp}%
+ {\renewcommand*\micro{\textormath{\textmu}{\ISOmu(rs)}}}%
+ {\renewcommand*\micro{\ISOmu(rs)}}%
+}
+%
\providecommand*\ohm{}
-\AtBeginDocument{\@ifpackageloaded{textcomp}{%
-\renewcommand*\ohm{\textormath{{\textohm}}{\ISOOmega(n)}}}%
-{\renewcommand*\ohm{\textormath{\ISOOmega(\f@shape)}{\ISOOmega(n)}}}}
+\AtBeginDocument{\@ifpackageloaded{textcomp}%
+ {\renewcommand*\ohm{\textormath{{\textohm}}{\ISOOmega(n)}}}%
+ {\renewcommand*\ohm{\ISOOmega(n)}}%
+}
%
\global\csletcs{bbl@it@ped}{undefined}
\global\csletcs{bbl@it@ap}{undefined}
@@ -1112,6 +1108,30 @@ the manifest.txt file, and the derived files:
%\iffalse
%</style>
%\fi
+%\iffalse
+%<*txt>
+%\fi
+% \begin{macrocode}
+
+ This bundle has the LPPL maintenance status "author-maintained".
+
+ The list of all files belonging to the PM-ISOmath bundle is
+ pm-isomath.dtx, a README.txt file
+ with the derived files: pm-isomath.sty, pm-isomath.pdf.
+
+ The set of derived (unpacked) files belonging to the distribution
+ and covered by LPPL is created by the self unpacking file
+ pm-isomath.dtx which is the principal part of the distribution.
+
+ In the TDS composed of various branches they should be in the
+ following folders:
+ .../tex/latex/pm-isomath/ contains pm-isomath.sty
+ .../doc/latex/pm-isomath/ contains pm-isomath.pdf and README.txt
+ .../source/latex/pm-isomath contians pm-isomath.dtx
+% \end{macrocode}
+%\iffalse
+%</txt>
+%\fi
%\Finale
% \endinput \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/poemscol/poemscol.dtx b/Master/texmf-dist/source/latex/poemscol/poemscol.dtx
index 5794a2d575d..5f1b81d4af7 100644
--- a/Master/texmf-dist/source/latex/poemscol/poemscol.dtx
+++ b/Master/texmf-dist/source/latex/poemscol/poemscol.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
% !TEX TS-program = dtxmk
%
-% Copyright (C) 2002-2019 by John Burt <burt@brandeis.edu>
+% Copyright (C) 2002-2020 by John Burt <burt@brandeis.edu>
% --------------------------------------------------
%
% This file may be distributed and/or modified under the
@@ -23,7 +23,7 @@
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[1997/12/01]
%<package>\ProvidesPackage{poemscol}
-%<package> [2019/10/29 v3.141 poemscol file]
+%<package> [2020/06/12 v3.1415926 poemscol file]
%
%<*driver>
\documentclass{ltxdoc}
@@ -38,7 +38,7 @@
%</driver>
% \fi
%
-% \CheckSum{9964}
+% \CheckSum{10704}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -243,7 +243,7 @@
% attributions, and so on with the left margin of the verse block.}
% \changes{v3.01}{2019/08/04}{Corrections to manual}
% \changes{v3.04}{2019/08/18}{Appendix sections. New contents entries.}
-% \changes{v3.08}{2019/09/03}{Indentations of species of titles in text can be independenttly changed without changing the
+% \changes{v3.08}{2019/09/03}{Indentations of species of titles in text can be independently changed without changing the
% definition of the title. Appendix and Foreword section titles can be indented differently from notes section titles. }
% \changes{v3.081}{2019/09/05}{Fixed centertitles bug for subsections}
% \changes{v3.09}{2019/09/06}{New schemes for titles. Titles can be placed
@@ -255,7 +255,7 @@
% shortpoemattribution, JHshortepigraph, JHshortdedication. These
% commands are controlled by the same booleans that control placement
% of titles.}
-% \changes{v3.12}{2019/09/05}{Bug fix. Fix command clash with titlesec Manual revision}
+% \changes{v3.12}{2019/09/05}{Bug fix. Fix command clash with titlesec. Manual revision}
% \changes{v3.13}{2019/09/15}{Fixed subtitles in emendations and explanations, Fixed bug in sequencesectiontitlefirstline, changed sequence hierarchy of indentations, subsubsections of sequences no longer appear in contents}
% \changes{v3.14}{2019/09/27}{Bug fix: ifpagenumberinnotesfalse, Manual revision}
% \changes{v3.141}{2019/10/27}{Manual revisions. Fixed spacing of sentence and
@@ -263,6 +263,17 @@
% sections numbered by paragraph and sentence. You can suppress the appearance of the
% first sentence number, whether in the margin or in the running text. You can suppress
% the appearance of the first paragraph number, whether in the margin or in the running text.}
+% \changes{v3.1415}{2020/05/25}{Changed controlling how to place
+% marginal marks in JHpoemtitle and its siblings, and in JHtextnote
+% and its siblings. Marginal marks are now set using their own inserts, rather than using marginpar.}
+% \changes{v3.14159}{2020/06/02}{Marginal marks set by JHpoemtitle now work with the different
+% title placement schemes.}
+% \changes{v3.141592}{2020/06/12}{Special commands for titles with footnotes (where the footnotes
+% are authorial and part of the title). Title footnotes can be set at the bottom of the page, like
+% traditional footnotes, at the bottom of the page like ``Layered'' footnotes, or at the
+% end of the poem. Marginal marks set by JHpoemtitle can be placed
+% independently of the marginal marks produced by margreftextnote..}
+% \changes{v3.1415926}{2020/08/08}{Bug fix. Extra white space problem. Thanks to David Carlisle.}
% \DoNotIndex{\newcommand,\newenvironment,\def,\edef,\else,\renewcommand,\makeatletter,\makeatother}
% \DoNotIndex{\abovedisplayskip,\belowdisplayskip,\abovedisplayshortskip,\belowdisplayshortskip}
% \DoNotIndex{\newcommand, \section, \subsection, \subsubsection,
@@ -295,15 +306,15 @@
% \textsc, \unskip}
% \setcounter{IndexColumns}{2}
% \MakeShortVerb{|}
-% \def\fileversion{3.141}
-% \def\filedate{29 October 2019}
-% \def\docdate{29 October 2019}
+% \def\fileversion{3.1415926}
+% \def\filedate{8 August 2020}
+% \def\docdate{8 August 2020}
% \title{Typesetting Poetry Collections with
% \textsf{poemscol}\thanks{This document corresponds to
% \textsf{poemscol}~\fileversion, dated \filedate.}}
% \author{John Burt
% \\ \texttt{burt@brandeis.edu}}
-% \date{29 October 2019}
+% \date{8 August 2020}
% \maketitle
% \begin{abstract} \textsf{poemscol} provides commands for \LaTeX\ for
% setting collections of poetry. It is especially suited for setting
@@ -556,15 +567,6 @@
% the style packages that do. I use \textsf{crop}, with the
% letter,pdftex,cam, and center options.
%
-% \subsection{~Poem titles with marginal references}
-% If
-% you are using the |\JHpoemtitle| alternate form of the |\poemtitle|
-% command, you need to add \textsf{mparhack} to your package list, to
-% make sure that the marginal references |\JHpoemtitle| adds appear on
-% the correct side of the page. You should make sure that
-% \textsf{poemscol} is the very last package you load in your
-% preamble, or at least is loaded after those packages upon which it
-% depends.
%
%
%
@@ -632,6 +634,18 @@
% the meaning of |\ifleftaligntitles| ambiguous. So I have changed that boolean to
% |\iftitlesatleftmarginofcenteredblock.|\end{sloppypar}
%
+% Up to version 3.141 the marginal marks associated with poem titles
+% set by |\JHpoemtitle| and |\margreftextnote| moved in towards the
+% verse block when the verse block is centered on the longest line.
+% These marks could be returned to their normal position in the
+% margin by setting the boolean |\margrefstomargin| to true. As of
+% version 3.141 these marks are set in the margin by default even
+% when verse block centering is in effect. The boolean |\margrefstomargin| controls
+% nothing, but has been left in case I decide to restore the possibility
+% of moving the marginal marks in when the lines are centered. You can control
+% the horizontal placement of these marginal marks by changing the value
+% of the length |\JHmarginparsep|.
+%
% \section{Marking up individual poems}
% First, a word about the command names. The command names may seem
% ugly and long. And there are separate commands for many tasks that
@@ -2282,7 +2296,8 @@
% range of line numbers of the lemma. To define a footnote called
% |\mynote|, first declare new footnote |\footnoteE| (A, B, C and D
% are reserved for sources, textual notes, emendations, and explanatory notes,
-% respectively). Then issue: \begin{verbatim}
+% respectively, and H is reserved for use for titles with
+% authorial footnotes). Then issue: \begin{verbatim}
% \newcommand{\mynote}[2][0]{\setlemmarange{#1}\\
% \FootnotetextE{\citerange}{#2}
% \resetlemmacounters} \end{verbatim}
@@ -2757,15 +2772,18 @@
% takes two arguments: first, the title of the poem, second, the label
% used by the |\label| command on the page of the notes section to
% which the title refers. So, you would issue the poem title command
-% this way: |\JHpoemtitle{Los desvelados}{EP_LosDesvelados_AC}|. Up to
+% this way: |\JHpoemtitle{Los desvelados}{EP_LosDesvelados_AC}|.
+%
+% (Up to
% version 2.49 of \textsf{poemscol} you had to be sure to define the
% label in the notes sections by issuing
% |\literaltextnote{\label{EP_LosDesvelados_AC}}|. This is no longer
% necessary, and |\JHpoemtitle| defines both the |\label| and the
-% |\pageref|. Instructions are given in section \ref{JHpoemtitle},
+% |\pageref|.)
+%
+% Instructions are given in section \ref{JHpoemtitle},
% p.~\pageref{JHpoemtitle} for how to construct similar commands for
% sequences, sequence sections, and so on.
-%
% The following related commands are defined already:
% \begin{itemize}
% \item |\JHsequencetitle| \item |\JHsequencefirstsectiontitle|
@@ -2774,20 +2792,11 @@
% \item |\JHpoemsubtitle| \item |\JHepigraph| \item |\JHprosesectiontitle|
% \item |\JHdedication| \end{itemize}
%
-% If you are using |\JHpoemtitle| and its siblings, you need to be
-% sure to add \textsf{mparhack} to your package list. You can prevent
-% the marginal reference from switching sides on alternate pages by issuing
-% |\@mparswitchfalse| (be sure to put |\makeatletter| and
-% |\makeatother| around this command). You can control the side on
-% which the marginal reference appears with |\normalmarginpar| (to
-% place them on the right) or |\reversemarginpar| (to place them on
-% the left). |\JHpoemtitle| and its siblings place the marginal
-% reference using |\marginpar|.
%
% \DescribeMacro{\setmargpoemtitle}
% |\setmargpoemtitle| is a more general version of
% |\JHpoemtitle|, with the second argument being any commands you
-% want to be issued while the title is being processed.
+% want to be issued just after the title is processed.
%
% \DescribeMacro{\margreftextnote}\label{margreftextnote}
% Another feature of Altenberg's Heredia edition is a marginal mark
@@ -2803,24 +2812,57 @@
% |\margreftextnote| generates its own label, so there is no need to
% make up one yourself.
%
-% |\margreftextnote| uses |\marginpar| rather
-% than |\pmclsidepar| to set the note, because I had to use
-% |\marginpar| for |\JHpoemtitle| and its siblings, and I wanted the
-% whole family of markers to be controlled by the same settings. You
-% use the settings that control the behavior of |\marginpar| (e.g.\
-% |\mparswitch| and |\reversemarginpar|) to control the behavior of
-% these marks.
-%
-% By default these marginal references are placed in the right margin. If you
-% are centering the verse block on the longest line, the marginal references
-% will move in closer to the line. (To center the verse block on the longest line,
-% see section \ref{centeringtextblock}.) If you would prefer to keep the marginal
-% references in the margin, set the boolean |\margrefstomargin| true.
+%\begin{sloppy}
+% |\margreftextnote| and its siblings use a
+% new kind of insert, |\JHmarginpar|, to set the marginal marks.
+% This is so that you can control the placement of these marks
+% independently of how you place the line numbers (which use
+% |\pmclsidepar|) or other marginal marks you may define using
+% |\marginpar|.
+%
+% Horizontal placement of the mark is controlled by the
+% length |\JHmarginparsep|, which is set by default to 0 pt. Vertical
+% placement of the marginal mark for a textual note, relative to the baseline, is set by
+% the length |\JHmarginparvshift|, which is set by default to 0 pt.
+% The horizontal placement of the
+% marginal mark set by |\JHpoemtitle|, and its siblings, however,
+% is controlled by the length |\JHtitlemarginparsep|. |\JHtitlemarginparsep|
+% is set by default to value of |\JHmarginparsep|,
+% so that the two
+% kinds of mark
+% should align with each other by default.
+% \end{sloppy}
+%
+% By default these marginal references are placed in the right
+% margin. If you wish to set them in the left margin, issue the
+% command |\JHmarksleft|. If you wish to place them back into the
+% right margin, issue the command |\JHmarksright|.
+% If you wish the
+% marks to aways be in the outer margin, issue the command
+% |\JHmarksouter|. If you wish the marks to always be in the inner
+% margin, issue |\JHmarksgutter|. (The marks for titles and the marks for
+% notes always appear on the same side of the page, and the different |\JHmarks| commands
+% always move both kinds of mark.)
+%
+% If you are centering the verse block on the longest line, the verse
+% line numbers normally move in towards the verse block. (To center
+% the verse block on the longest line, see section
+% \ref{centeringtextblock}.) The marginal
+% marks for |\margeftextnote| do not do this, since they are designed to
+% line up with the marginal mark produced by |\JHpoemtitle|. You can change
+% the alignment if you wish by changing the value of either the length |\JHmarginparsep|,
+% which controls the placement of marginal marks for notes, or changing the value
+% of the length |\JHtitlemarginparsep|, which controls the placement of the marginal
+% marks for titles.
%
% \begin{sloppypar}
% If you define a new endnote type using |\definenewnotetype|,
% |\definenewnotetype| will also define a new |\margref| command to go
-% with it.\end{sloppypar}
+% with it. So, for example, if you define a new note type called
+% |\mynote|, you will automatically also define a ``margref'' command
+% called |\margrefmynote| which will place a mark in the margin with
+% a label showing where in the end notes sections the text of that
+% |\mynote| can be found. \end{sloppypar}
%
% \DescribeMacro{\setmargrefmarker} Altenberg's edition used a ding
% from the pifonts collection in the marginal marks made by
@@ -2829,12 +2871,76 @@
% choose another mark using |\setmargrefmarker| (e.g.\
% |\setmargrefmarker{\ding{228}}|).
%
+% \DescribeMacro{\settitlemargrefmarker} Altenberg's edition also used a
+% different marker for marginal marks for the titles of poems from that used
+% for marginal marks made by |\margreftextnote|. By default that marker
+% is |\dag|, but you can change it by using |\settitlemargrefmarker|,
+%
% \DescribeMacro{\margrefemendation} |\margrefemendation| is a
% version of |\margreftextnote| for emendations.
%
% \DescribeMacro{\margrefexplanatory}|\margrefexplanatory| is a
% version of |\margreftextnote| for explanatory notes.
%
+% \subsection{~Titles with footnotes}
+% In James Benstead's edition of the collected poems of Hugh
+% MacDiarmid, many of the titles of the poems have footnotes by the
+% author. Under most circumstances, one can put a note about the title
+% in the textual notes section simply by, after the |\begin{poem}|
+% command, issuing something like this: |\literaltextnote{title] text of note}|.
+% (One can make similar notes for the explanatory notes
+% section or for the emendations section.) But MacDiarmid's notes are
+% authorial, not editorial, and should be considered part of the
+% title. At the same time, the notes should not be printed in the Table
+% of Contents, nor for that matter in the endnotes sections.
+%
+% \DescribeMacro{\footnotepoemtitle} |\footnotepoemtitle| is for the default
+% case. It takes two arguments. The first argument is the title of
+% the poem. The second is the text of the footnote.
+%
+% \begin{sloppypar}
+% \DescribeMacro{\footnotepoemtitlefirstline}
+% |\footnotepoemtitlefirstline| |\footnotepoemtitlemiddleline| and
+% |\footnotepoemtitlelastline| are for long titles in which how the
+% author broke up the title on the page matters, and one or more of
+% the lines has a footnote. These commands also take two arguments,
+% of which the first is the title line and the second is the text of
+% the footnote. You can intersperse these commands with
+% |\poemtitlefirstline|
+% |\poemtitlemiddleline| or |\poemtitlelastline| (depending on which
+% line has the footnote). The lines will be broken in the same way in
+% the text and in the table of contents. \end{sloppypar}
+%
+% \DescribeMacro{\footnotesplitpoemtitle} |\footnotesplitpoemtitle|
+% is for the most general case. Use it if there is a footnote in the middle
+% of the title, or if you have a long title and don't need to ensure
+% that it is broken in the text and in the table of contents in the
+% same way. |\footnotesplitpoemtitle| takes three arguments. The first
+% argument is the first part of the title, up to the footnote mark,
+% the second is the text of the footnote, and the third is the rest
+% of the title.
+%
+% I have not created footnoted titles for sequences, sequence
+% sections, and so on. But if you compare how those titles are
+% defined in the implementation section below and how footnoted
+% titles are defined at \ref{footnotetitles}
+% (page \pageref{footnotetitles}), how to write those commands should be clear.
+%
+% You can control where the footnotes for footnoted titles are placed.
+% By default, those footnotes are conventional footnotes (and all
+% their parameters are set in the way normal \LaTeX\ footnotes are
+% set). You can force the default setting by issuing the command
+% |\maketitlefootnotesplain| in your preamble. If you are setting
+% your textual notes or other notes at the foot of the page using
+% ``layers'' of footnotes, you can treat these footnotes as just
+% another layer by issuing the command |\maketitlefootnoteslayered| in
+% your preamble. (``Layered'' footnotes are described at section \ref{makingfootnotes},
+% page \pageref{makingfootnotes}.) If you wish to place these footnotes at the end of
+% the poem, you must issue |\maketitlefootnotesatpoemend| in the
+% preamble. Just before you declare a title with a footnote, issue
+% |\makepoemendnotes|, and just after issuing |\end{poem}| for that
+% poem, issue |\putpoemendnotes|.
+%
% \subsection{~Empty poem titles and italicized poem titles}
%
% \DescribeMacro{\poemtitlenotitle}
@@ -5579,16 +5685,16 @@
\nolinebreak\incrementverselinenumber%
\fi%
\speciallinelockfalse%
-\nolinebreak\\
+\nolinebreak\\%
}
% \newif\iflongpoemon
% \longpoemonfalse
\newcommand{\incrementverselinenumber}{%
\nolinebreak\addtocounter{verselinenumber}{1}%
%\iflongpoemon\marksthe{verselinemark}{\theverselinenumber}\fi%
-\makeatletter
- \@ifundefined{marksthe}{\relax}{\marksthe{verselinemark}{\theverselinenumber}}
-\makeatother
+%\makeatletter
+ \@ifundefined{marksthe}{\relax}{\marksthe{verselinemark}{\theverselinenumber}}%
+%\makeatother
\addtocounter{printlineindex}{1}%
\ifnum\theprintlineindex>\thelineindexrepeat%
\ifverselinenumbers\nobreak%
@@ -7090,6 +7196,7 @@
\newcommand{\interjectiontitlemiddleline}[1]{
\sequencefirstsubsectionmiddleline{#1}
}
+% \subsubsection{Titles and Notes with marginal marks}
% \end{macrocode}
% \begin{macro}{\setmargpoemtitle}
% Titles with a marginal reference to the notes giving the page in
@@ -7100,6 +7207,266 @@
% |\setmargpoemtitle| with the second argument passed to |\JHlabel|,
% which actually makes the marginal mark.
% \begin{macrocode}
+\newlength{\JHtextwidth}
+\setlength{\JHtextwidth}{\textwidth}
+\newlength{\JHmarginparsep}
+\setlength{\JHmarginparsep}{0pt}
+\newlength{\JHmarginparvshift}
+\setlength{\JHmarginparvshift}{0pt}
+\newlength{\JHmarginparwidth}
+\setlength{\JHmarginparwidth}{\marginparwidth}
+\newlength{\JHmarginparsepmin}
+\setlength{\JHmarginparsepmin}{\marginparsepmin}
+\newlength{\JHtitlemarginparsep}%
+\setlength{\JHtitlemarginparsep}{\JHmarginparsep}%
+\newif{\ifJHmarkstoleft}
+\JHmarkstolefttrue
+\newif{\ifJHmarkstoright}
+\JHmarkstorightfalse
+\newif{\ifJHmarkstoouter}
+\JHmarkstoouterfalse
+\newif{\ifJHmarkstogutter}
+\JHmarkstogutterfalse
+\newif{\ifJHmarginparswitch}
+\JHmarginparswitchfalse
+\newif{\ifJHreversemarginpar}
+\JHreversemarginparfalse
+\newcommand{\JHmarksleft}{%
+\JHmarkstolefttrue%
+\JHmarkstorightfalse%
+\JHmarkstoouterfalse%
+\JHmarkstogutterfalse%
+\JHmarginparswitchfalse%
+\JHreversemarginparfalse%
+\reversemarginpar
+}
+\newcommand{\JHmarksright}{%
+\JHmarkstoleftfalse%
+\JHmarkstorighttrue%
+\JHmarkstoouterfalse%
+\JHmarkstogutterfalse%
+\JHmarginparswitchfalse%
+\JHreversemarginparfalse%
+\normalmarginpar
+}
+% JHmarksright is the default
+\JHmarksright
+\newcommand{\JHmarksouter}{%
+\JHmarkstoleftfalse%
+\JHmarkstorightfalse%
+\JHmarkstooutertrue%
+\JHmarkstogutterfalse%
+\JHmarginparswitchtrue%
+\JHreversemarginparfalse%
+\@mparswitchtrue
+}
+\newcommand{\JHmarksgutter}{%
+\JHmarkstoleftfalse%
+\JHmarkstorightfalse%
+\JHmarkstoouterfalse%
+\JHmarkstoguttertrue%
+\JHmarginparswitchtrue%
+\JHreversemarginpartrue%
+\@mparswitchtrue
+\reversemarginpar
+}
+% jhrightmarginpar command for notes % right side
+\newcommand{\JHrightmarginpar}[1]{%
+\pmclbsphack\strut\vadjust{%
+\rlap{\kern-\parindent%
+\kern\JHtextwidth\kern\JHmarginparsep% at right
+\setbox0=\vtop to 0pt{% added
+\begin{minipage}[t]{\JHmarginparwidth}% added
+#1%
+\end{minipage}%
+\vss}%
+\vtop to 0pt{\kern\JHmarginparvshift% default should be 0pt
+\kern-\dp\strutbox \kern-\ht0 \box0 \vss}}}\pmclesphack}%
+% jhleftmarginpar command for notes % left side
+\newcommand{\JHleftmarginpar}[1]{%
+\pmclbsphack\strut\vadjust{% changed
+\rlap{\kern-\parindent%
+\kern -\JHmarginparsep \kern -\JHmarginparwidth% at left
+\setbox0=\vtop to 0pt{
+\begin{minipage}[t]{\JHmarginparwidth}% added
+#1%
+\end{minipage}%
+\vss}% changed
+\vtop to 0pt{\kern\JHmarginparvshift % default should be 0pt
+\kern-\dp\strutbox \kern-\ht0 \box0 \vss}}}\pmclesphack}% changed
+%
+%\newcommand{\JHoutermarginpar}{%
+%%\marginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}
+%\checkoddpage%
+%\ifoddpage%
+%\JHrightmarginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}%
+%\else% below is for even pages
+%\JHleftmarginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}%
+%\fi%
+%}
+\newcommand{\JHoutermarginpar}{%
+%\marginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}
+\strictpagechecktrue%
+\checkoddpage%
+\ifoddpage%
+\JHswitchmarginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}%
+\else% below is for even pages
+\JHswitchmarginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}%
+\fi%
+}
+%
+%\newcommand{\JHguttermarginpar}{%
+%%\marginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}
+%\checkoddpage%
+%\ifoddpage%
+% \JHleftmarginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}%
+%\else% below is for even pages
+% \JHrightmarginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}%
+%\fi%
+%}
+%
+\newcommand{\JHguttermarginpar}{%
+\strictpagechecktrue
+\checkoddpage%
+\ifoddpage%
+\JHswitchmarginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}%
+\else% below is for even pages
+\JHswitchmarginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}%
+\fi%
+}
+%
+% jhswitchmarginpar command for notes in gutter and outer
+%
+\newcommand{\JHswitchmarginpar}{\@dblarg{\@JHswitchmarginpar}}
+%\long\def\@pmclsidepar[#1]#2{\@bsphack\leavevmode\vadjust{%
+\long\def\@JHswitchmarginpar[#1]#2{\@bsphack\strut\vadjust{% added
+\checkoddpage
+ \ifJHmarginparswitch
+ \ifJHreversemarginpar
+ \ifoddpage
+ \oddpagefalse
+ \else
+ \oddpagetrue
+ \fi
+ \fi
+ \else
+ \oddpagetrue
+ \ifJHreversemarginpar
+ \oddpagefalse
+ \fi
+ \fi
+ \rlap{\kern-\parindent
+ \if@twocolumn
+ \if@firstcolumn % put at left
+ \kern -\JHmarginparsep \kern -\JHmarginparwidth % at left
+ \else % put at right
+ \kern \columnwidth \kern \JHmarginparsep % at right
+ \fi
+ \else
+ \ifoddpage % put at right
+ \kern \textwidth \kern \JHmarginparsep % at right
+ \else % put at left
+ \kern -\JHmarginparsep \kern -\JHmarginparwidth % at left
+ \fi
+ \fi
+% \vbox to 0pt{%
+% \kern \JHmarginparvshift% % vertical shift to align top text lines
+% \begin{minipage}{\JHmarginparwidth}%
+ \setbox0=\vtop to 0pt{% added
+ \begin{minipage}[t]{\JHmarginparwidth}% added
+ \ifoddpage #2\else #1\fi%
+ \end{minipage}%
+% \vss}}}\@esphack}
+\vss}% added
+ \vtop to 0pt{\kern\JHmarginparvshift % default should be 0pt
+ \kern-\dp\strutbox \kern-\ht0 \box0 \vss}}}\@esphack}% added
+%
+% commands for placing the marginal marks for titles
+% right side
+\newcommand{\JHrighttitlemarginpar}[1]{%
+\pmclbsphack\strut\vadjust{%
+\rlap{\kern-\parindent%
+\kern\textwidth\kern\JHtitlemarginparsep% at right
+\ifcentertitleson%
+\kern-.5\JHtextwidth\kern\marginparsepmin%
+\fi%
+\setbox0=\vtop to 0pt{% added
+\begin{minipage}[t]{\JHmarginparwidth}% added
+#1%
+\end{minipage}%
+\vss}%
+\vtop to 0pt{\kern\JHmarginparvshift% default should be 0pt
+\kern-\dp\strutbox \kern-\ht0 \box0 \vss}}}\pmclesphack}%
+%
+% commands for placing the marginal marks for titles
+% left side
+\newcommand{\JHlefttitlemarginpar}[1]{%
+\pmclbsphack\strut\vadjust{% changed
+\rlap{\kern-\parindent%
+\kern -\JHtitlemarginparsep \kern -\JHmarginparwidth% at left
+\ifcentertitleson%
+\kern-.5\JHtextwidth\kern\marginparsepmin%
+\fi%
+\setbox0=\vtop to 0pt{%
+\begin{minipage}[t]{\JHmarginparwidth}% added
+#1%
+\end{minipage}%
+\vss}% changed
+\vtop to 0pt{\kern\JHmarginparvshift % default should be 0pt
+\kern-\dp\strutbox \kern-\ht0 \box0 \vss}}}\pmclesphack}% changed
+%
+% command for JHtitlemarks in title in outer margin or in gutter
+\newcommand{\JHswitchtitlemarginpar}{\@dblarg{\@JHswitchtitlemarginpar}}
+%\long\def\@pmclsidepar[#1]#2{\@bsphack\leavevmode\vadjust{%
+\long\def\@JHswitchtitlemarginpar[#1]#2{\@bsphack\strut\vadjust{% added
+\checkoddpage%
+ \ifJHmarginparswitch%
+ \ifJHreversemarginpar%
+ \ifoddpage%
+ \oddpagefalse%
+ \else%
+ \oddpagetrue%
+ \fi%
+ \fi%
+ \else%
+ \oddpagetrue%
+ \ifJHreversemarginpar%
+ \oddpagefalse%
+ \fi%
+ \fi%
+ \rlap{\kern-\parindent%
+ \if@twocolumn%
+ \if@firstcolumn % put at left
+ \kern -\JHtitlemarginparsep \kern -\marginparwidth % at left
+ \kern-.5\JHtextwidth\kern\marginparsepmin%
+ \else % put at right
+ \kern \columnwidth \kern \JHtitlemarginparsep % at right
+ \fi%
+ \else%
+ \ifoddpage % put at right
+ \kern \textwidth \kern \JHtitlemarginparsep % at right
+ \ifcentertitleson%
+ \kern-.5\JHtextwidth\kern\marginparsepmin%
+ \fi%
+ \else % put at left
+ \kern -\JHtitlemarginparsep \kern -\marginparwidth % at left
+ \ifcentertitleson%
+ \kern-.5\JHtextwidth\kern\marginparsepmin%
+ \fi%
+ \fi%
+ \fi%
+% \vbox to 0pt{%
+% \kern \pmclsideparvshift% % vertical shift to align top text lines
+% \begin{minipage}{\marginparwidth}%
+ \setbox0=\vtop to 0pt{% added
+ \begin{minipage}[t]{\marginparwidth}% added
+ \ifoddpage #2\else #1\fi%
+ \end{minipage}%
+% \vss}}}\@esphack}
+\vss}% added
+ \vtop to 0pt{\kern\JHmarginparvshift % default should be 0pt
+ \kern-\dp\strutbox \kern-\ht0 \box0 \vss}}}\@esphack}% added
+ %
\newcommand{\set@margp@emtitle}[7]{\setlength{\titleentryoverrun}{#6}%
{#2}%
{#3 \begin{titleentryenvironment}%
@@ -7144,6 +7511,7 @@
% \newcommand{\JHpoemtitle}[2]{%
% \setmargpoemtitle{#1}{\JHlabel{#2}}%
% }
+\@mparswitchfalse % so the title marker won't switch sides on alternate pages
\newcommand{\JHpoemtitle}[2]{%
\set@margp@emtitle{#1}{\poemtitlepenalty}{\poemtitlefont}%
{\sequencetitleindent}{\nobreak\par\nobreak\afterpoemtitleskip\nobreak}{\z@}%
@@ -7162,8 +7530,23 @@
\t@xtnotesinfo{#1}%
\sources{\label{#2}}%
}
+%\newcommand{\JHlabel}[1]{%
+%\marginpar{{\scriptsize{\the\titlemargrefmarker~p.~\pageref{#1}}}}}
\newcommand{\JHlabel}[1]{%
-\marginpar{{\scriptsize{\the\margrefmarker~p.~\pageref{#1}}}}}
+\ifJHmarkstoright\JHrighttitlemarginpar
+{{\scriptsize{\the\margrefmarker~p.~\pageref{#1}}}}
+\fi
+\ifJHmarkstoleft
+\JHlefttitlemarginpar{{\scriptsize{\the\margrefmarker~p.~\pageref{#1}}}}
+\fi
+\ifJHmarkstoouter
+\JHswitchtitlemarginpar{{\scriptsize{\the\margrefmarker~p.~\pageref{#1}}}}
+\fi
+\ifJHmarkstogutter
+\JHswitchtitlemarginpar{{\scriptsize{\the\margrefmarker~p.~\pageref{#1}}}}
+\fi
+}
+
% \end{macrocode}
% \end{macro}
% \begin{macro}{\JHsequencetitle} Macros to set marginal page
@@ -7265,12 +7648,34 @@
\newtoks{\margrefmarker}
\margrefmarker={\dag}
\newcommand{\setmargrefmarker}[1]{\margrefmarker={#1}}
+\providecommand{\settitlemargrefmarker}[1]{\titlemargrefmarker={#1}}
+\newtoks{\titlemargrefmarker}
+\titlemargrefmarker={\dag}
\newcommand{\makemargreflabel}{\string\label\string{margref\themargrefnumber\string}}
\newif{\ifmargrefstomargin}
-\margrefstomarginfalse
-\newcommand{\setmargref}
-{\marginpar{\ifmargrefstomargin\hspace*{.5\leftmargin}\fi\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}
+\margrefstomargintrue
+\newcommand{\setmargref}{\nolinebreak\begin{marginenvironment}%
+\nolinebreak%
+\ifJHmarkstoright%
+ \JHrightmarginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}%
+\fi%
+\ifJHmarkstoleft%
+ \JHleftmarginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}%
+ \fi%
+ \ifJHmarkstoouter%
+ \JHoutermarginpar%
+ \fi%
+ \ifJHmarkstogutter%
+ \JHguttermarginpar%
+ \fi%
+ \end{marginenvironment}%
+ \nolinebreak%
}
+
+%\newcommand{\setmargref}
+%{\marginpar{\ifmargrefstomargin\hspace*{.5\leftmargin}\fi%
+%\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}
+%}
% \newcommand{\setmargref}
% {\marginpar{\scriptsize {\the\margrefmarker~p.~\pageref{margref\themargrefnumber}}}
% }
@@ -7326,6 +7731,105 @@
% }
% \catcode`\@=12
% \end{verbatim}
+% \subsection{~Titles with footnotes}
+% \label{footnotetitles}
+% \begin{macro}{\footnotepoemtitle}
+% \begin{macrocode}
+\newif\iftitlefootnotesatpoemend%
+\titlefootnotesatpoemendfalse%
+\newif\iftitlefootnotesplain%
+\titlefootnotesplaintrue%
+\newif\iftitlefootnoteslayered%
+\titlefootnoteslayeredfalse%
+%
+\newcommand{\maketitlefootnoteslayered}{%
+\DeclareNewFootnote[plain]{H}%
+\titlefootnoteslayeredtrue%
+\titlefootnotesplainfalse%
+\titlefootnotesatpoemendfalse%
+}
+%
+\newcommand{\maketitlefootnotesatpoemend}{
+\titlefootnoteslayeredfalse%
+\titlefootnotesplainfalse%
+\titlefootnotesatpoemendtrue%
+}
+%
+\newcommand{\maketitlefootnotesplain}{
+\titlefootnoteslayeredfalse%
+\titlefootnotesplaintrue%
+\titlefootnotesatpoemendfalse%
+}
+%
+\newcommand{\placetitlefootnote}[1]{\iftitlefootnoteslayered%
+\footnoteH{#1}%
+\fi%
+\iftitlefootnotesatpoemend%
+\footnotemark%
+\immediate\write\poemendnotes{\string\makeatletter}%
+\immediate\write\poemendnotes{\string\footnotemark\string[\the\c@footnote \string]}%
+\immediate\write\poemendnotes{\string\makeatother}%
+\literalpoemendnote{#1}%
+\fi%
+\iftitlefootnotesplain%
+\footnote{#1}%
+\fi%
+}
+%
+\newcommand{\footnotepoemtitle}[2]{%
+\set@p@emtitle{#1\placetitlefootnote{#2}}{\poemtitlepenalty}{\poemtitlefont}%
+{\poemtitleindent}{\nobreak\par\nobreak\afterpoemtitleskip\nobreak}{\z@}%
+\c@ntentsinfo{#1}{\contentspoemtitleindent}{\contentspoemtitlefont}%
+{\contentspoemtitleindentamount}%
+\t@xtnotesinfo{#1}%
+}
+%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\footnotepoemtitlefirstline}
+% \begin{macrocode}
+\newcommand{\footnotepoemtitlefirstline}[2]{%
+\firstlinesettings%
+\set@p@emtitle{#1\placetitlefootnote{#2}}{\multilinetitlepenalty}{\poemtitlefont}%
+{\poemtitleindent}{\nobreak\par\nobreak}{\z@}%
+\c@ntentsinfo{#1}{\contentspoemtitleindent}{\contentspoemtitlefont}%
+{\contentspoemtitleindentamount}%
+\t@xtnotesinfo{#1}%
+\restoresinglelinesettings%
+}
+%
+\newcommand{\footnotepoemtitlemiddleline}[2]{%
+\middlelinesettings%
+\set@p@emtitle{#1\placetitlefootnote{#2}}{\par\nobreak}{\poemtitlefont}%
+{\poemtitlesecondlineindent}{\nobreak\par\nobreak}{\z@}%
+\c@ntentsinfo{#1}{\contentspoemtitlesecondlineindent}{\contentspoemtitlefont}%
+{\contentspoemtitlesecondlineindentamount}%
+\t@xtnotesinfo{#1}%
+\restoresinglelinesettings%
+}
+%
+\newcommand{\footnotepoemtitlelastline}[2]{%
+\lastlinesettings%
+\set@p@emtitle{#1\placetitlefootnote{#2}}{\par\nobreak}{\poemtitlefont}%
+{\poemtitlesecondlineindent}{\nobreak\par\afterpoemtitleskip\nobreak}{\z@}%
+\c@ntentsinfo{#1}{\contentspoemtitlesecondlineindent}{\contentspoemtitlefont}%
+{\contentspoemtitlesecondlineindentamount}%
+\t@xtnotesinfo{#1}%
+\restoresinglelinesettings%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\footnotesplitpoemtitle}
+% \begin{macrocode}
+\newcommand{\footnotesplitpoemtitle}[3]{%
+\set@p@emtitle{#1\placetitlefootnote{#2} #3}{\poemtitlepenalty}{\poemtitlefont}%
+{\poemtitleindent}{\nobreak\par\nobreak\afterpoemtitleskip\nobreak}{\z@}%
+\c@ntentsinfo{#1 #3}{\contentspoemtitleindent}{\contentspoemtitlefont}%
+{\contentspoemtitleindentamount}%
+\t@xtnotesinfo{#1 #3}%
+}
+% \end{macrocode}
+% \end{macro}
% \subsection{~Epigraphs, headnotes, attributions, dedications}
% Notice that epigraphs to volumes are handled differently from
% epigraphs to poems. Notice also the ``short'' commands, which
@@ -7419,6 +7923,17 @@
\else\setlength{\dateindent}{\leftmargin}%
\fi%
\bigskip\begin{raggedleft}\hspace{\dateindent}#1\end{raggedleft}\bigskip}%
+%
+\newlength{\poemattributionindent}%
+\setlength{\poemattributionindent}{\leftmargin}%
+\newcommand{\variablepoemattributionindent}{%
+\setlength{\poemattributionindent}{\linewidth}%
+\addtolength{\poemattributionindent}{-\versewidth}%
+\addtolength{\poemattributionindent}{-.5\poemattributionindent}}%
+\newcommand{\poemattribution}[1]{\iflastpoemcentered\variablepoemattributionindent%
+\else\setlength{\poemattributionindent}{\leftmargin}%
+\fi%
+\bigskip\begin{raggedleft}\hspace{\poemattributionindent}#1\end{raggedleft}\bigskip}%
% \end{macrocode}
% \end{macro}
% \end{macro}
diff --git a/Master/texmf-dist/source/latex/polyglossia/polyglossia.dtx b/Master/texmf-dist/source/latex/polyglossia/polyglossia.dtx
index ad0a94e9491..12ab0b4ce0e 100644
--- a/Master/texmf-dist/source/latex/polyglossia/polyglossia.dtx
+++ b/Master/texmf-dist/source/latex/polyglossia/polyglossia.dtx
@@ -1,6 +1,6 @@
%\iffalse
% polyglossia.dtx generated using mkpolyglossiadtx.pl
-% (derived from makedtx.pl version 0.94b (c) Nicola Talbot)
+% (derived from makedtx.pl version 1.49 (c) Nicola Talbot)
%
% To extract the files, use xetex polyglossia.dtx or luatex polyglossia.dtx
%
@@ -8,20 +8,12 @@
\iffalse
%</internal>
%<*README>
+# THE POLYGLOSSIA PACKAGE v1.51
+## Multilingual typesetting with XeLaTeX and LuaLaTeX
- ¦----------------------------------------------¦
- ¦ ¦
- ¦ THE POLYGLOSSIA PACKAGE v1.48 ¦
- ¦ ¦
- ¦ Modern multilingual typesetting ¦
- ¦ with XeLaTeX and LuaLaTeX ¦
- ¦ ¦
- ¦----------------------------------------------¦
-
-This package provides an alternative to Babel for users of XeLaTeX and LuaLaTeX
-(with a few languages incompletely supported for the latter). This version
-includes support for over 70 different languages, some of which in different
-regional or national varieties, or using a different writing system.
+This package provides an alternative to Babel for users of XeLaTeX and LuaLaTeX.
+This version includes support for over 70 different languages, some of which in
+different regional or national varieties, or using a different writing system.
Polyglossia makes it possible to automate the following tasks:
@@ -42,7 +34,7 @@ Polyglossia makes it possible to automate the following tasks:
written from right to left (via the packages bidi and luabidi, available
separately).
-LICENSE
+# LICENCE
Copyright (c) 2008-2010 François Charette, 2013 Élie Roux, 2011-2020 Arthur Reutenauer,
Copyright (c) 2019-2020 Bastien Roucariès, 2019-2020 Jürgen Spitzmüller
@@ -50,7 +42,7 @@ Copyright (c) 2019-2020 Bastien Roucariès, 2019-2020 Jürgen Spitzmüller
Except where otherwise noted, Polyglossia is placed under the terms of the MIT licence
(https://opensource.org/licenses/MIT).
-BUGS
+# BUGS
If you run into a bug, or suspect you do, or you have a request or comment, please
use the GitHub issue tracker: http://github.com/reutenauer/polyglossia/issues
@@ -74,8 +66,10 @@ to track the issues and follow progress.
The polyglossia package
(C) 2008–2010 François Charette
- (C) 2011-2020 Arthur Reutenauer
+ (C) 2011–2020 Arthur Reutenauer
(C) 2013 Elie Roux
+ (C) 2019 Bastien Roucariès
+ (C) 2019–2020 Jürgen Spitzmüller
License information appended
@@ -100,6 +94,21 @@ to track the issues and follow progress.
\endpostamble
\let\MetaPrefix\DoubleperCent
\askforoverwritefalse
+\generate{\file{polyglossia.sty}{\from{polyglossia.dtx}{polyglossia.sty}}}
+\generate{\file{farsical.sty}{\from{polyglossia.dtx}{farsical.sty}}}
+\generate{\file{hebrewcal.sty}{\from{polyglossia.dtx}{hebrewcal.sty}}}
+\generate{\file{hijrical.sty}{\from{polyglossia.dtx}{hijrical.sty}}}
+\generate{\file{polyglossia-french.lua}{\from{polyglossia.dtx}{polyglossia-french.lua}}}
+\generate{\file{polyglossia-korean.lua}{\from{polyglossia.dtx}{polyglossia-korean.lua}}}
+\generate{\file{polyglossia-latin.lua}{\from{polyglossia.dtx}{polyglossia-latin.lua}}}
+\generate{\file{polyglossia-punct.lua}{\from{polyglossia.dtx}{polyglossia-punct.lua}}}
+\generate{\file{polyglossia-sanskrit.lua}{\from{polyglossia.dtx}{polyglossia-sanskrit.lua}}}
+\generate{\file{polyglossia-tibt.lua}{\from{polyglossia.dtx}{polyglossia-tibt.lua}}}
+\generate{\file{polyglossia.lua}{\from{polyglossia.dtx}{polyglossia.lua}}}
+\generate{\file{babel-hebrewalph.def}{\from{polyglossia.dtx}{babel-hebrewalph.def}}}
+\generate{\file{babelsh.def}{\from{polyglossia.dtx}{babelsh.def}}}
+\generate{\file{cal-util.def}{\from{polyglossia.dtx}{cal-util.def}}}
+\generate{\file{xgreek-fixes.def}{\from{polyglossia.dtx}{xgreek-fixes.def}}}
\generate{\file{gloss-acadien.ldf}{\from{polyglossia.dtx}{gloss-acadien.ldf}}}
\generate{\file{gloss-aeb.ldf}{\from{polyglossia.dtx}{gloss-aeb.ldf}}}
\generate{\file{gloss-af.ldf}{\from{polyglossia.dtx}{gloss-af.ldf}}}
@@ -351,11 +360,11 @@ to track the issues and follow progress.
%<*internal>
\generate{\file{polyglossia.ins}{\from{polyglossia.dtx}{batchfile}}}
\nopreamble\nopostamble
-\generate{\file{../README}{\from{polyglossia.dtx}{../README}}}
\generate{\file{Changelog}{\from{polyglossia.dtx}{Changelog}}}
\generate{\file{examples.tex}{\from{polyglossia.dtx}{examples.tex}}}
\generate{\file{example-arabic.tex}{\from{polyglossia.dtx}{example-arabic.tex}}}
\generate{\file{example-thai.tex}{\from{polyglossia.dtx}{example-thai.tex}}}
+\generate{\file{README.md}{\from{polyglossia.dtx}{README}}}
\endgroup
%</internal>
%
@@ -429,6 +438,12 @@ to track the issues and follow progress.
\xpgvalue{=} \meta{code} (default value: \texttt{#3})\par%
}
+% arguments: #1 version number, #2 key name, #3 value type, #4 default value
+\NewDocumentCommand\xpgoptkey{ommo}{%
+ \xpgoption{#2}\IfValueT{#1}{\new{#1}}
+ \xpgvalue{=} \meta{#3} (default value: \texttt{#4})\par%
+}
+
%% Sidenotes << copied from fontspec.dtx
\newcommand\new[1]{%
\edef\thisversion{v#1}%
@@ -514,7 +529,7 @@ to track the issues and follow progress.
% \section{Introduction}
%
% \pkg{Polyglossia} is a package for facilitating multilingual typesetting with
-% \XeLaTeX\ and (with some exceptions) \LuaLaTeX. Basically, it
+% \XeLaTeX\ and \LuaLaTeX. Basically, it
% can be used as an alternative to \pkg{babel} for performing the following
% tasks automatically:
%
@@ -913,11 +928,19 @@ to track the issues and follow progress.
% option \xpgoption{nolocalmarks} which used to switch off the previous default, and
% now equals the default, is still available.
%
-% \item \xpgoption{quiet} turns off most info messages and some of the warnings issued
-% by \LaTeX, \pkg{fontspec} and \pkg{polyglossia}.
+% \item \xpgoptkey[1.50]{luatexrenderer}{renderer}[Harfbuzz] determines which font renderer is used
+% with \LuaTeX\ output. The correct font renderer is essential particularly for non-Latin scripts.
+% By default, \pkg{polyglossia} uses the \xpgvalue{Harfbuzz} renderer that has been introduced to
+% \LuaTeX\ in 2019 (\TeX Live 2020), as this gives the best results generally. If you want to use
+% a different renderer, you can specify this here (or individually for specific fonts via the optional
+% argument of the font selection commands). Please refer to the \pkg{fontspec} manual for supported
+% values and for details on how to change the renderer for individual fonts.\\
+% \xpgoption{luatexrenderer=none} disables \pkg{polyglossia}'s automatic renderer setting.
+%
+% \item \xpgboolkeytrue{verbose} determines whether info messages and (some of the) warnings issued
+% by \LaTeX, \pkg{fontspec} and \pkg{polyglossia} are output.
% \end{itemize}
%
-% \pagebreak
% \section{Language-switching commands}\label{languageswitching}
%
% \subsection{Recommended commands}\label{sec:langcmds}
@@ -982,17 +1005,22 @@ to track the issues and follow progress.
% \item \DescribeMacro{\foreignlanguage}\cmd{\foreignlanguage\oarg{options}\marg{lang}\marg{…}}
% \item \DescribeEnv{otherlanguage}\cmd{\begin\{otherlanguage\}\oarg{options}\marg{lang}} \dots{} \cmd{\end\{otherlanguage\}}
% \item \DescribeEnv{otherlanguage*}\cmd{\begin\{otherlanguage*\}\oarg{options}\marg{lang}} \dots{} \cmd{\end\{otherlanguage*\}}
+% \item \DescribeEnv{hyphenrules}\cmd{\begin\{hyphenrules\}\oarg{options}\marg{lang}} \dots{} \cmd{\end\{hyphenrules\}}\new{1.50}
% \end{itemize}
% ^^A
% \cmd\selectlanguage\marg{lang} and the ¦otherlanguage¦ environment are identical to the
-% the \meta{lang} environment, except that \cmd\selectlanguage\marg{lang}
+% \meta{lang} environment, except that \cmd\selectlanguage\marg{lang}
% does not need to be explicitly closed. The command \cmd\foreinlanguage\marg{lang}\marg{…} and the ¦otherlanguage*¦
% environment are identical with the use of the \cmd\text\meta{lang} or \cmd\textlang\ command, with the one
% notable exception that they do not translate the date with \cmd\today.
%
+% The \meta{hyphenrules} environment only switches the hyphenation patterns to the one associated with the language \meta{lang}
+% (or the language variety as specified via \meta{options}). It does no further language-specific change.
+%
% Since the \XeLaTeX\ and \LuaLaTeX\ format incorporate \pkg{babel}’s \file{hyphen.cfg},
-% the low-level commands for hyphenation and language switching
-% defined there are also accessible.
+% the low-level commands for hyphenation and language switching defined there are in principal also accessible.
+% Note, however, that the availability of such low-level commands is not guaranteed, as \file{hyphen.cfg}, which is
+% out of \pkg{polyglossia}'s control, is (or at least has been) subject to regular change.
%
% \subsection{Other commands}
% The following commands are probably of lesser interest to the end user, but
@@ -1080,25 +1108,49 @@ to track the issues and follow progress.
% which override the hyphenation patterns for specified words. The command takes as argument a space-separated
% list of words where hyphenation points are marked by a dash (if no dash is used, the respective word is not
% hyphenated at all):
-% \begin{Verbatim}
+% \begin{quote}
+% \begin{minipage}{\textwidth}
+% \begin{verbatim}
% \hyphenation{%
% po-ly-glos-sia
% LaTeX
% }
-% \end{Verbatim}
+% \end{verbatim}
+% \end{minipage}
+% \end{quote}
% ^^A
% These exceptions, however, apply to all languages. In addition to this, \pkg{polyglossia} provides
% the command\new{1.45}
-% \displaycmd{\xpghyphenation\oarg{options}\marg{lang}\marg{exceptions}}{\xpghyphenation}
+% \displaycmd{\pghyphenation\oarg{options}\marg{lang}\marg{exceptions}}{\pghyphenation}
% which can be used to define exceptions that only apply to a specific language or language variant,
% respectively.
%
+% \subsection{Hyphenation thresholds}
+%
+% \pkg{Polyglossia} sets reasonable defaults for the hyphenation thresholds of each language,
+% \ie the number of characters that must at least be there at the beginning or end of a
+% word before it is hyphenated (\cmd\lefthyphenmin\ and \cmd\righthyphenmin\ in \TeX).
+% For instance, with English, this threshold is 2 at the beginning (`left') and 3 at the end (`right'),
+% so a word will not be hyphenated within the first two characters at the beginning and the last three
+% characters at the end.
+%
+% To change this value, \pkg{polyglossia} provides the command\new{1.50}
+% \displaycmd{\setlanghyphenmins\oarg{options}\marg{lang}\marg{l}\marg{r}}{\setlanghyphenmins}
+% ^^A
+% where \meta{lang} is to be replaced with the respective language name or alias, \meta{options}
+% can be used to delimit the modification to a particular variety (\eg via \texttt{variant} or \texttt{spelling}),
+% \meta{l} with the left threshold value (\eg \texttt{3}), and \meta{r} with the right
+% threshold value (\eg \verb|\setlanghyphenmins[spelling=old]{german}{4}{4}|).
+% This setting can be changed repeatedly in the preamble and the document body.
+% It applies to all subsequent text in the respective language (variety), but only after the
+% next language switch.
+%
% \subsection{Hyphenation disabling}
%
-% In some very specific contexts (such as music score creation), \TeX{} hyphenation
-% is something to avoid as it may cause troubles. \pkg{polyglossia} provides two
-% functions: \Cmd\disablehyphenation\ and \Cmd\enablehyphenation. Note that if
-% you select a new language while hyphenation is disabled, it will remain disabled.
+% In some very specific contexts (such as music score creation), \TeX\ hyphenation
+% is something to avoid completely as it may cause troubles.
+% \pkg{Polyglossia} provides two functions: \Cmd\disablehyphenation\ and \Cmd\enablehyphenation.
+% Note that if you select a new language while hyphenation is disabled, it will remain disabled.
% If you re-enable it, the hyphenation patterns of the currently selected language
% will be activated.
%
@@ -1148,15 +1200,23 @@ to track the issues and follow progress.
% as well as the form of the numerals (unless overriden by the following option).
% \item \xpgchoicekey{numerals}{\xpgpresetvalue{mashriq} or \xpgvalue{maghrib}}
% The latter is the default when \xpgvalue{locale=algeria}, \xpgvalue{tunisia}, or \xpgvalue{morocco}.
+% \item \xpgboolkeyfalse[1.50]{abjadalph}
+% Set this to true if you want the alphabetic counters to be output using \cmd\abjadalph\ rather than \cmd\abjad.
+% Note that this limits the counter scope to 28 (see \cmd\abjadalph\ below).
% \item \xpgboolkeyfalse[1.0.3]{abjadjimnotail}
% Set this to true if you want the \textit{abjad} form of the number three to be \textarabic{ج‍} – as in the manuscript tradition – instead of the modern usage \textarabic{ج}.
% \end{itemize}
% \paragraph*{Commands:}
% \begin{itemize}
-% \item \Cmd\abjad and \Cmd\abjadmaghribi (see section \ref{abjad})
-% \item \Cmd\aemph to emphasize text with \cmd\overline.\new{1.2.0}
-% ¦\textarabic{\aemph{اب}}¦ yields \textarabic{\aemph{اب}}.
-% This command is also available for Farsi, Urdu, etc.
+% \item \Cmd\abjad outputs Arabic \textit{abjad} numbers according to the Mashriq varieties.
+% Example: ¦\abjad{1863}¦ yields \textarabic{\abjad{1863}}.
+% \item \Cmd\abjadmaghribi outputs Arabic \textit{abjad} numbers according to the Maghrib varieties.
+% Example: ¦\abjadmaghribi{1863}¦ yields \textarabic{\abjadmaghribi{1863}}.
+% \item \Cmd\abjadalph\new{1.50} steps through the Arabic alphabet, thus it can only be used up to 28.
+% Example: ¦\textarabic{\abjadalph{18}}¦ yields \textarabic{\abjadalph{18}}.
+% \item \Cmd\aemph to emphasize text with \cmd\overline.\new{1.2.0}
+% ¦\textarabic{\aemph{اب}}¦ yields \textarabic{\aemph{اب}}.
+% This command is also available for Farsi, Urdu, etc.
% \end{itemize}
%
% \subsection{armenian}\label{armenian}
@@ -1174,20 +1234,32 @@ to track the issues and follow progress.
% If this is turned on, the following shorthands are activated:
% \begin{shorthands}
% \item[¦"-¦] adds a hyphenation point that does still allow for hyphenation at the points preset
-% in the hyphenation patterns (as opposed to \cmd\-).
+% in the hyphenation patterns (as opposed to \cmd\-).
+% \item[¦"=¦] adds an explicit hyphen with a breakpoint, allowing for hyphenation at the
+% other points preset in the hyphenation patterns (as opposed to plain ¦-¦).
% \item[\texttt{"\textasciitilde}] for a hyphen sign without a breakpoint. Useful for
-% cases where the hyphen should stick at the following syllable.
+% cases where the hyphen should stick at the following syllable.
% \item[¦"|¦] disables a ligature at this position.
% \item[¦""¦] allows for a line break at this position (without hyphenation sign).
-% \item[¦"---¦] Cyrillic emdash in plain text.
-% \item[¦"--~¦] Cyrillic emdash in compound names (surnames).
-% \item[¦"--*¦] Cyrillic emdash for denoting direct speech.
% \item[¦",¦] thinspace for initials with a breakpoint in following surname.
% \item[¦"‘¦] for German left double quotes (looks like ,,).
% \item[¦"’¦] for German right double quotes (looks like “).
% \item[¦"<¦] for French left double quotes (looks like <<).
% \item[¦">¦] for French right double quotes (looks like >>).
% \end{shorthands}
+%
+% There are also three shorthands for the Cyrillic dash (\textrussian{тире}), which is shorter than the
+% emdash but longer than the endash (namely 0.8\,em).
+% Note that, since it is not covered by unicode, this character is faked by telescoping two endashes:
+% \begin{shorthands}
+% \item[¦"---¦] Cyrillic dash for the use in normal text. This requires preceding space
+% in input (trailing space is optional) and prints with a non-breakable thin space before
+% and after the dash.
+% \item[¦"--\textasciitilde¦] Cyrillic dash for the use in compound names (surnames).
+% As opposed to ¦"---¦ this removes any space before and after the dash.
+% \item[¦"--*¦] Cyrillic dash for denoting direct speech. This adds a larger space after
+% the dash. Space before the dash is output as is.
+% \end{shorthands}
% \item \xpgchoicekey{numerals}{\xpgpresetvalue{arabic}, \xpgvalue{cyrillic-alph} or \xpgvalue{cyrillic-trad}}
% Uses either Arabic numerals or Cyrillic alphanumerical numbering. The two Cyrillic variants differ as follows:
% \begin{itemize}
@@ -1200,7 +1272,8 @@ to track the issues and follow progress.
% With ¦spelling=classic¦, captions and dates adhere to the Taraškievica (or
% Belarusian classical) orthography rather than the standard orthography.
% \end{itemize}
-% ^^A
+%
+% \condbreak{\baselineskip}
% \paragraph*{Commands:}
% \begin{itemize}
% \item \Cmd\Asbuk: produces uppercased Cyrillic alphanumerals, for environments such as ¦enumerate¦.
@@ -1277,6 +1350,13 @@ to track the issues and follow progress.
% \charifavailable{01C6}{dž}) will be replaced by single characters. This can
% be useful if the ligatures on your font are broken (if the font does not
% have them, they are automatically replaced).
+% \item \xpgboolkeytrue[1.51]{splithyphens}
+% According to Croatian typesetting conventions, if a word with a hard hyphen (such as \emph{je-li})
+% is hyphenated at this hyphen, a second hyphenation character is to be inserted at the beginning
+% of the line that follows the hyphenation (\emph{je-/-li}).
+% By default, this is done automatically (if you are using \LuaTeX, the \pkg{luavlna} package is
+% loaded to achieve this).
+% Set this option to ¦false¦ to disable the feature.
% \end{itemize}
%
% \subsection{czech}\label{czech}
@@ -1394,7 +1474,7 @@ to track the issues and follow progress.
% enabled, spacing in typewriter context is the same as with roman and sans
% serif font, depending on the \xpgvalue{autospacing} and
% \xpgvalue{autospaceguillemets} settings (note that this was the default up
-% to v.~1.44).
+% to v.~1.44).
% \item \xpgboolkeyfalse{frenchfootnote}
% If \xpgvalue{true}, footnotes start with a non-superscripted number
% followed by a dot, as common in French typography. Note that this might
@@ -1406,6 +1486,14 @@ to track the issues and follow progress.
% in French typography. Note that this option is only functional (by
% design) if French is the main language. Also, it might interfere with
% list packages such as \pkg{enumitem}.
+% \item \xpgboolkeytrue[1.51]{frenchpart}
+% By default, \pkg{polyglossia} modifies part headings to match French conventions
+% (\emph{Première partie} rather than \emph{Partie I}). Next to the standard classes,
+% specifics of \pkg{KOMA-script}, \pkg{memoir} and the \pkg{titlesec} package are
+% taken into account. With other classes or packages, redefinition might fail if these
+% have particular part settings.
+% In such case, or if you don't want the redefinition, you can switch off the feature
+% by passing \textit{false} to this option.
% \item \xpgcodekey[1.46]{itemlabels}¦\textemdash¦
% If \emph{frenchitemlabels} is true, you can customize here the used item
% label of all levels.
@@ -1442,20 +1530,31 @@ to track the issues and follow progress.
% If this is turned on, the following shorthands are activated:
% \begin{shorthands}
% \item[¦"-¦] adds a hyphenation point that does still allow for
-% hyphenation at the points preset in the hyphenation patterns (as opposed
-% to \cmd\-).
+% hyphenation at the points preset in the hyphenation patterns (as opposed to \cmd\-).
+% \item[¦"=¦] adds an explicit hyphen with a breakpoint, allowing for hyphenation at the
+% other points preset in the hyphenation patterns (as opposed to plain ¦-¦).
% \item[\texttt{"\textasciitilde}] for a hyphen sign without a breakpoint. Useful for
% cases where the hyphen should stick at the following syllable.
% \item[¦"|¦] disables a ligature at this position.
% \item[¦""¦] allows for a line break at this position (without hyphenation sign).
-% \item[¦"---¦] Cyrillic emdash in plain text.
-% \item[¦"--~¦] Cyrillic emdash in compound names (surnames).
-% \item[¦"--*¦] Cyrillic emdash for denoting direct speech.
% \item[¦",¦] thinspace for initials with a breakpoint in following surname.
-% \item[¦"‘¦] for German left double quotes (looks like ,,).
-% \item[¦"’¦] for German right double quotes (looks like “).
-% \item[¦"<¦] for French left double quotes (looks like <<).
-% \item[¦">¦] for French right double quotes (looks like >>).
+% \item[¦"‘¦] for German-style left double quotes (looks like ,,).
+% \item[¦"’¦] for German-style right double quotes (looks like “).
+% \item[¦"<¦] for French-style left double quotes (looks like <<).
+% \item[¦">¦] for French-style right double quotes (looks like >>).
+% \end{shorthands}
+%
+% There are also three shorthands for the Cyrillic dash (\textrussian{тире}), which is shorter than the
+% emdash but longer than the endash (namely 0.8\,em).
+% Note that, since it is not covered by unicode, this character is faked by telescoping two endashes:
+% \begin{shorthands}
+% \item[¦"---¦] Cyrillic dash for the use in normal text. This requires preceding space
+% in input (trailing space is optional) and prints with a non-breakable thin space before
+% and after the dash.
+% \item[¦"--\textasciitilde¦] Cyrillic dash for the use in compound names (surnames).
+% As opposed to ¦"---¦ this removes any space before and after the dash.
+% \item[¦"--*¦] Cyrillic dash for denoting direct speech. This adds a larger space after
+% the dash. Space before the dash is output as is.
% \end{shorthands}
% \item \xpgchoicekey{numerals}{\xpgpresetvalue{arabic} or \xpgvalue{georgian}}
% Uses either Arabic numerals or Georgian alphanumerical numbering.
@@ -1495,10 +1594,10 @@ to track the issues and follow progress.
%
% There are also four shorthands for quotation signs:
% \begin{shorthands}
-% \item[¦"`¦] for German left double quotes („)
-% \item[¦"'¦] for German right double quotes (“)
-% \item[¦"<¦] for French left double quotes («)
-% \item[¦">¦] for French right double quotes (»).
+% \item[¦"`¦] for German-style left double quotes („)
+% \item[¦"'¦] for German-style right double quotes (“)
+% \item[¦"<¦] for French-style left double quotes («)
+% \item[¦">¦] for French-style right double quotes (»).
% \end{shorthands}
% \item \xpgchoicekey[1.2.0]{script}{\xpgpresetvalue{latin} or \xpgvalue{blackletter}\new{1.46} (= \xpgvalue{fraktur})}
% Setting ¦script=blackletter¦ adapts the captions for typesetting German in blackletter type (using the long s (ſ)
@@ -1814,18 +1913,30 @@ to track the issues and follow progress.
% \begin{shorthands}
% \item[¦"-¦] adds a hyphenation point that does still allow for hyphenation at the points preset
% in the hyphenation patterns (as opposed to \cmd\-).
+% \item[¦"=¦] adds an explicit hyphen with a breakpoint, allowing for hyphenation at the
+% other points preset in the hyphenation patterns (as opposed to plain ¦-¦).
% \item[\texttt{"\textasciitilde}] for a hyphen sign without a breakpoint. Useful for
% cases where the hyphen should stick at the following syllable.
% \item[¦"|¦] disables a ligature at this position.
% \item[¦""¦] allows for a line break at this position (without hyphenation sign).
-% \item[¦"---¦] Cyrillic emdash in plain text.
-% \item[¦"--~¦] Cyrillic emdash in compound names (surnames).
-% \item[¦"--*¦] Cyrillic emdash for denoting direct speech.
% \item[¦",¦] thinspace for initials with a breakpoint in following surname.
-% \item[¦"‘¦] for German left double quotes (looks like ,,).
-% \item[¦"’¦] for German right double quotes (looks like “).
-% \item[¦"<¦] for French left double quotes (looks like <<).
-% \item[¦">¦] for French right double quotes (looks like >>).
+% \item[¦"‘¦] for German-style left double quotes (looks like ,,).
+% \item[¦"’¦] for German-style right double quotes (looks like “).
+% \item[¦"<¦] for French-style left double quotes (looks like <<).
+% \item[¦">¦] for French-style right double quotes (looks like >>).
+% \end{shorthands}
+%
+% There are also three shorthands for the Cyrillic dash (\textrussian{тире}), which is shorter than the
+% emdash but longer than the endash (namely 0.8\,em).
+% Note that, since it is not covered by unicode, this character is faked by telescoping two endashes:
+% \begin{shorthands}
+% \item[¦"---¦] Cyrillic dash for the use in normal text. This requires preceding space
+% in input (trailing space is optional) and prints with a non-breakable thin space before
+% and after the dash.
+% \item[¦"--\textasciitilde¦] Cyrillic dash for the use in compound names (surnames).
+% As opposed to ¦"---¦ this removes any space before and after the dash.
+% \item[¦"--*¦] Cyrillic dash for denoting direct speech. This adds a larger space after
+% the dash. Space before the dash is output as is.
% \end{shorthands}
% \item \xpgchoicekey{numerals}{\xpgpresetvalue{arabic}, \xpgvalue{cyrillic-alph} or \xpgvalue{cyrillic-trad}}
% Uses either Arabic numerals or Cyrillic alphanumerical numbering. The two Cyrillic variants differ as follows:
@@ -1886,13 +1997,25 @@ to track the issues and follow progress.
% \begin{shorthands}
% \item[¦"-¦] adds a hyphenation point that does still allow for hyphenation at the points preset
% in the hyphenation patterns (as opposed to \cmd\-).
-% \item[\texttt{"\textasciitilde}] for a hyphen sign without a breakpoint. Useful for
+% \item[¦"=¦] adds an explicit hyphen with a breakpoint, allowing for hyphenation at the
+% other points preset in the hyphenation patterns (as opposed to plain ¦-¦).
+% \item[\texttt{"\textasciitilde}] adds an explicit hyphen without a breakpoint. Useful for
% cases where the hyphen should stick at the following syllable.
% \item[¦"|¦] disables a ligature at this position.
% \item[¦""¦] allows for a line break at this position (without hyphenation sign).
-% \item[¦"---¦] Cyrillic emdash in plain text.
-% \item[¦"--~¦] Cyrillic emdash in compound names (surnames).
-% \item[¦"--*¦] Cyrillic emdash for denoting direct speech.
+% \end{shorthands}
+%
+% There are also three shorthands for the Cyrillic dash (\textrussian{тире}), which is shorter than the
+% emdash but longer than the endash (namely 0.8\,em).
+% Note that, since it is not covered by unicode, this character is faked by telescoping two endashes:
+% \begin{shorthands}
+% \item[¦"---¦] Cyrillic dash for the use in normal text. This requires preceding space
+% in input (trailing space is optional) and prints with a non-breakable thin space before
+% and after the dash.
+% \item[¦"--\textasciitilde¦] Cyrillic dash for the use in compound names (surnames).
+% As opposed to ¦"---¦ this removes any space before and after the dash.
+% \item[¦"--*¦] Cyrillic dash for denoting direct speech. This adds a larger space after
+% the dash. Space before the dash is output as is.
% ^^A These are commented out in gloss-russian
% ^^A \item[¦",¦] thinspace for initials with a breakpoint in following surname.
% ^^A \item[¦"‘¦] for German left double quotes (looks like ,,).
@@ -1900,6 +2023,10 @@ to track the issues and follow progress.
% ^^A \item[¦"<¦] for French left double quotes (looks like <<).
% ^^A \item[¦">¦] for French right double quotes (looks like >>).
% \end{shorthands}
+% \item \xpgboolkeytrue[1.50]{forceheadingpunctuation}
+% By default, chapter and section numbers always have a trailing punctuation in Russian
+% (as in \emph{1.1.} as opposed to \emph{1.1}). If this option is set to false, \textsf{polyglossia}
+% will not touch heading punctuation, so this will be whatever the class or a package determines.
% \item \xpgboolkeytrue[1.46]{indentfirst}
% By default, all paragraphs are indented in Russian, also those after a
% chapter or section heading. If this option is false, the latter paragraphs
@@ -2096,14 +2223,13 @@ to track the issues and follow progress.
% If this is turned on, the following shorthands are activated:
% \begin{shorthands}
% \item[¦"-¦] adds a hyphenation point that does still allow for hyphenation at the points preset
-% in the hyphenation patterns (as opposed to \cmd\-).
+% in the hyphenation patterns (as opposed to \cmd\-).
+% \item[¦"=¦] adds an explicit hyphen with a breakpoint, allowing for hyphenation at the
+% other points preset in the hyphenation patterns (as opposed to plain ¦-¦).
% \item[\texttt{"\textasciitilde}] for a hyphen sign without a breakpoint. Useful for
-% cases where the hyphen should stick at the following syllable.
+% cases where the hyphen should stick at the following syllable.
% \item[¦"|¦] disables a ligature at this position.
% \item[¦""¦] allows for a line break at this position (without hyphenation sign).
-% \item[¦"---¦] Cyrillic emdash in plain text.
-% \item[¦"--~¦] Cyrillic emdash in compound names (surnames).
-% \item[¦"--*¦] Cyrillic emdash for denoting direct speech.
% ^^A These are commented out in gloss-ukrainian
% ^^A \item[¦",¦] thinspace for initials with a breakpoint in following surname.
% ^^A \item[¦"‘¦] for German left double quotes (looks like ,,).
@@ -2111,6 +2237,19 @@ to track the issues and follow progress.
% ^^A \item[¦"<¦] for French left double quotes (looks like <<).
% ^^A \item[¦">¦] for French right double quotes (looks like >>).
% \end{shorthands}
+%
+% There are also three shorthands for the Cyrillic dash (\textrussian{тире}), which is shorter than the
+% emdash but longer than the endash (namely 0.8\,em).
+% Note that, since it is not covered by unicode, this character is faked by telescoping two endashes:
+% \begin{shorthands}
+% \item[¦"---¦] Cyrillic dash for the use in normal text. This requires preceding space
+% in input (trailing space is optional) and prints with a non-breakable thin space before
+% and after the dash.
+% \item[¦"--\textasciitilde¦] Cyrillic dash for the use in compound names (surnames).
+% As opposed to ¦"---¦ this removes any space before and after the dash.
+% \item[¦"--*¦] Cyrillic dash for denoting direct speech. This adds a larger space after
+% the dash. Space before the dash is output as is.
+% \end{shorthands}
% \item \xpgchoicekey{numerals}{\xpgpresetvalue{arabic}, \xpgvalue{cyrillic-alph} or \xpgvalue{cyrillic-trad}}
% Uses either Arabic numerals or Cyrillic alphanumerical numbering. The two Cyrillic variants differ as follows:
% \begin{itemize}
@@ -2194,6 +2333,17 @@ to track the issues and follow progress.
% If you do this in a document preamble rather than in a package, you need to embrace the redefinition
% by \cmd\makeatletter\ and \cmd\makeatother\ due to the ¦@¦ in the macro names.
%
+% Finally, as soon as the language has been switched (either inline or as a block), \pkg{polyglossia}
+% executes the (by default empty) hook
+% \begin{itemize}
+% \item \Cmd{\polyglossia@language@switched}
+% \end{itemize}
+% to which you can append arbitrary code (via \cmd\gappto) that should be executed if (a particular)
+% language is being activated. This is done before any of the above
+% macros are issued (so you can still alter them), but at a point where \cmd\languagename, \cmd\babelname\
+% and \cmd\languageid\ are already set, so you can condition on specific languages in your code.
+% This hook is particularly provided for package authors.
+%
% \section{Script-specific numbering}
%
% Languages and scripts have specific numbering conventions. Some use decimal digits
@@ -2385,7 +2535,7 @@ to track the issues and follow progress.
% Note also that the rule switches might interfere in bad ways with packages or classes that redefine footnotes themselves. This is also the reason
% why \cmd\autofootnoterule\ is not used by default.
%
-% \condbreak{5\baselineskip}
+%
% \section{Calendars}
%
% \subsection{Hebrew calendar (hebrewcal.sty)}
@@ -2523,9 +2673,9 @@ to track the issues and follow progress.
% In alphabetical order: \TA{Ignas Anikevicius}, \TA{Sina Ahmadi}, \TA{Wouter Bolsterlee}, \TA{Christian Buhtz},
% \TA{Zgarbul Andrey}, \TA{Oleg Domanov}, \TA{Philipp Gesang}, \TA{Kevin Godby}, \TA{Enrico Gregorio},
% \TA{Khaled Hosny}, \TA{Najib Idrissi}, user \TA{julroy67}, \TA{Dohyun Kim}, \TA{Phil Kime}, \TA{Mike Kroutikov},
-% \TA{Ivan Kokan}, \TA{Caleb Maclennan}, \TA{José Mancera}, \TA{Yevgen Pogribnyi}, \TA{Will Robertson}, \TA{Maïeul Rouquette},
-% \TA{Elie Roux}, \TA{Hugo Roy}, \TA{Guy Rutenberg}, \TA{Philipp Stephani}, \TA{Niranjan Tambe}, \TA{Keno Wehr},
-% \TA{Dominik Wujastyk}, \TA{Sertaç Ö. Yıldız}, \TA{Maksim Zholudev}, \TA{Yan Zhou}, and \TA{Stefan Zlatinov}.
+% \TA{Ivan Kokan}, \TA{Caleb Maclennan}, \TA{José Mancera}, \TA{Miquel Ortega}, \TA{Yevgen Pogribnyi}, \TA{Will Robertson},
+% \TA{Maïeul Rouquette}, \TA{Elie Roux}, \TA{Hugo Roy}, \TA{Guy Rutenberg}, \TA{Philipp Stephani}, \TA{Niranjan Tambe},
+% \TA{Keno Wehr}, \TA{Dominik Wujastyk}, \TA{Sertaç Ö. Yıldız}, \TA{Maksim Zholudev}, \TA{Yan Zhou}, and \TA{Stefan Zlatinov}.
% Their respective contributions can be identified from the contributor statistics on
% \href{https://github.com/reutenauer/polyglossia/graphs/contributors}{GitHub}.
%
@@ -2544,6 +2694,5561 @@ to track the issues and follow progress.
% \StopEventually{}
% \section{Implementation}
% \iffalse
+%<*polyglossia.sty>
+% \fi
+% \clearpage
+%
+% \subsection{polyglossia.sty}
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{polyglossia}[2020/12/08 v1.51
+ Modern multilingual typesetting with XeLaTeX and LuaLaTeX]
+\RequirePackage{etoolbox}
+\RequirePackage{makecmds}
+\RequirePackage{xkeyval}[2008/08/13]
+% Will raise error if used with anything else than XeTeX or LuaTeX
+\RequirePackage{fontspec}[2010/06/08]% v2.0
+\RequirePackage{iftex}
+\RequirePackage{expl3}
+\RequirePackage{l3keys2e}
+\RequirePackage{xparse}
+
+% fontspec now uses LaTeX3 packages such as expl3, so we need this:
+\ExplSyntaxOn
+
+% Execute code #3 if package #1 has been loaded already, else
+% add to package hook #2
+\newcommand\xpg@at@package[3]{%
+ \@ifpackageloaded{#1}{#3}{\AddToHook{#2}{#3}}%
+}
+
+% correct a bug in tracklang
+\xpg@at@package{tracklang}{file/after/tracklang.sty}{%
+ \@ifpackagelater{tracklang}{2019/08/30}{}{\global\def\AddTrackedLangage{\AddTrackedLanguage}}
+}
+
+
+%% This is for compatibility with Babel-aware package:
+\def\languageshorthands#1{\relax} %this is for scrlttr2 class
+\def\bbl@cs#1{\csname bbl@#1\endcsname}%
+\AtEndPreamble{\let\bbl@set@language\xpg@set@language@aux} %for biblatex
+\AtEndPreamble{\let\bbl@main@language\xpg@main@language} %for biblatex
+\providecommand\texorpdfstring[2]{#1}% dummy command if hyperref is not loaded
+
+\ifluatex
+ \RequirePackage{luatexbase} % already included by fontspec, but needed here
+ \RequireLuaModule{polyglossia}
+\fi
+
+% Which version of XeTeX do we use? What is the boudary class? 4095 or 255
+\@ifundefined{e@alloc@intercharclass@top}
+ {\chardef\xpg@boundaryclass=\@cclv}
+ {\let\xpg@boundaryclass=\e@alloc@intercharclass@top}
+
+% Useful for getting list of loaded languages and variants. Like babel's bbl@loaded
+\let\xpg@loaded\@empty% list of loaded languages (polyglossia name)
+\let\xpg@vloaded\@empty% list of loaded variants
+\let\xpg@bloaded\@empty% list of loaded languages (babel name)
+\let\xpg@bcp@loaded\@empty% list of loaded languages (bcp-47 id)
+
+% counter in latin
+\def\latinalph#1{\expandafter\latin@alph\csname c@#1\endcsname}
+\def\latinAlph#1{\expandafter\latin@Alph\csname c@#1\endcsname}
+
+% select language hook
+\cs_new_nopar:Nn \polyglossia@AtBeginDocument@selectlanguage: {}
+% \disablehyphenation hook
+\cs_new_nopar:Nn \polyglossia@AtBeginDocument@hyphenation: {}
+
+% hook to be executed at begin of document
+\cs_new_nopar:Nn \polyglossia@AtBeginDocument: {
+ % save various command
+ \let\latin@alph\@alph % TODO rename when we have the C locale
+ \let\latin@Alph\@Alph % TODO rename when we have the C locale
+ % push to C language gloss
+ \let\polyglossia@Clang@@arabic\@arabic
+ \let\polyglossia@Clang@arabic\arabic
+
+ \xpg@initial@setup
+ % apply \familydefault changes
+ \xpg@set@familydefault
+}
+
+\AtBeginDocument{
+ \polyglossia@AtBeginDocument:
+}
+
+% The following needs to go after any \AtBeginDocument (also of packages
+% loaded after \set[main|other]language
+\AfterEndPreamble{
+ % now we have the C locale definition: select the language
+ \polyglossia@AtBeginDocument@selectlanguage:
+ % If hyphenation disabling has been requested in preamble, do it now
+ \polyglossia@AtBeginDocument@hyphenation:
+}
+
+%% custom message macros
+\providecommand*{\xpg@error}[1]{%
+ \PackageError{polyglossia}{#1}{}%
+}
+
+\providecommand*{\xpg@warning}[1]{%
+ \PackageWarning{polyglossia}{#1}%
+}
+
+\providecommand*{\xpg@info}[1]{%
+ \PackageInfo{polyglossia}%
+ {#1\@gobble}%
+} %% the \@gobble is to prevent displaying the line nr
+
+%TODO change all instances of \xpg@nopatterns in gloss-*.ldf files
+\providecommand*{\xpg@nopatterns@fallback}[2][nohyphenation]{%
+ \xpg@warning{No~ hyphenation~ patterns~ were~ loaded~ for~ `#2'\MessageBreak
+ I~ will~ use~ \string\language=\string\l@ #1\space instead}%
+ \expandafter\adddialect\csname l@#2\expandafter\endcsname\csname l@#1\endcsname\relax}
+
+\providecommand*{\xpg@nopatterns}[1]{%
+ \xpg@warning{No~ hyphenation~ patterns~ were~ loaded~ for~ `#1'\MessageBreak
+ I~ will~ use~ \string\language=\string\l@nohyphenation\space instead}%
+ %%TODO? \expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax
+ }
+
+\def\xpg@ill@value#1#2{%
+ \xpg@warning{Illegal~ value~ (#1)~ for~ #2}}
+
+% error out if lang is not loaded
+\cs_new_nopar:Nn \polyglossia@error@iflangnotloaded:n
+{
+ \cs_if_exist:cF{#1@loaded}
+ {
+ \xpg@error{language~ #1~ is~ not~ loaded.~ Please~ load~ it~ before~ using~ it.}
+ }
+}
+
+
+% error do not use directly the gloss file
+\msg_new:nnn { polyglossia } { directloadgloss }
+{
+ You~ should~ not~ load~ directly~ the~ gloss~ file~ using~ `\string\usepackage'.
+ You~ must~ use~ `\string\setotherlanguage\{#1\}' or `\string\setmainlanguage\{#1\}'.
+}
+\msg_redirect_name:nnn { polyglossia } { directloadgloss } { critical }
+
+%% use macro if defined, else warn that it is not
+\def\csuse@warn#1{%
+ \ifcsundef{#1}{\xpg@warning{ \expandafter\string\csname #1\endcsname\space is~ not~ defined}}%
+ {\csname #1\endcsname}}
+
+%% ensure directionality if bidi is loaded, else ignore
+\def\@@ensure@dir#1{\ifcsundef{@ensure@dir}{#1}{\@ensure@dir{#1}}}
+\def\@@ensure@maindir#1{\ifcsundef{@ensure@maindir}{#1}{\@ensure@maindir{#1}}}
+
+%% Used by the language definitions files for right-to-left languages
+\def\RequireBidi{%
+ \str_case_e:nnF{\c_sys_engine_str}{
+ {luatex}{\ifx\@onlypreamble\@notprerr\else\RequirePackage{luabidi}\fi}
+ {xetex}{\ifx\@onlypreamble\@notprerr\else\RequirePackage{bidi}\fi}
+ }
+ {
+ \xpg@warning{You’re running a TeX engine that is not LuaTeX or XeTeX.\MessageBreak
+ That is almost guaranteed to cause problems.}
+ }
+}
+
+% (lua)bidi commands to change directionality for paragraphs
+% and inline text.
+% overwritten with correct package
+\cs_new_nopar:Nn{\polyglossia@setpardirection:n}{%
+ \str_case_e:nnTF{#1}{%
+ {LR}{\relax}%
+ {RL}{\xpg@error{right-to-left,~ but~ (lua)bidi~ package~ was~ not~ loaded!}}%
+ }%
+ {}%
+ {\xpg@error{Unknown~ language~ direction~ #1 ~(base~ wrapper)}}%
+}
+\cs_new_nopar:Nn{\polyglossia@settextdirection:n}{%
+ \str_case_e:nnTF{#1}{%
+ {LR}{\relax}%
+ {RL}{\xpg@error{right-to-left,~ but~ (lua)bidi~ package~ was~ not~ loaded!}}%
+ }%
+ {}%
+ {\xpg@error{Unknown~ language~ direction~ #1 ~(base~ wrapper)}}%
+}
+\xpg@at@package{bidi}{package/after/bidi}{%
+ \ExplSyntaxOn%
+ \cs_gset_nopar:Nn{\polyglossia@setpardirection:n}{%
+ \str_case_e:nnTF{#1}{%
+ {LR}{\setLR}%
+ {RL}{\setRL}%
+ }%
+ {}%
+ {\xpg@error{Unknown~ language~ direction~ #1 ~(bidi~ wrapper)}}%
+ }%
+ \cs_gset_nopar:Nn{\polyglossia@settextdirection:n}{%
+ \str_case_e:nnTF{#1}{%
+ {LR}{\LRE}%
+ {RL}{\RLE}%
+ }%
+ {}%
+ {\xpg@error{Unknown~ language~ direction~ #1 ~(bidi~ wrapper)}}%
+ }%
+ \ExplSyntaxOff%
+}
+\xpg@at@package{luabidi}{package/after/luabidi}{%
+ \ExplSyntaxOn%
+ \cs_gset_nopar:Nn{\polyglossia@setpardirection:n}{%
+ \str_case_e:nnTF{#1}{%
+ {LR}{\setLR}%
+ {RL}{\setRL}%
+ }
+ {}%
+ {\xpg@error{Unknown~ language~ direction~ #1 ~(luabidi~ wrapper)}}%
+ }%
+ \cs_gset_nopar:Nn{\polyglossia@settextdirection:n}{%
+ \str_case_e:nnTF{#1}{%
+ {LR}{\LRE}%
+ {RL}{\RLE}%
+ }
+ {}%
+ {\xpg@error{Unknown~ language~ direction~ #1 ~(luabidi~ wrapper)}}%
+ }%
+ \ExplSyntaxOff%
+}
+
+%% compatibility with babel
+\let\addto\gappto% gappto is defined in etoolbox
+
+%% NEW EXPERIMENTAL SETUP INTERFACE FOR GLOSS FILES
+%% options currently available:
+%% language : the name of the language (as understood by fontspec)
+%% hyphennames : the different hyphenation patterns to try (comma separated list)
+%%% TODO: if pattern is prefixed by !, then it should be loaded as a fallback, with \xpg@nopatterns@fallback - i.e. with a warning: e.g. sanskrit for hindi, or catalan for asturian. – Also for languages with variants! (English and German, etc.)
+%% script : the name of the script (as understood by fontspec) – default is Latin
+%% scripttag : the OpenType tag for the script
+%% langtag : the OpenType tag for the language
+%% hyphenmins : the hyphenmins for this language (comma-sep list of two integers)
+%% frenchspacing : boolean
+%% indentfirst : boolean
+%% fontsetup : boolean
+%% TODO: nouppercase : boolean (for scripts like Arabic, Devanagari, etc which have no concept of uppercase/lowercase)
+%% TODO: localalph = {<alph_csname>,<Alph_csname>}
+%% TODO: localnumeral = <csname>
+%% or even better localdigits = {0123456789} for fully automatic setup
+\newif\if@xpg@language@really@defined@
+\newcommand*\PolyglossiaSetup[2]{%
+ \polyglossia@keys_define_lang:n{#1}%
+ \keys_set:nn { polyglossia / #1 } { #2 }%
+ \prop_log:N{\polyglossia@langsetup}
+ \polyglossia_setup_hyphen:n {#1}
+ %define booleans etoolbox style and set defaults
+ %% TODO ? \providetoggle{#1@setup@done}%
+ % we initialize these so that we can use \gappto below
+ \csgdef{init@extras@#1}{}%
+ \csgdef{init@noextras@#1}{}% we don't use this yet: remove?
+ % here we do the fontsetup:
+ \polyglossia@lang@autosetupfont:n{#1}
+ %% TODO? \toggletrue{#1@setup@done}%
+ % reinit \do
+ \def\do##1{\setotherlanguage{##1}}%
+}
+
+% Adjust language key setting after initial setup
+% This is needed, e.g., for languages with varying script
+\DeclareDocumentCommand \SetLanguageKeys { m m }
+{
+ \clist_map_inline:nn { #1 } { \keys_set:nn { polyglossia / ##1 } { #2 } }
+}
+
+
+% setup hyphennames from a str list of hyphen
+\cs_new:Nn \polyglossia_setup_hyphen:n {
+ \exp_args:Nne \clist_set:Nn{\l_tmpa_clist}{\prop_item:Nn \polyglossia@langsetup {#1 / hyphennames}}
+ \providebool{havehyphen}
+ \boolfalse{havehyphen}
+ % for each hyphen in the set until we find one that works
+ \clist_map_inline:Nn \l_tmpa_clist {
+ \ifbool{havehyphen}{}{%
+ % check if language hyphenname is defined
+ \polyglossia@check@ifdefined:NF{#1}{%
+ % if not, first consider nohyphenation
+ \str_if_eq:nnTF{##1}{nohyphenation}
+ {%
+ \cs_gset_eq:cc{l@#1}{l@##1}
+ \global\booltrue{havehyphen}
+ }{%
+ % then test if hyphenation is defined
+ \xpg@ifdefined{##1}{
+ % test if language hyphenation is nohyphenation
+ \cs_if_eq:cNF{l@#1}{\l@nohyphenation}{\global\booltrue{havehyphen}}{%
+ % if false define language to hyphenation if it is not equal...
+ \str_if_eq:nnF{#1}{##1}{\cs_gset_eq:cc{l@#1}{l@##1}}
+ % ...and load
+ \xpg@set@hyphenation@patterns{##1}
+ \global\booltrue{havehyphen}
+ }%
+ }{}%
+ }%
+ }%
+ }%
+ }%
+ % if l@#1 does not yet exist,
+ % we assign it to nohyphenation
+ % we do this here in case and if the hyphennames key was omitted
+ \ifbool{havehyphen}{}{%
+ \xpg@ifdefined{#1}{}%
+ {
+ \xpg@nopatterns{#1}
+ \expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax
+ }%
+ }%
+ \csdef{#1@language}{%
+ \polyglossia@setup@language@patterns{#1}%
+ }%
+ % setup hyphenmins
+ \exp_args:NNe \clist_set:Nn \l_tmpa_clist
+ { \prop_item:Nn \polyglossia@langsetup {#1 / hyphenmins} }
+ \cs_if_eq:cNF {l@#1} \l@nohyphenation
+ {
+ \use:x
+ {
+ \exp_not:N \setlocalhyphenmins {#1}
+ { \clist_item:Nn \l_tmpa_clist {1} }
+ { \clist_item:Nn \l_tmpa_clist {2} }
+ }
+ }
+}
+
+\newcommand*\polyglossia@setup@language@patterns[1]{%
+ \ifbool{xpg@hyphenation@disabled}{%
+ \xdef\xpg@lastlanguage{\the\csname l@#1\endcsname}%
+ }{%
+ % first, test if \l@#1 exists
+ % without that, \csname l@#1\endcsname will be defined as \relax
+ \cs_if_exist:cTF {l@#1}
+ {
+ \cs_if_eq:cNTF {l@#1} \l@nohyphenation
+ {
+ \language=\l@nohyphenation
+ }
+ {
+ \xpg@set@hyphenation@patterns{#1}
+ }
+ }
+ {%
+ % Since this function is sometimes called from the gloss files
+ % directly, we need to check whether the requested hyphenname exists.
+ \xpg@ifdefined{#1}{}%
+ {%
+ \xpg@nopatterns{#1}
+ \expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax%
+ }%
+ \xpg@set@hyphenation@patterns{#1}
+ }
+ }
+}
+
+\prop_new:N \polyglossia@langsetup
+
+\cs_new_protected:Npn \polyglossia@keys_define_lang:n #1 {
+ \keys_define:nn {polyglossia}{
+ % the script font
+ #1 / script
+ .code:n = {
+ \prop_gput:Nnn{\polyglossia@langsetup}{#1/script}{##1}
+ \prop_gput:Nnx{\polyglossia@langsetup}{#1/lcscript}
+ {\tl_if_empty:nF{##1}{\str_lowercase:n##1}}
+ },
+ #1 / script
+ .value_required:n = true,
+ #1 / script
+ .initial:n = latin,
+ % the opentype script tag
+ #1 / scripttag
+ .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/scripttag}{##1}},
+ #1 / scripttag
+ .default:n = {},
+ #1 / scripttag
+ .initial:n = {},
+ % the language full name
+ #1 / language
+ .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/language}{##1}},
+ #1 / language
+ .value_required:n = true,
+ #1 / language
+ .initial:x = {\str_upper_case:n#1},
+ % the language tag
+ #1 / langtag
+ .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/langtag}{##1}},
+ #1 / langtag
+ .value_required:n = true,
+ #1 / langtag
+ .initial:n = {},
+ % the BCP-47 tag
+ #1 / bcp47
+ .code:n = {\prop_gput:Nnn{\polyglossia@langsetup}{#1/bcp47}{##1}},
+ #1 / bcp47
+ .value_required:n = true,
+ #1 / bcp47
+ .initial:n = {},
+ % hyphennames
+ #1 / hyphennames
+ .code:n = {
+ \clist_set:Nn{\l_tmpa_clist}{##1}
+ \prop_gput:Nnx{\polyglossia@langsetup}{#1/hyphennames}{\clist_use:Nn \l_tmpa_clist {,}}
+ },
+ #1 / hyphennames
+ .value_required:n = true,
+ #1 / hyphennames
+ .initial:x = {\c_empty_clist},
+ % direction
+ #1 / direction
+ . code:n = {
+ \str_case_e:nnTF{##1}{
+ {LR}{}
+ {RL}{\RequireBidi}
+ }
+ {\prop_gput:Nnn{\polyglossia@langsetup}{#1/direction}{##1}}
+ {\xpg@error{Unknown~ direction~ "##1"~ for~ language~ "#1"}}
+ },
+ #1 / direction
+ .value_required:n = true,
+ #1 / direction
+ .initial:n = {LR},
+ % minimal left and right hyphenation minima using
+ #1 / hyphenmins
+ .code:n = {
+ % check syntax
+ \int_compare:nNnF { \clist_count:n {##1} } = {2}
+ {\xpg@error{hypenmins~should~be~a~list~of~two~entries,~got~"##1"}}
+ % set prop
+ \prop_gput:Nnn \polyglossia@langsetup {#1/hyphenmins} {##1}
+ },
+ #1 / hyphenmins
+ .value_required:n = true,
+ #1 / hyphenmins
+ .initial:n = {2,3},
+ % minimal length for hyphenation (LuaTeX only)
+ #1 / totalhyphenmin
+ .code:n = {
+ % check syntax
+ \int_compare:nNnF { \clist_count:n {##1} } = {1}
+ {\xpg@error{totalhyphenhypenmin~should~be~a~single~entry,~got~"##1"}}
+ % set prop
+ \prop_gput:Nnn \polyglossia@langsetup {#1/totalhyphenmin} {##1}
+ },
+ #1 / totalhyphenmin
+ .value_required:n = false,
+ % frenchspacing
+ #1 / frenchspacing
+ .code:n = {
+ \str_case_e:nnTF{##1}{
+ {true}{}
+ {false}{}
+ }
+ {}
+ {\xpg@error{frenchspacing~should~be~true~or~false. Is~ "##1"~ for~ language~ "#1"}}
+ \prop_gput:Nnn{\polyglossia@langsetup}{#1/frenchspacing}{##1}
+ },
+ #1 / frenchspacing
+ .default:n = true,
+ #1 / frenchspacing
+ .initial:n = false,
+ % indent first line
+ #1 / indentfirst
+ .code:n = {
+ \str_case_e:nnTF{##1}{
+ {true}{}
+ {false}{}
+ }
+ {}
+ {\xpg@error{indentfirst~should~be~true~or~false. Is~ "##1"~ for~ language "#1"}}
+ \prop_gput:Nnn{\polyglossia@langsetup}{#1/indentfirst}{##1}
+ },
+ #1 / indentfirst
+ .default:n = true,
+ #1 / indentfirst
+ .initial:n = false,
+ % fontsetup
+ #1 / fontsetup
+ .code:n = {
+ \str_case_e:nnTF{##1}{
+ {true}{}
+ {false}{}
+ }
+ {}
+ {\xpg@error{fontsetup~should~be~true~or~false. Is "##1"~ for~ language~ "#1"}}
+ \prop_gput:Nnn{\polyglossia@langsetup}{#1/fontsetup}{##1}
+ },
+ #1 / fontsetup
+ .default:n = true,
+ #1 / fontsetup
+ .initial:n = false,
+ % environment name
+ #1 / envname
+ .code:n = {
+ \prop_gput:Nnn{\polyglossia@langsetup}{#1/envname}{##1}
+ },
+ #1/ envname.value_required:n = true,
+ #1/ envname.initial:n = {#1},
+ % babel name
+ #1 / babelname
+ .code:n = {
+ \prop_gput:Nnn{\polyglossia@langsetup}{#1/babelname}{##1}
+ },
+ #1/ babelname.value_required:n = true,
+ #1/ babelname.initial:n = {#1},
+ % default numerals
+ #1 / localnumeral
+ . code:n = {
+ \prop_gput:Nnn{\polyglossia@langsetup}{#1/localnumeral}{##1}
+ \prop_gput:Nnn{\polyglossia@langsetup}{#1/Localnumeral}{##1}
+ },
+ #1 / localnumeral.value_required:n = true,
+ #1 / localnumeral.initial:n = {polyglossia@C@localnumeral},
+ % uppercased
+ #1 / Localnumeral
+ . code:n = {
+ \prop_gput:Nnn{\polyglossia@langsetup}{#1/Localnumeral}{##1}
+ },
+ #1 / Localnumeral.value_required:n = true,
+ #1 / Localnumeral.initial:n = {polyglossia@C@localnumeral}
+ }
+}
+
+% TODO move to C module
+\newcommand*{\polyglossia@C@localnumeral}[2]{
+ \polyglossia@Clang@@arabic{#2}
+}
+
+% print using main language
+% #2 is the numeral to print
+% #3 is the mainlanguage (should be expanded)
+% #4 is the current language (should be expanded)
+% #1 is the option list (should be expanded)
+% #5 is the name of the field to use
+\cs_new:Nn \polyglossia_localnumeral_mainlang:nnnnn {
+ \foreignlanguage{#3}{\use:c {\prop_item:Nn \polyglossia@langsetup {#3/#5}} {#1} {#2}}
+}
+
+
+% print using local language
+% #2 is the numeral to print
+% #3 is the mainlanguage (should be expanded)
+% #4 is the current language (should be expanded)
+% #1 is the option list (should be expanded)
+% #5 is the name of the field to use
+\cs_new:Nn \polyglossia_localnumeral_locallang:nnnnn {
+ \use:c {\prop_item:Nn \polyglossia@langsetup {#4/#5}} {#1} {#2}
+}
+
+% this function try to resolve some simple parameter about lang
+% call #2 then branching if found
+% call parameter #3 if not found
+% (use curing)
+\cs_new:Npn \polyglossia_localnumeral_callshortcutorlong:nF #1#2 {
+ \str_case:nnF{#1}{
+ {lang=local}{\polyglossia_localnumeral_locallang:nnnnn}
+ }
+ {#2}
+}
+
+\cs_new:Npn \polyglossia_iii_map_csv_field_split_kv_iii_localnumeral:w #1 = #2 \q_stop {
+ \str_case:nnF{#2}{
+ {local} {\clist_map_break:n{\use_i:nn \polyglossia_localnumeral_locallang:nnnnn }}
+ {default}{\clist_map_break:n{\use_i:nn \polyglossia_localnumeral_locallang:nnnnn }}
+ {*} {\clist_map_break:n{\use_i:nn\polyglossia_localnumeral_mainlang:nnnnn }}
+ {main} {\clist_map_break:n{\use_i:nn\polyglossia_localnumeral_mainlang:nnnnn }}
+ }{
+ \clist_map_break:n{ \use_i_ii:nnn \polyglossia_localnumeral_langlang:nnnnnn {{#2}} }
+ }
+}
+
+
+% call the language
+% #3 is the numeral to print
+% #4 is the mainlanguage (should be expanded)
+% #5 is the current language (should be expanded)
+% #2 is the option list (should be expanded)
+% #6 is the name of the field to use
+% #1 is the language used
+\cs_new:Nn \polyglossia_localnumeral_langlang:nnnnnn {
+ \foreignlanguage{#1}{\use:c {\prop_item:Nn \polyglossia@langsetup {#1/#6}} {#2} {#3}}
+}
+
+
+% check if empty value
+\cs_new:Npn \polyglossia_iii_map_csv_field_split_kv_ii_localnumeral:w #1 #2 = #3 \q_stop {
+ \quark_if_no_value:NTF {#3}
+ {
+ \clist_map_break:n{\use_i:nn \polyglossia_localnumeral_locallang:nnnnn}
+ }
+ {
+ \polyglossia_iii_map_csv_field_split_kv_iii_localnumeral:w #1 \q_stop
+ }
+}
+
+\cs_new:Npn \polyglossia_iii_map_csv_field_split_kv_i_localnumeral:nw #1 #2 = #3 \q_stop {
+ % parse only lang tag
+ \tl_trim_spaces_apply:nN {#2} \str_if_eq:nnT {lang}
+ {
+ % if empty value
+ \quark_if_nil:nTF{#3}
+ {
+ \clist_map_break:n{\use_i:nn \polyglossia_localnumeral_locallang:nnnn}
+ }
+ {
+ % here we know what we have an equal sign
+ \polyglossia_iii_map_csv_field_split_kv_ii_localnumeral:w {#1} #1 \q_no_value \q_stop
+ }
+ }
+}
+
+% map function
+\cs_new:Nn \polyglossia_iii_map_csv_localnumeral:n {
+ % fast case is do nothing is empty
+ \tl_if_empty:nF{#1}
+ {
+ \polyglossia_iii_map_csv_field_split_kv_i_localnumeral:nw {#1} #1 = \q_nil \q_stop
+ }
+}
+
+
+% treat option is empty and option is lang=local
+% #2 number
+% #3 mainlanguage
+% #4 locallanguage
+% #5 field to call
+% #1 option
+% strip space to option
+\cs_new:Nn \polyglossia_iii_localnumeral:nnnnn {
+ \tl_if_blank:nTF{#1}
+ {
+ \polyglossia_localnumeral_mainlang:nnnnn
+ }
+ {
+ \str_if_eq:nnTF{#1}{lang=local}
+ {
+ \polyglossia_localnumeral_locallang:nnnnn
+ }
+ {
+ % use postscript like trick push to stack {#1} {#2} {#3} {#4}
+ \polyglossia_localnumeral_callshortcutorlong:nF {#1}
+ {
+ % same trick here if found we emit \use_i:nn
+ % thus discarding the default choice that is not lang specified thus local
+ \clist_map_function:nN {#1} {\polyglossia_iii_map_csv_localnumeral:n}
+ \polyglossia_localnumeral_locallang:nnnnn
+ }
+ }
+ {#1} {#2} {#3} {#4} {#5}
+ }
+}
+
+
+% internal helper useful for oeee and onnn
+% #1 number
+% #2 mainlanguage
+% #3 locallanguage
+% #4 option
+% #5 field to call
+% strip space to option
+\cs_new:Nn \polyglossia_ii_localnumeral:nnnnn {
+ \tl_trim_spaces_apply:nN {#4} \polyglossia_iii_localnumeral:nnnnn {#1}{#2}{#3}{#5}
+}
+\cs_generate_variant:Nn \polyglossia_ii_localnumeral:nnnnn {
+ eeenn, eeeon, eeeen
+}
+
+% convert the counter to value
+% #1 counter
+% #2 mainlanguage
+% #3 locallanguage
+% #4 option
+\cs_new:Nn \polyglossia_i_localnumeral:nnnnn
+{
+ \polyglossia_ii_localnumeral:eeeen {\int_value:w #1} {#2} {#3} {#4} {#5}
+}
+
+% print number usage \localnumeral[option]{numeral}
+% or \localnumeral*[option]{counter}
+% \Localnumeral[]{numeral} use main language
+% \localnumeral{numeral} use local language
+\NewExpandableDocumentCommand{\localnumeral}{som}
+{
+ \IfBooleanTF{#1}%
+ {% starred: take counter
+ \exp_args:Nc \polyglossia_i_localnumeral:nnnnn {c@#3}
+ {\mainlanguagename} {\languagename} {\IfNoValueTF {#2}{lang=local}{#2}} {localnumeral}
+ }{% unstarred: take number
+ \polyglossia_ii_localnumeral:eeeen {\int_eval:n{#3}}
+ {\mainlanguagename} {\languagename} {\IfNoValueTF {#2}{lang=local}{#2}} {localnumeral}
+ }
+}
+
+% print number usage \Localnumeral[option]{numeral}
+% or \Localnumeral*[option]{counter}
+% \Localnumeral[]{numeral} use main language
+% \localnumeral{numeral} use local language
+\NewExpandableDocumentCommand{\Localnumeral}{som}
+{
+ \IfBooleanTF{#1}%
+ {% starred: take counter
+ \exp_args:Nc \polyglossia_i_localnumeral:nnnnn {c@#3}
+ {\mainlanguagename} {\languagename} {\IfNoValueTF {#2}{lang=local}{#2}} {Localnumeral}
+ }{% unstarred: take number
+ \polyglossia_ii_localnumeral:eeeon {\int_eval:n{#3}}
+ {\mainlanguagename} {\languagename} {\IfNoValueTF {#2}{lang=local}{#2}} {Localnumeral}
+ }
+}
+
+\cs_new_nopar:Nn{\polyglossia@lang@frenchspacing:n}{
+ \prop_get:NxNTF \polyglossia@langsetup {#1/frenchspacing} \l_tmpa_tl
+ {
+ \str_case_e:nnF{\l_tmpa_tl}{
+ {true}{\frenchspacing}
+ {false}{\nonfrenchspacing}
+ }
+ {\xpg@error{frenchspacing~should~be~true~or~false. Is~"\l_tmpa_ttl"~ for~ language~ "#1"}}
+ }
+ {
+ \xpg@error{Could~ not~ retrieve~ key~ frenchspacing~ for~ language~ "#1"}
+ \prop_show:N{\polyglossia@langsetup}
+ }
+}
+
+\cs_new_nopar:Nn{\polyglossia@lang@indentfirst:n}{
+ \prop_get:NxNTF \polyglossia@langsetup {#1/indentfirst} \l_tmpa_tl
+ {
+ \str_case_e:nnF{\l_tmpa_tl}{
+ {true}{\french@indent}
+ {false}{\nofrench@indent}
+ }
+ {\xpg@error{indentfirst~should~be~true~or~false. Is~"\l_tmpa_ttl"~ for~ language~ "#1"}}
+ }
+ {
+ \xpg@error{Could~ not~ retrieve~ key~ indentfirst~ for~ language~ "#1"}
+ \prop_show:N{\polyglossia@langsetup}
+ }
+}
+
+
+\cs_new:Nn{\polyglossia@lang@setpardirection:n}{
+ \prop_get:NxNTF \polyglossia@langsetup {#1/direction} \l_tmpa_tl
+ {
+ \polyglossia@setpardirection:n{\l_tmpa_tl}
+ }
+ {
+ \xpg@error{Could~ not~ retrieve~ key~ direction~ for~ language~ "#1"}
+ \prop_show:N{\polyglossia@langsetup}
+ }
+}
+
+
+\cs_new:Nn{\polyglossia@lang@settextdirection:nn}{
+ \prop_get:NxNTF \polyglossia@langsetup {#1/direction} \l_tmpa_tl
+ {
+ \polyglossia@settextdirection:n{\l_tmpa_tl}{#2}
+ }
+ {
+ \xpg@error{Could~ not~ retrieve~ key~ direction~ for~ language~ "#1"}
+ \prop_show:N{\polyglossia@langsetup}
+ }
+}
+
+\AtEndDocument{\prop_log:N{\polyglossia@langsetup}}
+\def\xpg@lastlanguage{0}%
+
+\providebool{xpg@hyphenation@disabled}%
+\boolfalse{xpg@hyphenation@disabled}
+
+\def\xpg@disablehyphenation{%
+ \ifx\@onlypreamble\@notprerr%
+ \xpg@@disablehyphenation%
+ \else%
+ % if this is used in the preamble, we have to postpone
+ % the execution until the main language has been set (#125).
+ \cs_gset_nopar:Nn \polyglossia@AtBeginDocument@hyphenation: {
+ \xpg@@disablehyphenation%
+ }%
+ \fi%
+}
+
+\def\xpg@@disablehyphenation{%
+ \ifbool{xpg@hyphenation@disabled}{}{%
+ \booltrue{xpg@hyphenation@disabled}%
+ \xdef\xpg@lastlanguage{\the\language}%
+ % We do not call \xpg@set@hyphenation@patterns here to avoid a warning message.
+ % "nohyphenation" is not listed in language.dat.lua.
+ \language=\l@nohyphenation%
+ }%
+}
+
+\def\xpg@enablehyphenation{%
+ \ifbool{xpg@hyphenation@disabled}{%
+ \boolfalse{xpg@hyphenation@disabled}%
+ \language=\csname xpg@lastlanguage\endcsname%
+ }{}%
+}
+
+\let\disablehyphenation\xpg@disablehyphenation
+\let\enablehyphenation\xpg@enablehyphenation
+
+%\def\xpg@fontsetup#1{\xpg@csifdef@warn{xpg@fontsetup@#1}}
+%\def\xpg@fontsetup@none#1{\csgdef{#1@font}{\ifcsdef{#1font}{\csname #1font\endcsname}{}}} %<-- simplistic
+%\def\xpg@fontsetup@custom#1{\csuse{#1@font}}
+
+\cs_new:Nn \polyglossia@lang@autosetupfont:n {
+ \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#1/fontsetup}}{true}
+ {
+ \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#1/lcscript}}{latin}%
+ {\xpg@fontsetup@latin{#1}}
+ {\xpg@fontsetup@nonlatin{#1}}
+ }
+ {
+ \xpg@info{Skipping~ automatic~ font~ setup~ for~ language~ #1}
+ }
+}
+
+
+% add fontfeature Language=#2 to langtag #1
+% do nothing if #1 or #2 is empty
+\cs_new:Nn \polyglossia@addfontfeature@language:nn {
+ \bool_if:nTF{\tl_if_empty_p:n{#1} || \tl_if_empty_p:n{#2}}
+ {
+ % maybe an error ?
+ \xpg@warning{Asking~ to~ add~ empty~ feature~to~ latin~ font~
+ (Language="#2"~ to~ langtag~ "#1")}
+ }
+ {
+ \str_if_eq:nnTF{#2}{Turkish}{
+ \fontspec_if_language:nTF {TRK}%
+ {
+ \addfontfeature{Language=Turkish}
+ }
+ {
+ \fontspec_if_language:nTF {TUR}%
+ {
+ \addfontfeature{Language=Turkish}
+ }{}
+ }
+ }{
+ \fontspec_if_language:nTF{#1}
+ {
+ \addfontfeature{Language=#2}
+ }
+ {}
+ }
+ }
+}
+\cs_generate_variant:Nn \polyglossia@addfontfeature@language:nn { on , no, oo , Vn, nV, VV , xn, nx, xx}
+
+% add fontfeature Script=#2 to scripttag #1
+% do nothing if #1 or #2 is empty
+\cs_new:Nn \polyglossia@addfontfeature@script:nn {
+ \bool_if:nTF{\tl_if_empty_p:n{#1} || \tl_if_empty_p:n{#2}}
+ {
+ % maybe an error ?
+ \xpg@warning{Asking~ to~ add~ empty~ feature~to~ latin~ font
+ (Script="#2"~ to~ scripttag~ "#1")}
+ }
+ {
+ \fontspec_if_script:nTF{#1}
+ {\addfontfeature{Script=#2}}
+ {\xpg@error{
+ The~ current~ latin ~ font~ \l_fontspec_family_tl\space does~ not~ contain~ the~"#2"~ script!\MessageBreak
+ Please~ define~\csname\tl_if_empty:nF{#2}{\str_lowercase:n#2}font\endcsname~
+ with~ \string\newfontfamily\space command
+ }
+ }
+ }
+}
+\cs_generate_variant:Nn \polyglossia@addfontfeature@script:nn { on , no, oo , Vn, nV, VV , xn, nx, xx}
+
+\def\xpg@fontsetup@latin#1{%
+ \begingroup
+ \csgdef{#1@font@rm}{%
+ \cs_if_exist_use:cF{#1font}{
+ \rmfamilylatin
+ \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}}
+ {\prop_item:Nn{\polyglossia@langsetup}{#1/language}}
+ }
+ }
+ \csgdef{#1@font@sf}{%
+ \cs_if_exist_use:cF{#1fontsf}{
+ \sffamilylatin
+ \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}}
+ {\prop_item:Nn{\polyglossia@langsetup}{#1/language}}
+ }%
+ }%
+ \csgdef{#1@font@tt}{%
+ \cs_if_exist_use:cF{#1fonttt}{
+ \ttfamilylatin
+ \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}}
+ {\prop_item:Nn{\polyglossia@langsetup}{#1/language}}
+ }%
+ }%
+ \endgroup
+}
+
+\def\xpg@fontsetup@nonlatin#1{%
+ \begingroup
+ \csgdef{#1@font@rm}{%
+ \cs_if_exist_use:cF{#1font}
+ {
+ \providetoggle{#1@use@script@font}%
+ \str_if_eq:nnTF{\prop_item:Nn{\polyglossia@langsetup}{#1/script}}{\prop_item:Nn{\polyglossia@langsetup}{#1/language}}
+ {\rmfamilylatin}%
+ {\cs_if_exist_use:cTF{\prop_item:Nn{\polyglossia@langsetup}{#1/lcscript} font}
+ {
+ \toggletrue{#1@use@script@font}%
+ }
+ {
+ \rmfamilylatin
+ }
+ }
+ \iftoggle{#1@use@script@font}{}{%
+ \polyglossia@addfontfeature@script:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/scripttag}}
+ {\prop_item:Nn{\polyglossia@langsetup}{#1/script}}
+ }%
+ \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}}
+ {\prop_item:Nn{\polyglossia@langsetup}{#1/language}}
+ }}%
+ \csgdef{#1@font@sf}{%
+ \cs_if_exist_use:cF{#1fontsf}%
+ {
+ \providetoggle{#1@use@script@fontsf}%
+ \str_if_eq:nnTF{\prop_item:Nn{\polyglossia@langsetup}{#1/script}}{\prop_item:Nn{\polyglossia@langsetup}{#1/language}}
+ {\sffamilylatin}%
+ {\cs_if_exist_use:cTF{\prop_item:Nn{\polyglossia@langsetup}{#1/lcscript} fontsf}
+ {
+ \toggletrue{#1@use@script@fontsf}%
+ }
+ {
+ \sffamilylatin
+ }
+ }
+ \iftoggle{#1@use@script@fontsf}{}{%
+ \polyglossia@addfontfeature@script:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/scripttag}}
+ {\prop_item:Nn{\polyglossia@langsetup}{#1/script}}
+ }%
+ \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}}
+ {\prop_item:Nn{\polyglossia@langsetup}{#1/language}}
+ }}%
+ \csgdef{#1@font@tt}{%
+ \cs_if_exist_use:cF{#1fonttt}%
+ {
+ \providetoggle{#1@use@script@fonttt}%
+ \str_if_eq:nnTF{\prop_item:Nn{\polyglossia@langsetup}{#1/script}}{\prop_item:Nn{\polyglossia@langsetup}{#1/language}}
+ {\ttfamilylatin}%
+ {\cs_if_exist_use:cTF{\prop_item:Nn{\polyglossia@langsetup}{#1/lcscript} fonttt}
+ {
+ \toggletrue{#1@use@script@fonttt}%
+ }
+ {
+ \ttfamilylatin
+ }
+ }
+ \iftoggle{#1@use@script@fonttt}{}{%
+ \polyglossia@addfontfeature@script:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/scripttag}}
+ {\prop_item:Nn{\polyglossia@langsetup}{#1/script}}
+ }%
+ \polyglossia@addfontfeature@language:xx{\prop_item:Nn{\polyglossia@langsetup}{#1/langtag}}
+ {\prop_item:Nn{\polyglossia@langsetup}{#1/language}}
+ }}%
+ \endgroup
+}
+
+%%% END OF PolyglossiaSetup
+
+%% ensure localization of \markright and \markboth commands
+%%% THIS IS NOW DISABLED BY DEFAULT
+\cs_new_nopar:Nn {\polyglossia@local@marks:n} {}
+\cs_new_nopar:Nn {\polyglossia@enable@local@marks:}
+{
+ \xpg@info{Option:~ localmarks}%
+ \cs_gset_nopar:Nn \polyglossia@local@marks:n
+ {%
+ \def\xpg@tmp@lang{##1}%
+ \DeclareRobustCommand\markboth[2]{%
+ \begingroup
+ \let\label\relax \let\index\relax \let\glossary\relax
+ \unrestored@protected@xdef\@themark
+ {%
+ {\lowercase{\foreignlanguage{\xpg@tmp@lang}}{\protect\@@ensure@maindir{####1}}}%
+ {\lowercase{\foreignlanguage{\xpg@tmp@lang}}{\protect\@@ensure@maindir{####2}}}%
+ }%
+ \@temptokena \expandafter{\@themark}%
+ \mark{\the\@temptokena}%
+ \endgroup
+ \if@nobreak\ifvmode\nobreak\fi\fi%
+ }%
+ \DeclareRobustCommand\markright[1]{%
+ \begingroup
+ \let\label\relax \let\index\relax \let\glossary\relax
+ \expandafter\@markright\@themark
+ {\lowercase{\foreignlanguage{\xpg@tmp@lang}}{\protect\@@ensure@maindir{####1}}}%
+ \@temptokena \expandafter{\@themark}%
+ \mark{\the\@temptokena}%
+ \endgroup
+ \if@nobreak\ifvmode\nobreak\fi\fi%
+ }%
+% This part seems wrong (see #396 for explanation). Remove after a while.
+% \def\@markright####1####2####3{%
+% \@temptokena{\protect\@@ensure@maindir{####1}}%
+% \unrestored@protected@xdef\@themark{%
+% {\the\@temptokena}%
+% {\protect\@@ensure@maindir{####3}}%
+% }%
+% }%
+ }%
+}
+
+
+% Easy way out – Arthur, 2012-08-01
+\ifcsdef{newXeTeXintercharclass}{%
+% to reset the intercharclass of a character to "normal"
+\newXeTeXintercharclass\xpg@normalclass %TODO
+}{}
+
+\ifxetex
+%% when no patterns are available, we use \l@nohyphenation, assigned to 255
+%% (suggestion by Enrico Gregorio)
+ \@ifundefined{l@nohyphenation}{\chardef\l@nohyphenation=255 }{}
+\else\ifluatex
+ \@ifundefined{l@nohyphenation}{\chardef\l@nohyphenation=\directlua{
+ tex.sprint(polyglossia.newloader_loaded_languages.nohyphenation)}\relax
+ }{}
+\fi\fi
+
+%we call this macro when a gloss file is not found for a given language
+\def\xpg@nogloss#1{%
+ \xpg@warning{File~ gloss-#1.ldf~ does~ not~ exist!\MessageBreak
+ I~ will~ nevertheless~ try~ to~ use~ hyphenation~ patterns~ for~ #1.}%
+ \PolyglossiaSetup{#1}{hyphenmins,hyphennames={#1},fontsetup=true}%
+ % the above amounts to:
+ %\ifcsundef{l@#1}%
+ % {\expandafter\adddialect\csname l@#1\endcsname\l@nohyphenation\relax}%
+ % {\setlocalhyphenmins{#1}{2}{3}}%
+ %\csdef{#1@language}{\language=\csname l@#1\endcsname}%
+}
+
+\newcommand{\xpg@input}[1]{%
+ % Store catcode of @ before making at letter
+ \chardef\xpg@saved@at@catcode\catcode`\@
+ \makeatletter
+ \input{#1}%
+ % restore former @ catcode
+ \catcode`\@=\xpg@saved@at@catcode%
+}
+
+% try to load a language file
+\cs_new:Nn \polyglossia_load_lang_definition:nn {
+ \file_if_exist:nTF{gloss-#2.ldf}
+ {
+ % Temporarily force catcode of ~ to 13 since babelsh.def
+ % requires it. This is needed particularly with LaTeX3
+ % packages which force \ExplSyntaxOn (#425)
+ \protected\edef\xpg@restore@tilde@catcode{\catcode 126 = \the\catcode 126\relax}
+ \catcode 126 = 13
+ \xpg@input{gloss-#2.ldf}
+ \setkeys{#2}{#1}
+ % restore former ~ catcode
+ \xpg@restore@tilde@catcode
+ }
+ {
+ \xpg@nogloss{#2}
+ }
+}
+
+% load a master language from an alias file
+\newcommand*\xpg@load@master@language[1] {
+ \xpg@input{gloss-#1.ldf}
+ \ifcsundef{#1@loaded}%
+ {
+ \exp_args:Nx\polyglossia@define@language@cmd:n{#1}%
+ }{}
+ \polyglossia@register@language:nn{}{#1}%
+ \csgdef{#1@loaded}{}%
+}
+
+
+% define environment and command
+\cs_new:Nn \polyglossia@define@language@cmd:n {
+ \ifcsundef{#1@alias@lang}{%
+ \exp_args:Ne
+ \newenvironment {\prop_item:Nn{\polyglossia@langsetup}{#1/envname}} [1] []
+ {
+ \begin{otherlanguage}[##1]{#1}
+ }%
+ {
+ \end{otherlanguage}
+ }%
+ \exp_args:Nc \newcommand {text#1} [2][]
+ {%
+ \xpg@textlanguage[##1]{#1}{##2}%
+ }%
+ }{}
+}
+
+% provide way to define alias environment and command
+% \setlanguagealias[<options>]{<language>}{<alias>}
+\DeclareDocumentCommand \setlanguagealias {s O{} m m}
+{
+ % The starred version does not define commands and environments
+ \IfBooleanF {#1}
+ {
+ \ifcsundef{#4@alias@lang}{%
+ \exp_args:Ne
+ \newenvironment {#4}
+ {
+ \begin{otherlanguage}[#2]{#3}
+ }%
+ {
+ \end{otherlanguage}
+ }%
+ \exp_args:Nc \newcommand {text#4} [2][]
+ {%
+ \xpg@textlanguage[#2,##1]{#3}{##2}%
+ }%
+ }{%
+ \exp_args:Ne
+ \renewenvironment {#4}
+ {
+ \begin{otherlanguage}[#2]{#3}
+ }%
+ {
+ \end{otherlanguage}
+ }%
+ \exp_args:Nc \renewcommand {text#4} [2][]
+ {%
+ \xpg@textlanguage[#2,##1]{#3}{##2}%
+ }%
+ }%
+ }%
+ \csgdef{#4@alias@lang}{#3}%
+ \tl_if_blank:nF {#2} {\csgdef{#4@alias@opts}{#2}}%
+}
+
+\cs_new:Nn \polyglossia@register@language:nn {
+ % register polyglossia language name
+ \ifcsundef{#2@registered}{%
+ \global\edef\xpg@loaded{%
+ \ifx\xpg@loaded\@empty\else\xpg@loaded,\fi #2%
+ }%
+ }{}
+ \csgdef{#2@registered}{}%
+ \tl_if_blank:nF {#1}{%
+ % Register the language options
+ \polyglossia@set@lang@options:nn {#2} {#1}%
+ }%
+ % register babelname
+ \def\xpg@tmp@babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ \ifcsundef{\csname xpg@tmp@babelname\endcsname @bbl@registered}{%
+ \global\edef\xpg@bloaded{%
+ \ifx\xpg@bloaded\@empty\else\xpg@bloaded,\fi\xpg@tmp@babelname}%
+ }{}%
+ \csgdef{\csname xpg@tmp@babelname\endcsname @bbl@registered}{}%
+ % register BCP-47 ID
+ \def\xpg@tmp@bcpname{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}%
+ \ifcsundef{\csname xpg@tmp@bcpname\endcsname @bcp@registered}{%
+ \global\edef\xpg@bcp@loaded{%
+ \ifx\xpg@bcp@loaded\@empty\else\xpg@bcp@loaded,\fi\xpg@tmp@bcpname}%
+ }{}%
+ \csgdef{\csname xpg@tmp@bcpname\endcsname @bcp@registered}{}%
+}
+
+
+\newcommand{\setdefaultlanguage}[2][]{%
+ % latex is an internal language, so do not record
+ \ifstrequal{#2}{latex}{}{%
+ % register polyglossia language name
+ \ifcsundef{#2@registered}{%
+ \global\edef\xpg@loaded{%
+ \ifx\xpg@loaded\@empty\else\xpg@loaded,\fi #2%
+ }%
+ }{}%
+ \csgdef{#2@registered}{}%
+ }%
+ \ifcsundef{#2@loaded}%
+ {
+ \polyglossia_load_lang_definition:nn{#1}{#2}
+ % define environment and command (except for internal latex language)
+ \ifstrequal{#2}{latex}{}{%
+ \exp_args:Nx\polyglossia@define@language@cmd:n{#2}
+ }%
+ \csgdef{#2@loaded}{}%
+ }
+ {
+ \relax
+ }
+ \ifcsdef{#2@alias@lang}{%
+ \ifcsdef{#2@alias@opts}{%
+ \exp_args:Nxx \polyglossia_load_lang_definition:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}%
+ \exp_args:Nxx \polyglossia@set@default@language:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}%
+ }{%
+ \polyglossia@set@default@language:nn {#1} {\csuse{#2@alias@lang}}%
+ }%
+ }{%
+ \polyglossia@set@default@language:nn {#1} {#2}%
+ }%
+}
+
+\cs_new:Nn \polyglossia@set@default@language:nn
+{
+ \gdef\xpg@main@language{#2}%
+ \tl_if_blank:nTF {#1}{\gdef\mainlanguagevariant{}}{%
+ % Register the language options
+ \polyglossia@set@lang@options:nn {#2} {#1}%
+ }%
+ \csgdef{#2@gvar}{\mainlanguagevariant}%
+ %% The following settings are for the default language and script
+ % this tells bidi.sty or luabidi.sty that the document is RTL
+ \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}}{RL}{%
+ \str_case_e:nnF{\c_sys_engine_str}{%
+ {luatex}{\setRTLmain}
+ {xetex}{\@RTLmaintrue\setnonlatin}
+ }{}%
+ }{}%
+ \cs_gset_nopar:Nn \polyglossia@AtBeginDocument@selectlanguage: {
+ \selectbackgroundlanguage{#2}
+ \selectlanguage[#1]{#2}%
+ }
+ \xpg@info{Default~ language~ is~ #2}%
+ \polyglossia@set@language@name[#1]{#2}%
+ \def\mainlanguagename{#2}
+ % Store babelname of main language (for external packages such as biblatex)
+ \prop_get:NxNT \polyglossia@langsetup {#2/babelname} \l_tmpa_tl
+ { \edef\mainbabelname{\l_tmpa_tl} }
+ % Store babelname of current language (for external packages such as biblatex)
+ \prop_get:NxNT \polyglossia@langsetup {#2/babelname} \l_tmpa_tl
+ { \edef\babelname{\l_tmpa_tl}%
+ \cs_gset_eq:cc{#2@gbabelname}{babelname}%
+ }
+ % Store BCP-47 id of main language
+ \prop_get:NxNT \polyglossia@langsetup {#2/bcp47} \l_tmpa_tl
+ { \csedef{mainbcp47id}{\l_tmpa_tl} }
+ % Store BCP-47 id of current language
+ \prop_get:NxNT \polyglossia@langsetup {#2/bcp47} \l_tmpa_tl
+ { \csedef{bcp47id}{\l_tmpa_tl}%
+ \cs_gset_eq:cc{#2@gbcp47id}{bcp47id}%
+ }
+ \ifluatex %
+ \directlua{polyglossia.set_default_language('\luatexluaescapestring{\string#2}')}%
+ \fi %
+}
+
+\let\setmainlanguage=\setdefaultlanguage
+
+% Returns the language ID of the current language
+% Currently supported: bcp-47
+\DeclareDocumentCommand \languageid {m}
+{
+ \str_case:nnTF {#1}
+ {
+ {bcp-47} { \csuse{bcp47id} }
+ {bcp47} { \csuse{bcp47id} }
+ }
+ {}
+ {
+ \xpg@error{Invalid~ \string\languageid\space argument:~ #1}
+ }
+}
+
+% Returns the language ID of the main language
+% Currently supported: bcp-47
+\DeclareDocumentCommand \mainlanguageid {m}
+{
+ \str_case:nnTF {#1}
+ {
+ {bcp-47} { \csuse{mainbcp47id} }
+ {bcp47} { \csuse{mainbcp47id} }
+ }
+ {}
+ {
+ \xpg@error{Invalid~ \string\mainlanguageid\space argument:~ #1}
+ }
+}
+
+\def\mainbabelname{}%
+\def\mainlanguagevariant{}%
+% Store main language variant for external packages
+\define@key{xpg@main@langvariant}{variant}{%
+ \gdef\mainlanguagevariant{#1}%
+}
+
+\def\babelname{}%
+\def\languagevariant{}%
+% Store current language variant for external packages
+\define@key{xpg@set@langvariant}{variant}{%
+ \def\languagevariant{#1}%
+}
+
+\newcommand*\polyglossia@set@language@name[2][]{
+ \def\languagename{#2}%
+ \tl_if_blank:nTF {#1}{%
+ \ifcsundef{#2@gvar}{\def\languagevariant{}}{\def\languagevariant{\csuse{#2@gvar}}}
+ }{%
+ % Register the language options
+ \polyglossia@set@lang@options:nn {#2} {#1}%
+ }%
+}
+
+
+\newcommand*{\resetdefaultlanguage}[2][]{%
+ \ifcsdef{#2@alias@lang}{%
+ \ifcsdef{#2@alias@opts}{%
+ \exp_args:Nxx \polyglossia@reset@default@language:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}%
+ }{%
+ polyglossia@reset@default@language:nn {#1} {\csuse{#2@alias@lang}}%
+ }%
+ }{%
+ polyglossia@reset@default@language:nn {#1} {#2}%
+ }%
+}
+
+\cs_new:Nn \polyglossia@reset@default@language:nn
+{
+ \polyglossia@error@iflangnotloaded:n{#2}
+ % disable globalnumbers of previously defined default language
+ \csuse{no\xpg@main@language @globalnumbers}
+ \csuse{noextras@\xpg@main@language}%
+ % This is a hook for external packages which want to access variants
+ % via babelname (such as biblatex)
+ \cs_if_exist_use:c{noextras@bbl@\mainbabelname}%
+ \csuse{init@noextras@\xpg@main@language}%
+ \polyglossia@set@language@name[#1]{#2}%
+ \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}}{RL}{\@rlmaintrue\@rl@footnotetrue}{}%
+ \selectlanguage[#1]{#2}%
+ \selectbackgroundlanguage{#2}%
+ % Store babelname of current language (for external packages such as biblatex)
+ \tl_if_blank:nTF {#1}{%
+ \ifcsundef{#2@gbabelname}{%
+ \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ }{%
+ \edef\babelname{\csuse{#2@gbabelname}}%
+ }%
+ }{%
+ \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ }%
+ % Store BCP-47 id of current language
+ \tl_if_blank:nTF {#1}{%
+ \ifcsundef{#2@gbcp47id}{%
+ \csedef{bcp47id}{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}%
+ }{%
+ \csedef{bcp47id}{\csuse{#2@gbcp47id}}%
+ }%
+ }{%
+ \csedef{bcp47id}{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}%
+ }%
+}
+
+% This saves the normalfont for the latin script since we may change normalfont in other scripts
+\let\normalfontlatin=\normalfont%
+
+% Provide default fonts (as set with \setmainfont, \setsansfont and \setmonofont)
+% for Latin scripts and as a fallback for non-Latin scripts.
+\DeclareRobustCommand\xpg@defaultfont@rm{%
+ \tl_if_empty:NF{\g__fontspec_nfss_enc_tl}{\fontencoding{\g__fontspec_nfss_enc_tl}}%
+ \fontfamily\rmdefault%
+ \selectfont%
+}
+\DeclareRobustCommand\xpg@defaultfont@sf{%
+ \tl_if_empty:NF{\g__fontspec_nfss_enc_tl}{\fontencoding{\g__fontspec_nfss_enc_tl}}%
+ \fontfamily\sfdefault%
+ \selectfont%
+}
+\DeclareRobustCommand\xpg@defaultfont@tt{%
+ \tl_if_empty:NF{\g__fontspec_nfss_enc_tl}{\fontencoding{\g__fontspec_nfss_enc_tl}}%
+ \fontfamily\ttdefault%
+ \selectfont%
+}
+
+\def\xpg@patch@fontfamilies{%
+ % This robustifies the redefinitions of \<xx>family (suggestion by Enrico Gregorio)
+ % e.g. to prevent expansion of the \familytype redefinition in auxiliary files
+ \csgappto{rmfamily~}{\def\familytype{rm}}
+ \csgappto{sffamily~}{\def\familytype{sf}}
+ \csgappto{ttfamily~}{\def\familytype{tt}}
+}
+
+% These switches activate the default fonts
+% Note that a simple \let\rmfamilylatin=\rmfamily
+% does not work reliably (see #24)
+\cs_gset_eq:cc{rmfamilylatin}{xpg@defaultfont@rm}%
+\cs_gset_eq:cc{sffamilylatin}{xpg@defaultfont@sf}%
+\cs_gset_eq:cc{ttfamilylatin}{xpg@defaultfont@tt}%
+
+\def\xpg@set@familydefault{%
+ % We need the \edef route here in order
+ % to detect both \renewcommand and \let
+ % changes.
+ \edef\tempa{\familydefault}%
+ \edef\tempb{\sfdefault}%
+ \ifcsequal{tempa}{tempb}%
+ {\def\familytype{sf}}
+ {\edef\tempb{\ttdefault}%
+ \ifcsequal{tempa}{tempb}%
+ {\def\familytype{tt}}
+ {\def\familytype{rm}}}
+ \xpg@patch@fontfamilies%
+ % This (re-)saves the normalfont for the latin script since we may
+ % change normalfont in other scripts
+ \let\normalfontlatin=\normalfont%
+ % And for all cases, we also reset \<xx>familylatin
+ \cs_gset_eq:cc{rmfamilylatin}{xpg@defaultfont@rm}%
+ \cs_gset_eq:cc{sffamilylatin}{xpg@defaultfont@sf}%
+ \cs_gset_eq:cc{ttfamilylatin}{xpg@defaultfont@tt}%
+}
+
+\def\resetfontlatin{%
+ \DeclareRobustCommand\rmfamily{\xpg@defaultfont@rm}%
+ \DeclareRobustCommand\sffamily{\xpg@defaultfont@sf}%
+ \DeclareRobustCommand\ttfamily{\xpg@defaultfont@tt}%
+ \xpg@patch@fontfamilies%
+ \global\let\normalfont=\normalfontlatin%
+}
+
+\def\selectfontfamilylatin{%
+ \def\tmp@tt{tt}\def\tmp@sf{sf}%
+ \ifx\familytype\tmp@tt%
+ \ttfamilylatin%
+ \else\ifx\familytype\tmp@sf%
+ \sffamilylatin%
+ \else\rmfamilylatin\fi\fi}
+
+\def\xpg@select@fontfamily#1{%
+ \def\tmp@tt{tt}\def\tmp@sf{sf}%
+ \ifx\familytype\tmp@tt
+ \csuse@warn{#1@font@tt}%
+ \else\ifx\familytype\tmp@sf
+ \csuse@warn{#1@font@sf}%
+ \else\csuse@warn{#1@font@rm}\fi\fi}
+
+\def\xpg@set@normalfont#1{%
+ \DeclareRobustCommand\rmfamily{\csuse{#1@font@rm}}%
+ \DeclareRobustCommand\sffamily{\csuse{#1@font@sf}}%
+ \DeclareRobustCommand\ttfamily{\csuse{#1@font@tt}}%
+ \gdef\normalfont{\protect\xpg@select@fontfamily{#1}%
+ \fontseries{\seriesdefault}\selectfont%
+ \fontshape{\shapedefault}\selectfont}%
+ \gdef\reset@font{\protect\normalfont}%
+}
+
+\let\@@fterindentfalse\@afterindentfalse
+\def\french@indent{%
+ \let\@afterindentfalse\@afterindenttrue
+ \@afterindenttrue%
+}
+\def\nofrench@indent{%
+ \let\@afterindentfalse\@@fterindentfalse
+ \@afterindentfalse%
+}
+
+\newcommand*{\selectbackgroundlanguage}[1]{%
+ \ifcsdef{#1@alias@lang}{%
+ \polyglossia@select@background@language:n {\csuse{#1@alias@lang}}%
+ }{%
+ \polyglossia@select@background@language:n {#1}%
+ }%
+}
+
+\cs_new:Nn \polyglossia@select@background@language:n
+{
+ \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#1/lcscript}}{latin}
+ {}
+ {\xpg@set@normalfont{#1}}%
+ \csuse{#1@globalnumbers}%
+}
+
+\newcommand{\setotherlanguage}[2][]{%
+ \ifcsundef{#2@loaded}
+ {
+ \polyglossia_load_lang_definition:nn{#1}{#2}
+ % define environment and command
+ \exp_args:Nx\polyglossia@define@language@cmd:n{#2}
+ \ifcsdef{#2@alias@lang}{%
+ \ifcsdef{#2@alias@opts}{%
+ \exp_args:Nxx \polyglossia_load_lang_definition:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}%
+ \exp_args:Nxx \polyglossia@set@other@language:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}%
+ }{%
+ \polyglossia@set@other@language:nn {#1} {\csuse{#2@alias@lang}}%
+ }%
+ }{%
+ \polyglossia@set@other@language:nn {#1} {#2}%
+ }%
+ \csgdef{#2@loaded}{}%
+ }
+ {}
+}
+
+\cs_new:Nn \polyglossia@set@other@language:nn
+{
+ \polyglossia@register@language:nn{#1}{#2}%
+ % If a variant is set, store it.
+ \gdef\otherlanguagevariant{}
+ \tl_if_blank:nTF {#1}{}{%
+ % Register the language options
+ \polyglossia@set@lang@options:nn {#2} {#1}%
+ }%
+ \csgdef{#2@gvar}{\otherlanguagevariant}%
+ \prop_get:NxNT \polyglossia@langsetup {#2/babelname} \l_tmpa_tl
+ { \xdef\otherlanguagebabelname{\l_tmpa_tl} }
+ \cs_gset_eq:cc{#2@gbabelname}{otherlanguagebabelname}%
+}
+
+% Store main language variant for external packages
+\define@key{xpg@other@langvariant}{variant}{%
+ \gdef\otherlanguagevariant{#1}%
+}
+
+\newcommand\setotherlanguages[1]{%
+ \def\do##1{\setotherlanguage{##1}}%
+ \exp_args:Nx\docsvlist{#1}}%
+
+\def\common@language{% FIXME is this really needed???
+ \ifbool{xpg@hyphenation@disabled}{%
+ \xdef\xpg@lastlanguage{\z@}%
+ }{%
+ \language=\z@
+ }%
+ \lefthyphenmin=\tw@
+ \righthyphenmin=\thr@@}
+
+\def\xpg@initial@setup{%
+ \common@language%
+}
+
+
+% Alias to \text<lang>, but more suitable
+% for specific (esp. tag-based) aliases
+% where \text<alias> would cause clashes
+% (e.g., \textit)
+\newcommand\textlang[3][]{%
+ \ifcsdef{#2@alias@lang}{%
+ \ifcsdef{#2@alias@opts}{%
+ \exp_args:Nxx \xpg@textlanguage[\csuse{#2@alias@opts},#1]{\csuse{#2@alias@lang}}{#3}%
+ }{%
+ \xpg@textlanguage[#1]{\csuse{#2@alias@lang}}{#3}%
+ }%
+ }{%
+ \xpg@textlanguage[#1]{#2}{#3}%
+ }%
+}%
+
+% Alias to {<lang>}, but more suitable
+% for specific (esp. tag-based) aliases
+% where {<alias>} would cause clashes
+% (e.g., \fi)
+\newenvironment{lang}[2][]{%
+ \begin{otherlanguage}[#1]{#2}%
+}{%
+ \end{otherlanguage}
+}%
+
+\providecommand{\foreignlanguage}{}
+
+% wrapper for foreignlanguage and otherlanguage*
+\newcommand*\polyglossia@setforeignlanguage[2][]{
+ \select@@language[#1]{#2}
+ \polyglossia@register@language:nn{#1}{#2}%
+ % Store babelname of current language (for external packages such as biblatex)
+ \tl_if_blank:nTF {#1}{%
+ \ifcsundef{#2@gbabelname}{%
+ \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ }{%
+ \edef\babelname{\csuse{#2@gbabelname}}%
+ }%
+ }{%
+ \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ }%
+ % Store BCP-47 id of current language
+ \tl_if_blank:nTF {#1}{%
+ \ifcsundef{#2@gbcp47id}{%
+ \csedef{bcp47id}{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}%
+ }{%
+ \csedef{bcp47id}{\csuse{#2@gbcp47id}}%
+ }%
+ }{%
+ \csedef{bcp47id}{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}%
+ }%
+}
+
+% joint code of \foreignlanguage, otherlanguage*
+% and \text<lang>
+\newcommand{\xpg@otherlanguage}[2][]
+{%
+ \polyglossia@error@iflangnotloaded:n{#2}
+ \exp_args:Nne \setkeys{#2}{#1}%
+ \polyglossia@setforeignlanguage[#1]{#2}
+ % Hook for external packages such as biblatex
+ \polyglossia@language@switched%
+ % buggy restoration heure
+ \csuse{inlineextras@#2}%
+ % This is a hook for external packages which want to access variants
+ % via babelname (such as biblatex)
+ \cs_if_exist_use:c{inlineextras@bbl@\babelname}%
+}
+
+\renewcommand{\foreignlanguage}[3][]
+{%
+ \ifcsdef{#2@alias@lang}{%
+ \ifcsdef{#2@alias@opts}{%
+ \exp_args:Nxx \polyglossia@foreignlanguage:nnn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}} {#3}%
+ }{%
+ \polyglossia@foreignlanguage:nnn {#1} {\csuse{#2@alias@lang}} {#3}%
+ }%
+ }{%
+ \polyglossia@foreignlanguage:nnn {#1} {#2} {#3}%
+ }%
+}
+
+\cs_new:Nn \polyglossia@foreignlanguage:nnn
+{
+ \polyglossia@error@iflangnotloaded:n{#2}
+ \bgroup
+ \xpg@otherlanguage[#1]{#2}%
+ \polyglossia@lang@settextdirection:nn{#2}{#3}%
+ \egroup
+}
+
+% otherlanguage* is the environment equivalent of \foreignlanguage
+\expandafter\providecommand\csname otherlanguage*\endcsname{}
+
+\renewenvironment{otherlanguage*}[2][]
+{%
+ \ifcsdef{#2@alias@lang}{%
+ \ifcsdef{#2@alias@opts}{%
+ \exp_args:Nxx \polyglossia@otherlanguage:nn {\csuse{#2@alias@opts},#1} {\csuse{#2@alias@lang}}%
+ }{%
+ \polyglossia@otherlanguage:nn {#1} {\csuse{#2@alias@lang}}%
+ }%
+ }{%
+ \polyglossia@otherlanguage:nn {#1} {#2}%
+ }%
+}
+{\egroup}
+
+\cs_new:Nn \polyglossia@otherlanguage:nn
+{
+ \xpg@otherlanguage[#1]{#2}%
+ \polyglossia@lang@settextdirection:nn{#2}\bgroup%
+}
+
+% use by \text<lang> and \textlang. Equivalent to \foreignlanguage,
+% except that dates are localized.
+\newcommand\xpg@textlanguage[3][]{%
+ \polyglossia@error@iflangnotloaded:n{#2}
+ \bgroup
+ \xpg@otherlanguage[#1]{#2}%
+ \csuse{date#2}%
+ % This is a hook for external packages which want to access variants
+ % via babelname (such as biblatex)
+ \cs_if_exist_use:c{date@bbl@\babelname}%
+ \polyglossia@lang@settextdirection:nn{#2}{#3}%
+ \egroup
+ % Reset the language's/script's font families
+ \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/lcscript}}{latin}{}{\resetfontlatin}%
+}
+
+
+% Define language-specific hyphenation exceptions
+\newcommand\pghyphenation[3][]{
+ \bgroup
+ \polyglossia@error@iflangnotloaded:n{#2}
+ \setkeys{#2}{#1}%
+ \select@@language[#1]{#2}%
+ \hyphenation{#3}%
+ \egroup
+}
+
+
+% Hook that other package authors can use
+% (for instance biblatex):
+\newcommand*{\xpg@hook@setlanguage}{}
+
+\def\xpg@pop@language@i#1#2{%
+ \xpg@set@language@aux[#1]{#2}%
+ \xpg@hook@setlanguage
+ \let\emp@langname\@undefined}
+
+\DeclareDocumentCommand \selectlanguage {s O{} m}
+{%
+ \ifcsdef{#3@alias@lang}{%
+ \ifcsdef{#3@alias@opts}{%
+ \exp_args:Nxx \polyglossia@select@language:nnn {#1} {\csuse{#3@alias@opts},#2} {\csuse{#3@alias@lang}}%
+ }{%
+ \polyglossia@select@language:nnn {#1} {#2} {\csuse{#3@alias@lang}}%
+ }%
+ }{%
+ \polyglossia@error@iflangnotloaded:n{#3}%
+ \polyglossia@select@language:nnn {#1} {#2} {#3}%
+ }
+}
+
+\cs_new:Nn \polyglossia@select@language:nnn
+{
+ \IfBooleanF {#1}
+ {
+ \cs_set_nopar:Npx \xpg@pop@language { \exp_not:N \xpg@pop@language@i {#2} {#3} }
+ \group_insert_after:N \xpg@pop@language
+ }
+ \tl_if_blank:nTF {#2}{}{%
+ % Register the language options
+ \polyglossia@set@lang@options:nn {#3} {#2}%
+ }%
+ % The starred variant does not write to the aux
+ \IfBooleanTF#1{%
+ \xpg@set@language@nonaux[#2]{#3}%
+ }{%
+ \xpg@set@language@aux[#2]{#3}%
+ }%
+ \ifluatex%
+ \directlua{polyglossia.select_language('\luatexluaescapestring{\string#3}',
+ \the\csname l@#3\endcsname)}%
+ \fi%
+ \polyglossia@register@language:nn{#2}{#3}%
+}
+
+
+\cs_new:Nn \polyglossia@set@lang@options:nn
+{
+ % If the optional argument sets a value for the key “variant”, copy it to xpg@langvariant
+ \clist_map_inline:nn { #2 } {%
+ \xpg@parsevariantkeyvalue##1=@xpg@langvariant:#1\relax
+ }%
+ \exp_args:Nne \setkeys{#1}{#2}%
+}
+
+% Initialize default language options, so that
+% \iflanguageoption has the info it needs also
+% for default settings
+\newcommand*\xpg@initialize@gloss@options[2]{%
+ \polyglossia@set@lang@options:nn {#1} {#2}%
+}
+
+% Record synonymous keyvals such as variant=us and variant=american
+% Syntax: \xpg@set@alias@values{<lang>}{<key>}{<val>}{<alias vals, comma-separated>}
+\newcommand*\xpg@set@alias@values[4]{%
+ \prop_if_exist:cF { xpg@alias@keyvals@#1@#3 }
+ { \prop_new:c {xpg@alias@keyvals@#1@#3} }
+ \prop_put:cnn { xpg@alias@keyvals@#1@#3 }
+ {#2}{#4}
+ \prop_put:cnn { xpg@alias@keyvals@#1@#4 }
+ {#2}{#3}
+}
+
+% Patch xkeyval to record default values of keys
+\pretocmd{\XKV@define@default}{%
+ \csgdef{xpg@default@opt@\XKV@header #1}{#2}%
+}{}{\xpg@warning{Patching xkeyval failed!}}
+
+% Helper to get and register option keyvals
+\def\xpg@parsevariantkeyvalue#1=#2@#3:#4\relax{%
+ \def\@tmpa{#1}
+ \def\@tmpb{variant}
+ % variant values are stored in specific macros
+ % (\xpg@main@langvariant, \xpg@other@langvariant
+ % and \xpg@set@langvariant)
+ \ifx\@tmpa\@tmpb\setkeys{#3}{#1=#2}\fi
+ \tl_if_empty:nTF{#2}
+ {
+ \ifcsdef{xpg@default@opt@KV@#4@#1}%
+ {\xpg@store@opt@keyval#1:\csuse{xpg@default@opt@KV@#4@#1}=:#4\relax}%
+ {}%
+ }
+ { \xpg@store@opt@keyval#1:#2:#4\relax }
+}%
+
+% Store option keys and values
+% This strips trailing '=' from values.
+\def\xpg@store@opt@keyval#1:#2=:#3\relax{%
+ \prop_if_exist:cF { xpg@current@options@#3 }
+ { \prop_new:c {xpg@current@options@#3} }
+ \prop_put:cnn { xpg@current@options@#3 }
+ {#1}{#2}
+}
+
+
+\prg_set_conditional:Npnn \polyglossia@check@option@value:NNN #1#2#3 { p , T , F , TF }
+{
+ \prop_get:cnNTF {xpg@current@options@#1} {#2} \l_tmpa_tl
+ {
+ \exp_args:Nee \str_if_eq:NNTF{\l_tmpa_tl}{#3}
+ {\prg_return_true:}
+ {
+ \prop_get:cnNTF {xpg@alias@keyvals@#1@#3} {#2} \l_tmpb_tl
+ {
+ \exp_args:Nne \clist_set:Nn{\l_tmpa_clist}{\l_tmpb_tl}
+ \providetoggle{xpgvalfound}
+ \togglefalse{xpgvalfound}
+ \clist_map_inline:Nn \l_tmpa_clist {
+ \exp_args:Nee \str_if_eq:NNT{##1}{\l_tmpa_tl}
+ { \toggletrue{xpgvalfound} }
+ }
+ \iftoggle{xpgvalfound}{\prg_return_true:}{\prg_return_false:}
+ }
+ {
+ \prg_return_false:
+ }
+ }
+ }
+ {
+ \prg_return_false:
+ }
+}
+
+% Test if option value is set
+\newcommand*\iflanguageoption[5]{%
+ \polyglossia@check@option@value:NNNTF{#1}{#2}{#3}{#4}{#5}%
+}
+
+
+% Append any variant to csv list of variants
+\define@key{xpg@langvariant}{variant}{%
+ \edef\xpg@vloaded{#1\ifx\xpg@vloaded\@empty\else,\xpg@vloaded\fi}%
+}
+
+\prg_set_conditional:Npnn \polyglossia@check@if@lang@loaded:N #1 { p , T , F , TF }{
+ \cs_if_exist:cTF{#1}{
+ \prg_return_true:
+ }{
+ \prg_return_false:
+ }
+}
+
+% Test if language is loaded
+\newcommand*\iflanguageloaded[3]{%
+ \polyglossia@check@if@lang@loaded:NTF{#1@loaded}{#2}{#3}%
+}
+
+% Same for babellanguage is loaded
+\newcommand*\ifbabellanguageloaded[3]{%
+ \polyglossia@check@if@lang@loaded:NTF{#1@bbl@loaded}{#2}{#3}%
+}
+
+% Same for languageid
+\DeclareDocumentCommand \iflanguageidloaded {mmmm}
+{
+ \str_case:nnTF {#1}
+ {
+ {bcp-47} { \polyglossia@check@if@lang@loaded:NTF{#2@bcp@loaded}{#3}{#4} }
+ {bcp47} { \polyglossia@check@if@lang@loaded:NTF{#2@bcp@loaded}{#3}{#4} }
+ }
+ {}
+ {
+ \xpg@error{Invalid~ \string\iflanguageidloaded\space argument:~ #1}
+ }
+}
+
+% Check if the current font has a given glyph
+\prg_set_conditional:Npnn \polyglossia@check@if@char@available:N #1 { p , T , F , TF }
+{
+ \str_case_e:nnF{\c_sys_engine_str}{
+ {luatex}{
+ \int_compare:nNnTF { \directlua{polyglossia.check_char(0x#1)} } > { 0 }
+ {\prg_return_true:}
+ {\prg_return_false:}
+ }
+ {xetex}{
+ \int_compare:nNnTF { \the\XeTeXcharglyph"#1 } > { 0 }
+ {\prg_return_true:}
+ {\prg_return_false:}
+ }
+ }
+ {
+ \xpg@warning{You’re running a TeX engine that is not LuaTeX or XeTeX.\MessageBreak
+ That is almost guaranteed to cause problems.}
+ }
+}
+
+% Test if a char (by char code) is available in the current font
+\newcommand*\xpg@if@char@available[3]{%
+ \polyglossia@check@if@char@available:NTF{#1}{#2}{#3}%
+}
+
+\newcommand*\charifavailable[2]{%
+ \xpg@if@char@available{#1}{\char"#1}{#2}%
+}
+
+
+\newcommand*{\xpg@set@language@nonaux}[2][]{%
+ \@select@language[#1]{#2}%
+}
+
+
+\newcommand*{\xpg@set@language@aux}[2][]{%
+ % Store babelname of current language (for external packages such as biblatex)
+ \tl_if_blank:nTF {#1}{%
+ \ifcsundef{#2@gbabelname}{%
+ \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ }{%
+ \edef\babelname{\csuse{#2@gbabelname}}%
+ }%
+ }{%
+ \edef\babelname{\prop_item:Nn{\polyglossia@langsetup}{#2/babelname}}%
+ }%
+ % Store BCP-47 id of current language
+ \tl_if_blank:nTF {#1}{%
+ \ifcsundef{#2@gbcp47id}{%
+ \csedef{bcp47id}{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}%
+ }{%
+ \csedef{bcp47id}{\csuse{#2@gbcp47id}}%
+ }%
+ }{%
+ \csedef{bcp47id}{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}%
+ }%
+ \@select@language[#1]{#2}%
+ % Write to the aux
+ \if@filesw%
+ \ifx#1\\\\%
+ \protected@write\@auxout{}{\protect\selectlanguage*{#2}}%
+ \addtocontents{toc}{\protect\selectlanguage*{#2}}%
+ \addtocontents{lof}{\protect\selectlanguage*{#2}}%
+ \addtocontents{lot}{\protect\selectlanguage*{#2}}%
+ \else
+ \protected@write\@auxout{}{\protect\selectlanguage*[#1]{#2}}%
+ \addtocontents{toc}{\protect\selectlanguage*[#1]{#2}}%
+ \addtocontents{lof}{\protect\selectlanguage*[#1]{#2}}%
+ \addtocontents{lot}{\protect\selectlanguage*[#1]{#2}}%
+ \fi
+ \fi
+}
+
+% The bidi package swaps the output stream within RTL tables
+% (to get the column order right). This also swaps group
+% delimiters inserted to the aux files via otherlanguage (see #354).
+% We therefore patch bidi and insert a bool that tells us
+% whether we are in such a table.
+\newbool{xpg@inbiditable}
+\AtBeginDocument{%
+ \@ifpackageloaded{bidi}{%
+ \patchcmd{\@tabular}%
+ {\if@RTLtab}%
+ {\if@RTLtab\booltrue{xpg@inbiditable}}%
+ {}% success
+ {\xpg@warning{Patching bidi table failed!}}%
+ }{}%
+}
+
+% Open a group in the aux file. This is to keep
+% nested language options local (see #320).
+% In bidi tables, the opening/closing needs to be swapped (see #354)
+\newcommand*{\xpg@set@group@aux}{%
+ \if@filesw%
+ \ifbool{xpg@inbiditable}{%
+ \protected@write\@auxout{}{\egroup}%
+ \addtocontents{toc}{\egroup}%
+ \addtocontents{lof}{\egroup}%
+ \addtocontents{lot}{\egroup}%
+ }{%
+ \protected@write\@auxout{}{\bgroup}%
+ \addtocontents{toc}{\bgroup}%
+ \addtocontents{lof}{\bgroup}%
+ \addtocontents{lot}{\bgroup}%
+ }%
+ \fi
+}
+
+% Close the group in the aux file.
+% In bidi RTL tables, the opening/closing needs
+% to be swapped (see #354).
+\newcommand*{\xpg@unset@group@aux}{%
+ \if@filesw%
+ \ifbool{xpg@inbiditable}{%
+ \protected@write\@auxout{}{\bgroup}%
+ \addtocontents{toc}{\bgroup}%
+ \addtocontents{lof}{\bgroup}%
+ \addtocontents{lot}{\bgroup}%
+ }{%
+ \protected@write\@auxout{}{\egroup}%
+ \addtocontents{toc}{\egroup}%
+ \addtocontents{lof}{\egroup}%
+ \addtocontents{lot}{\egroup}%
+ }%
+ \fi
+}
+
+\prg_set_conditional:Npnn \polyglossia@check@ifdefined:N #1 { p , T , F , TF }{
+ \cs_if_exist:cTF {l@#1}
+ {
+ \cs_if_eq:cNTF {l@#1} \l@nohyphenation
+ {
+ \prg_return_false:
+ }
+ {
+ % it's possible that sometimes \csname l@#1\endcsname becomes \relax
+ \cs_if_eq:cNTF {l@#1} \relax
+ { \prg_return_false: }
+ { \prg_return_true: }
+ }
+ }
+ {
+ \prg_return_false:
+ }
+}
+
+\def\polyglossia@luatex@load@lang#1{%
+ % if \l@#1 is not properly defined, call lua function newloader(#1),
+ % and assign the returned number to \l@#1
+ \polyglossia@check@ifdefined:NF {#1}
+ {
+ \expandafter\chardef\csname l@#1\endcsname=
+ \directlua{ tex.sprint(polyglossia.newloader'#1') }\relax
+ }
+}
+
+% This check is also used by biblatex, so don't
+% rename silently.
+\newcommand\xpg@ifdefined[3]{%
+ % With luatex, we first need to define \l@#1.
+ \ifluatex
+ \polyglossia@luatex@load@lang{#1}%
+ \fi
+ \polyglossia@check@ifdefined:NTF{#1}{#2}{#3}%
+}%
+
+% Set \bbl@hyphendata@\the\language, which is (lua)babel's
+% hyphenation pattern hook
+% FIXME Clarifiy why/when this is needed.
+\newcommand*\xpg@set@bbl@hyphendata[1]{%
+ \ifluatex%
+ \ifcsdef{bbl@hyphendata@#1}{}{%
+ \global\@namedef{bbl@hyphendata@\the\language}{}%
+ }%
+ \fi%
+}
+
+% Set hyphenation patterns for a given language. This does the right
+% thing both for XeTeX and LuaTeX
+\newcommand*\xpg@set@hyphenation@patterns[1]{%
+ \ifluatex
+ \polyglossia@luatex@load@lang{#1}%
+ \language=\csname l@#1\endcsname
+ \else
+ \ifxetex
+ \language=\csname l@#1\endcsname
+ \else
+ \xpg@warning{You’re~running~a~TeX~engine~that~is~not~LuaTeX~or~XeTeX.\MessageBreak
+ That~is~almost~guaranteed~to~cause~problems.}%
+ \fi
+ \fi
+}
+
+
+\newcommand*\@select@language[2][]{
+ % hook for compatibility with biblatex
+ \select@language{#2}
+ \xpg@set@bbl@hyphendata{\the\language}
+ \xpg@initial@setup%
+ \select@@language[#1]{#2}%
+ % Hook for external packages such as biblatex
+ \polyglossia@language@switched%
+ \polyglossia@lang@setpardirection:n{#2}%
+ \csuse{captions#2}%
+ \csuse{date#2}%
+ % These are hooks for external packages which want to access variants
+ % via babelname (such as biblatex)
+ \cs_if_exist_use:c{captions@bbl@\babelname}%
+ \cs_if_exist_use:c{date@bbl@\babelname}%
+ \polyglossia@local@marks:n{#2}%
+ \csuse{init@extras@#2}%
+ \polyglossia@lang@indentfirst:n{#2}%
+ \csuse{blockextras@#2}%
+ % This is a hook for external packages which want to access variants
+ % via babelname (such as biblatex)
+ \cs_if_exist_use:c{blockextras@bbl@\babelname}%
+ }
+
+% hook for compatibility with biblatex
+% (probably no longer used due to the
+% more general hook that follows, but
+% we keep it for backwards comp.)
+\def\select@language#1{}
+
+% Hook for external packages such as biblatex
+\def\polyglossia@language@switched{}
+
+\def\noextrascurrent#1{%
+ \csuse{noextras@#1}%
+ % This is a hook for external packages which want to access variants
+ % via babelname (such as biblatex)
+ \cs_if_exist_use:c{noextras@bbl@\babelname}
+}
+
+% Common code for `\select@language' and `\foreignlanguage'.
+\newcommand{\select@@language}[2][]{%
+ % disable the extras and number settings of the previous language
+ \ifcsundef{languagename}{}{%
+ \noextrascurrent{\languagename}%
+ \csuse{no\languagename @numbers}%
+ \ifxetex
+ \str_if_eq:eeTF{\exp_args:Nne\prop_item:Nn{\polyglossia@langsetup}{\languagename/direction}}{RL}%
+ {%
+ \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}}{RL}%
+ {}% RTL -> RTL
+ {\setlatin}% RTL -> LTR
+ }{%
+ \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/direction}}{RL}%
+ {\setnonlatin}% LTR -> RTL
+ {}% LTR -> LTR
+ }%
+ \fi
+ }%
+ \polyglossia@set@language@name[#1]{#2}%
+ % Set the language's/script's font families
+ \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#2/lcscript}}{latin}{\resetfontlatin}{\xpg@set@normalfont{#2}}%
+ \xpg@select@fontfamily{#2}%
+ \csuse@warn{#2@language}%
+ \csuse{#2@numbers}%
+ \use@localhyphenmins[#1]{#2}%
+ \polyglossia@lang@frenchspacing:n{#2}
+}
+
+
+\let\xpg@pop@language\relax
+
+\provideenvironment{otherlanguage}{}{}
+
+\newbool{xpg@noset@groups}
+\renewenvironment{otherlanguage}[2][]
+{%
+ % We usually embrace the switch in groups to keep the changes local.
+ % We cannot do this if an LTR environmet starts in an RTL paragraph,
+ % as bidi interferes here badly with its directionality smartness.
+ \ifxetex
+ \str_if_eq:eeT{\exp_args:Nne\prop_item:Nn{\polyglossia@langsetup}{\languagename/direction}}{RL}%
+ {%
+ \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#1/direction}}{RL}%
+ {}% RTL -> RTL
+ {\ifvmode\else\booltrue{xpg@noset@groups}\fi}% RTL -> LTR
+ }%
+ \fi%
+ \ifbool{xpg@noset@groups}{}{\xpg@set@group@aux}%
+ \selectlanguage[#1]{#2}%
+}
+{\ifbool{xpg@noset@groups}{}{\xpg@unset@group@aux}}
+
+\newcommand{\setlocalhyphenmins}[3]{%
+ \xpg@ifdefined{#1}{%
+ \expandafter\ifx\csname l@#1\endcsname\l@nohyphenation%
+ \xpg@warning{\string\setlocalhyphenmin\space~ useless~ for~ unhyphenated~ language~ #1}%
+ \else
+ \providehyphenmins{#1}{#2#3}%
+ \fi
+ }{%
+ \xpg@warning{\string\setlocalhyphenmin\space~ useless~ for~ unknown~ language~ #1}%
+ }%
+}%
+
+% \setlanghyphenmins[options]{lang}{l}{r}
+\newcommand*\setlanghyphenmins[4][]{%
+ % Check for real language name and options
+ \edef\xpg@tmp@lang{#2}%
+ \edef\xpg@tmp@opts{#1}%
+ \ifcsdef{#2@alias@lang}{%
+ \edef\xpg@tmp@lang{\csuse{#2@alias@lang}}%
+ \ifcsdef{#2@alias@opts}{%
+ \edef\xpg@tmp@opts{\csuse{#2@alias@opts},#1}%
+ }{}%
+ }{}%
+ \bgroup
+ \polyglossia@error@iflangnotloaded:n{\xpg@tmp@lang}
+ \exp_args:Nne \setkeys{\xpg@tmp@lang}{\xpg@tmp@opts}%
+ % Store BCP-47 id of language
+ \tl_if_blank:nTF {\xpg@tmp@opts}{%
+ \ifcsundef{\csname xpg@tmp@lang\endcsname @gbcp47id}{%
+ \csedef{tmp@bcp47id}{\exp_args:Nne\prop_item:Nn{\polyglossia@langsetup}{\xpg@tmp@lang /bcp47}}%
+ }{%
+ \csedef{tmp@bcp47id}{\csuse{#2@gbcp47id}}%
+ }%
+ }{%
+ \csedef{tmp@bcp47id}{\exp_args:Nne \prop_item:Nn{\polyglossia@langsetup}{\xpg@tmp@lang /bcp47}}%
+ }%
+ \xpg@warning{id: \csuse{tmp@bcp47id}}%
+ \csgdef{\csname tmp@bcp47id\endcsname @hyphenmins}{{#3}{#4}}%
+ \egroup
+}
+
+% \use@localhypenmins[options]{lang}
+\newcommand*\use@localhyphenmins[2][]{%
+ \bgroup
+ \polyglossia@error@iflangnotloaded:n{#2}
+ \setkeys{#2}{#1}%
+ % Store BCP-47 id of language
+ \tl_if_blank:nTF {#1}{%
+ \ifcsundef{#2@gbcp47id}{%
+ \csxdef{tmp@bcp47id}{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}%
+ }{%
+ \csxdef{tmp@bcp47id}{\csuse{#2@gbcp47id}}%
+ }%
+ }{%
+ \csxdef{tmp@bcp47id}{\prop_item:Nn{\polyglossia@langsetup}{#2/bcp47}}%
+ }%
+ \egroup
+ \ifcsundef{\csname tmp@bcp47id\endcsname @hyphenmins}{%
+ \ifcsundef{#2hyphenmins}{}%
+ {%
+ \expandafter\expandafter\expandafter\set@hyphenmins\csname #2hyphenmins\endcsname\relax%
+ }
+ }{%
+ \edef\tmpa{\csuse{\csname tmp@bcp47id\endcsname @hyphenmins}}%
+ \expandafter\expandafter\expandafter\set@hyphenmins\tmpa\relax%
+ }
+ \ifluatex
+ % Set \totalhyphenmin if specified
+ \prop_get:NxNTF \polyglossia@langsetup {#2/totalhyphenmin} \l_tmpa_tl
+ {
+ \xpg@warning{totalhyphenmin: '\l_tmpa_tl'}
+ \expandafter\hyphenationmin \l_tmpa_tl%
+ }%
+ {}%
+ \fi
+}
+
+% Babel previously compiled in hyphenrules into the kernel (via hyphen.cfg)
+% but this is no longer the case. In any case, we roll our own one now
+% and possibly overwrite babel's.
+\provideenvironment{hyphenrules}{}{}
+
+% As opposed to the one inherited from switch.def/babel, our environment
+% supports language options and aliases.
+\renewenvironment{hyphenrules}[2][]
+{%
+ % We usually embrace the switch in groups to keep the changes local.
+ % We cannot do this if an LTR environmet starts in an RTL paragraph,
+ % as bidi interferes here badly with its directionality smartness.
+ \ifxetex
+ \str_if_eq:eeT{\exp_args:Nne\prop_item:Nn{\polyglossia@langsetup}{\languagename/direction}}{RL}%
+ {%
+ \str_if_eq:eeTF{\prop_item:Nn{\polyglossia@langsetup}{#1/direction}}{RL}%
+ {}% RTL -> RTL
+ {\ifvmode\else\booltrue{xpg@noset@groups}\fi}% RTL -> LTR
+ }%
+ \fi%
+ \ifbool{xpg@noset@groups}{}{\xpg@set@group@aux}%
+ % Check for real language name and options
+ \edef\xpg@tmp@lang{#2}%
+ \edef\xpg@tmp@opts{#1}%
+ \ifcsdef{#2@alias@lang}{%
+ \edef\xpg@tmp@lang{\csuse{#2@alias@lang}}%
+ \ifcsdef{#2@alias@opts}{%
+ \edef\xpg@tmp@opts{\csuse{#2@alias@opts},#1}%
+ }{}%
+ }{}%
+ \tl_if_blank:nF {\xpg@tmp@opts}{%
+ % Register the language options
+ \polyglossia@set@lang@options:nn {\xpg@tmp@lang} {\xpg@tmp@opts}%
+ }%
+ % Now switch patterns
+ \csuse@warn{\csuse{xpg@tmp@lang}@language}%
+ % And activate hyphenmins
+ \use@localhyphenmins[\xpg@tmp@opts]{\xpg@tmp@lang}%
+}
+{\ifbool{xpg@noset@groups}{}{\xpg@unset@group@aux}}
+
+\AtEndPreamble{%
+ \@ifpackageloaded{bidi}{%
+ \providecommand*{\aemph}[1]{$\overline{\hboxR{#1}}$}%
+ }{}%
+ \@ifpackageloaded{luabidi}{%
+ \providecommand*{\aemph}[1]{$\overline{\hbox{\RL{#1}}}$}%
+ }{}%
+}
+
+
+% keys for main package
+\keys_define:nn { polyglossia } {
+ verbose
+ .bool_set:N = \l_polyglossia_verbose_bool,
+ verbose
+ .default:n = true,
+ % compatibility
+ quiet
+ .meta:n = { verbose = false },
+
+ localmarks
+ .bool_set:N = \l_polyglossia_localmarks_bool,
+ localmarks
+ .default:n = true,
+ % compatibility
+ nolocalmarks
+ .meta:n = { localmarks = false },
+
+ babelshorthands
+ .bool_set:N = \l_polyglossia_babelshorthands_bool,
+ babelshorthands
+ .default:n = true,
+
+ luatexrenderer
+ .cs_set:Np = \l_polyglossia_luatex_renderer,
+ luatexrenderer
+ .value_required:n = true,
+}
+
+\keys_set:nn { polyglossia } {
+ localmarks = false,
+ verbose = true,
+ babelshorthands = false,
+ luatexrenderer = Harfbuzz
+}
+
+% load by default latex
+\setmainlanguage{latex}
+% then process key in order to overwrite
+\ProcessKeysOptions{polyglossia}
+
+% Set the LuaTeX renderer. As opposed to fontspec, we use Harfbuzz by default.
+% This can be changed via the luatexrenderer package option.
+\ifluatex
+ \exp_args:Nee \str_if_eq:nnF{\l_polyglossia_luatex_renderer}{none}
+ {
+ \xpg@info{Setting~ LuaTeX~ font~ renderer~ to~ \l_polyglossia_luatex_renderer}
+ \exp_args:Nee \defaultfontfeatures{Renderer=\l_polyglossia_luatex_renderer}
+ }
+\fi
+
+\bool_if:nTF \l_polyglossia_verbose_bool {} {
+ \gdef\@latex@info#1{\relax}% no latex info
+ \gdef\@font@info#1{\relax}% no latex font info
+ \gdef\@font@warning#1{\relax}% no latex font warnings
+ \gdef\zf@PackageInfo#1{\relax}% no fontspec info
+ \gdef\xpg@info#1{\relax}% no polyglossia info
+}
+
+\bool_if:nTF \l_polyglossia_localmarks_bool {
+ \polyglossia@enable@local@marks:
+}{}
+
+% compatibility
+\newif\ifsystem@babelshorthands
+\bool_if:nTF \l_polyglossia_babelshorthands_bool {
+ \system@babelshorthandstrue
+}{
+ \system@babelshorthandsfalse
+}
+
+%
+% FIXME these should also be loaded \AtEndOfPackage !!!
+\def\xpg@option#1#2{%
+ \ifcsundef{xpg@main@language}{\setdefaultlanguage}{\setotherlanguage}%
+ [#1]{#2}}
+\ExplSyntaxOff
+
+% \end{macrocode}
+% \iffalse
+%</polyglossia.sty>
+%<*farsical.sty>
+% \fi
+% \clearpage
+%
+% \subsection{farsical.sty}
+% \begin{macrocode}
+\ProvidesPackage{farsical}
+ [2019/12/12 v0.2 %
+ Farsi (jalali) calendar]
+\ifluatex\RequirePackage{luabidi}\else\RequirePackage{bidi}\fi
+\RequirePackage{calc,arabicnumbers}
+
+%TODO - rewrite completely using calc
+%% - use Reingold & Dershowitz ME
+%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Modified from Arabiftoday.sty which is part of the Arabi package:
+%%% Copyright (C) 2006 Youssef Jabri
+%%% itself a modification of the code in the FarsiTeX system:
+%%% Copyright (C) 1996 Hassan Abolhassani
+%%% Copyright (C) 1996-2001 Roozbeh Pournader <roozbeh@sharif.edu>
+%%% Copyright (C) 2000-2001 Behdad Esfahbod <behdad@bamdad.org>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newif\ifJALALI@leap \newif\ifJALALI@kabiseh
+\newcount\JALALI@i \newcount\JALALI@y \newcount\JALALI@m \newcount\JALALI@d
+\newcount\JALALI@latini \newcount\JALALI@farsii
+\newcount\JALALI@latinii \newcount\JALALI@farsiii
+\newcount\JALALI@latiniii \newcount\JALALI@farsiiii
+\newcount\JALALI@latiniv \newcount\JALALI@farsiiv
+\newcount\JALALI@latinv \newcount\JALALI@farsiv
+\newcount\JALALI@latinvi \newcount\JALALI@farsivi
+\newcount\JALALI@latinvii \newcount\JALALI@farsivii
+\newcount\JALALI@latinviii \newcount\JALALI@farsiviii
+\newcount\JALALI@latinix \newcount\JALALI@farsiix
+\newcount\JALALI@latinx \newcount\JALALI@farsix
+\newcount\JALALI@latinxi \newcount\JALALI@farsixi
+\newcount\JALALI@latinxii \newcount\JALALI@farsixii
+ \newcount\JALALI@farsixiii
+
+\newcount\JALALI@temp
+\newcount\JALALI@temptwo
+\newcount\JALALI@tempthree
+\newcount\JALALI@yModHundred
+\newcount\JALALI@thirtytwo
+\newcount\JALALI@dn
+\newcount\JALALI@sn
+\newcount\JALALI@mminusone
+
+% \ftoday renamed to \Jalalitoday - FC
+\def\Jalalitoday{%
+\JALALI@y=\year \JALALI@m=\month \JALALI@d=\day
+%
+\JALALI@temp=\JALALI@y
+\divide\JALALI@temp by 100\relax
+\multiply\JALALI@temp by 100\relax
+\JALALI@yModHundred=\JALALI@y
+\advance\JALALI@yModHundred by -\JALALI@temp\relax
+%
+\ifodd\JALALI@yModHundred
+ \JALALI@leapfalse
+\else
+ \JALALI@temp=\JALALI@yModHundred
+ \divide\JALALI@temp by 2\relax
+ \ifodd\JALALI@temp\JALALI@leapfalse
+ \else
+ \ifnum\JALALI@yModHundred=0%
+ \JALALI@temp=\JALALI@y
+ \divide\JALALI@temp by 400\relax
+ \multiply\JALALI@temp by 400\relax
+ \ifnum\JALALI@y=\JALALI@temp\JALALI@leaptrue\else\JALALI@leapfalse\fi
+ \else\JALALI@leaptrue
+ \fi
+ \fi
+\fi
+%
+\JALALI@latini=31\relax
+\ifJALALI@leap
+ \JALALI@latinii = 29\relax
+\else
+ \JALALI@latinii = 28\relax
+\fi
+\JALALI@latiniii = 31\relax
+\JALALI@latiniv = 30\relax
+\JALALI@latinv = 31\relax
+\JALALI@latinvi = 30\relax
+\JALALI@latinvii = 31\relax
+\JALALI@latinviii = 31\relax
+\JALALI@latinix = 30\relax
+\JALALI@latinx = 31\relax
+\JALALI@latinxi = 30\relax
+\JALALI@latinxii = 31\relax
+%
+\JALALI@thirtytwo=32\relax
+%
+\JALALI@temp=\JALALI@y
+\advance\JALALI@temp by -17\relax
+\JALALI@temptwo=\JALALI@temp
+\divide\JALALI@temptwo by 33\relax
+\multiply\JALALI@temptwo by 33\relax
+\advance\JALALI@temp by -\JALALI@temptwo
+\ifnum\JALALI@temp=\JALALI@thirtytwo\JALALI@kabisehfalse
+\else
+ \JALALI@temptwo=\JALALI@temp
+ \divide\JALALI@temptwo by 4\relax
+ \multiply\JALALI@temptwo by 4\relax
+ \advance\JALALI@temp by -\JALALI@temptwo
+ \ifnum\JALALI@temp=\z@\JALALI@kabisehtrue\else\JALALI@kabisehfalse\fi
+\fi
+%
+% --BE
+% In fact farsii is equal to the Leap years from a fixed year to the last
+% year minus the Kabise years from a fixed year to the last year plus a const.
+%
+\JALALI@tempthree=\JALALI@y % Number of Leap years
+\advance\JALALI@tempthree by -1
+\JALALI@temp=\JALALI@tempthree % T := (MY-1) div 4
+\divide\JALALI@temp by 4\relax
+\JALALI@temptwo=\JALALI@tempthree % T := T - ((MY-1) div 100)
+\divide\JALALI@temptwo by 100\relax
+\advance\JALALI@temp by -\JALALI@temptwo
+\JALALI@temptwo=\JALALI@tempthree % T := T + ((MY-1) div 400)
+\divide\JALALI@temptwo by 400\relax
+\advance\JALALI@temp by \JALALI@temptwo
+\advance\JALALI@tempthree by -611 % Number of Kabise years
+\JALALI@temptwo=\JALALI@tempthree % T := T - ((SY+10) div 33) * 8
+\divide\JALALI@temptwo by 33\relax
+\multiply\JALALI@temptwo by 8\relax
+\advance\JALALI@temp by -\JALALI@temptwo
+\JALALI@temptwo=\JALALI@tempthree %
+\divide\JALALI@temptwo by 33\relax
+\multiply\JALALI@temptwo by 33\relax
+\advance\JALALI@tempthree by -\JALALI@temptwo
+\ifnum\JALALI@tempthree=32\advance\JALALI@temp by 1\fi % if (SY+10) mod 33=32 then Inc(T);
+\divide\JALALI@tempthree by 4\relax % T := T - ((SY+10) mod 33) div 4
+\advance\JALALI@temp by -\JALALI@tempthree
+\advance\JALALI@temp by -137 % T := T - 137 Adjust the value
+\JALALI@farsii=31
+\advance\JALALI@farsii by -\JALALI@temp % now 31 - T is the farsii
+%
+\JALALI@farsiii = 30\relax
+\ifJALALI@kabiseh
+ \JALALI@farsiiii = 30\relax
+\else
+ \JALALI@farsiiii = 29\relax
+\fi
+\JALALI@farsiiv = 31\relax
+\JALALI@farsiv = 31\relax
+\JALALI@farsivi = 31\relax
+\JALALI@farsivii = 31\relax
+\JALALI@farsiviii= 31\relax
+\JALALI@farsiix = 31\relax
+\JALALI@farsix = 30\relax
+\JALALI@farsixi = 30\relax
+\JALALI@farsixii = 30\relax
+\JALALI@farsixiii= 30\relax
+%
+\JALALI@dn= 0\relax
+\JALALI@sn= 0\relax
+\JALALI@mminusone=\JALALI@m
+\advance\JALALI@mminusone by -1\relax
+%
+\JALALI@i=0\relax
+\ifnum\JALALI@i < \JALALI@mminusone
+\loop
+\advance \JALALI@i by 1\relax
+\advance\JALALI@dn by \csname JALALI@latin\romannumeral\the\JALALI@i\endcsname
+\ifnum\JALALI@i<\JALALI@mminusone \repeat
+\fi
+\advance \JALALI@dn by \JALALI@d
+%
+\JALALI@i=1\relax
+\JALALI@sn = \JALALI@farsii
+\ifnum \JALALI@sn<\JALALI@dn
+\loop
+\advance \JALALI@i by 1\relax
+\advance\JALALI@sn by \csname JALALI@farsi\romannumeral\the\JALALI@i\endcsname
+\ifnum \JALALI@sn<\JALALI@dn \repeat
+\fi
+\ifnum \JALALI@i < 4
+ \JALALI@m = 9 \advance\JALALI@m by \JALALI@i
+ \advance \JALALI@y by -622\relax
+\else
+ \JALALI@m = \JALALI@i \advance \JALALI@m by -3\relax
+ \advance \JALALI@y by -621\relax
+\fi
+\advance\JALALI@sn by -\csname JALALI@farsi\romannumeral\the\JALALI@i%
+\endcsname
+\ifnum\JALALI@i = 1
+ \JALALI@d = \JALALI@dn \advance \JALALI@d by 30 \advance\JALALI@d by -\JALALI@farsii
+\else
+ \JALALI@d = \JALALI@dn \advance \JALALI@d by -\JALALI@sn
+\fi
+%% DATE FORMATTING
+\if@RTL{\farsidigits{\number\JALALI@d}\space%
+\Jalalimonth{\JALALI@m}\space\farsidigits{\number\JALALI@y}}%
+\else
+\number\JALALI@d\space\JalalimonthEnglish{\JALALI@m}%
+\space\number\JALALI@y%
+\fi}
+%%%
+\def\Jalalimonth#1{\ifcase#1\or فروردین\or
+اردیبهشت\or خرداد\or تیر\or مرداد\or شهریور%
+\or مهر\or آبان\or آذر\or دی\or بهمن\or اسفند%
+\fi}
+\def\JalalimonthEnglish#1{\ifcase#1%
+\or Farvardīn\or Ordībehesht\or Khordād\or Tīr%
+\or Mordād\or Shahrīvar\or Mihr\or Ābān\or Āzar%
+\or Dai\or Bahman\or Esfand\fi}
+% \end{macrocode}
+% \iffalse
+%</farsical.sty>
+%<*hebrewcal.sty>
+% \fi
+% \clearpage
+%
+% \subsection{hebrewcal.sty}
+% \begin{macrocode}
+\ProvidesPackage{hebrewcal}
+ [2019/12/03 v2.7 %
+ Hebrew calendar for polyglossia (adapted from hebcal.sty in Babel)]
+\RequirePackage{xkeyval}
+\ifluatex\RequirePackage{luabidi}\else\RequirePackage{bidi}\fi
+
+\newif\if@xpg@hebrewcal@marcheshvan
+\@xpg@hebrewcal@marcheshvanfalse
+
+\DeclareOption{marcheshvan}{\@xpg@hebrewcal@marcheshvantrue}
+
+\@ifundefined{if@xpg@hebrew@marcheshvan}{}{%
+ \if@xpg@hebrew@marcheshvan
+ \@xpg@hebrewcal@marcheshvantrue
+ \fi
+}
+
+%% TODO rewrite this on the basis of Reingold & Dershowitz
+%% on the model of hijrical (using calc)
+
+\@ifundefined{@Remainder}{\input{cal-util.def}}{}
+
+\define@boolkey{hebrew}[@hebrew@]{fullyear}[true]{}
+\setkeys{hebrew}{fullyear=false}
+
+\newcount\hebrewday \newcount\hebrewmonth \newcount\hebrewyear
+\def\hebrewdate#1#2#3{%
+ \HebrewFromGregorian{#1}{#2}{#3}%
+ {\hebrewday}{\hebrewmonth}{\hebrewyear}%
+ \if@RTL%
+ \@FormatForHebrew{\hebrewday}{\hebrewmonth}{\hebrewyear}%
+ \else%
+ \@FormatForEnglish{\hebrewday}{\hebrewmonth}{\hebrewyear}%
+ \fi}
+\def\hebrewtoday{\hebrewdate{\day}{\month}{\year}}
+% The command name is capitalised in the doc, and this is consistent
+% with other names such as \Hijritoday and \Jalalitoday.
+\let\Hebrewtoday=\hebrewtoday
+\def\hebrewsetreg{%
+ \HebrewFromGregorian{\day}{\month}{\year}%
+ {\hebrewday}{\hebrewmonth}{\hebrewyear}}
+\def\HebrewYearName#1{{%
+ \@tempcnta=#1\divide\@tempcnta by 1000\multiply\@tempcnta by 1000
+ \ifnum#1=\@tempcnta\relax % divisible by 1000: disambiguate
+ \Hebrewnumeral{#1}\ (לפ"ג)%
+ \else % not divisible by 1000
+ \ifnum#1<1000\relax % first millennium: disambiguate
+ \Hebrewnumeral{#1}\ (לפ"ג)%
+ \else
+ \ifnum#1<5000
+ \Hebrewnumeral{#1}%
+ \else
+ \ifnum#1<6000 % current millenium, print without thousands
+ \@tempcnta=#1\relax
+ \if@hebrew@fullyear\else\advance\@tempcnta by -5000\fi
+ \Hebrewnumeral{\@tempcnta}%
+ \else % #1>6000
+ \Hebrewnumeral{#1}%
+ \fi
+ \fi
+ \fi
+ \fi}}
+\def\HebrewMonthName#1#2{%
+ \ifnum #1 = 7 %
+ \@CheckLeapHebrewYear{#2}%
+ \if@HebrewLeap אדר\ ב'%
+ \else אדר%
+ \fi%
+ \else%
+ \ifcase#1%
+ % nothing for 0
+ \or תשרי%
+ \or\if@xpg@hebrewcal@marcheshvan מרחשון\else חשון\fi%
+ \or כסלו%
+ \or טבת%
+ \or שבט%
+ \or אדר\ א'%
+ \or אדר\ ב'%
+ \or ניסן%
+ \or אייר%
+ \or סיון%
+ \or תמוז%
+ \or אב%
+ \or אלול%
+ \fi%
+ \fi}
+\def\@FormatForHebrew#1#2#3{%
+ \Hebrewnumeral{#1}~ב\HebrewMonthName{#2}{#3}~%
+ \HebrewYearName{#3}}
+\def\HebrewMonthNameInEnglish#1#2{%
+ \ifnum #1 = 7%
+ \@CheckLeapHebrewYear{#2}%
+ \if@HebrewLeap Adar II\else Adar\fi%
+ \else%
+ \ifcase #1%
+ % nothing for 0
+ \or Tishrei%
+ \or\if@xpg@hebrewcal@marcheshvan Marcheshvan\else Heshvan\fi%
+ \or Kislev%
+ \or Tebeth%
+ \or Shebat%
+ \or Adar I%
+ \or Adar II%
+ \or Nisan%
+ \or Iyar%
+ \or Sivan%
+ \or Tammuz%
+ \or Av%
+ \or Elul%
+ \fi
+ \fi}
+\def\@FormatForEnglish#1#2#3{%
+ \HebrewMonthNameInEnglish{#2}{#3} \number#1,\ \number#3}
+\newcount\@common
+\newif\if@HebrewLeap
+\def\@CheckLeapHebrewYear#1{%
+ {%
+ \countdef\tmpa = 0% % \tmpa==\count0
+ \countdef\tmpb = 1% % \tmpb==\count1
+ \tmpa = #1%
+ \multiply \tmpa by 7%
+ \advance \tmpa by 1%
+ \@Remainder{\tmpa}{19}{\tmpb}%
+ \ifnum \tmpb < 7% % \tmpb = (7*year+1)%19
+ \global\@HebrewLeaptrue%
+ \else%
+ \global\@HebrewLeapfalse%
+ \fi}}
+\def\@HebrewElapsedMonths#1#2{%
+ {%
+ \countdef\tmpa = 0% % \tmpa==\count0
+ \countdef\tmpb = 1% % \tmpb==\count1
+ \countdef\tmpc = 2% % \tmpc==\count2
+ \tmpa = #1% %
+ \advance \tmpa by -1% %
+ #2 = \tmpa% % #2 = \tmpa = year-1
+ \divide #2 by 19% % Number of complete Meton cycles
+ \multiply #2 by 235% % #2 = 235*((year-1)/19)
+ \@Remainder{\tmpa}{19}{\tmpb}% \tmpa = years%19-years this cycle
+ \tmpc = \tmpb% %
+ \multiply \tmpb by 12% %
+ \advance #2 by \tmpb% % add regular months this cycle
+ \multiply \tmpc by 7% %
+ \advance \tmpc by 1% %
+ \divide \tmpc by 19% % \tmpc = (1+7*((year-1)%19))/19 -
+ \advance #2 by \tmpc% % add leap months
+ \global\@common = #2}%
+ #2 = \@common}
+\def\@HebrewElapsedDays#1#2{%
+ {%
+ \countdef\tmpa = 0% % \tmpa==\count0
+ \countdef\tmpb = 1% % \tmpb==\count1
+ \countdef\tmpc = 2% % \tmpc==\count2
+ \@HebrewElapsedMonths{#1}{#2}%
+ \tmpa = #2% %
+ \multiply \tmpa by 13753% %
+ \advance \tmpa by 5604% % \tmpa=MonthsElapsed*13758 + 5604
+ \@Remainder{\tmpa}{25920}{\tmpc}% \tmpc == ConjunctionParts
+ \divide \tmpa by 25920%
+ \multiply #2 by 29%
+ \advance #2 by 1%
+ \advance #2 by \tmpa% % #2 = 1 + MonthsElapsed*29 +
+ \@Remainder{#2}{7}{\tmpa}% % \tmpa == DayOfWeek
+ \ifnum \tmpc < 19440%
+ \ifnum \tmpc < 9924%
+ \else% % New moon at 9 h. 204 p. or later
+ \ifnum \tmpa = 2% % on Tuesday ...
+ \@CheckLeapHebrewYear{#1}% of a common year
+ \if@HebrewLeap%
+ \else%
+ \advance #2 by 1%
+ \fi%
+ \fi%
+ \fi%
+ \ifnum \tmpc < 16789%
+ \else% % New moon at 15 h. 589 p. or later
+ \ifnum \tmpa = 1% % on Monday ...
+ \advance #1 by -1%
+ \@CheckLeapHebrewYear{#1}% at the end of leap year
+ \if@HebrewLeap%
+ \advance #2 by 1%
+ \fi%
+ \fi%
+ \fi%
+ \else%
+ \advance #2 by 1% % new moon at or after midday
+ \fi%
+ \@Remainder{#2}{7}{\tmpa}% % \tmpa == DayOfWeek
+ \ifnum \tmpa = 0% % if Sunday ...
+ \advance #2 by 1%
+ \else% %
+ \ifnum \tmpa = 3% % Wednesday ...
+ \advance #2 by 1%
+ \else%
+ \ifnum \tmpa = 5% % or Friday
+ \advance #2 by 1%
+ \fi%
+ \fi%
+ \fi%
+ \global\@common = #2}%
+ #2 = \@common}
+\def\@DaysInHebrewYear#1#2{%
+ {%
+ \countdef\tmpe = 12% % \tmpe==\count12
+ \@HebrewElapsedDays{#1}{\tmpe}%
+ \advance #1 by 1%
+ \@HebrewElapsedDays{#1}{#2}%
+ \advance #2 by -\tmpe%
+ \global\@common = #2}%
+ #2 = \@common}
+\def\@HebrewDaysInPriorMonths#1#2#3{%
+ {%
+ \countdef\tmpf= 14% % \tmpf==\count14
+ #3 = \ifcase #1% % Days in prior month of regular year
+ 0 \or% % no month number 0
+ 0 \or% % Tishri
+ 30 \or% % Heshvan
+ 59 \or% % Kislev
+ 89 \or% % Tebeth
+ 118 \or% % Shebat
+ 148 \or% % Adar I
+ 148 \or% % Adar II
+ 177 \or% % Nisan
+ 207 \or% % Iyar
+ 236 \or% % Sivan
+ 266 \or% % Tammuz
+ 295 \or% % Av
+ 325 \or% % Elul
+ 400% % Dummy
+ \fi%
+ \@CheckLeapHebrewYear{#2}%
+ \if@HebrewLeap% % in leap year
+ \ifnum #1 > 6% % if month after Adar I
+ \advance #3 by 30% % add 30 days
+ \fi%
+ \fi%
+ \@DaysInHebrewYear{#2}{\tmpf}%
+ \ifnum #1 > 3%
+ \ifnum \tmpf = 353% %
+ \advance #3 by -1% %
+ \fi% % Short Kislev
+ \ifnum \tmpf = 383% %
+ \advance #3 by -1% %
+ \fi% %
+ \fi%
+ \ifnum #1 > 2%
+ \ifnum \tmpf = 355% %
+ \advance #3 by 1% %
+ \fi% % Long Heshvan
+ \ifnum \tmpf = 385% %
+ \advance #3 by 1% %
+ \fi% %
+ \fi%
+ \global\@common = #3}%
+ #3 = \@common}
+\def\@FixedFromHebrew#1#2#3#4{%
+ {%
+ #4 = #1%
+ \@HebrewDaysInPriorMonths{#2}{#3}{#1}%
+ \advance #4 by #1% % Add days in prior months this year
+ \@HebrewElapsedDays{#3}{#1}%
+ \advance #4 by #1% % Add days in prior years
+ \advance #4 by -1373429% % Subtract days before Gregorian
+ \global\@common = #4}% % 01.01.0001
+ #4 = \@common}
+\def\@GregorianDaysInPriorMonths#1#2#3{%
+ {%
+ #3 = \ifcase #1%
+ 0 \or% % no month number 0
+ 0 \or%
+ 31 \or%
+ 59 \or%
+ 90 \or%
+ 120 \or%
+ 151 \or%
+ 181 \or%
+ 212 \or%
+ 243 \or%
+ 273 \or%
+ 304 \or%
+ 334%
+ \fi%
+ \@CheckIfGregorianLeap{#2}%
+ \if@GregorianLeap%
+ \ifnum #1 > 2% % if month after February
+ \advance #3 by 1% % add leap day
+ \fi%
+ \fi%
+ \global\@common = #3}%
+ #3 = \@common}
+\def\@GregorianDaysInPriorYears#1#2{%
+ {%
+ \countdef\tmpc = 4% % \tmpc==\count4
+ \countdef\tmpb = 2% % \tmpb==\count2
+ \tmpb = #1% %
+ \advance \tmpb by -1% %
+ \tmpc = \tmpb% % \tmpc = \tmpb = year-1
+ \multiply \tmpc by 365% % Days in prior years =
+ #2 = \tmpc% % = 365*(year-1) ...
+ \tmpc = \tmpb% %
+ \divide \tmpc by 4% % \tmpc = (year-1)/4
+ \advance #2 by \tmpc% % ... plus Julian leap days ...
+ \tmpc = \tmpb% %
+ \divide \tmpc by 100% % \tmpc = (year-1)/100
+ \advance #2 by -\tmpc% % ... minus century years ...
+ \tmpc = \tmpb% %
+ \divide \tmpc by 400% % \tmpc = (year-1)/400
+ \advance #2 by \tmpc% % ... plus 4-century years.
+ \global\@common = #2}%
+ #2 = \@common}
+\def\@AbsoluteFromGregorian#1#2#3#4{%
+ {%
+ \countdef\tmpd = 0% % \tmpd==\count0
+ #4 = #1% % days so far this month
+ \@GregorianDaysInPriorMonths{#2}{#3}{\tmpd}%
+ \advance #4 by \tmpd% % add days in prior months
+ \@GregorianDaysInPriorYears{#3}{\tmpd}%
+ \advance #4 by \tmpd% % add days in prior years
+ \global\@common = #4}%
+ #4 = \@common}
+\def\HebrewFromGregorian#1#2#3#4#5#6{%
+ {%
+ \countdef\tmpx= 17% % \tmpx==\count17
+ \countdef\tmpy= 18% % \tmpy==\count18
+ \countdef\tmpz= 19% % \tmpz==\count19
+ #6 = #3% %
+ \global\advance #6 by 3761% approximation from above
+ \@AbsoluteFromGregorian{#1}{#2}{#3}{#4}%
+ \tmpz = 1 \tmpy = 1%
+ \@FixedFromHebrew{\tmpz}{\tmpy}{#6}{\tmpx}%
+ \ifnum \tmpx > #4% %
+ \global\advance #6 by -1% Hyear = Gyear + 3760
+ \@FixedFromHebrew{\tmpz}{\tmpy}{#6}{\tmpx}%
+ \fi% %
+ \advance #4 by -\tmpx% % Days in this year
+ \advance #4 by 1% %
+ #5 = #4% %
+ \divide #5 by 30% % Approximation for month from below
+ \loop% % Search for month
+ \@HebrewDaysInPriorMonths{#5}{#6}{\tmpx}%
+ \ifnum \tmpx < #4%
+ \advance #5 by 1%
+ \tmpy = \tmpx%
+ \repeat%
+ \global\advance #5 by -1%
+ \global\advance #4 by -\tmpy}}
+\ProcessOptions*
+% \end{macrocode}
+% \iffalse
+%</hebrewcal.sty>
+%<*hijrical.sty>
+% \fi
+% \clearpage
+%
+% \subsection{hijrical.sty}
+% \begin{macrocode}
+\ProvidesPackage{hijrical}
+ [2010/07/12 v0.2 %
+ Islamic calendar]
+\RequirePackage{calc}
+\RequirePackage{arabicnumbers}
+\@ifpackageloaded{bidi}{}{\newif\if@RTL\@RTLfalse}
+\@ifpackageloaded{l3calc}{\PackageError{hijrical}{\MessageBreak
+Package l3calc is loaded, which replaces the functionality of
+calc. Computation of Hijri dates will not work properly with
+% FIXME by Arthur: François couldn’t possibly mean ‘l3calc’ on the
+% following line :-) Find out if he meant ‘calc’.
+l3calc! The latest version of expl3 on CTAN no longer loads
+l3calc. Please update expl3!
+}{}}{}
+
+\@ifundefined{@Remainder}{\input{cal-util.def}}{}
+
+%% The following functions are straightforward implementation
+%% of Reingold & Dershowitz, Calendrical Calculations, The Millenium Edition
+%%
+
+\def\@FixedFromHijri#1#2#3#4{% year,month,day,counter
+\@ifundefined{c@#4}{\newcounter{#4}}{}%
+\setcounter{tmpA}{#2/2}% see errata of Reingold+Dershowitz
+%\message{tmpA is \thetmpA}%
+\setcounter{tmpB}{(3+11*#1)/30}%
+%\message{tmpB is \thetmpB}%
+\setcounter{#4}{227014+(#1-1)*354+\value{tmpB}+(29*(#2-1))+\value{tmpA}+#3}%
+}
+
+\newcounter{Hijriday}\newcounter{Hijrimonth}\newcounter{Hijriyear}
+
+\def\HijriFromGregorian#1#2#3{% year,month,day
+\@FixedFromGregorian{#1}{#2}{#3}{RDdate}%
+\setcounter{Hijriyear}{(30*(\value{RDdate}-227015)+10646)/10631}%
+\@FixedFromHijri{\value{Hijriyear}}{1}{1}{tmpx}%
+%\message{tmpx is \thetmpx}%
+\setcounter{tmpB}{\value{RDdate}-\value{tmpx}}%
+%\message{tmpB is \thetmpB}%
+\setcounter{Hijrimonth}{((11*\value{tmpB})+330)/325}%
+\@FixedFromHijri{\value{Hijriyear}}{\value{Hijrimonth}}{1}{tmpy}%
+%\message{tmpy is \thetmpy}%
+\setcounter{Hijriday}{1+\value{RDdate}-\value{tmpy}}%
+}
+
+%\HijriFromGregorian{\year}{\month}{\day}%
+
+%\def\PlainHijritoday{%
+%\theHijriday.\theHijrimonth.\theHijriyear}
+
+\def\Hijridate#1#2#3{%
+ \HijriFromGregorian{#1}{#2}{#3}%
+ \FormatHijriDate}
+
+% added option \Hijritoday[n] (default 0) for adjusting the date + n days
+\@ifundefined{@hijri@correction}{\gdef\@hijri@correction{0}}{}
+\newcommand\Hijritoday[1][\@hijri@correction]{%
+ \@ifundefined{c@adj@day}{\global\newcounter{adj@day}}{}%
+ \setcounter{adj@day}{\the\day+#1}%
+ \Hijridate{\year}{\month}{\value{adj@day}}}
+%\def\Hijritoday{\Hijridate{\year}{\month}{\day}}
+\let\hijritoday=\Hijritoday
+%FIXME necessary?
+%\def\Hijrisetreg{%
+% \HijriFromGregorian{\year}{\month}{\day}}
+
+\def\HijriMonthTranslit#1{\ifcase#1\or Muḥarram\or Ṣafar\or Rabīʿ I\or Rabīʿ II\or%
+Jumādā I\or Jumādā II\or Rajab\or Shaʿbān\or Ramaḍān\or%
+Shawwāl\or Dhū ’l-Qaʿda\or Dhū ’l-Ḥijja\fi}
+
+\def\HijriMonthArabic#1{\ifcase#1\or محرم\or صفر\or ربيع الأول\or ربيع الآخر\or%
+جمادى الأولى\or جمادى الآخرة\or رجب\or شعبان\or رمضان\or%
+شوال\or ذو القعدة\or ذو الحجة\fi}
+
+%% This macro is now locale-aware!
+\def\FormatHijriDate{%
+ \@ifundefined{FormatHijriDate@\languagename}%
+ {\if@RTL\FormatHijriDate@defaultRTL\else\FormatHijriDate@defaultLTR\fi}%
+ {\csname FormatHijriDate@\languagename\endcsname}}
+
+\newcommand\DefineFormatHijriDate[2]{%
+ \@namedef{FormatHijriDate@#1}{#2}}
+
+% we provide this as a reasonable default.
+% Further definitions are in polyglossia’s language definition files.
+\DefineFormatHijriDate{defaultRTL}{\@ensure@RTL{%
+\arabicdigits{\value{Hijriday}}\space\HijriMonthArabic{\value{Hijrimonth}}\space\arabicdigits{\value{Hijriyear}}}}
+
+\DefineFormatHijriDate{defaultLTR}{%
+\number\value{Hijriday}\space\HijriMonthTranslit{\value{Hijrimonth}}\space\number\value{Hijriyear}}
+% \end{macrocode}
+% \iffalse
+%</hijrical.sty>
+%<*polyglossia-french.lua>
+% \fi
+% \clearpage
+%
+% \subsection{polyglossia-french.lua}
+% \begin{macrocode}
+require('polyglossia-punct')
+
+local function set_left_space(lang, char, kern, rubber)
+ polyglossia.add_left_spaced_character(lang, char, kern, "space", rubber)
+end
+
+local function set_right_space(lang, char, kern, rubber)
+ polyglossia.add_right_spaced_character(lang, char, kern, "space", rubber)
+end
+
+local function activate_french_punct(thincolonspace, autospaceguillemets)
+ -- We need different language tags here to make switching of options possible
+ -- within a paragraph.
+ local lang = "french"
+ if thincolonspace then
+ lang = lang.."-thincolon"
+ end
+ if autospaceguillemets then
+ lang = lang.."-autospace"
+ end
+
+ polyglossia.activate_punct(lang)
+ polyglossia.clear_spaced_characters(lang)
+
+ if thincolonspace then
+ set_left_space(lang, ':', 0.5)
+ else
+ set_left_space(lang, ':', 1, true) -- stretchable and shrinkable space
+ end
+
+ set_left_space(lang, '!', 0.5)
+ set_left_space(lang, '?', 0.5)
+ set_left_space(lang, ';', 0.5)
+ set_left_space(lang, '‼', 0.5)
+ set_left_space(lang, '⁇', 0.5)
+ set_left_space(lang, '⁈', 0.5)
+ set_left_space(lang, '⁉', 0.5)
+ set_left_space(lang, '‽', 0.5) -- U+203D (interrobang)
+
+ if autospaceguillemets then
+ set_left_space(lang, '»', 0.5)
+ set_left_space(lang, '›', 0.5)
+ set_right_space(lang, '«', 0.5)
+ set_right_space(lang, '‹', 0.5)
+ end
+end
+
+local function deactivate_french_punct()
+ polyglossia.deactivate_punct()
+end
+
+polyglossia.activate_french_punct = activate_french_punct
+polyglossia.deactivate_french_punct = deactivate_french_punct
+% \end{macrocode}
+% \iffalse
+%</polyglossia-french.lua>
+%<*polyglossia-korean.lua>
+% \fi
+% \clearpage
+%
+% \subsection{polyglossia-korean.lua}
+% \begin{macrocode}
+--
+-- polyglossia-korean.lua
+--
+
+local glyph_id = node.id"glyph"
+local hbox_id = node.id"hlist"
+local vbox_id = node.id"vlist"
+local glue_id = node.id"glue"
+local penalty_id = node.id"penalty"
+local disc_id = node.id"disc"
+
+--
+-- attr_korean: variant = plain (0), classic (1), modern (2)
+--
+local attr_korean = luatexbase.attributes["xpg@attr@korean"]
+local attr_josa = luatexbase.attributes["xpg@attr@autojosa"]
+
+--
+-- characters after which linebreak is not allowed
+--
+local nobr_after = {
+ [0x28] = 1, -- ( LEFT PARENTHESIS
+ [0x3C] = 1, -- < LESS-THAN SIGN
+ [0x5B] = 1, -- [ LEFT SQUARE BRACKET
+ [0x60] = 1, -- ` GRAVE ACCENT
+ [0x7B] = 1, -- { LEFT CURLY BRACKET
+ [0xAB] = 1, -- « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ [0x2018] = 1, -- ‘ LEFT SINGLE QUOTATION MARK
+ [0x201C] = 1, -- “ LEFT DOUBLE QUOTATION MARK
+ [0x2329] = 1, -- 〈 LEFT-POINTING ANGLE BRACKET
+ [0x3008] = 1, -- 〈 LEFT ANGLE BRACKET
+ [0x300A] = 1, -- 《 LEFT DOUBLE ANGLE BRACKET
+ [0x300C] = 1, -- 「 LEFT CORNER BRACKET
+ [0x300E] = 1, -- 『 LEFT WHITE CORNER BRACKET
+ [0x3010] = 1, -- 【 LEFT BLACK LENTICULAR BRACKET
+ [0x3014] = 1, -- 〔 LEFT TORTOISE SHELL BRACKET
+ [0x3016] = 1, -- 〖 LEFT WHITE LENTICULAR BRACKET
+ [0x3018] = 1, -- 〘 LEFT WHITE TORTOISE SHELL BRACKET
+ [0x301A] = 1, -- 〚 LEFT WHITE SQUARE BRACKET
+ [0x301D] = 1, -- 〝 REVERSED DOUBLE PRIME QUOTATION MARK
+ [0xFE17] = 1, -- ︗ PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+ [0xFE35] = 1, -- ︵ PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+ [0xFE37] = 1, -- ︷ PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+ [0xFE39] = 1, -- ︹ PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+ [0xFE3B] = 1, -- ︻ PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+ [0xFE3D] = 1, -- ︽ PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+ [0xFE3F] = 1, -- ︿ PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+ [0xFE41] = 1, -- ﹁ PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+ [0xFE43] = 1, -- ﹃ PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+ [0xFE47] = 1, -- ﹇ PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+ [0xFE59] = 1, -- ﹙ SMALL LEFT PARENTHESIS
+ [0xFE5B] = 1, -- ﹛ SMALL LEFT CURLY BRACKET
+ [0xFE5D] = 1, -- ﹝ SMALL LEFT TORTOISE SHELL BRACKET
+ [0xFF08] = 1, -- ( FULLWIDTH LEFT PARENTHESIS
+ [0xFF3B] = 1, -- [ FULLWIDTH LEFT SQUARE BRACKET
+ [0xFF5B] = 1, -- { FULLWIDTH LEFT CURLY BRACKET
+ [0xFF5F] = 1, -- ⦅ FULLWIDTH LEFT WHITE PARENTHESIS
+ [0xFF62] = 1, -- 「 HALFWIDTH LEFT CORNER BRACKET
+}
+
+--
+-- characters before which linebreak is not allowed
+-- (currently, not much differences among the followings)
+-- 1: normal chars
+-- 2: hangul jamo vowels and trailing consonants
+-- 3: kana small letters
+-- 0: dashes (supress visible spacing)
+--
+local nobr_before = setmetatable({
+ [0x21] = 1, -- ! EXCLAMATION MARK
+ [0x22] = 1, -- " QUOTATION MARK
+ [0x27] = 1, -- ' APOSTROPHE
+ [0x29] = 1, -- ) RIGHT PARENTHESIS
+ [0x2C] = 1, -- , COMMA
+ [0x2D] = 0, -- - HYPHEN-MINUS
+ [0x2E] = 1, -- . FULL STOP
+ [0x2F] = 0, -- / SOLIDUS
+ [0x3A] = 0, -- : COLON
+ [0x3B] = 1, -- ; SEMICOLON
+ [0x3E] = 1, -- > GREATER-THAN SIGN
+ [0x3F] = 1, -- ? QUESTION MARK
+ [0x5C] = 0, -- \ REVERSE SOLIDUS
+ [0x5D] = 1, -- ] RIGHT SQUARE BRACKET
+ [0x7D] = 1, -- } RIGHT CURLY BRACKET
+ [0x7E] = 0, -- ~ TILDE
+ [0xB7] = 1, -- · MIDDLE DOT
+ [0xBB] = 1, -- » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ [0x2013] = 0, -- – EN DASH
+ [0x2014] = 0, -- — EM DASH
+ [0x2015] = 1, -- ― HORIZONTAL BAR
+ [0x2019] = 1, -- ’ RIGHT SINGLE QUOTATION MARK
+ [0x201D] = 1, -- ” RIGHT DOUBLE QUOTATION MARK
+ [0x2025] = 1, -- ‥ TWO DOT LEADER
+ [0x2026] = 1, -- … HORIZONTAL ELLIPSIS
+ [0x232A] = 1, -- 〉 RIGHT-POINTING ANGLE BRACKET
+ [0x3001] = 1, -- 、 IDEOGRAPHIC COMMA
+ [0x3002] = 1, -- 。 IDEOGRAPHIC FULL STOP
+ [0x3005] = 1, -- 々 IDEOGRAPHIC ITERATION MARK
+ [0x3009] = 1, -- 〉 RIGHT ANGLE BRACKET
+ [0x300B] = 1, -- 》 RIGHT DOUBLE ANGLE BRACKET
+ [0x300D] = 1, -- 」 RIGHT CORNER BRACKET
+ [0x300F] = 1, -- 』 RIGHT WHITE CORNER BRACKET
+ [0x3011] = 1, -- 】 RIGHT BLACK LENTICULAR BRACKET
+ [0x3015] = 1, -- 〕 RIGHT TORTOISE SHELL BRACKET
+ [0x3017] = 1, -- 〗 RIGHT WHITE LENTICULAR BRACKET
+ [0x3019] = 1, -- 〙 RIGHT WHITE TORTOISE SHELL BRACKET
+ [0x301B] = 1, -- 〛 RIGHT WHITE SQUARE BRACKET
+ [0x301C] = 1, -- 〜 WAVE DASH
+ [0x301E] = 1, -- 〞 DOUBLE PRIME QUOTATION MARK
+ [0x301F] = 1, -- 〟 LOW DOUBLE PRIME QUOTATION MARK
+ [0x3035] = 1, -- 〵 VERTICAL KANA REPEAT MARK LOWER HALF
+ [0x303B] = 1, -- 〻 VERTICAL IDEOGRAPHIC ITERATION MARK
+ [0x303C] = 1, -- 〼 MASU MARK
+ [0x3041] = 3, -- ぁ HIRAGANA LETTER SMALL A
+ [0x3043] = 3, -- ぃ HIRAGANA LETTER SMALL I
+ [0x3045] = 3, -- ぅ HIRAGANA LETTER SMALL U
+ [0x3047] = 3, -- ぇ HIRAGANA LETTER SMALL E
+ [0x3049] = 3, -- ぉ HIRAGANA LETTER SMALL O
+ [0x3063] = 3, -- っ HIRAGANA LETTER SMALL TU
+ [0x3083] = 3, -- ゃ HIRAGANA LETTER SMALL YA
+ [0x3085] = 3, -- ゅ HIRAGANA LETTER SMALL YU
+ [0x3087] = 3, -- ょ HIRAGANA LETTER SMALL YO
+ [0x308E] = 3, -- ゎ HIRAGANA LETTER SMALL WA
+ [0x3095] = 3, -- ゕ HIRAGANA LETTER SMALL KA
+ [0x3096] = 3, -- ゖ HIRAGANA LETTER SMALL KE
+ [0x3099] = 1, -- COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
+ [0x309A] = 1, -- COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ [0x309B] = 1, -- ゛ KATAKANA-HIRAGANA VOICED SOUND MARK
+ [0x309C] = 1, -- ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ [0x309D] = 1, -- ゝ HIRAGANA ITERATION MARK
+ [0x309E] = 1, -- ゞ HIRAGANA VOICED ITERATION MARK
+ [0x30A0] = 1, -- ゠ KATAKANA-HIRAGANA DOUBLE HYPHEN
+ [0x30A1] = 3, -- ァ KATAKANA LETTER SMALL A
+ [0x30A3] = 3, -- ィ KATAKANA LETTER SMALL I
+ [0x30A5] = 3, -- ゥ KATAKANA LETTER SMALL U
+ [0x30A7] = 3, -- ェ KATAKANA LETTER SMALL E
+ [0x30A9] = 3, -- ォ KATAKANA LETTER SMALL O
+ [0x30C3] = 3, -- ッ KATAKANA LETTER SMALL TU
+ [0x30E3] = 3, -- ャ KATAKANA LETTER SMALL YA
+ [0x30E5] = 3, -- ュ KATAKANA LETTER SMALL YU
+ [0x30E7] = 3, -- ョ KATAKANA LETTER SMALL YO
+ [0x30EE] = 3, -- ヮ KATAKANA LETTER SMALL WA
+ [0x30F5] = 3, -- ヵ KATAKANA LETTER SMALL KA
+ [0x30F6] = 3, -- ヶ KATAKANA LETTER SMALL KE
+ [0x30FB] = 1, -- ・ KATAKANA MIDDLE DOT
+ [0x30FC] = 1, -- ー KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ [0x30FD] = 1, -- ヽ KATAKANA ITERATION MARK
+ [0x30FE] = 1, -- ヾ KATAKANA VOICED ITERATION MARK
+ [0xFE30] = 1, -- ︰ PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+ [0xFE31] = 1, -- ︱ PRESENTATION FORM FOR VERTICAL EM DASH
+ [0xFE32] = 1, -- ︲ PRESENTATION FORM FOR VERTICAL EN DASH
+ [0xFE36] = 1, -- ︶ PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+ [0xFE38] = 1, -- ︸ PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+ [0xFE3A] = 1, -- ︺ PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+ [0xFE3C] = 1, -- ︼ PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+ [0xFE3E] = 1, -- ︾ PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+ [0xFE40] = 1, -- ﹀ PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+ [0xFE42] = 1, -- ﹂ PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+ [0xFE44] = 1, -- ﹄ PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+ [0xFE48] = 1, -- ﹈ PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+ [0xFE5A] = 1, -- ﹚ SMALL RIGHT PARENTHESIS
+ [0xFE5C] = 1, -- ﹜ SMALL RIGHT CURLY BRACKET
+ [0xFE5E] = 1, -- ﹞ SMALL RIGHT TORTOISE SHELL BRACKET
+ [0xFF01] = 1, -- ! FULLWIDTH EXCLAMATION MARK
+ [0xFF09] = 1, -- ) FULLWIDTH RIGHT PARENTHESIS
+ [0xFF0C] = 1, -- , FULLWIDTH COMMA
+ [0xFF0E] = 1, -- . FULLWIDTH FULL STOP
+ [0xFF1A] = 1, -- : FULLWIDTH COLON
+ [0xFF1B] = 1, -- ; FULLWIDTH SEMICOLON
+ [0xFF1F] = 1, -- ? FULLWIDTH QUESTION MARK
+ [0xFF3D] = 1, -- ] FULLWIDTH RIGHT SQUARE BRACKET
+ [0xFF5D] = 1, -- } FULLWIDTH RIGHT CURLY BRACKET
+ [0xFF60] = 1, -- ⦆ FULLWIDTH RIGHT WHITE PARENTHESIS
+ [0xFF61] = 1, -- 。 HALFWIDTH IDEOGRAPHIC FULL STOP
+ [0xFF63] = 1, -- 」 HALFWIDTH RIGHT CORNER BRACKET
+ [0xFF64] = 1, -- 、 HALFWIDTH IDEOGRAPHIC COMMA
+ [0xFF65] = 1, -- ・ HALFWIDTH KATAKANA MIDDLE DOT
+ [0xFF9E] = 1, -- ゙ HALFWIDTH KATAKANA VOICED SOUND MARK
+ [0xFF9F] = 1, -- ゚ HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+}, { __index = function(_,c)
+ if c >= 0x1160 and c <= 0x11FF then return 2 end
+ if c >= 0xD7B0 and c <= 0xD7FF then return 2 end
+ if c >= 0x302A and c <= 0x302F then return 1 end
+ if c >= 0x31F0 and c <= 0x31FF then return 3 end
+ if c >= 0xFF67 and c <= 0xFF70 then return 3 end
+ if c >= 0xFE00 and c <= 0xFE0F then return 1 end
+ if c >= 0xFE10 and c <= 0xFE19 and not (c == 0xFE17) then return 1 end
+ if c >= 0xFE50 and c <= 0xFE58 then return 1 end
+ if c >= 0xE0100 and c <= 0xE01EF then return 1 end
+ end
+})
+
+--
+-- whether 'c' is a cjk character
+--
+local function is_cjk (c)
+ return c >= 0xAC00 and c <= 0xD7FF
+ or c >= 0x1100 and c <= 0x11FF
+ or c >= 0xA960 and c <= 0xA97F
+ or c >= 0x2E80 and c <= 0x9FFF
+ or c >= 0xF900 and c <= 0xFAFF
+ or c >= 0xFE10 and c <= 0xFE1F
+ or c >= 0xFE30 and c <= 0xFE6F
+ or c >= 0xFF00 and c <= 0xFFEF
+ or c >= 0x1F100 and c <= 0x1F2FF
+ or c >= 0x20000 and c <= 0x2FA1F
+ or nobr_after[c] and c > 0x2014
+ or nobr_before[c] and c > 0x2014
+end
+
+--
+-- classify cjk characters
+-- 1: openings
+-- 2: closings
+-- 3: centered chars
+-- 4: full stops
+-- 5: ellipses
+-- 6: exclamation and question marks
+-- 0: all others
+--
+local charclass = setmetatable({
+ [0x2018] = 1, [0x201C] = 1, [0x2329] = 1, [0x3008] = 1,
+ [0x300A] = 1, [0x300C] = 1, [0x300E] = 1, [0x3010] = 1,
+ [0x3014] = 1, [0x3016] = 1, [0x3018] = 1, [0x301A] = 1,
+ [0x301D] = 1, [0xFE17] = 1, [0xFE35] = 1, [0xFE37] = 1,
+ [0xFE39] = 1, [0xFE3B] = 1, [0xFE3D] = 1, [0xFE3F] = 1,
+ [0xFE41] = 1, [0xFE43] = 1, [0xFE47] = 1, [0xFF08] = 1,
+ [0xFF3B] = 1, [0xFF5B] = 1, [0xFF5F] = 1, [0xFF62] = 1,
+ [0x2019] = 2, [0x201D] = 2, [0x232A] = 2, [0x3001] = 2,
+ [0x3009] = 2, [0x300B] = 2, [0x300D] = 2, [0x300F] = 2,
+ [0x3011] = 2, [0x3015] = 2, [0x3017] = 2, [0x3019] = 2,
+ [0x301B] = 2, [0x301E] = 2, [0x301F] = 2, [0xFE10] = 2,
+ [0xFE11] = 2, [0xFE18] = 2, [0xFE36] = 2, [0xFE38] = 2,
+ [0xFE3A] = 2, [0xFE3C] = 2, [0xFE3E] = 2, [0xFE40] = 2,
+ [0xFE42] = 2, [0xFE44] = 2, [0xFE48] = 2, [0xFF09] = 2,
+ [0xFF0C] = 2, [0xFF3D] = 2, [0xFF5D] = 2, [0xFF60] = 2,
+ [0xFF63] = 2, [0xFF64] = 2, [0x00B7] = 3, [0x30FB] = 3,
+ [0xFF1A] = 3, [0xFF1B] = 3, [0xFF65] = 3, [0x3002] = 4,
+ [0xFE12] = 4, [0xFF0E] = 4, [0xFF61] = 4, [0x2015] = 5,
+ [0x2025] = 5, [0x2026] = 5, [0xFE19] = 5, [0xFE30] = 5,
+ [0xFE31] = 5, [0xFE15] = 6, [0xFE16] = 6, [0xFF01] = 6,
+ [0xFF1F] = 6,
+}, { __index = function() return 0 end })
+
+--
+-- table for spacing between char classes
+-- 1 stands for 0.5*fontsize when variant=classic
+--
+local intercharclass = { [0] =
+ { [0] = nil, {1,1}, nil, {.5,.5} },
+ { [0] = nil, nil, nil, {.5,.5} },
+ { [0] = {1,1}, {1,1}, nil, {.5,.5}, nil, {1,1}, {1,1} },
+ { [0] = {.5,.5},{.5,.5},{.5,.5},{1,.5}, {.5,.5},{.5,.5},{.5,.5} },
+ { [0] = {1,0}, {1,0}, nil, {1.5,.5},nil, {1,0}, {1,0} },
+ { [0] = nil, {1,1}, nil, {.5,.5} },
+ { [0] = {1,1}, {1,1}, nil, {.5,.5} },
+}
+
+--
+-- get a new penalty node
+--
+local function get_new_penalty (p)
+ local penalty = node.new("penalty")
+ penalty.penalty = p
+ return penalty
+end
+
+--
+-- get a new glue node
+--
+local function get_new_glue (...)
+ local glue = node.new("glue")
+ node.setglue(glue, ...)
+ return glue
+end
+
+--
+-- return 0.5*fontsize of given fontid
+-- space: true if variant=modern; then 0.5*interword_space
+--
+local function get_font_size (fid, space)
+ local size = font.getparameters(fid)
+ if space then
+ size = size and size.space or 196608
+ else
+ size = size and size.quad or 655360
+ end
+ return size/2
+end
+
+--
+-- charclass 1 thru 4 will be packed in \hbox to 0.5em{\hss? curr \hss?}
+-- when variant=classic/modern
+--
+local function glyph_to_box (head, curr, class)
+ local g, h = curr
+ local size = get_font_size(g.font)
+ head, curr = node.remove(head, curr)
+ g.next, g.prev = nil, nil
+ local hss = get_new_glue(0, 65536, 65536, 2, 2)
+ if class == 1 then
+ h, hss.next, g.prev = hss, g, hss
+ elseif class == 2 or class == 4 then
+ h, g.next, hss.prev = g, hss, g
+ else
+ local hss2 = node.copy(hss)
+ h, hss.next, g.prev, g.next, hss2.prev = hss, g, hss, hss2, g
+ end
+ h = nodes.simple_font_handler(h)
+ local box = node.hpack(h, size, "exactly")
+ if curr then
+ head, curr = node.insert_before(head, curr, box)
+ else
+ head, curr = node.insert_after(head, node.tail(head), box)
+ end
+ return head, curr
+end
+
+--
+-- insert spacing defined as charclass[a][b] between a and b
+-- f: fontid
+-- var: variant = plain, classic, modern
+-- cc: charclass of current char
+-- nc: charclass of next char
+-- nobr: linebreak is not allowed
+--
+local function insert_cjk_penalty_glue (head, curr, f, var, cc, nc, nobr)
+ if nobr or cc == 1 or nc > 1 then
+ local penalty = get_new_penalty(10000)
+ head, curr = node.insert_after(head, curr, penalty)
+ end
+ local factor = get_font_size(f, var == 2)
+ local t = intercharclass[cc][nc]
+ local glue = get_new_glue(t[1]*factor, nil, t[2]*factor)
+ head, curr = node.insert_after(head, curr, glue)
+ return head, curr
+end
+
+--
+-- insert inter-character spacing in other normal cases
+-- f: fontid
+-- var: variant = plain, classic, modern
+-- x: true between cjk and non-cjk (a little more spacing)
+--
+local function insert_penalty_glue (head, curr, f, var, x)
+ if var ~= 1 then
+ local penalty = get_new_penalty(50)
+ head, curr = node.insert_after(head, curr, penalty)
+ end
+ local size, glue = get_font_size(f, x and var == 2)
+ if x then
+ glue = get_new_glue(size/2, size/4, size/8)
+ else
+ glue = get_new_glue(0, size/10, size/50)
+ end
+ head, curr = node.insert_after(head, curr, glue)
+ return head, curr
+end
+
+--
+-- main process for linebreak and inter-character spacing
+-- lb: true if pre_linebreak_filter
+--
+local function korean_break (head, lb)
+ local curr = head
+ while curr do
+ if curr.id == glyph_id then
+ local var = node.has_attribute(curr, attr_korean)
+ if var then
+ local c, f = curr.char or 0, curr.font or 0
+ local cc, cjkc = charclass[c], is_cjk(c)
+
+ -- compress cjk punctuations when charclass is 1 thru 4
+ if var > 0 and cc > 0 and cc < 5 then
+ head, curr = glyph_to_box(head, curr, cc)
+ end
+
+ local next = curr.next
+ if next and next.id == glyph_id then
+ local n = next.char or 0
+ local nc = charclass[n]
+ local nobr = nobr_before[n] or nobr_after[c]
+
+ -- insert spacing as of intercharclass
+ if var > 0 and intercharclass[cc][nc] then
+ head, curr = insert_cjk_penalty_glue(head, curr, f, var, cc, nc, nobr)
+
+ -- or insert spacing when linebreak is allowed
+ elseif not nobr then
+ local cjkn = is_cjk(n)
+
+ -- if curr or next is cjk char
+ if cjkc or cjkn then
+
+ -- if between cjk and non-cjk
+ if var > 0 and not (cjkc and cjkn) and nobr_before[c] ~= 0 then
+ head, curr = insert_penalty_glue(head, curr, f, var, true)
+
+ -- or under pre_linebreak_filter
+ elseif lb then
+ head, curr = insert_penalty_glue(head, curr, f, var)
+ end
+ end
+ end
+ end
+ end
+ end
+ curr = curr.next
+ end
+ return head
+end
+
+--
+-- process for reordering hangul tone marks (U+302E, U+302F)
+-- some hangul fonts (eg. Noto CJK) are so designed that hangul tone marks
+-- should be moved to the first position of a syllable.
+-- Currently, this functionality is not provided by luaotfload.
+--
+local function reorder_tm (head)
+ local curr, tone = node.slide(head)
+ while curr do
+ if curr.id == glyph_id and node.has_attribute(curr, attr_korean) then
+ local f = font.getfont(curr.font) or font.fonts[curr.font]
+ if f and f.hb then -- harfbuzz do the right thing
+ tone = nil
+ else
+ local c, wd = curr.char or 0, curr.width or 0
+ if (c == 0x302E or c == 0x302F) and wd > 0 then
+ tone = curr
+ elseif tone and not nobr_before[c] then
+ head = node.remove(head, tone)
+ tone.next, tone.prev = nil, nil
+ head, curr = node.insert_before(head, curr, tone)
+ tone = nil
+ end
+ end
+ end
+ curr = curr.prev
+ end
+ return head
+end
+
+--
+-- automatic josa selection
+--
+local josa_table = {
+ -- consonant ㄹ, vowel, other consonants
+ [0xAC00] = {0xC774, 0xAC00, 0xC774}, -- 가 => 이, 가, 이
+ [0xC740] = {0xC740, 0xB294, 0xC740}, -- 은 => 은, 는, 은
+ [0xC744] = {0xC744, 0xB97C, 0xC744}, -- 을 => 을, 를, 을
+ [0xC640] = {0xACFC, 0xC640, 0xACFC}, -- 와 => 과, 와, 과
+ [0xC73C] = {nil, nil, 0xC73C}, -- 으(로) => , , 으
+ [0xC774] = {0xC774, nil, 0xC774}, -- 이(라) => 이, , 이
+}
+
+--
+-- helper function for number-like characters
+--
+local function josa_char_num (t, c)
+ c = c % 10 + 0x30
+ return t[c] or 2
+end
+
+--
+-- decide josa selection
+--
+local josa_code = setmetatable({
+ [0x30] = 3, [0x31] = 1, [0x33] = 3, [0x36] = 3, [0x37] = 1,
+ [0x38] = 1, [0x4C] = 1, [0x4D] = 3, [0x4E] = 3, [0x6C] = 1,
+ [0x6D] = 3, [0x6E] = 3, [0xFB02] = 1, [0xFB04] = 1,
+},{ __index = function(t,c)
+ if c >= 0xAC00 and c <= 0xD7A3 then
+ c = (c - 0xAC00) % 28 + 0x11A7
+ end
+ if c >= 0x11A8 and c <= 0x11FF then
+ if c == 0x11AF then return 1 end
+ return 3
+ end
+ if c >= 0xD7CB and c <= 0xD7FB then return 3 end
+ if c >= 0x2170 and c <= 0x217F then c = c - 0x10 end
+ if c >= 0x2160 and c <= 0x216F then
+ if c >= 0x216C then return 3 end
+ return josa_char_num(t, c - 0x215F)
+ end
+ if c >= 0x2460 and c <= 0x2473 then return josa_char_num(t, c - 0x245F) end
+ if c >= 0x2474 and c <= 0x2487 then return josa_char_num(t, c - 0x2473) end
+ if c >= 0x2488 and c <= 0x249B then return josa_char_num(t, c - 0x2487) end
+ if c >= 0x249C and c <= 0x24B5 then return t[c - 0x249C + 0x61] or 2 end
+ if c >= 0x24B6 and c <= 0x24CF then return t[c - 0x24B6 + 0x61] or 2 end
+ if c >= 0x24D0 and c <= 0x24E9 then return t[c - 0x24D0 + 0x61] or 2 end
+ if c >= 0x3131 and c <= 0x318E then
+ if c == 0x3139 then return 1 end
+ if c >= 0x314F and c <= 0x3163 or c >= 0x3187 then return 2 end
+ return 3
+ end
+ if c >= 0x3260 and c <= 0x327E then c = c - 0x60 end
+ if c >= 0x3200 and c <= 0x321E then
+ if c == 0x3203 then return 1 end
+ if c >= 0x320E then return 2 end
+ return 3
+ end
+ if c >= 0xFF10 and c <= 0xFF19 then return josa_char_num(t, c - 0xFF10) end
+ if c >= 0xFF21 and c <= 0xFF3A then return t[c - 0xFF21 + 0x61] or 2 end
+ if c >= 0xFF41 and c <= 0xFF5A then return t[c - 0xFF41 + 0x61] or 2 end
+ return 2
+ end
+})
+
+--
+-- obtain char that comes just before the josa
+--
+local function get_prev_char (p)
+ while p do
+ if p.id == glyph_id then
+ local pc = p.char or 0
+ if not nobr_after[pc] then
+ if not nobr_before[pc] or nobr_before[pc] >= 2 then
+ return pc
+ end
+ end
+ elseif p.id == hbox_id or p.id == vbox_id then
+ local pc = get_prev_char(node.slide(p.head))
+ if pc then return pc end
+ end
+ p = p.prev
+ end
+end
+
+--
+-- main process of josa selection
+--
+local function auto_josa (head)
+ local curr, tofree = head, {}
+ while curr do
+ if curr.id == glyph_id then
+ local josa = node.has_attribute(curr, attr_josa)
+ if josa then
+ local cc = curr.char or 0
+ if josa == 0 then
+ josa = josa_code[get_prev_char(curr.prev) or 0x30]
+ end
+ if cc == 0xC774 then
+ local n = curr.next
+ if n and n.char and n.char >= 0xAC00 and n.char <= 0xD7A3 then
+ else
+ cc = 0xAC00
+ end
+ end
+ local new = josa_table[cc]
+ if new then
+ cc = new[josa]
+ if cc then
+ curr.char = cc
+ else
+ head = node.remove(head, curr)
+ table.insert(tofree, curr)
+ end
+ end
+ node.unset_attribute(curr, attr_josa)
+ end
+ end
+ curr = curr.next
+ end
+ for _,v in ipairs(tofree) do node.free(v) end
+ return head
+end
+
+--
+-- now register to luatex callbacks
+-- As char value of glyphs can be changed by opentype GSUB process,
+-- we have to occupy the first position among callback functions.
+--
+local prepend_to_callback
+if luatexbase.base_add_to_callback then
+ prepend_to_callback = function(name, func, desc)
+ luatexbase.add_to_callback(name, func, desc, 1)
+ end
+else
+ prepend_to_callback = function(name, func, desc)
+ local t = { {func, desc} }
+ for _,v in ipairs(luatexbase.callback_descriptions(name)) do
+ table.insert(t, {luatexbase.remove_from_callback(name, v)})
+ end
+ for _,v in ipairs(t) do
+ luatexbase.add_to_callback(name, v[1], v[2])
+ end
+ end
+end
+
+prepend_to_callback ("pre_linebreak_filter",
+ function(head)
+ head = auto_josa(head)
+ head = korean_break(head, true)
+ head = reorder_tm(head)
+ return head
+ end,
+ "polyglossia.lang_korean")
+
+prepend_to_callback ("hpack_filter",
+ function(head)
+ head = auto_josa(head)
+ head = korean_break(head)
+ head = reorder_tm(head)
+ return head
+ end,
+ "polyglossia.lang_korean")
+
+-- vim:ft=lua:tw=0:sw=4:ts=4:expandtab
+% \end{macrocode}
+% \iffalse
+%</polyglossia-korean.lua>
+%<*polyglossia-latin.lua>
+% \fi
+% \clearpage
+%
+% \subsection{polyglossia-latin.lua}
+% \begin{macrocode}
+require('polyglossia-punct')
+
+-- For ecclesiastic Latin (and sometimes for Italian) a very small space is
+-- used for the punctuation. The ecclesiastic package uses a space of
+-- 0.3\fontdimen2, where \fontdimen2 is a interword space, which is typically
+-- between 1/4 and 1/3 of a quad. We choose a half of a \thinspace here.
+local hairspace = 0.08333 -- 1/12
+
+local function space_left(char)
+ polyglossia.add_left_spaced_character('latin', char, hairspace, 'quad')
+end
+
+local function space_right(char)
+ polyglossia.add_right_spaced_character('latin', char, hairspace, 'quad')
+end
+
+polyglossia.clear_spaced_characters('latin')
+space_left('!')
+space_left('?')
+space_left('‼')
+space_left('⁇')
+space_left('⁈')
+space_left('⁉')
+space_left('‽') -- U+203D (interrobang)
+space_left(':')
+space_left(';')
+space_left('»')
+space_left('›')
+space_right('«')
+space_right('‹')
+
+local function activate_latin_punct()
+ polyglossia.activate_punct('latin')
+end
+
+local function deactivate_latin_punct()
+ polyglossia.deactivate_punct()
+end
+
+polyglossia.activate_latin_punct = activate_latin_punct
+polyglossia.deactivate_latin_punct = deactivate_latin_punct
+% \end{macrocode}
+% \iffalse
+%</polyglossia-latin.lua>
+%<*polyglossia-punct.lua>
+% \fi
+% \clearpage
+%
+% \subsection{polyglossia-punct.lua}
+% \begin{macrocode}
+require('polyglossia') -- just in case...
+
+local add_to_callback = luatexbase.add_to_callback
+local remove_from_callback = luatexbase.remove_from_callback
+local priority_in_callback = luatexbase.priority_in_callback
+local new_attribute = luatexbase.new_attribute
+
+local node = node
+
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+local remove_node = node.remove
+local has_attribute = node.has_attribute
+local node_copy = node.copy
+local new_node = node.new
+local end_of_math = node.end_of_math
+local getnext = node.getnext
+local getprev = node.getprev
+
+-- node types according to node.types()
+local glue_code = node.id"glue"
+local glyph_code = node.id"glyph"
+local penalty_code = node.id"penalty"
+local kern_code = node.id"kern"
+local math_code = node.id"math"
+
+-- we need some node subtypes
+local userkern = 1
+local userskip = 0
+local removable_skip = {
+ [0] = true, -- userskip
+ [13] = true, -- spaceskip
+ [14] = true, -- xspaceskip
+}
+
+-- we make a new node, so that we can copy it later on
+local kern_node = new_node(kern_code)
+kern_node.subtype = userkern -- this kern can be removed later on
+
+local function get_kern_node(dim)
+ local n = node_copy(kern_node)
+ n.kern = dim
+ return n
+end
+
+local glue_node = new_node(glue_code)
+glue_node.subtype = userskip
+
+local function get_glue_node(dim, stretch, shrink)
+ local n = node_copy(glue_node)
+ n.width = dim
+ n.stretch = stretch
+ n.shrink = shrink
+ return n
+end
+
+local penalty_node = new_node(penalty_code)
+penalty_node.penalty = 10000
+
+local function get_penalty_node()
+ return node_copy(penalty_node)
+end
+
+-- all possible space characters according to section 6.2 of the Unicode Standard
+-- https://www.unicode.org/versions/Unicode12.0.0/ch06.pdf
+local space_chars = {
+ [0x20] = true, -- space
+ [0xA0] = true, -- no-break space
+ [0x1680] = true, -- ogham space mark
+ [0x2000] = true, -- en quad
+ [0x2001] = true, -- em quad
+ [0x2002] = true, -- en space
+ [0x2003] = true, -- em space
+ [0x2004] = true, -- three-per-em-space
+ [0x2005] = true, -- four-per-em space
+ [0x2006] = true, -- six-per-em space
+ [0x2007] = true, -- figure space
+ [0x2008] = true, -- punctuation space
+ [0x2009] = true, -- thin space
+ [0x200A] = true, -- hair space
+ [0x202F] = true, -- narrow no-break space
+ [0x205F] = true, -- medium mathematical space
+ [0x3000] = true -- ideographic space
+}
+
+-- all left bracket characters, referenced by their Unicode slot
+local left_bracket_chars = {
+ [0x28] = true, -- left parenthesis
+ [0x5B] = true, -- left square bracket
+ [0x7B] = true, -- left curly bracket
+ [0x27E8] = true -- mathematical left angle bracket
+}
+
+-- all right bracket characters, referenced by their Unicode slot
+local right_bracket_chars = {
+ [0x29] = true, -- right parenthesis
+ [0x5D] = true, -- right square bracket
+ [0x7D] = true, -- right curly bracket
+ [0x27E9] = true -- mathematical right angle bracket
+}
+
+-- question and exclamation marks, referenced by their Unicode slot
+local question_exclamation_chars = {
+ [0x21] = true, -- exclamation mark !
+ [0x3F] = true, -- question mark ?
+ [0x203C] = true, -- double exclamation mark ‼
+ [0x203D] = true, -- interrobang ‽
+ [0x2047] = true, -- double question mark ⁇
+ [0x2048] = true, -- question exclamation mark ⁈
+ [0x2049] = true -- exclamation question mark ⁉
+}
+
+-- from nodes-tst.lua, adapted
+local function somespace(n)
+ if n then
+ local id, subtype = n.id, n.subtype
+ if id == glue_code then
+ -- it is dangerous to remove all the type of glue
+ return removable_skip[subtype]
+ elseif id == kern_code then
+ -- remove only user's kern
+ return subtype == userkern
+ elseif id == glyph_code then
+ return space_chars[n.char]
+ end
+ end
+end
+
+local function someleftbracket(n)
+ if n then
+ local id = n.id
+ if id == glyph_code then
+ return left_bracket_chars[n.char]
+ end
+ end
+end
+
+local function somerightbracket(n)
+ if n then
+ local id = n.id
+ if id == glyph_code then
+ return right_bracket_chars[n.char]
+ end
+ end
+end
+
+local function question_exclamation_sequence(n1, n2)
+ if n1 and n2 then
+ local id1 = n1.id
+ local id2 = n2.id
+ if id1 == glyph_code and id2 == glyph_code then
+ return question_exclamation_chars[n1.char] and question_exclamation_chars[n2.char]
+ end
+ end
+end
+
+-- idem
+local function somepenalty(n, value)
+ if n then
+ local id = n.id
+ if id == penalty_code then
+ if value then
+ return n.penalty == value
+ else
+ return true
+ end
+ end
+ end
+end
+
+local punct_attr = new_attribute("polyglossia_punct")
+
+local lang_id = {}
+local lang_counter = 0
+local left_space = {}
+local right_space = {}
+
+local function ensure_lang_id(lang)
+ if not lang_id[lang] then
+ lang_counter = lang_counter + 1
+ lang_id[lang] = lang_counter
+ end
+ return lang_id[lang]
+end
+
+local function clear_spaced_characters(lang)
+ local id = ensure_lang_id(lang)
+ left_space[id] = {}
+ right_space[id] = {}
+end
+
+local function illegal_unit(unit)
+ if unit then
+ texio.write_nl('Illegal spacing unit "'..unit..'".')
+ else
+ texio.write_nl('Spacing unit is a nil value.')
+ end
+end
+
+local function add_left_spaced_character(lang, char, kern, unit, rubber)
+-- The parameter kern is a number meant as a fraction of the unit.
+-- The unit can be "quad" (1em) or "space" (interword space).
+-- The parameter rubber is a Boolean value indicating if the inserted space is
+-- stretchable and shrinkable (only relevant if the unit is "space").
+ local id = ensure_lang_id(lang)
+ if unit == "quad" or unit == "space" then
+ left_space[id][char] = {}
+ left_space[id][char]["kern"] = kern
+ left_space[id][char]["unit"] = unit
+ left_space[id][char]["rubber"] = rubber
+ else
+ illegal_unit(unit)
+ end
+end
+
+local function add_right_spaced_character(lang, char, kern, unit, rubber)
+ local id = ensure_lang_id(lang)
+ if unit == "quad" or unit == "space" then
+ right_space[id][char] = {}
+ right_space[id][char]["kern"] = kern
+ right_space[id][char]["unit"] = unit
+ right_space[id][char]["rubber"] = rubber
+ else
+ illegal_unit(unit)
+ end
+end
+
+-- from typo-spa.lua, adapted
+local function process(head)
+ local current = head
+ while current do
+ local id = current.id
+ if id == glyph_code then
+ local attr = has_attribute(current, punct_attr)
+ if attr then
+ local char, leftspace, rightspace
+ if current.char <= 0x10FFFF then -- greater values may cause problems with utf8.char
+ char = utf8.char(current.char)
+ leftspace = left_space[attr][char]
+ rightspace = right_space[attr][char]
+ end
+ if leftspace or rightspace then
+ local fontparameters = fonts.hashes.parameters[current.font]
+ local unit, stretch, shrink, spacing_node
+ if leftspace and fontparameters then
+ local prev = getprev(current)
+ local space_exception = false
+ if prev then
+ -- do not add space after left (opening) bracket and between question/exclamation marks
+ space_exception = someleftbracket(prev) or question_exclamation_sequence(prev, current)
+ -- TODO: there is a question here: do we override a preceding space or not?...
+ while somespace(prev) do
+ head = remove_node(head, prev)
+ prev = getprev(current)
+ end
+ if somepenalty(prev, 10000) then
+ head = remove_node(head, prev)
+ end
+ end
+ if leftspace.unit == "quad" then
+ unit = fontparameters.quad
+ spacing_node = get_kern_node(leftspace.kern*unit)
+ elseif leftspace.unit == "space" then
+ unit = fontparameters.space
+ if leftspace.rubber then
+ stretch = leftspace.kern*fontparameters.space_stretch
+ shrink = leftspace.kern*fontparameters.space_shrink
+ spacing_node = get_glue_node(leftspace.kern*unit, stretch, shrink)
+ head = insert_node_before(head, current, get_penalty_node())
+ else
+ spacing_node = get_kern_node(leftspace.kern*unit)
+ end
+ end
+ if not space_exception then
+ head = insert_node_before(head, current, spacing_node)
+ end
+ end
+ if rightspace and fontparameters then
+ local next = getnext(current)
+ local space_exception = false
+ if next then
+ -- do not add space before right (closing) bracket
+ space_exception = somerightbracket(next)
+ local nextnext = getnext(next)
+ if somepenalty(next, 10000) and somespace(nextnext) then
+ head, next = remove_node(head, next)
+ end
+ while somespace(next) do
+ head, next = remove_node(head, next)
+ end
+ end
+ if rightspace.unit == "quad" then
+ unit = fontparameters.quad
+ spacing_node = get_kern_node(rightspace.kern*unit)
+ elseif rightspace.unit == "space" then
+ unit = fontparameters.space
+ if rightspace.rubber then
+ stretch = rightspace.kern*fontparameters.space_stretch
+ shrink = rightspace.kern*fontparameters.space_shrink
+ spacing_node = get_glue_node(rightspace.kern*unit, stretch, shrink)
+ if not space_exception then
+ head, current = insert_node_after(head, current, get_penalty_node())
+ end
+ else
+ spacing_node = get_kern_node(rightspace.kern*unit)
+ end
+ end
+ if not space_exception then
+ head, current = insert_node_after(head, current, spacing_node)
+ end
+ end
+ end
+ end
+ elseif id == math_code then
+ -- warning: this is a feature of luatex > 0.76
+ current = end_of_math(current) -- weird, can return nil .. no math end?
+ end
+ current = getnext(current) -- no error even if current is nil
+ end
+ return head
+end
+
+local function activate(lang)
+ local id = ensure_lang_id(lang)
+ -- We set the punctuation attribute to a language id here. This is
+ -- important to be able to intermix languages with different spacings
+ -- in one paragraph.
+ tex.setattribute(punct_attr, id)
+ for _, callback_name in ipairs{ "pre_linebreak_filter", "hpack_filter" } do
+ if not priority_in_callback(callback_name, "polyglossia-punct.process") then
+ add_to_callback(callback_name, process, "polyglossia-punct.process", 1)
+ end
+ end
+end
+
+local function deactivate()
+ tex.setattribute(punct_attr, -0x7FFFFFFF) -- this value means "unset"
+ -- Though it would make compilation slightly faster, it is not possible to
+ -- safely uncomment the following lines. Imagine the following case: you
+ -- start a paragraph by some spaced punctuation text, then, in the same
+ -- paragraph, you change the language to something else, and thus call the
+ -- following lines. This means that, at the end of the paragraph, the
+ -- function won't be in the callback, so the beginning of the paragraph
+ -- won't be processed by it.
+ -- if priority_in_callback(callback_name, "polyglossia-punct.process") then
+ -- remove_from_callback(callback_name, "polyglossia-punct.process")
+ -- end
+end
+
+polyglossia.activate_punct = activate
+polyglossia.deactivate_punct = deactivate
+polyglossia.add_left_spaced_character = add_left_spaced_character
+polyglossia.add_right_spaced_character = add_right_spaced_character
+polyglossia.clear_spaced_characters = clear_spaced_characters
+% \end{macrocode}
+% \iffalse
+%</polyglossia-punct.lua>
+%<*polyglossia-sanskrit.lua>
+% \fi
+% \clearpage
+%
+% \subsection{polyglossia-sanskrit.lua}
+% \begin{macrocode}
+require('polyglossia-punct')
+
+-- How do we now, in Lua, what a \thinspace is? In the LaTeX source (latex.ltx)
+-- it is defined as:
+-- \def\thinspace{\leavevmode@ifvmode\kern .16667em }
+-- I see no way of seeing if it has been overriden or not. So we stick to this
+-- value.
+local thinspace = 0.16667 -- 1/6
+
+local function space_left(char)
+ polyglossia.add_left_spaced_character('sanskrit', char, thinspace, 'quad')
+end
+
+polyglossia.clear_spaced_characters('sanskrit')
+space_left('!')
+space_left('?')
+space_left('‼')
+space_left('⁇')
+space_left('⁈')
+space_left('⁉')
+space_left('‽') -- U+203D (interrobang)
+space_left(':')
+space_left(';')
+space_left('।') -- danda, U+0964
+space_left('॥') -- double danda, U+0965
+
+local function activate_sanskrit_punct()
+ polyglossia.activate_punct('sanskrit')
+end
+
+local function deactivate_sanskrit_punct()
+ polyglossia.deactivate_punct()
+end
+
+polyglossia.activate_sanskrit_punct = activate_sanskrit_punct
+polyglossia.deactivate_sanskrit_punct = deactivate_sanskrit_punct
+% \end{macrocode}
+% \iffalse
+%</polyglossia-sanskrit.lua>
+%<*polyglossia-tibt.lua>
+% \fi
+% \clearpage
+%
+% \subsection{polyglossia-tibt.lua}
+% \begin{macrocode}
+require('polyglossia') -- just in case...
+
+local add_to_callback = luatexbase.add_to_callback
+local remove_from_callback = luatexbase.remove_from_callback
+local priority_in_callback = luatexbase.priority_in_callback
+
+local next, type = next, type
+
+local nodes, fonts, node = nodes, fonts, node
+
+local nodecodes = nodes.nodecodes --- <= preloaded node.types()
+
+local insert_node_before = node.insert_before
+local insert_node_after = node.insert_after
+local remove_node = nodes.remove
+local copy_node = node.copy
+local has_attribute = node.has_attribute
+
+local end_of_math = node.end_of_math
+if not end_of_math then -- luatex < .76
+ local traverse_nodes = node.traverse_id
+ local math_code = nodecodes.math
+ local end_of_math = function (n)
+ for n in traverse_nodes(math_code, n.next) do
+ return n
+ end
+ end
+end
+
+-- node types as of April 2013
+local glyph_code = nodecodes.glyph
+local penalty_code = nodecodes.penalty
+local kern_code = nodecodes.kern
+
+-- we make a new node, so that we can copy it later on
+local penalty_node = node.new(penalty_code)
+penalty_node.penalty = 50 -- corresponds to the penalty LaTeX sets at explicit hyphens
+
+local function get_penalty_node()
+ return copy_node(penalty_node)
+end
+
+local xpgtibtattr = luatexbase.attributes['xpg@tibteol']
+
+local tsheg = unicode.utf8.byte('་')
+
+-- from typo-spa.lua
+local function process(head)
+ local start = head
+ -- head is always begin of par (whatsit), so we have at least two prev nodes
+ -- penalty followed by glue
+ while start do
+ local id = start.id
+ if id == glyph_code then
+ local attr = has_attribute(start, xpgtibtattr)
+ if attr and attr > 0 then
+ if start.char == tsheg then
+ if start.next then
+ insert_node_after(head,start,get_penalty_node())
+ end
+ end
+ end
+ elseif id == math_code then
+ -- warning: this is a feature of luatex > 0.76
+ start = end_of_math(start) -- weird, can return nil .. no math end?
+ end
+ if start then
+ start = start.next
+ end
+ end
+ return head
+end
+
+local callback_name = "pre_linebreak_filter"
+
+local function activate()
+ if not priority_in_callback (callback_name, "polyglossia-tibt.process") then
+ add_to_callback(callback_name, process, "polyglossia-tibt.process", 1)
+ end
+end
+
+local function desactivate()
+ if priority_in_callback (callback_name, "polyglossia-tibt.process") then
+ remove_from_callback(callback_name, "polyglossia-tibt.process")
+ end
+end
+
+polyglossia.activate_tibt_eol = activate
+polyglossia.desactivate_tibt_eol = desactivate
+% \end{macrocode}
+% \iffalse
+%</polyglossia-tibt.lua>
+%<*polyglossia.lua>
+% \fi
+% \clearpage
+%
+% \subsection{polyglossia.lua}
+% \begin{macrocode}
+
+local module_name = "polyglossia"
+local polyglossia_module = {
+ name = module_name,
+ version = 1.3,
+ date = "2013/05/11",
+ description = "Polyglossia",
+ author = "Elie Roux",
+ copyright = "Elie Roux",
+ license = "CC0"
+}
+
+luatexbase.provides_module(polyglossia_module)
+
+local log_info = function(message, ...)
+ luatexbase.module_info(module_name, message:format(...))
+end
+local log_warn = function(message, ...)
+ luatexbase.module_warning(module_name, message:format(...))
+end
+
+polyglossia = polyglossia or {}
+local polyglossia = polyglossia
+
+local function select_language(lang, id)
+ polyglossia.current_language = lang
+end
+
+local function set_default_language(lang, id)
+ polyglossia.default_language = lang
+end
+
+local byte = utf8.codepoint -- use standard module of lua 5.3
+
+local check_char
+
+if luaotfload and luaotfload.aux and luaotfload.aux.font_has_glyph then
+ local font_has_glyph = luaotfload.aux.font_has_glyph
+ function check_char(chr)
+ local codepoint = tonumber(chr) or byte(chr)
+ if font_has_glyph(font.current(), codepoint) then
+ tex.sprint('1')
+ else
+ tex.sprint('0')
+ end
+ end
+else
+ function check_char(chr) -- always in current font
+ local fontid = font.current()
+ local fontdata = font.getfont(fontid) or font.fonts[fontid]
+ local chardata = fontdata.characters
+ local codepoint = tonumber(chr) or byte(chr)
+ if chardata and chardata[codepoint] then
+ tex.sprint('1')
+ else
+ tex.sprint('0')
+ end
+ end
+end
+
+local function load_tibt_eol()
+ require('polyglossia-tibt')
+end
+
+-- predefined l@nohyphenation or LuaTeX's maximum value for \language
+local nohyphid = luatexbase.registernumber'l@nohyphenation' or 16383
+
+-- key `nohyphenation` is for .sty file when possibly undefined l@nohyphenation
+local newloader_loaded_languages = { nohyphenation = nohyphid }
+
+local newloader_available_languages = require'language.dat.lua'
+-- Suggestion by Dohyun Kim on #129
+local t = { }
+for k, v in pairs(newloader_available_languages) do
+ t[k] = v
+ for _, vv in pairs(v.synonyms) do
+ t[vv] = v
+ end
+end
+newloader_available_languages = t
+
+-- LaTeX's language register is \count19
+local lang_register = 19
+
+-- New hyphenation pattern loader: use language.dat.lua directly and the language identifiers
+local function newloader(langentry)
+ local loaded_language = newloader_loaded_languages[langentry]
+ if loaded_language then
+ local langid = lang.id(loaded_language)
+ log_info('Language %s already loaded; id is %i', langentry, langid)
+ return langid
+ else
+ local langdata = newloader_available_languages[langentry]
+ if langdata then
+
+ local special = langdata.special
+ if special then
+ -- language0 (USenglish) is already included in the format
+ if special == 'language0' then
+ return 0
+
+ -- disabled language should not be used for utf-8 text
+ elseif special:find'^disabled:' then
+ log_warn('Hyphenation of language %s %s', langentry, special)
+ return nohyphid
+ end
+ end
+
+ -- language info will be written into the .log file
+ local s = { "Language data for " .. langentry }
+ for k, v in pairs(langdata) do
+ if type(v) == 'table' then -- for 'synonyms'
+ s[#s+1] = k .. "\t" .. table.concat(v,',')
+ else
+ s[#s+1] = k .. "\t" .. tostring(v)
+ end
+ end
+ log_info(table.concat(s,"\n"))
+
+ --
+ -- LaTeX's \newlanguage increases language register (count19),
+ -- whereas LuaTeX's lang.new() increases its own language id.
+ -- So when a user has declared, say, \newlanguage\lang@xyz, then
+ -- these two numbers do not match each other. If we do not consider
+ -- this possible situation, our newloader() function will
+ -- unfortunately overwrite the language \lang@xyz.
+ --
+ -- Threfore here we will compare LaTeX's \newlanguage number with
+ -- LuaTeX's lang.new() id and select the bigger one for our new
+ -- language object. Also we will update LaTeX's language register
+ -- by this new id, so that another possible \newlanguage should not
+ -- overwrite our language object.
+ --
+ -- get next \newlanguage allocation number
+ local langcnt = tex.count[lang_register] + 1
+ -- get new lang object
+ local langobject = lang.new()
+ local langid = lang.id(langobject)
+ -- get bigger one between \newlanguage and new lang obj id
+ local newlangid = math.max(langcnt, langid)
+ -- set language register for possible \newlanguage
+ tex.setcount('global', lang_register, newlangid)
+ -- get new lang object if needeed
+ if langid ~= newlangid then
+ langobject = lang.new(newlangid)
+ end
+
+ -- load hyphenation patterns and exceptions
+ for _,v in ipairs{ 'patterns', 'hyphenation' } do
+ local data = langdata[v]
+ if data and data ~= '' then
+ -- cope with comma separated list, such as serbian
+ for _,vv in ipairs(data:explode',+') do
+ local filepath = kpse.find_file(vv)
+ if filepath then
+ local fh = io.open(filepath)
+ lang[v](langobject, fh:read'a')
+ fh:close()
+ else
+ log_warn('Hyphenation file %s not found', vv)
+ end
+ end
+ end
+ end
+
+ newloader_loaded_languages[langentry] = langobject
+
+ log_info('Language %s was not yet loaded; created with id %i',
+ langentry, newlangid)
+ return newlangid
+ else
+ log_warn('Language %s not found in language.dat.lua', langentry)
+ return nohyphid
+ end
+ end
+end
+
+polyglossia.select_language = select_language
+polyglossia.set_default_language = set_default_language
+polyglossia.check_char = check_char
+polyglossia.load_tibt_eol = load_tibt_eol
+polyglossia.newloader = newloader
+polyglossia.newloader_loaded_languages = newloader_loaded_languages
+-- global variables:
+-- polyglossia.default_language
+-- polyglossia.current_language
+% \end{macrocode}
+% \iffalse
+%</polyglossia.lua>
+%<*babel-hebrewalph.def>
+% \fi
+% \clearpage
+%
+% \subsection{babel-hebrewalph.def}
+% \begin{macrocode}
+\ProvidesFile{babel-hebrewalph.def}
+ [2010/03/02 %
+ Babel definitions for Hebrew numerals^^J
+ Adapted from hebrew.ldf (2005/03/30 v2.3h)]
+\newif\if@gim@apost % whether we print apostrophes (gereshayim)
+\newif\if@gim@final % whether we use final or initial letters
+\newcommand*\hebrewnumeral[1]{%
+ \expandafter\@hebrew@numeral\expandafter{\the\numexpr#1}%
+}
+\newcommand*\Hebrewnumeral[1]{%
+ \expandafter\@Hebrew@numeral\expandafter{\the\numexpr#1}%
+}
+\newcommand*\Hebrewnumeralfinal[1]{%
+ \expandafter\@Hebrew@numeralfinal\expandafter{\the\numexpr#1}%
+}
+\newrobustcmd*{\@hebrew@numeral}[1] % no apostrophe, no final letters
+ {{\@gim@finalfalse\@gim@apostfalse\@hebrew@@numeral{#1}}}
+\newrobustcmd*{\@Hebrew@numeral}[1] % apostrophe, no final letters
+ {{\@gim@finalfalse\@gim@aposttrue\@hebrew@@numeral{#1}}}
+\newrobustcmd*{\@Hebrew@numeralfinal}[1] % apostrophe, final letters
+ {{\@gim@finaltrue\@gim@aposttrue\@hebrew@@numeral{#1}}}
+\newcommand*{\@hebrew@@numeral}[1]{%
+ \ifnum#1<\z@\space\xpg@warning{Illegal value (#1) for Hebrew numeral}%
+ \else
+ \@tempcnta=#1\@tempcntb=#1\relax
+ \divide\@tempcntb by 1000
+ \ifnum\@tempcntb=0\gim@nomil\@tempcnta\relax
+ \else{\@gim@apostfalse\@gim@finalfalse\@hebrew@numeral\@tempcntb}׳%
+ \multiply\@tempcntb by 1000\relax
+ \advance\@tempcnta by -\@tempcntb\relax
+ \gim@nomil\@tempcnta\relax
+ \fi
+ \fi
+}
+\def\hebrew@alph@zero{}
+\newcommand*{\gim@nomil}[1]{\@tempcnta=#1\@gim@prevfalse
+ \@tempcntb=\@tempcnta\divide\@tempcntb by 100\relax % hundreds digit
+ \ifcase\@tempcntb % print nothing if no hundreds
+ \or\gim@print{100}{ק}%
+ \or\gim@print{200}{ר}%
+ \or\gim@print{300}{ש}%
+ \or\gim@print{400}{ת}%
+ \or ת\@gim@prevtrue\gim@print{500}{ק}%
+ \or ת\@gim@prevtrue\gim@print{600}{ר}%
+ \or ת\@gim@prevtrue\gim@print{700}{ש}%
+ \or ת\@gim@prevtrue\gim@print{800}{ת}%
+ \or ת\@gim@prevtrue ת\gim@print{900}{ק}%
+ \fi
+ \@tempcntb=\@tempcnta\divide\@tempcntb by 10\relax % tens digit
+ \ifcase\@tempcntb % print nothing if no tens
+ \or % number between 10 and 19
+ \ifnum\@tempcnta = 16 \gim@print {9}{ט}% tet-zayin
+ \else\ifnum\@tempcnta = 15 \gim@print {9}{ט}% tet-vav
+ \else \gim@print{10}{י}%
+ \fi % \@tempcnta = 15
+ \fi % \@tempcnta = 16
+ \or\gim@print{20}{\if@gim@final ך\else כ\fi}%
+ \or\gim@print{30}{ל}%
+ \or\gim@print{40}{\if@gim@final ם\else מ\fi}%
+ \or\gim@print{50}{\if@gim@final ן\else נ\fi}%
+ \or\gim@print{60}{ס}%
+ \or\gim@print{70}{ע}%
+ \or\gim@print{80}{\if@gim@final ף\else פ\fi}%
+ \or\gim@print{90}{\if@gim@final ץ\else צ\fi}%
+ \fi
+ \ifcase\@tempcnta
+ \hebrew@alph@zero% empty but can be defined if desired
+ \or\gim@print{1}{א}%
+ \or\gim@print{2}{ב}%
+ \or\gim@print{3}{ג}%
+ \or\gim@print{4}{ד}%
+ \or\gim@print{5}{ה}%
+ \or\gim@print{6}{ו}%
+ \or\gim@print{7}{ז}%
+ \or\gim@print{8}{ח}%
+ \or\gim@print{9}{ט}%
+ \fi
+}
+\newif\if@gim@prev % flag if a previous letter has been typeset
+\newcommand*{\gim@print}[2]{% #2 is a letter, #1 is its value.
+ \advance\@tempcnta by -#1\relax% deduct the value from the remainder
+ \ifnum\@tempcnta=0% if this is the last letter
+ \if@gim@prev\if@gim@apost ״\fi#2%
+ \else#2\if@gim@apost ׳\fi\fi%
+ \else{\@gim@finalfalse#2}\@gim@prevtrue\fi}
+\def\Alphfinal#1{\expandafter\@Alphfinal\csname c@#1\endcsname}%
+\providecommand*{\@Alphfinal}[1]{\Hebrewnumeralfinal{#1}}
+% \end{macrocode}
+% \iffalse
+%</babel-hebrewalph.def>
+%<*babelsh.def>
+% \fi
+% \clearpage
+%
+% \subsection{babelsh.def}
+% \begin{macrocode}
+\ifx\initiate@active@char\@undefined
+\else
+ \bbl@afterfi\endinput
+\fi
+\ProvidesFile{babelsh.def}
+ [2019/09/30 %
+ Babel common definitions for shorthands^^J
+ Taken verbatim from babel files (2019/09/27 v3.34)]
+%
+% ------------------------------------------------------------------------------
+%
+% lines 52 to 56 from babel.sty
+%
+% ------------------------------------------------------------------------------
+%
+\def\bbl@stripslash{\expandafter\@gobble\string}
+\def\bbl@add#1#2{%
+ \bbl@ifunset{\bbl@stripslash#1}%
+ {\def#1{#2}}%
+ {\expandafter\def\expandafter#1\expandafter{#1#2}}}
+%
+% ------------------------------------------------------------------------------
+%
+% line 73 to 74 from babel.sty
+%
+% ------------------------------------------------------------------------------
+%
+\long\def\bbl@afterelse#1\else#2\fi{\fi#1}
+\long\def\bbl@afterfi#1\fi{\fi#1}
+%
+% ------------------------------------------------------------------------------
+%
+% line 399 from babel.sty
+%
+% ------------------------------------------------------------------------------
+%
+\let\bbl@opt@shorthands\@nnil
+%
+% ------------------------------------------------------------------------------
+%
+% lines 432 to 445 from babel.sty
+%
+% ------------------------------------------------------------------------------
+%
+\ifx\bbl@opt@shorthands\@nnil
+ \def\bbl@ifshorthand#1#2#3{#2}%
+\else\ifx\bbl@opt@shorthands\@empty
+ \def\bbl@ifshorthand#1#2#3{#3}%
+\else
+ \def\bbl@ifshorthand#1{%
+ \bbl@xin@{\string#1}{\bbl@opt@shorthands}%
+ \ifin@
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+ \edef\bbl@opt@shorthands{%
+ \expandafter\bbl@sh@string\bbl@opt@shorthands\@empty}%
+%
+% ------------------------------------------------------------------------------
+%
+% line 450 from babel.sty
+%
+% ------------------------------------------------------------------------------
+%
+\fi\fi
+%
+% ------------------------------------------------------------------------------
+%
+% lines 389 to 424 from switch.def
+%
+% ------------------------------------------------------------------------------
+%
+\ifx\PackageError\@undefined
+ \def\bbl@error#1#2{%
+ \begingroup
+ \newlinechar=`\^^J
+ \def\\{^^J(babel) }%
+ \errhelp{#2}\errmessage{\\#1}%
+ \endgroup}
+ \def\bbl@warning#1{%
+ \begingroup
+ \newlinechar=`\^^J
+ \def\\{^^J(polyglossia) }%
+ \message{\\#1}%
+ \endgroup}
+ \def\bbl@info#1{%
+ \begingroup
+ \newlinechar=`\^^J
+ \def\\{^^J}%
+ \wlog{#1}%
+ \endgroup}
+\else
+ \def\bbl@error#1#2{%
+ \begingroup
+ \def\\{\MessageBreak}%
+ \PackageError{polyglossia}{#1}{#2}%
+ \endgroup}
+ \def\bbl@warning#1{%
+ \begingroup
+ \def\\{\MessageBreak}%
+ \PackageWarning{polyglossia}{#1}%
+ \endgroup}
+ \def\bbl@info#1{%
+ \begingroup
+ \def\\{\MessageBreak}%
+ \PackageInfo{polyglossia}{#1}%
+ \endgroup}
+\fi
+%
+% ------------------------------------------------------------------------------
+%
+% lines 48 to 69 from babel.def
+%
+% ------------------------------------------------------------------------------
+%
+\ifx\bbl@ifshorthand\@undefined
+ \let\bbl@opt@shorthands\@nnil
+ \def\bbl@ifshorthand#1#2#3{#2}%
+ \let\bbl@language@opts\@empty
+ \ifx\babeloptionstrings\@undefined
+ \let\bbl@opt@strings\@nnil
+ \else
+ \let\bbl@opt@strings\babeloptionstrings
+ \fi
+ \def\BabelStringsDefault{generic}
+ \def\bbl@tempa{normal}
+ \ifx\babeloptionmath\bbl@tempa
+ \def\bbl@mathnormal{\noexpand\textormath}
+ \fi
+ \def\AfterBabelLanguage#1#2{}
+ \ifx\BabelModifiers\@undefined\let\BabelModifiers\relax\fi
+ \let\bbl@afterlang\relax
+ \def\bbl@opt@safe{BR}
+ \ifx\@uclclist\@undefined\let\@uclclist\@empty\fi
+ \ifx\bbl@trace\@undefined\def\bbl@trace#1{}\fi
+ \expandafter\newif\csname ifbbl@single\endcsname
+\fi
+%
+% ------------------------------------------------------------------------------
+%
+% line 108 from babel.def
+%
+% ------------------------------------------------------------------------------
+%
+\def\bbl@csarg#1#2{\expandafter#1\csname bbl@#2\endcsname}%
+
+% ------------------------------------------------------------------------------
+%
+% lines 110 to 116 from babel.def
+%
+% ------------------------------------------------------------------------------
+%
+
+\def\bbl@loop#1#2#3{\bbl@@loop#1{#3}#2,\@nnil,}
+\def\bbl@loopx#1#2{\expandafter\bbl@loop\expandafter#1\expandafter{#2}}
+\def\bbl@@loop#1#2#3,{%
+ \ifx\@nnil#3\relax\else
+ \def#1{#3}#2\bbl@afterfi\bbl@@loop#1{#2}%
+ \fi}
+\def\bbl@for#1#2#3{\bbl@loopx#1{#2}{\ifx#1\@empty\else#3\fi}}
+
+% ------------------------------------------------------------------------------
+%
+% lines 125 to 130 from babel.def
+%
+% ------------------------------------------------------------------------------
+%
+\def\bbl@exp#1{%
+ \begingroup
+ \let\\\noexpand
+ \def\<##1>{\expandafter\noexpand\csname##1\endcsname}%
+ \edef\bbl@exp@aux{\endgroup#1}%
+ \bbl@exp@aux}
+%
+% ------------------------------------------------------------------------------
+%
+% lines 144 to 149 from babel.def
+%
+% ------------------------------------------------------------------------------
+%
+\def\bbl@ifunset#1{%
+ \expandafter\ifx\csname#1\endcsname\relax
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+%
+% ------------------------------------------------------------------------------
+%
+% lines 234 to 243 from babel.def
+%
+% ------------------------------------------------------------------------------
+%
+\chardef\bbl@engine=%
+ \ifx\directlua\@undefined
+ \ifx\XeTeXinputencoding\@undefined
+ \z@
+ \else
+ \tw@
+ \fi
+ \else
+ \@ne
+ \fi
+%
+% ------------------------------------------------------------------------------
+%
+% lines 255 to 258 from babel.def
+%
+% ------------------------------------------------------------------------------
+%
+\def\bbl@withactive#1#2{%
+ \begingroup
+ \lccode`~=`#2\relax
+ \lowercase{\endgroup#1~}}
+%
+% ------------------------------------------------------------------------------
+%
+% lines 293 to 301 from babel.def
+%
+% NOTE: In order to avoid importing more unneeded definitions, this macro
+% does nothing for us.
+%
+% ------------------------------------------------------------------------------
+%
+\def\bbl@usehooks#1#2{}
+%
+% ------------------------------------------------------------------------------
+%
+% lines 443 to 558 from babel.def
+%
+% ------------------------------------------------------------------------------
+%
+\def\bbl@add@special#1{% 1:a macro like \", \?, etc.
+ \bbl@add\dospecials{\do#1}% test @sanitize = \relax, for back. compat.
+ \bbl@ifunset{@sanitize}{}{\bbl@add\@sanitize{\@makeother#1}}%
+ \ifx\nfss@catcodes\@undefined\else % TODO - same for above
+ \begingroup
+ \catcode`#1\active
+ \nfss@catcodes
+ \ifnum\catcode`#1=\active
+ \endgroup
+ \bbl@add\nfss@catcodes{\@makeother#1}%
+ \else
+ \endgroup
+ \fi
+ \fi}
+\def\bbl@remove@special#1{%
+ \begingroup
+ \def\x##1##2{\ifnum`#1=`##2\noexpand\@empty
+ \else\noexpand##1\noexpand##2\fi}%
+ \def\do{\x\do}%
+ \def\@makeother{\x\@makeother}%
+ \edef\x{\endgroup
+ \def\noexpand\dospecials{\dospecials}%
+ \expandafter\ifx\csname @sanitize\endcsname\relax\else
+ \def\noexpand\@sanitize{\@sanitize}%
+ \fi}%
+ \x}
+\def\bbl@active@def#1#2#3#4{%
+ \@namedef{#3#1}{%
+ \expandafter\ifx\csname#2@sh@#1@\endcsname\relax
+ \bbl@afterelse\bbl@sh@select#2#1{#3@arg#1}{#4#1}%
+ \else
+ \bbl@afterfi\csname#2@sh@#1@\endcsname
+ \fi}%
+ \long\@namedef{#3@arg#1}##1{%
+ \expandafter\ifx\csname#2@sh@#1@\string##1@\endcsname\relax
+ \bbl@afterelse\csname#4#1\endcsname##1%
+ \else
+ \bbl@afterfi\csname#2@sh@#1@\string##1@\endcsname
+ \fi}}%
+\def\initiate@active@char#1{%
+ \bbl@ifunset{active@char\string#1}%
+ {\bbl@withactive
+ {\expandafter\@initiate@active@char\expandafter}#1\string#1#1}%
+ {}}
+\def\@initiate@active@char#1#2#3{%
+ \bbl@csarg\edef{oricat@#2}{\catcode`#2=\the\catcode`#2\relax}%
+ \ifx#1\@undefined
+ \bbl@csarg\edef{oridef@#2}{\let\noexpand#1\noexpand\@undefined}%
+ \else
+ \bbl@csarg\let{oridef@@#2}#1%
+ \bbl@csarg\edef{oridef@#2}{%
+ \let\noexpand#1%
+ \expandafter\noexpand\csname bbl@oridef@@#2\endcsname}%
+ \fi
+ \ifx#1#3\relax
+ \expandafter\let\csname normal@char#2\endcsname#3%
+ \else
+ \bbl@info{Making #2 an active character}%
+ \ifnum\mathcode`#2=\ifodd\bbl@engine"1000000 \else"8000 \fi
+ \@namedef{normal@char#2}{%
+ \textormath{#3}{\csname bbl@oridef@@#2\endcsname}}%
+ \else
+ \@namedef{normal@char#2}{#3}%
+ \fi
+ \bbl@restoreactive{#2}%
+ \AtBeginDocument{%
+ \catcode`#2\active
+ \if@filesw
+ \immediate\write\@mainaux{\catcode`\string#2\active}%
+ \fi}%
+ \expandafter\bbl@add@special\csname#2\endcsname
+ \catcode`#2\active
+ \fi
+ \let\bbl@tempa\@firstoftwo
+ \if\string^#2%
+ \def\bbl@tempa{\noexpand\textormath}%
+ \else
+ \ifx\bbl@mathnormal\@undefined\else
+ \let\bbl@tempa\bbl@mathnormal
+ \fi
+ \fi
+ \expandafter\edef\csname active@char#2\endcsname{%
+ \bbl@tempa
+ {\noexpand\if@safe@actives
+ \noexpand\expandafter
+ \expandafter\noexpand\csname normal@char#2\endcsname
+ \noexpand\else
+ \noexpand\expandafter
+ \expandafter\noexpand\csname bbl@doactive#2\endcsname
+ \noexpand\fi}%
+ {\expandafter\noexpand\csname normal@char#2\endcsname}}%
+ \bbl@csarg\edef{doactive#2}{%
+ \expandafter\noexpand\csname user@active#2\endcsname}%
+ \bbl@csarg\edef{active@#2}{%
+ \noexpand\active@prefix\noexpand#1%
+ \expandafter\noexpand\csname active@char#2\endcsname}%
+ \bbl@csarg\edef{normal@#2}{%
+ \noexpand\active@prefix\noexpand#1%
+ \expandafter\noexpand\csname normal@char#2\endcsname}%
+ \expandafter\let\expandafter#1\csname bbl@normal@#2\endcsname
+ \bbl@active@def#2\user@group{user@active}{language@active}%
+ \bbl@active@def#2\language@group{language@active}{system@active}%
+ \bbl@active@def#2\system@group{system@active}{normal@char}%
+ \expandafter\edef\csname\user@group @sh@#2@@\endcsname
+ {\expandafter\noexpand\csname normal@char#2\endcsname}%
+ \expandafter\edef\csname\user@group @sh@#2@\string\protect@\endcsname
+ {\expandafter\noexpand\csname user@active#2\endcsname}%
+ \if\string'#2%
+ \let\prim@s\bbl@prim@s
+ \let\active@math@prime#1%
+ \fi
+ \bbl@usehooks{initiateactive}{{#1}{#2}{#3}}}
+\@ifpackagewith{babel}{KeepShorthandsActive}%
+ {\let\bbl@restoreactive\@gobble}%
+ {\def\bbl@restoreactive#1{%
+ \bbl@exp{%
+%
+% ------------------------------------------------------------------------------
+%
+% lines 561 to 755 from babel.def
+%
+% ------------------------------------------------------------------------------
+%
+ \\\AtEndOfPackage
+ {\catcode`#1=\the\catcode`#1\relax}}}%
+ \AtEndOfPackage{\let\bbl@restoreactive\@gobble}}
+\def\bbl@sh@select#1#2{%
+ \expandafter\ifx\csname#1@sh@#2@sel\endcsname\relax
+ \bbl@afterelse\bbl@scndcs
+ \else
+ \bbl@afterfi\csname#1@sh@#2@sel\endcsname
+ \fi}
+\def\active@prefix#1{%
+ \ifx\protect\@typeset@protect
+ \else
+ \ifx\protect\@unexpandable@protect
+ \noexpand#1%
+ \else
+ \protect#1%
+ \fi
+ \expandafter\@gobble
+ \fi}
+\newif\if@safe@actives
+\@safe@activesfalse
+\def\bbl@restore@actives{\if@safe@actives\@safe@activesfalse\fi}
+\def\bbl@activate#1{%
+ \bbl@withactive{\expandafter\let\expandafter}#1%
+ \csname bbl@active@\string#1\endcsname}
+\def\bbl@deactivate#1{%
+ \bbl@withactive{\expandafter\let\expandafter}#1%
+ \csname bbl@normal@\string#1\endcsname}
+\def\bbl@firstcs#1#2{\csname#1\endcsname}
+\def\bbl@scndcs#1#2{\csname#2\endcsname}
+\def\declare@shorthand#1#2{\@decl@short{#1}#2\@nil}
+\def\@decl@short#1#2#3\@nil#4{%
+ \def\bbl@tempa{#3}%
+ \ifx\bbl@tempa\@empty
+ \expandafter\let\csname #1@sh@\string#2@sel\endcsname\bbl@scndcs
+ \bbl@ifunset{#1@sh@\string#2@}{}%
+ {\def\bbl@tempa{#4}%
+ \expandafter\ifx\csname#1@sh@\string#2@\endcsname\bbl@tempa
+ \else
+ \bbl@info
+ {Redefining #1 shorthand \string#2\\%
+ in language \CurrentOption}%
+ \fi}%
+ \@namedef{#1@sh@\string#2@}{#4}%
+ \else
+ \expandafter\let\csname #1@sh@\string#2@sel\endcsname\bbl@firstcs
+ \bbl@ifunset{#1@sh@\string#2@\string#3@}{}%
+ {\def\bbl@tempa{#4}%
+ \expandafter\ifx\csname#1@sh@\string#2@\string#3@\endcsname\bbl@tempa
+ \else
+ \bbl@info
+ {Redefining #1 shorthand \string#2\string#3\\%
+ in language \CurrentOption}%
+ \fi}%
+ \@namedef{#1@sh@\string#2@\string#3@}{#4}%
+ \fi}
+\def\textormath{%
+ \ifmmode
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi}
+\def\user@group{user}
+\def\language@group{english}
+\def\system@group{system}
+\def\useshorthands{%
+ \@ifstar\bbl@usesh@s{\bbl@usesh@x{}}}
+\def\bbl@usesh@s#1{%
+ \bbl@usesh@x
+ {\AddBabelHook{babel-sh-\string#1}{afterextras}{\bbl@activate{#1}}}%
+ {#1}}
+\def\bbl@usesh@x#1#2{%
+ \bbl@ifshorthand{#2}%
+ {\def\user@group{user}%
+ \initiate@active@char{#2}%
+ #1%
+ \bbl@activate{#2}}%
+ {\bbl@error
+ {Cannot declare a shorthand turned off (\string#2)}
+ {Sorry, but you cannot use shorthands which have been\\%
+ turned off in the package options}}}
+\def\user@language@group{user@\language@group}
+\def\bbl@set@user@generic#1#2{%
+ \bbl@ifunset{user@generic@active#1}%
+ {\bbl@active@def#1\user@language@group{user@active}{user@generic@active}%
+ \bbl@active@def#1\user@group{user@generic@active}{language@active}%
+ \expandafter\edef\csname#2@sh@#1@@\endcsname{%
+ \expandafter\noexpand\csname normal@char#1\endcsname}%
+ \expandafter\edef\csname#2@sh@#1@\string\protect@\endcsname{%
+ \expandafter\noexpand\csname user@active#1\endcsname}}%
+ \@empty}
+\newcommand\defineshorthand[3][user]{%
+ \edef\bbl@tempa{\zap@space#1 \@empty}%
+ \bbl@for\bbl@tempb\bbl@tempa{%
+ \if*\expandafter\@car\bbl@tempb\@nil
+ \edef\bbl@tempb{user@\expandafter\@gobble\bbl@tempb}%
+ \@expandtwoargs
+ \bbl@set@user@generic{\expandafter\string\@car#2\@nil}\bbl@tempb
+ \fi
+ \declare@shorthand{\bbl@tempb}{#2}{#3}}}
+\def\languageshorthands#1{\def\language@group{#1}}
+\def\aliasshorthand#1#2{%
+ \bbl@ifshorthand{#2}%
+ {\expandafter\ifx\csname active@char\string#2\endcsname\relax
+ \ifx\document\@notprerr
+ \@notshorthand{#2}%
+ \else
+ \initiate@active@char{#2}%
+ \expandafter\let\csname active@char\string#2\expandafter\endcsname
+ \csname active@char\string#1\endcsname
+ \expandafter\let\csname normal@char\string#2\expandafter\endcsname
+ \csname normal@char\string#1\endcsname
+ \bbl@activate{#2}%
+ \fi
+ \fi}%
+ {\bbl@error
+ {Cannot declare a shorthand turned off (\string#2)}
+ {Sorry, but you cannot use shorthands which have been\\%
+ turned off in the package options}}}
+\def\@notshorthand#1{%
+ \bbl@error{%
+ The character `\string #1' should be made a shorthand character;\\%
+ add the command \string\useshorthands\string{#1\string} to
+ the preamble.\\%
+ I will ignore your instruction}%
+ {You may proceed, but expect unexpected results}}
+\newcommand*\shorthandon[1]{\bbl@switch@sh\@ne#1\@nnil}
+\DeclareRobustCommand*\shorthandoff{%
+ \@ifstar{\bbl@shorthandoff\tw@}{\bbl@shorthandoff\z@}}
+\def\bbl@shorthandoff#1#2{\bbl@switch@sh#1#2\@nnil}
+\def\bbl@switch@sh#1#2{%
+ \ifx#2\@nnil\else
+ \bbl@ifunset{bbl@active@\string#2}%
+ {\bbl@error
+ {I cannot switch `\string#2' on or off--not a shorthand}%
+ {This character is not a shorthand. Maybe you made\\%
+ a typing mistake? I will ignore your instruction}}%
+ {\ifcase#1%
+ \catcode`#212\relax
+ \or
+ \catcode`#2\active
+ \or
+ \csname bbl@oricat@\string#2\endcsname
+ \csname bbl@oridef@\string#2\endcsname
+ \fi}%
+ \bbl@afterfi\bbl@switch@sh#1%
+ \fi}
+\def\babelshorthand{\active@prefix\babelshorthand\bbl@putsh}
+\def\bbl@putsh#1{%
+ \bbl@ifunset{bbl@active@\string#1}%
+ {\bbl@putsh@i#1\@empty\@nnil}%
+ {\csname bbl@active@\string#1\endcsname}}
+\def\bbl@putsh@i#1#2\@nnil{%
+ \csname\languagename @sh@\string#1@%
+ \ifx\@empty#2\else\string#2@\fi\endcsname}
+\ifx\bbl@opt@shorthands\@nnil\else
+ \let\bbl@s@initiate@active@char\initiate@active@char
+ \def\initiate@active@char#1{%
+ \bbl@ifshorthand{#1}{\bbl@s@initiate@active@char{#1}}{}}
+ \let\bbl@s@switch@sh\bbl@switch@sh
+ \def\bbl@switch@sh#1#2{%
+ \ifx#2\@nnil\else
+ \bbl@afterfi
+ \bbl@ifshorthand{#2}{\bbl@s@switch@sh#1{#2}}{\bbl@switch@sh#1}%
+ \fi}
+ \let\bbl@s@activate\bbl@activate
+ \def\bbl@activate#1{%
+ \bbl@ifshorthand{#1}{\bbl@s@activate{#1}}{}}
+ \let\bbl@s@deactivate\bbl@deactivate
+ \def\bbl@deactivate#1{%
+ \bbl@ifshorthand{#1}{\bbl@s@deactivate{#1}}{}}
+\fi
+\newcommand\ifbabelshorthand[3]{\bbl@ifunset{bbl@active@\string#1}{#3}{#2}}
+\def\bbl@prim@s{%
+ \prime\futurelet\@let@token\bbl@pr@m@s}
+\def\bbl@if@primes#1#2{%
+ \ifx#1\@let@token
+ \expandafter\@firstoftwo
+ \else\ifx#2\@let@token
+ \bbl@afterelse\expandafter\@firstoftwo
+ \else
+ \bbl@afterfi\expandafter\@secondoftwo
+ \fi\fi}
+\begingroup
+ \catcode`\^=7 \catcode`\*=\active \lccode`\*=`\^
+ \catcode`\'=12 \catcode`\"=\active \lccode`\"=`\'
+ \lowercase{%
+ \gdef\bbl@pr@m@s{%
+ \bbl@if@primes"'%
+ \pr@@@s
+ {\bbl@if@primes*^\pr@@@t\egroup}}}
+\endgroup
+\initiate@active@char{~}
+\declare@shorthand{system}{~}{\leavevmode\nobreak\ }
+\bbl@activate{~}
+%
+% ------------------------------------------------------------------------------
+%
+% lines 890 to 927 from babel.def
+%
+% ------------------------------------------------------------------------------
+%
+\def\bbl@allowhyphens{\ifvmode\else\nobreak\hskip\z@skip\fi}
+\def\bbl@t@one{T1}
+\def\allowhyphens{\ifx\cf@encoding\bbl@t@one\else\bbl@allowhyphens\fi}
+\newcommand\babelnullhyphen{\char\hyphenchar\font}
+\def\babelhyphen{\active@prefix\babelhyphen\bbl@hyphen}
+\def\bbl@hyphen{%
+ \@ifstar{\bbl@hyphen@i @}{\bbl@hyphen@i\@empty}}
+\def\bbl@hyphen@i#1#2{%
+ \bbl@ifunset{bbl@hy@#1#2\@empty}%
+ {\csname bbl@#1usehyphen\endcsname{\discretionary{#2}{}{#2}}}%
+ {\csname bbl@hy@#1#2\@empty\endcsname}}
+\def\bbl@usehyphen#1{%
+ \leavevmode
+ \ifdim\lastskip>\z@\mbox{#1}\else\nobreak#1\fi
+ \nobreak\hskip\z@skip}
+\def\bbl@@usehyphen#1{%
+ \leavevmode\ifdim\lastskip>\z@\mbox{#1}\else#1\fi}
+\def\bbl@hyphenchar{%
+ \ifnum\hyphenchar\font=\m@ne
+ \babelnullhyphen
+ \else
+ \char\hyphenchar\font
+ \fi}
+\def\bbl@hy@soft{\bbl@usehyphen{\discretionary{\bbl@hyphenchar}{}{}}}
+\def\bbl@hy@@soft{\bbl@@usehyphen{\discretionary{\bbl@hyphenchar}{}{}}}
+\def\bbl@hy@hard{\bbl@usehyphen\bbl@hyphenchar}
+\def\bbl@hy@@hard{\bbl@@usehyphen\bbl@hyphenchar}
+\def\bbl@hy@nobreak{\bbl@usehyphen{\mbox{\bbl@hyphenchar}}}
+\def\bbl@hy@@nobreak{\mbox{\bbl@hyphenchar}}
+\def\bbl@hy@repeat{%
+ \bbl@usehyphen{%
+ \discretionary{\bbl@hyphenchar}{\bbl@hyphenchar}{\bbl@hyphenchar}}}
+\def\bbl@hy@@repeat{%
+ \bbl@@usehyphen{%
+ \discretionary{\bbl@hyphenchar}{\bbl@hyphenchar}{\bbl@hyphenchar}}}
+\def\bbl@hy@empty{\hskip\z@skip}
+\def\bbl@hy@@empty{\discretionary{}{}{}}
+\def\bbl@disc#1#2{\nobreak\discretionary{#2-}{}{#1}\bbl@allowhyphens}
+%
+% ------------------------------------------------------------------------------
+%
+% end of the code copied from babel files
+%
+% ------------------------------------------------------------------------------
+%
+\def\bbl@disc@german#1#2{%
+ \nobreak\discretionary{#2-}{}{#1}}
+% \end{macrocode}
+% \iffalse
+%</babelsh.def>
+%<*cal-util.def>
+% \fi
+% \clearpage
+%
+% \subsection{cal-util.def}
+% \begin{macrocode}
+%%%%%%%%%%%%% cal-util.def %%%%%%%%%%%%%%%%
+% Macros shared by hijrical and hebrewcal %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% the following is adapted from hebcal.sty in babel
+\def\@Remainder#1#2#3{%
+ #3 = #1% % c = a
+ \divide #3 by #2% % c = a/b
+ \multiply #3 by -#2% % c = -b(a/b)
+ \advance #3 by #1}% % c = a - b(a/b)
+\newif\if@Divisible
+\def\@CheckIfDivisible#1#2{%
+ {%
+ \countdef\tmpx=0% % temporary variable
+ \@Remainder{#1}{#2}{\tmpx}%
+ \ifnum\tmpx=0%
+ \global\@Divisibletrue%
+ \else%
+ \global\@Divisiblefalse%
+ \fi}}
+\newif\if@GregorianLeap
+\def\@CheckIfGregorianLeap#1{%
+ {%
+ \@CheckIfDivisible{#1}{4}%
+ \if@Divisible%
+ \@CheckIfDivisible{#1}{100}%
+ \if@Divisible%
+ \@CheckIfDivisible{#1}{400}%
+ \if@Divisible%
+ \global\@GregorianLeaptrue%
+ \else%
+ \global\@GregorianLeapfalse%
+ \fi%
+ \else%
+ \global\@GregorianLeaptrue%
+ \fi%
+ \else%
+ \global\@GregorianLeapfalse%
+ \fi%
+ }}
+%%
+
+\newcounter{tmpA}\newcounter{tmpB}
+\newcounter{tmpC}\newcounter{tmpD}
+\newcounter{tmpE}\newcounter{tmpF}
+
+
+%% This is an algorithm from Reingold & Dershowitz,
+%% Calendrical Calculations, The Millenium Edition
+%%
+\def\@FixedFromGregorian#1#2#3#4{%
+ \setcounter{tmpA}{(#1-1)*365}%
+ \setcounter{tmpB}{(#1-1)/4}%
+ \setcounter{tmpC}{(#1-1)/100}%
+ \setcounter{tmpD}{(#1-1)/400}%
+ \setcounter{tmpE}{(367*#2-362)/12}%
+ \ifnum#2<3%
+ \setcounter{tmpF}{0}%
+ \else%
+ \@CheckIfGregorianLeap{#1}%
+ \if@GregorianLeap%
+ \setcounter{tmpF}{-1}%
+ \else%
+ \setcounter{tmpF}{-2}%
+ \fi%
+ \fi%
+ \@ifundefined{c@#4}{\global\newcounter{#4}}{}%
+ \setcounter{#4}{\value{tmpA}+\value{tmpB}-\value{tmpC}+\value{tmpD}+\value{tmpE}+\value{tmpF}+#3}%
+}
+% \end{macrocode}
+% \iffalse
+%</cal-util.def>
+%<*xgreek-fixes.def>
+% \fi
+% \clearpage
+%
+% \subsection{xgreek-fixes.def}
+% \begin{macrocode}
+% the following fixes are taken verbatim from xgreek.sty:
+% \message{Package `xgreek' version 3.0.1 by Apostolos Syropoulos}
+\global\lccode"0370="0371 \global\uccode"0370="0370
+\global\lccode"0371="0371 \global\uccode"0371="0370
+\global\lccode"0372="0373 \global\uccode"0372="0372
+\global\lccode"0373="0373 \global\uccode"0373="0372
+\global\lccode"0376="0377 \global\uccode"0376="0376
+\global\lccode"0377="0377 \global\uccode"0377="0376
+\global\lccode"03FD="037B \global\uccode"03FD="03FD
+\global\lccode"037B="037B \global\uccode"037B="03FD
+\global\lccode"03FE="037C \global\uccode"03FE="03FE
+\global\lccode"037C="037C \global\uccode"037C="03FE
+\global\lccode"03FF="037D \global\uccode"03FF="03FF
+\global\lccode"037D="037D \global\uccode"037D="03FF
+\global\lccode"0386="03AC \global\uccode"0386="0391
+\global\lccode"0388="03AD \global\uccode"0388="0395
+\global\lccode"0389="03AC \global\uccode"0389="0397
+\global\lccode"038A="03AF \global\uccode"038A="0399
+\global\lccode"038C="03CC \global\uccode"038C="039F
+\global\lccode"038E="03CD \global\uccode"038E="03A5
+\global\lccode"038F="03CE \global\uccode"038F="03A9
+\global\lccode"0390="0390 \global\uccode"0390="03AA
+\global\lccode"0391="03B1 \global\uccode"0391="0391
+\global\lccode"0392="03B2 \global\uccode"0392="0392
+\global\lccode"0393="03B3 \global\uccode"0393="0393
+\global\lccode"0394="03B4 \global\uccode"0394="0394
+\global\lccode"0395="03B5 \global\uccode"0395="0395
+\global\lccode"0396="03B6 \global\uccode"0396="0396
+\global\lccode"0397="03B7 \global\uccode"0397="0397
+\global\lccode"0398="03B8 \global\uccode"0398="0398
+\global\lccode"0399="03B9 \global\uccode"0399="0399
+\global\lccode"039A="03BA \global\uccode"039A="039A
+\global\lccode"039B="03BB \global\uccode"039B="039B
+\global\lccode"039C="03BC \global\uccode"039C="039C
+\global\lccode"039D="03BD \global\uccode"039D="039D
+\global\lccode"039E="03BE \global\uccode"039E="039E
+\global\lccode"039F="03BF \global\uccode"039F="039F
+\global\lccode"03A0="03C0 \global\uccode"03A0="03A0
+\global\lccode"03A1="03C1 \global\uccode"03A1="03A1
+\global\lccode"03A3="03C3 \global\uccode"03A3="03A3
+\global\lccode"03A4="03C4 \global\uccode"03A4="03A4
+\global\lccode"03A5="03C5 \global\uccode"03A5="03A5
+\global\lccode"03A6="03C6 \global\uccode"03A6="03A6
+\global\lccode"03A7="03C7 \global\uccode"03A7="03A7
+\global\lccode"03A8="03C8 \global\uccode"03A8="03A8
+\global\lccode"03A9="03C9 \global\uccode"03A9="03A9
+\global\lccode"03AA="03CA \global\uccode"03AA="03AA
+\global\lccode"03AB="03CB \global\uccode"03AB="03AB
+\global\lccode"03AC="03AC \global\uccode"03AC="0391
+\global\lccode"03AD="03AD \global\uccode"03AD="0395
+\global\lccode"03AE="03AE \global\uccode"03AE="0397
+\global\lccode"03AF="03AF \global\uccode"03AF="0399
+\global\lccode"03B0="03B0 \global\uccode"03B0="03AB
+\global\lccode"03B1="03B1 \global\uccode"03B1="0391
+\global\lccode"03B2="03B2 \global\uccode"03B2="0392
+\global\lccode"03B3="03B3 \global\uccode"03B3="0393
+\global\lccode"03B4="03B4 \global\uccode"03B4="0394
+\global\lccode"03B5="03B5 \global\uccode"03B5="0395
+\global\lccode"03B6="03B6 \global\uccode"03B6="0396
+\global\lccode"03B7="03B7 \global\uccode"03B7="0397
+\global\lccode"03B8="03B8 \global\uccode"03B8="0398
+\global\lccode"03B9="03B9 \global\uccode"03B9="0399
+\global\lccode"03BA="03BA \global\uccode"03BA="039A
+\global\lccode"03BB="03BB \global\uccode"03BB="039B
+\global\lccode"03BC="03BC \global\uccode"03BC="039C
+\global\lccode"03BD="03BD \global\uccode"03BD="039D
+\global\lccode"03BE="03BE \global\uccode"03BE="039E
+\global\lccode"03BF="03BF \global\uccode"03BF="039F
+\global\lccode"03C0="03C0 \global\uccode"03C0="03A0
+\global\lccode"03C1="03C1 \global\uccode"03C1="03A1
+\global\lccode"03C2="03C2 \global\uccode"03C2="03A3
+\global\lccode"03C3="03C3 \global\uccode"03C3="03A3
+\global\lccode"03C4="03C4 \global\uccode"03C4="03A4
+\global\lccode"03C5="03C5 \global\uccode"03C5="03A5
+\global\lccode"03C6="03C6 \global\uccode"03C6="03A6
+\global\lccode"03C7="03C7 \global\uccode"03C7="03A7
+\global\lccode"03C8="03C8 \global\uccode"03C8="03A8
+\global\lccode"03C9="03C9 \global\uccode"03C9="03A9
+\global\lccode"03CA="03CA \global\uccode"03CA="03AA
+\global\lccode"03CB="03CB \global\uccode"03CB="03AB
+\global\lccode"03CC="03CC \global\uccode"03CC="039F
+\global\lccode"03CD="03CD \global\uccode"03CD="03A5
+\global\lccode"03CE="03CE \global\uccode"03CE="03A9
+\global\lccode"03D0="03D0 \global\uccode"03D0="0392
+\global\lccode"03D1="03D1 \global\uccode"03D1="0398
+\global\lccode"03D2="03C5 \global\uccode"03D2="03A5
+\global\lccode"03D3="03CD \global\uccode"03D3="03A5
+\global\lccode"03D4="03CB \global\uccode"03D4="03AB
+\global\lccode"03D5="03C6 \global\uccode"03D5="03A6
+\global\lccode"03D6="03C0 \global\uccode"03D6="03A0
+\global\lccode"03DA="03DB \global\uccode"03DA="03DA
+\global\lccode"03DB="03DB \global\uccode"03DB="03DA
+\global\lccode"03DC="03DD \global\uccode"03DC="03DC
+\global\lccode"03DD="03DD \global\uccode"03DD="03DC
+\global\lccode"03DE="03DF \global\uccode"03DE="03DE
+\global\lccode"03DF="03DF \global\uccode"03DF="03DE
+\global\lccode"03E0="03E1 \global\uccode"03E0="03E0
+\global\lccode"03E1="03E1 \global\uccode"03E1="03E0
+\global\lccode"03F0="03BA \global\uccode"03F0="039A
+\global\lccode"03F1="03C1 \global\uccode"03F1="03A1
+\global\lccode"03F2="03F2 \global\uccode"03F2="03F9
+\global\lccode"03F9="03F2 \global\uccode"03F9="03F9
+\global\lccode"1F00="1F00 \global\uccode"1F00="0391
+\global\lccode"1F01="1F01 \global\uccode"1F01="0391
+\global\lccode"1F02="1F02 \global\uccode"1F02="0391
+\global\lccode"1F03="1F03 \global\uccode"1F03="0391
+\global\lccode"1F04="1F04 \global\uccode"1F04="0391
+\global\lccode"1F05="1F05 \global\uccode"1F05="0391
+\global\lccode"1F06="1F06 \global\uccode"1F06="0391
+\global\lccode"1F07="1F07 \global\uccode"1F07="0391
+\global\lccode"1F08="1F00 \global\uccode"1F08="0391
+\global\lccode"1F09="1F01 \global\uccode"1F09="0391
+\global\lccode"1F0A="1F02 \global\uccode"1F0A="0391
+\global\lccode"1F0B="1F03 \global\uccode"1F0B="0391
+\global\lccode"1F0C="1F04 \global\uccode"1F0C="0391
+\global\lccode"1F0D="1F05 \global\uccode"1F0D="0391
+\global\lccode"1F0E="1F06 \global\uccode"1F0E="0391
+\global\lccode"1F0F="1F07 \global\uccode"1F0F="0391
+\global\lccode"1F10="1F10 \global\uccode"1F10="0395
+\global\lccode"1F11="1F11 \global\uccode"1F11="0395
+\global\lccode"1F12="1F12 \global\uccode"1F12="0395
+\global\lccode"1F13="1F13 \global\uccode"1F13="0395
+\global\lccode"1F14="1F14 \global\uccode"1F14="0395
+\global\lccode"1F15="1F15 \global\uccode"1F15="0395
+\global\lccode"1F18="1F10 \global\uccode"1F18="0395
+\global\lccode"1F19="1F11 \global\uccode"1F19="0395
+\global\lccode"1F1A="1F12 \global\uccode"1F1A="0395
+\global\lccode"1F1B="1F13 \global\uccode"1F1B="0395
+\global\lccode"1F1C="1F14 \global\uccode"1F1C="0395
+\global\lccode"1F1D="1F15 \global\uccode"1F1D="0395
+\global\lccode"1F20="1F20 \global\uccode"1F20="0397
+\global\lccode"1F21="1F21 \global\uccode"1F21="0397
+\global\lccode"1F22="1F22 \global\uccode"1F22="0397
+\global\lccode"1F23="1F23 \global\uccode"1F23="0397
+\global\lccode"1F24="1F24 \global\uccode"1F24="0397
+\global\lccode"1F25="1F25 \global\uccode"1F25="0397
+\global\lccode"1F26="1F26 \global\uccode"1F26="0397
+\global\lccode"1F27="1F27 \global\uccode"1F27="0397
+\global\lccode"1F28="1F20 \global\uccode"1F28="0397
+\global\lccode"1F29="1F21 \global\uccode"1F29="0397
+\global\lccode"1F2A="1F22 \global\uccode"1F2A="0397
+\global\lccode"1F2B="1F23 \global\uccode"1F2B="0397
+\global\lccode"1F2C="1F24 \global\uccode"1F2C="0397
+\global\lccode"1F2D="1F25 \global\uccode"1F2D="0397
+\global\lccode"1F2E="1F26 \global\uccode"1F2E="0397
+\global\lccode"1F2F="1F27 \global\uccode"1F2F="0397
+\global\lccode"1F30="1F30 \global\uccode"1F30="0399
+\global\lccode"1F31="1F31 \global\uccode"1F31="0399
+\global\lccode"1F32="1F32 \global\uccode"1F32="0399
+\global\lccode"1F33="1F33 \global\uccode"1F33="0399
+\global\lccode"1F34="1F34 \global\uccode"1F34="0399
+\global\lccode"1F35="1F35 \global\uccode"1F35="0399
+\global\lccode"1F36="1F36 \global\uccode"1F36="0399
+\global\lccode"1F37="1F37 \global\uccode"1F37="0399
+\global\lccode"1F38="1F30 \global\uccode"1F38="0399
+\global\lccode"1F39="1F31 \global\uccode"1F39="0399
+\global\lccode"1F3A="1F32 \global\uccode"1F3A="0399
+\global\lccode"1F3B="1F33 \global\uccode"1F3B="0399
+\global\lccode"1F3C="1F34 \global\uccode"1F3C="0399
+\global\lccode"1F3D="1F35 \global\uccode"1F3D="0399
+\global\lccode"1F3E="1F36 \global\uccode"1F3E="0399
+\global\lccode"1F3F="1F37 \global\uccode"1F3F="0399
+\global\lccode"1F40="1F40 \global\uccode"1F40="039F
+\global\lccode"1F41="1F41 \global\uccode"1F41="039F
+\global\lccode"1F42="1F42 \global\uccode"1F42="039F
+\global\lccode"1F43="1F43 \global\uccode"1F43="039F
+\global\lccode"1F44="1F44 \global\uccode"1F44="039F
+\global\lccode"1F45="1F45 \global\uccode"1F45="039F
+\global\lccode"1F48="1F40 \global\uccode"1F48="039F
+\global\lccode"1F49="1F41 \global\uccode"1F49="039F
+\global\lccode"1F4A="1F42 \global\uccode"1F4A="039F
+\global\lccode"1F4B="1F43 \global\uccode"1F4B="039F
+\global\lccode"1F4C="1F44 \global\uccode"1F4C="039F
+\global\lccode"1F4D="1F45 \global\uccode"1F4D="039F
+\global\lccode"1F50="1F50 \global\uccode"1F50="03A5
+\global\lccode"1F51="1F51 \global\uccode"1F51="03A5
+\global\lccode"1F52="1F52 \global\uccode"1F52="03A5
+\global\lccode"1F53="1F53 \global\uccode"1F53="03A5
+\global\lccode"1F54="1F54 \global\uccode"1F54="03A5
+\global\lccode"1F55="1F55 \global\uccode"1F55="03A5
+\global\lccode"1F56="1F56 \global\uccode"1F56="03A5
+\global\lccode"1F57="1F57 \global\uccode"1F57="03A5
+\global\lccode"1F59="1F51 \global\uccode"1F59="03A5
+\global\lccode"1F5B="1F53 \global\uccode"1F5B="03A5
+\global\lccode"1F5D="1F55 \global\uccode"1F5D="03A5
+\global\lccode"1F5F="1F57 \global\uccode"1F5F="03A5
+\global\lccode"1F60="1F60 \global\uccode"1F60="03A9
+\global\lccode"1F61="1F61 \global\uccode"1F61="03A9
+\global\lccode"1F62="1F62 \global\uccode"1F62="03A9
+\global\lccode"1F63="1F63 \global\uccode"1F63="03A9
+\global\lccode"1F64="1F64 \global\uccode"1F64="03A9
+\global\lccode"1F65="1F65 \global\uccode"1F65="03A9
+\global\lccode"1F66="1F66 \global\uccode"1F66="03A9
+\global\lccode"1F67="1F67 \global\uccode"1F67="03A9
+\global\lccode"1F68="1F60 \global\uccode"1F68="03A9
+\global\lccode"1F69="1F61 \global\uccode"1F69="03A9
+\global\lccode"1F6A="1F62 \global\uccode"1F6A="03A9
+\global\lccode"1F6B="1F63 \global\uccode"1F6B="03A9
+\global\lccode"1F6C="1F64 \global\uccode"1F6C="03A9
+\global\lccode"1F6D="1F65 \global\uccode"1F6D="03A9
+\global\lccode"1F6E="1F66 \global\uccode"1F6E="03A9
+\global\lccode"1F6F="1F67 \global\uccode"1F6F="03A9
+\global\lccode"1F70="1F70 \global\uccode"1F70="0391
+\global\lccode"1F71="1F71 \global\uccode"1F71="0391
+\global\lccode"1F72="1F72 \global\uccode"1F72="0395
+\global\lccode"1F73="1F73 \global\uccode"1F73="0395
+\global\lccode"1F74="1F74 \global\uccode"1F74="0397
+\global\lccode"1F75="1F75 \global\uccode"1F75="0397
+\global\lccode"1F76="1F76 \global\uccode"1F76="0399
+\global\lccode"1F77="1F77 \global\uccode"1F77="0399
+\global\lccode"1F78="1F78 \global\uccode"1F78="039F
+\global\lccode"1F79="1F79 \global\uccode"1F79="039F
+\global\lccode"1F7A="1F7A \global\uccode"1F7A="03A5
+\global\lccode"1F7B="1F7B \global\uccode"1F7B="03A5
+\global\lccode"1F7C="1F7C \global\uccode"1F7C="03A9
+\global\lccode"1F7D="1F7D \global\uccode"1F7D="03A9
+\global\lccode"1F80="1F80 \global\uccode"1F80="1FBC
+\global\lccode"1F81="1F81 \global\uccode"1F81="1FBC
+\global\lccode"1F82="1F82 \global\uccode"1F82="1FBC
+\global\lccode"1F83="1F83 \global\uccode"1F83="1FBC
+\global\lccode"1F84="1F84 \global\uccode"1F84="1FBC
+\global\lccode"1F85="1F85 \global\uccode"1F85="1FBC
+\global\lccode"1F86="1F86 \global\uccode"1F86="1FBC
+\global\lccode"1F87="1F87 \global\uccode"1F87="1FBC
+\global\lccode"1F88="1F80 \global\uccode"1F88="1FBC
+\global\lccode"1F89="1F81 \global\uccode"1F89="1FBC
+\global\lccode"1F8A="1F82 \global\uccode"1F8A="1FBC
+\global\lccode"1F8B="1F83 \global\uccode"1F8B="1FBC
+\global\lccode"1F8C="1F84 \global\uccode"1F8C="1FBC
+\global\lccode"1F8D="1F85 \global\uccode"1F8D="1FBC
+\global\lccode"1F8E="1F86 \global\uccode"1F8E="1FBC
+\global\lccode"1F8F="1F87 \global\uccode"1F8F="1FBC
+\global\lccode"1F90="1F90 \global\uccode"1F90="1FCC
+\global\lccode"1F91="1F91 \global\uccode"1F91="1FCC
+\global\lccode"1F92="1F92 \global\uccode"1F92="1FCC
+\global\lccode"1F93="1F93 \global\uccode"1F93="1FCC
+\global\lccode"1F94="1F94 \global\uccode"1F94="1FCC
+\global\lccode"1F95="1F95 \global\uccode"1F95="1FCC
+\global\lccode"1F96="1F96 \global\uccode"1F96="1FCC
+\global\lccode"1F97="1F97 \global\uccode"1F97="1FCC
+\global\lccode"1F98="1F90 \global\uccode"1F98="1FCC
+\global\lccode"1F99="1F91 \global\uccode"1F99="1FCC
+\global\lccode"1F9A="1F92 \global\uccode"1F9A="1FCC
+\global\lccode"1F9B="1F93 \global\uccode"1F9B="1FCC
+\global\lccode"1F9C="1F94 \global\uccode"1F9C="1FCC
+\global\lccode"1F9D="1F95 \global\uccode"1F9D="1FCC
+\global\lccode"1F9E="1F96 \global\uccode"1F9E="1FCC
+\global\lccode"1F9F="1F97 \global\uccode"1F9F="1FCC
+\global\lccode"1FA0="1FA0 \global\uccode"1FA0="1FFC
+\global\lccode"1FA1="1FA1 \global\uccode"1FA1="1FFC
+\global\lccode"1FA2="1FA2 \global\uccode"1FA2="1FFC
+\global\lccode"1FA3="1FA3 \global\uccode"1FA3="1FFC
+\global\lccode"1FA4="1FA4 \global\uccode"1FA4="1FFC
+\global\lccode"1FA5="1FA5 \global\uccode"1FA5="1FFC
+\global\lccode"1FA6="1FA6 \global\uccode"1FA6="1FFC
+\global\lccode"1FA7="1FA7 \global\uccode"1FA7="1FFC
+\global\lccode"1FA8="1FA0 \global\uccode"1FA8="1FFC
+\global\lccode"1FA9="1FA1 \global\uccode"1FA9="1FFC
+\global\lccode"1FAA="1FA2 \global\uccode"1FAA="1FFC
+\global\lccode"1FAB="1FA3 \global\uccode"1FAB="1FFC
+\global\lccode"1FAC="1FA4 \global\uccode"1FAC="1FFC
+\global\lccode"1FAD="1FA5 \global\uccode"1FAD="1FFC
+\global\lccode"1FAE="1FA6 \global\uccode"1FAE="1FFC
+\global\lccode"1FAF="1FA7 \global\uccode"1FAF="1FFC
+\global\lccode"1FB0="1FB0 \global\uccode"1FB0="1FB8
+\global\lccode"1FB1="1FB1 \global\uccode"1FB1="1FB9
+\global\lccode"1FB2="1FB2 \global\uccode"1FB2="1FBC
+\global\lccode"1FB3="1FB3 \global\uccode"1FB3="1FBC
+\global\lccode"1FB4="1FB4 \global\uccode"1FB4="1FBC
+\global\lccode"1FB6="1FB6 \global\uccode"1FB6="0391
+\global\lccode"1FB7="1FB7 \global\uccode"1FB7="1FBC
+\global\lccode"1FB8="1FB0 \global\uccode"1FB8="1FB8
+\global\lccode"1FB9="1FB1 \global\uccode"1FB9="1FB9
+\global\lccode"1FBA="1F70 \global\uccode"1FBA="0391
+\global\lccode"1FBB="1F71 \global\uccode"1FBB="0391
+\global\lccode"1FBC="1FB3 \global\uccode"1FBC="1FBC
+\global\lccode"1FBD="1FBD \global\uccode"1FBD="1FBD
+\global\lccode"1FC2="1FC2 \global\uccode"1FC2="1FCC
+\global\lccode"1FC3="1FC3 \global\uccode"1FC3="1FCC
+\global\lccode"1FC4="1FC4 \global\uccode"1FC4="1FCC
+\global\lccode"1FC6="1FC6 \global\uccode"1FC6="0397
+\global\lccode"1FC7="1FC7 \global\uccode"1FC7="1FCC
+\global\lccode"1FC8="1F72 \global\uccode"1FC8="0395
+\global\lccode"1FC9="1F73 \global\uccode"1FC9="0395
+\global\lccode"1FCA="1F74 \global\uccode"1FCA="0397
+\global\lccode"1FCB="1F75 \global\uccode"1FCB="0397
+\global\lccode"1FCC="1FC3 \global\uccode"1FCC="1FCC
+\global\lccode"1FD0="1FD0 \global\uccode"1FD0="1FD8
+\global\lccode"1FD1="1FD1 \global\uccode"1FD1="1FD9
+\global\lccode"1FD2="1FD2 \global\uccode"1FD2="03AA
+\global\lccode"1FD3="1FD3 \global\uccode"1FD3="03AA
+\global\lccode"1FD6="1FD6 \global\uccode"1FD6="0399
+\global\lccode"1FD7="1FD7 \global\uccode"1FD7="03AA
+\global\lccode"1FD8="1FD0 \global\uccode"1FD8="1FD8
+\global\lccode"1FD9="1FD1 \global\uccode"1FD9="1FD9
+\global\lccode"1FDA="1F76 \global\uccode"1FDA="0399
+\global\lccode"1FDB="1F77 \global\uccode"1FDB="0399
+\global\lccode"1FE0="1FE0 \global\uccode"1FE0="1FE8
+\global\lccode"1FE1="1FE1 \global\uccode"1FE1="1FE9
+\global\lccode"1FE2="1FE2 \global\uccode"1FE2="03AB
+\global\lccode"1FE3="1FE3 \global\uccode"1FE3="03AB
+\global\lccode"1FE4="1FE4 \global\uccode"1FE4="03A1
+\global\lccode"1FE5="1FE5 \global\uccode"1FE5="03A1
+\global\lccode"1FE6="1FE6 \global\uccode"1FE6="03A5
+\global\lccode"1FE7="1FE7 \global\uccode"1FE7="03AB
+\global\lccode"1FE8="1FE0 \global\uccode"1FE8="1FE8
+\global\lccode"1FE9="1FE1 \global\uccode"1FE9="1FE9
+\global\lccode"1FEA="1F7A \global\uccode"1FEA="03A5
+\global\lccode"1FEB="1F7B \global\uccode"1FEB="03A5
+\global\lccode"1FEC="1FE5 \global\uccode"1FEC="1FEC
+\global\lccode"1FF2="1FF2 \global\uccode"1FF2="1FFC
+\global\lccode"1FF3="1FF3 \global\uccode"1FF3="1FFC
+\global\lccode"1FF4="1FF4 \global\uccode"1FF4="1FFC
+\global\lccode"1FF6="1FF6 \global\uccode"1FF6="03A9
+\global\lccode"1FF7="1FF7 \global\uccode"1FF7="1FFC
+\global\lccode"1FF8="1F78 \global\uccode"1FF8="039F
+\global\lccode"1FF9="1F79 \global\uccode"1FF9="039F
+\global\lccode"1FFA="1F7C \global\uccode"1FFA="03A9
+\global\lccode"1FFB="1F7D \global\uccode"1FFB="03A9
+\global\lccode"1FFC="1FF3 \global\uccode"1FFC="1FFC
+% \end{macrocode}
+% \iffalse
+%</xgreek-fixes.def>
%<*gloss-acadien.ldf>
% \fi
% \clearpage
@@ -2691,7 +8396,7 @@ to track the issues and follow progress.
}
\def\noextras@afrikaans{%
- \noafrikaans@shorthands%
+ \ifafrikaans@babelshorthands\noafrikaans@shorthands\fi%
}
\def\blockextras@afrikaans{%
@@ -2732,7 +8437,7 @@ to track the issues and follow progress.
\def\prefacename{Parathenia}%
\def\chaptername{Kapitulli}%
\def\appendixname{Shtesa}%
- \def\contentsname{Përmbajta}%
+ \def\contentsname{Përmbajtja}%
\def\listfigurename{Figurat}%
\def\listtablename{Tabelat}%
\def\indexname{Indeksi}%
@@ -3146,12 +8851,6 @@ to track the issues and follow progress.
% \subsection{gloss-arabic.ldf}
% \begin{macrocode}
\ProvidesFile{gloss-arabic.ldf}[polyglossia: module for arabic]
-\ifluatex
- \xpg@warning{Arabic is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
\RequireBidi
\RequirePackage{arabicnumbers}
\RequirePackage{hijrical}
@@ -3186,6 +8885,8 @@ and may look very wrong.}
\setlanguagealias*[locale=default]{arabic}{apd}
\setlanguagealias*[locale=mashriq]{arabic}{ar-PS}
+\define@boolkey{arabic}[arabic@]{abjadalph}[true]{}
+
\newif\ifeastern@numerals
\def\tmp@mashriq{mashriq}
\def\tmp@maghrib{maghrib}
@@ -3320,6 +9021,19 @@ and may look very wrong.}
\def\@ornatebracearabic#1{\RL{\char"FD3F\@arabic#1\char"FD3E}}
\def\@ornatebracealph#1{\RL{\char"FD3F\@alph#1\char"FD3E}}
+\def\abjadalph#1{\expandafter\arabic@abjad@alph{\number#1}}
+
+% This is a poor man's Arabic alphanumeric. It just uses the alphabet and
+% thus ends at 28.
+\def\arabic@abjad@alph#1{\ifcase#1%
+ \or ا\or ب\or\abjad@three\or د\or و\or ه‍\or ز%
+ \or ح\or ط\or ي\or ك\or ل\or م\or ن%
+ \or س\or ع\or ف\or ص\or ق\or ر\or ش%
+ \or ت\or ث\or خ\or ذ\or ض\or ظ\or غ%
+ \else\xpg@ill@value{#1}{arabic@abjad@alph}\fi%
+}
+
+
\def\abjadmaghribi#1{%
\ifnum#1>1999\xpg@ill@value{#1}{abjad}%
\else
@@ -3354,8 +9068,13 @@ and may look very wrong.}
\ifnum#1=\z@\fi\abj@maghribi@num@iii}
\def\arabic@numbers{%
+ \ifarabic@abjadalph
+ \let\@alph\abjadalph%
+ \let\@Alph\abjadalph%
+ \else
\let\@alph\abjad%
\let\@Alph\abjad%
+ \fi
}
\def\noarabic@numbers{%
@@ -3988,7 +9707,7 @@ and may look very wrong.}
\def\@Ccdash{\leavevmode
\nobreak\cyrdash\nobreak\hskip.35em\ignorespaces}%
\ifx\cyrdash\undefined
- \def\cyrdash{\hbox to.8em{--\hss--}}%
+ \def\cyrdash{\hbox to.8em{\textendash\hss\textendash}}%
\fi
\declare@shorthand{belarusian}{",}{\nobreak\hskip.2em\ignorespaces}%
}
@@ -4173,7 +9892,7 @@ and may look very wrong.}
\def\noextras@belarusian{%
\ifcyrillic@numerals\nobelarusian@numbers\fi%
- \nobelarusian@shorthands%
+ \ifbelarusian@babelshorthands\nobelarusian@shorthands\fi%
}
\def\blockextras@belarusian{%
@@ -4199,13 +9918,6 @@ and may look very wrong.}
\ProvidesFile{gloss-bengali.ldf}[polyglossia: module for bengali]
-\ifluatex
- \xpg@warning{Bengali is not supported with LuaTeX.\MessageBreak
- I will proceed with the compilation, but\MessageBreak
- the output is not guaranteed to be correct\MessageBreak
- and may look very wrong.}
-\fi
-
\RequirePackage{devanagaridigits}
\RequirePackage{bengalidigits}
@@ -4790,18 +10502,23 @@ and may look very wrong.}
\csname normal@char\string"\endcsname l%
\else
\leftllkern=0pt\rightllkern=0pt\raiselldim=0pt%
- \setbox0\hbox{l}\setbox1\hbox{l\/}%
+ \setbox0\hbox{l}%
\xpg@if@char@available{00B7}%
- {\setbox2\hbox{\char"00B7}}%
- {\setbox2\hbox{.}}%
- \advance\raiselldim by \the\fontdimen5\the\font
+ {\setbox2\hbox{\char"00B7}\setbox1\hbox{l}}%
+ {\setbox2\hbox{.}\setbox1\hbox{l\/}}%
+ \setbox3\hbox{.}%
+ \advance\raiselldim by \the\fontdimen5\the\font%
\advance\raiselldim by -\ht2%
\leftllkern=-.25\wd0%
\advance\leftllkern by \wd1%
\advance\leftllkern by -\wd0%
+ \advance\leftllkern by -0.5\wd2%
+ \advance\leftllkern by 0.5\wd3%
\rightllkern=-.25\wd0%
\advance\rightllkern by -\wd1%
\advance\rightllkern by \wd0%
+ \advance\rightllkern by -0.5\wd2%
+ \advance\rightllkern by 0.5\wd3%
\allowhyphens\discretionary{l-}{l}%
{\hbox{l}\kern\leftllkern\xpg@raiseddot%
\kern\rightllkern\hbox{l}}\allowhyphens
@@ -4813,19 +10530,24 @@ and may look very wrong.}
\csname normal@char\string"\endcsname L%
\else
\leftllkern=0pt\rightllkern=0pt\raiselldim=0pt%
- \setbox0\hbox{L}\setbox1\hbox{L\/}%
+ \setbox0\hbox{L}%
\xpg@if@char@available{00B7}%
- {\setbox2\hbox{\char"00B7}}%
- {\setbox2\hbox{.}}%
+ {\setbox2\hbox{\char"00B7}\setbox1\hbox{L}}%
+ {\setbox2\hbox{.}\setbox1\hbox{L\/}}%
+ \setbox3\hbox{.}%
\advance\raiselldim by .5\ht0%
\advance\raiselldim by -.5\ht2%
\leftllkern=-.125\wd0%
\advance\leftllkern by \wd1%
\advance\leftllkern by -\wd0%
+ \advance\leftllkern by -0.5\wd2%
+ \advance\leftllkern by 0.5\wd3%
\rightllkern=-\wd0%
\divide\rightllkern by 6%
\advance\rightllkern by -\wd1%
\advance\rightllkern by \wd0%
+ \advance\rightllkern by -0.5\wd2%
+ \advance\rightllkern by 0.5\wd3%
\allowhyphens\discretionary{L-}{L}%
{\hbox{L}\kern\leftllkern\xpg@raiseddot%
\kern\rightllkern\hbox{L}}\allowhyphens
@@ -4883,7 +10605,7 @@ and may look very wrong.}
\space de~\number\year}}
\def\noextras@catalan{%
- \nocatalan@shorthands%
+ \ifcatalan@babelshorthands\nocatalan@shorthands\fi%
}
\def\blockextras@catalan{%
@@ -5027,12 +10749,18 @@ and may look very wrong.}
% BCP-47 compliant aliases
\setlanguagealias*{croatian}{hr}
+\ifluatex
+ \RequirePackage{luavlna}
+\fi
+
\define@boolkey{croatian}[croatian@]{babelshorthands}[true]{}
\define@boolkey{croatian}[croatian@]{disableligatures}[true]{}
+\define@boolkey{croatian}[croatian@]{splithyphens}[true]{}
+
% Register default options
-\xpg@initialize@gloss@options{croatian}{babelshorthands=false,disableligatures=false}
+\xpg@initialize@gloss@options{croatian}{babelshorthands=false,disableligatures=false,splithyphens=true}
\ifsystem@babelshorthands
\setkeys{croatian}{babelshorthands=true}
@@ -5046,6 +10774,19 @@ and may look very wrong.}
\shorthandoff{"}%
}{}
+\def\croatian@@splhyphen#1{%
+ \ifnum\hyphenchar \font>0%
+ \kern\z@\discretionary{-}{\char\hyphenchar\the\font}{#1}%
+ \nobreak\hskip\z@%
+ \else%
+ #1%
+ \fi%
+}
+
+\def\croatian@splhyphen{%
+ \croatian@@splhyphen{-}%
+}
+
\def\croatian@shorthands{%
\bbl@activate{"}%
\def\language@group{croatian}%
@@ -5075,6 +10816,32 @@ and may look very wrong.}
\@ifundefined{initiate@active@char}{}{\bbl@deactivate{"}}%
}
+\ifxetex
+ % splithyphens
+ \newXeTeXintercharclass\croatian@hyphen % -
+ \newXeTeXintercharclass\croatian@nonsyllabicpreposition%
+\fi
+
+\def\croatian@hyphens{%
+ \ifluatex
+ \AfterPreamble{\enablesplithyphens{croatian}}%
+ \else
+ \XeTeXinterchartokenstate=1
+ \XeTeXcharclass `\- \croatian@hyphen
+ \XeTeXinterchartoks \z@ \croatian@hyphen = {\croatian@@splhyphen}% "-" -> "\croatian@@splhyphen-"
+ % necessary if used together with vlna:
+ \XeTeXinterchartoks \croatian@nonsyllabicpreposition \croatian@hyphen = {\croatian@@splhyphen}% "-" -> "\croatian@@splhyphen-"
+ \fi%
+}
+
+\def\nocroatian@hyphens{%
+ \ifluatex
+ \AfterPreamble{\disablesplithyphens{croatian}}%
+ \else
+ \XeTeXcharclass `\- \z@
+ \fi%
+}
+
\newcommand*\hr@charifavailable[2]{%
\ifcroatian@disableligatures
\bgroup#2\egroup%
@@ -5178,15 +10945,18 @@ and may look very wrong.}
}
\def\noextras@croatian{%
- \nocroatian@shorthands%
+ \ifcroatian@babelshorthands\nocroatian@shorthands\fi%
+ \nocroatian@hyphens%
}
\def\blockextras@croatian{%
\ifcroatian@babelshorthands\croatian@shorthands\fi%
+ \ifcroatian@splithyphens\croatian@hyphens\else\nocroatian@hyphens\fi%
}
\def\inlineextras@croatian{%
\ifcroatian@babelshorthands\croatian@shorthands\fi%
+ \ifcroatian@splithyphens\croatian@hyphens\else\nocroatian@hyphens\fi%
}
% \end{macrocode}
@@ -5307,7 +11077,7 @@ and may look very wrong.}
\chardef\czech@boundary=4095 %
\def\newXeTeXintercharclass{%
\e@alloc\XeTeXcharclass\chardef
- \xe@alloc@intercharclass\m@ne\@ucharclass@boundary}
+ \xe@alloc@intercharclass\m@ne\@ucharclass@boundary}%
\else
\chardef\czech@boundary=255
\fi
@@ -5336,6 +11106,24 @@ and may look very wrong.}
% Add nonbreakable space after single-letter word to
% prevent them to land at the end of a line
+% vlna code taken and adapted from xevlna.sty
+\ifxetex
+ \def\czech@nointerchartoks{\let\czech@interchartoks\czech@PreCSpreposition}%
+ \def\czech@PreCSpreposition{%
+ \def\next{}%
+ \ifnum\catcode`\ =10 % nothing will be done in verbatim
+ \ifmmode % nothing in math
+ \else
+ \let\czech@interchartoks\czech@nointerchartoks
+ \let\next\czech@ExamineCSpreposition
+ \fi\fi
+ \next%
+ }%
+ \def\czech@ExamineCSpreposition #1{#1\futurelet\next\czech@ProcessCSpreposition}%
+ \def\czech@ProcessCSpreposition{\ifx\next\czech@XeTeXspace\nobreak\fi}%
+ \futurelet\czech@XeTeXspace{ }\czech@nointerchartoks
+\fi
+
\def\czech@vlna{%
\ifluatex
\preventsingleon
@@ -5362,21 +11150,8 @@ and may look very wrong.}
\XeTeXcharclass `\a \czech@nonsyllabicpreposition
\XeTeXcharclass `\I \czech@nonsyllabicpreposition
\XeTeXcharclass `\i \czech@nonsyllabicpreposition
- \XeTeXinterchartoks \czech@boundary \czech@nonsyllabicpreposition {\czech@interchartoks}
- \XeTeXinterchartoks \czech@openpunctuation \czech@nonsyllabicpreposition {\czech@interchartoks}
- \def\czech@nointerchartoks{\let\czech@interchartoks\czech@PreCSpreposition}
- \def\czech@PreCSpreposition{\def\next{}%
- \ifnum\catcode`\ =10 % nothing will be done in verbatim
- \ifmmode % nothing in math
- \else
- \let\czech@interchartoks\czech@nointerchartoks
- \let\next\czech@ExamineCSpreposition
- \fi \fi
- \next%
- }
- \def\czech@ExamineCSpreposition ##1{##1\futurelet\next\czech@ProcessCSpreposition}
- \def\czech@ProcessCSpreposition{\ifx\next\czech@XeTeXspace\nobreak\fi}
- \futurelet\czech@XeTeXspace{ }\czech@nointerchartoks
+ \XeTeXinterchartoks \czech@boundary \czech@nonsyllabicpreposition {\czech@interchartoks}%
+ \XeTeXinterchartoks \czech@openpunctuation \czech@nonsyllabicpreposition {\czech@interchartoks}%
\fi
}
@@ -5442,7 +11217,7 @@ and may look very wrong.}
}
\def\noextras@czech{%
- \noczech@shorthands%
+ \ifczech@babelshorthands\noczech@shorthands\fi%
\noczech@hyphens%
\noczech@vlna%
\ifxetex\XeTeXinterchartokenstate=0\fi%
@@ -5520,11 +11295,12 @@ and may look very wrong.}
\def\proofname{Bevis}%
\def\glossaryname{Gloseliste}%
}
+
\def\datedanish{%
\def\today{\number\day.~\ifcase\month\or
januar\or februar\or marts\or april\or maj\or juni\or
juli\or august\or september\or oktober\or november\or december\fi
- \space\number\year}
+ \space\number\year}%
}
% \end{macrocode}
@@ -5837,12 +11613,7 @@ and may look very wrong.}
% \subsection{gloss-divehi.ldf}
% \begin{macrocode}
\ProvidesFile{gloss-divehi.ldf}[polyglossia: module for divehi]
-\ifluatex
- \xpg@warning{Divehi is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
+
\RequireBidi
\PolyglossiaSetup{divehi}{
bcp47=dv,
@@ -6000,7 +11771,7 @@ and may look very wrong.}
}
\def\noextras@dutch{%
- \nodutch@shorthands%
+ \ifdutch@babelshorthands\nodutch@shorthands\fi%
}
\def\blockextras@dutch{%
@@ -6690,7 +12461,7 @@ and may look very wrong.}
\def\prefacename{Esipuhe}%
\def\chaptername{Luku}%
\def\appendixname{Liite}%
- \def\contentsname{Sisältö}%
+ \def\contentsname{Sisällys}%
\def\listfigurename{Kuvat}%
\def\listtablename{Taulukot}%
\def\indexname{Hakemisto}%
@@ -6715,7 +12486,7 @@ and may look very wrong.}
\space\number\year}}
\def\noextras@finnish{%
- \nofinnish@shorthands%
+ \iffinnish@babelshorthands\nofinnish@shorthands\fi%
}
\def\blockextras@finnish{%
@@ -6901,6 +12672,9 @@ and may look very wrong.}
\define@boolkey{french}[french@]{autospacing}[true]{}
\french@autospacingtrue
+\define@boolkey{french}[french@]{frenchpart}[true]{}
+\french@frenchparttrue
+
\newif\iffrench@autospaceguillemets
\define@boolkey{french}[french@]{autospaceguillemets}[true]{}
\french@autospaceguillemetstrue
@@ -7000,7 +12774,7 @@ and may look very wrong.}
\let\ttfamily\french@ttfamilyORI
}
-\def\xpg@french@thinsp{\kern 0.5\fontdimen2\font}
+\def\xpg@french@thinsp{\kern 0.5\fontdimen2\font\nobreak\hskip\z@skip}
\def\french@punctuation{%
\lccode"2019="2019
@@ -7123,14 +12897,11 @@ and may look very wrong.}
\def\indexname{Index}%
\def\figurename{\textsc{Fig.}}%
\def\tablename{\textsc{Tab.}}%
- \def\@Fpt{\ifcase\value{part}\or Première\or Deuxième\or
- Troisième\or Quatrième\or Cinquième\or Sixième\or
- Septième\or Huitième\or Neuvième\or Dixième\or Onzième\or
- Douzième\or Treizième\or Quatorzième\or Quinzième\or
- Seizième\or Dix-septième\or Dix-huitième\or Dix-neuvième\or
- Vingtième\fi\space}%
- \def\thepart{\@Fpt partie}%
- \def\partname{}%
+ \iffrench@frenchpart
+ \def\partname{partie}%
+ \else
+ \def\partname{Partie}%
+ \fi%
\def\pagename{page}%
\def\seename{\emph{voir}}%
\def\alsoname{\emph{voir aussi}}%
@@ -7150,9 +12921,83 @@ and may look very wrong.}
décembre\fi
\space \number\year}}
+\def\xpg@french@part{\ifcase\value{part}\or Première\or Deuxième\or%
+ Troisième\or Quatrième\or Cinquième\or Sixième\or%
+ Septième\or Huitième\or Neuvième\or Dixième\or Onzième\or%
+ Douzième\or Treizième\or Quatorzième\or Quinzième\or%
+ Seizième\or Dix-septième\or Dix-huitième\or Dix-neuvième\or%
+ Vingtième\fi}%
+
+\def\french@capsformat{%
+ % Change part heading
+ % With titlesec
+ \ifcsdef{titleformat}{%
+ \ifcsdef{@part}{%
+ \let\xpg@save@part@format\@part%
+ \patchcmd{\@part}%
+ {\partname\nobreakspace\thepart}%
+ {\xpg@french@part\nobreakspace\partname}%
+ {}%
+ {\xpg@warning{Failed to patch part for French}}%
+ }{}%
+ }{% (not \ifdefined\titleformat)
+ % With KOMA
+ \ifcsdef{sectionformat}{%
+ \ifcsdef{partformat}{%
+ \let\xpg@save@part@format\partformat%
+ \renewcommand{\partformat}{\xpg@french@part~\partname}%
+ }{}%
+ }{% (not \ifdefined\sectionformat)
+ % With memoir
+ \ifcsdef{@memptsize}{%
+ \ifcsdef{@part}{%
+ \let\xpg@save@part@format\@part%
+ \patchcmd{\@part}{\printpartname \partnamenum \printpartnum}%
+ {\partnamefont\xpg@french@part\partnamenum\printpartname}%
+ {}%
+ {\xpg@warning{Failed to patch part for French}}%
+ }{}%
+ }{% (not \ifdefined\@memptsize)
+ % With standard classes
+ \ifcsdef{@part}{%
+ \let\xpg@save@part@format\@part%
+ \patchcmd{\@part}%
+ {\partname\nobreakspace\thepart}%
+ {\xpg@french@part\nobreakspace\partname}%
+ {}%
+ {\xpg@warning{Failed to patch part for French}}%
+ }{}% (end \ifdefined\@part)
+ }% (end \ifdefined\@memptsize)
+ }% (end \ifdefined\sectionformat)
+ }% (end \ifdefined\titleformat)
+}
+
+\def\nofrench@capsformat{%
+ % Reset chapter and part heading
+ \ifcsdef{titleformat}{%
+ % With titlesec
+ \ifcsdef{xpg@save@part@format}{%
+ \let\@part\xpg@save@part@format
+ }{}%
+ }{% (not \ifdefined\titleformat)
+ \ifcsdef{sectionformat}{%
+ % With KOMA
+ \ifcsdef{xpg@save@part@format}{%
+ \let\partformat\xpg@save@part@format
+ }{}%
+ }{%
+ % With memoir and standard classes
+ \ifcsdef{xpg@save@part@format}{%
+ \let\@part\xpg@save@part@format
+ }{}%
+ }% (end \ifdefined\sectionformat)
+ }% (end \ifdefined\titleformat)
+}
+
\def\noextras@french{%
\nofrench@punctuation%
\nofrench@fontsetup%
+ \nofrench@capsformat%
}
\def\blockextras@french{%
@@ -7160,6 +13005,9 @@ and may look very wrong.}
\french@punctuation%
\fi
\french@fontsetup%
+ \iffrench@frenchpart
+ \french@capsformat%
+ \fi%
}
\def\inlineextras@french{%
@@ -7598,7 +13446,7 @@ and may look very wrong.}
\def\@Ccdash{\leavevmode
\nobreak\cyrdash\nobreak\hskip.35em\ignorespaces}%
\ifx\cyrdash\undefined
- \def\cyrdash{\hbox to.8em{--\hss--}}%
+ \def\cyrdash{\hbox to.8em{\textendash\hss\textendash}}%
\fi
\declare@shorthand{georgian}{",}{\nobreak\hskip.2em\ignorespaces}%
}
@@ -7743,7 +13591,7 @@ and may look very wrong.}
\def\noextras@georgian{%
\ifgeorgian@numerals\nogeorgian@numbers\fi%
- \nogeorgian@shorthands%
+ \ifgeorgian@babelshorthands\nogeorgian@shorthands\fi%
}
\def\blockextras@georgian{%
@@ -7964,14 +13812,14 @@ and may look very wrong.}
\declare@shorthand{german}{"R}{\textormath{\bbl@disc@german R{RR}}{R}}%
\declare@shorthand{german}{"t}{\textormath{\bbl@disc@german t{tt}}{t}}%
\declare@shorthand{german}{"T}{\textormath{\bbl@disc@german T{TT}}{T}}%
- \declare@shorthand{german}{"f}{\textormath{\bbl@discff}{f}}%
+ \declare@shorthand{german}{"f}{\texorpdfstring{\textormath{\bbl@discff}{f}}{f}}%
\def\bbl@discff{\penalty\@M
- \afterassignment\bbl@insertff \let\bbl@nextff= }%
+ \afterassignment\bbl@insertff \cslet{bbl@nextff}{ }}%
\def\bbl@insertff{%
\if f\bbl@nextff
\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{\relax\discretionary{ff-}{f}{ff}\allowhyphens}{f\bbl@nextff}}%
- \let\bbl@nextff=f%
+ \cslet{bbl@nextff}{f}%
\declare@shorthand{german}{"-}{\nobreak\-\nobreak\hskip\z@skip}%
\declare@shorthand{german}{"|}{\textormath{\penalty\@M\discretionary{-}{}{\kern.03em}}{}}%
\declare@shorthand{german}{""}{\hskip\z@skip}%
@@ -8076,15 +13924,15 @@ and may look very wrong.}
}
\def\noextras@german{%
- \nogerman@shorthands%
+ \ifgerman@babelshorthands\nogerman@shorthands\fi%
}
\def\blockextras@german{%
- \ifgerman@babelshorthands\german@shorthands\fi
+ \ifgerman@babelshorthands\german@shorthands\fi%
}
\def\inlineextras@german{%
- \ifgerman@babelshorthands\german@shorthands\fi
+ \ifgerman@babelshorthands\german@shorthands\fi%
}
% \end{macrocode}
@@ -8187,7 +14035,7 @@ and may look very wrong.}
\xpg@ifdefined{greek}{}{%
\xpg@nopatterns{greek}%
\adddialect\l@greek\l@nohyphenation
- }
+ }%
\ifx\@tmpa\tmp@poly\def\@tmpa{polytonic}\fi
\ifx\@tmpa\tmp@ancientgreek\def\@tmpa{ancient}\fi
\ifx\@tmpa\tmp@polytonic%
@@ -8573,12 +14421,7 @@ and may look very wrong.}
% \subsection{gloss-hebrew.ldf}
% \begin{macrocode}
\ProvidesFile{gloss-hebrew.ldf}[polyglossia: module for hebrew]
-\ifluatex
- \xpg@warning{Hebrew is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
+
\RequireBidi
\RequirePackage{hebrewcal}
@@ -8685,23 +14528,23 @@ and may look very wrong.}
\fi
}
-% Bidi inserts an RTL mark (0x200f) before any number, forcing numbers to
-% RTL. Hebrew uses LTR numbers, though. So we insert an LTR mark to revert
-% the directionality
\ifxetex
- \newcommand\xpg@hebrew@DigitsDotDashInterCharToks{\ifbool{@nonlatin}{\char"200E }{}}
+ \let\xpg@orig@DigitsDotDashInterCharToks\DigitsDotDashInterCharToks%
\fi
\def\hebrew@ltr@numbers{%
\ifxetex
- \XeTeXinterchartoks \bidi@sepmark@charclass \bidi@digits@charclass = {\xpg@hebrew@DigitsDotDashInterCharToks}%
+ % Bidi inserts an RTL mark (0x200f) between number and number separator (- .),
+ % forcing numbers to RTL. This is wrong for Hebrew.
+ % So we defunc the respective command.
+ \renewcommand*{\DigitsDotDashInterCharToks}{}%
\fi%
}
\def\nohebrew@ltr@numbers{%
\ifxetex
- % This is bidi's original intervention
- \XeTeXinterchartoks \bidi@sepmark@charclass \bidi@digits@charclass = {\DigitsDotDashInterCharToks}%
+ % Restore bidi's \DigitsDotDashInterCharToks
+ \let\DigitsDotDashInterCharToks\xpg@orig@DigitsDotDashInterCharToks%
\fi%
}
@@ -8846,7 +14689,7 @@ and may look very wrong.}
\def\listfigurename{चित्रों की सूची}%
\def\listtablename{तालिकाओं की सूची}%
\def\pagename{पृष्ठ}%
- \def\partname{खणड}%
+ \def\partname{खण्ड}%
\def\prefacename{प्रस्तावना}% प्राक्कथन
\def\refname{हवाले}%
\def\tablename{तालिका}%
@@ -9151,9 +14994,9 @@ and may look very wrong.}
\renewcommand*\chaptermark[1]{%
\markboth{\memUChead{%
\ifnum \c@secnumdepth >\m@ne
- \if@mainmatter
+ \ifbool{@mainmatter}{%
\thechapter.\ \@chapapp\ %
- \fi
+ }{}%
\fi
##1}}{}}%
}{% (not \ifdefined\@memptsize)
@@ -9566,21 +15409,21 @@ and may look very wrong.}
\def\noextras@italian{%
- \lccode\string"2019=\z@
- \noitalian@shorthands
- \xpgit@savedvalues
+ \lccode\string"2019=\z@%
+ \ifitalian@babelshorthands\noitalian@shorthands\fi%
+ \xpgit@savedvalues%
}
\def\blockextras@italian{%
- \lccode\string"2019=\string"2019
- \clubpenalty=3000 \@clubpenalty=3000 \widowpenalty=3000
- \finalhyphendemerits=50000000
- \ifitalian@babelshorthands\italian@shorthands\fi
+ \lccode\string"2019=\string"2019%
+ \clubpenalty=3000 \@clubpenalty=3000 \widowpenalty=3000%
+ \finalhyphendemerits=50000000%
+ \ifitalian@babelshorthands\italian@shorthands\fi%
}
\def\inlineextras@italian{%
- \lccode\string"2019=\string"2019
- \ifitalian@babelshorthands\italian@shorthands\fi
+ \lccode\string"2019=\string"2019%
+ \ifitalian@babelshorthands\italian@shorthands\fi%
}
%%% CHANGES END %%%
% \end{macrocode}
@@ -9874,12 +15717,7 @@ and may look very wrong.}
%
% This work consists of the file gloss-kannada.ldf
\ProvidesFile{gloss-kannada.ldf}[polyglossia: module for kannada]
-\ifluatex
- \xpg@warning{Kannada is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
+
\PolyglossiaSetup{kannada}{
bcp47=kn,
script=Kannada,
@@ -9979,164 +15817,164 @@ and may look very wrong.}
%
% \subsection{gloss-khmer.ldf}
% \begin{macrocode}
-\ProvidesFile{gloss-khmer.ldf}[polyglossia: module for Khmer]
-\PolyglossiaSetup{khmer}{
+\ProvidesFile{gloss-khmer.ldf}[polyglossia: module for Khmer]
+\PolyglossiaSetup{khmer}{
bcp47=km,
- script=Khmer,%
- scripttag=khmr,%
- langtag=KHM,%
- hyphennames={nohyphenation},%
- fontsetup=true,%
- localnumeral=khmernumerals%
-}
-\newif\if@khmer@numerals
-\def\tmp@khmer{khmer}
-\define@key{khmer}{numerals}[arabic]{%
- \def\@tmpa{#1}%
- \ifx\@tmpa\tmp@khmer\@khmer@numeralstrue%
- \else\@khmer@numeralsfalse\fi%
-}
-\setkeys{khmer}{numerals}
-\def\captionskhmer{%
- \def\prefacename{អារម្ភកថា}%
- \def\refname{ឯកសារយោង}%
- \def\abstractname{សង្ខេប}%
- \def\bibname{គន្ថនិទ្ទេស}%
- \def\chaptername{ជំពូក}%
- \def\appendixname{សេចក្ដីបន្ថែម}%
- \def\contentsname{មាតិការ}%
- \def\listfigurename{បញ្ជីរូបភាព}%
- \def\listtablename{បញ្ជីតារាង}%
- \def\indexname{សន្ទស្សន៍}%
- \def\figurename{រូប}%
- \def\tablename{តារាង}%
- \def\partname{ផ្នែក}%
- \def\pagename{ទំព័រ}%
- \def\seename{មើល}%
- \def\alsoname{មើលបន្ថែម}%
- \def\enclname{ឯកសារភ្ជាប់}%
- \def\ccname{ចម្លងជួន}%
- \def\headtoname{ផ្ញើរទៅ}%
- \def\proofname{សម្រាយ}%
- \def\glossaryname{សទានុក្រម}%
-}
-\def\datekhmer{%
- \def\khmer@month{%
- \ifcase\month\or%
- មករា\or%
- កុម្ភៈ\or%
- មិនា\or%
- មេសា\or%
- ឧសភា\or%
- មិថុនា\or%
- កក្កដា\or%
- សីហា\or%
- កញ្ញា\or%
- តុលា\or%
- វិច្ឆិកា\or%
- ធ្នូ\fi}%
- \def\today{\khmernumber\day\space\khmer@month\space\khmernumber\year}%
-}
-\def\khmerdigits#1{\expandafter\@khmer@digits #1@}
-\def\@khmer@digits#1{%
- \ifx @#1% then terminate
- \else\ifx0#1០%
- \else\ifx1#1១%
- \else\ifx2#1២%
- \else\ifx3#1៣%
- \else\ifx4#1៤%
- \else\ifx5#1៥%
- \else\ifx6#1៦%
- \else\ifx7#1៧%
- \else\ifx8#1៨%
- \else\ifx9#1៩%
- \else#1\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
- \expandafter\@khmer@digits%
- \fi
-}
-
-\newcommand{\khmernumerals}[2]{\khmernumber{#2}}
-
-\def\khmernumber#1{%
- \if@khmer@numerals%
- \khmerdigits{\number#1}%
- \else%
- \number#1%
- \fi}
-\def\khmer@globalnumbers{%
- \let\orig@arabic\@arabic%
- \let\@arabic\khmernumber%
- \renewcommand{\thefootnote}{\localnumeral*{footnote}}%
-}
-\def\nokhmer@globalnumbers{%
- \let\@arabic\orig@arabic%
-}
-\def\thepart{\arabic{part}}
-\def\@khmeralph#1{%
-\ifcase#1%
-\or ក\or ខ\or គ\or ឃ\or ង%
-\or ច\or ឆ\or ជ\or ឈ\or ញ%
-\or ដ\or ឋ\or ឌ\or ឍ\or ណ%
-\or ត\or ថ\or ទ\or ធ\or ន%
-\or ប\or ផ\or ព\or ភ\or ម%
-\or យ\or រ\or ល\or វ\or ស\or ហ\or ឡ\or អ%
-\else\xpg@ill@value{#1}{@khmeralph}\fi}
-\def\khmerAlph#1{\expandafter\@khmerAlph\csname c@#1\endcsname}
-\def\@khmerAlph#1{%
-\ifcase#1%
-\or ក\or ខ\or គ\or ឃ\or ង%
-\or ច\or ឆ\or ជ\or ឈ\or ញ%
-\or ដ\or ឋ\or ឌ\or ឍ\or ណ%
-\or ត\or ថ\or ទ\or ធ\or ន%
-\or ប\or ផ\or ព\or ភ\or ម%
-\or យ\or រ\or ល\or វ\or ស\or ហ\or ឡ\or អ%
-\else\xpg@ill@value{#1}{@khmeralph}\fi}
-\def\khmer@numbers{%
- \if@khmer@numerals
- \let\@alph\@khmeralph%
- \let\@Alph\@khmerAlph%
- \fi%
-}
-\def\nokhmer@numbers{%
- \let\@alph\latin@alph%
- \let\@Alph\latin@Alph%
-}
-\def\blockextras@khmer{%
- \XeTeXlinebreaklocale "kh" %
- \XeTeXlinebreakskip = 0pt plus 1pt minus 1pt
-% \let\orig@baselinestretch\baselinestretch%
-% \renewcommand{\baselinestretch}{1.2}% not work
-}
-\def\noblockextras@khmer{%
- \XeTeXlinebreaklocale "en"%
-% \let\baselinestretch\orig@baselinestretch%
-}
-\@ifclassloaded{beamer}{%
- \usefonttheme{professionalfonts}%
- \def\factname{ស្វ័យសត្យ}%
- \def\lemmaname{បទគន្លិះ}%
- \def\theoremname{ទ្រឹស្ដីបទ}%
- \def\corollaryname{អនុសាធ្យ}%
- \def\problemname{ចំណោទ}%
- \def\solutionname{ដំណោះស្រាយ}%
- \def\definitionname{និយមន័យ}%
- \def\examplename{ឧទាហរណ៏}%
- \uselanguage{khmer}%
- \languagepath{khmer}%
- \deftranslation[to=khmer]{Fact}{\factname}%
- \deftranslation[to=khmer]{Lemma}{\lemmaname}%
- \deftranslation[to=khmer]{Theorem}{\theoremname}%
- \deftranslation[to=khmer]{Corollary}{\corollaryname}%
- \deftranslation[to=khmer]{Problem}{\problemname}%
- \deftranslation[to=khmer]{Solution}{\solutionname}%
- \deftranslation[to=khmer]{Definition}{\definitionname}%
- \deftranslation[to=khmer]{Definitions}{\definitionname}%
- \deftranslation[to=khmer]{Example}{\examplename}%
- \deftranslation[to=khmer]{Examples}{\examplename}%
- \AtEndDocument{\immediate\write\@auxout{\string\@writefile{nav}%
- {\noexpand\headcommand{\noexpand\def\noexpand%
- \inserttotalframenumber{\localnumeral*{framenumber}}}}}}%
-}{}
+ script=Khmer,%
+ scripttag=khmr,%
+ langtag=KHM,%
+ hyphennames={nohyphenation},%
+ fontsetup=true,%
+ localnumeral=khmernumerals%
+}
+\newif\if@khmer@numerals
+\def\tmp@khmer{khmer}
+\define@key{khmer}{numerals}[arabic]{%
+ \def\@tmpa{#1}%
+ \ifx\@tmpa\tmp@khmer\@khmer@numeralstrue%
+ \else\@khmer@numeralsfalse\fi%
+}
+\setkeys{khmer}{numerals}
+\def\captionskhmer{%
+ \def\prefacename{អារម្ភកថា}%
+ \def\refname{ឯកសារយោង}%
+ \def\abstractname{សង្ខេប}%
+ \def\bibname{គន្ថនិទ្ទេស}%
+ \def\chaptername{ជំពូក}%
+ \def\appendixname{សេចក្ដីបន្ថែម}%
+ \def\contentsname{មាតិការ}%
+ \def\listfigurename{បញ្ជីរូបភាព}%
+ \def\listtablename{បញ្ជីតារាង}%
+ \def\indexname{សន្ទស្សន៍}%
+ \def\figurename{រូប}%
+ \def\tablename{តារាង}%
+ \def\partname{ផ្នែក}%
+ \def\pagename{ទំព័រ}%
+ \def\seename{មើល}%
+ \def\alsoname{មើលបន្ថែម}%
+ \def\enclname{ឯកសារភ្ជាប់}%
+ \def\ccname{ចម្លងជួន}%
+ \def\headtoname{ផ្ញើរទៅ}%
+ \def\proofname{សម្រាយ}%
+ \def\glossaryname{សទានុក្រម}%
+}
+\def\datekhmer{%
+ \def\khmer@month{%
+ \ifcase\month\or%
+ មករា\or%
+ កុម្ភៈ\or%
+ មិនា\or%
+ មេសា\or%
+ ឧសភា\or%
+ មិថុនា\or%
+ កក្កដា\or%
+ សីហា\or%
+ កញ្ញា\or%
+ តុលា\or%
+ វិច្ឆិកា\or%
+ ធ្នូ\fi}%
+ \def\today{\khmernumber\day\space\khmer@month\space\khmernumber\year}%
+}
+\def\khmerdigits#1{\expandafter\@khmer@digits #1@}
+\def\@khmer@digits#1{%
+ \ifx @#1% then terminate
+ \else\ifx0#1០%
+ \else\ifx1#1១%
+ \else\ifx2#1២%
+ \else\ifx3#1៣%
+ \else\ifx4#1៤%
+ \else\ifx5#1៥%
+ \else\ifx6#1៦%
+ \else\ifx7#1៧%
+ \else\ifx8#1៨%
+ \else\ifx9#1៩%
+ \else#1\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \expandafter\@khmer@digits%
+ \fi
+}
+
+\newcommand{\khmernumerals}[2]{\khmernumber{#2}}
+
+\def\khmernumber#1{%
+ \if@khmer@numerals%
+ \khmerdigits{\number#1}%
+ \else%
+ \number#1%
+ \fi}
+\def\khmer@globalnumbers{%
+ \let\orig@arabic\@arabic%
+ \let\@arabic\khmernumber%
+ \renewcommand{\thefootnote}{\localnumeral*{footnote}}%
+}
+\def\nokhmer@globalnumbers{%
+ \let\@arabic\orig@arabic%
+}
+\def\thepart{\arabic{part}}
+\def\@khmeralph#1{%
+\ifcase#1%
+\or ក\or ខ\or គ\or ឃ\or ង%
+\or ច\or ឆ\or ជ\or ឈ\or ញ%
+\or ដ\or ឋ\or ឌ\or ឍ\or ណ%
+\or ត\or ថ\or ទ\or ធ\or ន%
+\or ប\or ផ\or ព\or ភ\or ម%
+\or យ\or រ\or ល\or វ\or ស\or ហ\or ឡ\or អ%
+\else\xpg@ill@value{#1}{@khmeralph}\fi}
+\def\khmerAlph#1{\expandafter\@khmerAlph\csname c@#1\endcsname}
+\def\@khmerAlph#1{%
+\ifcase#1%
+\or ក\or ខ\or គ\or ឃ\or ង%
+\or ច\or ឆ\or ជ\or ឈ\or ញ%
+\or ដ\or ឋ\or ឌ\or ឍ\or ណ%
+\or ត\or ថ\or ទ\or ធ\or ន%
+\or ប\or ផ\or ព\or ភ\or ម%
+\or យ\or រ\or ល\or វ\or ស\or ហ\or ឡ\or អ%
+\else\xpg@ill@value{#1}{@khmeralph}\fi}
+\def\khmer@numbers{%
+ \if@khmer@numerals
+ \let\@alph\@khmeralph%
+ \let\@Alph\@khmerAlph%
+ \fi%
+}
+\def\nokhmer@numbers{%
+ \let\@alph\latin@alph%
+ \let\@Alph\latin@Alph%
+}
+\def\blockextras@khmer{%
+ \XeTeXlinebreaklocale "kh" %
+ \XeTeXlinebreakskip = 0pt plus 1pt minus 1pt
+% \let\orig@baselinestretch\baselinestretch%
+% \renewcommand{\baselinestretch}{1.2}% not work
+}
+\def\noblockextras@khmer{%
+ \XeTeXlinebreaklocale "en"%
+% \let\baselinestretch\orig@baselinestretch%
+}
+\@ifclassloaded{beamer}{%
+ \usefonttheme{professionalfonts}%
+ \def\factname{ស្វ័យសត្យ}%
+ \def\lemmaname{បទគន្លិះ}%
+ \def\theoremname{ទ្រឹស្ដីបទ}%
+ \def\corollaryname{អនុសាធ្យ}%
+ \def\problemname{ចំណោទ}%
+ \def\solutionname{ដំណោះស្រាយ}%
+ \def\definitionname{និយមន័យ}%
+ \def\examplename{ឧទាហរណ៏}%
+ \uselanguage{khmer}%
+ \languagepath{khmer}%
+ \deftranslation[to=khmer]{Fact}{\factname}%
+ \deftranslation[to=khmer]{Lemma}{\lemmaname}%
+ \deftranslation[to=khmer]{Theorem}{\theoremname}%
+ \deftranslation[to=khmer]{Corollary}{\corollaryname}%
+ \deftranslation[to=khmer]{Problem}{\problemname}%
+ \deftranslation[to=khmer]{Solution}{\solutionname}%
+ \deftranslation[to=khmer]{Definition}{\definitionname}%
+ \deftranslation[to=khmer]{Definitions}{\definitionname}%
+ \deftranslation[to=khmer]{Example}{\examplename}%
+ \deftranslation[to=khmer]{Examples}{\examplename}%
+ \AtEndDocument{\immediate\write\@auxout{\string\@writefile{nav}%
+ {\noexpand\headcommand{\noexpand\def\noexpand%
+ \inserttotalframenumber{\localnumeral*{framenumber}}}}}}%
+}{}
% \end{macrocode}
% \iffalse
%</gloss-khmer.ldf>
@@ -10714,7 +16552,9 @@ and may look very wrong.}
% \subsection{gloss-kurdish.ldf}
% \begin{macrocode}
% Created on September 1, 2019
-% Sina Ahmadi (https://sinaahmadi.github.io/)
+% Last updated on May 17, 2020
+% Sina Ahmadi (ahmadi.sina@outlook.com)
+% For more information, visit the Kurdish XeLaTeX Users Group at https://github.com/KurdishXeLaTeX
\ProvidesFile{gloss-kurdish.ldf}[polyglossia: module for Kurdish]
\RequireBidi
@@ -10842,7 +16682,6 @@ and may look very wrong.}
\define@key{kurdish}{locale}[default]{%
\def\@kurdish@locale{#1}}
-
%TODO add option for CALENDAR
% Register default options
@@ -10853,9 +16692,9 @@ and may look very wrong.}
}%
\def\kurdishNativemonth#1{\ifcase#1%
- \or رێبه‌ندان\or ره‌شه‌مێ\or خاكه‌لێوه‌\or گوڵان\or جۆزه‌ردان\or پووشپه‌ڕ\or خه‌رمانان\or گه‌لاوێژ\or ره‌زبه‌ر\or گه‌ڵارێزان\or سه‌رماوه‌ز\or به‌فرانبار\fi}
+ \or رێبەندان\or رەشەمێ\or خاكەلێوە\or گوڵان\or جۆزەردان\or پووشپەڕ\or خەرمانان\or گەلاوێژ\or رەزبەر\or گەڵارێزان\or سەرماوەز\or بەفرانبار\fi}
\def\kurdishmonth#1{\ifcase#1%
- \or کانونی دووەم\or شوبات\or ئازار\or نیسان\or ئایار\or حوزه‌یران\or ته‌ممووز\or ئاب\or ئه‌یلوول\or تشرینی یه‌كه‌م\or تشرینی دووهه‌م\or كانوونی یه‌كه‌م\fi}
+ \or كانوونی دووهەم\or شوبات\or ئازار\or نیسان\or ئایار\or حوزەیران\or تەممووز\or ئاب\or ئەیلوول\or تشرینی یەكەم\or تشرینی دووهەم\or كانوونی یەكەم\fi}
%\Hijritoday is now locale-aware and will format the date with this macro:
\DefineFormatHijriDate{kurdish}{%
@@ -10865,27 +16704,27 @@ and may look very wrong.}
}
\def\captionskurdish@sorani@arabic{%
- \def\prefacename{\@ensure@RTL{پێشه‌كی}}%
- \def\refname{\@ensure@RTL{سه‌رچاوه‌کان}}%
- \def\abstractname{\@ensure@RTL{پوخته‌}}%
- \def\bibname{\@ensure@RTL{کتێبنامه‌}}%
- \def\chaptername{\@ensure@RTL{به‌ندی}}%
+ \def\prefacename{\@ensure@RTL{پێشەكی}}%
+ \def\refname{\@ensure@RTL{سەرچاوەکان}}%
+ \def\abstractname{\@ensure@RTL{پوختە}}%
+ \def\bibname{\@ensure@RTL{کتێبنامە}}%
+ \def\chaptername{\@ensure@RTL{بەندی}}%
\def\appendixname{\@ensure@RTL{پاشکۆ}}%
- \def\contentsname{\@ensure@RTL{نێوه‌ڕۆک}}%
- \def\listfigurename{\@ensure@RTL{لیستی وێنه‌کان}}%
- \def\listtablename{\@ensure@RTL{لیستی خشته‌کان}}%
+ \def\contentsname{\@ensure@RTL{نێوەڕۆک}}%
+ \def\listfigurename{\@ensure@RTL{لیستی وێنەکان}}%
+ \def\listtablename{\@ensure@RTL{لیستی خشتەکان}}%
\def\indexname{\@ensure@RTL{پێنوێن}}%
- \def\figurename{\@ensure@RTL{وێنه‌}}%
- \def\tablename{\@ensure@RTL{خشتە}}%
- \def\partname{\@ensure@RTL{به‌شی}}%
+ \def\figurename{\@ensure@RTL{وێنەی}}%
+ \def\tablename{\@ensure@RTL{خشتەی}}%
+ \def\partname{\@ensure@RTL{بەشی}}%
\def\enclname{\@ensure@RTL{هاوپێچ}}%
- \def\ccname{\@ensure@RTL{روونووس}}%
+ \def\ccname{\@ensure@RTL{ڕوونووس}}%
\def\headtoname{\@ensure@RTL{بۆ}}%
- \def\pagename{\@ensure@RTL{لاپه‌ڕه‌}}%
- \def\seename{\@ensure@RTL{چاو لێکه‌ن}}%
- \def\alsoname{\@ensure@RTL{هه‌روه‌ها چاو لێکه‌ن}}%
+ \def\pagename{\@ensure@RTL{لاپەڕە}}%
+ \def\seename{\@ensure@RTL{چاو لێکەن}}%
+ \def\alsoname{\@ensure@RTL{هەروەها چاو لێکەن}}%
\def\proofname{\@ensure@RTL{سەلماندن}}%
- \def\glossaryname{\@ensure@RTL{فه‌رهه‌نگۆک}}%
+ \def\glossaryname{\@ensure@RTL{فەرهەنگۆک}}%
}
\def\captionskurdish@sorani@latin{%
@@ -10895,17 +16734,17 @@ and may look very wrong.}
\def\bibname{Kitêbname}%
\def\chaptername{Bendî}%
\def\appendixname{Paşko}%
- \def\contentsname{Nêwerrok}%
+ \def\contentsname{Nêweřok}%
\def\listfigurename{Lîstî Wênekan}%
\def\listtablename{Lîstî Xiştekan}%
- \def\indexname{Pêrrist}%
+ \def\indexname{Pêřist}%
\def\figurename{Wêney}%
\def\tablename{Xiştey}%
\def\partname{Beşî}%
\def\enclname{Hawpêç}%
- \def\ccname{Rûnûs}%
+ \def\ccname{Řûnûs}%
\def\headtoname{Bo}%
- \def\pagename{Laperre}%
+ \def\pagename{Lapeře}%
\def\seename{Çaw lêken}%
\def\alsoname{Herweha çaw lêken}%
\def\proofname{Selmandin}%
@@ -10914,7 +16753,7 @@ and may look very wrong.}
\def\captionskurdish@kurmanji@latin{%
\def\prefacename{Peşgotin}%
- \def\refname{Pirtuken bijartî}%
+ \def\refname{Jêder}%
\def\abstractname{Kurtebîr}%
\def\bibname{Çavkanîya Pirtukan}%
\def\chaptername{Serê}%
@@ -10931,14 +16770,14 @@ and may look very wrong.}
\def\headtoname{Ji bo}%
\def\pagename{Rûpelê}%
\def\seename{binêra}%
- \def\alsoname{le vêya ji binêra}%
+ \def\alsoname{li vêya jî binêra}%
\def\proofname{Delîl}%
\def\glossaryname{Çavkanîya lêkolînê}%
}
\def\captionskurdish@kurmanji@arabic{%
\def\prefacename{\@ensure@RTL{پێشگۆتن}}%
- \def\refname{\@ensure@RTL{پرتووکێن بژارتی}}%
+ \def\refname{\@ensure@RTL{ژێدەر}}%
\def\abstractname{\@ensure@RTL{کورتەبیر}}%
\def\bibname{\@ensure@RTL{چاڤکانییا پرتووکان}}%
\def\chaptername{\@ensure@RTL{سەرێ}}%
@@ -10970,17 +16809,17 @@ and may look very wrong.}
\def\datekurdish@sorani@latin{%
\def\today{%
- \number\day.~\ifcase\month\or
+ \number\day ~\ifcase\month\or
\januaryname\or \februaryname\or \marchname\or \aprilname\or
\mayname\or \junename\or \julyname\or \augustname\or
\septembername\or \octobername\or \novembername\or
\decembername\or \@ctrerr\fi~\number\year}%
\def\ontoday{%
- \number\day’ê~\ifcase\month\or
+ \number\day î~\ifcase\month\or
\januaryname\or \februaryname\or \marchname\or \aprilname\or
\mayname\or \junename\or \julyname\or \augustname\or
\septembername\or \octobername\or \novembername\or
- \decembername\or \@ctrerr\fi ê~\number\year}%
+ \decembername\or \@ctrerr\fi î~\number\year}%
\def\januaryname{Kanûnî Yekem}%
\def\februaryname{Şubat}%
\def\marchname{Azar}%
@@ -10997,13 +16836,13 @@ and may look very wrong.}
\def\datekurdish@kurmanji@latin{%
\def\today{%
- \number\day.~\ifcase\month\or
+ \number\day ~\ifcase\month\or
\januaryname\or \februaryname\or \marchname\or \aprilname\or
\mayname\or \junename\or \julyname\or \augustname\or
\septembername\or \octobername\or \novembername\or
\decembername\or \@ctrerr\fi~\number\year}%
\def\ontoday{%
- \number\day’ê~\ifcase\month\or
+ \number\day ê~\ifcase\month\or
\januaryname\or \februaryname\or \marchname\or \aprilname\or
\mayname\or \junename\or \julyname\or \augustname\or
\septembername\or \octobername\or \novembername\or
@@ -11022,8 +16861,11 @@ and may look very wrong.}
\def\decembername{Çileya Pêşîn}%
}
+\def\kurdishmonthkurmanji#1{\ifcase#1%
+ چلەیا پاشین \or شبات \or ئادار \or نیسان \or گولان \or حەزیران \or تیرمەهـ \or تەباخ \or ئیلۆن \or چریا پێشین \or چریا پاشین \or چلەیا پێشین\fi}
+
\def\datekurdish@kurmanji@arabic{%
- \datekurdish@sorani@arabic% FIXME: correct?
+ \def\today{\@ensure@RTL{\kurdishnumber\day\space\kurdishmonthkurmanji{\month}\space\kurdishnumber\year}}%
}
% TODO: babel-kurmanji has these "alternative" month names
@@ -11187,12 +17029,7 @@ and may look very wrong.}
% \subsection{gloss-lao.ldf}
% \begin{macrocode}
\ProvidesFile{gloss-lao.ldf}[polyglossia: module for Lao]
-\ifluatex
- \xpg@warning{Lao is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
+
\PolyglossiaSetup{lao}{
bcp47=lo,
script=Lao,
@@ -11966,7 +17803,7 @@ and may look very wrong.}
% prosodic shorthand environment.
% The active ' character may cause problems with the unicode-math package
% (in case Latin is used as a secondary language, see #394). We have to
-% turn it of if Latin is not the main language.
+% turn it off if Latin is not the main language.
\protected@write \@auxout { } { \shorthandoff {=} } % for the aux file
@@ -12926,12 +18763,7 @@ and may look very wrong.}
% \subsection{gloss-malayalam.ldf}
% \begin{macrocode}
\ProvidesFile{gloss-malayalam.ldf}[polyglossia: module for malayalam]
-\ifluatex
- \xpg@warning{Malayalam is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
+
% Translations provided by Kevin & Siji, 01-11-2009
\PolyglossiaSetup{malayalam}{
@@ -13001,12 +18833,7 @@ and may look very wrong.}
% TODO implement Hindu calendar (not used in day-to-day practice)
\ProvidesFile{gloss-marathi.ldf}[polyglossia: module for marathi]
-\ifluatex
- \xpg@warning{Marathi is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
+
\RequirePackage{devanagaridigits}
\PolyglossiaSetup{marathi}{
@@ -13060,7 +18887,7 @@ and may look very wrong.}
\def\appendixname{परिशिष्ट}%
\def\contentsname{अनुक्रमणिका}%
\def\listfigurename{आकृत्यांची सूची}%
- \def\listtablename{कोष्टक सूची}%
+ \def\listtablename{कोष्टकसूची}%
\def\indexname{सूची}%
\def\figurename{आकृती}%
\def\tablename{कोष्टक}%
@@ -13069,10 +18896,10 @@ and may look very wrong.}
\def\seename{पाहा}%
\def\alsoname{हेदेखील पाहा}%
\def\enclname{समाविष्ट}%
- \def\ccname{सी.सी.}%
+ \def\ccname{प्रत}%
\def\headtoname{प्रति}%
\def\proofname{सिद्धता}%
- \def\glossaryname{संक्षेपसूची}%
+ \def\glossaryname{संज्ञांची सूची}%
\def\authorsand{आणि}%
}
@@ -13098,23 +18925,23 @@ and may look very wrong.}
}%
}
-\def\devanagari@akshar#1{\ifcase#1\or अ\or आ\or इ\or ई\or उ\or ऊ\or ए\or ऐ\or ओ\or औ\or अं\or अः\else\@ctrerr\fi}
+\def\devanagari@akshar#1{\ifcase#1\or अ\or आ\or इ\or ई\or उ\or ऊ\or ऋ\or ऌ\or ए\or ॲ\or ऐ\or ओ\or ऑ\or औ\or अं\or अः\else\@ctrerr\fi}
\def\devanagari@alph#1{%
\ifcase#1\or क\or ख\or ग\or घ\or ङ\or च\or छ\or ज\or झ\or ञ\or ट\or ठ\or ड\or ढ\or ण\or त\or थ\or द%
- \or ध\or न\or प\or फ\or ब\or भ\or म\or य\or र\or ल\or व\or श\or ष\or स\or ह\or ळ\else\@ctrerr%
+ \or ध\or न\or प\or फ\or ब\or भ\or म\or य\or र\or ल\or व\or श\or ष\or स\or ह\or ळ\or क्ष \or ज्ञ \else\@ctrerr%
\fi%
}
\def\devanagari@letter#1{%
\ifcase#1\or एक\or दोन\or तीन\or चार\or पाच\or सहा\or सात\or आठ\or नऊ\or दहा\or अकरा\or बारा\or तेरा\or चौदा%
- \or पंधरा\or सोळा\or सतरा\or अठरा\or एकोणीस\or वीसएकवीस\or बावीस\or तेवीस\or चोवीस\or पंचवीस\or सव्वीस\or सत्तावीस\or अठाव्वीस%
- \or एकोणतीस\or तीस\or एकतीस\or बत्तीस\or तेहेत्तीस \or चौतीस \or पस्तीस \or छत्तीस \or सतदिस \or अडतीस \or एकोणचाळीस \or चाळीस %
- \or एक्केचाळीस \or बेचाळीस \or त्रेचाळीस \or चौवेचाळीस\or पंचेचाळीस \or सेहेचाळीस \or सत्तेचाळीस \or अठ्ठेचाळीस \or एकोणपन्नास \or पन्नास %
- \or एक्कावन्न \or बावन्न \or त्रेपन्न \or चोपन्न \or पंचावन्न \or छपन्न\or सत्तावन्न \or अठ्ठावन्न \or एकोणसाठ \or साठ \or एकसष्ठ \or बासष्ठ \or त्रेसष्ट %
- \or चौसष्ठ \or पासष्ठ \or सहासष्ठ \or सदुष्ठ \or अडुसष्ठ \or एकोणसत्तर\or सत्तर \or एकाहत्तर \or बहात्तर \or त्र्याहत्तर \or चौऱ्याहत्तर \or पंच्याहत्तर %
- \or शहात्तर \or सत्याहत्तर \or अठ्याहत्तर \or एकोणऐशी \or ऐंशी\or एक्याऐंशी \or ब्याऐंशी \or त्र्याऐंशी \or चौऱ्याऐंशी \or पंच्याऐंशी \or शह्यांशी \or सत्यांऐंशी %
- \or अठ्ठ्याऐंशी \or एकोणनव्वद \or नव्वद \or एक्याण्णव\or ब्याण्णव \or त्र्याण्णव \or चौऱ्याण्णव \or पंच्याण्णव \or शहाण्णव \or सत्याण्णव \or अठ्याण्णव %
+ \or पंधरा\or सोळा\or सतरा\or अठरा\or एकोणीस\or वीस\or एकवीस\or बावीस\or तेवीस\or चोवीस\or पंचवीस\or सव्वीस\or सत्तावीस\or अठ्ठावीस%
+ \or एकोणतीस\or तीस\or एकतीस\or बत्तीस\or तेहतीस \or चौतीस \or पस्तीस \or छत्तीस \or सदतीस \or अडतीस \or एकोणचाळीस \or चाळीस %
+ \or एकेचाळीस \or बेचाळीस \or त्रेचाळीस \or चव्वेचाळीस \or पंचेचाळीस \or शेहेचाळीस \or सत्तेचाळीस \or अठ्ठेचाळीस \or एकोणपन्नास \or पन्नास %
+ \or एकावन्न \or बावन्न \or त्रेपन्न \or चौपन्न \or पंचावन्न \or छप्पन्न\or सत्तावन्न \or अठ्ठावन्न \or एकोणसाठ \or साठ \or एकसष्ट \or बासष्ट \or त्रेसष्ट %
+ \or चौसष्ट \or पासष्ट \or सहासष्ट \or सदुष्ट \or अडुसष्ट \or एकोणसत्तर\or सत्तर \or एकाहत्तर \or बाहत्तर \or त्र्याहत्तर \or चौऱ्याहत्तर \or पंचाहत्तर %
+ \or शाहत्तर \or सत्त्याहत्तर \or अठ्ठ्याहत्तर \or एकोणऐंशी \or ऐंशी\or एक्याऐंशी \or ब्याऐंशी \or त्र्याऐंशी \or चौऱ्याऐंशी \or पंच्याऐंशी \or श्याऐंशी \or सत्त्याऐंशी %
+ \or अठ्ठ्याऐंशी \or एकोणनव्वद \or नव्वद \or एक्याण्णव\or ब्याण्णव \or त्र्याण्णव \or चौऱ्याण्णव \or पंचाण्णव \or शहाण्णव \or सत्त्याण्णव \or अठ्याण्णव %
\or नव्याण्णव \or शंभर\else\@ctrerr%
\fi%
}
@@ -13136,19 +18963,6 @@ and may look very wrong.}
\let\@Roman\xpg@save@Roman
}
-\def\blockextras@marathi{%
- \let\xpg@orig@baselinestretch\baselinestrech%
- \renewcommand{\baselinestretch}{1.2}%
- \renewcommand{\labelitemii}{$\rightarrow$}%
-}
-
-\let\xpg@orig@labelitemii\labelitemii
-
-\def\noextras@marathi{%
- \let\baselinestrech\xpg@orig@baselinestretch%
- \let\labelitemii\xpg@orig@labelitemii%
-}
-
% \end{macrocode}
% \iffalse
%</gloss-marathi.ldf>
@@ -13303,7 +19117,7 @@ and may look very wrong.}
\def\@Ccdash{\leavevmode
\nobreak\cyrdash\nobreak\hskip.35em\ignorespaces}%
\ifx\cyrdash\undefined
- \def\cyrdash{\hbox to.8em{--\hss--}}%
+ \def\cyrdash{\hbox to.8em{\textendash\hss\textendash}}%
\fi
\declare@shorthand{mongolian}{",}{\nobreak\hskip.2em\ignorespaces}%
}
@@ -13417,7 +19231,7 @@ and may look very wrong.}
\def\noextras@mongolian{%
\ifcyrillic@numerals\nomongolian@numbers\fi%
- \nomongolian@shorthands%
+ \ifmongolian@babelshorthands\nomongolian@shorthands\fi%
}
\def\blockextras@mongolian{%
@@ -13919,20 +19733,20 @@ and may look very wrong.}
\finalhyphendemerits=\the\finalhyphendemerits}
}
\def\noextras@occitan{%
- \lccode\string"2019=\z@
- \nooccitan@shorthands
- \xpgoc@savedvalues
+ \lccode\string"2019=\z@%
+ \ifoccitan@babelshorthands\nooccitan@shorthands\fi%
+ \xpgoc@savedvalues%
}
\def\blockextras@occitan{%
- \lccode\string"2019=\string"2019
- \clubpenalty=3000 \@clubpenalty=3000 \widowpenalty=3000
- \finalhyphendemerits=50000000
- \ifoccitan@babelshorthands\occitan@shorthands\fi
+ \lccode\string"2019=\string"2019%
+ \clubpenalty=3000 \@clubpenalty=3000 \widowpenalty=3000%
+ \finalhyphendemerits=50000000%
+ \ifoccitan@babelshorthands\occitan@shorthands\fi%
}
\def\inlineextras@occitan{%
- \lccode\string"2019=\string"2019
- \ifoccitan@babelshorthands\occitan@shorthands\fi
+ \lccode\string"2019=\string"2019%
+ \ifoccitan@babelshorthands\occitan@shorthands\fi%
}
%% Distributable under the LaTeX Project Public License,
%% version 1.3c or higher (your choice). The latest version of
@@ -13953,12 +19767,7 @@ and may look very wrong.}
% \subsection{gloss-persian.ldf}
% \begin{macrocode}
\ProvidesFile{gloss-persian.ldf}[polyglossia: module for persian]
-\ifluatex
- \xpg@warning{Persian is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
+
\RequireBidi
\RequirePackage{arabicnumbers}
\RequirePackage{farsical}
@@ -14205,21 +20014,21 @@ and may look very wrong.}
\def\noextras@piedmontese{%
- \lccode\string"2019=\z@
- \nopiedmontese@shorthands
- \xpgpms@savedvalues
+ \lccode\string"2019=\z@%
+ \ifpiedmontese@babelshorthands\nopiedmontese@shorthands\fi%
+ \xpgpms@savedvalues%
}
\def\blockextras@piedmontese{%
- \lccode\string"2019=\string"2019
- \clubpenalty=3000 \@clubpenalty=3000 \widowpenalty=3000
- \finalhyphendemerits=50000000
- \ifpiedmontese@babelshorthands\piedmontese@shorthands\fi
+ \lccode\string"2019=\string"2019%
+ \clubpenalty=3000 \@clubpenalty=3000 \widowpenalty=3000%
+ \finalhyphendemerits=50000000%
+ \ifpiedmontese@babelshorthands\piedmontese@shorthands\fi%
}
\def\inlineextras@piedmontese{%
- \lccode\string"2019=\string"2019
- \ifpiedmontese@babelshorthands\piedmontese@shorthands\fi
+ \lccode\string"2019=\string"2019%
+ \ifpiedmontese@babelshorthands\piedmontese@shorthands\fi%
}
%%% CHANGES END %%%
% \end{macrocode}
@@ -14348,10 +20157,8 @@ and may look very wrong.}
% brazilian:
\def\portuguese@variant{brazil}%
\SetLanguageKeys{portuguese}{babelname=brazil,bcp47=pt-BR}%
- \xpg@ifdefined{brazil}{}%
- {\xpg@warning{No hyphenation patterns were loaded for "Portuguese (Brazil)"\MessageBreak
- I will use the standard patterns for Portuguese instead}%
- \adddialect\l@brazil\l@portuges\relax}%
+ % There are no specific brazil patterns
+ \adddialect\l@brazil\l@portuges\relax%
\fi
\xpg@info{Option: portuguese, variant=\xpg@val}%
}{\xpg@warning{Unknown portuguese variant `#1'}}
@@ -14615,19 +20422,26 @@ and may look very wrong.}
\xpg@info{Option: Russian, numerals=\xpg@val}%
}{\xpg@warning{Unknown Russian numerals value `#1'}}
-\define@boolkey{russian}[russian@]{indentfirst}[true]{
- \ifrussian@indentfirst
- \SetLanguageKeys{russian}{indentfirst=true}
- \else
- \SetLanguageKeys{russian}{indentfirst=false}
- \fi
+\define@boolkey{russian}[russian@]{indentfirst}[true]{%
+ \ifrussian@indentfirst
+ \SetLanguageKeys{russian}{indentfirst=true}%
+ \else
+ \SetLanguageKeys{russian}{indentfirst=false}%
+ \fi%
}
\define@boolkey{russian}[russian@]{babelshorthands}[true]{}
+% Force punctuation after heading number
+\define@boolkey{russian}[russian@]{forceheadingpunctuation}[true]{}
+
% Register default options
-\xpg@initialize@gloss@options{russian}{babelshorthands=false,spelling=modern,numerals=arabic,indentfirst=false}
+\xpg@initialize@gloss@options{russian}{babelshorthands=false,
+ spelling=modern,
+ numerals=arabic,
+ indentfirst=true,
+ forceheadingpunctuation=true}
\ifsystem@babelshorthands
@@ -14675,7 +20489,7 @@ and may look very wrong.}
\def\@Ccdash{\leavevmode
\nobreak\cyrdash\nobreak\hskip.35em\ignorespaces}%
\ifx\cyrdash\undefined
- \def\cyrdash{\hbox to.8em{--\hss--}}%
+ \def\cyrdash{\hbox to.8em{\textendash\hss\textendash}}%
\fi
\declare@shorthand{russian}{",}{\nobreak\hskip.2em\ignorespaces}%
}
@@ -14772,39 +20586,47 @@ and may look very wrong.}
\space \number\year\space г.}%
}
-% The following is based on some ideas from ruscor.sty
+% Russian needs trailing dots in all headings
+\def\xpg@save@autodot{}
+\ifdef{\KOMAScript}{%
+ \providecommand*\autodot{}%
+ \let\xpg@save@autodot\autodot%
+}
+
\def\russian@capsformat{%
+ \ifrussian@forceheadingpunctuation%
\ifdef{\KOMAScript}{%
- \ifdef{\chapterformat}{%
- \renewcommand{\chapterformat}{\prechapter\thechapter\postchapter}}{}%
- \ifdef{\sectionformat}{%
- \renewcommand{\sectionformat}{\presection\thesection\postsection}}{}%
- \ifdef{\subsectionformat}{%
- \renewcommand{\subsectionformat}{\presubsection\thesubsection\postsubsection}}{}%
- \ifdef{\subsubsectionformat}{%
- \renewcommand{\subsubsectionformat}{\presubsubsection\thesubsubsection\postsubsubsection}}{}%
- \ifdef{\paragraphformat}{%
- \renewcommand{\paragraphformat}{\preparagraph\theparagraph\postparagraph}}{}%
- \ifdef{\subparagraphformat}{%
- \renewcommand{\subparagraphformat}{\presubparagraph\thesubparagraph\postsubparagraph}}{}%
+ \renewcommand*\autodot{.}%
}{%
+ % The following is based on some ideas from ruscor.sty
\def\@seccntformat##1{\csname pre##1\endcsname%
\csname the##1\endcsname%
\csname post##1\endcsname}%
- }%
- \def\@aftersepkern{\hspace{0.5em}}%
- \def\postchapter{.\@aftersepkern}%
- \def\postsection{.\@aftersepkern}%
- \def\postsubsection{.\@aftersepkern}%
- \def\postsubsubsection{.\@aftersepkern}%
- \def\postparagraph{.\@aftersepkern}%
- \def\postsubparagraph{.\@aftersepkern}%
- \def\prechapter{}%
- \def\presection{}%
- \def\presubsection{}%
- \def\presubsubsection{}%
- \def\preparagraph{}%
- \def\presubparagraph{}%
+ \def\@aftersepkern{\hspace{0.5em}}%
+ \def\postchapter{.\@aftersepkern}%
+ \def\postsection{.\@aftersepkern}%
+ \def\postsubsection{.\@aftersepkern}%
+ \def\postsubsubsection{.\@aftersepkern}%
+ \def\postparagraph{.\@aftersepkern}%
+ \def\postsubparagraph{.\@aftersepkern}%
+ \def\prechapter{}%
+ \def\presection{}%
+ \def\presubsection{}%
+ \def\presubsubsection{}%
+ \def\preparagraph{}%
+ \def\presubparagraph{}%
+ }%
+ \fi%
+}
+
+\def\norussian@capsformat{%
+ \ifrussian@forceheadingpunctuation%
+ \ifdef{\KOMAScript}{%
+ \let\autodot\xpg@save@autodot%
+ }{%
+ \def\@seccntformat##1{\csname the##1\endcsname\quad}% = LaTeX kernel
+ }%
+ \fi%
}
\newcommand{\russiannumerals}[2]{\russiannumber{#2}}
@@ -14879,24 +20701,9 @@ and may look very wrong.}
}
\def\noextras@russian{%
- \ifdef{\KOMAScript}{%
- \ifdef{\chapterformat}{%
- \renewcommand{\chapterformat}{\thechapter\autodot\enskip}}{}%
- \ifdef{\sectionformat}{%
- \renewcommand{\sectionformat}{\thesection\autodot\enskip}}{}%
- \ifdef{\subsectionformat}{%
- \renewcommand{\subsectionformat}{\thesubsection\autodot\enskip}}{}%
- \ifdef{\subsubsectionformat}{%
- \renewcommand{\subsubsectionformat}{\thesubsubsection\autodot\enskip}}{}%
- \ifdef{\paragraphformat}{%
- \renewcommand{\paragraphformat}{\theparagraph\autodot\enskip}}{}%
- \ifdef{\subparagraphformat}{%
- \renewcommand{\subparagraphformat}{\thesubparagraph\autodot\enskip}}{}%
- }{%
- \def\@seccntformat##1{\csname the##1\endcsname\quad}% = LaTeX kernel
- }%
+ \norussian@capsformat%
\ifcyrillic@numerals\norussian@numbers\fi%
- \norussian@shorthands%
+ \ifrussian@babelshorthands\norussian@shorthands\fi%
}
\def\blockextras@russian{%
@@ -15055,12 +20862,6 @@ and may look very wrong.}
% \subsection{gloss-sanskrit.ldf}
% \begin{macrocode}
\ProvidesFile{gloss-sanskrit.ldf}[polyglossia: module for sanskrit]
-\ifluatex
- \xpg@warning{Sanskrit is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
\RequirePackage{devanagaridigits}
@@ -15243,7 +21044,8 @@ and may look very wrong.}
indentfirst=true,
fontsetup=false,
localnumeral=serbiannumerals,
- Localnumeral=Serbiannumerals
+ Localnumeral=Serbiannumerals,
+ babelname=serbian
%TODO localalph
}
@@ -15265,7 +21067,7 @@ and may look very wrong.}
\or
% latin:
\@serbian@cyrfalse
- \SetLanguageKeys{serbian}{scripttag=latn,script=Latin,bcp47=sr-Latn}
+ \SetLanguageKeys{serbian}{scripttag=latn,script=Latin,babelname=serbian,bcp47=sr-Latn}
\xpg@fontsetup@latin{serbian}%
%TODO \def\serbian@language{\language=\l@serbianlat}%
% or should we use Croatian patterns as a fallback for the time being???
@@ -15573,7 +21375,7 @@ and may look very wrong.}
\chardef\slovak@boundary=4095 %
\def\newXeTeXintercharclass{%
\e@alloc\XeTeXcharclass\chardef
- \xe@alloc@intercharclass\m@ne\@ucharclass@boundary}
+ \xe@alloc@intercharclass\m@ne\@ucharclass@boundary}%
\else
\chardef\slovak@boundary=255
\fi
@@ -15602,6 +21404,24 @@ and may look very wrong.}
% Add nonbreakable space after single-letter word to
% prevent them to land at the end of a line
+% vlna code taken and adapted from xevlna.sty
+\ifxetex
+ \def\slovak@nointerchartoks{\let\slovak@interchartoks\slovak@PreCSpreposition}%
+ \def\slovak@PreCSpreposition{%
+ \def\next{}%
+ \ifnum\catcode`\ =10 % nothing will be done in verbatim
+ \ifmmode % nothing in math
+ \else
+ \let\slovak@interchartoks\slovak@nointerchartoks
+ \let\next\slovak@ExamineCSpreposition
+ \fi\fi
+ \next%
+ }%
+ \def\slovak@ExamineCSpreposition #1{#1\futurelet\next\slovak@ProcessCSpreposition}%
+ \def\slovak@ProcessCSpreposition{\ifx\next\slovak@XeTeXspace\nobreak\fi}%
+ \futurelet\slovak@XeTeXspace{ }\slovak@nointerchartoks
+\fi
+
\def\slovak@vlna{%
\ifluatex
\preventsingleon
@@ -15628,21 +21448,8 @@ and may look very wrong.}
\XeTeXcharclass `\a \slovak@nonsyllabicpreposition
\XeTeXcharclass `\I \slovak@nonsyllabicpreposition
\XeTeXcharclass `\i \slovak@nonsyllabicpreposition
- \XeTeXinterchartoks \slovak@boundary \slovak@nonsyllabicpreposition {\slovak@interchartoks}
- \XeTeXinterchartoks \slovak@openpunctuation \slovak@nonsyllabicpreposition {\slovak@interchartoks}
- \def\slovak@nointerchartoks{\let\slovak@interchartoks\slovak@PreCSpreposition}
- \def\slovak@PreCSpreposition{\def\next{}%
- \ifnum\catcode`\ =10 % nothing will be done in verbatim
- \ifmmode % nothing in math
- \else
- \let\slovak@interchartoks\slovak@nointerchartoks
- \let\next\slovak@ExamineCSpreposition
- \fi \fi
- \next%
- }
- \def\slovak@ExamineCSpreposition ##1{##1\futurelet\next\slovak@ProcessCSpreposition}
- \def\slovak@ProcessCSpreposition{\ifx\next\slovak@XeTeXspace\nobreak\fi}
- \futurelet\slovak@XeTeXspace{ }\slovak@nointerchartoks
+ \XeTeXinterchartoks \slovak@boundary \slovak@nonsyllabicpreposition {\slovak@interchartoks}%
+ \XeTeXinterchartoks \slovak@openpunctuation \slovak@nonsyllabicpreposition {\slovak@interchartoks}%
\fi
}
@@ -15708,7 +21515,7 @@ and may look very wrong.}
}
\def\noextras@slovak{%
- \noslovak@shorthands%
+ \ifslovak@babelshorthands\noslovak@shorthands\fi%
\noslovak@hyphens%
\noslovak@vlna%
\ifxetex\XeTeXinterchartokenstate=0\fi%
@@ -16348,12 +22155,7 @@ and may look very wrong.}
% \subsection{gloss-syriac.ldf}
% \begin{macrocode}
\ProvidesFile{gloss-syriac.ldf}[polyglossia: module for syriac]
-\ifluatex
- \xpg@warning{Syriac is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
+
\RequireBidi
\RequirePackage{arabicnumbers}
@@ -16537,12 +22339,7 @@ and may look very wrong.}
% \subsection{gloss-tamil.ldf}
% \begin{macrocode}
\ProvidesFile{gloss-tamil.ldf}[polyglossia: module for tamil]
-\ifluatex
- \xpg@warning{Tamil is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
+
% Translations provided by Kevin & Siji, 01-11-2009
\PolyglossiaSetup{tamil}{
@@ -16608,12 +22405,7 @@ and may look very wrong.}
% \subsection{gloss-telugu.ldf}
% \begin{macrocode}
\ProvidesFile{gloss-telugu.ldf}[polyglossia: module for telugu]
-\ifluatex
- \xpg@warning{Telugu is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
+
% Translations provided by Anmol Sharma <unmole.in@gmail.com>
\PolyglossiaSetup{telugu}{
@@ -16691,12 +22483,6 @@ and may look very wrong.}
%%%% Thai Linux Working Group
%%%% http://linux.thai.net/
%%%%
-\ifluatex
- \xpg@warning{Thai is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
\PolyglossiaSetup{thai}{
bcp47=th,
script=Thai,
@@ -17286,7 +23072,7 @@ and may look very wrong.}
\def\@Ccdash{\leavevmode
\nobreak\cyrdash\nobreak\hskip.35em\ignorespaces}%
\ifx\cyrdash\undefined
- \def\cyrdash{\hbox to.8em{--\hss--}}
+ \def\cyrdash{\hbox to.8em{\textendash\hss\textendash}}%
\fi
\declare@shorthand{ukrainian}{",}{\nobreak\hskip.2em\ignorespaces}%
}
@@ -17364,7 +23150,7 @@ and may look very wrong.}
\def\ukrainiannumber#1{%
\ifcyrillic@numerals
\ifcyrillic@asbuk@numerals
- \serbian@asbuk@alph{#1}%
+ \ukrainian@asbuk@alph{#1}%
\else
\cyr@alph{#1}%
\fi
@@ -17376,7 +23162,7 @@ and may look very wrong.}
\def\Ukrainiannumber#1{%
\ifcyrillic@numerals
\ifcyrillic@asbuk@numerals
- \serbian@asbuk@Alph{#1}%
+ \ukrainian@asbuk@Alph{#1}%
\else
\cyr@Alph{#1}%
\fi
@@ -17396,25 +23182,29 @@ and may look very wrong.}
% This is a poor man's cyrillic alphanumeric. It just uses the alphabet and
% thus ends at 30.
-\def\ukranian@asbuk@Alph#1{\ifcase#1\or
+\def\ukrainian@asbuk@Alph#1{\ifcase#1\or
А\or Б\or В\or Г\or Д\or Е\or Ж\or
З\or И\or К\or Л\or М\or Н\or О\or
П\or Р\or С\or Т\or У\or Ф\or Х\or
Ц\or Ч\or Ш\or Щ\or Э\or Ю\or Я%
- \else\xpg@ill@value{#1}{ukranian@asbuk@Alph}\fi%
+ \else\xpg@ill@value{#1}{ukrainian@asbuk@Alph}\fi%
}
-\def\ukranian@asbuk@alph#1{\ifcase#1\or
+\def\ukrainian@asbuk@alph#1{\ifcase#1\or
а\or б\or в\or г\or д\or е\or ж\or
з\or и\or к\or л\or м\or н\or о\or
п\or р\or с\or т\or у\or ф\or х\or
ц\or ч\or ш\or щ\or э\or ю\or я%
- \else\xpg@ill@value{#1}{ukranian@asbuk@alph}\fi%
+ \else\xpg@ill@value{#1}{ukrainian@asbuk@alph}\fi%
}
\def\ukrainian@numbers{%
- \let\@Alph\ukrainian@Alph%
- \let\@alph\ukrainian@alph%
+ \ifcyrillic@numerals
+ \def\ukrainian@alph##1{\expandafter\ukrainiannumeral\expandafter{\the##1}}%
+ \def\ukrainian@Alph##1{\expandafter\Ukrainiannumeral\expandafter{\the##1}}%
+ \let\@Alph\ukrainian@Alph%
+ \let\@alph\ukrainian@alph%
+ \fi
}
\def\noukrainian@numbers{%
@@ -17425,13 +23215,13 @@ and may look very wrong.}
\def\noextras@ukrainian{%
\def\@seccntformat##1{\csname the##1\endcsname\quad}% = LaTeX kernel
\ifcyrillic@numerals\noukrainian@numbers\fi
- \noukrainian@shorthands%
+ \ifukrainian@babelshorthands\noukrainian@shorthands\fi%
}
\def\blockextras@ukrainian{%
\ukrainian@capsformat%
- \ifcyrillic@numerals\ukrainian@numbers\fi
- \ifukrainian@babelshorthands\ukrainian@shorthands\fi
+ \ifcyrillic@numerals\ukrainian@numbers\fi%
+ \ifukrainian@babelshorthands\ukrainian@shorthands\fi%
}
\def\inlineextras@ukrainian{%
@@ -17486,12 +23276,7 @@ and may look very wrong.}
% \begin{macrocode}
%%% Adapted from a file contributed by Kamal Abdali
\ProvidesFile{gloss-urdu.ldf}[polyglossia: module for Urdu]
-\ifluatex
- \xpg@warning{Urdu is not supported with LuaTeX.\MessageBreak
-I will proceed with the compilation, but\MessageBreak
-the output is not guaranteed to be correct\MessageBreak
-and may look very wrong.}
-\fi
+
\RequireBidi
\RequirePackage{arabicnumbers}
\RequirePackage{hijrical}
@@ -18759,21 +24544,21 @@ local left_bracket_chars = {
-- all right bracket characters, referenced by their Unicode slot
local right_bracket_chars = {
- [0x29] = true, -- right parenthesis
- [0x5D] = true, -- right square bracket
- [0x7D] = true, -- right curly bracket
+ [0x29] = true, -- right parenthesis
+ [0x5D] = true, -- right square bracket
+ [0x7D] = true, -- right curly bracket
[0x27E9] = true -- mathematical right angle bracket
}
-- question and exclamation marks, referenced by their Unicode slot
local question_exclamation_chars = {
- [0x21] = true, -- exclamation mark !
- [0x3F] = true, -- question mark ?
+ [0x21] = true, -- exclamation mark !
+ [0x3F] = true, -- question mark ?
[0x203C] = true, -- double exclamation mark ‼
[0x203D] = true, -- interrobang ‽
[0x2047] = true, -- double question mark ⁇
[0x2048] = true, -- question exclamation mark ⁈
- [0x2049] = true, -- exclamation question mark ⁉
+ [0x2049] = true -- exclamation question mark ⁉
}
-- from nodes-tst.lua, adapted
@@ -18899,9 +24684,12 @@ local function process(head)
if id == glyph_code then
local attr = has_attribute(current, punct_attr)
if attr then
- local char = utf8.char(current.char) -- requires Lua 5.3
- local leftspace = left_space[attr][char]
- local rightspace = right_space[attr][char]
+ local char, leftspace, rightspace
+ if current.char <= 0x10FFFF then -- greater values may cause problems with utf8.char
+ char = utf8.char(current.char)
+ leftspace = left_space[attr][char]
+ rightspace = right_space[attr][char]
+ end
if leftspace or rightspace then
local fontparameters = fonts.hashes.parameters[current.font]
local unit, stretch, shrink, spacing_node
@@ -18909,14 +24697,14 @@ local function process(head)
local prev = getprev(current)
local space_exception = false
if prev then
- local prevprev = getprev(prev)
-- do not add space after left (opening) bracket and between question/exclamation marks
space_exception = someleftbracket(prev) or question_exclamation_sequence(prev, current)
- if somespace(prev) then
-- TODO: there is a question here: do we override a preceding space or not?...
- if somepenalty(prevprev, 10000) then
- head = remove_node(head, prevprev)
- end
+ while somespace(prev) do
+ head = remove_node(head, prev)
+ prev = getprev(current)
+ end
+ if somepenalty(prev, 10000) then
head = remove_node(head, prev)
end
end
@@ -18946,10 +24734,10 @@ local function process(head)
space_exception = somerightbracket(next)
local nextnext = getnext(next)
if somepenalty(next, 10000) and somespace(nextnext) then
- head = remove_node(head, next)
- head = remove_node(head, nextnext)
- elseif somespace(next) then
- head = remove_node(head, next)
+ head, next = remove_node(head, next)
+ end
+ while somespace(next) do
+ head, next = remove_node(head, next)
end
end
if rightspace.unit == "quad" then
@@ -19362,58 +25150,109 @@ polyglossia.newloader_loaded_languages = newloader_loaded_languages
% \Finale
%
% \iffalse
-%<*../README>
+%<*Changelog>
+1.51 (08-12-2020)
- ¦----------------------------------------------¦
- ¦ ¦
- ¦ THE POLYGLOSSIA PACKAGE v1.48 ¦
- ¦ ¦
- ¦ Modern multilingual typesetting ¦
- ¦ with XeLaTeX and LuaLaTeX ¦
- ¦ ¦
- ¦----------------------------------------------¦
+New features:
+ * New option "frenchpart" for French (#458).
+ * New option "splithyphens" for Croatian (#454).
-This package provides an alternative to Babel for users of XeLaTeX and LuaLaTeX
-(with a few languages incompletely supported for the latter). This version
-includes support for over 70 different languages, some of which in different
-regional or national varieties, or using a different writing system.
+Bug fixes:
-Polyglossia makes it possible to automate the following tasks:
+ * Use new LaTeX core hooks rather than filehook package. This fixes
+ a recent breakage of filehook with other external packages (#453).
+ * Remove very old code that pretends polyglossia is babel (#455).
+ * Fix spelling of Albanian contentsname (#456).
+ * Fix part heading modification in French (#458).
+ * Fix extra space in Hebrew (#459).
+ * Register main polyglossia language earlier (#461).
+ * Allow for hyphenations in words following opening guillemet in French
+ with XeTeX (#462).
-* Loading the appropriate hyphenation patterns.
-* Setting the script and language tags of the current font (if possible and
- available), using the package fontspec.
-* Switching to a font assigned by the user to a particular script or language.
-* Adjusting some typographical conventions in function of the current language
- (such as afterindent, frenchindent, spaces before or after punctuation marks,
- etc.).
-* Redefining the document strings (like “chapter”, “figure”, “bibliography”).
-* Adapting the formatting of dates (for non-gregorian calendars via external
- packages bundled with polyglossia: currently the Hebrew, Islamic and Farsi
- calendars are supported).
-* For languages that have their own numeration system, modifying the formatting
- of numbers appropriately.
-* Ensuring the proper directionality if the document contains languages
- written from right to left (via the packages bidi and luabidi, available
- separately).
-LICENSE
+1.50a (15-10-2020)
-Copyright (c) 2008-2010 François Charette, 2013 Élie Roux, 2011-2020 Arthur Reutenauer,
-Copyright (c) 2019-2020 Bastien Roucariès, 2019-2020 Jürgen Spitzmüller
+Bug fixes:
-Except where otherwise noted, Polyglossia is placed under the terms of the MIT licence
-(https://opensource.org/licenses/MIT).
+ * Assure \autodot is defined with \KOMAScript in Russian.
-BUGS
+1.50 (09-10-2020)
+
+New features:
+
+ * Polyglossia now uses the Harfbuzz renderer by default with LuaTeX
+ output. This brings LuaTeX on par with XeTeX for all scripts (#337).
+ The renderer can be changed via the new global luatexrenderer option.
+ * The (previously inadvertently working) hyphenrules environment that ceased
+ to work after a recent babel update is back and now officially supported.
+ The environment now also supports language options and aliases (#427).
+ * New command \setlanghyphenmins to adapt hyphenation thresholds of languages
+ and varieties.
+ * New command \abjadalph for Arabic with corresponding option (#431).
+ * Replace consecutive glues around punctuation by the correct amount of space
+ with LuaLaTeX for French, ecclesiastic Latin, and Sanskrit (#437).
+
+Bug fixes:
+
+ * Remove warning about missing Brazil patterns (#404).
+ * Fix incompatibility with recent babel release (#408).
+ * Fixed some spellings in Marathi (#409).
+ * Fix spacing of geminating dot in Catalan (#410).
+ * Fix incompatibility of Marathi with Beamer.
+ * Correct \partname in Hindi (#416).
+ * Updates and improvements to Kurdish (#418).
+ * Only activate shorthand character if babelshorthands is true (#421).
+ * Fix whitespace issue in Czech and Slovak with vlna=true (#423).
+ * Fix whitespace issue in Danish (#424).
+ * Fix catcode conflicts that might occur in language definition files
+ f. ex. when loaded from a LaTeX3 class (#67, #425).
+ * Robustify font family switches (#428).
+ * Fix whitespace issue in Russian indentfirst option (#433).
+ * In Russian, indentfirst is now again default (#434).
+ * Fix LaTeX error with arabic numbering in Ukrainian (#440).
+ * Fix directionality after Hebrew decimal numbers (#441).
+ * Fix babelname of Latin Serbian (#442).
+ * Fix recording of secondary languages in \xpg@bloaded and \xpg@bcp@loaded
+ lists (#443).
+ * Simplify and robustify section heading modification in Russian
+ and introduce option forceheadingpunctuation (#444).
+ * Fix Cyrillic dash (via babelshorthand "---) when TeX ligatures
+ are disabled (#445)
+ * Fix problem with large character indices in Lua module for punctuation
+ spacing
+
+Interface and defaults changes:
+
+ * Polyglossia now uses the Harfbuzz renderer by default with LuaTeX
+ output. See new features section.
+
+Build fixes:
+
+ * Fix a bug in the dtx build script which was the reason for an utterly
+ incomplete polyglossia.dtx file (#420).
+
+Documentation improvements:
+ * Document how to change \lefthyphenmin and \righthyphenmin for a language
+ (#435).
+
+
+1.49 (08-04-2020)
+
+New features:
+
+ * Add hook \polyglossia@language@switched to the external package interface (#398).
+ * Real fix for #400, that wasn’t properly taken care of in 1.48.
+
+Bug fixes:
+
+ * Fix compilation error with some swapstring options in Hungarian (#373).
+ * Fix whitespace problem in Greek language.
+
+Interface and defaults changes:
+
+ * Changed Finnish caption for "Table of Contents" to "Sisällys" (#403).
-If you run into a bug, or suspect you do, or you have a request or comment, please
-use the GitHub issue tracker: http://github.com/reutenauer/polyglossia/issues
-This is more efficient than contacting the maintainer by email as it allows me
-to track the issues and follow progress.
-%</../README>
-%<*Changelog>
1.48 (25-03-2020)
No new features
diff --git a/Master/texmf-dist/source/latex/polytable/polytable.dtx b/Master/texmf-dist/source/latex/polytable/polytable.dtx
index fb9219492bf..e44bd03f576 100644
--- a/Master/texmf-dist/source/latex/polytable/polytable.dtx
+++ b/Master/texmf-dist/source/latex/polytable/polytable.dtx
@@ -2,18 +2,21 @@
%<*driver>
\ProvidesFile{polytable.drv}
\documentclass{ltxdoc}
+\usepackage[T1]{fontenc}
+\usepackage[utf8]{inputenc}
+\usepackage{lmodern}
\usepackage[info]{polytable}
\begin{document}
\DocInput{polytable.dtx}
\end{document}
%</driver>
%
-% Copyright (C) 2003--2013 by Andres Loeh
+% Copyright (C) 2003--2020 by Andres Loeh
%
% \fi
%
% \ProvidesFile{polytable.dtx}
-% [2013/07/08 v0.8.5 `polytable' package (Andres Loeh)]
+% [2020/07/14 v0.8.6 `polytable' package (Andres Loeh)]
% \GetFileInfo{polytable.dtx}
%
% \title{The \textsf{polytable} package}
@@ -53,6 +56,7 @@
% \changes{v0.8.4}{2009/11/01}{Make ptb output more stable.}
% \changes{v0.8.5}{2013/07/18}{Work around lazylist name clash
% with unicode-math.}
+% \changes{v0.8.6}{2020/07/14}{Fix bug with column command redefinitions.}
%
% \section{Introduction}
%
@@ -83,10 +87,10 @@
% The strength of this approach is that it implicitly handles
% cases where different lines have different alignment properties.
% Not all column names have to occur in all lines.
-%
+%
% \section{A complete example}
%
-% Figure~\ref{tab:example}
+% Figure~\ref{tab:example}
% is an example that is designed to show the
% capabilities of this package. In particular, it is \emph{not}
% supposed to look beautiful.
@@ -95,7 +99,7 @@
% \centering
% \begin{ptboxed}
% \defaultcolumn{l|}\column{.}{|l|}
-% \> left
+% \> left
% \=3 first of three \> second of three \> third of three
% \=r right \\
% \defaultcolumn{r|}\> left \=2 middle 1/2 \> middle 2/2 \=r right \\
@@ -112,8 +116,8 @@
% some text on the left and on the right, but the middle part
% follows two different patterns: the first and the third line
% have three middle columnss that should be aligned, the second
-% and the fourth line have two (right-aligned) middle columns
-% that should be aligned, but otherwise independent of the three
+% and the fourth line have two (right-aligned) middle columns
+% that should be aligned, but otherwise independent of the three
% middle columns in the other lines.
%
% Vertical bars are used to clarify where one column ends and
@@ -131,7 +135,7 @@
% \begin{verbatim}
% \begin{ptboxed}
% \defaultcolumn{l|}\column{.}{|l|}
-% \> left
+% \> left
% \=3 first of three \> second of three \> third of three
% \=r right \\
% \defaultcolumn{r|}\> left \=2 middle 1/2 \> middle 2/2 \=r right \\
@@ -144,7 +148,7 @@
% First, columns are declared, including the vertical lines.
% Note that there is a final column |end| being declared
% that is only used as the end column in the |\fromto| statements.
-% A future version of this package
+% A future version of this package
% will probably get rid of the need to define
% such a column.
% After the column definitions, the lines are typeset by a
@@ -265,7 +269,7 @@
%
% With lhs2\TeX, there is now a preprocessor available that preserves
% the source code's internal alignment by mapping the output onto
-% \textsf{polytable}'s environments.
+% \textsf{polytable}'s environments.
% Figure~\ref{tab:haskell} is an example of how
% the output of lhs2\TeX\ might look like.
%
@@ -308,7 +312,7 @@
% \column{rel}{c}
% \column{rhs}{l}
% \>[left] \CLASS\ (\Eq\TA)\Rightarrow\Ord\TA\WHERE \\
-% \>[left] \qquad\
+% \>[left] \qquad\
% \>[body] \HsVar{compare}
% \>[rel] ::
% \>[rhs] \TA\rightarrow\TA\rightarrow\HsCon{Ordering} \\
@@ -402,7 +406,7 @@
% \textsf{lazylist} package, which provides an implementation of
% the lambda calculus using fully expandable control sequences.
% Unfortunately, |lazylist.sty| is not included in most common
-% \TeX\ distributions, so you might need to fetch it from CTAN
+% \TeX\ distributions, so you might need to fetch it from CTAN
% separately.
%
% \section{Reference}
@@ -420,7 +424,7 @@
% must be declared.
%
% \DescribeMacro{\defaultcolumn}
-% Using a statement of the form
+% Using a statement of the form
% |\defaultcolumn{|\meta{spec}|}|, implicit columns can
% be activated. All undefined columns that are encountered
% will be assumed to have format string \meta{spec}.
@@ -438,7 +442,7 @@
% The environment |pboxed|
% typesets the material in boxes of the calculated length, but in
% normal paragraph mode. The advantage is that
-% there can be page breaks within the table.
+% there can be page breaks within the table.
% Note that you should start a new (probably nonindented)
% paragraph before beginning a |pboxed|. All lines that a |pboxed|
% produces are of equal length, so it should be possible to center
@@ -448,7 +452,7 @@
% pre-wrapped in a |tabular| or |array| environment,
% respectively, and
% thus not page-breakable but less fragile (or should I just
-% say: easier to use) than the unwrapped |pboxed|.
+% say: easier to use) than the unwrapped |pboxed|.
% With those, there
% is no need for |ptabular| and |parray| anymore --
% which were directly based on (and translated into) usual
@@ -485,7 +489,7 @@
% document, and destroy your layout.
%
% \DescribeMacro{\column}
-% With |\column[|\meta{dimen}|]{|\meta{columnid}|}{|\meta{spec}|}|,
+% With |\column[|\meta{dimen}|]{|\meta{columnid}|}{|\meta{spec}|}|,
% a new column
% \meta{columnid} is specified. The name of the column can be
% any sequence of alphanumerical characters. The \meta{spec} is
@@ -493,12 +497,12 @@
% the same constructs that can be used in format strings of normal
% tables or arrays.
% However, it must only contain the description for \emph{one}
-% column.
+% column.
%
-% As long as the save/restore feature (explained below) is not used,
+% As long as the save/restore feature (explained below) is not used,
% |\column| definitions are local to one table.
% One can define a column multiple times within one table:
-% a warning will be produced,
+% a warning will be produced,
% and the second format string will be used for the complete table.
%
% Columns must be defined before use when implicit columns using
@@ -565,7 +569,7 @@
%
% \DescribeMacro{\\}
% \DescribeMacro{\nextline}
-% The command |\\| (or, now deprecated, |\nextline|) ends one line
+% The command |\\| (or, now deprecated, |\nextline|) ends one line
% and begins the next.
% There is no need to end the last line. One can pass an optional
% argument, as in |\\[|\meta{dimen}|]|, that will add
@@ -576,11 +580,11 @@
% The contents of the table are processed multiple times because
% the widths of the entries are measured. Global assignments that
% modify registers and similar things can thus result in unexpected
-% behaviour.
+% behaviour.
% New in v0.7: \LaTeX\ counters (i.e., counters defined by
% |\newcounter|) are protected now. They will be reset after
% each of the trial runs.
-%
+%
% \subsection{Saving column width information}
%
% Sometimes, one might want to reuse not only the same column, but
@@ -654,7 +658,7 @@
% \fromto{rel}{rhs}{::}
% \fromto{rhs}{end}{\TA\rightarrow\TA\rightarrow\HsCon{Bool}}
% \\[1ex]
-% \fromto{body}{end}{\mbox{--- Minimal complete definition:
+% \fromto{body}{end}{\mbox{--- Minimal complete definition:
% $(\leq)$ or $\HsVar{compare}$}}
% \\
% \fromto{body}{end}{\mbox{--- using $\HsVar{compare}$ can be more efficient
@@ -667,7 +671,7 @@
% of the class methods have default definitions. First, we can
% define $\HsVar{compare}$ in terms of $(\leq)$. The result type
% of $\HsVar{compare}$ is an $\HsCon{Ordering}$, a type consisting
-% of only three values: $\HsCon{EQ}$ for ``equality'',
+% of only three values: $\HsCon{EQ}$ for ``equality'',
% $\HsCon{LT}$ for ``less than'', and $\HsCon{GT}$ for ``greater
% than''.
%
@@ -749,7 +753,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{polytable}%
- [2013/07/18 v0.8.5 `polytable' package (Andres Loeh)]
+ [2020/07/14 v0.8.6 `polytable' package (Andres Loeh)]
% \end{macrocode}
% New in v0.7.2:
% The \textsf{amsmath} package clashes with \textsf{lazylist}:
@@ -864,7 +868,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
-%
+%
% \begin{macro}{\PT@debug}
% \begin{macro}{\PT@info}
% \begin{macro}{\PT@debug@}
@@ -909,7 +913,7 @@
\else
\PT@aligndim@#1#2#3\space\space\space\space\space\space\space\space\@@
\fi}
-
+
\def\PT@aligndim@#1.#2#3#4#5#6#7#8#9\@@{%
\ifnum#1<10 \space\fi
\ifnum#1<100 \space\fi
@@ -964,7 +968,7 @@
\def\PT@listopmacro #1#2#3% #1 #3 to the list #2
{\def\PT@temp{#1{#3}}%
\expandafter\expandafter\expandafter
- \def\expandafter\expandafter\expandafter
+ \def\expandafter\expandafter\expandafter
#2\expandafter\expandafter\expandafter
{\expandafter\PT@temp\expandafter{#2}}}
@@ -1156,7 +1160,7 @@
% \end{macrocode}
% \end{macro}
% \begin{macro}{\PT@getwidths}
-% Here, we make as many test runs as are necessary to
+% Here, we make as many test runs as are necessary to
% determine the correct column widths.
% \begin{macrocode}
\def\PT@getwidths
@@ -1210,7 +1214,7 @@
% After the first run, we print extra information.
% We use the contents of the macro |\column| to check
% whether we are in the first run, because it will be
-% reset below for all other runs to do nothing.
+% reset below for all other runs to do nothing.
% \begin{macrocode}
\ifx\column\PT@otherrun@column
\else
@@ -1225,7 +1229,16 @@
% Therefore, we make sure that the |\column| command
% won't do much in the other runs. Also, saving and
% restoring columns is no longer needed.
+%
+% Note that redefining just |\column| or just
+% |\PT@firstrun@column| is not enough. In the former
+% case, on the next trial run, |\PT@getwidths| will
+% restore the old definition. In the latter case, if
+% there is no additional trial run, the typesetting
+% run will be performed with the wrong definition.
+% TODO: I think similar issues exist with saving/restoring?
% \begin{macrocode}
+ \let\column \PT@otherrun@column
\let\PT@firstrun@column \PT@otherrun@column
\let\savecolumns \PT@gobbleoptional
\let\restorecolumns \PT@gobbleoptional
@@ -1345,7 +1358,7 @@
% \end{macrocode}
% The array environments keep each line in a group; therefore
% |\PT@resetcolumn|, when executed during the linebreak, will
-% not affect the current column counters. By having
+% not affect the current column counters. By having
% |\PT@resetcolumn| before entering the environment, we ensure
% that the group reset will have the correct effect anyway.
% \begin{macrocode}
@@ -1353,7 +1366,7 @@
% \end{macrocode}
% Now we start the tabular environment with the
% computed preamble. We redefine the |\\| to whatever
-% the environment dictates.
+% the environment dictates.
% \begin{macrocode}
\PT@begin%
% \end{macrocode}
@@ -1362,7 +1375,7 @@
\the\PT@toks
\PT@fill% new in 0.7.3: balance the last line
% \end{macrocode}
-% End the array, close the group, close the environment.
+% End the array, close the group, close the environment.
% We are done!
% \begin{macrocode}
\PT@finalize% finalize the queue (possibly close file)
@@ -1384,7 +1397,7 @@
% The macro |\PT@from| is bound to |\=| in a polytable environment,
% and used to move to the named column specified by its argument. The
% previous column is closed. The variant |\PT@fromopt| is bound to
-% |\>| and takes an optional argument instead of a mandatory, which defaults
+% |\>| and takes an optional argument instead of a mandatory, which defaults
% to the current column name followed by a single dot |.|. We use an
% empty default which is then redefined to make it easier for the
% user to use the default definition (TODO: explain better).
@@ -1590,7 +1603,7 @@
% \begin{macrocode}
\@ifundefined{PT@col@#2.max}%
{\@namedef{PT@col@#2.max}{#1}%
- \expandafter\let\csname PT@col@#2.trusted\endcsname\PT@true}{}%
+ \expandafter\let\csname PT@col@#2.trusted\endcsname\PT@true}{}%
\ignorespaces}
% \end{macrocode}
% \end{macro}
@@ -1809,7 +1822,7 @@
% \end{macro}
%
% \begin{macro}{\PT@TeXif}
-% This is an improved version of \textsf{lazylist}'s |\TeXif|.
+% This is an improved version of \textsf{lazylist}'s |\TeXif|.
% It does have an additional |\relax| to terminate the condition.
% The |\relax| is gobbled again to keep it fully expandable.
% \begin{macrocode}
@@ -1871,7 +1884,7 @@
\edef\PT@currentcol{\Head{\Tail\PT@sortedlist}}%
\fi
\edef\PT@currentcol@{\PT@StripColumn\PT@currentcol}%
- \PT@typeout@{adding implicit fromto at eol from \PT@currentcol@
+ \PT@typeout@{adding implicit fromto at eol from \PT@currentcol@
\space to \PT@lastcol@}%
\PT@expanded{\PT@expanded\fromto\PT@currentcol@}\PT@lastcol@
\fi
@@ -1958,8 +1971,8 @@
% we want it set normally dugin |\PT@preparescan|.
% \begin{macrocode}
\def\PT@preparescan#1#2%
-% First, we check that both columns are defined. This will
-% actually define the columns if implicit column definitions are
+% First, we check that both columns are defined. This will
+% actually define the columns if implicit column definitions are
% enabled.
% \begin{macrocode}
{\PT@checkcoldefined{#1}%
@@ -1996,7 +2009,7 @@
% We split the preamble at the position of the |\@sharp|, using
% some tricks to make sure that there really is precisely one
% occurrence of |\@sharp| in the resulting preamble code, and
-% producing an error otherwise. The splitting defines
+% producing an error otherwise. The splitting defines
% |\PT@pre@preamble| and |\PT@post@preamble|. With those and
% the computed |\PT@colwidth|, the scan is successfully prepared.
% \begin{macrocode}
@@ -2078,10 +2091,10 @@
% can check whether all untrusted widths are conditionally trusted.
%
% We write the final, the maximum widths, into the auxiliary file.
-% We perform the
+% We perform the
% write operation when we are sure that a specific set is
% no longer used. This is the case when we save a new set under the
-% same name, or at the end of the document. The command
+% same name, or at the end of the document. The command
% |\PT@verifywidths| takes care of this procedure.
% This command will also check if a rerun is necessary, and issue
% an appropriate warning if that should be the case.
@@ -2292,7 +2305,7 @@
\PT@typeout@{Verification for #2 successful.}}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}{\PT@save@table}
% Here we prepare to write maximum column widths to the
% |.aux| file.
diff --git a/Master/texmf-dist/source/latex/ms/prelim2e.dtx b/Master/texmf-dist/source/latex/prelim2e/prelim2e.dtx
index e0a4b812b9d..fad93426b36 100644
--- a/Master/texmf-dist/source/latex/ms/prelim2e.dtx
+++ b/Master/texmf-dist/source/latex/prelim2e/prelim2e.dtx
@@ -1,115 +1,88 @@
+% \iffalse meta-comment
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Copyright (C) Martin Schröder, 1994–2001
+% Marei Peischl (peiTeX) <marei@peitex.de>, 2020
+%
+% 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
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is
+% Marei Peischl <marei@peitex.de>.
+%
+% This work consists of the files
+% README.md
+% prelim2e.dtx
+% prelim2e.ins
+% and the derived files
+% prelim2e.sty
+% prelim2e.pdf
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \fi
% \changes{v1.01}{1995/05/02}{Date added to \cs{NeedsTeXFormat}}
+% \changes{v2.00}{2020/11/24}{Complete rework to use the kernel methods instead of everyshi}
% \iffalse
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-%<package>\ProvidesPackage{prelim2e}
-%<package> [2009/05/29 v1.3 prelim2e Package (MS)]
+%<package>\ProvidesExplPackage{prelim2e}
+%<package> {2020/11/24}{2.0}{prelim2e Package}
%
%<*driver>
\ProvidesFile{prelim2e.drv}
- [2009/05/29 v1.3 Driver for prelim2e Package (MS)]
-\documentclass[a4paper]{ltxdoc}
-\usepackage[T1]{fontenc}
+ [2020/11/24 v2.0 Driver for prelim2e Package]
+\documentclass{l3doc}
\usepackage{url}
-\usepackage[toc]{multitoc}
-\usepackage{lmodern,microtype,svn}
-\usepackage{hypdoc}
+\DeclareUrlCommand\CTANlink{\def\UrlLeft{CTAN:\space}\def\UrlRight{}\urlstyle{tt}}
\usepackage{geometry}
\usepackage[scrtime]{prelim2e}
\GetFileInfo{prelim2e.sty}
\EnableCrossrefs
\RecordChanges % Gather update information
%%\DisableCrossrefs% Say \DisableCrossrefs if index is ready
-\CodelineIndex % Index code by line number
-%\OnlyDescription % comment out for implementation details
+\OnlyDescription % comment out for implementation details
%%\OldMakeIndex % use if your MakeIndex is pre-v2.9
\setcounter{IndexColumns}{2}
+\oddsidemargin=2cm
+\marginparwidth=2.5cm
% onecolumn glossary
-\makeatletter
- \renewenvironment{theglossary}{%
- \glossary@prologue
- \setlength\emergencystretch{5em}
- \GlossaryParms \let\item\@idxitem \ignorespaces}{}
-\makeatother
-\setlength{\IndexMin}{40ex}
-\setlength{\columnseprule}{.4pt}
-\addtolength{\oddsidemargin}{2cm}
-\addtolength{\textwidth}{-2cm}
\begin{document}
\DocInput{prelim2e.dtx}
- \PrintIndex\PrintChanges
- % Make sure that the index is not printed twice
- % (ltxdoc.cfg might have a second \PrintIndex command)
- \let\PrintChanges\relax
- \let\PrintIndex\relax
\end{document}
%</driver>
+% \fi
%
-% Copyright (C) 1995..2009 by Martin Schr\"oder.
-%
-% 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
-% http://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 Martin Schröder
+% \CheckSum{104}
%
-% This work consists of the files prelim2e.dtx and prelim2e.ins
-% and the derived files prelim2e.sty
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
%
-% \fi
%
-% \CheckSum{129}
-%
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
-%%
-%% \iffalse meta-comment
-%% ===================================================================
-%% @LaTeX-package-file{
-%% author = {Martin Schr\"oder},
-%% version = "1.3",
-%% date = "29 May 2009",
-%% filename = "prelim2e.sty",
-%% address = {Martin Schr\"oder
-%% Barmer Stra\"se 14
-%% 44137 Dortmund
-%% Germany},
-%% telephone = "+49-231-1206574",
-%% email = "martin@oneiros.de",
-% codetable = "ISO/ASCII",
-% keywords = "LaTeX2e, preliminary versions, versions",
-% dependences = "everyshi, scrtime",
-% supported = "yes",
-%% docstring = "LaTeX package which allows the marking of
-%% preliminary versions of a document."
-%% }
-%% ===================================================================
-%% \fi
-%
-% \SVN $Rev: 1374 $
-% \SVNdate $Date: 2009-05-30 22:23:36 +0200 (Sa, 30. Mai 2009) $
%
% \renewcommand{\PrelimWords}{^^A
% \package{prelim2e} package --
-% Version \fileversion (\SVNRev) --
+% Version \fileversion --
% Documentation \LaTeX{}ed^^A
% }
%
@@ -134,15 +107,8 @@
%
% \title{\unskip
% The \package{prelim2e} package^^A
-% \thanks{^^A
-% The version number of this file is \fileversion, subversion
-% revision~\#\SVNRev, last revised \protect\SVNDate.}^^A
% }
-% \author{Martin Schr\"oder\\[0.5ex]
-% \normalsize Barmer Stra\ss{}e 14\\
-% \normalsize 44137 Dortmund\\
-% \normalsize Germany\\
-% \normalsize \href{mailto:martin@oneiros.de}{\texttt{martin@oneiros.de}}}
+% \author{Martin Schröder\thanks{maintained by Marei Peischl <marei@peitex.de>}}
% \maketitle
%
% ^^A -----------------------------
@@ -169,14 +135,21 @@
%
% ^^A -----------------------------
%
+% \section{Requirements}
+% Version 2.00 requires the kernel hook management and is no longer
+% useable with LaTeX versions older than 2020/10/01. In case you have
+% any understandable reason, which requires the old implementation,
+% feel free to contact the maintainer.
+%
+% ^^A -----------------------------
+%
% \section{Usage}
% ^^A
% Simply using this package via
-% \mbox{\cs{usepackage\{}\package{prelim2e}\texttt{\}}} produces a
+% \mbox{\cs{usepackage}\texttt{\{}\package{prelim2e}\texttt{\}}} produces a
% text in the form of ``Preliminary version -- \today''.
%
-% \DescribeMacro{\PrelimText}
-% \DescribeMacro{\PrelimWords}
+% \begin{function}{\PrelimText,\PrelimWords}
% The text is produced by the commands \cs{PrelimText} and
% \cs{PrelimWords}, which can be changed via \cs{renewcommand} or by
% using options at the \cs{usepackage} command (see
@@ -184,16 +157,18 @@
%
% The footer for this documentation was produced by changing
% \cs{PrelimWords} to
-% \begin{quote}
%\begin{verbatim}
-%\renewcommand{\PrelimWords}{%
-% \textsf{prelim2e} package --
-% Version \fileversion (\svnInfoRevision) --
-% Documentation \LaTeX{}ed%
-% }
+% \renewcommand*{\PrelimWords}{%
+% \textsf{prelim2e} package --
+% Version \fileversion --
+% Documentation \LaTeX{}ed%
+% }
%\end{verbatim}
-% \end{quote}
+% \end{function}
%
+% \begin{function}{\PrelimTextStyle}
+% The style of the Text can be controlled by \cs{PrelimTextStyle}. This can also be adjusted using \cs{renewcommand*}. The default is set empty, but will use the default font in footnotesie.
+% \end{function}
%
% ^^A -----------------------------
%
@@ -263,9 +238,6 @@
% ^^A
% The package requires the following packages:
% \begin{description}
-% \item[\normalfont\package{everyshi}\cite{package:everyshi}]
-% It is used to implement the setting of the text below the normal
-% pagebody.
% \item[\normalfont\package{scrtime}\cite{package:scrtime}]
% \changes{v1.10}{1996/01/01}{\package{scrtime} instead of
% \package{printtim}}
@@ -288,9 +260,6 @@
%
% ^^A -----------------------------
%
-% \StopEventually{^^A
-%
-%
% ^^A -----------------------------
%
% \section{Acknowledgements}
@@ -329,72 +298,83 @@
% Mats Dahlgren.
% \newblock \package{vrsion} -- a \LaTeX{} Macro for version
% Numbering of Files.
-% \newblock \url{CTAN: tex-archive/macros/latex/contrib/supported/vrsion/vrsion.dtx}.
+% \newblock \CTANlink{tex-archive/macros/latex/contrib/supported/vrsion/vrsion.dtx}.
% \newblock \LaTeXe{} package.
% \bibitem{package:scrtime}
% Markus Kohm.
% \newblock The \package{KOMA}-timedate-bundle.
-% \newblock \url{CTAN: tex-archive/macros/latex/contrib/supported/koma-script/scrtime.dtx}.
-% \newblock \LaTeXe{} package.
-% \bibitem{package:everyshi}
-% Martin Schr\"oder.
-% \newblock The \package{everyshi} package.
-% \newblock \url{CTAN: tex-archive/macros/latex/contrib/supported/ms/everyshi.dtx}.
+% \newblock \CTANlink{tex-archive/macros/latex/contrib/supported/koma-script/scrtime.dtx}.
% \newblock \LaTeXe{} package.
% \bibitem{package:vrsion}
% Robert Tolksdorf.
% \newblock Kennzeichnung von Vorversionen eines Dokuments.
-% \newblock \url{CTAN: tex-archive/macros/latex209/contrib/prelim/}.
+% \newblock \CTANlink{tex-archive/macros/latex209/contrib/prelim/}.
% \newblock \LaTeX2.09 package.
% \end{thebibliography}
%
-% }
-%
+% \StopEventually{\PrintChanges}
%
% ^^A -----------------------------
%
% \section{The implementation}
-%
% \begin{macrocode}
%<*package>
% \end{macrocode}
-%
+% \begin{macrocode}
+%<@@=prelim>
+% \end{macrocode}
+
%
% ^^A -----------------------------
%
% \subsection{Initial Code}
+% The implementation of version 2.00 requires a the kernel's hook management.
+% Therefore we test if it's available and throw an error message if not.
+%
+% \begin{macrocode}
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+\IfFormatAtLeastTF{2020/10/01}{}{%
+ \PackageError{prelim2e}{
+ Format file is too old. Please update your LaTeX distribution.
+ }{
+ prelim2e of version 2.0 requires a format version of at least 2020/10/01
+ }%
+}
+% \end{macrocode}
+
% ^^A
-% \begin{macro}{\if@prelim@draft}
-% \cs{if@prelim@draft} is used to flag the use of the \option{draft}
+% \begin{variable}{\g_prelim_draft_bool}
+% \cs{g_prelim_draft_bool} is used to flag the use of the \option{draft}
% or \option{final} option.
% \begin{macrocode}
-\newif\if@prelim@draft
+\bool_new:N \g_prelim_draft_bool
% \end{macrocode}
-% \end{macro}
+% \end{variable}
%
-% \begin{macro}{\if@prelim@time}
+% \begin{variable}{\g_prelim_time_bool}
% \changes{v1.10}{1996/01/01}{new}
-% \cs{if@prelim@time} is used to flag the use of the \option{time}
+% \cs{g_prelim_time_bool} is used to flag the use of the \option{time}
% option.
% \begin{macrocode}
-\newif\if@prelim@time
+\bool_new:N \g_prelim_time_bool
% \end{macrocode}
-% \end{macro}
+% \end{variable}
%
-% \begin{macro}{\if@prelim@scrtime}
+% \begin{variable}{\g_prelim_scrtime_bool}
% \changes{v1.20}{1997/05/12}{new}
-% \cs{if@prelim@scrtime} is used to flag the use of the \option{scrtime}
+% \cs{g_prelim_scrtime_bool} is used to flag the use of the \option{scrtime}
% option.
% \begin{macrocode}
-\newif\if@prelim@scrtime
+\bool_new:N \g_prelim_scrtime_bool
% \end{macrocode}
-% \end{macro}
+% \end{variable}
+%
%
% \begin{macro}{\PrelimWords}
% \cs{PrelimWords} holds the language-dependend text used in
% \cs{PrelimText}
% \begin{macrocode}
-\newcommand{\PrelimWords}{}
+\newcommand*{\PrelimWords}{}
% \end{macrocode}
% \end{macro}
%
@@ -411,11 +391,11 @@
% The \option{draft} and \option{final} option control the behavior
% of \package{prelim2e}: Only if \option{final} is used in
% \cs{documentclass} or
-% \mbox{\cs{usepackage\{}\package{prelim2e}\texttt{\}}} text is
+% \mbox{\cs{usepackage}\texttt{\{}\package{prelim2e}\texttt{\}}} text is
% produced.
% \begin{macrocode}
-\DeclareOption{draft}{\@prelim@drafttrue}
-\DeclareOption{final}{\@prelim@draftfalse}
+\DeclareOption{draft}{\bool_gset_true:N \g_prelim_draft_bool}
+\DeclareOption{final}{\bool_gset_false:N \g_prelim_draft_bool}
% \end{macrocode}
%
%
@@ -431,17 +411,17 @@
% \changes{v1.3}{2009/05/29}{\option{norsk} option added}
% \begin{macrocode}
\DeclareOption{danish}{%
- \renewcommand{\PrelimWords}{Forel\o{}big version}}
+ \renewcommand{\PrelimWords}{Forel\o{}big~version}}
\DeclareOption{english}{%
- \renewcommand{\PrelimWords}{Preliminary version}}
+ \renewcommand{\PrelimWords}{Preliminary~version}}
\DeclareOption{french}{%
- \renewcommand{\PrelimWords}{Version pr\'eliminaire}}
+ \renewcommand{\PrelimWords}{Version~pr\'eliminaire}}
\DeclareOption{german}{%
- \renewcommand{\PrelimWords}{Vorl\"aufige Version}}
+ \renewcommand{\PrelimWords}{Vorl\"aufige~Version}}
\DeclareOption{italian}{%
- \renewcommand{\PrelimWords}{Versione preliminare}}
+ \renewcommand{\PrelimWords}{Versione~preliminare}}
\DeclareOption{norsk}{%
- \renewcommand{\PrelimWords}{Forel\o{}pig versjon}}
+ \renewcommand{\PrelimWords}{Forel\o{}pig~versjon}}
% \end{macrocode}
%
%
@@ -461,7 +441,10 @@
% package.
% It implies \option{time}.
% \begin{macrocode}
-\DeclareOption{scrtime}{\@prelim@scrtimetrue\@prelim@timetrue}
+\DeclareOption{scrtime}{
+ \bool_gset_true:N \g_prelim_scrtime_bool
+ \bool_gset_true:N \g_prelim_time_bool
+}
% \end{macrocode}
%
%
@@ -475,10 +458,10 @@
% the \option{scrtime} option is selected.
% \begin{macrocode}
\DeclareOption*{%
- \if@prelim@scrtime
+ \bool_if:NT \g_prelim_scrtime_bool {
\PassOptionsToPackage{\CurrentOption}{scrtime}%
- \fi
- }
+ }
+}
% \end{macrocode}
%
%
@@ -498,13 +481,12 @@
% \subsection{Loading packages}
% ^^A
% \changes{v1.20}{1997/05/12}{check \cs{if@prelim@scrtime}}
-% We need the \package{everyshi} package---and \package{scrtime}, if the
-% \option{scrtime} option is specified.
+% \changes{v2.00}{2020/11/24}{remove \package{everyshi}}
+% We need the \package{scrtime} package if the \option{scrtime} option is specified.
% \begin{macrocode}
-\RequirePackage{everyshi}[1995/01/25]
-\if@prelim@scrtime
+\bool_if:NT \g_prelim_scrtime_bool {
\RequirePackage{scrtime}
-\fi
+}
% \end{macrocode}
%
%
@@ -520,19 +502,19 @@
% We first have to reset the style and size, otherwise the settings in
% effect at the point of text where \cs{ouput} is called would be used.
% \begin{macrocode}
-\newcommand{\PrelimText}{%
- \textnormal{%
- \footnotesize
- \PrelimTextStyle
- \PrelimWords{} -- \today
- \if@prelim@time
- \ -- \thistime
- \fi
- }%
+\newcommand{\PrelimText}{
+ \textnormal{
+ \footnotesize
+ \PrelimTextStyle
+ \PrelimWords{}~--~\today~
+ \bool_if:NT \g_prelim_time_bool {
+ \ --~
+ \thistime~
}
+ }
+}
% \end{macrocode}
% \end{macro}
-%
% \begin{macro}{\PrelimTextStyle}
% \cs{PrelimTextStyle} controls the style of the text produced by
% \cs{PrelimText}.
@@ -547,83 +529,69 @@
%
% \subsection{Putting the text below the page}
% ^^A
-% We put the text below the page via \cs{EveryShipout} provided by
-% the \package{everyshi} package.
-% This is done by \cs{@Prelim@EveryShipout}.
+% \changes{v2.00}{2020/11/24}{Use \LaTeX{} kernel method instead of everyshi}
+% We put the text below the page via \cs{AddtoHook{shipout/foreground}}.
+% This is done by \cs{\__prelim_every_shipout:}.
%
-% \begin{macro}{\@Prelim@EveryShipout}
+% Save the shipout origins to macros to adjust the position of the the
+% PrelimText similar to the older versions of prelim2e.
+% \begin{macrocode}
+\tl_const:Nx \c__prelim_horigin_tl {
+ \tl_if_exist:NTF \c__shipout_horigin_tl {
+ \c__shipout_horigin_tl
+ } {
+ 1in
+ }
+}
+
+\tl_const:Nx \c__prelim_vorigin_tl {
+ \tl_if_exist:NTF \c__shipout_vorigin_tl {
+ \c__shipout_vorigin_tl
+ } {
+ 1in
+ }
+}
+
+% \end{macrocode}
+% \begin{function}{\__prelim_every_shipout:}
% \changes{v1.10}{1996/01/01}{\cs{hbox to}$\rightarrow$\cs{hb@xt@}}
% \changes{v1.24}{2004/03/28}{Bugfix: Add missing \%.
% Bug reported by Carsten Heinz (\texttt{cheinz@gmx.de}).}
% \cs{@Prelim@EveryShipout} puts the text produced by \cs{PrelimText}
-% below the page.
-% To do this we modify \cs{box255}: We append a \cs{vbox} with height
-% and depth of 0pt and the width of \cs{box255} which contains a
-% \cs{hbox} with the width of \cs{box255} in which \cs{PrelimText}
-% is centered.
-% \begin{macrocode}
-\newcommand{\@Prelim@EveryShipout}{%
- \bgroup
-% \end{macrocode}
-% First we save the dimensions of \cs{box255}: height, width and depth;
-% and calculate the total height of \cs{box255}.
+% below the page. We do this using expl3-Syntax to directly access the measures of
+% the shipout box.
% \begin{macrocode}
- \dimen\z@=\wd\@cclv
- \dimen\@ne=\ht\@cclv
- \dimen\tw@=\dp\@cclv
- \dimen\thr@@=\dimen1
- \advance\dimen\thr@@ by \dimen\tw@
+\cs_new:Nn \__prelim_every_shipout: {
% \end{macrocode}
-% Then we set \cs{box255}:
-% A \cs{vbox} to the total height of \cs{box255}.
-% In this a \cs{hbox} to the width of \cs{box255} is included, in which
-% \cs{box255} is set.
+% We calculate the text position to match the implementation for versions before 2.0.
% \begin{macrocode}
- \global\setbox\@cclv\vbox to \dimen\thr@@{%
- \hb@xt@\dimen\z@{%
- \box\@cclv%
- \hss
- }%
+\put(\c__shipout_horigin_tl,\dim_eval:n {
+ -\c__shipout_vorigin_tl-\l_shipout_box_ht_plus_dp_dim-\topskip
+ })
+ {
+ \vbox_to_ht:nn {0pt} {
+ \hbox_to_wd:nn {\l_shipout_box_wd_dim} {
+ \let\protect\relax
+ \hfill\PrelimText\hfill
+ }
+ }
+ }
+}
% \end{macrocode}
-% To this we append the text produced by \cs{PrelimText}.
-% It is put in a \cs{vbox} to 0pt in which a \cs{hbox} to the width of
-% \cs{box255} is included, in which \cs{PrelimText} is set.
-% We have to reset \cs{protect} because it is set to \cs{noexpand} by
-% the output routine.
-% \begin{macrocode}
- \vbox to \z@{%
- \hb@xt@\dimen\z@{%
- \let\protect\relax
- \hfill\PrelimText\hfill
- }%
- \vss
- }%
- \vss
- }%
-% \end{macrocode}
-% Finally we set the dimensions of \cs{box255} to the values they had
-% before \cs{@Prelim@EveryShipout}.
-% \begin{macrocode}
- \wd\@cclv=\dimen\z@
- \ht\@cclv=\dimen\@ne
- \dp\@cclv=\dimen\tw@
- \egroup
- }
-% \end{macrocode}
-% \end{macro}
+% \end{function}
%
%
% ^^A -----------------------------
%
% \subsection{Tieing \package{prelim2e} into the system}
% ^^A
-% \cs{@Prelim@EveryShipout} is tied into the system via
-% \cs{EveryShipout}.
+% \cs{@Prelim@EveryShipout} is tied into the system using the
+% kernel's hook management.
% But only if the \option{draft} option is used.
% \begin{macrocode}
-\if@prelim@draft
- \EveryShipout{\@Prelim@EveryShipout}
-\fi
+\bool_if:NT \g_prelim_draft_bool {
+ \AddToHook{shipout/foreground}{\__prelim_every_shipout:}
+}
% \end{macrocode}
%
% \begin{macrocode}
@@ -634,4 +602,4 @@
% ^^A -----------------------------
%
% \Finale
-% ^^A vim:tw=70:ts=2
+% ^^A
diff --git a/Master/texmf-dist/source/latex/prelim2e/prelim2e.ins b/Master/texmf-dist/source/latex/prelim2e/prelim2e.ins
new file mode 100644
index 00000000000..915b5164200
--- /dev/null
+++ b/Master/texmf-dist/source/latex/prelim2e/prelim2e.ins
@@ -0,0 +1,59 @@
+\input docstrip.tex
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{prelim2e.ins}
+ [2020/11/22 v2.0 Installation script for Prelim2e Package]
+
+\preamble
+Copyright (C) 1995–2009 Martin Schröder, 2020; Marei Peischl (peiTeX) <marei@peitex.de>
+
+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
+http://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is
+Marei Peischl <marei@peitex.de>.
+
+This work consists of the files prelim2e.dtx and prelim2e.ins
+and the derived file prelim2e.sty.
+
+The development repository can be found at
+ https://github.com/texhackse/prelim2e
+Please use the issue tracker for feedback!
+
+\endpreamble
+\declarepreamble\driverpreamble
+
+This file is part of the Prelim2e package
+-----------------------------------------
+Copyright (C) Martin Schröder, 1994–2001
+ Marei Peischl (peiTeX) <marei@peitex.de>, 2020
+
+\endpreamble
+
+% Don't display progress
+\keepsilent
+\askforoverwritefalse
+\generate{\file{prelim2e.sty}{\from{prelim2e.dtx}{package}}}
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* files into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space prelim2e.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file prelim2e.drv}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing}
+\Msg{***********************************************************}
+\endbatchfile
+%%
+%% End of file `prelim2e.ins'.
diff --git a/Master/texmf-dist/source/latex/preview/preview.dtx b/Master/texmf-dist/source/latex/preview/preview.dtx
index a2f3db64a5b..080996b2840 100644
--- a/Master/texmf-dist/source/latex/preview/preview.dtx
+++ b/Master/texmf-dist/source/latex/preview/preview.dtx
@@ -3,7 +3,7 @@
%% Developed as part of AUCTeX <URL:https://www.gnu.org/software/auctex/>.
%
% Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006,
-% 2010, 2017-2019 Free Software Foundation
+% 2010, 2017-2020 Free Software Foundation
%
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
@@ -137,7 +137,7 @@
% \item[|textmath|] will make all text math subject to previews.
% Since math mode is used throughly inside of \LaTeX\ even for other
% purposes, this works by redefining \cmd\(, \cmd\)
-% and |$| and the |math| environment (apparently some people use
+% and |$| and the |math| environment (apparently some people use ^^A$
% that). Only occurences of these text math delimiters in later
% loaded packages and in the main document will thus be affected.
% \item[|graphics|] will subject all \cmd{\includegraphics} commands
@@ -439,7 +439,7 @@
\NeedsTeXFormat{LaTeX2e} \def\reserved@a #1#2$#3:
#4${\xdef#1{\reserved@c #2#4 $}} \def\reserved@c #1 #2${#1}
\begingroup \catcode`\_=12
-\reserved@a\pr@version $Name: release_12_2 $ \ifx\pr@version\@empty
+\reserved@a\pr@version $Name: release_12_3 $ \ifx\pr@version\@empty
\reserved@a\pr@version CVS-$Revision: 1.126 $ \endgroup \else
\def\next release_{} \lccode`\_=`.
\edef\next{\lowercase{\endgroup
diff --git a/Master/texmf-dist/source/latex/psnfss/psfonts.dtx b/Master/texmf-dist/source/latex/psnfss/psfonts.dtx
index fff5393cf3e..a0cf4ab0012 100644
--- a/Master/texmf-dist/source/latex/psnfss/psfonts.dtx
+++ b/Master/texmf-dist/source/latex/psnfss/psfonts.dtx
@@ -1,11 +1,11 @@
-%\CheckSum{1106}
+%\CheckSum{1101}
%
% \iffalse
%
% file: psfonts.dtx
%
% Copyright 1995--1998 Sebastian Rahtz
-% Copyright 1999--2005 Sebastian Rahtz, Walter Schmidt
+% Copyright 1999--2020 Sebastian Rahtz, Walter Schmidt
%
% This program may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.2
@@ -38,7 +38,7 @@
%<charter>\ProvidesPackage{charter}%
%<utopia>\ProvidesPackage{utopia}%
%<mathpazo>\ProvidesPackage{mathpazo}%
-[2005/04/12 PSNFSS-v9.2a
+[2020/03/25 PSNFSS-v9.3
%<times>(SPQR)
%<mathptm>Times w/ Math (SPQR, WaS)
%<mathptmx>Times w/ Math, improved (SPQR, WaS)
@@ -75,7 +75,7 @@
% \noindent
% The source file \texttt{psfonts.dtx} contains suitable package files
% to use common PostScript fonts with \LaTeX.
-% See the file \texttt{00readme.txt} for the installation instructions;
+% See the file \texttt{README} for the installation instructions;
% it also explains how to obtain the
% related Type1 fonts, font definition files, font metrics and virtual fonts.
%
diff --git a/Master/texmf-dist/source/latex/psnfss/psnfss2e.tex b/Master/texmf-dist/source/latex/psnfss/psnfss2e.tex
deleted file mode 100644
index 66280d63dcf..00000000000
--- a/Master/texmf-dist/source/latex/psnfss/psnfss2e.tex
+++ /dev/null
@@ -1,887 +0,0 @@
-% file: psnfss2e.tex as of 2004-09-15
-%
-% Copyright 2000--2004 Walter Schmidt
-%
-% This file may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.2
-% 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.2 or later is part of all distributions of LaTeX
-% version 1999/12/01 or later.
-
-\newif\ifutopia
-
-% \utopiatrue
-% If you have got the Utopia fonts, uncomment the above line,
-% or put \utopiatrue into your ltxguide.cfg.
-
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-
-\documentclass[11pt]{ltxguide}[1995/11/28]
-\DeleteShortVerb{\|}
-
-% You may provide a configuration file ltxguide.cfg
-% to set up your preferred paper size and page layout.
-% The .cfg file should, however, not change the fonts used!
-
-\usepackage{mathptmx,courier}
-\usepackage[scaled=0.92]{helvet}
-\normalfont
-\usepackage{pifont,tabularx,varioref,url}
-\usepackage[T1]{fontenc}
-\usepackage{textcomp}
-\usepackage{ragged2e}
-
-\usepackage[colorlinks=false, pdfborder={0 0 0}]{hyperref}
-
-% some dirty hacks to make the ltxguide class look better:
-\makeatletter
-\renewcommand\section{\@startsection{section}{1}{\z@}%
-{-3.5ex \@plus -.75ex}%
-{1ex}%
-{\normalfont\Large\bfseries}}
-\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
-{-2.5ex plus -.5ex}%
-{.75ex}%
-{\normalfont\large\bfseries}}
-\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
-{-2.5ex plus -.5ex}%
-{.5ex}%
-{\normalsize\bfseries}}
-\setlength{\parskip}{1ex plus 2pt minus 1pt \relax}
-% borrowed from tdsguide.cls:
-\labelsep=1.1em % increase distance between item & text
-\topsep=0pt % no extra skip above list in paragraph
-\partopsep=0pt % no extra skip above list starting par.
-\itemsep=0pt % no extra space between items
-\parsep=.9\parskip % between paragraphs in items
-\def\@listI{%
- \leftmargin\leftmargini
- }
-\let\@listi\@listI
-\@listi
-\def\@listii{%
- \leftmargin\leftmarginii
- \labelwidth\leftmarginii \advance \labelwidth-\labelsep
- }
-\def\@listiii{%
- \leftmargin\leftmarginiii
- \labelwidth\leftmarginiii \advance \labelwidth-\labelsep
- }
-\makeatother
-
-% the (La)TeX logos for use with Times:
-\def\ptmTeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.075emX\@}
-\makeatletter
-\DeclareRobustCommand{\ptmLaTeX}{L\kern-.25em
- {\setbox0\hbox{T}%
- \vbox to\ht0{\hbox{%
- \csname S@\f@size\endcsname
- \fontsize\sf@size\z@
- \math@fontsfalse\selectfont
- A}%
- \vss}%
- }%
- \kern-.10em
- \TeX}
-\makeatother
-\let\TeX=\ptmTeX
-\let\LaTeX=\ptmLaTeX
-
-% a bit of logical markup:
-\newcommand{\ps}{PostScript}
-\newcommand{\Lpack}[1]{\textsf{#1}}
-
-% the macros for the typeface samples:
-\newlength{\rightwidth}
- \rightwidth=11cm
-\newlength{\leftwidth}
- \leftwidth=\textwidth
- \addtolength{\leftwidth}{-\rightwidth}
- \addtolength{\leftwidth}{-1em} % ?
-\newcommand{\sample}[5]{%
- \parbox[t]{\leftwidth}{%
- {\raggedright\footnotesize
- #1\\
- #3/#4\par}}
- \hfill
- \parbox[t]{\rightwidth}{
- {\RaggedRight \fontfamily{#2}\fontsize{#3}{#4}\selectfont #5
- The sun was just rising as Dr.\ Robert entered his wife's room.
- An orange glow, and against it the jagged silhouette of the mountains.
- Then suddenly a dazzling sickle of incandescence between two peaks.
- The sickle became a half circle and the first long shadows,
- the first shafts of golden light crossed the garden outside the window.
- And when one looked up again at the mountains there was the whole
- unbearable glory of the risen sun.
- \par}}
- \par
- \medskip}
-
-
-\title{Using common \ps\ fonts with \LaTeX}
-
-\author{Walter Schmidt}
-
-\date{PSNFSS version 9.2 \\ 2004-09-15}
-
-
-\hypersetup{pdfauthor={Walter Schmidt},
- pdftitle={Using common PostScript fonts with LaTeX},
- pdfsubject={PSNFSS v9.2},
- pdfkeywords={LaTeX PSNFSS PostScript fonts}}
-
-
-\begin{document}
-\MakeShortVerb{\+}
-
-\maketitle
-
-\tableofcontents
-%\pagebreak
-
-
-\section{What is PSNFSS\,?}
-
-The PSNFSS collection includes a set of files
-that provide a complete working setup of the \LaTeX{} font selection scheme
-(NFSS2) for use with common \ps\ fonts.
-It covers the so-called `Base~35' fonts
-(which are built into any Level~2 \ps\ printing device
-and the Ghostscript interpreter)
-and %the free Charter, Utopia and Pazo fonts.
-a number of free fonts.
-
-
-
-\section{Package overview}
-
-The easiest way to make use of the above-mentioned typefaces is to completely
-replace one or more of the font families used by \LaTeX{} as
-`roman', `sans serif' and `typewriter' family and for math.
-This is accomplished by the packages listed in table \ref{tab:packages}.
-Its first row lists the default (Computer Modern) font families.
-An empty column indicates that a package does not change the particular
-font family. Some of these packages need more detailed explanation and
-are described in the below sections \ref{sec:helvet}, \ref{sec:mathpazo}
-and \ref{sec:mathptmx}.
-
-The PSNFSS distribution includes also a package
-\Lpack{pifont}, which serves for accessing symbol fonts (aka `Pi~fonts'),
-such as Symbol and Zapf Dingbats, see section~\ref{sec:pifont}.
-
-
-\begin{table}[h!]
-\caption{Packages for using common \ps\ fonts}
-\label{tab:packages}
-\medskip
-{\footnotesize
-\begin{center}
-\renewcommand{\arraystretch}{1.2}
-\begin{tabular}{|l|p{1.8cm}p{2.2cm}p{2.4cm}p{2.2cm}|}
-\hline
-\textbf{package} & \textbf{roman} & \textbf{sans serif} & \textbf{typewriter} & \textbf{formulas} \\\hline\hline
-(none) & CM Roman & CM Sans Serif & CM Typewriter & $\approx$ CM Roman\\\hline
-\Lpack{mathpazo} & Palatino
- &
- &
- & $\approx$ Palatino\\\hline
-\Lpack{mathptmx} & Times
- &
- &
- & $\approx$ Times\\\hline
-\Lpack{helvet} &
- & Helvetica
- &
- & \\\hline
-\Lpack{avant} &
- & Avant~Garde
- &
- & \\\hline
-\Lpack{courier} &
- &
- & Courier
- & \\\hline
-\Lpack{chancery} & Zapf Chancery
- &
- &
- & \\\hline
-\Lpack{bookman} & Bookman
- & Avant~Garde
- & Courier
- & \\\hline
-\Lpack{newcent} & New Century Schoolbook
- & Avant~Garde
- & Courier
- & \\\hline
-\Lpack{charter} & Charter
- &
- &
- & \\\hline
-\end{tabular}
-\end{center}
-}
-\end{table}
-
-
-
-\section{Special considerations}
-
-\subsection{Output font encoding}
-None of the packages listed in table~\ref{tab:packages} changes the
-output font encoding from its default setting OT1.
-It is, however, highly recommended to use the fonts with the extended
-T1 and TS1 (text symbols) encodings by means of the commands:
-\begin{quote}
- +\usepackage[T1]{fontenc}+\\
- +\usepackage{textcomp}+
-\end{quote}
-When using \ps\ fonts that come from `outside the \TeX{} world',
-there is no reason at all to stay with the obsolete OT1~encoding,
-which would not provide access to all available glyphs.
-However, since these fonts were not particularly designed
-for use with \TeX{}, they do \emph{not} include all of the
-text companion (TS1) symbols.
-
-
-\subsection{Euro support}
-%% \NEWfeature{2003-11-17 v9.1}
-From PSNFSS version~9.1 on, all supported text font families,
-with the exception of \texttt{put} (Utopia), provide
-a built-in Euro symbol +\texteuro+.
-Using this command requires the \Lpack{textcomp} package; see above.
-
-
-\subsection{Inter-line spacing}
-With certain font families, the leading of the standard \LaTeX{}
-document classes may be too small.
-This results from the larger x-height of these typefaces, as compared with
-Computer Modern.
-Since it is a question of document design and line width,
-the packages of the PSNFSS bundle do \emph{not} take care of this.
-Issuing the command
-\begin{quote}
- +\linespread+ \arg{factor}
-\end{quote}
-in the preamble will globally enlarge the leading by the given factor.
-Typical values for \m{factor} are in the range of $1.04\dots1.1$.
-
-
-\subsection{Using sans serif fonts}
-The packages \Lpack{helvet} and \Lpack{avant} do not change the
-default text font family from `roman'.
-If required, the additional command
-\begin{quote}
- +\renewcommand{\familydefault}{\sfdefault}+
-\end{quote}
-makes \LaTeX{} use the sans serif font family (Helvetica or Avant~Garde)
-as the default one in text mode. Notice, however, that this does not change the fonts
-used in the formulas!
-
-
-
-\section{The package \Lpack{helvet}}
-\label{sec:helvet}
-Helvetica is actually somewhat larger than other typefaces
-of the same nominal size.
-As a result, mixing, \eg Times and Helvetica within running text
-may look bad.
-\begin{decl}
- \texttt{[scaled=}\m{scale}\texttt{]}\\
- \texttt{[scaled]}
-\end{decl}
-This can be fixed by loading the package with the option
-\texttt{[scaled=}\m{scale}\texttt{]},
-for instance:
-+\usepackage[scaled=.92]{helvet}+.
-As a result, the font family \texttt{phv} (Helvetica) will be
-scaled down to 92\% of its `natural' size, which is suitable
-for use with Adobe Times.
-Specifying +[scaled]+ alone is equivalent to +[scaled=0.95]+% and makes
-%the height of the Helvetica capital letters comply with many other typeface
-%families
-.
-
-
-
-\section{The package \Lpack{mathpazo}}
-\label{sec:mathpazo}
-Loading
-%% \NEWfeature{2001-06-04 v8.2}
-this package changes the default roman font family
-to Adobe Palatino, and the virtual `mathpazo' fonts will be used
-for math.
-These virtual fonts are made up basically from Palatino Italic, with the
-missing math symbols coming from the CM and Pazo math fonts.
-
-\subsection{Package options}
-
-\begin{decl}
- +[sc]+\\
- +[osf]+
-\end{decl}
-By default, the package \Lpack{mathpazo} uses
-the typeface family +ppl+ as the roman text font family.
-The option +[sc]+ selects Palatino with real smallcaps (family +pplx+) insread.
-Correspondingly, the option +[osf]+ selects Palatino with smallcaps and default
-oldstyle figures (family +pplj+).
-Of course, oldstyle figures will be used only in text mode, as opposed to formulas.
-\NEWfeature{2004-09-15 v9.2}
-Using either option is strongly recommended:
-Beside the real smallcaps, the font families +pplx+ and +pplj+ show further
-improvements over +ppl+: Increased word space, enhanced kerning tables,
-additional `dotlessj' glyph.
-
-\begin{decl}
- +[slantedGreek]+
-\end{decl}
-When the package is loaded with the +[slantedGreek]+ option,
-uppercase Greek letters in math will be italic by default.
-
-\begin{decl}
- +[noBBpl]+
-\end{decl}
-This option disables the use of the Pazo fonts as a partial
-+\mathbb+ alphabet -- see below. The option should be specified,
-if you want to use a different `blackboard bold' font.
-
-
-\subsection{New commands}
-
-\begin{decl}
- +\upGamma+, +\upDelta+ \dots +\upOmega+
-\end{decl}
-\NEWfeature{2004-09-15 v9.2}
-Regardless of the \texttt{slantedGreek} option,
-these commands always yield upright uppercase Greek letters.
-Upright \emph{lowercase} Greek is, however, not available.
-
-\begin{decl}
- +\mathbold+\\
- +\mathbb+
-\end{decl}
-+\mathbold+ is a math alphabet for typesetting variables (incl.\ Greek)
-in a {\bfseries\itshape bold italic} style. Do not mix this up with +\mathbf+,
-which selects a {\bfseries\upshape bold upright} text font
-for use in math!
-
-+\mathbb+ is a `blackboard bold' alphabet, whose characters
-are taken from the Pazo fonts. %% \NEWfeature{2002-04-10 v9.0}
-All upper case letters and the numeral `1' are available.
-If you want to use a different, external, doublestroke alphabet,
-load the package \Lpack{mathpazo} with the package option +[noBBppl]+, see above.
-
-\iffalse
-\begin{decl}
- +\ppleuro+
-\end{decl}
-The command +\ppleuro+ typesets the Euro
-symbol in a way that suits Palatino using the appropriate glyphs
-from the Pazo Math font family. It is compatible with both the
-\Lpack{eurofont} and \Lpack{europs} packages, and one can continue to use either
-one of these packages, using the +\euro+ command from the
-\Lpack{eurofont} package or the +\EUR+ command from the \Lpack{europs} package.
-\fi
-
-
-\subsection{Font size of the `large' math symbols}
-With \Lpack{mathpazo}, the `large' math symbols are automatically
-scaled to fit the base font size.
-In contrast to standard \LaTeX{} you need not
-load the package \Lpack{exscale} for this purpose!
-
-
-\subsection{Known problems}
-
-In contrast to the standard CM fonts, the virtual \Lpack{mathpazo} fonts
-do not provide any Greek letters in the math alphabet +\mathrm+.
-Applying this math alphabet command to Greek letters
-will result in garbage output.
-
-
-
-\section{The package \Lpack{mathptmx}}
-\label{sec:mathptmx}
-Loading this package changes the default roman font family
-to Times, and the virtual `mathptmx' fonts will be used
-for math.
-These virtual fonts are made up basically from Times Italic, with the
-missing math symbols coming from CM, RSFS (for +\mathcal+) and
-Adobe~Symbol.
-
-\subsection{Package options}
-\begin{decl}
- +[slantedGreek]+
-\end{decl}
-%% \NEWfeature{2001-06-04 v8.2}
-When the package is loaded with this option,
-uppercase Greek letters in math will be italic by default.
-
-\subsection{New commands}
-\begin{decl}
- +\upGamma+, +\upDelta+ \dots +\upOmega+
-\end{decl}
-\NEWfeature{2004-09-15 v9.2}
-Regardless of the \texttt{slantedGreek} option,
-these commands always yield upright uppercase Greek letters.
-Upright \emph{lowercase} Greek is, however, not available.
-
-
-\subsection{Font size of the `large' math symbols}
-With \Lpack{mathptmx}, the `large' math symbols are automatically scaled
-to fit the base font size. In contrast to standard \LaTeX{} you need not
-load the package \Lpack{exscale} for this purpose!
-
-
-\subsection{Known bugs and deficiencies}
-\begin{itemize}
- \item There are no bold math fonts, and +\boldmath+ has no effect.
- Use of the package \Lpack{bm} in conjunction with \Lpack{mathptmx}
- is not recommended.
- \item The symbols
- +\jmath+, +\coprod +and +\amalg+
- are not available.
-\end{itemize}
-
-
-
-\section{The package \Lpack{pifont}}
-\label{sec:pifont}
-
-Using symbol fonts is supported by means of the
-\Lpack{pifont} package, providing commands for using the Zapf Dingbats font,
-as well as an interface to other families.\footnote{%
-This section was adopted, with minor changes,
-from \cite{companion}, 1st ed.}
-
-\subsection{Commands for using Zapf Dingbats}
-
-\begin{decl}
- +\ding+ \arg{number}
-\end{decl}
-
-A given character can be chosen via the +\ding+ command.
-Its parameter is an integer that specifies the character to be
-typeset. For example, +\ding{38}+ gives \ding{38};
-see table~\vref{tab:dingbats}.
-
-\begin{decl}
- +\begin{dinglist}+ \arg{number}\\
- +\begin{dingautolist}+ \arg{number}
-\end{decl}
-
-The +dinglist+ environment is a special itemized list.
-The argument specifies the number of the character to be used
-as the beginning of each item. For example,
-\begin{verbatim}
-\begin{dinglist}{43}
- \item The first item in the list
- \item The second item in the list
- \item The third item in the list
-\end{dinglist}
-\end{verbatim}
-prints
-\begin{dinglist}{43}
- \item The first item in the list
- \item The second item in the list
- \item The third item in the list
-\end{dinglist}
-
-There also exists an environment +dingautolist+, which
-allows you to build an enumerated list with a set of Zapf Dingbats
-characters. In this case, the argument specifies the number
-of the first character in the list. Subsequent items will be numbered
-with the character following the previous one. E.g.,
-\begin{verbatim}
-\begin{dingautolist}{192}
- \item The first item
- \item The second item
- \item The third item
-\end{dingautolist}
-\end{verbatim}
-prints
-\begin{dingautolist}{192}
- \item The first item
- \item The second item
- \item The third item
-\end{dingautolist}
-
-\begin{decl}
- +\dingfill+ \arg{number}\\
- +\dingline+ \arg{number}
-\end{decl}
-
-+\dingfill+ acts like the other filling commands in \TeX, but
-fills the space with a chosen symbol \dingfill{224} like that.
-
-+\dingline+ generates a freestanding line filled with the given symbol,
-with a little space on the left and right:
-\dingline{34}
-
-
-\begin{table}[bt!]
- \caption{The characters in the \ps{} font Zapf Dingbats}
- \label{tab:dingbats}
- \medskip
-
-{\footnotesize
-\begin{tabular}{|rr|rr|rr|rr|rr|rr|rr|rr|}
-\hline
-32 & \ding{32} & 33 & \ding{33} & 34 & \ding{34} & 35 & \ding{35} & 36 & \ding{36} & 37 & \ding{37} & 38 & \ding{38} & 39 & \ding{39} \\ \hline
-40 & \ding{40} & 41 & \ding{41} & 42 & \ding{42} & 43 & \ding{43} & 44 & \ding{44} & 45 & \ding{45} & 46 & \ding{46} & 47 & \ding{47} \\ \hline
-48 & \ding{48} & 49 & \ding{49} & 50 & \ding{50} & 51 & \ding{51} & 52 & \ding{52} & 53 & \ding{53} & 54 & \ding{54} & 55 & \ding{55} \\ \hline
-56 & \ding{56} & 57 & \ding{57} & 58 & \ding{58} & 59 & \ding{59} & 60 & \ding{60} & 61 & \ding{61} & 62 & \ding{62} & 63 & \ding{63} \\ \hline
-64 & \ding{64} & 65 & \ding{65} & 66 & \ding{66} & 67 & \ding{67} & 68 & \ding{68} & 69 & \ding{69} & 70 & \ding{70} & 71 & \ding{71} \\ \hline
-72 & \ding{72} & 73 & \ding{73} & 74 & \ding{74} & 75 & \ding{75} & 76 & \ding{76} & 77 & \ding{77} & 78 & \ding{78} & 79 & \ding{79} \\ \hline
-80 & \ding{80} & 81 & \ding{81} & 82 & \ding{82} & 83 & \ding{83} & 84 & \ding{84} & 85 & \ding{85} & 86 & \ding{86} & 87 & \ding{87} \\ \hline
-88 & \ding{88} & 89 & \ding{89} & 90 & \ding{90} & 91 & \ding{91} & 92 & \ding{92} & 93 & \ding{93} & 94 & \ding{94} & 95 & \ding{95} \\ \hline
-96 & \ding{96} & 97 & \ding{97} & 98 & \ding{98} & 99 & \ding{99} & 100 & \ding{100} & 101 & \ding{101} & 102 & \ding{102} & 103 & \ding{103} \\ \hline
-104 & \ding{104} & 105 & \ding{105} & 106 & \ding{106} & 107 & \ding{107} & 108 & \ding{108} & 109 & \ding{109} & 110 & \ding{110} & 111 & \ding{111} \\ \hline
-112 & \ding{112} & 113 & \ding{113} & 114 & \ding{114} & 115 & \ding{115} & 116 & \ding{116} & 117 & \ding{117} & 118 & \ding{118} & 119 & \ding{119} \\ \hline
-120 & \ding{120} & 121 & \ding{121} & 122 & \ding{122} & 123 & \ding{123} & 124 & \ding{124} & 125 & \ding{125} & 126 & \ding{126} & & \\ \hline
- & & 161 & \ding{161} & 162 & \ding{162} & 163 & \ding{163} & 164 & \ding{164} & 165 & \ding{165} & 166 & \ding{166} & 167 & \ding{167} \\ \hline
-168 & \ding{168} & 169 & \ding{169} & 170 & \ding{170} & 171 & \ding{171} & 172 & \ding{172} & 173 & \ding{173} & 174 & \ding{174} & 175 & \ding{175} \\ \hline
-176 & \ding{176} & 177 & \ding{177} & 178 & \ding{178} & 179 & \ding{179} & 180 & \ding{180} & 181 & \ding{181} & 182 & \ding{182} & 183 & \ding{183} \\ \hline
-184 & \ding{184} & 185 & \ding{185} & 186 & \ding{186} & 187 & \ding{187} & 188 & \ding{188} & 189 & \ding{189} & 190 & \ding{190} & 191 & \ding{191} \\ \hline
-192 & \ding{192} & 193 & \ding{193} & 194 & \ding{194} & 195 & \ding{195} & 196 & \ding{196} & 197 & \ding{197} & 198 & \ding{198} & 199 & \ding{199} \\ \hline
-200 & \ding{200} & 201 & \ding{201} & 202 & \ding{202} & 203 & \ding{203} & 204 & \ding{204} & 205 & \ding{205} & 206 & \ding{206} & 207 & \ding{207} \\ \hline
-208 & \ding{208} & 209 & \ding{209} & 210 & \ding{210} & 211 & \ding{211} & 212 & \ding{212} & 213 & \ding{213} & 214 & \ding{214} & 215 & \ding{215} \\ \hline
-216 & \ding{216} & 217 & \ding{217} & 218 & \ding{218} & 219 & \ding{219} & 220 & \ding{220} & 221 & \ding{221} & 222 & \ding{222} & 223 & \ding{223} \\ \hline
-224 & \ding{224} & 225 & \ding{225} & 226 & \ding{226} & 227 & \ding{227} & 228 & \ding{228} & 229 & \ding{229} & 230 & \ding{230} & 231 & \ding{231} \\ \hline
-232 & \ding{232} & 233 & \ding{233} & 234 & \ding{234} & 235 & \ding{235} & 236 & \ding{236} & 237 & \ding{237} & 238 & \ding{238} & 239 & \ding{239} \\ \hline
- & & 241 & \ding{241} & 242 & \ding{242} & 243 & \ding{243} & 244 & \ding{244} & 245 & \ding{245} & 246 & \ding{246} & 247 & \ding{247} \\ \hline
-248 & \ding{248} & 249 & \ding{249} & 250 & \ding{250} & 251 & \ding{251} & 252 & \ding{252} & 253 & \ding{253} & 254 & \ding{254} & & \\ \hline
-\end{tabular}
-\par}
-
-\end{table}
-
-\subsection{Generic commands}
-The \Lpack{pifont} package has a general mechanism for coping with
-Pi fonts. It provides the following generic commands with, in each case,
-the first argument \m{family} specifying the name of the
-Pi font family in question (such as \texttt{psy} for the Symbol font,
-and \texttt{pzd} for the Zapf Dingbats font, see table~\vref{tab:families}).
-If indicated, a second argument \m{number}
-specifies the decimal position of a symbol in that font.
-
-\begin{decl}
- +\Pifont+ \arg{family}
-\end{decl}
-
-This switches to the font family \m{family}
-and the encoding U.
-
-\begin{decl}
- +\Pisymbol+ \arg{family} \arg{number}
-\end{decl}
-
-This command typesets the specified symbol
-(compare this with the +\ding+ command).
-
-\begin{decl}
- +\begin{Pilist}+ \arg{family} \arg{number}\\
- +\begin{Piautolist}+ \arg{family} \arg{number}
-\end{decl}
-
-In the +Pilist+ environment the specified symbol is used in front
-of each item in an itemized list (compare with the +dinglist+
-environment).
-
-+Piautolist+ is an environment where a series of symbols starting
-with the one at the decimal position \m{number} in font family
-\m{family} is used to number the items in an enumerated list
-(compare with the +dingautolist+ environment).
-
-\begin{decl}
- +\Pifill+ \arg{family} \arg{number}\\
- +\Piline+ \arg{family} \arg{number}
-\end{decl}
-
-+\Pifill+ acts like the other filling commands in \TeX, but
-fills the space with a chosen symbol (compare with +\dingfill+).
-
-+\Piline+ typesets a line consisting of several copies of
-the specified symbol, with some space at the left and right
-(compare with +\dingline+).
-
-
-
-\section{NFSS classification}
-Table~\vref{tab:families} lists all text and symbol font shapes
-supported by the basic PSNFSS distribution,
-and the related \ps\ fonts.
-\NEWdescription{2004-09-15 v9.2}
-With the exception of Charter and Utopia, these fonts are commercial products.
-Therefore, most \TeX\ systems include free substitutes instead.
-
-Available encodings are OT1, T1 and TS1, except for
-Symbol and Zapf~Dingbats, which are implemented with encoding U.
-See \cite{fntguide} for how to access a given font shape directly.
-
-Only the font families +pplx+ and +pplj+ provide true small capitals
-(and only in the regular series).
-With the other families the shape `sc' refers to so-called `faked' small capitals,
-whose typographical quality is -- at least -- questionable.
-
-The math font families loaded by the
-\Lpack{mathptm}, \Lpack{mathptmx}, \Lpack{mathpazo} and \Lpack{mathpple} packages
-are not listed here.
-See the documented source file \texttt{psfonts.dtx}
-for information on this topic.
-
-\begin{table}[p]
- \caption{Font shapes supported by the basic PSNFSS distribution}
- \label{tab:families}
- \medskip
-
- {\small
- \begin{tabularx}{\linewidth}{|l|l|l|>{\raggedright\arraybackslash}X|}
- \hline
- \textbf{family} & \textbf{series} & \textbf{shape(s)} & \textbf{\ps{} font names}\\
- \hline\hline
- \multicolumn{4}{|c|}{\textit{Avant Garde}}\\ \hline
- pag & m & n, sl, sc & AvantGarde-Book, AvantGarde-BookOblique\\ \hline
- pag & b & n, sl, sc & AvantGarde-Demi, AvantGarde-DemiOblique\\ \hline \hline
- \multicolumn{4}{|c|}{\textit{Bookman}}\\ \hline
- pbk & l & n, sl, it, sc & Bookman-Light, Bookman-LightItalic\\ \hline
- pbk & db & n, sl, it, sc & Bookman-Demi, Bookman-DemiItalic\\ \hline \hline
- \multicolumn{4}{|c|}{\textit{Charter}}\\ \hline
- bch & m & n, sl, it, sc & CharterBT-Roman, CharterBT-Italic\\ \hline
- bch & b & n, sl, it, sc & CharterBT-Bold, CharterBT-BoldItalic\\ \hline \hline
- \multicolumn{4}{|c|}{\textit{Courier}}\\ \hline
- pcr & m & n, sl, sc & Courier, CourierOblique\\ \hline
- pcr & b & n, sl, sc & Courier-Bold, Courier-BoldOblique\\ \hline \hline
- \multicolumn{4}{|c|}{\textit{Helvetica}}\\ \hline
- phv & m & n, sl, sc & Helvetica, Helvetica-Oblique\\ \hline
- phv & b & n, sl, sc & Helvetica-Bold, Helvetica-BoldOblique\\ \hline
- phv & mc & n, sl, sc & Helvetica-Narrow, Helvetica-Narrow-Oblique\\ \hline
- phv & bc & n, sl, sc & Helvetica-Narrow-Bold, Helvetica-Narrow-BoldOblique\\\hline \hline
- \multicolumn{4}{|c|}{\textit{New Century Schoolbook}}\\ \hline
- pnc & m & n, sl, it, sc & NewCenturySchlbk-Roman, NewCenturySchlbk-Italic\\ \hline
- pnc & b & n, sl, it, sc & NewCenturySchlbk-Bold, NewCenturySchlbk-BoldItalic\\ \hline \hline
- \multicolumn{4}{|c|}{\textit{Palatino}}\\ \hline
- ppl & m & n, sl, it, sc & Palatino-Roman, Palatino-Italic\\ \hline
- ppl & b & n, sl, it, sc & Palatino-Bold, Palatino-BoldItalic\\ \hline
- pplx & m & n, it, sc & Palatino-Roman, Palatino-Italic, Palatino-SC\\ \hline
- pplx & b & n, it & Palatino-Bold, Palatino-BoldItalic\\ \hline
- pplj & m & n, it, sc & Palatino-Roman, Palatino-SC, Palatino-Italic, Palatino-ItalicOsF\\ \hline
- pplj & b & n, it & Palatino-Bold, Palatino-BoldOsF, Palatino-BoldItalic, Palatino-BoldItalicOsF\\ \hline \hline
- \multicolumn{4}{|c|}{\textit{Times}}\\ \hline
- ptm & m & n, sl, it, sc & Times-Roman, Times-Italic\\ \hline
- ptm & b & n, sl, it, sc & Times-Bold, Times-BoldItalic\\ \hline \hline
- \multicolumn{4}{|c|}{\textit{Zapf Chancery}}\\ \hline
- pzc & mb & it & ZapfChancery-MediumItalic\\ \hline \hline
- \multicolumn{4}{|c|}{\textit{Utopia}}\\ \hline
- put & m & n, sl, it, sc & Utopia-Regular, Utopia-Italic\\ \hline
- put & b & n, sl, it, sc & Utopia-Bold, Utopia-BoldItalic\\ \hline \hline
- \multicolumn{4}{|c|}{\textit{Symbol}}\\ \hline
- psy & m & n & Symbol\\ \hline \hline
- \multicolumn{4}{|c|}{\textit{Zapf Dingbats}}\\ \hline
- pzd & m & n & ZapfDingbats\\ \hline
- \end{tabularx}
- \par}
-\end{table}
-
-
-
-\section{Obsolete packages}
-The macro packages listed in table \vref{tab:obsolete} should be considered as obsolete.
-They are provided for compatibility with existing documents only.
-
-\begin{table}[hbt]
-\caption{Obsolete packages in the PSNFSS collection}
-\label{tab:obsolete}
-\medskip
-{\footnotesize
-\begin{center}
-\renewcommand{\arraystretch}{1.2}
-\begin{tabular}{|l|p{1.8cm}p{2.2cm}p{2.4cm}p{2.2cm}|}
-\hline
-\textbf{package} & \textbf{roman} & \textbf{sans serif} & \textbf{typewriter} & \textbf{math} \\\hline\hline
-\Lpack{times} & Times
- & Helvetica
- & Courier
- & \\\hline
-\Lpack{palatino} & Palatino
- & Helvetica
- & Courier
- & \\\hline
-\Lpack{mathptm} & Times
- &
- &
- & $\approx$ Times\\\hline
-\Lpack{mathpple} & Palatino
- &
- &
- & $\approx$ Palatino\\\hline
-\Lpack{utopia} & Utopia
- &
- &
- & \\\hline
-\end{tabular}
-\end{center}
-}
-\end{table}
-
-
-\subsection{The packages \Lpack{times} and \Lpack{palatino}}
-These packages do not load suitable math fonts,
-and they do not scale the Helvetica fonts appropriately
-to match Times and Palatino -- see section \ref{sec:helvet}.
-Use \Lpack{mathptmx} or \Lpack{mathpazo} in conjunction with
-\Lpack{helvet} and \Lpack{courier} instead!
-
-In case you need to load Times or Palatino \emph{without} the
-related math fonts of the PSNFSS bundle, you can still use the
-basic NFSS commands. For instance,
-\begin{quote}
-+\renewcommand{\rmdefault}{ptm}+
-\end{quote}
-changes only the default roman font family to
-\texttt{ptm}, i.e.\ Times.
-
-\subsection{The package \Lpack{mathptm}}
-The package \Lpack{mathptm} is a predecessor to \Lpack{mathptmx}.
-In contrast to the latter and to \LaTeX's standard behavior,
-lowercase Greek in math is typeset upright.
-Zapf Chancery is used as the calligraphic math alphabet,
-which causes some problems with proper spacing.
-\Lpack{mathptm} needs the font \texttt{cmex9}, which may not
-be available in Type~1 format.
-
-\subsection{The package \Lpack{mathpple}}
-\Lpack{mathpple} is a predecessor to \Lpack{mathpazo},
-using also a set of virtual math fonts to go with Palatino.
-The Greek alphabet is, however, taken from the
-Euler fonts (which get slanted), rather than from the Pazo fonts.
-The package \Lpack{mathpple} does not support the
-Palatino SC/OsF fonts, and there is no `blackboard bold' math alphabet.
-Further flaws are:
-\begin{itemize}
- \item The spacing within numbers and function names in formulas
- is somewhat too loose.
- \item The +\coprod+ symbol is missing.
- \item There are no bold variants of +\partial+ and +\infty+.
- \item +\jmath+ is taken from the CM math italic font, which does
- not blend well with Palatino.
- \item DVI viewers may exhibit problems as to rendering of the artificially slanted
- Greek letters.
-\end{itemize}
-The newer \Lpack{mathpazo} package can be considered as
-superior; yet you may still use \Lpack{mathpple}, if you prefer
-the shape of its Greek letters.
-
-\subsection{The package \Lpack{utopia}}
-Use %%\NEWdescription{2003-11-17 v9.1}
-of the \Lpack{utopia}
-package is no longer recommended, because
-the newer package \Lpack{fourier} provides a basically improved
-interface to the Utopia typeface and loads suitable math fonts, too.
-Notice that this package does \emph{not} belong to the PSNFSS collection!
-
-Furthermore, the \LaTeX3 team does no longer regard the Utopia
-fonts as a \emph{required} component of \LaTeX{},
-because their license does not comply with the strict
-guidelines of the FSF.
-
-
-\section{Typeface samples}
-
-The following samples show the regular font of each typeface family
-supported by PSNFSS.
-The particular font size and baselineskip is indicated below the font name.
-Notice that Helvetica is scaled to 92\,\% of the nominal size.
-
-\medskip
-
-\sample{Times}{ptm}{10}{12pt}{}
-
-\sample{Palatino}{pplx}{10}{12.4pt}{}
-
-\sample{Bookman}{pbk}{9.6}{11.5pt}{}
-
-\sample{Charter}{bch}{10}{12.4pt}{}
-
-\sample{New Century Schoolbook}{pnc}{9.6}{12pt}{}
-
-\ifutopia
- \sample{Utopia}{put}{9.6}{12pt}{}
-\fi
-
-\sample{Helvetica}{phv}{10}{12pt}{}
-
-\parbox[t]{\leftwidth}{%
- {\raggedright\footnotesize
- \mbox{}Avant\-Garde\\
- 9.6pt
- \par}}
-\hfill
-\parbox[t]{\rightwidth}{
-{\fontfamily{pag}\fontsize{9.6}{11.5pt}\selectfont\raggedright
- Don't use Avant Garde for typesetting larger portions of text\,!
-\par}}\medskip
-
-\parbox[t]{\leftwidth}{
- {\raggedright\footnotesize
- Courier\\
- 10/12pt
- \par}}
-\hfill
-\parbox[t]{\rightwidth}{
-{\fontfamily{pcr}\fontsize{10}{12pt}\selectfont\raggedright
- A monospaced typeface, suitable for typesetting filenames, URLs etc.
-\par}}\medskip
-
-\parbox[t]{\leftwidth}{
- {\raggedright\footnotesize
- Zapf Chancery\\
- 14.4pt
- \par}}
-\hfill
-\parbox[t]{\rightwidth}{
-{\fontfamily{pzc}\Large\raggedright
-To Hermann Zapf -- whose strokes are the best.
-\par}}\medskip
-
-
-
-\section*{Credits}
-The PSNFSS system was originally developed by Sebastian Rahtz.
-
-The virtual \Lpack{mathptm} and \Lpack{mathptmx} fonts and the related packages
-were created by Alan Jeffrey, Sebastian Rathz and Ulrik Vieth.
-
-The \Lpack{mathpple} package and its virtual fonts are based
-on earlier work by Aloysius Helminck. Special thanks to Daniel Schlieper
-without whose initiative the package would not have been developed.
-
-The Pazo math fonts and the related virtual fonts were created
-by Diego Puga.
-
-
-
-\begin{thebibliography}{1}
-\raggedright
-
-\bibitem{companion}
-Frank Mittelbach et al.:
-\textit{The LaTeX Companion}.\\
-2nd edition. Addison Wesley, 2004.
-
-%\bibitem{gcompanion}
-%Michel Goossens, Sebastian Rahtz, and
-%Frank Mittelbach:\\
-%\textit{The LaTeX Graphics Companion}.\\
-%Addison Wesley Longman, 1997.
-
-\bibitem{fntguide}
-\LaTeX3 Project Team (Ed.):
-\textit{LaTeX2e font selection.}\\
-CTAN: \path{macros/latex/doc/fntguide.pdf}\\
-(Part of the \LaTeX{} online documentation)
-\end{thebibliography}
-
-
-\end{document}
diff --git a/Master/texmf-dist/source/latex/pst-pdf/pst-pdf.dtx b/Master/texmf-dist/source/latex/pst-pdf/pst-pdf.dtx
index bf3cbc1a484..55841e50eff 100644
--- a/Master/texmf-dist/source/latex/pst-pdf/pst-pdf.dtx
+++ b/Master/texmf-dist/source/latex/pst-pdf/pst-pdf.dtx
@@ -24,7 +24,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{pst-pdf}
%<*package>
- [2019/11/15 v1.2e PS graphics for pdfLaTeX (RN,HjG)]
+ [2020/10/10 v1.2f PS graphics for pdfLaTeX (RN,HjG)]
%</package>
%
%<*driver>
@@ -50,7 +50,7 @@
%</driver>
% \fi
%
-% \CheckSum{839}
+% \CheckSum{818}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -748,7 +748,8 @@
\newcommand*\ppf@is@pdfTeX@graphic[5]{%
\@ppf@pdftex@graphicfalse%
\begingroup
- \edef\pdfTeXext{\detokenize\expandafter{#2}}%
+ \edef\pdfTeXext{,#2,}%
+ \edef\pdfTeXext{\detokenize\expandafter{\pdfTeXext}}%
% \end{macrocode}
% \ifGERMAN
% Statt Einladen einer identifizierten Grafik nur Test der Grafikendung.
@@ -758,7 +759,8 @@
% \fi
% \begin{macrocode}
\def\Gin@setfile##1##2##3{%
- \@expandtwoargs\in@{,\detokenize\expandafter{##2},}{,\pdfTeXext,}%
+ \edef\@tempa{,##2,}%
+ \@expandtwoargs\in@{\detokenize\expandafter{\@tempa}}{\pdfTeXext}%
\ifin@\global\@ppf@pdftex@graphictrue\fi}%
% \end{macrocode}
% \ifGERMAN
@@ -822,7 +824,7 @@
% \changes{v1.1q}{2008/02/17}{\cmd{\overfullrule} must not be > 0.}
% \begin{macrocode}
\PackageInfo{pst-pdf}{%
- MODE: \ppf@TeX@mode\space (dvi -- extraction mode)}
+ MODE: \ppf@TeX@mode\space (dvi -- extraction mode)}%
\nofiles
\let\makeindex\@empty \let\makeglossary\@empty \let\printindex\@empty
\renewcommand*\makeindex[1][]{}%
@@ -831,31 +833,28 @@
\AtBeginDocument{\overfullrule=\z@}%
\if@ppf@PST@used\RequirePackage{pstricks}\fi
\RequirePackage[active,dvips,tightpage]{preview}[2005/01/29]%
- \newcommand*\ppf@PreviewBbAdjust{}
+ \newcommand*\ppf@PreviewBbAdjust{}%
\newcommand*\ppf@RestoreBbAdjust{%
\let\PreviewBbAdjust\ppf@PreviewBbAdjust}%
% \end{macrocode}
% \ifGERMAN
% Es werden auch die im pdf\LaTeX-Modus erlaubten Endungen von Grafikdateien
-% ben\"otigt.
+% ben\"otigt (Argument aus `pdftex.def' -- 2020/10/05 -- kopiert).
% \fi
% \ifENGLISH
% The pdf\LaTeX\ mode compliant graphics file formats are needed too.
+% (Argument copied from `pdftex.def' -- 2020/10/05).
% \fi
% \changes{v1.1u}{2008/09/16}{\cmd{\pdfoutput} must be set when
% loading ``pdftex.def'' in DVI mode. (RN)}
% \changes{v1.1v}{2008/10/09}{Local redefinition of \cmd{\pdfoutput} to be a
% counter. (RN)}
+% \changes{v1.2f}{2020/10/10}{No more loading of file `pdftex.def' (RN)}
% \begin{macrocode}
- \begingroup
- \let\AtBeginDocument\@gobble \let\PackageWarningNoLine\@gobbletwo
- \chardef\pdftexversion=121 %
- \newcount\pdfoutput
- \pdfoutput=1 %
- \input{pdftex.def}%
- \edef\x{\endgroup\def\noexpand\ppf@other@extensions{\Gin@extensions}
- }%
- \x
+ \def\ppf@other@extensions{%
+ .pdf,.png,.jpg,.mps,.jpeg,.jbig2,.jb2,%
+ .PDF,.PNG,.JPG,.JPEG,.JBIG2,.JB2%
+ }
% \end{macrocode}
% \changes{v1.1c}{2005/04/17}{Supress handling of pdf\LaTeX\ graphic
% formats in DVI mode. (RN)}
@@ -903,7 +902,7 @@
\define@key{Gin}{ignore}[true]{}%
\define@key{Gin}{showname}[true]{}%
\define@key{Gin}{namefont}{}%
- \@ifundefined{Gin@page}{\define@key{Gin}{page}{}}{}
+ \@ifundefined{Gin@page}{\define@key{Gin}{page}{}}{}%
% \end{macrocode}
% \changes{v1.0o}{2005/03/12}{New code for ``notightpage''. (RN)}
% \changes{v1.1r}{2008/05/02}{Fixed values for \cmd{\PreviewBbAdjust}
@@ -989,7 +988,7 @@
\expandafter\let\expandafter\ppf@pr@psmatrix%
\expandafter=\csname pr@\string\psmatrix\endcsname
\let\ppf@endpsmatrix=\endpsmatrix
- \def\psmatrix{\ppf@test@mmode\ppf@psmatrix}
+ \def\psmatrix{\ppf@test@mmode\ppf@psmatrix}%
\expandafter\def\csname pr@\string\psmatrix\endcsname{%
\ppf@set@mode\ppf@pr@psmatrix}%
\def\endpsmatrix{\ppf@endpsmatrix\ppf@set@mode}%
@@ -1030,7 +1029,7 @@
?({#{(#1)}{({#1})}}{}%
?({#{(#1)}{({#1})}}{}%
?({#{(#1)}{({#1})}}{}%
- }]{\pst@object}}
+ }]{\pst@object}}%
% \end{macrocode}
% \ifGERMAN
% Mehrfaches testweises Setzen von Tabelleninhalten durch ``tabularx''
@@ -1072,7 +1071,7 @@
% \begin{macrocode}
\def\Gscale@@box#1#2#3{%
\toks@{\mbox}%
- }
+ }%
% \end{macrocode}
% \end{macro}
% \begin{macro}{\Ginclude@graphics}
@@ -1175,7 +1174,7 @@
% \begin{macrocode}
\if@ppf@PST@used
\let\ppf@temp\AtBeginDvi\let\AtBeginDvi\@gobble
- \def\c@lor@to@ps#1 #2\@@{}
+ \def\c@lor@to@ps#1 #2\@@{}%
\RequirePackage{pstricks}\let\AtBeginDvi\ppf@temp
\fi
% \end{macrocode}
@@ -1192,8 +1191,8 @@
% Necessary if PSTricks $<$ 2.0.
% \fi
% \begin{macrocode}
- \PSTricksOff
- \def\c@lor@to@ps#1 #2\@@{}
+ \PSTricksOff%
+ \def\c@lor@to@ps#1 #2\@@{}%
}%
}%
% \end{macrocode}
@@ -1204,7 +1203,7 @@
% \PS\ output is now inhibited and later once again.
% \fi
% \begin{macrocode}
- \the\@temptokena
+ \the\@temptokena%
\expandafter\AtBeginDocument\expandafter
{\the\@temptokena\@temptokena{}}%
\@ifundefined{PSTricksLoaded}{}{%
@@ -1294,16 +1293,15 @@
% \end{macrocode}
% \ifGERMAN
% Es werden auch die im DVI-Modus erlaubten Endungen von Grafikdateien
-% ben\"otigt.
+% ben\"otigt (Argument aus `dvips.def' -- 2017/06/20 -- kopiert).
% \fi
% \ifENGLISH
% Too the supported file name extensions from DVI mode are needed.
+% (Argument copied from `dvips.def' -- 2017/06/20).
% \fi
-% \begin{macrocode}
- \begingroup
- \input{dvips.def}%
- \edef\x{\endgroup\def\noexpand\ppf@other@extensions{\Gin@extensions}}%
- \x
+% \changes{v1.2f}{2020/10/10}{No more loading of file `dvisps.def' (RN)}
+% \begin{macrocode}
+ \def\ppf@other@extensions{.eps,.ps,.eps.gz,.ps.gz,.eps.Z,.mps}%
% \end{macrocode}
% \ifGERMAN
% Dummy-Definition f\"ur die im DVI-Modus g\"ultigen Dateitypen.
@@ -1336,7 +1334,7 @@
\or
\ifGin@frame\else\let\@tempa\relax\fi
\fi
- \@tempa
+ \@tempa%
}%
\define@key{Gin}{showname}[true]{%
\lowercase{\Gin@boolkey{#1}}{showname}}%
@@ -1344,7 +1342,7 @@
\begingroup
\@temptokena\expandafter{\ppf@namefont#1}%
\edef\x{\endgroup\def\noexpand\ppf@namefont{\the\@temptokena}}%
- \x
+ \x%
}%
\newcommand*\ppf@filename{}%
\newcommand*\ppf@namefont{\tiny\ttfamily}%
@@ -1435,11 +1433,11 @@
% ``|frame@@=0|''\,$=$\,inner frame, ``|frame@@=1|''\,$=$\,outer frame.
% \fi
% \begin{macrocode}
- \edef\@tempa{\noexpand\ppf@Gin@ii[frame@@=0,\the\@temptokena,
+ \edef\@tempa{\noexpand\ppf@Gin@ii[frame@@=0,\the\@temptokena,%
frame@@=1]{\ppf@tempb}}%
- \@tempa
+ \@tempa%
\ifGin@showname
- \ppf@namefont
+ \ppf@namefont%
\raisebox{-\ht\strutbox}[0pt][0pt]{\llap{\ppf@filename}}%
\gdef\ppf@filename{}%
\fi
@@ -1493,8 +1491,8 @@
\ifnum\c@pspicture>\z@
\filename@parse{\PDFcontainer}%
\PackageWarningNoLine{pst-pdf}{%
- File `\PDFcontainer' not found.\MessageBreak
- Use the following commands to create it:\MessageBreak
+ File `\PDFcontainer' not found. \MessageBreak
+ Use the following commands to create it: \MessageBreak
----------------------------------------------------
\MessageBreak
latex \jobname.tex\MessageBreak
@@ -1568,7 +1566,7 @@
\else
\def\ppf@Gin@keys{}%
\fi
- \ppf@@getpicture
+ \ppf@@getpicture%
\Collect@Body\@gobble}{}%
\AtBeginDocument{%
\@ifundefined{PSTricksLoaded}{}{%
@@ -1649,15 +1647,15 @@
\xdef\ppf@filename{#2}%
\setbox\z@\hbox{\pdfrefximage\@nameuse{ppf@@@#2}}%
\Gin@nat@height\ht\z@ \Gin@nat@width\wd\z@
- \def\Gin@llx{0} \let\Gin@lly\Gin@llx
+ \def\Gin@llx{0}\let\Gin@lly\Gin@llx
\Gin@defaultbp\Gin@urx{\Gin@nat@width}%
\Gin@defaultbp\Gin@ury{\Gin@nat@height}%
- \Gin@bboxtrue\Gin@viewport@code
+ \Gin@bboxtrue\Gin@viewport@code%
\Gin@nat@height\Gin@ury bp%
\advance\Gin@nat@height-\Gin@lly bp%
\Gin@nat@width\Gin@urx bp%
\advance\Gin@nat@width-\Gin@llx bp%
- \Gin@req@sizes
+ \Gin@req@sizes%
\ht\z@\Gin@req@height \wd\z@\Gin@req@width
\leavevmode\box\z@}%
\define@key{Gin}{type}{}%
@@ -1748,14 +1746,14 @@
% \fi
% \begin{macrocode}
\PackageInfo{pst-pdf}{MODE: \ppf@TeX@mode\space (inactive mode)}%
- \newenvironment{postscript}[1][]{\ignorespaces}{}
+ \newenvironment{postscript}[1][]{\ignorespaces}{}%
\let\ppf@is@pdfTeX@graphic\relax
\fi
% \end{macrocode}
% \changes{v1.0f}{2005/02/04}{Config file loading added. (RN)}
% \begin{macrocode}
\InputIfFileExists{pst-pdf.cfg}{%
- \PackageInfo{pst-pdf}{Local config file pst-pdf.cfg used}}{}
+ \PackageInfo{pst-pdf}{Local config file pst-pdf.cfg used}}{}%
%</package>
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/pxpic/pxpic.dtx b/Master/texmf-dist/source/latex/pxpic/pxpic.dtx
new file mode 100644
index 00000000000..9bb8f810972
--- /dev/null
+++ b/Master/texmf-dist/source/latex/pxpic/pxpic.dtx
@@ -0,0 +1,1326 @@
+% \iffalse meta-comment
+%
+% File: pxpic.dtx Copyright (C) 2021 Jonathan P. Spratte
+%
+% This work may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this license or
+% (at your option) any later version. The latest version of this license is in
+% the file:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% ------------------------------------------------------------------------------
+%
+%<*driver>^^A>>=
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+ \expandafter\begingroup
+\fi
+\input l3docstrip.tex
+\askforoverwritefalse
+\preamble
+
+--------------------------------------------------------------
+pxpic -- draw pixel pictures
+E-mail: jspratte@yahoo.de
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+--------------------------------------------------------------
+
+Copyright (C) 2021 Jonathan P. Spratte
+
+This work may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this license or
+(at your option) any later version. The latest version of this license is in
+the file:
+
+ http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+ Jonathan P. Spratte.
+
+This work consists of the file pxpic.dtx
+and the derived files pxpic.pdf
+ pxpic.sty
+
+\endpreamble
+% stop docstrip adding \endinput
+\postamble
+\endpostamble
+\generate{\file{pxpic.sty}{\from{pxpic.dtx}{pkg}}}
+\ifx\fmtname\nameofplainTeX
+ \expandafter\endbatchfile
+\else
+ \expandafter\endgroup
+\fi
+%
+\ProvidesFile{pxpic.dtx}[2021-01-16 v1.2 draw pixel pictures]
+\PassOptionsToPackage{full}{textcomp}
+\documentclass{l3doc}
+\RequirePackage[oldstylenums,nott]{kpfonts}
+\usepackage{pxpic}
+\input{glyphtounicode}
+\pdfgentounicode=1
+\RequirePackage{listings}
+\RequirePackage{booktabs}
+\RequirePackage{array}
+\RequirePackage{collcell}
+\RequirePackage{xcolor}
+\RequirePackage{caption}
+\RequirePackage{microtype}
+\RequirePackage{accsupp}
+\RequirePackage{enumitem}
+\lstset
+ {
+ ,flexiblecolumns=false
+ ,basewidth=.53em
+ ,gobble=2
+ ,basicstyle=\fontfamily{jkp}\itshape
+ ,morekeywords=^^A
+ {^^A
+ \pxpic,\pxpicsetup,\pxpicnewmode,\pxpicsetmode,\pxpicnewcolorlist,
+ \pxpicsetcolorlist,\pxpicaddcolorlist,\pxpicforget,\px,\pxskip,\pxpicHT,
+ \pxpicWD,\pxpiclogo
+ }
+ ,morecomment=[l]\%
+ ,commentstyle=\color[gray]{0.4}
+ ,literate={\{}{{\CodeSymbol\{}}{1}
+ {\}}{{\CodeSymbol\}}}{1}
+ ^^A,literate=*{<key>}{\key}{4}{<set>}{\set}{4}
+ }
+\newcommand*\CodeSymbol[1]{\textbf{#1}}
+\RequirePackage{randtext}
+\let\metaORIG\meta
+\protected\def\meta #1{\texttt{\metaORIG{#1}}}
+\newcommand*\CS{\cs[no-index]}
+\renewcommand*\thefootnote{\fnsymbol{footnote}}
+\definecolor{pxpicred}{HTML}{9F393D}
+\colorlet{pxpicgrey}{black!75}
+\makeatletter
+\newcommand*\pxpicname
+ {^^A
+ \texorpdfstring
+ {^^A
+ \mbox
+ {^^A
+ \BeginAccSupp{ActualText=pxpic}^^A
+ \href{https://github.com/Skillmon/ltx_pxpic}{\pxpiclogo}^^A
+ \EndAccSupp{}^^A
+ }^^A
+ }
+ {pxpic}^^A
+ }
+\definecolor{expkvred}{HTML}{9F393D}
+\colorlet{expkvgrey}{black!75}
+\newcommand*\expkv
+ {^^A
+ \texorpdfstring
+ {^^A
+ \mbox
+ {^^A
+ \BeginAccSupp{ActualText=expkv}^^A
+ \href{https://github.com/Skillmon/tex_expkv}
+ {^^A
+ \rmfamily
+ \bfseries
+ {\color{expkvgrey}e\kern-.05em x\kern-.05em}^^A
+ \lower.493ex
+ \hbox{{\color{expkvgrey}P}\kern-.1em{\color{expkvred}k}}^^A
+ \kern-.18em{\color{expkvred}v}^^A
+ }^^A
+ \EndAccSupp{}^^A
+ }^^A
+ }
+ {expkv}^^A
+ }
+\hypersetup{linkcolor=red!80!black,urlcolor=purple!80!black}
+\DoNotIndex{\advance}
+\DoNotIndex{\baselineskip,\begingroup,\bgroup}
+\DoNotIndex{\csname}
+\DoNotIndex{\def,\detokenize,\dimexpr}
+\DoNotIndex{\edef,\egroup,\ekvdef,\ekvdefNoVal,\ekvifdefinedNoVal,\ekvletkv}
+\DoNotIndex{\ekvparse,\ekvsetdef,\endcsname,\endgroup,\expandafter}
+\DoNotIndex{\hbox,\hskip}
+\DoNotIndex{\iffalse,\fi}
+\DoNotIndex{\kern}
+\DoNotIndex{\leavevmode,\let,\long,\lower}
+\DoNotIndex{\newcommand,\newdimen}
+\DoNotIndex{\PackageError,\protected,\ProvidesPackage}
+\DoNotIndex{\relax,\RequirePackage}
+\DoNotIndex{\@declaredcolor,\@firstofone,\@gobble,\@ifdefinable,\@ifnextchar}
+\DoNotIndex{\@ifundefined,\@undeclaredcolor}
+\DoNotIndex{\ekv@ifempty,\ekv@name,\z@}
+\DoNotIndex{\unexpanded}
+\DoNotIndex{\vbox,\vrule}
+\@ifdefinable\gobbledocstriptag{\def\gobbledocstriptag#1>{}}
+\makeatother
+\newenvironment{options}[1][]
+ {%
+ \begin{description}
+ [
+ style=nextline
+ ,font=\normalfont\ttfamily
+ ,labelindent=-.5\marginparwidth
+ ,labelwidth=\dimexpr.5\marginparwidth-5pt\relax
+ ,labelsep*=5pt
+ ,leftmargin=!
+ ,#1
+ ]%
+ \renewenvironment{options}[1][]
+ {%
+ \begin{description}
+ [
+ style=nextline
+ ,font=\normalfont\ttfamily
+ ,#1
+ ]%
+ }
+ {\end{description}}%
+ }
+ {\end{description}}
+^^A the following pixelart logo is taken from that package's dtx.
+\newcommand*\pixelart
+ {^^A
+ \leavevmode
+ \pxpic[mode=px,colours={M=black},skip=.,size=.15ex]
+ {
+ {MMMMMM...MM...................MMM.....M...............M}
+ {.MM..MM..MM....................MM....MMM.............MM}
+ {.MM..MM........................MM...MM.MM............MM}
+ {.MM..MM.MMM..MM....MM..MMMMM...MM..MM...MM.MM.MMM..MMMMMM}
+ {.MMMMM...MM...MM..MM..MM...MM..MM..MM...MM..MMM.MM...MM}
+ {.MM......MM....MMMM...MMMMMMM..MM..MMMMMMM..MM..MM...MM}
+ {.MM......MM.....MM....MM.......MM..MM...MM..MM.......MM}
+ {.MM......MM....MMMM...MM.......MM..MM...MM..MM.......MM}
+ {.MM......MM...MM..MM..MM...MM..MM..MM...MM..MM.......MM.MM}
+ {MMMM....MMMM.MM....MM..MMMMM..MMMM.MM...MM.MMMM.......MMM}
+ }^^A
+ }
+\begin{document}
+ \title
+ {^^A
+ \texorpdfstring
+ {^^A
+ \Huge
+ \mbox
+ {^^A
+ \BeginAccSupp{ActualText=pxpic}^^A
+ \href{https://github.com/Skillmon/ltx_pxpic}{\pxpiclogo}^^A
+ \EndAccSupp{}^^A
+ }^^A
+ \\[\medskipamount]
+ \Large draw pixel pictures^^A
+ }{pxpic - draw pixel pictures}^^A
+ }
+ \date{2021-01-16 v1.2}
+ \author{Jonathan P. Spratte\thanks{\protect\randomize{jspratte@yahoo.de}}}
+ \DocInput{pxpic.dtx}
+\end{document}
+%</driver>^^A=<<
+% \fi
+%
+% \maketitle
+% \renewcommand*\thefootnote{\arabic{footnote}}
+%
+% \begin{abstract}
+% \noindent\parfillskip=0pt
+% With \pxpicname\ you draw pictures pixel by pixel. It was inspired by a
+% \href{https://tex.stackexchange.com/a/63759/117050}
+% {lovely post by Paulo Cereda},
+% among other things (most notably a beautiful duck) showcasing the use of
+% characters from the Mario video games by Nintendo in \LaTeX.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \begin{documentation}^^A>>=
+%
+% \section{Documentation}
+%
+% \subsection{Drawing pictures}
+%
+% \pxpicname\ supports different input modes, all of them have the same basic
+% parsing behaviour. A \meta{pixel list} contains the pixel colours. The image
+% is built line wise from top left to bottom right. Each row of pixels should be
+% a single \TeX\ argument (so either just one token, or a group delimited by
+% |{}|), and within each line each pixel in turn should be a single \TeX\
+% argument (so either just one token, or a group delimited by |{}|). Spaces and
+% hence single newlines in the sources between \meta{pixel list} elements are
+% ignored. The different modes are explained in \autoref{sec:modes}. The only
+% disallowed token in the \meta{pixel list} is the control sequence
+% \CS{pxpic@end} (plus the usual restrictions of \TeX\ so no unbalanced braces,
+% no macros defined as \CS{outer}).
+%
+% There is a small caveat however: \pxpicname\ draws each pixel individually,
+% and there is really no space between them, however some \textsc{pdf} viewers
+% fail to display such adjacent lines correctly and leave small gaps (basically
+% the same issue which packages like \pkg{colortbl} suffer from as well). In
+% print this shouldn't be an issue, but some rasterisation algorithms employed
+% by viewers and conversion tools have this deficit.
+%
+% \begin{function}{\pxpic}
+% \begin{syntax}
+% \cs{pxpic}\oarg{options}\marg{pixel list}
+% \end{syntax}
+% \meta{options} might be any options as listed in \autoref{sec:options}, and
+% \meta{pixel list} is a list of pixels as described above. \cs{pxpic} parses
+% the \meta{pixel list} and draws the corresponding picture. The result is
+% contained in an \CS{hbox} and can be used wherever \TeX\ expects an
+% \CS{hbox}. As a result, when you're in vertical mode a \cs{pxpic} will form
+% a text line, to prevent this you can use \CS{leavevmode} before it. The
+% \cs{pxpic} will be bottom aligned, you can change this using \CS{raisebox}
+% (or, if you want, \TeX's \CS{raise} and \CS{lower} primitives).
+% \end{function}
+%
+% \subsubsection{Examples}
+%
+% Since the above explanation of the \meta{pixel list} syntax might've been a
+% bit cryptic, and a good documentation should contain examples (this doesn't
+% claim this documentation is \emph{good}), well, here are some examples (you
+% might need to take a look at \autoref{sec:options} and \autoref{sec:modes} to
+% fully understand the examples). Examples in this section will use the
+% following \CS{pxpicsetup}:
+%
+% \begingroup
+% \footnotesize
+% \begin{lstlisting}
+% \pxpicsetup
+% {
+% mode = px
+% ,colours = {k=black, r=[HTML]{9F393D}, g=green!75!black, b=[rgb]{0,0,1}}
+% ,skip = .
+% ,size = 10pt
+% }
+% \end{lstlisting}
+% \endgroup
+%
+% \begingroup
+% \pxpicsetup
+% {
+% mode = px
+% ,colours = {k=black, r=[HTML]{9F393D}, g=green!75!black, b=[rgb]{0,0,1}}
+% ,skip = .
+% ,size = 10pt
+% }
+%
+% We can draw a small cross rather easily:\par\nobreak
+% \noindent
+% \begin{minipage}[c]{.5\linewidth}\footnotesize
+% \begin{lstlisting}
+% \pxpic
+% {
+% {.k}
+% {kkk}
+% {.k}
+% }
+% \end{lstlisting}
+% \end{minipage}
+% \begin{minipage}[c]{.45\linewidth}
+% \leavevmode
+% \pxpic
+% {
+% {.k}
+% {kkk}
+% {.k}
+% }
+% \end{minipage}
+%
+% A small multicoloured grid:\par\nobreak
+% \noindent
+% \begin{minipage}[c]{.5\linewidth}\footnotesize
+% \begin{lstlisting}
+% \pxpic
+% {
+% {brgk}
+% {kbrg}
+% {gkbr}
+% {rgkb}
+% }
+% \end{lstlisting}
+% \end{minipage}
+% \begin{minipage}[c]{.45\linewidth}
+% \leavevmode
+% \pxpic
+% {
+% {brgk}
+% {kbrg}
+% {gkbr}
+% {rgkb}
+% }
+% \end{minipage}
+%
+% A heart (shamelessly copied example from \pixelart):\par\nobreak
+% \noindent
+% \begin{minipage}[c]{.5\linewidth}\footnotesize
+% \begin{lstlisting}
+% \pxpic
+% {
+% {..rr.rr}
+% {.rrrrrrr}
+% {rrrrrrrrr}
+% {rrrrrrrrr}
+% {rrrrrrrrr}
+% {.rrrrrrr}
+% {..rrrrr}
+% {...rrr}
+% {....r}
+% }
+% \end{lstlisting}
+% \end{minipage}
+% \begin{minipage}[c]{.45\linewidth}
+% \leavevmode
+% \pxpic
+% {
+% {..rr.rr}
+% {.rrrrrrr}
+% {rrrrrrrrr}
+% {rrrrrrrrr}
+% {rrrrrrrrr}
+% {.rrrrrrr}
+% {..rrrrr}
+% {...rrr}
+% {....r}
+% }
+% \end{minipage}
+%
+% Using |mode=rgb| to draw a short coloured line:\par\nobreak
+% \noindent
+% \begin{minipage}[c]{.5\linewidth}\footnotesize
+% \begin{lstlisting}
+% \pxpic[mode=rgb]{{{1,0,1}{1,1,0}{0,1,1}}}
+% \end{lstlisting}
+% \end{minipage}
+% \begin{minipage}[c]{.45\linewidth}
+% \leavevmode
+% \pxpic[mode=rgb]{{{1,0,1}{1,1,0}{0,1,1}}}
+% \end{minipage}
+%
+% A multicoloured grid using skips and |mode=cmy|:\par\nobreak
+% \noindent
+% \begin{minipage}[c]{.5\linewidth}\footnotesize
+% \begin{lstlisting}
+% \pxpic[mode=cmy]
+% {
+% {{1,0,1} {1,1,0} {0,1,1} {} }
+% {{} {1,0,1} {1,1,0} {0,1,1}}
+% {{0,1,1} {} {1,0,1} {1,1,0}}
+% {{1,1,0} {0,1,1} {} {1,0,1}}
+% }
+% \end{lstlisting}
+% \end{minipage}
+% \begin{minipage}[c]{.45\linewidth}
+% \leavevmode
+% \pxpic[mode=cmy]
+% {
+% {{1,0,1} {1,1,0} {0,1,1} {} }
+% {{} {1,0,1} {1,1,0} {0,1,1}}
+% {{0,1,1} {} {1,0,1} {1,1,0}}
+% {{1,1,0} {0,1,1} {} {1,0,1}}
+% }
+% \end{minipage}
+%
+% Showing the difference between a skipped and a white pixel:\par\nobreak
+% \noindent
+% \begin{minipage}[c]{.5\linewidth}\footnotesize
+% \begin{lstlisting}
+% \pxpicsetup{colours = {w=white}}
+% \colorbox{gray}{\pxpic{{bbb}{b.b}{bbb}}}
+% \colorbox{gray}{\pxpic{{bbb}{bwb}{bbb}}}
+% \end{lstlisting}
+% \end{minipage}
+% \begin{minipage}[c]{.45\linewidth}
+% \pxpicsetup{colours = {w=white}}
+% \colorbox{gray}{\pxpic{{bbb}{b.b}{bbb}}}
+% \colorbox{gray}{\pxpic{{bbb}{bwb}{bbb}}}
+% \end{minipage}
+%
+% \enlargethispage{1.1\baselineskip}
+% A biggish example: Tux.\footnote{Source:
+% \url{https://www.reddit.com/r/linux/comments/hwpm9j/tux_pixel_art_v10/}} I
+% put two rows of pixels per code line to reduce the size a bit and the code is
+% displayed tinily.\par\nobreak
+% \noindent
+% \begin{minipage}[c]{.5\linewidth}\tiny
+% \begin{lstlisting}
+% \pxpic
+% [
+% size = 2.5pt
+% ,colours = {:=orange,
+% '=black!10,
+% g=black!75,
+% O=orange!80!black}
+% ]
+% {
+% {...........gggg} {.........gggkkggg}
+% {........ggkkkkkkkg} {........gkkkkkkkkg}
+% {........kkkkkkkkkk} {.......gkk.kkkk.kkk}
+% {.......gk.k.kk.k.kk} {.......gk.k.kk.k.kk}
+% {.......gkkkkkkkkkkk} {.......gkkk::::kkkk}
+% {.......gk::::::::kk} {.......gk.:kkkk:kkk}
+% {......gkk..::::'kkkk} {......gkk....'''kkkk}
+% {......gkk....''''kkk} {.....gkk.....''''kkkk}
+% {.....gk.......''''kkk} {....gkk........'''kkkk}
+% {....gkk........'''kkkk} {....gk..........''kkkk}
+% {...gkkg.........'''kkkk} {...gkkkk........'''kkkk}
+% {..OOOOkkk.......'''kOOOO} {..O::::kkk......'''O:::O}
+% {.O::::::kk.....'''::::::O} {.O::::::kkk...''kk::::::O}
+% {O:::::::kkk...'kkk:::::::O} {O:::::::kkk...'kkk:::::::O}
+% {.O:::::::kkkkkkkk:::::::O} {..OO:::::kkkkkkkk:::::OO}
+% {....OO::O.kkkkkk.O::OO} {......OOO........OOO}
+% }
+% \end{lstlisting}
+% \end{minipage}
+% \begin{minipage}[c]{.45\linewidth}
+% \leavevmode
+% \pxpic
+% [
+% size = 2.5pt
+% ,colours = {:=orange,
+% '=black!10,
+% g=black!75,
+% O=orange!80!black}
+% ]
+% {
+% {...........gggg} {.........gggkkggg}
+% {........ggkkkkkkkg} {........gkkkkkkkkg}
+% {........kkkkkkkkkk} {.......gkk.kkkk.kkk}
+% {.......gk.k.kk.k.kk} {.......gk.k.kk.k.kk}
+% {.......gkkkkkkkkkkk} {.......gkkk::::kkkk}
+% {.......gk::::::::kk} {.......gk.:kkkk:kkk}
+% {......gkk..::::'kkkk} {......gkk....'''kkkk}
+% {......gkk....''''kkk} {.....gkk.....''''kkkk}
+% {.....gk.......''''kkk} {....gkk........'''kkkk}
+% {....gkk........'''kkkk} {....gk..........''kkkk}
+% {...gkkg.........'''kkkk} {...gkkkk........'''kkkk}
+% {..OOOOkkk.......'''kOOOO} {..O::::kkk......'''O:::O}
+% {.O::::::kk.....'''::::::O} {.O::::::kkk...''kk::::::O}
+% {O:::::::kkk...'kkk:::::::O} {O:::::::kkk...'kkk:::::::O}
+% {.O:::::::kkkkkkkk:::::::O} {..OO:::::kkkkkkkk:::::OO}
+% {....OO::O.kkkkkk.O::OO} {......OOO........OOO}
+% }
+% \end{minipage}
+%
+% Just for Paulo, a duck. Also, showing that the colour definitions in |mode=px|
+% can be arbitrary tokens or multiple letters:\par\nobreak
+% \noindent
+% \begin{minipage}[c]{.5\linewidth}\tiny
+% \begin{lstlisting}
+% \pxpic[colours = {oo=orange,
+% \ylw=yellow,
+% \blk=black},
+% skip = \skp]
+% {
+% {\skp\skp\skp\ylw\ylw\ylw\ylw}
+% {\skp\skp\ylw\ylw\ylw\ylw\ylw\ylw}
+% {\skp\skp{oo}\ylw\blk\ylw\ylw\ylw}
+% {{oo}{oo}{oo}\ylw\ylw\ylw\ylw\ylw}
+% {\skp{oo}{oo}{oo}\ylw\ylw\ylw\skp\skp\skp\skp\skp\ylw}
+% {\skp\skp\skp\ylw\ylw\ylw\ylw\ylw\ylw\ylw\skp\ylw\ylw}
+% {\skp\skp\ylw\ylw\ylw\ylw\ylw\ylw\ylw\ylw\ylw\ylw\ylw}
+% {\skp\ylw\ylw\ylw\ylw\ylw\ylw\ylw\ylw\skp\ylw\ylw}
+% {\skp\ylw\ylw\skp\ylw\ylw\ylw\ylw\skp\ylw\ylw\ylw}
+% {\skp\ylw\ylw\ylw\skp\skp\skp\skp\ylw\ylw\ylw}
+% {\skp\skp\ylw\ylw\ylw\ylw\ylw\ylw\ylw\ylw}
+% {\skp\skp\skp\skp\ylw\ylw\ylw\ylw\ylw}
+% }
+% \end{lstlisting}
+% \end{minipage}
+% \begin{minipage}[c]{.45\linewidth}
+% \leavevmode
+% \pxpic[colours = {oo=orange,
+% \ylw=yellow,
+% \blk=black},
+% skip = \skp]
+% {
+% {\skp\skp\skp\ylw\ylw\ylw\ylw}
+% {\skp\skp\ylw\ylw\ylw\ylw\ylw\ylw}
+% {\skp\skp{oo}\ylw\blk\ylw\ylw\ylw}
+% {{oo}{oo}{oo}\ylw\ylw\ylw\ylw\ylw}
+% {\skp{oo}{oo}{oo}\ylw\ylw\ylw\skp\skp\skp\skp\skp\ylw}
+% {\skp\skp\skp\ylw\ylw\ylw\ylw\ylw\ylw\ylw\skp\ylw\ylw}
+% {\skp\skp\ylw\ylw\ylw\ylw\ylw\ylw\ylw\ylw\ylw\ylw\ylw}
+% {\skp\ylw\ylw\ylw\ylw\ylw\ylw\ylw\ylw\skp\ylw\ylw}
+% {\skp\ylw\ylw\skp\ylw\ylw\ylw\ylw\skp\ylw\ylw\ylw}
+% {\skp\ylw\ylw\ylw\skp\skp\skp\skp\ylw\ylw\ylw}
+% {\skp\skp\ylw\ylw\ylw\ylw\ylw\ylw\ylw\ylw}
+% {\skp\skp\skp\skp\ylw\ylw\ylw\ylw\ylw}
+% }
+% \end{minipage}
+%
+% Another example might be the definition of \CS{pxpiclogo} in
+% \autoref{sec:implementation:pxpiclogo}.
+%
+% Who still needs \env{picture}-mode or complicated packages like
+% \pkg{pstricks} or Ti\emph{k}Z with such pretty pictures?
+%
+% \endgroup
+%
+% \subsection{Setting options}\label{sec:options}
+%
+% To control its behaviour \pxpicname\ uses a key=value interface powered by
+% \expkv. Options can be set either in the optional argument of
+% \CS{pxpic} or with
+%
+% \begin{function}{\pxpicsetup}
+% \begin{syntax}
+% \cs{pxpicsetup}\marg{options}
+% \end{syntax}
+% Sets the \meta{options} locally to the current \TeX\ group.
+% \end{function}
+%
+% \medskip\noindent
+% Package options are not supported.
+%
+% \bigskip
+% The available options are
+%
+% \begin{options}
+% \item[colors=\meta{colour list}]
+% Define pixel colours for |mode=px|, see \autoref{sec:colours} for a
+% description of the value's syntax. No pixel definitions are made by the
+% package.
+% \item[colours]
+% \emph{see \texttt{colors}.}
+% \item[color-list=\meta{choice}]
+% loads a previously through \CS{pxpicnewcolorlist} defined colour list. No
+% colour lists are defined by the package.
+% \item[colour-list]
+% \emph{see \texttt{color-list}.}
+% \item[gap-hack=\meta{dimen}]
+% To fix the issues with visible gaps in \textsc{pdf} viewers you can
+% introduce some negative kerns to make the pixels overlap (lines overlap to
+% the top, pixels to the left). This option expects a dimension as its
+% value. A positive value will (maybe) close the gaps, a negative value will
+% introduce real gaps. In any case the outermost pixels' borders still
+% coincide with the borders of the surrounding \CS{hbox}. Take a look at my
+% babbling about this issue in \autoref{sec:misc}.
+% \item[ht=\meta{dimen}]
+% Set the height of the pixels.
+% \item[mode=\meta{choice}]
+% Set the used mode, see \autoref{sec:modes} for available modes. Initial
+% value is |px|.
+% \item[size=\meta{dimen}]
+% Set both |ht| and |wd|. Initial value is \the\pxpicHT.
+% \item[skip=\meta{dimen}]
+% Define the value to be a skip (an empty space of width |wd|) in |mode=px|.
+% No skip definitions are made by the package.
+% \item[wd=\meta{dimen}]
+% Set the width of the pixels.
+% \end{options}
+%
+% \subsubsection{Colour syntax}\label{sec:colours}
+%
+% In the value of the |colours| option you'll have to use the following syntax.
+% Use a comma separated key=value list in which each key corresponds to a new
+% pixel name for |mode=px|, and each value to the used colour. If the colour
+% starts with an opening bracket use the complete value as is behind \CS{color},
+% else use the whole value as the first mandatory argument to \CS{color} with a
+% set of braces added. For example to define |r| as the named colour |red|, and
+% |x| as the colour |#abab0f| (in the \textsc{html} colour model) use:
+% \begin{lstlisting}
+% colours = {r=red, x=[HTML]{abab0f}}
+% \end{lstlisting}
+%
+% \subsubsection{Available modes}\label{sec:modes}
+%
+% \begin{options}
+% \item[px]
+% As already mentioned, \pxpicname\ supports different modes of input. The
+% easiest to use |mode| is |px|, in which each element of the \meta{pixel
+% list} has been previously defined as either a coloured pixel (using the
+% |colour| option) or as a skipped pixel (using the |skip| option, resulting
+% in a fully transparent pixel). Each element will be \CS{detokenize}d, so
+% (within \TeX's limitations) the name of a pixel can be arbitrary. This is
+% the initial mode \pxpicname\ uses. But other options are available as
+% well.
+% \item[named]
+% Another |mode| is |named|, in which each element of the \meta{pixel list}
+% should be a named colour (or colour expression) known to \pkg{xcolor}.
+% Each element will be used like so: |{\color{|\meta{element}|}\px}|. An
+% exception is an element which is empty (|{}|), which will be a skipped
+% pixel.
+% \item[rgb, cmy, cmyk, hsb, Hsb, tHsb, gray, RGB, HTML, HSB, Gray, wave]
+% The modes |rgb|, |cmy|, |cmyk|, |hsb|, |Hsb|, |tHsb|, |gray|, |RGB|,
+% |HTML|, |HSB|, |Gray|, and |wave| correspond to the different colour
+% models supported by \pkg{xcolor}. With these modes each element of the
+% \meta{pixel list} will be the values in these colour models, so they'll be
+% used like so: |{\color[|\meta{mode}|]{|\meta{element}|}\px}|. An
+% exception is an element which is empty (|{}|), which will be a skipped
+% pixel.
+% \end{options}
+%
+% You can define additional modes selectable with the |mode| option using the
+% macros |\pxpicnewmode| or |\pxpicsetmode|.
+%
+% \subsection{Other customisation macros}
+%
+% \begin{function}{\pxpicnewmode,\pxpicsetmode}
+% \begin{syntax}
+% \cs{pxpicnewmode}\marg{name}\marg{definition}
+% \end{syntax}
+% You can define your own modes with \cs{pxpicnewmode}. Inside
+% \meta{definition} |#1| is the currently parsed item in the \CS{pxpic}
+% \meta{pixel list}. You can output a pixel using \CS{px}, and skip a pixel
+% using \CS{pxskip}. The pixel will use the currently active colour (so if you
+% want to draw a red pixel you could use |{\color{red}\px}|).
+% \cs{pxpicnewmode} will throw an error if you try to define a mode which
+% already exists, \cs{pxpicsetmode} has no checks on the name.
+% \end{function}
+%
+% \begin{function}{\pxpicnewcolorlist,\pxpicsetcolorlist,\pxpicaddcolorlist}
+% \begin{syntax}
+% \cs{pxpicnewcolorlist}\marg{name}\marg{colour list}
+% \end{syntax}
+% This defines a colour list (to be used with the |colour-list| option). The
+% syntax of \meta{colour list} is the same as for the |colours| option. The
+% pixels aren't directly defined, but only by the use of
+% |colour-list=|\meta{name}. So
+% \begin{lstlisting}
+% \pxpicnewcolorlist{example}{r=red,b=blue,g=green,k=black,w=white}
+% \pxpicsetup{colour-list=example}
+% \end{lstlisting}
+% would have the same effect as
+% \begin{lstlisting}
+% \pxpicsetup{colours={r=red,b=blue,g=green,k=black,w=white}}
+% \end{lstlisting}
+% but a |colour-list| is more efficient if used multiple times. The |new|
+% variant will only throw an error if the colour list \meta{name} is already
+% defined. The |set| variant has no such tests, and the |add| variant will add
+% additional colours to an existing list.
+% \end{function}
+%
+% \begin{function}{\pxpicforget}
+% \begin{syntax}
+% \cs{pxpicforget}\marg{px}
+% \end{syntax}
+% Undefines the \meta{px} definition for use in |mode=px| (or skip symbol)
+% added with the |colours| (or |skip|) option.
+% \end{function}
+%
+% \subsection{Other macros}
+%
+% \begin{function}{\px,\pxskip}
+% Inside of a \CS{pxpic} the macro \cs{px} draws a pixel (of the currently
+% active colour), and \cs{pxskip} leaves out a pixel (so this one pixel is
+% fully transparent). Use this in the \meta{definition} of a mode in
+% \CS{pxpicnewmode}.
+% \end{function}
+%
+% \begin{variable}{\pxpicHT,\pxpicWD}
+% These two are |dimen| registers storing the height and width of the pixels.
+% \end{variable}
+%
+% \begin{function}{\pxpiclogo}
+% \begin{syntax}
+% \cs{pxpiclogo}\oarg{size}
+% \end{syntax}
+% This draws the logo of \pxpicname. The \meta{size} controls the pixel size.
+% \end{function}
+%
+% \subsection{Miscellaneous}\label{sec:misc}
+%
+% If you find bugs or have suggestions I'll be glad to hear about it, you can
+% either open a ticket on Github (\url{https://github.com/Skillmon/ltx_pxpic})
+% or email me (see the first page).
+%
+% A similar package is \pixelart, which, as of writing this, is described as a
+% ``working draft'' by its author. \pxpicname\ wasn't intended as a direct
+% competitor (I already started coding \pxpicname\ when I learned about
+% \pixelart's existence), but I took inspiration from the ``Bugs, Ideas,
+% Undefined behaviours'' section of \pixelart's documentation for the syntax of
+% |mode=px|.
+%
+% \paragraph{Regarding the gap issue:}
+% The pixels are output touching each other with no real gap, however some
+% \textsc{pdf} viewers and tools will display such a gap. To make things even
+% worse, the effect depends on the viewers current magnification.
+% \pxpicname\ has the |gap-hack| option to provide some crude hack that might
+% fix the issue, at the cost that the pixels on the far right and bottom are
+% bigger than they were specified to be. Also pixels next to skipped pixels have
+% a different size (skipped pixels don't cover pixels to their left or top as
+% they are transparent). You'll want to find a good trade-off value if you want
+% to use |gap-hack|, that mitigates the effect but isn't too big (to make the
+% errors less obvious). You can play with the value and decide for yourself
+% what's the lesser evil. Or you do like me, don't use |gap-hack| and blame the
+% viewers. Here are examples in which you can compare (the |gap-hack| is chosen
+% way too big in this example and skips are used close to white pixels on
+% purpose, but it illustrates the effects; the third output, not shown in the
+% code, uses a more reasonable |gap-hack=.2pt|):\par\nobreak
+% \noindent
+% \begin{minipage}[c]{.5\linewidth}\footnotesize
+% \begin{lstlisting}
+% \pxpicsetup
+% {
+% colours={k=black,g=green,w=white}
+% ,skip=.
+% ,size=10pt
+% }
+% \pxpic[gap-hack=2pt]
+% {
+% {kkkkk}
+% {kgggk}
+% {kwg.k}
+% {kg.gk}
+% {kgwk}
+% {kkkw}
+% }
+% \raise2pt\pxpic
+% {
+% {kkkkk}
+% {kgggk}
+% {kwg.k}
+% {kg.gk}
+% {kgwk}
+% {kkkw}
+% }
+% \end{lstlisting}
+% \end{minipage}
+% \begin{minipage}[c]{.45\linewidth}
+% \pxpicsetup{colours={k=black,g=green,w=white},skip=.,size=10pt}
+% \leavevmode
+% \pxpic[gap-hack=2pt]
+% {
+% {kkkkk}
+% {kgggk}
+% {kwg.k}
+% {kg.gk}
+% {kgwk}
+% {kkkw}
+% }
+% \raise2pt\pxpic
+% {
+% {kkkkk}
+% {kgggk}
+% {kwg.k}
+% {kg.gk}
+% {kgwk}
+% {kkkw}
+% }
+% \raise1.8pt\pxpic[gap-hack=.2pt]
+% {
+% {kkkkk}
+% {kgggk}
+% {kwg.k}
+% {kg.gk}
+% {kgwk}
+% {kkkw}
+% }
+% \end{minipage}
+%
+%
+% \end{documentation}^^A=<<
+%
+% \begin{implementation}^^A>>=
+%
+% \gobbledocstriptag
+%<*pkg>
+%
+% \clearpage
+%
+% \section{Implementation}^^A>>=
+%
+% Report who we are
+% \begin{macrocode}
+\ProvidesPackage{pxpic}[2021-01-16 v1.2 draw pixel pictures]
+% \end{macrocode}
+% and load dependencies
+% \begin{macrocode}
+\RequirePackage{xcolor}
+\RequirePackage{expkv}
+% \end{macrocode}
+% \begin{variable}{\pxpicHT,\pxpicWD}
+% These two variables store the height and width of a pixel.
+% \begin{macrocode}
+\@ifdefinable\pxpicHT{\newdimen\pxpicHT}
+\@ifdefinable\pxpicWD{\newdimen\pxpicWD}
+\pxpicHT1pt
+\pxpicWD\pxpicHT
+% \end{macrocode}
+% \end{variable}
+% \begin{variable}[internal]{\pxpic@kern}
+% To fix the visible gaps in some \textsc{pdf} viewers if the user chooses so
+% with the |gap-hack| option we introduce some \CS{kern}s of the length
+% stored in this register.
+% \begin{macrocode}
+\@ifdefinable\pxpic@kern{\newdimen\pxpic@kern}
+\pxpic@kern\z@
+% \end{macrocode}
+% \end{variable}
+%
+%
+% \subsection{Options}
+%
+% We define the options using \expkv\ directly (no fancy options are involved
+% and these are just a few anyway).
+%
+% The first few options are straight forward. We use \expkv's name space to
+% actually store the |skip| and |px| definitions, hence we use
+% \CS{ekvdefNoVal} in the code of |skip|.
+%
+% \begin{macrocode}
+\protected\ekvdef{pxpic}{size}
+ {\pxpicHT\dimexpr#1\relax\pxpicWD\dimexpr#1\relax}
+\protected\ekvdef{pxpic}{ht}{\pxpicHT\dimexpr#1\relax}
+\protected\ekvdef{pxpic}{wd}{\pxpicWD\dimexpr#1\relax}
+\protected\ekvdef{pxpic}{gap-hack}{\pxpic@kern\dimexpr#1\relax}
+\protected\ekvdef{pxpic}{skip}{\ekvdefNoVal{pxpic@px}{#1}{\pxskip}}
+% \end{macrocode}
+% The |colours| option is parsed using \CS{ekvparse} and \CS{pxpic@setcolor}.
+% \begin{macrocode}
+\protected\ekvdef{pxpic}{colors}{\ekvparse\pxpic@err@noval\pxpic@setcolor{#1}}
+\ekvletkv{pxpic}{colours}{pxpic}{colors}
+% \end{macrocode}
+% And the |mode| just checks whether the |mode| macro is defined and lets the
+% auxiliary macro \CS{pxpic@parse@px} to the defined |mode|.
+% \begin{macrocode}
+\protected\ekvdef{pxpic}{mode}
+ {%
+ \@ifundefined{pxpic@parse@px@#1}%
+ {\pxpic@err@unknown@mode{#1}}%
+ {%
+ \expandafter\let\expandafter\pxpic@parse@px
+ \csname pxpic@parse@px@#1\endcsname
+ }%
+ }
+% \end{macrocode}
+% A similar check is done for the |colour-list| option.
+% \begin{macrocode}
+\protected\ekvdef{pxpic}{color-list}
+ {%
+ \@ifundefined{pxpic@colorlist@#1}%
+ {\pxpic@err@unknown@colorlist{#1}}
+ {\csname pxpic@colorlist@#1\endcsname}%
+ }
+\ekvletkv{pxpic}{colour-list}{pxpic}{color-list}
+% \end{macrocode}
+%
+%
+% \subsection{User macros}\label{sec:implementation:pxpiclogo}
+%
+% \begin{macro}{\pxpic}
+% \begin{macro}[internal]{\pxpic@}
+% \CS{pxpic} expands directly to an opened \CS{hbox}, the auxiliary
+% \CS{pxpic@} checks for the optional argument and inserts the rest of the
+% code. We need to set \CS{baselineskip} to \CS{pxpicHT} so that the pixels
+% are stacked vertically without gaps. \CS{pxpic@parse} will parse the
+% \meta{pixel list} until \CS{pxpic@end} is hit. The final \CS{egroup} closes
+% the \CS{hbox}. The row-wise output is done via a \CS{vbox} in which each
+% pixel row will be wrapped inside an \CS{hbox}. The \CS{kern} negates a
+% negative \CS{kern} in \CS{pxpic@parse} so that the first line isn't moved.
+% \begin{macrocode}
+\@ifdefinable\pxpic{\protected\def\pxpic{\hbox\bgroup\pxpic@}}
+\newcommand\pxpic@[2][]
+ {%
+ \vbox
+ {%
+ \pxpicsetup{#1}%
+ \let\px\pxpic@px
+ \let\pxskip\pxpic@skip
+ \advance\pxpicHT\pxpic@kern
+ \advance\pxpicWD\pxpic@kern
+ \baselineskip\pxpicHT
+ \kern\pxpic@kern
+ \pxpic@parse#2\pxpic@end
+ }%
+ \egroup
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\pxpicsetup}
+% Just directly defined to call \expkv's parser for the \pxpicname\ set.
+% \begin{macrocode}
+\ekvsetdef\pxpicsetup{pxpic}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pxpiclogo}
+% The logo is just a biggish pixel picture. The \CS{lower} will move it down a
+% bit so that it appears correctly aligned on the baseline. Since the logo
+% should be part of a normal sentence in most usages we put \CS{leavevmode}
+% before it. Also we make sure that the |mode| and |px| definitions are
+% correct.
+% \begin{macrocode}
+\newcommand*\pxpiclogo[1][.13ex]
+ {%
+ \begingroup
+ \pxpicHT\dimexpr#1\relax
+ \pxpicWD\pxpicHT
+ \pxpic@kern\z@
+ \leavevmode
+ \lower3.2\pxpicHT\pxpic
+ [mode=px,colours={o=[HTML]{9F393D},g=black!75},skip=.]
+ {
+ {............................................g}
+ {...........................................gggg}
+ {.oooo.......................gggg...........ggg}
+ {.ooooo...oo......oo...oo....ggggg...gg......g..........g}
+ {.ooooooooooo...ooooo..oooo..ggggggggggg...ggggg...ggggggg}
+ {..ooooo..oooo.ooooooooooo....ggggg..gggg.ggggggg.ggggggggg}
+ {...oooo..oooo....ooooo........gggg..gggg...gggg..gggg.ggg}
+ {...oooo..oooo.....oooo........gggg..gggg...gggg..gggg}
+ {.oooooo..oooo.....ooooo.....gggggg..gggg...gggg..gggg}
+ {oooooooooooo...ooooooooo...gggggggggggg....gggg..ggggggggg}
+ {o.oooooooo....ooooo.oooooo.g.gggggggg......ggggg..ggggggg}
+ {...ooo.o......o.oo...oo.......ggg.g.........gg......ggg}
+ {...ooo........................ggg}
+ {...ooo........................ggg}
+ {....o..........................g}
+ }%
+ \endgroup
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pxpicforget}
+% Straight forward, just let the |px| macro to an undefined macro.
+% \begin{macrocode}
+\newcommand\pxpicforget[1]
+ {\expandafter\let\csname\ekv@name{pxpic@px}{#1}N\endcsname\pxpic@undef}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pxpicnewmode,\pxpicsetmode}
+% These are pretty simple as well, the |new| variant will use \CS{newcommand}
+% which will do the testing for us, the |set| variant uses \CS{def}.
+% \begin{macrocode}
+\protected\long\def\pxpicnewmode#1#2%
+ {\expandafter\newcommand\csname pxpic@parse@px@#1\endcsname[1]{#2}}
+\protected\long\def\pxpicsetmode#1#2%
+ {\long\expandafter\def\csname pxpic@parse@px@#1\endcsname##1{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pxpicnewcolorlist,\pxpicsetcolorlist,\pxpicaddcolorlist}
+% \begin{macro}[internal]{\pxpicsetcolorlist@,\pxpicaddcolorlist@}
+% The colour list is first parsed with \CS{ekvparse} inside an \CS{edef}.
+% \CS{ekvparse} will prevent the parsed list from further expanding, leaving
+% each list element and \CS{pxpic@experr@noval} or
+% \CS{pxpic@setcolor@colorlist} before it. In a second \CS{edef} these will be
+% expanded, \CS{pxpic@experr@noval} throwing an error for each element missing
+% a colour definition, and \CS{pxpic@setcolor@colorlist} testing for an
+% opening bracket (which we do expandably) and leaving the correct definition
+% protected against further expansion. The |add| variant uses a temporary
+% macro for the parsing part and adds the result to the list holding macro.
+% The second expansion step in |set| and both in |add| are done inside a group
+% to revert any definition (also those letting tokens to \CS{relax} by
+% \CS{csname}) made at this point except for the list macro itself.
+% \begin{macrocode}
+\protected\def\pxpicnewcolorlist#1%
+ {%
+ \@ifundefined{pxpic@colorlist@#1}
+ {\pxpicsetcolorlist{#1}}
+ {\pxpic@err@defined@colorlist{#1}\@gobble}%
+ }
+\protected\def\pxpicsetcolorlist#1%
+ {\expandafter\pxpicsetcolorlist@\csname pxpic@colorlist@#1\endcsname}
+\protected\long\def\pxpicsetcolorlist@#1#2%
+ {%
+ \edef#1{\ekvparse\pxpic@experr@noval\pxpic@setcolor@colorlist{#2}}%
+ \begingroup\edef#1{\endgroup\protected\def\unexpanded{#1}{#1}}%
+ #1%
+ }
+\protected\def\pxpicaddcolorlist#1%
+ {%
+ \@ifundefined{pxpic@colorlist@#1}
+ {\pxpic@err@unknown@colorlist{#1}\@gobble}
+ {\expandafter\pxpicaddcolorlist@\csname pxpic@colorlist@#1\endcsname}%
+ }
+\protected\long\def\pxpicaddcolorlist@#1#2%
+ {%
+ \begingroup
+ \edef\pxpic@tmp
+ {\ekvparse\pxpic@experr@noval\pxpic@setcolor@colorlist{#2}}%
+ \edef\pxpic@tmp
+ {%
+ \endgroup
+ \protected\def\unexpanded{#1}{\unexpanded\expandafter{#1}\pxpic@tmp}%
+ }%
+ \pxpic@tmp
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Parser}
+%
+% \begin{macro}[internal]{\pxpic@ifend,\pxpic@ifempty,\pxpic@ifbracket}
+% These are three helper macros. The first just gobbles everything until the
+% next \CS{pxpic@end}, and we borrow a fast test for an empty argument from
+% \expkv. The last can be used to check for an opening bracket if used like
+% |\pxpic@ifbracket|\hskip0pt|\pxpic@end|\hskip0pt|#1.\pxpic@end|\hskip0pt
+% |[]\pxpic@end|.
+% \begin{macrocode}
+\long\def\pxpic@ifend#1\pxpic@end{}
+\let\pxpic@ifempty\ekv@ifempty
+\long\def\pxpic@ifbracket#1\pxpic@end[#2]\pxpic@end{\pxpic@ifempty{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\pxpic@openbrace}
+% For some weirder \TeX\ programming it is sometimes necessary to insert an
+% unmatched opening brace. This code does exactly that if it's expanded twice.
+% It is put into a single macro so that one can \CS{expandafter} it easier.
+% \begin{macrocode}
+\newcommand*\pxpic@openbrace{\expandafter{\iffalse}\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\pxpic@parse,\pxpic@done}
+% The parsing loop is pretty simple, first check whether we're done, else open
+% a new \CS{hbox} (which will form a row in the \CS{vbox} placed by
+% \CS{pxpic@}) in which the inner parsing loop is run. Then call the next
+% iteration. If we're done just gobble the remainder of the current iteration.
+% First we introduce our \CS{kern} which might fix the gap issue. Another
+% \CS{kern} is done at the start of each \CS{hbox} to compensate the
+% unnecessary \CS{kern} done by the first \CS{pxpic@parseline}.
+% \begin{macrocode}
+\newcommand\pxpic@parse[1]
+ {%
+ \pxpic@ifend#1\pxpic@done\pxpic@end
+ \kern-\pxpic@kern
+ \hbox{\kern\pxpic@kern\pxpic@parseline#1\pxpic@end}%
+ \pxpic@parse
+ }
+\long\def\pxpic@done\pxpic@end\kern-\pxpic@kern\hbox#1\pxpic@parse{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\pxpic@parseline,\pxpic@linedone}
+% The line parsing loop also checks whether we're done, if not we place a
+% pixel using the current definition of \CS{pxpic@parse@px} (which will be set
+% by the current |mode|) and afterwards call the next iteration. If we're done
+% we gobble the remainder of the current iteration and control goes back to
+% \CS{pxpic@parse}. Before each pixel we introduce a negative \CS{kern} to
+% maybe fix the gap issue by letting the pixels overlap a bit.
+% \begin{macrocode}
+\newcommand\pxpic@parseline[1]
+ {%
+ \pxpic@ifend#1\pxpic@linedone\pxpic@end
+ \kern-\pxpic@kern
+ \pxpic@parse@px{#1}%
+ \pxpic@parseline
+ }
+\long\def\pxpic@linedone
+ \pxpic@end\kern-\pxpic@kern\pxpic@parse@px#1\pxpic@parseline
+ {}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Modes}
+%
+% The modes define how a single element of the \meta{pixel list} is parsed.
+%
+% \begin{macro}[internal]{\pxpic@parse@px@px,\pxpic@parse@px}
+% In the |px| mode we check whether the pixel is defined (using the name space
+% of \expkv), if so call it, else throw an error and skip. Since this is also
+% the initial |mode| we \CS{let} the auxiliary macro \CS{pxpic@parse@px} to
+% this mode here.
+% \begin{macrocode}
+\newcommand\pxpic@parse@px@px[1]
+ {%
+ \ekvifdefinedNoVal{pxpic@px}{#1}
+ {\csname\ekv@name{pxpic@px}{#1}N\endcsname}%
+ {%
+ \pxpic@err@unknown@px{#1}%
+ \pxskip
+ }%
+ }
+\let\pxpic@parse@px\pxpic@parse@px@px
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\pxpic@parse@px@named}
+% |named| just checks whether the skip is empty. If so skip, else call
+% \CS{color} with the element and output a pixel.
+% \begin{macrocode}
+\newcommand\pxpic@parse@px@named[1]
+ {%
+ \pxpic@ifempty{#1}
+ {\pxskip}
+ {{\@declaredcolor{#1}\px}}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]
+% {
+% \pxpic@parse@px@rgb,
+% \pxpic@parse@px@cmy,
+% \pxpic@parse@px@cmyk,
+% \pxpic@parse@px@hsb,
+% \pxpic@parse@px@Hsb,
+% \pxpic@parse@px@tHsb,
+% \pxpic@parse@px@gray,
+% \pxpic@parse@px@RGB,
+% \pxpic@parse@px@HTML,
+% \pxpic@parse@px@HSB,
+% \pxpic@parse@px@Gray,
+% \pxpic@parse@px@wave
+% }
+% The colour model modes are all the same in principle. They test for an empty
+% element to introduce a skip, else they call \CS{color} with the respective
+% colour model and output a pixel. We use the auxiliary \CS{pxpic@tmp} to do
+% all those definitions and undefine it afterwards.
+% \begin{macrocode}
+\def\pxpic@tmp#1%
+ {%
+ \pxpicnewmode{#1}%
+ {%
+ \pxpic@ifempty{##1}
+ {\pxskip}
+ {{\@undeclaredcolor[#1]{##1}\px}}%
+ }%
+ }
+\pxpic@tmp{rgb}
+\pxpic@tmp{cmy}
+\pxpic@tmp{cmyk}
+\pxpic@tmp{hsb}
+\pxpic@tmp{Hsb}
+\pxpic@tmp{tHsb}
+\pxpic@tmp{gray}
+\pxpic@tmp{RGB}
+\pxpic@tmp{HTML}
+\pxpic@tmp{HSB}
+\pxpic@tmp{Gray}
+\pxpic@tmp{wave}
+\let\pxpic@tmp\pxpic@undef
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Pixel and Skip}
+%
+% \begin{macro}[internal]{\pxpic@px,\pxpic@skip}
+% The actual definition of pixels and skips is stored in macros to which the
+% frontend macros \CS{px} and \CS{pxskip} will be let inside of \CS{pxpic}.
+% \begin{macrocode}
+\newcommand\pxpic@px{\vrule height\pxpicHT width\pxpicWD depth\z@}
+\newcommand\pxpic@skip{\hskip\pxpicWD}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Parser for colours}
+%
+% \begin{macro}[internal]{\pxpic@setcolor,\pxpic@setcolor@a,\pxpic@setcolor@b}
+% First we test whether the colour starts with an opening bracket or not.
+% Depending on that we either just put the colour after \CS{color}, or put
+% braces around it (as it then is a colour expression for \pkg{xcolor} and
+% just a single argument). \CS{pxpic@setcolor} defines a |px| in the name
+% space of \expkv\ (this has a slight overhead during definition, but \expkv\
+% is fast in checking whether one of its keys is defined or not, and reduces
+% the amount of code in this package).
+% \begin{macrocode}
+\newcommand\pxpic@setcolor[2]
+ {%
+ \pxpic@ifbracket\pxpic@end#2.\pxpic@end[]\pxpic@end
+ \pxpic@setcolor@a\pxpic@setcolor@b
+ {#1}{#2}%
+ }
+\newcommand\pxpic@setcolor@a[2]
+ {%
+ \expandafter\def\csname\ekv@name{pxpic@px}{#1}N\endcsname
+ {{\@declaredcolor{#2}\px}}%
+ }
+\newcommand\pxpic@setcolor@b[2]
+ {%
+ \expandafter\def\csname\ekv@name{pxpic@px}{#1}N\endcsname
+ {{\@undeclaredcolor#2\px}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\pxpic@setcolor@colorlist}
+% This macro should leave the correct code in the input stream to define a
+% single pixel. It is to be used inside of \CS{edef}, hence using
+% \CS{unexpanded}, which doesn't have an opening brace directly after it
+% so that the \CS{pxpic@ifbracket} test is fully expanded. Next we expand
+% \CS{pxpic@setcolor@a}/|b| twice (which will expand the \CS{csname}
+% contained in it) and then leave the opening bracket for \CS{unexpanded} in
+% the input stream. The code should be used inside a group so that all the
+% implicit definitions to \CS{relax} done by \CS{csname} are reverted.
+% \begin{macrocode}
+\newcommand\pxpic@setcolor@colorlist[2]
+ {%
+ \unexpanded\iffalse{\fi
+ \pxpic@ifbracket\pxpic@end#2.\pxpic@end[]\pxpic@end
+ {\expandafter\expandafter\expandafter\pxpic@openbrace\pxpic@setcolor@a}
+ {\expandafter\expandafter\expandafter\pxpic@openbrace\pxpic@setcolor@b}
+ {#1}{#2}%
+ }%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Messages}
+%
+% \begin{macro}[internal]
+% {
+% \pxpic@err@noval,\pxpic@err@unknown@px,\pxpic@err@unknown@mode,
+% \pxpic@err@unknown@colorlist,\pxpic@err@defined@colorlist
+% }
+% These are just some macros throwing errors, nothing special here.
+% \begin{macrocode}
+\newcommand\pxpic@err@noval[1]
+ {\PackageError{pxpic}{Missing colour definition for name `\detokenize{#1}'}{}}
+\newcommand\pxpic@err@unknown@px[1]
+ {\PackageError{pxpic}{Unknown pixel `\detokenize{#1}'. Skipping}{}}
+\newcommand\pxpic@err@unknown@mode[1]
+ {\PackageError{pxpic}{Unknown mode `#1'}{}}
+\newcommand\pxpic@err@unknown@colorlist[1]
+ {\PackageError{pxpic}{Unknown colour list `#1'}{}}
+\newcommand\pxpic@err@defined@colorlist[1]
+ {\PackageError{pxpic}{Colour list `#1' already defined}{}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\pxpic@experr}
+% This macro can be used to throw an error expandably. For this an undefined
+% control sequence \verb*|\pxpic Error:| is used. The group containing
+% \CS{expandafter} keeps the definition of \verb*|\pxpic Error:| local (it is
+% \CS{relax} after the \CS{csname}) so that it is undefined when it's used.
+% The \CS{@firstofone} is needed to get the readable output (now the undefined
+% macro and actual message are always the same argument).
+% \begin{macrocode}
+\def\pxpic@experr#1%
+ {%
+ \long\def\pxpic@experr##1%
+ {%
+ \expandafter\expandafter\expandafter
+ \pxpic@ifend
+ \@firstofone{#1##1}%
+ \pxpic@end
+ }%
+ }
+\begingroup\expandafter\endgroup
+\expandafter\pxpic@experr\csname pxpic Error:\endcsname
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\pxpic@experr@noval}
+% With the expandable error throwing mechanism out of the way, the following
+% is straight forward again.
+% \begin{macrocode}
+\newcommand\pxpic@experr@noval[1]
+ {\pxpic@experr{Missing colour definition for `#1'}}
+% \end{macrocode}
+% \end{macro}
+%
+%^^A=<<
+%
+% \gobbledocstriptag
+%</pkg>
+%
+% \end{implementation}^^A=<<
+%
+% \clearpage
+% \PrintIndex
+%
+\endinput
+%
+^^A vim: ft=tex fdm=marker fmr=>>=,=<<
diff --git a/Master/texmf-dist/source/latex/qrbill/qrbill.dtx b/Master/texmf-dist/source/latex/qrbill/qrbill.dtx
new file mode 100644
index 00000000000..09e705814da
--- /dev/null
+++ b/Master/texmf-dist/source/latex/qrbill/qrbill.dtx
@@ -0,0 +1,1196 @@
+% \iffalse meta-comment
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Copyright (C) 2020 by Marei Peischl (peiTeX) <marei@peitex.de>
+%
+% This work is a collaboration of
+% Marei Peischl (peiTeX) and Alex Antener (foobar LLC).
+%
+% 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
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is
+% Marei Peischl <qrbill@peitex.de>.
+%
+% This work consists of the files
+% qrbill.dtx and qrbill.ins, qrbill-vocab.csv
+% and the derived files
+% qrbill.sty, swiss.qrbill-cfg.tex, qrbill-letter-demo.tex,
+% qrbill-standalone-demo.tex .
+%
+% The development repository can be found at
+% https://github.com/peitex/qrbill
+% Please use the issue tracker for feedback!
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \fi
+% \iffalse
+%<*package>
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%</package>
+% \fi
+% \iffalse
+%<*driver>
+\ProvidesFile{qrbill.dtx}[2020/08/25 v1.02 \ create QR-bills based on the Swiss standard]
+\documentclass[english, parskip=half-]{scrartcl}
+\usepackage{iftex}
+\ifPDFTeX
+\usepackage[T1]{fontenc}
+\fi
+\usepackage{doc}
+\usepackage[cache, langlinenos]{minted}
+% Need to set the style here so that it is defined and brought in here.
+% If the style is set later, then docstrip interferes with any comments in
+% the style definition so that they appear as literal text in the document.
+
+\setminted{style=default, tabsize=4}
+\newminted{latex}{gobble=4,escapeinside=||}
+
+\newenvironment{doccode}{
+ \VerbatimEnvironment
+ \begin{VerbatimOut}[gobble=1, tabsize=4]{minted.doc.out}}
+ {\end{VerbatimOut}
+ \inputminted[autogobble, escapeinside=||,tabsize=4]{latex}{minted.doc.out}
+}
+
+\usepackage{babel}
+\usepackage[babel]{csquotes}
+
+\EnableCrossrefs
+\PageIndex
+\RecordChanges
+\newmintinline[code]{latex}{}
+
+\newcommand*\repl[1]{\meta{#1}}
+\newcommand*\opt[1]{\colorbox{black!20}{\meta{#1}}}
+\newcommand*\marg[1]{%
+ {\ttfamily\char`\{}\repl{#1}{\ttfamily\char`\}}}
+\newcommand*\oarg[1]{%
+ {\ttfamily[}\opt{#1}{\ttfamily]}
+}
+\newcommand*{\sarg}{\texttt{*}}
+
+\usepackage{xparse}
+
+\OnlyDescription
+\makeatletter
+
+\def\qrbill@optionNoDefault #1(#2) (#3){%
+ \vspace{0.1in}%
+ \leavevmode%
+ \marginpar{\raggedleft\small\ttfamily#1\ }%
+ \kern-\parindent\textsf{(#2)}\hfill#3\\}
+
+
+\def\qrbill@option #1 (#2) (#3){%
+ \qrbill@optionNoDefault#1(#2) ({(default: \texttt{#3})})%
+}
+
+\ExplSyntaxOn
+
+\newcommand*\qrbill@nextopt{}%
+\newenvironment{optionlist}%
+{%
+ \par\vspace{-.5\baselineskip}
+ \def\pipechar{|}%
+ \let\|\pipechar%
+ \RenewDocumentCommand{\item}{sr[]}{%
+ \qrbill@nextopt%
+ \renewcommand*\qrbill@nextopt{\par}%
+ \IfBooleanTF {##1}%
+ {\qrbill@optionNoDefault ##2}%
+ {\qrbill@option ##2}%
+}}
+{%
+ \par}
+\ExplSyntaxOff
+
+
+
+% Create a short verbatim pipe that handles quotation marks properly
+\begingroup
+\catcode`\|=\active
+\gdef\pipe@active@verbatim{%
+ \begingroup
+ \let\do\@makeother\dospecials
+ \catcode`\|=\active
+ \catcode`\`=\active
+ \catcode`\'=\active
+ \catcode`\<=\active
+ \catcode`\>=\active
+ \catcode`\-=\active
+ \catcode`\,=\active
+ \catcode`\ =\active
+ \pipe@active@verbatim@i}
+\gdef\pipe@active@verbatim@i#1|{%
+ \endgroup
+ \begingroup
+ \def\FV@SV@pipe@active@verbatim{%
+ \FV@Gobble
+ \expandafter\FV@ProcessLine\expandafter{#1}}%
+ \BUseVerbatim{pipe@active@verbatim}%
+ \endgroup}
+\AtBeginDocument{\let|\pipe@active@verbatim}
+\endgroup
+\makeatother
+
+\usepackage{array}
+\usepackage{booktabs}
+
+\usepackage{qrbill}
+
+\usepackage[hidelinks]{hyperref}
+
+\begin{document}
+\DocInput{qrbill.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \changes{v1.00}{2020/06/28}{First official version}
+%
+% \GetFileInfo{qrbill.dtx}
+%
+% \DoNotIndex{\newcommand,\newenvironment}
+% \title{qrbill v1.02}
+% \subtitle{\LaTeX-package to create QR-bills based on the Swiss payments standards}
+% \author{Marei Peischl \href{mailto:marei@peitex.de}{<marei@peitex.de>}}
+% \publishers{A collaborative project of pei\TeX{} and foobar LLC}
+% \date{\filedate}
+% \maketitle
+% \section{Introduction}
+% qrbill.sty, the \LaTeX-package, is the Free Software and Open Source answer to the launch of the swiss payments conversion, introduced mid 2020, replacing the former payment order slip by a restructured, QR enhanced slip. The published source code is based on the payment standard guidelines issued for Switzerland and intentionally has a modular structure to enable further development and adaptation for international use.
+%
+% By means of the \LaTeX{} framework, the qrbill can simply be integrated into existing accounting environments and automated billing systems.
+% \iffalse
+% \begin{macrocode}
+%<*qrbill.sty>
+% \end{macrocode}
+% \fi
+% \section{Example of use}
+% The easies way to use the qrbill package is to create a bill with the standalone documentclass:
+%
+% \begin{doccode}
+% \documentclass{standalone}
+% \usepackage[ngerman]{babel}
+%
+% \usepackage{xcolor}
+% \usepackage{qrbill}
+%
+% \begin{document}
+%
+% \QRbill[
+% creditor={foobar LLC\\
+% Postfach 404\\
+% 2342 Zurich\\
+% CH},
+% Account=CH1280808005649899718,
+% % insert additional data here
+% ]
+%
+% \end{document}
+% \end{doccode}
+%
+% \DescribeMacro{\QRbill}\oarg{Data Setup}
+% The macro \code{\QRbill} creates a box of 210\,mm${}\times{}$105\,mm size. It will include a qrbill as described in the design guide \cite{qrbill-design} and insert all available data.
+%
+% There is also an example in the appendix showing all data fields (see appendix \ref{standalone-complete} on page \pageref{standalone-complete}).
+%
+% The headings are provided in German, English, Italian and French and will be translated using the document's language setup. The terms have been taken from the official guidelines.
+%
+% \section{Technical Requirements}
+% qrbill has been built for \TeX Live 2020. Currently it is not possible to ensure it's functionality with older Releases of \TeX Distributions.
+%
+% The packages loaded by qrbill are:
+% \begin{itemize}
+% \item expl3
+% \item fontspec (except one is using a custom font setup)
+% \item graphicx
+% \item scrbase (which is part of the koma-script bundle)
+% \item qrcode
+% \item iftex
+% \item l3keys2e
+% \item numprint
+% \end{itemize}
+%
+% As a default font \enquote{Liberation Sans} will be used. This will be loaded using fontspec, which would require the use of Lua\LaTeX{} or Xe\LaTeX{} as a compiler. To have a workaround for this, see the \code{font} option on page \pageref{opt:font} for a custom font setup.
+%
+% \section{Package options}
+%
+% \begin{optionlist}
+%
+% \item[billinginfo (true/false) (true)]
+% Activate/deactivate the automatic fill of the BillingInformation. If this is set to \code{false} one still can add data to this field using the \code{BillingInformation} key, as Described in section \ref{sec:data-setup}.
+%
+% \item[creditorprefix\\debtorprefix (String) (CR-/UD-)]
+% For custom setups the predefined prefixes for the debtor and creditoraddress can be changes. The initial configuration is a requirement of the Swiss standards.
+%
+% \item[font (Frutiger/Arial/Helvetica/Liberation Sans/custom) (Liberation Sans)]
+% \label{opt:font}
+% The official guideline for the Swiss qrbill limits the choice of the font to the first four values of this option. The font selection and sizes currently hardcoded to fit to the size. Custom setups might be provided in the future.
+%
+% In case one wants to use a custom font, you can set the option \code{font=custom}. This will disable all font setup and not prevent the fontspec package from being loaded. You can redefine the macro \code{qrbillfont} to use any font available on your system, for example:
+% \begin{doccode}
+% \usepackage{fontspec}
+% % The Laconic font has to be installed
+% \renewcommand*{\qrbillfont}{\fontspec{Laconic}}
+% \end{doccode}
+%
+% \item[frame (true/false/top/bottom) (true)]
+% Switch to disable the frame around the created QRbill. The top/bottom options should be prefered when the bill is embedded into a document of a4 papersize.
+%
+% \changes{v1.02}{2020/08/25}{add ibanseparator option}
+% \item[ibanseparator (tokenlist) (\textbackslash,)]
+% Set the tokenlist to separate the account numbers. See option \code{sep-iban} for
+% further information.
+%
+% \item[icon (swiss-cross/filename) (<empty>)]
+% The swiss standard describes the placement of a swiss-cross icon in the center of the QRcode. This can be achieved using this option. The default is set empty, so no icon will be placed. If this option holds another string than \enquote{swiss-cross} it will be interpreted as filename and try to load a custom image.
+%
+% \item[iconwidth (length) (7mm)]
+% This option allows custom scaling for custom icons.
+
+% \item[qrscheme (Name of a custom QRbill scheme) (swiss)]
+% Loads the definitions for the QRcode and the BillingInformation. Currently only the
+% swiss qrbill scheme is available, but one can define own variants based on this file.
+% Users can copy the file swiss.qrbill-cfg.tex as an example.
+%
+% \changes{v1.02}{2020/08/25}{add referenceseparator option}
+% \item[referenceseparator (tokenlist) (\textbackslash,)]
+% Set the tokenlist to separate the reference codes. See option \code{sep-reference} for
+% further information.
+%
+% \changes{v1.02}{2020/08/25}{add sep-iban/sep-reference option}
+% \item[sep-iban\\sep-reference (integer) (0)]
+% Set the size of character groups to separate these. Positive values will be counted left to right. Negative ones the other way round.
+% The most variants of the Swiss QRbill use values of \code{sep-iban=4} and \code{sep-reference=-5} e.\,g.:
+%
+% \ExplSyntaxOn
+% \begingroup
+% \keys_set:nn {qrbill} {sep-iban=4,sep-reference=-5}
+% Iban:~\__qrbill_sep_tl:nn {iban} {CH1280808005649899718}\\
+% Reference:~\__qrbill_sep_tl:nn {reference} {000000000000000000000000152}
+% \endgroup
+% \ExplSyntaxOff
+%
+% \changes{v1.01}{2020/06/29}{Add separate option to modify the top rule of the QR bill}
+% \changes{v1.02}{2020/08/25}{Fix placement issue with separate option}
+% \item[separate (false/text/symbol) (text)]
+% Setup the separation rule between the document and the qrbill. If the value is text or symbol the Info \enquote{\qrbillseparatename} or the corresponding translation will be printed on top of the frame. This option will be ignored it the frame has no top rule.
+% \end{optionlist}
+%
+% \section{Data setup}
+% \label{sec:data-setup}
+% \DescribeMacro{\qrbillsetdata}
+% The data fields can be filled either using the optional argument of \code{\QRbill} or using the macro \code{\qrbillsetdata}. Section \ref{sec:data-complete} shows a list of all available fields and appendix \ref{standalone-complete} provides an example of use. For further information on the construction of the QRcode see the specification \cite{qrbill-spec}.
+%
+% To simplify the usage qrbill provides an interface to use the different types of address data and is able to create a \enquote{billing information} string as described in \cite{qrbill-spec} using the single data elements.
+%
+% \section{Setup for the preconfigured Swiss QR-bill}
+% \subsection{Preconfigured data}
+% The initial configuration which uses the Swiss standard already adds the following data:
+% \begin{doccode}
+% \SetupQrBill{
+% QRType=SPC,
+% Version=0210,
+% CodingType=1,
+% Trailer=EPD,
+% }
+% \end{doccode}
+% These fields are required to use these values for Version 2.1 of the QRbill standard. If any future changes on the standard would require changes, they can be overwritten or redefined by using a custom implementation file, similar to swiss.qrbill-cfg.tex.
+%
+% \changes{v1.02}{2020/08/25}{Note the version number inconsistency in the official guidelines}
+% Be aware that we use the versioncode \code{0210}, as this is the current, implemented standard from the official guidelines, which replaced version 2.0 in 09/2019.
+% As the mentioned example in v2.1 of the official guidelines use an outdated version code (e.g. \code{0200}), some banking apps may refuse the processing of the QR code. Hence, this is not a bug of the qrbill package, but of these apps.
+% Feel free to change the version back to \code{0200} to override and support the replaced standard.
+% The corresponding issue and discussion can be found at \url{https://github.com/peiTeX/qrbill/issues/3}.
+%
+% Additionally the Currency has been initialized to use \enquote{CHF}. This also can be overwritten. Currently the Swiss standards only allow the values \code{CHF} or \code{EUR}.
+% \subsection{Address data}
+% The Swiss payment standards for QR-bills require the following data for the address of creditor (Prefix \code{CR-}) and debtor (Prefix \code{UD-}):
+% \begin{center}
+% \begin{tabular}{@{}>{\ttfamily}l>{\centering}p{.25\linewidth}>{\centering\arraybackslash}p{.25\linewidth}@{}}
+% \toprule
+% AddressType&K&S\\\cmidrule(r){1-1}\cmidrule(l){2-3}
+% Name& \multicolumn{2}{c}{Name}\\\cmidrule(r){1-1}\cmidrule(l){2-3}
+% Address1&Street&Street with number\\\cmidrule(r){1-1}\cmidrule(l){2-3}
+% Address2&Number&Postal code with City\\\cmidrule(r){1-1}\cmidrule(l){2-3}
+% ZIP&Postal code& Enforced Empty\\\cmidrule(r){1-1}\cmidrule(l){2-3}
+% City& City& Enforced Empty\\\cmidrule(r){1-1}\cmidrule(l){2-3}
+% Country& \multicolumn{2}{c}{Country Code}\\\bottomrule
+% \end{tabular}
+% \end{center}
+% To set an address of type \enquote{K} one can use they option key \code{debtor} or \code{creditor}. Type \enquote{S} can be achieved using the starred variant (\code{debtor*}/\code{creditor*}).
+%
+% \begin{minipage}{.5\linewidth}
+% \begin{doccode}
+% creditor={Name\\
+% Street Nr.\\
+% PostalCode City\\
+% CountryCode},
+% \end{doccode}
+% \end{minipage}%
+% \begin{minipage}{.5\linewidth}
+% \begin{doccode}
+% creditor*={Name\\
+% Street\\
+% Nr.\\
+% PostalCode\\
+% City\\
+% CountryCode},
+% \end{doccode}
+% \end{minipage}
+%
+% \subsection{Billing information}
+% The billing information is a string which can consist of the following data elements:
+% \begin{tabular}{@{}>{\ttfamily}ll@{}}
+% invoicenum & invoice number\\
+% invoicedate & invoice data \\
+% customerref & customer reference \\
+% vat & VAT number\\
+% vatdate& VAT date\\
+% vatdetails& VAT percentage / details\\
+% importvat& import VAT\\
+% conditions& payment conditions\\
+% \end{tabular}
+% The data has to be in the required format. qrbill might add features to automatically validate this in the future.
+%
+% Beside setting the data fields all on their own, qrbill can also handle a complete billing information string. One could simply set it by
+%
+% \begin{doccode}
+% BillingInfo=//S1/10/10201409/11/190512/20/1400.000-53/30/106017086
+% /31/180508/32/7.7/40/2:10;0:30
+% \end{doccode}
+% \subsection{AV-Parameters}
+% The QRcode can use 2 AV Parameters. They have to carry the Prefix of \enquote{Name AV1:}/\enquote{Name AV2:}. This will be automatically added if the keys \code{AV1}/\code{AV2} are used instead of \code{AV1-Parameters}/\code{AV2-Parameters}.
+%
+% \subsection{Remaining data elements}
+% The remaining data elements should be set directly.
+% For restrictions on the content see the specification. Currently there is no validation taking place.
+% The remaining for the preconfigures Swiss standard are:
+% Account,
+% Amount,
+% ReferenceType,
+% Reference,
+% Message,
+%
+% \subsection{The Swiss cross icon}
+% \cite{qrbill-design} reguires a swiss cross of 7\,mm size to be placed in the center of the QRcode.
+% This package supports this by using the package option for the icon:
+% \begin{doccode}
+% \usepackage[icon=swiss-cross, …]{qrbill}
+% \end{doccode}
+% This setting is not activated by default.
+%
+%
+% \subsection{Overview over all data fields}
+% \label{sec:data-complete}
+% Data fields which are used in the QRcode:\par
+% \ExplSyntaxOn
+% \seq_use:Nn \g__qrbill_qrscheme_seq {\\}
+% \ExplSyntaxOff
+% \par\medskip
+% Data fields, which are custom created by the qrbill package to simplify the use:\par
+% creditor and creditor*\\
+% debtor and debtor*\\
+% AV1 and AV2
+% \par\medskip
+% Data fields to automatically create the BillingInfo string. The key in parentheses indicates the prefix to be used to construct the string.\par
+% \ExplSyntaxOn
+% \prop_map_inline:Nn \g__qrbill_billing_info_prop {#2~(#1)\\}
+% \ExplSyntaxOff
+% \iffalse
+% \section{Implementation}
+% \begin{macrocode}
+\RequirePackage{expl3}
+\ProvidesExplPackage{qrbill}{2020/08/25}{1.02}{
+ Template for QR-bills based on the Swiss Payment Standards
+}
+\RequirePackage{iftex}
+\RequirePackage{l3keys2e}
+
+\tl_new:N \g__qrbill_font_tl
+\bool_new:N \g__qrbill_top_frame_bool
+\bool_new:N \g__qrbill_bottom_frame_bool
+\bool_new:N \g__qrbill_left_frame_bool
+\bool_new:N \g__qrbill_right_frame_bool
+\bool_new:N \g__qrbill_separateinfo_bool
+
+\keys_define:nn {qrbill} {
+ font .choices:nn = {Frutiger, Arial, Helvetica, Liberation Sans} {
+ \bool_gset_true:N \g__qrbill_fontsetup_bool
+ \tl_gset_eq:NN \g__qrbill_font_tl \l_keys_choice_tl
+ },
+ font .initial:n = Liberation Sans,
+ font / custom .code:n = {\tl_gclear:N \g__qrbill_font_tl},
+ qrscheme .tl_gset:N = \g__qrbill_qrscheme_tl,
+ qrscheme .initial:n = swiss,
+ creditorprefix .tl_gset:N = \g__qrbill_creditorprefix_tl,
+ creditorprefix .initial:n = CR-,
+ debtorprefix .tl_gset:N = \g__qrbill_debtorprefix_tl,
+ debtorprefix .initial:n = UD-,
+ qrmode .choice:,
+ qrmode / package .code:n = \bool_gset_false:N \g__qrbill_luamode_bool,
+ qrmode / lua .code:n = \bool_gset_true:N \g__qrbill_luamode_bool,
+ qrmode .initial:n = package,
+ frame .choice:,
+ frame / false .code:n = {
+ \bool_gset_false:N \__g__qrbill_top_frame_bool
+ \bool_gset_false:N \g__qrbill_bottom_frame_bool
+ \bool_gset_false:N \g__qrbill_left_frame_bool
+ \bool_gset_false:N \g__qrbill_right_frame_bool
+ },
+ frame / true .code:n = {
+ \bool_gset_true:N \g__qrbill_top_frame_bool
+ \bool_gset_true:N \g__qrbill_bottom_frame_bool
+ \bool_gset_true:N \g__qrbill_left_frame_bool
+ \bool_gset_true:N \g__qrbill_right_frame_bool
+ },
+ frame / top .code:n = {
+ \bool_gset_true:N \g__qrbill_top_frame_bool
+ \bool_gset_false:N \g__qrbill_bottom_frame_bool
+ \bool_gset_false:N \g__qrbill_left_frame_bool
+ \bool_gset_false:N \g__qrbill_right_frame_bool
+ },
+ frame / bottom .code:n = {
+ \bool_gset_false:N \g__qrbill_top_frame_bool
+ \bool_gset_true:N \g__qrbill_bottom_frame_bool
+ \bool_gset_false:N \g__qrbill_left_frame_bool
+ \bool_gset_false:N \g__qrbill_right_frame_bool
+ },
+ frame .initial:n = true,
+ billinginfo .bool_gset:N = \g__grbill_billinginfo_auto_bool,
+ billinginfo .default:n = true,
+ billinginfo .initial:n = true,
+ icon .choice:,
+ icon / swiss-cross .meta:n = {icon=qrbill_swiss-cross.pdf},
+ icon / unknown .code:n = \tl_gset:Nn \g_qrbill_icon_tl {#1},
+ icon .initial:n =,
+ iconwidth .dim_gset:N = \g_qrbill_iconwidth_dim,
+ iconwidth .initial:n = 7mm,
+ separate .choice:,
+ separate / symbol .code:n = {
+ \bool_gset_true:N \g__qrbill_separateinfo_bool
+ \RequirePackage{marvosym}
+ \cs_set:Nn \qrbill_print_separate_info: {
+ \par\leaders\vbox_to_ht:nn {1sp} {
+ \smash{
+ \hbox_to_wd:nn {\c_qrbill_width_dim }{
+ \leaders\hbox{\rule{1mm}{\g__qrbill_rule_dim}\hspace{1mm}}\hskip 0pt\@plus1 fill\relax
+ \llap{\raisebox{-.5\height}{\LeftScissors}}
+ \leaders\hbox{\rule{1mm}{\g__qrbill_rule_dim}\hspace{1mm}}\hskip 0pt\@plus4 fill\relax
+ }
+ }
+ }
+ \vskip 1sp
+ \vskip -1sp
+ }
+ },
+ separate / text .code:n = {
+ \bool_gset_true:N \g__qrbill_separateinfo_bool
+ \cs_set:Nn \qrbill_print_separate_info: {
+ \centerline{\raisebox{\dimexpr\depth+.3ex\relax}[0pt][0pt]{\footnotesize\qrbillseparatename}}
+ \par\nointerlineskip
+ \rule{\c_qrbill_width_dim}{\g__qrbill_rule_dim}
+ }
+ }
+ ,
+ separate / false .code:n = {\bool_gset_false:N \g__qrbill_separateinfo_bool},
+ separate .initial:n = text,
+ sep-iban .int_gset:N = \g__qrbill_ibansep_int,
+ sep-iban .initial:n = 0,
+ ibanseperator .tl_gset:N = \g__qrbill_ibansep_tl,
+ ibanseperator .initial:n = {\,},
+ sep-reference .int_gset:N = \g__qrbill_referencesep_int,
+ sep-reference .initial:n = 0,
+ referenceseperator .tl_gset:N = \g__qrbill_referencesep_tl,
+ referenceseperator .initial:n = {\,}
+}
+
+\ProcessKeysOptions{qrbill}
+
+\newcommand*{\qrbillsetup}[1]{\keys_set:nn {qrbill}{#1}}
+\newcommand*{\qrbillsetdata}[1]{\keys_set:nn {qrbill/data}{#1}}
+
+\tl_if_empty:NTF \g__qrbill_font_tl {
+ \def\qrbillfont{\normalfont}
+}{
+ \RequirePackage{fontspec}
+ \newfontfamily{\qrbillfont}{\g__qrbill_font_tl}
+}
+
+\dim_new:N \g_qrbill_QRcode_dim
+\dim_gset:Nn \g_qrbill_QRcode_dim {46mm}
+\bool_if:NF \g__qrbill_luamode_bool {
+ \usepackage{qrcode}
+ \cs_new:Nn \qrbill_parse_QRcode:n {
+ \raisebox{\depth}{\qrcode[height= \g_qrbill_QRcode_dim]{#1}}
+ }
+ \cs_generate_variant:Nn \qrbill_parse_QRcode:n {V}
+}
+
+\RequirePackage{scrbase}
+\RequirePackage{graphicx}
+\RequirePackage{numprint}
+\npthousandsep{\,}
+\npdecimalsign{.}
+
+\dim_new:N \g__qrbill_rule_dim
+\dim_gset:Nn \g__qrbill_rule_dim {.5pt}
+\dim_const:Nn \c_qrbill_sep_dim {5mm}
+\dim_const:Nn \c_qrbill_width_dim {210mm}
+\dim_const:Nn \c_qrbill_height_dim {105mm}
+
+\cs_new:Nn \qrbill_title_font: {\fontsize{11bp}{11bp}\selectfont\bfseries}
+
+\cs_new:Nn \qrbill_headingR_font: {\fontsize{6bp}{9bp}\selectfont\bfseries}
+\cs_new:Nn \qrbill_valueR_font: {\fontsize{8bp}{9bp}\selectfont}
+\cs_new:Nn \qrbill_amountR_font: {\fontsize{8bp}{11bp}\selectfont}
+\cs_new:Nn \qrbill_acceptance_font: {\fontsize{6bp}{8bp}\selectfont\bfseries}
+
+\cs_new:Nn \qrbill_headingP_font: {\fontsize{8bp}{11bp}\selectfont\bfseries}
+\cs_new:Nn \qrbill_valueP_font: {\fontsize{10bp}{11bp}\selectfont}
+\cs_new:Nn \qrbill_amountP_font: {\fontsize{10bp}{13bp}\selectfont}
+
+\cs_new:Nn \qrbill_infoheading_font: {\fontsize{7bp}{8bp}\selectfont\bfseries}
+\cs_new:Nn \qrbill_info_font: {\fontsize{7bp}{8bp}\selectfont}
+
+\dim_new:N \g_qrbill_placeholder_rule_dim
+\dim_gset:Nn \g_qrbill_placeholder_rule_dim {.75pt}
+\dim_new:N \g_qrbill_placeholder_corner_dim
+\dim_gset:Nn \g_qrbill_placeholder_corner_dim {3mm}
+\cs_new:Nn \__qrbill_placeholder_hmark: {
+ \rule{\g_qrbill_placeholder_corner_dim}{\g_qrbill_placeholder_rule_dim}
+}
+\cs_new:Nn \__qrbill_placeholder_vmark: {
+ \rule{\g_qrbill_placeholder_rule_dim}{\g_qrbill_placeholder_corner_dim}
+}
+
+
+\cs_new:Nn \__qrbill_placeholder:nn {
+ \vbox_to_ht:nn {#2} {
+ \hbox_to_wd:nn {#1} {\__qrbill_placeholder_hmark: \hfill \__qrbill_placeholder_hmark:}
+ \nointerlineskip
+ \hbox_to_wd:nn {#1} {\__qrbill_placeholder_vmark: \hfill \__qrbill_placeholder_vmark:}
+ \vfill
+ \hbox_to_wd:nn {#1} {\__qrbill_placeholder_vmark: \hfill \__qrbill_placeholder_vmark:}
+ \nointerlineskip
+ \hbox_to_wd:nn {#1} {\__qrbill_placeholder_hmark: \hfill \__qrbill_placeholder_hmark:}
+ }
+}
+
+\cs_new:Nn \qrbill_bill_create: {
+ \begingroup
+ \qrbill_parse_BillingInfo:
+ \qrbillfont
+ \setlength{\parindent}{\z@}
+ \parbox{\c_qrbill_width_dim }{
+ \vbox to \c_qrbill_height_dim {
+ \bool_if:NTF \g__qrbill_top_frame_bool
+ {
+ \bool_if:NTF \g__qrbill_separateinfo_bool
+ {\qrbill_print_separate_info:}
+ {\rule{\c_qrbill_width_dim}{\g__qrbill_rule_dim}}
+ }
+ {\rule{\c_zero_dim}{\g__qrbill_rule_dim}}
+ \par\nointerlineskip
+ \skip_vertical:n {\c_qrbill_sep_dim-\g__qrbill_rule_dim}
+ \skip_horizontal:n {\c_qrbill_sep_dim-\g__qrbill_rule_dim}
+ \begin{minipage}[c][95mm][t]{52mm}
+ \vbox_to_ht:nn {7mm} {\qrbill_title_font:\qrbillreceiptname}
+ \par\nointerlineskip
+ \vbox_to_ht:nn {56mm}{
+ {\qrbill_headingR_font:\qrbillaccountname\par}
+ {
+ \qrbill_valueR_font:
+ \__qrbill_sep_tl:nV {iban} \l_qrbill_data_Account_tl\par
+ \qrbill_insert_address:N \g__qrbill_creditorprefix_tl
+ \par\vskip\baselineskip
+ }
+ \tl_if_empty:NF \l_qrbill_data_Reference_tl {
+ {\qrbill_headingR_font:\qrbillreferencename\par}
+ {
+ \qrbill_valueR_font:
+ \__qrbill_sep_tl:nV {reference} \l_qrbill_data_Reference_tl
+ \par\vskip\baselineskip
+ }
+ }
+ \tl_if_empty:cTF {l_qrbill_data_\g__qrbill_debtorprefix_tl Name_tl}
+ {
+ {\qrbill_headingR_font:\qrbilldebtoraddrname\par}
+ \__qrbill_placeholder:nn {52mm} {20mm}
+ }{
+ {\qrbill_headingR_font:\qrbilldebtorname\par}
+ {
+ \qrbill_valueR_font:
+ \qrbill_insert_address:N \g__qrbill_debtorprefix_tl
+ \par
+ }
+ }
+ }
+ \par\nointerlineskip
+ \vbox_to_ht:nn {14mm}{
+ \qrbill_headingR_font:
+ \begin{tabular}[t]{@{}ll@{}}
+ \qrbillcurrencyname&\qrbill_headingR_font:\qrbillamountname\\
+ \qrbill_amountR_font:\l_qrbill_data_Currency_tl
+ &\qrbill_amountR_font:
+ \tl_if_empty:NF \l_qrbill_data_Amount_tl
+ {\numprint{\l_qrbill_data_Amount_tl}}
+ \end{tabular}
+ \tl_if_empty:NTF \l_qrbill_data_Amount_tl {
+ \hfill
+ \raisebox{\dimexpr-\height+\ht\strutbox}[\z@]{\llap{
+ \__qrbill_placeholder:nn {30mm} {10mm}
+ }}
+ }
+ \vfill
+ }
+ \par\nointerlineskip
+ \vbox_to_ht:nn {18mm} {
+ \makebox[\linewidth][r]{\qrbill_headingR_font:\qrbillacceptantname}\par
+ }
+ \end{minipage}%
+ \skip_horizontal:n {2\c_qrbill_sep_dim}
+ \begin{minipage}[c][95mm][t]{138mm}
+ \begin{minipage}[c][85mm][t]{51mm}
+ \parbox[t][7mm][t]{\linewidth}{\qrbill_title_font:\qrbillpaymentpartname}
+ \par\nointerlineskip
+ \skip_vertical:n {\c_qrbill_sep_dim}
+ \qrcode_setup_QRcode:
+ \leavevmode\qrbill_parse_QRcode:V \l_qrbill_data_str
+ \tl_if_empty:NF \g_qrbill_icon_tl {
+ \llap{\hbox_to_wd:nn {\g_qrbill_QRcode_dim} {
+ \hfill
+ \raisebox{\dimexpr-.5\height+.5\g_qrbill_QRcode_dim}[0pt][0pt]{
+ \includegraphics[width=\g_qrbill_iconwidth_dim]{\g_qrbill_icon_tl}
+ }
+ \hfill
+ }}
+ }
+ \skip_vertical:n {\c_qrbill_sep_dim}
+ \vbox_to_ht:nn {22mm}{
+ \begin{tabular}[b]{@{}ll@{}}
+ \qrbill_headingP_font:\qrbillcurrencyname&\qrbill_headingP_font:
+ \qrbillamountname\\
+ \qrbill_amountP_font:\tl_use:c {l_qrbill_data_Currency_tl}&
+ \tl_if_empty:NF \l_qrbill_data_Amount_tl {
+ \qrbill_amountP_font:\numprint{\l_qrbill_data_Amount_tl}
+ }
+ \end{tabular}
+ \tl_if_empty:NTF \l_qrbill_data_Amount_tl {
+ \hfill
+ \raisebox{\dimexpr-\height+\ht\strutbox}[\z@]{
+ \llap{\__qrbill_placeholder:nn {40mm} {15mm}
+ }}
+ }
+ }
+ \end{minipage}
+ \begin{minipage}[c][85mm][t]{87mm}
+ \par\nointerlineskip
+ {\qrbill_headingP_font:\qrbillaccountname\par}
+ {
+ \qrbill_valueP_font:
+ \__qrbill_sep_tl:nV {iban} \l_qrbill_data_Account_tl \par
+ \qrbill_insert_address:N \g__qrbill_creditorprefix_tl
+ \par\vskip\baselineskip
+ }
+ \tl_if_empty:NF \l_qrbill_data_Reference_tl {
+ {\qrbill_headingP_font:\qrbillreferencename\par}
+ {\qrbill_valueP_font:
+ \__qrbill_sep_tl:nV {reference} \l_qrbill_data_Reference_tl
+ \par\vskip\baselineskip}
+ }
+ \exp_args:Nf \tl_if_empty:nF {
+ \l_qrbill_data_BillingInfo_tl
+ \l_qrbill_data_Message_tl
+ }{
+ {\qrbill_headingP_font:\qrbilladdinfoname\par}
+ {
+ \qrbill_valueP_font:
+ \l_qrbill_data_Message_tl\par
+ \tl_replace_all:Nnn \l_qrbill_data_BillingInfo_tl {/} {\discretionary{}{}{}/}
+ \l_qrbill_data_BillingInfo_tl
+ \par\vskip\baselineskip
+ }
+ }
+ \tl_if_empty:cTF {l_qrbill_data_\g__qrbill_debtorprefix_tl Name_tl} {
+ {\qrbill_headingP_font:\qrbilldebtoraddrname\par}
+ \__qrbill_placeholder:nn {65mm} {25mm}
+ }{
+ {\qrbill_headingP_font:\qrbilldebtorname\par}
+ {
+ \qrbill_valueP_font:
+ \qrbill_insert_address:N \g__qrbill_debtorprefix_tl
+ \par
+ }
+ }
+ \end{minipage}\par\nointerlineskip
+ \begin{minipage}[b][10mm][t]{\linewidth}
+ \strut
+ \qrbill_insert_AV_parameters:NNn
+ \qrbill_infoheading_font:
+ \qrbill_info_font:
+ {AV1,AV2}
+ \end{minipage}
+ \end{minipage}
+ \par\nointerlineskip\skip_vertical:n {\c_qrbill_sep_dim}
+ \smash{
+ \bool_if:NT \g__qrbill_bottom_frame_bool
+ {\rlap{\rule{\c_qrbill_width_dim}{\g__qrbill_rule_dim}}}
+ \bool_if:NTF \g__qrbill_left_frame_bool
+ {\rule{\g__qrbill_rule_dim}{\c_qrbill_height_dim}}
+ {\rule{\g__qrbill_rule_dim}{\c_zero_dim}}
+ \hspace{\dimexpr62mm-1.5\g__qrbill_rule_dim}
+ \rule{\g__qrbill_rule_dim}{\c_qrbill_height_dim}
+ \hspace{\dimexpr148mm-1.5\g__qrbill_rule_dim}
+ \bool_if:NTF \g__qrbill_right_frame_bool
+ {\rule{\g__qrbill_rule_dim}{\c_qrbill_height_dim}}
+ {\rule{\g__qrbill_rule_dim}{\c_zero_dim}}
+ }
+ }
+ }
+ \endgroup
+}
+
+\newcommand{\QRbill}[1][]{
+ \begingroup
+ \tl_if_empty:nF {#1} {\keys_set:nn {qrbill/data} {#1}}
+ \qrbill_bill_create:
+ \endgroup
+}
+
+\ior_new:N \qrbill_ior
+\clist_new:N \l_qrbill_tmpa_clist
+\ior_open:Nn \qrbill_ior {qrbill-vocab.csv}
+
+\ior_get:NN \qrbill_ior \l_tmpa_tl
+\clist_set:Nx \l_qrbill_tmpa_clist {\l_tmpa_tl}
+\int_set:Nn \l_tmpa_int {\clist_count:N \l_qrbill_tmpa_clist}
+
+\ior_str_map_inline:Nn \qrbill_ior {
+ \int_step_inline:nnn {2} {\l_tmpa_int } {
+ \exp_args:Nnx \use:n {\exp_args:NNx \exp_args:Nnc \defcaptionname
+ {\clist_item:Nn \l_qrbill_tmpa_clist {##1}}
+ {qrbill\clist_item:nn {#1} {1}name}}
+ {\clist_item:nn {#1} {##1}}
+ }
+}
+
+\ior_close:N \qrbill_ior
+
+\seq_new:N \l_qrbill_tmp_seq
+
+\cs_new:Nn \qrbill_set_address_combined:nn {
+ \seq_set_split:Nnn \l_qrbill_tmp_seq {\\} {#2}
+ \exp_args:Nnx \keys_set:nn {qrbill/data} {
+ #1AddressType=K,
+ #1Name=\seq_item:Nn \l_qrbill_tmp_seq {1},
+ #1Address1=\seq_item:Nn \l_qrbill_tmp_seq {2},
+ #1Address2=\seq_item:Nn \l_qrbill_tmp_seq {3},
+ #1PostalCode=,
+ #1City=,
+ #1Country=\seq_item:Nn \l_qrbill_tmp_seq {4},
+ }
+}
+
+\cs_new:Nn \qrbill_set_address_structured:nn {
+ \seq_set_split:Nnn \l_qrbill_tmp_seq {\\} {#2}
+ \exp_args:Nnx \keys_set:nn {qrbill/data} {
+ #1AddressType=S,
+ #1Name=\seq_item:Nn \l_qrbill_tmp_seq {1},
+ #1Address1=\seq_item:Nn \l_qrbill_tmp_seq {2},
+ #1Address2=\seq_item:Nn \l_qrbill_tmp_seq {3},
+ #1PostalCode=\seq_item:Nn \l_qrbill_tmp_seq {4},
+ #1City=\seq_item:Nn \l_qrbill_tmp_seq {5},
+ #1Country=\seq_item:Nn \l_qrbill_tmp_seq {6},
+ }
+}
+
+\cs_new:Nn \qrbill_insert_address:N {
+ \tl_use:c {l_qrbill_data_#1Name_tl}\ifhmode\\\fi
+ \str_case_e:nnF {\use:c {l_qrbill_data_#1AddressType_tl}}
+ {
+ {K} {
+ \tl_use:c {l_qrbill_data_#1Address1_tl}
+ \tl_if_empty:cF {l_qrbill_data_#1Address2_tl} {
+ \ifhmode\\\fi
+ \tl_if_empty:cF {l_qrbill_data_#1Country_tl}
+ {\tl_use:c {l_qrbill_data_#1Country_tl}-}
+ \tl_use:c {l_qrbill_data_#1Address2_tl}
+ }
+ }
+ }{
+ \tl_use:c {l_qrbill_data_#1Address1_tl}~
+ \tl_use:c {l_qrbill_data_#1Address2_tl}
+ \tl_if_empty:cF {l_qrbill_data_#1City_tl} {
+ \ifhmode\\\fi
+ \tl_if_empty:cF {l_qrbill_data_#1Country_tl}
+ {\tl_use:c {l_qrbill_data_#1Country_tl}-}
+ \tl_use:c {l_qrbill_data_#1PostalCode_tl}~
+ \tl_use:c {l_qrbill_data_#1City_tl}
+ }
+ }
+}
+
+\cs_new:Nn \__qrbill_sep_tl:nn {
+ \int_compare:nTF {\int_use:c {g__qrbill_#1sep_int} = 0} {
+ #2
+ }{
+ \str_set:Nn \l_tmpa_str {#2}
+ \int_compare:nT {\int_use:c {g__qrbill_#1sep_int} < 0} {
+ \tl_reverse:N \l_tmpa_str
+ }
+ \int_set:Nn \l_tmpb_int {\int_abs:n {\int_use:c {g__qrbill_#1sep_int}}}
+ \int_set:Nn \l_tmpa_int {1}
+ \tl_clear:N \l_tmpa_tl
+ \int_while_do:nn {\l_tmpa_int < \str_count:N \l_tmpa_str} {
+ \tl_put_right:Nx \l_tmpa_tl {
+ \str_range:Nnn \l_tmpa_str {\l_tmpa_int} {\l_tmpa_int + \l_tmpb_int-1}
+ }
+ \int_add:Nn \l_tmpa_int {\l_tmpb_int}
+ \tl_put_right:Nn \l_tmpa_tl {{\tl_use:c {g__qrbill_#1sep_tl}}}
+ }
+ \tl_put_right:Nx \l_tmpa_tl {
+ \str_range:Nnn \l_tmpa_str {\l_tmpa_int} {\str_count:N \l_tmpa_str}
+ }
+ \int_compare:nT {\int_use:c {g__qrbill_#1sep_int} < 0} {
+ \tl_reverse:N \l_tmpa_tl
+ }
+ \l_tmpa_tl
+ }
+}
+\cs_generate_variant:Nn \__qrbill_sep_tl:nn {nV}
+
+\newcommand*{\insertdebtor}{\null\qrbill_insert_address:N \g__qrbill_debtorprefix_tl}
+\newcommand*{\insertcreditor}{\null\qrbill_insert_address:N \g__qrbill_creditorprefix_tl}
+\newcommand*{\insertcurrency}{\l_qrbill_data_Currency_tl}
+
+\keys_define:nn {qrbill/data} {
+ creditor .code:n = \qrbill_set_address_combined:nn {\g__qrbill_creditorprefix_tl}{#1},
+ creditor* .code:n = \qrbill_set_address_structured:nn {\g__qrbill_creditorprefix_tl} {#1},
+ debtor .code:n = \qrbill_set_address_combined:nn {\g__qrbill_debtorprefix_tl}{#1},
+ debtor* .code:n = \qrbill_set_address_structured:nn {\g__qrbill_debtorprefix_tl} {#1},
+ account .tl_set:N = \l_qrbill_iban_tl,
+}
+
+\clist_map_inline:nn {AV1, AV2} {
+ \keys_define:nn {qrbill/data} {
+ #1 .code:n = {
+ \tl_if_empty:nF {##1}{
+ \keys_set:nx {qrbill/data} {
+ #1-Parameters={\qrbill_av_prefix:n {#1}##1}
+ }
+ }
+ \tl_set:cn {l_qrbill_#1_tl} {##1}
+ },
+ #1 .initial:n =,
+ }
+}
+
+\newcommand*{\SetupQrBill}[1]{
+ \keys_set:nn {qrbill/data} {#1}
+}
+
+\str_new:N \l_qrbill_data_str
+\cs_new:Nn \qrcode_setup_QRcode: {
+ \str_clear:N \l_qrbill_data_str
+ \bool_set_false:N \l_tmpa_bool
+ \seq_map_inline:Nn \g__qrbill_qrscheme_seq {
+ \bool_if:NTF \l_tmpa_bool
+ {\str_put_right:Nn\l_qrbill_data_str {^^J}}
+ {\bool_set_true:N \l_tmpa_bool}
+ \exp_args:NNv \str_put_right:Nn \l_qrbill_data_str {l_qrbill_data_##1_tl}
+ }
+ %necessary to preserve spaces!
+ \str_replace_all:Nnn \l_qrbill_data_str {~ } {\ }
+ \tl_set_rescan:Nno \l_qrbill_data_str {\ExplSyntaxOff} {\l_qrbill_data_str}
+}
+
+\seq_new:N \g__qrbill_qrscheme_seq
+\newcommand*\SetQrScheme[1]{
+ \seq_gset_from_clist:Nn \g__qrbill_qrscheme_seq {#1}
+ \seq_map_inline:Nn \g__qrbill_qrscheme_seq {
+ \keys_define:nn {qrbill/data} {
+ ##1 .tl_set:c = l_qrbill_data_##1_tl,
+ ##1 .initial:n =,
+ }
+ }
+}
+
+
+
+\prop_new:N \g__qrbill_billing_info_prop
+\seq_new:N \g__qrbill_billing_info_seq
+\newcommand*{\SetBillingInfoScheme}[1]{
+ \prop_gset_from_keyval:Nn \g__qrbill_billing_info_prop {#1}
+ \seq_gclear:N \g__qrbill_billing_info_seq
+ \prop_map_inline:Nn \g__qrbill_billing_info_prop {
+ \exp_args:Nx \clist_if_in:nnF {\tl_to_str:n {prefix , postfix}} {##1} {
+ \seq_push:Nn \g__qrbill_billing_info_seq {##1}
+ }
+ \keys_define:nn {qrbill/data} {
+ ##2 .tl_set:c = l_qrbill_##2_tl,
+ ##2 .initial:n =,
+ }
+ }
+ \seq_sort:Nn \g__qrbill_billing_info_seq {
+ \int_compare:nNnTF { ##1 } > { ##2 }
+ { \sort_return_swapped: }
+ { \sort_return_same: }
+ }
+}
+
+\tl_new:N \l_qrbill_data_BillingInfo_tl
+
+\cs_new:Nn \qrbill_parse_BillingInfo: {
+ \bool_if:NT \g__grbill_billinginfo_auto_bool {
+ \str_put_right:Nx \l_qrbill_data_BillingInfo_tl {
+ \prop_item:Nn \g__qrbill_billing_info_prop {prefix}
+ }
+ \seq_map_inline:Nn \g__qrbill_billing_info_seq {
+ \prop_get:NnN \g__qrbill_billing_info_prop {##1} \l_tmpa_tl
+ \tl_if_empty:cF {l_qrbill_\l_tmpa_tl _tl} {
+ \str_put_right:Nx \l_qrbill_data_BillingInfo_tl {
+ /##1/\tl_use:c {l_qrbill_\l_tmpa_tl _tl}
+ }
+ }
+ }
+ }
+}
+
+\cs_new:Nn \qrbill_insert_AV_parameters:NNn {
+ \clist_map_inline:nn {#3} {
+ \tl_if_empty:cF {l_qrbill_##1_tl}
+ {{#1\qrbill_av_prefix:n {##1}}{#2 \tl_use:c {l_qrbill_##1_tl}}}
+ }
+}
+
+\cs_new:Nn \qrbill_av_prefix:n {Name~#1:~}
+
+\input{\g__qrbill_qrscheme_tl.qrbill-cfg}
+
+% \end{macrocode}
+% \begin{macrocode}
+%</qrbill.sty>
+% \section{The file swiss.qrbill-cfg.tex as a custom qrbill scheme}
+%<*swiss.qrbill-cfg.tex>
+% \end{macrocode}
+% \fi
+% \begin{macrocode}
+\qrbillsetup{
+ creditorprefix =CR-,
+ debtorprefix =UD-,
+}
+
+\SetQrScheme{
+ QRType,
+ Version,
+ CodingType,
+ Account,
+ CR-AddressType,
+ CR-Name,
+ CR-Address1,
+ CR-Address2,
+ CR-PostalCode,
+ CR-City,
+ CR-Country,
+ UCR-AddressType,
+ UCR-Name,
+ UCR-Address1,
+ UCR-Address2,
+ UCR-ZIP,
+ UCR-City,
+ UCR-Country,
+ Amount,
+ Currency,
+ UD-AddressType,
+ UD-Name,
+ UD-Address1,
+ UD-Address2,
+ UD-PostalCode,
+ UD-City,
+ UD-Country,
+ ReferenceType,
+ Reference,
+ Message,
+ Trailer,
+ BillingInfo,
+ AV1-Parameters,
+ AV2-Parameters
+}
+
+\SetBillingInfoScheme{
+ prefix=//S1,
+ 10=invoicenum,
+ 11=invoicedate,
+ 20=customerref,
+ 30=vat,
+ 31=vatdate,
+ 32=vatdetails,
+ 33=importvat,
+ 40=conditions
+}
+
+\SetupQrBill{
+ QRType=SPC,
+ Version=0210,
+ CodingType=1,
+ Trailer=EPD,
+ Currency=CHF,
+ ReferenceType=NON,
+}
+% \end{macrocode}
+% \iffalse
+% \begin{macrocode}
+%</swiss.qrbill-cfg.tex>
+% \end{macrocode}
+% \fi
+%
+% \PrintChanges
+% \begin{thebibliography}{99}
+% \bibitem{qrbill-spec} Swiss Implementation Guidelines QR-bill: Technical and professional specifications of the payment part with Swiss QR Code and of the receipt. Version 2.1, with effect from 30 September 2019. \url{https://www.paymentstandards.ch/dam/downloads/ig-qr-bill-en.pdf}
+% \bibitem{qrbill-design} Style Guide QR-billStyle Guide QR-bill: The right layout pays off. Layout rules and recommendations for the payment part with Swiss QR Code and for the receipt. \url{https://www.paymentstandards.ch/dam/downloads/style-guide-en.pdf}
+% \end{thebibliography}
+% \appendix
+% \section{Example of standalone qrbill}
+% \label{standalone-complete}
+% \iffalse
+% \begin{macrocode}
+%<*qrbill-standalone-demo.tex>
+% \end{macrocode}
+% \fi
+% \begin{macrocode}
+% !TeX program=lualatex
+\documentclass{standalone}
+\usepackage[nswissgerman]{babel}
+
+\RequirePackage{xcolor}
+\usepackage[icon=swiss-cross,separate=false]{qrbill}
+
+\begin{document}
+
+\QRbill[
+ creditor*={foobar LLC\\
+ Postfach\\
+ 404\\
+ 2342\\
+ Zurich\\
+ CH},
+ Account=CH1280808005649899718,
+ vat=123123123,% VAT number with stripped CH and periods
+ debtor*={peiTeX\\
+ TeXnikerweg\\
+ 78\\
+ 23420\\
+ Hamburg\\
+ DE},
+ Amount=1337.42,
+ Message=Bestellung vom 27.06.2020,
+ invoicenum=100-4242,
+ invoicedate=200701,%yymmdd
+ vatdetails=0,% 0% VAT
+ vatdate=200701,%yymmdd
+ AV1=LX;F00BAR;2342,
+]
+
+\end{document}
+% \end{macrocode}
+% \iffalse
+% \begin{macrocode}
+%</qrbill-standalone-demo.tex>
+%<*qrbill-letter-demo.tex>
+% \end{macrocode}
+% \fi
+% \section{qrbill scrletter example}
+% \begin{macrocode}
+% !TeX Program=lualatex
+\documentclass[foldmarks=b]{scrletter}
+\usepackage[frame=top]{qrbill}
+
+% Setup layer
+\DeclareNewLayer[
+ align=bl,
+ voffset=\paperheight,
+ hoffset=0pt,
+ contents={\QRbill},
+ width=\paperwidth,
+ height=105mm,
+ ]{qrbill}
+
+
+
+\begin{document}
+
+\qrbillsetdata{
+ creditor*={foobar LLC\\
+ Postfach\\
+ 404\\
+ 2342\\
+ Zurich\\
+ CH},
+ Account=CH1280808005649899718,
+ vat=123123123,% VAT number with stripped CH and periods
+ debtor*={peiTeX\\
+ TeXnikerweg\\
+ 78\\
+ 23420\\
+ Hamburg\\
+ DE},
+ Amount=1337.42,
+ Message=Bestellung vom 27.06.2020,
+ invoicenum=100-4242,
+ invoicedate=200701,%yymmdd
+ vatdetails=0,% 0% VAT
+ vatdate=200701,%yymmdd
+ AV1=LX;F00BAR;2342,
+}
+
+\setkomavar{fromaddress}{\insertcreditor}
+
+\begin{letter}{\insertdebtor}
+
+\opening{opening}
+
+Text
+
+\closing{closing}
+
+% Add qbill on last page
+% For more details
+\AddLayersToPageStyle{@everystyle@}{qrbill}
+
+\end{letter}
+\end{document}
+% \end{macrocode}
+%
+% \iffalse
+% \begin{macrocode}
+%</qrbill-letter-demo.tex>
+% \end{macrocode}
+% \fi
+%\Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/qrbill/qrbill.ins b/Master/texmf-dist/source/latex/qrbill/qrbill.ins
new file mode 100644
index 00000000000..5af7e8fb785
--- /dev/null
+++ b/Master/texmf-dist/source/latex/qrbill/qrbill.ins
@@ -0,0 +1,57 @@
+\input l3docstrip
+
+\def\filedate{2020/08/25}
+\def\fileversion{1.02}
+
+\preamble
+
+Copyright (C) 2020 by Marei Peischl (peiTeX) <marei@peitex.de>
+
+This work is a collaboration of
+ Marei Peischl (peiTeX) and Alex Antener (foobar LLC).
+
+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
+ http://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
+ Marei Peischl <qrbill@peitex.de>.
+
+This work consists of the files
+qrbill.dtx and qrbill.ins, qrbill-vocab.csv
+and the derived files
+qrbill.sty, swiss.qrbill-cfg.tex, qrbill-letter-demo.tex,
+ qrbill-standalone-demo.tex .
+
+The development repository can be found at
+https://github.com/peitex/qrbill
+Please use the issue tracker for feedback!
+
+\endpreamble
+
+\askforoverwritefalse
+
+\usedir{tex/latex/qrbill}
+
+\generate{
+ \file{qrbill.sty}{
+ \from{qrbill.dtx}{qrbill.sty,package}
+ }
+ \file{swiss.qrbill-cfg.tex}{
+ \from{qrbill.dtx}{swiss.qrbill-cfg.tex}
+ }
+ \file{qrbill-letter-demo.tex}{
+ \from{qrbill.dtx}{qrbill-letter-demo.tex}
+ }
+ \file{qrbill-standalone-demo.tex}{
+ \from{qrbill.dtx}{qrbill-standalone-demo.tex}
+ }
+}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/quotchap/quotchap.dtx b/Master/texmf-dist/source/latex/quotchap/quotchap.dtx
index 38cb2017dd4..8d67915fe01 100644
--- a/Master/texmf-dist/source/latex/quotchap/quotchap.dtx
+++ b/Master/texmf-dist/source/latex/quotchap/quotchap.dtx
@@ -4,7 +4,7 @@
% decorative chapter headings with quotations, a postscript output
% device is needed.
% Copyright (C) 1998 - 2010 Karsten Tinnefeld.
-% Copyright (C) 2011 - 2019 Jan Klever.
+% Copyright (C) 2011 - 2020 Jan Klever.
%
% This file is NOT part of the LaTeX2e system, but intended for use with it.
%
@@ -42,14 +42,14 @@
%<driver>\ProvidesFile{quotchap.drv}
% \fi
% \ProvidesFile{quotchap.dtx}
- [2019/07/09 v1.2 Decorative Chapter Headings with Quotes]
+ [2020/11/13 v1.3 Decorative Chapter Headings with Quotes]
%
% \iffalse
%<*driver>
\documentclass{ltxdoc}
\usepackage{multicol}
\GetFileInfo{quotchap.dtx}
-\newcommand*{\docdate}{2019/07/09}
+\newcommand*{\docdate}{2020/11/13}
\RecordChanges
\begin{document}
\DocInput{\filename}
@@ -57,7 +57,7 @@
%</driver>
% \fi
%
-% \CheckSum{209}
+% \CheckSum{210}
%
% \DoNotIndex{\@M,\@afterindentfalse,%
% \@topnum,\advance,\AtEndOfPackage,\baselineskip,\begin,\bigskip,%
@@ -325,7 +325,7 @@
% \begin{macrocode}
\AtEndOfPackage{%
\newcommand*{\chapnumfont}{%
- \usefont{T1}{\@defaultcnfont}{b}{n}\fontsize{100}{130}\selectfont%
+ \usefont{\f@encoding}{\@defaultcnfont}{b}{n}\fontsize{100}{130}\selectfont%
\color{chaptergrey}}
\let\size@chapter\huge
\providecommand*{\chapterheadstartvskip}{\vspace*{2.3\baselineskip}}
diff --git a/Master/texmf-dist/source/latex/ragged2e/Makefile b/Master/texmf-dist/source/latex/ragged2e/Makefile
deleted file mode 100644
index fe07f4f1f67..00000000000
--- a/Master/texmf-dist/source/latex/ragged2e/Makefile
+++ /dev/null
@@ -1,31 +0,0 @@
-doc: ragged2e.pdf ragged2e.dvi
-ragged2e.dvi: ragged2e.pdf
- latex ragged2e.drv
-
-ragged2e.pdf: ragged2e.dtx ragged2e.drv ragged2e.sty
- pdflatex -draftmode ragged2e.drv
- pdflatex -draftmode ragged2e.drv
- makeindex -s gind.ist -t ragged2e.ind.ilg ragged2e ragged2e.idx
- makeindex -s gglo.ist -t ragged2e.gls.ilg -o ragged2e.gls ragged2e ragged2e.glo
- pdflatex ragged2e.drv
-
-ragged2e.drv ragged2e.sty: ragged2e.dtx ragged2e.ins
- latex ragged2e.ins
-
-ragged2e.zip: ragged2e.dtx ragged2e.pdf ragged2e.ins
- $(eval RELEASEDIR := $(shell mktemp -d))
- @cp -a ragged2e.dtx ragged2e.pdf ragged2e.ins $(RELEASEDIR)
- @cp .git/gitHeadInfo.gin $(RELEASEDIR)/gitHeadLocal.gin
- @sed -i 's/usepackage{gitinfo2}/usepackage[release]{gitinfo2}/g' $(RELEASEDIR)/ragged2e.dtx
- @zip --junk-paths ragged2e.zip $(RELEASEDIR)/ragged2e.dtx $(RELEASEDIR)/ragged2e.pdf $(RELEASEDIR)/ragged2e.ins $(RELEASEDIR)/gitHeadLocal.gin
- @rm -rf $(RELEASEDIR)
-
-.PHONY: clean clobber
-
-clean:
- rm -f *.aux *.toc *.glo *.gls *.hd *.idx *.ilg *.ind *.log
-
-clobber: clean
- rm -f *.dvi *.pdf *.sty *.drv *.zip
-
-# vim:noexpandtab
diff --git a/Master/texmf-dist/source/latex/ragged2e/ragged2e.drv b/Master/texmf-dist/source/latex/ragged2e/ragged2e.drv
deleted file mode 100644
index e877d11cb61..00000000000
--- a/Master/texmf-dist/source/latex/ragged2e/ragged2e.drv
+++ /dev/null
@@ -1,117 +0,0 @@
-%%
-%% This is file `ragged2e.drv',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% ragged2e.dtx (with options: `driver')
-%%
-%% Copyright 1996..2019 Martin Schroeder.
-%%
-%% This file is part of the Ragged2e package
-%% -----------------------------------------
-%%
-%% To produce the documentation in the way you like you are allowed
-%% to change this driver file.
-%%
-\NeedsTeXFormat{LaTeX2e}[2017/03/29]
-\ProvidesFile{ragged2e.drv}
- [2019/03/26 v1.09 Driver for ragged2e Package (MS)]
-\documentclass[a4paper]{ltxdoc}
-\usepackage[T1]{fontenc}
-\usepackage{lmodern}
-\usepackage{microtype}
-\usepackage{url} % in latex/contrib/other/misc
-\usepackage{array}
-\usepackage{tabularx}
-\usepackage{gitinfo2}
-\usepackage{hypdoc}
-\usepackage{geometry}
-\IfFileExists{booktabs.sty}{%
- \usepackage{booktabs}%
- }{%
- \PackageWarning{ragged2e}%
- {booktabs.sty is missing.\MessageBreak
- I'm emulating the needed commands, but you should\MessageBreak
- install it for better results}%
- \let\toprule\hline
- \let\midrule\hline
- \let\bottomrule\hline
- }
-\IfFileExists{footmisc.sty}{%
- \usepackage[document]{ragged2e}[2003/01/26]
- }{%
- \PackageWarning{ragged2e}%
- {footmisc.sty is missing.\MessageBreak
- You should install it for better results}%
- \usepackage[raggedrightboxes]{ragged2e}[2003/01/26]
- }
-\setlength{\RaggedRightRightskip}{0pt plus 4em}%
-\GetFileInfo{ragged2e.sty}
-\EnableCrossrefs
-\RecordChanges % Gather update information
-%%\DisableCrossrefs% Say \DisableCrossrefs if index is ready
-\CodelineIndex % Index code by line number
-%%\OldMakeIndex % use if your MakeIndex is pre-v2.9
-\setcounter{IndexColumns}{2}
-\makeatletter
- \renewenvironment{theglossary}{%
- \glossary@prologue
- \setlength\emergencystretch{5em}
- \GlossaryParms \let\item\@idxitem \ignorespaces}{}
- \makeatother
-\setlength{\IndexMin}{40ex}
-\setlength{\columnseprule}{.4pt}
-\addtolength{\oddsidemargin}{3cm}
-\addtolength{\textwidth}{-3cm}
-\begin{document}
- \DocInput{ragged2e.dtx}
- \PrintIndex\PrintChanges
- % Make sure that the index is not printed twice
- % (ltxdoc.cfg might have a second \PrintIndex command)
- \let\PrintChanges\relax
- \let\PrintIndex\relax
-\end{document}
-%% Copyright 1996..2019 by Martin Schr\"oder.
-%% \CharacterTable
-%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-%% Digits \0\1\2\3\4\5\6\7\8\9
-%% Exclamation \! Double quote \" Hash (number) \#
-%% Dollar \$ Percent \% Ampersand \&
-%% Acute accent \' Left paren \( Right paren \)
-%% Asterisk \* Plus \+ Comma \,
-%% Minus \- Point \. Solidus \/
-%% Colon \: Semicolon \; Less than \<
-%% Equals \= Greater than \> Question mark \?
-%% Commercial at \@ Left bracket \[ Backslash \\
-%% Right bracket \] Circumflex \^ Underscore \_
-%% Grave accent \` Left brace \{ Vertical bar \|
-%% Right brace \} Tilde \~}
-%%
-%% \iffalse meta-comment
-%% ===================================================================
-%% @LaTeX-style-file{
-%% author = {Martin Schr\"oder},
-%% version = "2.2",
-%% date = "26 Mar 2019",
-%% filename = "ragged2e.sty",
-%% address = {Martin Schr\"oder
-%% Unterstra\"se 31
-%% 47051 Duisburg
-%% Germany}
-%% email = "martin@oneiros.de",
-%% docstring = "LaTeX package which defines new commands
-%% \Centering, \RaggedLeft, \RaggedRight and
-%% \justifying and new environments Center,
-%% FlushLeft, FlushRight and justify, which
-%% set ragged text and are easily configurable
-%% to allow hyphenation.
-%% Uses the everysel package.
-%% "
-%% }
-%% ===================================================================
-%% \fi
-\endinput
-%%
-%% End of file `ragged2e.drv'.
diff --git a/Master/texmf-dist/source/latex/ragged2e/ragged2e.dtx b/Master/texmf-dist/source/latex/ragged2e/ragged2e.dtx
index dd30514ccbc..5c3408cf12f 100644
--- a/Master/texmf-dist/source/latex/ragged2e/ragged2e.dtx
+++ b/Master/texmf-dist/source/latex/ragged2e/ragged2e.dtx
@@ -1,41 +1,51 @@
+%% \iffalse meta-comment
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Copyright (C) Martin Schröder, 1996–2019
+% Marei Peischl (peiTeX) <marei@peitex.de>, 2021
+%
+% 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
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is
+% Marei Peischl <marei@peitex.de>.
+%
+%
+% This work consists of the files
+% README.md
+% ragged2e.dtx
+% ragged2e.ins
+% and the derived file
+% ragged2e.sty.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \fi
% \iffalse
\NeedsTeXFormat{LaTeX2e}[2017/03/29]
%<package>\ProvidesPackage{ragged2e}
-%<package> [2019/07/28 v2.2 ragged2e Package (MS)]
+%<package> [2021/02/05 v3.0 ragged2e Package]
%
%<*driver>
-\ProvidesFile{ragged2e.drv}
- [2019/03/26 v1.09 Driver for ragged2e Package (MS)]
\documentclass[a4paper]{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{microtype}
-\usepackage{url} % in latex/contrib/other/misc
+\usepackage{url}
\usepackage{array}
\usepackage{tabularx}
\usepackage{gitinfo2}
\usepackage{hypdoc}
\usepackage{geometry}
-% booktabs.sty is in latex/contrib/supported/booktab
-\IfFileExists{booktabs.sty}{%
- \usepackage{booktabs}%
- }{%
- \PackageWarning{ragged2e}%
- {booktabs.sty is missing.\MessageBreak
- I'm emulating the needed commands, but you should\MessageBreak
- install it for better results}%
- \let\toprule\hline
- \let\midrule\hline
- \let\bottomrule\hline
- }
-\IfFileExists{footmisc.sty}{%
- \usepackage[document]{ragged2e}[2003/01/26]
- }{%
- \PackageWarning{ragged2e}%
- {footmisc.sty is missing.\MessageBreak
- You should install it for better results}%
- \usepackage[raggedrightboxes]{ragged2e}[2003/01/26]
- }
+\usepackage{booktabs}
+\usepackage[document]{ragged2e}
\setlength{\RaggedRightRightskip}{0pt plus 4em}%
\GetFileInfo{ragged2e.sty}
\EnableCrossrefs
@@ -65,25 +75,8 @@
\let\PrintIndex\relax
\end{document}
%</driver>
-%
-%% Copyright 1996..2019 by Martin Schr\"oder.
-%
-% 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
-% http://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 `unmaintained'.
-%
-% This work consists of the files ragged2e.dtx and ragged2e.ins
-% and the derived file ragged2e.sty.
-%
% \fi
-%
-% \CheckSum{478}
+% \CheckSum{486}
%
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -101,34 +94,6 @@
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
%%
-%% \iffalse meta-comment
-%% ===================================================================
-%% @LaTeX-style-file{
-%% author = {Martin Schr\"oder},
-%% version = "2.2",
-%% date = "26 Mar 2019",
-%% filename = "ragged2e.sty",
-%% address = {Martin Schr\"oder
-%% Unterstra\"se 31
-%% 47051 Duisburg
-%% Germany}
-%% email = "martin@oneiros.de",
-% codetable = "ISO/ASCII",
-% keywords = "raggedright",
-% dependences = "everysel",
-% supported = "yes",
-%% docstring = "LaTeX package which defines new commands
-%% \Centering, \RaggedLeft, \RaggedRight and
-%% \justifying and new environments Center,
-%% FlushLeft, FlushRight and justify, which
-%% set ragged text and are easily configurable
-%% to allow hyphenation.
-%% Uses the everysel package.
-%% "
-%% }
-%% ===================================================================
-%% \fi
-%
% \pagestyle{headings}
%
% \newcommand*{\file}[1] {\texttt{#1}}
@@ -172,12 +137,7 @@
% The version number of this file is \fileversion,
% revision~\#\gitAbbrevHash, last revised \protect\gitAuthorIsoDate.}^^A
% }
-% \author{Martin Schr\"oder\\[0.5ex]
-% \normalsize Unterstra\ss{}e 31\\
-% \normalsize 47051 Duisburg\\
-% \normalsize Germany\\
-% \normalsize \texttt{martin@oneiros.de}\\
-% \normalsize \url{https://gitlab.com/hagenbuch/ragged2e}}
+% \author{Martin Schröder\\\url{https://gitlab.com/TeXhackse/ragged2e}\thanks{maintained by Marei Peischl}}
% \date{\filedate}
% \maketitle
%
@@ -203,19 +163,8 @@
% \setlength{\parskip}{^^A
% .3\baselineskip plus.05\baselineskip minus.05\baselineskip}
%
-% \section{Status of this package}
% \changes{v2.2}{2019/07/28}{Change maintenance status of package}
-% ^^A
-% This package is \emph{unmaintained}.
-%
-% I will not actively work on this package anymore. I \emph{may}
-% merge merge requests to the repository on Gitlab
-% (\url{https://gitlab.com/hagenbuch/ragged2e}). If you want to
-% become the maintainer of this package, contact me and I may hand
-% over the repository to you. Or fork the package on Gitlab.
-%
-% I will \emph{not} upload new versions to CTAN.
-%
+% \changes{v3.0}{2021/02/05}{Change maintenance status}
% \section{The problem}
% ^^A
% \LaTeX{} has three commands (\cs{centering}, \cs{raggedleft}, and
@@ -595,11 +544,13 @@
% ^^A
% \changes{v2.1}{2003/10/08}{document that \option{document} needs
% \package{footmisc}}
+% \changes{v3.0}{2021/02/05}{document everysel is obsolete}
% This package requires the following packages:
% \begin{description}
-% \item[\normalfont\package{everysel}\,\cite{everysel}]
-% It is used to distinguish between monospaced and proportional
-% fonts.
+% \item[\normalfont\package{everysel}\,\cite{everysel}](only if format older than 2021/01/05)
+% It has been used to distinguish between monospaced and proportional
+% fonts as long as the LaTeX kernel did not provide the functionality with lthooks \cite{lthooks-doc}.
+% Formats newer than 2021/01/05 do no longer depend on everysel.
% \item[\normalfont\package{footmisc}\,\cite{footmisc}]
% It is used by the \option{footnotes} and the
% \option{document} options; at least version~5.00 (2002/08/28)
@@ -632,7 +583,7 @@
% \cs{@gnewline}.\newline
% Frank Mittelbach (\url{frank.mittelbach@latex-project.org})
% provided the impetus for version~2.00.\newline
-% Rolf Niepraschk (\url{Rolf.Niepraschk@gmx.de}) and Hubert G\"a\ss{}lein
+% Rolf Niepraschk (\url{Rolf.Niepraschk@gmx.de}) and Hubert Gäßlein
% found many bugs and provided fixes for them and code for new
% features.\newline
% Jordan Firth (\url{jafirth@ncsu.edu}) provided the final push for
@@ -646,7 +597,7 @@
%
% \bibitem{ltmiscen}
% Johannes Braams, David Carlisle, Alan Jeffrey, Leslie Lamport, Frank
-% Mittelbach, Chris Rowley, and Rainer Sch{\"o}pf.
+% Mittelbach, Chris Rowley, and Rainer Schöpf.
% \newblock ltmiscen.dtx.
% \newblock Part of the {\LaTeX}-distribution.
%
@@ -654,11 +605,11 @@
% Robin Fairbairns.
% \newblock \texttt{footmisc} --- a portmanteau package for
% customising footnotes in \LaTeXe.
-% \newblock \url{CTAN: tex-archive/macros/latex/contrib/supported/footmisc/footmisc.dtx}.
+% \newblock \url{https://mirror.ctan.org/macros/latex/contrib/footmisc/}.
%
% \bibitem{raggedr}
% James Kilfiger.
-% \newblock \url{CTAN: tex-archive/macros/latex/contrib/other/misc/raggedr.sty}.
+% \newblock \url{https://ctan.org/tex-archive/obsolete/macros/latex/contrib/misc/raggedr.sty}.
% \newblock \LaTeXe{} package.
%
% \bibitem{KnuthTeXa}
@@ -671,21 +622,26 @@
% \newblock \emph{\LaTeX: A Document Preparation System}.
% \newblock Ad{\-d}i{\-s}on-Wes{\-l}ey, Reading, MA, USA, first edition, 1986.
%
+% \bibitem{lthooks-doc}
+% Frank Mittelbach.
+% \newblock The \package{lthooks} package.
+% \newblock \url{http://mirrors.ctan.org/macros/latex/base/lthooks-doc.pdf}
+%
% \bibitem{cmfonts}
-% Frank Mittelbach and Rainer Sch{\"o}pf.
+% Frank Mittelbach and Rainer Schöpf.
% \newblock The file {\texttt{cmfonts.fdd}} for use with {\LaTeXe}.
% \newblock Part of the {\LaTeX}-distribution.
%
% \bibitem{everysel}
-% Martin Schr{\"o}der.
-% \newblock The \package{everysel}-package.
-% \newblock \url{CTAN: tex-archive/macros/latex/contrib/supported/ms/everysel.dtx}.
+% Martin Schröder.
+% \newblock The obsolete \package{everysel}-package.
+% \newblock \url{http://mirrors.ctan.org/macros/latex/contrib/everysel/everysel.pdf}.
% \newblock \LaTeXe{} package.
%
% \bibitem{raggedri}
-% Martin Schr{\"o}der.
+% Martin Schröder.
% \newblock The \package{raggedri} document option.
-% \newblock Was in \url{CTAN: tex-archive/macros/latex209/contrib/raggedright}.
+% \newblock Was in \url{http://mirrors.ctan.org/tex-archive/macros/latex209/contrib/raggedright}.
% \newblock \LaTeX2.09 style, outdated.
%
% \bibitem{ragged}
@@ -959,10 +915,12 @@
%
% \subsection{Loading packages}
% ^^A
-% We need the \package{everysel} package.
+% \changes{v3.00}{2021/02/05}{Remove the \package{everysel} package if kernel hooks are available}
+% We need the \package{everysel} package for older kernels.
% \changes{v2.00}{2003/01/18}{Load the \package{footmisc} package}%
% \begin{macrocode}
-\RequirePackage{everysel}
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
+\IfFormatAtLeastTF{2021/01/05}{}{\RequirePackage{everysel}}
% \end{macrocode}
% If the option \option{footnotes} is selected, we load the
% \package{footmisc} package after we are finished (\package{footmisc}
@@ -1149,7 +1107,13 @@
\spaceskip\z@
\fi
}
-\EverySelectfont{\@raggedtwoe@everyselectfont}
+% \end{macrocode}
+% If our kernel is new enough we use the kernel hook directly instead of the everysel macro.
+% \changes{v3.00}{2021/02/05}{Use kernel hook if available}
+% \begin{macrocode}
+\IfFormatAtLeastTF{2021/01/05}
+ {\AddToHook{selectfont}{\@raggedtwoe@everyselectfont}}
+ {\EverySelectfont{\@raggedtwoe@everyselectfont}}
% \end{macrocode}
% \end{macro}
%
@@ -1394,4 +1358,4 @@
%</package>
% \end{macrocode}
% \Finale
-% ^^A vim:tw=70:ts=2
+% ^^A
diff --git a/Master/texmf-dist/source/latex/ragged2e/ragged2e.ins b/Master/texmf-dist/source/latex/ragged2e/ragged2e.ins
index 72cc08ee565..e2134b76203 100644
--- a/Master/texmf-dist/source/latex/ragged2e/ragged2e.ins
+++ b/Master/texmf-dist/source/latex/ragged2e/ragged2e.ins
@@ -1,93 +1,34 @@
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{ragged2e.ins}
- [2019/04/14 v1.5 Installation script for Ragged2e Package (MS)]
-%%
-%% Copyright 1996..2019 by Martin Schr\"oder.
-%%
-%% 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
-%% http://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 Martin Schr\"oder.
-%%
-%% This work consists of the files ragged2e.dtx and ragged2e.ins
-%% and the derived file ragged2e.sty.
-%%
-%% --------------- start of docstrip commands ------------------
\input docstrip.tex
-{\ifx\endbatchfile\undefined
-\Msg{**********************************************}
-\Msg{*}
-\Msg{* This installation requires docstrip}
-\Msg{* version 2.4d or later.}
-\Msg{*}
-\Msg{* An older version of docstrip has been input}
-\Msg{*}
-\Msg{**********************************************}
-\errhelp{Move or rename old docstrip.tex.}
-\errmessage{Old docstrip in input path}
-\batchmode
-\csname @@end\endcsname
-\fi}
-\Msg{***********************************************************}
-\Msg{*}
-\Msg{* The ragged2e distribution contains these files:}
-\Msg{*}
-\Msg{* \space\space ragged2e.dtx}
-\Msg{* \space\space ragged2e.ins}
-\Msg{*}
-\Msg{* If you receive only some of these files from someone, complain!}
-\Msg{*}
-\Msg{***********************************************************}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{ragged2e.ins}
+ [2020/02/05 v3.0 Installation script for Ragged2e Package]
\preamble
-
-Copyright 1996..2019 Martin Schroeder.
-
-This file is part of the Ragged2e package
------------------------------------------
+Copyright (C) 1996–2019 Martin Schröder, 2021 Marei Peischl (peiTeX) <marei@peitex.de>
This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3
+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.3 or later is part of all distributions of LaTeX
+http://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
version 2005/12/01 or later.
This work has the LPPL maintenance status `maintained'.
-The Current Maintainer of this work is Martin Schroeder.
+The Current Maintainer of this work is
+ Marei Peischl <marei@peitex.de>.
This work consists of the files ragged2e.dtx and ragged2e.ins
and the derived file ragged2e.sty.
\endpreamble
-\declarepreamble\driverpreamble
-
-Copyright 1996..2019 Martin Schroeder.
-
-This file is part of the Ragged2e package
------------------------------------------
-
-To produce the documentation in the way you like you are allowed
-to change this driver file.
-
-\endpreamble
-
\keepsilent
\askforoverwritefalse
-\generate{\file{ragged2e.sty}{\from{ragged2e.dtx}{package}}
- \usepreamble\driverpreamble
- \file{ragged2e.drv}{\from{ragged2e.dtx}{driver}}
- }
+\generate{%
+ \file{ragged2e.sty}{\from{ragged2e.dtx}{package}}
+}
\Msg{***********************************************************}
\Msg{*}
@@ -96,7 +37,7 @@ to change this driver file.
\Msg{*}
\Msg{* \space\space ragged2e.sty}
\Msg{*}
-\Msg{* To produce the documentation run the file ragged2e.drv}
+\Msg{* To produce the documentation run the file ragged2e.dtx}
\Msg{* through LaTeX.}
\Msg{*}
\Msg{* Happy TeXing}
@@ -104,4 +45,3 @@ to change this driver file.
\endbatchfile
%%
%% End of file `ragged2e.ins'.
-%% vim:syntax=tex:tw=70:ts=2
diff --git a/Master/texmf-dist/source/latex/ran_toks/ran_toks.dtx b/Master/texmf-dist/source/latex/ran_toks/ran_toks.dtx
index 89aafdc826a..5549bbc01c6 100644
--- a/Master/texmf-dist/source/latex/ran_toks/ran_toks.dtx
+++ b/Master/texmf-dist/source/latex/ran_toks/ran_toks.dtx
@@ -4,7 +4,7 @@
%<*copyright>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% ran_toks package, %%
-%% Copyright (C) 1999-2019 D. P. Story %%
+%% Copyright (C) 1999-2021 D. P. Story %%
%% dpstory@uakron.edu, dpstory@acrotex.net %%
%% %%
%% This program can redistributed and/or modified under %%
@@ -16,10 +16,11 @@
%</copyright>
%<package>\NeedsTeXFormat{LaTeX2e}[1997/12/01]
%<package>\ProvidesPackage{ran_toks}
-%<package> [2019/12/28 v1.2 Randomizing tokens (dps)]
+%<package> [2021/01/19 v1.3.1 Randomizing tokens (dps)]
%<*driver>
\documentclass{ltxdoc}
\usepackage[colorlinks,hyperindex=false]{hyperref}
+\usepackage{fancyvrb}
%\def\texorpdfstring#1#2{#1}
%\pdfstringdefDisableCommands{\let\\\textbackslash}
\OnlyDescription % comment out for implementation details
@@ -37,6 +38,9 @@
\def\meta#1{\textsl{\texttt{#1}}}
\def\SUB#1{\ensuremath{{}_{\mbox{\scriptsize\ttfamily#1}}}}
\def\cs#1{\texttt{\bslash#1}}
+\makeatletter
+\let\@latex@warning@no@line\@gobble
+\makeatother
\InputIfFileExists{aebdocfmt.def}{\PackageInfo{ran_toks}{Inputting aebdocfmt.def}}
{\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax
\PackageInfo{ran_toks}{aebdocfmt.def cannot be found}}
@@ -72,39 +76,42 @@
% \paragraph*{Description.}
% This short package randomizes a list of tokens. The command, \cs{ranToks},
% takes one argument, which is a list of tokens:
-%\begin{quote}\ttfamily
-% \string\ranToks\darg{\ameta{name}}\\
-% \darg{\\\null
-% \qquad\darg{\ameta{tok\SUB1}}\darg{\ameta{tok\SUB2}}...\darg{\ameta{tok\SUB{n}}}\\
-% }
-%\end{quote}
+%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small,
+%commandchars={!()},codes={\catcode`\%=9}]
+%\ranToks{!ameta(name)}{!%
+%!quad{!ameta(tok!SUB1)}{!ameta(tok!SUB2)}...{!ameta(tok!SUB(n))}
+%}
+%\end{Verbatim}
% The command defines a series of $n$ internal commands, one for each of the tokens.
% The definitions are essentially randomized. The randomized tokens are accessed through
-% the command \cs{useRanTok}. For example
-%\begin{quote}\ttfamily
-%\cs{useRanTok\darg{1}}, \cs{useRanTok\darg{2}},..., \cs{useRanTok\darg{n}}
-%\end{quote}
+% the command \cs{useRanTok}. For example,
+%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small,
+%commandchars={!()},codes={\catcode`\%=9}]
+%\useRanTok{1}, \useRanTok{2},..., \useRanTok{n}
+%\end{Verbatim}
% gives a random listing of the $n$ tokens. These can be arranged on the page
% as desired.
%
% There is a second construct, designed for more elaborate randomization.
-%\begin{quote}\ttfamily
-%\string\bRTVToks\darg{\ameta{name}}\\
-%\string\begin\darg{rtVW}\\
-%\null\qquad\ameta{some content}\\
-%\string\end\darg{rtVW}\\
-%...\\
-%...\\
-%\string\begin\darg{rtVW}\\
-%\null\qquad\ameta{some content}\\
-%\string\end\darg{rtVW}\\
-%\string\eRTVToks
-%\end{quote}
+%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small,
+%commandchars={!()},codes={\catcode`\%=9}]
+%\bRTVToks{!ameta(name)}
+%\begin{rtVW}
+%!quad!ameta(some content)
+%\end{rtVW}
+%...
+%...
+%\begin{rtVW}
+%!quad!ameta(some content)
+%\end{rtVW}
+%\eRTVToks
+%\end{Verbatim}
% The contents of each of the \texttt{rtVW} environments are written to the computers hard drive, then input
% back in random order, using \cs{useRanTok}, eg,
-%\begin{quote}\ttfamily
-%\cs{useRanTok\darg{1}}, \cs{useRanTok\darg{2}},..., \cs{useRanTok\darg{n}}
-%\end{quote}
+%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small,
+%commandchars={!()},codes={\catcode`\%=9}]
+%\useRanTok{1}, \useRanTok{2},..., \useRanTok{n}
+%\end{Verbatim}
% Other details are left to the readers' imagination.
%
% \paragraph{Requirements.} As of this writing, we require only the \texttt{verbatim} package
@@ -158,11 +165,28 @@
\newif\ifrtdebug \rtdebugfalse
\newif\ifwerandomize \werandomizetrue
\newif\ifsaveseed\saveseedtrue
+\newif\ifrt@InputUsedIDs\rt@InputUsedIDsfalse
\newwrite\rt@Verb@write
% \end{macrocode}
+% Convenience commands.
% \begin{macrocode}
+\def\rtcsarg#1#2{\expandafter#1\csname#2\endcsname}
\def\rt@nameedef#1{\expandafter\edef\csname #1\endcsname}
% \end{macrocode}
+% \leavevmode\IndexOpt{usedbapp}^^A
+% The code to support a DB application has grown, so much so, it desirves
+% a option so as to include the code only if needed.
+% \changes{v1.3}{2021/01/14}{Added \string\opt{usedbapp} option}
+% \begin{macrocode}
+\DeclareOption{usedbapp}{\let\rtPkgInpt\rt@PkgInpt}
+\def\rt@PkgInpt{\InputIfFileExists{rt-dbapp.def}
+ {\PackageInfo{ran_toks}{Inputting rt-dbapp.def}}
+ {\PackageInfo{ran_toks}{Cannot find rt-dbapp.def}}
+}
+\let\rtPkgInpt\relax
+\AtEndOfPackage{\rtPkgInpt}
+\ProcessOptions\relax
+% \end{macrocode}
% \begin{macrocode}
%</package>
%<*altpkgname>
@@ -272,7 +296,7 @@
\edef\rt@listInHold{\the\rt@listIn\noexpand\\{\the\rt@nCnt}}%
\rt@listIn=\expandafter{\rt@listInHold}}}
% \end{macrocode}
-% \DescribeMacro{\rt@RandomizeList}\hskip-\marginparsep\thinspace|{|\ameta{n}|}|
+% \DescribeMacro{\rt@RandomizeList}\hskip-\marginparsep\thinspace\texttt{\darg{\ameta{n}}}
% is the command that gets the process of randomizing
% the input list going. The argument is the number \ameta{n} of tokens. If
% \cs{werandomize} is false, it just returns the input list; otherwise, it
@@ -361,7 +385,7 @@
instead will use\MessageBreak
\string\useRanTok{\rt@mod}, obtained from modular
arithmetic.\MessageBreak
- You might want to fix this}
+ You might want to fix this}%
}
\def\rt@badTokName#1{%
\PackageWarningNoLine{ran_toks}
@@ -414,14 +438,14 @@
% \cs{r@nVToks}.
% \begin{macrocode}
\newcommand{\eRTVToks}{\global
- \rt@nameedef{\rt@BaseName Cnt}{\the\rt@nCnt}%
- \expandafter\r@nVToks\expandafter{\rt@BaseName}}
+ \rt@nameedef{\rt@BaseName Cnt}{\the\rt@nCnt}\expandafter
+ \r@nVToks\expandafter{\rt@BaseName}}
% \end{macrocode}
% \end{macro}
% \begin{environment}{rtVW}
% \cs{rtVW} is a verbatim write environment. It saves its contents to the file
-% \verb!\jobname_\rt@BaseName\the\rt@nCnt.cut!. The file is later input back into
-% the source file in a random way.
+% \verb!\jobname_\rt@BaseName-\the\rt@nCnt.cut!. The file is later input back into
+% the source file in a random way. % J14
% \begin{macrocode}
\def\reVerbEnd{\ifhmode\unskip\fi}
% \end{macrocode}
@@ -432,11 +456,21 @@
\def\rtVWHook#1{\def\@rgi{#1}\ifx\@rgi\@empty
\let\RTVWHook\relax\else\def\RTVWHook{#1}\fi}
\rtVWHook{}
+\newwrite\wrtprobids
+\newif\ifviewIDs\viewIDsfalse
+\newif\ifxDBUnique\xDBUniquefalse
+\def\wrtProbIds#1{\immediate\write\wrtprobids{\string
+ \rtcsarg\string\gdef{#1}{used}}}
+\def\rtVWId#1{\ifviewIDs\noindent#1\fi
+ \ifxDBUnique\ifrt@InputUsedIDs\wrtProbIds{#1}\fi\fi
+}
\newenvironment{rtVW}{\global\advance\rt@nCnt\@ne
\immediate\openout\rt@Verb@write
- \jobname_\rt@BaseName\the\rt@nCnt.cut
+ \jobname_\rt@BaseName-\the\rt@nCnt.cut
\let\verbatim@out\rt@Verb@write
\rt@IWVO{\string\RTVWHook}%
+ \rt@IWVO{\string
+ \rtVWId{\rt@BaseName-\the\rt@nCnt}\string\relax}%
\verbatimwrite
}{%
\endverbatimwrite
@@ -454,11 +488,22 @@
\rt@listIn={}\rt@nCnt=0\relax\let\rt@listInHold\@empty
\@whilenum\rt@nCnt<\rt@nMax\do{\advance\rt@nCnt\@ne
\edef\rt@listInHold{%
- \the\rt@listIn{\noexpand\rt@inputVerb{#1\the\rt@nCnt}}}%
+ \the\rt@listIn{\noexpand\rt@inputVerb{#1-\the\rt@nCnt}}}% J14
\rt@listIn=\expandafter{\rt@listInHold}}\ifrtdebug
\typeout{\string\r@nVToks: \the\rt@listIn}\fi
\expandafter\r@nToks\expandafter{\the\rt@listIn}}
-\def\rt@inputVerb#1{\input{\jobname_#1.cut}}
+% \end{macrocode}
+% \DescribeMacro\rt@inputVerb\hskip-\marginparsep\texttt{\darg{\ameta{db-name}-\ameta{num}}} This
+% is the command that inputs a DB Test problem, it inputs it from the file named
+% \cs{jobname\_\darg{\ameta{db-name}-\ameta{num}}}. As we input, we make a record of the
+% problem we input by expanding \cs{rt@recordAsUsed\darg{\ameta{db-name}-\ameta{num}}}, which
+% itself expands to \cs{rtcsarg\string\gdef\darg{\ameta{db-name}-\ameta{num}}\darg{used}}. This is necessary when we are
+% choosing more than one item from a given DB Test file; it must be recorded immediately so that later
+% it cannot be used again, if possible.
+% \begin{macrocode}
+\def\rt@inputVerb#1{\rt@recordAsUsed{#1}\input{\jobname_#1.cut}}
+%\def\rt@recordAsUsed#1{\ifxDBUnique\rtcsarg\gdef{#1}{used}\fi}
+\def\rt@recordAsUsed#1{\rtcsarg\gdef{#1}{used}}
% \end{macrocode}
% \DescribeMacro{\r@ndToks} is main looping command for \cs{ranToks}
% and \cs{eRTVToks} (through \cs{r@nVToks}). If the ending token \cs{rt@NIL} is detected, we
@@ -524,16 +569,18 @@
% Use this command to copy \ameta{name1} to \ameta{name2}. This gives
% a randomization of the same list, without affecting the original order of \ameta{name1}.
% \begin{macrocode}
-\newcommand\copyRanToks[2]{\begingroup\expandafter
+\newcommand\copyRanToks[2]{\begingroup
+ \expandafter
\ifx\csname nMax4#1\endcsname\relax
% \end{macrocode}
% Source list is not defined
% \begin{macrocode}
- \rt@badTokName{#1}%
- \else\expandafter
+ \rt@badTokName{#1}%
+ \else
% \end{macrocode}
% Source list is defined
% \begin{macrocode}
+ \expandafter
\ifx\csname nMax4#2\endcsname\relax
% \end{macrocode}
% Destination list is not defined, which is good in this instance. This is
@@ -545,14 +592,17 @@
\@whilenum\rt@nCnt>\z@\do{\global
\rt@nameedef{rtTok\the\rt@nCnt#2}%
{\noexpand\@nameuse{rtTok\the\rt@nCnt#1}}%
- \advance\rt@nCnt\m@ne}%
- \rt@performRanDefns{\@nameuse{nMax4#2}}\else
+ \advance\rt@nCnt\m@ne
+ }\rt@performRanDefns{\@nameuse{nMax4#2}}%
+ \else
% \end{macrocode}
% Destination list is defined already, warn the user.
% \begin{macrocode}
- \rt@warnTokName{#2}\fi
+ \rt@warnTokName{#2}%
+ \fi
\fi
-\endgroup}
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
%\DescribeMacro{\rt@ssign}\hskip-\marginparsep\texttt{\darg{\ameta{name}}} makes the assignments that are expanded by \cs{useRanTok}.
@@ -570,7 +620,8 @@
\newcommand{\nToksFor}[1]{\expandafter
\ifx\csname nMax4#1\endcsname\relax
\textbf{??}\rt@badTokName{#1}\else
- \@nameuse{nMax4#1}\fi}
+ \@nameuse{nMax4#1}\fi
+}
% \end{macrocode}
% \DescribeMacro{\rtTokByNum}\hskip-\marginparsep\texttt{[\ameta{name}]\darg{\ameta{num}}} is an internal macro, but it can be used publicly.
% The argument of it is an integer, eg, \verb!\rtTokByNum{3}! is the third token, as listed in the order
@@ -579,23 +630,66 @@
\newcommand{\rtTokByNum}[2][\rt@BaseName]{\expandafter
\ifx\csname nMax4#1\endcsname\relax
\textbf{??}\rt@badTokName{#1}\else
- \@nameuse{rtTok#2#1}\expandafter\ignorespaces\fi}
+ \@nameuse{rtTok#2#1}\expandafter\ignorespaces
+ \fi
+}
% \end{macrocode}
%\DescribeMacro{\useRanTok}\hskip-\marginparsep\texttt{[\ameta{name}]\darg{\ameta{num}}}
% After \cs{ranToks} has been executed, the user has access to the
% randomized tokens through \cs{useRanTok}. The argument \ameta{num} is an integer 1 through max.
% \begin{macrocode}
-\newcommand{\useRanTok}[2][\rt@BaseName]{\bgroup
- \expandafter\ifx\csname nMax4#1\endcsname\relax
- \rt@badTokName{#1}\else
- \ifnum#2>\nToksFor{#1}\rt@modarith{#2}{\nToksFor{#1}}%
% \end{macrocode}
-% If index (\texttt{\#2}) is greater than array length, use modular arithmetic to resolve
-% the issue, and send a warning to the user.
-% \changes{v1.1}{2017/05/04}{Add modular arithmetic to resolve case where index is greater than length}
+% We provide two commands to control the feature of try to select unique
+% choices across multiple renditions of the same source file.
+% \DescribeMacro\uniqueXDBChoicesOn\cs{uniqueXDBChoicesOn}, turns on this feature;
+% the default is \DescribeMacro\uniqueXDBChoicesOff\cs{uniqueXDBChoicesOff} make
+% no changes to how \cs{useRanTok} operates. One other command we define here is
+% \DescribeMacro\makeInfoAWarning\cs{makeInfoAWarning}; this command applies only
+% when \cs{uniqueXDBChoicesOn} is expanded. In the macro \cs{xdb@unique} which is
+% expanded when \cs{uniqueXDBChoicesOn} is expanded first, there is one line that
+% reports information to the log as \cs{PackageInfo}. By expanding \cs{makeInfoAWarning}
+% we change \cs{PackageInfo} to \cs{PackageWarning}, which gives it greater
+% visibility in the log and the log report.
+% \changes{v1.3.1}{2021/01/19}{Added \string\cs{ifrt@recording}}
+% \begin{macrocode}
+\newcommand{\uniqueXDBChoicesOn}{\xDBUniquefalse
+ \PackageWarning{ran_toks}
+ {The \string\uniqueXDBChoicesOn\space requires the\MessageBreak
+ \texttt{usedbapp} option}}
+\newcommand{\uniqueXDBChoicesOff}{\let\xdbunique\relax\xDBUniquefalse}
+\let\xdbunique\relax
+\newcommand{\makeInfoAWarning}{\def\pkgNotifType{\PackageWarning}}
+\def\pkgNotifType{\PackageInfo}
+\newif\ifrt@recording \rt@recordingtrue % dps
+% \end{macrocode}
+% Now for the definition of \cs{useRanTok}.
% \begin{macrocode}
- \rt@badIndex{#2}{#1}\@nameuse{rtRanTok\rt@mod#1}\else
- \@nameuse{rtRanTok#2#1}\fi\fi\egroup}
+\newcommand{\useRanTok}[2][\rt@BaseName]{\bgroup\expandafter
+ \ifx\csname nMax4#1\endcsname\relax
+ \rt@badTokName{#1}\global\let\rt@next\relax
+ \else
+ \ifnum#2>\@nameuse{nMax4#1}%
+ \rt@modarith{#2}{\@nameuse{nMax4#1}}%
+ \rt@badIndex{#2}{#1}\edef\Indx{\rt@mod}%
+ \else
+ \edef\Indx{#2}%
+ \fi
+ \xdef\rt@orig@Indx{\Indx}%
+% \end{macrocode}
+% If \cs{xdbunique} is \cs{relax}, \cs{useRanTok} executes as it did in the past
+% (no change in behavior); otherwise, we expand \cs{xdb@unique} which attempts
+% to avoid duplicate choices based on the DBs input by \cs{useProbDBs}.
+% \begin{macrocode}
+ \ifx\xdbunique\relax
+ \ifrt@recording\rt@recordAsUsed{#1-\Indx}\fi
+ \xdef\rt@next{\noexpand\@nameuse{rtRanTok\Indx#1}}%
+ \else
+ \xdb@unique{#1}%
+ \fi
+ \fi
+ \egroup
+ \rt@next
+}
% \end{macrocode}
% \DescribeMacro{\displayListRandomly}\hskip-\marginparsep\texttt{[\ameta{prior}][\ameta{post}]\darg{\ameta{name}}}
% lists all items in the list as passed
@@ -606,12 +700,14 @@
%\changes{v1.0e}{2016/02/06}{Added optional argument to \string\cs{displayListRandomly}}
%\changes{v1.1}{2017/05/04}{Added second optional argument to \string\cs{displayListRandomly}}
% \begin{macrocode}
-\newcommand{\displayListRandomly}[1][]{\bgroup\def\rt@prior{#1}%
- \displ@yListRandomly}
-\newcommand{\displ@yListRandomly}[2][]{\rt@nCnt\z@
- \expandafter\ifx\csname nMax4#2\endcsname\relax
+\newcommand{\displayListRandomly}[1][]{\bgroup
+ \def\rt@prior{#1}\displ@yListRandomly
+}
+\newcommand{\displ@yListRandomly}[2][]{\rt@nCnt\z@\expandafter
+ \ifx\csname nMax4#2\endcsname\relax
\rt@rgi\space\textbf{??}\rt@badTokName{#2}#1%
\else
+ \rt@recordingfalse
% \end{macrocode}
% Within the optional arguments, we define \DescribeMacro{\i}\cs{i},
% \DescribeMacro{\first}\cs{first}, \DescribeMacro{\last}\cs{last}, and
@@ -620,28 +716,75 @@
% \cs{displayListRandomly}.
% \begin{macrocode}
\def\rt@post{#1}\useRTName{#2}\let\i\rt@nCnt
- \def\first{1}\edef\last{\@nameuse{nMax4#2}}%
- \@tempcnta\last \advance\@tempcnta\m@ne
- \edef\lessone{\the\@tempcnta}%
- \@whilenum\rt@nCnt<\last\advance\rt@nCnt\@ne
- \do{\rt@prior\useRanTok{\the\rt@nCnt}\rt@post}%
- \fi
-\egroup}
+ \def\first{1}\edef\last{\@nameuse{nMax4#2}}\@tempcnta\last
+ \advance\@tempcnta\m@ne
+ \edef\lessone{\the\@tempcnta}\@whilenum\rt@nCnt<\last
+ \advance\rt@nCnt\@ne
+ \do{\rt@prior\useRanTok{\the\rt@nCnt}\rt@post
+ }\fi
+ \egroup
+}
+%</package>
+%<*dbapp>
+% \end{macrocode}
+% \section{A DB application}
+% This (optional) section supports an application of \pkg{ran\_toks} to the \pkg{eqexam} package; though,
+% conceptually, the commands of this section may be applied in other settings. In this application,
+% the document author has a series of DB test files (TEX files), each file contains \cs{bRTVToks}/\allowbreak
+% \cs{eRTVToks} constructs, which contain a series of \env{rtVW} environments of verbatim content. In this application,
+% the verbatim content are \env{problem}/\env{problem*} environments of \pkg{eqexam}.
+%
+% The following verbatim listing is taken from the preamble of \texttt{mc-db.tex}, which illustrates the layout
+% of how to apply the commands of this section.
+%\begin{Verbatim}[xleftmargin=\parindent,fontsize=\small,
+%commandchars={!()},codes={\catcode`\%=9}]
+%\examNum{1}
+%\numVersions{4}
+%\forVersion{a}
+%!%!textsf( initial seeds for each of the four versions of this document)
+%\vA{\useThisSeed{54356}}
+%\vB{\useThisSeed{577867}}
+%\vC{\useThisSeed{6746788}}
+%\vD{\useThisSeed{856785}}
+%
+%\uniqueXDBChoicesOn !%!textsf( Try to avoid duplicate questions in multi-version doc)
+%\InputUsedIDs !%!textsf( Input history of previous versions to current version)
+%\viewIDstrue !%!textsf( To view the IDs of problems used)
+%...
+%\useTheseDBs{db1,db2,db3,db4}
+%\end{Verbatim}
+% \changes{v1.3}{2021/01/14}{Added several commands and macro to continue to support
+% a DB application.}
+% If \cs{ifxDBUnique} is true and if \pkg{eqexam} is loaded, we
+% open \cs{wrtprobids} which is used to write the problem IDs of the problems
+% already chosen in earlier version of this source file. The name of this file
+% is \cs{jobname-ver\string\selVersion.cut}; eg, \texttt{mc-db-verA.cut},
+% \texttt{mc-db-verB.cut}, etc.
+% \begin{macrocode}
+\def\rt@OpenProbIds{\@ifpackageloaded{eqexam}
+ {\immediate\openout\wrtprobids\jobname-ver\selVersion.cut}{}}
+% \end{macrocode}
+% We open the file \cs{jobname-ver\cs{selVersion}.cut} when \cs{InputUsedIDs} is
+% expanded in the preamble.
+% \begin{macrocode}
+%\def\rt@ABD{\ifxDBUnique\expandafter\rt@OpenProbIds\fi}
+\def\rt@ABD{\@ifundefined{eq@nVersions}{}
+ {\ifnum\eq@nVersions>\@ne\expandafter\rt@OpenProbIds\fi}}
% \end{macrocode}
-% \section{Commands that support a DB application}
% We begin with some utility commands to help parse the argument of \cs{useProbDBs}.
% \begin{macrocode}
\def\rt@gettonil#1\@nil{\def\to@nilarg{#1}}
\def\rt@ifspc{\ifx\@let@token\@sptoken
\let\rt@next\rt@xifspc\else
- \let\rt@next\rt@gettonil\fi\rt@next}
+ \let\rt@next\rt@gettonil\fi\rt@next
+}
\begingroup
-\def\:{\rt@xifspc}
-\expandafter\gdef\: {\futurelet\@let@token\rt@ifspc}
+\def\:{\rt@xifspc}\expandafter
+\gdef\: {\futurelet\@let@token\rt@ifspc}
\endgroup
\def\rt@strpspcs{\futurelet\@let@token\rt@ifspc}
% \end{macrocode}
-% \begin{macro}{\useTheseDBs}\hskip-\marginparsep\thinspace|{|\ameta{list}|}|
+% \begin{macro}{\useTheseDBs}\hskip-\marginparsep\thinspace\texttt{\darg{\ameta{list}}}
% Inputs any files included in the comma-delimited list. The base names need only be listed,
% as the extension is assumed to be \texttt{.tex}. The command \cs{useProbDBs} can only be used
% in the preamble. Refer to the demo file \texttt{mc\_db.tex} for an illustration of its intended use.
@@ -662,10 +805,197 @@
\toks@=\expandafter{\rt@nextDB}%
\edef\rt@DB@List{\the\toks\tw@\space\the\toks@}\fi
}\expandafter\rt@DB@List\fi}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\useProbDBs}\hskip-\marginparsep\thinspace\texttt{\darg{\ameta{list}}} Is an alias of
+% \cs{useTheseDBs}.
+% \begin{macrocode}
\let\useProbDBs\useTheseDBs
% \end{macrocode}
% \end{macro}
+% \begin{macro}{\viewDB}\hskip-\marginparsep\thinspace\texttt{\darg{\ameta{name}}}
+% Typeset the entire contents of a DB Test file. The argument \ameta{name} is the name
+% of the DB Test file (as in |\bRTVToks{DB1}|, here \texttt{DB1} is the \ameta{name}.
+% The DB test files should be input using \cs{useProbDBs}.
+% \begin{macrocode}
+\def\viewDB#1{\useRTName{#1}\rt@nCnt\z@
+ \edef\nSTOP{\@nameuse{nMax4\rt@BaseName}}%
+ \loop\advance\rt@nCnt\@ne
+ \rtTokByNum{\the\rt@nCnt}%
+ \ifnum\rt@nCnt<\nSTOP\repeat
+}
+% \end{macrocode}
+% \end{macro}
+% The macro \DescribeMacro\getR@nIndx\cs{getR@nIndx} executes with each
+% entry of |\@nameuse{#1-List}|.
+% For an index value of \cs{Indx}, the macro goes through the
+% arguments to the \cs{Indx}'th argument and reads
+% the value of the argument at that point. It
+% returns the argument of the \cs{Indx}'th as \cs{ranIndx};
+% eg, if |\Indx=1|, then |\ranIndx=3|, for the above example.
+% \begin{macrocode}
+%% uses \@tempcnta and \Indx
+\def\getR@nIndx#1{\def\argi{#1}%
+ \ifx\argi\rt@STOP
+ % no match, something is wrong
+ \edef\ranIndex{-1}\else
+ \advance\@tempcnta\@ne
+ \ifnum\Indx=\@tempcnta
+ \def\ranIndx{#1}\fi
+ \fi
+}
+% \end{macrocode}
+% \DescribeMacro\xdb@unique\hskip-\marginparsep\texttt{\darg{\ameta{name}}}
+% An add-on command to \cs{useRanTok}. The command attempts
+% to create a unique choice of a problem over several versions of the same document. This may not
+% be possible if there are not enough choices to satisfy the number of declared versions.
+%
+% The \cs{xdb@unique} seems to work when the \pkg{eqexam} document has multiple parts (more then one
+% \env{exam} environments). The id files for the parts are all combined; ideally, for multiple part
+% exams, the second part draws form a set of DB test files different from the first part, as long as there are
+% enough problems to choose from.
+%
+% Note that, if there is not a unique choice for a question from the designated DB test file,
+% \cs{xdb@unique} reverts to the original choice so there may be duplicates across versions of the document.
+% \begin{macrocode}
+\def\rt@NoAltChoice#1#2{\PackageWarning{ran_toks}
+ {Cannot find an alternative to #1-#2,\MessageBreak
+ will use it but it may be a duplicate\MessageBreak
+ question}}
+\def\xdb@unique#1{\@tempcnta\z@
+ \def\rt@STOP{\relax}%
+% \end{macrocode}
+%We use the randomized list for the \ameta{name}
+%\begin{verbatim}
+% \@nameuse{#1-List} is the randomized list: eg,
+% \\{3}\\{2}\\{4}\\{5}\\{1}
+%\end{verbatim}
+% \begin{macrocode}
+ \let\\\relax\edef\x{\@nameuse{#1-List}}%
+ \toks@=\expandafter{\x}\let\\\getR@nIndx
+ \the\toks@\\\rt@STOP
+% \end{macrocode}
+% We take as the default choice the original choice
+% \begin{macrocode}
+ \xdef\rt@next{\noexpand
+ \@nameuse{rtRanTok\rt@orig@Indx#1}}%
+% \end{macrocode}
+% Begin to look at the results of |\the\toks@\\\rt@STOP|,
+% \begin{macrocode}
+ \ifnum\ranIndx>\m@ne
+% \end{macrocode}
+% If \cs{ranIndx} is -1, we use the original index.
+% \begin{macrocode}
+ \edef\rt@orig@ranIndx{\ranIndx}%
+ \expandafter
+ \ifx\csname#1-\ranIndx\endcsname\relax
+% \end{macrocode}
+% This question has not been chosen earlier, so we'll use it.
+% \begin{macrocode}
+ \xdef\rt@next{\noexpand
+ \@nameuse{rtRanTok\Indx#1}}%
+ \else
+% \end{macrocode}
+% The question has been chosen in an earlier version of the document.
+% Find the next higher unused one (cycle search).
+% \begin{macrocode}
+ \@tempcntb\z@
+ \rt@nCnt\rt@orig@Indx\relax
+% \end{macrocode}
+% As we move into the \cs{@whilenum} loop, we take as the default
+% the original index. The loop may overwrite the definition of
+% \cs{rt@next}.
+% \begin{macrocode}
+ \xdef\rt@next{\noexpand\rt@NoAltChoice{#1}{\rt@orig@Indx}\noexpand
+ \@nameuse{rtRanTok\rt@orig@Indx#1}}%
+ \@whilenum\@tempcntb<\@nameuse{nMax4#1}\do{%
+ \advance\@tempcntb\@ne
+ \advance\rt@nCnt\@ne
+% \end{macrocode}
+% If the count is at the \texttt{nMax4} value, we start over from
+% the beginning.
+% \begin{macrocode}
+ \ifnum\rt@nCnt>\@nameuse{nMax4#1}\rt@nCnt\@ne\fi
+% \end{macrocode}
+% We search through \cs{toks@} again, so we have the initialize
+% the dependent variables: \cs{Indx}, the index to search for; \cs{@tempcnta}
+% the counter that is used by \cs{getR@nIndx}; nothing has changed
+% |\let\\\getR@nIndx| should still be in effect.
% \begin{macrocode}
+ \edef\Indx{\the\rt@nCnt}\@tempcnta\z@
+ \the\toks@\\\rt@STOP
+% \end{macrocode}
+% If \cs{ranIndx} is -1, we use the original index.
+% \begin{macrocode}
+ \ifnum\ranIndx>\m@ne
+ \expandafter
+ \ifx\csname#1-\ranIndx\endcsname\relax
+ \pkgNotifType{ran_toks}{#1-\rt@orig@ranIndx\space
+ has already been used,\MessageBreak
+ will use #1-\ranIndx}%
+ % exit the \@whilenum loop
+ \@tempcntb\@nameuse{nMax4#1}%
+ \advance\@tempcntb\@ne
+ \fi
+ \fi
+ \xdef\rt@next{\noexpand\@nameuse{rtRanTok\Indx#1}}%
+ }% do
+ \ifnum\@tempcntb=\@nameuse{nMax4#1}\relax
+ \xdef\rt@next{\noexpand
+ \rt@NoAltChoice{#1}{\rt@orig@ranIndx}\noexpand
+ \@nameuse{rtRanTok\rt@orig@Indx#1}}%
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% Here is the operational definition of \DescribeMacro\uniqueXDBChoicesOn
+% \cs{uniqueXDBChoicesOn}; when executed in the preamble, an attempt is made
+% the select only problems that have not already been chosen in any prior
+% renditions of the same source file.
+% \begin{macrocode}
+\renewcommand{\uniqueXDBChoicesOn}{\xDBUniquetrue
+ \let\xdbunique\xdb@unique}
+% \end{macrocode}
+% \begin{macro}{\InputUsedIDs} Input the user ID (CUT) files. These are files
+% that document which questions were used for the various versions of the exam.
+% \begin{macrocode}
+\newif\ifrt@InputUsedIDs\rt@InputUsedIDsfalse
+\def\InputUsedIDs{\rt@InputUsedIDstrue
+ \bgroup
+ \setcounter{eq@count}{0}%
+ \let\rt@InputUsedIDs\@empty
+ \let\rt@InputUsedIDsFIs\@empty
+ \@whilenum \value{eq@count}<\eq@nVersions\relax\do
+ {%
+ \stepcounter{eq@count}%
+ \g@addto@macro\rt@InputUsedIDs{\if\selVersion}%
+ \g@addto@macro\rt@InputUsedIDsFIs{\fi}%
+ \edef\x{\Alph{eq@count}}%
+ \edef\y{\noexpand\g@addto@macro\noexpand
+ \rt@InputUsedIDs{\x\expandafter\noexpand
+ \csname else\endcsname\noexpand\rt@IIFE}}\y
+ \edef\x{{\x}}\expandafter
+ \g@addto@macro\expandafter\rt@InputUsedIDs\expandafter{\x}%
+ }% do
+ \expandafter\g@addto@macro\expandafter
+ \rt@InputUsedIDs\expandafter{\rt@InputUsedIDsFIs}%
+ \egroup
+ \rt@InputUsedIDs
+ \AtBeginDocument{\rt@ABD}%
+}
+\@onlypreamble\InputUsedIDs
+% \end{macrocode}
+% \end{macro}
+% A convenience command used by \cs{InputUsedIDs}.
+% \begin{macrocode}
+\def\rt@IIFE#1{\InputIfFileExists{\jobname-ver#1.cut}
+ {\PackageInfo{ran_toks}{Inputting \jobname-ver#1.cut}}
+ {\PackageInfo{ran_toks}{Cannot find \jobname-ver#1.cut}}}
+% \end{macrocode}
+% \begin{macrocode}
+%</dbapp>
+%<*package>
%</package>
% \end{macrocode}
% \Finale
diff --git a/Master/texmf-dist/source/latex/ran_toks/ran_toks.ins b/Master/texmf-dist/source/latex/ran_toks/ran_toks.ins
index 4d2d77d191a..1d84cf5ce61 100644
--- a/Master/texmf-dist/source/latex/ran_toks/ran_toks.ins
+++ b/Master/texmf-dist/source/latex/ran_toks/ran_toks.ins
@@ -46,6 +46,7 @@
{%
\file{ran_toks.sty}{\from{ran_toks.dtx}{copyright,package}}
\file{ran-toks.sty}{\from{ran_toks.dtx}{copyright,altpkgname}}
+ \file{rt-dbapp.def}{\from{ran_toks.dtx}{copyright,dbapp}}
}
\Msg{***************************************************************}
diff --git a/Master/texmf-dist/source/latex/realtranspose/realtranspose.dtx b/Master/texmf-dist/source/latex/realtranspose/realtranspose.dtx
new file mode 100644
index 00000000000..473b75490dc
--- /dev/null
+++ b/Master/texmf-dist/source/latex/realtranspose/realtranspose.dtx
@@ -0,0 +1,52 @@
+%\iffalse meta-comment
+%Copyright 2020 Lars Quentin, Matthew Scroggs, Adam Townsend
+%
+%Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+%and associated documentation files (the "Software"), to deal in the Software without restriction,
+%including without limitation the rights to use, copy, modify, merge, publish, distribute,
+%sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+%furnished to do so, subject to the following conditions:
+%
+%The above copyright notice and this permission notice shall be included in all copies or
+%substantial portions of the Software.
+%
+%THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+%BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+%NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+%DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+%OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+%\fi
+
+%\iffalse
+%<*realtranspose>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{realtranspose}[2020/10/08 realtranspose 1.1]
+\RequirePackage{graphicx}
+
+\newcommand{\realtranspose}[1]{
+ % The problem is, that within mathbin it always gets
+ % rendered as textstyle.
+ %
+ % To bypass that, we detect which style was used before
+ %
+ % This way, we can do fun stuff like
+ %
+ % \int_0^T dt = \realtranspose{ \int_0 } dt
+ %
+ \mathchoice{
+ % displaystyle
+ \mathbin{\rotatebox[origin=c]{90}{$\displaystyle #1$}}
+ }{
+ % textstyle
+ \mathbin{\rotatebox[origin=c]{90}{$\textstyle #1$}}
+ }{
+ % scriptstyle
+ \mathbin{\rotatebox[origin=c]{90}{$\scriptstyle #1$}}
+ }{
+ %scriptscriptstyle
+ \mathbin{\rotatebox[origin=c]{90}{$\scriptscriptstyle #1$}}
+ }
+}
+
+%</realtranspose>
+%\fi
diff --git a/Master/texmf-dist/source/latex/realtranspose/realtranspose.ins b/Master/texmf-dist/source/latex/realtranspose/realtranspose.ins
new file mode 100644
index 00000000000..7aa5d39bf9e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/realtranspose/realtranspose.ins
@@ -0,0 +1,28 @@
+\input docstrip
+\keepsilent
+% Tells where it has to be installed, not the path of the source
+% (if a docstrip.cfg is provided)
+\usedir{tex/latex/realtranspose}
+\preamble
+Copyright 2020 Lars Quentin, Matthew Scroggs, Adam Townsend
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+and associated documentation files (the "Software"), to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge, publish, distribute,
+sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\endpreamble
+\askforoverwritefalse
+\generate{
+ \file{realtranspose.sty}{\from{realtranspose.dtx}{realtranspose}}
+}
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/regexpatch/regexpatch.dtx b/Master/texmf-dist/source/latex/regexpatch/regexpatch.dtx
index e7d5dabf6b2..deaadd12559 100644
--- a/Master/texmf-dist/source/latex/regexpatch/regexpatch.dtx
+++ b/Master/texmf-dist/source/latex/regexpatch/regexpatch.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: regexpatch.dtx (C) Copyright 2012-2016 Enrico Gregorio
+%% File: regexpatch.dtx (C) Copyright 2012-2020 Enrico Gregorio
%%
%% It may be distributed and/or modified under the conditions of the
%% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -25,7 +25,7 @@
\newcommand{\sv}{[\texttt{*}]}
%</driver>
%<*driver|package>
-\GetIdInfo$Id: regexpatch.dtx 0.2d 2018-05-02 12:00:00Z Enrico $
+\GetIdInfo$Id: regexpatch.dtx 0.2e 2020-10-06 12:00:00Z Enrico $
{Extending etoolbox patching commands}
%</driver|package>
%<*driver>
@@ -55,6 +55,7 @@
%
% \maketitle
%
+% \changes{v0.2e}{2020/10/06}{Replaced deprecated commands}
% \changes{v0.2d}{2018/05/02}{Fixed silly typo}
% \changes{v0.2c}{2018/03/31}{Removed loading of \texttt{l3regex}}
% \changes{v0.2b}{2016/05/15}{Fix for removed function}
@@ -701,7 +702,7 @@
% A variant for checking a regex match so that we can give the second
% argument as a token list.
% \begin{macrocode}
-\cs_generate_variant:Nn \regex_match:nnT {nV}
+\prg_generate_conditional_variant:Nnn \regex_match:nn {nV} { T,F,TF }
% \end{macrocode}
%
% \subsection{Functions}
@@ -757,8 +758,8 @@
{
\bool_set_false:N \l_xpatch_protect_bool
\bool_set_false:N \l_xpatch_optional_bool
- \tl_set:Nx \l_xpatch_name_tl { \cs_to_str:N #1 }
- \tl_set:Nx \l_xpatch_repl_tl { \token_get_replacement_spec:N #1 }
+ \tl_set:Nf \l_xpatch_name_tl { \cs_to_str:N #1 }
+ \tl_set:Nf \l_xpatch_repl_tl { \token_get_replacement_spec:N #1 }
\tl_clear:N \l_xpatch_type_tl
\regex_match:nVT % \DeclareRobustCommand<control word>
{^\\protect\ \\\u{l_xpatch_name_tl}\ \ }
@@ -802,7 +803,7 @@
}
\bool_if:NT \l_xpatch_protect_bool
{
- \tl_set:Nx \l_xpatch_repl_tl
+ \tl_set:Nf \l_xpatch_repl_tl
{ \exp_after:wN \token_get_replacement_spec:N
\cs:w \l_xpatch_name_tl \cs_end: }
\regex_match:nVT % \DeclareRobustCommand<any cs> with opt arg
@@ -842,9 +843,9 @@
\exp_after:wN #1 \cs:w \l_xpatch_name_tl \cs_end: {#3}{#4}{#5}{#6}
}
{
- \msg_term:n
+ \iow_term:x
{
- xpatch~message \\
+ xpatch~message: ^^J
`\token_to_str:N #2'~is~undefined;~
I'll~ignore~the~request.
}
@@ -1054,7 +1055,7 @@
{
\bool_if:NT \l_xpatch_tracing_bool
{
- \msg_term:n { xpatch~message \\ #1 }
+ \iow_term:x { xpatch~message ^^J ~ #1 }
}
}
\cs_new:Npn \xpatch_message_cstype:N #1
@@ -1651,7 +1652,7 @@
% Gather the prefix (it is |\protected| when |#1| has been defined
% with |\newrobustcmd|).
% \begin{macrocode}
- \tl_set:Nf \l_xpatch_prefix_tl { \token_get_prefix_spec:N #1 }
+ \tl_set:Nx \l_xpatch_prefix_tl { \token_get_prefix_spec:N #1 }
\tl_clear:N \l_xpatch_prefix_tl
\tl_set_rescan:Nnx \l_xpatch_prefix_tl { } \l_xpatch_prefix_tl
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/regexpatch/regexpatch.ins b/Master/texmf-dist/source/latex/regexpatch/regexpatch.ins
index 93fd3aeb50d..ba88d86942c 100644
--- a/Master/texmf-dist/source/latex/regexpatch/regexpatch.ins
+++ b/Master/texmf-dist/source/latex/regexpatch/regexpatch.ins
@@ -1,6 +1,6 @@
\iffalse meta-comment
-File regexpatch.ins Copyright (C) 2012-2018 Enrico Gregorio
+File regexpatch.ins Copyright (C) 2012-2020 Enrico Gregorio
It may be distributed and/or modified under the conditions of the
LaTeX Project Public License (LPPL), either version 1.3c of this
diff --git a/Master/texmf-dist/source/latex/reledmac/reledmac.dtx b/Master/texmf-dist/source/latex/reledmac/reledmac.dtx
index 2634484f6a6..af00ef41de0 100644
--- a/Master/texmf-dist/source/latex/reledmac/reledmac.dtx
+++ b/Master/texmf-dist/source/latex/reledmac/reledmac.dtx
@@ -139,7 +139,7 @@
%
% \newcommand{\dtxfilename}{\texttt{reledmac.dtx}}
% \GetFileInfo{reledmac.sty}
-% ^^A To put the changes in the right order : see http://tex.stackexchange.com/a/74113/7712
+% ^^A To put the changes in the right order: see http://tex.stackexchange.com/a/74113/7712
%\makeatletter
% \let\org@changes@\changes@
% \def\my@changes v#1.#2.#3\@nil{%
@@ -221,7 +221,7 @@
% \changes{v0.12.0}{2011/10/01}{Possibility to number the pstart with the commands \protect\cs{numberpstarttrue}.}
% \changes{v0.12.0}{2011/10/01}{For compatibility with eledpar, possibility to use \protect\cs{autopar} on the right side.}
% \changes{v0.12.1}{2011/10/02}{The numbering of \protect\cs{pstarts} restarts on each \protect\cs{beginnumbering}.}
-% \changes{v0.12.1}{2011/10/02}{Don't number \protect\cs{pstarts} of stanza.}
+% \changes{v0.12.1}{2011/10/02}{Do not number \protect\cs{pstarts} of stanza.}
% \changes{v0.13.0}{2011/11/08}{New stanzaindentsrepetition counter: to repeat stanza indents every \emph{n} verses.}
% \changes{v0.13.1}{2011/11/18}{\protect\cs{thepstartL} and \protect\cs{thepstartR} use now \protect\cs{bfseries} and not \protect\cs{bf}, which is deprecated and makes conflicts with memoir class.}
% \changes{v0.14.0}{2012/04/04}{Tweaked \protect\cs{edlabel} to get correct line number if the command is first element of a paragraph.}
@@ -238,7 +238,7 @@
% \changes{v1.4.0}{2012/11/16}{Compatibility with LuaTeX of RTL notes.}
% \changes{v1.8.0}{2013/12/13}{Compatibility with parledgroup option of eledpar package.}
% \changes{v1.8.2}{2014/01/31}{Debug compatibility problem with hebrew option of babel package.}
-% \changes{v1.8.3}{2014/02/03}{Fixes spurious spaces added by v1.7.0.}
+% \changes{v1.8.3}{2014/02/03}{Fix spurious spaces added by v1.7.0.}
% \changes{v1.10.0}{2014/02/27}{Add \protect\cs{pstartref} and \protect\cs{xpstartref} to refer to a pstart number (extension of \protect\cs{edlabel}).}
% \changes{v1.10.1}{2014/02/28}{Compatibility with \textsf{cleveref}.}
% \changes{v1.10.2}{2014/03/17}{Compatibility of stanza with v1.8a of babel-greek.}
@@ -302,8 +302,8 @@
% \changes{v1.23.1}{2015/05/20}{Fix a bug with \protect\cs{lemma} command in the right side.}
% \changes{v1.23.2}{2015/05/29}{Compatibility with \LaTeX's release 2015.}
% \changes{v1.24.0}{2015/06/02}{We can reinitialize \protect\cs{AtEveryPstart} and \protect\cs{AtEveryPend} providing to it an empty argument.}
-% \changes{v1.24.1}{2015/06/21}{\protect\cs{lemma} is disabled when using `nocritical` option.}
-% \changes{v1.24.2}{2015/06/26}{Fix incompatibility between `nofamiliar` option and `memoir` package.}
+% \changes{v1.24.1}{2015/06/21}{\protect\cs{lemma} is disabled when using \protect\option{nocritical} option.}
+% \changes{v1.24.2}{2015/06/26}{Fix incompatibility between \protect\option{nofamiliar} option and \protect\package{memoir} package.}
% \changes{v1.24.3}{2015/07/07}{Restore marginal numbers and notes with sectioning command (bug introduced in v1.21.0)}
% \changes{v1.24.4}{2015/07/19}{Fix spurious space with \protect\cs{edindex} when using xindy+hyperref option.}
% \changes{v1.24.5}{2015/07/16}{Fix a bug of indent, when a added in 1.1.0, when a \protect\cs{beginnumbering} immediately follow a sectioning command.}
@@ -360,7 +360,7 @@
% \changes{v2.5.0}{2015/11/13}{\protect\cs{apprefwithpage} and \protect\cs{appref} print double quotation mark when the label was not defined.}
% \changes{v2.5.0}{2015/11/13}{\protect\cs{apprefwithpage} and \protect\cs{appref} work with right side crossref.}
% \changes{v2.5.0}{2015/11/13}{\protect\cs{edlabel} works now in \protect\cs{Xfootnote}.}
-% \changes{v2.5.0}{2015/11/13}{Log now states `There were undefined references` when using wrong references in \protect\cs{edlineref} or \protect{edpageref}.}
+% \changes{v2.5.0}{2015/11/13}{Log now states \protect\enquote{There were undefined references} when using wrong references in \protect\cs{edlineref} or \protect{edpageref}.}
% \changes{v2.5.0}{2015/11/13}{Fix spurious vertical space in \protect\env{astanza} environment (\reledpar)}
% \changes{v2.6.0}{2015/11/20}{Adds compatibility with \protect\option{innnote} and \protect\option{notenumber} options of \protect\package{indextools} package.}
% \changes{v2.6.0}{2015/11/20}{Fix a bug with footnote counter in \protect\env{ledgroup} (added in v2.5.0).}
@@ -392,13 +392,13 @@
% \changes{v2.9.0}{2016/03/23}{Write correct metadata in numbered files when using \protect\cs{pausenumbering}\protect\ldots\protect\cs{resumenumbering}.}
% \changes{v2.9.0}{2016/03/23}{Fix a bug with three- and two-column footnote setting (added in v.2.4.0).}
% \changes{v2.9.0}{2016/03/23}{Fix spurious space inside three-column familiar footnote.}
-% \changes{v2.9.1}{2016/04/09}{Fix a bug when notes start with ``plus'' or ``minus''.}
-% \changes{v2.9.2}{2016/04/30}{Fix a bug with \protect\package{hyperref} package when a lemma starts with ``plus'' or ``minus'' (bug introduced in v.~2.7.0).}
+% \changes{v2.9.1}{2016/04/09}{Fix a bug when notes start with \protect\option{plus} or \protect\option{minus}.}
+% \changes{v2.9.2}{2016/04/30}{Fix a bug with \protect\package{hyperref} package when a lemma starts with \protect\option{plus} or \protect\enquote{minus} (bug introduced in v.~2.7.0).}
% \changes{v2.9.3}{2016/05/02}{Fix a bug with line number position and reset added by v.~2.9.0}
% \changes{v2.10.0}{2016/05/08}{Add \protect\cs{AtEveryStanza} and \protect\cs{AtEveryStopStanza}.}
% \changes{v2.10.0}{2016/05/08}{More specific error messages.}
% \changes{v2.10.0}{2016/05/08}{Fix a bug in \protect\cs{ledlsnotefontsetup} and \protect\cs{ledrsnotefontsetup} which could not handle \protect\cs{color} command properly.}
-% \changes{v2.10.1}{2016/05/18}{Add `nopenalties` option.}
+% \changes{v2.10.1}{2016/05/18}{Add \protect\option{nopenalties} option.}
% \changes{v2.10.1}{2016/05/18}{Fix a bug introduced in v.~1.4: not paragraphed critical footnotes could prevent marginal line number from being displayed}
% \changes{v2.11.0}{2016/06/02}{Prevent \protect\cs{Xtxtbeforenotes} hook from causing notes to go beyond the bottom margin}
% \changes{v2.11.0}{2016/06/02}{Make \protect\cs{parafootsepX} work}
@@ -423,7 +423,7 @@
% \changes{v2.14.0}{2016/07/01}{Some internal changes for new features of \protect\reledpar.}
% \changes{v2.14.1}{2016/07/04}{Fix a bug when using \protect\cs{footnoteX} in the first argument of \protect\cs{edtext}.}
% \changes{v2.14.1a}{2016/07/14}{Fix problematic typos in the handbook.}
-% \changes{v2.15.0}{2016/07/22}{Add `byline` arrangement.}
+% \changes{v2.15.0}{2016/07/22}{Add \enquote{byline} arrangement.}
% \changes{v2.15.0}{2016/07/22}{Fix \protect\cs{Xtxtbeforenotes} in ledgroup.}
% \changes{v2.15.1}{2016/09/07}{Fix \protect\cs{edindex} in tabular environments.}
% \changes{v2.15.2}{2016/09/12}{Fix a bug with \protect\package{fancyhdr} package 3.8 and later.}
@@ -435,7 +435,7 @@
% \changes{v2.16.0}{2016/10/02}{Compatibility with new features of \protect\reledpar}
% \changes{v2.16.0}{2016/10/02}{Fix a bug with \protect\cs{Xtxtbeforenotes} for notes in three or two columns}
% \changes{v2.16.0}{2016/10/02}{Fix a bug with \protect\cs{Xgroupbylines} for notes in two columns}
-% \changes{v2.16.0}{2016/10/02}{Fix a bug with `notenumber' option of \protect\package{indextools} package when indexing texts in familiar footnotes.}
+% \changes{v2.16.0}{2016/10/02}{Fix a bug with \protect\option{notenumber} option of \protect\package{indextools} package when indexing texts in familiar footnotes.}
% \changes{v2.16.0}{2016/10/02}{When indexing texts in familiar footnotes with \protect\cs{edtext}, refer to the line number where the footnote is called.}
% \changes{v2.16.0}{2016/10/02}{When indexing texts in sidenotes with \protect\cs{edtext}, refer to the line number where the sidenote is called.}
% \changes{v2.16.0}{2016/10/02}{Fix potential bug when using \protect\cs{edindex} in critical footnotes.}
@@ -518,7 +518,7 @@
% \changes{v2.27.1}{2018/10/12}{Fix spurious space in \protect\cs{hidenumbering}.}
% \changes{v2.28.0}{2018/11/30}{Familiar footnotes can take an optional argument to manually define the footnote mark.}
% \changes{v2.28.1}{2018/12/22}{Fix bug with the alignment of the columns of two and three columns critical footnotes.}
-% \changes{v2.29.0}{2019/01/08}{Fix bug with \protect\cs{linenumannotation} and `nofamiliar` option.}
+% \changes{v2.29.0}{2019/01/08}{Fix bug with \protect\cs{linenumannotation} and \protect\option{nofamiliar} option.}
% \changes{v2.29.0}{2019/01/08}{Really reset line number annotation at each line}
% \changes{v2.29.0}{2019/01/08}{Add \protect\option{noresetlinenumannotation}}
% \changes{v2.29.0}{2019/01/08}{Fix little bug with \protect\cs{msdata}}
@@ -532,13 +532,13 @@
% \changes{v2.31.1}{2019/03/03}{Fix bug in vertical spacing with \protect\cs{Xgroupbyline}.}
% \changes{v2.31.1}{2019/03/03}{Fix bug with indentation with \protect\cs{Xgroupbyline}.}
% \changes{v2.31.1}{2019/03/03}{Fix bug with \protect\cs{Xhangindent} and \protect\cs{hangindentX} for right-to-left texts.}
-% \changes{v2.31.2}{2019/04/03}{Fix bug with familiar footnote containing not default font (introduced with v.~2.20.0).}
+% \changes{v2.31.2}{2019/04/03}{Fix bug with familiar footnote containing non-default font (introduced with v.~2.20.0).}
% \changes{v2.31.3}{2019/06/19}{Fix bug with paragraphed footnote in RTL context.}
% \changes{v2.32.0}{2019/07/15}{Add \protect\cs{Xlinenumannotationonlyfirst}, \protect\cs{Xlinenumannotationonlyfirstintwo}, \protect\cs{Xsymlinenumannotation}, \protect\cs{Xendlinenumannotationonlyfirst}, \protect\cs{Xendlinenumannotationonlyfirstintwo} and \protect\cs{Xendsymlinenumannotation}.}
% \changes{v2.32.1}{2019/07/21}{Do not print \protect\cs{Xendsep} if we print \protect\cs{Xendsymlinenum}.}
% \changes{v2.32.1}{2019/07/21}{When using \protect\cs{parindentX} or \protect\cs{Xparindent} and stanza, use the normal indentation in the footnote, not the verse indentation.}
% \changes{v2.32.2}{2019/11/28}{Fix spurious vertical space in familiar footnotes with \protect\LuaLaTeX.}
-% \changes{v2.32.3}{2019/12/09}{Fix bug with critical footnotes when typesetting arabic text with \protect\package{polyglossia}.}
+% \changes{v2.32.3}{2019/12/09}{Fix bug with critical footnotes when typesetting Arabic text with \protect\package{polyglossia}.}
% \changes{v2.32.4}{2020/02/04}{Fix bug \protect\cs{footnoteXmark} and \protect\cs{footnoteXtext}.}
% \changes{v2.32.4}{2020/01/04}{\protect\cs{footnoteXmark} and \protect\cs{footnoteXtext} can now have an optional argument, setting the footnote number.}
% \changes{v2.32.4}{2020/02/04}{Fix bug when using \protect\cs{Xgroupbyline} and twocol arrangement.}
@@ -546,6 +546,34 @@
% \changes{v2.32.5}{2020/03/08}{Fix bug with \protect\cs{edindex} inside \protect\cs{eledsection} and related.}
% \changes{v2.32.5}{2020/03/08}{Fix bug with page number in index with \protect\cs{edindex} when indexing a critical notes.}
% \changes{v2.32.5}{2020/03/08}{Fix bug with macro inside \protect\cs{sameword} with no-\protect\XeTeX\ engines.}
+% \changes{v2.32.6}{2020/04/19}{Fix bug with glossary entries inside the first argument of \protect\cs{edtext}.}
+% \changes{v2.32.6}{2020/04/19}{Add hyperref link when inserting glossary entries.}
+% \changes{v2.32.7}{2020/05/03}{Fix bug with \protect\cs{parafootsepX}.}
+% \changes{v2.32.7}{2020/05/03}{Fix bug with \protect\cs{lineation}\arg{pstart} and \protect\cs{edtext} in the very first line of a \protect\cs{pstart}.}
+% \changes{v2.32.7}{2020/05/03}{Fix spurious spaces at the very first line of \protect\env{edtabular} environnments.}
+% \changes{v2.32.8}{2020/05/24}{Add subline number in manuscript apparatus.}
+% \changes{v2.33.0}{2020/05/31}{Add startstanzaindentsrepetition feature.}
+% \changes{v2.33.0}{2020/05/31}{Add antilabe feature.}
+% \changes{v2.33.0}{2020/05/31}{Add \protect\cs{Xinnotemark} and \protect\cs{innotemarkX} hooks.}
+% \changes{v2.33.1}{2020/06/06}{Fix a spacing bug when the argument of \protect\cs{antilabe} contains more than one word.}
+% \changes{v2.34.0}{2020/06/24}{Add \protect\cs{Xpstartonlyfirst} and \protect\cs{Xstanzaonlyfirst}.}
+% \changes{v2.34.0}{2020/06/24}{Add \protect\cs{Xpstartseparator}.}
+% \changes{v2.34.1}{2020/06/30}{Fix bug with page number when using stanazindentsrepetition, bug introduced in v2.33.0.}
+% \changes{v2.34.2}{2020/07/06}{Fix bug with tabular environment, in some specific use case, added in v2.32.7.}
+% \changes{v2.34.3}{2020/08/19}{Fix bug with \protect\cs{parafootsepX} when the footnotes are called outside of a numbered section.}
+% \changes{v2.34.3}{2020/08/19}{Fix incompatibility between lineation by \protect\cs{pstart} and (a)stanza.}
+% \changes{v2.34.3}{2020/08/19}{Make commands like \protect\cs{hidenumbering} working at the very beginning of a verse when the first argument of \protect\cs{setstanzaindents} is equal to 0.}
+% \changes{v2.34.4}{2020/09/16}{Fix some bugs with lineation by page, when a numbered section starts at the very beginning of page.}
+% \changes{v2.34.4}{2020/09/16}{Fix bugs with \protect\cs{parafootsepX} outside of numbered section.}
+% \changes{v2.34.5}{2020/09/23}{Fix incompatibility between \protect\cs{apprefwithpage} / \protect\cs{SErefwithpage} and line number annotation mechanism.}
+% \changes{v2.34.6}{2020/09/23}{Fix incompatibility with \protect\package{calc} package (added with v2.34.4).}
+% \changes{v2.34.7}{2020/11/19}{Fix bug with \protect\cs{parafootsepX} in some circumstances (added with v2.34.4).}
+% \changes{v2.35.0}{2020/11/29}{Add \protect\cs{linenumannotationothersidetrue}.}
+% \changes{v2.35.0}{2020/11/29}{Add new hooks: \protect\cs{Xnolinenumber}, \protect\cs{Xendnolinenumber}, \protect\cs{Xnolinenumberifannotation}, \protect\cs{Xendnolinenumberifannotation}.}
+% \changes{v2.35.1}{2020/12/20}{Fix a bug when printing ending page number in endnotes and using the \protect\package{hyperref} package.}
+% \changes{v2.36.0}{2021/01/21}{Fix bug with sublineation on right side of parallel typesetting.}
+% \changes{v2.36.0}{2021/01/21}{Add \protect\cs{Xnonote} and \protect\cs{nonoteX}.}
+% \changes{v2.36.0}{2021/02/14}{Fix bug with crossreferecing in parallel typesetting (added in v2.34.4)}
% Typeset scholarly editions with \LaTeX\thanks{This file (\dtxfilename)
% has version number \fileversion, last revised \filedate.}}
%
@@ -574,10 +602,10 @@
%
%
% \Macpackage provides many tools and options. Normally, they are all documented in this file.
-% Also provided is a help folder, ``\href{examples/.}{examples}''. The folder contains additional examples (although not for every possible case).
-% Examples starting with ``1-'' are for basic uses, those starting with ``2-'' are for advanced uses.
+% Also provided is a help folder, \enquote{\href{examples/.}{examples}}. The folder contains additional examples (although not for every possible case).
+% Examples starting with \enquote{1-} are for basic uses, those starting with \enquote{2-} are for advanced uses.
%
-% To report bugs or request a new feature, please go to ledmac GitHub page and click on ``New Issue'': \url{https://github.com/maieul/ledmac/issues/}.
+% To report bugs or request a new feature, please go to ledmac GitHub page and click on \enquote{New Issue}: \url{https://github.com/maieul/ledmac/issues/}.
% You must create an account on github.com to access my page (maieul/ledmac).
% GitHub accounts are free for open-source users. You can post messages in English or in French (preferred).
%
@@ -614,7 +642,7 @@
% of information.
%
% Apart from \macpackage there are other \LaTeX\ packages for typesetting critical editions.
-% However, the aim of \macpackage is to provide an ``all in one'' and flexible tool in the field of critical editions.
+% However, the aim of \macpackage is to provide an \enquote{all in one} and flexible tool in the field of critical editions.
%
% Any suggestions for new features are welcome.
%
@@ -662,8 +690,8 @@
% the macros was used to format the Sanskrit text in volume I of {\em
% Metarules of P\=a\d ninian Grammar\/} by Dominik Wujastyk (Groningen:
% Forsten, 1993).} A description by John and Dominik of this version of
-% \edmac{} was published as `An overview of \edmac: a \PlainTeX\
-% format for critical editions', \emph{TUGboat} \textit{11} (1990),
+% \edmac{} was published as \enquote{An overview of \edmac: a \PlainTeX\
+% format for critical editions}, \emph{TUGboat} \textit{11} (1990),
% pp.\,623--643.
%
% From 1991 through 1994, the macros continued to evolve, and were tested at a
@@ -678,8 +706,8 @@
% Sullivan,\index{Sullivan, Wayne} in particular, provided several
% important fixes and contributions, including adapting the
% Mittelbach\slash
-% Sch\"opf\index{Sch\"opf, Rainer}\index{Mittelbach, Frank} `New
-% Font Selection Scheme' for use with \PlainTeX\ and \edmac.
+% Sch\"opf\index{Sch\"opf, Rainer}\index{Mittelbach, Frank} \enquote{New
+% Font Selection Scheme} for use with \PlainTeX\ and \edmac.
% Another project Wayne has worked
% on is a \verb"DVI" post-processor which works with an \edmac{}
% that has been slightly modified to output \protect\cs{special}s. This
@@ -706,11 +734,11 @@
% Brey\index{Brey, Gerhard} {\em et al.}, at the same Institute.} a Latin
% translation of part II of the Arabic {\em Algebra\/} by Ab\=u K\=amil
% Shuj\=a' b.~Aslam,\index{Abu Kamil Shuja' b.~Aslam}\footnote{Richard
-% Lorch, `Ab\=u K\=amil on the Pentagon and Decagon' in {\em Vestigia
+% Lorch, \enquote{Ab\=u K\=amil on the Pentagon and Decagon} in {\em Vestigia
% Mathematica}, ed.\ M. Folkerts and J. P. Hogendijk (Amsterdam, Atlanta:
% Rodopi, 1993).} the Latin {\em Rithmachia\/} of Werinher von
-% Tegernsee,\footnote{Menso Folkerts, `Die {\em Rithmachia\/} des Werinher
-% von Tegernsee', ibid.} a middle-Dutch romance epic on the
+% Tegernsee,\footnote{Menso Folkerts, \enquote{Die {\em Rithmachia\/} des Werinher
+% von Tegernsee}, ibid.} a middle-Dutch romance epic on the
% Crusades,\footnote{Geert H. M. Claassens,\index{Claassens, Geert H. M.}
% {\em De Middelnederlandse Kruisvaartromans}, (Amsterdam: Schiphower en
% Brinkman, 1993).} a seventeenth-century Hungarian politico-philosophical
@@ -766,7 +794,7 @@
%
% \eledmac has facilitated the creation of customized critical editions.
% However, the changes made to allow such customization were made in a non-systematic way.
-% Many deprecated commands were kept and many technical `debts' were accumulated,
+% Many deprecated commands were kept and many technical \enquote{debts} were accumulated,
% hindering the future evolution of the package.
%
% For these reasons, Maïeul Rouquette decided on a spring cleaning of the code.
@@ -781,6 +809,8 @@
% Please add your own edition made with (r)(e)ledmac.
%
% If you write a book or an article about (r)(e)ledmac, please add it on the collaborative bibliography on \url{https://www.zotero.org/groups/1024519/}.
+% \subsection{Acknowledgements}
+% Maïeul Rouquette may thank his predecessor, and all the \macpackage\ communauty. Especially, he may thanks all the people who checks English spell and grammar for the handbook.
% \section{How the package works --- the problem of the number of \LaTeX\ runs}\label{howto}
% The \macpackage package is a three-pass package like \LaTeX\ itself.
% Although your textual apparatus and line
@@ -804,7 +834,7 @@
%
%Please read \reff{Xmaxhnotes}.
%
-% If you use \LuaTeX\ engine, you need \LuaTeX\ 1.1.0 or later.
+% If you use the \LuaTeX\ engine, you need \LuaTeX\ 1.1.0 or later.
% A file may mix \emph{numbered} and \emph{unnumbered} text.
%
% Numbered text is printed with marginal line numbers and can include
@@ -834,14 +864,15 @@
% \item \TeX\ is not able to create folder. You should create it yourself.
% \item The option does not change the default \LaTeX auxiliary files (.aux, .toc, \ldots).
% \end{enumerate}
-% \item[eledmac-compat] help to migrate from \eledmac to \reledmac (see \reff{eledmac-compat}).
-% \item[nopenalties] must be called in some cases when using paragraphed endnotes (\reff{nopenalties)}
-% \item[nopbinverse] prevents page break within verse environment.
-% \item[noquotation] by default, the quotation environment is redefined within numbered text. You can disable this redefinition with \verb|noquotation| (see \reff{noquotation}).
-% \item[noresetlinenumannotation] Does not reset the annotations to line number at each line. See \reff{annotation}.
-% \item[parapparatus] by default, the apparatus cannot contain paragraph breaks; this option enables paragraphing inside the apparatus.
-% \item[swcaseinsensitive] make \cs{sameword} command case insensitive.
-% \item[widthliketwocolumns] set the width of the text printed in a single column to be the same as the width of the text printed in two parallel columns with \parpackage. This is useful when alternating between normal and parallel typesetting.
+% \item[antilabe] enable \cs{antilabe} feature (see \reff{antilabe});
+% \item[eledmac-compat] help to migrate from \eledmac to \reledmac (see \reff{eledmac-compat});
+% \item[nopenalties] must be called in some cases when using paragraphed endnotes (see \reff{nopenalties)};
+% \item[nopbinverse] prevents page break within verse environment;
+% \item[noquotation] by default, the quotation environment is redefined within numbered text. You can disable this redefinition with \verb|noquotation| (see \reff{noquotation});
+% \item[noresetlinenumannotation] does not reset the annotations to line number at each line (see \reff{annotation});
+% \item[parapparatus] by default, the apparatus cannot contain paragraph breaks; this option enables paragraphing inside the apparatus;
+% \item[swcaseinsensitive] make \cs{sameword} command case insensitive;
+% \item[widthliketwocolumns] set the width of the text printed in a single column to be the same as the width of the text printed in two parallel columns with \parpackage. This is useful when alternating between normal and parallel typesetting;
% \item[xindy] and \verb|xindy+hyperref| select \verb+xindy+ as the index processor (\reff{xindy}).
% \end{description}
%
@@ -968,8 +999,8 @@
% before the new group is opened,
% using \protect\cs{indent}, \protect\cs{noindent}, or \protect\cs{leavevmode}, or using
% \protect\cs{pstart} itself.\footnote{For a detailed study of the
-% reasons for this restriction, see Barbara Beeton, `Initiation
-% rites', \textit{TUGboat} \textbf{12} (1991),
+% reasons for this restriction, see Barbara Beeton, \enquote{Initiation
+% rites}, \textit{TUGboat} \textbf{12} (1991),
% pp.\,257--258.\protect\index{Beeton, Barbara Ann Neuhaus Friend}}
%
% \subsubsection{Content before specific \protect\cs{pstart} and after specific \protect\cs{pend}}\label{pstart:optionalarg}
@@ -1100,7 +1131,7 @@
% \end{itemize}
% \item It must not be used if:
% \begin{itemize}
-% \item You just not want to have the line number in the margins, but want to use critical footnote. In this case, set \cs{firstlinenum} to a big value, such as 100,000 (\reff{firstlinenum}).
+% \item You do not want to have the line number in the margins, but do want to use critical footnotes. In this case, set \cs{firstlinenum} to a big value, such as 100,000 (\reff{firstlinenum}).
% \item You want to freeze the line numbering for some line, but still keep critical footnotes. In this case, use \cs{startlock} (\reff{startlock}).
% \end{itemize}
% \end{itemize}
@@ -1108,7 +1139,7 @@
% \subsubsection{Setting lineation start and step}
% \DescribeMacro{\firstlinenum}\label{firstlinenum}
% \DescribeMacro{\linenumincrement}
-% By default, \macpackage numbers every 5th line. There are two counters that control this behaviour:
+% By default, \macpackage numbers every 5th line. There are two counters that control this behavior:
% \verb?firstlinenum? and \verb?linenumincrement?. They can be changed using \protect\cs{firstlinenum}\marg{num} and
% \protect\cs{linenumincrement}\marg{num}. \protect\cs{firstlinenum} specifies the first
% line that will have a printed number, and \protect\cs{linenumincrement} is
@@ -1206,8 +1237,8 @@
% or sub-line depending on what it started out as, even if it
% changes in the middle.
%
-% \DescribeMacro{Xsublinesep}
-% \DescribeMacro{Xsublinesepside}
+% \DescribeMacro{\Xsublinesep}
+% \DescribeMacro{\Xsublinesepside}
% You can change the separator between the line number and the subline number either by using \cs{Xsublinesep} without any optional argument (\reff{Xsublinesep}) or by using \cs{Xsublinesepside}. In the second case, it will change the separator only for line numbers in the margins, not in the footnotes.
% \subsubsection{Locking lineation}\label{startlock}
% \DescribeMacro{\startlock}
@@ -1268,7 +1299,7 @@
% \item[\texttt{Roman}] Uppercase Roman numerals (I, II, \ldots)
% \item[\texttt{roman}] Lowercase Roman numerals (i, ii, \ldots)
% \end{description}
-% Note that with the \texttt{Alph} or \texttt{alph} styles, `numbers'
+% Note that with the \texttt{Alph} or \texttt{alph} styles, \enquote{numbers}
% must be between 1 and 26 inclusive.
%
% Similarly \protect\cs{sublinenumberstyle}\marg{style} can be used to change
@@ -1289,7 +1320,7 @@
%
% \DescribeMacro{\hidenumberingonleftpage}
% \cs{hidenumberingonleftpage} is like \protect{hidenumbering}, but is applied only on left page. \cs{hidenumberingonrightpage} is applied on right page.
-% They can be useful if the position of the line number is depending of the position of the page, but the position of marginal note is fixed.
+% They can be useful if the position of the line number is depending on the position of the page, but the position of the marginal note is fixed.
% \subsection{Adding annotations to line numbers}\label{annotation}
% You may want to have two or more numbers associated with a line of text.
% Consider, for example, the following cases:
@@ -1333,6 +1364,18 @@
% \item by \enquote{A-B} for the third lemma, as it starts while annotation A is still in effect and it finishes after annotation B has already taken effect;
% \item by \enquote{B} for the fourth lemma.
% \end{itemize}
+%
+% Note that the annotation must be called before the beginning of a \cs{edtext} to be taken into account as a starting annotation. So:
+% \begin{verbatim}
+% \linenumannotation{A}\edtext{something...\linenumannotation{B}}{\Afootnote{foo}}
+% \end{verbatim}
+% will use \verb+A+ as starting annotation, while:
+% \begin{verbatim}
+% \edtext{\linenumannotation{A}something...\linenumannotation{B}}{\Afootnote{foo}}
+% \end{verbatim}
+% won't.
+% \subsubsection{Resetting annotation}
+% You can manually reset annotation using \cs{resetlinenumannotation}\verb+{}+. Note that this macro takes no argument, but you should use empty brackets or \textbackslash in order to avoid gobbling spaces.\footnote{As for all \TeX\ macro with no argument.}
% \subsubsection{Modifying annotation associated with a specific note}\label{lineannot}
%
% The \cs{linenum} (\reff{linenum}) macro changes the line number passed to a note.
@@ -1349,8 +1392,9 @@
% By default, annotations are placed after line numbers in both margin and footnote.
%
% \DescribeMacro{\Xlinenumannotationposition}
+% \DescribeMacro{\Xlinenumannotationpositionside}
% \DescribeMacro{\Xendlinenumannotationposition}
-% To change this behaviour, one can use one of the following commands:
+% To change this behavior, one can use one of the following commands:
% \begin{itemize}
% \item \cs{Xlinenumannotationposition}\oarg{s}\marg{v} changes the position in critical footnotes with \meta{s} for the series of footnotes to which it applies, where \meta{s} may be a comma-separated list of series. When \meta{s} is empty, the change applies also to annotations at the sides of the page, alongside the line number.
% \item \cs{Xlinenumannotationpositionside}\marg{v} changes the position at the sides of the page, alongside the line numbers.
@@ -1360,6 +1404,12 @@
% \meta{s} for the series of endnotes to which it applies, where \meta{s} may once again be a comma-separated list of series.
% \end{itemize}
% In each of these three commands, \meta{v} can be \option{after} or \option{before} to indicate position with regards to the line number.
+%
+% \DescribeMacro{\linenumannotationothersidetrue}
+% With the \cs{linenumannotationothersidetrue}, the annotation will appear on the margin side opposite to the line number.
+%
+% You can reset the default behavior with \cs{linenumannotationothersidefalse}.
+%
% \subsubsection{Changing the macro in which annotations are wrapped}\label{wraplinenumannotation}
% By default, annotations are wrapped in the \cs{textsuperscript} macro.
% You can modify this using one of the following:
@@ -1399,7 +1449,7 @@
% If you want to change the separator, you can use \\
% \cs{setlinenumannotationsep}\marg{sep}
% \subsubsection{Annotations in the apparatus}
-% Some other options for the annotation in the apparatus are described on \reff{annotation-inapparatus}
+% Some other options for annotations in the apparatus are described in \reff{annotation-inapparatus}
% \subsection{Executing code at each line}\label{linehook}
% \Macpackage provides an advanced feature for users.
% \DescribeMacro{\dolinehook}\DescribeMacro{\doinsidelinehook}
@@ -1436,17 +1486,17 @@
% \section{Apparatus commands}
%
% \subsection{Terminology}
-% We call ``critical notes'' notes which refer to both a lemma, that is a part of text, and a line number.
+% We call \enquote{critical notes} notes which refer to both a lemma, that is a part of text, and a line number.
% Critical notes are subdivided in critical footnotes and critical endnotes.
%
-% We call ``familiar notes'' notes which refer to a footnote mark in the main text.
+% We call \enquote{familiar notes} notes which refer to a footnote mark in the main text.
%
% \Macpackage manages many series of notes of each category.
% A series of notes is identified by an uppercase letter.
% When the series letter is at the \emph{beginning} of a command name, it refers to a critical footnote.
% When the series letter is at the \emph{end} of a command name, it refers to a familiar footnote.
%
-% So :
+% So:
% \begin{itemize}
% \item \protect\cs{Afootnote} is a critical footnote of the series A.
% \item \protect\cs{Bendnote} is a critical endnote of the series B.
@@ -1499,7 +1549,7 @@
% example:
% \egstart
% \begin{verbatim}
-% I am happy : \edtext{I saw my friend
+% I am happy: \edtext{I saw my friend
% \edtext{Smith}{\Afootnote{Jones
% C, D.}} on Tuesday.}{
% \Bfootnote{The date was
@@ -1511,7 +1561,7 @@
% \firstlinenum{1}
% \linenumincrement{1}
% \pstart
-% I am happy : \edtext{I saw my friend
+% I am happy: \edtext{I saw my friend
% \edtext{Smith}{\Afootnote{Jones
% C, D.}} on Tuesday.}{
% \Bfootnote{The date was
@@ -1556,7 +1606,7 @@
% \label{fulllines}The available options are:
% \begin{itemize}
% \item \verb|fulllines| to disable \protect\cs{Xtwolines} and \protect\cs{Xmorethantwolines} features for this note (cf. \reff{Xtwolines}).
-% \item \verb|nonum| disables line numbering for this note. A horizontal blank space is added instead. You can use \cs{Xinplaceofnumber} to set it (\reff{Xinplaceofnumber}).
+% \item \verb|nonum| disables line numbering for this note. A horizontal blank space is added instead. You can use \cs{Xinplaceofnumber} to set it (\reff{Xinplaceofnumber}).
% \item \verb|nosep| to disable the lemma separator for this note. A horizontal blank space is added instead. You can use \cs{Xinplaceoflemmaseparator} to set it (\reff{Xinplaceoflemmaseparator}).
% \item \verb|linerangesep=|\meta{c} to change to \meta{c} the separator between start line and end line for this particular note.
% \end{itemize}
@@ -1614,8 +1664,8 @@
% start with the page number where they are called.
%
% \paragraph{Code between endnotes}
-% \DescribeMacro{toendnotes}
-% \DescribeMacro{Xtoendnotes}
+% \DescribeMacro{\toendnotes}
+% \DescribeMacro{\Xtoendnotes}
% Sometimes, it is useful to insert content between endnotes of the same series: for example to separate endnotes of different sections of the same text.
% In this case, you could use \emph{inside
% numbered text} the command:\\
@@ -1644,7 +1694,7 @@
%
% \subsubsection{Paragraph in critical apparatus}
% By default, no paragraph can be made in the notes of the critical apparatus.
-% You can allow it by adding the options \verb+parapparatus+ when loading the package :
+% You can allow it by adding the options \verb+parapparatus+ when loading the package:
% \begin{verbatim}
% \usepackage[parapparatus]{eledmac}
% \end{verbatim}
@@ -1661,7 +1711,7 @@
% printed in the notes. For example:
% \egstart
% \begin{verbatim}
-% I am happy :
+% I am happy:
% \edtext{I saw my friend
% \edtext{Smith}{\Afootnote{Jones
% C, D.}} on Tuesday.}
@@ -1673,7 +1723,7 @@
% \egmid
% \beginnumbering
% \pstart
-% I am happy :
+% I am happy:
% \edtext{I saw my friend
% \edtext{Smith}{\Afootnote{Jones
% C, D.}} on Tuesday.}
@@ -1710,7 +1760,7 @@
% extremely long, you may run out of memory; here again you can
% specify a note with an abbreviated lemma using \protect\cs{lemma} and
% \protect\cs{linenum}. The numbers used in \protect\cs{linenum} need not be
-% entered manually; you can use the `\texttt{x-}' symbolic cross-referencing
+% entered manually; you can use the \enquote{\texttt{x-}} symbolic cross-referencing
% commands below (\reff{crossref}) to compute them
% automatically.
%
@@ -1767,7 +1817,7 @@
% If you use UTF-8 processor, like \XeLaTeX\ or \LuaLaTeX, there should not be any glitches.
% However, pay attention to how characters are encoded. Similar-looking characters may be represented differently in unicode numbering.
%
-% For instance, in French, ``é'' has two possible unicode numbers:
+% For instance, in French, \enquote{é} has two possible Unicode codepoints:
% \begin{itemize}
% \item LATIN SMALL LETTER E (U+0065) + COMBINING ACUTE ACCENT (U+0301)
% \item LATIN SMALL LETTER E WITH ACUTE (U+00E9)
@@ -1799,16 +1849,16 @@
% it is all}%
% {\lemma{\sameword{sw} \ldots all}\Afootnote{critical note}}.%
% \end{verbatim}
-% \Macpackage\ cannot know if the ``sw'' in \protect\cs{lemma} refers to the word after ``thing'', after ``other'', or after ``again''.
+% \Macpackage\ cannot know if the \enquote{sw} in \protect\cs{lemma} refers to the word after \enquote{thing}, after \enquote{other}, or after \enquote{again}.
%
% Consequently, you must tell \macpackage to which instance of \protect\cs{sameword} you are referring in the first argument of \protect\cs{edtext}:
% \begin{itemize}
% \item In the content of \protect\cs{lemma}, use \protect\cs{sameword} with no optional argument.
% \item In the first argument of \protect\cs{edtext}, use \protect\cs{sameword} with the optional argument \oarg{X}. \meta{X} is the depth of the \protect\cs{edtext} where the \protect\cs{lemma} is used.
% So if the \protect\cs{lemma} is called in a \protect\cs{edtext} inside another \protect\cs{edtext}, \meta{X} is equal to \verb+2+.
-% If the \protect\cs{lemma} is called in a \protect\cs{edtext} ``of first level'', \meta{X} is equal to \verb|1|. If the lemma is called in both 1 and 2 \protect\cs{edtext} depth, \meta{X} is \verb+1,2+. If that word is referenced in the lemma of every \protect\cs{edtext} depth, \meta{X} can also be set to \verb+inlemma+.
+% If the \protect\cs{lemma} is called in a \protect\cs{edtext} \enquote{of first level}, \meta{X} is equal to \verb|1|. If the lemma is called in both 1 and 2 \protect\cs{edtext} depth, \meta{X} is \verb+1,2+. If that word is referenced in the lemma of every \protect\cs{edtext} depth, \meta{X} can also be set to \verb+inlemma+.
% \end{itemize}
-% Note that only words that are actually referenced in a \protect\cs{lemma} need the optional argument. Therefore, the first \protect\cs{sameword} in the example above should have ``1'' as its optional argument, to be referenced correctly in the lemma.
+% Note that only words that are actually referenced in a \protect\cs{lemma} need the optional argument. Therefore, the first \protect\cs{sameword} in the example above should have \enquote{1} as its optional argument, to be referenced correctly in the lemma.
%
% Note also that the \meta{X} does not refer to the level where the \protect\cs{sameword} occurs, but to the level of the \protect\cs{lemma} that refers to that \protect\cs{sameword}. For example:
% \begin{verbatim}
@@ -1819,7 +1869,7 @@
% }{\lemma{some \sameword{word} \ldots all}\Afootnote{critical note}}.%
% \end{verbatim}
% Here the \protect\cs{sameword} occurs in an \protect\cs{edtext} of level 2,
-% but since it is referenced by \protect\cs{lemma} on level 1, it has ``1'' in the optional argument.
+% but since it is referenced by \protect\cs{lemma} on level 1, it has \enquote{1} in the optional argument.
%
% In the following example figure, each framed box represents an \protect\cs{edtext} level.
% Each number is an occurrence of \protect\cs{sameword}. After a framed box,
@@ -1837,13 +1887,13 @@
% }\textsuperscript{1\ldots5}
%
% The \protect\cs{sameword} number~3 is called in a \protect\cs{lemma} related to an \protect\cs{edtext} of level~2.
-% It must be marked by ``2''.
+% It must be marked by \enquote{2}.
%
-% The \protect\cs{sameword} number~5 is called in a \protect\cs{lemma} related to \protect\cs{edtext} of level~1. It must be marked by ``1''.
+% The \protect\cs{sameword} number~5 is called in a \protect\cs{lemma} related to \protect\cs{edtext} of level~1. It must be marked by \enquote{1}.
%
% The \protect\cs{sameword} number~1 is called in two \protect\cs{lemma}s: one related to a \protect\cs{edtext} of level~1, the other related to \protect\cs{edtext} of level~2.
-% It must be marked by ``1,2''.
-% However, as \protect\cs{lemma} is called only in level~1 and~2, ``1,2'' could replaced by ``inlemma''.
+% It must be marked by \enquote{1,2}.
+% However, as \protect\cs{lemma} is called only in level~1 and~2, \enquote{1,2} could replaced by \enquote{inlemma}.
%
% The \protect\cs{sameword} number~2 is in the first argument of a \protect\cs{edtext} of level~3, but it has no \protect\cs{lemma}-command, so there is no need to mark it.
%
@@ -2040,7 +2090,7 @@
% [...]
% amet\stopmsdata{} \msdata{ABCD}sic transit [...]
% \end{verbatim}
-% Which means that the part of text containing \enquote{Lorem ipsum dolor [...] amet} is witnessed by manuscripts A, B and C, while the part of text starting by \enquote{sic transit} is witnessed by manuscripts A, B, C and D.
+% Which means that the part of text containing \enquote{Lorem ipsum dolor [...] amet} is witnessed by manuscripts A, B and C, while the part of text starting \enquote{sic transit} is witnessed by manuscripts A, B, C and D.
%
% \cs{stopmsdata} is also automatically inserted by \cs{msdata}.
%
@@ -2072,7 +2122,7 @@
% If you want the manuscript apparatus to be on the same level of critical footnotes as the other apparatuses, for each line, reledmac will first insert the manuscript apparatus, then the other footnotes.
% You can change it using:\\
% \cs{msdataposition}\arg{regular-msdata}\\
-% And restore the default behaviour using
+% And restore the default behavior using
% \cs{msdataposition}\arg{msdata-regular}
% \subsection{Familiar notes} \label{sec:desc:familiar}
%
@@ -2089,7 +2139,7 @@
% \protect\cs{footnoteE}. These have the familiar marker in the text, and
% the marked text at the foot of the page can be formated using
% any of the styles described for the critical footnotes. Note that
-% the `regular' footnotes have the series letter at the end of the macro
+% the \enquote{regular} footnotes have the series letter at the end of the macro
% name whereas the critical footnotes have the series letter at the start
% of the name.
%
@@ -2206,20 +2256,21 @@
%
% \section{Apparatus customization}
% \label{displayoptions}
+% \subsection{Introduction}
% \changes{v1.0.0}{2012/09/15}{New generic commands to customize footnote display.}
-% Some commands can be used to change the display of the footnotes.
+% Some commands can be used to change the way the footnotes are displayed.\footnote{In the code of \macpackage, these commands are called \enquote{hooks}.}
% All can have an optional argument \oarg{s}, which is the letter of the series\,---\,or
% a list of letters separated by comma\,---\,depending on which option is applied.
% If the optional argument is omitted or empty, the setting will apply to the entire series.
%
-% When a length, noted \meta{l}, is used, it can be stretchable: \verb|a plus b minus c|. The final length |m| is calculated by \LaTeX{} to have: $a-c \leq m \leq a+b$. If you use some relative unit\footnote{Like \verb|em| which is the width of an `m' in a given font.}, it will be relative to font size of the footnote, except for commands concerning the place kept by the notes --- including blank space.
+% When a length, noted \meta{l}, is used, it can be stretchable: \verb|a plus b minus c|. The final length |m| is calculated by \LaTeX{} to have: $a-c \leq m \leq a+b$. If you use some relative unit\footnote{Like \verb|em| which is the width of an \enquote{m} in a given font.}, it will be relative to font size of the footnote, except for commands concerning the place kept by the notes --- including blank space.
%
% Some commands are boolean, indicating when an option is enabled.
% If you want to disable the option after enabling it, you must use \verb+[false+] as the second optional argument.
% For example:
% \begin{itemize}
-% \item \verb+\XX[A][false]+ to disable the `XX' option for the series A.
+% \item \verb+\XX[A][false]+ to disable the \enquote{XX} option for the series A.
% \item \verb+\XX[][false]+ to disable it for all series.
%
% \end{itemize}
@@ -2240,7 +2291,7 @@
%
% Use \protect\cs{Xarrangement}\oarg{s}\marg{a} to change the arrangement of the \meta{s} series of critical footnotes and \protect\cs{arrangementX}\oarg{s}\marg{a} to change the arrangement of the \meta{s} series of familiar footnotes.
%
-% The value of \meta{a} can be one of the following
+% The value of \meta{a} can be one of the following:
% \begin{itemize}
% \item \verb+paragraph+ formats
% all of the footnotes of a series as a single paragraph; if you use this arrangement, you are strongly encouraged to read \reff{paragraphednotes:advanced}.
@@ -2271,7 +2322,15 @@
% change the \protect\cs{hsize} within the document, call
% the arrangement macro again afterwards to take account of the new
% value.
-% \subsection{Control line number printing}
+% \subsection{Disabling footnote}
+% \DescribeMacro{Xnonote}\DescribeMacro{nonoteX}
+% Some time, you may want to export your edition without notes, but don't want to modify globally your code.
+%
+% \cs{Xnonote}\oarg{s} allow to disable critical notes for the series \meta{s}.
+%
+% \cs{nonoteX}\oarg{s} is the same for familiar notes.
+%
+% \subsection{Control number printing}
% \subsubsection{Print line number only at first time}
% \DescribeMacro{\Xnumberonlyfirstinline}\label{Xnumberonlyfirstinline}
% \changes{v1.0.1}{2012/09/16}{Correction on \protect\cs{Xnumberonlyfirstinline} with lineation by pstart or by page.}
@@ -2295,36 +2354,11 @@
% For endnotes, \cs{Xendnumberonlyfirstinline}; \cs{Xendnumberonlyfirstintwolines} and \cs{Xendsymlinenum} are the equivalents of
% \\ \cs{Xnumberonlyfirstinline}; \cs{Xnumberonlyfirstintwolines} and \cs{Xsymlinenum}.
%
-% \subsubsection{Print line number annotation only at first time}\label{annotation-inapparatus}
-% \DescribeMacro{\Xlinenumannotationonlyfirst}
-% By default, the line number annotation (\reff{annotion} is printed inside every note. If you want to print it only the first time for a given annotation
-% you can use \cs{Xlinenumannotationonlyfirst}\oarg{s}.
-%
-% Note the two following points:
-% \begin{itemize}
-% \item If you use \option{noresetlinenumannotation} option of \macpackage, the \cs{Xlinenumannotationonlyfirst} won't take account of the official line number.
-% \item The \cs{Xlinenumannotationonlyfirst} works for consecutive lemmas with the same annotation. That is, if you have for example a lemma with \verb+A+ annotation, then a lemma with \verb+B+ annotation, then a lemma with \verb+A+ annotation, all lemmas will have its own annotation in the apparatus.
-% \end{itemize}
-%
-% \DescribeMacro{\Xlinenumannotationonlyfirstintwo}
-% Suppose you have a lemma on annotation~1 and a lemma between annotation~1 and annotation~3.
-% With \cs{Xlinenumannotationonlyfirst}, the second lemma is considered to have the same annotation as the first lemma.
-% But if you use both \cs{Xlinenumannotationonlyfirst}\oarg{s} and \cs{Xlinenumannotationonlyfirstintwo}\oarg{s}, a distinction is made.
-%
-%
-% \DescribeMacro{\Xsymlinenumannotation}
-% For setting a particular symbol in place of the line number annotation, you can use \protect\cs{Xsymlinenumannotation}\oarg{s}\marg{symbol} in combination with \protect\cs{Xlinenumannotationonlyfirst}\oarg{s}. From the second lemma with the same line number annotation, the symbol will be used instead of the annotation. Note that any command called in \meta{symbol} must be robust. Use \protect\cs{robustify} to robustify a non-robust command.
-%
-% \DescribeMacro{\Xendlinenumannotationonlyfirst}
-% \DescribeMacro{\Xendlinenumannotationonlyfirstintwo}
-% \DescribeMacro{\Xendsymlinenumannotation}
-% For endnotes, \cs{Xendlinenumannotationonlyfirst}; \cs{Xendlinenumannotationonlyfirstintwo} and \cs{Xendsymlinenumannotation} are the equivalents of
-% \\ \cs{Xlinenumannotationonlyfirst}; \cs{Xlinenumannotationonlyfirstintwo} and \cs{Xsymlinenumannotation}.
%
% \subsubsection{Print page number only at first time}
% For endnotes, \reledmac\ provides a mechanism for printing the page number only the first time it is seen.
% However, when a lemma spans over two pages, the line numbers are normally printed in the following pattern: starting page number - starting line number - ending page number - ending line number.
-% It follows that what corresponds to the actual `page number' may not be self-evident. So:
+% It follows that what corresponds to the actual \enquote{page number} may not be self-evident. So:
% \DescribeMacro{\Xendpagenumberonlyfirst} \cs{Xendpagenumberonlyfirst}\oarg{s} can be called to ensure that the starting page number of a lemma be not printed if it is the same as the ending page number of the preceding lemma.
% You can use \emph{additionally} one (and only one) of the following commands:
% \begin{itemize}
@@ -2348,11 +2382,12 @@
% \end{itemize}
%
% \subsubsection{Arbitrary text before line number}
+% \paragraph{For critical notes}
% \DescribeMacro{\Xtxtbeforenumber}
% \cs{Xtxtbeforenumber}\oarg{s}\marg{txt} allows the insertion of \meta{txt} before the line number only when the line number is printed, so taking into account \cs{Xnumberonlyfirstinline} and the like.
% \paragraph{For endnotes}\label{pagelineendnotes}
% \DescribeMacro{\Xendbeforepagenumber}
-% \cs{Xendbeforepagenumber}\oarg{s}\marg{text} defines the text before the page number in endnotes. Default value is \verb+p.+ (``p'' followed by a dot).
+% \cs{Xendbeforepagenumber}\oarg{s}\marg{text} defines the text before the page number in endnotes. Default value is \verb+p.+ (\enquote{p} followed by a dot).
%
% \DescribeMacro{\Xendafterpagenumber}
% \cs{Xendafterpagenumber}\oarg{s}\marg{text} defines the text after the page number in endnotes. Default value is \verb+) + (open parenthesis followed by a single space).
@@ -2373,7 +2408,7 @@
% \label{Xtwolines}
% \DescribeMacro{\Xtwolines}\DescribeMacro{\Xmorethantwolines}
% If a lemma is printed on two subsequent lines, \macpackage\ will print the first and the last line numbers.
-% Instead of this, it is also possible to print an abbreviation which stands for ``line 1 and subsequent line(s)''.
+% Instead of this, it is also possible to print an abbreviation which stands for \enquote{line 1 and subsequent line(s)}.
%
% To achieve this, use \protect\cs{Xtwolines}\oarg{s}\marg{text} and \protect\cs{Xmorethantwolines}\oarg{s}\marg{text}.
% The \meta{text} argument of \protect\cs{Xtwolines} will be printed if the lemma is on two lines, and the \meta{text} argument of \protect\cs{Xmorethantwolines} will be printed if the lemma is on three or more lines.
@@ -2382,7 +2417,7 @@
% \Xtwolines{sq.}
% \Xmorethantwolines{sqq.}
% \end{verbatim}
-% will print ``1sq.'' for a lemma which falls on lines 1--2 and ``1sqq.'' for a lemma which falls on lines 1--4.
+% will print \enquote{1sq.} for a lemma which falls on lines 1--2 and \enquote{1sqq.} for a lemma which falls on lines 1--4.
%
% If you use \protect\cs{Xtwolines} without setting \protect\cs{Xmorethantwolines}, the \meta{text} argument
% of \protect\cs{Xtwolines} will be used for lemmas which fall on three or more lines.
@@ -2398,7 +2433,7 @@
% \protect\cs{Xtwolinesonlyinsamepage}\oarg{series}.
%
%
-% You can disable \protect\cs{Xtwolines} and related for a specific note by using the `[fulllines]` argument in the note macro cf.~\reff{fulllines}.
+% You can disable \protect\cs{Xtwolines} and related for a specific note by using the \enquote{[fulllines]} argument in the note macro cf.~\reff{fulllines}.
%
% \label{Xendtwolines}\changes{v1.21.0}{2015/04/13}{Add \protect\cs{Xendtwolines}, \protect\cs{Xendmorethantwolines}, \protect\cs{Xendtwolinesbutnotmore} and \protect\cs{Xendtwolinesonlyinsamepage}.}
% \DescribeMacro{\Xendtwolines}\DescribeMacro{\Xendmorethantwolines}\DescribeMacro{\Xendtwolinesbutnotmore}
@@ -2407,10 +2442,11 @@
% \protect\cs{Xendtwolinesonlyinsamepage} instead of \protect\cs{Xtwolines}; \protect\cs{Xmorethantwolines};\\
% \protect\cs{Xtwolinesbutnotmore}; \protect\cs{Xtwolinesonlyinsamepage}.
%
-% \subsubsection{Disable line number}
+% \subsubsection{Disabling line number printing}
% \DescribeMacro{\Xnonumber}
-% You can use \protect\cs{Xnonumber}\oarg{s} if you do not want to have the line number in a footnote.
-% \DescribeMacro{\Xendnonumber} \protect\cs{Xendnonumber}\oarg{s} is the same for endnote.
+% You can use \protect\cs{Xnonumber}\oarg{s} if you do not want to have no line/page/pstart number in the footnotes, nor line number annotation.
+%
+% \DescribeMacro{\Xendnonumber} \protect\cs{Xendnonumber}\oarg{s} is the same for endnotes.
%
% \subsubsection{Printing pstart number}
% \changes{v1.1.0}{2012/09/25}{Add \protect\cs{Xpstart} and \protect\cs{Xonlypstart}}
@@ -2418,7 +2454,7 @@
% \changes{v1.18.0}{2015/02/23}{Debug \protect\cs{Xonlypstart} when using \protect\cs{Xnumberonlyfirstinline} and the current line number differs from the previous.}
% \DescribeMacro{\Xpstart}
% You can use \protect\cs{Xpstart}\oarg{s} if you want to print the pstart number in the footnote, before the line and subline number.
-% Note that when you change the lineation system, the option is automatically switched :
+% Note that when you change the lineation system, the option is automatically switched:
% \begin{itemize}
% \item If you use lineation by pstart, the option is enabled.
% \item If you use lineation by section or by page, the option is disabled.
@@ -2433,6 +2469,10 @@
% \DescribeMacro{\Xonlypstart}
% In combination with \protect\cs{Xpstart}, you can use \protect\cs{Xonlypstart}\oarg{s} if you want to print only the pstart number in the footnote, and not the line and subline number.
%
+% \DescribeMacro{Xpstartonlyfirst} You can use \cs{Xpstartonlyfirst}\oarg{s} to print the pstart number only the first time it appears in the apparatus.
+% \DescribeMacro{\Xpstartseparator}
+% When using \cs{Xpstart}, you can use \cs{Xpstartseparator}\oarg{s}\marg{text} to print \meta{text} after the pstart number.
+% Default value is empty.
% \subsubsection{Printing stanza number}
%
% \DescribeMacro{\Xstanza}\label{Xstanza}
@@ -2441,10 +2481,53 @@
% Of course the stanza number is printed only when you use \cs{numberstanza}
%
% \DescribeMacro{\Xstanzaseparator}
-%
% When using \cs{Xstanza}, you can use \cs{Xstanzaseparator}\oarg{s}\marg{text} to print \meta{text} after the stanza number.
% Default value is empty.
%
+% \DescribeMacro{Xstanzaonlyfirst} You can use \cs{Xstanzaonlyfirst}\oarg{s} to print the stanza number only the first time it appears in the apparatus.
+% \subsubsection{Disabling line number printing}
+% Sometime, we want to print only the stanza or pstart number, but not the line number.
+% \DescribeMacro{\Xnolinenumber}
+% \DescribeMacro{\Xendnolinenumber}
+% The \cs{Xnolinenumber}\oarg{s} macro disables line number printing for critical footnotes.
+%
+% The \cs{Xendnolinenumber} macro does the same for endnotes.
+%
+% Note that contrary to \cs{Xnonumber} and \cs{Xnoendnum}, the page/pstartannotation will be printed, if required.
+%
+% \subsubsection{Options for line number annotations}\label{annotation-inapparatus}
+% \DescribeMacro{\Xlinenumannotationonlyfirst}
+% By default, the line number annotation (\reff{annotation}) is printed in every note. If you want to print it only the first time for a given annotation
+% you can use \cs{Xlinenumannotationonlyfirst}\oarg{s}.
+%
+% Note the two following points:
+% \begin{itemize}
+% \item If you use the \option{noresetlinenumannotation} option of \macpackage, the \cs{Xlinenumannotationonlyfirst} won't take account of the official line number.
+% \item The \cs{Xlinenumannotationonlyfirst} works for consecutive lemmas with the same annotation. That is, if you have for example a lemma with an \verb+A+ annotation, then a lemma with a \verb+B+ annotation, then a lemma with an \verb+A+ annotation, each lemma will have its own annotation in the apparatus.
+% \end{itemize}
+%
+% \DescribeMacro{\Xlinenumannotationonlyfirstintwo}
+% Suppose you have a lemma on annotation~1 and a lemma between annotation~1 and annotation~3.
+% With \cs{Xlinenumannotationonlyfirst}, the second lemma is considered to have the same annotation as the first lemma.
+% But if you use both \cs{Xlinenumannotationonlyfirst}\oarg{s} and \cs{Xlinenumannotationonlyfirstintwo}\oarg{s}, a distinction is made.
+%
+%
+% \DescribeMacro{\Xsymlinenumannotation}
+% To use a particular symbol in place of the line number annotation, you can use \protect\cs{Xsymlinenumannotation}\oarg{s}\marg{symbol} in combination with \protect\cs{Xlinenumannotationonlyfirst}\oarg{s}. From the second lemma with the same line number annotation, the symbol will be used instead of the annotation. Note that any command called in \meta{symbol} must be robust. Use \protect\cs{robustify} to robustify a non-robust command.
+%
+% \DescribeMacro{\Xendlinenumannotationonlyfirst}
+% \DescribeMacro{\Xendlinenumannotationonlyfirstintwo}
+% \DescribeMacro{\Xendsymlinenumannotation}
+% For endnotes, \cs{Xendlinenumannotationonlyfirst}; \cs{Xendlinenumannotationonlyfirstintwo} and \cs{Xendsymlinenumannotation} are the equivalents of
+% \\ \cs{Xlinenumannotationonlyfirst}; \cs{Xlinenumannotationonlyfirstintwo} and \cs{Xsymlinenumannotation}.
+%
+%
+% \DescribeMacro{\Xnolinenumberifannotation}
+% \DescribeMacro{\Xendnolinenumberifannotation}
+% The \cs{Xnolinenumberifannotation} disable line number printing only for critical notes when there are some annotations to the line number.
+%
+% The \cs{Xendnolinenumberifannotation} is the same for endnotes.
+
% \subsubsection{Separator between line and subline numbers}\label{Xsublinesep}
% \DescribeMacro{\Xsublinesep}
% \cs{Xsublinesep}\oarg{s}\marg{txt} changes the separator between line and subline in footnotes.
@@ -2545,22 +2628,6 @@
% \protect\cs{Xendboxlinenum}\oarg{s}\marg{l}, \protect\cs{Xendboxlinenumalign}\oarg{s}\marg{text}, \protect\cs{Xendboxstartlinenum}\oarg{s}\marg{l}, \protect\cs{Xendboxendlinenum}\oarg{s}\marg{l} are the same as, respectively, \protect\cs{Xboxlinenum} and \protect\cs{Xboxlinenumalign}, \protect\cs{Xboxstartlinenum}, \protect\cs{Xboxendlinenum} except in endnotes.
%
%
-% \subsection{Arbitrary code around line number}
-% \DescribeMacro{\Xendbhooklinenumber}
-% \cs{Xendbhooklinenumber}\oarg{s}\marg{code} is used to execute code before line numbers in endnotes. The code is executed before the \cs{Xendbeforelinenumber} space and before the \cs{Xendnotenumfont} font setting.
-%
-% \DescribeMacro{\Xendahooklinenumber}
-% \cs{Xendahooklinenumber}\oarg{s}\marg{code} is used to execute code after line number in endnotes.
-% The code is executed after the \cs{Xendafternumber} space.
-%
-%
-%
-% \DescribeMacro{\Xendbhookinplaceofnumber}
-% \cs{Xendbhookinplaceofnumber}\oarg{s}\marg{code} is used to execute code before space or symbol which replace line number in endnotes. The code is executed before the \cs{Xendbeforesymlinenum} space and before the \cs{Xendnotenumfont} font setting.
-%
-% \DescribeMacro{\Xendahookinplaceofnumber}
-% \cs{Xendahookinplaceofnumber}\oarg{s}\marg{code} is used to execute code after space or symbol which replace line number in endnotes.
-% The code is executed after the \cs{Xendaftersymlinenum} space.
%\subsection{Separator between the lemma and the note}
% \subsubsection{For footnotes}
% \DescribeMacro{\Xlemmaseparator}
@@ -2687,11 +2754,29 @@
% For critical endnotes NOT paragraphed you can define an indentation with \protect\cs{Xendhangindent}\oarg{s}\marg{l}, which will be applied in the second line of notes. It can help to make a distinction between a new note and a break in a note.
%
%
-% \subsection{Arbitrary code at the beginning of notes}
+% \subsection{Arbitrary code}
+
+% \subsubsection{Arbitrary code around line number}
+% \DescribeMacro{\Xendbhooklinenumber}
+% \cs{Xendbhooklinenumber}\oarg{s}\marg{code} is used to execute code before line numbers in endnotes. The code is executed before the \cs{Xendbeforelinenumber} space and before the \cs{Xendnotenumfont} font setting.
+%
+% \DescribeMacro{\Xendahooklinenumber}
+% \cs{Xendahooklinenumber}\oarg{s}\marg{code} is used to execute code after line number in endnotes.
+% The code is executed after the \cs{Xendafternumber} space.
+%
+%
+%
+% \DescribeMacro{\Xendbhookinplaceofnumber}
+% \cs{Xendbhookinplaceofnumber}\oarg{s}\marg{code} is used to execute code before a space or symbol which replaces line number in endnotes. The code is executed before the \cs{Xendbeforesymlinenum} space and before the \cs{Xendnotenumfont} font setting.
+%
+% \DescribeMacro{\Xendahookinplaceofnumber}
+% \cs{Xendahookinplaceofnumber}\oarg{s}\marg{code} is used to execute code after a space or symbol which replaces line number in endnotes.
+% The code is executed after the \cs{Xendaftersymlinenum} space.
+% \subsubsection{Arbitrary code at the beginning of notes}
% \changes{v1.1.0}{2012/09/25}{New hook to add arbitrary code at the beginning of the notes}
% The three next commands add arbitrary code at the beginning of notes.
% As the name's space is local to the notes, you can use it to redefine some style inside the notes.
-% For example, if you don't want the pstart number to be in bold, use :
+% For example, if you don't want the pstart number to be in bold, use:
% \begin{verbatim}
% \Xbhooknote{\renewcommand{\thepstart}{\arabic{pstart}.}}
% \end{verbatim}
@@ -2707,7 +2792,7 @@
% \DescribeMacro{\Xendbhooknote}
% \protect\cs{Xendbhooknote}\oarg{s}\marg{code} is to be used at the beginning of each endnote.
%
-% \subsection{Arbitrary code before inserting note}
+% \subsubsection{Arbitrary code before inserting note}
% \DescribeMacro{\Xbeforeinserting}
% \DescribeMacro{beforeinsertingX}
% \cs{Xbeforeinserting}\oarg{s}\marg{code}
@@ -2717,7 +2802,7 @@
% They allow one to add any arbitrary code just before the footnotes are added in the list of footnotes.
% The main use is to insert text direction code.
% For example, if you edit right-to-left text with \package{bidi}, but want your critical footnote be left-to-right, use \cs{Xbeforeinserting}{\cs{LTR}}.
-% You should also use \cs{Xwraplemma} to ensure your lemmas are right-to-left in a left-to-right paragraph (\reff{Xwraplemma})).
+% You should also use \cs{Xwraplemma} to ensure your lemmas are right-to-left in a left-to-right paragraph (\reff{Xwraplemma}).
%
% Note that the changes are local to the footnote.
%
@@ -2859,7 +2944,7 @@
% \DescribeMacro{\Xmaxhnotes}
% By default, one series of critical notes can take up to 80\% of \cs{vsize}, before being broken to the next page.
% If you want to change the size use \protect\cs{Xmaxhnotes}\oarg{s}\marg{l}.
-% Be careful : the length can't be flexible, and is relative to the the current font.
+% Be careful: the length must be fixed (no stretch), and is relative to the the current font.
% For example, if you want the note to take, at most, 33\% of the text height, do \verb|\Xmaxhnotes{.33\textheight}|.
%
% \DescribeMacro{\maxhnotesX}
@@ -2899,15 +2984,11 @@
% \subsection{Footnotes and the \parpackage columns}
% \changes{v1.13.0}{2014/09/16}{Add \protect\cs{Xnoteswidthliketwocolumns} and \protect\cs{noteswidthliketwocolumnsX}}
% \DescribeMacro{\Xnoteswidthliketwocolumns}\DescribeMacro{\noteswidthliketwocolumnsX}
-% If you use \parpackage\ \protect\cs{columns} macro, you can call :
+% If you use \parpackage\ \protect\cs{columns} macro, you can call:
% \begin{itemize}
% \item \protect\cs{Xnoteswidthliketwocolumns}\oarg{s} to create critical notes with a two-column size width.
% \item \protect\cs{noteswidthliketwocolumnsX}\oarg{s} to create familiar notes with a two-column size width.
% \end{itemize}
-% \subsection{Line number annotation}
-% The way line number annotations are typeset can be changed using hooks as described in \reff{annotationposition} and
-% \reff{wraplinenumannotation}.
-%
% \subsection{Endnotes in one paragraph}
% \changes{v1.12.0}{2015/04/25}{Add \protect\cs{Xendparagraph} and related settings.}
% \DescribeMacro{\Xendparagraph}
@@ -2947,7 +3028,7 @@
% We will briefly discuss \protect\cs{select@lemmafont}
% here because it is important to know about
% it now, although it is not one of the macros you would expect to
-% change in the course of a simple job. Hence it is `protected'
+% change in the course of a simple job. Hence it is \enquote{protected}
% by having the @-sign in its name.
%
% When you use the \protect\cs{edtext} macro to mark a word in your text
@@ -3043,7 +3124,20 @@
% \begin{verbatim}
% \setcounter{stanzaindentsrepetition}{0}
% \end{verbatim}
-% The macros make no restriction on the number of lines in a stanza.
+% The macro makes no restriction on the number of lines in a stanza.
+%
+% Sometime, it is useful to repeat the indents only after some lines of verse.
+% You can set the counter \verb+startstanzaindentsrepetition+ to do that.
+% Its default value is \verb+1+, that means the repetition starts with line of verse number~1.
+%
+% For example, you may want to have no indent for the first line, and all other lines been indented by 1.
+% So do
+% \begin{verbatim}
+% \setstanzaindents{1,0,1}
+% \setcounter{stanzaindentsrepetition}{1}
+% \setcounter{startstanzaindentsrepetition}{2}
+% \end{verbatim}
+% \subsection{Notes about the scope of the indent settings}
% Stanza indentation values (and penalty values) obey \TeX's grouping
% conventions, so if one stanza among several has a different structure,
% its indentations (penalties) may be set within a group; the prior values
@@ -3072,7 +3166,7 @@
% 5000 being placed after the first and third lines of the stanza, and a
% penalty of ${-100}$ after the second.
%
-% The first entry ``1'' is a control
+% The first entry \enquote{1} is a control
% value. If it is zero, then no penalties are passed on to \TeX,
% which is the default. Values between 0 and 10000 are penalty
% values; values between 10001 and 20000 have 10000 subtracted and the result
@@ -3087,7 +3181,7 @@
% between penalties and \emph{glue}, so it may take some adjustment of skips
% and penalties to achieve the best results.
% \subsection{Hanging symbol}
-% It is possible to insert a symbol in each line of hanging verse, as in French typography; for example, the opening bracket `['. To insert it in \macpackage, use macro \DescribeMacro{\sethangingsymbol}\protect\cs{sethangingsymbol}\marg{h} with this code.
+% It is possible to insert a symbol in each line of hanging verse, as in French typography; for example, the opening bracket \enquote{[}. To insert it in \macpackage, use macro \DescribeMacro{\sethangingsymbol}\protect\cs{sethangingsymbol}\marg{h} with this code.
% In the example of French typography, do
% \begin{verbatim}
% \sethangingsymbol{[\,}
@@ -3160,6 +3254,32 @@
% \flagstanza{#1}%
%}
% \end{verbatim}
+% \DescribeMacro{\antilabe}
+% \subsection{Antilabe}\label{antilabe}
+% In dramatic text, it may happen that a line of verse is split between two speakers.
+% Thats is called \enquote{antilabe}.
+% In this case, the typesetting of the second half must start at the horizontal position where the typesetting of the first half stops.
+%
+% \Reledmac\ provides tools to cope with this problem, but you must enable them with the \option{antilabe} option when loading package, as these tools are quite ressource consuming.
+%
+% The \cs{antilabe}\marg{name} must be called at the beginning of the second half of the line of verse.
+%
+% Its \meta{name} argument is the name of the speaker.
+% Because of the way \TeX\ expand argument, you can use one the following syntax:
+% \begin{itemize}
+% \item \verb+\antilabe{name}+, if you typeset the character name;
+% \item \verb+\antilabe\command+, if the character name is defined in a command, like with the \package{thalie} package;
+% \item \verb+\antilabe{}+, if you do not type the character name.
+% \end{itemize}
+% See the file \href{examples/2-antilabe.tex}{examples/2-antilabe.tex} for an example of use.
+%
+% \DescribeMacro{\beforeantilabe}
+% \DescribeMacro{\afterantilabe}
+% You can execute any arbitrary code before or after \cs{antilabe} macro just with a redefinition of \cs{beforeantilabe} or \cs{afterantilabe}.
+% For example, to add more space, just do:
+% \begin{verbatim}
+% \renewcommand{\afterantilabe}{\hspace{1em}}
+% \end{verbatim}
% \subsection{Various tools}
% \DescribeMacro{\ampersand}
% If you need to print an \& symbol in a stanza, use the \verb?\ampersand?
@@ -3232,8 +3352,8 @@
% \protect\cs{edlabel}\marg{lab}. \meta{lab} can be almost anything you like, including
% letters, numbers, punctuation, or a combination---anything but spaces;
% you might type \protect\cs{edlabel}\verb+{toves-3}+, for example.\footnote{More precisely,
-% you should stick to characters in the \TeX\ categories of ``letter''
-% and ``other''.}
+% you should stick to characters in the \TeX\ categories of \enquote{letter}
+% and \enquote{other}.}
%
% \DescribeMacro{\edpageref}
% \DescribeMacro{\edlineref}
@@ -3304,7 +3424,7 @@
% ones cannot.
% \item When \protect\package{hyperref} is loaded, the hyperref link will not be added. (Indeed,
% it is not a limitation, but a feature.)
-% \item With \parpackage, the \cs{xlineref} does not insert the right side flag, in order to obtain a line number. Use \cs{xflagref} to obtain the side flag, depending of your flag.
+% \item With \parpackage, the \cs{xlineref} does not insert the right side flag, in order to obtain a line number. Use \cs{xflagref} to obtain the side flag, depending on your flag.
% \end{itemize}
%
% \subsubsection{Cross-referencing in order to define line number of a critical note}
@@ -3341,11 +3461,11 @@
% the page and line desired---for example, if you want to refer to a
% page and line number in another volume of your edition. In such
% cases, you can use the \protect\cs{edmakelabel}\marg{lab}\marg{numbers}
-% macro so that you can `roll your own' label.
+% macro so that you can \enquote{roll your own} label.
%
-% For example, if you type `\verb"\edmakelabel{elephant}{10|25|0}"'
+% For example, if you type \verb"\edmakelabel{elephant}{10|25|0}"
% you will create a new label, and a later call to \verb"\edpageref{elephant}" would print
-% `10' and \verb"\lineref{elephant}" would print `25'. The sub-line
+% \enquote{10} and \verb"\lineref{elephant}" would print \enquote{25}. The sub-line
% number here is zero. It is usually best to collect your
% \protect\cs{edmakelabel} statements near the top of your document, so that
% you can see them at a glance.
@@ -3488,7 +3608,7 @@
% \item \option{prefixmore} to force the plural version of a prefix.
% \end{itemize}
%
-% For example, a reference to `lines 65--66, 72, and 75' might use \verb|\SEref[prefixmore]{ref1}, \SEref[noprefix]{ref2}, and \SEref[noprefix]{ref3}| to achieve this result.
+% For example, a reference to \enquote{lines 65--66, 72, and 75} might use \verb|\SEref[prefixmore]{ref1}, \SEref[noprefix]{ref2}, and \SEref[noprefix]{ref3}| to achieve this result.
%
% \subsection{Compatibility with \protect\package{xr} package}
% The \cs{externaldocument} command of the \cs{xr} package allows making cross-references from an external document, with the standard \LaTeX\ commands \cs{label} and \cs{ref} (and related).
@@ -3614,12 +3734,23 @@
%
% If you add \protect\cs{edindex} inside some \protect\cs{Xfootnote} command,
% it will refer to that note, and a suffix \emph{n} will be appended to the reference.
-% You can redefine this suffix by redefining the command \protect\cs{ledinnotemark}.
-% Its actual definition is:
+%
+% \DescribeMacro{\Xinnotemark}
+% \DescribeMacro{\innotemarkX}
+% You can redefine the way the reference is made using:
+% \begin{itemize}
+% \item \cs{Xinnotemark}\oarg{series}\marg{definition} for critical notes;
+% \item \cs{innotemarkX}\oarg{series}\marg{definition} for familiar notes;
+% \end{itemize}
+% In the \meta{definition} argument, you can use the following codes:
+% \begin{itemize}
+% \item \verb+#1+, which stands for footnote series;
+% \item \verb+##1+, which stands for reference (ie. page+line)
+% \end{itemize}
+% For example:
% \begin{verbatim}
-% \newcommand{\ledinnotemark}[1]{#1\emph{n}}
+% \Xinnotemark{##1\textsuperscript{#1}}
% \end{verbatim}
-% Where \verb+#1+ stands for the reference.
% \subsection{Separator between page and line numbers}
% \DescribeMacro{\pagelinesep}\label{pagelinesep}
% The page \& linenumber combination is written as |page\pagelinesep line|,
@@ -3648,7 +3779,7 @@
% \verb+xindy+ can understand \protect\package{eledmac} reference syntax of which the scheme is:\\
% \verb+pagenumber-linenumber+
%
-% An example of such a file is provided in the ``\href{examples/.}{examples}'' folder.
+% An example of such a file is provided in the \enquote{\href{examples/.}{examples}} folder.
% Read the xindy handbook to learn how to use it.\footnote{Or, for people
% who read French, read \url{http://geekographie.maieul.net/174}.}
%
@@ -3658,7 +3789,7 @@
%
% In any case, you must load \macpackage\ with the \verb+xindy+ option,
% in order to generate a \verb|.xdy| file which is specific to your document.
-% This file is needed by the \verb+.xdy+ example file which is in the ``\href{examples/.}{examples}'' folder.
+% This file is needed by the \verb+.xdy+ example file which is in the \enquote{\href{examples/.}{examples}} folder.
% Its default name is \verb+reledmac-markup-attr.xdy+,
% but you can change it by using your own as an argument of the \verb|xindy+hyperref| option.
%
@@ -3668,7 +3799,7 @@
% \item Use \verb|xindy+hyperref| option when loading the \macpackage\ package.
% When you run (Xe/Lua)\LaTeX with this option, a \verb+.xdy+ configuration file will be generated with all the settings needed to allow internal hyperlinking in each index entry which is created by \protect\cs{edindex}.
% \item Use \verb+hyperindex=false+ option when loading hyperref.
-% \item Uncomment\,---\,by removing the semicolons at the beginning of the relevant lines\,---\,some lines in the <code>.xdy</code> file provided in the ``\href{examples/.}{examples}'' folder in order to restore internal links in the index to be used by the standard \verb+index+ command.\footnote{These are the recommended lines to provide the best possible compatibility between hyperref and xindy, even without using \macpackage.}.
+% \item Uncomment\,---\,by removing the semicolons at the beginning of the relevant lines\,---\,some lines in the <code>.xdy</code> file provided in the \enquote{\href{examples/.}{examples}} folder in order to restore internal links in the index to be used by the standard \verb+index+ command.\footnote{These are the recommended lines to provide the best possible compatibility between hyperref and xindy, even without using \macpackage.}.
% \end{enumerate}
% \subsection{Advanced setting}
% \DescribeMacro{\edindexlab}
@@ -3815,7 +3946,7 @@
% \DescribeMacro{\edrowfill}
% The macro |\edrowfill|\marg{start}\marg{end}\marg{fill}
% fills columns number \meta{start} to \meta{end} inclusive with
-% \meta{fill}. The \meta{fill} argument can be any horizontal `fill'.
+% \meta{fill}. The \meta{fill} argument can be any horizontal \enquote{fill}.
% For example, |\hrulefill| or |\upbracefill|.
%
% Note that every row must have the same number of columns, even if
@@ -3847,7 +3978,7 @@
% \end{tabular}
% \end{center}
%
-% You can also define your own `fill'. For example:
+% You can also define your own \enquote{fill}. For example:
% \begin{verbatim}
% \newcommand*{\upbracketfill}{%
% \vrule height 4pt depth 0pt\hrulefill\vrule height 4pt depth 0pt}
@@ -4066,20 +4197,20 @@
% files called \file{jobname.!1}, \file{jobname.!2}, etc.
%
% \DescribeMacro{\ifledfinal}
-% The package can take options. The option `final', which is the default
+% The package can take options. The \option{final} option, which is the default
% is for final typesetting; this sets \verb?\ifledfinal? to TRUE. The other
-% option, `draft', may be useful during earlier stages and sets
+% option, \option{draft}, may be useful during earlier stages and sets
% \verb?\ifledfinal? to FALSE.
%
% \DescribeMacro{\showlemma}
% The lemma within the text is printed via \verb?\showlemma{lemma}?.
-% Normally, or with the `final' option, the definition of \verb?\showlemma?
+% Normally, or with the \option{final} option, the definition of \verb?\showlemma?
% is: \\
% \verb?\newcommand*{\showlemma}[1]{#1}? \\
% so it just produces its argument.
-% With the `draft' option it is defined as \\
-% \verb?\newcommand*{\showlemma}[1]{\textit{#1}}? \\
-% so that its argument is typeset in an italic font, which may make it
+% With the \option{draft} option it is defined as \\
+% \verb?\newcommand*{\showlemma}[1]{\textbf{#1}}? \\
+% so that its argument is bold, which may make it
% easier to check that all lemmas have been treated.
%
% If you would prefer some other style, you could put something like this
@@ -4097,7 +4228,7 @@
%
% \subsubsection{\package{floatrow} package compatibility}
% The \package{floatrow} package must be loaded before the \macpackage.
-% \subsubsection{`No room for a new'}\label{noroom}
+% \subsubsection{\enquote{No room for a new}}\label{noroom}
% Sometimes, especially when using \macpackage\ with other packages, you could obtain warning messages such 'no room for a new count' or 'no room for a new write'.
%
% In order to prevent such problems, the first thing is to use the options to optimize \macpackage.
@@ -4171,7 +4302,7 @@
% \verb?\renewcommand{\footfudgefiddle}{68}?\\
% Note that you must call it \emph{before} \cs{Xarrangement}\arg{paragraph} or \cs{arrangementX}\arg{paragraph}.
%
-% Any settings to `geometry' must be made before \cs{Xarrangement} / \cs{arrangementX}.
+% Any settings to \enquote{geometry} must be made before \cs{Xarrangement} / \cs{arrangementX}.
%
% Finally, in many cases you should use \cs{Xmaxhnotes} and / or \cs{maxhnotesX} (\reff{Xmaxhnotes}), in order to define the maximum height relative to \cs{textheight} and not to \cs{vsize}, because the \cs{vsize} value is not the same inside and outside of the preamble.
%
@@ -4195,10 +4326,10 @@
% \end{verbatim}
% If you actually try
% this\footnote{Reported by Dirk-Jan Dekker\index{Dekker, Dirk-Jan}
-% in the CTT thread `Incompatibility
-% of ``color'' package' on 2003/08/28.}
+% in the CTT thread \enquote{Incompatibility
+% of \enquote{color} package} on 2003/08/28.}
% you will find \LaTeX\ whinging
-% `\texttt{Missing \{ inserted}', and then things start to fall apart.
+% \enquote{\texttt{Missing \{ inserted}}, and then things start to fall apart.
% The trick in this case is to specify either:
% \begin{verbatim}
% \newcommand{\morenoexpands}{\let\colorbox=0}
@@ -4299,7 +4430,7 @@
% to the workings of \macpackage\ than those made up just of
% ordinary letters, just as in \PlainTeX\ (see \thetexbook,
% p.\,344). You are meant to be able to make free with
-% ordinary macros, but the `@' ones should be treated with more
+% ordinary macros, but the \enquote{@} ones should be treated with more
% respect, and changed only if you are pretty sure of what you are
% doing.
%
@@ -4329,7 +4460,7 @@
% \begin{macrocode}
%<*code>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{reledmac}[2020/03/08 v2.32.5 typesetting critical editions]%
+\ProvidesPackage{reledmac}[2021/02/14 v2.36.1 typesetting critical editions]%
% \end{macrocode}
%
% \subsection{Package options}
@@ -4352,6 +4483,7 @@
% \begin{macro}{\ifxindyhyperref@}
% \begin{macro}{\ifeledmaccompat@}
% \begin{macro}{\ifnoresetlinenumannotation@}
+% \begin{macro}{\ifantilabe@}
% Use this to remember which option is used, set and execute the options
% with final as the default.
% We use \protect\package{xkeyval} in order to manage options with argument.
@@ -4444,6 +4576,10 @@
\DeclareOptionX{noresetlinenumannotation}{%
\noresetlinenumannotation@true%
}%
+\newif\ifantilabe@%
+\DeclareOptionX{antilabe}{%
+ \antilabe@true%
+}%
% \end{macrocode}
% We use the starred form of \protect\cs{ProcessOptionsX} which executes options in
% the order listed in the source file: class options, then listed package
@@ -4471,6 +4607,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
% \subsection{Loading packages}
% Loading package \protect\package{xargs} to declare commands with optional arguments.
% Loading package \package{xparse} to declare fully expandable commands with optional argument. Ideally, we should use only \package{xparse} and not \package{xargs}. For historical reasons, we use both.
@@ -4788,6 +4925,13 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\led@warn@BadHookSeries}
+% \begin{macrocode}
+\newcommand{\led@warn@BadHookSeries}[2]{%
+ \reledmac@warning{Bad series #1 for #2 hook. Skipped.}%
+}%
+% \end{macrocode}
+% \end{macro}
% \begin{macro}{\led@warn@BadSidenotemargin}
% \begin{macrocode}
\newcommand*{\led@warn@BadSidenotemargin}{%
@@ -4939,6 +5083,25 @@
}%
% \end{macrocode}
% \end{macro}
+% \begin{macro}{\led@error@fail@patch@setcounter}
+% \begin{macrocode}
+\newcommand{\led@error@fail@patch@setcounter}{%
+ \reledmac@error{Failed to patch the \string\setcounter\space command}{\@ehc}%
+}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\led@error@fail@patch@addtocounter}
+% \begin{macrocode}
+\newcommand{\led@error@fail@patch@addtocounter}{%
+ \reledmac@error{Failed to patch the \string\addtocounter\space command}{\@ehc}%
+}%
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand{\led@error@fail@patch@stepcounter}{%
+ \reledmac@error{Failed to patch the \string\stepcounter\space command}{\@ehc}%
+}%
+% \end{macrocode}
+% \end{macro}
% \begin{macro}{\led@warn@edinde@outsidenumbering}
% \begin{macrocode}
\newcommand{\led@warn@edinde@outsidenumbering}{%
@@ -5025,7 +5188,7 @@
\ifledfinal
\newcommand*{\showlemma}[1]{#1}
\else
- \newcommand*{\showlemma}[1]{\underline{#1}}
+ \newcommand*{\showlemma}[1]{\textbf{#1}}%
\fi
% \end{macrocode}
@@ -5065,7 +5228,7 @@
% \begin{macro}{\l@dnumpstartsL}
% In preparation for the \parpackage package, these are related to
-% the `right' text of parallel texts (when \protect\cs{ifl@dpairing} is TRUE).
+% the \enquote{right} text of parallel texts (when \protect\cs{ifl@dpairing} is TRUE).
% They are explained in the \protect\parpackage
% manual.
% \changes{v0.7.0}{2005/02/24}{Added \protect\cs{l@dnumpstartsL}, \protect\cs{ifl@dpairing}
@@ -5124,7 +5287,24 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
-
+% \begin{macro}{ifinstanzaL}
+% \begin{macro}{ifinstanzaR}
+% These boolean tests are switched by the \protect\cs{stanza} command, using either the left or right side.
+% \begin{macrocode}
+ \newif\ifinstanzaL%
+ \newif\ifinstanzaR%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{ifinastanzaL}
+% \begin{macro}{ifinastanzaR}
+% These boolean tests are switched by the \protect\env{astanza} environnement, using either the left or right side.
+% \begin{macrocode}
+ \newif\ifinastanzaL%
+ \newif\ifinastanzaR%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
%\section{Sectioning commands}
%
@@ -5134,15 +5314,15 @@
% be used as many times as you like within one document to start
% and end multiple, separately line-numbered sections. \LaTeX\ will
% maintain and display
-% a `section number' as a count named
+% a \enquote{section number} as a count named
% \protect\cs{section@num} that counts how many
% \protect\cs{beginnumbering} and \protect\cs{resumenumbering}
% commands have appeared; it need not be
% related to the logical divisions of your text.
%
% \begin{macro}{\extensionchars}
-% Each section will read and write an associated `line-list
-% file', containing information used to do the numbering; the file
+% Each section will read and write an associated \enquote{line-list
+% file}, containing information used to do the numbering; the file
% will be called \meta{jobname}\file{.nn}, where \file{nn} is the
% section number. However, you may direct that
% an extra string be added before the
@@ -5197,7 +5377,7 @@
% and variables in the two processing steps.
% \changes{v0.7.0}{2005/02/24}{Added \protect\cs{initnumbering@reg}}
% \changes{v1.12.0}{2014/08/05}{\protect\cs{beginnumbering} is defined only on \protect\package{eledmac}, not on \protect\package{eledpar}.}
-% For parallel processing :
+% For parallel processing:
%\begin{itemize}
% \item zero \protect\cs{l@dnumpstartsL} --- the number of chunks to be processed.
% \item set \protect\cs{ifpst@rtedL} to FALSE.
@@ -5445,7 +5625,7 @@
% They allows to get and delete the first element of a list in one operation. They also expands the items add to the list.
%
% However, \protect\package{etoolbox}'s lists are more useful to loop on them.
-% Consequently, depending of what we need, we use one or either.
+% Consequently, depending on what we need, we use one or other.
%
% It could be nice to unify them to the \LaTeX3 list, however such migration would take quite time with some risk of error, for a gain which will be minor.
%
@@ -5905,11 +6085,13 @@
\textdir TLT%
\fi%
\numlabfont%
- \ifdefstring{\Xlinenumannotationposition@side}{before}{%
- \l@wrap@ifnotemptybox{\Xwraplinenumannotation@side}{%
- \csuse{annot@\the\absline@num @\the\section@num}%
- }%
- }{}%
+ \unless\iflinenumannotationotherside%
+ \ifdefstring{\Xlinenumannotationposition@side}{before}{%
+ \l@wrap@ifnotemptybox{\Xwraplinenumannotation@side}{%
+ \csuse{annot@\the\absline@num @\the\section@num}%
+ }%
+ }{}%
+ \fi%
\linenumrep{\line@num}%
\ifsublines@
\ifnum\subline@num>0\relax
@@ -5918,20 +6100,24 @@
\sublinenumrep{\subline@num}%
\fi
\fi%
- \ifdefstring{\Xlinenumannotationposition@side}{after}{%
- \l@wrap@ifnotemptybox{\Xwraplinenumannotation@side}{%
- \csuse{annot@\the\absline@num @\the\section@num}%
- }%
- }{}%
+ \unless\iflinenumannotationotherside%
+ \ifdefstring{\Xlinenumannotationposition@side}{after}{%
+ \l@wrap@ifnotemptybox{\Xwraplinenumannotation@side}{%
+ \csuse{annot@\the\absline@num @\the\section@num}%
+ }%
+ }{}%
+ \fi%
\egroup%
}%
\newcommand*{\leftlinenum}{%
- \ledlinenum
- \kern\linenumsep}
+ \ledlinenum%
+ \kern\linenumsep%
+}%
\newcommand*{\rightlinenum}{%
- \kern\linenumsep
- \ledlinenum}
+ \kern\linenumsep%
+ \ledlinenum%
+}%
% \end{macrocode}
% \end{macro}
@@ -5940,6 +6126,25 @@
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\leftlinenumannotation}%
+% \begin{macro}{\rightlinenumannotation}%
+% The \cs{leftlinenumannotation} and \cs{rightlinenumannotation} prints the line number annotation; when user-defined it must be printed on the side opposite the main line number.
+% \begin{macrocode}
+\newcommand*{\leftlinenumannotation}{%
+ \l@wrap@ifnotemptybox{\Xwraplinenumannotation@side}{%
+ \csuse{annot@\the\absline@num @\the\section@num}%
+ }%
+ \kern\linenumsep%
+}%
+\newcommand*{\rightlinenumannotation}{%
+ \kern\linenumsep%
+ \l@wrap@ifnotemptybox{\Xwraplinenumannotation@side}{%
+ \csuse{annot@\the\absline@num @\the\section@num}%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
% \subsection{Line number counters and lists}
%
% Footnote references using line numbers rather than symbols can't be
@@ -5951,7 +6156,7 @@
% want line-per-page numbering rather than line-per-section numbering.
%
% So we run \LaTeX\ over the text several times, and each time save
-% information about page and line numbers in a `line-list file' to
+% information about page and line numbers in a \enquote{line-list file} to
% be used during the next pass. At the start of each section---whenever
% \protect\cs{beginnumbering} is executed---the line-list file
% for that section
@@ -5981,11 +6186,12 @@
% \end{macro}
%
% \begin{macro}{\ifsublines@}
+% \begin{macro}{\ifsublines@R}
% \begin{macro}{\sublines@true}
% \begin{macro}{\sublines@false}
% We maintain an associated flag, \protect\cs{ifsublines@},
% to tell us whether we're within
-% a sub-line range or not.
+% a sub-line range or not (and the equivalent for right side: \cs{ifsublines@R})
%
% You may wonder why we do not just use the value of \protect\cs{subline@num}
% to determine this---treating anything greater than $0$ as an
@@ -6000,10 +6206,12 @@
% interrupted by several stage directions.
% \begin{macrocode}
\newif\ifsublines@
+\newif\ifsublines@R%
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\absline@num}
% The count \protect\cs{absline@num} stores the
@@ -6020,8 +6228,8 @@
% \end{macrocode}
% \end{macro}
%
-% We will call \protect\cs{absline@num} numbers ``absolute'' numbers, and
-% \protect\cs{line@num} and \protect\cs{subline@num} numbers ``visible'' numbers.
+% We will call \protect\cs{absline@num} numbers \enquote{absolute} numbers, and
+% \protect\cs{line@num} and \protect\cs{subline@num} numbers \enquote{visible} numbers.
%
% \subsection{Line number locking counter}
% \begin{macro}{\@lock}
@@ -6325,9 +6533,11 @@
\unless\ifledRcol%Get the last line of the last page
\csnumgdef{@lastabsline@forpage@\the\page@num}{\the\absline@num}%
\csnumgdef{@lastline@forpage@\the\page@num}{\the\line@num}%
+ \csnumgdef{@lastsubline@forpage@\the\page@num}{\the\subline@num}%
\else%
\csnumgdef{@lastabsline@forpageR@\the\page@numR}{\the\absline@numR}%
\csnumgdef{@lastline@forpageR@\the\page@numR}{\the\line@numR}%
+ \csnumgdef{@lastsubline@forpageR@\the\page@numR}{\the\subline@numR}%
\fi%
\endgroup
% \end{macrocode}
@@ -6377,7 +6587,7 @@
% \end{macro}
%
% \begin{macro}{\get@linelistfile}
-% \Macpackage{} can take advantage of the \LaTeX\ `safe file input' macros
+% \Macpackage{} can take advantage of the \LaTeX\ \enquote{safe file input} macros
% to get the line-list file.
% \changes{v0.7.0}{2005/02/22}{Added \protect\cs{get@linelistfile}}
% \begin{macrocode}
@@ -6572,6 +6782,7 @@
\else
\csnumgdef{@lastabsline@forpageR@\the\page@numR}{\the\absline@numR}%
\csnumgdef{@lastline@forpageR@\the\page@numR}{\the\line@numR}%
+ \csnumgdef{@lastsubline@forpageR@\the\page@numR}{\the\subline@numR}%
\ifbypage@R
\ifx\l@dchset@num\relax%Not resetting if preceded by a \setlinenum
\ifboolexpr{%
@@ -6587,9 +6798,9 @@
\fi%
\fi
\page@numR=#1%
- \this@section@page@numR=#1%
+ \global\this@section@page@numR=#1%
\last@page@numR=#1%
- \this@section@last@page@numR=#1%
+ \global\this@section@last@page@numR=#1%
\def\next@page@numR{#1}%
\gdef\this@section@next@page@numR{#1}%
\fi
@@ -6598,6 +6809,7 @@
\else
\csnumgdef{@lastabsline@forpage@\the\page@num}{\the\absline@num}%
\csnumgdef{@lastline@forpage@\the\page@num}{\the\line@num}%
+ \csnumgdef{@lastsubline@forpage@\the\page@num}{\the\subline@num}%
\ifbypage@
\ifx\l@dchset@num\relax%Not resetting if preceded by a \setlinenum
\line@num \z@%
@@ -6653,16 +6865,28 @@
% do not really take effect until the next line of text. Instead
% they set a flag that notifies \protect\cs{@nl} of the necessary action.
% \begin{macrocode}
-\newcommand*{\sub@on}{\ifsublines@
+\newcommand*{\sub@on}{%
+ \ifboolexpr{%
+ bool{sublines@}%
+ or%
+ (bool{sublines@R} and bool{ledRcol})%
+ }{%
\let\sub@change=\relax
- \else
+ }{%
\def\sub@change{1}%
- \fi}
-\newcommand*{\sub@off}{\ifsublines@
+ }%
+}%
+\newcommand*{\sub@off}{%
+ \ifboolexpr{%
+ bool{sublines@}%
+ or%
+ (bool{sublines@R} and bool{ledRcol})%
+ }{%
\def\sub@change{-1}%
- \else
+ }{%
\let\sub@change=\relax
- \fi}
+ }%
+}%
% \end{macrocode}
% \end{macro}
@@ -6717,7 +6941,7 @@
\newcommand*{\@set}[1]{%
\ifledRcol
- \ifsublines@
+ \ifsublines@R%
\subline@numR=#1\relax
\else
\line@numR=#1\relax
@@ -6786,7 +7010,7 @@
\newcommand*{\set@line@action}{%
\ifledRcol
\xright@appenditem{\the\absline@numR}\to\actionlines@listR
- \ifsublines@
+ \ifsublines@R%
\@l@dtempcnta=-\subline@numR
\else
\@l@dtempcnta=-\line@numR
@@ -6815,7 +7039,7 @@
\newcommand*{\sub@action}{%
\ifledRcol
\xright@appenditem{\the\absline@numR}\to\actionlines@listR
- \ifsublines@
+ \ifsublines@R%
\xright@appenditem{-1001}\to\actions@listR
\else
\xright@appenditem{-1002}\to\actions@listR
@@ -7236,7 +7460,7 @@
% It is written in the file list.
% If we process a line-list file which used a older version, that means the commands used inside are deprecated, and we can't use them.
% \begin{macrocode}
-\newcommand{\this@line@list@version}{7}%
+\newcommand{\this@line@list@version}{8}%
% \end{macrocode}
% \end{macro}
% \begin{macro}{\line@list@stuff}
@@ -7324,7 +7548,6 @@
% \changes{v0.6.0}{2004/11/16}{Extended \protect\cs{new@line} to output page numbers}
% \begin{macrocode}
\newcommand*{\new@line}{%
- \set@this@c@page%
\ifnumberline%
\IfStrEq{\led@pb@setting}{after}%
{\xifinlist{\the\absline@num}{\l@prev@nopb}%
@@ -7508,18 +7731,35 @@
% \begin{macrocode}
-\newcommand*{\startsub}{\dimen0\lastskip
- \ifdim\dimen0>0pt \unskip \fi
- \ifledRcol \write\linenum@outR{\string\sub@on}%
- \else \write\linenum@out{\string\sub@on}%
- \fi
- \ifdim\dimen0>0pt \hskip\dimen0 \fi}
-\def\endsub{\dimen0\lastskip
- \ifdim\dimen0>0pt \unskip \fi
- \ifledRcol \write\linenum@outR{\string\sub@off}%
- \else \write\linenum@out{\string\sub@off}%
- \fi
- \ifdim\dimen0>0pt \hskip\dimen0 \fi}
+\newcommand*{\startsub}{%
+ \dimen0\lastskip%
+ \ifdim\dimen0>0pt%
+ \unskip%
+ \fi%
+ \ifledRcol%
+ \write\linenum@outR{\string\sub@on}%
+ \else%
+ \write\linenum@out{\string\sub@on}%
+ \fi%
+ \ifdim\dimen0>0pt%
+ \hskip\dimen0%
+ \fi%
+}%
+
+\def\endsub{%
+ \dimen0\lastskip%
+ \ifdim\dimen0>0pt%
+ \unskip%
+ \fi%
+ \ifledRcol%
+ \write\linenum@outR{\string\sub@off}%
+ \else%
+ \write\linenum@out{\string\sub@off}%
+ \fi%
+ \ifdim\dimen0>0pt%
+ \hskip\dimen0%
+ \fi%
+}%
% \end{macrocode}
% \end{macro}
@@ -7568,12 +7808,16 @@
% \begin{macrocode}
\newcommand*{\setlinenum}[1]{%
- \ifnum#1<\z@
- \led@warn@BadSetlinenum
- \else
- \ifledRcol \write\linenum@outR{\string\l@d@set[#1]}
- \else \write\linenum@out{\string\l@d@set[#1]} \fi
- \fi}
+ \ifnum#1<\z@%
+ \led@warn@BadSetlinenum%
+ \else%
+ \ifledRcol%
+ \write\linenum@outR{\string\l@d@set[#1]}%
+ \else%
+ \write\linenum@out{\string\l@d@set[#1]}%
+ \fi%
+ \fi%
+}%
% \end{macrocode}
% \end{macro}
@@ -7778,8 +8022,8 @@
% likely to see within the lemma and within the notes.
%
% The first class is font-changing macros. We suppress expansion for
-% them by letting them become equal to zero.\footnote{Since `control
-% sequences equivalent to characters are not expandable'---\thetexbook,
+% them by letting them become equal to zero.\footnote{Since \enquote{control
+% sequences equivalent to characters are not expandable}---\thetexbook,
% answer to Exercise 20.14.} This is done because we want to
% pass into our notes the generic commands to change to roman or
% whatever, and not their expansions that will ask for a particular style at
@@ -7825,7 +8069,7 @@
% the macros used in the arguments to \protect\cs{edtext}. Since the
% category codes are set when the arguments are scanned, macros
% that depend on changing them will not work. We have most often
-% encountered this with characters that are made `active' within
+% encountered this with characters that are made \enquote{active} within
% text in some, but not all, of the languages used within the document.
% One way around the problem, if it takes this form,
% is to ensure that those characters are \emph{always} active. Within
@@ -7847,6 +8091,7 @@
\let\edtext=\dummy@edtext
\let\edindex\dummy@edindex%
\l@dtabnoexpands
+ \l@noexpands@edgl%
\let\linenumannotation=\@gobble%
\morenoexpands}
\let\morenoexpands=\relax
@@ -8279,7 +8524,7 @@
% The general mechanism is the following:
% \begin{itemize}
% \item \textbf{At the first run}, each \protect\cs{sameword} command increments an \protect\package{etoolbox} counter the name of which contains the argument of the \protect\cs{sameword} commands.
-% \item Then this counter, associated with the argument of \protect\cs{sameword} is stored with the \protect\cs{@sw} command in the auxiliary file of the current \macpackage\ section (the \verb+.1+, \verb+.2+\ldots\ file).
+% \item Then this counter associated with the argument of \protect\cs{sameword} is stored with the \protect\cs{@sw} command in the auxiliary file of the current \macpackage\ section (the \verb+.1+, \verb+.2+\ldots\ file).
% \item \textbf{When this auxiliary file is read at the second run}, different operations are achieved:
% \begin{enumerate}
% \item Get the rank of each \protect\cs{sameword} in a line (relative rank) from the rank of each \protect\cs{sameword} in all the numbered section (absolute rank):
@@ -8796,22 +9041,12 @@
\@at@end@every@pend%
\endgraf\global\num@lines=\prevgraf\egroup%
\global\par@line=0%
+ \get@firsthalf@antilabe@wd%
% \end{macrocode}
-% We check if lineation is by pstart: in this case, we reset the line number, but only in the second line of the pstart.
-% We can't reset line number at the beginning of \protect\cs{pstart}, as \protect\cs{setline} is parsed at the end of previous \protect\cs{pend}, and so, we must do it at the end of first line of pstart.
+% Output the lines.
% \begin{macrocode}
- \csnumdef{pstartline}{0}%
\loop\ifvbox\raw@text%
- \csnumdef{pstartline}{\pstartline+\@ne}%
\do@line%
- \ifbypstart@%
- \ifnumequal{\pstartline}{1}{%
- \bgroup%
- \let\leavevmode\relax%
- \setline{1}%
- \egroup%
- \resetprevline@}{}%
- \fi%
\repeat%
% \end{macrocode}
% Deal with any leftover notes, and then end the group that was begun
@@ -8852,6 +9087,18 @@
\ifautopar%
\autopar%
\fi%
+% \end{macrocode}
+% At the very end, we check if the lineation is made by \cs{pstart}. In this case, we reset the line number, using \cs{setlinenum}, as we are, technically, already out of \cs{pstart}\cs{pend} structure.
+% \begin{macrocode}
+ \ifbypstart@%
+ \begingroup%
+ \unless\ifinstanza%
+ \let\leavevmode\relax%
+ \setlinenum{0}%
+ \fi%
+ \endgroup%
+ \resetprevline@%
+ \fi%
}
% \end{macrocode}
% \end{macro}
@@ -9041,7 +9288,7 @@
% \end{macro}
% \end{macro}
%
-% \subsubsection{Process for ``normal'' line}
+% \subsubsection{Process for \enquote{normal} line}
% \begin{macro}{\print@line}
% \changes{v1.13.1}{2014/09/25}{Coming back of add@penalties, mistakenly deleted in version 0.17!}
% \changes{v1.18.0}{2015/02/23}{Compatibility with \LuaLaTeX\ RTL languages.}
@@ -9549,7 +9796,8 @@
% \item to crossref commands which refer to line numbers (to be completed when I will have resolved this issue).
% \end{itemize}
% \begin{macro}{\linenumannotation}
-% First, the user-level command, which only writes commands to the numbered files, storing the annotation.
+% \begin{macro}{\resetlinenumannotation}
+% First, the user-level commands, which only write commands to the numbered files, storing the annotation.
% \begin{macrocode}
\newcommand{\linenumannotation}[1]{%
\leavevmode%In case it begins with a \pstart, ensure the \@annot is written after \@nl
@@ -9559,8 +9807,19 @@
\write\linenum@out{\string\@annot[#1]}%
\fi%
}%
+
+\newcommand{\resetlinenumannotation}[0]{%
+ \leavevmode%In case it begins with a \pstart, ensure the \@resetannot is written after \@nl
+ \ifledRcol%
+ \write\linenum@outR{\string\@resetannot}%
+ \else%
+ \write\linenum@out{\string\@resetannot}%
+ \fi%
+}%
+
% \end{macrocode}
% \end{macro}
+% \end{macro}
% \begin{macro}{\Xlinenumannotationposition@side}
% The \cs{Xlinenumannotationposition@side} macro, to determine the position of line number annotations in lines printed in the side, relative to the line number position.
% The default value is \enquote{after}, but it can be changed to \enquote{before}, using the \cs{Xlinenumannotationposition} macro.
@@ -9583,6 +9842,12 @@
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \begin{macro}{\iflinenumannotationotherside}
+% The \cs{iflinenumannotationotherside} boolean allows to print the annotation on the side opposite the line number.
+% \begin{macrocode}
+\newif\iflinenumannotationotherside%
+% \end{macrocode}
+% \end{macro}
% \begin{macro}{\@annot}
% \begin{macro}{\store@annot@to@absline}
% Then, the numbered files command \cs{@annot}, which
@@ -9620,16 +9885,23 @@
% \end{macrocode}
% \end{macro}
% \begin{macro}{\reset@current@annot}
+% \begin{macro}{\@resetannot}
% \cs{reset@current@annot} is called at each \cs{@nl} in numbered auxiliary files.
% It resets the annotation of line numbers at each line.
+%
+% The \cs{@resetannot} macro is written in the auxiliary files with \cs{resetlinenumannotation} macro. It resets the annotation.
% \begin{macrocode}
\newcommand{\reset@current@annot}{%
\unless\ifnoresetlinenumannotation@
\let\current@annot\empty%
\fi
}%
+\newcommand{\@resetannot}{%
+ \let\current@annot\empty%
+}%
% \end{macrocode}
% \end{macro}
+% \end{macro}
% \begin{macro}{\parse@annot}
% In the \cs{annot@list} list, each individual \cs{edtext} is associated with a starting and an ending line number annotation, which is stored this way: \verb+start annotation|end annotation+
% The \cs{parse@annot} reads the format and defines two global macros.
@@ -9788,8 +10060,14 @@
\if@twocolumn
\if@firstcolumn
\gdef\l@dld@ta{\llap{{\leftlinenum}}}%
+ \iflinenumannotationotherside%
+ \gdef\l@drd@ta{\rlap{{\rightlinenumannotation}}}%
+ \fi%
\else
\gdef\l@drd@ta{\rlap{{\rightlinenum}}}%
+ \iflinenumannotationotherside%
+ \gdef\l@dld@ta{\llap{{\leftlinenumannotation}}}%
+ \fi%
\fi
\else
\ifboolexpr{bool {l@dprintingcolumns} and test {\ifnumgreater{\line@margin@columns}{\m@ne}}}%
@@ -9814,8 +10092,14 @@
{%
\ifodd\@l@dtempcntb%
\gdef\l@drd@ta{\rlap{{\rightlinenum}}}%
+ \iflinenumannotationotherside%
+ \gdef\l@dld@ta{\llap{{\leftlinenumannotation}}}%
+ \fi%
\else%
\gdef\l@dld@ta{\llap{{\leftlinenum}}}%
+ \iflinenumannotationotherside%
+ \gdef\l@drd@ta{\rlap{{\rightlinenumannotation}}}%
+ \fi%
\fi%
}%
\fi
@@ -10221,7 +10505,7 @@
% \end{macrocode}
% \end{macro}
% \begin{macro}{\set@txtbeforenotesX}
-% The \cs{set@txtbeforenotesX} does the same for the \cs{textbeforenotesX}.
+% The \cs{set@txtbeforenotesX} does the same for the \cs{txtbeforenotesX}.
% \begin{macrocode}
\newcommand{\set@txtbeforenotesX}{%
\unless\ifnofamiliar@%
@@ -10413,7 +10697,7 @@
% page.
%
% These four macros, and the other macros and parameters shown
-% here, are distinguished by the `series letter'
+% here, are distinguished by the \enquote{series letter}
% that indicates which set of the footnotes
% we are dealing with---\texttt{A}, \texttt{B}, \texttt{C}, \texttt{D}, or \texttt{E}.
% The series letter always precedes the string \verb"foot" in macro
@@ -10421,7 +10705,7 @@
% are called \protect\cs{vAfootnote}, \protect\cs{Afootfmt}, \protect\cs{Afootstart},
% and \protect\cs{Afootgroup}.
%
-% These macros are changed depending of the footnotes arrangement: ``normal'', ``paragraphed'', ``two columns'' or ``three columns''.
+% These macros are changed depending on the footnote arrangement: \enquote{normal}, \enquote{paragraphed}, \enquote{two columns} or \enquote{three columns}.
% \subsection{General setup}
% \begin{macro}{\footsplitskips}
% Some setup code that is common for a variety of the footnotes.
@@ -10431,7 +10715,7 @@
% \item \protect\cs{splittopskip} (skip before last part of notes that flow from one page to another).
% \item \protect\cs{splitmaxdepth}.
% \item \protect\cs{floatingpenalty}, that is penalty values being added when a long note flows from one page to another.
-% Here, we let it to 0 when we are processing parallel pages in \protect\package{eledpar}, in order to allow notes to flow from left to right pages and \emph{vice-versa}.
+% Here, we let it to 0 when we process parallel pages in \protect\package{eledpar}, in order to allow notes to flow from left to right pages and \emph{vice-versa}.
% Otherwise, we let it to \protect\cs{@MM}, which is the standard \LaTeX\ \protect\cs{floatingpenalty}.
% \end{itemize}
% \changes{v0.7.0}{2005/02/18}{Added \protect\cs{footsplitskips} for use in many
@@ -10483,7 +10767,7 @@
%
% \begin{macro}{\Xarrangement@normal}
% We can now define all the parameters for the series of
-% footnotes; initially they use the ``normal'' footnote formatting.
+% footnotes; initially they use the \enquote{normal} footnote formatting.
%
% What we want to do here is to insert something like the following
% for each footnote series. (This is an example, not part of the
@@ -10548,7 +10832,7 @@
%
%
% \begin{macro}{\normalvfootnote}
-% We now begin a series of commands that do `normal' footnote
+% We now begin a series of commands that do \enquote{normal} footnote
% formatting: a format much like that implemented
% in \PlainTeX{}, in which each footnote
% is a separate paragraph.
@@ -10649,7 +10933,7 @@
% \end{macro}
% \begin{macro}{\normalfootfmt}
% \label{normalfootfmt}
-% \protect\cs{normalfootfmt} is a `normal' macro
+% \protect\cs{normalfootfmt} is a \enquote{normal} macro
% to take the footnote line and page
% number information (see \reff{linenumbers}), and the
% desired text, and output what's to be printed.
@@ -10938,8 +11222,8 @@
% hyphenate after an explicit hyphen. This can lead to overfull
% \protect\cs{hbox}es when you would not expect to find them, and to the
% uninitiated it might be very hard to see why the problem had
-% arisen.\footnote{Michael Downes, `Line Breaking in \protect\cs{unhbox}ed
-% Text', \textit{TUGboat} \textbf{11} (1990), pp.\,605--612.}
+% arisen.\footnote{Michael Downes, \enquote{Line Breaking in \protect\cs{unhbox}ed
+% Text}, \textit{TUGboat} \textbf{11} (1990), pp.\,605--612.}
%
% Wayne Sullivan\index{Sullivan, Wayne} pointed out to us another
% subtle problem that arises from the same cause: \TeX\ also leaves
@@ -10972,8 +11256,8 @@
% Doing things this way has an important
% consequence:\label{nobreaks-detail} as Michael
% pointed out, you really can't put an explicit line-break into a
-% note built in a \protect\cs{vbox} the way we are doing.\footnote{`Line
-% Breaking', p.\,610.} In other words, be very careful not to use
+% note built in a \protect\cs{vbox} the way we are doing.\footnote{\enquote{Line
+% Breaking}, p.\,610.} In other words, be very careful not to use
% \protect\cs{break}, or \verb"\penalty-10000", or any equivalent inside your
% para-footnote.\label{nobreak} If you do, most of the note will
% probably disappear. You \emph{are} allowed to make strong
@@ -11643,7 +11927,7 @@
% \subsection{Footnote paragraph indent}
% \begin{macro}{\Xsetparindent}
% \begin{macro}{\setparindentX}
-% These two commands set the paragraph indentation of the footnotes, depending of the settings of the user.
+% These two commands set the paragraph indentation of the footnotes, depending on the settings of the user.
% \begin{macrocode}
\newcommand{\Xsetparindent}[1]{%
\nottoggle{Xparindent@#1}{%
@@ -11820,6 +12104,7 @@
% \changes{v1.18.0}{2015/02/23}{Code refactoring in \protect\cs{printlinefootnote}: the printing of the numbers are factorized in \protect\cs{printlinefootnotearea}}
% \begin{macrocode}
\newcommand{\printlinefootnote}[2]{%
+ \xdef\@currentseries{#2}%
\iftoggle{nonum@}{%Try if the line number must printed for this specific not (by default, yes)
\hspace{\csuse{Xinplaceofnumber@#2}}%
}%
@@ -11879,7 +12164,7 @@
% \begin{macro}{\printlinefootnotearea}
% This macro prints the space before the line number, changes the font, then prints the line number and the space after it.
% It is called by \protect\cs{printlinefootnote}
-% depending of the options about repeating line numbers.
+% depending on the options about repeating line numbers.
% The first argument is line information, the second is the notes series (A, B, C, etc.)
% \begin{macrocode}
\newcommand{\printlinefootnotearea}[2]{%
@@ -11916,23 +12201,76 @@
% The previous \protect\cs{boxlinefootnote} calls it.
% \begin{macrocode}
\newcommand{\printlinefootnotenumbers}[2]{%
- \xdef\@currentseries{#2}%
+ \get@pstartcounter%
\ifboolexpr{%
(togl{Xpstart@#2} and bool{numberpstart})%
- or togl{Xpstarteverytime@#2}}%
- {\printpstart}{}%
- \iftoggle{Xstanza@#2}{%
- \ifnumberstanza%
- \printstanza%
- \csuse{Xstanzaseparator@#2}%
- \fi%
+ or togl{Xpstarteverytime@#2}%
+ and not (%
+ togl{Xpstartonlyfirst@#2}%
+ and test {\ifnumequal{\csuse{Xprevpstart@#2}}{\current@pstart}}%
+ )%
+ }%
+ {%
+ \printpstart%
+ \csuse{Xpstartseparator@#2}%
+ }{}%
+ \global\cslet{Xprevpstart@#2}{\current@pstart}%
+ \get@stanzacounter%
+ \ifboolexpr{%
+ togl{Xstanza@#2}%
+ and bool {numberstanza}%
+ and not (%
+ togl{Xpstartonlyfirst@#2}%
+ and test {\ifnumequal{\csuse{Xprevstanza@#2}}{\current@stanza}}%
+ )%
+ }{%
+ \printstanza%
+ \csuse{Xstanzaseparator@#2}%
}{}%
+ \global\cslet{Xprevstanza@#2}{\current@stanza}%
\iftoggle{Xonlypstart@#2}{}{%
\csuse{Xtxtbeforenumber@#2}%
\printlines#1|\ifledRcol@\@Rlineflag\fi|}%
}%
% \end{macrocode}
% \end{macro}
+% \begin{macro}{\get@pstartcounter}
+% A single macro to get the current pstart counter.
+% \begin{macrocode}
+\newcommand{\get@pstartcounter}[0]{%
+ \ifboolexpr{bool{l@dprintingpages} or bool{l@dprintingcolumns}}%
+ {%
+ \ifledRcol%
+ \global\numdef\current@pstart{\the\c@pstartR}%
+ \else%
+ \global\numdef\current@pstart{\the\c@pstartL}%
+ \fi%
+ }%
+ {%
+ \global\numdef\current@pstart{\the\c@pstart}%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\get@stanzacounter}
+% The same to get the current stanza counter.
+% \begin{macrocode}
+\newcommand{\get@stanzacounter}[0]{%
+ \ifboolexpr{bool{l@dprintingpages} or bool{l@dprintingcolumns}}%
+ {%
+ \ifledRcol%
+ \global\numdef\current@stanza{\the\c@stanzaR}%
+ \else%
+ \global\numdef\current@stanza{\the\c@stanzaL}%
+ \fi%
+ }%
+ {%
+ \global\numdef\current@stanza{\the\c@stanza}%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\printXbeforenumber}
% This macro prints a space (before the line number) in footnote.
% It is called by \protect\cs{printlinefootnotearea}.
@@ -11973,11 +12311,15 @@
% \item \protect\cs{ifl@d@esl} for ending sub-line; and
% \item \protect\cs{ifl@d@dash} for the dash between the starting and ending groups.
% \end{itemize}
-% There is no boolean for the line number because it is always printed.
+% There was no boolean for the line number because it was always printed.
+%
+% Maïeul Rouquette has added:
+% \begin{itemize}
+% \item \protect\cs{ifl@d@Xtwolines} and \protect\cs{ifl@d@Xmorethantwolines} to print a symbol which stands for \enquote{and subsequent} when there are two, three or more lines;
+% \item \cs{@annot@start@print} and \cs{@annot@end@print} which define annotations associated with the starting and ending line numbers in critical footnotes;
+% \item \cs{ifl@d@Xlinenumber}, which value depends on the configuration of \cs{Xnolinenumber} and \cs{Xnolinenumberifannotation}.
+% \end{itemize}
%
-% Maïeul Rouquette has added \protect\cs{ifl@d@Xtwolines} and \protect\cs{ifl@d@Xmorethantwolines}
-% to print a symbol which stands for ``and subsequent`` when there are two, three or more lines.
-% Is also defines \cs{@annot@start@print} and \cs{@annot@end@print} which define annotations associated with the starting and ending line numbers in critical footnotes.
% \begin{macro}{\ifl@d@pnum}
% \begin{macro}{\ifl@d@ssub}
% \begin{macro}{\ifl@d@elin}
@@ -11985,6 +12327,7 @@
% \begin{macro}{\ifl@d@dash}
% \begin{macro}{\ifl@d@Xtwolines}
% \begin{macro}{\ifl@d@Xmorethantwolines}
+% \begin{macro}{\ifl@d@Xlinenumber}
% \begin{macro}{\@annot@start@print}
% \begin{macro}{\@annot@end@print}
% \begin{macrocode}
@@ -11997,6 +12340,7 @@
\newif\ifl@d@Xmorethantwolines%
\let\@annot@start@print\relax%
\let\@annot@end@print\relax%
+\newif\ifl@d@Xlinenumber%
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -12007,6 +12351,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
%
% \begin{macro}{\l@dparsefootspec}
@@ -12072,9 +12417,22 @@
\l@d@dashfalse%
\l@d@elinfalse%
% \end{macrocode}
+% Should we print the line number? It depends on hooks and annotations.
+% \begin{macrocode}
+ \l@d@Xlinenumbertrue%
+ \ifboolexpr{togl{Xnolinenumber@\@currentseries}%
+ or (%
+ togl{Xnolinenumberifannotation@\@currentseries}%
+ and not test{\ifdefvoid{\annot@start}}%
+ and not test{\ifdefvoid{\annot@end}}%
+ )%
+ }{%
+ \l@d@Xlinenumberfalse%
+ }{}%
+% \end{macrocode}
% We print the page numbers only if\/: 1)~we are doing
% the lineation by page, and 2)~the ending page number is different
-% from the starting page number.\label{printlines}a
+% from the starting page number.
% \begin{macrocode}
\ifbypage@
\ifnum#4=#1 \else
@@ -12084,13 +12442,19 @@
\fi
% \end{macrocode}
%
-% We print the ending line number if\/: (1)~we are printing the ending
-% page number, or (2)~the ending line number is different from the starting line number.
+% We print the ending line number if:
+% \begin{enumerate}
+% \item we print the ending page number;
+% \item or the ending line number is different from the starting line number and we didn't disable the line number printing
+% \end{enumerate}
% If either of these conditions is true, we also print the annotation linked to the ending line number annotations.
% \begin{macrocode}
\ifboolexpr{%
bool{l@d@pnum}%
- or not test{\ifnumequal{#2}{#5}}%
+ or (%
+ not test{\ifnumequal{#2}{#5}}%
+ and bool{l@d@Xlinenumber}%
+ )%
}{%
\l@d@elintrue%
\l@d@dashtrue%
@@ -12101,7 +12465,6 @@
\fi%
}{}%
% \end{macrocode}
-%
% We define the starting line number annotation as a merge of the starting annotation and ending annotation if we don't print the ending line number.
% Otherwise, it is only the starting annotation.
% \begin{macrocode}
@@ -12145,7 +12508,6 @@
\l@d@ssubtrue
\fi
% \end{macrocode}
-%
% We print the ending sub-line if it is nonzero and: (1)~it is different
% from the starting sub-line number, or (2)~the ending line number is
% being printed.
@@ -12203,9 +12565,12 @@
\iftoggle{Xnoidenticallinenumannotation@\@currentseries}{%
\ifx\annot@start\annot@end%
\let\@annot@end@print\relax%
- \ifx\linenumrep\@gobble%Don't print the dash if we're not printing the line number
+ \ifboolexpr{%Do not print the dash if we do not print the line number
+ test {\ifdefempty{\linenumrep}}%
+ or not bool {l@d@Xlinenumber}%
+ }{%
\l@d@dashfalse%
- \fi%
+ }{}%
\fi%
}{}%
% \end{macrocode}
@@ -12228,9 +12593,12 @@
\l@wrapcs@ifnotemptybox{Xwraplinenumannotation@\@currentseries}{\csuse{Xsymlinenumannotation@\@currentseries}}%
}%
\let\@annot@end@print\relax%
- \ifx\linenumrep\@gobble%Don't print the dash if we're not printing the line number
+ \ifboolexpr{%Do not print the dash if we do not print the line number
+ test {\ifdefempty{\linenumrep}}%
+ or not bool {l@d@Xlinenumber}%
+ }{%
\l@d@dashfalse%
- \fi%
+ }{}%
}{}%
\global\cslet{prevannot@start@\@currentseries}{\annot@start}%
\global\cslet{prevannot@end@\@currentseries}{\annot@end}%
@@ -12284,7 +12652,7 @@
%
% \begin{macro}{\printlines}
% \changes{v2.5.0}{2015/11/13}{\protect\cs{printlines} takes an eighth argument: the line flag}
-% So, we have decided which part of line number sets will be printed depending of these value.
+% So, we have decided which part of line number sets will be printed depending on these values.
% Now we are ready to print them.
% If the lineation is by pstart, we print the pstart.
% \changes{v0.15.0}{2012/06/11}{Line numbering can be reset at each pstart.}
@@ -12312,16 +12680,20 @@
{}%
\ifl@d@pnum%
\wrap@edcrossref{\@this@crossref@start}{#1}%
- \csuse{Xpagelinesep@\@currentseries}%
+ \ifl@d@Xlinenumber%
+ \csuse{Xpagelinesep@\@currentseries}%
+ \fi%
+ \fi%
+ \ifl@d@Xlinenumber%
+ \wrap@edcrossref{\@this@crossref@start}{%
+ \linenumrep{#2}%
+ \iftoggle{Xlineflag@\@currentseries}{#8}{}%
+ }%
+ \ifl@d@ssub%
+ \csuse{Xsublinesep@\@currentseries}%
+ \wrap@edcrossref{\@this@crossref@start}{\sublinenumrep{#3}}%
+ \fi%
\fi%
- \wrap@edcrossref{\@this@crossref@start}{%
- \linenumrep{#2}%
- \iftoggle{Xlineflag@\@currentseries}{#8}{}%
- }%
- \ifl@d@ssub%
- \csuse{Xsublinesep@\@currentseries}%
- \wrap@edcrossref{\@this@crossref@start}{\sublinenumrep{#3}}%
- \fi
\ifcsstring{Xlinenumannotationposition@\@currentseries}{after}%
{\@annot@start@print}%
{}%
@@ -12336,10 +12708,12 @@
{\bgroup}%
{\hbox to \csuse{Xboxendlinenum@\@currentseries}\bgroup}%
\ifl@d@Xtwolines%
- \ifl@d@Xmorethantwolines%
- \csuse{Xmorethantwolines@\@currentseries}%
- \else%
- \csuse{Xtwolines@\@currentseries}%
+ \ifl@d@Xlinenumber%
+ \ifl@d@Xmorethantwolines%
+ \csuse{Xmorethantwolines@\@currentseries}%
+ \else%
+ \csuse{Xtwolines@\@currentseries}%
+ \fi%
\fi%
\else%
\ifl@d@dash%
@@ -12356,17 +12730,19 @@
\wrap@edcrossref{\@this@crossref@end}{#4}%
\csuse{Xpagelinesep@\@currentseries}%
\fi%
- \ifl@d@elin%
- \wrap@edcrossref{\@this@crossref@end}{%
- \linenumrep{#5}%
- \iftoggle{Xlineflag@\@currentseries}{#8}{}%
- }%
- \fi%
- \ifl@d@esl%
- \ifl@d@elin%
- \csuse{Xsublinesep@\@currentseries}%
- \fi%
- \wrap@edcrossref{\@this@crossref@end}{\sublinenumrep{#6}}%
+ \ifl@d@Xlinenumber%
+ \ifl@d@elin%
+ \wrap@edcrossref{\@this@crossref@end}{%
+ \linenumrep{#5}%
+ \iftoggle{Xlineflag@\@currentseries}{#8}{}%
+ }%
+ \fi%
+ \ifl@d@esl%
+ \ifl@d@elin%
+ \csuse{Xsublinesep@\@currentseries}%
+ \fi%
+ \wrap@edcrossref{\@this@crossref@end}{\sublinenumrep{#6}}%
+ \fi%
\fi%
\ifcsstring{Xlinenumannotationposition@\@currentseries}{after}%
{\@annot@end@print}%
@@ -12653,7 +13029,7 @@
% Some of the code for the various formats is remarkably similar to that
% in section~\ref{sec:nfootformat}.
%
-% The following macros generally set things up for the `standard' footnote
+% The following macros generally set things up for the \enquote{standard} footnote
% format.
%
% \begin{macro}{\prebodyfootmark}
@@ -12895,6 +13271,7 @@
\xright@appenditem{%
\noexpand\led@set@index@fornote{#1}%
\noexpand\prepare@edindex@fornote{\l@d@nums}%
+ \unexpanded{\gdef\@currentnotetype{familiar}}%
\unexpanded{\def\this@footnoteX@reading}{\the\csname footnote#1@reading\endcsname}%
\noexpand\vbfnoteX{#1}{#2}{\thisc@footnote}{#3}%
\noexpand\led@reinit@index@fornote%
@@ -12912,6 +13289,7 @@
\xright@appenditem{%
\noexpand\led@set@index@fornote{#1}%
\noexpand\prepare@edindex@fornote{\l@d@nums}%
+ \unexpanded{\gdef\@currentnotetype{familiar}}%
\unexpanded{\def\this@footnoteX@reading}{\the\csname footnote#1@reading\endcsname}%
\noexpand\vbfnoteX{#1}{#2}{\thisc@footnote}{#3}%
\noexpand\led@reinit@index@fornote%
@@ -13487,14 +13865,25 @@
\newcommand{\insertparafootsepX}[1]{%
\ifledRcol@%
\ifnumequal{\csuse{prevpage#1@numR}}{\page@numR}%
- {\csuse{Xparafootsep@#1}}%
+ {\csuse{parafootsepX@#1}}%
{}%
\global\csname prevpage#1@numR\endcsname=\page@numR%
\else%
- \ifnumequal{\csuse{prevpage#1@num}}{\page@num}%
- {\csuse{Xparafootsep@#1}}%
- {}%
- \global\csname prevpage#1@num\endcsname=\page@num%
+ \ifboolexpr{bool{l@dprintingpages} or bool{l@dprintingcolumns} or bool{numbering}}{%
+ \ifnumequal{\csuse{prevpage#1@num}}{\page@num}%
+ {\csuse{parafootsepX@#1}}%
+ {}%
+ \global\csname prevpage#1@num\endcsname=\page@num%
+ }{%We can't use directly the page counter, see https://tex.stackexchange.com/a/239457/7712
+ \global\expandafter\advance\csname footnote#1@parafootsepX\endcsname by 1%
+ \edef\@tmpa{parafootsepX@#1@\the\csname footnote#1@parafootsepX\endcsname}%
+ \expandafter\edlabel\expandafter{\@tmpa}%
+ \edef\@tmpb{\expandafter\xpageref\expandafter{\@tmpa}}%
+ \IfStrEq{\csuse{prevpage#1@num@outnumbering}}{\@tmpb}%
+ {\csuse{parafootsepX@#1}}%
+ {}%
+ \global\cslet{prevpage#1@num@outnumbering}{\@tmpb}%
+ }%
\fi%
}
% \end{macrocode}
@@ -13545,7 +13934,7 @@
% to get the lines numbered automatically (as set up by
% \protect\cs{autopar}, for example).
%
-% In the case of footnote arranged in a ``normal'' way, we also must set some setting for paragraph indent and text direction when using \LuaLaTeX.
+% In the case of footnote arranged in a \enquote{normal} way, we also must set some setting for paragraph indent and text direction when using \LuaLaTeX.
%
% That why we have defined \protect\cs{ledsetnormalparstuff@common} in order to make this setting for both familiar and critical notes.
% This command is called by command to make specific setting to critical or familiar footnote.
@@ -14010,7 +14399,7 @@
%
% This macro prints the space before the line number, changes the font, then prints the line number and the space after it.
% It is called by \protect\cs{endprint}
-% depending of the options about repeating line numbers.
+% depending on the options about repeating line numbers.
% The first argument is line information, the second is the notes series (A, B, C, etc.)
% \begin{macrocode}
\newcommand{\printlineendnotearea}[2]{%
@@ -14120,7 +14509,6 @@
% \begin{macrocode}
}%
% \end{macrocode}
-% \begin{macro}{\setprintendlines}
% The \protect\cs{printendlines} macro is similar to \protect\cs{printlines} but is
% for printing endnotes rather than footnotes.
%
@@ -14134,7 +14522,10 @@
% from the starting page number.\label{printendlines}
% \changes{v0.7.0}{2005/02/18}{Added \protect\cs{setprintendlines} for use by
% \protect\cs{printendlines}}
+% \begin{macro}{\setprintendlines}
+% \begin{macro}{\ifl@d@Xendlinenumber}
% \begin{macrocode}
+\newif\ifl@d@Xendlinenumber%
\newcommand*{\setprintendlines}[6]{%
\let\@annot@start@print\relax%
\let\@annot@end@print\relax%
@@ -14142,7 +14533,20 @@
\l@d@dashfalse%
\l@d@elinfalse%
% \end{macrocode}
-% First of all, we print the second page number only if
+% Should we print the line number? It depends on hooks and annotations.
+% \begin{macrocode}
+ \l@d@Xendlinenumbertrue%
+ \ifboolexpr{togl{Xendnolinenumber@\@currentseries}%
+ or (%
+ togl{Xendnolinenumberifannotation@\@currentseries}%
+ and not test{\ifdefvoid{\annot@start}}%
+ and not test{\ifdefvoid{\annot@end}}%
+ )%
+ }{%
+ \l@d@Xendlinenumberfalse%
+ }{}%
+% \end{macrocode}
+% We print the second page number only if
% the ending page number is different
% \begin{macrocode}
\ifnum#4=#1 \else
@@ -14151,12 +14555,17 @@
\fi
% \end{macrocode}
%
-% We print the ending line number if\/: (1)~we are printing the ending
-% page number, or (2)~the ending line is different from the starting line number.
+% We print the ending line number if:
+% \begin{enumerate}
+% \item we print the ending page number;
+% \item or the ending line is different from the starting line number and we didn't disable the line number printing.
+% \end{enumerate}
+% If either of these conditions is true, we also print the annotation linked to the ending line number annotations.
% \begin{macrocode}
\ifboolexpr{%
bool{l@d@pnum}%
or not test{\ifnumequal{#2}{#5}}%
+ and bool{l@d@Xendlinenumber}%
}{%
\l@d@elintrue%
\l@d@dashtrue%
@@ -14271,9 +14680,12 @@
\iftoggle{Xendnoidenticallinenumannotation@\@currentseries}{%
\ifx\annot@start\annot@end%
\let\@annot@end@print\relax%
- \ifx\linenumrep\@gobble%Don't print the dash if we're not printing the line number
+ \ifboolexpr{%Do not print the dash if we do not print the line number
+ test{\ifdefempty{\linenumrep}}%
+ or not bool {l@d@Xendlinenumber}%
+ }{%
\l@d@dashfalse%
- \fi%
+ }{}%
\fi%
}{}%
% \end{macrocode}
@@ -14296,9 +14708,12 @@
\l@wrapcs@ifnotemptybox{Xendwraplinenumannotation@\@currentseries}{\csuse{Xendsymlinenumannotation@\@currentseries}}%
}%
\let\@annot@end@print\relax%
- \ifx\linenumrep\@gobble%Don't print the dash if we're not printing the line number
+ \ifboolexpr{%Do not print the dash if do not print the line number
+ test{\ifdefempty{\linenumrep}}%
+ or not bool {l@d@Xendlinenumber}%
+ }{%
\l@d@dashfalse%
- \fi%
+ }{}%
}{}%
\global\cslet{prevannot@start@\@currentseries}{\annot@start}%
\global\cslet{prevannot@end@\@currentseries}{\annot@end}%
@@ -14310,6 +14725,7 @@
}%
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\printendlines}
% Now we are ready to print it all.
@@ -14373,24 +14789,28 @@
\ifcsstring{Xendlinenumannotationposition@\@currentseries}{before}%
{\@annot@start@print}%
{}%
- \wrap@edcrossref{\@this@crossref@start}{%
- \ifledRcol@%
- \linenumrepR{#2}%
- \else%
- \linenumrep{#2}%
- \fi%
- }%
- \iftoggle{Xendlineflag@\@currentseries}{\ifledRcol@\@Rlineflag\fi}{}%
- \ifl@d@ssub%
- \csuse{Xendsublinesep@\@currentseries}%
+ \ifl@d@Xendlinenumber%
\wrap@edcrossref{\@this@crossref@start}{%
\ifledRcol@%
- \sublinenumrepR{#3}%
+ \linenumrepR{#2}%
\else%
- \sublinenumrep{#3}%
+ \linenumrep{#2}%
\fi%
}%
\fi%
+ \iftoggle{Xendlineflag@\@currentseries}{\ifledRcol@\@Rlineflag\fi}{}%
+ \ifl@d@Xendlinenumber%
+ \ifl@d@ssub%
+ \csuse{Xendsublinesep@\@currentseries}%
+ \wrap@edcrossref{\@this@crossref@start}{%
+ \ifledRcol@%
+ \sublinenumrepR{#3}%
+ \else%
+ \sublinenumrep{#3}%
+ \fi%
+ }%
+ \fi%
+ \fi%
\ifcsstring{Xendlinenumannotationposition@\@currentseries}{after}%
{\@annot@start@print}%
{}%
@@ -14408,10 +14828,12 @@
% Print the dash + the ending line number, or the line number range symbol.
% \begin{macrocode}
\ifl@d@Xtwolines%
- \ifl@d@Xmorethantwolines%
- \csuse{Xendmorethantwolines@\@currentseries}%
- \else%
- \csuse{Xendtwolines@\@currentseries}%
+ \ifl@d@Xendlinenumber%
+ \ifl@d@Xmorethantwolines%
+ \csuse{Xendmorethantwolines@\@currentseries}%
+ \else%
+ \csuse{Xendtwolines@\@currentseries}%
+ \fi%
\fi%
\else%
\ifl@d@dash%
@@ -14432,7 +14854,7 @@
{\csuse{Xendsympagenum@\@currentseries}}%
}%
{%
- \wrap@edcrossref{\@this@crossref@end}\printnpnum{#4}%
+ \wrap@edcrossref{\@this@crossref@end}{\printnpnum{#4}}%
}%
\fi%
% \end{macrocode}
@@ -14441,28 +14863,30 @@
\ifcsstring{Xendlinenumannotationposition@\@currentseries}{before}%
{\@annot@end@print}%
{}%
- \ifl@d@elin%
- \ifl@d@pnum\csuse{Xendlineprefixsingle@\@currentseries}\fi%
- \wrap@edcrossref{\@this@crossref@end}{%
- \ifledRcol@%
- \linenumrepR{#5}%
- \else%
- \linenumrep{#5}%
- \fi%
- }%
- \iftoggle{Xendlineflag@\@currentseries}{\ifledRcol@\@Rlineflag\fi}{}%
- \fi%
- \ifl@d@esl%
+ \ifl@d@Xendlinenumber%
\ifl@d@elin%
- \csuse{Xendsublinesep@\@currentseries}%
+ \ifl@d@pnum\csuse{Xendlineprefixsingle@\@currentseries}\fi%
+ \wrap@edcrossref{\@this@crossref@end}{%
+ \ifledRcol@%
+ \linenumrepR{#5}%
+ \else%
+ \linenumrep{#5}%
+ \fi%
+ }%
+ \iftoggle{Xendlineflag@\@currentseries}{\ifledRcol@\@Rlineflag\fi}{}%
\fi%
- \wrap@edcrossref{\@this@crossref@end}{%
- \ifledRcol@%
- \sublinenumrepR{#6}%
- \else%
- \sublinenumrep{#6}%
+ \ifl@d@esl%
+ \ifl@d@elin%
+ \csuse{Xendsublinesep@\@currentseries}%
\fi%
- }%
+ \wrap@edcrossref{\@this@crossref@end}{%
+ \ifledRcol@%
+ \sublinenumrepR{#6}%
+ \else%
+ \sublinenumrep{#6}%
+ \fi%
+ }%
+ \fi%
\fi%
\ifcsstring{Xendlinenumannotationposition@\@currentseries}{after}%
{\@annot@end@print}%
@@ -14583,14 +15007,26 @@
\newtoggle{Xtwolinesonlyinsamepage@#1}%
\newtoggle{Xonlypstart@#1}%
\newtoggle{Xpstarteverytime@#1}%
+
\newtoggle{Xpstart@#1}%
+ \newtoggle{Xpstartonlyfirst@#1}%
+ \csdef{Xprevpstart@#1}{0}%Not a hook, but a tool for the hook Xpstartonlyfirst
+ \csgdef{Xpstartseparator@#1}{}%
+
\newtoggle{Xstanza@#1}%
+ \newtoggle{Xstanzaonlyfirst@#1}%
+ \csdef{Xprevstanza@#1}{0}%Not a hook, but a tool for the hook Xstanzaonlyfirst
+
\csgdef{Xstanzaseparator@#1}{}%
\csgdef{Xsymlinenum@#1}{}%
\csgdef{Xsymlinenumannotation@#1}{}%
+ \newtoggle{Xnonote@#1}%
+
\newtoggle{Xnonumber@#1}%
+ \newtoggle{Xnolinenumber@#1}%
+ \newtoggle{Xnolinenumberifannotation@#1}%
\csgdef{Xbeforenumber@#1}{0pt}%
\csgdef{Xtxtbeforenumber@#1}{}%
\csgdef{Xafternumber@#1}{0.5em}%
@@ -14620,6 +15056,7 @@
\csgdef{Xwidth@#1}{\hsize}%
\csgdef{Xwraplinenumannotation@#1}{\textsuperscript}%
\csgdef{Xlinenumannotationposition@#1}{after}%
+ \expandafter\csgdef{Xinnotemark@#1}##1{\ledinnotemark{##1}}%
\newtoggle{Xnoidenticallinenumannotation@#1}%
% \end{macrocode}
% \subsubsection{Create inserts, needed to add notes in foot}
@@ -14636,6 +15073,7 @@
% \changes{v1.23.0}{2015/04/29}{Prevent spurious spaces when \protect\cs{Afootnote} and similar commands are followed by spaces (bug added on 1.0.0!).}
% \begin{macrocode}
\global\notbool{parapparatus@}{\expandafter\newcommand\expandafter *}{\expandafter\newcommand}\csname #1footnote\endcsname[2][]{%
+ \nottoggle{Xnonote@#1}{%
\if@edtext@secondarg@%
\ifledRcol%
\ifcsstring{Xonlyside@#1}{L}{\led@error@note@called@onrightside{#1footnote}}{}%
@@ -14661,6 +15099,7 @@
{\unexpanded{\let\index\nindex}}%There is no note number... so
{}%
\noexpand\Xnote@true%
+ \unexpanded{\gdef\@currentnotetype{critical}}%
\noexpand\prepare@Xprenotes{#1}%
\noexpand\prepare@edindex@fornote{\l@d@nums}%
\unexpanded{\def\sw@list@inedtext}{\expandafter\unexpanded\expandafter{\sw@inthisedtext}}%The value of the \sw@inthisedtext of current \edtext will be pushed to \sw@list@inedtext when the notes are expanded.
@@ -14698,6 +15137,7 @@
{\unexpanded{\let\index\nindex}}%There is no note number... so
{}%
\noexpand\Xnote@true%
+ \unexpanded{\gdef\@currentnotetype{critical}}%
\noexpand\prepare@Xprenotes{#1}%
\noexpand\prepare@edindex@fornote{\l@d@nums}%
\unexpanded{\def\sw@list@inedtext}{\expandafter\unexpanded\expandafter{\sw@inthisedtext}}%The value of the \sw@inthisedtext of current edtext will be pushed to \sw@list@inedtext when the notes are expanded.
@@ -14730,6 +15170,7 @@
\else%
\led@err@FootnoteNotInSecondArgEdtext{#1}%
\fi%
+ }{\@noneed@Footnotetrue}% End of \nottoggle{Xnonote@#1}{%
\ignorespaces%
}
% \end{macrocode}
@@ -14777,7 +15218,9 @@
\csgdef{parafootsepX@#1}{}%
\csgdef{afternoteX@#1}{1em plus.4em minus.4em}
\csgdef{widthX@#1}{\hsize}%
+ \expandafter\csgdef{innotemarkX@#1}##1{\ledinnotemark{##1}}%
\csgdef{txtbeforenotesX@#1}{}%
+ \newtoggle{nonoteX@#1}%
\newtoggle{txtbeforesnotesX@#1@typeset}%Not directly used by user, but internal
\newtoggle{txtbeforenotesonlyonceX@#1}%
% End of for familiar footnotes.
@@ -14795,6 +15238,7 @@
% \begin{macrocode}
\global\expandafter\newcommand\csname footnote#1\endcsname[2][]{%
+ \nottoggle{nonoteX@#1}{%
\begingroup%
\prepare@prenotesX{#1}%
\newcommand{\content}{##2}%
@@ -14805,7 +15249,7 @@
\csq@qlevel=0\relax%
\fi%
% \end{macrocode}
-% If we are preparing parallel typesetting, we cannot just increase the footnote counter.
+% If we prepare parallel typesetting, we cannot just increase the footnote counter.
% Read \parpackage's handbook about that (\reff{reledpar-familiarfootnotenumber}).
% If we have a manual footnote mark, use it.
% \begin{macrocode}
@@ -14828,7 +15272,7 @@
\ifcsstring{onlysideX@#1}{R}{\led@error@note@called@onleftside{footnote#1}}{}%
\fi%
% \end{macrocode}
-% And now, the feature not depending of wether we are preparing parallel typesetting
+% And now, the feature not depending on wether we prepare parallel typesetting
% \begin{macrocode}
\ifstrempty{##1}%
{\protected@csxdef{@thefnmark#1}{\csuse{thefootnote#1}}}%
@@ -14851,6 +15295,7 @@
{\let\index\orig@@index}%
{}%
\endgroup%
+ }{}%End of the notoggleX@#1
}
% \end{macrocode}
% Then define the counters.
@@ -14865,6 +15310,7 @@
% \begin{macrocode}
\expandafter\newcount\csname prevpage#1@num\endcsname%
\expandafter\newcount\csname prevpage#1@numR\endcsname%
+ \expandafter\newcount\csname footnote#1@parafootsepX\endcsname%For the case we use \parafootsepX outside of numbered section
% \end{macrocode}
% Add \cs{let}\cs{footnoteX}\cs{@gobble} to \cs{no@expands}.
% \begin{macrocode}
@@ -15021,6 +15467,8 @@
\csgdef{Xendinplaceofnumber@#1}{0pt}%
\newtoggle{Xendnonumber@#1}%
+ \newtoggle{Xendnolinenumber@#1}%
+ \newtoggle{Xendnolinenumberifannotation@#1}%
\csgdef{Xendhangindent@#1}{0pt}%
@@ -15138,15 +15586,15 @@
% \changes{v1.0.0}{2012/09/15}{New generic commands to customize footnote display.}
% \subsection{Series setting}
% \subsubsection{General way of working}
-% The setting's command (like \protect\cs{numberonlyfirstinline}), also called ``hooks'' can be divided in two categories: those which require a string values and those which require a boolean value.
+% The setting's command (like \protect\cs{numberonlyfirstinline}), also called \enquote{hooks} can be divided in two categories: those which require a string values and those which require a boolean value.
% The first category includes those which require a length value, because we store the length's expression send by user and we evaluate it only in the commands which requires to know the setting.
% The second category require boolean value only when it is set to FALSE.
% Otherwise, we understand the insinuated value is TRUE.
%
-% For each ``hook'' command, we store the value in commands (first category) or a \protect\package{etoolbox}'s toggle (second category) which names are in the form \protect\cs{<hook>@<series>}.
+% For each \enquote{hook} command, we store the value in commands (first category) or a \protect\package{etoolbox}'s toggle (second category) which names are in the form \protect\cs{<hook>@<series>}.
% For example, when calling \protect\cs{twolines}\marg{sq.}, we store \verb+sq.+ in commands \protect\cs{twolines@A}, \protect\cs{twolines@B}, \protect\cs{twolines@C}\ldots for each series defined for use with \macpackage, or, if the \oarg{series} optional argument was send, for each series of this argument.
%
-% These values are tested in some specific places, scattered in all the code, depending of their effects.
+% These values are tested in some specific places, scattered throughout the code, depending on their effects.
% The default values are defined by the \protect\cs{newseries@} command.
%
%
@@ -15166,19 +15614,23 @@
% \item \verb+#1+ (mandatory): the series for which the hooks should be set. If empty, all the series will be affected.
% \item \verb+#2+ (mandatory): the name of the hook.
% \item \verb+#3+ (mandatory): the new value of toggle (true or false).
-% \item \verb+#4+ (optional): if equal to \verb+reload+, reload the footnote setting (call again \protect\cs{Xarrangement} or \protect\cs{arrangementX} or \ldots\ depending of the footnote display).
+% \item \verb+#4+ (optional): if equal to \verb+reload+, reload the footnote setting (call again \protect\cs{Xarrangement} or \protect\cs{arrangementX} or \ldots\ depending on the footnote display).
% \item \verb+#5+ (optional): if not empty, and if \verb+#1+ is empty, change the hook setting for pseudo-series, as \verb+appref+.
% \end{itemize}
% \begin{macrocode}
\newcommandx{\settoggle@series}[5][4,5,usedefault]{%
\def\do##1{%
- \global\settoggle{#2@##1}{#3}%
+ \ifcsdef{etb@tgl@#2@##1}{%
+ \global\settoggle{#2@##1}{#3}%
+ }{%
+ \led@warn@BadHookSeries{##1}{#2}%
+ }%
\ifstrequal{#4}{critical}{
\csuse{Xarrangement@\csuse{series@display##1}}{##1}%
}{}
- \ifstrequal{#4}{familiar}{
+ \ifstrequal{#4}{familiar}{%
\csuse{arrangementX@\csuse{series@displayX##1}}{##1}%
- }{}
+ }{}%
}%
\ifstrempty{#1}{%
\dolistloop{\@series}%
@@ -15199,13 +15651,18 @@
% \item \verb+#1+ (mandatory): the series for which the hooks should be set. If empty, all the series will be affected.
% \item \verb+#2+ (mandatory): the name of the hook.
% \item \verb+#3+ (mandatory): the new value of the hook/command.
-% \item \verb+#4+ (optional): if equal to \verb+reload+, reload the footnote setting (call \protect\cs{footnormal} or \protect\cs{footparagraph} or \ldots\ depending of the footnote display).
+% \item \verb+#4+ (optional): if equal to \verb+reload+, reload the footnote setting (call \protect\cs{footnormal} or \protect\cs{footparagraph} or \ldots\ depending on the footnote display).
% \item \verb+#5+ (optional): if not empty, and if \verb+#1+ is empty, change the hook setting for pseudo-series, as \verb+appref+.
+% \item \verb+#6+ (optional): the number of arguments of the hook.
% \end{itemize}
% \begin{macrocode}
-\newcommandx{\setcommand@series}[5][4,5,usedefault]{%
+\newcommandx{\setcommand@series}[6][4,5,6=0,usedefault]{%
\def\do##1{
- \csgdef{#2@##1}{#3}
+ \ifcsdef{#2@##1}{%
+ \expandafter\global\expandafter\renewcommand\csname#2@##1\endcsname[#6]{#3}%
+ }{%
+ \led@warn@BadHookSeries{##1}{#2}%
+ }%
\ifstrequal{#4}{critical}{%
\csuse{Xarrangement@\csuse{series@display##1}}{##1}%
}{}
@@ -15231,11 +15688,13 @@
% The first argument is the name of the hook, the second a comma-separated list of pseudo-series where the hook can be used, like \verb+appref+ in the case of \protect\cs{Xtwolines}.
% The second argument is also used to create commands named \protect\cs{<hookname><pseudoseries>},
% like \protect\cs{Xtwolinesappref}.
+% The third argument
+% \changes{v2.33.0}{2020/05/31}{\protect\cs{newhookcommand@series} can take an second optional argument (third argument).}
% \changes{v1.21.0}{2015/04/13}{\protect\cs{newhookcommand@series} can take an optional argument.}
% \begin{macrocode}
-\newcommandx{\newhookcommand@series}[2][2,usedefault]{%
+\newcommandx{\newhookcommand@series}[3][2,3=0,usedefault]{%
\global\expandafter\newcommand\expandafter*\csname #1\endcsname[2][]{%
- \setcommand@series{##1}{#1}{##2}[][#2]%
+ \setcommand@series{##1}{#1}{##2}[][#2][#3]%
}%
\ifstrempty{#2}{}{%
\def\do##1{%
@@ -15272,7 +15731,7 @@
% \begin{macro}{\newhooktoggle@series@reload}
% \changes{v1.13.0}{2014/09/16}{Add \protect\cs{newhookcommand@toggle@reload}}
% \protect\cs{newhookcommand@toggle@reload} does the same thing as \protect\cs{newhooktoggle@series}
-% but the commands created by this macro also reload the series arrangement, depending of type os notes
+% but the commands created by this macro also reload the series arrangement, depending on the type of notes
% \begin{macrocode}
\newcommand{\newhooktoggle@series@reload}[2]{%
\global\expandafter\newcommandx\expandafter*\csname #1\endcsname[2][1,2={true},usedefault]{%
@@ -15336,12 +15795,20 @@
\newhooktoggle@series{Xgroupbyline}%
\newhooktoggle@series{Xgroupbylineseparetwolines}%
\newhooktoggle@series{Xnonumber}
+ \newhooktoggle@series{Xnolinenumber}%
+ \newhooktoggle@series{Xnolinenumberifannotation}%
+
\newhooktoggle@series{Xpstart}
+ \newhooktoggle@series{Xpstartonlyfirst}%
\newhooktoggle@series{Xpstarteverytime}%
+ \newhookcommand@series{Xpstartseparator}%
\newhooktoggle@series{Xstanza}%
+ \newhooktoggle@series{Xstanzaonlyfirst}%
\newhookcommand@series{Xstanzaseparator}%
+ \newhooktoggle@series{Xnonote}%
+
\newhooktoggle@series{Xonlypstart}
\newhooktoggle@series{Xnonbreakableafternumber}
\newhooktoggle@series{Xlemmadisablefontselection}
@@ -15360,6 +15827,8 @@
\newhookcommand@series{Xparafootsep}
\newhookcommand@series@reload{Xwidth}{critical}%
+ \newhookcommand@series{Xinnotemark}[][1]%
+
\ifundef{\Xhsize}%
{%
\newcommandx{\Xhsize}[2][1,usedefault]{%
@@ -15409,6 +15878,8 @@
\newhookcommand@series{txtbeforenotesX}%
\newhooktoggle@series{txtbeforenotesonlyonceX}%
\newhookcommand@series@reload{widthX}{familiar}%
+ \newhookcommand@series{innotemarkX}[][1]%
+ \newhooktoggle@series{nonoteX}%
\ifundef{\hsizeX}%
{%
\newcommandx{\hsizeX}[2][1,usedefault]{%
@@ -15451,6 +15922,8 @@
\newhookcommand@series{Xendinplaceofnumber}%
\newhooktoggle@series{Xendnonumber}%
+ \newhooktoggle@series{Xendnolinenumber}%
+ \newhooktoggle@series{Xendnolinenumberifannotation}%
\newhooktoggle@series{Xendnumberonlyfirstinline}%
\newhooktoggle@series{Xendnumberonlyfirstintwolines}%
@@ -15649,7 +16122,7 @@
% \end{macrocode}
% \end{macro}
% \begin{macro}{\do@feet@custom@order}
-% \cs{do@feet@custom@order} is called when \cs{@fnpos} is neither `familiar-critical', nor `critical-familiar', that is, when the order is more complex.
+% \cs{do@feet@custom@order} is called when \cs{@fnpos} is neither \enquote{familiar-critical}, nor \enquote{critical-familiar}, that is, when the order is more complex.
% In this case, people must define the order for all footnote series.
% If they don't, \LaTeX\ could perform an infinite run.
% \begin{macrocode}
@@ -15819,7 +16292,7 @@
% \end{macro}
%
% \subsection{Patching standard output's commands}
-% The \protect\ltxclass{memoir} class does not use the `standard' versions of
+% The \protect\ltxclass{memoir} class does not use the \enquote{standard} versions of
% \protect\cs{@makecol} and \protect\cs{@reinserts}, due to its sidebar insert.
% We had better add that code if \protect\ltxclass{memoir} is used. (It can
% be awkward dealing with |\if| code within |\if| code, so don't use
@@ -16015,9 +16488,10 @@
% \end{macro}
% \begin{macro}{\@outputpage}
% As its name says, \cs{@outputpage} is a \LaTeX\ macro called in the output routine. It is this macro which increases the \verb+page+ counter.
-% We patch it in order to increase, conditionally, the \verb+par@page+ counter.
+% We patch it in order to increase, conditionally, the \verb+par@page+ counter, and to set correctly the page number sent to the auxiliary files (\verb+.1+, \verb+.2+, etc.).
% \begin{macrocode}
\AtBeginDocument{%
+ \set@this@c@page%
\apptocmd{\@outputpage}{%
\ifsameparallelpagenumber%
\ifl@dprintingpages%
@@ -16034,6 +16508,27 @@
{}%
{\led@error@fail@patch@@outputpage}%
}%
+\catcode`\#=12%
+\AtBeginDocument{%
+ \apptocmd{\setcounter}{%
+ \IfStrEq{#1}{page}{\set@this@c@page}{}%
+ }%
+ {}%
+ {\led@error@fail@patch@setcounter}%
+ \apptocmd{\addtocounter}{%
+ \IfStrEq{#1}{page}{\set@this@c@page}{}%
+ }%
+ {}%
+ {\led@error@fail@patch@addtocounter}%
+ \@ifpackageloaded{calc}{%
+ \apptocmd{\stepcounter}{%Because calc.sty does not use addtocounter in stepcounter
+ \IfStrEq{#1}{page}{\set@this@c@page}{}%
+ }%
+ {}%
+ {\led@error@fail@patch@steptocounter}%
+ }{}%
+}%
+\catcode`\#=6%
% \end{macrocode}
% \end{macro}
%
@@ -16101,7 +16596,7 @@
% write methods for the \file{.aux} file.
%
% Jesse Billett\footnote{(\url{jdb43@cam.ac.uk}) via the \texttt{ctt}
-% thread `ledmac cross referencing', 25 August 2003.}
+% thread \enquote{ledmac cross referencing}, 25 August 2003.}
% found that the original code could be off by several pages. This version,
% hopefully cures that, and also allows for non-arabic page numbering.
%
@@ -16541,7 +17036,7 @@
% \begin{macro}{\l@dlabel@parse}
% Notice that we slipped another \verb"|" delimiter into the
% penultimate line of \protect\cs{l@dgetref@num}, to
-% keep the `switch-number' separate from the reference numbers. This
+% keep the \enquote{switch-number} separate from the reference numbers. This
% \verb"|" is used as another parameter delimiter by \protect\cs{l@dlabel@parse},
% which extracts the appropriate number from its first argument.
% The \verb"|"-delimited arguments consist of the expanded label-macro
@@ -16667,6 +17162,11 @@
\newtoggle{Xlinenumannotationonlyfirst@SEref}%Never changed, just for the test in \setprintlines
\newtoggle{Xlinenumannotationonlyfirst@appref}%Idem
+\newtoggle{Xnolinenumber@SEref}%Idem
+\newtoggle{Xnolinenumber@appref}%Idem
+\newtoggle{Xnolinenumberifannotation@SEref}%Idem
+\newtoggle{Xnolinenumberifannotation@appref}%Idem
+
\def\Xlinenumannotationposition@appref{after}%
\def\Xlinenumannotationposition@SEref{after}%
@@ -16715,8 +17215,8 @@
\toggletrue{Xendlineflag@SErefwithpage}%Here, exception
-\newtoggle{Xendlinenumannotationonlyfirst@SEref}%Never changed, just for the test in \setprintendlines
-\newtoggle{Xendlinenumannotationonlyfirst@appref}%Idem
+\def\Xendlinenumannotationposition@apprefwithpage{after}%
+\def\Xendlinenumannotationposition@SErefwithpage{after}%
\def\Xendlinenumannotationposition@apprefwithpage{after}%
\def\Xendlinenumannotationposition@apprefwithpage@SErefwithpage{after}%
@@ -16726,10 +17226,22 @@
\newtoggle{Xendnoidenticallinenumannotation@apprefwithpage}%
\newtoggle{Xendnoidenticallinenumannotation@SErefwithpage}%
+
+
+\newtoggle{Xendnolinenumber@SErefwithpage}%Never changed, only for test in \setprintendlines
+\newtoggle{Xendnolinenumber@apprefwithpage}%Idem
+\newtoggle{Xendnolinenumberifannotation@SErefwithpage}%Idem
+\newtoggle{Xendnolinenumberifannotation@apprefwithpage}%Idem
+
% \end{macrocode}
% Note that some of these hooks are declared but no user command can change their values. Such hooks are not pertinent for \verb+appref+ and \verb+apprefwithpage+ pseudo-series, but their values are nonetheless tested in some macros.
% \begin{macrocode}
+\newtoggle{Xendlinenumannotationonlyfirst@SEref}%Never changed, just for the test in \setprintendlines
+\newtoggle{Xendlinenumannotationonlyfirst@SErefwithpage}%Idem
+\newtoggle{Xendlinenumannotationonlyfirst@appref}%Idem
+\newtoggle{Xendlinenumannotationonlyfirst@apprefwithpage}%Idem
+
\gdef\Xboxstartlinenum@appref{0pt}
\gdef\Xboxstartlinenum@SEref{0pt}
@@ -16855,6 +17367,8 @@
{%
\def\@this@crossref@start{#2:start}%
\def\@this@crossref@end{#2:end}%
+ \xdef\annot@start{\xannotationref{#2:start}}%
+ \xdef\annot@end{\xannotationref{#2:end}}%
\printendlines\xpageref{#2:start}|\xlineref{#2:start}|\xsublineref{#2:start}|\xpageref{#2:end}|\xlineref{#2:end}|\xsublineref{#2:end}|\relax|\xflagref{#2:start}|%
}%
\def\do##1{%
@@ -16920,7 +17434,7 @@
% make your own label. For example, if you insert
% \protect\cs{edmakelabel}\verb+{elephant}{10|25|0}+ you will have created a
% new label, and a later call to \protect\cs{edpageref}\verb+{elephant}+ would
-% print `10' and \protect\cs{lineref}\verb+{elephant}+ would print `25'.
+% print \enquote{10} and \protect\cs{lineref}\verb+{elephant}+ would print \enquote{25}.
% The sub-line number here is zero.
% \protect\cs{edmakelabel} takes a label, followed by a page and a line number(s)
% as arguments.
@@ -17107,7 +17621,7 @@
% \begin{macro}{\ledsidenote}
% \protect\cs{ledleftnote}, \protect\cs{ledrightnote}, \protect\cs{ledinnernote}, \protect\cs{ledouternote} are the
% user commands for left, right, inner and outer sidenotes.
-% The two last one are just alias for the two first one, depending of the page number.
+% The two last ones are just alias for the two first ones, depending on the page number.
% \protect\cs{ledsidenote}\marg{text} is the command for a moveable sidenote.
% \begin{macrocode}
\newcommand*{\ledleftnote}[1]{\edtext{}{\l@dlsnote{#1}}}
@@ -17129,7 +17643,7 @@
% \begin{macro}{\l@desnote}
% \begin{macro}{\l@disnote}
% \changes{v1.12.0}{2014/08/05}{\protect\cs{l@dlsnote},\protect\cs{l@drsnote} and \protect\cs{l@dcsnote} defined only one time, in \eledmac, including needs for eledpar case.}.
-% The `footnotes' for left, right, and moveable sidenotes. The whole
+% The \enquote{footnotes} for left, right, and moveable sidenotes. The whole
% scheme is reminiscent of the critical footnotes code.
% \begin{macrocode}
\newif\ifrightnoteup
@@ -17250,7 +17764,7 @@
% \item \protect\cs{l@dcsnotetext@l} if \protect\cs{ledsidenote} is to be put on right.
% \end{itemize}
% \end{itemize}
-% \cs{vl@disnote} and \cs{vl@dosnote} just call \cs{vl@dlsnote} or \cs{vl@drsnote}, depending of the page.
+% \cs{vl@disnote} and \cs{vl@dosnote} just call \cs{vl@dlsnote} or \cs{vl@drsnote}, depending on the page.
% \begin{macrocode}
\newcommand*{\vl@dlsnote}[1]{%
\ifledRcol@%
@@ -17848,7 +18362,7 @@
(define-attributes ("ledinnote\thelabidx"))^^J
\space\space(markup-locref^^J
\eledmacmarkuplocrefdepth^^J
- :open "\string\ledinnote[\edindexlab\thelabidx]{\@index@command}{"^^J
+ :open "\string\ledinnote[\edindexlab\thelabidx]{\@index@command}{\@currentseries}{\@currentnotetype}{"^^J
:close "}"^^J
:attr "ledinnote\thelabidx"^^J
)
@@ -17858,7 +18372,7 @@
(define-attributes ("ledinnote\thelabidx"))^^J
\space\space(markup-locref^^J
\eledmacmarkuplocrefdepth^^J
- :open "\string\ledinnote{\@index@command}{"^^J
+ :open "\string\ledinnote{\@index@command}{\@currentseries}{\@currentnotetype}{"^^J
:close "}"^^J
:attr "ledinnote\thelabidx"^^J
)
@@ -17870,7 +18384,7 @@
% \begin{macrocode}
\else%
\gdef\@ledinnote@command{%
- ledinnote[\edindexlab\thelabidx]{\@index@command}%
+ ledinnote[\edindexlab\thelabidx]{\@index@command}{\@currentseries}{\@currentnotetype}%
}%
\fi%
}
@@ -17901,31 +18415,41 @@
% \subsection{Code for the formatted index}
% \begin{macro}{\ledinnote}
% \changes{v1.22.0}{2015/04/25}{\protect\cs{ledinnote} takes a first optional argument, which is the label for hyperlinks.}
-% \begin{macro}{\ledinnotehyperpage}
% \begin{macro}{\ledinnotemark}
% \changes{v1.21.0}{2015/04/13}{Add \protect\cs{ledinnotemark}.}
+% \changes{v2.33.0}{2020/05/31}{\protect\cs{ledinnotemark} redefinition is deprecated, use \protect\cs{Xinnotemark} and \protect\cs{innotemarkX} instead.}
% These macros are used to specify that an index reference points to a note.
-% Arguments of \protect\cs{ledinnote} are: \verb+#1+ (optional): the label for the hyperlink, \verb+#2+: command applied to the number, \verb+#3+: the number itself.
+% Arguments of \protect\cs{ledinnote} are:
+% \begin{itemize}
+% \item \verb+#1+ (optional): the label for the hyperlink;
+% \item \verb+#2+: command applied to the number;
+% \item \verb+#3+: the note series;
+% \item \verb+#4+: the type of note (critical/familiar).
+% \item \verb+#5+: the number itself.
+% \end{itemize}
% \begin{macrocode}
-\newcommandx{\ledinnote}[3][1,usedefault]{%
+\newcommandx{\ledinnote}[5][1,usedefault]{%
+ \IfStrEq{#4}{critical}{%
+ \def\tmp{Xinnotemark}%
+ }{%
+ \def\tmp{innotemarkX}%
+ }%
\ifboolexpr{%
test{\ifdefequal{\iftrue}{\ifHy@hyperindex}}%
or%
bool {xindyhyperref@}%
}%
{%
- \csuse{#2}{\hyperlink{#1}{\ledinnotemark{#3}}}%
+ \csuse{#2}{\hyperlink{#1}{\csuse{\tmp @#3}{#5}}}%
}%
{%
- \csuse{#2}{\ledinnotemark{#3}}%
+ \csuse{#2}{\csuse{\tmp @#3}{#5}}%
}%
}%
-\newcommand{\ledinnotehyperpage}[2]{\csuse{#1}{\ledinnotemark{\hyperpage{#2}}}}%
\newcommand{\ledinnotemark}[1]{#1\emph{n}}%
% \end{macrocode}
% \end{macro}
% \end{macro}
-% \end{macro}
% \subsection{Main code}
% \changes{v2.0.0}{2015/07/19}{Suppress indexing command specific to \protect\ltxclass{memoir}.}
% \Eledmac and \ledmac were using the specific indexing tools of the \protect\ltxclass{memoir} in order to allow multiple index.
@@ -18151,9 +18675,9 @@
% \end{macro}
% \changes{v1.14.0}{2014/10/27}{Delete previous override of \protect\cs{l@d@@wrindexhyp} at the beginning of a document when hyperref is not loaded.}
%
-% \subsection{`innote' and `notenumber' option of \package{indextols} package}
+% \subsection{\enquote{innote} and \enquote{notenumber} option of \package{indextols} package}
% \begin{macro}{\led@set@index@fornote}
-% The \cs{led@set@index@fornote} is called when a familiar footnote is inserted --- and not when it is read --- and changes the \cs{index} command depending of the option of the \package{indextools} package.
+% The \cs{led@set@index@fornote} is called when a familiar footnote is inserted --- and not when it is read --- and changes the \cs{index} command depending on the option of the \package{indextools} package.
% Its only argument is the note series.
% \begin{macrocode}
\newcommand{\led@set@index@fornote}[1]{%
@@ -18193,93 +18717,141 @@
% \end{macrocode}
% First those which arguments are \oarg{options}\marg{label}\oarg{insert}.
% \begin{macrocode}
+ \gdef\edglsomo{}%
+ \listgadd{\edglsomo}{gls}%
+ \listgadd{\edglsomo}{Gls}%
+ \listgadd{\edglsomo}{GLS}%
+ \listgadd{\edglsomo}{glspl}%
+ \listgadd{\edglsomo}{Glspl}%
+ \listgadd{\edglsomo}{GLSpl}%
+ \listgadd{\edglsomo}{glstext}%
+ \listgadd{\edglsomo}{Glstext}%
+ \listgadd{\edglsomo}{GLStext}%
+ \listgadd{\edglsomo}{Glsfirst}%
+ \listgadd{\edglsomo}{GLSfirst}%
+ \listgadd{\edglsomo}{glsplural}%
+ \listgadd{\edglsomo}{Glsplural}%
+ \listgadd{\edglsomo}{GLSplural}%
+ \listgadd{\edglsomo}{glsfirstplural}%
+ \listgadd{\edglsomo}{Glsfirstplural}%
+ \listgadd{\edglsomo}{GLSfirstplural}%
+ \listgadd{\edglsomo}{glsname}%
+ \listgadd{\edglsomo}{Glsname}%
+ \listgadd{\edglsomo}{GLSname}%
+ \listgadd{\edglsomo}{glssymbol}%
+ \listgadd{\edglsomo}{Glssymbol}%
+ \listgadd{\edglsomo}{GLSsymbol}%
+ \listgadd{\edglsomo}{glsdesc}%
+ \listgadd{\edglsomo}{Glsdesc}%
+ \listgadd{\edglsomo}{GLSdesc}%
+ \listgadd{\edglsomo}{glsuseri}%
+ \listgadd{\edglsomo}{Glsuseri}%
+ \listgadd{\edglsomo}{GLSuseri}%
+ \listgadd{\edglsomo}{glsuserii}%
+ \listgadd{\edglsomo}{Glsuserii}%
+ \listgadd{\edglsomo}{GLSuserii}%
+ \listgadd{\edglsomo}{glsuseriii}%
+ \listgadd{\edglsomo}{Glsuseriii}%
+ \listgadd{\edglsomo}{GLSuseriii}%
+ \listgadd{\edglsomo}{glsuseriv}%
+ \listgadd{\edglsomo}{Glsuseriv}%
+ \listgadd{\edglsomo}{GLSuseriv}%
+ \listgadd{\edglsomo}{glsuserv}%
+ \listgadd{\edglsomo}{Glsuserv}%
+ \listgadd{\edglsomo}{GLSuserv}%
+ \listgadd{\edglsomo}{glsuservi}%
+ \listgadd{\edglsomo}{Glsuservi}%
+ \listgadd{\edglsomo}{GLSuservi}%
\renewcommand{\do}[1]{%
\expandafter\DeclareRobustCommandx\csname ed#1\endcsname[3][1,3,usedefault]{%
\doedindexlabel%
+ \ifdef{\hypertarget}{%
+ \Hy@raisedlink@left{\hypertarget{pageline.\thepageline}{}}%
+ }{}%
\csname#1\endcsname[counter=pageline,##1]{##2}[##3]%
}%
\expandafter\WithSuffix\expandafter\DeclareRobustCommandx\csname ed#1\endcsname*[3][1,3,usedefault]{%
\doedindexlabel%
+ \ifdef{\hypertarget}{%
+ \Hy@raisedlink@left{\hypertarget{pageline.\thepageline}{}}%
+ }{}%
\csname#1\endcsname*[counter=pageline,##1]{##2}[##3]%
}%
}%
- \docsvlist{%
- gls,%
- Gls,%
- GLS,%
- glspl,%
- Glspl,%
- GLSpl,%
- glstext,%
- Glstext,%
- GLStext,%
- Glsfirst,%
- GLSfirst,%
- glsplural%
- Glsplural,%
- GLSplural,%
- glsfirstplural,%
- Glsfirstplural,%
- GLSfirstplural,%
- glsname,%
- Glsname,%
- GLSname,%
- glssymbol,%
- Glssymbol,%
- GLSsymbol,%
- glsdesc,%
- Glsdesc,%
- GLSdesc,%
- glsuseri,%
- Glsuseri,%
- GLSuseri,%
- glsuserii,%
- Glsuserii,%
- GLSuserii,%
- glsuseriii,%
- Glsuseriii,%
- GLSuseriii,%
- glsuseriv,%
- Glsuseriv,%
- GLSuseriv,%
- glsuserv,%
- Glsuserv,%
- GLSuserv,%
- glsuservi,%
- Glsuservi,%
- GLSuservi%
- }%
+ \dolistloop{\edglsomo}%
% \end{macrocode}
% Then those which arguments are \oarg{options}\marg{label}\marg{link text}.
% \begin{macrocode}
+ \gdef\edglsomm{}%
+ \listgadd\edglsomm{glsdisp}%
+ \listgadd\edglsomm{glslink}%
\renewcommand{\do}[1]{%
\expandafter\DeclareRobustCommandx\csname ed#1\endcsname[3][1,usedefault]{%
\doedindexlabel%
+ \ifdef{\hypertarget}{%
+ \Hy@raisedlink@left{\hypertarget{pageline.\thepageline}{}}%
+ }{}%
\csname#1\endcsname[counter=pageline,##1]{##2}{##3}%
}%
\expandafter\WithSuffix\expandafter\DeclareRobustCommandx\csname ed#1\endcsname*[3][1,usedefault]{%
\doedindexlabel%
+ \ifdef{\hypertarget}{%
+ \Hy@raisedlink@left{\hypertarget{pageline.\thepageline}{}}%
+ }{}%
\csname#1\endcsname*[counter=pageline,##1]{##2}{##3}%
}%
}%
- \docsvlist{glsdisp,glslink}%
+ \dolistloop{\edglsomm}%
% \end{macrocode}
% Then those which arguments are \oarg{options}\marg{label}.
% \begin{macrocode}
+ \gdef\edglsom{}%
+ \listgadd\edglsom{glsadd}%
\renewcommand{\do}[1]{%
\expandafter\DeclareRobustCommandx\csname ed#1\endcsname[2][1,usedefault]{%
\doedindexlabel%
+ \ifdef{\hypertarget}{%
+ \Hy@raisedlink@left{\hypertarget{pageline.\thepageline}{}}%
+ }{}%
\csname#1\endcsname[counter=pageline,##1]{##2}%
}%
\expandafter\WithSuffix\expandafter\DeclareRobustCommandx\csname ed#1\endcsname*[2][1,usedefault]{%
\doedindexlabel%
+ \ifdef{\hypertarget}{%
+ \Hy@raisedlink@left{\hypertarget{pageline.\thepageline}{}}%
+ }{}%
\csname#1\endcsname*[counter=pageline,##1]{##2}%
}%
}%
- \docsvlist{glsadd}%
- }{}%
+ \dolistloop{\edglsom}%
+% \end{macrocode}
+% \cs{l@noexpands@edgl} is a macro to avoid expanding glossaries macros in \cs{edtext} first argument. It is called by \cs{no@expands}.
+% Its definition is made dynamically.
+% \begin{macro}{\l@noexpands@edgl}
+% \begin{macrocode}
+ \def\l@noexpands@edgl{}%
+ \renewcommand\do[1]{%
+ \xappto\l@noexpands@edgl{%
+ \noexpand\RenewDocumentCommand\csname ed#1\endcsname{omos}{}%
+ }%
+ }%
+ \dolistloop{\edglsomo}%
+ \renewcommand\do[1]{%
+ \xappto\l@noexpands@edgl{%
+ \noexpand\RenewDocumentCommand\csname ed#1\endcsname{omms}{}%
+ }%
+ }%
+ \dolistloop{\edglsomm}%
+ \renewcommand\do[1]{%
+ \xappto\l@noexpands@edgl{%
+ \noexpand\RenewDocumentCommand\csname ed#1\endcsname{oms}{}%
+ }%
+ }%
+ \dolistloop{\edglsom}%
+ }{\let\l@noexpands@edgl\relax}%
}%
% \end{macrocode}
+% \end{macro}
% \section{Verse}
%
% The original code is principally Wayne Sullivan's\index{Sullivan, Wayne}
@@ -18293,7 +18865,7 @@
% \begin{macro}{\ifinstanza}
% The macro \protect\cs{@hangingsymbol} is used to insert a symbol on each hanging of verses. It is set by user level macro \protect\cs{sethangingsymbol}.
%
-% For example, in French typography, the symbol is `['. We obtain it by means of the following code:
+% For example, in French typography, the symbol is \enquote{[}. We obtain it by means of the following code:
%\begin{verbatim}
%\sethangingsymbol{[\,}
%\end{verbatim}
@@ -18405,12 +18977,17 @@
% \end{macro}
% \end{macro}
% \begin{macro}{\managestanza@modulo}
-% Since version 0.13, the \verb+stanzaindentsrepetition+ counter can be used when the indentation is repeated every n verses.
-% The \protect\cs{managestanza@modulo} is a command which modifies the counter stanza@modulo. The command adds 1 to stanza@modulo, but if stanza@modulo is equal to the stanzaindentsrepetition counter, the command restarts it.
+% Since the \verb+stanzaindentsrepetition+ counter can be used when the indentation is repeated every $n$ verses.
+%
+% The \verb+startstanzaindentsrepetition+ counter tells in which line of verse the repetition of indent starts.
+%
+% The \protect\cs{managestanza@modulo} macro modifies the counter stanza@modulo. The command adds 1 to stanza@modulo, but if stanza@modulo is equal to the stanzaindentsrepetition counter, the command restarts it.
%\changes{v0.13.0}{2011/11/08}{New stanzaindentsrepetition counter to repeat stanza indents every \emph{n} verses.}
% % \changes{v1.5.1}{2013/08/16}{Correct stanzaindentsrepetition counter}
% \begin{macrocode}
\newcounter{stanzaindentsrepetition}
+\newcounter{startstanzaindentsrepetition}%
+\setcounter{startstanzaindentsrepetition}{1}%
\newcount\stanza@modulo
\newcommand*{\managestanza@modulo}[0]{%
@@ -18521,6 +19098,7 @@
% \subsection{Main work}
% \begin{macro}{\stanza@line}
% \begin{macro}{\stanza@hang}
+% \begin{macro}{\stanza@indent}
% \begin{macro}{\sza@penalty}
% Now we arrive at the main works. \protect\cs{stanza@line} sets the
% indentation for the line and starts a numbered paragraph---each
@@ -18538,23 +19116,36 @@
% places in the stanza for page breaking.
% \begin{macrocode}
\newcommandx{\stanza@line}[2][1,2,usedefault]{%
- \ifnum\value{stanzaindentsrepetition}=0
+ \stanza@indent%
+ \pstart[#1][#2]\stanza@hang\ignorespaces%
+}%
+\newcommand{\stanza@indent}{%
+ \ifboolexpr{%
+ test {\ifnumequal{\value{stanzaindentsrepetition}}{0}}%
+ or%
+ test {\ifnumless{\number\stanza@count}{\value{startstanzaindentsrepetition}}}%
+ }{%
\ifcsdef{sza@\number\stanza@count @}%
{%
\parindent=\csname sza@\number\stanza@count @\endcsname\stanzaindentbase%
}{%
\led@err@StanzaIndentNotDefined%
}%
- \else
+ }{%
\ifcsdef{sza@\number\stanza@modulo @}{%
- \parindent=\csname sza@\number\stanza@modulo @\endcsname\stanzaindentbase%
+ \parindent=\csname sza@%
+ \the\numexpr%
+ \stanza@modulo%
+ - 1%
+ + \value{startstanzaindentsrepetition}%
+ \relax%
+ @\endcsname\stanzaindentbase%
\managestanza@modulo%
}%
{%
\led@err@StanzaIndentNotDefined%
}%
- \fi
- \pstart[#1][#2]\stanza@hang\ignorespaces%
+ }%
}%
\xdef\stanza@hang{\noexpand\leavevmode\noexpand\startlock
\hangindent\expandafter
@@ -18567,6 +19158,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\@startstanza}
% \begin{macro}{\stanza}
@@ -18605,12 +19197,16 @@
\unexpanded{\newdimen\parindent@beforestanza%
\parindent@beforestanza=\parindent}%Keep in memory the standard \parindent
\global\stanza@count\@ne\stanza@modulo\@ne
- \noexpand\ifnum\expandafter\noexpand
- \csname sza@0@\endcsname=\z@\let\noexpand\stanza@hang\relax
- \let\noexpand\endlock\relax\noexpand\else\interlinepenalty
- \@M\rightskip\z@ plus 1fil\relax\noexpand\fi\noexpand\ifnum
- \expandafter\noexpand\csname szp@0@\endcsname=\z@
- \let\noexpand\sza@penalty\relax\noexpand\fi%
+ \noexpand\ifnum\expandafter\noexpand\csname sza@0@\endcsname=\z@%
+ \def\noexpand\stanza@hang{\unexpanded{\leavevmode\null}}%
+ \let\noexpand\endlock\relax%
+ \noexpand\else%
+ \interlinepenalty%
+ \@M\rightskip\z@ plus 1fil\relax%
+ \noexpand\fi%
+ \noexpand\ifnum\expandafter\noexpand\csname szp@0@\endcsname=\z@%
+ \let\noexpand\sza@penalty%
+ \relax\noexpand\fi%
\def\noexpand&{%
\noexpand\newverse[][]}%
\def\noexpand\&{\noexpand\@stopstanza}%
@@ -18723,8 +19319,50 @@
\setstanzavalues{szp}{0}
% \end{macrocode}
-%
-%
+% \subsection{Dealing with antilabe}
+% \begin{macro}{\firsthalf@antilabe@wd}
+% \begin{macro}{\get@firsthalf@antilabe@wd}
+% \begin{macro}{\antilabe}
+% If the \option{antilabe} option is enabled, after having vboxded
+% the content of \cs{pstart}\ldots{pend} structure, we get
+% the width of the last line of the \cs{pend}.
+% \begin{macrocode}
+\ifantilabe@%
+ \newdimen\firsthalf@antilabe@wd%
+ \newcommand\get@firsthalf@antilabe@wd{%
+ \ifboolexpr{bool {instanza} or bool {inastanzaL} or bool {inastanzaR}}{%
+ \vbadness=10000%
+ \splittopskip=\z@%
+ \ifl@dpairing%
+ \ifledRcol%
+ \setbox0=\copy\csname l@dRcolrawbox\the\l@dnumpstartsR\endcsname%
+ \else%
+ \setbox0=\copy\csname l@dLcolrawbox\the\l@dnumpstartsL\endcsname%
+ \fi%
+ \else%
+ \setbox0=\copy\raw@text%
+ \fi%
+ \dimen0=\dimexpr\ht0+\dp0-\baselineskip\relax%
+ \ifdim\dimen0>0pt%
+ \setbox1=\vsplit0 to \dimen0%
+ \fi%
+ \setbox0=\vbox{\unvbox0\global\setbox1=\lastbox}%
+ \setbox1=\hbox{\noindent\unhbox1}%
+ \global\firsthalf@antilabe@wd=\wd1%
+ }{}%
+ }%
+ \def\beforeantilabe{}%
+ \def\afterantilabe{}%
+ \newcommand{\antilabe}[1]{%
+ \beforeantilabe\hbox to\firsthalf@antilabe@wd{#1\hfill}\afterantilabe%
+ }%
+\else%
+ \let\get@firsthalf@antilabe@wd\relax%
+\fi%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \section{Apparatus of Manuscripts}
% \subsection{User level macro}
@@ -18858,6 +19496,7 @@
\global\numdef{\@msd@c}{\@msd@c+\@ne}%
\csgdef{@msdata@\@msd@c @data}{#1}%
\csxdef{@msdata@\@msd@c @linenumber}{\the\line@num}%
+ \csxdef{@msdata@\@msd@c @sublinenumber}{\the\subline@num}%
\csxdef{@msdata@\@msd@c @abslinenumber}{\the\absline@num}%
\xright@appenditem{\the\absline@num}\to\actionlines@list%
\xright@appenditem{-1010}\to\actions@list%
@@ -18865,6 +19504,7 @@
\global\numdef{\@msd@cR}{\@msd@cR+\@ne}%
\csgdef{@msdata@\@msd@cR @dataR}{#1}%
\csxdef{@msdata@\@msd@cR @linenumberR}{\the\line@numR}%
+ \csxdef{@msdata@\@msd@cR @sublinenumberR}{\the\subline@numR}%
\csxdef{@msdata@\@msd@cR @abslinenumberR}{\the\absline@numR}%
\xright@appenditem{\the\absline@numR}\to\actionlines@listR%
\xright@appenditem{-1010}\to\actions@listR%
@@ -18880,11 +19520,13 @@
\ifcsundef{@msdata@\@msd@c @stoplinenumber}{%
\csxdef{@msdata@\@msd@c @stopabslinenumber}{\the\absline@num}%
\csxdef{@msdata@\@msd@c @stoplinenumber}{\the\line@num}%
+ \csxdef{@msdata@\@msd@c @stopsublinenumber}{\the\subline@num}%
}{}%
\else%
\ifcsundef{@msdata@\@msd@cR @stoplinenumberR}{%
\csxdef{@msdata@\@msd@cR @stopabslinenumberR}{\the\absline@numR}%
\csxdef{@msdata@\@msd@cR @stoplinenumberR}{\the\line@numR}%
+ \csxdef{@msdata@\@msd@cR @stopsublinenumberR}{\the\subline@numR}%
}%
{}%
\fi%
@@ -18907,13 +19549,16 @@
\edef\l@d@nums{%
000|% Start page = we don't print it
\csuse{@msdata@\add@msd@c @linenumber}|% Start line number
- 000|% Start subline number, for now, not used
+ \csuse{@msdata@\add@msd@c @sublinenumber}|% Start subline number
000|% End page number, we don't print it
\ifnumless{\csuse{@msdata@\add@msd@c @stopabslinenumber}}{\csuse{@lastabsline@forpage@\the\page@num}}%
{\csuse{@msdata@\add@msd@c @stoplinenumber}}%End line number if in the same page
- {\csuse{@lastline@forpage@\the\page@num}}%Otherwiser, last number of the page
+ {\csuse{@lastline@forpage@\the\page@num}}%Otherwise, last number of the page
+ |%
+ \ifnumless{\csuse{@msdata@\add@msd@c @stopabslinenumber}}{\csuse{@lastabsline@forpage@\the\page@num}}%
+ {\csuse{@msdata@\add@msd@c @stopsublinenumber}}%End subline number if in the same page
+ {\csuse{@lastsubline@forpage@\the\page@num}}%Otherwise, last subnumber of the page
|%
- 000|% End sub line number, for now, not used
\edfont@info%Font
}%
\@msd@options@fullpagefalse%
@@ -18956,12 +19601,15 @@
\edef\l@d@nums{%
000|% Start page = we don't print it
\csuse{@msdata@\add@msd@cR @linenumberR}|% Start line number
- 000|% Start subline number, for now, not used
+ \csuse{@msdata@\add@msd@cR @sublinenumberR}|% Start subline number, for now, not used
000|% End page number, we don't print it
\ifnumless{\csuse{@msdata@\add@msd@cR @stopabslinenumberR}}{\csuse{@lastline@forpageR@\the\page@numR}}%
{\csuse{@msdata@\add@msd@cR @stoplinenumberR}}%End line number if in the same page
- {\csuse{@lastline@forpageR@\the\page@numR}}%Otherwiser, last number of the page
+ {\csuse{@lastline@forpageR@\the\page@numR}}%Otherwise, last number of the page
|%
+ \ifnumless{\csuse{@msdata@\add@msd@cR @stopabslinenumberR}}{\csuse{@lastline@forpageR@\the\page@numR}}%
+ {\csuse{@msdata@\add@msd@cR @stopsublinenumberR}}%End subline number if in the same page
+ {\csuse{@lastsubline@forpageR@\the\page@numR}}%Otherwise, last number of the page
000|% End sub line number, for now, not used
\edfont@info%Font
}%
@@ -19156,7 +19804,7 @@
%
%
% The following is borrowed, and renamed, from the \protect\package{amsmath}
-% package. See also the CTT thread `eeq and amstex', 1995/08/31, started
+% package. See also the CTT thread \enquote{eeq and amstex}, 1995/08/31, started
% by Keith Reckdahl and ended definitively by David M. Jones.
%
%
@@ -19187,7 +19835,13 @@
% \begin{macrocode}
\newcommand{\addtol@denvbody}[1]{%
\global\l@denvbody\expandafter{\the\l@denvbody#1}}
-
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if@edtabular}
+% A boolean set to true inside a \macpackage' tabular environnment.
+% \begin{macrocode}
+\newif\if@edtabular%
% \end{macrocode}
% \end{macro}
%
@@ -19200,10 +19854,14 @@
%
% \begin{macrocode}
\newcommand{\l@dcollect@body}[1]{%
+ \ifvmode\else%
+ \\%Ensure that we do not have spurious indentation at the very first line, caused by some text before.
+ \fi%
\l@denvbody{\expandafter#1\expandafter{\the\l@denvbody}}%
\edef\processl@denvbody{\the\l@denvbody\noexpand\end{\@currenvir}}%
\l@denvbody\@emptytoks \def\l@dbegin@stack{b}%
\begingroup
+ \@edtabulartrue%
\expandafter\let\csname\@currenvir\endcsname\l@dcollect@@body
\edef\processl@denvbody{\expandafter\noexpand\csname\@currenvir\endcsname}%
\processl@denvbody%
@@ -19214,7 +19872,7 @@
%
% \begin{macro}{\l@dpush@begins}
% When adding a piece of the current environment's contents to \protect\cs{l@denvbody},
-% we scan it to check for additional \protect\cs{begin} tokens, and add a `b' to the
+% we scan it to check for additional \protect\cs{begin} tokens, and add a \enquote{b} to the
% stack for any that we find.
% \begin{macrocode}
\def\l@dpush@begins#1\begin#2{%
@@ -20515,7 +21173,7 @@
% \begin{environment}{edarrayl}
% \begin{environment}{edarrayc}
% \begin{environment}{edarrayr}
-% The `environment' forms for \protect\cs{ltab}, \protect\cs{ctab} and \protect\cs{rtab}.
+% The environment forms for \protect\cs{ltab}, \protect\cs{ctab} and \protect\cs{rtab}.
% \begin{macrocode}
\newenvironment{edarrayl}{\l@dcollect@body\ltab}{}
\newenvironment{edarrayc}{\l@dcollect@body\ctab}{}
@@ -20529,7 +21187,7 @@
% \begin{environment}{edtabularl}
% \begin{environment}{edtabularc}
% \begin{environment}{edtabularr}
-% The `environment' forms for \protect\cs{ltabtext}, \protect\cs{ctabtext} and \protect\cs{rtabtext}.
+% The environment forms for \protect\cs{ltabtext}, \protect\cs{ctabtext} and \protect\cs{rtabtext}.
% \begin{macrocode}
\newenvironment{edtabularl}{\l@dcollect@body\ltabtext}{}
\newenvironment{edtabularc}{\l@dcollect@body\ctabtext}{}
@@ -20984,7 +21642,7 @@
% \begin{macro}{\eledsection*}
% \begin{macro}{\eledsubsection*}
% \begin{macro}{\eledsubsubsection*}
-% And now, the user sectioning commands, which write to the file, and also add content as a ``normal'' line.
+% And now, the user sectioning commands, which write to the file, and also add content as a \enquote{normal} line.
% \begin{macrocode}
\newcommand{\eledchapter}[2][]{%
\disable@familiarnotes%
@@ -21206,7 +21864,7 @@
% \begin{macrocode}
}{}
% \end{macrocode}
-% \section{Page breaking or no page breaking depending of specific lines}
+% \section{Page breaking or no page breaking depending on specific lines}
% By default, page breaks are automatic. However, the user can define lines which will force page breaks, or prevent page breaks around one specific line.
% On the first run, the line-list file records the line number of where the page break is being changed (either forced, or prevented).
% On the next run, page breaks occur either before or after this line, depending on how the user sets the command. The default setting is after the line.
@@ -21497,7 +22155,7 @@
%
% \bibitem[Bur01]{POEMSCOLTUG}
% John Burt.
-% \newblock `Typesetting critical editions of poetry'.
+% \newblock \enquote{Typesetting critical editions of poetry}.
% \newblock \emph{TUGboat}, \textbf{22}, 4, pp 353--361, December 2001.
% \newblock (Code available from CTAN in
% \texttt{macros/latex/contrib/poemscol})
@@ -21520,15 +22178,15 @@
%
% \bibitem[LW90]{EDMACTUG}
% John Lavagnino and Dominik Wujastyk.
-% \newblock `An overview of \edmac: a \textsc{Plain} TeX format for
-% critical editions'.
+% \newblock \enquote{An overview of \edmac: a \textsc{Plain} TeX format for
+% critical editions}.
% \newblock \emph{TUGboat}, \textbf{11}, 4, pp. 623--643, November 1990.
% \newblock (Code available from CTAN in
% \texttt{macros/plain/contrib/edmac})
%
% \bibitem[L\"{u}c03]{EDNOTES}
% Uwe L\"{u}ck.
-% \newblock `\textsf{ednotes}\,---\,critical edition typesetting with LaTeX'.
+% \newblock \enquote{\textsf{ednotes}\,---\,critical edition typesetting with LaTeX}.
% \newblock \emph{TUGboat}, \textbf{24}, 2, pp. 224--236, 2003.
% \newblock (Code available from CTAN in
% \texttt{macros/latex/contrib/ednotes})
diff --git a/Master/texmf-dist/source/latex/reledmac/reledpar.dtx b/Master/texmf-dist/source/latex/reledmac/reledpar.dtx
index 45e86de80ef..b460ec7a227 100644
--- a/Master/texmf-dist/source/latex/reledmac/reledpar.dtx
+++ b/Master/texmf-dist/source/latex/reledmac/reledpar.dtx
@@ -162,7 +162,7 @@
%
% \newcommand{\dtxfilename}{\texttt{reledpar.dtx}}
% \GetFileInfo{reledpar.sty}
-% ^^A Put changes in the right order : see http://tex.stackexchange.com/a/74113/7712
+% ^^A Put changes in the right order: see http://tex.stackexchange.com/a/74113/7712
% \let\org@changes@\changes@
% \def\my@changes v#1.#2.#3\@nil{%
% \org@changes@{v#1.\six@digits{#2}.#3=v#1.#2.#3}%
@@ -188,17 +188,17 @@
% \changes{v0.4.0}{2011/08/03}{No more ledparpatch. All patches are now in the main file.}
% \changes{v0.5.0}{2011/08/21}{Corrections about \protect\cs{section} and other titles in numbered sections}
% \changes{v0.6.0}{2011/08/22}{Be able to us \protect\cs{chapter} in parallel pages.}
-% \changes{v0.7.0}{2011/08/31}{Option `shiftedverses' which make there is no blank between two parallel verses with inequal length.}
+% \changes{v0.7.0}{2011/08/31}{Add \protect\option{shiftedverses} option which makes there is no blank between two parallel verses with inequal length.}
% \changes{v0.8.0}{2011/09/16}{Possibility to have a symbol on each hanging of verses, like in the french typography. Redefine the commande \protect\cs{hangingsymbol} to define the character.}
% \changes{v0.9.0}{2011/10/01}{Possibilty to number the pstart with the commands \protect\cs{numberpstarttrue}.}
% \changes{v0.9.1}{2011/10/02}{The numbering of the pstarts restarts on each \protect\cs{beginnumbering}.}
-% \changes{v0.9.2}{2011/11/08}{Debug : with \protect\cs{Columns}, the hanging indentation now runs on the left columns and the hanging symbol is shown only when \protect\cs{stanza} is used.}
+% \changes{v0.9.2}{2011/11/08}{Debug: with \protect\cs{Columns}, the hanging indentation now runs on the left columns and the hanging symbol is shown only when \protect\cs{stanza} is used.}
% \changes{v0.9.3}{2011/11/18}{\protect\cs{thepstartL} and \protect\cs{thepstartR} use now \protect\cs{bfseries} and not \protect\cs{bf}, which is deprecated and makes conflicts with memoir class.}
% \changes{v0.10.0}{2012/04/04}{\protect\cs{edlabel} commands which start a paragraph are now put in the right place.}
% \changes{v0.10.0}{2012/04/04}{\protect\cs{edlabel} commands on the right side are now correctly indicated.}
% \changes{v1.0.0}{2012/09/14}{Compatibility with eledmac. Change name to eledpar.}
% \changes{v1.0.1}{2012/09/16}{Correction on \protect\cs{numberonlyfirstinline} with lineation by pstart or by page.}
-% \changes{v1.1.0}{2012/09/25}{Shiftedverses becomes shiftedpstarts.}
+% \changes{v1.1.0}{2012/09/25}{The \protect\option{shiftedverses} options becomes \protect\option{shiftedpstarts}.}
% \changes{v1.2.0}{2012/10/15}{Support for \protect\cs{led}\meta{section} commands in parallel texts.}
% \changes{v1.3.2}{2012/12/11}{Debug with some classes.}
% \changes{v1.4.3}{2013/10/27}{Corrects a false hanging verse when a verse is exactly the length of a line.}
@@ -227,15 +227,15 @@
% \changes{v1.16.0}{2015/05/18}{Fix a bug with nofamiliar / nocritical option of eledmac.}
% \changes{v1.16.0}{2015/05/18}{Error message when using \protect\cs{beginnumbering}\ldots\protect\cs{endnumbering} without \protect\cs{pstart}.}
% \changes{v1.16.0}{2015/05/18}{Error message when starting a Leftside/a Rightside while the previous one has not been yet typeset.}
-% \changes{v1.16.0}{2015/05/18}{Error message when calling \protect\cs{Pages} inside `pages' environment and \protect\cs{Columns} inside `pairs' environment.}
+% \changes{v1.16.0}{2015/05/18}{Error message when calling \protect\cs{Pages} inside \protect\env{pages} environment and \protect\cs{Columns} inside \protect\env{pairs} environment.}
% \changes{v1.16.0}{2015/05/18}{New package option sameparallelpagenumber to have the same page number for both left and right side.}
% \changes{v1.16.1}{2015/05/20}{Write information about line-list file version in the correct file.}
% \changes{v1.16.2}{2015/05/29}{Fix a bug when adding empty lines before a \protect\cs{pend} in combination with some specific penalties setting.}
% \changes{v1.17.0}{2015/06/02}{Add compatibility of optional argument of \protect\cs{pstart}/\protect\cs{pend} and \protect\cs{AtEveryPstart}/\protect\cs{AtEveryPend} with two columns mode.}
% \changes{v2.0.0}{2015/07/19}{Many code refactored and moved to \reledmac.}
% \changes{v2.0.0}{2015/07/19}{Package's name becomes \reledpar.}
-% \changes{v2.0.0}{2015/07/19}{Fix some bugs with `sameparallelpagenumber' option.}
-% \changes{v2.0.0}{2015/07/19}{Totally new implementation of `sameparallelpagenumber' option.}
+% \changes{v2.0.0}{2015/07/19}{Fix some bugs with \protect\option{sameparallelpagenumber} option.}
+% \changes{v2.0.0}{2015/07/19}{Totally new implementation of \protect\option{sameparallelpagenumber} option.}
% \changes{v2.1.0}{2015/07/27}{Fix a bug with \protect\cs{setparledgroupnotespacing} with the shiftedpstarts option.}
% \changes{v2.1.0}{2015/07/27}{Fix incompatibility between optional argument of \protect\cs{pstart} and \protect\cs{numberpstarttrue}}
% \changes{v2.1.0}{2015/07/27}{Options to custom empty right page before \protect\cs{Pages}.}
@@ -317,7 +317,7 @@
% \changes{v2.20.0}{2017/08/17}{Fix a bug with \protect\cs{continuousnumberingwithcolumns} when using multiple series of continued numbering text. Now, the line number are correctly reset at each \protect\cs{beginnumbering}.}
% \changes{v2.20.0}{2017/08/17}{Fix a bug with \protect\option{continuousnumberingwithcolumns} and inner / outer notes and line numbering.}
% \changes{v2.20.0}{2017/08/17}{Add \protect\cs{linenumOnlyPagesForColumns} and \protect\cs{linenumOnlyPagesForColumnsR} to tell to print the line numbers associated with a column only on some specific pages (for example, only on right pages).}
-% \changes{v2.20.0}{2017/08/17}{Fix a bug with \protect\option{continuousnumberingwithcolumns} when a \protect\cs{beginnumbering} is called after an other \protect\cs{beginnumbering}\ldots\protect\cs{endnumbering}.}
+% \changes{v2.20.0}{2017/08/17}{Fix a bug with \protect\option{continuousnumberingwithcolumns} when a \protect\cs{beginnumbering} is called after another \protect\cs{beginnumbering}\ldots\protect\cs{endnumbering}.}
% \changes{v2.20.0}{2017/08/17}{Fix a bug with \protect\option{widthliketwocolumns} when manually setting \protect\cs{beforecolumnseparator} and \protect\cs{aftercolumnseparator}.}
% \changes{v2.20.0}{2017/08/17}{Fix compatibility between \protect\option{continuousnumberingwithcolumns} and \protect\cs{numberpstartfalse}.}
% \changes{v2.20.1}{2017/08/23}{Fix bug with \protect\option{continuousnumberingwithcolumns} when left column and right column have not the same size.}
@@ -339,7 +339,16 @@
% \changes{v2.22.2}{2019/01/22}{Fix bug with \protect\cs{Xonlyside} and \protect\cs{onlysideX}}
% \changes{v2.22.3}{2019/07/21}{When using \protect\cs{parindentX} or \protect\cs{Xparindent} and stanza, use the normal indentation in the footnote, not the verse indentation.}
% \changes{v2.23.0}{2020/03/08}{Add \protect\cs{Leftpagehook} and \protect\cs{Rightpagehook}.}
-% \changes{v2.23.0}{2020/03/08}{Add hanging symbol feature into \protect\env{astanza}.}
+% \changes{v2.23.0}{2020/03/08}{Add hanging symbol feature to \protect\env{astanza}.}
+% \changes{v2.23.1}{2020/04/19}{Fix bug when using \protect\package{polyglossia} v1.45 or later.}
+% \changes{v2.24.0}{2020/05/31}{Add startstanzaindentsrepetition feature.}
+% \changes{v2.24.0}{2020/05/31}{Add antilabe feature.}
+% \changes{v2.24.1}{2020/08/19}{Makes \protect\cs{numberstantzatrue} working with \protect\env{astanza}.}
+% \changes{v2.24.1}{2020/08/19}{Fix incompatibility between lineation by \protect\cs{pstart} and (a)stanza.}
+% \changes{v2.24.2}{2020/09/16}{Fix some bugs with lineation by page, when a numbered section starts at the very beginning of page.}
+% \changes{v2.24.3}{2020/11/08}{Fix bug with hanging verse in parallel typesetting.}
+% \changes{v2.25.0}{2020/11/29}{Add compatibility with \protect\cs{linenumannotationothersidetrue} of \protect\macpackage.}.
+% \changes{v2.25.1}{2021/01/21}{\protect\cs{ifsublines@R} migrated to \protect\macpackage}
% ^^A PW added following as the definitions are at some unknown elsewhere
%
% \newcommand{\egstart}{%
@@ -376,10 +385,10 @@
%
%
% \Parpackage provides many tools and options. Normally, they are all documented in this file.
-% Also provided is a help folder, ``\href{examples/.}{examples}''. The folder contains additional examples (although not for all cases).
-% Examples starting by ``3-'' are for basic uses, those starting by ``4-'' are for advanced uses.
+% Also provided is a help folder, \enquote{\href{examples/.}{examples}}. The folder contains additional examples (although not for all cases).
+% Examples starting by \enquote{3-} are for basic uses, those starting by \enquote{4-} are for advanced uses.
%
-% To report bugs, please go to ledmac's GitHub page and click ``New Issue'': \url{https://github.com/maieul/ledmac/issues/}. You must open an account with github.com to access my page (maieul/ledmac). GitHub accounts are free for open-source users. You can report bug in English or in French (better).
+% To report bugs, please go to ledmac's GitHub page and click \enquote{New Issue}: \url{https://github.com/maieul/ledmac/issues/}. You must open an account with github.com to access my page (maieul/ledmac). GitHub accounts are free for open-source users. You can report bug in English or in French (better).
%
% You can subscribe to the \macpackage email list in:\\ \url{http://geekographie.maieul.net/146}
% \end{abstract}
@@ -476,7 +485,7 @@
%
% The \parpackage package lets you typeset two \emph{numbered} texts in
% parallel\footnote{You can use, anyway, \protect\cs{numberlinefalse} to disable printing of line numbers.}.
-% This can be done either as setting the `Leftside' and `Rightside'
+% This can be done either as setting the \enquote{Leftside} and \enquote{Rightside}
% texts in two columns or on facing pages.
% In the paired pages case footnotes are placed at the bottom of the page
% on which they are called out --- that is, footnotes belonging to the left
@@ -520,7 +529,7 @@
%
% If you \protect\cs{maxchunks} is too little
%you can get a \parpackage{} error message along the
-% lines: ``Too many \protect\cs{pstart} without printing. Some text will be lost.''
+% lines: \enquote{Too many \protect\cs{pstart} without printing. Some text will be lost.}
% then you will have to either increase \protect\cs{maxchunks} or use the
% parallel printing commands (\protect\cs{Columns} or \protect\cs{Pages}) more frequently.
%
@@ -575,7 +584,7 @@
% and right columns, respectively. By default, these are: \\
% \verb?\setlength{\Lcolwidth}{0.45\textwidth}? \\
% \verb?\setlength{\Rcolwidth}{0.45\textwidth}? \\
-% They may be adjusted if one text tends to be `bulkier' than the other.
+% They may be adjusted if one text tends to be \enquote{bulkier} than the other.
% \subsubsection{Column's separator}
% \DescribeMacro{\columnrulewidth}
% \DescribeMacro{\columnseparator}
@@ -665,9 +674,9 @@
% \file{examples/4-reledpar_column_mix_with_not_column-continuous-numbering.tex}
% covers all these cases.
% \subsection{Note about \cs{AtEveryPstart*} and \cs{AtEveryPend*}}
-% The content of \cs{AtEveryPstart} / \cs{AtEveryPend} (without star) is added before every \cs{pstart} / after every \cs{pend}, making distinction between the left and the right side.
+% The content of \cs{AtEveryPstart} / \cs{AtEveryPend} (without star) is added before every \cs{pstart} / after every \cs{pend}, distinguishing between the left and the right side.
%
-% The content of \cs{AtEveryPstart*} / \cs{AtEveryPend*} (with star) is added before every \cs{pstart} / after every \cs{pend}, but there is no distinction between the left and the right sides: the content is inserted \enquote{for the two columns as a whole}.
+% The content of \cs{AtEveryPstart*} / \cs{AtEveryPend*} (with star) is added before every \cs{pstart} / after every \cs{pend}, but there is no distinction between the left and right sides: the content is inserted \enquote{for the two columns as a whole}.
%
% However, as this content is also added when we typeset pages in parallel, \reledmac must add it once for left \cs{pstart} and once for right \cs{pstart}.
% So if you use it to add vertical spacing, it will be problematic in parallel columns, as you will have the vertical spacing two times (vertical spacing will be twice as large as expected).
@@ -725,14 +734,14 @@
% necessary.
% \subsubsection[Way of synchronizing]{Way of synchronizing\footnote{There is a French version of this article on \url{http://geekographie.maieul.net/185}.}}\label{syncoption}
% Synchronization of left and right texts in parallel processing
-% requires some `numbered' auxiliary files to be written (namely \verb+.1+,
+% requires some \enquote{numbered} auxiliary files to be written (namely \verb+.1+,
%\verb+.1R+, \verb+.2+, \verb+.2R+, and so forth), the content of which may change as long
%as synchronization is not complete. This usually requires \LaTeX\ to be
%run several times. Therefore, it is advised to use in conjunction
%utilities such as latexmk to ensure that synchronization is complete.
%
%Numbered paragraphs which are contained between the \cs{pstart} and \cs{pend}
-%macros are thereafter called `chunks'.
+%macros are thereafter called \enquote{chunks}.
%
%In short, the default setting is designed in such a way that
%corresponding chunks of text are always kept in synchronization, even
@@ -810,7 +819,7 @@
%the \option{nosyncpstarts} setting.
%
%Please note that every change of synchronization setting resets the
-%content of the `numbered' auxiliary files to make sure that \parpackage
+%content of the \enquote{numbered} auxiliary files to make sure that \parpackage
%does not try to make the synchronization with wrong calculations.
% \subsubsection{Page number}\label{sameparallelpagenumber}
% \changes{v1.15.0}{2015/05/18}{Add sameparallelpagenumber option.}
@@ -818,7 +827,7 @@
% This means that pages are numbered continuously following printed-book conventions: from left-hand to right-hand side, left-hand pages having even numbers, right-hand pages having odd numbers.
%
% However, you can use the package option \verb+sameparallelpagenumber+ to have the same page number for both left and right side.
-% In this case, this setting will apply only for pages typeset by \protect\cs{Pages}, not for ``normal'' pages.
+% In this case, this setting will apply only for pages typeset by \protect\cs{Pages}, not for \enquote{normal} pages.
%
% Please also read advising in \reff{par@page}.
%
@@ -857,7 +866,7 @@
% In this case, the content of \cs{Pages} will start on a left side, without any spurious empty page, and the left pages will be odd (and not event like in normal way), the first one being \verb+1+.
%
% \subsection{Critical and familiar footnotes}
-% Of course, in ``Facing pages'', the \macpackage's both critical and familiar footnotes can be used.
+% Of course, in \enquote{Facing pages}, the \macpackage's both critical and familiar footnotes can be used.
% However, some specific points must be taken into consideration.
% \subsubsection{Notes height setting}
% Since \protect\package{eledpar} v1.13.0, long notes in facing pages can flow from left to right pages, and \emph{vice-versa}.
@@ -983,7 +992,7 @@
% the second section, and so on), and then creates a new version of
% this auxiliary file to collect information during this run.
% Separate auxiliary files are maintained for right hand texts and
-% these are named \meta{jobname}.\file{nnR}, using the `R' to distinguish
+% these are named \meta{jobname}.\file{nnR}, using the \enquote{R} to distinguish
% them from the left hand and serial (non-parallel) texts.
%
% \DescribeMacro{\memorydump}
@@ -1035,9 +1044,10 @@
% causes the numbering of that particular line to be skipped. This can
% useful if you are putting some kind of marker (even if it is only a
% blank line) between stanzas. Remember, parallel texts must be numbered
-% and this provides a way to slip in an ``unnumbered'' line.
-% \DescribeMacro{\hidenumbering}
+% and this provides a way to slip in an \enquote{unnumbered} line.
+%
% \changes{v1.21.0}{2015/04/13}{Add \protect\cs{hidenumbering}}
+% \DescribeMacro{\hidenumbering}
% When inserted into a numbered line the macro \protect\cs{hidenumbering} causes
% the number for that particular line to be hidden; namely, no line number will print.
% Note that if you use it in \protect\cs{stanza}, you must call it at the beginning of the verse.
@@ -1137,7 +1147,7 @@
%
% \subsection{Line flag}
% \DescribeMacro{\setRlineflag}\label{Rlineflag}
-% A ``R'' is appended to the line numbers of the
+% A \enquote{R} is appended to the line numbers of the
% right texts.
% This may be useful for parallel columns but for parallel pages it might
% be more appropriate to redefine it using \protect\cs{setRlineflag}\marg{flag}.
@@ -1243,8 +1253,8 @@
% The difference between \env{astanza} and \cs{stanza} is, that the latter syncs
% verse by verse, while the environment syncs stanza by stanza.
%
-% If you get an error message along the lines of `Missing number,
-% treated as zero \protect\cs{sza@0@}' it is because you have forgotten to use
+% If you get an error message along the lines of \enquote{Missing number,
+% treated as zero \protect\cs{sza@0@}} it is because you have forgotten to use
% \protect\cs{setstanzaindents} to set the stanza indents.
%
% As \env{astanza} is a specific type of \cs{pstart}\ldots\cs{pend} structure, you can:
@@ -1366,7 +1376,7 @@
% a stream typeset pages. It was not designed for typesetting two texts
% in parallel, where it has to alternate from one to the other. Further,
% \TeX essentially processes its input one paragraph at a time --- it is
-% very difficult to get at the `internals' of a paragraph such as the
+% very difficult to get at the \enquote{internals} of a paragraph such as the
% individual lines in case you want to number them or put some mark at the
% start or end of the lines.
%
@@ -1395,7 +1405,7 @@
% \begin{macrocode}
%<*code>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{reledpar}[2020/03/08 v2.23.0 reledmac extension for parallel texts]%
+\ProvidesPackage{reledpar}[2021/01/21 v2.25.1 reledmac extension for parallel texts]%
% \end{macrocode}
% \subsection{Package's requirement}
@@ -1418,7 +1428,7 @@
\def\@par@this@sync@option{}%
% \end{macrocode}
% \end{macro}
-% With the option `shiftedpstarts' a long pstart on the left side (or on the right side) does not make a blank on the corresponding pstart, but the blank is put on the bottom of the page. Consequently, the pstarts on the parallel pages are shifted, but the shift stops at every end of pages.
+% With the \option{shiftedpstarts} option a long pstart on the left side (or on the right side) does not make a blank on the corresponding pstart, but the blank is put on the bottom of the page. Consequently, the pstarts on the parallel pages are shifted, but the shift stops at every end of pages.
% \begin{macro}{\ifshiftedpstarts}
% \begin{macrocode}
\newif\ifshiftedpstarts
@@ -1428,7 +1438,7 @@
}%
% \end{macrocode}
% \end{macro}
-% With the option `advancedshiftedpstarts' a long pstart on the left side (or on the right side) does not make a blank on the corresponding pstart, but the blank is put on the bottom of the page. Consequently, the pstarts on the parallel pages are shifted, but the shift stops at every end of pages.
+% With the \option{advancedshiftedpstarts} option a long pstart on the left side (or on the right side) does not make a blank on the corresponding pstart, but the blank is put on the bottom of the page. Consequently, the pstarts on the parallel pages are shifted, but the shift stops at every end of pages.
% Differing to \option{shiftedpstarts}, the pstart shift are not counted to determine when cutting the page. That could help to avoid page with blank lines at the bottom.
% \begin{macro}{\ifshiftedpstarts}
% \begin{macrocode}
@@ -1513,8 +1523,8 @@
% As noted above, much of the code is a duplication of the original
% \macpackage{} code to handle the extra box(es) for the right hand side text,
% and sometimes for the left hand side as well. In order to distinguish
-% we use `R' or `L' in the names of macros for the right and left code.
-% The specifics of `L' and `R' are normally hidden from the user by
+% we use \enquote{R} or \enquote{L} in the names of macros for the right and left code.
+% The specifics of \enquote{L} and \enquote{R} are normally hidden from the user by
% letting the \verb?Leftside? and \verb?Rightside? environments set things
% up appropriately.
%
@@ -1571,6 +1581,15 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\led@err@polyglossiaTooOld}
+% \begin{macrocode}
+\newcommand{\led@err@polyglossiaTooOld}{%
+ \reledpar@error{You use the polyglosia package.%
+ \MessageBreak However, reledpar requires version 2020/04/08 v1.49 or later of the polyglossia package.%
+ \MessageBreak Please update your polyglossia version}{\@ehc}%
+}%
+% \end{macrocode}
+% \end{macro}
% \begin{macro}{\led@err@BadLeftRightPstarts}
% \begin{macrocode}
\newcommand*{\led@err@BadLeftRightPstarts}[2]{%
@@ -1728,8 +1747,8 @@
% \begin{macro}{\unhnamebox}
% \begin{macro}{\unvnamebox}
% \begin{macro}{\namebox}
-% A set of macros for creating and using `named' boxes; the macros are called
-% after the regular box macros, but including the string `name'.
+% A set of macros for creating and using \enquote{named} boxes; the macros are called
+% after the regular box macros, but including the string \enquote{name}.
% \begin{macrocode}
\providecommand*{\newnamebox}[1]{%
\expandafter\newbox\csname #1\endcsname}
@@ -1771,7 +1790,7 @@
%
% \begin{macro}{\newnamecount}
% \begin{macro}{\usenamecount}
-% Macros for creating and using `named' counts.
+% Macros for creating and using \enquote{named} counts.
% \begin{macrocode}
\providecommand*{\newnamecount}[1]{%
\expandafter\newcount\csname #1\endcsname}
@@ -1787,8 +1806,8 @@
% \begin{macro}{\section@numR}
% This is the right side equivalent of \protect\cs{section@num}.
%
-% Each section will read and write an associated `line-list
-% file', containing information used to do the numbering. Normally
+% Each section will read and write an associated \enquote{line-list
+% file}, containing information used to do the numbering. Normally
% the file will be called \meta{jobname}\file{.nn}, where \file{nn} is the
% section number. However, for right side texts the file is called
% \meta{jobname}\file{.nnR}. The \protect\cs{extensionchars} applies to the
@@ -2289,7 +2308,7 @@
% \begin{macro}{\linenumincrementR}
% \begin{macro}{\firstsublinenumR}
% \begin{macro}{\sublinenumincrementR}
-% And the `R` suffixed version.
+% And the \enquote{R} suffixed version.
% \begin{macrocode}
\newcommand\firstlinenumR[1]{%
\setcounter{firstlinenumR}{#1}%
@@ -2380,37 +2399,62 @@
% \protect\cs{rightlinenumR} by introducing \protect\cs{l@dlinenumR}}
% \begin{macrocode}
\newcommand*{\leftlinenumR}{%
- \l@dlinenumR
- \kern\linenumsep}
+ \l@dlinenumR%
+ \kern\linenumsep%
+}%
\newcommand*{\rightlinenumR}{%
- \kern\linenumsep
- \l@dlinenumR}
+ \kern\linenumsep%
+ \l@dlinenumR%
+}%
+
+
\newcommand*{\l@dlinenumR}{%
\numlabfont%
- \ifdefstring{\Xlinenumannotationposition@side}{before}{%
- \l@wrap@ifnotemptybox{\Xwraplinenumannotation@side}{%
- \csuse{annotR@\the\absline@numR @\the\section@numR}%
- }%
- }{}%
+ \unless\iflinenumannotationotherside%
+ \ifdefstring{\Xlinenumannotationposition@side}{before}{%
+ \l@wrap@ifnotemptybox{\Xwraplinenumannotation@side}{%
+ \csuse{annotR@\the\absline@numR @\the\section@numR}%
+ }%
+ }{}%
+ \fi%
\linenumrepR{\line@numR}\@Rlineflag%
\ifsublines@R
\ifnum\subline@numR>\z@
\unskip\fullstop\sublinenumrepR{\subline@numR}%
\fi
\fi%
- \ifdefstring{\Xlinenumannotationposition@side}{after}{%
- \l@wrap@ifnotemptybox{\Xwraplinenumannotation@side}{%
- \csuse{annotR@\the\absline@numR @\the\section@numR}%
- }%
- }{}%
+ \unless\iflinenumannotationotherside%
+ \ifdefstring{\Xlinenumannotationposition@side}{after}{%
+ \l@wrap@ifnotemptybox{\Xwraplinenumannotation@side}{%
+ \csuse{annotR@\the\absline@numR @\the\section@numR}%
+ }%
+ }{}%
+ \fi%
}%
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
-%
-%
+% \begin{macro}{\leftlinenumannotationR}
+% \begin{macro}{\rightlinenumannotationR}
+% \cs{rightlinenumannotationR} and \cs{leftlinenumannotationR} are the same as not suffixed version, but for right side.
+% \begin{macrocode}
+\newcommand*{\leftlinenumannotationR}{%
+ \l@wrap@ifnotemptybox{\Xwraplinenumannotation@side}{%
+ \csuse{annot@\the\absline@numR @\the\section@numR}%
+ }%
+ \kern\linenumsep%
+}%
+\newcommand*{\rightlinenumannotationR}{%
+ \kern\linenumsep%
+ \l@wrap@ifnotemptybox{\Xwraplinenumannotation@side}{%
+ \csuse{annot@\the\absline@numR @\the\section@numR}%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
% \subsection{Line-number counters and lists}
% \subsubsection{Correspond to those in \macpackage for regular or left text}
% We need another set of counters and lists for the right text,
@@ -2419,7 +2463,6 @@
% \begin{macro}{\line@numR}
% \begin{macro}{\subline@numR}
% \begin{macro}{\absline@numR}
-% \begin{macro}{\ifsublines@R}
% The count \protect\cs{line@numR} stores the line number that is used in
% the right text's marginal line numbering and in notes.
% The count \protect\cs{subline@numR} stores
@@ -2429,18 +2472,15 @@
% of the right text section: that is, the number we have actually printed,
% no matter what numbers we attached to them.
%
-% The boolean \cs{ifsublines@R} is set to true when we start subline on rightside.
% \begin{macrocode}
\newcount\line@numR
\newcount\subline@numR
\newcount\absline@numR
-\newif\ifsublines@R%
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
-% \end{macro}
%
% \begin{macro}{\line@listR}
% \begin{macro}{\insertlines@listR}
@@ -2885,11 +2925,21 @@
%
% \begin{macrocode}
\renewcommand*{\@pend}[1]{%
- \ifbypstart@\global\line@num=0\fi%
- \xright@appenditem{#1}\to\linesinpar@listL}
+ \ifbypstart@%
+ \unless\ifinstanza%
+ \global\line@num=0%
+ \fi%
+ \fi%
+ \xright@appenditem{#1}\to\linesinpar@listL%
+}%
\renewcommand*{\@pendR}[1]{%
- \ifbypstart@R\global\line@numR=0\fi
- \xright@appenditem{#1}\to\linesinpar@listR}
+ \ifbypstart@R%
+ \unless\ifinstanzaR%
+ \global\line@numR=0%
+ \fi%
+ \fi%
+ \xright@appenditem{#1}\to\linesinpar@listR%
+}%
% \end{macrocode}
% \end{macro}
@@ -3010,7 +3060,6 @@
% line-list file, to mark the start of a new text line.
% \begin{macrocode}
\newcommand*{\new@lineL}{%
- \set@this@c@page%
\ifnumberline%
\write\linenum@out{\string\@nl[\the\@this@c@page][\thepage]}%
\fi%
@@ -3022,7 +3071,6 @@
% line-list file, to mark the start of a new text line.
% \begin{macrocode}
\newcommand*{\new@lineR}{%
- \set@this@c@page%
\ifnumberline%
\write\linenum@outR{\string\@nl[\the\@this@c@page][\thepage]}%
\fi%
@@ -3150,7 +3198,7 @@
\unless\ifnofamiliar@%
% \end{macrocode}
% \paragraph{Managing correct number}\label{familiarfootnotenumber}
-% One problem with using familiar footnotes in parallel typesetting is the fact that the order of reading notes is not the same as the order they are typset, because \LaTeX\ reads first all the notes on one side, then all the notes on the other side.
+% One problem with using familiar footnotes in parallel typesetting is the fact that the order of reading notes is not the same as the order they are typeset, because \LaTeX\ reads first all the notes on one side, then all the notes on the other side.
% Then, however, \LaTeX\ alternates between typesetting left-side note and right-side notes.
% Consequently, if we do nothing special, the note numbers are sorted in the reading order, not in the typesetting order.
% So we could obtain something like 1,3,2,5,4.
@@ -3304,7 +3352,7 @@
% We also dump and restore the value of the booleans \protect\cs{ifnumberpstart} and \protect\cs{ifnumberline}.
% So, first step, creating the lists.
-% Here, ``pc'' means ``public counters''.
+% Here, \enquote{pc} means \enquote{public counters}.
% \begin{macro}{\list@pstartL@pc}
% \begin{macro}{\list@pstartR@pc}
% \begin{macrocode}
@@ -3323,12 +3371,14 @@
\xright@appenditem{\the\c@pstartL}\to\list@pstartL@pc%
\global\cslet{numberpstart@L\the\l@dnumpstartsL}{\ifnumberpstart}%
\global\cslet{numberline@L\the\l@dnumpstartsL}{\ifnumberline}%
+ \global\cslet{linenumannotationotherside@L\the\l@dnumpstartsL}{\iflinenumannotationotherside}%
}%
\def\dump@pstartR@pc{%
\xright@appenditem{\the\c@pstartR}\to\list@pstartR@pc%
\global\cslet{numberpstart@R\the\l@dnumpstartsR}{\ifnumberpstart}%
\global\cslet{numberline@R\the\l@dnumpstartsR}{\ifnumberline}%
+ \global\cslet{linenumannotationotherside@R\the\l@dnumpstartsR}{\iflinenumannotationotherside}%
}%
% \end{macrocode}
@@ -3388,7 +3438,7 @@
% \end{macrocode}
% \end{macro}
% \changes{v2.0.0}{2015/07/19}{Deleting the old system of managing parallel chapter, keep only the new one with \protect\cs{patchcmd}.}
-% The \verb?pages? environment additionally sets the `column' widths to the
+% The \verb?pages? environment additionally sets the \enquote{column} widths to the
% \protect\cs{textwidth} (as known at the time the package is called). In this environment, there are two text in parallel on 2 pages.
% \begin{macrocode}
\newenvironment{pages}{%
@@ -3415,24 +3465,6 @@
% \end{environment}
%
%
-% \begin{macro}{ifinstanzaL}
-% \begin{macro}{ifinstanzaR}
-% These boolean tests are switched by the \protect\cs{stanza} command, using either the left or right side.
-% \begin{macrocode}
- \newif\ifinstanzaL
- \newif\ifinstanzaR
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \begin{macro}{ifinastanzaL}
-% \begin{macro}{ifinastanzaR}
-% These boolean tests are switched by the \protect\env{astanza} environnement, using either the left or right side.
-% \begin{macrocode}
- \newif\ifinastanzaL%
- \newif\ifinastanzaR%
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
% \begin{environment}{Leftside}
% Within the \verb?pairs? and \verb?pages? environments the left and
% right hand texts are within \verb?Leftside? and \verb?Rightside?
@@ -3815,6 +3847,7 @@
\@at@end@every@pend%
\endgraf\global\num@lines=\prevgraf\egroup%
\global\par@line=0%
+ \get@firsthalf@antilabe@wd%
% \end{macrocode}
% End the group that was begun in the \protect\cs{pstart}.
% \begin{macrocode}
@@ -3876,6 +3909,7 @@
\@at@end@every@pend%
\endgraf\global\num@linesR=\prevgraf\egroup%
\global\par@lineR=0%
+ \get@firsthalf@antilabe@wd%
\endgroup%
\ignorespaces%
\@oldnobreak%
@@ -3964,7 +3998,7 @@
% \begin{macro}{\@donetotallinesL}
% \begin{macro}{\@donereallinesR}
% \begin{macro}{\@donetotallinesR}
-% We need to know the number of `real' lines output (i.e., those that
+% We need to know the number of \enquote{real} lines output (i.e., those that
% have been input by the user), and the total lines output (which includes
% any blank lines output for synchronisation).
% \begin{macrocode}
@@ -3993,6 +4027,7 @@
\newcommand*{\do@lineL}{%
\letcs{\ifnumberpstart}{numberpstart@L\the\l@dpscL}%
\letcs{\ifnumberline}{numberline@L\the\l@dpscL}%
+ \letcs{\iflinenumannotationotherside}{linenumannotationotherside@L\the\l@dpscL}%
\advance\countLline \@ne%
\ifvbox\namebox{l@dLcolrawbox\the\l@dpscL}%
{\vbadness=10000%
@@ -4081,7 +4116,7 @@
% \end{macro}
% \begin{macro}{\print@eledsectionL}
% \changes{v1.12.0}{2015/02/23}{Compatibility with \LuaLaTeX\ RTL languages.}
-% \changes{v1.12.1}{2015/02/27}{Fixes bug with \LuaLaTeX\ RTL \protect\cs{eledsection}.}
+% \changes{v1.12.1}{2015/02/27}{Fix bug with \LuaLaTeX\ RTL \protect\cs{eledsection}.}
% \protect\cs{print@eledsectionL} is for line with macro code.
% \begin{macrocode}
\def\print@eledsectionL{%%
@@ -4187,6 +4222,7 @@
\let\sublinenumrep\sublinenumrepR%
\letcs{\ifnumberpstart}{numberpstart@R\the\l@dpscR}%
\letcs{\ifnumberline}{numberline@R\the\l@dpscR}%
+ \letcs{\iflinenumannotationotherside}{linenumannotationotherside@R\the\l@dpscR}%
\ledRcol@true%
\advance\countRline \@ne%
\ifvbox\namebox{l@dRcolrawbox\the\l@dpscR}%
@@ -4473,7 +4509,7 @@
\global\resumenumberingR@startfalse%
\add@msdata@firstlineofpage%
\else
- \ifnum\next@actionR<-4999\relax % 9/05 added relax here
+ \ifnum\next@actionR<-4999\relax%
\@l@dtempcnta=-\next@actionR
\advance\@l@dtempcnta by -5001\relax
\ifsublines@R
@@ -4605,8 +4641,14 @@
\if@twocolumn
\if@firstcolumn
\gdef\l@dld@ta{\llap{{\leftlinenumR}}}%
+ \iflinenumannotationotherside%
+ \gdef\l@drd@ta{\rlap{{\rightlinenumannotationR}}}%
+ \fi%
\else
\gdef\l@drd@ta{\rlap{{\rightlinenumR}}}%
+ \iflinenumannotationotherside%
+ \gdef\l@dld@ta{\llap{{\leftlinenumannotationR}}}%
+ \fi%
\fi
\else
\ifboolexpr{bool {l@dprintingcolumns} and test {\ifnumgreater{\line@margin@columnsR}{\m@ne}}}%
@@ -4631,8 +4673,14 @@
{%
\ifodd\@l@dtempcntb%
\gdef\l@drd@ta{\rlap{{\rightlinenumR}}}%
+ \iflinenumannotationotherside%
+ \gdef\l@dld@ta{\llap{{\leftlinenumannotationR}}}%
+ \fi%
\else%
\gdef\l@dld@ta{\llap{{\leftlinenumR}}}%
+ \iflinenumannotationotherside%
+ \gdef\l@drd@ta{\rlap{{\rightlinenumannotationR}}}%
+ \fi%
\fi%
}%
\fi
@@ -4649,7 +4697,7 @@
% \end{macro}
% \end{macro}
% \subsection{Pstart number printing in side}
-% The printing of the pstart number is like in \macpackage, with two differences :
+% The printing of the pstart number is like in \macpackage, with two differences:
%\begin{itemize}
%\item Some commands have versions suffixed by R or L.
%\item The \protect\cs{affixpstart@num} and \protect\cs{affixpstart@numR} commands are called in the \protect\cs{Pages} command. Consequently, the \verb|pstartL| and \verb|pstartR| counters must be reset at the beginning of this command.
@@ -5338,8 +5386,6 @@
\newcommand{\inserthangingsymbolL}{%
\ifinserthangingsymbol%
\ifinstanzaL%
- \hskip \@ifundefined{sza@0@}{0}{\expandafter%
- \noexpand\csname sza@0@\endcsname}\stanzaindentbase%
\@hangingsymbol%
\fi%
\ifinastanzaL%
@@ -5350,8 +5396,6 @@
\newcommand{\inserthangingsymbolR}{%
\ifinserthangingsymbolR%
\ifinstanzaR%
- \hskip \@ifundefined{sza@0@}{0}{\expandafter%
- \noexpand\csname sza@0@\endcsname}\stanzaindentbase%
\@hangingsymbol%
\fi%
\ifinastanzaR%
@@ -5390,6 +5434,7 @@
\fi%
\catcode`\&\active
\global\stanza@count\@ne\stanza@modulo\@ne
+ \@advancestanzanumber%
\newdimen\parindent@beforestanza%
\parindent@beforestanza=\parindent%Keep in memory the standard \parindent
\ifnum\usenamecount{sza@0@}=\z@
@@ -5414,6 +5459,7 @@
{\pstart[][\at@every@stanza]\at@start@every@stanza}%
{\pstart[#1][#2]\at@start@every@stanza}%
\@astanza@line
+ \@insertstanzanumber%
\let\par\relax\ignorespaces%No paragraph in verses
}{%
\global\undef\parindent@beforestanza%
@@ -5443,22 +5489,7 @@
% the paragraph style --- each line is treated as a paragraph.
% \begin{macrocode}
\newcommand*{\@astanza@line}{%
- \ifnum\value{stanzaindentsrepetition}=0
- \ifcsdef{sza@\number\stanza@count @}%
- {%
- \parindent=\csname sza@\number\stanza@count @\endcsname\stanzaindentbase%
- }{%
- \led@err@StanzaIndentNotDefined%
- }%
- \else
- \ifcsdef{sza@\number\stanza@modulo @}{%
- \parindent=\csname sza@\number\stanza@modulo @\endcsname\stanzaindentbase%
- \managestanza@modulo%
- }%
- {%
- \led@err@StanzaIndentNotDefined%
- }%
- \fi
+ \stanza@indent%
\endgraf
\stanza@hang%
\ignorespaces}
@@ -5599,20 +5630,21 @@
% If use \protect\package{polyglossia}
% \changes{v1.8.0}{2014/08/05}{Correct left/right language setting with polyglossia.}
% \changes{v1.9.0}{2014/09/16}{Debug left/right language switching with polyglossia. Do not write in .aux file when setting left/right lines.}
-% \changes{v2.22.4}{2019/11/04}{Provide compatibility with last version of polyglossia (v1.45).}
-% \changes{v2.23.0}{2020/03/08}{Restore compatibility with version of polyglossia prior to v1.45.}
+% \changes{v2.22.4}{2019/11/04}{Provide compatibility with the latest version of polyglossia (v1.45).}
+% \changes{v2.23.0}{2020/03/08}{Restore compatibility with versions of polyglossia prior to v1.45.}
% \begin{macrocode}
- { \let\old@otherlanguage\otherlanguage%
+ {%
+ \@ifpackagelater{polyglossia}{2020/04/08}{}{\led@err@polyglossiaTooOld}%
+ \let\old@otherlanguage\otherlanguage%
\renewcommand{\otherlanguage}[2][]{%
- \ifdefined\xpg@set@group@aux%
- \xpg@set@group@aux%
- \fi%
+ \xpg@set@group@aux%
\selectlanguage[#1]{#2}%
\ifledRcol \gdef\theledlanguageR{#2}%
\else \gdef\theledlanguageL{#2}%
\fi}%
\renewcommand{\l@duselanguage}[1]{%
- \csuse{no\languagename @numbers}\select@language{#1}%
+ \csuse{no\languagename @numbers}%
+ \@select@language{#1}%
}%
\gdef\theledlanguageL{\xpg@main@language}%
\gdef\theledlanguageR{\xpg@main@language}%
@@ -5953,12 +5985,16 @@
\@writelinesinparR
\check@pstarts
\ifbypstart@%
- \write\linenum@out{\string\@set[1]}
- \resetprevline@
+ \unless\ifinstanza%
+ \write\linenum@out{\string\@set[1]}%
+ \resetprevline@%
+ \fi%
\fi
\ifbypstart@R
- \write\linenum@outR{\string\@set[1]}
- \resetprevline@
+ \unless\ifinstanza%
+ \write\linenum@outR{\string\@set[1]}%
+ \resetprevline@%
+ \fi%
\fi
\Columns@print@after@pend%
\repeat
@@ -6213,7 +6249,7 @@
% \end{macro}
% \end{macro}
% \begin{macro}{\checkpb@columns}
-% \protect\cs{checkpb@columns} prevent or make pagebreaking in columns, depending of the use of \protect\cs{ledpb} or \protect\cs{lednopb}.
+% \protect\cs{checkpb@columns} prevent or make pagebreaking in columns, depending on the use of \protect\cs{ledpb} or \protect\cs{lednopb}.
% \begin{macrocode}
\newcommand{\checkpb@columns}{%
@@ -6288,8 +6324,8 @@
% \begin{macro}{setnotepositionliketwocolumns@R}
% The \protect\cs{setwidthliketwocolumns} macro is called in \protect\cs{beginnumbering} in a \textbf{non-parallel}
% typesetting context, to fix the width of the lines to be vertically aligned with parallel columns. It is also called at the beginning of a note's group, if some options are enabled.
-% The \protect\cs{setposition\ldots} macros are called in \protect\cs{beginnumbering} in a \textbf{non- parallel} typesetting context to fix the position of the lines.
-% The \protect\cs{setnoteposition\ldots} macros are called in \protect\cs{xxxfootstart} in a \textbf{non- parallel} typesetting context to fix the position of notes block.
+% The \protect\cs{setposition\ldots} macros are called in \protect\cs{beginnumbering} in a \textbf{non-parallel} typesetting context to fix the position of the lines.
+% The \protect\cs{setnoteposition\ldots} macros are called in \protect\cs{xxxfootstart} in a \textbf{non-parallel} typesetting context to fix the position of the notes block.
% \begin{macrocode}
\newcommand{\setwidthliketwocolumns}{%
\get@intercolumns@width%As \columns is not necessary called before \setwidthliketwocolumns
@@ -7361,8 +7397,10 @@
\ifnum\l@dnumpstartsR>\l@dpscR
\writtenlinesRfalse
\ifbypstart@R
+ \unless\ifinstanzaR%
\global\line@numR=0%
\resetprevline@%
+ \fi%
\fi
\csuse{after@pendR@\the\l@dpscR}%
\global\csundef{after@pendR@\the\l@dpscR}%
@@ -7703,8 +7741,8 @@
% \addcontentsline{toc}{section}{References}
% \bibitem[LW90]{EDMACTUG}
% John Lavagnino and Dominik Wujastyk.
-% \newblock `An overview of \edmac: a \textsc{Plain} TeX format for
-% critical editions'.
+% \newblock \enquote{An overview of \edmac: a \textsc{Plain} TeX format for
+% critical editions}.
% \newblock \emph{TUGboat}, \textbf{11}, 4, pp. 623--643, November 1990.
% \newblock (Code available from CTAN in
% \texttt{macros/plain/contrib/edmac})
diff --git a/Master/texmf-dist/source/latex/repltext/repltext.dtx b/Master/texmf-dist/source/latex/repltext/repltext.dtx
index b75a3c1b8fe..9a116df516a 100644
--- a/Master/texmf-dist/source/latex/repltext/repltext.dtx
+++ b/Master/texmf-dist/source/latex/repltext/repltext.dtx
@@ -1,7 +1,7 @@
% \iffalse meta-comment
%
-% Copyright (C) 2014 by Scott Pakin <scott+repl@pakin.org>
-% ---------------------------------------------------------
+% Copyright (C) 2014-2020 Scott Pakin <scott+repl@pakin.org>
+% ----------------------------------------------------------
%
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3c of this license
@@ -22,11 +22,12 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{repltext}
%<*package>
- [2014/04/11 v1.0 PDF replacement text]
+ [2020/09/25 v1.1 PDF replacement text]
%</package>
%
%<*driver>
\documentclass{ltxdoc}
+\usepackage[T1]{fontenc}
\usepackage{repltext}
\usepackage{graphicx}
\usepackage{color}
@@ -46,13 +47,13 @@
pdfauthor={Scott Pakin},
pdfsubject={LaTeX package for PDF replacement text},
pdfkeywords={LaTeX, PDF, replacement text, ActualText, copy and paste},
- pdfcopyright={Copyright (C) 2014, Scott Pakin},
+ pdfcopyright={Copyright (C) 2014-2020 Scott Pakin},
pdflicenseurl={http://www.latex-project.org/lppl/},
pdfcaptionwriter={Scott Pakin},
pdfcontactemail={scott+repl@pakin.org},
pdfcontacturl={http://www.pakin.org/\xmptilde scott/},
pdflang={en-US},
- baseurl={http://www.ctan.org/tex-archive/macros/latex/contrib/repltext/repltext.pdf},
+ baseurl={http://mirror.ctan.org/macros/latex/contrib/repltext/repltext.pdf},
%
colorlinks=false,
pdfstartview=Fit
@@ -60,13 +61,13 @@
\begin{document}
\DocInput{repltext.dtx}
-% \PrintChanges
+ \PrintChanges
\PrintIndex
\end{document}
%</driver>
% \fi
%
-% \CheckSum{38}
+% \CheckSum{59}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -86,11 +87,12 @@
%
%
% \changes{v1.0}{2014/04/11}{Initial version}
+% \changes{v1.1}{2020/09/25}{Support modern Lua\protect\LaTeX\ versions}
%
% \GetFileInfo{repltext.dtx}
%
-% \DoNotIndex{\bgroup,\catcode,\egroup,\expandafter,\global,\let}
-% \DoNotIndex{\newcommand,\newenvironment,\the}
+% \DoNotIndex{\{,\},\bgroup,\catcode,\def,\egroup,\expandafter,\global,\let}
+% \DoNotIndex{\newcommand,\newenvironment,\protected,\providecommand,\the}
%
% ^^A Define some logical styles.
% \newcommand{\pkgname}[1]{^^A
@@ -322,13 +324,58 @@
%
% \section{Implementation}
%
-% \pkgname{repltext} relies on the \cs{pdfliteral} and
-% \cs{pdfescapestring} primitives, which are defined only by
-% pdf\LaTeX\ and Lua\LaTeX\@. We use the \pkgname{ifpdf} package to
-% test for one of those two \tex\ engines.
+% This section presents the documented source code for
+% \pkgname{repltext}. Most users can ignore this section.
%
+% \begin{macro}{\@ifdefined}
+% I find \cs{@ifdefined} a more natural construct than \cs{@ifundefined}.
% \begin{macrocode}
-\RequirePackage{ifpdf}
+\providecommand{\@ifdefined}[3]{\@ifundefined{#1}{#3}{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\repl@literal}
+% \pkgname{repltext} needs a mechanism to insert literal PDF code. This
+% varies by \TeX\ engine so we have to define \cs{repl@literal} on an
+% engine-by-engine basis.
+% \changes{v1.1}{2020/09/25}{Add this macro}
+% \begin{macrocode}
+\@ifdefined{pdfliteral}{%
+% \end{macrocode}
+% \latex[pdf]
+% \begin{macrocode}
+ \let\repl@literal=\pdfliteral
+}{%
+ \@ifdefined{pdfextension}{%
+% \end{macrocode}
+% \latex[Lua]
+% \begin{macrocode}
+ \protected\def\repl@literal{\pdfextension literal}%
+ }{%
+% \end{macrocode}
+% Other
+% \begin{macrocode}
+ \PackageError{repltext}{Unrecognized TeX engine}{%
+ The repltext package currently works only with pdfLaTeX and\MessageBreak
+ LuaLaTeX.\space\space Please use of those engines to build your document.%
+ }%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \pkgname{repltext} additionally needs a mechanism to escape
+% backslashes and parentheses in a string to make it usable as a PDF
+% string. This is easy in pdf\LaTeX, which provides
+% \cs{pdfescapestring}. Unfortunately, to my knowledge, no other
+% \TeX\ engine provides equivalent functionality. Rather than write our
+% own function, we leverage \pkgname{hyperref}'s \cs{Hy@pstringdef},
+% which provides similar functionality.
+% \begin{macrocode}
+\RequirePackage{etoolbox}
+\AtEndPreamble{%
+ \@ifpackageloaded{hyperref}{}{\RequirePackage{hyperref}}%
+}
% \end{macrocode}
%
% The \cs{repl@text@ii} macro invokes \cs{scalebox}, which is defined by
@@ -381,6 +428,7 @@
% \end{macro}
%
% \begin{macro}{\repl@text@ii}
+% \begin{macro}{\repl@escaped}
% \cs{repl@text@ii} is the macro that finally outputs something. It
% takes ordinary \LaTeX\ code as its argument and writes a PDF
% marked-content sequence that uses an \pdfname{ActualText} entry to
@@ -389,8 +437,9 @@
% second argument (\cs{repl@text@ii}'s |#1|~argument).
% \begin{macrocode}
\newcommand{\repl@text@ii}[1]{%
- \pdfliteral{
- /Span << /ActualText (\pdfescapestring{\the\repl@text@toks}) >>
+ \Hy@pstringdef\repl@escaped{\the\repl@text@toks}%
+ \repl@literal{
+ /Span << /ActualText (\repl@escaped) >>
BDC
}%
#1%
@@ -402,10 +451,11 @@
% without being noticeable.
% \begin{macrocode}
\scalebox{0.000001}{-}%
- \pdfliteral{EMC}%
+ \repl@literal{EMC}%
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
%
% \begin{macro}{\prevrepl}
% For the author's convenience we define \cs{prevrepl} to refer to the
diff --git a/Master/texmf-dist/source/latex/repltext/repltext.ins b/Master/texmf-dist/source/latex/repltext/repltext.ins
index 1e637b10c44..b876b5535cf 100644
--- a/Master/texmf-dist/source/latex/repltext/repltext.ins
+++ b/Master/texmf-dist/source/latex/repltext/repltext.ins
@@ -1,13 +1,13 @@
%%
-%% Copyright (C) 2014 by Scott Pakin <scott+repl@pakin.org>
+%% Copyright (C) 2014-2020 by Scott Pakin <scott+repl@pakin.org>
%%
%% This file may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.3c of this license
%% or (at your option) any later version. 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
%% 2006/05/20 or later.
%%
@@ -19,7 +19,7 @@
\preamble
-Copyright (C) 2014 by Scott Pakin <scott+repl@pakin.org>
+Copyright (C) 2014-2020 by Scott Pakin <scott+repl@pakin.org>
This file may be distributed and/or modified under the conditions of
the LaTeX Project Public License, either version 1.3c of this license
diff --git a/Master/texmf-dist/source/latex/rest-api/rest-api.dtx b/Master/texmf-dist/source/latex/rest-api/rest-api.dtx
index fa195fdf789..955f744c7e1 100644
--- a/Master/texmf-dist/source/latex/rest-api/rest-api.dtx
+++ b/Master/texmf-dist/source/latex/rest-api/rest-api.dtx
@@ -22,7 +22,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{rest-api}
%<*package>
- [2020/03/22 v1.2 rest-api package]
+ [2020/12/04 v1.4 rest-api package]
%</package>
%
%<*driver>
@@ -40,7 +40,7 @@
%</driver>
% \fi
%
-% \CheckSum{424}
+% \CheckSum{514}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -59,6 +59,8 @@
% Right brace \} Tilde \~}
%
%
+% \changes{v1.4}{2020/12/04}{Add xml syntax highlighting support for request and response body}
+% \changes{v1.3}{2020/06/23}{Fix typo and table coloring after apiRoute block}
% \changes{v1.2}{2020/03/22}{Corrections for CTAN, rename to rest-api}
% \changes{v1.1}{2020/03/21}{Add documentation and usage}
% \changes{v1.0}{2020/02/18}{Converted to DTX file}
@@ -121,7 +123,7 @@
\begin{lstlisting}[frame=single,breaklines=true]
\begin{apiRoute}{get}{/api/storage/}{get a list of all storage's}
\begin{routeParameter}
- \noRouteParamter{no parameter}
+ \noRouteParameter{no parameter}
\end{routeParameter}
\begin{routeResponse}{application/json}
\begin{routeResponseItem}{200}{ok}
@@ -155,7 +157,7 @@
\begin{lstlisting}[frame=single,breaklines=true]
\begin{apiRoute}{get}{/api/storage/}{}
\begin{routeParameter}
- \noRouteParamter{no parameter}
+ \noRouteParameter{no parameter}
\end{routeParameter}
\begin{routeResponse}{application/json}
\noRouteResponse{no response}
@@ -173,7 +175,7 @@
\begin{lstlisting}[frame=single,breaklines=true]
\begin{apiRoute}{post}{/api/storage/}{create a new storage}
\begin{routeParameter}
- \noRouteParamter{no parameter}
+ \noRouteParameter{no parameter}
\end{routeParameter}
\begin{routeRequest}{application/json}
\begin{routeRequestBody}
@@ -269,6 +271,34 @@
%</example>
% \fi
+% \paragraph{DELETE Request xml} \
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}[frame=single,breaklines=true]
+ \begin{apiRoute}{delete}{/api/storage/\{id\}}{remove a storage with id}
+ \begin{routeParameter}
+ \routeParamItem{id}{id of storage}
+ \end{routeParameter}
+ \begin{routeResponse}{application/xml}
+ \begin{routeResponseItem}{200}{ok}
+
+ \end{routeResponseItem}
+ \begin{routeResponseItem}{404}{error: storage not found}
+ \begin{routeResponseItemBody}
+ <message>
+ storage with id '11' not found!
+ </message>
+ \end{routeResponseItemBody}
+ \end{routeResponseItem}
+ \end{routeResponse}
+ \end{apiRoute}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+
+
%
%
%
@@ -327,12 +357,12 @@
% \DescribeEnv{routeParameter}
% Describe the path parameter.
% Contains a list of \textbackslash routeParamItem commands.
-% If no paramters excists you can use the command \textbackslash noRouteParamter.
+% If no paramters excists you can use the command \textbackslash noRouteParameter.
%
% \DescribeMacro{\routeParamItem}
% Describe a parameter with name and describtion.
%
-% \DescribeMacro{\noRouteParamter}
+% \DescribeMacro{\noRouteParameter}
% Show a text e.g. 'no parameter'.
%
% \DescribeEnv{routeResponse}
@@ -362,7 +392,10 @@
% Return the border color of the current route.
%
% \DescribeMacro{\methodJson}
-% Set the with \\lstset color scheme for the listings of the current route.
+% Set the color scheme and language with \\lstset for the listings of the current route to json.
+%
+% \DescribeMacro{\methodXml}
+% Set the color scheme and language with \\lstset for the listings of the current route to xml.
%
%
@@ -503,6 +536,7 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{color definitions for json}
% \begin{macrocode}
\colorlet{punct}{black}
\definecolor{background}{HTML}{EEEEEE}
@@ -514,6 +548,11 @@
\colorlet{numbPut}{delimPut}
\colorlet{delimDelete}{\getDeleteColor}
\colorlet{numbDelete}{delimDelete}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{json language defintions}
+% \begin{macrocode}
\lstdefinelanguage{jsonGet}{
basicstyle=\small\ttfamily\color{black},
numberstyle=\small\color{black},
@@ -654,6 +693,105 @@
{[}{{{\color{delimDelete}{[}}}}{1}
{]}{{{\color{delimDelete}{]}}}}{1},
}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{xml language defintions}
+% \begin{macrocode}
+\lstdefinelanguage{xmlGet}{
+ basicstyle=\small\ttfamily\color{black},
+ numberstyle=\small\color{numbGet},
+ keywordstyle=\color{black},
+ commentstyle=\color{black},
+ stringstyle=\color{black},
+ frame=L,
+ framesep=8pt,
+ framerule=2pt,
+ xleftmargin=50pt,
+ xrightmargin=0pt,
+ rulesep=0pt,
+ backgroundcolor=\color{white},
+ numbersep=8pt,
+ tabsize=4,
+ showstringspaces=false,
+ breaklines=false,
+ morestring=[b]",
+ morestring=[s]{>}{<},
+ morecomment=[s]{<?}{?>},
+ identifierstyle=\color{numbGet},
+}
+\lstdefinelanguage{xmlPost}{
+ basicstyle=\small\ttfamily\color{black},
+ numberstyle=\small\color{numbPost},
+ keywordstyle=\color{black},
+ commentstyle=\color{black},
+ stringstyle=\color{black},
+ frame=L,
+ framesep=8pt,
+ framerule=2pt,
+ xleftmargin=50pt,
+ xrightmargin=0pt,
+ rulesep=0pt,
+ backgroundcolor=\color{white},
+ numbersep=8pt,
+ tabsize=4,
+ showstringspaces=false,
+ breaklines=false,
+ morestring=[b]",
+ morestring=[s]{>}{<},
+ morecomment=[s]{<?}{?>},
+ identifierstyle=\color{numbPost},
+}
+\lstdefinelanguage{xmlPut}{
+ basicstyle=\small\ttfamily\color{black},
+ numberstyle=\small\color{numbPut},
+ keywordstyle=\color{black},
+ commentstyle=\color{black},
+ stringstyle=\color{black},
+ frame=L,
+ framesep=8pt,
+ framerule=2pt,
+ xleftmargin=50pt,
+ xrightmargin=0pt,
+ rulesep=0pt,
+ backgroundcolor=\color{white},
+ numbersep=8pt,
+ tabsize=4,
+ showstringspaces=false,
+ breaklines=false,
+ morestring=[b]",
+ morestring=[s]{>}{<},
+ morecomment=[s]{<?}{?>},
+ stringstyle=\color{black},
+ identifierstyle=\color{numbPut},
+}
+\lstdefinelanguage{xmlDelete}{
+ basicstyle=\small\ttfamily\color{black},
+ numberstyle=\small\color{numbDelete},
+ keywordstyle=\color{black},
+ commentstyle=\color{black},
+ stringstyle=\color{black},
+ frame=L,
+ framesep=8pt,
+ framerule=2pt,
+ xleftmargin=50pt,
+ xrightmargin=0pt,
+ rulesep=0pt,
+ backgroundcolor=\color{white},
+ numbersep=8pt,
+ tabsize=4,
+ showstringspaces=false,
+ breaklines=false,
+ morestring=[b]",
+ morestring=[s]{>}{<},
+ morecomment=[s]{<?}{?>},
+ identifierstyle=\color{numbDelete},
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{apiRoute frame style defintion}
+% \begin{macrocode}
\mdfdefinestyle{mystyle}{
linecolor=\methodBorderColor,
backgroundcolor=\methodLightColor,
@@ -669,6 +807,15 @@
nobreak=true
}
% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\bodyFormat}
+% \begin{macrocode}
+\newcommand{\bodyFormat}{json}
+% \end{macrocode}
+% \end{macro}
+%
%
% \begin{macro}{\routeBreakValue}
% \begin{macrocode}
@@ -732,25 +879,26 @@
{
\lstset{language=jsonGet,rulecolor=\color{\methodColor}}
}
-\begin{comment}
- \newcommand{\apiCorner}{notround}
-
- \newcommand{\apiCornerRound}
- {
- \renewcommand{\apiCorner}{round}
- }
-
- \newcommand{\apiCornerNotRound}
- {
- \renewcommand{\apiCorner}{notround}
- }
-\end{comment}
% \end{macrocode}
%
+% \begin{macro}{\methodXml}
+% \begin{macrocode}
+\newcommand{\methodXml}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+{
+ \lstset{language=xmlGet,rulecolor=\color{\methodColor}}
+}
+% \end{macrocode}
+%
+%
% \begin{environment}{apiRoute}
% \begin{macrocode}
\newenvironment{apiRoute}[3]
{
+ \global\let\saved@CT@arc@\CT@arc@
\newcommand{\method}{#1}
\newcommand{\urlPath}{#2}
\newcommand{\routeDescription}{#3}
@@ -766,6 +914,12 @@
\colorlet{numbGet}{delimGet}
\lstset{language=jsonGet,rulecolor=\color{\methodColor}}
}
+ \renewcommand{\methodXml}
+ {
+ \colorlet{delimGet}{\methodColor}
+ \colorlet{numbGet}{delimGet}
+ \lstset{language=xmlGet,rulecolor=\color{\methodColor}}
+ }
}
{}
@@ -780,6 +934,12 @@
\colorlet{numbPost}{delimPost}
\lstset{language=jsonPost,rulecolor=\color{\methodColor}}
}
+ \renewcommand{\methodXml}
+ {
+ \colorlet{delimPost}{\methodColor}
+ \colorlet{numbPost}{delimPost}
+ \lstset{language=xmlPost,rulecolor=\color{\methodColor}}
+ }
}
{}
@@ -794,6 +954,12 @@
\colorlet{numbPut}{delimPut}
\lstset{language=jsonPut,rulecolor=\color{\methodColor}}
}
+ \renewcommand{\methodXml}
+ {
+ \colorlet{delimPut}{\methodColor}
+ \colorlet{numbPut}{delimPut}
+ \lstset{language=xmlPut,rulecolor=\color{\methodColor}}
+ }
}
{}
\ifthenelse{\equal{\method}{delete}}
@@ -807,6 +973,12 @@
\colorlet{numbDelete}{delimDelete}
\lstset{language=jsonDelete,rulecolor=\color{\methodColor}}
}
+ \renewcommand{\methodXml}
+ {
+ \colorlet{delimDelete}{\methodColor}
+ \colorlet{numbDelete}{delimDelete}
+ \lstset{language=xmlDelete,rulecolor=\color{\methodColor}}
+ }
}
{}
@@ -847,6 +1019,7 @@
{
\end{mdframed}
\endgroup
+ \global\let\CT@arc@\saved@CT@arc@
}
% \end{macrocode}
%
@@ -854,6 +1027,8 @@
% \begin{macrocode}
\newenvironment{routeRequest}[1]
{
+ \renewcommand{\bodyFormat}{#1}
+
\arrayrulecolor{\methodColor}
\begin{tabularx}{\textwidth}{X l}
@@ -871,7 +1046,7 @@
}
\lstnewenvironment{routeRequestBody}
{
- \methodJson
+ \IfSubStr{\bodyFormat}{xml}{\methodXml}{\methodJson}
}
{}
% \end{macrocode}
@@ -884,7 +1059,7 @@
{
\rowcolor{\methodLightColor} ##1 & ##2 \\
}
- \newcommand{\noRouteParamter}[1]
+ \newcommand{\noRouteParameter}[1]
{
\small{\textit{##1}}
}
@@ -912,6 +1087,8 @@
% \begin{macrocode}
\newenvironment{routeResponse}[1]
{
+ \renewcommand{\bodyFormat}{#1}
+
\newcommand{\noRouteResponse}[1]
{
\begin{tabularx}{\textwidth}{X}
@@ -951,7 +1128,7 @@
\lstnewenvironment{routeResponseItemBody}
{
\vspace{-1.4em}
- \methodJson
+ \IfSubStr{\bodyFormat}{xml}{\methodXml}{\methodJson}
}
{}
\endinput
diff --git a/Master/texmf-dist/source/latex/rest-api/rest-api.ins b/Master/texmf-dist/source/latex/rest-api/rest-api.ins
index eba18ecd93b..92070c15728 100644
--- a/Master/texmf-dist/source/latex/rest-api/rest-api.ins
+++ b/Master/texmf-dist/source/latex/rest-api/rest-api.ins
@@ -16,7 +16,7 @@
\Msg{************************************************************************}
\Msg{* Installation *}
-\Msg{* Package: rest-api 2020/03/22 v1.2 *}
+\Msg{* Package: rest-api 2020/12/04 v1.4 *}
\Msg{************************************************************************}
\keepsilent
@@ -58,4 +58,4 @@ version 2008/05/04 or later.
\Msg{* *}
\Msg{*************************************************************}
-\endbatchfile \ No newline at end of file
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/revtex/aip4-2.dtx b/Master/texmf-dist/source/latex/revtex/aip4-2.dtx
index 9f949a976c1..2c40254d9d6 100644
--- a/Master/texmf-dist/source/latex/revtex/aip4-2.dtx
+++ b/Master/texmf-dist/source/latex/revtex/aip4-2.dtx
@@ -16,9 +16,10 @@
% installation, typeset this document with \LaTeX.
% Maintenance Status
% This work has the LPPL maintenance status "maintained";
-% Current Maintainer of this work is Arthur Ogawa.
+% Current Maintainer of this work is Arthur Ogawa
+% changes for version 4.2d and 4.2e by Phelype Oleinik.
%
-% Version (4.2c)
+% Version (4.2e)
% Modified by Aptara
%
% This work consists of the main source file aip4-2.dtx
@@ -74,7 +75,7 @@ altering it directly is inadvisable;
instead, modify the original source file.
See the URL in the file README-AIP.
-Copyright (c) 2019 American Institute of Physics.
+Copyright (c) 2019--2020 American Institute of Physics.
mailto:tex@aip.org
Maintained by Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net)
@@ -84,6 +85,9 @@ Version (4.2c)
Modified by Aptara
under contract to American Institute of Physics
+Version (4.2d,4.2e)
+Modified by Phelype Oleinik for the American Physical Society (mailto:phelype.oleinik at latex-project.org)
+
License
You may distribute this file under the conditions of the
LaTeX Project Public License 1.3c or later
@@ -128,7 +132,6 @@ License
% \fi
%
% \GetFileInfo{aip4-2.dtx}
-% \CheckSum{6707}
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
@@ -151,14 +154,13 @@ License
%<*package>
%%% @LaTeX-file{
%%% filename = "aip4-2.dtx",
-%%% version = "4.2c",
-%%% date = "2019/01/18",
-%%% time = "14:29:48 GMT-5",
-%%% checksum = "6737",
+%%% version = "4.2e",
+%%% date = "2020/10/03",
%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net),
+%%% Phelype Oleinik (mailto:phelype.oleinik at latex-project.org),
%%% commissioned by the American Institute of Physics.
%%% ",
-%%% copyright = "Copyright (C) 2019 American Institute of Physics,
+%%% copyright = "Copyright (C) 2019--2020 American Institute of Physics,
%%% distributed under the terms of the
%%% LaTeX Project Public License 1.3c, see
%%% ftp://ctan.tug.org/macros/latex/base/lppl.txt
@@ -174,7 +176,6 @@ License
%%% keywords = "latex, page grid, main vertical list",
%%% supported = "yes",
%%% abstract = "aip substyle for REVTeX",
-%%% docstring = "The checksum field above generated by ltxdoc",
%%% }
%</package>
% \fi
@@ -261,7 +262,7 @@ License
% \begin{macrocode}
%<*driver|package>
%<version>
- [2019/01/18/14:29:48 4.2c AIP substyle for REVTeX]% \fileversion
+ [2020/10/03 4.2e AIP substyle for REVTeX]% \fileversion
%</driver|package>
% \end{macrocode}
%
@@ -1852,7 +1853,6 @@ generate the needed \file{.bst} files and install them in
% \begin{macrocode}
\def\@journal@default{cha}%
\def\@pointsize@default{12}%
-\@booleanfalse\pagerestrict@sw%
% \end{macrocode}
%
% \subsection{Journal-Specific Code}%
@@ -2236,769 +2236,21 @@ generate the needed \file{.bst} files and install them in
%%
% \end{macrocode}
%
-% \subsubsection{\classoption{Page restriction for APL (currently deactivated)}}%
-% This macro was installed to calculate page-lenght for APL articles. Currently this option is deactivated.
-% \begin{macrocode}
-%% XXXXXXXXXXXXXXXXXXXXXXXXXXX CURRENTLY DEACTIVATED XXXXXXXXXXXXXXXXXXXXXXXXXX
-%% To activate, please add "\@booleantrue\pagerestrict@sw" in the
-%% respective journal option
-%% XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+% \subsubsection{\classoption{Page restriction for APL (removed)}}%
+%
+% This macro was installed to calculate page-lenght for APL articles.
%% Appended by Ms. Sehar Tahir (Aptara) for American Institute of Physics.
%% To impose page restrictions for APL journal at MSP stage.
+%
+% \begin{macrocode}
%%
%% HISTORY
%% Revised page restriction to 4 pages: 05/10/2011
-%% Tweaked the page over length message: 31/10/2011
-\begingroup%
- \catcode`P=12%
- \catcode`T=12%
- \lowercase{%
- \def\x{\def\local@rem@pt##1.##2PT{##1.##2}}}%
- \expandafter\endgroup\x%
-\def\local@strip@pt{\expandafter\local@rem@pt\the}%
+%% Tweaked the page over length message: 31/10/2011
+%% Removed unused page restriction code: 30/09/2020
%%
\DeclareOption{no-pagerestrict}{%
- \@booleanfalse\pagerestrict@sw
-}%
-\appdef\rtx@require@packages{%
-\pagerestrict@sw{% For imposing page restrictions
- \typeout{AIP Info: Appending Manuscript Pages caculations, 2011/05/30}%
- % Default values
- \def\page@allowed{4}% APL Article size limit
- \def\text@ht@allowed{5324pt}% APL Total text height for allowed 4 pages
- \def\page@calc@count{0}% APL Article size limit
- % Message to authors
- \def\msg@text{According to our initial programmatic calculations, your article may exceed APL page length restrictions. The estimated overlength is denoted by the red side bar. In order to avoid production delays, please adjust your text accordingly and replace your manuscript. To assist you with this process, please ensure that your figures, if any, are placed within the text and are the same size that you wish them to appear in the published article.}% Message to be displayed on the top of last page
- \def\msg@runningtitle{% Message definition
- \preprintsty@sw{%
- \@tempdimc\textwidth\advance\@tempdimc-11pt%
- \vtop{\vspace*{-3pc}\fboxsep0pt\fboxrule.5pt\fbox{\fboxsep5pt\colorbox{grayten}{%
- \vtop{\hsize\@tempdimc{{\reset@font\fontsize{9}{11}\def\baselinestretch{1}\leftskip0pt\rightskip0pt\parfillskip0pt plus1fill\selectfont\msg@text\endgraf}}}}}}%
- }{%
- \@tempdimc\textwidth\advance\@tempdimc-7pt%
- \vtop{\vspace*{-2.5pc}\fboxsep0pt\fboxrule.5pt\fbox{\fboxsep3pt\colorbox{grayten}{%
- \vtop{\hsize\@tempdimc{{\reset@font\fontsize{8}{10}\def\baselinestretch{1}\leftskip0pt\rightskip0pt\parfillskip0pt plus1fill\selectfont\msg@text\endgraf}}}}}}}%
- }%
- %
- \RequirePackage{graphicx}%
- \RequirePackage{color}%
- \definecolor{grayten}{gray}{.80}%
- %
- % Taken from refcount.sty
- \def\setrefcountdefault#1{\def\rc@default{#1}}%
- \setrefcountdefault{0}%
- %
- \def\rc@cartwo#1#2#3\@nil{#2}%
- \newcommand*{\rev@getpagerefnumber}[1]{%
- \expandafter\ifx\csname r@#1\endcsname\relax
- \rc@default
- \else
- \expandafter\expandafter\expandafter\rc@cartwo
- \csname r@#1\endcsname\rc@default\rc@default\@nil
- \fi
- }
- \newcommand*{\rev@getrefnumber}[1]{%
- \expandafter\ifx\csname r@#1\endcsname\relax
- \rc@default
- \else
- \expandafter\expandafter\expandafter\@car
- \csname r@#1\endcsname\@nil
- \fi
- }
- % Count determined from \label{...}
- \newcommand\calc@run@count[2][0]{%
- \@ifundefined{r@#2}{\ifnum#1=\z@\@tempcnta\c@page\advance\@tempcnta\m@ne\else\@tempcnta\z@\fi}%
- {\@tempcnta\rev@getpagerefnumber{#2}\relax}}%
- %
- % Taken from everypage.sty
- \newif\iffloats@end\global\floats@endfalse
- \newif\ifextra@rule\global\extra@rulefalse
- %
- \newcommand{\sc@everypage@hook}{}
- \newcommand{\sc@thispage@hook}{}
- \newcommand*{\AddEverypageHook}[1]{%
- \g@addto@macro\sc@everypage@hook{#1}}
- \newcommand*{\AddThispageHook}[1]{%
- \g@addto@macro\sc@thispage@hook{#1}}
- \newcommand*{\sc@ep@init}{%
- \let\sc@op@saved\@outputpage
- \def\@outputpage{%
- \sc@op@preamble
- \sc@op@saved
- \sc@op@postamble}}
- \newcommand*{\sc@op@preamble}{%
- \let\sc@begindvi\@begindvi
- \def\@begindvi{%
- \sc@everypage@hook
- \sc@thispage@hook
- \gdef\sc@thispage@hook{}
- \sc@begindvi}}
- \newcommand*{\sc@op@postamble}{%
- \let\@begindvi\sc@begindvi}
- \AtBeginDocument{\sc@ep@init}
- % Taken from draftwatermark.sty
- \newcommand\sc@colortext[1]{%
- \setlength{\@tempdimb}{0pt}%
- \setlength{\@tempdimc}{-\paperheight}%
- \put(\strip@pt\@tempdimb,\strip@pt\@tempdimc){%
- \textcolor{red}{\rule{30pt}{#1}}
- }}
- % Calculating shift in red side-bar according to pages
- \def\page@mark@shift{%
- \@ifundefined{page@height\romannumeral\the\c@page}{}{%
- \@tempdimc\csname page@height\romannumeral\the\c@page\endcsname\relax%
- \ifdim\@tempdimc>\csname page@mark\romannumeral\the\c@page\endcsname\relax%
- \@tempdimb\textheight\advance\@tempdimb-\csname page@height\romannumeral\the\c@page\endcsname\relax%
- \else%
- \@tempdimb\textheight\advance\@tempdimb-\csname page@mark\romannumeral\the\c@page\endcsname\relax%
- \fi%
- \advance\@tempdima\@tempdimb}}%
- \newcommand\sc@wm@print[1]{\preprintsty@sw{%
- \@tempdima\paperheight\advance\@tempdima-\textheight%
- \divide\@tempdima by 2\advance\@tempdima-7pt\advance\@tempdima1in%
- \floats@sw%
- {\iffloats@end%
- \@ifundefined{r@LastBibItem}{}%
- {\ifnum\c@page<\rev@getpagerefnumber{LastBibItem}\relax%
- \else%
- \page@mark@shift
- \fi}%
- \else%
- \@ifundefined{r@LastPage}{}%
- {\ifnum\c@page=\rev@getpagerefnumber{LastPage}\relax%
- \page@mark@shift
- \fi}%
- \fi}%
- {\@ifundefined{r@EndText}{}%
- {\ifnum\c@page<\rev@getpagerefnumber{EndText}\relax%
- \else%
- \page@mark@shift
- \fi}}}%
- {\@tempdima\paperheight\advance\@tempdima-\textheight%
- \divide\@tempdima by 2\advance\@tempdima9pt\advance\@tempdima1in}%
- \setbox\@tempboxa\vbox to \z@{%
- \vskip-\@tempdima \moveleft 1in \vbox{%
- \hbox to \z@{%
- #1\hss}}\vss}
- \dp\@tempboxa\z@
- \box\@tempboxa}%
- % Printing the red side-bar
- \AddEverypageHook{\def\special@paper{\the\paperwidth,\the\paperheight}\special{papersize=\the\paperwidth,\the\paperheight}%
- \preprintsty@sw{% Preprint
- \@ifundefined{page@mark\romannumeral\the\c@page}{}{%
- \def\tempa{\csname page@mark\romannumeral\the\c@page\endcsname}%
- \sc@wm@print{\sc@colortext{\tempa\relax}}%
- %
- \floats@sw{%
- \iffloats@end\calc@run@count[1]{LastBibItem}\else\calc@run@count[1]{LastPage}\fi%
- }{\ifextra@rule\calc@run@count[1]{LastPage}\else\calc@run@count[1]{EndText}\fi}%
- \ifnum\c@page=\@tempcnta%
- \ifdim\page@calc@count pt>\page@allowed pt\relax%
- \def\@oddhead{\msg@runningtitle}%
- \def\@evenhead{\msg@runningtitle}%
- \fi%
- \fi}}{% Reprint
- \ifnum\c@page>\page@allowed%
- \sc@wm@print{\sc@colortext{\textheight}}%
- \calc@run@count[1]{LastPage}%
- \ifnum\c@page=\@tempcnta%
- \def\@oddhead{\msg@runningtitle}%
- \def\@evenhead{\msg@runningtitle}%
- \fi%
- \fi%
- }}%
- %
- % Print pages = 2*[(MSP Title portion height)/1.98] + (MSP Text height)/1.32 + (MSP Float height)/1.11
- %
- %
- \@booleantrue\tally@box@size@sw % Activated to get hold of various dimensions
- %
- \newif\ifwrite@title\global\write@titletrue%
- %
- \newdimen\val@calc@dim% dimen used to translate MSP height to TSP height
- \newdimen\make@title@dim% dimen storing height of maketitle portion
- \newdimen\tsp@floatheight% dimen storing extra height for large floats
- \newdimen\curr@figbox@ht% dimen storing current figure box height
- \newdimen\curr@floatht%
- \newdimen\curr@floatwidth%
- \newdimen\curr@tot@float@ht%
- \newdimen\curr@page@ht% dimen storing current page height
- %
- \newsavebox{\figbox}%
- %
- \def\name@fig{figure}%
- \def\same@fig{none}%
- \def\in@flt{none}%
- \def\max@pg@ht{0}%
- \def\ptm{ptm}%
- %
- \gdef\@restrict@error#1#2{%
- \GenericError{%
- \space\space\space\@spaces\@spaces\@spaces
- }{%
- LaTeX Error: #1%
- }{%
- A red side-bar will appear along the extra text on the PDF pages. Press `Enter' to continue.%
- }{#2}%
- }%
- \preprintsty@sw{% For Preprint
- % Adding Float height to the height of each page
- \def\add@flt@pght{%
- \@ifundefined{flt@on@page\romannumeral\the\c@page}{}%
- {\@tempdimc\curr@page@ht\advance\@tempdimc\csname flt@on@page\romannumeral\the\c@page\endcsname\relax%
- \ifdim\@tempdimc>\textheight%
- \global\curr@page@ht\textheight%
- \else%
- \global\advance\curr@page@ht\csname flt@on@page\romannumeral\the\c@page\endcsname\relax%
- \fi}%
- \expandafter\xdef\csname page@height\romannumeral\the\c@page\endcsname{\the\curr@page@ht}}%
- % Storing height of each page
- \appdef\@outputpage@head{%
- \floats@sw{%
- \iffloats@end%
- \@ifundefined{r@LastBibHt}%
- {\add@flt@pght}
- {\ifnum\c@page=\rev@getpagerefnumber{LastBibHt}\relax%
- \@tempdima\rev@getrefnumber{LastBibHt}\relax%
- \expandafter\xdef\csname page@height\romannumeral\the\c@page\endcsname{\the\@tempdima}%
- \else%
- \add@flt@pght%
- \fi}%
- \else%
- \add@flt@pght%
- \fi%
- }{%
- \@ifundefined{r@EndText}%
- {\expandafter\xdef\csname page@height\romannumeral\the\c@page\endcsname{\the\curr@page@ht}
- }{\ifnum\c@page=\rev@getpagerefnumber{EndText}\relax%
- \@tempdima\rev@getrefnumber{EndText}\relax%
- \expandafter\xdef\csname page@height\romannumeral\the\c@page\endcsname{\the\@tempdima}%
- \else%
- \expandafter\xdef\csname page@height\romannumeral\the\c@page\endcsname{\the\curr@page@ht}%
- \fi}%
- }%
- \global\curr@page@ht\z@%
- }%
- % Calculating and adding Maketitle portion size (ratio=1.98)
- % Redefined
- \def\show@box@size#1#2{%
- % \show@box@size@sw{%
- \begingroup
- \setbox\z@\vbox{\unvcopy#2\hrule}%
- \show@box@size@sw{%
- \class@info{Show box size: #1^^J%
- (\the\ht\z@\space X \the\wd\z@)
- \the\c@page\space\space\the\pagegrid@cur\space\the\pagegrid@col
- }}{}%
- \global\advance\curr@page@ht\ht\z@%
- \ifwrite@title%
- \@ifundefined{r@FirstPage}{\@tempcnta\the\c@page}%
- {\@tempcnta\rev@getpagerefnumber{FirstPage}\relax}%
- \ifnum\c@page=\@tempcnta
- \global\make@title@dim\ht\z@
- \@tempdima\make@title@dim
- \divide\@tempdima by 198\relax
- \multiply\@tempdima by 100\relax
- \global\advance\val@calc@dim\@tempdima%
- \global\advance\val@calc@dim\@tempdima%
- \global\write@titlefalse%
- \fi%
- \fi%
- \endgroup
- % }{}%
- }%
- % Calculating and adding Float portion size
- % Redefined
- \let\oldincludegraphics\includegraphics%
- \def\includegraphics{%
- \@ifnextchar[%]
- {\two@includegraphics}{\one@includegraphics}}%
- \def\one@includegraphics#1{\savebox{\figbox}{\oldincludegraphics{#1}}\oldincludegraphics{#1}%
- \ifx\in@flt\name@fig%
- \ifx\same@fig\name@fig%
- \@tempdimc\curr@floatwidth\advance\@tempdimc\wd\figbox%
- \ifdim\@tempdimc>\textwidth%
- \ifdim\wd\figbox>\curr@floatwidth%
- \global\curr@floatwidth\wd\figbox%
- \fi%
- \global\advance\curr@figbox@ht\ht\figbox%
- \global\advance\curr@figbox@ht\dp\figbox%
- \else%
- \ifdim\ht\figbox>\curr@figbox@ht%
- \global\curr@figbox@ht\ht\figbox%
- \global\advance\curr@figbox@ht\dp\figbox%
- \fi%
- \global\advance\curr@floatwidth\wd\figbox%
- \fi%
- \else%
- \global\curr@floatwidth\wd\figbox%
- \global\curr@figbox@ht\ht\figbox%
- \global\advance\curr@figbox@ht\dp\figbox%
- \gdef\same@fig{figure}%
- \fi%
- \fi}%
- \def\two@includegraphics[#1]#2{\savebox{\figbox}{\oldincludegraphics[#1]{#2}}\oldincludegraphics[#1]{#2}%
- \ifx\in@flt\name@fig%
- \ifx\same@fig\name@fig%
- \@tempdimc\curr@floatwidth\advance\@tempdimc\wd\figbox%
- \ifdim\@tempdimc>\textwidth%
- \ifdim\wd\figbox>\curr@floatwidth%
- \global\curr@floatwidth\wd\figbox%
- \fi%
- \global\advance\curr@figbox@ht\ht\figbox%
- \global\advance\curr@figbox@ht\dp\figbox%
- \else%
- \ifdim\ht\figbox>\curr@figbox@ht%
- \global\curr@figbox@ht\ht\figbox%
- \global\advance\curr@figbox@ht\dp\figbox%
- \fi%
- \global\advance\curr@floatwidth\wd\figbox%
- \fi%
- \else%
- \global\curr@floatwidth\wd\figbox%
- \global\curr@figbox@ht\ht\figbox%
- \global\advance\curr@figbox@ht\dp\figbox%
- \gdef\same@fig{figure}%
- \fi%
- \fi}%
- % Redefined
- \def\@xfloat#1[#2]{\def\temp{#1}\ifx\temp\name@fig\gdef\in@flt{figure}\fi%
- \@xfloat@prep
- \@nameuse{fp@proc@#2}%
- \floats@sw{\@xfloat@LaTeX{#1}[#2]}{\@xfloat@anchored{#1}[]}%
- }%
- % Autolabelling of floats to get their exact page placement
- \appdef\@floatboxreset{%
- \@ifundefined{float\romannumeral\the\c@page}%
- {\expandafter\xdef\csname float\romannumeral\the\c@page\endcsname{\@ne}%
- \xdef\flt@pg@label{float\romannumeral\the\c@page-\romannumeral\@ne}}%
- {\@tempcnta=\csname float\romannumeral\the\c@page\endcsname\advance\@tempcnta\@ne%
- \expandafter\xdef\csname float\romannumeral\the\c@page\endcsname{\the\@tempcnta}%
- \xdef\flt@pg@label{float\romannumeral\the\c@page-\romannumeral\the\@tempcnta}}%
- \label{\flt@pg@label}}%
- % Defining a pagewise fix for TSP height whereever a float occurs
- \def\tsp@float@fix{%
- \@ifundefined{r@\flt@pg@label}{}%
- {\@tempcnta=\rev@getpagerefnumber{\flt@pg@label}\relax%
- \@ifundefined{flt@ht@fix\romannumeral\the\@tempcnta}%
- {\expandafter\xdef\csname flt@ht@fix\romannumeral\the\@tempcnta\endcsname{\the\@tempdimc}}%
- {\advance\@tempdimc\csname flt@ht@fix\romannumeral\the\@tempcnta\endcsname\relax%
- \expandafter\xdef\csname flt@ht@fix\romannumeral\the\@tempcnta\endcsname{\the\@tempdimc}}}}%
- %
- \floats@sw{%
- % Normal Floats
- \appdef\check@currbox@count{%
- \@ifnum{\count\@currbox>\z@}{%
- % Float height calculation to be added in page height
- \@tempdimb\ht\@currbox\advance\@tempdimb\dp\@currbox%
- \@tempcnta=\rev@getpagerefnumber{\flt@pg@label}\relax%
- \@ifundefined{flt@on@page\romannumeral\the\@tempcnta}%
- {\expandafter\xdef\csname flt@on@page\romannumeral\the\@tempcnta\endcsname{\the\@tempdimb}}%
- {\advance\@tempdimb\csname flt@on@page\romannumeral\the\@tempcnta\endcsname\relax%
- \expandafter\xdef\csname flt@on@page\romannumeral\the\@tempcnta\endcsname{\the\@tempdimb}}%
- %
- \ifx\@captype\name@fig%
- \ifdim\curr@floatwidth>20.5pc%
- \ifdim\curr@floatwidth>30pc% Everything added 2 times for calculating column width
- \@tempdimc\ht\@currbox\advance\@tempdimc\dp\@currbox
- \global\advance\tsp@floatheight\@tempdimc%
- % Calculating equivalent TSP height of each figure
- \tsp@float@fix
- \else%
- \@tempdima\ht\@currbox\advance\@tempdima\dp\@currbox%
- \advance\@tempdima-\curr@figbox@ht%
- \global\advance\curr@tot@float@ht-\@tempdima%
- %
- \global\advance\tsp@floatheight\ht\@currbox%
- \global\advance\tsp@floatheight\dp\@currbox%
- \global\advance\tsp@floatheight-\@tempdima%
- % Calculating equivalent TSP height of each figure
- \@tempdimc\curr@figbox@ht%
- \tsp@float@fix
- \fi%
- \fi%
- \else%
- \@tempdimc\ht\@currbox\advance\@tempdimc\dp\@currbox
- \global\advance\tsp@floatheight\@tempdimc%
- % Calculating equivalent TSP height of each figure
- \tsp@float@fix
- \fi%
- \gdef\in@flt{none}\gdef\same@fig{none}%
- }{}}%
- \def\total@float#1{%
- \expandafter\let
- \expandafter\@tempa
- \csname fbox@\csname ftype@#1\endcsname\endcsname
- \@ifnotrelax\@tempa{%
- \@ifhbox\@tempa{%
- \@tempdima\the\ht\@tempa\divide\@tempdima\@twopowertwo\@tempcnta\@tempdima
- \@tempdimb\the\dp\@tempa\divide\@tempdimb\@twopowertwo\@tempcntb\@tempdimb
- \class@info{Total #1: Column(\the\@tempcnta pt), Page(\the\@tempcntb pt)}%
- \global\advance\curr@tot@float@ht\@tempcnta pt\global\advance\curr@tot@float@ht\@tempcntb pt
- }{}%
- }{}%
- }%
- }{
- % End of document Floats
- \def\strt@flt#1#2#3{\edef\flt@page{#1}\edef\flt@pgtot{#2}\edef\flt@pggoal{#3}}
- % Redefined
- \let\old@xfloat@anchored\@xfloat@anchored
- \def\@xfloat@anchored#1[#2]{\old@xfloat@anchored#1[#2]%
- \floatp@sw{}{\strt@flt{\the\c@page}{\the\pagetotal}{\the\pagegoal}\curr@floatht\pagetotal}}%
- \appdef\end@float@anchored{%
- \floatp@sw{%
- \curr@floatht\pagetotal%
- \ifx\@captype\name@fig%
- \ifdim\curr@floatwidth>20.5pc%
- \ifdim\curr@floatwidth>30pc%
- \global\advance\tsp@floatheight\curr@floatht%
- % Calculating equivalent TSP height of each figure
- \@tempdimc\curr@floatht%
- \tsp@float@fix
- \else%
- \@tempdima\curr@floatht\advance\@tempdima-\curr@figbox@ht%
- \global\advance\curr@tot@float@ht-\@tempdima%
- %
- \global\advance\tsp@floatheight\curr@floatht%
- \global\advance\tsp@floatheight-\@tempdima%
- % Calculating equivalent TSP height of each figure
- \@tempdimc\curr@figbox@ht%
- \tsp@float@fix
- \fi%
- \fi%
- \else%
- \global\advance\tsp@floatheight\curr@floatht%
- % Calculating equivalent TSP height of each figure
- \@tempdimc\curr@floatht%
- \tsp@float@fix
- \fi%
- }{%
- \ifnum\c@page=\flt@page%
- \@tempdima\pagetotal\advance\@tempdima-\curr@floatht%
- \global\curr@floatht\@tempdima%
- \ifx\@captype\name@fig%
- \ifdim\curr@floatwidth>20.5pc%
- \ifdim\curr@floatwidth>30pc%
- \global\advance\tsp@floatheight\curr@floatht%
- % Calculating equivalent TSP height of each figure
- \@tempdimc\curr@floatht%
- \tsp@float@fix
- \else%
- \@tempdimb\curr@floatht\advance\@tempdimb-\curr@figbox@ht%
- \global\advance\curr@tot@float@ht-\@tempdimb%
- %
- \global\advance\tsp@floatheight\curr@floatht%
- \global\advance\tsp@floatheight-\@tempdimb%
- % Calculating equivalent TSP height of each figure
- \@tempdimc\curr@figbox@ht%
- \tsp@float@fix
- \fi%
- \fi%
- \else%
- \global\advance\tsp@floatheight\curr@floatht%
- % Calculating equivalent TSP height of each figure
- \@tempdimc\curr@floatht%
- \tsp@float@fix
- \fi%
- \else%
- \ifx\@captype\name@fig%
- \@tempdima\flt@pggoal\relax\advance\@tempdima-\flt@pgtot\relax
- \ifdim\pagetotal>\@tempdima
- \global\curr@floatht\@tempdima%
- \else%
- \global\curr@floatht\pagetotal%
- \fi%
- \else%
- \@tempdima\flt@pggoal\relax\advance\@tempdima-\flt@pgtot\relax
- \advance\@tempdima\pagetotal%
- \global\curr@floatht\@tempdima%
- \fi%
- \@tempcnta\c@page\advance\@tempcnta-\flt@page\relax%
- \ifnum\@tempcnta>\z@%
- \advance\@tempcnta\m@ne%
- \@whilenum\@tempcnta>\z@\do
- {\global\advance\curr@floatht\pagegoal%
- \advance\@tempcnta\m@ne}
- \fi%
- \ifx\@captype\name@fig%
- \ifdim\curr@floatwidth>20.5pc%
- \global\advance\tsp@floatheight\curr@floatht%
- % Calculating equivalent TSP height of each figure
- \@tempdimc\curr@floatht%
- \tsp@float@fix%
- \fi%
- \else%
- \global\advance\tsp@floatheight\curr@floatht%
- % Calculating equivalent TSP height of each figure
- \@tempdimc\curr@floatht%
- \tsp@float@fix%
- \fi%
- \fi%
- }%
- \global\advance\curr@tot@float@ht\curr@floatht%
- \gdef\in@flt{none}\gdef\same@fig{none}}%
- }% floats
- % Calculating and adding Text portion size
- \def\no@dim@exceed{% TSP dimen should not exceed maxdimen
- \ifx\f@family\ptm%
- \@tempdimc13002.380952pt\relax % 16383pt represented in terms of TSP
- \else%
- \@tempdimc12411.36322pt\relax % 16383pt represented in terms of TSP
- \fi%
- \advance\@tempdimc-\val@calc@dim%
- \ifdim\@tempdima>\@tempdimc%
- \@tempcnta=\max@pg@ht\relax%
- \advance\@tempcnta\@ne%
- \xdef\max@pg@ht{\the\@tempcnta}% Number of batches eq to maxdimen
- \ifx\f@family\ptm%
- \global\advance\val@calc@dim-13002.380952pt\relax % 16383pt represented in terms of TSP
- \else%
- \global\advance\val@calc@dim-12411.36322pt\relax % 16383pt represented in terms of TSP
- \fi%
- \global\advance\val@calc@dim\@tempdima%
- \else%
- \global\advance\val@calc@dim\@tempdima%
- \fi}%
- \appdef\total@text{%
- % Avoiding the \maxdimen error
- % Divided the text height in batches of 16383pt (less than maxdimen)
- \@tempcnta=\z@%
- \@whilenum\@tempcntb>16383\relax%
- \do{%
- \advance\@tempcntb-16383\relax%
- \advance\@tempcnta\@ne%
- }%
- \xdef\max@pg@ht{\the\@tempcnta}% Number of batches eq to maxdimen
- % Text height calculation
- \@tempdima\the\@tempcntb pt
- \advance\@tempdima-\make@title@dim%
- % Main macro
- \floats@sw{}{%
- % Text height calculation for end of doc floats
- \advance\@tempdima-\curr@tot@float@ht}%
- % Storing value of available MSP text height for future reference
- \@tempdimb\@tempdima%
- % Text TSP ratio
- \ifx\f@family\ptm% ratio=1.26
- \divide\@tempdima by 126\relax
- \multiply\@tempdima by 100\relax
- \else% ratio=1.32
- \divide\@tempdima by 132\relax
- \multiply\@tempdima by 100\relax
- \fi%
- \global\advance\val@calc@dim\@tempdima%
- % Floats height and TSP ratio (ratio=1.11)
- \@tempdima\curr@tot@float@ht%
- \divide\@tempdima by 111\relax
- \multiply\@tempdima by 100\relax
- % Checking and adding the Float height dimen
- \no@dim@exceed
- %
- \ifdim\tsp@floatheight>\z@
- \@tempdima\tsp@floatheight%
- \divide\@tempdima by 111\relax
- \multiply\@tempdima by 100\relax
- % Checking and adding the TSP Float height dimen
- \no@dim@exceed
- %
- \fi%
- % Extra Text height calculation
- \@tempdima\val@calc@dim\advance\@tempdima-\text@ht@allowed\relax
- \ifx\f@family\ptm% ratio=1.26
- \divide\@tempdima by 100\relax
- \multiply\@tempdima by 126\relax
- \else% ratio=1.32
- \divide\@tempdima by 100\relax
- \multiply\@tempdima by 132\relax
- \fi%
- % Adding extra batches of text (if required)
- \@tempcntb=\max@pg@ht\relax
- \ifnum\@tempcntb>\z@%
- \@tempcnta16383\relax
- \multiply\@tempcnta\@tempcntb\relax
- \typeout{AIP Info: Extra Typeset Text: \the\@tempdima+\the\@tempcnta pt}%
- %
- \@tempdimc\@tempdima%
- \advance\@tempdimc-\@tempdimb%
- \ifdim\@tempdimc>\z@%
- \global\extra@ruletrue\immediate\write\@mainaux{\string\global\string\extra@ruletrue}%
- \else%
- \advance\@tempdimc16383pt\relax
- \ifdim\@tempdimc>\z@%
- \global\extra@ruletrue\immediate\write\@mainaux{\string\global\string\extra@ruletrue}%
- \fi%
- \fi%
- \else%
- \ifdim\@tempdima>\z@\typeout{AIP Info: Extra Typeset Text: \the\@tempdima}\fi%
- \@tempdimc\@tempdima
- \advance\@tempdimc-\@tempdimb%
- \ifdim\@tempdimc>\z@%
- \global\extra@ruletrue%
- \fi%
- \fi%
- % Rule calculation loop
- % Modifying the rule height
- \@tempcntb=\max@pg@ht\relax
- \ifnum\@tempcntb>\z@
- \loop\ifdim\@tempdima>\z@\else\do
- \advance\@tempdima16383pt\relax
- \advance\@tempcntb\m@ne
- \repeat
- \fi%
- % Rule generation
- % Set the count for loop
- \ifdim\@tempdima>\z@
- % Resetting the value of loop count (\@tempcnta)
- \ifextra@rule%
- \calc@run@count{LastPage}%
- \else%
- \floats@sw{%
- \iffloats@end\calc@run@count{LastBibItem}\else\calc@run@count{LastPage}\fi%
- }{\calc@run@count{EndText}}%
- \fi%
- % Storing the value of Start of Loop run count
- \ifextra@rule\xdef\loop@count{\rev@getpagerefnumber{LastBibItem}}\else\xdef\loop@count{\the\@tempcnta}\fi%
- % Count of last page of rule
- \def\rule@display{% Total rule dim(\@tempdima) > current page height (already known till here)
- \ifnum\@tempcnta<\loop@count\relax%
- \@tempdimb\textheight%
- \else%
- \@tempdimb\csname page@height\romannumeral\the\@tempcnta\endcsname\relax%
- \fi%
- }%
- % Loop
- \@whilenum\@tempcnta>\z@%
- \do{%
- \@ifundefined{page@height\romannumeral\the\@tempcnta}{}%
- {\global\advance\@tempdima-\csname page@height\romannumeral\the\@tempcnta\endcsname\relax}%
- \ifdim\@tempdima>\z@ % Rule spans complete page
- % Fixing rule height w.r.t Float on the page
- \@ifundefined{flt@ht@fix\romannumeral\the\@tempcnta}{}%
- {\global\advance\@tempdima-\csname flt@ht@fix\romannumeral\the\@tempcnta\endcsname\relax}%
- \ifdim\@tempdima>\z@%
- \@ifundefined{page@height\romannumeral\the\@tempcnta}%
- {\@tempdimb\z@}%
- {\rule@display}%
- \else% Rule dimen less than 0 after float fix
- % Including maxdimens
- \ifnum\@tempcntb>\z@%
- \advance\@tempcntb\m@ne%
- \advance\@tempdima16383pt\relax%
- \@ifundefined{page@height\romannumeral\the\@tempcnta}%
- {\@tempdimb\z@}%
- {\ifdim\@tempdima>\z@%
- \rule@display%
- \else%
- \divide\@tempdima by \tw@%
- \@tempdimb\csname page@height\romannumeral\the\@tempcnta\endcsname\relax%
- \advance\@tempdimb\@tempdima%
- \@tempdima=\z@% Exiting the loop
- \fi}%
- \else%
- \divide\@tempdima by \tw@%
- \@tempdimb\csname page@height\romannumeral\the\@tempcnta\endcsname\relax%
- \advance\@tempdimb\@tempdima%
- \@tempdima=\z@% Exiting the loop
- \fi%
- \fi%
- \if@filesw
- \immediate\write\@mainaux{\expandafter\string\xdef\expandafter\string\csname page@mark\romannumeral\the\@tempcnta\endcsname{\the\@tempdimb}}%
- \fi%
- \else% Rule length is less than page height
- % Including maxdimens
- \ifnum\@tempcntb>\z@%
- \advance\@tempcntb\m@ne%
- \advance\@tempdima16383pt\relax%
- % Fixing rule height w.r.t Float on the page
- \@ifundefined{flt@ht@fix\romannumeral\the\@tempcnta}{}%
- {\global\advance\@tempdima-\csname flt@ht@fix\romannumeral\the\@tempcnta\endcsname\relax}%
- \ifdim\@tempdima>\z@%
- \@ifundefined{page@height\romannumeral\the\@tempcnta}%
- {\@tempdimb\z@}%
- {\rule@display}%
- \else%
- \divide\@tempdima by \tw@%
- \@tempdimb\csname page@height\romannumeral\the\@tempcnta\endcsname\relax%
- \advance\@tempdimb\@tempdima%
- \@tempdima=\z@% Exiting the loop
- \fi%
- \else%
- \@ifundefined{page@height\romannumeral\the\@tempcnta}%
- {\@tempdimb\z@}%
- {\@tempdimb\csname page@height\romannumeral\the\@tempcnta\endcsname\relax}%
- \advance\@tempdimb\@tempdima%
- \fi%
- \ifdim\@tempdimb>\z@%
- \if@filesw
- \immediate\write\@mainaux{\expandafter\string\xdef\expandafter\string\csname page@mark\romannumeral\the\@tempcnta\endcsname{\the\@tempdimb}}%
- \fi%
- \fi%
- \fi%
- \ifdim\@tempdimb>\z@\advance\@tempcnta\m@ne\else\@tempcnta=\z@\fi%
- \ifnum\@tempcnta=\z@\@tempdima=\z@\fi%
- }%
- \fi
- % Representing MSP text height in terms of TSP pages
- \@tempdima\val@calc@dim
- \divide\@tempdima by 6655\relax % in terms of textheight of TSP
- \multiply\@tempdima by 10\relax
- \divide\@tempdima by 2\relax
- \global\val@calc@dim\@tempdima%
- % If maxdimens
- \@tempcnta=\max@pg@ht\relax
- \@whilenum\@tempcnta>\z@
- \do{%
- \advance\@tempcnta\m@ne
- \ifx\f@family\ptm%
- \@tempdima13002.380952pt\relax % 16383pt represented in terms of TSP
- \else%
- \@tempdima12411.36322pt\relax % 16383pt represented in terms of TSP
- \fi%
- \divide\@tempdima by 6655\relax
- \multiply\@tempdima by 10\relax
- \divide\@tempdima by 2\relax
- \global\advance\val@calc@dim\@tempdima
- }%
- \xdef\page@calc@count{\local@strip@pt\val@calc@dim}%
- \immediate\write\@mainaux{\string\xdef\string\page@calc@count{\page@calc@count}}
- \if@filesw%
- \typeout{AIP Info: Typeset pages: \page@calc@count}%
- \ifdim\val@calc@dim>\page@allowed pt\relax
- \@restrict@error{Your text appears to exceed the APL page limit.^^JPlease reduce the length of your article to avoid publication delays}{AIP recommendation: Please reduce your article length.}
- \fi%
- \fi%
- }% end \total@text
- %
- \prepdef\printfigures{\@booleantrue\lengthcheck@sw%
- \floats@sw{}%
- {\ifdim\pagetotal=\z@%
- \@tempcntb=\the\c@page%
- \loop%
- \advance\@tempcntb\m@ne%
- \ifdim\csname page@height\romannumeral\the\@tempcntb\endcsname>\z@\else\do%
- \repeat%
- \@bsphack%
- \protected@write\@auxout{}{\string\newlabel{EndText}{{\csname page@height\romannumeral\the\@tempcntb\endcsname}{\the\@tempcntb}}}%
- \@esphack%
- \else%
- \def\@currentlabel{\the\pagetotal}\label{EndText}%
- \fi}}%
- %
- \floats@sw{\appdef\endNAT@thebibliography{%
- \ifnum\c@figure=\z@%
- \ifnum\c@table=\z@%
- \global\floats@endtrue\immediate\write\@mainaux{\string\global\string\floats@endtrue}%
- \def\@currentlabel{\the\pagetotal}\label{LastBibHt}%
- \fi\fi}}{}
- % end preprint
- }{% For Reprint
- \gappdef\class@enddocumenthook{%
- \calc@run@count[1]{LastPage}%
- \ifnum\@tempcnta>\page@allowed\relax
- \@restrict@error{Your text appears to exceed the APL page limit.^^JPlease reduce the length of your article to avoid publication delays}{AIP recommendation: Please reduce your article length.}
- \fi}%
- }% reprint
- }{}%
+ \class@warn{Deprecated pagerestrict code. Option 'no-pagerestrict' was ignored.}}%
% \end{macrocode}
% End of \classoption{apl} pagerestriction code.
%
@@ -3010,6 +2262,7 @@ generate the needed \file{.bst} files and install them in
%%
%% JMP, BMF and RSE journal's to be as one column at Reprint stage
%%
+\appdef\rtx@require@packages{%
\def\jnl@rse{rse}%
\def\jnl@jmp{jmp}%
\preprintsty@sw{}%
diff --git a/Master/texmf-dist/source/latex/revtex/ltxdocext.dtx b/Master/texmf-dist/source/latex/revtex/ltxdocext.dtx
index bb045ed3cf4..d3d8b772f56 100644
--- a/Master/texmf-dist/source/latex/revtex/ltxdocext.dtx
+++ b/Master/texmf-dist/source/latex/revtex/ltxdocext.dtx
@@ -83,7 +83,7 @@ License
\file{ltxdocext.sty}{%
\from{ltxdocext.dtx}{package,kernel}%
}%
- \file{acrofont.sty}{\from{ltxdocext.dtx}{fonts}}%
+ % \file{acrofont.sty}{\from{ltxdocext.dtx}{fonts}}%
}%
\ifToplevel{
\Msg{***********************************************************}
@@ -107,7 +107,7 @@ License
%</ignore>
% \fi
%
-% \GetFileInfo{ltxdocext.dtx}\CheckSum{955}
+% \GetFileInfo{ltxdocext.dtx}
%
% \iffalse ltxdoc klootch
%<*ltxdocext>
@@ -115,8 +115,6 @@ License
%%% filename = "ltxdocext.dtx",
%%% version = "1.0a",
%%% date = "2018/12/26",
-%%% time = "17:10:03 GMT-5",
-%%% checksum = "955",
%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net),
%%% commissioned by the American Physical Society.
%%% ",
@@ -134,7 +132,6 @@ License
%%% keywords = "latex, ltxdoc",
%%% supported = "yes",
%%% abstract = "extensions to the ltxdoc class",
-%%% docstring = "The checksum field above generated by ltxdoc",
%%% }
%</ltxdocext>
% \fi
@@ -218,7 +215,7 @@ License
% typeset documentation.
% \begin{macrocode}
%<version>
- [2018/12/26/17:10:03 1.0a ltxdoc extensions package]% \fileversion
+ [2018/12/26 1.0a ltxdoc extensions package]% \fileversion
% \end{macrocode}
%
%
diff --git a/Master/texmf-dist/source/latex/revtex/ltxfront.dtx b/Master/texmf-dist/source/latex/revtex/ltxfront.dtx
index 1eefb7c72cd..86dc0f3f4f7 100644
--- a/Master/texmf-dist/source/latex/revtex/ltxfront.dtx
+++ b/Master/texmf-dist/source/latex/revtex/ltxfront.dtx
@@ -108,16 +108,14 @@ License
%</ignore>
% \fi
%
-% \GetFileInfo{ltxfront.dtx}\CheckSum{2094}
+% \GetFileInfo{ltxfront.dtx}
%
% \iffalse ltxdoc klootch
%<*package>
%%% @LaTeX-file{
%%% filename = "ltxfront.dtx",
-%%% version = "4.2c",
-%%% date = "2019/01/18",
-%%% time = "14:29:48 UT-5",
-%%% checksum = "2012",
+%%% version = "4.2e",
+%%% date = "2020/10/03",
%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net),
%%% commissioned by the American Physical Society.
%%% ",
@@ -135,7 +133,6 @@ License
%%% keywords = "latex, page grid, main vertical list",
%%% supported = "yes",
%%% abstract = "package to change page grid, MVL",
-%%% docstring = "The checksum field above generated by ltxdoc",
%%% }
%</package>
% \fi
@@ -219,7 +216,7 @@ ltxfront%
% \begin{macrocode}
%<*doc|package|kernel>
%<version>
- [2019/01/18/14:29:48 4.2c frontmatter package (AO,DPC,MD)]% \fileversion
+ [2020/10/03 4.2e frontmatter package (AO,DPC,MD)]% \fileversion
%</doc|package|kernel>
%<kernel&!package&!doc>}%
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/revtex/ltxgrid.dtx b/Master/texmf-dist/source/latex/revtex/ltxgrid.dtx
index e391f9f2eb9..6d0c659db79 100644
--- a/Master/texmf-dist/source/latex/revtex/ltxgrid.dtx
+++ b/Master/texmf-dist/source/latex/revtex/ltxgrid.dtx
@@ -15,7 +15,8 @@
% installation, typeset this document with \LaTeX.
% Maintenance Status
% This work has the LPPL maintenance status "maintained";
-% Current Maintainer of this work is Arthur Ogawa.
+% Current Maintainer of this work is Arthur Ogawa
+% changes for version 4.2d and 4.2e by Phelype Oleinik.
%
% This work consists of the main source file ltxgrid.dtx
% and the derived files
@@ -108,17 +109,16 @@ License
%</ignore>
% \fi
%
-% \GetFileInfo{ltxgrid.dtx}\CheckSum{5898}
+% \GetFileInfo{ltxgrid.dtx}
%
% \iffalse ltxdoc klootch
%<*package>
%%% @LaTeX-file{
%%% filename = "ltxgrid.dtx",
-%%% version = "4.2c",
-%%% date = "2019/01/18",
-%%% time = "14:29:48 UT-5",
-%%% checksum = "5462",
+%%% version = "4.2e",
+%%% date = "2020/10/03",
%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net),
+%%% Phelype Oleinik (mailto:phelype.oleinik at latex-project.org),
%%% commissioned by the American Physical Society.
%%% ",
%%% copyright = "Copyright (C) 1999, 2009 Arthur Ogawa,
@@ -135,7 +135,6 @@ License
%%% keywords = "latex, page grid, main vertical list",
%%% supported = "yes",
%%% abstract = "package to change page grid, MVL",
-%%% docstring = "The checksum field above generated by ltxdoc",
%%% }
%</package>
% \fi
@@ -231,7 +230,7 @@ ltxgrid%
% \begin{macrocode}
%<*doc|package|kernel>
%<version>
- [2019/01/18/14:29:48 4.2c page grid package (portions licensed from W. E. Baxter web at superscript.com)]% \fileversion
+ [2020/10/03 4.2e page grid package (portions licensed from W. E. Baxter web at superscript.com)]% \fileversion
%</doc|package|kernel>
%<kernel&!package&!doc>}%
% \end{macrocode}
@@ -321,7 +320,7 @@ ltxgrid%
last revised \filedate.%
}%
\thanks{%
- Version \fileversion\ \copyright\ 2019 American Physical Society
+ Version \fileversion\ \copyright\ 2019--2020 American Physical Society
}%
}%
\author{%
@@ -453,7 +452,8 @@ now put a \cmd\usepackage\texttt{\{ltxgrid\}} in your document preamble!
\changes{4.1o}{2010/02/02}{(AO, 576) Allow \classname{lscape} to act on \cs{@outputbox} at the right time}%
\changes{4.1p}{2010/02/24}{(AO, 583) Provide setup code also for footnotes in a one-column document}%
\changes{4.2a}{2018/12/12}{(MD) Updated name of README file and use standard fonts when typesetting}%
-
+\changes{4.2d}{2020/09/19}{(PHO) Adapt \cs{document} and \cs{enddocument} hooks to the 2020-10-01 \LaTeX{} release.}%
+\changes{4.2d}{2020/09/30}{(PHO) Correct \cs{@normalcr} patch for \LaTeX{} 2020-02-02 and later.}%
\end{filecontents*}
% \end{macrocode}
%
@@ -5127,12 +5127,22 @@ now put a \cmd\usepackage\texttt{\{ltxgrid\}} in your document preamble!
% FIXME: it should be the job of the page grid to determine the procedure to execute at
% the start of the job. Make this a hook.
% \begin{macrocode}
-\prepdef\@begindocumenthook{%
- \open@column@one\@ne
- \set@colht
- \@floatplacement
- \@dblfloatplacement
-}%
+\rvtx@ifformat@geq{2020-10-01}%
+ {%
+ \AddToHook{begindocument}{%
+ \open@column@one\@ne
+ \set@colht
+ \@floatplacement
+ \@dblfloatplacement
+ }%
+ }{%
+ \prepdef\@begindocumenthook{%
+ \open@column@one\@ne
+ \set@colht
+ \@floatplacement
+ \@dblfloatplacement
+ }%
+ }
% \end{macrocode}
% \end{macro}
%
@@ -6206,6 +6216,14 @@ now put a \cmd\usepackage\texttt{\{ltxgrid\}} in your document preamble!
%
% Next, we provide for line-wise processing by patching the procedures associated with these same three commands.
%
+% Depending on the running version of \LaTeX, these commands use \cs{vskip} (before 2020-10-01), or
+% \cs{@vspace@calcify} to add \textsf{calc}-like support in the kernel. To avoid duplicating the tests,
+% define a macro \cs{@tempa} that takes the right form of the primitive spacing command and defines \LaTeX's
+% spacing macros accordingly.
+% \begin{macrocode}
+\def\@tempa#1{%
+% \end{macrocode}
+%
% There are exactly four core \LaTeX\ procedures that use \cmd\vadjust\ to insert vertical mode material
% into the main vertical list: \cmd\vspace, \cmd\pagebreak, \cmd\nopagebreak, and \cmd\\.
% Other commands may use \cmd\vadjust, but they are inserting an interrupt (via a penalty${}<10000$),
@@ -6217,29 +6235,32 @@ now put a \cmd\usepackage\texttt{\{ltxgrid\}} in your document preamble!
%
% The first procedure is \cmd\@vspace, here shown in original form and in the patched alternative form.
% This procedure and \cmd\@vspacer\ implement the \cmd\vspace\ command.
+%
% \begin{macrocode}
-\def\@vspace@org #1{%
+\def\@vspace@org ##1{%
\ifvmode
- \vskip #1
+ #1% \vskip #1
\vskip\z@skip
\else
\@bsphack
\vadjust{\@restorepar
- \vskip #1
+ #1% \vskip #1
\vskip\z@skip
}%
\@esphack
\fi
}%
-\def\@vspace@ltx#1{%
+\def\@vspace@ltx##1{%
\@ifvmode{%
- \vskip#1\vskip\z@skip
+ #1% \vskip #1
+ \vskip\z@skip
}{%
\@bsphack
\ex@vadjust@ltx{%
\@restorepar
\nobreak
- \vskip#1\vskip\z@skip
+ #1% \vskip #1
+ \vskip\z@skip
}%
\@esphack
}%
@@ -6248,12 +6269,12 @@ now put a \cmd\usepackage\texttt{\{ltxgrid\}} in your document preamble!
%
% The second procedure is \cmd\@vspacer.
% \begin{macrocode}
-\def\@vspacer@org#1{%
+\def\@vspacer@org##1{%
\ifvmode
\dimen@\prevdepth
\hrule \@height\z@
\nobreak
- \vskip #1
+ #1%\vskip #1
\vskip\z@skip
\prevdepth\dimen@
\else
@@ -6261,17 +6282,18 @@ now put a \cmd\usepackage\texttt{\{ltxgrid\}} in your document preamble!
\vadjust{\@restorepar
\hrule \@height\z@
\nobreak
- \vskip #1
+ #1%\vskip #1
\vskip\z@skip}%
\@esphack
\fi
}%
-\def\@vspacer@ltx#1{%
+\def\@vspacer@ltx##1{%
\@ifvmode{%
\dimen@\prevdepth
\hrule\@height\z@
\nobreak
- \vskip#1\vskip\z@skip
+ #1%\vskip#1
+ \vskip\z@skip
\prevdepth\dimen@
}{%
\@bsphack
@@ -6279,13 +6301,22 @@ now put a \cmd\usepackage\texttt{\{ltxgrid\}} in your document preamble!
\@restorepar
\hrule\@height\z@
\nobreak
- \vskip#1\vskip\z@skip
+ #1%\vskip#1
+ \vskip\z@skip
}%
\@esphack
}%
}%
% \end{macrocode}
%
+% Now define the macros above conditionally depending on the \LaTeX version.
+% \begin{macrocode}
+}
+\rvtx@ifformat@geq{2020/10/01}%
+ {\@tempa{\@vspace@calcify{#1}}}%
+ {\@tempa{\vskip #1 }}%
+% \end{macrocode}
+%
% The procedure \cmd\@no@pgbk\ implements both \cmd\pagebreak\ and \cmd\nopagebreak.
% \begin{macrocode}
\def\@no@pgbk@org #1[#2]{%
@@ -6319,8 +6350,10 @@ now put a \cmd\usepackage\texttt{\{ltxgrid\}} in your document preamble!
%
% Here is the original core \LaTeX\ definition for
% the procedure involved, along with our revised version.
+% \changes{2020/09/30}{4.2d}{Conditionally use \cs{protected} or \cs{long} to track \LaTeX{} changes.}
% \begin{macrocode}
-\long\def\end@line@org{%
+\rvtx@ifformat@geq{2020/02/02}%
+{\protected}{\long}\def\end@line@org{%
\let\reserved@e\relax
\let\reserved@f\relax
\@ifstar{%
@@ -6330,7 +6363,8 @@ now put a \cmd\usepackage\texttt{\{ltxgrid\}} in your document preamble!
}%
\@xnewline
}%
-\long\def\end@line@ltx{%
+\rvtx@ifformat@geq{2020/02/02}%
+{\protected}{\long}\def\end@line@ltx{%
\let\reserved@e\relax
\let\reserved@f\relax
\@ifstar{%
@@ -6345,14 +6379,19 @@ now put a \cmd\usepackage\texttt{\{ltxgrid\}} in your document preamble!
% An additional procedure requiring patching has the following original core \LaTeX\
% definition; we modify it correspondingly.
% \begin{macrocode}
-\def\@newline@org[#1]{%
- \let\reserved@e\vadjust
- \@gnewline{\vskip#1}%
-}%
-\def\@newline@ltx[#1]{%
- \let\reserved@e\ex@vadjust@ltx
- \@gnewline{\vskip#1}%
-}%
+\def\@tempa#1{%
+ \def\@newline@org[##1]{%
+ \let\reserved@e\vadjust
+ \@gnewline{#1}% \vskip#1
+ }%
+ \def\@newline@ltx[##1]{%
+ \let\reserved@e\ex@vadjust@ltx
+ \@gnewline{#1}% \vskip#1
+ }%
+}
+\rvtx@ifformat@geq{2020/10/01}%
+ {\@tempa{\@vspace@calcify{#1}}}%
+ {\@tempa{\vskip #1}}%
% \end{macrocode}
% We now install our patches.
% If some package overrides these macros, we will detect and complain.
@@ -6362,8 +6401,13 @@ now put a \cmd\usepackage\texttt{\{ltxgrid\}} in your document preamble!
\@ifx{\@vspacer\@vspacer@org}{%
\@ifx{\@no@pgbk\@no@pgbk@org}{%
\@ifx{\@newline\@newline@org}{%
- \expandafter\@ifx\expandafter{\csname\expandafter\@gobble\string\\ \endcsname\end@line@org}{%
- \true@sw
+ \expandafter\@ifx\expandafter{%
+ \csname\rvtx@ifformat@geq{2020/02/02}%
+ {\expandafter\@gobble\string\\}%
+ {\expandafter\@gobble\string\\ }\endcsname
+ \end@line@org
+ }{%
+ \true@sw
}{\false@sw}%
}{\false@sw}%
}{\false@sw}%
@@ -6372,7 +6416,10 @@ now put a \cmd\usepackage\texttt{\{ltxgrid\}} in your document preamble!
{%
\class@info{Overriding \string\@vspace, \string\@vspacer, \string\@no@pgbk, \string\@newline, and \string\\ }%
\let\@normalcr\end@line@ltx
- \expandafter\let\csname\expandafter\@gobble\string\\ \endcsname\@normalcr
+ \expandafter\let
+ \csname\rvtx@ifformat@geq{2020/02/02}%
+ {\expandafter\@gobble\string\\}%
+ {\expandafter\@gobble\string\\ }\endcsname\@normalcr
\let\@newline\@newline@ltx
\let\@vspace\@vspace@ltx
\let\@vspacer\@vspacer@ltx
diff --git a/Master/texmf-dist/source/latex/revtex/ltxutil.dtx b/Master/texmf-dist/source/latex/revtex/ltxutil.dtx
index 1ca98f82cc0..4ce6464c839 100644
--- a/Master/texmf-dist/source/latex/revtex/ltxutil.dtx
+++ b/Master/texmf-dist/source/latex/revtex/ltxutil.dtx
@@ -15,7 +15,8 @@
% installation, typeset this document with \LaTeX.
% Maintenance Status
% This work has the LPPL maintenance status "maintained";
-% Current Maintainer of this work is Arthur Ogawa.
+% Current Maintainer of this work is Arthur Ogawa
+% changes for version 4.2d and 4.2e by Phelype Oleinik.
%
% This work consists of the main source file ltxutil.dtx
% and the derived files
@@ -108,17 +109,16 @@ License
%</ignore>
% \fi
%
-% \GetFileInfo{ltxutil.dtx}\CheckSum{4291}
+% \GetFileInfo{ltxutil.dtx}
%
% \iffalse ltxdoc klootch
%<*package>
%%% @LaTeX-file{
%%% filename = "ltxutil.dtx",
-%%% version = "4.2c",
-%%% date = "2019/01/18",
-%%% time = "14:29:48 UT-5",
-%%% checksum = "4291",
+%%% version = "4.2e",
+%%% date = "2020/10/03",
%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net),
+%%% Phelype Oleinik (mailto:phelype.oleinik at latex-project.org),
%%% commissioned by the American Physical Society. Minor changes by Mark Doyle for version 4.2a-c.
%%% ",
%%% copyright = "Copyright (C) 1999, 2009 Arthur Ogawa,
@@ -135,7 +135,6 @@ License
%%% keywords = "latex, page grid, main vertical list",
%%% supported = "yes",
%%% abstract = "utilities package",
-%%% docstring = "The checksum field above generated by ltxdoc",
%%% }
%</package>
% \fi
@@ -224,7 +223,7 @@ ltxutil%
% \begin{macrocode}
%<*doc|package|kernel>
%<version>
- [2019/01/18/14:29:48 4.2c utilities package (portions licensed from W. E. Baxter web at superscript.com)]% \fileversion
+ [2020/10/03 4.2e utilities package (portions licensed from W. E. Baxter web at superscript.com)]% \fileversion
%</doc|package|kernel>
%<kernel&!package&!doc>}%
% \end{macrocode}
@@ -259,6 +258,10 @@ ltxutil%
\RequirePackage{ltxdocext}%
\let\url\undefined
\RequirePackage[colorlinks=true,linkcolor=blue]{hyperref}%
+\pdfstringdefDisableCommands{%
+ \let\file\relax
+ \let\sc\relax
+}
%\expandafter\ifx\csname package@font\endcsname\@undefined\else
% \expandafter\RequirePackage\expandafter{\csname package@font\endcsname}%
%\fi
@@ -310,7 +313,7 @@ ltxutil%
last revised \filedate.%
}%
\thanks{%
- Version \fileversion\ \copyright\ 2019 American Physical Society
+ Version \fileversion\ \copyright\ 2019--2020 American Physical Society
}%
}%
\author{%
@@ -451,6 +454,7 @@ now put a \cmd\usepackage\texttt{\{ltxutil\}} in your document preamble!
\changes{4.1p}{2010/02/24}{(AO, 582) A patch of \classname{hyperref.sty} to provide backward compatibility to \TeX Live 2007's version 6.75r}%
\changes{4.2a}{2017/11/21}{(MD) Use updated best practice to use https and doi.org}%
\changes{4.2a}{2018/12/12}{(MD) Updated name of README file and use standard fonts when typesetting}%
+\changes{4.2d}{2020/09/19}{(PHO) Adapt \cs{document} and \cs{enddocument} hooks to the 2020-10-01 \LaTeX{} release.}%
\end{filecontents*}
% \end{macrocode}
@@ -786,6 +790,22 @@ now put a \cmd\usepackage\texttt{\{ltxutil\}} in your document preamble!
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\rvtx@ifformat@geq}
+% Some changes in the \LaTeX{} kernel requires us to conditionally
+% define some macros depending on the version of the kernel.
+% \cmd\rvtx@ifformat@geq{} will check if the release date of the
+% currently-running \LaTeXe{} kernel is greater or equal to the
+% argument (the argument should be in the format \texttt{yyyy-mm-dd}).
+% \changes{4.2d}{2020/09/17}{(PHO) Add \cs{rvtx@ifformat@geq}.}%
+% \begin{macrocode}
+\ifx\IfFormatAtLeastTF\undefined
+ \def\rvtx@ifformat@geq{\@ifl@t@r\fmtversion}%
+\else
+ \let\rvtx@ifformat@geq\IfFormatAtLeastTF
+\fi
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@boolean}
% \begin{macro}{\@boole@def}
% In order to define \cmd\@ifx, we first must create the
@@ -931,25 +951,35 @@ now put a \cmd\usepackage\texttt{\{ltxutil\}} in your document preamble!
% column grid command at \cmd\AtBeginDocument\ time, since the MVL has nothing in it
% at that time that would be problematical.
%
-% The facility depends on the stability of this part
-% of \LaTeX's kernel code (the first token of \cmd\document),
-% which could change, you see. But considering that \LaTeX\ is
-% at this point essentially stagnant once more, we risk it.
-%
% \begin{macro}{\document}
% We begin by installing hooks into \cmd\document\ that
% we will manage ourselves.
-% First, we do as \cmd\document\ does: end the group
-% begun by \cmd\begin. Last, we conclude our shenanigans by absorbing
+%
+% The 2020-10-01 \LaTeX{} release got a new hook management system and
+% several new hooks (several previously provided by \textsf{etoolbox}).
+% The one we want here is \texttt{begindocument/before}, the first thing
+% executed by \cmd\document{}, right after ending the group started by
+% \cmd\begin{}.
+%
+% Thus, if the \LaTeX{} kernel date is 2020-10-01 we just add to that
+% hook, otherwise resort to the old method, patching \cmd\document:
+% end the group started by \cmd\begin, apply our hook, and
+% conclude our shenanigans by absorbing
% the first token of the expansion of \cmd\document, which
-% we assume to be \cmd\endgroup.
+% we assume to be \cmd\endgroup{} (true until the aforementioned release).
% \changes{4.1a}{2008/08/12}{Get rid of \cs{set@typesize@hook} \cs{set@pica@hook} and the \cs{normalsize} directive}%
+% \changes{4.2d}{2020/09/17}{(PHO) Use \LaTeX's hook management system, if possible.}%
% \begin{macrocode}
-\prepdef\document{%
- \endgroup
- \document@inithook
- \true@sw{}%
-}%
+\rvtx@ifformat@geq{2020-10-01}%
+ {%
+ \AddToHook{begindocument/before}{\document@inithook}%
+ }{%
+ \prepdef\document{%
+ \endgroup
+ \document@inithook
+ \true@sw{}%
+ }%
+ }
% \end{macrocode}
% \end{macro}
%
@@ -996,7 +1026,15 @@ now put a \cmd\usepackage\texttt{\{ltxutil\}} in your document preamble!
% We will do this to ensure that the \cmd\@mainaux\ stream is not closed until
% the last page of the job is shipped out, and that can only be done by coordinating
% with the output routine.
+%
+% \changes{4.2d}{2020/09/17}{(PHO) Only redefine \cs{enddocument} in older versions.}%
+% This approach, however, will only be done for older versions of the
+% \LaTeX{} kernel:
% \begin{macrocode}
+\rvtx@ifformat@geq{2020-10-01}{%
+ % <definitions for newer LaTeX later>
+}{%
+ % <definitions for older LaTeX>
\def\enddocument{%
% \end{macrocode}
% \changes{4.1n}{2009/12/06}{(AO) Incorporate change to ltmiscen.dtx v1.1i 2000/05/19}%
@@ -1044,7 +1082,7 @@ now put a \cmd\usepackage\texttt{\{ltxutil\}} in your document preamble!
\@if@sw\if@tempswa\fi{%
\@latex@warning@no@line{%
Label(s) may have changed.
- Rerun to get cross-references right
+ Rerun to get cross-references right%
}%
}{}%
}{%
@@ -1052,8 +1090,86 @@ now put a \cmd\usepackage\texttt{\{ltxutil\}} in your document preamble!
}%
}{}%
}%
+}
+% \end{macrocode}
+%
+% \changes{4.2d}{2020/09/17}{(PHO) Patch \cs{enddocument} at runtime in newer versions.}%
+% \begin{macro}{\rvtx@enddocument@patch}
+% For newer \LaTeX{} we'll try to be a bit more future-proof
+% (no miracle though). The code for \cmd\enddocument{}
+% (in pre-2020-10-01 \LaTeX) is roughly:
+% \begin{verbatim}
+% \def\enddocument{%
+% <hooks and bookkeeping>
+% \clearpage
+% <read main .aux and final checks>
+% \@@end
+% }
+% \end{verbatim}
+% and the patches above replace the \cmd\clearpage{} by its own
+% \cmd\clear@document, and \verb|<read main .aux and final checks>| by
+% \cmd\do@check@aux, which it can later control the timing.
+%
+% Now we will apply the same changes, but this time without redefining
+% \cmd\enddocument: we will instead replace tokens on-the-fly, when
+% \cmd\enddocument{} is expanded. This will grant us a slightly safer
+% approach that won't depend so much on the internals of
+% \cmd\enddocument.
+%
+% This entire patch should work with the previous definition of
+% \cmd\enddocument{} as well (except it cannot be used in the hook),
+% but for now leave previous versions untouched.
+%
+% The entire patching will reside in the \texttt{enddocument} hook:
+% \begin{macrocode}
+\rvtx@ifformat@geq{2020-10-01}{%
+ \AddToHook{enddocument}{\rvtx@enddocument@patch{}}%
+}{}
+% \end{macrocode}
+%
+% This macro will be executed after \cmd\enddocument{} has expanded,
+% so all its tokens are now exposed. Here we will assume that
+% \cmd\enddocument{} contains the tokens \verb|\@checkend{document}|
+% and \cmd\endgroup, and use them as delimiters:
+% \begin{macrocode}
+\protected\long\def\rvtx@enddocument@patch#1#2\@checkend#3{%
+ \begingroup
+ \edef\x{\detokenize{#3}}%
+ \edef\y{\detokenize{document}}%
+ \expandafter\endgroup
+ \ifx\x\y
+ \expandafter\rvtx@enddocument@patch@end
+ \else
+ \expandafter\rvtx@enddocument@patch@more
+ \fi
+ {#1#2}{#3}}
+\def\rvtx@enddocument@patch@more#1#2{%
+ \rvtx@enddocument@patch{#1\@checkend{#2}}}
+% \end{macrocode}
+%
+% When the \verb|\@checkend{document}| is reached, use \cmd\clearpage{}
+% and \cmd\enddocument{} as delimiters for the
+% \verb|<read main .aux and final checks>| part, and save it in
+% \cmd\do@check@aux{}:
+% \begin{macrocode}
+\long\def\rvtx@enddocument@patch@end#1#2\clearpage#3\endgroup{%
+ \def\do@check@aux{#3\endgroup}%
+% \end{macrocode}
+% Then execute the code consumed in the previous step:
+% \begin{macrocode}
+ #1%
+ \@checkend{#2}%
+% \end{macrocode}
+% Do \cmd\clear@document{} instead of \cmd\clearpage{} and
+% \cmd\check@aux{} instead of the code grabbed.
+% \begin{macrocode}
+ \clear@document
+ \check@aux}
+\def\check@aux{\do@check@aux}%
% \end{macrocode}
% \end{macro}
+%
+% \end{macro}
% \end{macro}
% \end{macro}
%
@@ -4308,9 +4424,14 @@ now put a \cmd\usepackage\texttt{\{ltxutil\}} in your document preamble!
\endgroup
}%
\@ifx{\typeout\typeout@org}{%
- \class@info{Making \string\typeout\space \string\long}%
\let\typeout\typeout@ltx
-}{}%
+ \true@sw
+}{%
+ \rvtx@ifformat@geq{2020-10-01}%
+ {\true@sw}{\false@sw}%
+}%
+ {\class@info{Making \string\typeout\space \string\long}}%
+ {}%
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex/revtex/revtex-bst.dtx b/Master/texmf-dist/source/latex/revtex/revtex-bst.dtx
new file mode 100644
index 00000000000..1b5c8438ca8
--- /dev/null
+++ b/Master/texmf-dist/source/latex/revtex/revtex-bst.dtx
@@ -0,0 +1,3873 @@
+% \iffalse meta-comment balanced on line 122
+% revtex-bst.dtx: Package to extract .bst files for RevTeX
+% Copyright (c) 2020 American Physical Society.
+% https://journals.aps.org/revtex/
+% mailto:revtex@aps.org
+%
+% Disclaimer
+% This file is distributed WITHOUT ANY WARRANTY;
+% without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+% License
+% You may distribute this file under the conditions of the
+% LaTeX Project Public License 1.3c or later
+% (http://www.latex-project.org/lppl.txt).
+% ReadMe
+% For the documentation and more detailed instructions for
+% installation, typeset this document with \LaTeX.
+% Maintenance Status
+% This work has the LPPL maintenance status "maintained";
+% Current Maintainer of this work is Phelype Oleinik.
+%
+% This work consists of the main source file revtex-bst.dtx
+% and the derived files
+% aapmrev4-2.bst, aipauth4-2.bst, aipnum4-2.bst, apsrev4-2.bst, apsrmp4-2.bst
+% Distribution:
+% CTAN:macros/latex/contrib/revtex/
+%
+% Unpacking:
+% tex revtex-bst.dtx
+%
+% Installation:
+% TDS:bibtex/bst/revtex/
+%
+%<*ignore>
+\begingroup
+ \def\x{LaTeX2e}%
+\expandafter\endgroup
+\ifcase
+ 0\expandafter\ifx\csname processbatchFile\endcsname\relax\else1\fi\ifx\fmtname\x\else 1\fi
+ \relax
+\else
+ \csname fi\endcsname
+%</ignore>
+%<*install>
+%% This file will generate documentation and runtime files
+%% from revtex4-2.dtx when run through TeX.
+\input docstrip
+\nopreamble
+\edef\defaultpostamble{%
+ \MetaPrefix\space End of customized bst file^^J%
+ \MetaPrefix ^^J%
+ \MetaPrefix\space End of file `\outFileName'.%
+}
+\askforoverwritefalse
+\keepsilent
+\generate{%
+ \file{aapmrev4-2.bst}{\from{revtex-bst.dtx}{aapmrev}}%
+ \file{aipauth4-2.bst}{\from{revtex-bst.dtx}{aipauth}}%
+ \file{aipnum4-2.bst}{\from{revtex-bst.dtx}{aipnum}}%
+ \file{apsrev4-2.bst}{\from{revtex-bst.dtx}{apsrev}}%
+ \file{apsrmp4-2.bst}{\from{revtex-bst.dtx}{apsrmp}}%
+}%
+\ifToplevel{
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation, please move}
+\Msg{* *.bst }
+\Msg{* into a directory searched by TeX;}
+\Msg{* in a TDS-compliant installation:}
+\Msg{* texmf/bibtex/bst/revtex/.}
+\Msg{*}
+\Msg{* Happy BibTeXing}
+\Msg{***********************************************************}
+}
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+% \fi
+%
+% \GetFileInfo{revtex-bst.dtx}
+%
+% \StopEventually{}
+% \iffalse ltxdoc klootch
+%<*package>
+%%% @LaTeX-file{
+%%% filename = "revtex-bst.dtx",
+%%% version = "4.2e",
+%%% date = "2020/10/03",
+%%% author = "Phelype Oleinik (mailto: phelype.oleinik at latex-project.org),
+%%% commissioned by the American Physical Society.
+%%% ",
+%%% copyright = "Copyright (C) 2020 American Physical Society
+%%% distributed under the terms of the
+%%% LaTeX Project Public License 1.3c, see
+%%% ftp://ctan.tug.org/macros/latex/base/lppl.txt
+%%% ",
+%%% email = "mailto colon revtex at aps.org",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "",
+%%% supported = "yes",
+%%% abstract = "",
+%%% }
+%</package>
+% \fi
+%
+% \subsection{Bill of Materials}
+%
+% Following is a list of the files in this distribution arranged
+% according to provenance.
+%
+% \subsubsection{Primary Source}%
+% One single file generates all.
+%\begin{verbatim}
+%revtex-bst.dtx
+%\end{verbatim}
+%
+% \subsubsection{Generated by \texttt{tex revtex-bst.dtx}}%
+% Typesetting ths file under \TeX\ itself runs the installer,
+% which generates the bibliography style files.
+%\begin{verbatim}
+%aapmrev4-2.bst, aipauth4-2.bst, aipnum4-2.bst,
+%apsrev4-2.bst, apsrmp4-2.bst
+%\end{verbatim}
+%
+% \section{Code common to all modules}%
+%
+% \begin{macrocode}
+%<*aapmrev|aipauth|aipnum|apsrev|apsrmp>
+%%
+%<aapmrev>%% This is file `aapmrev4-2.bst', and is a hand-edited version of aapmrev4-1.bst
+%<aipauth>%% This is file `aipauth4-2.bst', and is a hand-edited version of aipauth4-1.bst
+%<aipnum>%% This is file `aipnum4-2.bst', and is a hand-edited version of aipnum4-1.bst
+%<apsrev>%% This is file `apsrev4-2.bst', and is a hand-edited version of apsrev4-1.bst
+%<apsrmp>%% This is file `apsrmp4-2.bst', and is a hand-edited version of apsrmp4-1.bst
+ % ===============================================================
+ % IMPORTANT NOTICE:
+ % This file can be redistributed and/or modified under the terms
+ % of the LaTeX Project Public License Distributed from CTAN
+ % archives in directory macros/latex/base/lppl.txt; either
+ % version 1 of the License, or any later version.
+ % ===============================================================
+ %-------------------------------------------------------------------
+ % This bibliography style file is intended for texts in ENGLISH
+ % This is an author-year citation style bibliography. As such, it is
+ % non-standard LaTeX, and requires a special package file to function properly.
+ % Such a package is natbib.sty by Patrick W. Daly
+ % The form of the \bibitem entries is
+ % \bibitem[Jones et al.(1990)]{key}...
+ % \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}...
+ % The essential feature is that the label (the part in brackets) consists
+ % of the author names, as they should appear in the citation, with the year
+ % in parentheses following. There must be no space before the opening
+ % parenthesis!
+ % With natbib v5.3, a full list of authors may also follow the year.
+ % In natbib.sty, it is possible to define the type of enclosures that is
+ % really wanted (brackets or parentheses), but in either case, there must
+ % be parentheses in the label.
+ % The \cite command functions as follows:
+ % \citet{key} ==>> Jones et al. (1990)
+ % \citet*{key} ==>> Jones, Baker, and Smith (1990)
+ % \citep{key} ==>> (Jones et al., 1990)
+ % \citep*{key} ==>> (Jones, Baker, and Smith, 1990)
+ % \citep[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2)
+ % \citep[e.g.][]{key} ==>> (e.g. Jones et al., 1990)
+ % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32)
+ % \citeauthor{key} ==>> Jones et al.
+ % \citeauthor*{key} ==>> Jones, Baker, and Smith
+ % \citeyear{key} ==>> 1990
+ %---------------------------------------------------------------------
+%</aapmrev|aipauth|aipnum|apsrev|apsrmp>
+%
+% \subsection{The Frontmatter File}
+% As promised above, here is the contents of the frontmatter file.
+% This file doesn't have any documentation, so just stop early.
+% \begin{macrocode}
+%<*ignore>
+\stop
+\changes{4.2e}{2020/10/03}{(PHO) Initial version---Put all .bst files in a single .dtx}
+%</ignore>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*aapmrev|aipauth|aipnum|apsrev|apsrmp>
+% \end{macrocode}
+%
+% \begin{macrocode}
+
+%<aapmrev>FUNCTION {id.bst} {"aapmrev4-2.bst 2019-01-14 (MD) hand-edited version of aapmrev4-1.bst"}
+%<aipauth>FUNCTION {id.bst} {"aipnauth4-2.bst 2018-12-27 (MD) hand-edited version of apsauth4-1.bst"}
+%<aipnum>FUNCTION {id.bst} {"aipnum4-2.bst 2019-01-14 (MD) hand-edited version of apsrev4-1.bst"}
+%<apsrev>FUNCTION {id.bst} {"apsrev4-2.bst 2019-01-14 (MD) hand-edited version of apsrev4-1.bst"}
+%<apsrmp>FUNCTION {id.bst} {"apsrmp4-2.bst 2018-12-27 (MD) hand-edited version of apsrmp4-1.bst"}
+ENTRY
+{
+ address
+ archive
+ archivePrefix
+ author
+ bookaddress
+ booktitle
+ chapter
+ collaboration
+ doi
+ edition
+ editor
+ eid
+ eprint
+ howpublished
+ institution
+ isbn
+ issn
+ journal
+ key
+ language
+ month
+ note
+ number
+ organization
+ pages
+ primaryClass
+ publisher
+ school
+ SLACcitation
+ series
+ title
+ translation
+ type
+ url
+ volume
+ year
+}{
+}{
+ label
+ extra.label sort.label
+ short.list
+}
+
+INTEGERS
+{
+ output.state before.all
+ after.word after.punctuation
+ after.sentence after.block
+}
+
+INTEGERS
+{
+ punctuation.state punctuation.no punctuation.space punctuation.yes
+}
+
+STRINGS { bibfield output.bibfield }
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+FUNCTION {non.stop}
+{ duplicate$
+ "}" * add.period$
+ #-1 #1 substring$ "." =
+}
+
+INTEGERS { arith.mulitplier arith.multiplicand }
+
+FUNCTION {multiply}
+{
+ 'arith.multiplicand :=
+ 'arith.mulitplier :=
+ #0
+ { arith.mulitplier #0 > }
+ { arith.multiplicand +
+ arith.mulitplier #1 - 'arith.mulitplier :=
+ }
+ while$
+}
+
+FUNCTION {chr.to.hex}
+{
+ chr.to.int$
+ duplicate$ "0" chr.to.int$ -
+ duplicate$ duplicate$ #0 < swap$ #9 > or not
+ { swap$ pop$ }
+ { pop$
+ duplicate$ "A" chr.to.int$ -
+ duplicate$ duplicate$ #0 < swap$ #5 > or not
+ { swap$ pop$ #10 + }
+ { pop$
+ duplicate$ "a" chr.to.int$ -
+ duplicate$ duplicate$ #0 < swap$ #5 > or not
+ { swap$ pop$ #10 + }
+ { pop$
+ pop$ #-1
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+INTEGERS { arith.accumulator }
+
+FUNCTION {str.to.hex}
+{ #0 'arith.accumulator :=
+ { duplicate$ empty$ not }
+ { duplicate$ #1 #1 substring$ chr.to.hex
+ duplicate$ #0 <
+ { pop$ pop$ ""
+ }
+ { arith.accumulator #16 multiply + 'arith.accumulator :=
+ #2 global.max$ substring$
+ }
+ if$
+ }
+ while$
+ pop$ arith.accumulator
+}
+
+FUNCTION {diagn.cmntlog}
+{
+ duplicate$ top$ "%" swap$ * write$ newline$
+}
+
+INTEGERS { control.key control.author control.editor control.title control.pages control.eprint control.year }
+
+INTEGERS { control.author.jnrlst control.author.dotless control.author.nospace control.author.initials control.author.nocomma control.author.first control.author.reversed }
+
+FUNCTION { control.init }
+{
+ #0
+ 'control.key :=
+ #0
+%<aipauth> #1 +
+%<apsrmp> #1 +
+%<apsrmp> #2 +
+ #8 +
+%<apsrev> #64 +
+%<apsrmp> #64 +
+ 'control.author :=
+%<aapmrev> #0
+%<aipauth> #0
+%<aipnum> #0
+%<apsrev> #1
+%<apsrmp> #1
+ 'control.author.jnrlst :=
+ #0
+ 'control.author.dotless :=
+ #0
+ 'control.author.nospace :=
+ #1
+ 'control.author.initials :=
+ #0
+ 'control.author.nocomma :=
+%<!apsrmp> #0
+%<apsrmp> #1
+ 'control.author.first :=
+%<aapmrev> #0
+%<aipauth> #1
+%<aipnum> #0
+%<apsrev> #0
+%<apsrmp> #1
+ 'control.author.reversed :=
+%<aapmrev> #1
+%<aipauth> #0
+%<aipnum> #1
+%<apsrev> #1
+%<apsrmp> #0
+ 'control.editor :=
+ #-1
+ 'control.title :=
+ #0
+ 'control.pages :=
+ #0
+ 'control.eprint :=
+ #1
+ 'control.year :=
+}
+
+FUNCTION {warning.dependency}
+{
+ " (dependency: " * swap$ * ") set " * swap$ int.to.str$ * warning$
+}
+
+FUNCTION {control.check}
+{
+ control.editor
+ {
+ "editor formatted same as author"
+ control.author.reversed {
+ duplicate$ #0 swap$ "reversed" warning.dependency
+ #0 'control.author.reversed :=
+ } 'skip$ if$
+ control.author.first {
+ duplicate$ #0 swap$ "first" warning.dependency
+ #0 'control.author.first :=
+ } 'skip$ if$
+ control.author.nocomma {
+ duplicate$ #0 swap$ "nocomma" warning.dependency
+ #0 'control.author.nocomma :=
+ } 'skip$ if$
+ pop$
+ } 'skip$ if$
+ control.author.reversed 'skip$
+ {
+ "not reversed"
+ control.author.nospace {
+ duplicate$ #0 swap$ "nospace" warning.dependency
+ #0 'control.author.nospace :=
+ } 'skip$ if$
+ control.author.jnrlst 'skip$ {
+ duplicate$ #1 swap$ "jnrlst" warning.dependency
+ #1 'control.author.jnrlst :=
+ } if$
+ control.author.initials {
+ duplicate$ ", initials" *
+ control.author.dotless {
+ duplicate$ #0 swap$ "dotless" warning.dependency
+ #0 'control.author.dotless :=
+ } 'skip$ if$
+ pop$
+ } 'skip$ if$
+ pop$
+ }
+ if$
+ control.author.initials 'skip$ {
+ "not initials"
+ control.author.nocomma {
+ duplicate$ #0 swap$ "nocomma" warning.dependency
+ #0 'control.author.nocomma :=
+ } 'skip$ if$
+ control.author.nospace {
+ duplicate$ #0 swap$ "nospace" warning.dependency
+ #0 'control.author.nospace :=
+ } 'skip$ if$
+ control.author.dotless 'skip$ {
+ duplicate$ #1 swap$ "dotless" warning.dependency
+ #1 'control.author.dotless :=
+ } if$
+ pop$
+ } if$
+}
+
+FUNCTION {control.parse}
+{
+ duplicate$ duplicate$ missing$
+ {
+ pop$ pop$ pop$
+ }
+ { empty$
+ {
+ pop$ #-1
+ }{
+ str.to.hex
+ }
+ if$
+ swap$ :=
+ }
+ if$
+}
+
+FUNCTION {control.dump}
+{
+ duplicate$ missing$ { pop$ "N/A" } 'skip$ if$
+ "{" swap$ * "}, " *
+ *
+}
+
+INTEGERS { decode.threshold }
+
+FUNCTION {control.decode}
+{
+ - duplicate$
+ #0 <
+ {
+ skip$ pop$ swap$ #0
+ }
+ {
+ swap$ pop$ swap$ #1
+ }
+ if$
+ swap$ :=
+}
+
+FUNCTION {control.author.decode}
+{
+ control.author
+ duplicate$ duplicate$ #0 < swap$ #128 < not or
+ {
+ int.to.str$ "(" swap$ * ")" *
+ "Control cannot interpret author " swap$ *
+ warning$
+ }{
+ 'control.author.jnrlst swap$ duplicate$ #64 control.decode
+ 'control.author.dotless swap$ duplicate$ #32 control.decode
+ 'control.author.nospace swap$ duplicate$ #16 control.decode
+ 'control.author.initials swap$ duplicate$ #8 control.decode
+ 'control.author.nocomma swap$ duplicate$ #4 control.decode
+ 'control.author.first swap$ duplicate$ #2 control.decode
+ 'control.author.reversed swap$ duplicate$ #1 control.decode
+ duplicate$ #0 =
+ 'skip$
+ {
+ "Control: residue of author"
+ "(" swap$ * ")" * *
+ warning$
+ }
+ if$
+ pop$
+ }
+ if$
+}
+
+FUNCTION {control.setup}
+{
+ type$ cite$ "{" swap$ * "}, " * *
+ "control.key" key control.dump *
+ "control.author" author control.dump *
+ "control.editor" editor control.dump *
+ "control.title" title control.dump *
+ "control.pages" pages control.dump *
+ "control.year" year control.dump *
+ "control.eprint" eprint control.dump *
+ top$
+ 'control.key key control.parse
+ 'control.author author control.parse
+ 'control.editor editor control.parse
+ 'control.title title control.parse
+ 'control.pages pages control.parse
+ 'control.year year control.parse
+ 'control.eprint eprint control.parse
+ control.author.decode
+}
+
+FUNCTION {control.pass}
+{ type$ "control" = 'control.setup 'skip$ if$
+}
+
+FUNCTION {control.presort}
+{
+}
+
+FUNCTION {control.forward}
+{
+}
+
+FUNCTION {control.reverse}
+{
+}
+
+FUNCTION {control.sort}
+{
+}
+
+FUNCTION {control.longest.label}
+{
+}
+
+FUNCTION {control.key.bib}
+{
+ "Control: key "
+ control.key
+ duplicate$ "(" swap$ int.to.str$ * ") " * swap$
+ pop$ *
+ diagn.cmntlog
+}
+
+FUNCTION {control.author.bib}
+{
+ "Control: author "
+ control.author "(" swap$ int.to.str$ * ")" * *
+ control.author.reversed { " reversed" * }{} if$
+ control.author.first { " first" * }{} if$
+ control.author.nocomma { " nocomma" * }{} if$
+ control.author.initials { " initials" * }{} if$
+ control.author.nospace { " nospace" * }{} if$
+ control.author.dotless { " dotless" * }{} if$
+ control.author.jnrlst { " jnrlst" * }{} if$
+ diagn.cmntlog
+}
+
+FUNCTION {control.editor.bib}
+{
+ "Control: editor formatted "
+ control.editor
+ duplicate$ "(" swap$ int.to.str$ * ") " * swap$
+ duplicate$ #0 < {
+ pop$
+ "disabled!"
+ } {
+ #0 > {
+ "identically to author"
+ } {
+ "differently from author"
+ } if$
+ } if$ * *
+ diagn.cmntlog
+}
+
+FUNCTION {control.title.bib}
+{
+ "Control: production of article title "
+ control.title
+ duplicate$ "(" swap$ int.to.str$ * ") " * swap$
+ duplicate$ #0 < {
+ pop$
+ "disabled"
+ } {
+ #0 > {
+ "required"
+ } {
+ "allowed"
+ } if$
+ } if$ * *
+ diagn.cmntlog
+}
+
+FUNCTION {control.pages.bib}
+{
+ "Control: page "
+ control.pages
+ duplicate$ "(" swap$ int.to.str$ * ") " * swap$
+ duplicate$ #0 < {
+ pop$
+ "none"
+ } {
+ #0 > {
+ "range"
+ } {
+ "single"
+ } if$
+ } if$ * *
+ diagn.cmntlog
+}
+
+FUNCTION {control.year.bib}
+{
+ "Control: year "
+ control.year
+ duplicate$ "(" swap$ int.to.str$ * ") " * swap$
+ duplicate$ #0 < {
+ pop$
+ "disabled!"
+ } {
+ #0 > {
+ "truncated"
+ } {
+ "verbatim"
+ } if$
+ } if$ * *
+ diagn.cmntlog
+}
+
+FUNCTION {control.eprint.bib}
+{
+ "Control: production of eprint "
+ control.eprint
+ duplicate$ "(" swap$ int.to.str$ * ") " * swap$
+ #0 < { "disabled" } { "enabled" } if$ * *
+ diagn.cmntlog
+}
+
+FUNCTION {control.bib}
+{
+ control.key.bib
+ control.author.bib
+ control.editor.bib
+ control.title.bib
+ control.pages.bib
+ control.year.bib
+ control.eprint.bib
+}
+
+FUNCTION {init.state.consts}
+{
+ #0 'before.all :=
+ #1 'after.word :=
+ #2 'after.punctuation :=
+ #3 'after.sentence :=
+ #4 'after.block :=
+ #0 'punctuation.no :=
+ #1 'punctuation.space :=
+ #2 'punctuation.yes :=
+ "" 'bibfield :=
+ "" 'output.bibfield :=
+}
+
+STRINGS { s t}
+FUNCTION {block.punctuation}
+{ ""
+ "," *
+}
+
+FUNCTION {word.space}
+{
+ "\ "
+}
+
+FUNCTION {show.stackstring.one}{
+ "(" *
+ output.state int.to.str$ *
+ "," * punctuation.state int.to.str$ *
+ ")" * top$
+ duplicate$ "1(" swap$ * ")" * top$
+}
+
+FUNCTION {show.stackstring.two}{
+ "(" *
+ output.state int.to.str$ *
+ "," * punctuation.state int.to.str$ *
+ ")" * top$
+ swap$
+ duplicate$ "1(" swap$ * ")" * top$
+ swap$
+ duplicate$ "2(" swap$ * ")" * top$
+}
+
+FUNCTION {bibfield.command}{ "\bibfield "}
+
+FUNCTION {output.nonnull}
+{
+ swap$
+ output.state after.word =
+ {
+ block.punctuation *
+ word.space *
+ }
+ {
+ output.state after.punctuation =
+ {
+ word.space *
+ }
+ {
+ output.state after.block = output.state after.sentence = or
+ {
+ add.period$
+ "\EOS\ " *
+ }{
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ output.bibfield duplicate$ empty$ 'pop$
+ {
+ bibfield.command
+ " {" * swap$ * "} {" * swap$ * "}" *
+ }
+ if$
+ write$
+ bibfield 'output.bibfield := "" 'bibfield :=
+ output.state after.block =
+ {
+ newline$
+ "\newblock " write$
+ }
+ 'skip$
+ if$
+ punctuation.state duplicate$
+ punctuation.yes 'punctuation.state :=
+ punctuation.no =
+ { pop$ before.all }
+ { punctuation.yes = { after.word }{ after.punctuation } if$ }
+ if$
+ 'output.state :=
+}
+
+FUNCTION {output}
+{ duplicate$ empty$
+ {
+ pop$
+ "" 'bibfield :=
+ }
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.nopunct}
+{
+ punctuation.no 'punctuation.state :=
+ output.nonnull
+}
+
+FUNCTION {output.check}
+{ swap$
+ duplicate$ empty$
+ { pop$ "empty " swap$ * " in " * cite$ * warning$ }
+ { swap$ pop$ output.nonnull }
+ if$
+}
+
+FUNCTION {bbl.open} { "\BibitemOpen " }
+
+FUNCTION {bbl.shut} { "\BibitemShut " }
+
+FUNCTION {bibitem.shut.stop} { bbl.shut "{Stop}%" * }
+
+FUNCTION {bibitem.shut.nostop} { bbl.shut "{NoStop}%" * }
+
+FUNCTION {bibitem.shut}
+{
+ non.stop
+ {
+ bibitem.shut.nostop *
+ }{
+ bibitem.shut.stop *
+ }
+ if$
+}
+
+FUNCTION {html.itag} {
+ "p"
+}
+
+FUNCTION {html.ltag} {
+ ""
+}
+
+FUNCTION {output.SLACcitation}
+{ SLACcitation empty$
+ 'skip$
+ {
+ newline$
+ SLACcitation write$
+ }
+ if$
+}
+
+FUNCTION {fin.entry}
+{
+ bibitem.shut
+ write$
+ output.SLACcitation
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+
+FUNCTION {new.block.comma}
+{
+}
+
+FUNCTION {new.sentence}
+{ output.state after.block = output.state before.all = or
+ 'skip$
+ { after.sentence 'output.state := }
+ if$
+}
+
+FUNCTION {new.sentence.comma}
+{
+}
+
+FUNCTION {sentence.or.colon}
+{
+ new.sentence
+}
+
+FUNCTION {add.blank}
+{
+ word.space *
+ before.all 'output.state :=
+}
+
+FUNCTION {no.blank.or.punct}
+{
+ "\hspace {0pt}" *
+ before.all 'output.state :=
+}
+
+FUNCTION {date.block}
+{
+ new.block.comma
+ skip$
+}
+
+STRINGS {z}
+FUNCTION {remove.dots}
+{
+ control.author.dotless {
+ 'z :=
+ ""
+ { z empty$ not }
+ { z #1 #1 substring$
+ z #2 global.max$ substring$ 'z :=
+ duplicate$ "." = 'pop$
+ { * }
+ if$
+ }
+ while$
+ } 'skip$ if$
+}
+
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{
+ duplicate$ empty$
+ { pop$ "" }
+ {
+ "\emph {" swap$ * "}" *
+ }
+ if$
+}
+
+FUNCTION {bolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\textbf {" swap$ * "}" * }
+ if$
+}
+
+FUNCTION {bib.name.font}
+{
+ duplicate$ empty$
+ { pop$ "" }
+ {
+ "\bibnamefont {" swap$ * "}" *
+ }
+ if$
+}
+
+FUNCTION {bib.fname.font}
+{
+ duplicate$ empty$
+ { pop$ "" }
+ {
+ "\bibfnamefont {" swap$ * "}" *
+ }
+ if$
+}
+
+FUNCTION {cite.name.font}
+{
+ duplicate$ empty$
+ { pop$ "" }
+ {
+ "\citenamefont {" swap$ * "}" *
+ }
+ if$
+}
+
+FUNCTION {tie.or.space.prefix}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { word.space }
+ if$
+ swap$
+}
+
+FUNCTION {capitalize}
+{
+ "u" change.case$ "t" change.case$
+}
+
+FUNCTION {space.word}
+{ word.space swap$ * word.space * }
+
+ % Here are the language-specific definitions for explicit words.
+ % Each function has a name bbl.xxx where xxx is the English word.
+ % The language selected here is ENGLISH
+
+FUNCTION {bbl.and}
+{
+ "and"
+}
+
+FUNCTION {bbl.etal}
+{
+ "et~al."
+}
+
+FUNCTION {bbl.editors}
+{
+ "eds."
+}
+
+FUNCTION {bbl.editor}
+{
+ "ed."
+}
+
+FUNCTION {bbl.edby}
+{ "edited by" }
+
+FUNCTION {bbl.edition}
+{
+ "ed."
+}
+
+FUNCTION {bbl.volume}
+{
+ "vol."
+}
+
+FUNCTION {bbl.of}
+{ "of" }
+
+FUNCTION {bbl.number}
+{
+ "no."
+}
+
+FUNCTION {bbl.nr}
+{ "no." }
+
+FUNCTION {bbl.in}
+{ "in" }
+
+FUNCTION {bbl.pages}
+{
+ "pp."
+}
+
+FUNCTION {bbl.page}
+{
+ "p."
+}
+
+FUNCTION {bbl.eidpp}
+{ "pages" }
+
+FUNCTION {bbl.chapter}
+{
+ "chap."
+}
+
+FUNCTION {bbl.techrep}
+{
+ "Tech. Rep."
+}
+
+FUNCTION {bbl.mthesis}
+{ "Master's thesis" }
+
+FUNCTION {bbl.phdthesis}
+{ "Ph.D. thesis" }
+
+FUNCTION {bbl.first}
+{
+ "1st"
+}
+
+FUNCTION {bbl.second}
+{
+ "2nd"
+}
+
+FUNCTION {bbl.third}
+{
+ "3rd"
+}
+
+FUNCTION {bbl.fourth}
+{
+ "4th"
+}
+
+FUNCTION {bbl.fifth}
+{
+ "5th"
+}
+
+FUNCTION {bbl.st}
+{ "st" }
+
+FUNCTION {bbl.nd}
+{ "nd" }
+
+FUNCTION {bbl.rd}
+{ "rd" }
+
+FUNCTION {bbl.th}
+{ "th" }
+
+MACRO {jan} {"Jan."}
+
+MACRO {feb} {"Feb."}
+
+MACRO {mar} {"Mar."}
+
+MACRO {apr} {"Apr."}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"Jun."}
+
+MACRO {jul} {"Jul."}
+
+MACRO {aug} {"Aug."}
+
+MACRO {sep} {"Sep."}
+
+MACRO {oct} {"Oct."}
+
+MACRO {nov} {"Nov."}
+
+MACRO {dec} {"Dec."}
+
+FUNCTION {bbl.url.prefix}
+{
+ "\urlprefix "
+}
+
+FUNCTION {eng.ord}
+{ duplicate$ "1" swap$ *
+ #-2 #1 substring$ "1" =
+ { bbl.th * }
+ { duplicate$ #-1 #1 substring$
+ duplicate$ "1" =
+ { pop$ bbl.st * }
+ { duplicate$ "2" =
+ { pop$ bbl.nd * }
+ { "3" =
+ { bbl.rd * }
+ { bbl.th * }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+ %-------------------------------------------------------------------
+ % Begin module:
+ % \ProvidesFile{physjour.mbs}[2002/01/14 2.2 (PWD)]
+MACRO {aa}{"Astron. \& Astrophys."}
+MACRO {aasup}{"Astron. \& Astrophys. Suppl. Ser."}
+MACRO {aj} {"Astron. J."}
+MACRO {aph} {"Acta Phys."}
+MACRO {advp} {"Adv. Phys."}
+MACRO {ajp} {"Amer. J. Phys."}
+MACRO {ajm} {"Amer. J. Math."}
+MACRO {amsci} {"Amer. Sci."}
+MACRO {anofd} {"Ann. Fluid Dyn."}
+MACRO {am} {"Ann. Math."}
+MACRO {ap} {"Ann. Phys. (NY)"}
+MACRO {adp} {"Ann. Phys. (Leipzig)"}
+MACRO {ao} {"Appl. Opt."}
+MACRO {apl} {"Appl. Phys. Lett."}
+MACRO {app} {"Astroparticle Phys."}
+MACRO {apj} {"Astrophys. J."}
+MACRO {apjsup} {"Astrophys. J. Suppl."}
+MACRO {apss} {"Astrophys. Space Sci."}
+MACRO {araa} {"Ann. Rev. Astron. Astrophys."}
+MACRO {baas} {"Bull. Amer. Astron. Soc."}
+MACRO {baps} {"Bull. Amer. Phys. Soc."}
+MACRO {cmp} {"Comm. Math. Phys."}
+MACRO {cpam} {"Commun. Pure Appl. Math."}
+MACRO {cppcf} {"Comm. Plasma Phys. \& Controlled Fusion"}
+MACRO {cpc} {"Comp. Phys. Comm."}
+MACRO {cqg} {"Class. Quant. Grav."}
+MACRO {cra} {"C. R. Acad. Sci. A"}
+MACRO {fed} {"Fusion Eng. \& Design"}
+MACRO {ft} {"Fusion Tech."}
+MACRO {grg} {"Gen. Relativ. Gravit."}
+MACRO {ieeens} {"IEEE Trans. Nucl. Sci."}
+MACRO {ieeeps} {"IEEE Trans. Plasma Sci."}
+MACRO {ijimw} {"Interntl. J. Infrared \& Millimeter Waves"}
+MACRO {ip} {"Infrared Phys."}
+MACRO {irp} {"Infrared Phys."}
+MACRO {jap} {"J. Appl. Phys."}
+MACRO {jasa} {"J. Acoust. Soc. America"}
+MACRO {jcp} {"J. Comp. Phys."}
+MACRO {jetp} {"Sov. Phys.--JETP"}
+MACRO {jfe} {"J. Fusion Energy"}
+MACRO {jfm} {"J. Fluid Mech."}
+MACRO {jmp} {"J. Math. Phys."}
+MACRO {jne} {"J. Nucl. Energy"}
+MACRO {jnec} {"J. Nucl. Energy, C: Plasma Phys., Accelerators, Thermonucl. Res."}
+MACRO {jnm} {"J. Nucl. Mat."}
+MACRO {jpc} {"J. Phys. Chem."}
+MACRO {jpp} {"J. Plasma Phys."}
+MACRO {jpsj} {"J. Phys. Soc. Japan"}
+MACRO {jsi} {"J. Sci. Instrum."}
+MACRO {jvst} {"J. Vac. Sci. \& Tech."}
+MACRO {nat} {"Nature"}
+MACRO {nature} {"Nature"}
+MACRO {nedf} {"Nucl. Eng. \& Design/Fusion"}
+MACRO {nf} {"Nucl. Fusion"}
+MACRO {nim} {"Nucl. Inst. \& Meth."}
+MACRO {nimpr} {"Nucl. Inst. \& Meth. in Phys. Res."}
+MACRO {np} {"Nucl. Phys."}
+MACRO {npb} {"Nucl. Phys. B"}
+MACRO {nt/f} {"Nucl. Tech./Fusion"}
+MACRO {npbpc} {"Nucl. Phys. B (Proc. Suppl.)"}
+MACRO {inc} {"Nuovo Cimento"}
+MACRO {nc} {"Nuovo Cimento"}
+MACRO {pf} {"Phys. Fluids"}
+MACRO {pfa} {"Phys. Fluids A: Fluid Dyn."}
+MACRO {pfb} {"Phys. Fluids B: Plasma Phys."}
+MACRO {pl} {"Phys. Lett."}
+MACRO {pla} {"Phys. Lett. A"}
+MACRO {plb} {"Phys. Lett. B"}
+MACRO {prep} {"Phys. Rep."}
+MACRO {pnas} {"Proc. Nat. Acad. Sci. USA"}
+MACRO {pp} {"Phys. Plasmas"}
+MACRO {ppcf} {"Plasma Phys. \& Controlled Fusion"}
+MACRO {phitrsl} {"Philos. Trans. Roy. Soc. London"}
+MACRO {prl} {"Phys. Rev. Lett."}
+MACRO {pr} {"Phys. Rev."}
+MACRO {physrev} {"Phys. Rev."}
+MACRO {pra} {"Phys. Rev. A"}
+MACRO {prb} {"Phys. Rev. B"}
+MACRO {prc} {"Phys. Rev. C"}
+MACRO {prd} {"Phys. Rev. D"}
+MACRO {pre} {"Phys. Rev. E"}
+MACRO {ps} {"Phys. Scripta"}
+MACRO {procrsl} {"Proc. Roy. Soc. London"}
+MACRO {rmp} {"Rev. Mod. Phys."}
+MACRO {rsi} {"Rev. Sci. Inst."}
+MACRO {science} {"Science"}
+MACRO {sciam} {"Sci. Am."}
+MACRO {sam} {"Stud. Appl. Math."}
+MACRO {sjpp} {"Sov. J. Plasma Phys."}
+MACRO {spd} {"Sov. Phys.--Doklady"}
+MACRO {sptp} {"Sov. Phys.--Tech. Phys."}
+MACRO {spu} {"Sov. Phys.--Uspeki"}
+MACRO {st} {"Sky and Telesc."}
+ % End module: physjour.mbs
+ %-------------------------------------------------------------------
+ % Begin module:
+ % \ProvidesFile{geojour.mbs}[2002/07/10 2.0h (PWD)]
+MACRO {aisr} {"Adv. Space Res."}
+MACRO {ag} {"Ann. Geophys."}
+MACRO {anigeo} {"Ann. Geofis."}
+MACRO {angl} {"Ann. Glaciol."}
+MACRO {andmet} {"Ann. d. Meteor."}
+MACRO {andgeo} {"Ann. d. Geophys."}
+MACRO {andphy} {"Ann. Phys.-Paris"}
+MACRO {afmgb} {"Arch. Meteor. Geophys. Bioklimatol."}
+MACRO {atph} {"Atm\'osphera"}
+MACRO {aao} {"Atmos. Ocean"}
+MACRO {ass}{"Astrophys. Space Sci."}
+MACRO {atenv} {"Atmos. Environ."}
+MACRO {aujag} {"Aust. J. Agr. Res."}
+MACRO {aumet} {"Aust. Meteorol. Mag."}
+MACRO {blmet} {"Bound.-Lay. Meteorol."}
+MACRO {bams} {"Bull. Amer. Meteorol. Soc."}
+MACRO {cch} {"Clim. Change"}
+MACRO {cdyn} {"Clim. Dynam."}
+MACRO {cbul} {"Climatol. Bull."}
+MACRO {cap} {"Contrib. Atmos. Phys."}
+MACRO {dsr} {"Deep-Sea Res."}
+MACRO {dhz} {"Dtsch. Hydrogr. Z."}
+MACRO {dao} {"Dynam. Atmos. Oceans"}
+MACRO {eco} {"Ecology"}
+MACRO {empl}{"Earth, Moon and Planets"}
+MACRO {envres} {"Environ. Res."}
+MACRO {envst} {"Environ. Sci. Technol."}
+MACRO {ecms} {"Estuarine Coastal Mar. Sci."}
+MACRO {expa}{"Exper. Astron."}
+MACRO {geoint} {"Geofis. Int."}
+MACRO {geopub} {"Geofys. Publ."}
+MACRO {geogeo} {"Geol. Geofiz."}
+MACRO {gafd} {"Geophys. Astrophys. Fluid Dyn."}
+MACRO {gfd} {"Geophys. Fluid Dyn."}
+MACRO {geomag} {"Geophys. Mag."}
+MACRO {georl} {"Geophys. Res. Lett."}
+MACRO {grl} {"Geophys. Res. Lett."}
+MACRO {ga} {"Geophysica"}
+MACRO {gs} {"Geophysics"}
+MACRO {ieeetap} {"IEEE Trans. Antenn. Propag."}
+MACRO {ijawp} {"Int. J. Air Water Pollut."}
+MACRO {ijc} {"Int. J. Climatol."}
+MACRO {ijrs} {"Int. J. Remote Sens."}
+MACRO {jam} {"J. Appl. Meteorol."}
+MACRO {jaot} {"J. Atmos. Ocean. Technol."}
+MACRO {jatp} {"J. Atmos. Terr. Phys."}
+MACRO {jastp} {"J. Atmos. Solar-Terr. Phys."}
+MACRO {jce} {"J. Climate"}
+MACRO {jcam} {"J. Climate Appl. Meteor."}
+MACRO {jcm} {"J. Climate Meteor."}
+MACRO {jcy} {"J. Climatol."}
+MACRO {jgr} {"J. Geophys. Res."}
+MACRO {jga} {"J. Glaciol."}
+MACRO {jh} {"J. Hydrol."}
+MACRO {jmr} {"J. Mar. Res."}
+MACRO {jmrj} {"J. Meteor. Res. Japan"}
+MACRO {jm} {"J. Meteor."}
+MACRO {jpo} {"J. Phys. Oceanogr."}
+MACRO {jra} {"J. Rech. Atmos."}
+MACRO {jaes} {"J. Aeronaut. Sci."}
+MACRO {japca} {"J. Air Pollut. Control Assoc."}
+MACRO {jas} {"J. Atmos. Sci."}
+MACRO {jmts} {"J. Mar. Technol. Soc."}
+MACRO {jmsj} {"J. Meteorol. Soc. Japan"}
+MACRO {josj} {"J. Oceanogr. Soc. Japan"}
+MACRO {jwm} {"J. Wea. Mod."}
+MACRO {lao} {"Limnol. Oceanogr."}
+MACRO {mwl} {"Mar. Wea. Log"}
+MACRO {mau} {"Mausam"}
+MACRO {meteor} {"``Meteor'' Forschungsergeb."}
+MACRO {map} {"Meteorol. Atmos. Phys."}
+MACRO {metmag} {"Meteor. Mag."}
+MACRO {metmon} {"Meteor. Monogr."}
+MACRO {metrun} {"Meteor. Rundsch."}
+MACRO {metzeit} {"Meteor. Z."}
+MACRO {metgid} {"Meteor. Gidrol."}
+MACRO {mwr} {"Mon. Weather Rev."}
+MACRO {nwd} {"Natl. Weather Dig."}
+MACRO {nzjmfr} {"New Zeal. J. Mar. Freshwater Res."}
+MACRO {npg} {"Nonlin. Proc. Geophys."}
+MACRO {om} {"Oceanogr. Meteorol."}
+MACRO {ocac} {"Oceanol. Acta"}
+MACRO {oceanus} {"Oceanus"}
+MACRO {paleoc} {"Paleoceanography"}
+MACRO {pce} {"Phys. Chem. Earth"}
+MACRO {pmg} {"Pap. Meteor. Geophys."}
+MACRO {ppom} {"Pap. Phys. Oceanogr. Meteor."}
+MACRO {physzeit} {"Phys. Z."}
+MACRO {pps} {"Planet. Space Sci."}
+MACRO {pss} {"Planet. Space Sci."}
+MACRO {pag} {"Pure Appl. Geophys."}
+MACRO {qjrms} {"Quart. J. Roy. Meteorol. Soc."}
+MACRO {quatres} {"Quat. Res."}
+MACRO {rsci} {"Radio Sci."}
+MACRO {rse} {"Remote Sens. Environ."}
+MACRO {rgeo} {"Rev. Geophys."}
+MACRO {rgsp} {"Rev. Geophys. Space Phys."}
+MACRO {rdgeo} {"Rev. Geofis."}
+MACRO {revmeta} {"Rev. Meteorol."}
+MACRO {sgp}{"Surveys in Geophys."}
+MACRO {sp} {"Solar Phys."}
+MACRO {ssr} {"Space Sci. Rev."}
+MACRO {tellus} {"Tellus"}
+MACRO {tac} {"Theor. Appl. Climatol."}
+MACRO {tagu} {"Trans. Am. Geophys. Union (EOS)"}
+MACRO {wrr} {"Water Resour. Res."}
+MACRO {weather} {"Weather"}
+MACRO {wafc} {"Weather Forecast."}
+MACRO {ww} {"Weatherwise"}
+MACRO {wmob} {"WMO Bull."}
+MACRO {zeitmet} {"Z. Meteorol."}
+ % End module: geojour.mbs
+ %-------------------------------------------------------------------
+ % Begin module:
+ % \ProvidesFile{photjour.mbs}[1999/02/24 2.0b (PWD)]
+
+MACRO {appopt} {"Appl. Opt."}
+MACRO {bell} {"Bell Syst. Tech. J."}
+MACRO {ell} {"Electron. Lett."}
+MACRO {jasp} {"J. Appl. Spectr."}
+MACRO {jqe} {"IEEE J. Quantum Electron."}
+MACRO {jlwt} {"J. Lightwave Technol."}
+MACRO {jmo} {"J. Mod. Opt."}
+MACRO {josa} {"J. Opt. Soc. America"}
+MACRO {josaa} {"J. Opt. Soc. Amer.~A"}
+MACRO {josab} {"J. Opt. Soc. Amer.~B"}
+MACRO {jdp} {"J. Phys. (Paris)"}
+MACRO {oc} {"Opt. Commun."}
+MACRO {ol} {"Opt. Lett."}
+MACRO {phtl} {"IEEE Photon. Technol. Lett."}
+MACRO {pspie} {"Proc. Soc. Photo-Opt. Instrum. Eng."}
+MACRO {sse} {"Solid-State Electron."}
+MACRO {sjot} {"Sov. J. Opt. Technol."}
+MACRO {sjqe} {"Sov. J. Quantum Electron."}
+MACRO {sleb} {"Sov. Phys.--Leb. Inst. Rep."}
+MACRO {stph} {"Sov. Phys.--Techn. Phys."}
+MACRO {stphl} {"Sov. Techn. Phys. Lett."}
+MACRO {vr} {"Vision Res."}
+MACRO {zph} {"Z. f. Physik"}
+MACRO {zphb} {"Z. f. Physik~B"}
+MACRO {zphd} {"Z. f. Physik~D"}
+
+MACRO {CLEO} {"CLEO"}
+MACRO {ASSL} {"Adv. Sol.-State Lasers"}
+MACRO {OSA} {"OSA"}
+ % End module: photjour.mbs
+%% Copyright 1994-2007 Patrick W Daly
+MACRO {acmcs} {"ACM Comput. Surv."}
+MACRO {acta} {"Acta Inf."}
+MACRO {cacm} {"Commun. ACM"}
+MACRO {ibmjrd} {"IBM J. Res. Dev."}
+MACRO {ibmsj} {"IBM Syst.~J."}
+MACRO {ieeese} {"IEEE Trans. Software Eng."}
+MACRO {ieeetc} {"IEEE Trans. Comput."}
+MACRO {ieeetcad}
+ {"IEEE Trans. Comput. Aid. Des."}
+MACRO {ipl} {"Inf. Process. Lett."}
+MACRO {jacm} {"J.~ACM"}
+MACRO {jcss} {"J.~Comput. Syst. Sci."}
+MACRO {scp} {"Sci. Comput. Program."}
+MACRO {sicomp} {"SIAM J. Comput."}
+MACRO {tocs} {"ACM Trans. Comput. Syst."}
+MACRO {tods} {"ACM Trans. Database Syst."}
+MACRO {tog} {"ACM Trans. Graphic."}
+MACRO {toms} {"ACM Trans. Math. Software"}
+MACRO {toois} {"ACM Trans. Office Inf. Syst."}
+MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."}
+MACRO {tcs} {"Theor. Comput. Sci."}
+
+MACRO {jhep} {"J. High Energy Phys."}
+MACRO {jcap} {"J. Cosmol. Astropart. Phys."}
+MACRO {jinst} {"J. Instrum."}
+MACRO {jstat} {"J. Stat. Mech.: Theory Exp."}
+
+FUNCTION {bibinfo.command} { "\bibinfo " }
+
+FUNCTION {bibinfo.check}
+{ swap$
+ duplicate$ missing$
+ {
+ pop$
+ pop$ ""
+ }{
+ duplicate$ empty$
+ {
+ swap$ pop$
+ }{
+ swap$
+ bibinfo.command "{" * swap$ * "} {" * swap$ * "}" *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {bibinfo.warn}
+{ swap$
+ duplicate$ missing$
+ {
+ swap$ "missing " swap$ * " in " * cite$ * warning$ pop$
+ ""
+ }{
+ duplicate$ empty$
+ {
+ swap$ "empty " swap$ * " in " * cite$ * warning$
+ }{
+ swap$
+ bibinfo.command " {" * swap$ * "} {" * swap$ * "}" *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {archiv.base}
+{
+ "https://arxiv.org/abs"
+}
+
+FUNCTION {archiv.prefix.base}
+{
+ "arXiv"
+}
+
+FUNCTION {eprint.command}
+{
+ "\Eprint "
+}
+
+FUNCTION {format.eprint.controlled}
+{
+ eprint duplicate$ empty$
+ control.eprint #1 =
+ or
+ { pop$ "" }
+ {
+ duplicate$
+ ""
+ archive duplicate$ empty$ { pop$ archiv.base } 'skip$ if$ *
+ "/" *
+ swap$ *
+ "{" swap$ * "} " *
+ swap$
+ ""
+ archivePrefix duplicate$ empty$ { pop$ "" } { ":" * } if$ *
+ swap$ *
+ primaryClass duplicate$ empty$ { pop$ "" } { " [" swap$ * "]" * } if$ *
+ "{" swap$ * "} " *
+ *
+ eprint.command swap$ *
+ }
+ if$
+}
+
+FUNCTION {format.eprint}
+{
+ eprint duplicate$ empty$
+ { pop$ "" }
+ {
+ duplicate$
+ ""
+ archive duplicate$ empty$ { pop$ archiv.base } 'skip$ if$ *
+ "/" *
+ swap$ *
+ "{" swap$ * "} " *
+ swap$
+ ""
+ archivePrefix duplicate$ empty$ { pop$ "" } { ":" * } if$ *
+ swap$ *
+ primaryClass duplicate$ empty$ { pop$ "" } { " [" swap$ * "]" * } if$ *
+ "{" swap$ * "} " *
+ *
+ eprint.command swap$ *
+ }
+ if$
+}
+
+FUNCTION {format.translation}
+{ translation duplicate$ empty$
+ 'skip$
+ { ""
+ "\translation{" * swap$ * "}" *
+ punctuation.space 'punctuation.state :=
+ }
+ if$
+}
+
+FUNCTION {format.url}
+{
+ url duplicate$ empty$
+ { pop$ "" }
+ {
+ "\url "
+ "{" * swap$ * "}" *
+ }
+ if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {check.speaker}
+{ key empty$ 'skip$
+ { key nameptr int.to.str$ =
+ {
+ bolden
+ }
+ 'skip$
+ if$
+ }
+ if$
+}
+
+STRINGS { bibinfo}
+
+FUNCTION {format.names.fname}
+{
+ control.author.initials {
+ control.author.dotless {
+ control.author.nospace {
+ "f{}"
+ } {
+ "f{~}"
+ } if$
+ } {
+ control.author.nospace {
+ "f{.}."
+ } {
+ "f."
+ } if$
+ } if$
+ } {
+ "ff"
+ } if$
+}
+
+FUNCTION {bracify}
+{
+ "{" swap$ * "}" *
+}
+
+FUNCTION {name.comma}
+{
+ control.author.nocomma 'skip$ { "," swap$ * } if$
+}
+
+FUNCTION {format.names.format.onefont}
+{
+ "{vv~}{ll}"
+ nameptr #1 >
+ control.author.first
+ and
+ control.author.reversed not
+ or
+ {
+ control.author.initials {
+ "f"
+ control.author.dotless 'skip$ {
+ "." *
+ } if$
+ "~" *
+ } {
+ "ff"
+ } if$
+ bracify
+ swap$
+ } {
+ format.names.fname
+ " " swap$ *
+ name.comma
+ bracify
+ }
+ if$
+ "jj"
+ " " swap$ *
+ name.comma
+ bracify
+ control.author.jnrlst 'skip$ 'swap$ if$
+ * *
+}
+
+FUNCTION {format.names.onefont}
+{
+ s nameptr format.names.format.onefont format.name$
+ remove.dots
+ bib.name.font
+}
+
+FUNCTION {format.names.morfont}
+{ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font
+ nameptr #1 >
+ control.author.first
+ and
+ control.author.reversed not
+ or
+ {
+ s nameptr
+ control.author.initials {
+ "f" % default: name + surname + comma junior
+ } {
+ "ff"
+ } if$
+ control.author.dotless 'skip$ {
+ "." * % nm-init % Initials. + surname (J. F. Smith) control.author.initials
+ } if$
+ bracify
+ format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ swap$
+ *
+ s nameptr
+ "{jj}" format.name$ duplicate$ empty$ 'skip$
+ { bib.fname.font ", " swap$ * }
+ if$
+ } {
+ "," *
+ s nameptr
+ format.names.fname
+ "jj"
+ " "
+ name.comma
+ control.author.jnrlst {
+ swap$ * skip$
+ } {
+ skip$ * swap$
+ } if$
+ bracify swap$ bracify swap$
+ *
+ format.name$
+ remove.dots
+ duplicate$ empty$ 'skip$
+ { bib.fname.font " " swap$ * }
+ if$
+ } if$
+ *
+}
+
+FUNCTION {names.punctuate}
+{
+ "," *
+ " " *
+}
+%<*!aipauth&!apsrmp>
+
+FUNCTION {names.comma}
+{
+ "," *
+}
+%</!aipauth&!apsrmp>
+
+FUNCTION {format.names}
+{ 'bibinfo :=
+ duplicate$ empty$ { pop$ "" } {
+ duplicate$ num.names$
+ duplicate$ 'numnames :=
+ 'namesleft :=
+ 's :=
+ #1 'nameptr :=
+ ""
+ { namesleft #0 > }
+ {
+ format.names.morfont
+ bibinfo bibinfo.check
+ type$ "presentation" =
+ 'check.speaker
+ 'skip$
+ if$
+ 't :=
+ nameptr #1 > not
+ {
+ t *
+ } {
+ namesleft #1 >
+ {
+ names.punctuate
+ t *
+ } {
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ { 't := }
+ { pop$ }
+ if$
+%<*!apsrmp>
+ numnames #2 >
+%<!aipauth> 'names.comma
+%<aipauth> 'names.punctuate
+ 'skip$
+ if$
+%</!apsrmp>
+%<apsrmp> names.punctuate
+ t "others" =
+ {
+ " " *
+ bbl.etal
+ emphasize
+ *
+ } {
+ bbl.and
+%<aapmrev> space.word *
+%<aipauth> word.space * *
+%<aipnum> space.word *
+%<apsrev> space.word *
+%<apsrmp> word.space * *
+ t *
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ } if$
+}
+
+FUNCTION {format.names.ed.onefont}
+{
+ s nameptr
+ control.author.initials {
+ control.author.dotless {
+ control.author.nospace {
+ "{f{}~}{vv~}{ll}{ jj}" % nm-rvx|nm-rvcx
+ } {
+ "{f{~}~}{vv~}{ll}{ jj}" % nm-rv
+ } if$
+ } {
+ control.author.nospace {
+ "{f{.}.~}{vv~}{ll}{ jj}" % nm-rvv|nm-rvvc
+ }{
+ "{f.~}{vv~}{ll}{, jj}" % nm-init|nm-rev|nm-rev1
+ } if$
+ } if$
+ } {
+ "{ff~}{vv~}{ll}{, jj}"
+ } if$
+ format.name$
+ remove.dots
+ bib.name.font
+}
+
+FUNCTION {format.names.ed.morfont}
+{
+ control.author.reversed { %
+ control.author.initials { %
+ control.author.dotless { %
+ s nameptr
+ control.author.nospace { % nm-rvx nm-rvcx
+ "{f{}}"
+ } { % nm-rv
+ "{f{~}}"
+ } if$
+ format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font *
+ s nameptr
+ "{jj}" format.name$
+ remove.dots
+ duplicate$ empty$ 'skip$
+ { bib.fname.font " " swap$ * }
+ if$
+ } { % !control.author.dotless
+ s nameptr
+ control.author.nospace { % nm-rvv
+ "{ff}"
+ } { % nm-rev nm-rev1
+ "{f.}"
+ } if$
+ format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font *
+ s nameptr
+ "{jj}" format.name$
+ duplicate$ empty$ 'skip$
+ { bib.fname.font ", " swap$ * }
+ if$
+ } if$
+ } { % Full names !control.author.initials nm-revf nm-revv1
+ s nameptr
+ "{ff}"
+ format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font *
+ s nameptr
+ "{jj}" format.name$
+ duplicate$ empty$ 'skip$
+ { bib.fname.font ", " swap$ * }
+ if$
+ } if$
+ } { % !control.author.reversed nm-init
+ s nameptr
+ "{f.}"
+ format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font *
+ s nameptr
+ "{jj}" format.name$
+ duplicate$ empty$ 'skip$
+ { bib.fname.font ", " swap$ * }
+ if$
+ } if$
+ *
+}
+
+FUNCTION {format.names.ed}
+{
+ control.editor #0 > {
+ format.names
+ } {
+ 'bibinfo :=
+ duplicate$ empty$ 'skip$ {
+ 's :=
+ "" 't :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ {
+ format.names.ed.morfont
+ bibinfo bibinfo.check
+ 't :=
+ nameptr #1 >
+ {
+ namesleft #1 >
+ {
+ names.punctuate
+ t *
+ }{
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ { 't := }
+ { pop$ }
+ if$
+ numnames #2 >
+%<aapmrev> 'names.comma
+%<aipauth> 'names.punctuate
+%<aipnum> 'names.comma
+%<apsrev> 'names.comma
+%<apsrmp> 'names.punctuate
+ 'skip$
+ if$
+ t "others" =
+ {
+ " " * bbl.etal emphasize *
+ }{
+ bbl.and
+ space.word * t *
+ }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ } if$
+ } if$
+}
+
+FUNCTION {format.key}
+{ empty$
+ { key field.or.null }
+ { "" }
+ if$
+}
+
+FUNCTION {format.authors}
+{ author "author" format.names
+ duplicate$ empty$ 'skip$
+ { collaboration "collaboration" bibinfo.check
+ duplicate$ empty$ 'skip$
+ { " (" swap$ * ")" * }
+ if$
+ *
+ }
+ if$
+ "author" 'bibfield :=
+}
+
+FUNCTION {get.bbl.editor}
+{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$
+}
+
+FUNCTION {format.editors}
+{ editor "editor" format.names duplicate$ empty$ 'skip$
+ {
+ "," *
+ word.space *
+ get.bbl.editor
+%<apsrmp> capitalize
+ *
+ }
+ if$
+}
+
+FUNCTION {format.isbn.output}
+{
+}
+
+FUNCTION {format.issn.output}
+{
+}
+
+FUNCTION {doi.base}
+{
+ "https://doi.org/"
+}
+
+FUNCTION {doi.base.command}
+{
+ "\doibase "
+}
+
+FUNCTION {noop.command}
+{
+ "\href@noop "
+}
+
+FUNCTION {href.command}
+{
+ "\href "
+}
+
+FUNCTION {link.tag.open}
+{
+ doi duplicate$ empty$
+ {
+ pop$
+ url duplicate$ empty$
+ {
+ pop$ "" noop.command
+ }{
+ href.command
+ }
+ if$
+ }
+ {
+ "https://doi.org/" swap$ *
+ href.command
+ }
+ if$
+ "{" * swap$ * "} {" *
+}
+
+FUNCTION {link.tag.shut}
+{
+ "}"
+}
+
+FUNCTION {link.open}
+{
+ link.tag.open output.nopunct
+}
+
+FUNCTION {link.shut}
+{
+ link.tag.shut *
+}
+
+FUNCTION {add.doi}
+{
+ link.tag.open swap$ * link.tag.shut *
+}
+
+FUNCTION {select.language}
+{ duplicate$ empty$
+ 'pop$
+ { language empty$
+ 'skip$
+ { "{\selectlanguage {" language * "}" * swap$ * "}" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.note}
+{
+ note empty$
+ { "" }
+ { note #1 #1 substring$
+ duplicate$ "{" =
+ 'skip$
+ {
+ output.state after.word = output.state after.punctuation = or
+ { "l" }
+ { "u" }
+ if$ change.case$
+ }
+ if$
+ note #2 global.max$ substring$ * "note" bibinfo.check
+ }
+ if$
+}
+
+FUNCTION {bbl.enquote}
+{
+ "\enquote "
+}
+
+FUNCTION {string.enquote}
+{
+ punctuation.no 'punctuation.state :=
+ non.stop {
+ block.punctuation
+ } { "" } if$
+ swap$ pop$
+ *
+ bbl.enquote "{" * swap$ * "}" *
+ word.space *
+}
+
+FUNCTION {format.title}
+{ title
+ duplicate$ empty$ 'skip$ { "t" change.case$ } if$
+ duplicate$ "title" bibinfo.check swap$
+ duplicate$ empty$ 'pop$
+ {
+ punctuation.yes 'punctuation.state :=
+%<!apsrev> string.enquote
+%<apsrev> pop$
+ select.language
+ }
+ if$
+}
+
+FUNCTION {end.quote.title}
+{ title empty$
+ 'skip$
+ { before.all 'output.state := }
+ if$
+}
+
+FUNCTION {format.name.apply}
+{
+ s nameptr
+ "{vv~}{ll}"
+ format.name$
+ cite.name.font
+}
+
+FUNCTION {format.full.names}
+{
+ 's :=
+ "" 't :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { format.name.apply
+ 't :=
+ nameptr #1 >
+ {
+ namesleft #1 >
+ { ", " * t * }
+ {
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ {
+ 't :=
+ }
+ 'pop$
+ if$
+ t "others" =
+ {
+ " " * bbl.etal
+ emphasize *
+ }{
+ numnames #2 > { "," * }{ skip$ } if$
+ bbl.and
+ space.word * t *
+ }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {make.full.names}
+{
+ key editor author
+ type$ "proceedings" =
+ type$ "book" =
+ type$ "inbook" =
+ or { pop$ }{ { pop$ "" }{ swap$ pop$ "" swap$ } if$ } if$
+ duplicate$ empty$
+ { pop$
+ duplicate$ empty$
+ { pop$
+ duplicate$ empty$
+ { pop$
+ cite$ #1 #3 substring$
+ }{
+ skip$
+ }
+ if$
+ }
+ { swap$ pop$ format.full.names }
+ if$
+ }
+ { swap$ pop$ swap$ pop$ format.full.names }
+ if$
+}
+
+FUNCTION {year.bibitem}
+{
+ year duplicate$ empty$
+ { pop$ ""
+%<apsrmp> "????" *
+ }{
+ skip$
+ } if$
+ extra.label *
+}
+
+FUNCTION {output.bibitem}
+{
+ newline$
+ ""
+ label
+ * ")" *
+ make.full.names duplicate$ short.list =
+ { pop$ }{ * } if$
+ bracify
+ "[" swap$ * "]" *
+ cite$ bracify "%" *
+ *
+ "\bibitem "
+ swap$ *
+ write$ newline$
+ " "
+ duplicate$ bbl.open * write$ newline$
+ before.all 'output.state :=
+ punctuation.yes 'punctuation.state :=
+}
+
+FUNCTION {n.dashify}
+{
+ 't :=
+ ""
+ { t empty$ not }
+ { t #1 #1 substring$ "-" =
+ { t #1 #2 substring$ "--" = not
+ { "--" *
+ t #2 global.max$ substring$ 't :=
+ }{
+ { t #1 #1 substring$ "-" = }
+ { "-" *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+ }
+ if$
+ }{
+ t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+}
+
+FUNCTION {word.in}
+{
+ bbl.in
+ word.space *
+}
+
+%<!apsrev>FUNCTION {date.encapsulate}
+%<apsrev>FUNCTION {parenthesize}
+{
+ duplicate$ empty$
+ 'skip$
+ {
+ before.all 'output.state :=
+ " (" swap$ * ")" *
+ }
+ if$
+}
+
+FUNCTION {format.date}
+{
+ year "year" bibinfo.check duplicate$ empty$
+ {
+%<*apsrmp>
+ "empty year in " cite$ * "; set to ????" * warning$
+ pop$ "????"
+%</apsrmp>
+ }
+ 'skip$
+ if$
+ extra.label *
+%<!apsrev> date.encapsulate
+%<apsrev> parenthesize
+}
+
+FUNCTION {format.date.output.check}
+{
+ format.date
+ "year" output.check
+}
+
+FUNCTION {format.date.output}
+{
+ format.date.output.check
+}
+
+FUNCTION {format.btitle}
+{
+ booktitle duplicate$ empty$ { pop$
+ title
+ } 'skip$ if$
+ "title" bibinfo.check
+ duplicate$ empty$ 'skip$
+ {
+ emphasize
+ select.language
+ }
+ if$
+}
+
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+
+FUNCTION {editor.check.book}
+{ editor empty$ 'skip$
+ {
+ "can't use both author and editor fields in " cite$ *
+ ": try using @inbook instead" *
+ warning$
+ }
+ if$
+}
+
+FUNCTION {format.bvolume}
+{ volume duplicate$ empty$
+ { pop$ "" }
+ {
+ "volume and number" number either.or.check
+ bbl.volume
+ capitalize
+ swap$
+ tie.or.space.prefix "volume" bibinfo.check * *
+ series "series" bibinfo.check duplicate$ empty$ 'pop$
+ {
+ ", "
+ * swap$ *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.number}
+{
+ bbl.number
+ output.state after.word = output.state after.punctuation = or
+ #1 or
+ #0 and
+ 'skip$
+ { capitalize }
+ if$
+ number tie.or.space.prefix "number" bibinfo.check * *
+}
+
+FUNCTION {format.number.series}
+{ volume empty$
+ { number empty$
+ { series field.or.null }
+ {
+ series empty$
+ {
+ number "number" bibinfo.check
+ }{
+ format.number
+ series "series" bibinfo.check
+ word.space * swap$ *
+ }
+ if$
+ }
+ if$
+ }
+ { "" }
+ if$
+}
+
+FUNCTION {is.num}
+{ chr.to.int$
+ duplicate$ "0" chr.to.int$ < not
+ swap$ "9" chr.to.int$ > not and
+}
+
+FUNCTION {extract.num}
+{ duplicate$ 't :=
+ "" 's :=
+ { t empty$ not }
+ { t #1 #1 substring$
+ t #2 global.max$ substring$ 't :=
+ duplicate$ is.num
+ { s swap$ * 's := }
+ { pop$ "" 't := }
+ if$
+ }
+ while$
+ s empty$
+ 'skip$
+ { pop$ s }
+ if$
+}
+
+FUNCTION {convert.edition}
+{ extract.num "l" change.case$ 's :=
+ s "first" = s "1" = or
+ { bbl.first 't := }
+ { s "second" = s "2" = or
+ { bbl.second 't := }
+ { s "third" = s "3" = or
+ { bbl.third 't := }
+ { s "fourth" = s "4" = or
+ { bbl.fourth 't := }
+ { s "fifth" = s "5" = or
+ { bbl.fifth 't := }
+ { s #1 #1 substring$ is.num
+ { s
+ eng.ord
+ 't := }
+ { edition 't := }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ t
+}
+
+FUNCTION {format.edition}
+{ edition duplicate$ empty$ 'skip$
+ {
+ convert.edition
+ output.state after.word = output.state after.punctuation = or
+ { "l" }
+ { "t" }
+ if$ change.case$
+ "edition" bibinfo.check
+ word.space * bbl.edition *
+ }
+ if$
+}
+
+INTEGERS { multiresult }
+FUNCTION {multi.page.check}
+{ 't :=
+ #0 'multiresult :=
+ { multiresult not
+ t empty$ not
+ and
+ }
+ { t #1 #1 substring$
+ duplicate$ "-" =
+ swap$ duplicate$ "," =
+ swap$ "+" =
+ or or
+ { #1 'multiresult := }
+ { t #2 global.max$ substring$ 't := }
+ if$
+ }
+ while$
+ multiresult
+}
+
+FUNCTION {format.pages}
+{ pages duplicate$ empty$
+ 'skip$
+ { duplicate$ multi.page.check
+ {
+ bbl.pages swap$
+ n.dashify
+ }{
+ bbl.page swap$
+ }
+ if$
+ tie.or.space.prefix
+ "pages" bibinfo.check
+ * *
+ }
+ if$
+}
+
+FUNCTION {first.page}
+{ 't :=
+ ""
+ { t empty$ not t #1 #1 substring$ "-" = not and }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+}
+
+FUNCTION {format.book.pages}
+{
+ pages duplicate$ empty$ 'skip$
+ {
+ "pages" bibinfo.check word.space bbl.pages * *
+ }
+ if$
+}
+
+FUNCTION {volnum.punct}
+{
+ ","
+ word.space *
+}
+
+FUNCTION {format.journal.pages}
+{ pages duplicate$ empty$ 'pop$
+ { swap$ duplicate$ empty$
+ { pop$ pop$ format.pages }
+ { volnum.punct *
+ swap$
+ control.pages duplicate$ #0 < {
+ pop$ pop$
+ }{
+ #0 >
+ {
+ n.dashify
+ }{
+ first.page
+ } if$
+ } if$
+ "pages" bibinfo.check
+ *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.journal.eid}
+{ eid "eid" bibinfo.check
+ duplicate$ empty$ 'pop$
+ { swap$ duplicate$ empty$ 'skip$
+ { volnum.punct * }
+ if$
+ swap$ *
+ }
+ if$
+}
+
+FUNCTION {eid.or.pages}
+{
+ eid empty$
+ { format.journal.pages }
+ { format.journal.eid }
+ if$
+}
+
+FUNCTION {format.ser.vol.num}
+{
+ series "series" bibinfo.check output
+ volume field.or.null
+ duplicate$ empty$ 'skip$
+ {
+ "volume" bibinfo.check
+ }
+ if$
+ bolden
+%<*apsrmp>
+ number "number" bibinfo.check duplicate$ empty$ 'skip$
+ {
+ swap$ duplicate$ empty$
+ { "there's a number but no volume in " cite$ * warning$ }
+ 'skip$
+ if$
+ swap$
+ "~(" swap$ * ")" *
+ }
+ if$ *
+%</apsrmp>
+}
+
+%<*apsrev>
+FUNCTION {format.vol.num}
+{
+ volume field.or.null
+ duplicate$ empty$ 'skip$
+ {
+ "volume" bibinfo.check
+ }
+ if$
+ bolden
+}
+
+%</apsrev>
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+ {
+%<!apsrmp> format.pages
+%<apsrmp> ""
+ }
+ { type empty$
+ {
+ bbl.chapter
+ capitalize
+ }{
+ type
+ capitalize
+ "type" bibinfo.check
+ }
+ if$
+ chapter tie.or.space.prefix
+ "chapter" bibinfo.check
+ * *
+%<*!apsrmp>
+ pages empty$
+ 'skip$
+ { ", " * format.pages * }
+ if$
+%</!apsrmp>
+ }
+ if$
+}
+
+FUNCTION {format.booktitle}
+{
+ booktitle duplicate$ "booktitle" bibinfo.check swap$
+ duplicate$ empty$ 'pop$
+ {
+ punctuation.yes 'punctuation.state :=
+ pop$ emphasize
+ select.language
+ }
+ if$
+}
+
+FUNCTION {format.editor.in}
+{
+ editor "editor" format.names.ed duplicate$ empty$ 'skip$
+ {
+ bbl.edby
+ word.space * swap$ *
+ }
+ if$
+}
+
+FUNCTION {output.article.booktitle}
+{
+ format.booktitle
+ "booktitle" 'bibfield :=
+ output
+ bookaddress "address" bibinfo.check duplicate$ empty$ 'pop$
+ {
+ "address" 'bibfield :=
+ output.nonnull after.punctuation 'output.state :=
+ }
+ if$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{
+ format.booktitle duplicate$ empty$ 'pop$
+ {
+ add.doi
+ word.in swap$ * output.nonnull
+ bookaddress "address" bibinfo.check output
+ format.number.series "series and number" bibinfo.check output
+ format.bvolume output
+ format.editor.in "editor" bibinfo.check output
+ }
+ if$
+}
+
+FUNCTION {format.in.ed.booktitle.inbook}
+{
+ format.booktitle duplicate$ empty$ 'pop$
+ {
+ add.doi
+ word.in swap$ * output.nonnull
+ bookaddress "address" bibinfo.check output
+ format.number.series "series and number" bibinfo.check output
+ format.bvolume output
+ author empty$ 'skip$
+ { format.editor.in "editor" bibinfo.check output }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.thesis.type}
+{ type duplicate$ empty$
+ 'pop$
+ { swap$ pop$
+ "t" change.case$ "type" bibinfo.check
+ }
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ number "number" bibinfo.check
+ type duplicate$ empty$
+ { pop$ bbl.techrep }
+ 'skip$
+ if$
+ "type" bibinfo.check
+ swap$ duplicate$ empty$
+ { pop$ "t" change.case$ }
+ { tie.or.space.prefix * * }
+ if$
+}
+
+FUNCTION {format.article.crossref}
+{
+ word.in
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.book.crossref}
+{ volume duplicate$ empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ pop$ word.in
+ }
+ { bbl.volume
+ swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word *
+ }
+ if$
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.incoll.inproc.crossref}
+{
+ word.in
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.org.or.pub}
+{ 't :=
+ ""
+ address "address" bibinfo.check
+ duplicate$ empty$
+ { pop$ t }
+ { t duplicate$ empty$
+ { pop$ }
+ {
+ "," word.space *
+ * swap$ *
+ }
+ if$
+ }
+ if$
+ *
+%<*!apsrmp>
+ year duplicate$ empty$
+ {
+ "empty year in " cite$ *
+ warning$
+ pop$ ""
+ }
+ 'skip$
+ if$
+ duplicate$ empty$
+ { pop$ }
+ {
+ "year" bibinfo.check
+ swap$
+ duplicate$ empty$
+ { pop$ }
+ {
+ "," *
+ word.space *
+ swap$ *
+ }
+ if$
+ }
+ if$
+%</!apsrmp>
+ duplicate$ empty$ 'skip$ {
+ ""
+ "(" * swap$ * ")" *
+ after.punctuation 'output.state :=
+ punctuation.space 'punctuation.state :=
+ } if$
+}
+
+FUNCTION {format.publisher.address}
+{ publisher "publisher" bibinfo.warn format.org.or.pub
+}
+
+FUNCTION {format.organization.address}
+{ organization "organization" bibinfo.check format.org.or.pub
+}
+
+FUNCTION {format.organization.publisher.address}
+{
+ publisher empty$
+ { format.organization.address }
+ { organization "organization" bibinfo.check output
+ format.publisher.address
+ }
+ if$
+}
+
+FUNCTION {format.school.address.output}
+{
+ school "school" bibinfo.warn
+ address "address" bibinfo.check
+ duplicate$ empty$ 'skip$
+ {
+ swap$
+ duplicate$ empty$ 'skip$
+ {
+ ", " *
+ }
+ if$
+ swap$
+ }
+ if$
+ *
+%<apsrmp> duplicate$ empty$ 'skip$ { "(" swap$ * ")" * } if$ after.punctuation 'output.state :=
+ output
+}
+
+FUNCTION {article.title.produce}
+{
+ control.title duplicate$ #0 <
+ { pop$
+ }{
+ format.title
+ "title" 'bibfield :=
+ swap$ #0 >
+ {
+ "title" output.check
+ }{
+ output
+ } if$
+ new.block.comma
+ } if$
+}
+
+FUNCTION {control}
+{
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors
+ booktitle empty$ {
+ "author" output.check
+ }{ output } if$
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ article.title.produce
+ output.article.booktitle
+ crossref missing$
+%<apsrev>%% Handle special case of SISSA journals which require an issue number for unique citations and use volume/year interchangably
+ {
+%<*!apsrev>
+ link.open
+ journal
+ "journal" bibinfo.warn
+ "journal" 'bibfield :=
+ output
+ add.blank
+ format.ser.vol.num
+ output
+ eid.or.pages
+%<!apsrmp> format.date.output.check
+ pages empty$ {
+ doi output
+ } 'skip$ if$
+ link.shut
+%</!apsrev>
+%<*apsrev>
+ journal "J. High Energy Phys." =
+ journal "J. High Energ. Phys." = or
+ journal "JHEP" = or
+ journal "Journal of Cosmology and Astroparticle Physics" = or
+ journal "J. Cosmol. Astropart. Phys." = or
+ journal "JCAP" = or
+ journal "Journal of Instrumentation" = or
+ journal "J. Instrum." = or
+ journal "JINST" = or
+ journal "Journal of Statistical Mechanics" = or
+ journal "J. of Stat. Mech." = or
+ journal "J. Stat. Mech.: Theory Exp." = or
+ journal "JSTAT" = or
+ {
+ link.open
+ journal
+ "journal" bibinfo.warn
+ "journal" 'bibfield :=
+ output
+ add.blank
+ format.vol.num output
+ number parenthesize
+ "number" bibinfo.warn
+ "number" 'bibfield :=
+ output
+ eid.or.pages
+ link.shut
+ }
+ {
+ eid missing$
+ pages missing$ and
+ doi missing$ not and
+ {
+ journal
+ "journal" bibinfo.warn
+ "journal" 'bibfield :=
+ output
+ add.blank
+ format.ser.vol.num
+ output
+ link.open
+ doi output
+ link.shut
+ format.date.output.check
+ }
+ {
+ link.open
+ journal
+ "journal" bibinfo.warn
+ "journal" 'bibfield :=
+ output
+ add.blank
+ format.ser.vol.num
+ output
+ eid.or.pages
+ format.date.output.check
+ link.shut
+ } if$
+ } if$
+%</apsrev>
+ }{
+ format.article.crossref output.nonnull
+%<!apsrmp> format.pages output
+%<apsrmp> eid.or.pages
+ }
+ if$
+%<!apsrev&!apsrmp> format.issn.output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint.controlled output
+ format.translation output
+ fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+ author empty$
+ {
+ format.editors "author and editor" output.check
+ editor format.key output
+ }{
+ format.authors output.nonnull
+%% crossref missing$ { editor.check.book } 'skip$ if$
+ }
+ if$
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ link.open
+ format.btitle
+ "title" output.check
+ link.shut
+ format.edition output
+ author empty$
+ {
+ }
+ {
+ format.editor.in output
+ editor format.key output
+ }
+ if$
+ format.number.series output
+ crossref missing$
+ {
+ format.bvolume output
+ new.block.comma
+ format.publisher.address output
+ }{
+ new.block.comma
+ format.book.crossref output.nonnull
+%<!apsrmp> format.date.output.check
+ }
+ if$
+ format.isbn.output
+ format.chapter.pages
+ output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output date.block
+ link.open
+ format.title
+ "title" output.check
+ link.shut
+ new.block.comma
+ howpublished "howpublished" bibinfo.check output
+ address "address" bibinfo.check output
+%<!apsrmp> format.date.output
+ format.isbn.output
+ format.book.pages output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {footnote}
+{ output.bibitem
+ format.note output
+ fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+ author empty$
+ {
+ format.editors "editor" output.check
+ editor format.key output
+ }{
+ format.authors output.nonnull
+ author format.key output
+ }
+ if$
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+
+ format.title output
+ new.block.comma
+
+ crossref missing$
+ {
+ format.in.ed.booktitle.inbook
+%<!apsrmp> format.publisher.address output
+ format.chapter.pages
+%<!apsrmp> "chapter and pages"
+%<apsrmp> "chapter"
+ output.check
+ new.block.comma
+ format.edition output
+ new.block.comma
+%<apsrmp> format.publisher.address output
+ }{
+ format.chapter.pages
+%<!apsrmp> "chapter and pages"
+%<apsrmp> "chapter"
+ output.check
+ new.block.comma
+ format.book.crossref output.nonnull
+%<!apsrmp> format.date.output.check
+ }
+ if$
+ crossref missing$
+ { format.isbn.output }
+ 'skip$
+ if$
+%<apsrmp> format.pages "pages" output.check
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ article.title.produce
+ crossref missing$
+ {
+ format.in.ed.booktitle
+%<!apsrmp> format.publisher.address output
+ format.edition output
+ format.chapter.pages output
+%<apsrmp> format.publisher.address output
+ format.isbn.output
+ }{
+ format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+%<apsrmp> format.pages "pages" output.check
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ article.title.produce
+ crossref missing$
+ {
+ format.in.ed.booktitle
+ format.organization.publisher.address output
+%<!apsrmp> format.chapter.pages output
+ format.isbn.output
+ format.issn.output
+ }{
+ format.incoll.inproc.crossref output.nonnull
+%<!apsrmp> format.chapter.pages output
+ }
+ if$
+%<apsrmp> format.chapter.pages "chapter and pages" output.check
+%<apsrmp> format.pages "pages" output.check
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+FUNCTION {manual}
+{ output.bibitem
+ format.authors output
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output date.block
+ link.open
+ format.btitle
+ "title" output.check
+ link.shut
+ organization "organization" bibinfo.check output
+ address "address" bibinfo.check output
+ format.edition output
+%<!apsrmp> format.date.output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ format.btitle
+ output
+ new.block.comma
+ link.open
+ bbl.mthesis
+ format.thesis.type
+ output.nonnull
+ link.shut
+ format.school.address.output
+%<!apsrmp> format.date.output.check
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ author format.key output
+%<apsrmp> format.date.output
+%<!apsrmp> new.block.comma
+%<apsrmp> date.block
+ link.open
+ format.title
+ output
+ link.shut
+ new.block.comma
+ howpublished "howpublished" bibinfo.check output
+%<!apsrmp> format.date.output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ format.btitle
+ output
+ new.block.comma
+ link.open
+ bbl.phdthesis
+ format.thesis.type
+ output.nonnull
+ link.shut
+ format.school.address.output
+%<!apsrmp> format.date.output.check
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {presentation}
+{ output.bibitem
+ format.authors output
+ author format.key output
+ new.block.comma
+ link.open
+ format.title
+ output
+ link.shut
+ new.block.comma
+ format.organization.address "organization and address" output.check
+ month "month" output.check
+ year "year" output.check
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ new.sentence
+ type missing$ 'skip$
+ {"(" type capitalize * ")" * output}
+ if$
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ format.editors output
+ editor format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ link.open
+ format.btitle
+ "title" output.check
+ link.shut
+ bookaddress "address" bibinfo.check output
+ format.number.series output
+ format.bvolume output
+ format.organization.publisher.address output
+ format.isbn.output
+ format.issn.output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ link.open
+%<!apsrev&!apsrmp> format.title
+%<apsrev|apsrmp> format.btitle
+ "title" output.check
+ link.shut
+ new.block.comma
+ format.tr.number
+ output.nonnull
+ institution "institution" bibinfo.warn
+ format.org.or.pub output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<*!apsrev>
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output date.block
+ link.open
+ format.title
+ "title" output.check
+ link.shut
+%</!apsrev>
+%<*apsrev>
+ article.title.produce
+ format.eprint output
+%</apsrev>
+%<!apsrmp> format.date.output
+ new.block.comma
+ new.sentence.comma
+ format.note "note" output.check
+%<!apsrev> format.eprint output
+ fin.entry
+}
+
+FUNCTION {dataset}
+{
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<apsrmp> format.date.output date.block
+ article.title.produce
+ doi missing$
+ url missing$ not and
+ {
+ link.open
+ url "url" output.check
+ link.shut
+ }
+ {
+ link.open
+ doi "doi" output.check
+ link.shut
+ } if$
+%<!apsrmp> format.date.output
+ format.note output
+ fin.entry
+}
+
+FUNCTION {default.type} { misc }
+
+READ
+
+EXECUTE {control.init}
+
+ITERATE {control.pass}
+
+EXECUTE {control.check}
+
+FUNCTION {sortify}
+{ purify$
+ "l" change.case$
+}
+
+INTEGERS { len }
+
+FUNCTION {chop.word}
+{ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+
+FUNCTION {cite.name.font.apply}
+{
+ word.space * bbl.etal
+ emphasize
+ *
+}
+
+%<*!apsrev&!apsrmp>
+FUNCTION {format.lab.names}
+{ 's :=
+ "" 't :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ {
+ format.name.apply
+ 't :=
+ nameptr #1 >
+ {
+ nameptr
+ #2
+ =
+ numnames
+ #3
+ > and
+ {
+ "others" 't :=
+ #1 'namesleft :=
+ }
+ 'skip$
+ if$
+ namesleft #1 >
+ { ", " * t * }
+ {
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ { 't := }
+ { pop$ }
+ if$
+ t "others" =
+ {
+ cite.name.font.apply
+ }{
+ numnames #2 > { "," * } 'skip$ if$
+ bbl.and
+ space.word * t *
+ }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+%</!apsrev&!apsrmp>
+%<*apsrev|apsrmp>
+FUNCTION {format.lab.names}
+{ 's :=
+ "" 't :=
+ #1 'nameptr :=
+ format.name.apply
+ s num.names$ duplicate$
+ #2 >
+ { pop$
+ cite.name.font.apply
+ }{
+ #2 <
+ 'skip$
+ {
+ s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ {
+ cite.name.font.apply
+ }{
+ bbl.and space.word *
+ s #2 "{vv~}{ll}" format.name$
+ cite.name.font
+ *
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+%</apsrev|apsrmp>
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.lab.names }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {editor.key.label}
+{ editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+
+FUNCTION {calc.short.authors}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ 'editor.key.label
+ 'author.key.label
+ if$
+ }
+ if$
+ 'short.list :=
+}
+
+FUNCTION {calc.label}
+{
+ calc.short.authors
+ short.list
+ year duplicate$ empty$
+%<apsrev|apsrmp> short.list key field.or.null = or
+ {
+ pop$ ""
+%<apsrmp> "????" *
+ }{
+ control.year #0 > { purify$ #-1 #4 substring$ } 'skip$ if$
+ }
+ if$
+ "(" swap$ *
+ * 'label :=
+}
+
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ "{ll{ }}"
+ control.author.initials {
+ "{ f{ }}" *
+ }{
+ "{ ff{ }}" *
+ } if$
+ "{ jj{ }}" *
+ format.name$ 't :=
+ nameptr #1 >
+ {
+ " " *
+ namesleft #1 = t "others" = and
+ { "zzzzz" * }
+ {
+ t sortify *
+ }
+ if$
+ }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+
+FUNCTION {author.sort}
+{ author empty$
+ { key empty$
+ { "to sort, need author or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {author.editor.sort}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { "to sort, need author, editor, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {year.sort.key}
+{
+ year
+}
+
+FUNCTION {editor.sort}
+{ editor empty$
+ { key empty$
+ { "to sort, need editor or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+}
+
+INTEGERS { seq.num }
+
+FUNCTION {init.seq}
+{ #0 'seq.num :=}
+
+EXECUTE {init.seq}
+
+FUNCTION {int.to.fix}
+{ "000000000" swap$ int.to.str$ *
+ #-1 #10 substring$
+}
+
+FUNCTION {label.presort}
+{
+ calc.label
+ label sortify
+ " "
+ *
+%<*!aipauth&!apsrmp>
+ seq.num #1 + 'seq.num :=
+ seq.num int.to.fix
+%</!aipauth&!apsrmp>
+%<*aipauth|apsrmp>
+ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.sort
+ 'author.sort
+ if$
+ }
+ if$
+ #1 entry.max$ substring$
+%</aipauth|apsrmp>
+ 'sort.label :=
+ sort.label
+ *
+ " "
+ *
+ title field.or.null sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+FUNCTION {presort.pass}
+{ type$ "control" = 'control.presort 'label.presort if$
+}
+
+ITERATE {presort.pass}
+
+SORT
+
+STRINGS { last.label next.extra }
+
+INTEGERS { last.extra.num number.label }
+
+FUNCTION {initialize.extra.label.stuff}
+{ #0 int.to.chr$ 'last.label :=
+ "" 'next.extra :=
+ #0 'last.extra.num :=
+ #0 'number.label :=
+}
+
+FUNCTION {label.forward}
+{
+ last.label label =
+ { last.extra.num #1 + 'last.extra.num :=
+ last.extra.num int.to.chr$ 'extra.label :=
+ }
+ { "a" chr.to.int$ 'last.extra.num :=
+ "" 'extra.label :=
+ label 'last.label :=
+ }
+ if$
+ number.label #1 + 'number.label :=
+}
+
+FUNCTION {label.reverse}
+{ next.extra "b" =
+ { "a" 'extra.label := }
+ 'skip$
+ if$
+ extra.label 'next.extra :=
+ extra.label
+ duplicate$ empty$
+ 'skip$
+ { "{\natexlab{" swap$ * "}}" * }
+ if$
+ 'extra.label :=
+ label extra.label * 'label :=
+}
+
+EXECUTE {initialize.extra.label.stuff}
+
+FUNCTION {forward.pass}
+{ type$ "control" = 'control.forward 'label.forward if$
+}
+
+ITERATE {forward.pass}
+
+FUNCTION {reverse.pass}
+{ type$ "control" = 'control.reverse 'label.reverse if$
+}
+
+REVERSE {reverse.pass}
+
+FUNCTION {sortkey.sort}
+{ sort.label
+ " "
+ *
+ year.sort.key
+ field.or.null sortify
+ *
+ " "
+ *
+ title field.or.null sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+FUNCTION {bib.sort.pass}
+{ type$ "control" = 'control.sort 'sortkey.sort if$
+}
+
+ITERATE {bib.sort.pass}
+
+SORT
+
+FUNCTION {init.bib.eprint}
+{
+ "\texttt {"
+ pop$
+ "\providecommand \url [0]{\begingroup\@sanitize@url \@url }%" write$ newline$
+ "\providecommand \@url [1]{\endgroup\@href {#1}{" "}}%" bbl.url.prefix swap$ * * write$ newline$
+ "\providecommand " " [0]{URL }%" bbl.url.prefix swap$ * * write$ newline$
+ eprint.command "\providecommand " swap$ * "[0]{\href }%" * write$ newline$
+}
+
+FUNCTION {init.bib.doi}
+{
+ "\providecommand \doibase [0]{" doi.base "}%" * * write$ newline$
+}
+
+FUNCTION {init.bib.hypertex}
+{
+ "\providecommand " noop.command "[0]{\@secondoftwo}%" * * write$ newline$
+ "\providecommand " href.command "[0]{\begingroup \@sanitize@url \@href}%" * * write$ newline$
+ "\providecommand \@href[1]{\@@startlink{#1}\@@href}%" write$ newline$
+ "\providecommand \@@href[1]{\endgroup#1\@@endlink}%" write$ newline$
+ "\providecommand \@sanitize@url [0]{\catcode `\\12\catcode `\$12\catcode `\&12\catcode `\#12\catcode `\^12\catcode `\_12\catcode `\%12\relax}%" write$ newline$
+ "\providecommand \@@startlink[1]{}%" write$ newline$
+ "\providecommand \@@endlink[0]{}%" write$ newline$
+}
+
+FUNCTION {init.bib.namefont}
+{
+ "\providecommand \bibnamefont [1]{#1}%" write$ newline$
+ "\providecommand \bibfnamefont [1]{#1}%" write$ newline$
+ "\providecommand \citenamefont [1]{#1}%" write$ newline$
+}
+
+FUNCTION {init.bib.quote}
+{
+ "\providecommand " bbl.enquote * " [1]{" *
+ "``" "''"
+ "#1" swap$ "}%" * * * * write$ newline$
+}
+
+FUNCTION {init.bib.ay}
+{
+ "\providecommand \natexlab [1]{#1}%"
+ write$ newline$
+}
+
+FUNCTION {init.bib.bibinfo}
+{
+ bibinfo.command "\providecommand " swap$ * " [0]{\@secondoftwo}%" * write$ newline$
+ bibfield.command "\providecommand " swap$ * " [0]{\@secondoftwo}%" * write$ newline$
+}
+
+FUNCTION {init.bib.lang}
+{
+ "\providecommand \selectlanguage [0]{\@gobble}%" write$ newline$
+}
+
+FUNCTION {init.bib.endbibitem}
+{
+ "\providecommand " bbl.open * "[0]{}%" * write$ newline$
+ "\providecommand \bibitemStop [0]{}%" write$ newline$
+ "\providecommand \bibitemNoStop [0]{.\EOS\space}%" write$ newline$
+ "\providecommand \EOS [0]{\spacefactor3000\relax}%" write$ newline$
+}
+
+FUNCTION {init.bib.translation}
+{
+ "\providecommand \translation [1]{[#1]}%" write$ newline$
+}
+
+FUNCTION {warn.bib}
+{
+}
+
+FUNCTION {init.bib}
+{
+ warn.bib
+ "\makeatletter" write$ newline$
+ "\providecommand \@ifxundefined [1]{%" write$ newline$
+ " \@ifx{#1\undefined}" write$ newline$
+ "}%" write$ newline$
+ "\providecommand \@ifnum [1]{%" write$ newline$
+ " \ifnum #1\expandafter \@firstoftwo" write$ newline$
+ " \else \expandafter \@secondoftwo" write$ newline$
+ " \fi" write$ newline$
+ "}%" write$ newline$
+ "\providecommand \@ifx [1]{%" write$ newline$
+ " \ifx #1\expandafter \@firstoftwo" write$ newline$
+ " \else \expandafter \@secondoftwo" write$ newline$
+ " \fi" write$ newline$
+ "}%" write$ newline$
+ init.bib.ay
+ init.bib.quote
+ init.bib.namefont
+ init.bib.hypertex
+ init.bib.eprint
+ init.bib.doi
+ init.bib.lang
+ init.bib.bibinfo
+ init.bib.translation
+ init.bib.endbibitem
+ "\providecommand " bbl.shut * " [1]{\csname bibitem#1\endcsname}%" * write$ newline$
+ "\let\auto@bib@innerbib\@empty" write$ newline$
+ "%</preamble>" write$
+}
+
+FUNCTION {begin.bib}
+{
+ id.bst diagn.cmntlog
+ control.bib
+ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{"
+ number.label int.to.str$
+ * "}%" *
+ write$ newline$
+ init.bib
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}%"
+ write$ newline$
+}
+
+EXECUTE {end.bib}
+
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</aapmrev|aipauth|aipnum|apsrev|apsrmp>
+% \end{macrocode}
+%
+% \endinput
+%
+% \Finale
diff --git a/Master/texmf-dist/source/latex/revtex/revtex4-2.dtx b/Master/texmf-dist/source/latex/revtex/revtex4-2.dtx
index 844a1edad12..f6e0b1ca601 100644
--- a/Master/texmf-dist/source/latex/revtex/revtex4-2.dtx
+++ b/Master/texmf-dist/source/latex/revtex/revtex4-2.dtx
@@ -77,7 +77,10 @@ Modified by Aptara on behalf of American Physical Society and American Institute
Version (4.2b,4.2c)
Modified by Mark Doyle, American Physical Society (mailto:revtex at aps.org)
-Copyright (c) 2019 American Physical Society.
+Version (4.2d,4.2e)
+Modified by Phelype Oleinik for the American Physical Society (mailto:phelype.oleinik at latex-project.org)
+
+Copyright (c) 2019--2020 American Physical Society.
https://journals.aps.org/revtex/
mailto:revtex@aps.org
@@ -128,17 +131,14 @@ See the REVTeX 4.2 README-REVTEX file for restrictions and more information.
% \fi
%
% \GetFileInfo{revtex4-2.dtx}
-% \CheckSum{6584}
%
% \StopEventually{}
% \iffalse ltxdoc klootch
%<*package>
%%% @LaTeX-file{
%%% filename = "revtex4-2.dtx",
-%%% version = "4.2c",
-%%% date = "2019/01/18",
-%%% time = "14:29:48 UT-5",
-%%% checksum = "6584",
+%%% version = "4.2e",
+%%% date = "2020/10/03",
%%% author = "Mark Doyle (mailto: revtex at aps.org), Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net),
%%% commissioned by the American Physical Society.
%%% ",
@@ -156,7 +156,6 @@ See the REVTeX 4.2 README-REVTEX file for restrictions and more information.
%%% keywords = "",
%%% supported = "yes",
%%% abstract = "",
-%%% docstring = "The checksum field above generated by ltxdoc",
%%% }
%</package>
% \fi
@@ -230,7 +229,7 @@ See the REVTeX 4.2 README-REVTEX file for restrictions and more information.
%</doc>
%<*!package&!options>
%<version>
- [2019/01/18/14:29:48 4.2c (https://journals.aps.org/revtex/ for documentation)]% \fileversion
+ [2020/10/03 4.2e (https://journals.aps.org/revtex/ for documentation)]% \fileversion
%</!package&!options>
% \end{macrocode}
% The current class name is remembered in \cmd\class@name.
@@ -651,8 +650,8 @@ The file \file{template.aps} is a boilerplate file.
mailto:revtex@aps.org^^J
Licensed under the LPPL:^^Jhttp://www.ctan.org/tex-archive/macros/latex/base/lppl.txt^^J
Arthur Ogawa <arthur_ogawa at sbcglobal dot net>^^J
- Based on work by David Carlisle <david at dcarlisle.demon.co.uk>%
- Version (4.2c): Modified by Mark Doyle^^J
+ Based on work by David Carlisle <david at dcarlisle.demon.co.uk>^^J
+ Version (4.2d,4.2e): Modified by Mark Doyle and Phelype Oleinik^^J
\@gobble
}%
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/revtex4-1/aip.dtx b/Master/texmf-dist/source/latex/revtex4-1/aip.dtx
new file mode 100644
index 00000000000..edfe1b17f76
--- /dev/null
+++ b/Master/texmf-dist/source/latex/revtex4-1/aip.dtx
@@ -0,0 +1,2059 @@
+% \iffalse meta-comment
+% aip.dtx: package to change page grid, MVL.
+% Copyright (c) 2008 American Institute of Physics
+% mailto:tex@aip.org
+%
+% Disclaimer
+% This file is distributed WITHOUT ANY WARRANTY;
+% without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+% License
+% You may distribute this file under the conditions of the
+% LaTeX Project Public License 1.3 or later
+% (http://www.latex-project.org/lppl.txt).
+% ReadMe
+% For the documentation and more detailed instructions for
+% installation, typeset this document with \LaTeX.
+% Maintenance Status
+% This work has the LPPL maintenance status "maintained";
+% Current Maintainer of this work is Arthur Ogawa.
+%
+% This work consists of the main source file aip.dtx
+% and the derived files
+% aip.rtx, aip.pdf, aip.ins, aip.drv.
+% Distribution:
+% CTAN:macros/latex/contrib/aip/
+%
+% Unpacking:
+% tex aip.dtx
+%
+% Documentation:
+% latex aip.dtx; ...
+%
+% Programm calls to get the documentation (example):
+% pdflatex aip.dtx
+% makeindex -s gind.ist aip
+% makeindex -s gglo.ist -o aip.gls aip.glo
+% pdflatex aip.dtx
+% makeindex -s gind.ist aip
+% pdflatex aip.dtx
+%
+% Installation:
+% TDS:bibtex/bst/aip/
+% TDS:doc/latex/aip/
+% TDS:source/latex/aip/
+% TDS:tex/latex/aip/
+%
+% Thanks, Heiko!
+% This method of letting a single .dtx file serve as both
+% documentation (via latex) and installer (via tex) follows
+% the example of Heiko Oberdiek. Thanks!
+%<*ignore>
+\begingroup
+ \def\x{LaTeX2e}%
+\expandafter\endgroup
+\ifcase
+ 0\expandafter\ifx\csname processbatchFile\endcsname\relax\else1\fi\ifx\fmtname\x\else 1\fi
+ \relax
+\else
+ \csname fi\endcsname
+%</ignore>
+%<*install>
+%% This file will generate documentation and runtime files
+%% from aip.dtx when run through LaTeX or TeX.
+%% This file requires docstrip version 2.4 or higher available from
+%% ftp://ctan.tug.org/tex-archive/macros/latex/unpacked/docstrip.tex
+\input docstrip
+\preamble
+
+This is a generated file;
+altering it directly is inadvisable;
+instead, modify the original source file.
+See the URL in the file README.
+
+Copyright (c) 2008 American Institute of Physics.
+mailto:tex@aip.org
+
+Maintained by Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net)
+under contract to American Institute of Physics.
+
+License
+ You may distribute this file under the conditions of the
+ LaTeX Project Public License 1.3 or later
+ (http://www.latex-project.org/lppl.txt).
+
+ This file is distributed WITHOUT ANY WARRANTY;
+ without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE.
+
+\endpreamble
+\askforoverwritefalse
+\keepsilent
+ \generate{%
+ %{ignore}
+% \file{aip.ins}{\from{aip.dtx}{install}}%
+% \file{aip.drv}{\from{aip.dtx}{driver}}%
+% \usedir{tex/latex/aip}%
+ \file{aip4-1.rtx}{\from{aip.dtx}{package}}%
+ }%
+\ifToplevel{
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation, please move}
+\Msg{* aip.rtx}
+\Msg{* into a directory searched by TeX;}
+\Msg{* in a TDS-compliant installation:}
+\Msg{* texmf/tex/macros/latex/aip/.}
+\Msg{*}
+\Msg{* To produce the documentation,
+ run aip.dtx through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing}
+\Msg{***********************************************************}
+}
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+% \fi
+%
+% \GetFileInfo{aip.dtx}
+%
+% \iffalse ltxdoc klootch
+%<*package>
+%%% @LaTeX-file{
+%%% filename = "aip.dtx",
+%%% version = "4.1s",
+%%% date = "2020/09/30",
+%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net),
+%%% commissioned by the American Institute of Physics.
+%%% ",
+%%% copyright = "Copyright (C) 2008 American Institute of Physics,
+%%% distributed under the terms of the
+%%% LaTeX Project Public License, see
+%%% ftp://ctan.tug.org/macros/latex/base/lppl.txt
+%%% ",
+%%% address = "AIP Journal Program
+%%% American Institute of Physics,
+%%% Suite 1NO1, 2 Huntington Quadrangle,
+%%% Melville, NY 11747 USA",
+%%% telephone = "",
+%%% FAX = "",
+%%% email = "mailto colon tex at aip.org",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "latex, page grid, main vertical list",
+%%% supported = "yes",
+%%% abstract = "aip substyle for REVTeX",
+%%% }
+%</package>
+% \fi
+%
+% \iffalse ltxdoc klootch
+% The following references the \file{README} file,
+% which contains basic information about this package.
+% The contents of this file are generated when
+% you typeset the programmer's documentation.
+% Search on "{filecontents*}{README}" to locate it.
+% \fi\input{README}%
+%
+% \subsection{Bill of Materials}
+%
+% Following is a list of the files in this distribution arranged
+% according to provenance.
+%
+% \subsubsection{Primary Source}%
+% One single file generates all.
+%\begin{verbatim}
+%aip.dtx
+%\end{verbatim}
+%
+% \subsubsection{Generated by \texttt{latex aip.dtx}}%
+% Typesetting the source file under \LaTeX\
+% generates the readme and the installer.
+%\begin{verbatim}
+%README aip.ins
+%\end{verbatim}
+%
+% \subsubsection{Generated by \texttt{tex aip.dtx}}%
+% Typesetting the installer generates
+% the package files.
+%\begin{verbatim}
+%aip.rtx
+%\end{verbatim}
+%
+% \subsubsection{Documentation}%
+% The following are the online documentation:
+% \begin{verbatim}
+%aip.pdf
+% \end{verbatim}
+%
+% \subsubsection{Auxiliary}%
+% The following are auxiliary files generated
+% in the course of running \LaTeX:
+% \begin{verbatim}
+%aip.aux aip.idx aip.ind aip.log aip.toc
+% \end{verbatim}
+%
+% \section{Code common to all modules}%
+%
+% The following may look a bit klootchy, but we
+% want to require only one place in this file
+% where the version number is stated,
+% and we also want to ensure that the version
+% number is embedded into every generated file.
+%
+% Now we declare that
+% these files can only be used with \LaTeXe.
+% An appropriate message is displayed if
+% a different \TeX{} format is used.
+% \begin{macrocode}
+%<*driver|package>
+\NeedsTeXFormat{LaTeX2e}[1996/12/01]%
+%</driver|package>
+% \end{macrocode}
+% As desired, the following modules all
+% take common version information:
+% \begin{macrocode}
+%<package>\ProvidesFile{aip4-1.rtx}%
+%<*driver>
+\expandafter\ProvidesFile\expandafter{\jobname.dtx}%
+%</driver>
+% \end{macrocode}
+%
+% The following line contains, for once and for all,
+% the version and date information.
+% By various means, this information is reproduced
+% consistently in all generated files and in the
+% typeset documentation.
+% \begin{macrocode}
+%<*driver|package>
+%<version>
+ [2020/09/30 4.1s AIP substyle for REVTeX]% \fileversion
+%</driver|package>
+% \end{macrocode}
+%
+%
+% \section{The driver module \texttt{driver}}
+%
+% This module, consisting of the present section,
+% typesets the programmer's documentation,
+% generating the \file{.ins} installer and \file{README} as required.
+%
+% Because the only uncommented-out lines of code at the beginning of
+% this file constitute the \file{driver} module itself,
+% we can simply typeset the \file{.dtx} file directly,
+% and there is thus rarely any need to
+% generate the ``driver'' {\sc docstrip} module.
+% Module delimiters are nonetheless required so that
+% this code does not find its way into the other modules.
+%
+% The \enve{document} command concludes the typesetting run.
+%
+% \begin{macrocode}
+%<*driver>
+% \end{macrocode}
+%
+% \subsection{The Preamble}
+% The programmers documentation is formatted
+% with the \classname{ltxdoc} class with local customizations,
+% and with the usual code line indexing.
+% \begin{macrocode}
+\documentclass{ltxdoc}
+\RequirePackage{ltxdocext}%
+\let\url\undefined
+\RequirePackage[colorlinks=true,linkcolor=blue]{hyperref}%
+\expandafter\ifx\csname package@font\endcsname\relax\else
+ \expandafter\expandafter
+ \expandafter\RequirePackage
+ \expandafter\expandafter
+ \expandafter{\csname package@font\endcsname}%
+\fi
+\gdef\lquote{`}\gdef\rquote{'}%
+\CodelineIndex\EnableCrossrefs % makeindex -s gind.ist aip
+\RecordChanges % makeindex -s gglo.ist -o aip.gls aip.glo
+% \end{macrocode}
+%
+% \subsubsection{Docstrip and info directives}
+% We use so many {\sc docstrip} modules that we set the
+% \texttt{StandardModuleDepth} counter to 1.
+% \begin{macrocode}
+\setcounter{StandardModuleDepth}{1}
+% \end{macrocode}
+% The following command retrieves the date and version information
+% from this file.
+% \begin{macrocode}
+\expandafter\GetFileInfo\expandafter{\jobname.dtx}%
+% \end{macrocode}
+%
+% \subsection{The ``Read Me'' File}
+% As promised above, here is the contents of the
+% ``Read Me'' file. That file serves a double purpose,
+% since it also constitutes the beginining of the
+% programmer's documentation. What better thing, after
+% all, to have appear at the beginning of the
+% typeset documentation?
+%
+% A good discussion of how to write a ReadMe file can be found in
+% Engst, Tonya, ``Writing a ReadMe File? Read This''
+% \emph{MacTech} October 1998, p. 58.
+%
+% Note the appearance of the
+% \cmd\StopEventually\ command, which marks the
+% dividing line between the user documentation
+% and the programmer documentation.
+%
+% The usual user will not be asked to
+% do a full build, not to speak
+% of the bootstrap.
+% Instructions for carrying these processes
+% begin the programmer's manual.
+%
+%\changes{4.1b}{2008/08/06}{Beta candidate b}
+% \begin{macrocode}
+\begin{filecontents*}[overwrite]{README}
+\title{%
+ The \classname{aip} substyle for REV\TeX%
+ \protect\thanks{%
+ \fileversion\ \copyright 2009 American Institute of Physics
+ % For version number and date,
+ % search on "\fileversion" in the .dtx file,
+ % or see the end of the README file.
+ }%
+}%
+
+\author{%
+Arthur Ogawa\thanks{mailto:arthur\_ogawa at sbcglobal.net}%
+}%
+\date{Version \fileversion, dated \filedate}%
+\maketitle
+
+This file embodies the implementation of the
+AIP journal substyles for APS's \revtex\ 4.1 document class
+for electronic submissions to AIP journals.
+
+The distribution point for this work is
+\url{http://authors.aip.org/REVTEX}.
+The archive contains ready-to-Install files, documentation, and full source.
+
+This package is also distributed via CTAN:
+\url{http://www.ctan.org/pub/tex-archive/macros/latex/contrib/aip}, and as a ready-to-install image as
+\url{http://www.ctan.org/pub/tex-archive/install/macros/latex/contrib/aip.tds.zip}.
+
+The \classname{aip} package was commissioned by the American Institute of Physics
+and is distributed under the terms of the \LaTeX\ Project Public License,
+the same license under which all the portions of \LaTeX\ itself is distributed.
+Please see \url{http://ctan.tug.org/macros/latex/base/lppl.txt} for details.
+
+To use this document class, you must have a working
+\TeX\ installation equipped with \LaTeXe\
+and possibly pdftex and Adobe Acrobat Reader or equivalent.
+
+To install, retrieve the distribution,
+unpack it into a directory on the target computer,
+and move the file \file{aip.rtx}
+into a location in your filesystem where it will be found by \LaTeX.
+
+To use, read the user documentation \file{auguide.pdf}.
+
+\tableofcontents
+
+\section{Overview}%
+\revtex\ is a \LaTeXe\ document class, somewhat like a hybrid of
+the standard \LaTeX\ \classname{book} and \classname{article} classes.
+
+This document class implements the AIP society and journal substyles:
+the journals represent a set of mutually exclusive class options that, in this case, allow the
+document class to address multiple journals within the AIP family.
+This society is obtained with class option \classoption{aip}.
+
+\section{Processing Instructions}
+
+The package file \file{aip.rtx}
+is generated from this file, \file{aip.dtx},
+using the {\sc docstrip} facility of \LaTeX
+via |tex aip.dtx|.
+The typeset documentation that you are now reading is generated from
+the same file by typesetting it with \LaTeX\ or pdftex
+via |latex aip.dtx| or |pdflatex aip.dtx|.
+
+\subsection{Build Instructions}
+
+You may bootstrap this suite of files solely from \file{aip.dtx}.
+Prepare by installing \LaTeXe\ (and either tex or pdftex) on your computer,
+then carry out the following steps:
+\begin{enumerate}
+\item
+Within an otherwise empty directory,
+typeset \file{aip.dtx} with \LaTeX\ or pdflatex;
+you will obtain the typeset documentation you are now reading,
+along with
+the installer \file{aip.ins},
+and the file \file{README}.
+
+Note: you will have to run \LaTeX\ twice, then \file{makeindex}, then
+\LaTeX\ again in order to obtain a valid index and table of contents.
+\item
+Now typeset \file{aip.dtx} with \TeX (not \LaTeX),
+thereby generating the package file \file{aip.rtx}.
+\item
+Install \classname{aip.rtx}
+by moving it to a location
+in your filesystem where it will be found by \LaTeX,
+like \file{tex/latex/aip}.
+\item
+Install \classname{aip.pdf}
+by moving it to
+\file{doc/latex/aip}.
+\item
+Using the \file{.dbj} information herein,
+generate the needed \file{.bst} files and install them in
+\file{bibtex/bst/aip}.
+\end{enumerate}
+\end{filecontents*}
+% \end{macrocode}
+%
+% \subsection{The Document Body}
+%
+% Here is the document body, containing only a
+% \cmd\DocInput\ directive---referring to this very file.
+% This very cute self-reference is a common \classname{ltxdoc} idiom.
+% \begin{macrocode}
+\begin{document}%
+\newcommand\revtex{REV\TeX}%
+\expandafter\DocInput\expandafter{\jobname.dtx}%
+% ^^A\PrintChanges
+\end{document}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</driver>
+% \end{macrocode}
+%
+% \section{AIP: A set of journal-specifc extensions to \revtex}
+%
+% To create a journal substyle, you create
+% a \file{.rtx} file, in our case \file{aip.rtx}.
+% Within that file, you override procedures and parameter assignments as you see fit.
+% Ideally they will be generally applicable to all of that society's
+% journals (see the file \file{aps.rtx} for a realization of this scheme).
+% Also within that file, you include a
+% section of code for each journal, that for JMP looks like:
+% \begin{verbatim}
+% \@ifx{\@journal\journal@jmp}{%
+% <code specific to the JMP>
+% }{}%
+% \end{verbatim}
+%
+% \section{The \classoption{aip} class option: the \texttt{aip} module}
+% The file \file{aip.rtx} is read in by the \classname{revtex4} document class
+% if \cmd\@society\ has the value \classoption{aip}.
+%
+% Here, code specific to AIP journals appears.
+%
+% We first give some text entities (amounting to journal abbreviations),
+% then some AIP-specific initialisations,
+% then code for particular AIP journals.
+% In the latter case, the choice is
+% keyed off the macro \cmd\@journal.
+%
+% Note on \cmd\AtEndOfClass:
+% this file, like all journal substyles, is read in at \cmd\AtEndOfClass\ time,
+% so you should not use this command in this file.
+% Note for \LaTeX\ developers: It would be an improvement in \LaTeX\ to
+% \cmd\let\cmd\AtEndOfClass\ to something like \cmd\@firstofone.
+% This change would be effected in \cmd\@onefilewithoptions.
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \subsection{Defend Against Forseeable Errors}%
+% Protect this file from being read in by anything but \revtex.
+% \begin{macrocode}
+\ifx\undefined\substyle@ext
+ \def\@tempa{%
+ \endinput
+ \GenericWarning{I must be read in by REVTeX! (Bailing out)}%
+ }%
+ \expandafter\else
+ \def\@tempa{}%
+ \expandafter\fi\@tempa
+ \class@info{RevTeX society AIP selected}%
+% \end{macrocode}
+%
+% \subsection{Substyle Options}%
+%
+% Here are the class options relating to the AIP:
+% \begin{macrocode}
+\DeclareOption{jcp}{\change@journal{jcp}}%
+\DeclareOption{pop}{\change@journal{pop}}%
+\DeclareOption{rsi}{\change@journal{rsi}}%
+\DeclareOption{jap}{\change@journal{jap}}%
+\DeclareOption{apl}{\change@journal{apl}}%
+\DeclareOption{cha}{\change@journal{cha}}%
+\DeclareOption{pof}{\change@journal{pof}}%
+\DeclareOption{bmf}{\change@journal{bmf}}%
+\DeclareOption{rse}{\change@journal{rse}}%
+\DeclareOption{jmp}{\change@journal{jmp}}%
+% \end{macrocode}
+%
+% Option allowing for ``numerical author-year'' bibliography.
+% \begin{macrocode}
+\DeclareOption{author-numerical}{%
+ \@booleantrue\authoryear@sw
+ \@booleantrue\authornum@sw
+}%
+% \end{macrocode}
+%
+% Optionally allow article title in bibliography entries.
+% A new switch is defined here: \cmd\aip@jtitx@sw\ signifies that
+% the numbered style bibliography is to be prepared without article titles in @ARTICLE entries.
+% Otherwise, such titles are incorporated if present in the \file{.bib} entry.
+% By default, exclude the article titles.
+% \begin{macrocode}
+\DeclareOption{article-title}{%
+ \@booleanfalse\aip@jtitx@sw
+}%
+\@booleantrue \aip@jtitx@sw
+% \end{macrocode}
+%
+% Establish default options for this society.
+%
+% \begin{macrocode}
+\@booleanfalse\authoryear@sw
+\@booleanfalse\authornum@sw
+% \end{macrocode}
+%
+% \begin{macro}{\@bibdataout@init}
+% \begin{macro}{\@bibdataout@aip}
+% \changes{4.1o}{2010/02/12}{(AO, 580) Control .bst at run time.}%
+% Procedure \cmd\@bibdataout@aip\ has the job of writing the control record into the
+% job's \cmd\jobname\filename{.bib} file, where it will adjust the options to \filename{.bst} processing.
+% It is installed into the initialization procedure \cmd\@bibdataout@init, and its meaning
+% is set by the society (AIP) and journal.
+%
+% \begin{macrocode}
+\appdef\@bibdataout@rev{\@bibdataout@aip}%
+\def\@bibdataout@aip{%
+ \immediate\write\@bibdataout{%
+% \end{macrocode}
+% An entry that controls processing of the \filename{.bst} file has entry type \texttt{@CONTROL}.
+% \begin{macrocode}
+ @CONTROL{%
+ aip41Control%
+% \end{macrocode}
+% Say whether we want long bibliography style (the default), or the abbreviated style.
+% \begin{macrocode}
+ \longbibliography@sw{\true@sw}{\aip@jtitx@sw{\false@sw}{\true@sw}}%
+ {%
+ ,pages="1",title="0"%
+ }{%
+ ,pages="0",title=""%
+ }%
+ }%
+ }%
+% \end{macrocode}
+% Place a \cmd\citation\ into the auxiliary file corresponding to this entry.
+% \begin{macrocode}
+ \if@filesw
+ \immediate\write\@auxout{\string\citation{aip41Control}}%
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% For AIP, the preprint style \classoption{preprint} is the default.
+% \begin{macrocode}
+\@booleantrue\preprintsty@sw
+% \end{macrocode}
+%
+% \begin{macro}{\showPACS@sw}
+% \begin{macro}{\showKEYS@sw}
+% If \cmd\showPACS@sw\ is true, print the PACS information in the title block,
+% otherwise not.
+% Similarly for \cmd\showKEYS@sw\ and the keywords.
+% \begin{macrocode}
+\@booleantrue\showPACS@sw
+\@booleantrue\showKEYS@sw
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\refname}
+%
+% In reprint style only, we eliminate the head above the bibliography.
+% \begin{macrocode}
+\appdef\setup@hook{%
+ \preprintsty@sw{}{%
+ \let\refname\@empty
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{AIP Setup}%
+% Here we define the default procedures for AIP journals.
+% Individual AIP journals may override these definitions.
+%
+% \subsubsection{Running header and footer}%
+%
+% Page style for all AIP journals.
+% We assert our own page style only if nobody else has done so.
+% Users wishing to customize their documents will be able to invoke a \cmd\pagestyle\
+% command anywhere in the preamble.
+%FIXME: \cmd\preprintsty@sw\ is defined?
+% \begin{macrocode}
+\appdef\setup@hook{%
+ \preprintsty@sw{%
+ \ps@preprint
+ }{%
+ \ps@article
+ }%
+}%
+% \end{macrocode}
+%
+% The spc says: ``Running title must be provided on title page'',
+% and that journal classes 1b and 2 have no running title.
+% \begin{macrocode}
+\def\ps@preprint{%
+ \def\@oddhead{\@runningtitle\hfil}%
+ \def\@evenhead{\@runningtitle\hfil}%
+ \def\@oddfoot{\hfil\thepage\quad\checkindate\hfil}%
+ \def\@evenfoot{\hfil\thepage\quad\checkindate\hfil}%
+ \let\@mkboth\@gobbletwo
+ \let\sectionmark\@gobble
+ \let\subsectionmark\@gobble
+}%
+\def\ps@article{%
+ \def\@evenhead{\let\\\heading@cr\thepage\quad\checkindate\hfil\@runningtitle}%
+ \def\@oddhead{\let\\\heading@cr\@runningtitle\hfil\checkindate\quad\thepage}%
+ \def\@oddfoot{}%
+ \def\@evenfoot{}%
+ \let\@mkboth\@gobbletwo
+ \let\sectionmark\@gobble
+ \let\subsectionmark\@gobble
+}%
+\def\@runningtitle{\@shorttitle}%
+% \end{macrocode}
+%
+% \subsubsection{Title block}%
+%
+% The specifics of the title block.
+% Apply to all AIP journals; individual journals may override these settings.
+%
+% \begin{macro}{\titlepage}
+% \begin{macrocode}
+\renewenvironment{titlepage}{%
+ \let\wastwocol@sw\twocolumn@sw
+ \onecolumngrid
+ \newpage
+ \thispagestyle{titlepage}%
+ \c@page\z@% article sets this to one not zero???
+}{%
+ \wastwocol@sw{\twocolumngrid}{\newpage}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@fnsymbol}
+% On the title page, footnotes are lettered with right parenthesis: ``a)''.
+% \begin{macrocode}
+\let\@fnsymbol@latex\@fnsymbol
+\let\@fnsymbol\@alph
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\adjust@abstractwidth}
+% This procedure is used by many titlepage elements to indent on the left by a particular
+% amount. The author list uses \cmd\frontmatter@authorformat\ to accomplish the same.
+% \begin{macrocode}
+\def\adjust@abstractwidth{%
+ \parindent1em\relax
+ \advance\leftskip.5in\relax
+ \@totalleftmargin\leftskip
+ \@afterheading\@afterindentfalse
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frontmatter@abstractheading}
+% AIP Journals all set the abstract head the same way, with no head.
+% \begin{macrocode}
+\def\frontmatter@abstractheading{}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frontmatter@abstractfont}
+% All AIP journals set the abstract body the same way.
+% \begin{macrocode}
+\def\frontmatter@abstractfont{%
+%\small
+ \adjust@abstractwidth
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% All AIP journal preprints use separate titlepage and full-width abstract.
+% \begin{macrocode}
+\appdef\setup@hook{%
+ \preprintsty@sw{%
+ \@booleantrue\titlepage@sw
+% \def\frontmatter@affiliationfont{\it}%
+ \let\section\section@preprintsty
+% \let\@hangfrom@section\@hangfrom@section@preprintsty
+ \let\subsection\subsection@preprintsty
+ \let\subsubsection\subsubsection@preprintsty
+ }{}%
+}%
+% \end{macrocode}
+%
+% \begin{macro}{\frontmatter@authorformat}
+% All AIP journals set the author list the same.
+% The leading is 11.5 points, and
+% there is 11.5 points of extra space above the first author line
+% (which amounts to the same thing as 11.5 points extra below the title)
+% for a total of 23 points base-to-base.
+%
+% \begin{macrocode}
+\def\frontmatter@@indent{%
+ \skip@\@flushglue
+ \@flushglue\z@ plus.3\hsize\relax
+ \raggedright
+ \advance\leftskip.5in\relax
+ \@totalleftmargin\leftskip
+ \@flushglue\skip@
+}%
+\def\frontmatter@authorformat{%
+ \frontmatter@@indent
+ \sffamily
+%\advance\baselineskip\p@
+%\parskip11.5\p@\relax
+}%
+\renewcommand*\email[1][Electronic mail: ]{\begingroup\sanitize@url\@email{#1}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frontmatter@above@affilgroup}
+% The default amount of space above affiliation.
+% \begin{macrocode}
+\def\frontmatter@above@affilgroup{%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frontmatter@above@affiliation}
+% \begin{macro}{\frontmatter@above@affiliation@script}
+% The default amount of space above affiliation.
+% \begin{macrocode}
+\def\frontmatter@above@affiliation@script{%
+ \frontmatter@@indent
+%\addvspace{3.5\p@}%
+}%
+\def\frontmatter@above@affiliation{%
+}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\frontmatter@affiliationfont}
+% All AIP journals set the affiliation the same.
+% Like the author, but in italic.
+% \begin{macrocode}
+\def\frontmatter@affiliationfont{%
+ \frontmatter@@indent
+ \preprintsty@sw{}{\small}%
+ \it
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frontmatter@collaboration@above}
+% \begin{macrocode}
+\def\frontmatter@collaboration@above{%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% Set up the default AIP style for title block authors and affiliations.
+%
+% \begin{macro}{\frontmatter@setup}
+% All AIP journals set the title page using the same font and size.
+% However, justification varies for the title block elements, so
+% we assert none here.
+% \begin{macrocode}
+\def\frontmatter@setup{%
+ \normalfont
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frontmatter@title@above}
+% \begin{macro}{\frontmatter@title@format}
+% \begin{macro}{\frontmatter@title@below}
+% All AIP journals set the article title 12 point Times Roman, bold, flush left.
+%
+% \begin{macrocode}
+\def\frontmatter@title@above{\addvspace{6\p@}}%
+\def\frontmatter@title@format{%
+ \preprintsty@sw{}{\Large}%
+ \sffamily
+ \bfseries
+ \raggedright
+ \parskip\z@skip
+}%
+\def\frontmatter@title@below{\addvspace{3\p@}}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\frontmatter@makefnmark}
+% All AIP journals share this procedure for setting the titlepage footnote text:
+% superior lowercase letter, with right parenthesis.
+% \begin{macrocode}
+\def\@author@parskip{3\p@}%
+\@booleantrue\altaffilletter@sw
+\def\frontmatter@makefnmark{%
+ \@textsuperscript{%
+ \normalfont\@thefnmark%(
+ )%
+ }%
+}%
+\def\frontmatter@authorbelow{%
+ \addvspace{3\p@}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\affil@cutoff}
+% We override \cmd\affil@cutoff\ to enforce the rule that,
+% if a single affiliation appears on the title page, then
+% no affiliation superscript at all is produced.
+% \begin{macrocode}
+\let\affil@cutoff\tw@
+% \end{macrocode}
+% De awa.
+% \end{macro}
+%
+% \begin{macro}{\frontmatter@RRAP@format}
+% All AIP journals use the same format for the ``Received, Revised, etc.'' block on the title page.
+%
+% Change note: 11.5 points b-b from author/affiliation down to date.
+% \begin{macrocode}
+\def\frontmatter@RRAP@format{%
+ \addvspace{5\p@}%
+ \small
+ \raggedright
+ \advance\leftskip.5in\relax
+ \@totalleftmargin\leftskip
+% \preprintsty@sw{}{\parskip.5ex\relax}%
+ \everypar{%
+ \hbox\bgroup(\@gobble@leavemode@uppercase%)
+ }%
+ \def\par{%
+ \@ifvmode{}{%(
+ \unskip)\egroup\@@par
+ }%
+ }%
+}%
+\def\punct@RRAP{;\egroup\ \hbox\bgroup}%
+\def\@gobble@leavemode@uppercase#1#2{\expandafter\MakeTextUppercase}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frontmatter@PACS@format}
+%
+% \begin{macrocode}
+\def\frontmatter@PACS@format{%
+ \addvspace{11\p@}%
+% \footnotesize
+ \adjust@abstractwidth
+ \parskip\z@skip
+ \samepage
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frontmatter@keys@format}
+%
+% \begin{macrocode}
+\def\frontmatter@keys@format{%
+% \footnotesize
+ \adjust@abstractwidth
+ \samepage
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ps@titlepage}
+% Title page style. Currently empty except for preprint header,
+% which consists of all the \cmd\preprint\ arguments,
+% stacked flush right at the right margin.
+% \begin{macrocode}
+\def\ps@titlepage{%
+ \def\@oddhead{%
+ \@runningtitle
+ \hfill
+ \produce@preprints\@preprint
+ }%
+ \let\@evenhead\@oddhead
+ \def\@oddfoot{%
+ \hb@xt@\z@{\byrevtex\hss}%
+ \hfil
+ \preprintsty@sw{\thepage}{}%
+ \quad\checkindate
+ \hfil
+ }%
+ \let\@evenfoot\@oddfoot
+}%
+\def\byrevtex{\byrevtex@sw{Typeset by REV\TeX and AIP}{}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\produce@preprints}
+% \begin{macrocode}
+\def\produce@preprints#1{%
+ \preprint@sw{%
+ \vtop to \z@{%
+ \def\baselinestretch{1}%
+ \small
+ \let\preprint\preprint@count
+ \count@\z@#1\@ifnum{\count@>\tw@}{%
+ \hbox{%
+ \let\preprint\preprint@hlist
+ #1\setbox\z@\lastbox
+ }%
+ }{%
+ \let\preprint\preprint@cr
+ \halign{\hfil##\cr#1\crcr}%
+ \par
+ \vss
+ }%
+ }%
+ }{}%
+}%
+\def\preprint@cr#1{#1\cr}%
+\def\preprint@count#1{\advance\count@\@ne}%
+\def\preprint@hlist#1{#1\hbox{, }}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Lead-in paragraph}%
+%
+% The \env{Lead-in paragraph} environment formats the AIP ``lead paragraph''.
+% To avoid introducing new syntax, we take over the \env{quotation} environment
+% until the first \cmd\section\ (or other sectioning command) appears.
+%
+% \begin{macrocode}
+\newenvironment{Lead@inParagraph}{%
+ \par
+ \bfseries
+ \@afterheading\@afterindentfalse
+}{%
+ \par
+ \hb@xt@\hsize{\hfil\leaders\hrule\hfil\leaders\hrule\hfil\hfil}%
+}%
+% \end{macrocode}
+% At the beginning of the document temporarily change the meaning of
+% the \env{quotation} environment, restoring it once the first sectioning
+% command is given.
+% \begin{macrocode}
+\appdef\frontmatter@init{%
+ \let@environment{quotation@ltx}{quotation}%
+ \let@environment{quotation}{Lead@inParagraph}%
+}%
+\appdef\@startsection@hook{%
+ \let@environment{quotation}{quotation@ltx}%
+}%
+% \end{macrocode}
+%
+% \subsubsection{Stacked Heads}%
+% All AIP journals put a period (.), followed by quad space, after the section number.
+% Also, no hanging section number.
+% \begin{macrocode}
+\def\@seccntformat#1{\csname the#1\endcsname.\quad}%
+\def\@hang@from#1#2#3{#1#2#3}%
+% \end{macrocode}
+%
+% Note that in the following, we wish to set the section head uppercase, so we use
+% David Carlisle's \cmd\MakeTextUppercase. However, because this procedure effectively
+% parses its argument (looking for things to \emph{not} translate), it has to be invoked
+% in such a way that the argument of the \cmd\section\ command is passed to it as its
+% own argument.
+%
+% To accomplish this, we use the \cmd\@hangfrom@\ hook, which was developed for this
+% purpose.
+%
+% \begin{macrocode}
+\def\section{%
+ \@startsection
+ {section}%
+ {1}%
+ {\z@}%
+ {0.8cm \@plus1ex \@minus .2ex}%
+ {0.5cm}%
+ {%
+ \normalfont
+ \small
+ \sffamily
+ \bfseries
+ \raggedright
+ }%
+}%
+\def\@hangfrom@section#1#2#3{\@hangfrom{#1#2}\MakeTextUppercase{#3}}%
+\def\@hangfroms@section#1#2{#1\MakeTextUppercase{#2}}%
+% \end{macrocode}
+%
+% See, e.g., BMF\_044101\_1 (1) or BMF\_044103\_1 (1)
+% \begin{macrocode}
+\def\subsection{%
+ \@startsection
+ {subsection}%
+ {2}%
+ {\z@}%
+ {.8cm \@plus1ex \@minus .2ex}%
+ {.5cm}%
+ {%
+ \normalfont
+ \small
+ \sffamily
+ \bfseries
+ \raggedright
+ }%
+}%
+% \end{macrocode}
+%
+% See, e.g., BMF\_044104\_1 (1), JMP\_123520\_1 (48),
+% \begin{macrocode}
+\def\subsubsection{%
+ \@startsection
+ {subsubsection}%
+ {3}%
+ {\z@}%
+ {.8cm \@plus1ex \@minus .2ex}%
+ {.5cm}%
+ {%
+ \normalfont
+ \small
+ \sffamily
+ \bfseries
+ \itshape
+ \raggedright
+ }%
+}%
+% \end{macrocode}
+%
+% \subsubsection{Runin Heads}%
+% \begin{macrocode}
+\def\paragraph{%
+ \@startsection
+ {paragraph}%
+ {4}%
+ {\parindent}%
+ {\z@}%
+ {-1em}%
+ {\normalfont\normalsize\itshape}%
+}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\subparagraph{%
+ \@startsection
+ {subparagraph}%
+ {5}%
+ {\parindent}%
+ {3.25ex \@plus1ex \@minus .2ex}%
+ {-1em}%
+ {\normalfont\normalsize\bfseries}%
+}%
+% \end{macrocode}
+%
+% \begin{macro}{\section@preprintsty}
+% \begin{macro}{\subsection@preprintsty}
+% \begin{macro}{\subsubsection@preprintsty}
+% Here are the formatting procedures specific to the preprint style;
+% the only difference is that the heads are flush left instead of centered.
+%
+% \begin{macrocode}
+\def\section@preprintsty{%
+ \@startsection
+ {section}%
+ {1}%
+ {\z@}%
+ {0.8cm \@plus1ex \@minus .2ex}%
+ {0.5cm}%
+ {%
+ \normalfont
+ \bfseries
+ \raggedright
+ }%
+}%
+%\def\@hangfrom@section@preprintsty#1#2#3{\@hangfrom{#1#2}\MakeTextUppercase{#3}}%
+% \end{macrocode}
+% \begin{macrocode}
+\def\subsection@preprintsty{%
+ \@startsection
+ {subsection}%
+ {2}%
+ {\z@}%
+ {.8cm \@plus1ex \@minus .2ex}%
+ {.5cm}%
+ {%
+ \normalfont
+ \bfseries
+ \raggedright
+ }%
+}%
+% \end{macrocode}
+% \begin{macrocode}
+\def\subsubsection@preprintsty{%
+ \@startsection
+ {subsubsection}%
+ {3}%
+ {\z@}%
+ {.8cm \@plus1ex \@minus .2ex}%
+ {.5cm}%
+ {%
+ \normalfont
+% \small
+ \itshape\bfseries
+ \raggedright
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% For examples of
+% \env{theorem}, \env{proposition}, \env{lemma}, \env{remark}, \env{corollary}, \env{example},
+% and \env{proof} (with optional title),
+% using independent numbering for each class,
+% and with numbered and roman lists therein,
+% see JMP\_122901\_1 (48).
+%
+% For theorems, etc, numbered by section, (and with theorems in the appendix)
+% but equations numbered throughout,
+% see JMP\_123301\_1 (48).
+%
+% For a (roman) list in text, theorem, and proof,
+% see JMP\_123514\_1 (48).
+%
+% For numbered list in text,
+% and equations numbered by section,
+% see JMP\_123518\_1 (48).
+%
+% All AIP journals use frontmatter footnotes by default.
+% \begin{macrocode}
+\let\frontmatter@footnote@produce\frontmatter@footnote@produce@footnote
+% \end{macrocode}
+%
+%
+% \subsubsection{Table of Contents}%
+% The toc will itself make an entry in the toc,
+% but we temporarily turn off toc formatting for the duration.
+% \begin{macrocode}
+\def\@pnumwidth{1.55em}
+\def\@tocrmarg {2.55em}
+\def\@dotsep{2}
+\def\ltxu@dotsep{4.5pt}
+\setcounter{tocdepth}{3}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\tableofcontents{%
+ \addtocontents{toc}{\string\tocdepth@munge}%
+ \print@toc{toc}%
+ \addtocontents{toc}{\string\tocdepth@restore}%
+}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\tocdepth@munge{%
+ \let\l@section@saved\l@section
+ \let\l@section\@gobble@tw@
+}%
+\def\@gobble@tw@#1#2{}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\tocdepth@restore{%
+ \let\l@section\l@section@saved
+}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\l@part#1#2{\addpenalty{\@secpenalty}%
+ \begingroup
+ \set@tocdim@pagenum{#2}%
+% \@tempdima 3em %
+ \parindent \z@
+ \rightskip\tocleft@pagenum plus 1fil\relax
+ \skip@\parfillskip\parfillskip\z@
+ \addvspace{2.25em plus\p@}%
+ \large \bf %
+ \leavevmode\ignorespaces#1\unskip\nobreak\hskip\skip@
+ \hb@xt@\rightskip{\hfil\unhbox\z@}\hskip-\rightskip\hskip\z@skip
+ \par
+ \nobreak %
+ \endgroup
+}%
+% \end{macrocode}
+%
+% \begin{macro}{\l@section}
+% Determine which TOC elements are automatically indented.
+% \begin{macrocode}
+\def\tocleft@{\z@}%
+\def\tocdim@min{5\p@}%
+\def\l@section{%
+ \l@@sections{}{section}% Implicit #3#4
+}%
+\def\l@f@section{%
+ \addpenalty{\@secpenalty}%
+ \addvspace{1.0em plus\p@}%
+ \bf
+}%
+\def\l@subsection{%
+ \l@@sections{section}{subsection}% Implicit #3#4
+}%
+\def\l@subsubsection{%
+ \l@@sections{subsection}{subsubsection}% Implicit #3#4
+}%
+\def\l@paragraph#1#2{}%
+\def\l@subparagraph#1#2{}%
+% \end{macrocode}
+% \end{macro}
+%
+% Activate the auto TOC processing.
+% \begin{macrocode}
+\let\toc@pre\toc@pre@auto
+\let\toc@post\toc@post@auto
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\listoffigures{\print@toc{lof}}%
+\def\l@figure{\@dottedtocline{1}{1.5em}{2.3em}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\listoftables{\print@toc{lot}}%
+\let\l@table\l@figure
+% \end{macrocode}
+%
+% \subsubsection{Default column bottom}%
+% All AIP journal styles have flush bottoms.
+%
+% \begin{macrocode}
+\@booleanfalse\raggedcolumn@sw
+% \end{macrocode}
+%
+%
+% \subsubsection{Table alignment style}%
+%
+% \begin{macro}{\tableft@skip@float}
+% \begin{macro}{\tabmid@skip@float}
+% \begin{macro}{\tabright@skip@float}
+% \begin{macro}{\array@row@pre@float}
+% \begin{macro}{\array@row@pst@float}
+% All AIP publications have the same table specification:
+% Scotch rules above and below, centered in column.
+% \begin{macrocode}
+\def\tableft@skip@float{\z@ plus\hsize}%
+\def\tabmid@skip@float{\@flushglue}%
+\def\tabright@skip@float{\z@ plus\hsize}%
+\def\array@row@pre@float{\hline\hline\noalign{\vskip\doublerulesep}}%
+\def\array@row@pst@float{\noalign{\vskip\doublerulesep}\hline\hline}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{Footnote formatting}%
+% We customize the formatting of footnotes for all AIP journals.
+% \begin{macro}{\@makefntext}
+% \begin{macrocode}
+\def\@makefntext#1{%
+ \def\baselinestretch{1}%
+ \leftskip1em%
+ \parindent1em%
+ \noindent
+ \nobreak\hskip-\leftskip
+ \hb@xt@\leftskip{%
+ \hss\@makefnmark\ %
+ }%
+ #1%
+ \par
+}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Appendix}%
+% \begin{macro}{\appendix}
+% \begin{macro}{\@hangfrom@appendix}
+% \begin{macro}{\@hangfroms@appendix}
+% \begin{macro}{\@appendixcntformat}
+% \begin{macrocode}
+\prepdef\appendix{%
+ \par
+ \let\@hangfrom@section\@hangfrom@appendix
+%\let\@hangfroms@section\@hangfroms@appendix
+ \let\@sectioncntformat\@appendixcntformat
+}%
+\def\@hangfrom@appendix#1#2#3{%
+ #1%
+ \@if@empty{#2}{%
+ #3%
+ }{%
+ #2\@if@empty{#3}{}{:\ #3}%
+ }%
+}%
+\def\@hangfroms@appendix#1#2{%
+ #1#2%
+}%
+\def\@appendixcntformat#1{\appendixname\ \csname the#1\endcsname}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Bibliography}%
+%
+% Customize the \revtex\ for the AIP society.
+% this task requires three components:
+% the \BibTeX\ \file{aipnum.bst} and \file{aipauth.bst} style files,
+% customizing code for \file{natbib}, and
+% customizations of the \env{thebibliography} environment.
+%
+% \begin{macro}{\@bibstyle}
+% Define the argument of the \cmd\bibliographystyle\ command.
+% The user must have installed a \file{.bst} file of the corresponding name.
+% This file will then be used by \BibTeX\ when compiling the document's \file{.bbl} file.
+%
+% The default bibliography style for the AIP journal substyles are \file{aipnum.bst} and \file{aipauth.bst}.
+% To generate them, use \classname{custom-bib} version 4.21 or later.
+% Run the \file{.bst} generator, \file{makebst.tex}, and
+% accept all defaults, with the following exceptions:
+%
+% \begin{enumerate}
+% \item
+% ORDERING OF REFERENCES: c: seq-no (references in order of Citation);
+% \item
+% AUTHOR NAMES: i: nm-init,ed-au (Initials + surname);
+% \item
+% NUMBER OF AUTHORS: l: max 12, min 12 (there will be three prompts total);
+% \item
+% TYPEFACE FOR AUTHORS IN LIST OF REFERENCES: u: nmft,nmft-def (User defined author font);
+% \item
+% FONT FOR FIRST NAMES: u: fnm-def (First names in user defined font);
+% \item
+% EDITOR NAMES IN INCOLLECTION ETC: a: nmfted (Editors incollection like authors);
+% \item
+% DATE FORMAT: p: yr-par (Date in parentheses);
+% \item
+% SUPPRESS MONTH: x: xmth (Date is year only);
+% \item
+% TITLE OF ARTICLE: i: tit-it (Title italic)
+% \item
+% ARTICLE TITLE PRESENT: x: jtit-x (No article title);
+% \item
+% JOURNAL NAME FONT: r: jttl-rm (Journal title normal);
+% \item
+% TECHNICAL REPORT TITLE: b: trtit-b (Tech. report title like books);
+% \item
+% JOURNAL VOLUME: b: vol-bf (Volume bold);
+% \item
+% VOLUME PUNCTUATION: c: volp-com (Volume with comma);
+% \item
+% PAGE NUMBERS: f: jpg-1 (Only start page number);
+% \item
+% JOURNAL NAME PUNCTUATION: x: jnm-x (Space after journal);
+% \item
+% PUBLISHER IN PARENTHESES: d: pub-date (Publisher and date in parentheses);
+% \item
+% PUBLISHER POSITION: p: pre-pub (Publisher before chapter, pages);
+% \item
+% ISBN NUMBER: isbn: (Include ISBN for books, booklets)
+% \item
+% ISSN NUMBER: issn: (Include ISSN for periodicals)
+% \item
+% EDITOR IN COLLECTIONS: b: edby (Booktitle, edited by \dots);
+% \item
+% PUNCTUATION BETWEEN SECTIONS (BLOCKS): c: blk-com (Comma between blocks);
+% \item
+% ABBREVIATE WORD `PAGES': a: pp (`Page' abbreviated);
+% \item
+% ABBREVIATE WORD `EDITORS': a: ed (`Editor' abbreviated);
+% \item
+% OTHER ABBREVIATIONS: a: abr (Abbreviations);
+% \item
+% ABBREVIATION FOR `EDITION': a: ednx (`Edition' abbreviated as `ed');
+% \item
+% EDITION NUMBERS: n: ord (Numerical editions);
+% \item
+% STORED JOURNAL NAMES: a: jabr (Abbreviated journal names);
+% \item
+% FONT OF `ET AL': i: etal-it (Italic et al);
+% \item
+% ADDITIONAL REVTeX DATA FIELDS: r: revdata, eprint, url, url-blk (Include REVTeX data fields collaboration, eid, eprint, numpages, url)
+% \item
+% NEW FONT SELECTION SCHEME: n: nfss (NFSS);
+% \item
+% ADDITIONAL REVTeX DATA FIELDS: y: revdata (additional data fields);
+% \item
+% REFERENCE COMPONENT TAGS: y: reference component tags;
+% \item
+% URL ADDRESS: n: URL as note;
+% \end{enumerate}
+%
+% A file \file{aipnum.dbj} file equivalent to the following should result:
+% \begin{verbatim}
+%\input docstrip
+%\preamble
+%----------------------------------------
+%*** REVTeX-compatible aipnum4-1.bst 2009-10-08 ***
+%\endpreamble
+%\postamble
+%End of customized bst file
+%\endpostamble
+%\keepsilent
+%\askforoverwritefalse
+%\def\MBopts{\from{merlin.mbs}{%
+% head,\MBopta}
+%\from{physjour.mbs}{\MBopta}
+%\from{geojour.mbs}{\MBopta}
+%\from{photjour.mbs}{\MBopta}
+%\from{merlin.mbs}{tail,\MBopta}}
+%\def\MBopta{%
+% lang,%: Use language field to switch hyphenation patterns for title
+% pres,pres-bf,%: Presentation, speaker bold face
+% seq-no,%: Citation order (unsorted, like unsrt.bst)
+% vonx,%: Sort without von part (de la Maire after Mahone)
+% nm-init,ed-au,%: Initials + surname (J. F. Smith)
+% nmft,nmft-def,%: User defined author font (\bibnamefont)
+% fnm-def,%: First names in user defined font (\bibfnamefont)
+% nmfted,%: Editors incollection like authors font
+% nmand-rm,%: `And' in normal font (JONES and JAMES)
+% lab,lab-def,%: User defined citation font (\citenamefont)
+% and-rm,%: Cited `and' in normal font
+% yr-par,%: Date in parentheses as (May 1993)
+% date-nil-x,%: If date is empty, then do not produce the surrounding punctuation (parens, brackets, colon, comma)
+% tit-qq,%: Title and punctuation in double quotes (``Title,'' ..)
+% inproceedings-chapter,%: produce pages after chapter, just as in InBook
+% jtit-x,%: Title is ignored
+% inproceedings-chapter,%: produce pages after chapter just as in InBook
+% article-booktitle,%: format booktitle
+% article-series,%: article can has series
+% jttl-rm,%: Journal name normal font
+% journal-address,%: Include address field (in parentheses) along with journal name
+% book-bt,%: Field `booktitle', or if absent field `title', is book title
+% thesis-title-o,%: Title is optional: no warning issued if empty
+% techreport-institution-par,%: format tech report institution like book publisher
+% vol-bf,%: Volume bold as {\bf vol}(num)
+% vnum-x,%: Journal vol, without number as 34
+% volp-com,%: Volume with comma as vol(num), ppp
+% jpg-1,%: Only start page number
+% book-editor-booktitle,%: Book permits empty author, produces title before editor in this case
+% inbook-editor-booktitle,%: Allow using both title/booktitle, both author/editor
+% bookaddress,%: Italic booktitle followed by bookaddress in roman
+% num-xser,%: Allows number without series and suppresses word "number"
+% number-cap,%: Capitalize word `number' as: "Number 123"
+% chapter-cap,%: Capitalize word `chapter' as: `Chapter 42'
+% series-number,%: Series number as: `Springer Lecture Notes No. 125'
+% numser-booktitle,%: After book title and conference address, and before editors
+% ser-vol,%: Series, vol. 23
+% ser-rm,%: format series roman , even when used with volume
+% volume-cap,%: Capitalize word `volume', as: `Volume 7 in Lecture Series'
+% ser-ed,%: Series and volume after booktitle and before editors
+% jnm-x,%: Space after journal name
+% pg-bk,book-chapter-pages,%: As chapter and page: chapter 42, page 345
+% pub-date,%: Publisher with address and date in parentheses (Oxford, 1994)
+% ay-empty-pub-parens-x,%: eliminate parentheses altogether if nothing inside
+% pre-pub,%: Publisher before volume, chapter, pages
+% pre-edn,%: Edition before publisher
+% pre-pub,pre-edn,%: Edition, publisher, volume, chapter, pages
+% isbn,%: Include ISBN for books, booklets, etc.
+% issn,%: Include ISSN for periodicals
+% doi-link,doi,%: Doi forms a link to the publication, anchored to the volume or title
+% edby,%: In booktitle, edited by .. (where .. is names)
+% blk-com,%: Comma between blocks
+% fin-endbibitem,%: Command at end instead of period
+% pp,%: `Page' abbreviated as p. or pp.
+% ed,%: `Editor' abbreviated as ed. or eds.
+% abr,%: Abbreviations of such words
+% ednx,%: `Edition' abbreviated as `ed'
+% ord,%: Numerical editions as 1st, 2nd, 3rd, etc
+% jabr,%: Abbreviated journal names
+% etal-it,%: Italic et al
+% revdata,eprint,url,url-blk,translation,%: Include REVTeX data fields collaboration, eid, eprint, archive, url, translation
+% SLACcitation,%: Produce SLACcitation field
+% numpages-x,%: Do not include numpages field
+% url,url-prefix-x,%: URL without prefix (default: `URL ')
+% bibinfo,%: Reference component tags like \bibinfo in the content of \bibitem
+% bibfield,%: Element tags like \bibfield in the content of \bibitem
+% nfss,%: Use LaTeX commands which may not work with Plain TeX
+%,{%
+% }}
+%\generate{\file{aipnum4-1.bst}{\MBopts}}
+%\endbatchfile
+% \end{verbatim}
+%
+% Between the two files \file{aipnum.dbj} and \file{aipauth.dbj},
+% the differences are limited:
+% \file{aipnum.dbj} has two lines lacking in \file{aipauth.dbj}:
+% \begin{verbatim}
+% seq-no,%: Citation order (unsorted, like unsrt.bst)
+% nm-init,ed-au,%: Initials + surname (J. F. Smith)
+% \end{verbatim}
+% thus, the ``numbered citation'' bibliography is sorted by citation order, and
+% the names are give first inital, then last name.
+%
+% Likewise, \file{aipauth.dbj} has one line lacking in \file{aipnum.dbj}:
+% \begin{verbatim}
+% nm-rev,%: Surname + comma + initials (Smith, J. F.)
+% \end{verbatim}
+% Thus, the ``author-year'' bibliography is sorted by author name, and
+% names are given last name first, followed by initials.
+%
+% We ensure that the journal substyle has the first word
+% in the matter by installing the (default) AIP code
+% later on (see Section~\ref{sec:aip-defaults}).
+% \end{macro}
+%
+% \begin{macro}{\pre@bibdata}
+%
+% Set up to write endnotes to a .bib file; its data will be incorporated into the bibliography.
+% \begin{macrocode}
+ \def\pre@bibdata{\jobname\bibdata@app}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bibsection}
+% We define the sectioning command to use when starting the bibliography
+% (we use \cmd\refname).
+% \begin{macrocode}
+\def\refname{References}%
+\def\rtx@bibsection{%
+ \@ifx@empty\refname{%
+ \par\vspace{6\p@ plus 6\p@}%
+ }{%
+% \end{macrocode}
+% The following line has been commented out:
+% \begin{verbatim}
+% \let\@hangfroms@section\@hang@froms
+% \end{verbatim}
+% \begin{macrocode}
+ \expandafter\section\expandafter*\expandafter{\refname}%
+ \@nobreaktrue
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bibpreamble}
+% \begin{macro}{\bibsep}
+% \begin{macro}{\newblock}
+% \begin{macrocode}
+\let\bibpreamble\@empty
+\appdef\setup@hook{%
+ \bibsep\z@\relax
+}%
+\def\newblock{\ }%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bibfont}
+% We define the font switch that applies to the body of the bibliography.
+%
+% \begin{macrocode}
+\appdef\setup@hook{%
+ \def\bibfont{%
+ \preprintsty@sw{}{\footnotesize}%
+ \@clubpenalty\clubpenalty
+ \labelsep\z@
+ }%
+}%
+\let\place@bibnumber\place@bibnumber@sup
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Index}%
+% \begin{macrocode}
+\newenvironment{theindex}{%
+ \columnseprule \z@
+ \columnsep 35\p@
+ \c@secnumdepth-\maxdimen
+ \onecolumngrid@push
+ \section{\indexname}%
+ \thispagestyle{plain}%
+ \parindent\z@
+ \parskip\z@ plus.3\p@\relax
+ \let\item\@idxitem
+ \onecolumngrid@pop
+}{%
+}%
+%
+\def\@idxitem{\par\hangindent 40\p@}
+%
+\def\subitem{\par\hangindent 40\p@ \hspace*{20\p@}}
+%
+\def\subsubitem{\par\hangindent 40\p@ \hspace*{30\p@}}
+%
+\def\indexspace{\par \vskip 10\p@ plus5\p@ minus3\p@\relax}
+% \end{macrocode}
+%
+%
+% \subsubsection{Typesize Processing}%
+% The formatting specification for the preprint option is:
+% Times Roman 12 pt, double spacing, with 1-inch margins on letter paper.
+% Paragraphs indented ``five spaces''.
+% Display math on standard indent, with equation number flush right in parenthesis, with subequations roman.
+%
+% That for reprint option is to format similar to the printed journal; with most journals
+% set (approximately analyzed) 10-point, 2-column grid, letter paper.
+% \begin{macrocode}
+\expandafter\def\csname rtx@aip10pt\endcsname{%
+ \let\@currname@class\@currname
+ \def\@currname{aps10pt\substyle@post}%
+ \class@info{Reading file \@currname.\substyle@ext}%
+ \input{\@currname.\substyle@ext}%
+ \let\@currname\@currname@class
+ \class@info{Overriding 10pt}%
+ \aipreprint
+}%
+\expandafter\def\csname rtx@aip11pt\endcsname{\csname rtx@aip12pt\endcsname}%
+\expandafter\def\csname rtx@aip12pt\endcsname{%
+ \let\@currname@class\@currname
+ \def\@currname{aps12pt\substyle@post}%
+ \class@info{Reading file \@currname.\substyle@ext}%
+ \input{\@currname.\substyle@ext}%
+ \let\@currname\@currname@class
+ \class@info{Overriding 12pt}%
+ \aippreprint
+}%
+% \end{macrocode}
+%
+% \begin{macro}{\today}
+% Procedure \cmd\today\ is used in the article class, but not in
+% this document class.
+% \begin{macrocode}
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or January\or February\or March\or April\or May\or June%
+ \or July\or August\or September\or October\or November\or December%
+ \fi\space
+ \number\year
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{A. Running Title}
+% User-provided running title \cmd\@shorttitle\ to be set.
+%
+% \subsection{B. Equation numbering, figure and table numbering}
+% Equations can be numbered throughout, or by section, with appendix equations prepended by the appendix label.
+% Figures and tables are numbered throughout.
+%
+%
+% \subsection{C. Title}
+% Title page may break above abstract, within author list.
+% Title notes are signified by superior letter followed by right parenthesis.
+%
+% \subsection{D. Author footnote}
+% Set short line above these footnotes.
+%
+% \subsection{E. Author}
+% Class option \classoption{superscriptaddress} is standard.
+% \begin{macrocode}
+ \clo@superscriptaddress
+% \end{macrocode}
+%
+% \subsection{F. Affiliations}
+% Set italic.
+%
+% \subsection{G. Received date}
+%
+%
+% \subsection{H. Abstract}
+% Single paragraph, no indent.
+%
+% \subsection{J. Lead Paragraph}
+% Set boldface, flush left before main text, single paragraph.
+% Separated from text by a short centered rule.
+%
+% \subsection{K. Headings}
+% Use labels: ROMAN, LETTER, arabic, letter.
+% Set ALLCAPS, boldface; Initial cap, boldface; Initial cap, bold-italic; Initial cap, italic.
+%
+% Theorem, proof title followed by colon. Follow author.
+%
+% \subsection{L. Text Footnotes}
+% Not permitted; use endnotes.
+%
+% \subsection{M. Citations and Bibliography}
+% Numerical \filename{aipnum.bst}, author-year \filename{aipauth.bst}, and numbered author-year \filename{aipnumauth.bst} are the available choices.
+% Numerical is standard, with all styles permitted in journal classes 3a and 4b.
+%
+%
+% \subsection{N. References}
+%
+% Article Title usage:
+%
+% Article title required in all journals with "unpublished", "to be published", "in press" and "submitted" refs.
+%
+% Exceptions:
+%
+% Journal classes 1a,1b,2,4a:
+%
+% Article title not allowed in published references, except in the case of "in press" or submitted" (see sample references below).
+%
+% Journal class 3a:
+%
+% Article title allowed but not required in author-year references (use must be consistent within a single manuscript).
+%
+% Journal class 3b:
+%
+% Article title required in all journal references and report references.
+%
+% Journal class 4b:
+%
+% Article title allowed in journal references in author-year mode.
+%
+% \subsection{O. Examples of Numerical References}
+%
+%
+% \subsection{P. References in Author-year mode}
+%
+%
+% \subsection{Q. Numbered Author-year References}
+%
+%
+% \subsection{R. Tables}
+% Placed within text (floated), labeled with Roman numeral.
+%
+% Table caption placed above table, followed by space,
+% two double lines, space, table column headings, space,
+% single line, table contents, two double lines.
+%
+% Footnotes labeled with superior lower-case letter, set below table contents.
+%
+% \subsection{S. Figures}
+% Placed within text (floated), labeled with arabic numbers.
+%
+% Caption set below figure. A citation to be set inline, not superscripted.
+%
+% \subsection{Society defaults}%
+%
+% After this society file is read in, we will process the
+% \cmd\@journal- and \cmd\@pointsize-specific code.
+% Here we define the defaults.
+%
+% We select \textbf{Chaos} as the default journal substyle, because it is
+% the most permissive in terms of bibliography and citation style,
+% and it is formatted in two column in the reprint style.
+%
+% \begin{macrocode}
+\def\@journal@default{cha}%
+\def\@pointsize@default{12}%
+% \end{macrocode}
+%
+% \subsection{Journal-Specific Code}%
+%
+% For AIP journals, we supply code specific to JCP, POP, RSI, JAP, APL, CHA, POF, BMF, RSE, JMP.
+%
+% \subsubsection{\classoption{jcp}}%
+%A member of the journal class 1a.
+% \begin{macrocode}
+\def\rtx@aipjcp{%
+ \typeout{Using journal substyle \@journal.}%
+% \end{macrocode}
+% Journal class 1a uses the (superscript) numerical citation style by default.
+% \begin{macrocode}
+ \@booleanfalse\authoryear@sw
+% \end{macrocode}
+%
+% End of \classoption{jcp} code.
+% \begin{macrocode}
+}%
+% \end{macrocode}
+%
+% \subsubsection{\classoption{pop}}%
+%A member of the journal class 1a.
+% \begin{macrocode}
+\def\rtx@aippop{%
+ \typeout{Using journal substyle \@journal.}%
+% \end{macrocode}
+% Journal class 1a uses the (superscript) numerical citation style by default.
+% \begin{macrocode}
+ \@booleanfalse\authoryear@sw
+% \end{macrocode}
+%
+% End of \classoption{pop} code.
+% \begin{macrocode}
+}%
+% \end{macrocode}
+%
+% \subsubsection{\classoption{rsi}}%
+%A member of the journal class 1a.
+% \begin{macrocode}
+\def\rtx@aiprsi{%
+ \typeout{Using journal substyle \@journal.}%
+% \end{macrocode}
+% Journal class 1a uses the (superscript) numerical citation style by default.
+% \begin{macrocode}
+ \@booleanfalse\authoryear@sw
+% \end{macrocode}
+%
+% End of \classoption{rsi} code.
+% \begin{macrocode}
+}%
+% \end{macrocode}
+%
+% \subsubsection{\classoption{jap}}%
+%Sole member of the journal class 1b.
+%
+% No running title.
+% \begin{macrocode}
+\def\rtx@aipjap{%
+ \typeout{Using journal substyle \@journal.}%
+% \end{macrocode}
+% Journal class 1b uses the (superscript) numerical citation style by default.
+% \begin{macrocode}
+ \@booleanfalse\authoryear@sw
+ \let\@runningtitle\@empty
+% \end{macrocode}
+%
+% End of \classoption{jap} code.
+% \begin{macrocode}
+}%
+% \end{macrocode}
+%
+% \subsubsection{\classoption{apl}}%
+%Sole member of the journal class 2.
+%
+% No running title.
+% \begin{macrocode}
+\def\rtx@aipapl{%
+ \typeout{Using journal substyle \@journal.}%
+% \end{macrocode}
+% Journal class 2 uses the (superscript) numerical citation style by default.
+% \begin{macrocode}
+ \@booleanfalse\authoryear@sw
+ \let\@runningtitle\@empty
+% \end{macrocode}
+%
+% End of \classoption{apl} code.
+% \begin{macrocode}
+}%
+% \end{macrocode}
+%
+% \subsubsection{\classoption{cha}}%
+%Sole member of the journal class 3a.
+% \begin{macrocode}
+\def\rtx@aipcha{%
+ \typeout{Using journal substyle \@journal.}%
+% \end{macrocode}
+% Article titles are allowed.
+% \begin{macrocode}
+ \@booleanfalse\aip@jtitx@sw
+% \end{macrocode}
+%
+% End of \classoption{cha} code.
+% \begin{macrocode}
+}%
+% \end{macrocode}
+%
+% \subsubsection{\classoption{pof}}%
+%Sole member of the journal class 3b.
+% \begin{macrocode}
+\def\rtx@aippof{%
+ \typeout{Using journal substyle \@journal.}%
+% \end{macrocode}
+% Journal class 3b uses the (superscript) numerical citation style by default.
+% Article titles are required, so we include them if available,
+% but if absent, we can do no more than make a warning in the \file{.blg}.
+% \begin{macrocode}
+ \@booleanfalse\authoryear@sw
+ \@booleanfalse\aip@jtitx@sw
+% \end{macrocode}
+%
+% End of \classoption{pof} code.
+% \begin{macrocode}
+}%
+% \end{macrocode}
+%
+% \subsubsection{\classoption{bmf}}%
+% A member of the journal class 4a,
+% the Biomicrofluidics journal is single column.
+% \begin{macrocode}
+\def\rtx@aipbmf{%
+ \typeout{Using journal substyle \@journal.}%
+% \end{macrocode}
+% Journal class 4a uses the (superscript) numerical citation style by default.
+% Journal is formatted in a single column.
+% \begin{macrocode}
+ \@booleanfalse\authoryear@sw
+ \@booleanfalse\twocolumn@sw
+% \end{macrocode}
+%
+% End of \classoption{bmf} code.
+% \begin{macrocode}
+}%
+% \end{macrocode}
+%
+% \subsubsection{\classoption{rse}}%
+%A member of the journal class 4a.
+% \begin{macrocode}
+\def\rtx@aiprse{%
+ \typeout{Using journal substyle \@journal.}%
+% \end{macrocode}
+% Journal class 4a uses the (superscript) numerical citation style by default.
+% \begin{macrocode}
+ \@booleanfalse\authoryear@sw
+% \end{macrocode}
+%
+% End of \classoption{rse} code.
+% \begin{macrocode}
+}%
+% \end{macrocode}
+%
+% \subsubsection{\classoption{jmp}}%
+% Sole member of the journal class 4b, Journal of Mathematical Physics is single column.
+% For an example of \env{itemize}, see JMP\_122901\_1 (48).
+% \begin{macrocode}
+\def\rtx@aipjmp{%
+ \typeout{Using journal substyle \@journal.}%
+% \end{macrocode}
+% Article titles are allowed.
+% Journal is formatted in a single column.
+% \begin{macrocode}
+ \@booleanfalse\aip@jtitx@sw
+ \@booleanfalse\twocolumn@sw
+% \end{macrocode}
+%
+% End of \classoption{jmp} code.
+% \begin{macrocode}
+}%
+% \end{macrocode}
+%
+% \subsection{Establish AIP Defaults\label{sec:aip-defaults}}
+%
+% \begin{macro}{\footinbib@sw}
+% All AIP journals invoke the \classoption{footinbib} option.
+% \begin{macrocode}
+\@booleantrue\footinbib@sw
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\place@bibnumber}
+% \begin{macro}{\@bibstyle}
+% \begin{macro}{\bibpunct}
+% We install code that will
+% govern the style in which \cmd\cite\ commands are
+% formatted,
+% select the presentation for \cmd\bibitem s
+% and control the \BibTeX\ processing.
+%
+% Note that a journal substyle may override these settings.
+% Likewise, document preamble may itself invoke \cmd\bibpunct\ or \cmd\bibliographystyle,
+% thereby overriding these settings and those of the journal substyle.
+%
+% The numbered citations of \file{aipnum} and \file{aipauthnum}
+% are compatible with \classoption{footinbib} and
+% the compression and coalescing features of \classname{natbib},
+% while \file{aipauth}'s author-year citations are not.
+% Therefore, we de-select such options if we are selecting author-year citations.
+%
+% Note on \classname{natbib} presets:
+% \file{aipnum} and \file{aipauthnum} uses the Chicago \cmd\bibpunct\ style;
+% while \file{aipauth} uses that of Nature.
+%
+% Note on \cmd\NAT@mcite: if not using numerical citations, we set \cmd\NAT@mcite\
+% to a lower value, to turn off the mcite semantics of \classname{natbib}.
+% \begin{macrocode}
+\let\place@bibnumber\place@bibnumber@sup
+\appdef\setup@hook{%
+ \authoryear@sw{%
+ \aip@jtitx@sw{%
+ \def\@bibstyle{aipauth\substyle@post}%
+ }{%
+ \def\@bibstyle{aipauth\substyle@post}%
+ }%
+ \authornum@sw{%
+ \bibpunct{}{}{,}{s}{}{\textsuperscript{,}}%
+ \let\onlinecite\rev@citealpnum
+ }{%
+ \bibhang10\p@
+ \bibpunct{(%)
+ }{%(
+ )}{; }{a}{,}{,}%
+ \@booleanfalse\footinbib@sw
+ \let\NAT@mcite\@ne
+ \let\NAT@sort\z@
+ \def\NAT@cmprs{\z@}%
+ \let\NAT@def@citea\rtx@def@citea
+ \let\NAT@def@citea@close\rtx@def@citea@close
+ }%
+ }{%
+ \aip@jtitx@sw{%
+ \def\@bibstyle{aipnum\substyle@post}%
+ }{%
+ \def\@bibstyle{aipnum\substyle@post}%
+ }%
+ \bibpunct{}{}{,}{s}{}{\textsuperscript{,}}%
+ \let\onlinecite\rev@citealpnum
+ }%
+}%
+\def\make@footnote@endnote{%
+ \footinbib@sw{%
+ \authoryear@sw{\authornum@sw{\false@sw}{\true@sw}}{\false@sw}%
+ {}{%
+ \ltx@footnote@push
+ \def\thempfn{Note\thefootnote}%
+ \let\ltx@footmark\rev@citemark
+ \let\ltx@foottext\rev@endtext
+ \appdef\class@enddocumenthook{\auto@bib}%
+ \let\printendnotes\relax
+ }%
+ }{}%
+}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\aipreprint}%
+% We want to override \filename{aps10pt.rtx}.
+% \begin{macrocode}
+\def\aipreprint{%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\aippreprint}%
+% We want to override \filename{aps12pt.rtx}.
+% \begin{macrocode}
+\def\aippreprint{%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+% %Here ends the programmer's documentation.
+% \endinput
+%
+\endinput
diff --git a/Master/texmf-dist/source/latex/revtex4-1/revtex4-1-bst.dtx b/Master/texmf-dist/source/latex/revtex4-1/revtex4-1-bst.dtx
new file mode 100644
index 00000000000..c0fd3c6da84
--- /dev/null
+++ b/Master/texmf-dist/source/latex/revtex4-1/revtex4-1-bst.dtx
@@ -0,0 +1,3783 @@
+% \iffalse meta-comment balanced on line 122
+% revtex4-1-bst.dtx: Package to extract .bst files for RevTeX
+% Copyright (c) 2020 American Physical Society.
+% https://journals.aps.org/revtex/
+% mailto:revtex@aps.org
+%
+% Disclaimer
+% This file is distributed WITHOUT ANY WARRANTY;
+% without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+% License
+% You may distribute this file under the conditions of the
+% LaTeX Project Public License 1.3c or later
+% (http://www.latex-project.org/lppl.txt).
+% ReadMe
+% For the documentation and more detailed instructions for
+% installation, typeset this document with \LaTeX.
+% Maintenance Status
+% This work has the LPPL maintenance status "maintained";
+% Current Maintainer of this work is Phelype Oleinik.
+%
+% This work consists of the main source file revtex4-1-bst.dtx
+% and the derived files
+% aipauth4-1.bst, aipnum4-1.bst, apsrev4-1.bst, apsrmp4-1.bst
+% Distribution:
+% CTAN:macros/latex/contrib/revtex/
+%
+% Unpacking:
+% tex revtex4-1-bst.dtx
+%
+% Installation:
+% TDS:bibtex/bst/revtex/
+%
+%<*ignore>
+\begingroup
+ \def\x{LaTeX2e}%
+\expandafter\endgroup
+\ifcase
+ 0\expandafter\ifx\csname processbatchFile\endcsname\relax\else1\fi\ifx\fmtname\x\else 1\fi
+ \relax
+\else
+ \csname fi\endcsname
+%</ignore>
+%<*install>
+%% This file will generate documentation and runtime files
+%% from revtex4-1-bst.dtx when run through TeX.
+\input docstrip
+\nopreamble
+\edef\defaultpostamble{%
+ \MetaPrefix\space End of customized bst file^^J%
+ \MetaPrefix ^^J%
+ \MetaPrefix\space End of file `\outFileName'.%
+}
+\askforoverwritefalse
+\keepsilent
+\generate{%
+ \file{aipauth4-1.bst}{\from{revtex4-1-bst.dtx}{aipauth}}%
+ \file{aipnum4-1.bst}{\from{revtex4-1-bst.dtx}{aipnum}}%
+ \file{apsrev4-1.bst}{\from{revtex4-1-bst.dtx}{apsrev}}%
+ \file{apsrmp4-1.bst}{\from{revtex4-1-bst.dtx}{apsrmp}}%
+}%
+\ifToplevel{
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation, please move}
+\Msg{* *.bst }
+\Msg{* into a directory searched by TeX;}
+\Msg{* in a TDS-compliant installation:}
+\Msg{* texmf/bibtex/bst/revtex/.}
+\Msg{*}
+\Msg{* Happy BibTeXing}
+\Msg{***********************************************************}
+}
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+% \fi
+%
+% \GetFileInfo{revtex4-1-bst.dtx}
+%
+% \StopEventually{}
+% \iffalse ltxdoc klootch
+%<*package>
+%%% @LaTeX-file{
+%%% filename = "revtex4-1-bst.dtx",
+%%% version = "4.1s",
+%%% date = "2020/10/06",
+%%% author = "Phelype Oleinik (mailto: phelype.oleinik at latex-project.org),
+%%% commissioned by the American Physical Society.
+%%% ",
+%%% copyright = "Copyright (C) 2020 American Physical Society
+%%% distributed under the terms of the
+%%% LaTeX Project Public License 1.3c, see
+%%% ftp://ctan.tug.org/macros/latex/base/lppl.txt
+%%% ",
+%%% email = "mailto colon revtex at aps.org",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "",
+%%% supported = "yes",
+%%% abstract = "",
+%%% }
+%</package>
+% \fi
+%
+% \subsection{Bill of Materials}
+%
+% Following is a list of the files in this distribution arranged
+% according to provenance.
+%
+% \subsubsection{Primary Source}%
+% One single file generates all.
+%\begin{verbatim}
+%revtex4-1-bst.dtx
+%\end{verbatim}
+%
+% \subsubsection{Generated by \texttt{tex revtex4-1-bst.dtx}}%
+% Typesetting ths file under \TeX\ itself runs the installer,
+% which generates the bibliography style files.
+%\begin{verbatim}
+%aipauth4-1.bst, aipnum4-1.bst,
+%apsrev4-1.bst, apsrmp4-1.bst
+%\end{verbatim}
+%
+% \section{Code common to all modules}%
+%
+% \begin{macrocode}
+%<*aipauth|aipnum|apsrev|apsrmp>
+%%
+%<aipauth>%% This is file `aipauth4-1.bst',
+%<aipnum>%% This is file `aipnum4-1.bst',
+%<apsrev>%% This is file `apsrev4-1.bst',
+%<apsrmp>%% This is file `apsrmp4-1.bst',
+%% generated with the docstrip utility.
+%%
+% \end{macrocode}
+%
+% Well, this is now a lie, of course:
+% \begin{macrocode}
+%% The original source files were:
+%%
+%<*aipauth>
+%% merlin.mbs (with options: `head,ay,nat,lang,pres,pres-bf,vonx,nm-rev,mcite,mct-1,mct-x3,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,blkyear,yr-par,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% physjour.mbs (with options: `ay,nat,lang,pres,pres-bf,vonx,nm-rev,mcite,mct-1,mct-x3,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,blkyear,yr-par,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% geojour.mbs (with options: `ay,nat,lang,pres,pres-bf,vonx,nm-rev,mcite,mct-1,mct-x3,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,blkyear,yr-par,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% photjour.mbs (with options: `ay,nat,lang,pres,pres-bf,vonx,nm-rev,mcite,mct-1,mct-x3,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,blkyear,yr-par,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% merlin.mbs (with options: `tail,ay,nat,lang,pres,pres-bf,vonx,nm-rev,mcite,mct-1,mct-x3,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,blkyear,yr-par,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% ----------------------------------------
+%% *** REVTeX-compatible aipauth4-1.bst 2010-07-25 ***
+%</aipauth>
+%<*aipnum>
+%% merlin.mbs (with options: `head,ay,nat,lang,pres,pres-bf,seq-no,vonx,nm-init,ed-au,mcite,mct-1,mct-x3,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,blkyear,yr-par,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% physjour.mbs (with options: `ay,nat,lang,pres,pres-bf,seq-no,vonx,nm-init,ed-au,mcite,mct-1,mct-x3,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,blkyear,yr-par,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% geojour.mbs (with options: `ay,nat,lang,pres,pres-bf,seq-no,vonx,nm-init,ed-au,mcite,mct-1,mct-x3,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,blkyear,yr-par,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% photjour.mbs (with options: `ay,nat,lang,pres,pres-bf,seq-no,vonx,nm-init,ed-au,mcite,mct-1,mct-x3,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,blkyear,yr-par,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% merlin.mbs (with options: `tail,ay,nat,lang,pres,pres-bf,seq-no,vonx,nm-init,ed-au,mcite,mct-1,mct-x3,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,blkyear,yr-par,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% ----------------------------------------
+%% *** REVTeX-compatible aipnum4-1.bst 2010-07-25 ***
+%</aipnum>
+%<*apsrev>
+%% merlin.mbs (with options: `head,ay,nat,lang,pres,pres-bf,seq-no,vonx,nm-init,ed-au,jnrlst,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,keyxyr,blkyear,yr-par,dtrev,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,trtit-b,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% physjour.mbs (with options: `ay,nat,lang,pres,pres-bf,seq-no,vonx,nm-init,ed-au,jnrlst,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,keyxyr,blkyear,yr-par,dtrev,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,trtit-b,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% geojour.mbs (with options: `ay,nat,lang,pres,pres-bf,seq-no,vonx,nm-init,ed-au,jnrlst,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,keyxyr,blkyear,yr-par,dtrev,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,trtit-b,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% photjour.mbs (with options: `ay,nat,lang,pres,pres-bf,seq-no,vonx,nm-init,ed-au,jnrlst,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,keyxyr,blkyear,yr-par,dtrev,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,trtit-b,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% merlin.mbs (with options: `tail,ay,nat,lang,pres,pres-bf,seq-no,vonx,nm-init,ed-au,jnrlst,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,keyxyr,blkyear,yr-par,dtrev,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,trtit-b,techreport-institution-par,vol-bf,vnum-x,volp-com,jpg-1,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-date,ay-empty-pub-parens-x,pre-pub,pre-edn,doi-link,doi,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% ----------------------------------------
+%% *** REVTeX-compatible Phys Rev 2010-07-25 ***
+%</apsrev>
+%<*apsrmp>
+%% merlin.mbs (with options: `head,ay,nat,lang,pres,pres-bf,vonx,nm-rev1,jnrlst,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,keyxyr,dt-beg,yr-par,dtrev,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,trtit-b,techreport-institution-par,vol-bf,vnum-sp,volp-com,jpg-1,pp-last,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-par,ay-empty-pub-parens-x,pre-edn,school-par,doi-link,doi,bkedcap,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,and-com,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% physjour.mbs (with options: `ay,nat,lang,pres,pres-bf,vonx,nm-rev1,jnrlst,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,keyxyr,dt-beg,yr-par,dtrev,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,trtit-b,techreport-institution-par,vol-bf,vnum-sp,volp-com,jpg-1,pp-last,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-par,ay-empty-pub-parens-x,pre-edn,school-par,doi-link,doi,bkedcap,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,and-com,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% geojour.mbs (with options: `ay,nat,lang,pres,pres-bf,vonx,nm-rev1,jnrlst,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,keyxyr,dt-beg,yr-par,dtrev,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,trtit-b,techreport-institution-par,vol-bf,vnum-sp,volp-com,jpg-1,pp-last,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-par,ay-empty-pub-parens-x,pre-edn,school-par,doi-link,doi,bkedcap,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,and-com,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% photjour.mbs (with options: `ay,nat,lang,pres,pres-bf,vonx,nm-rev1,jnrlst,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,keyxyr,dt-beg,yr-par,dtrev,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,trtit-b,techreport-institution-par,vol-bf,vnum-sp,volp-com,jpg-1,pp-last,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-par,ay-empty-pub-parens-x,pre-edn,school-par,doi-link,doi,bkedcap,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,and-com,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% merlin.mbs (with options: `tail,ay,nat,lang,pres,pres-bf,vonx,nm-rev1,jnrlst,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,and-rm,keyxyr,dt-beg,yr-par,dtrev,date-nil-x,tit-qq,inproceedings-chapter,jtit-x,inproceedings-chapter,article-booktitle,article-series,jttl-rm,journal-address,book-bt,thesis-title-o,trtit-b,techreport-institution-par,vol-bf,vnum-sp,volp-com,jpg-1,pp-last,book-editor-booktitle,inbook-editor-booktitle,bookaddress,num-xser,number-cap,chapter-cap,series-number,numser-booktitle,ser-vol,ser-rm,volume-cap,ser-ed,jnm-x,pg-bk,book-chapter-pages,pub-par,ay-empty-pub-parens-x,pre-edn,school-par,doi-link,doi,bkedcap,edby,blk-com,fin-endbibitem,pp,ed,abr,ednx,ord,jabr,and-com,etal-it,revdata,eprint,url,url-blk,translation,SLACcitation,numpages-x,url,url-prefix-x,bibinfo,bibfield,nfss,,{}')
+%% ----------------------------------------
+%% *** REVTeX-compatible RMP 2010-07-25 ***
+%</apsrmp>
+%%
+%% Copyright 1994-2007 Patrick W Daly
+ % ===============================================================
+ % IMPORTANT NOTICE:
+ % This bibliographic style (bst) file has been generated from one or
+ % more master bibliographic style (mbs) files, listed above.
+ %
+ % This generated file can be redistributed and/or modified under the terms
+ % of the LaTeX Project Public License Distributed from CTAN
+ % archives in directory macros/latex/base/lppl.txt; either
+ % version 1 of the License, or any later version.
+ % ===============================================================
+ % Name and version information of the main mbs file:
+ % For use with BibTeX version 0.99a or later
+ %-------------------------------------------------------------------
+ % This bibliography style file is intended for texts in ENGLISH
+ % This is an author-year citation style bibliography. As such, it is
+ % non-standard LaTeX, and requires a special package file to function properly.
+ % Such a package is natbib.sty by Patrick W. Daly
+ % The form of the \bibitem entries is
+ % \bibitem[Jones et al.(1990)]{key}...
+ % \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}...
+ % The essential feature is that the label (the part in brackets) consists
+ % of the author names, as they should appear in the citation, with the year
+ % in parentheses following. There must be no space before the opening
+ % parenthesis!
+ % With natbib v5.3, a full list of authors may also follow the year.
+ % In natbib.sty, it is possible to define the type of enclosures that is
+ % really wanted (brackets or parentheses), but in either case, there must
+ % be parentheses in the label.
+ % The \cite command functions as follows:
+ % \citet{key} ==>> Jones et al. (1990)
+ % \citet*{key} ==>> Jones, Baker, and Smith (1990)
+ % \citep{key} ==>> (Jones et al., 1990)
+ % \citep*{key} ==>> (Jones, Baker, and Smith, 1990)
+ % \citep[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2)
+ % \citep[e.g.][]{key} ==>> (e.g. Jones et al., 1990)
+ % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32)
+ % \citeauthor{key} ==>> Jones et al.
+ % \citeauthor*{key} ==>> Jones, Baker, and Smith
+ % \citeyear{key} ==>> 1990
+ %---------------------------------------------------------------------
+%</aipauth|aipnum|apsrev|apsrmp>
+%
+% \subsection{The Frontmatter File}
+% As promised above, here is the contents of the frontmatter file.
+% This file doesn't have any documentation, so just stop early.
+% \begin{macrocode}
+%<*ignore>
+\stop
+\changes{4.2e}{2020/10/03}{(PHO) Initial version---Put all .bst files in a single .dtx}
+%</ignore>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*aipauth|aipnum|apsrev|apsrmp>
+% \end{macrocode}
+%
+% \begin{macrocode}
+
+%<aipauth>FUNCTION {id.bst} {"merlin.mbs aipauth4-1.bst 2010-07-25 4.21a (PWD, AO, DPC) hacked"}
+%<aipnum>FUNCTION {id.bst} {"merlin.mbs aipnum4-1.bst 2010-07-25 4.21a (PWD, AO, DPC) hacked"}
+%<apsrev>FUNCTION {id.bst} {"merlin.mbs apsrev4-1.bst 2010-07-25 4.21a (PWD, AO, DPC) hacked"}
+%<apsrmp>FUNCTION {id.bst} {"merlin.mbs apsrmp4-1.bst 2010-07-25 4.21a (PWD, AO, DPC) hacked"}
+ENTRY
+{
+ address
+ archive
+ archivePrefix
+ author
+ bookaddress
+ booktitle
+ chapter
+ collaboration
+ doi
+ edition
+ editor
+ eid
+ eprint
+ howpublished
+ institution
+ isbn
+ issn
+ journal
+ key
+ language
+ month
+ note
+ number
+ organization
+ pages
+ primaryClass
+ publisher
+ school
+ SLACcitation
+ series
+ title
+ translation
+ type
+ url
+ volume
+ year
+}{
+}{
+ label
+ extra.label sort.label
+ short.list
+}
+
+INTEGERS
+{
+ output.state before.all
+ after.word after.punctuation
+ after.sentence after.block
+}
+
+INTEGERS
+{
+ punctuation.state punctuation.no punctuation.space punctuation.yes
+}
+
+STRINGS { bibfield output.bibfield }
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+FUNCTION {non.stop}
+{ duplicate$
+ "}" * add.period$
+ #-1 #1 substring$ "." =
+}
+
+INTEGERS { arith.mulitplier arith.multiplicand }
+
+FUNCTION {multiply}
+{
+ 'arith.multiplicand :=
+ 'arith.mulitplier :=
+ #0
+ { arith.mulitplier #0 > }
+ { arith.multiplicand +
+ arith.mulitplier #1 - 'arith.mulitplier :=
+ }
+ while$
+}
+
+FUNCTION {chr.to.hex}
+{
+ chr.to.int$
+ duplicate$ "0" chr.to.int$ -
+ duplicate$ duplicate$ #0 < swap$ #9 > or not
+ { swap$ pop$ }
+ { pop$
+ duplicate$ "A" chr.to.int$ -
+ duplicate$ duplicate$ #0 < swap$ #5 > or not
+ { swap$ pop$ #10 + }
+ { pop$
+ duplicate$ "a" chr.to.int$ -
+ duplicate$ duplicate$ #0 < swap$ #5 > or not
+ { swap$ pop$ #10 + }
+ { pop$
+ pop$ #-1
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+INTEGERS { arith.accumulator }
+
+FUNCTION {str.to.hex}
+{ #0 'arith.accumulator :=
+ { duplicate$ empty$ not }
+ { duplicate$ #1 #1 substring$ chr.to.hex
+ duplicate$ #0 <
+ { pop$ pop$ ""
+ }
+ { arith.accumulator #16 multiply + 'arith.accumulator :=
+ #2 global.max$ substring$
+ }
+ if$
+ }
+ while$
+ pop$ arith.accumulator
+}
+
+FUNCTION {diagn.cmntlog}
+{
+ duplicate$ top$ "%" swap$ * write$ newline$
+}
+
+INTEGERS { control.key control.author control.editor control.title control.pages control.eprint control.year }
+
+INTEGERS { control.author.jnrlst control.author.dotless control.author.nospace control.author.initials control.author.nocomma control.author.first control.author.reversed }
+
+FUNCTION { control.init }
+{
+ #0
+ 'control.key :=
+ #0
+%<aipauth> #1 +
+%<apsrmp> #1 +
+%<apsrmp> #2 +
+ #8 +
+%<apsrev> #64 +
+%<apsrmp> #64 +
+ 'control.author :=
+%<aipauth> #0
+%<aipnum> #0
+%<apsrev> #1
+%<apsrmp> #1
+ 'control.author.jnrlst :=
+ #0
+ 'control.author.dotless :=
+ #0
+ 'control.author.nospace :=
+ #1
+ 'control.author.initials :=
+ #0
+ 'control.author.nocomma :=
+%<!apsrmp> #0
+%<apsrmp> #1
+ 'control.author.first :=
+%<aipauth> #1
+%<aipnum> #0
+%<apsrev> #0
+%<apsrmp> #1
+ 'control.author.reversed :=
+%<aipauth> #0
+%<aipnum> #1
+%<apsrev> #1
+%<apsrmp> #0
+ 'control.editor :=
+ #-1
+ 'control.title :=
+ #0
+ 'control.pages :=
+ #0
+ 'control.eprint :=
+ #1
+ 'control.year :=
+}
+
+FUNCTION {warning.dependency}
+{
+ " (dependency: " * swap$ * ") set " * swap$ int.to.str$ * warning$
+}
+
+FUNCTION {control.check}
+{
+ control.editor
+ {
+ "editor formatted same as author"
+ control.author.reversed {
+ duplicate$ #0 swap$ "reversed" warning.dependency
+ #0 'control.author.reversed :=
+ } 'skip$ if$
+ control.author.first {
+ duplicate$ #0 swap$ "first" warning.dependency
+ #0 'control.author.first :=
+ } 'skip$ if$
+ control.author.nocomma {
+ duplicate$ #0 swap$ "nocomma" warning.dependency
+ #0 'control.author.nocomma :=
+ } 'skip$ if$
+ pop$
+ } 'skip$ if$
+ control.author.reversed 'skip$
+ {
+ "not reversed"
+ control.author.nospace {
+ duplicate$ #0 swap$ "nospace" warning.dependency
+ #0 'control.author.nospace :=
+ } 'skip$ if$
+ control.author.jnrlst 'skip$ {
+ duplicate$ #1 swap$ "jnrlst" warning.dependency
+ #1 'control.author.jnrlst :=
+ } if$
+ control.author.initials {
+ duplicate$ ", initials" *
+ control.author.dotless {
+ duplicate$ #0 swap$ "dotless" warning.dependency
+ #0 'control.author.dotless :=
+ } 'skip$ if$
+ pop$
+ } 'skip$ if$
+ pop$
+ }
+ if$
+ control.author.initials 'skip$ {
+ "not initials"
+ control.author.nocomma {
+ duplicate$ #0 swap$ "nocomma" warning.dependency
+ #0 'control.author.nocomma :=
+ } 'skip$ if$
+ control.author.nospace {
+ duplicate$ #0 swap$ "nospace" warning.dependency
+ #0 'control.author.nospace :=
+ } 'skip$ if$
+ control.author.dotless 'skip$ {
+ duplicate$ #1 swap$ "dotless" warning.dependency
+ #1 'control.author.dotless :=
+ } if$
+ pop$
+ } if$
+}
+
+FUNCTION {control.parse}
+{
+ duplicate$ duplicate$ missing$
+ {
+ pop$ pop$ pop$
+ }
+ { empty$
+ {
+ pop$ #-1
+ }{
+ str.to.hex
+ }
+ if$
+ swap$ :=
+ }
+ if$
+}
+
+FUNCTION {control.dump}
+{
+ duplicate$ missing$ { pop$ "N/A" } 'skip$ if$
+ "{" swap$ * "}, " *
+ *
+}
+
+INTEGERS { decode.threshold }
+
+FUNCTION {control.decode}
+{
+ - duplicate$
+ #0 <
+ {
+ skip$ pop$ swap$ #0
+ }
+ {
+ swap$ pop$ swap$ #1
+ }
+ if$
+ swap$ :=
+}
+
+FUNCTION {control.author.decode}
+{
+ control.author
+ duplicate$ duplicate$ #0 < swap$ #128 < not or
+ {
+ int.to.str$ "(" swap$ * ")" *
+ "Control cannot interpret author " swap$ *
+ warning$
+ }{
+ 'control.author.jnrlst swap$ duplicate$ #64 control.decode
+ 'control.author.dotless swap$ duplicate$ #32 control.decode
+ 'control.author.nospace swap$ duplicate$ #16 control.decode
+ 'control.author.initials swap$ duplicate$ #8 control.decode
+ 'control.author.nocomma swap$ duplicate$ #4 control.decode
+ 'control.author.first swap$ duplicate$ #2 control.decode
+ 'control.author.reversed swap$ duplicate$ #1 control.decode
+ duplicate$ #0 =
+ 'skip$
+ {
+ "Control: residue of author"
+ "(" swap$ * ")" * *
+ warning$
+ }
+ if$
+ pop$
+ }
+ if$
+}
+
+FUNCTION {control.setup}
+{
+ type$ cite$ "{" swap$ * "}, " * *
+ "control.key" key control.dump *
+ "control.author" author control.dump *
+ "control.editor" editor control.dump *
+ "control.title" title control.dump *
+ "control.pages" pages control.dump *
+ "control.year" year control.dump *
+ "control.eprint" eprint control.dump *
+ top$
+ 'control.key key control.parse
+ 'control.author author control.parse
+ 'control.editor editor control.parse
+ 'control.title title control.parse
+ 'control.pages pages control.parse
+ 'control.year year control.parse
+ 'control.eprint eprint control.parse
+ control.author.decode
+}
+
+FUNCTION {control.pass}
+{ type$ "control" = 'control.setup 'skip$ if$
+}
+
+FUNCTION {control.presort}
+{
+}
+
+FUNCTION {control.forward}
+{
+}
+
+FUNCTION {control.reverse}
+{
+}
+
+FUNCTION {control.sort}
+{
+}
+
+FUNCTION {control.longest.label}
+{
+}
+
+FUNCTION {control.key.bib}
+{
+ "Control: key "
+ control.key
+ duplicate$ "(" swap$ int.to.str$ * ") " * swap$
+ pop$ *
+ diagn.cmntlog
+}
+
+FUNCTION {control.author.bib}
+{
+ "Control: author "
+ control.author "(" swap$ int.to.str$ * ")" * *
+ control.author.reversed { " reversed" * }{} if$
+ control.author.first { " first" * }{} if$
+ control.author.nocomma { " nocomma" * }{} if$
+ control.author.initials { " initials" * }{} if$
+ control.author.nospace { " nospace" * }{} if$
+ control.author.dotless { " dotless" * }{} if$
+ control.author.jnrlst { " jnrlst" * }{} if$
+ diagn.cmntlog
+}
+
+FUNCTION {control.editor.bib}
+{
+ "Control: editor formatted "
+ control.editor
+ duplicate$ "(" swap$ int.to.str$ * ") " * swap$
+ duplicate$ #0 < {
+ pop$
+ "disabled!"
+ } {
+ #0 > {
+ "identically to author"
+ } {
+ "differently from author"
+ } if$
+ } if$ * *
+ diagn.cmntlog
+}
+
+FUNCTION {control.title.bib}
+{
+ "Control: production of article title "
+ control.title
+ duplicate$ "(" swap$ int.to.str$ * ") " * swap$
+ duplicate$ #0 < {
+ pop$
+ "disabled"
+ } {
+ #0 > {
+ "required"
+ } {
+ "allowed"
+ } if$
+ } if$ * *
+ diagn.cmntlog
+}
+
+FUNCTION {control.pages.bib}
+{
+ "Control: page "
+ control.pages
+ duplicate$ "(" swap$ int.to.str$ * ") " * swap$
+ duplicate$ #0 < {
+ pop$
+ "none"
+ } {
+ #0 > {
+ "range"
+ } {
+ "single"
+ } if$
+ } if$ * *
+ diagn.cmntlog
+}
+
+FUNCTION {control.year.bib}
+{
+ "Control: year "
+ control.year
+ duplicate$ "(" swap$ int.to.str$ * ") " * swap$
+ duplicate$ #0 < {
+ pop$
+ "disabled!"
+ } {
+ #0 > {
+ "truncated"
+ } {
+ "verbatim"
+ } if$
+ } if$ * *
+ diagn.cmntlog
+}
+
+FUNCTION {control.eprint.bib}
+{
+ "Control: production of eprint "
+ control.eprint
+ duplicate$ "(" swap$ int.to.str$ * ") " * swap$
+ #0 < { "disabled" } { "enabled" } if$ * *
+ diagn.cmntlog
+}
+
+FUNCTION {control.bib}
+{
+ control.key.bib
+ control.author.bib
+ control.editor.bib
+ control.title.bib
+ control.pages.bib
+ control.year.bib
+ control.eprint.bib
+}
+
+FUNCTION {init.state.consts}
+{
+ #0 'before.all :=
+ #1 'after.word :=
+ #2 'after.punctuation :=
+ #3 'after.sentence :=
+ #4 'after.block :=
+ #0 'punctuation.no :=
+ #1 'punctuation.space :=
+ #2 'punctuation.yes :=
+ "" 'bibfield :=
+ "" 'output.bibfield :=
+}
+
+STRINGS { s t}
+FUNCTION {block.punctuation}
+{ ""
+ "," *
+}
+
+FUNCTION {word.space}
+{
+ "\ "
+}
+
+FUNCTION {show.stackstring.one}{
+ "(" *
+ output.state int.to.str$ *
+ "," * punctuation.state int.to.str$ *
+ ")" * top$
+ duplicate$ "1(" swap$ * ")" * top$
+}
+
+FUNCTION {show.stackstring.two}{
+ "(" *
+ output.state int.to.str$ *
+ "," * punctuation.state int.to.str$ *
+ ")" * top$
+ swap$
+ duplicate$ "1(" swap$ * ")" * top$
+ swap$
+ duplicate$ "2(" swap$ * ")" * top$
+}
+
+FUNCTION {bibfield.command}{ "\bibfield "}
+
+FUNCTION {output.nonnull}
+{
+ swap$
+ output.state after.word =
+ {
+ block.punctuation *
+ word.space *
+ }
+ {
+ output.state after.punctuation =
+ {
+ word.space *
+ }
+ {
+ output.state after.block = output.state after.sentence = or
+ {
+ add.period$
+ "\EOS\ " *
+ }{
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ output.bibfield duplicate$ empty$ 'pop$
+ {
+ bibfield.command
+ " {" * swap$ * "} {" * swap$ * "}" *
+ }
+ if$
+ write$
+ bibfield 'output.bibfield := "" 'bibfield :=
+ output.state after.block =
+ {
+ newline$
+ "\newblock " write$
+ }
+ 'skip$
+ if$
+ punctuation.state duplicate$
+ punctuation.yes 'punctuation.state :=
+ punctuation.no =
+ { pop$ before.all }
+ { punctuation.yes = { after.word }{ after.punctuation } if$ }
+ if$
+ 'output.state :=
+}
+
+FUNCTION {output}
+{ duplicate$ empty$
+ {
+ pop$
+ "" 'bibfield :=
+ }
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.nopunct}
+{
+ punctuation.no 'punctuation.state :=
+ output.nonnull
+}
+
+FUNCTION {output.check}
+{ swap$
+ duplicate$ empty$
+ { pop$ "empty " swap$ * " in " * cite$ * warning$ }
+ { swap$ pop$ output.nonnull }
+ if$
+}
+
+FUNCTION {bbl.open} { "\BibitemOpen " }
+
+FUNCTION {bbl.shut} { "\BibitemShut " }
+
+FUNCTION {bibitem.shut.stop} { bbl.shut "{Stop}%" * }
+
+FUNCTION {bibitem.shut.nostop} { bbl.shut "{NoStop}%" * }
+
+FUNCTION {bibitem.shut}
+{
+ non.stop
+ {
+ bibitem.shut.nostop *
+ }{
+ bibitem.shut.stop *
+ }
+ if$
+}
+
+FUNCTION {html.itag} {
+ "p"
+}
+
+FUNCTION {html.ltag} {
+ ""
+}
+
+FUNCTION {output.SLACcitation}
+{ SLACcitation empty$
+ 'skip$
+ {
+ newline$
+ SLACcitation write$
+ }
+ if$
+}
+
+FUNCTION {fin.entry}
+{
+ bibitem.shut
+ write$
+ output.SLACcitation
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+
+FUNCTION {new.block.comma}
+{
+}
+
+FUNCTION {new.sentence}
+{ output.state after.block = output.state before.all = or
+ 'skip$
+ { after.sentence 'output.state := }
+ if$
+}
+
+FUNCTION {new.sentence.comma}
+{
+}
+
+FUNCTION {sentence.or.colon}
+{
+ new.sentence
+}
+
+FUNCTION {add.blank}
+{
+ word.space *
+ before.all 'output.state :=
+}
+
+FUNCTION {no.blank.or.punct}
+{
+ "\hspace {0pt}" *
+ before.all 'output.state :=
+}
+
+FUNCTION {date.block}
+{
+ new.block.comma
+ skip$
+}
+
+STRINGS {z}
+FUNCTION {remove.dots}
+{
+ control.author.dotless {
+ 'z :=
+ ""
+ { z empty$ not }
+ { z #1 #1 substring$
+ z #2 global.max$ substring$ 'z :=
+ duplicate$ "." = 'pop$
+ { * }
+ if$
+ }
+ while$
+ } 'skip$ if$
+}
+
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{
+ duplicate$ empty$
+ { pop$ "" }
+ {
+ "\emph {" swap$ * "}" *
+ }
+ if$
+}
+
+FUNCTION {bolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\textbf {" swap$ * "}" * }
+ if$
+}
+
+FUNCTION {bib.name.font}
+{
+ duplicate$ empty$
+ { pop$ "" }
+ {
+ "\bibnamefont {" swap$ * "}" *
+ }
+ if$
+}
+
+FUNCTION {bib.fname.font}
+{
+ duplicate$ empty$
+ { pop$ "" }
+ {
+ "\bibfnamefont {" swap$ * "}" *
+ }
+ if$
+}
+
+FUNCTION {cite.name.font}
+{
+ duplicate$ empty$
+ { pop$ "" }
+ {
+ "\citenamefont {" swap$ * "}" *
+ }
+ if$
+}
+
+FUNCTION {tie.or.space.prefix}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { word.space }
+ if$
+ swap$
+}
+
+FUNCTION {capitalize}
+{
+ "u" change.case$ "t" change.case$
+}
+
+FUNCTION {space.word}
+{ word.space swap$ * word.space * }
+
+ % Here are the language-specific definitions for explicit words.
+ % Each function has a name bbl.xxx where xxx is the English word.
+ % The language selected here is ENGLISH
+
+FUNCTION {bbl.and}
+{
+ "and"
+}
+
+FUNCTION {bbl.etal}
+{
+ "et~al."
+}
+
+FUNCTION {bbl.editors}
+{
+ "eds."
+}
+
+FUNCTION {bbl.editor}
+{
+ "ed."
+}
+
+FUNCTION {bbl.edby}
+{ "edited by" }
+
+FUNCTION {bbl.edition}
+{
+ "ed."
+}
+
+FUNCTION {bbl.volume}
+{
+ "vol."
+}
+
+FUNCTION {bbl.of}
+{ "of" }
+
+FUNCTION {bbl.number}
+{
+ "no."
+}
+
+FUNCTION {bbl.nr}
+{ "no." }
+
+FUNCTION {bbl.in}
+{ "in" }
+
+FUNCTION {bbl.pages}
+{
+ "pp."
+}
+
+FUNCTION {bbl.page}
+{
+ "p."
+}
+
+FUNCTION {bbl.eidpp}
+{ "pages" }
+
+FUNCTION {bbl.chapter}
+{
+ "chap."
+}
+
+FUNCTION {bbl.techrep}
+{
+ "Tech. Rep."
+}
+
+FUNCTION {bbl.mthesis}
+{ "Master's thesis" }
+
+FUNCTION {bbl.phdthesis}
+{ "Ph.D. thesis" }
+
+FUNCTION {bbl.first}
+{
+ "1st"
+}
+
+FUNCTION {bbl.second}
+{
+ "2nd"
+}
+
+FUNCTION {bbl.third}
+{
+ "3rd"
+}
+
+FUNCTION {bbl.fourth}
+{
+ "4th"
+}
+
+FUNCTION {bbl.fifth}
+{
+ "5th"
+}
+
+FUNCTION {bbl.st}
+{ "st" }
+
+FUNCTION {bbl.nd}
+{ "nd" }
+
+FUNCTION {bbl.rd}
+{ "rd" }
+
+FUNCTION {bbl.th}
+{ "th" }
+
+MACRO {jan} {"Jan."}
+
+MACRO {feb} {"Feb."}
+
+MACRO {mar} {"Mar."}
+
+MACRO {apr} {"Apr."}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"Jun."}
+
+MACRO {jul} {"Jul."}
+
+MACRO {aug} {"Aug."}
+
+MACRO {sep} {"Sep."}
+
+MACRO {oct} {"Oct."}
+
+MACRO {nov} {"Nov."}
+
+MACRO {dec} {"Dec."}
+
+FUNCTION {bbl.url.prefix}
+{
+ "\urlprefix "
+}
+
+FUNCTION {eng.ord}
+{ duplicate$ "1" swap$ *
+ #-2 #1 substring$ "1" =
+ { bbl.th * }
+ { duplicate$ #-1 #1 substring$
+ duplicate$ "1" =
+ { pop$ bbl.st * }
+ { duplicate$ "2" =
+ { pop$ bbl.nd * }
+ { "3" =
+ { bbl.rd * }
+ { bbl.th * }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+ %-------------------------------------------------------------------
+ % Begin module:
+ % \ProvidesFile{physjour.mbs}[2002/01/14 2.2 (PWD)]
+MACRO {aa}{"Astron. \& Astrophys."}
+MACRO {aasup}{"Astron. \& Astrophys. Suppl. Ser."}
+MACRO {aj} {"Astron. J."}
+MACRO {aph} {"Acta Phys."}
+MACRO {advp} {"Adv. Phys."}
+MACRO {ajp} {"Amer. J. Phys."}
+MACRO {ajm} {"Amer. J. Math."}
+MACRO {amsci} {"Amer. Sci."}
+MACRO {anofd} {"Ann. Fluid Dyn."}
+MACRO {am} {"Ann. Math."}
+MACRO {ap} {"Ann. Phys. (NY)"}
+MACRO {adp} {"Ann. Phys. (Leipzig)"}
+MACRO {ao} {"Appl. Opt."}
+MACRO {apl} {"Appl. Phys. Lett."}
+MACRO {app} {"Astroparticle Phys."}
+MACRO {apj} {"Astrophys. J."}
+MACRO {apjsup} {"Astrophys. J. Suppl."}
+MACRO {apss} {"Astrophys. Space Sci."}
+MACRO {araa} {"Ann. Rev. Astron. Astrophys."}
+MACRO {baas} {"Bull. Amer. Astron. Soc."}
+MACRO {baps} {"Bull. Amer. Phys. Soc."}
+MACRO {cmp} {"Comm. Math. Phys."}
+MACRO {cpam} {"Commun. Pure Appl. Math."}
+MACRO {cppcf} {"Comm. Plasma Phys. \& Controlled Fusion"}
+MACRO {cpc} {"Comp. Phys. Comm."}
+MACRO {cqg} {"Class. Quant. Grav."}
+MACRO {cra} {"C. R. Acad. Sci. A"}
+MACRO {fed} {"Fusion Eng. \& Design"}
+MACRO {ft} {"Fusion Tech."}
+MACRO {grg} {"Gen. Relativ. Gravit."}
+MACRO {ieeens} {"IEEE Trans. Nucl. Sci."}
+MACRO {ieeeps} {"IEEE Trans. Plasma Sci."}
+MACRO {ijimw} {"Interntl. J. Infrared \& Millimeter Waves"}
+MACRO {ip} {"Infrared Phys."}
+MACRO {irp} {"Infrared Phys."}
+MACRO {jap} {"J. Appl. Phys."}
+MACRO {jasa} {"J. Acoust. Soc. America"}
+MACRO {jcp} {"J. Comp. Phys."}
+MACRO {jetp} {"Sov. Phys.--JETP"}
+MACRO {jfe} {"J. Fusion Energy"}
+MACRO {jfm} {"J. Fluid Mech."}
+MACRO {jmp} {"J. Math. Phys."}
+MACRO {jne} {"J. Nucl. Energy"}
+MACRO {jnec} {"J. Nucl. Energy, C: Plasma Phys., Accelerators, Thermonucl. Res."}
+MACRO {jnm} {"J. Nucl. Mat."}
+MACRO {jpc} {"J. Phys. Chem."}
+MACRO {jpp} {"J. Plasma Phys."}
+MACRO {jpsj} {"J. Phys. Soc. Japan"}
+MACRO {jsi} {"J. Sci. Instrum."}
+MACRO {jvst} {"J. Vac. Sci. \& Tech."}
+MACRO {nat} {"Nature"}
+MACRO {nature} {"Nature"}
+MACRO {nedf} {"Nucl. Eng. \& Design/Fusion"}
+MACRO {nf} {"Nucl. Fusion"}
+MACRO {nim} {"Nucl. Inst. \& Meth."}
+MACRO {nimpr} {"Nucl. Inst. \& Meth. in Phys. Res."}
+MACRO {np} {"Nucl. Phys."}
+MACRO {npb} {"Nucl. Phys. B"}
+MACRO {nt/f} {"Nucl. Tech./Fusion"}
+MACRO {npbpc} {"Nucl. Phys. B (Proc. Suppl.)"}
+MACRO {inc} {"Nuovo Cimento"}
+MACRO {nc} {"Nuovo Cimento"}
+MACRO {pf} {"Phys. Fluids"}
+MACRO {pfa} {"Phys. Fluids A: Fluid Dyn."}
+MACRO {pfb} {"Phys. Fluids B: Plasma Phys."}
+MACRO {pl} {"Phys. Lett."}
+MACRO {pla} {"Phys. Lett. A"}
+MACRO {plb} {"Phys. Lett. B"}
+MACRO {prep} {"Phys. Rep."}
+MACRO {pnas} {"Proc. Nat. Acad. Sci. USA"}
+MACRO {pp} {"Phys. Plasmas"}
+MACRO {ppcf} {"Plasma Phys. \& Controlled Fusion"}
+MACRO {phitrsl} {"Philos. Trans. Roy. Soc. London"}
+MACRO {prl} {"Phys. Rev. Lett."}
+MACRO {pr} {"Phys. Rev."}
+MACRO {physrev} {"Phys. Rev."}
+MACRO {pra} {"Phys. Rev. A"}
+MACRO {prb} {"Phys. Rev. B"}
+MACRO {prc} {"Phys. Rev. C"}
+MACRO {prd} {"Phys. Rev. D"}
+MACRO {pre} {"Phys. Rev. E"}
+MACRO {ps} {"Phys. Scripta"}
+MACRO {procrsl} {"Proc. Roy. Soc. London"}
+MACRO {rmp} {"Rev. Mod. Phys."}
+MACRO {rsi} {"Rev. Sci. Inst."}
+MACRO {science} {"Science"}
+MACRO {sciam} {"Sci. Am."}
+MACRO {sam} {"Stud. Appl. Math."}
+MACRO {sjpp} {"Sov. J. Plasma Phys."}
+MACRO {spd} {"Sov. Phys.--Doklady"}
+MACRO {sptp} {"Sov. Phys.--Tech. Phys."}
+MACRO {spu} {"Sov. Phys.--Uspeki"}
+MACRO {st} {"Sky and Telesc."}
+ % End module: physjour.mbs
+ %-------------------------------------------------------------------
+ % Begin module:
+ % \ProvidesFile{geojour.mbs}[2002/07/10 2.0h (PWD)]
+MACRO {aisr} {"Adv. Space Res."}
+MACRO {ag} {"Ann. Geophys."}
+MACRO {anigeo} {"Ann. Geofis."}
+MACRO {angl} {"Ann. Glaciol."}
+MACRO {andmet} {"Ann. d. Meteor."}
+MACRO {andgeo} {"Ann. d. Geophys."}
+MACRO {andphy} {"Ann. Phys.-Paris"}
+MACRO {afmgb} {"Arch. Meteor. Geophys. Bioklimatol."}
+MACRO {atph} {"Atm\'osphera"}
+MACRO {aao} {"Atmos. Ocean"}
+MACRO {ass}{"Astrophys. Space Sci."}
+MACRO {atenv} {"Atmos. Environ."}
+MACRO {aujag} {"Aust. J. Agr. Res."}
+MACRO {aumet} {"Aust. Meteorol. Mag."}
+MACRO {blmet} {"Bound.-Lay. Meteorol."}
+MACRO {bams} {"Bull. Amer. Meteorol. Soc."}
+MACRO {cch} {"Clim. Change"}
+MACRO {cdyn} {"Clim. Dynam."}
+MACRO {cbul} {"Climatol. Bull."}
+MACRO {cap} {"Contrib. Atmos. Phys."}
+MACRO {dsr} {"Deep-Sea Res."}
+MACRO {dhz} {"Dtsch. Hydrogr. Z."}
+MACRO {dao} {"Dynam. Atmos. Oceans"}
+MACRO {eco} {"Ecology"}
+MACRO {empl}{"Earth, Moon and Planets"}
+MACRO {envres} {"Environ. Res."}
+MACRO {envst} {"Environ. Sci. Technol."}
+MACRO {ecms} {"Estuarine Coastal Mar. Sci."}
+MACRO {expa}{"Exper. Astron."}
+MACRO {geoint} {"Geofis. Int."}
+MACRO {geopub} {"Geofys. Publ."}
+MACRO {geogeo} {"Geol. Geofiz."}
+MACRO {gafd} {"Geophys. Astrophys. Fluid Dyn."}
+MACRO {gfd} {"Geophys. Fluid Dyn."}
+MACRO {geomag} {"Geophys. Mag."}
+MACRO {georl} {"Geophys. Res. Lett."}
+MACRO {grl} {"Geophys. Res. Lett."}
+MACRO {ga} {"Geophysica"}
+MACRO {gs} {"Geophysics"}
+MACRO {ieeetap} {"IEEE Trans. Antenn. Propag."}
+MACRO {ijawp} {"Int. J. Air Water Pollut."}
+MACRO {ijc} {"Int. J. Climatol."}
+MACRO {ijrs} {"Int. J. Remote Sens."}
+MACRO {jam} {"J. Appl. Meteorol."}
+MACRO {jaot} {"J. Atmos. Ocean. Technol."}
+MACRO {jatp} {"J. Atmos. Terr. Phys."}
+MACRO {jastp} {"J. Atmos. Solar-Terr. Phys."}
+MACRO {jce} {"J. Climate"}
+MACRO {jcam} {"J. Climate Appl. Meteor."}
+MACRO {jcm} {"J. Climate Meteor."}
+MACRO {jcy} {"J. Climatol."}
+MACRO {jgr} {"J. Geophys. Res."}
+MACRO {jga} {"J. Glaciol."}
+MACRO {jh} {"J. Hydrol."}
+MACRO {jmr} {"J. Mar. Res."}
+MACRO {jmrj} {"J. Meteor. Res. Japan"}
+MACRO {jm} {"J. Meteor."}
+MACRO {jpo} {"J. Phys. Oceanogr."}
+MACRO {jra} {"J. Rech. Atmos."}
+MACRO {jaes} {"J. Aeronaut. Sci."}
+MACRO {japca} {"J. Air Pollut. Control Assoc."}
+MACRO {jas} {"J. Atmos. Sci."}
+MACRO {jmts} {"J. Mar. Technol. Soc."}
+MACRO {jmsj} {"J. Meteorol. Soc. Japan"}
+MACRO {josj} {"J. Oceanogr. Soc. Japan"}
+MACRO {jwm} {"J. Wea. Mod."}
+MACRO {lao} {"Limnol. Oceanogr."}
+MACRO {mwl} {"Mar. Wea. Log"}
+MACRO {mau} {"Mausam"}
+MACRO {meteor} {"``Meteor'' Forschungsergeb."}
+MACRO {map} {"Meteorol. Atmos. Phys."}
+MACRO {metmag} {"Meteor. Mag."}
+MACRO {metmon} {"Meteor. Monogr."}
+MACRO {metrun} {"Meteor. Rundsch."}
+MACRO {metzeit} {"Meteor. Z."}
+MACRO {metgid} {"Meteor. Gidrol."}
+MACRO {mwr} {"Mon. Weather Rev."}
+MACRO {nwd} {"Natl. Weather Dig."}
+MACRO {nzjmfr} {"New Zeal. J. Mar. Freshwater Res."}
+MACRO {npg} {"Nonlin. Proc. Geophys."}
+MACRO {om} {"Oceanogr. Meteorol."}
+MACRO {ocac} {"Oceanol. Acta"}
+MACRO {oceanus} {"Oceanus"}
+MACRO {paleoc} {"Paleoceanography"}
+MACRO {pce} {"Phys. Chem. Earth"}
+MACRO {pmg} {"Pap. Meteor. Geophys."}
+MACRO {ppom} {"Pap. Phys. Oceanogr. Meteor."}
+MACRO {physzeit} {"Phys. Z."}
+MACRO {pps} {"Planet. Space Sci."}
+MACRO {pss} {"Planet. Space Sci."}
+MACRO {pag} {"Pure Appl. Geophys."}
+MACRO {qjrms} {"Quart. J. Roy. Meteorol. Soc."}
+MACRO {quatres} {"Quat. Res."}
+MACRO {rsci} {"Radio Sci."}
+MACRO {rse} {"Remote Sens. Environ."}
+MACRO {rgeo} {"Rev. Geophys."}
+MACRO {rgsp} {"Rev. Geophys. Space Phys."}
+MACRO {rdgeo} {"Rev. Geofis."}
+MACRO {revmeta} {"Rev. Meteorol."}
+MACRO {sgp}{"Surveys in Geophys."}
+MACRO {sp} {"Solar Phys."}
+MACRO {ssr} {"Space Sci. Rev."}
+MACRO {tellus} {"Tellus"}
+MACRO {tac} {"Theor. Appl. Climatol."}
+MACRO {tagu} {"Trans. Am. Geophys. Union (EOS)"}
+MACRO {wrr} {"Water Resour. Res."}
+MACRO {weather} {"Weather"}
+MACRO {wafc} {"Weather Forecast."}
+MACRO {ww} {"Weatherwise"}
+MACRO {wmob} {"WMO Bull."}
+MACRO {zeitmet} {"Z. Meteorol."}
+ % End module: geojour.mbs
+ %-------------------------------------------------------------------
+ % Begin module:
+ % \ProvidesFile{photjour.mbs}[1999/02/24 2.0b (PWD)]
+
+MACRO {appopt} {"Appl. Opt."}
+MACRO {bell} {"Bell Syst. Tech. J."}
+MACRO {ell} {"Electron. Lett."}
+MACRO {jasp} {"J. Appl. Spectr."}
+MACRO {jqe} {"IEEE J. Quantum Electron."}
+MACRO {jlwt} {"J. Lightwave Technol."}
+MACRO {jmo} {"J. Mod. Opt."}
+MACRO {josa} {"J. Opt. Soc. America"}
+MACRO {josaa} {"J. Opt. Soc. Amer.~A"}
+MACRO {josab} {"J. Opt. Soc. Amer.~B"}
+MACRO {jdp} {"J. Phys. (Paris)"}
+MACRO {oc} {"Opt. Commun."}
+MACRO {ol} {"Opt. Lett."}
+MACRO {phtl} {"IEEE Photon. Technol. Lett."}
+MACRO {pspie} {"Proc. Soc. Photo-Opt. Instrum. Eng."}
+MACRO {sse} {"Solid-State Electron."}
+MACRO {sjot} {"Sov. J. Opt. Technol."}
+MACRO {sjqe} {"Sov. J. Quantum Electron."}
+MACRO {sleb} {"Sov. Phys.--Leb. Inst. Rep."}
+MACRO {stph} {"Sov. Phys.--Techn. Phys."}
+MACRO {stphl} {"Sov. Techn. Phys. Lett."}
+MACRO {vr} {"Vision Res."}
+MACRO {zph} {"Z. f. Physik"}
+MACRO {zphb} {"Z. f. Physik~B"}
+MACRO {zphd} {"Z. f. Physik~D"}
+
+MACRO {CLEO} {"CLEO"}
+MACRO {ASSL} {"Adv. Sol.-State Lasers"}
+MACRO {OSA} {"OSA"}
+ % End module: photjour.mbs
+%% Copyright 1994-2007 Patrick W Daly
+MACRO {acmcs} {"ACM Comput. Surv."}
+
+MACRO {acta} {"Acta Inf."}
+
+MACRO {cacm} {"Commun. ACM"}
+
+MACRO {ibmjrd} {"IBM J. Res. Dev."}
+
+MACRO {ibmsj} {"IBM Syst.~J."}
+
+MACRO {ieeese} {"IEEE Trans. Software Eng."}
+
+MACRO {ieeetc} {"IEEE Trans. Comput."}
+
+MACRO {ieeetcad}
+ {"IEEE Trans. Comput. Aid. Des."}
+
+MACRO {ipl} {"Inf. Process. Lett."}
+
+MACRO {jacm} {"J.~ACM"}
+
+MACRO {jcss} {"J.~Comput. Syst. Sci."}
+
+MACRO {scp} {"Sci. Comput. Program."}
+
+MACRO {sicomp} {"SIAM J. Comput."}
+
+MACRO {tocs} {"ACM Trans. Comput. Syst."}
+
+MACRO {tods} {"ACM Trans. Database Syst."}
+
+MACRO {tog} {"ACM Trans. Graphic."}
+
+MACRO {toms} {"ACM Trans. Math. Software"}
+
+MACRO {toois} {"ACM Trans. Office Inf. Syst."}
+
+MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."}
+
+MACRO {tcs} {"Theor. Comput. Sci."}
+
+FUNCTION {bibinfo.command} { "\bibinfo " }
+
+FUNCTION {bibinfo.check}
+{ swap$
+ duplicate$ missing$
+ {
+ pop$
+ pop$ ""
+ }{
+ duplicate$ empty$
+ {
+ swap$ pop$
+ }{
+ swap$
+ bibinfo.command "{" * swap$ * "} {" * swap$ * "}" *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {bibinfo.warn}
+{ swap$
+ duplicate$ missing$
+ {
+ swap$ "missing " swap$ * " in " * cite$ * warning$ pop$
+ ""
+ }{
+ duplicate$ empty$
+ {
+ swap$ "empty " swap$ * " in " * cite$ * warning$
+ }{
+ swap$
+ bibinfo.command " {" * swap$ * "} {" * swap$ * "}" *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {archiv.base}
+{
+ "http://arxiv.org/abs"
+}
+
+FUNCTION {archiv.prefix.base}
+{
+ "arXiv"
+}
+
+FUNCTION {eprint.command}
+{
+ "\Eprint "
+}
+
+FUNCTION {format.eprint}
+{
+ eprint duplicate$ empty$
+ control.eprint #0 <
+ or
+ { pop$ "" }
+ {
+ duplicate$
+ ""
+ archive duplicate$ empty$ { pop$ archiv.base } 'skip$ if$ *
+ "/" *
+ swap$ *
+ "{" swap$ * "} " *
+ swap$
+ ""
+ archivePrefix duplicate$ empty$ { pop$ "" } { ":" * } if$ *
+ swap$ *
+ primaryClass duplicate$ empty$ { pop$ "" } { " [" swap$ * "]" * } if$ *
+ "{" swap$ * "} " *
+ *
+ eprint.command swap$ *
+ }
+ if$
+}
+
+FUNCTION {format.translation}
+{ translation duplicate$ empty$
+ 'skip$
+ { ""
+ "\translation{" * swap$ * "}" *
+ punctuation.space 'punctuation.state :=
+ }
+ if$
+}
+
+FUNCTION {format.url}
+{
+ url duplicate$ empty$
+ { pop$ "" }
+ {
+ "\url "
+ "{" * swap$ * "}" *
+ }
+ if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {check.speaker}
+{ key empty$ 'skip$
+ { key nameptr int.to.str$ =
+ {
+ bolden
+ }
+ 'skip$
+ if$
+ }
+ if$
+}
+
+STRINGS { bibinfo}
+
+FUNCTION {format.names.fname}
+{
+ control.author.initials {
+ control.author.dotless {
+ control.author.nospace {
+ "f{}"
+ } {
+ "f{~}"
+ } if$
+ } {
+ control.author.nospace {
+ "f{.}."
+ } {
+ "f."
+ } if$
+ } if$
+ } {
+ "ff"
+ } if$
+}
+
+FUNCTION {bracify}
+{
+ "{" swap$ * "}" *
+}
+
+FUNCTION {name.comma}
+{
+ control.author.nocomma 'skip$ { "," swap$ * } if$
+}
+
+FUNCTION {format.names.format.onefont}
+{
+ "{vv~}{ll}"
+ nameptr #1 >
+ control.author.first
+ and
+ control.author.reversed not
+ or
+ {
+ control.author.initials {
+ "f"
+ control.author.dotless 'skip$ {
+ "." *
+ } if$
+ "~" *
+ } {
+ "ff"
+ } if$
+ bracify
+ swap$
+ } {
+ format.names.fname
+ " " swap$ *
+ name.comma
+ bracify
+ }
+ if$
+ "jj"
+ " " swap$ *
+ name.comma
+ bracify
+ control.author.jnrlst 'skip$ 'swap$ if$
+ * *
+}
+
+FUNCTION {format.names.onefont}
+{
+ s nameptr format.names.format.onefont format.name$
+ remove.dots
+ bib.name.font
+}
+
+FUNCTION {format.names.morfont}
+{ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font
+ nameptr #1 >
+ control.author.first
+ and
+ control.author.reversed not
+ or
+ {
+ s nameptr
+ control.author.initials {
+ "f" % default: name + surname + comma junior
+ } {
+ "ff"
+ } if$
+ control.author.dotless 'skip$ {
+ "." * % nm-init % Initials. + surname (J. F. Smith) control.author.initials
+ } if$
+ bracify
+ format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ swap$
+ *
+ s nameptr
+ "{jj}" format.name$ duplicate$ empty$ 'skip$
+ { bib.fname.font ", " swap$ * }
+ if$
+ } {
+ "," *
+ s nameptr
+ format.names.fname
+ "jj"
+ " "
+ name.comma
+ control.author.jnrlst {
+ swap$ * skip$
+ } {
+ skip$ * swap$
+ } if$
+ bracify swap$ bracify swap$
+ *
+ format.name$
+ remove.dots
+ duplicate$ empty$ 'skip$
+ { bib.fname.font " " swap$ * }
+ if$
+ } if$
+ *
+}
+
+FUNCTION {names.punctuate}
+{
+ "," *
+ " " *
+}
+
+FUNCTION {format.names}
+{ 'bibinfo :=
+ duplicate$ empty$ { pop$ "" } {
+ duplicate$ num.names$
+ duplicate$ 'numnames :=
+ 'namesleft :=
+ 's :=
+ #1 'nameptr :=
+ ""
+ { namesleft #0 > }
+ {
+ format.names.morfont
+ bibinfo bibinfo.check
+ type$ "presentation" =
+ 'check.speaker
+ 'skip$
+ if$
+ 't :=
+ nameptr #1 > not
+ {
+ t *
+ } {
+ namesleft #1 >
+ {
+ names.punctuate
+ t *
+ } {
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ { 't := }
+ { pop$ }
+ if$
+%<*!apsrmp>
+ numnames #2 >
+ 'names.punctuate
+ 'skip$
+ if$
+%</!apsrmp>
+%<apsrmp> names.punctuate
+ t "others" =
+ {
+ " " *
+ bbl.etal
+ emphasize
+ *
+ } {
+ bbl.and
+ space.word *
+ t *
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ } if$
+}
+
+FUNCTION {format.names.ed.onefont}
+{
+ s nameptr
+ control.author.initials {
+ control.author.dotless {
+ control.author.nospace {
+ "{f{}~}{vv~}{ll}{ jj}" % nm-rvx|nm-rvcx
+ } {
+ "{f{~}~}{vv~}{ll}{ jj}" % nm-rv
+ } if$
+ } {
+ control.author.nospace {
+ "{f{.}.~}{vv~}{ll}{ jj}" % nm-rvv|nm-rvvc
+ }{
+ "{f.~}{vv~}{ll}{, jj}" % nm-init|nm-rev|nm-rev1
+ } if$
+ } if$
+ } {
+ "{ff~}{vv~}{ll}{, jj}"
+ } if$
+ format.name$
+ remove.dots
+ bib.name.font
+}
+
+FUNCTION {format.names.ed.morfont}
+{
+ control.author.reversed { %
+ control.author.initials { %
+ control.author.dotless { %
+ s nameptr
+ control.author.nospace { % nm-rvx nm-rvcx
+ "{f{}}"
+ } { % nm-rv
+ "{f{~}}"
+ } if$
+ format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font *
+ s nameptr
+ "{jj}" format.name$
+ remove.dots
+ duplicate$ empty$ 'skip$
+ { bib.fname.font " " swap$ * }
+ if$
+ } { % !control.author.dotless
+ s nameptr
+ control.author.nospace { % nm-rvv
+ "{ff}"
+ } { % nm-rev nm-rev1
+ "{f.}"
+ } if$
+ format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font *
+ s nameptr
+ "{jj}" format.name$
+ duplicate$ empty$ 'skip$
+ { bib.fname.font ", " swap$ * }
+ if$
+ } if$
+ } { % Full names !control.author.initials nm-revf nm-revv1
+ s nameptr
+ "{ff}"
+ format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font *
+ s nameptr
+ "{jj}" format.name$
+ duplicate$ empty$ 'skip$
+ { bib.fname.font ", " swap$ * }
+ if$
+ } if$
+ } { % !control.author.reversed nm-init
+ s nameptr
+ "{f.}"
+ format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font *
+ s nameptr
+ "{jj}" format.name$
+ duplicate$ empty$ 'skip$
+ { bib.fname.font ", " swap$ * }
+ if$
+ } if$
+ *
+}
+
+FUNCTION {format.names.ed}
+{
+ control.editor #0 > {
+ format.names
+ } {
+ 'bibinfo :=
+ duplicate$ empty$ 'skip$ {
+ 's :=
+ "" 't :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ {
+ format.names.ed.morfont
+ bibinfo bibinfo.check
+ 't :=
+ nameptr #1 >
+ {
+ namesleft #1 >
+ {
+ names.punctuate
+ t *
+ }{
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ { 't := }
+ { pop$ }
+ if$
+ numnames #2 >
+ 'names.punctuate
+ 'skip$
+ if$
+ t "others" =
+ {
+ " " * bbl.etal emphasize *
+ }{
+ bbl.and
+ space.word * t *
+ }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ } if$
+ } if$
+}
+
+FUNCTION {format.key}
+{ empty$
+ { key field.or.null }
+ { "" }
+ if$
+}
+
+FUNCTION {format.authors}
+{ author "author" format.names
+ duplicate$ empty$ 'skip$
+ { collaboration "collaboration" bibinfo.check
+ duplicate$ empty$ 'skip$
+ { " (" swap$ * ")" * }
+ if$
+ *
+ }
+ if$
+ "author" 'bibfield :=
+}
+
+FUNCTION {get.bbl.editor}
+{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$
+}
+
+FUNCTION {format.editors}
+{ editor "editor" format.names duplicate$ empty$ 'skip$
+ {
+ "," *
+ word.space *
+ get.bbl.editor
+%<apsrmp> capitalize
+ *
+ }
+ if$
+}
+
+FUNCTION {format.isbn.output}
+{
+}
+
+FUNCTION {format.issn.output}
+{
+}
+
+FUNCTION {doi.base}
+{
+ "http://dx.doi.org/"
+}
+
+FUNCTION {doi.base.command}
+{
+ "\doibase "
+}
+
+FUNCTION {noop.command}
+{
+ "\href@noop "
+}
+
+FUNCTION {href.command}
+{
+ "\href "
+}
+
+FUNCTION {link.tag.open}
+{
+ doi duplicate$ empty$
+ {
+ pop$
+ url duplicate$ empty$
+ {
+ pop$ "" noop.command
+ }{
+ href.command
+ }
+ if$
+ }
+ {
+ doi.base.command swap$ *
+ href.command
+ }
+ if$
+ "{" * swap$ * "} {" *
+}
+
+FUNCTION {link.tag.shut}
+{
+ "}"
+}
+
+FUNCTION {link.open}
+{
+ link.tag.open output.nopunct
+}
+
+FUNCTION {link.shut}
+{
+ link.tag.shut *
+}
+
+FUNCTION {add.doi}
+{
+ link.tag.open swap$ * link.tag.shut *
+}
+
+FUNCTION {select.language}
+{ duplicate$ empty$
+ 'pop$
+ { language empty$
+ 'skip$
+ { "{\selectlanguage {" language * "}" * swap$ * "}" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.note}
+{
+ note empty$
+ { "" }
+ { note #1 #1 substring$
+ duplicate$ "{" =
+ 'skip$
+ {
+ output.state after.word = output.state after.punctuation = or
+ { "l" }
+ { "u" }
+ if$ change.case$
+ }
+ if$
+ note #2 global.max$ substring$ * "note" bibinfo.check
+ }
+ if$
+}
+
+FUNCTION {bbl.enquote}
+{
+ "\enquote "
+}
+
+FUNCTION {string.enquote}
+{
+ punctuation.no 'punctuation.state :=
+ non.stop {
+ block.punctuation
+ } { "" } if$
+ swap$ pop$
+ *
+ bbl.enquote "{" * swap$ * "}" *
+ word.space *
+}
+
+FUNCTION {format.title}
+{ title
+ duplicate$ empty$ 'skip$ { "t" change.case$ } if$
+ duplicate$ "title" bibinfo.check swap$
+ duplicate$ empty$ 'pop$
+ {
+ punctuation.yes 'punctuation.state :=
+ string.enquote
+ select.language
+ }
+ if$
+}
+
+FUNCTION {end.quote.title}
+{ title empty$
+ 'skip$
+ { before.all 'output.state := }
+ if$
+}
+
+FUNCTION {format.name.apply}
+{
+ s nameptr
+ "{vv~}{ll}"
+ format.name$
+ cite.name.font
+}
+
+FUNCTION {format.full.names}
+{
+ 's :=
+ "" 't :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { format.name.apply
+ 't :=
+ nameptr #1 >
+ {
+ namesleft #1 >
+ { ", " * t * }
+ {
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ {
+ 't :=
+ }
+ 'pop$
+ if$
+ t "others" =
+ {
+ " " * bbl.etal
+ emphasize *
+ }{
+ numnames #2 > { "," * }{ skip$ } if$
+ bbl.and
+ space.word * t *
+ }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {make.full.names}
+{
+ key editor author
+ type$ "proceedings" =
+ type$ "book" =
+ type$ "inbook" =
+ or { pop$ }{ { pop$ "" }{ swap$ pop$ "" swap$ } if$ } if$
+ duplicate$ empty$
+ { pop$
+ duplicate$ empty$
+ { pop$
+ duplicate$ empty$
+ { pop$
+ cite$ #1 #3 substring$
+ }{
+ skip$
+ }
+ if$
+ }
+ { swap$ pop$ format.full.names }
+ if$
+ }
+ { swap$ pop$ swap$ pop$ format.full.names }
+ if$
+}
+
+FUNCTION {year.bibitem}
+{
+ year duplicate$ empty$
+ { pop$ ""
+%<apsrmp> "????" *
+ }{
+ skip$
+ } if$
+ extra.label *
+}
+
+FUNCTION {output.bibitem}
+{
+ newline$
+ ""
+ label
+ * ")" *
+ make.full.names duplicate$ short.list =
+ { pop$ }{ * } if$
+ bracify
+ "[" swap$ * "]" *
+ cite$ bracify "%" *
+ *
+ "\bibitem "
+ swap$ *
+ write$ newline$
+ " "
+ duplicate$ bbl.open * write$ newline$
+ before.all 'output.state :=
+ punctuation.yes 'punctuation.state :=
+}
+
+FUNCTION {n.dashify}
+{
+ 't :=
+ ""
+ { t empty$ not }
+ { t #1 #1 substring$ "-" =
+ { t #1 #2 substring$ "--" = not
+ { "--" *
+ t #2 global.max$ substring$ 't :=
+ }{
+ { t #1 #1 substring$ "-" = }
+ { "-" *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+ }
+ if$
+ }{
+ t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+}
+
+FUNCTION {word.in}
+{
+ bbl.in
+ word.space *
+}
+
+FUNCTION {date.encapsulate}
+{
+ duplicate$ empty$
+ 'skip$
+ {
+ before.all 'output.state :=
+ " (" swap$ * ")" *
+ }
+ if$
+}
+
+FUNCTION {format.date}
+{
+ year "year" bibinfo.check duplicate$ empty$
+ {
+%<*apsrmp>
+ "empty year in " cite$ * "; set to ????" * warning$
+ pop$ "????"
+%</apsrmp>
+ }
+ 'skip$
+ if$
+ extra.label *
+ date.encapsulate
+}
+
+FUNCTION {format.date.output.check}
+{
+ format.date
+ "year" output.check
+}
+
+FUNCTION {format.date.output}
+{
+ format.date.output.check
+}
+
+FUNCTION {format.btitle}
+{
+ booktitle duplicate$ empty$ { pop$
+ title
+ } 'skip$ if$
+ "title" bibinfo.check
+ duplicate$ empty$ 'skip$
+ {
+ emphasize
+ select.language
+ }
+ if$
+}
+
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+
+FUNCTION {editor.check.book}
+{ editor empty$ 'skip$
+ {
+ "can't use both author and editor fields in " cite$ *
+ ": try using @inbook instead" *
+ warning$
+ }
+ if$
+}
+
+FUNCTION {format.bvolume}
+{ volume duplicate$ empty$
+ { pop$ "" }
+ {
+ "volume and number" number either.or.check
+ bbl.volume
+ capitalize
+ swap$
+ tie.or.space.prefix "volume" bibinfo.check * *
+ series "series" bibinfo.check duplicate$ empty$ 'pop$
+ {
+ ", "
+ * swap$ *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.number}
+{
+ bbl.number
+ output.state after.word = output.state after.punctuation = or
+ #1 or
+ #0 and
+ 'skip$
+ { capitalize }
+ if$
+ number tie.or.space.prefix "number" bibinfo.check * *
+}
+
+FUNCTION {format.number.series}
+{ volume empty$
+ { number empty$
+ { series field.or.null }
+ {
+ series empty$
+ {
+ number "number" bibinfo.check
+ }{
+ format.number
+ series "series" bibinfo.check
+ word.space * swap$ *
+ }
+ if$
+ }
+ if$
+ }
+ { "" }
+ if$
+}
+
+FUNCTION {is.num}
+{ chr.to.int$
+ duplicate$ "0" chr.to.int$ < not
+ swap$ "9" chr.to.int$ > not and
+}
+
+FUNCTION {extract.num}
+{ duplicate$ 't :=
+ "" 's :=
+ { t empty$ not }
+ { t #1 #1 substring$
+ t #2 global.max$ substring$ 't :=
+ duplicate$ is.num
+ { s swap$ * 's := }
+ { pop$ "" 't := }
+ if$
+ }
+ while$
+ s empty$
+ 'skip$
+ { pop$ s }
+ if$
+}
+
+FUNCTION {convert.edition}
+{ extract.num "l" change.case$ 's :=
+ s "first" = s "1" = or
+ { bbl.first 't := }
+ { s "second" = s "2" = or
+ { bbl.second 't := }
+ { s "third" = s "3" = or
+ { bbl.third 't := }
+ { s "fourth" = s "4" = or
+ { bbl.fourth 't := }
+ { s "fifth" = s "5" = or
+ { bbl.fifth 't := }
+ { s #1 #1 substring$ is.num
+ { s
+ eng.ord
+ 't := }
+ { edition 't := }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ t
+}
+
+FUNCTION {format.edition}
+{ edition duplicate$ empty$ 'skip$
+ {
+ convert.edition
+ output.state after.word = output.state after.punctuation = or
+ { "l" }
+ { "t" }
+ if$ change.case$
+ "edition" bibinfo.check
+ word.space * bbl.edition *
+ }
+ if$
+}
+
+INTEGERS { multiresult }
+FUNCTION {multi.page.check}
+{ 't :=
+ #0 'multiresult :=
+ { multiresult not
+ t empty$ not
+ and
+ }
+ { t #1 #1 substring$
+ duplicate$ "-" =
+ swap$ duplicate$ "," =
+ swap$ "+" =
+ or or
+ { #1 'multiresult := }
+ { t #2 global.max$ substring$ 't := }
+ if$
+ }
+ while$
+ multiresult
+}
+
+FUNCTION {format.pages}
+{ pages duplicate$ empty$
+ 'skip$
+ { duplicate$ multi.page.check
+ {
+ bbl.pages swap$
+ n.dashify
+ }{
+ bbl.page swap$
+ }
+ if$
+ tie.or.space.prefix
+ "pages" bibinfo.check
+ * *
+ }
+ if$
+}
+
+FUNCTION {first.page}
+{ 't :=
+ ""
+ { t empty$ not t #1 #1 substring$ "-" = not and }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+}
+
+FUNCTION {format.book.pages}
+{
+ pages duplicate$ empty$ 'skip$
+ {
+ "pages" bibinfo.check word.space bbl.pages * *
+ }
+ if$
+}
+
+FUNCTION {volnum.punct}
+{
+ ","
+ word.space *
+}
+
+FUNCTION {format.journal.pages}
+{ pages duplicate$ empty$ 'pop$
+ { swap$ duplicate$ empty$
+ { pop$ pop$ format.pages }
+ { volnum.punct *
+ swap$
+ control.pages duplicate$ #0 < {
+ pop$ pop$
+ }{
+ #0 >
+ {
+ n.dashify
+ }{
+ first.page
+ } if$
+ } if$
+ "pages" bibinfo.check
+ *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.journal.eid}
+{ eid "eid" bibinfo.check
+ duplicate$ empty$ 'pop$
+ { swap$ duplicate$ empty$ 'skip$
+ { volnum.punct * }
+ if$
+ swap$ *
+ }
+ if$
+}
+
+FUNCTION {eid.or.pages}
+{
+ eid empty$
+ { format.journal.pages }
+ { format.journal.eid }
+ if$
+}
+
+FUNCTION {format.ser.vol.num}
+{
+ series "series" bibinfo.check output
+ volume field.or.null
+ duplicate$ empty$ 'skip$
+ {
+ "volume" bibinfo.check
+ }
+ if$
+ bolden
+%<*apsrmp>
+ number "number" bibinfo.check duplicate$ empty$ 'skip$
+ {
+ swap$ duplicate$ empty$
+ { "there's a number but no volume in " cite$ * warning$ }
+ 'skip$
+ if$
+ swap$
+ "~(" swap$ * ")" *
+ }
+ if$ *
+%</apsrmp>
+}
+
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+ {
+%<!apsrmp> format.pages
+%<apsrmp> ""
+ }
+ { type empty$
+ {
+ bbl.chapter
+ capitalize
+ }{
+ type
+ capitalize
+ "type" bibinfo.check
+ }
+ if$
+ chapter tie.or.space.prefix
+ "chapter" bibinfo.check
+ * *
+%<*!apsrmp>
+ pages empty$
+ 'skip$
+ { ", " * format.pages * }
+ if$
+%</!apsrmp>
+ }
+ if$
+}
+
+FUNCTION {format.booktitle}
+{
+ booktitle duplicate$ "booktitle" bibinfo.check swap$
+ duplicate$ empty$ 'pop$
+ {
+ punctuation.yes 'punctuation.state :=
+ pop$ emphasize
+ select.language
+ }
+ if$
+}
+
+FUNCTION {format.editor.in}
+{
+ editor "editor" format.names.ed duplicate$ empty$ 'skip$
+ {
+ bbl.edby
+ word.space * swap$ *
+ }
+ if$
+}
+
+FUNCTION {output.article.booktitle}
+{
+ format.booktitle
+ "booktitle" 'bibfield :=
+ output
+ bookaddress "address" bibinfo.check duplicate$ empty$ 'pop$
+ {
+ "address" 'bibfield :=
+ output.nonnull after.punctuation 'output.state :=
+ }
+ if$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{
+ format.booktitle duplicate$ empty$ 'pop$
+ {
+ add.doi
+ word.in swap$ * output.nonnull
+ bookaddress "address" bibinfo.check output
+ format.number.series "series and number" bibinfo.check output
+ format.bvolume output
+ format.editor.in "editor" bibinfo.check output
+ }
+ if$
+}
+
+FUNCTION {format.in.ed.booktitle.inbook}
+{
+ format.booktitle duplicate$ empty$ 'pop$
+ {
+ add.doi
+ word.in swap$ * output.nonnull
+ bookaddress "address" bibinfo.check output
+ format.number.series "series and number" bibinfo.check output
+ format.bvolume output
+ author empty$ 'skip$
+ { format.editor.in "editor" bibinfo.check output }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.thesis.type}
+{ type duplicate$ empty$
+ 'pop$
+ { swap$ pop$
+ "t" change.case$ "type" bibinfo.check
+ }
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ number "number" bibinfo.check
+ type duplicate$ empty$
+ { pop$ bbl.techrep }
+ 'skip$
+ if$
+ "type" bibinfo.check
+ swap$ duplicate$ empty$
+ { pop$ "t" change.case$ }
+ { tie.or.space.prefix * * }
+ if$
+}
+
+FUNCTION {format.article.crossref}
+{
+ word.in
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.book.crossref}
+{ volume duplicate$ empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ pop$ word.in
+ }
+ { bbl.volume
+ swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word *
+ }
+ if$
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.incoll.inproc.crossref}
+{
+ word.in
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.org.or.pub}
+{ 't :=
+ ""
+ address "address" bibinfo.check
+ duplicate$ empty$
+ { pop$ t }
+ { t duplicate$ empty$
+ { pop$ }
+ {
+ "," word.space *
+ * swap$ *
+ }
+ if$
+ }
+ if$
+ *
+%<*!apsrmp>
+ year duplicate$ empty$
+ {
+ "empty year in " cite$ *
+ warning$
+ pop$ ""
+ }
+ 'skip$
+ if$
+ duplicate$ empty$
+ { pop$ }
+ {
+ "year" bibinfo.check
+ swap$
+ duplicate$ empty$
+ { pop$ }
+ {
+ "," *
+ word.space *
+ swap$ *
+ }
+ if$
+ }
+ if$
+%</!apsrmp>
+ duplicate$ empty$ 'skip$ {
+ ""
+ "(" * swap$ * ")" *
+ after.punctuation 'output.state :=
+ punctuation.space 'punctuation.state :=
+ } if$
+}
+
+FUNCTION {format.publisher.address}
+{ publisher "publisher" bibinfo.warn format.org.or.pub
+}
+
+FUNCTION {format.organization.address}
+{ organization "organization" bibinfo.check format.org.or.pub
+}
+
+FUNCTION {format.organization.publisher.address}
+{
+ publisher empty$
+ { format.organization.address }
+ { organization "organization" bibinfo.check output
+ format.publisher.address
+ }
+ if$
+}
+
+FUNCTION {format.school.address.output}
+{
+ school "school" bibinfo.warn
+ address "address" bibinfo.check
+ duplicate$ empty$ 'skip$
+ {
+ swap$
+ duplicate$ empty$ 'skip$
+ {
+ ", " *
+ }
+ if$
+ swap$
+ }
+ if$
+ *
+%<apsrmp> duplicate$ empty$ 'skip$ { "(" swap$ * ")" * } if$ after.punctuation 'output.state :=
+ output
+}
+
+FUNCTION {article.title.produce}
+{
+ control.title duplicate$ #0 <
+ { pop$
+ }{
+ format.title
+ "title" 'bibfield :=
+ swap$ #0 >
+ {
+ "title" output.check
+ }{
+ output
+ } if$
+ new.block.comma
+ } if$
+}
+
+FUNCTION {control}
+{
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors
+ booktitle empty$ {
+ "author" output.check
+ }{ output } if$
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ article.title.produce
+ output.article.booktitle
+ crossref missing$
+ {
+ link.open
+ journal
+ "journal" bibinfo.warn
+ "journal" 'bibfield :=
+ output
+ add.blank
+ format.ser.vol.num
+ output
+ eid.or.pages
+%<!apsrmp> format.date.output.check
+ pages empty$ {
+ doi output
+ } 'skip$ if$
+ link.shut
+ }{
+ format.article.crossref output.nonnull
+%<!apsrmp> format.pages output
+%<apsrmp> eid.or.pages
+ }
+ if$
+ format.issn.output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ format.translation output
+ fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+ author empty$
+ {
+ format.editors "author and editor" output.check
+ editor format.key output
+ }{
+ format.authors output.nonnull
+%% crossref missing$ { editor.check.book } 'skip$ if$
+ }
+ if$
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ link.open
+ format.btitle
+ "title" output.check
+ link.shut
+ format.edition output
+ author empty$
+ {
+ }
+ {
+ format.editor.in output
+ editor format.key output
+ }
+ if$
+ format.number.series output
+ crossref missing$
+ {
+ format.bvolume output
+ new.block.comma
+ format.publisher.address output
+ }{
+ new.block.comma
+ format.book.crossref output.nonnull
+%<!apsrmp> format.date.output.check
+ }
+ if$
+ format.isbn.output
+ format.chapter.pages
+ output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output date.block
+ link.open
+ format.title
+ "title" output.check
+ link.shut
+ new.block.comma
+ howpublished "howpublished" bibinfo.check output
+ address "address" bibinfo.check output
+%<!apsrmp> format.date.output
+ format.isbn.output
+ format.book.pages output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {footnote}
+{ output.bibitem
+ format.note output
+ fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+ author empty$
+ {
+ format.editors "editor" output.check
+ editor format.key output
+ }{
+ format.authors output.nonnull
+ author format.key output
+ }
+ if$
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+
+ format.title output
+ new.block.comma
+
+ crossref missing$
+ {
+ format.in.ed.booktitle.inbook
+%<!apsrmp> format.publisher.address output
+ format.chapter.pages
+%<!apsrmp> "chapter and pages"
+%<apsrmp> "chapter"
+ output.check
+ new.block.comma
+ format.edition output
+ new.block.comma
+%<apsrmp> format.publisher.address output
+ }{
+ format.chapter.pages
+%<!apsrmp> "chapter and pages"
+%<apsrmp> "chapter"
+ output.check
+ new.block.comma
+ format.book.crossref output.nonnull
+%<!apsrmp> format.date.output.check
+ }
+ if$
+ crossref missing$
+ { format.isbn.output }
+ 'skip$
+ if$
+%<apsrmp> format.pages "pages" output.check
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ article.title.produce
+ crossref missing$
+ {
+ format.in.ed.booktitle
+%<!apsrmp> format.publisher.address output
+ format.edition output
+ format.chapter.pages output
+%<apsrmp> format.publisher.address output
+ format.isbn.output
+ }{
+ format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+%<apsrmp> format.pages "pages" output.check
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ article.title.produce
+ crossref missing$
+ {
+ format.in.ed.booktitle
+ format.organization.publisher.address output
+%<!apsrmp> format.chapter.pages output
+ format.isbn.output
+ format.issn.output
+ }{
+ format.incoll.inproc.crossref output.nonnull
+%<!apsrmp> format.chapter.pages output
+ }
+ if$
+%<apsrmp> format.chapter.pages "chapter and pages" output.check
+%<apsrmp> format.pages "pages" output.check
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+FUNCTION {manual}
+{ output.bibitem
+ format.authors output
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output date.block
+ link.open
+ format.btitle
+ "title" output.check
+ link.shut
+ organization "organization" bibinfo.check output
+ address "address" bibinfo.check output
+ format.edition output
+%<!apsrmp> format.date.output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ format.btitle
+ output
+ new.block.comma
+ link.open
+ bbl.mthesis
+ format.thesis.type
+ output.nonnull
+ link.shut
+ format.school.address.output
+%<!apsrmp> format.date.output.check
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ author format.key output
+%<apsrmp> format.date.output
+%<!apsrmp> new.block.comma
+%<apsrmp> date.block
+ link.open
+ format.title
+ output
+ link.shut
+ new.block.comma
+ howpublished "howpublished" bibinfo.check output
+%<!apsrmp> format.date.output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ format.btitle
+ output
+ new.block.comma
+ link.open
+ bbl.phdthesis
+ format.thesis.type
+ output.nonnull
+ link.shut
+ format.school.address.output
+%<!apsrmp> format.date.output.check
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {presentation}
+{ output.bibitem
+ format.authors output
+ author format.key output
+ new.block.comma
+ link.open
+ format.title
+ output
+ link.shut
+ new.block.comma
+ format.organization.address "organization and address" output.check
+ month "month" output.check
+ year "year" output.check
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ new.sentence
+ type missing$ 'skip$
+ {"(" type capitalize * ")" * output}
+ if$
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ format.editors output
+ editor format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ link.open
+ format.btitle
+ "title" output.check
+ link.shut
+ bookaddress "address" bibinfo.check output
+ format.number.series output
+ format.bvolume output
+ format.organization.publisher.address output
+ format.isbn.output
+ format.issn.output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output.check date.block
+ link.open
+%<!apsrev&!apsrmp> format.title
+%<apsrev|apsrmp> format.btitle
+ "title" output.check
+ link.shut
+ new.block.comma
+ format.tr.number
+ output.nonnull
+ institution "institution" bibinfo.warn
+ format.org.or.pub output
+ new.block.comma
+ new.sentence.comma
+ format.note output
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<!apsrmp> new.block.comma
+%<apsrmp> format.date.output date.block
+ link.open
+ format.title
+ "title" output.check
+ link.shut
+%<!apsrmp> format.date.output
+ new.block.comma
+ new.sentence.comma
+ format.note "note" output.check
+ format.eprint output
+ fin.entry
+}
+
+FUNCTION {default.type} { misc }
+
+READ
+
+EXECUTE {control.init}
+
+ITERATE {control.pass}
+
+EXECUTE {control.check}
+
+FUNCTION {sortify}
+{ purify$
+ "l" change.case$
+}
+
+INTEGERS { len }
+
+FUNCTION {chop.word}
+{ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+
+FUNCTION {cite.name.font.apply}
+{
+ word.space * bbl.etal
+ emphasize
+ *
+}
+
+%<*!apsrev&!apsrmp>
+FUNCTION {format.lab.names}
+{ 's :=
+ "" 't :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ {
+ format.name.apply
+ 't :=
+ nameptr #1 >
+ {
+ nameptr
+ #2
+ =
+ numnames
+ #3
+ > and
+ {
+ "others" 't :=
+ #1 'namesleft :=
+ }
+ 'skip$
+ if$
+ namesleft #1 >
+ { ", " * t * }
+ {
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ { 't := }
+ { pop$ }
+ if$
+ t "others" =
+ {
+ cite.name.font.apply
+ }{
+ numnames #2 > { "," * } 'skip$ if$
+ bbl.and
+ space.word * t *
+ }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+%</!apsrev&!apsrmp>
+%<*apsrev|apsrmp>
+FUNCTION {format.lab.names}
+{ 's :=
+ "" 't :=
+ #1 'nameptr :=
+ format.name.apply
+ s num.names$ duplicate$
+ #2 >
+ { pop$
+ cite.name.font.apply
+ }{
+ #2 <
+ 'skip$
+ {
+ s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ {
+ cite.name.font.apply
+ }{
+ bbl.and space.word *
+ s #2 "{vv~}{ll}" format.name$
+ cite.name.font
+ *
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+%</apsrev|apsrmp>
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.lab.names }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {editor.key.label}
+{ editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+
+FUNCTION {calc.short.authors}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ 'editor.key.label
+ 'author.key.label
+ if$
+ }
+ if$
+ 'short.list :=
+}
+
+FUNCTION {calc.label}
+{
+ calc.short.authors
+ short.list
+ year duplicate$ empty$
+%<apsrev|apsrmp> short.list key field.or.null = or
+ {
+ pop$ ""
+%<apsrmp> "????" *
+ }{
+ control.year #0 > { purify$ #-1 #4 substring$ } 'skip$ if$
+ }
+ if$
+ "(" swap$ *
+ * 'label :=
+}
+
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ "{ll{ }}"
+ control.author.initials {
+ "{ f{ }}" *
+ }{
+ "{ ff{ }}" *
+ } if$
+ "{ jj{ }}" *
+ format.name$ 't :=
+ nameptr #1 >
+ {
+ " " *
+ namesleft #1 = t "others" = and
+ { "zzzzz" * }
+ {
+ t sortify *
+ }
+ if$
+ }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+
+FUNCTION {author.sort}
+{ author empty$
+ { key empty$
+ { "to sort, need author or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {author.editor.sort}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { "to sort, need author, editor, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION {year.sort.key}
+{
+ year
+}
+
+FUNCTION {editor.sort}
+{ editor empty$
+ { key empty$
+ { "to sort, need editor or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+}
+
+INTEGERS { seq.num }
+
+FUNCTION {init.seq}
+{ #0 'seq.num :=}
+
+EXECUTE {init.seq}
+
+FUNCTION {int.to.fix}
+{ "000000000" swap$ int.to.str$ *
+ #-1 #10 substring$
+}
+
+FUNCTION {label.presort}
+{
+ calc.label
+ label sortify
+ " "
+ *
+%<*!aipauth&!apsrmp>
+ seq.num #1 + 'seq.num :=
+ seq.num int.to.fix
+%</!aipauth&!apsrmp>
+%<*aipauth|apsrmp>
+ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.sort
+ 'author.sort
+ if$
+ }
+ if$
+ #1 entry.max$ substring$
+%</aipauth|apsrmp>
+ 'sort.label :=
+ sort.label
+ *
+ " "
+ *
+ title field.or.null sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+FUNCTION {presort.pass}
+{ type$ "control" = 'control.presort 'label.presort if$
+}
+
+ITERATE {presort.pass}
+
+SORT
+
+STRINGS { last.label next.extra }
+
+INTEGERS { last.extra.num number.label }
+
+FUNCTION {initialize.extra.label.stuff}
+{ #0 int.to.chr$ 'last.label :=
+ "" 'next.extra :=
+ #0 'last.extra.num :=
+ #0 'number.label :=
+}
+
+FUNCTION {label.forward}
+{
+ last.label label =
+ { last.extra.num #1 + 'last.extra.num :=
+ last.extra.num int.to.chr$ 'extra.label :=
+ }
+ { "a" chr.to.int$ 'last.extra.num :=
+ "" 'extra.label :=
+ label 'last.label :=
+ }
+ if$
+ number.label #1 + 'number.label :=
+}
+
+FUNCTION {label.reverse}
+{ next.extra "b" =
+ { "a" 'extra.label := }
+ 'skip$
+ if$
+ extra.label 'next.extra :=
+ extra.label
+ duplicate$ empty$
+ 'skip$
+ { "{\natexlab{" swap$ * "}}" * }
+ if$
+ 'extra.label :=
+ label extra.label * 'label :=
+}
+
+EXECUTE {initialize.extra.label.stuff}
+
+FUNCTION {forward.pass}
+{ type$ "control" = 'control.forward 'label.forward if$
+}
+
+ITERATE {forward.pass}
+
+FUNCTION {reverse.pass}
+{ type$ "control" = 'control.reverse 'label.reverse if$
+}
+
+REVERSE {reverse.pass}
+
+FUNCTION {sortkey.sort}
+{ sort.label
+ " "
+ *
+ year.sort.key
+ field.or.null sortify
+ *
+ " "
+ *
+ title field.or.null sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+FUNCTION {bib.sort.pass}
+{ type$ "control" = 'control.sort 'sortkey.sort if$
+}
+
+ITERATE {bib.sort.pass}
+
+SORT
+
+FUNCTION {init.bib.eprint}
+{
+ "\texttt {"
+ pop$
+ "\providecommand \url [0]{\begingroup\@sanitize@url \@url }%" write$ newline$
+ "\providecommand \@url [1]{\endgroup\@href {#1}{" "}}%" bbl.url.prefix swap$ * * write$ newline$
+ "\providecommand " " [0]{URL }%" bbl.url.prefix swap$ * * write$ newline$
+ eprint.command "\providecommand " swap$ * "[0]{\href }%" * write$ newline$
+}
+
+FUNCTION {init.bib.doi}
+{
+ "\providecommand \doibase [0]{" doi.base "}%" * * write$ newline$
+}
+
+FUNCTION {init.bib.hypertex}
+{
+ "\providecommand " noop.command "[0]{\@secondoftwo}%" * * write$ newline$
+ "\providecommand " href.command "[0]{\begingroup \@sanitize@url \@href}%" * * write$ newline$
+ "\providecommand \@href[1]{\@@startlink{#1}\@@href}%" write$ newline$
+ "\providecommand \@@href[1]{\endgroup#1\@@endlink}%" write$ newline$
+ "\providecommand \@sanitize@url [0]{\catcode `\\12\catcode `\$12\catcode `\&12\catcode `\#12\catcode `\^12\catcode `\_12\catcode `\%12\relax}%" write$ newline$
+ "\providecommand \@@startlink[1]{}%" write$ newline$
+ "\providecommand \@@endlink[0]{}%" write$ newline$
+}
+
+FUNCTION {init.bib.namefont}
+{
+ "\providecommand \bibnamefont [1]{#1}%" write$ newline$
+ "\providecommand \bibfnamefont [1]{#1}%" write$ newline$
+ "\providecommand \citenamefont [1]{#1}%" write$ newline$
+}
+
+FUNCTION {init.bib.quote}
+{
+ "\providecommand " bbl.enquote * " [1]{" *
+ "``" "''"
+ "#1" swap$ "}%" * * * * write$ newline$
+}
+
+FUNCTION {init.bib.ay}
+{
+ "\providecommand \natexlab [1]{#1}%"
+ write$ newline$
+}
+
+FUNCTION {init.bib.bibinfo}
+{
+ bibinfo.command "\providecommand " swap$ * " [0]{\@secondoftwo}%" * write$ newline$
+ bibfield.command "\providecommand " swap$ * " [0]{\@secondoftwo}%" * write$ newline$
+}
+
+FUNCTION {init.bib.lang}
+{
+ "\providecommand \selectlanguage [0]{\@gobble}%" write$ newline$
+}
+
+FUNCTION {init.bib.endbibitem}
+{
+ "\providecommand " bbl.open * "[0]{}%" * write$ newline$
+ "\providecommand \bibitemStop [0]{}%" write$ newline$
+ "\providecommand \bibitemNoStop [0]{.\EOS\space}%" write$ newline$
+ "\providecommand \EOS [0]{\spacefactor3000\relax}%" write$ newline$
+}
+
+FUNCTION {init.bib.translation}
+{
+ "\providecommand \translation [1]{[#1]}%" write$ newline$
+}
+
+FUNCTION {warn.bib}
+{
+}
+
+FUNCTION {init.bib}
+{
+ warn.bib
+ "\makeatletter" write$ newline$
+ "\providecommand \@ifxundefined [1]{%" write$ newline$
+ " \@ifx{#1\undefined}" write$ newline$
+ "}%" write$ newline$
+ "\providecommand \@ifnum [1]{%" write$ newline$
+ " \ifnum #1\expandafter \@firstoftwo" write$ newline$
+ " \else \expandafter \@secondoftwo" write$ newline$
+ " \fi" write$ newline$
+ "}%" write$ newline$
+ "\providecommand \@ifx [1]{%" write$ newline$
+ " \ifx #1\expandafter \@firstoftwo" write$ newline$
+ " \else \expandafter \@secondoftwo" write$ newline$
+ " \fi" write$ newline$
+ "}%" write$ newline$
+ init.bib.ay
+ init.bib.quote
+ init.bib.namefont
+ init.bib.hypertex
+ init.bib.eprint
+ init.bib.doi
+ init.bib.lang
+ init.bib.bibinfo
+ init.bib.translation
+ init.bib.endbibitem
+ "\providecommand " bbl.shut * " [1]{\csname bibitem#1\endcsname}%" * write$ newline$
+ "\let\auto@bib@innerbib\@empty" write$ newline$
+ "%</preamble>" write$
+}
+
+FUNCTION {begin.bib}
+{
+ id.bst diagn.cmntlog
+ control.bib
+ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{"
+ number.label int.to.str$
+ * "}%" *
+ write$ newline$
+ init.bib
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}%"
+ write$ newline$
+}
+
+EXECUTE {end.bib}
+
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</aipauth|aipnum|apsrev|apsrmp>
+% \end{macrocode}
+%
+% \endinput
+%
+% \Finale
diff --git a/Master/texmf-dist/source/latex/revtex/revtex4-1.dtx b/Master/texmf-dist/source/latex/revtex4-1/revtex4-1.dtx
index 92df750df38..9fce075351e 100644
--- a/Master/texmf-dist/source/latex/revtex/revtex4-1.dtx
+++ b/Master/texmf-dist/source/latex/revtex4-1/revtex4-1.dtx
@@ -121,16 +121,14 @@ See the REVTeX 4 README file for restrictions and more information.
%</ignore>
% \fi
%
-% \GetFileInfo{revtex4-1.dtx}\CheckSum{7177}
+% \GetFileInfo{revtex4-1.dtx}
%
% \iffalse ltxdoc klootch
%<*package>
%%% @LaTeX-file{
%%% filename = "revtex4-1.dtx",
-%%% version = "4.1r",
-%%% date = "2010/07/25",
-%%% time = "20:33:00 UT-8",
-%%% checksum = "7177",
+%%% version = "4.1s",
+%%% date = "2020/09/30",
%%% author = "Arthur Ogawa (mailto:arthur_ogawa at sbcglobal.net),
%%% commissioned by the American Physical Society.
%%% ",
@@ -148,7 +146,6 @@ See the REVTeX 4 README file for restrictions and more information.
%%% keywords = "latex, page grid, main vertical list",
%%% supported = "yes",
%%% abstract = "package to change page grid, MVL",
-%%% docstring = "The checksum field above generated by ltxdoc",
%%% }
%</package>
% \fi
@@ -222,7 +219,7 @@ See the REVTeX 4 README file for restrictions and more information.
%</doc>
%<*!package&!options>
%<version>
- [2010/07/25/20:33:00 4.1r (http://publish.aps.org/revtex4/ for documentation)]% \fileversion
+ [2020/09/30 4.1s (http://publish.aps.org/revtex4/ for documentation)]% \fileversion
%</!package&!options>
% \end{macrocode}
% The current class name is remembered in \cmd\class@name.
@@ -257,9 +254,10 @@ See the REVTeX 4 README file for restrictions and more information.
\RequirePackage{ltxdocext}%
\let\url\undefined
\RequirePackage[colorlinks=true,linkcolor=blue]{hyperref}%
-\expandafter\ifx\csname package@font\endcsname\@undefined\else
- \expandafter\RequirePackage\expandafter{\csname package@font\endcsname}%
-\fi
+\makeatletter
+\@ifundefined{package@font}{}%
+ {\expandafter\RequirePackage\expandafter{\csname package@font\endcsname}}
+\makeatother
% \end{macrocode}
% We ask for the usual indices and glossaries.
% \begin{macrocode}
@@ -282,7 +280,7 @@ See the REVTeX 4 README file for restrictions and more information.
% \subsection{The Frontmatter File}
% As promised above, here is the contents of the frontmatter file.
% \begin{macrocode}
-\begin{filecontents*}{00readme.tex}
+\begin{filecontents*}[overwrite]{00readme.tex}
\title{%
The \classname{revtex4-1} document class of the American Physical Society%
\protect\thanks{Work under hire to The American Physical Society.}%
@@ -445,6 +443,7 @@ The file \file{template.aps} is a boilerplate file.
\changes{4.1q}{2010/04/01}{(AO, 586) When .bbl is pasted into the document, prevent automatic bibliography inclusion.}%
\changes{4.1q}{2010/04/13}{(AO, 588) Only write \revtex-specific BibTeX .bib data if the .bst style is set by REVTeX.}%
\changes{4.1r}{2010/06/22}{(AO, 595) Provide \cs{lovname} along with other List of Videos definitions.}%
+\changes{4.1s}{2020/09/19}{(PHO) Adapt patches to \cs{document} and \cs{enddocument} to the 2020-10-01 \LaTeX{} release.}%
\end{filecontents*}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/revtex4/ltxdocext.dtx b/Master/texmf-dist/source/latex/revtex4/ltxdocext.dtx
index ee9d71c9c04..67b0c9aa303 100644
--- a/Master/texmf-dist/source/latex/revtex4/ltxdocext.dtx
+++ b/Master/texmf-dist/source/latex/revtex4/ltxdocext.dtx
@@ -10,7 +10,6 @@
% For the documentation and more detailed instructions for
% installation, typeset this document with \LaTeX.
% \fi
-% \CheckSum{938}
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
@@ -30,10 +29,8 @@
% \iffalse ltxdoc klootch
%%% @LaTeX-file{
%%% filename = "ltxdocext.dtx",
-%%% version = "0.0a0",
-%%% date = "1999/06/04",
-%%% time = "11:23:00 GMT",
-%%% checksum = "929",
+%%% version = "0.1",
+%%% date = "2020/09/30",
%%% author = "Arthur Ogawa (mailto:ogawa@teleport.com)",
%%% copyright = "Copyright (C) 1999 Arthur Ogawa,
%%% all rights reserved. Copying of this file is
@@ -51,7 +48,6 @@
%%% keywords = "latex, ltxdoc",
%%% supported = "yes",
%%% abstract = "extensions to the ltxdoc class",
-%%% docstring = "The checksum field above generated by ltxdoc",
%%% }
% \fi
%
@@ -134,7 +130,7 @@
% consistently in all generated files and in the
% typeset documentation.
% \begin{macrocode}
- [1999/06/04 0.0a0 ltxdoc extensions package]% \fileversion
+ [2020/09/30 0.1 ltxdoc extensions package]% \fileversion
% \end{macrocode}
%
%
@@ -173,7 +169,7 @@
\begin{filecontents}{ltxdocext.sty}
% Stub version of ltxdocext.sty
\end{filecontents}
-\begin{filecontents}{acrofont.sty}
+\begin{filecontents}[overwrite]{acrofont.sty}
% Stub version of acrofont.sty
\end{filecontents}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/revtex4/ltxgrid.dtx b/Master/texmf-dist/source/latex/revtex4/ltxgrid.dtx
index ab0209ed098..c2ab9e24435 100644
--- a/Master/texmf-dist/source/latex/revtex4/ltxgrid.dtx
+++ b/Master/texmf-dist/source/latex/revtex4/ltxgrid.dtx
@@ -10,17 +10,16 @@
% For the documentation and more detailed instructions for
% installation, typeset this document with \LaTeX.
% \fi
-% \GetFileInfo{ltxgrid.dtx}\CheckSum{4234}
+% \GetFileInfo{ltxgrid.dtx}
%
% \iffalse ltxdoc klootch
%<*ltxgrid>
%%% @LaTeX-file{
%%% filename = "ltxgrid.dtx",
-%%% version = "1.0rc5",
-%%% date = "2001/07/26",
-%%% time = "12:23:00 GMT+8",
-%%% checksum = "4234",
+%%% version = "1.0d",
+%%% date = "2020/09/30",
%%% author = "Arthur Ogawa (mailto:ogawa@teleport.com),
+%%% Phelype Oleinik (mailto:phelype.oleinik at latex-project.org),
%%% commissioned by the American Physical Society.
%%% ",
%%% copyright = "Copyright (C) 1999, 2000 Arthur Ogawa,
@@ -37,7 +36,6 @@
%%% keywords = "latex, page grid, main vertical list",
%%% supported = "yes",
%%% abstract = "package to change page grid, MVL",
-%%% docstring = "The checksum field above generated by ltxdoc",
%%% }
%</ltxgrid>
% \fi
@@ -121,7 +119,7 @@
% typeset documentation.
% \begin{macrocode}
%<*doc|ltxgrid>
- [2001/07/26 1.0rc5 page grid package]% \fileversion
+ [2020/09/30 1.0d page grid package]% \fileversion
%</doc|ltxgrid>
% \end{macrocode}
%
@@ -154,14 +152,10 @@
\documentclass{ltxdoc}
\RequirePackage{ltxdocext}%
\RequirePackage[colorlinks=true,linkcolor=blue]{hyperref}%
-\ifx\package@font\@undefined\else
- \expandafter\expandafter
- \expandafter\RequirePackage
- \expandafter\expandafter
- \expandafter{%
- \csname package@font\endcsname
- }%
-\fi
+\makeatletter
+\@ifundefined{package@font}{}%
+ {\expandafter\RequirePackage\expandafter{\csname package@font\endcsname}}
+\makeatother
\CodelineIndex\EnableCrossrefs
% \end{macrocode}
%
@@ -4037,12 +4031,22 @@ in your filesystem where they will be found by \LaTeX.
% FIXME: it should be the job of the page grid to determine the procedure to execute at
% the start of the job. Make this a hook.
% \begin{macrocode}
-\prepdef\@begindocumenthook{%
- \open@column@one\@ne
- \set@colht
- \@floatplacement
- \@dblfloatplacement
-}%
+\rvtx@ifformat@geq{2020-10-01}%
+ {%
+ \AddToHook{begindocument}{%
+ \open@column@one\@ne
+ \set@colht
+ \@floatplacement
+ \@dblfloatplacement
+ }%
+ }{%
+ \prepdef\@begindocumenthook{%
+ \open@column@one\@ne
+ \set@colht
+ \@floatplacement
+ \@dblfloatplacement
+ }%
+ }
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex/revtex4/ltxutil.dtx b/Master/texmf-dist/source/latex/revtex4/ltxutil.dtx
index 5553e3a863e..02947a6a944 100644
--- a/Master/texmf-dist/source/latex/revtex4/ltxutil.dtx
+++ b/Master/texmf-dist/source/latex/revtex4/ltxutil.dtx
@@ -10,17 +10,16 @@
% For the documentation and more detailed instructions for
% installation, typeset this document with \LaTeX.
% \fi
-% \GetFileInfo{ltxutil.dtx}\CheckSum{3641}
+% \GetFileInfo{ltxutil.dtx}
%
% \iffalse ltxdoc klootch
%<*ltxutil>
%%% @LaTeX-file{
%%% filename = "ltxutil.dtx",
-%%% version = "1.0rc5b",
-%%% date = "2001/07/31",
-%%% time = "12:23:00 GMT+8",
-%%% checksum = "3641",
+%%% version = "1.0d",
+%%% date = "2020/09/30",
%%% author = "Arthur Ogawa (mailto:ogawa@teleport.com),
+%%% Phelype Oleinik (mailto:phelype.oleinik at latex-project.org),
%%% commissioned by the American Physical Society.
%%% ",
%%% copyright = "Copyright (C) 1999 Arthur Ogawa,
@@ -37,7 +36,6 @@
%%% keywords = "latex, utility, kernel",
%%% supported = "yes",
%%% abstract = "package to add utilties to LaTeX",
-%%% docstring = "The checksum field above generated by ltxdoc",
%%% }
%</ltxutil>
% \fi
@@ -121,7 +119,7 @@
% typeset documentation.
% \begin{macrocode}
%<*doc|ltxutil>
- [2001/07/31 1.0rc5b utilities package]% \fileversion
+ [2020/09/30 1.0d utilities package]% \fileversion
%</doc|ltxutil>
% \end{macrocode}
%
@@ -155,9 +153,14 @@
\RequirePackage{ltxdocext}%
\let\url\undefined
\RequirePackage[colorlinks=true,linkcolor=blue]{hyperref}%
-\expandafter\ifx\csname package@font\endcsname\@undefined\else
- \expandafter\RequirePackage\expandafter{\csname package@font\endcsname}%
-\fi
+\pdfstringdefDisableCommands{%
+ \let\file\relax
+ \let\sc\relax
+}
+\makeatletter
+\@ifundefined{package@font}{}%
+ {\expandafter\RequirePackage\expandafter{\csname package@font\endcsname}}
+\makeatother
\CodelineIndex\EnableCrossrefs
% \end{macrocode}
%
@@ -679,6 +682,22 @@ in your filesystem where they will be found by \LaTeX.
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\rvtx@ifformat@geq}
+% Some changes in the \LaTeX{} kernel requires us to conditionally
+% define some macros depending on the version of the kernel.
+% \cmd\rvtx@ifformat@geq{} will check if the release date of the
+% currently-running \LaTeXe{} kernel is greater or equal to the
+% argument (the argument should be in the format \texttt{yyyy-mm-dd}).
+% \changes{4.2d}{2020/09/17}{(PHO) Add \cs{rvtx@ifformat@geq} (from 4.2).}%
+% \begin{macrocode}
+\ifx\IfFormatAtLeastTF\undefined
+ \def\rvtx@ifformat@geq{\@ifl@t@r\fmtversion}%
+\else
+ \let\rvtx@ifformat@geq\IfFormatAtLeastTF
+\fi
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@boolean}
% \begin{macro}{\@boole@def}
% In order to define \cmd\@ifx, we first must create the
@@ -820,27 +839,42 @@ in your filesystem where they will be found by \LaTeX.
% for deferring the decision about the page grid until \cmd\AtBeginDocument\ time.
% We fix things by prepending a hook at the very beginning of \cmd\document.
%
-% The price we pay for this facility is to depend on the stability of this part
-% of \LaTeX's kernel code (the first token of \cmd\document),
-% which could change, you see. But considering that \LaTeX\ is
-% at this point essentially stagnant once more, we risk it.
-%
% \begin{macro}{\document}
% We begin by installing hooks into \cmd\document\ that
% we will manage ourselves.
-% First, we do as \cmd\document\ does: end the group
-% begun by \cmd\begin. Last, we conclude our shenanigans by absorbing
+%
+% The 2020-10-01 \LaTeX{} release got a new hook management system and
+% several new hooks (several previously provided by \textsf{etoolbox}).
+% The one we want here is \texttt{begindocument/before}, the first thing
+% executed by \cmd\document{}, right after ending the group started by
+% \cmd\begin{}.
+%
+% Thus, if the \LaTeX{} kernel date is 2020-10-01 we just add to that
+% hook, otherwise resort to the old method, patching \cmd\document:
+% end the group started by \cmd\begin, apply our hook, and
+% conclude our shenanigans by absorbing
% the first token of the expansion of \cmd\document, which
-% we assume to be \cmd\endgroup.
-% \begin{macrocode}
-\prepdef\document{%
- \endgroup
- \init@documenthook
- \set@typesize@hook
- \normalsize
- \set@pica@hook
- \true@sw{}%
-}%
+% we assume to be \cmd\endgroup{} (true until the aforementioned release).
+% \changes{4.2d}{2020/09/17}{(PHO) Use \LaTeX's hook management system, if possible (from 4.2).}%
+% \begin{macrocode}
+\rvtx@ifformat@geq{2020-10-01}%
+ {%
+ \AddToHook{begindocument/before}{%
+ \init@documenthook
+ \set@typesize@hook
+ \normalsize
+ \set@pica@hook
+ }%
+ }{%
+ \prepdef\document{%
+ \endgroup
+ \init@documenthook
+ \set@typesize@hook
+ \normalsize
+ \set@pica@hook
+ \true@sw{}%
+ }%
+ }
% \end{macrocode}
% \end{macro}
%
@@ -890,7 +924,15 @@ in your filesystem where they will be found by \LaTeX.
% We will do this to ensure that the \cmd\@mainaux\ stream is not closed until
% the last page of the job is shipped out, and that can only be done by coordinating
% with the output routine.
+%
+% \changes{4.2d}{2020/09/17}{(PHO) Only redefine \cs{enddocument} in older versions.}%
+% This approach, however, will only be done for older versions of the
+% \LaTeX{} kernel:
% \begin{macrocode}
+\rvtx@ifformat@geq{2020-10-01}{%
+ % <definitions for newer LaTeX later>
+}{%
+ % <definitions for older LaTeX>
\def\enddocument{%
\@enddocumenthook
\@checkend{document}%
@@ -924,7 +966,7 @@ in your filesystem where they will be found by \LaTeX.
\@if@sw\if@tempswa\fi{%
\@latex@warning@no@line{%
Label(s) may have changed.
- Rerun to get cross-references right
+ Rerun to get cross-references right%
}%
}{}%
}{%
@@ -932,11 +974,88 @@ in your filesystem where they will be found by \LaTeX.
}%
}{}%
}%
+}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
+% \changes{4.2d}{2020/09/17}{(PHO) Patch \cs{enddocument} at runtime in newer versions.}%
+% \begin{macro}{\rvtx@enddocument@patch}
+% For newer \LaTeX{} we'll try to be a bit more future-proof
+% (no miracle though). The code for \cmd\enddocument{}
+% (in pre-2020-10-01 \LaTeX) is roughly:
+% \begin{verbatim}
+% \def\enddocument{%
+% <hooks and bookkeeping>
+% \clearpage
+% <read main .aux and final checks>
+% \@@end
+% }
+% \end{verbatim}
+% and the patches above replace the \cmd\clearpage{} by its own
+% \cmd\clear@document, and \verb|<read main .aux and final checks>| by
+% \cmd\do@check@aux, which it can later control the timing.
+%
+% Now we will apply the same changes, but this time without redefining
+% \cmd\enddocument: we will instead replace tokens on-the-fly, when
+% \cmd\enddocument{} is expanded. This will grant us a slightly safer
+% approach that won't depend so much on the internals of
+% \cmd\enddocument.
+%
+% This entire patch should work with the previous definition of
+% \cmd\enddocument{} as well (except it cannot be used in the hook),
+% but for now leave previous versions untouched.
+%
+% The entire patching will reside in the \texttt{enddocument} hook:
+% \begin{macrocode}
+\rvtx@ifformat@geq{2020-10-01}{%
+ \AddToHook{enddocument}{\rvtx@enddocument@patch{}}%
+}{}
+% \end{macrocode}
+%
+% This macro will be executed after \cmd\enddocument{} has expanded,
+% so all its tokens are now exposed. Here we will assume that
+% \cmd\enddocument{} contains the tokens \verb|\@checkend{document}|
+% and \cmd\endgroup, and use them as delimiters:
+% \begin{macrocode}
+\protected\long\def\rvtx@enddocument@patch#1#2\@checkend#3{%
+ \begingroup
+ \edef\x{\detokenize{#3}}%
+ \edef\y{\detokenize{document}}%
+ \expandafter\endgroup
+ \ifx\x\y
+ \expandafter\rvtx@enddocument@patch@end
+ \else
+ \expandafter\rvtx@enddocument@patch@more
+ \fi
+ {#1#2}{#3}}
+\def\rvtx@enddocument@patch@more#1#2{%
+ \rvtx@enddocument@patch{#1\@checkend{#2}}}
+% \end{macrocode}
+%
+% When the \verb|\@checkend{document}| is reached, use \cmd\clearpage{}
+% and \cmd\enddocument{} as delimiters for the
+% \verb|<read main .aux and final checks>| part, and save it in
+% \cmd\do@check@aux{}:
+% \begin{macrocode}
+\long\def\rvtx@enddocument@patch@end#1#2\clearpage#3\endgroup{%
+ \def\do@check@aux{#3\endgroup}%
+% \end{macrocode}
+% Then execute the code consumed in the previous step:
+% \begin{macrocode}
+ #1%
+ \@checkend{#2}%
+% \end{macrocode}
+% Do \cmd\clear@document{} instead of \cmd\clearpage{} and
+% \cmd\check@aux{} instead of the code grabbed.
+% \begin{macrocode}
+ \clear@document
+ \check@aux}
+\def\check@aux{\do@check@aux}%
+\def\clear@document{\clearpage}%
+% \end{macrocode}
+% \end{macro}
%
% \subsection{Type Tools}%
%
diff --git a/Master/texmf-dist/source/latex/revtex4/revtex4-bst.dtx b/Master/texmf-dist/source/latex/revtex4/revtex4-bst.dtx
new file mode 100644
index 00000000000..63d709e1f98
--- /dev/null
+++ b/Master/texmf-dist/source/latex/revtex4/revtex4-bst.dtx
@@ -0,0 +1,2487 @@
+% \iffalse meta-comment balanced on line 122
+% revtex-bst.dtx: Package to extract .bst files for RevTeX
+% Copyright (c) 2020 American Physical Society.
+% https://journals.aps.org/revtex/
+% mailto:revtex@aps.org
+%
+% Disclaimer
+% This file is distributed WITHOUT ANY WARRANTY;
+% without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+% License
+% You may distribute this file under the conditions of the
+% LaTeX Project Public License 1.3c or later
+% (http://www.latex-project.org/lppl.txt).
+% ReadMe
+% For the documentation and more detailed instructions for
+% installation, typeset this document with \LaTeX.
+% Maintenance Status
+% This work has the LPPL maintenance status "maintained";
+% Current Maintainer of this work is Phelype Oleinik.
+%
+% This work consists of the main source file revtex4-bst.dtx
+% and the derived files
+% apsrev.bst, apsrmp.bst
+% Distribution:
+% CTAN:macros/latex/contrib/revtex4/
+%
+% Unpacking:
+% tex revtex-bst.dtx
+%
+% Installation:
+% TDS:bibtex/bst/revtex/
+%
+%<*ignore>
+\begingroup
+ \def\x{LaTeX2e}%
+\expandafter\endgroup
+\ifcase
+ 0\expandafter\ifx\csname processbatchFile\endcsname\relax\else1\fi\ifx\fmtname\x\else 1\fi
+ \relax
+\else
+ \csname fi\endcsname
+%</ignore>
+%<*install>
+%% This file will generate documentation and runtime files
+%% from revtex4-2.dtx when run through TeX.
+\input docstrip
+\nopreamble
+\edef\defaultpostamble{%
+ \MetaPrefix\space End of customized bst file^^J%
+ \MetaPrefix ^^J%
+ \MetaPrefix\space End of file `\outFileName'.%
+}
+\askforoverwritefalse
+\keepsilent
+\generate{%
+ \file{apsrev.bst}{\from{revtex4-bst.dtx}{apsrev}}%
+ \file{apsrmp.bst}{\from{revtex4-bst.dtx}{apsrmp}}%
+}%
+\ifToplevel{
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation, please move}
+\Msg{* *.bst }
+\Msg{* into a directory searched by TeX;}
+\Msg{* in a TDS-compliant installation:}
+\Msg{* texmf/bibtex/bst/revtex4/.}
+\Msg{*}
+\Msg{* Happy BibTeXing}
+\Msg{***********************************************************}
+}
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+% \fi
+%
+% \GetFileInfo{revtex-bst.dtx}
+%
+% \StopEventually{}
+% \iffalse ltxdoc klootch
+%<*package>
+%%% @LaTeX-file{
+%%% filename = "revtex-bst.dtx",
+%%% version = "4.0a",
+%%% date = "2020/10/06",
+%%% author = "Phelype Oleinik (mailto: phelype.oleinik at latex-project.org),
+%%% commissioned by the American Physical Society.
+%%% ",
+%%% copyright = "Copyright (C) 2020 American Physical Society
+%%% distributed under the terms of the
+%%% LaTeX Project Public License 1.3c, see
+%%% ftp://ctan.tug.org/macros/latex/base/lppl.txt
+%%% ",
+%%% email = "mailto colon revtex at aps.org",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "",
+%%% supported = "yes",
+%%% abstract = "",
+%%% }
+%</package>
+% \fi
+%
+% \subsection{Bill of Materials}
+%
+% Following is a list of the files in this distribution arranged
+% according to provenance.
+%
+% \subsubsection{Primary Source}%
+% One single file generates all.
+%\begin{verbatim}
+%revtex-bst.dtx
+%\end{verbatim}
+%
+% \subsubsection{Generated by \texttt{tex revtex4-bst.dtx}}%
+% Typesetting ths file under \TeX\ itself runs the installer,
+% which generates the bibliography style files.
+%\begin{verbatim}
+%apsrev.bst, apsrmp.bst
+%\end{verbatim}
+%
+% \section{Code common to all modules}%
+%
+% \begin{macrocode}
+%<*apsrev|apsrmp>
+%%
+%<apsrev>%% This is file `apsrev.bst',
+%<apsrmp>%% This is file `apsrmp.bst',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%<*apsrev>
+%% merlin.mbs (with options: `head,ay,nat,seq-no,nm-init,ed-au,nmlm,x10,x0,m10,m0,nmft,nmft-def,fnm-def,nmfted,lab,lab-def,keyxyr,yr-par,note-yr,tit-it,jtit-x,jttl-rm,thtit-x,trtit-x,vol-bf,vnum-x,volp-com,jpg-1,num-xser,jnm-x,pub-date,pre-pub,isbn,issn,edby,blk-com,pp,ed,abr,ednx,ord,jabr,revdata,eprint,url,url-blk,misc-simple,bibinfo,nfss,{}')
+%% physjour.mbs (with options: `ay,nat,seq-no,nm-init,ed-au,nmlm,x10,x0,m10,m0,nmft,nmft-def,fnm-def,nmfted,lab,lab-def,keyxyr,yr-par,note-yr,tit-it,jtit-x,jttl-rm,thtit-x,trtit-x,vol-bf,vnum-x,volp-com,jpg-1,num-xser,jnm-x,pub-date,pre-pub,isbn,issn,edby,blk-com,pp,ed,abr,ednx,ord,jabr,revdata,eprint,url,url-blk,misc-simple,bibinfo,nfss,{}')
+%% geojour.mbs (with options: `ay,nat,seq-no,nm-init,ed-au,nmlm,x10,x0,m10,m0,nmft,nmft-def,fnm-def,nmfted,lab,lab-def,keyxyr,yr-par,note-yr,tit-it,jtit-x,jttl-rm,thtit-x,trtit-x,vol-bf,vnum-x,volp-com,jpg-1,num-xser,jnm-x,pub-date,pre-pub,isbn,issn,edby,blk-com,pp,ed,abr,ednx,ord,jabr,revdata,eprint,url,url-blk,misc-simple,bibinfo,nfss,{}')
+%% photjour.mbs (with options: `ay,nat,seq-no,nm-init,ed-au,nmlm,x10,x0,m10,m0,nmft,nmft-def,fnm-def,nmfted,lab,lab-def,keyxyr,yr-par,note-yr,tit-it,jtit-x,jttl-rm,thtit-x,trtit-x,vol-bf,vnum-x,volp-com,jpg-1,num-xser,jnm-x,pub-date,pre-pub,isbn,issn,edby,blk-com,pp,ed,abr,ednx,ord,jabr,revdata,eprint,url,url-blk,misc-simple,bibinfo,nfss,{}')
+%% merlin.mbs (with options: `tail,ay,nat,seq-no,nm-init,ed-au,nmlm,x10,x0,m10,m0,nmft,nmft-def,fnm-def,nmfted,lab,lab-def,keyxyr,yr-par,note-yr,tit-it,jtit-x,jttl-rm,thtit-x,trtit-x,vol-bf,vnum-x,volp-com,jpg-1,num-xser,jnm-x,pub-date,pre-pub,isbn,issn,edby,blk-com,pp,ed,abr,ednx,ord,jabr,revdata,eprint,url,url-blk,misc-simple,bibinfo,nfss,{}')
+%</apsrev>
+%<*apsrmp>
+%% merlin.mbs (with options: `head,ay,nat,vonx,nm-rev1,jnrlst,nmlm,x10,x2,m10,m2,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,keyxyr,dt-beg,xmth,yr-com,note-yr,jtit-x,jttl-rm,trtit-b,vol-bf,volp-com,jpg-1,pp-last,num-xser,jnm-x,pub-par,pre-pub,isbn,issn,edpar,edby,blk-com,pp,ed,xedn,jabr,and-com,etal-it,revdata,eprint,url,url-blk,pub-over-eprint,bibinfo,nfss,{}')
+%% physjour.mbs (with options: `ay,nat,vonx,nm-rev1,jnrlst,nmlm,x10,x2,m10,m2,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,keyxyr,dt-beg,xmth,yr-com,note-yr,jtit-x,jttl-rm,trtit-b,vol-bf,volp-com,jpg-1,pp-last,num-xser,jnm-x,pub-par,pre-pub,isbn,issn,edpar,edby,blk-com,pp,ed,xedn,jabr,and-com,etal-it,revdata,eprint,url,url-blk,pub-over-eprint,bibinfo,nfss,{}')
+%% geojour.mbs (with options: `ay,nat,vonx,nm-rev1,jnrlst,nmlm,x10,x2,m10,m2,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,keyxyr,dt-beg,xmth,yr-com,note-yr,jtit-x,jttl-rm,trtit-b,vol-bf,volp-com,jpg-1,pp-last,num-xser,jnm-x,pub-par,pre-pub,isbn,issn,edpar,edby,blk-com,pp,ed,xedn,jabr,and-com,etal-it,revdata,eprint,url,url-blk,pub-over-eprint,bibinfo,nfss,{}')
+%% photjour.mbs (with options: `ay,nat,vonx,nm-rev1,jnrlst,nmlm,x10,x2,m10,m2,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,keyxyr,dt-beg,xmth,yr-com,note-yr,jtit-x,jttl-rm,trtit-b,vol-bf,volp-com,jpg-1,pp-last,num-xser,jnm-x,pub-par,pre-pub,isbn,issn,edpar,edby,blk-com,pp,ed,xedn,jabr,and-com,etal-it,revdata,eprint,url,url-blk,pub-over-eprint,bibinfo,nfss,{}')
+%% merlin.mbs (with options: `tail,ay,nat,vonx,nm-rev1,jnrlst,nmlm,x10,x2,m10,m2,nmft,nmft-def,fnm-def,nmfted,nmand-rm,lab,lab-def,keyxyr,dt-beg,xmth,yr-com,note-yr,jtit-x,jttl-rm,trtit-b,vol-bf,volp-com,jpg-1,pp-last,num-xser,jnm-x,pub-par,pre-pub,isbn,issn,edpar,edby,blk-com,pp,ed,xedn,jabr,and-com,etal-it,revdata,eprint,url,url-blk,pub-over-eprint,bibinfo,nfss,{}')
+%</apsrmp>
+%% ----------------------------------------
+%<apsrev>%% *** REVTeX-compatible apsrev.bst 1702 ***
+%<apsrmp>%% *** REVTeX-compatible apsrmp.bst 1702 ***
+%%
+%% Copyright 1994-2000 Patrick W Daly
+ % ===============================================================
+ % IMPORTANT NOTICE:
+ % This bibliographic style (bst) file has been generated from one or
+ % more master bibliographic style (mbs) files, listed above.
+ %
+ % This generated file can be redistributed and/or modified under the terms
+ % of the LaTeX Project Public License Distributed from CTAN
+ % archives in directory macros/latex/base/lppl.txt; either
+ % version 1 of the License, or any later version.
+ % ===============================================================
+ % Name and version information of the main mbs file:
+ % \ProvidesFile{merlin.mbs}[2000/05/04 4.01 (PWD, AO, DPC)]
+ % For use with BibTeX version 0.99a or later
+ %-------------------------------------------------------------------
+ % This bibliography style file is intended for texts in ENGLISH
+ % This is an author-year citation style bibliography. As such, it is
+ % non-standard LaTeX, and requires a special package file to function properly.
+ % Such a package is natbib.sty by Patrick W. Daly
+ % The form of the \bibitem entries is
+ % \bibitem[Jones et al.(1990)]{key}...
+ % \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}...
+ % The essential feature is that the label (the part in brackets) consists
+ % of the author names, as they should appear in the citation, with the year
+ % in parentheses following. There must be no space before the opening
+ % parenthesis!
+ % With natbib v5.3, a full list of authors may also follow the year.
+ % In natbib.sty, it is possible to define the type of enclosures that is
+ % really wanted (brackets or parentheses), but in either case, there must
+ % be parentheses in the label.
+ % The \cite command functions as follows:
+ % \citet{key} ==>> Jones et al. (1990)
+ % \citet*{key} ==>> Jones, Baker, and Smith (1990)
+ % \citep{key} ==>> (Jones et al., 1990)
+ % \citep*{key} ==>> (Jones, Baker, and Smith, 1990)
+ % \citep[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2)
+ % \citep[e.g.][]{key} ==>> (e.g. Jones et al., 1990)
+ % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32)
+ % \citeauthor{key} ==>> Jones et al.
+ % \citeauthor*{key} ==>> Jones, Baker, and Smith
+ % \citeyear{key} ==>> 1990
+ %---------------------------------------------------------------------
+%</apsrev|apsrmp>
+%
+% \subsection{The Frontmatter File}
+% As promised above, here is the contents of the frontmatter file.
+% This file doesn't have any documentation, so just stop early.
+% \begin{macrocode}
+%<*ignore>
+\stop
+\changes{4.0a}{2020/10/06}{(PHO) Initial version---Put all .bst files in a single .dtx}
+%</ignore>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*apsrev|apsrmp>
+% \end{macrocode}
+%
+% \begin{macrocode}
+
+ENTRY
+ { address
+ archive
+ author
+ booktitle
+ chapter
+ collaboration
+ edition
+ editor
+ eid
+ eprint
+ howpublished
+ institution
+ isbn
+ issn
+ journal
+ key
+ month
+ note
+ number
+ numpages
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ type
+ url
+ volume
+ year
+ }
+ {}
+ { label extra.label sort.label short.list }
+INTEGERS { output.state before.all mid.sentence after.sentence after.block }
+FUNCTION {init.state.consts}
+{ #0 'before.all :=
+ #1 'mid.sentence :=
+ #2 'after.sentence :=
+ #3 'after.block :=
+}
+STRINGS { s t}
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { add.period$ write$
+ newline$
+ "\newblock " write$
+ }
+ { output.state before.all =
+ 'write$
+ { add.period$ " " * write$ }
+ if$
+ }
+ if$
+ mid.sentence 'output.state :=
+ }
+ if$
+ s
+}
+FUNCTION {output}
+{ duplicate$ empty$
+ 'pop$
+ 'output.nonnull
+ if$
+}
+FUNCTION {output.check}
+{ 't :=
+ duplicate$ empty$
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ 'output.nonnull
+ if$
+}
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+FUNCTION {new.sentence}
+{ output.state after.block =
+ 'skip$
+ { output.state before.all =
+ 'skip$
+ { after.sentence 'output.state := }
+ if$
+ }
+ if$
+}
+FUNCTION {add.blank}
+{ " " * before.all 'output.state :=
+}
+
+FUNCTION {date.block}
+{
+ skip$
+}
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\emph{" swap$ * "}" * }
+ if$
+}
+FUNCTION {bolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\textbf{" swap$ * "}" * }
+ if$
+}
+FUNCTION {bib.name.font}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\bibnamefont{" swap$ * "}" * }
+ if$
+}
+FUNCTION {bib.fname.font}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\bibfnamefont{" swap$ * "}" * }
+ if$
+}
+FUNCTION {cite.name.font}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "\citenamefont{" swap$ * "}" * }
+ if$
+}
+FUNCTION {tie.or.space.prefix}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$
+}
+
+FUNCTION {capitalize}
+{ "u" change.case$ "t" change.case$ }
+
+FUNCTION {space.word}
+{ " " swap$ * " " * }
+ % Here are the language-specific definitions for explicit words.
+ % Each function has a name bbl.xxx where xxx is the English word.
+ % The language selected here is ENGLISH
+FUNCTION {bbl.and}
+{ "and"}
+
+FUNCTION {bbl.etal}
+{ "et~al." }
+
+FUNCTION {bbl.editors}
+{ "eds." }
+
+FUNCTION {bbl.editor}
+{ "ed." }
+
+FUNCTION {bbl.edby}
+{ "edited by" }
+
+FUNCTION {bbl.edition}
+%<apsrev>{ "ed." }
+%<apsrmp>{ "edition" }
+
+FUNCTION {bbl.volume}
+%<apsrev>{ "vol." }
+%<apsrmp>{ "volume" }
+
+FUNCTION {bbl.of}
+{ "of" }
+
+FUNCTION {bbl.number}
+%<apsrev>{ "no." }
+%<apsrmp>{ "number" }
+
+FUNCTION {bbl.nr}
+{ "no." }
+
+FUNCTION {bbl.in}
+{ "in" }
+
+FUNCTION {bbl.pages}
+{ "pp." }
+
+FUNCTION {bbl.page}
+{ "p." }
+
+FUNCTION {bbl.eidpp}
+{ "pages" }
+
+FUNCTION {bbl.chapter}
+%<apsrev>{ "chap." }
+%<apsrmp>{ "chapter" }
+
+FUNCTION {bbl.techrep}
+%<apsrev>{ "Tech. Rep." }
+%<apsrmp>{ "Technical Report" }
+
+FUNCTION {bbl.mthesis}
+{ "Master's thesis" }
+
+FUNCTION {bbl.phdthesis}
+{ "Ph.D. thesis" }
+
+%<*apsrev>
+FUNCTION {bbl.first}
+{ "1st" }
+
+FUNCTION {bbl.second}
+{ "2nd" }
+
+FUNCTION {bbl.third}
+{ "3rd" }
+
+FUNCTION {bbl.fourth}
+{ "4th" }
+
+FUNCTION {bbl.fifth}
+{ "5th" }
+
+FUNCTION {bbl.st}
+{ "st" }
+
+FUNCTION {bbl.nd}
+{ "nd" }
+
+FUNCTION {bbl.rd}
+{ "rd" }
+
+FUNCTION {bbl.th}
+{ "th" }
+
+MACRO {jan} {"Jan."}
+
+MACRO {feb} {"Feb."}
+
+MACRO {mar} {"Mar."}
+
+MACRO {apr} {"Apr."}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"Jun."}
+
+MACRO {jul} {"Jul."}
+
+MACRO {aug} {"Aug."}
+
+MACRO {sep} {"Sep."}
+
+MACRO {oct} {"Oct."}
+
+MACRO {nov} {"Nov."}
+
+MACRO {dec} {"Dec."}
+
+FUNCTION {eng.ord}
+{ duplicate$ "1" swap$ *
+ #-2 #1 substring$ "1" =
+ { bbl.th * }
+ { duplicate$ #-1 #1 substring$
+ duplicate$ "1" =
+ { pop$ bbl.st * }
+ { duplicate$ "2" =
+ { pop$ bbl.nd * }
+ { "3" =
+ { bbl.rd * }
+ { bbl.th * }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+%</apsrev>
+%<*apsrmp>
+MACRO {jan} {"January"}
+
+MACRO {feb} {"February"}
+
+MACRO {mar} {"March"}
+
+MACRO {apr} {"April"}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"June"}
+
+MACRO {jul} {"July"}
+
+MACRO {aug} {"August"}
+
+MACRO {sep} {"September"}
+
+MACRO {oct} {"October"}
+
+MACRO {nov} {"November"}
+
+MACRO {dec} {"December"}
+%</apsrmp>
+
+ %-------------------------------------------------------------------
+
+ % Begin module:
+
+ % \ProvidesFile{physjour.mbs}[1999/10/05 2.1 (PWD)]
+
+MACRO {aa}{"Astron. \& Astrophys."}
+
+MACRO {aasup}{"Astron. \& Astrophys. Suppl. Ser."}
+
+MACRO {aj} {"Astron. J."}
+
+MACRO {aph} {"Acta Phys."}
+
+MACRO {advp} {"Adv. Phys."}
+
+MACRO {ajp} {"Amer. J. Phys."}
+
+MACRO {ajm} {"Amer. J. Math."}
+
+MACRO {amsci} {"Amer. Sci."}
+
+MACRO {anofd} {"Ann. Fluid Dyn."}
+
+MACRO {am} {"Ann. Math."}
+
+MACRO {ap} {"Ann. Phys. (NY)"}
+
+MACRO {adp} {"Ann. Phys. (Leipzig)"}
+
+MACRO {ao} {"Appl. Opt."}
+
+MACRO {apl} {"Appl. Phys. Lett."}
+
+MACRO {app} {"Astroparticle Phys."}
+
+MACRO {apj} {"Astrophys. J."}
+
+MACRO {apjsup} {"Astrophys. J. Suppl."}
+
+MACRO {apss} {"Astrophys. Space Sci."}
+
+MACRO {araa} {"Ann. Rev. Astron. Astrophys."}
+
+MACRO {baas} {"Bull. Amer. Astron. Soc."}
+
+MACRO {baps} {"Bull. Amer. Phys. Soc."}
+
+MACRO {cmp} {"Comm. Math. Phys."}
+
+MACRO {cpam} {"Commun. Pure Appl. Math."}
+
+MACRO {cppcf} {"Comm. Plasma Phys. \& Controlled Fusion"}
+
+MACRO {cpc} {"Comp. Phys. Comm."}
+
+MACRO {cqg} {"Class. Quant. Grav."}
+
+MACRO {cra} {"C. R. Acad. Sci. A"}
+
+MACRO {fed} {"Fusion Eng. \& Design"}
+
+MACRO {ft} {"Fusion Tech."}
+
+MACRO {grg} {"Gen. Relativ. Gravit."}
+
+MACRO {ieeens} {"IEEE Trans. Nucl. Sci."}
+
+MACRO {ieeeps} {"IEEE Trans. Plasma Sci."}
+
+MACRO {ijimw} {"Interntl. J. Infrared \& Millimeter Waves"}
+
+MACRO {ip} {"Infrared Phys."}
+
+MACRO {irp} {"Infrared Phys."}
+
+MACRO {jap} {"J. Appl. Phys."}
+
+MACRO {jasa} {"J. Acoust. Soc. America"}
+
+MACRO {jcp} {"J. Comp. Phys."}
+
+MACRO {jetp} {"Sov. Phys.--JETP"}
+
+MACRO {jfe} {"J. Fusion Energy"}
+
+MACRO {jfm} {"J. Fluid Mech."}
+
+MACRO {jmp} {"J. Math. Phys."}
+
+MACRO {jne} {"J. Nucl. Energy"}
+
+MACRO {jnec} {"J. Nucl. Energy, C: Plasma Phys., Accelerators, Thermonucl. Res."}
+
+MACRO {jnm} {"J. Nucl. Mat."}
+
+MACRO {jpc} {"J. Phys. Chem."}
+
+MACRO {jpp} {"J. Plasma Phys."}
+
+MACRO {jpsj} {"J. Phys. Soc. Japan"}
+
+MACRO {jsi} {"J. Sci. Instrum."}
+
+MACRO {jvst} {"J. Vac. Sci. \& Tech."}
+
+MACRO {nat} {"Nature"}
+
+MACRO {nature} {"Nature"}
+
+MACRO {nedf} {"Nucl. Eng. \& Design/Fusion"}
+
+MACRO {nf} {"Nucl. Fusion"}
+
+MACRO {nim} {"Nucl. Inst. \& Meth."}
+
+MACRO {nimpr} {"Nucl. Inst. \& Meth. in Phys. Res."}
+
+MACRO {np} {"Nucl. Phys."}
+
+MACRO {npb} {"Nucl. Phys. B"}
+
+MACRO {nt/f} {"Nucl. Tech./Fusion"}
+
+MACRO {npbpc} {"Nucl. Phys. B (Proc. Suppl.)"}
+
+MACRO {inc} {"Nuovo Cimento"}
+
+MACRO {nc} {"Nuovo Cimento"}
+
+MACRO {pf} {"Phys. Fluids"}
+
+MACRO {pfa} {"Phys. Fluids A: Fluid Dyn."}
+
+MACRO {pfb} {"Phys. Fluids B: Plasma Phys."}
+
+MACRO {pl} {"Phys. Lett."}
+
+MACRO {pla} {"Phys. Lett. A"}
+
+MACRO {plb} {"Phys. Lett. B"}
+
+MACRO {prep} {"Phys. Rep."}
+
+MACRO {pnas} {"Proc. Nat. Acad. Sci. USA"}
+
+MACRO {pp} {"Phys. Plasmas"}
+
+MACRO {ppcf} {"Plasma Phys. \& Controlled Fusion"}
+
+MACRO {phitrsl} {"Philos. Trans. Roy. Soc. London"}
+
+MACRO {prl} {"Phys. Rev. Lett."}
+
+MACRO {pr} {"Phys. Rev."}
+
+MACRO {physrev} {"Phys. Rev."}
+
+MACRO {pra} {"Phys. Rev. A"}
+
+MACRO {prb} {"Phys. Rev. B"}
+
+MACRO {prc} {"Phys. Rev. C"}
+
+MACRO {prd} {"Phys. Rev. D"}
+
+MACRO {pre} {"Phys. Rev. E"}
+
+MACRO {ps} {"Phys. Scripta"}
+
+MACRO {procrsl} {"Proc. Roy. Soc. London"}
+
+MACRO {rmp} {"Rev. Mod. Phys."}
+
+MACRO {rsi} {"Rev. Sci. Inst."}
+
+MACRO {science} {"Science"}
+
+MACRO {sciam} {"Sci. Am."}
+
+MACRO {sam} {"Stud. Appl. Math."}
+
+MACRO {sjpp} {"Sov. J. Plasma Phys."}
+
+MACRO {spd} {"Sov. Phys.--Doklady"}
+
+MACRO {sptp} {"Sov. Phys.--Tech. Phys."}
+
+MACRO {spu} {"Sov. Phys.--Uspeki"}
+
+MACRO {st} {"Sky and Telesc."}
+
+ % End module: physjour.mbs
+
+ %-------------------------------------------------------------------
+ % Begin module:
+ % \ProvidesFile{geojour.mbs}[1999/11/16 2.0g (PWD)]
+MACRO {aisr} {"Adv. Space Res."}
+MACRO {ag} {"Ann. Geophys."}
+MACRO {anigeo} {"Ann. Geofis."}
+MACRO {angl} {"Ann. Glaciol."}
+MACRO {andmet} {"Ann. d. Meteor."}
+MACRO {andgeo} {"Ann. d. Geophys."}
+MACRO {andphy} {"Ann. Phys.-Paris"}
+MACRO {afmgb} {"Arch. Meteor. Geophys. Bioklimatol."}
+MACRO {atph} {"Atm\'osphera"}
+MACRO {aao} {"Atmos. Ocean"}
+MACRO {ass}{"Astrophys. Space Sci."}
+MACRO {atenv} {"Atmos. Environ."}
+MACRO {aujag} {"Aust. J. Agr. Res."}
+MACRO {aumet} {"Aust. Meteorol. Mag."}
+MACRO {blmet} {"Bound.-Lay. Meteorol."}
+MACRO {bams} {"Bull. Amer. Meteorol. Soc."}
+MACRO {cch} {"Clim. Change"}
+MACRO {cdyn} {"Clim. Dynam."}
+MACRO {cbul} {"Climatol. Bull."}
+MACRO {cap} {"Contrib. Atmos. Phys."}
+MACRO {dsr} {"Deep-Sea Res."}
+MACRO {dhz} {"Dtsch. Hydrogr. Z."}
+MACRO {dao} {"Dynam. Atmos. Oceans"}
+MACRO {eco} {"Ecology"}
+MACRO {empl}{"Earth, Moon and Planets"}
+MACRO {envres} {"Environ. Res."}
+MACRO {envst} {"Environ. Sci. Technol."}
+MACRO {ecms} {"Estuarine Coastal Mar. Sci."}
+MACRO {expa}{"Exper. Astron."}
+MACRO {geoint} {"Geofis. Int."}
+MACRO {geopub} {"Geofys. Publ."}
+MACRO {geogeo} {"Geol. Geofiz."}
+MACRO {gafd} {"Geophys. Astrophys. Fluid Dyn."}
+MACRO {gfd} {"Geophys. Fluid Dyn."}
+MACRO {geomag} {"Geophys. Mag."}
+MACRO {georl} {"Geophys. Res. Lett."}
+MACRO {grl} {"Geophys. Res. Lett."}
+MACRO {ga} {"Geophysica"}
+MACRO {gs} {"Geophysics"}
+MACRO {ieeetap} {"IEEE Trans. Antenn. Propag."}
+MACRO {ijawp} {"Int. J. Air Water Pollut."}
+MACRO {ijc} {"Int. J. Climatol."}
+MACRO {ijrs} {"Int. J. Remote Sens."}
+MACRO {jam} {"J. Appl. Meteorol."}
+MACRO {jaot} {"J. Atmos. Ocean. Technol."}
+MACRO {jatp} {"J. Atmos. Terr. Phys."}
+MACRO {jce} {"J. Climate"}
+MACRO {jcam} {"J. Climate Appl. Meteor."}
+MACRO {jcm} {"J. Climate Meteor."}
+MACRO {jcy} {"J. Climatol."}
+MACRO {jgr} {"J. Geophys. Res."}
+MACRO {jga} {"J. Glaciol."}
+MACRO {jh} {"J. Hydrol."}
+MACRO {jmr} {"J. Mar. Res."}
+MACRO {jmrj} {"J. Meteor. Res. Japan"}
+MACRO {jm} {"J. Meteor."}
+MACRO {jpo} {"J. Phys. Oceanogr."}
+MACRO {jra} {"J. Rech. Atmos."}
+MACRO {jaes} {"J. Aeronaut. Sci."}
+MACRO {japca} {"J. Air Pollut. Control Assoc."}
+MACRO {jas} {"J. Atmos. Sci."}
+MACRO {jmts} {"J. Mar. Technol. Soc."}
+MACRO {jmsj} {"J. Meteorol. Soc. Japan"}
+MACRO {josj} {"J. Oceanogr. Soc. Japan"}
+MACRO {jwm} {"J. Wea. Mod."}
+MACRO {lao} {"Limnol. Oceanogr."}
+MACRO {mwl} {"Mar. Wea. Log"}
+MACRO {mau} {"Mausam"}
+MACRO {meteor} {"``Meteor'' Forschungsergeb."}
+MACRO {map} {"Meteorol. Atmos. Phys."}
+MACRO {metmag} {"Meteor. Mag."}
+MACRO {metmon} {"Meteor. Monogr."}
+MACRO {metrun} {"Meteor. Rundsch."}
+MACRO {metzeit} {"Meteor. Z."}
+MACRO {metgid} {"Meteor. Gidrol."}
+MACRO {mwr} {"Mon. Weather Rev."}
+MACRO {nwd} {"Natl. Weather Dig."}
+MACRO {nzjmfr} {"New Zeal. J. Mar. Freshwater Res."}
+MACRO {npg} {"Nonlin. Proc. Geophys."}
+MACRO {om} {"Oceanogr. Meteorol."}
+MACRO {ocac} {"Oceanol. Acta"}
+MACRO {oceanus} {"Oceanus"}
+MACRO {paleoc} {"Paleoceanography"}
+MACRO {pce} {"Phys. Chem. Earth"}
+MACRO {pmg} {"Pap. Meteor. Geophys."}
+MACRO {ppom} {"Pap. Phys. Oceanogr. Meteor."}
+MACRO {physzeit} {"Phys. Z."}
+MACRO {pps} {"Planet. Space Sci."}
+MACRO {pss} {"Planet. Space Sci."}
+MACRO {pag} {"Pure Appl. Geophys."}
+MACRO {qjrms} {"Quart. J. Roy. Meteorol. Soc."}
+MACRO {quatres} {"Quat. Res."}
+MACRO {rsci} {"Radio Sci."}
+MACRO {rse} {"Remote Sens. Environ."}
+MACRO {rgeo} {"Rev. Geophys."}
+MACRO {rgsp} {"Rev. Geophys. Space Phys."}
+MACRO {rdgeo} {"Rev. Geofis."}
+MACRO {revmeta} {"Rev. Meteorol."}
+MACRO {sgp}{"Surveys in Geophys."}
+MACRO {sp} {"Solar Phys."}
+MACRO {ssr} {"Space Sci. Rev."}
+MACRO {tellus} {"Tellus"}
+MACRO {tac} {"Theor. Appl. Climatol."}
+MACRO {tagu} {"Trans. Am. Geophys. Union (EOS)"}
+MACRO {wrr} {"Water Resour. Res."}
+MACRO {weather} {"Weather"}
+MACRO {wafc} {"Weather Forecast."}
+MACRO {ww} {"Weatherwise"}
+MACRO {wmob} {"WMO Bull."}
+MACRO {zeitmet} {"Z. Meteorol."}
+ % End module: geojour.mbs
+
+ %-------------------------------------------------------------------
+
+ % Begin module:
+
+ % \ProvidesFile{photjour.mbs}[1999/02/24 2.0b (PWD)]
+
+MACRO {appopt} {"Appl. Opt."}
+
+MACRO {bell} {"Bell Syst. Tech. J."}
+
+MACRO {ell} {"Electron. Lett."}
+
+MACRO {jasp} {"J. Appl. Spectr."}
+
+MACRO {jqe} {"IEEE J. Quantum Electron."}
+
+MACRO {jlwt} {"J. Lightwave Technol."}
+
+MACRO {jmo} {"J. Mod. Opt."}
+
+MACRO {josa} {"J. Opt. Soc. America"}
+
+MACRO {josaa} {"J. Opt. Soc. Amer.~A"}
+
+MACRO {josab} {"J. Opt. Soc. Amer.~B"}
+
+MACRO {jdp} {"J. Phys. (Paris)"}
+
+MACRO {oc} {"Opt. Commun."}
+
+MACRO {ol} {"Opt. Lett."}
+
+MACRO {phtl} {"IEEE Photon. Technol. Lett."}
+
+MACRO {pspie} {"Proc. Soc. Photo-Opt. Instrum. Eng."}
+
+MACRO {sse} {"Solid-State Electron."}
+
+MACRO {sjot} {"Sov. J. Opt. Technol."}
+
+MACRO {sjqe} {"Sov. J. Quantum Electron."}
+
+MACRO {sleb} {"Sov. Phys.--Leb. Inst. Rep."}
+
+MACRO {stph} {"Sov. Phys.--Techn. Phys."}
+
+MACRO {stphl} {"Sov. Techn. Phys. Lett."}
+
+MACRO {vr} {"Vision Res."}
+
+MACRO {zph} {"Z. f. Physik"}
+
+MACRO {zphb} {"Z. f. Physik~B"}
+
+MACRO {zphd} {"Z. f. Physik~D"}
+
+MACRO {CLEO} {"CLEO"}
+
+MACRO {ASSL} {"Adv. Sol.-State Lasers"}
+
+MACRO {OSA} {"OSA"}
+
+ % End module: photjour.mbs
+
+%% Copyright 1994-2000 Patrick W Daly
+MACRO {acmcs} {"ACM Comput. Surv."}
+
+MACRO {acta} {"Acta Inf."}
+
+MACRO {cacm} {"Commun. ACM"}
+
+MACRO {ibmjrd} {"IBM J. Res. Dev."}
+
+MACRO {ibmsj} {"IBM Syst.~J."}
+
+MACRO {ieeese} {"IEEE Trans. Software Eng."}
+
+MACRO {ieeetc} {"IEEE Trans. Comput."}
+
+MACRO {ieeetcad}
+ {"IEEE Trans. Comput. Aid. Des."}
+
+MACRO {ipl} {"Inf. Process. Lett."}
+
+MACRO {jacm} {"J.~ACM"}
+
+MACRO {jcss} {"J.~Comput. Syst. Sci."}
+
+MACRO {scp} {"Sci. Comput. Program."}
+
+MACRO {sicomp} {"SIAM J. Comput."}
+
+MACRO {tocs} {"ACM Trans. Comput. Syst."}
+
+MACRO {tods} {"ACM Trans. Database Syst."}
+
+MACRO {tog} {"ACM Trans. Graphic."}
+
+MACRO {toms} {"ACM Trans. Math. Software"}
+
+MACRO {toois} {"ACM Trans. Office Inf. Syst."}
+
+MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."}
+
+MACRO {tcs} {"Theor. Comput. Sci."}
+
+FUNCTION {bibinfo.check}
+{ swap$
+ duplicate$ missing$
+ {
+ pop$ pop$
+ ""
+ }
+ { duplicate$ empty$
+ {
+ swap$ pop$
+ }
+ { swap$
+ "\bibinfo{" swap$ * "}{" * swap$ * "}" *
+ }
+ if$
+ }
+ if$
+}
+FUNCTION {bibinfo.warn}
+{ swap$
+ duplicate$ missing$
+ {
+ swap$ "missing " swap$ * " in " * cite$ * warning$ pop$
+ ""
+ }
+ { duplicate$ empty$
+ {
+ swap$ "empty " swap$ * " in " * cite$ * warning$
+ }
+ { swap$
+ "\bibinfo{" swap$ * "}{" * swap$ * "}" *
+ }
+ if$
+ }
+ if$
+}
+FUNCTION {format.eprint}
+{ eprint duplicate$ empty$
+ 'skip$
+ { "\eprint"
+ archive empty$
+ 'skip$
+ { "[" * archive * "]" * }
+ if$
+ "{" * swap$ * "}" *
+ }
+ if$
+}
+FUNCTION {format.url}
+{ url empty$
+ { "" }
+ { "\urlprefix\url{" url * "}" * }
+ if$
+}
+
+STRINGS { bibinfo}
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 'bibinfo :=
+ duplicate$ empty$ 'skip$ {
+ 's :=
+ "" 't :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+%<*apsrev>
+ "{f.}" format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font *
+ s nameptr
+ "{jj}" format.name$ duplicate$ empty$ 'skip$
+ { bib.fname.font ", " swap$ * }
+ if$
+%</apsrev>
+%<*apsrmp>
+ nameptr #1 >
+ { "{f.}" format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font *
+ s nameptr
+ "{jj}" format.name$ duplicate$ empty$ 'skip$
+ { bib.fname.font ", " swap$ * }
+ if$
+ }
+ { "{vv~}{ll}" format.name$ bib.name.font
+ s nameptr
+ "{f.}{, jj}"
+ format.name$ duplicate$ empty$ 'skip$
+ { bib.fname.font ", " swap$ * }
+ if$
+ }
+ if$
+%</apsrmp>
+ *
+ bibinfo bibinfo.check
+ 't :=
+ nameptr #1 >
+ {
+%<apsrev> nameptr #0
+%<apsrmp> nameptr #2
+ #10 +
+ #1 + =
+%<apsrev> numnames #0
+%<apsrmp> numnames #2
+ #10 +
+ > and
+ { "others" 't :=
+ #1 'namesleft := }
+ 'skip$
+ if$
+ namesleft #1 >
+ { ", " * t * }
+ {
+%<*apsrev>
+ numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+%</apsrev>
+%<*apsrmp>
+ "," *
+%</apsrmp>
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ { 't := }
+ { pop$ }
+ if$
+ t "others" =
+ {
+%<apsrev> " " * bbl.etal bib.name.font *
+%<apsrmp> " " * bbl.etal emphasize *
+ }
+ {
+ bbl.and
+%<apsrev> bib.name.font
+ space.word * t *
+ }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ } if$
+}
+%<*apsrev>
+FUNCTION {format.names.ed}
+{
+ format.names
+}
+%</apsrev>
+%<*apsrmp>
+FUNCTION {format.names.ed}
+{
+ 'bibinfo :=
+ duplicate$ empty$ 'skip$ {
+ 's :=
+ "" 't :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ "{f.}" format.name$ duplicate$ empty$ 'skip$
+ { tie.or.space.prefix bib.fname.font swap$ * }
+ if$
+ s nameptr
+ "{vv~}{ll}" format.name$ bib.name.font *
+ s nameptr
+ "{jj}" format.name$ duplicate$ empty$ 'skip$
+ { bib.fname.font ", " swap$ * }
+ if$
+ *
+ bibinfo bibinfo.check
+ 't :=
+ nameptr #1 >
+ {
+ namesleft #1 >
+ { ", " * t * }
+ {
+ numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ { 't := }
+ { pop$ }
+ if$
+ t "others" =
+ {
+ " " * bbl.etal emphasize *
+ }
+ {
+ bbl.and
+ space.word * t *
+ }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ } if$
+}
+%</apsrmp>
+FUNCTION {format.key}
+{ empty$
+ { key field.or.null }
+ { "" }
+ if$
+}
+
+FUNCTION {format.authors}
+{ author "author" format.names
+ duplicate$ empty$ 'skip$
+ { collaboration "collaboration" bibinfo.check
+ duplicate$ empty$ 'skip$
+ { " (" swap$ * ")" * }
+ if$
+ *
+ }
+ if$
+}
+FUNCTION {get.bbl.editor}
+{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ }
+
+FUNCTION {format.editors}
+{ editor "editor" format.names duplicate$ empty$ 'skip$
+ {
+%<*apsrev>
+ "," *
+ " " *
+ get.bbl.editor
+%</apsrev>
+%<*apsrmp>
+ " " *
+ get.bbl.editor
+ "(" swap$ * ")" *
+%</apsrmp>
+ *
+ }
+ if$
+}
+FUNCTION {format.isbn}
+{ isbn "isbn" bibinfo.check
+ duplicate$ empty$ 'skip$
+ {
+ "ISBN " swap$ *
+ }
+ if$
+}
+
+FUNCTION {format.issn}
+{ issn "issn" bibinfo.check
+ duplicate$ empty$ 'skip$
+ {
+ "ISSN " swap$ *
+ }
+ if$
+}
+
+FUNCTION {format.note}
+{
+ note empty$
+ { "" }
+ { note #1 #1 substring$
+ duplicate$ "{" =
+ 'skip$
+ { output.state mid.sentence =
+ { "l" }
+ { "u" }
+ if$
+ change.case$
+ }
+ if$
+ note #2 global.max$ substring$ * "note" bibinfo.check
+ }
+ if$
+}
+
+FUNCTION {format.title}
+{ title
+ duplicate$ empty$
+ { skip$ }
+ { "t" change.case$ }
+ if$
+ "title" bibinfo.check
+%<*apsrev>
+ duplicate$ empty$ 'skip$
+ {
+ emphasize
+ }
+ if$
+%</apsrev>
+}
+
+FUNCTION {format.full.names}
+{'s :=
+ "" 't :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ "{vv~}{ll}" format.name$
+ 't :=
+ nameptr #1 >
+ {
+%<apsrev> nameptr #0
+%<apsrmp> nameptr #2
+ #10 +
+ #1 + =
+%<apsrev> numnames #0
+%<apsrmp> numnames #2
+ #10 +
+ > and
+ { "others" 't :=
+ #1 'namesleft := }
+ 'skip$
+ if$
+ namesleft #1 >
+ { ", " * t * }
+ {
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ { 't := }
+ { pop$ }
+ if$
+ t "others" =
+ {
+%<apsrev> " " * bbl.etal *
+ cite.name.font
+%<apsrmp> " " * bbl.etal emphasize *
+ }
+ {
+ numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ bbl.and
+ space.word * t *
+ }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ t "others" =
+ 'skip$
+ { cite.name.font }
+ if$
+}
+
+FUNCTION {author.editor.key.full}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.full.names }
+ if$
+ }
+ { author format.full.names }
+ if$
+}
+
+FUNCTION {author.key.full}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { author format.full.names }
+ if$
+}
+
+FUNCTION {editor.key.full}
+{ editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.full.names }
+ if$
+}
+
+FUNCTION {make.full.names}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.full
+ { type$ "proceedings" =
+ 'editor.key.full
+ 'author.key.full
+ if$
+ }
+ if$
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+ "\bibitem[{" write$
+ label write$
+ ")" make.full.names duplicate$ short.list =
+ { pop$ }
+ { * }
+ if$
+ "}]{" * write$
+ cite$ write$
+ "}" write$
+ newline$
+ ""
+ before.all 'output.state :=
+}
+
+FUNCTION {n.dashify}
+{
+ 't :=
+ ""
+ { t empty$ not }
+ { t #1 #1 substring$ "-" =
+ { t #1 #2 substring$ "--" = not
+ { "--" *
+ t #2 global.max$ substring$ 't :=
+ }
+ { { t #1 #1 substring$ "-" = }
+ { "-" *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+ }
+ if$
+ }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+}
+
+FUNCTION {word.in}
+{ bbl.in
+ " " * }
+
+FUNCTION {format.date}
+{ year "year" bibinfo.check duplicate$ empty$
+ {
+ "empty year in " cite$ * "; set to ????" * warning$
+ pop$ "????"
+ }
+ 'skip$
+ if$
+ extra.label *
+ before.all 'output.state :=
+%<apsrev> " (" swap$ * ")" *
+%<apsrmp> ", " swap$ *
+}
+FUNCTION {format.date.misc}
+{
+%<apsrev> year empty$ 'skip$ {
+ format.date "year" output.check
+%<apsrev> } if$
+}
+FUNCTION {format.btitle}
+{ title "title" bibinfo.check
+ duplicate$ empty$ 'skip$
+ {
+ emphasize
+ }
+ if$
+}
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+FUNCTION {format.bvolume}
+{ volume empty$
+ { "" }
+ { bbl.volume volume tie.or.space.prefix
+ "volume" bibinfo.check * *
+ series "series" bibinfo.check
+ duplicate$ empty$ 'pop$
+ { swap$ bbl.of space.word * swap$
+ emphasize * }
+ if$
+ "volume and number" number either.or.check
+ }
+ if$
+}
+FUNCTION {format.number.series}
+{ volume empty$
+ { number empty$
+ { series field.or.null }
+ { series empty$
+ { number "number" bibinfo.check }
+ { output.state mid.sentence =
+ { bbl.number }
+ { bbl.number capitalize }
+ if$
+ number tie.or.space.prefix "number" bibinfo.check * *
+ bbl.in space.word *
+ series "series" bibinfo.check *
+ }
+ if$
+ }
+ if$
+ }
+ { "" }
+ if$
+}
+%<*apsrev>
+FUNCTION {is.num}
+{ chr.to.int$
+ duplicate$ "0" chr.to.int$ < not
+ swap$ "9" chr.to.int$ > not and
+}
+
+FUNCTION {extract.num}
+{ duplicate$ 't :=
+ "" 's :=
+ { t empty$ not }
+ { t #1 #1 substring$
+ t #2 global.max$ substring$ 't :=
+ duplicate$ is.num
+ { s swap$ * 's := }
+ { pop$ "" 't := }
+ if$
+ }
+ while$
+ s empty$
+ 'skip$
+ { pop$ s }
+ if$
+}
+
+FUNCTION {convert.edition}
+{ extract.num "l" change.case$ 's :=
+ s "first" = s "1" = or
+ { bbl.first 't := }
+ { s "second" = s "2" = or
+ { bbl.second 't := }
+ { s "third" = s "3" = or
+ { bbl.third 't := }
+ { s "fourth" = s "4" = or
+ { bbl.fourth 't := }
+ { s "fifth" = s "5" = or
+ { bbl.fifth 't := }
+ { s #1 #1 substring$ is.num
+ { s eng.ord 't := }
+ { edition 't := }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ t
+}
+%</apsrev>
+
+FUNCTION {format.edition}
+{ edition duplicate$ empty$ 'skip$
+ {
+%<apsrev> convert.edition
+ output.state mid.sentence =
+ { "l" }
+ { "t" }
+ if$ change.case$
+ "edition" bibinfo.check
+ " " * bbl.edition *
+ }
+ if$
+}
+INTEGERS { multiresult }
+FUNCTION {multi.page.check}
+{ 't :=
+ #0 'multiresult :=
+ { multiresult not
+ t empty$ not
+ and
+ }
+ { t #1 #1 substring$
+ duplicate$ "-" =
+ swap$ duplicate$ "," =
+ swap$ "+" =
+ or or
+ { #1 'multiresult := }
+ { t #2 global.max$ substring$ 't := }
+ if$
+ }
+ while$
+ multiresult
+}
+FUNCTION {format.pages}
+{ pages duplicate$ empty$ 'skip$
+ { duplicate$ multi.page.check
+ {
+ bbl.pages swap$
+ n.dashify
+ }
+ {
+ bbl.page swap$
+ }
+ if$
+ tie.or.space.prefix
+ "pages" bibinfo.check
+ * *
+ }
+ if$
+}
+FUNCTION {first.page}
+{ 't :=
+ ""
+ { t empty$ not t #1 #1 substring$ "-" = not and }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+}
+
+FUNCTION {format.journal.pages}
+{ pages duplicate$ empty$ 'pop$
+ { swap$ duplicate$ empty$
+ { pop$ pop$ format.pages }
+ {
+ ", " *
+ swap$
+ first.page
+ "pages" bibinfo.check
+ *
+ }
+ if$
+ }
+ if$
+}
+FUNCTION {format.journal.eid}
+{ eid "eid" bibinfo.check
+ duplicate$ empty$ 'skip$
+ { swap$ duplicate$ empty$ 'skip$
+ {
+ ", " *
+ }
+ if$
+ swap$
+ numpages empty$ 'skip$
+ { bbl.eidpp numpages tie.or.space.prefix
+ "numpages" bibinfo.check * *
+ " (" swap$ * ")" * *
+ }
+ if$
+ }
+ if$ *
+}
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null
+ duplicate$ empty$ 'skip$
+ {
+ "volume" bibinfo.check
+ }
+ if$
+ bolden
+%<*apsrev>
+ eid empty$
+ { format.journal.pages }
+ { format.journal.eid }
+ if$
+%</apsrev>
+%<*apsrmp>
+ number "number" bibinfo.check duplicate$ empty$ 'skip$
+ {
+ swap$ duplicate$ empty$
+ { "there's a number but no volume in " cite$ * warning$ }
+ 'skip$
+ if$
+ swap$
+ "(" swap$ * ")" *
+ }
+ if$ *
+%</apsrmp>
+}
+
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+%<apsrev> 'format.pages
+%<apsrmp> { "" }
+ { type empty$
+ { bbl.chapter }
+ { type "l" change.case$
+ "type" bibinfo.check
+ }
+ if$
+ chapter tie.or.space.prefix
+ "chapter" bibinfo.check
+ * *
+%<*apsrev>
+ pages empty$
+ 'skip$
+ { ", " * format.pages * }
+ if$
+%</apsrev>
+ }
+ if$
+}
+
+FUNCTION {format.booktitle}
+{
+ booktitle "booktitle" bibinfo.check
+ emphasize
+}
+FUNCTION {format.in.ed.booktitle}
+{ format.booktitle duplicate$ empty$ 'skip$
+ {
+ editor "editor" format.names.ed duplicate$ empty$ 'pop$
+ {
+ bbl.edby
+ " " * swap$ *
+ swap$
+ "," *
+ " " * swap$
+ * }
+ if$
+ word.in swap$ *
+ }
+ if$
+}
+FUNCTION {format.thesis.type}
+{ type duplicate$ empty$
+ 'pop$
+ { swap$ pop$
+ "t" change.case$ "type" bibinfo.check
+ }
+ if$
+}
+FUNCTION {format.tr.number}
+{ number "number" bibinfo.check
+ type duplicate$ empty$
+ { pop$ bbl.techrep }
+ 'skip$
+ if$
+ "type" bibinfo.check
+ swap$ duplicate$ empty$
+ { pop$ "t" change.case$ }
+ { tie.or.space.prefix * * }
+ if$
+}
+FUNCTION {format.article.crossref}
+{
+ word.in
+ " \cite{" * crossref * "}" *
+}
+FUNCTION {format.book.crossref}
+{ volume duplicate$ empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ pop$ word.in
+ }
+ { bbl.volume
+ swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word *
+ }
+ if$
+ " \cite{" * crossref * "}" *
+}
+FUNCTION {format.incoll.inproc.crossref}
+{
+ word.in
+ " \cite{" * crossref * "}" *
+}
+FUNCTION {format.org.or.pub}
+{ 't :=
+ ""
+%<*apsrmp>
+ address empty$ t empty$ and
+ 'skip$
+ {
+%</apsrmp>
+ add.blank "(" *
+ t empty$
+ { address "address" bibinfo.check *
+ }
+ { t *
+ address empty$
+ 'skip$
+ { ", " * address "address" bibinfo.check * }
+ if$
+ }
+ if$
+%<*apsrev>
+ year duplicate$ empty$
+ { "empty year in " cite$ * "; set to ????" * warning$
+ pop$ "????" }
+ { "year" bibinfo.check extra.label * }
+ if$
+ t empty$ address empty$ and
+ { * }
+ { ", " swap$ * * }
+ if$
+%</apsrev>
+ ")" *
+%<*apsrmp>
+ }
+ if$
+%</apsrmp>
+}
+FUNCTION {format.publisher.address}
+{ publisher "publisher" bibinfo.warn format.org.or.pub
+}
+
+FUNCTION {format.organization.address}
+{ organization "organization" bibinfo.check format.org.or.pub
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<*apsrmp>
+ format.date "year" output.check
+ date.block
+%</apsrmp>
+ crossref missing$
+ {
+ ""
+ journal
+ duplicate$ empty$
+ { pop$ pop$ } {
+ "journal" bibinfo.check
+ * "journal" output.check
+ add.blank
+ } if$
+ format.vol.num.pages output
+%<apsrev> format.date "year" output.check
+ }
+ { format.article.crossref output.nonnull
+%<apsrev> format.pages output
+ }
+ if$
+%<*apsrmp>
+ eid empty$
+ { format.journal.pages }
+ { format.journal.eid }
+ if$
+%</apsrmp>
+ format.issn output
+ format.note output
+%<apsrmp> journal empty$ volume empty$ or {
+ format.eprint output
+%<apsrmp> } {} if$
+ format.url output
+ fin.entry
+}
+FUNCTION {book}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check
+ editor format.key output
+ }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+%<*apsrmp>
+ format.date "year" output.check
+ date.block
+%</apsrmp>
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ format.number.series output
+ format.publisher.address output
+ }
+ {
+ format.book.crossref output.nonnull
+%<apsrev> format.date "year" output.check
+ }
+ if$
+ format.edition output
+ format.isbn output
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ author format.key output
+%<*apsrmp>
+ format.date "year" output.check
+ date.block
+%</apsrmp>
+ format.title "title" output.check
+ howpublished "howpublished" bibinfo.check output
+ address "address" bibinfo.check output
+%<apsrev> format.date "year" output.check
+ format.isbn output
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+ author empty$
+ { format.editors "author and editor" output.check
+ editor format.key output
+ }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+%<*apsrmp>
+ format.date "year" output.check
+ date.block
+%</apsrmp>
+ format.btitle "title" output.check
+ crossref missing$
+ {
+ format.publisher.address output
+ format.bvolume output
+ format.chapter.pages "chapter and pages" output.check
+ format.number.series output
+ }
+ {
+ format.chapter.pages "chapter and pages" output.check
+ format.book.crossref output.nonnull
+%<apsrev> format.date "year" output.check
+ }
+ if$
+ format.edition output
+ crossref missing$
+ { format.isbn output }
+ 'skip$
+ if$
+%<apsrmp> format.pages "pages" output.check
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<*apsrmp>
+ format.date "year" output.check
+ date.block
+%</apsrmp>
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.publisher.address output
+ format.bvolume output
+ format.number.series output
+ format.chapter.pages output
+ format.edition output
+ format.isbn output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+%<apsrmp> format.pages "pages" output.check
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<*apsrmp>
+ format.date "year" output.check
+ date.block
+%</apsrmp>
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ publisher empty$
+ { format.organization.address output }
+ { organization "organization" bibinfo.check output
+ format.publisher.address output
+ }
+ if$
+ format.bvolume output
+ format.number.series output
+ format.pages output
+ format.isbn output
+ format.issn output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+FUNCTION {conference} { inproceedings }
+FUNCTION {manual}
+{ output.bibitem
+ format.authors output
+ author format.key output
+%<*apsrmp>
+ format.date "year" output.check
+ date.block
+%</apsrmp>
+ format.btitle "title" output.check
+ organization "organization" bibinfo.check output
+ address "address" bibinfo.check output
+ format.edition output
+%<apsrev> format.date "year" output.check
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<*apsrmp>
+ format.date "year" output.check
+ date.block
+ format.btitle
+ "title" output.check
+%</apsrmp>
+ bbl.mthesis format.thesis.type output.nonnull
+ school "school" bibinfo.warn output
+ address "address" bibinfo.check output
+%<apsrev> format.date "year" output.check
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ author format.key output
+%<*apsrmp>
+ format.date.misc
+ date.block
+%</apsrmp>
+ format.title output
+ howpublished "howpublished" bibinfo.check output
+%<apsrev> format.date.misc
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<*apsrmp>
+ format.date "year" output.check
+ date.block
+ format.btitle
+ "title" output.check
+%</apsrmp>
+ bbl.phdthesis format.thesis.type output.nonnull
+ school "school" bibinfo.warn output
+ address "address" bibinfo.check output
+%<apsrev> format.date "year" output.check
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ format.editors output
+ editor format.key output
+%<*apsrmp>
+ format.date "year" output.check
+ date.block
+%</apsrmp>
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ publisher empty$
+ { format.organization.address output }
+ { organization "organization" bibinfo.check output
+ format.publisher.address output
+ }
+ if$
+ format.isbn output
+ format.issn output
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<*apsrmp>
+ format.date "year" output.check
+ date.block
+ format.btitle
+ "title" output.check
+%</apsrmp>
+ format.tr.number output.nonnull
+ institution "institution" bibinfo.warn output
+ address "address" bibinfo.check output
+%<apsrev> format.date "year" output.check
+ format.note output
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output
+%<*apsrmp>
+ format.date "year" output.check
+ date.block
+ format.title "title" output.check
+%</apsrmp>
+%<apsrev> format.date.misc
+ format.note "note" output.check
+ format.eprint output
+ format.url output
+ fin.entry
+}
+
+FUNCTION {default.type} { misc }
+READ
+FUNCTION {sortify}
+{ purify$
+ "l" change.case$
+}
+INTEGERS { len }
+FUNCTION {chop.word}
+{ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+FUNCTION {format.lab.names}
+{ 's :=
+ "" 't :=
+ s #1 "{vv~}{ll}" format.name$
+ s num.names$ duplicate$
+ #2 >
+ { pop$
+%<apsrev> " " * bbl.etal *
+ cite.name.font
+%<apsrmp> " " * bbl.etal emphasize *
+ "others" 't :=
+ }
+ { #2 <
+ 'skip$
+ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ {
+%<apsrev> " " * bbl.etal *
+%<apsrev> cite.name.font
+%<apsrmp> " " * bbl.etal emphasize *
+ "others" 't :=
+ }
+ { bbl.and space.word * s #2 "{vv~}{ll}" format.name$
+ * }
+ if$
+ }
+ if$
+ }
+ if$
+ t "others" =
+ 'skip$
+ { cite.name.font }
+ if$
+}
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.lab.names }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {editor.key.label}
+{ editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+
+FUNCTION {calc.short.authors}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ 'editor.key.label
+ 'author.key.label
+ if$
+ }
+ if$
+ 'short.list :=
+}
+
+FUNCTION {calc.label}
+{ calc.short.authors
+ short.list
+ "("
+ *
+ year duplicate$ empty$
+ short.list key field.or.null = or
+ { pop$ "" }
+ 'skip$
+ if$
+ *
+ 'label :=
+}
+
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+%<apsrev> "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}"
+%<apsrmp> "{ll{ }}{ f{ }}{ jj{ }}"
+ format.name$ 't :=
+ nameptr #1 >
+ {
+%<apsrev> nameptr #0
+%<apsrmp> nameptr #2
+ #10 +
+ #1 + =
+%<apsrev> numnames #0
+%<apsrmp> numnames #2
+ #10 +
+ > and
+ { "others" 't :=
+ #1 'namesleft := }
+ 'skip$
+ if$
+ " " *
+ namesleft #1 = t "others" = and
+ { "zzzzz" * }
+ { t sortify * }
+ if$
+ }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+FUNCTION {author.sort}
+{ author empty$
+ { key empty$
+ { "to sort, need author or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+FUNCTION {author.editor.sort}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { "to sort, need author, editor, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+FUNCTION {editor.sort}
+{ editor empty$
+ { key empty$
+ { "to sort, need editor or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+}
+%<*apsrev>
+INTEGERS { seq.num }
+FUNCTION {init.seq}
+{ #0 'seq.num :=}
+EXECUTE {init.seq}
+FUNCTION {int.to.fix}
+{ "000000000" swap$ int.to.str$ *
+ #-1 #10 substring$
+}
+%</apsrev>
+FUNCTION {presort}
+{ calc.label
+ label sortify
+ " "
+ *
+%<*apsrev>
+ seq.num #1 + 'seq.num :=
+ seq.num int.to.fix
+%</apsrev>
+%<*apsrmp>
+ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.sort
+ 'author.sort
+ if$
+ }
+ if$
+ #1 entry.max$ substring$
+%</apsrmp>
+ 'sort.label :=
+ sort.label
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {presort}
+SORT
+STRINGS { last.label next.extra }
+INTEGERS { last.extra.num number.label }
+FUNCTION {initialize.extra.label.stuff}
+{ #0 int.to.chr$ 'last.label :=
+ "" 'next.extra :=
+ #0 'last.extra.num :=
+ #0 'number.label :=
+}
+FUNCTION {forward.pass}
+{ last.label label =
+ { last.extra.num #1 + 'last.extra.num :=
+ last.extra.num int.to.chr$ 'extra.label :=
+ }
+ { "a" chr.to.int$ 'last.extra.num :=
+ "" 'extra.label :=
+ label 'last.label :=
+ }
+ if$
+ number.label #1 + 'number.label :=
+}
+FUNCTION {reverse.pass}
+{ next.extra "b" =
+ { "a" 'extra.label := }
+ 'skip$
+ if$
+ extra.label 'next.extra :=
+ extra.label
+ duplicate$ empty$
+ 'skip$
+ { "{\natexlab{" swap$ * "}}" * }
+ if$
+ 'extra.label :=
+ label extra.label * 'label :=
+}
+EXECUTE {initialize.extra.label.stuff}
+ITERATE {forward.pass}
+REVERSE {reverse.pass}
+FUNCTION {bib.sort.order}
+{ sort.label
+ " "
+ *
+ year field.or.null sortify
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+ITERATE {bib.sort.order}
+SORT
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{" number.label int.to.str$ * "}" *
+ write$ newline$
+ "\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi"
+ write$ newline$
+ "\expandafter\ifx\csname bibnamefont\endcsname\relax"
+ write$ newline$
+ " \def\bibnamefont#1{#1}\fi"
+ write$ newline$
+ "\expandafter\ifx\csname bibfnamefont\endcsname\relax"
+ write$ newline$
+ " \def\bibfnamefont#1{#1}\fi"
+ write$ newline$
+ "\expandafter\ifx\csname citenamefont\endcsname\relax"
+ write$ newline$
+ " \def\citenamefont#1{#1}\fi"
+ write$ newline$
+ "\expandafter\ifx\csname url\endcsname\relax"
+ write$ newline$
+ " \def\url#1{\texttt{#1}}\fi"
+ write$ newline$
+ "\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi"
+ write$ newline$
+ "\providecommand{\bibinfo}[2]{#2}"
+ write$ newline$
+ "\providecommand{\eprint}[2][]{\url{#2}}"
+ write$ newline$
+}
+EXECUTE {begin.bib}
+EXECUTE {init.state.consts}
+ITERATE {call.type$}
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+EXECUTE {end.bib}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</apsrev|apsrmp>
+% \end{macrocode}
+%
+% \endinput
+%
+% \Finale
diff --git a/Master/texmf-dist/source/latex/revtex4/revtex4.dtx b/Master/texmf-dist/source/latex/revtex4/revtex4.dtx
index 693747ef47f..417e2e2d8b2 100644
--- a/Master/texmf-dist/source/latex/revtex4/revtex4.dtx
+++ b/Master/texmf-dist/source/latex/revtex4/revtex4.dtx
@@ -28,7 +28,7 @@
%<revsymb&!class-pre>\ProvidesPackage{revsymb}
%<driver>\ProvidesFile{revtex.drv}
%<*!class-pst>
- [2001/08/02 v4.0 (http://publish.aps.org/revtex4/ for documentation)]%FileInfo
+ [2020/09/30 v4.0a (http://publish.aps.org/revtex4/ for documentation)]%FileInfo
%</!class-pst>
%<*driver>
\listfiles
@@ -51,7 +51,7 @@
%</driver>
% \fi
%
-% \GetFileInfo{revtex4.dtx}\CheckSum{7177}
+% \GetFileInfo{revtex4.dtx}
%
% \title{The \classname{revtex4} document class of the American Physical Society}
% \author{Arthur Ogawa%
diff --git a/Master/texmf-dist/source/latex/revtex4/textcase.dtx b/Master/texmf-dist/source/latex/revtex4/textcase.dtx
index 60010e5ee67..9ff5de536b1 100644
--- a/Master/texmf-dist/source/latex/revtex4/textcase.dtx
+++ b/Master/texmf-dist/source/latex/revtex4/textcase.dtx
@@ -26,7 +26,6 @@
% \fi
%
% \GetFileInfo{textcase.dtx}
-% \CheckSum{110}
%
% \changes{v0.01}{1997/09/28}
% {Posted to c.t.t}
diff --git a/Master/texmf-dist/source/latex/rmathbr/rmathbr.dtx b/Master/texmf-dist/source/latex/rmathbr/rmathbr.dtx
index 6bdcc488cf6..4ff36863ed2 100644
--- a/Master/texmf-dist/source/latex/rmathbr/rmathbr.dtx
+++ b/Master/texmf-dist/source/latex/rmathbr/rmathbr.dtx
@@ -2,7 +2,7 @@
% !Mode:: "TeX:DTX:UK"
% !DTXversion:: "2.5a"
%
-% Copyright (C) 2008-2016 by Denis Ryabov <dryabov@yandex.ru>
+% Copyright (C) 2008-2020 by Denis Ryabov <dryabov@yandex.ru>
% ---------------------------------------------------------------------------
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -28,7 +28,8 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{rmathbr}
%<*package>
- [2016/04/10 1.0.3 Repeating of math operator at the broken line and the new line in inline equations]
+ [2020/12/18 1.1.1 Repeating of math operator at the broken line and the new
+ line in inline equations]
%</package>
%
%<*driver>
@@ -38,12 +39,17 @@
pdfstartview=FitH,
pdfpagelayout=OneColumn,
pdfauthor={Denis Ryabov},
- pdftitle={rmathbr : Repeating of math operator at the broken line and the new line in inline equations}]{hyperref}
+ pdftitle={rmathbr : Repeating of math operator at the broken line and
+ the new line in inline equations}]{hyperref}
+\usepackage{microtype}
\usepackage{enumitem}
\usepackage{multicol}
+\setlength{\columnseprule}{0.2pt}
+\usepackage{array,longtable}
\usepackage{rmathbr}
\setlist{nosep}
\pagestyle{headings}
+\frenchspacing
\sloppy
\clubpenalty=10000
\widowpenalty=10000
@@ -54,7 +60,7 @@
%</driver>
% \fi
%
-% \CheckSum{3299}
+% \CheckSum{3913}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -87,13 +93,13 @@
%
% Repeating of math operator at the broken line and the new line in inline
% equations is used in Cyrillic mathematical typography (Russian for example),
-% but unfortunately \LaTeX{} doesn't provide such an option. There was an attempt
+% but unfortunately, \LaTeX{} doesn't provide such an option. There was an attempt
% to do it many years ago [see M.I.~Grinchuk ``TeX and Russian Traditions of
% Typesetting'', TUGboat 17(4) (1996) 385], but there was no ready to use package.
%
-% This package extends ideas described in ``TeX and Russian Traditions of
-% Typesetting'' and supports most of \LaTeX{} mathematical packages (some known
-% issues are listed in ``Known issues'' section below).
+% This package extends ideas described in the ``TeX and Russian Traditions of
+% Typesetting'' and supports most of \LaTeX's mathematical packages (some known
+% issues are listed in the ``Known issues'' section below).
%
%
% \section{Usage}
@@ -107,27 +113,74 @@
% $t_1t_2\cos\theta=\vec t_1\cdot\vec t_2$, $x=12\cdott 3\cdott 10^3$.
% \end{multicols}
%
-% It's recommended to load \textsf{rmathbr} after other packages, because of \textsf{rmathbr} has
-% special support of many math-related packages: amsfonts, amssymb, amstex,
-% boisik, euler, eulervm, fourier, icomma, latexsym, lucbmath, lucidabr, lucmin,
-% lucmtime, luctime, mathbbol, mdwmath, program, sbbm, stmaryrd, wasysym.
+% It's recommended to load \textsf{rmathbr} after other packages because
+% \textsf{rmathbr} has special support of many math-related packages:
+% \textsf{amsfonts}, \textsf{amssymb}, \mbox{\textsf{amstex}}, \textsf{bm},
+% \textsf{boisik}, \textsf{euler}, \textsf{eulervm}, \textsf{fourier},
+% \textsf{icomma}, \textsf{latexsym}, \textsf{lucbmath}, \textsf{lucidabr},
+% \textsf{lucmin}, \mbox{\textsf{lucmtime}}, \textsf{luctime}, \textsf{mathbbol},
+% \textsf{mathtools}, \textsf{mdwmath}, \textsf{program}, \textsf{sbbm},
+% \textsf{stmaryrd}, \textsf{unicode-math}, \textsf{wasysym}, \textsf{xy}.
%
% Please, submit any found bugs to \url{https://github.com/dryabov/rmathbr/issues}.
%
% \section{Options}
%
-% The \textsf{rmathbr} package supports following options:
-% \begin{itemize}
-% \item \verb|mathactivechars| (default): assign mathactive (12) category to
-% \verb|^| and \verb|_| characters.
-% \item \verb|activechars|: assign active (13) category to \verb|^| and
-% \verb|_| characters.
-% \item \verb|noactivechars|: assign default categories to \verb|^| and
-% \verb|_| characters (7 and 8, correspondingly).
-% \end{itemize}
+% Some aspects of the \textsf{rmathbr} can be altered using package options.
+% In most cases, it should be sufficient to load the package without extra
+% options, but sometimes it may be necessary to change default options for
+% compatibility with other packages.
+%
+% The ``key=value'' scheme is used with the following possible options (default
+% value is printed in italics):
+%
+% \begin{longtable}{>{\texttt}l>{\raggedright}p{2.5cm}p{6.5cm}}
+% |script| & noactive\par\textit{mathactive}\par active &
+% This option declares what way \textsf{rmathbr} will affect |_| and |^|
+% commands (sub- and superscripts). In the ``noactive'' mode, they have
+% default \TeX{} behavior, but it may be necessary to manually wrap some
+% indices into curly braces, e.g. |A^{\star}| instead of just
+% a |A^\star|. In the ``mathactive'' mode, both |_| and |^| become
+% commands in math mode that process arguments properly, and extra
+% wrapping is unnecessary. And in the ``active'' mode these commands can
+% be used for scripts even in the text mode (e.g. |H_2O|). \\
+% |run| & atload\par atbegindocument\par\textit{auto} &
+% This option declares when to affect math commands for hyphenation,
+% directly at package loading time, or later at the |\begin{document}|.
+% The latter is necessary to deal with packages that declare math symbols
+% at the |\begin{document}|. The ``auto'' value allows to switch to the
+% ``atbegindocument'' mode automatically (currently, if
+% \textsf{unicode-math} or \textsf{mathtools} packages are loaded). \\
+% |cdottimes| & true\par\textit{false} &
+% Re-declare \verb|\cdot| command as \verb|\cdott| (see \verb|\cdott|
+% description below) to hyphenate it using the \verb|\times| character.
+% By default, it is disabled because \verb|\cdot| is also used for scalar
+% products (e.g. $\vec a\cdot\vec b$), and in this case, it is wrong to
+% replace it with \verb|\times| on break, because \verb|\times| is usually
+% used for cross products. \\
+% |brokencolon| & true\par\textit{false} &
+% According to Russian typography traditions, math expression shouldn't be
+% broken on the division character (|:|). But if you like to allow it,
+% just set this option to true. \\
+% |brokenminus| & \textit{true}\par false &
+% Usually, it's allowed to break math expression on the ``minus''
+% character, but it's possible to disable it. \\
+% |brokenbin| & true\par\textit{false} &
+% This option disables breaks on binary operations (keeping relations
+% only). See also |\BrokenBinOff| and |\BrokenBinOn| macros. \\
+% \end{longtable}%
+%
+% Internally, |scripts=mathactive| assigns the mathactive (12) category to
+% \verb|^| and \verb|_| characters, |scripts=active| assigns the active (13)
+% category, and |scripts=noactive| keeps default categories to \verb|^| and
+% \verb|_| characters (7 and 8, correspondingly).
+%
+% For backward compatibility, \textsf{rmathbr} supports
+% the |noactivechars| option as an alias for |scripts=noactive|,
+% the |mathactivechars| option as an alias for |scripts=mathactive|, and
+% the |activechars| option as an alias for |scripts=active|. These options are
+% deprecated, and it's recommended to switch to the corresponding |script| option.
%
-% In some cases it might be necessary to change default option for compatibility
-% with other packages.
%
%
% \section{Macros}
@@ -135,54 +188,94 @@
% \DescribeMacro{\*}
%
% Macro \verb|\*| is used to mark multiplication point that is invisible and
-% changed to $\times$ at break only. E.g. \verb|(a+b)\*(a-b)|.
+% changed to $\times$ at the break only. E.g. \verb|(a+b)\*(a-b)|.
%
% \DescribeMacro{\cdott}
%
-% This command displays \verb|\cdot| ($\cdot$) that is changed to
-% \verb|\times| ($\times$) at break.
+% This command displays \verb|\cdot| ($\cdot$) that is changed to \verb|\times|
+% ($\times$) at the break.
%
% \DescribeMacro{\nobr}
%
% This command is used to prevent break expression on the following math
% operator. E.g. \verb|a\nobr-b|.
%
-% \DescribeMacro{\SetBreakableBin}
-%
-% Declares breakable binary operator, e.g. \verb|\SetBreakableBin{\MyPlus}|.
-%
% \DescribeMacro{\SetBreakableRel}
%
% Declares breakable relation operator, e.g. \verb|\SetBreakableRel{\MyEqual}|.
%
+% \DescribeMacro{\SetBreakableBin}
+%
+% Declares breakable binary operator, e.g. \verb|\SetBreakableBin{\MyPlus}|.
+%
% \DescribeMacro{\SetBreakableInner}
%
% Declares breakable ``inner'' expression, e.g. \verb|\SetBreakableInner{\ldots}|.
%
% \DescribeMacro{\SetOpenBracket}
%
-% Declares opening bracket (\textsf{rmathbr} disables break directly after brackets),
-% e.g. \verb|\SetOpenBracket{\MyOpenBracket}|.
+% Declares opening bracket (\textsf{rmathbr} disables break directly after
+% brackets), e.g. \verb|\SetOpenBracket{\MyOpenBracket}|.
%
% \DescribeMacro{\SetMathOperator}
%
-% Declares math operator (\textsf{rmathbr} disables break directly after operators),
-% e.g. \verb|\SetMathOperator{\MySum}|.
+% Declares math operator (\textsf{rmathbr} disables break directly after
+% operators), e.g. \verb|\SetMathOperator{\MySum}|.
%
% \DescribeMacro{\SetPunctuation}
%
-% Declares punctuation command (\textsf{rmathbr} disables break directly after punctuation),
+% Declares punctuation command (\textsf{rmathbr} disables break directly after
+% punctuation to prevent break and duplication in the case like \verb|$1,-1$|),
% e.g. \verb|\SetPunctuation{\MyColon}|.
%
+% \DescribeMacro{\UnsetBrokenCmd}
+%
+% Restores original command, e.g. to avoid potential issues or conflicts with
+% other packages. Usage example: \verb|\UnsetBrokenCmd{\cdot}| to disable break on
+% \verb|\cdot|. Note that in the case of |run=atbegindocument| (or |auto|) this
+% command should be used after \verb|\begin{document}|.
+%
+% \DescribeMacro{\BrokenBinOff}
+%
+% Disables break on binary operations, see also |brokenbin=false| option.
+%
+% \DescribeMacro{\BrokenBinOn}
+%
+% Enables break on binary operations.
+%
+%
%
% \section{Known issues}
% \begin{itemize}
-% \item 'xy' package: should be loaded after 'rmathbr' to work properly
-% \item 'breqn' package: cannot work together with 'rmathbr'
+% \item \textsf{breqn} package: cannot work together with \textsf{rmathbr} (as
+% \textsf{breqn} redefines all the math in \TeX)
% \end{itemize}
%
% \section{Changelog}
%
+% \subsection*{1.1.1 (18-December-2020)}
+% \begin{itemize}
+% \item fix issue with a prime (|'|) followed by a superscript
+% \item fix issue with \verb|\text| command as sub-/superscripts
+% \end{itemize}
+% \subsection*{1.1 (11-December-2020)}
+% \begin{itemize}
+% \item add support of XeTeX/LuaTeX and \textsf{unicode-math} package
+% \item add new key-value options (|script|, |run|, |cdottimes|, |brokenminus|,
+% |brokencolon|, |brokenbin|)
+% \item add new commands (\verb|\UnsetBrokenCmd|, \verb|\BrokenBinOff| and
+% \verb|\BrokenBinOn|)
+% \item add support of \textsf{mathtools} package
+% \item add a patch for \textsf{bm} package
+% \item add a patch for \textsf{xy} package
+% \item remove dependence on \textsf{mathstyle} package
+% \item fix math class for \verb|=|, \verb|<|, \verb|>| (\verb|\mathrel| instead
+% of \verb|\mathbin|)
+% \item fix math class for \verb|:| (\verb|\mathbin| instead of \verb|\mathrel|)
+% \item fix processing of colon-related commands (e.g. \verb|\coloneq| from
+% \textsf{mathtools}, etc.)
+% \item performance optimizations
+% \end{itemize}
% \subsection*{1.0.3 (10-April-2016)}
% \begin{itemize}
% \item fix issue with sub-/superscripts in \verb|\Biggl|, \verb|\biggl|,
@@ -211,31 +304,38 @@
% \subsection*{0.98 (31-January-2010)}
% \begin{itemize}
% \item fix hyphenation on~\verb|:=|
-% \item correct work with 'icomma' package and option 'icomma' of 'eulervm' package
-% \item correct work with 'program' package
-% \item symbols have been added from boisik, euler, fourier, lucbmath, lucidabr,
-% lucmin, lucmtime, luctime, mathbbol, mdwmath, sbbm, stmaryrd and wasysym packages.
-% \item remove shrinking of space in math (breaked url package)
-% \item don't hyphenate after punctuation ('\verb|,|', '\verb|;|', '\verb|\colon|' etc.)
+% \item correct work with \textsf{icomma} package and
+% option \verb|[icomma]| of \textsf{eulervm} package
+% \item correct work with \textsf{program} package
+% \item symbols have been added from \textsf{boisik}, \textsf{euler},
+% \textsf{fourier}, \textsf{lucbmath}, \textsf{lucidabr}, \textsf{lucmin},
+% \textsf{lucmtime}, \textsf{luctime}, \textsf{mathbbol},
+% \textsf{mdwmath}, \textsf{sbbm}, \textsf{stmaryrd}, and \textsf{wasysym}
+% packages.
+% \item remove shrinking of space in math (breaked \textsf{url} package)
+% \item don't hyphenate after punctuation (``\verb|,|'', ``\verb|;|'',
+% ``\verb|\colon|'' etc.)
% \item create broken commands as robust ones
% \item some fixes of redeclaring of AMS commands
-% \item commented hyphenation on \verb|\ldots| and \verb|\cdots|, as \TeX doesn't break here
+% \item commented hyphenation on \verb|\ldots| and \verb|\cdots|, as \TeX{}
+% doesn't break here
% \end{itemize}
% \subsection*{0.97 (08-October-2009)}
% \begin{itemize}
-% \item fix problem with operators like '\verb|+^\leq|'
+% \item fix problem with operators like ``\verb|+^\leq|''
% \end{itemize}
% \subsection*{0.96 (29-September-2009)}
% \begin{itemize}
-% \item fix problem with '\verb|-|' in AMS's \verb|\DeclareMathOperator|
+% \item fix problem with ``\verb|-|'' in AMS's \verb|\DeclareMathOperator|
% \item fix problem with \verb|\ldots| in text mode
% \end{itemize}
% \subsection*{0.95 (28-September-2009)}
% \begin{itemize}
% \item fix problem with sub/sup-scripts after relations
% \item fix hyphenation on \verb|\ldots|
-% \item AMS/Lucida left brackets (\verb|\lvert|, \verb|\lVert|, \verb|\ulcorner|, \verb|\llcorner|) support
-% \item mathbbol.sty left bracket (\verb|\Lbrack|) support
+% \item AMS/Lucida left brackets (\verb|\lvert|, \verb|\lVert|,
+% \verb|\ulcorner|, \verb|\llcorner|) support
+% \item \textsf{mathbbol} left bracket (\verb|\Lbrack|) support
% \item huge code refactoring
% \end{itemize}
% \subsection*{0.91 (21-September-2009)}
@@ -256,25 +356,49 @@
%<*package>
% \fi
%
+%
% \subsection*{Initialization}
%
+% Load required packages.
% \begin{macrocode}
\RequirePackage{ifetex}
-\RequirePackage{mathstyle}
+\RequirePackage{ifluatex}
+\RequirePackage{xkeyval}
+\RequirePackage{expl3}
% \end{macrocode}
+%
+% \begin{macro}{\rmathbr@kv}
% \begin{macrocode}
-\@ifpackageloaded{breqn}%
-{
- \PackageError{rmathbr}{'rmathbr' package cannot be used together with 'breqn' package!}{}%
-}{}
+\edef\rmathbr@kv{\@currname.\@currext}
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xDeclareBoolOptionX}
+% The macro to declare a boolean option.
% \begin{macrocode}
-\@ifpackageloaded{xy}%
-{
- \PackageError{rmathbr}{'rmathbr' package should be loaded before 'xy' package!}{}%
+\def\xDeclareBoolOptionX#1#2{%
+ \define@boolkey{\rmathbr@kv}[rmathbr@kv@]{#1}[true]{#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xDeclareChoiceOptionX}
+% The macro to declare a choice option.
+% \begin{macrocode}
+\def\xDeclareChoiceOptionX#1[#2]#3[#4]#5{%
+ \define@choicekey{\rmathbr@kv}{#1}[#2]{#3}[#4]{#5}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Warn about known issues.
+% \begin{macrocode}
+\@ifpackageloaded{breqn}{%
+ \PackageError{rmathbr}{'rmathbr' package cannot be used together with 'breqn' package!}{}%
}{}
% \end{macrocode}
%
+%
% \subsection*{Interface}
%
% \begin{macro}{\nobr}
@@ -284,15 +408,6 @@
% \end{macrocode}
% \end{macro}
%
-%
-% \begin{macro}{\SetBreakableBin}
-% Makes breakable binary operation.
-% \begin{macrocode}
-\def\SetBreakableBin#1{\rmathbr@setbreakable{#1}{\brokenbin}}
-% \end{macrocode}
-% \end{macro}
-%
-%
% \begin{macro}{\SetBreakableRel}
% Makes breakable relation sign.
% \begin{macrocode}
@@ -300,6 +415,12 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\SetBreakableBin}
+% Makes breakable binary operation.
+% \begin{macrocode}
+\def\SetBreakableBin#1{\rmathbr@setbreakable{#1}{\brokenbin}}
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\SetBreakableInner}
% Makes breakable inner (like \verb|\ldots|).
@@ -308,7 +429,6 @@
% \end{macrocode}
% \end{macro}
%
-%
% \begin{macro}{\SetOpenBracket}
% Disables breaks after open bracket.
% \begin{macrocode}
@@ -316,6 +436,12 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\SetPunctuation}
+% Disables breaks after punctuation sign.
+% \begin{macrocode}
+\def\SetPunctuation#1{\rmathbr@nobrafter{#1}}
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\SetMathOperator}
% Disables breaks after math operator.
@@ -324,297 +450,509 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\UnsetBrokenCmd}
+% Restores original command.
+% \begin{macrocode}
+\def\UnsetBrokenCmd#1{\rmathbr@unsetbroken{#1}}
+% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}{\SetPunctuation}
-% Disables breaks after punctuation sign.
+% \begin{macro}{\BrokenBinOff}
+% Disables break on binary operations.
% \begin{macrocode}
-\def\SetPunctuation#1{\rmathbr@nobrafter{#1}}
+\def\BrokenBinOff{\rmathbr@brokenbinoff}
% \end{macrocode}
% \end{macro}
%
-% \noindent Makes argument as breakable binary operation.
+% \begin{macro}{\BrokenBinOn}
+% Enables break on binary operations.
% \begin{macrocode}
-\DeclareRobustCommand{\brokenbin}[1]{\rmathbr@brokenbin{#1}}
+\def\BrokenBinOn{\rmathbr@brokenbinon}
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\brokenrel}
% Makes argument as breakable relation sign.
% \begin{macrocode}
\DeclareRobustCommand{\brokenrel}[1]{\rmathbr@brokenrel{#1}}
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\brokenbin}
+% Makes argument as breakable binary operation.
+% \begin{macrocode}
+\DeclareRobustCommand{\brokenbin}[1]{\rmathbr@brokenbin{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\brokeninner}
% Makes argument as breakable inner.
% \begin{macrocode}
\DeclareRobustCommand{\brokeninner}[1]{\rmathbr@brokeninner{#1}}
% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection*{Options}
+%
+% Start to process options.
+%
+% First of all, warn about deprecated options:
+% \begin{macrocode}
+\xDeclareBoolOptionX{noactivechars}{
+ \ifrmathbr@kv@noactivechars
+ \PackageWarning{rmathbr}{^^J Option 'noactivechars' is deprecated.^^J
+ Use 'scripts=noactive' instead.^^J}
+ \ExecuteOptionsX{scripts=noactive}
+ \fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\xDeclareBoolOptionX{mathactivechars}{
+ \ifrmathbr@kv@mathactivechars
+ \PackageWarning{rmathbr}{^^J Option 'mathactivechars' is deprecated.^^J
+ Use 'scripts=mathactive' instead.^^J}
+ \ExecuteOptionsX{scripts=mathactive}
+ \fi
+}
+% \end{macrocode}
+% \begin{macrocode}
+\xDeclareBoolOptionX{activechars}{
+ \ifrmathbr@kv@activechars
+ \PackageWarning{rmathbr}{^^J Option 'activechars' is deprecated.^^J
+ Use 'scripts=active' instead.^^J}
+ \ExecuteOptionsX{scripts=active}
+ \fi
+}
+% \end{macrocode}
+%
+% Process |script| option:
+% \begin{macrocode}
+\xDeclareChoiceOptionX{scripts}[\xkv@val\xkv@nr]{noactive,mathactive,active}[mathactive]{
+ \let\rmathbr@kv@scriptsmode=\xkv@nr
+}
+% \end{macrocode}
+%
+% Set when to patch math commands, at the package loading or at the
+% \verb|\begin{document}| (i.e.\ after other packages are loaded and set its
+% macros):
+% \begin{macrocode}
+\newif\ifrmathbr@patch@begindocument
+% \end{macrocode}
+% Note that by default 'atload' is used unless 'unicode-math' or 'mathtools' are
+% loaded.
+% \begin{macrocode}
+\xDeclareChoiceOptionX{run}[\xkv@val\xkv@nr]{atload,atbegindocument,auto}[auto]{
+ \ifcase\xkv@nr\relax
+ \rmathbr@patch@begindocumentfalse
+ \or
+ \rmathbr@patch@begindocumenttrue
+ \or
+ \@ifpackageloaded{unicode-math}{\rmathbr@patch@begindocumenttrue}{}
+ \@ifpackageloaded{mathtools}{\rmathbr@patch@begindocumenttrue}{}
+ \fi
+}
+% \end{macrocode}
+%
+% The option to make \verb|\cdot| works like \verb|\cdott|:
+% \begin{macrocode}
+\xDeclareBoolOptionX{cdottimes}{}
+% \end{macrocode}
+%
+% Other options (see documentation):
+% \begin{macrocode}
+\xDeclareBoolOptionX{brokenminus}{}
+% \end{macrocode}
+% \begin{macrocode}
+\xDeclareBoolOptionX{brokencolon}{}
+% \end{macrocode}
+% \begin{macrocode}
+\xDeclareBoolOptionX{brokenbin}{%
+ \ifrmathbr@kv@brokenbin
+ \else
+ \AtBeginDocument{\BrokenBinOff}
+ \fi
+}
+% \end{macrocode}
+%
+% Default values:
+% \begin{macrocode}
+\ExecuteOptionsX{scripts=mathactive}
+\ExecuteOptionsX{run=auto}
+\ExecuteOptionsX{cdottimes=false}
+\ExecuteOptionsX{brokenminus=true}
+\ExecuteOptionsX{brokencolon=false}
+\ExecuteOptionsX{brokenbin=true}
+% \end{macrocode}
+%
+% Execute options:
+% \begin{macrocode}
+\ProcessOptionsX
+% \end{macrocode}
+%
%
% \subsection*{Implementation}
%
-% Save default penalty to \verb|\exhyphenpenalty| (as \verb|\exhyphenpenalty| will be actual penalty for math breaks).
+% Switch to scripts mode
+% \begin{macrocode}
+\ifcase\rmathbr@kv@scriptsmode
+ % nop
+\or
+ \AtBeginDocument{\catcode`\^=12\mathcode`\^=32768\catcode`\_=12\mathcode`\_=32768}
+\or
+ \AtBeginDocument{\catcode`\^\active\catcode`\_\active}
+\fi
+% \end{macrocode}
+%
+% \begin{macro}{\rmathbr@pr@m@s}
+% Fix the prime symbol to take into account active math superscripts.
+% \begin{macrocode}
+\def\rmathbr@pr@m@s{%
+ \ifx'\@let@token
+ \let\rmathbr@command=\pr@@@s
+ \else\ifx\rmathbr@superscript@std\@let@token
+ \let\rmathbr@command=\pr@@@t
+ \else\ifx\rmathbr@superscript@other\@let@token
+ \let\rmathbr@command=\pr@@@t
+ \else
+ \let\rmathbr@command=\egroup
+ \fi\fi\fi
+ \rmathbr@command}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\ifnum\rmathbr@kv@scriptsmode>0\relax
+ \let\pr@m@s=\rmathbr@pr@m@s
+\fi
+% \end{macrocode}
+%
+% \begin{macro}{\rmathbr@unicodemath@primes@patch}
+% \begin{macro}{\__um_superscript:n}
+% Fix the prime symbol for unicode-math package.
+% \begin{macrocode}
+\ExplSyntaxOn
+\def\rmathbr@unicodemath@primes@patch{
+ \cs_gset:Nn \__um_superscript:n
+ {
+ \rmathbr@superscript@std\bgroup ##1
+ \peek_meaning_remove:NTF \rmathbr@superscript@other \__um_arg_i_before_egroup:n {
+ \peek_meaning_remove:NTF \rmathbr@superscript@std \__um_arg_i_before_egroup:n \egroup
+ }
+ }
+}
+\ExplSyntaxOff
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Store original penalty values (via mathchardef trick).
+% \begin{macrocode}
+\mathchardef\rmathbr@orig@relpenalty=\relpenalty
+\mathchardef\rmathbr@orig@binoppenalty=\binoppenalty
+% \end{macrocode}
+%
+% Independent hyphen penalties are supported by LuaTeX only. That's why we save
+% default penalty to \verb|\exhyphenpenalty| (as \verb|\exhyphenpenalty| will
+% be actual penalty for math breaks in \TeX{} and XeTeX).
% \begin{macrocode}
-\exhyphenpenalty=\relpenalty
+\ifluatex\else
+ \exhyphenpenalty=\relpenalty
+\fi
% \end{macrocode}
+%
% Disable default breaks.
% \begin{macrocode}
\relpenalty=13131
\binoppenalty=14141
% \end{macrocode}
-% First symbol in equation is nonbreakable.
+%
+% \begin{macro}{\everymath}
+% First symbol/command in equation is nonbreakable.
% \begin{macrocode}
\expandafter\everymath\expandafter{\the\everymath\nobr }
% \end{macrocode}
-% Setup sub- and superscripts.
+% \end{macro}
+% Save some characters definitions.
+% \begin{macro}{\rmathbr@superscript@std}
% \begin{macrocode}
-\ifnum\catcode`\^=12%
- \begingroup%
- \catcode`\^\active
- \global\let\rmathbr@superscript@text=^%
- \endgroup%
-\else%
- \let\rmathbr@superscript@text=^%
-\fi
-\ifnum\catcode`\_=12%
- \begingroup%
- \catcode`\_\active
- \global\let\rmathbr@subscript@text=_%
- \endgroup%
-\else%
- \let\rmathbr@subscript@text=_%
-\fi
+\begingroup\catcode`\^=7 \global\let\rmathbr@superscript@std=^\endgroup
% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}{\rmathbr@superscript}
+% \begin{macro}{\rmathbr@superscript@other}
% \begin{macrocode}
-\def\rmathbr@superscript#1{\rmathbr@superscript@text{{#1}}}
+\begingroup\catcode`\^=12\global\let\rmathbr@superscript@other=^\endgroup
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\rmathbr@subscript@std}
+% \begin{macrocode}
+\begingroup\catcode`\_=8 \global\let\rmathbr@subscript@std=_\endgroup
+% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}{\rmathbr@subscript}
+% \begin{macro}{\rmathbr@subscript@other}
% \begin{macrocode}
-\def\rmathbr@subscript#1{\rmathbr@subscript@text{{#1}}}
+\begingroup\catcode`\_=12\global\let\rmathbr@subscript@other=_\endgroup
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\rmathbr@prime}
% \begin{macrocode}
-\begingroup
- \catcode`\^\active\gdef^{\rmathbr@superscript}
- \catcode`\_\active\gdef_{\rmathbr@subscript}
-\endgroup
+\begingroup\catcode`\'=12\global\let\rmathbr@prime='\endgroup
% \end{macrocode}
-% Save existing commands.
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@superscript}
% \begin{macrocode}
-\begingroup\catcode`\_=13\catcode`\^=13\lowercase{\endgroup
-\AtBeginDocument%
-{%
- \ifnum\catcode`\^=13
- \let\rmathbr@superscript@text@active=^
- \DeclareRobustCommand{\rmathbrsuperscript}[1]{\rmathbr@superscript@text@active{{#1}}}
- \else
- \DeclareRobustCommand{\rmathbrsuperscript}[1]{\rmathbr@superscript@text{{#1}}}
- \fi
- \def^{\rmathbrsuperscript}
- \def\rmathbr@superscript@macro{\rmathbrsuperscript}
- \ifnum\catcode`\_=13
- \let\rmathbr@subscript@text@active=_
- \DeclareRobustCommand{\rmathbrsubscript}[1]{\rmathbr@subscript@text@active{{#1}}}
- \else
- \DeclareRobustCommand{\rmathbrsubscript}[1]{\rmathbr@subscript@text{{#1}}}
- \fi
- \def_{\rmathbrsubscript}
- \def\rmathbr@subscript@macro{\rmathbrsubscript}
-}}
+\def\rmathbr@superscript{\rmathbr@check@arg\rmathbr@superscript@std}
% \end{macrocode}
-% Process options.
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@subscript}
% \begin{macrocode}
-\DeclareOption{mathactivechars}%
-{
- \catcode`\^=12\catcode`\_=12
-}
-\DeclareOption{activechars}%
-{
- \catcode`\^\active\catcode`\_\active
-}
-\DeclareOption{noactivechars}%
-{
- \catcode`\^=7\catcode`\_=8
+\def\rmathbr@subscript{\rmathbr@check@arg\rmathbr@subscript@std}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@check@arg}
+% Check that argument is rmathbr-processed command and wrap it into braces
+% (if necessary)
+% \begin{macrocode}
+\def\rmathbr@check@arg#1{%
+ \let\rmathbr@checkarg@cmd=#1
+ \futurelet\rmathbr@let@token\rmathbr@check@@arg%
}
-\ExecuteOptions{mathactivechars}%
-\ProcessOptions
% \end{macrocode}
-% Basic math.
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@check@@arg}
% \begin{macrocode}
-\begingroup
- \catcode`\=\active
- \ifnum\mathcode`\=<32768
- \xdef={\noexpand\brokenbin{\mathchar\number\mathcode`\=}}
- \else
- \gdef={\brokenbin{\mathchar12349}}
- \fi
-\endgroup
-\begingroup
- \catcode`\+\active
- \ifnum\mathcode`\+<32768
- \xdef+{\noexpand\brokenbin{\mathchar\number\mathcode`\+}}
- \else
- \gdef+{\brokenbin{\mathchar8235}}
- \fi
-\endgroup
-\begingroup
- \catcode`\-\active
- \ifnum\mathcode`\-<32768
- \xdef-{\noexpand\brokenbin{\mathchar\number\mathcode`\-}}
- \else
- \gdef-{\brokenbin{\mathchar8704}}
- \fi
-\endgroup
-\begingroup
- \catcode`\*\active
- \ifnum\mathcode`\*<32768
- \xdef*{\noexpand\brokenbin{\mathchar\number\mathcode`\*}}
- \else
- \gdef*{\brokenbin{\mathchar8707}}
- \fi
-\endgroup
-\begingroup
- \ifnum\mathcode`\<<32768
- \catcode`\<\active
- \xdef<{\noexpand\brokenbin{\mathchar\number\mathcode`\<}}
- \else
- \catcode`\<\active
- \gdef<{\brokenbin{\mathchar12604}}
- \fi
-\endgroup
-\begingroup
- \catcode`\>\active
- \ifnum\mathcode`\><32768
- \xdef>{\noexpand\brokenbin{\mathchar\number\mathcode`\>}}
- \else
- \gdef>{\brokenbin{\mathchar12606}}
+\def\rmathbr@check@@arg#1{%
+ \let\rmathbr@command=\rmathbr@wrap@arg
+ \ifx\rmathbr@let@token\bgroup\else
+ \edef\rmathbr@orig{\expandafter\@gobble\string#1}
+ \ifx\rmathbr@orig\empty\else
+ \expandafter\ifx\csname rmathbr@orig@\rmathbr@orig\endcsname\relax
+ \let\rmathbr@command=\@firstofone
+ \fi
+ \fi
\fi
-\endgroup
-\begingroup
- \catcode`\(\active
- \xdef({\mathopen\delimiter\number\delcode`\(\noexpand\nobr }
-\endgroup
-\begingroup
- \catcode`\[\active %\]
- \xdef[{\mathopen\delimiter\number\delcode`\[\noexpand\nobr }
-\endgroup
-\AtBeginDocument%
-{
- \mathcode`\==32768% "8000
- \mathcode`\<=32768
- \mathcode`\>=32768
- \mathcode`\+=32768
- \mathcode`\-=32768
- \mathcode`\*=32768
- \mathcode`\_=32768
- \mathcode`\^=32768
- \mathcode`\(=32768
- \mathcode`\[=32768 %\]
- \mathcode`\:=32768
- \mathcode`\,=32768
- \mathcode`\;=32768
- \let\rmathbr@orig@resetMathstrut=\resetMathstrut@
- \begingroup
- \gdef\resetMathstrut@
- {
- \mathcode`\(=16424% "4028
- \rmathbr@orig@resetMathstrut
- \mathcode`\(=32768% "8000
- }
- \gdef\newmcodes@
- {
- \mathcode`\'=39
- \mathcode`\*=42
- \mathcode`\.=24890% "613A
- \mathcode`\-=45
- \mathcode`\/=47
- \mathcode`\:=24634% "603A
- \relax
- }
- \endgroup%
+ \rmathbr@checkarg@cmd\rmathbr@command{#1}%
}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@wrap@arg}
+% \begin{macrocode}
+\def\rmathbr@wrap@arg#1{{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% Setup sub- and superscripts.
+% \begin{macrocode}
\begingroup
- \catcode`\:\active \gdef:{\futurelet\rmathbr@let@token\rmathbr@colontest}
+ \catcode`\^\active\gdef^{\rmathbr@superscript}
+ \catcode`\_\active\gdef_{\rmathbr@subscript}
\endgroup
% \end{macrocode}
%
-% \begin{macro}{\rmathbr@colontest}
-% Check for \verb|:=|.
% \begin{macrocode}
-\def\rmathbr@colontest%
-{
- \ifx=\rmathbr@let@token
- \expandafter\rmathbr@letsign
- \else
- \expandafter\rmathbr@colon
- \fi
-}%
-\ifnum\mathcode`\:<32768
- \edef\rmathbr@letsign#1{\noexpand\brokenrel{\mathchar\number\mathcode`\:\mathchar\number\mathcode`\=}}
- \edef\rmathbr@colon{\noexpand\brokenrel{\mathchar\number\mathcode`\:}}
+\newif\ifrmathbr@activemathchar
+% \end{macrocode}
+% Check for XeTeX/LuaTeX
+% \begin{macrocode}
+\ifx\Umathcode\@undefined
+% \end{macrocode}
+% Standard TeX
+% \begin{macro}{\rmathbr@checkmathchar}
+% \begin{macrocode}
+ \def\rmathbr@checkmathchar#1{%
+ \ifnum\mathcode#1<32768\relax%
+ \rmathbr@activemathcharfalse%
+ \else%
+ \rmathbr@activemathchartrue%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@mathchar}
+% \begin{macrocode}
+ \def\rmathbr@mathchar#1{\mathchar\number\mathcode#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@makeactivemathopen}
+% \begin{macrocode}
+ \def\rmathbr@makeactivemathopen#1{%
+ \begingroup
+ \xdef\@tempa{\mathopen\delimiter\number\delcode#1 \noexpand\nobr }
+ \begingroup\lccode`~=#1\catcode#1\active\lowercase{\endgroup\xdef~}{\@tempa}
+ \endgroup
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ }
\else
- \def\rmathbr@letsign#1{\brokenrel{\mathchar12346\mathchar12349}}
- \def\rmathbr@colon{\brokenrel{\mathchar12346}}
-\fi
+% \end{macrocode}
+% XeTeX/LuaTeX
+% \begin{macro}{\rmathbr@activemathcode}
+% \begin{macrocode}
+ \begingroup
+ \mathcode`\+="8000
+ \xdef\rmathbr@activemathcode{\number\Umathcodenum`\+}
+ \endgroup
% \end{macrocode}
% \end{macro}
%
-% Check for 'icomma' package and 'eulervm' package with 'icomma' option.
+% \begin{macro}{\rmathbr@checkmathchar}
% \begin{macrocode}
-\begingroup
- \catcode`\,\active
- \@ifpackageloaded{icomma}% check for 'icomma' package
- {
- \expandafter\gdef\expandafter\sm@rtcomma\expandafter{\sm@rtcomma\nobr}
- }{
- \ifx\domathcomma\undefined% check for 'eulervm' package with 'icomma' option
- \ifnum\mathcode`\,<32768
- \xdef,{\mathpunct\mathchar\number\mathcode`\,\noexpand\nobr }
+ \def\rmathbr@checkmathchar#1{%
+ \ifnum\Umathcodenum#1=\rmathbr@activemathcode\relax%
+ \expandafter\rmathbr@activemathchartrue%
+ \else%
+ \expandafter\rmathbr@activemathcharfalse%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@mathchar}
+% \begin{macrocode}
+ \def\rmathbr@mathchar#1{\Umathcharnum\number\Umathcodenum#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@truncdiv}
+% \begin{macrocode}
+ \def\rmathbr@truncdiv#1#2{((#1-(#2-1)/2)/#2)}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@modulo}
+% \begin{macrocode}
+ \def\rmathbr@modulo#1#2{(#1-\rmathbr@truncdiv{#1}{#2}*#2)}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@makeactivemathopen}
+% \begin{macrocode}
+ \def\rmathbr@makeactivemathopen#1{%
+ \begingroup
+ \def\@tempa{\Udelcodenum#1}
+ \ifnum\@tempa<"1000000
+ \xdef\@tempb{\mathopen\delimiter\number\@tempa\space\noexpand\nobr }
\else
- \gdef,{\mathpunct\mathchar24891\nobr }
+ \xdef\@tempb{\mathopen\Udelimiter4 %
+\number\numexpr\rmathbr@truncdiv{\rmathbr@modulo{\@tempa}{"40000000}}{"200000}\relax%
+\space\number\numexpr\rmathbr@modulo{\@tempa}{"200000}\relax\noexpand\nobr }
\fi
+ \begingroup\lccode`~=#1\catcode#1\active\expandafter\lowercase\expandafter%
+{\expandafter\endgroup\expandafter\gdef\expandafter~\expandafter}\expandafter{\@tempb}
+ \endgroup
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ }
+\fi
+% \end{macrocode}
+%
+% \begin{macro}{\rmathbr@makeactivemath}
+% \begin{macrocode}
+\def\rmathbr@makeactivemath#1#2#3{
+ \begingroup
+ \rmathbr@checkmathchar{#1}
+ \lccode`~=#1
+ \catcode#1\active
+ \ifrmathbr@activemathchar
+ \PackageWarning{rmathbr}{Redeclare active math #1 symbol to default mathchar value}
+ \lowercase{\gdef~}{#2{#3}}
\else
- \expandafter\gdef\expandafter\domathcomma\expandafter{\domathcomma\nobr}
+ \lowercase{\xdef~}{\noexpand#2{\rmathbr@mathchar{#1}}}
\fi
- }
-\endgroup
+ \endgroup
+}
% \end{macrocode}
+% \end{macro}
%
-% Check for 'program' package.
+% \begin{macro}{\rmathbr@makeactivemathpunct}
% \begin{macrocode}
-\begingroup
- \catcode`\;\active
- \@ifpackageloaded{program}%
- {
- \gdef;{\ifmmode\semicolon\;\nobr\else\@semicolon\fi}
- }{
- \ifnum\mathcode`\;<32768
- \xdef;{\mathpunct\mathchar\number\mathcode`\;\noexpand\nobr }
+\def\rmathbr@makeactivemathpunct#1#2{
+ \begingroup
+ \rmathbr@checkmathchar{#1}
+ \lccode`~=#1
+ \catcode#1\active
+ \ifrmathbr@activemathchar
+ \PackageWarning{rmathbr}{Redeclare active math #1 symbol to default mathchar value}
+ \lowercase{\gdef~}{\mathpunct#2\nobr }
\else
- \gdef;{\mathpunct\mathchar24635\nobr }
+ \lowercase{\xdef~}{\mathpunct\rmathbr@mathchar{#1} \noexpand\nobr }
\fi
- }
-\endgroup
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\newif\ifrmathbr@protected
+% \end{macrocode}
+%
+% \begin{macro}{\rmathbr@str@contains}
+% \begin{macrocode}
+\def\rmathbr@str@contains#1#2{\begingroup\edef\x{\endgroup\noexpand\in@{#1}{#2}}\x}
% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@ifprotected}
+% \begin{macrocode}
+\def\rmathbr@ifprotected#1{%
+ \rmathbr@protectedfalse
+ \edef\meaning@cmd{\meaning#1}
+ \rmathbr@str@contains{\string#1\space}\meaning@cmd
+ \ifin@
+ \rmathbr@str@contains{\string\protect\space}\meaning@cmd
+ \ifin@\rmathbr@protectedtrue\else
+ \rmathbr@str@contains{\string\x@protect\space}\meaning@cmd
+ \ifin@\rmathbr@protectedtrue\else
+ \rmathbr@str@contains{\string\@testopt\space}\meaning@cmd
+ \ifin@\rmathbr@protectedtrue\else
+ \rmathbr@str@contains{\string\@protected@testopt\space}\meaning@cmd
+ \ifin@\rmathbr@protectedtrue\fi
+ \fi
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\rmathbr@ReDeclareRobustCommand}
+% Command without arguments
% \begin{macrocode}
-\def\rmathbr@ReDeclareRobustCommand#1#2% Command without arguments
-{
+\def\rmathbr@ReDeclareRobustCommand#1#2{%
\begingroup
- \ifx#1\undefined
+ \ifx#1\@undefined
\else
\edef\var@orig@I{rmathbr@orig@\expandafter\@gobble\string#1}
\edef\var@Ispace{\expandafter\@gobble\string#1 }
\expandafter\ifx\csname\var@orig@I\endcsname\relax
- \expandafter\ifx\csname\var@Ispace\endcsname\relax
- \global\expandafter\let\csname\var@orig@I\endcsname#1
+ \ifetex
+ \expandafter\global\expandafter\let\csname\var@orig@I\endcsname#1
\else
- \global\expandafter\let\csname\var@orig@I\expandafter\endcsname\csname\var@Ispace\endcsname
+ \rmathbr@ifprotected#1
+ \ifrmathbr@protected
+ \expandafter\global\expandafter\let\csname\var@orig@I\expandafter\endcsname%
+\csname\var@Ispace\endcsname
+ \else
+ \expandafter\global\expandafter\let\csname\var@orig@I\endcsname#1
+ \fi
\fi
\fi
- \expandafter\gdef\csname\var@Ispace\endcsname{#2}% no arguments
- \xdef#1{\noexpand\protect\expandafter\noexpand\csname\var@Ispace\endcsname}
+ \ifetex
+ \protected\gdef#1{#2}
+ \else
+ \expandafter\gdef\csname\var@Ispace\endcsname{#2}% no arguments
+ \xdef#1{\noexpand\protect\expandafter\noexpand\csname\var@Ispace\endcsname}
+ \fi
\fi
\endgroup%
}
@@ -622,161 +960,207 @@
% \end{macro}
%
% \begin{macro}{\rmathbr@ReDeclareRobustCommandI}
+% Command with one argument
% \begin{macrocode}
-\def\rmathbr@ReDeclareRobustCommandI#1#2% Command with one argument
-{
+\def\rmathbr@ReDeclareRobustCommandI#1#2{%
\begingroup
- \ifx#1\undefined
+ \ifx#1\@undefined
\else
\edef\var@orig@I{rmathbr@orig@\expandafter\@gobble\string#1}
- \edef\var@Ispace{\expandafter\@gobble\string#1 }
+ \edef\var@Ispace{\expandafter\@gobble\string#1\space}
\expandafter\ifx\csname\var@orig@I\endcsname\relax
- \expandafter\ifx\csname\var@Ispace\endcsname\relax
- \global\expandafter\let\csname\var@orig@I\endcsname#1
+ \ifetex
+ \expandafter\global\expandafter\let\csname\var@orig@I\endcsname#1
\else
- \global\expandafter\let\csname\var@orig@I\expandafter\endcsname\csname\var@Ispace\endcsname
+ \rmathbr@ifprotected#1
+ \ifrmathbr@protected
+ \expandafter\global\expandafter\let\csname\var@orig@I\expandafter\endcsname%
+\csname\var@Ispace\endcsname
+ \else
+ \expandafter\global\expandafter\let\csname\var@orig@I\endcsname#1
+ \fi
\fi
\fi
- \expandafter\gdef\csname\var@Ispace\endcsname##1{#2}% one argument
- \xdef#1{\noexpand\protect\expandafter\noexpand\csname\var@Ispace\endcsname}
+ \ifetex
+ \protected\gdef#1##1{#2}
+ \else
+ \expandafter\gdef\csname\var@Ispace\endcsname##1{#2}% one argument
+ \xdef#1{\noexpand\protect\expandafter\noexpand\csname\var@Ispace\endcsname}
+ \fi
\fi
\endgroup%
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\brokenrel}
+% \begin{macrocode}
+\rmathbr@ReDeclareRobustCommandI{\brokenrel}{\rmathbr@brokenrel{#1}}
+% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}{\rmathbr@setbrokens}
+% \begin{macro}{\brokenbin}
% \begin{macrocode}
-\def\rmathbr@setbrokens%
-{
- \rmathbr@ReDeclareRobustCommandI{\brokenbin}{\rmathbr@brokenbin{##1}}
- \rmathbr@ReDeclareRobustCommandI{\brokenrel}{\rmathbr@brokenrel{##1}}
- \rmathbr@ReDeclareRobustCommandI{\brokeninner}{\rmathbr@brokeninner{##1}}%
-}
+\rmathbr@ReDeclareRobustCommandI{\brokenbin}{\rmathbr@brokenbin{#1}}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\brokeninner}
+% \begin{macrocode}
+\rmathbr@ReDeclareRobustCommandI{\brokeninner}{\rmathbr@brokeninner{#1}}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\let\rmathbr@save@brokenrel=\brokenrel
+\let\rmathbr@save@brokenbin@on=\brokenbin
+\let\rmathbr@save@brokenbin=\brokenbin
+\let\rmathbr@save@brokeninner=\brokeninner
+% \end{macrocode}
%
-% \begin{macro}{\rmathbr@unsetbrokens}
+% \begin{macro}{\rmathbr@brokenbinon}
% \begin{macrocode}
-\def\rmathbr@unsetbrokens%
-{
- \def\brokenbin##1{##1}
- \def\brokenrel##1{##1}
- \def\brokeninner##1{##1}%
+\def\rmathbr@brokenbinon{%
+ \let\rmathbr@save@brokenbin=\rmathbr@save@brokenbin@on
+ \ifx\brokenbin\@firstofone\else
+ \let\brokenbin=\rmathbr@save@brokenbin
+ \fi
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\rmathbr@brokenbinoff}
+% \begin{macrocode}
+\def\rmathbr@brokenbinoff{%
+ \let\rmathbr@save@brokenbin=\mathbin
+ \ifx\brokenbin\@firstofone\else
+ \let\brokenbin=\rmathbr@save@brokenbin
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}{\rmathbr@brokenbin}
+% \begin{macro}{\rmathbr@setbrokens}
% \begin{macrocode}
-\def\rmathbr@brokenbin#1%
-{
- \relax
- \def\rmathbr@arg{#1}
- \def\rmathbr@this{\rmathbr@brokenbin}
- \def\rmathbr@output{\rmathbr@@brokenbin}
- \futurelet\rmathbr@let@token\rmathbr@brokenop%
+\def\rmathbr@setbrokens{%
+ \let\brokenrel=\rmathbr@save@brokenrel
+ \let\brokenbin=\rmathbr@save@brokenbin
+ \let\brokeninner=\rmathbr@save@brokeninner
+ \let\rmathbr@colontest=\rmathbr@save@colontest
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\rmathbr@unsetbrokens}
+% \begin{macrocode}
+\def\rmathbr@unsetbrokens{%
+ \let\brokenrel=\@firstofone
+ \let\brokenbin=\@firstofone
+ \let\brokeninner=\@firstofone
+ \let\rmathbr@colontest=\rmathbr@colon@std
+}
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\rmathbr@brokenrel}
% \begin{macrocode}
-\def\rmathbr@brokenrel#1%
-{
- \relax
+\def\rmathbr@brokenrel#1{%
\def\rmathbr@arg{#1}
- \def\rmathbr@this{\rmathbr@brokenrel}
- \def\rmathbr@output{\rmathbr@@brokenrel}
+ \let\rmathbr@this=\rmathbr@brokenrel
+ \let\rmathbr@output=\rmathbr@@brokenrel
\futurelet\rmathbr@let@token\rmathbr@brokenop%
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\rmathbr@brokenbin}
+% \begin{macrocode}
+\def\rmathbr@brokenbin#1{%
+ \def\rmathbr@arg{#1}
+ \let\rmathbr@this=\rmathbr@brokenbin
+ \let\rmathbr@output=\rmathbr@@brokenbin
+ \futurelet\rmathbr@let@token\rmathbr@brokenop%
+}
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\rmathbr@brokeninner}
% \begin{macrocode}
-\def\rmathbr@brokeninner#1%
-{
- \relax
+\def\rmathbr@brokeninner#1{%
\def\rmathbr@arg{#1}
- \def\rmathbr@this{\rmathbr@brokeninner}
- \def\rmathbr@output{\rmathbr@@brokeninner}
+ \let\rmathbr@this=\rmathbr@brokeninner
+ \let\rmathbr@output=\rmathbr@@brokeninner
\futurelet\rmathbr@let@token\rmathbr@brokenop%
}
% \end{macrocode}
% \end{macro}
%
-%
% \begin{macro}{\rmathbr@mathop}
% \begin{macrocode}
-\def\rmathbr@mathop#1%
-{
- \relax
+\def\rmathbr@mathop#1{%
\def\rmathbr@arg{#1}
- \def\rmathbr@this{\rmathbr@mathop}
- \def\rmathbr@output{\rmathbr@@mathop}
+ \let\rmathbr@this=\rmathbr@mathop
+ \let\rmathbr@output=\rmathbr@@mathop
\futurelet\rmathbr@let@token\rmathbr@brokenop%
}
% \end{macrocode}
% \end{macro}
%
-%
-% \begin{macro}{\rmathbr@@brokenbin}
+% \begin{macro}{\rmathbr@@brokenrel}
+% LuaTeX only supports per-disc-node penalties
% \begin{macrocode}
-\def\rmathbr@@brokenbin#1%
-{
+\def\rmathbr@@brokenrel#1{%
\ifnum\lastpenalty=\relpenalty
- \mathbin{#1}
+ \mathrel{#1}
\else
- \mathbin{#1}
+ \mathrel{#1}
\ifx$\rmathbr@let@token
\else
- \rmathbr@selector{#1}
+ \begingroup
+ \hyphenpenalty\rmathbr@orig@relpenalty
+ \rmathbr@selector{#1}
+ \endgroup
\fi
\fi
\rmathbr@setbrokens
- \penalty\binoppenalty %
+ \penalty\relpenalty %
}
% \end{macrocode}
% \end{macro}
%
-%
-% \begin{macro}{\rmathbr@@brokenrel}
+% \begin{macro}{\rmathbr@@brokenbin}
% \begin{macrocode}
-\def\rmathbr@@brokenrel#1%
-{
+\def\rmathbr@@brokenbin#1{%
\ifnum\lastpenalty=\relpenalty
- \mathrel{#1}
+ \mathbin{#1}
\else
- \mathrel{#1}
+ \mathbin{#1}
\ifx$\rmathbr@let@token
\else
- \rmathbr@selector{#1}
+ \begingroup
+ \hyphenpenalty\rmathbr@orig@binoppenalty
+ \rmathbr@selector{#1}
+ \endgroup
\fi
\fi
\rmathbr@setbrokens
- \penalty\relpenalty %
+ \penalty\binoppenalty %
}
% \end{macrocode}
% \end{macro}
%
-%
% \begin{macro}{\rmathbr@@brokeninner}
% \begin{macrocode}
-\def\rmathbr@@brokeninner#1%
-{
+\def\rmathbr@@brokeninner#1{%
\ifnum\lastpenalty=\relpenalty
\mathinner{#1}
\else
\mathinner{#1}
\ifx$\rmathbr@let@token
\else
- \rmathbr@selector{#1}
+ \begingroup
+ \hyphenpenalty\rmathbr@orig@relpenalty
+ \rmathbr@selector{#1}
+ \endgroup
\fi
\fi
\rmathbr@setbrokens
@@ -785,22 +1169,18 @@
% \end{macrocode}
% \end{macro}
%
-%
% \begin{macro}{\rmathbr@@mathop}
% \begin{macrocode}
-\def\rmathbr@@mathop#1%
-{
+\def\rmathbr@@mathop#1{%
\rmathbr@setbrokens
#1\nobr %
}
% \end{macrocode}
% \end{macro}
%
-%
% \begin{macro}{\rmathbr@selector}
% \begin{macrocode}
-\def\rmathbr@selector#1%
-{
+\def\rmathbr@selector#1{%
\mathchoice
{\discretionary{}{\hbox{$\m@th\displaystyle#1$}}{}}
{\discretionary{}{\hbox{$\m@th\textstyle#1$}}{}}
@@ -809,33 +1189,31 @@
}
% \end{macrocode}
% \end{macro}
-% \begin{macrocode}
-\begingroup\catcode`\_=12\catcode`\^=12
-% \end{macrocode}
%
% \begin{macro}{\rmathbr@brokenop}
% \begin{macrocode}
-\gdef\rmathbr@brokenop%
-{
+\def\rmathbr@brokenop{%
\ifmmode
\rmathbr@unsetbrokens
- \ifx\rmathbr@subscript@macro\rmathbr@let@token
+ \ifx\rmathbr@subscript@std\rmathbr@let@token
\let\@command=\rmathbr@brokenglue
- \else\ifx_\rmathbr@let@token
+ \else\ifx\rmathbr@subscript@other\rmathbr@let@token
\let\@command=\rmathbr@brokenglue
- \else\ifx\rmathbr@superscript@macro\rmathbr@let@token
+ \else\ifx\rmathbr@superscript@std\rmathbr@let@token
\let\@command=\rmathbr@brokenglue
- \else\ifx^\rmathbr@let@token
+ \else\ifx\rmathbr@superscript@other\rmathbr@let@token
\let\@command=\rmathbr@brokenglue
\else\ifx\limits\rmathbr@let@token
\let\@command=\rmathbr@brokenskip
\else\ifx\nolimits\rmathbr@let@token
\let\@command=\rmathbr@brokenskip
+ \else\ifx\rmathbr@prime\rmathbr@let@token
+ \let\@command=\rmathbr@brokenskip
\else\ifx\relax\rmathbr@let@token
\let\@command=\rmathbr@brokenskip
\else
\let\@command=\rmathbr@output
- \fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi
\else
\let\@command=\relax
\fi
@@ -843,14 +1221,10 @@
}
% \end{macrocode}
% \end{macro}
-% \begin{macrocode}
-\endgroup
-% \end{macrocode}
%
% \begin{macro}{\rmathbr@brokenglue}
% \begin{macrocode}
-\def\rmathbr@brokenglue#1#2#3%
-{
+\def\rmathbr@brokenglue#1#2#3{%
\def\rmathbr@temp{#1#2{#3}}
\expandafter\rmathbr@this\expandafter{\rmathbr@temp}%
}
@@ -859,24 +1233,25 @@
%
% \begin{macro}{\rmathbr@brokenskip}
% \begin{macrocode}
-\def\rmathbr@brokenskip#1#2%
-{
+\def\rmathbr@brokenskip#1#2{%
\def\rmathbr@temp{#1#2}
\expandafter\rmathbr@this\expandafter{\rmathbr@temp}%
}
% \end{macrocode}
% \end{macro}
%
+%
+%
% \begin{macro}{\rmathbr@setbreakable}
% \begin{macrocode}
-\def\rmathbr@setbreakable#1#2%
-{
+\def\rmathbr@setbreakable#1#2{%
\begingroup
- \ifx#1\undefined
+ \ifx#1\@undefined
\else
\edef\rmathbr@orig{rmathbr@orig@\expandafter\@gobble\string#1}
\expandafter\ifx\csname\rmathbr@orig\endcsname\relax
- \expandafter\rmathbr@ReDeclareRobustCommand\expandafter#1\expandafter{\expandafter#2\expandafter{\csname\rmathbr@orig\endcsname}}
+ \expandafter\rmathbr@ReDeclareRobustCommand\expandafter#1\expandafter{%
+\expandafter#2\expandafter{\csname\rmathbr@orig\endcsname}}
\fi
\fi
\endgroup%
@@ -886,14 +1261,32 @@
%
% \begin{macro}{\rmathbr@nobrafter}
% \begin{macrocode}
-\def\rmathbr@nobrafter#1%
-{
+\def\rmathbr@nobrafter#1{%
+ \begingroup
+ \ifx#1\@undefined
+ \else
+ \edef\rmathbr@orig{rmathbr@orig@\expandafter\@gobble\string#1}
+ \expandafter\ifx\csname\rmathbr@orig\endcsname\relax
+ \expandafter\rmathbr@ReDeclareRobustCommand\expandafter#1\expandafter{%
+\csname\rmathbr@orig\endcsname\nobr}
+ \fi
+ \fi
+ \endgroup%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@unsetbroken}
+% \begin{macrocode}
+\def\rmathbr@unsetbroken#1{
\begingroup
- \ifx#1\undefined
+ \ifx#1\@undefined
\else
\edef\rmathbr@orig{rmathbr@orig@\expandafter\@gobble\string#1}
\expandafter\ifx\csname\rmathbr@orig\endcsname\relax
- \expandafter\rmathbr@ReDeclareRobustCommand\expandafter#1\expandafter{\csname\rmathbr@orig\endcsname\nobr}
+ \else
+ \expandafter\global\expandafter\let\expandafter#1\csname\rmathbr@orig\endcsname
+ \expandafter\global\expandafter\let\csname\rmathbr@orig\endcsname=\undefined
\fi
\fi
\endgroup%
@@ -903,26 +1296,246 @@
%
% \subsection*{Redeclaration of math signs}
%
+% \begin{macro}{\rmathbr@patch@commands}
+% \begin{macrocode}
+\def\rmathbr@patch@commands{%
+% \end{macrocode}
+% \end{macro}
+%
+% Basic math.
+% \begin{macro}{=}
+% \begin{macrocode}
+\rmathbr@makeactivemath{`\=}{\brokenrel}{\mathchar12349}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{<}
+% \begin{macrocode}
+\rmathbr@makeactivemath{`\<}{\brokenrel}{\mathchar12604}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{>}
+% \begin{macrocode}
+\rmathbr@makeactivemath{`\>}{\brokenrel}{\mathchar12606}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{+}
+% \begin{macrocode}
+\rmathbr@makeactivemath{`\+}{\brokenbin}{\mathchar8235}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{-}
+% \begin{macrocode}
+\ifrmathbr@kv@brokenminus
+ \rmathbr@makeactivemath{`\-}{\brokenbin}{\mathchar8704}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{*}
+% \begin{macrocode}
+\rmathbr@makeactivemath{`\*}{\brokenbin}{\mathchar8707}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{(}
+% \begin{macrocode}
+\rmathbr@makeactivemathopen{`\(}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{[}
+% \begin{macrocode}
+\rmathbr@makeactivemathopen{`\[}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{,}
+% Check for the \textsf{icomma} package and the \textsf{eulervm} package with \verb|icomma| option.
+% \begin{macrocode}
+\@ifpackageloaded{icomma}{%
+ \expandafter\def\expandafter\sm@rtcomma\expandafter{\sm@rtcomma\nobr}
+}{
+ \ifx\domathcomma\@undefined%
+ \rmathbr@makeactivemathpunct{`\,}{\mathchar24891}
+ \else%
+ \expandafter\def\expandafter\domathcomma\expandafter{\domathcomma\nobr}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{;}
+% Check for the \textsf{program} package.
+% \begin{macrocode}
+\@ifpackageloaded{program}{%
+ \begingroup
+ \catcode`\;\active
+ \lccode`\~=`\;%
+ \lowercase{\gdef~}{\ifmmode\semicolon\;\nobr\else\@semicolon\fi}
+ \endgroup
+}{
+ \rmathbr@makeactivemathpunct{`\;}{\mathchar24635}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{:}
+% Some extra code is necessary to distinguish between binary operation |:| and
+% relation |:=|.
+% \begin{macrocode}
+\begingroup%
+ \catcode`\:\active%
+ \lccode`\~=`\:%
+ \lowercase{\gdef~}{\rmathbr@colontest}%
+\endgroup
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@colontest}
+% Check for \verb|:=|.
+% \begin{macrocode}
+\def\rmathbr@colontest{\futurelet\rmathbr@let@token\rmathbr@do@colontest}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rmathbr@do@colontest}
+% \begin{macrocode}
+\def\rmathbr@do@colontest{%
+ \ifx=\rmathbr@let@token
+ \expandafter\rmathbr@letsign
+ \else
+ \expandafter\rmathbr@colon
+ \fi
+}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\rmathbr@checkmathchar{`\:}
+% \end{macrocode}
+% \begin{macrocode}
+\ifrmathbr@activemathchar
+% \end{macrocode}
+% \begin{macrocode}
+ \PackageWarning{rmathbr}{Redeclare active math `\: symbol to default mathchar value}
+% \end{macrocode}
+% \begin{macrocode}
+ \def\rmathbr@colon@std{\mathchar12346}
+% \end{macrocode}
+% \begin{macrocode}
+ \ifrmathbr@kv@brokencolon
+ \def\rmathbr@colon{\brokenbin{\rmathbr@colon@std}}
+ \else
+ \def\rmathbr@colon{\mathbin{\rmathbr@colon@std}}
+ \fi
+% \end{macrocode}
+% \begin{macrocode}
+ \def\rmathbr@letsign##1{\brokenrel{\rmathbr@colon@std\mathchar12349}}
+% \end{macrocode}
+% \begin{macrocode}
+\else
+% \end{macrocode}
+% \begin{macrocode}
+ \edef\rmathbr@colon@std{\rmathbr@mathchar{`\:}}
+% \end{macrocode}
+% \begin{macrocode}
+ \ifrmathbr@kv@brokencolon
+ \def\rmathbr@colon{\brokenbin{\rmathbr@colon@std}}
+ \else
+ \def\rmathbr@colon{\mathbin{\rmathbr@colon@std}}
+ \fi
+% \end{macrocode}
+% \begin{macrocode}
+ \edef\rmathbr@letsign##1{\noexpand\brokenrel{\rmathbr@colon@std\rmathbr@mathchar{`\=}}}
+% \end{macrocode}
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+% \begin{macrocode}
+\let\rmathbr@save@colontest=\rmathbr@colontest%
+% \end{macrocode}
+% Support of \textsf{unicode-math} package
+% \begin{macrocode}
+\@ifpackageloaded{unicode-math}{
+ \begingroup
+ \def\UnicodeMathSymbol##1##2##3##4{%
+ \ifnum\number##1>127\relax
+ \expandafter\let\expandafter\@char\Uchar\number##1\relax
+ \ifx\@char##2\relax
+ \let\cmd\relax
+ \ifx##3\mathrel
+ \def\cmd{\brokenrel}
+ \else\ifx##3\mathbin
+ \def\cmd{\brokenbin}
+ \else\ifx##3\mathop
+ \def\cmd{\rmathbr@mathop}
+ \else\ifx##3\mathpunct
+ \let\cmd=\nobr
+ \fi\fi\fi\fi
+ \ifx\cmd\relax\else
+ \edef\var@orig@name{rmathbr@orig@\expandafter\@gobble\string##2}
+ \expandafter\def\expandafter\var@orig\expandafter{\csname\var@orig@name\endcsname}
+ \rmathbr@checkmathchar{\number##1}
+ \ifrmathbr@activemathchar
+ \begingroup
+ \lccode`~=\number##1
+ \catcode\number##1\active
+ \lowercase{\endgroup\expandafter\global\expandafter\let\var@orig~}
+ \else
+ \expandafter\xdef\var@orig{\rmathbr@mathchar{\number##1}}
+ \global\mathcode\number##1="8000
+ \fi
+ \ifx\cmd\nobr
+ \edef\@tempa{\expandafter\noexpand\var@orig\noexpand\nobr}
+ \else
+ \edef\@tempa{\expandafter\noexpand\cmd{\expandafter\noexpand\var@orig}}
+ \fi
+ \begingroup
+ \lccode`~=\number##1
+ \catcode\number##1\active
+ \lowercase{\endgroup\expandafter\gdef\expandafter~\expandafter}{\@tempa}
+ \fi
+ \fi
+ \fi
+ }
+ \let\par=\relax
+ \catcode`\"=12
+ \@@input{unicode-math-table.tex}
+ \endgroup
+ \ifnum\rmathbr@kv@scriptsmode>0\relax
+ \rmathbr@unicodemath@primes@patch
+ \fi
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\not}
% Redeclare \verb|\not|.
% \begin{macrocode}
-\rmathbr@ReDeclareRobustCommandI{\not}%
-{
+\rmathbr@ReDeclareRobustCommandI{\not}{%
\begingroup
- \edef\rmathbr@orig{rmathbr@orig@\expandafter\@gobble\string#1}
- \expandafter\ifx\csname\rmathbr@orig\endcsname\relax
- \brokenrel{\rmathbr@orig@not#1}
+ \edef\rmathbr@orig{rmathbr@orig@\expandafter\@gobble\string##1}
+ \expandafter\let\expandafter\rmathbr@origmacro\csname\rmathbr@orig\endcsname
+ \ifx\rmathbr@origmacro##1\relax
+ \begingroup
+ \let##1=\rmathbr@origmacro
+ \brokenrel{\rmathbr@orig@not##1}
+ \endgroup
\else
- \expandafter\brokenrel\expandafter{\expandafter\rmathbr@orig@not\csname\rmathbr@orig\endcsname}
+ \brokenrel{\rmathbr@orig@not##1}
\fi
\endgroup%
}
% \end{macrocode}
+% \end{macro}
% Open brackets.
% \begin{macrocode}
-\rmathbr@ReDeclareRobustCommandI{\bigl}{\rmathbr@mathop{\mathopen\big#1}}
-\rmathbr@ReDeclareRobustCommandI{\Bigl}{\rmathbr@mathop{\mathopen\Big#1}}
-\rmathbr@ReDeclareRobustCommandI{\biggl}{\rmathbr@mathop{\mathopen\bigg#1}}
-\rmathbr@ReDeclareRobustCommandI{\Biggl}{\rmathbr@mathop{\mathopen\Bigg#1}}
+\rmathbr@ReDeclareRobustCommandI{\bigl}{\rmathbr@mathop{\mathopen\big##1}}
+\rmathbr@ReDeclareRobustCommandI{\Bigl}{\rmathbr@mathop{\mathopen\Big##1}}
+\rmathbr@ReDeclareRobustCommandI{\biggl}{\rmathbr@mathop{\mathopen\bigg##1}}
+\rmathbr@ReDeclareRobustCommandI{\Biggl}{\rmathbr@mathop{\mathopen\Bigg##1}}
\SetOpenBracket{\lmoustache}
\SetOpenBracket{\langle}
\SetOpenBracket{\lbrace}
@@ -960,7 +1573,6 @@
\SetPunctuation{\colon}
\SetPunctuation{\period}
% \end{macrocode}
-%
% Binary Operations.
% \begin{macrocode}
\SetBreakableBin{\triangleleft}
@@ -997,65 +1609,73 @@
\SetBreakableBin{\cdot}
% \end{macrocode}
%
-% \begin{macro}{\cdott}
+% \begin{macro}{\rmathbr@cdott}
% \verb|\cdott| is \verb|\cdot| that is changed to \verb|\times| at break point.
% \begin{macrocode}
\def\rmathbr@cdott{%
- %% inplace-expanded mathchoice from mathstyle.sty
- \mathchoice{%
- \mkern\medmuskip$%
- \discretionary{\the\textfont2\char2}{\the\textfont2\char2}{\the\textfont2\char1}%
- $\displaystyle\mkern\medmuskip%
- }{%
- \mkern\medmuskip$%
- \discretionary{\the\textfont2\char2}{\the\textfont2\char2}{\the\textfont2\char1}%
- $\textstyle\mkern\medmuskip%
- }{%
- $%
- \discretionary{\the\scriptfont2\char2}{\the\scriptfont2\char2}{\the\scriptfont2\char1}%
- $\scriptstyle%
- }{%
- $%
- \discretionary{\the\scriptscriptfont2\char2}{\the\scriptscriptfont2\char2}{\the\scriptscriptfont2\char1}%
- $\scriptscriptstyle%
- }
+ $\begingroup\hyphenpenalty\rmathbr@orig@binoppenalty\discretionary%
+ {\hbox{$\m@th\rmathbr@orig@times$}}%
+ {\hbox{$\m@th\rmathbr@orig@times$}}%
+ {\hbox{$\m@th\mkern\medmuskip\rmathbr@orig@cdot\mkern\medmuskip$}}\endgroup$
}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cdott}
+% \begin{macrocode}
\def\cdott{%
- \ensuremath
- \ifetex
- \ifinner%
- \ifnum\currentgrouptype=15\relax
- \rmathbr@cdott
+ \ifmmode
+ \ifetex
+ \ifinner%
+ \ifnum\currentgrouptype=15\relax
+ \rmathbr@cdott
+ \else
+ \rmathbr@orig@cdot
+ \fi
\else
- \cdot
+ \rmathbr@orig@cdot
\fi
\else
- \cdot
+ \rmathbr@cdott
\fi
\else
- \rmathbr@cdott
+ \rmathbr@orig@cdot
\fi
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\cdot}
+% \begin{macrocode}
+\ifrmathbr@kv@cdottimes
+ \let\cdot\cdott
+\fi
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\*}
% \begin{macrocode}
\def\*{\mathbin{}%
- \mathchoice{%
- \discretionary{\hbox{$\m@th\displaystyle\times$}}{\hbox{$\m@th\displaystyle\times$}}{}%
- }{%
- \discretionary{\hbox{$\m@th\textstyle\times$}}{\hbox{$\m@th\textstyle\times$}}{}%
- }{%
- \discretionary{\hbox{$\m@th\scriptstyle\times$}}{\hbox{$\m@th\scriptstyle\times$}}{}%
- }{%
- \discretionary{\hbox{$\m@th\scriptscriptstyle\times$}}{\hbox{$\m@th\scriptscriptstyle\times$}}{}%
- }%
+ \begingroup%
+ \hyphenpenalty\rmathbr@orig@binoppenalty%
+ \mathchoice{%
+ \discretionary{\hbox{$\m@th\displaystyle\mkern\thinmuskip\times$}}%
+{\hbox{$\m@th\displaystyle\times\mkern\thinmuskip$}}{}%
+ }{%
+ \discretionary{\hbox{$\m@th\textstyle\mkern\thinmuskip\times$}}%
+{\hbox{$\m@th\textstyle\times\mkern\thinmuskip$}}{}%
+ }{%
+ \discretionary{\hbox{$\m@th\scriptstyle\mkern\thinmuskip\times$}}%
+{\hbox{$\m@th\scriptstyle\times\mkern\thinmuskip$}}{}%
+ }{%
+ \discretionary{\hbox{$\m@th\scriptscriptstyle\mkern\thinmuskip\times$}}%
+{\hbox{$\m@th\scriptscriptstyle\times\mkern\thinmuskip$}}{}%
+ }%
+ \endgroup%
\penalty\binoppenalty%
}
% \end{macrocode}
% \end{macro}
-%
% Relations.
% \begin{macrocode}
\SetBreakableRel{\propto}
@@ -1123,7 +1743,7 @@
\SetBreakableRel{\hookrightarrow}
\SetBreakableRel{\rightleftharpoons}
% \end{macrocode}
-% From latexsym.
+% Commands from \textsf{latexsym}.
% \begin{macrocode}
\SetBreakableBin{\lhd}
\SetBreakableBin{\unlhd}
@@ -1134,10 +1754,9 @@
\SetBreakableRel{\sqsubset}
\SetBreakableRel{\sqsupset}
% \end{macrocode}
-% amsfonts
+% Support \textsf{amsfonts} package
% \begin{macrocode}
-\@ifpackageloaded{amsfonts}% amsfonts
-{
+\@ifpackageloaded{amsfonts}{
\SetBreakableRel{\dashrightarrow} \SetBreakableRel{\dasharrow}
\SetBreakableRel{\dashleftarrow}
\SetBreakableRel{\vartriangleright}
@@ -1147,10 +1766,9 @@
\SetBreakableRel{\rightsquigarrow} \SetBreakableRel{\leadsto}
}{}
% \end{macrocode}
-% amssymb
+% Support \textsf{amssymb} package
% \begin{macrocode}
-\@ifpackageloaded{amssymb}% amssymb
-{
+\@ifpackageloaded{amssymb}{
\SetBreakableBin{\boxdot}
\SetBreakableBin{\boxplus}
\SetBreakableBin{\boxtimes}
@@ -1330,10 +1948,9 @@
\SetBreakableRel{\backepsilon}
}{}
% \end{macrocode}
-% amstex
+% Support \textsf{amstex} package
% \begin{macrocode}
-\@ifpackageloaded{amstex}% amstex
-{
+\@ifpackageloaded{amstex}{
\SetBreakableRel{\vartriangleright} \SetBreakableRel{\rhd}
\SetBreakableRel{\vartriangleleft} \SetBreakableRel{\lhd}
\SetBreakableRel{\trianglerighteq} \SetBreakableRel{\unrhd}
@@ -1341,10 +1958,9 @@
\SetBreakableRel{\rightsquigarrow} \SetBreakableRel{\leadsto}
}{}
% \end{macrocode}
-% boisik
+% Support \textsf{boisik} package
% \begin{macrocode}
-\@ifpackageloaded{boisik}% boisik
-{
+\@ifpackageloaded{boisik}{
\SetMathOperator{\intup}
\SetOpenBracket{\binampersand}
\SetBreakableRel{\upharpoonright}
@@ -1745,10 +2361,9 @@
\SetBreakableRel{\leftrightarrowtriangle}
}{}
% \end{macrocode}
-% euler
+% Support \textsf{euler} package
% \begin{macrocode}
-\@ifpackageloaded{euler}% euler
-{
+\@ifpackageloaded{euler}{% euler
\SetBreakableRel{\uparrow}
\SetBreakableRel{\downarrow}
\SetBreakableRel{\updownarrow}
@@ -1759,10 +2374,9 @@
% \SetBreakableRel{\rhook}
}{}
% \end{macrocode}
-% fourier
+% Support \textsf{fourier} package
% \begin{macrocode}
-\@ifpackageloaded{fourier}% fourier
-{
+\@ifpackageloaded{fourier}{
\SetMathOperator{\iint}
\SetMathOperator{\iiint}
\SetMathOperator{\oiint}
@@ -1793,10 +2407,9 @@
}{}
% \end{macrocode}
%
-% Lucida font (lucbmath,lucidabr,lucmin,lucmtime,luctime)
-%
+% Support Lucida font packages (\textsf{lucbmath}, \textsf{lucidabr}, \textsf{lucmin},
+% \textsf{lucmtime}, \textsf{luctime})
% \begin{macrocode}
-
\ifnum\@ifpackageloaded{lucbmath}{1}{%
\@ifpackageloaded{lucidabr}{1}{%
\@ifpackageloaded{lucmin}{1}{%
@@ -2005,36 +2618,52 @@
\SetBreakableRel{\backepsilon}
\fi
% \end{macrocode}
-% mathbbol
+% Support \textsf{mathbbol} package
% \begin{macrocode}
-\@ifpackageloaded{mathbbol}% mathbbol
-{
+\@ifpackageloaded{mathbbol}{
\SetOpenBracket{\Langle}
\SetOpenBracket{\Lparen}
}{}
% \end{macrocode}
-% mdwmath
+% Support \textsf{mathtools}/\textsf{empheq} packages
+% \begin{macrocode}
+\@ifpackageloaded{mathtools}{
+ \SetBreakableRel{\vcentcolon}
+ \SetBreakableRel{\dblcolon}
+ \SetBreakableRel{\coloneqq}
+ \SetBreakableRel{\Coloneqq}
+ \SetBreakableRel{\coloneq}
+ \SetBreakableRel{\Coloneq}
+ \SetBreakableRel{\eqqcolon}
+ \SetBreakableRel{\Eqqcolon}
+ \SetBreakableRel{\eqcolon}
+ \SetBreakableRel{\Eqcolon}
+ \SetBreakableRel{\colonapprox}
+ \SetBreakableRel{\Colonapprox}
+ \SetBreakableRel{\colonsim}
+ \SetBreakableRel{\Colonsim}
+}{}
+% \end{macrocode}
+% Support \textsf{mdwmath} package
% \begin{macrocode}
-\@ifpackageloaded{mdwmath}% mdwmath
-{
+\@ifpackageloaded{mdwmath}{
\SetBreakableBin{\bitand}
\begingroup
- \catcode`\&\active \xdef&{\noexpand\brokenbin{\mathchar\number\mathcode`\&}}
+ \catcode`\&\active
+ \xdef&{\noexpand\brokenbin{\rmathbr@mathchar{`\&}}}
\endgroup
\AtBeginDocument{\mathcode`\&=32768 }
}{}
% \end{macrocode}
-% sbmm
+% Support \textsf{sbmm} package
% \begin{macrocode}
-\@ifpackageloaded{sbbm}% sbbm
-{
+\@ifpackageloaded{sbbm}{
\SetOpenBracket{\Lparen}
}{}
% \end{macrocode}
-% stmaryrd
+% Support \textsf{stmaryrd} package
% \begin{macrocode}
-\@ifpackageloaded{stmaryrd}% stmaryrd
-{
+\@ifpackageloaded{stmaryrd}{
\SetOpenBracket{\Lbag}
\SetOpenBracket{\llparenthesis}
\SetOpenBracket{\binampersand}
@@ -2134,10 +2763,9 @@
\SetBreakableRel{\Longmapsfrom}
}{}
% \end{macrocode}
-% wasysym
+% Support \textsf{wasysym} package
% \begin{macrocode}
-\@ifpackageloaded{wasysym}% wasysym
-{
+\@ifpackageloaded{wasysym}{
\SetMathOperator{\varint}
\SetMathOperator{\iint}
\SetMathOperator{\iiint}
@@ -2153,6 +2781,87 @@
\SetBreakableRel{\logof}
}{}
% \end{macrocode}
+% \begin{macrocode}
+} % \rmathbr@patch@commands
+% \end{macrocode}
+%
+% Execute \verb|\rmathbr@patch@commands| depending on options:
+% \begin{macrocode}
+\ifrmathbr@patch@begindocument
+ \AtBeginDocument{\rmathbr@patch@commands}
+\else
+ \rmathbr@patch@commands
+\fi
+% \end{macrocode}
+%
+% Switch to active math mode at \verb|\begin{document}|
+% \begin{macrocode}
+\AtBeginDocument{%
+ \mathcode`\==32768% "8000
+ \mathcode`\<=32768
+ \mathcode`\>=32768
+ \mathcode`\+=32768
+ \ifrmathbr@kv@brokenminus
+ \mathcode`\-=32768
+ \fi
+ \mathcode`\*=32768
+ \mathcode`\(=32768
+ \mathcode`\[=32768 %\]
+ \mathcode`\,=32768
+ \mathcode`\;=32768
+ \mathcode`\:=32768
+ \@ifundefined{resetMathstrut@}{}{% fix amsmath
+ \let\rmathbr@orig@resetMathstrut=\resetMathstrut@
+ \gdef\resetMathstrut@{%
+ \mathcode`\(=16424% "4028
+ \rmathbr@orig@resetMathstrut
+ \mathcode`\(=32768% "8000
+ }
+ \gdef\newmcodes@{%
+ \mathcode`\'=39
+ \mathcode`\*=42
+ \mathcode`\.=24890% "613A
+ \mathcode`\-=45
+ \mathcode`\/=47
+ \mathcode`\:=24634% "603A
+ \relax
+ }
+ }%
+}
+% \end{macrocode}
+%
+% Patch for \textsf{bm} package:
+% \begin{macrocode}
+\@ifpackageloaded{bm}{%
+ \let\rmathbr@save@bm@general=\bm@general
+ \def\bm@general#1#2#3#4#5{
+ \rmathbr@save@bm@general{#1}{#2}{%
+ \let\nobr\copy
+ \def\brokenrel##1{\unvcopy{\brokenrel{##1}}}
+ \def\brokenbin##1{\unvcopy{\brokenbin{##1}}}
+ \def\brokeninner##1{\unvcopy{\brokeninner{##1}}}
+ \def\rmathbr@mathop##1{\unvcopy{\rmathbr@mathop{##1}}}
+ \begingroup\catcode`\_\active\lccode`\~`\_\lowercase{\endgroup\def~}##1{\unvcopy{_{##1}}}
+ \begingroup\catcode`\^\active\lccode`\~`\^\lowercase{\endgroup\def~}##1{\unvcopy{^{##1}}}
+ #3}{#4}{#5}
+ }
+ \PackageInfo{rmathbr}{Note: 'bm' package has been patched}{}%
+}{}
+% \end{macrocode}
+%
+% Patch for \textsf{xy} package:
+% \begin{macrocode}
+\@ifpackageloaded{xy}{%
+ \ifnum\rmathbr@kv@scriptsmode>0\relax
+ \let\rmathbr@save@xy=\xy
+ \let\rmathbr@save@endxy=\endxy
+ \def\xy{\begingroup\catcode`\^7\catcode`\_8\rmathbr@save@xy}
+ \def\endxy{\rmathbr@save@endxy\endgroup}
+ \PackageInfo{rmathbr}{Note: \string\xy and \string\endxy commands from 'xy'
+ package have been patched}{}%
+ \fi
+}{}
+% \end{macrocode}
%
% \iffalse
%</package>
diff --git a/Master/texmf-dist/source/latex/rmathbr/rmathbr.ins b/Master/texmf-dist/source/latex/rmathbr/rmathbr.ins
index 40f251e4487..ca4c7f2ddc4 100644
--- a/Master/texmf-dist/source/latex/rmathbr/rmathbr.ins
+++ b/Master/texmf-dist/source/latex/rmathbr/rmathbr.ins
@@ -1,4 +1,4 @@
-%% Copyright (C) 2008-2016 by Denis Ryabov <dryabov@yandex.ru>
+%% Copyright (C) 2008-2020 by Denis Ryabov <dryabov@yandex.ru>
%% --------------------------------------------------------------------------
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -25,7 +25,7 @@
This is a generated file.
-Copyright (C) 2008-2016 by Denis Ryabov <dryabov@yandex.ru>
+Copyright (C) 2008-2020 by Denis Ryabov <dryabov@yandex.ru>
--------------------------------------------------------------------------
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
@@ -45,9 +45,9 @@ version 2005/12/01 or later.
\Msg{* To finish the installation you have to move the following *}
\Msg{* file into a directory searched by TeX: *}
\Msg{* *}
-\Msg{* rmathbr.sty *}
+\Msg{* rmathbr.sty *}
\Msg{* *}
-\Msg{* To produce the documentation run the file rmathbr.dtx *}
+\Msg{* To produce the documentation run the file rmathbr.dtx *}
\Msg{* through LaTeX. *}
\Msg{* *}
\Msg{* Happy TeXing! *}
diff --git a/Master/texmf-dist/source/latex/schooldocs/schooldocs.dtx b/Master/texmf-dist/source/latex/schooldocs/schooldocs.dtx
new file mode 100644
index 00000000000..284d239bcd5
--- /dev/null
+++ b/Master/texmf-dist/source/latex/schooldocs/schooldocs.dtx
@@ -0,0 +1,987 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+% ----------------------------------------------------------------------
+%
+% This file 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:
+%
+% http://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.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{schooldocs.dtx}
+%</driver>
+%<package>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+%<package>\ProvidesPackage{schooldocs}
+%<*package>
+ [2020/07/13 v1.0 .dtx schooldocs file]
+%</package>
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage[english]{babel}
+\usepackage{lmodern}
+\usepackage{lipsum}
+\usepackage{hyperref}
+\usepackage{boxedminipage2e}
+\usepackage{schooldocs}
+%\usepackage{geometry}
+\geometry{textwidth=355pt,vmarginratio=1:1,hmarginratio=3:2}
+% modified by schoodocs loading, very close from the default geometry used by ltxdoc
+
+\newcommand{\bs}{\textbackslash}
+\setlength{\fboxsep}{13pt}
+\newlength{\mpwd} \setlength{\mpwd}{5.25cm}
+\newenvironment{stylex}{\begin{boxedminipage}[c][1.3\mpwd][t]{\mpwd}\tiny
+ }{\end{boxedminipage}}
+\newcommand*{\centered}[1]{{\setlength{\parskip}{0pt}\par\noindent\hfill
+ #1\hfill\mbox{}}}
+\providecommand\headtitlestyle{\scshape}
+\providecommand\headsubjectstyle{\scshape}
+\providecommand\schoolstyle{\scshape}
+
+%\EnableCrossrefs
+%\CodelineIndex
+%\RecordChanges
+
+\title{The \textsf{schooldocs} package}%\thanks{This document
+% corresponds to \textsf{schooldocs}~\fileversion, dated \filedate.}}
+\subject{Antoine Missier \\ %
+ \texttt{antoine.missier@ac-toulouse.fr}}
+\date{July 13, 2020, \fileversion}
+
+\hypersetup{%
+ colorlinks,
+ linkcolor=blue,
+ pdftitle={schoodocs},
+ pdfsubject={LaTeX package},
+ pdfauthor={Antoine Missier}
+ }
+
+\begin{document}
+ \DocInput{schooldocs.dtx}
+ \PrintChanges
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{792}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% \changes{v0.0}{2010/09/01}{Initial personal version}
+% \changes{v0.1}{2020/01/05}{Initial documentation in french}
+% \changes{v0.2}{2020/05/04}{Examples file}
+% \changes{v1.0}{2020/07/13}{Initial public version with documentation in english}
+%
+% \GetFileInfo{schooldocs.dtx}
+%
+% \maketitle
+%
+% \section{Introduction}
+%
+% The purpose of this package is to provide several layout styles for school documents.
+% It can be used for exercices sheets, exams, course materials.
+% The package sets the page geometry (dimensions of text and margins)
+% and the title typesetting;
+% the various \emph{styles} define the header, footer and title formatting,
+% Many features are freely configurable.
+% Six different styles are proposed which are named:
+% \begin{center} \bfseries
+% \hfill classic \hfill elegant \hfill modern \hfill soft
+% \hfill exam \hfill collection \hfill \mbox{}
+% \end{center}
+% If the document is an exam subject to be completed and returned,
+% we have a particular style, \textbf{identity}, in which
+% left and center parts of the header are replaced by the words
+% \textsf{\identityname} and \textsf{\identityforename}.
+%
+% \medskip
+% The styles are presented in paragraph \ref{par:styles}
+% and the file \href{run:schooldocs-examples.pdf}{\textsf{schooldocs-examples.pdf}}
+% shows the result of each.
+%
+% \section{Usage}
+%
+% \subsection{Choosing a style}
+% After loading the package with |\usepackage{schooldocs}|,
+% we define the style by placing |\pagestyle|\marg{style} in the preamble.
+% This command comes from the package \textsf{fancyhdr} by Piet van Oostrum.
+% It can be placed before of after entering information described in the next subsection.
+%
+% \medskip
+% In the text body, you can change the style of a particular page by placing
+% |\thispagestyle|\marg{style} at the page you want.
+% For example, you can place the command |\thispagestyle{identity}|
+% in an appendix page to render.
+% \subsection{Informations fields}
+%
+% \DescribeMacro{\title}
+% Usually a \LaTeX\ document title is made up of information
+% provided by the macros
+% |\title|, |\date| and |\author|.
+% The |\title| macro has been redefined with an enriched syntax:
+% |\title|\oarg{head}\marg{title}.
+% The optional parameter \meta{head} corresponds to the text displayed in the header
+% instead of \meta{title}.
+% When not provided, the mandatory argument \meta{title} will be used in headers.
+%
+% The macros |\date| and |\author| have not been redefined but the information provided
+% is also used in titles, headers or footers
+% (depending on the style used)\footnote{The macro \texttt{\bslash and},
+% sometimes used in \texttt{\bslash author}
+% to typeset a title with several authors, doesn't work here,
+% except in the \textbf{collection} style. It produced a compilation error.
+% The macro \texttt{\bslash thanks} also doesn't work but without producing error.}.
+%
+% \pagebreak
+% \medskip
+% \DescribeMacro{\subject} \DescribeMacro{\school} \DescribeMacro{\institute}
+% In addition to the previous ones, we provide two other information macros,
+% used in the title, or the headers or the footers, depending on the style:
+% |\subject| and |\school| (or its alias |\institute|).
+% The macro |\subject| has an optional argument, like in |\title|:
+% |\subject|\oarg{head}\marg{title} which allows to place an alternative text
+% in header, different from the one displayed in the title.
+%
+% \medskip
+% The information macros, that have to be called in the preamble\footnote{%
+% Nevertheless, the macros \texttt{\bslash date} and \texttt{\bslash author}
+% can be used in the document body.},
+% are optional. If omitted the corresponding field will be empty,
+% except for the date which will display today's date.
+% So, if you do not want any date, just write |\date{}|.
+% When title elements like subject, date are missing, the title height will be reduced accordingly.
+%
+% Except |\date|, all these information macros accept multiline arguments,
+% for example |\school{Royal College of Pataphysics\\London}|.
+% To typeset the main title on two (or more) lines, use |\\[1ex]|
+% for a good vertical spacing.
+%
+% When using the \textsf{hyperref} package (by Sebastian Rahtz and Heiko Oberdiek)
+% to produce a pdf output, information provided by |\title|, |\subject| and |\author|
+% (and |\school|\footnote{The \emph{author} field of the pdf properties will be filled
+% like this: \textsf{author (school)},
+% but \texttt{\bs author} should be called before \texttt{\bs school} in the preamble.
+% })
+% will be written in the pdf properties also.
+%
+% \medskip
+% The file \textsf{schooldocs-examples.pdf} uses the examples of the following table.
+% \begin{center}
+% \begin{tabular}{ll}
+% \hline
+% macro & example \\
+% \hline
+% |\title| & |\title[The classic style]{The classic style layout}| \\
+% |\subject| & |\subject[Pathography / M2A]{Pathography / Master 2A}| \\
+% |\author| & |\author{Antoine Missier}| \\
+% |\school| & |\school{Royal College of Pataphysics}| \\
+% |\date| & |\date{May 4, 2020}| \\
+% \hline
+% \end{tabular}
+% \end{center}
+%
+% \DescribeMacro{\subtitle}
+% In the \textbf{exam} style, the title uses an additional field
+% provided by the macro |\subtitle|\marg{text}. The parameter \meta{text}
+% will be placed under the other title elements and before the separation rule,
+% if there is one. For instance |\subtitle{Duration of the test: 2\,h}|.
+% For a multi-line argument, the linebreak instruction must be
+% |\par| and not |\\|.
+%
+% \subsection{Making the title}
+%
+% \DescribeMacro{\maketitle}
+% As in \LaTeX\ standard classes, the title is produced
+% by the macro |\maketitle|, which should be placed after |\begin{document}|.
+% This command has been redefined by the package.
+% Indeed, the standard title produced by the \LaTeX\ class \texttt{article},
+% seems inappropriate for school documents like an exercise sheet for example.
+% The macro redefinition reduces the vertical space before the title
+% and typesets an horizontal rule to separate the title from the following text.
+% By default, the title is centered but we can change this,
+% as presented in section \ref{par:title-set}, to get
+% a left or right-aligned title (an also boxed).
+% Various titles are presented in the file
+% \href{run:schooldocs-examples.pdf}{\textsf{schooldocs-examples.pdf}}.
+%
+% The macro has on optional parameter |\maketitle|\oarg{rulelength}
+% to set the length of the separation rule, by default 2.5\,cm.
+% The rule can be totally removed by setting the
+% optional argument to 0\,cm; we can also make a rule of
+% whole line width with |\maketitle[\linewidth]| or |\maketitle[\textwidth]|.
+%
+% Each style has its own title formatting. Nevertheless the package provides
+% a ``standard'' title when no style is loaded or with
+% the \LaTeX\ styles \textbf{empty} or \textbf{plain}.
+% The \textbf{elegant} style keeps also this ``standard'' style.
+%
+% \medskip
+% \DescribeMacro{\seprule}
+% As in the title, a rule can also be used in the text body to make separations.
+% This is done by the macro |\seprule|\oarg{length} which
+% produces an horizontal centered rule of (optional) \meta{length}, by default 2.5\,cm.
+%
+% \medskip
+% \DescribeMacro{\correct}
+% For typesetting a correct version of an exercise sheet, we provide the macro |\correct|,
+% which adds \textsf{-- Correct Version} to the title.
+% It should be placed in the preamble.
+% Combined with packages that deal with multiple versions of a document,
+% this macro avoids to define different titles for a an exercice sheet an its correct version.
+% However in the \textbf{exam} style, the text \textsf{Correct version}
+% will not be added in the title (except in headers), but will be substituted for
+% the subtitle.
+%
+% \medskip
+% \DescribeMacro{\makesmalltitle}
+% As in the package \textsf{phfnote} by Philippe Faist, it seems wisely
+% to propose a compact title, where information
+% provided by |\title|, |\subject| and |\date| are presented
+% on a single line (see \textsf{schooldocs-examples.pdf}).
+% The rule is always displayed and expands on the whole line width.
+%
+% \subsection{Style layouts} \label{par:styles}
+%
+% According to good typographic practice, the header on the title page should be empty
+% (see The \LaTeX\ Companion).
+% This ``rule'' is seldom observed in school documents,
+% and, on the first page, we find often information (author, school, etc.)
+% on top left and the date on top right, as for a letter.
+% Except for the \textbf{classic} style, that we present first,
+% we wanted to comply with good practice,
+% but we keep some information in the footer yet.
+%
+% We present below miniature views to show the layout of the different styles.
+% The file \href{run:schooldocs-examples.pdf}{\textsf{schooldocs-examples.pdf}}
+% gives a real view of them.
+% The rule (width) under the header or over the footer
+% is freely configurable, as well as the format of each element and
+% also some space settings, see section \ref{par:head-settings}.
+%
+% \medskip
+% \begin{stylex}
+% {\schoolstyle School} \hfill {Author}\\[-0.3ex]
+% {\headsubjectstyle Subject} \hfill {date}\\
+% \vspace{0.04\mpwd}
+% \centered{\footnotesize\sffamily\bfseries The classic style}
+% \vspace{-0.25ex}\centered{\rule{0.15\mpwd}{0.1pt}}
+% \vspace{0.85\mpwd}
+% \centered{1/2}
+% \end{stylex}
+% \qquad
+% \begin{stylex}
+% \mbox{}\\[1ex]
+% {\headtitlestyle Title} \hfill {\headsubjectstyle Subject}\\
+% \vspace{0.97\mpwd}
+% \centered{2/2}
+% \end{stylex}
+% \medskip
+%
+% \begin{stylex}
+% \mbox{}\vspace{0.03\mpwd}
+% \begin{center}
+% {\footnotesize\sffamily\bfseries The elegant style}\\[1.7ex]
+% {\scriptsize Subject} \\[0.5ex]
+% {\scriptsize date} \\
+% \vspace{-0.5ex}\rule{0.15\mpwd}{0.1pt}
+% \end{center}
+% \vspace{0.72\mpwd}
+% {\schoolstyle School} \hfill Author
+% \end{stylex}
+% \qquad
+% \begin{stylex}
+% {\headtitlestyle Title} \hfill Page
+% \end{stylex}
+% \medskip
+%
+% \begin{stylex}
+% \mbox{}\vspace{0.03\mpwd}
+% \begin{center}
+% {\footnotesize\sffamily\bfseries The modern style}\\[1.7ex]
+% {\scriptsize Subject} \\
+% \vspace{-0.5ex}\rule{0.15\mpwd}{0.1pt}
+% \end{center}
+% \vspace{0.75\mpwd}
+% {\schoolstyle School} \hfill \begin{tabular}[c]{r@{}}Author\\[-0.5ex] date\end{tabular}
+% \end{stylex}
+% \qquad
+% \begin{stylex}
+% {\headtitlestyle Title} \hfill {\headsubjectstyle Subject} \par
+% \vspace{-1.9ex}\rule{0.82\mpwd}{0.1pt}
+%
+% \vspace{1.01\mpwd}
+% \centered{2/2}
+% \end{stylex}
+% \medskip
+%
+% \begin{stylex}
+% \mbox{}\vspace{0.03\mpwd}
+% \begin{center}
+% {\footnotesize\sffamily\bfseries The soft style}\\
+% \vspace{-0.5ex}\rule{0.15\mpwd}{0.1pt}
+% \end{center}
+% \vspace{0.83\mpwd}
+% {\schoolstyle School} \hfill {\headsubjectstyle Subject}\\
+% Author \hfill date
+% \end{stylex}
+% \qquad
+% \begin{stylex}
+% {\headtitlestyle Title} \hfill Page \par
+% \vspace{-1.9ex}\rule{0.82\mpwd}{0.1pt}
+% \vspace{0.97\mpwd}
+%
+% \schoolstyle School \hfill \headsubjectstyle Subject
+% \end{stylex}
+% \medskip
+%
+% \begin{stylex}
+% \mbox{}\vspace{0.1\mpwd}
+% \begin{center}
+% {\footnotesize THE EXAM STYLE}\\[3.2ex]
+% {\scriptsize\bfseries Subject} \\[2.8ex]
+% {\scriptsize date} \\[2ex]
+% {\scriptsize\slshape subtitle} \\
+% \rule{0.15\mpwd}{0.1pt}
+% \end{center}
+% \vspace{0.51\mpwd}
+% \begin{tabular}[c]{@{}l}Author\\[-0.5ex] \schoolstyle School\end{tabular} \hfill {Page}
+% \end{stylex}
+% \qquad
+% \begin{stylex}
+% {\headtitlestyle TITLE} \hfill {\headsubjectstyle Subject} \par
+% \vspace{-1.9ex}\rule{0.82\mpwd}{0.1pt}
+%
+% \vspace{1.01\mpwd}
+% \begin{tabular}[c]{@{}l}Author\\[-0.5ex] \schoolstyle School\end{tabular} \hfill {Page}
+% \end{stylex}
+% \medskip
+%
+% \begin{stylex}
+% \mbox{}\vspace{0.1\mpwd}
+% \begin{center}
+% {\footnotesize THE COLLECTION STYLE}\\[3.2ex]
+% {\scriptsize\bfseries Subject} \\[2.8ex]
+% {\scriptsize Author} \\[1.5ex]
+% {\scriptsize School} \\[1.5ex]
+% {\scriptsize date} \\
+% \rule{0.15\mpwd}{0.1pt}
+% \end{center}
+% \end{stylex}
+% \qquad
+% \begin{stylex}
+% {\headtitlestyle TITLE} \hfill {\headsubjectstyle Section} \par
+% \vspace{-1.9ex}\rule{0.82\mpwd}{0.1pt}
+%
+% \vspace{1.01\mpwd}
+% {\schoolstyle School} \hfill {2}
+% \end{stylex}
+% \bigskip
+%
+% In the \textbf{collection} style, usefull for longer documents,
+% the name of the current section appears in the right header
+% and changes as things progress
+% as in the \LaTeX\ \textbf{book} class.
+%
+% \section{Settings}
+%
+% \subsection{Page layout}
+%
+% The page layout is set in the same way, for all styles.
+% It is defined by the macro |\geometry| of the package
+% \textsf{geometry} (by Hideo Umeki and David Carlisle).
+% According to good typographic practice (see the \LaTeX\ Companion,
+% the \textsf{typearea} package or \textsf{KOMA-Script} bundle documentation)
+% the ratio between the text body (the type area as named by typographs)
+% and the page size must be the same horizontally and vertically.
+% This ratio gauges the ``shades of grey'' of a page.
+% The default scale in the \textsf{geometry} package is 0.7.
+% For school documents, it seems that this setting leaves too much white space in the margins, thus this ratio has been set to 0.75.
+% Of course, it can be freely redefined with the |\geometry| command.
+% Furthermore, according to ``canons of page construction'', in a one-sided document,
+% the ratio between the left and right margins should be 1:1,
+% while the ratio between the top and bottom margins should be 1:2.
+% It seems that this recommended ratio of 1:2 is seldom observed
+% and it produces a very wide bottom margin.
+% Besides, when loading the \textsf{geometry} package, the default vertical ratio is 2:3 and not 1:2.
+% To get more balanced margins, we have prefer to set it at 3:4:
+% |\geometry{scale=0.75,vmarginratio=3:4,heightrounded}|\footnote{The option
+% \texttt{heightrounded} rounds text height to $n$-times ($n$ an integer) the height of a line, to avoid ``underfull vbox'' in some cases.}.
+%
+% \subsection{Title settings} \label{par:title-set}
+%
+% Several parameters allow to customize the title composition.
+% They are presented in the following table with their default value.
+% Colors are changed with |\definecolor|, macros with |\renewcommand|
+% and lengths with |\setlength|.
+% Most of command names are explicit enough to give some information about their use.
+%
+% Let us specifiy nevertheless that |\titleflush| manages the alignment:
+% centered by default, it can be left-aligned with
+% |\renewcommand{\titleflush}{flushleft}| or right-aligned with
+% |\renewcommand{\titleflush}{flushright}|\footnote{This macro has no effect
+% with the \textbf{exam} and \textbf{collection} styles,
+% the title is always centered.}.
+%
+% The length |\titlesep| sets the vertical spacing between the fields \emph{title}
+% and \emph{subject}, except for the \textbf{classic} and \textbf{soft} styles,
+% witch contain only the field \emph{title}, or if the field \emph{subject}
+% is not given.
+% Vertical spaces between other title fields are defined in relation to
+% |\titlesep| (|0.5\titlesep| for most).
+%
+% Unless otherwise stated, the column ``special settings'' of the following table
+% applies to the \textbf{exam} and \textbf{collection} styles.
+%
+% \begin{center} \small
+% \begin{tabular}{ccc}
+% \hline
+% parameter & default settings & special settings \\
+% \hline
+% |titlecolor| & |black| & \\
+% |\titlestyle| & |\LARGE\sffamily\bfseries| & |\LARGE\MakeUppercase| \\
+% |\subjectstyle| & |\large| & |\Large\bfseries|\\
+% |\datestyle| & |\large| \\
+% |\smalltitledatestyle| & |\large\slshape| & \\
+% |\titleflush| & |center| & \\
+% |\titletopskip| & -1.32\,cm & -0.67\,cm (\textbf{classic}), 0.67\,cm \\
+% |\titlebottomskip| & |\medskipamount| \\
+% |\titlesep| & |2\medskipamount| & |2\bigskipamount| \\
+% |\seprulewidth| & 0.3\,pt &\\
+% |\seprulelength| & 2.5\,cm &\\
+% \hline
+% \end{tabular}
+% \end{center}
+%
+% \DescribeMacro{\subtitlestyle}\DescribeMacro{\titlecorrectstyle}
+% The \textbf{exam} style has two additionnal setting macros:
+% |\subtitlestyle|, set by default to |\large\slshape|,
+% and |\titlecorrectstyle|, for the composition of \textsf{Correct Version}
+% produced by |\correct|, set by default to |\color{red}\large\scshape|.
+%
+% In the \textbf{collection} style, the fields
+% \emph{school} and \emph{author} are included into the title. Their features are then
+% controlled by |\authorstyle|\footnote{For other styles, the macro
+% \texttt{\bs authorstyle} belongs to headers or footers parameters.} set to |\Large|.
+%
+% If we want to create a separate page for the title, in particular for the
+% \textbf{exam} or \textbf{collection} styles, we can place |\maketitle| into
+% an environment |titlepage| provided by \LaTeX.
+%
+% \medskip
+% \DescribeMacro{\boxedshape}
+% A particular formatting has been predefined to produce a slighlty shaded box around the title: |\boxedshape|\marg{text}
+% (thanks to the \textsf{fancybox} package by Timothy Van Zandt).
+% It is not activated by default but it can be used within the
+% command |\titlestyle| if we want to get this kind of effect, e.g.
+% |\renewcommand{\titlestyle}{\LARGE\sffamily\bfseries\boxedshape}|.
+%
+% \subsection{Headers and footers} \label{par:head-settings}
+%
+% Headers and footers typeset is produced thanks to
+% dedicated macros\footnote{The \textsf{fancyhdr} package
+% provides the commands \texttt{\bs lhead}, \texttt{\bs chead}, \texttt{\bs rhead}
+% for the left, center and right parts of the header, and the same for the footer:
+% \texttt{\bs lfoot}, \texttt{\bs cfoot} and \texttt{\bs rfoot}.}
+% of the \textsf{fancyhdr} package.
+% As for the title, several macros allow to customize certain settings.
+% They are presented in the table below.
+% Let us specify that |\pagenamestyle| defines the format of the word \emph{page}
+% used in front of the page number.
+%
+% The |\headstyle| and |\footstyle| commands are generic for all elements
+% of headers and footers. They are combined with macros giving
+% specific settings for each field.
+% \begin{center}
+% \begin{tabular}{cc}
+% \hline
+% parameter & default setting \\
+% \hline
+% |headingcolor| & |black| \\
+% |\headstyle| & |\small\color{headingcolor}| \\
+% |\footstyle| & |\small\color{headingcolor}| \\
+% |\headtitlestyle| & |\scshape| \\
+% |\headsubjectstyle| & |\scshape| \\
+% |\schoolstyle| & |\scshape| \\
+% |\headdatestyle| & |\textnormal| \\
+% |\authorstyle| & |\textnormal| \\
+% |\pagenamestyle| & |\textnormal| \\
+% \hline
+% \end{tabular}
+% \end{center}
+%
+% The \textbf{exam} and \textbf{collection} styles have a specific setting for
+% |\headtitlestyle|, defined by |\renewcommand{\headtitlestyle}{\MakeUppercase}|.
+%
+% \medskip
+% Macros that allow to display (or remove) the rule in the header\footnote{Indeed
+% we have redefined the \texttt{\bs headrule} macro
+% such that the rule never appears
+% on the first page.}
+% or the footer
+% come from the \textsf{fancyhdr} package. For example, in any style,
+% we remove the rule in the header with:
+% |\renewcommand{\headrulewidth}{0pt}|,
+% and display it in the footer with:
+% |\renewcommand\footrulewidth{0.4pt}|
+%
+% \subsection{Internationalization}
+% Four keywords are used by the package: page, Correct version, Name and Forename,
+% defined by the macros |\pagename|, |\correctname|, |\identityname| and |\identityforename|.
+% |\pagename| is used in header or footer, |\correctname| by the macro |\correct|
+% and both others by the \textbf{identity} style.
+% These keywords get automatic translation in a few languages\footnote{Translation
+% is currently integrated into the package for the following languages:
+% French, German, Spanish, Italian, Portuguese.}
+% when the \textsf{babel} package is loaded.
+% They can be redefined, with |\renewcommand|,
+% which should be placed \emph{after} |\begin{document}|,
+% or else we can use macros from the \textsf{babel} package
+% (allowing dynamic language change), e.g.\\
+% |\addto\captionsromanian{\def\pagename{pagin\u{a}}}| (in the preamble).
+%
+%
+% \StopEventually{}
+%
+% \section{Implementation}
+%
+% \subsection{Required packages and geometry settings}
+%
+% \begin{macrocode}
+\ProvidesPackage{schooldocs}
+\NeedsTeXFormat{LaTeX2e}
+
+\RequirePackage{geometry}
+\let\footruleskip\relax % because memoir class uses it
+\RequirePackage{fancyhdr}
+\RequirePackage{ifthen}
+\RequirePackage{lastpage}
+\RequirePackage{fancybox}
+\RequirePackage{xcolor}
+
+\geometry{scale=0.75,vmarginratio=3:4,heightrounded}
+
+% \end{macrocode}
+% It is recommended to define the settings with the command |\geometry|
+% rather than as option when loading the package \textsf{geometry}, to avoid option clash.
+%
+% To change the scale factor, if the |\geometry| command doesn't work, use |\newgeometry|.
+%\medskip
+% \subsection{Internationalization}
+%
+% \begin{macrocode}
+\providecommand{\pagename}{page}
+\def\correctname{Correct version}
+\def\identityname{Name:}
+\def\identityforename{Forename:}
+
+\newcommand\schooldocstranslate{%
+ \@ifpackageloaded{babel}{%
+ \addto\captionsfrench{%
+ \def\correctname{Corrig\'e}
+ \def\identityname{Nom :}
+ \def\identityforename{Pr\'enom :}
+ }
+ \addto\captionsgerman{%
+ \def\pagename{Seite}
+ \def\correctname{Musterl\"osung}
+ \def\identityname{Name :}
+ \def\identityforename{Vorname :}
+ }
+ \addto\captionsspanish{%
+ \def\pagename{p\'agina}
+ \def\correctname{Correccion}
+ \def\identityname{Apellido:}
+ \def\identityforename{Nombre:}
+ }
+ \addto\captionsitalian{%
+ \def\pagename{Seite}
+ \def\correctname{Corretto}
+ \def\identityname{Nome :}
+ \def\identityforename{Conome :}
+ }
+ \addto\captionsportuges{%
+ \def\pagename{p\'agina}
+ \def\correctname{Corrigiu}
+ \def\identityname{Nome :}
+ \def\identityforename{Primeiro nome :}
+ }
+ }{}
+ }
+
+\AtBeginDocument{\schooldocstranslate} % if loaded before babel
+\schooldocstranslate % necessary when loaded after babel
+
+% \end{macrocode}
+%
+% \subsection{Information fields}
+%
+% After being defined, information fields are set to empty,
+% to make tests with them work well.
+%
+% \begin{macrocode}
+\renewcommand{\title}[2][]{\long\def\@title{#2}
+ \ifthenelse{\equal{#1}{}}{\def\@headtitle{#2}}{\def\@headtitle{#1}}
+ \@ifpackageloaded{hyperref}{\hypersetup{pdftitle={\@headtitle}}}{}
+}
+\title{}
+\author{}
+
+\newcommand\school[1]{\long\def\@school{#1}
+ \@ifpackageloaded{hyperref}{
+ \hypersetup{pdfauthor={\@author\ (\@school)}}}{}
+}
+\school{}
+\newcommand{\institute}{\school}
+
+\let\subject\relax
+\newcommand{\subject}[2][]{\long\def\@subject{#2}
+ \ifthenelse{\equal{#1}{}}{\def\@headsubject{#2}}{\def\@headsubject{#1}}
+ \@ifpackageloaded{hyperref}{\hypersetup{pdfsubject={\@headsubject}}}{}
+}
+\def\@subject{}
+\def\@headsubject{}
+% \end{macrocode}
+% Because \textsf{KOMA-Script} package also uses the |\subject| macro,
+% we make a |\relax| on this command.
+%
+% |\subject{}| doesn't work with the |\@empty| test used below in |\maketitle|, thus
+% we define |\@subject| and |\@headsubject| as empty by default.
+%
+% \subsection{Settings}
+%
+% First we present the title settings.
+% \begin{macrocode}
+\definecolor{titlecolor}{named}{black}
+\newcommand{\titlestyle}{\LARGE\sffamily\bfseries}
+\newcommand{\subjectstyle}{\large}
+\newcommand{\datestyle}{\large}
+\newcommand{\smalltitledatestyle}{\large\slshape}
+\newcommand{\titleflush}{center}
+\newlength{\titletopskip} \setlength{\titletopskip}{-1.32cm}
+\newlength{\titlesep} \setlength{\titlesep}{2\medskipamount}
+\newlength{\titlebottomskip} \setlength{\titlebottomskip}{\medskipamount}
+\newlength{\seprulewidth} \setlength{\seprulewidth}{0.3pt}
+\newlength{\seprulelength} \setlength{\seprulelength}{2.5cm}
+
+\newcommand{\boxedshape}[1]{%
+ \color{gray} % no effect
+ \setlength{\fboxsep}{4.5pt}
+ \setlength{\shadowsize}{3pt}
+ \shadowbox{\quad\textcolor{titlecolor}{\rule{0pt}{2ex}#1}\quad}
+}
+
+% \end{macrocode}
+% Default value for |\fboxsep| is 3\,pt and for |\shadowsize| is 4\,pt.
+% These settings are local.
+%
+% \medskip
+% Next the headers and footers settings.
+% \begin{macrocode}
+\definecolor{headingcolor}{named}{black}
+\newcommand{\headstyle}{\small\color{headingcolor}}
+\newcommand{\footstyle}{\small\color{headingcolor}}
+\newcommand{\headtitlestyle}{\scshape}
+\newcommand{\headsubjectstyle}{\scshape}
+\newcommand{\schoolstyle}{\scshape}
+\newcommand{\headdatestyle}{\textnormal}
+\newcommand{\authorstyle}{\textnormal}
+\newcommand{\pagenamestyle}{\textnormal}
+\setlength{\headheight}{\baselineskip}
+\renewcommand{\headrule}{\ifthenelse{\thepage=1}%
+ {\vspace{-2ex}\rule{\headwidth}{0pt}}%
+ {\vspace{-2ex}\rule{\headwidth}{\headrulewidth}}
+}
+
+% \end{macrocode}
+% The |\headrule| macro redefinition allow to remove the rule on the first page.
+%
+% The header height is set to |\baselineskip| to avoid
+% error messages (``headheight too small'') when the text size is
+% greater than or equal to |\small|.
+%
+% \subsection{Title composition}
+%
+% \begin{macrocode}
+\renewcommand{\maketitle}[1][\seprulelength]{
+ \mbox{}\par\vspace{\titletopskip}
+ \begin{\titleflush}
+ {\color{titlecolor}
+ {\titlestyle{\@title}}
+ \ifx\@subject\@empty\else
+ \par\vspace{\titlesep}\subjectstyle\@subject
+ \fi
+ \ifthenelse{\equal{\@date}{}}{}{%
+ \par\vspace{0.5\titlesep} \datestyle\@date}
+ \par\vspace{0.5\titlesep}
+ }
+ \ifthenelse{\lengthtest{#1 > 0cm}}{\rule{#1}{\seprulewidth}}{}
+ \end{\titleflush}
+ \vspace{\titlebottomskip}
+}
+
+\newcommand{\makesmalltitle}{
+ \mbox{}\par\vspace{1.5\titletopskip}
+ \begin{center}
+ {\color{titlecolor}
+ {\titlestyle{\@title}}
+ \hfill \subjectstyle\@subject
+ \ifthenelse{\equal{\@date}{}}{}{%
+ \enskip --\enskip \smalltitledatestyle\@date}
+ }
+ \rule{\linewidth}{\seprulewidth}
+ \end{center}
+ \vspace{\titlebottomskip}
+}
+
+\newcommand\correct{%
+ \let\@originalheadtitle\@headtitle
+ \def\@headtitle{\@originalheadtitle ~--~\correctname}
+ \@ifpackageloaded{hyperref}{%
+ \AtBeginDocument{\hypersetup{pdftitle={\@headtitle}}}}{}
+ \let\@originaltitle\@title
+ \def\@title{\@originaltitle ~--~\correctname}
+}
+
+\newcommand{\seprule}[1][\seprulelength]{\begin{center}
+ \raisebox{0.25\baselineskip}{\rule{#1}{\seprulewidth}}\end{center}}
+
+% \end{macrocode}
+% |\AtBeginDocument| is necessary in the |\correct| macro because
+%|\correctname| can be redefined by \textsf{babel} at |\begin{document}|.
+%
+% \medskip
+% \subsection{The basic styles}
+%
+% The header in the \textbf{classic} style is displayed on two lines, therefore we have to increase the height
+% |\headheight|.
+%
+% If we want to include header or footer in the total body,
+% we can add the command |\geometry{includehead}| respectively
+% |\geometry{includefoot}| in the preamble.
+% \begin{macrocode}
+\fancypagestyle{classic}{%
+ \renewcommand{\headrulewidth}{0pt}
+ \addtolength{\headheight}{\baselineskip}
+ \lhead{\headstyle\ifthenelse{\thepage=1}{\schoolstyle\@school\mbox{}\\
+ \headsubjectstyle\@subject}{\headtitlestyle\@headtitle} }
+ \rhead{\headstyle\ifthenelse{\thepage=1}{\authorstyle\@author\mbox{}\\
+ \headdatestyle\@date}{\headsubjectstyle\@headsubject}}
+ \cfoot{\footstyle \thepage /\pageref{LastPage}}
+ \setlength{\titletopskip}{-0.67cm}
+ \renewcommand{\maketitle}[1][\seprulelength]{%
+ \mbox{}\par\vspace{\titletopskip}
+ \begin{\titleflush}
+ {\color{titlecolor}\titlestyle{\@title}}
+ \par\vspace{0.5\titlesep}
+ \ifthenelse{\lengthtest{##1>0cm}}{\rule{##1}{\seprulewidth}}{}
+ \end{\titleflush}
+ \vspace{\titlebottomskip}
+ }
+}
+
+\fancypagestyle{elegant}{%
+ \renewcommand{\headrulewidth}{0pt}
+ \lhead{\headstyle
+ \ifthenelse{\thepage=1}{}{\headtitlestyle\@headtitle}}
+ \rhead{\headstyle
+ \ifthenelse{\thepage=1}{}{%
+ \pagenamestyle\pagename~\thepage /\pageref{LastPage}}}
+ \lfoot{\ifthenelse{\thepage=1}{\footstyle\schoolstyle\@school}{}}
+ \cfoot{}
+ \rfoot{\ifthenelse{\thepage=1}{\footstyle\authorstyle\@author}{}}
+}
+
+\fancypagestyle{modern}{%
+ \lhead{\headstyle
+ \ifthenelse{\thepage=1}{}{\headtitlestyle\@headtitle}}
+ \rhead{\headstyle
+ \ifthenelse{\thepage=1}{}{\headsubjectstyle\@headsubject}}
+ \lfoot{\ifthenelse{\thepage=1}{\footstyle\schoolstyle\@school}{}}
+ \cfoot{\ifthenelse{\thepage=1}{}{
+ \footstyle\thepage /\pageref{LastPage}}}
+ \rfoot{\footstyle\ifthenelse{\thepage=1}{%
+ \authorstyle\@author
+ \ifx\@author\empty\else\\ \fi
+ \headdatestyle\@date\ignorespaces}{}
+ }
+ \renewcommand{\maketitle}[1][\seprulelength]{%
+ \mbox{}\par\vspace{\titletopskip}
+ \begin{\titleflush}
+ {\color{titlecolor}
+ {\titlestyle{\@title}}
+ \ifx\@subject\@empty\else
+ \par\vspace{\titlesep}\subjectstyle\@subject
+ \fi
+ \par\vspace{0.5\titlesep}
+ }
+ \ifthenelse{\lengthtest{##1>0cm}}{\rule{##1}{\seprulewidth}}{}
+ \end{\titleflush}
+ \vspace{\titlebottomskip}
+ }
+}
+
+\fancypagestyle{soft}{%
+ \lhead{\headstyle
+ \ifthenelse{\thepage=1}{}{\headtitlestyle\@headtitle}}
+ \rhead{\headstyle
+ \ifthenelse{\thepage=1}{}{%
+ \pagenamestyle\pagename~\thepage /\pageref{LastPage}}}
+ \lfoot{\footstyle{\schoolstyle\@school}
+ \ifthenelse{\thepage=1}{\ifx\@author\empty\else\\ \fi
+ \authorstyle\@author}{}
+ }
+ \cfoot{}
+ \rfoot{\footstyle{\headsubjectstyle\@headsubject}
+ \ifthenelse{\thepage=1}{\ifx\@date\empty\else\\ \fi
+ \headdatestyle\@date\ignorespaces}{}
+ }
+ \setlength{\titletopskip}{-0.67cm}
+ \renewcommand{\maketitle}[1][\seprulelength]{%
+ \mbox{}\par\vspace{\titletopskip}
+ \begin{\titleflush}
+ {\color{titlecolor}\titlestyle{\@title}}
+ \par\vspace{0.5\titlesep}
+ \ifthenelse{\lengthtest{##1>0cm}}{\rule{##1}{\seprulewidth}}{}
+ \end{\titleflush}
+ \vspace{\titlebottomskip}
+ }
+}
+
+\fancypagestyle{identity}{%
+ \lhead{\headstyle\headtitlestyle \identityname}
+ \chead{\headstyle\headtitlestyle \identityforename}
+ \rhead{}
+ }
+
+% \end{macrocode}
+%
+% \subsection{The extended styles}
+%
+% \begin{macrocode}
+\fancypagestyle{exam}{%
+ \let\subtitle\relax % because KOMA-Script uses it
+ \newcommand\subtitle[1]{\long\def\@subtitle{##1}}
+ \subtitle{}
+ \renewcommand{\headtitlestyle}{\MakeUppercase}
+ \lhead{\headstyle
+ \ifthenelse{\thepage=1}{}{\headtitlestyle{\@headtitle}}}
+ \rhead{\headstyle
+ \ifthenelse{\thepage=1}{}{\headsubjectstyle\@headsubject}}
+ \lfoot{\footstyle
+ \authorstyle\@author
+ \ifx\@author\empty\else\\ \fi
+ \schoolstyle\@school
+ }
+ \cfoot{}
+ \rfoot{\footstyle \pagenamestyle\pagename~\thepage/\pageref{LastPage}}
+ \setlength{\titletopskip}{0.67cm}
+ \setlength{\titlesep}{2\bigskipamount}
+ \renewcommand{\titlestyle}{\LARGE\MakeUppercase}
+ \renewcommand{\subjectstyle}{\Large\bfseries}
+ \newcommand{\subtitlestyle}{\large\slshape}
+ \newcommand*{\titlecorrectstyle}{\color{red}\large\scshape}
+ \renewcommand\correct{%
+ \let\@originalheadtitle\@headtitle
+ \def\@headtitle{\@originalheadtitle ~--~\correctname}
+ \@ifpackageloaded{hyperref}{%
+ \AtBeginDocument{\hypersetup{pdftitle={\@headtitle}}}}{}
+ \renewcommand{\subtitlestyle}{\titlecorrectstyle}
+ \subtitle{\correctname}
+ }
+ \renewcommand{\maketitle}[1][\seprulelength]{%
+ \mbox{}\par\vspace{\titletopskip}
+ \begin{center}
+ {\color{titlecolor}
+ {\titlestyle{\@title}}
+ \par\vspace{\titlesep}{\subjectstyle \@subject}
+ \par\vspace{\titlesep}
+ \ifthenelse{\equal{\@date}{}}{}{%
+ \datestyle\@date\par\vspace{0.5\titlesep}}
+ \ifthenelse{\equal{\@subtitle}{}}{}{%
+ \subtitlestyle\@subtitle\par\vspace{0.5\titlesep}
+ }
+ }
+ \ifthenelse{\lengthtest{##1>0cm}}{\rule{##1}{\seprulewidth}}{}
+ \end{center}
+ \vspace{\titlebottomskip}
+ }
+}
+
+\fancypagestyle{collection}{%
+ \renewcommand{\headtitlestyle}{\MakeUppercase}
+ \lhead{\headstyle\headtitlestyle\@headtitle}
+ \AtBeginDocument{\renewcommand{\sectionmark}[1]{\markboth{##1}{}}}
+ \rhead{\headstyle\headsubjectstyle\leftmark} %\@section
+ \lfoot{\footstyle\schoolstyle \@school}
+ \cfoot{}
+ \rfoot{\footstyle\thepage}
+ \setlength{\titletopskip}{0.67cm}
+ \setlength{\titlesep}{2\bigskipamount}
+ \renewcommand{\titlestyle}{\LARGE\MakeUppercase}
+ \renewcommand{\subjectstyle}{\Large\bfseries}
+ \renewcommand{\authorstyle}{\Large}
+ \renewcommand{\datestyle}{\Large}
+ \renewcommand{\maketitle}[1][\seprulelength]{%
+ \thispagestyle{empty}
+ \mbox{}\par\vspace{\titletopskip}
+ \begin{center}
+ {\color{titlecolor}
+ {\titlestyle{\@title}}
+ \par\vspace{\titlesep} {\subjectstyle{\@subject}}
+ \par\vspace{\titlesep}
+ \ifx\@author\empty
+ \else \authorstyle
+ \begin{tabular}[t]{c}\@author\end{tabular}
+ \ifx\@school\empty\else\par\vspace{1ex} \@school\fi
+ \par\vspace{0.5\titlesep}
+ \fi
+ \ifthenelse{\equal{\@date}{}}{}{%
+ \datestyle\@date \par\vspace{0.5\titlesep}}
+ }
+ \ifthenelse{\lengthtest{##1>0cm}}{\rule{##1}{\seprulewidth}}{}
+ \end{center}
+ \vspace{\titlebottomskip}
+ }
+}
+% \end{macrocode}
+%
+% In the \textbf{collection} style,
+% we redefine |\sectionmark| with |\AtBeginDocument| to prevent |\MakeUppercase|
+% from eliminating the section number
+% (or you can use |\nouppercase| here).
+%
+% |\ifthenelse| doesn't work when |\and| is used within |\author|.
+%
+% Notice the |\pagestyle{empty}| in |\maketitle| which prevents
+% any header on the first page.
+%
+% \Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/schooldocs/schooldocs.ins b/Master/texmf-dist/source/latex/schooldocs/schooldocs.ins
new file mode 100644
index 00000000000..f764055184e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/schooldocs/schooldocs.ins
@@ -0,0 +1,55 @@
+%%
+%% Copyright (C) 2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+%%
+%% This file 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:
+%%
+%% http://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.
+%%
+
+\input docstrip.tex
+\keepsilent
+
+\usedir{tex/latex/schooldocs}
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+
+This file 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:
+
+ http://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.
+
+\endpreamble
+
+\generate{\file{schooldocs.sty}{\from{schooldocs.dtx}{package}}}
+
+\obeyspaces
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* schooldocs.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file schooldocs.dtx *}
+\Msg{* through LaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/showexpl/showexpl.dtx b/Master/texmf-dist/source/latex/showexpl/showexpl.dtx
index a7c3c966774..e154a1ae902 100644
--- a/Master/texmf-dist/source/latex/showexpl/showexpl.dtx
+++ b/Master/texmf-dist/source/latex/showexpl/showexpl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2004 -- 2016 by Rolf Niepraschk <Rolf.Niepraschk@gmx.de>
+% Copyright (C) 2004 -- by Rolf Niepraschk <Rolf.Niepraschk@gmx.de>
% --------------------------------------------------------------------
%
% This file may be distributed and/or modified under the
@@ -22,7 +22,7 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{showexpl}
%<*package>
- [2016/12/11 v0.3o Typesetting example code (RN)]
+ [2021/01/06 v0.3s Typesetting example code (RN)]
%</package>
%
%<*driver>
@@ -39,7 +39,7 @@
%</driver>
% \fi
%
-% \CheckSum{887}
+% \CheckSum{902}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -206,6 +206,7 @@
%
% \section{Implementation}
% \changes{v0.1e}{2004/11/24}{Loading of |showexpl.cfg| added (RN).}
+% \changes{v0.3p}{2020/05/04}{Remove package `calc' (RN).}
% \begin{macrocode}
\DeclareOption{final}{%
\PassOptionsToPackage{\CurrentOption}{graphicx}%
@@ -224,7 +225,7 @@
}%
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{listings}}
\ProcessOptions\relax
-\RequirePackage{listings,calc,ifthen,graphicx,varwidth}
+\RequirePackage{refcount,listings,graphicx,varwidth,float}
% \end{macrocode}
% We must aktivate code from package \textsf{listings} for writing files.
% \begin{macrocode}
@@ -316,18 +317,28 @@
% typesetting the result of the example code. More can be added with
% the user key ``|preset=...|''.
% \changes{v0.3e}{2006/04/05}{More redefinitions added (RN).}
+% \changes{v0.3p}{2020/05/04}{Remove extra treatment of `figure'/`table' (RN).}
+% \changes{v0.3r}{2020/10/08}{letting \cmd{\refstepcounter} be
+% \cmd{\stepcounter} (RN).}
+% \changes{v0.3s}{2021/01/06}{Special handling of cleveref's
+% \cmd{\refstepcounter} (RN).}
% \begin{macrocode}
\newcommand*\SX@@preset{%
\renewcommand\documentclass[2][]{\SX@eat@version}%
\renewcommand\usepackage[2][]{\SX@eat@version}%
\renewenvironment{document}{}{}%
- \renewenvironment{figure}[1][]{\def\@captype{figure}}{}%
- \renewenvironment{table}[1][]{\def\@captype{table}}{}%
\renewcommand\cite[1][]{}%
\let\tableofcontens\relax \let\listoffigures\relax
\let\listoftables\relax \let\printindex\relax
\let\listfiles\relax \let\nofiles\relax
- \let\index\@gobble \let\label\@gobble
+ \let\index\@gobble
+ \expandafter\ifx\csname ver@cleveref.sty\endcsname\relax
+ \let\refstepcounter=\stepcounter
+ \let\label\@gobble
+ \else
+ \let\cref@old@refstepcounter=\stepcounter
+ \let\cref@old@label=\@gobble
+ \fi
\let\bibliography\@gobble
\let\pagestyle\@gobble \let\thispagestyle\@gobble
%%\let\immediate\relax \let\write\@gobbletwo
@@ -344,14 +355,28 @@
% \begin{macro}{\isSX@odd}
% Parameter |#1| is executed on odd pages, parameter |#2| on
% even pages.
+% \changes{v0.3p}{2020/05/04}{Replace \cmd{\isodd} with
+% \cmd{\ifodd}\cmd{\getpagerefnumber} (remove package `ifthen') (RN).}
% \begin{macrocode}
\newif\ifSX@wasodd
\if@twoside
- \newcommand*{\isSX@odd}[2]{%
- \ifthenelse{\isodd{\pageref{\SX@IDENT}}}%
- {\SX@wasoddtrue #1}{\SX@wasoddfalse #2}}
+ \newcommand*\isSX@odd{%
+ \begingroup
+ \ifodd\getpagerefnumber{\SX@IDENT}%
+ \aftergroup\SX@wasoddtrue
+ \else
+ \aftergroup\SX@wasoddfalse
+ \fi
+ \endgroup
+ \ifSX@wasodd
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ }
\else
- \newcommand*{\isSX@odd}[2]{#1}\SX@wasoddtrue
+ \SX@wasoddtrue
+ \newcommand*\isSX@odd[2]{#1}
\fi
% \end{macrocode}
% The call of \cmd{\isSX@odd} sets also \cmd{\ifSX@wasodd} to true or
@@ -388,20 +413,20 @@
% \begin{macrocode}
\newcommand*\SX@put@t[3]{%
\SX@ResultArea{\linewidth}{#2}\endgraf\pagebreak[2]%
- \setlength\@tempdima{\SX@vsep}\vskip\@tempdima
+ \@tempdima=\dimexpr\SX@vsep\vskip\@tempdima
\SX@CodeArea{\linewidth}{#3}%
}
\newcommand*\SX@put@b[3]{%
\SX@CodeArea{\linewidth}{#3}\endgraf\pagebreak[2]%
- \setlength\@tempdima{\SX@vsep}\vskip\@tempdima
+ \@tempdima=\dimexpr\SX@vsep\vskip\@tempdima
\SX@ResultArea{\linewidth}{#2}%
}
\newcommand*\SX@put@l[3]{%
- \setlength\@tempdimc{\linewidth-#1-\SX@hsep}%
+ \@tempdimc=\dimexpr\linewidth-#1-\SX@hsep %
\SX@ResultArea{#1}{#2}\hfill\SX@CodeArea{\@tempdimc}{#3}%
}
\newcommand*\SX@put@r[3]{%
- \setlength\@tempdimc{\linewidth-#1-\SX@hsep}%
+ \@tempdimc=\dimexpr\linewidth-#1-\SX@hsep %
\SX@CodeArea{\@tempdimc}{#3}\hfill\SX@ResultArea{#1}{#2}%
}
\newcommand*\SX@put@o[3]{%
@@ -411,12 +436,11 @@
\@nameuse{SX@put@\ifSX@wasodd l\else r\fi}{#1}{#2}{#3}%
}
\newcommand\SX@ResultArea[2]{%
- \SX@justification\setlength\@tempdima{#1}%
- %\minipage\@tempdima#2\endminipage
+ \SX@justification\@tempdima=\dimexpr #1 %
\parbox\@tempdima{#2}%
}
\newcommand\SX@CodeArea[2]{%
- \setlength\@tempdima{#1}%
+ \@tempdima=\dimexpr #1 %
\sbox\@tempboxa{\parbox\@tempdima{#2}}%
\@tempdima=\dp\@tempboxa\usebox\@tempboxa
\rlap{\raisebox{-\@tempdima}[0pt][0pt]{\SX@attachfile}}%
@@ -477,19 +501,12 @@
\newcommand*\SX@put@code@result{%
\begingroup
\expandafter\lstset\expandafter{\SX@explpreset}%
- \let\lst@float=\relax\let\SX@float=\relax
-% \end{macrocode}
-% Without the following call \cmd{\lst@beginfloat} is undefined.
-% \begin{macrocode}
\expandafter\lstset\expandafter{\SX@@explpreset}%
- \ifx\lst@float\relax\else
% \end{macrocode}
-% \cmd{\lst@float} must be \cmd{\relax} because the whole ``example''
-% should float but not the listings part in addition.
+% Use listings floating procedure if necessary.
% \begin{macrocode}
- \let\SX@float=\lst@float\let\lst@float=\relax
- \g@addto@macro\SX@@explpreset{,float=false}%
- \edef\@tempa{\noexpand\lst@beginfloat{lstlisting}[\SX@float]}%
+ \ifx\lst@float\relax\else
+ \edef\@tempa{\noexpand\lst@beginfloat{lstlisting}[\lst@float]}
\expandafter\@tempa
\fi
\ifx\lst@caption\@empty
@@ -511,7 +528,7 @@
\ifx\@tempa\SX@pos\@tempswafalse\fi
\def\@tempa{b}%
\ifx\@tempa\SX@pos\@tempswafalse\fi
- \setlength\@tempdima{\linewidth+\SX@overhang}%
+ \@tempdima=\dimexpr\linewidth+\SX@overhang %
\if@tempswa\@tempdima=.5\@tempdima\fi%
\edef\SX@width{\the\@tempdima}%
\fi
@@ -523,12 +540,12 @@
\long\def\SX@frame##1{##1}%
\else
\let\SX@frame\ResultBox
- \setlength\@tempdima{\SX@width-2\ResultBoxSep-2\ResultBoxRule}%
+ \@tempdima=\dimexpr\SX@width-2\ResultBoxSep-2\ResultBoxRule %
\edef\SX@width{\the\@tempdima}%
\fi
\isSX@odd{\def\@tempa{l}}{\def\@tempa{r}}%
\makebox[\linewidth][\@tempa]{%
- \parbox{\linewidth+\SX@overhang}{%
+ \parbox{\dimexpr\linewidth+\SX@overhang}{%
% \end{macrocode}
% \cmd{\SX@codefile} (|\jobname.tmp|) is not nessesary for the filelist.
% \changes{v0.3m}{2016/08/05}{Wrong assignement for \cmd{\lst@belowskip} (RN).}
@@ -541,10 +558,7 @@
% true.
% \changes{v0.3k}{2013/03/21}{Setting \cmd{\lst@MakeCaption} to \cmd{\@gobble}
% again (prevent multiply defined labels; label key)}.
-% \begin{macrocode}
- \let\SX@MakeCaption\lst@MakeCaption
- \let\lst@MakeCaption\@gobble{}
-% \end{macrocode}
+% \changes{v0.3p}{2020/05/04}{Let's leave \cmd{\lst@MakeCaption} untouched (RN).}
% \changes{v0.3j}{2012/09/22}{Setting \cmd{\lst@MakeCaption} to
% was a bad idea for hyperlinks. Group added to
% varwidth environment. (Suggestions by Ulrike Fischer.).}
@@ -564,12 +578,11 @@
{\@latex@error{Parameter `\SX@pos' undefined}\@ehd}%
{\@nameuse{SX@put@\SX@pos}%
{\SX@width}{\box\SX@ResBox}{\SX@codeInput}}%
- \let\lst@MakeCaption\SX@MakeCaption
\lst@MakeCaption{b}\SX@KillBelowCaptionskip
}%
}%
\endtrivlist
- \ifx\SX@float\relax\else\expandafter\lst@endfloat\fi
+ \ifx\lst@float\relax\else\expandafter\lst@endfloat\fi
\gdef\SX@@explpreset{}%
\endgroup
}
@@ -693,6 +706,28 @@
\def\SX@tempb##1{\scalebox{\SX@scaled}{##1}}%
\fi
\fi
+ \let\SX@lst@Init=\lst@Init
+% \end{macrocode}
+% \changes{v0.3p}{2020/05/04}{Better handling of floats (RN).}
+% \changes{v0.3q}{2020/05/06}{Floats should always be numbered 0 (RN).}
+% Prevents float environments from floating. This is not enough for floating
+% listing environments! Why?
+% \begin{macrocode}
+ \def\@xfloat##1[##2]{%
+ \def\@captype{##1}%
+ \@namedef{the\@captype}{0}%
+ \@float@HH{##1}[H]}%
+% \end{macrocode}
+% Special handling of floating listing environments.
+% \begin{macrocode}
+ \def\lst@Init{%
+ \let\lst@float=\relax
+ \setcounter\@captype{-1}%
+ \SX@lst@Init
+ }
+% \end{macrocode}
+% Typeset the Code.
+% \begin{macrocode}
\SX@tempb{\SX@tempa{\SX@codefile}}\par
\endgroup
\else
@@ -726,7 +761,7 @@
\fi
\SX@Info
\expandafter\lstinputlisting\expandafter[\SX@@explpreset,nolol=true,%
- caption={},belowskip=\z@,aboveskip=\z@]{\SX@codefile}%
+ caption={},belowskip=\z@,aboveskip=\z@,float=false]{\SX@codefile}%
\endgroup
}%
% \end{macrocode}
@@ -734,7 +769,7 @@
% \changes{v0.1h}{2005/06/03}{New macro \cmd{\LTXinputExample} (RN).}
% \begin{macrocode}
\newcommand*\LTXinputExample[2][]{%
- \g@addto@macro\SX@@explpreset{#1,codefile=#2}%
+ \g@addto@macro\SX@@explpreset{float=false,#1,codefile=#2}%
\SX@put@code@result}%
% \end{macrocode}
% All the default values.
diff --git a/Master/texmf-dist/source/latex/showexpl/showexpl.ins b/Master/texmf-dist/source/latex/showexpl/showexpl.ins
index 98548e0467f..773270fdd04 100644
--- a/Master/texmf-dist/source/latex/showexpl/showexpl.ins
+++ b/Master/texmf-dist/source/latex/showexpl/showexpl.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2004 by Rolf Niepraschk <Rolf.Niepraschk@gmx.de>
+%% Copyright (C) 2004 -- by Rolf Niepraschk <Rolf.Niepraschk@gmx.de>
%%
%% This file may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.2 of this license
diff --git a/Master/texmf-dist/source/latex/skdoc/Makefile b/Master/texmf-dist/source/latex/skdoc/Makefile
new file mode 100644
index 00000000000..d2d1103f27e
--- /dev/null
+++ b/Master/texmf-dist/source/latex/skdoc/Makefile
@@ -0,0 +1,69 @@
+ZIP_NOATTRS :=
+ifeq ($(shell uname -s),Darwin)
+ ZIP_NOATTRS += -X
+endif
+
+TAR_NOATTRS :=
+ifeq ($(shell uname -s),Darwin)
+ TAR_NOATTRS += --disable-copyfile
+endif
+
+TEXMFHOME ?= $(shell kpsewhich -var-value TEXMFHOME)
+.PHONY: all clean distclean install dist test clean-test
+all: skdoc.dtx skdoc.cls skdoc.pdf README
+clean: clean-test
+ rm -f *.gl? *.id? *.aux # problematic files
+ rm -f *.bbl *.bcf *.bib *.blg *.xdy # biblatex
+ rm -f *.fls *.log *.out *.run.xml *.toc # junk
+distclean: clean
+ rm -f *.cls *.sty *.clo *.tar.gz *.tds.zip README
+ git reset --hard
+
+%.cls: %.dtx
+ tex $<
+
+%.pdf: %.dtx %.cls
+ pdflatex -interaction=nonstopmode -halt-on-error $<
+ makeglossaries $*
+ biber $*
+ pdflatex -interaction=nonstopmode -halt-on-error $<
+ makeglossaries $*
+ pdflatex -interaction=nonstopmode -halt-on-error $<
+
+README: README.md
+ sed -e '1,4d;$$d' $< > $@
+
+install: all
+ install -m 0644 skdoc.cls $(TEXMFHOME)/tex/latex/skdoc/skdoc.cls
+ install -m 0644 skdoc.pdf $(TEXMFHOME)/doc/latex/skdoc/skdoc.pdf
+ install -m 0644 skdoc.tex $(TEXMFHOME)/source/latex/skdoc/skdoc.dtx
+ install -m 0644 README $(TEXMFHOME)/doc/latex/skdoc/README
+ -mktexlsr
+
+skdoc.tds.zip: all
+ mkdir -p skdoc/tex/latex/skdoc
+ cp skdoc.cls skdoc/tex/latex/skdoc/skdoc.cls
+ mkdir -p skdoc/doc/latex/skdoc
+ cp skdoc.pdf skdoc/doc/latex/skdoc/skdoc.pdf
+ mkdir -p skdoc/source/latex/skdoc
+ cp skdoc.dtx skdoc/source/latex/skdoc/skdoc.dtx
+ cp README skdoc/doc/latex/skdoc/README
+ cd skdoc && zip $(ZIP_NOATTRS) -r ../skdoc.tds.zip *
+ rm -rf skdoc
+
+skdoc.tar.gz: all skdoc.tds.zip
+ mkdir -p skdoc
+ cp skdoc.dtx skdoc/skdoc.dtx
+ cp skdoc.pdf skdoc/skdoc.pdf
+ cp README skdoc/README
+ cp Makefile skdoc/Makefile
+ tar $(TAR_NOATTRS) -czf $@ skdoc skdoc.tds.zip
+ rm -rf skdoc
+
+dist: skdoc.tar.gz
+
+test:
+# $(MAKE) -C tests
+
+clean-test:
+# $(MAKE) -C tests clean
diff --git a/Master/texmf-dist/source/latex/skdoc/skdoc.dtx b/Master/texmf-dist/source/latex/skdoc/skdoc.dtx
index a7bfdc10d8e..d7803447122 100644
--- a/Master/texmf-dist/source/latex/skdoc/skdoc.dtx
+++ b/Master/texmf-dist/source/latex/skdoc/skdoc.dtx
@@ -1,7 +1,7 @@
% \iffalse
%% skdoc documentation class
%%
-%% Copyright (C) 2012-2019 by Simon Sigurdhsson <sigurdhsson@gmail.com>
+%% Copyright (C) 2012-2020 by Simon Sigurdhsson <sigurdhsson@gmail.com>
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -73,7 +73,7 @@
%</driver>
%<class>\ProvidesExplClass{skdoc}
%<*class>
- {2019/09/29}{1.5b}{skdoc documentation class}
+ {2020/11/16}{1.5d}{skdoc documentation class}
%</class>
%
%<*driver>
@@ -132,7 +132,7 @@
% {}{\small\pagemark}
% \pagestyle{skdoc-class}
%
-% \version{1.5b}
+% \version{1.5d}
% \changes{1.0}{Initial version}
% \changes{1.1}{Added support for syntax highlighting using \pkg{minted}}
% \changes{1.1a}{Deprecate the use of \pkg{bibtex} in favour of \pkg{biblatex}}
@@ -146,6 +146,8 @@
% \changes{1.5}{Fix incompatibilities with \pkg{minted}}
% \changes{1.5a}{Track \pkg{expl3} changes (thanks to Felix Faltin)}
% \changes{1.5b}{Track \pkg{expl3} changes (thanks to Phelype Oleinik). Replace \pkg{opensans} option \opt{osfigures} with \opt{oldstyle} (\#40)}
+% \changes{1.5c}{Replace \pkg{scrpage} package with \pkg{scrlayer-scrpage} (thanks to Daniel Wunderlich)}
+% \changes{1.5d}{Use compatibiltiy levels for \pkg{scrartcl} (\#44)}
% \iffalse
%%% Don't forget to update the version number and release date of
%%% the package declaration on line 76!
@@ -773,9 +775,10 @@
\LoadClass[ DIV7,
headings=big,
numbers=noenddot,
- abstracton,
+ abstract=true,
bibliography=totocnumbered,
- index=totoc
+ index=totoc,
+ version=3.32
]{scrartcl}
% \end{macrocode}
% These packages are basic low-level things that we use to declare
@@ -795,7 +798,7 @@
% \end{macrocode}
% The rest is basically just styling.
% \begin{macrocode}
-\RequirePackage{scrpage2}
+\RequirePackage{scrlayer-scrpage}
\AtEndOfClass{%
\RequirePackage[\skdoc@babel]{babel}
\RequirePackage[english=british]{csquotes}
diff --git a/Master/texmf-dist/source/latex/snapshot/snapshot.dtx b/Master/texmf-dist/source/latex/snapshot/snapshot.dtx
index f79605dbf6f..38c6b7d656f 100644
--- a/Master/texmf-dist/source/latex/snapshot/snapshot.dtx
+++ b/Master/texmf-dist/source/latex/snapshot/snapshot.dtx
@@ -1,6 +1,6 @@
% \def\filename{snapshot.dtx}
-% \def\fileversion{2.13}
-% \def\filedate{2012/08/06}
+% \def\fileversion{2.14}
+% \def\filedate{2020/06/17}
%
% \iffalse meta-comment
%
@@ -15,7 +15,7 @@
% fax: (401) 331-3842
% email: tech-support@ams.org
%
-% Copyright 1999-2003, 2004, 2010, 2012 American Mathematical Society.
+% Copyright 1999-2003, 2004, 2010, 2012, 2020 American Mathematical Society.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -35,7 +35,10 @@
% \iffalse
%<*driver>
\NeedsTeXFormat{LaTeX2e}
-\documentclass[oneside]{amsdtx}
+\documentclass{amsdtx}
+
+\usepackage{hyperref}
+
\providecommand{\qq}[1]{\textquotedblleft#1\textquotedblright}
\providecommand{\mdash}{\textemdash\penalty\exhyphenpenalty}
\providecommand{\lat}[1]{\protect\LaTeX{}}
@@ -44,12 +47,18 @@
\CodelineIndex
-\begin{document}
\title{The \pkg{snapshot} package}
-\author{American Mathematical Society\\Michael Downes}
+
+\author{American Mathematical Society}
+
\date{Version \fileversion, \filedate}
+
+\begin{document}
+
\DocInput{snapshot.dtx}
+
\PrintIndex
+
\end{document}
%</driver>
% \fi
@@ -57,6 +66,9 @@
% \MakeShortVerb{\|}
%
% \maketitle
+%
+% \tableofcontents
+%
% \section{Introduction}
%
% The \pkg{snapshot} package helps the owner of a \LaTeX{} document
@@ -122,7 +134,6 @@
% \begin{verbatim}
% \RequirePackage[log]{snapshot}
% \end{verbatim}
-%
% Making the necessary arrangements to ensure that future \latex/
% runs of the document actually call in the specified versions is a
% separate problem. The \pkg{snapshot} package only provides a way to
@@ -333,7 +344,7 @@
% Standard declaration of package name and date.
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
-\ProvidesPackage{snapshot}[2012/08/06 v2.13]
+\ProvidesPackage{snapshot}[2020/06/17 v2.14]
% \end{macrocode}
%
% Calling the \pkg{snapshot} package in a document causes \latex/ to
@@ -367,11 +378,17 @@
% their documents.
% \end{minipage}\end{center}
%
+% \begin{macro}{\@xp}
+% \begin{macro}{\@nx}
% A couple of shorthand forms.
% \begin{macrocode}
\let\@xp=\expandafter \let\@nx=\noexpand
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
+% \begin{macro}{\str@cmp}
+% \begin{macro}{\str@equal}
% A function to compare two strings and return FT or TT (for use with
% \cs{if}).
% \begin{macrocode}
@@ -382,6 +399,8 @@
\str@cmp#1\relax\str@cmp#2{\relax\@gobbletwo}\@nil TT%
}
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}{\RequireVersions}
%
@@ -390,86 +409,219 @@
% \tex/ inputs path.
% \begin{macrocode}
\newcommand{\RequireVersions}[2][]{}%
+
\renewcommand{\RequireVersions}[1][]{%
- \def\snap@check{\snap@compare@versions}%
- \toks@{#1}\afterassignment\snap@storem
- \let\@let@token=
+ \def\snap@check{\snap@compare@versions}%
+ \toks@{#1}%
+ \afterassignment\snap@storem
+ \let\@let@token=
}
+
+\@onlypreamble\RequireVersions
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\snap@storem}
+% \begin{macrocode}
\def\snap@storem{%
- \ifx\@let@token\bgroup
- \else
- \PackageError{snapshot}{Expected a `\@charlb' character here}\@ehc
- \@xp\@gobblefour
- \fi
- \futurelet\@let@token\snap@branch
+ \ifx\@let@token\bgroup \else
+ \PackageError{snapshot}{Expected a `\@charlb' character here}\@ehc
+ \@xp\@gobblefour
+ \fi
+ \futurelet\@let@token\snap@branch
}
-\@onlypreamble\RequireVersions
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@check}
% \begin{macrocode}
\let\snap@check\@gobble
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@finish}
% \begin{macrocode}
\def\snap@finish{\toks@\bgroup}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@branch}
% \begin{macrocode}
\def\snap@branch{%
- \ifx\@let@token\egroup
- \@xp\snap@finish
- \else\ifx\@let@token *%
- \let\reserved@c\snap@store@version
- \else\ifx\@let@token\@sptoken
- \lowercase{\def\reserved@c} {\futurelet\@let@token\snap@branch}%
- \else
- \let\reserved@c\snap@store@error
- \fi\fi\fi
- \reserved@c
+ \ifx\@let@token\egroup
+ \@xp\snap@finish
+ \else\ifx\@let@token *%
+ \let\reserved@c\snap@store@version
+ \else\ifx\@let@token\@sptoken
+ \lowercase{\def\reserved@c} {\futurelet\@let@token\snap@branch}%
+ \else
+ \let\reserved@c\snap@store@error
+ \fi\fi\fi
+ \reserved@c
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@store@error}
% \begin{macrocode}
\def\snap@store@error#1{%
- \PackageError{snapshot}{Expected '*' here, not '#1'}\@ehc
+ \PackageError{snapshot}{Expected '*' here, not '#1'}\@ehc
}
+
\@onlypreamble\snap@store@error
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@store@version}
% \begin{macrocode}
\def\snap@store@version #1#2#3#4{%
- \@xp\snap@store@b\csname snapx@#2\endcsname{#2}{#3}{#4}%
+ \@xp\snap@store@b\csname snapx@#2\endcsname{#2}{#3}{#4}%
}
+
\@onlypreamble\snap@store@version
% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Determining the engine}
+%
+% \begin{macro}{\snapshotApplication}
+
+% Check for the engines that are active in \TeX Live 2020. Note
+% that in in modern versions of \TeX Live, there is no distinction
+% between \fn{etex}, \fn{pdfetex}, and \fn{pdftex}. I believe this
+% code will distinguish between distinct legacy binaries, but I
+% have not tested this thoroughly. Similar remarks apply to the
+% p\TeX\ family.
%
-% Detection of e-\LaTeX{}, pdf\LaTeX{}, pdfe\LaTeX{}, and Lambda
-% [Omega]:
% \begin{macrocode}
-\ifx\OmegaVersion\@@undefined
-\else
- \edef\snapshotApplication{%
- {Omega}\space\space\space
- {0000/00/00 v\OmegaVersion}%
- }%
-\fi
-\ifx\eTeXversion\@@undefined
-\else
- \edef\snapshotApplication{%
- {eTeX}\space\space\space\space
- {0000/00/00 v\number\eTeXversion\eTeXrevision}%
- }%
+\let\snapshotApplication\@empty
+
+\ifx\OmegaVersion\@@undefined \else
+ \edef\snapshotApplication{%
+ \ifx\AlephVersion\@@undefined
+ {Omega}\space\space\space
+ {0000/00/00 v\OmegaVersion}%
+ \else
+ {Aleph}\space\space\space
+% \end{macrocode}
+% \cs{AlephVersion} appears to be incorrectly set to 0.0, so
+% include the Omega version as well.
+% \begin{macrocode}
+ {0000/00/00 v\OmegaVersion-\AlephVersion}%
+ \fi
+ }%
\fi
-\ifx\pdftexversion\@@undefined
-\else
- \edef\snapshotApplication{%
- \ifx\eTeXversion\@@undefined
- {pdfTeX}\space\space
+
+\ifx\ptexversion\@@undefined\else
+ \edef\snapshotApplication{%
+ {pTeX}\space\space\space\space
+ {0000/00/00 v\number\ptexversion
+ \ifx\ptexminorversion\undefined \u \else.\number\ptexminorversion\fi
+ \ifx\ptexrevision\undefined \u \else\ptexrevision\fi}%
+ }%
+ \ifx\uptexversion\@@undefined
+ \ifx\epTeXversion\@@undefined\else
+ \edef\snapshotApplication{%
+ {epTeX}\space\space\space
+ {0000/00/00 v\number\epTeXversion}%
+ }%
+ \fi
\else
- {pdfeTeX}\space
+ \ifx\epTeXversion\@@undefined
+ \edef\snapshotApplication{%
+ {upTeX}\space\space\space
+ {0000/00/00 v\number\uptexversion
+ \ifx\uptexrevision\undefined \u \else\uptexrevision\fi}%
+ }%
+ \else
+% \end{macrocode}
+% There is no separate \cs{euptexversion}, so use a combination of
+% the underlying up\TeX\ and ep\TeX\ versions.
+% \begin{macrocode}
+ \edef\snapshotApplication{%
+ {eupTeX}\space\space
+ {0000/00/00 v\number\uptexversion
+ \ifx\uptexrevision\undefined \u \else\uptexrevision\fi
+ --\number\epTeXversion}%
+ }%
+ \fi
+ \fi
+\fi
+
+\ifx\snapshotApplication\@empty
+ \ifx\XeTeXversion\@@undefined\else
+ \edef\snapshotApplication{%
+ {XeTeX}\space\space\space
+ {0000/00/00 v\number\XeTeXversion
+ \ifx\XeTeXrevision\undefined\else\XeTeXrevision\fi}%
+ }%
+ \fi
+\fi
+
+\ifx\snapshotApplication\@empty
+ \ifx\luatexversion\@@undefined\else
+ \begingroup
+ \@tempcnta\luatexversion
+ \divide\@tempcnta by 100
+ \edef\@tempa{\the\@tempcnta}%
+ \multiply\@tempcnta by 100
+ \@tempcntb\luatexversion
+ \advance\@tempcntb by -\@tempcnta
+ \edef\@tempa{\@tempa.\the\@tempcntb.\luatexrevision}%
+ \xdef\snapshotApplication{%
+ {luaTeX}\space\space
+ {0000/00/00 v\@tempa}%
+ }%
+ \endgroup
+ \fi
+\fi
+
+\ifx\snapshotApplication\@empty
+ \ifx\pdftexversion\@@undefined \else
+ \begingroup
+ \ifx\eTeXversion\@@undefined
+ \@tempswafalse
+ \else
+ \@tempswatrue
+ \fi
+ \@tempcnta\pdftexversion
+ \divide\@tempcnta by 100
+ \edef\@tempa{\the\@tempcnta}%
+ \multiply\@tempcnta by 100
+ \@tempcntb\pdftexversion
+ \advance\@tempcntb by -\@tempcnta
+% \end{macrocode}
+% e\TeX\ was folded into pdf\TeX\ as of version 1.40.
+% \begin{macrocode}
+ \ifnum\@tempcntb > 39
+ \@tempswafalse
+ \fi
+ \edef\@tempa{\@tempa.\the\@tempcntb.\pdftexrevision}%
+ \xdef\snapshotApplication{%
+ \if@tempswa
+ {pdfeTeX}\space
+ \else
+ {pdfTeX}\space\space
+ \fi
+ {0000/00/00 v\@tempa}%
+ }%
+ \endgroup
+ \fi
+\fi
+
+\ifx\snapshotApplication\@empty
+ \ifx\eTeXversion\@@undefined \else
+ \edef\snapshotApplication{%
+ {eTeX}\space\space\space\space
+ {0000/00/00 v\number\eTeXversion
+ \ifx\eTeXrevision\undefined
+ \ifx\eTeXminorversion\undefined\else.\number\eTeXminorversion\fi
+ \else
+ \eTeXrevision
+ \fi
+ }%
+ }%
\fi
- {0000/00/00 v0.\number\pdftexversion\pdftexrevision}%
- }%
\fi
% \end{macrocode}
% If none of the above information is available, the exact version
@@ -477,13 +629,14 @@
% fall back to using a nominal date of 1990/03/25, which is when
% version 3.0 of \fn{tex.web} was released by Knuth.
% \begin{macrocode}
-\@ifundefined{snapshotApplication}{%
- \edef\snapshotApplication{%
- {TeX}\space\space\space\space\space
- {1990/03/25 v3.x}%
- }%
-}{}
+\ifx\snapshotApplication\@empty
+ \edef\snapshotApplication{%
+ {TeX}\space\space\space\space\space
+ {1990/03/25 v3.x}%
+ }%
+\fi
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
\def\@fmtextension{fmt}
@@ -499,57 +652,62 @@
\expandafter\let\csname snapx@-------\endcsname\snapx@end
% \end{macrocode}
%
+% \begin{macro}{\snap@store@b}
% For a package named \fn{foo.sty}, this function defines
% \cs{rqv@foo.sty} to hold the date and version information.
% \begin{macrocode}
\def\snap@store@b#1#2#3#4{%
- \ifx#1\snapx@end
- \@xp\snap@finish
- \else
- \ifx#1\relax \let#1\@empty\fi
- \def\@tempa##1 ##2 ##3\@nil{##1 ##2}%
+ \ifx#1\snapx@end
+ \@xp\snap@finish
+ \else
+ \ifx#1\relax \let#1\@empty\fi
+ \def\@tempa##1 ##2 ##3\@nil{##1 ##2}%
% \end{macrocode}
%
% \begin{macrocode}
- \ifx#1\snapx@application
- \@xp\xdef\csname rqv@#3#1\endcsname{\@tempa#4 v?.? ? \relax\@nil}%
- \else
- \xdef\rqv@list{\rqv@list{#3#1}}%
- \@xp\xdef\csname rqv@#3#1\endcsname{\@tempa#4 v?.? ? \relax\@nil}%
- \snap@intest{#3}{#1}%
- \ifx#1\snapx@format \snap@check{#3.fmt}%
+ \ifx#1\snapx@application
+ \@xp\xdef\csname rqv@#3#1\endcsname{\@tempa#4 v?.? ? \relax\@nil}%
+ \else
+ \xdef\rqv@list{\rqv@list{#3#1}}%
+ \@xp\xdef\csname rqv@#3#1\endcsname{\@tempa#4 v?.? ? \relax\@nil}%
+ \snap@intest{#3}{#1}%
+ \ifx#1\snapx@format \snap@check{#3.fmt}\else
% \end{macrocode}
% Test if current file is \fn{snapshot.sty}. Need to pre-expand the
% extension part to ensure the test is correct.
% \begin{macrocode}
- \else
- \edef\@tempa{\@nx\string@equal{snapshot.sty}{#3#1}}%
- \if\@tempa \snap@selfcheck \fi
- \fi
+ \edef\@tempa{\@nx\string@equal{snapshot.sty}{#3#1}}%
+ \if\@tempa \snap@selfcheck \fi
+ \fi
+ \fi
\fi
- \fi
- \futurelet\@let@token\snap@branch
+ \futurelet\@let@token\snap@branch
}
+
\@onlypreamble\snap@store@b
% \end{macrocode}
-% \end{macro}
+% \end{macro}
%
+% \begin{macro}{\snap@write}
% Default setup is geared to write the dependency list to a \fn{.dep}
% file. The option \opt{log} means write it to the \tex/ log instead.
% \begin{macrocode}
\def\snap@write{\immediate\write\snap@out}
\let\snap@out\sixt@@n % fallback, probably never used
% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Package options}
%
% \begin{macrocode}
\DeclareOption{dep}{%
- \def\snap@write{\immediate\write\snap@out}%
+ \def\snap@write{\immediate\write\snap@out}%
}
% \end{macrocode}
%
% \begin{macrocode}
\DeclareOption{log}{%
- \let\snap@write\typeout
+ \let\snap@write\typeout
}
% \end{macrocode}
%
@@ -577,32 +735,39 @@
% in the \fn{.dvi} file.
% \begin{macrocode}
\DeclareOption{tfm}{%
- \typeout{Option 'tfm' not implemented yet [1999/09/23]}%
+ \typeout{Option 'tfm' not implemented yet [1999/09/23]}%
}
% \end{macrocode}
%
-% Warnings and errors.
+% \subsubsection{Warnings and errors}
+% \begin{macro}{\snap@mismatch@warning}
+% \begin{macro}{\snap@mismatch}
% \begin{macrocode}
\def\snap@mismatch@warning#1#2#3{\PackageWarningNoLine{#1}{#2}}
\def\snap@mismatch{\snap@mismatch@warning}
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
% \begin{macrocode}
\DeclareOption{error}{%
- \def\snap@mismatch{\PackageError}%
- \def\snap@selfcheck{\snap@selfcheck@a}%
- \ifx\snap@select\@empty \let\snap@select\snap@select@all \fi
+ \def\snap@mismatch{\PackageError}%
+ \def\snap@selfcheck{\snap@selfcheck@a}%
+ \ifx\snap@select\@empty \let\snap@select\snap@select@all \fi
}
% \end{macrocode}
%
% \begin{macrocode}
\DeclareOption{warning}{%
- \def\snap@mismatch{\snap@mismatch@warning}%
- \def\snap@selfcheck{\snap@selfcheck@a}%
- \ifx\snap@select\@empty \let\snap@select\snap@select@all \fi
+ \def\snap@mismatch{\snap@mismatch@warning}%
+ \def\snap@selfcheck{\snap@selfcheck@a}%
+ \ifx\snap@select\@empty \let\snap@select\snap@select@all \fi
}
% \end{macrocode}
%
+%
+% \begin{macro}{\snap@select@all}
+% \begin{macro}{\snap@select}
% Because the exact form of the version number is not mandated by
% \LaTeX{}, just take the first two ``words'' delimited by spaces.
% And take a little extra care to properly handle multiple spaces
@@ -611,7 +776,12 @@
\def\snap@select@all#1#2 #3#4 #5\@nil{#1#2 #3#4}
\let\snap@select\@empty
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
+% \begin{macro}{\snap@seldate}
+% \begin{macro}{\snap@selversion}
+% \begin{macro}{\snap@selmajor}
% If the naming conventions seem a little peculiar here, it's because
% I had to add some pieces later that I didn't think of initially,
% and I wanted to minimize the chances of compatibility problems for
@@ -621,21 +791,31 @@
\def\snap@selversion#1#2 #3{\snap@select@version #3}%
\def\snap@selmajor#1#2 #3{\snap@select@major #3}%
% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macrocode}
\DeclareOption{date}{\let\snap@select=\snap@seldate}
% \end{macrocode}
%
+% \begin{macro}{\snap@select@version}
% \begin{macrocode}
\def\snap@select@version#1{%
\ifodd 0#11 \@xp\snap@sva\@xp#1\else\@xp\snap@select@version\fi
}
\def\snap@sva#1.#2 #3\@nil{#1.#2}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\snap@select@major}
+% \begin{macrocode}
\def\snap@select@major#1{%
\ifodd 0#11 \@xp\snap@svm\@xp#1\else\@xp\snap@select@major\fi
}
\def\snap@svm#1.#2\@nil{#1}
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
\DeclareOption{version}{\let\snap@select\snap@selversion}
@@ -647,30 +827,34 @@
\DeclareOption{bbinfo}{\def\snap@bbinfo{00}}
% \end{macrocode}
%
+% \begin{macro}{\snap@splitter}
% Give this an inert definition, for the time being, until we are
% ready to do the split.
% \begin{macrocode}
\let\snap@splitter=?
\AtBeginDocument{%
- \xdef\@filelist{\@filelist\snap@splitter}%
+ \xdef\@filelist{\@filelist\snap@splitter}%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@selfcheck}
% \begin{macrocode}
\let\snap@selfcheck\@empty
\let\snap@selfcheck@a\@empty
% \end{macrocode}
+% \end{macro}
%
% The \opt{self-warning} option would normally be used in conjunction
% with the \opt{error} option.
% \begin{macrocode}
\DeclareOption{self-warning}{%
- \def\snap@selfcheck{%
- \begingroup
- \def\snap@mismatch{\snap@mismatch@warning}%
- \snap@selfcheck@a
- \endgroup
- }
+ \def\snap@selfcheck{%
+ \begingroup
+ \def\snap@mismatch{\snap@mismatch@warning}%
+ \snap@selfcheck@a
+ \endgroup
+ }
}
% \end{macrocode}
%
@@ -679,16 +863,19 @@
\ProcessOptions\relax
% \end{macrocode}
%
+% \begin{macro}{\snap@restore@extensions}
% We need the following patch to make up for the fact that
% \cs{@pkgextension} and \cs{@clsextension} are marked in the \latex/
% kernel as \qq{only preamble}.
% \begin{macrocode}
\edef\snap@restore@extensions{%
- \def\@nx\@pkgextension{\@pkgextension}%
- \def\@nx\@clsextension{\@clsextension}%
+ \def\@nx\@pkgextension{\@pkgextension}%
+ \def\@nx\@clsextension{\@clsextension}%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@pad}
% Pad filename strings out to 8+3 length so that the list will look
% pretty.
% \begin{macrocode}
@@ -696,7 +883,9 @@
\def\snap@pad@a#1#2#3#4#5\@nil{\snap@pad@b#1#2#3#4\space\@nil}
\def\snap@pad@b#1\space#2\@nil#3{\def#3{#2}}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@trim@version}
% First stage: discard leading spaces before the first and second
% nonspace strings in the argument. Take the first nonspace string as
% the date. Since we only do equal/not-equal testing on dates, it
@@ -716,6 +905,7 @@
% \begin{macrocode}
\def\snap@trim@c#1#2 #3\@nil{#2}
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
\let\rqv@list=\@empty
@@ -726,13 +916,14 @@
\edef\@tempc#1\fmtname{#1\fmtname}\@tempc
\def\@tempa#1,\fmtname.fmt,#2#3\@nil{#2}
\edef\@tempb{\@nx\@tempa,\@filelist,\fmtname.fmt,}
+
\if ?\@tempb?\@nil
- \edef\@filelist{\fmtname.fmt,\@filelist}%
- \def\@tempc{LaTeX2e}%
- \@xp\edef\csname ver@\fmtname.fmt\endcsname{%
- \fmtversion\space
- v\ifx\@tempc\fmtname 2.e\else ?.?\fi
- }%
+ \edef\@filelist{\fmtname.fmt,\@filelist}%
+ \def\@tempc{LaTeX2e}%
+ \@xp\edef\csname ver@\fmtname.fmt\endcsname{%
+ \fmtversion\space
+ v\ifx\@tempc\fmtname 2.e\else ?.?\fi
+ }%
\fi
% \end{macrocode}
% Ensure that files get recorded.
@@ -740,81 +931,100 @@
\listfiles
% \end{macrocode}
%
+% \begin{macro}{\snap@doit}
% \begin{macrocode}
\def\snap@doit#1{%
- \begingroup
- \ifx\delimiter#1\delimiter
- \else
- \filename@parse{#1}%
- \let\@tempd\@empty
- \ifx\filename@ext\relax
- \def\@tempa{file}\def\@tempb{~~~}%
- \else\ifx\filename@ext\@pkgextension
- \def\@tempa{package}\let\@tempb\@empty
- \else\ifx\filename@ext\@clsextension
- \def\@tempa{class}\def\@tempb{~~}%
- \else\ifx\filename@ext\@fmtextension
- \def\@tempa{format}\def\@tempb{~}%
- \else\ifx\filename@ext\@tfmextension
- \def\@tempa{tfm}\def\@tempb{~~~~}%
- \else
- \def\@tempa{file}\edef\@tempd{.\filename@ext}%
- \def\@tempb{~~~}%
- \fi\fi\fi\fi\fi
- \@xp\let\@xp\@tempe
- \csname ver@\filename@base %
- \ifx\filename@ext\relax\else.\filename@ext\fi\endcsname
- \ifx\@tempe\@empty \let\@tempe\relax \fi
- \edef\@tempe{%
- \ifx\@tempe\relax 0000/00/00 v0.0%
- \else
- \@xp\@xp\@xp\snap@trim@version\@xp\@tempe\space v0.0 v0.0 \@nil
- \fi
- }%
- \edef\@tempc{\filename@area\filename@base\@tempd}% full file name
- \@xp\snap@pad\@tempc\space~~~~~~~~~~~~~~~~\@nil\@tempd
- \let~\space
- \snap@write{\space\space *{\@tempa}\@tempb{\@tempc}\@tempd{\@tempe}}%
- \fi
- \aftergroup\snap@doit
- \endgroup
-}%
+ \begingroup
+ \ifx\delimiter#1\delimiter \else
+ \filename@parse{#1}%
+ \let\@tempd\@empty
+ \ifx\filename@ext\relax
+ \def\@tempa{file}\def\@tempb{~~~}%
+ \else\ifx\filename@ext\@pkgextension
+ \def\@tempa{package}\let\@tempb\@empty
+ \else\ifx\filename@ext\@clsextension
+ \def\@tempa{class}\def\@tempb{~~}%
+ \else\ifx\filename@ext\@fmtextension
+ \def\@tempa{format}\def\@tempb{~}%
+ \else\ifx\filename@ext\@tfmextension
+ \def\@tempa{tfm}\def\@tempb{~~~~}%
+ \else
+ \def\@tempa{file}%
+ \edef\@tempd{.\filename@ext}%
+ \def\@tempb{~~~}%
+ \fi\fi\fi\fi\fi
+ \@xp\let\@xp\@tempe
+ \csname ver@\filename@base %
+ \ifx\filename@ext\relax\else.\filename@ext\fi\endcsname
+ \ifx\@tempe\@empty \let\@tempe\relax \fi
+ \edef\@tempe{%
+ \ifx\@tempe\relax 0000/00/00 v0.0%
+ \else
+ \@xp\@xp\@xp\snap@trim@version\@xp\@tempe\space v0.0 v0.0 \@nil
+ \fi
+ }%
+ \edef\@tempc{\filename@area\filename@base\@tempd}% full file name
+ \@xp\snap@pad\@tempc\space~~~~~~~~~~~~~~~~\@nil\@tempd
+ \let~\space
+ \snap@write{\space\space *{\@tempa}\@tempb{\@tempc}\@tempd{\@tempe}}%
+ \fi
+ \aftergroup\snap@doit
+ \endgroup
+}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@bracify}
% \begin{macrocode}
\def\snap@bracify#1#2,{%
\ifx\@empty#1\expandafter\@gobble\else {#1#2}\fi \snap@bracify
}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\snap@splitter@a}
+% \begin{macrocode}
\def\snap@splitter@a{%
- \iffalse{{\fi }}% close current file name, end definition
- \xdef\specific@files{%
- \iffalse}\fi
- \specific@files
- \expandafter\@gobble\string % discard one closing brace
+ \iffalse{{\fi }}% close current file name, end definition
+ \xdef\specific@files{%
+ \iffalse}\fi
+ \specific@files
+ \expandafter\@gobble\string % discard one closing brace
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@fdcheck}
% \begin{macrocode}
\def\snap@fdcheck#1{%
- \ifx\delimiter#1\@xp\@gobble
- \else\snap@fda#1\@empty.fd\@empty ?\@nil
- \fi
- \snap@fdcheck
+ \ifx\delimiter#1%
+ \@xp\@gobble
+ \else
+ \snap@fda#1\@empty.fd\@empty ?\@nil
+ \fi
+ \snap@fdcheck
}
+
\def\snap@fda#1.fd\@empty#2#3\@nil{%
- \if ?#2%
- \xdef\specific@files{\specific@files {#1}}%
- \else
- \xdef\general@files{\general@files {#1.fd}}%
- \fi
+ \if ?#2%
+ \xdef\specific@files{\specific@files {#1}}%
+ \else
+ \xdef\general@files{\general@files {#1.fd}}%
+ \fi
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\general@files}
+% \begin{macro}{\specific@files}
% \begin{macrocode}
\let\general@files\@empty
\let\specific@files\@empty
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
+% \begin{macro}{\SpecialInput}
% The \cn{SpecialInput} command is related to the \opt{packages-only}
% option. Apart from some ad hoc handling for \fn{.fd} files that get
% loaded on demand, all files that are input after
@@ -826,128 +1036,149 @@
% go in the specific-files list.
% \begin{macrocode}
\newcommand{\SpecialInput}[1]{%
- \xdef\specific@files{\specific@files{#1}}%
- \@@input#1\relax
+ \xdef\specific@files{\specific@files{#1}}%
+ \@@input#1\relax
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\@dofilelist}
% Our definition of \cs{@dofilelist} does not retain much resemblance
% to the original in the \LaTeX{} kernel.
% \begin{macrocode}
\def\@dofilelist{%
- \snap@restore@extensions
- \xdef\general@files{\@xp\snap@bracify \@filelist \@empty,\@empty,}%
- \let\snap@splitter\snap@splitter@a
- \xdef\general@files{\general@files}%
- \let\@tempa\specific@files \global\let\specific@files\@empty
- \@xp\snap@fdcheck\@tempa{\delimiter}%
- \ifx\rqv@list\@empty
- \else \rqv@compare@lists
- \fi
- \ifx\snap@write\typeout
- \else
- \newwrite\snap@out
- \immediate\openout\snap@out=\jobname.dep \relax
- \fi
- \snap@write{\string\RequireVersions\@charlb}%
- \snap@write{\space\space *{application}%
- \snapshotApplication
- }%
- \@xp\snap@doit\general@files{\delimiter\aftergroup\@gobble\@gobble}%
- \ifx\specific@files\@empty
- \else
- \snap@specific
- \fi
- \snap@write{\@charrb}%
- \ifx\snap@write\typeout
- \else \immediate\closeout\snap@out
- \typeout{Dependency list written on \jobname.dep.}%
- \fi
-}%
+ \snap@restore@extensions
+ \xdef\general@files{\@xp\snap@bracify \@filelist \@empty,\@empty,}%
+ \let\snap@splitter\snap@splitter@a
+ \xdef\general@files{\general@files}%
+ \let\@tempa\specific@files
+ \global\let\specific@files\@empty
+ \@xp\snap@fdcheck\@tempa{\delimiter}%
+ \ifx\rqv@list\@empty \else
+ \rqv@compare@lists
+ \fi
+ \ifx\snap@write\typeout \else
+ \newwrite\snap@out
+ \immediate\openout\snap@out=\jobname.dep \relax
+ \fi
+ \snap@write{\string\RequireVersions\@charlb}%
+ \snap@write{\space\space *{application}%
+ \snapshotApplication
+ }%
+ \@xp\snap@doit\general@files{\delimiter\aftergroup\@gobble\@gobble}%
+ \ifx\specific@files\@empty \else
+ \snap@specific
+ \fi
+ \snap@write{\@charrb}%
+ \ifx\snap@write\typeout \else
+ \immediate\closeout\snap@out
+ \typeout{Dependency list written on \jobname.dep.}%
+ \fi
+}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@specific}
% \begin{macrocode}
\def\snap@specific{%
- \snap@write{ \space *{-------}{Document-specific files:}{----}}%
- \@xp\snap@doit\specific@files{\delimiter\aftergroup\@gobble\@gobble}%
+ \snap@write{ \space *{-------}{Document-specific files:}{----}}%
+ \@xp\snap@doit\specific@files{\delimiter\aftergroup\@gobble\@gobble}%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\rqv@condense}
% The \cs{rqv@compare@lists} function checks to see if any files
% are found only in the RequireVersions list or only in the
% \cs{general@files} list.
% \begin{macrocode}
\def\rqv@condense#1{%
- \@xp\ifx\csname ver@#1\endcsname\N
- \else
- \edef\L{\L{#1}}%
- \@xp\let\csname ver@#1\endcsname=\N
- \fi
- \rqv@condense
+ \@xp\ifx\csname ver@#1\endcsname\N \else
+ \edef\L{\L{#1}}%
+ \@xp\let\csname ver@#1\endcsname=\N
+ \fi
+ \rqv@condense
}
+
\def\rqv@condend{\endcsname ?\fi
- \@xp\@xp\@xp\@gobbletwo\csname @xp\iftrue}
+ \@xp\@xp\@xp\@gobbletwo\csname @xp\iftrue}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\rqv@overloaded}
% \begin{macrocode}
\def\rqv@overloaded#1{%
- \snap@mismatch{snapshot}{^^J%
- File #1 loaded though not in \noexpand\RequireVersions list%
- }\@ehc
+ \snap@mismatch{snapshot}{^^J%
+ File #1 loaded though not in \noexpand\RequireVersions list%
+ }\@ehc
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\rqv@notloaded}
% \begin{macrocode}
\def\rqv@notloaded#1{%
- \snap@mismatch{snapshot}{^^J%
- File #1 [\csname rqv@#1\endcsname] required but not loaded%
- }\@ehc
+ \snap@mismatch{snapshot}{^^J%
+ File #1 [\csname rqv@#1\endcsname] required but not loaded%
+ }\@ehc
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\rqv@set}
+% \begin{macro}{\rqv@test}
% \begin{macrocode}
\def\rqv@set#1{\@xp\let\csname ver@#1\endcsname\N \rqv@set}
\def\rqv@test#1{\csname ver@#1\endcsname{#1}\rqv@test}
% \end{macrocode}
+% \end{macro}
+% \end{macro}
%
+% \begin{macro}{\rqv@compare@lists}
% \begin{macrocode}
\def\rqv@compare@lists{%
- \begingroup
+ \begingroup
% \end{macrocode}
% Clear up duplicate file names (just in case) to avoid redundant
% warning messages. This should seldom be necessary in practice.
% \begin{macrocode}
- \def\N{1}\let\L\@empty
- \@xp\rqv@condense\rqv@list\rqv@condend
- \global\let\rqv@list=\L
- \def\N{2}\let\L\@empty
- \@xp\rqv@condense\general@files\rqv@condend
- \global\let\general@files=\L
+ \def\N{1}%
+ \let\L\@empty
+ \@xp\rqv@condense\rqv@list\rqv@condend
+ \global\let\rqv@list=\L
+ \def\N{2}%
+ \let\L\@empty
+ \@xp\rqv@condense\general@files\rqv@condend
+ \global\let\general@files=\L
% \end{macrocode}
% Let's make a shorthand for the code that terminates our recursion.
% \begin{macrocode}
- \def\T{\@firstoftwo{\endcsname\@empty\@gobbletwo}}%
+ \def\T{\@firstoftwo{\endcsname\@empty\@gobbletwo}}%
% \end{macrocode}
% Set all the loaded general files to an error function.
% \begin{macrocode}
- \let\N\rqv@overloaded \@xp\rqv@set\general@files \T
+ \let\N\rqv@overloaded \@xp\rqv@set\general@files \T
% \end{macrocode}
% Set all the required files to an ignore function.
% \begin{macrocode}
- \let\N\@gobble \@xp\rqv@set\rqv@list \T
+ \let\N\@gobble
+ \@xp\rqv@set\rqv@list \T
% \end{macrocode}
% Execute all the general files.
% \begin{macrocode}
- \@xp\rqv@test\general@files{\endcsname\csname @gobbletwo}%
+ \@xp\rqv@test\general@files{\endcsname\csname @gobbletwo}%
% \end{macrocode}
% And now do essentially the same thing in the reverse direction.
% \begin{macrocode}
- \let\N\rqv@notloaded \@xp\rqv@set\rqv@list \T
- \let\N\@gobble \@xp\rqv@set\general@files \T
- \@xp\rqv@test\rqv@list{\endcsname\csname @gobbletwo}%
- \endgroup
+ \let\N\rqv@notloaded
+ \@xp\rqv@set\rqv@list \T
+ \let\N\@gobble
+ \@xp\rqv@set\general@files \T
+ \@xp\rqv@test\rqv@list{\endcsname\csname @gobbletwo}%
+ \endgroup
}
% \end{macrocode}
+% \end{macro}
%
% Compensate for a bug in old versions of \fn{amsgen.sty}. This is a
% little tricky.
@@ -958,13 +1189,14 @@
% \begin{macrocode}
%\@namedef{ver@amsgen.sty}{1996/10/29 v1.2b}
\AtBeginDocument{%
- \@ifundefined{ver@amsgen}{}{%
- \@xp\let\csname ver@amsgen.sty\@xp\endcsname
- \csname ver@amsgen\endcsname
- }%
+ \@ifundefined{ver@amsgen}{}{%
+ \@xp\let\csname ver@amsgen.sty\@xp\endcsname
+ \csname ver@amsgen\endcsname
+ }%
}
% \end{macrocode}
%
+% \begin{macro}{\ProvidesFile}
% Because \cs{ProvidesFile} is used in \fn{.fd} files which are
% normally read with special catcodes, there tend to
% be problems with whitespace characters being erroneously lost from
@@ -973,10 +1205,10 @@
% affected some older versions of \latex/.
% \begin{macrocode}
\def\ProvidesFile#1{%
- \def\snap@checker{\snap@check{#1}}%
- \begingroup
- \aftergroup\snap@checker
- \catcode`\ 10
+ \def\snap@checker{\snap@check{#1}}%
+ \begingroup
+ \aftergroup\snap@checker
+ \catcode`\ 10
% \end{macrocode}
% Added guards from 2001/06/01 version of \latex/. These are
% necessary because, for example, \pkg{inputenc} sets
@@ -984,17 +1216,19 @@
% reading input encoding files. The guards prevent an ``invalid
% character'' error.
% \begin{macrocode}
- \ifnum\endlinechar < 256
- \ifnum \endlinechar>\m@ne
- \catcode\endlinechar 10
+ \ifnum\endlinechar < 256
+ \ifnum \endlinechar>\m@ne
+ \catcode\endlinechar 10
+ \fi
\fi
- \fi
- \@makeother\/%
- \@makeother\&%
- \kernel@ifnextchar[{\snap@providesfile{#1}}{\snap@providesfile{#1}[]}%
+ \@makeother\/%
+ \@makeother\&%
+ \kernel@ifnextchar[{\snap@providesfile{#1}}{\snap@providesfile{#1}[]}%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@graphic@test}
% Normally the string found in the second arg of \cs{ProvidesFile}
% (for a nongraphics file) would begin with the usual date string.
% The \cs{includegraphics} command, however, begins the second arg
@@ -1005,18 +1239,29 @@
% \begin{macrocode}
\def\snap@graphic@test#1#2#3\@nil{r\if G#1#2\else X\fi}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@providesfile}
% \begin{macrocode}
\def\snap@providesfile#1[#2]{%
- \wlog{File: #1 #2}%
- \if\snap@graphic@test#2@@\@nil
- \snap@record@graphic#1\relax #2 (type ??)\@nil
- \else
- \expandafter\xdef\csname ver@#1\endcsname{#2}%
- \fi
- \endgroup
+ \wlog{File: #1 #2}%
+% \end{macrocode}
+% Adopt a suggestion made by user egrep on the \TeX\ stack exchange
+% (\url{https://tex.stackexchange.com/questions/508985}) but
+% without the use of the \cs{expanded} extension. This makes it
+% more likely that \pkg{snapshot} can deal with macros inside the
+% optional arguments of \cs{Provides...} commands.
+% \begin{macrocode}
+ \edef\@tempa{#2}%
+ \if\@xp\snap@graphic@test\@tempa @@\@nil
+ \snap@record@graphic#1\relax #2 (type ??)\@nil
+ \else
+ \@xp\xdef\csname ver@#1\endcsname{#2}%
+ \fi
+ \endgroup
}
% \end{macrocode}
+% \end{macro}
%
% This is what \cn{includegraphics} does to record graphic file
% information.
@@ -1028,77 +1273,90 @@
%#2<-Graphic file (type eps)
%\end{verbatim}
%
+% \begin{macro}{\snap@record@graphic}
% Check the graphics info.
% \begin{macrocode}
\def\snap@record@graphic#1\relax #2(type #3)#4\@nil{%
- \expandafter\xdef\csname ver@#1\endcsname{%
- Graphic%
- \if\snap@bbinfo :bb=\Gin@llx/\Gin@lly/\Gin@urx/\Gin@ury\fi
- \space v0.0%
- }%
+ \expandafter\xdef\csname ver@#1\endcsname{%
+ Graphic%
+ \if\snap@bbinfo :bb=\Gin@llx/\Gin@lly/\Gin@urx/\Gin@ury\fi
+ \space v0.0%
+ }%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\@pr@videpackage}
% \begin{macrocode}
\def\@pr@videpackage [#1]{%
- \expandafter\xdef\csname ver@\@currname.\@currext\endcsname{#1}%
- \ifx\@currext\@clsextension
- \typeout{Document Class: \@gtempa\space#1}%
- \else
- \wlog{Package: \@gtempa\space#1}%
- \fi
- \snap@check{\@currname.\@currext}%
+ \expandafter\xdef\csname ver@\@currname.\@currext\endcsname{#1}%
+ \ifx\@currext\@clsextension
+ \typeout{Document Class: \@gtempa\space#1}%
+ \else
+ \wlog{Package: \@gtempa\space#1}%
+ \fi
+ \snap@check{\@currname.\@currext}%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@selfcheck@a}
% \begin{macrocode}
\def\snap@selfcheck@a{\snap@check{snapshot.sty}}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\@nofmt}
% \begin{macrocode}
\def\@nofmt#1.fmt.#2 {#1 }
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@mismatch@a}
% \begin{macrocode}
\def\snap@mismatch@a#1#2#3{%
- \snap@mismatch{snapshot}{^^J%
- \space\space Required version #2 of \@nofmt#1.fmt. and^^J%
- \space\space provided version #3 do not match%
- }\@ehc
+ \snap@mismatch{snapshot}{^^J%
+ \space\space Required version #2 of \@nofmt#1.fmt. and^^J%
+ \space\space provided version #3 do not match%
+ }\@ehc
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@compare@versions}
% When comparing \cs{rqv@foo.sty} (information from a previous
% \latex/ run) with \cs{ver@foo.sty} (information from current run),
% we first call \cs{snap@trim@version} on the latter to clear away
% any idiosyncrasies in the contents.
% \begin{macrocode}
\def\snap@compare@versions#1{%
- \begingroup
- \@ifundefined{rqv@#1}{}{%
- \edef\0{\csname rqv@#1\endcsname}%
- \edef\1{\csname ver@#1\endcsname}%
- \edef\1{\@xp\snap@trim@version\1 v0.0 v0.0 \@nil}%
- \edef\@tempa{\@xp\snap@select\0 v0.0 v0.0 \@nil}%
- \edef\@tempb{\@xp\snap@select\1 v0.0 v0.0 \@nil}%
- \ifx\@tempa\@tempb
- \else
- \edef\@tempd{\@nx\snap@mismatch@a{#1}{\@tempa}{\@tempb}}%
- \@xp\@tempd
- \fi
- }%
- \endgroup
+ \begingroup
+ \@ifundefined{rqv@#1}{}{%
+ \edef\0{\csname rqv@#1\endcsname}%
+ \edef\1{\csname ver@#1\endcsname}%
+ \edef\1{\@xp\snap@trim@version\1 v0.0 v0.0 \@nil}%
+ \edef\@tempa{\@xp\snap@select\0 v0.0 v0.0 \@nil}%
+ \edef\@tempb{\@xp\snap@select\1 v0.0 v0.0 \@nil}%
+ \ifx\@tempa\@tempb \else
+ \edef\@tempd{\@nx\snap@mismatch@a{#1}{\@tempa}{\@tempb}}%
+ \@xp\@tempd
+ \fi
+ }%
+ \endgroup
% \end{macrocode}
% When the \opt{test} option is in effect, jump out of the current
% file instead of continuing.
% \begin{macrocode}
- \snap@test@abort
+ \snap@test@abort
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@test@abort}
% \begin{macrocode}
\let\snap@test@abort=\@empty
% \end{macrocode}
+% \end{macro}
%
% \section{Compatibility}
%
@@ -1122,8 +1380,8 @@
%
% \begin{macrocode}
\ifx\snap@select\@empty
- \let\snap@compare@versions\@gobble
- \let\snap@check\@gobble
+ \let\snap@compare@versions\@gobble
+ \let\snap@check\@gobble
\fi
% \end{macrocode}
%
@@ -1155,13 +1413,13 @@
% \begin{macrocode}
\def\restore@some@catcodes{}
\def\save@some@catcodes{%
- \edef\restore@some@catcodes{%
- \catcode\number`\@=\number\catcode`\@
- \catcode\number`\"=\number\catcode`\"
- \catcode\number`\^=\number\catcode`\^
- \catcode\number`\_=\number\catcode`\_
- \relax
- }%
+ \edef\restore@some@catcodes{%
+ \catcode\number`\@=\number\catcode`\@
+ \catcode\number`\"=\number\catcode`\"
+ \catcode\number`\^=\number\catcode`\^
+ \catcode\number`\_=\number\catcode`\_
+ \relax
+ }%
}
% \end{macrocode}
%
@@ -1187,82 +1445,99 @@
% executed and that the \cs{if@compatibility} switch got set
% accordingly.
%
+% \begin{macro}{\snap@intest}
% \begin{macrocode}
\def\snap@intest#1#2{%
- \message{^^J}%
- \begingroup \edef\0{#1#2}\def\9{latex209.def}%
- \ifx\0\9\global\@compatibilitytrue \fi
- \ifx#2\snapx@format
+ \message{^^J}%
+ \begingroup
+ \edef\0{#1#2}%
+ \def\9{latex209.def}%
+ \ifx\0\9\global\@compatibilitytrue \fi
+ \ifx#2\snapx@format
% \end{macrocode}
% If arg1 + arg2 = ``LaTeX2e.fmt'', the calling function
% \cs{snap@storeb} will run \cs{snap@check} separately.
% This is a crude way of making things work in that case without
% much extra trouble.
% \begin{macrocode}
- \def\snap@test@abort{\endgroup}%
- \else
- \edef\N{%
- \noexpand\snap@intest@b{#1#2}%
- {#1}{\@xp\@gobble#2\@empty}%
- {\csname rqv@#1#2\endcsname}}%
- \expandafter\endgroup\N
- \fi
+ \def\snap@test@abort{\endgroup}%
+ \else
+ \edef\N{%
+ \noexpand\snap@intest@b{#1#2}%
+ {#1}{\@xp\@gobble#2\@empty}%
+ {\csname rqv@#1#2\endcsname}}%
+ \expandafter\endgroup\N
+ \fi
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@intest@b}
% \begin{macrocode}
\def\snap@intest@b#1#2#3#4{%
- \def\@currname{#2}\def\@currext{#3}%
- \begingroup \lccode`\/=`\0\relax\lowercase{\endgroup
- \ifnum\snap@seldate#4 00 0\@nil>\z@
- }% matches \lowercase
- \save@some@catcodes
- \@@input #1 \relax
- \restore@some@catcodes
- \else
- \snap@specialtest{#1}{#4}%
- \fi
+ \def\@currname{#2}%
+ \def\@currext{#3}%
+ \begingroup
+ \lccode`\/=`\0\relax\lowercase{\endgroup
+ \ifnum\snap@seldate#4 00 0\@nil>\z@
+ }% matches \lowercase
+ \save@some@catcodes
+ \@@input #1 \relax
+ \restore@some@catcodes
+ \else
+ \snap@specialtest{#1}{#4}%
+ \fi
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\snap@specialtest}
% \begin{macrocode}
\def\snap@specialtest#1#2{%
- \fake@input{#1}%
+ \fake@input{#1}%
}
% \end{macrocode}
+% \end{macro}
%
+% \begin{macro}{\fake@input}
% \begin{macrocode}
\def\fake@input#1{%
- \begingroup
- % Ensure that outer \foo or unmatched braces don't trip us up
- \catcode`\\=12 \catcode`\{=12 \catcode`\}=12
- \endinput
+ \begingroup
+ % Ensure that outer \foo or unmatched braces don't trip us up
+ \catcode`\\=12
+ \catcode`\{=12
+ \catcode`\}=12
+ \endinput
% \end{macrocode}
% Note that these definitions of \cs{G} and \cs{?} are local, and
% recall that one-letter cs names don't use up hash table entries.
% \begin{macrocode}
- \def\G{\@car\endgroup}%
- \expandafter\futurelet\expandafter\?\expandafter\G\@@input#1 \relax\@nil
+ \def\G{\@car\endgroup}%
+ \expandafter\futurelet\expandafter\?\expandafter\G\@@input#1 \relax\@nil
}
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
\let\snap@test@abort=\endinput
\let\snap@selfcheck=\@empty
% \end{macrocode}
%
+% \begin{macro}{\snap@finish}
% There's an extra close-brace left hanging around at the end, but I
% guess we don't care.
% \begin{macrocode}
\def\snap@finish{%%
- \endgroup \message{^^J}%
- \def\X##1{##1,\X}%
- \edef\@filelist{\@xp\X\rqv@list{\@gobbletwo}}%
- \def\X##1,?{##1}\edef\@filelist{\@xp\X\@filelist ?}%
- \@dofilelist
- \@@end
-}%
+ \endgroup
+ \message{^^J}%
+ \def\X##1{##1,\X}%
+ \edef\@filelist{\@xp\X\rqv@list{\@gobbletwo}}%
+ \def\X##1,?{##1}\edef\@filelist{\@xp\X\@filelist ?}%
+ \@dofilelist
+ \@@end
+}
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
\def\snap@mismatch#1#2#3{}
@@ -1273,25 +1548,24 @@
% \cs{ProvidesFile} at all.
% \begin{macrocode}
\renewcommand{\RequireVersions}[2][]{%
- \begingroup
- \makeatletter
- \def\snap@check{\snap@compare@versions}%%
- \let\snapx@tfm=\snap@ignore
+ \begingroup
+ \makeatletter
+ \def\snap@check{\snap@compare@versions}%%
+ \let\snapx@tfm=\snap@ignore
% \end{macrocode}
% This seems to help, with english.ldf for example, to prevent an
% endless loop when attempting to load babel.def.
% \begin{macrocode}
- \def\ProvidesLanguage##1{\ProvidesFile{##1.ldf}}%
- \iffalse{\fi \futurelet\@let@token\snap@branch #2}%
- \endgroup
+ \def\ProvidesLanguage##1{\ProvidesFile{##1.ldf}}%
+ \iffalse{\fi \futurelet\@let@token\snap@branch #2}%
+ \endgroup
}
% \end{macrocode}
%
+% \section{Finale}
+%
% 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{1209}
-% \Finale
diff --git a/Master/texmf-dist/source/latex/snapshot/snapshot.ins b/Master/texmf-dist/source/latex/snapshot/snapshot.ins
index 262760e4c9b..289c09b82c9 100644
--- a/Master/texmf-dist/source/latex/snapshot/snapshot.ins
+++ b/Master/texmf-dist/source/latex/snapshot/snapshot.ins
@@ -1,6 +1,6 @@
%% filename: snapshot.ins
-%% version: 1.00
-%% date: 2010/08/13
+%% version: 1.01
+%% date: 2020/06/16
%%
%% American Mathematical Society
%% Technical Support
@@ -13,7 +13,7 @@
%% fax: (401) 331-3842
%% email: tech-support@ams.org
%%
-%% Copyright 2010 American Mathematical Society.
+%% Copyright 2010, 2020 American Mathematical Society.
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
@@ -38,7 +38,7 @@
\preamble
-Copyright 2001, 2004, 2006, 2007, 2010, 2012 American Mathematical Society.
+Copyright 1999-2003, 2004, 2010, 2012, 2020 American Mathematical Society.
American Mathematical Society
Technical Support
diff --git a/Master/texmf-dist/source/latex/soul/Makefile b/Master/texmf-dist/source/latex/soul/Makefile
deleted file mode 100644
index 1a0103f695c..00000000000
--- a/Master/texmf-dist/source/latex/soul/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-# $Id: Makefile,v 1.7 2003/06/22 09:23:35 m Rel $
-
-NAME=soul
-ARCHNAME=$(NAME).tar.gz
-ARCHIVE=$(NAME).dtx Makefile $(NAME).txt $(NAME).ins
-MAKEIDXOPT=
-DVIPSOPT=#-Pcmz -Pamz
-DEP=$(NAME).sty
-
-all: $(NAME).sty $(NAME).ps
-
-print: $(NAME).ps
- psbook $(NAME).ps|psnup -2|psselect -e|lpr
- @ echo -n revert paper stack and hit return
- @ read key
- psbook $(NAME).ps|psnup -2|psselect -o -r|lpr
-
-ps: $(NAME).ps
-
-%.ps: %.dvi
- dvips $(DVIPSOPT) $< -o $@
-
-hyper: $(NAME).dtx $(NAME).sty
- pdflatex "\relax\let\makehyperref\active\input $(NAME).dtx"
-
-$(NAME).pdf: $(NAME).dtx $(NAME).sty
- pdflatex $(NAME).dtx
-
-archive:
- @ tar -czf $(ARCHNAME) $(ARCHIVE)
- @ echo $(ARCHNAME)
-
-clean:
- rm -f $(NAME).{log,toc,lot,lof,idx,ilg,ind,aux,blg,bbl,dvi,ins,out}
-
-distclean: clean
- rm -f $(NAME).{ps,sty,pdf} $(ARCHNAME)
-
-
-REFWARN = 'Rerun to get cross-references'
-LATEXMAX = 5
-
-%.dvi: %.dtx $(DEP)
- latex $< ; true
- RUNS=$(LATEXMAX); \
- while [ $$RUNS -gt 0 ] ; do \
- if grep $(REFWARN) $*.log > /dev/null; \
- then latex $< ; else break; fi; \
- RUNS=`expr $$RUNS - 1`; \
- done
-
-$(NAME).sty: $(NAME).ins soul.dtx
- tex $(NAME).ins
-
-$(NAME).ins:
- latex $(NAME).dtx
-
diff --git a/Master/texmf-dist/source/latex/soul/soul.dtx b/Master/texmf-dist/source/latex/soul/soul.dtx
deleted file mode 100644
index 064634cf111..00000000000
--- a/Master/texmf-dist/source/latex/soul/soul.dtx
+++ /dev/null
@@ -1,4520 +0,0 @@
-% \iffalse
-%% File: soul.dtx Copyright (C) 1998--2003 Melchior FRANZ
-%% $Id: soul.dtx,v 1.128 2003/11/17 22:57:24 m Rel $
-%% $Version: 2.4 $
-%
-%<*batchfile>
-%
-% on Unix/Linux just run "make" to get the style file and the documentation,
-% else generate the driver soul.ins (if you don't already have it):
-%
-% $ latex soul.dtx
-%
-% You'll probably get an error message that you may ignore. Now generate
-% the style file:
-%
-% $ tex soul.ins
-%
-% And finally to produce the documentation run LaTeX three times:
-%
-% $ latex soul.dtx
-%
-%
-%
-%
-% DISCLAIMER: note that a Makefile could actually contain malign commands
-% that erase your whole account, so having a look at it before won't hurt!
-% I take no responsibility for any damage, but I do what I can to make
-% using the original Makefile safe.
-%
-% COPYRIGHT NOTICE:
-% This package is free software that can be redistributed and/or modified
-% under the terms of the LaTeX Project Public License as specified
-% in the file macros/latex/base/lppl.txt on any CTAN archive server,
-% such as ftp://ftp.dante.de/.
-%
-%$
-%% ====================================================================
-%% @LaTeX-package-file{
-%% author = "Melchior FRANZ",
-%% version = "2.4",
-%% date = "17 November 2003",
-%% filename = "soul.dtx",
-%% address = "Melchior FRANZ
-%% Rieder Hauptstrasse 52
-%% A-5212 SCHNEEGATTERN
-%% AUSTRIA",
-%% telephone = "++43 7746 3109",
-%% URL = "http://www.unet.univie.ac.at/~a8603365/",
-%% email = "a8603365@unet.univie.ac.at",
-%% codetable = "ISO/ASCII",
-%% keywords = "spacing out, letterspacing, underlining, striking out,
-%% highlighting",
-%% supported = "yes",
-%% docstring = "This article describes the `soul' package, which
-%% provides hyphenatable letterspacing (spacing out),
-%% underlining, and some derivatives.
-%% All features are based upon a common mechanism
-%% that allows to typeset text syllable by syllable,
-%% where the excellent TeX hyphenation algorithm is
-%% used to find the proper hyphenation points.
-%% Two examples show how to use the provided interface to
-%% implement things such as `an-a-lyz-ing syl-la-bles'.
-%% Although the package is optimized for LaTeX2e,
-%% it works with Plain TeX and with other
-%% packages, too.",
-%% }
-%% ====================================================================
-%
-%
-%
-%
-%
-\begin{filecontents}{soul.ins}
-\def\batchfile{soul.ins}
-\input docstrip.tex
-\askforoverwritefalse
-\keepsilent % <-- this is for you, Christina ;-)
-\generate{\file{soul.sty}{\from{soul.dtx}{package}}}
-\endbatchfile
-\end{filecontents}
-%</batchfile>
-%
-%
-%
-%
-%
-%<*driver>
-\def\fileversion{2.4}
-\def\filedate{2003/11/17}
-%
-%
-%
-\documentclass{ltxdoc}
-%
-%
-%
-\makeatletter\let\SOUL@sethyphenchar\relax\makeatother
-\IfFileExists{soul.sty}{%
- \usepackage{soul}[2002/01/10]
- \expandafter\ifx\csname sloppyword\endcsname\relax % old version?
- \def\sloppyword{\textbf{?? [obsolete soul version]}}
- \fi
- \let\SOULSTYfound\active
-}{%
- \GenericWarning{soul.dtx}{%
- Package file `soul.sty' couldn't be found. You should however find^^J^^A
- a file `soul.ins' in the current directory. If you type "tex soul.ins"^^J^^A
- on the command line, `soul.sty' will be generated. After that
- run "latex soul.dtx" again and you won't see this message again.
- }%
-}%
-%
-%
-%
-\ifx\makehyperref\SOULundefined
- \newcommand*\texorpdfstring[2]{#1}
-\else ^^A for "make hyper"
- \usepackage{hyperref}
- \hypersetup{
- bookmarksopen,
- colorlinks,
- pdftitle={The soul package},
- pdfauthor={Melchior FRANZ},
- pdfsubject={${}$Id: soul.dtx,v 1.128 2003/11/17 22:57:24 m Rel ${}$},
- pdfkeywords={space out, letterspacing, underlining, overstriking, highlighting}
- }
- \usepackage[pdftex]{graphicx,color}
-\fi
-%
-%
-%
-%\RecordChanges
-%
-\begin{document}
-\setcounter{tocdepth}{2}
-\DocInput{soul.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-%
-%
-%
-%
-%
-%
-% \CheckSum{2006}
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
-%
-%
-%
-% \title{The \texttt{soul} package}
-%
-% \author{Melchior \caps{FRANZ}}
-%
-% \date{November 17, 2003}
-%
-%^^A=====================================================
-%
-%^^A These messy macros allow to typeset the `example' sections
-%^^A conveniently. You'd better ignore them. I do! :-)
-%
-% \makeatletter
-%
-% \def\squarebull{\rule[.2ex]{.8ex}{.8ex}}
-%
-% \newenvironment{examples}
-% {\parindent\z@\small\fontencoding{OT1}\selectfont}
-% {\rule{\hsize}{.4pt}}
-%
-% \def\soultest#1|{\bgroup\rule[.5ex]{\hsize}{.4pt}\par
-% \parbox[t]{.34\hsize}{\raggedright\textit{#1\unskip.}}%
-% \hspace{1.5em}$\vtop\bgroup\hb@xt@.4\hsize\bgroup
-% \llap{\squarebull\hspace{.4em}}\soulttest}
-%
-% {\catcode`\|=13\gdef\soulttest{%
-% \bgroup\def\do##1{\catcode`##1=12}\dospecials\ttfamily
-% \catcode`\|=13\unskip\def|{\hss\egroup\egroup\soultttest}}}
-%
-% \def\soultttest#1{\hbox{\vtop{\hsize.4\hsize\hbadness\@M
-% \leavevmode\llap{\squarebull\hspace{.4em}}#1\null}}%
-% \egroup$\hspace{1.5em}\parbox[t]{1mm}{\hyphenpenalty-\@M
-% \exhyphenpenalty-\@M\hbadness\@M\hfuzz\maxdimen
-% \strut\llap{\squarebull\hspace{.4em}}#1\null}%
-% \goodbreak\vspace{2ex}
-% \egroup}
-%
-% \newcommand*\DescribeOption[1]{\marginpar{\raggedleft\textsf{#1}\ignorespaces}}
-%
-%
-%^^A similar to the `description' environment
-%
-% \def\describemacro{^^A
-% \bgroup
-% \let\do\@makeother
-% \dospecials
-% \catcode`{=1
-% \catcode`}=2
-% \SOUL@@@descmacro
-% }
-%
-% \def\SOUL@@@descmacro#1{^^A
-% \texttt{#1}^^A
-% \DescribeMacro{#1}^^A
-% \expandafter\edef\expandafter\x\expandafter{\expandafter\@gobble#1}^^A
-% \expandafter\label{cmd:\x}^^A
-% \egroup
-% }
-%
-%
-% \def\SOUL@@@verbitem[#1: {^^A
-% \bgroup
-% \let\do\@makeother
-% \dospecials
-% \SOUL@@@verbscan{#1}^^A
-% }
-%
-% \def\SOUL@@@verbscan#1#2]{^^A
-% \egroup
-% \goodbreak
-% \def\@currentlabel{\S\,\the\SOUL@@@itemnr}^^A
-% \label{par:#1}^^A
-% \SOUL@@@item[\textbf{\@currentlabel\hskip.6em#1:}]\hfil\break
-% Example: \texttt{#2}\hfil\break^^A
-% \advance\SOUL@@@itemnr1
-% }
-%
-% \let\SOUL@@@item\item
-% \newcount\SOUL@@@itemnr
-%
-% \newenvironment{verblist}[1]{^^A
-% \SOUL@@@itemnr=#1
-% \list{}{^^A
-% \settowidth{\labelwidth}{\indent\indent}^^A
-% \leftmargin\labelwidth
-% \advance\leftmargin\labelsep
-% \def\makelabel##1{##1}^^A
-% \let\item\SOUL@@@verbitem
-% }^^A
-% }{^^A
-% \endlist
-% }
-%
-% \newenvironment{labeling}[1]{^^A
-% \list{}{^^A
-% \settowidth{\labelwidth}{\textbf{#1}}^^A
-% \leftmargin\labelwidth\advance\leftmargin\labelsep
-% \def\makelabel##1{\textbf{##1}\hfil}^^A
-% }^^A
-% }{^^A
-% \endlist
-% }
-%
-% \newenvironment{syntax}{^^A
-% \par\medskip\def\<##1>{$\langle$\syn{##1}$\rangle$}^^A
-% \indent\begin{tabular}{l}^^A
-% }{^^A
-% \end{tabular}^^A
-% \noindentafter\medbreak
-% }
-%
-%
-% \newenvironment{example}[1][.9\textwidth]
-% {\par\medskip\indent\begin{tabular}{p{#1}l}}
-% {\end{tabular}\noindentafter\medbreak}
-%
-% \newcommand*\noindentafter{^^A
-% \global\everypar{{\setbox\z@\lastbox}\everypar{}}}
-%
-% \newcommand*\errsquare{\leavevmode\vrule height.8em depth.2em width1em\relax}
-%
-%
-% \ifx\SOULSTYfound\active
-%^^A analyze syllables---described somewhere below
-%
-% \DeclareRobustCommand*\sy{^^A
-% \SOUL@setup
-% \def\SOUL@preamble{\lefthyphenmin0\righthyphenmin0}^^A
-% \def\SOUL@everysyllable{\the\SOUL@syllable}^^A
-% \def\SOUL@everyspace##1{##1\space}^^A
-% \def\SOUL@everyhyphen{^^A
-% \discretionary{^^A
-% \SOUL@setkern\SOUL@hyphkern
-% \SOUL@sethyphenchar
-% }{}{^^A
-% \hbox{\kern1pt$\cdot$}^^A
-% }^^A
-% }^^A
-% \def\SOUL@everyexhyphen##1{^^A
-% \SOUL@setkern\SOUL@hyphkern
-% \hbox{##1}^^A
-% \discretionary{}{}{^^A
-% \SOUL@setkern\SOUL@charkern
-% }^^A
-% }^^A
-% \SOUL@}
-%
-%^^A analyze the engine---described somewhere below, too
-%
-% \DeclareRobustCommand*\an{^^A
-% \def\SOUL@preamble{$^{^P}$}^^A
-% \def\SOUL@everyspace##1{##1\texttt{\char`\ }}^^A
-% \def\SOUL@postamble{$^{^E}$}^^A
-% \def\SOUL@everyhyphen{$^{^-}$}^^A
-% \def\SOUL@everyexhyphen##1{##1$^{^=}$}^^A
-% \def\SOUL@everysyllable{$^{^S}$}^^A
-% \def\SOUL@everytoken{\the\SOUL@token$^{^T}$}^^A
-% \def\SOUL@everylowerthan{$^{^L}$}^^A
-% \SOUL@}
-%
-%^^A magazine-like (truly awful) paragraphs
-%^^A If you know what you're doing, you can copy it to your personal `soul.cfg' file.
-%
-% \DeclareRobustCommand*\magstylepar{\SOUL@sosetup
-% \def\SOUL@preamble{^^A
-% \edef\SOUL@soletterskip{\z@\@plus\fontdimen2\font\@minus\z@}^^A
-% \edef\SOUL@soinnerskip{\the\fontdimen2\font
-% \@plus\the\fontdimen3\font\@minus\the\fontdimen4\font}^^A
-% \let\SOUL@soouterskip\SOUL@soinnerskip
-% \SOUL@sopreamble}^^A
-% \lefthyphenmin2\righthyphenmin2\SOUL@}
-%
-%\else
-%
-%^^A The package has not been found, so we're providing some dummies, just
-%^^A to avoid all these `Undefined command sequence' messages.
-%
-% \def\SOUL@@@X#1{\textbf{??}}%
-% \let\so\SOUL@@@X
-% \let\textso\SOUL@@@X
-% \let\caps\SOUL@@@X
-% \let\textcaps\SOUL@@@X
-% \let\ul\SOUL@@@X
-% \let\textul\SOUL@@@X
-% \let\st\SOUL@@@X
-% \let\textst\SOUL@@@X
-% \let\hl\SOUL@@@X
-% \let\texthl\SOUL@@@X
-% \let\sy\SOUL@@@X
-% \let\an\SOUL@@@X
-% \let\magstylepar\SOUL@@@X
-% \let\sloppyword\SOUL@@@X
-% \def\sodef#1#2#3#4{\let#1\relax\SOUL@@@X}%
-% \fi
-%
-% \newcommand*\xpath{^^A
-% \bgroup
-% \let\do\@makeother
-% \dospecials
-% \catcode`\{=1
-% \catcode`\}=2
-% \def\{{\char"7B}^^A
-% \def\}{\char"7D}^^A
-% \SOUL@@@code
-% }
-%
-% \newcommand*\SOUL@@@code[1]{\normalfont\texttt{#1}\egroup}
-%
-% \let\cs\xpath
-% \let\option\textsf
-% \def\package#1{{\normalfont\texttt{#1}}}
-% \let\program\texttt
-% \let\bibtitle\textit
-% \let\syn\textit
-%
-% \sodef\person{\scshape}{0.06em}{0.45em}{0.4em}
-% \sodef\SOUL@@@versal{\upshape}{0.125em}{0.4583em}{0.5833em}
-% \DeclareRobustCommand*\versal[1]{^^A
-% \MakeUppercase{\SOUL@@@versal{#1}}^^A
-% }
-%
-% \def\ConTeXt{Con\TeX t}
-% \def\CTAN{{\small\caps{CTAN}}}
-% \def\soul{\package{soul}}
-%
-% ^^A set some parameters as used in Plain TeX
-% \def\plainsetup{^^A
-% \pretolerance100
-% \tolerance200
-% \hbadness1000
-% \linepenalty10
-% \hyphenpenalty50
-% \exhyphenpenalty50
-% \doublehyphendemerits10000
-% \finalhyphendemerits5000
-% \adjdemerits10000
-% \hfuzz.1pt
-% \overfullrule5pt
-% }
-%
-% \def\FIXME#1{\message{<FIXME>}#1}
-%
-% \makeatother
-%
-%
-% \lefthyphenmin2
-% \righthyphenmin3
-% \hyphenation{Le-se-ty-po-gra-phie Ver-bin-dung fak-si-mi-le}
-%
-%
-%^^A=====================================================
-%
-%
-% \changes{v1.0}{1998/10/16}{Initial version}%
-%^^A due to an error in the documentation of v1.0, there's no v1.1 :-(
-% \changes{v1.1a}{1998/12/08}{fixed a bunch of bugs; `magstylepar command
-% banned; `caps introduced; `so and `caps recognize following spaces;
-% error message added; `so parameters are mandatory}
-%
-% \changes{v1.2}{1999/01/11}{fixed the newline bug; added the `\(>\) command}
-%
-% \changes{v1.3}{1999/05/15}{changed allowhyphen, preambles; added a paragraph
-% in the `features' section}
-%
-% \changes{v2.0}{2002/01/03}{(almost) complete rewrite}
-%
-% \changes{v2.1}{2002/01/10}{Happy (64th) birthday, Don!
-% ``The now-traditional fix for the
-% now-traditional brown-paper-bag major release.''
-% as Eric S. RAYMOND commented on his CML2.0.1 release. ;-)}
-%
-% \changes{v2.2}{2002/05/12}{fixed a couple of bugs; added support for
-% the Plain TeX color.sty wrapper}
-%
-% \changes{v2.3}{2002/05/29}{compatibility with cmbright/ccfonts}
-%
-% \changes{v2.4}{2003/11/17}{Fix the font bug. Fix a scanner bug.
-% Other bugfixes; change caps set handling; add footnote and
-% textsuperscript support}
-%
-%
-%
-%
-%
-% \maketitle
-%
-%
-%
-% \begin{abstract}
-% This article describes the \soul\ package^^A
-%^^A%%
-% \footnote{This file has version number \fileversion, last revised \filedate.},
-%^^A%%
-% which provides \so{hyphenatable letterspacing (spacing out),} \ul{underlining}
-% and some derivatives such as \st{overstriking} and highlighting.
-% Although the package is optimized for \LaTeXe, it also works with
-% Plain \TeX\ and with other flavors of \TeX\ like, for instance, \ConTeXt.
-% By the way, the package name |soul| is only a combination
-% of the two macro names \cs{\so} (space out) and \cs{\ul}
-% (underline)---nothing poetic at all.^^A :-(
-% \end{abstract}
-%
-%
-% {\setlength\parskip{0pt}\tableofcontents }
-% \addtocontents{toc}{\protect\begin{multicols}{2}}
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{Typesetting rules}
-% \label{sec:typesetting}
-%
-% There are several possibilities to emphasize parts of a paragraph,
-% not all of which are considered good style. While underlining
-% is commonly rejected, experts dispute about whether letterspacing
-% should be used or not, and in which cases. If you are not interested
-% in such debates, you may well skip to the next section.
-%
-%
-% \subsection*{Theory \dots}
-% \label{sec:theory}
-%
-% To understand the experts' arguments we have to know about the
-% conception of \emph{page grayness.} The sum of all characters on
-% a page represents a certain amount of grayness, provided that
-% the letters are printed black onto white paper.
-%
-% \person{Jan Tschichold} \cite{Tschichold}, a well known and recognized
-% typographer, accepts only forms of emphasizing, which do not disturb this
-% grayness. This is only true of italic shape, caps, and
-% caps-and-small-caps fonts, but not of ordinary letterspacing, underlining,
-% bold face type and so on, all of which appear as either dark or light
-% spots in the text area. In his opinion emphasized text shall not catch the eye when
-% running over the text, but rather when actually reading the respective words.
-%
-% Other, less restrictive typographers \cite{Willberg} call this kind of emphasizing
-% `integrated' or `aesthetic', while they describe `active' emphasizing apart from it,
-% which actually \emph{has} to catch the reader's eye. To the latter group belong commonly
-% despised things like letterspacing, demibold face type and even underlined and colored text.
-%
-% On the other hand, \person{Tschichold} suggests
-% to space out caps and caps-and-small-caps fonts on title pages, headings and running headers from
-% 1\,pt up to 2\,pt.
-% Even in running text legibility of uppercase letters should be improved with slight
-% letterspacing, since (the Roman) majuscules don't look right, if they are spaced
-% like (the Carolingian) minuscules.\footnote{This suggestion is followed throughout this article,
-% although Prof.~\person{Knuth} already considered slight letterspacing with his |cmcsc| fonts.}
-%
-%
-%
-%\subsection*{\dots\ and Practice}
-%
-% However, in the last centuries letterspacing was excessively used,
-% underlining at least sometimes, because capitals and italic shape could
-% not be used together with the \emph{Fraktur} font and other black-letter fonts,
-% which are sometimes also called ``old German'' fonts.
-% This tradition is widely continued until today. The same limitations apply still today
-% to many languages with non-latin glyphs, which is why letterspacing has a strong
-% tradition in eastern countries where Cyrillic fonts are used.
-%
-% The \person{Duden} \cite{Duden}, a well known German dictionary, explains how to space out properly:
-% \emph{Punctuation marks are spaced out like letters, except quotation marks and periods.
-% Numbers are never spaced out. The German syllable \mbox{\emph{-sche}} is not spaced
-% out in cases like \emph{``der {\so{Virchow{sche}}} Versuch''}\footnote{the \person{Virchow} experiment}.
-% In the old German \emph{Fraktur} fonts the ligatures \emph{|ch|, |ck|, |sz|~(\ss)} and~\emph{|tz|} are
-% not broken within spaced out text.}
-%
-% While some books follow all these rules \cite{Muszynski}, others don't
-% \cite{Reglement}. In fact, most books in my personal library do \emph{not} space out commas.
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{Short introduction and common rules}
-%
-% The \soul\ package provides five commands that are aimed at emphasizing
-% text parts. Each of the commands takes one argument that can either be
-% the text itself or the name of a macro that contains text (e.\,g.~|\so\text|)^^A
-% ^^A
-% \footnote{See~\ref{par:Unexpandable material in command sequences} for
-% some additional information about the latter mode.}^^A
-% ^^A
-% .
-% See table~\ref{tab:survey} for a complete command survey.
-%
-% {\catcode`\|=12
-% \begin{center}
-% \begin{tabular}{r@{\hspace{1.5em}}l}
-% \verb+\so{letterspacing}+&\so{letterspacing}\\
-% \verb+\caps{CAPITALS, Small Capitals}+&\caps{CAPITALS, Small Capitals}\\
-% \verb+\ul{underlining}+&\ul{underlining}\\
-% \verb+\st{overstriking}+&\st{overstriking}\\
-% \verb+\hl{highlighting}+&highlighting\footnotemark\\
-% \end{tabular}
-% \end{center}
-% \footnotetext{The look of highlighting is nowhere demonstrated
-% in this documentation, because it requires a Postscript aware
-% output driver and would come out as ugly black bars on other
-% devices, looking very much like censoring bars. Think of it as
-% the effect of one of those coloring text markers.}
-% }
-%
-% \noindent
-% The \cs{\hl} command does only highlight if the \package{color} package
-% was loaded, otherwise it falls back to underlining.\footnote{Note that
-% you can also use \LaTeX's \package{color} package with Plain \TeX.
-% See~\ref{sec:plain} for details.} The highlighting
-% color is by default yellow, underlines and overstriking lines are by
-% default black. The colors can be changed using the following commands:
-%
-% {\catcode`\|=12
-% \begin{center}
-% \begin{tabular}{r@{\hspace{1.5em}}l}
-% \verb+\setulcolor{red}+&set underlining color\\
-% \verb+\setstcolor{green}+&set overstriking color\\
-% \verb+\sethlcolor{blue}+&set highlighting color\\
-% \end{tabular}
-% \end{center}
-% }
-%
-% \noindent
-% |\setulcolor{}| and |\setstcolor{}| turn coloring off.
-% There are only few colors predefined by the \package{color}
-% package, but you can easily add custom color definitions.
-% See the \package{color} package documentation~\cite{color} for further
-% information.
-%
-% \begin{example}
-% |\usepackage{color,soul}|\\
-% |\definecolor{lightblue}{rgb}{.90,.95,1}|\\
-% |\sethlcolor{lightblue}|\\
-% |...|\\
-% |\hl{this is highlighted in light blue color}|\\
-% \end{example}
-%
-%
-%
-%
-%
-%
-%
-% \subsection[Some things work]{Some things work \dots}
-%
-% The following examples may look boring and redundant, because they describe
-% nothing else than common \LaTeX\ notation with a few exceptions, but this is
-% only the half story: The \soul\ package has to pre-process the argument
-% before it can split it into characters and syllables, and all described
-% constructs are only allowed because the package explicitly implements them.
-%
-% \begin{verblist}{1}
-% \item[Accents: \so{na\"\i ve}]
-% Accents can be used naturally.
-% Support for the following accents is built-in: |\`|, |\'|, |\^|, |\"|, |\~|,
-% |\=|, |\.|, |\u|, |\v|, |\H|, |\t|, |\c|, |\d|, |\b|, and |\r|. Additionally,
-% if the \package{german} package \cite{german} is loaded you can also use the |"|
-% accent command and write |\so{na"ive}|. See section~\ref{sec:soulaccent} for how to add
-% further accents.
-% \item[Quotes: \so{``quotes''}]
-% The \soul\ package recognizes the quotes ligatures |``|, |''| and |,,|.
-% The Spanish ligatures |!`| and |?`| are not recognized and have, thus,
-% to be written enclosed in braces like in |\caps{{!`}Hola!}|.
-% \item[Mathematics: \so{foo$x^3$bar}]
-% Mathematic formulas are allowed, as long as they are
-% surrounded by~\texttt\$. Note that the \LaTeX\
-% equivalent |\(...\)| does not work.
-% \item[Hyphens and dashes: \so{re-sent}]
-% Explicit hyphens as well as en-dashes~(|--|), em-dashes~(|---|)
-% and the |\slash| command work as usual.
-% \item[Newlines: \so{new\\line}]
-% The |\\|~command fills the current line with white space
-% and starts a new line. Spaces or linebreaks afterwards are ignored.
-% Unlike the original \LaTeX\ command \soul's version does not handle
-% optional parameters like in |\\*[1ex]|.
-% \item[Breaking lines: \so{foo\linebreak bar}]
-% The \cs{\linebreak} command breaks the line without
-% filling it with white space at the end. \soul's version
-% does not handle optional parameters like in |\linebreak[1]|.
-% \cs{\break} can be used as a synonym.
-% \item[Unbreakable spaces: \so{don't~break}]
-% The |~|~command sets an unbreakable space.
-% \item[Grouping: \so{Virchow{sche}}]
-% A pair of braces can be used to let a group of characters
-% be seen as one entity, so that \soul\ does
-% for instance not space it out. The contents must, however,
-% not contain potential hyphenation points. (See~\ref{par:Protecting})
-% \item[Protecting: \so{foo \mbox{little} bar}]
-% An \cs{\mbox} also lets \soul\ see the contents as one
-% item, but these may even contain hyphenation points. \cs{\hbox} can
-% be used as a synonym.
-% \item[Omitting: \so{\soulomit{foo}}]
-% The contents of \cs{\soulomit} bypass the soul core and are typeset
-% as is, without being letterspaced or underlined. Hyphenation points are
-% allowed within the argument. The current font remains active, but can be
-% overridden with \cs{\normalfont} etc.
-% \item[Font switching commands: \so{foo \texttt{bar}}]
-% All standard \TeX\ and \LaTeX\ font switching commands are allowed, as
-% well as the \package{yfonts} package \cite{yfonts} font commands like \cs{\textfrak} etc.
-% Further commands have to be registered using the \cs{\soulregister}
-% command (see section~\ref{sec:soulregister}).
-% \item[Breaking up ligatures: \ul{Auf{}lage}]
-% Use |{}| or \cs{\null} to break up ligatures like `fl' in \cs{\ul}, \cs{\st} and \cs{\hl}
-% arguments.
-% This doesn't make sense for \cs{\so} and \cs{\caps}, though, because they break up
-% every unprotected (ungrouped\slash unboxed) ligature, anyway, and would
-% then just add undesirable extra space around the additional item.
-% \end{verblist}
-%
-%
-%
-%
-% \subsection{\texorpdfstring{\dots\ }{... }others don't}
-%
-% Although the new \soul\ is much more robust and forgiving than
-% versions prior to~2.0, there are
-% still some things that are not allowed in arguments.
-% This is due to the complex engine, which has to read and inspect every
-% character before it can hand it over to \TeX's paragraph builder.
-%
-% \begin{verblist}{20}
-% \item[Grouping hyphenatable material: \so{foo {little} bar}]
-% Grouped characters must not contain hyphenation points. Instead of
-% |\so{foo {little}}| write |\so{foo \mbox{little}}|. You get a
-% \texttt{`Re\-con\-struction failed'} error and a black square like
-% \errsquare\ in the \caps{DVI} file where you violated this rule.
-% \item[Discretionary hyphens: \so{Zu\discretionary{k-}{}{c}ker}]
-% The argument must not contain discretionary hyphens. Thus, you have to
-% handle cases like the German word |Zu\discretionary{k-}{}{c}ker| by yourself.
-% \item[Nested soul commands: \ul{foo \so{bar} baz}]
-% \soul\ commands must not be nested. If you really
-% need such, put the inner stuff in a box and use this box. It will, of
-% course, not get broken then.\\
-% \null\qquad|\newbox\anyboxname|\\
-% \null\qquad|\sbox\anyboxname{ \so{the worst} }|\\
-% \null\qquad|\ul{This is by far{\usebox\anyboxname}example!}|\\
-% yields:\\
-% \newbox\anyboxname
-% \sbox\anyboxname{ \so{the worst} }
-% \null\qquad\ul{This is by far{\usebox\anyboxname}example!}
-% \item[Leaking font switches: \def\foo{\bf bar} \so{\foo baz}]
-% A hidden font switching command that leaks into its neighborship
-% causes a \texttt{`Reconstruction failed'} error. To avoid this either
-% register the `container' (|\soulregister{\foo}{0}|), or limit its
-% scope as in |\def\foo{{\bf bar}}|. Note that both
-% solutions yield slightly different results.
-% \item[Material that needs expansion: \so{\romannumeral\year}]
-% In this example \cs{\so} would try to put space between \cs{\romannumeral}
-% and \cs{\year}, which can, of course, not work.
-% You have to expand the argument before you feed it to \soul, or even better:
-% Wrap the material up in a command sequence and let \soul\ expand it:
-% |\def\x{\romannumeral\year}| |\so\x|. \soul\ tries hard to expand
-% enough, yet not too much.
-% \item[Unexpandable material in command sequences: \def\foo{\bar} \so\foo]
-% Some macros might not be expandable in an \cs{\edef} definition^^A
-% \footnote{Try \texttt{\string\edef\string\x\char`\{\string\copyright\char`\}}.
-% Yet \texttt{\string\copyright} works in \soul\ arguments, because it is
-% explicitly taken care of by the package}
-% and have to be protected with \cs{\noexpand} in front. This is automatically done
-% for the following tokens: |~|, \cs{\,}, \cs{\TeX}, \cs{\LaTeX},
-% \cs{\S}, \cs{\slash}, \cs{\textregistered}, \cs{\textcircled}, and \cs{\copyright},
-% as well as for all registered fonts and accents. Instead of putting \cs{\noexpand}
-% manually in front of such commands, as in |\def\foo{foo {\noexpand\bar} bar}| |\so\foo|,
-% you can also register them as special (see section \ref{sec:soulregister}).
-% \item[Other weird stuff: \so{foo \verb|\bar| baz}]
-% \soul\ arguments must not contain \LaTeX\ environments, command definitions,
-% and fancy stuff like |\vadjust|. \soul's |\footnote| command replacement
-% does not support optional arguments. As long as you are writing simple,
-% ordinary `horizontal' material, you are on the safe side.
-% \end{verblist}
-%
-%
-%
-%
-%
-%
-%
-% \begin{table}
-% \begin{center}
-% \catcode`\|=12
-% \newcommand*\pref[1]{{\footnotesize\pageref{cmd:#1}}}
-% \newcommand*\Ast{\rlap{$^\ast$}}
-% \let\m\cs
-% \let\ti\textit
-% \begin{tabular}{r@{\hspace{.6em}}c@{\hspace{.6em}}l}
-% &\hbox to0pt{\hss\footnotesize page\hss}&\\[.5ex]
-% \verb+\so{letterspacing}+& \pref{so} &\so{letterspacing}\\
-% \verb+\caps{CAPITALS, Small Capitals}+& \pref{caps} &\caps{CAPITALS, Small Capitals}\\
-% \verb+\ul{underlining}+& \pref{ul} &\ul{underlining}\\
-% \verb+\st{striking out}+& \pref{st} &\st{striking out}\\
-% \verb+\hl{highlighting}+& \pref{hl} &highlighting\\
-% \\
-% \verb+\soulaccent{\cs}+& \pref{soulaccent} &\ti{add accent} \cs{\cs} \ti{to accent list}\\
-% \verb+\soulregister{\cs}{0}+& \pref{soulregister} &\ti{register command} \m{\cs}\\
-% \verb+\sloppyword{text}+& \pref{sloppyword} &\ti{typeset} \m{text} \ti{with stretchable spaces}\\
-% \\
-% \verb+\sodef\cs{1em}{2em}{3em}+& \pref{sodef} &\ti{define new spacing command} \m{\cs}\\
-% \verb+\resetso+& \pref{resetso} &\ti{reset} \m{\so} \ti{dimensions}\\
-% \verb+\capsdef{////}{1em}{2em}{3em}+\Ast& \pref{capsdef} &\ti{define (default)} \m{\caps} \ti{data entry}\\
-% \verb+\capssave{name}+\Ast& \pref{capssave} &\ti{save} \m{\caps} \ti{database under name} \rlap{\texttt{name}}\\
-% \verb+\capsselect{name}+\Ast& \pref{capssave} &\ti{restore} \m{\caps} \ti{database of name} \rlap{\texttt{name}}\\
-% \verb+\capsreset+\Ast& \pref{capsreset} &\ti{clear caps database}\\
-% \verb+\setul{1ex}{2ex}+& \pref{setul} &\ti{set} \m{\ul} \ti{dimensions}\\
-% \verb+\resetul+& \pref{resetul} &\ti{reset} \m{\ul} \ti{dimensions}\\
-% \verb+\setuldepth{y}+& \pref{setuldepth} &\ti{set underline depth to depth of an} y\\
-% \verb+\setuloverlap{1pt}+& \pref{setuloverlap} &\ti{set underline overlap width}\\
-% \verb+\setulcolor{red}+& \pref{setulcolor} &\ti{set underline color}\\
-% \verb+\setstcolor{green}+& \pref{setstcolor} &\ti{set overstriking color}\\
-% \verb+\sethlcolor{blue}+& \pref{sethlcolor} &\ti{set highlighting color}\\
-% \end{tabular}
-% \caption{List of all available commands. The number points to the
-% page where the command is described. Those marked
-% with a little asterisk are only available when the package
-% is used together with \LaTeX, because they rely on the
-% \emph{New Font Selection Scheme (NFSS)} used in \LaTeX.}
-% \label{tab:survey}
-% \end{center}
-% \end{table}
-%
-%
-%
-%
-%
-%
-%
-% \subsection{Troubleshooting}
-%
-% Unfortunately, there's just one helpful error message provided by
-% the \soul\ package, that actually describes the underlying problem. All other
-% messages are generated directly by \TeX\ and show the low-level
-% commands that \TeX\ wasn't happy with. They'll hardly point you
-% to the violated rule as described in the paragraphs above.
-% If you get such a mysterious error message for a line that contains
-% a \soul\ statement, then comment that statement out and see if the message
-% still appears.
-% \texttt{`Incomplete }\cs{\ifcat}\texttt{'} is such a non-obvious message.
-% If the message doesn't appear now, then check the argument for
-% violations of the rules as listed in~\S\S\,20--26.
-%
-%
-%
-% \subsubsection{\texttt{`Reconstruction failed'}}
-%
-% This message appears, if \ref{par:Grouping hyphenatable material} or
-% \ref{par:Leaking font switches} was
-% violated. It is caused by the fact that the reconstruction pass
-% couldn't collect tokens with an overall width of the syllable that
-% was measured by the analyzer. This does either occur when you
-% grouped hyphenatable text or used an unregistered command
-% that influences the syllable width. Font switching commands belong
-% to the latter group. See the above cited sections for how to fix
-% these problems.
-%
-%
-%
-% \subsubsection{Missing characters}
-%
-% If you have redefined the internal font as described in section \ref{sec:internalfont},
-% you may notice that some characters are omitted without any error message
-% being shown. This happens if you have chosen, let's say, a font with
-% only 128~characters like the |cmtt10| font, but are using characters
-% that aren't represented in this font, e.\,g.~characters with codes
-% greater than~127.
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{\texorpdfstring{\so{Letterspacing}}{Letterspacing}}
-%
-% \subsection{How it works}
-% \label{sec:so}
-%
-% The base macro for letterspacing is called \describemacro{\so}.
-% It typesets the given argument with \syn{inter-letter space}
-% between every two characters, \syn{inner space} between words
-% and \syn{outer space} before and after the spaced out text.
-% If we let ``$\cdot$'' stand for \syn{inter-letter space}, ``$\ast$''
-% for \syn{inner spaces} and ``$\bullet$'' for \syn{outer
-% spaces,} then the input on the left side of the following table
-% will yield the schematic output on the right side:
-%
-% \begin{center}
-% \def\.{$\cdot$}
-% \def\-{\kern1pt$\ast$\kern1pt}
-% \def\*{$\bullet$}
-% \def\_{\texttt{\char"20}}
-% \begin{tabular}{ccc}
-% 1.& \verb*|XX\so{aaa bbb ccc}YY|& \textsf{XXa\.a\.a\-b\.b\.b\-c\.c\.cYY}\\
-% 2.& \verb*|XX \so{aaa bbb ccc} YY|& \textsf{XX\*a\.a\.a\-b\.b\.b\-c\.c\.c\*\kern-1ptYY}\\
-% 3.& \verb*|XX {\so{aaa bbb ccc}} YY|& \textsf{XX\*a\.a\.a\-b\.b\.b\-c\.c\.c\*\kern-1ptYY}\\
-% 4.& \verb*|XX \null{\so{aaa bbb ccc}}{} YY|& \textsf{XX\_a\.a\.a\-b\.b\.b\-c\.c\.c\_YY}\\
-% \end{tabular}
-% \end{center}
-% ^^A* % fool vim (fixes syntax highlighting)
-%
-% \noindent
-% Case~1 shows how letterspacing macros (\cs{\so} and \cs{\caps}) behave if
-% they aren't following or followed by a space: they omit outer space around
-% the \soul\ statement. Case~2 is what you'll mostly need---letterspaced
-% text amidst running text. Following and leading space get replaced by
-% \syn{outer space}. It doesn't matter if there are opening braces before
-% or closing braces afterwards. \soul\ can see through both of them (case~3).
-% Note that leading space has to be at least |5sp| wide to be recognized as
-% space, because \LaTeX\ uses tiny spaces generated by |\hskip1sp| as marker.
-% Case~4 shows how to enforce normal spaces instead of \syn{outer spaces:}
-% Preceding space can be hidden by |\kern0pt| or \cs{\null} or any character.
-% Following space can also be hidden by any token, but note that a typical macro name
-% like \cs{\relax} or \cs{\null} would also hide the space thereafter.
-%
-%
-% The values are predefined for typesetting facsimiles mainly with
-% \emph{Fraktur} fonts.
-% You can define your own spacing
-% macros or overwrite the original \cs{\so} meaning using the macro
-% \describemacro{\sodef}:
-%
-% \begin{syntax}
-% |\sodef|\<cmd>|{|\<font>|}{|\<inter-letter space>|}{|\<inner space>|}{|\<outer space>|}|
-% \end{syntax}
-%
-% The space dimensions, all of which are mandatory, should be defined in terms of |em|
-% letting them grow and shrink with the respective fonts.
-%
-% \begin{example}
-% |\sodef\an{}{.4em}{1em plus1em}{2em plus.1em minus.1em}|
-% \end{example}
-%
-% After that you can type `|\an{example}|' to get
-% {\sodef\an{}{.4em}{1em plus1em}{2em plus.1em minus.1em}^^A
-% `\an{example}'.}
-% The \describemacro{\resetso} command resets \cs{\so}
-% to the default values.
-%
-%
-%
-%
-% \subsection{Some examples}
-%
-%^^A=====================================================
-% \begin{examples}
-%
-% \soultest{Ordinary text}
-% |\so{electrical industry}|
-% {\so{electrical industry}}
-%
-% \soultest{Use \texttt{\string\-} to mark hyphenation points}
-% |\so{man\-u\-script}|
-% {\so{man\-u\-script}}
-%
-% \soultest{Accents are recognized}
-% |\so{le th\'e\^atre}|
-% {\so{le th\'e\^atre}}
-%
-% \soultest{\texttt{\string\mbox} and \texttt{\string\hbox} protect material that
-% contains hyphenation points. The contents are treated as one, unbreakable entity}
-% |\so{just an \mbox{example}}|
-% {\so{just an \mbox{example}}}
-%
-% \soultest{Punctuation marks are spaced out, if they are
-% put into the group}
-% |\so{inside.} \& \so{outside}.|
-% {\so{inside.} \& \so{outside}.}
-%
-% \soultest{Space-out skips may be removed by typing \texttt{\string\<}.
-% It's, however, desirable to put the quotation marks out of
-% the argument}
-% |\so{``\<Pennsylvania\<''}|
-% {\so{``\<Pennsylvania\<''}}
-%
-% \soultest{Numbers should never be spaced out}
-% |\so{1\<3 December {1995}}|
-% {\so{1\<3 December {1995}}}
-%
-% \soultest{Explicit hyphens like |-|, |--| and |---| are recognized.
-% \texttt{\string\slash} outputs a slash and enables \TeX\ to break the line
-% afterwards}
-% |\so{input\slash output}|
-% {\so{input\slash output}}
-%
-% \soultest{To keep \TeX\ from breaking lines between the hyphen and `jet'
-% you have to protect the hyphen. This is no \soul\ restriction
-% but normal \TeX\ behavior}
-% |\so{\dots and \mbox{-}jet}|
-% {\so{\dots and \mbox{-}jet}}
-%
-% \soultest{The \texttt{\~} command inhibits line breaks}
-% |\so{unbreakable~space}|
-% {\so{unbreakable~space}}
-%
-% \soultest{\texttt{\string\\} works as usual. Additional arguments
-% like \texttt{*} or vertical space are not accepted, though}
-% |\so{broken\\line}|
-% {\so{broken\\line}}
-%
-% \soultest{\texttt{\string\break} breaks the line without filling it with white space}
-% |\so{pretty awful\break test}|
-% {\so{pretty awful\break test}}
-%
-% \end{examples}
-%^^A=====================================================
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \subsection[Typesetting \texorpdfstring{\caps{caps-and-small-caps}}{caps-and-small-caps} fonts]
-% {Typesetting capitals-and-small-capitals fonts}
-%
-% There is a special letterspacing command called \describemacro{\caps},
-% which differs from \cs{\so} in that it switches to caps-and-small-caps
-% font shape, defines only slight spacing and is able to select spacing
-% value sets from a database. This is a requirement for high-quality
-% typesetting \cite{Tschichold}. The following lines show the effect
-% of \cs{\caps} in comparison with the normal textfont and with
-% small-capitals shape:
-%
-% \def\sampletext{DONAUDAMPFSCHIFFAHRTSGESELLSCHAFT}
-% \medskip\noindent
-% \begin{tabular}{rl}
-% |\normalfont|&\sampletext\\
-% |\scshape|&{\scshape\sampletext}\\
-% |\caps|&\caps\sampletext\\
-% ^^A|\person|&\person\sampletext\\
-% \end{tabular}
-%
-% \medbreak\noindent
-% The \cs{\caps} font database is by default empty, i.\,e., it contains
-% just a single default entry, which yields the result as shown in the
-% example above.
-% New font entries may be added \emph{on top} of this list using the \describemacro{\capsdef}
-% command, which takes five arguments: The first argument describes the font with
-% \emph{encoding, family, series, shape,} and \emph{size,}^^A
-% \footnote{as defined by the \caps{NFSS}, the ``New Font Selection Scheme''}
-% each optionally
-% (e.\,g.~|OT1/cmr/m/n/10| for this very font, or only |/ppl///12| for all
-% \emph{palatino} fonts at size 12\,pt). The \emph{size} entry may also contain
-% a size range (\texttt{5-10}), where zero is assumed for an omitted lower
-% boundary (\texttt{-10}) and a very, very big number for an omitted upper
-% boundary (\texttt{5-}). The
-% upper boundary is not included in the range, so, in the example below, all
-% fonts with sizes greater or equal 5\,pt and smaller than 15\,pt are accepted
-% ($5\,\mbox{pt}\le size<15\,\mbox{pt}$).
-% The second argument may contain font switching commands such as \cs{\scshape},
-% it may as well be empty or contain debugging commands (e.\,g.~|\message{*}|).
-% The remaining three, mandatory arguments are the spaces as described in
-% section~\ref{sec:so}.
-%
-% \begin{example}
-% |\capsdef{T1/ppl/m/n/5-15}{\scshape}{.16em}{.4em}{.2em}|
-% \end{example}
-%
-% The \cs{\caps} command goes through the data list from top to bottom
-% and picks up the first matching set, so the order of definition is essential.
-% The last added entry is examined first, while the pre-defined default entry
-% will be examined last and will match any font, if no entry was taken before.
-%
-% To override the default values, just define a new default entry using
-% the identifier |{////}|. This entry should be defined first, because no
-% entry after it can be reached.
-%
-% The \cs{\caps} database can be cleared with the \describemacro{\capsreset}
-% command and will only contain the default entry thereafter. The
-% \describemacro{\capssave} command saves the whole current database
-% under the given name. \describemacro{\capsselect} restores such a database.
-% This allows to predefine different groups of \cs{\caps} data sets:
-%
-% \begin{example}
-% |\capsreset|\\
-% |\capsdef{/cmss///12}{}{12pt}{23pt}{34pt}|\\
-% |\capsdef{/cmss///}{}{1em}{2em}{3em}|\\
-% |...|\\
-% |\capssave{wide}|\\
-% \end{example}
-% \indent
-% \begin{example}
-% |%---------------------------------------|\\
-% |\capsreset|\\
-% |\capsdef{/cmss///}{}{.1em}{.2em}{.3em}|\\
-% |...|\\
-% |\capssave{narrow}|\\
-% \end{example}
-% \indent
-% \begin{example}
-% |%---------------------------------------|\\
-% |{\capsselect{wide}|\\
-% |\title{\caps{Yet Another Silly Example}}|\\
-% |}|\\
-% \end{example}
-%
-% See the `|example.cfg|' file for a detailed example.
-% If you have defined a bunch of sets for different fonts and sizes,
-% you may lose control over what fonts are used by the package. With the
-% package option \DescribeOption{capsdefault}\option{capsdefault} selected,
-% \cs{\caps} prints its argument underlined, if no set was specified for a
-% particular font and the default set had to be used.
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \subsection{Typesetting Fraktur}
-% \label{sec:fraktur}
-%
-% Black letter fonts^^A
-%^^A%%
-% \footnote{See the great black letter fonts, which \person{Yannis Haralambous}
-% kindly provided, and the \package{oldgerm} and \package{yfonts} package~\cite{yfonts}
-% as their \LaTeX\ interfaces.}
-%^^A%%
-% deserve some additional considerations. As stated in section~\ref{sec:typesetting},
-% the ligatures |ch|, |ck|, |sz|~(\cs{\ss}), and~|tz| have to remain unbroken in spaced out
-% \emph{Fraktur} text. This may look strange at first glance, but you'll get used to it:
-%
-% \begin{example}
-% |\textfrak{\so{S{ch}u{tz}vorri{ch}tung}}|
-% \end{example}
-%
-% You already know that grouping keeps the |soul| mechanism from separating such ligatures.
-% This is quite important for |s:|, |a*|, and~|"a|. As hyphenation is stronger than
-% grouping, especially the |sz| may cause an error, if hyphenation happens to occur between
-% the letters |s| and~|z|. (\TeX\ hyphenates the German word |auszer| wrongly like
-% |aus-zer| instead of like |au-szer|, because the German hyphenation patterns
-% do, for good reason, not see |sz| as `\cs{\ss}'.) In such cases you can protect tokens with the
-% sequence e.\,g.~|\mbox{sz}| or a properly defined command. The \cs{\ss} command,
-% which is defined by the \package{yfonts} package, and similar commands will suffice as well.
-%
-%
-%
-%
-%
-%
-%
-% \subsection{Dirty tricks}
-% \label{sec:dirtytricks}
-%
-% Narrow columns are hard to set, because they don't allow much spacing
-% flexibility, hence long words often cause overfull boxes. A macro
-% could use \cs{\so} to insert stretchability between the single
-% characters. Table~\ref{tab:dirtytricks} shows some text typeset with such
-% a macro at the left side and under \emph{plain} conditions at
-% the right side, both with a width of~6\,pc.
-%
-% \def\sampletext{Some magazines and newspapers prefer this kind of spacing
-% because it reduces hyphenation problems to a minimum\<. Unfortunately\<, such
-% paragraphs aren't especially beautiful\<.}
-% \newbox\dirtytrick
-% \setbox\dirtytrick\vbox{
-% \batchmode ^^A we don't want to see all these overfull boxes ...
-% \leavevmode\hspace{0ptplus1fil}
-% \hbox{\parindent0pt\plainsetup\let\<\relax
-% \vtop{\hsize6pc\raggedright\sampletext}\hskip1em
-% \vtop{\hsize6pc\magstylepar\sampletext}\hskip1em
-% \vtop{\hsize6pc\sampletext}\hss}
-% \errorstopmode}
-%
-% \begin{table}
-% \begin{center}
-% \overfullrule5pt
-% \usebox\dirtytrick
-% \caption{Ragged-right, magazine style (using \soul), and block-aligned
-% in comparison. But, frankly, none of them is really acceptable.
-% (Don't do this at home, children!)}
-% \label{tab:dirtytricks}
-% \end{center}
-% \end{table}
-%
-%
-%
-%
-%
-%
-%
-% \section{\texorpdfstring{\ul{Underlining}}{Underlining}}
-%
-% The underlining macros are my answer to Prof.~\person{Knuth'{\normalfont s}}
-% exercise 18.26 from his \TeX{}book~\cite{DEK}. \texttt{:-)} Most of what
-% is said about the macro \describemacro{\ul} is also true of the
-% striking out macro \describemacro{\st} and the highlighting macro \describemacro{\hl},
-% both of which are in fact derived from the former.
-%
-%
-%
-%
-% \subsection{Settings}
-%
-% \subsubsection{Underline depth and thickness}
-%
-% The predefined \syn{underline depth} and \syn{thickness}
-% work well with most fonts. They can be changed using the macro \describemacro{\setul}.
-%
-% \begin{syntax}
-% |\setul{|\<underline depth>|}{|\<underline thickness>|}|
-% \end{syntax}
-%
-% Either dimension can be omitted, in which case there has to be
-% an empty pair of braces.
-% Both values should be defined in terms of |ex|, letting them
-% grow and shrink with the respective fonts.
-% The \describemacro{\resetul} command restores the standard values.
-%
-% Another way to set the \syn{underline depth} is to use the macro
-% \describemacro{\setuldepth}. It sets the depth such that the
-% underline's upper edge lies 1\,pt beneath the given argument's
-% deepest depth. If the argument is empty, all
-% letters---i.\,e.\ all characters whose \cs{\catcode} currently
-% equals 11---are taken. Examples:
-%
-% \begin{example}
-% |\setuldepth{ygp}|\\
-% |\setuldepth\strut|\\
-% |\setuldepth{}|\\
-% \end{example}
-%
-%
-%
-% \subsubsection{Line color}
-%
-% The underlines are by default black. The color can be changed by
-% using the \describemacro{\setulcolor} command. It takes one argument that can be any
-% of the color specifiers as described in the |color| package. This package
-% has to be loaded explicitly.
-%
-% \indent
-% \begin{example}
-% |\documentclass{article}|\\
-% |\usepackage{color,soul}|\\
-% |\definecolor{darkblue}{rgb}{0,0,0.5}|\\
-% |\setulcolor{darkblue}|\\
-% \end{example}
-%
-% \indent
-% \begin{example}
-% |\begin{document}|\\
-% |...|\\
-% |\ul{Cave: remove all the underlines!}|\\
-% |...|\\
-% |\end{document}|\\
-% \end{example}
-%
-%
-% The colors for overstriking lines and highlighting are likewise set
-% with \describemacro{\setstcolor} (default: black) and \describemacro{\sethlcolor}
-% (default: yellow). If the \package{color} package wasn't loaded,
-% underlining and overstriking color are black, while highlighting
-% is replaced by underlining.
-%
-%
-%
-%
-%
-%
-%
-% \subsubsection{The \program{dvips} problem}
-% \label{sec:dvips}
-%
-% \ul{Underlining}, \st{striking out} and highlighting build up
-% their lines with many short line segments. If you used the `\program{dvips}'
-% program with default settings, you would get little gaps on some places, because
-% the \emph{maxdrift} parameter allows the single objects to drift
-% this many pixels from their real positions.
-% \bigbreak
-%
-% \noindent
-% There are two ways to avoid the problem, where the \soul\ package
-% chooses the second by default:
-% \begin{enumerate}
-% \item
-% Set the \emph{maxdrift} value to zero, e.\,g.: |dvips -e 0 file.dvi|.
-% This is probably not a good idea, since the letters may then no longer be
-% spaced equally on low resolution printers.
-% \item
-% Let the lines stick out by a certain amount on each side so that they
-% overlap. This overlap amount can be set using the \describemacro{\setuloverlap}
-% command. It is set to 0.25\,pt by default. |\setuloverlap{0pt}| turns overlapping off.
-% \end{enumerate}
-%
-%
-%
-%
-%
-%
-% \subsection{Some examples}
-%
-%^^A=====================================================
-% \begin{examples}
-%
-% \soultest{Ordinary text}
-% |\ul{electrical industry}|
-% {\ul{electrical industry}}
-%
-% \soultest{Use \texttt{\string\-} to mark hyphenation points}
-% |\ul{man\-u\-script}|
-% {\ul{man\-u\-script}}
-%
-% \soultest{Accents are recognized}
-% |\ul{le th\'e\^atre}|
-% {\ul{le th\'e\^atre}}
-%
-% \soultest{\texttt{\string\mbox} and \texttt{\string\hbox} protect material that
-% contains hyphenation points. The contents are treated as one, unbreakable entity}
-% |\ul{just an \mbox{example}}|
-% {\ul{just an \mbox{example}}}
-%
-% \soultest{Explicit hyphens like |-|, |--| and |---| are recognized.
-% \texttt{\string\slash} outputs a slash and enables \TeX\ to break the line
-% afterwards}
-% |\ul{input\slash output}|
-% {\ul{input\slash output}}
-%
-% \soultest{To keep \TeX\ from breaking lines between the hyphen and `jet'
-% you have to protect the hyphen. This is no \soul\ restriction
-% but normal \TeX\ behavior}
-% |\ul{\dots and \mbox{-}jet}|
-% {\ul{\dots and \mbox{-}jet}}
-%
-% \soultest{The \texttt{\~} command inhibits line breaks}
-% |\ul{unbreakable~space}|
-% {\ul{unbreakable~space}}
-%
-% \soultest{\texttt{\string\\} works as usual. Additional arguments
-% like \texttt{*} or vertical space are not accepted, though}
-% |\ul{broken\\line}|
-% {\ul{broken\\line}}
-%
-% \soultest{\texttt{\string\break} breaks the line without filling it with white space}
-% |\ul{pretty awful\break test}|
-% {\ul{pretty awful\break test}}
-%
-% \soultest{Italic correction needs to be set manually}
-% |\ul{foo \emph{bar\/} baz}|
-% {\ul{foo \emph{bar\/} baz}}
-%
-% \end{examples}
-%^^A=====================================================
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{Customization}
-%
-% \subsection{Adding accents}
-% \label{sec:soulaccent}
-%
-% The \soul\ scanner generally sees every input token separately.
-% It has to be taught that some tokens belong together. For accents this is done
-% by registering them via the \describemacro{\soulaccent} macro.
-%
-% \begin{syntax}
-% |\soulaccent{|\<accent command>|}|
-% \end{syntax}
-%
-% The standard accents, however, are already pre-registered:
-% |\`|, |\'|, |\^|, |\"|, |\~|, |\=|, |\.|, |\u|, |\v|, |\H|, |\t|,
-% |\c|, |\d|, |\b|, and |\r|. If used together with the \package{german}
-% package, \soul\ automatically adds the |"| command.
-% Let's assume you have defined |\%| to put some weird accent on
-% the next character. Simply put the following line into your |soul.cfg|
-% file (see section~\ref{sec:config}):
-%
-% \begin{example}
-% |\soulaccent{\%}|
-% \end{example}
-%
-% Note that active characters like the |"| command have already
-% to be \cs{\active} when they are stored or they won't be recognized
-% later. This can be done temporarily, as in |{\catcode\`"\active\soulaccent{"}}|.
-%
-%
-%
-%
-% \subsection{Adding font commands}
-% \label{sec:soulregister}
-%
-% To convince \soul\ not to feed font switching (or other)
-% commands to the analyzer, but rather to execute them immediately,
-% they have to be registered, too. The \describemacro{\soulregister} macro
-% takes the name of a command name and either |0| or |1| for the number
-% of arguments:
-%
-% \begin{syntax}
-% |\soulregister{|\<command name>|}{|\<number of arguments>|}|
-% \end{syntax}
-%
-% If \cs{\bf} and \cs{\emph} weren't already registered, you would
-% write the following into your |soul.cfg| configuration file:
-%
-% \begin{example}
-% |\soulregister{\bf}{0} % {\bf foo}| \\
-% |\soulregister{\emph}{1} % \emph{bar}|\\
-% \end{example}
-%
-%
-% All standard \TeX\ and \LaTeX\ font commands, as well as the
-% \package{yfonts} commands are already pre-registered:
-%
-% \begin{example}
-% |\em, \rm, \bf, \it, \tt, \sc, \sl, \sf, \emph, \textrm,|\\
-% |\textsf, \texttt, \textmd, \textbf, \textup, \textsl,|\\
-% |\textit, \textsc, \textnormal, \rmfamily, \sffamily,|\\
-% |\ttfamily, \mdseries, \upshape, \slshape, \itshape,|\\
-% |\scshape, \normalfont, \tiny, \scriptsize, \footnotesize,|\\
-% |\small, \normalsize, \large, \Large, \LARGE, \huge, \Huge,|\\
-% |\MakeUppercase, \textsuperscript, \footnote,|\\
-% |\textfrak, \textswab, \textgoth, \frakfamily,|\\
-% |\swabfamily, \gothfamily|\\
-% \end{example}
-%
-% You can also register other commands as fonts, so the
-% analyzer won't see them. This may be necessary for some
-% macros that \soul\ refuses to typeset correctly.
-% But note, that \cs{\so} and \cs{\caps} won't put their
-% letter-skips around then.
-%
-%
-%
-%
-%
-%
-% \subsection{Changing the internal font}
-% \label{sec:internalfont}
-%
-% The \soul\ package uses the |ectt1000| font while it analyzes
-% the syllables. This font is used, because it
-% has 256~mono-spaced characters without any kerning.
-% It belongs to \person{J\"org Knappen'\textrm{s}}
-% \caps{EC}-fonts, which should be part of every modern \TeX\ installation.
-% If \TeX\ reports ``\texttt{I can't find file `ectt1000'}'' you don't
-% seem to have this font installed. It is recommended that
-% you install at least the file |ectt1000.tfm| which has less than 1.4\,kB\null.
-% Alternatively, you can let the \soul\ package use the |cmtt10| font that
-% is part of any installation, or some other mono-spaced font:
-%
-% \begin{example}
-% |\font\SOUL@tt=cmtt10|
-% \end{example}
-%
-% Note, however, that \soul\ does only handle characters,
-% for which the internal font has a character with the same
-% character code. As |cmtt10| contains only characters with codes
-% 0 to~127, you can't typeset characters with codes 128 to~255.
-% These 8-bit character codes are used by many fonts with non-ascii
-% glyphs. So the |cmtt10| font will, for example, not work for |T2A|
-% encoded cyrillic characters.
-%
-%
-%
-%
-%
-%
-%
-% \subsection{The configuration file}
-% \label{sec:config}
-%
-% If you want to change the predefined settings or add new features,
-% then create a file named `|soul.cfg|' and put it in a directory, where \TeX\
-% can find it. This configuration file will then be loaded
-% at the end of the |soul.sty| file, so you may redefine
-% any settings or commands therein, select package options and even
-% introduce new ones. But if you intend to give
-% your documents to others, don't forget to give them the
-% required configuration files, too! That's how such a file
-% could look like:
-%
-% \indent
-% \begin{example}
-% |% define macros for logical markup|\\
-% |\sodef\person{\scshape}{0.125em}{0.4583em}{0.5833em}|\\
-% \\
-% |\sodef\SOUL@@@versal{\upshape}{0.125em}{0.4583em}{0.5833em}|\\
-% |\DeclareRobustCommand*\versal[1]{%|\\
-% | \MakeUppercase{\SOUL@@@versal{#1}}%|\\
-% |}|\\
-% \end{example}
-%
-% \indent
-% \begin{example}
-% |% load the color package and set|\\
-% |% a different highlighting color|\\
-% |\RequirePackage{color}|\\
-% |\definecolor{lightblue}{rgb}{.90,.95,1}|\\
-% |\sethlcolor{lightblue}|\\
-% |\endinput|
-% \end{example}
-%
-% You can safely use the |\SOUL@@@| namespace for internal macros---it
-% won't be used by the \soul\ package in the future.
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{Miscellaneous}
-%
-% \subsection{Using \texorpdfstring{\soul\ }{soul }with other flavors of \texorpdfstring{\TeX}{TeX}}
-% \label{sec:plain}
-%
-% This documentation describes how to use \soul\ together
-% with \LaTeXe, for which it is optimized. It works, however, with
-% all other flavors of \TeX, too. There are just some minor restrictions
-% for Non-\LaTeX\ use:
-%
-% The \cs{\caps} command doesn't use a database, it is only a dumb
-% definition with fixed values. It switches to \cs{\capsfont}, which---unless
-% defined explicitly like in the following example---won't really change
-% the used font at all. The commands \cs{\capsreset} and \cs{\capssave}
-% do nothing.
-%
-% \begin{example}
-% |\font\capsfont=cmcsc10|\\
-% |\caps{Tschichold}|\\
-% \end{example}
-%
-% None of the commands are made `robust', so they have to be
-% explicitly protected in fragile environments like in \cs{\write}
-% statements.
-% To make use of colored underlines or highlighting you have to
-% use the \package{color} package wrapper from \caps{CTAN}^^A
-% \footnote{\texttt{CTAN:/macros/plain/graphics/\char`\{miniltx.tex,color.tex\char`\}}},
-% instead of the \package{color} package directly:
-%
-% \begin{example}
-% |\input color|\\
-% |\input soul.sty|\\
-% |\hl{highlighted}|\\
-% |\bye|\\
-% \end{example}
-%
-% The \option{capsdefault} package option is mapped to a simple command
-% \describemacro{\capsdefault}.
-%
-%
-%
-%
-%
-%
-%
-% \subsection{Using \texorpdfstring{\soul\ }{soul }commands for logical markup}
-% \label{sec:markup}
-%
-% It's generally a bad idea to use font style commands like \cs{\textsc}
-% in running text. There should always be some reasoning behind changing
-% the style, such as ``names of persons shall be typeset in a caps-and-small-caps
-% font''. So you declare in your text just that some words are the name of a
-% person, while you define in the preamble or, even better, in a separate
-% style file how to deal with persons:
-%
-% \begin{example}
-% |\newcommand*\person{\textsc}|\\
-% |...|\\
-% |``I think it's a beautiful day to go to the zoo and feed|\\
-% |the ducks. To the lions.'' --~\person{Brian Kantor}|\\
-% \end{example}
-%
-% It's quite simple to use \soul\ commands that way:
-%
-% \begin{example}
-% |\newcommand\comment*{\ul} % or \let\comment=\ul|\\
-% |\sodef\person{\scshape}{0.125em}{0.4583em}{0.5833em}|\\
-% \end{example}
-%
-% Letterspacing commands like \cs{\so} and \cs{\caps} have to
-% check whether they are followed by white space, in which case
-% they replace that space by \syn{outer space}. Note that \soul\
-% does look through closing braces. Hence you can conveniently bury
-% a \soul\ command within another macro like in the following
-% example. Use any other token to hide following space if necessary,
-% for example the \cs{\null} macro.
-%
-% \begin{example}
-% |\DeclareRobustCommand*\versal[1]{%|\\
-% | \MakeUppercase{\SOUL@@@versal{#1}}%|\\
-% |}|\\
-% |\sodef\SOUL@@@versal{\upshape}{0.125em}{0.4583em}{0.5833em}|\\
-% \end{example}
-%
-%
-% But what if the \soul\ command is for some reason not the last one
-% in that macro definition and thus cannot look ahead at the following token?
-%
-%
-% \begin{example}
-% |\newcommand*\somsg[1]{\so{#1}\message{#1}}|\\
-% |...|\\
-% |foo \somsg{bar} baz % wrong spacing after `bar'!|\\
-% \end{example}
-%
-% In this case you won't get the following space replaced by \emph{outer space}
-% because when \soul\ tries to look ahead, it only sees the token
-% \cs{\message} and consequently decides that there is no space to replace.
-% You can get around this by explicitly calling the space scanner again.
-%
-% \begin{example}
-% |\newcommand*\somsg[1]{{%|\\
-% | \so{#1}%|\\
-% | \message{bar}%|\\
-% | \let\\\SOUL@socheck|\\
-% | \\%|\\
-% |}}|\\
-% \end{example}
-%
-% However, \cs{\SOUL@socheck} can't be used directly, because it would discard
-% any normal space. \cs{\\} doesn't have this problem.
-% The additional pair of braces avoids that its definition leaks out
-% of this macro. In the example above you could, of course, simply
-% have put \cs{\message} in front, so you hadn't needed to
-% use the scanner macro \cs{\SOUL@socheck} at all.
-%
-% Many packages do already offer logical markup commands that default
-% to some standard \LaTeX\ font commands or to \cs{\relax}. One example
-% is the \package{jurabib} package~\cite{jurabib}, which makes the use of
-% \soul\ a challenge. This package implements lots of
-% formatting macros. Let's have a look at one of them, \cs{\jbauthorfont},
-% which is used to typeset author names in citations.
-% The attempt to simply
-% define |\let\jbauthorfont\caps| fails, because the macro isn't directly
-% applied to the author name as in |\jbauthorfont{Don Knuth}|, but
-% to another command sequence: |\jbauthorfont{\jb@@author}|. Not even
-% \cs{\jb@@author} contains the name, but instead further commands that
-% at last yield the requested name. That's why we have to expand
-% the contents first. This is quite tricky, because we must not
-% expand too much, either. Fortunately, we can offer the contents
-% wrapped up in yet another macro, so that \soul\ knows that it has to
-% use its own macro expansion mechanism:
-%
-% \begin{example}
-% |\renewcommand*\jbauthorfont[1]{{%|\\
-% | \def\x{#1}%|\\
-% | \caps\x|\\
-% |}}|\\
-% \end{example}
-%
-% Some additional kerning after |\caps\x| wouldn't hurt, because
-% the look-ahead scanner is blinded by further commands that follow
-% in the \package{jurabib} package. Now we run into the next problem:
-% cited names may contain commands
-% that must not get expanded. We have to register them as special
-% command:
-%
-% \begin{example}
-% |\soulregister\jbbtasep{0}|\\
-% |...|\\
-% \end{example}
-%
-% But such registered commands bypass \soul's kernel and we don't
-% get the correct spacing before and afterwards. So we end up
-% redefining \cs{\jbbtasep}, whereby you should, of course, use
-% variables instead of numbers:
-%
-% \begin{example}
-% |\renewcommand*\jbbtasep{%|\\
-% | \kern.06em|\\
-% | \slash|\\
-% | \hskip.06em|\\
-% | \allowbreak|\\
-% |}|\\
-% \end{example}
-%
-% Another problem arises: bibliography entries that must not get
-% teared apart are supposed to be enclosed in additional braces.
-% This, however, won't work with \soul\ because of
-% \ref{par:Grouping hyphenatable material}. A simple trick will
-% get you around that problem: define a dummy command that only
-% outputs its argument, and register that command:
-%
-% \begin{example}
-% |\newcommand*\together[1]{#1}|\\
-% |\soulregister\together{1}|\\
-% \end{example}
-%
-% Now you can write ``|Author = {\together{Don Knuth}}|'' and
-% \package{jurabib} won't dare to reorder the parts of the name.
-% And what if some name shouldn't get letterspaced at all? Overriding
-% a conventional font style like \cs{\textbf} that was globally
-% set is trivial, you just have to specify the style that you
-% prefer in that very bibliography entry. In our example, if we
-% wanted to keep \soul\ from letterspacing a particular entry,
-% although they are all formatted by our \cs{\jbauthorfont}
-% and hence fed to \cs{\caps}, we'd use the following construction:
-%
-% \begin{example}
-% |Author = {\soulomit{\normalfont\huge Donald E. Knuth}}|\\
-% \end{example}
-%
-% The \package{jurabib} package is probably one of the more
-% demanding packages to collaborate with \soul. Everything else
-% can just become easier.
-%
-%
-%
-%
-%
-%
-%
-%
-% \subsection{Typesetting long words in narrow columns}
-% \label{sec:sloppyword}
-%
-% Narrow columns are best set |flushleft|, because not even the best
-% hyphenation algorithm can guarantee acceptable line breaks without
-% overly stretched spaces.
-% However, in some rare cases one may be \emph{forced} to typeset
-% block aligned. When typesetting in languages like German, where
-% there are really long words, the \describemacro{\sloppyword} macro
-% might help a little bit. It adds enough stretchability between the
-% single characters to make the hyphenation algorithm happy, but
-% is still not as ugly as the example in section~\ref{sec:dirtytricks}
-% demonstrates. In the following example the left column was typeset
-% as ``|Die \sloppyword{Donau...novelle} wird ...|'':
-%
-% \begin{center}
-% \def\word{Do\-nau\-dampf\-schiff\-fahrts\-ge\-sell\-schafts\-^^A
-% ka\-pi\-t\"ans\-wit\-wen\-pen\-si\-ons\-ge\-setz\-no\-vel\-le}
-% \begin{minipage}{1.5in}
-% \plainsetup
-% Die
-% \expandafter\sloppyword\expandafter{\word}
-% wird mit sofortiger Wirkung au\ss er Kraft gesetzt.
-% \end{minipage}
-% \hspace{1em}
-% \batchmode
-% \begin{minipage}{1.5in}
-% \plainsetup
-% Die \word\ wird mit sofortiger Wirkung au\ss er Kraft gesetzt.
-% \end{minipage}
-% \errorstopmode
-% \end{center}
-%
-%
-%
-%
-%
-%
-%
-% \subsection{Using \texorpdfstring{\soul\ }{soul }commands in section headings}
-%
-% Letterspacing was often used for section titles in the past,
-% mostly centered and with a closing period. The following example
-% shows how to achieve this using the \package{titlesec}
-% package \cite{titlesec}:
-%
-% \begin{example}
-% |\newcommand*\periodafter[2]{#1{#2}.}|\\
-% |\titleformat{\section}[block]|\\
-% | {\normalfont\centering}|\\
-% | {\thesection.}|\\
-% | {.66em}|\\
-% | {\periodafter\so}|\\
-% |...|\\
-% |\section{Von den Maassen und Maassst\"aben}|\\
-% \end{example}
-%
-% \bigbreak
-% This yields the following output:
-%
-% \bigskip
-% \newbox\examplebox
-% \sbox\examplebox{
-% \begin{minipage}{.9\textwidth}
-% \small
-% \bigskip
-% \begin{center}
-% \so{1\<. Von den Maassen und Maassst\"aben}.
-% \bigskip
-% \end{center}
-% \end{minipage}}
-% \fbox{\usebox\examplebox}
-% \bigbreak
-%
-% \noindent
-% The \cs{\periodafter} macro adds a period to the title, but not to
-% the entry in the table of contents. It takes the name of a command as
-% argument, that shall be applied to the title, for example~\cs{\so}.
-% Here's a more complicated and complete example:
-%
-% \begin{example}
-% |\documentclass{article}|\\
-% |\usepackage[latin1]{inputenc}|\\
-% |\usepackage[T1]{fontenc}|\\
-% |\usepackage{german,soul}|\\
-% |\usepackage[indentfirst]{titlesec}|\\
-% \end{example}
-%
-% \indent
-% \begin{example}
-% |\newcommand*\sectitle[1]{%|\\
-% | \MakeUppercase{\so{#1}.}\\[.66ex]|\\
-% | \rule{13mm}{.4pt}}|\\
-% |\newcommand*\periodafter[2]{#1{#2.}}|\\
-% \end{example}
-%
-% \indent
-% \begin{example}
-% |\titleformat{\section}[display]|\\
-% | {\normalfont\centering}|\\
-% | {\S. \thesection.}|\\
-% | {2ex}|\\
-% | {\sectitle}|\\
-% \end{example}
-%
-% \indent
-% \begin{example}
-% |\titleformat{\subsection}[block]|\\
-% | {\normalfont\centering\bfseries}|\\
-% | {\thesection.}|\\
-% | {.66em}|\\
-% | {\periodafter\relax}|\\
-% \end{example}
-%
-% \indent
-% \begin{example}
-% |\begin{document}|\\
-% |\section{Von den Maassen und Maassst\"aben}|\\
-% |\subsection{Das L\"angenmaass im Allgemeinen}|\\
-% \\
-% |Um L\"angen genau messen und vergleichen zu k\"onnen,|\\
-% |bedarf es einer gewissen, bestimmten Einheit, mit der|\\
-% |man untersucht, wie oft sie selbst, oder ihre Theile,|\\
-% |in der zu bestimmenden L\"ange enthalten sind.|\\
-% |...|\\
-% |\end{document}|
-% \end{example}
-%
-% \bigbreak
-% This example gives you roughly the following output,
-% which is a facsimile from~\cite{Muszynski}.
-%
-% \bigskip
-% \sbox\examplebox{
-% \begin{minipage}{.9\textwidth}
-% \small
-% \bigskip
-% \begin{center}
-% \S. 1.\\[2ex]
-% \so{VON DEN MAASSEN UND MAASSST\"ABEN}.\\[.66ex]
-% \rule{12mm}{.4pt}\\[1.66ex]
-% \textbf{1. Das L\"angenmaass im Allgemeinen.}\\[.66em]
-% \end{center}
-% \leavevmode\qquad
-% Um L\"angen genau messen und vergleichen zu k\"onnen,
-% bedarf es einer gewissen, bestimmten Einheit, mit der
-% man untersucht, wie oft sie selbst, oder ihre Theile,
-% in der zu bestimmenden L\"ange enthalten sind.
-% \bigskip
-% \end{minipage}}
-% \fbox{\usebox\examplebox}
-% \bigbreak
-%
-% \noindent
-% Note that the definition of \cs{\periodafter} decides if
-% the closing period shall be spaced out with the title (1), or
-% follow without space (2):
-%
-% \begin{example}
-% 1.\qquad|\newcommand*\periodafter[2]{#1{#2.}}|\\
-% 2.\qquad|\newcommand*\periodafter[2]{#1{#2}.}|\\
-% \end{example}
-%
-%
-%
-% \noindent
-% If you need to underline section titles, you can easily
-% do it with the help of the \package{titlesec} package. The following
-% example underlines the section title, but not the section
-% number:
-%
-% \begin{example}
-% |\titleformat{\section}|\\
-% | {\LARGE\titlefont}|\\
-% | {\thesection}|\\
-% | {.66em}|\\
-% | {\ul}|\\
-% \end{example}
-%
-% \noindent
-% The \cs{\titlefont} command is provided by the \caps{``\small{KOMA}}~script''
-% package. You can write |\normalfont\sffamily\bfseries| instead.
-% The following example does additionally underline the section number:
-%
-% \begin{example}
-% |\titleformat{\section}|\\
-% | {\LARGE\titlefont}|\\
-% | {\ul{\thesection{\kern.66em}}}|\\
-% | {0pt}|\\
-% | {\ul}|\\
-% \end{example}
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{How the package works}
-%
-% \subsection{The kernel}
-% \so{Letterspacing,} \ul{underlining}, \st{striking out} and highlighting
-% use the same kernel. It lets a \emph{word scanner} run over the given argument,
-% which inspects every token. If a token is a command registered via \cs{\soulregister},
-% it is executed immediately. Other tokens are only counted and trigger some action
-% when a certain number is reached (quotes and dashes). Three subsequent `|-|', for example,
-% trigger |\SOUL@everyexhyphen{---}|. A third group leads to special actions,
-% like |\mbox| that starts reading-in a whole group to protect its contents and let them be
-% seen as one entity. All other tokens, mostly characters and digits, are collected in
-% a word register, which is passed to the analyzer, whenever a whole word was read in.
-%
-% The analyzer typesets the word in a 1\,sp ($=\frac1{65536}$\,pt) wide \cs{\vbox},
-% hence encouraging \TeX\ to break lines at every possible hyphenation point. It
-% uses the mono-spaced \cs{\SOUL@tt} font (|ectt1000|), so as to avoid any inter-character
-% kerning. Now the \cs{\vbox} is decomposed splitting off \cs{\hbox} after \cs{\hbox}
-% from the bottom. All boxes, each of which contains one syllable, are pushed onto a
-% stack, which is provided by \TeX's grouping mechanism. When returning from the
-% recursion, box after box is fetched from the stack, its width measured and fed to the
-%``reconstructor''.
-%
-% This reconstruction macro (\cs{\SOUL@dosyllable}) starts to read tokens
-% from the just analyzed word until the given syllable
-% width is obtained. This is repeated for each syllable. Every time the engine
-% reaches a relevant state, the corresponding driver macro is executed
-% and, if necessary, provided with some data. There is a macro that is
-% executed for each token, one for each syllable, one for each space etc\null.
-%
-% The engine itself doesn't know how to letterspace or to underline. It
-% just tells the selected driver about the structure of the given argument.
-% There's a default driver (\cs{\SOUL@setup}) that does only set the
-% interface macros to a reasonable default state, but doesn't really do anything.
-% Further drivers can safely inherit these settings and only need to
-% redefine what they want to change.
-%
-%
-%
-%
-%
-% \subsection{The interface}
-% \label{sec:interface}
-%
-% \subsubsection{The registers}
-%
-% The package offers eight interface macros that can be used to define
-% the required actions. Some of the macros receive data as macro parameter
-% or in special \emph{token} or \emph{dimen} registers. Here is a list of
-% all available registers:
-%
-% \begin{labeling}{\hspace{.36\hsize}}
-% \item[\texttt{\string\SOUL@token}]
-% This token register contains the current token. It has to be used as |\the\SOUL@token|.
-% The macro \cs{\SOUL@gettoken} reads the next token into \cs{\SOUL@token} and
-% can be used in any interface macro. If you don't want to lose the old meaning,
-% you have to save it explicitly. \cs{\SOUL@puttoken} pushes the token
-% back into the queue, without changing \cs{\SOUL@token}. You can only
-% put one token back, otherwise you get an error message.
-% \item[\texttt{\string\SOUL@lasttoken}]
-% This token register contains the last token.
-% \item[\texttt{\string\SOUL@syllable}]
-% This token register contains all tokens that were already collected for
-% the current syllable. When used in \cs{\SOUL@everysyllable}, it
-% contains the \emph{whole} syllable.
-% \item[\texttt{\string\SOUL@charkern}]
-% This dimen register contains the kerning value between the current and the next character.
-% Since most character pairs don't require a kerning value to be applied and the
-% output in the logfile shouldn't be cluttered with |\kern0pt| it is
-% recommended to write |\SOUL@setkern\SOUL@charkern|, which sets
-% kerning for non-zero values only.
-% \item[\texttt{\string\SOUL@hyphkern}]
-% This dimen register contains the kerning value between the current character
-% and the hyphen character or, when used in \cs{\SOUL@everyexhyphen}, the
-% kerning between the last character and the explicit hyphen.
-% \end{labeling}
-%
-%
-%
-%
-%
-%
-% \subsubsection{The interface macros}
-%
-% The following list describes each of the interface macros and which
-% registers it can rely on. The mark between label and description
-% will be used in section \ref{sec:interfaceexamples} to show when
-% the macros are executed. The addition |#1| means that the macro
-% takes one argument.
-%
-% \begin{labeling}{\hspace{.36\hsize}}
-% \def\m#1{\leavevmode\llap{\hbox to1em{\hss#1\hss}\hskip.7em}}
-% \item[\texttt{\string\SOUL@preamble}]\m{$P$}^^A
-% executed once at the beginning
-% \item[\texttt{\string\SOUL@postamble}]\m{$E$}^^A
-% executed once at the end
-% \item[\texttt{\string\SOUL@everytoken}]\m{$T$}^^A
-% executed after scanning a token; It gets that
-% token in \cs{\SOUL@token} and has to care for inserting
-% the kerning value \cs{\SOUL@charkern} between this and the next character.
-% To look at the next character, execute \cs{\SOUL@gettoken}, which
-% replaces \cs{\SOUL@token} by the next token. This token has to
-% be put back into the queue using \cs{\SOUL@puttoken}.
-% \item[\texttt{\string\SOUL@everysyllable}]\m{$S$}^^A
-% This macro is executed after scanning a whole syllable. It gets the
-% syllable in \cs{\SOUL@syllable}.
-% \item[\texttt{\string\SOUL@everyhyphen}]\m{$-$}^^A
-% This macro is executed at every implicit hyphenation point.
-% It is responsible for setting the hyphen and will likely do this
-% in a \cs{\discretionary} statement. It has to care about the
-% kerning values. The registers \cs{\SOUL@lasttoken}, \cs{\SOUL@syllable},
-% \cs{\SOUL@charkern} and \cs{\SOUL@hyphkern} contain useful information.
-% Note that \cs{\discretionary} inserts \cs{\exhyphenpenalty}
-% if the first part of the discretionary is empty, and
-% \cs{\hyphenpenalty} else.
-% \item[\texttt{\string\SOUL@everyexhyphen\#1}]\m{$=$}^^A
-% This macro is executed at every explicit hyphenation point. The
-% hyphen `character' (one of hyphen, en-dash, em-dash or \cs{\slash})
-% is passed as parameter |#1|. A minimal implementation
-% would be |{#1\penalty\exhyphenpenalty}|. The kerning value
-% between the last character and the hyphen is passed in \cs{\SOUL@hyphkern},
-% that between the hyphen and the next character in \cs{\SOUL@charkern}.
-% The last syllable can be found in \cs{\SOUL@syllable}, the last
-% character in \cs{\SOUL@lasttoken}.
-% \item[\texttt{\string\SOUL@everyspace\#1}]\m{\texttt{\char`\ }}^^A
-% This macro is executed between every two words. It is responsible for
-% setting the space. The engine submits a \cs{\penalty} setting as
-% parameter |#1| that should be put in front of the space. The
-% macro should at least do |{#1\space}|. Further information can be found in
-% \cs{\SOUL@lasttoken} and \cs{\SOUL@syllable}. Note that this macro does not
-% care for the leading and trailing space. This is the job of
-% \cs{\SOUL@preamble} and \cs{\SOUL@postamble}.
-% \end{labeling}
-%
-%
-%
-%
-%
-%
-% \subsubsection{Some examples}
-% \label{sec:interfaceexamples}
-%
-% The above list's middle column shows a mark that indicates in the
-% following examples, when the respective macros are executed:\nopagebreak
-%
-% \begin{labeling}{\hspace{.36\hsize}}
-% \item[\normalfont\an{word}]
-% \cs{\SOUL@everytoken}$^T$ is executed for every token. \cs{\SOUL@everysyllable}$^S$
-% is \emph{additionally} executed for every syllable. You will mostly just
-% want to use either of them.
-% \item[\normalfont\an{one two}]
-% The macro |\SOUL@everyspace| is executed at every space within
-% the \soul\ argument. It has to take one argument, that can either
-% be empty or contain a penalty, that should be applied to the space.
-% \item[\normalfont\an{example}\kern-1em]
-% The macro |\SOUL@everyhyphen| is executed at every possible
-% implicit hyphenation point.
-% \item[\normalfont\an{beta-test}]
-% Explicit hyphens trigger \cs{\SOUL@everyexhyphen}.
-% \end{labeling}
-%
-%
-%
-% \bigbreak
-% \noindent
-% It's only natural that these examples, too,
-% were automatically typeset by the |soul| package
-% using a special driver:
-%
-% \begin{example}
-% |\DeclareRobustCommand*\an{%|\\
-% | \def\SOUL@preamble{$^{^P}$}%|\\
-% | \def\SOUL@everyspace##1{##1\texttt{\char`\ }}%|\\
-% | \def\SOUL@postamble{$^{^E}$}%|\\
-% | \def\SOUL@everyhyphen{$^{^-}$}%|\\
-% | \def\SOUL@everyexhyphen##1{##1$^{^=}$}%|\\
-% | \def\SOUL@everysyllable{$^{^S}$}%|\\
-% | \def\SOUL@everytoken{\the\SOUL@token$^{^T}$}%|\\
-% | \def\SOUL@everylowerthan{$^{^L}$}%|\\
-% | \SOUL@}|\\
-% \end{example}
-%
-%
-%
-%
-%
-%
-%
-%
-% \subsection{A driver example}
-%
-% Let's define a \soul\ driver that allows to typeset text
-% with a \cs{\cdot} at every potential hyphenation point. The name of
-% the macro shall be \cs{\sy} (for \emph{syllables}).
-% Since the \soul\ mechanism is highly fragile, we use the \LaTeX\
-% command \cs{\DeclareRobustCommand}, so that the \cs{\sy} macro
-% can be used even in section headings etc. The \cs{\SOUL@setup}
-% macro sets all interface macros to reasonable default definitions.
-% This could of course be done manually, too. As we won't
-% make use of \cs{\SOUL@everytoken} and \cs{\SOUL@postamble}
-% and both default to \cs{\relax}, anyway, we don't have to
-% define them here.
-%
-% \begin{example}
-% |\DeclareRobustCommand*\sy{%|\\
-% | \SOUL@setup|\\
-% \end{example}
-%
-% We only set \cs{\lefthyphenmin} and \cs{\righthyphenmin} to zero
-% at the beginning. All changes are restored automatically,
-% so there's nothing to do at the end.
-%
-% \begin{example}
-% | \def\SOUL@preamble{\lefthyphenmin=0 \righthyphenmin=0 }%|\\
-% \end{example}
-%
-% We only want simple spaces. Note that these are not provided
-% by default! \cs{\SOUL@everyspace} may get a penalty to be
-% applied to that space, so we set it before.
-%
-% \begin{example}
-% | \def\SOUL@everyspace##1{##1\space}%|\\
-% \end{example}
-%
-% There's nothing to do for \cs{\SOUL@everytoken}, we rather let
-% \cs{\SOUL@everysyllable} handle a whole syllable at once.
-% This has the advantage, that we don't have to deal with
-% kerning values, because \TeX\ takes care of that.
-%
-% \begin{example}
-% | \def\SOUL@everysyllable{\the\SOUL@syllable}|\\
-% \end{example}
-%
-% The \TeX\ primitive \cs{\discretionary}
-% takes three arguments: 1.~pre-hyphen material
-% 2.~post-hyphen material, and 3.~no-hyphenation material.
-%
-% \begin{example}
-% | \def\SOUL@everyhyphen{%|\\
-% | \discretionary{%|\\
-% | \SOUL@setkern\SOUL@hyphkern|\\
-% | \SOUL@sethyphenchar|\\
-% | }{}{%|\\
-% | \hbox{\kern1pt$\cdot$}%|\\
-% | }%|\\
-% | }%|\\
-%\end{example}
-%
-% Explicit hyphens like dashes and slashes shall be set normally.
-% We just have to care for kerning. The hyphen has to be put in
-% a box, because, as \cs{\hyphenchar}, it would yield its own, internal
-% \cs{\discretionary}. We need to set ours instead, though.
-%
-% \begin{example}
-% | \def\SOUL@everyexhyphen##1{%|\\
-% | \SOUL@setkern\SOUL@hyphkern|\\
-% | \hbox{##1}%|\\
-% | \discretionary{}{}{%|\\
-% | \SOUL@setkern\SOUL@charkern|\\
-% | }%|\\
-% | }|%\\
-% \end{example}
-%
-% Now that the interface macros are defined, we can start the scanner.
-%
-% \begin{example}
-% | \SOUL@|\\
-% |}|\\
-% \end{example}
-%
-% \hyphenation{al-go-rithm lin-guists ex-cel-lent} ^^A correct?
-% \noindent
-% \emph{\sy{This little macro will hardly be good enough
-% for linguists, although it uses {\TeX's} excellent hyphenation algorithm,
-% but it is at least a nice alternative to the}} \cs{\showhyphens} \emph{\sy{command}.}
-%
-%
-%
-%
-%
-%
-%
-% \section*{Acknowledgements}
-%
-% A big thank you goes to \person{Stefan Ulrich} for his tips and bug reports
-% during the development of versions 1.\lower2pt\hbox{*} and for his lessons on high quality
-% typesetting. The \cs{\caps} mechanism was very much influenced by his
-% suggestions. Thanks to \person{Alexander Shibakov} and \person{Frank Mittelbach,}
-% who sent me a couple of bug reports and feature requests, and finally encouraged
-% me to (almost) completely rewrite \soul. \person{Thorsten Manegold} contributed
-% a series of bug reports, helping to fix \soul's macro expander and hence making
-% it work together with the \package{jurabib} package.
-% Thanks to \person{Axel Reichert, Anshuman Pandey,} and \person{Peter Kreynin} for
-% detailed bug reports.
-% \person{Rowland McDonnel} gave useful hints for how to improve the documentation,
-% but I'm afraid he will still not be satisfied, and rightfully so. If only documentation
-% writing weren't that boring.~~\texttt{;-)}
-%
-%
-%
-%
-%
-%
-%
-% \begin{thebibliography}{00}
-% \raggedright
-%
-% \bibitem{jurabib}{\person{Berger, Jens:} \bibtitle{The jurabib package.} \CTAN-Archive, 2002, v0.52h.}
-%
-% \bibitem{titlesec}{\person{Bezos, Javier:} \bibtitle{The titlesec and titletoc package.}
-% \CTAN-Archive, 1999, v2.1.}
-%
-% \bibitem{color}{\person{Carlisle, D. P.:} \bibtitle{The color package.} \CTAN-Archive, 1997, v1.0d.}
-%
-% \bibitem{Duden}{Duden, Volume 1. \bibtitle{Die Rechtschreibung.} Bibliographisches Institut,
-% Mann\-heim--\hskip0pt Wien--Z\"urich, 1986, 19th~edition.}
-%
-% \bibitem{DEK}{\person{Knuth, Donald E.:} \bibtitle{The \TeX book.}
-% Addison--Wesley Publishing Company, Reading/Massachusetts, 1989, 16th~edition.}
-%
-% \bibitem{Muszynski}{\person{Muszynski, Carl} and \person{P\v rihoda, Eduard:}
-% \bibtitle{Die Terrainlehre in Verbindung mit der Darstellung, Beurtheilung und
-% Beschreibung des Terrains vom milit\"arischen
-% Standpunkte.}
-% L.\,W.~Seidel \&\ Sohn, Wien, 1872.}
-%
-% \bibitem{Reglement}{Normalverordnungsblatt f\"ur das k.\,u.\,k.~Heer.
-% \bibtitle{Exercier-Reglement f\"ur die k.\,u.\,k.~Cavallerie, I. Theil.}
-% Wien, k.\,k.~Hof- und Staatsdruckerei, 1898, 4th~edition.}
-%
-% \bibitem{german}{\person{Raichle, Bernd:} \bibtitle{The german package.} \CTAN-Archive, 1998, v2.5e.}
-%
-% \bibitem{yfonts}{\person{Schmidt, Walter:} \bibtitle{Ein Makropaket f\"ur die gebrochenen
-% Schriften.} \CTAN-Archive, 1998, v1.2.}
-%
-% \bibitem{Tschichold}{\person{Tschichold, Jan:} \bibtitle{Ausgew\"ahlte Aufs\"atze \"uber Fragen
-% der Gestalt des Buches und der Typographie.} Birkh\"auser, Basel,
-% 1987, 2nd~edition.}
-%
-% \bibitem{Willberg}{\person{Willberg, Hans Peter} and \person{Forssmann, Friedrich:}
-% \bibtitle{Lesetypographie.} H. Schmidt, Mainz, 1997.}
-%
-% \end{thebibliography}
-%
-%
-% \StopEventually{\addtocontents{toc}{\protect\end{multicols}}}
-%
-%
-%
-%
-%
-%
-%
-%
-%^^A max 72 columns
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \section{The implementation}
-%
-% \subsection*{The package preamble}
-%
-% This piece of code makes sure that the package is only loaded
-% once. While this is guaranteed by \LaTeX, we have to do it
-% manually for all other flavors of \TeX.
-%
-% \begin{macrocode}
-\expandafter\ifx\csname SOUL@\endcsname\relax\else
- \expandafter\endinput
-\fi
-% \end{macrocode}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \noindent
-% Fake some of the \LaTeX\ commands if we were loaded by another flavor
-% of \TeX. This might break some previously loaded packages, though,
-% if e.\,g.~\cs{\mbox} was already in use. But we don't care \dots
-%
-% \begin{macrocode}
-\ifx\documentclass\SOULundefined
- \chardef\atcode=\catcode`@
- \catcode`\@=11
- \def\DeclareRobustCommand*{\def}
- \let\newcommand\DeclareRobustCommand
- \def\DeclareOption#1#2{\expandafter\def\csname#1\endcsname{#2}}
- \def\PackageError#1#2#3{{%
- \newlinechar`^^J%
- \errorcontextlines\z@
- \edef\\{\errhelp{#3}}\\%
- \errmessage{Package #1 error: #2}%
- }}
- \def\@height{height}
- \def\@depth{depth}
- \def\@width{width}
- \def\@plus{plus}
- \def\@minus{minus}
- \font\SOUL@tt=ectt1000
- \let\@xobeysp\space
- \let\linebreak\break
- \let\mbox\hbox
-% \end{macrocode}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \noindent
-% \soul\ tries to be a good \LaTeX\ citizen if used under \LaTeX\ and
-% declares itself properly. Most command sequences in the package
-% are protected by the |SOUL@| namespace, all other macros are first
-% defined to be empty. This will give us an error message \emph{now}
-% if one of those was already used by another package.
-%
-% \begin{macrocode}
-\else
- \NeedsTeXFormat{LaTeX2e}
- \ProvidesPackage{soul}
- [2003/11/17 v2.4 letterspacing/underlining (mf)]
- \newfont\SOUL@tt{ectt1000}
- \newcommand*\sodef{}
- \newcommand*\resetso{}
- \newcommand*\capsdef{}
- \newcommand*\capsfont{}
- \newcommand*\setulcolor{}
- \newcommand*\setuloverlap{}
- \newcommand*\setul{}
- \newcommand*\resetul{}
- \newcommand*\setuldepth{}
- \newcommand*\setstcolor{}
- \newcommand*\sethlcolor{}
- \newcommand*\so{}
- \newcommand*\ul{}
- \newcommand*\st{}
- \newcommand*\hl{}
- \newcommand*\caps{}
- \newcommand*\soulaccent{}
- \newcommand*\soulregister{}
- \newcommand*\soulfont{}
- \newcommand*\soulomit{}
-\fi
-% \end{macrocode}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \noindent
-% Other packages wouldn't be happy if we reserved piles of \cs{\newtoks} and
-% \cs{\newdimen}, so we try to get away with their \cs{\...def} counterparts
-% where possible.
-% Local registers are always even, while global ones are odd---this is a
-% \TeX\ convention.
-%
-% \begin{macrocode}
-\newtoks\SOUL@word
-\newtoks\SOUL@lasttoken
-\toksdef\SOUL@syllable\z@
-\newtoks\SOUL@cmds
-\newtoks\SOUL@buffer
-\newtoks\SOUL@token
-\dimendef\SOUL@syllgoal\z@
-\dimendef\SOUL@syllwidth\tw@
-\dimendef\SOUL@charkern=4
-\dimendef\SOUL@hyphkern=6
-\countdef\SOUL@minus\z@
-\countdef\SOUL@comma\tw@
-\countdef\SOUL@apo=4
-\countdef\SOUL@grave=6
-\newskip\SOUL@spaceskip
-\newif\ifSOUL@ignorespaces
-% \end{macrocode}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% ^^A\FIXME{\newpage}
-% \begin{macro}{\soulomit}
-% \begin{macro}{\SOUL@ignorem}
-% \begin{macro}{\SOUL@ignore}
-% \begin{macro}{\SOUL@stopm}
-% \begin{macro}{\SOUL@stop}
-% \begin{macro}{\SOUL@relaxm}
-% \begin{macro}{\SOUL@lowerthanm}
-% \begin{macro}{\SOUL@hyphenhintm}
-% These macros are used as markers. To be able to check for such a
-% marker with \cs{\ifx} we have also to create a macro that contains
-% the marker. \cs{\SOUL@spc} shall contain a normal space with a
-% \cs{\catcode} of~10.
-%
-% \begin{macrocode}
-\def\soulomit#1{#1}
-\def\SOUL@stopM{\SOUL@stop}
-\let\SOUL@stop\relax
-\def\SOUL@lowerthan{}
-\def\SOUL@lowerthanM{\<}
-\def\SOUL@hyphenhintM{\-}
-\def\SOUL@n*{\let\SOUL@spc= }\SOUL@n* %
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The kernel}
-%
-% \begin{macro}{\SOUL@}
-% This macro is the entry to \soul. Using it does only make
-% sense after setting up a \soul\ driver. The next token after
-% the \soul\ command will be assigned to \cs{\SOUL@@}. This can be
-% some text enclosed in braces, or the name of a macro that contains text.
-%
-% \begin{macrocode}
-\def\SOUL@{%
- \futurelet\SOUL@@\SOUL@expand
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@expand}
-% If the first token after the \soul\ command was an opening
-% brace we start scanning. Otherwise,
-% if the first token was a macro name, we expand that macro and
-% call \cs{\SOUL@} with its contents again. Unfortunately, we have to
-% exclude some macros therein from expansion.
-%
-% \begin{macrocode}
-\def\SOUL@expand{%
- \ifcat\bgroup\noexpand\SOUL@@
- \let\SOUL@n\SOUL@start
- \else
- \bgroup
- \def\\##1##2{\def##2{\noexpand##2}}%
- \the\SOUL@cmds
- \SOUL@buffer={%
- \\\TeX\\\LaTeX\\\soulomit\\\mbox\\\hbox\\\textregistered
- \\\slash\\\textcircled\\\copyright\\\S\\\,\\\<\\\>\\~%
- \\\\%
- }%
- \def\\##1{\def##1{\noexpand##1}}%
- \the\SOUL@buffer
- \let\protect\noexpand
- \xdef\SOUL@n##1{\noexpand\SOUL@start{\SOUL@@}}%
- \egroup
- \fi
- \SOUL@n
-}
-\long\def\SOUL@start#1{{%
- \let\<\SOUL@lowerthan
- \let\>\empty
- \def\soulomit{\noexpand\soulomit}%
- \gdef\SOUL@eventuallyexhyphen##1{}%
- \let\SOUL@soeventuallyskip\relax
- \SOUL@spaceskip=\fontdimen\tw@\font\@plus\fontdimen\thr@@\font
- \@minus\fontdimen4\font
- \SOUL@ignorespacesfalse
- \leavevmode
- \SOUL@preamble
- \SOUL@lasttoken={}%
- \SOUL@word={}%
- \SOUL@minus\z@
- \SOUL@comma\z@
- \SOUL@apo\z@
- \SOUL@grave\z@
- \SOUL@do{#1}%
- \SOUL@postamble
-}}
-\long\def\SOUL@do#1{%
- \SOUL@scan#1\SOUL@stop
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The scanner}
-%
-% \begin{macro}{\SOUL@scan}
-% This is the entry point for the scanner. It calls \cs{\SOUL@eval}
-% and will in turn be called by \cs{\SOUL@eval} again for every
-% new token to be scanned.
-%
-% \begin{macrocode}
-\def\SOUL@scan{%
- \futurelet\SOUL@@\SOUL@eval
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@eval}
-% And here it is: the scanner's heart. It cares for quotes and dashes
-% ligatures and handles all commands that must not be fed to the
-% analyzer.
-%
-% \begin{macrocode}
-\def\SOUL@eval{%
- \def\SOUL@n*##1{\SOUL@scan}%
- \if\noexpand\SOUL@@\SOUL@spc
- \else
- \SOUL@ignorespacesfalse
- \fi
- \ifnum\SOUL@minus=\thr@@
- \SOUL@flushminus
- \else\ifnum\SOUL@comma=\tw@
- \SOUL@flushcomma
- \else\ifnum\SOUL@apo=\tw@
- \SOUL@flushapo
- \else\ifnum\SOUL@grave=\tw@
- \SOUL@flushgrave
- \fi\fi\fi\fi
- \ifx\SOUL@@-\else\SOUL@flushminus\fi
- \ifx\SOUL@@,\else\SOUL@flushcomma\fi
- \ifx\SOUL@@'\else\SOUL@flushapo\fi
- \ifx\SOUL@@`\else\SOUL@flushgrave\fi
- \ifx\SOUL@@-%
- \advance\SOUL@minus\@ne
- \else\ifx\SOUL@@,%
- \advance\SOUL@comma\@ne
- \else\ifx\SOUL@@'%
- \advance\SOUL@apo\@ne
- \else\ifx\SOUL@@`%
- \advance\SOUL@grave\@ne
- \else
- \SOUL@flushminus
- \SOUL@flushcomma
- \SOUL@flushapo
- \SOUL@flushgrave
- \ifx\SOUL@@\SOUL@stop
- \def\SOUL@n*{%
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- }%
- \else\ifx\SOUL@@\par
- \def\SOUL@n*\par{\par\leavevmode\SOUL@scan}%
- \else\if\noexpand\SOUL@@\SOUL@spc
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- \ifSOUL@ignorespaces
- \else
- \SOUL@everyspace{}%
- \fi
- \def\SOUL@n* {\SOUL@scan}%
- \else\ifx\SOUL@@\\%
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- \SOUL@everyspace{\unskip\nobreak\hfil\break}%
- \SOUL@ignorespacestrue
- \else\ifx\SOUL@@~%
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- \SOUL@everyspace{\nobreak}%
- \else\ifx\SOUL@@\slash
- \SOUL@doword
- \SOUL@eventuallyexhyphen{/}%
- \SOUL@exhyphen{/}%
- \else\ifx\SOUL@@\mbox
- \def\SOUL@n*{\SOUL@addprotect}%
- \else\ifx\SOUL@@\hbox
- \def\SOUL@n*{\SOUL@addprotect}%
- \else\ifx\SOUL@@\soulomit
- \def\SOUL@n*\soulomit##1{%
- \SOUL@doword
- {\spaceskip\SOUL@spaceskip##1}%
- \SOUL@scan
- }%
- \else\ifx\SOUL@@\break
- \SOUL@doword
- \break
- \else\ifx\SOUL@@\linebreak
- \SOUL@doword
- \SOUL@everyspace{\linebreak}%
- \else\ifcat\bgroup\noexpand\SOUL@@
- \def\SOUL@n*{\SOUL@addgroup{}}%
- \else\ifcat$\noexpand\SOUL@@
- \def\SOUL@n*{\SOUL@addmath}%
- \else
- \def\SOUL@n*{\SOUL@dotoken}%
- \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
- \fi\fi\fi\fi
- \SOUL@n*%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@flushminus}
-% \begin{macro}{\SOUL@flushcomma}
-% \begin{macro}{\SOUL@flushapo}
-% \begin{macro}{\SOUL@flushgrave}
-% As their names imply, these macros flush special tokens or token
-% groups to the word register. They don't do anything if the respective
-% counter equals zero. \cs{\SOUL@minus} does also flush the word
-% register, because hyphens disturb the analyzer.
-%
-% \begin{macrocode}
-\def\SOUL@flushminus{%
- \ifcase\SOUL@minus
- \else
- \SOUL@doword
- \SOUL@eventuallyexhyphen{-}%
- \ifcase\SOUL@minus
- \or
- \SOUL@exhyphen{-}%
- \or
- \SOUL@exhyphen{--}%
- \or
- \SOUL@exhyphen{---}%
- \fi
- \SOUL@minus\z@
- \fi
-}
-\def\SOUL@flushcomma{%
- \ifcase\SOUL@comma
- \or
- \edef\x{\SOUL@word={\the\SOUL@word,}}\x
- \or
- \edef\x{\SOUL@word={\the\SOUL@word{{,,}}}}\x
- \fi
- \SOUL@comma\z@
-}
-\def\SOUL@flushapo{%
- \ifcase\SOUL@apo
- \or
- \edef\x{\SOUL@word={\the\SOUL@word'}}\x
- \or
- \edef\x{\SOUL@word={\the\SOUL@word{{''}}}}\x
- \fi
- \SOUL@apo\z@
-}
-\def\SOUL@flushgrave{%
- \ifcase\SOUL@grave
- \or
- \edef\x{\SOUL@word={\the\SOUL@word`}}\x
- \or
- \edef\x{\SOUL@word={\the\SOUL@word{{``}}}}\x
- \fi
- \SOUL@grave\z@
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@dotoken}
-% Command sequences from the \cs{\SOUL@cmds} list are handed over
-% to \cs{\SOUL@docmd}, everything else is added to \cs{\SOUL@word},
-% which will be fed to the analyzer every time a word is completed.
-% Since \emph{robust} commands come with an additional space, we
-% have also to examine if there's a space variant. Otherwise we
-% couldn't detect pre-expanded formerly robust commands.
-%
-% \begin{macrocode}
-\def\SOUL@dotoken#1{%
- \def\SOUL@@{\SOUL@addtoken{#1}}%
- \def\\##1##2{%
- \edef\SOUL@x{\string#1}%
- \edef\SOUL@n{\string##2}%
- \ifx\SOUL@x\SOUL@n
- \def\SOUL@@{\SOUL@docmd{##1}{#1}}%
- \else
- \edef\SOUL@n{\string##2\space}%
- \ifx\SOUL@x\SOUL@n
- \def\SOUL@@{\SOUL@docmd{##1}{#1}}%
- \fi
- \fi
- }%
- \the\SOUL@cmds
- \SOUL@@
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@docmd}
-% Here we deal with commands that were registered with \cs{\soulregister}
-% or \cs{\soulaccent} or were already predefined in \cs{\SOUL@cmds}.
-% Commands with identifier |9| are accents that are put in a
-% group with their argument. Identifier |8| is reserved for the \cs{\footnote}
-% command, and |7| for the \cs{\textsuperscript} or similar commands.
-% The others are mostly (but not necessarily)
-% font switching commands, which may (|1|) or may not (|0|) take
-% an argument. A registered command leads to the current word
-% buffer being flushed to the analyzer, after which the command
-% itself is executed.
-%
-% Font switching commands which take an argument need special
-% treatment: They need to increment the level counter, so that
-% \cs{\SOUL@eval} knows where to stop scanning. Furthermore the
-% scanner has to be enabled to see the next token after the opening
-% brace.
-%
-%
-% \begin{macrocode}
-\def\SOUL@docmd#1#2{%
- \ifx9#1%
- \def\SOUL@@{\SOUL@addgroup{#2}}%
- \else\ifx8#1%
- \SOUL@doword
- \def\SOUL@@##1{%
- \SOUL@token={\footnotemark}%
- \SOUL@everytoken
- \SOUL@syllable={\footnotemark}%
- \SOUL@everysyllable
- \footnotetext{##1}%
- \SOUL@doword
- \SOUL@scan
- }%
- \else\ifx7#1%
- \SOUL@doword
- \def\SOUL@@##1{%
- \SOUL@token={#2{##1}}%
- \SOUL@everytoken
- \SOUL@syllable={#2{##1}}%
- \SOUL@everysyllable
- \SOUL@doword
- \SOUL@scan
- }%
- \else\ifx1#1%
- \SOUL@doword
- \def\SOUL@@##1{%
- #2{\protect\SOUL@do{##1}}%
- \SOUL@scan
- }%
- \else
- \SOUL@doword
- #2%
- \let\SOUL@@\SOUL@scan
- \fi\fi\fi\fi
- \SOUL@@
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@addgroup}
-% \begin{macro}{\SOUL@addmath}
-% \begin{macro}{\SOUL@addprotect}
-% \begin{macro}{\SOUL@addtoken}
-% The macro names say it all. Each of these macros adds some
-% token to the word buffer \cs{\SOUL@word}. Setting \cs{\protect}
-% is necessary to make things like |\so{{a\itshape b}}| work.
-%
-% \begin{macrocode}
-\def\SOUL@addgroup#1#2{%
- {\let\protect\noexpand
- \edef\x{\global\SOUL@word={\the\SOUL@word{{\noexpand#1#2}}}}\x}%
- \SOUL@scan
-}
-\def\SOUL@addmath$#1${%
- {\let\protect\noexpand
- \edef\x{\global\SOUL@word={\the\SOUL@word{{\hbox{$#1$}}}}}\x}%
- \SOUL@scan
-}
-\def\SOUL@addprotect#1#2{%
- {\let\protect\noexpand
- \edef\x{\global\SOUL@word={\the\SOUL@word{{\hbox{#2}}}}}\x}%
- \SOUL@scan
-}
-\def\SOUL@addtoken#1{%
- \edef\x{\SOUL@word={\the\SOUL@word\noexpand#1}}\x
- \SOUL@scan
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@exhyphen}
-% Dealing with explicit hyphens can't be done before we know the
-% following character, because we need to know if a kerning value
-% has to be inserted, hence we delay the \cs{\SOUL@everyexhyphen} call.
-% Unfortunately, the word scanner has no look-ahead mechanism.
-%
-% \begin{macrocode}
-\def\SOUL@exhyphen#1{%
- \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@hyphkern}{#1}%
- \gdef\SOUL@eventuallyexhyphen##1{%
- \SOUL@getkern{#1}{\SOUL@charkern}{##1}%
- \SOUL@everyexhyphen{#1}%
- \gdef\SOUL@eventuallyexhyphen####1{}%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@cmds}
-% Here is a list of pre-registered commands that the analyzer
-% cannot handle, so the scanner has to look after them. Every
-% entry consists of a handle (\cs{\\}), an identifier and the
-% macro name. The class identifier can be |9| for accents,
-% |8| for the \cs{\footnote} command, |7| for the
-% \cs{\textsuperscript} command,
-% |0| for commands without arguments and |1| for commands that
-% take one argument. Commands with two or more arguments are
-% not supported.
-%
-% \begin{macrocode}
-\SOUL@cmds={%
- \\9\`\\9\'\\9\^\\9\"\\9\~\\9\=\\9\.%
- \\9\u\\9\v\\9\H\\9\t\\9\c\\9\d\\9\b\\9\r
- \\1\emph\\1\textrm\\1\textsf\\1\texttt\\1\textmd\\1\textbf
- \\1\textup\\1\textsl\\1\textit\\1\textsc\\1\textnormal
- \\0\rmfamily\\0\sffamily\\0\ttfamily\\0\mdseries\\0\upshape
- \\0\slshape\\0\itshape\\0\scshape\\0\normalfont
- \\0\em\\0\rm\\0\bf\\0\it\\0\tt\\0\sc\\0\sl\\0\sf
- \\0\tiny\\0\scriptsize\\0\footnotesize\\0\small
- \\0\normalsize\\0\large\\0\Large\\0\LARGE\\0\huge\\0\Huge
- \\1\MakeUppercase\\7\textsuperscript\\8\footnote
- \\1\textfrak\\1\textswab\\1\textgoth
- \\0\frakfamily\\0\swabfamily\\0\gothfamily
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\soulregister}
-% \begin{macro}{\soulfont}
-% \begin{macro}{\soulaccent}
-% Register a font switching command (or some other command) for the
-% scanner. The first argument is the macro name, the second is
-% the number of arguments (|0|~or~|1|). Example: |\soulregister{\bold}{0}|.
-% \cs{\soulaccent} has only one argument---the accent macro name.
-% Example: |\soulaccent{\~}|. It is a shortcut for |\soulregister{\~}{9}|.
-% The \cs{\soulfont} command is a synonym for \cs{\soulregister}
-% and is kept for compatibility reasons.
-%
-% \begin{macrocode}
-\def\soulregister#1#2{{%
- \edef\x{\global\SOUL@cmds={\the\SOUL@cmds
- \noexpand\\#2\noexpand#1}}\x
-}}
-\def\soulaccent#1{\soulregister{#1}9}
-\let\soulfont\soulregister
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The analyzer}
-%
-% \begin{macro}{\SOUL@doword}
-% The only way to find out, where a given word can be broken into
-% syllables, is to let \TeX\ actually typeset the word under conditions
-% that enforce every possible hyphenation. The result is a paragraph with one
-% line for every syllable.
-%
-% \begin{macrocode}
-\def\SOUL@doword{%
- \edef\x{\the\SOUL@word}%
- \ifx\x\empty
- \else
- \SOUL@buffer={}%
- \setbox\z@\vbox{%
- \SOUL@tt
- \hyphenchar\font`\-
- \hfuzz\maxdimen
- \hbadness\@M
- \pretolerance\m@ne
- \tolerance\@M
- \leftskip\z@
- \rightskip\z@
- \hsize1sp
- \everypar{}%
- \parfillskip\z@\@plus1fil
- \hyphenpenalty-\@M
- \noindent
- \hskip\z@
- \relax
- \the\SOUL@word}%
- \let\SOUL@errmsg\SOUL@error
- \let\-\relax
- \count@\m@ne
- \SOUL@analyze
- \SOUL@word={}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \noindent
-% We store the hyphen width of the |ectt1000| font,
-% because we will need it in |\SOUL@doword|. (|ectt1000| is a mono-spaced
-% font, so every other character would have worked, too.)
-%
-% \begin{macrocode}
-\setbox\z@\hbox{\SOUL@tt-}
-\newdimen\SOUL@ttwidth
-\SOUL@ttwidth\wd\z@
-\def\SOUL@sethyphenchar{%
- \ifnum\hyphenchar\font=\m@ne
- \else
- \char\hyphenchar\font
- \fi
-}
-% \end{macrocode}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@analyze}
-% This macro decomposes the box that |\SOUL@doword| has built.
-% Because we have to start at the bottom, we put every
-% syllable onto the stack and execute ourselves recursively. If there
-% are no syllables left, we return from the recursion and pick syllable
-% after syllable from the stack again---this time from top to bottom---and
-% hand the syllable width |\SOUL@syllgoal| over to |\SOUL@dosyllable|.
-% All but the last syllable end with the hyphen character, hence
-% we subtract the hyphen width accordingly. After processing a
-% syllable we calculate the hyphen kern (i.\,e.~the kerning amount
-% between the last character and the hyphen). This might be needed
-% by \cs{\SOUL@everyhyphen}, which we call now.
-%
-% \begin{macrocode}
-\def\SOUL@analyze{{%
- \setbox\z@\vbox{%
- \unvcopy\z@
- \unskip
- \unpenalty
- \global\setbox\@ne=\lastbox}%
- \ifvoid\@ne
- \else
- \setbox\@ne\hbox{\unhbox\@ne}%
- \SOUL@syllgoal=\wd\@ne
- \advance\count@\@ne
- \SOUL@analyze
- \SOUL@syllwidth\z@
- \SOUL@syllable={}%
- \ifnum\count@>\z@
- \advance\SOUL@syllgoal-\SOUL@ttwidth
- \SOUL@dosyllable
- \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@hyphkern}%
- {\SOUL@sethyphenchar}%
- \SOUL@everyhyphen
- \else
- \SOUL@dosyllable
- \fi
- \fi
-}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@dosyllable}
-% This macro typesets token after token from \cs{\SOUL@word}
-% until \cs{\SOUL@syllwidth} has reached
-% the requested width \cs{\SOUL@syllgoal}. Furthermore the kerning
-% values are prepared in case \cs{\SOUL@everytoken} needs them.
-% The \cs{\<} command used by \cs{\so} and \cs{\caps} needs some
-% special treatment: It has to be checked for, even before
-% we can end a syllable.
-%
-% \begin{macrocode}
-\def\SOUL@dosyllable{%
- \SOUL@gettoken
- \SOUL@eventuallyexhyphen{\the\SOUL@token}%
- \edef\x{\the\SOUL@token}%
- \ifx\x\SOUL@hyphenhintM
- \let\SOUL@n\SOUL@dosyllable
- \else\ifx\x\SOUL@lowerthanM
- \SOUL@gettoken
- \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@charkern}
- {\the\SOUL@token}%
- \SOUL@everylowerthan
- \SOUL@puttoken
- \let\SOUL@n\SOUL@dosyllable
- \else\ifdim\SOUL@syllwidth=\SOUL@syllgoal
- \SOUL@everysyllable
- \SOUL@puttoken
- \let\SOUL@n\relax
- \else\ifx\x\SOUL@stopM
- \SOUL@errmsg
- \global\let\SOUL@errmsg\relax
- \let\SOUL@n\relax
- \else
- \setbox\tw@\hbox{\SOUL@tt\the\SOUL@token}%
- \advance\SOUL@syllwidth\wd\tw@
- \global\SOUL@lasttoken=\SOUL@token
- \SOUL@gettoken
- \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@charkern}
- {\the\SOUL@token}%
- \SOUL@puttoken
- \global\SOUL@token=\SOUL@lasttoken
- \SOUL@everytoken
- \edef\x{\SOUL@syllable={\the\SOUL@syllable\the\SOUL@token}}\x
- \let\SOUL@n\SOUL@dosyllable
- \fi\fi\fi\fi
- \SOUL@n
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@gettoken}
-% Provide the next token in \cs{\SOUL@token}. If there's already one
-% in the buffer, use that one first.
-%
-% \begin{macrocode}
-\def\SOUL@gettoken{%
- \edef\x{\the\SOUL@buffer}%
- \ifx\x\empty
- \SOUL@nexttoken
- \else
- \global\SOUL@token=\SOUL@buffer
- \global\SOUL@buffer={}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@puttoken}
-% The possibility to put tokens back makes the scanner design much
-% cleaner. There's only room for one token, though, so we issue
-% an error message if \cs{\SOUL@puttoken} is told to put a token
-% back while the buffer is still in use. Note that \cs{\SOUL@debug}
-% is actually undefined. This won't hurt as it can only happen
-% during driver design. No user will ever see this message.
-%
-% \begin{macrocode}
-\def\SOUL@puttoken{%
- \edef\x{\the\SOUL@buffer}%
- \ifx\x\empty
- \global\SOUL@buffer=\SOUL@token
- \global\SOUL@token={}%
- \else
- \SOUL@debug{puttoken called twice}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@nexttoken}
-% \begin{macro}{\SOUL@splittoken}
-% If the word buffer \cs{\SOUL@word} is empty, deliver a \cs{\SOUL@stop},
-% otherwise take the next token.
-%
-% \begin{macrocode}
-\def\SOUL@nexttoken{%
- \edef\x{\the\SOUL@word}%
- \ifx\x\empty
- \SOUL@token={\SOUL@stop}%
- \else
- \expandafter\SOUL@splittoken\the\SOUL@word\SOUL@stop
- \fi
-}
-\def\SOUL@splittoken#1#2\SOUL@stop{%
- \global\SOUL@token={#1}%
- \global\SOUL@word={#2}%
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@getkern}
-% Assign the kerning value between the first and the third argument
-% to the second, which has to be a \cs{\dimen} register.
-% |\SOUL@getkern{A}{\dimen0}{V}| will assign the kerning value
-% between `A' and `V' to |\dimen0|.
-%
-% \begin{macrocode}
-\def\SOUL@getkern#1#2#3{%
- \setbox\tw@\hbox{#1#3}%
- #2\wd\tw@
- \setbox\tw@\hbox{#1\null#3}%
- \advance#2-\wd\tw@
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@setkern}
-% Set a kerning value if it doesn't equal 0\,pt. Of course, we could
-% also set a zero value, but that would needlessly clutter the
-% logfile.
-%
-% \begin{macrocode}
-\def\SOUL@setkern#1{\ifdim#1=\z@\else\kern#1\fi}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@error}
-% This error message will be shown once for every word that couldn't
-% be reconstructed by \cs{\SOUL@dosyllable}.
-%
-% \begin{macrocode}
-\def\SOUL@error{%
- \vrule\@height.8em\@depth.2em\@width1em
- \PackageError{soul}{Reconstruction failed}{%
- I came across hyphenatable material enclosed in group
- braces,^^Jwhich I can't handle. Either drop the braces or
- make the material^^Junbreakable using an \string\mbox\space
- (\string\hbox). Note that a space^^Jalso counts as possible
- hyphenation point. See page 4 of the manual.^^JI'm leaving
- a black square so that you can see where I am right now.%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@setup}
-% This is a null driver, that will be used as the basis for
-% other drivers. These have then to redefine only interface commands
-% that shall differ from the default.
-%
-% \begin{macrocode}
-\def\SOUL@setup{%
- \let\SOUL@preamble\relax
- \let\SOUL@postamble\relax
- \let\SOUL@everytoken\relax
- \let\SOUL@everysyllable\relax
- \def\SOUL@everyspace##1{##1\space}%
- \let\SOUL@everyhyphen\relax
- \def\SOUL@everyexhyphen##1{##1}%
- \let\SOUL@everylowerthan\relax
-}
-\SOUL@setup
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The \texorpdfstring{\so{letterspacing}}{letterspacing} driver}
-%
-% \begin{macro}{\SOUL@sosetletterskip}
-% A handy helper macro that sets the inter-letter skip with a
-% draconian \cs{\penalty}.
-%
-% \begin{macrocode}
-\def\SOUL@sosetletterskip{\nobreak\hskip\SOUL@soletterskip}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@sopreamble}
-% If letterspacing (\cs{\so} or \cs{\caps}) follows a white space, we
-% replace it with our \syn{outer space}. \LaTeX\ uses |\hskip1sp| as
-% marker in tabular entries, so we ignore tiny skips.
-%
-% \begin{macrocode}
-\def\SOUL@sopreamble{%
- \ifdim\lastskip>5sp
- \unskip
- \hskip\SOUL@soouterskip
- \fi
- \spaceskip\SOUL@soinnerskip
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@sopostamble}
-% Start the look-ahead scanner \cs{\SOUL@socheck} outside the \cs{\SOUL@}
-% scope. That's why we make the \syn{outer space} globally available in
-% \cs{\skip@}.
-%
-% \begin{macrocode}
-\def\SOUL@sopostamble{%
- \global\skip@=\SOUL@soouterskip
- \aftergroup\SOUL@socheck
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@socheck}
-% \begin{macro}{\SOUL@sodoouter}
-% Read the next token after the \soul\ command into \cs{\SOUL@@}
-% and examine it. If it's some kind of space, replace it with
-% \syn{outer space} and the appropriate penalty, else if it's
-% a closing brace, continue scanning. If it is neither: do nothing.
-%
-% \begin{macrocode}
-\def\SOUL@socheck{%
- \futurelet\SOUL@@\SOUL@sodoouter
-}
-\def\SOUL@sodoouter{%
- \def\SOUL@n*##1{\hskip\skip@}%
- \ifcat\egroup\noexpand\SOUL@@
- \unkern
- \egroup
- \def\SOUL@n*{\afterassignment\SOUL@socheck\let\SOUL@x=}%
- \else\ifx\SOUL@spc\SOUL@@
- \def\SOUL@n* {\hskip\skip@}%
- \else\ifx~\SOUL@@
- \def\SOUL@n*~{\nobreak\hskip\skip@}%
- \else\ifx\ \SOUL@@
- \else\ifx\space\SOUL@@
- \else\ifx\@xobeysp\SOUL@@
- \else
- \def\SOUL@n*{}%
- \let\SOUL@@\relax
- \fi\fi\fi\fi\fi\fi
- \SOUL@n*%
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@soeverytoken}
-% Typeset the token and put an unbreakable inter-letter skip
-% thereafter. If the token is \cs{\<} then remove the last skip instead.
-% Gets the character kerning value between the actual and the
-% next token in \cs{\SOUL@charkern}.
-%
-% \begin{macrocode}
-\def\SOUL@soeverytoken{%
- \edef\x{\the\SOUL@token}%
- \ifx\x\SOUL@lowerthanM
- \else
- \global\let\SOUL@soeventuallyskip\SOUL@sosetletterskip
- \the\SOUL@token
- \SOUL@gettoken
- \edef\x{\the\SOUL@token}%
- \ifx\x\SOUL@stopM
- \else
- \SOUL@setkern\SOUL@charkern
- \SOUL@sosetletterskip
- \SOUL@puttoken
- \fi
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@soeveryspace}
-% This macro sets an \syn{inner space}. The argument may contain
-% penalties and is used for the |~| command. This construction was
-% needed to make colored underlines work, without having to put
-% any of the coloring commands into the core. |\kern\z@| prevents
-% in subsequent \cs{\so} commands that the second discards the
-% \syn{outer space} of the first. To remove the space simply
-% use |\unkern\unskip|.
-%
-% \begin{macrocode}
-\def\SOUL@soeveryspace#1{#1\space\kern\z@}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@soeveryhyphen}
-% Sets implicit hyphens. The kerning value between the current token
-% and the hyphen character is passed in \cs{\SOUL@hyphkern}.
-%
-% \begin{macrocode}
-\def\SOUL@soeveryhyphen{%
- \discretionary{%
- \unkern
- \SOUL@setkern\SOUL@hyphkern
- \SOUL@sethyphenchar
- }{}{}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@soeveryexhyphen}
-% Sets the explicit hyphen that is passed as argument.
-% \cs{\SOUL@soeventuallyskip} equals \cs{\SOUL@sosetletterskip},
-% except when a \cs{\<} had been detected. This is necessary because
-% \cs{\SOUL@soeveryexhyphen} wouldn't know otherwise, that it
-% follows a~\cs{\<}.
-%
-% \begin{macrocode}
-\def\SOUL@soeveryexhyphen#1{%
- \SOUL@setkern\SOUL@hyphkern
- \SOUL@soeventuallyskip
- \hbox{#1}%
- \discretionary{}{}{%
- \SOUL@setkern\SOUL@charkern
- }%
- \SOUL@sosetletterskip
- \global\let\SOUL@soeventuallyskip\relax
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@soeverylowerthan}
-% Let \cs{\<} remove the last inter-letter skip. Set the kerning value
-% between the token before and that after the \cs{\<} command.
-%
-%
-% \begin{macrocode}
-\def\SOUL@soeverylowerthan{%
- \unskip
- \unpenalty
- \global\let\SOUL@soeventuallyskip\relax
- \SOUL@setkern\SOUL@charkern
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@sosetup}
-% Override all interface macros by our letterspacing versions. The
-% only unused macro is \cs{\SOUL@everysyllable}.
-%
-% \begin{macrocode}
-\def\SOUL@sosetup{%
- \SOUL@setup
- \let\SOUL@preamble\SOUL@sopreamble
- \let\SOUL@postamble\SOUL@sopostamble
- \let\SOUL@everytoken\SOUL@soeverytoken
- \let\SOUL@everyspace\SOUL@soeveryspace
- \let\SOUL@everyhyphen\SOUL@soeveryhyphen
- \let\SOUL@everyexhyphen\SOUL@soeveryexhyphen
- \let\SOUL@everylowerthan\SOUL@soeverylowerthan
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@setso}
-% A handy macro for internal use.
-%
-% \begin{macrocode}
-\def\SOUL@setso#1#2#3{%
- \def\SOUL@soletterskip{#1}%
- \def\SOUL@soinnerskip{#2}%
- \def\SOUL@soouterskip{#3}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\sodef}
-% This macro assigns the letterspacing skips as well as an optional
-% font switching command to a command sequence name. \cs{\so} itself
-% will be defined using this macro.
-%
-% \begin{macrocode}
-\def\sodef#1#2#3#4#5{%
- \DeclareRobustCommand*#1{\SOUL@sosetup
- \def\SOUL@preamble{%
- \SOUL@setso{#3}{#4}{#5}%
- #2%
- \SOUL@sopreamble
- }%
- \SOUL@
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\resetso}
-% Let \cs{\resetso} define reasonable default values for letterspacing.
-%
-% \begin{macrocode}
-\def\resetso{%
- \sodef\textso{}{.25em}{.65em\@plus.08em\@minus.06em}%
- {.55em\@plus.275em\@minus.183em}%
-}
-\resetso
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\sloppyword}
-% Set up a letterspacing macro that inserts slightly stretchable
-% space between the characters. This can be used to typeset long
-% words in narrow columns, where ragged paragraphs are undesirable.
-% See section~\ref{sec:sloppyword}.
-%
-% \begin{macrocode}
-\sodef\sloppyword{%
- \linepenalty10
- \hyphenpenalty10
- \adjdemerits\z@
- \doublehyphendemerits\z@
- \finalhyphendemerits\z@
- \emergencystretch.1em}%
- {\z@\@plus.1em}%
- {.33em\@plus.11em\@minus.11em}%
- {.33em\@plus.11em\@minus.11em}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection[The \texorpdfstring{\caps{caps}}{caps} driver]{The caps driver}
-%
-% \begin{macro}{\caps}
-% Unless run under \LaTeX, make \cs{\caps} just another simple letterspacing
-% macro that selects a font \cs{\capsfont} (defaulting to \cs{\relax}) but
-% doesn't have any special capabilities.
-%
-% \begin{macrocode}
-\ifx\documentclass\@undefined
-\let\capsfont\relax
-\let\capsreset\relax
-\def\capsdef#1#2#3#4#5{}
-\def\capssave#1{}
-\def\capsselect#1{}
-\sodef\textcaps{\capsfont}
- {.028em\@plus.005em\@minus.01em}%
- {.37em\@plus.1667em\@minus.111em}%
- {.37em\@plus.1em\@minus.14em}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\capsreset}
-% \dots\ else, if run under \LaTeX\ prepare a set of macros that
-% maintain a database with certain letterspacing values for different
-% fonts. \cs{\capsreset} clears the database and inserts a default rule.
-%
-% \begin{macrocode}
-\else
-\DeclareRobustCommand*\capsreset{%
- \let\SOUL@capsbase\empty
- \SOUL@capsdefault
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\capsdef}
-% Add an entry to the database, which is of course nothing else than
-% a \TeX\ macro. See section ``List macros'' of appendix~D in the
-% \TeX{}book~\cite{DEK} for details.
-%
-% \begin{macrocode}
-\def\capsdef#1#2#3#4#5{{%
- \toks\z@{\\{#1/#2/#3/#4/#5}}%
- \toks\tw@=\expandafter{\SOUL@capsbase}%
- \xdef\SOUL@capsbase{\the\toks\z@\the\toks\tw@}%
-}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\capssave}
-% \begin{macro}{\capsselect}
-% Save the current database in a macro within the |SOUL@| namespace
-% and let |\capsselect| restore this database.
-%
-% \begin{macrocode}
-\DeclareRobustCommand*\capssave[1]{%
- \expandafter\global\expandafter\let
- \csname SOUL@db@#1\endcsname\SOUL@capsbase
-}
-\DeclareRobustCommand*\capsselect[1]{%
- \expandafter\let\expandafter\SOUL@capsbase
- \csname SOUL@db@#1\endcsname
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@capsfind}
-% \begin{macro}{\SOUL@caps}
-% Go through the database entries and pick the first entry that matches
-% the currently active font. Then define an internal macro that uses
-% the respective spacing values in a macro that is equivalent to the
-% \cs{\textso} command.
-%
-% \begin{macrocode}
-\def\SOUL@capsfind#1/#2/#3/#4/#5/#6/#7/#8/#9/{%
- \let\SOUL@match=1%
- \SOUL@chk{#1}\f@encoding
- \SOUL@chk{#2}\f@family
- \SOUL@chk{#3}\f@series
- \SOUL@chk{#4}\f@shape
- \SOUL@dimchk{#5}\f@size
- \if\SOUL@match1%
- \let\\\@gobble
- \gdef\SOUL@caps{%
- \SOUL@sosetup
- \def\SOUL@preamble{\SOUL@setso{#7}{#8}{#9}#6%
- \SOUL@sopreamble}%
- \SOUL@}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@chk}
-% Sets the \cs{\SOUL@match} flag if both parameters are equal.
-% This is used for all \caps{\small NFSS} elements except the font size.
-%
-% \begin{macrocode}
-\def\SOUL@chk#1#2{%
- \if$#1$%
- \else
- \def\SOUL@n{#1}%
- \ifx#2\SOUL@n\else\let\SOUL@match=0\fi
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@dimchk}
-% \begin{macro}{\SOUL@rangechk}
-% We do not only want to check if a given font size |#1| matches |#2|,
-% but also if it fits into a given range. An omitted lower boundary
-% is replaced by \cs{\z@} and an omitted upper boundary by \cs{\maxdimen}.
-% The first of a series of \cs{\SOUL@chk} and \cs{\SOUL@dimchk}
-% statements, which detects that the arguments don't match, sets the
-% \cs{\SOUL@match} flag to zero. A value of~1 indicates that an
-% entry in the font database matches the currently used font.
-%
-% \begin{macrocode}
-\def\SOUL@dimchk#1#2{\if$#1$\else\SOUL@rangechk{#2}#1--\@ne\@@\fi}
-\def\SOUL@rangechk#1#2-#3-#4\@@{%
- \count@=#4%
- \ifnum\count@>\z@
- \ifdim#1\p@=#2\p@\else\let\SOUL@match=0\fi
- \else
- \dimen@=\if$#2$\z@\else#2\p@\fi
- \ifdim#1\p@<\dimen@\let\SOUL@match=0\fi
- \dimen@=\if$#3$\maxdimen\else#3\p@\fi
- \ifdim#1\p@<\dimen@\else\let\SOUL@match=0\fi
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\textcaps}
-% Find a matching entry in the database and start the letterspacing
-% mechanism with the given spacing values.
-%
-% \begin{macrocode}
-\DeclareRobustCommand*\textcaps{{%
- \def\\##1{\expandafter\SOUL@capsfind##1/}%
- \SOUL@capsbase
- \aftergroup\SOUL@caps
-}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@capsdefault}
-% Define a default database entry and a default font.
-%
-% \begin{macrocode}
-\def\SOUL@capsdefault{%
- \capsdef{////}%
- \SOUL@capsdfltfnt
- {.028em\@plus.005em\@minus.01em}%
- {.37em\@plus.1667em\@minus.1em}%
- {.37em\@plus.111em\@minus.14em}%
-}
-\let\SOUL@capsdfltfnt\scshape
-\capsreset
-\fi
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The \texorpdfstring{\ul{underlining}}{underlining} driver}
-%
-% \begin{macro}{\SOUL@ulleaders}
-% This macro sets the underline under the following \cs{\hskip}.
-%
-% \begin{macrocode}
-\newdimen\SOUL@uldp
-\newdimen\SOUL@ulht
-\def\SOUL@ulleaders{%
- \leaders\hrule\@depth\SOUL@uldp\@height\SOUL@ulht\relax
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@ulunderline}
-% Set an underline under the given material. It draws the line first,
-% and the given material afterwards. This is needed for highlighting,
-% but gives less than optimal results for colored overstriking, which,
-% however, will hardly ever be used, anyway.
-%
-% \begin{macrocode}
-\def\SOUL@ulunderline#1{{%
- \setbox\z@\hbox{#1}%
- \dimen@=\wd\z@
- \dimen@i=\SOUL@uloverlap
- \advance\dimen@2\dimen@i
- \rlap{%
- \null
- \kern-\dimen@i
- \SOUL@ulcolor{\SOUL@ulleaders\hskip\dimen@}%
- }%
- \unhcopy\z@
-}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@ulpreamble}
-% Just set up the line dimensions and the space skip. Normally,
-% \cs{\spaceskip} is unset and not used by \TeX. We need it, though,
-% because we feed it to the \cs{\leaders} primitive.
-%
-% \begin{macrocode}
-\def\SOUL@ulpreamble{%
- \SOUL@uldp=\SOUL@uldepth
- \SOUL@ulht=-\SOUL@uldp
- \advance\SOUL@uldp\SOUL@ulthickness
- \spaceskip\SOUL@spaceskip
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@uleverysyllable}
-% By using \cs{\SOUL@everysyllable} we don't have to care about
-% kerning values and get better results for highlighting, where
-% negative kerning values would otherwise cut off characters.
-%
-% \begin{macrocode}
-\def\SOUL@uleverysyllable{%
- \SOUL@ulunderline{%
- \the\SOUL@syllable
- \SOUL@setkern\SOUL@charkern
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@uleveryspace}
-% Set a given penalty and an underlined \cs{\space} equivalent.
-% The \cs{\null} prevents a nasty gap in |\textfrak| |{a \textswab{b}}|,
-% while it doesn't seem to hurt in all other cases. I didn't investigate
-% this.
-%
-% \begin{macrocode}
-\def\SOUL@uleveryspace#1{%
- \SOUL@ulcolor{%
- #1%
- \SOUL@ulleaders
- \hskip\spaceskip
- }%
- \null
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@uleveryhyphen}
-% If hyphenation takes place, output an underlined hyphen with the
-% required hyphen kerning value.
-%
-% \begin{macrocode}
-\def\SOUL@uleveryhyphen{%
- \discretionary{%
- \unkern
- \SOUL@ulunderline{%
- \SOUL@setkern\SOUL@hyphkern
- \SOUL@sethyphenchar
- }%
- }{}{}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@uleveryexhyphen}
-% Underline the given hyphen, en-dash, em-dash or \cs{\slash} and care
-% for kerning.
-%
-% \begin{macrocode}
-\def\SOUL@uleveryexhyphen#1{%
- \SOUL@setkern\SOUL@hyphkern
- \SOUL@ulunderline{#1}%
- \discretionary{}{}{%
- \SOUL@setkern\SOUL@charkern
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@ulcolor}
-% \begin{macro}{\setulcolor}
-% Define the underline color or turn off coloring, in which case the lines are not
-% just colored black, but remain uncolored. This makes them appear
-% black, nevertheless, and has the advantage, that no Postscript
-% \cs{\specials} are cluttering the output.
-%
-% \begin{macrocode}
-\let\SOUL@ulcolor\relax
-\def\setulcolor#1{%
- \if$#1$
- \let\SOUL@ulcolor\relax
- \else
- \def\SOUL@ulcolor{\textcolor{#1}}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\setuloverlap}
-% \begin{macro}{\SOUL@uloverlap}
-% Set the overlap amount, that helps to avoid gaps on sloppy output
-% devices.
-%
-% \begin{macrocode}
-\def\setuloverlap#1{\def\SOUL@uloverlap{#1}}
-\setuloverlap{.25pt}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@ulsetup}
-% The underlining driver is quite simple. No need for \cs{\SOUL@postamble}
-% and \cs{\SOUL@everytoken}.
-%
-% \begin{macrocode}
-\def\SOUL@ulsetup{%
- \SOUL@setup
- \let\SOUL@preamble\SOUL@ulpreamble
- \let\SOUL@everysyllable\SOUL@uleverysyllable
- \let\SOUL@everyspace\SOUL@uleveryspace
- \let\SOUL@everyhyphen\SOUL@uleveryhyphen
- \let\SOUL@everyexhyphen\SOUL@uleveryexhyphen
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@textul}
-% Describing self-explanatory macros is \emph{so} boring!
-%
-% \begin{macrocode}
-\DeclareRobustCommand*\textul{\SOUL@ulsetup\SOUL@}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\setul}
-% \begin{macro}{\SOUL@uldepth}
-% \begin{macro}{\SOUL@ulthickness}
-% Set the underlining dimensions. Either value may be omitted and
-% lets the respective macro keep its current contents.
-%
-% \begin{macrocode}
-\def\setul#1#2{%
- \if$#1$\else\def\SOUL@uldepth{#1}\fi
- \if$#2$\else\def\SOUL@ulthickness{#2}\fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\resetul}
-% Set reasonable default values that fit most latin fonts.
-%
-% \begin{macrocode}
-\def\resetul{\setul{.65ex}{.1ex}}
-\resetul
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\setuldepth}
-% This macro sets all designated ``letters'' (\cs{\catcode=11}) or the
-% given material in a box and sets the underlining dimensions according
-% to the box depth.
-%
-% \begin{macrocode}
-\def\setuldepth#1{{%
- \def\SOUL@n{#1}%
- \setbox\z@\hbox{%
- \tracinglostchars\z@
- \ifx\SOUL@n\empty
- \count@\z@
- \loop
- \ifnum\catcode\count@=11\char\count@\fi
- \ifnum\count@<\@cclv
- \advance\count@\@ne
- \repeat
- \else
- #1%
- \fi
- }%
- \dimen@\dp\z@
- \advance\dimen@\p@
- \xdef\SOUL@uldepth{\the\dimen@}%
-}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The \texorpdfstring{\st{overstriking}}{overstriking} driver}
-%
-% \begin{macro}{\SOUL@stpreamble}
-% Striking out is just underlining with a raised line of a different
-% color. Hence we only need to define the preamble accordingly and
-% let the underlining preamble finally do its job. Not that colored
-% overstriking was especially useful, but we want at least to keep
-% it black while we might want to set underlines in some fancy color.
-%
-% \begin{macrocode}
-\def\SOUL@stpreamble{%
- \dimen@\SOUL@ulthickness
- \dimen@i=-.5ex
- \advance\dimen@i-.5\dimen@
- \edef\SOUL@uldepth{\the\dimen@i}%
- \let\SOUL@ulcolor\SOUL@stcolor
- \SOUL@ulpreamble
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@stsetup}
-% We re-use the whole underlining setup and just replace the preamble
-% with our modified version.
-%
-% \begin{macrocode}
-\def\SOUL@stsetup{%
- \SOUL@ulsetup
- \let\SOUL@preamble\SOUL@stpreamble
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\textst}
-% These pretzels are making me thirsty \dots
-%
-% \begin{macrocode}
-\DeclareRobustCommand*\textst{\SOUL@stsetup\SOUL@}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@stcolor}
-% \begin{macro}{\setstcolor}
-% Set the overstriking color. This won't be used often, but is required
-% in cases, where the underlines are colored. You wouldn't want to
-% overstrike in the same color. Note that overstriking lines are
-% drawn \emph{beneath} the text, hence bright colors won't look good.
-%
-% \begin{macrocode}
-\let\SOUL@stcolor\relax
-\def\setstcolor#1{%
- \if$#1$
- \let\SOUL@stcolor\relax
- \else
- \def\SOUL@stcolor{\textcolor{#1}}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The highlighting driver}
-%
-% \begin{macro}{\SOUL@hlpreamble}
-% This is nothing else than overstriking with very thick lines.
-%
-% \begin{macrocode}
-\def\SOUL@hlpreamble{%
- \setul{}{2.5ex}%
- \let\SOUL@stcolor\SOUL@hlcolor
- \SOUL@stpreamble
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@hlsetup}
-% No need to re-invent the wheel. Just use the overstriking setup
-% with a different preamble.
-%
-% \begin{macrocode}
-\def\SOUL@hlsetup{%
- \SOUL@stsetup
- \let\SOUL@preamble\SOUL@hlpreamble
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\texthl}
-% \begin{macro}{\sethlcolor}
-% \begin{macro}{\SOUL@hlcolor}
-% Define the highlighting macro and the color setting macro with a
-% simple default color. Yellow isn't really pleasing, but it's already
-% predefined by the \package{color} package.
-%
-% \begin{macrocode}
-\DeclareRobustCommand*\texthl{\SOUL@hlsetup\SOUL@}
-\def\sethlcolor#1{\if$#1$\else\def\SOUL@hlcolor{\textcolor{#1}}\fi}
-\sethlcolor{yellow}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection*{The package postamble}
-%
-% \begin{macro}{\so}
-% \begin{macro}{\ul}
-% \begin{macro}{\st}
-% \begin{macro}{\hl}
-% \begin{macro}{\caps}
-% OK, I lied. The short macro names are just abbreviations for their
-% longer counterpart. Some people might be used to |\text*| style commands
-% to select a certain font. And then it doesn't hurt to reserve
-% these early enough.
-%
-% \begin{macrocode}
-\let\so\textso
-\let\ul\textul
-\let\st\textst
-\let\hl\texthl
-\let\caps\textcaps
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \noindent
-% When used in an environment other than \LaTeX\ and the \package{german}
-% package was already loaded, define the double quotes as accent.
-%
-% \begin{macrocode}
-\ifx\documentclass\@undefined
- \ifx\mdqoff\@undefined
- \else
- \soulaccent{"}%
- \fi
- \catcode`\@=\atcode
-% \end{macrocode}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \noindent
-% If we have been loaded by a \LaTeX\ environment and the \package{color}
-% package wasn't also loaded, we disable all colors. Then we add the umlaut accent
-% |"| if the \package{german} package is present. The quotes character has to
-% be \cs{\catcode}'d \cs{\active} now, or it won't get recognized later.
-% The \option{capsdefault}
-% option overrides the \cs{\caps} driver and lets \cs{\SOUL@} set an underline.
-% Finally load the local configuration, process the |capsdefault|
-% option and exit.
-%
-% \begin{macrocode}
-\else
- \bgroup
- \catcode`\"\active
- \AtBeginDocument{%
- \@ifundefined{color}{%
- \let\SOUL@color\relax
- \let\setulcolor\@gobble
- \let\setstcolor\@gobble
- \let\sethlcolor\@gobble
- \let\hl\ul
- }{}
- \@ifundefined{mdqoff}{}{\soulaccent{"}}
- }
- \egroup
- \DeclareOption{capsdefault}{%
- \AtBeginDocument{%
- \def\SOUL@capsdfltfnt#1{%
- \SOUL@ulsetup
- \SOUL@ulpreamble
- \scshape
- }%
- }%
- }
- \InputIfFileExists{soul.cfg}%
- {\PackageInfo{soul}{Local config file soul.cfg used}}{}
- \ProcessOptions
-\fi
-\endinput
-% \end{macrocode}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \vspace{2explus1fill}
-%\begin{verbatim}
-%$Id: soul.dtx,v 1.128 2003/11/17 22:57:24 m Rel $
-%\end{verbatim}
-% \Finale
-%
-%
-% ^^A.E.I.O.U.^^
-%^^A vim:ts=4:sw=4:et
diff --git a/Master/texmf-dist/source/latex/soul/soul.ins b/Master/texmf-dist/source/latex/soul/soul.ins
deleted file mode 100644
index 451343f7dff..00000000000
--- a/Master/texmf-dist/source/latex/soul/soul.ins
+++ /dev/null
@@ -1,10 +0,0 @@
-%% LaTeX2e file `soul.ins'
-%% generated by the `filecontents' environment
-%% from source `soul' on 2003/11/17.
-%%
-\def\batchfile{soul.ins}
-\input docstrip.tex
-\askforoverwritefalse
-\keepsilent % <-- this is for you, Christina ;-)
-\generate{\file{soul.sty}{\from{soul.dtx}{package}}}
-\endbatchfile
diff --git a/Master/texmf-dist/source/latex/spacingtricks/spacingtricks.dtx b/Master/texmf-dist/source/latex/spacingtricks/spacingtricks.dtx
index 698b64dcb3f..3c22a98a8aa 100644
--- a/Master/texmf-dist/source/latex/spacingtricks/spacingtricks.dtx
+++ b/Master/texmf-dist/source/latex/spacingtricks/spacingtricks.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2019 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+% Copyright (C) 2019-2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
%
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3 of this license
@@ -20,7 +20,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2005/12/01]
\ProvidesPackage{spacingtricks}
- [2019/09/09 v1.2 .dtx spacingtricks file]
+ [2020/11/02 v1.3 .dtx spacingtricks file]
%</package>
%<*driver>
\documentclass{ltxdoc}
@@ -54,7 +54,7 @@
%</driver>
% \fi
%
-% \CheckSum{905}
+% \CheckSum{165}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -78,20 +78,21 @@
% \changes{v1.0}{2019/06/16}{English translation of the documentation}
% \changes{v1.1}{2019/09/06}{No automatic line breaking at the end of the centered command,
% new length compactitemlist}
-% \changes{v1.2}{2019/09/09}{Removing par command to get the expected centered macro}
+% \changes{v1.2}{2019/09/09}{A bug correction in the last update}
+% \changes{v1.3}{2020/11/02}{Loading the setspace package,
+% small changes in compactlist environment, improvement in dualboxes macro}
%
% \GetFileInfo{spacingtricks.sty}
%
% \title{The \texttt{spacingtricks} package\thanks{This document
% corresponds to \textsf{spacingtricks}~\fileversion, dated \filedate.}}
% \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}}
-% \date{September 09, 2019}
+% \date{November 02, 2020}
% \maketitle
%
% \section{Introduction}
%
-% This package proposes some macros to deal with spacing issues. Thus:
-%
+% This package offers some macros to deal with spacing issues. Thus:
% \begin{compactlist}
% \item "\centered" yields good horizontal centering without vertical spacing;
% \item "\footnote" has been redefined to avoid unsuitable spacings;
@@ -109,15 +110,18 @@
% (figures, tables, text) side by side by adjusting the vertical positioning.
% \end{compactlist}
%
+% \medskip
+% Two other common packages are loaded by \textsf{spacingtricks}:
+% \textsf{setspace} (natively in \LaTeXe),
+% for setting line spacing in a piece of text
+% (with the \texttt{spacing} environment), and
+% \textsf{xspace}~\cite{XSP}, which adds an interword space unless the macro
+% is followed by a punctuation character.
+%
% Otherwise, we provide the package \textsf{arraycols}~\cite{ARCOL},
% wich allows a good management of spacings in \texttt{tabular} and \texttt{array} environments,
% and \textsf{mismath}~\cite{MSMATH} of which several macros tends to improve spacings
% in mathematical formulas.
-% Let us mention also the \textsf{setspace} package (natively in \LaTeXe),
-% which allows to set the space between the lines of text, and
-% at last \textsf{xspace}~\cite{XSP},
-% which is loaded by \textsf{spacingtricks}: it adds a space unless the macro
-% is followed by certain punctuation characters.
%
% \section{Usage}
%
@@ -380,7 +384,7 @@
%
% \medskip
% \DescribeMacro{\compactlistindent}
-% This length (fixed at 1\,em by default) can be modified with "\setlength" to increase
+% This length (fixed at 0.5\,em by default) can be modified with "\setlength" to increase
% or decrease the indentation of the \texttt{compactlist} environment.
% Notice that there are several other ways to construct a compact list in particular
% with the \texttt{noitemsep} key of the \textsf{enumitem} package~\cite{ENUM}.
@@ -411,11 +415,11 @@
% (for several paragraphs and lists), etc.
% The optional \meta{pos} parameter sets the vertical level on which the boxes are aligned:
% a number between 0 (bottom) and 1 (top, default value).
-% Here is a first example with "\dualboxes[0.7]".
+% Here is a first example with "\dualboxes[0.65]".
%
% \medskip
% \psset{xunit=0.5cm,yunit=1.0cm,algebraic=true}
-% \dualboxes[0.7]{\footnotesize
+% \dualboxes[0.65]{\footnotesize
% $\begin{array}{|*{7}{c|}} \hline
% x & -2 & -1 & 0 & 1 & 2 & 3 \\ \hline
% f(x) & -0.96 & -0.71 & 0 & 0.59 & 0.38 & 0.18 \\ \hline
@@ -485,9 +489,13 @@
% within "\dualboxes" arguments,
% just as it's not possible for footnotes or margin notes.
%
+% \StopEventually{}
+%
% \section{Implementation}
% \begin{macrocode}
\RequirePackage{ifthen}
+\RequirePackage{calc}
+\RequirePackage{setspace}
\RequirePackage{xspace}
\newcommand*{\centered}[1]{{\setlength{\parskip}{0pt}\par\noindent\hfill
@@ -535,8 +543,9 @@
}{\end{list}}
\newlength{\compactlistindent}
-\setlength{\compactlistindent}{1em}
+\setlength{\compactlistindent}{0.5em}
\newenvironment*{compactlist}[1][\textbullet]{
+ \par % sometimes necessary
\begin{list}{#1\unskip}{% \unskip suppresses the space created by \xspace
\setlength{\itemsep}{0pt}
\setlength{\parsep}{0pt}
@@ -567,13 +576,13 @@
\newcommand{\@@dualboxes}[3][1]{
\par\noindent
- \raisebox{-#1\height}{#2} \hfill
- \raisebox{-#1\height}{#3} \smallskip
+ \raisebox{\depth-#1\totalheight}{#2} \hfill
+ \raisebox{\depth-#1\totalheight}{#3} \smallskip
}
\newcommand{\@dualboxes}[3][1]{
\par\noindent \hfill
- \raisebox{-#1\height}{#2} \hfill
- \raisebox{-#1\height}{#3} \hfill\mbox{}\smallskip
+ \raisebox{\depth-#1\totalheight}{#2} \hfill
+ \raisebox{\depth-#1\totalheight}{#3} \hfill\mbox{}\smallskip
}
\newcommand{\dualboxes}{\@ifstar{\@@dualboxes}{\@dualboxes}}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/spacingtricks/spacingtricks.ins b/Master/texmf-dist/source/latex/spacingtricks/spacingtricks.ins
index 9a5c670e8c6..28f889e0f1b 100644
--- a/Master/texmf-dist/source/latex/spacingtricks/spacingtricks.ins
+++ b/Master/texmf-dist/source/latex/spacingtricks/spacingtricks.ins
@@ -1,5 +1,5 @@
%%
-%% Copyright (C) 2019 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+%% Copyright (C) 2019-2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
%%
%% This file may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License, either version 1.3 of this license
@@ -21,7 +21,7 @@
This is a generated file.
-Copyright (C) 2019 by Antoine Missier <antoine.missier@ac-toulouse.fr>
+Copyright (C) 2019-2020 by Antoine Missier <antoine.missier@ac-toulouse.fr>
This file may be distributed and/or modified under the conditions of
the LaTeX Project Public License, either version 1.3 of this license
diff --git a/Master/texmf-dist/source/latex/spath3/spath3.dtx b/Master/texmf-dist/source/latex/spath3/spath3.dtx
deleted file mode 100644
index 9d6ae2825df..00000000000
--- a/Master/texmf-dist/source/latex/spath3/spath3.dtx
+++ /dev/null
@@ -1,4228 +0,0 @@
-% \iffalse meta-comment
-%<*internal>
-\iffalse
-%</internal>
-%<*readme>
-----------------------------------------------------------------
-spath3 --- LaTeX3 functions for manipulating PGF soft paths
-E-mail: stacey@math.ntnu.no
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
-This package defines some functions used to manipulate PGFs soft paths.
-As applications of its use, included are a package for drawing calligraphic paths and a package for drawing knot diagrams.
-%</readme>
-%<*internal>
-\fi
-\def\nameofplainTeX{plain}
-\ifx\fmtname\nameofplainTeX\else
- \expandafter\begingroup
-\fi
-%</internal>
-%<*install>
-\input docstrip.tex
-\keepsilent
-\askforoverwritefalse
-\preamble
-----------------------------------------------------------------
-spath3 --- Functions for manipulating PGF soft paths
-E-mail: stacey@math.ntnu.no
-Released under the LaTeX Project Public License v1.3c or later
-See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------
-
-\endpreamble
-\postamble
-
-Copyright (C) 2011-2019 by Andrew Stacey <stacey@math.ntnu.no>
-
-This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License (LPPL), either
-version 1.3c of this license or (at your option) any later
-version. The latest version of this license is in the file:
-
-http://www.latex-project.org/lppl.txt
-
-This work is "maintained" (as per LPPL maintenance status) by
-Andrew Stacey.
-
-This work consists of the files spath3.dtx
- calligraphy_doc.tex
- knots_doc.tex
-and the derived files spath3.ins,
- spath3_code.pdf,
- spath3.sty,
- tikzlibrarycalligraphy.code.tex
- tikzlibraryknots.code.tex
- calligraphy.pdf
- knots.pdf
- README
-
-\endpostamble
-\usedir{tex/latex/spath3}
-\generate{
- \file{\jobname.sty}{\from{\jobname.dtx}{spath3}}
-}
-\generate{
- \file{tikzlibrarycalligraphy.code.tex}{\from{\jobname.dtx}{calligraphy}}
-}
-\generate{
- \file{tikzlibraryknots.code.tex}{\from{\jobname.dtx}{knots}}
-}
-%</install>
-%<install>\endbatchfile
-%<*internal>
-\usedir{source/latex/spath3}
-\generate{
- \file{\jobname.ins}{\from{\jobname.dtx}{install}}
-}
-\nopreamble\nopostamble
-\usedir{doc/latex/demopkg}
-\generate{
- \file{README.txt}{\from{\jobname.dtx}{readme}}
-}
-\ifx\fmtname\nameofplainTeX
- \expandafter\endbatchfile
-\else
- \expandafter\endgroup
-\fi
-%</internal>
-%<*driver>
-\documentclass[full]{l3doc}
-\usepackage[T1]{fontenc}
-\usepackage{lmodern}
-%\usepackage{morefloats}
-\usepackage{tikz}
-\usepackage{trace}
-\usepackage{spath3}
-%\traceoff
-%\usepackage[numbered]{hypdoc}
-\definecolor{lstbgcolor}{rgb}{0.9,0.9,0.9}
-
-\usepackage{listings}
-\lstloadlanguages{[LaTeX]TeX}
-\lstset{breakatwhitespace=true,breaklines=true,language=TeX}
-
-\usepackage{fancyvrb}
-
-\newenvironment{example}
- {\VerbatimEnvironment
- \begin{VerbatimOut}[gobble=2]{example.out}}
- {\end{VerbatimOut}
- \begin{center}
-% \setlength{\parindent}{0pt}
- \fbox{\begin{minipage}{.9\linewidth}
- \lstset{breakatwhitespace=true,breaklines=true,language=TeX,basicstyle=\small}
- \lstinputlisting[]{example.out}
- \end{minipage}}
-
- \fbox{\begin{minipage}{.9\linewidth}
- \input{example.out}
- \end{minipage}}
-\end{center}
-}
-\EnableCrossrefs
-\CodelineIndex
-\RecordChanges
-\begin{document}
- \DocInput{\jobname.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \CheckSum{4488}
-%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
-%
-%
-% \changes{1.0}{2011/05/03}{Converted to DTX file}
-% \changes{1.1}{2016/02/19}{Fixes due to changes in LaTeX3}
-% \changes{1.2}{2019/02/12}{More fixes due to changes in LaTeX3}
-%
-% \DoNotIndex{\newcommand,\newenvironment}
-%
-% \providecommand*{\url}{\texttt}
-% \GetFileInfo{spath3.sty}
-% \title{The \textsf{spath3} package}
-% \author{Andrew Stacey \\ \url{stacey@math.ntnu.no}}
-% \date{\fileversion~from \filedate}
-%
-%
-% \maketitle
-%
-%
-% \section{Introduction}
-%
-% The \Verb+spath3+ package is intended as a library for manipulating PGF's \emph{soft paths}.
-% In between defining a path and using it, PGF stores a path as a \emph{soft path} where all the defining structure has been resolved into the basic operations but these have not yet been written to the output file.
-% They can therefore still be manipulated by \TeX, and as they have a very rigid form (and limited vocabulary), they are relatively easy to modify.
-% This package provides some methods for working with these paths.
-% It is not really intended for use by end users but as a foundation on which other packages can be built.
-% As examples, the \Verb+calligraphy+ package and the \Verb+knot+ package are included.
-% The first of these simulates a calligraphic pen stroking a path.
-% The second can be used to draw knot (and similar) diagrams.
-%
-% The format of a soft path is a sequence of triples of the form \Verb+\macro {dimension}{dimension}+.
-% The macro is one of a short list, the dimensions are coordinates in points.
-% There are certain further restrictions, particularly that every path must begin with a \Verb+move to+, and B\'ezier curves consist of three triples.
-%
-% \StopEventually{}
-%
-% \section{Implementation}
-%
-% \iffalse
-%<*spath3>
-% \fi
-% \subsection{Initialisation}
-%
-% Load the \LaTeX3 foundation and register us as a \LaTeX3\ package.
-% \begin{macrocode}
-\NeedsTeXFormat{LaTeX2e}
-\RequirePackage{expl3}
-\RequirePackage{pgf}
-\ProvidesExplPackage {spath3} {2019/02/12} {1.2} {Functions for
-manipulating PGF soft paths}
-\RequirePackage{xparse}
-% \end{macrocode}
-%
-% We need a slew of temporary variables.
-% \begin{macrocode}
-\tl_new:N \l__spath_tmpa_tl
-\tl_new:N \l__spath_tmpb_tl
-\tl_new:N \l__spath_tmpc_tl
-\tl_new:N \l__spath_tmpd_tl
-\tl_new:N \l__spath_smuggle_tl
-\dim_new:N \l__spath_tmpa_dim
-\dim_new:N \l__spath_tmpb_dim
-\fp_new:N \l__spath_tmpa_fp
-\fp_new:N \l__spath_tmpb_fp
-\int_new:N \l__spath_tmpa_int
-\int_new:N \g__spath_map_int
-% \end{macrocode}
-%
-% We need to be able to compare against the macros that can occur in a soft path so these token lists contain them.
-% \begin{macrocode}
-\tl_new:N \g__spath_moveto_tl
-\tl_new:N \g__spath_lineto_tl
-\tl_new:N \g__spath_curveto_tl
-\tl_new:N \g__spath_curvetoa_tl
-\tl_new:N \g__spath_curvetob_tl
-\tl_new:N \g__spath_closepath_tl
-\tl_set:Nn \g__spath_moveto_tl {\pgfsyssoftpath@movetotoken}
-\tl_set:Nn \g__spath_lineto_tl {\pgfsyssoftpath@linetotoken}
-\tl_set:Nn \g__spath_curveto_tl {\pgfsyssoftpath@curvetotoken}
-\tl_set:Nn \g__spath_curvetoa_tl {\pgfsyssoftpath@curvetosupportatoken}
-\tl_set:Nn \g__spath_curvetob_tl {\pgfsyssoftpath@curvetosupportbtoken}
-\tl_set:Nn \g__spath_closepath_tl {\pgfsyssoftpath@closepathtoken}
-% \end{macrocode}
-%
-% \subsection{Basic Structure and Methods}
-%
-% A soft path is a \Verb+prop+.
-% These are lists of the attributes that we define.
-% The first consists of all attributes, the second of those that are ``moveable'' in the sense that they change if we transform the path, the third are the ones that contain actual paths.
-%
-% Note that if using these attributes outside an \Verb+expl3+ context, the spaces should be omitted.
-% \begin{macrocode}
-\tl_new:N \g__spath_attributes
-\tl_new:N \g__spath_moveable_attributes
-\tl_new:N \g__spath_path_attributes
-\tl_set:Nn \g__spath_attributes {
- {path}
- {reverse path}
- {length}
- {real length}
- {number of components}
- {initial point}
- {final point}
- {initial action}
- {final action}
- {min bb}
- {max bb}
-}
-\tl_set:Nn \g__spath_moveable_attributes {
- {initial point}
- {final point}
- {min bb}
- {max bb}
-}
-\tl_set:Nn \g__spath_path_attributes {
- {path}
- {reverse path}
-}
-% \end{macrocode}
-%
-% An \Verb+spath+ object is actually a \Verb+prop+.
-% The following functions are wrappers around the underlying \Verb+prop+ functions.
-% We prefix the names to avoid clashing with other \Verb+prop+s that might be lying around, this is why all the \Verb+spath+ methods take argument \Verb+:n+ and not \Verb+:N+.
-% Given that \Verb+spath+ objects might be created inside a group but used outside it, we work globally throughout.
-% \begin{macro}{\spath_new:n}
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_new:n #1
-{
- \prop_new:c {l__spath_#1}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_clear:n}
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_clear:n #1
-{
- \prop_gclear:c {l__spath_#1}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_clear_new:n}
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_clear_new:n #1
-{
- \prop_gclear_new:c {l__spath_#1}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_show:n}
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_show:n #1
-{
- \prop_show:c {l__spath_#1}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_put:nnn}
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_put:nnn #1#2#3
-{
- \prop_gput:cnn {l__spath_#1} {#2} {#3}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_remove:nn}
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_remove:nn #1#2
-{
- \prop_gremove:cn {l__spath_#1} {#2}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\__spath_get:nn}
-% This function is an internal one since the real \Verb+get+ function will generate its data if it does not already exist.
-% \begin{macrocode}
-\cs_new_nopar:Npn \__spath_get:nn #1#2
-{
- \prop_item:cn {l__spath_#1} {#2}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\__spath_get:nnN}
-% \begin{macrocode}
-\cs_new_nopar:Npn \__spath_get:nnN #1#2#3
-{
- \prop_get:cnN {l__spath_#1} {#2} #3
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_if_in:nn}
-% \begin{macrocode}
-\prg_new_conditional:Npnn \spath_if_in:nn #1#2 {p, T, F, TF}
-{
- \prop_if_in:cnTF {l__spath_#1} {#2}
- { \prg_return_true: }
- { \prg_return_false: }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\__spath_get:nnN}
-% \begin{macrocode}
-\cs_generate_variant:Nn \__prop_split:NnTF {cnTF}
-\prg_new_protected_conditional:Npnn \__spath_get:nnN #1#2#3 {T, F, TF}
-{
- \__prop_split:cnTF {l__spath_#1} {#2}
- {
- \tl_set:Nn #3 {##2}
- \prg_return_true:
- }
- { \prg_return_false: }
-}
-\cs_generate_variant:Nn \spath_put:nnn {nnV, nnx, nno}
-\cs_generate_variant:Nn \__spath_get:nn {Vn}
-\cs_generate_variant:Nn \__spath_get:nnN {VnN}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_if_exist:n}
-% \begin{macrocode}
-\prg_new_conditional:Npnn \spath_if_exist:n #1 {p,T,F,TF}
-{
- \prop_if_exist:cTF {l__spath_#1}
- {
- \prg_return_true:
- }
- {
- \prg_return_false:
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_clone:nn}
-% Clones an \Verb+spath+.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_clone:nn #1 #2
-{
- \spath_clear_new:n {#2}
- \tl_map_inline:Nn \g__spath_attributes
- {
- \spath_if_in:nnT {#1} {##1}
- {
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
- \spath_put:nnV {#2} {##1} \l__spath_tmpa_tl
- }
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_get_current_path:n}
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \spath_get_current_path:n #1
-{
- \pgfsyssoftpath@getcurrentpath\l__spath_tmpa_tl
- \spath_clear_new:n {#1}
- \spath_put:nnV {#1} {path} \l__spath_tmpa_tl
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_set_current_path:n}
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \spath_set_current_path:n #1
-{
- \spath_get:nnN {#1} {min bb} \l__spath_tmpa_tl
- \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl
-
- \spath_get:nnN {#1} {max bb} \l__spath_tmpa_tl
- \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl
-
- \spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \pgfsyssoftpath@setcurrentpath\l__spath_tmpa_tl
- \pgfsyssoftpath@flushcurrentpath
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_use_path:nn}
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \spath_use_path:nn #1#2
-{
- \spath_set_current_path:n {#1}
- \pgfusepath{#2}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_protocol_path:n}
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \spath_protocol_path:n #1
-{
- \spath_get:nnN {#1} {min bb} \l__spath_tmpa_tl
- \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl
-
- \spath_get:nnN {#1} {max bb} \l__spath_tmpa_tl
- \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_tikz_path:nn}
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \spath_tikz_path:nn #1#2
-{
- \path[#1] \pgfextra{
- \spath_get:nnN {#2} {path} \l__spath_tmpa_tl
- \pgfsyssoftpath@setcurrentpath \l__spath_tmpa_tl
- };
-}
-\cs_generate_variant:Nn \spath_tikz_path:nn {Vn}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Computing Information}
-%
-% \begin{macro}{\spath_get:nn}
-% The information that we store along with a soft path can be computed from it, but computing it every time is wasteful.
-% So this is the real \Verb+\spath_get:nn+ function which checks to see if we have already computed it and then either retrieves it or computes it.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_get:nn #1#2
-{
- \spath_if_in:nnF {#1} {#2}
- {
- \cs_if_exist_use:cT {spath_generate_#2:n} {{#1}}
- }
- \__spath_get:nn {#1} {#2}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_get:nnN}
-% As above but leaves the result in a token list rather than in the stream.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_get:nnN #1#2#3
-{
- \spath_if_in:nnF {#1} {#2}
- {
- \cs_if_exist_use:cT {spath_generate_#2:n} {{#1}}
- }
- \__spath_get:nnN {#1} {#2} #3
-}
-\cs_generate_variant:Nn \spath_get:nnN {VnN}
-% \end{macrocode}
-% \end{macro}
-%
-% The next slew of functions generate data from the original path, storing it in the \Verb+prop+ for further retrieval.
-% \begin{macro}{\spath_generate_length:n}
-% Counts the number of triples in the path.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_generate_length:n #1
-{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \spath_put:nnx {#1} {length} {\int_eval:n {\tl_count:N \l__spath_tmpa_tl /3 }}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_generate_reallength:n}
-% The real length of a path is the number of triples that actually draw something (that is, the number of lines and curves).
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_generate_reallength:n #1
-{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \int_set:Nn \l__spath_tmpa_int {0}
- \tl_map_inline:Nn \l__spath_tmpa_tl {
- \tl_if_eq:nnT {##1} {\pgfsyssoftpath@linetotoken}
- {
- \int_incr:N \l__spath_tmpa_int
- }
- \tl_if_eq:nnT {##1} {\pgfsyssoftpath@curvetotoken}
- {
- \int_incr:N \l__spath_tmpa_int
- }
- }
- \spath_put:nnx {#1} {real length} {\int_use:N \l__spath_tmpa_int}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_generate_numberofcomponents:n}
-% A component is a continuous segment of the path, separated by moves.
-% Successive moves are not collapsed, and zero length moves count.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_generate_numberofcomponents:n #1
-{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \int_set:Nn \l__spath_tmpa_int {0}
- \tl_map_inline:Nn \l__spath_tmpa_tl {
- \tl_if_eq:nnT {##1} {\pgfsyssoftpath@movetotoken}
- {
- \int_incr:N \l__spath_tmpa_int
- }
- }
- \spath_put:nnx {#1} {number of components} {\int_use:N \l__spath_tmpa_int}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_generate_initialpoint:n}
-% The starting point of the path.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_generate_initialpoint:n #1
-{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \tl_clear:N \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \spath_put:nnV {#1} {initial point} \l__spath_tmpb_tl
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_generate_finalpoint:n}
-% The final point of the path.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_generate_finalpoint:n #1
-{
- \tl_clear:N \l__spath_tmpb_tl
- \spath_if_in:nnTF {#1} {reverse path}
- {
- \__spath_get:nnN {#1} {reverse path} \l__spath_tmpa_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- }
- {
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \tl_reverse:N \l__spath_tmpa_tl
- \tl_put_left:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_left:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- }
- \spath_put:nnV {#1} {final point} \l__spath_tmpb_tl
-}
-\cs_generate_variant:Nn \spath_generate_finalpoint:n {V}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_generate_reversepath:n}
-% This computes the reverse of the path.
-% TODO: handle closed paths, possibly rectangles.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_generate_reversepath:n #1
-{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \tl_clear:N \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_left:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
- }
- {
- \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nn \l__spath_tmpd_tl {}
- \tl_case:NnF \l__spath_tmpc_tl
- {
- \g__spath_moveto_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_moveto_tl }
- \g__spath_lineto_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_lineto_tl }
- \g__spath_curveto_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curvetoa_tl }
- \g__spath_curvetoa_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curveto_tl }
- \g__spath_curvetob_tl {\tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curvetob_tl }
- }
- {
- \tl_show:N \l__spath_tmpc_tl
- }
- \tl_put_left:NV \l__spath_tmpb_tl \l__spath_tmpd_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_left:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- }
- \tl_put_left:NV \l__spath_tmpb_tl \g__spath_moveto_tl
- \spath_put:nnV {#1} {reverse path} \l__spath_tmpb_tl
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_generate_initialaction:n}
-% This is the first thing that the path does (after the initial move).
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_generate_initialaction:n #1
-{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \tl_clear:N \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_if_empty:NF \l__spath_tmpa_tl {
- \tl_set:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
- }
- \spath_put:nnV {#1} {initial action} \l__spath_tmpb_tl
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_generate_final action:n}
-% This is the last thing that the path does.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_generate_finalaction:n #1
-{
- \tl_clear:N \l__spath_tmpb_tl
- \spath_if_in:nnTF {#1} {reverse path}
- {
- \__spath_get:nnN {#1} {reverse path} \l__spath_tmpa_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- }
- {
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \tl_reverse:N \l__spath_tmpa_tl
- }
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_if_empty:NF \l__spath_tmpa_tl {
- \tl_set:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
- }
- \tl_if_eq:NNT \l__spath_tmpa_tl \g__spath_curvetoa_tl
- {
- \tl_set_eq:NN \l__spath_tmpa_tl \g__spath_curveto_tl
- }
- \spath_put:nnV {#1} {final action} \l__spath_tmpb_tl
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_generate_minbb:n}
-% This computes the minimum (bottom left) of the bounding box of the path.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_generate_minbb:n #1
-{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
- }
- {
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpa_dim}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpb_dim}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- }
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- \spath_put:nnV {#1} {min bb} \l__spath_tmpb_tl
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_generate_max bb:n}
-% This computes the maximum (top right) of the bounding box of the path.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_generate_maxbb:n #1
-{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
- }
- {
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpa_dim {\dim_max:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpa_dim}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_max:nn {\tl_head:N \l__spath_tmpa_tl} {\l__spath_tmpb_dim}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- }
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- \spath_put:nnV {#1} {max bb} \l__spath_tmpb_tl
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_generate_all:n}
-% This function generates all of the data in one fell swoop.
-% By traversing the path just once it is quicker than doing each one individually.
-% However, it does need to store a lot of data as it goes.
-% \begin{itemize}
-% \item \Verb+\l__spath_rp_tl+ will hold the reversed path
-% \item \Verb+\l__spath_l_int+ will hold the length
-% \item \Verb+\l__spath_rl_int+ will hold the real length
-% \item \Verb+\l__spath_nc_int+ will hold the number of components
-% \item \Verb+\l__spath_ip_tl+ will hold the initial point
-% \item \Verb+\l__spath_fp_tl+ will hold the final point
-% \item \Verb+\l__spath_ia_tl+ will hold the initial action
-% \item \Verb+\l__spath_fa_tl+ will hold the final action
-% \item \Verb+\l__spath_minx_dim+ will hold the min x bb
-% \item \Verb+\l__spath_miny_dim+ will hold the min y bb
-% \item \Verb+\l__spath_maxx_dim+ will hold the max x bb
-% \item \Verb+\l__spath_maxy_dim+ will hold the max y bb
-% \end{itemize}
-% \begin{macrocode}
-\tl_new:N \l__spath_rp_tl
-\int_new:N \l__spath_l_int
-\int_new:N \l__spath_rl_int
-\int_new:N \l__spath_nc_int
-\tl_new:N \l__spath_ip_tl
-\tl_new:N \l__spath_fp_tl
-\tl_new:N \l__spath_ia_tl
-\tl_new:N \l__spath_fa_tl
-\dim_new:N \l__spath_minx_dim
-\dim_new:N \l__spath_miny_dim
-\dim_new:N \l__spath_maxx_dim
-\dim_new:N \l__spath_maxy_dim
-
-\cs_new_nopar:Npn \spath_generate_all:n #1
-{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
-
- \tl_clear:N \l__spath_rp_tl
- \int_set:Nn \l__spath_l_int {1}
- \int_zero:N \l__spath_rl_int
- \int_set:Nn \l__spath_nc_int {1}
- \tl_clear:N \l__spath_ip_tl
- \tl_clear:N \l__spath_fp_tl
- \tl_clear:N \l__spath_ia_tl
- \tl_clear:N \l__spath_fa_tl
- \dim_zero:N \l__spath_minx_dim
- \dim_zero:N \l__spath_miny_dim
- \dim_zero:N \l__spath_maxx_dim
- \dim_zero:N \l__spath_maxy_dim
-
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \tl_clear:N \l__spath_ip_tl
- \tl_put_right:Nx \l__spath_ip_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
-
- \dim_set_eq:NN \l__spath_minx_dim \l__spath_tmpa_dim
- \dim_set_eq:NN \l__spath_miny_dim \l__spath_tmpb_dim
- \dim_set_eq:NN \l__spath_maxx_dim \l__spath_tmpa_dim
- \dim_set_eq:NN \l__spath_maxy_dim \l__spath_tmpb_dim
-
- \tl_put_left:Nx \l__spath_rp_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
-
- \tl_set:Nx \l__spath_ia_tl {\tl_head:N \l__spath_tmpa_tl}
-
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
- }
- {
- \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nn \l__spath_tmpd_tl {}
- \tl_set_eq:NN \l__spath_fa_tl \l__spath_tmpc_tl
- \int_incr:N \l__spath_l_int
-
- \tl_case:NnF \l__spath_tmpc_tl
- {
- \g__spath_moveto_tl {
- \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_moveto_tl
- \int_incr:N \l__spath_nc_int
- }
- \g__spath_lineto_tl {
- \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_lineto_tl
- \int_incr:N \l__spath_rl_int
- }
- \g__spath_curveto_tl {
- \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curvetoa_tl
- \int_incr:N \l__spath_rl_int
- }
- \g__spath_curvetoa_tl {
- \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curveto_tl
- }
- \g__spath_curvetob_tl {
- \tl_set_eq:NN \l__spath_tmpd_tl \g__spath_curvetob_tl
- }
- }
- {
- \tl_show:N \l__spath_tmpc_tl
- }
- \tl_put_left:NV \l__spath_rp_tl \l__spath_tmpd_tl
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \dim_set:Nn \l__spath_minx_dim {\dim_min:nn { \l__spath_minx_dim} {\l__spath_tmpa_dim}}
- \dim_set:Nn \l__spath_miny_dim {\dim_min:nn { \l__spath_miny_dim} {\l__spath_tmpb_dim}}
- \dim_set:Nn \l__spath_maxx_dim {\dim_max:nn { \l__spath_maxx_dim} {\l__spath_tmpa_dim}}
- \dim_set:Nn \l__spath_maxy_dim {\dim_max:nn { \l__spath_maxy_dim} {\l__spath_tmpb_dim}}
-
- \tl_put_left:Nx \l__spath_rp_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
-
- \tl_set:Nx \l__spath_fp_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
-
- }
-
- \tl_put_left:NV \l__spath_rp_tl \g__spath_moveto_tl
-
- \spath_put:nnV {#1} {reverse path} \l__spath_rp_tl
- \spath_put:nnV {#1} {length} \l__spath_l_int
- \spath_put:nnV {#1} {real length} \l__spath_rl_int
- \spath_put:nnV {#1} {number of components} \l__spath_nc_int
- \spath_put:nnV {#1} {initial point} \l__spath_ip_tl
- \spath_put:nnV {#1} {final point} \l__spath_fp_tl
- \spath_put:nnV {#1} {initial action} \l__spath_ia_tl
- \spath_put:nnV {#1} {final action} \l__spath_fa_tl
-
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_minx_dim}
- {\dim_use:N \l__spath_miny_dim}
- }
- \spath_put:nnV {#1} {min bb} \l__spath_tmpb_tl
-
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_maxx_dim}
- {\dim_use:N \l__spath_maxy_dim}
- }
- \spath_put:nnV {#1} {max bb} \l__spath_tmpb_tl
-
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Path Manipulation}
-%
-% \begin{macro}{\spath_translate:nnn}
-% Translates a path.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_translate:nnn #1#2#3
-{
- \tl_map_inline:Nn \g__spath_moveable_attributes
- {
- \spath_if_in:nnT {#1} {##1}
- {
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
-
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl + #2}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl + #3}
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl
- }
- }
- \tl_map_inline:Nn \g__spath_path_attributes
- {
- \spath_if_in:nnT {#1} {##1}
- {
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
- \tl_clear:N \l__spath_tmpb_tl
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
- }
- {
- \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl + #2}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl + #3}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- }
- \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl
- }
- }
-}
-
-\cs_generate_variant:Nn \spath_translate:nnn {nxx}
-% \end{macrocode}
-%
-% This variant allows for passing the coordinates as a single braced group as it strips off the outer braces of the second argument.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_translate:nn #1#2
-{
- \spath_translate:nnn {#1} #2
-}
-
-\cs_generate_variant:Nn \spath_translate:nn {nV}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_scale:nnn}
-% Scale a path.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_scale:nnn #1#2#3
-{
- \tl_map_inline:Nn \g__spath_moveable_attributes
- {
- \spath_if_in:nnT {#1} {##1}
- {
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
-
- \fp_set:Nn \l__spath_tmpa_fp {\tl_head:N \l__spath_tmpa_tl * #2}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \fp_set:Nn \l__spath_tmpb_fp {\tl_head:N \l__spath_tmpa_tl * #3}
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\fp_to_dim:N \l__spath_tmpa_fp}
- {\fp_to_dim:N \l__spath_tmpb_fp}
- }
- \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl
- }
- }
- \tl_map_inline:Nn \g__spath_path_attributes
- {
- \spath_if_in:nnT {#1} {##1}
- {
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
- \tl_clear:N \l__spath_tmpb_tl
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
- }
- {
- \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \fp_set:Nn \l__spath_tmpa_fp {\tl_head:N \l__spath_tmpa_tl * #2}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \fp_set:Nn \l__spath_tmpb_fp {\tl_head:N \l__spath_tmpa_tl * #3}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\fp_to_dim:N \l__spath_tmpa_fp}
- {\fp_to_dim:N \l__spath_tmpb_fp}
- }
- }
- \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl
- }
- }
-}
-\cs_generate_variant:Nn \spath_scale:nnn {nxx}
-% \end{macrocode}
-%
-% This variant allows for passing the coordinates as a single braced group as it strips off the outer braces of the second argument.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_scale:nn #1#2
-{
- \spath_scale:nnn {#1} #2
-}
-
-\cs_generate_variant:Nn \spath_scale:nn {nV}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_transform:nnnnnnn}
-% Applies an affine (matrix and vector) transformation to path.
-% The matrix is specified in rows first.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_transform:nnnnnnn #1#2#3#4#5#6#7
-{
- \tl_map_inline:Nn \g__spath_moveable_attributes
- {
- \spath_if_in:nnT {#1} {##1}
- {
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_head:N \l__spath_tmpa_tl}
- \fp_set:Nn \l__spath_tmpa_fp {\l__spath_tmpa_tl * #2 + \l__spath_tmpb_tl * #3 + #6}
- \fp_set:Nn \l__spath_tmpb_fp {\l__spath_tmpa_tl * #4 + \l__spath_tmpb_tl * #5 + #7}
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\fp_to_dim:N \l__spath_tmpa_fp}
- {\fp_to_dim:N \l__spath_tmpb_fp}
- }
- \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl
- }
- }
- \tl_map_inline:Nn \g__spath_path_attributes
- {
- \spath_if_in:nnT {#1} {##1}
- {
- \__spath_get:nnN {#1} {##1} \l__spath_tmpa_tl
- \tl_clear:N \l__spath_tmpb_tl
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
- }
- {
- \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_set:Nx \l_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \fp_set:Nn \l__spath_tmpa_fp {\l_tmpa_tl * #2 + \l_tmpb_tl * #3 + #6}
- \fp_set:Nn \l__spath_tmpb_fp {\l_tmpa_tl * #4 + \l_tmpb_tl * #5 + #7}
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\fp_to_dim:N \l__spath_tmpa_fp}
- {\fp_to_dim:N \l__spath_tmpb_fp}
- }
- }
- \spath_put:nnV {#1} {##1} \l__spath_tmpb_tl
- }
- }
-}
-
-\cs_generate_variant:Nn \spath_transform:nnnnnnn {nxxxxxx}
-% \end{macrocode}
-%
-% This variant allows for passing the coordinates as a single braced group as it strips off the outer braces of the second argument.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_transform:nn #1#2
-{
- \spath_transform:nnnnnnn {#1} #2
-}
-
-\cs_generate_variant:Nn \spath_transform:nn {nV}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_reverse:n}
-% This reverses a path.
-% As a lot of the data is invariant under reversing, there isn't a lot to do.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_reverse:n #1
-{
- \spath_if_in:nnF {#1} {reverse path} {
- \use:c {spath_generate_reverse path:n} {#1}
- }
- \spath_swap:nnn {#1} {path} {reverse path}
- \spath_swap:nnn {#1} {initial point} {final point}
- \spath_swap:nnn {#1} {initial action} {final action}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_swap:nnn}
-% Swaps two entries, being careful to ensure that their existence (or otherwise) is preserved.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_swap:nnn #1#2#3
-{
- \__spath_get:nnNF {#1} {#2} \l__spath_tmpa_tl {\tl_clear:N \l__spath_tmpa_tl}
- \__spath_get:nnNF {#1} {#3} \l__spath_tmpb_tl {\tl_clear:N \l__spath_tmpb_tl}
- \tl_if_empty:NTF \l__spath_tmpb_tl
- {\spath_remove:nn {#1} {#2}}
- {\spath_put:nnV {#1} {#2} \l__spath_tmpb_tl}
- \tl_if_empty:NTF \l__spath_tmpa_tl
- {\spath_remove:nn {#1} {#3}}
- {\spath_put:nnV {#1} {#3} \l__spath_tmpa_tl}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_weld:nn}
-% This welds one path to another, moving the second so that it's initial point coincides with the first's final point.
-% It is called a \emph{weld} because the initial move of the second path is removed.
-% The first path is updated, the second is not modified.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_weld:nn #1#2
-{
- \spath_clone:nn {#2} {tmp_path}
- \spath_get:nnN {#1} {final point} \l__spath_tmpa_tl
-
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
-
- \spath_get:nnN {#2} {initial point} \l__spath_tmpa_tl
-
- \dim_sub:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_sub:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
-
- \spath_translate:nxx {tmp_path} {\dim_use:N \l__spath_tmpa_dim} {\dim_use:N \l__spath_tmpb_dim}
-
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \__spath_get:nnN {tmp_path} {path} \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
-
- \spath_put:nnV {#1} {path} \l__spath_tmpa_tl
-
- \__spath_get:nnNTF {tmp_path} {final point} \l__spath_tmpa_tl
- {
- \spath_put:nnV {#1} {final point} \l__spath_tmpa_tl
- }
- {
- \spath_remove:nn {#1} {final point}
- }
-
- \__spath_get:nnNTF {tmp_path} {final action} \l__spath_tmpa_tl
- {
- \spath_put:nnV {#1} {final action} \l__spath_tmpa_tl
- }
- {
- \spath_remove:nn {#1} {final action}
- }
-
- \__spath_get:nnNT {tmp_path} {min bb} \l__spath_tmpa_tl
- {
- \__spath_get:nnNT {#1} {min bb} \l__spath_tmpb_tl
- {
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
-
- \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\l__spath_tmpa_dim} {\tl_head:N \l__spath_tmpb_tl}}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\l__spath_tmpb_dim} {\tl_head:N \l__spath_tmpb_tl}}
-
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- \spath_put:nnV {#1} {min bb} \l__spath_tmpb_tl
- }
- }
-
- \__spath_get:nnNT {tmp_path} {max bb} \l__spath_tmpa_tl
- {
- \__spath_get:nnNT {#1} {max bb} \l__spath_tmpb_tl
- {
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
-
- \dim_set:Nn \l__spath_tmpa_dim {\dim_max:nn {\l__spath_tmpa_dim} {\tl_head:N \l__spath_tmpb_tl}}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_max:nn {\l__spath_tmpb_dim} {\tl_head:N \l__spath_tmpb_tl}}
-
- \tl_clear:N \l__spath_tmpb_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- \spath_put:nnV {#1} {max bb} \l__spath_tmpb_tl
- }
- }
-
- \__spath_get:nnNT {tmp_path} {reverse path} \l__spath_tmpa_tl
- {
- \__spath_get:nnNT {#1} {reverse path} \l__spath_tmpb_tl
- {
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
-
- \spath_put:nnV {#1} {reverse path} \l__spath_tmpa_tl
- }
- }
-
- \__spath_get:nnNT {tmp_path} {length} \l__spath_tmpa_tl
- {
- \__spath_get:nnNT {#1} {length} \l__spath_tmpb_tl
- {
- \int_set:Nn \l__spath_tmpa_int {\l__spath_tmpa_tl + \l__spath_tmpb_tl - 1}
- \spath_put:nnV {#1} {length} \l__spath_tmpa_int
- }
- }
-
- \__spath_get:nnNT {tmp_path} {real length} \l__spath_tmpa_tl
- {
- \__spath_get:nnNT {#1} {real length} \l__spath_tmpb_tl
- {
- \int_set:Nn \l__spath_tmpa_int {\l__spath_tmpa_tl + \l__spath_tmpb_tl}
- \spath_put:nnV {#1} {real length} \l__spath_tmpa_int
- }
- }
-
- \__spath_get:nnNT {tmp_path} {number of components} \l__spath_tmpa_tl
- {
- \__spath_get:nnNT {#1} {number of components} \l__spath_tmpb_tl
- {
- \int_set:Nn \l__spath_tmpa_int {\l__spath_tmpa_tl + \l__spath_tmpb_tl - 1}
- \spath_put:nnV {#1} {number of components} \l__spath_tmpa_int
- }
- }
-
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_prepend_no_move:nn}
-% Prepend the path from the second \Verb+spath+ to the first, removing
-% the adjoining move.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_prepend_no_move:nn #1#2
-{
- \spath_if_exist:nT {#2}
- {
- \__spath_get:nnN {#2} {path} \l__spath_tmpa_tl
- \__spath_get:nnN {#1} {path} \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
- \spath_put:nnV {#1} {path} \l__spath_tmpa_tl
-
- \spath_if_in:nnTF {#2} {initial point}
- {
- \__spath_get:nnN {#2} {initial point} \l__spath_tmpa_tl
- \spath_put:nnV {#1} {initial point} \l__spath_tmpa_tl
- }
- {
- \spath_remove:nn {#1} {initial point}
- }
-
- \spath_if_in:nnTF {#2} {initial action}
- {
- \__spath_get:nnN {#2} {initial action} \l__spath_tmpa_tl
- \spath_put:nnV {#1} {initial action} \l__spath_tmpa_tl
- }
- {
- \spath_remove:nn {#1} {initial action}
- }
-
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {length}
- &&
- \spath_if_in_p:nn {#2} {length}
- }
- {
- \__spath_get:nnN {#1} {length} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {length} \l__spath_tmpb_tl
- \spath_put:nnx {#1} {length} {\int_eval:n {\l__spath_tmpa_tl +
- \l__spath_tmpb_tl - 1}}
- }
- {
- \spath_remove:nn {#1} {length}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {real length}
- &&
- \spath_if_in_p:nn {#2} {real length}
- }
- {
- \__spath_get:nnN {#1} {real length} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {real length} \l__spath_tmpb_tl
- \spath_put:nnx {#1} {real length} {\int_eval:n {\l__spath_tmpa_tl +
- \l__spath_tmpb_tl }}
- }
- {
- \spath_remove:nn {#1} {real length}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {number of components}
- &&
- \spath_if_in_p:nn {#2} {number of components}
- }
- {
- \__spath_get:nnN {#1} {number of components} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {number of components} \l__spath_tmpb_tl
- \spath_put:nnx {#1} {number of components} {\int_eval:n {\l__spath_tmpa_tl +
- \l__spath_tmpb_tl - 1}}
- }
- {
- \spath_remove:nn {#1} {number of components}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {min bb}
- &&
- \spath_if_in_p:nn {#2} {min bb}
- }
- {
- \__spath_get:nnN {#1} {min bb} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {min bb} \l__spath_tmpb_tl
- \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {1}} {\tl_item:Nn
- \l__spath_tmpb_tl {1}}}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {2}} {\tl_item:Nn
- \l__spath_tmpb_tl {2}}}
- \spath_put:nnx {#1} {min bb} {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- }
- {
- \spath_remove:nn {#1} {min bb}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {max bb}
- &&
- \spath_if_in_p:nn {#2} {max bb}
- }
- {
- \__spath_get:nnN {#1} {max bb} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {max bb} \l__spath_tmpb_tl
- \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {1}} {\tl_item:Nn
- \l__spath_tmpb_tl {1}}}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {2}} {\tl_item:Nn
- \l__spath_tmpb_tl {2}}}
- \spath_put:nnx {#1} {max bb} {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- }
- {
- \spath_remove:nn {#1} {max bb}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {reverse path}
- &&
- \spath_if_in_p:nn {#2} {reverse path}
- }
- {
- \__spath_get:nnN {#1} {reverse path} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {reverse path} \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
- \spath_put:nnV {#1} {reverse path} \l__spath_tmpb_tl
- }
- {
- \spath_remove:nn {#1} {reverse path}
- }
-
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_append_no_move:nn}
-% Append the path from the second \Verb+spath+ to the first, removing
-% the adjoining move.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_append_no_move:nn #1#2
-{
- \spath_if_exist:nT {#2}
- {
- \spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \spath_get:nnN {#2} {path} \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
- \spath_put:nnV {#1} {path} \l__spath_tmpa_tl
- \spath_if_in:nnTF {#2} {final point}
- {
- \__spath_get:nnN {#2} {final point} \l__spath_tmpa_tl
- \spath_put:nnV {#1} {final point} \l__spath_tmpa_tl
- }
- {
- \spath_remove:nn {#1} {final point}
- }
- \spath_if_in:nnTF {#2} {final action}
- {
- \__spath_get:nnN {#2} {final action} \l__spath_tmpa_tl
- \spath_put:nnV {#1} {final action} \l__spath_tmpa_tl
- }
- {
- \spath_remove:nn {#1} {final action}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {length}
- &&
- \spath_if_in_p:nn {#2} {length}
- }
- {
- \__spath_get:nnN {#1} {length} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {length} \l__spath_tmpb_tl
- \spath_put:nnx {#1} {length} {\int_eval:n {\l__spath_tmpa_tl +
- \l__spath_tmpb_tl - 1}}
- }
- {
- \spath_remove:nn {#1} {length}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {real length}
- &&
- \spath_if_in_p:nn {#2} {real length}
- }
- {
- \__spath_get:nnN {#1} {real length} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {real length} \l__spath_tmpb_tl
- \spath_put:nnx {#1} {real length} {\int_eval:n {\l__spath_tmpa_tl +
- \l__spath_tmpb_tl }}
- }
- {
- \spath_remove:nn {#1} {real length}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {number of components}
- &&
- \spath_if_in_p:nn {#2} {number of components}
- }
- {
- \__spath_get:nnN {#1} {number of components} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {number of components} \l__spath_tmpb_tl
- \spath_put:nnx {#1} {number of components} {\int_eval:n {\l__spath_tmpa_tl +
- \l__spath_tmpb_tl - 1}}
- }
- {
- \spath_remove:nn {#1} {number of components}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {min bb}
- &&
- \spath_if_in_p:nn {#2} {min bb}
- }
- {
- \__spath_get:nnN {#1} {min bb} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {min bb} \l__spath_tmpb_tl
- \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {1}} {\tl_item:Nn
- \l__spath_tmpb_tl {1}}}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {2}} {\tl_item:Nn
- \l__spath_tmpb_tl {2}}}
- \spath_put:nnx {#1} {min bb} {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- }
- {
- \spath_remove:nn {#1} {min bb}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {max bb}
- &&
- \spath_if_in_p:nn {#2} {max bb}
- }
- {
- \__spath_get:nnN {#1} {max bb} \l__spath_tmpa_tl
- \__spath_get:nnN {#2} {max bb} \l__spath_tmpb_tl
- \dim_set:Nn \l__spath_tmpa_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {1}} {\tl_item:Nn
- \l__spath_tmpb_tl {1}}}
- \dim_set:Nn \l__spath_tmpb_dim {\dim_min:nn {\tl_item:Nn
- \l__spath_tmpa_tl {2}} {\tl_item:Nn
- \l__spath_tmpb_tl {2}}}
- \spath_put:nnx {#1} {max bb} {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- }
- {
- \spath_remove:nn {#1} {max bb}
- }
- \bool_if:nTF
- {
- \spath_if_in_p:nn {#1} {reverse path}
- &&
- \spath_if_in_p:nn {#2} {reverse path}
- }
- {
- \__spath_get:nnN {#2} {reverse path} \l__spath_tmpa_tl
- \__spath_get:nnN {#1} {reverse path} \l__spath_tmpb_tl
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_set:Nx \l__spath_tmpb_tl {\tl_tail:N \l__spath_tmpb_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
- \spath_put:nnV {#1} {reverse path} \l__spath_tmpb_tl
- }
- {
- \spath_remove:nn {#1} {reverse path}
- }
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_bake_round:n}
-% Ought to clear the reverse path, if set.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_bake_round:n #1
-{
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \pgf@@processround\l__spath_tmpa_tl\l__spath_tmpb_tl
- \spath_put:nnV {#1} {path} \l__spath_tmpb_tl
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_close_path:n}
-% Appends a close path to the end of the path, and to the end of the reverse path.
-% For now, the point is the initial or final point (respectively).
-% To be future proof, it ought to be the point of the adjacent move to.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_close_path:n #1
-{
- \spath_get:nnN {#1} {initial point} \l__spath_tmpb_tl
- \__spath_get:nnN {#1} {path} \l__spath_tmpa_tl
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_closepath_tl
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
- \spath_put:nnV {#1} {path} \l__spath_tmpa_tl
- \spath_if_in:nnT {#1} {reverse path}
- {
- \spath_get:nnN {#1} {final point} \l__spath_tmpb_tl
- \__spath_get:nnN {#1} {reverse path} \l__spath_tmpa_tl
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_closepath_tl
- \tl_put_right:NV \l__spath_tmpa_tl \l__spath_tmpb_tl
- \spath_put:nnV {#1} {reverse path} \l__spath_tmpa_tl
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Iteration Functions}
-%
-% \begin{macro}{\spath_map_component:Nn}
-% This iterates through the components of a path, applying the inline function to each.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_map_component:Nn #1#2
-{
- \int_gincr:N \g__spath_map_int
- \cs_gset:cpn { __spath_map_ \int_use:N \g__spath_map_int :w } ##1 {#2}
- \tl_set:NV \l__spath_tmpa_tl #1
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_moveto_tl
- \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_moveto_tl
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
- }
- {
- \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_if_eq:NNT \l__spath_tmpc_tl \g__spath_moveto_tl
- {
- \exp_args:NnV \use:c { __spath_map_ \int_use:N \g__spath_map_int :w } \l__spath_tmpb_tl
-\tl_clear:N \l__spath_tmpb_tl
- }
- \tl_if_single:NTF \l__spath_tmpc_tl
- {
- \tl_put_right:NV \l__spath_tmpb_tl \l__spath_tmpc_tl
- }
- {
- \tl_put_right:Nx \l__spath_tmpb_tl {{\l__spath_tmpc_tl}}
- }
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_map_segment_inline:Nn}
-% This iterates through the segments of the path, applying the inline function to each.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_map_segment_inline:Nn #1#2
-{
- \int_gincr:N \g__spath_map_int
- \cs_gset:cpn { __spath_map_ \int_use:N \g__spath_map_int :w } ##1 ##2 {#2}
- \spath_map_segment_function:Nc #1 { __spath_map_ \int_use:N \g__spath_map_int :w }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_map_segment_inline:nn}
-% This iterates through the segments of the path of the \Verb+spath+ object, applying the inline function to each.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_map_segment_inline:nn #1#2
-{
- \int_gincr:N \g__spath_map_int
- \cs_gset:cpn { __spath_map_ \int_use:N \g__spath_map_int :w } ##1 ##2 {#2}
- \spath_get:nnN {#1} {path} \l__spath_tmpd_tl
- \spath_map_segment_function:Nc \l__spath_tmpd_tl { __spath_map_ \int_use:N \g__spath_map_int :w }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\spath_map_segment_function:nN}
-% This iterates through the segments of the path of the \Verb+spath+ object, applying the specified function to each.
-% The specified function should take two \Verb+N+ type arguments.
-% The first is a token representing the type of path segment, the second is the path segment itself.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_map_segment_function:nN #1#2
-{
- \spath_get:nnN {#1} {path} \l__spath_tmpd_tl
- \spath_map_segment_function:NN \l__spath_tmpd_tl #2
-}
-% \end{macrocode}
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_map_segment_function:NN #1#2
-{
- \tl_set_eq:NN \l__spath_tmpa_tl #1
- \tl_clear:N \l__spath_tmpb_tl
- \dim_zero:N \l__spath_tmpa_dim
- \dim_zero:N \l__spath_tmpb_dim
-
- \bool_until_do:nn {
- \tl_if_empty_p:N \l__spath_tmpa_tl
- }
- {
- \tl_set:Nx \l__spath_tmpc_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_case:NnF \l__spath_tmpc_tl
- {
- \g__spath_lineto_tl
- {
- \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_moveto_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- \tl_put_right:NV \l__spath_tmpb_tl \g__spath_lineto_tl
-
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- }
-
- \g__spath_curvetoa_tl
- {
- \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_moveto_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- \tl_put_right:NV \l__spath_tmpb_tl \g__spath_curvetoa_tl
-
- \prg_replicate:nn {2} {
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- \tl_put_right:Nx \l__spath_tmpb_tl {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
- }
-
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- }
-
- \g__spath_closepath_tl
- {
- \tl_set_eq:NN \l__spath_tmpb_tl \g__spath_moveto_tl
- \tl_put_right:Nx \l__spath_tmpb_tl
- {
- {\dim_use:N \l__spath_tmpa_dim}
- {\dim_use:N \l__spath_tmpb_dim}
- }
- \tl_put_right:NV \l__spath_tmpb_tl \g__spath_lineto_tl
-
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- }
-
- }
- {
-
- \tl_set_eq:NN \l__spath_tmpb_tl \l__spath_tmpc_tl
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpa_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- \tl_put_right:Nx \l__spath_tmpb_tl {{\tl_head:N \l__spath_tmpa_tl}}
- \dim_set:Nn \l__spath_tmpb_dim {\tl_head:N \l__spath_tmpa_tl}
- \tl_set:Nx \l__spath_tmpa_tl {\tl_tail:N \l__spath_tmpa_tl}
-
- }
-
- #2 \l__spath_tmpc_tl \l__spath_tmpb_tl
- \tl_clear:N \l__spath_tmpb_tl
-
- }
-}
-\cs_generate_variant:Nn \spath_map_segment_function:NN {Nc}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Public Commands}
-%
-% The next functions are more ``public'' than the previous lot.
-% That said, they aren't intended for direct use in a normal document.
-%
-% Most are just wrappers around internal functions.
-%
-% \begin{macro}{\MakeSPath}
-% Constructs an \Verb+spath+ object out of the given name and path.
-% \begin{macrocode}
-\NewDocumentCommand \MakeSPath { m m }
-{
- \spath_clear_new:n {#1}
- \spath_put:nno {#1} {path} {#2}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\MakeSPathList}
-% This constructs a list of \Verb+spath+ objects from a single path by splitting it into components.
-% \begin{macrocode}
-\NewDocumentCommand \MakeSPathList { m m }
-{
- \tl_gclear_new:c {l__spath_list_#1}
- \int_zero:N \l__spath_tmpa_int
- \spath_map_component:Nn #2 {
- \spath_clear_new:n {#1 _ \int_use:N \l__spath_tmpa_int}
- \spath_put:nnn {#1 _ \int_use:N \l__spath_tmpa_int} {path} {##1}
- \tl_gput_right:cx {l__spath_list_#1} {{#1 _ \int_use:N \l__spath_tmpa_int}}
- \int_incr:N \l__spath_tmpa_int
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\CloneSPath}
-% \begin{macrocode}
-\NewDocumentCommand \CloneSPath { m m }
-{
- \spath_clone:nn {#1} {#2}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\SPathInfo}
-% \begin{macrocode}
-\NewDocumentCommand \SPathInfo { m m }
-{
- \spath_get:nn {#1} {#2}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\SPathPrepare}
-% \begin{macrocode}
-\NewDocumentCommand \SPathPrepare { m }
-{
- \spath_generate_all:n {#1}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\SPathListPrepare}
-% \begin{macrocode}
-\NewDocumentCommand \SPathListPrepare { m }
-{
- \tl_map_inline:cn {l__spath_list_#1}
- {
- \spath_generate_all:n {##1}
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\SPathInfoInto}
-% \begin{macrocode}
-\NewDocumentCommand \SPathInfoInto { m m m }
-{
- \tl_clear_new:N #3
- \spath_get:nnN {#1} {#2} #3
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\SPathShow}
-% \begin{macrocode}
-\NewDocumentCommand \SPathShow { m }
-{
- \spath_show:n {#1}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\SPathTranslate}
-% \begin{macrocode}
-\NewDocumentCommand \SPathTranslate { m m m }
-{
- \spath_translate:nnn {#1} {#2} {#3}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\SPathTranslateInto}
-% Clones the path before translating it.
-% \begin{macrocode}
-\NewDocumentCommand \SPathTranslateInto { m m m m }
-{
- \spath_clone:nn {#1} {#2}
- \spath_translate:nnn {#2} {#3} {#4}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\SPathScale}
-% \begin{macrocode}
-\NewDocumentCommand \SPathScale { m m m }
-{
- \spath_scale:nnn {#1} {#2} {#3}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\SPathScaleInto}
-% Clones the path first.
-% \begin{macrocode}
-\NewDocumentCommand \SPathScaleInto { m m m m }
-{
- \spath_clone:nn {#1} {#2}
- \spath_scale:nnn {#2} {#3} {#4}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\SPathWeld}
-% \begin{macrocode}
-\NewDocumentCommand \SPathWeld { m m }
-{
- \spath_weld:nn {#1} {#2}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\SPathWeldInto}
-% \begin{macrocode}
-\NewDocumentCommand \SPathWeldInto { m m m }
-{
- \spath_clone:nn {#1} {#2}
- \spath_weld:nn {#2} {#3}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% Interfaces via TikZ keys.
-% \begin{macrocode}
-\tikzset{
- save~spath/.code={
- \tikz@addmode{
- \spath_get_current_path:n {#1}
- }
- },
- restore~spath/.code={
- \spath_set_current_path:n {#1}
- }
-}
-% \end{macrocode}
-% \subsection{Miscellaneous Commands}
-%
-% \begin{macro}{\spath_split_curve:nnNN}
-% Splits a Bezier cubic into pieces.
-% \begin{macrocode}
-\cs_new_nopar:Npn \spath_split_curve:nnNN #1#2#3#4
-{
- \group_begin:
- \tl_gclear:N \l__spath_smuggle_tl
- \tl_set_eq:NN \l__spath_tmpa_tl \g__spath_moveto_tl
- \tl_put_right:Nx \l__spath_tmpa_tl {
- {\tl_item:nn {#2} {2}}
- {\tl_item:nn {#2} {3}}
- }
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetoa_tl
- \tl_put_right:Nx \l__spath_tmpa_tl
- {
- {\fp_to_dim:n
- {
- (1 - #1) * \tl_item:nn {#2} {2} + (#1) * \tl_item:nn {#2} {5}
- }}
- {\fp_to_dim:n
- {
- (1 - #1) * \tl_item:nn {#2} {3} + (#1) * \tl_item:nn {#2} {6}
- }}
- }
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetob_tl
- \tl_put_right:Nx \l__spath_tmpa_tl
- {
- {\fp_to_dim:n
- {
- (1 - #1)^2 * \tl_item:nn {#2} {2} + 2 * (1 - #1) * (#1) * \tl_item:nn {#2} {5} + (#1)^2 * \tl_item:nn {#2} {8}
- }}
- {\fp_to_dim:n
- {
- (1 - #1)^2 * \tl_item:nn {#2} {3} + 2 * (1 - #1) * (#1) * \tl_item:nn {#2} {6} + (#1)^2 * \tl_item:nn {#2} {9}
- }}
- }
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curveto_tl
- \tl_put_right:Nx \l__spath_tmpa_tl
- {
- {\fp_to_dim:n
- {
- (1 - #1)^3 * \tl_item:nn {#2} {2} + 3 * (1 - #1)^2 * (#1) * \tl_item:nn {#2} {5} + 3 * (1 - #1) * (#1)^2 * \tl_item:nn {#2} {8} + (#1)^3 * \tl_item:nn {#2} {11}
- }}
- {\fp_to_dim:n
- {
- (1 - #1)^3 * \tl_item:nn {#2} {3} + 3 * (1 - #1)^2 * (#1) * \tl_item:nn {#2} {6} + 3 * (1 - #1) * (#1)^2 * \tl_item:nn {#2} {9} + (#1)^3 * \tl_item:nn {#2} {12}
- }}
- }
- \tl_gset_eq:NN \l__spath_smuggle_tl \l__spath_tmpa_tl
- \group_end:
- \tl_set_eq:NN #3 \l__spath_smuggle_tl
- \group_begin:
- \tl_set_eq:NN \l__spath_tmpa_tl \g__spath_moveto_tl
- \tl_put_right:Nx \l__spath_tmpa_tl
- {
- {\fp_to_dim:n
- {
- (1 - #1)^3 * \tl_item:nn {#2} {2} + 3 * (1 - #1)^2 * (#1) * \tl_item:nn {#2} {5} + 3 * (1 - #1) * (#1)^2 * \tl_item:nn {#2} {8} + (#1)^3 * \tl_item:nn {#2} {11}
- }}
- {\fp_to_dim:n
- {
- (1 - #1)^3 * \tl_item:nn {#2} {3} + 3 * (1 - #1)^2 * (#1) * \tl_item:nn {#2} {6} + 3 * (1 - #1) * (#1)^2 * \tl_item:nn {#2} {9} + (#1)^3 * \tl_item:nn {#2} {12}
- }}
- }
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetoa_tl
- \tl_put_right:Nx \l__spath_tmpa_tl
- {
- {\fp_to_dim:n
- {
- (1 - #1)^2 * \tl_item:nn {#2} {5} + 2 * (1 - #1) * (#1) * \tl_item:nn {#2} {8} + (#1)^2 * \tl_item:nn {#2} {11}
- }}
- {\fp_to_dim:n
- {
- (1 - #1)^2 * \tl_item:nn {#2} {6} + 2 * (1 - #1) * (#1) * \tl_item:nn {#2} {9} + (#1)^2 * \tl_item:nn {#2} {12}
- }}
- }
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curvetob_tl
- \tl_put_right:Nx \l__spath_tmpa_tl
- {
- {\fp_to_dim:n
- {
- (1 - #1) * \tl_item:nn {#2} {8} + (#1) * \tl_item:nn {#2} {11}
- }}
- {\fp_to_dim:n
- {
- (1 - #1) * \tl_item:nn {#2} {9} + (#1) * \tl_item:nn {#2} {12}
- }}
- }
- \tl_put_right:NV \l__spath_tmpa_tl \g__spath_curveto_tl
- \tl_put_right:Nx \l__spath_tmpa_tl {
- {\tl_item:nn {#2} {11}}
- {\tl_item:nn {#2} {12}}
- }
- \tl_gset_eq:NN \l__spath_smuggle_tl \l__spath_tmpa_tl
- \group_end:
- \tl_set_eq:NN #4 \l__spath_smuggle_tl
-}
-
-\cs_generate_variant:Nn \spath_split_curve:nnNN {nVNN, VVNN}
-% \end{macrocode}
-% \end{macro}
-% \iffalse
-%</spath3>
-% \fi
-%
-% \iffalse
-%<*calligraphy>
-% \fi
-%
-% \section{The Calligraphy Package}
-%
-% \subsection{Initialisation}
-% \begin{macrocode}
-\RequirePackage{spath3}
-\ExplSyntaxOn
-
-\tl_new:N \l__cal_tmpa_tl
-\tl_new:N \l__cal_tmpb_tl
-\int_new:N \l__cal_tmpa_int
-\int_new:N \l__cal_tmpb_int
-\int_new:N \l__cal_path_component_int
-\int_new:N \l__cal_label_int
-\dim_new:N \l__cal_tmpa_dim
-\dim_new:N \l__cal_tmpb_dim
-\dim_new:N \l__cal_tmpc_dim
-\dim_new:N \l__cal_tmpd_dim
-\dim_new:N \l__cal_tmpe_dim
-\dim_new:N \l__cal_tmpf_dim
-\dim_new:N \l__cal_tmpg_dim
-\dim_new:N \l__cal_tmph_dim
-\bool_new:N \l__cal_annotate_bool
-\bool_new:N \l__cal_taper_start_bool
-\bool_new:N \l__cal_taper_end_bool
-\bool_new:N \l__cal_taperable_bool
-\dim_new:N \l__cal_taper_width_dim
-\dim_new:N \l__cal_line_width_dim
-
-\bool_set_true:N \l__cal_taper_start_bool
-\bool_set_true:N \l__cal_taper_end_bool
-
-\cs_generate_variant:Nn \tl_put_right:Nn {Nv}
-% \end{macrocode}
-%
-% \subsection{TikZ Keys}
-%
-% The public interface to this package is through TikZ keys and styles.
-% \begin{macrocode}
-\tikzset{
- define~pen/.code={
- \tikzset{pen~name=#1}
- \pgf@relevantforpicturesizefalse
- \tikz@addmode{
- \pgfsyssoftpath@getcurrentpath\l__cal_tmpa_tl
- \MakeSPathList{calligraphy pen \pgfkeysvalueof{/tikz/pen~name}}{\l__cal_tmpa_tl}
- \SPathListPrepare{calligraphy pen \pgfkeysvalueof{/tikz/pen~name}}
- \pgfusepath{discard}%
- }
- },
- define~pen/.default={default},
- use~pen/.code={
- \tikzset{pen~name=#1}
- \int_gzero:N \l__cal_path_component_int
- \cs_set_eq:NN \pgfpathmoveto \cal_moveto:n
- \tikz@addmode{
- \pgfsyssoftpath@getcurrentpath\l__cal_tmpa_tl
- \MakeSPathList{calligraphy path}{\l__cal_tmpa_tl}
- \SPathListPrepare{calligraphy path}
- \CalligraphyPathCreate{calligraphy path}{\pgfkeysvalueof{/tikz/pen~name}}
- }
- },
- use~pen/.default={default},
- pen~name/.initial={default},
- copperplate/.style={pen~name=copperplate},
- pen~colour/.initial={black},
- weight/.is~choice,
- weight/heavy/.style={
- line~width=\pgfkeysvalueof{/tikz/heavy~line~width},
- taper~width=\pgfkeysvalueof{/tikz/light~line~width},
- },
- weight/light/.style={
- line~width=\pgfkeysvalueof{/tikz/light~line~width},
- taper~width=0pt,
- },
- heavy/.style={
- weight=heavy
- },
- light/.style={
- weight=light
- },
- heavy~line~width/.initial=2pt,
- light~line~width/.initial=1pt,
- taper/.is~choice,
- taper/.default=both,
- taper/none/.style={
- taper~start=false,
- taper~end=false,
- },
- taper/both/.style={
- taper~start=true,
- taper~end=true,
- },
- taper/start/.style={
- taper~start=true,
- taper~end=false,
- },
- taper/end/.style={
- taper~start=false,
- taper~end=true,
- },
- taper~start/.code={
- \tl_if_eq:nnTF {#1} {true}
- {
- \bool_set_true:N \l__cal_taper_start_bool
- }
- {
- \bool_set_false:N \l__cal_taper_start_bool
- }
- },
- taper~start/.default={true},
- taper~end/.code={
- \tl_if_eq:nnTF {#1} {true}
- {
- \bool_set_true:N \l__cal_taper_end_bool
- }
- {
- \bool_set_false:N \l__cal_taper_end_bool
- }
- },
- taper~end/.default={true},
- taper~width/.code={\dim_set:Nn \l__cal_taper_width_dim {#1}},
- nib~style/.code~2~args={
- \tl_clear_new:c {l__cal_nib_style_#1}
- \tl_set:cn {l__cal_nib_style_#1} {#2}
- },
- stroke~style/.code~2~args={
- \tl_clear_new:c {l__cal_stroke_style_#1}
- \tl_set:cn {l__cal_stroke_style_#1} {#2}
- },
- this~stroke~style/.code={
- \tl_clear_new:c {l__cal_stroke_inline_style_ \int_use:N \l__cal_path_component_int}
- \tl_set:cn {l__cal_stroke_inline_style_ \int_use:N \l__cal_path_component_int} {#1}
- },
- annotate/.style={
- annotate~if,
- annotate~reset,
- annotation~style/.update~value={#1},
- },
- annotate~if/.default={true},
- annotate~if/.code={
- \tl_if_eq:nnTF {#1} {true}
- {
- \bool_set_true:N \l__cal_annotate_bool
- }
- {
- \bool_set_false:N \l__cal_annotate_bool
- }
- },
- annotate~reset/.code={
- \int_gzero:N \l__cal_label_int
- },
- annotation~style/.initial={draw,->},
- annotation~shift/.initial={(0,1ex)},
- every~annotation~node/.initial={anchor=south~west},
- annotation~node~style/.code~2~args={
- \tl_set:cn {l__cal_annotation_style_ #1 _tl}{#2}
- },
- tl~use:N/.code={
- \exp_args:NV \pgfkeysalso #1
- },
- tl~use:c/.code={
- \tl_if_exist:cT {#1}
- {
- \exp_args:Nv \pgfkeysalso {#1}
- }
- },
- /handlers/.update~style/.code={
- \tl_if_eq:nnF {#1} {\pgfkeysnovalue}
- {
- \pgfkeys{\pgfkeyscurrentpath/.code=\pgfkeysalso{#1}}
- }
- },
- /handlers/.update~value/.code={
- \tl_if_eq:nnF {#1} {\pgfkeysnovalue}
- {
- \pgfkeyssetvalue{\pgfkeyscurrentpath}{#1}
- }
- }
-}
-% \end{macrocode}
-%
-% Some wrappers around the TikZ keys.
-% \begin{macrocode}
-\NewDocumentCommand \pen { O{} }
-{
- \path[define~ pen,every~ calligraphy~ pen/.try,#1]
-}
-
-\NewDocumentCommand \definepen { O{} }
-{
- \tikz \path[define~ pen,every~ calligraphy~ pen/.try,#1]
-}
-
-\NewDocumentCommand \calligraphy { O{} }
-{
- \path[use~ pen,every~ calligraphy/.try,#1]
-}
-% \end{macrocode}
-%
-% \subsection{The Path Creation}
-%
-% \begin{macro}{\CalligraphyPathCreate}
-% This is the main command for creating the calligraphic paths.
-% \begin{macrocode}
-\NewDocumentCommand \CalligraphyPathCreate { m m }
-{
- \int_zero:N \l__cal_tmpa_int
- \tl_map_inline:cn {l__spath_list_#1}
- {
- \int_incr:N \l__cal_tmpa_int
- \int_zero:N \l__cal_tmpb_int
- \tl_map_inline:cn {l__spath_list_calligraphy pen #2}
- {
- \int_incr:N \l__cal_tmpb_int
- \group_begin:
- \pgfsys@beginscope
-
- \cal_apply_style:c {l__cal_stroke_style_ \int_use:N \l__cal_tmpa_int}
- \cal_apply_style:c {l__cal_stroke_inline_style_ \int_use:N \l__cal_tmpa_int}
- \cal_apply_style:c {l__cal_nib_style_ \int_use:N \l__cal_tmpb_int}
-
- \spath_clone:nn {##1} {calligraphy temp path}
-
- \__spath_get:nnN {####1} {initial point} \l__cal_tmpa_tl
- \spath_translate:nV {calligraphy temp path} \l__cal_tmpa_tl
-
- \__spath_get:nnN {####1} {length} \l__cal_tmpa_tl
-
- \int_compare:nTF {\l__cal_tmpa_tl = 1}
- {
- \cal_at_least_three:n {calligraphy temp path}
-
- \spath_protocol_path:n {calligraphy temp path}
-
- \__spath_get:nnN {calligraphy temp path} {path} \l__cal_tmpa_tl
-
- \tikz@options
- \dim_set:Nn \l__cal_line_width_dim {\pgflinewidth}
- \cal_maybe_taper:N \l__cal_tmpa_tl
- }
- {
-
- \spath_weld:nn {calligraphy temp path} {####1}
- \spath_reverse:n {##1}
- \spath_reverse:n {####1}
- \spath_weld:nn {calligraphy temp path} {##1}
- \spath_weld:nn {calligraphy temp path} {####1}
- \spath_reverse:n {##1}
- \spath_reverse:n {####1}
-
- \tl_clear:N \l__cal_tmpa_tl
- \tl_set:Nn \l__cal_tmpa_tl {fill=\pgfkeysvalueof{/tikz/pen~colour},draw=none}
- \tl_if_exist:cT {l__cal_stroke_style_ \int_use:N \l__cal_tmpa_int}
- {
- \tl_put_right:Nv \l__cal_tmpa_tl {l__cal_stroke_style_ \int_use:N \l__cal_tmpa_int}
- }
- \tl_if_exist:cT {l__cal_stroke_inline_style_ \int_use:N \l__cal_tmpa_int}
- {
- \tl_put_right:Nn \l__cal_tmpa_tl {,}
- \tl_put_right:Nv \l__cal_tmpa_tl {l__cal_stroke_inline_style_ \int_use:N \l__cal_tmpa_int}
- }
- \tl_if_exist:cT {l__cal_nib_style_ \int_use:N \l__cal_tmpb_int}
- {
- \tl_put_right:Nn \l__cal_tmpa_tl {,}
- \tl_put_right:Nv \l__cal_tmpa_tl {l__cal_nib_style_ \int_use:N \l__cal_tmpb_int}
- }
- \spath_tikz_path:Vn \l__cal_tmpa_tl {calligraphy temp path}
-
- }
- \pgfsys@endscope
- \group_end:
- }
- \bool_if:NT \l__cal_annotate_bool
- {
- \spath_clone:nn {##1} {calligraphy temp path}
- \tl_set_eq:Nc \l_tmpa_tl {l__spath_list_calligraphy pen #2}
- \tl_reverse:N \l_tmpa_tl
- \tl_set:Nx \l_tmpa_tl {\tl_head:N \l_tmpa_tl}
- \spath_generate_finalpoint:V \l_tmpa_tl
- \spath_get:VnN \l_tmpa_tl {final point} \l_tmpa_tl
- \spath_translate:nV {calligraphy temp path} \l_tmpa_tl
- \tikz@scan@one@point\pgfutil@firstofone\pgfkeysvalueof{/tikz/annotation~shift}
- \spath_translate:nnn {calligraphy temp path} {\pgf@x} {\pgf@y}
-
- \pgfkeysgetvalue{/tikz/annotation~style}{\l_tmpa_tl}
- \spath_tikz_path:Vn \l_tmpa_tl {calligraphy temp path}
- \spath_get:nnN {calligraphy temp path} {final point} \l_tmpa_tl
- \exp_last_unbraced:NV \pgfqpoint \l_tmpa_tl
- \begin{scope}[reset~ cm]
- \node[every~annotation~node/.try,tl~use:c = {l__cal_annotation_style_ \int_use:N \l__cal_tmpa_int _tl}] at (\pgf@x,\pgf@y) {\int_use:N \l__cal_tmpa_int};
- \end{scope}
- }
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\cal_moveto:n}
-% When creating the path, we need to keep track of the number of components so that we can apply styles accordingly.
-% \begin{macrocode}
-\cs_new_eq:NN \cal_orig_moveto:n \pgfpathmoveto
-\cs_new_nopar:Npn \cal_moveto:n #1
-{
- \int_gincr:N \l__cal_path_component_int
- \cal_orig_moveto:n {#1}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\cal_apply_style:N}
-% Interface for applying \Verb+\tikzset+ to a token list.
-% \begin{macrocode}
-\cs_new_nopar:Npn \cal_apply_style:N #1
-{
- \tl_if_exist:NT #1 {
- \exp_args:NV \tikzset #1
- }
-}
-\cs_generate_variant:Nn \cal_apply_style:N {c}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\cal_at_least_three:n}
-% A tapered path has to have at least three components.
-% This figures out if it is necessary and sets up the splitting.
-% \begin{macrocode}
-\cs_new_nopar:Npn \cal_at_least_three:n #1
-{
- \spath_get:nnN {#1} {real length} \l__cal_tmpa_tl
- \tl_clear:N \l__cal_tmpb_tl
- \int_compare:nTF {\l__cal_tmpa_tl = 1}
- {
- \spath_get:nnN {#1} {path} \l__cal_tmpa_tl
- \spath_map_segment_inline:Nn \l__cal_tmpa_tl
- {
- \tl_case:NnF ##1 {
- \g__spath_lineto_tl {
- \cal_split_line_in_three:NN \l__cal_tmpb_tl ##2
- }
- \g__spath_curvetoa_tl {
- \cal_split_curve_in_three:NN \l__cal_tmpb_tl ##2
- }
- }
- {
- \tl_put_right:NV \l__cal_tmpb_tl ##2
- }
- }
- \spath_put:nnV {#1} {path} \l__cal_tmpb_tl
- }
- {
- \int_compare:nT {\l__cal_tmpa_tl = 2}
- {
- \spath_get:nnN {#1} {path} \l__cal_tmpa_tl
- \spath_map_segment_inline:Nn \l__cal_tmpa_tl
- {
- \tl_case:NnF ##1 {
- \g__spath_lineto_tl {
- \cal_split_line_in_two:NN \l__cal_tmpb_tl ##2
- }
- \g__spath_curvetoa_tl {
- \cal_split_curve_in_two:NN \l__cal_tmpb_tl ##2
- }
- }
- {
- \tl_put_right:NV \l__cal_tmpb_tl ##2
- }
- }
- \spath_put:nnV {#1} {path} \l__cal_tmpb_tl
- }
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\cal_split_line_in_two:NN}
-% Splits a line in two, adding the splits to the first token list.
-% \begin{macrocode}
-\cs_new_nopar:Npn \cal_split_line_in_two:NN #1#2
-{
- \tl_set_eq:NN \l__cal_tmpc_tl #2
-
- \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl}
-
- \dim_set:Nn \l__cal_tmpa_dim {\tl_head:N \l__cal_tmpc_tl}
- \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl}
-
- \dim_set:Nn \l__cal_tmpb_dim {\tl_head:N \l__cal_tmpc_tl}
- \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl}
-
- \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl}
-
- \dim_set:Nn \l__cal_tmpc_dim {\tl_head:N \l__cal_tmpc_tl}
- \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl}
- \dim_set:Nn \l__cal_tmpd_dim {\tl_head:N \l__cal_tmpc_tl}
- \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl}
-
- \tl_put_right:NV #1 \g__spath_lineto_tl
-
- \tl_put_right:Nx #1 {
- {\dim_eval:n {(\l__cal_tmpa_dim + \l__cal_tmpc_dim)/2}}
- {\dim_eval:n {(\l__cal_tmpb_dim + \l__cal_tmpd_dim)/2}}
- }
-
- \tl_put_right:NV #1 \g__spath_lineto_tl
- \tl_put_right:Nx #1 {
- {\dim_use:N \l__cal_tmpc_dim}
- {\dim_use:N \l__cal_tmpd_dim}
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\cal_split_line_in_three:NN}
-% Splits a line in three, adding the splits to the first token list.
-% \begin{macrocode}
-\cs_new_nopar:Npn \cal_split_line_in_three:NN #1#2
-{
- \tl_set_eq:NN \l__cal_tmpc_tl #2
-
- \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl}
-
- \dim_set:Nn \l__cal_tmpa_dim {\tl_head:N \l__cal_tmpc_tl}
- \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl}
-
- \dim_set:Nn \l__cal_tmpb_dim {\tl_head:N \l__cal_tmpc_tl}
- \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl}
-
- \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl}
-
- \dim_set:Nn \l__cal_tmpc_dim {\tl_head:N \l__cal_tmpc_tl}
- \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl}
- \dim_set:Nn \l__cal_tmpd_dim {\tl_head:N \l__cal_tmpc_tl}
- \tl_set:Nx \l__cal_tmpc_tl {\tl_tail:N \l__cal_tmpc_tl}
-
- \tl_put_right:NV #1 \g__spath_lineto_tl
-
- \tl_put_right:Nx #1 {
- {\dim_eval:n {(2\l__cal_tmpa_dim + \l__cal_tmpc_dim)/3}}
- {\dim_eval:n {(2\l__cal_tmpb_dim + \l__cal_tmpd_dim)/3}}
- }
-
- \tl_put_right:NV #1 \g__spath_lineto_tl
-
- \tl_put_right:Nx #1 {
- {\dim_eval:n {(\l__cal_tmpa_dim + 2\l__cal_tmpc_dim)/3}}
- {\dim_eval:n {(\l__cal_tmpb_dim + 2\l__cal_tmpd_dim)/3}}
- }
-
- \tl_put_right:NV #1 \g__spath_lineto_tl
- \tl_put_right:Nx #1 {
- {\dim_use:N \l__cal_tmpc_dim}
- {\dim_use:N \l__cal_tmpd_dim}
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\cal_split_curve_in_two:NN}
-% Splits a curve in two, adding the splits to the first token list.
-% \begin{macrocode}
-\cs_new_nopar:Npn \cal_split_curve_in_two:NN #1#2
-{
- \spath_split_curve:nVNN {.5} #2 \l_tmpa_tl \l_tmpb_tl
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl}
- \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl}
- \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl}
- \tl_put_right:NV #1 \l_tmpa_tl
- \tl_put_right:NV #1 \l_tmpb_tl
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\cal_split_curve_in_three:NN}
-% Splits a curve in three, adding the splits to the first token list.
-% \begin{macrocode}
-\cs_new_nopar:Npn \cal_split_curve_in_three:NN #1#2
-{
- \spath_split_curve:nVNN {1/3} #2 \l_tmpa_tl \l_tmpb_tl
-
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_put_right:NV #1 \l_tmpa_tl
-
- \spath_split_curve:nVNN {.5} \l_tmpb_tl \l_tmpa_tl \l_tmpb_tl
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl}
- \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl}
- \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl}
- \tl_put_right:NV #1 \l_tmpa_tl
- \tl_put_right:NV #1 \l_tmpb_tl
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\cal_maybe_taper:N}
-% Possibly tapers the path, depending on the booleans.
-% \begin{macrocode}
-\cs_new_nopar:Npn \cal_maybe_taper:N #1
-{
- \tl_set_eq:NN \l__cal_tmpa_tl #1
-
- \bool_if:NT \l__cal_taper_start_bool
- {
-
- \dim_set:Nn \l__cal_tmpa_dim {\tl_item:Nn \l__cal_tmpa_tl {2}}
- \dim_set:Nn \l__cal_tmpb_dim {\tl_item:Nn \l__cal_tmpa_tl {3}}
- \tl_set:Nx \l__cal_tmpb_tl {\tl_item:Nn \l__cal_tmpa_tl {4}}
-
- \tl_case:NnF \l__cal_tmpb_tl
- {
- \g__spath_lineto_tl
- {
-
- \bool_set_true:N \l__cal_taperable_bool
- \dim_set:Nn \l__cal_tmpg_dim {\tl_item:Nn \l__cal_tmpa_tl {5}}
- \dim_set:Nn \l__cal_tmph_dim {\tl_item:Nn \l__cal_tmpa_tl {6}}
- \dim_set:Nn \l__cal_tmpc_dim {(2\l__cal_tmpa_dim + \l__cal_tmpg_dim)/3}
- \dim_set:Nn \l__cal_tmpd_dim {(2\l__cal_tmpb_dim + \l__cal_tmph_dim)/3}
- \dim_set:Nn \l__cal_tmpe_dim {(\l__cal_tmpa_dim + 2\l__cal_tmpg_dim)/3}
- \dim_set:Nn \l__cal_tmpf_dim {(\l__cal_tmpb_dim + 2\l__cal_tmph_dim)/3}
- \prg_replicate:nn {4}
- {
- \tl_set:Nx \l__cal_tmpa_tl {\tl_tail:N \l__cal_tmpa_tl}
- }
- \tl_put_left:NV \l__cal_tmpa_tl \g__spath_moveto_tl
- }
- \g__spath_curvetoa_tl
- {
- \bool_set_true:N \l__cal_taperable_bool
- \dim_set:Nn \l__cal_tmpc_dim {\tl_item:Nn \l__cal_tmpa_tl {5}}
- \dim_set:Nn \l__cal_tmpd_dim {\tl_item:Nn \l__cal_tmpa_tl {6}}
- \dim_set:Nn \l__cal_tmpe_dim {\tl_item:Nn \l__cal_tmpa_tl {8}}
- \dim_set:Nn \l__cal_tmpf_dim {\tl_item:Nn \l__cal_tmpa_tl {9}}
- \dim_set:Nn \l__cal_tmpg_dim {\tl_item:Nn \l__cal_tmpa_tl {11}}
- \dim_set:Nn \l__cal_tmph_dim {\tl_item:Nn \l__cal_tmpa_tl {12}}
- \prg_replicate:nn {10}
- {
- \tl_set:Nx \l__cal_tmpa_tl {\tl_tail:N \l__cal_tmpa_tl}
- }
- \tl_put_left:NV \l__cal_tmpa_tl \g__spath_moveto_tl
- }
- }
- {
- \bool_set_false:N \l__cal_taperable_bool
- }
-
- \bool_if:NT \l__cal_taperable_bool
- {
- \__cal_taper_aux:
- }
-
- }
-
- \bool_if:NT \l__cal_taper_end_bool
- {
-
- \dim_set:Nn \l__cal_tmpa_dim {\tl_item:Nn \l__cal_tmpa_tl {-2}}
- \dim_set:Nn \l__cal_tmpb_dim {\tl_item:Nn \l__cal_tmpa_tl {-1}}
- \tl_set:Nx \l__cal_tmpb_tl {\tl_item:Nn \l__cal_tmpa_tl {-3}}
-
- \tl_case:NnF \l__cal_tmpb_tl
- {
- \g__spath_lineto_tl
- {
-
- \bool_set_true:N \l__cal_taperable_bool
- \dim_set:Nn \l__cal_tmpg_dim {\tl_item:Nn \l__cal_tmpa_tl {-5}}
- \dim_set:Nn \l__cal_tmph_dim {\tl_item:Nn \l__cal_tmpa_tl {-4}}
- \dim_set:Nn \l__cal_tmpc_dim {(2\l__cal_tmpa_dim + \l__cal_tmpg_dim)/3}
- \dim_set:Nn \l__cal_tmpd_dim {(2\l__cal_tmpb_dim + \l__cal_tmph_dim)/3}
- \dim_set:Nn \l__cal_tmpe_dim {(\l__cal_tmpa_dim + 2\l__cal_tmpg_dim)/3}
- \dim_set:Nn \l__cal_tmpf_dim {(\l__cal_tmpb_dim + 2\l__cal_tmph_dim)/3}
- \tl_reverse:N \l__cal_tmpa_tl
- \prg_replicate:nn {3}
- {
- \tl_set:Nx \l__cal_tmpa_tl {\tl_tail:N \l__cal_tmpa_tl}
- }
- \tl_reverse:N \l__cal_tmpa_tl
- }
- \g__spath_curveto_tl
- {
- \bool_set_true:N \l__cal_taperable_bool
- \dim_set:Nn \l__cal_tmpc_dim {\tl_item:Nn \l__cal_tmpa_tl {-5}}
- \dim_set:Nn \l__cal_tmpd_dim {\tl_item:Nn \l__cal_tmpa_tl {-4}}
- \dim_set:Nn \l__cal_tmpe_dim {\tl_item:Nn \l__cal_tmpa_tl {-8}}
- \dim_set:Nn \l__cal_tmpf_dim {\tl_item:Nn \l__cal_tmpa_tl {-7}}
- \dim_set:Nn \l__cal_tmpg_dim {\tl_item:Nn \l__cal_tmpa_tl {-11}}
- \dim_set:Nn \l__cal_tmph_dim {\tl_item:Nn \l__cal_tmpa_tl {-10}}
- \tl_reverse:N \l__cal_tmpa_tl
- \prg_replicate:nn {9}
- {
- \tl_set:Nx \l__cal_tmpa_tl {\tl_tail:N \l__cal_tmpa_tl}
- }
- \tl_reverse:N \l__cal_tmpa_tl
- }
- }
- {
- \bool_set_false:N \l__cal_taperable_bool
- }
-
- \bool_if:NT \l__cal_taperable_bool
- {
- \__cal_taper_aux:
- }
-
- }
-
- \pgfsyssoftpath@setcurrentpath\l__cal_tmpa_tl
- \pgfsetstrokecolor{\pgfkeysvalueof{/tikz/pen~colour}}
- \pgfusepath{stroke}
-
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\__cal_taper_aux:}
-% Auxiliary macro to avoid unnecessary code duplication.
-% \begin{macrocode}
-\cs_new_nopar:Npn \__cal_taper_aux:
-{
- \tl_clear:N \l__cal_tmpb_tl
- \tl_put_right:NV \l__cal_tmpb_tl \g__spath_moveto_tl
-
- \fp_set:Nn \l__cal_tmpa_fp
- {
- \l__cal_tmpd_dim - \l__cal_tmpb_dim
- }
- \fp_set:Nn \l__cal_tmpb_fp
- {
- \l__cal_tmpa_dim - \l__cal_tmpc_dim
- }
- \fp_set:Nn \l__cal_tmpe_fp
- {
- (\l__cal_tmpa_fp^2 + \l__cal_tmpb_fp^2)^.5
- }
-
- \fp_set:Nn \l__cal_tmpa_fp {.5*\l__cal_taper_width_dim * \l__cal_tmpa_fp / \l__cal_tmpe_fp}
- \fp_set:Nn \l__cal_tmpb_fp {.5*\l__cal_taper_width_dim * \l__cal_tmpb_fp / \l__cal_tmpe_fp}
-
- \fp_set:Nn \l__cal_tmpc_fp
- {
- \l__cal_tmph_dim - \l__cal_tmpf_dim
- }
- \fp_set:Nn \l__cal_tmpd_fp
- {
- \l__cal_tmpe_dim - \l__cal_tmpg_dim
- }
- \fp_set:Nn \l__cal_tmpe_fp
- {
- (\l__cal_tmpc_fp^2 + \l__cal_tmpd_fp^2)^.5
- }
-
- \fp_set:Nn \l__cal_tmpc_fp {.5*\l__cal_line_width_dim * \l__cal_tmpc_fp / \l__cal_tmpe_fp}
- \fp_set:Nn \l__cal_tmpd_fp {.5*\l__cal_line_width_dim * \l__cal_tmpd_fp / \l__cal_tmpe_fp}
-
- \tl_put_right:Nx \l__cal_tmpb_tl
- {
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpa_fp + \l__cal_tmpa_dim}}
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim}}
- }
-
- \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetoa_tl
-
- \tl_put_right:Nx \l__cal_tmpb_tl
- {
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpa_fp + \l__cal_tmpc_dim}}
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpd_dim}}
- }
-
- \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetob_tl
-
- \tl_put_right:Nx \l__cal_tmpb_tl
- {
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpc_fp + \l__cal_tmpe_dim}}
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmpf_dim}}
- }
-
- \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curveto_tl
-
- \tl_put_right:Nx \l__cal_tmpb_tl
- {
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpc_fp + \l__cal_tmpg_dim}}
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmph_dim}}
- }
-
- \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetoa_tl
-
- \tl_put_right:Nx \l__cal_tmpb_tl
- {
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpc_fp + \l__cal_tmpg_dim - \fp_to_dim:n{ 1.32 * \l__cal_tmpd_fp}}}
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmph_dim + \fp_to_dim:n {1.32* \l__cal_tmpc_fp}}}
- }
-
- \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetob_tl
-
- \tl_put_right:Nx \l__cal_tmpb_tl
- {
- {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpc_fp + \l__cal_tmpg_dim - \fp_to_dim:n {1.32 * \l__cal_tmpd_fp}}}
- {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmph_dim + \fp_to_dim:n {1.32 * \l__cal_tmpc_fp}}}
- }
-
- \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curveto_tl
-
- \tl_put_right:Nx \l__cal_tmpb_tl
- {
- {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpc_fp + \l__cal_tmpg_dim}}
- {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmph_dim}}
- }
-
- \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetoa_tl
-
- \tl_put_right:Nx \l__cal_tmpb_tl
- {
- {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpc_fp + \l__cal_tmpe_dim}}
- {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpd_fp + \l__cal_tmpf_dim}}
- }
-
- \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetob_tl
-
- \tl_put_right:Nx \l__cal_tmpb_tl
- {
- {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpa_fp + \l__cal_tmpc_dim}}
- {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpd_dim}}
- }
-
- \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curveto_tl
-
- \tl_put_right:Nx \l__cal_tmpb_tl
- {
- {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpa_fp + \l__cal_tmpa_dim}}
- {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim}}
- }
-
- \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetoa_tl
-
- \tl_put_right:Nx \l__cal_tmpb_tl
- {
- {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpa_fp + \l__cal_tmpa_dim + \fp_to_dim:n{ 1.32 * \l__cal_tmpb_fp}}}
- {\dim_eval:n { -\fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim - \fp_to_dim:n {1.32* \l__cal_tmpa_fp}}}
- }
-
- \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curvetob_tl
-
- \tl_put_right:Nx \l__cal_tmpb_tl
- {
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpa_fp + \l__cal_tmpa_dim + \fp_to_dim:n {1.32 * \l__cal_tmpb_fp}}}
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim - \fp_to_dim:n {1.32 * \l__cal_tmpa_fp}}}
- }
-
- \tl_put_right:NV \l__cal_tmpb_tl \g__spath_curveto_tl
-
- \tl_put_right:Nx \l__cal_tmpb_tl
- {
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpa_fp + \l__cal_tmpa_dim}}
- {\dim_eval:n { \fp_to_dim:N \l__cal_tmpb_fp + \l__cal_tmpb_dim}}
- }
-
- \pgfsyssoftpath@setcurrentpath\l__cal_tmpb_tl
- \pgfsetfillcolor{\pgfkeysvalueof{/tikz/pen~colour}}
- \pgfusepath{fill}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% Defines a copperplate pen.
-% \begin{macrocode}
-\tl_set:Nn \l__cal_tmpa_tl {\pgfsyssoftpath@movetotoken{0pt}{0pt}}
-\MakeSPathList{calligraphy pen copperplate}{\l__cal_tmpa_tl}
-\SPathListPrepare{calligraphy pen copperplate}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\ExplSyntaxOff
-% \end{macrocode}
-%
-% \subsection{Decorations}
-%
-% If a decoration library is loaded we define some decorations that use the calligraphy library, specifically the copperplate pen with its tapering.
-%
-% First, a brace decoration.
-% \begin{macrocode}
-\expandafter\ifx\csname pgfdeclaredecoration\endcsname\relax
-\else
-\pgfdeclaredecoration{calligraphic brace}{brace}
-{
- \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final]
- {
- \pgfsyssoftpath@setcurrentpath{\pgfutil@empty}
- \pgfpathmoveto{\pgfpointorigin}
- \pgfpathcurveto
- {\pgfqpoint{.15\pgfdecorationsegmentamplitude}{.3\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{.5\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
- {
- \pgftransformxshift{+\pgfdecorationsegmentaspect\pgfdecoratedremainingdistance}
- \pgfpathlineto{\pgfqpoint{-\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
- \pgfpathcurveto
- {\pgfqpoint{-.5\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{-.15\pgfdecorationsegmentamplitude}{.7\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{0\pgfdecorationsegmentamplitude}{1\pgfdecorationsegmentamplitude}}
- \pgfpathmoveto{\pgfqpoint{0\pgfdecorationsegmentamplitude}{1\pgfdecorationsegmentamplitude}}
- \pgfpathcurveto
- {\pgfqpoint{.15\pgfdecorationsegmentamplitude}{.7\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{.5\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
- }
- {
- \pgftransformxshift{+\pgfdecoratedremainingdistance}
- \pgfpathlineto{\pgfqpoint{-\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
- \pgfpathcurveto
- {\pgfqpoint{-.5\pgfdecorationsegmentamplitude}{.5\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{-.15\pgfdecorationsegmentamplitude}{.3\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{0pt}{0pt}}
- }
- \tikzset{
- taper width=.5\pgflinewidth,
- taper
- }%
- \pgfsyssoftpath@getcurrentpath\cal@tmp@path
- \MakeSPathList{calligraphy path}{\cal@tmp@path}%
- \SPathListPrepare{calligraphy path}%
- \CalligraphyPathCreate{calligraphy path}{copperplate}%
- }
- \state{final}{}
-}
-% \end{macrocode}
-%
-% The second is a straightened parenthesis (so that when very large it doesn't bow out too far).
-% \begin{macrocode}
-\pgfdeclaredecoration{calligraphic straight parenthesis}{brace}
-{
- \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final]
- {
- \pgfsyssoftpath@setcurrentpath{\pgfutil@empty}
- \pgfpathmoveto{\pgfpointorigin}
- \pgfpathcurveto
- {\pgfqpoint{.76604\pgfdecorationsegmentamplitude}{.64279\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{2.3333\pgfdecorationsegmentamplitude}{\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{3.3333\pgfdecorationsegmentamplitude}{\pgfdecorationsegmentamplitude}}
- {
- \pgftransformxshift{+\pgfdecoratedremainingdistance}
- \pgfpathlineto{\pgfqpoint{-3.3333\pgfdecorationsegmentamplitude}{\pgfdecorationsegmentamplitude}}
- \pgfpathcurveto
- {\pgfqpoint{-2.3333\pgfdecorationsegmentamplitude}{\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{-.76604\pgfdecorationsegmentamplitude}{.64279\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{0pt}{0pt}}
- }
- \tikzset{
- taper width=.5\pgflinewidth,
- taper
- }%
- \pgfsyssoftpath@getcurrentpath\cal@tmp@path
- \MakeSPathList{calligraphy path}{\cal@tmp@path}%
- \SPathListPrepare{calligraphy path}%
- \CalligraphyPathCreate{calligraphy path}{copperplate}%
- }
- \state{final}{}%
-}
-% \end{macrocode}
-%
-% The third is a curved parenthesis.
-% \begin{macrocode}
-\pgfdeclaredecoration{calligraphic curved parenthesis}{brace}
-{
- \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final]
- {
- \pgfsyssoftpath@setcurrentpath{\pgfutil@empty}
- \pgfpathmoveto{\pgfpointorigin}
- \pgf@xa=\pgfdecoratedremainingdistance\relax
- \advance\pgf@xa by -1.5890\pgfdecorationsegmentamplitude\relax
- \edef\cgrphy@xa{\the\pgf@xa}
- \pgfpathcurveto
- {\pgfqpoint{1.5890\pgfdecorationsegmentamplitude}{1.3333\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{\cgrphy@xa}{1.3333\pgfdecorationsegmentamplitude}}
- {\pgfqpoint{\pgfdecoratedremainingdistance}{0pt}}
- \tikzset{
- taper width=.5\pgflinewidth,
- taper
- }%
- \pgfsyssoftpath@getcurrentpath\cal@tmp@path
- \MakeSPathList{calligraphy path}{\cal@tmp@path}%
- \SPathListPrepare{calligraphy path}%
- \CalligraphyPathCreate{calligraphy path}{copperplate}%
- }
- \state{final}{}%
-}
-% \end{macrocode}
-% End the conditional for if pgfdecoration module is loaded
-% \begin{macrocode}
-\fi
-% \end{macrocode}
-% \iffalse
-%</calligraphy>
-% \fi
-%
-%
-% \iffalse
-%<*knots>
-% \fi
-%%
-% \section{Drawing Knots}
-%
-%
-% \subsection{Initialisation}
-%
-% We load the \Verb+spath3+ library and the \Verb+intersections+ TikZ library.
-% Then we get going.
-% \begin{macrocode}
-\RequirePackage{spath3}
-\usetikzlibrary{intersections}
-
-\ExplSyntaxOn
-
-\tl_new:N \l__knot_tmpa_tl
-\tl_new:N \l__knot_tmpb_tl
-\tl_new:N \l__knot_tmpc_tl
-\tl_new:N \l__knot_tmpd_tl
-\tl_new:N \l__knot_tmpe_tl
-\tl_new:N \l__knot_tmpf_tl
-\tl_new:N \l__knot_tmpg_tl
-\tl_new:N \l__knot_redraws_tl
-\tl_new:N \l__knot_clip_width_tl
-\tl_new:N \l__knot_name_tl
-\tl_new:N \l__knot_node_tl
-\tl_new:N \l__knot_aux_tl
-\tl_new:N \l__knot_auxa_tl
-
-\int_new:N \l__knot_tmpa_int
-\int_new:N \l__knot_strands_int
-\int_new:N \l__knot_intersections_int
-\int_new:N \l__knot_filaments_int
-\int_new:N \l__knot_component_start_int
-
-\dim_new:N \l__knot_tmpa_dim
-\dim_new:N \l__knot_tmpb_dim
-\dim_new:N \l__knot_tmpc_dim
-\dim_new:N \l__knot_tolerance_dim
-\dim_new:N \l__knot_clip_bg_radius_dim
-\dim_new:N \l__knot_clip_draw_radius_dim
-
-\bool_new:N \l__knot_draft_bool
-\bool_new:N \l__knot_ignore_ends_bool
-\bool_new:N \l__knot_self_intersections_bool
-\bool_new:N \l__knot_splits_bool
-\bool_new:N \l__knot_super_draft_bool
-
-\bool_new:N \l__knot_prepend_prev_bool
-\bool_new:N \l__knot_append_next_bool
-\bool_new:N \l__knot_skip_bool
-\bool_new:N \l__knot_save_bool
-
-\seq_new:N \l__knot_nodes_seq
-
-\bool_set_true:N \l__knot_ignore_ends_bool
-% \end{macrocode}
-%
-% Configuration is via TikZ keys and styles.
-% \begin{macrocode}
-\tikzset{
- knot/.code={
- \tl_if_eq:nnTF {#1} {none}
- {
- \tikz@addmode{\tikz@mode@doublefalse}
- }
- {
- \tikz@addmode{\tikz@mode@doubletrue}
- \tl_if_eq:nnTF {\pgfkeysnovalue} {#1}
- {
- \tikz@addoption{\pgfsetinnerstrokecolor{.}}
- }
- {
- \pgfsetinnerstrokecolor{#1}
- }
- \tikz@addoption{
- \pgfsetstrokecolor{knotbg}
- }
- \tl_set:Nn \tikz@double@setup{
- \pgfsetinnerlinewidth{\pgflinewidth}
- \pgfsetlinewidth{\dim_eval:n {\tl_use:N \l__knot_gap_tl \pgflinewidth}}
- }
- }
- },
- knot~ gap/.store~ in=\l__knot_gap_tl,
- knot~ gap=3,
- knot~ diagram/.is~family,
- knot~ diagram/.unknown/.code={
- \tl_set_eq:NN \l__knot_tmpa_tl \pgfkeyscurrentname
- \pgfkeysalso{
- /tikz/\l__knot_tmpa_tl=#1
- }
- },
- background~ colour/.code={%
- \colorlet{knotbg}{#1}%
- },
- background~ color/.code={%
- \colorlet{knotbg}{#1}%
- },
- background~ colour=white,
- knot~ diagram,
- name/.store~ in=\l__knot_name_tl,
- name={knot},
- save~ intersections/.is~ choice,
- save~ intersections/.default=true,
- save~ intersections/true/.code={
- \bool_set_true:N \l__knot_save_bool
- },
- save~ intersections/false/.code={
- \bool_set_false:N \l__knot_save_bool
- },
- every~ strand/.style={draw},
- ignore~ endpoint~ intersections/.code={
- \tl_if_eq:nnTF {#1} {true}
- {
- \bool_set_true:N \l__knot_ignore_ends_bool
- }
- {
- \bool_set_false:N \l__knot_ignore_ends_bool
- }
- },
- ignore~ endpoint~ intersections/.default=true,
- consider~ self~ intersections/.is~choice,
- consider~ self~ intersections/true/.code={
- \bool_set_true:N \l__knot_self_intersections_bool
- \bool_set_true:N \l__knot_splits_bool
- },
- consider~ self~ intersections/false/.code={
- \bool_set_false:N \l__knot_self_intersections_bool
- \bool_set_false:N \l__knot_splits_bool
- },
- consider~ self~ intersections/no~ splits/.code={
- \bool_set_true:N \l__knot_self_intersections_bool
- \bool_set_false:N \l__knot_splits_bool
- },
- consider~ self~ intersections/.default={true},
- clip~ radius/.code={
- \dim_set:Nn \l__knot_clip_bg_radius_dim {#1}
- \dim_set:Nn \l__knot_clip_draw_radius_dim {#1+2pt}
- },
- clip~ draw~ radius/.code={
- \dim_set:Nn \l__knot_clip_draw_radius_dim {#1}
- },
- clip~ background~ radius/.code={
- \dim_set:Nn \l__knot_clip_bg_radius_dim {#1}
- },
- clip~ radius=10pt,
- end~ tolerance/.code={
- \dim_set:Nn \l__knot_tolerance_dim {#1}
- },
- end~ tolerance=14pt,
- clip/.style={
- clip
- },
- background~ clip/.style={
- clip
- },
- clip~ width/.code={
- \tl_set:Nn \l__knot_clip_width_tl {#1}
- },
- clip~ width=3,
- flip~ crossing/.code={%
- \tl_clear_new:c {l__knot_crossing_#1}
- \tl_set:cn {l__knot_crossing_#1} {x}
- },
- ignore~ crossing/.code={%
- \tl_clear_new:c {l__knot_ignore_crossing_#1}
- \tl_set:cn {l__knot_ignore_crossing_#1} {x}
- },
- draft~ mode/.is~ choice,
- draft~ mode/off/.code={%
- \bool_set_false:N \l__knot_draft_bool
- \bool_set_false:N \l__knot_super_draft_bool
- },
- draft~ mode/crossings/.code={%
- \bool_set_true:N \l__knot_draft_bool
- \bool_set_false:N \l__knot_super_draft_bool
- },
- draft~ mode/strands/.code={%
- \bool_set_true:N \l__knot_draft_bool
- \bool_set_true:N \l__knot_super_draft_bool
- },
- draft/.is~ family,
- draft,
- crossing~ label/.style={
- overlay,
- fill=white,
- fill~ opacity=.5,
- text~ opacity=1,
- text=blue,
- pin~ edge={blue,<-}
- },
- strand~ label/.style={
- overlay,
- circle,
- draw=purple,
- fill=white,
- fill~ opacity=.5,
- text~ opacity=1,
- text=purple,
- inner~ sep=0pt
- },
-}
-% \end{macrocode}
-%
-% Wrapper around \Verb+\tikzset+ for applying keys from a token list, checking for if the given token list exists.
-% \begin{macrocode}
-\cs_new_nopar:Npn \knot_apply_style:N #1
-{
- \tl_if_exist:NT #1 {
- \exp_args:NV \tikzset #1
- }
-}
-\cs_generate_variant:Nn \knot_apply_style:N {c}
-% \end{macrocode}
-%
-%\begin{macro}{\flipcrossings}
-% The user can specify a comma separated list of crossings to flip.
-% \begin{macrocode}
-\NewDocumentCommand \flipcrossings {m}
-{
- \tikzset{knot~ diagram/flip~ crossing/.list={#1}}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\strand}
-% This is how the user specifies a strand of the knot.
-% \begin{macrocode}
-\NewDocumentCommand \strand { O{} }
-{
- \int_incr:N \l__knot_strands_int
- \tl_clear_new:c {l__knot_options_strand \int_use:N \l__knot_strands_int}
- \tl_set:cn {l__knot_options_strand \int_use:N \l__knot_strands_int} {#1}
- \path[#1,save~ spath=knot strand \int_use:N \l__knot_strands_int]
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{knot}
-% This is the wrapper environment that calls the knot generation code.
-% \begin{macrocode}
-\NewDocumentEnvironment{knot} { O{} }
-{
- \knot_initialise:n {#1}
-}
-{
- \knot_render:
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_initialise:n}
-% Set up some stuff before loading in the strands.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \knot_initialise:n #1
-{
- \tikzset{knot~ diagram/.cd,every~ knot~ diagram/.try,#1}
- \int_zero:N \l__knot_strands_int
- \tl_clear:N \l__knot_redraws_tl
- \seq_gclear:N \l__knot_nodes_seq
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_render:}
-% This is the code that starts the work of rendering the knot.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \knot_render:
-{
-% \end{macrocode}
-% Start a scope and reset the transformation (since all transformations have already been taken into account when defining the strands).
-% \begin{macrocode}
- \pgfscope
- \pgftransformreset
-% \end{macrocode}
-% Loop through the strands drawing each one for the first time.
-% \begin{macrocode}
- \int_step_function:nnnN {1} {1} {\l__knot_strands_int} \knot_draw_strand:n
-% \end{macrocode}
-% In super draft mode we don't do anything else.
-% \begin{macrocode}
- \bool_if:NF \l__knot_super_draft_bool
- {
-% \end{macrocode}
-% In draft mode we draw labels at the ends of the strands; this also handles splitting curves to avoid self-intersections of Bezier curves if that's requested.
-% \begin{macrocode}
- \int_step_function:nnnN {1} {1} {\l__knot_strands_int} \knot_draw_labels:n
-% \end{macrocode}
-% If we're considering self intersections we need to split the strands into filaments.
-% \begin{macrocode}
- \bool_if:NTF \l__knot_self_intersections_bool
- {
- \knot_split_strands:
- \int_set_eq:NN \l__knot_tmpa_int \l__knot_filaments_int
- \tl_set:Nn \l__knot_prefix_tl {filament}
- }
- {
- \int_set_eq:NN \l__knot_tmpa_int \l__knot_strands_int
- \tl_set:Nn \l__knot_prefix_tl {strand}
- }
-% \end{macrocode}
-% Initialise the intersection count.
-% \begin{macrocode}
- \int_gzero:N \l__knot_intersections_int
-% \end{macrocode}
-% If in draft mode we label the intersections, otherwise we just stick a coordinate at each one.
-% \begin{macrocode}
- \bool_if:NTF \l__knot_draft_bool
- {
- \tl_set:Nn \l__knot_node_tl {
- \exp_not:N \node[coordinate,
- pin={[node~ contents={\int_use:N \l__knot_intersections_int},knot~ diagram/draft/crossing~ label, knot~ diagram/draft/crossing~ \int_use:N \l__knot_intersections_int \c_space_tl label/.try]
- }]
- }
- }
- {
- \tl_set:Nn \l__knot_node_tl {\exp_not:N \node[coordinate]}
- }
-% \end{macrocode}
-% This double loop steps through the pieces (strands or filaments) and computes the intersections and does stuff with those.
-% \begin{macrocode}
- \int_step_variable:nnnNn {1} {1} {\l__knot_tmpa_int - 1} \l__knot_tmpa_tl
- {
- \int_step_variable:nnnNn {\tl_use:N \l__knot_tmpa_tl + 1} {1} {\l__knot_tmpa_int} \l__knot_tmpb_tl
- {
- \knot_intersections:VV \l__knot_tmpa_tl \l__knot_tmpb_tl
- }
- }
-% \end{macrocode}
-% If any redraws were requested, do them here.
-% \begin{macrocode}
- \tl_use:N \l__knot_redraws_tl
-% \end{macrocode}
-% Draw the crossing nodes
-% \begin{macrocode}
- \seq_use:Nn \l__knot_nodes_seq {}
- }
-% \end{macrocode}
-% Close the scope
-% \begin{macrocode}
- \endpgfscope
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_draw_strand:n}
-% This renders a strand using the options originally specified.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \knot_draw_strand:n #1
-{
- \pgfscope
- \group_begin:
- \tl_set:Nn \l_tmpa_tl {knot~ diagram/every~ strand/.try,}
- \tl_put_right:Nv \l_tmpa_tl {l__knot_options_strand #1}
- \tl_put_right:Nn \l_tmpa_tl {,knot~ diagram/only~ when~ rendering/.try,only~ when~ rendering/.try}
- \spath_bake_round:n {knot strand #1}
- \spath_tikz_path:Vn \l_tmpa_tl {knot strand #1}
- \group_end:
- \endpgfscope
-}
-\cs_generate_variant:Nn \tl_put_right:Nn {Nv}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_draw_labels:n}
-% Draw a label at each end of each strand, if in draft mode.
-% Also, if requested, split potentially self intersecting Bezier curves.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \knot_draw_labels:n #1
-{
- \bool_if:NT \l__knot_draft_bool
- {
- \spath_get:nnN {knot strand #1} {final point} \l__knot_tmpb_tl
- \dim_set:Nn \l__knot_tmpa_dim {\tl_item:Nn \l__knot_tmpb_tl {1}}
- \dim_set:Nn \l__knot_tmpb_dim {\tl_item:Nn \l__knot_tmpb_tl {2}}
- \node[knot~ diagram/draft/strand~label] at (\l__knot_tmpa_dim,\l__knot_tmpb_dim) {#1};
- \spath_get:nnN {knot strand #1} {initial point} \l__knot_tmpb_tl
- \dim_set:Nn \l__knot_tmpa_dim {\tl_item:Nn \l__knot_tmpb_tl {1}}
- \dim_set:Nn \l__knot_tmpb_dim {\tl_item:Nn \l__knot_tmpb_tl {2}}
- \node[knot~ diagram/draft/strand~label] at (\l__knot_tmpa_dim,\l__knot_tmpb_dim) {#1};
- }
- \bool_if:nT {
- \l__knot_self_intersections_bool
- &&
- \l__knot_splits_bool
- }
- {
- \tl_clear:N \l__knot_tmpa_tl
- \spath_map_segment_function:nN {knot strand #1} \knot_split_self_intersects:NN
- \spath_put:nnV {knot strand #1} {path} \l__knot_tmpa_tl
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_split_self_intersects:NN}
-% This is the macro that does the split.
-% Figuring out whether a Bezier cubic self intersects is apparently a difficult problem so we don't bother.
-% We compute a point such that if there is an intersection then it lies on either side of the point.
-% I don't recall where the formula came from!
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \knot_split_self_intersects:NN #1#2
-{
- \tl_case:NnF #1
- {
- \g__spath_curvetoa_tl
- {
- \fp_set:Nn \l_tmpa_fp
- {
- (\tl_item:Nn #2 {3} - 3 * \tl_item:Nn #2 {6} + 3 * \tl_item:Nn #2 {9} - \tl_item:Nn #2 {12})
- *
- (3 * \tl_item:Nn #2 {8} - 3 * \tl_item:Nn #2 {11})
- -
- (\tl_item:Nn #2 {2} - 3 * \tl_item:Nn #2 {5} + 3 * \tl_item:Nn #2 {8} - \tl_item:Nn #2 {11})
- *
- (3 * \tl_item:Nn #2 {9} - 3 * \tl_item:Nn #2 {12})
- }
- \fp_set:Nn \l_tmpb_fp
- {
- (\tl_item:Nn #2 {2} - 3 * \tl_item:Nn #2 {5} + 3 * \tl_item:Nn #2 {8} - \tl_item:Nn #2 {11})
- *
- (3 * \tl_item:Nn #2 {6} - 6 * \tl_item:Nn #2 {9} + 3 * \tl_item:Nn #2 {12})
- -
- (\tl_item:Nn #2 {3} - 3 * \tl_item:Nn #2 {6} + 3 * \tl_item:Nn #2 {9} - \tl_item:Nn #2 {12})
- *
- (3 * \tl_item:Nn #2 {5} - 6 * \tl_item:Nn #2 {8} + 3 * \tl_item:Nn #2 {11})
- }
- \fp_compare:nTF
- {
- \l_tmpb_fp != 0
- }
- {
- \fp_set:Nn \l_tmpa_fp {.5 * \l_tmpa_fp / \l_tmpb_fp}
- \fp_compare:nTF
- {
- 0 < \l_tmpa_fp && \l_tmpa_fp < 1
- }
- {
- \spath_split_curve:VVNN \l_tmpa_fp #2 \l_tmpa_tl \l_tmpb_tl
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl}
- \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl}
- \tl_set:Nx \l_tmpb_tl {\tl_tail:N \l_tmpb_tl}
- \tl_put_right:NV \l__knot_tmpa_tl \l_tmpa_tl
- \tl_put_right:NV \l__knot_tmpa_tl \l_tmpb_tl
- }
- {
- \tl_set_eq:NN \l_tmpa_tl #2
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_put_right:NV \l__knot_tmpa_tl \l_tmpa_tl
- }
- }
- {
- \tl_set_eq:NN \l_tmpa_tl #2
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_put_right:NV \l__knot_tmpa_tl \l_tmpa_tl
- }
- }
- \g__spath_lineto_tl
- {
- \tl_set_eq:NN \l_tmpa_tl #2
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_set:Nx \l_tmpa_tl {\tl_tail:N \l_tmpa_tl}
- \tl_put_right:NV \l__knot_tmpa_tl \l_tmpa_tl
- }
- }
- {
- \tl_put_right:NV \l__knot_tmpa_tl #2
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_intersections:nn}
-% This computes the intersections of two pieces and steps through them.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \knot_intersections:nn #1#2
-{
- \group_begin:
- \tl_set_eq:NN \l__knot_tmpa_tl \l__knot_prefix_tl
- \tl_put_right:Nn \l__knot_tmpa_tl {#1}
- \tl_set_eq:NN \l__knot_tmpb_tl \l__knot_prefix_tl
- \tl_put_right:Nn \l__knot_tmpb_tl {#2}
- \spath_get:nnN {knot \tl_use:N \l__knot_tmpa_tl} {path} \l__knot_tmpc_tl
- \spath_get:nnN {knot \tl_use:N \l__knot_tmpb_tl} {path} \l__knot_tmpd_tl
-
- \bool_if:nTF {
- \l__knot_save_bool
- &&
- \tl_if_exist_p:c {knot~ intersections~ \tl_use:N \l__knot_name_tl - \tl_use:N \l__knot_tmpa_tl - \tl_use:N \l__knot_tmpb_tl}
- }
- {
- \tl_use:c {knot~ intersections~ \tl_use:N \l__knot_name_tl - \tl_use:N \l__knot_tmpa_tl - \tl_use:N \l__knot_tmpb_tl}
- }
- {
-\pgfintersectionofpaths{\pgfsetpath\l__knot_tmpc_tl}{\pgfsetpath\l__knot_tmpd_tl}
-
- }
- \int_compare:nT {\pgfintersectionsolutions > 0}
- {
- \int_step_function:nnnN {1} {1} {\pgfintersectionsolutions} \knot_do_intersection:n
- }
- \knot_save_intersections:VV \l__knot_tmpa_tl \l__knot_tmpb_tl
- \group_end:
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_save_intersections:nn}
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \knot_save_intersections:nn #1#2
-{
- \bool_if:NT \l__knot_save_bool
- {
- \tl_clear:N \l__knot_aux_tl
- \tl_put_right:Nn \l__knot_aux_tl
- {
- \def\pgfintersectionsolutions
- }
- \tl_put_right:Nx \l__knot_aux_tl
- {
- {\int_eval:n {\pgfintersectionsolutions}}
- }
- \int_compare:nT {\pgfintersectionsolutions > 0}
- {
- \int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions}
- {
- \pgfpointintersectionsolution{##1}
- \dim_set:Nn \l__knot_tmpa_dim {\pgf@x}
- \dim_set:Nn \l__knot_tmpb_dim {\pgf@y}
- \tl_put_right:Nn \l__knot_aux_tl
- {
- \expandafter\def\csname pgfpoint@intersect@solution@##1\endcsname
- }
- \tl_put_right:Nx \l__knot_aux_tl
- {
- {\exp_not:N \pgf@x=\dim_use:N \l__knot_tmpa_dim\exp_not:N\relax\exp_not:N \pgf@y =\dim_use:N \l__knot_tmpb_dim\relax}
- }
- }
- \tl_set:Nn \l__knot_auxa_tl {\expandafter \gdef \csname knot~ intersections~}
- \tl_put_right:Nx \l__knot_auxa_tl {\tl_use:N \l__knot_name_tl - #1 - #2}
- \tl_put_right:Nn \l__knot_auxa_tl {\endcsname}
- \tl_put_right:Nx \l__knot_auxa_tl {{\tl_to_str:N \l__knot_aux_tl}}
- \protected@write\@auxout{}{\tl_to_str:N \l__knot_auxa_tl}
- }
- }
-}
-\cs_generate_variant:Nn \knot_save_intersections:nn {VV}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_do_intersection:n}
-% This handles a specific intersection.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \knot_do_intersection:n #1
-{
-% \end{macrocode}
-% Get the intersection coordinates.
-% \begin{macrocode}
- \pgfpointintersectionsolution{#1}
- \dim_set:Nn \l__knot_tmpa_dim {\pgf@x}
- \dim_set:Nn \l__knot_tmpb_dim {\pgf@y}
-% \end{macrocode}
-% If we're dealing with filaments, we can get false positives from the end points.
-% \begin{macrocode}
- \bool_set_false:N \l__knot_skip_bool
- \bool_if:NT \l__knot_self_intersections_bool
- {
-% \end{macrocode}
-% If one filament preceded the other, test for the intersection being at the relevant end point.
-% \begin{macrocode}
- \tl_set:Nn \l_tmpa_tl {knot previous}
- \tl_put_right:NV \l_tmpa_tl \l__knot_tmpa_tl
- \tl_set:Nv \l_tmpa_tl \l_tmpa_tl
- \tl_if_eq:NNT \l_tmpa_tl \l__knot_tmpb_tl
- {
- \knot_test_endpoint:VnT \l__knot_tmpb_tl {final point}
- {
- \bool_set_true:N \l__knot_skip_bool
- }
- }
-
- \tl_set:Nn \l_tmpa_tl {knot previous}
- \tl_put_right:NV \l_tmpa_tl \l__knot_tmpb_tl
- \tl_set:Nv \l_tmpa_tl \l_tmpa_tl
- \tl_if_eq:NNT \l_tmpa_tl \l__knot_tmpa_tl
- {
- \knot_test_endpoint:VnT \l__knot_tmpa_tl {final point}
- {
- \bool_set_true:N \l__knot_skip_bool
- }
- }
- }
-% \end{macrocode}
-% The user can also say that end points of filaments (or strands) should simply be ignored anyway.
-% \begin{macrocode}
- \bool_if:NT \l__knot_ignore_ends_bool
- {
- \knot_test_endpoint:VnT \l__knot_tmpa_tl {initial point}
- {
- \bool_set_true:N \l__knot_skip_bool
- }
- \knot_test_endpoint:VnT \l__knot_tmpa_tl {final point}
- {
- \bool_set_true:N \l__knot_skip_bool
- }
- \knot_test_endpoint:VnT \l__knot_tmpb_tl {initial point}
- {
- \bool_set_true:N \l__knot_skip_bool
- }
- \knot_test_endpoint:VnT \l__knot_tmpb_tl {final point}
- {
- \bool_set_true:N \l__knot_skip_bool
- }
- }
-% \end{macrocode}
-% Assuming that we passed all the above tests, we render the crossing.
-% \begin{macrocode}
- \bool_if:NF \l__knot_skip_bool
- {
-
- \int_gincr:N \l__knot_intersections_int
-% \end{macrocode}
-% This is the intersection test.
-% If the intersection finder finds too many, it might be useful to ignore some.
-% \begin{macrocode}
- \bool_if:nF
- {
- \tl_if_exist_p:c {l__knot_ignore_crossing_ \int_use:N
- \l__knot_intersections_int}
- &&
- ! \tl_if_empty_p:c {l__knot_ignore_crossing_ \int_use:N
- \l__knot_intersections_int}
- }
- {
-% \end{macrocode}
-% This is the flip test.
-% We only render one of the paths.
-% The ``flip'' swaps which one we render.
-% \begin{macrocode}
- \bool_if:nTF
- {
- \tl_if_exist_p:c {l__knot_crossing_ \int_use:N
- \l__knot_intersections_int}
- &&
- ! \tl_if_empty_p:c {l__knot_crossing_ \int_use:N
- \l__knot_intersections_int}
- }
- {
- \tl_set_eq:NN \l__knot_tmpg_tl \l__knot_tmpb_tl
- }
- {
- \tl_set_eq:NN \l__knot_tmpg_tl \l__knot_tmpa_tl
- }
-% \end{macrocode}
-% Now we know which one we're rendering, we test to see if we should also render its predecessor or successor to ensure that we render a path through the entire crossing region.
-% \begin{macrocode}
- \bool_if:NT \l__knot_self_intersections_bool
- {
- \knot_test_endpoint:VnT \l__knot_tmpg_tl {initial point}
- {
- \bool_set_true:N \l__knot_prepend_prev_bool
- }
- {
- \bool_set_false:N \l__knot_prepend_prev_bool
- }
- \knot_test_endpoint:VnT \l__knot_tmpg_tl {final point}
- {
- \bool_set_true:N \l__knot_append_next_bool
- }
- {
- \bool_set_false:N \l__knot_append_next_bool
- }
-% \end{macrocode}
-% If either of those tests succeeded, do the appending or prepending.
-% \begin{macrocode}
- \bool_if:nT
- {
- \l__knot_prepend_prev_bool || \l__knot_append_next_bool
- }
- {
- \spath_clone:nn {knot \tl_use:N \l__knot_tmpg_tl}
- {knot \tl_use:N \l__knot_prefix_tl -1}
-
- \tl_set_eq:cc {l__knot_options_ \tl_use:N \l__knot_prefix_tl -1} {l__knot_options_ \tl_use:N \l__knot_tmpg_tl}
-
- \bool_if:nT
- {
- \l__knot_prepend_prev_bool
- &&
- \tl_if_exist_p:c {knot previous \tl_use:N \l__knot_tmpg_tl}
- &&
- !\tl_if_empty_p:c {knot previous \tl_use:N \l__knot_tmpg_tl}
- }
- {
- \spath_prepend_no_move:nn {knot \tl_use:N \l__knot_prefix_tl -1} {knot \tl_use:c {knot previous \tl_use:N \l__knot_tmpg_tl}}
-% \end{macrocode}
-% If we split potentially self intersecting curves, we test to see if we should prepend yet another segment.
-% \begin{macrocode}
- \bool_if:nT
- {
- \l__knot_splits_bool
- &&
- \tl_if_exist_p:c {knot previous \tl_use:N \l__knot_tmpg_tl}
- &&
- !\tl_if_empty_p:c {knot previous \tl_use:N \l__knot_tmpg_tl}
- }
- {
- \knot_test_endpoint:vnT {knot previous \tl_use:N \l__knot_tmpg_tl} {initial point}
- {
- \spath_get:nnN {knot \tl_use:N \l__knot_prefix_tl -1} {path} \l_tmpa_tl
- \spath_prepend_no_move:nn {knot \tl_use:N \l__knot_prefix_tl -1} {knot \tl_use:c {knot previous \tl_use:c {knot previous \tl_use:N \l__knot_tmpg_tl}}}
- \spath_get:nnN {knot \tl_use:N \l__knot_prefix_tl -1} {path} \l_tmpa_tl
-
- }
- }
- }
-% \end{macrocode}
-% Now the same for appending.
-% \begin{macrocode}
- \bool_if:nT
- {
- \l__knot_append_next_bool
- &&
- \tl_if_exist_p:c {knot next \tl_use:N \l__knot_tmpg_tl}
- &&
- !\tl_if_empty_p:c {knot previous \tl_use:N \l__knot_tmpg_tl}
- }
- {
- \spath_append_no_move:nn {knot \tl_use:N \l__knot_prefix_tl -1} {knot \tl_use:c {knot next \tl_use:N \l__knot_tmpg_tl}}
- \bool_if:nT
- {
- \l__knot_splits_bool
- &&
- \tl_if_exist_p:c {knot previous \tl_use:N
- \l__knot_tmpg_tl}
- &&
- !\tl_if_empty_p:c {knot previous \tl_use:N \l__knot_tmpg_tl}
- }
- {
- \knot_test_endpoint:vnT {knot previous \tl_use:N \l__knot_tmpg_tl} {final point}
- {
- \spath_append_no_move:nn {knot \tl_use:N \l__knot_prefix_tl -1} {knot \tl_use:c {knot next \tl_use:c {knot next \tl_use:N \l__knot_tmpg_tl}}}
-
- }
- }
- }
-
- \tl_set:Nn \l__knot_tmpg_tl {\tl_use:N \l__knot_prefix_tl -1}
- }
- }
-% \end{macrocode}
-% Now we render the crossing.
-% \begin{macrocode}
- \pgfscope
- \group_begin:
- \tikzset{knot~ diagram/every~ intersection/.try, every~ intersection/.try, knot~ diagram/intersection~ \int_use:N \l__knot_intersections_int/.try}
- \knot_draw_crossing:nVV {\tl_use:N \l__knot_tmpg_tl} \l__knot_tmpa_dim \l__knot_tmpb_dim
- \group_end:
- \endpgfscope
-% \end{macrocode}
-% This ends the boolean as to whether to consider the intersection at all
-% \begin{macrocode}
- }
-% \end{macrocode}
-% And stick a coordinate possibly with a label at the crossing.
-% \begin{macrocode}
- \seq_gpush:Nx \l__knot_nodes_seq { \l__knot_node_tl (\l__knot_name_tl \c_space_tl \int_use:N \l__knot_intersections_int) at (\dim_use:N \l__knot_tmpa_dim, \dim_use:N \l__knot_tmpb_dim) {};}
-
- }
-}
-
-\cs_generate_variant:Nn \knot_intersections:nn {VV}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_test_endpoint:N}
-% Test whether the point is near the intersection point.
-% \begin{macrocode}
-\prg_new_conditional:Npnn \knot_test_endpoint:N #1 {p,T,F,TF}
-{
- \dim_compare:nTF
- {
- \dim_abs:n { \l__knot_tmpa_dim - \tl_item:Nn #1 {1}}
- +
- \dim_abs:n { \l__knot_tmpb_dim - \tl_item:Nn #1 {2}}
- <
- \l__knot_tolerance_dim
- }
- {
- \prg_return_true:
- }
- {
- \prg_return_false:
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_test_endpoint:nn}
-% Wrapper around the above.
-% \begin{macrocode}
-\prg_new_protected_conditional:Npnn \knot_test_endpoint:nn #1#2 {T,F,TF}
-{
- \spath_get:nnN {knot #1} {#2} \l__knot_tmpd_tl
- \knot_test_endpoint:NTF \l__knot_tmpd_tl
- {
- \prg_return_true:
- }
- {
- \prg_return_false:
- }
-}
-
-\cs_generate_variant:Nn \knot_test_endpoint:nnT {VnT,vnT}
-\cs_generate_variant:Nn \knot_test_endpoint:nnF {VnF,vnF}
-\cs_generate_variant:Nn \knot_test_endpoint:nnTF {VnTF,vnTF}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_draw_crossing:nnn}
-% This is the code that actually renders a crossing.
-% \begin{macrocode}
-\cs_new_nopar:Npn \knot_draw_crossing:nnn #1#2#3
-{
- \group_begin:
- \pgfscope
- \path[knot~ diagram/background~ clip] (#2, #3) circle[radius=\l__knot_clip_bg_radius_dim];
-
- \tl_set:Nn \l_tmpa_tl {knot~ diagram/every~ strand/.try,}
- \tl_if_exist:cT {l__knot_options_ #1}
- {
- \tl_put_right:Nv \l_tmpa_tl {l__knot_options_ #1}
- }
- \tl_put_right:Nn \l_tmpa_tl {,knotbg,line~ width= \tl_use:N \l__knot_clip_width_tl * \pgflinewidth}
- \spath_tikz_path:Vn \l_tmpa_tl {knot #1}
-
- \endpgfscope
-
- \pgfscope
- \path[knot~ diagram/clip] (#2, #3) circle[radius=\l__knot_clip_draw_radius_dim];
-
- \tl_set:Nn \l_tmpa_tl {knot~ diagram/every~ strand/.try,}
- \tl_if_exist:cT {l__knot_options_ #1}
- {
- \tl_put_right:Nv \l_tmpa_tl {l__knot_options_ #1}
- }
- \tl_put_right:Nn \l_tmpa_tl {,knot~ diagram/only~ when~ rendering/.try,only~ when~ rendering/.try}
- \spath_tikz_path:Vn \l_tmpa_tl {knot #1}
-
- \endpgfscope
- \group_end:
-}
-
-\cs_generate_variant:Nn \knot_draw_crossing:nnn {nVV}
-
-\cs_new_nopar:Npn \knot_draw_crossing:nn #1#2
-{
- \tikz@scan@one@point\pgfutil@firstofone #2 \relax
- \knot_draw_crossing:nVV {#1} \pgf@x \pgf@y
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_split_strands:}
-% This, and the following macros, are for splitting strands into filaments.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \knot_split_strands:
-{
- \int_gzero:N \l__knot_filaments_int
- \int_step_function:nnnN {1} {1} {\l__knot_strands_int} \knot_split_strand:n
- \int_step_function:nnnN {1} {1} {\l__knot_filaments_int} \knot_compute_nexts:n
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_compute_nexts:n}
-% Each filament needs to know its predecessor and successor.
-% We work out the predecessors as we go along, this fills in the successors.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \knot_compute_nexts:n #1
-{
- \tl_clear_new:c {knot next \tl_use:c {knot previous filament #1}}
- \tl_set:cn {knot next \tl_use:c {knot previous filament #1}} {filament #1}
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_split_strand:n}
-% Sets up the split for a single strand.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \knot_split_strand:n #1
-{
- \int_set_eq:NN \l__knot_component_start_int \l__knot_filaments_int
- \int_incr:N \l__knot_component_start_int
- \tl_set_eq:Nc \l__knot_tmpa_tl {l__knot_options_strand #1}
- \spath_map_segment_function:nN {knot strand #1} \knot_save_filament:NN
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\knot_save_filament:NN}
-% Saves a filament as a new \Verb+spath+ object.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \knot_save_filament:NN #1#2
-{
- \tl_case:NnF #1
- {
- \g__spath_moveto_tl
- {
- \int_compare:nT {\l__knot_component_start_int < \l__knot_filaments_int}
- {
- \int_set_eq:NN \l__knot_component_start_int \l__knot_filaments_int
- }
- }
- \g__spath_lineto_tl
- {
- \int_gincr:N \l__knot_filaments_int
- \spath_clear_new:n {knot filament \int_use:N \l__knot_filaments_int}
- \spath_put:nnV {knot filament \int_use:N \l__knot_filaments_int} {path} #2
- \tl_set_eq:cN {l__knot_options_filament \int_use:N \l__knot_filaments_int} \l__knot_tmpa_tl
-
- \tl_clear_new:c {knot previous filament \int_use:N \l__knot_filaments_int}
- \int_compare:nF {\l__knot_component_start_int == \l__knot_filaments_int}
- {
- \tl_set:cx {knot previous filament \int_use:N \l__knot_filaments_int} {filament \int_eval:n {\l__knot_filaments_int - 1}}
- }
- }
- \g__spath_curvetoa_tl
- {
- \int_gincr:N \l__knot_filaments_int
- \spath_clear_new:n {knot filament \int_use:N \l__knot_filaments_int}
- \spath_put:nnV {knot filament \int_use:N \l__knot_filaments_int} {path} #2
- \tl_set_eq:cN {l__knot_options_filament \int_use:N \l__knot_filaments_int} \l__knot_tmpa_tl
-
- \tl_clear_new:c {knot previous filament \int_use:N \l__knot_filaments_int}
- \int_compare:nF {\l__knot_component_start_int == \l__knot_filaments_int}
- {
- \tl_set:cx {knot previous filament \int_use:N \l__knot_filaments_int} {filament \int_eval:n {\l__knot_filaments_int - 1}}
- }
- }
- \g__spath_closepath_tl
- {
- \tl_show:N #2
- \int_gincr:N \l__knot_filaments_int
- \spath_clear_new:n {knot filament \int_use:N \l__knot_filaments_int}
- \tl_clear:N \l_tmpa_tl
- \tl_put_right:Nx {\tl_item:Nn #2 {1}\tl_item:Nn #2 {2}\tl_item:Nn #2 {3}}
- \tl_put_right:NV \l_tmpa_tl \g__spath_lineto_tl
- \tl_put_right:Nx {\tl_item:Nn #2 {5}\tl_item:Nn #2 {6}}
- \tl_show:N \l_tmpa_tl
- \spath_put:nnV {knot filament \int_use:N \l__knot_filaments_int} {path} \l_tmpa_tl
- \tl_set_eq:cN {l__knot_options_filament \int_use:N \l__knot_filaments_int} \l__knot_tmpa_tl
- \tl_clear_new:c {knot previous filament \int_use:N \l__knot_filaments_int}
- \int_compare:nF {\l__knot_component_start_int == \l__knot_filaments_int}
- {
- \tl_set:cx {knot previous filament \int_use:N \l__knot_filaments_int} {filament \int_eval:n {\l__knot_filaments_int - 1}}
- }
- \tl_set:cx {knot previous filament \int_use:N \l__knot_component_start_int} {filament \int_use:N \l__knot_filaments_int}
- }
- }
- {
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\redraw}
-% The user can redraw segments of the strands at specific locations.
-% \begin{macrocode}
-\NewDocumentCommand \redraw { m m }
-{
-% \tikz@scan@one@point\pgfutil@firstofone #2 \relax
- \tl_put_right:Nn \l__knot_redraws_tl {\knot_draw_crossing:nn}
- \tl_put_right:Nx \l__knot_redraws_tl {
- {strand #1} {#2}% {\dim_use:N \pgf@x} {\dim_use:N \pgf@y}
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\ExplSyntaxOff
-% \end{macrocode}
-%
-% \begin{macro}{\pgf@sh@@knotanchor}
-% Add the extra anchors for the knot crossing nodes.
-% \begin{macrocode}
-\def\pgf@sh@@knotanchor#1#2{%
- \anchor{#2 north west}{%
- \csname pgf@anchor@knot #1@north west\endcsname%
- \pgf@x=#2\pgf@x%
- \pgf@y=#2\pgf@y%
- }%
- \anchor{#2 north east}{%
- \csname pgf@anchor@knot #1@north east\endcsname%
- \pgf@x=#2\pgf@x%
- \pgf@y=#2\pgf@y%
- }%
- \anchor{#2 south west}{%
- \csname pgf@anchor@knot #1@south west\endcsname%
- \pgf@x=#2\pgf@x%
- \pgf@y=#2\pgf@y%
- }%
- \anchor{#2 south east}{%
- \csname pgf@anchor@knot #1@south east\endcsname%
- \pgf@x=#2\pgf@x%
- \pgf@y=#2\pgf@y%
- }%
- \anchor{#2 north}{%
- \csname pgf@anchor@knot #1@north\endcsname%
- \pgf@x=#2\pgf@x%
- \pgf@y=#2\pgf@y%
- }%
- \anchor{#2 east}{%
- \csname pgf@anchor@knot #1@east\endcsname%
- \pgf@x=#2\pgf@x%
- \pgf@y=#2\pgf@y%
- }%
- \anchor{#2 west}{%
- \csname pgf@anchor@knot #1@west\endcsname%
- \pgf@x=#2\pgf@x%
- \pgf@y=#2\pgf@y%
- }%
- \anchor{#2 south}{%
- \csname pgf@anchor@knot #1@south\endcsname%
- \pgf@x=#2\pgf@x%
- \pgf@y=#2\pgf@y%
- }%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{knot crossing}
-% \begin{macrocode}
-\pgfdeclareshape{knot crossing}
-{
- \inheritsavedanchors[from=circle] % this is nearly a circle
- \inheritanchorborder[from=circle]
- \inheritanchor[from=circle]{north}
- \inheritanchor[from=circle]{north west}
- \inheritanchor[from=circle]{north east}
- \inheritanchor[from=circle]{center}
- \inheritanchor[from=circle]{west}
- \inheritanchor[from=circle]{east}
- \inheritanchor[from=circle]{mid}
- \inheritanchor[from=circle]{mid west}
- \inheritanchor[from=circle]{mid east}
- \inheritanchor[from=circle]{base}
- \inheritanchor[from=circle]{base west}
- \inheritanchor[from=circle]{base east}
- \inheritanchor[from=circle]{south}
- \inheritanchor[from=circle]{south west}
- \inheritanchor[from=circle]{south east}
- \inheritanchorborder[from=circle]
- \pgf@sh@@knotanchor{crossing}{2}
- \pgf@sh@@knotanchor{crossing}{3}
- \pgf@sh@@knotanchor{crossing}{4}
- \pgf@sh@@knotanchor{crossing}{8}
- \pgf@sh@@knotanchor{crossing}{16}
- \pgf@sh@@knotanchor{crossing}{32}
- \backgroundpath{
- \pgfutil@tempdima=\radius%
- \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
- \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
- \ifdim\pgf@xb<\pgf@yb%
- \advance\pgfutil@tempdima by-\pgf@yb%
- \else%
- \advance\pgfutil@tempdima by-\pgf@xb%
- \fi%
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{knot over cross}
-% \begin{macrocode}
-\pgfdeclareshape{knot over cross}
-{
- \inheritsavedanchors[from=rectangle] % this is nearly a circle
- \inheritanchorborder[from=rectangle]
- \inheritanchor[from=rectangle]{north}
- \inheritanchor[from=rectangle]{north west}
- \inheritanchor[from=rectangle]{north east}
- \inheritanchor[from=rectangle]{center}
- \inheritanchor[from=rectangle]{west}
- \inheritanchor[from=rectangle]{east}
- \inheritanchor[from=rectangle]{mid}
- \inheritanchor[from=rectangle]{mid west}
- \inheritanchor[from=rectangle]{mid east}
- \inheritanchor[from=rectangle]{base}
- \inheritanchor[from=rectangle]{base west}
- \inheritanchor[from=rectangle]{base east}
- \inheritanchor[from=rectangle]{south}
- \inheritanchor[from=rectangle]{south west}
- \inheritanchor[from=rectangle]{south east}
- \inheritanchorborder[from=rectangle]
- \backgroundpath{
- \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
- \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
- \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
- \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
- }
- \foregroundpath{
-% store lower right in xa/ya and upper right in xb/yb
- \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
- \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
- \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
- \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{knot under cross}
-% \begin{macrocode}
-\pgfdeclareshape{knot under cross}
-{
- \inheritsavedanchors[from=rectangle] % this is nearly a circle
- \inheritanchorborder[from=rectangle]
- \inheritanchor[from=rectangle]{north}
- \inheritanchor[from=rectangle]{north west}
- \inheritanchor[from=rectangle]{north east}
- \inheritanchor[from=rectangle]{center}
- \inheritanchor[from=rectangle]{west}
- \inheritanchor[from=rectangle]{east}
- \inheritanchor[from=rectangle]{mid}
- \inheritanchor[from=rectangle]{mid west}
- \inheritanchor[from=rectangle]{mid east}
- \inheritanchor[from=rectangle]{base}
- \inheritanchor[from=rectangle]{base west}
- \inheritanchor[from=rectangle]{base east}
- \inheritanchor[from=rectangle]{south}
- \inheritanchor[from=rectangle]{south west}
- \inheritanchor[from=rectangle]{south east}
- \inheritanchorborder[from=rectangle]
- \backgroundpath{
- \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
- \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
- \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
- \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
- }
- \foregroundpath{
-% store lower right in xa/ya and upper right in xb/yb
- \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
- \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
- \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
- \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{knot vert}
-% \begin{macrocode}
-\pgfdeclareshape{knot vert}
-{
- \inheritsavedanchors[from=rectangle] % this is nearly a circle
- \inheritanchorborder[from=rectangle]
- \inheritanchor[from=rectangle]{north}
- \inheritanchor[from=rectangle]{north west}
- \inheritanchor[from=rectangle]{north east}
- \inheritanchor[from=rectangle]{center}
- \inheritanchor[from=rectangle]{west}
- \inheritanchor[from=rectangle]{east}
- \inheritanchor[from=rectangle]{mid}
- \inheritanchor[from=rectangle]{mid west}
- \inheritanchor[from=rectangle]{mid east}
- \inheritanchor[from=rectangle]{base}
- \inheritanchor[from=rectangle]{base west}
- \inheritanchor[from=rectangle]{base east}
- \inheritanchor[from=rectangle]{south}
- \inheritanchor[from=rectangle]{south west}
- \inheritanchor[from=rectangle]{south east}
- \inheritanchorborder[from=rectangle]
- \backgroundpath{
-% store lower right in xa/ya and upper right in xb/yb
- \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
- \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
- \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
- \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
- \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
- \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{knot horiz}
-% \begin{macrocode}
-\pgfdeclareshape{knot horiz}
-{
- \inheritsavedanchors[from=rectangle] % this is nearly a circle
- \inheritanchorborder[from=rectangle]
- \inheritanchor[from=rectangle]{north}
- \inheritanchor[from=rectangle]{north west}
- \inheritanchor[from=rectangle]{north east}
- \inheritanchor[from=rectangle]{center}
- \inheritanchor[from=rectangle]{west}
- \inheritanchor[from=rectangle]{east}
- \inheritanchor[from=rectangle]{mid}
- \inheritanchor[from=rectangle]{mid west}
- \inheritanchor[from=rectangle]{mid east}
- \inheritanchor[from=rectangle]{base}
- \inheritanchor[from=rectangle]{base west}
- \inheritanchor[from=rectangle]{base east}
- \inheritanchor[from=rectangle]{south}
- \inheritanchor[from=rectangle]{south west}
- \inheritanchor[from=rectangle]{south east}
- \inheritanchorborder[from=rectangle]
- \foregroundpath{
-% store lower right in xa/ya and upper right in xb/yb
- \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
- \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
- \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
- \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
- \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
- \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
- }
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \iffalse
-%</knots>
-% \fi
-%\Finale
-\endinput
diff --git a/Master/texmf-dist/source/latex/spath3/spath3_code.dtx b/Master/texmf-dist/source/latex/spath3/spath3_code.dtx
new file mode 100644
index 00000000000..621ab942f7b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/spath3/spath3_code.dtx
@@ -0,0 +1,8920 @@
+% \iffalse meta-comment
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+----------------------------------------------------------------
+spath3 --- LaTeX3 functions for manipulating PGF soft paths
+E-mail: loopspace@mathforge.org
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
+This package defines some functions used to manipulate PGFs soft paths.
+As applications of its use, included are a package for drawing calligraphic paths and a package for drawing knot diagrams.
+%</readme>
+%<*internal>
+\fi
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+ \expandafter\begingroup
+\fi
+%</internal>
+%<*install>
+\input l3docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+----------------------------------------------------------------
+spath3 --- Functions for manipulating PGF soft paths
+E-mail: loopspace@mathforge.org
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
+\endpreamble
+\postamble
+
+Copyright (C) 2011-2021 by Andrew Stacey <loopspace@mathforge.org>
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+Andrew Stacey.
+
+This work consists of the files spath3_code.dtx
+ calligraphy_doc.tex
+ knots_doc.tex
+ spath3.tex
+and the derived files spath3.ins,
+ spath3_code.pdf,
+ spath3.sty,
+ tikzlibrarycalligraphy.code.tex
+ tikzlibraryknots.code.tex
+ tikzlibraryspath3.code.tex
+ calligraphy.pdf
+ knots.pdf
+ spath3.pdf
+ README
+
+\endpostamble
+\usedir{tex/latex/spath3}
+\generate{
+ \file{spath3.sty}{\from{\jobname.dtx}{spath3}}
+}
+\generate{
+ \file{tikzlibrarycalligraphy.code.tex}{\from{\jobname.dtx}{calligraphy}}
+}
+\generate{
+ \file{tikzlibraryknots.code.tex}{\from{\jobname.dtx}{knots}}
+}
+\generate{
+ \file{tikzlibraryspath3.code.tex}{\from{\jobname.dtx}{tikzspath3}}
+}
+%</install>
+%<install>\endbatchfile
+%<*internal>
+\usedir{source/latex/spath3}
+\generate{
+ \file{\jobname.ins}{\from{\jobname.dtx}{install}}
+}
+\nopreamble\nopostamble
+\usedir{doc/latex/demopkg}
+\generate{
+ \file{README.txt}{\from{\jobname.dtx}{readme}}
+}
+\ifx\fmtname\nameofplainTeX
+ \expandafter\endbatchfile
+\else
+ \expandafter\endgroup
+\fi
+%</internal>
+%<*driver>
+\documentclass[full]{l3doc}
+\usepackage[T1]{fontenc}
+\usepackage{lmodern}
+%\usepackage{morefloats}
+\usepackage{tikz}
+\usepackage{trace}
+\usepackage{spath3}
+%\traceoff
+%\usepackage[numbered]{hypdoc}
+\definecolor{lstbgcolor}{rgb}{0.9,0.9,0.9}
+
+\usepackage{listings}
+\lstloadlanguages{[LaTeX]TeX}
+\lstset{
+ breakatwhitespace=true,
+ breaklines=true,
+ language=[LaTeX]TeX,
+ basicstyle=\small\ttfamily,
+ keepspaces=true,
+ columns=fullflexible
+}
+
+\usepackage{fancyvrb}
+
+\newenvironment{example}
+ {\VerbatimEnvironment
+ \begin{VerbatimOut}[gobble=2]{example.out}}
+ {\end{VerbatimOut}
+ \begin{center}
+% \setlength{\parindent}{0pt}
+ \fbox{\begin{minipage}{.9\linewidth}
+ \lstinputlisting[]{example.out}
+ \end{minipage}}
+ \fbox{\begin{minipage}{.9\linewidth}
+ \centering
+ \input{example.out}
+ \end{minipage}}
+\end{center}
+}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{8404}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+% \changes{1.0}{2011/05/03}{Converted to DTX file}
+% \changes{1.1}{2016/02/19}{Fixes due to changes in LaTeX3}
+% \changes{1.2}{2019/02/12}{More fixes due to changes in LaTeX3}
+% \changes{1.4}{2020/12/18}{A fair amount of code reimplementation and reorganisation, together with defining TikZ keys to make functions available for use.}
+% \changes{2.0}{2021/01/19}{Refactored the code to remove the OO approach and make it functional, introduced the spath3 TikZ library to provide a user interface.}
+% \changes{2.2}{2021/02/05}{Bugfixes and improvements, mainly with regard to the intersection and splitting routines.}
+%
+% \DoNotIndex{\newcommand,\newenvironment}
+%
+% \pdfstringdefDisableCommands{%
+% \def\\{}%
+% \def\url#1{<#1>}%
+% }
+%
+% \providecommand*{\url}{\texttt}
+% \GetFileInfo{spath3.sty}
+% \title{The \textsf{spath3} package: code}
+% \author{Andrew Stacey \\ \url{loopspace@mathforge.org}}
+% \date{\fileversion~from \filedate}
+%
+%
+% \maketitle
+%
+%
+% \section{Introduction}
+%
+% The \Verb+spath3+ package is intended as a library for manipulating PGF's \emph{soft paths}.
+% In between defining a path and using it, PGF stores a path as a \emph{soft path} where all the defining structure has been resolved into the basic operations but these have not yet been written to the output file.
+% They can therefore still be manipulated by \TeX, and as they have a very rigid form (and limited vocabulary), they are relatively easy to modify.
+% This package provides some methods for working with these paths.
+% It was originally not really intended for use by end users but as a foundation on which other packages can be built.
+% However, over the years I've found myself using it at ever higher levels and so a set of interfaces has been designed using TikZ keys.
+%
+% It also provides the engine that drives a few other packages, such as the \Verb+calligraphy+, \Verb+knot+, and \Verb+penrose+ packages.
+% The first two of these are subpackages of this one.
+% The \Verb+calligraphy+ package simulates a calligraphic pen stroking a path.
+% The \Verb+knots+ package can be used to draw knot (and similar) diagrams.
+%
+% For usage, see the documentation of the following packages (\Verb+texdoc <package>+):
+%
+% \begin{itemize}
+% \item \Verb+calligraphy+
+% \item \Verb+knots+
+% \item \Verb+penrose+
+% \item \Verb+spath3+ (\emph{this} document is the code, there's another which focusses on usage)
+% \end{itemize}
+%
+% \section{Technical Details}
+%
+% The format of a soft path is a sequence of triples of the form \Verb+\macro {dimension}{dimension}+.
+% The macro is one of a short list, the dimensions are coordinates in points.
+% There are certain further restrictions, particularly that every path must begin with a \Verb+move to+, and B\'ezier curves consist of three triples.
+%
+% In the original implementation, I wrapped this token list in a \Verb+prop+ to store useful information along with the path.
+% Over time, this additional structure has proved a little unwieldy and I've pared it back to working primarily with the original soft path as a token list.
+%
+% A frequent use of this package is to break a path into pieces and do something with each of those pieces.
+% To that end, there are various words that I use to describe the levels of the structure of a path.
+%
+% At the top level is the path itself.
+% At the bottom level are the triples of the form \Verb+\macro{dim}{dim}+, as described above.
+% In between these are the \emph{segments} and \emph{components}.
+%
+% A \emph{segment} is a minimal drawing piece.
+% Thus it might be a straight line or a B\'ezier curve.
+% When a path is broken into segments then each segment is a complete path so it isn't simply a selection of triples from the original path.
+%
+% A \emph{component} is a minimal connected section of the path.
+% So every component starts with a move command and continues until the next move command.
+% For ease of implementation (and to enable a copperplate pen in the calligraphy package!), an isolated move is considered as a component.
+% Thus the following path consists of three components:
+%
+% \begin{Verbatim}
+% \path (0,0) -- (1,0) (2,0) (3,0) to[out=0,in=90] (4,0);
+% \end{Verbatim}
+%
+% \StopEventually{}
+%
+% \section{Implementation}
+%
+% \iffalse
+%<*spath3>
+% \fi
+% \subsection{Initialisation}
+%
+% \begin{macrocode}
+%<@@=spath>
+% \end{macrocode}
+%
+% Load the \LaTeX3 foundation and register us as a \LaTeX3\ package.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{expl3}
+\RequirePackage{pgf}
+\ProvidesExplPackage {spath3} {2021/02/05} {2.2} {Functions for
+manipulating PGF soft paths}
+\RequirePackage{xparse}
+% \end{macrocode}
+%
+% Utilities copied from \url{https://github.com/loopspace/LaTeX3-Utilities} for adding something in braces to a token list.
+% I find I use this quite a lot in my packages.
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_tl_put_right_braced:Nn
+{
+ \tl_put_right:Nn #1 { { #2 } }
+}
+\cs_generate_variant:Nn \@@_tl_put_right_braced:Nn { NV, cV, cv, Nx, cx }
+
+\cs_new_protected:Nn \@@_tl_gput_right_braced:Nn
+{
+ \tl_gput_right:Nn #1 { { #2 } }
+}
+\cs_generate_variant:Nn \@@_tl_gput_right_braced:Nn { NV, cV, cv, Nx, cx }
+\cs_new_protected:Nn \@@_tl_put_left_braced:Nn
+{
+ \tl_put_left:Nn #1 { { #2 } }
+}
+\cs_generate_variant:Nn \@@_tl_put_left_braced:Nn { NV, cV, cv, Nx, cx }
+
+\cs_new_protected:Nn \@@_tl_gput_left_braced:Nn
+{
+ \tl_gput_left:Nn #1 { { #2 } }
+}
+\cs_generate_variant:Nn \@@_tl_gput_left_braced:Nn { NV, cV, cv, Nx, cx }
+% \end{macrocode}
+%
+%
+% I had to think a bit about how to get \TeX\ to work the way I wanted.
+% I'm really defining \emph{functions} but \TeX\ doesn't really have that concept, even with all the amazing \LaTeX3 stuff.
+% The main issue I had was with scoping and return values.
+% By default, \TeX\ functions aren't scoped -- they work on the same level as the calling functions.
+% To protect the internals from being overwritten, each core function works inside a group.
+% But then I have to work to get the answer out of it.
+% So each of my core functions finishes by storing its return value in an appropriate \Verb+output+ variable.
+% The core functions are then wrapped in a more user friendly interface that will take that output and assign it to a variable.
+% This also means that I can deal with local and global versions without duplicating code.
+%
+% \begin{macrocode}
+\tl_new:N \g_@@_output_tl
+\int_new:N \g_@@_output_int
+\seq_new:N \g_@@_output_seq
+\bool_new:N \g_@@_output_bool
+% \end{macrocode}
+%
+% To avoid creating vast numbers of variables, we provide ourselves with a few that we reuse frequently.
+% For that reason, most of them don't have very exciting names.
+%
+% These are general purpose variables.
+% \begin{macrocode}
+\tl_new:N \l_@@_tmpa_tl
+\tl_new:N \l_@@_tmpb_tl
+\tl_new:N \l_@@_tmpc_tl
+\tl_new:N \l_@@_tmpd_tl
+\tl_new:N \l_@@_tmpe_tl
+\tl_new:N \l_@@_tmpf_tl
+\tl_new:N \l_@@_tmpg_tl
+\tl_new:N \l_@@_tmph_tl
+\tl_new:N \l_@@_tmpi_tl
+
+\seq_new:N \l_@@_tmpa_seq
+\seq_new:N \l_@@_tmpb_seq
+\seq_new:N \l_@@_tmpc_seq
+
+\dim_new:N \l_@@_tmpa_dim
+\dim_new:N \l_@@_tmpb_dim
+
+\fp_new:N \l_@@_tmpa_fp
+\fp_new:N \l_@@_tmpb_fp
+\fp_new:N \l_@@_tmpc_fp
+
+\int_new:N \l_@@_tmpa_int
+\int_new:N \l_@@_tmpb_int
+
+\bool_new:N \l_@@_tmpa_bool
+% \end{macrocode}
+%
+% Whenever I need more than two \Verb+dim+ variables it is because I need to remember the position of a move.
+%
+% \begin{macrocode}
+\dim_new:N \l_@@_move_x_dim
+\dim_new:N \l_@@_move_y_dim
+% \end{macrocode}
+%
+% Closed paths often need special handling.
+% When it's needed, this will say whether the path is closed or not.
+%
+% \begin{macrocode}
+\bool_new:N \l_@@_closed_bool
+% \end{macrocode}
+%
+% The intersection routine can't happen inside a group so we need two token lists to hold the paths that we'll intersect.
+%
+% \begin{macrocode}
+\tl_new:N \l_@@_intersecta_tl
+\tl_new:N \l_@@_intersectb_tl
+% \end{macrocode}
+%
+% We need to be able to compare against the macros that can occur in a soft path so these token lists contain them.
+% These are global constants so that they can be used in other packages.
+% \begin{macrocode}
+\tl_const:Nn \c_spath_moveto_tl {\pgfsyssoftpath@movetotoken}
+\tl_const:Nn \c_spath_lineto_tl {\pgfsyssoftpath@linetotoken}
+\tl_const:Nn \c_spath_curveto_tl {\pgfsyssoftpath@curvetotoken}
+\tl_const:Nn \c_spath_curvetoa_tl {\pgfsyssoftpath@curvetosupportatoken}
+\tl_const:Nn \c_spath_curvetob_tl {\pgfsyssoftpath@curvetosupportbtoken}
+\tl_const:Nn \c_spath_closepath_tl {\pgfsyssoftpath@closepathtoken}
+% \end{macrocode}
+%
+% We will want to be able to use anonymous spaths internally, so we create a global counter that we can use to refer to them.
+% \begin{macrocode}
+\int_new:N \g_@@_anon_int
+\int_gzero:N \g_@@_anon_int
+% \end{macrocode}
+%
+% And some error messages
+% \begin{macrocode}
+\msg_new:nnn { spath3 } { unknown path construction }
+{ The~ path~ construction~ element~ #1~ is~ not~ currently~ supported.}
+% \end{macrocode}
+%
+%
+% \subsection{Functional Implementation}
+%
+% In the functional approach, we start with a token list containing a soft path and do something to it (either calculate some information or manipulate it in some fashion).
+% We then store that information, or the manipulated path, in an appropriate macro.
+% The macro to store it in is the first argument.
+% These functions occur in two versions, the one with the \texttt{g} makes the assignment global.
+%
+% \begin{macro}[internal]{
+% \spath_segments_to_seq:Nn,
+% \spath_segments_gto_seq:Nn
+%}
+% Splits a soft path into \emph{segments}, storing the result in a sequence.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_segments_to_seq:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_clear:N \l_@@_tmpb_tl
+ \seq_clear:N \l_@@_tmpa_seq
+ \dim_zero:N \l_@@_tmpa_dim
+ \dim_zero:N \l_@@_tmpb_dim
+
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l_@@_tmpa_tl
+ }
+ {
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \tl_case:NnF \l_@@_tmpc_tl
+ {
+ \c_spath_moveto_tl
+ {
+ \tl_set_eq:NN \l_@@_tmpb_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}}
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \tl_put_right:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \tl_set:Nx \l_@@_tmpd_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_if_eq:NNF \l_@@_tmpd_tl \c_spath_moveto_tl
+ {
+ \tl_clear:N \l_@@_tmpb_tl
+ }
+
+ }
+
+ \c_spath_lineto_tl
+ {
+ \tl_set_eq:NN \l_@@_tmpb_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_use:N \l_@@_tmpa_dim}
+ {\dim_use:N \l_@@_tmpb_dim}
+ }
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_lineto_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}}
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \tl_put_right:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ }
+
+ \c_spath_curvetoa_tl
+ {
+ \tl_set_eq:NN \l_@@_tmpb_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_use:N \l_@@_tmpa_dim}
+ {\dim_use:N \l_@@_tmpb_dim}
+ }
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_curvetoa_tl
+
+ \prg_replicate:nn {2} {
+ \tl_put_right:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \tl_put_right:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \tl_put_right:Nx \l_@@_tmpb_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+
+ \tl_put_right:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}}
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \tl_put_right:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ }
+
+ \c_spath_closepath_tl
+ {
+ \tl_set_eq:NN \l_@@_tmpb_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_use:N \l_@@_tmpa_dim}
+ {\dim_use:N \l_@@_tmpb_dim}
+ }
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_lineto_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}}
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \tl_put_right:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ }
+
+ }
+ {
+
+ \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_tmpc_tl
+ \tl_put_right:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}}
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \tl_put_right:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ }
+
+ \tl_if_empty:NF \l_@@_tmpb_tl
+ {
+ \seq_put_right:NV \l_@@_tmpa_seq \l_@@_tmpb_tl
+ }
+ \tl_clear:N \l_@@_tmpb_tl
+ }
+
+ \seq_gclear:N \g_@@_output_seq
+ \seq_gset_eq:NN \g_@@_output_seq \l_@@_tmpa_seq
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_segments_to_seq:Nn #1#2
+{
+ \@@_segments_to_seq:n {#2}
+ \seq_clear_new:N #1
+ \seq_set_eq:NN #1 \g_@@_output_seq
+ \seq_gclear:N \g_@@_output_seq
+}
+\cs_generate_variant:Nn \spath_segments_to_seq:Nn {NV, cn, cV, Nv, cv}
+\cs_new_protected_nopar:Npn \spath_segments_gto_seq:Nn #1#2
+{
+ \@@_segments_to_seq:n {#2}
+ \seq_clear_new:N #1
+ \seq_gset_eq:NN #1 \g_@@_output_seq
+ \seq_gclear:N \g_@@_output_seq
+}
+\cs_generate_variant:Nn \spath_segments_gto_seq:Nn {NV, cn, cV, Nv, cv}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_components_to_seq:Nn,
+% \spath_components_gto_seq:Nn,
+% \spath_components_to_clist:Nn,
+% \spath_components_gto_clist:Nn,
+% }
+% Splits a soft path into \emph{components}, storing the result in a sequence or a clist.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_components_to_seq:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \seq_clear:N \l_@@_tmpa_seq
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_moveto_tl
+ \tl_set_eq:NN \l_@@_tmpb_tl \c_spath_moveto_tl
+ \bool_do_until:nn {
+ \tl_if_empty_p:N \l_@@_tmpa_tl
+ }
+ {
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_if_eq:NNT \l_@@_tmpc_tl \c_spath_moveto_tl
+ {
+ \seq_put_right:NV \l_@@_tmpa_seq \l_@@_tmpb_tl
+ \tl_clear:N \l_@@_tmpb_tl
+ }
+ \tl_if_single:NTF \l_@@_tmpc_tl
+ {
+ \tl_put_right:NV \l_@@_tmpb_tl \l_@@_tmpc_tl
+ }
+ {
+ \tl_put_right:Nx \l_@@_tmpb_tl {{\l_@@_tmpc_tl}}
+ }
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+
+ \seq_gclear:N \g_@@_output_seq
+ \seq_gset_eq:NN \g_@@_output_seq \l_@@_tmpa_seq
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_components_to_seq:Nn #1#2
+{
+ \@@_components_to_seq:n {#2}
+ \seq_clear_new:N #1
+ \seq_set_eq:NN #1 \g_@@_output_seq
+ \seq_gclear:N \g_@@_output_seq
+}
+\cs_generate_variant:Nn \spath_components_to_seq:Nn {NV, cn, cV, cv, Nv}
+\cs_new_protected_nopar:Npn \spath_components_gto_seq:Nn #1#2
+{
+ \@@_components_to_seq:n {#2}
+ \seq_clear_new:N #1
+ \seq_gset_eq:NN #1 \g_@@_output_seq
+ \seq_gclear:N \g_@@_output_seq
+}
+\cs_generate_variant:Nn \spath_components_gto_seq:Nn {NV, cn, cV, cv, Nv}
+\cs_new_protected_nopar:Npn \spath_components_to_clist:Nn #1#2
+{
+ \@@_components_to_seq:n {#2}
+ \clist_clear_new:N #1
+ \clist_set_from_seq:NN #1 \g_@@_output_seq
+ \seq_gclear:N \g_@@_output_seq
+}
+\cs_generate_variant:Nn \spath_components_to_clist:Nn {NV, cn, cV, cv, Nv}
+\cs_new_protected_nopar:Npn \spath_components_gto_clist:Nn #1#2
+{
+ \@@_components_to_seq:n {#2}
+ \clist_clear_new:N #1
+ \clist_gset_from_seq:NN #1 \g_@@_output_seq
+ \seq_gclear:N \g_@@_output_seq
+}
+\cs_generate_variant:Nn \spath_components_gto_clist:Nn {NV, cn, cV, cv, Nv}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[internal]{\spath_length:n}
+% Counts the number of triples in the path.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_length:n #1
+{
+ \int_eval:n {\tl_count:n {#1} / 3}
+}
+\cs_generate_variant:Nn \spath_length:n {V}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_reallength:Nn,
+% \spath_greallength:Nn
+% }
+% The real length of a path is the number of triples that actually draw something (that is, the number of lines, curves, and closepaths).
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_reallength:n #1
+{
+ \group_begin:
+ \int_set:Nn \l_@@_tmpa_int {0}
+ \tl_map_inline:nn {#1} {
+ \tl_set:Nn \l_@@_tmpa_tl {##1}
+ \tl_case:NnT \l_@@_tmpa_tl
+ {
+ \c_spath_lineto_tl {}
+ \c_spath_curveto_tl {}
+ \c_spath_closepath_tl {}
+ }
+ {
+ \int_incr:N \l_@@_tmpa_int
+ }
+ }
+ \int_gzero:N \g_@@_output_int
+ \int_gset_eq:NN \g_@@_output_int \l_@@_tmpa_int
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_reallength:Nn #1#2
+{
+ \@@_reallength:n {#2}
+ \int_set_eq:NN #1 \g_@@_output_int
+ \int_gzero:N \g_@@_output_int
+}
+\cs_generate_variant:Nn \spath_reallength:Nn {NV, cn, cV, Nv, cv}
+\cs_new_protected_nopar:Npn \spath_greallength:Nn #1#2
+{
+ \@@_reallength:n {#2}
+ \int_gset_eq:NN #1 \g_@@_output_int
+ \int_gzero:N \g_@@_output_int
+}
+\cs_generate_variant:Nn \spath_greallength:Nn {NV, cn, cV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_numberofcomponents:Nn,
+% \spath_gnumberofcomponents:Nn
+% }
+% A component is a continuous segment of the path, separated by moves.
+% Successive moves are not collapsed, and zero length moves count.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_numberofcomponents:n #1
+{
+ \group_begin:
+ \int_set:Nn \l_@@_tmpa_int {0}
+ \tl_map_inline:nn {#1} {
+ \tl_set:Nn \l_@@_tmpa_tl {##1}
+ \tl_case:Nn \l_@@_tmpa_tl
+ {
+ \c_spath_moveto_tl
+ {
+ \int_incr:N \l_@@_tmpa_int
+ }
+ }
+ }
+ \int_gzero:N \g_@@_output_int
+ \int_gset_eq:NN \g_@@_output_int \l_@@_tmpa_int
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_numberofcomponents:Nn #1#2
+{
+ \@@_numberofcomponents:n {#2}
+ \int_set_eq:NN #1 \g_@@_output_int
+ \int_gzero:N \g_@@_output_int
+}
+\cs_generate_variant:Nn \spath_numberofcomponents:Nn {NV, cn, cV, Nv}
+\cs_new_protected_nopar:Npn \spath_gnumberofcomponents:Nn #1#2
+{
+ \@@_numberofcomponents:n {#2}
+ \int_gset_eq:NN #1 \g_@@_output_int
+ \int_gzero:N \g_@@_output_int
+}
+\cs_generate_variant:Nn \spath_gnumberofcomponents:Nn {NV, cn, cV, Nv}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_initialpoint:Nn,
+% \spath_ginitialpoint:Nn
+% }
+% The starting point of the path.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_initialpoint:n #1
+{
+ \group_begin:
+ \tl_clear:N \l_@@_tmpa_tl
+ \tl_set:Nx \l_@@_tmpa_tl
+ {
+ { \tl_item:nn {#1} {2} }
+ { \tl_item:nn {#1} {3} }
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpa_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_initialpoint:Nn #1#2
+{
+ \@@_initialpoint:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_initialpoint:Nn {NV, cn, cV, Nv}
+\cs_new_protected_nopar:Npn \spath_ginitialpoint:Nn #1#2
+{
+ \@@_initialpoint:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_ginitialpoint:Nn {NV, cn, cV, Nv}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_finalpoint:Nn,
+% \spath_gfinalpoint:Nn,
+% }
+% The final point of the path.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_finalpoint:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_reverse:N \l_@@_tmpa_tl
+ \tl_clear:N \l_@@_tmpb_tl
+ \tl_set:Nx \l_@@_tmpb_tl
+ {
+ { \tl_item:Nn \l_@@_tmpa_tl {2} }
+ { \tl_item:Nn \l_@@_tmpa_tl {1} }
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_finalpoint:Nn #1#2
+{
+ \@@_finalpoint:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_finalpoint:Nn {NV, cn, cV, Nv}
+\cs_new_protected_nopar:Npn \spath_gfinalpoint:Nn #1#2
+{
+ \@@_finalpoint:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gfinalpoint:Nn {NV, cn, cV, Nv}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_finalmovepoint:Nn,
+% \spath_gfinalmovepoint:Nn
+% }
+% Get the last move on the path.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_finalmovepoint:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpc_tl { {0pt} {0pt} }
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \bool_do_until:nn
+ {
+ \tl_if_empty_p:N \l_@@_tmpa_tl
+ }
+ {
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_case:Nn \l_@@_tmpb_tl
+ {
+ \c_spath_moveto_tl
+ {
+ \tl_set:Nx \l_@@_tmpc_tl
+ {
+ { \tl_item:Nn \l_@@_tmpa_tl {2} }
+ { \tl_item:Nn \l_@@_tmpa_tl {3} }
+ }
+ }
+ }
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpc_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_finalmovepoint:Nn #1#2
+{
+ \@@_finalmovepoint:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_finalmovepoint:Nn {NV, cn, cV}
+\cs_new_protected_nopar:Npn \spath_gfinalmovepoint:Nn #1#2
+{
+ \@@_finalmovepoint:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gfinalmovepoint:Nn {NV, cn, cV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_reverse:Nn,
+% \spath_greverse:Nn
+% }
+% This computes the reverse of the path.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_reverse:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+
+ \tl_clear:N \l_@@_tmpb_tl
+ \tl_clear:N \l_@@_tmpd_tl
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \tl_put_left:Nx \l_@@_tmpd_tl
+ {
+ {\dim_use:N \l_@@_tmpa_dim}
+ {\dim_use:N \l_@@_tmpb_dim}
+ }
+
+ \bool_set_false:N \l_@@_closed_bool
+
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l_@@_tmpa_tl
+ }
+ {
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_head:N \l_@@_tmpa_tl}
+
+ \tl_case:NnTF \l_@@_tmpc_tl
+ {
+ \c_spath_moveto_tl {
+
+ \bool_if:NT \l_@@_closed_bool
+ {
+ \tl_put_right:NV \l_@@_tmpd_tl \c_spath_closepath_tl
+ \tl_set:Nx \l_@@_tmpe_tl {\tl_tail:N \l_@@_tmpd_tl}
+ \tl_put_right:Nx \l_@@_tmpd_tl
+ {
+ { \tl_head:N \l_@@_tmpd_tl }
+ { \tl_head:N \l_@@_tmpe_tl }
+ }
+ }
+ \bool_set_false:N \l_@@_closed_bool
+ \tl_put_left:NV \l_@@_tmpd_tl \c_spath_moveto_tl
+ \tl_put_left:NV \l_@@_tmpb_tl \l_@@_tmpd_tl
+ \tl_clear:N \l_@@_tmpd_tl
+ }
+ \c_spath_lineto_tl {
+ \tl_put_left:NV \l_@@_tmpd_tl \c_spath_lineto_tl
+ }
+ \c_spath_curveto_tl {
+ \tl_put_left:NV \l_@@_tmpd_tl \c_spath_curvetoa_tl
+ }
+ \c_spath_curvetoa_tl {
+ \tl_put_left:NV \l_@@_tmpd_tl \c_spath_curveto_tl
+ }
+ \c_spath_curvetob_tl {
+ \tl_put_left:NV \l_@@_tmpd_tl \c_spath_curvetob_tl
+ }
+ }
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \tl_put_left:Nx \l_@@_tmpd_tl
+ {
+ {\dim_use:N \l_@@_tmpa_dim}
+ {\dim_use:N \l_@@_tmpb_dim}
+ }
+
+ }
+ {
+ \tl_if_eq:NNTF \l_@@_tmpc_tl \c_spath_closepath_tl
+ {
+ \bool_set_true:N \l_@@_closed_bool
+ }
+ {
+ \msg_warning:nnx
+ { spath3 }
+ { unknown path construction }
+ {\l_@@_tmpc_tl }
+ }
+
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ }
+ }
+
+ \bool_if:NT \l_@@_closed_bool
+ {
+ \tl_put_right:NV \l_@@_tmpd_tl \c_spath_closepath_tl
+ \tl_set:Nx \l_@@_tmpe_tl {\tl_tail:N \l_@@_tmpd_tl}
+ \tl_put_right:Nx \l_@@_tmpd_tl
+ {
+ { \tl_head:N \l_@@_tmpd_tl }
+ { \tl_head:N \l_@@_tmpe_tl }
+ }
+ }
+
+ \bool_set_false:N \l_@@_closed_bool
+ \tl_put_left:NV \l_@@_tmpd_tl \c_spath_moveto_tl
+ \tl_put_left:NV \l_@@_tmpb_tl \l_@@_tmpd_tl
+
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_reverse:Nn #1#2
+{
+ \@@_reverse:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_reverse:Nn {NV, cn, cV, Nv}
+\cs_new_protected_nopar:Npn \spath_reverse:N #1
+{
+ \spath_reverse:NV #1#1
+}
+\cs_generate_variant:Nn \spath_reverse:N {c}
+\cs_new_protected_nopar:Npn \spath_greverse:Nn #1#2
+{
+ \@@_reverse:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_greverse:Nn {NV, cn, cV, Nv}
+\cs_new_protected_nopar:Npn \spath_greverse:N #1
+{
+ \spath_greverse:NV #1#1
+}
+\cs_generate_variant:Nn \spath_greverse:N {c}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_initialaction:Nn,
+% \spath_ginitialaction:Nn,
+% }
+% This is the first thing that the path does (after the initial move).
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_initialaction:n #1
+{
+ \group_begin:
+ \tl_clear:N \l_@@_tmpa_tl
+ \int_compare:nT
+ {
+ \tl_count:n {#1} > 3
+ }
+ {
+ \tl_set:Nx \l_@@_tmpa_tl
+ {
+ \tl_item:Nn {#1} {4}
+ }
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpa_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_initialaction:Nn #1#2
+{
+ \@@_initialaction:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_initialaction:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_ginitialaction:Nn #1#2
+{
+ \@@_initialaction:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_ginitialaction:Nn {NV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_finalaction:Nn,
+% \spath_gfinalaction:Nn
+% }
+% This is the last thing that the path does.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_finalaction:n #1
+{
+ \group_begin:
+ \tl_clear:N \l_@@_tmpb_tl
+ \int_compare:nT
+ {
+ \tl_count:n {#1} > 3
+ }
+ {
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_reverse:N \l_@@_tmpa_tl
+ \tl_set:Nx \l_@@_tmpb_tl
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {3}
+ }
+ \tl_if_eq:NNT \l_@@_tmpb_tl \c_spath_curvetoa_tl
+ {
+ \tl_set_eq:NN \l_@@_tmpb_tl \c_spath_curveto_tl
+ }
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_finalaction:Nn #1#2
+{
+ \@@_finalaction:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_finalaction:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gfinalaction:Nn #1#2
+{
+ \@@_finalaction:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gfinalaction:Nn {NV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_minbb:Nn,
+% \spath_gminbb:Nn
+% }
+% This computes the minimum (bottom left) of the bounding box of the path.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_minbb:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l_@@_tmpa_tl
+ }
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_tmpa_dim
+ {\dim_min:nn {\tl_head:N \l_@@_tmpa_tl} {\l_@@_tmpa_dim}}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_tmpb_dim
+ {\dim_min:nn {\tl_head:N \l_@@_tmpa_tl} {\l_@@_tmpb_dim}}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+ \tl_clear:N \l_@@_tmpb_tl
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_use:N \l_@@_tmpa_dim}
+ {\dim_use:N \l_@@_tmpb_dim}
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_minbb:Nn #1#2
+{
+ \@@_minbb:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_minbb:Nn {NV, cn, cV}
+\cs_new_protected_nopar:Npn \spath_gminbb:Nn #1#2
+{
+ \@@_minbb:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gminbb:Nn {NV, cn, cV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_maxbb:Nn,
+% \spath_gmaxbb:Nn,
+% }
+% This computes the maximum (top right) of the bounding box of the path.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_maxbb:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l_@@_tmpa_tl
+ }
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_tmpa_dim
+ {\dim_max:nn {\tl_head:N \l_@@_tmpa_tl} {\l_@@_tmpa_dim}}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_tmpb_dim
+ {\dim_max:nn {\tl_head:N \l_@@_tmpa_tl} {\l_@@_tmpb_dim}}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+ \tl_clear:N \l_@@_tmpb_tl
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_use:N \l_@@_tmpa_dim}
+ {\dim_use:N \l_@@_tmpb_dim}
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_maxbb:Nn #1#2
+{
+ \@@_maxbb:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_maxbb:Nn {NV, cn, cV}
+\cs_new_protected_nopar:Npn \spath_gmaxbb:Nn #1#2
+{
+ \@@_maxbb:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gmaxbb:Nn {NV, cn, cV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_save_to_aux:Nn,
+% \spath_save_to_aux:N
+% }
+% This saves a soft path to the auxfile.
+% The first argument is the macro that will be assigned to the soft path when the aux file is read back in.
+% \begin{macrocode}
+\int_set:Nn \l_@@_tmpa_int {\char_value_catcode:n {`@}}
+\char_set_catcode_letter:N @
+\cs_new_protected_nopar:Npn \spath_save_to_aux:Nn #1#2 {
+ \tl_if_empty:nF {#2}
+ {
+ \tl_clear:N \l_@@_tmpa_tl
+ \tl_put_right:Nn \l_@@_tmpa_tl {
+ \ExplSyntaxOn
+ \tl_clear:N #1
+ \tl_set:Nn #1 {#2}
+ \ExplSyntaxOff
+ }
+ \protected@write\@auxout{}{
+ \tl_to_str:N \l_@@_tmpa_tl
+ }
+ }
+}
+\char_set_catcode:nn {`@} {\l_@@_tmpa_int}
+\cs_generate_variant:Nn \spath_save_to_aux:Nn {cn, cV, NV}
+\cs_new_protected_nopar:Npn \spath_save_to_aux:N #1
+{
+ \tl_if_exist:NT #1
+ {
+ \spath_save_to_aux:NV #1#1
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Path Manipulation}
+%
+% These functions all manipulate a soft path.
+% They come with a variety of different argument specifications.
+% As a general rule, the first argument is the macro in which to store the modified path, the second is the path to manipulate, and the rest are the information about what to do.
+% There is always a variant in which the path is specified by a macro and restored back in that same macro.
+%
+%
+% \begin{macro}[internal]{
+% \spath_translate:Nnnn,
+% \spath_translate:Nnn,
+% \spath_gtranslate:Nnnn,
+% \spath_gtranslate:Nnn
+% }
+% Translates a path by an amount.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_translate:nnn #1#2#3
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_clear:N \l_@@_tmpb_tl
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l_@@_tmpa_tl
+ }
+ {
+ \tl_put_right:Nx \l_@@_tmpb_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_head:N \l_@@_tmpa_tl + #2}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_head:N \l_@@_tmpa_tl + #3}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_use:N \l_@@_tmpa_dim}
+ {\dim_use:N \l_@@_tmpb_dim}
+ }
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpb_tl
+ \group_end:
+}
+\cs_generate_variant:Nn \@@_translate:nnn {nVV}
+\cs_new_protected_nopar:Npn \spath_translate:Nnnn #1#2#3#4
+{
+ \@@_translate:nnn {#2}{#3}{#4}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_translate:Nnnn {NVxx, NVVV, NVnn}
+\cs_new_protected_nopar:Npn \spath_translate:Nnn #1#2#3
+{
+ \spath_translate:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_translate:Nnn {NVV, cnn, cVV}
+\cs_new_protected_nopar:Npn \spath_gtranslate:Nnnn #1#2#3#4
+{
+ \@@_translate:nnn {#2}{#3}{#4}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gtranslate:Nnnn {NVxx, NVVV, NVnn}
+\cs_new_protected_nopar:Npn \spath_gtranslate:Nnn #1#2#3
+{
+ \spath_gtranslate:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_gtranslate:Nnn {NVV, cnn, cVV}
+% \end{macrocode}
+%
+% This variant allows for passing the coordinates as a single braced group as it strips off the outer braces of the second argument.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_translate:Nn #1#2
+{
+ \spath_translate:Nnn #1 #2
+}
+\cs_generate_variant:Nn \spath_translate:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gtranslate:Nn #1#2
+{
+ \spath_gtranslate:Nnn #1 #2
+}
+\cs_generate_variant:Nn \spath_gtranslate:Nn {NV}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}[internal]{
+% \spath_translate_to:Nnnn,
+% \spath_translate_to:Nnn,
+% \spath_gtranslate_to:Nnnn,
+% \spath_gtranslate_to:Nnn
+% }
+% Translates a path so that it starts at a point.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_translate_to:nnn #1#2#3
+{
+ \group_begin:
+ \spath_initialpoint:Nn \l_@@_tmpa_tl {#1}
+
+ \dim_set:Nn \l_@@_tmpa_dim
+ {
+ #2
+ -
+ \tl_item:Nn \l_@@_tmpa_tl {1}
+ }
+ \dim_set:Nn \l_@@_tmpb_dim
+ {
+ #3
+ -
+ \tl_item:Nn \l_@@_tmpa_tl {2}
+ }
+
+ \@@_translate:nVV {#1} \l_@@_tmpa_dim \l_@@_tmpb_dim
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_translate_to:Nnnn #1#2#3#4
+{
+ \@@_translate_to:nnn {#2}{#3}{#4}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_translate_to:Nnnn {NVxx, NVVV, NVnn}
+\cs_new_protected_nopar:Npn \spath_translate_to:Nnn #1#2#3
+{
+ \spath_translate_to:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_translate_to:Nnn {NVV, cnn, cVV}
+\cs_new_protected_nopar:Npn \spath_gtranslate_to:Nnnn #1#2#3#4
+{
+ \@@_translate_to:nnn {#2}{#3}{#4}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gtranslate_to:Nnnn {NVxx, NVVV, NVnn}
+\cs_new_protected_nopar:Npn \spath_gtranslate_to:Nnn #1#2#3
+{
+ \spath_gtranslate_to:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_gtranslate_to:Nnn {NVV, cnn, cVV}
+% \end{macrocode}
+%
+% This variant allows for passing the coordinates as a single braced group as it strips off the outer braces of the second argument.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_translate_to:Nn #1#2
+{
+ \spath_translate_to:Nnn #1 #2
+}
+\cs_generate_variant:Nn \spath_translate_to:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gtranslate_to:Nn #1#2
+{
+ \spath_gtranslate_to:Nnn #1 #2
+}
+\cs_generate_variant:Nn \spath_gtranslate_to:Nn {NV}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[internal]{
+% \spath_scale:Nnnn,
+% \spath_scale:Nnn,
+% \spath_gscale:Nnnn,
+% \spath_gscale:Nnn
+% }
+% Scale a path.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_scale:nnn #1#2#3
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_clear:N \l_@@_tmpb_tl
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l_@@_tmpa_tl
+ }
+ {
+ \tl_put_right:Nx \l_@@_tmpb_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \fp_set:Nn \l_@@_tmpa_fp {\tl_head:N \l_@@_tmpa_tl * #2}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \fp_set:Nn \l_@@_tmpb_fp {\tl_head:N \l_@@_tmpa_tl * #3}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\fp_to_dim:N \l_@@_tmpa_fp}
+ {\fp_to_dim:N \l_@@_tmpb_fp}
+ }
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_scale:Nnnn #1#2#3#4
+{
+ \@@_scale:nnn {#2}{#3}{#4}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_scale:Nnnn {NVnn, Nnxx}
+\cs_new_protected_nopar:Npn \spath_scale:Nnn #1#2#3
+{
+ \spath_scale:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_scale:Nnn {cnn, cVV, NVV}
+\cs_new_protected_nopar:Npn \spath_gscale:Nnnn #1#2#3#4
+{
+ \@@_scale:nnn {#2}{#3}{#4}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gscale:Nnnn {NVnn, Nnxx}
+\cs_new_protected_nopar:Npn \spath_gscale:Nnn #1#2#3
+{
+ \spath_gscale:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_gscale:Nnn {cnn, cVV, NVV}
+% \end{macrocode}
+%
+% This variant allows for passing the coordinates as a single braced group as it strips off the outer braces of the second argument.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_scale:Nn #1#2
+{
+ \spath_scale:Nnn #1 #2
+}
+
+\cs_generate_variant:Nn \spath_scale:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gscale:Nn #1#2
+{
+ \spath_gscale:Nnn #1 #2
+}
+
+\cs_generate_variant:Nn \spath_gscale:Nn {NV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_transform:Nnnnnnnn,
+% \spath_transform:Nnnnnnn,
+% \spath_gtransform:Nnnnnnnn,
+% \spath_gtransform:Nnnnnnn,
+% }
+% Applies an affine (matrix and vector) transformation to path.
+% The matrix is specified in rows first.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_transform:nnnnnnn #1#2#3#4#5#6#7
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_clear:N \l_@@_tmpb_tl
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l_@@_tmpa_tl
+ }
+ {
+ \tl_put_right:Nx \l_@@_tmpb_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpd_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \fp_set:Nn \l_@@_tmpa_fp
+ {\l_@@_tmpc_tl * #2 + \l_@@_tmpd_tl * #4 + #6}
+ \fp_set:Nn \l_@@_tmpb_fp
+ {\l_@@_tmpc_tl * #3 + \l_@@_tmpd_tl * #5 + #7}
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\fp_to_dim:N \l_@@_tmpa_fp}
+ {\fp_to_dim:N \l_@@_tmpb_fp}
+ }
+ }
+
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_transform:Nnnnnnnn #1#2#3#4#5#6#7#8
+{
+ \@@_transform:nnnnnnn {#2}{#3}{#4}{#5}{#6}{#7}{#8}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_transform:Nnnnnnnn
+{NVnnnnnn, Nnxxxxxx, cnnnnnnn}
+\cs_new_protected_nopar:Npn \spath_transform:Nnnnnnn #1#2#3#4#5#6#7
+{
+ \spath_transform:NVnnnnnn #1#1{#2}{#3}{#4}{#5}{#6}{#7}
+}
+\cs_generate_variant:Nn \spath_transform:Nnnnnnn {cnnnnnn}
+\cs_new_protected_nopar:Npn \spath_transform:Nnn #1#2#3
+{
+ \spath_transform:Nnnnnnnn #1{#2}#3
+}
+\cs_generate_variant:Nn \spath_transform:Nnn {cnn, cVn, NVn, NnV}
+\cs_new_protected_nopar:Npn \spath_transform:Nn #1#2
+{
+ \spath_transform:NVnnnnnn #1#1#2
+}
+\cs_generate_variant:Nn \spath_transform:Nn {cn, cV, NV}
+
+\cs_new_protected_nopar:Npn \spath_gtransform:Nnnnnnnn #1#2#3#4#5#6#7#8
+{
+ \@@_transform:nnnnnnn {#2}{#3}{#4}{#5}{#6}{#7}{#8}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gtransform:Nnnnnnnn {NVnnnnnn, Nnxxxxxx, cnnnnnnn}
+\cs_new_protected_nopar:Npn \spath_gtransform:Nnnnnnn #1#2#3#4#5#6#7
+{
+ \spath_gtransform:NVnnnnnn #1#1{#2}{#3}{#4}{#5}{#6}{#7}
+}
+\cs_generate_variant:Nn \spath_gtransform:Nnnnnnn {cnnnnnn}
+\cs_new_protected_nopar:Npn \spath_gtransform:Nnn #1#2#3
+{
+ \spath_gtransform:Nnnnnnnn #1{#2}#3
+}
+\cs_generate_variant:Nn \spath_gtransform:Nnn {cnn, cVn, NVn, NnV}
+\cs_new_protected_nopar:Npn \spath_gtransform:Nn #1#2
+{
+ \spath_gtransform:NVnnnnnn #1#1#2
+}
+\cs_generate_variant:Nn \spath_gtransform:Nn {cn, cV, NV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_span:Nnnn,
+% \spath_span:Nnn,
+% \spath_gspan:Nnnn,
+% \spath_gspan:Nnn,
+% \spath_normalise:Nn,
+% \spath_normalise:N,
+% \spath_gnormalise:Nn,
+% \spath_gnormalise:N
+% }
+% The \Verb+span+ functions transform a path to start and end at specified points.
+% The \Verb+normalise+ functions transform it to start at the origin and end at \((1\mathrm{pt},0\mathrm{pt})\).
+%
+% If the path starts and ends at the same point then it is translated to the specified point (or origin) but not otherwise changed.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_span:nnn #1#2#3
+{
+ \group_begin:
+ \spath_initialpoint:Nn \l_@@_tmpa_tl {#1}
+ \spath_finalpoint:Nn \l_@@_tmpb_tl {#1}
+
+ \fp_set:Nn \l_@@_tmpa_fp
+ {
+ (\tl_item:Nn \l_@@_tmpb_tl {1}) -
+ (\tl_item:Nn \l_@@_tmpa_tl {1})
+ }
+ \fp_set:Nn \l_@@_tmpb_fp
+ {
+ (\tl_item:Nn \l_@@_tmpb_tl {2}) -
+ (\tl_item:Nn \l_@@_tmpa_tl {2})
+ }
+ \fp_set:Nn \l_@@_tmpc_fp
+ {
+ (\l_@@_tmpa_fp) * (\l_@@_tmpa_fp)
+ +
+ (\l_@@_tmpb_fp * \l_@@_tmpb_fp)
+ }
+
+ \fp_compare:nTF
+ {
+ \l_@@_tmpc_fp < 0.001
+ }
+ {
+ \spath_translate_to:Nnnn \l_@@_tmpd_tl {#1} #2
+ }
+ {
+ \fp_set:Nn \l_@@_tmpa_fp
+ {
+ (
+ ((\tl_item:nn {#3} {1})
+ -
+ (\tl_item:nn {#2} {1}))
+ *
+ ((\tl_item:Nn \l_@@_tmpb_tl {1})
+ -
+ (\tl_item:Nn \l_@@_tmpa_tl {1}))
+ +
+ ((\tl_item:nn {#3} {2})
+ -
+ (\tl_item:nn {#2} {2}))
+ *
+ ((\tl_item:Nn \l_@@_tmpb_tl {2})
+ -
+ (\tl_item:Nn \l_@@_tmpa_tl {2}))
+ )
+ /
+ \l_@@_tmpc_fp
+ }
+ \fp_set:Nn \l_@@_tmpb_fp
+ {
+ (
+ ((\tl_item:nn {#3} {2})
+ -
+ (\tl_item:nn {#2} {2}))
+ *
+ ((\tl_item:Nn \l_@@_tmpb_tl {1})
+ -
+ (\tl_item:Nn \l_@@_tmpa_tl {1}))
+ -
+ ((\tl_item:nn {#3} {1})
+ -
+ (\tl_item:nn {#2} {1}))
+ *
+ ((\tl_item:Nn \l_@@_tmpb_tl {2})
+ -
+ (\tl_item:Nn \l_@@_tmpa_tl {2}))
+ )
+ /
+ \l_@@_tmpc_fp
+ }
+
+ \tl_set:Nx \l_@@_tmpc_tl
+ {
+ {
+ \fp_to_decimal:N \l_@@_tmpa_fp
+ }
+ {
+ \fp_to_decimal:N \l_@@_tmpb_fp
+ }
+ {
+ \fp_eval:n { - \l_@@_tmpb_fp }
+ }
+ {
+ \fp_to_decimal:N \l_@@_tmpa_fp
+ }
+ {
+ \fp_to_dim:n
+ {
+ \tl_item:nn {#2} {1}
+ -
+ \l_@@_tmpa_fp * (\tl_item:Nn \l_@@_tmpa_tl {1})
+ +
+ \l_@@_tmpb_fp * (\tl_item:Nn \l_@@_tmpa_tl {2})
+ }
+ }
+ {
+ \fp_to_dim:n
+ {
+ \tl_item:nn {#2} {2}
+ -
+ \l_@@_tmpb_fp * (\tl_item:Nn \l_@@_tmpa_tl {1})
+ -
+ \l_@@_tmpa_fp * (\tl_item:Nn \l_@@_tmpa_tl {2})
+ }
+ }
+ }
+ \spath_transform:NnV \l_@@_tmpd_tl {#1} \l_@@_tmpc_tl
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpd_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_span:Nnnn #1#2#3#4
+{
+ \@@_span:nnn {#2}{#3}{#4}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_span:Nnnn {NVnn, NVVV, NnVV}
+\cs_new_protected_nopar:Npn \spath_span:Nnn #1#2#3
+{
+ \spath_span:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_span:Nnn {NVV, cnn, cvv, cVV}
+\cs_new_protected_nopar:Npn \spath_gspan:Nnnn #1#2#3#4
+{
+ \@@_span:nnn {#2}{#3}{#4}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gspan:Nnnn {NVnn, NVVV}
+\cs_new_protected_nopar:Npn \spath_gspan:Nnn #1#2#3
+{
+ \spath_gspan:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_gspan:Nnn {NVV, cnn, cvv, cVV}
+\cs_new_protected_nopar:Npn \@@_normalise:n #1
+{
+ \@@_span:nnn {#1}{{0pt}{0pt}}{{1pt}{0pt}}
+}
+\cs_new_protected_nopar:Npn \spath_normalise:Nn #1#2
+{
+ \@@_normalise:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_normalise:Nn {cn,NV, cV, cv}
+\cs_new_protected_nopar:Npn \spath_normalise:N #1
+{
+ \spath_normalise:NV #1#1
+}
+\cs_generate_variant:Nn \spath_normalise:N {c}
+\cs_new_protected_nopar:Npn \spath_gnormalise:Nn #1#2
+{
+ \@@_normalise:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gnormalise:Nn {cn,NV, cV, cv}
+\cs_new_protected_nopar:Npn \spath_gnormalise:N #1
+{
+ \spath_gnormalise:NV #1#1
+}
+\cs_generate_variant:Nn \spath_gnormalise:N {c}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[internal]{
+% \spath_splice_between:Nnnn,
+% \spath_splice_between:Nnn,
+% \spath_gsplice_between:Nnnn,
+% \spath_gsplice_between:Nnn
+% }
+% This takes three paths and returns a single path in which the middle one is adjusted (and welded) so that it joins the first path to the third.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_splice_between:nnn #1#2#3
+{
+ \group_begin:
+ \spath_finalpoint:NV \l_@@_tmpd_tl {#1}
+ \spath_initialpoint:NV \l_@@_tmpe_tl {#3}
+ \spath_span:NnVV \l_@@_tmpb_tl {#2} \l_@@_tmpd_tl \l_@@_tmpe_tl
+ \spath_append_no_move:NnV \l_@@_tmpa_tl {#1} \l_@@_tmpb_tl
+ \spath_append_no_move:Nn \l_@@_tmpa_tl {#3}
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpa_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_splice_between:Nnnn #1#2#3#4
+{
+ \@@_splice_between:nnn {#2}{#3}{#4}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_splice_between:Nnnn {NVnn, NVVV}
+\cs_new_protected_nopar:Npn \spath_splice_between:Nnn #1#2#3
+{
+ \spath_splice_between:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_splice_between:Nnn {NVV, cnn, cvv, Nvn}
+\cs_new_protected_nopar:Npn \spath_gsplice_between:Nnnn #1#2#3#4
+{
+ \@@_splice_between:nnn {#2}{#3}{#4}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplice_between:Nnnn {NVnn, NVVV}
+\cs_new_protected_nopar:Npn \spath_gsplice_between:Nnn #1#2#3
+{
+ \spath_gsplice_between:NVnn #1#1{#2}{#3}
+}
+\cs_generate_variant:Nn \spath_gsplice_between:Nnn {NVV, cnn, cvv}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_close_with:Nn,
+% \spath_gclose_with:Nn
+% }
+% Closes the first path by splicing in the second.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_close_with:nn #1#2
+{
+ \group_begin:
+ \spath_finalmovepoint:Nn \l_@@_tmpa_tl {#1}
+ \spath_finalpoint:Nn \l_@@_tmpb_tl {#1}
+ \dim_compare:nTF
+ {
+ \dim_abs:n
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {1}
+ -
+ \tl_item:Nn \l_@@_tmpb_tl {1}
+ }
+ +
+ \dim_abs:n
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {2}
+ -
+ \tl_item:Nn \l_@@_tmpb_tl {2}
+ }
+ < 0.01pt
+ }
+ {
+ \@@_close:n {#1}
+ }
+ {
+ \spath_span:NnVV \l_@@_tmpc_tl {#2} \l_@@_tmpb_tl \l_@@_tmpa_tl
+ \spath_append_no_move:NnV \l_@@_tmpd_tl {#1} \l_@@_tmpc_tl
+ \@@_close:V \l_@@_tmpd_tl
+ }
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_close_with:Nnn #1#2#3
+{
+ \@@_close_with:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_close_with:Nnn {cnn, cVV, cvv, NVn}
+\cs_new_protected_nopar:Npn \spath_close_with:Nn #1#2
+{
+ \spath_close_with:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_close_with:Nn {cn, cV, cv, NV}
+\cs_new_protected_nopar:Npn \spath_gclose_with:Nnn #1#2#3
+{
+ \@@_close_with:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gclose_with:Nnn {cnn, cVV, cvv, NVn}
+\cs_new_protected_nopar:Npn \spath_gclose_with:Nn #1#2
+{
+ \spath_gclose_with:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gclose_with:Nn {cn, cV, cv, NV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_weld:Nnn,
+% \spath_weld:Nn,
+% \spath_gweld:Nnn,
+% \spath_gweld:Nn
+% }
+% This welds one path to another, moving the second so that its initial point coincides with the first's final point.
+% It is called a \emph{weld} because the initial move of the second path is removed.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_weld:nn #1#2
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_set:Nn \l_@@_tmpb_tl {#2}
+ \spath_finalpoint:Nn \l_@@_tmpc_tl {#1}
+ \spath_translate_to:NV \l_@@_tmpb_tl \l_@@_tmpc_tl
+
+ \@@_append_no_move:VV \l_@@_tmpa_tl \l_@@_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_weld:Nnn #1#2#3
+{
+ \@@_weld:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_weld:Nnn {NVV,NVn}
+\cs_new_protected_nopar:Npn \spath_weld:Nn #1#2
+{
+ \spath_weld:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_weld:Nn {NV, Nv, cV, cv}
+\cs_new_protected_nopar:Npn \spath_gweld:Nnn #1#2#3
+{
+ \@@_weld:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gweld:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gweld:Nn #1#2
+{
+ \spath_gweld:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gweld:Nn {NV, Nv, cV, cv}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[internal]{
+% \spath_append_no_move:Nnn,
+% \spath_append_no_move:Nn,
+% \spath_gappend_no_move:Nnn,
+% \spath_gappend_no_move:Nn,
+% }
+% Append the path from the second \Verb+spath+ to the first, removing
+% the adjoining move.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_append_no_move:nn #1#2
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_set:Nn \l_@@_tmpb_tl {#2}
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_tail:N \l_@@_tmpb_tl}
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_tail:N \l_@@_tmpb_tl}
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_tail:N \l_@@_tmpb_tl}
+
+ \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpb_tl
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpa_tl
+ \group_end:
+}
+\cs_generate_variant:Nn \@@_append_no_move:nn {VV}
+\cs_new_protected_nopar:Npn \spath_append_no_move:Nnn #1#2#3
+{
+ \@@_append_no_move:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_append_no_move:Nnn {NVV, NVn, NnV}
+\cs_new_protected_nopar:Npn \spath_append_no_move:Nn #1#2
+{
+ \spath_append_no_move:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_append_no_move:Nn {NV, cv, Nv}
+\cs_new_protected_nopar:Npn \spath_gappend_no_move:Nnn #1#2#3
+{
+ \@@_append_no_move:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gappend_no_move:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gappend_no_move:Nn #1#2
+{
+ \spath_gappend_no_move:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gappend_no_move:Nn {NV, cv, Nv}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_append:Nnn,
+% \spath_append:Nn,
+% \spath_gappend:Nnn,
+% \spath_gappend:Nn,
+% }
+% Prepend the path from the second \Verb+spath+ to the first.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_append:Nnn #1#2#3
+{
+ \tl_set:Nn #1 {#2}
+ \tl_put_right:Nn #1 {#3}
+}
+\cs_generate_variant:Nn \spath_append:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_append:Nn #1#2
+{
+ \spath_append:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_append:Nn {NV, Nv, cv}
+\cs_new_protected_nopar:Npn \spath_gappend:Nnn #1#2#3
+{
+ \tl_gset:Nn #1 {#2}
+ \tl_gput_right:Nn #1 {#3}
+}
+\cs_generate_variant:Nn \spath_gappend:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gappend:Nn #1#2
+{
+ \spath_gappend:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gappend:Nn {NV, Nv, cv}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[internal]{
+% \spath_prepend_no_move:Nnn,
+% \spath_prepend_no_move:Nn,
+% \spath_gprepend_no_move:Nnn,
+% \spath_gprepend_no_move:Nn,
+% }
+% Prepend the path from the second \Verb+spath+ to the first, removing
+% the adjoining move.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_prepend_no_move:Nnn #1#2#3
+{
+ \spath_append_no_move:Nnn #1{#3}{#2}
+}
+\cs_generate_variant:Nn \spath_prepend_no_move:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_prepend_no_move:Nn #1#2
+{
+ \spath_prepend_no_move:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_prepend_no_move:Nn {NV, cv}
+\cs_new_protected_nopar:Npn \spath_gprepend_no_move:Nnn #1#2#3
+{
+ \spath_gappend_no_move:Nnn #1{#3}{#2}
+}
+\cs_generate_variant:Nn \spath_gprepend_no_move:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gprepend_no_move:Nn #1#2
+{
+ \spath_gprepend_no_move:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gprepend_no_move:Nn {NV, cv}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_prepend:Nnn,
+% \spath_prepend:Nn,
+% \spath_gprepend:Nnn,
+% \spath_gprepend:Nn
+% }
+% Prepend the path from the second \Verb+spath+ to the first.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_prepend:Nnn #1#2#3
+{
+ \spath_append:Nnn #1{#3}{#2}
+}
+\cs_generate_variant:Nn \spath_prepend:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_prepend:Nn #1#2
+{
+ \spath_prepend:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_prepend:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gprepend:Nnn #1#2#3
+{
+ \spath_gappend:Nnn #1{#3}{#2}
+}
+\cs_generate_variant:Nn \spath_gprepend:Nnn {NVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gprepend:Nn #1#2
+{
+ \spath_gprepend:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gprepend:Nn {NV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_bake_round:Nn,
+% \spath_bake_round:N,
+% \spath_gbake_round:Nn,
+% \spath_gbake_round:N
+% }
+%
+% The corner rounding routine is applied quite late in the process of building a soft path so this ensures that it is done.
+%
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_bake_round:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \pgf@@@@processround \l_@@_tmpa_tl\l_@@_tmpb_tl
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_bake_round:Nn #1#2
+{
+ \@@_bake_round:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_bake_round:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_bake_round:N #1
+{
+ \spath_bake_round:NV #1#1
+}
+\cs_generate_variant:Nn \spath_bake_round:N {c}
+\cs_new_protected_nopar:Npn \spath_gbake_round:Nn #1#2
+{
+ \@@_bake_round:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gbake_round:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gbake_round:N #1
+{
+ \spath_gbake_round:NV #1#1
+}
+\cs_generate_variant:Nn \spath_gbake_round:N {c}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_close:Nn,
+% \spath_close:N,
+% \spath_gclose:Nn,
+% \spath_gclose:N
+% }
+% Appends a close path to the end of the path.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_close:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \spath_finalmovepoint:NV \l_@@_tmpb_tl \l_@@_tmpa_tl
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_closepath_tl
+ \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpb_tl
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpa_tl
+ \group_end:
+}
+\cs_generate_variant:Nn \@@_close:n {V}
+\cs_new_protected_nopar:Npn \spath_close:Nn #1#2
+{
+ \@@_close:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_close:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_close:N #1
+{
+ \spath_close:NV #1#1
+}
+\cs_generate_variant:Nn \spath_close:N {c}
+\cs_new_protected_nopar:Npn \spath_gclose:Nn #1#2
+{
+ \@@_close:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gclose:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gclose:N #1
+{
+ \spath_gclose:NV #1#1
+}
+\cs_generate_variant:Nn \spath_gclose:N {c}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[internal]{
+% \spath_open:Nn,
+% \spath_open:N,
+% \spath_gopen:Nn,
+% \spath_gopen:N
+% }
+% Removes all close paths from the path, replacing them by \Verb+lineto+ if they move any distance.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_open:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_clear:N \l_@@_tmpb_tl
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l_@@_tmpa_tl
+ }
+ {
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \tl_case:NnF \l_@@_tmpc_tl
+ {
+ \c_spath_closepath_tl {
+
+ \bool_if:nF
+ {
+ \dim_compare_p:n
+ {
+ \l_@@_move_x_dim == \l_@@_tmpa_dim
+ }
+ &&
+ \dim_compare_p:n
+ {
+ \l_@@_move_y_dim == \l_@@_tmpb_dim
+ }
+ }
+ {
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_lineto_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl {
+ { \dim_use:N \l_@@_move_x_dim }
+ { \dim_use:N \l_@@_move_y_dim }
+ }
+ }
+
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+
+ \c_spath_moveto_tl {
+ \tl_put_right:NV \l_@@_tmpb_tl \l_@@_tmpc_tl
+
+ \dim_set:Nn \l_@@_move_x_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_move_y_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \tl_put_right:Nx \l_@@_tmpb_tl {
+ { \dim_use:N \l_@@_move_x_dim }
+ { \dim_use:N \l_@@_move_y_dim }
+ }
+
+ \dim_set_eq:NN \l_@@_tmpa_dim \l_@@_move_x_dim
+ \dim_set_eq:NN \l_@@_tmpb_dim \l_@@_move_y_dim
+ }
+ }
+ {
+ \tl_put_right:NV \l_@@_tmpb_tl \l_@@_tmpc_tl
+
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_head:N \l_@@_tmpa_tl}
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+
+ \tl_put_right:Nx \l_@@_tmpb_tl {
+ { \dim_use:N \l_@@_tmpa_dim }
+ { \dim_use:N \l_@@_tmpb_dim }
+ }
+ }
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_open:Nn #1#2
+{
+ \@@_open:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_open:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_open:N #1
+{
+ \spath_open:NV #1#1
+}
+\cs_new_protected_nopar:Npn \spath_gopen:Nn #1#2
+{
+ \@@_open:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gopen:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gopen:N #1
+{
+ \spath_gopen:NV #1#1
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_remove_empty_components:Nn,
+% \spath_remove_empty_components:N,
+% \spath_gremove_empty_components:Nn,
+% \spath_gremove_empty_components:N
+% }
+% Remove any component that is simply a moveto.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_remove_empty_components:n #1
+{
+ \group_begin:
+ \spath_components_to_seq:Nn \l_@@_tmpa_seq {#1}
+ \tl_clear:N \l_@@_tmpa_tl
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \int_compare:nF
+ {
+ \tl_count:n {##1} == 3
+ }
+ {
+ \tl_put_right:Nn \l_@@_tmpa_tl {##1}
+ }
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpa_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_remove_empty_components:Nn #1#2
+{
+ \@@_remove_empty_components:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_remove_empty_components:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_remove_empty_components:N #1
+{
+ \spath_remove_empty_components:NV #1#1
+}
+\cs_generate_variant:Nn \spath_remove_empty_components:N {c}
+\cs_new_protected_nopar:Npn \spath_gremove_empty_components:Nn #1#2
+{
+ \@@_remove_empty_components:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gremove_empty_components:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gremove_empty_components:N #1
+{
+ \spath_gremove_empty_components:NV #1#1
+}
+\cs_generate_variant:Nn \spath_gremove_empty_components:N {c}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\spath_if_eq:nn}
+% Test if two soft paths are equal, we allow a little tolerance on the calculations.
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \spath_if_eq:nn #1#2 { T, F, TF }
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_set:Nn \l_@@_tmpb_tl {#2}
+ \bool_gset_true:N \g_@@_tmpa_bool
+ \int_compare:nNnTF
+ {\tl_count:N \l_@@_tmpa_tl}
+ =
+ {\tl_count:N \l_@@_tmpb_tl}
+ {
+ \int_step_inline:nnnn {1} {3} {\tl_count:N \l_@@_tmpa_tl}
+ {
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_item:Nn \l_@@_tmpa_tl {##1}}
+ \tl_set:Nx \l_@@_tmpd_tl {\tl_item:Nn \l_@@_tmpb_tl {##1}}
+ \tl_if_eq:NNF \l_@@_tmpc_tl \l_@@_tmpd_tl
+ {
+ \bool_gset_false:N \g_@@_tmpa_bool
+ }
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_item:Nn \l_@@_tmpa_tl {##1+1}}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_item:Nn \l_@@_tmpb_tl {##1+1}}
+ \dim_compare:nF
+ {
+ \dim_abs:n
+ {
+ \l_@@_tmpa_dim - \l_@@_tmpb_dim
+ }
+ < 0.001pt
+ }
+ {
+ \bool_gset_false:N \g_@@_tmpa_bool
+ }
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_item:Nn \l_@@_tmpa_tl {##1+2}}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_item:Nn \l_@@_tmpb_tl {##1+2}}
+ \dim_compare:nF
+ {
+ \dim_abs:n
+ {
+ \l_@@_tmpa_dim - \l_@@_tmpb_dim
+ }
+ < 0.001pt
+ }
+ {
+ \bool_gset_false:N \g_@@_tmpa_bool
+ }
+ }
+ }
+ {
+ \bool_gset_false:N \g_@@_tmpa_bool
+ }
+ \group_end:
+ \bool_if:NTF \g_@@_tmpa_bool
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
+ }
+}
+\prg_generate_conditional_variant:Nnn \spath_if_eq:nn {VV, Vn, nV, vv} {TF, T, F}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Splitting Commands}
+%
+% \begin{macro}[internal]{
+% \spath_split_curve:NNnn,
+% \spath_gsplit_curve:NNnn
+% }
+% Splits a Bezier cubic into pieces, storing the pieces in the first two arguments.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_split_curve:nn #1#2
+{
+ \group_begin:
+ \tl_set_eq:NN \l_@@_tmpa_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl {
+ {\tl_item:nn {#1} {2}}
+ {\tl_item:nn {#1} {3}}
+ }
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_curvetoa_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {2} + (#2) * \tl_item:nn {#1} {5}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {3} + (#2) * \tl_item:nn {#1} {6}
+ }}
+ }
+
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_curvetob_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - #2)^2 * \tl_item:nn {#1} {2}
+ + 2 * (1 - #2) * (#2) * \tl_item:nn {#1} {5}
+ + (#2)^2 * \tl_item:nn {#1} {8}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2)^2 * \tl_item:nn {#1} {3}
+ + 2 * (1 - #2) * (#2) * \tl_item:nn {#1} {6}
+ + (#2)^2 * \tl_item:nn {#1} {9}
+ }}
+ }
+
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_curveto_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - #2)^3 * \tl_item:nn {#1} {2}
+ + 3 * (1 - #2)^2 * (#2) * \tl_item:nn {#1} {5}
+ + 3 * (1 - #2) * (#2)^2 * \tl_item:nn {#1} {8}
+ + (#2)^3 * \tl_item:nn {#1} {11}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2)^3 * \tl_item:nn {#1} {3}
+ + 3 * (1 - #2)^2 * (#2) * \tl_item:nn {#1} {6}
+ + 3 * (1 - #2) * (#2)^2 * \tl_item:nn {#1} {9}
+ + (#2)^3 * \tl_item:nn {#1} {12}
+ }}
+ }
+
+ \tl_gclear:N \g_@@_output_tl
+ \@@_tl_gput_right_braced:NV \g_@@_output_tl \l_@@_tmpa_tl
+
+ \tl_clear:N \l_@@_tmpa_tl
+ \tl_set_eq:NN \l_@@_tmpa_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - #2)^3 * \tl_item:nn {#1} {2}
+ + 3 * (1 - #2)^2 * (#2) * \tl_item:nn {#1} {5}
+ + 3 * (1 - #2) * (#2)^2 * \tl_item:nn {#1} {8}
+ + (#2)^3 * \tl_item:nn {#1} {11}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2)^3 * \tl_item:nn {#1} {3}
+ + 3 * (1 - #2)^2 * (#2) * \tl_item:nn {#1} {6}
+ + 3 * (1 - #2) * (#2)^2 * \tl_item:nn {#1} {9}
+ + (#2)^3 * \tl_item:nn {#1} {12}
+ }}
+ }
+
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_curvetoa_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - #2)^2 * \tl_item:nn {#1} {5}
+ + 2 * (1 - #2) * (#2) * \tl_item:nn {#1} {8}
+ + (#2)^2 * \tl_item:nn {#1} {11}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2)^2 * \tl_item:nn {#1} {6}
+ + 2 * (1 - #2) * (#2) * \tl_item:nn {#1} {9}
+ + (#2)^2 * \tl_item:nn {#1} {12}
+ }}
+ }
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_curvetob_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {8} + (#2) * \tl_item:nn {#1} {11}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {9} + (#2) * \tl_item:nn {#1} {12}
+ }}
+ }
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_curveto_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl {
+ {\tl_item:nn {#1} {11}}
+ {\tl_item:nn {#1} {12}}
+ }
+
+ \@@_tl_gput_right_braced:NV \g_@@_output_tl \l_@@_tmpa_tl
+ \group_end:
+}
+\cs_generate_variant:Nn \@@_split_curve:nn {nv, nV}
+\cs_new_protected_nopar:Npn \spath_split_curve:NNnn #1#2#3#4
+{
+ \@@_split_curve:nn {#3}{#4}
+ \tl_set:Nx #1 {\tl_item:Nn \g_@@_output_tl {1}}
+ \tl_set:Nx #2 {\tl_item:Nn \g_@@_output_tl {2}}
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_split_curve:NNnn {NNnV, NNVn, NNVV}
+\cs_new_protected_nopar:Npn \spath_gsplit_curve:NNnn #1#2#3#4
+{
+ \@@_split_curve:nn {#3}{#4}
+ \tl_gset:Nx #1 {\tl_item:Nn \g_@@_output_tl {1}}
+ \tl_gset:Nx #2 {\tl_item:Nn \g_@@_output_tl {2}}
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_curve:NNnn {NNnV, NNVn, NNVV}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[internal]{
+% \spath_maybe_split_curve:Nn,
+% \spath_maybe_gsplit_curve:Nn,
+% }
+% Possibly splits a bezier curve to ensure that the pieces don't self-intersect.
+% Figuring out whether a Bezier cubic self intersects is apparently a difficult problem so we don't bother.
+% We compute a point such that if there is an intersection then it lies on either side of the point.
+% I don't recall where the formula came from!
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_maybe_split_curve:n #1
+{
+ \group_begin:
+ \fp_set:Nn \l_@@_tmpa_fp
+ {
+ (
+ \tl_item:nn {#1} {3}
+ - 3 * \tl_item:nn {#1} {6}
+ + 3 * \tl_item:nn {#1} {9}
+ - \tl_item:nn {#1} {12}
+ )
+ *
+ (3 * \tl_item:nn {#1} {8} - 3 * \tl_item:nn {#1} {11})
+ -
+ (
+ \tl_item:nn {#1} {2}
+ - 3 * \tl_item:nn {#1} {5}
+ + 3 * \tl_item:nn {#1} {8}
+ - \tl_item:nn {#1} {11}
+ )
+ *
+ (3 * \tl_item:nn {#1} {9} - 3 * \tl_item:nn {#1} {12})
+ }
+ \fp_set:Nn \l_@@_tmpb_fp
+ {
+ (
+ \tl_item:nn {#1} {2}
+ - 3 * \tl_item:nn {#1} {5}
+ + 3 * \tl_item:nn {#1} {8}
+ - \tl_item:nn {#1} {11}
+ )
+ *
+ (
+ 3 * \tl_item:nn {#1} {6}
+ - 6 * \tl_item:nn {#1} {9}
+ + 3 * \tl_item:nn {#1} {12}
+ )
+ -
+ (
+ \tl_item:nn {#1} {3}
+ - 3 * \tl_item:nn {#1} {6}
+ + 3 * \tl_item:nn {#1} {9}
+ - \tl_item:nn {#1} {12}
+ )
+ *
+ (
+ 3 * \tl_item:nn {#1} {5}
+ - 6 * \tl_item:nn {#1} {8}
+ + 3 * \tl_item:nn {#1} {11}
+ )
+ }
+ \fp_compare:nTF
+ {
+ \l_@@_tmpb_fp != 0
+ }
+ {
+ \fp_set:Nn \l_@@_tmpa_fp {.5 * \l_@@_tmpa_fp / \l_@@_tmpb_fp}
+ \fp_compare:nTF
+ {
+ 0 < \l_@@_tmpa_fp && \l_@@_tmpa_fp < 1
+ }
+ {
+ \@@_split_curve:nV {#1} \l_@@_tmpa_fp
+ }
+ {
+ \tl_gset:Nn \g_@@_output_tl { {#1} {} }
+ }
+ }
+ {
+ \tl_gset:Nn \g_@@_output_tl { {#1} {} }
+ }
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_maybe_split_curve:NNn #1#2#3
+{
+ \@@_maybe_split_curve:n {#3}
+ \tl_set:Nx #1 {\tl_item:Nn \g_@@_output_tl {1}}
+ \tl_set:Nx #2 {\tl_item:Nn \g_@@_output_tl {2}}
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_maybe_split_curve:NNn {NNn, NNV }
+\cs_new_protected_nopar:Npn \spath_maybe_gsplit_curve:NNn #1#2#3
+{
+ \@@_maybe_split_curve:n {#3}
+ \tl_gset:Nx #1 {\tl_item:Nn \g_@@_output_tl {1}}
+ \tl_gset:Nx #2 {\tl_item:Nn \g_@@_output_tl {2}}
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_maybe_gsplit_curve:NNn {NNn, NNV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_split_curves:Nn,
+% \spath_gsplit_curves:Nn,
+% }
+% Slurp through the path ensuring that beziers don't self-intersect.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_split_curves:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_clear:N \l_@@_tmpb_tl
+ \tl_clear:N \l_@@_tmpc_tl
+ \bool_do_until:nn
+ {
+ \tl_if_empty_p:N \l_@@_tmpa_tl
+ }
+ {
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_head:N \l_@@_tmpa_tl}
+ \tl_case:NnF \l_@@_tmpc_tl
+ {
+ \c_spath_curvetoa_tl
+ {
+ \tl_clear:N \l_@@_tmpd_tl
+ \tl_set_eq:NN \l_@@_tmpd_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l_@@_tmpd_tl
+ {
+ { \dim_use:N \l_@@_tmpa_dim }
+ { \dim_use:N \l_@@_tmpb_dim }
+ }
+ \dim_set:Nn \l_@@_tmpa_dim
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {8}
+ }
+ \dim_set:Nn \l_@@_tmpb_dim
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {9}
+ }
+ \prg_replicate:nn {3}
+ {
+ \tl_put_right:Nx \l_@@_tmpd_tl
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {1}
+ {\tl_item:Nn \l_@@_tmpa_tl {2}}
+ {\tl_item:Nn \l_@@_tmpa_tl {3}}
+ }
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+ }
+
+ \spath_maybe_split_curve:NNV
+ \l_@@_tmpd_tl
+ \l_@@_tmpe_tl
+ \l_@@_tmpd_tl
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l_@@_tmpd_tl {\tl_tail:N \l_@@_tmpd_tl}
+ \tl_set:Nx \l_@@_tmpe_tl {\tl_tail:N \l_@@_tmpe_tl}
+ }
+ \tl_put_right:NV \l_@@_tmpb_tl \l_@@_tmpd_tl
+ \tl_put_right:NV \l_@@_tmpb_tl \l_@@_tmpe_tl
+ }
+ }
+ {
+ \dim_set:Nn \l_@@_tmpa_dim
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {2}
+ }
+ \dim_set:Nn \l_@@_tmpb_dim
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {3}
+ }
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {1}
+ {\tl_item:Nn \l_@@_tmpa_tl {2}}
+ {\tl_item:Nn \l_@@_tmpa_tl {3}}
+ }
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+ }
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_split_curves:Nn #1#2
+{
+ \@@_split_curves:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_split_curves:Nn {NV, cV, cn, cv }
+\cs_new_protected_nopar:Npn \spath_split_curves:N #1
+{
+ \spath_split_curves:NV #1#1
+}
+\cs_generate_variant:Nn \spath_split_curves:N {c}
+\cs_new_protected_nopar:Npn \spath_gsplit_curves:Nn #1#2
+{
+ \@@_split_curves:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_curves:Nn {NV, cV, cn, cv }
+\cs_new_protected_nopar:Npn \spath_gsplit_curves:N #1
+{
+ \spath_gsplit_curves:NV #1#1
+}
+\cs_generate_variant:Nn \spath_gsplit_curves:N {c}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_split_line:NNnn,
+% \spath_gsplit_line:NNnn
+% }
+% Splits a line segment.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_split_line:nn #1#2
+{
+ \group_begin:
+ \tl_set_eq:NN \l_@@_tmpa_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl {
+ {\tl_item:nn {#1} {2}}
+ {\tl_item:nn {#1} {3}}
+ }
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_lineto_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {2} + (#2) * \tl_item:nn {#1} {5}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {3} + (#2) * \tl_item:nn {#1} {6}
+ }}
+ }
+ \tl_gclear:N \g_@@_output_tl
+ \@@_tl_gput_right_braced:NV \g_@@_output_tl \l_@@_tmpa_tl
+
+ \tl_clear:N \l_@@_tmpa_tl
+ \tl_set_eq:NN \l_@@_tmpa_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {2} + (#2) * \tl_item:nn {#1} {5}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - #2) * \tl_item:nn {#1} {3} + (#2) * \tl_item:nn {#1} {6}
+ }}
+ }
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_lineto_tl
+ \tl_put_right:Nx \l_@@_tmpa_tl {
+ {\tl_item:nn {#1} {5}}
+ {\tl_item:nn {#1} {6}}
+ }
+
+ \@@_tl_gput_right_braced:NV \g_@@_output_tl \l_@@_tmpa_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_split_line:NNnn #1#2#3#4
+{
+ \@@_split_line:nn {#3}{#4}
+ \tl_set:Nx #1 {\tl_item:Nn \g_@@_output_tl {1}}
+ \tl_set:Nx #2 {\tl_item:Nn \g_@@_output_tl {2}}
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_split_line:NNnn {NNnV, NNVn, NNVV}
+\cs_new_protected_nopar:Npn \spath_gsplit_line:NNnn #1#2#3#4
+{
+ \@@_split_line:nn {#3}{#4}
+ \tl_gset:Nx #1 {\tl_item:Nn \g_@@_output_tl {1}}
+ \tl_gset:Nx #2 {\tl_item:Nn \g_@@_output_tl {2}}
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_line:NNnn {NNnV, NNVn, NNVV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_split_at:NNnn,
+% \spath_split_at:Nnn,
+% \spath_split_at:Nn,
+% \spath_gsplit_at:NNnn
+% \spath_gsplit_at:Nnn,
+% \spath_gsplit_at:Nn
+% }
+% Split a path according to the parameter generated by the intersection routine.
+% The versions with two \texttt{N} arguments stores the two parts in two macros, the version with a single \texttt{N} joins them back into a single path (as separate components).
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_split_at:nn #1#2
+{
+ \group_begin:
+ \int_set:Nn \l_@@_tmpa_int {\fp_to_int:n {floor(#2) + 1}}
+ \fp_set:Nn \l_@@_tmpa_fp {#2 - floor(#2)}
+
+ % Is split point near one end or other of a component?
+ \fp_compare:nT
+ {
+ \l_@@_tmpa_fp < 0.01
+ }
+ {
+ % Near the start, so we'll place it at the start
+ \fp_set:Nn \l_@@_tmpa_fp {0}
+ }
+ \fp_compare:nT
+ {
+ \l_@@_tmpa_fp > 0.99
+ }
+ {
+ % Near the end, so we'll place it at the end
+ \fp_set:Nn \l_@@_tmpa_fp {0}
+ \int_incr:N \l_@@_tmpa_int
+ }
+
+ \int_zero:N \l_@@_tmpb_int
+ \bool_set_true:N \l_@@_tmpa_bool
+
+ \tl_set:Nn \l_@@_tmpe_tl {#1}
+ \tl_clear:N \l_@@_tmpc_tl
+
+ \dim_zero:N \l_@@_tmpa_dim
+ \dim_zero:N \l_@@_tmpb_dim
+
+ \bool_until_do:nn {
+ \tl_if_empty_p:N \l_@@_tmpe_tl
+ ||
+ \int_compare_p:n { \l_@@_tmpa_int == \l_@@_tmpb_int }
+ }
+ {
+ \tl_set:Nx \l_@@_tmpf_tl {\tl_head:N \l_@@_tmpe_tl}
+ \tl_set:Nx \l_@@_tmpe_tl {\tl_tail:N \l_@@_tmpe_tl }
+ \tl_case:Nn \l_@@_tmpf_tl
+ {
+ \c_spath_lineto_tl
+ {
+ \int_incr:N \l_@@_tmpb_int
+ }
+ \c_spath_curvetoa_tl
+ {
+ \int_incr:N \l_@@_tmpb_int
+ }
+ }
+ \int_compare:nT { \l_@@_tmpb_int < \l_@@_tmpa_int }
+ {
+ \tl_put_right:NV \l_@@_tmpc_tl \l_@@_tmpf_tl
+
+ \tl_put_right:Nx \l_@@_tmpc_tl
+ {{ \tl_head:N \l_@@_tmpe_tl }}
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_head:N \l_@@_tmpe_tl}
+ \tl_set:Nx \l_@@_tmpe_tl {\tl_tail:N \l_@@_tmpe_tl }
+
+ \tl_put_right:Nx \l_@@_tmpc_tl
+ {{ \tl_head:N \l_@@_tmpe_tl }}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_head:N \l_@@_tmpe_tl}
+ \tl_set:Nx \l_@@_tmpe_tl {\tl_tail:N \l_@@_tmpe_tl }
+
+ }
+ }
+
+ \tl_clear:N \l_@@_tmpd_tl
+ \tl_put_right:NV \l_@@_tmpd_tl \c_spath_moveto_tl
+ \tl_put_right:Nx \l_@@_tmpd_tl
+ {
+ {\dim_use:N \l_@@_tmpa_dim}
+ {\dim_use:N \l_@@_tmpb_dim}
+ }
+
+ \fp_compare:nTF
+ {
+ \l_@@_tmpa_fp == 0
+ }
+ {
+ \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_tmpd_tl
+ \tl_if_empty:NF \l_@@_tmpe_tl
+ {
+ \tl_put_right:NV \l_@@_tmpb_tl \l_@@_tmpf_tl
+ \tl_put_right:NV \l_@@_tmpb_tl \l_@@_tmpe_tl
+ }
+ }
+ {
+
+ \tl_case:Nn \l_@@_tmpf_tl
+ {
+ \c_spath_lineto_tl
+ {
+ \tl_put_right:NV \l_@@_tmpd_tl \l_@@_tmpf_tl
+ \tl_put_right:Nx \l_@@_tmpd_tl
+ {{ \tl_head:N \l_@@_tmpe_tl }}
+ \tl_set:Nx \l_@@_tmpe_tl {\tl_tail:N \l_@@_tmpe_tl }
+
+ \tl_put_right:Nx \l_@@_tmpd_tl
+ {{ \tl_head:N \l_@@_tmpe_tl }}
+ \tl_set:Nx \l_@@_tmpe_tl {\tl_tail:N \l_@@_tmpe_tl }
+
+ \spath_split_line:NNVV
+ \l_@@_tmpa_tl
+ \l_@@_tmpb_tl
+ \l_@@_tmpd_tl
+ \l_@@_tmpa_fp
+
+ \prg_replicate:nn {3} {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+
+ \tl_put_right:NV \l_@@_tmpc_tl \l_@@_tmpa_tl
+ \tl_put_right:NV \l_@@_tmpb_tl \l_@@_tmpe_tl
+ }
+ \c_spath_curvetoa_tl
+ {
+ \tl_put_right:NV \l_@@_tmpd_tl \l_@@_tmpf_tl
+ \tl_put_right:Nx \l_@@_tmpd_tl
+ {{ \tl_head:N \l_@@_tmpe_tl }}
+ \tl_set:Nx \l_@@_tmpe_tl {\tl_tail:N \l_@@_tmpe_tl }
+
+ \tl_put_right:Nx \l_@@_tmpd_tl
+ {{ \tl_head:N \l_@@_tmpe_tl }}
+ \tl_set:Nx \l_@@_tmpe_tl {\tl_tail:N \l_@@_tmpe_tl }
+
+ \prg_replicate:nn {2} {
+
+ \tl_put_right:Nx \l_@@_tmpd_tl
+ { \tl_head:N \l_@@_tmpe_tl }
+ \tl_set:Nx \l_@@_tmpe_tl {\tl_tail:N \l_@@_tmpe_tl }
+
+ \tl_put_right:Nx \l_@@_tmpd_tl
+ {{ \tl_head:N \l_@@_tmpe_tl }}
+ \tl_set:Nx \l_@@_tmpe_tl {\tl_tail:N \l_@@_tmpe_tl }
+
+ \tl_put_right:Nx \l_@@_tmpd_tl
+ {{ \tl_head:N \l_@@_tmpe_tl }}
+ \tl_set:Nx \l_@@_tmpe_tl {\tl_tail:N \l_@@_tmpe_tl }
+ }
+
+ \spath_split_curve:NNVV
+ \l_@@_tmpa_tl
+ \l_@@_tmpb_tl
+ \l_@@_tmpd_tl \l_@@_tmpa_fp
+
+ \prg_replicate:nn {3} {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+
+ \tl_put_right:NV \l_@@_tmpc_tl \l_@@_tmpa_tl
+ \tl_put_right:NV \l_@@_tmpb_tl \l_@@_tmpe_tl
+ }
+ }
+ }
+
+ \tl_gclear:N \g_@@_output_tl
+ \@@_tl_gput_right_braced:NV \g_@@_output_tl \l_@@_tmpc_tl
+ \@@_tl_gput_right_braced:NV \g_@@_output_tl \l_@@_tmpb_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_split_at:NNnn #1#2#3#4
+{
+ \@@_split_at:nn {#3}{#4}
+ \tl_set:Nx #1 {\tl_item:Nn \g_@@_output_tl {1}}
+ \tl_set:Nx #2 {\tl_item:Nn \g_@@_output_tl {2}}
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_split_at:NNnn {NNVn, NNVV, NNnV}
+\cs_new_protected_nopar:Npn \spath_gsplit_at:NNnn #1#2#3#4
+{
+ \@@_split_at:nn {#3}{#4}
+ \tl_gset:Nx #1 {\tl_item:Nn \g_@@_output_tl {1}}
+ \tl_gset:Nx #2 {\tl_item:Nn \g_@@_output_tl {2}}
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_at:NNnn {NNVn, NNVV, NNnV}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_split_at:Nnn #1#2#3
+{
+ \@@_split_at:nn {#2}{#3}
+ \tl_set:Nx #1
+ {
+ \tl_item:Nn \g_@@_output_tl {1}
+ \tl_item:Nn \g_@@_output_tl {2}
+ }
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_split_at:Nnn {NVn, NVV}
+\cs_new_protected_nopar:Npn \spath_split_at:Nn #1#2
+{
+ \spath_split_at:NVn #1#1{#2}
+}
+\cs_new_protected_nopar:Npn \spath_gsplit_at:Nnn #1#2#3
+{
+ \@@_split_at:nn {#2}{#3}
+ \tl_gset:Nx #1
+ {
+ \tl_item:Nn \g_@@_output_tl {1}
+ \tl_item:Nn \g_@@_output_tl {2}
+ }
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_at:Nnn {NVn, NVV}
+\cs_new_protected_nopar:Npn \spath_gsplit_at:Nn #1#2
+{
+ \spath_gsplit_at:NVn #1#1{#2}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Shortening Paths}
+%
+% This code relates to shortening paths.
+% For curved paths, the routine uses the derivative at the end to figure out how far back to shorten.
+% This means that the actual length that it shortens by is approximate, but it is guaranteed to be along its length.
+%
+% As in the previous section, there are various versions.
+% In particular, there are versions where the path can be specified by a macro and is saved back into that macro.
+%
+% \begin{macro}[internal]{
+% \spath_shorten_at_end:Nnn
+% }
+% This macro shortens a path from the end by a dimension.
+%
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_shorten_at_end:nn #1#2
+{
+ \int_compare:nTF
+ {
+ \tl_count:n {#1} > 3
+ }
+ {
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_reverse:N \l_@@_tmpa_tl
+
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_item:Nn \l_@@_tmpa_tl {3}}
+
+ \tl_clear:N \l_@@_tmpe_tl
+ \tl_if_eq:NNTF \l_@@_tmpb_tl \c_spath_curveto_tl
+ {
+ \int_set:Nn \l_@@_tmpa_int {3}
+ }
+ {
+ \int_set:Nn \l_@@_tmpa_int {1}
+ }
+
+ \prg_replicate:nn { \l_@@_tmpa_int }
+ {
+ \tl_put_right:Nx \l_@@_tmpe_tl
+ {
+ {\tl_head:N \l_@@_tmpa_tl}
+ }
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \tl_put_right:Nx \l_@@_tmpe_tl
+ {
+ {\tl_head:N \l_@@_tmpa_tl}
+ }
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ \tl_put_right:Nx \l_@@_tmpe_tl
+ {
+ \tl_head:N \l_@@_tmpa_tl
+ }
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+
+ \tl_put_right:Nx \l_@@_tmpe_tl
+ {
+ {\tl_item:Nn \l_@@_tmpa_tl {1}}
+ {\tl_item:Nn \l_@@_tmpa_tl {2}}
+ }
+ \tl_put_right:NV \l_@@_tmpe_tl \c_spath_moveto_tl
+
+ \tl_reverse:N \l_@@_tmpa_tl
+
+ \fp_set:Nn \l_@@_tmpa_fp
+ {
+ \dim_to_fp:n {\tl_item:Nn \l_@@_tmpe_tl {4}}
+ -
+ \dim_to_fp:n {\tl_item:Nn \l_@@_tmpe_tl {1}}
+ }
+
+ \fp_set:Nn \l_@@_tmpb_fp
+ {
+ \dim_to_fp:n {\tl_item:Nn \l_@@_tmpe_tl {5}}
+ -
+ \dim_to_fp:n {\tl_item:Nn \l_@@_tmpe_tl {2}}
+ }
+
+ \fp_set:Nn \l_@@_tmpc_fp
+ {
+ sqrt(
+ \l_@@_tmpa_fp * \l_@@_tmpa_fp
+ +
+ \l_@@_tmpb_fp * \l_@@_tmpb_fp
+ ) * \l_@@_tmpa_int
+ }
+
+ \fp_compare:nTF
+ {
+ \l_@@_tmpc_fp > #2
+ }
+ {
+
+ \fp_set:Nn \l_@@_tmpc_fp
+ {
+ (\l_@@_tmpc_fp - #2)/ \l_@@_tmpc_fp
+ }
+
+ \tl_reverse:N \l_@@_tmpe_tl
+
+ \tl_if_eq:NNTF \l_@@_tmpb_tl \c_spath_curveto_tl
+ {
+ \spath_split_curve:NNVV
+ \l_@@_tmpc_tl
+ \l_@@_tmpd_tl
+ \l_@@_tmpe_tl
+ \l_@@_tmpc_fp
+ }
+ {
+ \spath_split_line:NNVV
+ \l_@@_tmpc_tl
+ \l_@@_tmpd_tl
+ \l_@@_tmpe_tl
+ \l_@@_tmpc_fp
+ }
+
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ }
+
+ \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpc_tl
+
+ }
+ {
+
+ \int_compare:nT
+ {
+ \tl_count:N \l_@@_tmpa_tl > 3
+ }
+ {
+ \dim_set:Nn \l_@@_tmpa_dim {\fp_to_dim:n {#2 - \l_@@_tmpc_fp } }
+ \spath_shorten_at_end:NV \l_@@_tmpa_tl \l_@@_tmpa_dim
+ }
+ }
+
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpa_tl
+ \group_end:
+ }
+ {
+ \tl_gset:Nn \g_@@_output_tl {#1}
+ }
+}
+\cs_new_protected_nopar:Npn \spath_shorten_at_end:Nnn #1#2#3
+{
+ \@@_shorten_at_end:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_shorten_at_end:Nnn {NVV, cnn, cVV, NVn}
+\cs_new_protected_nopar:Npn \spath_shorten_at_end:Nn #1#2
+{
+ \spath_shorten_at_end:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_shorten_at_end:Nn {cn, cV, NV}
+\cs_new_protected_nopar:Npn \spath_gshorten_at_end:Nnn #1#2#3
+{
+ \@@_shorten_at_end:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gshorten_at_end:Nnn {NVV, cnn, cVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gshorten_at_end:Nn #1#2
+{
+ \spath_gshorten_at_end:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gshorten_at_end:Nn {cn, cV, NV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_shorten_at_start:Nnn,
+% \spath_shorten_at_start:Nn,
+% \spath_gshorten_at_start:Nnn,
+% \spath_gshorten_at_start:Nn
+% }
+%
+% This macro shortens a path from the start by a dimension.
+%
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_shorten_at_start:nn #1#2
+{
+ \int_compare:nTF
+ {
+ \tl_count:n {#1} > 3
+ }
+ {
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_item:Nn \l_@@_tmpa_tl {4}}
+
+ \tl_clear:N \l_@@_tmpe_tl
+
+ \tl_if_eq:NNTF \l_@@_tmpb_tl \c_spath_curvetoa_tl
+ {
+ \int_set:Nn \l_@@_tmpa_int {3}
+ }
+ {
+ \int_set:Nn \l_@@_tmpa_int {1}
+ }
+
+ \tl_set_eq:NN \l_@@_tmpe_tl \c_spath_moveto_tl
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl }
+
+ \prg_replicate:nn { \l_@@_tmpa_int }
+ {
+ \@@_tl_put_right_braced:Nx
+ \l_@@_tmpe_tl
+ {\tl_item:Nn \l_@@_tmpa_tl {1}}
+ \@@_tl_put_right_braced:Nx
+ \l_@@_tmpe_tl
+ {\tl_item:Nn \l_@@_tmpa_tl {2}}
+ \tl_put_right:Nx \l_@@_tmpe_tl {\tl_item:Nn \l_@@_tmpa_tl {3}}
+
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl }
+ }
+ }
+ \@@_tl_put_right_braced:Nx
+ \l_@@_tmpe_tl
+ {\tl_item:Nn \l_@@_tmpa_tl {1}}
+ \@@_tl_put_right_braced:Nx
+ \l_@@_tmpe_tl
+ {\tl_item:Nn \l_@@_tmpa_tl {2}}
+
+ \fp_set:Nn \l_@@_tmpa_fp
+ {
+ \dim_to_fp:n {\tl_item:Nn \l_@@_tmpe_tl {5}}
+ -
+ \dim_to_fp:n {\tl_item:Nn \l_@@_tmpe_tl {2}}
+ }
+
+ \fp_set:Nn \l_@@_tmpb_fp
+ {
+ \dim_to_fp:n {\tl_item:Nn \l_@@_tmpe_tl {6}}
+ -
+ \dim_to_fp:n {\tl_item:Nn \l_@@_tmpe_tl {3}}
+ }
+
+ \fp_set:Nn \l_@@_tmpc_fp
+ {
+ sqrt(
+ \l_@@_tmpa_fp * \l_@@_tmpa_fp
+ +
+ \l_@@_tmpb_fp * \l_@@_tmpb_fp
+ )
+ *
+ \l_@@_tmpa_int
+ }
+
+ \fp_compare:nTF
+ {
+ \l_@@_tmpc_fp > #2
+ }
+ {
+
+ \fp_set:Nn \l_@@_tmpc_fp
+ {
+ #2/ \l_@@_tmpc_fp
+ }
+
+ \tl_if_eq:NNTF \l_@@_tmpb_tl \c_spath_curvetoa_tl
+ {
+ \spath_split_curve:NNVV
+ \l_@@_tmpc_tl
+ \l_@@_tmpd_tl
+ \l_@@_tmpe_tl
+ \l_@@_tmpc_fp
+ }
+ {
+ \spath_split_line:NNVV
+ \l_@@_tmpc_tl
+ \l_@@_tmpd_tl
+ \l_@@_tmpe_tl
+ \l_@@_tmpc_fp
+ }
+
+ \prg_replicate:nn {2}
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+
+ \tl_put_left:NV \l_@@_tmpa_tl \l_@@_tmpd_tl
+
+ }
+ {
+
+ \tl_put_left:NV \l_@@_tmpa_tl \c_spath_moveto_tl
+
+ \int_compare:nT
+ {
+ \tl_count:N \l_@@_tmpa_tl > 3
+ }
+ {
+ \dim_set:Nn \l_@@_tmpa_dim {\fp_to_dim:n {#2 - \l_@@_tmpc_fp } }
+ \spath_shorten_at_start:NV \l_@@_tmpa_tl \l_@@_tmpa_dim
+ }
+ }
+
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpa_tl
+ \group_end:
+ }
+ {
+ \tl_gset:Nn \g_@@_output_tl {#1}
+ }
+}
+\cs_new_protected_nopar:Npn \spath_shorten_at_start:Nnn #1#2#3
+{
+ \@@_shorten_at_start:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_shorten_at_start:Nnn {NVV, cnn, cVV, NVn}
+\cs_new_protected_nopar:Npn \spath_shorten_at_start:Nn #1#2
+{
+ \spath_shorten_at_start:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_shorten_at_start:Nn {cn, cV, NV}
+\cs_new_protected_nopar:Npn \spath_gshorten_at_start:Nnn #1#2#3
+{
+ \@@_shorten_at_start:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gshorten_at_start:Nnn {NVV, cnn, cVV, NVn}
+\cs_new_protected_nopar:Npn \spath_gshorten_at_start:Nn #1#2
+{
+ \spath_gshorten_at_start:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gshorten_at_start:Nn {cn, cV, NV}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Points on a Path}
+%
+% \begin{macro}[internal]{
+% \spath_point_at:Nnn,
+% \spath_gpoint_at:Nnn,
+% }
+%
+% Get the location of a point on a path, using the same location specification as the intersection library.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_point_at:nn #1#2
+{
+ \group_begin:
+ \int_set:Nn \l_@@_tmpa_int {\fp_to_int:n {floor(#2) + 1}}
+ \fp_set:Nn \l_@@_tmpa_fp {#2 - floor(#2)}
+
+ \spath_segments_to_seq:Nn \l_@@_tmpa_seq {#1}
+
+ \int_compare:nTF
+ {
+ \l_@@_tmpa_int < 1
+ }
+ {
+ \spath_initialpoint:Nn \l_@@_tmpc_tl {#1}
+ }
+ {
+ \int_compare:nTF
+ {
+ \l_@@_tmpa_int > \seq_count:N \l_@@_tmpa_seq
+ }
+ {
+ \spath_finalpoint:Nn \l_@@_tmpc_tl {#1}
+ }
+ {
+
+ \tl_set:Nx
+ \l_@@_tmpa_tl
+ {\seq_item:Nn \l_@@_tmpa_seq { \l_@@_tmpa_int} }
+
+ \int_compare:nTF
+ {
+ \tl_count:N \l_@@_tmpa_tl > 3
+ }
+ {
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_item:Nn \l_@@_tmpa_tl {4}}
+ }
+ {
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_item:Nn \l_@@_tmpa_tl {1}}
+ }
+
+ \tl_clear:N \l_@@_tmpc_tl
+
+ \tl_case:Nn \l_@@_tmpb_tl
+ {
+ \c_spath_moveto_tl
+ {
+ \tl_set:Nx \l_@@_tmpc_tl
+ {
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {2}
+ }
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {3}
+ }
+ }
+ }
+
+ \c_spath_lineto_tl
+ {
+ \tl_set:Nx \l_@@_tmpc_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - \l_@@_tmpa_fp) * ( \tl_item:Nn \l_@@_tmpa_tl {2} )
+ +
+ \l_@@_tmpa_fp * ( \tl_item:Nn \l_@@_tmpa_tl {5} )
+ }
+ }
+ {\fp_to_dim:n
+ {
+ (1 - \l_@@_tmpa_fp) * ( \tl_item:Nn \l_@@_tmpa_tl {3} )
+ +
+ \l_@@_tmpa_fp * ( \tl_item:Nn \l_@@_tmpa_tl {6} )
+ }
+ }
+ }
+ }
+
+ \c_spath_closepath_tl
+ {
+ \tl_set:Nx \l_@@_tmpc_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - \l_@@_tmpa_fp) * ( \tl_item:Nn \l_@@_tmpa_tl {2} )
+ +
+ \l_@@_tmpa_fp * ( \tl_item:Nn \l_@@_tmpa_tl {5} )
+ }
+ }
+ {\fp_to_dim:n
+ {
+ (1 - \l_@@_tmpa_fp) * ( \tl_item:Nn \l_@@_tmpa_tl {3} )
+ +
+ \l_@@_tmpa_fp * ( \tl_item:Nn \l_@@_tmpa_tl {6} )
+ }
+ }
+ }
+ }
+
+ \c_spath_curvetoa_tl
+ {
+ \tl_set:Nx \l_@@_tmpc_tl
+ {
+ {\fp_to_dim:n
+ {
+ (1 - \l_@@_tmpa_fp)^3 * \tl_item:Nn \l_@@_tmpa_tl {2}
+ + 3 * (1 - \l_@@_tmpa_fp)^2 * (\l_@@_tmpa_fp)
+ * \tl_item:Nn \l_@@_tmpa_tl {5}
+ + 3 * (1 - \l_@@_tmpa_fp) * (\l_@@_tmpa_fp)^2
+ * \tl_item:Nn \l_@@_tmpa_tl {8}
+ + (\l_@@_tmpa_fp)^3 * \tl_item:Nn \l_@@_tmpa_tl {11}
+ }}
+ {\fp_to_dim:n
+ {
+ (1 - \l_@@_tmpa_fp)^3 * \tl_item:Nn \l_@@_tmpa_tl {3}
+ + 3 * (1 - \l_@@_tmpa_fp)^2 * (\l_@@_tmpa_fp)
+ * \tl_item:Nn \l_@@_tmpa_tl {6}
+ + 3 * (1 - \l_@@_tmpa_fp) * (\l_@@_tmpa_fp)^2
+ * \tl_item:Nn \l_@@_tmpa_tl {9}
+ + (\l_@@_tmpa_fp)^3 * \tl_item:Nn \l_@@_tmpa_tl {12}
+ }}
+ }
+ }
+ }
+ }
+ }
+
+ \tl_gclear:N \g_@@_output_tl
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpc_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_point_at:Nnn #1#2#3
+{
+ \@@_point_at:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_point_at:Nnn {NVn, NVV, NnV}
+\cs_new_protected_nopar:Npn \spath_gpoint_at:Nnn #1#2#3
+{
+ \@@_point_at:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gpoint_at:Nnn {NVn, NVV, NnV}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[internal]{
+% \spath_tangent_at:Nnn,
+% \spath_gtangent_at:Nnn,
+% }
+%
+% Get the tangent at a point on a path, using the same location specification as the intersection library.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_tangent_at:nn #1#2
+{
+ \group_begin:
+ \int_set:Nn \l_@@_tmpa_int {\fp_to_int:n {floor(#2) + 1}}
+ \fp_set:Nn \l_@@_tmpa_fp {#2 - floor(#2)}
+
+ \spath_segments_to_seq:Nn \l_@@_tmpa_seq {#1}
+
+ \int_compare:nTF
+ {
+ \l_@@_tmpa_int < 1
+ }
+ {
+ \spath_initialpoint:Nn \l_@@_tmpc_tl {#1}
+ }
+ {
+ \int_compare:nTF
+ {
+ \l_@@_tmpa_int > \seq_count:N \l_@@_tmpa_seq
+ }
+ {
+ \spath_finalpoint:Nn \l_@@_tmpc_tl {#1}
+ }
+ {
+
+ \tl_set:Nx
+ \l_@@_tmpa_tl
+ {\seq_item:Nn \l_@@_tmpa_seq { \l_@@_tmpa_int} }
+
+ \int_compare:nTF
+ {
+ \tl_count:N \l_@@_tmpa_tl > 3
+ }
+ {
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_item:Nn \l_@@_tmpa_tl {4}}
+ }
+ {
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_item:Nn \l_@@_tmpa_tl {1}}
+ }
+
+ \tl_clear:N \l_@@_tmpc_tl
+
+ \tl_case:Nn \l_@@_tmpb_tl
+ {
+ \c_spath_moveto_tl
+ {
+ \tl_set:Nx \l_@@_tmpc_tl
+ {
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {2}
+ }
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {3}
+ }
+ }
+ }
+
+ \c_spath_lineto_tl
+ {
+ \tl_set:Nx \l_@@_tmpc_tl
+ {
+ {\fp_to_dim:n
+ {
+ ( \tl_item:Nn \l_@@_tmpa_tl {5} )
+ -
+ ( \tl_item:Nn \l_@@_tmpa_tl {2} )
+ }
+ }
+ {\fp_to_dim:n
+ {
+ ( \tl_item:Nn \l_@@_tmpa_tl {6} )
+ -
+ ( \tl_item:Nn \l_@@_tmpa_tl {3} )
+ }
+ }
+ }
+ }
+
+ \c_spath_closepath_tl
+ {
+ \tl_set:Nx \l_@@_tmpc_tl
+ {
+ {\fp_to_dim:n
+ {
+ ( \tl_item:Nn \l_@@_tmpa_tl {5} )
+ -
+ ( \tl_item:Nn \l_@@_tmpa_tl {2} )
+ }
+ }
+ {\fp_to_dim:n
+ {
+ ( \tl_item:Nn \l_@@_tmpa_tl {6} )
+ -
+ ( \tl_item:Nn \l_@@_tmpa_tl {3} )
+ }
+ }
+ }
+ }
+
+ \c_spath_curvetoa_tl
+ {
+ \tl_set:Nx \l_@@_tmpc_tl
+ {
+ {\fp_to_dim:n
+ {
+ 3*(1 - \l_@@_tmpa_fp)^2 * (\tl_item:Nn \l_@@_tmpa_tl {5}
+ - \tl_item:Nn \l_@@_tmpa_tl {2})
+ + 6 * (1 - \l_@@_tmpa_fp) * (\l_@@_tmpa_fp) *
+ (\tl_item:Nn \l_@@_tmpa_tl {8}
+ - \tl_item:Nn \l_@@_tmpa_tl {5})
+ + 3*(\l_@@_tmpa_fp)^2 * (\tl_item:Nn \l_@@_tmpa_tl {11}
+ - \tl_item:Nn \l_@@_tmpa_tl {8})
+ }
+ }
+ {\fp_to_dim:n
+ {
+ 3*(1 - \l_@@_tmpa_fp)^2 * (\tl_item:Nn \l_@@_tmpa_tl {6}
+ - \tl_item:Nn \l_@@_tmpa_tl {3})
+ + 6 * (1 - \l_@@_tmpa_fp) * (\l_@@_tmpa_fp) *
+ (\tl_item:Nn \l_@@_tmpa_tl {9}
+ - \tl_item:Nn \l_@@_tmpa_tl {6})
+ + 3*(\l_@@_tmpa_fp)^2 * (\tl_item:Nn \l_@@_tmpa_tl {12}
+ - \tl_item:Nn \l_@@_tmpa_tl {9})
+ }}
+ }
+ }
+ }
+ }
+ }
+
+ \tl_gclear:N \g_@@_output_tl
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpc_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_tangent_at:Nnn #1#2#3
+{
+ \@@_tangent_at:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_tangent_at:Nnn {NVn, NVV, NnV}
+\cs_new_protected_nopar:Npn \spath_gtangent_at:Nnn #1#2#3
+{
+ \@@_tangent_at:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gtangent_at:Nnn {NVn, NVV, NnV}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[internal]{
+% \spath_transformation_at:Nnn,
+% \spath_gtransformation_at:Nnn
+% }
+% Gets a transformation that will align to a point on the path with the x-axis along the path.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_transformation_at:nn #1#2
+{
+ \group_begin:
+ \tl_clear:N \l_@@_tmpa_tl
+ \@@_tangent_at:nn {#1}{#2}
+ \tl_set_eq:NN \l_@@_tmpb_tl \g_@@_output_tl
+ \fp_set:Nn \l_@@_tmpa_fp
+ {
+ sqrt(
+ (\tl_item:Nn \l_@@_tmpb_tl {1})^2
+ +
+ (\tl_item:Nn \l_@@_tmpb_tl {2})^2
+ )
+ }
+ \fp_compare:nTF {\l_@@_tmpa_fp = 0}
+ {
+ \fp_set:Nn \l_@@_tmpa_fp {1}
+ \fp_set:Nn \l_@@_tmpb_fp {0}
+ }
+ {
+ \fp_set:Nn \l_@@_tmpb_fp
+ { (\tl_item:Nn \l_@@_tmpb_tl {2}) / \l_@@_tmpa_fp }
+ \fp_set:Nn \l_@@_tmpa_fp
+ { (\tl_item:Nn \l_@@_tmpb_tl {1}) / \l_@@_tmpa_fp }
+ }
+ \tl_set:Nx \l_@@_tmpa_tl
+ {
+ { \fp_to_decimal:n { \l_@@_tmpa_fp } }
+ { \fp_to_decimal:n { \l_@@_tmpb_fp } }
+ { \fp_to_decimal:n {- \l_@@_tmpb_fp } }
+ { \fp_to_decimal:n { \l_@@_tmpa_fp } }
+ }
+ \@@_point_at:nn {#1}{#2}
+ \tl_put_right:NV \l_@@_tmpa_tl \g_@@_output_tl
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpa_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_transformation_at:Nnn #1#2#3
+{
+ \@@_transformation_at:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_transformation_at:Nnn {NVn, NVV, NnV, NvV}
+\cs_new_protected_nopar:Npn \spath_gtransformation_at:Nnn #1#2#3
+{
+ \@@_transformation_at:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gtransformation_at:Nnn {NVn, NVV, NnV}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Intersection Routines}
+%
+% Note: I'm not consistent with number schemes.
+% The intersection library is 0-based, but the user interface is 1-based (since if we ``count'' in a \Verb+\foreach+ then it starts at 1).
+% This should be more consistent.
+%
+% \begin{macro}[internal]{
+% \spath_intersect:NN,
+% \spath_intersect:nn,
+% }
+% Pass two spaths to pgf's intersection routine.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_intersect:NN #1#2
+{
+ \pgfintersectionofpaths%
+ {%
+ \pgfsetpath #1
+ }{%
+ \pgfsetpath #2
+ }
+}
+\cs_new_protected_nopar:Npn \spath_intersect:nn #1#2
+{
+ \tl_set:Nn \l_@@_intersecta_tl {#1}
+ \tl_set:Nn \l_@@_intersectb_tl {#2}
+ \spath_intersect:NN \l_@@_intersecta_tl \l_@@_intersectb_tl
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_split_component_at_intersections:Nnn
+% }
+% Split a component where it intersects a path.
+% Key assumption is that the first path is a single component, so if it is closed then the end joins up to the beginning.
+% The component is modified but the path is not.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_split_component_at_intersections:nn #1#2
+{
+ \group_begin:
+ \tl_clear:N \l_@@_tmpe_tl
+ \seq_clear:N \l_@@_tmpb_seq
+
+ % Find the intersections of these segments
+ \tl_set:Nn \l_@@_tmpb_tl {#1}
+ \tl_set:Nn \l_@@_tmpc_tl {#2}
+
+ \spath_reallength:Nn \l_@@_tmpa_int {#1}
+
+ % Remember if the component is closed
+ \spath_finalaction:NV \l_@@_tmpa_tl \l_@@_tmpb_tl
+
+ \bool_set:Nn \l_@@_closed_bool
+ {
+ \tl_if_eq_p:NN \l_@@_tmpa_tl \c_spath_closepath_tl
+ }
+
+ % Open it
+ \spath_open:N \l_@@_tmpb_tl
+
+ % Sort intersections along the component
+ \pgfintersectionsortbyfirstpath
+ \spath_intersect:NN \l_@@_tmpb_tl \l_@@_tmpc_tl
+
+ % If we get intersections
+ \int_compare:nT {\pgfintersectionsolutions > 0}
+ {
+ % Find the times of the intersections on the component
+ \int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions}
+ {
+ \pgfintersectiongetsolutiontimes{##1}{\l_@@_tmph_tl}{\l_@@_tmpi_tl}
+ \seq_put_left:NV \l_@@_tmpb_seq \l_@@_tmph_tl
+ }
+
+ \seq_get_left:NN \l_@@_tmpb_seq \l_@@_tmpa_tl
+ \fp_compare:nT
+ {
+ \l_@@_tmpa_tl > \l_@@_tmpa_int - .01
+ }
+ {
+ \bool_set_false:N \l_@@_closed_bool
+ }
+ \seq_get_right:NN \l_@@_tmpb_seq \l_@@_tmpa_tl
+ \fp_compare:nT
+ {
+ \l_@@_tmpa_tl < .01
+ }
+ {
+ \bool_set_false:N \l_@@_closed_bool
+ }
+
+
+ \tl_set:Nn \l_@@_tmpg_tl {-1}
+
+ \seq_map_inline:Nn \l_@@_tmpb_seq
+ {
+ \tl_set:Nn \l_@@_tmph_tl {##1}
+
+ \tl_set_eq:NN \l_@@_tmpa_tl \l_@@_tmph_tl
+ \int_compare:nT
+ {
+ \fp_to_int:n {floor( \l_@@_tmph_tl) }
+ =
+ \fp_to_int:n {floor( \l_@@_tmpg_tl) }
+ }
+ {
+ \tl_set:Nx \l_@@_tmph_tl
+ {
+ \fp_eval:n {
+ floor( \l_@@_tmph_tl )
+ +
+ ( \l_@@_tmph_tl - floor( \l_@@_tmph_tl) )
+ /
+ ( \l_@@_tmpg_tl - floor( \l_@@_tmpg_tl) )
+ }
+ }
+ }
+ \tl_set_eq:NN \l_@@_tmpg_tl \l_@@_tmpa_tl
+
+ \spath_split_at:NNVV
+ \l_@@_tmpd_tl
+ \l_@@_tmpf_tl
+ \l_@@_tmpb_tl
+ \l_@@_tmph_tl
+
+ \tl_put_left:NV \l_@@_tmpe_tl \l_@@_tmpf_tl
+ \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_tmpd_tl
+
+ }
+
+
+ \tl_put_left:NV \l_@@_tmpe_tl \l_@@_tmpb_tl
+
+ \spath_remove_empty_components:N \l_@@_tmpe_tl
+
+ \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_tmpe_tl
+ }
+
+ \bool_if:NT \l_@@_closed_bool
+ {
+ \spath_join_component:Nn \l_@@_tmpb_tl {1}
+ }
+
+ \tl_gclear:N \g_@@_output_tl
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpb_tl
+
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_split_component_at_intersections:Nnn #1#2#3
+{
+ \@@_split_component_at_intersections:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_split_component_at_intersections:Nnn {NVn, NVV}
+\cs_new_protected_nopar:Npn \spath_split_component_at_intersections:Nn #1#2
+{
+ \spath_split_component_at_intersections:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_split_component_at_intersections:Nn {cn, cv}
+\cs_new_protected_nopar:Npn \spath_gsplit_component_at_intersections:Nnn #1#2#3
+{
+ \@@_split_component_at_intersections:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_component_at_intersections:Nnn {NVn, NVV}
+\cs_new_protected_nopar:Npn \spath_gsplit_component_at_intersections:Nn #1#2
+{
+ \spath_gsplit_component_at_intersections:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gsplit_component_at_intersections:Nn {cn, cv}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[internal]{
+% \spath_split_path_at_intersections:Nnn,
+% \spath_split_path_at_intersections:Nn,
+% \spath_gsplit_path_at_intersections:Nnn,
+% \spath_gsplit_path_at_intersections:Nn,
+% \spath_split_at_intersections:NNnn,
+% \spath_split_at_intersections:NN,
+% \spath_gsplit_at_intersections:NNnn,
+% \spath_gsplit_at_intersections:NN,
+% }
+% Split paths at their intersections.
+% The \Verb+path+ versions only split the first path.
+% The others split both paths.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_split_path_at_intersections:nn #1#2
+{
+ \group_begin:
+
+ \seq_clear:N \l_@@_tmpa_seq
+ \seq_clear:N \l_@@_tmpb_seq
+
+ \spath_components_to_seq:Nn \l_@@_tmpa_seq {#1}
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \spath_split_component_at_intersections:Nnn \l_@@_tmpa_tl {##1} {#2}
+ \seq_put_right:NV \l_@@_tmpb_seq \l_@@_tmpa_tl
+ }
+
+ \tl_gclear:N \g_@@_output_tl
+ \tl_gset:Nx \g_@@_output_tl {\seq_use:Nn \l_@@_tmpb_seq {} }
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_split_path_at_intersections:Nnn #1#2#3
+{
+ \@@_split_path_at_intersections:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_split_path_at_intersections:Nnn
+{NVn, NVV, cVn, cVV, cvn, cvv}
+\cs_new_protected_nopar:Npn \spath_split_path_at_intersections:Nn #1#2
+{
+ \spath_split_path_at_intersections:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_split_path_at_intersections:Nn {cv, NV}
+\cs_new_protected_nopar:Npn \spath_gsplit_path_at_intersections:Nnn #1#2#3
+{
+ \@@_split_path_at_intersections:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_path_at_intersections:Nnn
+{NVn, NVV, cVn, cVV, cvn, cvv}
+\cs_new_protected_nopar:Npn \spath_gsplit_path_at_intersections:Nn #1#2
+{
+ \spath_gsplit_path_at_intersections:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gsplit_path_at_intersections:Nn {cv, NV}
+\cs_new_protected_nopar:Npn \spath_split_at_intersections:NNnn #1#2#3#4
+{
+ \@@_split_path_at_intersections:nn {#3}{#4}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \@@_split_path_at_intersections:nn {#4}{#3}
+ \tl_set_eq:NN #2 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_split_at_intersections:NNnn
+{NNVn, NNVV, ccVn, ccVV, ccvn, ccvv}
+\cs_new_protected_nopar:Npn \spath_split_at_intersections:NN #1#2
+{
+ \spath_split_at_intersections:NNVV #1#2#1#2
+}
+\cs_generate_variant:Nn \spath_split_at_intersections:NN {cc}
+\cs_new_protected_nopar:Npn \spath_gsplit_at_intersections:NNnn #1#2#3#4
+{
+ \@@_split_path_at_intersections:nn {#3}{#4}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \@@_split_path_at_intersections:nn {#4}{#3}
+ \tl_gset_eq:NN #2 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_at_intersections:NNnn
+{NNVn, NNVV, ccVn, ccVV, ccvn, ccvv}
+\cs_new_protected_nopar:Npn \spath_gsplit_at_intersections:NN #1#2
+{
+ \spath_gsplit_at_intersections:NNVV #1#2#1#2
+}
+\cs_generate_variant:Nn \spath_gsplit_at_intersections:NN {cc}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}[internal]{
+% \spath_split_component_at_self_intersections:Nn,
+% \spath_split_component_at_self_intersections:N,
+% \spath_gsplit_component_at_self_intersections:Nn,
+% \spath_gsplit_component_at_self_intersections:N,
+% }
+% Given a component of a path, split it at points where it self-intersects.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_split_component_at_self_intersections:n #1
+{
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpe_tl {#1}
+
+ % Remember if the component is closed
+ \spath_finalaction:NV \l_@@_tmpa_tl \l_@@_tmpe_tl
+
+ \bool_set:Nn \l_@@_closed_bool
+ {
+ \tl_if_eq_p:NN \l_@@_tmpa_tl \c_spath_closepath_tl
+ }
+
+ % Copy the path
+ \tl_set:Nn \l_@@_tmpe_tl {#1}
+
+ % Open the path
+ \spath_open:N \l_@@_tmpe_tl
+ % Ensure beziers don't self-intersect
+ \spath_split_curves:N \l_@@_tmpe_tl
+
+ % Make a copy for later
+ \tl_set_eq:NN \l_@@_tmpg_tl \l_@@_tmpe_tl
+
+ % Clear some token lists and sequences
+ \tl_clear:N \l_@@_tmpd_tl
+ \seq_clear:N \l_@@_tmpb_seq
+ \int_zero:N \l_@@_tmpa_int
+
+ \pgfintersectionsortbyfirstpath
+
+ % Split the path into a sequence of segments
+ \spath_segments_to_seq:NV \l_@@_tmpa_seq \l_@@_tmpe_tl
+
+ \seq_map_indexed_inline:Nn \l_@@_tmpa_seq
+ {
+ \seq_map_indexed_inline:Nn \l_@@_tmpa_seq
+ {
+ % Don't intersect a segment with itself
+ \int_compare:nF
+ {
+ ##1 == ####1
+ }
+ {
+ \spath_intersect:nn {##2} {####2}
+
+ \int_compare:nT {\pgfintersectionsolutions > 0}
+ {
+ % Find the times of the intersections on each path
+ \int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions}
+ {
+ \pgfintersectiongetsolutiontimes
+ {########1}{\l_@@_tmpb_tl}{\l_@@_tmpc_tl}
+
+ \bool_if:nT
+ {
+ !(
+ \fp_compare_p:n { \l_@@_tmpb_tl > .99 }
+ &&
+ \int_compare_p:n {##1 + 1 == ####1}
+ )
+ &&
+ !(
+ \fp_compare_p:n { \l_@@_tmpb_tl < .01 }
+ &&
+ \int_compare_p:n {##1 - 1 == ####1}
+ )
+ &&
+ !(
+ \l_@@_closed_bool
+ &&
+ \fp_compare_p:n { \l_@@_tmpb_tl < .01 }
+ &&
+ \int_compare_p:n {##1 == 1}
+ &&
+ \int_compare_p:n {\seq_count:N \l_@@_tmpa_seq == ####1}
+ )
+ &&
+ !(
+ \l_@@_closed_bool
+ &&
+ \fp_compare_p:n { \l_@@_tmpb_tl > .99 }
+ &&
+ \int_compare_p:n {####1 == 1}
+ &&
+ \int_compare_p:n {\seq_count:N \l_@@_tmpa_seq == ##1}
+ )
+ }
+ {
+ \tl_set:Nx \l_@@_tmpa_tl
+ {\fp_to_decimal:n {\l_@@_tmpb_tl + ##1 - 1}}
+ \seq_put_right:NV \l_@@_tmpb_seq \l_@@_tmpa_tl
+ }
+ }
+ }
+ }
+ }
+ }
+
+ % Sort the sequence by reverse order along the path
+ \seq_sort:Nn \l_@@_tmpb_seq
+ {
+ \fp_compare:nNnTF { ##1 } < { ##2 }
+ { \sort_return_swapped: }
+ { \sort_return_same: }
+ }
+
+ \seq_get_left:NN \l_@@_tmpb_seq \l_@@_tmpa_tl
+ \fp_compare:nT
+ {
+ \l_@@_tmpa_tl > \seq_count:N \l_@@_tmpa_seq - .01
+ }
+ {
+ \bool_set_false:N \l_@@_closed_bool
+ }
+ \seq_get_right:NN \l_@@_tmpb_seq \l_@@_tmpa_tl
+ \fp_compare:nT
+ {
+ \l_@@_tmpa_tl < .01
+ }
+ {
+ \bool_set_false:N \l_@@_closed_bool
+ }
+
+ % Restore the original copy of the path
+ \tl_set_eq:NN \l_@@_tmpe_tl \l_@@_tmpg_tl
+
+ % Clear the token lists
+ \tl_clear:N \l_@@_tmpf_tl
+ \tl_clear:N \l_@@_tmph_tl
+ \tl_clear:N \l_@@_tmpg_tl
+
+ \tl_set:Nn \l_@@_tmpi_tl {-1}
+
+ \seq_map_inline:Nn \l_@@_tmpb_seq
+ {
+ \tl_set:Nn \l_@@_tmpb_tl {##1}
+ \tl_set_eq:NN \l_@@_tmpa_tl \l_@@_tmpb_tl
+ \int_compare:nT
+ {
+ \fp_to_int:n {floor( \l_@@_tmpb_tl ) }
+ =
+ \fp_to_int:n {floor( \l_@@_tmpi_tl) }
+ }
+ {
+ \tl_set:Nx \l_@@_tmpb_tl
+ {
+ \fp_eval:n {
+ floor( \l_@@_tmpb_tl )
+ +
+ ( \l_@@_tmpb_tl - floor( \l_@@_tmpb_tl) )
+ /
+ ( \l_@@_tmpi_tl - floor( \l_@@_tmpi_tl) )
+ }
+ }
+ }
+ \tl_set_eq:NN \l_@@_tmpi_tl \l_@@_tmpa_tl
+
+ \spath_split_at:NNVV
+ \l_@@_tmpf_tl
+ \l_@@_tmph_tl
+ \l_@@_tmpe_tl
+ \l_@@_tmpb_tl
+
+ \tl_put_left:NV \l_@@_tmpg_tl \l_@@_tmph_tl
+ \tl_set_eq:NN \l_@@_tmpe_tl \l_@@_tmpf_tl
+
+ }
+
+ \tl_put_left:NV \l_@@_tmpg_tl \l_@@_tmpe_tl
+
+ \tl_if_empty:NT \l_@@_tmpg_tl
+ {
+ \tl_set_eq:NN \l_@@_tmpg_tl \l_@@_tmpe_tl
+ }
+
+ \spath_remove_empty_components:N \l_@@_tmpg_tl
+
+ % Do something with closed
+ \bool_if:NT \l_@@_closed_bool
+ {
+ \spath_join_component:Nn \l_@@_tmpg_tl {1}
+ }
+
+ \tl_gclear:N \g_@@_output_tl
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpg_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_split_component_at_self_intersections:Nn #1#2
+{
+ \@@_split_component_at_self_intersections:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_split_component_at_self_intersections:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_split_component_at_self_intersections:N #1
+{
+ \spath_split_component_at_self_intersections:NV #1#1
+}
+\cs_generate_variant:Nn \spath_split_component_at_self_intersections:N {c}
+\cs_new_protected_nopar:Npn \spath_gsplit_component_at_self_intersections:Nn #1#2
+{
+ \@@_split_component_at_self_intersections:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_component_at_self_intersections:Nn {NV}
+\cs_new_protected_nopar:Npn \spath_gsplit_component_at_self_intersections:N #1
+{
+ \spath_gsplit_component_at_self_intersections:NV #1#1
+}
+\cs_generate_variant:Nn \spath_gsplit_component_at_self_intersections:N {c}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_split_at_self_intersections:Nn,
+% \spath_split_at_self_intersections:N,
+% \spath_gsplit_at_self_intersections:Nn,
+% \spath_gsplit_at_self_intersections:N,
+% }
+% Split a path at its self intersections.
+% We iterate over the components, splitting each where it meets all the others and itself.
+% To make this more efficient, we split against the components of the original path rather than updating each time.
+%
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_split_at_self_intersections:n #1
+{
+ \group_begin:
+ \spath_components_to_seq:Nn \l_@@_tmpa_seq {#1}
+ \seq_clear:N \l_@@_tmpb_seq
+ \seq_clear:N \l_@@_tmpc_seq
+
+ % Iterate over the components of the original path.
+ \bool_do_until:nn
+ {
+ \seq_if_empty_p:N \l_@@_tmpa_seq
+ }
+ {
+ % Get the next component
+ \seq_pop_left:NN \l_@@_tmpa_seq \l_@@_tmpa_tl
+ % Copy for later
+ \tl_set_eq:NN \l_@@_tmpc_tl \l_@@_tmpa_tl
+ \int_compare:nT
+ {
+ \tl_count:N \l_@@_tmpa_tl > 3
+ }
+ {
+
+ % Split against itself
+ \spath_split_component_at_self_intersections:N \l_@@_tmpa_tl
+ % Grab the rest of the path
+ \tl_set:Nx \l_@@_tmpb_tl
+ {
+ \seq_use:Nn \l_@@_tmpb_seq {}
+ \seq_use:Nn \l_@@_tmpa_seq {}
+ }
+ % Split against the rest of the path
+ \spath_split_path_at_intersections:NV \l_@@_tmpa_tl \l_@@_tmpb_tl
+ }
+ % Save the split path
+ \seq_put_right:NV \l_@@_tmpc_seq \l_@@_tmpa_tl
+ % Add the original copy to the sequence of processed components
+ \seq_put_right:NV \l_@@_tmpb_seq \l_@@_tmpc_tl
+ }
+
+ \tl_gclear:N \g_@@_output_tl
+ \tl_gset:Nx \g_@@_output_tl {\seq_use:Nn \l_@@_tmpc_seq {} }
+ \group_end:
+}
+\cs_generate_variant:Nn \@@_split_at_self_intersections:n {V, v}
+\cs_new_protected_nopar:Npn \spath_split_at_self_intersections:Nn #1#2
+{
+ \@@_split_at_self_intersections:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_split_at_self_intersections:Nn {NV, cn, cV, cv}
+\cs_new_protected_nopar:Npn \spath_split_at_self_intersections:N #1
+{
+ \spath_split_at_self_intersections:NV #1#1
+}
+\cs_generate_variant:Nn \spath_split_at_self_intersections:N {c}
+\cs_new_protected_nopar:Npn \spath_gsplit_at_self_intersections:Nn #1#2
+{
+ \@@_split_at_self_intersections:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gsplit_at_self_intersections:Nn {NV, cn, cV, cv}
+\cs_new_protected_nopar:Npn \spath_gsplit_at_self_intersections:N #1
+{
+ \spath_gsplit_at_self_intersections:NV #1#1
+}
+\cs_generate_variant:Nn \spath_gsplit_at_self_intersections:N {c}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_join_component:Nnn,
+% \spath_join_component:Nn,
+% \spath_gjoin_component:Nnn,
+% \spath_gjoin_component:Nn,
+% }
+% Join the specified component of the spath to its predecessor.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_join_component:nn #1#2
+{
+ \group_begin:
+ \spath_numberofcomponents:Nn \l_@@_tmpa_int {#1}
+
+ \bool_if:nTF
+ {
+ \int_compare_p:n { #2 >= 1 }
+ &&
+ \int_compare_p:n { #2 <= \l_@@_tmpa_int }
+ }
+ {
+ \int_compare:nTF
+ {
+ #2 == 1
+ }
+ {
+ \int_compare:nTF
+ {
+ \l_@@_tmpa_int == 1
+ }
+ {
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \spath_initialpoint:Nn \l_@@_tmpb_tl {#1}
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_closepath_tl
+ \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpb_tl
+ \tl_gclear:N \g_@@_output_tl
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpa_tl
+ }
+ {
+ \spath_components_to_seq:Nn \l_@@_tmpa_seq {#1}
+ \seq_pop_left:NN \l_@@_tmpa_seq \l_@@_tmpa_tl
+
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+
+ \seq_put_right:NV \l_@@_tmpa_seq \l_@@_tmpa_tl
+
+ \tl_gclear:N \g_@@_output_tl
+ \tl_gset:Nx \g_@@_output_tl {\seq_use:Nn \l_@@_tmpa_seq {}}
+ }
+ }
+ {
+ \spath_components_to_seq:Nn \l_@@_tmpa_seq {#1}
+
+ \seq_clear:N \l_@@_tmpb_seq
+ \seq_map_indexed_inline:Nn \l_@@_tmpa_seq
+ {
+ \tl_set:Nn \l_@@_tmpa_tl {##2}
+ \int_compare:nT {##1 = #2}
+ {
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+ }
+ \seq_put_right:NV \l_@@_tmpb_seq \l_@@_tmpa_tl
+ }
+
+ \tl_gclear:N \g_@@_output_tl
+ \tl_gset:Nx \g_@@_output_tl {\seq_use:Nn \l_@@_tmpb_seq {}}
+ }
+ }
+ {
+ \tl_gclear:N \g_@@_output_tl
+ \tl_gset:Nn \g_@@_output_tl {#1}
+ }
+
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_join_component:Nnn #1#2#3
+{
+ \@@_join_component:nn {#2}{#3}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_join_component:Nnn {NVn, NVV}
+\cs_new_protected_nopar:Npn \spath_join_component:Nn #1#2
+{
+ \spath_join_component:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_join_component:Nn {cn, NV, cV}
+\cs_new_protected_nopar:Npn \spath_gjoin_component:Nnn #1#2#3
+{
+ \@@_join_component:nn {#2}{#3}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_gjoin_component:Nnn {NVn, NVV}
+\cs_new_protected_nopar:Npn \spath_gjoin_component:Nn #1#2
+{
+ \spath_gjoin_component:NVn #1#1{#2}
+}
+\cs_generate_variant:Nn \spath_gjoin_component:Nn {cn, NV, cV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_spot_weld_components:Nn,
+% \spath_spot_weld_components:N,
+% \spath_spot_gweld_components:Nn,
+% \spath_spot_gweld_components:N,
+% }
+% Weld together any components where the last point of one is at the start point of the next (within a tolerance).
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_spot_weld_components:n #1
+{
+ \group_begin:
+ \dim_zero:N \l_@@_move_x_dim
+ \dim_zero:N \l_@@_move_y_dim
+
+ \spath_components_to_seq:Nn \l_@@_tmpa_seq {#1}
+ \seq_clear:N \l_@@_tmpb_seq
+ \dim_set:Nn \l_@@_move_x_dim {\tl_item:nn {#1} {2} + 10 pt}
+ \dim_set:Nn \l_@@_move_y_dim {\tl_item:nn {#1} {3} + 10 pt}
+
+ \int_set:Nn \l_@@_tmpa_int {\seq_count:N \l_@@_tmpa_seq}
+
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \tl_set:Nn \l_@@_tmpa_tl {##1}
+ \bool_if:nT
+ {
+ \dim_compare_p:n
+ {
+ \dim_abs:n
+ {\l_@@_move_x_dim - \tl_item:Nn \l_@@_tmpa_tl {2} }
+ < 0.01pt
+ }
+ &&
+ \dim_compare_p:n
+ {
+ \dim_abs:n
+ {\l_@@_move_y_dim - \tl_item:Nn \l_@@_tmpa_tl {3} }
+ < 0.01pt
+ }
+ }
+ {
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+ \int_decr:N \l_@@_tmpa_int
+ }
+ \tl_reverse:N \l_@@_tmpa_tl
+ \dim_set:Nn \l_@@_move_x_dim {\tl_item:Nn \l_@@_tmpa_tl {2}}
+ \dim_set:Nn \l_@@_move_y_dim {\tl_item:Nn \l_@@_tmpa_tl {1}}
+ \tl_reverse:N \l_@@_tmpa_tl
+ \seq_put_right:NV \l_@@_tmpb_seq \l_@@_tmpa_tl
+ }
+
+ \tl_set:Nx \l_@@_tmpa_tl {\seq_use:Nn \l_@@_tmpb_seq {} }
+ \spath_components_to_seq:NV \l_@@_tmpb_seq \l_@@_tmpa_tl
+
+
+ \spath_initialpoint:Nn \l_@@_tmpa_tl {#1}
+ \spath_finalpoint:Nn \l_@@_tmpb_tl {#1}
+
+ \bool_if:nT
+ {
+ \dim_compare_p:n
+ {
+ \dim_abs:n
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {1} - \tl_item:Nn \l_@@_tmpb_tl {1}
+ }
+ <
+ 0.01pt
+ }
+ &&
+ \dim_compare_p:n
+ {
+ \dim_abs:n
+ {
+ \tl_item:Nn \l_@@_tmpa_tl {2} - \tl_item:Nn \l_@@_tmpb_tl {2}
+ }
+ <
+ 0.01pt
+ }
+ }
+ {
+ \int_compare:nTF
+ {
+ \seq_count:N \l_@@_tmpb_seq > 1
+ }
+ {
+ \seq_pop_left:NN \l_@@_tmpb_seq \l_@@_tmpb_tl
+
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_tail:N \l_@@_tmpb_tl}
+ }
+ \seq_put_right:NV \l_@@_tmpb_seq \l_@@_tmpb_tl
+ }
+ {
+ \tl_set:NV \l_@@_tmpb_tl \c_spath_closepath_tl
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ { \tl_item:Nn \l_@@_tmpa_tl {1} }
+ { \tl_item:Nn \l_@@_tmpa_tl {2} }
+ }
+ \seq_put_right:NV \l_@@_tmpb_seq \l_@@_tmpb_tl
+ }
+ }
+
+ \tl_gset:Nx \g_@@_output_tl {\seq_use:Nn \l_@@_tmpb_seq {}}
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_spot_weld_components:Nn #1#2
+{
+ \@@_spot_weld_components:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_spot_weld_components:Nn {NV, cV, cn}
+\cs_new_protected_nopar:Npn \spath_spot_weld_components:N #1
+{
+ \spath_spot_weld_components:NV #1#1
+}
+\cs_generate_variant:Nn \spath_spot_weld_components:N {c}
+\cs_new_protected_nopar:Npn \spath_spot_gweld_components:Nn #1#2
+{
+ \@@_spot_weld_components:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_generate_variant:Nn \spath_spot_gweld_components:Nn {NV, cV, cn}
+\cs_new_protected_nopar:Npn \spath_spot_gweld_components:N #1
+{
+ \spath_spot_gweld_components:NV #1#1
+}
+\cs_generate_variant:Nn \spath_spot_gweld_components:N {c}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Exporting Commands}
+%
+% \begin{macro}[internal]{
+% \spath_convert_to_svg:Nn,
+% \spath_gconvert_to_svg:Nn,
+% }
+% Convert the soft path to an SVG document.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_convert_to_svg:n #1
+{
+ \group_begin:
+ \tl_clear:N \l_@@_tmpa_tl
+ \tl_put_right:Nn \l_@@_tmpa_tl
+ {
+ <?xml~ version="1.0"~ standalone="no"?>
+ \iow_newline:
+ <!DOCTYPE~ svg~ PUBLIC~ "-//W3C//DTD SVG 1.1//EN"~
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+ \iow_newline:
+ <svg~ xmlns="http://www.w3.org/2000/svg"~ version="1.1"~viewBox="
+ }
+
+ \spath_minbb:Nn \l_@@_tmpb_tl {#1}
+ \spath_maxbb:Nn \l_@@_tmpc_tl {#1}
+ \tl_put_right:Nx \l_@@_tmpa_tl
+ {
+ \dim_to_decimal:n
+ {
+ \tl_item:Nn \l_@@_tmpb_tl {1} - 10pt
+ }
+ \exp_not:n {~}
+ \dim_to_decimal:n
+ {
+ \tl_item:Nn \l_@@_tmpb_tl {2} - 10pt
+ }
+ \exp_not:n {~}
+ \dim_to_decimal:n
+ {
+ \tl_item:Nn \l_@@_tmpc_tl {1}
+ -
+ \tl_item:Nn \l_@@_tmpb_tl {1}
+ + 20pt
+ }
+ \exp_not:n {~}
+ \dim_to_decimal:n
+ {
+ \tl_item:Nn \l_@@_tmpc_tl {2}
+ -
+ \tl_item:Nn \l_@@_tmpb_tl {2}
+ + 20pt
+ }
+ }
+
+ \tl_put_right:Nn \l_@@_tmpa_tl
+ {
+ ">
+ \iow_newline:
+ <path~ d="
+ }
+ \tl_set:Nn \l_@@_tmpc_tl {use:n}
+ \tl_map_inline:nn {#1}
+ {
+ \tl_set:Nn \l_@@_tmpb_tl {##1}
+ \tl_case:NnF \l_@@_tmpb_tl
+ {
+ \c_spath_moveto_tl
+ {
+ \tl_put_right:Nn \l_@@_tmpa_tl {M~}
+ \tl_set:Nn \l_@@_tmpc_tl {use:n}
+ }
+ \c_spath_lineto_tl
+ {
+ \tl_put_right:Nn \l_@@_tmpa_tl {L~}
+ \tl_set:Nn \l_@@_tmpc_tl {use:n}
+ }
+ \c_spath_closepath_tl
+ {
+ \tl_put_right:Nn \l_@@_tmpa_tl {Z~}
+ \tl_set:Nn \l_@@_tmpc_tl {use_none:n}
+ }
+ \c_spath_curvetoa_tl
+ {
+ \tl_put_right:Nn \l_@@_tmpa_tl {C~}
+ \tl_set:Nn \l_@@_tmpc_tl {use:n}
+ }
+ \c_spath_curvetob_tl {
+ \tl_set:Nn \l_@@_tmpc_tl {use:n}
+ }
+ \c_spath_curveto_tl {
+ \tl_set:Nn \l_@@_tmpc_tl {use:n}
+ }
+ }
+ {
+ \tl_put_right:Nx
+ \l_@@_tmpa_tl
+ {\use:c { \l_@@_tmpc_tl } {\dim_to_decimal:n {##1}} ~}
+ }
+ }
+ \tl_put_right:Nn \l_@@_tmpa_tl
+ {
+ "~ fill="none"~ stroke="black"~ />
+ \iow_newline:
+ </svg>
+ \iow_newline:
+ }
+ \tl_gset_eq:NN \g_@@_output_tl \l_@@_tmpa_tl
+ \group_end:
+}
+\cs_new_protected_nopar:Npn \spath_convert_to_svg:Nn #1#2
+{
+ \@@_convert_to_svg:n {#2}
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+\cs_new_protected_nopar:Npn \spath_gconvert_to_svg:Nn #1#2
+{
+ \@@_convert_to_svg:n {#2}
+ \tl_gset_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_export_to_svg:nn
+% }
+% Save a soft path to an SVG file.
+% \begin{macrocode}
+\iow_new:N \g_@@_stream
+\cs_new_protected_nopar:Npn \spath_export_to_svg:nn #1#2
+{
+ \group_begin:
+ \spath_convert_to_svg:Nn \l_@@_tmpa_tl {#2}
+ \iow_open:Nn \g_@@_stream {#1 .svg}
+ \iow_now:Nx \g_@@_stream
+ {
+ \tl_use:N \l_@@_tmpa_tl
+ }
+ \iow_close:N \g_@@_stream
+ \group_end:
+}
+\cs_generate_variant:Nn \spath_export_to_svg:nn {nv, nV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\spath_show:n}
+% Displays the soft path on the terminal.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_show:n #1
+{
+ \int_step_inline:nnnn {1} {3} {\tl_count:n {#1}}
+ {
+ \iow_term:x {
+ \tl_item:nn {#1} {##1}
+ {\tl_item:nn {#1} {##1+1}}
+ {\tl_item:nn {#1} {##1+2}}
+ }
+ }
+}
+\cs_generate_variant:Nn \spath_show:n {V, v}
+% \end{macrocode}
+% \end{macro}
+
+% \subsubsection{PGF and TikZ Interface Functions}
+%
+% Spaths come from PGF so we need some functions that get and set spaths from the pgf system.
+%
+% \begin{macro}[internal]{
+% \spath_get_current_path:N,
+% \spath_gget_current_path:N
+% }
+% Grab the current soft path from PGF.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_get_current_path:N #1
+{
+ \pgfsyssoftpath@getcurrentpath #1
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_gget_current_path:N #1
+{
+ \pgfsyssoftpath@getcurrentpath #1
+ \tl_gset_eq:NN #1 #1
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\spath_protocol_path:n}
+% This feeds the bounding box of the soft path to PGF to ensure that its current bounding box contains the soft path.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_protocol_path:n #1
+{
+ \spath_minbb:Nn \l_@@_tmpa_tl {#1}
+ \exp_last_unbraced:NV \pgf@protocolsizes\l_@@_tmpa_tl
+
+ \spath_maxbb:Nn \l_@@_tmpa_tl {#1}
+ \exp_last_unbraced:NV \pgf@protocolsizes\l_@@_tmpa_tl
+}
+\cs_generate_variant:Nn \spath_protocol_path:n {V}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_set_current_path:n,
+% \spath_set_current_path:N
+% }
+% Sets the current path to the specified soft path.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_set_current_path:n #1
+{
+ \spath_protocol_path:n {#1}
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \pgfsyssoftpath@setcurrentpath\l_@@_tmpa_tl
+}
+\cs_new_protected_nopar:Npn \spath_set_current_path:N #1
+{
+ \spath_protocol_path:V #1
+ \pgfsyssoftpath@setcurrentpath #1
+}
+\cs_generate_variant:Nn \spath_set_current_path:N {c}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{
+% \spath_use_path:nn
+% }
+% Uses the given soft path at the PGF level.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_use_path:nn #1#2
+{
+ \spath_set_current_path:n {#1}
+ \pgfusepath{#2}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\spath_tikz_path:nn}
+% Uses the given soft path at the TikZ level.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_tikz_path:nn #1#2
+{
+ \path[#1] \pgfextra{
+ \spath_set_current_path:n {#2}
+ \tl_put_right:Nn \tikz@preactions {\def\tikz@actions@path{#2}}
+ };
+}
+\cs_generate_variant:Nn \spath_tikz_path:nn {Vn, VV, nv, Vv, nV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\spath_set_tikz_data:n}
+% Sets the \Verb+\tikz@lastx+ and other coordinates from the soft path.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \spath_set_tikz_data:n #1
+{
+ \spath_finalpoint:Nn \l_@@_tmpa_tl {#1}
+ \tl_set:Nx \l_@@_tmpa_tl
+ {
+ \exp_not:c {pgf@x}=\tl_item:Nn \l_@@_tmpa_tl {1}
+ \exp_not:c {pgf@y}=\tl_item:Nn \l_@@_tmpa_tl {2}
+ }
+ \use:c {pgf@process}{%
+ \tl_use:N \l_@@_tmpa_tl
+ \pgftransforminvert
+ \use:c {pgf@pos@transform@glob}
+ }
+ \tl_set:Nx \l_@@_tmpa_tl
+ {
+ \exp_not:c {tikz@lastx}=\exp_not:c {pgf@x}
+ \exp_not:c {tikz@lasty}=\exp_not:c {pgf@y}
+ \exp_not:c {tikz@lastxsaved}=\exp_not:c {pgf@x}
+ \exp_not:c {tikz@lastysaved}=\exp_not:c {pgf@y}
+ }
+ \tl_use:N \l_@@_tmpa_tl
+ \spath_finalmovepoint:Nn \l_@@_tmpa_tl {#1}
+ \ifpgfsyssoftpathmovetorelevant%
+ \tl_gset_eq:cN {pgfsyssoftpath@lastmoveto} \l_@@_tmpa_tl
+ \fi
+ \tl_set:Nx \l_@@_tmpa_tl
+ {
+ \exp_not:c {pgf@x}=\tl_item:Nn \l_@@_tmpa_tl {1}
+ \exp_not:c {pgf@y}=\tl_item:Nn \l_@@_tmpa_tl {2}
+ }
+ \use:c {pgf@process}{%
+ \tl_use:N \l_@@_tmpa_tl
+ \pgftransforminvert
+ \use:c {pgf@pos@transform@glob}
+ }
+ \tl_set:Nx \l_@@_tmpa_tl
+ {
+ \exp_not:c {tikz@lastmovetox}=\exp_not:c {pgf@x}
+ \exp_not:c {tikz@lastmovetoy}=\exp_not:c {pgf@y}
+ }
+ \tl_use:N \l_@@_tmpa_tl
+ \tl_clear_new:c {tikz@timer}
+ \tl_set:cn {tikz@timer}
+ {
+ \spath_reallength:Nn \l_@@_tmpa_int {#1}
+ \tl_set_eq:Nc \l_@@_tmpb_tl {tikz@time}
+ \tl_set:Nx \l_@@_tmpb_tl
+ {\fp_to_decimal:n {(\l_@@_tmpb_tl) * (\l_@@_tmpa_int)}}
+ \spath_transformation_at:NnV \l_@@_tmpc_tl {#1} \l_@@_tmpb_tl
+
+ \tl_set:Nx \l_@@_tmpa_tl
+ {
+ \exp_not:N \pgfpoint
+ { \tl_item:Nn \l_@@_tmpc_tl {5} }
+ { \tl_item:Nn \l_@@_tmpc_tl {6} }
+ }
+ \exp_args:NV \pgftransformshift \l_@@_tmpa_tl
+
+ \ifpgfresetnontranslationattime
+ \pgftransformresetnontranslations
+ \fi
+
+ \ifpgfslopedattime
+
+ \tl_set:Nx \l_@@_tmpa_tl
+ {
+ { \tl_item:Nn \l_@@_tmpc_tl {1} }
+ { \tl_item:Nn \l_@@_tmpc_tl {2} }
+ { \tl_item:Nn \l_@@_tmpc_tl {3} }
+ { \tl_item:Nn \l_@@_tmpc_tl {4} }
+ }
+ \ifpgfallowupsidedownattime
+ \else
+ \fp_compare:nT { \tl_item:Nn \l_@@_tmpc_tl {4} < 0}
+ {
+ \tl_set:Nx \l_@@_tmpa_tl
+ {
+ { \fp_eval:n { - (\tl_item:Nn \l_@@_tmpc_tl {1})} }
+ { \fp_eval:n { - (\tl_item:Nn \l_@@_tmpc_tl {2})} }
+ { \fp_eval:n { - (\tl_item:Nn \l_@@_tmpc_tl {3})} }
+ { \fp_eval:n { - (\tl_item:Nn \l_@@_tmpc_tl {4})} }
+ }
+ }
+ \fi
+ \tl_put_right:Nn \l_@@_tmpa_tl {{\pgfpointorigin}}
+ \exp_last_unbraced:NV \pgftransformcm \l_@@_tmpa_tl
+ \fi
+ }
+}
+\cs_generate_variant:Nn \spath_set_tikz_data:n {V, v}
+% \end{macrocode}
+% \end{macro}
+%
+% \iffalse
+%</spath3>
+% \fi
+%
+% \section{The TikZ interface}
+%
+% \iffalse
+%<*tikzspath3>
+% \fi
+%
+% This provides an interface to the soft path manipulation routines via a series of TikZ keys.
+% They all live in the \texttt{spath} family.
+%
+%
+% \begin{macrocode}
+\RequirePackage{spath3}
+\RequirePackage{expl3}
+\ExplSyntaxOn
+
+\tl_new:N \l_@@_current_tl
+\tl_new:N \l_@@_reverse_tl
+\tl_new:N \l_@@_prefix_tl
+\tl_new:N \l_@@_suffix_tl
+\tl_new:N \g_@@_smuggle_tl
+\seq_new:N \g_@@_tmpa_seq
+\seq_new:N \g_@@_tmpb_seq
+\bool_new:N \l_@@_draft_bool
+% \end{macrocode}
+%
+% We surround all the keys with checks to ensure that the soft path under consideration does actually exist, but if it doesn't we should warn the user.
+%
+% \begin{macrocode}
+\msg_new:nnn { spath3 } { missing soft path } { Soft~ path~ #1~ doesn't~ exist }
+\msg_new:nnn { spath3 } { empty soft path } { Soft~ path~ #1~ is~ empty }
+% \end{macrocode}
+%
+% When saving a soft path, by default we use a naming convention that is compatible with the intersections library so that paths saved here and paths saved by the \texttt{name path} facility of the intersections library are mutually exchangeable.
+%
+% \begin{macrocode}
+\tl_set:Nn \l_@@_prefix_tl {tikz@intersect@path@name@}
+\tl_set:Nn \l_@@_suffix_tl {}
+% \end{macrocode}
+%
+% When a soft path is grabbed from TikZ we're usually deep in a group so I've adapted the code from the intersections library to dig the definition out of the group without making everything global.
+%
+% \begin{macrocode}
+\tl_new:N \g_@@_tikzfinish_tl
+\cs_new_protected_nopar:Npn \spath_at_end_of_path:
+{
+ \tl_use:N \g_@@_tikzfinish_tl
+ \tl_gclear:N \g_@@_tikzfinish_tl
+}
+\tl_put_right:Nn \tikz@finish {\spath_at_end_of_path:}
+
+\cs_new_protected_nopar:Npn \spath_save_path:Nn #1#2
+{
+ \tl_gput_right:Nn \g_@@_tikzfinish_tl
+ {
+ \tl_clear_new:N #1
+ \tl_set:Nn #1 {#2}
+ }
+}
+\cs_generate_variant:Nn \spath_save_path:Nn {cn, NV, cV}
+
+\cs_new_protected_nopar:Npn \spath_gsave_path:Nn #1#2
+{
+ \tl_gput_right:Nn \g_@@_tikzfinish_tl
+ {
+ \tl_gclear_new:N #1
+ \tl_gset:Nn #1 {#2}
+ }
+}
+\cs_generate_variant:Nn \spath_gsave_path:Nn {cn, NV, cV}
+% \end{macrocode}
+%
+% \begin{macro}[internal]{
+% \@@_process_tikz_point:Nn
+% }
+% Process a point via TikZ and store the resulting dimensions.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_process_tikz_point:Nn #1#2
+{
+ \group_begin:
+ \use:c {tikz@scan@one@point} \use:n #2 \scan_stop:
+ \tl_gset:Nx \g_@@_output_tl
+ {
+ { \dim_use:c {pgf@x} }
+ { \dim_use:c {pgf@y} }
+ }
+ \group_end:
+ \tl_set_eq:NN #1 \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+}
+% \end{macrocode}
+% \end{macro}
+%
+% When we split a soft path into components, we make it a comma separated list so that it can be fed into a \Verb+\foreach+ loop.
+% This can also make it possible to extract a single component, but to do this we need a wrapper around \Verb+\clist_item:Nn+ (there doesn't appear to be a PGF way of getting an item of a CS list).
+%
+% \begin{macrocode}
+\cs_set_eq:NN \getComponentOf \clist_item:Nn
+% \end{macrocode}
+%
+% Now we define all of our keys.
+%
+% \begin{macrocode}
+\tikzset{
+% \end{macrocode}
+%
+% We're in the \texttt{spath} key family.
+%
+% \begin{macrocode}
+ spath/.is~family,
+ spath/.cd,
+% \end{macrocode}
+%
+% We provide for saving soft paths with a specific prefix and suffix in the name.
+% The default is to make it compatible with the intersections library.
+%
+% \begin{macrocode}
+ set~ prefix/.store~ in=\l_@@_prefix_tl,
+ prefix/.is~choice,
+ prefix/default/.style={
+ /tikz/spath/set~ prefix=tikz@intersect@path@name@
+ },
+ set~ suffix/.store~ in=\l_@@_suffix_tl,
+ suffix/.is~choice,
+ suffix/default/.style={
+ /tikz/spath/set~ suffix={}
+ },
+ set~ name/.style={
+ /tikz/spath/prefix=#1,
+ /tikz/spath/suffix=#1
+ },
+% \end{macrocode}
+%
+% Keys for saving and cloning a soft path.
+%
+% \begin{macrocode}
+ save/.code={
+ \tikz@addmode{
+ \spath_get_current_path:N \l_@@_tmpa_tl
+ \spath_bake_round:NV \l_@@_tmpa_tl \l_@@_tmpa_tl
+ \spath_save_path:cV
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \l_@@_tmpa_tl
+ }
+ },
+ clone/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_clear_new:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \tl_set_eq:cc
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #2 }
+ }
+ },
+ clone~ global/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_gclear_new:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \tl_gset_eq:cc
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #2 }
+ }
+ },
+ save~ global/.code={
+ \tikz@addmode{
+ \spath_get_current_path:N \l_@@_tmpa_tl
+ \spath_bake_round:NV \l_@@_tmpa_tl \l_@@_tmpa_tl
+ \spath_gsave_path:cV
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \l_@@_tmpa_tl
+ }
+ },
+% \end{macrocode}
+%
+% Saves a soft path to the aux file.
+%
+% \begin{macrocode}
+ save~ to~ aux/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_save_to_aux:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Restores a soft path to the current path.
+%
+% \begin{macrocode}
+ restore/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_empty:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_clear:N \l_@@_tmpa_tl
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_moveto_tl
+ \tl_put_right:Nn \l_@@_tmpa_tl {{0pt}{0pt}}
+ \spath_set_current_path:V \l_@@_tmpa_tl
+ \spath_set_tikz_data:V \l_@@_tmpa_tl
+ \msg_warning:nnn { spath3 } { empty soft path } { #1 }
+ }
+ {
+ \spath_set_current_path:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \spath_set_tikz_data:v
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ }
+ {
+ \tl_clear:N \l_@@_tmpa_tl
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_moveto_tl
+ \tl_put_right:Nn \l_@@_tmpa_tl {{0pt}{0pt}}
+ \spath_set_current_path:V \l_@@_tmpa_tl
+ \spath_set_tikz_data:V \l_@@_tmpa_tl
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Restores the reverse of a soft path to the current path.
+%
+% \begin{macrocode}
+ restore~ reverse/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_empty:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_clear:N \l_@@_tmpa_tl
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_moveto_tl
+ \tl_put_right:Nn \l_@@_tmpa_tl {{0pt}{0pt}}
+ \spath_set_current_path:V \l_@@_tmpa_tl
+ \spath_set_tikz_data:V \l_@@_tmpa_tl
+ \msg_warning:nnn { spath3 } { empty soft path } { #1 }
+ }
+ {
+ \spath_reverse:Nv
+ \l_@@_reverse_tl
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \spath_set_current_path:N \l_@@_reverse_tl
+ \spath_set_tikz_data:V \l_@@_reverse_tl
+ }
+ }
+ {
+ \tl_clear:N \l_@@_tmpa_tl
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_moveto_tl
+ \tl_put_right:Nn \l_@@_tmpa_tl {{0pt}{0pt}}
+ \spath_set_current_path:V \l_@@_tmpa_tl
+ \spath_set_tikz_data:V \l_@@_tmpa_tl
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Diagnostic, show the current path in the terminal and log.
+%
+% \begin{macrocode}
+ show~current~path/.code={
+ \tikz@addmode{
+ \pgfsyssoftpath@getcurrentpath\l_@@_tmpa_tl
+ \iow_term:n {---~ current~ soft~ path~ ---}
+ \spath_show:V \l_@@_tmpa_tl
+ }
+ },
+% \end{macrocode}
+%
+% Diagnostic, show the named soft path in the terminal and log.
+%
+% \begin{macrocode}
+ show/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_empty:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \msg_warning:nnn { spath3 } { empty soft path } { #1 }
+ }
+ {
+ \iow_term:n {---~ soft~ path~ #1~ ---}
+ \spath_show:v
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Appends the named path to the current path with a weld.
+%
+% \begin{macrocode}
+ append/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_get_current_path:N \l_@@_current_tl
+ \spath_finalpoint:NV \l_@@_tmpa_tl \l_@@_current_tl
+ \tl_set_eq:Nc
+ \l_@@_tmpb_tl
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \spath_translate_to:NV \l_@@_tmpb_tl \l_@@_tmpa_tl
+ \spath_append_no_move:NV \l_@@_current_tl \l_@@_tmpb_tl
+ \spath_set_current_path:N \l_@@_current_tl
+ \spath_set_tikz_data:V \l_@@_tmpb_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Joins the second named path to the first.
+%
+% \begin{macrocode}
+ join~ with/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_append:cv
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #2 }
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Does a ``spot weld'' on a soft path, which means that any components that start where the previous component ends are welded together.
+%
+% \begin{macrocode}
+ spot~ weld/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_spot_weld_components:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ spot~ weld~ globally/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_spot_gweld_components:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Reverses the named path.
+%
+% \begin{macrocode}
+ reverse/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_reverse:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ reverse~ globally/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_reverse:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Appends the reversal of the path to the current path.
+%
+% \begin{macrocode}
+ append~ reverse/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_reverse:Nv
+ \l_@@_reverse_tl
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \spath_get_current_path:N \l_@@_current_tl
+ \spath_finalpoint:NV \l_@@_tmpa_tl \l_@@_current_tl
+ \spath_translate_to:NV \l_@@_reverse_tl \l_@@_tmpa_tl
+ \spath_append_no_move:NV \l_@@_current_tl \l_@@_reverse_tl
+ \spath_set_current_path:N \l_@@_current_tl
+ \spath_set_tikz_data:V \l_@@_reverse_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Inserts the named path into the current path as-is, meaning without transforming or welding it.
+%
+% \begin{macrocode}
+ insert/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_get_current_path:N \l_@@_current_tl
+ \spath_append:Nv
+ \l_@@_current_tl
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \spath_set_current_path:N \l_@@_current_tl
+ \spath_set_tikz_data:v
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Inserts the reverse of the named path.
+%
+% \begin{macrocode}
+ insert~ reverse/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_reverse:Nv
+ \l_@@_reverse_tl
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \spath_get_current_path:N \l_@@_current_tl
+ \spath_append:NV \l_@@_current_tl \l_@@_reverse_tl
+ \spath_set_current_path:N \l_@@_current_tl
+ \spath_set_tikz_data:V \l_@@_reverse_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Appends the named path to the current path without translating it.
+%
+% \begin{macrocode}
+ append~ no~ move/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_get_current_path:N \l_@@_current_tl
+ \spath_append_no_move:Nv
+ \l_@@_current_tl
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \spath_set_current_path:N \l_@@_current_tl
+ \spath_set_tikz_data:v
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Appends the reverse of the named path without translating it.
+%
+% \begin{macrocode}
+ append~ reverse~ no~ move/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_reverse:Nv
+ \l_@@_reverse_tl
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \spath_get_current_path:N \l_@@_current_tl
+ \spath_append_no_move:NV \l_@@_current_tl \l_@@_reverse_tl
+ \spath_set_current_path:N \l_@@_current_tl
+ \spath_set_tikz_data:V \l_@@_reverse_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Adjust a path to span between two points.
+%
+% \begin{macrocode}
+ span/.code ~n~ args={3}{
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \@@_process_tikz_point:Nn \l_@@_tmpa_tl {#2}
+ \@@_process_tikz_point:Nn \l_@@_tmpb_tl {#3}
+ \spath_span:cVV
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \l_@@_tmpa_tl \l_@@_tmpb_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ span~ global/.code ~n~ args={3}{
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \@@_process_tikz_point:Nn \l_@@_tmpa_tl {#2}
+ \@@_process_tikz_point:Nn \l_@@_tmpb_tl {#3}
+ \spath_gspan:cVV
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \l_@@_tmpa_tl \l_@@_tmpb_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Defines a to path
+%
+% \begin{macrocode}
+ to/.style={
+ to~path={
+ [
+ spath/span={#1}{(\tikztostart)}{(\tikztotarget)},
+ spath/append~no~move={#1},
+ ]
+ \tikztonodes
+ }
+ },
+% \end{macrocode}
+%
+% Splice three paths together, transforming the middle one so that it exactly fits between the first and third.
+%
+% \begin{macrocode}
+ splice/.code ~n~ args={3}{
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #3 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_splice_between:cvv
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {\tl_use:N \l_@@_prefix_tl #3 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #3 }
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #2 }
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ splice~ global/.code ~n~ args={3}{
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #3 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_gsplice_between:cvv
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {\tl_use:N \l_@@_prefix_tl #3 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #3 }
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #2 }
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Join the components of a path by splicing in the second path whenever the components are sufficiently far apart.
+%
+% \begin{macrocode}
+ join~ components~ with/.code~2~args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_spot_weld_components:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+
+ \spath_components_to_seq:Nv
+ \l_@@_tmpa_seq
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+
+ \seq_pop_left:NN \l_@@_tmpa_seq \l_@@_tmpa_tl
+
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \spath_splice_between:Nvn \l_@@_tmpa_tl
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {##1}
+ }
+ \tl_set_eq:cN
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \l_@@_tmpa_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #2 }
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ join~ components~ globally~ with/.code~2~args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_spot_gweld_components:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+
+ \spath_components_to_seq:Nv
+ \l_@@_tmpa_seq
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+
+ \seq_pop_left:NN \l_@@_tmpa_seq \l_@@_tmpa_tl
+
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \spath_gsplice_between:Nvn \l_@@_tmpa_tl
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {##1}
+ }
+ \tl_set_eq:cN
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \l_@@_tmpa_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #2 }
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Close a path.
+%
+% \begin{macrocode}
+ close/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_close:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ close~ globally/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_gclose:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Close a path with another path.
+%
+% \begin{macrocode}
+ close~ with/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_close_with:cv
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #2 }
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ close~ globally~ with/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_gclose_with:cv
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #2 }
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% These keys shorten the path.
+%
+% \begin{macrocode}
+ shorten~ at~ end/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_shorten_at_end:cn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl} {#2}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ shorten~ at~ start/.code~ 2~ args ={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_shorten_at_start:cn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl} {#2}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ shorten~ at~ both~ ends/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_shorten_at_end:cn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl} {#2}
+ \spath_shorten_at_start:cn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl} {#2}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ shorten~ globally~ at~ end/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_gshorten_at_end:cn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl} {#2}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ shorten~ globally~ at~ start/.code~ 2~ args ={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_gshorten_at_start:cn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl} {#2}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ shorten~ globally~ at~ both~ ends/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_shorten_at_end:cn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl} {#2}
+ \spath_shorten_at_start:cn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl} {#2}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% This translates the named path.
+%
+% \begin{macrocode}
+ translate/.code~ n~ args={3}{
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_translate:cnn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}{#2}{#3}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ translate~ globally/.code~ n~ args={3}{
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_gtranslate:cnn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}{#2}{#3}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% This normalises the named path.
+%
+% \begin{macrocode}
+ normalise/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_normalise:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ normalise~ globally/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_gnormalise:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Exports the path as an SVG file.
+%
+% \begin{macrocode}
+ export~ to~ svg/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_export_to_svg:nv {#1}
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Transforms the named path using TikZ transformation specifications.
+%
+% \begin{macrocode}
+ transform/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \group_begin:
+ \pgftransformreset
+ \tikzset{#2}
+ \pgfgettransform \l_@@_tmpa_tl
+ \tl_gset:Nn \g_@@_smuggle_tl
+ {
+ \spath_transform:cnnnnnn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ \tl_gput_right:NV \g_@@_smuggle_tl \l_@@_tmpa_tl
+ \group_end:
+ \tl_use:N \g_@@_smuggle_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ transform~globally/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \group_begin:
+ \pgftransformreset
+ \tikzset{#2}
+ \pgfgettransform \l_@@_tmpa_tl
+ \tl_gset:Nn \g_@@_smuggle_tl
+ {
+ \spath_gtransform:cnnnnnn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ \tl_gput_right:NV \g_@@_smuggle_tl \l_@@_tmpa_tl
+ \group_end:
+ \tl_use:N \g_@@_smuggle_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Splits first path where it intersects with the second.
+%
+% \begin{macrocode}
+ split~ at~ intersections~ with/.code~ n~ args={2}{
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_split_path_at_intersections:cv
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #2 }
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ split~ globally~ at~ intersections~ with/.code~ n~ args={2}{
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_gsplit_path_at_intersections:cv
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #2 }
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Splits two paths at their mutual intersections.
+%
+% \begin{macrocode}
+ split~ at~ intersections/.code~ n~ args={2}{
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_split_at_intersections:cc
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #2 }
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ split~ globally~ at~ intersections/.code~ n~ args={2}{
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_gsplit_at_intersections:cc
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {\tl_use:N \l_@@_prefix_tl #2 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #2 }
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Splits a path at its self-intersections.
+%
+% \begin{macrocode}
+ split~ at~ self~ intersections/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_split_at_self_intersections:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ split~ globally~ at~ self~ intersections/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_gsplit_at_self_intersections:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Extract the components of a path into a comma separated list (suitable for using in a \Verb+\foreach+ loop).
+%
+% \begin{macrocode}
+ get~ components~ of/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \clist_clear_new:N #2
+ \spath_components_to_seq:Nv
+ \l_@@_tmpa_seq
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \tl_new:c
+ {
+ \tl_use:N \l_@@_prefix_tl
+ anonymous_\int_use:N \g_@@_anon_int
+ \tl_use:N \l_@@_suffix_tl
+ }
+ \tl_set:cn
+ {
+ \tl_use:N \l_@@_prefix_tl
+ anonymous_\int_use:N \g_@@_anon_int
+ \tl_use:N \l_@@_suffix_tl
+ } {##1}
+ \clist_put_right:Nx #2 {anonymous_\int_use:N \g_@@_anon_int}
+ \int_gincr:N \g_@@_anon_int
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ get~ components~ of~ globally/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \clist_gclear_new:N #2
+ \spath_components_to_seq:Nv
+ \l_@@_tmpa_seq
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \seq_map_inline:Nn \l_@@_tmpa_seq
+ {
+ \tl_new:c
+ {
+ \tl_use:N \l_@@_prefix_tl
+ anonymous_\int_use:N \g_@@_anon_int
+ \tl_use:N \l_@@_suffix_tl
+ }
+ \tl_gset:cn
+ {
+ \tl_use:N \l_@@_prefix_tl
+ anonymous_\int_use:N \g_@@_anon_int
+ \tl_use:N \l_@@_suffix_tl
+ } {##1}
+ \clist_gput_right:Nx #2 {anonymous_\int_use:N \g_@@_anon_int}
+ \int_gincr:N \g_@@_anon_int
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Loop through the components of a soft path and render each as a separate TikZ path so that they can be individually styled.
+%
+% \begin{macrocode}
+ render~ components/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \group_begin:
+ \spath_components_to_seq:Nv
+ \l_@@_tmpa_seq
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \seq_map_indexed_inline:Nn \l_@@_tmpa_seq
+ {
+ \spath_tikz_path:nn
+ {
+ every~ spath~ component/.try,
+ spath ~component~ ##1/.try,
+ spath ~component/.try={##1},
+ every~ #1~ component/.try,
+ #1 ~component~ ##1/.try,
+ #1 ~component/.try={##1},
+ }
+ {
+ ##2
+ }
+ }
+ \group_end:
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% This puts gaps between components of a soft path.
+% The list of components is passed through a \Verb+\foreach+ loop so can use the shortcut syntax from those loops.
+%
+% \begin{macrocode}
+ insert~ gaps~ after~ components/.code~ n~ args={3}{
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \group_begin:
+ \seq_gclear:N \g_@@_tmpa_seq
+ \seq_gclear:N \g_@@_tmpb_seq
+ \spath_numberofcomponents:Nv \l_@@_tmpa_int
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \foreach \l_@@_tmpa_tl in {#3}
+ {
+ \seq_gput_right:NV \g_@@_tmpa_seq \l_@@_tmpa_tl
+ \seq_gput_right:Nx
+ \g_@@_tmpb_seq
+ {\int_eval:n
+ {
+ \int_mod:nn { \l_@@_tmpa_tl }{ \l_@@_tmpa_int } + 1
+ }
+ }
+ }
+ \spath_components_to_seq:Nv
+ \l_@@_tmpa_seq
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \seq_clear:N \l_@@_tmpb_seq
+ \seq_map_indexed_inline:Nn \l_@@_tmpa_seq
+ {
+ \tl_set:Nn \l_@@_tmpa_tl {##2}
+ \seq_if_in:NnT \g_@@_tmpa_seq {##1}
+ {
+ \spath_shorten_at_end:Nn \l_@@_tmpa_tl {#2/2}
+ }
+ \seq_if_in:NnT \g_@@_tmpb_seq {##1}
+ {
+ \spath_shorten_at_start:Nn \l_@@_tmpa_tl {#2/2}
+ }
+ \seq_put_right:NV \l_@@_tmpb_seq \l_@@_tmpa_tl
+ }
+ \tl_gset:Nx \g_@@_output_tl {\seq_use:Nn \l_@@_tmpb_seq {} }
+ \group_end:
+ \tl_set_eq:cN
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ insert~ gaps~ globally~ after~ components/.code~ n~ args={3}{
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \group_begin:
+ \seq_gclear:N \g_@@_tmpa_seq
+ \seq_gclear:N \g_@@_tmpb_seq
+ \spath_numberofcomponents:Nv \l_@@_tmpa_int
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \foreach \l_@@_tmpa_tl in {#3}
+ {
+ \seq_gput_right:NV \g_@@_tmpa_seq \l_@@_tmpa_tl
+ \seq_gput_right:Nx
+ \g_@@_tmpb_seq
+ {
+ \int_eval:n
+ {
+ \int_mod:nn { \l_@@_tmpa_tl }{ \l_@@_tmpa_int } + 1
+ }
+ }
+ }
+ \spath_components_to_seq:Nv
+ \l_@@_tmpa_seq
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \seq_clear:N \l_@@_tmpb_seq
+ \seq_map_indexed_inline:Nn \l_@@_tmpa_seq
+ {
+ \tl_set:Nn \l_@@_tmpa_tl {##2}
+ \seq_if_in:NnT \g_@@_tmpa_seq {##1}
+ {
+ \spath_shorten_at_end:Nn \l_@@_tmpa_tl {#2/2}
+ }
+ \seq_if_in:NnT \g_@@_tmpb_seq {##1}
+ {
+ \spath_shorten_at_start:Nn \l_@@_tmpa_tl {#2/2}
+ }
+ \seq_put_right:NV \l_@@_tmpb_seq \l_@@_tmpa_tl
+ }
+ \tl_gset:Nx \g_@@_output_tl {\seq_use:Nn \l_@@_tmpb_seq {} }
+ \group_end:
+ \tl_gset_eq:cN
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \g_@@_output_tl
+ \tl_gclear:N \g_@@_output_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Join the specified components together, joining each to its previous one.
+%
+% \begin{macrocode}
+ join~ components/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \seq_gclear:N \g_@@_tmpa_seq
+ \foreach \l_@@_tmpa_tl in {#2}
+ {
+ \seq_gput_right:NV \g_@@_tmpa_seq \l_@@_tmpa_tl
+ }
+ \seq_gsort:Nn \g_@@_tmpa_seq
+ {
+ \int_compare:nNnTF {##1} > {##2}
+ { \sort_return_same: }
+ { \sort_return_swapped: }
+ }
+ \seq_map_inline:Nn \g_@@_tmpa_seq
+ {
+ \spath_join_component:cn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}{##1}
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ join~ components~ globally/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \seq_gclear:N \g_@@_tmpa_seq
+ \foreach \l_@@_tmpa_tl in {#2}
+ {
+ \seq_gput_right:NV \g_@@_tmpa_seq \l_@@_tmpa_tl
+ }
+ \seq_gsort:Nn \g_@@_tmpa_seq
+ {
+ \int_compare:nNnTF {##1} > {##2}
+ { \sort_return_same: }
+ { \sort_return_swapped: }
+ }
+ \seq_map_inline:Nn \g_@@_tmpa_seq
+ {
+ \spath_gjoin_component:cn
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}{##1}
+ }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% Remove all components of the path that don't actually draw anything.
+%
+% \begin{macrocode}
+ remove~ empty~ components/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_remove_empty_components:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ remove~ empty~ components~ globally/.code={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_gremove_empty_components:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+%
+% Join the specified components together, joining each to its previous one.
+%
+% \begin{macrocode}
+ remove~ components/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \seq_gclear:N \g_@@_tmpa_seq
+ \foreach \l_@@_tmpa_tl in {#2}
+ {
+ \seq_gput_right:NV \g_@@_tmpa_seq \l_@@_tmpa_tl
+ }
+ \seq_gsort:Nn \g_@@_tmpa_seq
+ {
+ \int_compare:nNnTF {##1} < {##2}
+ { \sort_return_same: }
+ { \sort_return_swapped: }
+ }
+ \spath_components_to_seq:Nv
+ \l_@@_tmpa_seq
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \seq_gpop_left:NNF \g_@@_tmpa_seq \l_@@_tmpa_tl
+ {
+ \tl_clear:N \l_@@_tmpa_tl
+ }
+ \seq_clear:N \l_@@_tmpb_seq
+ \seq_map_indexed_inline:Nn \l_@@_tmpa_seq
+ {
+ \tl_set:Nn \l_@@_tmpb_tl {##1}
+ \tl_if_eq:NNTF \l_@@_tmpb_tl \l_@@_tmpa_tl
+ {
+ \seq_gpop_left:NNF \g_@@_tmpa_seq \l_@@_tmpa_tl
+ {
+ \tl_clear:N \l_@@_tmpa_tl
+ }
+ }
+ {
+ \seq_put_right:Nn \l_@@_tmpb_seq {##2}
+ }
+ }
+ \tl_set:cx {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {\seq_use:Nn \l_@@_tmpb_seq {} }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+ remove~ components~ globally/.code~ 2~ args={
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \seq_gclear:N \g_@@_tmpa_seq
+ \foreach \l_@@_tmpa_tl in {#2}
+ {
+ \seq_gput_right:NV \g_@@_tmpa_seq \l_@@_tmpa_tl
+ }
+ \seq_gsort:Nn \g_@@_tmpa_seq
+ {
+ \int_compare:nNnTF {##1} < {##2}
+ { \sort_return_same: }
+ { \sort_return_swapped: }
+ }
+ \spath_components_to_seq:Nv
+ \l_@@_tmpa_seq
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ \seq_gpop_left:NNF \g_@@_tmpa_seq \l_@@_tmpa_tl
+ {
+ \tl_clear:N \l_@@_tmpa_tl
+ }
+ \seq_clear:N \l_@@_tmpb_seq
+ \seq_map_indexed_inline:Nn \l_@@_tmpa_seq
+ {
+ \tl_set:Nn \l_@@_tmpb_tl {##1}
+ \tl_if_eq:NNTF \l_@@_tmpb_tl \l_@@_tmpa_tl
+ {
+ \seq_gpop_left:NNF \g_@@_tmpa_seq \l_@@_tmpa_tl
+ {
+ \tl_clear:N \l_@@_tmpa_tl
+ }
+ }
+ {
+ \seq_put_right:Nn \l_@@_tmpb_seq {##2}
+ }
+ }
+ \tl_gset:cx {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {\seq_use:Nn \l_@@_tmpb_seq {} }
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ },
+% \end{macrocode}
+%
+% This puts a conditional around the \texttt{spot weld} key because when figuring out a knot drawing then we will initially want to render it without the spot weld to keep the number of components constant.
+%
+% \begin{macrocode}
+ draft~ mode/.is~ choice,
+ draft~ mode/true/.code={
+ \bool_set_true:N \l_@@_draft_bool
+ },
+ draft~ mode/false/.code={
+ \bool_set_false:N \l_@@_draft_bool
+ },
+ maybe~ spot~ weld/.code={
+ \bool_if:NF \l_@@_draft_bool
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_spot_weld_components:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ }
+ },
+ maybe~ spot~ weld~ globally/.code={
+ \bool_if:NF \l_@@_draft_bool
+ {
+ \tl_if_exist:cTF
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ {
+ \spath_spot_gweld_components:c
+ {\tl_use:N \l_@@_prefix_tl #1 \tl_use:N \l_@@_suffix_tl}
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ }
+ }
+ },
+% \end{macrocode}
+%
+% Set the transformation to lie along a path.
+%
+% \begin{macrocode}
+ transform~ to/.code~ 2~ args={
+ \group_begin:
+ \tl_if_exist:cTF
+ {
+ \tl_use:N \l_@@_prefix_tl
+ #1
+ \tl_use:N \l_@@_suffix_tl
+ }
+ {
+ \spath_reallength:Nv
+ \l_@@_tmpa_int
+ {
+ \tl_use:N \l_@@_prefix_tl
+ #1
+ \tl_use:N \l_@@_suffix_tl
+ }
+
+ \tl_set:Nx \l_@@_tmpb_tl
+ {\fp_to_decimal:n {(#2) * (\l_@@_tmpa_int)}}
+ \spath_transformation_at:NvV \l_@@_tmpc_tl
+ {
+ \tl_use:N \l_@@_prefix_tl
+ #1
+ \tl_use:N \l_@@_suffix_tl
+ }
+ \l_@@_tmpb_tl
+ \tl_gset_eq:NN \g_@@_smuggle_tl \l_@@_tmpc_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ \tl_gset_eq:NN \g_@@_smuggle_tl { {1}{0}{0}{1}{0pt}{0pt} }
+ }
+ \group_end:
+ \exp_last_unbraced:NV \pgfsettransformentries \g_@@_smuggle_tl
+ \tl_gclear:N \g_@@_smuggle_tl
+ },
+% \end{macrocode}
+%
+% As above, but with a possible extra \(180^\circ\) rotation if needed to ensure that the new \(y\)--axis points vaguely upwards.
+%
+% \begin{macrocode}
+ upright~ transform~ to/.code~ 2~ args={
+ \group_begin:
+ \tl_if_exist:cTF
+ {
+ \tl_use:N \l_@@_prefix_tl
+ #1
+ \tl_use:N \l_@@_suffix_tl
+ }
+ {
+ \spath_reallength:Nv
+ \l_@@_tmpa_int
+ {
+ \tl_use:N \l_@@_prefix_tl
+ #1
+ \tl_use:N \l_@@_suffix_tl
+ }
+
+ \tl_set:Nx \l_@@_tmpb_tl
+ {\fp_to_decimal:n {(#2) * (\l_@@_tmpa_int)}}
+ \spath_transformation_at:NvV \l_@@_tmpc_tl
+ {
+ \tl_use:N \l_@@_prefix_tl
+ #1
+ \tl_use:N \l_@@_suffix_tl
+ }
+ \l_@@_tmpb_tl
+ \tl_gset_eq:NN \g_@@_smuggle_tl \l_@@_tmpc_tl
+ }
+ {
+ \msg_warning:nnn { spath3 } { missing soft path } { #1 }
+ \tl_gset_eq:NN \g_@@_smuggle_tl { {1}{0}{0}{1}{0pt}{0pt} }
+ }
+ \fp_compare:nT { \tl_item:Nn \g_@@_smuggle_tl {4} < 0}
+ {
+ \tl_gset:Nx \g_@@_smuggle_tl
+ {
+ { \fp_eval:n { - (\tl_item:Nn \g_@@_smuggle_tl {1})} }
+ { \fp_eval:n { - (\tl_item:Nn \g_@@_smuggle_tl {2})} }
+ { \fp_eval:n { - (\tl_item:Nn \g_@@_smuggle_tl {3})} }
+ { \fp_eval:n { - (\tl_item:Nn \g_@@_smuggle_tl {4})} }
+ { \tl_item:Nn \g_@@_smuggle_tl {5} }
+ { \tl_item:Nn \g_@@_smuggle_tl {6} }
+ }
+ }
+ \group_end:
+ \exp_last_unbraced:NV \pgfsettransformentries \g_@@_smuggle_tl
+ \tl_gclear:N \g_@@_smuggle_tl
+ },
+% \end{macrocode}
+%
+% This is a useful set of styles for drawing a knot diagram.
+%
+% \begin{macrocode}
+ knot/.style~ n~ args={3}{
+ spath/split~ at~ self~ intersections=#1,
+ spath/remove~ empty~ components=#1,
+ spath/insert~ gaps~ after~ components={#1}{#2}{#3},
+ spath/maybe~ spot~ weld=#1,
+ spath/render~ components=#1
+ },
+ global~ knot/.style~ n~ args={3}{
+ spath/split~ globally~ at~ self~ intersections=#1,
+ spath/remove~ empty~ components~ globally=#1,
+ spath/insert~ gaps~ globally ~after~ components={#1}{#2}{#3},
+ spath/maybe~ spot~ weld~ globally=#1,
+ spath/render~ components=#1
+ },
+}
+% \end{macrocode}
+%
+% This defines a coordinate system that finds a position on a soft path.
+%
+% \begin{macrocode}
+\tikzdeclarecoordinatesystem{spath}{%
+ \group_begin:
+ \tl_set:Nn \l_@@_tmpa_tl {#1}
+ \tl_trim_spaces:N \l_@@_tmpa_tl
+
+ \seq_set_split:NnV \l_@@_tmpa_seq {~} \l_@@_tmpa_tl
+ \seq_pop_right:NN \l_@@_tmpa_seq \l_@@_tmpb_tl
+
+ \tl_set:Nx \l_@@_tmpa_tl { \seq_use:Nn \l_@@_tmpa_seq {~} }
+ \tl_if_exist:cTF
+ {
+ \tl_use:N \l_@@_prefix_tl
+ \tl_use:N \l_@@_tmpa_tl
+ \tl_use:N \l_@@_suffix_tl
+ }
+ {
+
+ \tl_set_eq:Nc
+ \l_@@_tmpa_tl
+ {
+ \tl_use:N \l_@@_prefix_tl
+ \tl_use:N \l_@@_tmpa_tl
+ \tl_use:N \l_@@_suffix_tl
+ }
+
+ \tl_if_empty:NTF \l_@@_tmpa_tl
+ {
+ \tl_gset_eq:NN \g_@@_smuggle_tl \pgfpointorigin
+ }
+ {
+ \spath_reallength:NV \l_@@_tmpa_int \l_@@_tmpa_tl
+ \tl_set:Nx \l_@@_tmpb_tl
+ {\fp_to_decimal:n {(\l_@@_tmpb_tl) * (\l_@@_tmpa_int)}}
+ \spath_point_at:NVV \l_@@_tmpc_tl \l_@@_tmpa_tl \l_@@_tmpb_tl
+
+ \tl_clear:N \l_@@_tmpd_tl
+ \tl_put_right:Nn \l_@@_tmpd_tl {\pgf@x=}
+ \tl_put_right:Nx \l_@@_tmpd_tl {\tl_item:Nn \l_@@_tmpc_tl {1}}
+ \tl_put_right:Nn \l_@@_tmpd_tl {\relax}
+ \tl_put_right:Nn \l_@@_tmpd_tl {\pgf@y=}
+ \tl_put_right:Nx \l_@@_tmpd_tl {\tl_item:Nn \l_@@_tmpc_tl {2}}
+ \tl_put_right:Nn \l_@@_tmpd_tl {\relax}
+ \tl_gset_eq:NN \g_@@_smuggle_tl \l_@@_tmpd_tl
+ }
+ }
+ {
+ \msg_warning:nnx { spath3 } { missing soft path } { \tl_use:N \l_@@_tmpa_tl }
+ \tl_gset_eq:NN \g_@@_smuggle_tl \pgfpointorigin
+ }
+ \group_end:
+ \use:c {pgf@process}{%
+ \tl_use:N \g_@@_smuggle_tl
+ \pgftransforminvert
+ \use:c {pgf@pos@transform@glob}
+ }
+}
+
+\ExplSyntaxOff
+% \end{macrocode}
+% \iffalse
+%</tikzspath3>
+% \fi
+%
+% \iffalse
+%<*calligraphy>
+% \fi
+%
+% \section{The Calligraphy Package}
+%
+% \begin{macrocode}
+%<@@=cal>
+% \end{macrocode}
+%
+% \subsection{Initialisation}
+% \begin{macrocode}
+\RequirePackage{spath3}
+\ExplSyntaxOn
+
+\tl_new:N \l_@@_tmpa_tl
+\tl_new:N \l_@@_tmpb_tl
+\tl_new:N \l_@@_tmp_path_tl
+\tl_new:N \l_@@_tmp_rpath_tl
+\tl_new:N \l_@@_tmp_rpathb_tl
+\tl_new:N \l_@@_tmp_patha_tl
+
+\seq_new:N \l_@@_tmpa_seq
+
+\int_new:N \l_@@_tmpa_int
+\int_new:N \l_@@_tmpb_int
+\int_new:N \g_@@_path_component_int
+\int_new:N \g_@@_label_int
+
+\fp_new:N \l_@@_tmpa_fp
+\fp_new:N \l_@@_tmpb_fp
+\fp_new:N \l_@@_tmpc_fp
+\fp_new:N \l_@@_tmpd_fp
+\fp_new:N \l_@@_tmpe_fp
+
+\dim_new:N \l_@@_tmpa_dim
+\dim_new:N \l_@@_tmpb_dim
+\dim_new:N \l_@@_tmpc_dim
+\dim_new:N \l_@@_tmpd_dim
+\dim_new:N \l_@@_tmpe_dim
+\dim_new:N \l_@@_tmpf_dim
+\dim_new:N \l_@@_tmpg_dim
+\dim_new:N \l_@@_tmph_dim
+
+\bool_new:N \l_@@_annotate_bool
+\bool_new:N \l_@@_taper_start_bool
+\bool_new:N \l_@@_taper_end_bool
+\bool_new:N \l_@@_taperable_bool
+
+\dim_new:N \l_@@_taper_width_dim
+\dim_new:N \l_@@_line_width_dim
+
+\bool_set_true:N \l_@@_taper_start_bool
+\bool_set_true:N \l_@@_taper_end_bool
+
+\cs_generate_variant:Nn \tl_put_right:Nn {Nv}
+
+\msg_new:nnn { calligraphy } { undefined pen } { The~ pen~ "#1"~ is~ not~ defined. }
+% \end{macrocode}
+%
+% \subsection{TikZ Keys}
+%
+% The public interface to this package is through TikZ keys and styles.
+% \begin{macrocode}
+\tikzset{
+ define~pen/.code={
+ \tikzset{pen~name=#1}
+ \pgf@relevantforpicturesizefalse
+ \tikz@addmode{
+ \pgfsyssoftpath@getcurrentpath\l_@@_tmpa_tl
+ \spath_components_to_seq:NV \l_@@_tmpa_seq \l_@@_tmpa_tl
+ \seq_gclear_new:c {g_@@_pen_\pgfkeysvalueof{/tikz/pen~name}_seq}
+ \seq_gset_eq:cN
+ {g_@@_pen_\pgfkeysvalueof{/tikz/pen~name}_seq} \l_@@_tmpa_seq
+ \pgfusepath{discard}%
+ }
+ },
+ define~pen/.default={default},
+ use~pen/.code={
+ \tikzset{pen~name=#1}
+ \int_gzero:N \g_@@_path_component_int
+ \cs_set_eq:NN \pgfpathmoveto \cal_moveto:n
+ \tikz@addmode{
+ \pgfsyssoftpath@getcurrentpath\l_@@_tmpa_tl
+ \spath_components_to_seq:NV \l_@@_tmpa_seq \l_@@_tmpa_tl
+ \tl_if_exist:cTF {g_@@_pen_\pgfkeysvalueof{/tikz/pen~name}_seq}
+ {
+ \cal_path_create:Nc \l_@@_tmpa_seq
+ {g_@@_pen_\pgfkeysvalueof{/tikz/pen~name}_seq}
+ }
+ {
+ \msg_warning:nnx { calligraphy } { undefined pen }
+ { \pgfkeysvalueof{/tikz/pen~name} }
+ }
+ }
+ },
+ use~pen/.default={default},
+ pen~name/.initial={default},
+ copperplate/.style={pen~name=copperplate},
+ pen~colour/.initial={black},
+ weight/.is~choice,
+ weight/heavy/.style={
+ line~width=\pgfkeysvalueof{/tikz/heavy~line~width},
+ taper~width=\pgfkeysvalueof{/tikz/light~line~width},
+ },
+ weight/light/.style={
+ line~width=\pgfkeysvalueof{/tikz/light~line~width},
+ taper~width=0pt,
+ },
+ heavy/.style={
+ weight=heavy
+ },
+ light/.style={
+ weight=light
+ },
+ heavy~line~width/.initial=2pt,
+ light~line~width/.initial=1pt,
+ taper/.is~choice,
+ taper/.default=both,
+ taper/none/.style={
+ taper~start=false,
+ taper~end=false,
+ },
+ taper/both/.style={
+ taper~start=true,
+ taper~end=true,
+ },
+ taper/start/.style={
+ taper~start=true,
+ taper~end=false,
+ },
+ taper/end/.style={
+ taper~start=false,
+ taper~end=true,
+ },
+ taper~start/.code={
+ \tl_if_eq:nnTF {#1} {true}
+ {
+ \bool_set_true:N \l_@@_taper_start_bool
+ }
+ {
+ \bool_set_false:N \l_@@_taper_start_bool
+ }
+ },
+ taper~start/.default={true},
+ taper~end/.code={
+ \tl_if_eq:nnTF {#1} {true}
+ {
+ \bool_set_true:N \l_@@_taper_end_bool
+ }
+ {
+ \bool_set_false:N \l_@@_taper_end_bool
+ }
+ },
+ taper~end/.default={true},
+ taper~width/.code={\dim_set:Nn \l_@@_taper_width_dim {#1}},
+ nib~style/.code~2~args={
+ \tl_clear_new:c {l_@@_nib_style_#1}
+ \tl_set:cn {l_@@_nib_style_#1} {#2}
+ },
+ stroke~style/.code~2~args={
+ \tl_clear_new:c {l_@@_stroke_style_#1}
+ \tl_set:cn {l_@@_stroke_style_#1} {#2}
+ },
+ this~stroke~style/.code={
+ \tl_clear_new:c
+ {l_@@_stroke_inline_style_ \int_use:N \g_@@_path_component_int}
+ \tl_set:cn
+ {l_@@_stroke_inline_style_ \int_use:N \g_@@_path_component_int} {#1}
+ },
+ annotate/.style={
+ annotate~if,
+ annotate~reset,
+ annotation~style/.update~value={#1},
+ },
+ annotate~if/.default={true},
+ annotate~if/.code={
+ \tl_if_eq:nnTF {#1} {true}
+ {
+ \bool_set_true:N \l_@@_annotate_bool
+ }
+ {
+ \bool_set_false:N \l_@@_annotate_bool
+ }
+ },
+ annotate~reset/.code={
+ \int_gzero:N \g_@@_label_int
+ },
+ annotation~style/.initial={draw,->},
+ annotation~shift/.initial={(0,1ex)},
+ every~annotation~node/.initial={anchor=south~west},
+ annotation~node~style/.code~2~args={
+ \tl_clear_new:c {l_@@_annotation_style_ #1 _tl}
+ \tl_set:cn {l_@@_annotation_style_ #1 _tl}{#2}
+ },
+ tl~use:N/.code={
+ \exp_args:NV \pgfkeysalso #1
+ },
+ tl~use:c/.code={
+ \tl_if_exist:cT {#1}
+ {
+ \exp_args:Nv \pgfkeysalso {#1}
+ }
+ },
+ /handlers/.update~style/.code={
+ \tl_if_eq:nnF {#1} {\pgfkeysnovalue}
+ {
+ \pgfkeys{\pgfkeyscurrentpath/.code=\pgfkeysalso{#1}}
+ }
+ },
+ /handlers/.update~value/.code={
+ \tl_if_eq:nnF {#1} {\pgfkeysnovalue}
+ {
+ \pgfkeyssetvalue{\pgfkeyscurrentpath}{#1}
+ }
+ },
+}
+% \end{macrocode}
+%
+% Some wrappers around the TikZ keys.
+% \begin{macrocode}
+\NewDocumentCommand \pen { O{} }
+{
+ \path[define~ pen,every~ calligraphy~ pen/.try,#1]
+}
+
+\NewDocumentCommand \definepen { O{} }
+{
+ \tikz \path[define~ pen,every~ calligraphy~ pen/.try,#1]
+}
+
+\NewDocumentCommand \calligraphy { O{} }
+{
+ \path[use~ pen,every~ calligraphy/.try,#1]
+}
+% \end{macrocode}
+%
+% \subsection{The Path Creation}
+%
+% \begin{macro}[internal]{\cal_path_create:NN}
+% This is the main command for creating the calligraphic paths.
+% First argument is the given path
+% Second argument is the pen path
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \cal_path_create:NN #1#2
+{
+ \int_zero:N \l_@@_tmpa_int
+ \seq_map_inline:Nn #1
+ {
+ \int_compare:nT {\tl_count:n {##1} > 3}
+ {
+
+ \int_incr:N \l_@@_tmpa_int
+ \int_zero:N \l_@@_tmpb_int
+
+ \tl_set:Nn \l_@@_tmp_path_tl {##1}
+ \spath_open:N \l_@@_tmp_path_tl
+ \spath_reverse:NV \l_@@_tmp_rpath_tl \l_@@_tmp_path_tl
+
+ \seq_map_inline:Nn #2
+ {
+ \int_incr:N \l_@@_tmpb_int
+ \group_begin:
+ \pgfsys@beginscope
+ \cal_apply_style:c {l_@@_stroke_style_ \int_use:N \l_@@_tmpa_int}
+ \cal_apply_style:c {l_@@_stroke_inline_style_ \int_use:N \l_@@_tmpa_int}
+ \cal_apply_style:c {l_@@_nib_style_ \int_use:N \l_@@_tmpb_int}
+
+ \spath_initialpoint:Nn \l_@@_tmpa_tl {####1}
+ \tl_set_eq:NN \l_@@_tmp_patha_tl \l_@@_tmp_path_tl
+ \spath_translate:NV \l_@@_tmp_patha_tl \l_@@_tmpa_tl
+
+ \int_compare:nTF {\tl_count:n {####1} == 3}
+ {
+ \cal_at_least_three:N \l_@@_tmp_patha_tl
+ \spath_protocol_path:V \l_@@_tmp_patha_tl
+
+ \tikz@options
+ \dim_set:Nn \l_@@_line_width_dim {\pgflinewidth}
+ \cal_maybe_taper:N \l_@@_tmp_patha_tl
+ }
+ {
+ \spath_weld:Nn \l_@@_tmp_patha_tl {####1}
+ \spath_weld:NV \l_@@_tmp_patha_tl \l_@@_tmp_rpath_tl
+ \spath_reverse:Nn \l_@@_tmp_rpathb_tl {####1}
+ \spath_weld:NV \l_@@_tmp_patha_tl \l_@@_tmp_rpathb_tl
+
+ \tl_clear:N \l_@@_tmpa_tl
+ \tl_set:Nn \l_@@_tmpa_tl
+ {
+ fill=\pgfkeysvalueof{/tikz/pen~colour},
+ draw=none
+ }
+ \tl_if_exist:cT {l_@@_stroke_style_ \int_use:N \l_@@_tmpa_int}
+ {
+ \tl_put_right:Nv \l_@@_tmpa_tl
+ {l_@@_stroke_style_ \int_use:N \l_@@_tmpa_int}
+ }
+ \tl_if_exist:cT {l_@@_stroke_inline_style_ \int_use:N \l_@@_tmpa_int}
+ {
+ \tl_put_right:Nn \l_@@_tmpa_tl {,}
+ \tl_put_right:Nv \l_@@_tmpa_tl
+ {l_@@_stroke_inline_style_ \int_use:N \l_@@_tmpa_int}
+ }
+ \tl_if_exist:cT {l_@@_nib_style_ \int_use:N \l_@@_tmpb_int}
+ {
+ \tl_put_right:Nn \l_@@_tmpa_tl {,}
+ \tl_put_right:Nv \l_@@_tmpa_tl
+ {l_@@_nib_style_ \int_use:N \l_@@_tmpb_int}
+ }
+ \spath_tikz_path:VV \l_@@_tmpa_tl \l_@@_tmp_patha_tl
+ }
+ \pgfsys@endscope
+ \group_end:
+ }
+
+ \bool_if:NT \l_@@_annotate_bool
+ {
+ \seq_get_right:NN #2 \l_@@_tmpa_tl
+ \spath_finalpoint:NV \l_@@_tmpa_tl \l_@@_tmpa_tl
+ \spath_translate:NV \l_@@_tmp_path_tl \l_@@_tmpa_tl
+ \tikz@scan@one@point
+ \pgfutil@firstofone
+ \pgfkeysvalueof{/tikz/annotation~shift}
+
+ \spath_translate:Nnn \l_@@_tmp_path_tl {\pgf@x} {\pgf@y}
+
+ \pgfkeysgetvalue{/tikz/annotation~style}{\l_@@_tmpa_tl}
+ \spath_tikz_path:VV \l_@@_tmpa_tl \l_@@_tmp_path_tl
+
+ \spath_finalpoint:NV \l_@@_tmpa_tl \l_@@_tmp_path_tl
+
+ \exp_last_unbraced:NV \pgfqpoint \l_@@_tmpa_tl
+ \begin{scope}[reset~ cm]
+ \node[
+ every~annotation~node/.try,
+ tl~use:c = {l_@@_annotation_style_ \int_use:N \l_@@_tmpa_int _tl}
+ ] at (\pgf@x,\pgf@y) {\int_use:N \l_@@_tmpa_int};
+ \end{scope}
+ }
+ }
+ }
+}
+\cs_generate_variant:Nn \cal_path_create:NN {Nc}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\cal_moveto:n}
+% When creating the path, we need to keep track of the number of components so that we can apply styles accordingly.
+% \begin{macrocode}
+\cs_new_eq:NN \cal_orig_moveto:n \pgfpathmoveto
+\cs_new_nopar:Npn \cal_moveto:n #1
+{
+ \int_gincr:N \g_@@_path_component_int
+ \cal_orig_moveto:n {#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\cal_apply_style:N}
+% Interface for applying \Verb+\tikzset+ to a token list.
+% \begin{macrocode}
+\cs_new_nopar:Npn \cal_apply_style:N #1
+{
+ \tl_if_exist:NT #1 {
+ \exp_args:NV \tikzset #1
+ }
+}
+\cs_generate_variant:Nn \cal_apply_style:N {c}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\cal_at_least_three:Nn}
+% A tapered path has to have at least three components.
+% This figures out if it is necessary and sets up the splitting.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \cal_at_least_three:Nn #1#2
+{
+ \spath_reallength:Nn \l_@@_tmpa_int {#2}
+ \tl_clear:N \l_@@_tmpb_tl
+ \tl_set:Nn \l_@@_tmpb_tl {#2}
+ \int_compare:nTF {\l_@@_tmpa_int = 1}
+ {
+ \spath_split_at:Nn \l_@@_tmpb_tl {2/3}
+ \spath_split_at:Nn \l_@@_tmpb_tl {1/2}
+ }
+ {
+ \int_compare:nT {\l_@@_tmpa_int = 2}
+ {
+ \spath_split_at:Nn \l_@@_tmpb_tl {1.5}
+ \spath_split_at:Nn \l_@@_tmpb_tl {.5}
+ }
+ }
+ \tl_set_eq:NN #1 \l_@@_tmpb_tl
+}
+\cs_generate_variant:Nn \cal_at_least_three:Nn {NV}
+\cs_new_protected_nopar:Npn \cal_at_least_three:N #1
+{
+ \cal_at_least_three:NV #1#1
+}
+\cs_generate_variant:Nn \cal_at_least_three:N {c}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\cal_maybe_taper:N}
+% Possibly tapers the path, depending on the booleans.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \cal_maybe_taper:N #1
+{
+ \tl_set_eq:NN \l_@@_tmpa_tl #1
+
+ \bool_if:NT \l_@@_taper_start_bool
+ {
+
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_item:Nn \l_@@_tmpa_tl {2}}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_item:Nn \l_@@_tmpa_tl {3}}
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_item:Nn \l_@@_tmpa_tl {4}}
+
+ \tl_case:NnF \l_@@_tmpb_tl
+ {
+ \c_spath_lineto_tl
+ {
+
+ \bool_set_true:N \l_@@_taperable_bool
+ \dim_set:Nn \l_@@_tmpg_dim {\tl_item:Nn \l_@@_tmpa_tl {5}}
+ \dim_set:Nn \l_@@_tmph_dim {\tl_item:Nn \l_@@_tmpa_tl {6}}
+ \dim_set:Nn \l_@@_tmpc_dim {(2\l_@@_tmpa_dim + \l_@@_tmpg_dim)/3}
+ \dim_set:Nn \l_@@_tmpd_dim {(2\l_@@_tmpb_dim + \l_@@_tmph_dim)/3}
+ \dim_set:Nn \l_@@_tmpe_dim {(\l_@@_tmpa_dim + 2\l_@@_tmpg_dim)/3}
+ \dim_set:Nn \l_@@_tmpf_dim {(\l_@@_tmpb_dim + 2\l_@@_tmph_dim)/3}
+ \prg_replicate:nn {4}
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+ \tl_put_left:NV \l_@@_tmpa_tl \c_spath_moveto_tl
+ }
+ \c_spath_curvetoa_tl
+ {
+ \bool_set_true:N \l_@@_taperable_bool
+ \dim_set:Nn \l_@@_tmpc_dim {\tl_item:Nn \l_@@_tmpa_tl {5}}
+ \dim_set:Nn \l_@@_tmpd_dim {\tl_item:Nn \l_@@_tmpa_tl {6}}
+ \dim_set:Nn \l_@@_tmpe_dim {\tl_item:Nn \l_@@_tmpa_tl {8}}
+ \dim_set:Nn \l_@@_tmpf_dim {\tl_item:Nn \l_@@_tmpa_tl {9}}
+ \dim_set:Nn \l_@@_tmpg_dim {\tl_item:Nn \l_@@_tmpa_tl {11}}
+ \dim_set:Nn \l_@@_tmph_dim {\tl_item:Nn \l_@@_tmpa_tl {12}}
+ \prg_replicate:nn {10}
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+ \tl_put_left:NV \l_@@_tmpa_tl \c_spath_moveto_tl
+ }
+ }
+ {
+ \bool_set_false:N \l_@@_taperable_bool
+ }
+
+ \bool_if:NT \l_@@_taperable_bool
+ {
+ \@@_taper_aux:
+ }
+
+ }
+
+ \bool_if:NT \l_@@_taper_end_bool
+ {
+
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_item:Nn \l_@@_tmpa_tl {-2}}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_item:Nn \l_@@_tmpa_tl {-1}}
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_item:Nn \l_@@_tmpa_tl {-3}}
+
+ \tl_case:NnF \l_@@_tmpb_tl
+ {
+ \c_spath_lineto_tl
+ {
+
+ \bool_set_true:N \l_@@_taperable_bool
+ \dim_set:Nn \l_@@_tmpg_dim {\tl_item:Nn \l_@@_tmpa_tl {-5}}
+ \dim_set:Nn \l_@@_tmph_dim {\tl_item:Nn \l_@@_tmpa_tl {-4}}
+ \dim_set:Nn \l_@@_tmpc_dim {(2\l_@@_tmpa_dim + \l_@@_tmpg_dim)/3}
+ \dim_set:Nn \l_@@_tmpd_dim {(2\l_@@_tmpb_dim + \l_@@_tmph_dim)/3}
+ \dim_set:Nn \l_@@_tmpe_dim {(\l_@@_tmpa_dim + 2\l_@@_tmpg_dim)/3}
+ \dim_set:Nn \l_@@_tmpf_dim {(\l_@@_tmpb_dim + 2\l_@@_tmph_dim)/3}
+ \tl_reverse:N \l_@@_tmpa_tl
+ \prg_replicate:nn {3}
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+ \tl_reverse:N \l_@@_tmpa_tl
+ }
+ \c_spath_curveto_tl
+ {
+ \bool_set_true:N \l_@@_taperable_bool
+ \dim_set:Nn \l_@@_tmpc_dim {\tl_item:Nn \l_@@_tmpa_tl {-5}}
+ \dim_set:Nn \l_@@_tmpd_dim {\tl_item:Nn \l_@@_tmpa_tl {-4}}
+ \dim_set:Nn \l_@@_tmpe_dim {\tl_item:Nn \l_@@_tmpa_tl {-8}}
+ \dim_set:Nn \l_@@_tmpf_dim {\tl_item:Nn \l_@@_tmpa_tl {-7}}
+ \dim_set:Nn \l_@@_tmpg_dim {\tl_item:Nn \l_@@_tmpa_tl {-11}}
+ \dim_set:Nn \l_@@_tmph_dim {\tl_item:Nn \l_@@_tmpa_tl {-10}}
+ \tl_reverse:N \l_@@_tmpa_tl
+ \prg_replicate:nn {9}
+ {
+ \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl}
+ }
+ \tl_reverse:N \l_@@_tmpa_tl
+ }
+ }
+ {
+ \bool_set_false:N \l_@@_taperable_bool
+ }
+
+ \bool_if:NT \l_@@_taperable_bool
+ {
+ \@@_taper_aux:
+ }
+
+ }
+
+ \pgfsyssoftpath@setcurrentpath\l_@@_tmpa_tl
+ \pgfsetstrokecolor{\pgfkeysvalueof{/tikz/pen~colour}}
+ \pgfusepath{stroke}
+
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\@@_taper_aux:}
+% Auxiliary macro to avoid unnecessary code duplication.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \@@_taper_aux:
+{
+ \tl_clear:N \l_@@_tmpb_tl
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_moveto_tl
+
+ \fp_set:Nn \l_@@_tmpa_fp
+ {
+ \l_@@_tmpd_dim - \l_@@_tmpb_dim
+ }
+ \fp_set:Nn \l_@@_tmpb_fp
+ {
+ \l_@@_tmpa_dim - \l_@@_tmpc_dim
+ }
+ \fp_set:Nn \l_@@_tmpe_fp
+ {
+ (\l_@@_tmpa_fp^2 + \l_@@_tmpb_fp^2)^.5
+ }
+
+ \fp_set:Nn \l_@@_tmpa_fp
+ {
+ .5*\l_@@_taper_width_dim
+ *
+ \l_@@_tmpa_fp / \l_@@_tmpe_fp
+ }
+ \fp_set:Nn \l_@@_tmpb_fp
+ {
+ .5*\l_@@_taper_width_dim
+ *
+ \l_@@_tmpb_fp / \l_@@_tmpe_fp
+ }
+
+ \fp_set:Nn \l_@@_tmpc_fp
+ {
+ \l_@@_tmph_dim - \l_@@_tmpf_dim
+ }
+ \fp_set:Nn \l_@@_tmpd_fp
+ {
+ \l_@@_tmpe_dim - \l_@@_tmpg_dim
+ }
+ \fp_set:Nn \l_@@_tmpe_fp
+ {
+ (\l_@@_tmpc_fp^2 + \l_@@_tmpd_fp^2)^.5
+ }
+
+ \fp_set:Nn \l_@@_tmpc_fp
+ {
+ .5*\l_@@_line_width_dim
+ *
+ \l_@@_tmpc_fp / \l_@@_tmpe_fp
+ }
+ \fp_set:Nn \l_@@_tmpd_fp
+ {
+ .5*\l_@@_line_width_dim
+ *
+ \l_@@_tmpd_fp / \l_@@_tmpe_fp
+ }
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_eval:n { \fp_to_dim:N \l_@@_tmpa_fp + \l_@@_tmpa_dim}}
+ {\dim_eval:n { \fp_to_dim:N \l_@@_tmpb_fp + \l_@@_tmpb_dim}}
+ }
+
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_curvetoa_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_eval:n { \fp_to_dim:N \l_@@_tmpa_fp + \l_@@_tmpc_dim}}
+ {\dim_eval:n { \fp_to_dim:N \l_@@_tmpb_fp + \l_@@_tmpd_dim}}
+ }
+
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_curvetob_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_eval:n { \fp_to_dim:N \l_@@_tmpc_fp + \l_@@_tmpe_dim}}
+ {\dim_eval:n { \fp_to_dim:N \l_@@_tmpd_fp + \l_@@_tmpf_dim}}
+ }
+
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_curveto_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_eval:n { \fp_to_dim:N \l_@@_tmpc_fp + \l_@@_tmpg_dim}}
+ {\dim_eval:n { \fp_to_dim:N \l_@@_tmpd_fp + \l_@@_tmph_dim}}
+ }
+
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_curvetoa_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {
+ \dim_eval:n
+ {
+ \fp_to_dim:N \l_@@_tmpc_fp + \l_@@_tmpg_dim
+ - \fp_to_dim:n{ 1.32 * \l_@@_tmpd_fp
+ }
+ }
+ }
+ {
+ \dim_eval:n
+ {
+ \fp_to_dim:N \l_@@_tmpd_fp + \l_@@_tmph_dim
+ + \fp_to_dim:n {1.32* \l_@@_tmpc_fp
+ }
+ }
+ }
+ }
+
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_curvetob_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {
+ \dim_eval:n
+ {
+ -\fp_to_dim:N \l_@@_tmpc_fp + \l_@@_tmpg_dim
+ - \fp_to_dim:n {1.32 * \l_@@_tmpd_fp
+ }
+ }
+ }
+ {
+ \dim_eval:n
+ {
+ -\fp_to_dim:N \l_@@_tmpd_fp + \l_@@_tmph_dim
+ + \fp_to_dim:n {1.32 * \l_@@_tmpc_fp
+ }
+ }
+ }
+ }
+
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_curveto_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_eval:n { -\fp_to_dim:N \l_@@_tmpc_fp + \l_@@_tmpg_dim}}
+ {\dim_eval:n { -\fp_to_dim:N \l_@@_tmpd_fp + \l_@@_tmph_dim}}
+ }
+
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_curvetoa_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_eval:n { -\fp_to_dim:N \l_@@_tmpc_fp + \l_@@_tmpe_dim}}
+ {\dim_eval:n { -\fp_to_dim:N \l_@@_tmpd_fp + \l_@@_tmpf_dim}}
+ }
+
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_curvetob_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_eval:n { -\fp_to_dim:N \l_@@_tmpa_fp + \l_@@_tmpc_dim}}
+ {\dim_eval:n { -\fp_to_dim:N \l_@@_tmpb_fp + \l_@@_tmpd_dim}}
+ }
+
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_curveto_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_eval:n { -\fp_to_dim:N \l_@@_tmpa_fp + \l_@@_tmpa_dim}}
+ {\dim_eval:n { -\fp_to_dim:N \l_@@_tmpb_fp + \l_@@_tmpb_dim}}
+ }
+
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_curvetoa_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {
+ \dim_eval:n
+ {
+ -\fp_to_dim:N \l_@@_tmpa_fp + \l_@@_tmpa_dim
+ + \fp_to_dim:n{ 1.32 * \l_@@_tmpb_fp}
+ }
+ }
+ {
+ \dim_eval:n
+ {
+ -\fp_to_dim:N \l_@@_tmpb_fp + \l_@@_tmpb_dim
+ - \fp_to_dim:n {1.32* \l_@@_tmpa_fp}
+ }
+ }
+ }
+
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_curvetob_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {
+ \dim_eval:n
+ {
+ \fp_to_dim:N \l_@@_tmpa_fp + \l_@@_tmpa_dim
+ + \fp_to_dim:n {1.32 * \l_@@_tmpb_fp}
+ }
+ }
+ {
+ \dim_eval:n
+ {
+ \fp_to_dim:N \l_@@_tmpb_fp + \l_@@_tmpb_dim
+ - \fp_to_dim:n {1.32 * \l_@@_tmpa_fp}
+ }
+ }
+ }
+
+ \tl_put_right:NV \l_@@_tmpb_tl \c_spath_curveto_tl
+
+ \tl_put_right:Nx \l_@@_tmpb_tl
+ {
+ {\dim_eval:n { \fp_to_dim:N \l_@@_tmpa_fp + \l_@@_tmpa_dim}}
+ {\dim_eval:n { \fp_to_dim:N \l_@@_tmpb_fp + \l_@@_tmpb_dim}}
+ }
+
+ \pgfsyssoftpath@setcurrentpath\l_@@_tmpb_tl
+ \pgfsetfillcolor{\pgfkeysvalueof{/tikz/pen~colour}}
+ \pgfusepath{fill}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Defines a copperplate pen.
+% \begin{macrocode}
+\tl_set:Nn \l_@@_tmpa_tl {\pgfsyssoftpath@movetotoken{0pt}{0pt}}
+\spath_components_to_seq:NV \l_@@_tmpa_seq \l_@@_tmpa_tl
+\seq_gclear_new:N \g_@@_pen_copperplate_seq
+\seq_gset_eq:NN \g_@@_pen_copperplate_seq \l_@@_tmpa_seq
+% \end{macrocode}
+%
+% \begin{macro}[internal]{\CopperplatePath}
+% This is used in the decorations section to convert a path to a copperplate path.
+% \begin{macrocode}
+\DeclareDocumentCommand \CopperplatePath { m }
+{
+ \spath_components_to_seq:NV \l_@@_tmpa_seq #1
+ \cal_path_create:NN \l_@@_tmpa_seq \g_@@_pen_copperplate_seq
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% \subsection{Decorations}
+%
+% If a decoration library is loaded we define some decorations that use the calligraphy library, specifically the copperplate pen with its tapering.
+%
+% First, a brace decoration.
+% \begin{macrocode}
+\expandafter\ifx\csname pgfdeclaredecoration\endcsname\relax
+\else
+\pgfdeclaredecoration{calligraphic brace}{brace}%
+{%
+ \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final]%
+ {%
+ \pgfsyssoftpath@setcurrentpath{\pgfutil@empty}%
+ \pgfpathmoveto{\pgfpointorigin}%
+ \pgfpathcurveto%
+ {%
+ \pgfqpoint%
+ {.15\pgfdecorationsegmentamplitude}%
+ {.3\pgfdecorationsegmentamplitude}%
+ }%
+ {%
+ \pgfqpoint%
+ {.5\pgfdecorationsegmentamplitude}%
+ {.5\pgfdecorationsegmentamplitude}%
+ }%
+ {%
+ \pgfqpoint%
+ {\pgfdecorationsegmentamplitude}%
+ {.5\pgfdecorationsegmentamplitude}%
+ }%
+ {%
+ \pgftransformxshift%
+ {+\pgfdecorationsegmentaspect\pgfdecoratedremainingdistance}%
+ \pgfpathlineto%
+ {%
+ \pgfqpoint%
+ {-\pgfdecorationsegmentamplitude}%
+ {.5\pgfdecorationsegmentamplitude}%
+ }%
+ \pgfpathcurveto
+ {%
+ \pgfqpoint%
+ {-.5\pgfdecorationsegmentamplitude}%
+ {.5\pgfdecorationsegmentamplitude}%
+ }%
+ {%
+ \pgfqpoint%
+ {-.15\pgfdecorationsegmentamplitude}%
+ {.7\pgfdecorationsegmentamplitude}%
+ }%
+ {%
+ \pgfqpoint%
+ {0\pgfdecorationsegmentamplitude}%
+ {1\pgfdecorationsegmentamplitude}%
+ }%
+ \pgfpathmoveto%
+ {%
+ \pgfqpoint%
+ {0\pgfdecorationsegmentamplitude}%
+ {1\pgfdecorationsegmentamplitude}%
+ }%
+ \pgfpathcurveto%
+ {%
+ \pgfqpoint%
+ {.15\pgfdecorationsegmentamplitude}%
+ {.7\pgfdecorationsegmentamplitude}%
+ }%
+ {%
+ \pgfqpoint%
+ {.5\pgfdecorationsegmentamplitude}%
+ {.5\pgfdecorationsegmentamplitude}%
+ }%
+ {%
+ \pgfqpoint%
+ {\pgfdecorationsegmentamplitude}%
+ {.5\pgfdecorationsegmentamplitude}%
+ }%
+ }%
+ {%
+ \pgftransformxshift{+\pgfdecoratedremainingdistance}%
+ \pgfpathlineto%
+ {%
+ \pgfqpoint%
+ {-\pgfdecorationsegmentamplitude}%
+ {.5\pgfdecorationsegmentamplitude}%
+ }%
+ \pgfpathcurveto%
+ {%
+ \pgfqpoint%
+ {-.5\pgfdecorationsegmentamplitude}%
+ {.5\pgfdecorationsegmentamplitude}%
+ }%
+ {%
+ \pgfqpoint%
+ {-.15\pgfdecorationsegmentamplitude}%
+ {.3\pgfdecorationsegmentamplitude}%
+ }%
+ {\pgfqpoint{0pt}{0pt}}%
+ }%
+ \tikzset{%
+ taper width=.5\pgflinewidth,%
+ taper%
+ }%%
+ \pgfsyssoftpath@getcurrentpath\cal@tmp@path%
+ \CopperplatePath{\cal@tmp@path}%
+ }%
+ \state{final}{}%
+}%
+% \end{macrocode}
+%
+% The second is a straightened parenthesis (so that when very large it doesn't bow out too far).
+% \begin{macrocode}
+\pgfdeclaredecoration{calligraphic straight parenthesis}{brace}
+{
+ \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final]%
+ {%
+ \pgfsyssoftpath@setcurrentpath{\pgfutil@empty}%
+ \pgfpathmoveto{\pgfpointorigin}%
+ \pgfpathcurveto%
+ {%
+ \pgfqpoint%
+ {.76604\pgfdecorationsegmentamplitude}%
+ {.64279\pgfdecorationsegmentamplitude}%
+ }%
+ {%
+ \pgfqpoint%
+ {2.3333\pgfdecorationsegmentamplitude}%
+ {\pgfdecorationsegmentamplitude}%
+ }%
+ {%
+ \pgfqpoint%
+ {3.3333\pgfdecorationsegmentamplitude}%
+ {\pgfdecorationsegmentamplitude}%
+ }%
+ {%
+ \pgftransformxshift{+\pgfdecoratedremainingdistance}%
+ \pgfpathlineto%
+ {%
+ \pgfqpoint%
+ {-3.3333\pgfdecorationsegmentamplitude}%
+ {\pgfdecorationsegmentamplitude}%
+ }%
+ \pgfpathcurveto%
+ {%
+ \pgfqpoint%
+ {-2.3333\pgfdecorationsegmentamplitude}%
+ {\pgfdecorationsegmentamplitude}%
+ }%
+ {%
+ \pgfqpoint%
+ {-.76604\pgfdecorationsegmentamplitude}%
+ {.64279\pgfdecorationsegmentamplitude}%
+ }%
+ {\pgfqpoint{0pt}{0pt}}%
+ }%
+ \tikzset{%
+ taper width=.5\pgflinewidth,%
+ taper%
+ }%
+ \pgfsyssoftpath@getcurrentpath\cal@tmp@path%
+ \CopperplatePath{\cal@tmp@path}%
+ }%
+ \state{final}{}%
+}
+% \end{macrocode}
+%
+% The third is a curved parenthesis.
+% \begin{macrocode}
+\pgfdeclaredecoration{calligraphic curved parenthesis}{brace}
+{
+ \state{brace}[width=+\pgfdecoratedremainingdistance,next state=final]%
+ {%
+ \pgfsyssoftpath@setcurrentpath{\pgfutil@empty}%
+ \pgfpathmoveto{\pgfpointorigin}%
+ \pgf@xa=\pgfdecoratedremainingdistance\relax%
+ \advance\pgf@xa by -1.5890\pgfdecorationsegmentamplitude\relax%
+ \edef\cgrphy@xa{\the\pgf@xa}%
+ \pgfpathcurveto%
+ {%
+ \pgfqpoint%
+ {1.5890\pgfdecorationsegmentamplitude}%
+ {1.3333\pgfdecorationsegmentamplitude}%
+ }%
+ {\pgfqpoint{\cgrphy@xa}{1.3333\pgfdecorationsegmentamplitude}}%
+ {\pgfqpoint{\pgfdecoratedremainingdistance}{0pt}}%
+ \tikzset{%
+ taper width=.5\pgflinewidth,%
+ taper%
+ }%
+ \pgfsyssoftpath@getcurrentpath\cal@tmp@path%
+ \CopperplatePath{\cal@tmp@path}%
+ }%
+ \state{final}{}%
+}
+% \end{macrocode}
+% End the conditional for if pgfdecoration module is loaded
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+% \iffalse
+%</calligraphy>
+% \fi
+%
+%
+% \iffalse
+%<*knots>
+% \fi
+%%
+% \section{Drawing Knots}
+%
+% \begin{macrocode}
+%<@@=knot>
+% \end{macrocode}
+%
+% \subsection{Initialisation}
+%
+% We load the \Verb+spath3+ library and the \Verb+intersections+ TikZ library.
+% Then we get going.
+% \begin{macrocode}
+\RequirePackage{spath3}
+\usetikzlibrary{intersections,spath3}
+
+\ExplSyntaxOn
+
+\tl_new:N \l_@@_tmpa_tl
+\tl_new:N \l_@@_tmpb_tl
+\tl_new:N \l_@@_tmpc_tl
+\tl_new:N \l_@@_tmpd_tl
+\tl_new:N \l_@@_tmpg_tl
+\tl_new:N \l_@@_redraws_tl
+\tl_new:N \l_@@_clip_width_tl
+\tl_new:N \l_@@_name_tl
+\tl_new:N \l_@@_node_tl
+\tl_new:N \l_@@_aux_tl
+\tl_new:N \l_@@_auxa_tl
+\tl_new:N \l_@@_prefix_tl
+
+\seq_new:N \l_@@_segments_seq
+
+\int_new:N \l_@@_tmpa_int
+\int_new:N \l_@@_strands_int
+\int_new:N \g_@@_intersections_int
+\int_new:N \g_@@_filaments_int
+\int_new:N \l_@@_component_start_int
+
+\fp_new:N \l_@@_tmpa_fp
+\fp_new:N \l_@@_tmpb_fp
+
+\dim_new:N \l_@@_tmpa_dim
+\dim_new:N \l_@@_tmpb_dim
+\dim_new:N \l_@@_tolerance_dim
+\dim_new:N \l_@@_redraw_tolerance_dim
+\dim_new:N \l_@@_clip_bg_radius_dim
+\dim_new:N \l_@@_clip_draw_radius_dim
+
+\bool_new:N \l_@@_draft_bool
+\bool_new:N \l_@@_ignore_ends_bool
+\bool_new:N \l_@@_self_intersections_bool
+\bool_new:N \l_@@_splits_bool
+\bool_new:N \l_@@_super_draft_bool
+
+\bool_new:N \l_@@_prepend_prev_bool
+\bool_new:N \l_@@_append_next_bool
+\bool_new:N \l_@@_skip_bool
+\bool_new:N \l_@@_save_bool
+
+\seq_new:N \g_@@_nodes_seq
+
+\bool_set_true:N \l_@@_ignore_ends_bool
+% \end{macrocode}
+%
+% Configuration is via TikZ keys and styles.
+% \begin{macrocode}
+\tikzset{
+ spath/prefix/knot/.style={
+ spath/set~ prefix=knot strand,
+ },
+ spath/suffix/knot/.style={
+ spath/set~ suffix={},
+ },
+ knot/.code={
+ \tl_if_eq:nnTF {#1} {none}
+ {
+ \tikz@addmode{\tikz@mode@doublefalse}
+ }
+ {
+ \tikz@addmode{\tikz@mode@doubletrue}
+ \tl_if_eq:nnTF {\pgfkeysnovalue} {#1}
+ {
+ \tikz@addoption{\pgfsetinnerstrokecolor{.}}
+ }
+ {
+ \pgfsetinnerstrokecolor{#1}
+ }
+ \tikz@addoption{
+ \pgfsetstrokecolor{knotbg}
+ }
+ \tl_set:Nn \tikz@double@setup{
+ \pgfsetinnerlinewidth{\pgflinewidth}
+ \pgfsetlinewidth{\dim_eval:n {\tl_use:N \l_@@_gap_tl \pgflinewidth}}
+ }
+ }
+ },
+ knot~ gap/.store~ in=\l_@@_gap_tl,
+ knot~ gap=3,
+ knot~ diagram/.is~family,
+ knot~ diagram/.unknown/.code={
+ \tl_set_eq:NN \l_@@_tmpa_tl \pgfkeyscurrentname
+ \pgfkeysalso{
+ /tikz/\l_@@_tmpa_tl=#1
+ }
+ },
+ background~ colour/.code={%
+ \colorlet{knotbg}{#1}%
+ },
+ background~ color/.code={%
+ \colorlet{knotbg}{#1}%
+ },
+ background~ colour=white,
+ knot~ diagram,
+ name/.store~ in=\l_@@_name_tl,
+ name={knot},
+ save~ intersections/.is~ choice,
+ save~ intersections/.default=true,
+ save~ intersections/true/.code={
+ \bool_set_true:N \l_@@_save_bool
+ },
+ save~ intersections/false/.code={
+ \bool_set_false:N \l_@@_save_bool
+ },
+ every~ strand/.style={draw},
+ ignore~ endpoint~ intersections/.code={
+ \tl_if_eq:nnTF {#1} {true}
+ {
+ \bool_set_true:N \l_@@_ignore_ends_bool
+ }
+ {
+ \bool_set_false:N \l_@@_ignore_ends_bool
+ }
+ },
+ ignore~ endpoint~ intersections/.default=true,
+ consider~ self~ intersections/.is~choice,
+ consider~ self~ intersections/true/.code={
+ \bool_set_true:N \l_@@_self_intersections_bool
+ \bool_set_true:N \l_@@_splits_bool
+ },
+ consider~ self~ intersections/false/.code={
+ \bool_set_false:N \l_@@_self_intersections_bool
+ \bool_set_false:N \l_@@_splits_bool
+ },
+ consider~ self~ intersections/no~ splits/.code={
+ \bool_set_true:N \l_@@_self_intersections_bool
+ \bool_set_false:N \l_@@_splits_bool
+ },
+ consider~ self~ intersections/.default={true},
+ clip~ radius/.code={
+ \dim_set:Nn \l_@@_clip_bg_radius_dim {#1}
+ \dim_set:Nn \l_@@_clip_draw_radius_dim {#1+2pt}
+ },
+ clip~ draw~ radius/.code={
+ \dim_set:Nn \l_@@_clip_draw_radius_dim {#1}
+ },
+ clip~ background~ radius/.code={
+ \dim_set:Nn \l_@@_clip_bg_radius_dim {#1}
+ },
+ clip~ radius=10pt,
+ end~ tolerance/.code={
+ \dim_set:Nn \l_@@_tolerance_dim {#1}
+ },
+ end~ tolerance=14pt,
+ clip/.style={
+ clip
+ },
+ background~ clip/.style={
+ clip
+ },
+ clip~ width/.code={
+ \tl_set:Nn \l_@@_clip_width_tl {#1}
+ },
+ clip~ width=3,
+ flip~ crossing/.code={%
+ \tl_clear_new:c {l_@@_crossing_#1}
+ \tl_set:cn {l_@@_crossing_#1} {x}
+ },
+ ignore~ crossing/.code={%
+ \tl_clear_new:c {l_@@_ignore_crossing_#1}
+ \tl_set:cn {l_@@_ignore_crossing_#1} {x}
+ },
+ draft~ mode/.is~ choice,
+ draft~ mode/off/.code={%
+ \bool_set_false:N \l_@@_draft_bool
+ \bool_set_false:N \l_@@_super_draft_bool
+ },
+ draft~ mode/crossings/.code={%
+ \bool_set_true:N \l_@@_draft_bool
+ \bool_set_false:N \l_@@_super_draft_bool
+ },
+ draft~ mode/strands/.code={%
+ \bool_set_true:N \l_@@_draft_bool
+ \bool_set_true:N \l_@@_super_draft_bool
+ },
+ draft/.is~ family,
+ draft,
+ crossing~ label/.style={
+ overlay,
+ fill=white,
+ fill~ opacity=.5,
+ text~ opacity=1,
+ text=blue,
+ pin~ edge={blue,<-}
+ },
+ strand~ label/.style={
+ overlay,
+ circle,
+ draw=purple,
+ fill=white,
+ fill~ opacity=.5,
+ text~ opacity=1,
+ text=purple,
+ inner~ sep=0pt
+ },
+}
+% \end{macrocode}
+%
+% Wrapper around \Verb+\tikzset+ for applying keys from a token list, checking for if the given token list exists.
+% \begin{macrocode}
+\cs_new_nopar:Npn \knot_apply_style:N #1
+{
+ \tl_if_exist:NT #1 {
+ \exp_args:NV \tikzset #1
+ }
+}
+\cs_generate_variant:Nn \knot_apply_style:N {c}
+% \end{macrocode}
+%
+%\begin{macro}[internal]{\flipcrossings}
+% The user can specify a comma separated list of crossings to flip.
+% \begin{macrocode}
+\NewDocumentCommand \flipcrossings {m}
+{
+ \tikzset{knot~ diagram/flip~ crossing/.list={#1}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\strand}
+% This is how the user specifies a strand of the knot.
+% \begin{macrocode}
+\NewDocumentCommand \strand { O{} }
+{
+ \int_incr:N \l_@@_strands_int
+ \tl_clear_new:c {l_@@_options_strand \int_use:N \l_@@_strands_int}
+ \tl_set:cn {l_@@_options_strand \int_use:N \l_@@_strands_int} {#1}
+ \path[#1,spath/set~ name=knot,spath/save=\int_use:N \l_@@_strands_int]
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{knot}
+% This is the wrapper environment that calls the knot generation code.
+% \begin{macrocode}
+\NewDocumentEnvironment{knot} { O{} }
+{
+ \knot_initialise:n {#1}
+}
+{
+ \knot_render:
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_initialise:n}
+% Set up some stuff before loading in the strands.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \knot_initialise:n #1
+{
+ \tikzset{knot~ diagram/.cd,every~ knot~ diagram/.try,#1}
+ \int_zero:N \l_@@_strands_int
+ \tl_clear:N \l_@@_redraws_tl
+ \seq_gclear:N \g_@@_nodes_seq
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_render:}
+% This is the code that starts the work of rendering the knot.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \knot_render:
+{
+% \end{macrocode}
+% Start a scope and reset the transformation (since all transformations have already been taken into account when defining the strands).
+% \begin{macrocode}
+ \pgfscope
+ \pgftransformreset
+% \end{macrocode}
+% Set the dimension for deciding when to include neighbouring strands
+% \begin{macrocode}
+ \dim_set:Nn \l_@@_redraw_tolerance_dim {\fp_to_dim:n
+ {
+ sqrt(2) * max(\l_@@_clip_bg_radius_dim, \l_@@_clip_draw_radius_dim)
+ }
+ }
+% \end{macrocode}
+% Loop through the strands drawing each one for the first time.
+% \begin{macrocode}
+ \int_step_function:nnnN {1} {1} {\l_@@_strands_int} \knot_draw_strand:n
+% \end{macrocode}
+% In super draft mode we don't do anything else.
+% \begin{macrocode}
+ \bool_if:NF \l_@@_super_draft_bool
+ {
+% \end{macrocode}
+% In draft mode we draw labels at the ends of the strands; this also handles splitting curves to avoid self-intersections of Bezier curves if that's requested.
+% \begin{macrocode}
+ \int_step_function:nnnN {1} {1} {\l_@@_strands_int} \knot_draw_labels:n
+% \end{macrocode}
+% If we're considering self intersections we need to split the strands into filaments.
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_self_intersections_bool
+ {
+ \knot_split_strands:
+ \int_set_eq:NN \l_@@_tmpa_int \g_@@_filaments_int
+ \tl_set:Nn \l_@@_prefix_tl {filament}
+ }
+ {
+ \int_set_eq:NN \l_@@_tmpa_int \l_@@_strands_int
+ \tl_set:Nn \l_@@_prefix_tl {strand}
+ }
+% \end{macrocode}
+% Initialise the intersection count.
+% \begin{macrocode}
+ \int_gzero:N \g_@@_intersections_int
+% \end{macrocode}
+% If in draft mode we label the intersections, otherwise we just stick a coordinate at each one.
+% \begin{macrocode}
+ \tl_clear:N \l_@@_node_tl
+ \bool_if:NT \l_@@_draft_bool
+ {
+ \tl_set:Nn \l_@@_node_tl {
+ \exp_not:N \node[coordinate,
+ pin={[
+ node~ contents={\int_use:N \g_@@_intersections_int},
+ knot~ diagram/draft/crossing~ label,
+ knot~ diagram/draft/crossing~
+ \int_use:N \g_@@_intersections_int \c_space_tl label/.try
+ ]
+ }]
+ }
+ }
+% \end{macrocode}
+% This double loop steps through the pieces (strands or filaments) and computes the intersections and does stuff with those.
+% \begin{macrocode}
+ \int_step_variable:nnnNn {1} {1} {\l_@@_tmpa_int - 1} \l_@@_tmpa_tl
+ {
+ \int_step_variable:nnnNn
+ {\tl_use:N \l_@@_tmpa_tl + 1}
+ {1}
+ {\l_@@_tmpa_int} \l_@@_tmpb_tl
+ {
+ \knot_intersections:VV \l_@@_tmpa_tl \l_@@_tmpb_tl
+ }
+ }
+% \end{macrocode}
+% If any redraws were requested, do them here.
+% \begin{macrocode}
+ \tl_use:N \l_@@_redraws_tl
+% \end{macrocode}
+% Draw the crossing nodes
+% \begin{macrocode}
+ \seq_use:Nn \g_@@_nodes_seq {}
+ }
+% \end{macrocode}
+% Close the scope
+% \begin{macrocode}
+ \endpgfscope
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_draw_strand:n}
+% This renders a strand using the options originally specified.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \knot_draw_strand:n #1
+{
+ \pgfscope
+ \group_begin:
+ \spath_bake_round:c {knot strand #1}
+ \tl_set:Nn \l_@@_tmpa_tl {knot~ diagram/every~ strand/.try,}
+ \tl_put_right:Nv \l_@@_tmpa_tl {l_@@_options_strand #1}
+ \tl_put_right:Nn \l_@@_tmpa_tl
+ {
+ ,
+ knot~ diagram/only~ when~ rendering/.try,
+ only~ when~ rendering/.try
+ }
+ \spath_tikz_path:Vv \l_@@_tmpa_tl {knot strand #1}
+ \group_end:
+ \endpgfscope
+}
+\cs_generate_variant:Nn \tl_put_right:Nn {Nv}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_draw_labels:n}
+% Draw a label at each end of each strand, if in draft mode.
+% Also, if requested, split potentially self intersecting Bezier curves.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \knot_draw_labels:n #1
+{
+ \bool_if:NT \l_@@_draft_bool
+ {
+ \spath_finalpoint:Nv \l_@@_tmpb_tl {knot strand #1}
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_item:Nn \l_@@_tmpb_tl {1}}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_item:Nn \l_@@_tmpb_tl {2}}
+ \node[
+ knot~ diagram/draft/strand~label
+ ] at (\l_@@_tmpa_dim,\l_@@_tmpb_dim) {#1};
+ \spath_initialpoint:Nv \l_@@_tmpb_tl {knot strand #1}
+ \dim_set:Nn \l_@@_tmpa_dim {\tl_item:Nn \l_@@_tmpb_tl {1}}
+ \dim_set:Nn \l_@@_tmpb_dim {\tl_item:Nn \l_@@_tmpb_tl {2}}
+ \node[
+ knot~ diagram/draft/strand~label
+ ] at (\l_@@_tmpa_dim,\l_@@_tmpb_dim) {#1};
+ }
+ \bool_if:nT {
+ \l_@@_self_intersections_bool
+ &&
+ \l_@@_splits_bool
+ }
+ {
+ \tl_clear:N \l_@@_tmpa_tl
+ \spath_initialpoint:Nv \l_@@_tmpa_tl {knot strand #1}
+ \tl_put_left:NV \l_@@_tmpa_tl \c_spath_moveto_tl
+ \spath_segments_to_seq:Nv \l_@@_segments_seq {knot strand #1}
+ \seq_map_function:NN \l_@@_segments_seq \knot_split_self_intersects:N
+ \tl_set_eq:cN {knot strand #1} \l_@@_tmpa_tl
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_split_self_intersects:N}
+% This is the macro that does the split.
+% Figuring out whether a Bezier cubic self intersects is apparently a difficult problem so we don't bother.
+% We compute a point such that if there is an intersection then it lies on either side of the point.
+% I don't recall where the formula came from!
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \knot_split_self_intersects:N #1
+{
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_item:nn {#1} {4}}
+ \tl_case:NnF \l_@@_tmpc_tl
+ {
+ \c_spath_curvetoa_tl
+ {
+ \fp_set:Nn \l_@@_tmpa_fp
+ {
+ (\tl_item:nn {#1} {3} - 3 * \tl_item:nn {#1} {6}
+ + 3 * \tl_item:nn {#1} {9} - \tl_item:nn {#1} {12})
+ *
+ (3 * \tl_item:nn {#1} {8} - 3 * \tl_item:nn {#1} {11})
+ -
+ (\tl_item:nn {#1} {2} - 3 * \tl_item:nn {#1} {5}
+ + 3 * \tl_item:nn {#1} {8} - \tl_item:nn {#1} {11})
+ *
+ (3 * \tl_item:nn {#1} {9} - 3 * \tl_item:nn {#1} {12})
+ }
+ \fp_set:Nn \l_@@_tmpb_fp
+ {
+ (\tl_item:nn {#1} {2} - 3 * \tl_item:nn {#1} {5}
+ + 3 * \tl_item:nn {#1} {8} - \tl_item:nn {#1} {11})
+ *
+ (3 * \tl_item:nn {#1} {6} - 6 * \tl_item:nn {#1} {9}
+ + 3 * \tl_item:nn {#1} {12})
+ -
+ (\tl_item:nn {#1} {3} - 3 * \tl_item:nn {#1} {6}
+ + 3 * \tl_item:nn {#1} {9} - \tl_item:nn {#1} {12})
+ *
+ (3 * \tl_item:nn {#1} {5} - 6 * \tl_item:nn {#1} {8}
+ + 3 * \tl_item:nn {#1} {11})
+ }
+ \fp_compare:nTF
+ {
+ \l_@@_tmpb_fp != 0
+ }
+ {
+ \fp_set:Nn \l_@@_tmpa_fp {.5 * \l_@@_tmpa_fp / \l_@@_tmpb_fp}
+ \fp_compare:nTF
+ {
+ 0 < \l_@@_tmpa_fp && \l_@@_tmpa_fp < 1
+ }
+ {
+ \spath_split_curve:NNnV
+ \l_@@_tmpc_tl
+ \l_@@_tmpd_tl
+ {#1}
+ \l_@@_tmpa_fp
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ \tl_set:Nx \l_@@_tmpd_tl {\tl_tail:N \l_@@_tmpd_tl}
+ \tl_set:Nx \l_@@_tmpd_tl {\tl_tail:N \l_@@_tmpd_tl}
+ \tl_set:Nx \l_@@_tmpd_tl {\tl_tail:N \l_@@_tmpd_tl}
+ \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpc_tl
+ \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpd_tl
+ }
+ {
+ \tl_set:Nn \l_@@_tmpc_tl {#1}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpc_tl
+ }
+ }
+ {
+ \tl_set:Nn \l_@@_tmpc_tl {#1}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpc_tl
+ }
+ }
+ \c_spath_lineto_tl
+ {
+ \tl_set:Nn \l_@@_tmpc_tl {#1}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl}
+ \tl_put_right:NV \l_@@_tmpa_tl \l_@@_tmpc_tl
+ }
+ }
+ {
+ \tl_put_right:Nn \l_@@_tmpa_tl {#1}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_intersections:nn}
+% This computes the intersections of two pieces and steps through them.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \knot_intersections:nn #1#2
+{
+ \group_begin:
+ \tl_set_eq:NN \l_@@_tmpa_tl \l_@@_prefix_tl
+ \tl_put_right:Nn \l_@@_tmpa_tl {#1}
+ \tl_set_eq:NN \l_@@_tmpb_tl \l_@@_prefix_tl
+ \tl_put_right:Nn \l_@@_tmpb_tl {#2}
+ \tl_set_eq:Nc \l_@@_tmpc_tl {knot \tl_use:N \l_@@_tmpa_tl}
+ \tl_set_eq:Nc \l_@@_tmpd_tl {knot \tl_use:N \l_@@_tmpb_tl}
+
+ \bool_if:nTF {
+ \l_@@_save_bool
+ &&
+ \tl_if_exist_p:c {
+ knot~ intersections~
+ \tl_use:N \l_@@_name_tl -
+ \tl_use:N \l_@@_tmpa_tl -
+ \tl_use:N \l_@@_tmpb_tl
+ }
+ }
+ {
+ \tl_use:c
+ {
+ knot~ intersections~ \tl_use:N \l_@@_name_tl -
+ \tl_use:N \l_@@_tmpa_tl -
+ \tl_use:N \l_@@_tmpb_tl
+ }
+ }
+ {
+ \pgfintersectionofpaths{\pgfsetpath\l_@@_tmpc_tl}{\pgfsetpath\l_@@_tmpd_tl}
+
+ }
+
+ \int_compare:nT {\pgfintersectionsolutions > 0}
+ {
+ \int_step_function:nnnN
+ {1}
+ {1}
+ {\pgfintersectionsolutions}
+ \knot_do_intersection:n
+ }
+
+ \knot_save_intersections:VV \l_@@_tmpa_tl \l_@@_tmpb_tl
+ \group_end:
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_save_intersections:nn}
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \knot_save_intersections:nn #1#2
+{
+ \bool_if:NT \l_@@_save_bool
+ {
+ \tl_clear:N \l_@@_aux_tl
+ \tl_put_right:Nn \l_@@_aux_tl
+ {
+ \def\pgfintersectionsolutions
+ }
+ \tl_put_right:Nx \l_@@_aux_tl
+ {
+ {\int_eval:n {\pgfintersectionsolutions}}
+ }
+ \int_compare:nT {\pgfintersectionsolutions > 0}
+ {
+ \int_step_inline:nnnn {1} {1} {\pgfintersectionsolutions}
+ {
+ \pgfpointintersectionsolution{##1}
+ \dim_set:Nn \l_@@_tmpa_dim {\pgf@x}
+ \dim_set:Nn \l_@@_tmpb_dim {\pgf@y}
+ \tl_put_right:Nn \l_@@_aux_tl
+ {
+ \expandafter\def\csname pgfpoint@intersect@solution@##1\endcsname
+ }
+ \tl_put_right:Nx \l_@@_aux_tl
+ {
+ {
+ \exp_not:N \pgf@x
+ =
+ \dim_use:N \l_@@_tmpa_dim
+ \exp_not:N \relax
+ \exp_not:N \pgf@y
+ =
+ \dim_use:N \l_@@_tmpb_dim
+ \exp_not:N \relax
+ }
+ }
+ }
+ \tl_set:Nn \l_@@_auxa_tl {\expandafter \gdef \csname knot~ intersections~}
+ \tl_put_right:Nx \l_@@_auxa_tl {\tl_use:N \l_@@_name_tl - #1 - #2}
+ \tl_put_right:Nn \l_@@_auxa_tl {\endcsname}
+ \tl_put_right:Nx \l_@@_auxa_tl {{\tl_to_str:N \l_@@_aux_tl}}
+ \protected@write\@auxout{}{\tl_to_str:N \l_@@_auxa_tl}
+ }
+ }
+}
+\cs_generate_variant:Nn \knot_save_intersections:nn {VV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_do_intersection:n}
+% This handles a specific intersection.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \knot_do_intersection:n #1
+{
+% \end{macrocode}
+% Get the intersection coordinates.
+% \begin{macrocode}
+ \pgfpointintersectionsolution{#1}
+ \dim_set:Nn \l_@@_tmpa_dim {\pgf@x}
+ \dim_set:Nn \l_@@_tmpb_dim {\pgf@y}
+% \end{macrocode}
+% If we're dealing with filaments, we can get false positives from the end points.
+% \begin{macrocode}
+ \bool_set_false:N \l_@@_skip_bool
+ \bool_if:NT \l_@@_self_intersections_bool
+ {
+% \end{macrocode}
+% If one filament preceded the other, test for the intersection being at the relevant end point.
+% \begin{macrocode}
+ \tl_set:Nn \l_@@_tmpc_tl {knot previous}
+ \tl_put_right:NV \l_@@_tmpc_tl \l_@@_tmpa_tl
+ \tl_set:Nv \l_@@_tmpc_tl \l_@@_tmpc_tl
+ \tl_if_eq:NNT \l_@@_tmpc_tl \l_@@_tmpb_tl
+ {
+ \knot_test_endpoint:NVnT \l_@@_tolerance_dim \l_@@_tmpb_tl {final point}
+ {
+ \bool_set_true:N \l_@@_skip_bool
+ }
+ }
+
+ \tl_set:Nn \l_@@_tmpc_tl {knot previous}
+ \tl_put_right:NV \l_@@_tmpc_tl \l_@@_tmpb_tl
+ \tl_set:Nv \l_@@_tmpc_tl \l_@@_tmpc_tl
+ \tl_if_eq:NNT \l_@@_tmpc_tl \l_@@_tmpa_tl
+ {
+ \knot_test_endpoint:NVnT \l_@@_tolerance_dim \l_@@_tmpa_tl {final point}
+ {
+ \bool_set_true:N \l_@@_skip_bool
+ }
+ }
+ }
+% \end{macrocode}
+% The user can also say that end points of filaments (or strands) should simply be ignored anyway.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_ignore_ends_bool
+ {
+ \knot_test_endpoint:NVnT \l_@@_tolerance_dim \l_@@_tmpa_tl {initial point}
+ {
+ \bool_set_true:N \l_@@_skip_bool
+ }
+ \knot_test_endpoint:NVnT \l_@@_tolerance_dim \l_@@_tmpa_tl {final point}
+ {
+ \bool_set_true:N \l_@@_skip_bool
+ }
+ \knot_test_endpoint:NVnT \l_@@_tolerance_dim \l_@@_tmpb_tl {initial point}
+ {
+ \bool_set_true:N \l_@@_skip_bool
+ }
+ \knot_test_endpoint:NVnT \l_@@_tolerance_dim \l_@@_tmpb_tl {final point}
+ {
+ \bool_set_true:N \l_@@_skip_bool
+ }
+ }
+% \end{macrocode}
+% Assuming that we passed all the above tests, we render the crossing.
+% \begin{macrocode}
+ \bool_if:NF \l_@@_skip_bool
+ {
+
+ \int_gincr:N \g_@@_intersections_int
+% \end{macrocode}
+% This is the intersection test.
+% If the intersection finder finds too many, it might be useful to ignore some.
+% \begin{macrocode}
+ \bool_if:nF
+ {
+ \tl_if_exist_p:c {l_@@_ignore_crossing_ \int_use:N
+ \g_@@_intersections_int}
+ &&
+ ! \tl_if_empty_p:c {l_@@_ignore_crossing_ \int_use:N
+ \g_@@_intersections_int}
+ }
+ {
+% \end{macrocode}
+% This is the flip test.
+% We only render one of the paths.
+% The ``flip'' swaps which one we render.
+% \begin{macrocode}
+ \bool_if:nTF
+ {
+ \tl_if_exist_p:c {l_@@_crossing_ \int_use:N
+ \g_@@_intersections_int}
+ &&
+ ! \tl_if_empty_p:c {l_@@_crossing_ \int_use:N
+ \g_@@_intersections_int}
+ }
+ {
+ \tl_set_eq:NN \l_@@_tmpg_tl \l_@@_tmpb_tl
+ }
+ {
+ \tl_set_eq:NN \l_@@_tmpg_tl \l_@@_tmpa_tl
+ }
+% \end{macrocode}
+% Now we know which one we're rendering, we test to see if we should also render its predecessor or successor to ensure that we render a path through the entire crossing region.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_self_intersections_bool
+ {
+ \knot_test_endpoint:NVnT
+ \l_@@_redraw_tolerance_dim \l_@@_tmpg_tl {initial point}
+ {
+ \bool_set_true:N \l_@@_prepend_prev_bool
+ }
+ {
+ \bool_set_false:N \l_@@_prepend_prev_bool
+ }
+ \knot_test_endpoint:NVnT
+ \l_@@_redraw_tolerance_dim \l_@@_tmpg_tl {final point}
+ {
+ \bool_set_true:N \l_@@_append_next_bool
+ }
+ {
+ \bool_set_false:N \l_@@_append_next_bool
+ }
+% \end{macrocode}
+% If either of those tests succeeded, do the appending or prepending.
+% \begin{macrocode}
+ \bool_if:nT
+ {
+ \l_@@_prepend_prev_bool || \l_@@_append_next_bool
+ }
+ {
+ \tl_clear_new:c {knot \tl_use:N \l_@@_prefix_tl -1}
+ \tl_set_eq:cc
+ {knot \tl_use:N \l_@@_prefix_tl -1}
+ {knot \tl_use:N \l_@@_tmpg_tl}
+
+ \tl_clear_new:c {l_@@_options_ \tl_use:N \l_@@_prefix_tl -1}
+ \tl_set_eq:cc
+ {l_@@_options_ \tl_use:N \l_@@_prefix_tl -1}
+ {l_@@_options_ \tl_use:N \l_@@_tmpg_tl}
+
+ \bool_if:nT
+ {
+ \l_@@_prepend_prev_bool
+ &&
+ \tl_if_exist_p:c {knot previous \tl_use:N \l_@@_tmpg_tl}
+ &&
+ !\tl_if_empty_p:c {knot previous \tl_use:N \l_@@_tmpg_tl}
+ }
+ {
+ \spath_prepend_no_move:cv
+ {knot \tl_use:N \l_@@_prefix_tl -1}
+ {knot \tl_use:c {knot previous \tl_use:N \l_@@_tmpg_tl}}
+% \end{macrocode}
+% If we split potentially self intersecting curves, we test to see if we should prepend yet another segment.
+% \begin{macrocode}
+ \bool_if:nT
+ {
+ \l_@@_splits_bool
+ &&
+ \tl_if_exist_p:c {knot previous \tl_use:N \l_@@_tmpg_tl}
+ &&
+ !\tl_if_empty_p:c {knot previous \tl_use:N \l_@@_tmpg_tl}
+ }
+ {
+ \knot_test_endpoint:NvnT
+ \l_@@_redraw_tolerance_dim
+ {knot previous \tl_use:N \l_@@_tmpg_tl}
+ {initial point}
+ {
+ \spath_prepend_no_move:cv
+ {knot \tl_use:N \l_@@_prefix_tl -1}
+ {knot \tl_use:c
+ {knot previous \tl_use:c
+ {knot previous \tl_use:N \l_@@_tmpg_tl}
+ }
+ }
+ \tl_set_eq:Nc \l_@@_tmpa_tl {knot \tl_use:N \l_@@_prefix_tl -1}
+ }
+ }
+ }
+% \end{macrocode}
+% Now the same for appending.
+% \begin{macrocode}
+ \bool_if:nT
+ {
+ \l_@@_append_next_bool
+ &&
+ \tl_if_exist_p:c {knot next \tl_use:N \l_@@_tmpg_tl}
+ &&
+ !\tl_if_empty_p:c {knot previous \tl_use:N \l_@@_tmpg_tl}
+ }
+ {
+ \spath_append_no_move:cv
+ {knot \tl_use:N \l_@@_prefix_tl -1}
+ {knot \tl_use:c {knot next \tl_use:N \l_@@_tmpg_tl}}
+ \bool_if:nT
+ {
+ \l_@@_splits_bool
+ &&
+ \tl_if_exist_p:c {knot previous \tl_use:N
+ \l_@@_tmpg_tl}
+ &&
+ !\tl_if_empty_p:c {knot previous \tl_use:N \l_@@_tmpg_tl}
+ }
+ {
+ \knot_test_endpoint:NvnT
+ \l_@@_redraw_tolerance_dim
+ {knot previous \tl_use:N \l_@@_tmpg_tl}
+ {final point}
+ {
+ \spath_append_no_move:cv
+ {knot \tl_use:N \l_@@_prefix_tl -1}
+ {knot \tl_use:c
+ {knot next \tl_use:c
+ {knot next \tl_use:N \l_@@_tmpg_tl}
+ }
+ }
+ }
+ }
+ }
+ \tl_set:Nn \l_@@_tmpg_tl {\tl_use:N \l_@@_prefix_tl -1}
+ }
+ }
+% \end{macrocode}
+% Now we render the crossing.
+% \begin{macrocode}
+ \pgfscope
+ \group_begin:
+ \tikzset{
+ knot~ diagram/every~ intersection/.try,
+ every~ intersection/.try,
+ knot~ diagram/intersection~ \int_use:N \g_@@_intersections_int/.try
+ }
+ \knot_draw_crossing:VVV \l_@@_tmpg_tl \l_@@_tmpa_dim \l_@@_tmpb_dim
+ \coordinate
+ (\l_@@_name_tl \c_space_tl \int_use:N \g_@@_intersections_int)
+ at (\dim_use:N \l_@@_tmpa_dim, \dim_use:N \l_@@_tmpb_dim);
+ \group_end:
+ \endpgfscope
+% \end{macrocode}
+% This ends the boolean as to whether to consider the intersection at all
+% \begin{macrocode}
+ }
+% \end{macrocode}
+% And possibly stick a coordinate with a label at the crossing.
+% \begin{macrocode}
+ \tl_if_empty:NF \l_@@_node_tl
+ {
+ \seq_gpush:Nx
+ \g_@@_nodes_seq
+ {
+ \l_@@_node_tl
+ at
+ (\dim_use:N \l_@@_tmpa_dim, \dim_use:N \l_@@_tmpb_dim) {};
+ }
+ }
+ }
+}
+
+\cs_generate_variant:Nn \knot_intersections:nn {VV}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_test_endpoint:N}
+% Test whether the point is near the intersection point.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \knot_test_endpoint:NN #1#2 {p,T,F,TF}
+{
+ \dim_compare:nTF
+ {
+ \dim_abs:n { \l_@@_tmpa_dim - \tl_item:Nn #2 {1}}
+ +
+ \dim_abs:n { \l_@@_tmpb_dim - \tl_item:Nn #2 {2}}
+ <
+ #1
+ }
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_test_endpoint:nn}
+% Wrapper around the above.
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \knot_test_endpoint:Nnn #1#2#3 {T,F,TF}
+{
+ \use:c {spath_#3:Nv} \l_@@_tmpd_tl {knot #2}
+ \knot_test_endpoint:NNTF #1 \l_@@_tmpd_tl
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
+ }
+}
+
+\cs_generate_variant:Nn \knot_test_endpoint:NnnT {NVnT,NvnT}
+\cs_generate_variant:Nn \knot_test_endpoint:NnnF {NVnF,NvnF}
+\cs_generate_variant:Nn \knot_test_endpoint:NnnTF {NVnTF,NvnTF}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_draw_crossing:nnn}
+% This is the code that actually renders a crossing.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \knot_draw_crossing:nnn #1#2#3
+{
+ \group_begin:
+ \pgfscope
+ \path[knot~ diagram/background~ clip] (#2, #3)
+ circle[radius=\l_@@_clip_bg_radius_dim];
+
+ \tl_set:Nn \l_@@_tmpa_tl {knot~ diagram/every~ strand/.try,}
+ \tl_if_exist:cT {l_@@_options_ #1}
+ {
+ \tl_put_right:Nv \l_@@_tmpa_tl {l_@@_options_ #1}
+ }
+ \tl_put_right:Nn \l_@@_tmpa_tl
+ {
+ ,knotbg
+ ,line~ width= \tl_use:N \l_@@_clip_width_tl * \pgflinewidth
+ }
+ \spath_tikz_path:Vv \l_@@_tmpa_tl {knot #1}
+
+ \endpgfscope
+
+ \pgfscope
+ \path[knot~ diagram/clip] (#2, #3)
+ circle[radius=\l_@@_clip_draw_radius_dim];
+
+ \tl_set:Nn \l_@@_tmpa_tl {knot~ diagram/every~ strand/.try,}
+ \tl_if_exist:cT {l_@@_options_ #1}
+ {
+ \tl_put_right:Nv \l_@@_tmpa_tl {l_@@_options_ #1}
+ }
+ \tl_put_right:Nn \l_@@_tmpa_tl
+ {
+ ,knot~ diagram/only~ when~ rendering/.try
+ ,only~ when~ rendering/.try
+ }
+ \spath_tikz_path:Vv \l_@@_tmpa_tl {knot #1}
+
+ \endpgfscope
+ \group_end:
+}
+
+\cs_generate_variant:Nn \knot_draw_crossing:nnn {nVV, VVV}
+
+\cs_new_protected_nopar:Npn \knot_draw_crossing:nn #1#2
+{
+ \tikz@scan@one@point\pgfutil@firstofone #2 \relax
+ \knot_draw_crossing:nVV {#1} \pgf@x \pgf@y
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_split_strands:}
+% This, and the following macros, are for splitting strands into filaments.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \knot_split_strands:
+{
+ \int_gzero:N \g_@@_filaments_int
+ \int_step_function:nnnN {1} {1} {\l_@@_strands_int} \knot_split_strand:n
+ \int_step_function:nnnN {1} {1} {\g_@@_filaments_int} \knot_compute_nexts:n
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_compute_nexts:n}
+% Each filament needs to know its predecessor and successor.
+% We work out the predecessors as we go along, this fills in the successors.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \knot_compute_nexts:n #1
+{
+ \tl_clear_new:c {knot next \tl_use:c {knot previous filament #1}}
+ \tl_set:cn {knot next \tl_use:c {knot previous filament #1}} {filament #1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_split_strand:n}
+% Sets up the split for a single strand.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \knot_split_strand:n #1
+{
+ \int_set_eq:NN \l_@@_component_start_int \g_@@_filaments_int
+ \int_incr:N \l_@@_component_start_int
+ \tl_set_eq:Nc \l_@@_tmpa_tl {l_@@_options_strand #1}
+ \spath_segments_to_seq:Nv \l_@@_segments_seq {knot strand #1}
+ \seq_map_function:NN \l_@@_segments_seq \knot_save_filament:N
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\knot_save_filament:N}
+% Saves a filament as a new \Verb+spath+ object.
+% \begin{macrocode}
+\cs_new_protected_nopar:Npn \knot_save_filament:N #1
+{
+ \tl_set:Nx \l_@@_tmpb_tl {\tl_item:nn {#1} {4}}
+ \tl_case:NnF \l_@@_tmpb_tl
+ {
+ \c_spath_moveto_tl
+ {
+ \int_compare:nT {\l_@@_component_start_int < \g_@@_filaments_int}
+ {
+ \int_set_eq:NN \l_@@_component_start_int \g_@@_filaments_int
+ }
+ }
+ \c_spath_lineto_tl
+ {
+ \int_gincr:N \g_@@_filaments_int
+ \tl_clear_new:c {knot filament \int_use:N \g_@@_filaments_int}
+ \tl_set:cn {knot filament \int_use:N \g_@@_filaments_int} {#1}
+
+ \tl_clear_new:c {l_@@_options_filament \int_use:N \g_@@_filaments_int}
+ \tl_set_eq:cN {l_@@_options_filament \int_use:N \g_@@_filaments_int}
+ \l_@@_tmpa_tl
+
+ \tl_clear_new:c {knot previous filament \int_use:N \g_@@_filaments_int}
+ \int_compare:nF {\l_@@_component_start_int == \g_@@_filaments_int}
+ {
+ \tl_set:cx {knot previous filament \int_use:N \g_@@_filaments_int}
+ {filament \int_eval:n {\g_@@_filaments_int - 1}}
+ }
+ }
+ \c_spath_curvetoa_tl
+ {
+ \int_gincr:N \g_@@_filaments_int
+ \tl_clear_new:c {knot filament \int_use:N \g_@@_filaments_int}
+ \tl_set:cn {knot filament \int_use:N \g_@@_filaments_int} {#1}
+ \tl_clear_new:c {l_@@_options_filament \int_use:N \g_@@_filaments_int}
+ \tl_set_eq:cN {l_@@_options_filament \int_use:N \g_@@_filaments_int}
+ \l_@@_tmpa_tl
+
+ \tl_clear_new:c {knot previous filament \int_use:N \g_@@_filaments_int}
+ \int_compare:nF {\l_@@_component_start_int == \g_@@_filaments_int}
+ {
+ \tl_set:cx
+ {knot previous filament \int_use:N \g_@@_filaments_int}
+ {filament \int_eval:n {\g_@@_filaments_int - 1}}
+ }
+ }
+ \c_spath_closepath_tl
+ {
+ \int_gincr:N \g_@@_filaments_int
+ \tl_clear_new:c {knot filament \int_use:N \g_@@_filaments_int}
+ \tl_clear:N \l_@@_tmpa_tl
+ \tl_put_right:Nx
+ {
+ \tl_item:nn {#1} {1}\tl_item:nn {#1} {2}\tl_item:nn {#1} {3}
+ }
+ \tl_put_right:NV \l_@@_tmpa_tl \c_spath_lineto_tl
+ \tl_put_right:Nx {\tl_item:nn {#1} {5}\tl_item:nn {#1} {6}}
+
+ \tl_set:cV {knot filament \int_use:N \g_@@_filaments_int} \l_@@_tmpa_tl
+ \tl_set_eq:cN {l_@@_options_filament \int_use:N \g_@@_filaments_int}
+ \l_@@_tmpa_tl
+ \tl_clear_new:c {knot previous filament \int_use:N \g_@@_filaments_int}
+ \int_compare:nF {\l_@@_component_start_int == \g_@@_filaments_int}
+ {
+ \tl_set:cx
+ {knot previous filament \int_use:N \g_@@_filaments_int}
+ {filament \int_eval:n {\g_@@_filaments_int - 1}}
+ }
+ \tl_set:cx
+ {knot previous filament \int_use:N \l_@@_component_start_int}
+ {filament \int_use:N \g_@@_filaments_int}
+ }
+ }
+ {
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{\redraw}
+% The user can redraw segments of the strands at specific locations.
+% \begin{macrocode}
+\NewDocumentCommand \redraw { m m }
+{
+% \tikz@scan@one@point\pgfutil@firstofone #2 \relax
+ \tl_put_right:Nn \l_@@_redraws_tl {\knot_draw_crossing:nn}
+ \tl_put_right:Nx \l_@@_redraws_tl {
+ {strand #1} {#2}% {\dim_use:N \pgf@x} {\dim_use:N \pgf@y}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+%<@@=>
+%
+% \begin{macro}[internal]{\pgf@sh@@knotanchor}
+% Add the extra anchors for the knot crossing nodes.
+% \begin{macrocode}
+\def\pgf@sh@@knotanchor#1#2{%
+ \anchor{#2 north west}{%
+ \csname pgf@anchor@knot #1@north west\endcsname%
+ \pgf@x=#2\pgf@x%
+ \pgf@y=#2\pgf@y%
+ }%
+ \anchor{#2 north east}{%
+ \csname pgf@anchor@knot #1@north east\endcsname%
+ \pgf@x=#2\pgf@x%
+ \pgf@y=#2\pgf@y%
+ }%
+ \anchor{#2 south west}{%
+ \csname pgf@anchor@knot #1@south west\endcsname%
+ \pgf@x=#2\pgf@x%
+ \pgf@y=#2\pgf@y%
+ }%
+ \anchor{#2 south east}{%
+ \csname pgf@anchor@knot #1@south east\endcsname%
+ \pgf@x=#2\pgf@x%
+ \pgf@y=#2\pgf@y%
+ }%
+ \anchor{#2 north}{%
+ \csname pgf@anchor@knot #1@north\endcsname%
+ \pgf@x=#2\pgf@x%
+ \pgf@y=#2\pgf@y%
+ }%
+ \anchor{#2 east}{%
+ \csname pgf@anchor@knot #1@east\endcsname%
+ \pgf@x=#2\pgf@x%
+ \pgf@y=#2\pgf@y%
+ }%
+ \anchor{#2 west}{%
+ \csname pgf@anchor@knot #1@west\endcsname%
+ \pgf@x=#2\pgf@x%
+ \pgf@y=#2\pgf@y%
+ }%
+ \anchor{#2 south}{%
+ \csname pgf@anchor@knot #1@south\endcsname%
+ \pgf@x=#2\pgf@x%
+ \pgf@y=#2\pgf@y%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{knot crossing}
+% \begin{macrocode}
+\pgfdeclareshape{knot crossing}
+{
+ \inheritsavedanchors[from=circle] % this is nearly a circle
+ \inheritanchorborder[from=circle]
+ \inheritanchor[from=circle]{north}
+ \inheritanchor[from=circle]{north west}
+ \inheritanchor[from=circle]{north east}
+ \inheritanchor[from=circle]{center}
+ \inheritanchor[from=circle]{west}
+ \inheritanchor[from=circle]{east}
+ \inheritanchor[from=circle]{mid}
+ \inheritanchor[from=circle]{mid west}
+ \inheritanchor[from=circle]{mid east}
+ \inheritanchor[from=circle]{base}
+ \inheritanchor[from=circle]{base west}
+ \inheritanchor[from=circle]{base east}
+ \inheritanchor[from=circle]{south}
+ \inheritanchor[from=circle]{south west}
+ \inheritanchor[from=circle]{south east}
+ \inheritanchorborder[from=circle]
+ \pgf@sh@@knotanchor{crossing}{2}
+ \pgf@sh@@knotanchor{crossing}{3}
+ \pgf@sh@@knotanchor{crossing}{4}
+ \pgf@sh@@knotanchor{crossing}{8}
+ \pgf@sh@@knotanchor{crossing}{16}
+ \pgf@sh@@knotanchor{crossing}{32}
+ \backgroundpath{
+ \pgfutil@tempdima=\radius%
+ \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
+ \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
+ \ifdim\pgf@xb<\pgf@yb%
+ \advance\pgfutil@tempdima by-\pgf@yb%
+ \else%
+ \advance\pgfutil@tempdima by-\pgf@xb%
+ \fi%
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{knot over cross}
+% \begin{macrocode}
+\pgfdeclareshape{knot over cross}
+{
+ \inheritsavedanchors[from=rectangle] % this is nearly a circle
+ \inheritanchorborder[from=rectangle]
+ \inheritanchor[from=rectangle]{north}
+ \inheritanchor[from=rectangle]{north west}
+ \inheritanchor[from=rectangle]{north east}
+ \inheritanchor[from=rectangle]{center}
+ \inheritanchor[from=rectangle]{west}
+ \inheritanchor[from=rectangle]{east}
+ \inheritanchor[from=rectangle]{mid}
+ \inheritanchor[from=rectangle]{mid west}
+ \inheritanchor[from=rectangle]{mid east}
+ \inheritanchor[from=rectangle]{base}
+ \inheritanchor[from=rectangle]{base west}
+ \inheritanchor[from=rectangle]{base east}
+ \inheritanchor[from=rectangle]{south}
+ \inheritanchor[from=rectangle]{south west}
+ \inheritanchor[from=rectangle]{south east}
+ \inheritanchorborder[from=rectangle]
+ \backgroundpath{
+ \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
+ }
+ \foregroundpath{
+% store lower right in xa/ya and upper right in xb/yb
+ \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{knot under cross}
+% \begin{macrocode}
+\pgfdeclareshape{knot under cross}
+{
+ \inheritsavedanchors[from=rectangle] % this is nearly a circle
+ \inheritanchorborder[from=rectangle]
+ \inheritanchor[from=rectangle]{north}
+ \inheritanchor[from=rectangle]{north west}
+ \inheritanchor[from=rectangle]{north east}
+ \inheritanchor[from=rectangle]{center}
+ \inheritanchor[from=rectangle]{west}
+ \inheritanchor[from=rectangle]{east}
+ \inheritanchor[from=rectangle]{mid}
+ \inheritanchor[from=rectangle]{mid west}
+ \inheritanchor[from=rectangle]{mid east}
+ \inheritanchor[from=rectangle]{base}
+ \inheritanchor[from=rectangle]{base west}
+ \inheritanchor[from=rectangle]{base east}
+ \inheritanchor[from=rectangle]{south}
+ \inheritanchor[from=rectangle]{south west}
+ \inheritanchor[from=rectangle]{south east}
+ \inheritanchorborder[from=rectangle]
+ \backgroundpath{
+ \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
+ }
+ \foregroundpath{
+% store lower right in xa/ya and upper right in xb/yb
+ \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{knot vert}
+% \begin{macrocode}
+\pgfdeclareshape{knot vert}
+{
+ \inheritsavedanchors[from=rectangle] % this is nearly a circle
+ \inheritanchorborder[from=rectangle]
+ \inheritanchor[from=rectangle]{north}
+ \inheritanchor[from=rectangle]{north west}
+ \inheritanchor[from=rectangle]{north east}
+ \inheritanchor[from=rectangle]{center}
+ \inheritanchor[from=rectangle]{west}
+ \inheritanchor[from=rectangle]{east}
+ \inheritanchor[from=rectangle]{mid}
+ \inheritanchor[from=rectangle]{mid west}
+ \inheritanchor[from=rectangle]{mid east}
+ \inheritanchor[from=rectangle]{base}
+ \inheritanchor[from=rectangle]{base west}
+ \inheritanchor[from=rectangle]{base east}
+ \inheritanchor[from=rectangle]{south}
+ \inheritanchor[from=rectangle]{south west}
+ \inheritanchor[from=rectangle]{south east}
+ \inheritanchorborder[from=rectangle]
+ \backgroundpath{
+% store lower right in xa/ya and upper right in xb/yb
+ \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
+ \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[internal]{knot horiz}
+% \begin{macrocode}
+\pgfdeclareshape{knot horiz}
+{
+ \inheritsavedanchors[from=rectangle] % this is nearly a circle
+ \inheritanchorborder[from=rectangle]
+ \inheritanchor[from=rectangle]{north}
+ \inheritanchor[from=rectangle]{north west}
+ \inheritanchor[from=rectangle]{north east}
+ \inheritanchor[from=rectangle]{center}
+ \inheritanchor[from=rectangle]{west}
+ \inheritanchor[from=rectangle]{east}
+ \inheritanchor[from=rectangle]{mid}
+ \inheritanchor[from=rectangle]{mid west}
+ \inheritanchor[from=rectangle]{mid east}
+ \inheritanchor[from=rectangle]{base}
+ \inheritanchor[from=rectangle]{base west}
+ \inheritanchor[from=rectangle]{base east}
+ \inheritanchor[from=rectangle]{south}
+ \inheritanchor[from=rectangle]{south west}
+ \inheritanchor[from=rectangle]{south east}
+ \inheritanchorborder[from=rectangle]
+ \foregroundpath{
+% store lower right in xa/ya and upper right in xb/yb
+ \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
+ \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
+ \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
+ \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \iffalse
+%</knots>
+% \fi
+%\Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/spath3/spath3.ins b/Master/texmf-dist/source/latex/spath3/spath3_code.ins
index b49c85b6e71..78ef5d1db8d 100644
--- a/Master/texmf-dist/source/latex/spath3/spath3.ins
+++ b/Master/texmf-dist/source/latex/spath3/spath3_code.ins
@@ -1,24 +1,24 @@
%%
-%% This is file `spath3.ins',
+%% This is file `spath3_code.ins',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
-%% spath3.dtx (with options: `install')
+%% spath3_code.dtx (with options: `install')
%% ----------------------------------------------------------------
%% spath3 --- Functions for manipulating PGF soft paths
-%% E-mail: stacey@math.ntnu.no
+%% E-mail: loopspace@mathforge.org
%% Released under the LaTeX Project Public License v1.3c or later
%% See http://www.latex-project.org/lppl.txt
%% ----------------------------------------------------------------
%%
-\input docstrip.tex
+\input l3docstrip.tex
\keepsilent
\askforoverwritefalse
\preamble
----------------------------------------------------------------
spath3 --- Functions for manipulating PGF soft paths
-E-mail: stacey@math.ntnu.no
+E-mail: loopspace@mathforge.org
Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
----------------------------------------------------------------
@@ -26,7 +26,7 @@ See http://www.latex-project.org/lppl.txt
\endpreamble
\postamble
-Copyright (C) 2011-2019 by Andrew Stacey <stacey@math.ntnu.no>
+Copyright (C) 2011-2021 by Andrew Stacey <loopspace@mathforge.org>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License (LPPL), either
@@ -38,22 +38,25 @@ http://www.latex-project.org/lppl.txt
This work is "maintained" (as per LPPL maintenance status) by
Andrew Stacey.
-This work consists of the files spath3.dtx
+This work consists of the files spath3_code.dtx
calligraphy_doc.tex
knots_doc.tex
+ spath3.tex
and the derived files spath3.ins,
spath3_code.pdf,
spath3.sty,
tikzlibrarycalligraphy.code.tex
tikzlibraryknots.code.tex
+ tikzlibraryspath3.code.tex
calligraphy.pdf
knots.pdf
+ spath3.pdf
README
\endpostamble
\usedir{tex/latex/spath3}
\generate{
- \file{\jobname.sty}{\from{\jobname.dtx}{spath3}}
+ \file{spath3.sty}{\from{\jobname.dtx}{spath3}}
}
\generate{
\file{tikzlibrarycalligraphy.code.tex}{\from{\jobname.dtx}{calligraphy}}
@@ -61,9 +64,12 @@ and the derived files spath3.ins,
\generate{
\file{tikzlibraryknots.code.tex}{\from{\jobname.dtx}{knots}}
}
+\generate{
+ \file{tikzlibraryspath3.code.tex}{\from{\jobname.dtx}{tikzspath3}}
+}
\endbatchfile
%%
-%% Copyright (C) 2011-2019 by Andrew Stacey <stacey@math.ntnu.no>
+%% Copyright (C) 2011-2021 by Andrew Stacey <loopspace@mathforge.org>
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License (LPPL), either
@@ -75,17 +81,20 @@ and the derived files spath3.ins,
%% This work is "maintained" (as per LPPL maintenance status) by
%% Andrew Stacey.
%%
-%% This work consists of the files spath3.dtx
+%% This work consists of the files spath3_code.dtx
%% calligraphy_doc.tex
%% knots_doc.tex
+%% spath3.tex
%% and the derived files spath3.ins,
%% spath3_code.pdf,
%% spath3.sty,
%% tikzlibrarycalligraphy.code.tex
%% tikzlibraryknots.code.tex
+%% tikzlibraryspath3.code.tex
%% calligraphy.pdf
%% knots.pdf
+%% spath3.pdf
%% README
%%
%%
-%% End of file `spath3.ins'.
+%% End of file `spath3_code.ins'.
diff --git a/Master/texmf-dist/source/latex/stix2/stix2.dtx b/Master/texmf-dist/source/latex/stix2/stix2.dtx
deleted file mode 100644
index df4a431ae87..00000000000
--- a/Master/texmf-dist/source/latex/stix2/stix2.dtx
+++ /dev/null
@@ -1,4255 +0,0 @@
-% \iffalse
-%<*driver>
-\begingroup
-\input docstrip
-\keepsilent
-\askforoverwritefalse
-
-\preamble
-
-Copyright (c) 2001-2018 by the STI Pub Companies, consisting of the
-American Chemical Society, the American Institute of Physics, the American
-Mathematical Society, the American Physical Society, Elsevier, Inc., and
-The Institute of Electrical and Electronic Engineers, Inc. Portions
-copyright (c) 1998-2003 by MicroPress, Inc. Portions copyright (c) 1990 by
-Elsevier, Inc. All rights reserved.
-
-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
- http://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 the STI Pub Companies.
-
-This work consists of the files stix2.dtx and and the derived file stix2.sty.
-
-\endpreamble
-
-\generate{\file{stix2.sty}{\from{stix2.dtx}{package}}}
-
-\endgroup
-\ProvidesFile{stix2.dtx}
-%</driver>
-%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-%<package>\ProvidesPackage{stix2}
-%<*package>
- [2018/04/02 v2.0.0-latex STIX Two fonts support package]
-%</package>
-%<package>\global\expandafter\let\csname ver@stix.sty\expandafter
-%<package> \endcsname\csname ver@\@currname.\@currext\endcsname
-%
-%<*driver>
-\documentclass{ltxdoc}
-\usepackage[lcgreekalpha]{stix2}[2018/04/02]
-
-\tracinglostchars=0
-
-\usepackage{fonttable}
-% fonttable's oct and hex numbers (ab)uses \' and \H which look ugly with our
-% fonts, use primes instead
-\makeatletter
-\renewcommand*{\f@toct}[1]{\hbox{\lower.5ex\hbox{$^{'}$}\kern-.1em\itshape #1\/\kern.05em}}
-\renewcommand*{\f@thex}[1]{\hbox{\lower.5ex\hbox{$^{''}$}\ttfamily#1}}
-\newcommand{\hex}[1]{\f@thex{#1}}
-\makeatother
-
-\usepackage{geometry}
-\usepackage{accents}
-\usepackage{enumitem}
-\usepackage[
- justification=raggedright,
- font=normalsize,
- singlelinecheck=false
-]{caption}
-\usepackage[
- bookmarks=true,
- colorlinks=true,
- linkcolor=black,
- urlcolor=black,
- pdftitle={The stix2 package},
- pdfauthor={STI Pub Companies},
- pdfsubject={STIX Two fonts LaTeX support package},
- pdfkeywords={STIX, Math, STI Pub}
-]{hyperref}
-\usepackage{metalogo}
-
-\newcommand\pkg[1]{\textsf{#1}}
-\renewcommand\cmd[1]{\texttt{\string#1}}
-\newcommand\showsymbol[3]{\par\noindent\hangindent=3em%
-\makebox[2em][l]{$#1$} \makebox[3.5em][l]{\cmd{U+#2}} \cmd{#1}$^{#3}$}
-\newcommand\showop[3]{\par\noindent\hangindent=6em%
- \makebox[5em][l]{$#1$\hfill$\displaystyle#1$\hfill}\makebox[3.5em][l]{\small\cmd{U+#2}} \cmd{#1}$^{#3}$}
-\newcommand\showdelimiter[3]{\par\noindent\hangindent=6em%
- \makebox[5em][l]{${#1}{\bigm#1}{\Bigm#1}{\biggm#1}{\Biggm#1}$}\makebox[3.5em][l]{\small\cmd{U+#2}} \cmd{#1}$^{#3}$}
-\newcommand\showbrace[5]{\par\noindent\hangindent=6em%
- \makebox[10em][l]{$\Biggl#1\biggl#1\Bigl#1\bigl#1#1\ #3\bigr#3\Bigr#3\biggr#3\Biggr#3$}%
- \makebox[7em][l]{\small\cmd{U+#2}, \small\cmd{U+#4}}%
- \cmd{#1}$^{#5}$, \cmd{#3}$^{#5}$}
-\newcommand\showwideaccent[3]{\par\noindent\hangindent=4em%
- \makebox[3em][l]{$#1{xxx}$}\makebox[3.5em][l]{\small\cmd{U+#2}} \cmd{#1}$^{#3}$}
-\newcommand\showaccent[3]{\par\noindent\hangindent=4em%
- \makebox[3em][l]{$#1b$}\makebox[3.5em][l]{\small\cmd{U+#2}} \cmd{#1}$^{#3}$}
-\newcommand\showover[3]{\par\noindent\hangindent=6em%
- \makebox[5em][l]{$#1{xxxxxx}$}\makebox[3.5em][l]{\small\cmd{U+#2}} \cmd{#1}$^{#3}$}
-
-\begin{document}
- \DocInput{stix2.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
-%
-%
-% \GetFileInfo{stix2.dtx}
-%
-% \title{The \pkg{stix2} package}
-% \author{STI Pub Companies\thanks{This package was developed by
-% Khaled Hosny on behalf of the STI Pub companies, who gratefully
-% acknowledge his efforts.}}
-% \date{\fileversion~from \filedate}
-%
-% \maketitle
-% \tableofcontents
-%
-% \section{Introduction}
-%
-% The STIX fonts are a set of OpenType fonts designed for use with
-% typesetting engines such as \XeTeX\ or \LuaTeX\ that directly support
-% Unicode and modern font technologies. When used with one of these
-% engines, no extra support is needed beyond the \pkg{unicode-math}
-% package. This is the recommended way of using the STIX fonts with
-% \TeX.
-%
-% The \pkg{stix2} package provides support for versions of \TeX\ that
-% are limited to TFM files, Type~1 PostScript fonts, and 8-bit font
-% encodings. Version 2.0.0 of the STIX fonts are being released in
-% this format in hopes of easing the transition from legacy
-% \TeX\ engines to modern fully Unicode-compatible systems. The
-% Type~1 versions are merely a repackaging of the original OpenType
-% versions and should not be viewed as independent entities. Some
-% glyphs that are traditionally available in \TeX\ math fonts are not
-% yet available in the STIX Two OpenType fonts. In such cases, we
-% have chosen to omit them from the stix2 package rather than create
-% incompatibilities between the OpenType and Type~1 versions. In
-% addition, while development of the OpenType versions is ongoing, no
-% further updates are planned to the Type~1 versions of the fonts.
-%
-% The \pkg{stix2} package provides support for text fonts in the
-% following \LaTeX\ encodings:
-% \begin{itemize}[noitemsep]
-% \item T1 (the default encoding): The extended Latin ``Cork'' encoding
-% \item OT1: Knuth's original Computer Modern Roman encoding
-% \item OT2: Cyrillic
-% \item TS1: \LaTeX\ symbol encoding
-% \end{itemize}
-% Please note that the Type~1 versions of these fonts only expose a
-% small subset of the text glyphs available in the full OpenType
-% versions, which contain extensive coverage of the following Unicode
-% blocks:
-% \begin{itemize}[noitemsep]
-% \item Latin Extended A
-% \item IPA Extensions
-% \item Latin Extended Additional
-% \end{itemize}
-% as well as partial coverage of several other blocks.
-%
-% The math support covers nearly every mathematical symbol in the
-% STIX Two fonts. Section~\ref{math-alphabets} lists math alphabets
-% supported by the \pkg{stix2} package, while section~\ref{math-symbols}
-% lists all defined math symbols. There are also three fonts containing
-% extra miscellaneous symbols, |stix2-extra1|, |stix2-extra2| and
-% |stix2-extra3|, provided as TFM and PFB files without support from the
-% macro package.
-%
-% \section{Background}
-%
-% The \emph{Scientific and Technical Information eXchange} (STIX) fonts
-% are intended to satisfy the demanding needs of authors, publishers,
-% printers, and others working in the scientific, medical, and technical
-% fields. They combine a comprehensive Unicode-based collection of
-% mathematical symbols and alphabets with a set of text faces suitable
-% for professional publishing. The fonts are available royalty-free
-% under the SIL Open Font License.
-%
-% Version 2.0.0 of the STIX fonts, now known as ``STIX Two'', is a
-% thorough revision undertaken by the renowned type house Tiro
-% Typeworks. The STIX Two fonts consist of four text fonts (Regular,
-% Italic, Bold, and Bold Italic) and one Math font. Together, they
-% provide a uniform set of fonts that can be used throughout the
-% production process, whether that be a traditional print-only process,
-% an entirely electronic one, or a combination of the two.
-%
-% The STIX project began through the joint efforts of American
-% Mathematical Society (AMS), American Institute of Physics (AIP),
-% American Physical Society (APS), American Chemical Society (ACS),
-% Institute of Electrical and Electronic Engineers (IEEE), and Elsevier.
-% These companies are collectively known as the STI Pub companies.
-%
-% \section{Usage}
-%
-% Using STIX Two fonts with \LaTeX\ is as simple as loading the \pkg{stix2} package:
-% \begin{verbatim}
-% \documentclass{article}
-% \usepackage{stix2}
-% \begin{document}
-% Some text, and a math formula \(a+b=\sqrt{c}\).
-% \end{document}
-% \end{verbatim}
-%
-% \subsection{Options}
-% \begin{description}[font=\ttfamily,style=nextline,leftmargin=2.5cm,noitemsep]
-% \item[notext] Do not change the default text fonts.
-% \item[nomath] Do not change the default math fonts.
-% \item[not1] Do not change the default font encoding to |T1|.
-% \item[notextcomp] Do not load the \pkg{textcomp} package (provides symbols
-% and oldstyle figures from |TS1| encoding to be used with |T1| encoded text
-% fonts).
-% \item[lcgreekalpha] By default lower case Greek, partial differential and
-% nabla are given |\mathord| class which makes them insensitive to math
-% alphabet changes (i.e. |$\mathbf{\beta}$| gives $\beta$ instead of
-% $\mathbf{\beta}$); with this option they will be given |\mathalpha| class
-% just like Latin and upper case Greek.
-% \item[upint] Use upright integrals by default ($\intup$ instead of
-% $\intsl$). See Section~\ref{integrals} on page~\pageref{integrals} for
-% more details.
-% \end{description}
-%
-% \subsection{Compatibility with other packages}
-% \subsubsection*{\pkg{amsmath}}
-% The \pkg{stix2} package should be used with at least \pkg{amsmath} v2.14,
-% \pkg{amssymb} v3.01 and \pkg{amsfonts} v3.01.
-%
-% With \pkg{amsmath} v2.14 or newer, it is recommended to load it (and/or
-% packages that load it) \emph{after} the \pkg{stix2} package. Older versions of
-% \pkg{amsmath} must be loaded \emph{before} the \pkg{stix2} package, otherwise
-% errors will arise.
-%
-% The following \pkg{amsmath} options affect not only symbols known to
-% \pkg{amsmath}, but also new symbols defined by the \pkg{stix2} package:
-% |sumlimits|, |nosumlimits|, |intlimits| and |nointlimits|.
-%
-% \subsection{Feedback}
-% Bug reports and technical support issues should be reported to
-% \url{https://github.com/stipub/stixfonts}.
-%
-% \section{Math alphabets}
-% \label{math-alphabets}
-% The following table lists math alphabets defined by the \pkg{stix2} package with the
-% Unicode ranges they cover:
-%
-% \begin{table}[h]
-% \setlength{\tabcolsep}{3.5pt}
-% \begin{tabular}{ c l c c c c c }
-% & & A--Z & a--z & $\Gamma$--$\Omega$ & $\mathrm{\alpha}$--$\mathrm{\omega}$ & 0--9 \\
-% \hline
-% $*$ & |\mathrm| & |00041|--|0005A| & |00061|--|0007A| & |00393|--|003A9| & |003B1|--|003C9| & |00030|--|00039| \\
-% $*$ & |\mathbf| & |1D400|--|1D419| & |1D41A|--|1D433| & |1D6AA|--|1D6C0| & |1D6C2|--|1D6DA| & |1D7CE|--|1D7D7| \\
-% $*$ & |\mathit| & |1D434|--|1D44D| & |1D44E|--|1D467| & |1D6E4|--|1D6FA| & |1D6FC|--|1D714| & - \\
-% & |\mathbfit| & |1D468|--|1D481| & |1D482|--|1D49B| & |1D71E|--|1D734| & |1D736|--|1D74E| & - \\
-% $*$ & |\mathcal| & \textbullet & - & - & - & - \\
-% $*$ & |\mathscr| & |1D49C|--|1D4B5| & |1D4B6|--|1D4CF| & - & - & - \\
-% & |\mathbfscr| & |1D4D0|--|1D4E9| & |1D4EA|--|1D503| & - & - & - \\
-% $*$ & |\mathsf| & |1D5A0|--|1D5B9| & |1D5BA|--|1D5D3| & - & - & |1D7E2|--|1D7EB| \\
-% & |\mathbfsf| & |1D5D4|--|1D5ED| & |1D5EE|--|1D607| & |1D758|--|1D76E| & |1D770|--|1D788| & |1D7EC|--|1D7F5| \\
-% $*$ & |\mathsfit| & |1D608|--|1D621| & |1D622|--|1D63B| & - & - & - \\
-% & |\mathbfsfit| & |1D63C|--|1D655| & |1D656|--|1D66F| & |1D792|--|1D7A8| & |1D7AA|--|1D7C2| & - \\
-% $*$ & |\mathbb| & |1D538|--|1D551| & |1D552|--|1D56B| & - & - & |1D7D8|--|1D7E1| \\
-% $*$ & |\mathfrak| & |1D504|--|1D51D| & |1D51E|--|1D537| & - & - & - \\
-% & |\mathbffrak| & |1D56C|--|1D585| & |1D586|--|1D59F| & - & - & - \\
-% $*$ & |\mathtt| & |1D670|--|1D689| & |1D68A|--|1D6A3| & - & - & |1D7F6|--|1D7FF| \\
-% \hline
-% \end{tabular}
-% \caption*{
-% \begin{tabular}{ c l }
-% \textbullet & Covered by STIX Two fonts but not in Unicode.\\
-% - & Not covered.\\
-% $*$ & Available by default when loading the \pkg{stix2} package.\\
-% \end{tabular}
-% }
-% \end{table}
-%
-%
-% \TeX\ allows only 16 math alphabets to be used simultaneously, so not all of
-% these alphabets can be used in one document. When the \pkg{stix2} package is
-% loaded, 12 math groups are allocated, with the 11 math alphabets
-% that are marked above available by default, which leaves room for 4 other math groups to be
-% allocated on demand when any of the other alphabets is used.
-%
-% \section{Math symbols}
-% \label{math-symbols}
-%
-% The following section lists all math symbols defined by the \pkg{stix2} package.
-% Symbols with $^*$ next to their name do not have a bold version; when
-% |\boldmath| is active, the non-bold glyph will be used.
-%
-% \subsection{Alphabetics}
-% \begin{multicols}{2}
-% \showsymbol\Gamma{0393}{}
-% \showsymbol\Delta{0394}{}
-% \showsymbol\Theta{0398}{}
-% \showsymbol\Lambda{039B}{}
-% \showsymbol\Xi{039E}{}
-% \showsymbol\Pi{03A0}{}
-% \showsymbol\Sigma{03A3}{}
-% \showsymbol\Upsilon{03A5}{}
-% \showsymbol\Phi{03A6}{}
-% \showsymbol\Psi{03A8}{}
-% \showsymbol\Omega{03A9}{}
-% \showsymbol\alpha{03B1}{}
-% \showsymbol\beta{03B2}{}
-% \showsymbol\gamma{03B3}{}
-% \showsymbol\delta{03B4}{}
-% \showsymbol\epsilon{03B5}{}
-% \showsymbol\zeta{03B6}{}
-% \showsymbol\eta{03B7}{}
-% \showsymbol\theta{03B8}{}
-% \showsymbol\iota{03B9}{}
-% \showsymbol\kappa{03BA}{}
-% \showsymbol\lambda{03BB}{}
-% \showsymbol\mu{03BC}{}
-% \showsymbol\nu{03BD}{}
-% \showsymbol\xi{03BE}{}
-% \showsymbol\pi{03C0}{}
-% \showsymbol\rho{03C1}{}
-% \showsymbol\sigma{03C3}{}
-% \showsymbol\tau{03C4}{}
-% \showsymbol\upsilon{03C5}{}
-% \showsymbol\phi{03D5}{}
-% \showsymbol\chi{03C7}{}
-% \showsymbol\psi{03C8}{}
-% \showsymbol\omega{03C9}{}
-% \showsymbol\varepsilon{03F5}{}
-% \showsymbol\vartheta{03D1}{}
-% \showsymbol\varpi{03D6}{}
-% \showsymbol\varrho{03F1}{}
-% \showsymbol\varsigma{03C2}{}
-% \showsymbol\varphi{03C6}{}
-% \showsymbol\nabla{2207}{}
-% \showsymbol\partial{2202}{}
-% \showsymbol\imath{1D6A4}{}
-% \showsymbol\jmath{1D6A5}{}
-% \end{multicols}
-%
-% \subsection{Ordinary symbols}
-% \begin{multicols}{2}
-% \showsymbol\#{0023}{}
-% \showsymbol\mathdollar{0024}{}
-% \showsymbol\%{0025}{}
-% \showsymbol\&{0026}{}
-% \showsymbol.{002E}{}
-% \showsymbol/{002F}{}
-% \showsymbol?{003F}{}
-% \showsymbol@{0040}{}
-% \showsymbol\backslash{005C}{}
-% \showsymbol\mathsterling{00A3}{}
-% \showsymbol\mathsection{00A7}{}
-% \showsymbol\neg{00AC}{}, \cmd\lnot
-% \showsymbol\mathparagraph{00B6}{}
-% \showsymbol\eth{00F0}{}
-% \showsymbol\Zbar{01B5}{*}
-% \showsymbol\digamma{03DD}{}
-% \showsymbol\varkappa{03F0}{}
-% \showsymbol\backepsilon{03F6}{}
-% \showsymbol\upbackepsilon{03F6}{}
-% \showsymbol\enleadertwodots{2025}{}
-% \showsymbol\mathellipsis{2026}{}
-% \showsymbol\prime{2032}{}
-% \showsymbol\dprime{2033}{}
-% \showsymbol\trprime{2034}{}
-% \showsymbol\backprime{2035}{}
-% \showsymbol\backdprime{2036}{}
-% \showsymbol\backtrprime{2037}{}
-% \showsymbol\caretinsert{2038}{}
-% \showsymbol\Exclam{203C}{}
-% \showsymbol\hyphenbullet{2043}{*}
-% \showsymbol\Question{2047}{}
-% \showsymbol\qprime{2057}{}
-% \showsymbol\enclosecircle{20DD}{}
-% \showsymbol\enclosesquare{20DE}{*}
-% \showsymbol\enclosediamond{20DF}{*}
-% \showsymbol\enclosetriangle{20E4}{}
-% \showsymbol\Eulerconst{2107}{}
-% \showsymbol\hbar{210F}{*}
-% \showsymbol\hslash{210F}{}
-% \showsymbol\Im{2111}{}
-% \showsymbol\ell{2113}{}
-% \showsymbol\wp{2118}{}
-% \showsymbol\Re{211C}{}
-% \showsymbol\mho{2127}{}
-% \showsymbol\turnediota{2129}{}
-% \showsymbol\Angstrom{212B}{}
-% \showsymbol\Finv{2132}{}
-% \showsymbol\aleph{2135}{}
-% \showsymbol\beth{2136}{}
-% \showsymbol\gimel{2137}{}
-% \showsymbol\daleth{2138}{}
-% \showsymbol\Game{2141}{*}
-% \showsymbol\sansLturned{2142}{*}
-% \showsymbol\sansLmirrored{2143}{*}
-% \showsymbol\Yup{2144}{*}
-% \showsymbol\PropertyLine{214A}{*}
-% \showsymbol\updownarrowbar{21A8}{}
-% \showsymbol\linefeed{21B4}{}
-% \showsymbol\carriagereturn{21B5}{}
-% \showsymbol\barovernorthwestarrow{21B8}{}
-% \showsymbol\barleftarrowrightarrowbar{21B9}{}
-% \showsymbol\acwopencirclearrow{21BA}{}
-% \showsymbol\cwopencirclearrow{21BB}{}
-% \showsymbol\nHuparrow{21DE}{*}
-% \showsymbol\nHdownarrow{21DF}{*}
-% \showsymbol\leftdasharrow{21E0}{*}
-% \showsymbol\updasharrow{21E1}{*}
-% \showsymbol\rightdasharrow{21E2}{*}
-% \showsymbol\downdasharrow{21E3}{*}
-% \showsymbol\leftwhitearrow{21E6}{}
-% \showsymbol\upwhitearrow{21E7}{}
-% \showsymbol\rightwhitearrow{21E8}{}
-% \showsymbol\downwhitearrow{21E9}{}
-% \showsymbol\whitearrowupfrombar{21EA}{}
-% \showsymbol\forall{2200}{}
-% \showsymbol\complement{2201}{}
-% \showsymbol\exists{2203}{}
-% \showsymbol\nexists{2204}{}
-% \showsymbol\varnothing{2205}{}
-% \showsymbol\emptyset{2205}{}
-% \showsymbol\increment{2206}{}
-% \showsymbol\QED{220E}{*}
-% \showsymbol\infty{221E}{}
-% \showsymbol\rightangle{221F}{}
-% \showsymbol\angle{2220}{}
-% \showsymbol\measuredangle{2221}{}
-% \showsymbol\sphericalangle{2222}{}
-% \showsymbol\therefore{2234}{}
-% \showsymbol\because{2235}{}
-% \showsymbol\sinewave{223F}{}
-% \showsymbol\top{22A4}{}
-% \showsymbol\bot{22A5}{}
-% \showsymbol\hermitmatrix{22B9}{}
-% \showsymbol\measuredrightangle{22BE}{}
-% \showsymbol\varlrtriangle{22BF}{}
-% \showsymbol\cdots{22EF}{}
-% \showsymbol\diameter{2300}{*}
-% \showsymbol\house{2302}{}
-% \showsymbol\invnot{2310}{}
-% \showsymbol\sqlozenge{2311}{*}
-% \showsymbol\profline{2312}{*}
-% \showsymbol\profsurf{2313}{*}
-% \showsymbol\viewdata{2317}{*}
-% \showsymbol\turnednot{2319}{}
-% \showsymbol\varhexagonlrbonds{232C}{*}
-% \showsymbol\conictaper{2332}{*}
-% \showsymbol\topbot{2336}{}
-% \showsymbol\APLnotbackslash{2340}{*}
-% \showsymbol\APLboxupcaret{2353}{*}
-% \showsymbol\APLboxquestion{2370}{*}
-% \showsymbol\rangledownzigzagarrow{237C}{*}
-% \showsymbol\hexagon{2394}{*}
-% \showsymbol\bbrktbrk{23B6}{}
-% \showsymbol\varcarriagereturn{23CE}{*}
-% \showsymbol\obrbrak{23E0}{}
-% \showsymbol\ubrbrak{23E1}{}
-% \showsymbol\trapezium{23E2}{*}
-% \showsymbol\benzenr{23E3}{*}
-% \showsymbol\strns{23E4}{*}
-% \showsymbol\fltns{23E5}{*}
-% \showsymbol\accurrent{23E6}{*}
-% \showsymbol\elinters{23E7}{*}
-% \showsymbol\mathvisiblespace{2423}{}
-% \showsymbol\circledR{24C7}{}
-% \showsymbol\circledS{24C8}{}
-% \showsymbol\mdlgblksquare{25A0}{*}, \cmd\blacksquare
-% \showsymbol\mdlgwhtsquare{25A1}{*}, \cmd\square, \cmd\Box
-% \showsymbol\squoval{25A2}{*}
-% \showsymbol\blackinwhitesquare{25A3}{*}
-% \showsymbol\squarehfill{25A4}{*}
-% \showsymbol\squarevfill{25A5}{*}
-% \showsymbol\squarehvfill{25A6}{*}
-% \showsymbol\squarenwsefill{25A7}{*}
-% \showsymbol\squareneswfill{25A8}{*}
-% \showsymbol\squarecrossfill{25A9}{*}
-% \showsymbol\smblksquare{25AA}{*}
-% \showsymbol\smwhtsquare{25AB}{*}
-% \showsymbol\hrectangleblack{25AC}{*}
-% \showsymbol\hrectangle{25AD}{*}
-% \showsymbol\vrectangleblack{25AE}{*}
-% \showsymbol\vrectangle{25AF}{*}
-% \showsymbol\parallelogramblack{25B0}{*}
-% \showsymbol\parallelogram{25B1}{*}
-% \showsymbol\bigblacktriangleup{25B2}{*}
-% \showsymbol\blacktriangle{25B4}{*}
-% \showsymbol\blacktriangleright{25B6}{*}
-% \showsymbol\smallblacktriangleright{25B8}{*}
-% \showsymbol\smalltriangleright{25B9}{*}
-% \showsymbol\blackpointerright{25BA}{*}
-% \showsymbol\whitepointerright{25BB}{*}
-% \showsymbol\bigblacktriangledown{25BC}{*}
-% \showsymbol\bigtriangledown{25BD}{}
-% \showsymbol\blacktriangledown{25BE}{*}
-% \showsymbol\triangledown{25BF}{*}
-% \showsymbol\blacktriangleleft{25C0}{*}
-% \showsymbol\smallblacktriangleleft{25C2}{*}
-% \showsymbol\smalltriangleleft{25C3}{*}
-% \showsymbol\blackpointerleft{25C4}{*}
-% \showsymbol\whitepointerleft{25C5}{*}
-% \showsymbol\mdlgblkdiamond{25C6}{*}
-% \showsymbol\mdlgwhtdiamond{25C7}{*}
-% \showsymbol\blackinwhitediamond{25C8}{*}
-% \showsymbol\fisheye{25C9}{*}
-% \showsymbol\mdlgwhtlozenge{25CA}{}, \cmd\lozenge, \\ \cmd\Diamond
-% \showsymbol\dottedcircle{25CC}{*}
-% \showsymbol\circlevertfill{25CD}{*}
-% \showsymbol\bullseye{25CE}{*}
-% \showsymbol\mdlgblkcircle{25CF}{*}
-% \showsymbol\circlelefthalfblack{25D0}{*}
-% \showsymbol\circlerighthalfblack{25D1}{*}
-% \showsymbol\circlebottomhalfblack{25D2}{*}
-% \showsymbol\circletophalfblack{25D3}{*}
-% \showsymbol\circleurquadblack{25D4}{*}
-% \showsymbol\blackcircleulquadwhite{25D5}{*}
-% \showsymbol\blacklefthalfcircle{25D6}{*}
-% \showsymbol\blackrighthalfcircle{25D7}{*}
-% \showsymbol\inversebullet{25D8}{*}
-% \showsymbol\inversewhitecircle{25D9}{*}
-% \showsymbol\invwhiteupperhalfcircle{25DA}{*}
-% \showsymbol\invwhitelowerhalfcircle{25DB}{*}
-% \showsymbol\ularc{25DC}{*}
-% \showsymbol\urarc{25DD}{*}
-% \showsymbol\lrarc{25DE}{*}
-% \showsymbol\llarc{25DF}{*}
-% \showsymbol\topsemicircle{25E0}{*}
-% \showsymbol\botsemicircle{25E1}{*}
-% \showsymbol\lrblacktriangle{25E2}{*}
-% \showsymbol\llblacktriangle{25E3}{*}
-% \showsymbol\ulblacktriangle{25E4}{*}
-% \showsymbol\urblacktriangle{25E5}{*}
-% \showsymbol\circ{25E6}{}, \cmd\smwhtcircle
-% \showsymbol\squareleftblack{25E7}{*}
-% \showsymbol\squarerightblack{25E8}{*}
-% \showsymbol\squareulblack{25E9}{*}
-% \showsymbol\squarelrblack{25EA}{*}
-% \showsymbol\trianglecdot{25EC}{}
-% \showsymbol\triangleleftblack{25ED}{*}
-% \showsymbol\trianglerightblack{25EE}{*}
-% \showsymbol\lgwhtcircle{25EF}{*}
-% \showsymbol\squareulquad{25F0}{*}
-% \showsymbol\squarellquad{25F1}{*}
-% \showsymbol\squarelrquad{25F2}{*}
-% \showsymbol\squareurquad{25F3}{*}
-% \showsymbol\circleulquad{25F4}{*}
-% \showsymbol\circlellquad{25F5}{*}
-% \showsymbol\circlelrquad{25F6}{*}
-% \showsymbol\circleurquad{25F7}{*}
-% \showsymbol\ultriangle{25F8}{*}
-% \showsymbol\urtriangle{25F9}{*}
-% \showsymbol\lltriangle{25FA}{*}
-% \showsymbol\mdwhtsquare{25FB}{*}
-% \showsymbol\mdblksquare{25FC}{*}
-% \showsymbol\mdsmwhtsquare{25FD}{*}
-% \showsymbol\mdsmblksquare{25FE}{*}
-% \showsymbol\lrtriangle{25FF}{*}
-% \showsymbol\bigstar{2605}{*}
-% \showsymbol\bigwhitestar{2606}{*}
-% \showsymbol\astrosun{2609}{}
-% \showsymbol\danger{2621}{}
-% \showsymbol\blacksmiley{263B}{}
-% \showsymbol\sun{263C}{}
-% \showsymbol\rightmoon{263D}{}
-% \showsymbol\leftmoon{263E}{}
-% \showsymbol\female{2640}{}
-% \showsymbol\male{2642}{}
-% \showsymbol\spadesuit{2660}{*}
-% \showsymbol\heartsuit{2661}{*}
-% \showsymbol\diamondsuit{2662}{*}
-% \showsymbol\clubsuit{2663}{*}
-% \showsymbol\varspadesuit{2664}{}
-% \showsymbol\varheartsuit{2665}{}
-% \showsymbol\vardiamondsuit{2666}{}
-% \showsymbol\varclubsuit{2667}{}
-% \showsymbol\quarternote{2669}{}
-% \showsymbol\eighthnote{266A}{}
-% \showsymbol\twonotes{266B}{}
-% \showsymbol\flat{266D}{}
-% \showsymbol\natural{266E}{}
-% \showsymbol\sharp{266F}{}
-% \showsymbol\acidfree{267E}{*}
-% \showsymbol\dicei{2680}{}
-% \showsymbol\diceii{2681}{}
-% \showsymbol\diceiii{2682}{}
-% \showsymbol\diceiv{2683}{}
-% \showsymbol\dicev{2684}{}
-% \showsymbol\dicevi{2685}{}
-% \showsymbol\circledrightdot{2686}{}
-% \showsymbol\circledtwodots{2687}{}
-% \showsymbol\blackcircledrightdot{2688}{}
-% \showsymbol\blackcircledtwodots{2689}{}
-% \showsymbol\Hermaphrodite{26A5}{}
-% \showsymbol\mdwhtcircle{26AA}{}
-% \showsymbol\mdblkcircle{26AB}{}
-% \showsymbol\mdsmwhtcircle{26AC}{}
-% \showsymbol\neuter{26B2}{}
-% \showsymbol\checkmark{2713}{}
-% \showsymbol\maltese{2720}{}
-% \showsymbol\circledstar{272A}{}
-% \showsymbol\varstar{2736}{}
-% \showsymbol\dingasterisk{273D}{}
-% \showsymbol\draftingarrow{279B}{*}
-% \showsymbol\threedangle{27C0}{*}
-% \showsymbol\whiteinwhitetriangle{27C1}{*}
-% \showsymbol\subsetcirc{27C3}{*}
-% \showsymbol\supsetcirc{27C4}{*}
-% \showsymbol\diagup{27CB}{*}
-% \showsymbol\diagdown{27CD}{*}
-% \showsymbol\diamondcdot{27D0}{*}
-% \showsymbol\rdiagovfdiag{292B}{*}
-% \showsymbol\fdiagovrdiag{292C}{*}
-% \showsymbol\seovnearrow{292D}{*}
-% \showsymbol\neovsearrow{292E}{*}
-% \showsymbol\fdiagovnearrow{292F}{*}
-% \showsymbol\rdiagovsearrow{2930}{*}
-% \showsymbol\neovnwarrow{2931}{*}
-% \showsymbol\nwovnearrow{2932}{*}
-% \showsymbol\uprightcurvearrow{2934}{*}
-% \showsymbol\downrightcurvedarrow{2935}{*}
-% \showsymbol\mdsmblkcircle{2981}{*}
-% \showsymbol\fourvdots{2999}{*}
-% \showsymbol\vzigzag{299A}{*}
-% \showsymbol\measuredangleleft{299B}{*}
-% \showsymbol\rightanglesqr{299C}{*}
-% \showsymbol\rightanglemdot{299D}{*}
-% \showsymbol\angles{299E}{*}
-% \showsymbol\angdnr{299F}{*}
-% \showsymbol\gtlpar{29A0}{*}
-% \showsymbol\sphericalangleup{29A1}{*}
-% \showsymbol\turnangle{29A2}{*}
-% \showsymbol\revangle{29A3}{*}
-% \showsymbol\angleubar{29A4}{*}
-% \showsymbol\revangleubar{29A5}{*}
-% \showsymbol\wideangledown{29A6}{*}
-% \showsymbol\wideangleup{29A7}{*}
-% \showsymbol\measanglerutone{29A8}{*}
-% \showsymbol\measanglelutonw{29A9}{*}
-% \showsymbol\measanglerdtose{29AA}{*}
-% \showsymbol\measangleldtosw{29AB}{*}
-% \showsymbol\measangleurtone{29AC}{*}
-% \showsymbol\measangleultonw{29AD}{*}
-% \showsymbol\measangledrtose{29AE}{*}
-% \showsymbol\measangledltosw{29AF}{*}
-% \showsymbol\revemptyset{29B0}{*}
-% \showsymbol\emptysetobar{29B1}{*}
-% \showsymbol\emptysetocirc{29B2}{*}
-% \showsymbol\emptysetoarr{29B3}{*}
-% \showsymbol\emptysetoarrl{29B4}{*}
-% \showsymbol\obot{29BA}{*}
-% \showsymbol\olcross{29BB}{*}
-% \showsymbol\odotslashdot{29BC}{*}
-% \showsymbol\uparrowoncircle{29BD}{*}
-% \showsymbol\circledwhitebullet{29BE}{*}
-% \showsymbol\circledbullet{29BF}{*}
-% \showsymbol\cirscir{29C2}{*}
-% \showsymbol\cirE{29C3}{*}
-% \showsymbol\boxonbox{29C9}{*}
-% \showsymbol\triangleodot{29CA}{*}
-% \showsymbol\triangleubar{29CB}{*}
-% \showsymbol\triangles{29CC}{*}
-% \showsymbol\iinfin{29DC}{*}
-% \showsymbol\tieinfty{29DD}{*}
-% \showsymbol\nvinfty{29DE}{*}
-% \showsymbol\laplac{29E0}{*}
-% \showsymbol\thermod{29E7}{*}
-% \showsymbol\downtriangleleftblack{29E8}{*}
-% \showsymbol\downtrianglerightblack{29E9}{*}
-% \showsymbol\blackdiamonddownarrow{29EA}{*}
-% \showsymbol\blacklozenge{29EB}{}
-% \showsymbol\circledownarrow{29EC}{*}
-% \showsymbol\blackcircledownarrow{29ED}{*}
-% \showsymbol\errbarsquare{29EE}{*}
-% \showsymbol\errbarblacksquare{29EF}{*}
-% \showsymbol\errbardiamond{29F0}{*}
-% \showsymbol\errbarblackdiamond{29F1}{*}
-% \showsymbol\errbarcircle{29F2}{*}
-% \showsymbol\errbarblackcircle{29F3}{*}
-% \showsymbol\perps{2AE1}{}
-% \showsymbol\topcir{2AF1}{}
-% \showsymbol\squaretopblack{2B12}{}
-% \showsymbol\squarebotblack{2B13}{}
-% \showsymbol\squareurblack{2B14}{}
-% \showsymbol\squarellblack{2B15}{}
-% \showsymbol\diamondleftblack{2B16}{}
-% \showsymbol\diamondrightblack{2B17}{}
-% \showsymbol\diamondtopblack{2B18}{}
-% \showsymbol\diamondbotblack{2B19}{}
-% \showsymbol\dottedsquare{2B1A}{}
-% \showsymbol\lgblksquare{2B1B}{}
-% \showsymbol\lgwhtsquare{2B1C}{}
-% \showsymbol\vysmblksquare{2B1D}{}
-% \showsymbol\vysmwhtsquare{2B1E}{}
-% \showsymbol\pentagonblack{2B1F}{}
-% \showsymbol\pentagon{2B20}{}
-% \showsymbol\varhexagon{2B21}{}
-% \showsymbol\varhexagonblack{2B22}{}
-% \showsymbol\hexagonblack{2B23}{}
-% \showsymbol\lgblkcircle{2B24}{}
-% \showsymbol\mdblkdiamond{2B25}{}
-% \showsymbol\mdwhtdiamond{2B26}{}
-% \showsymbol\mdblklozenge{2B27}{}
-% \showsymbol\mdwhtlozenge{2B28}{}
-% \showsymbol\smblkdiamond{2B29}{}
-% \showsymbol\smblklozenge{2B2A}{}
-% \showsymbol\smwhtlozenge{2B2B}{}
-% \showsymbol\blkhorzoval{2B2C}{}
-% \showsymbol\whthorzoval{2B2D}{}
-% \showsymbol\blkvertoval{2B2E}{}
-% \showsymbol\whtvertoval{2B2F}{}
-% \showsymbol\medwhitestar{2B50}{}
-% \showsymbol\medblackstar{2B51}{}
-% \showsymbol\smwhitestar{2B52}{}
-% \showsymbol\rightpentagonblack{2B53}{}
-% \showsymbol\rightpentagon{2B54}{}
-% \showsymbol\postalmark{3012}{}
-% \showsymbol\hzigzag{3030}{}
-% \showsymbol\Bbbk{1D55C}{}
-% \showsymbol\bracevert{XXXX}{*}
-% \end{multicols}
-%
-% \subsection{Binary operators}
-% \begin{multicols}{2}
-% \showsymbol+{002B}{}
-% \showsymbol\pm{00B1}{}
-% \showsymbol\cdotp{00B7}{}, \cmd\centerdot
-% \showsymbol\times{00D7}{}
-% \showsymbol\div{00F7}{}
-% \showsymbol\dagger{2020}{}
-% \showsymbol\ddagger{2021}{}
-% \showsymbol\smblkcircle{2022}{}
-% \showsymbol\fracslash{2044}{}
-% \showsymbol\upand{214B}{}
-% \showsymbol-{002D}{}
-% \showsymbol\mp{2213}{}
-% \showsymbol\dotplus{2214}{}
-% \showsymbol\smallsetminus{2216}{}
-% \showsymbol\ast{2217}{}
-% \showsymbol\vysmwhtcircle{2218}{}
-% \showsymbol\vysmblkcircle{2219}{}, {\small\cmd\bullet}
-% \showsymbol\wedge{2227}{}, \cmd\land
-% \showsymbol\vee{2228}{}, \cmd\lor
-% \showsymbol\cap{2229}{}
-% \showsymbol\cup{222A}{}
-% \showsymbol\dotminus{2238}{}
-% \showsymbol\invlazys{223E}{}
-% \showsymbol\wr{2240}{}
-% \showsymbol\cupleftarrow{228C}{}
-% \showsymbol\cupdot{228D}{}
-% \showsymbol\uplus{228E}{}
-% \showsymbol\sqcap{2293}{}
-% \showsymbol\sqcup{2294}{}
-% \showsymbol\oplus{2295}{}
-% \showsymbol\ominus{2296}{}
-% \showsymbol\otimes{2297}{}
-% \showsymbol\oslash{2298}{}
-% \showsymbol\odot{2299}{}
-% \showsymbol\circledcirc{229A}{}
-% \showsymbol\circledast{229B}{}
-% \showsymbol\circledequal{229C}{}
-% \showsymbol\circleddash{229D}{}
-% \showsymbol\boxplus{229E}{}
-% \showsymbol\boxminus{229F}{}
-% \showsymbol\boxtimes{22A0}{}
-% \showsymbol\boxdot{22A1}{}
-% \showsymbol\intercal{22BA}{}
-% \showsymbol\veebar{22BB}{}
-% \showsymbol\barwedge{22BC}{}
-% \showsymbol\barvee{22BD}{}
-% \showsymbol\diamond{22C4}{}, \cmd\smwhtdiamond
-% \showsymbol\cdot{22C5}{*}
-% \showsymbol\star{22C6}{}
-% \showsymbol\divideontimes{22C7}{}
-% \showsymbol\ltimes{22C9}{}
-% \showsymbol\rtimes{22CA}{}
-% \showsymbol\leftthreetimes{22CB}{}
-% \showsymbol\rightthreetimes{22CC}{}
-% \showsymbol\curlyvee{22CE}{}
-% \showsymbol\curlywedge{22CF}{}
-% \showsymbol\Cap{22D2}{}, \cmd\doublecap
-% \showsymbol\Cup{22D3}{}, \cmd\doublecup
-% \showsymbol\varbarwedge{2305}{*}
-% \showsymbol\vardoublebarwedge{2306}{*}
-% \showsymbol\obar{233D}{}
-% \showsymbol\triangle{25B3}{}, \cmd\bigtriangleup
-% \showsymbol\lhd{22B2}{}
-% \showsymbol\rhd{22B3}{}
-% \showsymbol\unlhd{22B4}{}
-% \showsymbol\unrhd{22B5}{}
-% \showsymbol\mdlgwhtcircle{25CB}{*}
-% \showsymbol\boxbar{25EB}{*}
-% \showsymbol\veedot{27C7}{*}
-% \showsymbol\wedgedot{27D1}{*}
-% \showsymbol\lozengeminus{27E0}{*}
-% \showsymbol\concavediamond{27E1}{*}
-% \showsymbol\concavediamondtickleft{27E2}{*}
-% \showsymbol\concavediamondtickright{27E3}{*}
-% \showsymbol\whitesquaretickleft{27E4}{*}
-% \showsymbol\whitesquaretickright{27E5}{*}
-% \showsymbol\typecolon{2982}{*}
-% \showsymbol\circlehbar{29B5}{*}
-% \showsymbol\circledvert{29B6}{}
-% \showsymbol\circledparallel{29B7}{}
-% \showsymbol\obslash{29B8}{}
-% \showsymbol\operp{29B9}{*}
-% \showsymbol\olessthan{29C0}{}
-% \showsymbol\ogreaterthan{29C1}{}
-% \showsymbol\boxdiag{29C4}{}
-% \showsymbol\boxbslash{29C5}{}
-% \showsymbol\boxast{29C6}{}
-% \showsymbol\boxcircle{29C7}{}
-% \showsymbol\boxbox{29C8}{*}
-% \showsymbol\triangleserifs{29CD}{*}
-% \showsymbol\hourglass{29D6}{*}
-% \showsymbol\blackhourglass{29D7}{*}
-% \showsymbol\shuffle{29E2}{*}
-% \showsymbol\mdlgblklozenge{29EB}{*}
-% \showsymbol\setminus{29F5}{*}
-% \showsymbol\dsol{29F6}{*}
-% \showsymbol\rsolbar{29F7}{*}
-% \showsymbol\doubleplus{29FA}{*}
-% \showsymbol\tripleplus{29FB}{*}
-% \showsymbol\tplus{29FE}{*}
-% \showsymbol\tminus{29FF}{*}
-% \showsymbol\ringplus{2A22}{}
-% \showsymbol\plushat{2A23}{}
-% \showsymbol\simplus{2A24}{}
-% \showsymbol\plusdot{2A25}{}
-% \showsymbol\plussim{2A26}{}
-% \showsymbol\plussubtwo{2A27}{}
-% \showsymbol\plustrif{2A28}{*}
-% \showsymbol\commaminus{2A29}{*}
-% \showsymbol\minusdot{2A2A}{}
-% \showsymbol\minusfdots{2A2B}{}
-% \showsymbol\minusrdots{2A2C}{*}
-% \showsymbol\opluslhrim{2A2D}{*}
-% \showsymbol\oplusrhrim{2A2E}{*}
-% \showsymbol\vectimes{2A2F}{*}
-% \showsymbol\dottimes{2A30}{}
-% \showsymbol\timesbar{2A31}{}
-% \showsymbol\btimes{2A32}{}
-% \showsymbol\smashtimes{2A33}{*}
-% \showsymbol\otimeslhrim{2A34}{*}
-% \showsymbol\otimesrhrim{2A35}{*}
-% \showsymbol\otimeshat{2A36}{*}
-% \showsymbol\Otimes{2A37}{*}
-% \showsymbol\odiv{2A38}{*}
-% \showsymbol\triangleplus{2A39}{*}
-% \showsymbol\triangleminus{2A3A}{*}
-% \showsymbol\triangletimes{2A3B}{*}
-% \showsymbol\intprod{2A3C}{*}
-% \showsymbol\intprodr{2A3D}{*}
-% \showsymbol\fcmp{2A3E}{*}
-% \showsymbol\amalg{2A3F}{}
-% \showsymbol\capdot{2A40}{*}
-% \showsymbol\uminus{2A41}{*}
-% \showsymbol\barcup{2A42}{*}
-% \showsymbol\barcap{2A43}{*}
-% \showsymbol\capwedge{2A44}{*}
-% \showsymbol\cupvee{2A45}{*}
-% \showsymbol\cupovercap{2A46}{*}
-% \showsymbol\capovercup{2A47}{*}
-% \showsymbol\cupbarcap{2A48}{*}
-% \showsymbol\capbarcup{2A49}{*}
-% \showsymbol\twocups{2A4A}{*}
-% \showsymbol\twocaps{2A4B}{*}
-% \showsymbol\closedvarcup{2A4C}{*}
-% \showsymbol\closedvarcap{2A4D}{*}
-% \showsymbol\Sqcap{2A4E}{*}
-% \showsymbol\Sqcup{2A4F}{*}
-% \showsymbol\closedvarcupsmashprod{2A50}{*}
-% \showsymbol\wedgeodot{2A51}{*}
-% \showsymbol\veeodot{2A52}{*}
-% \showsymbol\Wedge{2A53}{*}
-% \showsymbol\Vee{2A54}{*}
-% \showsymbol\wedgeonwedge{2A55}{*}
-% \showsymbol\veeonvee{2A56}{*}
-% \showsymbol\bigslopedvee{2A57}{*}
-% \showsymbol\bigslopedwedge{2A58}{*}
-% \showsymbol\wedgemidvert{2A5A}{*}
-% \showsymbol\veemidvert{2A5B}{*}
-% \showsymbol\midbarwedge{2A5C}{*}
-% \showsymbol\midbarvee{2A5D}{*}
-% \showsymbol\doublebarwedge{2A5E}{}
-% \showsymbol\wedgebar{2A5F}{*}
-% \showsymbol\wedgedoublebar{2A60}{*}
-% \showsymbol\varveebar{2A61}{*}
-% \showsymbol\doublebarvee{2A62}{*}
-% \showsymbol\veedoublebar{2A63}{}
-% \showsymbol\dsub{2A64}{*}
-% \showsymbol\rsub{2A65}{*}
-% \showsymbol\eqqplus{2A71}{}
-% \showsymbol\pluseqq{2A72}{}
-% \showsymbol\interleave{2AF4}{}
-% \showsymbol\nhVvert{2AF5}{}
-% \showsymbol\threedotcolon{2AF6}{}
-% \showsymbol\trslash{2AFB}{}
-% \showsymbol\sslash{2AFD}{}
-% \showsymbol\talloblong{2AFE}{}
-% \end{multicols}
-%
-% \subsection{Relations}
-% \begin{multicols}{2}
-% \showsymbol*{002A}{}, \cmd\ast
-% \showsymbol:{003A}{}
-% \showsymbol<{003C}{}, \cmd\less
-% \showsymbol={003D}{}, \cmd\equal
-% \showsymbol>{003E}{}, \cmd\greater
-% \showsymbol\closure{2050}{*}
-% \showsymbol\vertoverlay{20D2}{}
-% \showsymbol\leftarrow{2190}{}, \cmd\gets
-% \showsymbol\uparrow{2191}{}
-% \showsymbol\rightarrow{2192}{}, \cmd\to
-% \showsymbol\downarrow{2193}{}
-% \showsymbol\leftrightarrow{2194}{}
-% \showsymbol\updownarrow{2195}{}
-% \showsymbol\nwarrow{2196}{}
-% \showsymbol\nearrow{2197}{}
-% \showsymbol\searrow{2198}{}
-% \showsymbol\swarrow{2199}{}
-% \showsymbol\nleftarrow{219A}{}
-% \showsymbol\nrightarrow{219B}{}
-% \showsymbol\leftwavearrow{219C}{}
-% \showsymbol\rightwavearrow{219D}{}
-% \showsymbol\twoheadleftarrow{219E}{}
-% \showsymbol\twoheaduparrow{219F}{}
-% \showsymbol\twoheadrightarrow{21A0}{}
-% \showsymbol\twoheaddownarrow{21A1}{}
-% \showsymbol\leftarrowtail{21A2}{}
-% \showsymbol\rightarrowtail{21A3}{}
-% \showsymbol\mapsfrom{21A4}{}
-% \showsymbol\mapsup{21A5}{}
-% \showsymbol\mapsto{21A6}{}
-% \showsymbol\mapsdown{21A7}{}
-% \showsymbol\hookleftarrow{21A9}{}
-% \showsymbol\hookrightarrow{21AA}{}
-% \showsymbol\looparrowleft{21AB}{}
-% \showsymbol\looparrowright{21AC}{}
-% \showsymbol\leftrightsquigarrow{21AD}{}
-% \showsymbol\nleftrightarrow{21AE}{}
-% \showsymbol\downzigzagarrow{21AF}{}
-% \showsymbol\Lsh{21B0}{}
-% \showsymbol\Rsh{21B1}{}
-% \showsymbol\Ldsh{21B2}{}
-% \showsymbol\Rdsh{21B3}{}
-% \showsymbol\curvearrowleft{21B6}{}
-% \showsymbol\curvearrowright{21B7}{}
-% \showsymbol\circlearrowleft{21BA}{}
-% \showsymbol\circlearrowright{21BB}{}
-% \showsymbol\leftharpoonup{21BC}{}
-% \showsymbol\leftharpoondown{21BD}{}
-% \showsymbol\upharpoonright{21BE}{}, \cmd\restriction
-% \showsymbol\upharpoonleft{21BF}{}
-% \showsymbol\rightharpoonup{21C0}{}
-% \showsymbol\rightharpoondown{21C1}{}
-% \showsymbol\downharpoonright{21C2}{}
-% \showsymbol\downharpoonleft{21C3}{}
-% \showsymbol\rightleftarrows{21C4}{}
-% \showsymbol\updownarrows{21C5}{}
-% \showsymbol\leftrightarrows{21C6}{}
-% \showsymbol\leftleftarrows{21C7}{}
-% \showsymbol\upuparrows{21C8}{}
-% \showsymbol\rightrightarrows{21C9}{}
-% \showsymbol\downdownarrows{21CA}{}
-% \showsymbol\leftrightharpoons{21CB}{}
-% \showsymbol\rightleftharpoons{21CC}{}
-% \showsymbol\nLeftarrow{21CD}{}
-% \showsymbol\nLeftrightarrow{21CE}{}
-% \showsymbol\nRightarrow{21CF}{}
-% \showsymbol\Leftarrow{21D0}{}
-% \showsymbol\Uparrow{21D1}{}
-% \showsymbol\Rightarrow{21D2}{}
-% \showsymbol\Downarrow{21D3}{}
-% \showsymbol\Leftrightarrow{21D4}{}
-% \showsymbol\Updownarrow{21D5}{}
-% \showsymbol\Nwarrow{21D6}{}
-% \showsymbol\Nearrow{21D7}{}
-% \showsymbol\Searrow{21D8}{}
-% \showsymbol\Swarrow{21D9}{}
-% \showsymbol\Lleftarrow{21DA}{*}
-% \showsymbol\Rrightarrow{21DB}{*}
-% \showsymbol\leftsquigarrow{21DC}{}
-% \showsymbol\rightsquigarrow{21DD}{}, \cmd\leadsto
-% \showsymbol\barleftarrow{21E4}{*}
-% \showsymbol\rightarrowbar{21E5}{*}
-% \showsymbol\circleonrightarrow{21F4}{*}
-% \showsymbol\downuparrows{21F5}{}
-% \showsymbol\rightthreearrows{21F6}{*}
-% \showsymbol\nvleftarrow{21F7}{*}
-% \showsymbol\nvrightarrow{21F8}{*}
-% \showsymbol\nvleftrightarrow{21F9}{*}
-% \showsymbol\nVleftarrow{21FA}{*}
-% \showsymbol\nVrightarrow{21FB}{*}
-% \showsymbol\nVleftrightarrow{21FC}{*}
-% \showsymbol\leftarrowtriangle{21FD}{*}
-% \showsymbol\rightarrowtriangle{21FE}{*}
-% \showsymbol\leftrightarrowtriangle{21FF}{*}
-% \showsymbol\in{2208}{}
-% \showsymbol\notin{2209}{}
-% \showsymbol\smallin{220A}{}
-% \showsymbol\ni{220B}{}, \cmd\owns
-% \showsymbol\nni{220C}{}
-% \showsymbol\smallni{220D}{}
-% \showsymbol\propto{221D}{}
-% \showsymbol\varpropto{221D}{}
-% \showsymbol\mid{2223}{}
-% \showsymbol\shortmid{2223}{}
-% \showsymbol\nmid{2224}{}
-% \showsymbol\nshortmid{2224}{*}
-% \showsymbol\parallel{2225}{}
-% \showsymbol\shortparallel{2225}{*}
-% \showsymbol\nparallel{2226}{}
-% \showsymbol\nshortparallel{2226}{*}
-% \showsymbol\Colon{2237}{}
-% \showsymbol\dashcolon{2239}{}
-% \showsymbol\dotsminusdots{223A}{}
-% \showsymbol\kernelcontraction{223B}{}
-% \showsymbol\sim{223C}{}
-% \showsymbol\thicksim{223C}{}
-% \showsymbol\backsim{223D}{}
-% \showsymbol\nsim{2241}{}
-% \showsymbol\eqsim{2242}{}
-% \showsymbol\simeq{2243}{}
-% \showsymbol\nsime{2244}{}
-% \showsymbol\cong{2245}{}
-% \showsymbol\simneqq{2246}{}
-% \showsymbol\ncong{2247}{}
-% \showsymbol\approx{2248}{}
-% \showsymbol\thickapprox{2248}{}
-% \showsymbol\napprox{2249}{}
-% \showsymbol\approxeq{224A}{}
-% \showsymbol\approxident{224B}{}
-% \showsymbol\backcong{224C}{}
-% \showsymbol\asymp{224D}{}
-% \showsymbol\Bumpeq{224E}{}
-% \showsymbol\bumpeq{224F}{}
-% \showsymbol\doteq{2250}{}
-% \showsymbol\Doteq{2251}{}, \cmd\doteqdot
-% \showsymbol\fallingdotseq{2252}{}
-% \showsymbol\risingdotseq{2253}{}
-% \showsymbol\coloneq{2254}{}
-% \showsymbol\eqcolon{2255}{}
-% \showsymbol\eqcirc{2256}{}
-% \showsymbol\circeq{2257}{}
-% \showsymbol\arceq{2258}{}
-% \showsymbol\wedgeq{2259}{}
-% \showsymbol\veeeq{225A}{}
-% \showsymbol\stareq{225B}{}
-% \showsymbol\triangleq{225C}{}
-% \showsymbol\eqdef{225D}{}
-% \showsymbol\measeq{225E}{}
-% \showsymbol\questeq{225F}{}
-% \showsymbol\ne{2260}{}, \cmd\neq
-% \showsymbol\equiv{2261}{}
-% \showsymbol\nequiv{2262}{}
-% \showsymbol\Equiv{2263}{}
-% \showsymbol\leq{2264}{}, \cmd\le
-% \showsymbol\geq{2265}{}, \cmd\ge
-% \showsymbol\leqq{2266}{}
-% \showsymbol\geqq{2267}{}
-% \showsymbol\lneqq{2268}{}
-% \showsymbol\lvertneqq{2268}{}
-% \showsymbol\gneqq{2269}{}
-% \showsymbol\gvertneqq{2269}{}
-% \showsymbol\ll{226A}{}
-% \showsymbol\gg{226B}{}
-% \showsymbol\between{226C}{}
-% \showsymbol\nasymp{226D}{}
-% \showsymbol\nless{226E}{}
-% \showsymbol\ngtr{226F}{}
-% \showsymbol\nleq{2270}{}
-% \showsymbol\ngeq{2271}{}
-% \showsymbol\lesssim{2272}{}
-% \showsymbol\gtrsim{2273}{}
-% \showsymbol\nlesssim{2274}{}
-% \showsymbol\ngtrsim{2275}{}
-% \showsymbol\lessgtr{2276}{}
-% \showsymbol\gtrless{2277}{}
-% \showsymbol\nlessgtr{2278}{}
-% \showsymbol\ngtrless{2279}{}
-% \showsymbol\prec{227A}{}
-% \showsymbol\succ{227B}{}
-% \showsymbol\preccurlyeq{227C}{}
-% \showsymbol\succcurlyeq{227D}{}
-% \showsymbol\precsim{227E}{}
-% \showsymbol\succsim{227F}{}
-% \showsymbol\nprec{2280}{}
-% \showsymbol\nsucc{2281}{}
-% \showsymbol\subset{2282}{}
-% \showsymbol\supset{2283}{}
-% \showsymbol\nsubset{2284}{}
-% \showsymbol\nsupset{2285}{}
-% \showsymbol\subseteq{2286}{}
-% \showsymbol\supseteq{2287}{}
-% \showsymbol\nsubseteq{2288}{}
-% \showsymbol\nsupseteq{2289}{}
-% \showsymbol\subsetneq{228A}{}
-% \showsymbol\varsubsetneq{228A}{*}
-% \showsymbol\supsetneq{228B}{}
-% \showsymbol\varsupsetneq{228B}{*}
-% \showsymbol\sqsubset{228F}{}
-% \showsymbol\sqsupset{2290}{}
-% \showsymbol\sqsubseteq{2291}{}
-% \showsymbol\sqsupseteq{2292}{}
-% \showsymbol\vdash{22A2}{}
-% \showsymbol\dashv{22A3}{}
-% \showsymbol\assert{22A6}{}
-% \showsymbol\models{22A7}{}
-% \showsymbol\vDash{22A8}{}
-% \showsymbol\Vdash{22A9}{}
-% \showsymbol\Vvdash{22AA}{}
-% \showsymbol\VDash{22AB}{}
-% \showsymbol\nvdash{22AC}{}
-% \showsymbol\nvDash{22AD}{}
-% \showsymbol\nVdash{22AE}{}
-% \showsymbol\nVDash{22AF}{}
-% \showsymbol\prurel{22B0}{}
-% \showsymbol\scurel{22B1}{}
-% \showsymbol\vartriangleleft{22B2}{}
-% \showsymbol\vartriangleright{22B3}{}
-% \showsymbol\trianglelefteq{22B4}{}
-% \showsymbol\trianglerighteq{22B5}{}
-% \showsymbol\origof{22B6}{}
-% \showsymbol\imageof{22B7}{}
-% \showsymbol\multimap{22B8}{}
-% \showsymbol\bowtie{22C8}{}
-% \showsymbol\backsimeq{22CD}{}
-% \showsymbol\Subset{22D0}{}
-% \showsymbol\Supset{22D1}{}
-% \showsymbol\pitchfork{22D4}{}
-% \showsymbol\equalparallel{22D5}{}
-% \showsymbol\lessdot{22D6}{}
-% \showsymbol\gtrdot{22D7}{}
-% \showsymbol\lll{22D8}{}, \cmd\llless
-% \showsymbol\ggg{22D9}{}, \cmd\gggtr
-% \showsymbol\lesseqgtr{22DA}{}
-% \showsymbol\gtreqless{22DB}{}
-% \showsymbol\eqless{22DC}{}
-% \showsymbol\eqgtr{22DD}{}
-% \showsymbol\curlyeqprec{22DE}{}
-% \showsymbol\curlyeqsucc{22DF}{}
-% \showsymbol\npreccurlyeq{22E0}{}
-% \showsymbol\nsucccurlyeq{22E1}{}
-% \showsymbol\nsqsubseteq{22E2}{}
-% \showsymbol\nsqsupseteq{22E3}{}
-% \showsymbol\sqsubsetneq{22E4}{*}
-% \showsymbol\sqsupsetneq{22E5}{*}
-% \showsymbol\lnsim{22E6}{}
-% \showsymbol\gnsim{22E7}{}
-% \showsymbol\precnsim{22E8}{}
-% \showsymbol\succnsim{22E9}{}
-% \showsymbol\nvartriangleleft{22EA}{}
-% \showsymbol\nvartriangleright{22EB}{}
-% \showsymbol\ntrianglelefteq{22EC}{}
-% \showsymbol\ntrianglerighteq{22ED}{}
-% \showsymbol\vdots{22EE}{}
-% \showsymbol\adots{22F0}{}
-% \showsymbol\ddots{22F1}{}
-% \showsymbol\disin{22F2}{*}
-% \showsymbol\varisins{22F3}{*}
-% \showsymbol\isins{22F4}{*}
-% \showsymbol\isindot{22F5}{*}
-% \showsymbol\varisinobar{22F6}{}
-% \showsymbol\isinobar{22F7}{*}
-% \showsymbol\isinvb{22F8}{*}
-% \showsymbol\isinE{22F9}{*}
-% \showsymbol\nisd{22FA}{*}
-% \showsymbol\varnis{22FB}{*}
-% \showsymbol\nis{22FC}{*}
-% \showsymbol\varniobar{22FD}{}
-% \showsymbol\niobar{22FE}{*}
-% \showsymbol\bagmember{22FF}{*}
-% \showsymbol\frown{2322}{}
-% \showsymbol\smallfrown{2322}{*}
-% \showsymbol\smile{2323}{}
-% \showsymbol\smallsmile{2323}{*}
-% \showsymbol\APLnotslash{233F}{}
-% \showsymbol\vartriangle{25B5}{*}
-% \showsymbol\perp{27C2}{*}
-% \showsymbol\bsolhsub{27C8}{}
-% \showsymbol\suphsol{27C9}{}
-% \showsymbol\upin{27D2}{*}
-% \showsymbol\pullback{27D3}{*}
-% \showsymbol\pushout{27D4}{*}
-% \showsymbol\DashVDash{27DA}{*}
-% \showsymbol\dashVdash{27DB}{*}
-% \showsymbol\multimapinv{27DC}{*}
-% \showsymbol\vlongdash{27DD}{*}
-% \showsymbol\longdashv{27DE}{*}
-% \showsymbol\cirbot{27DF}{*}
-% \showsymbol\UUparrow{27F0}{*}
-% \showsymbol\DDownarrow{27F1}{*}
-% \showsymbol\acwgapcirclearrow{27F2}{*}
-% \showsymbol\cwgapcirclearrow{27F3}{*}
-% \showsymbol\rightarrowonoplus{27F4}{*}
-% \showsymbol\longleftarrow{27F5}{*}
-% \showsymbol\longrightarrow{27F6}{*}
-% \showsymbol\longleftrightarrow{27F7}{*}
-% \showsymbol\Longleftarrow{27F8}{*}
-% \showsymbol\Longrightarrow{27F9}{*}
-% \showsymbol\Longleftrightarrow{27FA}{*}
-% \showsymbol\longmapsfrom{27FB}{*}
-% \showsymbol\longmapsto{27FC}{*}
-% \showsymbol\Longmapsfrom{27FD}{*}
-% \showsymbol\Longmapsto{27FE}{*}
-% \showsymbol\longrightsquigarrow{27FF}{*}
-% \showsymbol\nvtwoheadrightarrow{2900}{*}
-% \showsymbol\nVtwoheadrightarrow{2901}{*}
-% \showsymbol\nvLeftarrow{2902}{*}
-% \showsymbol\nvRightarrow{2903}{*}
-% \showsymbol\nvLeftrightarrow{2904}{*}
-% \showsymbol\twoheadmapsto{2905}{*}
-% \showsymbol\Mapsfrom{2906}{*}
-% \showsymbol\Mapsto{2907}{*}
-% \showsymbol\downarrowbarred{2908}{*}
-% \showsymbol\uparrowbarred{2909}{*}
-% \showsymbol\Uuparrow{290A}{*}
-% \showsymbol\Ddownarrow{290B}{*}
-% \showsymbol\leftbkarrow{290C}{*}
-% \showsymbol\rightbkarrow{290D}{*}
-% \showsymbol\leftdbkarrow{290E}{*}, \cmd\dashleftarrow
-% \showsymbol\dbkarow{290F}{*}, \cmd\dashrightarrow
-% \showsymbol\drbkarow{2910}{*}
-% \showsymbol\rightdotarrow{2911}{*}
-% \showsymbol\baruparrow{2912}{*}
-% \showsymbol\downarrowbar{2913}{*}
-% \showsymbol\nvrightarrowtail{2914}{*}
-% \showsymbol\nVrightarrowtail{2915}{*}
-% \showsymbol\twoheadrightarrowtail{2916}{*}
-% \showsymbol\nvtwoheadrightarrowtail{2917}{*}
-% \showsymbol\nVtwoheadrightarrowtail{2918}{*}
-% \showsymbol\lefttail{2919}{*}
-% \showsymbol\righttail{291A}{*}
-% \showsymbol\leftdbltail{291B}{*}
-% \showsymbol\rightdbltail{291C}{*}
-% \showsymbol\diamondleftarrow{291D}{*}
-% \showsymbol\rightarrowdiamond{291E}{*}
-% \showsymbol\diamondleftarrowbar{291F}{*}
-% \showsymbol\barrightarrowdiamond{2920}{*}
-% \showsymbol\nwsearrow{2921}{*}
-% \showsymbol\neswarrow{2922}{*}
-% \showsymbol\hknwarrow{2923}{*}
-% \showsymbol\hknearrow{2924}{*}
-% \showsymbol\hksearow{2925}{*}
-% \showsymbol\hkswarow{2926}{*}
-% \showsymbol\tona{2927}{*}
-% \showsymbol\toea{2928}{*}
-% \showsymbol\tosa{2929}{*}
-% \showsymbol\towa{292A}{*}
-% \showsymbol\rightcurvedarrow{2933}{*}
-% \showsymbol\leftdowncurvedarrow{2936}{*}
-% \showsymbol\rightdowncurvedarrow{2937}{*}
-% \showsymbol\cwrightarcarrow{2938}{*}
-% \showsymbol\acwleftarcarrow{2939}{*}
-% \showsymbol\acwoverarcarrow{293A}{*}
-% \showsymbol\acwunderarcarrow{293B}{*}
-% \showsymbol\curvearrowrightminus{293C}{*}
-% \showsymbol\curvearrowleftplus{293D}{*}
-% \showsymbol\cwundercurvearrow{293E}{*}
-% \showsymbol\ccwundercurvearrow{293F}{*}
-% \showsymbol\acwcirclearrow{2940}{*}
-% \showsymbol\cwcirclearrow{2941}{*}
-% \showsymbol\rightarrowshortleftarrow{2942}{*}
-% \showsymbol\leftarrowshortrightarrow{2943}{*}
-% \showsymbol\shortrightarrowleftarrow{2944}{*}
-% \showsymbol\rightarrowplus{2945}{*}
-% \showsymbol\leftarrowplus{2946}{*}
-% \showsymbol\rightarrowx{2947}{*}
-% \showsymbol\leftrightarrowcircle{2948}{*}
-% \showsymbol\twoheaduparrowcircle{2949}{*}
-% \showsymbol\leftrightharpoonupdown{294A}{*}
-% \showsymbol\leftrightharpoondownup{294B}{*}
-% \showsymbol\updownharpoonrightleft{294C}{*}
-% \showsymbol\updownharpoonleftright{294D}{*}
-% \showsymbol\leftrightharpoonupup{294E}{*}
-% \showsymbol\updownharpoonrightright{294F}{*}
-% \showsymbol\leftrightharpoondowndown{2950}{*}
-% \showsymbol\updownharpoonleftleft{2951}{*}
-% \showsymbol\barleftharpoonup{2952}{*}
-% \showsymbol\rightharpoonupbar{2953}{*}
-% \showsymbol\barupharpoonright{2954}{*}
-% \showsymbol\downharpoonrightbar{2955}{*}
-% \showsymbol\barleftharpoondown{2956}{*}
-% \showsymbol\rightharpoondownbar{2957}{*}
-% \showsymbol\barupharpoonleft{2958}{*}
-% \showsymbol\downharpoonleftbar{2959}{*}
-% \showsymbol\leftharpoonupbar{295A}{*}
-% \showsymbol\barrightharpoonup{295B}{*}
-% \showsymbol\upharpoonrightbar{295C}{*}
-% \showsymbol\bardownharpoonright{295D}{*}
-% \showsymbol\leftharpoondownbar{295E}{*}
-% \showsymbol\barrightharpoondown{295F}{*}
-% \showsymbol\upharpoonleftbar{2960}{*}
-% \showsymbol\bardownharpoonleft{2961}{*}
-% \showsymbol\leftharpoonsupdown{2962}{*}
-% \showsymbol\upharpoonsleftright{2963}{*}
-% \showsymbol\rightharpoonsupdown{2964}{*}
-% \showsymbol\downharpoonsleftright{2965}{*}
-% \showsymbol\leftrightharpoonsup{2966}{*}
-% \showsymbol\leftrightharpoonsdown{2967}{*}
-% \showsymbol\rightleftharpoonsup{2968}{*}
-% \showsymbol\rightleftharpoonsdown{2969}{*}
-% \showsymbol\leftharpoonupdash{296A}{*}
-% \showsymbol\dashleftharpoondown{296B}{*}
-% \showsymbol\rightharpoonupdash{296C}{*}
-% \showsymbol\dashrightharpoondown{296D}{*}
-% \showsymbol\updownharpoonsleftright{296E}{*}
-% \showsymbol\downupharpoonsleftright{296F}{*}
-% \showsymbol\rightimply{2970}{*}
-% \showsymbol\equalrightarrow{2971}{*}
-% \showsymbol\similarrightarrow{2972}{*}
-% \showsymbol\leftarrowsimilar{2973}{*}
-% \showsymbol\rightarrowsimilar{2974}{*}
-% \showsymbol\rightarrowapprox{2975}{*}
-% \showsymbol\ltlarr{2976}{*}
-% \showsymbol\leftarrowless{2977}{*}
-% \showsymbol\gtrarr{2978}{*}
-% \showsymbol\subrarr{2979}{*}
-% \showsymbol\leftarrowsubset{297A}{*}
-% \showsymbol\suplarr{297B}{*}
-% \showsymbol\leftfishtail{297C}{*}
-% \showsymbol\rightfishtail{297D}{*}
-% \showsymbol\upfishtail{297E}{*}
-% \showsymbol\downfishtail{297F}{*}
-% \showsymbol\rtriltri{29CE}{*}
-% \showsymbol\ltrivb{29CF}{*}
-% \showsymbol\vbrtri{29D0}{*}
-% \showsymbol\lfbowtie{29D1}{*}
-% \showsymbol\rfbowtie{29D2}{*}
-% \showsymbol\fbowtie{29D3}{*}
-% \showsymbol\lftimes{29D4}{*}
-% \showsymbol\rftimes{29D5}{*}
-% \showsymbol\dualmap{29DF}{*}
-% \showsymbol\lrtriangleeq{29E1}{*}
-% \showsymbol\eparsl{29E3}{*}
-% \showsymbol\smeparsl{29E4}{*}
-% \showsymbol\eqvparsl{29E5}{*}
-% \showsymbol\gleichstark{29E6}{*}
-% \showsymbol\ruledelayed{29F4}{*}
-% \showsymbol\veeonwedge{2A59}{*}
-% \showsymbol\eqdot{2A66}{}
-% \showsymbol\dotequiv{2A67}{}
-% \showsymbol\equivVert{2A68}{*}
-% \showsymbol\equivVvert{2A69}{*}
-% \showsymbol\dotsim{2A6A}{}
-% \showsymbol\simrdots{2A6B}{*}
-% \showsymbol\simminussim{2A6C}{*}
-% \showsymbol\congdot{2A6D}{}
-% \showsymbol\asteq{2A6E}{}
-% \showsymbol\hatapprox{2A6F}{}
-% \showsymbol\approxeqq{2A70}{}
-% \showsymbol\eqqsim{2A73}{}
-% \showsymbol\Coloneq{2A74}{*}
-% \showsymbol\eqeq{2A75}{*}
-% \showsymbol\eqeqeq{2A76}{*}
-% \showsymbol\ddotseq{2A77}{*}
-% \showsymbol\equivDD{2A78}{*}
-% \showsymbol\ltcir{2A79}{*}
-% \showsymbol\gtcir{2A7A}{*}
-% \showsymbol\ltquest{2A7B}{*}
-% \showsymbol\gtquest{2A7C}{*}
-% \showsymbol\leqslant{2A7D}{}
-% \showsymbol\geqslant{2A7E}{}
-% \showsymbol\lesdot{2A7F}{*}
-% \showsymbol\gesdot{2A80}{*}
-% \showsymbol\lesdoto{2A81}{*}
-% \showsymbol\gesdoto{2A82}{*}
-% \showsymbol\lesdotor{2A83}{*}
-% \showsymbol\gesdotol{2A84}{*}
-% \showsymbol\lessapprox{2A85}{*}
-% \showsymbol\gtrapprox{2A86}{*}
-% \showsymbol\lneq{2A87}{}
-% \showsymbol\gneq{2A88}{}
-% \showsymbol\lnapprox{2A89}{}
-% \showsymbol\gnapprox{2A8A}{}
-% \showsymbol\lesseqqgtr{2A8B}{*}
-% \showsymbol\gtreqqless{2A8C}{*}
-% \showsymbol\lsime{2A8D}{*}
-% \showsymbol\gsime{2A8E}{*}
-% \showsymbol\lsimg{2A8F}{*}
-% \showsymbol\gsiml{2A90}{*}
-% \showsymbol\lgE{2A91}{*}
-% \showsymbol\glE{2A92}{*}
-% \showsymbol\lesges{2A93}{*}
-% \showsymbol\gesles{2A94}{*}
-% \showsymbol\eqslantless{2A95}{}
-% \showsymbol\eqslantgtr{2A96}{}
-% \showsymbol\elsdot{2A97}{*}
-% \showsymbol\egsdot{2A98}{*}
-% \showsymbol\eqqless{2A99}{*}
-% \showsymbol\eqqgtr{2A9A}{*}
-% \showsymbol\eqqslantless{2A9B}{*}
-% \showsymbol\eqqslantgtr{2A9C}{*}
-% \showsymbol\simless{2A9D}{}
-% \showsymbol\simgtr{2A9E}{}
-% \showsymbol\simlE{2A9F}{*}
-% \showsymbol\simgE{2AA0}{*}
-% \showsymbol\Lt{2AA1}{*}
-% \showsymbol\Gt{2AA2}{*}
-% \showsymbol\partialmeetcontraction{2AA3}{*}
-% \showsymbol\glj{2AA4}{*}
-% \showsymbol\gla{2AA5}{*}
-% \showsymbol\ltcc{2AA6}{*}
-% \showsymbol\gtcc{2AA7}{*}
-% \showsymbol\lescc{2AA8}{*}
-% \showsymbol\gescc{2AA9}{*}
-% \showsymbol\smt{2AAA}{*}
-% \showsymbol\lat{2AAB}{*}
-% \showsymbol\smte{2AAC}{*}
-% \showsymbol\late{2AAD}{*}
-% \showsymbol\bumpeqq{2AAE}{*}
-% \showsymbol\preceq{2AAF}{}
-% \showsymbol\npreceq{XXXX}{*}
-% \showsymbol\succeq{2AB0}{}
-% \showsymbol\nsucceq{XXXX}{*}
-% \showsymbol\precneq{2AB1}{*}
-% \showsymbol\succneq{2AB2}{*}
-% \showsymbol\preceqq{2AB3}{*}
-% \showsymbol\succeqq{2AB4}{*}
-% \showsymbol\precneqq{2AB5}{*}
-% \showsymbol\succneqq{2AB6}{*}
-% \showsymbol\precapprox{2AB7}{*}
-% \showsymbol\succapprox{2AB8}{*}
-% \showsymbol\precnapprox{2AB9}{*}
-% \showsymbol\succnapprox{2ABA}{*}
-% \showsymbol\Prec{2ABB}{*}
-% \showsymbol\Succ{2ABC}{*}
-% \showsymbol\subsetdot{2ABD}{}
-% \showsymbol\supsetdot{2ABE}{}
-% \showsymbol\subsetplus{2ABF}{*}
-% \showsymbol\supsetplus{2AC0}{*}
-% \showsymbol\submult{2AC1}{*}
-% \showsymbol\supmult{2AC2}{*}
-% \showsymbol\subedot{2AC3}{*}
-% \showsymbol\supedot{2AC4}{*}
-% \showsymbol\subseteqq{2AC5}{}
-% \showsymbol\nsubseteqq{XXXX}{*}
-% \showsymbol\supseteqq{2AC6}{}
-% \showsymbol\nsupseteqq{XXXX}{*}
-% \showsymbol\subsim{2AC7}{*}
-% \showsymbol\supsim{2AC8}{*}
-% \showsymbol\subsetapprox{2AC9}{*}
-% \showsymbol\supsetapprox{2ACA}{*}
-% \showsymbol\subsetneqq{2ACB}{}
-% \showsymbol\varsubsetneqq{2ACB}{*}
-% \showsymbol\supsetneqq{2ACC}{}
-% \showsymbol\varsupsetneqq{2ACC}{*}
-% \showsymbol\lsqhook{2ACD}{}
-% \showsymbol\rsqhook{2ACE}{}
-% \showsymbol\csub{2ACF}{}
-% \showsymbol\csup{2AD0}{}
-% \showsymbol\csube{2AD1}{}
-% \showsymbol\csupe{2AD2}{}
-% \showsymbol\subsup{2AD3}{}
-% \showsymbol\supsub{2AD4}{}
-% \showsymbol\subsub{2AD5}{}
-% \showsymbol\supsup{2AD6}{}
-% \showsymbol\suphsub{2AD7}{}
-% \showsymbol\supdsub{2AD8}{}
-% \showsymbol\forkv{2AD9}{}
-% \showsymbol\topfork{2ADA}{}
-% \showsymbol\mlcp{2ADB}{}
-% \showsymbol\forks{2ADC}{}
-% \showsymbol\forksnot{2ADD}{}
-% \showsymbol\shortlefttack{2ADE}{}
-% \showsymbol\shortdowntack{2ADF}{}
-% \showsymbol\shortuptack{2AE0}{}
-% \showsymbol\vDdash{2AE2}{}
-% \showsymbol\dashV{2AE3}{}
-% \showsymbol\Dashv{2AE4}{}
-% \showsymbol\DashV{2AE5}{}
-% \showsymbol\varVdash{2AE6}{}
-% \showsymbol\Barv{2AE7}{}
-% \showsymbol\vBar{2AE8}{}
-% \showsymbol\vBarv{2AE9}{}
-% \showsymbol\barV{2AEA}{}
-% \showsymbol\Vbar{2AEB}{}
-% \showsymbol\Not{2AEC}{}
-% \showsymbol\bNot{2AED}{}
-% \showsymbol\revnmid{2AEE}{}
-% \showsymbol\cirmid{2AEF}{}
-% \showsymbol\midcir{2AF0}{}
-% \showsymbol\nhpar{2AF2}{}
-% \showsymbol\parsim{2AF3}{}
-% \showsymbol\lllnest{2AF7}{}
-% \showsymbol\gggnest{2AF8}{}
-% \showsymbol\leqqslant{2AF9}{}
-% \showsymbol\geqqslant{2AFA}{}
-% \showsymbol\circleonleftarrow{2B30}{*}
-% \showsymbol\leftthreearrows{2B31}{*}
-% \showsymbol\leftarrowonoplus{2B32}{*}
-% \showsymbol\longleftsquigarrow{2B33}{*}
-% \showsymbol\nvtwoheadleftarrow{2B34}{*}
-% \showsymbol\nVtwoheadleftarrow{2B35}{*}
-% \showsymbol\twoheadmapsfrom{2B36}{*}
-% \showsymbol\twoheadleftdbkarrow{2B37}{*}
-% \showsymbol\leftdotarrow{2B38}{*}
-% \showsymbol\nvleftarrowtail{2B39}{*}
-% \showsymbol\nVleftarrowtail{2B3A}{*}
-% \showsymbol\twoheadleftarrowtail{2B3B}{*}
-% \showsymbol\nvtwoheadleftarrowtail{2B3C}{*}
-% \showsymbol\nVtwoheadleftarrowtail{2B3D}{*}
-% \showsymbol\leftarrowx{2B3E}{*}
-% \showsymbol\leftcurvedarrow{2B3F}{*}
-% \showsymbol\equalleftarrow{2B40}{*}
-% \showsymbol\bsimilarleftarrow{2B41}{*}
-% \showsymbol\leftarrowbackapprox{2B42}{*}
-% \showsymbol\rightarrowgtr{2B43}{*}
-% \showsymbol\rightarrowsupset{2B44}{*}
-% \showsymbol\LLeftarrow{2B45}{*}
-% \showsymbol\RRightarrow{2B46}{*}
-% \showsymbol\bsimilarrightarrow{2B47}{*}
-% \showsymbol\rightarrowbackapprox{2B48}{*}
-% \showsymbol\similarleftarrow{2B49}{*}
-% \showsymbol\leftarrowapprox{2B4A}{*}
-% \showsymbol\leftarrowbsimilar{2B4B}{*}
-% \showsymbol\rightarrowbsimilar{2B4C}{*}
-% \showsymbol\ngeqq{XXXX}{}
-% \showsymbol\ngeqslant{XXXX}{}
-% \showsymbol\nleqslant{XXXX}{}
-% \showsymbol\nleqq{XXXX}{}
-% \showsymbol\ncongdot{XXXX}{}
-% \showsymbol\napproxeqq{XXXX}{}
-% \showsymbol\nll{XXXX}{}
-% \showsymbol\ngg{XXXX}{}
-% \showsymbol\nsqsubset{XXXX}{}
-% \showsymbol\nsqsupset{XXXX}{}
-% \showsymbol\nBumpeq{XXXX}{}
-% \showsymbol\nbumpeq{XXXX}{}
-% \showsymbol\neqsim{XXXX}{}
-% \showsymbol\nvarisinobar{XXXX}{}
-% \showsymbol\nvarniobar{XXXX}{}
-% \showsymbol\neqslantless{XXXX}{}
-% \showsymbol\neqslantgtr{XXXX}{}
-% \showsymbol\lhook{XXXX}{}
-% \showsymbol\rhook{XXXX}{}
-% \showsymbol\relbar{XXXX}{}
-% \showsymbol\Relbar{XXXX}{}
-% \showsymbol\Rrelbar{XXXX}{*}
-% \showsymbol\RRelbar{XXXX}{*}
-% \showsymbol\mapsfromchar{XXXX}{}
-% \showsymbol\mapstochar{XXXX}{}
-% \end{multicols}
-%
-% \newpage
-% \subsection{Punctuation}
-% \begin{multicols}{2}
-% \showsymbol,{002C}{}
-% \showsymbol\ldotp{002E}{}
-% \showsymbol\colon{003A}{}
-% \showsymbol;{003B}{}
-% \end{multicols}
-%
-% \subsection{Integrals}
-% \label{integrals}
-% Integrals come in two styles, the slanted versions shown below ($\intsl$,
-% etc.)\ and upright versions such as~$\intup$. By default, the symbol names
-% listed below will give you the slanted style, but if you specify the |upint|
-% package option, they will give you the corresponding upright symbols.
-%
-% It is highly recommended that authors stick to the names below and use the
-% |upint| package option to choose a style globally for their document.
-% However, in recognition of the fact that it might occasionally be necessary
-% to mix the two styles, alternative names have been provided for all
-% integrals. Append |sl| or |up| to the names below to request either the
-% \emph{sl}anted or the \emph{up}right variant. Thus, |$\intsl$| will always
-% yield~$\intsl$ and |$\intup$| will always yield~$\intup$, and similarly for
-% the other integrals.
-%
-% \begin{multicols}{2}
-% \showsymbol\smallint{222B}{}
-% \showsymbol\smalliint{222C}{}
-% \showsymbol\smalliiint{222D}{}
-% \showsymbol\smalloint{222E}{}
-% \showsymbol\smalloiint{222F}{}
-% \showsymbol\smalloiiint{2230}{}
-% \showsymbol\smallintclockwise{2231}{}
-% \showsymbol\smallvarointclockwise{2232}{}
-% \showsymbol\smallointctrclockwise{2233}{}
-% \showsymbol\smallsumint{2A0B}{}
-% \showsymbol\smalliiiint{2A0C}{}
-% \showsymbol\smallintbar{2A0D}{}
-% \showsymbol\smallintBar{2A0E}{}
-% \showsymbol\smallfint{2A0F}{}
-% \showsymbol\smallcirfnint{2A10}{}
-% \showsymbol\smallawint{2A11}{}
-% \showsymbol\smallrppolint{2A12}{}
-% \showsymbol\smallscpolint{2A13}{}
-% \showsymbol\smallnpolint{2A14}{}
-% \showsymbol\smallpointint{2A15}{}
-% \showsymbol\smallsqint{2A16}{}
-% \showsymbol\smallintlarhk{2A17}{}
-% \showsymbol\smallintx{2A18}{}
-% \showsymbol\smallintcap{2A19}{}
-% \showsymbol\smallintcup{2A1A}{}
-% \showsymbol\smallupint{2A1B}{}
-% \showsymbol\smalllowint{2A1C}{}
-% \end{multicols}
-%
-% \begin{multicols}{2}
-% \showop\int{222B}{}
-% \showop\iint{222C}{}
-% \showop\iiint{222D}{}
-% \showop\oint{222E}{}
-% \showop\oiint{222F}{}
-% \showop\oiiint{2230}{}
-% \showop\intclockwise{2231}{}
-% \showop\varointclockwise{2232}{}
-% \showop\ointctrclockwise{2233}{}
-% \showop\sumint{2A0B}{}
-% \showop\iiiint{2A0C}{}
-% \showop\intbar{2A0D}{}
-% \showop\intBar{2A0E}{}
-% \showop\fint{2A0F}{}
-% \showop\cirfnint{2A10}{}
-% \showop\awint{2A11}{}
-% \showop\rppolint{2A12}{}
-% \showop\scpolint{2A13}{}
-% \showop\npolint{2A14}{}
-% \showop\pointint{2A15}{}
-% \showop\sqint{2A16}{}
-% \showop\intlarhk{2A17}{}
-% \showop\intx{2A18}{}
-% \showop\intcap{2A19}{}
-% \showop\intcup{2A1A}{}
-% \showop\upint{2A1B}{}
-% \showop\lowint{2A1C}{}
-% \end{multicols}
-%
-% \subsection{Big operators}
-% \begin{multicols}{2}
-% \showop\Bbbsum{2140}{}
-% \showop\prod{220F}{}
-% \showop\coprod{2210}{}
-% \showop\sum{2211}{}
-% \showop\bigwedge{22C0}{}
-% \showop\bigvee{22C1}{}
-% \showop\bigcap{22C2}{}
-% \showop\bigcup{22C3}{}
-% \showop\leftouterjoin{27D5}{*}
-% \showop\rightouterjoin{27D6}{*}
-% \showop\fullouterjoin{27D7}{*}
-% \showop\bigbot{27D8}{*}
-% \showop\bigtop{27D9}{*}
-% \showop\xsol{29F8}{*}
-% \showop\xbsol{29F9}{*}
-% \showop\bigodot{2A00}{*}
-% \showop\bigoplus{2A01}{*}
-% \showop\bigotimes{2A02}{*}
-% \showop\bigcupdot{2A03}{*}
-% \showop\biguplus{2A04}{*}
-% \showop\bigsqcap{2A05}{*}
-% \showop\bigsqcup{2A06}{*}
-% \showop\conjquant{2A07}{*}
-% \showop\disjquant{2A08}{*}
-% \showop\bigtimes{2A09}{*}
-% \showop\modtwosum{2A0A}{*}
-% \showop\Join{2A1D}{*}
-% \showop\bigtriangleleft{2A1E}{*}
-% \showop\zcmp{2A1F}{*}
-% \showop\zpipe{2A20}{*}
-% \showop\zproject{2A21}{*}
-% \showop\biginterleave{2AFC}{}
-% \showop\bigtalloblong{2AFF}{*}
-% \end{multicols}
-%
-% \subsection{Delimiters}
-% \showbrace({0028}){0029}{}
-% \showbrace[{005B}]{005D}{}
-% \showbrace\lbrace{007B}\rbrace{007D}{}
-% \showbrace\lceil{2308}\rceil{2309}{}
-% \showbrace\lfloor{230A}\rfloor{230B}{}
-% \showbrace\lmoustache{23B0}\rmoustache{23B1}{*}
-% \showbrace\lbrbrak{2772}\rbrbrak{2773}{*}
-% \showbrace\lBrack{27E6}\rBrack{27E7}{*}
-% \showbrace\langle{27E8}\rangle{27E9}{} (\cmd<, \cmd>)
-% \showbrace\lAngle{27EA}\rAngle{27EB}{*}
-% \showbrace\lgroup{27EE}\rgroup{27EF}{*}
-% \showbrace\lBrace{2983}\rBrace{2984}{*}
-% \showbrace\lParen{2985}\rParen{2986}{*}
-%
-% \begin{multicols}{2}
-% \showdelimiter\backslash{005C}{}
-% \showdelimiter/{002F}{}
-% \showdelimiter\vert{007C}{}, \cmd|
-% \showdelimiter\Vert{2016}{*}, \cmd\|
-% \showdelimiter\Vvert{2980}{}
-% \showdelimiter\uparrow{2191}{}
-% \showdelimiter\downarrow{2193}{}
-% \showdelimiter\updownarrow{2195}{}
-% \showdelimiter\Uparrow{21D1}{}
-% \showdelimiter\Downarrow{21D3}{}
-% \showdelimiter\Updownarrow{21D5}{}
-% \showdelimiter\Uuparrow{290A}{*}
-% \showdelimiter\Ddownarrow{290B}{*}
-% \showdelimiter\UUparrow{27F0}{*}
-% \showdelimiter\DDownarrow{27F1}{*}
-% \showdelimiter\arrowvert{XXXX}{}
-% \showdelimiter\Arrowvert{XXXX}{}
-% \showdelimiter\bracevert{XXXX}{*}
-% \end{multicols}
-%
-% \subsection{Other bracess}
-% \begin{multicols}{2}
-% \showsymbol\ulcorner{231C}{*}
-% \showsymbol\urcorner{231D}{*}
-% \showsymbol\llcorner{231E}{*}
-% \showsymbol\lrcorner{231F}{*}
-% \showsymbol\Lbrbrak{27EC}{*}
-% \showsymbol\Rbrbrak{27ED}{*}
-% \showsymbol\llparenthesis{2987}{*}
-% \showsymbol\rrparenthesis{2988}{*}
-% \showsymbol\llangle{2989}{*}
-% \showsymbol\rrangle{298A}{*}
-% \showsymbol\lbrackubar{298B}{*}
-% \showsymbol\rbrackubar{298C}{*}
-% \showsymbol\lbrackultick{298D}{*}
-% \showsymbol\rbracklrtick{298E}{*}
-% \showsymbol\lbracklltick{298F}{*}
-% \showsymbol\rbrackurtick{2990}{*}
-% \showsymbol\langledot{2991}{*}
-% \showsymbol\rangledot{2992}{*}
-% \showsymbol\lparenless{2993}{*}
-% \showsymbol\rparengtr{2994}{*}
-% \showsymbol\Lparengtr{2995}{*}
-% \showsymbol\Rparenless{2996}{*}
-% \showsymbol\lblkbrbrak{2997}{*}
-% \showsymbol\rblkbrbrak{2998}{*}
-% \showsymbol\lvzigzag{29D8}{*}
-% \showsymbol\rvzigzag{29D9}{*}
-% \showsymbol\Lvzigzag{29DA}{*}
-% \showsymbol\Rvzigzag{29DB}{*}
-% \showsymbol\lcurvyangle{29FC}{*}
-% \showsymbol\rcurvyangle{29FD}{*}
-% \showsymbol\lbrbrak{2772}{*}
-% \showsymbol\rbrbrak{2773}{*}
-% \showsymbol\lbag{27C5}{*}
-% \showsymbol\rbag{27C6}{*}
-% \showsymbol\Lbrbrak{27EC}{*}
-% \showsymbol\Rbrbrak{27ED}{*}
-% \end{multicols}
-%
-% \subsection{Accents}
-% \begin{multicols}{2}
-% \showaccent\grave{0300}{}
-% \showaccent\acute{0301}{}
-% \showaccent\hat{0302}{}
-% \showaccent\tilde{0303}{}
-% \showaccent\bar{0304}{}
-% \showaccent\breve{0306}{}
-% \showaccent\dot{0307}{}
-% \showaccent\ddot{0308}{}
-% \showaccent\ovhook{0309}{}
-% \showaccent\mathring{030A}{}
-% \showaccent\check{030C}{}
-% \showaccent\candra{0310}{}
-% \showaccent\oturnedcomma{0312}{}
-% \showaccent\ocommatopright{0315}{}
-% \showaccent\droang{031A}{}
-% \showaccent\leftharpoonaccent{20D0}{}
-% \showaccent\rightharpoonaccent{20D1}{}
-% \showaccent\leftarrowaccent{20D6}{}
-% \showaccent\vec{20D7}{}, \cmd\rightarrowaccent
-% \showaccent\leftrightarrowaccent{20E1}{}
-% \showaccent\dddot{20DB}{}
-% \showaccent\ddddot{20DC}{}
-% \showaccent\annuity{20E7}{}
-% \showaccent\widebridgeabove{20E9}{}
-% \showaccent\asteraccent{20F0}{}
-% \end{multicols}
-%
-% \begin{multicols}{2}
-% \showwideaccent\widehat{0302}{*}
-% \showwideaccent\widetilde{0303}{*}
-% \showwideaccent\widecheck{030C}{*}
-% \showwideaccent\overleftarrow{20D6}{}
-% \showwideaccent\overrightarrow{20D7}{}
-% \showwideaccent\underrightarrow{20EF}{}
-% \showwideaccent\underleftarrow{20EE}{}
-% \showwideaccent\overleftrightarrow{20E1}{}
-% \showwideaccent\underleftrightarrow{034D}{}
-% \showwideaccent\overleftharpoon{20D0}{}
-% \showwideaccent\overrightharpoon{20D1}{}
-% \showwideaccent\underleftharpoon{20EC}{}
-% \showwideaccent\underrightharpoon{20ED}{}
-% \end{multicols}
-%
-% OpenType STIX Two fonts include a number of under accents that can be used in
-% math mode, but \TeX\ does not support under accents natively so such glyphs
-% can not be used directly. Under accents can be set using regular accents and
-% commands like |\underaccent| from the \pkg{accents} package, for example
-% \verb|\underaccent{\hat}{X}| gives $\underaccent{\hat}{X}$. The
-% \pkg{undertilde} package provides |\utilde| for extensible under tilde
-% accent.
-%
-% \subsection{Over and under brackets}
-% \begin{multicols}{2}
-% \showover\overbracket{23B4}{}
-% \showover\overparen{23DC}{}
-% \showover\overbrace{23DE}{}
-% \showover\underbracket{23B5}{}
-% \showover\underparen{23DD}{}
-% \showover\underbrace{23DF}{}
-% \end{multicols}
-%
-% \subsection{Radicals}
-% \begin{multicols}{2}
-% \showaccent\sqrt{221A}{}
-% \showaccent\longdivision{27CC}{*}
-% \end{multicols}
-%
-% \newpage
-% \section{Font tables}
-% \nodecimals
-% \renewcommand{\thefootnote}{\fnsymbol{footnote}}
-% The rest of this document shows glyph tables for all STIX fonts. The name
-% before each table is the \TeX\ font name (i.e. TFM file name).
-%
-% \subsection{Text fonts}
-%
-% \subsubsection*{\texttt{ot1-stix2text}}
-% \fonttable{ot1-stix2text}
-%
-% \newpage
-% \subsubsection*{\texttt{ot1-stix2textsc}}
-% \fonttable{ot1-stix2textsc}
-%
-% \newpage
-% \subsubsection*{\texttt{t1-stix2text}}
-% \fonttable{t1-stix2text}
-%
-% \newpage
-% \subsubsection*{\texttt{t1-stix2textsc}}
-% \fonttable{t1-stix2textsc}
-%
-% \newpage
-% \subsubsection*{\texttt{ot2-stix2text}}
-% \fonttable{ot2-stix2text}
-%
-% \newpage
-% \subsubsection*{\texttt{ot2-stix2textsc}}
-% \fonttable{ot2-stix2textsc}
-%
-% \newpage
-% \subsubsection*{\texttt{ts1-stix2text}}
-% \fonttable{ts1-stix2text}
-%
-% \newpage
-% \subsection{Math fonts}
-% \subsubsection*{\texttt{stix2-mathrm}}
-% \fonttable{stix2-mathrm}
-%
-% \newpage
-% \subsubsection*{\texttt{stix2-mathit}}
-% \fonttable{stix2-mathit}
-%
-% \newpage
-% \subsubsection*{\texttt{stix2-mathsf}}
-% \fonttable{stix2-mathsf}
-%
-% \newpage
-% \subsubsection*{\texttt{stix2-mathsfit}}
-% \fonttable{stix2-mathsfit}
-%
-% \newpage
-% \subsubsection*{\texttt{stix2-mathtt}}
-% \fonttable{stix2-mathtt}
-%
-% \newpage
-% \subsubsection*{\texttt{stix2-mathbb}}
-% \fonttable{stix2-mathbb}
-%
-% \newpage
-% \subsubsection*{\texttt{stix2-mathbbit}}
-% \fonttable{stix2-mathbbit}
-%
-% \newpage
-% \subsubsection*{\texttt{stix2-mathscr}}
-% \fonttable{stix2-mathscr}
-%
-% \newpage
-% \subsubsection*{\texttt{stix2-mathcal}}
-% \fonttable{stix2-mathcal}
-%
-% \newpage
-% \subsubsection*{\texttt{stix2-mathfrak}}
-% \fonttable{stix2-mathfrak}
-%
-% \newpage
-% \subsubsection*{\texttt{stix2-mathex}}
-% \fonttable{stix2-mathex}
-%
-% \StopEventually{}
-% \endinput
-%
-% \section{Implementation}
-%
-% \iffalse
-%<*package>
-% \fi
-%
-% \subsection{Package options}
-%
-% \begin{macrocode}
-\newif\ifstix@text \stix@texttrue
-\newif\ifstix@math \stix@mathtrue
-\newif\ifstix@tenc \stix@tenctrue
-\newif\ifstix@senc \stix@senctrue
-\newif\ifstix@upint \stix@upintfalse
-\let\stix@lcgc\mathord
-\DeclareOption{notext} {\stix@textfalse}
-\DeclareOption{nomath} {\stix@mathfalse}
-\DeclareOption{not1} {\stix@tencfalse}
-\DeclareOption{notextcomp} {\stix@sencfalse}
-\DeclareOption{lcgreekalpha}{\let\stix@lcgc\mathalpha}
-\DeclareOption{upint} {\stix@upinttrue}
-\ProcessOptions\relax
-% \end{macrocode}
-%
-% \subsection{Text fonts}
-%
-% \begin{macrocode}
-\ifstix@text
- \ifstix@tenc
- \def\encodingdefault{T1}
- \fi
- \ifstix@senc
- \RequirePackage[full]{textcomp}
-% \end{macrocode}
-%
-% Use |\textpertenthousand| from TS1 font, for some reason \pkg{textcomp}
-% doesn't do so.
-%
-% \begin{macrocode}
- \UndeclareTextCommand{\textpertenthousand}{T1}
- \DeclareTextSymbolDefault{\textpertenthousand}{TS1}
- \fi
-
- \renewcommand{\rmdefault}{stix2}
-\fi
-% \end{macrocode}
-%
-% \subsection{Math fonts}
-%
-% \begin{macrocode}
-\ifstix@math
-% \end{macrocode}
-%
-% \subsubsection{Common macros}
-%
-% \begin{macrocode}
-\def\stix@undefine#1{%
- \if\relax\noexpand#1\let#1=\@undefined\fi}
-\def\stix@MathSymbol#1#2#3#4{%
- \stix@undefine#1%
- \DeclareMathSymbol{#1}{#2}{#3}{#4}}
-\def\stix@MathDelimiter#1#2#3#4#5#6{%
- \stix@undefine#1%
- \DeclareMathDelimiter{#1}{#2}{#3}{#4}{#5}{#6}}
-\def\stix@MathAccent#1#2#3#4{%
- \stix@undefine#1%
- \DeclareMathAccent{#1}{#2}{#3}{#4}}
-\def\stix@MathRadical#1#2#3#4{%
- \stix@undefine#1%
- \DeclareMathRadical{#1}{#2}{#3}{#4}}
-% \end{macrocode}
-%
-% \subsubsection{Declaring fonts}
-%
-% \begin{macrocode}
-\DeclareFontEncoding{LS1}{}{}
-\DeclareFontEncoding{LS2}{}{\noaccents@}
-\DeclareFontSubstitution{LS1}{stix2}{m}{n}
-\DeclareFontSubstitution{LS2}{stix2}{m}{n}
-\DeclareSymbolFont{letters} {LS1}{stix2} {m}{it}
-\DeclareSymbolFont{operators} {LS1}{stix2} {m} {n}
-\DeclareSymbolFont{bold-operators}{LS1}{stix2} {b} {n}
-\DeclareSymbolFont{symbols} {LS1}{stix2scr} {m} {n}
-\DeclareSymbolFont{symbols2} {LS1}{stix2frak} {m} {n}
-\DeclareSymbolFont{symbols3} {LS1}{stix2bb} {m} {n}
-\DeclareSymbolFont{symbols4} {LS1}{stix2bb} {m}{it}
-\DeclareSymbolFont{integrals} {LS2}{stix2cal} {m} {n}
-\DeclareSymbolFont{largesymbols} {LS2}{stix2ex} {m} {n}
-\DeclareSymbolFont{arrows1} {LS1}{stix2sf} {m} {n}
-\DeclareSymbolFont{arrows2} {LS1}{stix2sf} {m}{it}
-\DeclareSymbolFont{arrows3} {LS2}{stix2tt} {m} {n}
-\SetSymbolFont{letters} {bold}{LS1}{stix2} {b}{it}
-\SetSymbolFont{operators} {bold}{LS1}{stix2} {b} {n}
-\SetSymbolFont{symbols} {bold}{LS1}{stix2scr} {b} {n}
-\SetSymbolFont{symbols2} {bold}{LS1}{stix2frak} {b}{n}
-\SetSymbolFont{symbols3} {bold}{LS1}{stix2bb} {b} {n}
-\SetSymbolFont{symbols4} {bold}{LS1}{stix2bb} {b}{it}
-\SetSymbolFont{integrals} {bold}{LS2}{stix2cal} {b} {n}
-\SetSymbolFont{largesymbols}{bold}{LS2}{stix2ex} {b} {n}
-\SetSymbolFont{arrows1} {bold}{LS1}{stix2sf} {b} {n}
-\SetSymbolFont{arrows2} {bold}{LS1}{stix2sf} {b}{it}
-\SetSymbolFont{arrows3} {bold}{LS2}{stix2tt} {b} {n}
-\DeclareSymbolFontAlphabet{\mathit} {letters}
-\DeclareSymbolFontAlphabet{\mathrm} {operators}
-\DeclareSymbolFontAlphabet{\mathscr} {symbols}
-\DeclareSymbolFontAlphabet{\mathfrak}{symbols2}
-\DeclareSymbolFontAlphabet{\mathbb} {symbols3}
-\DeclareSymbolFontAlphabet{\mathcal} {integrals}
-\DeclareSymbolFontAlphabet{\mathsf} {arrows1}
-\DeclareSymbolFontAlphabet{\mathsfit}{arrows2}
-\DeclareSymbolFontAlphabet{\mathtt} {arrows3}
-% \end{macrocode}
-%
-% \paragraph{Bold alphabets}
-%
-% \begin{macrocode}
-\DeclareSymbolFontAlphabet{\mathbf} {bold-operators}
-\DeclareMathAlphabet{\mathbfit} {LS1}{stix2} {b}{it}
-\DeclareMathAlphabet{\mathbfsf} {LS1}{stix2sf} {b} {n}
-\DeclareMathAlphabet{\mathbfsfit} {LS1}{stix2sf} {b}{it}
-\DeclareMathAlphabet{\mathbfscr} {LS1}{stix2scr} {b} {n}
-\DeclareMathAlphabet{\mathbffrak} {LS1}{stix2frak} {b} {n}
-% \end{macrocode}
-%
-% \subsubsection{Declaring symbols}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\Gamma} {\mathalpha}{operators}{"00}
-\stix@MathSymbol{\Delta} {\mathalpha}{operators}{"01}
-\stix@MathSymbol{\Theta} {\mathalpha}{operators}{"02}
-\stix@MathSymbol{\Lambda} {\mathalpha}{operators}{"03}
-\stix@MathSymbol{\Xi} {\mathalpha}{operators}{"04}
-\stix@MathSymbol{\Pi} {\mathalpha}{operators}{"05}
-\stix@MathSymbol{\Sigma} {\mathalpha}{operators}{"06}
-\stix@MathSymbol{\Upsilon} {\mathalpha}{operators}{"07}
-\stix@MathSymbol{\Phi} {\mathalpha}{operators}{"08}
-\stix@MathSymbol{\Psi} {\mathalpha}{operators}{"09}
-\stix@MathSymbol{\Omega} {\mathalpha}{operators}{"0A}
-% \end{macrocode}
-%
-% In default \LaTeX\ setup, lower case Greek symbols are defined as |\mathord|
-% and thus they don't change when family changes, but they should be
-% |\mathalpha| to behave like other alphabetic symbols. For backward
-% compatibility, |\stix@lcgc| is |\mathord| by default and |\mathalpha| when
-% |lcgreekalpha| package option is specified.
-%
-% \begin{macrocode}
-\stix@MathSymbol{\alpha} {\stix@lcgc}{letters}{"0B}
-\stix@MathSymbol{\beta} {\stix@lcgc}{letters}{"0C}
-\stix@MathSymbol{\gamma} {\stix@lcgc}{letters}{"0D}
-\stix@MathSymbol{\delta} {\stix@lcgc}{letters}{"0E}
-\stix@MathSymbol{\epsilon} {\stix@lcgc}{letters}{"0F}
-\stix@MathSymbol{\zeta} {\stix@lcgc}{letters}{"10}
-\stix@MathSymbol{\eta} {\stix@lcgc}{letters}{"11}
-\stix@MathSymbol{\theta} {\stix@lcgc}{letters}{"12}
-\stix@MathSymbol{\iota} {\stix@lcgc}{letters}{"13}
-\stix@MathSymbol{\kappa} {\stix@lcgc}{letters}{"14}
-\stix@MathSymbol{\lambda} {\stix@lcgc}{letters}{"15}
-\stix@MathSymbol{\mu} {\stix@lcgc}{letters}{"16}
-\stix@MathSymbol{\nu} {\stix@lcgc}{letters}{"17}
-\stix@MathSymbol{\xi} {\stix@lcgc}{letters}{"18}
-\stix@MathSymbol{\pi} {\stix@lcgc}{letters}{"19}
-\stix@MathSymbol{\rho} {\stix@lcgc}{letters}{"1A}
-\stix@MathSymbol{\sigma} {\stix@lcgc}{letters}{"1B}
-\stix@MathSymbol{\tau} {\stix@lcgc}{letters}{"1C}
-\stix@MathSymbol{\upsilon} {\stix@lcgc}{letters}{"1D}
-\stix@MathSymbol{\phi} {\stix@lcgc}{letters}{"1E}
-\stix@MathSymbol{\chi} {\stix@lcgc}{letters}{"1F}
-\stix@MathSymbol{\psi} {\stix@lcgc}{letters}{"20}
-\stix@MathSymbol{\omega} {\stix@lcgc}{letters}{"21}
-\stix@MathSymbol{\varepsilon}{\stix@lcgc}{letters}{"22}
-\stix@MathSymbol{\vartheta} {\stix@lcgc}{letters}{"23}
-\stix@MathSymbol{\varpi} {\stix@lcgc}{letters}{"24}
-\stix@MathSymbol{\varrho} {\stix@lcgc}{letters}{"25}
-\stix@MathSymbol{\varsigma} {\stix@lcgc}{letters}{"26}
-\stix@MathSymbol{\varphi} {\stix@lcgc}{letters}{"27}
-\stix@MathSymbol{\nabla} {\stix@lcgc}{operators}{"28}
-\stix@MathSymbol{\partial} {\stix@lcgc}{letters}{"29}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\stix@MathSymbol{0} {\mathalpha}{operators}{`0}
-\stix@MathSymbol{1} {\mathalpha}{operators}{`1}
-\stix@MathSymbol{2} {\mathalpha}{operators}{`2}
-\stix@MathSymbol{3} {\mathalpha}{operators}{`3}
-\stix@MathSymbol{4} {\mathalpha}{operators}{`4}
-\stix@MathSymbol{5} {\mathalpha}{operators}{`5}
-\stix@MathSymbol{6} {\mathalpha}{operators}{`6}
-\stix@MathSymbol{7} {\mathalpha}{operators}{`7}
-\stix@MathSymbol{8} {\mathalpha}{operators}{`8}
-\stix@MathSymbol{9} {\mathalpha}{operators}{`9}
-\stix@MathSymbol{A} {\mathalpha}{letters} {`A}
-\stix@MathSymbol{B} {\mathalpha}{letters} {`B}
-\stix@MathSymbol{C} {\mathalpha}{letters} {`C}
-\stix@MathSymbol{D} {\mathalpha}{letters} {`D}
-\stix@MathSymbol{E} {\mathalpha}{letters} {`E}
-\stix@MathSymbol{F} {\mathalpha}{letters} {`F}
-\stix@MathSymbol{G} {\mathalpha}{letters} {`G}
-\stix@MathSymbol{H} {\mathalpha}{letters} {`H}
-\stix@MathSymbol{I} {\mathalpha}{letters} {`I}
-\stix@MathSymbol{J} {\mathalpha}{letters} {`J}
-\stix@MathSymbol{K} {\mathalpha}{letters} {`K}
-\stix@MathSymbol{L} {\mathalpha}{letters} {`L}
-\stix@MathSymbol{M} {\mathalpha}{letters} {`M}
-\stix@MathSymbol{N} {\mathalpha}{letters} {`N}
-\stix@MathSymbol{O} {\mathalpha}{letters} {`O}
-\stix@MathSymbol{P} {\mathalpha}{letters} {`P}
-\stix@MathSymbol{Q} {\mathalpha}{letters} {`Q}
-\stix@MathSymbol{R} {\mathalpha}{letters} {`R}
-\stix@MathSymbol{S} {\mathalpha}{letters} {`S}
-\stix@MathSymbol{T} {\mathalpha}{letters} {`T}
-\stix@MathSymbol{U} {\mathalpha}{letters} {`U}
-\stix@MathSymbol{V} {\mathalpha}{letters} {`V}
-\stix@MathSymbol{W} {\mathalpha}{letters} {`W}
-\stix@MathSymbol{X} {\mathalpha}{letters} {`X}
-\stix@MathSymbol{Y} {\mathalpha}{letters} {`Y}
-\stix@MathSymbol{Z} {\mathalpha}{letters} {`Z}
-\stix@MathSymbol{a} {\mathalpha}{letters} {`a}
-\stix@MathSymbol{b} {\mathalpha}{letters} {`b}
-\stix@MathSymbol{c} {\mathalpha}{letters} {`c}
-\stix@MathSymbol{d} {\mathalpha}{letters} {`d}
-\stix@MathSymbol{e} {\mathalpha}{letters} {`e}
-\stix@MathSymbol{f} {\mathalpha}{letters} {`f}
-\stix@MathSymbol{g} {\mathalpha}{letters} {`g}
-\stix@MathSymbol{h} {\mathalpha}{letters} {`h}
-\stix@MathSymbol{i} {\mathalpha}{letters} {`i}
-\stix@MathSymbol{j} {\mathalpha}{letters} {`j}
-\stix@MathSymbol{k} {\mathalpha}{letters} {`k}
-\stix@MathSymbol{l} {\mathalpha}{letters} {`l}
-\stix@MathSymbol{m} {\mathalpha}{letters} {`m}
-\stix@MathSymbol{n} {\mathalpha}{letters} {`n}
-\stix@MathSymbol{o} {\mathalpha}{letters} {`o}
-\stix@MathSymbol{p} {\mathalpha}{letters} {`p}
-\stix@MathSymbol{q} {\mathalpha}{letters} {`q}
-\stix@MathSymbol{r} {\mathalpha}{letters} {`r}
-\stix@MathSymbol{s} {\mathalpha}{letters} {`s}
-\stix@MathSymbol{t} {\mathalpha}{letters} {`t}
-\stix@MathSymbol{u} {\mathalpha}{letters} {`u}
-\stix@MathSymbol{v} {\mathalpha}{letters} {`v}
-\stix@MathSymbol{w} {\mathalpha}{letters} {`w}
-\stix@MathSymbol{x} {\mathalpha}{letters} {`x}
-\stix@MathSymbol{y} {\mathalpha}{letters} {`y}
-\stix@MathSymbol{z} {\mathalpha}{letters} {`z}
-\stix@MathSymbol{\imath}{\mathalpha}{letters} {"7B}
-\stix@MathSymbol{\jmath}{\mathalpha}{letters} {"7C}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\aleph} {\mathord}{letters}{"2A}
-\stix@MathSymbol{\beth} {\mathord}{letters}{"2B}
-\stix@MathSymbol{\gimel} {\mathord}{letters}{"2C}
-\stix@MathSymbol{\daleth}{\mathord}{letters}{"2D}
-\stix@MathSymbol{\hbar} {\mathord}{letters}{"60}
-\stix@MathSymbol{\hslash}{\mathord}{letters}{"3D}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\ell} {\mathord} {symbols}{`l}
-\stix@MathSymbol{\wp} {\mathord} {symbols}{"7D}
-\stix@MathSymbol{\Re} {\mathord} {symbols2}{`R}
-\stix@MathSymbol{\Im} {\mathord} {symbols2}{`I}
-\stix@MathSymbol{-} {\mathbin} {operators}{"2A}
-\stix@MathSymbol{+} {\mathbin} {operators}{`+}
-\stix@MathSymbol{\pm} {\mathbin} {operators}{"2C}
-\stix@MathSymbol{\mp} {\mathbin} {operators}{"2D}
-\stix@MathSymbol{:} {\mathrel} {operators}{`:}
-\stix@MathSymbol{;} {\mathpunct}{operators}{`;}
-\stix@MathSymbol{*} {\mathrel} {operators}{"3C}
-\stix@MathSymbol{\ast} {\mathrel} {operators}{"3C}
-\stix@MathSymbol{=} {\mathrel} {operators}{`=}
-\stix@MathSymbol{\mathdollar}{\mathord} {operators}{"3E}
-\stix@MathSymbol{?} {\mathclose}{operators}{`?}
-\stix@MathSymbol{!} {\mathclose}{operators}{"40}
-\stix@MathSymbol{#} {\mathord} {operators}{"7D}
-\mathcode`\%="007E % can't use \stix@MathSymbol
-\stix@MathSymbol{&} {\mathord} {operators}{"99}
-\stix@MathSymbol{@} {\mathord} {operators}{"9A}
-\stix@MathSymbol{.} {\mathord} {letters} {"3A}
-\stix@MathSymbol{\ldotp} {\mathpunct}{letters} {"3A}
-\stix@MathSymbol{,} {\mathpunct}{letters} {"3B}
-\stix@MathSymbol{\star} {\mathbin} {letters} {"3F}
-\stix@MathSymbol{\flat} {\mathord} {letters} {"5B}
-\stix@MathSymbol{\natural} {\mathord} {letters} {"5C}
-\stix@MathSymbol{\sharp} {\mathord} {letters} {"5D}
-\stix@MathSymbol{\smile} {\mathrel} {letters} {"5E}
-\stix@MathSymbol{\frown} {\mathrel} {letters} {"5F}
-\stix@MathSymbol{\triangleright} {\mathbin}{letters}{"2E}
-\stix@MathSymbol{\triangleleft} {\mathbin}{letters}{"2F}
-% \end{macrocode}
-%
-% \pkg{amsmath} defines |\colon| in a clever way, we want to retain that.
-%
-% \begin{macrocode}
-\@ifpackageloaded{amsmath}{}{
- \stix@MathSymbol{\colon} {\mathpunct}{operators}{`:}
-}
-% \end{macrocode}
-%
-% \paragraph{Delimiters}
-%
-% \begin{macrocode}
-\stix@MathDelimiter{(} {\mathopen} {operators} {"2E}{largesymbols}{"00}
-\stix@MathDelimiter{)} {\mathclose}{operators} {"2F}{largesymbols}{"01}
-\stix@MathDelimiter{\lParen} {\mathopen} {largesymbols}{"DE}{largesymbols}{"02}
-\stix@MathDelimiter{\rParen} {\mathclose}{largesymbols}{"DF}{largesymbols}{"03}
-\stix@MathDelimiter{[} {\mathopen} {operators} {"5B}{largesymbols}{"04}
-\stix@MathDelimiter{]} {\mathclose}{operators} {"5D}{largesymbols}{"05}
-\stix@MathDelimiter{\lBrack} {\mathopen} {largesymbols}{"E0}{largesymbols}{"06}
-\stix@MathDelimiter{\rBrack} {\mathclose}{largesymbols}{"E1}{largesymbols}{"07}
-\stix@MathDelimiter{\lfloor} {\mathopen} {largesymbols}{"E2}{largesymbols}{"08}
-\stix@MathDelimiter{\rfloor} {\mathclose}{largesymbols}{"E3}{largesymbols}{"09}
-\stix@MathDelimiter{\lceil} {\mathopen} {largesymbols}{"E4}{largesymbols}{"0A}
-\stix@MathDelimiter{\rceil} {\mathclose}{largesymbols}{"E5}{largesymbols}{"0B}
-\stix@MathDelimiter{\lmoustache}{\mathopen} {largesymbols}{"E6}{largesymbols}{"EC}
-\stix@MathDelimiter{\rmoustache}{\mathclose}{largesymbols}{"E7}{largesymbols}{"ED}
-\stix@MathDelimiter{\lbrace} {\mathopen} {operators} {"5E}{largesymbols}{"0C}
-\stix@MathDelimiter{\rbrace} {\mathclose}{operators} {"60}{largesymbols}{"0D}
-\stix@MathDelimiter{\lBrace} {\mathopen} {largesymbols}{"E8}{largesymbols}{"0E}
-\stix@MathDelimiter{\rBrace} {\mathclose}{largesymbols}{"E9}{largesymbols}{"0F}
-\stix@MathDelimiter{\langle} {\mathopen} {largesymbols}{"EA}{largesymbols}{"10}
-\stix@MathDelimiter{\rangle} {\mathclose}{largesymbols}{"EB}{largesymbols}{"11}
-\stix@MathDelimiter{<} {\mathopen} {largesymbols}{"EA}{largesymbols}{"10}
-\stix@MathDelimiter{>} {\mathclose}{largesymbols}{"EB}{largesymbols}{"11}
-\stix@MathSymbol {<} {\mathrel} {letters}{"3C}
-\stix@MathSymbol {>} {\mathrel} {letters}{"3E}
-\stix@MathDelimiter{\lAngle} {\mathopen} {largesymbols}{"EC}{largesymbols}{"12}
-\stix@MathDelimiter{\rAngle} {\mathclose}{largesymbols}{"ED}{largesymbols}{"13}
-\stix@MathDelimiter{\lbrbrak} {\mathopen} {largesymbols}{"EE}{largesymbols}{"14}
-\stix@MathDelimiter{\rbrbrak} {\mathclose}{largesymbols}{"EF}{largesymbols}{"15}
-\stix@MathDelimiter{/} {\mathord} {operators} {"5F}{largesymbols}{"16}
-\stix@MathDelimiter{\backslash} {\mathord} {operators} {"5C}{largesymbols}{"17}
-\expandafter\DeclareMathDelimiter\@backslashchar{\mathord}{operators}{"5C}{largesymbols}{"17}
-\stix@MathDelimiter{\lgroup} {\mathopen} {largesymbols}{"DC}{largesymbols}{"6A}
-\stix@MathDelimiter{\rgroup} {\mathclose}{largesymbols}{"DD}{largesymbols}{"6B}
-\stix@MathDelimiter{\bracevert} {\mathord} {largesymbols}{"6E}{largesymbols}{"6E}
-\stix@MathDelimiter{|} {\mathord} {largesymbols}{"F0}{largesymbols}{"F3}
-\stix@MathDelimiter{\vert} {\mathord} {largesymbols}{"F0}{largesymbols}{"F3}
-\stix@MathDelimiter{\Vert} {\mathord} {largesymbols}{"F1}{largesymbols}{"F4}
- \let\|=\Vert
-\stix@MathDelimiter{\Vvert} {\mathord} {largesymbols}{"F2}{largesymbols}{"F5}
-% \end{macrocode}
-%
-% Override |\lvert|, |\rvert|, |\lVert| and |\rVert| from \pkg{amsmath}.
-%
-% \begin{macrocode}
-\@ifpackageloaded{amsmath}{
- \stix@MathDelimiter{\lvert} {\mathopen} {largesymbols}{"F0}{largesymbols}{"F3}
- \stix@MathDelimiter{\rvert} {\mathclose} {largesymbols}{"F0}{largesymbols}{"F3}
- \stix@MathDelimiter{\lVert} {\mathopen} {largesymbols}{"F1}{largesymbols}{"F4}
- \stix@MathDelimiter{\rVert} {\mathclose} {largesymbols}{"F1}{largesymbols}{"F4}
-}{}
-\stix@MathDelimiter{\uparrow} {\mathrel}{arrows1}{"7E}{arrows1}{"7E}
-\stix@MathDelimiter{\downarrow} {\mathrel}{arrows1}{"9A}{arrows1}{"9A}
-\stix@MathDelimiter{\updownarrow}{\mathrel}{arrows1}{"9C}{arrows1}{"9C}
-\stix@MathDelimiter{\Uparrow} {\mathrel}{arrows1}{"D8}{arrows1}{"D8}
-\stix@MathDelimiter{\Downarrow} {\mathrel}{arrows1}{"DA}{arrows1}{"DA}
-\stix@MathDelimiter{\Updownarrow}{\mathrel}{arrows1}{"DC}{arrows1}{"DC}
-\stix@MathDelimiter{\UUparrow} {\mathrel}{arrows1}{"FE}{arrows1}{"FE}
-\stix@MathDelimiter{\DDownarrow} {\mathrel}{arrows1}{"FF}{arrows1}{"FF}
-\stix@MathDelimiter{\Uuparrow} {\mathrel}{arrows1}{"5F}{arrows1}{"5F}
-\stix@MathDelimiter{\Ddownarrow} {\mathrel}{arrows1}{"60}{arrows1}{"60}
-\stix@MathDelimiter{\arrowvert} {\mathrel}{arrows1}{"3C}{arrows1}{"3C}
-\stix@MathDelimiter{\Arrowvert} {\mathrel}{arrows1}{"3D}{arrows1}{"3D}
-% \end{macrocode}
-%
-% \paragraph{Radicals}
-%
-% \begin{macrocode}
-\stix@MathRadical{\sqrtsign} {largesymbols}{"F9}{largesymbols}{"74}
-\stix@MathRadical{\longdivision}{largesymbols}{"FA}{largesymbols}{"FA}
-\def\surd{{\mathchar"13F9}}
-% \end{macrocode}
-%
-% \paragraph{Integrals}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\smallintsl} {\mathop}{integrals}{"00}
-\stix@MathSymbol{\smalliintsl} {\mathop}{integrals}{"01}
-\stix@MathSymbol{\smalliiintsl} {\mathop}{integrals}{"02}
-\stix@MathSymbol{\smallointsl} {\mathop}{integrals}{"03}
-\stix@MathSymbol{\smalloiintsl} {\mathop}{integrals}{"04}
-\stix@MathSymbol{\smalloiiintsl} {\mathop}{integrals}{"05}
-\stix@MathSymbol{\smallintclockwisesl} {\mathop}{integrals}{"06}
-\stix@MathSymbol{\smallvarointclockwisesl}{\mathop}{integrals}{"07}
-\stix@MathSymbol{\smallointctrclockwisesl}{\mathop}{integrals}{"08}
-\stix@MathSymbol{\smallsumintsl} {\mathop}{integrals}{"09}
-\stix@MathSymbol{\smalliiiintsl} {\mathop}{integrals}{"0A}
-\stix@MathSymbol{\smallintbarsl} {\mathop}{integrals}{"0B}
-\stix@MathSymbol{\smallintBarsl} {\mathop}{integrals}{"0C}
-\stix@MathSymbol{\smallfintsl} {\mathop}{integrals}{"0D}
-\stix@MathSymbol{\smallcirfnintsl} {\mathop}{integrals}{"0E}
-\stix@MathSymbol{\smallawintsl} {\mathop}{integrals}{"0F}
-\stix@MathSymbol{\smallrppolintsl} {\mathop}{integrals}{"10}
-\stix@MathSymbol{\smallscpolintsl} {\mathop}{integrals}{"11}
-\stix@MathSymbol{\smallnpolintsl} {\mathop}{integrals}{"12}
-\stix@MathSymbol{\smallpointintsl} {\mathop}{integrals}{"13}
-\stix@MathSymbol{\smallsqintsl} {\mathop}{integrals}{"14}
-\stix@MathSymbol{\smallintlarhksl} {\mathop}{integrals}{"15}
-\stix@MathSymbol{\smallintxsl} {\mathop}{integrals}{"16}
-\stix@MathSymbol{\smallintcapsl} {\mathop}{integrals}{"17}
-\stix@MathSymbol{\smallintcupsl} {\mathop}{integrals}{"18}
-\stix@MathSymbol{\smallupintsl} {\mathop}{integrals}{"19}
-\stix@MathSymbol{\smalllowintsl} {\mathop}{integrals}{"1A}
-\stix@MathSymbol{\smallintup} {\mathop}{integrals}{"1B}
-\stix@MathSymbol{\smalliintup} {\mathop}{integrals}{"1C}
-\stix@MathSymbol{\smalliiintup} {\mathop}{integrals}{"1D}
-\stix@MathSymbol{\smallointup} {\mathop}{integrals}{"1E}
-\stix@MathSymbol{\smalloiintup} {\mathop}{integrals}{"1F}
-\stix@MathSymbol{\smalloiiintup} {\mathop}{integrals}{"20}
-\stix@MathSymbol{\smallintclockwiseup} {\mathop}{integrals}{"21}
-\stix@MathSymbol{\smallvarointclockwiseup}{\mathop}{integrals}{"22}
-\stix@MathSymbol{\smallointctrclockwiseup}{\mathop}{integrals}{"23}
-\stix@MathSymbol{\smallsumintup} {\mathop}{integrals}{"24}
-\stix@MathSymbol{\smalliiiintup} {\mathop}{integrals}{"25}
-\stix@MathSymbol{\smallintbarup} {\mathop}{integrals}{"26}
-\stix@MathSymbol{\smallintBarup} {\mathop}{integrals}{"27}
-\stix@MathSymbol{\smallfintup} {\mathop}{integrals}{"28}
-\stix@MathSymbol{\smallcirfnintup} {\mathop}{integrals}{"29}
-\stix@MathSymbol{\smallawintup} {\mathop}{integrals}{"2A}
-\stix@MathSymbol{\smallrppolintup} {\mathop}{integrals}{"2B}
-\stix@MathSymbol{\smallscpolintup} {\mathop}{integrals}{"2C}
-\stix@MathSymbol{\smallnpolintup} {\mathop}{integrals}{"2D}
-\stix@MathSymbol{\smallpointintup} {\mathop}{integrals}{"2E}
-\stix@MathSymbol{\smallsqintup} {\mathop}{integrals}{"2F}
-\stix@MathSymbol{\smallintlarhkup} {\mathop}{integrals}{"30}
-\stix@MathSymbol{\smallintxup} {\mathop}{integrals}{"31}
-\stix@MathSymbol{\smallintcapup} {\mathop}{integrals}{"32}
-\stix@MathSymbol{\smallintcupup} {\mathop}{integrals}{"33}
-\stix@MathSymbol{\smallupintup} {\mathop}{integrals}{"34}
-\stix@MathSymbol{\smalllowintup} {\mathop}{integrals}{"35}
-\stix@MathSymbol{\intslop} {\mathop}{integrals}{"94}
-\stix@MathSymbol{\iintslop} {\mathop}{integrals}{"95}
-\stix@MathSymbol{\iiintslop} {\mathop}{integrals}{"96}
-\stix@MathSymbol{\ointslop} {\mathop}{integrals}{"97}
-\stix@MathSymbol{\oiintslop} {\mathop}{integrals}{"98}
-\stix@MathSymbol{\oiiintslop} {\mathop}{integrals}{"99}
-\stix@MathSymbol{\intclockwiseslop} {\mathop}{integrals}{"9A}
-\stix@MathSymbol{\varointclockwiseslop} {\mathop}{integrals}{"9B}
-\stix@MathSymbol{\ointctrclockwiseslop} {\mathop}{integrals}{"9C}
-\stix@MathSymbol{\sumintslop} {\mathop}{integrals}{"9D}
-\stix@MathSymbol{\iiiintslop} {\mathop}{integrals}{"9E}
-\stix@MathSymbol{\intbarslop} {\mathop}{integrals}{"9F}
-\stix@MathSymbol{\intBarslop} {\mathop}{integrals}{"A0}
-\stix@MathSymbol{\fintslop} {\mathop}{integrals}{"A1}
-\stix@MathSymbol{\cirfnintslop} {\mathop}{integrals}{"A2}
-\stix@MathSymbol{\awintslop} {\mathop}{integrals}{"A3}
-\stix@MathSymbol{\rppolintslop} {\mathop}{integrals}{"A4}
-\stix@MathSymbol{\scpolintslop} {\mathop}{integrals}{"A5}
-\stix@MathSymbol{\npolintslop} {\mathop}{integrals}{"A6}
-\stix@MathSymbol{\pointintslop} {\mathop}{integrals}{"A7}
-\stix@MathSymbol{\sqintslop} {\mathop}{integrals}{"A8}
-\stix@MathSymbol{\intlarhkslop} {\mathop}{integrals}{"A9}
-\stix@MathSymbol{\intxslop} {\mathop}{integrals}{"AA}
-\stix@MathSymbol{\intcapslop} {\mathop}{integrals}{"AB}
-\stix@MathSymbol{\intcupslop} {\mathop}{integrals}{"AC}
-\stix@MathSymbol{\upintslop} {\mathop}{integrals}{"AD}
-\stix@MathSymbol{\lowintslop} {\mathop}{integrals}{"AE}
-\stix@MathSymbol{\intupop} {\mathop}{integrals}{"AF}
-\stix@MathSymbol{\iintupop} {\mathop}{integrals}{"B0}
-\stix@MathSymbol{\iiintupop} {\mathop}{integrals}{"B1}
-\stix@MathSymbol{\ointupop} {\mathop}{integrals}{"B2}
-\stix@MathSymbol{\oiintupop} {\mathop}{integrals}{"B3}
-\stix@MathSymbol{\oiiintupop} {\mathop}{integrals}{"B4}
-\stix@MathSymbol{\intclockwiseupop} {\mathop}{integrals}{"B5}
-\stix@MathSymbol{\varointclockwiseupop} {\mathop}{integrals}{"B6}
-\stix@MathSymbol{\ointctrclockwiseupop} {\mathop}{integrals}{"B7}
-\stix@MathSymbol{\sumintupop} {\mathop}{integrals}{"B8}
-\stix@MathSymbol{\iiiintupop} {\mathop}{integrals}{"B9}
-\stix@MathSymbol{\intbarupop} {\mathop}{integrals}{"BA}
-\stix@MathSymbol{\intBarupop} {\mathop}{integrals}{"BB}
-\stix@MathSymbol{\fintupop} {\mathop}{integrals}{"BC}
-\stix@MathSymbol{\cirfnintupop} {\mathop}{integrals}{"BD}
-\stix@MathSymbol{\awintupop} {\mathop}{integrals}{"BE}
-\stix@MathSymbol{\rppolintupop} {\mathop}{integrals}{"BF}
-\stix@MathSymbol{\scpolintupop} {\mathop}{integrals}{"C0}
-\stix@MathSymbol{\npolintupop} {\mathop}{integrals}{"C1}
-\stix@MathSymbol{\pointintupop} {\mathop}{integrals}{"C2}
-\stix@MathSymbol{\sqintupop} {\mathop}{integrals}{"C3}
-\stix@MathSymbol{\intlarhkupop} {\mathop}{integrals}{"C4}
-\stix@MathSymbol{\intxupop} {\mathop}{integrals}{"C5}
-\stix@MathSymbol{\intcapupop} {\mathop}{integrals}{"C6}
-\stix@MathSymbol{\intcupupop} {\mathop}{integrals}{"C7}
-\stix@MathSymbol{\upintupop} {\mathop}{integrals}{"C8}
-\stix@MathSymbol{\lowintupop} {\mathop}{integrals}{"C9}
-
-\stix@MathSymbol{\circledS} {\mathord}{integrals}{"3B}
-\stix@MathSymbol{\diagdown} {\mathord}{integrals}{"3C}
-\stix@MathSymbol{\diagup} {\mathord}{integrals}{"3D}
-\stix@MathSymbol{\eth} {\mathord}{integrals}{"3E}
-\stix@MathSymbol{\smallfrown} {\mathrel}{integrals}{"3F}
-\stix@MathSymbol{\smallsmile} {\mathrel}{integrals}{"40}
-\stix@MathSymbol{\gvertneqq} {\mathrel}{integrals}{"5B}
-\stix@MathSymbol{\lvertneqq} {\mathrel}{integrals}{"5C}
-\stix@MathSymbol{\nshortmid} {\mathrel}{integrals}{"5D}
-\stix@MathSymbol{\nshortparallel} {\mathrel}{integrals}{"5E}
-\stix@MathSymbol{\shortmid} {\mathrel}{integrals}{"5F}
-\stix@MathSymbol{\shortparallel} {\mathrel}{integrals}{"60}
-\stix@MathSymbol{\varsubsetneq} {\mathrel}{integrals}{"61}
-\stix@MathSymbol{\varsupsetneq} {\mathrel}{integrals}{"62}
-\stix@MathSymbol{\varsubsetneqq} {\mathrel}{integrals}{"63}
-\stix@MathSymbol{\varsupsetneqq} {\mathrel}{integrals}{"64}
-\stix@MathSymbol{\varkappa} {\mathord}{integrals}{"7A}
-\stix@MathSymbol{\digamma} {\mathord}{integrals}{"7B}
-\stix@MathSymbol{\backepsilon} {\mathord}{integrals}{"7C}
-\stix@MathSymbol{\varpropto} {\mathrel}{integrals}{"7E}
-% \end{macrocode}
-%
-% For compatibility with \pkg{amsfonts} where they are defined to work both in
-% text and math mode.
-%
-% \begin{macrocode}
-\stix@MathSymbol{\yenmath} {\mathord}{integrals}{"7D}
-\stix@MathSymbol{\circledRmath} {\mathord}{integrals}{"3A}
-\stix@MathSymbol{\maltesemath} {\mathord}{arrows3}{"83}
-\stix@MathSymbol{\circledstar} {\mathord}{arrows3}{"84}
-\DeclareRobustCommand\yen{%
- \ifmmode\yenmath\else{\fontencoding{TS1}\selectfont\char"A5}\fi}
-\DeclareRobustCommand\circledR{%
- \ifmmode\circledRmath\else{\fontencoding{TS1}\selectfont\char"AE}\fi}
-\DeclareRobustCommand\checkmark{\ensuremath{\checkmarkmath}}
-\DeclareRobustCommand\maltese{\ensuremath{\maltesemath}}
-% \end{macrocode}
-%
-% When |upint| package option is specified, integrals will be upright by
-% default.
-%
-% \begin{macrocode}
-\ifstix@upint
- \let\smallint=\smallintup
- \let\smalliint=\smalliintup
- \let\smalliiint=\smalliiintup
- \let\smalloint=\smallointup
- \let\smalloiint=\smalloiintup
- \let\smalloiiint=\smalloiiintup
- \let\smallintclockwise=\smallintclockwiseup
- \let\smallvarointclockwise=\smallvarointclockwiseup
- \let\smallointctrclockwise=\smallointctrclockwiseup
- \let\smallsumint=\smallsumintup
- \let\smalliiiint=\smalliiiintup
- \let\smallintbar=\smallintbarup
- \let\smallintBar=\smallintBarup
- \let\smallfint=\smallfintup
- \let\smallcirfnint=\smallcirfnintup
- \let\smallawint=\smallawintup
- \let\smallrppolint=\smallrppolintup
- \let\smallscpolint=\smallscpolintup
- \let\smallnpolint=\smallnpolintup
- \let\smallpointint=\smallpointintup
- \let\smallsqint=\smallsqintup
- \let\smallintlarhk=\smallintlarhkup
- \let\smallintx=\smallintxup
- \let\smallintcap=\smallintcapup
- \let\smallintcup=\smallintcupup
- \let\smallupint=\smallupintup
- \let\smalllowint=\smalllowintup
- \let\intop=\intupop
- \let\iintop=\iintupop
- \let\iiintop=\iiintupop
- \let\ointop=\ointupop
- \let\oiintop=\oiintupop
- \let\oiiintop=\oiiintupop
- \let\intclockwiseop=\intclockwiseupop
- \let\varointclockwiseop=\varointclockwiseupop
- \let\ointctrclockwiseop=\ointctrclockwiseupop
- \let\sumintop=\sumintupop
- \let\iiiintop=\iiiintupop
- \let\intbarop=\intbarupop
- \let\intBarop=\intBarupop
- \let\fintop=\fintupop
- \let\cirfnintop=\cirfnintupop
- \let\awintop=\awintupop
- \let\rppolintop=\rppolintupop
- \let\scpolintop=\scpolintupop
- \let\npolintop=\npolintupop
- \let\pointintop=\pointintupop
- \let\sqintop=\sqintupop
- \let\intlarhkop=\intlarhkupop
- \let\intxop=\intxupop
- \let\intcapop=\intcapupop
- \let\intcupop=\intcupupop
- \let\upintop=\upintupop
- \let\lowintop=\lowintupop
-\else
- \let\smallint=\smallintsl
- \let\smalliint=\smalliintsl
- \let\smalliiint=\smalliiintsl
- \let\smalloint=\smallointsl
- \let\smalloiint=\smalloiintsl
- \let\smalloiiint=\smalloiiintsl
- \let\smallintclockwise=\smallintclockwisesl
- \let\smallvarointclockwise=\smallvarointclockwisesl
- \let\smallointctrclockwise=\smallointctrclockwisesl
- \let\smallsumint=\smallsumintsl
- \let\smalliiiint=\smalliiiintsl
- \let\smallintbar=\smallintbarsl
- \let\smallintBar=\smallintBarsl
- \let\smallfint=\smallfintsl
- \let\smallcirfnint=\smallcirfnintsl
- \let\smallawint=\smallawintsl
- \let\smallrppolint=\smallrppolintsl
- \let\smallscpolint=\smallscpolintsl
- \let\smallnpolint=\smallnpolintsl
- \let\smallpointint=\smallpointintsl
- \let\smallsqint=\smallsqintsl
- \let\smallintlarhk=\smallintlarhksl
- \let\smallintx=\smallintxsl
- \let\smallintcap=\smallintcapsl
- \let\smallintcup=\smallintcupsl
- \let\smallupint=\smallupintsl
- \let\smalllowint=\smalllowintsl
- \let\intop=\intslop
- \let\iintop=\iintslop
- \let\iiintop=\iiintslop
- \let\ointop=\ointslop
- \let\oiintop=\oiintslop
- \let\oiiintop=\oiiintslop
- \let\intclockwiseop=\intclockwiseslop
- \let\varointclockwiseop=\varointclockwiseslop
- \let\ointctrclockwiseop=\ointctrclockwiseslop
- \let\sumintop=\sumintslop
- \let\iiiintop=\iiiintslop
- \let\intbarop=\intbarslop
- \let\intBarop=\intBarslop
- \let\fintop=\fintslop
- \let\cirfnintop=\cirfnintslop
- \let\awintop=\awintslop
- \let\rppolintop=\rppolintslop
- \let\scpolintop=\scpolintslop
- \let\npolintop=\npolintslop
- \let\pointintop=\pointintslop
- \let\sqintop=\sqintslop
- \let\intlarhkop=\intlarhkslop
- \let\intxop=\intxslop
- \let\intcapop=\intcapslop
- \let\intcupop=\intcupslop
- \let\upintop=\upintslop
- \let\lowintop=\lowintslop
-\fi
-\def\int{\DOTSI\intop\ilimits@}
-\def\iint{\DOTSI\iintop\ilimits@}
-\def\iiint{\DOTSI\iiintop\ilimits@}
-\def\oint{\DOTSI\ointop\ilimits@}
-\def\oiint{\DOTSI\oiintop\ilimits@}
-\def\oiiint{\DOTSI\oiiintop\ilimits@}
-\def\intclockwise{\DOTSI\intclockwiseop\ilimits@}
-\def\varointclockwise{\DOTSI\varointclockwiseop\ilimits@}
-\def\ointctrclockwise{\DOTSI\ointctrclockwiseop\ilimits@}
-\def\sumint{\DOTSI\sumintop\ilimits@}
-\def\iiiint{\DOTSI\iiiintop\ilimits@}
-\def\intbar{\DOTSI\intbarop\ilimits@}
-\def\intBar{\DOTSI\intBarop\ilimits@}
-\def\fint{\DOTSI\fintop\ilimits@}
-\def\cirfnint{\DOTSI\cirfnintop\ilimits@}
-\def\awint{\DOTSI\awintop\ilimits@}
-\def\rppolint{\DOTSI\rppolintop\ilimits@}
-\def\scpolint{\DOTSI\scpolintop\ilimits@}
-\def\npolint{\DOTSI\npolintop\ilimits@}
-\def\pointint{\DOTSI\pointintop\ilimits@}
-\def\sqint{\DOTSI\sqintop\ilimits@}
-\def\intlarhk{\DOTSI\intlarhkop\ilimits@}
-\def\intx{\DOTSI\intxop\ilimits@}
-\def\intcap{\DOTSI\intcapop\ilimits@}
-\def\intcup{\DOTSI\intcupop\ilimits@}
-\def\upint{\DOTSI\upintop\ilimits@}
-\def\lowint{\DOTSI\lowintop\ilimits@}
-% \end{macrocode}
-%
-% Upright integrals can be accessed using |up| suffix, and |sl| for slanted,
-% despite the default integrals shape.
-%
-% \begin{macrocode}
-\def\intsl{\DOTSI\intslop\ilimits@}
-\def\iintsl{\DOTSI\iintslop\ilimits@}
-\def\iiintsl{\DOTSI\iiintslop\ilimits@}
-\def\ointsl{\DOTSI\ointslop\ilimits@}
-\def\oiintsl{\DOTSI\oiintslop\ilimits@}
-\def\oiiintsl{\DOTSI\oiiintslop\ilimits@}
-\def\intclockwisesl{\DOTSI\intclockwiseslop\ilimits@}
-\def\varointclockwisesl{\DOTSI\varointclockwiseslop\ilimits@}
-\def\ointctrclockwisesl{\DOTSI\ointctrclockwiseslop\ilimits@}
-\def\sumintsl{\DOTSI\sumintslop\ilimits@}
-\def\iiiintsl{\DOTSI\iiiintslop\ilimits@}
-\def\intbarsl{\DOTSI\intbarslop\ilimits@}
-\def\intBarsl{\DOTSI\intBarslop\ilimits@}
-\def\fintsl{\DOTSI\fintslop\ilimits@}
-\def\cirfnintsl{\DOTSI\cirfnintslop\ilimits@}
-\def\awintsl{\DOTSI\awintslop\ilimits@}
-\def\rppolintsl{\DOTSI\rppolintslop\ilimits@}
-\def\scpolintsl{\DOTSI\scpolintslop\ilimits@}
-\def\npolintsl{\DOTSI\npolintslop\ilimits@}
-\def\pointintsl{\DOTSI\pointintslop\ilimits@}
-\def\sqintsl{\DOTSI\sqintslop\ilimits@}
-\def\intlarhksl{\DOTSI\intlarhkslop\ilimits@}
-\def\intxsl{\DOTSI\intxslop\ilimits@}
-\def\intcapsl{\DOTSI\intcapslop\ilimits@}
-\def\intcupsl{\DOTSI\intcupslop\ilimits@}
-\def\upintsl{\DOTSI\upintslop\ilimits@}
-\def\lowintsl{\DOTSI\lowintslop\ilimits@}
-\def\intup{\DOTSI\intupop\ilimits@}
-\def\iintup{\DOTSI\iintupop\ilimits@}
-\def\iiintup{\DOTSI\iiintupop\ilimits@}
-\def\ointup{\DOTSI\ointupop\ilimits@}
-\def\oiintup{\DOTSI\oiintupop\ilimits@}
-\def\oiiintup{\DOTSI\oiiintupop\ilimits@}
-\def\intclockwiseup{\DOTSI\intclockwiseupop\ilimits@}
-\def\varointclockwiseup{\DOTSI\varointclockwiseupop\ilimits@}
-\def\ointctrclockwiseup{\DOTSI\ointctrclockwiseupop\ilimits@}
-\def\sumintup{\DOTSI\sumintupop\ilimits@}
-\def\iiiintup{\DOTSI\iiiintupop\ilimits@}
-\def\intbarup{\DOTSI\intbarupop\ilimits@}
-\def\intBarup{\DOTSI\intBarupop\ilimits@}
-\def\fintup{\DOTSI\fintupop\ilimits@}
-\def\cirfnintup{\DOTSI\cirfnintupop\ilimits@}
-\def\awintup{\DOTSI\awintupop\ilimits@}
-\def\rppolintup{\DOTSI\rppolintupop\ilimits@}
-\def\scpolintup{\DOTSI\scpolintupop\ilimits@}
-\def\npolintup{\DOTSI\npolintupop\ilimits@}
-\def\pointintup{\DOTSI\pointintupop\ilimits@}
-\def\sqintup{\DOTSI\sqintupop\ilimits@}
-\def\intlarhkup{\DOTSI\intlarhkupop\ilimits@}
-\def\intxup{\DOTSI\intxupop\ilimits@}
-\def\intcapup{\DOTSI\intcapupop\ilimits@}
-\def\intcupup{\DOTSI\intcupupop\ilimits@}
-\def\upintup{\DOTSI\upintupop\ilimits@}
-\def\lowintup{\DOTSI\lowintupop\ilimits@}
-% \end{macrocode}
-%
-% \paragraph{Big operators}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\Bbbsumop} {\mathop}{largesymbols}{"B0}
-\stix@MathSymbol{\prodop} {\mathop}{largesymbols}{"B1}
-\stix@MathSymbol{\coprodop} {\mathop}{largesymbols}{"B2}
-\stix@MathSymbol{\sumop} {\mathop}{largesymbols}{"B3}
-\stix@MathSymbol{\bigwedgeop} {\mathop}{largesymbols}{"B4}
-\stix@MathSymbol{\bigveeop} {\mathop}{largesymbols}{"B5}
-\stix@MathSymbol{\bigcapop} {\mathop}{largesymbols}{"B6}
-\stix@MathSymbol{\bigcupop} {\mathop}{largesymbols}{"B7}
-\stix@MathSymbol{\xsolop} {\mathop}{largesymbols}{"B8}
-\stix@MathSymbol{\xbsolop} {\mathop}{largesymbols}{"B9}
-\stix@MathSymbol{\bigodotop} {\mathop}{largesymbols}{"BA}
-\stix@MathSymbol{\bigoplusop} {\mathop}{largesymbols}{"BB}
-\stix@MathSymbol{\bigotimesop} {\mathop}{largesymbols}{"BC}
-\stix@MathSymbol{\bigcupdotop} {\mathop}{largesymbols}{"BD}
-\stix@MathSymbol{\biguplusop} {\mathop}{largesymbols}{"BE}
-\stix@MathSymbol{\bigsqcapop} {\mathop}{largesymbols}{"BF}
-\stix@MathSymbol{\bigsqcupop} {\mathop}{largesymbols}{"C0}
-\stix@MathSymbol{\conjquantop} {\mathop}{largesymbols}{"C1}
-\stix@MathSymbol{\disjquantop} {\mathop}{largesymbols}{"C2}
-\stix@MathSymbol{\bigtimesop} {\mathop}{largesymbols}{"C3}
-\stix@MathSymbol{\modtwosumop} {\mathop}{largesymbols}{"C4}
-\stix@MathSymbol{\bigtalloblongop} {\mathop}{largesymbols}{"C5}
-\def\Bbbsum{\DOTSI\Bbbsumop\slimits@}
-\def\prod{\DOTSI\prodop\slimits@}
-\def\coprod{\DOTSI\coprodop\slimits@}
-\def\sum{\DOTSI\sumop\slimits@}
-\def\bigwedge{\DOTSI\bigwedgeop\slimits@}
-\def\bigvee{\DOTSI\bigveeop\slimits@}
-\def\bigcap{\DOTSI\bigcapop\slimits@}
-\def\bigcup{\DOTSI\bigcupop\slimits@}
-\def\xsol{\DOTSI\xsolop\slimits@}
-\def\xbsol{\DOTSI\xbsolop\slimits@}
-\def\bigodot{\DOTSI\bigodotop\slimits@}
-\def\bigoplus{\DOTSI\bigoplusop\slimits@}
-\def\bigotimes{\DOTSI\bigotimesop\slimits@}
-\def\bigcupdot{\DOTSI\bigcupdotop\slimits@}
-\def\biguplus{\DOTSI\biguplusop\slimits@}
-\def\bigsqcap{\DOTSI\bigsqcapop\slimits@}
-\def\bigsqcup{\DOTSI\bigsqcupop\slimits@}
-\def\conjquant{\DOTSI\conjquantop\slimits@}
-\def\disjquant{\DOTSI\disjquantop\slimits@}
-\def\bigtimes{\DOTSI\bigtimesop\slimits@}
-\def\modtwosum{\DOTSI\modtwosumop\slimits@}
-\def\bigtalloblong{\DOTSI\bigtalloblongop\slimits@}
-% \end{macrocode}
-%
-% \paragraph{Math accents}
-%
-% \begin{macrocode}
-\stix@MathAccent{\grave} {\mathalpha}{letters}{"80}
-\stix@MathAccent{\acute} {\mathalpha}{letters}{"81}
-\stix@MathAccent{\hat} {\mathalpha}{letters}{"82}
-\stix@MathAccent{\tilde} {\mathalpha}{letters}{"83}
-\stix@MathAccent{\bar} {\mathalpha}{letters}{"84}
-\stix@MathAccent{\breve} {\mathalpha}{letters}{"85}
-\stix@MathAccent{\dot} {\mathalpha}{letters}{"86}
-\stix@MathAccent{\ddot} {\mathalpha}{letters}{"87}
-\stix@MathAccent{\ovhook} {\mathalpha}{letters}{"88}
-\stix@MathAccent{\mathring} {\mathalpha}{letters}{"89}
-\stix@MathAccent{\check} {\mathalpha}{letters}{"8A}
-\stix@MathAccent{\candra} {\mathalpha}{letters}{"8B}
-\stix@MathAccent{\oturnedcomma} {\mathalpha}{letters}{"8C}
-\stix@MathAccent{\ocommatopright} {\mathalpha}{letters}{"8D}
-\stix@MathAccent{\droang} {\mathalpha}{letters}{"8E}
-\stix@MathAccent{\leftharpoonaccent} {\mathalpha}{letters}{"8F}
-\stix@MathAccent{\rightharpoonaccent} {\mathalpha}{letters}{"90}
-\stix@MathAccent{\leftarrowaccent} {\mathalpha}{letters}{"91}
-\stix@MathAccent{\vec} {\mathalpha}{letters}{"92}
- % not \let because amsmath redefines \vec
- \def\rightarrowaccent{\vec}
-\stix@MathAccent{\dddot} {\mathalpha}{letters}{"93}
-\stix@MathAccent{\ddddot} {\mathalpha}{letters}{"94}
-\stix@MathAccent{\leftrightarrowaccent} {\mathalpha}{letters}{"95}
-\stix@MathAccent{\annuity} {\mathalpha}{letters}{"96}
-\stix@MathAccent{\widebridgeabove} {\mathalpha}{letters}{"97}
-\stix@MathAccent{\asteraccent} {\mathalpha}{letters}{"98}
-% \end{macrocode}
-%
-% \pkg{amsmath} breaks our wide accents, so we make sure its
-% |\set@mathaccent| has no effect while defining them.
-%
-% \begin{macrocode}
-\begingroup
- \def\set@mathaccent#1#2#3#4{%
- \xdef#2{\mathaccent"\mathchar@type#3\hexnumber@#1#4\relax}}
- \stix@MathAccent{\widehat} {\mathord}{letters}{"9A}
- \stix@MathAccent{\widetilde} {\mathord}{letters}{"9B}
- \stix@MathAccent{\widecheck} {\mathord}{letters}{"9C}
-\endgroup
-% \end{macrocode}
-%
-% \paragraph{Over/under braces and brackets}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\braceld}{\mathord}{letters}{"A9}
-\stix@MathSymbol{\bracerd}{\mathord}{letters}{"AA}
-\stix@MathSymbol{\bracelu}{\mathord}{letters}{"AB}
-\stix@MathSymbol{\braceru}{\mathord}{letters}{"AC}
-\stix@MathSymbol{\braceex}{\mathord}{letters}{"AD}
-\stix@MathSymbol{\bracemu}{\mathord}{letters}{"AE}
-\stix@MathSymbol{\bracemd}{\mathord}{letters}{"AF}
-\stix@MathSymbol{\parenld}{\mathord}{letters}{"B0}
-\stix@MathSymbol{\parenrd}{\mathord}{letters}{"B1}
-\stix@MathSymbol{\parenlu}{\mathord}{letters}{"B2}
-\stix@MathSymbol{\parenru}{\mathord}{letters}{"B3}
-\stix@MathSymbol{\bracketld}{\mathord}{letters}{"B4}
-\stix@MathSymbol{\bracketrd}{\mathord}{letters}{"B5}
-\stix@MathSymbol{\bracketlu}{\mathord}{letters}{"B6}
-\stix@MathSymbol{\bracketru}{\mathord}{letters}{"B7}
-\def\stix@braceglue{\hskip -.09em plus .09em}
-\def\downbracefill{$\m@th%
- \braceld\stix@braceglue%
- \cleaders\hbox{$\braceex$}\hfill%
- \stix@braceglue\bracemu\stix@braceglue%
- \cleaders\hbox{$\braceex$}\hfill%
- \stix@braceglue\bracerd$}
-\def\upbracefill{$\m@th%
- \bracelu\stix@braceglue%
- \cleaders\hbox{$\braceex$}\hfill%
- \stix@braceglue\bracemd\stix@braceglue%
- \cleaders\hbox{$\braceex$}\hfill%
- \stix@braceglue\braceru$}
-\def\stix@parenglue{\hskip -.08em plus .08em}
-\def\downparenfill{$\m@th%
- \parenld\stix@parenglue%
- \cleaders\hbox{$\braceex$}\hfill%
- \stix@parenglue\parenrd$}
-\def\upparenfill{$\m@th%
- \parenlu\stix@parenglue%
- \cleaders\hbox{$\braceex$}\hfill%
- \stix@parenglue\parenru$}
-\def\stix@bracketglue{\hskip -.27em plus .27em}
-\def\downbracketfill{$\m@th%
- \bracketld\stix@bracketglue%
- \cleaders\hbox{$\braceex$}\hfill%
- \stix@bracketglue\bracketrd$}
-\def\upbracketfill{$\m@th%
- \bracketlu\stix@bracketglue%
- \cleaders\hbox{$\braceex$}\hfill%
- \stix@bracketglue\bracketru$}
-\def\stix@overbrace#1#2{%
- \mathop {%
- \vbox {%
- \m@th%
- \ialign{##\crcr%
- \noalign{\kern.3\fontdimen5\textfont2}%
- \csname down#1fill\endcsname\crcr%
- \noalign{\kern.5\fontdimen5\textfont2\nointerlineskip}%
- $\hfil\displaystyle{#2}\hfil$\crcr%
- }%
- }%
- }%
- \limits%
-}
-\def\stix@underbrace#1#2{
- \mathop {%
- \vtop {%
- \m@th%
- \ialign{##\crcr%
- $\hfil\displaystyle{#2}\hfil$\crcr%
- \noalign{\kern.5\fontdimen5\textfont2\nointerlineskip}%
- \csname up#1fill\endcsname\crcr%
- \noalign{\kern.3\fontdimen5\textfont2}%
- }%
- }%
- }%
- \limits%
-}
-\def\overbrace#1{\stix@overbrace{brace}{#1}}
-\def\overparen#1{\stix@overbrace{paren}{#1}}
-\def\underbrace#1{\stix@underbrace{brace}{#1}}
-\def\underparen#1{\stix@underbrace{paren}{#1}}
-% \end{macrocode}
-%
-% \pkg{mathtools} defines over/under brackets that takes optional arguments,
-% we want to retain that.
-%
-% \begin{macrocode}
-\AtBeginDocument{
- \@ifpackageloaded{mathtools}{}{
- \def\underbracket#1{\stix@underbrace{bracket}{#1}}
- \def\overbracket#1{\stix@overbrace{bracket}{#1}}
- }
-}
-% \end{macrocode}
-%
-% \paragraph{Over/under arrows}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\arrowaccentex} {\mathord}{letters}{"99}
-\stix@MathSymbol{\harpoonaccentlt}{\mathord}{letters}{"8F}
-\stix@MathSymbol{\harpoonaccentrt}{\mathord}{letters}{"90}
-\stix@MathSymbol{\arrowaccentlt} {\mathord}{letters}{"91}
-\stix@MathSymbol{\arrowaccentrt} {\mathord}{letters}{"92}
-\def\stix@arrowaccentglue{\hskip -.23em plus .23em}
-\def\overleftarrowfill{$\m@th%
- \arrowaccentlt\stix@arrowaccentglue%
- \cleaders\hbox{$\arrowaccentex$}\hfill$}
-\def\overrightarrowfill{$\m@th%
- \cleaders\hbox{$\arrowaccentex$}\hfill%
- \stix@arrowaccentglue\arrowaccentrt$}
-\def\overleftrightarrowfill{$\m@th%
- \arrowaccentlt\stix@arrowaccentglue%
- \cleaders\hbox{$\arrowaccentex$}\hfill%
- \stix@arrowaccentglue\arrowaccentrt$}
-\def\overleftharpoonfill{$\m@th%
- \harpoonaccentlt\stix@arrowaccentglue%
- \cleaders\hbox{$\arrowaccentex$}\hfill$}
-\def\overrightharpoonfill{$\m@th%
- \cleaders\hbox{$\arrowaccentex$}\hfill%
- \stix@arrowaccentglue\harpoonaccentrt$}
-\def\stix@overarrow#1#2#3{%
- \vbox {%
- \m@th%
- \ialign{##\crcr%
- \csname over#1fill\endcsname\crcr%
- \noalign{\kern -1ex\nointerlineskip}%
- $\hfil#2#3\hfil$\crcr%
- }%
- }%
-}
-\def\stix@underarrow#1#2#3{
- \vtop {%
- \m@th%
- \ialign{##\crcr%
- $\hfil#2#3\hfil$\crcr%
- \noalign{\kern .2ex\nointerlineskip}%
- \csname over#1fill\endcsname\crcr%
- \noalign{\kern -1ex\nointerlineskip}%
- }%
- }%
-}
-\def\overleftarrow{\mathpalette{\stix@overarrow{leftarrow}}}
-\def\overrightarrow{\mathpalette{\stix@overarrow{rightarrow}}}
-\def\overleftrightarrow{\mathpalette{\stix@overarrow{leftrightarrow}}}
-\def\overleftharpoon{\mathpalette{\stix@overarrow{leftharpoon}}}
-\def\overrightharpoon{\mathpalette{\stix@overarrow{rightharpoon}}}
-\def\underleftarrow{\mathpalette{\stix@underarrow{leftarrow}}}
-\def\underrightarrow{\mathpalette{\stix@underarrow{rightarrow}}}
-\def\underleftrightarrow{\mathpalette{\stix@underarrow{leftrightarrow}}}
-\def\underleftharpoon{\mathpalette{\stix@underarrow{leftharpoon}}}
-\def\underrightharpoon{\mathpalette{\stix@underarrow{rightharpoon}}}
-% \end{macrocode}
-%
-% \paragraph{Arrows}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\lhook} {\mathrel}{arrows1}{"2A}
-\stix@MathSymbol{\rhook} {\mathrel}{arrows1}{"2B}
-\stix@MathSymbol{\relbar} {\mathrel}{arrows1}{"2C}
-\stix@MathSymbol{\Relbar} {\mathrel}{arrows1}{"2D}
-\stix@MathSymbol{\Rrelbar} {\mathrel}{arrows1}{"2E}
-\stix@MathSymbol{\RRelbar} {\mathrel}{arrows1}{"2F}
-
-\stix@MathSymbol{\mapsfromchar} {\mathrel}{arrows1}{"3A}
-\stix@MathSymbol{\mapstochar} {\mathrel}{arrows1}{"3B}
-\stix@MathSymbol{\rightarrowbackapprox} {\mathrel}{arrows1}{"40}
-\stix@MathSymbol{\similarleftarrow} {\mathrel}{arrows1}{"5B}
-\stix@MathSymbol{\leftarrowapprox} {\mathrel}{arrows1}{"5C}
-\stix@MathSymbol{\leftarrowbsimilar} {\mathrel}{arrows1}{"5D}
-\stix@MathSymbol{\rightarrowbsimilar} {\mathrel}{arrows1}{"5E}
-\stix@MathSymbol{\leftarrow} {\mathrel}{arrows1}{"7D} \let\gets=\leftarrow
-\stix@MathSymbol{\rightarrow} {\mathrel}{arrows1}{"99} \let\to=\rightarrow
-\stix@MathSymbol{\leftrightarrow} {\mathrel}{arrows1}{"9B}
-\stix@MathSymbol{\nwarrow} {\mathrel}{arrows1}{"9D}
-\stix@MathSymbol{\nearrow} {\mathrel}{arrows1}{"9E}
-\stix@MathSymbol{\searrow} {\mathrel}{arrows1}{"9F}
-
-\stix@MathSymbol{\swarrow} {\mathrel}{arrows1}{"A0}
-\stix@MathSymbol{\nleftarrow} {\mathrel}{arrows1}{"A1}
-\stix@MathSymbol{\nrightarrow} {\mathrel}{arrows1}{"A2}
-\stix@MathSymbol{\leftwavearrow} {\mathrel}{arrows1}{"A3}
-\stix@MathSymbol{\rightwavearrow} {\mathrel}{arrows1}{"A4}
-\stix@MathSymbol{\twoheadleftarrow} {\mathrel}{arrows1}{"A5}
-\stix@MathSymbol{\twoheaduparrow} {\mathrel}{arrows1}{"A6}
-\stix@MathSymbol{\twoheadrightarrow} {\mathrel}{arrows1}{"A7}
-\stix@MathSymbol{\twoheaddownarrow} {\mathrel}{arrows1}{"A8}
-\stix@MathSymbol{\leftarrowtail} {\mathrel}{arrows1}{"A9}
-\stix@MathSymbol{\rightarrowtail} {\mathrel}{arrows1}{"AA}
-\stix@MathSymbol{\mapsfrom} {\mathrel}{arrows1}{"AB}
-\stix@MathSymbol{\mapsup} {\mathrel}{arrows1}{"AC}
-\stix@MathSymbol{\mapsto} {\mathrel}{arrows1}{"AD}
-\stix@MathSymbol{\mapsdown} {\mathrel}{arrows1}{"AE}
-\stix@MathSymbol{\updownarrowbar} {\mathord}{arrows1}{"AF}
-
-\stix@MathSymbol{\hookleftarrow} {\mathrel}{arrows1}{"B0}
-\stix@MathSymbol{\hookrightarrow} {\mathrel}{arrows1}{"B1}
-\stix@MathSymbol{\looparrowleft} {\mathrel}{arrows1}{"B2}
-\stix@MathSymbol{\looparrowright} {\mathrel}{arrows1}{"B3}
-\stix@MathSymbol{\leftrightsquigarrow} {\mathrel}{arrows1}{"B4}
-\stix@MathSymbol{\nleftrightarrow} {\mathrel}{arrows1}{"B5}
-\stix@MathSymbol{\downzigzagarrow} {\mathrel}{arrows1}{"B6}
-\stix@MathSymbol{\Lsh} {\mathrel}{arrows1}{"B7}
-\stix@MathSymbol{\Rsh} {\mathrel}{arrows1}{"B8}
-\stix@MathSymbol{\Ldsh} {\mathrel}{arrows1}{"B9}
-\stix@MathSymbol{\Rdsh} {\mathrel}{arrows1}{"BA}
-\stix@MathSymbol{\linefeed} {\mathord}{arrows1}{"BB}
-\stix@MathSymbol{\carriagereturn} {\mathord}{arrows1}{"BC}
-\stix@MathSymbol{\curvearrowleft} {\mathrel}{arrows1}{"BD}
-\stix@MathSymbol{\curvearrowright} {\mathrel}{arrows1}{"BE}
-\stix@MathSymbol{\barovernorthwestarrow} {\mathord}{arrows1}{"BF}
-
-\stix@MathSymbol{\barleftarrowrightarrowbar}{\mathord}{arrows1}{"C0}
-\stix@MathSymbol{\acwopencirclearrow} {\mathord}{arrows1}{"C1} \stix@MathSymbol{\circlearrowleft} {\mathrel}{arrows1}{"C1}
-\stix@MathSymbol{\cwopencirclearrow} {\mathord}{arrows1}{"C2} \stix@MathSymbol{\circlearrowright}{\mathrel}{arrows1}{"C2}
-\stix@MathSymbol{\leftharpoonup} {\mathrel}{arrows1}{"C3}
-\stix@MathSymbol{\leftharpoondown} {\mathrel}{arrows1}{"C4}
-\stix@MathSymbol{\upharpoonright} {\mathrel}{arrows1}{"C5} \let\restriction=\upharpoonright
-\stix@MathSymbol{\upharpoonleft} {\mathrel}{arrows1}{"C6}
-\stix@MathSymbol{\rightharpoonup} {\mathrel}{arrows1}{"C7}
-\stix@MathSymbol{\rightharpoondown} {\mathrel}{arrows1}{"C8}
-\stix@MathSymbol{\downharpoonright} {\mathrel}{arrows1}{"C9}
-\stix@MathSymbol{\downharpoonleft} {\mathrel}{arrows1}{"CA}
-\stix@MathSymbol{\rightleftarrows} {\mathrel}{arrows1}{"CB}
-\stix@MathSymbol{\updownarrows} {\mathrel}{arrows1}{"CC}
-\stix@MathSymbol{\leftrightarrows} {\mathrel}{arrows1}{"CD}
-\stix@MathSymbol{\leftleftarrows} {\mathrel}{arrows1}{"CE}
-\stix@MathSymbol{\upuparrows} {\mathrel}{arrows1}{"CF}
-
-\stix@MathSymbol{\rightrightarrows} {\mathrel}{arrows1}{"D0}
-\stix@MathSymbol{\downdownarrows} {\mathrel}{arrows1}{"D1}
-\stix@MathSymbol{\leftrightharpoons} {\mathrel}{arrows1}{"D2}
-\stix@MathSymbol{\rightleftharpoons} {\mathrel}{arrows1}{"D3}
-\stix@MathSymbol{\nLeftarrow} {\mathrel}{arrows1}{"D4}
-\stix@MathSymbol{\nLeftrightarrow} {\mathrel}{arrows1}{"D5}
-\stix@MathSymbol{\nRightarrow} {\mathrel}{arrows1}{"D6}
-\stix@MathSymbol{\Leftarrow} {\mathrel}{arrows1}{"D7}
-\stix@MathSymbol{\Rightarrow} {\mathrel}{arrows1}{"D9}
-\stix@MathSymbol{\Leftrightarrow} {\mathrel}{arrows1}{"DB}
-\stix@MathSymbol{\Nwarrow} {\mathrel}{arrows1}{"DD}
-\stix@MathSymbol{\Nearrow} {\mathrel}{arrows1}{"DE}
-\stix@MathSymbol{\Searrow} {\mathrel}{arrows1}{"DF}
-
-\stix@MathSymbol{\Swarrow} {\mathrel}{arrows1}{"E0}
-\stix@MathSymbol{\Lleftarrow} {\mathrel}{arrows1}{"E1}
-\stix@MathSymbol{\Rrightarrow} {\mathrel}{arrows1}{"E2}
-\stix@MathSymbol{\leftsquigarrow} {\mathrel}{arrows1}{"E3}
-\stix@MathSymbol{\rightsquigarrow} {\mathrel}{arrows1}{"E4} \let\leadsto=\rightsquigarrow
-\stix@MathSymbol{\nHuparrow} {\mathord}{arrows1}{"E5}
-\stix@MathSymbol{\nHdownarrow} {\mathord}{arrows1}{"E6}
-\stix@MathSymbol{\leftdasharrow} {\mathord}{arrows1}{"E7}
-\stix@MathSymbol{\updasharrow} {\mathord}{arrows1}{"E8}
-\stix@MathSymbol{\rightdasharrow} {\mathord}{arrows1}{"E9}
-\stix@MathSymbol{\downdasharrow} {\mathord}{arrows1}{"EA}
-\stix@MathSymbol{\barleftarrow} {\mathrel}{arrows1}{"EB}
-\stix@MathSymbol{\rightarrowbar} {\mathrel}{arrows1}{"EC}
-\stix@MathSymbol{\leftwhitearrow} {\mathord}{arrows1}{"ED}
-\stix@MathSymbol{\upwhitearrow} {\mathord}{arrows1}{"EE}
-\stix@MathSymbol{\rightwhitearrow} {\mathord}{arrows1}{"EF}
-
-\stix@MathSymbol{\downwhitearrow} {\mathord}{arrows1}{"F0}
-\stix@MathSymbol{\whitearrowupfrombar} {\mathord}{arrows1}{"F1}
-\stix@MathSymbol{\circleonrightarrow} {\mathrel}{arrows1}{"F2}
-\stix@MathSymbol{\downuparrows} {\mathrel}{arrows1}{"F3}
-\stix@MathSymbol{\rightthreearrows} {\mathrel}{arrows1}{"F4}
-\stix@MathSymbol{\nvleftarrow} {\mathrel}{arrows1}{"F5}
-\stix@MathSymbol{\nvrightarrow} {\mathrel}{arrows1}{"F6}
-\stix@MathSymbol{\nvleftrightarrow} {\mathrel}{arrows1}{"F7}
-\stix@MathSymbol{\nVleftarrow} {\mathrel}{arrows1}{"F8}
-\stix@MathSymbol{\nVrightarrow} {\mathrel}{arrows1}{"F9}
-\stix@MathSymbol{\nVleftrightarrow} {\mathrel}{arrows1}{"FA}
-\stix@MathSymbol{\leftarrowtriangle} {\mathrel}{arrows1}{"FB}
-\stix@MathSymbol{\rightarrowtriangle} {\mathrel}{arrows1}{"FC}
-\stix@MathSymbol{\leftrightarrowtriangle} {\mathrel}{arrows1}{"FD}
-
-\stix@MathSymbol{\leftarrowonoplus} {\mathrel}{arrows2}{"2A}
-\stix@MathSymbol{\longleftsquigarrow} {\mathrel}{arrows2}{"2B}
-\stix@MathSymbol{\nvtwoheadleftarrow} {\mathrel}{arrows2}{"2C}
-\stix@MathSymbol{\nVtwoheadleftarrow} {\mathrel}{arrows2}{"2D}
-\stix@MathSymbol{\twoheadmapsfrom} {\mathrel}{arrows2}{"2E}
-\stix@MathSymbol{\twoheadleftdbkarrow} {\mathrel}{arrows2}{"2F}
-\stix@MathSymbol{\leftdotarrow} {\mathrel}{arrows2}{"3A}
-\stix@MathSymbol{\nvleftarrowtail} {\mathrel}{arrows2}{"3B}
-\stix@MathSymbol{\nVleftarrowtail} {\mathrel}{arrows2}{"3C}
-\stix@MathSymbol{\twoheadleftarrowtail} {\mathrel}{arrows2}{"3D}
-\stix@MathSymbol{\nvtwoheadleftarrowtail} {\mathrel}{arrows2}{"3E}
-\stix@MathSymbol{\nVtwoheadleftarrowtail} {\mathrel}{arrows2}{"3F}
-\stix@MathSymbol{\leftarrowx} {\mathrel}{arrows2}{"40}
-\stix@MathSymbol{\leftcurvedarrow} {\mathrel}{arrows2}{"5B}
-\stix@MathSymbol{\equalleftarrow} {\mathrel}{arrows2}{"5C}
-\stix@MathSymbol{\bsimilarleftarrow} {\mathrel}{arrows2}{"5D}
-\stix@MathSymbol{\leftarrowbackapprox} {\mathrel}{arrows2}{"5E}
-\stix@MathSymbol{\rightarrowgtr} {\mathrel}{arrows2}{"5F}
-\stix@MathSymbol{\rightarrowsupset} {\mathrel}{arrows2}{"60}
-\stix@MathSymbol{\LLeftarrow} {\mathrel}{arrows2}{"7D}
-\stix@MathSymbol{\RRightarrow} {\mathrel}{arrows2}{"7E}
-
-\stix@MathSymbol{\nvtwoheadrightarrow} {\mathrel}{arrows2}{"99}
-\stix@MathSymbol{\nVtwoheadrightarrow} {\mathrel}{arrows2}{"9A}
-\stix@MathSymbol{\nvLeftarrow} {\mathrel}{arrows2}{"9B}
-\stix@MathSymbol{\nvRightarrow} {\mathrel}{arrows2}{"9C}
-\stix@MathSymbol{\nvLeftrightarrow} {\mathrel}{arrows2}{"9D}
-\stix@MathSymbol{\twoheadmapsto} {\mathrel}{arrows2}{"9E}
-\stix@MathSymbol{\Mapsfrom} {\mathrel}{arrows2}{"9F}
-
-\stix@MathSymbol{\Mapsto} {\mathrel}{arrows2}{"A0}
-\stix@MathSymbol{\downarrowbarred} {\mathrel}{arrows2}{"A1}
-\stix@MathSymbol{\uparrowbarred} {\mathrel}{arrows2}{"A2}
-\stix@MathSymbol{\circleonleftarrow} {\mathrel}{arrows2}{"A3}
-\stix@MathSymbol{\leftthreearrows} {\mathrel}{arrows2}{"A4}
-\stix@MathSymbol{\leftbkarrow} {\mathrel}{arrows2}{"A5}
-\stix@MathSymbol{\rightbkarrow} {\mathrel}{arrows2}{"A6}
-\stix@MathSymbol{\leftdbkarrow} {\mathrel}{arrows2}{"A7} \let\dashleftarrow=\leftdbkarrow
-\stix@MathSymbol{\dbkarow} {\mathrel}{arrows2}{"A8} \let\dashrightarrow=\dbkarow \let\dasharrow=\dbkarow
-\stix@MathSymbol{\drbkarow} {\mathrel}{arrows2}{"A9}
-\stix@MathSymbol{\rightdotarrow} {\mathrel}{arrows2}{"AA}
-\stix@MathSymbol{\baruparrow} {\mathrel}{arrows2}{"AB}
-\stix@MathSymbol{\downarrowbar} {\mathrel}{arrows2}{"AC}
-\stix@MathSymbol{\nvrightarrowtail} {\mathrel}{arrows2}{"AD}
-\stix@MathSymbol{\nVrightarrowtail} {\mathrel}{arrows2}{"AE}
-\stix@MathSymbol{\twoheadrightarrowtail} {\mathrel}{arrows2}{"AF}
-
-\stix@MathSymbol{\nvtwoheadrightarrowtail} {\mathrel}{arrows2}{"B0}
-\stix@MathSymbol{\nVtwoheadrightarrowtail} {\mathrel}{arrows2}{"B1}
-\stix@MathSymbol{\lefttail} {\mathrel}{arrows2}{"B2}
-\stix@MathSymbol{\righttail} {\mathrel}{arrows2}{"B3}
-\stix@MathSymbol{\leftdbltail} {\mathrel}{arrows2}{"B4}
-\stix@MathSymbol{\rightdbltail} {\mathrel}{arrows2}{"B5}
-\stix@MathSymbol{\diamondleftarrow} {\mathrel}{arrows2}{"B6}
-\stix@MathSymbol{\rightarrowdiamond} {\mathrel}{arrows2}{"B7}
-\stix@MathSymbol{\diamondleftarrowbar} {\mathrel}{arrows2}{"B8}
-\stix@MathSymbol{\barrightarrowdiamond} {\mathrel}{arrows2}{"B9}
-\stix@MathSymbol{\nwsearrow} {\mathrel}{arrows2}{"BA}
-\stix@MathSymbol{\neswarrow} {\mathrel}{arrows2}{"BB}
-\stix@MathSymbol{\hknwarrow} {\mathrel}{arrows2}{"BC}
-\stix@MathSymbol{\hknearrow} {\mathrel}{arrows2}{"BD}
-\stix@MathSymbol{\hksearow} {\mathrel}{arrows2}{"BE}
-\stix@MathSymbol{\hkswarow} {\mathrel}{arrows2}{"BF}
-
-\stix@MathSymbol{\tona} {\mathrel}{arrows2}{"C0}
-\stix@MathSymbol{\toea} {\mathrel}{arrows2}{"C1}
-\stix@MathSymbol{\tosa} {\mathrel}{arrows2}{"C2}
-\stix@MathSymbol{\towa} {\mathrel}{arrows2}{"C3}
-\stix@MathSymbol{\rdiagovfdiag} {\mathord}{arrows2}{"C4}
-\stix@MathSymbol{\fdiagovrdiag} {\mathord}{arrows2}{"C5}
-\stix@MathSymbol{\seovnearrow} {\mathord}{arrows2}{"C6}
-\stix@MathSymbol{\neovsearrow} {\mathord}{arrows2}{"C7}
-\stix@MathSymbol{\fdiagovnearrow} {\mathord}{arrows2}{"C8}
-\stix@MathSymbol{\rdiagovsearrow} {\mathord}{arrows2}{"C9}
-\stix@MathSymbol{\neovnwarrow} {\mathord}{arrows2}{"CA}
-\stix@MathSymbol{\nwovnearrow} {\mathord}{arrows2}{"CB}
-\stix@MathSymbol{\rightcurvedarrow} {\mathrel}{arrows2}{"CC}
-\stix@MathSymbol{\uprightcurvearrow} {\mathord}{arrows2}{"CD}
-\stix@MathSymbol{\downrightcurvedarrow} {\mathord}{arrows2}{"CE}
-\stix@MathSymbol{\leftdowncurvedarrow} {\mathrel}{arrows2}{"CF}
-
-\stix@MathSymbol{\rightdowncurvedarrow} {\mathrel}{arrows2}{"D0}
-\stix@MathSymbol{\cwrightarcarrow} {\mathrel}{arrows2}{"D1}
-\stix@MathSymbol{\acwleftarcarrow} {\mathrel}{arrows2}{"D2}
-\stix@MathSymbol{\acwoverarcarrow} {\mathrel}{arrows2}{"D3}
-\stix@MathSymbol{\acwunderarcarrow} {\mathrel}{arrows2}{"D4}
-\stix@MathSymbol{\curvearrowrightminus} {\mathrel}{arrows2}{"D5}
-\stix@MathSymbol{\curvearrowleftplus} {\mathrel}{arrows2}{"D6}
-\stix@MathSymbol{\cwundercurvearrow} {\mathrel}{arrows2}{"D7}
-\stix@MathSymbol{\ccwundercurvearrow} {\mathrel}{arrows2}{"D8}
-\stix@MathSymbol{\acwcirclearrow} {\mathrel}{arrows2}{"D9}
-\stix@MathSymbol{\cwcirclearrow} {\mathrel}{arrows2}{"DA}
-\stix@MathSymbol{\rightarrowshortleftarrow} {\mathrel}{arrows2}{"DB}
-\stix@MathSymbol{\leftarrowshortrightarrow} {\mathrel}{arrows2}{"DC}
-\stix@MathSymbol{\shortrightarrowleftarrow} {\mathrel}{arrows2}{"DD}
-\stix@MathSymbol{\rightarrowplus} {\mathrel}{arrows2}{"DE}
-\stix@MathSymbol{\leftarrowplus} {\mathrel}{arrows2}{"DF}
-
-\stix@MathSymbol{\rightarrowx} {\mathrel}{arrows2}{"E0}
-\stix@MathSymbol{\leftrightarrowcircle} {\mathrel}{arrows2}{"E1}
-\stix@MathSymbol{\twoheaduparrowcircle} {\mathrel}{arrows2}{"E2}
-\stix@MathSymbol{\leftrightharpoonupdown} {\mathrel}{arrows2}{"E3}
-\stix@MathSymbol{\leftrightharpoondownup} {\mathrel}{arrows2}{"E4}
-\stix@MathSymbol{\updownharpoonrightleft} {\mathrel}{arrows2}{"E5}
-\stix@MathSymbol{\updownharpoonleftright} {\mathrel}{arrows2}{"E6}
-\stix@MathSymbol{\leftrightharpoonupup} {\mathrel}{arrows2}{"E7}
-\stix@MathSymbol{\updownharpoonrightright} {\mathrel}{arrows2}{"E8}
-\stix@MathSymbol{\leftrightharpoondowndown} {\mathrel}{arrows2}{"E9}
-\stix@MathSymbol{\updownharpoonleftleft} {\mathrel}{arrows2}{"EA}
-\stix@MathSymbol{\barleftharpoonup} {\mathrel}{arrows2}{"EB}
-\stix@MathSymbol{\rightharpoonupbar} {\mathrel}{arrows2}{"EC}
-\stix@MathSymbol{\barupharpoonright} {\mathrel}{arrows2}{"ED}
-\stix@MathSymbol{\downharpoonrightbar} {\mathrel}{arrows2}{"EE}
-\stix@MathSymbol{\barleftharpoondown} {\mathrel}{arrows2}{"EF}
-
-\stix@MathSymbol{\rightharpoondownbar} {\mathrel}{arrows2}{"F0}
-\stix@MathSymbol{\barupharpoonleft} {\mathrel}{arrows2}{"F1}
-\stix@MathSymbol{\downharpoonleftbar} {\mathrel}{arrows2}{"F2}
-\stix@MathSymbol{\leftharpoonupbar} {\mathrel}{arrows2}{"F3}
-\stix@MathSymbol{\barrightharpoonup} {\mathrel}{arrows2}{"F4}
-\stix@MathSymbol{\upharpoonrightbar} {\mathrel}{arrows2}{"F5}
-\stix@MathSymbol{\bardownharpoonright} {\mathrel}{arrows2}{"F6}
-\stix@MathSymbol{\leftharpoondownbar} {\mathrel}{arrows2}{"F7}
-\stix@MathSymbol{\barrightharpoondown} {\mathrel}{arrows2}{"F8}
-\stix@MathSymbol{\upharpoonleftbar} {\mathrel}{arrows2}{"F9}
-\stix@MathSymbol{\bardownharpoonleft} {\mathrel}{arrows2}{"FA}
-\stix@MathSymbol{\leftharpoonsupdown} {\mathrel}{arrows2}{"FB}
-\stix@MathSymbol{\upharpoonsleftright} {\mathrel}{arrows2}{"FC}
-\stix@MathSymbol{\rightharpoonsupdown} {\mathrel}{arrows2}{"FD}
-\stix@MathSymbol{\downharpoonsleftright} {\mathrel}{arrows2}{"FE}
-\stix@MathSymbol{\leftrightharpoonsup} {\mathrel}{arrows2}{"FF}
-
-\stix@MathSymbol{\cwgapcirclearrow} {\mathrel}{arrows3}{"00}
-\stix@MathSymbol{\rightarrowonoplus} {\mathrel}{arrows3}{"01}
-\stix@MathSymbol{\longleftarrow} {\mathrel}{arrows3}{"02}
-\stix@MathSymbol{\longrightarrow} {\mathrel}{arrows3}{"03}
-\stix@MathSymbol{\longleftrightarrow} {\mathrel}{arrows3}{"04}
-\stix@MathSymbol{\Longleftarrow} {\mathrel}{arrows3}{"05}
-\stix@MathSymbol{\Longrightarrow} {\mathrel}{arrows3}{"06}
-\stix@MathSymbol{\Longleftrightarrow} {\mathrel}{arrows3}{"07}
-\stix@MathSymbol{\longmapsfrom} {\mathrel}{arrows3}{"08}
-\stix@MathSymbol{\longmapsto} {\mathrel}{arrows3}{"09}
-\stix@MathSymbol{\Longmapsfrom} {\mathrel}{arrows3}{"0A}
-\stix@MathSymbol{\Longmapsto} {\mathrel}{arrows3}{"0B}
-\stix@MathSymbol{\longrightsquigarrow} {\mathrel}{arrows3}{"0C}
-\stix@MathSymbol{\acwgapcirclearrow} {\mathrel}{arrows3}{"0D}
-\stix@MathSymbol{\bsimilarrightarrow} {\mathrel}{arrows3}{"0E}
-\stix@MathSymbol{\spadesuit} {\mathord}{arrows3}{"0F}
-
-\stix@MathSymbol{\heartsuit} {\mathord}{arrows3}{"10}
-\stix@MathSymbol{\diamondsuit} {\mathord}{arrows3}{"11}
-\stix@MathSymbol{\clubsuit} {\mathord}{arrows3}{"12}
-\stix@MathSymbol{\mathparagraph} {\mathord}{arrows3}{"13}
-\stix@MathSymbol{\mathsection} {\mathord}{arrows3}{"14}
-\stix@MathSymbol{\leftrightharpoonsdown} {\mathrel}{arrows3}{"15}
-\stix@MathSymbol{\rightleftharpoonsup} {\mathrel}{arrows3}{"16}
-\stix@MathSymbol{\rightleftharpoonsdown} {\mathrel}{arrows3}{"17}
-\stix@MathSymbol{\leftharpoonupdash} {\mathrel}{arrows3}{"18}
-\stix@MathSymbol{\dashleftharpoondown} {\mathrel}{arrows3}{"19}
-\stix@MathSymbol{\rightharpoonupdash} {\mathrel}{arrows3}{"1A}
-\stix@MathSymbol{\dashrightharpoondown} {\mathrel}{arrows3}{"1B}
-\stix@MathSymbol{\updownharpoonsleftright} {\mathrel}{arrows3}{"1C}
-\stix@MathSymbol{\downupharpoonsleftright} {\mathrel}{arrows3}{"1D}
-\stix@MathSymbol{\rightimply} {\mathrel}{arrows3}{"1E}
-\stix@MathSymbol{\equalrightarrow} {\mathrel}{arrows3}{"1F}
-
-\stix@MathSymbol{\similarrightarrow} {\mathrel}{arrows3}{"20}
-\stix@MathSymbol{\leftarrowsimilar} {\mathrel}{arrows3}{"21}
-\stix@MathSymbol{\rightarrowsimilar} {\mathrel}{arrows3}{"22}
-\stix@MathSymbol{\rightarrowapprox} {\mathrel}{arrows3}{"23}
-\stix@MathSymbol{\ltlarr} {\mathrel}{arrows3}{"24}
-\stix@MathSymbol{\leftarrowless} {\mathrel}{arrows3}{"25}
-\stix@MathSymbol{\gtrarr} {\mathrel}{arrows3}{"26}
-\stix@MathSymbol{\subrarr} {\mathrel}{arrows3}{"27}
-\stix@MathSymbol{\leftarrowsubset} {\mathrel}{arrows3}{"28}
-\stix@MathSymbol{\suplarr} {\mathrel}{arrows3}{"29}
-\stix@MathSymbol{\leftfishtail} {\mathrel}{arrows3}{"2A}
-\stix@MathSymbol{\rightfishtail} {\mathrel}{arrows3}{"2B}
-\stix@MathSymbol{\upfishtail} {\mathrel}{arrows3}{"2C}
-\stix@MathSymbol{\downfishtail} {\mathrel}{arrows3}{"2D}
-\stix@MathSymbol{\varclubsuit} {\mathord}{arrows3}{"2E}
-\stix@MathSymbol{\quarternote} {\mathord}{arrows3}{"2F}
-
-\stix@MathSymbol{\eighthnote} {\mathord}{arrows3}{"3A}
-\stix@MathSymbol{\twonotes} {\mathord}{arrows3}{"3B}
-\stix@MathSymbol{\dicei} {\mathord}{arrows3}{"3C}
-\stix@MathSymbol{\diceii} {\mathord}{arrows3}{"3D}
-\stix@MathSymbol{\diceiii} {\mathord}{arrows3}{"3E}
-\stix@MathSymbol{\diceiv} {\mathord}{arrows3}{"3F}
-\stix@MathSymbol{\dicev} {\mathord}{arrows3}{"40}
-
-\stix@MathSymbol{\dicevi} {\mathord}{arrows3}{"5B}
-\stix@MathSymbol{\circledrightdot} {\mathord}{arrows3}{"5C}
-\stix@MathSymbol{\circledtwodots} {\mathord}{arrows3}{"5D}
-\stix@MathSymbol{\blackcircledrightdot} {\mathord}{arrows3}{"5E}
-\stix@MathSymbol{\blackcircledtwodots} {\mathord}{arrows3}{"5F}
-\stix@MathSymbol{\Hermaphrodite} {\mathord}{arrows3}{"60}
-
-\stix@MathSymbol{\mdwhtcircle} {\mathord}{arrows3}{"7D}
-\stix@MathSymbol{\mdblkcircle} {\mathord}{arrows3}{"7E}
-
-\stix@MathSymbol{\mdsmwhtcircle} {\mathord}{arrows3}{"80}
-\stix@MathSymbol{\neuter} {\mathord}{arrows3}{"81}
-\stix@MathSymbol{\checkmarkmath} {\mathord}{arrows3}{"82}
-%stix@MathSymbol{\maltesemath} {\mathord}{arrows3}{"83} % moved up
-%stix@MathSymbol{\circledstar} {\mathord}{arrows3}{"84} % moved up
-\stix@MathSymbol{\varstar} {\mathord}{arrows3}{"85}
-\stix@MathSymbol{\dingasterisk} {\mathord}{arrows3}{"86}
-%
-\stix@MathSymbol{\squareulblack} {\mathord}{arrows3}{"88}
-\stix@MathSymbol{\squarelrblack} {\mathord}{arrows3}{"89}
-\stix@MathSymbol{\boxbar} {\mathbin}{arrows3}{"8A}
-\stix@MathSymbol{\trianglecdot} {\mathord}{arrows3}{"8B}
-\stix@MathSymbol{\triangleleftblack} {\mathord}{arrows3}{"8C}
-\stix@MathSymbol{\trianglerightblack} {\mathord}{arrows3}{"8D}
-\stix@MathSymbol{\lgwhtcircle} {\mathord}{arrows3}{"8E}
-\stix@MathSymbol{\squareulquad} {\mathord}{arrows3}{"8F}
-
-\stix@MathSymbol{\squarellquad} {\mathord}{arrows3}{"90}
-\stix@MathSymbol{\squarelrquad} {\mathord}{arrows3}{"91}
-\stix@MathSymbol{\squareurquad} {\mathord}{arrows3}{"92}
-\stix@MathSymbol{\circleulquad} {\mathord}{arrows3}{"93}
-\stix@MathSymbol{\circlellquad} {\mathord}{arrows3}{"94}
-\stix@MathSymbol{\circlelrquad} {\mathord}{arrows3}{"95}
-\stix@MathSymbol{\circleurquad} {\mathord}{arrows3}{"96}
-\stix@MathSymbol{\ultriangle} {\mathord}{arrows3}{"97}
-\stix@MathSymbol{\urtriangle} {\mathord}{arrows3}{"98}
-\stix@MathSymbol{\lltriangle} {\mathord}{arrows3}{"99}
-\stix@MathSymbol{\mdwhtsquare} {\mathord}{arrows3}{"9A}
-\stix@MathSymbol{\mdblksquare} {\mathord}{arrows3}{"9B}
-\stix@MathSymbol{\mdsmwhtsquare} {\mathord}{arrows3}{"9C}
-\stix@MathSymbol{\mdsmblksquare} {\mathord}{arrows3}{"9D}
-\stix@MathSymbol{\lrtriangle} {\mathord}{arrows3}{"9E}
-\stix@MathSymbol{\bigstar} {\mathord}{arrows3}{"9F}
-
-\stix@MathSymbol{\bigwhitestar} {\mathord}{arrows3}{"A0}
-\stix@MathSymbol{\dottimes} {\mathbin}{arrows3}{"A1}
-\stix@MathSymbol{\timesbar} {\mathbin}{arrows3}{"A2}
-\stix@MathSymbol{\btimes} {\mathbin}{arrows3}{"A3}
-\stix@MathSymbol{\smashtimes} {\mathbin}{arrows3}{"A4}
-\stix@MathSymbol{\otimeslhrim} {\mathbin}{arrows3}{"A5}
-\stix@MathSymbol{\otimesrhrim} {\mathbin}{arrows3}{"A6}
-\stix@MathSymbol{\otimeshat} {\mathbin}{arrows3}{"A7}
-\stix@MathSymbol{\Otimes} {\mathbin}{arrows3}{"A8}
-\stix@MathSymbol{\odiv} {\mathbin}{arrows3}{"A9}
-\stix@MathSymbol{\triangleplus} {\mathbin}{arrows3}{"AA}
-\stix@MathSymbol{\triangleminus} {\mathbin}{arrows3}{"AB}
-\stix@MathSymbol{\triangletimes} {\mathbin}{arrows3}{"AC}
-\stix@MathSymbol{\intprod} {\mathbin}{arrows3}{"AD}
-\stix@MathSymbol{\intprodr} {\mathbin}{arrows3}{"AE}
-\stix@MathSymbol{\fcmp} {\mathbin}{arrows3}{"AF}
-
-\stix@MathSymbol{\amalg} {\mathbin}{arrows3}{"B0}
-\stix@MathSymbol{\capdot} {\mathbin}{arrows3}{"B1}
-\stix@MathSymbol{\uminus} {\mathbin}{arrows3}{"B2}
-\stix@MathSymbol{\barcup} {\mathbin}{arrows3}{"B3}
-\stix@MathSymbol{\barcap} {\mathbin}{arrows3}{"B4}
-\stix@MathSymbol{\capwedge} {\mathbin}{arrows3}{"B5}
-\stix@MathSymbol{\cupvee} {\mathbin}{arrows3}{"B6}
-\stix@MathSymbol{\cupovercap} {\mathbin}{arrows3}{"B7}
-\stix@MathSymbol{\capovercup} {\mathbin}{arrows3}{"B8}
-\stix@MathSymbol{\cupbarcap} {\mathbin}{arrows3}{"B9}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\neg} {\mathord}{operators}{"9B} \let\lnot=\neg
-\stix@MathSymbol{\cdotp} {\mathbin}{operators}{"9C} \let\centerdot=\cdotp
-\stix@MathSymbol{\times} {\mathbin}{operators}{"9D}
-\stix@MathSymbol{\preceq} {\mathrel}{operators}{"9E}
-\stix@MathSymbol{\div} {\mathbin}{operators}{"9F}
-
-\stix@MathSymbol{\Zbar} {\mathord}{operators}{"A0}
-\stix@MathSymbol{\notchar} {\mathrel}{operators}{"A1}
-\stix@MathSymbol{\upbackepsilon} {\mathord}{operators}{"A2}
-\stix@MathSymbol{\dagger} {\mathbin}{operators}{"A3}
-\stix@MathSymbol{\ddagger} {\mathbin}{operators}{"A4}
-\stix@MathSymbol{\smblkcircle} {\mathbin}{operators}{"A5}
-\stix@MathSymbol{\enleadertwodots} {\mathord}{operators}{"A6}
-\stix@MathSymbol{\unicodeellipsis} {\mathord}{operators}{"A7} \def\mathellipsis{\mathinner{\unicodeellipsis}}
-\stix@MathSymbol{\prime} {\mathord}{operators}{"A8}
-\stix@MathSymbol{\dprime} {\mathord}{operators}{"A9}
-\stix@MathSymbol{\trprime} {\mathord}{operators}{"AA}
-\stix@MathSymbol{\backprime} {\mathord}{operators}{"AB}
-\stix@MathSymbol{\backdprime} {\mathord}{operators}{"AC}
-\stix@MathSymbol{\backtrprime} {\mathord}{operators}{"AD}
-\stix@MathSymbol{\caretinsert} {\mathord}{operators}{"AE}
-\stix@MathSymbol{\Exclam} {\mathord}{operators}{"AF}
-
-\stix@MathSymbol{\hyphenbullet} {\mathord}{operators}{"B0}
-\stix@MathSymbol{\fracslash} {\mathbin}{operators}{"B1}
-\stix@MathSymbol{\Question} {\mathord}{operators}{"B2}
-\stix@MathSymbol{\closure} {\mathrel}{operators}{"B3}
-\stix@MathSymbol{\qprime} {\mathord}{operators}{"B4}
-\stix@MathSymbol{\vertoverlay} {\mathrel}{operators}{"B5}
-\stix@MathSymbol{\enclosecircle} {\mathord}{operators}{"B6}
-\stix@MathSymbol{\enclosesquare} {\mathord}{operators}{"B7}
-\stix@MathSymbol{\enclosediamond} {\mathord}{operators}{"B8}
-\stix@MathSymbol{\enclosetriangle} {\mathord}{operators}{"B9}
-\stix@MathSymbol{\Eulerconst} {\mathord}{operators}{"BA}
-\stix@MathSymbol{\mho} {\mathord}{operators}{"BB}
-\stix@MathSymbol{\turnediota} {\mathord}{operators}{"BC}
-\stix@MathSymbol{\Angstrom} {\mathord}{operators}{"BD}
-\stix@MathSymbol{\Finv} {\mathord}{operators}{"BE}
-\stix@MathSymbol{\Game} {\mathord}{operators}{"BF}
-
-\stix@MathSymbol{\sansLturned} {\mathord}{operators}{"C0}
-\stix@MathSymbol{\sansLmirrored} {\mathord}{operators}{"C1}
-\stix@MathSymbol{\Yup} {\mathord}{operators}{"C2}
-\stix@MathSymbol{\PropertyLine} {\mathord}{operators}{"C3}
-\stix@MathSymbol{\upand} {\mathbin}{operators}{"C4}
-\stix@MathSymbol{\forall} {\mathord}{operators}{"C5}
-\stix@MathSymbol{\complement} {\mathord}{operators}{"C6}
-\stix@MathSymbol{\exists} {\mathord}{operators}{"C7}
-\stix@MathSymbol{\nexists} {\mathord}{operators}{"C8}
-\stix@MathSymbol{\varnothing} {\mathord}{operators}{"C9}
-\stix@MathSymbol{\increment} {\mathord}{operators}{"CA}
-\stix@MathSymbol{\in} {\mathrel}{operators}{"CB}
-\stix@MathSymbol{\notin} {\mathrel}{operators}{"CC}
-\stix@MathSymbol{\smallin} {\mathrel}{operators}{"CD}
-\stix@MathSymbol{\ni} {\mathrel}{operators}{"CE} \let\owns=\ni
-\stix@MathSymbol{\nni} {\mathrel}{operators}{"CF}
-
-\stix@MathSymbol{\smallni} {\mathrel}{operators}{"D0}
-\stix@MathSymbol{\QED} {\mathord}{operators}{"D1}
-\stix@MathSymbol{\dotplus} {\mathbin}{operators}{"D2}
-\stix@MathSymbol{\succeq} {\mathrel}{operators}{"D3}
-\stix@MathSymbol{\smallsetminus} {\mathbin}{operators}{"D4}
-\stix@MathSymbol{\vysmwhtcircle} {\mathbin}{operators}{"D5}
-\stix@MathSymbol{\vysmblkcircle} {\mathbin}{operators}{"D6} \let\bullet=\vysmblkcircle
-\stix@MathSymbol{\propto} {\mathrel}{operators}{"D7}
-\stix@MathSymbol{\infty} {\mathord}{operators}{"D8}
-\stix@MathSymbol{\rightangle} {\mathord}{operators}{"D9}
-\stix@MathSymbol{\angle} {\mathord}{operators}{"DA}
-\stix@MathSymbol{\measuredangle} {\mathord}{operators}{"DB}
-\stix@MathSymbol{\sphericalangle} {\mathord}{operators}{"DC}
-\stix@MathSymbol{\mid} {\mathrel}{operators}{"DD}
-\stix@MathSymbol{\nmid} {\mathrel}{operators}{"DE}
-\stix@MathSymbol{\parallel} {\mathrel}{operators}{"DF}
-
-\stix@MathSymbol{\nparallel} {\mathrel}{operators}{"E0}
-\stix@MathSymbol{\wedge} {\mathbin}{operators}{"E1} \let\land=\wedge
-\stix@MathSymbol{\vee} {\mathbin}{operators}{"E2} \let\lor=\vee
-\stix@MathSymbol{\cap} {\mathbin}{operators}{"E3}
-\stix@MathSymbol{\cup} {\mathbin}{operators}{"E4}
-\stix@MathSymbol{\therefore} {\mathord}{operators}{"E5}
-\stix@MathSymbol{\because} {\mathord}{operators}{"E6}
-\stix@MathSymbol{\emptyset} {\mathord}{operators}{"E7}
-\stix@MathSymbol{\Colon} {\mathrel}{operators}{"E8}
-\stix@MathSymbol{\dotminus} {\mathbin}{operators}{"E9}
-\stix@MathSymbol{\dashcolon} {\mathrel}{operators}{"EA}
-\stix@MathSymbol{\dotsminusdots} {\mathrel}{operators}{"EB}
-\stix@MathSymbol{\kernelcontraction} {\mathrel}{operators}{"EC}
-\stix@MathSymbol{\sim} {\mathrel}{operators}{"ED} \stix@MathSymbol{\thicksim}{\mathrel}{bold-operators}{"ED}
-\stix@MathSymbol{\backsim} {\mathrel}{operators}{"EE}
-\stix@MathSymbol{\invlazys} {\mathbin}{operators}{"EF}
-
-\stix@MathSymbol{\sinewave} {\mathord}{operators}{"F0}
-\stix@MathSymbol{\wr} {\mathbin}{operators}{"F1}
-\stix@MathSymbol{\nsim} {\mathrel}{operators}{"F2}
-\stix@MathSymbol{\eqsim} {\mathrel}{operators}{"F3}
-\stix@MathSymbol{\simeq} {\mathrel}{operators}{"F4}
-\stix@MathSymbol{\nsime} {\mathrel}{operators}{"F5}
-\stix@MathSymbol{\cong} {\mathrel}{operators}{"F6}
-\stix@MathSymbol{\simneqq} {\mathrel}{operators}{"F7}
-\stix@MathSymbol{\ncong} {\mathrel}{operators}{"F8}
-\stix@MathSymbol{\approx} {\mathrel}{operators}{"F9} \stix@MathSymbol{\thickapprox}{\mathrel}{bold-operators}{"F9}
-\stix@MathSymbol{\napprox} {\mathrel}{operators}{"FA}
-\stix@MathSymbol{\approxeq} {\mathrel}{operators}{"FB}
-\stix@MathSymbol{\approxident} {\mathrel}{operators}{"FC}
-\stix@MathSymbol{\backcong} {\mathrel}{operators}{"FD}
-\stix@MathSymbol{\asymp} {\mathrel}{operators}{"FE}
-\stix@MathSymbol{\Bumpeq} {\mathrel}{operators}{"FF}
-
-\stix@MathSymbol{\bumpeq} {\mathrel}{integrals}{"80}
-\stix@MathSymbol{\doteq} {\mathrel}{integrals}{"81}
-\stix@MathSymbol{\Doteq} {\mathrel}{integrals}{"82}
- \let\doteqdot=\Doteq
-\stix@MathSymbol{\fallingdotseq} {\mathrel}{integrals}{"83}
-\stix@MathSymbol{\risingdotseq} {\mathrel}{integrals}{"84}
-\stix@MathSymbol{\coloneq} {\mathrel}{integrals}{"85}
-\stix@MathSymbol{\eqcolon} {\mathrel}{integrals}{"86}
-\stix@MathSymbol{\eqcirc} {\mathrel}{integrals}{"87}
-\stix@MathSymbol{\circeq} {\mathrel}{integrals}{"88}
-\stix@MathSymbol{\arceq} {\mathrel}{integrals}{"89}
-\stix@MathSymbol{\wedgeq} {\mathrel}{integrals}{"8A}
-\stix@MathSymbol{\veeeq} {\mathrel}{integrals}{"8B}
-\stix@MathSymbol{\stareq} {\mathrel}{integrals}{"8C}
-\stix@MathSymbol{\triangleq} {\mathrel}{integrals}{"8D}
-\stix@MathSymbol{\eqdef} {\mathrel}{integrals}{"8E}
-\stix@MathSymbol{\measeq} {\mathrel}{integrals}{"8F}
-\stix@MathSymbol{\questeq} {\mathrel}{integrals}{"90}
-\stix@MathSymbol{\ne} {\mathrel}{integrals}{"91}
- \let\neq=\ne
-\stix@MathSymbol{\equiv} {\mathrel}{integrals}{"92}
-\stix@MathSymbol{\nequiv} {\mathrel}{integrals}{"93}
-\stix@MathSymbol{\Equiv} {\mathrel}{integrals}{"65}
-\stix@MathSymbol{\leq} {\mathrel}{integrals}{"66}
- \let\le=\leq
-\stix@MathSymbol{\geq} {\mathrel}{integrals}{"67}
- \let\ge=\geq
-\stix@MathSymbol{\leqq} {\mathrel}{integrals}{"68}
-\stix@MathSymbol{\geqq} {\mathrel}{integrals}{"69}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\lneqq} {\mathrel}{letters}{"40}
-\stix@MathSymbol{\gneqq} {\mathrel}{letters}{"7D}
-\stix@MathSymbol{\ll} {\mathrel}{letters}{"7E}
-\stix@MathSymbol{\gg} {\mathrel}{letters}{"B8}
-\stix@MathSymbol{\between} {\mathrel}{letters}{"B9}
-\stix@MathSymbol{\nasymp} {\mathrel}{letters}{"BA}
-\stix@MathSymbol{\nless} {\mathrel}{letters}{"BB}
-\stix@MathSymbol{\ngtr} {\mathrel}{letters}{"BC}
-\stix@MathSymbol{\nleq} {\mathrel}{letters}{"BD}
-\stix@MathSymbol{\ngeq} {\mathrel}{letters}{"BE}
-\stix@MathSymbol{\lesssim} {\mathrel}{letters}{"BF}
-\stix@MathSymbol{\gtrsim} {\mathrel}{letters}{"C0}
-\stix@MathSymbol{\nlesssim} {\mathrel}{letters}{"C1}
-\stix@MathSymbol{\ngtrsim} {\mathrel}{letters}{"C2}
-\stix@MathSymbol{\lessgtr} {\mathrel}{letters}{"C3}
-\stix@MathSymbol{\gtrless} {\mathrel}{letters}{"C4}
-\stix@MathSymbol{\nlessgtr} {\mathrel}{letters}{"C5}
-\stix@MathSymbol{\ngtrless} {\mathrel}{letters}{"C6}
-\stix@MathSymbol{\prec} {\mathrel}{letters}{"C7}
-\stix@MathSymbol{\succ} {\mathrel}{letters}{"C8}
-\stix@MathSymbol{\preccurlyeq} {\mathrel}{letters}{"C9}
-\stix@MathSymbol{\succcurlyeq} {\mathrel}{letters}{"CA}
-\stix@MathSymbol{\precsim} {\mathrel}{letters}{"CB}
-\stix@MathSymbol{\succsim} {\mathrel}{letters}{"CC}
-\stix@MathSymbol{\nprec} {\mathrel}{letters}{"CD}
-\stix@MathSymbol{\nsucc} {\mathrel}{letters}{"CE}
-\stix@MathSymbol{\subset} {\mathrel}{letters}{"CF}
-\stix@MathSymbol{\supset} {\mathrel}{letters}{"D0}
-\stix@MathSymbol{\nsubset} {\mathrel}{letters}{"D1}
-\stix@MathSymbol{\nsupset} {\mathrel}{letters}{"D2}
-\stix@MathSymbol{\subseteq} {\mathrel}{letters}{"D3}
-\stix@MathSymbol{\supseteq} {\mathrel}{letters}{"D4}
-\stix@MathSymbol{\nsubseteq} {\mathrel}{letters}{"D5}
-\stix@MathSymbol{\nsupseteq} {\mathrel}{letters}{"D6}
-\stix@MathSymbol{\subsetneq} {\mathrel}{letters}{"D7}
-\stix@MathSymbol{\supsetneq} {\mathrel}{letters}{"D8}
-\stix@MathSymbol{\cupleftarrow} {\mathbin}{letters}{"D9}
-\stix@MathSymbol{\cupdot} {\mathbin}{letters}{"DA}
-\stix@MathSymbol{\uplus} {\mathbin}{letters}{"DB}
-\stix@MathSymbol{\sqsubset} {\mathrel}{letters}{"DC}
-\stix@MathSymbol{\sqsupset} {\mathrel}{letters}{"DD}
-\stix@MathSymbol{\sqsubseteq} {\mathrel}{letters}{"DE}
-\stix@MathSymbol{\sqsupseteq} {\mathrel}{letters}{"DF}
-\stix@MathSymbol{\sqcap} {\mathbin}{letters}{"E0}
-\stix@MathSymbol{\sqcup} {\mathbin}{letters}{"E1}
-\stix@MathSymbol{\oplus} {\mathbin}{letters}{"E2}
-\stix@MathSymbol{\ominus} {\mathbin}{letters}{"E3}
-\stix@MathSymbol{\otimes} {\mathbin}{letters}{"E4}
-\stix@MathSymbol{\oslash} {\mathbin}{letters}{"E5}
-\stix@MathSymbol{\odot} {\mathbin}{letters}{"E6}
-\stix@MathSymbol{\circledcirc} {\mathbin}{letters}{"E7}
-\stix@MathSymbol{\circledast} {\mathbin}{letters}{"E8}
-\stix@MathSymbol{\circledequal} {\mathbin}{letters}{"E9}
-\stix@MathSymbol{\circleddash} {\mathbin}{letters}{"EA}
-\stix@MathSymbol{\boxplus} {\mathbin}{letters}{"EB}
-\stix@MathSymbol{\boxminus} {\mathbin}{letters}{"EC}
-\stix@MathSymbol{\boxtimes} {\mathbin}{letters}{"ED}
-\stix@MathSymbol{\boxdot} {\mathbin}{letters}{"EE}
-\stix@MathSymbol{\vdash} {\mathrel}{letters}{"EF}
-\stix@MathSymbol{\dashv} {\mathrel}{letters}{"F0}
-\stix@MathSymbol{\top} {\mathord}{letters}{"F1}
-\stix@MathSymbol{\bot} {\mathord}{letters}{"F2}
-\stix@MathSymbol{\assert} {\mathrel}{letters}{"F3}
-\stix@MathSymbol{\models} {\mathrel}{letters}{"F4}
-\stix@MathSymbol{\vDash} {\mathrel}{letters}{"F5}
-\stix@MathSymbol{\Vdash} {\mathrel}{letters}{"F6}
-\stix@MathSymbol{\Vvdash} {\mathrel}{letters}{"F7}
-\stix@MathSymbol{\VDash} {\mathrel}{letters}{"F8}
-\stix@MathSymbol{\nvdash} {\mathrel}{letters}{"F9}
-\stix@MathSymbol{\nvDash} {\mathrel}{letters}{"FA}
-\stix@MathSymbol{\nVdash} {\mathrel}{letters}{"FB}
-\stix@MathSymbol{\nVDash} {\mathrel}{letters}{"FC}
-\stix@MathSymbol{\prurel} {\mathrel}{letters}{"FD}
-\stix@MathSymbol{\scurel} {\mathrel}{letters}{"FE}
-\stix@MathSymbol{\trianglelefteq} {\mathrel}{letters}{"FF}
-\stix@MathSymbol{\unlhd} {\mathbin}{letters}{"FF}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\trianglerighteq} {\mathrel}{symbols}{"00}
-\stix@MathSymbol{\unrhd} {\mathbin}{symbols}{"00}
-\stix@MathSymbol{\origof} {\mathrel}{symbols}{"01}
-\stix@MathSymbol{\imageof} {\mathrel}{symbols}{"02}
-\stix@MathSymbol{\multimap} {\mathrel}{symbols}{"03}
-\stix@MathSymbol{\hermitmatrix} {\mathord}{symbols}{"04}
-\stix@MathSymbol{\intercal} {\mathbin}{symbols}{"05}
-\stix@MathSymbol{\veebar} {\mathbin}{symbols}{"06}
-\stix@MathSymbol{\barwedge} {\mathbin}{symbols}{"07}
-\stix@MathSymbol{\barvee} {\mathbin}{symbols}{"08}
-\stix@MathSymbol{\measuredrightangle} {\mathord}{symbols}{"09}
-\stix@MathSymbol{\varlrtriangle} {\mathord}{symbols}{"0A}
-\stix@MathSymbol{\smwhtdiamond} {\mathbin}{symbols}{"0B}
- \let\diamond=\smwhtdiamond
-\stix@MathSymbol{\cdot} {\mathbin}{symbols}{"0C}
-\stix@MathSymbol{\divideontimes} {\mathbin}{symbols}{"0D}
-\stix@MathSymbol{\bowtie} {\mathrel}{symbols}{"0E}
-\stix@MathSymbol{\ltimes} {\mathbin}{symbols}{"0F}
-\stix@MathSymbol{\rtimes} {\mathbin}{symbols}{"10}
-\stix@MathSymbol{\leftthreetimes} {\mathbin}{symbols}{"11}
-\stix@MathSymbol{\rightthreetimes} {\mathbin}{symbols}{"12}
-\stix@MathSymbol{\backsimeq} {\mathrel}{symbols}{"13}
-\stix@MathSymbol{\curlyvee} {\mathbin}{symbols}{"14}
-\stix@MathSymbol{\curlywedge} {\mathbin}{symbols}{"15}
-\stix@MathSymbol{\Subset} {\mathrel}{symbols}{"16}
-\stix@MathSymbol{\Supset} {\mathrel}{symbols}{"17}
-\stix@MathSymbol{\Cap} {\mathbin}{symbols}{"18}
- \let\doublecap=\Cap
-\stix@MathSymbol{\Cup} {\mathbin}{symbols}{"19}
- \let\doublecup=\Cup
-\stix@MathSymbol{\pitchfork} {\mathrel}{symbols}{"1A}
-\stix@MathSymbol{\equalparallel} {\mathrel}{symbols}{"1B}
-\stix@MathSymbol{\lessdot} {\mathrel}{symbols}{"1C}
-\stix@MathSymbol{\gtrdot} {\mathrel}{symbols}{"1D}
-\stix@MathSymbol{\lll} {\mathrel}{symbols}{"1E}
- \let\llless=\lll
-\stix@MathSymbol{\ggg} {\mathrel}{symbols}{"1F}
- \let\gggtr=\ggg
-\stix@MathSymbol{\lesseqgtr} {\mathrel}{symbols}{"20}
-\stix@MathSymbol{\gtreqless} {\mathrel}{symbols}{"21}
-\stix@MathSymbol{\eqless} {\mathrel}{symbols}{"22}
-\stix@MathSymbol{\eqgtr} {\mathrel}{symbols}{"23}
-\stix@MathSymbol{\curlyeqprec} {\mathrel}{symbols}{"24}
-\stix@MathSymbol{\curlyeqsucc} {\mathrel}{symbols}{"25}
-\stix@MathSymbol{\npreccurlyeq} {\mathrel}{symbols}{"26}
-\stix@MathSymbol{\nsucccurlyeq} {\mathrel}{symbols}{"27}
-\stix@MathSymbol{\nsqsubseteq} {\mathrel}{symbols}{"28}
-\stix@MathSymbol{\nsqsupseteq} {\mathrel}{symbols}{"29}
-\stix@MathSymbol{\sqsubsetneq} {\mathrel}{symbols}{"2A}
-\stix@MathSymbol{\sqsupsetneq} {\mathrel}{symbols}{"2B}
-\stix@MathSymbol{\lnsim} {\mathrel}{symbols}{"2C}
-\stix@MathSymbol{\gnsim} {\mathrel}{symbols}{"2D}
-\stix@MathSymbol{\precnsim} {\mathrel}{symbols}{"2E}
-\stix@MathSymbol{\succnsim} {\mathrel}{symbols}{"2F}
-\stix@MathSymbol{\nvartriangleleft} {\mathrel}{symbols}{"30}
-\stix@MathSymbol{\nvartriangleright} {\mathrel}{symbols}{"31}
-\stix@MathSymbol{\ntrianglelefteq} {\mathrel}{symbols}{"32}
-\stix@MathSymbol{\ntrianglerighteq} {\mathrel}{symbols}{"33}
-\stix@MathSymbol{\vdotsmath} {\mathrel}{symbols}{"34}
-% \end{macrocode}
-%
-% \LaTeX's |\vdots| works in text mode as well, so should ours.
-%
-% \begin{macrocode}
- \DeclareRobustCommand\vdots{%
- \ifmmode\vdotsmath\else%
- {\usefont{LS1}{stix2scr}{\f@series}{n}\char"34}%
- \fi}
-\stix@MathSymbol{\unicodecdots} {\mathord}{symbols}{"35} \let\@cdots=\unicodecdots \DeclareRobustCommand\cdots{\mathinner{\unicodecdots}}
-\stix@MathSymbol{\adots} {\mathrel}{symbols}{"36}
-\stix@MathSymbol{\ddots} {\mathrel}{symbols}{"37}
-\stix@MathSymbol{\disin} {\mathrel}{symbols}{"38}
-\stix@MathSymbol{\varisins} {\mathrel}{symbols}{"39}
-\stix@MathSymbol{\isins} {\mathrel}{symbols}{"3A}
-\stix@MathSymbol{\isindot} {\mathrel}{symbols}{"3B}
-\stix@MathSymbol{\varisinobar} {\mathrel}{symbols}{"3C}
-\stix@MathSymbol{\isinobar} {\mathrel}{symbols}{"3D}
-\stix@MathSymbol{\isinvb} {\mathrel}{symbols}{"3E}
-\stix@MathSymbol{\isinE} {\mathrel}{symbols}{"3F}
-\stix@MathSymbol{\nisd} {\mathrel}{symbols}{"40}
-\stix@MathSymbol{\varnis} {\mathrel}{symbols}{"5B}
-\stix@MathSymbol{\nis} {\mathrel}{symbols}{"5C}
-\stix@MathSymbol{\varniobar} {\mathrel}{symbols}{"5D}
-\stix@MathSymbol{\niobar} {\mathrel}{symbols}{"5E}
-\stix@MathSymbol{\bagmember} {\mathrel}{symbols}{"5F}
-\stix@MathSymbol{\diameter} {\mathord}{symbols}{"60}
-\stix@MathSymbol{\house} {\mathord}{symbols}{"7E}
-
-\stix@MathSymbol{\varbarwedge} {\mathbin}{symbols}{"99}
-\stix@MathSymbol{\vardoublebarwedge} {\mathbin}{symbols}{"9A}
-\stix@MathSymbol{\invnot} {\mathord}{symbols}{"9B}
-\stix@MathSymbol{\sqlozenge} {\mathord}{symbols}{"9C}
-\stix@MathSymbol{\profline} {\mathord}{symbols}{"9D}
-\stix@MathSymbol{\profsurf} {\mathord}{symbols}{"9E}
-\stix@MathSymbol{\viewdata} {\mathord}{symbols}{"9F}
-
-\stix@MathSymbol{\turnednot} {\mathord}{symbols}{"A0}
-\stix@MathSymbol{\ulcorner} {\mathopen}{symbols}{"A1}
-\stix@MathSymbol{\urcorner} {\mathclose}{symbols}{"A2}
-\stix@MathSymbol{\llcorner} {\mathopen}{symbols}{"A3}
-\stix@MathSymbol{\lrcorner} {\mathclose}{symbols}{"A4}
-\stix@MathSymbol{\varhexagonlrbonds} {\mathord}{symbols}{"A5}
-\stix@MathSymbol{\conictaper} {\mathord}{symbols}{"A6}
-\stix@MathSymbol{\topbot} {\mathord}{symbols}{"A7}
-\stix@MathSymbol{\obar} {\mathbin}{symbols}{"A8}
-\stix@MathSymbol{\APLnotslash} {\mathrel}{symbols}{"A9}
-\stix@MathSymbol{\APLnotbackslash} {\mathord}{symbols}{"AA}
-\stix@MathSymbol{\APLboxupcaret} {\mathord}{symbols}{"AB}
-\stix@MathSymbol{\APLboxquestion} {\mathord}{symbols}{"AC}
-\stix@MathSymbol{\rangledownzigzagarrow} {\mathord}{symbols}{"AD}
-\stix@MathSymbol{\hexagon} {\mathord}{symbols}{"AE}
-\stix@MathSymbol{\varcarriagereturn} {\mathord}{symbols}{"AF}
-
-\stix@MathSymbol{\trapezium} {\mathord}{symbols}{"B0}
-\stix@MathSymbol{\benzenr} {\mathord}{symbols}{"B1}
-\stix@MathSymbol{\strns} {\mathord}{symbols}{"B2}
-\stix@MathSymbol{\fltns} {\mathord}{symbols}{"B3}
-\stix@MathSymbol{\accurrent} {\mathord}{symbols}{"B4}
-\stix@MathSymbol{\elinters} {\mathord}{symbols}{"B5}
-\stix@MathSymbol{\mathvisiblespace} {\mathord}{symbols}{"B6}
-\stix@MathSymbol{\mdlgblksquare} {\mathord}{symbols}{"B7} \let\blacksquare=\mdlgblksquare
-\stix@MathSymbol{\mdlgwhtsquare} {\mathord}{symbols}{"B8} \let\square=\mdlgwhtsquare \let\Box=\mdlgwhtsquare
-\stix@MathSymbol{\squoval} {\mathord}{symbols}{"B9}
-\stix@MathSymbol{\blackinwhitesquare} {\mathord}{symbols}{"BA}
-\stix@MathSymbol{\squarehfill} {\mathord}{symbols}{"BB}
-\stix@MathSymbol{\squarevfill} {\mathord}{symbols}{"BC}
-\stix@MathSymbol{\squarehvfill} {\mathord}{symbols}{"BD}
-\stix@MathSymbol{\squarenwsefill} {\mathord}{symbols}{"BE}
-\stix@MathSymbol{\squareneswfill} {\mathord}{symbols}{"BF}
-
-\stix@MathSymbol{\squarecrossfill} {\mathord}{symbols}{"C0}
-\stix@MathSymbol{\smblksquare} {\mathord}{symbols}{"C1}
-\stix@MathSymbol{\smwhtsquare} {\mathord}{symbols}{"C2}
-\stix@MathSymbol{\hrectangleblack} {\mathord}{symbols}{"C3}
-\stix@MathSymbol{\hrectangle} {\mathord}{symbols}{"C4}
-\stix@MathSymbol{\vrectangleblack} {\mathord}{symbols}{"C5}
-\stix@MathSymbol{\vrectangle} {\mathord}{symbols}{"C6}
-\stix@MathSymbol{\parallelogramblack} {\mathord}{symbols}{"C7}
-\stix@MathSymbol{\parallelogram} {\mathord}{symbols}{"C8}
-\stix@MathSymbol{\bigblacktriangleup} {\mathord}{symbols}{"C9}
-\stix@MathSymbol{\bigtriangleup} {\mathbin}{symbols}{"CA} \let\varbigtriangleup=\bigtriangleup \let\triangle=\bigtriangleup
-\stix@MathSymbol{\blacktriangle} {\mathord}{symbols}{"CB}
-\stix@MathSymbol{\vartriangle} {\mathrel}{symbols}{"CC}
-\stix@MathSymbol{\blacktriangleright} {\mathord}{symbols}{"CD}
-\stix@MathSymbol{\vartriangleright} {\mathrel}{symbols}{"CE} \stix@MathSymbol{\rhd}{\mathbin}{symbols}{"CE}
-\stix@MathSymbol{\smallblacktriangleright} {\mathord}{symbols}{"CF}
-
-\stix@MathSymbol{\smalltriangleright} {\mathord}{symbols}{"D0}
-\stix@MathSymbol{\blackpointerright} {\mathord}{symbols}{"D1}
-\stix@MathSymbol{\whitepointerright} {\mathord}{symbols}{"D2}
-\stix@MathSymbol{\bigblacktriangledown} {\mathord}{symbols}{"D3}
-\stix@MathSymbol{\bigtriangledown} {\mathord}{symbols}{"D4} \let\varbigtriangledown=\bigtriangledown
-\stix@MathSymbol{\blacktriangledown} {\mathord}{symbols}{"D5}
-\stix@MathSymbol{\triangledown} {\mathord}{symbols}{"D6}
-\stix@MathSymbol{\blacktriangleleft} {\mathord}{symbols}{"D7}
-\stix@MathSymbol{\vartriangleleft} {\mathrel}{symbols}{"D8} \stix@MathSymbol{\lhd}{\mathbin}{symbols}{"D8}
-\stix@MathSymbol{\smallblacktriangleleft} {\mathord}{symbols}{"D9}
-\stix@MathSymbol{\smalltriangleleft} {\mathord}{symbols}{"DA}
-\stix@MathSymbol{\blackpointerleft} {\mathord}{symbols}{"DB}
-\stix@MathSymbol{\whitepointerleft} {\mathord}{symbols}{"DC}
-\stix@MathSymbol{\mdlgblkdiamond} {\mathord}{symbols}{"DD}
-\stix@MathSymbol{\mdlgwhtdiamond} {\mathord}{symbols}{"DE}
-\stix@MathSymbol{\blackinwhitediamond} {\mathord}{symbols}{"DF}
-
-\stix@MathSymbol{\fisheye} {\mathord}{symbols}{"E0}
-\stix@MathSymbol{\mdlgwhtlozenge} {\mathord}{symbols}{"E1} \let\lozenge=\mdlgwhtlozenge \let\Diamond=\mdlgwhtlozenge
-\stix@MathSymbol{\mdlgwhtcircle} {\mathbin}{symbols}{"E2} \let\bigcirc=\mdlgwhtcircle
-\stix@MathSymbol{\dottedcircle} {\mathord}{symbols}{"E3}
-\stix@MathSymbol{\circlevertfill} {\mathord}{symbols}{"E4}
-\stix@MathSymbol{\bullseye} {\mathord}{symbols}{"E5}
-\stix@MathSymbol{\mdlgblkcircle} {\mathord}{symbols}{"E6}
-\stix@MathSymbol{\circlelefthalfblack} {\mathord}{symbols}{"E7}
-\stix@MathSymbol{\circlerighthalfblack} {\mathord}{symbols}{"E8}
-\stix@MathSymbol{\circlebottomhalfblack} {\mathord}{symbols}{"E9}
-\stix@MathSymbol{\circletophalfblack} {\mathord}{symbols}{"EA}
-\stix@MathSymbol{\circleurquadblack} {\mathord}{symbols}{"EB}
-\stix@MathSymbol{\blackcircleulquadwhite} {\mathord}{symbols}{"EC}
-\stix@MathSymbol{\blacklefthalfcircle} {\mathord}{symbols}{"ED}
-\stix@MathSymbol{\blackrighthalfcircle} {\mathord}{symbols}{"EE}
-\stix@MathSymbol{\inversebullet} {\mathord}{symbols}{"EF}
-
-\stix@MathSymbol{\inversewhitecircle} {\mathord}{symbols}{"F0}
-\stix@MathSymbol{\invwhiteupperhalfcircle} {\mathord}{symbols}{"F1}
-\stix@MathSymbol{\invwhitelowerhalfcircle} {\mathord}{symbols}{"F2}
-\stix@MathSymbol{\ularc} {\mathord}{symbols}{"F3}
-\stix@MathSymbol{\urarc} {\mathord}{symbols}{"F4}
-\stix@MathSymbol{\lrarc} {\mathord}{symbols}{"F5}
-\stix@MathSymbol{\llarc} {\mathord}{symbols}{"F6}
-\stix@MathSymbol{\topsemicircle} {\mathord}{symbols}{"F7}
-\stix@MathSymbol{\botsemicircle} {\mathord}{symbols}{"F8}
-\stix@MathSymbol{\lrblacktriangle} {\mathord}{symbols}{"F9}
-\stix@MathSymbol{\llblacktriangle} {\mathord}{symbols}{"FA}
-\stix@MathSymbol{\ulblacktriangle} {\mathord}{symbols}{"FB}
-\stix@MathSymbol{\urblacktriangle} {\mathord}{symbols}{"FC}
-\stix@MathSymbol{\smwhtcircle} {\mathord}{symbols}{"FD} \let\circ=\smwhtcircle
-\stix@MathSymbol{\squareleftblack} {\mathord}{symbols}{"FE}
-\stix@MathSymbol{\squarerightblack} {\mathord}{symbols}{"FF}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\acidfree} {\mathord} {symbols2}{"00}
-\stix@MathSymbol{\draftingarrow} {\mathord} {symbols2}{"01}
-\stix@MathSymbol{\threedangle} {\mathord} {symbols2}{"02}
-\stix@MathSymbol{\whiteinwhitetriangle} {\mathord} {symbols2}{"03}
-\stix@MathSymbol{\perp} {\mathrel} {symbols2}{"04}
-\stix@MathSymbol{\subsetcirc} {\mathord} {symbols2}{"05}
-\stix@MathSymbol{\supsetcirc} {\mathord} {symbols2}{"06}
-\stix@MathSymbol{\lbag} {\mathopen} {symbols2}{"07}
-\stix@MathSymbol{\rbag} {\mathclose}{symbols2}{"08}
-\stix@MathSymbol{\veedot} {\mathbin} {symbols2}{"09}
-\stix@MathSymbol{\bsolhsub} {\mathrel} {symbols2}{"0A}
-\stix@MathSymbol{\suphsol} {\mathrel} {symbols2}{"0B}
-\stix@MathSymbol{\diamondcdot} {\mathord} {symbols2}{"0C}
-\stix@MathSymbol{\wedgedot} {\mathbin} {symbols2}{"0D}
-\stix@MathSymbol{\upin} {\mathrel} {symbols2}{"0E}
-\stix@MathSymbol{\pullback} {\mathrel} {symbols2}{"0F}
-\stix@MathSymbol{\pushout} {\mathrel} {symbols2}{"10}
-\stix@MathSymbol{\leftouterjoin} {\mathop} {symbols2}{"11}
-\stix@MathSymbol{\rightouterjoin} {\mathop} {symbols2}{"12}
-\stix@MathSymbol{\fullouterjoin} {\mathop} {symbols2}{"13}
-\stix@MathSymbol{\bigbot} {\mathop} {symbols2}{"14}
-\stix@MathSymbol{\bigtop} {\mathop} {symbols2}{"15}
-\stix@MathSymbol{\DashVDash} {\mathrel} {symbols2}{"16}
-\stix@MathSymbol{\dashVdash} {\mathrel} {symbols2}{"17}
-\stix@MathSymbol{\multimapinv} {\mathrel} {symbols2}{"18}
-\stix@MathSymbol{\vlongdash} {\mathrel} {symbols2}{"19}
-\stix@MathSymbol{\longdashv} {\mathrel} {symbols2}{"1A}
-\stix@MathSymbol{\cirbot} {\mathrel} {symbols2}{"1B}
-\stix@MathSymbol{\lozengeminus} {\mathbin} {symbols2}{"1C}
-\stix@MathSymbol{\concavediamond} {\mathbin} {symbols2}{"1D}
-\stix@MathSymbol{\concavediamondtickleft} {\mathbin} {symbols2}{"1E}
-\stix@MathSymbol{\concavediamondtickright} {\mathbin} {symbols2}{"1F}
-\stix@MathSymbol{\whitesquaretickleft} {\mathbin} {symbols2}{"20}
-\stix@MathSymbol{\whitesquaretickright} {\mathbin} {symbols2}{"21}
-\stix@MathSymbol{\Lbrbrak} {\mathopen} {symbols2}{"22}
-\stix@MathSymbol{\Rbrbrak} {\mathclose}{symbols2}{"23}
-\stix@MathSymbol{\mdsmblkcircle} {\mathord} {symbols2}{"24}
-\stix@MathSymbol{\typecolon} {\mathbin} {symbols2}{"25}
-\stix@MathSymbol{\llparenthesis} {\mathopen} {symbols2}{"26}
-\stix@MathSymbol{\rrparenthesis} {\mathclose}{symbols2}{"27}
-\stix@MathSymbol{\llangle} {\mathopen} {symbols2}{"28}
-\stix@MathSymbol{\rrangle} {\mathclose}{symbols2}{"29}
-\stix@MathSymbol{\lbrackubar} {\mathopen} {symbols2}{"2A}
-\stix@MathSymbol{\rbrackubar} {\mathclose}{symbols2}{"2B}
-\stix@MathSymbol{\lbrackultick} {\mathopen} {symbols2}{"2C}
-\stix@MathSymbol{\rbracklrtick} {\mathclose}{symbols2}{"2D}
-\stix@MathSymbol{\lbracklltick} {\mathopen} {symbols2}{"2E}
-\stix@MathSymbol{\rbrackurtick} {\mathclose}{symbols2}{"2F}
-\stix@MathSymbol{\langledot} {\mathopen} {symbols2}{"30}
-\stix@MathSymbol{\rangledot} {\mathclose}{symbols2}{"31}
-\stix@MathSymbol{\lparenless} {\mathopen} {symbols2}{"32}
-\stix@MathSymbol{\rparengtr} {\mathclose}{symbols2}{"33}
-\stix@MathSymbol{\Lparengtr} {\mathopen} {symbols2}{"34}
-\stix@MathSymbol{\Rparenless} {\mathclose}{symbols2}{"35}
-\stix@MathSymbol{\lblkbrbrak} {\mathopen} {symbols2}{"36}
-\stix@MathSymbol{\rblkbrbrak} {\mathclose}{symbols2}{"37}
-\stix@MathSymbol{\fourvdots} {\mathord} {symbols2}{"38}
-\stix@MathSymbol{\vzigzag} {\mathord} {symbols2}{"39}
-\stix@MathSymbol{\measuredangleleft} {\mathord} {symbols2}{"3A}
-\stix@MathSymbol{\rightanglesqr} {\mathord} {symbols2}{"3B}
-\stix@MathSymbol{\rightanglemdot} {\mathord} {symbols2}{"3C}
-\stix@MathSymbol{\angles} {\mathord} {symbols2}{"3D}
-\stix@MathSymbol{\angdnr} {\mathord} {symbols2}{"3E}
-\stix@MathSymbol{\gtlpar} {\mathord} {symbols2}{"3F}
-\stix@MathSymbol{\sphericalangleup} {\mathord} {symbols2}{"40}
-\stix@MathSymbol{\turnangle} {\mathord} {symbols2}{"5B}
-\stix@MathSymbol{\revangle} {\mathord} {symbols2}{"5C}
-\stix@MathSymbol{\angleubar} {\mathord} {symbols2}{"5D}
-\stix@MathSymbol{\revangleubar} {\mathord} {symbols2}{"5E}
-\stix@MathSymbol{\wideangledown} {\mathord} {symbols2}{"5F}
-\stix@MathSymbol{\wideangleup} {\mathord} {symbols2}{"60}
-\stix@MathSymbol{\measanglerutone} {\mathord} {symbols2}{"7D}
-\stix@MathSymbol{\measanglelutonw} {\mathord} {symbols2}{"7E}
-
-\stix@MathSymbol{\measanglerdtose} {\mathord} {symbols2}{"99}
-\stix@MathSymbol{\measangleldtosw} {\mathord} {symbols2}{"9A}
-\stix@MathSymbol{\measangleurtone} {\mathord} {symbols2}{"9B}
-\stix@MathSymbol{\measangleultonw} {\mathord} {symbols2}{"9C}
-\stix@MathSymbol{\measangledrtose} {\mathord} {symbols2}{"9D}
-\stix@MathSymbol{\measangledltosw} {\mathord} {symbols2}{"9E}
-\stix@MathSymbol{\revemptyset} {\mathord} {symbols2}{"9F}
-
-\stix@MathSymbol{\emptysetobar} {\mathord} {symbols2}{"A0}
-\stix@MathSymbol{\emptysetocirc} {\mathord} {symbols2}{"A1}
-\stix@MathSymbol{\emptysetoarr} {\mathord} {symbols2}{"A2}
-\stix@MathSymbol{\emptysetoarrl} {\mathord} {symbols2}{"A3}
-\stix@MathSymbol{\circlehbar} {\mathbin} {symbols2}{"A4}
-\stix@MathSymbol{\circledvert} {\mathbin} {symbols2}{"A5}
-\stix@MathSymbol{\circledparallel} {\mathbin} {symbols2}{"A6}
-\stix@MathSymbol{\obslash} {\mathbin} {symbols2}{"A7}
-\stix@MathSymbol{\operp} {\mathbin} {symbols2}{"A8}
-\stix@MathSymbol{\obot} {\mathord} {symbols2}{"A9}
-\stix@MathSymbol{\olcross} {\mathord} {symbols2}{"AA}
-\stix@MathSymbol{\odotslashdot} {\mathord} {symbols2}{"AB}
-\stix@MathSymbol{\uparrowoncircle} {\mathord} {symbols2}{"AC}
-\stix@MathSymbol{\circledwhitebullet} {\mathord} {symbols2}{"AD}
-\stix@MathSymbol{\circledbullet} {\mathord} {symbols2}{"AE}
-\stix@MathSymbol{\olessthan} {\mathbin} {symbols2}{"AF}
-
-\stix@MathSymbol{\ogreaterthan} {\mathbin} {symbols2}{"B0}
-\stix@MathSymbol{\cirscir} {\mathord} {symbols2}{"B1}
-\stix@MathSymbol{\cirE} {\mathord} {symbols2}{"B2}
-\stix@MathSymbol{\boxdiag} {\mathbin} {symbols2}{"B3}
-\stix@MathSymbol{\boxbslash} {\mathbin} {symbols2}{"B4}
-\stix@MathSymbol{\boxast} {\mathbin} {symbols2}{"B5}
-\stix@MathSymbol{\boxcircle} {\mathbin} {symbols2}{"B6}
-\stix@MathSymbol{\boxbox} {\mathbin} {symbols2}{"B7}
-\stix@MathSymbol{\boxonbox} {\mathord} {symbols2}{"B8}
-\stix@MathSymbol{\triangleodot} {\mathord} {symbols2}{"B9}
-\stix@MathSymbol{\triangleubar} {\mathord} {symbols2}{"BA}
-\stix@MathSymbol{\triangles} {\mathord} {symbols2}{"BB}
-\stix@MathSymbol{\triangleserifs} {\mathbin} {symbols2}{"BC}
-\stix@MathSymbol{\rtriltri} {\mathrel} {symbols2}{"BD}
-\stix@MathSymbol{\ltrivb} {\mathrel} {symbols2}{"BE}
-\stix@MathSymbol{\vbrtri} {\mathrel} {symbols2}{"BF}
-
-\stix@MathSymbol{\lfbowtie} {\mathrel} {symbols2}{"C0}
-\stix@MathSymbol{\rfbowtie} {\mathrel} {symbols2}{"C1}
-\stix@MathSymbol{\fbowtie} {\mathrel} {symbols2}{"C2}
-\stix@MathSymbol{\lftimes} {\mathrel} {symbols2}{"C3}
-\stix@MathSymbol{\rftimes} {\mathrel} {symbols2}{"C4}
-\stix@MathSymbol{\hourglass} {\mathbin} {symbols2}{"C5}
-\stix@MathSymbol{\blackhourglass} {\mathbin} {symbols2}{"C6}
-\stix@MathSymbol{\lvzigzag} {\mathopen} {symbols2}{"C7}
-\stix@MathSymbol{\rvzigzag} {\mathclose}{symbols2}{"C8}
-\stix@MathSymbol{\Lvzigzag} {\mathopen} {symbols2}{"C9}
-\stix@MathSymbol{\Rvzigzag} {\mathclose}{symbols2}{"CA}
-\stix@MathSymbol{\iinfin} {\mathord} {symbols2}{"CB}
-\stix@MathSymbol{\tieinfty} {\mathord} {symbols2}{"CC}
-\stix@MathSymbol{\nvinfty} {\mathord} {symbols2}{"CD}
-\stix@MathSymbol{\dualmap} {\mathrel} {symbols2}{"CE}
-\stix@MathSymbol{\laplac} {\mathord} {symbols2}{"CF}
-
-\stix@MathSymbol{\lrtriangleeq} {\mathrel} {symbols2}{"D0}
-\stix@MathSymbol{\shuffle} {\mathbin} {symbols2}{"D1}
-\stix@MathSymbol{\eparsl} {\mathrel} {symbols2}{"D2}
-\stix@MathSymbol{\smeparsl} {\mathrel} {symbols2}{"D3}
-\stix@MathSymbol{\eqvparsl} {\mathrel} {symbols2}{"D4}
-\stix@MathSymbol{\gleichstark} {\mathrel} {symbols2}{"D5}
-\stix@MathSymbol{\thermod} {\mathord} {symbols2}{"D6}
-\stix@MathSymbol{\downtriangleleftblack} {\mathord} {symbols2}{"D7}
-\stix@MathSymbol{\downtrianglerightblack} {\mathord} {symbols2}{"D8}
-\stix@MathSymbol{\blackdiamonddownarrow} {\mathord} {symbols2}{"D9}
-\stix@MathSymbol{\blacklozenge} {\mathord} {symbols2}{"DA} \stix@MathSymbol{\mdlgblklozenge}{\mathbin}{symbols2}{"DA}
-\stix@MathSymbol{\circledownarrow} {\mathord} {symbols2}{"DB}
-\stix@MathSymbol{\blackcircledownarrow} {\mathord} {symbols2}{"DC}
-\stix@MathSymbol{\errbarsquare} {\mathord} {symbols2}{"DD}
-\stix@MathSymbol{\errbarblacksquare} {\mathord} {symbols2}{"DE}
-\stix@MathSymbol{\errbardiamond} {\mathord} {symbols2}{"DF}
-
-\stix@MathSymbol{\errbarblackdiamond} {\mathord} {symbols2}{"E0}
-\stix@MathSymbol{\errbarcircle} {\mathord} {symbols2}{"E1}
-\stix@MathSymbol{\errbarblackcircle} {\mathord} {symbols2}{"E2}
-\stix@MathSymbol{\ruledelayed} {\mathrel} {symbols2}{"E3}
-\stix@MathSymbol{\setminus} {\mathbin} {symbols2}{"E4}
-\stix@MathSymbol{\dsol} {\mathbin} {symbols2}{"E5}
-\stix@MathSymbol{\rsolbar} {\mathbin} {symbols2}{"E6}
-\stix@MathSymbol{\doubleplus} {\mathbin} {symbols2}{"E7}
-\stix@MathSymbol{\tripleplus} {\mathbin} {symbols2}{"E8}
-\stix@MathSymbol{\lcurvyangle} {\mathopen} {symbols2}{"E9}
-\stix@MathSymbol{\rcurvyangle} {\mathclose}{symbols2}{"EA}
-\stix@MathSymbol{\tplus} {\mathbin} {symbols2}{"EB}
-\stix@MathSymbol{\tminus} {\mathbin} {symbols2}{"EC}
-\stix@MathSymbol{\Join} {\mathop} {symbols2}{"ED}
-\stix@MathSymbol{\bigtriangleleft} {\mathop} {symbols2}{"EE}
-\stix@MathSymbol{\zcmp} {\mathop} {symbols2}{"EF}
-
-\stix@MathSymbol{\zpipe} {\mathop} {symbols2}{"F0}
-\stix@MathSymbol{\zproject} {\mathop} {symbols2}{"F1}
-\stix@MathSymbol{\ringplus} {\mathbin} {symbols2}{"F2}
-\stix@MathSymbol{\plushat} {\mathbin} {symbols2}{"F3}
-\stix@MathSymbol{\simplus} {\mathbin} {symbols2}{"F4}
-\stix@MathSymbol{\plusdot} {\mathbin} {symbols2}{"F5}
-\stix@MathSymbol{\plussim} {\mathbin} {symbols2}{"F6}
-\stix@MathSymbol{\plussubtwo} {\mathbin} {symbols2}{"F7}
-\stix@MathSymbol{\plustrif} {\mathbin} {symbols2}{"F8}
-\stix@MathSymbol{\commaminus} {\mathbin} {symbols2}{"F9}
-\stix@MathSymbol{\minusdot} {\mathbin} {symbols2}{"FA}
-\stix@MathSymbol{\minusfdots} {\mathbin} {symbols2}{"FB}
-\stix@MathSymbol{\minusrdots} {\mathbin} {symbols2}{"FC}
-\stix@MathSymbol{\opluslhrim} {\mathbin} {symbols2}{"FD}
-\stix@MathSymbol{\oplusrhrim} {\mathbin} {symbols2}{"FE}
-\stix@MathSymbol{\vectimes} {\mathbin} {symbols2}{"FF}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\succneq} {\mathrel}{symbols3}{"26}
-\stix@MathSymbol{\preceqq} {\mathrel}{symbols3}{"27}
-\stix@MathSymbol{\succeqq} {\mathrel}{symbols3}{"28}
-\stix@MathSymbol{\precneqq} {\mathrel}{symbols3}{"29}
-\stix@MathSymbol{\succneqq} {\mathrel}{symbols3}{"2A}
-\stix@MathSymbol{\precapprox} {\mathrel}{symbols3}{"2B}
-\stix@MathSymbol{\succapprox} {\mathrel}{symbols3}{"2C}
-\stix@MathSymbol{\precnapprox} {\mathrel}{symbols3}{"2D}
-\stix@MathSymbol{\succnapprox} {\mathrel}{symbols3}{"2E}
-\stix@MathSymbol{\Prec} {\mathrel}{symbols3}{"2F}
-\stix@MathSymbol{\Succ} {\mathrel}{symbols3}{"3A}
-\stix@MathSymbol{\subsetdot} {\mathrel}{symbols3}{"3B}
-\stix@MathSymbol{\supsetdot} {\mathrel}{symbols3}{"3C}
-\stix@MathSymbol{\subsetplus} {\mathrel}{symbols3}{"3D}
-\stix@MathSymbol{\supsetplus} {\mathrel}{symbols3}{"3E}
-\stix@MathSymbol{\submult} {\mathrel}{symbols3}{"3F}
-\stix@MathSymbol{\supmult} {\mathrel}{symbols3}{"40}
-\stix@MathSymbol{\subedot} {\mathrel}{symbols3}{"5B}
-\stix@MathSymbol{\supedot} {\mathrel}{symbols3}{"5C}
-\stix@MathSymbol{\subseteqq} {\mathrel}{symbols3}{"5D}
-\stix@MathSymbol{\supseteqq} {\mathrel}{symbols3}{"5E}
-\stix@MathSymbol{\subsim} {\mathrel}{symbols3}{"5F}
-\stix@MathSymbol{\supsim} {\mathrel}{symbols3}{"60}
-\stix@MathSymbol{\subsetapprox} {\mathrel}{symbols3}{"7D}
-\stix@MathSymbol{\supsetapprox} {\mathrel}{symbols3}{"7E}
-
-\stix@MathSymbol{\Bbbk} {\mathord}{symbols3}{`k}
-
-\stix@MathSymbol{\capbarcup} {\mathbin}{symbols3}{"99}
-\stix@MathSymbol{\twocups} {\mathbin}{symbols3}{"9A}
-\stix@MathSymbol{\twocaps} {\mathbin}{symbols3}{"9B}
-\stix@MathSymbol{\closedvarcup} {\mathbin}{symbols3}{"9C}
-\stix@MathSymbol{\closedvarcap} {\mathbin}{symbols3}{"9D}
-\stix@MathSymbol{\Sqcap} {\mathbin}{symbols3}{"9E}
-\stix@MathSymbol{\Sqcup} {\mathbin}{symbols3}{"9F}
-
-\stix@MathSymbol{\closedvarcupsmashprod} {\mathbin}{symbols3}{"A0}
-\stix@MathSymbol{\wedgeodot} {\mathbin}{symbols3}{"A1}
-\stix@MathSymbol{\veeodot} {\mathbin}{symbols3}{"A2}
-\stix@MathSymbol{\Wedge} {\mathbin}{symbols3}{"A3}
-\stix@MathSymbol{\Vee} {\mathbin}{symbols3}{"A4}
-\stix@MathSymbol{\wedgeonwedge} {\mathbin}{symbols3}{"A5}
-\stix@MathSymbol{\veeonvee} {\mathbin}{symbols3}{"A6}
-\stix@MathSymbol{\bigslopedvee} {\mathbin}{symbols3}{"A7}
-\stix@MathSymbol{\bigslopedwedge} {\mathbin}{symbols3}{"A8}
-\stix@MathSymbol{\veeonwedge} {\mathrel}{symbols3}{"A9}
-\stix@MathSymbol{\wedgemidvert} {\mathbin}{symbols3}{"AA}
-\stix@MathSymbol{\veemidvert} {\mathbin}{symbols3}{"AB}
-\stix@MathSymbol{\midbarwedge} {\mathbin}{symbols3}{"AC}
-\stix@MathSymbol{\midbarvee} {\mathbin}{symbols3}{"AD}
-\stix@MathSymbol{\doublebarwedge} {\mathbin}{symbols3}{"AE}
-\stix@MathSymbol{\wedgebar} {\mathbin}{symbols3}{"AF}
-
-\stix@MathSymbol{\wedgedoublebar} {\mathbin}{symbols3}{"B0}
-\stix@MathSymbol{\varveebar} {\mathbin}{symbols3}{"B1}
-\stix@MathSymbol{\doublebarvee} {\mathbin}{symbols3}{"B2}
-\stix@MathSymbol{\veedoublebar} {\mathbin}{symbols3}{"B3}
-\stix@MathSymbol{\dsub} {\mathbin}{symbols3}{"B4}
-\stix@MathSymbol{\rsub} {\mathbin}{symbols3}{"B5}
-\stix@MathSymbol{\eqdot} {\mathrel}{symbols3}{"B6}
-\stix@MathSymbol{\dotequiv} {\mathrel}{symbols3}{"B7}
-\stix@MathSymbol{\equivVert} {\mathrel}{symbols3}{"B8}
-\stix@MathSymbol{\equivVvert} {\mathrel}{symbols3}{"B9}
-\stix@MathSymbol{\dotsim} {\mathrel}{symbols3}{"BA}
-\stix@MathSymbol{\simrdots} {\mathrel}{symbols3}{"BB}
-\stix@MathSymbol{\simminussim} {\mathrel}{symbols3}{"BC}
-\stix@MathSymbol{\congdot} {\mathrel}{symbols3}{"BD}
-\stix@MathSymbol{\asteq} {\mathrel}{symbols3}{"BE}
-\stix@MathSymbol{\hatapprox} {\mathrel}{symbols3}{"BF}
-
-\stix@MathSymbol{\approxeqq} {\mathrel}{symbols3}{"C0}
-\stix@MathSymbol{\eqqplus} {\mathbin}{symbols3}{"C1}
-\stix@MathSymbol{\pluseqq} {\mathbin}{symbols3}{"C2}
-\stix@MathSymbol{\eqqsim} {\mathrel}{symbols3}{"C3}
-\stix@MathSymbol{\Coloneq} {\mathrel}{symbols3}{"C4}
-\stix@MathSymbol{\eqeq} {\mathrel}{symbols3}{"C5}
-\stix@MathSymbol{\eqeqeq} {\mathrel}{symbols3}{"C6}
-\stix@MathSymbol{\ddotseq} {\mathrel}{symbols3}{"C7}
-\stix@MathSymbol{\equivDD} {\mathrel}{symbols3}{"C8}
-\stix@MathSymbol{\ltcir} {\mathrel}{symbols3}{"C9}
-\stix@MathSymbol{\gtcir} {\mathrel}{symbols3}{"CA}
-\stix@MathSymbol{\ltquest} {\mathrel}{symbols3}{"CB}
-\stix@MathSymbol{\gtquest} {\mathrel}{symbols3}{"CC}
-\stix@MathSymbol{\leqslant} {\mathrel}{symbols3}{"CD}
-\stix@MathSymbol{\geqslant} {\mathrel}{symbols3}{"CE}
-\stix@MathSymbol{\lesdot} {\mathrel}{symbols3}{"CF}
-
-\stix@MathSymbol{\gesdot} {\mathrel}{symbols3}{"D0}
-\stix@MathSymbol{\lesdoto} {\mathrel}{symbols3}{"D1}
-\stix@MathSymbol{\gesdoto} {\mathrel}{symbols3}{"D2}
-\stix@MathSymbol{\lesdotor} {\mathrel}{symbols3}{"D3}
-\stix@MathSymbol{\gesdotol} {\mathrel}{symbols3}{"D4}
-\stix@MathSymbol{\lessapprox} {\mathrel}{symbols3}{"D5}
-\stix@MathSymbol{\gtrapprox} {\mathrel}{symbols3}{"D6}
-\stix@MathSymbol{\lneq} {\mathrel}{symbols3}{"D7}
-\stix@MathSymbol{\gneq} {\mathrel}{symbols3}{"D8}
-\stix@MathSymbol{\lnapprox} {\mathrel}{symbols3}{"D9}
-\stix@MathSymbol{\gnapprox} {\mathrel}{symbols3}{"DA}
-\stix@MathSymbol{\lesseqqgtr} {\mathrel}{symbols3}{"DB}
-\stix@MathSymbol{\gtreqqless} {\mathrel}{symbols3}{"DC}
-\stix@MathSymbol{\lsime} {\mathrel}{symbols3}{"DD}
-\stix@MathSymbol{\gsime} {\mathrel}{symbols3}{"DE}
-\stix@MathSymbol{\lsimg} {\mathrel}{symbols3}{"DF}
-
-\stix@MathSymbol{\gsiml} {\mathrel}{symbols3}{"E0}
-\stix@MathSymbol{\lgE} {\mathrel}{symbols3}{"E1}
-\stix@MathSymbol{\glE} {\mathrel}{symbols3}{"E2}
-\stix@MathSymbol{\lesges} {\mathrel}{symbols3}{"E3}
-\stix@MathSymbol{\gesles} {\mathrel}{symbols3}{"E4}
-\stix@MathSymbol{\eqslantless} {\mathrel}{symbols3}{"E5}
-\stix@MathSymbol{\eqslantgtr} {\mathrel}{symbols3}{"E6}
-\stix@MathSymbol{\elsdot} {\mathrel}{symbols3}{"E7}
-\stix@MathSymbol{\egsdot} {\mathrel}{symbols3}{"E8}
-\stix@MathSymbol{\eqqless} {\mathrel}{symbols3}{"E9}
-\stix@MathSymbol{\eqqgtr} {\mathrel}{symbols3}{"EA}
-\stix@MathSymbol{\eqqslantless} {\mathrel}{symbols3}{"EB}
-\stix@MathSymbol{\eqqslantgtr} {\mathrel}{symbols3}{"EC}
-\stix@MathSymbol{\simless} {\mathrel}{symbols3}{"ED}
-\stix@MathSymbol{\simgtr} {\mathrel}{symbols3}{"EE}
-\stix@MathSymbol{\simlE} {\mathrel}{symbols3}{"EF}
-
-\stix@MathSymbol{\simgE} {\mathrel}{symbols3}{"F0}
-\stix@MathSymbol{\Lt} {\mathrel}{symbols3}{"F1}
-\stix@MathSymbol{\Gt} {\mathrel}{symbols3}{"F2}
-\stix@MathSymbol{\partialmeetcontraction} {\mathrel}{symbols3}{"F3}
-\stix@MathSymbol{\glj} {\mathrel}{symbols3}{"F4}
-\stix@MathSymbol{\gla} {\mathrel}{symbols3}{"F5}
-\stix@MathSymbol{\ltcc} {\mathrel}{symbols3}{"F6}
-\stix@MathSymbol{\gtcc} {\mathrel}{symbols3}{"F7}
-\stix@MathSymbol{\lescc} {\mathrel}{symbols3}{"F8}
-\stix@MathSymbol{\gescc} {\mathrel}{symbols3}{"F9}
-\stix@MathSymbol{\smt} {\mathrel}{symbols3}{"FA}
-\stix@MathSymbol{\lat} {\mathrel}{symbols3}{"FB}
-\stix@MathSymbol{\smte} {\mathrel}{symbols3}{"FC}
-\stix@MathSymbol{\late} {\mathrel}{symbols3}{"FD}
-\stix@MathSymbol{\bumpeqq} {\mathrel}{symbols3}{"FE}
-\stix@MathSymbol{\precneq} {\mathrel}{symbols3}{"FF}
-% \end{macrocode}
-%
-% \begin{macrocode}
-\stix@MathSymbol{\ngeqq} {\mathrel}{symbols4}{"02}
-\stix@MathSymbol{\ngeqslant} {\mathrel}{symbols4}{"03}
-\stix@MathSymbol{\nleqslant} {\mathrel}{symbols4}{"04}
-\stix@MathSymbol{\nleqq} {\mathrel}{symbols4}{"05}
-\stix@MathSymbol{\nsubseteqq} {\mathrel}{symbols4}{"06}
-\stix@MathSymbol{\nsupseteqq} {\mathrel}{symbols4}{"07}
-
-\stix@MathSymbol{\mathsterling} {\mathord}{symbols4}{"7D}
-
-\stix@MathSymbol{\ncongdot} {\mathrel}{symbols4}{"09}
-\stix@MathSymbol{\napproxeqq} {\mathrel}{symbols4}{"0A}
-\stix@MathSymbol{\nll} {\mathrel}{symbols4}{"0B}
-\stix@MathSymbol{\ngg} {\mathrel}{symbols4}{"0C}
-\stix@MathSymbol{\nsqsubset} {\mathrel}{symbols4}{"1A}
-\stix@MathSymbol{\npreceq} {\mathrel}{symbols4}{"16}
-\stix@MathSymbol{\nsucceq} {\mathrel}{symbols4}{"19}
-\stix@MathSymbol{\nsqsupset} {\mathrel}{symbols4}{"1B}
-\stix@MathSymbol{\nBumpeq} {\mathrel}{symbols4}{"1C}
-\stix@MathSymbol{\nbumpeq} {\mathrel}{symbols4}{"1F}
-\stix@MathSymbol{\neqsim} {\mathrel}{symbols4}{"20}
-\stix@MathSymbol{\nvarisinobar} {\mathrel}{symbols4}{"21}
-\stix@MathSymbol{\nvarniobar} {\mathrel}{symbols4}{"22}
-\stix@MathSymbol{\neqslantless} {\mathrel}{symbols4}{"25}
-\stix@MathSymbol{\neqslantgtr} {\mathrel}{symbols4}{"26}
-
-\stix@MathSymbol{\subsetneqq} {\mathrel}{symbols4}{"99}
-\stix@MathSymbol{\supsetneqq} {\mathrel}{symbols4}{"9A}
-\stix@MathSymbol{\lsqhook} {\mathrel}{symbols4}{"9B}
-\stix@MathSymbol{\rsqhook} {\mathrel}{symbols4}{"9C}
-\stix@MathSymbol{\csub} {\mathrel}{symbols4}{"9D}
-\stix@MathSymbol{\csup} {\mathrel}{symbols4}{"9E}
-\stix@MathSymbol{\csube} {\mathrel}{symbols4}{"9F}
-
-\stix@MathSymbol{\csupe} {\mathrel}{symbols4}{"A0}
-\stix@MathSymbol{\subsup} {\mathrel}{symbols4}{"A1}
-\stix@MathSymbol{\supsub} {\mathrel}{symbols4}{"A2}
-\stix@MathSymbol{\subsub} {\mathrel}{symbols4}{"A3}
-\stix@MathSymbol{\supsup} {\mathrel}{symbols4}{"A4}
-\stix@MathSymbol{\suphsub} {\mathrel}{symbols4}{"A5}
-\stix@MathSymbol{\supdsub} {\mathrel}{symbols4}{"A6}
-\stix@MathSymbol{\forkv} {\mathrel}{symbols4}{"A7}
-\stix@MathSymbol{\topfork} {\mathrel}{symbols4}{"A8}
-\stix@MathSymbol{\mlcp} {\mathrel}{symbols4}{"A9}
-\stix@MathSymbol{\forks} {\mathrel}{symbols4}{"AA}
-\stix@MathSymbol{\forksnot} {\mathrel}{symbols4}{"AB}
-\stix@MathSymbol{\shortlefttack} {\mathrel}{symbols4}{"AC}
-\stix@MathSymbol{\shortdowntack} {\mathrel}{symbols4}{"AD}
-\stix@MathSymbol{\shortuptack} {\mathrel}{symbols4}{"AE}
-\stix@MathSymbol{\perps} {\mathord}{symbols4}{"AF}
-
-\stix@MathSymbol{\vDdash} {\mathrel}{symbols4}{"B0}
-\stix@MathSymbol{\dashV} {\mathrel}{symbols4}{"B1}
-\stix@MathSymbol{\Dashv} {\mathrel}{symbols4}{"B2}
-\stix@MathSymbol{\DashV} {\mathrel}{symbols4}{"B3}
-\stix@MathSymbol{\varVdash} {\mathrel}{symbols4}{"B4}
-\stix@MathSymbol{\Barv} {\mathrel}{symbols4}{"B5}
-\stix@MathSymbol{\vBar} {\mathrel}{symbols4}{"B6}
-\stix@MathSymbol{\vBarv} {\mathrel}{symbols4}{"B7}
-\stix@MathSymbol{\barV} {\mathrel}{symbols4}{"B8}
-\stix@MathSymbol{\Vbar} {\mathrel}{symbols4}{"B9}
-\stix@MathSymbol{\Not} {\mathrel}{symbols4}{"BA}
-\stix@MathSymbol{\bNot} {\mathrel}{symbols4}{"BB}
-\stix@MathSymbol{\revnmid} {\mathrel}{symbols4}{"BC}
-\stix@MathSymbol{\cirmid} {\mathrel}{symbols4}{"BD}
-\stix@MathSymbol{\midcir} {\mathrel}{symbols4}{"BE}
-\stix@MathSymbol{\topcir} {\mathord}{symbols4}{"BF}
-
-\stix@MathSymbol{\nhpar} {\mathrel}{symbols4}{"C0}
-\stix@MathSymbol{\parsim} {\mathrel}{symbols4}{"C1}
-\stix@MathSymbol{\interleave} {\mathbin}{symbols4}{"C2}
-\stix@MathSymbol{\nhVvert} {\mathbin}{symbols4}{"C3}
-\stix@MathSymbol{\threedotcolon} {\mathbin}{symbols4}{"C4}
-\stix@MathSymbol{\lllnest} {\mathrel}{symbols4}{"C5}
-\stix@MathSymbol{\gggnest} {\mathrel}{symbols4}{"C6}
-\stix@MathSymbol{\leqqslant} {\mathrel}{symbols4}{"C7}
-\stix@MathSymbol{\geqqslant} {\mathrel}{symbols4}{"C8}
-\stix@MathSymbol{\trslash} {\mathbin}{symbols4}{"C9}
-\stix@MathSymbol{\biginterleave} {\mathop} {symbols4}{"CA}
-\stix@MathSymbol{\sslash} {\mathbin}{symbols4}{"CB}
-\stix@MathSymbol{\talloblong} {\mathbin}{symbols4}{"CC}
-\stix@MathSymbol{\squaretopblack} {\mathord}{symbols4}{"CD}
-\stix@MathSymbol{\squarebotblack} {\mathord}{symbols4}{"CE}
-\stix@MathSymbol{\squareurblack} {\mathord}{symbols4}{"CF}
-
-\stix@MathSymbol{\squarellblack} {\mathord}{symbols4}{"D0}
-\stix@MathSymbol{\diamondleftblack} {\mathord}{symbols4}{"D1}
-\stix@MathSymbol{\diamondrightblack} {\mathord}{symbols4}{"D2}
-\stix@MathSymbol{\diamondtopblack} {\mathord}{symbols4}{"D3}
-\stix@MathSymbol{\diamondbotblack} {\mathord}{symbols4}{"D4}
-\stix@MathSymbol{\dottedsquare} {\mathord}{symbols4}{"D5}
-\stix@MathSymbol{\lgblksquare} {\mathord}{symbols4}{"D6}
-\stix@MathSymbol{\lgwhtsquare} {\mathord}{symbols4}{"D7}
-\stix@MathSymbol{\vysmblksquare} {\mathord}{symbols4}{"D8}
-\stix@MathSymbol{\vysmwhtsquare} {\mathord}{symbols4}{"D9}
-\stix@MathSymbol{\pentagonblack} {\mathord}{symbols4}{"DA}
-\stix@MathSymbol{\pentagon} {\mathord}{symbols4}{"DB}
-\stix@MathSymbol{\varhexagon} {\mathord}{symbols4}{"DC}
-\stix@MathSymbol{\varhexagonblack} {\mathord}{symbols4}{"DD}
-\stix@MathSymbol{\hexagonblack} {\mathord}{symbols4}{"DE}
-\stix@MathSymbol{\lgblkcircle} {\mathord}{symbols4}{"DF}
-
-\stix@MathSymbol{\mdblkdiamond} {\mathord}{symbols4}{"E0}
-\stix@MathSymbol{\mdwhtdiamond} {\mathord}{symbols4}{"E1}
-\stix@MathSymbol{\mdblklozenge} {\mathord}{symbols4}{"E2}
-\stix@MathSymbol{\mdwhtlozenge} {\mathord}{symbols4}{"E3}
-\stix@MathSymbol{\smblkdiamond} {\mathord}{symbols4}{"E4}
-\stix@MathSymbol{\smblklozenge} {\mathord}{symbols4}{"E5}
-\stix@MathSymbol{\smwhtlozenge} {\mathord}{symbols4}{"E6}
-\stix@MathSymbol{\blkhorzoval} {\mathord}{symbols4}{"E7}
-\stix@MathSymbol{\whthorzoval} {\mathord}{symbols4}{"E8}
-\stix@MathSymbol{\blkvertoval} {\mathord}{symbols4}{"E9}
-\stix@MathSymbol{\whtvertoval} {\mathord}{symbols4}{"EA}
-\stix@MathSymbol{\medwhitestar} {\mathord}{symbols4}{"EB}
-\stix@MathSymbol{\medblackstar} {\mathord}{symbols4}{"EC}
-\stix@MathSymbol{\smwhitestar} {\mathord}{symbols4}{"ED}
-\stix@MathSymbol{\rightpentagonblack} {\mathord}{symbols4}{"EE}
-\stix@MathSymbol{\rightpentagon} {\mathord}{symbols4}{"EF}
-
-\stix@MathSymbol{\postalmark} {\mathord}{symbols4}{"F0}
-\stix@MathSymbol{\hzigzag} {\mathord}{symbols4}{"F1}
-\stix@MathSymbol{\bbrktbrk} {\mathord}{symbols4}{"F2}
-\stix@MathSymbol{\obrbrak} {\mathord}{symbols4}{"F3}
-\stix@MathSymbol{\ubrbrak} {\mathord}{symbols4}{"F4}
-\stix@MathSymbol{\astrosun} {\mathord}{symbols4}{"F5}
-\stix@MathSymbol{\danger} {\mathord}{symbols4}{"F6}
-\stix@MathSymbol{\blacksmiley} {\mathord}{symbols4}{"F7}
-\stix@MathSymbol{\sun} {\mathord}{symbols4}{"F8}
-\stix@MathSymbol{\rightmoon} {\mathord}{symbols4}{"F9}
-\stix@MathSymbol{\leftmoon} {\mathord}{symbols4}{"FA}
-\stix@MathSymbol{\female} {\mathord}{symbols4}{"FB}
-\stix@MathSymbol{\male} {\mathord}{symbols4}{"FC}
-\stix@MathSymbol{\varspadesuit} {\mathord}{symbols4}{"FD}
-\stix@MathSymbol{\varheartsuit} {\mathord}{symbols4}{"FE}
-\stix@MathSymbol{\vardiamondsuit} {\mathord}{symbols4}{"FF}
-% \end{macrocode}
-%
-% Our fonts have no optical sizes, so we are loading |script| and
-% |scriptscript| fonts at bigger sizes than the default \LaTeX\ setup.
-%
-% \begin{macrocode}
- \DeclareMathSizes{10}{10}{7.5}{6}
-% \end{macrocode}
-%
-% \subsection{Package compatibility}
-%
-% \begin{macrocode}
-\AtBeginDocument{
- \@ifpackageloaded{amsmath}{
-% \end{macrocode}
-%
-% \pkg{amsmath} redefines |\big| etc. but they are small for us, so we revert
-% to the \LaTeX\ definition.
-%
-% \begin{macrocode}
- \renewcommand{\big}{\bBigg@{1.2}}
- \renewcommand{\Bigg}{\bBigg@{2.7}}
-% \end{macrocode}
-%
-% Keep \pkg{amsmath}'s definitions from persisting if it is loaded first.
-%
-% \begin{macrocode}
- \let\dotsb@\@cdots
- \let\dotsb\cdots
- \let\dotsm\cdots
- }{
-% \end{macrocode}
-%
-% For \pkg{amsmath}'s |*limits| options.
-%
-% \begin{macrocode}
- \let\ilimits@=\nolimits
- \let\slimits@=\relax
- \let\DOTSI\relax
- }
-}
-% \end{macrocode}
-%
-% \pkg{amsopn} changes the math code of some symbols inside its
-% |\DeclareMathOperator|, we fix them to match positions in our fonts.
-%
-% \begin{macrocode}
-\@ifpackageloaded{amsopn}{
- \begingroup \catcode`\"=12
- \gdef\newmcodes@{%
- \mathcode`\'="007F\relax%
- \mathcode`\*="003C\relax%
- \mathcode`\.="613A\relax%
- \ifnum\mathcode`\-="002A \else
- \mathchardef\std@minus\mathcode`\-\relax
- \fi
- \mathcode`\-="002A\relax%
- \mathcode`\/="005F\relax%
- \mathcode`\:="603A\relax%
- }
- \endgroup
-}{}
-% \end{macrocode}
-%
-% \subsection{Precomposed negations}
-%
-% Here we define |\not| as a macro that looks ahead and if there is a
-% precomposed negation of its argument, it will be used.
-%
-% \begin{macrocode}
-\@namedef{not=}{\ne}
-\@namedef{not>}{\ngtr}
-\@namedef{not<}{\nless}
-\let\ngets\nleftarrow
-\let\nsimeq\nsime
-\let\nforksnot\forks
-\let\nle\nleq
-\let\nge\ngeq
-\DeclareRobustCommand*{\not}[1]{%
- \begingroup \escapechar\m@ne\xdef\@gtempa{not\string#1}\endgroup
- \@ifundefined{\@gtempa}%
- {\not@n@{#1}}%
- {\@nameuse{\@gtempa}}}
-\def\not@n@#1{%
- \begingroup \escapechar\m@ne\xdef\@gtempa{n\string#1}\endgroup
- \@ifundefined{\@gtempa}%
- {\notchar #1}%
- {\@nameuse{\@gtempa}}}
-% \end{macrocode}
-%
-% \subsection{Compatibility with Babel}
-%
-% Spanish babel defines a version of |\dotlessi| that works for fonts other
-% than math italic, but this breaks when the \pkg{stix2} package is loaded. Our |\imath|
-% does this already, so we just use it.
-%
-% \begin{macrocode}
-\def\stix@dotlessi{\ifmmode\imath\else\i}
-\@ifundefined{es@dotlessi}{}{\let\es@dotlessi\stix@dotlessi}
-
-\fi
-\endinput
-% \end{macrocode}
-%
-% \iffalse
-%</package>
-% \fi
-%
-% \Finale
-\endinput
diff --git a/Master/texmf-dist/source/latex/stix2/stix2.fdd b/Master/texmf-dist/source/latex/stix2/stix2.fdd
deleted file mode 100644
index 1b677d6d32e..00000000000
--- a/Master/texmf-dist/source/latex/stix2/stix2.fdd
+++ /dev/null
@@ -1,239 +0,0 @@
-% \iffalse
-%<*driver>
-\begingroup
-\input docstrip
-\keepsilent
-\askforoverwritefalse
-
-\preamble
-
-Copyright (c) 2001-2018 by the STI Pub Companies, consisting of the
-American Chemical Society, the American Institute of Physics, the American
-Mathematical Society, the American Physical Society, Elsevier, Inc., and
-The Institute of Electrical and Electronic Engineers, Inc. Portions
-copyright (c) 1998-2003 by MicroPress, Inc. Portions copyright (c) 1990 by
-Elsevier, Inc. All rights reserved.
-
-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
- http://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 the STI Pub Companies.
-
-This work consists of the files stix2.fdd and and the derived files
-ls1stix2.fd, ls1stix2bb.fd, ls1stix2frak.fd, ls1stix2scr.fd, ls1stix2sf.fd,
-ls2stix2cal.fd, ls2stix2ex.fd, ls2stix2.fd, ls2stix2tt.fd, ot1stix2.fd,
-ot2stix2.fd, t1stix2.fd, ts1stix2.fd.
-
-\endpreamble
-
-\generate{\file{ls1stix2.fd}{\from{stix2.fdd}{ls1stix2}}}
-\generate{\file{ls1stix2bb.fd}{\from{stix2.fdd}{ls1stix2bb}}}
-\generate{\file{ls1stix2frak.fd}{\from{stix2.fdd}{ls1stix2frak}}}
-\generate{\file{ls1stix2scr.fd}{\from{stix2.fdd}{ls1stix2scr}}}
-\generate{\file{ls1stix2sf.fd}{\from{stix2.fdd}{ls1stix2sf}}}
-\generate{\file{ls2stix2cal.fd}{\from{stix2.fdd}{ls2stix2cal}}}
-\generate{\file{ls2stix2ex.fd}{\from{stix2.fdd}{ls2stix2ex}}}
-\generate{\file{ls2stix2.fd}{\from{stix2.fdd}{ls2stix2}}}
-\generate{\file{ls2stix2tt.fd}{\from{stix2.fdd}{ls2stix2tt}}}
-\generate{\file{ot1stix2.fd}{\from{stix2.fdd}{ot1stix2}}}
-\generate{\file{ot2stix2.fd}{\from{stix2.fdd}{ot2stix2}}}
-\generate{\file{t1stix2.fd}{\from{stix2.fdd}{t1stix2}}}
-\generate{\file{ts1stix2.fd}{\from{stix2.fdd}{ts1stix2}}}
-
-\endgroup
-\end
-%</driver>
-%\fi
-%<ls1stix2>\ProvidesFile{ls1stix2.fd}
-%<ls1stix2bb>\ProvidesFile{ls1stix2bb.fd}
-%<ls1stix2frak>\ProvidesFile{ls1stix2frak.fd}
-%<ls1stix2scr>\ProvidesFile{ls1stix2scr.fd}
-%<ls1stix2sf>\ProvidesFile{ls1stix2sf.fd}
-%<ls2stix2cal>\ProvidesFile{ls2stix2cal.fd}
-%<ls2stix2ex>\ProvidesFile{ls2stix2ex.fd}
-%<ls2stix2>\ProvidesFile{ls2stix2.fd}
-%<ls2stix2tt>\ProvidesFile{ls2stix2tt.fd}
-%<ot1stix2>\ProvidesFile{ot1stix2.fd}
-%<ot2stix2>\ProvidesFile{ot2stix2.fd}
-%<t1stix2>\ProvidesFile{t1stix2.fd}
-%<ts1stix2>\ProvidesFile{ts1stix2.fd}
-[2018/04/02 v2.0.0-latex stix2 %
-%<ls1stix2>LS1 %
-%<ls1stix2bb>blackboard LS1 %
-%<ls1stix2frak>fraktur LS1 %
-%<ls1stix2scr>script LS1 %
-%<ls1stix2sf>sans-serif LS1 %
-%<ls2stix2cal>calligraphic LS2 %
-%<ls2stix2ex>extentions LS2 %
-%<ls2stix2>LS2 %
-%<ls2stix2tt>typewriter LS2 %
-%<ot1stix2>OT1 %
-%<ot2stix2>OT2 %
-%<t1stix2>T1 %
-%<ts1stix2>TS1 %
-font definitions]
-%<*ls1stix2bb>
-\DeclareFontFamily{LS1}{stix2bb}{\skewchar\font127 }
-
-\DeclareFontShape{LS1}{stix2bb}{m}{n} {<-> stix2-mathbb}{}
-\DeclareFontShape{LS1}{stix2bb}{m}{it}{<-> stix2-mathbbit}{}
-\DeclareFontShape{LS1}{stix2bb}{b}{n} {<->sub * stix2bb/m/n}{}
-\DeclareFontShape{LS1}{stix2bb}{b}{it}{<->sub * stix2bb/m/it}{}
-%</ls1stix2bb>
-%
-%<*ls1stix2>
-\DeclareFontFamily{LS1}{stix2}{\skewchar\font127 }
-
-\DeclareFontShape{LS1}{stix2}{m}{n} {<-> stix2-mathrm}{}
-\DeclareFontShape{LS1}{stix2}{m}{it}{<-> stix2-mathit}{}
-\DeclareFontShape{LS1}{stix2}{b}{n} {<-> stix2-mathrm-bold}{}
-\DeclareFontShape{LS1}{stix2}{b}{it}{<-> stix2-mathit-bold}{}
-
-\DeclareFontShape{LS1}{stix2}{bx}{it}{<->ssub * stix2/b/it}{}
-%</ls1stix2>
-%
-%<*ls1stix2frak>
-\DeclareFontFamily{LS1}{stix2frak}{\skewchar\font127 }
-
-\DeclareFontShape{LS1}{stix2frak}{m}{n} {<-> stix2-mathfrak}{}
-\DeclareFontShape{LS1}{stix2frak}{b}{n} {<-> stix2-mathfrak-bold}{}
-%</ls1stix2frak>
-%
-%<*ls1stix2scr>
-\DeclareFontFamily{LS1}{stix2scr}{\skewchar\font127 }
-
-\DeclareFontShape{LS1}{stix2scr}{m}{n} {<-> stix2-mathscr}{}
-\DeclareFontShape{LS1}{stix2scr}{b}{n} {<-> stix2-mathscr-bold}{}
-\DeclareFontShape{LS1}{stix2scr}{bx}{n} {<->ssub * stix2scr/b/n}{}
-%</ls1stix2scr>
-%
-%<*ls1stix2sf>
-\DeclareFontFamily{LS1}{stix2sf}{\skewchar\font127 }
-
-\DeclareFontShape{LS1}{stix2sf}{m}{n} {<-> stix2-mathsf}{}
-\DeclareFontShape{LS1}{stix2sf}{m}{it}{<-> stix2-mathsfit}{}
-\DeclareFontShape{LS1}{stix2sf}{b}{n} {<-> stix2-mathsf-bold}{}
-\DeclareFontShape{LS1}{stix2sf}{b}{it}{<-> stix2-mathsfit-bold}{}
-
-\DeclareFontShape{LS1}{stix2sf}{bx}{it}{<->ssub * stix2sf/b/it}{}
-%</ls1stix2sf>
-%
-%<*ls2stix2cal>
-\DeclareFontFamily{LS2}{stix2cal}{\skewchar\font127 }
-
-\DeclareFontShape{LS2}{stix2cal}{m}{n} {<-> stix2-mathcal}{}
-\DeclareFontShape{LS2}{stix2cal}{b}{n} {<->sub * stix2cal/m/n}{}
-%</ls2stix2cal>
-%
-%<*ls2stix2ex>
-\DeclareFontFamily{LS2}{stix2ex}{}
-
-\DeclareFontShape{LS2}{stix2ex}{m}{n} {<-> stix2-mathex}{}
-\DeclareFontShape{LS2}{stix2ex}{b}{n} {<->sub * stix2ex/m/n}{}
-%</ls2stix2ex>
-%
-%<*ls2stix2>
-\DeclareFontFamily{LS2}{stix2}{\skewchar\font127 }
-
-\DeclareFontShape{LS2}{stix2}{m}{n} {<-> stix2-mathrm}{}
-\DeclareFontShape{LS2}{stix2}{m}{it}{<-> stix2-mathit}{}
-\DeclareFontShape{LS2}{stix2}{b}{n} {<-> stix2-mathrm-bold}{}
-\DeclareFontShape{LS2}{stix2}{b}{it}{<-> stix2-mathit-bold}{}
-
-\DeclareFontShape{LS2}{stix2}{bx}{it}{<->ssub * stix2/b/it}{}
-%</ls2stix2>
-%
-%<*ls2stix2tt>
-\DeclareFontFamily{LS2}{stix2tt}{\skewchar\font127 }
-
-\DeclareFontShape{LS2}{stix2tt}{m}{n} {<-> stix2-mathtt}{}
-\DeclareFontShape{LS2}{stix2tt}{b}{n} {<->sub * stix2tt/m/n}{}
-%</ls2stix2tt>
-%
-%<*ot1stix2>
-\DeclareFontFamily{OT1}{stix2}{}
-
-\DeclareFontShape{OT1}{stix2}{m}{n} {<-> ot1-stix2text}{}
-\DeclareFontShape{OT1}{stix2}{b}{n} {<-> ot1-stix2text-bold}{}
-\DeclareFontShape{OT1}{stix2}{m}{it}{<-> ot1-stix2text-italic}{}
-\DeclareFontShape{OT1}{stix2}{b}{it}{<-> ot1-stix2text-bolditalic}{}
-
-\DeclareFontShape{OT1}{stix2}{m}{sc}{<-> ot1-stix2textsc}{}
-\DeclareFontShape{OT1}{stix2}{b}{sc}{<-> ot1-stix2textsc-bold}{}
-
-\DeclareFontShape{OT1}{stix2}{m}{sl}{<->ssub * stix2/m/it}{}
-\DeclareFontShape{OT1}{stix2}{b}{sl}{<->ssub * stix2/b/it}{}
-
-\DeclareFontShape{OT1}{stix2}{bx}{n} {<->ssub * stix2/b/n}{}
-\DeclareFontShape{OT1}{stix2}{bx}{sc}{<->ssub * stix2/b/sc}{}
-\DeclareFontShape{OT1}{stix2}{bx}{sl}{<->ssub * stix2/b/sl}{}
-\DeclareFontShape{OT1}{stix2}{bx}{it}{<->ssub * stix2/b/it}{}
-%</ot1stix2>
-%
-%<*ot2stix2>
-\DeclareFontFamily{OT2}{stix2}{}
-
-\DeclareFontShape{OT2}{stix2}{m}{n} {<-> ot2-stix2text}{}
-\DeclareFontShape{OT2}{stix2}{b}{n} {<-> ot2-stix2text-bold}{}
-\DeclareFontShape{OT2}{stix2}{m}{it}{<-> ot2-stix2text-italic}{}
-\DeclareFontShape{OT2}{stix2}{b}{it}{<-> ot2-stix2text-bolditalic}{}
-
-\DeclareFontShape{OT2}{stix2}{m}{sc}{<-> ot2-stix2textsc}{}
-\DeclareFontShape{OT2}{stix2}{b}{sc}{<-> ot2-stix2textsc-bold}{}
-
-\DeclareFontShape{OT2}{stix2}{m}{sl}{<->ssub * stix2/m/it}{}
-\DeclareFontShape{OT2}{stix2}{b}{sl}{<->ssub * stix2/b/it}{}
-
-\DeclareFontShape{OT2}{stix2}{bx}{n} {<->ssub * stix2/b/n}{}
-\DeclareFontShape{OT2}{stix2}{bx}{sc}{<->ssub * stix2/b/sc}{}
-\DeclareFontShape{OT2}{stix2}{bx}{sl}{<->ssub * stix2/b/sl}{}
-\DeclareFontShape{OT2}{stix2}{bx}{it}{<->ssub * stix2/b/it}{}
-%</ot2stix2>
-%
-%<*t1stix2>
-\DeclareFontFamily{T1}{stix2}{}
-
-\DeclareFontShape{T1}{stix2}{m}{n} {<-> t1-stix2text}{}
-\DeclareFontShape{T1}{stix2}{b}{n} {<-> t1-stix2text-bold}{}
-\DeclareFontShape{T1}{stix2}{m}{it}{<-> t1-stix2text-italic}{}
-\DeclareFontShape{T1}{stix2}{b}{it}{<-> t1-stix2text-bolditalic}{}
-
-\DeclareFontShape{T1}{stix2}{m}{sc}{<-> t1-stix2textsc}{}
-\DeclareFontShape{T1}{stix2}{b}{sc}{<-> t1-stix2textsc-bold}{}
-
-\DeclareFontShape{T1}{stix2}{m}{sl}{<->ssub * stix2/m/it}{}
-\DeclareFontShape{T1}{stix2}{b}{sl}{<->ssub * stix2/b/it}{}
-
-\DeclareFontShape{T1}{stix2}{bx}{n} {<->ssub * stix2/b/n}{}
-\DeclareFontShape{T1}{stix2}{bx}{sc}{<->ssub * stix2/b/sc}{}
-\DeclareFontShape{T1}{stix2}{bx}{sl}{<->ssub * stix2/b/sl}{}
-\DeclareFontShape{T1}{stix2}{bx}{it}{<->ssub * stix2/b/it}{}
-%</t1stix2>
-%
-%<*ts1stix2>
-\DeclareFontFamily{TS1}{stix2}{}
-
-\DeclareFontShape{TS1}{stix2}{m}{n} {<-> ts1-stix2text}{}
-\DeclareFontShape{TS1}{stix2}{b}{n} {<-> ts1-stix2text-bold}{}
-\DeclareFontShape{TS1}{stix2}{m}{it}{<-> ts1-stix2text-italic}{}
-\DeclareFontShape{TS1}{stix2}{b}{it}{<-> ts1-stix2text-bolditalic}{}
-
-\DeclareFontShape{TS1}{stix2}{m}{sc}{<->ssub * stix2/m/n}{}
-\DeclareFontShape{TS1}{stix2}{b}{sc}{<->ssub * stix2/b/n}{}
-
-\DeclareFontShape{TS1}{stix2}{m}{sl}{<->ssub * stix2/m/it}{}
-\DeclareFontShape{TS1}{stix2}{b}{sl}{<->ssub * stix2/b/it}{}
-
-\DeclareFontShape{TS1}{stix2}{bx}{n} {<->ssub * stix2/b/n}{}
-\DeclareFontShape{TS1}{stix2}{bx}{sc}{<->ssub * stix2/b/sc}{}
-\DeclareFontShape{TS1}{stix2}{bx}{sl}{<->ssub * stix2/b/sl}{}
-\DeclareFontShape{TS1}{stix2}{bx}{it}{<->ssub * stix2/b/it}{}
-%</ts1stix2>
-%
-% \Finale
diff --git a/Master/texmf-dist/source/latex/stringstrings/stringstrings.dtx b/Master/texmf-dist/source/latex/stringstrings/stringstrings.dtx
index 24baeeda9c6..ec813d08a06 100644
--- a/Master/texmf-dist/source/latex/stringstrings/stringstrings.dtx
+++ b/Master/texmf-dist/source/latex/stringstrings/stringstrings.dtx
@@ -1,6 +1,6 @@
% \iffalse
%<package>\ProvidesPackage{stringstrings}
-%<package>[2015/02/02 v1.23
+%<package>[2020/12/08 v1.24
%<package> Extensive array of string manipulation routines for
%<package> cosmetic and programming application]
%<package>\NeedsTeXFormat{LaTeX2e}
@@ -33,6 +33,7 @@
% v1.23 -Changed {~} to {\ } in \retokenizechar
% -Forced all stringtest commands to function outside of math mode
% which will give correct result, when invoked within math mode.
+% V1.24 -Added %, removing extra space (bug) from \testmatchingchar
\documentclass{ltxdoc}
\usepackage{stringstrings}
\DisableCrossrefs
@@ -2841,7 +2842,7 @@
% character.
% \begin{macrocode}
\if \thestring#3\global\matchingchartrue\else\global\matchingcharfalse\fi
- \fi}
+ \fi}%
\?}
% \end{macrocode}
% \end{macro}
diff --git a/Master/texmf-dist/source/latex/stringstrings/stringstrings.ins b/Master/texmf-dist/source/latex/stringstrings/stringstrings.ins
index 3564603d755..a99e147f5b3 100644
--- a/Master/texmf-dist/source/latex/stringstrings/stringstrings.ins
+++ b/Master/texmf-dist/source/latex/stringstrings/stringstrings.ins
@@ -1,6 +1,6 @@
-% LaTeX this .ins file in order to generate the .sty file from the .dtx file
-\input docstrip
-\askforoverwritefalse
-\generate{\file{stringstrings.sty}{\from{stringstrings.dtx}{package}}
- }
-\endbatchfile
+% LaTeX this .ins file in order to generate the .sty file from the .dtx file
+\input docstrip
+\askforoverwritefalse
+\generate{\file{stringstrings.sty}{\from{stringstrings.dtx}{package}}
+ }
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/sttools/flushend.dtx b/Master/texmf-dist/source/latex/sttools/flushend.dtx
index 2634f02e804..20d20f396e5 100644
--- a/Master/texmf-dist/source/latex/sttools/flushend.dtx
+++ b/Master/texmf-dist/source/latex/sttools/flushend.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment/*% \end{macrocode}*/
%
-% Copyright (C) 2017 by Sigitas Tolu\v{s}is <sigitas@vtex.lt>
+% Copyright (C) 2020 by Sigitas Tolu\v{s}is <sigitas@vtex.lt>
% ---------------------------------------------------------------------------
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -26,7 +26,16 @@
%<*batchfile>
\input docstrip.tex
\keepsilent\askforoverwritefalse
-\nopreamble\nopostamble
+\preamble
+%%
+%% This is file `flushend.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% flushend.dtx (with options: `package')
+%%
+\endpreamble
\generate{\file{flushend.sty}{\from{flushend.dtx}{package}}}
%</batchfile>
%<batchfile>\endbatchfile
@@ -38,9 +47,8 @@
\ProvidesFile{flushend.dtx}
%</driver>
%<*package>
-%% Copyright (C) 1997-2017 by Sigitas Tolu\v{s}is <sigitas@vtex.lt>
+%% Copyright (C) 1997-2020 by Sigitas Tolu\v{s}is <sigitas@vtex.lt>
%% VTeX Ltd., Mokslinink\k{u} 2a, Vilnius, Lithuania
-%% http://www.vtex.lt/tex/download/macros/
%% --------------------------------------------------------------------------
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -56,12 +64,12 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{flushend}
%<*package>
- [2017/03/27 v3.3 Balancing columns in twocolumn mode]
+ [2020/10/16 v3.5 Balancing columns in twocolumn mode]
%</package>
%
%<*driver>
\documentclass{ltxdoc}
-\usepackage{flushend}[2016/06/21]
+\usepackage{flushend}[2020/10/16]
\EnableCrossrefs
\CodelineIndex
%%\RecordChanges
@@ -74,7 +82,7 @@
%</driver>
% \fi
%
-% \CheckSum{1855}
+% \CheckSum{2020}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -104,9 +112,11 @@
% ancient/modern,
% spread/nospread,
% removelastbox/keeplastbox}
-% \changes{v3.1}{2015/04/14}{set debug option off by default; keeplastbox modified;}
-% \changes{v3.2}{2016/06/21}{bugfix compatibility with luatexja}
-% \changes{v3.3}{2017/03/27}{bugfix for get@@footnoterule@@box; options for some checks on/off}
+% \changes{v3.1}{2015/04/14}{set debug option off by default; keeplastbox modified;}
+% \changes{v3.2}{2016/06/21}{bugfix compatibility with luatexja}
+% \changes{v3.3}{2017/03/27}{bugfix for get@@footnoterule@@box; options for some checks on/off}
+% \changes{v3.4}{2020/10/14}{bugfix development and test}
+% \changes{v3.5}{2020/10/16}{bugfix version: modern with noautobase}
%
% \DoNotIndex{\newcommand,\newenvironment}
%
@@ -121,16 +131,16 @@
% \section{Introduction}
%
% The package is used to balance columns on any page in twocolumn
-% mode. By default it is switched on at the end of document. It is
-% expected to work with footnotes, top floats and column break
+% mode. By default it is switched on at the end of document. It is
+% expected to work with footnotes, top floats and column break
% before one line section title.
%
% \section{Usage}
%
-% Just load the package to balance the last page: that's all.
+% Just load the package to balance the last page: that's all.
% To balance some page in middle of document use command
-% \cs{flushcolsend} at that page.
-%
+% \cs{flushcolsend} at that page.
+%
% \medskip
% \DescribeMacro{\flushend}
%
@@ -168,7 +178,7 @@
% Adds \meta{tokens} at the end of right column.
%
% \medskip
-% \textit{Example}: |\atColsEnd{\vfil}|.
+% \textit{Example}: |\atColsEnd{\vfil}|.
%
% \medskip
% \DescribeMacro{\showcolsendrule}
@@ -176,24 +186,24 @@
% It can be used just for debugging: adds rule to the bottom of columns.
%
% \subsection{Package options}
-%
+%
% \medskip
% \DescribeMacro{ancient}
% It is used to switch on old version of balancing algorithm.
% This version is not so accurate or "clever" but quite safe.
-%
+%
% \medskip
% \DescribeMacro{modern}
% [default] It is used to switch on new version of balancing algorithm.
% This version has some heuristic guesses for footnotes, floats
% and section like head skip. So it is more dangerous in the case
-% for text misplace or disappear.
+% for text misplace or disappear.
%
% \medskip
% \DescribeMacro{autobase}
% [default] It is used to guess |\baselineskip| value on original columns
% break. On failure just use |\atColsBreak{...}|.
-%
+%
% \medskip
% \DescribeMacro{noautobase}
% It is used to switch off the previous option behaviour.
@@ -201,7 +211,7 @@
% \medskip
% \DescribeMacro{spread}
% [default] It adds extra glue to the rightcolumn trying to balance.
-%
+%
% \medskip
% \DescribeMacro{nospread}
% It skips adding extra glue to the last column.
@@ -209,11 +219,11 @@
% \medskip
% \DescribeMacro{removelastbox}
% [default] It tries to remove an empty box (some more material) from the last column bottom.
-%
+%
% \medskip
% \DescribeMacro{keeplastbox}
-% It skips removing anything from the last column. As example it is usefull and can be used
-% then document ends by reference item and last line of text should be with indend.
+% It skips removing anything from the last column. As example it is usefull and can be used
+% then document ends by reference item and last line of text should be with indend.
%
% \medskip
% \DescribeMacro{checkfootnote}
@@ -241,7 +251,7 @@
% [default] Skips putting debuging lines.
%
% \StopEventually{}
-%
+%
% \section{Implementation}
%
% \iffalse
@@ -257,10 +267,10 @@
\newif\if@balance@debug \@balance@debugfalse
\DeclareOption{autobase}{\global\@auto@baselineskiptrue}
\DeclareOption{noautobase}{\global\@auto@baselineskipfalse}
-\DeclareOption{ancient}{\global\@ancient@balance@versiontrue}
-\DeclareOption{modern}{\global\@ancient@balance@versionfalse}
-\DeclareOption{spread}{\global\@right@column@spreadtrue}
-\DeclareOption{nospread}{\global\@right@column@spreadfalse}
+\DeclareOption{ancient}{\global\@ancient@balance@versiontrue}
+\DeclareOption{modern}{\global\@ancient@balance@versionfalse}
+\DeclareOption{spread}{\global\@right@column@spreadtrue}
+\DeclareOption{nospread}{\global\@right@column@spreadfalse}
\DeclareOption{removelastbox}{\global\@remove@lastbox@at@balancingtrue}
\DeclareOption{keeplastbox}{\global\@remove@lastbox@at@balancingfalse}
\DeclareOption{checkfootnote}{%
@@ -293,9 +303,11 @@
\newskip\flushend@@lastskip@b
\newskip\flushend@@lastskip@c
\newcount\flushend@@penalty@a
+\newcount\var@@loop@iter
\newdimen\flushend@@lastkern@a
\newdimen\var@@temp@spread
\newdimen\var@@temp@a
+\newdimen\var@@temp@loop
\def\top@@skip@@limit{.7\topskip}
\newdimen\flushend@@page@rule \flushend@@page@rule\z@
\def\showcolsendrule{\global\flushend@@page@rule=.4\p@}
@@ -353,7 +365,7 @@
}
\def\set@split@topskip@to#1{%
\splittopskip#1\relax \vfuzz\maxdimen \vbadness\maxdimen
- }
+ }
% \end{macrocode}
% \end{macro}
%
@@ -373,28 +385,28 @@
%
% To get more or less proper result we need to know about footnotes at
% the left column end, top floats at the right column top, skips and
-% so on. This part of the package is responsible for such analysis.
+% so on. This part of the package is responsible for such analysis.
%
% \begin{macrocode}
\gdef\analyze@lastbox@box#1{%
\setbox\flushend@@varbox@a\vbox{%
\unvbox#1%
- \global\flushend@@lastskip@a\lastskip
+ \global\flushend@@lastskip@a\lastskip
\unskip
- \global\var@@temp@a\lastkern
+ \global\var@@temp@a\lastkern
\unkern
- \global\flushend@@penalty@a\lastpenalty
+ \global\flushend@@penalty@a\lastpenalty
\unpenalty
\ifdim\lastskip>\z@
- \global\flushend@@lastskip@a\lastskip
- \fi
+ \global\flushend@@lastskip@a\lastskip
+ \fi
\unskip
\ifdim\lastkern>\z@
- \global\var@@temp@a\lastkern
- \fi
+ \global\var@@temp@a\lastkern
+ \fi
\unkern
\ifnum\lastpenalty>\z@
- \global\flushend@@penalty@a\lastpenalty
+ \global\flushend@@penalty@a\lastpenalty
\fi
\unpenalty
\global\setbox\flushend@@tempbox@a\lastbox
@@ -402,7 +414,7 @@
\wlog@balance@debug{^^J::analyze@lastbox@box::\log@box@info{#1}%
^^J ::unvbox: \log@box@info{\flushend@@varbox@a}%
^^J::lastbox: \log@box@info{\flushend@@tempbox@a}%
- ^^J::lastskip: \the\flushend@@lastskip@a;
+ ^^J::lastskip: \the\flushend@@lastskip@a;
lastkern: \the\var@@temp@a;
lastpenalty: \the\flushend@@penalty@a
}%
@@ -425,11 +437,11 @@
\wlog@balance@debug{^^Jmainbox: \log@box@info{#1}}%
\setbox\flushend@@varbox@a\vbox{%
\unvbox#1%
- \global\flushend@@lastskip@a\lastskip
+ \global\flushend@@lastskip@a\lastskip
\unskip
\global\flushend@@lastkern@a\lastkern
\unkern
- \global\flushend@@penalty@a\lastpenalty
+ \global\flushend@@penalty@a\lastpenalty
\unpenalty
\global\setbox\flushend@@tempbox@a\lastbox
}%
@@ -437,8 +449,8 @@
\advance\flushend@@lastskip@b -\ht\flushend@@tempbox@a
\wlog@balance@debug{.-box: \log@box@info{\flushend@@varbox@a}%
^^J.-lastbox: \log@box@info{\flushend@@tempbox@a}%
- ^^J.-lastskip: \the\flushend@@lastskip@a;
- lastkern: \the\flushend@@lastkern@a;
+ ^^J.-lastskip: \the\flushend@@lastskip@a;
+ lastkern: \the\flushend@@lastkern@a;
lastpenalty: \the\flushend@@penalty@a
^^J.-diff: \the\flushend@@lastskip@b
}%
@@ -486,6 +498,16 @@
\wlog@balance@debug{lastbox: \log@box@info{\flushend@@varbox@a}}%
\fi
\fi
+ \ifdim\var@@temp@loop=\ht\flushend@@varbox@a\relax
+ \global\advance\var@@loop@iter\@ne
+ \fi
+ \var@@temp@loop=\ht\flushend@@varbox@a\relax
+ \ifnum\var@@loop@iter<3\relax
+ \wlog@balance@debug{analyze left col: iteration \number\var@@loop@iter; ht \the\var@@temp@loop}%
+ \else
+ \wlog@balance@debug{analyze left col loop limit!}%
+ \ht\flushend@@varbox@a\z@
+ \fi
\ifdim\ht\flushend@@varbox@a>\topskip
\expandafter\analyze@leftcolumn@box\expandafter\flushend@@varbox@a
\fi
@@ -497,7 +519,7 @@
% \begin{macro}{\get@@footnoterule@@box}
%
% Gets dimensions of the box made by |footnoterule| and writes to:
-% |\footnoterule@@box@@ht|, |\footnoterule@@box@@dp|, |\footnoterule@@box@@wd|.
+% |\footnoterule@@box@@ht|, |\footnoterule@@box@@dp|, |\footnoterule@@box@@wd|.
%
% \begin{macrocode}
\def\get@@footnoterule@@box{%
@@ -522,8 +544,8 @@
%
% Checks if \marg{box1} dimensions equals to |footnoterule| box dimensions.
% If so and if \marg{skip} is not |\topskip| we guess it is footnote.
-% In that case we define |leftcolumn| height without |footnote| as
-% \marg{box2} height and save it as |\main@box@height|. Skip from text to
+% In that case we define |leftcolumn| height without |footnote| as
+% \marg{box2} height and save it as |\main@box@height|. Skip from text to
% footnote define as |\main@box@skip|.
%
% \begin{macrocode}
@@ -536,8 +558,8 @@
\else
\xdef\main@box@height{\the\ht#3}%
\xdef\main@box@skip{\the#2}%
- \wlog@balance@debug{^^J:footnoterule found:
- main@box <ht=\main@box@height,
+ \wlog@balance@debug{^^J:footnoterule found:
+ main@box <ht=\main@box@height,
skip=\main@box@skip>
}%
\global\let\check@@footnoterule@@box\@gobblethree
@@ -569,8 +591,8 @@
\let\initial@check@@baselineskip@@skip\check@@baselineskip@@skip
% \end{macrocode}
%
-% In the case we found footnote it is necessary to look for the last skip
-% between text lines again. For that we use
+% In the case we found footnote it is necessary to look for the last skip
+% between text lines again. For that we use
% |\reset@check@@baselineskip@@skip|. It activates |\check@@baselineskip@@skip|.
%
% \begin{macrocode}
@@ -693,7 +715,17 @@
\ifdim\flushend@@lastskip@b>\topskip
\xdef\top@@section@skip{\the\flushend@@lastskip@b}%
\fi
- \ifdim\ht\flushend@@varbox@a>2\topskip
+ \ifdim\var@@temp@loop=\ht\flushend@@varbox@a\relax
+ \advance\var@@loop@iter\@ne
+ \fi
+ \var@@temp@loop=\ht\flushend@@varbox@a\relax
+ \ifnum\var@@loop@iter<3\relax
+ \wlog@balance@debug{analyze right col: iteration \number\var@@loop@iter; ht \the\var@@temp@loop}%
+ \else
+ \wlog@balance@debug{analyze right col loop limit!}%
+ \ht\flushend@@varbox@a=\z@
+ \fi
+ \ifdim\ht\flushend@@varbox@a>2\topskip
\setbox\flushend@@tempbox@c\vbox{\unvbox\flushend@@varbox@a}%
\repeat
\fi
@@ -705,7 +737,7 @@
%
% \begin{macro}{\combine@columns@for@balance}
%
-% Collects both columns to one box removing left column footnotes
+% Collects both columns to one box removing left column footnotes
% and right column top float and adding right skip in between them.
%
% \begin{macrocode}
@@ -725,9 +757,11 @@
\setbox\@tempboxa\vbox{%
\unvbox\flushend@@varbox@a
\unskip\unkern\unpenalty
+ \hrule\@height\flushend@@page@rule width\columnwidth
+ \vskip-\flushend@@page@rule
+ \hrule\@height\z@ width\columnwidth
\vskip\flushend@@lastskip@c
\the\atColsBreak
- \hrule\@height\flushend@@page@rule width\columnwidth
\ifdim\top@@section@skip>\top@@skip@@limit
\vskip\top@@section@skip
\fi
@@ -741,11 +775,12 @@
\else
%% Ignore baselineskip value on column break
\setbox\@tempboxa\vbox{%
- \unvbox\@leftcolumn
- \setbox\z@\lastbox
+ \unvbox\flushend@@varbox@a
\unskip\unkern\unpenalty
- \the\atColsBreak
\hrule\@height\flushend@@page@rule width\columnwidth
+ \vskip-\flushend@@page@rule
+ \hrule\@height\z@ width\columnwidth
+ \the\atColsBreak
\unvbox\@outputbox
\remove@lastbox@at@balancing
\the\atColsEnd
@@ -758,11 +793,11 @@
% \begin{macro}{\set@outputbox@with@footnote}
%
% Calculates break position and formats balanced columns in the |\@outputbox|
-% with footnotes.
+% with footnotes.
%
% \begin{macrocode}
\def\set@outputbox@with@footnote{%
- %% footnote in left column
+ %% footnote in left column
\@tempdimb\ht\@tempboxa
\ifdim\top@@floatbox@skip>\z@
\advance\@tempdimb \top@@floatbox@skip
@@ -819,6 +854,8 @@
\vss
}%
\hrule\@height\flushend@@page@rule width\textwidth
+ \vskip-\flushend@@page@rule
+ \hrule\@height\z@ width\columnwidth
\vss
}%
\global\ht\@leftcolumn=\the\@tempdima
@@ -868,11 +905,11 @@
% \begin{macro}{\set@outputbox@without@footnote}
%
% Calculates break position and formats balanced columns in the |\@outputbox|
-% without footnotes.
+% without footnotes.
%
% \begin{macrocode}
\def\set@outputbox@without@footnote{%
- %% no footnote in left column
+ %% no footnote in left column
\@tempdimb \ht\@tempboxa
\ifdim\top@@floatbox@skip>\z@
\advance\@tempdimb \top@@floatbox@skip
@@ -919,6 +956,8 @@
\setbox\@leftcolumn\vbox to\@tempdima{%
\vbox to\@tempdimb{\unvbox\flushend@@varbox@c\vss}%
\hrule\@height\flushend@@page@rule width\textwidth
+ \vskip-\flushend@@page@rule
+ \hrule\@height\z@ width\textwidth
\vss
}%
\global\ht\@leftcolumn=\the\@tempdima
@@ -963,51 +1002,70 @@
% Columns balancing of the twocolumn mode page (modern algorithm).
% It is maybe not so safe for text moving or missing at all
% as it uses some heuristic technique to find footnotes, last skip between lines
-% at left column and floats or section like heads at right column top
-% for replacing them (except heads of course) to other places in text.
-%
+% at left column and floats or section like heads at right column top
+% for replacing them (except heads of course) to other places in text.
+%
% \begin{macrocode}
\def\last@outputdblcol@modern{%
\if@firstcolumn
\global \@firstcolumnfalse
- \global \setbox\@leftcolumn \box\@outputbox
+ \global\setbox\@leftcolumn\copy\@outputbox
+ \splitmaxdepth\maxdimen
+ \vbadness\maxdimen
+ \setbox\@outputbox\vbox{\unvbox\@outputbox\unskip}%
+ \setbox\@outputbox\vsplit\@outputbox to\maxdimen
+ \toks@\expandafter{\topmark}%
+ \xdef\@firstcoltopmark{\the\toks@}%
+ \toks@\expandafter{\splitfirstmark}%
+ \xdef\@firstcolfirstmark{\the\toks@}%
+ \ifx\@firstcolfirstmark\@empty
+ \global\let\@setmarks\relax
+ \else
+ \gdef\@setmarks{%
+ \let\firstmark\@firstcolfirstmark
+ \let\topmark\@firstcoltopmark
+ }%
+ \fi
\else
\global \@firstcolumntrue
\@tempdima\ht\@leftcolumn
+ \advance\@tempdima by\dp\@leftcolumn
\set@split@topskip@to\topskip
\var@@temp@spread=\wd\@outputbox
\get@@footnoterule@@box
\xdef\main@box@height{\the\ht\@leftcolumn}%
\xdef\main@box@skip{\z@}%
- \global\flushend@@lastskip@c\z@
- \setbox\flushend@@varbox@a\vbox{\unvcopy\@leftcolumn}%
+ \reset@check@@baselineskip@@skip\relax\relax\flushend@@lastskip@c
+ \setbox\flushend@@varbox@a\vbox{\unvcopy\@leftcolumn}%
+ \var@@loop@iter\z@ \var@@temp@loop\z@
\analyze@leftcolumn@box\flushend@@varbox@a
- \setbox\flushend@@varbox@a\vbox{\unvcopy\@outputbox}%
+ \setbox\flushend@@varbox@a\vbox{\unvcopy\@outputbox}%
+ \var@@loop@iter\z@ \var@@temp@loop\z@
\analyze@rightcolumn@box\flushend@@varbox@a
- \ifdim\main@box@skip>\z@
- %% footnote in left column
+ \ifdim\main@box@skip>\z@
+ %% footnote in left column
\set@split@topskip@to\z@
\setbox\flushend@@varbox@a\vsplit\@leftcolumn to\main@box@height
- \else
- %% no footnote in left column
+ \else
+ %% no footnote in left column
\setbox\flushend@@varbox@a\box\@leftcolumn
\fi
- \ifdim\var@@temp@spread>\z@
+ \ifdim\var@@temp@spread>\z@
%% rightcolumn non empty
\combine@columns@for@balance
- \else
+ \else
%% rightcolumn empty
\setbox\@tempboxa\vbox{%
\unvbox\flushend@@varbox@a
\remove@lastbox@at@balancing
\the\atColsEnd
}%
- \fi
+ \fi
\ifdim\main@box@skip>\z@
- %% footnote in left column
+ %% footnote in left column
\set@outputbox@with@footnote
\else
- %% no footnote in left column
+ %% no footnote in left column
\set@outputbox@without@footnote
\fi
\setbox\@outputbox \vbox {%
@@ -1028,6 +1086,7 @@
\setbox\@outputbox\vbox{\box\hold@viper\box\@outputbox}%
\fi
\@combinedblfloats
+ \csname @setmarks\endcsname
\@outputpage
\begingroup
\@dblfloatplacement
@@ -1050,9 +1109,9 @@
% \begin{macro}{\last@outputdblcol@old}
%
% Columns balancing of the twocolumn mode page (ancient algorithm).
-% It is maybe not so good in some cases but maybe more safe for text
+% It is maybe not so good in some cases but maybe more safe for text
% moving or missing at all.
-%
+%
% \begin{macrocode}
\def\last@outputdblcol@ancient{%
\if@firstcolumn
@@ -1096,6 +1155,8 @@
\unskip\unpenalty
\vskip\flushend@@lastskip@c
\hrule\@height\flushend@@page@rule width\columnwidth
+ \vskip-\flushend@@page@rule
+ \hrule\@height\z@ width\textwidth
\the\atColsBreak
\unvbox\@outputbox
\remove@lastbox@at@balancing
@@ -1107,6 +1168,8 @@
\setbox\z@\lastbox
\unskip
\hrule\@height\flushend@@page@rule width\columnwidth
+ \vskip-\flushend@@page@rule
+ \hrule\@height\z@ width\textwidth
\the\atColsBreak
\unvbox\@outputbox
\remove@lastbox@at@balancing
@@ -1132,8 +1195,8 @@
\vsplit\flushend@@tempbox@a to\@tempdimb
\vss
}%
- \wlog{(2)Left:\the\ht\flushend@@tempbox@c\space
- Right:\the\ht\flushend@@tempbox@a\space
+ \wlog{(2)Left:\the\ht\flushend@@tempbox@c\space
+ Right:\the\ht\flushend@@tempbox@a\space
Output:\the\@tempdimb
}%
\ifdim\ht\flushend@@tempbox@c<\ht\flushend@@tempbox@a
@@ -1156,6 +1219,8 @@
}%
}%
\hrule\@height\flushend@@page@rule
+ \vskip-\flushend@@page@rule
+ \hrule\@height\z@ width\textwidth
\vss
}%
\setbox\@outputbox\vbox to\@tempdima{%
@@ -1166,6 +1231,8 @@
}%
}%
\hrule\@height\flushend@@page@rule
+ \vskip-\flushend@@page@rule
+ \hrule\@height\z@ width\textwidth
\vss
}%
\setbox\@outputbox\vbox{%
@@ -1235,7 +1302,7 @@
\def\raggedcolsend{\global\let\@outputdblcol\saved@orig@@outputdblcol}
% \end{macrocode}
%
-% \cs{flushend} is used to switch on column balancing on the last page.
+% \cs{flushend} is used to switch on column balancing on the last page.
% It is used by default.
%
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/subfiles/subfiles.dtx b/Master/texmf-dist/source/latex/subfiles/subfiles.dtx
index 1e81e488db1..4232579f800 100644
--- a/Master/texmf-dist/source/latex/subfiles/subfiles.dtx
+++ b/Master/texmf-dist/source/latex/subfiles/subfiles.dtx
@@ -23,12 +23,12 @@
%
%<*driver>
% \fi
-\ProvidesFile{subfiles.dtx}[2020/02/14 v1.6 Multi-file projects]
+\ProvidesFile{subfiles.dtx}[2020/11/14 v2.2 Multi-file projects]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{subfiles.dtx}
\title{A Document Class and a Package\\for Handling Multi-File Projects}
-\date{2020/02/14 v1.6}
+\date{2020/11/14 v2.2}
\author{Federico Garcia, Gernot Salzer}
\usepackage{hyperref}
\begin{document}
@@ -38,13 +38,13 @@
%</driver>
% \fi
% \begin{abstract}
-% The |subfiles| package allows authors to split a document into one main file and one and more subsidiary files (subfiles) akin to the |\input| command, with the added benefit of making the subfiles compilable by themselves.
+% The |subfiles| package allows authors to split a document into one main file and several subsidiary files (subfiles) akin to the |\input| command, with the added benefit of making the subfiles compilable on their own.
% This is achieved by reusing the preamble of the main file also for the subfiles.
% \end{abstract}
% \tableofcontents
% \section{Introduction}
% The \LaTeX\ commands |\include| and |\input| allow the user to split the \TeX\ source of a document into several input files.
-% This is useful when creating documents with many chapters, but also for handling large tables, figures, and code samples, which require a considerable amount of trial-and-errors.
+% This is useful when creating documents with many chapters, but also for handling large tables, figures and code samples, which require a considerable amount of trial-and-errors.
%
% In this process the rest of the document is of little use, and can even interfere.
% For example, error messages may indicate not only the wrong line number, but may point to the wrong file.
@@ -63,9 +63,10 @@
% \section{Basic usage}
%
% \DescribeMacro{subfiles.sty}
-% The main file, i.e., the file with the preamble to be shared with the subfiles, has to load the package |subfiles| \emph{at the end of the preamble}:
+% The main file, i.e., the file with the preamble to be shared with the subfiles, has to load the package |subfiles|:
% \begin{center}
% \begin{tabular}{l}
+% |\documentclass[...]{...}|\\
% |\usepackage{subfiles}|\\
% |\begin{document}|
% \end{tabular}
@@ -83,7 +84,7 @@
% which loads the class |subfiles|.
% Its only `option', which is actually mandatory, gives the name of the main file.
% This name follows \TeX\ conventions: |.tex| is the default extension, the path has to be provided if the main file is in a different directory, and directories in the path have to be separated by |/| (not |\|).
-% Thus, we have the following structure:
+% Thus, we have the following structure.
% \begin{center}\small
% \begin{tabular}[t]{l}
% \multicolumn{1}{c}{main file} \\
@@ -113,15 +114,117 @@
% \begin{itemize}
% \item If \LaTeX\ is run on the subfile, the line |\documentclass[..]{subfiles}| is replaced by the preamble of the main file (including its |\documentclass| command).
% The rest of the subfile is processed normally.
-% \item If \LaTeX\ is run on the main file, the subfile is loaded like with an |\input| command, except that the three lines |\documentclass[..]{subfiles}|, |\begin{document}|, and |\end{document}| are ignored.
+% \item If \LaTeX\ is run on the main file, the subfile is loaded like with an |\input| command, except that the preamble of the subfile up to |\begin{document}| as well as |\end{document}| and the lines following it are ignored.
% \end{itemize}
%
% \section{Advanced usage}
%
+% \subsection{Including files instead of inputting them}
+%
+% \DescribeMacro{\subfileinclude}
+% In plain \LaTeX, you can use either |\input| or |\include| to load a file.
+% In most cases the first is appropriate, but sometimes there are reasons to prefer the latter.
+% Internally, the |\subfile| command uses |\input|.
+% For those cases where you need |\include|, the package provides the command
+% \begin{center}
+% |\subfileinclude{|\meta{subfile\_name}|}|
+% \end{center}
+%
+% \subsection{Fixing pathes}
+%
+% \DescribeMacro{\subfix}
+% Whenever an error message of \LaTeX\ or an external program indicates that a file cannot be found, the reason may be that the missing file has to be addressed by varying pathes, depending on which file is typeset.
+% In such a case, it may help to apply the command |\subfix| to the file or path names.
+% Examples:
+% \begin{center}
+% \begin{tabular}{ll}
+% package & command when used with |subfiles| \\
+% \hline
+% |biblatex| & |\addbibresource{\subfix{|\meta{file}|}}| \\
+% |bibunits| & |\putbib[\subfix{|\meta{file1}|},\subfix{|\meta{file2}|},|\dots|]|\\
+% & |\defaultbibliography{\subfix{|\meta{file1}|},|\dots|}|
+% \end{tabular}
+% \end{center}
+% \DescribeMacro{\bibliography}
+% \DescribeMacro{\graphicspath}
+% Some commands already apply the fix on the fly.
+% At the moment these are the standard \LaTeX\ command |\bibliography| and |\graphicspath| from the |graphics|/|graphicx| package.
+%
+% \subsection{Conditional execution of commands}
+%
+% \DescribeMacro{\ifSubfilesClassLoaded}
+% The command |\ifSubfilesClassLoaded| is useful to execute commands conditionally, depending on whether the main file is typeset or a subfile.
+% \begin{center}
+% \begin{tabular}{l}
+% |\ifSubfilesClassLoaded{% then branch|\\
+% \quad \dots\ commands executed when the subfile is typeset \dots\\
+% |}{% else branch|\\
+% \quad \dots\ commands executed when the main file is typeset \dots\\
+% |}|
+% \end{tabular}
+% \end{center}
+% As an example, this can be used to add the bibliography to the main document or to the subdocument, whichever is typeset:
+% \begin{center}\small
+% \begin{tabular}[t]{l}
+% \multicolumn{1}{c}{main file} \\
+% \hline
+% |\documentclass[...]{...}| \\
+% |\usepackage{subfiles}|\\
+% |\bibliographystyle{alpha}|\\
+% |\begin{document}| \\
+% \dots \\
+% |\subfile{|\meta{subfile\_name}|}| \\
+% \dots \\
+% |\bibliography{bibfile}|\\
+% |\end{document}| \\
+% \hline
+% \end{tabular}
+% \hfill
+% \begin{tabular}[t]{l}
+% \multicolumn{1}{c}{subfile} \\
+% \hline
+% |\documentclass[|\meta{main\_file\_name}|]{subfiles}| \\
+% |\begin{document}| \\
+% \dots \\
+% |\ifSubfilesClassLoaded{%|\\
+% \quad|\bibliography{bibfile}%|\\
+% |}{}|\\
+% |\end{document}| \\
+% \hline
+% \end{tabular}
+% \end{center}
+%
+% \subsection{Unusual locations for placing definitions and text}
+%
+% Starting with version 2.0, the |subfiles| package treats sub-preambles and text after |\end{document}| as one would expect:
+% The preamble of subfiles is skipped when loaded with |\subfile|, and everything after |\end{document}| is ignored.
+% In most cases this is what you want.
+%
+% \DescribeMacro{[v1]}
+% For reasons of compatibility, the option |v1| restores the behaviour of previous versions.
+% \begin{center}
+% |\usepackage[v1]{subfiles}|
+% \end{center}
+% This will have three effects.
+%
+% \emph{Code after the end of the main document} is added to the preamble of the subfiles, but is ignored when typesetting the main file.
+% Here, one can add commands that are to be processed as part of the preamble when the subfiles are typeset on their one.
+% But this also means that any syntax error after |\end{document}| will ruin the \LaTeX ing of the subfile(s).
+%
+% \emph{Code in the preamble of a subfile} is processed as part of the text when typesetting the main file, but as part of the preamble when typesetting the subfile.
+% This means that with the option |v1|, the preamble of a subfile can only contain stuff that is acceptable for both, the preamble and the text area.
+% One should also keep in mind that each subfile is input within a group, so definitions made here may not work outside.
+%
+% \emph{Code after \texttt{\textbackslash end\{document\}} in a subfile} is treated like the code preceding it when the subfile is loaded from the main file, but is ignored when typesetting the subfile.
+% The code after |\end{document}| behaves as if following the |\subfile| command in the main file, except that it is still part of the group enclosing the subfile.
+% As a consequence, empty lines at the end of the subfile lead to a new paragraph in the main document, even if the |\subfile| command is immediately followed by text.
+%
+% \section{Use cases}
+%
% \subsection{Hierarchy of directories}
%
-% Sometimes it is desirable to put a subfile together with its images and further files into its own directory.
-% The difficulty now is that these additional files have to be addressed by different pathes depending on whether the main files or the subfile is typeset.
+% Sometimes it is desirable to put a subfile together with its images and supplementary files into its own directory.
+% The difficulty now is that these additional files have to be addressed by different pathes depending on whether the main file or the subfile is typeset.
% As of version 1.3, the |subfiles| package handles this problem by using the |import| package.
%
% As an example, consider the following hierarchy of files:
@@ -176,73 +279,31 @@
% \end{center}
% Then each of the three files can be typeset individually in its respective directory, where \LaTeX\ is able to locate all included text files and images.
%
-% \subsection{Including files instead of inputting them}
-%
-% \DescribeMacro{\subfileinclude}
-% In plain \LaTeX, you can use either |\input| or |\include| to load a file.
-% In most cases the first is appropriate, but sometimes there are reasons to prefer the latter.
-% Internally, the |\subfile| command uses |\input|.
-% For those cases where you need |\include|, the package provides the command
+% \subsection{Cross-referencing between subfiles}
+% When working with multiple subfiles under a main file, say |main.tex|, one may want to refer in subfile |A.tex| to labels in subfile |B.tex|. To make this work, load the package |xr| in the preamble of the main file and add an |\externaldocument| command after loading the |subfiles| package:
% \begin{center}
-% |\subfileinclude{|\meta{subfile\_name}|}|
+% \begin{tabular}{l}
+% |\usepackage{xr}| \\
+% |\usepackage{subfiles}| \\
+% |\externaldocument[M-]{\subfix{main}}|
+% \end{tabular}
% \end{center}
+% In the |\externaldocument| command, |main| is the name of the main document.
+% Moreover, |M-| is an arbitrary sequence of characters that is added as prefix to the labels.
+% The |\subfix| command is only needed if the subfiles are not in the same directory as the main file, but it doesn't hurt if you add it in any case.
%
-% \subsection{Bibliographies}
+% To cross-reference between documents, add labels as usual.
+% Suppose you have |\label{mylabel}| in any of the files.
+% Then you can use |\ref{M-mylabel}| and |\pageref{M-mylabel}| to obtain the (page) number that the label refers to in the main document.
%
-% Manual bibliographies with the |thebibliography| environment work as usual.
-% Problems may arise if external programs like |bibtex| or |biber| are used to generate the bibliography.
-% Here are some hints on how to make it work.
-% \begin{itemize}
-% \item
-% \DescribeMacro{\bibliography}
-% Make sure the command |\bibliography| is executed after loading the |subfiles| package.
-% Put the command between |\usepackage{subfiles}| and |\begin{document}| or somewhere into the text part.
-% \item When you use the package |biblatex|, and programs like |biber| complain about not being able to find the bibliography files, use |\bibliography| instead of |\addbibresource| (see above), or the command |\subfix| (see below).
-% \item
-% \DescribeMacro{\subfix}
-% Whenever an external program complains that a file specified in the \LaTeX\ document cannot be found, wrap the command |\subfix| around the filename.
-% Here are some examples.
-% \begin{center}
-% \begin{tabular}{ll}
-% package & command when used with |subfiles| \\
-% \hline
-% |biblatex| & |\addbibresource{\subfix{|\meta{file}|}}| \\
-% |bibunits| & |\putbib[\subfix{|\meta{file1}|},\subfix{|\meta{file2}|},|\dots|]|\\
-% & |\defaultbibliography{\subfix{|\meta{file1}|},|\dots|}|
-% \end{tabular}
-% \end{center}
-%
-% \end{itemize}
-% The |subfiles| package has been tested with the packages |biblatex|, |bibunits|, and |chapterbib| as well as with the external programs |bibtex| and |biber|.
-%
-% \subsection{Unusual locations for placing definitions and text}
-%
-% Usually all definitions and packages required by the subfiles should go into the preamble of the main file.
-% There are some further locations, though, where one might consider adding definitions and text.
-% Put negatively, apparently irrelevant stuff in these locations may become unexpectedly visible in the document or cause errors.
-%
-% \paragraph{Code after the end of the main document} is added to the preamble of the subfiles, but is ignored when typesetting the main file.
-% This happens because a subfile typeset by itself does not really take the preamble of the main file, but \emph{everything outside} of |\begin{document}| and |\end{document}|.
-% This has two consequences: \emph{a)}~the user can add some commands that are to be processed as part of the preamble only when the subfiles are typeset by themselves; but also \emph{b)}~the user has to be careful even \emph{after} |\end{document}| in the main file, for any syntax error there will ruin the \LaTeX ing of the subfile(s).
-% \bigskip
-%
-% Similarly, when typesetting the main document, the |\subfile| command does not really load the stuff within the |document| environment, but \emph{everything except} the three commands |\documentclass[...]{...}|, |\begin{document}|, and |\end{document}|.
-% This has the following consequences.
-%
-% \paragraph{Code in the preamble of a subfile} is processed as part of the text when typesetting the main file, but as part of the preamble when typesetting the subfile.
-% This means that the preamble of a subfile can only contain stuff that is acceptable for both, the preamble and the text area.
-% One should also keep in mind that each subfile is input within a group, so definitions made within may not work outside.
-%
-% \paragraph{Code after \texttt{\textbackslash end\{document\}} in a subfile} is treated like the code preceding it when the subfile is loaded from the main file, but is ignored when typesetting the subfile.
-% The code after |\end{document}| behaves as if following the |\subfile| command in the main file, except that it is still part of the group enclosing the subfile.
-% As a consequence, empty lines at the end of the subfile lead to a new paragraph in the main document, even if the |\subfile| command is immediately followed by text.
+% Note that you first have to compile |main.tex|.
+% This generates |main.aux|, which then can be loaded by the subfiles to provide the information for the labels prefixed with |M-|.
%
% \subsection{Avoiding extra spaces}
%
% Sometimes you may want to load the contents of a subfile without white space separating it from the contents of the main file.
-% In this respect |\subfile| behaves similar to |\input|.
+% In this respect, |\subfile| behaves similar to |\input|.
% Any space or newline before and after the |\subfile| command will appear in the typeset document, as will any white space between the last character of the subfile and |\end{document}|.
-% Moreover, any stuff after |\end{document}| will end up in the main document, including spurious empty lines, which may lead to a new paragraph.
% Therefore, to load the contents of a subfile without intervening spaces, you have either to add comment signs:
% \begin{center}
% \begin{tabular}[t]{l}
@@ -262,7 +323,6 @@
% |\begin{document}|\\
% |contents of subfile%|\\
% |\end{document}|\\
-% |% No empty lines after \end{document}!|\\
% \hline
% \end{tabular}
% \end{center}
@@ -280,207 +340,336 @@
% \item
% Make sure to use the most recent version of the |subfiles| package, available from CTAN\footnote{\url{https://ctan.org/pkg/subfiles}} and Github\footnote{\url{https://github.com/gsalzer/subfiles}}.
% \item
-% Make sure that |\usepackage{subfiles}| comes last in the preamble
-% of the main document.
+% Make sure that |\usepackage{subfiles}| appears near the end of the main preamble. If you need the package |standalone|, then it has to be loaded before |subfiles|.
% \item
% If some external program that cooperates with \TeX, like |bibtex| or |biber|, complains about not being able to find a file, locate the name of the file in the \LaTeX\ source and replace \meta{filename} by |\subfix{|\meta{filename}|}|.
% \item
-% Make sure that there is no stuff after |\end{document}|, neither in the main file nor in the subfiles.
-% \item
-% If there is anything in the preambles of the subfiles, make sure that it is admissible for both, the preamble and the document area.
-% \item
-% If nothing of the above helps and you are stuck, ask the people on tex.stackexchange\footnote{\url{https://tex.stackexchange.com/}}.
+% If nothing of the above helps, ask the nice people on tex.stackexchange\footnote{\url{https://tex.stackexchange.com/}} or file an issue in the bug tracker of the Github repository\footnote{\url{https://github.com/gsalzer/subfiles/issues}}.
% \end{enumerate}
+%
%
% \section{Dependencies}
%
-% The |subfiles| package requires the |verbatim| package, whose |comment| environment is used to ignore the text area of the main file when typesetting subfiles separately.
-% Moreover, the |import| package is needed to load subfiles and their auxiliary files from different directories.
+% The |import| package by Donald Arsenau is needed to load subfiles from different directories.
+% When the |standalone| package is used, the |subfiles| package requires the |xpatch| package by Enrico Gregorio to patch the command |\includestandalone|.
% Both packages are part of the standard \TeX\ distributions.
%
+%
% \section{Version history}
%
-% \begin{description}
+% \begin{enumerate}
% \item[v1.1:]
-% Initial version by Federico Garcia. Further versions by Gernot Salzer.
-% \item[v1.2:] \mbox{}
+% Initial version by Federico Garcia. (Subsequent versions by Gernot Salzer.)
+% \item[v1.2:]
% \begin{itemize}
% \item Incompatibility with classes and packages removed that modify the |\document| command, like the class |revtex4|.
% \end{itemize}
-% \item[v1.3:] \mbox{}
+% \item[v1.3:]
% \begin{itemize}
% \item Use of |import| package to handle directory hierarchies.
% \item |\ignorespaces| added to avoid spurious spaces.
% \item Incompatibility with commands removed that expect |\document| to be equal to |\@onlypreamble| after the preamble. Thanks to Eric Domenjoud for analysing the problem.
% \end{itemize}
-% \item[v1.4:] \mbox{}
+% \item[v1.4:]
% \begin{itemize}
% \item Incompatibility with |memoir| class and |comment| package removed.
% \item Bug `|\unskip| cannot be used in vertical mode` fixed.
% \end{itemize}
-% \item[v1.5:] \mbox{}
+% \item[v1.5:]
% \begin{itemize}
% \item Command |\subfileinclude| added.
% \item Basic support for |bibtex| related bibliographies in subfiles added.
% Seems to suffice also for sub-bibliographies with the package |chapterbib|.
% \item Support for sub-bibliographies with package |bibunits| added.
% \end{itemize}
-% \item[v1.6:] \mbox{}
+% \item[v1.6:]
% \begin{itemize}
% \item Support for sub-bibliographies with package |bibunits| dropped, in favor of |\subfix|.
% \item Command |\subfix| added.
% \item Incompatibility with |standalone| class removed.
% \item The options of the main class are now also processed when typesetting a subfile; before they were ignored. Thanks to J\'an Kl'uka for analysing the problem.
% \end{itemize}
-% \end{description}
+% \item[v2.0:]
+% \begin{itemize}
+% \item Incompatibility with \LaTeX\ Oct.~2020 removed.
+% Thanks to Ulrike \mbox{Fischer} from the \LaTeX3 team for the timely warning.
+% \item By default, text after |\end{document}| as well as the preamble of subfiles, when loaded with |\subfile|, are ignored now.
+% The old behaviour is available via the new package option |v1|.
+% \item Command |\ifSubfilesClassLoaded| added and documentation regarding the use of the |\bibliography| command corrected.
+% Thanks to Github user |alan-isaac| for reporting the issue.
+% \item Subfiles now can have the same name as the main file.
+% Thanks to Github user |June-6th| for reporting the issue.
+% \item Problem with the search path for images resolved.
+% Thanks to Github user |maxnick| for reporting the issue.
+% \end{itemize}
+% \item[v2.1]
+% \begin{itemize}
+% \item Bugfix: In some situations, the hooks of |\begin{document}| and |\end{document}| were triggered when loading a subfile.
+% This occurred in particular with packages for handling CJK languages.
+% Thanks to Github user |yuishin-kikuchi| for reporting the issue.
+% \item Section about cross-referencing added.
+% Thanks to Github user |ndvanforeest| for the input.
+% \end{itemize}
+% \item[v2.2]
+% \begin{itemize}
+% \item Bugfix: The bugfix of v2.1 introduced an incompatibility with |tabular| environments in subfiles. Thanks to |yuishin-kikuchi| and |nvmnghia| on Github for reporting the issue. Kudos to |Phelype Oleinik| on tex.stackexchange.com for explaining the intricacies of the |tabular| environment and its interaction with the |\end| command.
+% \end{itemize}
+% \end{enumerate}
%
%\section{The Implementation}
%\subsection{The class}
-% \begin{macrocode}
+%
+% \iffalse
%<*class>
+% \fi
+%
+% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesClass{subfiles}[2020/02/14 v1.6 Multi-file projects (class)]
-\DeclareOption*{\typeout{Preamble taken from file `\CurrentOption'}%
- \let\preamble@file\CurrentOption}
+\ProvidesClass{subfiles}[2020/11/14 v2.2 Multi-file projects (class)]
+\DeclareOption*{%
+ \typeout{Preamble taken from file `\CurrentOption'}%
+ \let\preamble@file\CurrentOption
+}
\ProcessOptions
% \end{macrocode}
+%
% After processing the option of the |subfiles| class, we reset |\@classoptionslist| such that the options in the main file will be processed.
%
% \begin{macrocode}
\let\@classoptionslist\relax
% \end{macrocode}
-% Then we save the original definition of |\documentclass| to be able to reset it later to this definition:
+%
+% To handle subfiles in separate directories, we use the |import| package.
+% We load it now, since it resets the macro |\import@path|.
+% \begin{macrocode}
+\RequirePackage{import}
+% \end{macrocode}
+%
+% We redefine |\documentclass| to load the class of the main document.
%
% \begin{macrocode}
\let\subfiles@documentclass\documentclass
+\def\documentclass{%
+ \let\documentclass\subfiles@documentclass
+ \LoadClass
+}
% \end{macrocode}
%
-% Now |\documentclass| is set equal to |\LoadClass| such that the class and the options of the main file will be loaded as usual.
+% In earlier versions, we used |\subimport| to load the preamble of the main file, which has the unwanted effect of undoing changes to the graphics path.
+% Therefore we use |\input| and initialize |\import@path| and |\input@path| to the path of the main file.
+% We use the internal \LaTeX\ macro |\filename@parse| to obtain this path.
%
% \begin{macrocode}
-\let\documentclass\LoadClass\relax
+\filename@parse{\preamble@file}
+\edef\import@path{\filename@area}
+\edef\input@path{{\filename@area}}
+\input{\preamble@file}
% \end{macrocode}
%
-% When typesetting a subfile, we have to skip the |document| environment of the main file.
-% This is done with the commands |\comment| and |\endcomment| from the |verbatim| package.
-% Now there is a problem:
-% If we load |verbatim| here, the definition of the commands may be overwritten if the user loads e.g.\ the |comment| package.
-% Loading |verbatim| in |subfiles.sty| at the latest possible moment is not reliable, either.
-% On the one hand we may overwrite macros required later by the user, on the other hand the |memoir| class contains a copy of |verbatim|, so a later |\RequirePackage| refuses to reload the package.
-% Thus, in the case of a document loading the |memoir| class and the |comment| package, we end up with the wrong definition of |\comment| in any case.
+% After loading the preamble of the main file, we reset |\import@path|.
+% Since the preamble may have changed the catcode of the |@| sign, we make it (again) a letter. Better safe than sorry.
%
-% Therefore we load the |verbatim| package here and save the contents of the crucial commands |\comment| and |\endcomment| under a different name.
% \begin{macrocode}
-\RequirePackage{verbatim}
-\let\subfiles@comment\comment
-\let\subfiles@endcomment\endcomment
+{\makeatletter
+ \gdef\import@path{}
+}
% \end{macrocode}
-%
-% To handle subfiles in separate directories, we load the |import| package.
-%
+%
+% \iffalse
+%</class>
+% \fi
+%
+%
+% \subsection{The package}
+%
+% \iffalse
+%<*package>
+% \fi
+%
% \begin{macrocode}
-\RequirePackage{import}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{subfiles}[2020/11/14 v2.2 Multi-file projects (package)]
% \end{macrocode}
+% \subsubsection*{Auxiliary commands}
+%
+% When redefining the |\end| command, we have to have to keep it expandable to a certain depth.
+% Therefore we need an expandable way to compare strings.
+% We borrow the function from LaTeX's |expl3| part.
%
-% The |\subimport| command requires path and filename as separate arguments, so we have to split file locations into these two components.
-% The internal \LaTeX\ command |\filename@parse| almost fits the bill, except that it additionally splits the filename into basename and extension.
-% Unfortunately, concatenating basename and extension to recover the filename is not clean:
-% Under Unix/Linux, the filenames |base| and |base.| denote different entities, but after |\filename@parse| both have the same basename and an empty extension.
-% Therefore we redefine the command |\filename@simple| temporarily; it is responsible for this unwanted split.
-%
% \begin{macrocode}
-\def\subfiles@split#1{%
- \let\subfiles@filename@simple\filename@simple
- \def\filename@simple##1.\\{\edef\filename@base{##1}}%
- \filename@parse{#1}%
- \let\filename@simple\subfiles@filename@simple
-}
+\ExplSyntaxOn
+\cs_new_eq:NN \subfiles@StrIfEqTF \str_if_eq:nnTF
+\ExplSyntaxOff
% \end{macrocode}
%
-% E.g., after executing |\subfiles@split{../dir1/dir2/file.tex}| the macros |\filename@area| and |\filename@base| expand to |../dir1/dir2/| and |file.tex|, respectively.
+% The macro |\subfiles@renewBeginDocument{|\meta{code}|}| redefines |\begin| such that the next |\begin{document}| executes \meta{code} (and then restores the original definition of |\begin|).
%
-% Now we split the name of the main file that has been provided as optional argument of the document class, and |\subimport| the main file.
+% \begin{macrocode}
+\def\subfiles@renewBeginDocument#1{%
+ \let\subfiles@begin\begin
+ \def\begin##1{%
+ \subfiles@StrIfEqTF{##1}{document}{%
+ \let\begin\subfiles@begin
+ #1%
+ }{%
+ \csname subfiles@begin\endcsname{##1}%
+ }%
+ }%
+}
+% \end{macrocode}
+%
+% The macro |\subfiles@renewEndDocument{|\meta{code}|}| redefines |\end| such that the next |\end{document}| executes \meta{code} (and then restores the original definition of |\end|).
+% This macro is more complex then the previous one, as we have to ensure that
+% |\expandafter\expandafter\expandafter\relax\end{env}| expands to |\relax\endenv|.
+% This is necessary for |tabular|s to work correctly.
%
% \begin{macrocode}
-\subfiles@split{\preamble@file}
-\subimport{\filename@area}{\filename@base}
+\def\subfiles@saveEndTo#1{\expandafter\let\expandafter#1\csname end \endcsname}
+\def\subfiles@restoreEndFrom{\expandafter\let\csname end \endcsname}
+\def\subfiles@renewEndDocument#1{%
+ \ifcsname subfiles@end\endcsname
+ \else
+ \subfiles@saveEndTo\subfiles@end
+ \fi
+ \expandafter\def\csname end \endcsname##1{%
+ \romannumeral
+ \subfiles@StrIfEqTF{##1}{document}{%
+ \z@
+ \subfiles@restoreEndFrom\subfiles@end
+ #1%
+ }{%
+ \expandafter\expandafter\expandafter\z@\subfiles@end{##1}%
+ }%
+ }%
+}
% \end{macrocode}
%
-% The main file loads the package |subfiles| as part of the preamble, which saves the contents of |\document| and |\enddocument| as |\subfiles@document| and |\subfiles@enddocument|, respectively.
-% We use these macors now to restore the original values of |\document|, |\enddocument|, and |\documentclass|.
-% The backup commands are |\undefined| to save memory.
-% That's it.
+% \subsubsection*{Handling the main document}
%
+% When the main document is loaded from a subfile, the preamble is read, but the document itself is skipped.
+% The end of the preamble is marked by |\begin{document}|.
+% In version 1.x of the |subfiles| package, everything up to (and including) |\end{document}| is skipped, but the lines following it are treated again as part of the preamble.
+% The macro |\subfiles@handleMainDocumentVi| redefines |\begin{document}| accordingly.
+%
% \begin{macrocode}
-{\catcode`\@=11
-\global\let\document\subfiles@document
-\global\let\enddocument\subfiles@enddocument
-\global\let\documentclass\subfiles@documentclass
-\global\let\subfiles@document\undefined
-\global\let\subfiles@enddocument\undefined
-\global\let\subfiles@documentclass\undefined
+\def\subfiles@handleMainDocumentVi{%
+ \long\def\subfiles@skipToEndDocument##1\end##2{%
+ \subfiles@StrIfEqTF{##2}{document}{\ignorespaces}{\subfiles@skipToEndDocument}%
+ }%
+ \subfiles@renewBeginDocument{%
+ \subfiles@skipToEndDocument
+ }%
}
-%</class>
% \end{macrocode}
%
-% It may not be obvious why |@| has to be catcoded to a letter, since we are in a style file anyway.
-% However, the |\preamble@file| occasionally contains |\usepackage| commands that make |@| a non-letter.
-% This is why the part after loading the main preamble needs a |\catcode| command, grouping, and |\global|'s.
+% In version 2.x of the |subfiles| package, everything following |\begin{document}| is ignored.
+% The macro |\subfiles@handleMainDocumentVii| redefines this command accordingly.
+%
+% \begin{macrocode}
+\def\subfiles@handleMainDocumentVii{%
+ \subfiles@renewBeginDocument{%
+ \endinput
+ \ignorespaces
+ }%
+}
+% \end{macrocode}
%
+% \subsubsection*{Handling subfiles}
%
-% \subsection{The package}
+% When a subfile is loaded, the preamble and |\end{document}| have to be ignored.
+% More precisely, in older versions (v1.x), the following happens:
+% \begin{itemize}
+% \item |\documentclass[...]{subfiles}| is ignored.
+% \item The contents of the preamble becomes part of the text.
+% \item |\begin{document}| is ignored.
+% \item |\end{document}| is ignored.
+% \item Any lines after |\end{document}| are also part of the text.
+% \end{itemize}
%
-% Any option will be ignored.
+% \begin{macrocode}
+\def\subfiles@handleSubDocumentVi{%
+ \let\subfiles@documentclass\documentclass
+ \def\documentclass{%
+ \@ifnextchar[\subfiles@documentclass@{\subfiles@documentclass@[]}%
+ }%
+ \def\subfiles@documentclass@[##1]##2{%
+ \let\documentclass\subfiles@documentclass
+ \ignorespaces
+ }%
+ \subfiles@renewBeginDocument{%
+ \subfiles@renewEndDocument\ignorespaces
+ \ignorespaces
+ }%
+}
+% \end{macrocode}
+% In newer versions (v2.x), the following happens:
+% \begin{itemize}
+% \item The preamble, up to |\begin{document}|, is ignored.
+% \item |\end{document}| as well as any lines after it are ignored.
+% \end{itemize}
%
% \begin{macrocode}
-%<*package>
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{subfiles}[2020/02/14 v1.6 Multi-file projects (package)]
-\DeclareOption*{\PackageWarning{\CurrentOption ignored}}
-\ProcessOptions
+\def\subfiles@handleSubDocumentVii{%
+ \let\subfiles@documentclass\documentclass
+ \long\def\documentclass##1\begin##2{%
+ \subfiles@StrIfEqTF{##2}{document}{%
+ \let\documentclass\subfiles@documentclass
+ \subfiles@renewEndDocument{%
+ \endinput
+ \ignorespaces
+ }%
+ \ignorespaces
+ }{\documentclass}
+ }%
+}
% \end{macrocode}
%
-% If the initial document class was |subfiles|, then the main file is loaded as part of a subfile.
-% In this case anything between |\begin{document}| and |\end{document}| has to be skipped, while the contents of the commands |\document| and |\enddocument| has to be retained for later use in the subfile.
-% Therefore we save the contents of the two commands as |\subfiles@document| and |\subfiles@enddocument|, respectively.
-% Now the |document| environment is redefined to become the saved |comment| environment from the |verbatim| package.
-% Consequently, the body of the main file is ignored by \LaTeX, and only the preamble is read (as well as anything that comes after |\end{document}|!).
+% \subsubsection*{Processing the package options}
%
+% The package has currently only one option, |v1|, which affects the way how the text after |\end{document}| and in the preamble of subfiles is handled.
+% We initialize the macros for handling main and sub documents with the behavior of version 2.x.
+% \begin{macrocode}
+\let\subfiles@handleMainDocument\subfiles@handleMainDocumentVii
+\let\subfiles@handleSubDocument\subfiles@handleSubDocumentVii
+% \end{macrocode}
+% When option |v1| is present, the macros are set to the behavior of version 1.x.
% \begin{macrocode}
-\@ifclassloaded{subfiles}{%
- \let\subfiles@document\document
- \let\subfiles@enddocument\enddocument
- \let\document\subfiles@comment
- \let\enddocument\subfiles@endcomment
+\DeclareOption{v1}{%
+ \let\subfiles@handleMainDocument\subfiles@handleMainDocumentVi
+ \let\subfiles@handleSubDocument\subfiles@handleSubDocumentVi
+}
+\DeclareOption*{\PackageWarning{subfiles}{Option '\CurrentOption' ignored}}
+\ProcessOptions\relax
% \end{macrocode}
%
-% By loading the |subfiles| package immediately before |\begin{document}| we ensure that |\subfiles@document| and |\subfiles@enddocument| contain all modifications that the class and the preamble of the main file may have applied to the |document| environment.
-% This happens e.g.\ with the class |revtex4| and the package |pythontex|.
+% \subsubsection*{Loading subfiles}
%
-% We use the |import| package to handle subfiles in separate directories.
-% The |\subimport| command requires path and filename as separate arguments, so we have to split file locations into these two components.
+% To handle subfiles in separate directories, we use the |import| package.
+% If it has already been loaded, e.g.\ by the |subfiles| class, this line does nothing.
+% \begin{macrocode}
+\RequirePackage{import}
+% \end{macrocode}
+%
+% The |\subimport| command requires path and filename as separate arguments, so we have to split qualified filenames into these two components.
% The internal \LaTeX\ command |\filename@parse| almost fits the bill, except that it additionally splits the filename into basename and extension.
% Unfortunately, concatenating basename and extension to recover the filename is not clean:
% Under Unix/Linux, the filenames |base| and |base.| denote different entities, but after |\filename@parse| both have the same basename and an empty extension.
% Therefore we redefine the command |\filename@simple| temporarily; it is responsible for this unwanted split.
-% Both things, loading the package and defining the command, are also done in |subfiles.cls|, so we have to execute this code only if we are typesetting the main file.
-%
+%
% \begin{macrocode}
-}{% subfiles class not loaded, we typeset the main document
- \RequirePackage{import}
- \def\subfiles@split#1{%
- \let\subfiles@filename@simple\filename@simple
- \def\filename@simple##1.\\{\edef\filename@base{##1}}%
- \filename@parse{#1}%
- \let\filename@simple\subfiles@filename@simple
- }
-}
+\def\subfiles@split#1{%
+ \let\subfiles@filename@simple\filename@simple
+ \def\filename@simple##1.\\{\edef\filename@base{##1}}%
+ \filename@parse{#1}%
+ \let\filename@simple\subfiles@filename@simple
+}%
% \end{macrocode}
%
% E.g., after executing |\subfiles@split{../dir1/dir2/file.tex}| the macros |\filename@area| and |\filename@base| expand to |../dir1/dir2/| and |file.tex|, respectively.
%
% \DescribeMacro{\subfile}
% The command |\subfile| specifies the command |\subimport| for |\input|ing the subfile, and then calls |\subfiles@subfile|.
+%
% \begin{macrocode}
\newcommand\subfile{%
\let\subfiles@loadfile\subimport
@@ -490,6 +679,7 @@
%
% \DescribeMacro{\subfileinclude}
% The command |\subfileinclude| specifies the command |\subincludefrom| for |\include|ing the subfile, and then calls |\subfiles@subfile|.
+%
% \begin{macrocode}
\newcommand\subfileinclude{%
\let\subfiles@loadfile\subincludefrom
@@ -497,67 +687,112 @@
}
% \end{macrocode}
%
-% The main functionality of the two |\subfile| commands is implemented in |\subfiles@subfile|.
-% It redefines |\documentclass| and the |document| environment to do nothing but reverting these command to their original meaning and avoiding spurious spaces.
-% Reverting |\documentclass| and |\document| to their original definition is important for being compatible with classes like |standalone| or packages like |bibentry|, which rely on this definition.
+% The main functionality is implemented in |\subfiles@subfile|.
+% It sets up the handling of the sub-preamble, splits the filename and loads the subfile.
%
% \begin{macrocode}
-\newcommand\subfiles@subfile[1]{%
+\def\subfiles@subfile#1{%
\begingroup
- \let\subfiles@documentclass\documentclass
- \let\subfiles@document\document
- \let\subfiles@enddocument\enddocument
- \renewcommand\documentclass[2][subfiles]{%
- \let\documentclass\subfiles@documentclass
- \ignorespaces
- }%
- \renewenvironment{document}{%
- \let\document\subfiles@document
- \ignorespaces
- }{%
- \let\enddocument\subfiles@enddocument
- \@ignoretrue
- }%
-% \end{macrocode}
-% Now we split the file name into path and base name and load the file.
-%
-% \begin{macrocode}
+ \subfiles@handleSubDocument
\subfiles@split{#1}%
\subfiles@loadfile{\filename@area}{\filename@base}%
\endgroup
}
% \end{macrocode}
%
-% To let external programs find files, we have to add the |\import@path| to file names.
-% This is accomplished with the command |\subfiles@addimportpath|.
+% \subsubsection*{Fixing incompatibilities}
+%
+% \DescribeMacro{\subfix}
+% If some package provides a command that takes a filename as argument, then it has to be prefixed with the current |\import@path|.
+% This is what the |\subfix| command tries to do.
+% In order to succeed, the filename has to be expanded immediately, such that the current value of |\import@path| is used.
+%
+% \begin{macrocode}
+\def\subfix#1{\import@path#1}
+% \end{macrocode}
+%
+% For patching a list of file or path names, we define two auxiliary macros, one iterating over a comma-separated list of names and one processing a sequence of names enclosed in braces.
+%
% \begin{macrocode}
-\def\subfiles@addimportpath#1{%
- \def\subfiles@filelist{}%
+\def\subfiles@fixfilelist#1{%
+ \def\subfiles@list{}%
\def\subfiles@sep{}%
- \@for\subfiles@filename:=#1\do{%
- \edef\subfiles@filelist{%
- \subfiles@filelist
- \subfiles@sep
- \import@path
- \subfiles@filename
- }%
+ \@for\subfiles@tmp:=#1\do{%
+ \edef\subfiles@list{\subfiles@list\subfiles@sep\subfix{\subfiles@tmp}}%
\def\subfiles@sep{,}%
- }
+ }%
+}
+\def\subfiles@fixpathlist#1{%
+ \def\subfiles@list{}%
+ \@tfor\subfiles@tmp:=#1\do{%
+ \edef\subfiles@list{\subfiles@list{\subfix\subfiles@tmp}}%
+ }%
}
% \end{macrocode}
%
% \DescribeMacro{\bibliography}
-% We redefine the |\bibliography| command such that the import path is added to the file names before the original command is called.
+% \DescribeMacro{\graphicspath}
+% We patch |\bibliography| and |\graphicspath| (from the |graphics|/|graphicx| package) such that users don't have to worry about adding |\subfix|.
+%
% \begin{macrocode}
\let\subfiles@bibliography\bibliography
-\renewcommand\bibliography[1]{%
- \subfiles@addimportpath{#1}%
- \expandafter\subfiles@bibliography\expandafter{\subfiles@filelist}%
+\def\bibliography#1{%
+ \subfiles@fixfilelist{#1}%
+ \expandafter\subfiles@bibliography\expandafter{\subfiles@list}%
}
+\@ifpackageloaded{graphics}{%
+ \let\subfiles@graphicspath\graphicspath
+ \def\graphicspath#1{%
+ \subfiles@fixpathlist{#1}%
+ \edef\subfiles@list{{\subfix{}}\subfiles@list}%
+ \expandafter\subfiles@graphicspath\expandafter{\subfiles@list}%
+ }%
+}{}
% \end{macrocode}
%
-% \DescribeMacro{\subfix}
-% Instead of adding further fixes for other packages that write filenames to external files (like |bibunits|), we provide a command for adding the |\import@path| to a filename.
+% \DescribeMacro{\includestandalone}
+% The command |\includestandalone| handles subfiles in its own way.
+% Therefore we modify it to use the original definition of |\end|.
+%
% \begin{macrocode}
-\def\subfix#1{\import@path#1}
+\@ifpackageloaded{standalone}{
+ \RequirePackage{xpatch}
+ \xpretocmd\includestandalone{%
+ \subfiles@saveEndTo\subfiles@end@
+ \ifcsname subfiles@end\endcsname
+ \subfiles@restoreEndFrom\subfiles@end
+ \fi
+ }{}{}
+ \xapptocmd\includestandalone{\subfiles@restoreEndFrom\subfiles@end@}{}{}
+}{}
% \end{macrocode}
+%
+% \subsubsection*{Do we typeset the main file or a subfile?}
+%
+% \DescribeMacro{\ifSubfilesClassLoaded}
+% To add code or text conditionally, depending on whether the main document or a subfile is typeset, we provide the command |\ifSubfilesClassLoaded|.
+%
+% \begin{macrocode}
+\newcommand\ifSubfilesClassLoaded{%
+ \expandafter\ifx\csname ver@subfiles.cls\endcsname\relax
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}
+% \end{macrocode}
+%
+%
+% \subsubsection*{The end is near}
+%
+% The |subfiles| package is loaded near the end of the main preamble.
+% If it is loaded from a subfile, i.e., if |subfiles.cls| has been loaded, then we prepare for skipping the main document.
+% \begin{macrocode}
+\ifSubfilesClassLoaded{%
+ \subfiles@handleMainDocument
+}{}
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
diff --git a/Master/texmf-dist/source/latex/subfiles/subfiles.ins b/Master/texmf-dist/source/latex/subfiles/subfiles.ins
index 95380c1670b..6e4a5ed00b7 100644
--- a/Master/texmf-dist/source/latex/subfiles/subfiles.ins
+++ b/Master/texmf-dist/source/latex/subfiles/subfiles.ins
@@ -1,6 +1,6 @@
% subfiles - class and package for multi-file projects in LaTeX
% Copyright 2002, 2012 Federico Garcia (feg8@pitt.edu, fedegarcia@hotmail.com)
-% Copyright 2018, 2019 Gernot Salzer (salzer@logic.at)
+% Copyright 2018-2020 Gernot Salzer (salzer@logic.at)
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -23,7 +23,7 @@
This is a generated file.
-Copyright 2002, 2012 Federico Garcia; 2018, 2019 Gernot Salzer
+Copyright 2002, 2012 Federico Garcia; 2018-2020 Gernot Salzer
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
diff --git a/Master/texmf-dist/source/latex/suftesi/suftesi.dtx b/Master/texmf-dist/source/latex/suftesi/suftesi.dtx
index 8faa427e855..e9c37111119 100644
--- a/Master/texmf-dist/source/latex/suftesi/suftesi.dtx
+++ b/Master/texmf-dist/source/latex/suftesi/suftesi.dtx
@@ -4,28 +4,34 @@
\input docstrip
\preamble
- Copyright 2009-2020 by Ivan Valbusa
+The 'suftesi' document class
+Copyright (C) 2009-2021 Ivan Valbusa
+<ivan dot valbusa at gmail dot com>
- This program is provided under the terms of the
- LaTeX Project Public License distributed from CTAN
- archives in directory macros/latex/base/lppl.txt.
+All rights reserved.
- Author: Ivan Valbusa
- ivan dot valbusa at univr dot it
+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
+ http://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 "author-maintained".
+This work consists of all files listed in README
-\endpreamble
+This work has the LPPL maintenance status "author-maintained".
+\endpreamble
\keepsilent
\askforoverwritefalse
\Msg{*** Generating the class file ***}
-\generate{\file{suftesi.cls}{\from{suftesi.dtx}{class}}
- \nopreamble\nopostamble
- \file{suftesi.bib}{\from{suftesi.dtx}{bib}}
- }
-
+\generate{
+ \file{suftesi.cls}{\from{suftesi.dtx}{class}}
+ \nopreamble\nopostamble
+ \file{suftesi.bib}{\from{suftesi.dtx}{bib}}}
+
\Msg{***********************************************************}
\Msg{*}
\Msg{* To finish the installation you have to move the following}
@@ -40,26 +46,9 @@
\Msg{*}
\Msg{* Happy TeXing}
\Msg{***********************************************************}
-
\endgroup
%</internal>
-%
-% Copyright (C) 2009-2020 by Ivan Valbusa
-% <ivan dot valbusa at univr dot it>
-% -------------------------------------------------------
-%
-% 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
-% http://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 consists of all files listed in README
-%
% \fi
-%
% \iffalse
%<*driver>
\ProvidesFile{suftesi.dtx}
@@ -67,87 +56,85 @@
%<class>\NeedsTeXFormat{LaTeX2e}[2005/12/01]
%<class>\ProvidesClass{suftesi}
%<*class>
- [2020/02/24 v2.9.8 A class for typesetting theses, books and articles]
+ [2021/02/06 v3.0.2 A class for typesetting theses, books and articles]
%</class>
%<*driver>
-\documentclass[10pt]{ltxdoc}
+\documentclass[12pt]{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
+\usepackage[fontsize=12pt]{fontsize}
\usepackage[greek.ancient,english]{babel}
-% fonts and colors
-\usepackage{cochineal}
-\usepackage[varqu,varl,var0]{inconsolata}
-\usepackage{biolinum}
-\usepackage{amsthm}
-\usepackage[cochineal,bigdelims,cmintegrals,vvarbb]{newtxmath}
-\usepackage[cal=boondoxo]{mathalfa}
+\usepackage{afterpage}
+%--------------------------------------------------------
+% GRAPHICS
+%--------------------------------------------------------
\usepackage[svgnames]{xcolor}
\definecolor{philA}{named}{DarkRed}
\definecolor{philB}{named}{NavyBlue}
\definecolor{sufred}{rgb}{0.5,0,0}
\definecolor{sufgray}{rgb}{0.5,0.5,0.5}
-\usepackage{metalogo}
-\usepackage{guit}
+\usepackage{tikz}
+ \usetikzlibrary{shadows,patterns}
+\usepackage[framemethod=TikZ]{mdframed}
+ \mdfsetup{roundcorner=3pt,linecolor=white,backgroundcolor=gray!10}
+%--------------------------------------------------------
+% DOC FACILITIES
+%--------------------------------------------------------
+\usepackage{hologo}
+\usepackage{guit}% before ltxdockit but after xcolor!
\usepackage[final]{microtype}
-% doc facilities
\let\cs\relax
\let\cmd\relax
\usepackage{ltxdockit}
-\usepackage{siunitx}
+%--------------------------------------------------------
+% FONTS
+%--------------------------------------------------------
+\usepackage{cochineal}
% To use the cochineal inside the document we have to define the family
% because the .fd files of the font refer to conditionals
% defined in 'cochineal.sty’:
\DeclareFontFamily{T1}{Cochineal-LF}{}
\DeclareFontShape{T1}{Cochineal-LF}{m}{n}{
- <-> s*[1.0] Cochineal-Roman-osf-t1}{}
-% layout
+ <-> s*[1.0] Cochineal-Roman-osf-t1}{}
+\usepackage[varqu,varl,var0]{inconsolata}
+\usepackage{biolinum}
+\usepackage{amsthm}
+\usepackage[cochineal,bigdelims,cmintegrals,vvarbb]{newtxmath}
+\usepackage[cal=boondoxo]{mathalpha}
+\usepackage{manfnt}
+%--------------------------------------------------------
+% LAYOUT
+%--------------------------------------------------------
+\usepackage[skip=1.5ex]{parskip}
\setcounter{tocdepth}{3}
\usepackage{geometry}
\geometry{
- a4paper,
- margin=3cm,
- headheight=15pt,
- ignoreall,
- heightrounded}
+ a4paper,
+ margin=3cm,
+ headheight=15pt,
+ ignoreall,
+ heightrounded}
\usepackage{sectsty}
\allsectionsfont{\sffamily}
-\usepackage{fancyhdr}
-\fancyhf{}
-\fancyhead[L]{© 2009-\the\year\quad Ivan Valbusa}
-\fancyfoot[L]{\textsf{suftesi}
- \fileversion{}~--~\filedate}
-\renewcommand{\footrulewidth}{0.4pt}
-\fancyhead[R]{\thepage}
-\pagestyle{fancy}
-% Graphics
-\usepackage[framemethod=TikZ]{mdframed}
- \mdfsetup{roundcorner=3pt,linecolor=white,backgroundcolor=gray!10}
-\usepackage{tikz}
- \usetikzlibrary{shadows}
-\usepackage{afterpage}
-% Tables
+% --------------------------------------------------------
+% OTHER PACKAGES
+% --------------------------------------------------------
+\usepackage[autostyle]{csquotes}
+\usepackage[style=philosophy-classic]{biblatex}
+\addbibresource{suftesi.bib}
+\DeclareBibliographyCategory{pkgs-loaded}
+\addtocategory{pkgs-loaded}{appendix,caption,color,crop,enumitem,emptypage,
+fancyhdr,fixltxhyph,fontenc,fontsize,mathalpha,libertinust1math,newtx,geometry,
+iftex,microtype,multicol,titlesec,titletoc,xkeyval,cclicenses,fontenc,
+substitutefont,luatex85,lm,textcomp,newpx,biolinum,inconsolata,libertine,
+cochineal,mathpazo,bera,amsthm}
\usepackage{array}
\usepackage{booktabs}
\usepackage{multirow}
-% Bibliography
-\usepackage[autostyle]{csquotes}
-\usepackage[style=philosophy-classic,backend=biber]{biblatex}
- \addbibresource{suftesi.bib}
-\usepackage{metalogo}
-\usepackage{guit}
-% Greek examples
-\def\latintxt{Aliquam auctor, pede consequat
- laoreet varius, eros tellus maris quam, pellentesque hendrerit.}
-\def\latintxtb{Morbi luctus, wisi viverra faucibus pretium,
- nibh est placerat.}
-\def\greektxt{Πρῶτον εἰπεῖν περὶ τί καὶ τίνος ἐστὶν ἡ σκέψις, ὅτι περὶ
-ἀπόδειξιν καὶ ἐπιστήμης ἀποδεικτικῆς· εἶτα διορίσαι τί
-ἐστι πρότασις καὶ τί ὅρος καὶ τί συλλογισμός}
-\newcommand{\greekexample}[4]{%
- \noindent\paragraph{#3}{\fontfamily{#1}\selectfont\latintxt}%
- { \fontfamily{#2}\fontsize{#4}{13}\selectfont%
- \textgreek{\greektxt}} {\fontfamily{#1}\selectfont\latintxtb}}
-% New commands
+\usepackage{siunitx}
+%--------------------------------------------------------
+% COMMANDS AND ENVIRONMENTS
+%--------------------------------------------------------
\newcommand{\new}{\marginpar{\textcolor{red}{\textbf{NEW!}}}}
\newcommand{\argstyle}{\itshape}
\DeclareRobustCommand*{\ar}[1]{\texttt{\char`\{}\textrm{\argstyle#1}\texttt{\char`\}}}
@@ -156,84 +143,128 @@
$\langle${\argstyle\rmfamily#1\kern0.12em}$\rangle$}
\DeclareRobustCommand*{\arm}[1]{\ar{\meta{\argstyle#1}}}
\DeclareRobustCommand*{\oarm}[1]{\oar{\meta{\argstyle#1}}}
+\newcommand*{\OR}{${}\mid{}$}
+\makeatletter
+\newlength\CLett
+\newcommand*\alert{
+ \par\noindent
+ \setbox\z@\hbox{\textdbend}\CLett=\wd\z@%
+ \raisebox{-1.05\baselineskip}[0pt][0pt]{%
+ \llap{\box\z@\kern6pt}}}
+\makeatother
% New environments
-\newenvironment{ttquote}
- {\begin{mdframed}[default]
- \ttfamily\microtypesetup{activate=false}}
- {\end{mdframed}}
-\newenvironment{latexcode}
- {\begin{mdframed}[default]}
- {\end{mdframed}}
-% Correct (?) \optitem to use \meta inside #2
+\newenvironment{ttquote}{%
+ \begin{mdframed}\ttfamily\microtypesetup{activate=false}}{\end{mdframed}}
+\newenvironment{latexcode}{\begin{mdframed}}{\end{mdframed}}
\makeatletter
-\renewcommand*{\ltd@ol@optitem}[3][]{%
+% Customizing option and value list:
+\renewcommand*{\ltd@ol@optitem}[3][]{%To use \meta inside #2
\ifblank{#1}
- {\ltd@option{}{#2}{#3}{}}
- {\ltd@option{}{#2}{#3}{\ltd@textverb{#1}}}}%
-\def\ltd@textverb#1{~#1~}
-\renewenvironment*{optionlist}
-{\list{}{%
- \setlength{\labelwidth}{2.5cm}%
- \setlength{\labelsep}{\z@}%
- \setlength{\leftmargin}{2.5cm}%
- \renewcommand*{\makelabel}[1]{\hss\optionlistfont##1}}%
- \ltd@optionlist}
-{\endlist}
-\renewenvironment*{ltxsyntax}[1][3cm]
-{\list{}{%
- \setlength{\labelwidth}{3cm}%
- \setlength{\labelsep}{0pt}%
- \setlength{\leftmargin}{#1}%
- \renewcommand*{\makelabel}[1]{%
- \hss\ltxsyntaxfont\ltxsyntaxlabelfont##1}}%
- \let\csitem\ltd@csitem
- \let\cmditem\ltd@cmditem
- \let\envitem\ltd@envitem
- \let\lenitem\ltd@csitem
- \let\boolitem\ltd@boolitem
- \let\cntitem\ltd@item
- \let\optitem\ltd@item}
-{\endlist}
-{\endlist}
-\renewenvironment*{valuelist}[1][]
-{\list{}{%
- \ifblank{#1}
- {\setlength{\labelwidth}{5em}}
- {\setlength{\labelwidth}{#1}}%
- \setlength{\labelsep}{1em}%
- \setlength{\leftmargin}{\labelwidth}%
- \addtolength{\leftmargin}{\labelsep}%
- \setlength{\itemsep}{0pt}%
- \renewcommand*{\makelabel}[1]{\valuelistfont##1\hss}}}
-{\endlist}
+ {\ltd@option{}{#2}{#3}{}}
+ {\ltd@option{}{#2}{#3}{\ltd@textverb{#1}}}}%
+\pretocmd{\valuelist}{\let\optionlistfont\valuelistfont}{}{}
+\patchcmd{\ltxsyntax}{\marglistwidth}{0pt}{}{}
+\patchcmd{\ltd@option@i}{=}{\ = }{}{}
+\patchcmd{\ltd@option@ii}{=}{\ = }{}{}
+\expandafter\patchcmd\csname\string\valuelist\endcsname{{\leftmargin}{\labelsep}}{{\leftmargin}{3\labelsep}}{}{}
+% New color for items
\newcommand*{\valuelistfont}{%
- \color{olive}\sffamily\displayverbfont}
+ \color{olive}\sffamily\displayverbfont}
\renewcommand*{\optionlistfont}{%
- \color{philA}\sffamily\displayverbfont}
+ \color{philA}\sffamily\displayverbfont}
\renewcommand*{\ltxsyntaxlabelfont}{%
- \color{philA}\sffamily\displayverbfont}
+ \color{philA}\sffamily\displayverbfont}
\renewcommand*{\marglistfont}{%
- \color{philA}\sffamily\displayverbfont}
+ \color{philA}\sffamily\displayverbfont}
% Table of contents
\renewcommand\tableofcontents{%
- \setlength{\columnsep}{1cm}
- {\centering
- \section*{\contentsname}%
- \@mkboth{\contentsname}{\contentsname}}
- \thispagestyle{empty}
- \begin{multicols}{2}
- \@starttoc{toc}%
+ \setlength{\columnsep}{1cm}
+ {\centering
+ \section*{\contentsname}%
+ \@mkboth{\contentsname}{\contentsname}}
+ \thispagestyle{empty}
+ \begin{multicols}{2}
+ \@starttoc{toc}%
\end{multicols}}
\makeatother
-% hyperref setup
+% --------------------------------------------------------
+% GREEK EXAMPLES
+% --------------------------------------------------------
+\makeatletter
+\newcommand{\mygrsize}{\f@size}
+\makeatother
+\newcommand{\mygrpxsize}{12.5}
+\def\latintxt{Aliquam auctor, pede consequat
+ laoreet varius, eros tellus maris quam, pellentesque hendrerit.}
+\def\latintxtb{Morbi luctus, wisi viverra faucibus pretium,
+ nihil est placerat pro cuius loquentis verba. Sed maleficium in quibusdam
+ aeternitaem.}
+\def\greektxt{Πρῶτον εἰπεῖν περὶ τί καὶ τίνος ἐστὶν ἡ σκέψις, ὅτι περὶ
+ἀπόδειξιν καὶ ἐπιστήμης ἀποδεικτικῆς· εἶτα διορίσαι τί
+ἐστι πρότασις καὶ τί ὅρος καὶ τί συλλογισμός}
+\newcommand{\greekexample}[4]{%
+ \noindent\textbf{#3}{ \fontfamily{#1}\selectfont\latintxt\ }%
+ {\fontfamily{#2}\fontsize{#4}{13}\selectfont%
+ \textgreek{\greektxt}} {\fontfamily{#1}\selectfont\latintxtb}\par\smallskip}
+% --------------------------------------------------------
+% LAYOUTS THUMBNAILS
+% --------------------------------------------------------
+\usepackage{xfp}
+\NewExpandableDocumentCommand{\sufgetlength}{O{pt}mm}{%
+ % #1 (optional, default pt), #2 = length
+ \fpeval{round((#3)/(1#1),#2)}}
+\newlength{\expaperwidth}
+\newlength{\expaperheight}
+\newlength{\extextwidth}
+\newlength{\extextheight}
+\newlength{\exxshift}
+\newlength{\exyshift}
+\newlength{\exzshift}
+\def\sufsetlengthsA{%marginratio: 2/3
+ \setlength{\exxshift}{\dimexpr(0.666\expaperwidth-0.666\extextwidth)}
+ \setlength{\exyshift}{\dimexpr(0.666\expaperheight-0.666\extextheight)}
+ \setlength{\exzshift}{\dimexpr(2\expaperwidth-\extextwidth-\exxshift)}}
+\def\sufsetlengthsB{%marginratio: 1/1
+ \setlength{\exxshift}{\dimexpr(0.5\expaperwidth-0.5\extextwidth)}
+ \setlength{\exyshift}{\dimexpr(0.5\expaperheight-0.5\extextheight)}
+ \setlength{\exzshift}{\dimexpr(2\expaperwidth-\extextwidth-\exxshift)}}
+\def\sufsetlengthsC{%hmarginratio: 1/1; vmarginratio:2/3
+ \setlength{\exxshift}{\dimexpr(0.5\expaperwidth-0.5\extextwidth)}
+ \setlength{\exyshift}{\dimexpr(0.666\expaperheight-0.666\extextheight)}
+ \setlength{\exzshift}{\dimexpr(2\expaperwidth-\extextwidth-\exxshift)}}
+\newcommand{\sufpagesetup}[6]{%
+ \setlength{\extextwidth}{#3cm}%
+ \setlength{\extextheight}{#4cm}%
+ \setlength{\expaperwidth}{#5cm}%
+ \setlength{\expaperheight}{#6cm}%
+ \sufsetlengths%
+ \tikzset{body/.style ={yshift=\exyshift,draw=none,pattern={horizontal lines light gray}}}%
+ \tikzset{page/.style ={fill=gray!5!yellow!2,draw=gray!50}}%
+ \begin{tikzpicture}[scale=#1]
+ \draw[page] (0,0) rectangle (\expaperwidth,\expaperheight);
+ \draw[page,xshift=\expaperwidth] (0,0) rectangle (\expaperwidth,\expaperheight);
+ \draw[draw=gray!10,thick] (\expaperwidth,0) -- (\expaperwidth,\expaperheight);
+ \draw[xshift=\exxshift,body] (0,0) rectangle (\extextwidth,\extextheight);
+ \draw[xshift=\exzshift,body] (0,0) rectangle (\extextwidth,\extextheight);
+ \node at (\expaperwidth,-4) (caption) {\parbox{2.5cm}{\centering\footnotesize\texttt{#2}\par (\sufgetlength[cm]{2}{\expaperwidth} $\times$ \sufgetlength[cm]{2}{\expaperheight})\par}};
+ \end{tikzpicture}}
+% --------------------------------------------------------
+% HYPERREF SETUP
+% --------------------------------------------------------
\usepackage{hyperref}
\hypersetup{%
- hidelinks,
- pdftitle={User's Guide to \textsf{suftesi}},
- pdfsubject={A document class for typesetting theses,
- books and articles},
- pdfauthor={Ivan Valbusa},
- pdfkeywords={thesis, humanities, books}}
+ hidelinks,
+ pdftitle={User's guide to \textsf{suftesi}},
+ pdfsubject={A document class for typesetting theses,
+ books and articles},
+ pdfauthor={Ivan Valbusa},
+ pdfkeywords={thesis, humanities, books}}
+% --------------------------------------------------------
+% FINAL SETTINGS
+% --------------------------------------------------------
+\setcounter{tocdepth}{2}
+\widowpenalty=10000
+\clubpenalty=10000
\EnableCrossrefs
\CodelineIndex
@@ -246,7 +277,7 @@
%</driver>
% \fi
%
-% \CheckSum{5277}
+% \CheckSum{5380}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -264,8 +295,14 @@
% Grave accent \` Left brace \{ Vertical bar \|
% Right brace \} Tilde \~}
%
+% \changes{v3.0.2}{2021/02/06}{Improved \opt{subsecstyle} and \opt{subsubsecstyle} options.}
+% \changes{v3.0.1}{2021/01/27}{Maintenance release.}
+% \changes{v3.0}{2021/01/24}{Improved \sty{biblatex} support. Updated documentation.}
+% \changes{v2.9.9b (2.9.11)}{2020/12/21}{New page layouts: \opt{pocketa}, \opt{pocketb}, \opt{pocketc}. New commands \cmd{breakinbody}, \cmd{breakinbodyleft}, \cmd{breakintoc} (old names: \cmd{headbreak} and \cmd{xheadbreak}). Changed definitions of \cmd{appendixpagename}, \cmd{appendixtocname} and \cmd{appendixname} commands (default: english). The \cmd{part} command has been completely redefined. Updated documentation.}
+% \changes{v2.9.9a (2.9.10)}{2020/06/26}{Corrected a bug using the \env{otherlanguage} environment with \opt{greekfont} option. Updated documentation.}
+% \changes{v2.9.9}{2020/05/21}{Removed a bug with \cmd{appendix} and roman chapter numbers in table of contents. Updated documentation.}
% \changes{v2.9.8}{2020/02/24}{Removed license restrictions. Updated documentation.}
-% \changes{v2.9.7}{2020/02/22}{New option \opt{fontisize}. The \opt{parindent} options now accepts arbitrary values. Updated documentation.}
+% \changes{v2.9.7}{2020/02/22}{New option \opt{fontsize}. The \opt{parindent} options now accepts arbitrary values. Updated documentation.}
% \changes{v2.9.6a}{2020/02/11}{Maintenance release}
% \changes{v2.9.6}{2020/02/10}{New option \opt{compacttoc}. The appendix page title is printed in the font of the chapters by default. Removed \cmd{apepndicesname} command.}
% \changes{v2.9.5}{2020/02/04}{Restored \texttt{templates} folder. New template \texttt{book-customize}. New mechanism for the appendices through the \sty{appendix} package.}
@@ -279,12 +316,12 @@
% \changes{v2.7}{2016/03/22}{New value \opt{cscreen} for \opt{version} option. Updated documentation. Removed value \opt{elements} for options:\opt{pagelayout}, \opt{headerstyle}, \opt{captionstyle}, \opt{chapstyle}, \opt{style}; \opt{sufelements} for option: \opt{style}. The \cmd{chapnumfont} command is no longer available.}
% \changes{v2.6}{2016/03/13}{New \opt{mathfont} option for non-standard fonts. New command \cmd{makecover} for printing the cover page. Updated documentation.}
% \changes{v2.5}{2016/03/02}{Corrected a bug when loading CB Greek fonts. Renamed option \opt{documentstructure} to \opt{structure}. Updated documentation.}
-% \changes{v2.4}{2016/02/27}{Changed the default font to Cochineal with Linux Biolinum O sans serif and Inconsolata monospaced. The Palatino is now loaded with \sty{newpxtext} and \sty{newpxmath}. Bera Mono and Iwona have been substituted by Linux Biolinum O and Inconsolata. New values for font options: \opt{cochineal}, \opt{libertine}, \opt{bodoni} (greek only). Value \opt{compatibility} for \opt{defaultfont} option to get the fonts of suftesi v2.3 or previous. Updated documentation.}
+% \changes{v2.4}{2016/02/27}{Changed the default font to Cochineal with Linux Biolinum sans serif and Inconsolata monospaced. The Palatino is now loaded with \sty{newpxtext} and \sty{newpxmath}. Bera Mono and Iwona have been substituted by Linux Biolinum and Inconsolata. New values for font options: \opt{cochineal}, \opt{libertine}, \opt{bodoni} (greek only). Value \opt{compatibility} for \opt{defaultfont} option to get the fonts of suftesi v2.3 or previous. Updated documentation.}
% \changes{v2.3}{2015/09/19}{Maintenance release.}
% \changes{v2.2}{2015/09/10}{Maintenance release.}
% \changes{v2.1}{2015/06/13}{New option \opt{toc\meta{level}font}. Updated documentation. Removed \cmd{includeart} command}
% \changes{v2.0.1}{2015/03/31}{Corrected a bug in \opt{version} option.}
-% \changes{v2.0}{2015/03/29}{New page layout \opt{standardaureo}. Enhanced support for \LuaLaTeX. Headers settings are now executed \cmd{AtBeginDocument}. Loaded \sty{ifluatex} and \sty{ifthen} packages. Added \opt{listparindent} to \cmd{setlist} options. Updated documentation.}
+% \changes{v2.0}{2015/03/29}{New page layout \opt{standardaureo}. Enhanced support for Lua\LaTeX. Headers settings are now executed \cmd{AtBeginDocument}. Loaded \sty{ifluatex} and \sty{ifthen} packages. Added \opt{listparindent} to \cmd{setlist} options. Updated documentation.}
% \changes{v1.9c}{2014/04/05}{The \opt{cbgreek} value for the \opt{greekfont} option allows now to use the full set of the CB Greek font together with the default font (Palatino).}
% \changes{v1.9b}{2014/02/16}{Corrected a bug in ``toc'', ``lof'' and ``lot'' commands.}
% \changes{v1.9a}{2014/02/11}{Maintenance release. Updated greek support. Updated documentation.}
@@ -317,7 +354,7 @@
% Provided a thesis template}
% \changes{v0.6c}{2011/11/16}{Maintenance release, no changes}
% \changes{v0.6b}{2011/11/07}{Improved full compatibility with
-% \XeLaTeX.
+% Xe\LaTeX.
% \sty{varioref} and \sty{footmisc} packages are no longer loaded}
% \changes{v0.6a}{2011/10/24}{Maintenance release, no changes}
% \changes{v0.6}{2011/10/21}{English documentation. Renamed options
@@ -356,17 +393,65 @@
% \DoNotIndex{\titlepage,\vss,\vtop,\xdef,\@gobbletwo,\color,\dimexpr}
% \DoNotIndex{\huge,\large,\makebox,\ProcessOptions,\renewcommand}
%
+%\nocite{appendix,caption,color,crop,enumitem,emptypage,fancyhdr,fixltxhyph,fontenc,fontsize,mathalpha,libertinust1math,newtx,geometry,iftex,microtype,multicol,titlesec,titletoc,xkeyval,cclicenses,fontenc,substitutefont,luatex85,lm,textcomp,newpx,biolinum,inconsolata,libertine,cochineal,mathpazo,bera,amsthm}
+%
+% \thispagestyle{empty}
+%
+% \begin{tikzpicture}[overlay,remember picture]
+% \draw[circular drop shadow,draw=none,fill=white] (current page.center) circle (6cm) node[align=center,anchor=center] {%
+% Ivan Valbusa\\[1cm]
+%
+%\Huge\color{gray}\bfseries \parbox{10cm}{\centering The \\{{\color{philA}\fontsize{30}{32}\textsf{suftesi}}\\ document class}}\\[1cm]
+% \color{black!60!Goldenrod}
+%
+%\normalsize \fileversion{} -- \filedate
+%
+%};
+% \end{tikzpicture}
+% \clearpage\thispagestyle{empty}
+%
+% \null\vfill
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section*{Legalese}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% \noindent Copyright \copyright\ 2009-\the\year\ Ivan Valbusa
+% \smallskip
+%
+% \noindent This package is author-maintained.
+% Permission is granted to copy, distribute and/or modify this software
+% under the terms of the \hologo{LaTeX} Project Public License, version 1.3 or
+% later (\url{http://latex-project.org/lppl}).
+% This software is provided ``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.
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section*{Feedback}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% If you have any questions, feedback or requests please email
+% me at \texttt{ivan dot valbusa at gmail dot com}. If you need specific
+% features not already implemented, remember to attach the example files.
+%
+% \clearpage
+%
% \begin{center}
-% {\color{philA}\bfseries
-% \Huge User's Guide to \textsf{suftesi}\\[3mm]}
-% {\large\itshape A document class for typesetting theses, books and articles}
+% {\color{philA}\bfseries\sffamily
+% \huge User's guide to \texttt{suftesi}\\[3mm]}
+% {\large\bfseries\sffamily A document class for typesetting theses, books and articles}
% \vspace{.8cm}
%
% \normalsize\fileversion{} -- \filedate
% \vspace{.7cm}
%
% Ivan Valbusa\\[2mm]
-% \footnotesize\texttt{Ivan dot Valbusa at univr dot it}
+% \footnotesize\texttt{ivan dot valbusa at gmail dot com}
% \vspace{1cm}
% \end{center}
% \begin{abstract}
@@ -376,70 +461,93 @@
% provides a set of ``humanistic'' page layouts, title styles
% and heading styles to typeset books, articles and theses.
% The styles are very simple and sober and also have the aim of
-% finding an aesthetic harmony in the formal simplicity \parencite[see][]{valbusa:20122}. They are
+% finding an aesthetic harmony in the formal simplicity
+% \parencite[see][]{valbusa:20122}. They are
% largely inspired by some interesting readings, particularly
-% \citetitle{Bringhurst:1992} by Robert \textcite{Bringhurst:1992}, \citetitle{Tschichold:1975} by Jan \textcite{Tschichold:1975} and
+% \citetitle{Bringhurst:1992} by Robert \textcite{Bringhurst:1992},
+% \citetitle{Tschichold:1975} by Jan \textcite{Tschichold:1975} and
% \citetitle{Morison:1111} by Stanley \textcite{Morison:1111}.
% \end{abstract}
%
-% \tableofcontents
-%
-% \section*{Legalese}
-%
-% \noindent Copyright \copyright\ 2009-\the\year\ Ivan Valbusa
-% \smallskip
-%
-% \noindent This package is author-maintained.
-% Permission is granted to copy, distribute and/or modify this software under the
-% terms of the LaTeX Project Public License, version 1.3 or later (\url{http://latex-project.org/lppl}).
-% This software is provided ``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.
-%
-% \section*{A brief history}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \tableofcontents
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% The \sty{suftesi} class was born as a result of the course \emph{Introduzione a \LaTeX{} per le scienze umane} (\emph{Introduction to \LaTeX{} for the human sciences}) which I held at the Graduate School of Human Sciences and Philosophy (\textcolor{magenta}{\textbf{S}}cienze \textcolor{magenta}{\textbf{U}}mane e \textcolor{magenta}{\textbf{F}}ilosofia) of Verona University (Italy) in June 2010. Originally thought as a class to typeset theses, during these years it has developed many new features and styles. Finally it has become the referential class of the Joint Project \emph{Formal Style for PhD Theses with LaTeX} of the University of Verona.
%
-% \section*{Acknowledgments}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section*{A brief history}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% The \sty{suftesi} class was born as a result of the course \emph{Introduzione
+% a \hologo{LaTeX} per le scienze umane} (\emph{Introduction to \hologo{LaTeX} for
+% the Human Sciences}) which I held at the Graduate School of Human Sciences and
+% Philosophy (\textcolor{sufred}{\textbf{S}}cienze \textcolor{sufred}{\textbf{U}}mane
+% e \textcolor{sufred}{\textbf{F}}ilosofia) of Verona University (Italy) in June
+% 2010. Originally thought as a class to typeset theses, through the years
+% it has developed many new features and styles. Finally it has become the
+% referential class of the Joint Project \emph{Formal Style for PhD
+% Theses with \hologo{LaTeX}} of the University of Verona.
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section*{Acknowledgments}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
% I would like to thank Professors Paola Di~Nicola,
-% Director of the Graduate School, and Ugo Savardi who suggested to propose the course precisely to that School; Gilberto D'Arduini, Matteo Lanza and Antonio Rinaldi, who installed \LaTeX{} on the computers used during the course; Catia Cordioli, for her help in the organization of the lessons; Corrado Ferreri, responsible of the \mbox{E-Learning} Center, who provided the \TeX{}~Live~2009 \textsc{DVD}s.
-% Special thanks to Professors Enrico~Gregorio, the Italian guru of \TeX, for the \TeX pert support and his priceless ``magic formulas'', and Tommaso Gordini for his valuable advice in choosing and improving the class features during these years.
-% I would finally thank all the participants to the course who patiently resisted the four intensive lessons. This work is dedicated to them.
-
-% \section*{Feedback}
-%
-% \noindent If you have any questions, feedback or requests please email me at \texttt{ivan dot valbusa at univr dot it}. If you need specific features not already implemented, remember to attach the example files.
+% Director of the Graduate School of Human Sciences and
+% Philosophy, and Ugo Savardi who suggested to propose
+% the course precisely to that School; Gilberto D'Arduini, Matteo Lanza and
+% Antonio Rinaldi, who installed \hologo{LaTeX} on the computers used during the course;
+% Catia Cordioli, for her help in the organization of the lessons;
+% Corrado Ferreri, responsible of the \mbox{E-Learning} Center, who provided
+% the \TeX{}~Live~2009 \textsc{DVD}s.
+% Special thanks to Professors Enrico~Gregorio, the Italian guru of \TeX,
+% for the \TeX pert support and his priceless ``magic formulas'', and Tommaso
+% Gordini for his valuable advice in choosing and improving the class
+% features during these years. I would finally thank all the participants
+% to the course who patiently endured the four intensive lessons.
+% This work is dedicated to them.
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{Usage}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% \section{Use}
+% The class can be loaded as usual with:
%
-% The \sty{suftesi} class is called as usual by
% \begin{ttquote}
% \cmd{documentclass}\oarm{options}\{suftesi\}
% \end{ttquote}
-% All the options defined by the class are in the \meta{key}=\meta{value} format.
-%
-% In addition to these you can also use the options defined by the standard \sty{book} class (on which \sty{suftesi} is based) except those modifying
-% the page dimensions (\opt{a4paper}, \opt{a5paper}, \opt{b5paper}, \opt{legalpaper}, \opt{executivepaper} and \opt{landscape}), which are automatically disabled. The class loads the packages listed in table \ref{tab:pkgloaded}.
-%
-% \subsection*{Using with Xe\LaTeX and Lua\LaTeX}
-% For using the class with the \XeTeX{} and \LuaTeX{} engines you need to load the \sty{fontspec} package (\sty{mathspec} is an alternative only for \XeTeX) and to select a main font.
-%
-%
-% \begin{table}[h]
+% All the options defined by the class are in
+% the \meta{key}\texttt{=}\meta{value} format. In addition to these you can
+% also use the options defined by the standard
+% \sty{book} class (on which \sty{suftesi} is based) except those modifying
+% the page dimensions (\opt{a4paper}, \opt{a5paper}, \opt{b5paper},
+%\opt{legalpaper}, \opt{executivepaper} and \opt{landscape}), which are
+% automatically disabled. The class loads the packages listed in
+% table \ref{tab:pkgloaded}.
+%
+% \begin{table}
% \centering
% \begin{tabular}{>{\sffamily}r@{}>{\sffamily}l>{\raggedright\arraybackslash}>{\sffamily}p{9.6cm}}
% \toprule
-% & textrm{Global} & appendix, caption, color, crop, enumitem, emptypage,
-% fancyhdr, fixltxhyph, fontenc, geometry, iftex,
-% microtype, multicol, titlesec, titletoc, xkeyval, (cclicenses) \\\midrule
-% & \textrm{pdf\LaTeX{} only} & fontenc, substitutefont \\\midrule
-% & \textrm{Lua\LaTeX{} only} & luatex85 \\\midrule
-% defaultfont~= & ~standard & lmodern \\
-% & ~palatino & textcomp, newpxtext, biolinum, inconsolata, newpxmath \\
-% & ~libertine & textcomp, libertine, biolinum, inconsolata, newtxmath \\
-% & ~cochineal & textcomp, cochineal, biolinum, inconsolata, newtxmath \\
-% & ~compatibility & mathpazo, beramono \\\midrule
-% mathfont~= & ~extended & amsthm, mathalfa \\\bottomrule
+% & \textrm{Global} & appendix, caption, color, crop, enumitem, emptypage,
+% fancyhdr, fixltxhyph, fontenc, fontsize, geometry, iftex,
+% microtype, multicol, titlesec, titletoc, xkeyval, (cclicenses) \\\midrule
+% & \textrm{\hologo{pdfLaTeX} only} & fontenc, substitutefont \\\midrule
+% & \textrm{\hologo{LuaLaTeX} only} & luatex85 \\\midrule
+% defaultfont~= & ~standard & lmodern \\
+% & ~palatino & textcomp, newpxtext, biolinum, inconsolata, newpxmath \\
+% & ~libertine & textcomp, libertine, biolinum, inconsolata, newtxmath, libertinust1math \\
+% & ~cochineal & textcomp, cochineal, biolinum, inconsolata, newtxmath \\
+% & ~compatibility & mathpazo, beramono \\\midrule
+% mathfont~= & ~extended & amsthm, mathalpha \\\bottomrule
% \end{tabular}
% \caption{Packages loaded by \sty{suftesi}}\label{tab:pkgloaded}
% \end{table}
@@ -447,101 +555,236 @@
% \changes{v0.9b}{2012/09/23}{The \sty{epigraph} package is no longer loaded}
%
%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection*{Using with \hologo{XeLaTeX} and \hologo{LuaLaTeX}}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% \section{Class features}
+% For using the class with the \hologo{XeTeX} and \hologo{LuaTeX} engines you need
+% to load the \sty{fontspec} package (\sty{mathspec} is an alternative
+% only for \hologo{XeTeX}) and to select a main font.
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{Class features}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% The \sty{suftesi} class provides a large set of options to customize the style of page, titles, headings and other text elements (see section \ref{sec:options}). The simplest way to get to know the class features is therefore to typeset one of the templates which you can find in the \texttt{/doc/latex/suftesi} folder in your \LaTeX{} distribution \parencite[see also][]{valbusa:20122}. The class files as well as the templates are also available online on the CTAN’s website at
+% The \sty{suftesi} class provides a large set of options to customize
+% the style of page, titles, headings and other text elements (see section
+% \ref{sec:options}). The simplest way to get to know the class features
+% is therefore to typeset one of the templates which you can find in the
+% \texttt{/doc/latex/suftesi} folder in your \hologo{LaTeX} distribution
+% \parencite[see also][]{valbusa:20122}. The class files as well as the
+% templates are also available online on the CTAN’s website at
% \textcolor{magenta}{\url{http://www.ctan.org/pkg/suftesi}}.
%
-% \subsection{Document structure}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Document structures}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% With \sty{suftesi} you can typeset book-style documents (with chapters), article-style documents (without chapters) and collections of papers (see section \ref{sec:collection}). The kind of document is set by the \opt{structure} option which defaults to \opt{book} (see section \ref{sec:options}).
-%
-% \begin{ttquote}
-% \cmd{documentclass}[structure=\meta{value},\meta{options}]\{suftesi\}
-% ^^A\cmd{documentclass}[structure=article,\meta{options}]\{suftesi\}\\
-% ^^A\cmd{documentclass}[structure=collection,\meta{options}]\{suftesi\}
-% \end{ttquote}
-%
-% \changes{v0.9b}{2012/09/23}{The \sty{mparhack} package is no longer loaded. It is not compatible with \sty{crop}.}
+% With \sty{suftesi} you can typeset book-style documents (with chapters),
+% article-style documents (without chapters) and collections of papers
+% (see section \ref{sec:collection}). The kind of document is set by the
+% \opt{structure} option which defaults to \opt{book} (see section
+% \ref{sec:options}).
+%
+% \changes{v0.9b}{2012/09/23}{The \sty{mparhack} package is no longer
+% loaded. It is not compatible with \sty{crop}.}
%
-% \subsection{Page layouts}
-%
-% The class provides nine page layouts which can be selected by the \opt{pagelayout} option (table \ref{tab:layouts}). The \opt{standard} layout (default) or \opt{standardaureo} layout are aimed to typeset A4 documents, while the other seven layouts are particularly suitable to typeset compact books, articles or theses. For these compact layouts the \opt{version=screen} and \opt{version=cscreen} options are particularly useful as they show the output in its real size. See section \ref{sec:page-styles} for details.
-%
-% \begin{table}[h]
-% \centering
-% \begin{tabular}{lcccccccl}
-% \toprule
-% & \multicolumn{4}{c}{Dimensions(mm)} & \multicolumn{4}{c}{Proportions}\\\cmidrule(lr){2-5}\cmidrule(lr){6-9}
-% & \multicolumn{2}{c}{Typeblock}& \multicolumn{2}{c}{Page}& \multicolumn{2}{c}{Margins}
-% & \multicolumn{2}{c}{Stock}\\\cmidrule(lr){2-3}\cmidrule(lr){4-5}\cmidrule(lr){6-7}\cmidrule(l){8-9}
-% Layout & w & h & w & h & t\,/\,b & i \,/\,o & Typeblock & Page\\
-% \cmidrule(r){2-3}\cmidrule(lr){4-5}\cmidrule(lr){6-7}\cmidrule(l){8-9}\cmidrule(r){1-1}
-% \opt{standard} & 110 & 220 & 210 & 297 & $1:2$ & $1:2$ & $1:2$ & $1:\sqrt{2}$ \\
-% \opt{standardaureo} & 136 & 220 & 210 & 297 & $2:3$ & $2:3$ & $5:8$ \makebox[0pt]{\textsuperscript{*}} & $1:\sqrt{2}$ \\
-% \opt{compact} & 110 & 165 & 160 & 240 & $2:3$ & $2:3$ & $2:3$ & $2:3$ \\
-% \opt{compactaureo} & 118 & 191 & 160 & 240 & $2:3$ & $2:3$ & $5:8$ \makebox[0pt]{\textsuperscript{*}} & $2:3$ \\
-% \opt{supercompact} & 100 & 150 & 140 & 210 & $2:3$ & $2:3$ & $2:3$ & $2:3$ \\
-% \opt{supercompactaureo} & 108 & 175 & 140 & 210 & $1:1$ & $1:1$ & $5:8$ \makebox[0pt]{\textsuperscript{*}} & $2:3$ \\
-% \opt{periodical} & 110 & 165 & 170 & 240 & $2:3$ & $2:3$ & $2:3$ & $1:\sqrt{2}$ \\
-% \opt{periodicalaureo} & 120 & 194 & 170 & 240 & $2:3$ & $2:3$ & $5:8$ \makebox[0pt]{\textsuperscript{*}} & $1:\sqrt{2}$ \\
-% \bottomrule\\[-2ex]
-% \multicolumn{9}{r}{\footnotesize\textsuperscript{*}$5:8\approx1:1,618$}
-% \end{tabular}\\[-3ex]
-% \caption{The layouts of \sty{suftesi}}\label{tab:layouts}
-% \end{table}
-%
-% You can define your own layouts through the \cmd{geometry} command and you can change the value of \cmd{baselineskip} too. For example you can resize the typeblock of the \texttt{supercompactaureo} layout to fit your particular needs. In this case remember to declare \cmd{normalsize} like in the following example:
-% \begin{latexcode}
-% \begin{verbatim}
-% \linespread{0.95}
-% \normalsize
-% \geometry{
-% textheight= 162mm,
-% textwidth= 100mm,
-% paperwidth= 140mm,
-% paperheight= 210mm,
-% hmarginratio= 2:3,
-% vmarginratio= 1:1,
-% marginparwidth= 11mm,
-% marginparsep= 7pt,
-% ignoreall,
-% heightrounded}
-% \end{verbatim}
-% \end{latexcode}%
-% ^^A The form of the book has been changing through the centuries and every content requires a particular shape. Nowdays the most widespread form for literary essays is a compact one. So, if you are interested in such a topic, you should consider the compact layouts. The one I prefer is shown on figure \ref{fig:periodicalaureo}.
-%
-% ^^A\begin{figure}[h!]\centering
-% ^^A\noindent\begin{tikzpicture}[scale=0.3]
-% ^^A\draw (0,0) rectangle (17,24);
-% ^^A\draw[draw=none,fill=gray!50,xshift=3cm,yshift=2.6cm] (0,0) rectangle (12,19.4);
-% ^^A\draw[xshift=17cm] (0,0) rectangle ++(17,24);
-% ^^A\draw[xshift=17cm,draw=none,fill=gray!50,xshift=2cm,yshift=2.6cm] (0,0) rectangle ++(12,19.4);
-% ^^A\end{tikzpicture}
-% ^^A\caption{The \opt{periodicalaureo} layout}\label{fig:periodicalaureo}
-% ^^A\end{figure}
-%
-% \subsection{Fonts}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Page layouts}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% The class provides eight page layouts which can be selected by the
+% \opt{pagelayout} option (table \ref{tab:layouts}). The \opt{standard}
+% layout (default) or \opt{standardaureo} layout are aimed to typeset
+% A4 documents, while the other seven layouts are particularly suitable
+% to typeset compact books, articles or theses. For these compact layouts
+% the \opt{version=screen} and \opt{version=cscreen} options are particularly
+% useful as they show the output in its real size. See section
+% \ref{sec:page-styles} for details. In figure \ref{fig:layouts} you can see
+% the thumbnails of the eleven page layouts provided by \sty{suftesi}.
+%
+% You can define your own layouts through the \cmd{geometry} command
+% and you can change the value of \cmd{baselineskip} too. For example
+% you can resize the typeblock of the \texttt{supercompactaureo} layout
+% to fit particular needs, or simply because the font used requires
+% a smaller line width. As you can see
+% in the following example, you can change many aspects of the layout,
+% using the parameters available for the \cmd{geometry} command.
+% Here we have
+% modified also the margin ratio, the value of the upper margin and the
+% distance between the head and the beginning of the text. For the other parameters
+% sees the documentation of the \sty{geometry} package \parencite{geometry}.
+%
+% \alert Remember that if you change the line spacing with
+% the \cmd{linespread} command, you need to add \cmd{normalsize}.
+% \medskip
%
+%\begin{minipage}{.4\textwidth}
+%\begin{latexcode}
+%\begin{verbatim}
+%\linespread{0.956}
+%\normalsize
+%\geometry{
+% ignoreall,
+% paperwidth = 140mm,
+% paperheight = 210mm,
+% textheight = 165mm,
+% textwidth = 100mm,
+% marginratio = 1:1,
+% top = 2.07cm,
+% headsep = 5.5mm,
+% heightrounded}
+%\end{verbatim}
+% \end{latexcode}
+%\end{minipage}
+%\hfill
+%\begin{minipage}{.555\textwidth}
+%\begin{tikzpicture}[scale=2.81]
+%\draw (0,0) rectangle (1.40cm,2.10cm);
+%\draw[xshift=2mm,yshift=2.25mm,fill=gray!20,draw=none] (0,0) rectangle (1.00cm,1.65cm);
+%\draw[xshift=1.6cm,yshift=2.25mm,fill=gray!20,draw=none] (0,0) rectangle (1.00cm,1.65cm);
+%\draw[xshift=1.40cm] (0,0) rectangle (1.40cm,2.10cm);
+%\end{tikzpicture}
+%\end{minipage}
+%
+%\begin{table}
+%\centering
+%\begin{tabular}{@{}lccccr@{\,$:$\,}lr@{\,$:$\,}lcr@{\,$:$\,}l@{}}
+%\toprule
+% &
+% \multicolumn{4}{c}{Dimensions (mm)} &
+% \multicolumn{7}{c}{Proportions} \\
+% \cmidrule(lr){2-5}
+% \cmidrule(l){6-12}
+% &
+% \multicolumn{2}{c}{Typeblock} &
+% \multicolumn{2}{c}{Page} &
+% \multicolumn{4}{c}{Margins} &
+% \multicolumn{3}{c}{Stock} \\
+% \cmidrule(lr){2-3}
+% \cmidrule(lr){4-5}
+% \cmidrule(lr){6-9}
+% \cmidrule(l){10-12}
+% Layout & w & h & w & h &
+% \multicolumn{2}{c}{t\,/\,b} &
+% \multicolumn{2}{c}{i\,/\,o} &
+% Typeblock &
+% \multicolumn{2}{c}{Page} \\
+% \cmidrule(r){1-1}
+% \cmidrule(rl){2-3}
+% \cmidrule(lr){4-5}
+% \cmidrule(lr){6-9}
+% \cmidrule(l){10-12}
+% \opt{standard} & 110 & 220 & 210 & 297 & $1$ & $2$ & $1$ & $2$ & 1\,:\,2 & $1$ & $\sqrt{2}$ \\
+% \opt{standardaureo} & 136 & 220 & 210 & 297 & $2$ & $3$ & $2$ & $3$ &
+% 5\,:\,8\makebox[0pt]{\ \textsuperscript{*}} & $1$ & $\sqrt{2}$ \\
+% \opt{compact} & 110 & 165 & 160 & 240 & $2$ & $3$ & $2$ & $3$ & 2\,:\,3 & $2$ & $3$ \\
+% \opt{compactaureo} & 118 & 191 & 160 & 240 & $2$ & $3$ & $2$ & $3$ &
+% 5\,:\,8\makebox[0pt]{\ \textsuperscript{*}} & $2$ & $3$ \\
+% \opt{supercompact} & 100 & 150 & 140 & 210 & $2$ & $3$ & $2$ & $3$ & 2\,:\,3 & $2$ & $3$ \\
+% \opt{supercompactaureo} & 108 & 175 & 140 & 210 & $1$ & $1$ & $1$ & $1$ &
+% 5\,:\,8\makebox[0pt]{\ \textsuperscript{*}} & $2$ & $3$ \\
+% \opt{periodical} & 110 & 165 & 170 & 240 & $2$ & $3$ & $2$ & $3$ & 2\,:\,3 & $1$ & $\sqrt{2}$ \\
+% \opt{periodicalaureo} & 120 & 194 & 170 & 240 & $2$ & $3$ & $2$ & $3$ &
+% 5\,:\,8\makebox[0pt]{\ \textsuperscript{*}} & $1$ & $\sqrt{2}$ \\
+% \opt{pocketa} & 102 & 153 & 135 & 208 & $2$ & $3$ & $1$ & $1$ & 2\,:\,3 & $2$ & $3$ \\
+% \opt{pocketb} & 99 & 165 & 140 & 210 & $2$ & $3$ & $1$ & $1$ & 3\,:\,5 & $2$ & $3$ \\
+% \opt{pocketc} & 90 & 150 & 116 & 193 & $2$ & $3$ & $1$ & $1$ & 3\,:\,5 & $3$ & $5$ \\
+%\bottomrule\\[-2ex]
+%\multicolumn{12}{r}{\footnotesize\textsuperscript{*}5\,:\,8\,$\approx$\,1\,:\,1,618}
+%\end{tabular}\\[-3ex]
+%\caption{The layouts of \sty{suftesi}}\label{tab:layouts}
+%\end{table}
+%
+%\begin{figure}
+% \vspace*{-1cm}
+%\def\sufsetlengths{\sufsetlengthsA}
+%
+%\centerline{\sufpagesetup{0.18}{standard}{11}{22}{21}{29.7}\hspace{3mm}
+%\sufpagesetup{0.18}{standardaureo}{13.6}{22}{21}{29.7}}\vspace{3mm}
+%
+%\centerline{\sufpagesetup{0.18}{periodical}{11}{16.5}{17}{24}\hspace{3mm}
+%\sufpagesetup{0.18}{supercompact}{10}{15}{14}{21}\hspace{3mm}
+%\sufpagesetup{0.18}{compact}{11}{16.5}{16}{24}}\vspace{3mm}
+%
+%\centerline{\sufpagesetup{0.18}{periodicalaureo}{12}{19.4}{17}{24}\hspace{3mm}
+%\def\sufsetlengths{\sufsetlengthsB}%
+%\sufpagesetup{0.18}{supercompactaureo}{10.8}{17.5}{14}{21}\hspace{3mm}
+%\def\sufsetlengths{\sufsetlengthsA}%
+%\sufpagesetup{0.18}{compactaureo}{11.8}{19.1}{16}{24}\hspace{3mm}}\vspace{3mm}
+%
+%\def\sufsetlengths{\sufsetlengthsC}
+%
+%\centerline{\sufpagesetup{0.18}{pocketa}{10.2}{15.3}{13.5}{20.8}\hspace{3mm}
+%\sufpagesetup{0.18}{pocketc}{9}{15}{11.6}{19.3}\hspace{3mm}
+%\sufpagesetup{0.18}{pocketb}{9.9}{16.5}{14}{21}}
+% \caption{The eleven layouts of \sty{suftesi}}\label{fig:layouts}
+%\end{figure}
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Fonts}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
% The default roman font is Cochineal by Michael Sharpe,
-% the sans serif font is Linux Biolinum O, designed by Philipp H. Poll,\index{Poll, Philipp H.} and the typewriter face is Inconsolata by Michael Sharpe. Cochineal is a fork of Crimson, by Sebastina Kosch, a font inspired by masterpieces like Sabon (Jan Tschichold) and Minion (Robert Slimbach). It is a very complete typeface and it offers full support for Greek and Cyrillic, real small caps (even in italic shape) and four figure styles. Moreover it provides support for mathematics through the \sty{newtxmath} package.
-%
-% The \opt{defaultfont} option allows you to can change the default roman font to New PX (Palatino-like), Linux Libertine O, or Latin modern.
-% You can use other fonts as well, but in this case remember to load the \opt{defaultfont=none} option which turns off the default font settings (see section \ref{sec:options} for details).
-%
-% Today there are several Garamond-like fonts in TeX Live distribution. See, for example \textit{Garamond Libre} (Open Type only) and \textit{Cormorant Garamond}. The Bembo-like fonts \textit{Etbb} and \textit{fbb} should also be considered if you appreciate humanist fonts. In any case, before using a font, read the license carefully.
-%
-% Another beautiful Garamond-like font, complete of real small caps, bold weight and mathematical support, is made available by the \sty{garamondx} package by Michael Sharpe, which provides an extension of the \sty{ugm} fonts, (URW)++ GaramondNo8 (see the License note in the package documentation at the web page \url{https://www.ctan.org/pkg/garamondx}. They are not distributed as part of \TeX Live, but they may be downloaded using the \texttt{getnonfreefonts} script. See the instructions for installation at
-% \url{http://tug.org/fonts/getnonfreefonts/}.
-%
-%
-% \subsubsection[Mathematics]{Typesetting mathematics}
-%
-% The class loads by default a ‘minimal’ mathematical support for Cochineal (default), Linux Libertine O or New PX via the \sty{newtxmath} or \sty{newpxmath} packages by Michael Sharpe. Moreover the \opt{mathfont} option is provided to extend or disable the support for mathematics when using these fonts. These non-standard fonts have a very good mathematical support but if you aim at typesetting high mathematics the Latin Modern font family remains, of course, the better choice: \opt{defaultfont=standard}. See section \ref{sec:fonts} for details.
-%
-% If some of the loaded packages conflict or if you simply want to change some of the default font settings you should first reset the font default with \opt{defaultfont=none} option and then load the packages in the right order and with your favorite options.
+% the sans serif font is Linux Biolinum, designed by Philipp H.
+% Poll,\index{Poll, Philipp H.} and the typewriter face is Inconsolata
+% by Michael Sharpe. Cochineal is a fork of Crimson, by Sebastian Kosch,
+% a font inspired by masterpieces like Sabon (Jan Tschichold) and Minion
+% (Robert Slimbach). It is a very complete typeface and it offers full
+% support for Greek and Cyrillic, real small caps (even in italic shape)
+% and four figure styles. Moreover it provides support for mathematics
+% through the \sty{newtxmath} package.
+%
+% The \opt{defaultfont} option allows you to can change the default roman
+% font to New PX (Palatino-like), Linux Libertine, or Latin Modern.
+% You can use other fonts as well, but in this case remember to load the
+% \opt{defaultfont=none} option which turns off the default font settings
+% (see section \ref{sec:options} for details).
+%
+% Today there are several Garamond-like fonts in \TeX~Live distribution.
+% See, for example Garamond Libre and Cormorant Garamond.
+% The Bembo-like fonts ETbb and fbb should also be considered if you
+% appreciate humanist fonts. In any case, before using a font, read the
+% license carefully.
+%
+% Another beautiful Garamond-like font, complete of real small caps,
+% bold weight and mathematical support, is made available by the
+% \sty{garamondx} package by Michael Sharpe, which provides an extension
+% of the \sty{ugm} fonts, (URW)++ GaramondNo8 (see the License note in the
+% package documentation at the web page \url{https://www.ctan.org/pkg/garamondx}).
+% They are not distributed as part of \TeX~Live, but they may be downloaded
+% using the \texttt{getnonfreefonts} script. See the instructions
+% at \url{http://tug.org/fonts/getnonfreefonts/}.
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsubsection[Mathematics]{Typesetting mathematics}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% The class loads by default a ‘minimal’ mathematical support for Cochineal
+% (default), Linux Libertine or New PX via the \sty{newtxmath} or
+% \sty{newpxmath} packages by Michael Sharpe. Moreover the \opt{mathfont}
+% option is provided to extend or disable the support for mathematics when
+% using these fonts. These non-standard fonts have a very good mathematical
+% support but if you aim at typesetting high mathematics the Latin Modern
+% font family remains, of course, the better choice: \opt{defaultfont=standard}.
+% See section \ref{sec:fonts} for details.
+%
+% If some of the loaded packages conflict or if you simply want to change
+% some of the default font settings you should first reset the font default
+% with \opt{defaultfont=none} option and then load the packages in the right
+% order and with your favorite options.
% ^^AFor example, these are the codes loaded for the three non-standard fonts:
% ^^A
% ^^A\paragraph{defaultfont=cochineal}
@@ -557,7 +800,7 @@
% ^^A\usepackage{cochineal}
% ^^A\usepackage{amsthm}
% ^^A\usepackge[cochineal,bigdelims,cmintegrals,vvarbb]{newtxmath}
-% ^^A\usepackge[cal=boondoxo]{mathalfa}
+% ^^A\usepackge[cal=boondoxo]{mathalpha}
% ^^A\useosf
% ^^A\useproportional
% ^^A\end{verbatim}
@@ -573,7 +816,7 @@
% ^^A\usepackage[varqu,varl]{inconsolata}
% ^^A\usepackage{amsthm}
% ^^A\usepackage[bigdelims,vvarbb]{newpxmath}
-% ^^A\usepackage[cal=boondoxo]{mathalfa}
+% ^^A\usepackage[cal=boondoxo]{mathalpha}
% ^^A\useosf
% ^^A\useproportional
% ^^A\end{verbatim}
@@ -588,43 +831,89 @@
% ^^A\usepackage[varqu,varl,scaled=0.94]{inconsolata}
% ^^A\usepackage{amsthm}
% ^^A\usepackage[libertine,bigdelims,vvarbb]{newtxmath}
-% ^^A\usepackage[cal=boondoxo]{mathalfa}
+% ^^A\usepackage[cal=boondoxo]{mathalpha}
% ^^A\useosf
% ^^A\end{verbatim}
% ^^A\end{latexcode}
%
%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsubsection[Greek]{Typesetting Greek}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% The Cochineal default font is complete of Greek and Cyrillic. Anyway
+% the class provides the \opt{greekfont} option (see section \ref{sec:fonts})
+% to select four different Greek fonts for use with the roman typeface
+% set by the \opt{defaultfont} option (except for the \opt{defaultfont=standard}
+% option, i.e. with Latin Modern font family which uses the CB Greek by default).
+% These fonts are: GFS Bodoni, GFS Artemisia, GFS Porson (by the Greek Font Society)
+% and CB Greek (by Claudio Beccari). You may, of course, choose a different font
+% but in this case, as previously cleared, remember to load the
+% \opt{defaultfont=none} option.
+%
+% \begin{mdframed}[backgroundcolor=philA!10,linecolor=white]
+%\greekexample{Cochineal-LF}{Cochineal-LF}{Cochineal/Cochineal}{12.15}
+%\greekexample{Cochineal-LF}{bodoni}{Cochineal/Bodoni}{11.25}
+%\greekexample{Cochineal-LF}{artemisia}{Cochineal/Artemisia}{11.8}
+%\greekexample{Cochineal-LF}{porson}{Cochineal/Porson}{\mygrsize}
+%\greekexample{Cochineal-LF}{lmr}{Cochineal/CB Greek}{\mygrsize}
+%\greekexample{LinuxLibertineT-OsF}{LinuxLibertineT-OsF}{Libertine/Libertine}{\mygrsize}
+%\greekexample{LinuxLibertineT-OsF}{bodoni}{Libertine/Bodoni}{11.2}
+%\greekexample{LinuxLibertineT-OsF}{artemisia}{Libertine/Artemisia}{11.7}
+%\greekexample{LinuxLibertineT-OsF}{porson}{Libertine/Porson}{\mygrsize}
+%\greekexample{LinuxLibertineT-OsF}{lmr}{Libertine/CB Greek}{\mygrsize}
+%\greekexample{zplosf}{bodoni}{New PX/Bodoni}{11.8}
+%\greekexample{zplosf}{artemisia}{New PX/Artemisia}{12.5}
+%\greekexample{zplosf}{porson}{New PX/Porson}{12.9}
+%\greekexample{zplosf}{lmr}{New PX/CB Greek}{12.9}
+%\greekexample{lmr}{cbgreek}{Latin Modern/CB Greek}{\mygrsize}
+% \end{mdframed}
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Cover page}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% Since version 2.6 \sty{suftesi} provides a command to print a simple
+% cover page (figure \ref{fig:cover}), inspired by the Italian designer
+% Bruno \textcite[85-89]{munari:arte-come-mestiere}. The color used for
+% the text and the circle as well as other graphical elements are partially
+% customizable (see section \ref{sec:options} for details). The cover shown
+% in figure \ref{fig:cover} is obtained with the following code:
+% \begin{latexcode}
+%\begin{verbatim}
+%\Cauthor{Bruce Lee}
+%\Ctitle{The Art of Kicking}
+%\Csubtitle{How to survive in the modern societies}
+%\Ceditor{edited by\\ Walker Texas Ranger}
+%\Cfoot{Punch Press\\ \fbox{\bfseries P\&P}}
+%\Cpagecolor{white!90!black}
+%\Ctextcolor{white}
+%\Cfootcolor{black}
+%\makecover[ball color=DarkBlue,draw=none]
+%\end{verbatim}
+% \end{latexcode}
%
+% To produce a complete book cover, with spine and dust jacket, you should
+% take a look at the \sty{bookcover} class by Tibor \textcite{bookcover}.
%
-% \subsubsection[Greek]{Typesetting Greek}
-%
-% The Cochineal default font is complete of Greek and Cyrillic. Anyway the class provides the \opt{greekfont} option (see section \ref{sec:fonts}) to select four different Greek fonts for use with the roman typeface
-% set by the \opt{defaultfont} option (except for the \opt{defaultfont=standard} option, i.e. with Latin Modern font family which uses the CB Greek by default). These fonts are: GFS Bodoni, GFS Artemisia, GFS Porson (by the Greek Font Society) and CB Greek (by Claudio Beccari). You may, of course, choose a different font but in this case, as previously cleared, remember to load the \opt{defaultfont=none} option.
-%
%
-% \greekexample{Cochineal-LF}{Cochineal-LF}{Cochineal/Cochineal}{10}
-% \greekexample{Cochineal-LF}{bodoni}{Cochineal/Bodoni}{10}
-% \greekexample{Cochineal-LF}{artemisia}{Cochineal/Artemisia}{10}
-% \greekexample{Cochineal-LF}{porson}{Cochineal/Porson}{10}
-% \greekexample{Cochineal-LF}{lmr}{Cochineal/CB Greek}{10}
-% \greekexample{LinuxLibertineT-OsF}{LinuxLibertineT-OsF}{Libertine/Libertine}{10}
-% \greekexample{LinuxLibertineT-OsF}{bodoni}{Libertine/Bodoni}{10}
-% \greekexample{LinuxLibertineT-OsF}{artemisia}{Libertine/Artemisia}{10}
-% \greekexample{LinuxLibertineT-OsF}{porson}{Libertine/Porson}{10}
-% \greekexample{LinuxLibertineT-OsF}{lmr}{Libertine/CB Greek}{10}
-% \greekexample{zplosf}{bodoni}{New PX/Bodoni}{10}
-% \greekexample{zplosf}{artemisia}{New PX/Artemisia}{10}
-% \greekexample{zplosf}{porson}{New PX/Porson}{10}
-% \greekexample{zplosf}{lmr}{New PX/CB Greek}{10.5}
-% \greekexample{lmr}{cbgreek}{Latin Modern/CB Greek}{10}
-%
-%
-% \begin{figure}
-% \centering
-% \begin{tikzpicture}
-% \draw[draw=gray,fill=white,drop shadow] (-.5\textwidth,0) rectangle (.5\textwidth,.9\textheight);
-% \draw[line width=.5mm,fill=white,text=black,draw=black!60] (-4.2,17.1) circle (9mm) node {\parbox{12mm}{\centering\tiny * * * \\ St. Anford\\ University\\[1mm] * * * }};
-% \node[anchor=north west] at (-2.5cm,18cm) {%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Frontispiece}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+%\begin{figure}
+%\begin{minipage}{.5\textwidth}
+%\centering
+%\begin{tikzpicture}[scale=0.4]%
+%\draw[draw=gray,fill=white,drop shadow] (-\textwidth,0) rectangle (\textwidth,.9\textheight);
+%\draw[line width=.1pt,draw=black] (-4.2,18.1) circle (13mm) node {\parbox{10mm}{\centering\tiny ---*---\\[-.5mm] St. Anford\\ University\\ ---*--- }};
+% \node[scale=0.4,anchor=north west] at (-2.5cm,19cm) {%
% \parbox{8cm}{%
% \small University of St. Anford\par
% \normalsize Department of Typography
@@ -651,22 +940,21 @@
%
% {\normalsize\sffamily Research supervisors:\par}
% \small J. H. Quick\par
-% B. L. User\vspace{4cm}
+% B. L. User\vspace{3.5cm}
%
% Thesis submitted in 2010
% }
-% };
-%
-% \end{tikzpicture}
-% \caption{The frontispiece of \sty{suftesi}}\label{fig:frontispiece}
-% \end{figure}
-% \begin{figure}
-% \centering
-% \begin{tikzpicture}
-% \draw[draw=gray,fill=gray!5,drop shadow] (-.5\textwidth,0) rectangle (.5\textwidth,.9\textheight);
+% };
+%\end{tikzpicture}
+%\caption{The frontispiece of \sty{suftesi}}\label{fig:frontispiece}
+%\end{minipage}
+%\begin{minipage}{.5\textwidth}
+%\centering
+%\begin{tikzpicture}[scale=0.4]%
+%\draw[draw=gray,fill=gray!5,drop shadow] (-\textwidth,0) rectangle (\textwidth,.9\textheight);
% \node at (0,.65\textheight) (c) {};
% \draw[ball color=DarkBlue,draw=none] (c) circle (4.5cm);
-% \node[anchor=center,text=white] at (c) {\parbox{6cm}{%
+% \node[scale=0.4,anchor=center,text=white] at (c) {\parbox{6cm}{%
% \centering
% {\scriptsize\scshape Bruce Lee\\}
% \vspace*{\baselineskip}
@@ -676,215 +964,228 @@
% {\smallskip\normalsize How to survive in the modern societies\\}
%
% {\vspace*{2\baselineskip}\scriptsize edited by\\ Walker Texas Ranger\\}}};
-% \node[align=center] at (0,1) {\scriptsize \textcolor{black}{Punch Press}\\[1ex]\textcolor{black}{\fbox{§§§§}}\\};
-% \end{tikzpicture}
-% \caption{An example of the cover page of \sty{suftesi}}\label{fig:cover}
-% \end{figure}
-
-%
-% \subsection{The cover page}
-% Since version 2.6 \sty{suftesi} provides a command to print a simple cover page (figure \ref{fig:cover}), inspired by the Italian designer Bruno \textcite[85-89]{munari:arte-come-mestiere}. The color used for the text and the circle as well as other graphical elements are partially customizable (see section \ref{sec:options} for details). The cover shown in figure \ref{fig:cover} is obtained with the following code:
-% \begin{latexcode}
-% \begin{verbatim}
-% \Cauthor{Bruce Lee}
-% \Ctitle{The Art of Kicking}
-% \Csubtitle{How to survive in the modern societies}
-% \Ceditor{edited by\\ Walker Texas Ranger}
-% \Cfoot{Punch Press\\\fbox{\bfseries P\&P}}
-% \Cpagecolor{white!90!black}
-% \Ctextcolor{white}
-% \Cfootcolor{black}
-%
-% \makecover[ball color=DarkBlue,draw=none]
-% \end{verbatim}
-% \end{latexcode}
-%
-% To produce a complete book cover, with spine and dust jacket, you should take a look at the \sty{bookcover} package by Tibor Tómács.
-%
-% \subsection{The frontispiece} \enlargethispage{\baselineskip}
-%
-% The class has an original frontispiece (see figure \ref{fig:frontispiece}) now directly available
-% loading the \sty{frontespizio} package
+% \node[align=center] at (0,2) {\scriptsize \textcolor{black}{Punch Press}\\\textcolor{black}{\bfseries\small P\&P}};
+%\end{tikzpicture}
+%\caption{A cover page of \sty{suftesi}}\label{fig:cover}
+%\end{minipage}
+%\end{figure}
+%
+% The class has an original frontispiece (see figure \ref{fig:frontispiece})
+% now directly available loading the \sty{frontespizio} package
% with the \opt{suftesi} option. It is meant only for Italian users
% \parencite[see][version 1.4 or later]{Gregorio:frontespizio}:
%
% \begin{latexcode}
-% \begin{verbatim}
-% \usepackage[suftesi]{frontespizio}
-% \end{verbatim}
+%\begin{verbatim}
+%\usepackage[suftesi]{frontespizio}
+%\end{verbatim}
% \end{latexcode}
-% Note that this frontispiece requires the use of a logo which could be restricted by some institutions. So before using it you have to be sure that you have the required permissions.
+%
+% Note that this frontispiece requires the use of a logo which could be
+% restricted by some institutions. So before using it you have to be sure
+% that you have the required permissions.
%
-% The \sty{frontespizio} package produces a frontispiece in the standard Computer Modern typeface. If you prefer a consistent font remember to load the needed packages or commands in the \cmd{Preambolo} command:
+% The \sty{frontespizio} package produces a frontispiece in the standard
+% Computer Modern typeface. If you prefer a consistent font remember
+% to load the needed packages or commands in the \cmd{Preambolo} command:
%
% \begin{latexcode}
-% \begin{verbatim}
-% \begin{frontespizio}
-% \Preambolo{\usepackage[osf]{cochineal}}% <===
-% \Universita{Paperopoli}
-% \Dipartimento{Filosofia, Pedagogia e Psicologia}
-% \Corso[Laurea]{Filosofia}
-% \Annoaccademico{2030--2031}
-% \Titolo{La mia tesi:\\ una lunga serie di risultati\\
-% difficilissimi e complicatissimi}
-% \Sottotitolo{Alcune considerazioni mutevoli}
-% \Candidato[vr12301231]{Paolo Rossi}
-% \Relatore{Guido Bianchi}
-% \end{frontespizio}
-% \end{verbatim}
+%\begin{verbatim}
+%\begin{frontespizio}
+% \Preambolo{\usepackage[osf]{cochineal}}% <===
+% ...
+%\end{frontespizio}
+%\end{verbatim}
% \end{latexcode}
%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Appendices}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-%
-% ^^A\subsection{Title page}
-%
-% ^^A The class provides a very simple title page through the \cmd{maketitle} command. A large collection of stylish title pages is provided by the \sty{titlepages} package by Peter Wilson. This package is part of the \sty{memoir} documentation but you can copy the code examples and adapt them to work with \sty{suftesi} with quite simple changes.
-%
-% \subsection{The appendices}
-% Since version 2.9.5 the class relies on \sty{appendix} package to manage the appendices. To get the correct label in titles, headings and table of contents, you should use the \env{appendices} environment.
+% Since version 2.9.5 the class relies on \sty{appendix} package to manage
+% the appendices \parencite[see][]{appendix}. To get the correct label in titles, headings and table of
+% contents, you should use the \env{appendices} environment.
% \begin{latexcode}
-% \begin{verbatim}
-% \renewcommand{\appendixpagename}{Appendices}
-% \renewcommand{\appendixname}{Appendix}
-% \addappheadtotoc
-%
-% \begin{document}
-%...
-% \appendixpage
-%
-% \begin{appendices}
-%
-% \chapter{First appendix}
-% Lorem ipsum
-%
-% \chapter{First appendix}
-% Lorem ipsum
-%
-% \end{appendices}
-% \end{document}
-% \end{verbatim}
+%\begin{verbatim}
+%\renewcommand{\appendixpagename}{Appendices}
+%\renewcommand{\appendixname}{Appendix}
+%\addappheadtotoc
+%
+%\begin{document}
+%...
+%\appendixpage
+%
+%\begin{appendices}
+% \chapter{First appendix}
+% Lorem ipsum
+% \chapter{First appendix}
+% Lorem ipsum
+%\end{appendices}
+%
+%\end{document}
+%\end{verbatim}
% \end{latexcode}
%
%
-% \section{Options}\label{sec:options}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{Options}\label{sec:options}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% \subsection{Layout}\label{sec:page-styles}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Layout}\label{sec:page-styles}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% \begin{optionlist}
-% \optitem[book]{structure}{\opt{book}, \opt{article}, \opt{collection}}
+% \begin{optionlist*}
+% \optitem[book]{structure}{\opt{book}\OR\opt{article}\OR\opt{collection}}
% \changes{v0.9b}{2012/09/23}{New option \opt{structure}}
-% \begin{valuelist}
-% \item[book] For typesetting texts with chapters.
-% \item[article] For typesetting articles or short theses
-% (without chapters).
-% \item[collection] For typesetting journals or collections of articles (see section \ref{sec:collection}).
-% \end{valuelist}
-% \optitem[standard]{pagelayout}{\opt{standard}, \opt{standardaureo}, \opt{periodical}, \opt{periodicalaureo}, \opt{compact}, \opt{compactaureo}, \opt{supercompact}, \opt{supercompactaureo}}
+% \begin{valuelist}
+% \item[book] For typesetting texts with chapters.
+% \item[article] For typesetting articles or short theses
+% (without chapters).
+% \item[collection] For typesetting journals or collections of articles
+% (see section \ref{sec:collection}).
+% \end{valuelist}
+% \optitem[standard]{pagelayout}{\opt{standard}\OR\opt{standardaureo}%
+% \OR\opt{periodical}\OR\opt{periodicalaureo}\OR\opt{compact}\OR
+% \opt{compactaureo}\OR\opt{supercompact}\OR\opt{supercompactaureo}\OR\opt{pocketa}\OR\opt{pocketb}\OR\opt{pocketc}}
% \changes{v0.9b}{2012/09/23}{New option \opt{pagestyle}}
-% \begin{valuelist}
-% \item[standard]
-% Prints an A4 page with a
-% typeblock of $\SI{110}{mm} \times \SI{220}{mm}$.
-% \end{valuelist}
+% \begin{valuelist}
+% \item[standard] Prints an A4 page with a
+% typeblock of $\SI{110}{mm} \times \SI{220}{mm}$.
+% \end{valuelist}
% With the following values the option prints the typeblock
% on a an A4 paper showing the crop marks which can be controlled
% by the \opt{version} option.
-% \begin{valuelist}
-% \item[periodical]
-% Prints a page of $\SI{17}{cm} \times \SI{24}{cm}$ with a typeblock of $\SI{11}{cm} \times \SI{16,5}{cm}$.
-% \item[periodicalaureo] The same of \opt{periodical} but with a
-% \emph{golden ratio} typeblock of $\SI{120}{cm} \times \SI{194}{mm}$.
-% \item[compact]
-% Prints a page of $\SI{16}{cm} \times \SI{24}{cm}$ with a typeblock of $\SI{11}{cm} \times \SI{16,5}{cm}$.
-% \item[compactaureo]
-% The same as \opt{compact} but with
-% a \emph{golden ratio} typeblock of $\SI{11,8}{cm} \times \SI{19,1}{cm}$.% \item[supercompact]
-% Prints a page of $\SI{14}{cm} \times \SI{21}{cm}$ with a typeblock of $\SI{10}{cm} \times \SI{15,5}{cm}$.
-% \item[supercompactaureo]
-% The same as \opt{supercompact} but with
-% a \emph{golden ratio} typeblock of $\SI{10,8}{cm} \times \SI{17,5}{cm}$.
-% \end{valuelist}
+% \begin{valuelist}
+% \item[periodical]
+% Prints a page of $\SI{17}{cm} \times \SI{24}{cm}$ with a typeblock of
+% $\SI{11}{cm} \times \SI{16,5}{cm}$.
+% \item[periodicalaureo] The same of \opt{periodical} but with a
+% \emph{golden ratio} typeblock of $\SI{120}{cm} \times \SI{194}{mm}$.
+% \item[compact]
+% Prints a page of $\SI{16}{cm} \times \SI{24}{cm}$ with a typeblock of
+% $\SI{11}{cm} \times \SI{16,5}{cm}$.
+% \item[compactaureo]
+% The same as \opt{compact} but with
+% a \emph{golden ratio} typeblock of $\SI{11,8}{cm} \times \SI{19,1}{cm}$.
+% \item[supercompact]
+% Prints a page of $\SI{14}{cm} \times \SI{21}{cm}$ with a typeblock of
+% $\SI{10}{cm} \times \SI{15,5}{cm}$.
+% \item[supercompactaureo]
+% The same as \opt{supercompact} but with
+% a \emph{golden ratio} typeblock of $\SI{10,8}{cm} \times \SI{17,5}{cm}$.
+% \end{valuelist}
+% \begin{valuelist}
+% \item[pocketa]
+% Prints a page of $\SI{135}{cm} \times \SI{208}{cm}$ with a typeblock of
+% $\SI{102}{cm} \times \SI{153}{cm}$.
+% \item[pocketb]
+% Prints a page of $\SI{140}{cm} \times \SI{210}{cm}$ with a typeblock of
+% $\SI{99}{cm} \times \SI{165}{cm}$.
+% \item[pocketc]
+% Prints a page of $\SI{116}{cm} \times \SI{193}{cm}$ with a typeblock of
+% $\SI{90}{cm} \times \SI{150}{cm}$.
+% \end{valuelist}
% The details of this option are shown in table \ref{tab:layouts}.
-% \optitem[final]{version}{\opt{screen}, \opt{cscreen}, \opt{draft}, \opt{final}}
-% \begin{valuelist}
-% \item[screen] Prints the \textsc{pdf} with its real dimensions.
-% \item[cscreen] The same as \opt{version=screen} but with a centered typeblock.
-% \end{valuelist}
-% These previous two options are provided to have a better view when you are
-% typesetting and reading the \textsc{pdf} on the screen or for online publications. The following options meant for printed documents.
-% \begin{valuelist}
-% \item[draft]
-% Prints the output on a A4 paper, showing the crop marks. Useless with \opt{standard} and \opt{standardaureo} layouts.
-% \item[final] Prints the output on a A4 paper, hiding the crop marks. Useless with \opt{standard} and \opt{standardaureo} layouts.
-% \end{valuelist}
-% Sometimes it is not desirable to have the crop marks on every page. In such a case you can use the \cmd{crop}|[off]| command after the first page of the document.
-% \end{optionlist}
-%
-% \subsection{Font}\label{sec:fonts}
-%
-% \begin{optionlist}
-% \optitem[10]{fontsize}{10, 10.1, 10.2...,11, 11.1, 11.2...}
-% Sets the main font sizes for the document, changing the \cmd{baselineskip} accordingly. It is based on the \sty{fontsize} package. Remember that using \XeLaTeX{} or \LuaLaTeX{} you can change the default font size also with the option \opt{SizeFeatures} of \sty{fontspec}. For example:
-% \begin{latexcode}
-% \begin{verbatim}
-% \setmainfont[SizeFeatures={Size=11.5}]{Garamond Libre}
-% \end{verbatim}
-% \end{latexcode}
+% \optitem[final]{version}{\opt{screen}\OR\opt{cscreen}\OR\opt{draft}
+% \OR\opt{final}}
+% The following two options are provided to have a better view when
+% you are typesetting and reading the \textsc{pdf} on the screen
+% or for online publications.
+% \begin{valuelist}
+% \item[screen] Prints the PDF with its real dimensions.
+% \item[cscreen] The same as \opt{version=screen} but with a centered
+% typeblock.
+% \end{valuelist}
+% The following two options are meant for printed documents.
+% \begin{valuelist}
+% \item[draft]
+% Prints the output on a A4 paper, showing the crop marks.
+% Useless with \opt{standard} and \opt{standardaureo} layouts.
+% \item[final] Prints the output on a A4 paper, hiding the crop marks.
+% Useless with \opt{standard} and \opt{standardaureo} layouts.
+% \end{valuelist}
+% Sometimes it is not desirable to have the crop marks on every page.
+% In such a case you can use the \cmd{crop}|[off]| command
+% after the first page of the document.
+% \end{optionlist*}
%
-% \end{optionlist}
-% The first three options below are available only with \LaTeX.
-% Using \XeLaTeX{} or \LuaLaTeX{}
-% the default font is the Computer Modern but you can change it through
-% the \sty{fontspec} or \sty{mathspec} (\XeLaTeX{} only) packages. If you do not need to typeset mathematics, with these engines I do suggest the EB Garamond font family by Georg Duffner.
-%
-% \begin{optionlist}
-% \optitem[cochineal]{defaultfont}{\opt{none}, \opt{cochineal}, \opt{libertine}, \opt{palatino}, \opt{standard}}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Font}\label{sec:fonts}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% \begin{optionlist*}
+% \optitem[10\OR 10pt]{fontsize}{\meta{dimen}}
+% Sets the main font sizes for the document, changing the \cmd{baselineskip}
+% accordingly. This option is based on the \sty{fontsize} package \parencite{fontsize}. The \meta{fontsize} can be given in any unit recognized
+% by TeX (for example: \opt{6mm}, \opt{1ex}, \opt{11.5pt}).
+% If the unit is not declared it defaults to \texttt{pt}.
+% If you want to set a specific value for \cmd{baselineskip}
+% you have to use the \cmd{changefontsize}\oarm{baselineskip}\arm{fontsize} command.
+%
+% \optitem[cochineal]{defaultfont}{\opt{none}\OR\opt{cochineal}
+% \OR\opt{libertine}\OR\opt{palatino}\OR\opt{standard}}
% \begin{valuelist}
% \item[none] Does not load any font. Use this option
-% if you want full control over the font selection.
-% \item[cochineal] Loads the Cochineal serif, the Linux Biolinum O sans serif and the Inconsolata typewriter.
-% \item[libertine] Loads the Linux Libertine O serif, the Linux Biolinum O sans serif and the Inconsolata typewriter.
-% \item[palatino] Loads the New PX serif, the Linux Biolinum O sans serif and the Inconsolata typewriter. Note that the New PX font does not provide support for Greek. The \opt{greekfont=artemisa} option offers a very good solution.
+% if you want full control over the font selection. This is the default with
+% \hologo{XeLaTeX} or \hologo{LuaLaTeX}.
+% \item[cochineal] Loads the Cochineal serif, the Linux Biolinum sans serif and the Inconsolata typewriter.
+% \item[libertine] Loads the Linux Libertine serif, the Linux Biolinum sans serif and the Inconsolata typewriter.
+% \item[palatino] Loads the New PX serif, the Linux Biolinum sans serif and the Inconsolata typewriter. Note that the New PX font does not provide support for Greek. The \opt{greekfont=artemisia} option offers a very good solution.
% ^^A and {\fontfamily{artemisia}\selectfont Artemisia} by the {\fontfamily{artemisia}\selectfont Greek Font Society} for the greek text.
% \item[standard] Loads the \sty{lmodern} package: Latin Modern font family and CB Greek.
% \end{valuelist}
-% \optitem[none]{greekfont}{\opt{none}, \opt{artemisia}, \opt{porson}, \opt{bodoni}, \opt{cbgreek}}
+% \optitem[none]{greekfont}{\opt{none}\OR\opt{artemisia}\OR\opt{porson}\OR\opt{bodoni}\OR\opt{cbgreek}}
% Actually useless with \opt{defaultfont=none} and not available with \opt{defaultfont=standard} options.
% \changes{v0.9b}{2012/09/23}{New option \opt{greekfont}}
% \begin{valuelist}
-% \item[none] Does not load any Greek font.
+% \item[none] Does not load any Greek font. This is the default with
+% \hologo{XeLaTeX} or \hologo{LuaLaTeX}.
% \item[artemisia] Loads the Artemisia font by the Greek Font Society.
-% \item[porson] Loads the Porson font by the Greek Font Society.\footnote{The first code for the Porson font (\sty{suftesi} <v.2.4) has been written by Enrico
-% Gregorio. Claudio Beccari successively added the code to improve the
-% scale factor when using this greek font in combination with Palatino.}
+% \item[porson] Loads the Porson font by the Greek Font Society.
% \item[bodoni] Loads the Bodoni font by the Greek Font Society.
% \item[cbgreek] Loads the standard CB~Greek font by Claudio Beccari.
% \end{valuelist}
%
-% \optitem[minimal]{mathfont}{\opt{none},\opt{minimal},\opt{extended}}
+% \optitem[minimal]{mathfont}{\opt{none}\OR\opt{minimal}\OR\opt{extended}}
%
% Available only with Cochineal, Libertine and New PX fonts.
% \begin{valuelist}
-% \item[none] Do not load any mathematical support. Use this option if you need some packages that have to be loaded before \sty{newtxmath} and \sty{newpxmath}.
-% \item[minimal] Loads \sty{newtxmath} (for Cochineal and Linux Libertine O) or \sty{newpxmath} (for PX Fonts).
-% \item[extended] Loads the previous option plus the \sty{amsthm} and \sty{mathalfa} packages.
+% \item[none] Do not load any mathematical support. Use this option if you need some packages that have to be loaded before \sty{newtxmath} and \sty{newpxmath}. This is the default with
+% \hologo{XeLaTeX} or \hologo{LuaLaTeX}.
+% \item[minimal] Loads \sty{newtxmath} (for Cochineal and Linux Libertine) or \sty{newpxmath} (for PX Fonts).
+% \item[extended] Loads the previous option plus the \sty{amsthm} and \sty{mathalpha} packages.
% \end{valuelist}
-% \end{optionlist}
+% \end{optionlist*}
%
-% \begin{optionlist}
-% \optitem[low]{smallcapsstyle}{\opt{low}, \opt{upper}}
+% \begin{optionlist*}
+% \optitem[low]{smallcapsstyle}{\opt{low}\OR\opt{upper}}
% Active only with \opt{\meta{level}font=smallcaps} and \opt{toc\meta{level}font=smallcaps} options (see sections \ref{sec:titles} and \ref{sec:toc}).
-% With \XeLaTeX{} or \LuaLaTeX{} this option is effective only if a font selection command (such as \cmd{setmainfont}) is given.
+% With \hologo{XeLaTeX} or \hologo{LuaLaTeX} this option is effective only if a font selection command (such as \cmd{setmainfont}) is given.
% \begin{valuelist}
% \item[low] Prints lowercase spaced \textsc{\lsstyle small capitals}.
% \item[upper] Prints spaced \textsc{\lsstyle Small Capitals} with uppercase initials.
% \end{valuelist}
-% \end{optionlist}
+% \end{optionlist*}
%
-% \subsection{Titles}\label{sec:titles}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Titles}\label{sec:titles}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% \begin{optionlist}
-% \optitem[roman]{\meta{level}font}{\opt{roman}, \opt{italic},
+% In the following options \meta{level} can be \opt{part}, \opt{chap}, \opt{sec},
+% \opt{subsec}, \opt{subsubsec}.
+% \begin{optionlist*}
+% \optitem[roman]{\meta{level}font}{\opt{roman}\OR\opt{italic}\OR
% \opt{smallcaps}}
% \begin{valuelist}
% \item[roman] Prints the \meta{level} title in roman.
@@ -892,26 +1193,19 @@
% \item[smallcaps] Prints the \meta{level} title
% in \textsc{\lsstyle spaced small caps}
% \end{valuelist}
-% Where \meta{level} can be \opt{part}, \opt{chap}, \opt{sec},
-% \opt{subsec}, \opt{subsubsec}.
-% \optitem[left]{\meta{level}style}{\opt{left}, \opt{center},
-% \opt{right}, \opt{parleft}, \opt{parcenter},
+% \optitem[left]{\meta{level}style}{\opt{left}\OR\opt{center}\OR
+% \opt{right}\OR\opt{parleft}\OR\opt{parcenter}\OR
% \opt{parright}}
% \begin{valuelist}
% \item[left] Aligns the \meta{level} title on the left.
% \item[center] Centers the \meta{level} title.
% \item[right] Aligns the \meta{level} title on the right.
-% \end{valuelist}
-% Where \meta{level} can be \opt{part}, \opt{chap}, \opt{sec}
-% \opt{subsec}, \opt{subsubsec}.
-% \begin{valuelist}
% \item[parleft] As \opt{left} but with the title below the number.
% \item[parcenter] As \opt{center} but with the title below the number.
% \item[parright] As \opt{right} but with the title below the number.
% \end{valuelist}
-% Where \meta{level} can be \opt{part}, \opt{chap}, \opt{sec}.
-% \optitem[Roman/arabic/arabic]{\meta{level}numstyle}{\opt{arabic},
-% \opt{roman}, \opt{Roman}, \opt{dotarabic}, \opt{dotroman},
+% \optitem[Roman/arabic/arabic]{\meta{level}numstyle}{\opt{arabic}\OR
+% \opt{roman}\OR\opt{Roman}\OR\opt{dotarabic}\OR\opt{dotroman}\OR
% \opt{dotRoman}}
% \begin{valuelist}
% \item[arabic] Arabic \meta{level} number.
@@ -921,71 +1215,77 @@
% \item[dotroman] As \opt{roman} but followed by a dot.
% \item[dotRoman] As \opt{Roman} but followed by a dot.
% \end{valuelist}
-% Where \meta{level} can be \opt{part}, \opt{chap}, \opt{sec},
-% \opt{subsec}, \opt{subsubsec}.
-% \end{optionlist}
-%
-%
-% \subsection{Contents lists}\label{sec:toc}
+% \end{optionlist*}
%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Contents lists}\label{sec:toc}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% \begin{optionlist}
-% \optitem[standard]{tocstyle}{\opt{standard}, \opt{dotted},
-% \opt{ragged}, \opt{leftpage}}
+% \begin{optionlist*}
+% \optitem[standard]{tocstyle}{\opt{standard}\OR\opt{dotted}\OR
+% \opt{ragged}\OR\opt{leftpage}}
% \changes{v0.9b}{2012/09/23}{New option \opt{tocstyle}}
-% \begin{valuelist}
-% \item[standard] Prints a standard table of contents with
+% \begin{valuelist}
+% \item[standard] Prints a standard table of contents with
% page numbers on the right margin.
-% \item[dotted] As the previous one but with dotted lines.
-% \item[ragged] Aligns the table of contents on the left
-% as suggested by \textcite{Bringhurst:1992}.
-% \item[leftpage] Prints a table of contents with page numbers
+% \item[dotted] As the previous one but with dotted lines.
+% \item[ragged] Aligns the table of contents on the left
+% as suggested by \textcite{Bringhurst:1992}.
+% \item[leftpage] Prints a table of contents with page numbers
% on the left margin.
-% \end{valuelist}
-% \optitem[sec]{compacttoc}{\opt{sec}, \opt{subsec},
+% \end{valuelist}
+% \optitem[sec]{compacttoc}{\opt{sec}\OR\opt{subsec}\OR
% \opt{subsubsec}}
-% \begin{valuelist}
-% \item[sec] Prints the sections, subsections and sub-subsections in a single paragraph. Note that in this case the option \opt{tocstyle=dotted} in uneffective as the dots are not printed for chapter entries.
-% \item[subsec] Prints the subsections and sub-subsections in a single paragraph.
-% \item[subsubsec] Prints the sub-subsections in a single paragraph.
-% \end{valuelist}
-% \optitem[roman]{toc\meta{level}font}{\opt{roman}, \opt{italic},
+% \begin{valuelist}
+% \item[sec] Prints the sections, subsections and sub-subsections
+% in a single paragraph. Note that in this case the option
+% \opt{tocstyle=dotted} is uneffective as the dots are not printed for chapter entries.
+% \item[subsec] Prints the subsections and sub-subsections in a single paragraph.
+% \item[subsubsec] Prints the sub-subsections in a single paragraph.
+% \end{valuelist}
+% \optitem[roman]{toc\meta{level}font}{\opt{roman}\OR\opt{italic}\OR
% \opt{smallcaps}}
-% \begin{valuelist}
-% \item[roman] Prints the \meta{level} TOC entry in roman.
-% \item[italic] Prints the \meta{level} TOC entry in \emph{italic}.
-% \item[smallcaps] Prints the \meta{level} TOC entry
+% \begin{valuelist}
+% \item[roman] Prints the \meta{level} ToC entry in roman.
+% \item[italic] Prints the \meta{level} ToC entry in \emph{italic}.
+% \item[smallcaps] Prints the \meta{level} ToC entry
% in \textsc{\lsstyle spaced small caps}
-% \end{valuelist}
-% Where \meta{level} can be \opt{chap}, \opt{sec}, \opt{subsec}, \opt{subsubsec}.
-% \optitem[all]{twocolcontents}{\opt{toc}, \opt{lof},
-% \opt{lot}, \opt{toclof}, \opt{toclot}, \opt{loflot}, \opt{all}}
+% \end{valuelist}
+% Where \meta{level} can be \opt{part}, \opt{chap}, \opt{sec}, \opt{subsec}, \opt{subsubsec}.
+% \optitem[all]{twocolcontents}{\opt{toc}\OR\opt{lof}\OR
+% \opt{lot}\OR\opt{toclof}\OR\opt{toclot}\OR\opt{loflot}\OR\opt{all}}
% This option activates the \opt{tocstyle=ragged} option
% and disables the other values of \opt{tocstyle}.
-% \begin{valuelist}
-% \item[toc] Prints the table of contents in two columns.
-% \item[lof] Prints the list of figures in two columns.
-% \item[lot] Prints the list of tables in two columns.
-% \item[toclof] Prints the table of contents
+% \begin{valuelist}
+% \item[toc] Prints the table of contents in two columns.
+% \item[lof] Prints the list of figures in two columns.
+% \item[lot] Prints the list of tables in two columns.
+% \item[toclof] Prints the table of contents
% and the list of figures in two columns.
-% \item[toclot] Prints the table of contents
+% \item[toclot] Prints the table of contents
% and the list of tables in two columns.
-% \item[loflot] Prints the list of figures
+% \item[loflot] Prints the list of figures
% and the list of tables in two columns.
-% \item[all] Prints all the contents lists in two columns.
-% \end{valuelist}
-% \end{optionlist}
+% \item[all] Prints all the contents lists in two columns.
+% \end{valuelist}
+% \end{optionlist*}
%
-% \subsection{Headings}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Headings}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% \begin{optionlist}
-% \optitem[inner]{headerstyle}{\opt{inner}, \opt{center},
-% \opt{plain}, \opt{authortitleinner}, \opt{authortitlecenter}}
+% \begin{optionlist*}
+% \optitem[inner]{headerstyle}{\opt{inner}\OR\opt{center}\OR
+% \opt{plain}\OR\opt{authortitleinner}\OR\opt{authortitlecenter}}
% \begin{valuelist}
% \item[inner] Prints the chapter title and the string ``Chapter~
% \meta{n}'' in the inner side
-% respectively of even and odd
-% headers, and the page number in the outer side.
+% of even and odd
+% headers respectively, and the page number in the outer side.
% \item[center] Centers the header and footer and puts
% the page number in the center of the footer.
% \item[plain] Prints no headers and puts the page number
@@ -998,148 +1298,163 @@
% \item[authortitlecenter]
% As the previous one but with centered headers and footers.
% \end{valuelist}
-% \optitem[roman]{headerfont}{\opt{roman}, \opt{italic},
-% \opt{smallcaps}}
+% \optitem[roman]{headerfont}{\opt{roman}\OR\opt{italic}\OR\opt{smallcaps}}
% \begin{valuelist}
% \item[roman] Prints the headers in roman.
% \item[italic] Prints the headers in \emph{italic}.
% \item[smallcaps] Prints the headers in \textsc{\lsstyle spaced small caps}.
% \end{valuelist}
-% \end{optionlist}
+% \end{optionlist*}
%
-% \subsection{Notes, lists, quotations}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Notes, lists, quotations}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% \begin{optionlist}
-% \optitem[center]{quotestyle}{\opt{center}, \opt{right}}
+% \begin{optionlist*}
+% \optitem[center]{quotestyle}{\opt{center}\OR\opt{right}}
% \changes{v0.9b}{2012/09/23}{New option \opt{quotestyle}}
-% \begin{valuelist}
-% \item[center]
-% Indents the block quotations
-% on both the left and right margins.
-% \item[right]
-% Indents the block quotations
-% only on the left margin.
-% \end{valuelist}
-% \optitem[footnotesize]{quotesize}{\opt{footnotesize}, \opt{small}}
+% \begin{valuelist}
+% \item[center]
+% Indents the block quotations on both the left and right margins.
+% \item[right]
+% Indents the block quotations only on the left margin.
+% \end{valuelist}
+% \optitem[footnotesize]{quotesize}{\opt{footnotesize}\OR\opt{small}}
% \changes{v0.9b}{2012/09/23}{New option \opt{quotationfont}}
-% \begin{valuelist}
-% \item[footnotesize]
-% Prints the block quotations
-% in \cmd{footnotesize} size.
-% \item[small]
-% Prints the block quotations
-% in \cmd{small} size.
-% \end{valuelist}
-% \optitem[bulged]{footnotestyle}{\opt{bulged}, \opt{hung},
-% \opt{dotted}, \opt{superscript}}
+% \begin{valuelist}
+% \item[footnotesize]
+% Prints the block quotations in \cmd{footnotesize} size.
+% \item[small]
+% Prints the block quotations in \cmd{small} size.
+% \end{valuelist}
+% \optitem[bulged]{footnotestyle}{\opt{bulged}\OR\opt{hung}\OR
+% \opt{dotted}\OR\opt{superscript}}
% \changes{v0.9b}{2012/09/23}{Changed \opt{standardfootnote} option
% and renamed to \opt{footnotestyle}}
-% \begin{valuelist}
-% \item[bulged] The footnote number protrudes beyond the left margin.
-% \item[hung]
-% Indents the footnote text, so it will hang
-% under the first line of the text.
-% \item[dotted]
-% The footnote number is aligned to the left margin
-% and followed by a dot.
-% \item[superscript]
-% Prints a superscript footnote number aligned to the left margin.
-% \end{valuelist}
-% \boolitem[false]{fewfootnotes}
+% \begin{valuelist}
+% \item[bulged] The footnote number protrudes beyond the left margin.
+% \item[hung]
+% Indents the footnote text, so it will hang
+% under the first line of the text.
+% \item[dotted]
+% The footnote number is aligned to the left margin
+% and followed by a dot.
+% \item[superscript]
+% Prints a superscript footnote number aligned to the left margin.
+% \end{valuelist}
+% \optitem[false]{fewfootnotes}{\opt{true}\OR\opt{false}}
% \changes{v0.9b}{2012/09/23}{New option \opt{fewfootnotes}}
% Uses symbols instead of numbers to mark footnotes.
% It is active only in documents with
% three footnotes per page maximum.
% The symbol sequence is: *, **, ***.
% With more footnotes you should not need this option.
-% \optitem[bulged]{liststyle}{\opt{bulged}, \opt{aligned}, \opt{indented}}
-% \begin{valuelist}
-% \item[bulged]
-% The item number or symbol protrudes beyond the left margin.
-% \item[aligned]
-% Aligns the lists to the left margin.
-% \item[indented]
+% \optitem[bulged]{liststyle}{\opt{bulged}\OR\opt{aligned}\OR\opt{indented}}
+% \begin{valuelist}
+% \item[bulged]
+% The item number or symbol protrudes beyond the left margin.
+% \item[aligned]
+% Aligns the lists to the left margin.
+% \item[indented]
% Prints standard indented lists.
-% \end{valuelist}
-% \optitem[standard]{captionstyle}{\opt{standard}, \opt{sanserif}, \opt{italic}, \opt{smallcaps}}
+% \end{valuelist}
+% \optitem[standard]{captionstyle}{\opt{standard}\OR\opt{sanserif}\OR\opt{italic}\OR\opt{smallcaps}}
% All these values print the caption in small size, changing the shape:
-% \begin{valuelist}
-% \item[standard] Prints the caption text and label in normal font.
-% \item[sanserif] Prints the caption text and label in \textsf{sanserif}.
-% \item[italic] Prints the caption text and label in \emph{italic}.
-% \item[smallcaps] Prints only the caption label in \textsc{\lsstyle spaced small caps}.
-% \end{valuelist}
-% \end{optionlist}
-%
+% \begin{valuelist}
+% \item[standard]
+% Prints the caption text and label in normal font.
+% \item[sanserif]
+% Prints the caption text and label in \textsf{sanserif}.
+% \item[italic]
+% Prints the caption text and label in \emph{italic}.
+% \item[smallcaps]
+% Prints only the caption label in \textsc{\lsstyle spaced small caps}.
+% \end{valuelist}
+% \end{optionlist*}
%
-% \subsection{Miscellaneous}\label{sec:miscellaneous}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Miscellaneous}\label{sec:miscellaneous}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% \begin{optionlist}
-% \optitem[\cmd{baselineskip}]{parindent}{\opt{1em}, \opt{1cm}, \opt{17pt}, \ldots}
+% \begin{optionlist*}
+% \optitem[\cmd{baselineskip}]{parindent}{\meta{dimen}}
% \changes{v0.9b}{2012/09/23}{New option \opt{parindent}}
-% \begin{valuelist}
-% Sets the indentation of the first line of each paragraph except those following a section title.
-% For backward compatibility you should use \opt{parindet=1em} or \opt{parindet=1.5} in place
-% of \opt{parindet=compact} and \opt{parindet=wide} respectively.
-% \end{valuelist}
-% \boolitem[true]{marginpar}
-% \begin{valuelist}
-% \item[true] Prints the marginal notes.
-% \item[false] Hide the marginal notes.
-% \end{valuelist}
-% \boolitem[false]{partpage}
+% \begin{valuelist}
+% Sets the indentation of the first line of each paragraph except those following a section title. You can use any unit recognized by \TeX{} (for example: \opt{1em}\OR\opt{1cm}\OR\opt{17pt}, \ldots).
+% \end{valuelist}
+% \optitem[true]{marginpar}{\opt{true}\OR\opt{false}}
+% \begin{valuelist}
+% \item[true] Prints the marginal notes.
+% \item[false] Hide the marginal notes.
+% \end{valuelist}
+% \optitem[false]{partpage}{\opt{true}\OR\opt{false}}
% \changes{v0.9b}{2012/09/23}{New option \opt{partpage}}
-% Active only with \opt{structure=article}.
-% \begin{valuelist}
-% \item[true] Prints the part title in a separate page as in
-% \opt{structure=book}
-% \item[false] Prints a part title similar to the one used in the standard \opt{article} class.
-% \end{valuelist}
-% \optitem[false]{draftdate}{\opt{true}, \opt{false}}
+% Active only with \opt{structure=article}. With \opt{book} structure it is ineffective.
+% \begin{valuelist}
+% \item[true] Prints the part title in a separate page as in
+% \opt{structure=book}
+% \item[false] Prints a part title similar to the one used in the standard \opt{article} class.
+% \end{valuelist}
+% \optitem[false]{draftdate}{\opt{true}\OR\opt{false}}
% \changes{v1.0}{2012/10/14}{First stable release. Renamed option \opt{bozza} to \opt{draftdate}}
% If \opt{true} it prints the string ``Version of \meta{date}'' in the footer.
% It requires the \cmd{date}\ar{\meta{date}} command.
-% \end{optionlist}
+% \end{optionlist*}
%
-% \subsection{Pre-defined styles}\label{sec:predefined-styles}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Pre-defined styles}\label{sec:predefined-styles}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% These pre-defined styles are intended as shotrcuts to some groups of
+% These pre-defined styles are intended as shortcuts to some groups of
% class options. Combining them
% with \opt{chapnumstyle} options
% you can get up to 120 variants.
%
-% \begin{optionlist}
-% \optitem[roman1]{style}{\opt{roman(1-6)}, \opt{italic(1-12)},
+% \begin{optionlist*}
+% \optitem[roman1]{style}{\opt{roman(1-6)}\OR\opt{italic(1-12)}\OR
% \opt{smallcaps(1-6)}}
-% \begin{valuelist}
-% \item[roman(1-6)] The titles of chapters and headers are printed
-% in roman. The number of the chapter is on the same line in styles
-% 1-3 and above the title in styles 4-6.
-% The title can be printed on the left (styles 1 and 4),
-% in the center (styles 2 and 5) or on the right (styles 3 and 6).
-% \item[italic(1-12)]
-% The titles of chapters and headers are in \emph{italic}. The section title is in \emph{italic}
-% in styles 1-6 and in \textsc{\lsstyle spaced small caps} in styles 7-12.
-% There are three position for the title and two positions for the number as above.
-% \item[smallcaps(1-12)]
-% The titles of chapters and headers are in \textsc{\lsstyle spaced small caps}.
-% The title of the section is in \emph{italic} in styles 1-6 and in
-% \textsc{\lsstyle spaced small caps} in styles 7-12.
-% There are three position for the title and two positions for the chapter as above.
-% \end{valuelist}
-% \end{optionlist}
-%
-%
-% \section{New commands}\label{sec:commands}
-%
-% \subsection{Printing the cover page}
+% \begin{valuelist}
+% \item[roman(1-6)] The titles of chapters and headers are printed
+% in roman. The number of the chapter is on the same line in styles
+% 1-3 and above the title in styles 4-6.
+% The title can be printed on the left (styles 1 and 4),
+% in the center (styles 2 and 5) or on the right (styles 3 and 6).
+% \item[italic(1-12)]
+% The titles of chapters and headers are in \emph{italic}. The section title is in \emph{italic}
+% in styles 1-6 and in \textsc{\lsstyle spaced small caps} in styles 7-12.
+% There are three position for the title and two positions for the number as above.
+% \item[smallcaps(1-12)]
+% The titles of chapters and headers are in \textsc{\lsstyle spaced small caps}.
+% The title of sections is in \emph{italic} in styles 1-6 and in
+% \textsc{\lsstyle spaced small caps} in styles 7-12.
+% There are three position for the title and two positions for the chapter as above.
+% \end{valuelist}
+% \end{optionlist*}
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{New commands}\label{sec:commands}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Composing the cover page}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
% \begin{ltxsyntax}
% \cmditem{makecover}
% \cmditem{makecover}[tikz options]
%
% Prints the cover page (figure \ref{fig:cover}). This command requires \sty{tikz}
-% and the optional arguments accepts the same options of the \cmd{draw}
+% and the optional argument accepts the same options of the \cmd{draw}
% command of that package (see the examples below). Commands available:
%
% \cmditem{Cauthor}{text}
@@ -1178,68 +1493,69 @@
%
% \end{ltxsyntax}
%
-% \subsubsection*{Some examples of cover pages}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsubsection*{Some examples of cover pages}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
% First you have to declare the informations you want to put in the cover page. It is better to give these informations in the preamble:
%
% \begin{latexcode}
-% \begin{verbatim}
-% \usepackage{tikz}
-%
-% \Cauthor{Bruce Lee}
-% \Ctitle{The Art of Kicking}
-% \Csubtitle{How to survive in the modern societies}
-% \Ceditor{edited by\\ Walker Texas Ranger}
-% \Cfoot{Punch Press\\\includegraphics[width=1cm]{logo}}
-% \end{verbatim}
+%\begin{verbatim}
+%\usepackage{tikz}
+%
+%\Cauthor{Bruce Lee}
+%\Ctitle{The Art of Kicking}
+%\Csubtitle{How to survive in the modern societies}
+%\Ceditor{edited by\\ Walker Texas Ranger}
+%\Cfoot{Punch Press\\ \includegraphics[width=1cm]{logo}}
+%\end{verbatim}
% \end{latexcode}
%
% Then you can print the cover page with:
-%
% \begin{ttquote}
-% \cmd{makecover}\phantom{\oar{\meta{tikz options}}}
+% \cmd{makecover}
% \end{ttquote}
%
-% or
-%
-% \begin{ttquote}
-% \cmd{makecover}\oar{\meta{tikz options}}
-% \end{ttquote}
-
% You can customize the circle using the optional arguments of the \cmd{makecover} command. Some of these \meta{tikz options} require special \sty{tikz} libraries. For example, you can add a shadow to the circle loading the \texttt{shadows} library and using the \texttt{circular drop shadow} otpion:
%
% \begin{latexcode}
-% \begin{verbatim}
-% \usepackage{tikz}
-% \usetikzlibrary{shadows}
+%\begin{verbatim}
+%\usepackage{tikz}
+%\usetikzlibrary{shadows}
%...
-% \begin{document}
-% \makecover[circular drop shadow]
-% \end{document}
-% \end{verbatim}
+%\begin{document}
+%\makecover[circular drop shadow]
+%\end{document}
+%\end{verbatim}
% \end{latexcode}
%
% There are thousands of possibilities. Here is another (not necessarily good) example:
% \begin{latexcode}
-% \begin{verbatim}
-% \usepackage{tikz}
+%\begin{verbatim}
+%\usepackage{tikz}
%
-% \Cpagecolor{gray!30}
-% \Ctextcolor{blue!50}
-% \Cfootcolor{black}
+%\Cpagecolor{gray!30}
+%\Ctextcolor{blue!50}
+%\Cfootcolor{black}
%
-% \begin{document}
-% \makecover[fill=blue!30!black,draw=teal,line width=2mm,dashed]
-% \end{document}
-% \end{verbatim}
+%\begin{document}
+%\makecover[fill=blue!30!black,draw=teal,line width=2mm,dashed]
+%\end{document}
+%\end{verbatim}
% \end{latexcode}
%
%
-% \subsection{Printing the colophon}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Printing the colophon}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
% \begin{ltxsyntax}
%
-% \cmditem{colophon}[OS]{name and surname}{additional info}
+% \cmditem{colophon}[OS]{name and surname}{additional infos}
%
% This command is provided only for Italian documents. It prints a page with
% a copyright notice and the colophon in the bottom of the page. For different languages
@@ -1247,19 +1563,21 @@
%
% If you don't need the copyright notice, leave the second argument of
% the command empty:
+%
% \begin{ttquote}
-% \cmd{colophon\oarm{OS}\ar{}\arm{additional info}}
+% \cmd{colophon\oarm{OS}\ar{}\arm{additional infos}}
% \end{ttquote}
+%
% With the \opt{article} document structure, you can use the \cmd{artcolophon} command
% (see below)
% as well as the \cmd{thanks} command:
%
% \begin{latexcode}
-% \begin{verbatim}
-% \author{Name Surname
-% \thanks{This work has been typeset with \LaTeX, using the
-% \textsf{suftesi} class by Ivan Valbusa}.}
-% \end{verbatim}
+%\begin{verbatim}
+%\author{Name Surname
+% \thanks{This work has been typeset with \LaTeX, using the
+% \textsf{suftesi} class by Ivan Valbusa}.}
+%\end{verbatim}
% \end{latexcode}
%
% \cmditem{bookcolophon}{copyright notice}{attribution notice and
@@ -1271,14 +1589,14 @@
% The second one prints its content at the bottom. For example:
%
% \begin{latexcode}
-% \begin{verbatim}
-% \bookcolophon{%
-% Copyright © 2007 by Ivan Valbusa}{%
-% This work has been typeset with \LaTeX, using the \textsf{suftesi}
-% class by Ivan Valbusa\index{Valbusa, Ivan}. The serif font is
-% Cochineal by Michael Sharpe and the sans serif font is Linux
-% Biolinum O by Philipp H. Poll.}
-% \end{verbatim}
+%\begin{verbatim}
+%\bookcolophon{%
+% Copyright © 2007 by Ivan Valbusa}{%
+% This work has been typeset with \LaTeX, using the \textsf{suftesi}
+% class by Ivan Valbusa\index{Valbusa, Ivan}. The serif font is
+% Cochineal by Michael Sharpe and the sans serif font is Linux
+% Biolinum by Philipp H. Poll.}
+%\end{verbatim}
% \end{latexcode}
%
% \cmditem{artcolophon}{copyright notice, attribution and other informations}
@@ -1289,21 +1607,21 @@
% Here is an example:
%
% \begin{latexcode}
-% \begin{verbatim}
-% \artcolophon{%
-% This work is licensed under the Creative Commons
-% Attribution-NonCommercial-NoDerivs 3.0 Unported
-% License. To view a copy of this license, visit
-% \begin{center}
-% http://creativecommons.org/licenses/by-nc-nd/3.0
-% \end{center}
-% or send a letter to Creative Commons, 444
-% Castro Street, Suite 900, Mountain View,
-% California, 94041, USA.\\[1ex]
-%
-% Typeset with \LaTeX, using the \textsf{suftesi}
-% class by Ivan Valbusa.}
-% \end{verbatim}
+%\begin{verbatim}
+%\artcolophon{%
+% This work is licensed under the Creative Commons
+% Attribution-NonCommercial-NoDerivs 3.0 Unported
+% License. To view a copy of this license, visit
+% \begin{center}
+% http://creativecommons.org/licenses/by-nc-nd/3.0
+% \end{center}
+% or send a letter to Creative Commons, 444
+% Castro Street, Suite 900, Mountain View,
+% California, 94041, USA.\\[1ex]
+%
+% Typeset with \LaTeX, using the \textsf{suftesi}
+% class by Ivan Valbusa.}
+%\end{verbatim}
% \end{latexcode}
%
% \cmditem{finalcolophon}{colophon content}
@@ -1314,101 +1632,115 @@
%
% \end{ltxsyntax}
%
-% \subsection[Breaking titles]{Breaking titles in header and table of contents}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection[Breaking titles]{Breaking titles in header and table of contents}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
% \begin{ltxsyntax}
-% \cmditem{headbreak}
+% \cmditem{breakintoc}
%
% A manual break which is active for the table of contents but not in the text or in the headers.
%
% \begin{latexcode}
-% \begin{verbatim}
-% \section{This title will be break here \headbreak{}
-% inside the table of contents}
-% \end{verbatim}
+%\begin{verbatim}
+%\section{This title will be break here \breakintoc inside the contents}
+%\end{verbatim}
% \end{latexcode}
-% \cmditem{xheadbreak}
+% \cmditem{breakinbody}
+% \cmditem{breakinbodyleft}
%
-% A manual break which is active in the text but not in the headers and in the table of contents.
+% Manual breaks which are active in the body text but not in the headers
+% and in the table of contents. The difference between the two
+% commands is that the former executes |\\| while the latter uses \cmd{newline}. The second one should be used with the \opt{\meta{level}style=left} options to avoid bad line alignments.
%
% \begin{latexcode}
-% \begin{verbatim}
-% \section{This title will be break here \xheadbreak{}
-% inside the text}
-% \end{verbatim}
+%\begin{verbatim}
+%\section{This title will be break here \breakinbody inside the body text}
+%\section{This title will be break here \breakinbodyleft inside the body text}
+%\end{verbatim}
% \end{latexcode}
% \end{ltxsyntax}
%
% \changes{v0.5}{2011/10/21}{New command \opt{chapnumfont}}
-% \subsection{Customizing titles}\label{sec:secfont}
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Customizing titles}\label{sec:secfont}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
% \changes{v2.9.3}{2020/001/29}{New commands to change the font of the section titles and numbers.}
%
% The commands in this section are experimental. They provide a fast way to customize the format of section titles and numbers. Note that in some cases you will have to manually adjust the spacing accordingly, using \cmd{titlespacing}, \cmd{hskip}/\cmd{hspace}, \cmd{vskip}/\cmd{vspace}, and so on.
%
% \begin{ltxsyntax}
-% \cmditem*{\meta{level}font}{definition}\hfill(default=\texttt{empty})
+% \cmditem*{\meta{level}font}{definition}
+% \cmditem*{toc\meta{level}font}{definition}
%
-% Changes the font of the \meta{level} title. Where \meta{level} can be \opt{part}, \opt{chap}, \opt{sec}, \opt{subsec}, \opt{subsubsec}. For example, to change the size of the chapter title according to the \opt{chapfont=smallcaps} option you should use:
+% Changes the font of the \meta{level} title, where \meta{level} can be \opt{part},
+% \opt{chap}, \opt{sec}, \opt{subsec}, \opt{subsubsec}.
+% The second command changes the ToC entry.
%
-% \begin{latexcode}
-% \begin{verbatim}
-% \chapfont{\fontsize{13}{17}\scshape\lsstyle\expandafter\MakeLowercase}
-% \end{verbatim}
-% \end{latexcode}
-% \cmditem*{\meta{level}numfont}{definition}\hfill(default=\texttt{empty})
+% \cmditem*{\meta{level}numfont}{definition}
+% \cmditem*{toc\meta{level}numfont}{definition}
%
-% Changes the font of the \meta{level} number. Where \meta{level} can be \opt{part}, \opt{chap}, \opt{sec}, \opt{subsec}, \opt{subsubsec}. For example:
+% Changes the font of the \meta{level} number, where \meta{level} can be \opt{part},
+% \opt{chap}, \opt{sec}, \opt{subsec}, \opt{subsubsec}.
+% The second command changes the ToC entry.
%
+% For example, if you used the \opt{chapfont=smallcaps} option, you can change the size of the chapter title accordingly with:
% \begin{latexcode}
-% \begin{verbatim}
-% \chapnumfont{\bfseries\fontsize{160}{50}\selectfont
-% \color{gray}\arabic{chapter}\hskip-15cm}
-% \end{verbatim}
+%\begin{verbatim}
+%\chapfont{\fontsize{13}{17}\scshape\lsstyle\expandafter\MakeLowercase}
+%\end{verbatim}
% \end{latexcode}
+%
% Combining these commands you can get something like this (or something worse/better):
% \begin{latexcode}
-% \begin{verbatim}
-% \documentclass[pagelayout=periodicalaureo,11pt,
-% version=cscreen,chapstyle=parright]{suftesi}
+%\begin{verbatim}
+%\documentclass[pagelayout=periodical\partnameaureo,11pt,
+%version=cscreen,chapstyle=parright]{suftesi}
%
-% \usepackage{xcolor,lipsum}
+%\usepackage{xcolor,lipsum}
%
-% \chapfont{\bfseries\sffamily\scshape\LARGE}
-% \secfont{\sffamily\fontsize{14.5}{15.5}\selectfont}
+%\chapfont{\bfseries\sffamily\scshape\LARGE}
+%\secfont{\sffamily\fontsize{14.5}{15.5}\selectfont}
%
-% \chapnumfont{\hskip1cm\hbox{\bfseries\fontsize{100}{100}\selectfont%
-% \color{gray}\arabic{chapter}}\hskip-1cm}
-% \secnumfont{\bfseries---\,\arabic{chapter}.\arabic{section}}
+%\chapnumfont{\hskip1cm\hbox{\bfseries\fontsize{100}{100}\selectfont%
+%\color{gray}\arabic{chapter}}\hskip-1cm}
+%\secnumfont{\bfseries---\,\arabic{chapter}.\arabic{section}}
%
-% \begin{document}
+%\begin{document}
%
-% \chapter{Lorem ipsum dolor sit amet, consectetuer adipiscing elit}
+%\chapter{Lorem ipsum dolor sit amet, consectetuer adipiscing elit}
%
-% \section{Dolor sit amet}
-% \lipsum[1-2]
+%\section{Dolor sit amet}
+%\lipsum[1-2]
%
-% \section{Lorem ipsum dolor sit amet}
-% \subsection{Dolor sit amet}
-% \lipsum[1]
+%\section{Lorem ipsum dolor sit amet}
+%\subsection{Dolor sit amet}
+%\lipsum[1]
%
-% \end{document}
-% \end{verbatim}
+%\end{document}
+%\end{verbatim}
% \end{latexcode}
% \end{ltxsyntax}
%
-% \subsection{Miscellaneous}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Miscellaneous}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
% \begin{ltxsyntax}
% \cmditem{xfootnote}[symbol]{footnote text}
% \changes{v0.9b}{2012/09/23}{New command \cmd{xfootnote}}
%
% A command to print a footnote with a discretionary
-% symbols given in the optional argument (default=*).
+% symbols given in the optional argument (default:\texttt{*}).
% It does not increment the footnote counter.
-% \begin{ttquote}
-% \cmd{xfootnote}\oar{\em\textdollar\cmd{dagger}\textdollar}\arm{Footnote text}\\
-% \cmd{xfootnote}\oar{\em\cmd{textdagger}}\arm{Footnote text}
-% \end{ttquote}
%
% \cmditem{title}[short title for headers]{complete title for titlepage}
% \changes{v0.8}{2012/03/19}{Renewed \cmd{title} command}
@@ -1422,17 +1754,9 @@
% \cmditem{toclabelwidth}{level}{dim}
% \changes{v0.9a}{2012/08/31}{New command \cmd{toclabelspace}}
%
-% Adds the \meta{dim} to the \meta{level} label in the table of contents, where \meta{level} can be \opt{part}, \opt{chap}, \opt{sec}, \opt{subsec}, \opt{subsubsec}, \opt{par}, \opt{subpar}, \opt{fig}, \opt{tab}. For example, when using \opt{chapnumstyle=Roman} you would probably need to adjust the width of the chapter label with:
-%
-% \begin{latexcode}
-% \begin{verbatim}
-% \toclabelwidth{chap}{1em}
-% \end{verbatim}
-% \end{latexcode}
+% Adds the \meta{dim} to the \meta{level} label in the table of contents, where \meta{level} can be \opt{part}, \opt{chap}, \opt{sec}, \opt{subsec}, \opt{subsubsec}, \opt{par}, \opt{subpar}, \opt{fig}, \opt{tab}. For example, when using \opt{chapnumstyle=Roman} you would probably need to adjust the width of the chapter label with |\toclabelwidth{chap}{1em}|.
% \end{ltxsyntax}
%
-%
-%
% \begin{ltxsyntax}
%
% \cmditem{chapterintro}
@@ -1440,83 +1764,103 @@
% Prints an unnumbered introduction at the beginning of the chapter,
% with the correct hyperlink. In order to use this command the \sty{hyperref} package must be loaded.
%
-% \cmditem{chapterintroname}{name}\hfill(default=\texttt{Introduzione})
+% \cmditem{chapterintroname}{name}\hfill default: \texttt{Introduzione}
%
% Changes in \meta{name} the title printed by the \cmd{chapterintro} command.
%
% \cmditem{appendixpage}
%
-% Prints a page with the title provided by \cmd{appendixpagename} (default=\texttt{Appendici}) at the center according to the \opt{partfont} option. You can redefine the command by (see the \sty{appendix} package documentation for details):
-% \begin{latexcode}
-% \begin{verbatim}
-% \renewcommand{\appendixpagename}{Appendices}
-% \end{verbatim}
-% \end{latexcode}%
-% ^^A \cmditem{appendicesname}{name}\hfill(default=\texttt{Appendici})
-% ^^A
-% ^^A Changes in \meta{name} the title printed by the \cmd{appendixpage} command.
+% Prints a page with the title provided by \cmd{appendixpagename} (default:\texttt{Appendices}) at the center according to the \opt{partfont} option.
+% To redefine the \cmd{appendixpagename} command see the \sty{appendix} package documentation.
%
-% \end{ltxsyntax}
+% \cmditem*{tocpartname}{definition}\hfill default: \cmd{partname}
%
+% Changes the definition of ``Part'' name in ToC. For example:
+% \begin{latexcode}
+%\begin{verbatim}
+%\tocpartname{\begingroup\sffamily\Huge Part\endgroup}
+%\end{verbatim}
+% \end{latexcode}
+% To change the definition of \cmd{partname} you have to use the commands provided
+% by the \sty{babel} package. For example, if the document is in Italian you will
+% need something like this:
+% \begin{latexcode}
+%\begin{verbatim}
+%\addto{\captionsitalian}{%
+% \renewcommand{\partname}{\begingroup\sffamily\Huge Parte\endgroup}
+%\end{verbatim}
+% \end{latexcode}
+% Note that in both cases the definition must be enclosed in a group
+% to prevent it from changing what follows (i.e. the part number and the part title).
+% \end{ltxsyntax}
%
-% \section{Collections}\label{sec:collection}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{The \opt{collection} structure}\label{sec:collection}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
% The \opt{collection} document structure is thought to create a collection of papers. Each paper has to be typeset in a separate \file{.tex} file inside the \env{article} environment:
%
% \begin{latexcode}
-% \begin{verbatim}
-% \begin{article}
-% \author{Author}
-% \title{Title of the paper}
-% % The abstract is optional.
-% % \begin{abstract}
-% % The abstract
-% % \end{abstract}
-%
-% \maketitle
-%
-% Text of the paper
-% \end{article}
-% \end{verbatim}
+%\begin{verbatim}
+%\begin{article}
+%\author{Author}
+%\title{Title of the paper}
+% % The abstract is optional.
+% % \begin{abstract}
+% % The abstract
+% % \end{abstract}
+%
+%\maketitle
+%
+% Text of the paper
+%\end{article}
+%\end{verbatim}
% \end{latexcode}
% If the names of the papers are \file{article1.tex}, \file{article2.tex}, \file{article3.tex}, etc., then a minimal main file should be similar to this:
%
% \begin{latexcode}
-% \begin{verbatim}
-% \documentclass[structure=collection]{suftesi}
-%
-% \begin{document}
-% \input{article1}
-% \input{article2}
-% \input{article3}
-% \end{document}
-% \end{verbatim}
+%\begin{verbatim}
+%\documentclass[structure=collection]{suftesi}
+%
+%\begin{document}
+% \input{article1}
+% \input{article2}
+% \input{article3}
+%\end{document}
+%\end{verbatim}
% \end{latexcode}
%
-% \subsection{Options}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Options}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% In addition to the following options you can use the other options of the class too. In particular, with the \opt{chapstyle} and \opt{chapfont} options you can customize all the section titles which are treated as a normal unnumbered chapters in the \opt{book} document structure, such as ``Table of Contents'', ``Index'', ``Bibliography'', etc.
+% In addition to the following options you can use the other options of the class too. In particular, with the \opt{chapstyle} and \opt{chapfont} options you can customize all the section titles which are treated as a normal unnumbered chapters in the \opt{book} document structure, such as \emph{Table of Contents}, \emph{Index}, \emph{Bibliography}, etc.
%
-% \begin{optionlist}
-% \optitem[left]{papertitlestyle}{\opt{left}, \opt{center}, \opt{right}}
+% \begin{optionlist*}
+%\addtolength{\linewidth}{-2em}
+% \optitem[left]{papertitlestyle}{\opt{left}\OR\opt{center}\OR\opt{right}}
% \begin{valuelist}
% \item[left] Aligns the author-title block on the left.
% \item[center] Centers the author-title block.
% \item[right] Aligns the author-title block on the right.
% \end{valuelist}
-% \optitem[false]{revauthortitle}{\opt{true}, \opt{false}}
+% \optitem[false]{revauthortitle}{\opt{true}\OR\opt{false}}
% \begin{valuelist}
% \item[true] Prints the author’s name below the title.
% \item[false] Prints the author’s name above the title.
% \end{valuelist}
-% \optitem[italic]{titlefont}{\opt{roman}, \opt{italic}, \opt{smallcaps}}
+% \optitem[italic]{titlefont}{\opt{roman}\OR\opt{italic}\OR\opt{smallcaps}}
% \begin{valuelist}
% \item[roman] Prints the title of the articles in roman.
% \item[italic] Prints the title of the articles in \emph{italic}.
% \item[smallcaps] Prints the title of the articles
% in \textsc{\lsstyle spaced small caps}.
% \end{valuelist}
-% \optitem[roman]{authorfont}{\opt{roman}, \opt{italic}, \opt{smallcaps}}
+% \optitem[roman]{authorfont}{\opt{roman}\OR\opt{italic}\OR\opt{smallcaps}}
% \begin{valuelist}
% \item[roman] Prints the author's name in roman.
% \item[italic] Prints the author's name in \emph{italic}.
@@ -1526,28 +1870,33 @@
% to protect the \cmd{thanks} command:
%
% \begin{latexcode}
-% \begin{verbatim}
-% \author{The Author\protect\thanks{...}}
-% \end{verbatim}
+%\begin{verbatim}
+%\author{The Author\protect\thanks{...}}
+%\end{verbatim}
% \end{latexcode}
-% \end{valuelist}
-% \optitem[italic]{toctitlefont}{\opt{roman}, \opt{italic}, \opt{smallcaps}}
+% \end{valuelist}
+% \optitem[italic]{toctitlefont}{\opt{roman}\OR\opt{italic}\OR\opt{smallcaps}}
% \begin{valuelist}
-% \item[roman] Prints the title TOC entry in roman.
-% \item[italic] Prints the title TOC entry in \emph{italic}.
-% \item[smallcaps] Prints the title TOC entry
+% \item[roman] Prints the title ToC entry in roman.
+% \item[italic] Prints the title ToC entry in \emph{italic}.
+% \item[smallcaps] Prints the title ToC entry
% in \textsc{\lsstyle spaced small caps}.
% \end{valuelist}
-% \optitem[roman]{tocauthorfont}{\opt{roman}, \opt{italic}, \opt{smallcaps}}
+% \optitem[roman]{tocauthorfont}{\opt{roman}\OR\opt{italic}\OR\opt{smallcaps}}
% \begin{valuelist}
-% \item[roman] Prints the author’s name TOC entry in roman.
-% \item[italic] Prints the author’s name TOC entry in \emph{italic}.
-% \item[smallcaps] Prints the author’s name TOC entry
+% \item[roman] Prints the author’s name ToC entry in roman.
+% \item[italic] Prints the author’s name ToC entry in \emph{italic}.
+% \item[smallcaps] Prints the author’s name ToC entry
% in \textsc{\lsstyle spaced small caps}.
-% \end{valuelist}
-% \end{optionlist}
+% \end{valuelist}
+% \end{optionlist*}
+%
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \subsection{Commands}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% \subsection{Commands}
% \begin{ltxsyntax}
%
% \cmditem{frontispiece}
@@ -1564,255 +1913,81 @@
%
% Sets the editor(s) of the collection.
%
-% \cmditem{titlefont}{definition}\hfill(default=\texttt{empty})
+% \cmditem{titlefont}{definition}
%
% \changes{v2.9.4}{2020/001/29}{New commands to change the font of the title of the articles and of the author's name in the collections}
%
-% \cmditem{authorfont}{definition}\hfill(default=\texttt{empty})
+% \cmditem{authorfont}{definition}
%
% Changes the font of the title of the articles and of the author's name. For example:
%
% \begin{latexcode}
-% \begin{verbatim}
-% \titlefont{\bfseries\sffamily\scshape}
-% \authorfont{\itshape\sffamily}
-% \end{verbatim}
+%\begin{verbatim}
+%\titlefont{\bfseries\sffamily\scshape}
+%\authorfont{\itshape\sffamily}
+%\end{verbatim}
% \end{latexcode}
% \end{ltxsyntax}
%
-% \section{Known issues}
-%
-% A problem occurs with the article document structure. The \cmd{part} command resets the headers so if it is the first sectioning command of the page you will get no headers in that page. In this case you have to add the header manually with something like this:
-% \begin{latexcode}
-% \begin{verbatim}
-% \markboth{Section title}{Section title}
-% \part{The title of the part}
-% %
-% \section{Section title}
-% \end{verbatim}
-% \end{latexcode}
-% If the title of the part is at the beginning of the page you will need the \sty{afterpage} package and the \cmd{afterapge} command:
-% \begin{latexcode}
-% \begin{verbatim}
-% \afterpage{
-% \markboth{Section title}{Section title}
-% \part{The title of the part}
-% }
-% %
-% \section{Section title}
-% \end{verbatim}
-% \end{latexcode}
-%
-%
-%
-% \section{Backward compatibility}
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{Backward compatibility}
+% ^^A
+% ^^A ----------------------------------------------------------------
%
-% \begin{optionlist}
-% \optitem{defaultfont}{\opt{compatibility}}
-% Loads the fonts of \sty{suftesi} v2.3 (and previous): Palatino (\sty{mathpazo}), Iwona, Bera Mono. To get the default Greek font of those versions (i.e. Artemisia) add the \opt{greekfont=artemisia} option.
-% \optitem[book]{documentstructure}{\opt{book}, \opt{article}, \opt{collection}}
+% \begin{optionlist*}
+%\addtolength{\linewidth}{-2em}
+% \optitem[book]{documentstructure}{\opt{book}\OR\opt{article}
+% \OR\opt{collection}}
% An alias for \opt{structure}
-% \boolitem[true]{crop}
-% \begin{valuelist}
-% \item[true] An alias for \opt{version=draft} option.
-% \item[false] An alias for \opt{version=center} option.
-% \end{valuelist}
-%
-%
-% \optitem{style}{\opt{FSPLa}, \opt{FSPLb}, \opt{FSPLc}}
-% \end{optionlist}
-% These styles are only meant to typeset a doctoral thesis respecting the features required by the Joint Project \emph{Formal Style for PhD Theses with LaTeX} of the Verona University (Italy).
-%
-%
+%\end{optionlist*}
+%\begin{optionlist*}
+%\addtolength{\linewidth}{-2em}
+% \optitem{defaultfont}{\opt{compatibility}}
+% Loads the fonts of \sty{suftesi} v2.3 (and previous): Palatino (\sty{mathpazo}), Iwona, Bera Mono. To get the default Greek font of those versions (GFS Artemisia) add the \opt{greekfont=artemisia} option.
+% \optitem[true]{crop}{\opt{true}\OR\opt{false}}
+% An alias for the old options \opt{version=draft} and \opt{version=center} respectively.
+% \optitem{parindent}{\opt{1em}, \opt{1.5em}}
+% An alias for the old options \opt{parindent=compact} and \opt{parindent=wide} respectively.
+% \optitem{style}{\opt{FSPLa}\OR\opt{FSPLb}\OR\opt{FSPLc}}
+% These styles are only meant to typeset a doctoral thesis respecting the features required by the Joint Project \emph{Formal Style for PhD Theses with \hologo{LaTeX}} of the Verona University (Italy).
+%\end{optionlist*}
%
% \changes{v1.3}{2013/03/05}{New command \cmd{FSPLcolophon}}
-% \noindent The \cmd{FSPLcolophon}\ar{\meta{Name Surname}} command is provided to typeset the colophon according to these styles:
-% \medskip
-%
-% \noindent\rule{\textwidth}{.4pt}
-%
-% \noindent\textcircled{\raisebox{1pt}{\scalebox{.7}{cc}}} \the\year{} \meta{Name Surname}%
-% \vskip1ex
-%
-%
-% \small\noindent This work is licensed under the Creative Commons
-% Attribution-NonCommercial-NoDerivs 3.0 Unported License.
-%
-% \noindent To view a copy of this license,
-% visit http://creativecommons.org/licenses/by-nc-nd/3.0/.
-%
-% \footnotesize
-%
-% \bigskip
-%
-% \noindent Typeset with \LaTeX{} in collaboration with the Joint Project
-% \emph{Formal Style for PhD Theses with \LaTeX{}} (University of Verona,
-% Italy) using the \textsf{suftesi} class by Ivan Valbusa. The text face
-% is Palatino, designed by Hermann Zapf. The sans serif font is Iwona by Janus M. Nowacki.
-%
-%
-% \noindent\rule{\textwidth}{.4pt}
-%
-% ^^A\section*{Obsolete options}
-%
-% ^^A \begin{multicols}{2}
-% ^^A \begin{ltxsyntax}
-% ^^A \setlength{\parskip}{.5ex}
-% ^^A \setlength{\itemindent}{1.5cm}
-% ^^A \setlength{\labelwidth}{2.5cm}
-% ^^A \optitem{defaultparindent}
-% \changes{v0.9a}{2012/08/31}{New option \opt{defaultparindent}}
-% ^^A $\rightarrow$ \opt{parindent=compact}
-% ^^A \optitem{ralignquotation}
-% \changes{v0.9a}{2012/08/31}{New option \opt{ralignquotation}}
-% ^^A$\rightarrow$ \opt{quotestyle=right}
-% ^^A \optitem{smallquotation}
-% \changes{v0.9a}{2012/08/31}{New option \opt{smallquotation}}
-% ^^A $\rightarrow$ \opt{quotesize=small}
-% ^^A \optitem{dottedfootnote}
-% \changes{v0.9a}{2012/08/31}{New option \opt{dottedfootnote}}
-% ^^A $\rightarrow$ \opt{footnotes=dot}
-% ^^A \optitem{indentlist}
-% \changes{v0.9a}{2012/08/31}{New option \opt{indentlist}}
-% ^^A $\rightarrow$ \opt{liststyle=indented}
-% ^^A \optitem{alignlist}
-% \changes{v0.9a}{2012/08/31}{New option \opt{alignlist}}
-% ^^A $\rightarrow$ \opt{liststyle=aligned}
-% ^^A \optitem{artemisia} $\rightarrow$ \opt{greekfont=artemisia}
-% ^^A \optitem{porson} $\rightarrow$ \opt{greekfont=porson}
-% ^^A \optitem{defaultgreek} $\rightarrow$ \opt{greekfont=cbgreek}
-% ^^A \optitem{defaultfont}
-% ^^A $\rightarrow$ \opt{defaultfont=standard}
-% ^^A \optitem{centerpart}
-% \changes{v0.9a}{2012/08/31}{New option \opt{centerpart}}
-% ^^A $\rightarrow$ \opt{partstyle=center}
-% ^^A \optitem{centerchap}
-% \changes{v0.9a}{2012/08/31}{New option \opt{centerchap}}
-% ^^A $\rightarrow$ \opt{chapstyle=center}
-% ^^A \optitem{centersec}
-% \changes{v0.9a}{2012/08/31}{New option \opt{centersec}}
-% ^^A $\rightarrow$ \opt{secstyle=center}
-% ^^A \optitem{rightpart}
-% \changes{v0.9a}{2012/08/31}{New option \opt{rightpart}}
-% ^^A $\rightarrow$ \opt{partstyle=right}
-% ^^A \optitem{rightchap}
-% \changes{v0.9a}{2012/08/31}{New option \opt{rightchap}}
-% ^^A $\rightarrow$ \opt{chapstyle=right}
-% ^^A \optitem{rightsec}
-% \changes{v0.9a}{2012/08/31}{New option \opt{rightsec}}
-% ^^A $\rightarrow$ \opt{secstyle=right}
-% ^^A \optitem{numparpart}
-% \changes{v0.9a}{2012/08/31}{New option \opt{numparpart}}
-% ^^A $\rightarrow$ \opt{partnumposition=above}
-% ^^A \optitem{numparchap}
-% \changes{v0.9a}{2012/08/31}{New option \opt{numparchap}}
-% ^^A $\rightarrow$ \opt{chapnumposition=above}
-% ^^A \optitem{numparsec}
-% \changes{v0.9a}{2012/08/31}{New option \opt{numparsec}}
-% ^^A $\rightarrow$ \opt{secnumposition=above}
-% ^^A \optitem{smallcapspart}
-% \changes{v0.9a}{2012/08/31}{New option \opt{smallcapspart}}
-% ^^A $\rightarrow$ \opt{partstyle=smallcaps}
-% ^^A \optitem{smallcapschap}
-% \changes{v0.9a}{2012/08/31}{New option \opt{smallcapschap}}
-% ^^A $\rightarrow$ \opt{chapstyle=smallcaps}
-% ^^A \optitem{smallcapssec}
-% \changes{v0.9a}{2012/08/31}{New option \opt{smallcapssec}}
-% ^^A $\rightarrow$ \opt{subsecstyle=smallcaps}
-% ^^A \optitem{italicpart}
-% \changes{v0.9a}{2012/08/31}{New option \opt{italicpart}}
-% ^^A $\rightarrow$ \opt{partstyle=italic}
-% ^^A \optitem{italicchap}
-% \changes{v0.9a}{2012/08/31}{New option \opt{italicchap}}
-% ^^A $\rightarrow$ \opt{chapsecstyle=italic}
-% ^^A \optitem{italicsec}
-% \changes{v0.9a}{2012/08/31}{New option \opt{italicsec}}
-% ^^A $\rightarrow$ \opt{secstyle=italic}
-% ^^A \optitem{italicsubsec}
-% \changes{v0.9a}{2012/08/31}{New option \opt{italicsubsec}}
-% ^^A $\rightarrow$ \opt{subsecstyle=italic}
-% ^^A \optitem{romanchapnum}
-% \changes{v0.9a}{2012/08/31}{New option \opt{romanchap}}
-% ^^A $\rightarrow$ \opt{chapnumstyle=roman}
-% ^^A \optitem{dottedchap}
-% \changes{v0.9a}{2012/08/31}{New option \opt{dottedchap}}
-% ^^A $\rightarrow$ \opt{chapnumstyle}
-% ^^A \optitem{italicheader}
-% \changes{v0.9a}{2012/08/31}{New option \opt{italicheader}}
-% ^^A $\rightarrow$ \opt{headerfont=italic}
-% ^^A \optitem{centerheader}
-% ^^A $\rightarrow$ \opt{headerstyle=center}
-% ^^A \optitem{sufplain}
-% ^^A $\rightarrow$ \opt{headerstyle=plain}
-% ^^A \optitem{authortitle}
+% \begin{ltxsyntax}
+% \cmditem{FSPLcolophon}{Name Surname}
+% \end{ltxsyntax}
+% A command is provided to typeset the colophon according to the \opt{FSPL} styles.
+% \changes{v0.9a}{2012/08/31}{New options, \opt{defaultparindent},
+% \opt{ralignquotation}, \opt{smallquotation}, \opt{dottedfootnote}, \opt{indentlist},
+% \opt{alignlist}, \opt{centerpart}, \opt{centerchap}, \opt{centersec}, \opt{rightpart},
+% \opt{rightchap}, \opt{rightsec}, \opt{numparpart}, \opt{numparchap}, \opt{numparsec},
+% \opt{smallcapspart}, \opt{smallcapschap}, \opt{smallcapssec}, \opt{italicpart},
+% \opt{italicchap}, \opt{italicsec}, \opt{italicsubsec}, \opt{romanchap},
+% \opt{dottedchap}, \opt{italicheader}, \opt{tocpageleft}, \opt{dottedpart},
+% \opt{rmstyle(1-6)}, \opt{itstyle(1-12)},\opt{scstyle(1-12)}, \opt{standardfootnote},
+% \opt{smallcapsheader}}
% \changes{v0.6}{2011/10/21}{New option \opt{authortitle}}
-% ^^A $\rightarrow$ \opt{headerstyle}
-% ^^A \optitem{periodical}
% \changes{v0.8}{2012/03/19}{New option \opt{periodical}}
-% ^^A $\rightarrow$ \opt{pagestyle=periodical}
-% ^^A \optitem{compact}
-% \changes{v0.5}{2011/10/21}{New option \opt{compact}}
-% ^^A $\rightarrow$ \opt{pagestyle=compact}
-% ^^A \optitem{supercompact}
-% \changes{v0.5}{2011/10/21}{New option \opt{supercompact}}
-% ^^A $\rightarrow$ \opt{pagestyle=supercompact}
-% ^^A \optitem{dottedtoc}
-% \changes{v0.9}{2012/04/22}{New option \opt{dottedtoc}}
-% ^^A $\rightarrow$ \opt{tocstyle=dotted}
-% ^^A \optitem{raggedtoc}
-% \changes{v0.9}{2012/04/22}{New option \opt{raggedtoc}}
-% ^^A $\rightarrow$ \opt{tocstyle=ragged}
-% ^^A \optitem{tocpageleft}
-% \changes{v0.9a}{2012/08/31}{New option \opt{tocpageleft}}
-% ^^A $\rightarrow$ \opt{tocstyle=leftpage}
-% ^^A \optitem{dottedpart}
-% \changes{v0.9a}{2012/08/31}{New option \opt{dottedpart}}
-% ^^A $\rightarrow$ \opt{partnumstyle=dotarabic}
-% ^^A \optitem{elements}
-% \changes{v0.5}{2011/10/21}{New option \opt{elements}}
-% ^^A $\rightarrow$ \opt{style=elements}
-% ^^A \optitem{nomarginpar}
-% \changes{v0.5}{2011/10/21}{New option \opt{nomarginpar}}
-% ^^A $\rightarrow$ \opt{marginpar=false}
-% ^^A \optitem{nocrop}
-% \changes{v0.5}{2011/10/21}{New option \opt{nocrop}}
-% ^^A $\rightarrow$ \opt{crop=false}
-% ^^A \optitem{rmstyle(1-6)}
-% \changes{v0.9a}{2012/08/31}{New option \opt{rmstyle(1-6)}}
-% ^^A $\rightarrow$ \opt{style=roman(1-6)}
-% ^^A \optitem{itstyle(1-12)}
-% \changes{v0.9a}{2012/08/31}{New option \opt{itstyle(1-12)}}
-% ^^A $\rightarrow$ \opt{style=italic(1-6)}
-% ^^A \optitem{scstyle(1-12)}
-% \changes{v0.9a}{2012/08/31}{New option \opt{scstyle(1-12)}}
-% ^^A $\rightarrow$ \opt{style=smallcaps(1-6)}
-% ^^A \optitem{sufelements}
-% \changes{v0.5}{2011/10/21}{New option \opt{sufelements}}
-% ^^A $\rightarrow$ \opt{style=sufelements}
-% ^^A \optitem{standardfootnote}
-% \changes{v0.9a}{2012/08/31}{New option \opt{standardfootnote}}
-% ^^A $\rightarrow$ \opt{footnotes=superscript}
-% ^^A \optitem{smallcapsheader}
-% \changes{v0.9a}{2012/08/31}{New option \opt{smallcapsheader}}
-% ^^A $\rightarrow$ \opt{headerfont=smallcaps}
-% ^^A \optitem{viewmode}
-% ^^A $\rightarrow$ \opt{version}
-% ^^A \end{ltxsyntax}
-% ^^A \end{multicols}
+% \changes{v0.9}{2012/04/22}{New option \opt{dottedtoc}, \opt{raggedtoc}}
+% \changes{v0.5}{2011/10/21}{New option \opt{elements}, \opt{nomarginpar}, \opt{nocrop},
+% \opt{sufelements}, \opt{compact}, \opt{supercompact}}
%
+% \StopEventually{
% \defbibnote{note}{\sffamily This bibliography has been typeset with
% the \sty{biblatex-philosophy} package, created by the same author of this class.}
+% \printbibliography[heading=bibintoc,prenote=note]
+% \PrintChanges\PrintIndex}
%
-% \addcontentsline{toc}{section}{\refname}
-% \printbibliography[prenote=note]
-%
-% \StopEventually{\PrintChanges\PrintIndex}
-%
-% \section*{The Code}
-% \addcontentsline{toc}{section}{The Code}
% \iffalse
%<*class>
% \fi
+% ^^A ----------------------------------------------------------------
+% ^^A
+% \section{The Code}
+% ^^A
+% ^^A ----------------------------------------------------------------
+%
% \begin{macrocode}
\RequirePackage{xkeyval}
\newif\ifsuftesi@compatibility
@@ -1863,6 +2038,9 @@
\newif\ifsuftesi@toccompactsec
\newif\ifsuftesi@toccompactsubsec
\newif\ifsuftesi@toccompactsubsubsec
+% \end{macrocode}
+% The class is based on the standard \sty{book} class but the following options are disabled as they contrast with the layouts provided by the class. Specifically, the first five options are actually ineffective, while the \opt{landscape} option rotates the page correctly, but sets the text width according to the class options, effectively making it unusable.
+% \begin{macrocode}
\DeclareOption{a4paper}{%
\ClassWarningNoLine{suftesi}{Option 'a4paper' not available}{}}
\DeclareOption{a5paper}{%
@@ -1876,7 +2054,7 @@
\DeclareOption{landscape}{%
\ClassWarningNoLine{suftesi}{Option 'landscape' not available}{}}
% \end{macrocode}
-% The \sty{suftesi} class is based on the standard \sty{book} class but the previous options are disabled as they contrast with the layouts provided by the class.
+% Now we can load the \sty{book} class and make the related options available. The \sty{fontsize} package redefines some commands of the \file{.clo} files loaded by the class. In particular, it also defines the value of \cmd{parindent}, which is why the \opt{parindent} option must be declared after the \sty{fontsize} call.
% \begin{macrocode}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{book}}
\ProcessOptions
@@ -1887,21 +2065,22 @@
\ExecuteOptionsX{parindent=\baselineskip}
\ProcessOptionsX*\relax
% \end{macrocode}
-% \subsection*{Document structure}
+% \subsection{Options definition}
+% \subsubsection{Structure}
% \begin{macrocode}
\define@choicekey{}{structure}[\val\nr]
{book,article,collection}[book]{%
\ifcase\nr\relax
% \disable@keys{}{secnumstyle}
-\def\SUF@chapswitch{\thechapter.}
+ \def\SUF@chapswitch{\thechapter.}
\or
-\suftesi@articletrue
-\@titlepagefalse
-\def\SUF@chapswitch{}
+ \suftesi@articletrue
+ \@titlepagefalse
+ \def\SUF@chapswitch{}
\or
-\suftesi@collectiontrue
- \setkeys{}{headerstyle=authortitleinner}
-\def\SUF@chapswitch{}
+ \suftesi@collectiontrue
+ \setkeys{}{headerstyle=authortitleinner}
+ \def\SUF@chapswitch{}
\fi}
\define@choicekey{}{documentstructure}[\val\nr]
{book,article,collection}[book]{%
@@ -1916,12 +2095,57 @@
\setkeys{}{structure=collection}
\fi}
% \end{macrocode}
-% \subsection*{Page layout}
+% \subsubsection{Fonts}
+% \paragraph{Roman fonts}
+% \begin{macrocode}
+\define@choicekey{}{defaultfont}[\val\nr]
+ {none,cochineal,libertine,palatino,standard,compatibility}[cochineal]{%
+\ifcase\nr\relax
+ \suftesi@nofonttrue
+\or
+ \suftesi@cochinealtrue
+\or
+ \suftesi@libertinetrue
+\or
+ \suftesi@palatinotrue
+\or
+ \suftesi@standardtrue
+\or
+ \suftesi@compatibilitytrue
+\fi}
+\define@choicekey{}{mathfont}[\val\nr]
+ {none,minimal,extended}[minimal]{%
+\ifcase\nr\relax
+ \suftesi@mathminimalfalse
+ \suftesi@mathextendedfalse
+\or
+ \suftesi@mathminimaltrue
+\or
+ \suftesi@mathextendedtrue
+\fi}
+% \end{macrocode}
+% \paragraph{Greek fonts}
+% \begin{macrocode}
+\define@choicekey{}{greekfont}[\val\nr]
+ {none,artemisia,porson,bodoni,cbgreek}[none]{%
+\ifcase\nr\relax
+ \suftesi@greekfontfalse
+\or
+ \suftesi@greekfonttrue\suftesi@artemisiatrue
+\or
+ \suftesi@greekfonttrue\suftesi@porsontrue
+\or
+ \suftesi@greekfonttrue\suftesi@bodonitrue
+\or
+ \suftesi@greekfonttrue\suftesi@cbgreektrue
+\fi}
+% \end{macrocode}
+% \subsubsection{Layouts}
% \begin{macrocode}
\RequirePackage{geometry}
\define@choicekey{}{pagelayout}[\val\nr]
- {standard,standardaureo,periodical,compact,compactaureo,supercompact,
- supercompactaureo,periodicalaureo}[standard]{%
+ {standard,standardaureo,periodical,periodicalaureo,compact,compactaureo,
+ supercompact,supercompactaureo,pocketa,pocketb,pocketc}[standard]{%
\ifcase\nr\relax
\DeclareRobustCommand{\SUF@partsize}{\Large}
\DeclareRobustCommand{\SUF@chaptersize}{\Large}
@@ -1970,6 +2194,23 @@
marginparwidth= 26mm,
marginparsep= 10pt}
\or
+\suftesi@periodicalaureotrue
+ \DeclareRobustCommand{\SUF@partsize}{\large}
+ \DeclareRobustCommand{\SUF@chaptersize}{\large}
+ \DeclareRobustCommand{\SUF@sectionsize}{\normalsize}
+ \DeclareRobustCommand{\SUF@subsectionsize}{\normalsize}
+ \DeclareRobustCommand{\SUF@subsubsectionsize}{\normalsize}
+ \geometry{
+ heightrounded,
+ includeheadfoot=true,
+ textwidth= 120mm,
+ textheight= 194mm,
+ paperwidth= 17cm,
+ paperheight= 24cm,
+ marginratio= 2:3,
+ marginparwidth= 62pt,
+ marginparsep= 10pt}
+\or
\suftesi@compacttrue
\DeclareRobustCommand{\SUF@partsize}{\large}
\DeclareRobustCommand{\SUF@chaptersize}{\large}
@@ -2037,8 +2278,8 @@
marginratio= 1:1,
marginparwidth= 11mm,
marginparsep= 7pt}
-\or
-\suftesi@periodicalaureotrue
+\or% pocketa
+\suftesi@supercompactaureotrue
\DeclareRobustCommand{\SUF@partsize}{\large}
\DeclareRobustCommand{\SUF@chaptersize}{\large}
\DeclareRobustCommand{\SUF@sectionsize}{\normalsize}
@@ -2046,251 +2287,235 @@
\DeclareRobustCommand{\SUF@subsubsectionsize}{\normalsize}
\geometry{
heightrounded,
- includeheadfoot=true,
- textwidth= 120mm,
- textheight= 194mm,
- paperwidth= 17cm,
- paperheight= 24cm,
- marginratio= 2:3,
- marginparwidth= 62pt,
- marginparsep= 10pt}
-\or
+ includeheadfoot=false,
+ textheight= 153mm,
+ textwidth= 102mm,
+ paperwidth= 135mm,
+ paperheight= 208mm,
+ hmarginratio= 1:1,
+ vmarginratio= 2:3,
+ marginparwidth= 12mm,
+ marginparsep= 7pt}
+\or% pocketb
+\suftesi@supercompactaureotrue
+ \DeclareRobustCommand{\SUF@partsize}{\large}
+ \DeclareRobustCommand{\SUF@chaptersize}{\large}
+ \DeclareRobustCommand{\SUF@sectionsize}{\normalsize}
+ \DeclareRobustCommand{\SUF@subsectionsize}{\normalsize}
+ \DeclareRobustCommand{\SUF@subsubsectionsize}{\normalsize}
+ \geometry{
+ heightrounded,
+ includeheadfoot=false,
+ textheight= 165mm,
+ textwidth= 99mm,
+ paperwidth= 140mm,
+ paperheight= 210mm,
+ hmarginratio= 1:1,
+ vmarginratio= 2:3,
+ marginparwidth= 15mm,
+ marginparsep= 7pt}
+\or% pocketc
+\suftesi@supercompactaureotrue
+ \DeclareRobustCommand{\SUF@partsize}{\large}
+ \DeclareRobustCommand{\SUF@chaptersize}{\large}
+ \DeclareRobustCommand{\SUF@sectionsize}{\normalsize}
+ \DeclareRobustCommand{\SUF@subsectionsize}{\normalsize}
+ \DeclareRobustCommand{\SUF@subsubsectionsize}{\normalsize}
+ \geometry{
+ heightrounded,
+ includeheadfoot=false,
+ textheight= 150mm,
+ textwidth= 90mm,
+ paperwidth= 116mm,
+ paperheight= 193mm,
+ hmarginratio= 1:1,
+ vmarginratio= 2:3,
+ marginparwidth= 8mm,
+ marginparsep= 7pt}
\fi}
% \end{macrocode}
-% \subsection*{Sections style}
+% \subsubsection{Sections style}
% \begin{macrocode}
-\define@choicekey{}{partstyle}[\val\nr]{%
- left,center,right,parleft,parcenter,parright}[left]{%
+\define@choicekey{}{partstyle}[\val\nr]
+ {left,center,right,parleft,parcenter,parright}[left]{%
\ifcase\nr\relax
\def\SUF@lr@PARTSwitch{\filright}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakNL}
\or
\def\SUF@lr@PARTSwitch{\filcenter}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\or
\def\SUF@lr@PARTSwitch{\filleft}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\or%numpar
\def\SUF@lr@PARTSwitch{\filright}
\suftesi@numparparttrue
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakNL}
\or
\def\SUF@lr@PARTSwitch{\filcenter}
\suftesi@numparparttrue
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\or
\def\SUF@lr@PARTSwitch{\filleft}
\suftesi@numparparttrue
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\fi}
-\define@choicekey{}{chapstyle}[\val\nr]{%
- left,center,right,parleft,parcenter,parright}[left]{%
+\define@choicekey{}{chapstyle}[\val\nr]
+ {left,center,right,parleft,parcenter,parright}[left]{%
\ifcase\nr\relax
\def\SUF@lr@CHAPSwitch{\filright}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakNL}
\or
\def\SUF@lr@CHAPSwitch{\filcenter}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\or
\def\SUF@lr@CHAPSwitch{\filleft}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\or%numparchap
\def\SUF@lr@CHAPSwitch{\filright}
\suftesi@numparchaptrue
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakNL}
\or
\def\SUF@lr@CHAPSwitch{\filcenter}
\suftesi@numparchaptrue
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\or
\def\SUF@lr@CHAPSwitch{\filleft}
\suftesi@numparchaptrue
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\fi}
-\define@choicekey{}{secstyle}[\val\nr]{%
- left,center,right,parleft,parcenter,parright}[left]{%
+\define@choicekey{}{secstyle}[\val\nr]
+ {left,center,right,parleft,parcenter,parright}[left]{%
\ifcase\nr\relax
\def\SUF@lr@SECSwitch{\filright}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakNL}
\or
\def\SUF@lr@SECSwitch{\filcenter}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\or
\def\SUF@lr@SECSwitch{\filleft}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\or%numparsec
\def\SUF@lr@SECSwitch{\filright}
\suftesi@numparsectrue
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakNL}
\or
\def\SUF@lr@SECSwitch{\filcenter}
\suftesi@numparsectrue
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\or
\def\SUF@lr@SECSwitch{\filleft}
\suftesi@numparsectrue
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\fi}
-\define@choicekey{}{subsecstyle}[\val\nr]{left,center,right}[left]{%
+\define@choicekey{}{subsecstyle}[\val\nr]
+ {left,center,right,parleft,parcenter,parright}[left]{%
\ifcase\nr\relax
\def\SUF@lr@SUBSECSwitch{\filright}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakNL}
\or
\def\SUF@lr@SUBSECSwitch{\filcenter}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\or
\def\SUF@lr@SUBSECSwitch{\filleft}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
+\or%numparsubsec
+\def\SUF@lr@SUBSECSwitch{\filright}
+\suftesi@numparsubsectrue
+\or
+\def\SUF@lr@SUBSECSwitch{\filcenter}
+\suftesi@numparsubsectrue
+\or
+\def\SUF@lr@SUBSECSwitch{\filleft}
+\suftesi@numparsubsectrue
\fi}
-\define@choicekey{}{subsubsecstyle}[\val\nr]{left,center,right}[left]{%
+\define@choicekey{}{subsubsecstyle}[\val\nr]
+ {left,center,right,parleft,parcenter,parright}[left]{%
\ifcase\nr\relax
\def\SUF@lr@SUBSUBSECSwitch{\filright}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakNL}
\or
\def\SUF@lr@SUBSUBSECSwitch{\filcenter}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
\or
\def\SUF@lr@SUBSUBSECSwitch{\filleft}
- \DeclareRobustCommand{\xheadbreak}{\xheadbreakBB}
-\fi}
-% \end{macrocode}
-% \subsection*{Sections font}
-% \begin{macrocode}
-\define@choicekey{}{partfont}[\val\nr]{roman,italic,smallcaps}[roman]{%
-\ifcase\nr\relax
-\def\SUF@PART@StyleSwitch{\relax}
-\or
-\def\SUF@PART@StyleSwitch{\itshape}
-\or
-\def\SUF@PART@StyleSwitch{\expandafter\SUF@titlesmallcaps}
-\fi}
-\define@choicekey{}{chapfont}[\val\nr]{roman,italic,smallcaps}[roman]{%
-\ifcase\nr\relax
-\def\SUF@CHAP@StyleSwitch{\relax}
-\or
-\def\SUF@CHAP@StyleSwitch{\itshape}
-\or
-\def\SUF@CHAP@StyleSwitch{\expandafter\SUF@titlesmallcaps}
-\fi}
-\define@choicekey{}{secfont}[\val\nr]{roman,italic,smallcaps}[italic]{%
-\ifcase\nr\relax
-\def\SUF@SEC@StyleSwitch{\relax}
-\or
-\def\SUF@SEC@StyleSwitch{\itshape}
-\or
-\def\SUF@SEC@StyleSwitch{\expandafter\SUF@titlesmallcaps}
-\fi}
-\define@choicekey{}{subsecfont}[\val\nr]{roman,italic,smallcaps}[roman]{%
-\ifcase\nr\relax
-\def\SUF@SUBSEC@StyleSwitch{\relax}
-\or
-\def\SUF@SUBSEC@StyleSwitch{\itshape}
-\or
-\def\SUF@SUBSEC@StyleSwitch{\expandafter\SUF@titlesmallcaps}
-\fi}
-\define@choicekey{}{subsubsecfont}[\val\nr]{roman,italic,smallcaps}[roman]{%
-\ifcase\nr\relax
-\def\SUF@SUBSUBSEC@StyleSwitch{\relax}
+\or%numparsubsubsec
+\def\SUF@lr@SUBSUBSECSwitch{\filright}
+\suftesi@numparsubsubsectrue
\or
-\def\SUF@SUBSUBSEC@StyleSwitch{\itshape}
+\def\SUF@lr@SUBSUBSECSwitch{\filcenter}
+\suftesi@numparsubsubsectrue
\or
-\def\SUF@SUBSUBSEC@StyleSwitch{\expandafter\SUF@titlesmallcaps}
+\def\SUF@lr@SUBSUBSECSwitch{\filleft}
+\suftesi@numparsubsubsectrue
\fi}
% \end{macrocode}
-% \subsection*{TOC font}
+% \subsubsection{Sections font}
% \begin{macrocode}
-% \define@choicekey{}{tocpartfont}[\val\nr]{roman,italic,smallcaps}[roman]{%
-% \ifcase\nr\relax
-% \def\SUF@tocPART@font{\relax}
-% \or
-% \def\SUF@tocPART@font{\itshape}
-% \or
-% \def\SUF@tocPART@font{\expandafter\SUF@TOCtitlesmallcaps}
-% \fi}
-\define@choicekey{}{tocchapfont}[\val\nr]{roman,italic,smallcaps}[roman]{%
+\define@choicekey{}{partfont}[\val\nr]
+ {roman,italic,smallcaps}[roman]{%
\ifcase\nr\relax
-\def\SUF@tocCHAP@font{\relax}
+ \def\SUF@PART@StyleSwitch{\relax}
\or
-\def\SUF@tocCHAP@font{\itshape}
+ \def\SUF@PART@StyleSwitch{\itshape}
\or
-\def\SUF@tocCHAP@font{\expandafter\SUF@TOCtitlesmallcaps}
+ \def\SUF@PART@StyleSwitch{\expandafter\SUF@titlesmallcaps}
\fi}
-\define@choicekey{}{tocsecfont}[\val\nr]{roman,italic,smallcaps}[italic]{%
+\define@choicekey{}{chapfont}[\val\nr]
+ {roman,italic,smallcaps}[roman]{%
\ifcase\nr\relax
-\def\SUF@tocSEC@font{\relax}
+ \def\SUF@CHAP@StyleSwitch{\relax}
\or
-\def\SUF@tocSEC@font{\itshape}
+ \def\SUF@CHAP@StyleSwitch{\itshape}
\or
-\def\SUF@tocSEC@font{\expandafter\SUF@TOCtitlesmallcaps}
+ \def\SUF@CHAP@StyleSwitch{\expandafter\SUF@titlesmallcaps}
\fi}
-\define@choicekey{}{tocsubsecfont}[\val\nr]{roman,italic,smallcaps}[roman]{%
+\define@choicekey{}{secfont}[\val\nr]
+ {roman,italic,smallcaps}[italic]{%
\ifcase\nr\relax
-\def\SUF@tocSUBSEC@font{\relax}
+ \def\SUF@SEC@StyleSwitch{\relax}
\or
-\def\SUF@tocSUBSEC@font{\itshape}
+ \def\SUF@SEC@StyleSwitch{\itshape}
\or
-\def\SUF@tocSUBSEC@font{\expandafter\SUF@TOCtitlesmallcaps}
+ \def\SUF@SEC@StyleSwitch{\expandafter\SUF@titlesmallcaps}
\fi}
-\define@choicekey{}{tocsubsubsecfont}[\val\nr]{roman,italic,smallcaps}[roman]{%
+\define@choicekey{}{subsecfont}[\val\nr]
+ {roman,italic,smallcaps}[roman]{%
\ifcase\nr\relax
-\def\SUF@tocSUBSUBSEC@font{\relax}
+ \def\SUF@SUBSEC@StyleSwitch{\relax}
\or
-\def\SUF@tocSUBSUBSEC@font{\itshape}
+ \def\SUF@SUBSEC@StyleSwitch{\itshape}
\or
-\def\SUF@tocSUBSUBSEC@font{\expandafter\SUF@TOCtitlesmallcaps}
+ \def\SUF@SUBSEC@StyleSwitch{\expandafter\SUF@titlesmallcaps}
\fi}
-\define@choicekey{}{tocauthorfont}[\val\nr]{roman,italic,smallcaps}[roman]{%
+\define@choicekey{}{subsubsecfont}[\val\nr]
+ {roman,italic,smallcaps}[roman]{%
\ifcase\nr\relax
-\def\SUF@tocAUT@font{\relax}
+ \def\SUF@SUBSUBSEC@StyleSwitch{\relax}
\or
-\def\SUF@tocAUT@font{\itshape}
+ \def\SUF@SUBSUBSEC@StyleSwitch{\itshape}
\or
-\def\SUF@tocAUT@font{\expandafter\SUF@TOCtitlesmallcaps}
+ \def\SUF@SUBSUBSEC@StyleSwitch{\expandafter\SUF@titlesmallcaps}
\fi}
-\define@choicekey{}{toctitlefont}[\val\nr]{roman,italic,smallcaps}[italic]{%
+% \end{macrocode}
+% \paragraph{Small capitals style}
+% \begin{macrocode}
+\define@choicekey{}{smallcapsstyle}[\val\nr]
+ {low,upper}[low]{%
\ifcase\nr\relax
-\def\SUF@tocTIT@font{\relax}
-\or
-\def\SUF@tocTIT@font{\itshape}
+ \def\suftesi@MakeTextLowercase{\MakeLowercase}
+ \def\suftesi@MakeTextTOCLowercase{\lowercase}
\or
-\def\SUF@tocTIT@font{\expandafter\SUF@TOCtitlesmallcaps}
+ \def\suftesi@MakeTextLowercase{\relax}
+ \def\suftesi@MakeTextTOCLowercase{\relax}
\fi}
% \end{macrocode}
-% \subsection*{Sections number style}
-% \subsubsection*{Part number style}
+% \subsubsection{Sections number}
+% \paragraph{Part number style}
% \begin{macrocode}
\define@choicekey{}{partnumstyle}[\val\nr]
{arabic,roman,Roman,dotarabic,dotroman,dotRoman}[arabic]{%
\ifcase\nr\relax
\def\SUF@thepart{\arabic{part}}
\def\SUF@dotpart{}
-% \def\SUF@PART@thecontentslabel{\thecontentslabel}
\or
\def\SUF@thepart{\textsc{\roman{part}}}
\def\SUF@dotpart{}
-% \def\SUF@PART@thecontentslabel{\@roman{\thecontentslabel}}
\or
\def\SUF@thepart{\Roman{part}}
\def\SUF@dotpart{}
-% \def\SUF@PART@thecontentslabel{\@Roman{\thecontentslabel}}
\or
\def\SUF@thepart{\arabic{part}}
\def\SUF@dotpart{.}
-% \def\SUF@PART@thecontentslabel{\thecontentslabel}
\or
\def\SUF@thepart{\textsc{\roman{part}}}
\def\SUF@dotpart{.}
-% \def\SUF@PART@thecontentslabel{\@roman{\thecontentslabel}}
\or
\def\SUF@thepart{\Roman{part}}
\def\SUF@dotpart{.}
-% \def\SUF@PART@thecontentslabel{\@Roman{\thecontentslabel}}
\fi}
% \end{macrocode}
-% \subsubsection*{Chapter number style}
+% \paragraph{Chapter number style}
% \begin{macrocode}
-\define@choicekey{}{chapnumstyle}[\val\nr]{arabic,roman,Roman,
-dotarabic,dotroman,dotRoman}[arabic]{%
+\define@choicekey{}{chapnumstyle}[\val\nr]
+ {arabic,roman,Roman,dotarabic,dotroman,dotRoman}[arabic]{%
\ifcase\nr\relax
\def\SUF@thechapter{\arabic{chapter}}
\def\SUF@HEAD@thechapter{\arabic{chapter}}
@@ -2323,7 +2548,7 @@ dotarabic,dotroman,dotRoman}[arabic]{%
\def\SUF@CHAP@thecontentslabel{\@Roman{\thecontentslabel}}
\fi}
% \end{macrocode}
-% \subsubsection*{Section number style}
+% \paragraph{Section number style}
% \begin{macrocode}
\define@choicekey{}{secnumstyle}[\val\nr]
{arabic,roman,Roman,dotarabic,dotroman,dotRoman}[arabic]{%
@@ -2359,110 +2584,210 @@ dotarabic,dotroman,dotRoman}[arabic]{%
\def\SUF@SEC@thecontentslabel{\@Roman{\thecontentslabel}}
\fi}
% \end{macrocode}
-% \subsubsection*{Subsection number style}
+% \paragraph{Subsection number style}
% \begin{macrocode}
\define@choicekey{}{subsecnumstyle}[\val\nr]
-{arabic,roman,Roman,dotarabic,dotroman,dotRoman}[arabic]{%
- \ifcase\nr\relax
- \def\SUF@thesubsection{\SUF@thesection.\arabic{subsection}}
- \def\SUF@dotsubsec{}
- \def\SUF@SUBSEC@thecontentslabel{\thecontentslabel}
- \or
- \def\SUF@thesubsection{\SUF@thesection.\textsc{\roman{subsection}}}
- \def\SUF@dotsubsec{}
- \def\SUF@SUBSEC@thecontentslabel{\textsc{\@roman{\thecontentslabel}}}
- \or
- \def\SUF@thesubsection{\SUF@thesection.\Roman{subsection}}
- \def\SUF@dotsubsec{}
- \def\SUF@SUBSEC@thecontentslabel{\@Roman{\thecontentslabel}}
- \or
- \def\SUF@thesubsection{\SUF@thesection.\arabic{subsection}}
- \def\SUF@dotsubsec{.}
- \def\SUF@SUBSEC@thecontentslabel{\thecontentslabel}
- \or
- \def\SUF@thesubsection{\SUF@thesection.\textsc{\roman{subsection}}}
- \def\SUF@dotsubsec{.}
- \def\SUF@SUBSEC@thecontentslabel{\textsc{\@roman{\thecontentslabel}}}
- \or
- \def\SUF@thesubsection{\SUF@thesection.\Roman{subsection}}
- \def\SUF@dotsubsec{.}
- \def\SUF@SUBSEC@thecontentslabel{\@Roman{\thecontentslabel}}
- \fi}
+ {arabic,roman,Roman,dotarabic,dotroman,dotRoman}[arabic]{%
+\ifcase\nr\relax
+ \def\SUF@thesubsection{\SUF@thesection.\arabic{subsection}}
+ \def\SUF@dotsubsec{}
+ \def\SUF@SUBSEC@thecontentslabel{\thecontentslabel}
+\or
+ \def\SUF@thesubsection{\SUF@thesection.\textsc{\roman{subsection}}}
+ \def\SUF@dotsubsec{}
+ \def\SUF@SUBSEC@thecontentslabel{\textsc{\@roman{\thecontentslabel}}}
+\or
+ \def\SUF@thesubsection{\SUF@thesection.\Roman{subsection}}
+ \def\SUF@dotsubsec{}
+ \def\SUF@SUBSEC@thecontentslabel{\@Roman{\thecontentslabel}}
+\or
+ \def\SUF@thesubsection{\SUF@thesection.\arabic{subsection}}
+ \def\SUF@dotsubsec{.}
+ \def\SUF@SUBSEC@thecontentslabel{\thecontentslabel}
+\or
+ \def\SUF@thesubsection{\SUF@thesection.\textsc{\roman{subsection}}}
+ \def\SUF@dotsubsec{.}
+ \def\SUF@SUBSEC@thecontentslabel{\textsc{\@roman{\thecontentslabel}}}
+\or
+ \def\SUF@thesubsection{\SUF@thesection.\Roman{subsection}}
+ \def\SUF@dotsubsec{.}
+ \def\SUF@SUBSEC@thecontentslabel{\@Roman{\thecontentslabel}}
+\fi}
% \end{macrocode}
-% \subsubsection*{Sub-subsection number style}
+% \paragraph{Sub-subsection number style}
% \begin{macrocode}
\define@choicekey{}{subsubsecnumstyle}[\val\nr]
-{arabic,roman,Roman,dotarabic,dotroman,dotRoman}[arabic]{%
- \ifcase\nr\relax
- \def\SUF@thesubsubsection{\SUF@thesubsection.\arabic{subsubsection}}
- \def\SUF@dotsubsubsec{}
- \def\SUF@SUBSUBSEC@thecontentslabel{\thecontentslabel}
- \or
- \def\SUF@thesubsubsection{\SUF@thesubsection.\textsc{\roman{subsubsection}}}
- \def\SUF@dotsubsubsec{}
- \def\SUF@SUBSUBSEC@thecontentslabel{\textsc{\@roman{\thecontentslabel}}}
- \or
- \def\SUF@thesubsubsection{\SUF@thesubsection.\Roman{subsubsection}}
- \def\SUF@dotsubsubsec{}
- \def\SUF@SUBSUBSEC@thecontentslabel{\@Roman{\thecontentslabel}}
- \or
- \def\SUF@thesubsubsection{\SUF@thesubsection.\arabic{subsubsection}}
- \def\SUF@dotsubsubsec{.}
- \def\SUF@SUBSUBSEC@thecontentslabel{\thecontentslabel}
- \or
- \def\SUF@thesubsubsection{\SUF@thesubsection.\textsc{\roman{subsubsection}}}
- \def\SUF@dotsubsubsec{.}
- \def\SUF@SUBSUBSEC@thecontentslabel{\textsc{\@roman{\thecontentslabel}}}
- \or
- \def\SUF@thesubsubsection{\SUF@thesubsection.\Roman{subsubsection}}
- \def\SUF@dotsubsubsec{.}
- \def\SUF@SUBSUBSEC@thecontentslabel{\@Roman{\thecontentslabel}}
- \fi}
+ {arabic,roman,Roman,dotarabic,dotroman,dotRoman}[arabic]{%
+\ifcase\nr\relax
+ \def\SUF@thesubsubsection{\SUF@thesubsection.\arabic{subsubsection}}
+ \def\SUF@dotsubsubsec{}
+ \def\SUF@SUBSUBSEC@thecontentslabel{\thecontentslabel}
+\or
+ \def\SUF@thesubsubsection{\SUF@thesubsection.\textsc{\roman{subsubsection}}}
+ \def\SUF@dotsubsubsec{}
+ \def\SUF@SUBSUBSEC@thecontentslabel{\textsc{\@roman{\thecontentslabel}}}
+\or
+ \def\SUF@thesubsubsection{\SUF@thesubsection.\Roman{subsubsection}}
+ \def\SUF@dotsubsubsec{}
+ \def\SUF@SUBSUBSEC@thecontentslabel{\@Roman{\thecontentslabel}}
+\or
+ \def\SUF@thesubsubsection{\SUF@thesubsection.\arabic{subsubsection}}
+ \def\SUF@dotsubsubsec{.}
+ \def\SUF@SUBSUBSEC@thecontentslabel{\thecontentslabel}
+\or
+ \def\SUF@thesubsubsection{\SUF@thesubsection.\textsc{\roman{subsubsection}}}
+ \def\SUF@dotsubsubsec{.}
+ \def\SUF@SUBSUBSEC@thecontentslabel{\textsc{\@roman{\thecontentslabel}}}
+\or
+ \def\SUF@thesubsubsection{\SUF@thesubsection.\Roman{subsubsection}}
+ \def\SUF@dotsubsubsec{.}
+ \def\SUF@SUBSUBSEC@thecontentslabel{\@Roman{\thecontentslabel}}
+\fi}
% \end{macrocode}
-% This option controls the style of small capitals used in the
-% title of chapters and sections using \opt{\meta{level}font=smallcaps} option:
+% \subsubsection{Table of contents}
+% \paragraph{Table of contents style}
% \begin{macrocode}
-\define@choicekey{}{smallcapsstyle}[\val\nr]
- {low,upper}[low]{%
+\define@choicekey{}{tocstyle}[\val\nr]
+ {standard,dotted,ragged,leftpage}[standard]{%
\ifcase\nr\relax
- \def\suftesi@MakeTextLowercase{\MakeLowercase}
- \def\suftesi@MakeTextTOCLowercase{\lowercase}
+ \def\SUF@titlerule{\titlerule*{}}
+ \def\SUF@chaptitlerule{\titlerule*{}}
\or
- \def\suftesi@MakeTextLowercase{\relax}
- \def\suftesi@MakeTextTOCLowercase{\relax}
+\suftesi@dottedtoctrue
+ \def\SUF@titlerule{\titlerule*{\footnotesize .\ }}
+ \def\SUF@chaptitlerule{\titlerule*{}}
+\or
+\suftesi@raggedtoctrue
+ \def\SUF@titlerule{\hspace{1em}}
+ \def\SUF@chaptitlerule{\hspace{1em}}
+\or
+\suftesi@pagelefttoctrue
+\fi}
+\define@choicekey{}{compacttoc}[\val\nr]
+ {sec,subsec,subsubsec}[sec]{%
+\ifcase\nr\relax
+ \suftesi@toccompactsectrue
+ \suftesi@toccompactsubsectrue
+ \suftesi@toccompactsubsubsectrue
+ \def\suf@sscorrect{\hskip.5em}
+ \def\suf@ssscorrect{\hskip.5em}
+ \def\suf@ctocdotsec{.}
+ \def\suf@ctocdotssec{}
+ \def\suf@ctocdotsssec{}
+\or
+ \suftesi@toccompactsubsectrue
+ \suftesi@toccompactsubsubsectrue
+ \def\suf@sscorrect{\relax}
+ \def\suf@ssscorrect{\hskip.5em}
+ \def\suf@ctocdotssec{.}
+ \def\suf@ctocdotsssec{}
+\or
+ \suftesi@toccompactsubsubsectrue
+ \def\suf@sscorrect{\relax}
+ \def\suf@ssscorrect{\relax}
+ \def\suf@ctocdotsssec{.}
+\fi}
+\define@choicekey{}{twocolcontents}[\val\nr]
+ {toc,lof,lot,toclof,toclot,loflot,all}[all]{%
+\ifcase\nr\relax
+ \suftesi@twocolumntoctrue
+ \setkeys{}{tocstyle=ragged}
+\or
+ \suftesi@twocolumnloftrue
+ \setkeys{}{tocstyle=ragged}
+\or
+ \suftesi@twocolumnlottrue
+ \setkeys{}{tocstyle=ragged}
+\or
+ \suftesi@twocolumntoctrue
+ \suftesi@twocolumnloftrue
+ \setkeys{}{tocstyle=ragged}
+\or
+ \suftesi@twocolumntoctrue
+ \suftesi@twocolumnlottrue
+ \setkeys{}{tocstyle=ragged}
+\or
+ \suftesi@twocolumnloftrue
+ \suftesi@twocolumnlottrue
+ \setkeys{}{tocstyle=ragged}
+\or
+ \suftesi@twocolumntoctrue
+ \suftesi@twocolumnloftrue
+ \suftesi@twocolumnlottrue
+ \setkeys{}{tocstyle=ragged}
\fi}
% \end{macrocode}
-% \subsubsection*{Fine adjustment of sections font}%EXPERIMENTAL
+% \paragraph{Table of contents font}
% \begin{macrocode}
-\newcommand{\partfont}[1]{\def\SUF@PART@StyleSwitch{#1}}
-\newcommand{\chapfont}[1]{\def\SUF@CHAP@StyleSwitch{#1}}
-\newcommand{\secfont}[1]{\def\SUF@SEC@StyleSwitch{#1}}
-\newcommand{\subsecfont}[1]{\def\SUF@SUBSEC@StyleSwitch{#1}}
-\newcommand{\subsubsecfont}[1]{\def\SUF@SUBSUBSEC@StyleSwitch{#1}}
-\newcommand{\chapnumfont}[1]{\def\SUF@thechapter{#1}}
-\newcommand{\secnumfont}[1]{\def\SUF@thesection{#1}}
-\newcommand{\subsecnumfont}[1]{\def\SUF@thesubsection{#1}}
-\newcommand{\subsubsecnumfont}[1]{\def\SUF@thesubsubsection{#1}}
-\newcommand{\titlefont}[1]{\def\SUF@titlefont@Switch{#1}}
-\newcommand{\authorfont}[1]{\def\SUF@authorfont@Switch{#1}}
-% \newcommand{\tocpartfont}[1]{\def\SUF@tocPART@font{#1}}
-\newcommand{\tocchapfont}[1]{\def\SUF@tocCHAP@font{#1}}
-\newcommand{\tocsecfont}[1]{\def\SUF@tocSEC@font{#1}}
-\newcommand{\tocsubsecfont}[1]{\def\SUF@tocSUBSEC@font{#1}}
-\newcommand{\tocsubsubsecfont}[1]{\def\SUF@tocSUBSUBSEC@font{#1}}
-\newcommand{\tocpartnumfont}[1]{\def\SUF@PART@thecontentslabel{#1\thecontentslabel}}
-\newcommand{\tocchapnumfont}[1]{\def\SUF@CHAP@thecontentslabel{#1\thecontentslabel}}
-\newcommand{\tocsecnumfont}[1]{\def\SUF@SEC@thecontentslabel{#1\thecontentslabel}}
-\newcommand{\tocsubsecnumfont}[1]{\def\SUF@SUBSEC@thecontentslabel{#1\thecontentslabel}}
-\newcommand{\tocsubsubsecnumfont}[1]{\def\SUF@SUBSUBSEC@thecontentslabel{#1\thecontentslabel}}
+\define@choicekey{}{tocpartfont}[\val\nr]
+ {roman,italic,smallcaps}[roman]{%
+\ifcase\nr\relax
+ \def\SUF@tocPART@font{\relax}
+\or
+ \def\SUF@tocPART@font{\itshape}
+\or
+ \def\SUF@tocPART@font{\expandafter\SUF@TOCtitlesmallcaps}
+\fi}
+\define@choicekey{}{tocchapfont}[\val\nr]
+ {roman,italic,smallcaps}[roman]{%
+\ifcase\nr\relax
+ \def\SUF@tocCHAP@font{\relax}
+\or
+ \def\SUF@tocCHAP@font{\itshape}
+\or
+ \def\SUF@tocCHAP@font{\expandafter\SUF@TOCtitlesmallcaps}
+\fi}
+\define@choicekey{}{tocsecfont}[\val\nr]
+ {roman,italic,smallcaps}[italic]{%
+\ifcase\nr\relax
+ \def\SUF@tocSEC@font{\relax}
+\or
+ \def\SUF@tocSEC@font{\itshape}
+\or
+ \def\SUF@tocSEC@font{\expandafter\SUF@TOCtitlesmallcaps}
+\fi}
+\define@choicekey{}{tocsubsecfont}[\val\nr]
+ {roman,italic,smallcaps}[roman]{%
+\ifcase\nr\relax
+ \def\SUF@tocSUBSEC@font{\relax}
+\or
+ \def\SUF@tocSUBSEC@font{\itshape}
+\or
+ \def\SUF@tocSUBSEC@font{\expandafter\SUF@TOCtitlesmallcaps}
+\fi}
+\define@choicekey{}{tocsubsubsecfont}[\val\nr]
+ {roman,italic,smallcaps}[roman]{%
+\ifcase\nr\relax
+ \def\SUF@tocSUBSUBSEC@font{\relax}
+\or
+ \def\SUF@tocSUBSUBSEC@font{\itshape}
+\or
+ \def\SUF@tocSUBSUBSEC@font{\expandafter\SUF@TOCtitlesmallcaps}
+\fi}
+\define@choicekey{}{tocauthorfont}[\val\nr]
+ {roman,italic,smallcaps}[roman]{%
+\ifcase\nr\relax
+ \def\SUF@tocAUT@font{\relax}
+\or
+ \def\SUF@tocAUT@font{\itshape}
+\or
+ \def\SUF@tocAUT@font{\expandafter\SUF@TOCtitlesmallcaps}
+\fi}
+\define@choicekey{}{toctitlefont}[\val\nr]
+ {roman,italic,smallcaps}[italic]{%
+\ifcase\nr\relax
+ \def\SUF@tocTIT@font{\relax}
+\or
+ \def\SUF@tocTIT@font{\itshape}
+\or
+ \def\SUF@tocTIT@font{\expandafter\SUF@TOCtitlesmallcaps}
+\fi}
% \end{macrocode}
-% \subsection*{Headers}
-%
-% \subsubsection*{Header style}
+% \subsubsection{Headers}
+% \paragraph{Header style}
% \begin{macrocode}
\define@choicekey{}{headerstyle}[\val\nr]
- {inner,center,plain,authortitleinner,
- authortitlecenter}[inner]{%
+ {inner,center,plain,authortitleinner,authortitlecenter}[inner]{%
\ifcase\nr\relax
\def\SUF@rightmark{\SUF@Rheadstyle{\rightmark}}
\def\SUF@leftmark{\SUF@Lheadstyle{\SUF@leftrightmark}}
@@ -2483,7 +2808,7 @@ dotarabic,dotroman,dotRoman}[arabic]{%
\suftesi@centerheadertrue
\fi}
% \end{macrocode}
-% \subsubsection*{Header font}
+% \paragraph{Header font}
% \begin{macrocode}
\define@choicekey{}{headerfont}[\val\nr]
{roman,italic,smallcaps}[roman]{%
@@ -2501,8 +2826,8 @@ dotarabic,dotroman,dotRoman}[arabic]{%
\def\SUF@thepage{\SUF@headingsmallcaps{\thepage}}
\fi}
% \end{macrocode}
-% \subsection*{Text elements}
-% \subsubsection*{Lists}
+% \subsubsection{Text elements}
+% \paragraph{Lists}
% \begin{macrocode}
\RequirePackage[inline]{enumitem}
\renewcommand\labelitemi{\color{sufgray}\textbullet}
@@ -2511,59 +2836,59 @@ dotarabic,dotroman,dotRoman}[arabic]{%
\define@choicekey{}{liststyle}[\val\nr]
{bulged,aligned,indented}[bulged]{%
\ifcase\nr\relax
- \setlist[enumerate,1]{leftmargin=0pt,label=\arabic*.}
- \setlist[enumerate,2]{leftmargin= 1.3\parindent,label=\alph*.}
- \setlist[enumerate,3]{leftmargin= 1.3\parindent,label=\roman*.}
- \setlist[itemize,1]{leftmargin=0pt}
- \setlist[itemize,2]{leftmargin=1.3\parindent}
- \setlist[itemize,3]{leftmargin=1.3\parindent}
-\or
- \setlist[enumerate,1]{leftmargin=1\parindent,label=\arabic*.}
- \setlist[enumerate,2]{leftmargin= 1.5\parindent,label=\alph*.}
- \setlist[enumerate,3]{leftmargin= 1.5\parindent,label=\roman*.}
- \setlist[itemize,1]{leftmargin=1\parindent}
- \setlist[itemize,2]{leftmargin=1.5\parindent}
- \setlist[itemize,3]{leftmargin=1.5\parindent}
-\or
- \setlist[enumerate,1]{leftmargin=2\parindent,label=\arabic*.}
- \setlist[enumerate,2]{leftmargin= 2.5\parindent,label=\alph*.}
- \setlist[enumerate,3]{leftmargin= 2.5\parindent,label=\roman*.}
- \setlist[itemize,1]{leftmargin=2\parindent}
- \setlist[itemize,2]{leftmargin=2.5\parindent}
- \setlist[itemize,3]{leftmargin=2.5\parindent}
+ \setlist[enumerate,1]{leftmargin=0pt,label=\arabic*.}
+ \setlist[enumerate,2]{leftmargin= 1.3\parindent,label=\alph*.}
+ \setlist[enumerate,3]{leftmargin= 1.3\parindent,label=\roman*.}
+ \setlist[itemize,1]{leftmargin=0pt}
+ \setlist[itemize,2]{leftmargin=1.3\parindent}
+ \setlist[itemize,3]{leftmargin=1.3\parindent}
+\or
+ \setlist[enumerate,1]{leftmargin=1\parindent,label=\arabic*.}
+ \setlist[enumerate,2]{leftmargin= 1.5\parindent,label=\alph*.}
+ \setlist[enumerate,3]{leftmargin= 1.5\parindent,label=\roman*.}
+ \setlist[itemize,1]{leftmargin=1\parindent}
+ \setlist[itemize,2]{leftmargin=1.5\parindent}
+ \setlist[itemize,3]{leftmargin=1.5\parindent}
+\or
+ \setlist[enumerate,1]{leftmargin=2\parindent,label=\arabic*.}
+ \setlist[enumerate,2]{leftmargin= 2.5\parindent,label=\alph*.}
+ \setlist[enumerate,3]{leftmargin= 2.5\parindent,label=\roman*.}
+ \setlist[itemize,1]{leftmargin=2\parindent}
+ \setlist[itemize,2]{leftmargin=2.5\parindent}
+ \setlist[itemize,3]{leftmargin=2.5\parindent}
\fi}
% \end{macrocode}
-% \subsubsection*{Quotations}
+% \paragraph{Quotations}
% \begin{macrocode}
\define@choicekey{}{quotestyle}[\val\nr]
{center,right}[center]{%
\ifcase\nr\relax
-\def\SUF@quote@style{\rightmargin=\parindent}
+ \def\SUF@quote@style{\rightmargin=\parindent}
\or
-\def\SUF@quote@style{}
+ \def\SUF@quote@style{}
\fi}
\define@choicekey{}{quotesize}[\val\nr]
{footnotesize,small}[footnotesize]{%
\ifcase\nr\relax
-\def\SUF@quotation@size{\footnotesize}
+ \def\SUF@quotation@size{\footnotesize}
\or
-\def\SUF@quotation@size{\small}
+ \def\SUF@quotation@size{\small}
\fi}
% \end{macrocode}
-% \subsubsection*{Footnotes}
+% \paragraph{Footnotes}
% \begin{macrocode}
\define@choicekey{}{footnotestyle}[\val\nr]
{bulged,hung,dotted,superscript}[bulged]{%
\ifcase\nr\relax
- \renewcommand\@makefntext{%
- \hskip-2.5em\makebox[2em][r]{\@thefnmark}\hskip.5em}
+ \renewcommand\@makefntext{%
+ \hskip-2.5em\makebox[2em][r]{\@thefnmark}\hskip.5em}
\or
- \renewcommand\@makefntext{%
- \leftskip=1em\hskip-1.5em%
- \makebox[1em][r]{\@thefnmark}\hskip.5em}
+ \renewcommand\@makefntext{%
+ \leftskip=1em\hskip-1.5em%
+ \makebox[1em][r]{\@thefnmark}\hskip.5em}
\or
- \renewcommand\@makefntext{%
- \@thefnmark.\hskip.5em}
+ \renewcommand\@makefntext{%
+ \@thefnmark.\hskip.5em}
\or
\renewcommand\@makefntext{%
\textsuperscript{\@thefnmark}\hskip.3em}
@@ -2576,7 +2901,7 @@ dotarabic,dotroman,dotRoman}[arabic]{%
\relax
\fi}
% \end{macrocode}
-% \subsubsection*{Captions}
+% \paragraph{Captions}
% \begin{macrocode}
\RequirePackage{caption}
\captionsetup{labelsep=period,font=small,textformat=period}
@@ -2584,15 +2909,14 @@ dotarabic,dotroman,dotRoman}[arabic]{%
{standard,sanserif,italic,smallcaps}[standard]{%
\ifcase\nr\relax
\or
- \captionsetup{font+=sf}
+ \captionsetup{font+=sf}
\or
- \captionsetup{font+=it}
+ \captionsetup{font+=it}
\or
- \captionsetup{labelfont=sc}
-\fi
-}
+ \captionsetup{labelfont=sc}
+\fi}
% \end{macrocode}
-% \subsubsection*{Marginal notes}
+% \paragraph{Marginal notes}
% \begin{macrocode}
\define@choicekey{}{marginpar}[\val\nr]
{true,false}[true]{%
@@ -2601,144 +2925,28 @@ dotarabic,dotroman,dotRoman}[arabic]{%
\renewcommand\marginpar[2][]{}
\fi}
% \end{macrocode}
-% \subsubsection*{Table of contents}
+% \subsubsection{Other options}
+% \paragraph{Part page}
% \begin{macrocode}
-\define@choicekey{}{tocstyle}[\val\nr]{%
- standard,dotted,ragged,leftpage}[standard]{%
-\ifcase\nr\relax
- \def\SUF@titlerule{\titlerule*{}}
- \def\SUF@chaptitlerule{\titlerule*{}}
-\or
-\suftesi@dottedtoctrue
- \def\SUF@titlerule{\titlerule*{\footnotesize .\ }}
- \def\SUF@chaptitlerule{\titlerule*{}}
-\or
-\suftesi@raggedtoctrue
- \def\SUF@titlerule{\hspace{1em}}
- \def\SUF@chaptitlerule{\hspace{1em}}
-\or
-\suftesi@pagelefttoctrue
-\fi}
-\define@choicekey{}{compacttoc}[\val\nr]{%
- sec,subsec,subsubsec}[sec]{%
- \ifcase\nr\relax
- \suftesi@toccompactsectrue
- \suftesi@toccompactsubsectrue
- \suftesi@toccompactsubsubsectrue
- \def\suf@sscorrect{\hskip.5em}
- \def\suf@ssscorrect{\hskip.5em}
- \def\suf@ctocdotsec{.}
- \def\suf@ctocdotssec{}
- \def\suf@ctocdotsssec{}
- \or
- \suftesi@toccompactsubsectrue
- \suftesi@toccompactsubsubsectrue
- \def\suf@sscorrect{\relax}
- \def\suf@ssscorrect{\hskip.5em}
- \def\suf@ctocdotssec{.}
- \def\suf@ctocdotsssec{}
- \or
- \suftesi@toccompactsubsubsectrue
- \def\suf@sscorrect{\relax}
- \def\suf@ssscorrect{\relax}
- \def\suf@ctocdotsssec{.}
- \fi}
-\define@choicekey{}{twocolcontents}[\val\nr]{%
- toc,lof,lot,toclof,toclot,loflot,all}[all]{%
-\ifcase\nr\relax
- \suftesi@twocolumntoctrue
- \setkeys{}{tocstyle=ragged}
-\or
- \suftesi@twocolumnloftrue
- \setkeys{}{tocstyle=ragged}
-\or
- \suftesi@twocolumnlottrue
- \setkeys{}{tocstyle=ragged}
-\or
- \suftesi@twocolumntoctrue
- \suftesi@twocolumnloftrue
- \setkeys{}{tocstyle=ragged}
-\or
- \suftesi@twocolumntoctrue
- \suftesi@twocolumnlottrue
- \setkeys{}{tocstyle=ragged}
-\or
- \suftesi@twocolumnloftrue
- \suftesi@twocolumnlottrue
- \setkeys{}{tocstyle=ragged}
-\or
- \suftesi@twocolumntoctrue
- \suftesi@twocolumnloftrue
- \suftesi@twocolumnlottrue
- \setkeys{}{tocstyle=ragged}
-\fi
-}
-% \end{macrocode}
-% \subsection*{Fonts}
-% \subsubsection*{Roman fonts}
-% \begin{macrocode}
-\define@choicekey{}{defaultfont}[\val\nr]{%
- none,cochineal,libertine,palatino,standard,compatibility}[cochineal]{%
-\ifcase\nr\relax
- \suftesi@nofonttrue
-\or
- \suftesi@cochinealtrue
-\or
- \suftesi@libertinetrue
-\or
- \suftesi@palatinotrue
-\or
- \suftesi@standardtrue
-\or
- \suftesi@compatibilitytrue
-\fi}
-\define@choicekey{}{mathfont}[\val\nr]{%
- none,minimal,extended}[minimal]{%
-\ifcase\nr\relax
- \suftesi@mathminimalfalse
- \suftesi@mathextendedfalse
-\or
- \suftesi@mathminimaltrue
-\or
- \suftesi@mathextendedtrue
-\fi}
-% \end{macrocode}
-% \subsubsection*{Greek fonts}
-% \begin{macrocode}
-\define@choicekey{}{greekfont}[\val\nr]{%
- none,artemisia,porson,bodoni,cbgreek}[none]{%
-\ifcase\nr\relax
-\suftesi@greekfontfalse
-\or
-\suftesi@greekfonttrue\suftesi@artemisiatrue
-\or
-\suftesi@greekfonttrue\suftesi@porsontrue
-\or
-\suftesi@greekfonttrue\suftesi@bodonitrue
-\or
-\suftesi@greekfonttrue\suftesi@cbgreektrue
-\fi}
-% \end{macrocode}
-% \subsection*{Other options}
-% \subsubsection*{Part page}
-% \begin{macrocode}
-\define@choicekey{}{partpage}[\val\nr]{true,false}[true]{%
+\define@choicekey{}{partpage}[\val\nr]
+ {true,false}[true]{%
\ifcase\nr\relax
\suftesi@partpagetrue
\or
\relax
\fi}
% \end{macrocode}
-% \subsubsection*{Draftdate}
+% \paragraph{Draftdate}
% \begin{macrocode}
\define@choicekey{}{draftdate}[\val\nr]
{true,false}[true]{%
\ifcase\nr\relax
\suftesi@draftdatetrue
\or
+ \relax
\fi}
% \end{macrocode}
-% \subsubsection*{View mode}
+% \paragraph{View mode}
% \begin{macrocode}
\define@choicekey{}{version}[\val\nr]
{screen,cscreen,draft,final}[draft]{%
@@ -2748,21 +2956,22 @@ dotarabic,dotroman,dotRoman}[arabic]{%
\suftesi@screentrue
\suftesi@screencenteredtrue
\or
+ \relax
\or
\AtBeginDocument{\crop[off]}
\fi}
\define@choicekey{}{crop}[\val\nr]
{true,false}[true]{%
-\ClassWarningNoLine{suftesi}{%
- 'crop' option is deprecated.\MessageBreak
- Use 'version' option instead}
+ \ClassWarningNoLine{suftesi}{%
+ 'crop' option is deprecated.\MessageBreak
+ Use 'version' option instead}
\ifcase\nr\relax
\setkeys{}{version=draft}
\or
\setkeys{}{version=screen}
\fi}
% \end{macrocode}
-% \subsubsection*{Titlepage}
+% \paragraph{Titlepage}
% \begin{macrocode}
\define@choicekey{}{titlepage}[\val\nr]
{true,false}[true]{%
@@ -2772,7 +2981,7 @@ dotarabic,dotroman,dotRoman}[arabic]{%
\@titlepagefalse
\fi}
% \end{macrocode}
-% \subsubsection*{Pre-defined styles}
+% \paragraph{Pre-defined styles}
% \begin{macrocode}
\define@choicekey{}{style}[\val\nr]
{roman1,roman2,roman3,roman4,roman5,roman6,
@@ -2784,7 +2993,7 @@ dotarabic,dotroman,dotRoman}[arabic]{%
[roman1]{%
\ifcase\nr\relax
% \end{macrocode}
-% \paragraph{The `roman' styles}
+% \subparagraph{The `roman' styles}
% \begin{macrocode}
\setkeys{}{chapstyle=left}
\or
@@ -2799,7 +3008,7 @@ dotarabic,dotroman,dotRoman}[arabic]{%
\setkeys{}{chapstyle=parright}
\or
% \end{macrocode}
-% \paragraph{The `italic' styles}
+% \subparagraph{The `italic' styles}
% \begin{macrocode}
\setkeys{}{
chapstyle=left,
@@ -2880,7 +3089,7 @@ dotarabic,dotroman,dotRoman}[arabic]{%
headerfont=italic}
\or
% \end{macrocode}
-% \paragraph{The smallcaps' styles}
+% \subparagraph{The `smallcaps' styles}
% \begin{macrocode}
\setkeys{}{
chapstyle=left,
@@ -2961,67 +3170,67 @@ dotarabic,dotroman,dotRoman}[arabic]{%
headerfont=smallcaps}
\or
% \end{macrocode}
-% \paragraph{The \opt{FSPL} styles}
+% \subparagraph{The \opt{FSPL} styles}
% \begin{macrocode}
\suftesi@periodicalaureotrue
\suftesi@FSPLtrue
\setkeys{}{%
- pagelayout=periodicalaureo,
- style=roman5,
- chapnumstyle=roman,
- headerstyle=inner,
- footnotestyle=hung,
- liststyle=indented,
- tocstyle=leftpage}
+ pagelayout=periodicalaureo,
+ style=roman5,
+ chapnumstyle=roman,
+ headerstyle=inner,
+ footnotestyle=hung,
+ liststyle=indented,
+ tocstyle=leftpage}
\disable@keys{}
-{structure,documentstructure,pagelayout,partfont,chapfont,secfont,%
-subsecfont,subsubsecfont,partstyle,chapstyle,secstyle,%
-subsecstyle,subsubsecstyle,partnumstyle,chapnumstyle,%
-secnumstyle,tocstyle,headerstyle,headerfont,quotestyle,%
-quotesize,footnotestyle,liststyle,captionstyle}
+ {structure,documentstructure,pagelayout,partfont,chapfont,secfont,%
+ subsecfont,subsubsecfont,partstyle,chapstyle,secstyle,%
+ subsecstyle,subsubsecstyle,partnumstyle,chapnumstyle,%
+ secnumstyle,tocstyle,headerstyle,headerfont,quotestyle,%
+ quotesize,footnotestyle,liststyle,captionstyle}
\or
\suftesi@periodicalaureotrue
\suftesi@FSPLtrue
\setkeys{}{%
- pagelayout=periodicalaureo,
- style=italic5,
- chapnumstyle=roman,
- headerstyle=inner,
- headerfont=italic,
- footnotestyle=hung,
- liststyle=indented,
- tocstyle=leftpage}
+ pagelayout=periodicalaureo,
+ style=italic5,
+ chapnumstyle=roman,
+ headerstyle=inner,
+ headerfont=italic,
+ footnotestyle=hung,
+ liststyle=indented,
+ tocstyle=leftpage}
\disable@keys{}
-{structure,documentstructure,pagelayout,partfont,chapfont,secfont,%
-subsecfont,subsubsecfont,partstyle,chapstyle,secstyle,%
-subsecstyle,subsubsecstyle,partnumstyle,chapnumstyle,%
-secnumstyle,tocstyle,headerstyle,headerfont,quotestyle,%
-quotesize,footnotestyle,liststyle,captionstyle}
+ {structure,documentstructure,pagelayout,partfont,chapfont,secfont,%
+ subsecfont,subsubsecfont,partstyle,chapstyle,secstyle,%
+ subsecstyle,subsubsecstyle,partnumstyle,chapnumstyle,%
+ secnumstyle,tocstyle,headerstyle,headerfont,quotestyle,%
+ quotesize,footnotestyle,liststyle,captionstyle}
\or
\suftesi@periodicalaureotrue
\suftesi@FSPLtrue
\setkeys{}{%
- pagelayout=periodicalaureo,
- style=smallcaps5,
- chapnumstyle=roman,
- headerstyle=inner,
- headerfont=smallcaps,
- secfont=smallcaps,
- footnotestyle=hung,
- liststyle=indented,
- tocstyle=leftpage}
+ pagelayout=periodicalaureo,
+ style=smallcaps5,
+ chapnumstyle=roman,
+ headerstyle=inner,
+ headerfont=smallcaps,
+ secfont=smallcaps,
+ footnotestyle=hung,
+ liststyle=indented,
+ tocstyle=leftpage}
\disable@keys{}
-{structure,documentstructure,pagelayout,partfont,chapfont,secfont,%
-subsecfont,subsubsecfont,partstyle,chapstyle,secstyle,%
-subsecstyle,subsubsecstyle,partnumstyle,chapnumstyle,%
-secnumstyle,tocstyle,headerstyle,headerfont,quotestyle,%
-quotesize,footnotestyle,liststyle,captionstyle}
+ {structure,documentstructure,pagelayout,partfont,chapfont,secfont,%
+ subsecfont,subsubsecfont,partstyle,chapstyle,secstyle,%
+ subsecstyle,subsubsecstyle,partnumstyle,chapnumstyle,%
+ secnumstyle,tocstyle,headerstyle,headerfont,quotestyle,%
+ quotesize,footnotestyle,liststyle,captionstyle}
\fi}
% \end{macrocode}
-% \subsubsection*{Options for \opt{collection} document structure}
+% \paragraph{Options for the \opt{collection} document structure}
% \begin{macrocode}
-\define@choicekey{}{papertitlestyle}[\val\nr]{%
- left,center,right}[left]{%
+\define@choicekey{}{papertitlestyle}[\val\nr]
+ {left,center,right}[left]{%
\ifcase\nr\relax
\def\SUF@lr@coll@titleSwitch{\filright}
\or
@@ -3032,27 +3241,30 @@ quotesize,footnotestyle,liststyle,captionstyle}
\define@choicekey{}{revauthortitle}[\val\nr]
{true,false}[false]{%
\ifcase\nr\relax
-\suftesi@reverseauthortitletrue
-\or\relax
+ \suftesi@reverseauthortitletrue
+\or
+ \relax
\fi}
-\define@choicekey{}{titlefont}[\val\nr]{roman,italic,smallcaps}[roman]{%
+\define@choicekey{}{titlefont}[\val\nr]
+ {roman,italic,smallcaps}[roman]{%
\ifcase\nr\relax
-\def\SUF@titlefont@Switch{\relax}
+ \def\SUF@titlefont@Switch{\relax}
\or
-\def\SUF@titlefont@Switch{\itshape}
+ \def\SUF@titlefont@Switch{\itshape}
\or
-\def\SUF@titlefont@Switch{\expandafter\SUF@titlesmallcaps}
+ \def\SUF@titlefont@Switch{\expandafter\SUF@titlesmallcaps}
\fi}
-\define@choicekey{}{authorfont}[\val\nr]{roman,italic,smallcaps}[roman]{%
+\define@choicekey{}{authorfont}[\val\nr]
+ {roman,italic,smallcaps}[roman]{%
\ifcase\nr\relax
-\def\SUF@authorfont@Switch{\relax}
+ \def\SUF@authorfont@Switch{\relax}
\or
-\def\SUF@authorfont@Switch{\itshape}
+ \def\SUF@authorfont@Switch{\itshape}
\or
-\def\SUF@authorfont@Switch{\expandafter\SUF@titlesmallcaps}
+ \def\SUF@authorfont@Switch{\expandafter\SUF@titlesmallcaps}
\fi}
% \end{macrocode}
-% \subsection*{Execute and process options}
+% \subsubsection{Execute options}
% \begin{macrocode}
\ExecuteOptionsX<>{
structure=book,
@@ -3091,6 +3303,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
tocauthorfont=roman,
revauthortitle=false,
papertitlestyle=left,
+ tocpartfont=roman,
tocchapfont=roman,
tocsecfont=roman,
tocsubsecfont=roman,
@@ -3103,15 +3316,24 @@ quotesize,footnotestyle,liststyle,captionstyle}
% so that the option will not produce the ``Unused global options''
% message:
% \begin{macrocode}
-\XKV@useoption{a4paper} \XKV@useoption{10pt}
-\XKV@useoption{11pt} \XKV@useoption{12pt}
-\XKV@useoption{oneside} \XKV@useoption{twoside}
-\XKV@useoption{onecolumn} \XKV@useoption{twocolumn}
-\XKV@useoption{titlepage} \XKV@useoption{notitlepage}
-\XKV@useoption{openright} \XKV@useoption{openany}
-\XKV@useoption{leqno} \XKV@useoption{fleqn}
-\XKV@useoption{a5paper} \XKV@useoption{b5paper}
-\XKV@useoption{legalpaper}\XKV@useoption{executivepaper}
+\XKV@useoption{a4paper}
+\XKV@useoption{10pt}
+\XKV@useoption{11pt}
+\XKV@useoption{12pt}
+\XKV@useoption{oneside}
+\XKV@useoption{twoside}
+\XKV@useoption{onecolumn}
+\XKV@useoption{twocolumn}
+\XKV@useoption{titlepage}
+\XKV@useoption{notitlepage}
+\XKV@useoption{openright}
+\XKV@useoption{openany}
+\XKV@useoption{leqno}
+\XKV@useoption{fleqn}
+\XKV@useoption{a5paper}
+\XKV@useoption{b5paper}
+\XKV@useoption{legalpaper}
+\XKV@useoption{executivepaper}
\XKV@useoption{landscape}
% \end{macrocode}
% A trick to delete the class options from \cmd{XKV@classoptionslist},
@@ -3120,19 +3342,19 @@ quotesize,footnotestyle,liststyle,captionstyle}
% \begin{macrocode}
\def\XKV@classoptionslist{}
% \end{macrocode}
-% \subsection*{Basic packages}
+% \subsection{Basic packages}
% \begin{macrocode}
\RequirePackage{multicol}
\RequirePackage{emptypage}
\RequirePackage{microtype}
\RequirePackage{color}
-\definecolor{sufred}{rgb}{0.5,0,0}
-\definecolor{sufgray}{rgb}{0.5,0.5,0.5}
+ \definecolor{sufred}{rgb}{0.5,0,0}
+ \definecolor{sufgray}{rgb}{0.5,0.5,0.5}
\RequirePackage{iftex}
- \ifLuaTeX
- \RequirePackage{luatex85}
- \else
- \fi
+\ifLuaTeX
+ \RequirePackage{luatex85}
+ \else
+\fi
% \end{macrocode}
% The FSPL style requires a verbose colophon which uses specific icons:
% \begin{macrocode}
@@ -3141,25 +3363,23 @@ quotesize,footnotestyle,liststyle,captionstyle}
\else
\fi
% \end{macrocode}
-% \subsection*{Page layouts}
+% If \opt{version=screen} or \opt{version=cscreen} the \sty{crop} package is not loaded. This can create problems if the \cmd{crop} command has been used in the document, for example to remove the crop marks from a certain page onwards (with \cmd{crop}|[off]|). For this reason, the \cmd{crop} command is defined (in practice it is rendered ineffective) so as not to produce errors if it had been used within the document.
% \begin{macrocode}
\ifsuftesi@screen
\newcommand*\crop[1][]{}
\ifsuftesi@screencentered
\geometry{hmarginratio=1:1}
- \else
- \fi
-\else
- \RequirePackage[a4,cam,center]{crop}
+ \fi
+ \else
+ \RequirePackage[a4,cam,center]{crop}
\fi
% \end{macrocode}
-%
-% \subsection*{Fonts}
-%
-% With \XeTeX{} we do not load any fonts. Anyway the \sty{fontspec}
-% package is required because some commands of the class are base on it.
+% \subsection{Fonts}
+% If you use \hologo{XeLaTeX} or \hologo{LuaLaTeX} no default font is loaded.
+% Anyway the \sty{fontspec} package is required because some commands
+% of the class are base on it. If \sty{fontspec} is not loaded, a class error will be issued.
% \begin{macrocode}
-\unless\ifPDFTeX%if xelatex or lualatex
+\unless\ifPDFTeX
\AtBeginDocument{%
\@ifpackageloaded{fontspec}
{\relax}
@@ -3175,9 +3395,8 @@ quotesize,footnotestyle,liststyle,captionstyle}
* load either 'fontspec' or 'mathspec'\MessageBreak
* For using suftesi with LuaLaTeX\MessageBreak
* load 'fontspec' \MessageBreak
- ************************************}}
- }
-\else% if pdftex
+ ************************************}}}
+\else
\RequirePackage[LGR,T1]{fontenc}
\RequirePackage{substitutefont}
\AtBeginDocument{\fontencoding{T1}\selectfont}
@@ -3188,19 +3407,19 @@ quotesize,footnotestyle,liststyle,captionstyle}
% A warning appears if the \opt{cbgreek} option is unused.
% \begin{macrocode}
\ifsuftesi@nofont
- \ifsuftesi@greekfont
- \ClassWarningNoLine{suftesi}{%
- Unused 'greekfont' option}%
- \suftesi@greekfontfalse
- \else\suftesi@greekfontfalse\fi
+\ifsuftesi@greekfont
+ \ClassWarningNoLine{suftesi}{%
+ Unused 'greekfont' option}%
+ \suftesi@greekfontfalse
+ \else\suftesi@greekfontfalse\fi
\else
\ifsuftesi@standard
\RequirePackage{lmodern}
\ifsuftesi@greekfont
- \ClassWarningNoLine{suftesi}{%
- Unused 'greekfont' option}%
- \suftesi@greekfontfalse
- \else\suftesi@greekfontfalse\fi
+ \ClassWarningNoLine{suftesi}{%
+ Unused 'greekfont' option}%
+ \suftesi@greekfontfalse
+ \else\suftesi@greekfontfalse\fi
\else
% \end{macrocode}
% Previous versions of the class were based on
@@ -3209,135 +3428,135 @@ quotesize,footnotestyle,liststyle,captionstyle}
% for backward compatibility.
% \begin{macrocode}
\ifsuftesi@compatibility
- \RequirePackage[osf,sc]{mathpazo}
- \RequirePackage[scaled=0.8]{beramono}
- \renewcommand{\sfdefault}{iwona}
- \ifsuftesi@greekfont
- \ifsuftesi@bodoni
- \gdef\SUFfntscale{0.96}
- \else
- \ifsuftesi@artemisia
- \gdef\SUFfntscale{0.97}
- \else
- \ifsuftesi@porson
- \gdef\SUFfntscale{1.18}
- \else
- \ifsuftesi@cbgreek
- \def\lmfntscale{1.06}
- \else
- \fi
- \fi
- \fi
- \fi
- \else
- \ClassWarningNoLine{suftesi}{\MessageBreak
- If you need the Greek font remember\MessageBreak
- to set one of the following options:\MessageBreak
- greekfont=artemisia,\MessageBreak
- greekfont=porson,\MessageBreak
- greekfont=cbgreek}
- \fi
+ \RequirePackage[osf,sc]{mathpazo}
+ \RequirePackage[scaled=0.8]{beramono}
+ \renewcommand{\sfdefault}{iwona}
+ \ifsuftesi@greekfont
+ \ifsuftesi@bodoni
+ \gdef\SUFfntscale{0.96}
+ \else
+ \ifsuftesi@artemisia
+ \gdef\SUFfntscale{0.97}
+ \else
+ \ifsuftesi@porson
+ \gdef\SUFfntscale{1.17}
+ \else
+ \ifsuftesi@cbgreek
+ \def\lmfntscale{1.06}
+ \else
+ \fi
+ \fi
+ \fi
+ \fi
+ \else
+ \ClassWarningNoLine{suftesi}{\MessageBreak
+ If you need the Greek font remember\MessageBreak
+ to set one of the following options:\MessageBreak
+ greekfont=artemisia,\MessageBreak
+ greekfont=porson,\MessageBreak
+ greekfont=cbgreek}
+ \fi
\else
\ifsuftesi@palatino
\RequirePackage[full]{textcomp}
- \RequirePackage{newpxtext}
- \RequirePackage[scaled=1.06]{biolinum}
- \RequirePackage[varqu,varl]{inconsolata}
- \ifsuftesi@mathextended
- \RequirePackage{amsthm}
- \RequirePackage[bigdelims,vvarbb]{newpxmath}
- \RequirePackage[cal=boondoxo]{mathalfa}
- \else
- \ifsuftesi@mathminimal
- \RequirePackage[bigdelims,vvarbb]{newpxmath}
- \else
- \fi
- \fi
- \useosf
- \useproportional
- \ifsuftesi@greekfont
- \ifsuftesi@bodoni
- \gdef\SUFfntscale{0.96}
- \else
- \ifsuftesi@artemisia
- \gdef\SUFfntscale{0.97}
- \else
- \ifsuftesi@porson
- \gdef\SUFfntscale{1.18}
- \else
- \ifsuftesi@cbgreek
- \def\lmfntscale{1.06}
- \else
- \fi
- \fi
- \fi
- \fi
- \else
- \ClassWarningNoLine{suftesi}{\MessageBreak
- If you need the Greek font remember\MessageBreak
- to set one of the following options:\MessageBreak
- greekfont=artemisia,\MessageBreak
- greekfont=porson,\MessageBreak
- greekfont=cbgreek}
- \fi
+ \RequirePackage{newpxtext}
+ \RequirePackage[scaled=1.06]{biolinum}
+ \RequirePackage[varqu,varl]{inconsolata}
+ \ifsuftesi@mathextended
+ \RequirePackage{amsthm}
+ \RequirePackage[bigdelims,vvarbb]{newpxmath}
+ \RequirePackage[cal=boondoxo]{mathalpha}
+ \else
+ \ifsuftesi@mathminimal
+ \RequirePackage[bigdelims,vvarbb]{newpxmath}
+ \else
+ \fi
+ \fi
+ \useosf
+ \useproportional
+ \ifsuftesi@greekfont
+ \ifsuftesi@bodoni
+ \gdef\SUFfntscale{0.96}
+ \else
+ \ifsuftesi@artemisia
+ \gdef\SUFfntscale{0.97}
+ \else
+ \ifsuftesi@porson
+ \gdef\SUFfntscale{1.17}
+ \else
+ \ifsuftesi@cbgreek
+ \def\lmfntscale{1.06}
+ \else
+ \fi
+ \fi
+ \fi
+ \fi
+ \else
+ \ClassWarningNoLine{suftesi}{\MessageBreak
+ If you need the Greek font remember\MessageBreak
+ to set one of the following options:\MessageBreak
+ greekfont=artemisia,\MessageBreak
+ greekfont=porson,\MessageBreak
+ greekfont=cbgreek}
+ \fi
\else
\ifsuftesi@libertine
\RequirePackage{textcomp}
- \RequirePackage[sb]{libertine}
- \RequirePackage[varqu,varl,scaled=0.94]{inconsolata}
- \ifsuftesi@mathextended
- \RequirePackage{amsthm}
- \RequirePackage{libertinust1math}
- \RequirePackage[cal=stix,scr=boondoxo,bb=boondox]{mathalfa}
- \else
- \ifsuftesi@mathminimal
- \RequirePackage{libertinust1math}
- \else
- \fi
- \fi
- \useosf
- \ifsuftesi@bodoni
- \gdef\SUFfntscale{0.9}
- \else
- \ifsuftesi@artemisia
- \gdef\SUFfntscale{0.91}
- \else
- \ifsuftesi@porson
- \gdef\SUFfntscale{1.1}
- \else
- \fi
- \fi
- \fi
+ \RequirePackage[sb]{libertine}
+ \RequirePackage[varqu,varl,scaled=0.94]{inconsolata}
+ \ifsuftesi@mathextended
+ \RequirePackage{amsthm}
+ \RequirePackage{libertinust1math}
+ \RequirePackage[cal=stix,scr=boondoxo,bb=boondox]{mathalpha}
+ \else
+ \ifsuftesi@mathminimal
+ \RequirePackage{libertinust1math}
+ \else
+ \fi
+ \fi
+ \useosf
+ \ifsuftesi@bodoni
+ \gdef\SUFfntscale{0.9}
+ \else
+ \ifsuftesi@artemisia
+ \gdef\SUFfntscale{0.91}
+ \else
+ \ifsuftesi@porson
+ \gdef\SUFfntscale{1.1}
+ \else
+ \fi
+ \fi
+ \fi
\else
\ifsuftesi@cochineal
\RequirePackage{textcomp}
- \RequirePackage{cochineal}
- \RequirePackage[varqu,varl,var0]{inconsolata}
- \RequirePackage{biolinum}
- \ifsuftesi@mathextended
- \RequirePackage{amsthm}
- \RequirePackage[cochineal,bigdelims,cmintegrals,vvarbb]{newtxmath}
- \RequirePackage[cal=boondoxo]{mathalfa}
- \else
- \ifsuftesi@mathminimal
- \RequirePackage[cochineal,bigdelims,cmintegrals,vvarbb]{newtxmath}
- \else
- \fi
- \fi
- \useosf
- \useproportional
- \ifsuftesi@bodoni
- \gdef\SUFfntscale{0.9}
- \else
- \ifsuftesi@artemisia
- \gdef\SUFfntscale{0.905}
- \else
- \ifsuftesi@porson
- \gdef\SUFfntscale{1.1}
- \else
- \fi
- \fi
- \fi
+ \RequirePackage{cochineal}
+ \RequirePackage[varqu,varl,var0]{inconsolata}
+ \RequirePackage{biolinum}
+ \ifsuftesi@mathextended
+ \RequirePackage{amsthm}
+ \RequirePackage[cochineal,bigdelims,cmintegrals,vvarbb]{newtxmath}
+ \RequirePackage[cal=boondoxo]{mathalpha}
+ \else
+ \ifsuftesi@mathminimal
+ \RequirePackage[cochineal,bigdelims,cmintegrals,vvarbb]{newtxmath}
+ \else
+ \fi
+ \fi
+ \useosf
+ \useproportional
+ \ifsuftesi@bodoni
+ \gdef\SUFfntscale{0.9}
+ \else
+ \ifsuftesi@artemisia
+ \gdef\SUFfntscale{0.905}
+ \else
+ \ifsuftesi@porson
+ \gdef\SUFfntscale{1.1}
+ \else
+ \fi
+ \fi
+ \fi
\else
\fi
\fi
@@ -3346,9 +3565,6 @@ quotesize,footnotestyle,liststyle,captionstyle}
\fi
\fi
\fi
-% \end{macrocode}
-%
-% \begin{macrocode}
\unless\ifPDFTeX\else
\ifsuftesi@greekfont
\ifsuftesi@artemisia
@@ -3368,19 +3584,22 @@ quotesize,footnotestyle,liststyle,captionstyle}
\fi
\fi
% \end{macrocode}
-% Thanks to Claudio Beccari for the following macro.
+%The following macro was created by Claudio Beccari. Some time later, Massimiliano Dominici suggested the use of \cmd{AtEndPreamble} instead of \cmd{AtBeginDocument}, to make the \env{otherlanguage} environment work.
% \begin{macrocode}
- \AtBeginDocument{
- \substitutefont{LGR}{\rmdefault}{\SUF@greekfamily}
- \DeclareRobustCommand{\greektext}{%
- \usefont{LGR}{\SUF@greekfamily}{\f@series}{\f@shape}
- \def\encodingdefault{LGR}}
- \DeclareTextFontCommand{\textgreek}{\greektext}}
+\AtEndPreamble{
+ \substitutefont{LGR}{\rmdefault}{\SUF@greekfamily}
+ \DeclareRobustCommand{\greektext}{%
+ \usefont{LGR}{\SUF@greekfamily}{\f@series}{\f@shape}
+ \def\encodingdefault{LGR}}
+ \DeclareTextFontCommand{\textgreek}{\greektext}}
\ifsuftesi@cbgreek
\else
% \end{macrocode}
% We redefine the font definitions of the GFS fonts
% in order to scale the fonts according to the roman default.
+% The first code for the Porson font (\sty{suftesi} <v.2.4) has been written
+% by Enrico Gregorio. Claudio Beccari successively added the code to improve the
+% scale factor when using this greek font in combination with Palatino.
% \begin{macrocode}
\DeclareFontFamily{LGR}{bodoni}{}
\DeclareFontShape{LGR}{bodoni}{m}{n}{<-> s * [\SUFfntscale] gbodonirg6a}{}
@@ -3427,19 +3646,19 @@ quotesize,footnotestyle,liststyle,captionstyle}
\fi
\fi
% \end{macrocode}
-% \subsection*{Section titles}
+% \subsection{Section titles}
% \begin{macrocode}
-\RequirePackage{titlesec}
- \newlength{\sectionsep}
- \setlength{\sectionsep}{\dimexpr(\baselineskip) plus 1pt minus 1pt}
-\unless\ifPDFTeX% if xetex or luatex
+\RequirePackage[newparttoc]{titlesec}
+ \newlength{\sectionsep}
+ \setlength{\sectionsep}{\dimexpr(\baselineskip) plus 1pt minus 1pt}
+\unless\ifPDFTeX
\DeclareRobustCommand{\SUF@TOCtitlesmallcaps}[1]{%
\addfontfeature{LetterSpace=10}\scshape\suftesi@MakeTextTOCLowercase{#1}}
\DeclareRobustCommand{\SUF@titlesmallcaps}[1]{%
\addfontfeature{LetterSpace=10}\scshape\suftesi@MakeTextLowercase{#1}}
\DeclareRobustCommand{\SUF@headingsmallcaps}[1]{%
\addfontfeature{LetterSpace=10}\scshape\suftesi@MakeTextLowercase{#1}}
-\else% if pdftex
+\else
\DeclareRobustCommand{\SUF@TOCtitlesmallcaps}[1]{%
\scshape\suftesi@MakeTextTOCLowercase{\textls*{#1}}}%
\DeclareRobustCommand{\SUF@titlesmallcaps}[1]{%
@@ -3448,7 +3667,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
\scshape\suftesi@MakeTextLowercase{\textls*{#1}}}%
\fi
% \end{macrocode}
-% Default styles:
+% \subsubsection{Default styles}
% \begin{macrocode}
\newlength\SUF@ADJnumparchap
\def\SUF@default@CHAPTER{
@@ -3470,93 +3689,57 @@ quotesize,footnotestyle,liststyle,captionstyle}
\else
\setlength{\SUF@ADJnumparchap}{0pt}
\fi}
-% \end{macrocode}
-% \begin{macrocode}
\def\SUF@default@SECTIONS{
\ifsuftesi@numparsec
-% \titleformat{\section}[display]
-% {\SUF@sectionsize\SUF@lr@SECSwitch}
-% {\ifsuftesi@article\SUF@thesection
-% \else\thesection\fi\SUF@dotsec}
-% {0ex}
-% {\SUF@SEC@StyleSwitch}
-\titleformat{\section}[display]
-{\SUF@sectionsize\SUF@lr@SECSwitch}
-{\SUF@thesection\SUF@dotsec}
-{0ex}
-{\SUF@SEC@StyleSwitch}
- \titlespacing*{\section}{0em}{\sectionsep}{\sectionsep}[0em]
+ \titleformat{\section}[display]
+ {\SUF@sectionsize\SUF@lr@SECSwitch}
+ {\SUF@thesection\SUF@dotsec}
+ {0ex}
+ {\SUF@SEC@StyleSwitch}
+ \titlespacing*{\section}{0em}{\sectionsep}{\sectionsep}[0em]
\else
-% \titleformat{\section}[hang]
-% {\SUF@sectionsize\SUF@lr@SECSwitch}
-% {\ifsuftesi@article\SUF@thesection
-% \else\thesection\fi\SUF@dotsec}
-% {1em}
-% {\SUF@SEC@StyleSwitch}
-\titleformat{\section}[hang]
-{\SUF@sectionsize\SUF@lr@SECSwitch}
-{\SUF@thesection\SUF@dotsec}
-{1em}
-{\SUF@SEC@StyleSwitch}
- \titlespacing*{\section}{0ex}{\sectionsep}{\sectionsep}[0ex]
+ \titleformat{\section}[hang]
+ {\SUF@sectionsize\SUF@lr@SECSwitch}
+ {\SUF@thesection\SUF@dotsec}
+ {1em}
+ {\SUF@SEC@StyleSwitch}
+ \titlespacing*{\section}{0ex}{\sectionsep}{\sectionsep}[0ex]
\fi
-% \end{macrocode}
-% \begin{macrocode}
\ifsuftesi@numparsubsec
-% \titleformat{\subsection}[display]
-% {\SUF@subsectionsize\SUF@lr@SUBSECSwitch}
-% {\textnormal\thesubsection}
-% {0ex}
-% {\SUF@SUBSEC@StyleSwitch}
-\titleformat{\subsection}[display]
-{\SUF@subsectionsize\SUF@lr@SUBSECSwitch}
-{\textnormal\SUF@thesubsection\SUF@dotsubsec}
-{0ex}
-{\SUF@SUBSEC@StyleSwitch}
- \titlespacing*{\subsection}{0em}{\sectionsep}{\sectionsep}[0em]
+ \titleformat{\subsection}[display]
+ {\SUF@subsectionsize\SUF@lr@SUBSECSwitch}
+ {\textnormal\SUF@thesubsection\SUF@dotsubsec}
+ {0ex}
+ {\SUF@SUBSEC@StyleSwitch}
+ \titlespacing*{\subsection}{0em}{\sectionsep}{\sectionsep}[0em]
\else
-% \titleformat{\subsection}[hang]
-% {\SUF@subsectionsize\SUF@lr@SUBSECSwitch}
-% {\textnormal\thesubsection}
-% {1em}
-% {\SUF@SUBSEC@StyleSwitch}
-\titleformat{\subsection}[hang]
-{\SUF@subsectionsize\SUF@lr@SUBSECSwitch}
-{\textnormal\SUF@thesubsection\SUF@dotsubsec}
-{1em}
-{\SUF@SUBSEC@StyleSwitch}
- \titlespacing*{\subsection}{\parindent}{\sectionsep}{\sectionsep}[0ex]
+ \titleformat{\subsection}[hang]
+ {\SUF@subsectionsize\SUF@lr@SUBSECSwitch}
+ {\textnormal\SUF@thesubsection\SUF@dotsubsec}
+ {1em}
+ {\SUF@SUBSEC@StyleSwitch}
+ \titlespacing*{\subsection}{\parindent}{\sectionsep}{\sectionsep}[0ex]
\fi
-% \end{macrocode}
-% \begin{macrocode}
\ifsuftesi@numparsubsubsec
-% \titleformat{\subsubsection}[display]
-% {\SUF@subsectionsize\SUF@lr@SUBSUBSECSwitch}
-% {\textnormal\thesubsubsection}
-% {0ex}
-% {\SUF@SUBSUBSEC@StyleSwitch}
-\titleformat{\subsubsection}[display]
-{\SUF@subsectionsize\SUF@lr@SUBSUBSECSwitch}
-{\textnormal\SUF@thesubsubsection\SUF@dotsubsubsec}
-{0ex}
-{\SUF@SUBSUBSEC@StyleSwitch}
- \titlespacing*{\subsubsection}{0em}{\sectionsep}{\sectionsep}[0em]
+ \titleformat{\subsubsection}[display]
+ {\SUF@subsectionsize\SUF@lr@SUBSUBSECSwitch}
+ {\textnormal\SUF@thesubsubsection\SUF@dotsubsubsec}
+ {0ex}
+ {\SUF@SUBSUBSEC@StyleSwitch}
+ \titlespacing*{\subsubsection}{0em}{\sectionsep}{\sectionsep}[0em]
\else
-% \titleformat{\subsubsection}[hang]
-% {\SUF@subsectionsize\SUF@lr@SUBSUBSECSwitch}
-% {\textnormal\thesubsubsection}
-% {1em}
-% {\SUF@SUBSUBSEC@StyleSwitch}
-\titleformat{\subsubsection}[hang]
-{\SUF@subsectionsize\SUF@lr@SUBSUBSECSwitch}
-{\textnormal\SUF@thesubsubsection\SUF@dotsubsubsec}
-{1em}
-{\SUF@SUBSUBSEC@StyleSwitch}
- \titlespacing*{\subsubsection}{\parindent}{\sectionsep}{\sectionsep}[0ex]
- \fi
-}
+ \titleformat{\subsubsection}[hang]
+ {\SUF@subsectionsize\SUF@lr@SUBSUBSECSwitch}
+ {\textnormal\SUF@thesubsubsection\SUF@dotsubsubsec}
+ {1em}
+ {\SUF@SUBSUBSEC@StyleSwitch}
+ \titlespacing*{\subsubsection}{\parindent}{\sectionsep}{\sectionsep}[0ex]
+ \fi}
\SUF@default@CHAPTER
\SUF@default@SECTIONS
+% \end{macrocode}
+% \subsubsection{Sections spacing}
+% \begin{macrocode}
\ifsuftesi@periodical
\titlespacing*{\chapter}{0em}{\SUF@ADJnumparchap}{18ex}
\titlespacing*{name=\chapter,numberless}{0em}{0pt}{18ex}
@@ -3582,7 +3765,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
\titlespacing*{name=\chapter,numberless}{0em}{0pt}{18ex}
\else%standard/standardaureo
\titlespacing*{\chapter}{0em}{%
- \dimexpr(6ex+\SUF@ADJnumparchap)}{18ex}
+ \dimexpr(6ex+\SUF@ADJnumparchap)}{18ex}
\titlespacing*{name=\chapter,numberless}{0em}{6ex}{18ex}
\fi
\fi
@@ -3591,73 +3774,112 @@ quotesize,footnotestyle,liststyle,captionstyle}
\fi
\fi
% \end{macrocode}
-% \paragraph{Redefinitions for \opt{`article'} mode}
+% Some redefinitions for \opt{article} mode:
% \begin{macrocode}
\ifsuftesi@article
\def\chapter#1{\ClassError{suftesi}
- {\noexpand\chapter level is undefined
- using 'structure=article'}
- {\noexpand\chapter level is undefined
- using 'structure=article'}}
- \setcounter{tocdepth}{3}
- \setcounter{secnumdepth}{3}
- \renewcommand\thesection{%
- \@arabic\c@section}
- \renewcommand\thesubsection{%
- \thesection.\@arabic\c@subsection}
- \renewcommand\thesubsubsection{%
- \thesubsection.\@arabic\c@subsubsection}
- \renewcommand\theparagraph{%
- \thesubsubsection.\@arabic\c@paragraph}
- \renewcommand\thesubparagraph{%
- \theparagraph.\@arabic\c@subparagraph}
+ {\noexpand\chapter level is undefined
+ using 'structure=article'}
+ {\noexpand\chapter level is undefined
+ using 'structure=article'}}
+\setcounter{tocdepth}{3}
+\setcounter{secnumdepth}{3}
+\renewcommand\thesection{%
+ \@arabic\c@section}
+\renewcommand\thesubsection{%
+ \thesection.\@arabic\c@subsection}
+\renewcommand\thesubsubsection{%
+ \thesubsection.\@arabic\c@subsubsection}
+\renewcommand\theparagraph{%
+ \thesubsubsection.\@arabic\c@paragraph}
+\renewcommand\thesubparagraph{%
+ \theparagraph.\@arabic\c@subparagraph}
% \end{macrocode}
-% The \opt{partpage} options allows you to print a standard part page
-% in \opt{article} mode.
+% \subsection*{The \cmd{part} command}
% \begin{macrocode}
-\ifsuftesi@partpage
- \relax
- \else
-% \end{macrocode}
-% In \opt{article} mode the \cmd{part} command is similar to a
-% \cmd{section} but with more vertical space before and after.
-% \begin{macrocode}
- \titleclass{\part}{straight}
- \titlespacing*{\part}{0ex}{2\sectionsep}{2\sectionsep}[0ex]
-\fi
-\ifsuftesi@numparpart
-\titleformat{\part}[display]
- {\SUF@partsize\SUF@lr@PARTSwitch}
- {\SUF@PART@StyleSwitch\partname\hskip.5em\SUF@thepart\SUF@dotpart}
- {2ex}
- {\SUF@PART@StyleSwitch}
-\else
-\titleformat{\part}[hang]
- {\SUF@partsize\SUF@lr@PARTSwitch}
- {\SUF@PART@StyleSwitch\partname\hskip.5em\SUF@thepart\SUF@dotpart}
- {1em}
- {\SUF@PART@StyleSwitch}
+\renewcommand\part{%
+ \ifsuftesi@partpage
+ \if@openright
+ \cleardoublepage
+ \else
+ \clearpage
+ \fi
+ \thispagestyle{plain}%
+ \fi
+ \if@twocolumn
+ \onecolumn
+ \@tempswatrue
+ \else
+ \@tempswafalse
+ \fi
+ \ifsuftesi@partpage
+ \null\vfil
+ \fi
+ \secdef\@part\@spart}
\fi
+
+\def\@part[#1]#2{%
+ \ifnum \c@secnumdepth >-2\relax
+ \refstepcounter{part}%
+ \addcontentsline{toc}{part}{\normalfont\normalsize
+ \SUF@tocpartname\hskip.5em{\SUF@tocPARTnum@font\SUF@thepart}%
+ \SUF@dotpart\hspace{1em}\SUF@tocPART@font#1}%
+ \else
+ \addcontentsline{toc}{part}{\normalfont\normalsize
+ \SUF@tocPART@font#1}%
+ \fi
+ \markboth{}{}%
+ {\SUF@lr@PARTSwitch\SUF@partsize
+ \interlinepenalty \@M
+ \ifnum \c@secnumdepth >-2\relax
+ \addvspace{4ex}
+ \noindent\partname\hskip.5em{\SUF@PART@font\SUF@thepart}\SUF@dotpart
+ \ifsuftesi@numparpart
+ \par
+ \vskip2ex
+ \else
+ \hspace{1em}
+ \fi
+ \noindent\SUF@PART@StyleSwitch#2\par}%
+ \@endpart}
+
+\def\@spart#1{%
+ {\SUF@lr@PARTSwitch\SUF@partsize
+ \interlinepenalty \@M
+ \addvspace{4ex}
+ \noindent\SUF@PART@StyleSwitch#1\par}%
+ \@endpart}
+
+\ifsuftesi@article
+\def\@endpart{%
+ \ifsuftesi@partpage
+ \vfil\newpage
+ \if@twoside
+ \if@openright
+ \null
+ \thispagestyle{empty}%
+ \newpage
+ \fi
+ \fi
+ \fi
+ \if@tempswa
+ \twocolumn
+ \fi}
\else
-% \end{macrocode}
-% \paragraph{The default \opt{`book'} mode}
-% \begin{macrocode}
-\ifsuftesi@numparpart
-\titleformat{\part}[display]
- {\SUF@partsize\SUF@lr@PARTSwitch}
- {\SUF@PART@StyleSwitch\partname\hskip.5em\SUF@thepart\SUF@dotpart}
- {2ex}
- {\SUF@PART@StyleSwitch}
-\else
-\titleformat{\part}[hang]
- {\SUF@partsize\SUF@lr@PARTSwitch}
- {\SUF@PART@StyleSwitch\partname\hskip.5em\SUF@thepart\SUF@dotpart}
- {1em}
- {\SUF@PART@StyleSwitch}
-\fi
+\def\@endpart{\vfil\newpage
+ \if@twoside
+ \if@openright
+ \null
+ \thispagestyle{empty}%
+ \newpage
+ \fi
+ \fi
+ \if@tempswa
+ \twocolumn
+ \fi}
\fi
-
% \end{macrocode}
+% Other sublevels:
% \begin{macrocode}
\titleformat{\paragraph}[runin]
{}
@@ -3666,8 +3888,6 @@ quotesize,footnotestyle,liststyle,captionstyle}
{\itshape}
[{.}\hspace*{1em}]
\titlespacing*{\paragraph}{\parindent}{.5\sectionsep}{.5\sectionsep}
-% \end{macrocode}
-% \begin{macrocode}
\titleformat{\subparagraph}[runin]
{}
{\thesubparagraph}
@@ -3681,61 +3901,56 @@ quotesize,footnotestyle,liststyle,captionstyle}
% so we must redefine them according to the styles of \sty{suftesi},
% which does not use uppercase letters in the headings.
% \begin{macrocode}
-\ifsuftesi@article
+\ifsuftesi@article
\AtBeginDocument{%
\@ifpackageloaded{biblatex}{%
\defbibheading{bibliography}[\refname]{%
\section*{#1}%
- \markboth{#1}{#1}}
- \defbibheading{shorthands}[\losname]{%
+ \@mkboth{#1}{#1}}
+ \defbibheading{biblist}[\biblistname]{%
\section*{#1}%
- \markboth{#1}{#1}}
+ \@mkboth{#1}{#1}}
\defbibheading{bibintoc}[\refname]{%
\section*{#1}%
\addcontentsline{toc}{section}{#1}%
- \markboth{#1}{#1}}
- \defbibheading{losintoc}[\losname]{%
+ \@mkboth{#1}{#1}}
+ \defbibheading{biblistintoc}[\biblistname]{%
\section*{#1}%
\addcontentsline{toc}{section}{#1}%
- \markboth{#1}{#1}}
+ \@mkboth{#1}{#1}}
\defbibheading{bibnumbered}[\refname]{%
- \section{#1}%
- \if@twoside\markright{#1}\fi}
- \defbibheading{losnumbered}[\losname]{%
- \section{#1}%
- \if@twoside\markright{#1}\fi}
+ \section{#1}}
+ \defbibheading{biblistnumbered}[\biblistname]{%
+ \section{#1}}
\defbibheading{subbibliography}[\refname]{%
\subsection*{#1}}
\defbibheading{subbibintoc}[\refname]{%
\subsection*{#1}%
\addcontentsline{toc}{subsection}{#1}}
\defbibheading{subbibnumbered}[\refname]{%
- \subsection{#1}}}%
- {\relax}%
-}%
-\else
+ \subsection{#1}}}
+{\relax}}
+\else
\AtBeginDocument{%
\@ifpackageloaded{biblatex}{%
\defbibheading{bibliography}[\bibname]{%
\chapter*{#1}%
- \markboth{#1}{#1}}
- \defbibheading{shorthands}[\losname]{%
+ \@mkboth{#1}{#1}}
+ \defbibheading{biblist}[\biblistname]{%
\chapter*{#1}%
- \markboth{#1}{#1}}
+ \@mkboth{#1}{#1}}
\defbibheading{bibintoc}[\bibname]{%
\chapter*{#1}%
\addcontentsline{toc}{chapter}{#1}%
- \markboth{#1}{#1}}
- \defbibheading{losintoc}[\losname]{%
+ \@mkboth{#1}{#1}}
+ \defbibheading{biblistintoc}[\biblistname]{%
\chapter*{#1}%
\addcontentsline{toc}{chapter}{#1}%
- \markboth{#1}{#1}}
+ \@mkboth{#1}{#1}}
\defbibheading{bibnumbered}[\bibname]{%
- \chapter{#1}%
- \if@twoside\markright{#1}\fi}
- \defbibheading{losnumbered}[\losname]{%
- \chapter{#1}%
- \if@twoside\markright{#1}\fi}
+ \chapter{#1}}
+ \defbibheading{biblistnumbered}[\biblistname]{%
+ \chapter{#1}}
\defbibheading{subbibliography}[\refname]{%
\section*{#1}%
\if@twoside\markright{#1}\fi}
@@ -3745,11 +3960,10 @@ quotesize,footnotestyle,liststyle,captionstyle}
\if@twoside\markright{#1}\fi}
\defbibheading{subbibnumbered}[\refname]{%
\section{#1}}}
- {\relax}%
-}%
+{\relax}}
\fi
% \end{macrocode}
-% \subsection*{Cover page}
+% \subsection{Cover page}
% \begin{macrocode}
\newcommand{\Ctitle}[1]{\def\@Ctitle{#1}}
\newcommand{\Csubtitle}[1]{\def\@Csubtitle{#1}}
@@ -3822,7 +4036,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
************************************}}}
}
% \end{macrocode}
-% \subsection*{Title page}
+% \subsection{Title page}
% The new \cmd{title} command has an optional argument
% which can be used in the headers.
% \begin{macrocode}
@@ -3851,7 +4065,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
No \string\author\space given\MessageBreak%
See the class documentation for explanation}}
% \end{macrocode}
-% For |titlepage| (default) option:
+% \subsubsection{For \opt{titlepage} (default) option}
% \begin{macrocode}
\if@titlepage% titlepage
\renewcommand\maketitle{\begin{titlepage}%
@@ -3895,7 +4109,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
\global\let\date\relax
\global\let\and\relax}
% \end{macrocode}
-% Reproduces the standard |\maketitle| style:
+% \paragraph{The standard \cmd{aketitle} style}
% \begin{macrocode}
\newcommand\standardtitle{\begin{titlepage}%
\let\footnotesize\small
@@ -3926,7 +4140,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
\global\let\and\relax}
\else
% \end{macrocode}
-% For |notitlepage| option:
+% \subsubsection{For \opt{notitlepage} option}
% \begin{macrocode}
\renewcommand\maketitle{\par
\begingroup
@@ -3956,7 +4170,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
\global\let\@date\@empty
\global\let\date\relax
\global\let\and\relax}
- \def\@maketitle{%
+\def\@maketitle{%
\newpage
\null
\vskip 2em%
@@ -3987,7 +4201,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
\par
\vskip 1.5em}
% \end{macrocode}
-% Reproduces the standard |\maketitle| style:
+% \paragraph{The standard \cmd{maketitle} style}
% \begin{macrocode}
\newcommand\standardtitle{\par
\begingroup
@@ -4037,7 +4251,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
\vskip 1.5em}
\fi
% \end{macrocode}
-% \subsection*{The \opt{collection} document structure}
+% \subsection{The \opt{collection} structure}
% \begin{macrocode}
\ifsuftesi@collection
\newcounter{journalnumber}
@@ -4078,8 +4292,6 @@ quotesize,footnotestyle,liststyle,captionstyle}
\def\collectioneditor#1{\gdef\@collectioneditor{#1}}
\def\@collectioneditor{\@latex@warning@no@line{%
No \noexpand\collectioneditor given}}
-% \end{macrocode}
-% \begin{macrocode}
\renewcommand*{\title}[2][]{%
\gdef\@headtitle{#1}\gdef\@title{#2}\markright{#1}}
\edef\title{\noexpand\@dblarg
@@ -4127,8 +4339,6 @@ quotesize,footnotestyle,liststyle,captionstyle}
\penalty\@highpenalty
\endgroup
\fi}
-% \end{macrocode}
-% \begin{macrocode}
\renewcommand\maketitle{\par
\begingroup
\renewcommand\thefootnote{\@fnsymbol\c@footnote}%
@@ -4144,7 +4354,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
\fi
\else
\newpage
- \global\@topnum\z@ % Prevents figures from going at top of page.
+ \global\@topnum\z@ % Prevents figures from going at top of page.
\@maketitle
\fi
\thispagestyle{plain}\@thanks%
@@ -4200,19 +4410,15 @@ quotesize,footnotestyle,liststyle,captionstyle}
% {\label{end:\thearticle}\endgroup
% }
\newenvironment{article}
- {\begingroup
- \setcounter{section}{0}
- \setcounter{footnote}{0}
- \setcounter{figure}{0}
- \setcounter{table}{0}}
- {\label{end:\thearticle}
- \cleardoublepage
- \global\let\@thanks\@empty
- \endgroup}
-% \end{macrocode}
-% A command to typeset
-% the frontispiece of the collection.
-% \begin{macrocode}
+ {\begingroup
+ \setcounter{section}{0}
+ \setcounter{footnote}{0}
+ \setcounter{figure}{0}
+ \setcounter{table}{0}}
+ {\label{end:\thearticle}
+ \cleardoublepage
+ \global\let\@thanks\@empty
+ \endgroup}
\newcommand{\frontispiece}{%
\thispagestyle{empty}%
\begingroup
@@ -4225,18 +4431,17 @@ quotesize,footnotestyle,liststyle,captionstyle}
\@collectioneditor
\vspace*{\stretch{3}}
- \endgroup
+ \endgroup
\clearpage}
% \end{macrocode}
% In the collection document structure the articles are treated as
% chapters but you would not need to print in
-% the table of contents all the sections of every article. So first of all we include in the table of contents only the author and the title of each paper:
+% the table of contents all the sections of every article. So first of
+% all we include in the table of contents only the author and the
+% title of each paper. Anyway the sections inside each paper are
+% numbered as in standard articles:
% \begin{macrocode}
\setcounter{tocdepth}{0}
-% \end{macrocode}
-% Anyway the sections inside each paper are numbered
-% as in standard articles:
-% \begin{macrocode}
\renewcommand\thesection{%
\@arabic\c@section}
\renewcommand\thesubsection{%
@@ -4250,7 +4455,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
\else
\fi
% \end{macrocode}
-% \subsection*{Frontispiece}
+% \subsection{Frontispiece}
% \begin{macrocode}
\AtBeginDocument{%
\@ifpackagewith{frontespizio}{suftesi}{%
@@ -4301,34 +4506,32 @@ quotesize,footnotestyle,liststyle,captionstyle}
\fi\fi\fi\fi\fi\fi}
{\relax}}}
% \end{macrocode}
+% \subsection{The index}
% \begin{macrocode}
\renewenvironment{theindex}
- {\if@twocolumn
- \@restonecolfalse
- \else
- \@restonecoltrue
- \fi
- \ifsuftesi@article
- \twocolumn[\section*{\indexname}]%
- \else
- \twocolumn[\@makeschapterhead{\indexname}]%
- \fi
- \@mkboth{\indexname}{\indexname}%
- \thispagestyle{plain}%
- \raggedright%
- \parindent\z@
- \parskip\z@ \@plus .3\p@\relax
- \columnseprule \z@
- \columnsep 35\p@
- \let\item\@idxitem}
- {\if@restonecol\onecolumn\else\clearpage\fi}
+ {\if@twocolumn
+ \@restonecolfalse
+ \else
+ \@restonecoltrue
+ \fi
+ \ifsuftesi@article
+ \twocolumn[\section*{\indexname}]%
+ \else
+ \twocolumn[\@makeschapterhead{\indexname}]%
+ \fi
+ \@mkboth{\indexname}{\indexname}%
+ \thispagestyle{plain}%
+ \raggedright%
+ \parindent\z@
+ \parskip\z@ \@plus .3\p@\relax
+ \columnseprule \z@
+ \columnsep 35\p@
+ \let\item\@idxitem}
+ {\if@restonecol\onecolumn\else\clearpage\fi}
% \end{macrocode}
-% \subsection*{Appendix}
+% \subsection{Appendices}
% \begin{macrocode}
\RequirePackage{appendix}
-\renewcommand{\appendixpagename}{Appendici}
-\renewcommand{\appendixtocname}{Appendici}
-\renewcommand{\appendixname}{Appendice}
\noappendicestocpagenum
% Bug using defaultfont=none,libertine,standard,compatibility
% \AtBeginEnvironment{appendices}{\appendix\mainmatter}
@@ -4338,103 +4541,146 @@ quotesize,footnotestyle,liststyle,captionstyle}
Redefine the \noexpand\appendixpagename command instead.
See the 'appendix' package documentation.\MessageBreak
\noexpand\renewcommand{\noexpand\appendixpagename{newname}}}
- {Command \noexpand\appendicesname undefined\MessageBreak
+ {Command \noexpand\appendicesname undefined\MessageBreak
Redefine the \noexpand\appendixpagename command instead.
See the 'appendix' package documentation.\MessageBreak
\noexpand\renewcommand{\noexpand\appendixpagename{newname}}}}
-% \newcommand{\appendicesname}[1]{\def\SUF@appendices{#1}}
-% \appendicesname{Appendici}
-% \newcommand{\appendixpage}{\SUF@appendixpage}
-% \def\SUF@appendixpage{%
-% \@mainmattertrue
-% \titlecontents{part}
-% [0em]
-% {\addvspace{3ex}}
-% {}
-% {}
-% {}
-% [\addvspace{1ex}]
-% \let\contentspage\relax
-% \cleardoublepage
-% \thispagestyle{empty}
-% \addcontentsline{toc}{part}{\SUF@appendices}
-% \begingroup
-% \centering
-% \null\vfil
-% {\LARGE\SUF@appendices\par}
-% \vfil
-% \endgroup
-% \cleardoublepage
-% \titlecontents{part}
-% [0em]
-% {\addvspace{3ex}\partname~}
-% {\makebox[\SUF@label@part][l]{%
-% \thecontentslabel}\hspace*{1em}}
-% {}
-% {}
-% [\addvspace{1ex}]
-% }
\renewcommand{\@chap@pppage}{%
- \clear@ppage
- \thispagestyle{plain}%
- \if@twocolumn\onecolumn\@tempswatrue\else\@tempswafalse\fi
- \null\vfil
- \markboth{}{}%
- {\centering
- \interlinepenalty \@M
- \normalfont
- \SUF@chaptersize
+ \clear@ppage
+ \thispagestyle{plain}%
+ \if@twocolumn\onecolumn\@tempswatrue\else\@tempswafalse\fi
+ \null\vfil
+ \markboth{}{}%
+ {\centering
+ \interlinepenalty \@M
+ \normalfont
+ \SUF@chaptersize
\SUF@CHAP@StyleSwitch\expandafter\appendixpagename\par}%
- \if@dotoc@pp
- \addappheadtotoc
- \fi
- \vfil\newpage
- \if@twoside
- \if@openright
- \null
- \thispagestyle{empty}%
- \newpage
- \fi
- \fi
- \if@tempswa
- \twocolumn
- \fi
-}
+ \if@dotoc@pp
+ \addappheadtotoc
+ \fi
+ \vfil\newpage
+ \if@twoside
+ \if@openright
+ \null
+ \thispagestyle{empty}%
+ \newpage
+ \fi
+ \fi
+ \if@tempswa
+ \twocolumn
+ \fi}
\renewcommand{\@sec@pppage}{%
- \par
- \addvspace{4ex}%
- \@afterindentfalse
- {\parindent \z@ \raggedright
- \interlinepenalty \@M
- \normalfont
- \SUF@chaptersize
+ \par
+ \addvspace{4ex}%
+ \@afterindentfalse
+ {\parindent \z@ \raggedright
+ \interlinepenalty \@M
+ \normalfont
+ \SUF@chaptersize
\SUF@CHAP@StyleSwitch\expandafter\appendixpagename%
- \markboth{}{}\par}%
- \if@dotoc@pp
- \addappheadtotoc
- \fi
- \nobreak
- \vskip 3ex
- \@afterheading
-}
+ \markboth{}{}\par}%
+ \if@dotoc@pp
+ \addappheadtotoc
+ \fi
+ \nobreak
+ \vskip 3ex
+ \@afterheading}
+% \end{macrocode}
+% Within the appendices the chapter and section labels are literal.
+% Using the \opt{chapnumstyle=Roman} or \opt{chapnumstyle=roman} options,
+% this label is passed as an argument to \cmd{@Roman} or \cmd{@roman},
+% which however accepts only integers. For this reason we must redefine
+% all the occurrences of \cmd{titlecontents} in order to have \cmd{thecontentslabel}
+% in place of \cmd{SUF@CHAP@thecontentslabel} or \cmd{SUF@SEC@thecontentslabel}.
+% \begin{macrocode}
+\def\suf@appendixtoc{%
+ \ifsuftesi@pagelefttoc
+ \titlecontents{chapter}
+ [\SUF@tochang@chap]
+ {\addvspace{2ex}}
+ {\hskip-\SUF@tochang@chap%
+ \makebox[1em][l]{\thecontentspage}%
+ \hskip\SUF@addto@tochang@chap%
+ \makebox[\SUF@label@chap][l]{%
+ \thecontentslabel}\hspace*{1em}%
+ \SUF@tocCHAP@font}
+ {\hskip-\SUF@tochang@chap%
+ \makebox[1em][l]{\thecontentspage}%
+ \hskip\SUF@addto@tochang@chap\SUF@tocCHAP@font}
+ {}
+ [\addvspace{1ex}]
+ \ifsuftesi@toccompactsec
+ \titlecontents*{section}[\SUF@tochang@chap]{}{%
+ \thecontentslabel\adjtoclabelsep\SUF@tocSEC@font}{\SUF@tocSEC@font}{,
+ \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotsec]
+ \else
+ \titlecontents{section}
+ [\SUF@tochang@sec]
+ {}
+ {\hskip-\SUF@tochang@sec%
+ \makebox[1em][l]{\thecontentspage}\hskip\SUF@addto@tochang@sec%
+% \makebox[\SUF@label@sec][l]{%
+% \ifsuftesi@article\SUF@toclabelnum%
+% \else\fi\thecontentslabel}\hspace*{1em}%
+ \makebox[\SUF@label@sec][l]{\thecontentslabel}\hspace*{1em}%
+ \SUF@tocSEC@font}
+ {\hskip-\SUF@tochang@sec%
+ \makebox[1em][l]{\thecontentspage}\hskip\SUF@addto@tochang@sec%
+ \SUF@tocSEC@font}
+ {}
+ \fi
+ \else
+ \titlecontents{chapter}
+ [\SUF@tocindent@chap]
+ {\addvspace{2ex}}
+ {\hskip-\SUF@tocindent@chap%
+ \makebox[\SUF@label@chap][l]{\thecontentslabel}%
+ \hspace*{1em}%
+ \SUF@tocCHAP@font}
+ {\hskip-\SUF@tocindent@chap%
+ \SUF@tocCHAP@font}
+ {\SUF@chaptitlerule\contentspage}
+ [\addvspace{1ex}]
+ \ifsuftesi@toccompactsec
+ \titlecontents*{section}[\SUF@tocindent@chap]{}{%
+ \thecontentslabel\adjtoclabelsep\SUF@tocSEC@font}{\SUF@tocSEC@font}{,
+ \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotsec]
+ \else
+ \titlecontents{section}
+ [\SUF@tocindent@sec]
+ {}
+ {\hskip-\dimexpr(\SUF@label@sec+1em)%
+% \makebox[\SUF@label@sec][l]{%
+% \ifsuftesi@article\SUF@toclabelnum%
+% \else\fi\thecontentslabel}\hspace*{1em}%
+ \makebox[\SUF@label@sec][l]{\thecontentslabel}\hspace*{1em}%
+ \SUF@tocSEC@font}
+ {\hskip-\dimexpr(\SUF@label@sec+1em)%
+ \SUF@tocSEC@font}
+ {\ifsuftesi@article\SUF@chaptitlerule%
+ \else\SUF@titlerule\fi\contentspage}
+ \fi}
\ifsuftesi@article
- \renewcommand\appendix{\par
- \setcounter{section}{0}%
- \setcounter{subsection}{0}%
- \gdef\SUF@thesection{\@Alph\c@section}%
- \gdef\SUF@HEAD@thesection{\@Alph\c@section}%
- \renewcommand{\thesection}{\@Alph\c@section}}
+\renewcommand\appendix{\par
+ \suf@appendixtoc%
+ \setcounter{section}{0}%
+ \setcounter{subsection}{0}%
+ \gdef\SUF@thesection{\@Alph\c@section}%
+ \gdef\SUF@HEAD@thesection{\@Alph\c@section}%
+ \renewcommand{\thesection}{\@Alph\c@section}}
\else
- \renewcommand\appendix{\par
- \setcounter{chapter}{0}%
- \setcounter{section}{0}%
- \gdef\@chapapp{\appendixname}%
- \gdef\SUF@thechapter{\@Alph\c@chapter}%
- \gdef\SUF@HEAD@thechapter{\@Alph\c@chapter}%
- \renewcommand{\thechapter}{\@Alph\c@chapter}}
+\renewcommand\appendix{\par
+ \suf@appendixtoc%
+ \setcounter{chapter}{0}%
+ \setcounter{section}{0}%
+ \gdef\@chapapp{\appendixname}%
+ \gdef\SUF@thechapter{\@Alph\c@chapter}%
+ \gdef\SUF@HEAD@thechapter{\@Alph\c@chapter}%
+ \renewcommand{\thechapter}{\@Alph\c@chapter}}
\fi
% \end{macrocode}
-% \subsection*{Headings}
+% \subsection{Headings}
% \begin{macrocode}
\RequirePackage{fancyhdr}
\newcommand{\versionstring}[1]{\def\version@string{#1}}
@@ -4449,11 +4695,11 @@ quotesize,footnotestyle,liststyle,captionstyle}
% \begin{macrocode}
\renewcommand{\chaptermark}[1]{%
\markboth{\chaptertitlename\ \protect\SUF@HEAD@thechapter}{#1}}
- \ifsuftesi@article
- \renewcommand{\sectionmark}[1]{\markright{\protect\SUF@HEAD@thesection.\ #1}}
- \else
- \renewcommand{\sectionmark}[1]{}
- \fi
+ \ifsuftesi@article
+ \renewcommand{\sectionmark}[1]{\markright{\protect\SUF@HEAD@thesection.\ #1}}
+ \else
+ \renewcommand{\sectionmark}[1]{}
+ \fi
% \end{macrocode}
% \paragraph{The \opt{plain} style}
% \begin{macrocode}
@@ -4473,11 +4719,10 @@ quotesize,footnotestyle,liststyle,captionstyle}
\fancyhf{}%
\fancyfoot[RE,LO]{%
\ifsuftesi@draftdate\footnotesize\SUF@versionstring\else\fi}
- \fancyhead[CO]{\footnotesize\xheadbreakfalse\SUF@rightmark}
- \fancyhead[CE]{\footnotesize\xheadbreakfalse%
+ \fancyhead[CO]{\footnotesize\breakinbodyfalse\SUF@rightmark}
+ \fancyhead[CE]{\footnotesize\breakinbodyfalse%
\SUF@LR@MarkSwitch}
- \fancyfoot[C]{\footnotesize\SUF@thepage}%
- }%
+ \fancyfoot[C]{\footnotesize\SUF@thepage}}
% \end{macrocode}
% \paragraph{The \opt{sufdefault} style}
% \begin{macrocode}
@@ -4486,62 +4731,55 @@ quotesize,footnotestyle,liststyle,captionstyle}
\fancyfoot[RE,LO]{%
\ifsuftesi@draftdate\footnotesize\SUF@versionstring\else\fi}
\fancyhead[LE,RO]{\footnotesize\SUF@thepage}
- \fancyhead[LO]{\footnotesize\xheadbreakfalse\SUF@rightmark}
- \fancyhead[RE]{\footnotesize\xheadbreakfalse%
- \SUF@LR@MarkSwitch}
- }%
-%
+ \fancyhead[LO]{\footnotesize\breakinbodyfalse\SUF@rightmark}
+ \fancyhead[RE]{\footnotesize\breakinbodyfalse%
+ \SUF@LR@MarkSwitch}}
\ifsuftesi@article
- \ifsuftesi@authortitle
- \def\SUF@LR@MarkSwitch{\SUF@leftmark}
- \else
- \def\SUF@LR@MarkSwitch{\SUF@rightmark}
- \fi
+ \ifsuftesi@authortitle
+ \def\SUF@LR@MarkSwitch{\SUF@leftmark}
+ \else
+ \def\SUF@LR@MarkSwitch{\SUF@rightmark}
+ \fi
\else
- \def\SUF@LR@MarkSwitch{\SUF@leftmark}
+ \def\SUF@LR@MarkSwitch{\SUF@leftmark}
\fi
\def\SUF@leftrightmark{%
- \if@mainmatter\leftmark\else\rightmark\fi}
-% \end{macrocode}
-% Setting the default page style:
-% \begin{macrocode}
+ \if@mainmatter\leftmark\else\rightmark\fi}
\pagestyle{sufdefault}
\ifsuftesi@centerheader\pagestyle{centerheader}\else\fi
\ifsuftesi@sufplain\pagestyle{sufplain}\else\fi}
% \end{macrocode}
-% \subsection*{Text elements}
-%
+% \subsection{Text elements}
% \paragraph{Block Quotations}
-%
% New environments for block quotations according to a popular Italian style.
% The font size is the same of the footnotes and the margins are set to \cmd{parindent}.
% \begin{macrocode}
\renewenvironment{quotation}
- {\list{}{\listparindent\parindent%
- \itemindent \listparindent
- \leftmargin \parindent
- \SUF@quote@style
- \parsep \z@ \@plus\p@}%
- \item\relax%
- \SUF@quotation@size%
- \noindent\ignorespaces}
- {\endlist}
+ {\list{}{\listparindent\parindent%
+ \itemindent \listparindent
+ \leftmargin \parindent
+ \SUF@quote@style
+ \parsep \z@ \@plus\p@}%
+ \item\relax%
+ \SUF@quotation@size%
+ \noindent\ignorespaces}
+ {\endlist}
\renewenvironment{quote}
- {\list{}{\leftmargin \parindent
- \SUF@quote@style}%
- \item\relax%
- \SUF@quotation@size}% \ignorespaces?
- {\endlist}
+ {\list{}{\leftmargin \parindent
+ \SUF@quote@style}%
+ \item\relax%
+ \SUF@quotation@size}% \ignorespaces?
+ {\endlist}
\renewenvironment{verse}
- {\let\\\@centercr
- \list{}{\itemsep \z@
- \itemindent -1.5em%
- \listparindent\itemindent
- \rightmargin \leftmargin
- \advance\leftmargin 1.5em}%
- \item\relax
- \SUF@quotation@size}
- {\endlist}
+ {\let\\\@centercr
+ \list{}{\itemsep \z@
+ \itemindent -1.5em%
+ \listparindent\itemindent
+ \rightmargin \leftmargin
+ \advance\leftmargin 1.5em}%
+ \item\relax
+ \SUF@quotation@size}
+ {\endlist}
% \end{macrocode}
% \paragraph{The \opt{fewfootnotes} option}
% Enable only with three footnotes per page maximum.
@@ -4558,11 +4796,11 @@ quotesize,footnotestyle,liststyle,captionstyle}
\def\thefootnote{\@fnsymbol\c@footnote}%
\else\fi
% \end{macrocode}
-% Prints a footnote with discretionary
+% \paragraph{The \cmd{xfootnote} command} Prints a footnote with discretionary
% symbol give in the first argument.
% \begin{macrocode}
\newcommand*\xfootnote[1][*]{%
- \xdef\@thefnmark{#1}%
+ \xdef\@thefnmark{#1}%
\@footnotemark\@footnotetext}
% \end{macrocode}
% \paragraph{Marginal notes}
@@ -4573,7 +4811,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
\def\SUF@mpsetup{%
\itshape
\footnotesize%
- \parindent=0pt \lineskip=0pt \lineskiplimit=0pt %
+ \parindent=0pt \lineskip=0pt \lineskiplimit=0pt%
\tolerance=2000 \hyphenpenalty=300 \exhyphenpenalty=300%
\doublehyphendemerits=100000%
\finalhyphendemerits=\doublehyphendemerits}
@@ -4589,19 +4827,19 @@ quotesize,footnotestyle,liststyle,captionstyle}
% \begin{macrocode}
\AtBeginDocument{%
\@ifpackageloaded{todonotes}{%
-\renewcommand{\@todonotes@drawMarginNoteWithLine}{%
-\begin{tikzpicture}[remember picture, overlay, baseline=-0.75ex]%
- \node [coordinate] (inText) {};%
-\end{tikzpicture}%
-\oldmarginpar[{% Draw note in left margin
- \@todonotes@drawMarginNote%
- \@todonotes@drawLineToLeftMargin%
-}]{% Draw note in right margin
- \@todonotes@drawMarginNote%
- \@todonotes@drawLineToRightMargin%
-}%
-}%
-}
+ \renewcommand{\@todonotes@drawMarginNoteWithLine}{%
+ \begin{tikzpicture}[remember picture, overlay, baseline=-0.75ex]%
+ \node [coordinate] (inText) {};%
+ \end{tikzpicture}%
+ \oldmarginpar[{% Draw note in left margin
+ \@todonotes@drawMarginNote%
+ \@todonotes@drawLineToLeftMargin%
+ }]{% Draw note in right margin
+ \@todonotes@drawMarginNote%
+ \@todonotes@drawLineToRightMargin%
+ }
+ }
+ }
{\relax}}
% \end{macrocode}
% \paragraph{Abstract}
@@ -4641,7 +4879,7 @@ quotesize,footnotestyle,liststyle,captionstyle}
\quotation
\fi}
{\if@twocolumn\else\endquotation\fi}
-\fi
+ \fi
\fi
\newcommand\abstractname{Abstract}
% \end{macrocode}
@@ -4663,8 +4901,6 @@ quotesize,footnotestyle,liststyle,captionstyle}
\fi usando la classe \textsf{suftesi} di
Ivan Valbusa\index{Valbusa, Ivan}. #3\par}
\cleardoublepage}
-% \end{macrocode}
-% \begin{macrocode}
\newcommand{\bookcolophon}[2]{%
\thispagestyle{empty}
\null
@@ -4673,15 +4909,11 @@ quotesize,footnotestyle,liststyle,captionstyle}
\vfill
{\small\noindent #2\par}
\cleardoublepage}
-% \end{macrocode}
-% \begin{macrocode}
\newcommand{\artcolophon}[1]{%
\thispagestyle{empty}
\null
\vfill
{\small\noindent #1\par}}
-% \end{macrocode}
-% \begin{macrocode}
\newcommand{\finalcolophon}[1]{%
\thispagestyle{empty}
\null\vspace*{\stretch{1}}
@@ -4716,10 +4948,10 @@ visit http://creativecom mons.org/licenses/by-nc-nd/3.0/.
\null\vspace{\stretch{1}}
\noindent Typeset with \LaTeX{} in collaboration with the Joint Project
-\emph{Formal Style for PhD Theses with \LaTeX{}} (University of Verona,
+\emph{Formal Style for PhD Theses with \LaTeX} (University of Verona,
Italy) using the \textsf{suftesi} class by Ivan Valbusa. The text face
is Palatino, designed by Hermann Zapf. The sans serif font is Iwona by
-Janusz M. Nowacki.
+Janusz M.~Nowacki.
\endgroup
@@ -4733,25 +4965,20 @@ Janusz M. Nowacki.
only for the FSPL styles}}
\fi
% \end{macrocode}
-% \subsection*{Toc, lof, lot}
+% \subsection{ToC, LoF and LoT}
% \begin{macrocode}
\RequirePackage{titletoc}
% \end{macrocode}
% All the lengths depend on |\SUF@label@chap|
-% so we define this first.
+% so we define this first. The |\toclabelwidth| lengtth is provided to
+% adjust the label width in the table of contents.
% \begin{macrocode}
\newlength\SUF@label@chap
\setlength\SUF@label@chap{.5em}
-% \end{macrocode}
-% |\toclabelwidth| is provided to
-% adjust the label width in the table of contents:
-% \begin{macrocode}
\newcommand*{\toclabelwidth}[2]{%
\AtBeginDocument{
\addtolength{\csname SUF@label@#1\endcsname}{#2}%
- \addtolength{\csname SUF@tocindent@#1\endcsname}{#2}%
- }
-}
+ \addtolength{\csname SUF@tocindent@#1\endcsname}{#2}}}
% \end{macrocode}
% These commands control the space before and after the label of the sections in the table of contents, using the \opt{compactfont} option.
% \begin{macrocode}
@@ -4772,11 +4999,11 @@ Janusz M. Nowacki.
See package documentation for details}}
% \end{macrocode}
% This macro controls the space between page number and chapter
-% label using the \opt{tocpageleft} option:
+% label using the \opt{toc=pageleft} option:
% \begin{macrocode}
\newlength{\SUF@tochang}
\setlength{\SUF@tochang}{3em}
-\AtBeginDocument{
+\AtBeginDocument{%
\newlength\SUF@label@part
\newlength\SUF@label@sec
\newlength\SUF@label@subsec
@@ -4800,28 +5027,30 @@ Janusz M. Nowacki.
\setlength\SUF@label@fig
{\SUF@label@sec}
\setlength\SUF@label@tab
- {\SUF@label@sec}
-}
+ {\SUF@label@sec}}
% \end{macrocode}
-% Part in article mode
+% \paragraph{Part etry}
+% The style of the part ToC entry the same in all ToC types,
+% i.e. aligned to the left and without page indication.
+% The font options act only on the title, which is always printed
+% in Roman shape, and not on the label.
+% As is the case for the other sectioning commands.
% \begin{macrocode}
-\titlecontents{part}
- [0em]
- {\addvspace{3ex}\partname\hspace*{.5em}}
- {\makebox[\SUF@label@part][l]{%
- \thecontentslabel}\hspace*{1em}}
- {}
- {}
- [\addvspace{1ex}]
+%\titlecontents{part}
+% [0em]
+% {\addvspace{3ex}}
+% {\partname\hspace*{.5em}\makebox[\SUF@label@part][l]{%
+% \SUF@PART@thecontentslabel}\hspace*{1em}\SUF@tocPART@font}
+% {\SUF@tocPART@font}
+% {}
+% [\addvspace{1ex}]
% \end{macrocode}
-% \paragraph{`\opt{tocpageleft}' toc}
+% \paragraph{The `left' ToC}
+% With this option, page numbers are placed to the left of the respective entry. Therefore we set the space provided for the page number on the right to zero, using the \cmd{contentsmargin} command. In this way the right margin of the index is correctly aligned.
% \begin{macrocode}
\ifsuftesi@pagelefttoc
-% \end{macrocode}
-% First we reset the right margin to zero:
-% \begin{macrocode}
\contentsmargin{0pt}
-\AtBeginDocument{
+\AtBeginDocument{%
\newlength\SUF@tochang@chap
\newlength\SUF@tochang@sec
\newlength\SUF@tochang@subsec
@@ -4869,10 +5098,9 @@ Janusz M. Nowacki.
\setlength\SUF@addto@tochang@fig
{\dimexpr(\SUF@addto@tochang@chap-\SUF@label@sec+\SUF@label@chap)}
\setlength\SUF@addto@tochang@tab
- {\dimexpr(\SUF@addto@tochang@chap-\SUF@label@sec+\SUF@label@chap)}
-}
+ {\dimexpr(\SUF@addto@tochang@chap-\SUF@label@sec+\SUF@label@chap)}}
% \end{macrocode}
-% \paragraph{TOC entries}
+% \paragraph{ToC entries}
% \begin{macrocode}
\titlecontents{chapter}
[\SUF@tochang@chap]
@@ -4890,8 +5118,8 @@ Janusz M. Nowacki.
[\addvspace{1ex}]
\ifsuftesi@toccompactsec
\titlecontents*{section}[\SUF@tochang@chap]{}{%
- \SUF@SEC@thecontentslabel\adjtoclabelsep\SUF@tocSEC@font}{}{,
- \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotsec]
+ \SUF@SEC@thecontentslabel\adjtoclabelsep\SUF@tocSEC@font}{\SUF@tocSEC@font}{,
+ \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotsec]
\else
\titlecontents{section}
[\SUF@tochang@sec]
@@ -4910,8 +5138,8 @@ Janusz M. Nowacki.
\fi
\ifsuftesi@toccompactsubsec
\titlecontents*{subsection}[\SUF@tochang@sec]{\suf@sscorrect}{%
- \SUF@SUBSEC@thecontentslabel\adjtoclabelsep\SUF@tocSUBSEC@font}{}{,
- \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotssec]
+ \SUF@SUBSEC@thecontentslabel\adjtoclabelsep\SUF@tocSUBSEC@font}{\SUF@tocSUBSEC@font}{,
+ \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotssec]
\else
\titlecontents{subsection}
[\SUF@tochang@subsec]
@@ -4927,8 +5155,9 @@ Janusz M. Nowacki.
\fi
\ifsuftesi@toccompactsubsubsec
\titlecontents*{subsubsection}[\SUF@tochang@subsec]{\suf@ssscorrect}{%
- \SUF@SUBSUBSEC@thecontentslabel\adjtoclabelsep\SUF@tocSUBSUBSEC@font}{}{,
- \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotsssec]
+ \SUF@SUBSUBSEC@thecontentslabel\adjtoclabelsep%
+ \SUF@tocSUBSUBSEC@font}{\SUF@tocSUBSUBSEC@font}{,
+ \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotsssec]
\else
\titlecontents{subsubsection}
[\SUF@tochang@subsubsec]
@@ -4978,9 +5207,9 @@ Janusz M. Nowacki.
{}
\else
% \end{macrocode}
-% \paragraph{Default toc}
+% \paragraph{Default ToC}
% \begin{macrocode}
-\AtBeginDocument{
+\AtBeginDocument{%
\newlength\SUF@tocindent@chap
\newlength\SUF@tocindent@sec
\newlength\SUF@tocindent@subsec
@@ -5021,10 +5250,9 @@ Janusz M. Nowacki.
{\dimexpr(\SUF@tocindent@chap+\SUF@label@sec-\SUF@label@chap)}
\setlength\SUF@tocindent@tab
{\dimexpr(\SUF@tocindent@chap+\SUF@label@sec-\SUF@label@chap)}
-\fi
-}
+\fi}
% \end{macrocode}
-% \paragraph{TOC entries}
+% \paragraph{ToC entries}
% \begin{macrocode}
\titlecontents{chapter}
[\SUF@tocindent@chap]
@@ -5039,8 +5267,8 @@ Janusz M. Nowacki.
[\addvspace{1ex}]
\ifsuftesi@toccompactsec
\titlecontents*{section}[\SUF@tocindent@chap]{}{%
- \SUF@SEC@thecontentslabel\adjtoclabelsep\SUF@tocSEC@font}{}{,
- \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotsec]
+ \SUF@SEC@thecontentslabel\adjtoclabelsep\SUF@tocSEC@font}{\SUF@tocSEC@font}{,
+ \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotsec]
\else
\titlecontents{section}
[\SUF@tocindent@sec]
@@ -5058,8 +5286,8 @@ Janusz M. Nowacki.
\fi
\ifsuftesi@toccompactsubsec
\titlecontents*{subsection}[\SUF@tocindent@sec]{\suf@sscorrect}{%
- \SUF@SUBSEC@thecontentslabel\adjtoclabelsep\SUF@tocSUBSEC@font}{}{,
- \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotssec]
+ \SUF@SUBSEC@thecontentslabel\adjtoclabelsep\SUF@tocSUBSEC@font}{\SUF@tocSUBSEC@font}{,
+ \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotssec]
\else
\titlecontents{subsection}
[\SUF@tocindent@subsec]
@@ -5073,8 +5301,9 @@ Janusz M. Nowacki.
\fi
\ifsuftesi@toccompactsubsubsec
\titlecontents*{subsubsection}[\SUF@tocindent@subsec]{\suf@ssscorrect}{%
- \SUF@SUBSUBSEC@thecontentslabel\adjtoclabelsep\SUF@tocSUBSUBSEC@font}{}{,
- \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotsssec]
+ \SUF@SUBSUBSEC@thecontentslabel\adjtoclabelsep%
+ \SUF@tocSUBSUBSEC@font}{\SUF@tocSUBSUBSEC@font}{,
+ \thecontentspage}[][.\adjtocpagesep][\suf@ctocdotsssec]
\else
\titlecontents{subsubsection}
[\SUF@tocindent@subsubsec]
@@ -5116,22 +5345,21 @@ Janusz M. Nowacki.
{\SUF@titlerule\contentspage}
\fi
% \end{macrocode}
-% With \opt{article} option the toc, lof and lot
-% are printed as sections.
+% \subparagraph{The ToC, LoF and LoT in the \opt{article} structure}
% \begin{macrocode}
\ifsuftesi@article
\renewcommand\tableofcontents{%
\vspace{2ex}%
- \section*{\contentsname}%
- \@mkboth{\contentsname}{\contentsname}%
+ \section*{\contentsname}%
+ \@mkboth{\contentsname}{\contentsname}%
\thispagestyle{empty}
\ifsuftesi@twocolumntoc
\begin{multicols}{2}
- \@starttoc{toc}%
- \end{multicols}
- \else
- \@starttoc{toc}%
- \fi
+ \@starttoc{toc}%
+ \end{multicols}
+ \else
+ \@starttoc{toc}%
+ \fi
\vspace{2ex}%
}
\renewcommand\listoffigures{%
@@ -5141,11 +5369,11 @@ Janusz M. Nowacki.
\thispagestyle{empty}
\ifsuftesi@twocolumnlof
\begin{multicols}{2}
- \@starttoc{lof}%
- \end{multicols}
- \else
- \@starttoc{lof}%
- \fi
+ \@starttoc{lof}%
+ \end{multicols}
+ \else
+ \@starttoc{lof}%
+ \fi
\vspace{2ex}%
}
\renewcommand\listoftables{%
@@ -5155,16 +5383,16 @@ Janusz M. Nowacki.
\thispagestyle{empty}
\ifsuftesi@twocolumnlot
\begin{multicols}{2}
- \@starttoc{lot}%
- \end{multicols}
- \else
- \@starttoc{lot}%
- \fi
+ \@starttoc{lot}%
+ \end{multicols}
+ \else
+ \@starttoc{lot}%
+ \fi
\vspace{2ex}%
}
\else
% \end{macrocode}
-% The default toc, lof and lot are treated as chapters.
+% \subparagraph{The ToC, LoF and LoT in the \opt{book} structure}
% \begin{macrocode}
\renewcommand\tableofcontents{%
\if@twocolumn
@@ -5179,11 +5407,11 @@ Janusz M. Nowacki.
\thispagestyle{empty}
\ifsuftesi@twocolumntoc
\begin{multicols}{2}
- \@starttoc{toc}%
- \end{multicols}
- \else
- \@starttoc{toc}%
- \fi
+ \@starttoc{toc}%
+ \end{multicols}
+ \else
+ \@starttoc{toc}%
+ \fi
\if@restonecol\twocolumn\fi
}
\renewcommand\listoffigures{%
@@ -5198,11 +5426,11 @@ Janusz M. Nowacki.
\thispagestyle{empty}
\ifsuftesi@twocolumnlof
\begin{multicols}{2}
- \@starttoc{lof}%
- \end{multicols}
- \else
- \@starttoc{lof}%
- \fi
+ \@starttoc{lof}%
+ \end{multicols}
+ \else
+ \@starttoc{lof}%
+ \fi
\if@restonecol\twocolumn\fi
}
\renewcommand\listoftables{%
@@ -5218,16 +5446,50 @@ Janusz M. Nowacki.
\thispagestyle{empty}
\ifsuftesi@twocolumnlot
\begin{multicols}{2}
- \@starttoc{lot}%
- \end{multicols}
- \else
- \@starttoc{lot}%
- \fi
+ \@starttoc{lot}%
+ \end{multicols}
+ \else
+ \@starttoc{lot}%
+ \fi
\if@restonecol\twocolumn\fi
}
\fi
% \end{macrocode}
-% \subsection*{New commands}
+% \subsection{Customizing sections font}
+% \begin{macrocode}
+\newcommand{\tocpartname}[1]{\def\SUF@tocpartname{#1}}
+ \tocpartname{\partname}
+\newcommand{\partfont}[1]{\def\SUF@PART@StyleSwitch{#1}}
+\newcommand{\chapfont}[1]{\def\SUF@CHAP@StyleSwitch{#1}}
+\newcommand{\secfont}[1]{\def\SUF@SEC@StyleSwitch{#1}}
+\newcommand{\subsecfont}[1]{\def\SUF@SUBSEC@StyleSwitch{#1}}
+\newcommand{\subsubsecfont}[1]{\def\SUF@SUBSUBSEC@StyleSwitch{#1}}
+\newcommand{\partnumfont}[1]{\def\SUF@PART@font{#1}}
+ \partnumfont{}
+\newcommand{\chapnumfont}[1]{\def\SUF@thechapter{#1}}
+\newcommand{\secnumfont}[1]{\def\SUF@thesection{#1}}
+\newcommand{\subsecnumfont}[1]{\def\SUF@thesubsection{#1}}
+\newcommand{\subsubsecnumfont}[1]{\def\SUF@thesubsubsection{#1}}
+\newcommand{\titlefont}[1]{\def\SUF@titlefont@Switch{#1}}
+\newcommand{\authorfont}[1]{\def\SUF@authorfont@Switch{#1}}
+\newcommand{\tocpartfont}[1]{\def\SUF@tocPART@font{#1}}
+\newcommand{\tocchapfont}[1]{\def\SUF@tocCHAP@font{#1}}
+\newcommand{\tocsecfont}[1]{\def\SUF@tocSEC@font{#1}}
+\newcommand{\tocsubsecfont}[1]{\def\SUF@tocSUBSEC@font{#1}}
+\newcommand{\tocsubsubsecfont}[1]{\def\SUF@tocSUBSUBSEC@font{#1}}
+\newcommand{\tocpartnumfont}[1]{\def\SUF@tocPARTnum@font{#1}}
+ \tocpartnumfont{}
+\newcommand{\tocchapnumfont}[1]{%
+ \def\SUF@CHAP@thecontentslabel{#1\thecontentslabel}}
+\newcommand{\tocsecnumfont}[1]{%
+ \def\SUF@SEC@thecontentslabel{#1\thecontentslabel}}
+\newcommand{\tocsubsecnumfont}[1]{%
+ \def\SUF@SUBSEC@thecontentslabel{#1\thecontentslabel}}
+\newcommand{\tocsubsubsecnumfont}[1]{%
+ \def\SUF@SUBSUBSEC@thecontentslabel{#1\thecontentslabel}}
+% \end{macrocode}
+% \subsection{New commands}
+% A command to print an unnumbered introduction at the beginning of the chapter. The \cmd{chapterintroname} defaults to ``Introduzione'' because the class was initially designed primarily for Italian-speaking users.
% \begin{macrocode}
\ifsuftesi@article
\def\chapterintro{%
@@ -5246,34 +5508,39 @@ Janusz M. Nowacki.
\chapterintroname{Introduzione}
\fi
% \end{macrocode}
-% \paragraph{Manual breaks}
-% Active in the table of contents but not in the text.
-% \begin{macrocode}
-\newif\ifheadbreak\headbreakfalse
- \DeclareRobustCommand{\headbreak}
- {\ifheadbreak\\\else\fi}
-% \end{macrocode}
-% Active in the text but not in the table of contents.
-% \begin{macrocode}
-\newif\ifxheadbreak\xheadbreaktrue
- \def\xheadbreakNL{\ifxheadbreak\newline\else\fi}
- \def\xheadbreakBB{\ifxheadbreak\\\else\fi}
-% \end{macrocode}
+% Two commands for manual breaks active, respectively, only in the table of contents and in the body text. The solution was initially made available by Enrico Gregorio many years ago in one of the first versions of the class (at that time the commands were called \cmd{headbreak} and \cmd{xheadbreak}). Later, while I was working on version 3.0, I noticed an alignment problem in the chapter titles when using the \opt{chapstyle=left} option. So I added the \cmd{breakinbodyleft} command and updated the command names to make them more recognizable. Old names are in any case available for backwards compatibility.
% \begin{macrocode}
+\newif\ifbreakintoc\breakintocfalse
+\newif\ifbreakinbody\breakinbodytrue
+\DeclareRobustCommand{\breakintoc}
+ {\ifbreakintoc\\\else\fi}
+\DeclareRobustCommand{\breakinbody}
+ {\ifbreakinbody\\\else\fi}
+\DeclareRobustCommand{\breakinbodyleft}
+ {\ifbreakinbody\newline\else\fi}
\let\origtableofcontents\tableofcontents
- \renewcommand{\tableofcontents}{%
- \begingroup\headbreaktrue\xheadbreakfalse%
- \origtableofcontents\endgroup}
+\renewcommand{\tableofcontents}{%
+ \begingroup
+ \breakintoctrue\breakinbodyfalse%
+ \origtableofcontents
+ \endgroup}
+\DeclareRobustCommand{\headbreak}
+ {\ifbreakintoc\\\else\fi}
+\DeclareRobustCommand{\xheadbreak}
+ {\ifbreakinbody\\\else\fi}
+\DeclareRobustCommand{\yheadbreak}
+ {\ifbreakinbody\newline\else\fi}
% \end{macrocode}
-% \paragraph{Backward compatibility}
-% An environment to manually typeset the bibliography. (Use \sty{biblatex} instead!)
+% \subsection{Backward compatibility}
+% Two environments to manually typeset the bibliography and the list of shorthands.
+% As the class was initially designed primarily for Italian-speaking users, these two environments have an Italian name. Particularly the list of shorthands relies on \cmd{losname} which defaults to ``Sigle'' (that means ``shorthands''). They are not documented and are made available only for backward compatibility.
% \begin{macrocode}
\newenvironment{bibliografia}{%
\ifsuftesi@article
\section*{\refname}
\addcontentsline{toc}{section}{\refname}
\else
- \chapter{\bibname}%
+ \chapter{\bibname}%
\fi
\normalfont \list{}{%
\setlength{\itemindent}{-\parindent}
@@ -5282,9 +5549,6 @@ Janusz M. Nowacki.
\setlength{\parsep}{\parskip}
\let\makelabel}}
{\endlist}
-% \end{macrocode}
-% An environment to manually typeset the list of shorthands. (Use \sty{biblatex} instead!)
-% \begin{macrocode}
\newcommand{\losname}{Sigle}
\newcommand{\itlabel}[1]{\itshape\hbox to 6em{#1}}
\newenvironment{sigle}{%
@@ -5299,10 +5563,7 @@ Janusz M. Nowacki.
\let\makelabel\itlabel}}
{\endlist}
% \end{macrocode}
-%
-% \subsection*{Final settings}
-% Renew |\frontmatter| to have arabic page numbering:
-%
+% \subsection{Final settings}
% \begin{macrocode}
\ifsuftesi@article
\renewcommand\frontmatter{\ClassError{suftesi}
@@ -5321,28 +5582,30 @@ Janusz M. Nowacki.
{Command \noexpand\backmatter is undefined\MessageBreak
using 'structure=article'}}
\else
+% \end{macrocode}
+% Nowadays there is no longer any sense in having a different numbering
+% for the frontmatter pages. For this reason we redefine the \cmd{frontmatter} command in order to obtain Arabic numerals.
+% \begin{macrocode}
\renewcommand\frontmatter{\cleardoublepage\@mainmatterfalse}
\renewcommand\mainmatter{\cleardoublepage\@mainmattertrue}
\fi
% \end{macrocode}
% In a previous version the \cmd{hemph} command was provided
% to fix a bug in the hyphenation of some italian expressions
-% like ``dell'\emph{encyclopaedia}''. Now the bug has been fixed by the \sty{fixltxhyph} package by Claudio Beccari. The package
-% must be loaded after \sty{babel} or \sty{polyglossia}:
+% like ``dell'\emph{encyclopaedia}''. Now the bug has been fixed by the
+% \sty{fixltxhyph} package by Claudio Beccari. The \cmd{hemph} command
+% is provided only for backward compatibility. Note that the \sty{fixltxhyph}
+% package must be loaded after \sty{babel} or \sty{polyglossia}.
% \begin{macrocode}
\@ifpackageloaded{babel}
{\AtBeginDocument{\RequirePackage{fixltxhyph}}}{}
\@ifpackageloaded{polyglossia}
{\AtBeginDocument{\RequirePackage{fixltxhyph}}}{}
-% \end{macrocode}
-% The \cmd{hemph} command is provided only for
-% backward compatibility:
-% \begin{macrocode}
\let\hemph\emph
% \end{macrocode}
% The first line of all sections is indented by default
-% using \XeLaTeX{} with Italian as the main language. Anyway this is
-% incongruous with the \LaTeX{} default.
+% using \hologo{XeLaTeX} with Italian as the main language. I think that this is
+% incongruous with the \hologo{LaTeX} default. For this reason:
% \begin{macrocode}
\unless\ifPDFTeX% if xetex or luatex
\let\@afterindenttrue\@afterindentfalse
@@ -5350,7 +5613,8 @@ Janusz M. Nowacki.
\relax
\fi
% \end{macrocode}
-% Just one touch of french typography:
+% Now we switch off extra space after punctuation, in accordance with the habits
+% of European typography, especially the Italian one. The user can restore standard behavior with the \cmd{nonfrenchspacing} command.
% \begin{macrocode}
\frenchspacing
% \end{macrocode}
@@ -5358,7 +5622,6 @@ Janusz M. Nowacki.
%</class>
% \fi
%
-%
% \iffalse
%<*bib>
@book{Morison:1111,
@@ -5394,7 +5657,7 @@ Janusz M. Nowacki.
Month = {10},
Number = {9},
Title = {Creare stili bibliografici con \textsf{biblatex}:
- l'esperienza del pacchetto {biblatex-philosophy}},
+ l'esperienza del pacchetto {biblatex-philosophy}},
Year = {2010}}
@book{Bringhurst:1992,
@@ -5407,6 +5670,7 @@ Janusz M. Nowacki.
Title = {The Elements of Typographic Style},
related = {Bringhurst:1992-ITA}
}
+
@book{Bringhurst:1992-ITA,
Author = {Robert Bringhurst},
title = {Gli elementi dello stile tipografico},
@@ -5414,10 +5678,11 @@ Janusz M. Nowacki.
Edition = {5},
Location = {Milano},
Publisher = {Sylvestre Bonnard}}
+
@book{Tschichold:1975,
Author = {Jan Tschichold},
Booktitle = {Ausgewählte Aufsätze über Fragen der Gestalt des
- Buches und der Typographie},
+ Buches und der Typographie},
Location = {Basel},
Origdate = {2003},
Origlocation = {Milano},
@@ -5425,7 +5690,7 @@ Janusz M. Nowacki.
Origtitle = {La forma del libro},
Publisher = {Birkhäuser Verlag},
Title = {Ausgewählte Aufsätze über Fragen der Gestalt des Buches
- und der Typographie},
+ und der Typographie},
Year = {1975}}
@online{Lehman:2010,
@@ -5443,7 +5708,7 @@ Janusz M. Nowacki.
@book{Pantieri:2011,
Author = {Lorenzo Pantieri and Tommaso Gordini},
- Booktitle = {L'arte di scrivere con LATEX},
+ Booktitle = {L'arte di scrivere con \LaTeX},
Date = {2012},
Edition = {new edition},
Foreword = {Enrico Gregorio},
@@ -5451,9 +5716,9 @@ Janusz M. Nowacki.
Subtitle = {Un'introduzione a \LaTeXe},
Title = {L'arte di scrivere con \LaTeX},
Url = {http://www.lorenzopantieri.net/LaTeX_files/ArteLaTeX.pdf},
- Annote = {Questa guida Ë diventata il punto di riferimento degli utenti
- italiani di \LaTeX\ ed Ë apprezzata per la chiarezza espositiva e la
- completezza dei contenuti}}
+ Annote = {Questa guida è diventata il punto di riferimento degli utenti
+ italiani di \LaTeX\ ed è apprezzata per la chiarezza espositiva e la
+ completezza dei contenuti}}
@article{Pantieri:2009,
Author = {Lorenzo Pantieri},
@@ -5471,28 +5736,364 @@ Janusz M. Nowacki.
Year = {2008}}
@article{valbusa:20122,
- Author = {Ivan Valbusa},
- Date = {2012},
- Date-Added = {2013-08-23 10:45:16 +0200},
- Date-Modified = {2013-08-23 10:48:03 +0200},
- Journaltitle = {\Ars},
- Month = {10},
- Number = {14},
- Pages = {15-30},
- Subtitle = {La classe suftesi},
- Title = {La forma del testo umanistico},
- url={http://www.guitex.org/home/images/ArsTeXnica/AT014/valbusa.pdf}}
+ Author = {Ivan Valbusa},
+ Date = {2012},
+ Journaltitle = {\Ars},
+ Month = {10},
+ Number = {14},
+ Pages = {15-30},
+ Subtitle = {La classe suftesi},
+ Title = {La forma del testo umanistico},
+ url={http://www.guitex.org/home/images/ArsTeXnica/AT014/valbusa.pdf}}
@book{munari:arte-come-mestiere,
- Author = {Bruno Munari},
- Booktitle = {Arte come mestiere},
- Date-Added = {2016-03-12 16:39:37 +0000},
- Date-Modified = {2016-03-12 16:40:07 +0000},
- Location = {Roma-Bari},
- Publisher = {Laterza},
- Title = {Arte come mestiere},
- Year = {1966}}
+ Author = {Bruno Munari},
+ Booktitle = {Arte come mestiere},
+ Location = {Roma-Bari},
+ Publisher = {Laterza},
+ Title = {Arte come mestiere},
+ Year = {1966}}
+
+@manual{amsthm,
+ title = {The \textsf{\MakeLowercase{Amsthm}} package},
+ subtitle = {Typesetting theorems (AMS style)},
+ author = {{The American Mathematical Society}},
+ url = {http://www.ams.org/tex/amslatex.html},
+ urldate = {2020-05-24},
+ date = {2020-05-29},
+ version = {2.20.6}
+}
+
+@manual{appendix,
+ title = {The \textsf{\MakeLowercase{Appendix}} package},
+ subtitle = {Extra control of appendices},
+ author = {Robertson, Will and Wilson, Peter R.},
+ url = {http://www.ctan.org/pkg/appendix},
+ urldate = {2020-05-24},
+ date = {2020-02-08},
+ version = {1.2c}
+}
+
+@manual{bera,
+ title = {The \textsf{\MakeLowercase{bera}} package},
+ subtitle = {Bera fonts},
+ author = {Walter Schmidt},
+ url = {http://www.ctan.org/pkg/bera},
+ urldate = {2020-05-24},
+ date = {2004-09-30},
+ version = {}
+}
+
+@manual{biolinum,
+ title = {The \textsf{\MakeLowercase{biolinum-type1}} package},
+ subtitle = {(pdf)\LaTeX\ support for the Biolinum family of fonts},
+ author = {Bob Tennent},
+ url = {https://www.ctan.org/pkg/biolinum-type1},
+ urldate = {2020-05-24},
+ date = {2012-10-30},
+ version = {5.3.0}
+}
+
+@manual{caption,
+ title = {The \textsf{\MakeLowercase{Caption}} package},
+ subtitle = {Customising captions in floating environments},
+ author = {Sommerfeldt, Axel},
+ url = {http://www.ctan.org/pkg/caption},
+ urldate = {2020-05-24},
+ date = {2020-05-30},
+ version = {}
+}
+
+@manual{cclicenses,
+ title = {The \textsf{\MakeLowercase{CClicenses}} package},
+ subtitle = {Typeset Creative Commons licence logos},
+ author = {Pignalberi, Gianluca},
+ url = {http://www.ctan.org/pkg/cclicenses},
+ urldate = {2020-05-24},
+ date = {2005/05/20},
+ version = {v0.4}
+}
+
+@manual{cochineal,
+ title = {The \textsf{\MakeLowercase{Cochineal}} package},
+ subtitle = {Cochineal fonts with \LaTeX\ support},
+ author = {Sharpe, Michael},
+ url = {http://www.ctan.org/pkg/cochineal},
+ urldate = {2020-05-24},
+ date = {2016-2020},
+ version = {1.061}
+}
+
+@manual{color,
+ title = {The \textsf{\MakeLowercase{Color}} package},
+ subtitle = {Colour control for \LaTeX\ documents},
+ author = {Carlisle, David and {The \LaTeX\ Team}},
+ url = {http://www.ctan.org/pkg/color},
+ urldate = {2020-05-24},
+ date = {2019-11-23},
+ version = {1.2a}
+}
+
+@manual{crop,
+ title = {The \textsf{\MakeLowercase{Crop}} package},
+ subtitle = {Support for cropmarks},
+ author = {Franz, Melchior},
+ url = {http://www.ctan.org/pkg/crop},
+ urldate = {2020-05-24},
+ date = {2020-06-05},
+ version = {1.10.2}
+}
+
+@manual{emptypage,
+ title = {The \textsf{\MakeLowercase{Emptypage}} package},
+ subtitle = {Make empty pages really empty},
+ author = {Wette, Karl},
+ url = {http://www.ctan.org/pkg/emptypage},
+ urldate = {2020-05-24},
+ date = {2009-2010},
+ version = {1.2}
+}
+
+@manual{enumitem,
+ title = {The \textsf{\MakeLowercase{Enumitem}} package},
+ subtitle = {Control layout of itemize, enumerate, description},
+ author = {Bezos López, Javier},
+ url = {http://www.texnia.com/enumitem.html},
+ urldate = {2020-05-24},
+ date = {2019-06-20},
+ version = {3.9}
+}
+
+@manual{fancyhdr,
+ title = {The \textsf{\MakeLowercase{Fancyhdr}} package},
+ subtitle = {Extensive control of page headers and footers in \hologo{LaTeX2e}},
+ author = {van Oostrum, Piet},
+ url = {http://www.ctan.org/pkg/fancyhdr},
+ urldate = {2020-05-24},
+ date = {2019-01-31},
+ version = {3.10}
+}
+
+@manual{fixltxhyph,
+ title = {The \textsf{\MakeLowercase{Fixltxhyph}} package},
+ subtitle = {Allow hyphenation of partially-emphasised substrings},
+ author = {Beccari, Claudio},
+ url = {http://www.ctan.org/pkg/fixltxhyph},
+ urldate = {2020-05-24},
+ date = {2011},
+ version = {0.4}
+}
+
+@manual{fontsize,
+ title = {The \textsf{\MakeLowercase{Fontsize}} package},
+ subtitle = {A small package to set arbitrary sizes for the main font of the document},
+ author = {Valbusa, Ivan},
+ url = {http://www.ctan.org/pkg/fontsize},
+ urldate = {2020-05-24},
+ date = {2020-05-24},
+ version = {0.1}
+}
+
+@manual{geometry,
+ title = {The \textsf{\MakeLowercase{Geometry}} package},
+ subtitle = {Flexible and complete interface to document dimensions},
+ author = {Carlisle, David and Umeki, Hideo},
+ url = {http://www.ctan.org/pkg/geometry},
+ urldate = {2020-05-24},
+ date = {2020-01-02},
+ version = {5.9}
+}
+
+@manual{iftex,
+ title = {The \textsf{\MakeLowercase{Iftex}} package},
+ subtitle = {Am I running under pdf\TeX, Xe\TeX\ or Lua\TeX?},
+ author = {Khalighi, Vafa and {The \LaTeX\ Team}},
+ url = {http://www.ctan.org/pkg/iftex},
+ urldate = {2020-05-24},
+ date = {2020-03-06},
+ version = {1.0d}
+}
+
+@manual{inconsolata,
+ title = {The \textsf{\MakeLowercase{Inconsolata}} package},
+ subtitle = {A monospaced font, with support files for use with \TeX},
+ author = {Levien, Raph and Berry, Karl and Sharpe, Michael},
+ url = {http://levien.com/type/myfonts/inconsolata.html},
+ urldate = {2020-05-24},
+ date = {2019-06-20},
+ version = {1.121}
+}
+
+@manual{libertine,
+ title = {The \textsf{\MakeLowercase{Libertine}} package},
+ subtitle = {Use of Linux Libertine and Biolinum fonts with \LaTeX},
+ author = {Tennent, Bob},
+ url = {http://www.ctan.org/pkg/libertine},
+ urldate = {2020-05-24},
+ date = {2020-03-26},
+ version = {5.3.0}
+}
+
+@manual{libertinust1math,
+ title = {The \textsf{\MakeLowercase{LibertinusT1Math}} package},
+ subtitle = {A Type 1 font and \LaTeX\ support for Libertinus Math},
+ author = {Sharpe, Michael},
+ url = {http://www.ctan.org/pkg/libertinust1math},
+ urldate = {2020-05-24},
+ date = {2018-10-07},
+ version = {1.1.9}
+}
+
+@manual{lm,
+ title = {The \textsf{\MakeLowercase{lm}} package},
+ subtitle = {Latin modern fonts in outline formats},
+ author = {B. Jackowski and J.M. Nowacki},
+ url = {http://www.ctan.org/pkg/lmodern},
+ urldate = {2020-05-24},
+ date = {2003-2009},
+ version = {2.004}
+}
+
+@manual{luatex85,
+ title = {The \textsf{\MakeLowercase{Luatex85}} package},
+ subtitle = {pdfTeX aliases for Lua\TeX},
+ author = {{The \LaTeX\ Team} and Carlisle, David and Wright, Joseph},
+ url = {http://www.ctan.org/pkg/luatex85},
+ urldate = {2020-05-24},
+ date = {2016-06-15},
+ version = {1.4}
+}
+
+@manual{mathalpha,
+ title = {The \textsf{\MakeLowercase{Mathalpha}} package},
+ subtitle = {General package for loading maths alphabets in \LaTeX},
+ author = {Sharpe, Michael},
+ url = {http://www.ctan.org/pkg/mathalpha},
+ urldate = {2020-05-24},
+ date = {2019-10-05},
+ version = {1.13}
+}
+
+@manual{mathpazo,
+ title = {The \textsf{\MakeLowercase{Mathpazo}} package},
+ subtitle = {Fonts to typeset mathematics to match Palatino},
+ author = {Puga, Diego},
+ url = {http://www.ctan.org/pkg/mathpazo},
+ urldate = {2020-05-24},
+ date = {2002},
+ version = {1.003}
+}
+
+@manual{microtype,
+ title = {The \textsf{\MakeLowercase{Microtype}} package},
+ subtitle = {Subliminal refinements towards typographical perfection},
+ author = {Schlicht, Robert},
+ url = {http://www.ctan.org/pkg/microtype},
+ urldate = {2020-05-24},
+ date = {2019-11-18},
+ version = {2.7d}
+}
+
+@manual{multicol,
+ title = {The \textsf{\MakeLowercase{Multicol}} package},
+ subtitle = {Intermix single and multiple columns},
+ author = {Mittelbach, Frank and {The \LaTeX\ Team}},
+ url = {http://www.ctan.org/pkg/multicol},
+ urldate = {2020-05-24},
+ date = {2019-12-09},
+ version = {1.8y}
+}
+
+@manual{newpx,
+ title = {The \textsf{\MakeLowercase{newpx}} package},
+ subtitle = {Alternative uses of the PX fonts, with improved metrics},
+ author = {Michael Sharpe},
+ url = {http://www.ctan.org/pkg/newpxmath},
+ urldate = {2020-05-24},
+ date = {2020-05-17},
+ version = {1.411}
+}
+
+
+@manual{newtx,
+ title = {The \textsf{\MakeLowercase{newtx}} package},
+ subtitle = {Alternative uses of the TX fonts, with improved metrics},
+ author = {Michael Sharpe},
+ url = {http://www.ctan.org/pkg/newtxmath},
+ urldate = {2020-05-24},
+ date = {2020-05-17},
+ version = {1.627}
+}
+
+@manual{substitutefont,
+ title = {The \textsf{\MakeLowercase{Substitutefont}} package},
+ subtitle = {Easy font substitution},
+ author = {Milde, Günter},
+ url = {http://www.ctan.org/pkg/substitutefont},
+ urldate = {2020-05-24},
+ date = {2013-11-04},
+ version = {0.1.4}
+}
+
+@manual{textcomp,
+ title = {The \textsf{\MakeLowercase{Textcomp}} package},
+ subtitle = {\LaTeX\ support for the Text Companion fonts},
+ author = {Rahtz, Sebastian},
+ url = {http://www.ctan.org/pkg/textcomp},
+ urldate = {2020-05-24},
+ date = {1995},
+ version = {}
+}
+
+@manual{titlesec,
+ title = {The \textsf{\MakeLowercase{Titlesec}} package},
+ subtitle = {Select alternative section titles},
+ author = {Bezos López, Javier},
+ url = {http://www.ctan.org/pkg/titlesec},
+ urldate = {2020-05-24},
+ date = {2019-10-16},
+ version = {2.13}
+}
+
+@manual{titletoc,
+ title = {The \textsf{\MakeLowercase{Titletoc}} package},
+ subtitle = {Alternative headings for toc/lof/lot},
+ author = {Bezos López, Javier},
+ url = {http://www.ctan.org/pkg/titletoc},
+ urldate = {2020-05-24},
+ date = {2019-10-16},
+ version = {2.13}
+}
+
+@manual{xkeyval,
+ title = {The \textsf{\MakeLowercase{Xkeyval}} package},
+ subtitle = {Extension of the keyval package},
+ author = {Adriaens, Hendri},
+ url = {http://www.ctan.org/pkg/xkeyval},
+ urldate = {2020-05-24},
+ date = {2014-03-12},
+ version = {2.7a}
+}
+
+@manual{bookcover,
+ title = {The \textsf{bookcover} class},
+ subtitle = {Class for book covers and dust jackets},
+ author = {Tibor Tómács},
+ url = {http://www.ctan.org/pkg/bookcover},
+ urldate = {2020-06-29},
+ date = {2018-01-21},
+ version = {v2.3}
+}
+
+@manual{afterpage,
+ title = {The \textsf{afterpage} package},
+ subtitle = { Execute command after the next page break},
+ author = {David Carlisle},
+ url = {http://www.ctan.org/pkg/bookcover},
+ urldate = {2020-06-29},
+ date = {2014-10-28},
+ version = {v1.08}
+}
%</bib>
% \fi
-%
% \Finale
diff --git a/Master/texmf-dist/source/latex/svg/svg.dtx b/Master/texmf-dist/source/latex/svg/svg.dtx
index b2ccb234b8b..aa30fbab719 100644
--- a/Master/texmf-dist/source/latex/svg/svg.dtx
+++ b/Master/texmf-dist/source/latex/svg/svg.dtx
@@ -1,128 +1,130 @@
-% \CheckSum{3882}
% \iffalse meta-comment
+%<*identify>
%
% svg and svg-extract -- Handling SVG pictures in LaTeX documents
-% ----------------------------------------------------------------------------
%
-% Copyright (C) Philip Ilten <philten@cern.ch>, 2012-2016
-% Copyright (C) Falk Hanisch <hanisch.latex@outlook.com>, 2017-
-%
-% ----------------------------------------------------------------------------
-%
-% This work may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License, version 1.3c of the license. 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 2005/12/01
-% or later and of this work. This work has the LPPL maintenance status
-% "author-maintained". The current maintainer and author of this work
-% is Falk Hanisch.
-%
-% ----------------------------------------------------------------------------
+%% ----------------------------------------------------------------------------
+%%
+%% Copyright (C) Philip Ilten <philten@cern.ch>, 2012-2016
+%% Copyright (C) Falk Hanisch <hanisch.latex@outlook.com>, 2017-2020
+%%
+%% ----------------------------------------------------------------------------
+%%
+%% This work may be distributed and/or modified under the conditions
+%% of the LaTeX Project Public License, version 1.3c of the license.
+%% 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 2005/12/01 or later and of this work.
+%%
+%% This work has the LPPL maintenance status "author-maintained".
+%%
+%% The current maintainer and author of this work is Falk Hanisch.
+%%
+%% This work consists of the main source file README.md, LICENSE.md, svg.dtx
+%% and the derived documentation svg.pdf as well as the example files
+%% svg-example.svg, svg-preamble.tex and root.C (with derived file root.svg).
+%%
+%% ----------------------------------------------------------------------------
+%%
+%</identify>
+% \fi
%
-%<*batchfile>
-\ifx\documentclass\@undefined
+% \iffalse
+%<*dtx>
+\ifx\documentclass\undefined
\input docstrip.tex
\keepsilent
-\begingroup
-\catcode`\^^M=13 \catcode`\ =12 %
-\gdef\svgpreamble{%
-Copyright (C) Philip Ilten <philten@cern.ch>, 2012-2016
-Copyright (C) Falk Hanisch <hanisch.latex@outlook.com>, 2017-
-
-This file was generated from file svg.dtx.
-----------------------------------------------------------------------------
-
-This work may be distributed and/or modified under the conditions
-of the LaTeX Project Public License, version 1.3c of the license.
-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 2005/12/01 or later and of this work.
-
-This work has the LPPL maintenance status "author-maintained".
-
-The current maintainer and author of this work is Falk Hanisch.
-
-This work consists of the main source file README.md, LICENSE.md, svg.dtx
-and the derived documentation svg.pdf as well as the example files
-svg-example.svg, svg-preamble.tex and root.C (with derived file root.svg).
-}
-\endgroup
-
-\declarepreamble\svgbasepreamble
+\declarepreamble\svgmainpreamble
svg -- Include SVG pictures in LaTeX documents using Inkscape
-\svgpreamble
-
\endpreamble
\declarepreamble\svgextractpreamble
svg-extract -- Extract independent graphic files from SVG pictures
-\svgpreamble
-
\endpreamble
\askforoverwritefalse
\usedir{tex/latex/svg}
\generate{%
- \usepreamble\svgbasepreamble
- \file{svg.sty}{%
- \from{svg.dtx}{package,option,base}%
- \from{svg.dtx}{package,body,base}%
+ \usepreamble\svgmainpreamble
+ \file{svg.sty}{
+ \from{svg.dtx}{package,identify,main}
+ \from{svg.dtx}{package,base,main}
+ \from{svg.dtx}{package,option,main}
+ \from{svg.dtx}{package,body,main}
}
\usepreamble\svgextractpreamble
- \file{svg-extract.sty}{%
- \from{svg.dtx}{package,option,extract}%
- \from{svg.dtx}{package,body,extract}%
+ \file{svg-extract.sty}{
+ \from{svg.dtx}{package,identify,extract}
+ \from{svg.dtx}{package,base,extract}
+ \from{svg.dtx}{package,option,extract}
+ \from{svg.dtx}{package,standalone,extract}
+ \from{svg.dtx}{package,body,extract}
}
-% \usepreamble\defaultpreamble
-% \file{svg-old.sty}{%
-% \from{svg.dtx}{package,old}%
-% }
}
\else
\let\endbatchfile\relax
\fi
\endbatchfile
-%</batchfile>
-%
+%</dtx>
% \fi
%
-% \CharacterTable
-% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
-% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
-% Digits \0\1\2\3\4\5\6\7\8\9
-% Exclamation \! Double quote \" Hash (number) \#
-% Dollar \$ Percent \% Ampersand \&
-% Acute accent \' Left paren \( Right paren \)
-% Asterisk \* Plus \+ Comma \,
-% Minus \- Point \. Solidus \/
-% Colon \: Semicolon \; Less than \<
-% Equals \= Greater than \> Question mark \?
-% Commercial at \@ Left bracket \[ Backslash \\
-% Right bracket \] Circumflex \^ Underscore \_
-% Grave accent \` Left brace \{ Vertical bar \|
-% Right brace \} Tilde \~}
+% \iffalse
+%<*dtx|package&identify>
+\NeedsTeXFormat{LaTeX2e}[2020-02-02]
+%<*dtx>
+\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
+%</dtx>
+\begingroup
+ \catcode`\@11\relax%
+ \def\svg@Provides#1#2[#3]{%
+ \def\@tempa{\def\svg@version{#3}}%
+ \ifx\svg@version\@undefined\else%
+ \def\@tempb{#3}%
+ \ifx\svg@version\@tempb\else%
+ \def\@tempa{%
+ \@latex@warning@no@line{%
+ The version of package `#1' is `#3',\MessageBreak%
+ but `\svg@version' was expected!\MessageBreak%
+ You should update the svg bundle%
+ }%
+ }%
+ \fi%
+ \fi%
+ \edef\@tempb{%
+ \endgroup%
+%<*dtx>
+ \noexpand\ProvidesFile%
+%</dtx>
+%<package&identify> \noexpand\ProvidesPackage%
+ {#1}[#3\space(#2)]%
+%<package&identify&extract> \noexpand\RequirePackage{svg}[#3]%
+ \unexpanded\expandafter{\@tempa}%
+ }%
+ }%
+ \svg@Provides%
+%<*dtx>
+ {svg.dtx}{source}%
+%</dtx>
+%<package&identify&main> {svg}{include SVG pictures}%
+%<package&identify&extract> {svg-extract}{extract graphics from SVG pictures}%
+ [2020/11/26 v2.02k]%
+\@tempb
+%</dtx|package&identify>
+% \fi
%
% \iffalse
-%<package&option>\NeedsTeXFormat{LaTeX2e}[2019-10-01]
-%<*driver>
-\ifx\ProvidesFile\@undefined\def\ProvidesFile#1[#2]{}\fi
-\ProvidesFile{svg.dtx}[%
-%</driver>
-%<package&option&base>\ProvidesPackage{svg}[%
-%<package&option&extract>\ProvidesPackage{svg-extract}[%
-%<*driver|package&option>
- 2020/01/13 v2.02e\space%
-%<package&option&base> (include SVG pictures)%
-%<package&option&extract> (extract independent graphics from SVG pictures)%
-]
-%</driver|package&option>
-%<*driver>
+%<*dtx>
\documentclass[english,xindy]{tudscrdoc}[2017/03/27]
-\usepackage[T1]{fontenc}
+\usepackage{iftex}[2020/03/06]
+\iftutex
+ \usepackage{fontspec}
+\else
+ \usepackage[T1]{fontenc}
+\fi
\usepackage{babel}
\KOMAoptions{parskip=half-}
\usepackage{marginnote}
@@ -147,18 +149,18 @@ svg-extract -- Extract independent graphic files from SVG pictures
\usepackage{listings}
\lstset{%
- inputencoding=utf8,extendedchars=true,
+ inputencoding=utf8,extendedchars=true,%
literate=%
{ä}{{\"a}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
{Ä}{{\"A}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
- {~}{{\textasciitilde}}1 {ß}{{\ss}}1
+ {ß}{{\ss}}1 {~}{{\textasciitilde}}1
+ {»}{{\guillemetright}}1 {«}{{\guillemetleft}}1
}
\newcommand*\svglstbelowskip{\medskipamount}
\AtBeginDocument{%
- \edef\svglstbelowskip{\the\glueexpr\medskipamount-\parskip\relax}
+ \renewcommand*\svglstbelowskip{\glueexpr\medskipamount-\parskip\relax}%
}
\lstdefinestyle{svg}{%
-% language=[LaTeX]TeX,%
basicstyle=\small\ttfamily,%
columns=flexible,%
frame=single,%
@@ -166,7 +168,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
xleftmargin=\fboxsep,%
xrightmargin=\fboxsep,%
gobble=2,%
- escapechar=§,
+ escapechar=§,%
belowskip=\svglstbelowskip,%
}
\lstnewenvironment{svgexample}[1][]{%
@@ -186,85 +188,101 @@ svg-extract -- Extract independent graphic files from SVG pictures
\CodelineIndex
\RecordChanges
\GetFileInfo{svg.dtx}
-\title{The packages \pkg{svg} and \pkg{svg-extract}}
-\author{%
- Philip Ilten (2012--2016) \\
- Falk Hanisch (2017--) \\
- \url{https://github.com/mrpiggi/svg} \\
- \mailto{hanisch.latex@outlook.com}
-}
-\date{\fileversion\nobreakspace(\filedate)}
+
+\makeatletter
+\newcommand*\notebox[2][\svglstbelowskip]{%
+ \ifhmode%
+ \vskip\svglstbelowskip%
+ \else%
+ \addpenalty{\@beginparpenalty}%
+ \addvspace{\svglstbelowskip}%
+ \fi%
+ \noindent%
+ \fbox{\parbox{\dimexpr\linewidth-(\fboxsep+\fboxrule)*2\relax}{#2}}%
+ \par\vskip#1\noindent\ignorespaces%
+}
+\makeatother
\begin{document}
- \maketitle
+ \title{The packages \pkg{svg} and \pkg{svg-extract}}
+ \author{%
+ Philip Ilten (2012--2016)\\%
+ Falk Hanisch (2017--)\\%
+ \url{https://github.com/mrpiggi/svg}\\%
+ \mailto{hanisch.latex@outlook.com}%
+ }
+ \date{\fileversion\nobreakspace(\filedate)}
+ \providerobustcmd*\default[1]{\val{\textit{#1}}}
+ \maketitle%
\begin{abstract}
\noindent
The \pkg{svg} package is intended for the automated integration of
- SVG~graphics into \LaTeX~documents. Therefor the capabilities provided
- by \app{Inkscape}---or more precisely its command line tool---are used
+ SVG~graphics into \LaTeX~documents. The capabilities provided by
+ \app{Inkscape}---or more precisely its command~line~interface---are used
to export the text within a SVG~graphic to a separate file, which is
- then rendered by \LaTeX. The two commands \cs{includesvg} and
+ then rendered by \LaTeX{}. The two commands \cs{includesvg} and
\cs{includeinkscape} are provided as central user\hbox{-}interface,
which are very similar to the \cs{includegraphics} command of the
\pkg{graphicx} package.
In addition, the package \pkg{svg-extract} allows the extraction of these
graphics into independent files in different graphic formats, exactly as it
- is rendered within the document. For the creation of these graphics in the
- well\hbox{-}known formats PDF, EPS and~PS, \LaTeX{} and possibly conversion
- tools shipped with the distribution are used. If the graphics are required
- in other file formats, either \app{ImageMagick} or \app{Ghostscript} can be
- invoked.
+ is rendered within the \LaTeX~document. For the creation of these graphics
+ in the well\hbox{-}known formats PDF, EPS and~PS, \LaTeX{} and possibly
+ conversion tools shipped with the distribution are used. If the graphics
+ are required in other file formats, either \app{ImageMagick} or
+ \app{Ghostscript} can be invoked.
+
+ \notebox[0pt]{%
+ The command~line~interface~(CLI) of \app{Inkscape}\,1.0 has changed in
+ comparison to previous versions. In order to provide a comfortable
+ user\hbox{-}interface for invoking \app{Inkscape}, the used version is
+ detected and if necessary switch to the outdated syntax of the CLI. If
+ this approach fails for some reason, you can set the version of
+ \app{Inkscape} manually with \opt{inkscapeversion}|=|\val{0} or
+ \opt{inkscapeversion}|=|\val{1}.%
+ }%
\end{abstract}
\tableofcontents
\DocInput{\filename}
\end{document}
-%</driver>
+%</dtx>
% \fi
%
% \changes{v1.0}{2004/11/05}{initial version by Philip Ilten}^^A
% \changes{v2.00}{2016/09/23}{new maintainer: Falk Hanisch}^^A
% \changes{v2.00}{2017/03/27}{re-implementation from scratch}^^A
% \changes{v2.00}{2017/03/27}{package \pkg{subfig} not required anymore}^^A
-% \changes{v2.00}{2017/03/27}{%
-% support of subfigures stopped due to the huge number of packages which deal
-% with this topic and the large variety of implementing this functionality;
-% naming exported graphics after their consecutive numbering can't be ensured
-% for all variants of subfigures, so it's neglected%
-% }^^A
-% \changes{v2.01}{2017/11/27}{%
-% new option \opt{svgextension} to change the format of files exported by
-% \app{Inkscape} from \file{svg} to a custom one
-% }^^A
-% \changes{v2.01}{2017/11/28}{%
-% usage of \cs{input}\marg{tex filename} within \app{Inkscape}~graphics
-% locates files in all declared searched folders
-% }^^A
+% \changes{v2.00}{2017/03/27}{support of subfigures stopped due to the huge
+% number of packages which deal with this topic and the large variety of
+% implementing this functionality; naming exported graphics after their
+% consecutive numbering can't be ensured for all variants of subfigures, so
+% it's neglected}^^A
+% \changes{v2.01}{2017/11/28}{usage of \cs{input}\marg{tex~filename} within
+% \app{Inkscape}~graphics locates files in all declared searched folders}^^A
% \changes{v2.02}{2018/09/07}{package \pkg{trimspaces} required}^^A
% \changes{v2.02}{2018/09/07}{multiple dots within file names possible}^^A
-% \changes{v2.02}{2018/09/07}{%
-% fixed errors with active double qoutes from \pkg{babel} in path arguments%
-% }^^A
-% \changes{v2.02}{2018/09/07}{%
-% distortion of included and extracted graphics supported with options
-% \opt{distort} (or \opt{keepaspectratio}) and \opt{extractdistort}
-% as well as rotation for extractions (\opt{extractangle})
-% }^^A
-% \changes{v2.02a}{2018/10/17}{%
-% fix bug for package \pkg{polyglossia} which fakes \pkg{babel} poorly%
-% }^^A
-% \changes{v2.02b}{2018/11/12}{%
-% fix bug for package \pkg{tikzscale} which changes \cs{includegraphics}
-% globally%
-% }^^A
-% \changes{v2.02c}{2019/10/10}{%
-% fix bugs with current kernel (2019/10/01) regarding file name parsing
-% }^^A
-% \changes{v2.02d}{2019/10/22}{%
-% fix bugs with current kernel (2019/10/01) regarding file name parsing, see
-% \url{https://github.com/mrpiggi/svg/issues/16}
-% }^^A
-% \ToDo{Workaround for missing \cs{transparent} (Lua\TeX lacks support)}[v2.03]
+% \changes{v2.02}{2018/09/07}{fixed errors with active double quotes from
+% \pkg{babel} in path arguments}^^A
+% \changes{v2.02a}{2018/10/17}{fix bug for package \pkg{polyglossia} which
+% fakes \pkg{babel} poorly}^^A
+% \changes{v2.02b}{2018/11/12}{fix bug for package \pkg{tikzscale} which
+% changes \cs{includegraphics} globally}^^A
+% \changes{v2.02c}{2019/10/10}{fix bugs with kernel (2019/10/01) regarding file
+% name parsing}^^A
+% \changes{v2.02d}{2019/10/22}{fix bugs with kernel (2019/10/01) regarding file
+% name parsing, see \url{https://github.com/mrpiggi/svg/issues/16}}^^A
+% \changes{v2.02d}{2019/10/22}{conditional invocation of \app{Inkscape} export
+% based on file modification date implemented for Xe\TeX{}}^^A
+% \changes{v2.02f}{2020/05/06}{command~line~interface of \app{Inkscape~1.0}
+% is supported}^^A
+% \changes{v2.02g}{2020/06/12}{fix for multiple dots in file names (\#27)}^^A
+% \changes{v2.02h}{2020/06/23}{fix for package \pkg{transparent} (\#28)}^^A
+% \changes{v2.02i}{2020/09/29}{update for package \pkg{scrlfile} v3.32 and
+% kernel (2020/10/01)}^^A
+% \changes{v2.02j}{2020/10/23}{bug fix for automatic version detection of
+% \app{Inkscape} with MiK\TeX}^^A
+% \changes{v2.02k}{2020/11/26}{MiK\TeX was updated, bug fix removed}^^A
%
%
%
@@ -272,21 +290,21 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \section{Introduction}
%
% The open source program \app{Inkscape} has provided an excellent resource for
-% the simple and easy creation of images and diagrams using a graphical user
-% interface. The work by Johan\,B.\,C.~Engelen has further enhanced the ability
-% of \app{Inkscape} to split a SVG~file into a text component that can be
-% compiled with \LaTeX, and an image component that can be imported as a
-% PDF~file. For further information see the documentation of
+% the simple and easy creation of images and diagrams using a graphical
+% user\hbox{-}interface. The work by Johan\,B.\,C.~Engelen has further enhanced
+% the ability of \app{Inkscape} to split a SVG~file into a text component that
+% can be compiled with \LaTeX{}, and an image component that can be imported
+% as a PDF~file. For further information see the documentation of
% \hrfn{http://www.ctan.org/pkg/svg-inkscape}{\pkg{svg-inkscape} on CTAN}.
% The procedure described therein is taken up and consistently expanded. Thus,
% it is now possible to include a SVG~file into a \LaTeX~document where the
-% text within the SVG~graphic will be rendered natively by \LaTeX.
-%
+% text within the SVG~graphic will be rendered natively by \LaTeX{}.
+%
% Both packages \pkg{svg} and \pkg{svg-extract} rely heavily upon executing
-% commands from the shell using the \cs{ShellEscape} command---or respectively
-% the old known \cs{write18}---for executing a variety of commands directly to
-% the system. So it is necessary to include the flag \file{-{}-shell-escape}
-% when compiling documents using \pkg{svg} and/or \pkg{svg-extract}. The
+% commands on shell using the \cs{ShellEscape} command---or respectively the
+% old known \cs{write18}---for executing the CLIs of the applications mentioned
+% above. So passing flag \file{-{}-shell-escape} to the \LaTeX~engine is
+% utterly essential when using package \pkg{svg} and/or \pkg{svg-extract}. The
% executed commands and the possibilities to adapt their invocation with the
% appropriate options are described later on in this documentation. All this is
% done automatically with the \cs{includesvg} command. If you don't want to use
@@ -299,8 +317,8 @@ svg-extract -- Extract independent graphic files from SVG pictures
% known to the operating system. This can be checked on shell by typing
% \file{inkscape -V}. Moreover, there are some required packages which are
% loaded by packages \pkg{svg} and \pkg{svg-extract} to provide the
-% functionallity. These are:
-% \begin{description}[parsep=.5\smallskipamount]
+% functionality. These are:
+% \begin{description}[parsep=\glueexpr\smallskipamount/2\relax]
% \item[\pkg{iftex}]
% for flow control depending on the used \LaTeX~engine
% \item[\pkg{scrbase}]
@@ -341,53 +359,60 @@ svg-extract -- Extract independent graphic files from SVG pictures
%
%
%
-% \section{Usage of package \pkg{svg}}\label{sec:inkscape}
+% \section{Usage of package \pkg{svg}\label{sec:inkscape}}
%
-% The purpose of this package is to include SVG~graphics into a \LaTeX~document.
-% The command \cs{includesvg} is defined which does all necessary steps for
-% this task. It first launches the export of a SVG~file to a supported
-% file~format with Inkscape, if necessary, and includes the exported
-% graphic~file afterwards. The usage and the syntax is quite similiar to the
-% command \cs{includegraphics} from the \pkg{graphicx} package. In fact, the
-% inclusion of the exported graphic~file is done with \cs{includegraphics}.
+% The purpose of this package is to include standalone SVG~graphics into a
+% \LaTeX~document. The command \cs{includesvg} is defined which does all
+% necessary steps for this task. It first launches the export of a SVG~file
+% to a supported file~format with Inkscape, if necessary, and includes the
+% exported graphic~file afterwards. The usage and the syntax is quite similar
+% to the command \cs{includegraphics} from the \pkg{graphicx} package. In fact,
+% the inclusion of the exported graphic~file is done with \cs{includegraphics}.
%
-% \DescribeOptions{usexcolor,usetransparent,noxcolor,notransparent}
+% \DescribeOptions{usexcolor,usetransparent,noxcolor,notransparent}^^A
% The packages \pkg{xcolor} and \pkg{transparent} are loaded by default at the
% end of package \pkg{svg}. The listed options are intended to prevent these
% packages from loading. They are the only options which have to be given while
% loading the \pkg{svg} package. All supported boolean values
-% (\val{true/on/yes/false/off/no}) can be assinged to \opt{usexcolor} and
+% (\val{true/on/yes/false/off/no}) can be assigned to \opt{usexcolor} and
% \opt{usetransparent}, while \opt{noxcolor} and \opt{notransparent} don't
% accept any value.
% \begin{svgexample}
% \usepackage§\oarg{options}§{svg}
% \end{svgexample}
-%
+% \notebox[0pt]{^^A
+% Due to the way the \LaTeX~kernel parses package options, problems may occur
+% if any option other than those just mentioned above~-- meaning the options
+% explained hereafter~-- are passed through the optional argument of
+% \cs{usepackage}\oarg{options}|\{svg\}|. It is strongly recommended to use
+% \cs{svgsetup}\marg{options} for these after loading the package instead.^^A
+% }
%
%
% \subsection{General settings}
%
-% \DescribeMacro{\svgsetup}
+% \DescribeMacro{\svgsetup}^^A
% All other options described in detail below can also be changed after loading
% the package either in the preamble or within the document. They don't have to
% be given as optional argument to \cs{usepackage}\oarg{options}|{svg}| but can
-% be set by using macro \cs{svgsetup}\marg{options} where \marg{options} is a
-% comma separated list of options. Settings with \cs{svgsetup} are done in the
-% current scope which means globally or within the current group.
+% be set by using macro \cs{svgsetup}\marg{options} where \meta{options} is a
+% comma separated list of options. These settings are done in the current scope
+% which means either globally or within the current group.
% \begin{svgexample}
% \svgsetup§\marg{options}§
% \end{svgexample}
-% Further, it's possible to reset any setting locally with the optional
-% argument of the commands \cs{includesvg}\oarg{options}\marg{svg filename} or
-% \cs{includesvg}\oarg{options}\marg{graphic filename}.
+% Further, with the optional argument of commands
+% \cs{includesvg}\oarg{options}\marg{svg~filename} or
+% \cs{includeinkscape}\oarg{options}\marg{graphic~filename}, it's possible to
+% reset any setting locally for a certain file.
%
-% \DescribeMacro{\svgpath}
+% \DescribeMacro{\svgpath}^^A
% Most likely you want to organize your SVG~files in a separate folder either
% as a subfolder in the working directory or elsewhere in your local folder
% structure. For this purpose, a list of root paths to SVG~files can be
% specified using the \cs{svgpath} command in the same way as \cs{graphicspath}
% is used. Every path has to be given in a group of braces |{}|---even if there
-% is only one---and terminate with |/| last. For example:
+% is only one---and should terminate with a slash. For example:
% \begin{svgexample}
% \svgpath{{svg/}{/usr/local/svg/}}
% \end{svgexample}
@@ -395,21 +420,23 @@ svg-extract -- Extract independent graphic files from SVG pictures
% afterwards in the absolute path \file{/usr/local/svg/}. Further, if no path
% was specified with \cs{svgpath} or the desired file wasn't found, all
% directories given with \cs{graphicspath} are searched too. Please keep in
-% mind that the current working directory is browsed first in any case. It's
-% recommended to avoid any spaces and/or quotes respectively \cs{dq} both in
-% paths and file~names, especially when DVI~output is active.
+% mind that the current working directory is browsed first in any case.
+% It is recommended to avoid umlauts or any other Non\hbox{-}ASCII characters
+% as well as any spaces and/or quotes respectively \cs{dq} both in paths and
+% file~names. Especially when DVI~output is active using quotes will certainly
+% cause an error.
%
%
%
% \subsection{Options for the invocation of \app{Inkscape}}
%
-% \DescribeOption{inkscape}
+% \DescribeOption{inkscape}^^A
% This option controls, when the export with \app{Inkscape} is invoked and is
-% \val{true} by default.
-% \begin{DescribeValues}
+% \default{true} by default.
+% \begin{DescribeValues}^^A
% \item[false/off/no]
% \app{Inkscape} won't be invoked in any case, no export is done.
-% \item[\textbf{true}/on/yes/newer/onlynewer]
+% \item[\default{true}/on/yes/newer/onlynewer]
% The export with \app{Inkscape} will only be done, if the exported
% graphic~file either does not exist or the file~modification date of the
% SVG~file is newer than that of the exported graphic~file. Thus the
@@ -419,12 +446,12 @@ svg-extract -- Extract independent graphic files from SVG pictures
% The \app{Inkscape}~export will definitely be done, any already existing
% exported file will overwritten regardlessly.
% \end{DescribeValues}
-%
+%
% In addition to controlling the export behavior, the option \opt{inkscape} can
% also be used to make additional settings, which then acts as a wrapper for
% the options described below.
%
-% \begin{DescribeValues}
+% \begin{DescribeValues}^^A
% \item[pdf/eps/ps/png]
% see \opt{inkscapeformat}|=|\val{pdf/eps/ps/png}
% \item[latex/nolatex]
@@ -435,12 +462,12 @@ svg-extract -- Extract independent graphic files from SVG pictures
% see \opt{inkscapedpi}|=|\val{\meta{integer}}
% \end{DescribeValues}
%
-% \DescribeOption{inkscapepath}
+% \DescribeOption{inkscapepath}^^A
% The option \opt{inkscapepath} specifies, where the resulting files of the
-% \app{Inkscape}~export should be located. The subfolder \file{./svg-inkscape/}
-% within the current working directory is used by default
-% (\opt{inkscapepath}|=|\val{basesubdir}).
-% \begin{DescribeValues}
+% \app{Inkscape}~export should be located. The default setting is
+% \default{basesubdir}, which uses the subfolder \file{./svg-inkscape/}
+% within the current working directory.
+% \begin{DescribeValues}^^A
% \item[svgdir/svgpath]
% The PDF/EPS/PS/PNG~graphic~files as well as the \LaTeX~files generated by
% \app{Inkscape} will be located in the same directory as the corresponding
@@ -450,7 +477,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% located in a subfolder named \file{svg-inkscape/}.
% \item[basedir/basepath/jobdir/jobpath]
% All exported files will be located in the current working directory.
-% \item[\textbf{basesubdir}/basesubpath/jobsubdir/jobsubpath]
+% \item[\default{basesubdir}/basesubpath/jobsubdir/jobsubpath]
% A subfolder named \file{svg-inkscape/} within the current working directory
% will be used for files generated by \app{Inkscape}.
% \item[/path/to/somewhere/]
@@ -458,24 +485,53 @@ svg-extract -- Extract independent graphic files from SVG pictures
% working directory (\file{./relative/path/}) or as an absolute path.
% \end{DescribeValues}
%
-% \DescribeOption{inkscapename}
-% The file names of the \app{Inkscape}~export are derived from the name of the
-% base SVG~file and can be modified with \opt{inkscapename}|=|\meta{filename}.
-% It's possible to use counters for specifying the name of the exported file.
-% Repeatedly specifying the same file name will overwrite previously created
-% files.
-%
-% \DescribeOption{inkscapeexe}
+% \DescribeOption{inkscapeexe}^^A
% For including a SVG~file, \app{Inkscape} is used to separate the text and
-% image from the SVG~file itself. In order to execute the command line tool
-% from shell, the path where the executable is located has to be known to the
-% operating system. You can check this by typing \file{inkscape -V} into the
-% shell. If this check fails and you don't want to change environment variable
-% \file{path} on your OS, you can use option \opt{inkscapeexe} to set the
-% absolute path where the executable of \app{Inkscape} is located. The option
-% is set to \opt{inkscapeexe}|=|\val{inkscape} by default.
-%
-% \DescribeOption{inkscapeformat}
+% image from the SVG~file itself. In order to use the command~line~interface
+% on shell, the path where the executable is located has to be known to the
+% operating system and is assumed to be \val{inkscape} by default.
+%
+% You can check if the default setting is valid for your system by typing
+% \file{inkscape -V} into the terminal. If this fails and nothing is returned,
+% you should add the binary directory of \app{Inkscape} to the environment
+% variable \file{PATH} on your operating system. For the case, that this is not
+% possible or you aren't willing to do so, you can alternatively pass option
+% \opt{inkscapeexe} to \cs{svgsetup} \emph{within the document preamble} to set
+% the absolute path where the executable of \app{Inkscape} is located.
+%
+% \notebox[0pt]{^^A
+% Especially if the executable path to be defined \emph{contains spaces}, it
+% \emph{must not} be passed as a package option but to
+% \cs{svgsetup}|\{inkscapeexe=\dots\}| instead!^^A
+% }
+%
+% \DescribeOption{inkscapeversion}^^A
+% \changes{v2.02f}{2020/05/06}{option {inkscapeversion} for explicitly setting
+% \app{Inkscape}-CLI version; automatic detection implemented}^^A
+% The command~line~interface of \app{Inkscape} changed slightly from version
+% \val{0.9x} to \val{1.x} and makes it necessary to distinguish between the two
+% versions. By default, \opt{inkscapeversion}|=|\val{auto} is set and the used
+% version is automatically detected. This is done by calling \app{Inkscape}-CLI
+% with parameter~\prm{-V} on shell---see option \opt{inkscapeexe} described
+% above. The returned result is evaluated by either piping \val{stdout} or
+% eventually---if this fails---writing to a temporary file and read this back
+% in (pipes with a potentially quoted path can not be used with MiK\TeX).^^A
+% \footnote{^^A
+% If this fails too, the \app{Inkscape} version is guessed when macro
+% \cs{svg@ink@run} is used the very first time.^^A
+% }
+% It is also possible to switch off the automatic detection routine by setting
+% the desired version manually with either \opt{inkscapeversion}|=|\val{0} to
+% legacy mode or \opt{inkscapeversion}|=|\val{1} to the current CLI~version.
+%
+% \DescribeOption{inkscapename}^^A
+% \app{Inkscape}~export file~names are derived from the SVG~file~name by
+% default. However, the name of the exported file can be customized with
+% \opt{inkscapename}|=|\file{\meta{filename}}. It is possible to use counters
+% for specifying the name of the exported file. Repeatedly specifying the same
+% file~name will overwrite previously created files.
+%
+% \DescribeOption{inkscapeformat}^^A
% With this option, the \app{Inkscape}~export~format can be controlled. Valid
% values are \val{pdf}, \val{eps}, \val{ps} and \val{png}, where a \LaTeX~export
% is not possible for \val{png} and option \opt{inkscapelatex} won't have any
@@ -483,18 +539,18 @@ svg-extract -- Extract independent graphic files from SVG pictures
% was detected. In this case \opt{inkscapeformat}|=|\val{eps} is the default
% setting.
%
-% \DescribeOption{inkscapelatex}
+% \DescribeOption{inkscapelatex}^^A
% If option \opt{inkscapelatex}|=|\val{true} is set, the output is split into
-% a seperate PDF/EPS/PS~file (see option \opt{inkscapeformat}) and a
+% a separate PDF/EPS/PS~file (see option \opt{inkscapeformat}) and a
% corresponding \LaTeX~file. This is the default setting. Setting
% \opt{inkscapelatex}|=|\val{false} will result in a single PDF/EPS/PS~file,
-% where any contained text won't be rendered by \LaTeX.
+% where any contained text won't be rendered by \LaTeX{}.
%
-% \DescribeOption{inkscapearea}
+% \DescribeOption{inkscapearea}^^A
% This option controls which area of the SVG~file should be exported,
-% \val{drawing} is set by default.
-% \begin{DescribeValues}
-% \item[\textbf{drawing}/crop]
+% \default{drawing} is set by default.
+% \begin{DescribeValues}^^A
+% \item[\default{drawing}/crop]
% The area exported corresponds to the bounding box of all objects in a
% drawing, including any that are not on the page.
% \item[page/nocrop]
@@ -502,101 +558,108 @@ svg-extract -- Extract independent graphic files from SVG pictures
% SVG~file.
% \end{DescribeValues}
%
-% \DescribeOption{inkscapedpi}
+% \DescribeOption{inkscapedpi}^^A
% The resolution used either for PNG~export or for fallback rasterization of
% filtered objects when exporting to PDF/EPS/PS~file. For PNG~export it is set
% to 300\,dpi by default, if no value was given. The given value should be a
% positive integer. The default behaviour can be reversed after a given value
% with \opt{inkscapedpi}|=|\val{\cs{relax}}.
%
-% \DescribeOption{inkscapeopt}
+% \DescribeOption{inkscapeopt}^^A
% You can use this option to pass additional switches to the \app{Inkscape}
-% command line tool. For further information see the documentation of
+% command~line~interface. For further information see the documentation of
% \hrfn{https://inkscape.org/de/doc/inkscape-man.html}{\app{Inkscape}}.
%
-% \DescribeOption{svgextension}
+% \DescribeOption{svgextension}^^A
+% \changes{v2.01}{2017/11/27}{option \opt{svgextension} added in order to
+% change the format of files exported by \app{Inkscape} from \file{svg} to
+% a custom one}^^A
% The package assumes SVG~files with \file{.svg} extension as source for the
% \app{Inkscape} export. This option can be used to change this behaviour.
% For example, in order to process \file{.dia} files instead of \file{.svg} you
% could use
% \begin{svgexample}
-% \includesvg[svgextension=dia,§\meta{additional options}§]§\marg{filename}§
+% \includesvg[svgextension=dia,§\meta{additional~options}§]§\marg{filename}§
% \end{svgexample}
%
%
%
% \subsection{Options for the graphic inclusion}
%
-% \DescribeOptions{width,height,distort,scale}
+% \DescribeOptions{width,height,distort,scale}^^A
+% \changes{v2.02}{2018/09/07}{option \opt{distort} (or \opt{keepaspectratio})
+% added for distortion of included graphics}^^A
% The width of the included graphic~file can be specified via the \opt{width}
% option and the height by the \opt{height} option. If both the width and
% height are specified, the figure will be scaled such that neither of the
% specified dimensions is exceeded, unless option \opt{distort}|=|\val{true} is
-% given.\footnote{\ignorespaces%
-% to provide compatibility for package \pkg{graphicx}, it's possible to use
-% \prm{keepaspectratio}|=|\val{true} as alias for \opt{distort}|=|\val{false}
-% and the other way round
-% } If \opt{width} and/or \opt{height} once have been set, this can be undone
+% given.\footnote{to provide compatibility for package \pkg{graphicx}, it's
+% possible to use \prm{keepaspectratio}|=|\val{true} as alias for
+% \opt{distort}|=|\val{false} and the other way round}
+% If \opt{width} and/or \opt{height} once have been set, this can be undone
% by setting them to \val{0pt} or \cs{relax}. If neither \opt{width} nor
% \opt{height} are set, the included graphic~file can also be scaled by setting
% \opt{scale} to a positive real number.
%
-% \DescribeOptions{pretex,apptex}
+% \DescribeOptions{pretex,apptex}^^A
% Commands prior and post to the inclusion of the graphic~file may be desired,
% such as font or color commands. The options \opt{pretex} and \opt{apptex} are
% provided where the \LaTeX~code given to \opt{pretex} is included before the
% graphic~file and \opt{apptex} right afterwards. For example, to change the
% size of the included text one could use:
% \begin{svgexample}
-% \includesvg[pretex=\tiny,§\meta{additional options}§]§\marg{svg filename}§
+% \includesvg[pretex=\tiny,§\meta{additional~options}§]§\marg{svg~filename}§
% \end{svgexample}
%
-% \DescribeOption{draft}
-% This option can be used with booelan values and is equal to the identically
+% \DescribeOption{draft}^^A
+% This option can be used with boolean values and is equal to the identically
% named option of the \pkg{graphicx} package. If the \opt{draft} option is
% given to \pkg{graphicx}, it's activated for \pkg{svg} as well.
%
-% \DescribeOption{lastpage}
+% \DescribeOption{lastpage}^^A
% A \hrfn{https://bugs.launchpad.net/ubuntu/+source/inkscape/+bug/1417470}{bug}
-% concerning the \LaTeX~export has been reported for \app{Inkscape}~0.91. It
+% concerning the \LaTeX~export has been reported for \app{Inkscape}\,0.91. It
% may happen that within the exported \LaTeX~file, it's attempted to include
% more pages of the PDF~graphics than actually exist. The \pkg{svg} package
% attempts to bypass the resulting error.
%
% Consequently, the total number of pages is read and only existing PDF~pages
% are included, if both options \opt{inkscapeformat}|=|\val{pdf} and
-% \opt{lastpage}|=|\val{true} are set. This is the default setting and can be
-% switched off with \opt{lastpage}|=|\val{false}. It's also possible to set the
-% number of the last page included of a PDF~graphic manually as optional
-% parameter for \cs{includesvg} or \cs{includeinkscape}. For details, see the
-% description of the respective commands.
+% \opt{lastpage}|=|\val{true} are set. This is the default setting
+% (unless DVI~output is active) and can be switched off with
+% \opt{lastpage}|=|\val{false}. It's also possible to set the number of the
+% last page included of a PDF~graphic manually as optional parameter for
+% \cs{includesvg} or \cs{includeinkscape}. For details, see the description of
+% the respective commands.
%
%
%
% \subsection{Including SVG~files}
%
-% \DescribeMacro{\includesvg}
+% \DescribeMacro{\includesvg}^^A
% The command \cs{includesvg} to include a SVG~file is quite similar to the
% \cs{includegraphics} command provided by the \pkg{graphicx} package.
% \begin{svgexample}
-% \includesvg§\oarg{parameters}\marg{svg filename}§
+% \includesvg§\oarg{parameters}\marg{svg~filename}§
% \end{svgexample}
%
-% \begin{DescribeParameterParent}{Macro}{\includesvg}
-% \DescribeParameters{%
-% inkscape,inkscapeformat,inkscapelatex,inkscapearea,inkscapedpi,inkscapeopt,%
-% svgextension,width,height,distort,scale,pretex,apptex,draft,%
-% }
-% It is used right in the same way but where \marg{svg filename} is the
+% \begin{DescribeParameterParent}{Macro}{\includesvg}^^A
+% \DescribeParameters{inkscape,inkscapeformat,inkscapelatex,inkscapearea,^^A
+% inkscapedpi,inkscapeopt,svgextension,width,height,distort,scale,^^A
+% pretex,apptex,draft}^^A
+% It is used right in the same way but where \meta{svg~filename} is the
% file~name of the SVG~file, where any given file~extension will be replaced
% with \file{.svg} ruthlessly. In order to change the source file format for
% the \app{Inkscape} export, you have to use parameter \prm{svgextension}.
%
% If the given file is not located in the current working directory but
% elsewhere on your file~system, the command \cs{svgpath} could be used to
-% specify this path. It is recommended to avoid any spaces and/or quotes
-% respectively \cs{dq} both in paths an file~names. Espacially when DVI~output
-% is active using quotes will certainly cause an error.
+% specify this path.
+% \ToDo{reference to general note at the very beginning instead}[v2.03]^^A
+% It is recommended to avoid umlauts or any other Non\hbox{-}ASCII characters
+% as well as any spaces and/or quotes respectively \cs{dq} both in paths and
+% file~names. Especially when DVI~output is active using quotes will certainly
+% cause an error.
%
% The command \cs{includesvg} is intended to do an automated export with
% \app{Inkscape} at first, where the given SVG~file is exported to a
@@ -605,19 +668,19 @@ svg-extract -- Extract independent graphic files from SVG pictures
% invoked, if the SVG~file is newer than the exported graphic~file or latter
% doesn't exist at all. Once the export has been done, the graphic~file and
% maybe the \LaTeX~file are included.
-%
+%
% All previously described options can also be used as optional parameters to
% \cs{includesvg} and do have the same effect as described before. However, the
% optional parameters specified have an effect only once when \cs{includesvg}
% is executed and remain unchanged afterwards.
%
-% \DescribeParameter{lastpage}
+% \DescribeParameter{lastpage}^^A
% In addition to the use of boolean values, the parameter \prm{lastpage} can
% also be assigned a specific (integer) page number, which defines the last
% used page of a PDF~graphic. This, just like the identically named option, has
% an effect only when \prm{inkscapeformat}|=|\val{pdf} is set.
%
-% \DescribeParameters{angle,origin}
+% \DescribeParameters{angle,origin}^^A
% Both parameters correlate to the identically named parameters of the
% \cs{includegraphics} command provided by the \pkg{graphicx} package. However,
% unlike to \cs{includegraphics}, they \prm{angle} and \prm{origin} are
@@ -631,20 +694,18 @@ svg-extract -- Extract independent graphic files from SVG pictures
%
% \subsection{Including already exported SVG~files}
%
-% \DescribeMacro{\includeinkscape}
+% \DescribeMacro{\includeinkscape}^^A
% If you don't want to make use of the automated export with \app{Inkscape} but
-% the user interface provided by the \pkg{svg} package, you can use
+% the user\hbox{-}interface provided by the \pkg{svg} package, you can use
% \cs{includeinkscape} instead of \cs{includesvg}.
% \begin{svgexample}
-% \includeinkscape§\oarg{parameters}\marg{graphic filename}§
+% \includeinkscape§\oarg{parameters}\marg{graphic~filename}§
% \end{svgexample}
%
-% \begin{DescribeParameterParent}{Macro}{\includeinkscape}
-% \DescribeParameters{%
-% inkscapeformat,inkscapelatex,%
-% width,height,distort,scale,pretex,apptex,draft,lastpage,angle,origin,%
-% }
-% You can use it similar to \cs{includesvg} but \marg{graphic filename} has to
+% \begin{DescribeParameterParent}{Macro}{\includeinkscape}^^A
+% \DescribeParameters{inkscapeformat,inkscapelatex,width,height,distort,^^A
+% scale,pretex,apptex,draft,lastpage,angle,origin}^^A
+% You can use it similar to \cs{includesvg} but \meta{graphic~filename} has to
% be the filename of the already exported graphic file. If a valid
% file~extension (\file{.pdf/.eps/.ps/.png}) is given, the current setting for
% \opt{inkscapeformat} is overwritten. It's even possible to specify a
@@ -666,13 +727,13 @@ svg-extract -- Extract independent graphic files from SVG pictures
%
% In order to extract to PDF, EPS, or PS~files the programs \file{pstoeps},
% \file{pstopdf} and \file{pdftops} are used which are usually provided by most
-% of the \LaTeXe~distributions. In additon, the command line tools of
+% of the \LaTeX~distributions. In addition, the command~line~interfaces of
% \app{ImageMagick} and \app{Ghostscript} can be invoked for converting images
% in formats like PNG, JPG, TIF or something else. It's also possible to create
% PDF, EPS or PS~files with one of the two programs. Therefor the desired
% program---\file{magick} and/or \file{gswin32c}/\file{gswin64c} on Windows
% respectively \file{convert} and/or \file{gs} on unix-like operating
-% systems---must be installed. By typing \file{\meta{program} -{}-version} on
+% systems---must be installed. By typing \file{\meta{program}~-{}-version} on
% shell, this can be checked.
%
% If you want to extract independent graphic~files from included SVG~files, you
@@ -686,7 +747,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
%
% In contrast to package \pkg{svg}, the console commands for graphic extraction
% are executed with each LaTeX run by package \pkg{svg-extract} when
-% \file{-{}-shell-escape} mode is activated. This behaviour can be switched of
+% \file{-{}-shell-escape} mode is activated. This behaviour can be switched off
% with option \opt{extract}|=|\val{false}.
%
% \minisec{Important changes}
@@ -695,15 +756,15 @@ svg-extract -- Extract independent graphic files from SVG pictures
% numbering of the current \env{subfig} environment by default. As package
% \pkg{subfig} sometime causes problems and because of the large amount of
% different \LaTeX~packages which all provide the possibility to include
-% subfigures with very different implemetations, this feature can't be provided
+% subfigures with very different implementations, this feature can't be provided
% reliably by \pkg{svg-extract}. See option \opt{extractname} for further
-% information.
+% information.
%
%
%
% \subsection{General settings}
%
-% \DescribeOptions{on,off}
+% \DescribeOptions{on,off}^^A
% This options have to be given while loading the \pkg{svg-extract} package and
% are intended to toggle the functionality of this package. As both extracting
% and converting independent graphic~files is invoked with every \LaTeX~run
@@ -713,80 +774,76 @@ svg-extract -- Extract independent graphic files from SVG pictures
% used to reactivate functionality of this package. This can also be done by
% using \opt{extract}|=|\val{true}/\val{false}.
%
-% \DescribeMacros{\svgsetup,\includesvg,\includeinkscape}
+% \DescribeMacros{\svgsetup,\includesvg,\includeinkscape}^^A
% With package \pkg{svg-extract} the applicable options for
% \cs{svgsetup}\marg{options} as well as parameters for the already described
-% macros \cs{includesvg}\oarg{parameters}\marg{filename} and
-% \cs{includeinkscape}\oarg{parameters}\marg{filename} are extended. They can
-% be used to control the process of graphic extraction and converting.
-%
-% \begin{DescribeParameterParent}{Macro}{\includesvg}
-% \DescribeParameters{extractangle}
-% With this parameter the graphic is rotated during the extraction process. The
-% value is not inherited from \prm{angle} if it was given by default. this can
-% be achieved by setting:
-% \begin{svgexample}
-% \includesvg[angle=§\meta{angle}§,extractangle=inherit]§\marg{filename}§
-% \end{svgexample}
-% \end{DescribeParameterParent}
+% macros \cs{includesvg}\oarg{parameters}\marg{svg~filename} and
+% \cs{includeinkscape}\oarg{parameters}\marg{graphic~filename} are extended.
+% They can be used to control the process of graphic extraction and converting.
%
-% All option described below can be used togehter with \cs{svgsetup} and are
-% then valid in the current scope. There also exist identically named
+% All options described below can be passed to \cs{svgsetup}\marg{options} and
+% are then valid in the current scope. There also exist identically named
% parameters for the optional arguments of
% \begin{svgexample}
-% \includesvg§\oarg{parameters}\marg{svg filename}§
-% \includeinkscape§\oarg{parameters}\marg{graphic filename}§
+% \includesvg§\oarg{parameters}\marg{svg~filename}§
+% \includeinkscape§\oarg{parameters}\marg{graphic~filename}§
% \end{svgexample}
-% These parameters have an effect only once when the specific command is
-% executed and remain unchanged afterwards.
-% \begingroup\ignorespaces%
-% \newcommand*\parameterlist{}\ignorespaces%
-% \listadd\parameterlist{extract}\ignorespaces%
-% \listadd\parameterlist{extractpreamble}\ignorespaces%
-% \listadd\parameterlist{extractformat}\ignorespaces%
-% \listadd\parameterlist{extractruns}\ignorespaces%
-% \listadd\parameterlist{latexopt}\ignorespaces%
-% \listadd\parameterlist{extractwidth}\ignorespaces%
-% \listadd\parameterlist{extractheight}\ignorespaces%
-% \listadd\parameterlist{extractdistort}\ignorespaces%
-% \listadd\parameterlist{extractscale}\ignorespaces%
-% \listadd\parameterlist{extractangle}\ignorespaces%
-% \listadd\parameterlist{extractpretex}\ignorespaces%
-% \listadd\parameterlist{extractapptex}\ignorespaces%
-% \listadd\parameterlist{convert}\ignorespaces%
-% \listadd\parameterlist{convertformat}\ignorespaces%
-% \listadd\parameterlist{convertdpi}\ignorespaces%
-% \listadd\parameterlist{magicksetting}\ignorespaces%
-% \listadd\parameterlist{magickoperator}\ignorespaces%
-% \listadd\parameterlist{gsopt}\ignorespaces%
-% \listadd\parameterlist{gsdevice}\ignorespaces%
-% \listadd\parameterlist{clean}\ignorespaces%
-% \listadd\parameterlist{exclude}\ignorespaces%
-% \def\buffer{}\def\do#1{\buffer\prm{#1}\def\buffer{, }}\ignorespaces%
-% These parameters are: \dolistloop{\parameterlist}.
-% \renewcommand*\marginpar[2][]{}\ignorespaces%
-% \def\do#1{\DescribeParameter{#1}}\ignorespaces%
-% \begin{DescribeParameterParent}{Macro}{\includesvg}%
-% \dolistloop{\parameterlist}%
-% \end{DescribeParameterParent}%
-% \begin{DescribeParameterParent}{Macro}{\includeinkscape}%
-% \dolistloop{\parameterlist}%
-% \end{DescribeParameterParent}%
-% \endgroup%
-%
-%
-%
-% \subsection{Extract independent grahic files}\label{sec:extract}
-% \DescribeOption{extract}
+% These have an effect only once, when the specific command is executed.
+%^^A \begingroup^^A
+%^^A \newcommand*\parameterlist{}^^A
+%^^A \listadd\parameterlist{extract}^^A
+%^^A \listadd\parameterlist{extractpreamble}^^A
+%^^A \listadd\parameterlist{extractformat}^^A
+%^^A \listadd\parameterlist{extractwidth}^^A
+%^^A \listadd\parameterlist{extractheight}^^A
+%^^A \listadd\parameterlist{extractdistort}^^A
+%^^A \listadd\parameterlist{extractscale}^^A
+%^^A \listadd\parameterlist{extractangle}^^A
+%^^A \listadd\parameterlist{extractpretex}^^A
+%^^A \listadd\parameterlist{extractapptex}^^A
+%^^A \listadd\parameterlist{extractruns}^^A
+%^^A \listadd\parameterlist{latexexe}^^A
+%^^A \listadd\parameterlist{latexopt}^^A
+%^^A \listadd\parameterlist{latexext}^^A
+%^^A \listadd\parameterlist{dvipsopt}^^A
+%^^A \listadd\parameterlist{pstoepsopt}^^A
+%^^A \listadd\parameterlist{pstopdfopt}^^A
+%^^A \listadd\parameterlist{pdftoepsopt}^^A
+%^^A \listadd\parameterlist{pdftopsopt}^^A
+%^^A \listadd\parameterlist{convert}^^A
+%^^A \listadd\parameterlist{convertformat}^^A
+%^^A \listadd\parameterlist{convertdpi}^^A
+%^^A \listadd\parameterlist{magicksetting}^^A
+%^^A \listadd\parameterlist{magickoperator}^^A
+%^^A \listadd\parameterlist{gsopt}^^A
+%^^A \listadd\parameterlist{gsdevice}^^A
+%^^A \listadd\parameterlist{clean}^^A
+%^^A \listadd\parameterlist{exclude}^^A
+%^^A \def\buffer{}\def\do#1{\buffer\prm{#1}\def\buffer{, }}^^A
+%^^A These parameters are: \dolistloop{\parameterlist}.
+%^^A \renewcommand*\marginpar[2][]{}^^A
+%^^A \def\do#1{\DescribeParameter{#1}}^^A
+%^^A \begin{DescribeParameterParent}{Macro}{\includesvg}^^A
+%^^A \dolistloop{\parameterlist}^^A
+%^^A \end{DescribeParameterParent}^^A
+%^^A \begin{DescribeParameterParent}{Macro}{\includeinkscape}^^A
+%^^A \dolistloop{\parameterlist}^^A
+%^^A \end{DescribeParameterParent}^^A
+%^^A \endgroup^^A
+%
+%
+%
+% \subsection{Extract independent graphic files\label{sec:extract}}
+%
+% \DescribeOption{extract}^^A
% This option can be used with boolean values. Using \opt{extract}|=|\val{true}
% activates the functionality for both extracting and converting which is the
% default setting, whereas \opt{extract}|=|\val{false} turns it off completely.
%
-% \DescribeOption{extractpath}
+% \DescribeOption{extractpath}^^A
% The path where the extracted and converted files are located can be specified
-% with option \opt{extractpath}, whereas \opt{extractpath}|=|\val{basesubdir}
-% is set by default.
-% \begin{DescribeValues}
+% with option \opt{extractpath}, whereas \default{basesubdir} is set by default.
+% \begin{DescribeValues}^^A
% \item[svgdir/svgpath]
% The extracted and converted independent graphic~files are located in the
% same directory as the corresponding SVG~file.
@@ -796,7 +853,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \item[basedir/basepath/jobdir/jobpath]
% All extracted and converted files will be located in the current working
% directory.
-% \item[\textbf{basesubdir}/basesubpath/jobsubdir/jobsubpath]
+% \item[\default{basesubdir}/basesubpath/jobsubdir/jobsubpath]
% A subfolder named \file{svg-extract/} within the current working directory
% will be used for all extracted and converted files.
% \item[/path/to/somewhere/]
@@ -804,58 +861,57 @@ svg-extract -- Extract independent graphic files from SVG pictures
% working directory (\file{./relative/path/}) or as an absolute path.
% \end{DescribeValues}
%
-% \DescribeOption{extractname}
+% \DescribeOption{extractname}^^A
% It's also possible to change the name for extracted and converted files. The
-% default setting is \opt{extractname}|=|\val{filenamenumbered}.
-% \begin{DescribeValues}
+% default setting is \opt{extractname}|=|\val{filenamenumbered}. The appended
+% file extension is derived from option \opt{extractformat}.
+% \begin{DescribeValues}^^A
% \item[filename/name]
% The name of the exported \app{Inkscape}~file is used and the suffix
% \file{-extract} is attached.
-% \item[\textbf{filenamenumbered}/namenumbered/numberedfilename/numberedname]
-% Same as above, but a prefix with the count of extracted files is used
-% instead of the suffix.
+% \item[\default{filenamenumbered}/namenumbered/numberedfilename/numberedname]
+% Same as above, but a prefix with the current enumerated count of SVG~files
+% is used instead of the suffix.
% \item[numbered/section/numberedsection/sectionnumbered]
-% The file name is composed by the number of extracted files and the current
-% outline numbering.
-% \item[\meta{filename}]
-% You can use any file name, the file extension is derived from option
-% \opt{extractformat}. It's possible to use counters for specifying the
-% name of the extracted file. Repeatedly specifying the same file name will
+% The file~name is composed by the current enumerated count of SVG~files and
+% the present outline numbering.
+% \item[\file{\meta{filename}}]
+% You can use any file~name. It's possible to use counters for specifying the
+% name of the extracted file. Repeatedly specifying the same file~name will
% overwrite previously created files.
% \end{DescribeValues}
%
-% \DescribeOption{extractformat}
-% The included SVG~file can be extracted from the document into a independent
+% \DescribeOption{extractformat}^^A
+% The included SVG~file can be extracted from the document into an independent
% graphic~file of type PDF, EPS or PS. The option can be used with either a
% single value (\opt{extractformat}|=|\val{pdf}) or a comma separated list.
% For example,
% \begin{svgexample}
-% \includesvg[extractformat={pdf,eps,ps}]§\marg{svg filename}§
+% \includesvg[extractformat={pdf,eps,ps}]§\marg{svg~filename}§
% \end{svgexample}
% will extract the SVG~file to both PDF and EPS~formats and generates two
% independent graphic~files. By default, \opt{extractformat}|=|\val{pdf} is set
% unless DVI~output was detected. In this case \opt{extractformat}|=|\val{eps}
% is the default setting.
%
-% \DescribeOptions{%
-% extractwidth,extractheight,extractdistort,extractscale,
-% extractpretex,extractapptex,%
-% }
+% \DescribeOptions{extractwidth,extractheight,extractdistort,extractscale,^^A
+% extractpretex,extractapptex}^^A
+% \changes{v2.02}{2018/09/07}{option \opt{extractdistort} added for distortion
+% of extracted graphics}^^A
% These options can be used to overwrite the settings given for the appearance
% of a SVG~file within the document. For example, a SVG~file should cover the
-% entire text width within the document but be extracted to a fixed width, this
+% entire text width within the document but be extracted to a fixed width. This
% can be done with:
% \begin{svgexample}
-% \includesvg[width=\textwidth,extractwidth=500pt]§\marg{svg filename}§
+% \includesvg[width=\textwidth,extractwidth=500pt]§\marg{svg~filename}§
% \end{svgexample}
% Assigning the value \val{inherit} to one of these options---which is set by
% default---leads to the usage of the corresponding option of package \pkg{svg}
% (\opt{width}/\opt{height}/\opt{scale}/\opt{pretex}/\opt{apptex}), whereas
% \opt{extract\dots}|=|\val{\cs{relax}} can be used to ignore a parent option
-% utterly. Only option \opt{extractdistort} is initialized to \val{false} and
-% does not inherit from \opt{distort} by default.
+% utterly.
%
-% \DescribeOptions{extractpreamble,extractpreambleend}
+% \DescribeOptions{extractpreamble,extractpreambleend}^^A
% Within the included and extracted SVG~files any \LaTeX~macro can be used
% either defined by the user---this should be done in the preamble of the
% \LaTeX~document in which the SVG~file is to be included---or provided by a
@@ -863,7 +919,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% auxiliary \LaTeX~file all used packages and commands have to be known within
% this file. Consequently, the preamble of the current \LaTeX~document is used
% for the extraction of the SVG~file by default.
-%
+%
% However, it is possible to specify a different \emph{preamble~file} with the
% option \opt{extractpreamble} where the file to use as the preamble is given
% as the argument---including maybe path, but file~name and file~extension in
@@ -875,7 +931,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% option \opt{extractpreambleend} will be used, which is set to a default with
% \cs{begin}|{document}|.
%
-% \DescribeMacros{\svghidepreamblestart,\svghidepreambleend}
+% \DescribeMacros{\svghidepreamblestart,\svghidepreambleend}^^A
% In case, the preamble of the current \LaTeX~document is used, there are maybe
% packages included or some parts within the preamble, which should not be used
% within the separate auxiliary \LaTeX~file. These parts can be excluded if
@@ -895,33 +951,33 @@ svg-extract -- Extract independent graphic files from SVG pictures
% §\dots§
% \end{svgexample}
%
-% \DescribeOption{extractruns}
-% When extracting independent grahic~files by compiling the generated auxiliary
-% \LaTeX~file, it's maybe necessary to do multiple \LaTeX~runs on this file.
-% The number of runs can be controlled with option \opt{extractruns}. It's set
-% to \opt{extractruns}|=|\val{2} by default.
+% \DescribeOption{extractruns}^^A
+% When extracting independent graphic~files by compiling the generated auxiliary
+% \LaTeX~file, it's maybe necessary to do multiple \LaTeX~iterations on this.
+% The number of iterations is controlled with option \opt{extractruns}. It is
+% set to \opt{extractruns}|=|\val{2} by default.
%
-% \DescribeOptions{latexexe,latexopt,latexext}
-% For the extraction of an independent grahic~file, the \LaTeX~program is used
-% which is set by the \opt{latexexe} option. Depending on the \LaTeX~processor
+% \DescribeOptions{latexexe,latexopt,latexext}^^A
+% For the extraction of an independent graphic~file, the \LaTeX~program is used
+% which is set by the \opt{latexexe} option. Depending on the \LaTeX~engine
% used for the current \LaTeX~document, it is set to either \app{pdflatex},
% \app{lualatex}, \app{xelatex} or \app{latex} by default. It's also possible
-% to specify additional flags or switches for the \LaTeX~runs, which are
+% to specify additional flags or switches for the \LaTeX~iterations, which are
% performed during the extraction process by the \opt{latexopt} option. If you
-% are used to utilize a other file~extension for \LaTeX~files than \file{.tex},
+% are used to utilize a different extension for \LaTeX~files than \file{.tex},
% option \opt{latexext} can be used like \opt{latexext}|=|\val{ltx}.
%
-% \DescribeOptions{dvipsopt,pstoepsopt,pstopdfopt,pdftoepsopt,pdftopsopt}
-% Depending on the used \LaTeX~processor, the file~type of the extracted
+% \DescribeOptions{dvipsopt,pstoepsopt,pstopdfopt,pdftoepsopt,pdftopsopt}^^A
+% Depending on the used \LaTeX~engine, the file~type of the extracted
% graphic differs. In order to create all formats, requested with option
% \opt{extractformat}, several converting tools provided by most of the
-% \LaTeXe~distributions are maybe invoked. These are \file{dvips},
+% \LaTeX~distributions are maybe invoked. These are \file{dvips},
% \file{ps2eps}, \file{ps2pdf} and/or \file{pdftops} and can't be changed. It's
% only possible to specify additional switches for every single tool with
% \opt{dvipsopt}, \opt{pstoepsopt}, \opt{pstopdfopt}, \opt{pdftoepsopt} and
% \opt{pdftopsopt}.
%
-% \DescribeOption{clean}
+% \DescribeOption{clean}^^A
% During the extraction process many files are generated for each SVG~file
% extraction. So it's oftentimes desirable to automatically remove these
% temporary files. Using the option \opt{clean}|=|\val{true} will remove any
@@ -931,28 +987,51 @@ svg-extract -- Extract independent graphic files from SVG pictures
% file~extensions in order to specify auxiliary files generated by package
% \pkg{svg-extract} to be deleted, for example \opt{clean}|=|\val{\{log,aux\}}.
%
-% \DescribeOption{exclude}
+% \DescribeOption{exclude}^^A
% Sometimes it may be necessary to extract and/or convert a SVG~file without
% including it. If the flag \opt{exclude} is specified, the SVG~file will not
% be rendered in the current \LaTeX~document, but will be extracted and/or
% converted to the requested output format(s).
%
+% \DescribeMacros{\includesvg,\includeinkscape}^^A
+% As previously mentioned, for extracting independent graphic files it is
+% sufficient to load package \pkg{svg-extract} and afterwards everything
+% necessary is done by just using \cs{includesvg} or \cs{includeinkscape}.
+%
+% \begin{DescribeParameterParent}{Macro}{\includesvg}^^A
+% \DescribeParameter{extractangle}^^A
+% \begin{DescribeParameterParent}{Macro}{\includeinkscape}^^A
+% \renewcommand*\marginpar[2][]{}^^A
+% \DescribeParameter{extractangle}^^A
+% \changes{v2.02}{2018/09/07}{parameter \prm{extractangle} for \cs{includesvg}
+% and \cs{includeinkscape} implemented in order to rotate graphics during
+% extractions}^^A
+% With this additional parameter the graphic is rotated during the extraction
+% process. The value is not inherited from \prm{angle} if it was given by
+% default. This can be achieved by setting:
+% \begin{svgexample}
+% \includesvg[angle=§\meta{angle}§,extractangle=inherit]§\marg{svg~filename}§
+% \end{svgexample}
+% \end{DescribeParameterParent}
+% \end{DescribeParameterParent}
+%
+%
%
+% \subsection{Convert extracted graphic files\label{sec:convert}}
%
-% \subsection{Convert extracted grahic files}\label{sec:convert}
-%
% Based on the extraction of independent graphic~files, the \pkg{svg-extract}
-% packages also provides the possibility to convert those extracted graphics in
+% packages also provides the possibility to convert these extracted graphics in
% another format than PDF, EPS or PS with either \app{ImageMagick}---which is
% set by default---or \app{Ghostscript}.
%
-% \DescribeOption{convert}
+% \DescribeOption{convert}^^A
% This option can be used to control the invocation of the conversion process.
% By default, \opt{convert}|=|\val{false} is set. For Windows, there exist two
% different versions of \app{Ghostscript}, either 64\,bit or 32\,bit. If
% it is selected as converting tool the 64\,bit~executable is set by default.
-% \begin{DescribeValues}
-% \item[\textbf{false}/off/no]
+% Please note, that option \opt{extract} has to be activated.
+% \begin{DescribeValues}^^A
+% \item[\default{false}/off/no]
% No conversion is done.
% \item[true/on/yes]
% The conversion will be done with the current chosen converting tool.
@@ -968,8 +1047,8 @@ svg-extract -- Extract independent graphic files from SVG pictures
% The same as for the latter case applies, only option
% \opt{gsexe}|=|\val{gswin32c} is set on Windows.
% \end{DescribeValues}
-%
-% \DescribeOption{convertformat}
+%
+% \DescribeOption{convertformat}^^A
% With this option, the desired output format(s) can be given. Multiple graphic
% formats can be specified in a list, for example something like
% \opt{convertformat}|=|\val{\{png,jpg,tif\}}. The value specified in
@@ -991,7 +1070,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% desired output~format is trailed with |+| as inner key.
%
% The first variant is applied to all output formats in general. If one of
-% these mentioned options is evaluated and a output format specific value was
+% these mentioned options is evaluated and an output format specific value was
% given like in the second variant, the general setting is overwritten. If the
% general setting should be used and extended by an additional output format
% specific settings, then the third variant is to be used. In this case, no
@@ -1002,7 +1081,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% or a specific one
% (\opt{\meta{option}}|=|\val{\{\meta{outputformat}[+]=\cs{relax}\}}).
%
-% \DescribeOption{convertdpi}
+% \DescribeOption{convertdpi}^^A
% This option controls the used density for all file~formats or a specific one,
% whether \app{ImageMagick} or \app{Ghostscript} is used for the graphic
% conversion. The desired resolution of the converted file is given in dots per
@@ -1031,11 +1110,12 @@ svg-extract -- Extract independent graphic files from SVG pictures
% the used conversion tool and not to the processing of the option.
%
%
+%
% \subsubsection{Settings for the invocation of \app{ImageMagick}}
%
-% \DescribeOptions{magickexe,magicksetting,magickoperator}
+% \DescribeOptions{magickexe,magicksetting,magickoperator}^^A
% The conversion with \app{ImageMagick} via the \file{magick} or \file{convert}
-% command-line~tool can be controlled with these options. The option
+% command~line~interface can be controlled with these options. The option
% \opt{magickexe} determines the used executable and is set to \file{magick} on
% Windows and otherwise to \file{convert} by default. Additionally, there are
% the two options \opt{magicksetting} and \opt{magickoperator} which can be
@@ -1044,18 +1124,19 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \opt{magickoperator} can be set for all output formats or a \emph{specific}
% one either resetting or extending the general settings. For further
% information see the documentation of
-% \hrfn{http://www.imagemagick.org/script/command-line-processing.php}%
-% {\app{ImageMagick} command-line tool}.
+% \hrfn{http://www.imagemagick.org/script/command-line-processing.php}^^A
+% {\app{ImageMagick} command~line~interface}.
+%
%
%
% \subsubsection{Settings for the invocation of \app{Ghostscript}}
%
-% \DescribeOptions{gsexe,gsdevice,gsopt}
-% The conversion with \app{Ghostscript} is done with command-line~tool \file{gs}
-% on unix-like operating systems and \file{gswin64c} or \file{gswin32c} on
-% Windows. The executable can be changed with option \opt{gsexe}. Because
-% \app{Ghostscript} requires the specification of a device, there are some
-% predefined for the most common output formats. These are:
+% \DescribeOptions{gsexe,gsdevice,gsopt}^^A
+% The conversion with \app{Ghostscript} is done with command~line~interface
+% \file{gswin64c} or \file{gswin32c} on Windows and \file{gs} on unix-like
+% operating systems. The executable can be changed with option \opt{gsexe}.
+% Because \app{Ghostscript} requires the specification of a device, there are
+% some predefined for the most common output formats. These are:
% \begin{svgexample}
% \svgsetup{%
% gsdevice={png=png16m},gsdevice={jpeg=jpeg},gsdevice={jpg=jpeg},%
@@ -1071,14 +1152,14 @@ svg-extract -- Extract independent graphic files from SVG pictures
%
%
%
+% \cleardoublepage
% \section{Example}
%
-% As an minimal example\footnote{\ignorespaces%
-% The image used here is a slightly modified version of the image used in the
-% initial documentation on how to include a SVG~file in \LaTeX{} by
-% Johan\,B.\,C.~Engelen available as package
-% \href{http://www.ctan.org/pkg/svg-inkscape}{\pkg{svg-inkscape} on CTAN}.
-% } take the following lines of code:
+% As an minimal example\footnote{The image used here is a slightly modified
+% version of the image used in the initial documentation on how to include a
+% SVG~file in \LaTeX{} by Johan\,B.\,C.~Engelen available as package
+% \href{http://www.ctan.org/pkg/svg-inkscape}{\pkg{svg-inkscape} on CTAN}.}
+% take the following lines of code:
% \begin{svgexample}
% \documentclass{article}
% \usepackage[T1]{fontenc}
@@ -1090,58 +1171,59 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \usepackage{subcaption}
% \begin{document}
% \begin{figure}
-% \begin{minipage}{.5\linewidth}
+% \begin{minipage}{\dimexpr\linewidth/2\relax}
% \includesvg[width=\linewidth]{svg-example}%
-% \subcaption{This text is too large!}
+% \subcaption{This text is too large!}%
% \end{minipage}%
-% \begin{minipage}{.5\linewidth}
+% \begin{minipage}{\dimexpr\linewidth/2\relax}
% \includesvg[width=\linewidth,pretex=\relscale{0.6}]{svg-example}%
-% \subcaption{This text fits better.}
+% \subcaption{This text fits better.}%
% \end{minipage}
-% \caption{An example figure with \LaTeX~support}\label{fig:example}
+% \caption{An example figure with \LaTeX~support\label{fig:example}}%
% \end{figure}
% \begin{figure}\centering
% \includesvg[%
% width=.5\linewidth,inkscapelatex=false,extractformat={pdf,eps}%
% ]{svg-example}%
-% \caption{The same example figure without \LaTeX~support}
+% \caption{The same example figure without \LaTeX~support}%
% \end{figure}
% \end{document}
% \end{svgexample}
% \begin{figure}[tb]
-% \null\hfill\ignorespaces%
-% \begin{minipage}{.45\linewidth}
-% \includesvg[width=\linewidth]{svg-example}%
-% \subcaption{This text is too large!}\label{fig:example-tex-a}
-% \end{minipage}\hfill\ignorespaces%
-% \begin{minipage}{.45\linewidth}
-% \includesvg[width=\linewidth,pretex=\relscale{0.6}]{svg-example}%
-% \subcaption{This text fits better.}\label{fig:example-tex-b}
+% \null\hfill^^A
+% \begin{minipage}{\dimexpr\linewidth*9/20\relax}
+% \includesvg[width=\linewidth]{svg-example}^^A
+% \subcaption{This text is too large!\label{fig:example-tex-a}}^^A
+% \end{minipage}\hfill^^A
+% \begin{minipage}{\dimexpr\linewidth*9/20\relax}
+% \includesvg[width=\linewidth,pretex=\relscale{0.6}]{svg-example}^^A
+% \subcaption{This text fits better.\label{fig:example-tex-b}}^^A
% \end{minipage}
-% \hfill\null\ignorespaces%
-% \caption{An example figure with \LaTeX~support}\label{fig:example-tex}
+% \hfill\null^^A
+% \caption{An example figure with \LaTeX~support\label{fig:example-tex}}^^A
% \end{figure}
% \begin{figure}[tb]\centering
-% \includesvg[%
-% width=.5\linewidth,inkscapelatex=false,extractformat={pdf,eps}%
-% ]{svg-example}%
-% \caption{The same example figure without \LaTeX~support}\label{fig:example}
+% \includesvg[^^A
+% width=.5\linewidth,inkscapelatex=false,extractformat={pdf,eps}^^A
+% ]{svg-example}^^A
+% \caption{^^A
+% The same example figure without \LaTeX~support\label{fig:example}^^A
+% }^^A
% \end{figure}
%
-% If you are willing to compile the example, there are two aspects to consider.
-% First, the included SVG~file \file{svg-example.svg} has to be located in the
-% current folder and is located in \file{\meta{texmf}/doc/latex/svg/examples/}.
-% Second, you have to run the desired \LaTeX~engine with
-% \file{-{}-shell-escape} option enabled.
-%
% The output is shown in \autoref{fig:example-tex} and \autoref{fig:example}.
% Within this example the file \file{svg-example.svg} was included three times
% using the \cs{includesvg} command.
-%
+%
+% If you are willing to compile the example, there are two aspects to consider.
+% First, the included SVG~file \file{svg-example.svg} has to be located in the
+% current folder and is located in \file{\meta{texmf}/doc/latex/svg/}. Second,
+% you have to run the desired \LaTeX~engine with flag \file{-{}-shell-escape}.
+%
% As you can see, \autoref{fig:example-tex-a} is created with default settings,
-% except for the width specification. So the \app{Inkscape}~export with
-% \LaTeX~support is done as well as the extraction of a independent graphic~file
-% in PDF~format as the \pkg{svg-extract} package was loaded.
+% except the width specification. The \app{Inkscape}~export with \LaTeX~support
+% is done and the extraction of an independent graphic~file in PDF~format as
+% the \pkg{svg-extract} package was loaded.
%
% However, the text is slightly overrunning the margins of the image, and so
% \autoref{fig:example-tex-b}---which again uses the same \app{Inkscape}~export
@@ -1167,7 +1249,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% When using the packages \pkg{svg} and \pkg{svg-extract}, the most likely
% occurring problems will be caused by calling the external programs. For this
% reason, a short package information is written into the log~file right before
-% each call of an external program via shell. If a file should have been
+% each call of an external program on shell. If a file should have been
% created, both packages check after the external call, whether this file
% exists or not and raise an error or at least a warning, if this file is
% missing. If you got such a message, please check the log~file for lines like:
@@ -1175,10 +1257,10 @@ svg-extract -- Extract independent graphic files from SVG pictures
% |Package svg Info:| or |Package svg-extract Info:|
% \end{quote}
% Right afterwards, there should appear |runsystem(<command>)...excuted.| which
-% you should try to execute manually from shell in the right directory. In most
-% cases, the problem will be an invalid command call. If something goes wrong
-% during the extraction/converting process of package \pkg{svg-extract}, it
-% would make sense to set option \opt{clean}|=|\val{false} to not delete any
+% you should try to execute manually at the terminal in the right directory. In
+% most cases, the problem will be an invalid command call. If something goes
+% wrong during the extraction/converting process of package \pkg{svg-extract},
+% it would make sense to set option \opt{clean}|=|\val{false} to not delete any
% auxiliary files that might be needed.
%
% If you are sure that the problem is not caused by the configuration of your
@@ -1188,9 +1270,9 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \minisec{When using pdf\LaTeX{} there are a lot of warnings}
%
% It may happen that several warnings like
-% \begin{quote}\ttfamily\raggedright%
+% \begin{quote}\ttfamily\raggedright^^A
% pdfTeX warning:\,pdflatex.exe(file \meta{filename}.pdf):\,PDF inclusion:
-% multiple pdfs with page group included in a single page
+% multiple pdfs with page group included in a single page^^A
% \end{quote}
% occur when including the PDF~graphics exported with \app{Inkscape}. This is
% related to the handling of transparency effects within PDF~files. Since
@@ -1204,7 +1286,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \section{Include SVG files created with \app{ROOT}}
%
% This section was originally written by Philip Ilten. In the hope that since
-% then nothing has changed fundamentally in the described procedure, this
+% then nothing has changed fundamentally in the described procedure. This
% passage remains in the documentation, even if it will almost certainly be
% relevant to experimental particle physicists only, who frequently use the
% analysis package \app{ROOT}.
@@ -1255,7 +1337,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
%
% Consider the following example image produced by \app{ROOT} in
% \autoref{fig:root}. This figure was generated by the \app{ROOT} macro
-% \file{root.C}, provided within \file{\meta{texmf}/doc/latex/svg/examples/},
+% \file{root.C}, provided within \file{\meta{texmf}/doc/latex/svg/},
% which produces the file~\file{root.svg} when run. The code used to produce
% this SVG~file from within \app{ROOT} is
% \lstinputlisting[style=svg,backgroundcolor=\color{red!10}]{examples/root.C}
@@ -1270,27 +1352,35 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \includesvg[%
% inkscapearea=page,height=6cm,pretex=\tiny,convertformat=png%
% ]{root}%
-% \caption{Rendering of a \app{ROOT} plot---no more \emph{Comic CERNs}}%
-% \label{fig:root}%
+% \caption{%
+% Rendering of a \app{ROOT} plot---no more \emph{Comic CERNs}%
+% \label{fig:root}%
+% }%
% \end{figure}
% \end{svgexample}
% \begin{figure}
-% \centering%
-% \includesvg[%
-% inkscapearea=page,height=6cm,pretex=\tiny,convertformat=png%
-% ]{root}%
-% \caption{Rendering of a \app{ROOT} plot---no more \emph{Comic CERNs}}%
-% \label{fig:root}%
+% \centering^^A
+% \includesvg[^^A
+% inkscapearea=page,height=6cm,pretex=\tiny,convertformat=png^^A
+% ]{root}^^A
+% \caption{^^A
+% Rendering of a \app{ROOT} plot---no more \emph{Comic CERNs}
+% \label{fig:root}^^A
+% }^^A
% \end{figure}
% which includes the graphic as well as the \LaTeX~file exported by
% \app{Inkscape}, produces the extracted PDF~image~(\file{root.pdf}) and
% converts this to a PNG~image~(\file{root.png}) by using \app{ImageMagick}.
-% Enjoy plots from \app{ROOT} with natively rendered \LaTeX!
+% Enjoy plots from \app{ROOT} with natively rendered \LaTeX{}!
%
-% \StopEventually{\clearpage\PrintIndex\PrintChanges\PrintToDos}
+% \StopEventually{^^A
+% \cleardoublepage\PrintIndex^^A
+% \cleardoublepage\PrintChanges^^A
+% \cleardoublepage\PrintToDos^^A
+% }
%
% \iffalse
-%<*package&option>
+%<*package&base>
% \fi
%
%
@@ -1301,66 +1391,553 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \section{Initialization}
% \subsection{Packages}
%
-% The package \pkg{svg} requires package \pkg{iftex} for detecting the used
-% \LaTeX~engine, \pkg{scrbase} for options processing, \pkg{pdftexcmds} for
-% pdf\TeX{} primitives when using Lua\TeX, \pkg{shellesc} and \pkg{ifplatform}
-% for engine independent access to systems commands and files as well as
-% \pkg{graphicx} for the inclusion of PDF~files. The usage of packages
-% \pkg{xcolor} and \pkg{transparent} can be switched of with the corresponding
-% options. Package \pkg{svg-extract} only needs package \pkg{svg} itself.
-% \begin{macrocode}
-%<*base>
-\RequirePackage{iftex}[2019/11/07]
-\RequirePackage{scrbase}[2019/12/23]
-\RequirePackage{pdftexcmds}[2016/05/21]
-\RequirePackage{shellesc}[2016/06/07]
+% The package \pkg{svg} mainly requires \pkg{scrbase} for options processing
+% and \pkg{graphicx} for the inclusion of the exported graphic~files.
+%
+% The packages \pkg{iftex} and \pkg{pdftexcmds} are needed to detect the used
+% \LaTeX~engine on the one hand and enabling pdf\TeX{} primitives independent
+% of the used \LaTeX~engine on the other hand. Additionally, \pkg{trimspaces}
+% is responsible for string manipulation. Both packages \pkg{shellesc} and
+% \pkg{ifplatform} are used for engine independent access to systems commands
+% and files. The package \pkg{svg-extract} only needs package \pkg{svg} itself,
+% which is loaded during initialization.
+% \begin{macrocode}
+%<*main>
+\RequirePackage{iftex}[2020/03/06]
+\RequirePackage{scrbase}[2020/09/21]
+\RequirePackage{pdftexcmds}[2019/11/24]
\RequirePackage{trimspaces}[2009/09/17]
-\RequirePackage{graphicx}[1999/02/16]
-%</base>
-%<*extract>
-\RequirePackage{svg}[2017/03/27]
-%</extract>
+\RequirePackage{graphicx}[2019/11/30]
+\RequirePackage{shellesc}[2019/11/08]
+% \end{macrocode}
+% In order to do not raise a warning, package \pkg{ifplatform} is only used if
+% \file{-{}-shell-escape} flag is enabled.
+% \begin{macrocode}
+\ifnum\pdf@shellescape=\@ne\relax
+ \RequirePackage{ifplatform}[2017/10/13]
+\fi
+%</main>
+% \end{macrocode}
+%
+%
+%
+% \subsection{Dealing with catcodes}
+%
+% The catcode for double quotes are temporarily changed and restored at the
+% very end of both packages.
+% \begin{macrocode}
+\edef\svg@catcodecodes@restore{%
+ \catcode`\noexpand\"\the\catcode`\"\relax%
+}
+\@makeother\"%
+\AtEndOfPackage{\svg@catcodecodes@restore}
% \end{macrocode}
%
% \iffalse
-%<*base>
+%<*main>
% \fi
%
-% \subsection{Helper macros}
+%
+%
+% \subsection{General macros}
%
% \begin{macro}{\svg@tempa}
% \begin{macro}{\svg@tempb}
-% \begin{macro}{\svg@box}
% \begin{macro}{\if@svg@tempswa}
-% Internal temporary macros. The catcode for double quotes are also temporarily
-% changed.
+% Internal temporary macros.
% \begin{macrocode}
\newcommand*\svg@tempa{}
\newcommand*\svg@tempb{}
-\newbox\svg@box
\newif\if@svg@tempswa
-\edef\svg@catcodecodes@restore{%
- \catcode`\noexpand\"\the\catcode`\"\relax%
-}
-\@makeother\"%
% \end{macrocode}
% \end{macro}^^A \if@svg@tempswa
-% \end{macro}^^A \svg@box
% \end{macro}^^A \svg@tempb
% \end{macro}^^A \svg@tempa
%
+%
+%
+% \subsubsection{Macros for process control}
+%
+% \begin{macro}{\svg@ifwindowsdetected}
+% Do some Windows specific stuff if it was detected.
+% \begin{macrocode}
+\newcommand*\svg@ifwindowsdetected{\@secondoftwo}
+\AfterPackage*{ifplatform}{%
+ \renewcommand*\svg@ifwindowsdetected{%
+ \ifwindows%
+ \expandafter\@firstoftwo%
+ \else%
+ \expandafter\@secondoftwo%
+ \fi%
+ }%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@ifwindowsdetected
+% \begin{macro}{\svg@ifvalueisrelax}
+% For some keys the usage of \val{\cs{relax}} as a value should lead to a
+% special reaction, such as restoring to default behavior or resetting the key.
+% Therefore, \cs{svg@ifvalueisrelax} checks, whether \val{\cs{relax}} was used
+% as value or not.
+% \begin{macrocode}
+\newcommand*\svg@ifvalueisrelax[1]{%
+ \begingroup%
+ \def\svg@tempa{#1}%
+ \def\svg@tempb{\relax}%
+ \ifx\svg@tempa\svg@tempb%
+ \aftergroup\@firstoftwo%
+ \else%
+ \aftergroup\@secondoftwo%
+ \fi%
+ \endgroup%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@ifvalueisrelax
+%
+% \iffalse
+%</main>
+%<*extract>
+% \fi
+%
+% \begin{macro}{\svgx@ifkeyandval}
+% \begin{macro}{\svgx@@ifkeyandval}
+% It is checked whether a key was given as \val{\meta{key}=\meta{value}} or
+% like \val{\meta{key}=\{\meta{format}=\meta{value}\}}.
+% \begin{macrocode}
+\newcommand*\svgx@@ifkeyandval{}
+\newcommand*\svgx@ifkeyandval[3]{%
+ \def\svgx@@ifkeyandval##1=##2=##3\@nil{\IfArgIsEmpty{##3}{#3}{#2}}%
+ \svgx@@ifkeyandval#1==\@nil%
+}
+% \end{macrocode}
+% \end{macro}^^A \svgx@@ifkeyandval
+% \end{macro}^^A \svgx@ifkeyandval
+%
+% \iffalse
+%</extract>
+%<*main>
+% \fi
+%
+%
+%
+% \subsubsection{String manipulation}
+%
+% Both packages \pkg{svg} and \pkg{svg-extract} should be able to handle
+% user-defined input and output paths. As there is the possibility for users to
+% provide paths with or without quotes to \LaTeX{}, this is taken into account.
+%
+% \begin{macro}{\svg@deactivate@dq}
+% \changes{v2.02}{2018/09/07}{new}^^A
+% \changes{v2.02a}{2018/10/17}{bug fix for \pkg{polyglossia}}^^A
+% In order to avoid errors concerning file~names with package \pkg{babel} and
+% its active double quotes, this command is defined.
+% \begin{macrocode}
+\newcommand*\svg@deactivate@dq{}
+\AfterAtEndOfPackage*{babel}{%
+ \renewcommand*\svg@deactivate@dq{\bbl@deactivate{"}}%
+ \providecommand*\bbl@deactivate[1]{}%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@deactivate@dq
+% \begin{macro}{\svg@sanitize@dq}
+% \changes{v2.02}{2018/09/07}{new}^^A
+% Save expansion of the second argument in the macro from the first argument
+% with deactivated double quotes.
+% \begin{macrocode}
+\newcommand*\svg@sanitize@dq[2]{%
+ \begingroup%
+ \svg@deactivate@dq%
+ \edef\svg@tempa{\endgroup\def\noexpand#1{#2}}%
+ \svg@tempa%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@sanitize@dq
+% \begin{macro}{\svg@quotes@check}
+% \begin{macro}{\svg@quotes@@check}
+% \begin{macro}{\if@svg@quotes@found}
+% During the treatment of paths, it may be necessary to temporarily remove
+% quotes and, if required, add them again later. For this purpose, the switch
+% \cs{if@svg@quotes@found} as well as the commands \cs{svg@quotes@check} and
+% \cs{svg@quotes@@check}, which controls the switch, are defined. As before,
+% the string is passed in a macro to \cs{svg@quotes@check}.
+% \begin{macrocode}
+\newif\if@svg@quotes@found
+\newcommand*\svg@quotes@check[1]{%
+ \expandafter\svg@quotes@@check#1"\@nil%
+}
+\newcommand*\svg@quotes@@check{}
+\def\svg@quotes@@check#1"#2\@nil{%
+ \IfArgIsEmpty{#2}{\@svg@quotes@foundfalse}{\@svg@quotes@foundtrue}%
+}
+% \end{macrocode}
+% \end{macro}^^A \if@svg@quotes@found
+% \end{macro}^^A \svg@quotes@@check
+% \end{macro}^^A \svg@quotes@check
+% \begin{macro}{\svg@quotes@remove}
+% \changes{v2.02}{2018/09/07}{usage of \cs{svg@sanitize@dq}}^^A
+% \changes{v2.02}{2018/09/07}{calling \cs{svg@quotes@check}}^^A
+% \begin{macro}{\svg@quotes@@remove}
+% These two commands are used to remove all occurring quotes within a string.
+% The only argument passed to \cs{svg@quotes@remove} is not the string itself
+% but a macro in which a string is stored.
+% \begin{macrocode}
+\newcommand*\svg@quotes@remove[2][]{%
+ \begingroup%
+ \IfArgIsEmpty{#1}{\def\svg@tempb{#2}}{\def\svg@tempb{#1}}%
+ \svg@sanitize@dq\svg@tempa{\svg@tempb}%
+ \expandafter\svg@quotes@check\expandafter{\svg@tempa}%
+ \expandafter\svg@quotes@@remove\svg@tempa""\@nil%
+ \edef\svg@tempb{%
+ \endgroup%
+ \def\noexpand#2{\svg@tempa}%
+ \if@svg@quotes@found%
+ \noexpand\@svg@quotes@foundtrue%
+ \else%
+ \noexpand\@svg@quotes@foundfalse%
+ \fi%
+ }%
+ \svg@tempb%
+}
+\newcommand*\svg@quotes@@remove{}
+\def\svg@quotes@@remove#1"#2"#3\@nil{%
+ \IfArgIsEmpty{#2}{%
+ \edef\svg@tempa{#1}%
+ }{%
+ \svg@quotes@@remove#1#2#3""\@nil%
+ }%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@quotes@@remove
+% \end{macro}^^A \svg@quotes@remove
+% \begin{macro}{\svg@remove@leadingchar}
+% \changes{v2.02}{2018/09/07}{new}^^A
+% This command removes the single character in given with the first argument
+% from the expanded macro in the second argument.
+% \begin{macrocode}
+\newcommand*\svg@remove@leadingchar[2]{%
+ \begingroup%
+ \svg@sanitize@dq\svg@tempa{#2}%
+ \def\svg@tempb{%
+ \def\svg@tempa####1\@nil{\def\svg@tempa{####1}}%
+ \kernel@ifnextchar#1%
+ {\expandafter\svg@tempa\@gobble}%
+ {\svg@tempa}%
+ }%
+ \expandafter\svg@tempb\svg@tempa\@nil%
+ \edef\svg@tempb{%
+ \endgroup%
+ \def\noexpand#2{\svg@tempa}%
+ }%
+ \svg@tempb%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@remove@leadingchar
+%
+%
+%
+% \subsubsection{File handling}
+%
+% \begin{macro}{\svg@filename@parse}
+% \changes{v2.02}{2018/09/07}{usage of \cs{svg@sanitize@dq}}^^A
+% \changes{v2.02}{2018/09/07}{usage of \cs{svg@remove@leadingchar}}^^A
+% \changes{v2.02}{2018/09/07}{usage of \cs{svg@extension@parse}}^^A
+% As the internal \LaTeX{} command \cs{filename@parse} is not able to split a
+% given file~name containing quotes, \cs{svg@filename@parse} is defined to
+% resolve this problem. The optional argument can be used to give a specific
+% file extension, which should be searched within \cs{filename@ext}. If found
+% at the very end, the previous part is appended to \cs{filename@base}.
+% \begin{macrocode}
+\newcommand*\svg@filename@parse[2][]{%
+ \begingroup%
+% \end{macrocode}
+% The given path and file is parsed with \cs{filename@parse}.
+% \begin{macrocode}
+ \svg@sanitize@dq\svg@tempa{#2}%
+ \expandafter\filename@parse\expandafter{\svg@tempa}%
+% If there are quotes in the file path, the closing one will be found as first
+% character in \cs{filename@base} as \cs{filename@area} is split at the last
+% slash. This leading quote is removed from \cs{filename@base} with
+% \cs{svg@remove@leadingchar}.
+% \begin{macrocode}
+ \svg@quotes@remove{\filename@area}%
+ \if@svg@quotes@found%
+ \edef\filename@area{"\filename@area"}%
+ \svg@remove@leadingchar"\filename@base%
+ \fi%
+% \end{macrocode}
+% The found extension is parsed against the optional argument. If a double quote
+% was found within the extension, it actually belongs to \cs{filename@base}.
+% \begin{macrocode}
+ \ifx\filename@ext\relax\else%
+ \svg@quotes@remove{\filename@ext}%
+ \svg@extension@parse{#1}%
+ \if@svg@quotes@found%
+ \edef\filename@base{\filename@base"}%
+ \fi%
+ \fi%
+% \end{macrocode}
+% Quotes within \cs{filename@base} are normalized.
+% \begin{macrocode}
+ \svg@quotes@remove{\filename@base}%
+ \if@svg@quotes@found%
+ \edef\filename@base{"\filename@base"}%
+ \fi%
+% \end{macrocode}
+% With \cs{svg@tempa} the group is closed and the results are saved in the
+% macros \cs{filename@\dots}.
+% \begin{macrocode}
+ \edef\svg@tempa{%
+ \endgroup%
+ \def\noexpand\filename@area{\filename@area}%
+ \def\noexpand\filename@base{\filename@base}%
+ \ifx\filename@ext\relax%
+ \let\noexpand\filename@ext\noexpand\relax%
+ \else%
+ \def\noexpand\filename@ext{\filename@ext}%
+ \fi%
+ }%
+ \svg@tempa%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@filename@parse
+% \begin{macro}{\svg@extension@parse}
+% \changes{v2.02}{2018/09/07}{new}^^A
+% \begin{macro}{\svg@extension@@parse}
+% \changes{v2.02}{2018/09/07}{new}^^A
+% These macros are used to permit multiple dots in file~names. The content of
+% \cs{filename@ext} is split at each occurrence of \val{.} and the trailing part
+% is compared against the content of the argument of \cs{svg@extension@parse},
+% which is probably \cs{svg@file@ext}. If they are equal, the previous part is
+% appended to \cs{filename@base} and \cs{filename@ext} is set to the content of
+% the first argument.
+% \begin{macrocode}
+\newcommand*\svg@extension@parse[1]{%
+ \IfArgIsEmpty{#1}{}{%
+ \@expandtwoargs\Ifstr%
+ {\detokenize\expandafter{\filename@ext}}{\detokenize\expandafter{#1}}{}{%
+ \begingroup%
+% \end{macrocode}
+% Macro \cs{svg@tempa} is used to temporarily store anything before the
+% searched extension at the end of \cs{filename@ext} and \cs{svg@tempb} is set
+% to the actual searched extension if found.
+% \begin{macrocode}
+ \edef\svg@tempa{%
+ \def\noexpand\svg@tempa{}%
+ \let\noexpand\svg@tempb\relax%
+ \noexpand\svg@extension@@parse%
+ \filename@ext.\noexpand\@nil#1\noexpand\@nil%
+ }%
+ \svg@tempa%
+ \edef\svg@tempa{%
+ \endgroup%
+% \end{macrocode}
+% If the trailing extension was found, \cs{filename@base} and \cs{filename@ext}
+% are adopted.
+% \begin{macrocode}
+ \def\noexpand\filename@base{\filename@base\svg@tempa}%
+ \ifx\svg@tempb\relax%
+ \let\noexpand\filename@ext\relax%
+ \else%
+ \def\noexpand\filename@ext{\svg@tempb}%
+ \fi%
+ }%
+ \svg@tempa%
+ }%
+ }%
+}
+% \end{macrocode}
+% Macro \cs{svg@extension@@parse} is recursively called as long as there are
+% any dots or the searched extension is found.
+% \begin{macrocode}
+\newcommand*\svg@extension@@parse{}
+\def\svg@extension@@parse#1.#2\@nil#3\@nil{%
+ \edef\svg@tempa{\svg@tempa.#1}%
+ \IfArgIsEmpty{#2}{}{%
+ \Ifstr{\detokenize{#2}}{\detokenize{#3.}}{%
+% \end{macrocode}
+% If the trailing extension is found, \cs{svg@tempb} is defined.
+% \begin{macrocode}
+ \edef\svg@tempb{#3}%
+ }{%
+ \svg@extension@@parse#2\@nil#3\@nil%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@extension@@parse
+% \end{macro}^^A \svg@extension@parse
+% \begin{macro}{\svg@iffilenewer}
+% \changes{v2.02d}{2019/10/22}{use \cs{filemoddate} with Xe\LaTeX, see
+% \url{https://github.com/mrpiggi/svg/issues/12}}^^A
+% The macro \cs{svg@iffilenewer} is used to decide, whether the export with
+% \app{Inkscape} is necessary due to an updated SVG~file. This can only be
+% done, if \cs{pdf@filemoddate} or \cs{filemoddate} is defined.
+% \ToDo{\cs{svg@iffilenewer} instead \cs{IfFileExists} to check results}[v2.03]
+% \begin{macrocode}
+\newcommand*\svg@iffilenewer[2]{\@gobbletwo}
+\ifx\pdf@filemoddate\@undefined
+ \ifx\filemoddate\@undefined\else
+ \ifx\strcmp\@undefined\else
+ \renewcommand*\svg@iffilenewer[2]{%
+ \begingroup%
+ \edef\svg@tempa{\filemoddate{#1}}%
+ \edef\svg@tempb{\filemoddate{#2}}%
+ \ifnum\strcmp{\svg@tempa}{\svg@tempb}>\z@\relax%
+ \aftergroup\@firstoftwo%
+ \else%
+ \aftergroup\@secondoftwo%
+ \fi%
+ \endgroup%
+ }%
+ \fi
+ \fi
+\else
+ \ifx\pdf@strcmp\@undefined\else
+ \renewcommand*\svg@iffilenewer[2]{%
+ \begingroup%
+ \edef\svg@tempa{\pdf@filemoddate{#1}}%
+ \edef\svg@tempb{\pdf@filemoddate{#2}}%
+ \ifnum\pdf@strcmp{\svg@tempa}{\svg@tempb}>\z@\relax%
+ \aftergroup\@firstoftwo%
+ \else%
+ \aftergroup\@secondoftwo%
+ \fi%
+ \endgroup%
+ }%
+ \fi
+\fi
+% \end{macrocode}
+% \end{macro}^^A \svg@iffilenewer
+% \begin{macro}{\svg@shell@mkdir}
+% \begin{macro}{\svg@shell@@mkdir}
+% \begin{macro}{\svg@shell@mv}
+% \begin{macro}{\svg@shell@@mv}
+% \begin{macro}{\svg@shell@rm}
+% \begin{macro}{\svg@shell@@rm}
+% Finally, platform dependent macros for creating directories as well as
+% moving and deleting files are provided.
+% \begin{macrocode}
+\newcommand*\svg@shell@mkdir[1]{%
+ \begingroup%
+% \end{macrocode}
+% A directory should only be created, if it isn't the current working directory.
+% \begin{macrocode}
+ \svg@quotes@remove[{#1}]{\svg@tempa}%
+ \@svg@tempswatrue%
+ \Ifstr{\svg@tempa}{}{\@svg@tempswafalse}{%
+ \Ifstr{\svg@tempa}{./}{\@svg@tempswafalse}{%
+ }}%
+ \if@svg@tempswa%
+ \ShellEscape{\svg@shell@@mkdir{\svg@tempa}}%
+ \fi%
+ \endgroup%
+}
+\newcommand*\svg@shell@mv[2]{%
+ \ShellEscape{\svg@shell@@mv\space"#1"\space"#2"}%
+}
+\newcommand*\svg@shell@rm[1]{%
+ \ShellEscape{\svg@shell@@rm\space"#1"}%
+}
+% \end{macrocode}
+% The platform dependent commands for file access.
+% \begin{macrocode}
+\svg@ifwindowsdetected{%
+ \newcommand*\svg@shell@@mkdir[1]{if not exist "#1" mkdir "#1"}%
+ \newcommand*\svg@shell@@mv{move}%
+ \newcommand*\svg@shell@@rm{del}%
+}{%
+ \newcommand*\svg@shell@@mkdir[1]{mkdir -p "#1"}%
+ \newcommand*\svg@shell@@mv{mv}%
+ \newcommand*\svg@shell@@rm{rm}%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@shell@@rm
+% \end{macro}^^A \svg@shell@rm
+% \end{macro}^^A \svg@shell@@mv
+% \end{macro}^^A \svg@shell@mv
+% \end{macro}^^A \svg@shell@@mkdir
+% \end{macro}^^A \svg@shell@mkdir
+% \begin{macro}{\svg@normalize@path}
+% \changes{v2.02}{2018/09/07}{usage of \cs{svg@deactivate@dq}}^^A
+% \begin{macro}{\svg@normalize@@path}
+% If any path is given, a trailing slash is needed. These two macros ensure
+% that this condition is fulfilled in any case, even if this is not considered
+% by the user. As before, a macro containing the path string is passed to
+% \cs{svg@normalize@path}.
+% \begin{macrocode}
+\newcommand*\svg@normalize@path[1]{%
+ \begingroup%
+ \svg@quotes@remove[{#1}]{\svg@tempa}%
+ \ifx\svg@tempa\@empty\relax%
+ \def\svg@tempa{./}%
+ \fi%
+ \expandafter\svg@normalize@@path\svg@tempa//\@nil%
+ \edef\svg@tempb{%
+ \endgroup%
+ \if@svg@quotes@found%
+ \def\noexpand#1{"\svg@tempa"}%
+ \else%
+ \def\noexpand#1{\svg@tempa}%
+ \fi%
+ }%
+ \svg@tempb%
+}
+\newcommand*\svg@normalize@@path{}
+\def\svg@normalize@@path#1/#2/\@nil{%
+ \IfArgIsEmpty{#2}{%
+ \IfArgIsEmpty{#1}{\def\svg@tempa{}}{\def\svg@tempa{#1/}}%
+ }{%
+ \svg@normalize@@path#2/\@nil%
+ \edef\svg@tempa{#1/\svg@tempa}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@normalize@@path
+% \end{macro}^^A \svg@normalize@path
+%
% \iffalse
-%</base>
+%</main>
+%<*extract>
% \fi
%
%
+%
+% \subsubsection{List handling}
+%
+% \begin{macro}{\svgx@ifinlist}
+% Check, if the first argument is included in a comma-separated list in the
+% second argument. Keep in mind that the first argument is not expanded at all,
+% the second one exactly once.
+% \begin{macrocode}
+\newcommand*\svgx@ifinlist[2]{%
+ \begingroup%
+ \def\svg@tempa##1,#1,##2\@nil{%
+ \IfArgIsEmpty{##2}{%
+ \aftergroup\@secondoftwo%
+ }{%
+ \aftergroup\@firstoftwo%
+ }%
+ }%
+ \expandafter\svg@tempa\expandafter,#2,#1,\@nil%
+ \endgroup%
+}
+% \end{macrocode}
+% \end{macro}^^A \svgx@ifinlist
+%
+% \iffalse
+%</extract>
+%</package&base>
+%<*package&option>
+% \fi
+%
+%
+%
% \section{Including SVG files with package \pkg{svg}}
% \subsection{Options}
%
-% All options, which can be set either as package options or with
-% \cs{svgsetup}, as well as the optional parameters for both user commands
-% \cs{includesvg}\oarg{parameters}\marg{svg filename} and
-% \cs{includeinkscape}\oarg{parameters}\marg{graphic filename} are defined with
+% All options, which are recommended to be set with \cs{svgsetup}\marg{options}
+% but are also available as package options, as well as the optional parameters
+% for both user commands \cs{includesvg}\oarg{parameters}\marg{svg~file}
+% and \cs{includeinkscape}\oarg{parameters}\marg{file} are defined with
% the interface provided by package \pkg{scrbase}.
% \begin{macrocode}
\DefineFamily{SVG}
@@ -1369,19 +1946,18 @@ svg-extract -- Extract independent graphic files from SVG pictures
%
% \iffalse
%</package&option>
-%<*package&base>
-%<*option>
+%<*package&option&main>
% \fi
%
% \begin{macro}{\svg@deprecated@key}
-% With version v2.00 the whole user interface was renewed. For reasons of
-% compatibility, outdated options and parameters from version~v1.0 are also
+% With version v2.00 the whole user\hbox{-}interface was renewed. For reasons
+% of compatibility, outdated options and parameters from version~v1.0 are also
% provided. If an old key was given, a warning is issued and the valid key is
% used.
% \begin{macrocode}
\newcommand*\svg@deprecated@key[3][svg]{%
\PackageWarning{#1}{%
- The option key `#2' is deprecated.\MessageBreak%
+ The option key `#2' is deprecated. \MessageBreak%
It's recommended to use `#3'\MessageBreak%
instead%
}%
@@ -1392,7 +1968,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
%
% Within the exported \LaTeX~files of \app{Inkscape}, some commands are used
% out of additional packages. But maybe the user doesn't want to load this
-% packages anyways.
+% packages anyhow.
%
% \begin{option}{usexcolor}
% \changes{v2.00}{2017/02/17}{new}^^A
@@ -1427,12 +2003,23 @@ svg-extract -- Extract independent graphic files from SVG pictures
}%
\fi%
\if@svg@use@transparent%
- \RequirePackage{transparent}[2016/05/16]%
+ \RequirePackage{transparent}[2019/11/29]%
\else%
\AfterPackage*{transparent}{%
\PackageWarning{svg}{Package `transparent' was loaded anyway}%
}%
\fi%
+% \end{macrocode}
+% There is an issue with package \pkg{transparent}, which currently implements
+% an \emph{invalid} check relying on internal commands of package \pkg{pgfsys},
+% whereas these have changed in the latest version.^^A
+% \footnote{\url{https://github.com/ho-tex/transparent/issues/3}}
+% \begin{macrocode}
+ \AfterPackage*{transparent}{%
+ \ifcsname Gin@driver\endcsname%
+ \RequirePackage{pgfsys}%
+ \fi%
+ }%
}
% \end{macrocode}
% \end{macro}^^A \if@svg@use@transparent
@@ -1457,20 +2044,20 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \begin{macro}{\svg@ink@mode}
% The intension of option \opt{inkscape} is to control the running behaviour of
% \app{Inkscape}. It can be switched off at all (\opt{inkscape}|=|\val{false})
-% or invoked only if necessary (\opt{inkscape}|=|\val{true}) or the command
-% line call can be forced with every \LaTeX~run (\opt{inkscape}|=|\val{forced}).
-% Additionally, option \opt{inkscape} can be used as wrapper for options
-% \opt{inkscapeformat}, \opt{inkscapelatex}, \opt{inkscapearea} and
-% \opt{inkscapedpi}, which are declared later.
+% or invoked only if necessary (\opt{inkscape}|=|\val{true}) and even be forced
+% with every \LaTeX~run (\opt{inkscape}|=|\val{forced}). Additionally, option
+% \opt{inkscape} can be used as wrapper for options \opt{inkscapeformat},
+% \opt{inkscapelatex}, \opt{inkscapearea} and \opt{inkscapedpi}, which are
+% declared later.
% \begin{macrocode}
\newcommand*\svg@ink@mode{}
\DefineFamilyKey{SVG}{inkscape}[true]{%
- \lowercase{\svg@sanitize@dq\svg@tempb{#1}}%
+ \svg@sanitize@dq\svg@tempb{#1}%
\FamilySetNumerical{SVG}{inkscape}{svg@tempa}{%
{false}{0},{off}{0},{no}{0},%
- {true}{1},{on}{1},{yes}{1},{onlynewer}{1},{newer}{1},%
- {force}{2},{forced}{2},{overwrite}{2},%
- {pdf}{3},{eps}{4},{ps}{5},{png}{6},%
+ {true}{1},{on}{1},{yes}{1},{auto}{1},{onlynewer}{1},{newer}{1},%
+ {forced}{2},{force}{2},{overwrite}{2},%
+ {pdf}{3},{PDF}{3},{eps}{4},{EPS}{4},{ps}{5},{PS}{5},{png}{6},{PNG}{6},%
{drawing}{7},{crop}{7},%
{page}{8},{nocrop}{8},%
{tex}{9},{latex}{9},{exportlatex}{9},{latexexport}{9},%
@@ -1518,16 +2105,16 @@ svg-extract -- Extract independent graphic files from SVG pictures
% In version~v1.0 the option \opt{inkscape} was used to set both the executable
% and options for \app{Inkscape}. This is taken into account here.
% \begin{macrocode}
- \ifx\FamilyKeyState\FamilyKeyStateProcessed\else%
+ \ifx\FamilyKeyState\FamilyKeyStateProcessed\else% legacy option
% \end{macrocode}
-% Splitting executable from options with delimitted macros. After calling
+% Splitting executable from options with delimited macros. After calling
% \cs{svg@tempa} with the given value, the part for the executable is stored in
% \cs{svg@tempa} and the option part---which is recognized by the first |-|
% character--- in \cs{svg@tempb}.
% \begin{macrocode}
\svg@quotes@remove[{#1}]{\svg@tempb}%
\def\svg@tempa##1-##2\@nil{%
- \IfArgIsEmpty{##2}{\def\svg@tempb{}}{%
+ \IfArgIsEmpty{##2}{\let\svg@tempb\@empty}{%
\def\svg@tempa####1-\@nil{\def\svg@tempb{-####1}}%
\svg@tempa##2\@nil%
}%
@@ -1578,6 +2165,73 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \end{macrocode}
% \end{option}^^A off
% \end{option}^^A on
+% \begin{option}{inkscapeversion}
+% \changes{v2.02f}{2020/05/06}{new}^^A
+% \begin{macro}{\svg@ink@ver}
+% \changes{v2.02f}{2020/05/06}{new}^^A
+% \begin{option}{inkscapeexe}
+% \changes{v2.00}{2017/02/17}{new}^^A
+% \changes{v2.02f}{2020/05/06}{only usable in preamble}^^A
+% \begin{macro}{\svg@ink@exe}
+% \begin{option}{inkscapeopt}
+% \changes{v2.00}{2017/02/17}{new}^^A
+% \begin{macro}{\svg@ink@opt}
+% With these options, the executed command for invoking \app{Inkscape} as well
+% as additional options can be defined.
+% \ToDo{rename \cs{svg@ink@ver} > \cs{svg@ink@ver@val} (keep former cs)?}[v2.03]
+% \begin{macrocode}
+\newcommand*\svg@ink@ver{\m@ne}
+\DefineFamilyKey{SVG}{inkscapeversion}[true]{%
+ \FamilySetNumerical{SVG}{inkscape}{svg@tempa}{%
+ {true}{0},{on}{0},{yes}{0},{auto}{0},{detect}{0},{determine}{0},{fetch}{0},%
+ {enquire}{0},{identify}{0},{request}{0},{retrieve}{0},{obtain}{0}%
+ }{#1}%
+ \ifx\FamilyKeyState\FamilyKeyStateProcessed%
+ \renewcommand*\svg@ink@ver{\m@ne}%
+ \else%
+ \def\svg@tempa##1.##2\@nil{%
+ \Ifnumber{##1}{%
+ \renewcommand*\svg@ink@ver{##1}%
+ \FamilyKeyStateProcessed%
+ }{}%
+ }%
+ \svg@tempa#1.\@nil%
+ \fi%
+}
+\newcommand*\svg@ink@exe{inkscape}
+\DefineFamilyKey{SVG}{inkscapeexe}{%
+ \svg@sanitize@dq\svg@ink@exe{#1}%
+ \FamilyKeyStateProcessed%
+}
+\newcommand*\svg@ink@opt{}
+\DefineFamilyKey{SVG}{inkscapeopt}{%
+ \renewcommand*\svg@ink@opt{#1}%
+ \FamilyKeyStateProcessed%
+}
+% \end{macrocode}
+% The two options \opt{inkscapeversion} and \opt{inkscapeexe} can only be used
+% within the preamble.
+% \begin{macrocode}
+\def\svg@tempa#1{%
+ \AtBeginDocument{%
+ \DefineFamilyKey[]{SVG}{#1}[]{%
+ \PackageError{svg}{Option `#1' too late}{%
+ Option `#1' can only be set within\MessageBreak%
+ the preamble but you have tried to set it up later.%
+ }%
+ \FamilyKeyStateProcessed%
+ }%
+ }%
+}
+\svg@tempa{inkscapeexe}
+\svg@tempa{inkscapeversion}
+% \end{macrocode}
+% \end{macro}^^A \svg@ink@opt
+% \end{option}^^A inkscapeopt
+% \end{macro}^^A \svg@ink@exe
+% \end{option}^^A inkscapeexe
+% \end{macro}^^A \svg@ink@ver
+% \end{option}^^A inkscapeversion
% \begin{option}{inkscapeformat}
% \changes{v2.00}{2017/02/17}{new}^^A
% \begin{macro}{\svg@ink@format}
@@ -1591,10 +2245,9 @@ svg-extract -- Extract independent graphic files from SVG pictures
\renewcommand*\svg@ink@format{eps}
\fi\fi
\DefineFamilyKey{SVG}{inkscapeformat}{%
- \lowercase{\def\svg@tempa{#1}}%
\FamilySetNumerical{SVG}{inkscapeformat}{svg@tempa}{%
- {pdf}{0},{eps}{1},{ps}{2},{png}{3}%
- }{\svg@tempa}%
+ {pdf}{0},{PDF}{0},{eps}{1},{EPS}{1},{ps}{2},{PS}{2},{png}{3},{PNG}{3}%
+ }{#1}%
\ifx\FamilyKeyState\FamilyKeyStateProcessed%
\ifcase\svg@tempa\relax% latex
\renewcommand*\svg@ink@format{pdf}%
@@ -1618,7 +2271,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \changes{v2.00b}{2017/03/28}{new, alternative key for \opt{inkscapelatex}}^^A
% \begin{macro}{\svg@ink@latex}
% This option controls whether the \app{Inkscape} export will be invoked with
-% or without the generation of a seperate \LaTeX~file.
+% or without the generation of a separate \LaTeX~file.
% \begin{macrocode}
\newif\if@svg@ink@latex
\FamilyBoolKey{SVG}{inkscapelatex}{@svg@ink@latex}
@@ -1679,30 +2332,24 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \end{macro}^^A \svg@ink@dpi
% \end{option}^^A inkscapedensity
% \end{option}^^A inkscapedpi
-% \begin{option}{inkscapeexe}
-% \changes{v2.00}{2017/02/17}{new}^^A
-% \begin{macro}{\svg@ink@exe}
-% \begin{option}{inkscapeopt}
-% \changes{v2.00}{2017/02/17}{new}^^A
-% \begin{macro}{\svg@ink@opt}
-% With these options, the terminal command for invoking \app{Inkscape} as well
-% as additional options can be defined.
+% \begin{macro}{\svg@ink@cmd}
+% \changes{v2.02f}{2020/05/06}{distinguish \app{Inkscape}~CLI versions}^^A
+% The actual usage of the \app{Inkscape} command~line~interface.
% \begin{macrocode}
-\newcommand*\svg@ink@exe{inkscape}
-\DefineFamilyKey{SVG}{inkscapeexe}{%
- \renewcommand*\svg@ink@exe{#1}%
- \FamilyKeyStateProcessed%
-}
-\newcommand*\svg@ink@opt{}
-\DefineFamilyKey{SVG}{inkscapeopt}{%
- \renewcommand*\svg@ink@opt{#1}%
- \FamilyKeyStateProcessed%
+\newcommand*\svg@ink@cmd[2]{%
+ \svg@ink@exe\space"#1.\svg@file@ext"\space\svg@ink@area\space%
+ \ifx\svg@ink@dpi\relax\else--export-dpi=\svg@ink@dpi\space\fi%
+ \if@svg@ink@latex--export-latex\space\fi%
+ \ifx\svg@ink@opt\@empty\else\svg@ink@opt\space\fi%
+ \ifcase\svg@ink@ver\relax% 0.x detected
+ --without-gui\space%
+ --export-\svg@ink@format="#2.\svg@ink@format"%
+ \else% 1.x or nothing detected
+ --export-filename="#2.\svg@ink@format"%
+ \fi%
}
% \end{macrocode}
-% \end{macro}^^A \svg@ink@opt
-% \end{option}^^A inkscapeopt
-% \end{macro}^^A \svg@ink@exe
-% \end{option}^^A inkscapeexe
+% \end{macro}^^A \svg@ink@cmd
%
%
%
@@ -1758,23 +2405,16 @@ svg-extract -- Extract independent graphic files from SVG pictures
%
%
%
-% \subsubsection{Setting output folder}
+% \subsubsection{Setting output folder and file}
%
% \begin{option}{inkscapepath}
% \changes{v2.00}{2017/02/17}{new}^^A
% \changes{v2.02}{2018/09/07}{usage of \cs{svg@sanitize@dq}}^^A
-% \begin{option}{inkscapename}
-% \changes{v2.00}{2017/02/17}{new}^^A
% \begin{macro}{\svg@out@path}
-% \begin{macro}{\svg@out@name}
-% \begin{macro}{\svg@out@base}
% The option \opt{inkscapepath} controls, in which folder the results of the
-% \app{Inkscape} export will be located. With option \opt{inkscapename} the
-% name of the exported file itself can be changed.
+% \app{Inkscape} export will be located.
% \begin{macrocode}
\newcommand*\svg@out@path{}
-\newcommand*\svg@out@name{\svg@file@name\svg@file@suffix}
-\newcommand*\svg@out@base{\svg@out@path\svg@out@name.\svg@ink@format}
\DefineFamilyKey{SVG}{inkscapepath}{%
\svg@sanitize@dq\svg@tempb{#1}%
\FamilySetNumerical{SVG}{inkscapepath}{svg@tempa}{%
@@ -1799,6 +2439,17 @@ svg-extract -- Extract independent graphic files from SVG pictures
\FamilyKeyStateProcessed%
\fi%
}
+% \end{macrocode}
+% \end{macro}^^A \svg@out@path
+% \end{option}^^A inkscapepath
+% \begin{option}{inkscapename}
+% \changes{v2.00}{2017/02/17}{new}^^A
+% \begin{macro}{\svg@out@name}
+% \begin{macro}{\svg@out@base}
+% With option \opt{inkscapename} the name of the exported file can be changed.
+% \begin{macrocode}
+\newcommand*\svg@out@name{\svg@file@name\svg@file@suffix}
+\newcommand*\svg@out@base{\svg@out@path\svg@out@name.\svg@ink@format}
\DefineFamilyKey{SVG}{inkscapename}{%
\renewcommand*\svg@out@name{#1\svg@file@suffix}%
\FamilyKeyStateProcessed%
@@ -1806,9 +2457,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \end{macrocode}
% \end{macro}^^A \svg@out@base
% \end{macro}^^A \svg@out@name
-% \end{macro}^^A \svg@out@path
% \end{option}^^A inkscapename
-% \end{option}^^A inkscapepath
%
%
%
@@ -1870,9 +2519,9 @@ svg-extract -- Extract independent graphic files from SVG pictures
\FamilySetBool{SVG}{keepaspectratio}{@svg@tempswa}{#1}%
\ifx\FamilyKeyState\FamilyKeyStateProcessed%
\if@svg@tempswa%
- \FamilyOptions{SVG}{distort=false}%
- \else
- \FamilyOptions{SVG}{distort=true}%
+ \FamilyExecuteOptions[.svg.sty]{SVG}{distort=false}%
+ \else%
+ \FamilyExecuteOptions[.svg.sty]{SVG}{distort=true}%
\fi%
\fi%
}
@@ -1942,7 +2591,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \begin{option}{lastpage}
% \changes{v2.00}{2017/02/20}{new}^^A
% \begin{counter}{svg@param@lastpage}
-% For \app{Inkscape}~0.91 a bug concerning the \LaTeX~export has been reported
+% For \app{Inkscape}\,0.91 a bug concerning the \LaTeX~export has been reported
% (\url{https://bugs.launchpad.net/ubuntu/+source/inkscape/+bug/1417470}).
% Sometimes the \LaTeX~file created by \app{Inkscape} tries to include more
% pages than actually are present in the PDF~file. To work around this
@@ -1950,7 +2599,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% from the PDF~file.
% \begin{macrocode}
\newcounter{svg@param@lastpage}
-\DefineFamilyKey{SVG}{lastpage}{%
+\DefineFamilyKey{SVG}{lastpage}[true]{%
\FamilySetNumerical{SVG}{lastpage}{svg@tempa}{%
{false}{0},{off}{0},{no}{0},{ignore}{0},%
{true}{1},{on}{1},{yes}{1},{auto}{1}%
@@ -1974,578 +2623,36 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \begin{macrocode}
\newif\if@svg@draft
\FamilyBoolKey{SVG}{draft}{@svg@draft}
-\AtBeginDocument{\if@svg@draft\else\ifGin@draft\@svg@drafttrue\fi\fi}
+\AfterPackage*{graphicx}{\ifGin@draft\@svg@drafttrue\fi}
% \end{macrocode}
% \end{macro}^^A \if@svg@draft
% \end{option}^^A draft
%
+% \iffalse
+%</package&option&main>
+% \fi
%
%
-% \subsection{Handling path information}
%
-% Both packages \pkg{svg} and \pkg{svg-extract} should be able to handle
-% user-defined input and output paths. As there is the possibility for users to
-% provide paths with or without quotes to \LaTeX, this is taken into account.
+% \subsection{User commands}
+% \subsubsection{Optional parameters for user commands}
%
-% \begin{macro}{\svg@deactivate@dq}
-% \changes{v2.02}{2018/09/07}{new}^^A
-% \changes{v2.02a}{2018/10/17}{bug fix for \pkg{polyglossia}}^^A
-% In order to avoid errors concerning file names with package \pkg{babel} and
-% it's active double quotes, this command is defined.
-% \begin{macrocode}
-\newcommand*\svg@deactivate@dq{}
-\AfterPackage+{babel}{%
- \renewcommand*\svg@deactivate@dq{\bbl@deactivate{"}}%
- \providecommand*\bbl@deactivate[1]{}%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@deactivate@dq
-% \begin{macro}{\svg@sanitize@dq}
-% \changes{v2.02}{2018/09/07}{new}^^A
-% Save expansion of the second argument in the macro from teh first argument
-% with deactivated double quotes.
-% \begin{macrocode}
-\newcommand*\svg@sanitize@dq[2]{%
- \begingroup%
- \svg@deactivate@dq%
- \edef\svg@tempa{\endgroup\def\noexpand#1{#2}}%
- \svg@tempa%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@sanitize@dq
-% \begin{macro}{\svg@quotes@remove}
-% \changes{v2.02}{2018/09/07}{usage of \cs{svg@sanitize@dq}}^^A
-% \changes{v2.02}{2018/09/07}{calling \cs{svg@quotes@check}}^^A
-% \begin{macro}{\svg@quotes@@remove}
-% These two commands are used to remove all occurring quotes within a string.
-% The only argument passed to \cs{svg@quotes@remove} is not the string itself
-% but a macro in which a string is stored.
-% \begin{macrocode}
-\newcommand*\svg@quotes@remove[2][]{%
- \begingroup%
- \IfArgIsEmpty{#1}{\def\svg@tempb{#2}}{\def\svg@tempb{#1}}%
- \svg@sanitize@dq\svg@tempa{\svg@tempb}%
- \expandafter\svg@quotes@check\expandafter{\svg@tempa}%
- \expandafter\svg@quotes@@remove\svg@tempa""\@nil%
- \edef\svg@tempb{%
- \endgroup%
- \def\noexpand#2{\svg@tempa}%
- \if@svg@quotes@found%
- \noexpand\@svg@quotes@foundtrue%
- \else%
- \noexpand\@svg@quotes@foundfalse%
- \fi%
- }%
- \svg@tempb%
-}
-\newcommand*\svg@quotes@@remove{}
-\def\svg@quotes@@remove#1"#2"#3\@nil{%
- \IfArgIsEmpty{#2}{%
- \edef\svg@tempa{#1}%
- }{%
- \svg@quotes@@remove#1#2#3""\@nil%
- }%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@quotes@@remove
-% \end{macro}^^A \svg@quotes@remove
-% \begin{macro}{\svg@quotes@check}
-% \begin{macro}{\svg@quotes@@check}
-% \begin{macro}{\if@svg@quotes@found}
-% During the treatment of paths, it may be necessary to temporarily remove
-% quotes and, if required, add them again later. For this purpose, the switch
-% \cs{if@svg@quotes@found} as well as the commands \cs{svg@quotes@check} and
-% \cs{svg@quotes@@check}, which controls the switch, are defined. As before,
-% the string is passed in a macro to \cs{svg@quotes@check}.
-% \begin{macrocode}
-\newif\if@svg@quotes@found
-\newcommand*\svg@quotes@check[1]{%
- \expandafter\svg@quotes@@check#1"\@nil%
-}
-\newcommand*\svg@quotes@@check{}
-\def\svg@quotes@@check#1"#2\@nil{%
- \IfArgIsEmpty{#2}{\@svg@quotes@foundfalse}{\@svg@quotes@foundtrue}%
-}
-% \end{macrocode}
-% \end{macro}^^A \if@svg@quotes@found
-% \end{macro}^^A \svg@quotes@@check
-% \end{macro}^^A \svg@quotes@check
-% \begin{macro}{\svg@remove@leadingchar}
-% \changes{v2.02}{2018/09/07}{new}^^A
-% This command removes the single character in given with the first argument
-% from the expanded macro in the second argument.
-% \begin{macrocode}
-\newcommand*\svg@remove@leadingchar[2]{%
- \begingroup%
- \svg@sanitize@dq\svg@tempa{#2}%
- \def\svg@tempb{%
- \def\svg@tempa####1\@nil{\def\svg@tempa{####1}}%
- \kernel@ifnextchar#1%
- {\expandafter\svg@tempa\@gobble}%
- {\svg@tempa}%
- }%
- \expandafter\svg@tempb\svg@tempa\@nil%
- \edef\svg@tempb{%
- \endgroup%
- \def\noexpand#2{\svg@tempa}%
- }%
- \svg@tempb%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@remove@leadingchar%
-% \begin{macro}{\svg@set@input@path}
-% \changes{v2.01}{2017/11/28}{new}^^A
-% \changes{v2.02}{2018/09/07}{usage of \cs{svg@deactivate@dq}}^^A
-% \begin{macro}{\svg@append@input@path}
-% \changes{v2.01}{2017/11/28}{new}^^A
-% \changes{v2.02}{2018/09/07}{avoid duplicates in \cs{input@path}}^^A
-% In order to import SVG~files from different folders, \cs{svg@set@input@path}
-% evaluates several macros, which are supposed to be used for holding different
-% search folders. Any given path will be handled by \cs{svg@normalize@path}.
-% The optional argument can be used to append an additional search path.
-% \begin{macrocode}
-\newcommand*\svg@set@input@path[1][]{%
- \begingroup%
- \svg@deactivate@dq%
-% \end{macrocode}
-% If a path was already found and stored within \cs{svg@file@path}, it is
-% searched first and wrapped in curly braces. This is necessary for using
-% commands like \cs{input}\marg{tex filename} within SVG~files.
-% \begin{macrocode}
- \ifx\svg@file@path\@empty\else%
- \svg@normalize@path{\svg@file@path}%
- \edef\svg@file@path{{\svg@file@path}}%
- \fi%
-% \end{macrocode}
-% Afterwards, several search paths are appended. If \cs{svgpath} was used, it
-% is searched next. If nothing was found, \cs{graphicspath} is considered if
-% defined followed by a path given in the third argument. If nothing was found
-% yet, the standard \cs{input@path} is searched last.
-% \begin{macrocode}
- \svg@append@input@path{\svg@file@path}{\svg@input@path}%
- \svg@append@input@path{\svg@file@path}{\Ginput@path}%
- \IfArgIsEmpty{#1}{}{\svg@append@input@path{\svg@file@path}{{#1}}}%
- \svg@append@input@path{\svg@file@path}{\input@path}%
-% \end{macrocode}
-% Finally, \cs{input@path} is set.
-% \begin{macrocode}
- \edef\svg@tempa{%
- \endgroup%
- \ifx\svg@file@path\@empty\else%
- \def\noexpand\input@path{\svg@file@path}%
- \fi%
- }%
- \svg@tempa%
-}
-% \end{macrocode}
-% Only, if a certain search path is defined, it is added. The paths given in
-% the first argument are compared to each path in the second argument and only
-% new ones are added.
-% \begin{macrocode}
-\newcommand*\svg@append@input@path[2]{%
- \ifx#2\@undefined\else%
- \edef\svg@tempb{#2}%
- \expandafter\@tfor\expandafter\svg@tempa\expandafter:\expandafter=%
- \svg@tempb\do{%
-% \end{macrocode}
-% Passing each new path to \cs{svg@normalize@path}. If a path already exists,
-% switch \cs{if@svg@tempswa} is set to \val{false}.
-% \begin{macrocode}
- \ifx\svg@tempa\@empty\else%
- \@svg@tempswatrue%
- \svg@normalize@path{\svg@tempa}%
- \expandafter\@tfor\expandafter\svg@tempb\expandafter:\expandafter=%
- #1\do{%
- \ifx\svg@tempa\svg@tempb%
- \@svg@tempswafalse%
- \@break@tfor%
- \fi%
- }%
- \if@svg@tempswa%
- \edef#1{#1{\svg@tempa}}%
- \fi%
- \fi%
- }%
- \fi%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@append@input@path
-% \end{macro}^^A \svg@set@input@path
-% \begin{macro}{\svg@normalize@path}
-% \changes{v2.02}{2018/09/07}{usage of \cs{svg@deactivate@dq}}^^A
-% \begin{macro}{\svg@normalize@@path}
-% If any path is given, a trailing slash is needed. These two macros ensure
-% that this condition is fulfilled in any case, even if this is not considered
-% by the user. As before, a macro containing the path string is passed to
-% \cs{svg@normalize@path}.
-% \begin{macrocode}
-\newcommand*\svg@normalize@path[1]{%
- \begingroup%
- \svg@quotes@remove[{#1}]{\svg@tempa}%
- \ifx\svg@tempa\@empty\relax%
- \def\svg@tempa{./}%
- \fi%
- \expandafter\svg@normalize@@path\svg@tempa//\@nil%
- \edef\svg@tempb{%
- \endgroup%
- \if@svg@quotes@found%
- \def\noexpand#1{"\svg@tempa"}%
- \else%
- \def\noexpand#1{\svg@tempa}%
- \fi%
- }%
- \svg@tempb%
-}
-\newcommand*\svg@normalize@@path{}
-\def\svg@normalize@@path#1/#2/\@nil{%
- \IfArgIsEmpty{#2}{%
- \IfArgIsEmpty{#1}{\def\svg@tempa{}}{\def\svg@tempa{#1/}}%
- }{%
- \svg@normalize@@path#2/\@nil%
- \edef\svg@tempa{#1/\svg@tempa}%
- }%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@normalize@@path
-% \end{macro}^^A \svg@normalize@path
-% \begin{macro}{\svg@ifvalueisrelax}
-% For some keys the usage of \val{\cs{relax}} as a value should lead to a
-% special reaction, such as restoring to default behavior or reseting the key.
-% Therefore, \cs{svg@ifvalueisrelax} checks, whether \val{\cs{relax}} was used
-% as value or not.
+% The family member is defined for both \pkg{svg} and \pkg{svg-extract}.
% \begin{macrocode}
-\newcommand*\svg@ifvalueisrelax[1]{%
- \begingroup%
- \def\svg@tempa{#1}%
- \def\svg@tempb{\relax}%
- \ifx\svg@tempa\svg@tempb\relax%
- \aftergroup\@firstoftwo%
- \else%
- \aftergroup\@secondoftwo%
- \fi%
- \endgroup%
-}
+%<*package&body>
+\DefineFamilyMember[.param]{SVG}
+%</package&body>
% \end{macrocode}
-% \end{macro}^^A \svg@ifvalueisrelax
%
% \iffalse
-%</option>
+%<*package&main>
%<*body>
% \fi
%
-% \begin{macro}{\svg@get@path}
-% \changes{v2.01}{2017/11/28}{using \cs{svg@set@input@path}}^^A
-% \changes{v2.01}{2017/11/28}{using \cs{trim@spaces}}^^A
-% \begin{macro}{\if@svg@file@found}
-% \begin{macro}{\svg@file@path}
-% \begin{macro}{\svg@file@name}
-% \begin{macro}{\svg@file@base}
-% \begin{macro}{\svg@file@suffix}
-% The command \cs{svg@get@path} tries to find a given SVG~file. If the
-% searched file wasn't found in the current path, all paths given with
-% \cs{svgpath} are evaluated. If there was no appropriate file again, all paths
-% given by \cs{graphicspath} are examined. In the last step, a given path
-% within the second mandatory argument is browsed. The results for file path
-% and name are stored in \cs{svg@file@path} and \cs{svg@file@name} as well as
-% the compound of both is saved in \cs{svg@file@base}.
-% \begin{macrocode}
-\newif\if@svg@file@found
-\newcommand*\svg@file@path{}
-\newcommand*\svg@file@name{}
-\newcommand*\svg@file@base{}
-\newcommand*\svg@file@suffix{}
-\newcommand*\svg@get@path[3][\svg@file@ext]{%
- \begingroup%
-% \end{macrocode}
-% A maybe given, unneeded file extension is removed.
-% \begin{macrocode}
- \svg@filename@parse[{#1}]{#2}%
- \IfArgIsEmpty{#1}{%
- \edef\svg@tempa{\filename@area\filename@base.\filename@ext}%
- }{%
- \edef\svg@tempa{\filename@area\filename@base.#1}%
- }%
-% \end{macrocode}
-% After calling \cs{svg@set@input@path}, all search paths are stored in
-% \cs{input@path}, a single path given in the third argument will also be
-% considered.
-% \begin{macrocode}
- \svg@set@input@path[{#3}]%
-% \end{macrocode}
-% The specified file is searched with \cs{IfFileExists}. If the file search was
-% succesful, the macro \cs{svg@filename@parse} is called with the result.
-% \begin{macrocode}
- \@svg@tempswafalse%
- \expandafter\IfFileExists\expandafter{\svg@tempa}{%
- \expandafter\svg@quotes@check\expandafter{\svg@tempa}%
- \if@svg@quotes@found\else%
- \svg@quotes@remove{\@filef@und}%
- \fi%
- \@svg@tempswatrue%
- \edef\@filef@und{\expandafter\trim@spaces\expandafter{\@filef@und}}%
- \svg@filename@parse[{#1}]{\@filef@und}%
- }{}%
- \edef\svg@tempa{%
- \endgroup%
- \if@svg@tempswa%
- \noexpand\@svg@file@foundtrue%
- \def\noexpand\svg@file@path{\filename@area}%
- \def\noexpand\svg@file@name{\filename@base}%
- \def\noexpand\svg@file@base{\filename@area\filename@base}%
- \else%
- \noexpand\@svg@file@foundfalse%
- \def\noexpand\svg@file@path{}%
- \def\noexpand\svg@file@name{#2}%
- \def\noexpand\svg@file@base{#2}%
- \fi%
- }%
- \svg@tempa%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@file@suffix
-% \end{macro}^^A \svg@file@base
-% \end{macro}^^A \svg@file@name
-% \end{macro}^^A \svg@file@path
-% \end{macro}^^A \if@svg@file@found
-% \end{macro}^^A \svg@get@path
-% \begin{macro}{\svg@filename@parse}
-% \changes{v2.02}{2018/09/07}{usage of \cs{svg@sanitize@dq}}^^A
-% \changes{v2.02}{2018/09/07}{usage of \cs{svg@remove@leadingchar}}^^A
-% \changes{v2.02}{2018/09/07}{usage of \cs{svg@extension@parse}}^^A
-% As the internal \LaTeXe{} command \cs{filename@parse} is not able to split a
-% given file name containing quotes, \cs{svg@filename@parse} is defined to
-% resolve this problem. The optional argument can be used to give a specific
-% file extension, which should be searched within \cs{filename@ext}. If found
-% at the very end, the previous part is appended to \cs{filename@base}.
-% \begin{macrocode}
-\newcommand*\svg@filename@parse[2][]{%
- \begingroup%
-% \end{macrocode}
-% The given path and file is parsed with \cs{filename@parse}.
-% \begin{macrocode}
- \svg@sanitize@dq\svg@tempa{#2}%
- \expandafter\filename@parse\expandafter{\svg@tempa}%
-% If there are quotes in the file path, the closing one will be found as first
-% character in \cs{filename@base} as \cs{filename@area} is splitted at the last
-% slash. This leading quote is removed from \cs{filename@base} with
-% \cs{svg@remove@leadingchar}.
-% \begin{macrocode}
- \svg@quotes@remove{\filename@area}%
- \if@svg@quotes@found%
- \edef\filename@area{"\filename@area"}%
- \svg@remove@leadingchar"\filename@base%
- \fi%
-% \end{macrocode}
-% The found extension is parsed against the optional argument. If a double quote
-% was found within the extension, it actually belongs to \cs{filename@base}.
-% \begin{macrocode}
- \ifx\filename@ext\relax\else%
- \svg@quotes@remove{\filename@ext}%
- \svg@extension@parse{#1}%
- \if@svg@quotes@found%
- \edef\filename@base{\filename@base"}%
- \fi%
- \fi%
-% \end{macrocode}
-% Quotes within \cs{filename@base} are normalized.
-% \begin{macrocode}
- \svg@quotes@remove{\filename@base}%
- \if@svg@quotes@found%
- \edef\filename@base{"\filename@base"}%
- \fi%
-% \end{macrocode}
-% With \cs{svg@tempa} the group is closed and the results are saved in the
-% macros \cs{filename@\dots}.
-% \begin{macrocode}
- \edef\svg@tempa{%
- \endgroup%
- \def\noexpand\filename@area{\filename@area}%
- \def\noexpand\filename@base{\filename@base}%
- \ifx\filename@ext\relax%
- \let\noexpand\filename@ext\noexpand\relax%
- \else%
- \def\noexpand\filename@ext{\filename@ext}%
- \fi%
- }%
- \svg@tempa%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@filename@parse
-% \begin{macro}{\svg@extension@parse}
-% \changes{v2.02}{2018/09/07}{new}^^A
-% \begin{macro}{\svg@extension@@parse}
-% \changes{v2.02}{2018/09/07}{new}^^A
-% These macros are used to permit multiple dots in file names. The content of
-% \cs{filename@ext} is split at each occurence of \val{.} and the trailing part
-% is compared against the content of the argument of \cs{svg@extension@parse},
-% which is probably \cs{svg@file@ext}. If they are equal, the previous part is
-% appended to \cs{filename@base} and \cs{filename@ext} is set to the content of
-% the first argument.
-% \begin{macrocode}
-\newcommand*\svg@extension@parse[1]{%
- \IfArgIsEmpty{#1}{}{%
- \@expandtwoargs\Ifstr%
- {\detokenize\expandafter{\filename@ext}}{\detokenize\expandafter{#1}}{}{%
- \begingroup%
-% \end{macrocode}
-% Macro \cs{svg@tempa} is used to temporarily store anything before the
-% searched extension at the end of \cs{filename@ext} and \cs{svg@tempb} is set
-% to the actual searched extension if found.
-% \begin{macrocode}
- \edef\svg@tempa{%
- \def\noexpand\svg@tempa{}%
- \let\noexpand\svg@tempb\relax%
- \noexpand\svg@extension@@parse%
- \filename@ext.\noexpand\@nil#1\noexpand\@nil%
- }%
- \svg@tempa%
- \edef\svg@tempa{%
- \endgroup%
-% \end{macrocode}
-% If the trailing extension was found, \cs{filename@base} and \cs{filename@ext}
-% are adopted.
-% \begin{macrocode}
- \def\noexpand\filename@base{\filename@base\svg@tempa}%
- \ifx\svg@tempb\relax%
- \let\noexpand\filename@ext\relax%
- \else%
- \def\noexpand\filename@ext{\svg@tempb}%
- \fi%
- }%
- \svg@tempa%
- }%
- }%
-}
-% \end{macrocode}
-% Macro \cs{svg@extension@@parse} is recursively called as long as there are
-% any dots or the searched extension is found.
-% \begin{macrocode}
-\newcommand*\svg@extension@@parse{}
-\def\svg@extension@@parse#1.#2\@nil#3\@nil{%
- \edef\svg@tempa{\svg@tempa.#1}%
- \IfArgIsEmpty{#2}{}{%
- \Ifstr{\detokenize{#2}}{\detokenize{#3.}}{%
-% \end{macrocode}
-% If the trailing extension is found, \cs{svg@tempb} is definied.
-% \begin{macrocode}
- \edef\svg@tempb{#3}%
- }{%
- \svg@extension@@parse#2\@nil#3\@nil%
- }%
- }%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@extension@@parse
-% \end{macro}^^A \svg@extension@parse
-% \begin{macro}{\svg@file@missing}
-% \changes{v2.02}{2018/09/07}{notify svg file when missing exported files}^^A
-% The error message, which is raised, if a file is missing either after the
-% export with \app{Inkscape} or in general.
-% \begin{macrocode}
-\newcommand*\svg@file@missing[3][]{%
- \begingroup%
- \svg@quotes@remove[{#2}]{\svg@tempa}%
- \svg@filename@parse[{#1}]{\svg@tempa}%
- \IfArgIsEmpty{#1}{%
- \svg@quotes@remove[{#3}]{\svg@tempb}%
- \def\svg@tempa{%
- Did you run the export with Inkscape? There's no file\MessageBreak%
- `\filename@area\filename@base.\filename@ext'\MessageBreak%
- although `\svg@tempb' was found.%
- }%
- }{%
- \edef\filename@ext{#1}%
- \Ifstr{\filename@area}{./}{\let\filename@area\@empty}{}%
-% \end{macrocode}
-% Collecting all considered path for the error message.
-% \begin{macrocode}
- \edef\svg@tempb{#3}%
- \Ifstr{\svg@tempb}{./}{\let\svg@tempb\@empty}{}%
- \ifx\svg@tempb\@empty%
- \svg@set@input@path%
- \else%
- \svg@set@input@path[\svg@tempb]%
- \fi%
- \ifx\input@path\@undefined%
- \def\svg@tempb{No additional path was given.}%
- \else%
- \def\svg@tempb{Following folders have additionally been searched:}%
- \expandafter\@tfor\expandafter\svg@tempa\expandafter:\expandafter=%
- \input@path\do{%
- \edef\svg@tempb{\svg@tempb\noexpand\MessageBreak\svg@tempa}%
- }%
- \fi%
-% \end{macrocode}
-% The error message itself.
-% \begin{macrocode}
- \def\svg@tempa{%
- There's no file `\filename@base.\filename@ext'\MessageBreak%
- \ifx\filename@area\@empty%
- neither in the current directory nor any other searched\MessageBreak%
- path given by \string\svgpath\space or \string\graphicspath.%
- \MessageBreak\svg@tempb%
- \else%
- in folder `\filename@area'.%
- \fi%
- }%
- }%
- \PackageError{svg}{%
- File `\filename@base.\filename@ext' is missing%
- }{\svg@tempa}%
- \endgroup%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@file@missing
-% \begin{macro}{\svg@iffilenewer}
-% \changes{v2.02d}{2019/10/22}{%
-% use \cs{filemoddate} with Xe\LaTeX, see
-% \url{https://github.com/mrpiggi/svg/issues/12}
-% }^^A
-% The macro \cs{svg@iffilenewer} is used to decide, whether the export with
-% \app{Inkscape} is necessary due to an updated SVG~file. This can only be
-% done, if \cs{pdf@filemoddate} or \cs{filemoddate} is definied.
-% \begin{macrocode}
-\newcommand*\svg@iffilenewer[2]{\@gobbletwo}
-\ifx\pdf@filemoddate\@undefined
- \ifx\filemoddate\@undefined\else
- \ifx\strcmp\@undefined\else
- \renewcommand*\svg@iffilenewer[2]{%
- \begingroup%
- \edef\svg@tempa{\filemoddate{#1}}%
- \edef\svg@tempb{\filemoddate{#2}}%
- \ifnum\strcmp{\svg@tempa}{\svg@tempb}>\z@\relax%
- \aftergroup\@firstoftwo%
- \else%
- \aftergroup\@secondoftwo%
- \fi%
- \endgroup%
- }%
- \fi
- \fi
-\else
- \ifx\pdf@strcmp\@undefined\else
- \renewcommand*\svg@iffilenewer[2]{%
- \begingroup%
- \edef\svg@tempa{\pdf@filemoddate{#1}}%
- \edef\svg@tempb{\pdf@filemoddate{#2}}%
- \ifnum\pdf@strcmp{\svg@tempa}{\svg@tempb}>\z@\relax%
- \aftergroup\@firstoftwo%
- \else%
- \aftergroup\@secondoftwo%
- \fi%
- \endgroup%
- }%
- \fi
-\fi
-% \end{macrocode}
-% \end{macro}^^A \svg@iffilenewer
-%
-% \subsection{Optional Parameters for user commands}
-%
+% \begin{macro}{\svg@local@param@def}
+% \begin{macro}{\svg@local@param@use}
% \begin{macro}{\svg@local@param@set}
% \changes{v2.02}{2018/09/07}{reasonable value for key \opt{distort}}^^A
-% \begin{macro}{\svg@local@param@use}
-% \begin{macro}{\svg@local@param@def}
% Most of the package options can also be used as optional parameters for
% \cs{includesvg} or \cs{includeinkscape}. Some of them are overloaded for the
% usage as optional argument and there are some keys, which \emph{only} can be
@@ -2553,6 +2660,12 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \cs{svg@local@param@use} is extended with \cs{svg@local@param@def} by the
% definition of local keys during the loading of package \pkg{svg}.
% \begin{macrocode}
+\newcommand*\svg@local@param@use{}
+\newcommand*\svg@local@param@def[1]{%
+ \edef\svg@local@param@use{%
+ \unexpanded\expandafter{\svg@local@param@use}\unexpanded{#1}%
+ }%
+}
\newcommand*\svg@local@param@set[1]{%
\svg@local@param@use%
\FamilyOptions{SVG}{#1}%
@@ -2566,52 +2679,59 @@ svg-extract -- Extract independent graphic files from SVG pictures
% Using \opt{distort=true} is only reasonable, if \opt{height} and \opt{width}
% are given.
% \begin{macrocode}
- \@svg@tempswafalse%
+ \@svg@tempswatrue%
\ifdim\svg@param@width>\z@\relax\ifdim\svg@param@height>\z@\relax%
- \@svg@tempswatrue%
+ \@svg@tempswafalse%
\fi\fi%
- \if@svg@tempswa\else%
- \FamilyOptions{SVG}{distort=false}%
+ \if@svg@tempswa%
+ \FamilyExecuteOptions[.svg.sty]{SVG}{distort=false}%
\fi%
}
-\newcommand*\svg@local@param@use{}
-\newcommand*\svg@local@param@def[1]{%
- \edef\svg@local@param@use{%
- \unexpanded\expandafter{\svg@local@param@use}\unexpanded{#1}%
- }%
-}
% \end{macrocode}
-% \end{macro}^^A \svg@local@param@def
-% \end{macro}^^A \svg@local@param@use
% \end{macro}^^A \svg@local@param@set
-%
-% \iffalse
-%</body>
-%</package&base>
-% \fi
-%
-% The family member is defined for both \pkg{svg} and \pkg{svg-extract}.
+% \end{macro}^^A \svg@local@param@use
+% \end{macro}^^A \svg@local@param@def
+% \begin{macro}{\svg@deprecated@param}
+% This macro checks, if \cs{svgwidth} or \cs{svgscale} are defined. In this
+% case, the given values are passed to the correlating parameters and a warning
+% is raised.
% \begin{macrocode}
-%<*body>
-\DefineFamilyMember[.param]{SVG}
-%</body>
+\newcommand*\svg@deprecated@param{%
+ \@svg@tempswafalse%
+ \ifx\svgwidth\@undefined\else%
+ \edef\svg@tempa{\noexpand\FamilyOptions{SVG}{width=\svgwidth}}%
+ \svg@tempa%
+ \@svg@tempswatrue%
+ \fi%
+ \ifx\svgscale\@undefined\else%
+ \edef\svg@tempa{\noexpand\FamilyOptions{SVG}{scale=\svgscale}}%
+ \svg@tempa%
+ \@svg@tempswatrue%
+ \fi%
+ \if@svg@tempswa%
+ \PackageWarning{svg}{%
+ You should specify the image size with parameters\MessageBreak%
+ `width' and `height' or `scale' instead of using\MessageBreak%
+ `\string\svgscale' or `\string\svgwidth'%
+ }%
+ \let\svgwidth\@undefined%
+ \let\svgscale\@undefined%
+ \fi%
+}
% \end{macrocode}
+% \end{macro}^^A \svg@deprecated@param
%
%
-% \iffalse
-%<*package&base>
-%<*body>
-% \fi
%
-% \subsection{User commands}
+% \subsubsection{Definition of user commands}
%
% \begin{macro}{\svgsetup}
% \changes{v2.00}{2017/02/17}{new}^^A
% \begin{macro}{\setsvg}
% \changes{v2.00}{2017/02/17}{deprecated}^^A
-% The macro \cs{svgsetup} can be used to change options after loading the
-% package \pkg{svg} both in preamble and the document body. For compatibility
-% reasons, \cs{setsvg} is also defined.
+% The macro \cs{svgsetup}\marg{options} can be used to change options after
+% loading packages \pkg{svg} or \pkg{svg-extract} both in preamble and the
+% document body. For compatibility reasons, \cs{setsvg} is also defined.
% \begin{macrocode}
\newcommand*\svgsetup{\FamilyOptions{SVG}}
\newcommand*\setsvg{\FamilyOptions{SVG}}
@@ -2620,9 +2740,8 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \end{macro}^^A \svgsetup
% \begin{macro}{\svgpath}
% \changes{v2.00}{2017/02/12}{new}^^A
-% \changes{v2.02}{2018/09/07}{%
-% parse argument for enclosing braces and provide if necessary%
-% }^^A
+% \changes{v2.02}{2018/09/07}{parse argument for enclosing braces and provide
+% those if necessary}^^A
% \begin{macro}{\svg@input@path}
% With \cs{svgpath} the user can give several root paths to SVG~files in the
% same way as \cs{graphicspath} is used. The only difference is that a missing
@@ -2761,12 +2880,13 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \changes{v2.02}{2018/09/07}{validation of argument}^^A
% \begin{parameter}{origin}
% \changes{v2.00}{2017/02/17}{new}^^A
-% The parameters \prm{angle} and \prm{origin} are definied as pendants to the
+% The parameters \prm{angle} and \prm{origin} are defined as pendants to the
% keys provided by \cs{includegraphics}.
% \begin{macrocode}
\newcommand*\svg@param@angle{0}
\svg@local@param@def{%
\DefineFamilyKey[.param]{SVG}{angle}{%
+ \FamilyKeyStateUnknownValue%
\Ifisdimension{#1\p@}{%
\renewcommand*\svg@param@angle{#1}%
\FamilyKeyStateProcessed%
@@ -2915,35 +3035,6 @@ svg-extract -- Extract independent graphic files from SVG pictures
%
% \subsection{Auxiliary macros}
%
-% \begin{macro}{\svg@deprecated@param}
-% This macro checks, if \cs{svgwidth} or \cs{svgscale} are defined. In this
-% case, the given values are passed to the correlating parameters and a warning
-% is raised.
-% \begin{macrocode}
-\newcommand*\svg@deprecated@param{%
- \@svg@tempswafalse%
- \ifx\svgwidth\@undefined\else%
- \edef\svg@tempa{\noexpand\FamilyOptions{SVG}{width=\svgwidth}}%
- \svg@tempa%
- \@svg@tempswatrue%
- \fi%
- \ifx\svgscale\@undefined\else%
- \edef\svg@tempa{\noexpand\FamilyOptions{SVG}{scale=\svgscale}}%
- \svg@tempa%
- \@svg@tempswatrue%
- \fi%
- \if@svg@tempswa%
- \PackageWarning{svg}{%
- You should specify the image size with parameters\MessageBreak%
- `width' and `height' or `scale' instead of using\MessageBreak%
- `\string\svgscale' or `\string\svgwidth'%
- }%
- \let\svgwidth\@undefined%
- \let\svgscale\@undefined%
- \fi%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@deprecated@param
% \begin{macro}{\svg@ink@run}
% \begin{macro}{\if@svg@ink@run}
% The command, which performs the call of \app{Inkscape} via \cs{ShellEscape}.
@@ -2994,12 +3085,12 @@ svg-extract -- Extract independent graphic files from SVG pictures
\fi%
% \end{macrocode}
% If all checks were positive, the export with \app{Inkscape} can be done in
-% case \file{-{}-shell-escape} is enabled.
+% case flag \file{-{}-shell-escape} is used.
% \begin{macrocode}
\if@svg@ink@run%
\ifnum\pdf@shellescape=\@ne\relax%
% \end{macrocode}
-% For exporting PNG~files, the used density ist set to \val{300dpi}, if no
+% For exporting PNG~files, the used density is set to \val{300dpi}, if no
% value was given.
% \begin{macrocode}
\ifx\svg@ink@dpi\relax%
@@ -3014,21 +3105,32 @@ svg-extract -- Extract independent graphic files from SVG pictures
\fi%
}%
% \end{macrocode}
-% Executing \app{Inkscape} on command line. Afterwards, the export results are
-% moved into the given output path.
+% Executing \app{Inkscape} on shell. Afterwards, the export results are moved
+% into the given output path.
% \begin{macrocode}
\svg@quotes@remove[\svg@file@base]{\svg@tempa}%
\svg@quotes@remove[\svg@out@name]{\svg@tempb}%
+% \end{macrocode}
+% The last try to detect the version automatically, if this wasn't successful
+% until now.
+% \begin{macrocode}
+ \ifnum\svg@ink@ver=\m@ne\relax%
+ \svg@ink@ver@explore{\svg@tempa}{\svg@tempb}{\svg@out@name}%
+ \fi%
+% \end{macrocode}
+% Now it's time to actually create the desired graphic.
+% \begin{macrocode}
\ShellEscape{\svg@ink@cmd{\svg@tempa}{\svg@tempb}}%
\IfFileExists{\svg@out@name.\svg@ink@format}{%
\edef\svg@tempb{\svg@tempb.\svg@ink@format}%
\svg@quotes@remove{\svg@out@base}%
\svg@shell@mkdir{\svg@out@path}%
- \svg@shell@move{\svg@tempb}{\svg@out@base}%
+ \svg@shell@mv{\svg@tempb}{\svg@out@base}%
\if@svg@ink@latex%
- \svg@shell@move{\svg@tempb_tex}{\svg@out@base_tex}%
+ \svg@shell@mv{\svg@tempb_tex}{\svg@out@base_tex}%
\fi%
}{%
+ \gdef\svg@ink@ver{\m@ne}%
\PackageWarning{svg}{%
The export with Inkscape failed for file\MessageBreak%
`\svg@tempa.\svg@file@ext'\MessageBreak%
@@ -3055,150 +3157,45 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \end{macrocode}
% \end{macro}^^A \if@svg@ink@run
% \end{macro}^^A \svg@ink@run
-% \begin{macro}{\svg@ink@cmd}
-% The actual call of \app{Inkscape} at command line.
-% \begin{macrocode}
-\newcommand*\svg@ink@cmd[2]{%
- \svg@ink@exe\space-z\space\svg@ink@area\space%
- \ifx\svg@ink@dpi\relax\else--export-dpi=\svg@ink@dpi\space\fi%
- \if@svg@ink@latex--export-latex\space\fi%
- \svg@ink@opt\space%
- --file="#1.\svg@file@ext"\space%
- --export-\svg@ink@format="#2.\svg@ink@format"\space%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@ink@cmd
-% \begin{macro}{\svg@get@lastpage}
-% This macro is used to circumvent the multiple pages bug for PDF~files of
-% \app{Inkscape}~0.91, when the the \LaTeX~export was enabled. For this
-% purpose, the total page number is read from the PDF~file.
-% \begin{macrocode}
-\newcommand*\svg@get@lastpage[1]{%
- \Ifstr{\svg@ink@format}{pdf}{%
- \begingroup%
- \@tempcnta=\m@ne\relax%
- \ifx\XeTeXpdfpagecount\@undefined%
- \ifpdf%
- \ifx\pdfximage\@undefined%
- \ifx\saveimageresource\@undefined\else%
- \saveimageresource{#1}%
- \@tempcnta=\lastsavedimageresourcepages\relax%
- \fi%
- \else%
- \pdfximage{#1}%
- \@tempcnta=\pdflastximagepages\relax%
- \fi%
- \fi%
- \else%
- \@tempcnta=\XeTeXpdfpagecount#1\relax%
- \fi%
- \ifnum\@tempcnta=\m@ne\relax%
- \PackageWarning{svg}{%
- It wasn't possible to detect the last page\MessageBreak%
- of `#1'%
- }%
- \else%
- \PackageInfo{svg}{Last page of `#1' is \the\@tempcnta}%
- \fi%
- \edef\svg@tempa{%
- \endgroup%
- \noexpand\FamilyOptions{SVG}{lastpage=\the\@tempcnta}%
- }%
- \svg@tempa%
- }{}%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@get@lastpage
-% \begin{macro}{\svg@wrn@scale}
-% The option \opt{scale} respectively the parameter \prm{scale} is only
-% considered if the size was not specified.
-% \begin{macrocode}
-\newcommand*\svg@wrn@scale{%
- \ifdim\dimexpr\svg@param@scale\p@\relax=\p@\relax\else%
- \@svg@tempswafalse%
- \ifdim\svg@param@width>\z@\relax%
- \@svg@tempswatrue%
- \fi%
- \ifdim\svg@param@height>\z@\relax%
- \@svg@tempswatrue%
- \fi%
- \if@svg@tempswa%
- \PackageWarning{svg}{%
- The parameter `scale' is only considered if neither\MessageBreak%
- `width' nor `height' are specified%
- }%
- \fi%
- \fi%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@wrn@scale
% \begin{macro}{\svg@input}
% \begin{macro}{\svg@@input}
+% \changes{v2.02g}{2020/06/12}{parsing of file extension discarded; meanwhile
+% taken over by the kernel}^^A
+% \begin{macro}{\svg@box}
% With \cs{svg@@input} the export results of \app{Inkscape} are included. The
% macro \cs{svg@input} is defined in order to realize the option \opt{exclude}
% for package \pkg{svg-extract}. The macro \cs{svg@set@input@path} is called to
% support commands like \cs{input}\marg{tex filename} within SVG~files.
% \begin{macrocode}
+\newsavebox\svg@box
\newcommand*\svg@input{\svg@@input}
\newcommand*\svg@@input[2][]{%
\IfArgIsEmpty{#1}{}{\svg@local@param@set{#1}}%
\svg@set@input@path%
- \if@svg@draft%
- \@svg@ink@latexfalse%
- \fi%
-% \end{macrocode}
-% In order to support file names with multiple dots, the second argument is
-% parsed and only the part after the last dot is stroed in \cs{svg@tempb} as
-% extension. Everything before is stored in \cs{svg@tempa}.
-% \begin{macrocode}
- \def\svg@tempb##1.##2\@nil{%
- \IfArgIsEmpty{##2}{%
- \def\svg@tempb{##1}%
- }{%
- \edef\svg@tempa{\svg@tempa.##1}%
- \svg@tempb##2\@nil%
- }%
- }%
- \edef\svg@tempa{%
- \def\noexpand\svg@tempa{}%
- \noexpand\svg@tempb#2.\noexpand\@nil%
- }%
- \svg@tempa%
-% \end{macrocode}
-% Afterwards \cs{svg@tempa} is defined with the file name within enclosing
-% braces followed by the extension---only if the file name itself contains any
-% dots--- and \cs{svg@tempb} holds the original file name plus extension
-% without enclosing braces.
-% \begin{macrocode}
- \svg@remove@leadingchar.\svg@tempa%
- \begingroup%
- \expandafter\filename@parse\expandafter{\svg@tempa}%
- \edef\svg@tempa{%
- \endgroup%
- \ifx\filename@ext\relax%
- \edef\noexpand\svg@tempa{\svg@tempa.\svg@tempb}%
- \else%
- \edef\noexpand\svg@tempa{{\svg@tempa}.\svg@tempb}%
- \fi%
- }%
- \svg@tempa%
- \edef\svg@tempb{#2}%
% \end{macrocode}
% If the export with \app{Inkscape} was done with \LaTeX~support enabled, the
% corresponding file will be used together with \cs{input}. The necessary
% patches to environment \env{picture} as well as command \cs{includegraphics}
% are made beforehand with \cs{svg@patches}.
% \begin{macrocode}
- \if@svg@ink@latex%
+ \@svg@tempswatrue%
+ \if@svg@draft%
+ \@svg@tempswafalse%
+ \fi%
+ \if@svg@ink@latex\else%
+ \@svg@tempswafalse%
+ \fi%
+ \edef\svg@tempa{#2}%
+ \if@svg@tempswa%
\svg@patches{\svg@tempa}%
\ifnum\value{svg@param@lastpage}=\z@\relax%
- \expandafter\svg@get@lastpage\expandafter{\svg@tempb}%
+ \expandafter\svg@get@lastpage\expandafter{\svg@tempa}%
\fi%
\edef\svg@tempa{%
\ifx\svg@param@pretex\relax\else%
\noexpand\svg@param@pretex%
\fi%
- \noexpand\input{\svg@tempb_tex}%
+ \noexpand\input{\svg@tempa_tex}%
\ifx\svg@param@apptex\relax\else%
\noexpand\svg@param@apptex%
\fi%
@@ -3249,23 +3246,489 @@ svg-extract -- Extract independent graphic files from SVG pictures
\fi%
}
% \end{macrocode}
+% \end{macro}^^A \svg@box
% \end{macro}^^A \svg@@input
% \end{macro}^^A \svg@input
+% \begin{macro}{\svg@wrn@scale}
+% The option \opt{scale} respectively the parameter \prm{scale} is only
+% considered if the size was not specified.
+% \begin{macrocode}
+\newcommand*\svg@wrn@scale{%
+ \ifdim\dimexpr\svg@param@scale\p@\relax=\p@\relax\else%
+ \@svg@tempswafalse%
+ \ifdim\svg@param@width>\z@\relax%
+ \@svg@tempswatrue%
+ \fi%
+ \ifdim\svg@param@height>\z@\relax%
+ \@svg@tempswatrue%
+ \fi%
+ \if@svg@tempswa%
+ \PackageWarning{svg}{%
+ The parameter `scale' is only considered if neither\MessageBreak%
+ `width' nor `height' are specified%
+ }%
+ \fi%
+ \fi%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@wrn@scale
+% \begin{macro}{\svg@get@lastpage}
+% This macro is used to circumvent the multiple pages bug for PDF~files of
+% \app{Inkscape}\,0.91, when the the \LaTeX~export was enabled. For this
+% purpose, the total page number is read from the PDF~file.
+% \begin{macrocode}
+\newcommand*\svg@get@lastpage[1]{%
+ \Ifstr{\svg@ink@format}{pdf}{%
+ \begingroup%
+ \@tempcnta=\m@ne\relax%
+ \ifx\XeTeXpdfpagecount\@undefined%
+ \ifpdf%
+ \ifx\pdfximage\@undefined%
+ \ifx\saveimageresource\@undefined\else%
+ \saveimageresource{#1}%
+ \@tempcnta=\lastsavedimageresourcepages\relax%
+ \fi%
+ \else%
+ \pdfximage{#1}%
+ \@tempcnta=\pdflastximagepages\relax%
+ \fi%
+ \fi%
+ \else%
+ \@tempcnta=\XeTeXpdfpagecount#1\relax%
+ \fi%
+ \ifnum\@tempcnta=\m@ne\relax%
+ \PackageWarning{svg}{%
+ It wasn't possible to detect the last page\MessageBreak%
+ of `#1'%
+ }%
+ \else%
+ \PackageInfo{svg}{Last page of `#1' is \the\@tempcnta}%
+ \fi%
+ \edef\svg@tempa{%
+ \endgroup%
+ \noexpand\FamilyOptions{SVG}{lastpage=\the\@tempcnta}%
+ }%
+ \svg@tempa%
+ }{}%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@get@lastpage
+% \begin{macro}{\svg@file@missing}
+% \changes{v2.02}{2018/09/07}{notify svg file when missing exported files}^^A
+% The error message, which is raised, if a file is missing either after the
+% export with \app{Inkscape} or in general.
+% \begin{macrocode}
+\newcommand*\svg@file@missing[3][]{%
+ \begingroup%
+ \svg@quotes@remove[{#2}]{\svg@tempa}%
+ \svg@filename@parse[{#1}]{\svg@tempa}%
+ \IfArgIsEmpty{#1}{%
+ \svg@quotes@remove[{#3}]{\svg@tempb}%
+ \def\svg@tempa{%
+ Did you run the export with Inkscape? There's no file\MessageBreak%
+ `\filename@area\filename@base.\filename@ext'\MessageBreak%
+ although `\svg@tempb' was found.%
+ }%
+ }{%
+ \edef\filename@ext{#1}%
+ \Ifstr{\filename@area}{./}{\let\filename@area\@empty}{}%
+% \end{macrocode}
+% Collecting all considered path for the error message.
+% \begin{macrocode}
+ \edef\svg@tempb{#3}%
+ \Ifstr{\svg@tempb}{./}{\let\svg@tempb\@empty}{}%
+ \ifx\svg@tempb\@empty%
+ \svg@set@input@path%
+ \else%
+ \svg@set@input@path[\svg@tempb]%
+ \fi%
+ \ifx\input@path\@undefined%
+ \def\svg@tempb{No additional path was given.}%
+ \else%
+ \def\svg@tempb{Following folders have additionally been searched:}%
+ \expandafter\@tfor\expandafter\svg@tempa\expandafter:\expandafter=%
+ \input@path\do{%
+ \edef\svg@tempb{\svg@tempb\noexpand\MessageBreak\svg@tempa}%
+ }%
+ \fi%
+% \end{macrocode}
+% The error message itself.
+% \begin{macrocode}
+ \def\svg@tempa{%
+ There's no file `\filename@base.\filename@ext'\MessageBreak%
+ \ifx\filename@area\@empty%
+ neither in the current directory nor any other searched\MessageBreak%
+ path given by \string\svgpath\space or \string\graphicspath.%
+ \MessageBreak\svg@tempb%
+ \else%
+ in folder `\filename@area'.%
+ \fi%
+ }%
+ }%
+ \PackageError{svg}{%
+ File `\filename@base.\filename@ext' is missing%
+ }{\svg@tempa}%
+ \endgroup%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@file@missing
+% \begin{macro}{\svg@ink@ver@settings}
+% \changes{v2.02f}{2020/05/06}{new}^^A
+% \begin{macro}{\svg@ink@ver@detect}
+% \changes{v2.02f}{2020/05/06}{new}^^A
+% \begin{macro}{\svg@@ink@ver@detect}
+% \changes{v2.02f}{2020/05/06}{new}^^A
+% \begin{macro}{\if@svg@ink@ver@detect}
+% \changes{v2.02f}{2020/05/06}{new}^^A
+% As the command~line~interface of \app{Inkscape} has changed between versions
+% \val{0.x} and \val{1.x}, option \opt{inkscapeversion}|=|\val{detect} allows
+% to detect the used version of \app{Inkscape} in order to define the calling
+% macro \cs{svg@ink@cmd}. The obtained version is stored in \cs{svg@ink@ver},
+% whereas the following meanings are applied:
+% \begin{description}
+% \item[\val{-1}] version check has not be done or \app{Inkscape} could not
+% be found/executed
+% \item[\val{0}] \app{Inkscape} version \val{0.x} was found
+% \item[\val{1}] \app{Inkscape} version \val{1.x} or later was found
+% \end{description}
+%
+% All necessary information are stored within \cs{svg@ink@ver@settings} as
+% three arguments, whereas the first one is the manually set version, the
+% second is the used \opt{inkscapeexe} for automatic detection and the third
+% one is the detected version itself.
+% \begin{macrocode}
+\newcommand*\svg@ink@ver@settings{{\svg@ink@ver}{\svg@ink@exe}{\m@ne}}
+\newif\if@svg@ink@ver@detect
+% \end{macrocode}
+% In order to run the check for \app{Inkscape} version at the beginning of the
+% document only if needed, changes of both \opt{inkscapeversion}---at this
+% point stored in \cs{svg@ink@ver}--- as well as \opt{inkscapeexe} are detected
+% and are triggering the version check. After evaluating the triggers, the
+% current values set are stored as two tokens in \cs{svg@ink@ver@settings}. If
+% a check has been triggered, the detected version will be evaluated further
+% on and is stored in the third token of \cs{svg@ink@ver@settings}.
+% \begin{macrocode}
+\newcommand*\svg@ink@ver@detect[3]{%
+ \@svg@ink@ver@detectfalse%
+ \ifnum\pdf@shellescape=\@ne\relax%
+ \ifnum\svg@ink@ver=\m@ne\relax%
+% \end{macrocode}
+% If \opt{inkscapeexe} was not changed\dots
+% \begin{macrocode}
+ \svg@sanitize@dq\svg@tempa{#2}%
+ \ifx\svg@tempa\svg@ink@exe%
+% \end{macrocode}
+% \dots then enforce the check after a change of mode to \val{detect}\dots
+% \begin{macrocode}
+ \ifnum#1>\m@ne\relax%
+ \@svg@ink@ver@detecttrue%
+% \end{macrocode}
+% \dots or if detection was never invoked, do so.
+% \begin{macrocode}
+ \else%
+ \ifnum#3=\m@ne\relax%
+ \@svg@ink@ver@detecttrue%
+ \fi%
+ \fi%
+% \end{macrocode}
+% Enforce the check after a change of \opt{inkscapeexe}.
+% \begin{macrocode}
+ \else%
+ \@svg@ink@ver@detecttrue%
+ \fi%
+ \fi%
+ \fi%
+% \end{macrocode}
+% After evaluating the last settings and maybe setting the trigger for version
+% detection, the current settings are stored in the main aux file. The detected
+% version will be expanded during the write to the aux file.
+% \begin{macrocode}
+ \edef\svg@ink@ver@settings{%
+ {\svg@ink@ver}{\svg@ink@exe}{\noexpand\svg@ink@ver}%
+ }%
+% \end{macrocode}
+% Run detection if necessary and store the result in \cs{svg@ink@ver}\dots
+% \begin{macrocode}
+ \if@svg@ink@ver@detect%
+ \svg@@ink@ver@detect%
+ \else%
+% \end{macrocode}
+% \dots or otherwise set previous detected version in automatic mode.
+% \begin{macrocode}
+ \ifnum\svg@ink@ver=\m@ne\relax%
+ \def\svg@ink@ver{#3}%
+ \fi%
+ \fi%
+}
+% \end{macrocode}
+% If the switch \cs{if@svg@ink@ver@detect} was set by \cs{svg@ink@ver@detect}
+% during the evaluation of \cs{svg@ink@settings}, which holds the settings of
+% the last run, this macro is invoked. The call of \app{Inkscape} stored in
+% \cs{svg@ink@exe} is done with \cs{@@input\textbar"'\dots' -V" } in order to
+% read from \val{stdout}.
+% \begin{macrocode}
+\newcommand*\svg@@ink@ver@detect{%
+ \begingroup%
+ \@makeother\|%
+ \@makeother\&%
+ \everyeof{\noexpand}%
+ \svg@quotes@remove{\svg@ink@exe}%
+% \end{macrocode}
+% Keep in mind, that \app{Inkscape} uses |stderr| [sic] to report the used
+% version of Pango, but as MiK\TeX{} has been fixed by now, \pkg{svg} does not
+% have to consider anymore.
+% \begin{macrocode}
+ \edef\svg@tempa{%
+ \edef\noexpand\svg@tempa{\noexpand\@@input|"'\svg@ink@exe' -V " }%
+ }%
+ \svg@tempa%
+ \trim@spaces@in\svg@tempa%
+% \end{macrocode}
+% The found version is stored in \cs{svg@tempa} and parsed afterwards.
+% \begin{macrocode}
+ \long\def\svg@tempb ##1Inkscape ##2.##3\@nil{%
+ \gdef\svg@ink@ver{##2}%
+% \end{macrocode}
+% If no version was detected, a warning is written.
+% \begin{macrocode}
+ \ifnum\svg@ink@ver=\m@ne\relax%
+ \PackageWarning{svg}{%
+ No version of Inkscape was detected by invoking\MessageBreak%
+ `\svg@ink@exe\space-V'\MessageBreak%
+ so the Inkscape export will fail quite sure as the\MessageBreak%
+ command is probably unknown to your OS. You could set\MessageBreak%
+ `inkscapeversion=<version>' manually but this is very\MessageBreak%
+ unlikely to work%
+ }%
+ \fi%
+ }%
+ \expandafter\svg@tempb\svg@tempa Inkscape \m@ne.\@nil%
+ \endgroup%
+}
+% \end{macrocode}
+% Comparing the stored settings from last the last run with current settings.
+% \begin{macrocode}
+\AtBeginDocument{\expandafter\svg@ink@ver@detect\svg@ink@ver@settings}
+% \end{macrocode}
+% Writing \cs{svg@ink@exe} and \cs{svg@ink@ver} to the main aux-file.
+% \begin{macrocode}
+\BeforeClosingMainAux{%
+ \if@filesw%
+ \immediate\write\@mainaux{%
+ \string\gdef\string\svg@ink@ver@settings{\svg@ink@ver@settings}%
+ }%
+ \fi%
+}
+% \end{macrocode}
+% \end{macro}^^A \if@svg@ink@ver@detect
+% \end{macro}^^A \svg@@ink@ver@detect
+% \end{macro}^^A \svg@ink@ver@detect
+% \end{macro}^^A \svg@ink@ver@settings
+% \begin{macro}{\svg@ink@ver@explore}
+% \changes{v2.02j}{2020/10/23}{new}^^A
+% If detecting the used version automatically with \file{inkscape -V} was not
+% successful, it is tried to explore this by calling \app{Inkscape} through its
+% command~line~interface with all known variations. If the desired file was
+% created the used version is stored in \cs{svg@ink@ver}.
+% \begin{macrocode}
+\newcommand*\svg@ink@ver@explore[3]{%
+ \begingroup%
+ \@svg@tempswafalse%
+ \@tfor\svg@ink@ver:={1}{0}\do{%
+ \ShellEscape{\svg@ink@cmd{#1}{#2}}%
+ \IfFileExists{#3.\svg@ink@format}{\@svg@tempswatrue}{}%
+% \end{macrocode}
+% An output file was found, break loop.
+% \begin{macrocode}
+ \if@svg@tempswa%
+ \@break@tfor%
+ \fi%
+ }%
+% \end{macrocode}
+% If even this attempt fails, an error message is shown.
+% \begin{macrocode}
+ \if@svg@tempswa%
+ \xdef\svg@ink@ver{\svg@ink@ver}%
+ \else%
+ \PackageError{svg}{Inkscape version not detected}{%
+ It was tried to invoke `\svg@ink@exe'\MessageBreak%
+ for file "#1.\svg@file@ext"\MessageBreak%
+ but no result was produced. Check the log file\MessageBreak%
+ and set `inkscapeversion=<version>' manually.%
+ }%
+ \fi%
+ \endgroup%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@ink@ver@explore
+%
+%
+% \subsection{Handling path and file names}
+%
+% \begin{macro}{\svg@set@input@path}
+% \changes{v2.01}{2017/11/28}{new}^^A
+% \changes{v2.02}{2018/09/07}{usage of \cs{svg@deactivate@dq}}^^A
+% \begin{macro}{\svg@append@input@path}
+% \changes{v2.01}{2017/11/28}{new}^^A
+% \changes{v2.02}{2018/09/07}{avoid duplicates in \cs{input@path}}^^A
+% In order to import SVG~files from different folders, \cs{svg@set@input@path}
+% evaluates several macros, which are supposed to be used for holding different
+% search folders. Any given path will be handled by \cs{svg@normalize@path}.
+% The optional argument can be used to append an additional search path.
+% \begin{macrocode}
+\newcommand*\svg@set@input@path[1][]{%
+ \begingroup%
+ \svg@deactivate@dq%
+% \end{macrocode}
+% If a path was already found and stored within \cs{svg@file@path}, it is
+% searched first and wrapped in curly braces. This is necessary for using
+% commands like \cs{input}\marg{tex~filename} within SVG~files.
+% \begin{macrocode}
+ \ifx\svg@file@path\@empty\else%
+ \svg@normalize@path{\svg@file@path}%
+ \edef\svg@file@path{{\svg@file@path}}%
+ \fi%
+% \end{macrocode}
+% Afterwards, several search paths are appended. If \cs{svgpath} was used, it
+% is searched next. If nothing was found, \cs{graphicspath} is considered if
+% defined followed by a path given in the third argument. If nothing was found
+% yet, the standard \cs{input@path} is searched last.
+% \begin{macrocode}
+ \svg@append@input@path{\svg@file@path}{\svg@input@path}%
+ \svg@append@input@path{\svg@file@path}{\Ginput@path}%
+ \IfArgIsEmpty{#1}{}{\svg@append@input@path{\svg@file@path}{{#1}}}%
+ \svg@append@input@path{\svg@file@path}{\input@path}%
+% \end{macrocode}
+% Finally, \cs{input@path} is set.
+% \begin{macrocode}
+ \edef\svg@tempa{%
+ \endgroup%
+ \ifx\svg@file@path\@empty\else%
+ \def\noexpand\input@path{\svg@file@path}%
+ \fi%
+ }%
+ \svg@tempa%
+}
+% \end{macrocode}
+% Only, if a certain search path is defined, it is added. The paths given in
+% the first argument are compared to each path in the second argument and only
+% new ones are added.
+% \begin{macrocode}
+\newcommand*\svg@append@input@path[2]{%
+ \ifx#2\@undefined\else%
+ \edef\svg@tempb{#2}%
+ \expandafter\@tfor\expandafter\svg@tempa\expandafter:\expandafter=%
+ \svg@tempb\do{%
+% \end{macrocode}
+% Passing each new path to \cs{svg@normalize@path}. If a path already exists,
+% switch \cs{if@svg@tempswa} is set to \val{false}.
+% \begin{macrocode}
+ \ifx\svg@tempa\@empty\else%
+ \@svg@tempswatrue%
+ \svg@normalize@path{\svg@tempa}%
+ \expandafter\@tfor\expandafter\svg@tempb\expandafter:\expandafter=%
+ #1\do{%
+ \ifx\svg@tempa\svg@tempb%
+ \@svg@tempswafalse%
+ \@break@tfor%
+ \fi%
+ }%
+ \if@svg@tempswa%
+ \edef#1{#1{\svg@tempa}}%
+ \fi%
+ \fi%
+ }%
+ \fi%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@append@input@path
+% \end{macro}^^A \svg@set@input@path
+% \begin{macro}{\svg@get@path}
+% \changes{v2.01}{2017/11/28}{using \cs{svg@set@input@path}}^^A
+% \changes{v2.01}{2017/11/28}{using \cs{trim@spaces}}^^A
+% \begin{macro}{\if@svg@file@found}
+% \begin{macro}{\svg@file@path}
+% \begin{macro}{\svg@file@name}
+% \begin{macro}{\svg@file@base}
+% \begin{macro}{\svg@file@suffix}
+% The command \cs{svg@get@path} tries to find a given SVG~file. If the
+% searched file wasn't found in the current path, all paths given with
+% \cs{svgpath} are evaluated. If there was no appropriate file again, all paths
+% given by \cs{graphicspath} are examined. In the last step, a given path
+% within the second mandatory argument is browsed. The results for file path
+% and name are stored in \cs{svg@file@path} and \cs{svg@file@name} as well as
+% the compound of both is saved in \cs{svg@file@base}.
+% \begin{macrocode}
+\newif\if@svg@file@found
+\newcommand*\svg@file@path{}
+\newcommand*\svg@file@name{}
+\newcommand*\svg@file@base{}
+\newcommand*\svg@file@suffix{}
+\newcommand*\svg@get@path[3][\svg@file@ext]{%
+ \begingroup%
+ \svg@filename@parse[{#1}]{#2}%
+ \IfArgIsEmpty{#1}{%
+ \edef\svg@tempa{\filename@area\filename@base.\filename@ext}%
+ }{%
+ \edef\svg@tempa{\filename@area\filename@base.#1}%
+ }%
+% \end{macrocode}
+% After calling \cs{svg@set@input@path}, all search paths are stored in
+% \cs{input@path}, a single path given in the third argument will also be
+% considered.
+% \begin{macrocode}
+ \svg@set@input@path[{#3}]%
+% \end{macrocode}
+% The specified file is searched with \cs{IfFileExists}. If the file search was
+% successful, the macro \cs{svg@filename@parse} is called with the result.
+% \begin{macrocode}
+ \@svg@tempswafalse%
+ \expandafter\IfFileExists\expandafter{\svg@tempa}{%
+ \expandafter\svg@quotes@check\expandafter{\svg@tempa}%
+ \if@svg@quotes@found\else%
+ \svg@quotes@remove{\@filef@und}%
+ \fi%
+ \@svg@tempswatrue%
+ \edef\@filef@und{\expandafter\trim@spaces\expandafter{\@filef@und}}%
+ \svg@filename@parse[{#1}]{\@filef@und}%
+ }{}%
+ \edef\svg@tempa{%
+ \endgroup%
+ \if@svg@tempswa%
+ \noexpand\@svg@file@foundtrue%
+ \def\noexpand\svg@file@path{\filename@area}%
+ \def\noexpand\svg@file@name{\filename@base}%
+ \def\noexpand\svg@file@base{\filename@area\filename@base}%
+ \else%
+ \noexpand\@svg@file@foundfalse%
+ \def\noexpand\svg@file@path{}%
+ \def\noexpand\svg@file@name{#2}%
+ \def\noexpand\svg@file@base{#2}%
+ \fi%
+ }%
+ \svg@tempa%
+}
+% \end{macrocode}
+% \end{macro}^^A \svg@file@suffix
+% \end{macro}^^A \svg@file@base
+% \end{macro}^^A \svg@file@name
+% \end{macro}^^A \svg@file@path
+% \end{macro}^^A \if@svg@file@found
+% \end{macro}^^A \svg@get@path
%
%
%
% \subsection{Patches}
%
% \begin{macro}{\svg@patches}
-% \changes{v2.02b}{2018/11/12}{%
-% fix bug for package \pkg{tikzscale}: store original definitions of
-% \cs{picture} and \cs{includegraphics} right after loading package \pkg{svg}
-% }^^A
+% \changes{v2.02b}{2018/11/12}{fix bug for package \pkg{tikzscale}: store
+% original definitions of \cs{picture} and \cs{includegraphics} right after
+% loading package \pkg{svg}}^^A
% \begin{macro}{\svg@picture@saved}
% \begin{macro}{\svg@includegraphics@saved}
% For including the export results from \app{Inkscape} with \LaTeX~support
% enabled, there are some patches necessary for environment \env{picture} and
-% \cs{includegraphics}. Those patches are done with \cs{svg@patches}.
+% \cs{includegraphics}. These patches are done with \cs{svg@patches}.
% \begin{macrocode}
\newcommand*\svg@picture@saved{}
\let\svg@picture@saved\picture
@@ -3280,6 +3743,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \end{macro}^^A \svg@includegraphics@saved
% \end{macro}^^A \svg@picture@saved
% \end{macro}^^A \svg@patches
+% \begin{macro}{\svg@picture@patched}
% \begin{macro}{\svg@pictur@patched}
% In order to provide the possibility specify the desired width of a graphic,
% the appropriate \cs{unitlength} is calculated at the beginning of the
@@ -3324,6 +3788,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
}
% \end{macrocode}
% \end{macro}^^A \svg@pictur@patched
+% \end{macro}^^A \svg@picture@patched
% \begin{macro}{\svg@includegraphics@patched}
% \begin{macro}{\svg@includegraphics@file}
% The patch to \cs{includegraphics} is meant to dissolve the \app{Inkscape} bug
@@ -3371,7 +3836,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
%
% \iffalse
%</body>
-%</package&base>
+%</package&main>
%<*package&option>
% \fi
%
@@ -3380,16 +3845,16 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \section{Extracting independent graphic files with \pkg{svg-extract}}
% \subsection{Options}
%
-% For package \pkg{svg-extract} the user interface is extended. The following
-% options can either be set with \cs{svgsetup} or be used as local optional
-% parameters for \cs{includesvg} and \cs{includeinkscape}.
+% For package \pkg{svg-extract} the user\hbox{-}interface of package \pkg{svg}
+% is extended. The following options can either be set with \cs{svgsetup} or be
+% used as optional parameters for \cs{includesvg} and \cs{includeinkscape}.
%
% \begin{macro}{\svg@dummy@key}
% If package \pkg{svg-extract} wasn't loaded, the following options are defined
% for package \pkg{svg} in order to raise a warning message. Primarily this is
% done for compatibility reasons.
% \begin{macrocode}
-%<*base>
+%<*main>
\DefineFamilyMember[.dummy]{SVG}
\newcommand*\svg@dummy@key[2][]{%
\@ifpackageloaded{svg-extract}{}{%
@@ -3419,7 +3884,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
\AfterPackage{svg-extract}{\RelaxFamilyKey[.dummy]{SVG}{#2}}%
}%
}
-%</base>
+%</main>
% \end{macrocode}
% \end{macro}^^A \svg@dummy@key
%
@@ -3433,9 +3898,9 @@ svg-extract -- Extract independent graphic files from SVG pictures
% With option \opt{extract} it can be controlled, if the extraction of
% independent graphic files should be done.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key[true]{extract}
-%</base>
+%</main>
%<*extract>
\newif\if@svgx@run
\DefineFamilyKey{SVG}{extract}[true]{%
@@ -3489,11 +3954,11 @@ svg-extract -- Extract independent graphic files from SVG pictures
% is set to \val{pdf} or, if dvi output could be detected, to \val{eps} during
% initialization.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key{extractformat}
\svg@dummy@key[true]{pdf}
\svg@dummy@key[true]{eps}
-%</base>
+%</main>
%<*extract>
\newcommand*\svgx@format{pdf}
\ifxetex\else\ifpdf\else
@@ -3549,12 +4014,12 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \LaTeX~file. By default, the preamble of the main document is used, which end
% is detected at \cs{begin}|{document}|.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key{extractpreamble}
\svg@dummy@key{preamble}
\svg@dummy@key{extractpreambleend}
\svg@dummy@key{end}
-%</base>
+%</main>
%<*extract>
\newcommand*\svgx@preamble{\jobname.\svgx@latex@ext}%
\DefineFamilyKey{SVG}{extractpreamble}{%
@@ -3589,9 +4054,9 @@ svg-extract -- Extract independent graphic files from SVG pictures
% With this option, the number of \LaTeX~runs for the separate auxiliary file
% can be set.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key{extractruns}
-%</base>
+%</main>
%<*extract>
\newcounter{svgx@runs}
\DefineFamilyKey{SVG}{extractruns}{%
@@ -3621,14 +4086,14 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \changes{v2.00}{2017/02/24}{new}^^A
% \begin{macro}{\svgx@latex@opt}
% The command and facultative options for the \LaTeX~call of the separate
-% auxiliary file. The default is set according to the currently used compiler.
+% auxiliary file. The default is set according to the currently used engine.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key{latexexe}
\svg@dummy@key{pdflatex}
\svg@dummy@key{latexext}
\svg@dummy@key{latexopt}
-%</base>
+%</main>
%<*extract>
\ifxetex
\newcommand*\svgx@latex@exe{xelatex}
@@ -3692,18 +4157,18 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \begin{option}{pdftops}
% \changes{v2.00}{2017/02/24}{deprecated}^^A
% Options and macros for calling convert commands, which are supplied by most
-% \LaTeXe~distributions. These are used to generate all files, which are
+% \LaTeX~distributions. These are used to generate all files, which are
% supported by option \opt{extractformat}, as they don't need an additional
% application.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key{dvipsopt}
\svg@dummy@key{pstoepsopt}
\svg@dummy@key{pstopdfopt}
\svg@dummy@key{pdftoepsopt}
\svg@dummy@key{pdftopsopt}
\svg@dummy@key{pdftops}
-%</base>
+%</main>
%<*extract>
\newcommand*\svgx@dvips@exe{dvips}
\newcommand*\svgx@dvips@opt{}
@@ -3736,8 +4201,8 @@ svg-extract -- Extract independent graphic files from SVG pictures
\FamilyKeyStateProcessed%
}
\DefineFamilyKey{SVG}{pdftops}{%
- \PackageWarning{#1}{%
- The option key `pdftops' is deprecated.\MessageBreak%
+ \PackageWarning{svg-extract}{%
+ The option key `pdftops' is deprecated. \MessageBreak%
You should use either `pdftoepsopt' or\MessageBreak%
`pdftopsopt' instead. See the manual for\MessageBreak%
more. Nothing was done%
@@ -3767,8 +4232,9 @@ svg-extract -- Extract independent graphic files from SVG pictures
%
% \subsubsection{Invoking external application for graphic conversion}
%
-% Besides the use of a conversion tool supplied by \LaTeXe, the applications
-% \app{ImageMagick} and \app{Ghostscript} can be used for converting graphics.
+% Besides the use of a conversion tool supplied by the \LaTeX~distribution,
+% the applications \app{ImageMagick} and \app{Ghostscript} can be used for
+% converting graphics.
%
% \begin{option}{convert}
% \changes{v2.00}{2017/02/24}{changed/extended}^^A
@@ -3777,9 +4243,9 @@ svg-extract -- Extract independent graphic files from SVG pictures
% The option \opt{convert} can be used to define, which of both applications
% should be use. \app{ImageMagick} is set by default.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key[true]{convert}
-%</base>
+%</main>
%<*extract>
\newif\if@svgx@cnv@run
\newcommand*\svgx@cnv@cmd{}
@@ -3807,24 +4273,24 @@ svg-extract -- Extract independent graphic files from SVG pictures
\or% gs64
\@svgx@cnv@runtrue%
\renewcommand*\svgx@cnv@cmd{\svgx@gs@cmd}%
- \svgx@onlywindows{%
+ \svg@ifwindowsdetected{%
\renewcommand*\svgx@gs@exe{gswin64c}%
- }%
+ }{}%
\or% gs32
\@svgx@cnv@runtrue%
\renewcommand*\svgx@cnv@cmd{\svgx@gs@cmd}%
- \svgx@onlywindows{%
+ \svg@ifwindowsdetected{%
\renewcommand*\svgx@gs@exe{gswin32c}%
- }%
+ }{}%
\fi%
% \end{macrocode}
% In version~v1.0 the option \opt{convert} was used to set both the executable
% and options for the conversion application, meant for the usage of
% \app{ImageMagick}. This is taken into account here.
% \begin{macrocode}
- \else%
+ \else% legacy option
% \end{macrocode}
-% Same doing like with option \opt{inkscape}.
+% Same doing like with legacy part of option \opt{inkscape}.
% \begin{macrocode}
\def\svg@tempa##1-##2\@nil{%
\IfArgIsEmpty{##2}{\def\svg@tempb{}}{%
@@ -3873,10 +4339,10 @@ svg-extract -- Extract independent graphic files from SVG pictures
% Option \opt{convertformat} controls the output format for converted files. It
% is set to \val{png} by default.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key{convertformat}
\svg@dummy@key[true]{png}
-%</base>
+%</main>
%<*extract>
\newcommand*\svgx@cnv@format{png}
\DefineFamilyKey{SVG}{convertformat}{%
@@ -3908,18 +4374,19 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \changes{v2.00}{2017/02/24}{new}^^A
% \begin{option}{convertdensity}
% \begin{macro}{\svgx@cnv@dpi}
+% \begin{macro}{\svgx@cnv@get@dpi}
% The option \opt{convertdpi} is meant to define the used density during the
% conversion process. It can be set either for all designated output formats or
% targeted for a specific format. It's also possible to use something like
% \val{500x300}. Given values are resolved by \cs{svgx@cnv@get@dpi}. It's used
% like \opt{convertdpi}|=|\val{300} or \opt{convertdpi}|=|\val{\{png=600\}} If
-% the option is used for a specific or for all output formats is recocnized by
+% the option is used for a specific or for all output formats is recognized by
% \cs{svgx@ifkeyandval}.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key{convertdpi}
\svg@dummy@key{convertdensity}
-%</base>
+%</main>
%<*extract>
\newcommand*\svgx@cnv@dpi{}
\let\svgx@cnv@dpi\relax
@@ -3940,11 +4407,151 @@ svg-extract -- Extract independent graphic files from SVG pictures
}%
}
\DefineFamilyKey{SVG}{convertdensity}{\FamilyOptions{SVG}{convertdpi=#1}}
+% \end{macrocode}
+% This macro is used to resolve a given value to set the density for the
+% conversion. The delimited macros \cs{svg@tempa} and \cs{svg@tempb} are
+% defined to first crop any given suffix \val{dpi} and second to split two
+% numbers at |x|, if present. Pay attention how both macros are invoked. In the
+% end, a passed value in any of the forms \val{300}, \val{300dpi}, \val{300x400}
+% or \val{300x400dpi} and even \val{300dpix400dpi} is possible. The result is
+% stored in \cs{svg@tempa}.
+% \begin{macrocode}
+\newcommand*\svgx@cnv@get@dpi[1]{%
+ \begingroup%
+ \def\svg@tempa##1dpi##2x##3dpi##4\@nil{%
+ \edef\svg@tempa{##1}%
+% \end{macrocode}
+% Switch \cs{if@svg@tempswa} as \cs{iftrue} means, a valid value was found.
+% \begin{macrocode}
+ \@svg@tempswafalse%
+% \end{macrocode}
+% If only the first argument is a number and third is empty, a single number
+% was given and there's nothing more to do. If the argument is something like
+% \val{300dpix400dpi}, the third argument is the second number.
+% \begin{macrocode}
+ \Ifnumber{##1}{%
+ \IfArgIsEmpty{##3}{\@svg@tempswatrue}{%
+ \Ifnumber{##3}{\edef\svg@tempa{##1x##3}}{}%
+ }%
+ }{}%
+ \if@svg@tempswa\else%
+ \expandafter\svg@tempb\svg@tempa xx\@nil%
+ \fi%
+ }%
+% \end{macrocode}
+% Macro \cs{svg@tempb} splits at |x| and checks, if something valid like
+% \val{300x400} was given. If true, the value is stored in \cs{svg@tempa}.
+% \begin{macrocode}
+ \def\svg@tempb##1x##2x##3\@nil{%
+ \Ifstr{##3}{x}{%
+ \@svg@tempswatrue%
+ \IfArgIsEmpty{##1}{\@svg@tempswafalse}{%
+ \Ifnumber{##1}{}{\@svg@tempswafalse}%
+ }%
+ \IfArgIsEmpty{##2}{\@svg@tempswafalse}{%
+ \Ifnumber{##2}{}{\@svg@tempswafalse}%
+ }%
+ \if@svg@tempswa%
+ \edef\svg@tempa{##1x##2}%
+ \fi%
+ }{}%
+ }%
+ \IfArgIsEmpty{#1}{%
+ \let\svg@tempa\@empty%
+ }{%
+ \lowercase{\svg@tempa#1dpi#1xdpi\@nil}%
+ \if@svg@tempswa\else%
+ \let\svg@tempa\relax%
+ \fi%
+ }%
+ \edef\svg@tempb{%
+ \endgroup%
+ \ifx\svg@tempa\relax%
+ \let\noexpand\svg@tempa\noexpand\relax%
+ \else%
+ \def\noexpand\svg@tempa{\svg@tempa}%
+ \fi%
+ }%
+ \svg@tempb%
+}
%</extract>
% \end{macrocode}
+% \end{macro}^^A \svgx@cnv@get@dpi
% \end{macro}^^A \svgx@cnv@dpi
% \end{option}^^A convertdensity
% \end{option}^^A convertdpi
+%
+% \iffalse
+%<*extract>
+% \fi
+%
+% \begin{macro}{\svgx@setformatkey}
+% \begin{macro}{\svgx@useformatkey}
+% With \cs{svgx@setformatkey} the---maybe output format depend---keys for the
+% conversion tools are set. First argument contains the value given to a key,
+% second the command sequence name of the macro, to whom the value shall be
+% allocated.
+% \begin{macrocode}
+\newcommand*\svgx@setformatkey[2]{%
+% \end{macrocode}
+% A key of the form \val{\meta{key}=\{\meta{format}=\meta{value}\}} is given.
+% The desired output format can be accessed with |##1|, the value with |##2|
+% within the arguments of \cs{svgx@ifkeyandval}.
+% \begin{macrocode}
+ \svgx@ifkeyandval{#1}{%
+ \svg@ifvalueisrelax{##2}{%
+ \expandafter\let\csname #2@##1\endcsname\relax%
+ }{%
+ \@namedef{#2@##1}{##2}%
+ }%
+% \end{macrocode}
+% A key of the form \val{\meta{key}=\{\meta{format}=\meta{value}\}} is given.
+% The value can be used with |##1|.
+% \begin{macrocode}
+ }{%
+ \svg@ifvalueisrelax{##1}{%
+ \expandafter\let\csname #2\endcsname\relax%
+ }{%
+ \@namedef{#2}{##1}%
+ }%
+ }%
+}
+% \end{macrocode}
+% The command \cs{svgx@useformatkey} checks, if a format specific key was
+% defined with \cs{svgx@setformatkey}, whereas the format is given in the
+% second argument. If this is not the case, the setting for all output formats
+% is used. After that, a specific key appended with a |+| can be used to do
+% some additional stuff.
+% \begin{macrocode}
+\newcommand*\svgx@useformatkey[3]{%
+ \scr@ifundefinedorrelax{#1@#2}{%
+ \scr@ifundefinedorrelax{#1}{}{%
+ \expandafter\ifx\csname #1\endcsname\@empty\else%
+ #3\@nameuse{#1}\space%
+ \fi%
+ }%
+ \scr@ifundefinedorrelax{#1@#2+}{}{%
+ \expandafter\ifx\csname #1@#2+\endcsname\@empty\else%
+ #3\@nameuse{#1@#2+}\space%
+ \fi%
+ }%
+ }{%
+% \end{macrocode}
+% If a format specific key was definded, it is used.
+% \begin{macrocode}
+ \expandafter\ifx\csname #1@#2\endcsname\@empty\else%
+ #3\@nameuse{#1@#2}\space%
+ \fi%
+ }%
+}
+% \end{macrocode}
+% \end{macro}^^A \svgx@useformatkey
+% \end{macro}^^A \svgx@setformatkey
+%
+% \iffalse
+%</extract>
+% \fi
+%
% \begin{option}{magickexe}
% \changes{v2.00}{2017/02/24}{new}^^A
% \begin{macro}{\svgx@magick@exe}
@@ -3954,19 +4561,24 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \begin{option}{magickoperator}
% \changes{v2.00}{2017/02/24}{new}^^A
% \begin{macro}{\svgx@magick@opr}
+% \begin{macro}{\svgx@magick@cmd}
% Setting the command including maybe the path to \app{ImageMagick}. The keys
% \opt{magicksetting} and \opt{magickoperator} should be used to add optional
% arguments before (\emph{Settings}) or after (\emph{Operators}) the input
% file. They can either be set for all or a specific output format as like
% option \opt{convertdpi}. For this \cs{svgx@setformatkey} is used.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key{magickexe}
\svg@dummy@key{magicksetting}
\svg@dummy@key{magickoperator}
-%</base>
+%</main>
%<*extract>
-\newcommand*\svgx@magick@exe{}
+\svg@ifwindowsdetected{%
+ \newcommand*\svgx@magick@exe{magick}%
+}{%
+ \newcommand*\svgx@magick@exe{convert}%
+}
\DefineFamilyKey{SVG}{magickexe}{%
\renewcommand*\svgx@magick@exe{#1}%
\FamilyKeyStateProcessed%
@@ -3981,8 +4593,17 @@ svg-extract -- Extract independent graphic files from SVG pictures
\svgx@setformatkey{#1}{svgx@magick@opr}%
\FamilyKeyStateProcessed%
}
+\newcommand*\svgx@magick@cmd[3]{%
+ \svgx@magick@exe\space%
+ \svgx@useformatkey{svgx@cnv@dpi}{#3}{-density }%
+ \svgx@useformatkey{svgx@magick@set}{#3}{}%
+ "#1.#2"\space%
+ \svgx@useformatkey{svgx@magick@opr}{#3}{}%
+ "#1.#3"%
+}
%</extract>
% \end{macrocode}
+% \end{macro}^^A \svgx@magick@cmd
% \end{macro}^^A \svgx@magick@opr
% \end{option}^^A magickoperator
% \end{macro}^^A \svgx@magick@set
@@ -3998,19 +4619,24 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \begin{option}{gsdevice}
% \changes{v2.00}{2017/02/24}{new}^^A
% \begin{macro}{\svgx@gs@device}
+% \begin{macro}{\svgx@gs@cmd}
% Options to set the command including maybe the path to \app{Ghostscript}. As
% \app{Ghostscript} needs a specific device defined for different output
% formats, the option \opt{gsdevice} can be used. It can either be set for all
% or a specific output format just like \opt{gsopt} in the same manner like
% option \opt{convertdpi}.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key{gsexe}
\svg@dummy@key{gsopt}
\svg@dummy@key{gsdevice}
-%</base>
+%</main>
%<*extract>
-\newcommand*\svgx@gs@exe{}
+\svg@ifwindowsdetected{%
+ \newcommand*\svgx@gs@exe{gswin64c}%
+}{%
+ \newcommand*\svgx@gs@exe{gs}%
+}
\DefineFamilyKey{SVG}{gsexe}{%
\renewcommand*\svgx@gs@exe{#1}%
\FamilyKeyStateProcessed%
@@ -4025,8 +4651,16 @@ svg-extract -- Extract independent graphic files from SVG pictures
\svgx@setformatkey{#1}{svgx@gs@device}%
\FamilyKeyStateProcessed%
}
+\newcommand*\svgx@gs@cmd[3]{%
+ \svgx@gs@exe\space-dSAFER -dBATCH -dNOPAUSE\space%
+ \svgx@useformatkey{svgx@gs@device}{#3}{-sDEVICE=}%
+ \svgx@useformatkey{svgx@cnv@dpi}{#3}{-r}%
+ \svgx@useformatkey{svgx@gs@opt}{#3}{}%
+ -sOutputFile="#1.#3"\space"#1.#2"%
+}
%</extract>
% \end{macrocode}
+% \end{macro}^^A \svgx@gs@cmd
% \end{macro}^^A \svgx@gs@device
% \end{option}^^A gsdevice
% \end{macro}^^A \svgx@gs@opt
@@ -4043,27 +4677,15 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \changes{v2.02}{2018/09/07}{usage of \cs{svg@sanitize@dq}}^^A
% \begin{option}{path}
% \changes{v2.00}{2017/02/24}{deprecated}^^A
-% \begin{option}{extractname}
-% \changes{v2.00}{2017/02/24}{new}^^A
-% \changes{v2.02}{2018/09/07}{usage of \cs{svg@quotes@remove}}^^A
-% \begin{option}{name}
-% \changes{v2.00}{2017/02/24}{deprecated}^^A
-% \changes{v2.00}{2017/02/24}{support of \pkg{subfig} removed}^^A
% \begin{macro}{\svgx@out@path}
-% \begin{macro}{\svgx@out@name}
-% \begin{macro}{\if@svgx@out@sec}
-% \begin{counter}{svgx@out@count}
% The option \opt{extractpath} controls, in which folder the results both of
% the extraction as well as the conversion of \app{ImageMagick} or
-% \app{Ghostscript} will be located. With option \opt{extractname} the
-% name of the extracted and maybe converted file itself can be changed.
+% \app{Ghostscript} will be located.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key{extractpath}
\svg@dummy@key{path}
-\svg@dummy@key{extractname}
-\svg@dummy@key{name}
-%</base>
+%</main>
%<*extract>
\newcommand*\svgx@out@path{}
\DefineFamilyKey{SVG}{extractpath}{%
@@ -4093,9 +4715,33 @@ svg-extract -- Extract independent graphic files from SVG pictures
\DefineFamilyKey{SVG}{path}{%
\svg@deprecated@key[svg-extract]{path=#1}{extractpath=#1}%
}
-\newcounter{svgx@out@count}
+%</extract>
+% \end{macrocode}
+% \end{macro}^^A \svgx@out@path
+% \end{option}^^A path
+% \end{option}^^A extractpath
+% \begin{option}{extractname}
+% \changes{v2.00}{2017/02/24}{new}^^A
+% \changes{v2.02}{2018/09/07}{usage of \cs{svg@quotes@remove}}^^A
+% \begin{option}{name}
+% \changes{v2.00}{2017/02/24}{deprecated}^^A
+% \changes{v2.00}{2017/02/24}{support of \pkg{subfig} removed}^^A
+% \begin{macro}{\svgx@out@name}
+% \begin{macro}{\if@svgx@out@sec}
+% \begin{counter}{svgx@out@count}
+% \begin{macro}{\svgx@out@sec}
+% With option \opt{extractname} the name of the extracted and maybe converted
+% file itself can be changed.
+% \begin{macrocode}
+%<*main>
+\svg@dummy@key{extractname}
+\svg@dummy@key{name}
+%</main>
+%<*extract>
\newcommand*\svgx@out@name{}
\newif\if@svgx@out@sec
+\newcounter{svgx@out@count}
+\newcommand*\svgx@out@sec{unknown}
\DefineFamilyKey{SVG}{extractname}{%
\svg@quotes@remove[{#1}]{\svg@tempb}%
\FamilySetNumerical{SVG}{extractname}{svg@tempa}{%
@@ -4128,14 +4774,12 @@ svg-extract -- Extract independent graphic files from SVG pictures
}
%</extract>
% \end{macrocode}
+% \end{macro}^^A \svgx@out@sec
% \end{counter}^^A svgx@out@count
% \end{macro}^^A \if@svgx@out@sec
% \end{macro}^^A \svgx@out@name
-% \end{macro}^^A \svgx@out@path
% \end{option}^^A name
% \end{option}^^A extractname
-% \end{option}^^A path
-% \end{option}^^A extractpath
%
%
%
@@ -4156,17 +4800,17 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \begin{macro}{\svgx@param@scale}
% For graphic extraction, the given settings regarding the size for inclusion
% can be overwritten with these options. Using \val{\cs{relax}} as value leads
-% to reseting an option as unset, regardless of what was previously given. The
+% to resetting an option as unset, regardless of what was previously given. The
% value \val{inherit} means, that the actual option for including is used for
% extraction as well. This is the default setting.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key{extractwidth}
\svg@dummy@key{extractheight}
\svg@dummy@key{extractdistort}
\svg@dummy@key{extractkeepaspectratio}
\svg@dummy@key{extractscale}
-%</base>
+%</main>
%<*extract>
\newcommand*\svgx@param@width{\svg@param@width}
\DefineFamilyKey{SVG}{extractwidth}{%
@@ -4228,7 +4872,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
\ifx\FamilyKeyState\FamilyKeyStateProcessed%
\if@svg@tempswa%
\FamilyOptions{SVG}{extractdistort=false}%
- \else
+ \else%
\FamilyOptions{SVG}{extractdistort=true}%
\fi%
\else%
@@ -4276,11 +4920,11 @@ svg-extract -- Extract independent graphic files from SVG pictures
% The similar hooks for executing code right before or after the graphic
% extraction.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key{extractpretex}
\svg@dummy@key{extractapptex}
\svg@dummy@key{extractpostex}
-%</base>
+%</main>
%<*extract>
\newcommand*\svgx@param@pretex{\svg@param@pretex}
\DefineFamilyKey{SVG}{extractpretex}{%
@@ -4331,10 +4975,10 @@ svg-extract -- Extract independent graphic files from SVG pictures
% deleted. Setting \val{true} will remove all files, \val{false} won't clear
% any file. Additionally, a specific file list of suffixes can be given.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key[true]{clean}
\svg@dummy@key[true]{clear}
-%</base>
+%</main>
%<*extract>
\newcommand*\svgx@clean{}
\DefineFamilyKey{SVG}{clean}[true]{%
@@ -4350,7 +4994,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
\FamilyKeyStateProcessed%
\fi%
}
-\DefineFamilyKey{SVG}{clear}{\FamilyOptions{SVG}{clean=#1}}
+\DefineFamilyKey{SVG}{clear}[true]{\FamilyOptions{SVG}{clean=#1}}
%</extract>
% \end{macrocode}
% \end{macro}^^A \svgx@clean
@@ -4360,9 +5004,9 @@ svg-extract -- Extract independent graphic files from SVG pictures
% If it is desired not to include but only extract graphics with package
% \pkg{svg-extract}, option \opt{exclude} can be used.
% \begin{macrocode}
-%<*base>
+%<*main>
\svg@dummy@key[true]{exclude}
-%</base>
+%</main>
%<*extract>
\DefineFamilyKey{SVG}{exclude}[true]{%
\FamilySetBool{SVG}{exclude}{@svg@tempswa}{#1}%
@@ -4408,7 +5052,14 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \begin{parameter}{extractpretex}
% \begin{parameter}{extractapptex}
% \begin{parameter}{extractruns}
+% \begin{parameter}{latexexe}
% \begin{parameter}{latexopt}
+% \begin{parameter}{latexext}
+% \begin{parameter}{dvipsopt}
+% \begin{parameter}{pstoepsopt}
+% \begin{parameter}{pstopdfopt}
+% \begin{parameter}{pdftoepsopt}
+% \begin{parameter}{pdftopsopt}
% \begin{parameter}{convert}
% \begin{parameter}{convertformat}
% \begin{parameter}{convertdpi}
@@ -4428,10 +5079,18 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \changes{v2.02}{2018/09/07}{new}^^A
% \begin{parameter}{extractscale}
% \begin{parameter}{extractangle}
+% \changes{v2.02}{2018/09/07}{new}^^A
% \begin{parameter}{extractpretex}
% \begin{parameter}{extractapptex}
% \begin{parameter}{extractruns}
+% \begin{parameter}{latexexe}
% \begin{parameter}{latexopt}
+% \begin{parameter}{latexext}
+% \begin{parameter}{dvipsopt}
+% \begin{parameter}{pstoepsopt}
+% \begin{parameter}{pstopdfopt}
+% \begin{parameter}{pdftoepsopt}
+% \begin{parameter}{pdftopsopt}
% \begin{parameter}{convert}
% \begin{parameter}{convertformat}
% \begin{parameter}{convertdpi}
@@ -4441,7 +5100,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \begin{parameter}{gsdevice}
% \begin{parameter}{clean}
% \begin{parameter}{exclude}
-% The parameters \prm{angle} and \prm{origin} are definied as pendants to the
+% The parameters \prm{angle} and \prm{origin} are defined as pendants to the
% keys provided by \cs{includegraphics}.
% \begin{macrocode}
%<*extract>
@@ -4476,7 +5135,14 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \end{parameter}^^A convertdpi
% \end{parameter}^^A convertformat
% \end{parameter}^^A convert
+% \end{parameter}^^A pdftopsopt
+% \end{parameter}^^A pdftoepsopt
+% \end{parameter}^^A pstopdfopt
+% \end{parameter}^^A pstoepsopt
+% \end{parameter}^^A dvipsopt
+% \end{parameter}^^A latexext
% \end{parameter}^^A latexopt
+% \end{parameter}^^A latexexe
% \end{parameter}^^A extractruns
% \end{parameter}^^A extractapptex
% \end{parameter}^^A extractpretex
@@ -4498,7 +5164,14 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \end{parameter}^^A convertdpi
% \end{parameter}^^A convertformat
% \end{parameter}^^A convert
+% \end{parameter}^^A pdftopsopt
+% \end{parameter}^^A pdftoepsopt
+% \end{parameter}^^A pstopdfopt
+% \end{parameter}^^A pstoepsopt
+% \end{parameter}^^A dvipsopt
+% \end{parameter}^^A latexext
% \end{parameter}^^A latexopt
+% \end{parameter}^^A latexexe
% \end{parameter}^^A extractruns
% \end{parameter}^^A extractapptex
% \end{parameter}^^A extractpretex
@@ -4517,22 +5190,22 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \changes{v2.00}{2017/02/24}{new}^^A
% Some dummys for package \pkg{svg}.
% \begin{macrocode}
-%<*base>
+%<*main>
\newcommand*\svghidepreamblestart{%
\PackageWarning{svg}{%
The macro `\string\svghidepreamblestart' is only meant\MessageBreak%
- to be used together with package `svg-extract'.\MessageBreak%
+ to be used together with package `svg-extract'. \MessageBreak%
Nevertheless, nothing will happen%
}%
}
\newcommand*\svghidepreambleend{%
\PackageWarning{svg}{%
The macro `\string\svghidepreambleend' is only meant\MessageBreak%
- to be used together with package `svg-extract'.\MessageBreak%
+ to be used together with package `svg-extract'. \MessageBreak%
Nevertheless, nothing will happen%
}%
}
-%</base>
+%</main>
% \end{macrocode}
% These two macros can be used to hide some parts of the preamble during
% reading the preamble of the main document.
@@ -4550,18 +5223,14 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \subsection{Auxiliary macros}
%
% \begin{macro}{\svg@extract}
-% \begin{macro}{\svgx@stream@in}
-% \begin{macro}{\svgx@read@line}
-% \begin{macro}{\svgx@stream@out}
-% \begin{macro}{\if@svgx@preamble@write}
% The macro \cs{svg@extract} does the actual job of both extracting and
% converting independent graphic files. Since it is necessary to run it with
% \file{-{}-shell-escape} enabled, the command raises a warning if it is not
% activated. Afterwards, the package is finished.
% \begin{macrocode}
-%<*base>
+%<*main>
\newcommand*\svg@extract[1]{}
-%</base>
+%</main>
%<*extract>
\ifnum\pdf@shellescape=\@ne\relax\else%
\renewcommand*\svg@extract[1]{%
@@ -4579,15 +5248,37 @@ svg-extract -- Extract independent graphic files from SVG pictures
}%
\expandafter\endinput%
\fi
+%</extract>
% \end{macrocode}
-% If \file{-{}-shell-escape} is enabled, the command is defined with its
-% intended functionality. Some macros and a input stream as well as a output
-% stream are necessary for this.
+% \end{macro}^^A \svg@extract
+%
+% \iffalse
+%</package&body>
+%<*package&body&extract>
+% \fi
+%
+% \begin{macro}{\svgx@stream@in}
+% \begin{macro}{\svgx@read@line}
+% \begin{macro}{\svgx@stream@out}
+% \begin{macro}{\if@svgx@preamble@write}
+% Both an input stream and an output stream are necessary for this as well as a
+% token register, which is used to store all commands which should be executed
+% on shell.
% \begin{macrocode}
\newread\svgx@stream@in
\newcommand*\svgx@read@line{}
\newwrite\svgx@stream@out
\newif\if@svgx@preamble@write
+% \end{macrocode}
+% \end{macro}^^A \if@svgx@preamble@write
+% \end{macro}^^A \svgx@stream@out
+% \end{macro}^^A \svgx@read@line
+% \end{macro}^^A \svgx@stream@in
+% \begin{macro}{\svg@extract}
+% If flag \file{-{}-shell-escape} is enabled, the command is defined with its
+% intended functionality. It runs all necessary processes to extract and
+% convert graphic files.
+% \begin{macrocode}
\renewcommand*\svg@extract[1]{%
% \end{macrocode}
% If option \opt{extract} is enabled\dots
@@ -4641,7 +5332,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
`\svgx@out@name.\svgx@latex@ext'%
}%
% \end{macrocode}
-% The catcodes for |#| need to be changed to prevent doublification when
+% The catcodes for |#| need to be changed to prevent doubling when
% reading the line.
% \begin{macrocode}
\catcode`\#=12\relax%
@@ -4840,7 +5531,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
}%
\fi%
% \end{macrocode}
-% As we are now at the end of the preamble and just before the beginning of the
+% As this is now the end of the preamble and just before the beginning of the
% document, the paper dimension are set again to make sure, that these settings
% are active at the end of the preamble. Additionally, it is executed again at
% the very end of \cs{AtBeginDocument} to ensure, that no other package used
@@ -4900,7 +5591,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
\expandafter\AfterReadingMainAux\expandafter{\svg@tempb}%
% \end{macrocode}
% First of all the separate auxiliary \LaTeX~file is compiled with the detected
-% \LaTeX~processor (\cs{svgx@latex@exe}) as often as defined by counter option
+% \LaTeX~engine (\cs{svgx@latex@exe}) as often as defined by counter option
% \opt{extractruns}.
% \begin{macrocode}
\edef\svg@tempb{%
@@ -4924,7 +5615,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
\repeat%
% \end{macrocode}
% All files requested with option \opt{extractformat} are created with internal
-% conversion tools supplied by most \LaTeXe~distributions if necessary.
+% conversion tools supplied by most \LaTeX~distributions if necessary.
% \begin{macrocode}
\def\svg@tempa##1##2##3{%
\edef\svg@tempb{%
@@ -5028,26 +5719,13 @@ svg-extract -- Extract independent graphic files from SVG pictures
}%
\fi%
}
-%</extract>
% \end{macrocode}
-% \end{macro}^^A \if@svgx@preamble@write
-% \end{macro}^^A \svgx@stream@out
-% \end{macro}^^A \svgx@read@line
-% \end{macro}^^A \svgx@stream@in
% \end{macro}^^A \svg@extract
-%
-% \iffalse
-%</package&body>
-%<*package&extract&body>
-% \fi
-%
% \begin{macro}{\svgx@get@out@sec}
-% \begin{macro}{\svgx@out@sec}
% The macro \cs{svgx@get@out@sec} reads all sectioning counters in order to
% get the numbering of the current sectioning level. The value is stored in
% \cs{svgx@out@sec}.
% \begin{macrocode}
-\newcommand*\svgx@out@sec{unknown}
\newcommand*\svgx@get@out@sec{%
\begingroup%
\def\svg@tempa{}%
@@ -5071,12 +5749,11 @@ svg-extract -- Extract independent graphic files from SVG pictures
\svg@tempb%
}
% \end{macrocode}
-% \end{macro}^^A \svgx@out@sec
% \end{macro}^^A \svgx@get@out@sec
% \begin{macro}{\svgx@documentclass}
% \begin{macro}{\if@svgx@classfound}
-% This delimited macro is used to find a occurrence of \cs{documentclass}
-% within a read in line. The delinmiter \cs{documentclass} is used twice in
+% This delimited macro is used to find the occurrence of \cs{documentclass}
+% within a read in line. The delimiter \cs{documentclass} is used twice in
% order to ignore the possible occurrence of white space or anything else right
% before \cs{documentclass}.
% \begin{macrocode}
@@ -5190,53 +5867,13 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \end{macrocode}
% \end{macro}^^A \svgx@cnv@get@informat
% \end{macro}^^A \svgx@cnv@informat
-% \begin{macro}{\svgx@magick@cmd}
-% \begin{macro}{\svgx@gs@cmd}
-% Depending on option \opt{convert}, one of these two macros is actually used
-% by \cs{svgx@cnv@cmd}. For invoking the conversion process, the required
-% platform-dependent executable is set, if nothing was set by a package option.
-% \begin{macrocode}
-\ifx\svgx@magick@exe\@empty
- \ifwindows
- \renewcommand*\svgx@magick@exe{magick}
- \else
- \renewcommand*\svgx@magick@exe{convert}
- \fi
-\fi
-\newcommand*\svgx@magick@cmd[3]{%
- \svgx@magick@exe\space%
- \svgx@useformatkey{svgx@cnv@dpi}{#3}{-density }%
- \svgx@useformatkey{svgx@magick@set}{#3}{}%
- "#1.#2"\space%
- \svgx@useformatkey{svgx@magick@opr}{#3}{}%
- "#1.#3"%
-}
-% \end{macrocode}
-% \begin{macrocode}
-\ifx\svgx@gs@exe\@empty
- \ifwindows
- \renewcommand*\svgx@gs@exe{gswin64c}
- \else
- \renewcommand*\svgx@gs@exe{gs}
- \fi
-\fi
-\newcommand*\svgx@gs@cmd[3]{%
- \svgx@gs@exe\space-dSAFER -dBATCH -dNOPAUSE\space%
- \svgx@useformatkey{svgx@gs@device}{#3}{-sDEVICE=}%
- \svgx@useformatkey{svgx@cnv@dpi}{#3}{-r}%
- \svgx@useformatkey{svgx@gs@opt}{#3}{}%
- -sOutputFile="#1.#3"\space"#1.#2"%
-}
-% \end{macrocode}
-% \end{macro}^^A \svgx@gs@cmd
-% \end{macro}^^A \svgx@magick@cmd
% \begin{macro}{\svgx@move}
% If the file doesn't exist
% \begin{macrocode}
\newcommand*\svgx@move[3]{%
\begingroup%
\IfFileExists{"#1".#2}{%
- \svg@shell@move{#1.#2}{#3#1.#2}%
+ \svg@shell@mv{#1.#2}{#3#1.#2}%
}{%
\edef\svg@tempa{#2}%
\@svg@tempswafalse%
@@ -5273,177 +5910,10 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \end{macro}^^A \svgx@move
%
% \iffalse
-%</package&extract&body>
-%<*package&extract&option>
+%</package&body&extract>
+%<*package&standalone&extract>
% \fi
%
-% \begin{macro}{\svgx@ifinlist}
-% Check, if the first argument is included in a comma-separated list in the
-% second argument. Keep in mind that the first argument is not expanded at all,
-% the second one exactly once.
-% \begin{macrocode}
-\newcommand*\svgx@ifinlist[2]{%
- \begingroup%
- \def\svg@tempa##1,#1,##2\@nil{%
- \IfArgIsEmpty{##2}{%
- \aftergroup\@secondoftwo%
- }{%
- \aftergroup\@firstoftwo%
- }%
- }%
- \expandafter\svg@tempa\expandafter,#2,#1,\@nil%
- \endgroup%
-}
-% \end{macrocode}
-% \end{macro}^^A \svgx@ifinlist
-% \begin{macro}{\svgx@onlywindows}
-% Do only some stuff, if Windows was detected.
-% \begin{macrocode}
-\newcommand*\svgx@onlywindows[1]{}
-\AfterPackage*{ifplatform}{\renewcommand*\svgx@onlywindows[1]{\ifwindows#1\fi}}
-% \end{macrocode}
-% \end{macro}^^A \svgx@onlywindows
-% \begin{macro}{\svgx@ifkeyandval}
-% It is checked whether a key was given as \val{\meta{key}=\meta{value}} or
-% like \val{\meta{key}=\{\meta{format}=\meta{value}\}}.
-% \begin{macrocode}
-\newcommand*\svgx@ifkeyandval[3]{%
- \def\svg@tempa##1=##2=##3\@nil{\Ifstr{##3}{=}{#2}{#3}}%
- \svg@tempa#1==\@nil%
-}
-% \end{macrocode}
-% \end{macro}^^A \svgx@ifkeyandval
-% \begin{macro}{\svgx@cnv@get@dpi}
-% This macro is used to resolve a given value to set the density for the
-% conversion. The delimited macros \cs{svg@tempa} and \cs{svg@tempb} are
-% defined to first crop any given suffix \val{dpi} and second to split two
-% numbers at |x|, if present. Pay attention how both macros are invoked. In the
-% end, a passed value in any of the forms \val{300}, \val{300dpi}, \val{300x400}
-% or \val{300x400dpi} and even \val{300dpix400dpi} is possible. The result is
-% stored in \cs{svg@tempa}.
-% \begin{macrocode}
-\newcommand*\svgx@cnv@get@dpi[1]{%
- \begingroup%
- \def\svg@tempa##1dpi##2x##3dpi##4\@nil{%
- \edef\svg@tempa{##1}%
-% \end{macrocode}
-% Switch \cs{if@svg@tempswa} as \cs{iftrue} means, a valid value was found.
-% \begin{macrocode}
- \@svg@tempswafalse%
-% \end{macrocode}
-% If only the first argument is a number and third is empty, a single number
-% was given and there's nothing more to do. If the argument is something like
-% \val{300dpix400dpi}, the third argument is the second number.
-% \begin{macrocode}
- \Ifnumber{##1}{%
- \IfArgIsEmpty{##3}{\@svg@tempswatrue}{%
- \Ifnumber{##3}{\edef\svg@tempa{##1x##3}}{}%
- }%
- }{}%
- \if@svg@tempswa\else%
- \expandafter\svg@tempb\svg@tempa xx\@nil%
- \fi%
- }%
-% \end{macrocode}
-% Macro \cs{svg@tempb} splits at |x| and checks, if something valid like
-% \val{300x400} was given. If true, the value is stored in \cs{svg@tempa}.
-% \begin{macrocode}
- \def\svg@tempb##1x##2x##3\@nil{%
- \Ifstr{##3}{x}{%
- \@svg@tempswatrue%
- \IfArgIsEmpty{##1}{\@svg@tempswafalse}{%
- \Ifnumber{##1}{}{\@svg@tempswafalse}%
- }%
- \IfArgIsEmpty{##2}{\@svg@tempswafalse}{%
- \Ifnumber{##2}{}{\@svg@tempswafalse}%
- }%
- \if@svg@tempswa%
- \edef\svg@tempa{##1x##2}%
- \fi%
- }{}%
- }%
- \IfArgIsEmpty{#1}{%
- \let\svg@tempa\@empty%
- }{%
- \lowercase{\svg@tempa#1dpi#1xdpi\@nil}%
- \if@svg@tempswa\else%
- \let\svg@tempa\relax%
- \fi%
- }%
- \edef\svg@tempb{%
- \endgroup%
- \ifx\svg@tempa\relax%
- \let\noexpand\svg@tempa\noexpand\relax%
- \else%
- \def\noexpand\svg@tempa{\svg@tempa}%
- \fi%
- }%
- \svg@tempb%
-}
-% \end{macrocode}
-% \end{macro}^^A \svgx@cnv@get@dpi
-% \begin{macro}{\svgx@setformatkey}
-% \begin{macro}{\svgx@useformatkey}
-% With \cs{svgx@setformatkey} the---maybe output format depend---keys for the
-% conversion tools are set. First argument contains the value given to a key,
-% second the command sequence name of the macro, to whom the value shall be
-% allocated.
-% \begin{macrocode}
-\newcommand*\svgx@setformatkey[2]{%
-% \end{macrocode}
-% A key of the form \val{\meta{key}=\{\meta{format}=\meta{value}\}} is given.
-% The desired output format can be accessed with |##1|, the value with |##2|
-% within the arguments of \cs{svgx@ifkeyandval}.
-% \begin{macrocode}
- \svgx@ifkeyandval{#1}{%
- \svg@ifvalueisrelax{##2}{%
- \expandafter\let\csname #2@##1\endcsname\relax%
- }{%
- \@namedef{#2@##1}{##2}%
- }%
-% \end{macrocode}
-% A key of the form \val{\meta{key}=\{\meta{format}=\meta{value}\}} is given.
-% The value can be used with |##1|.
-% \begin{macrocode}
- }{%
- \svg@ifvalueisrelax{##1}{%
- \expandafter\let\csname #2\endcsname\relax%
- }{%
- \@namedef{#2}{##1}%
- }%
- }%
-}
-% \end{macrocode}
-% The command \cs{svgx@useformatkey} checks, if a format specific key was
-% definded with \cs{svgx@setformatkey}, whereas the format is given in the
-% second argument. If this is not the case, the setting for all output formats
-% is used. After that, a specific key appended with a |+| can be used to do
-% some additional stuff.
-% \begin{macrocode}
-\newcommand*\svgx@useformatkey[3]{%
- \scr@ifundefinedorrelax{#1@#2}{%
- \scr@ifundefinedorrelax{#1}{}{%
- \expandafter\ifx\csname #1\endcsname\@empty\else%
- #3\@nameuse{#1}\space%
- \fi%
- }%
- \scr@ifundefinedorrelax{#1@#2+}{}{%
- \expandafter\ifx\csname #1@#2+\endcsname\@empty\else%
- #3\@nameuse{#1@#2+}\space%
- \fi%
- }%
- }{%
-% \end{macrocode}
-% If this a format specific key was definded, it is used.
-% \begin{macrocode}
- \expandafter\ifx\csname #1@#2\endcsname\@empty\else%
- #3\@nameuse{#1@#2}\space%
- \fi%
- }%
-}
-% \end{macrocode}
-% \end{macro}^^A \svgx@useformatkey
-% \end{macro}^^A \svgx@setformatkey
%
%
%
@@ -5459,14 +5929,14 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \changes{v2.02}{2018/09/07}{new}^^A
% \begin{macro}{\if@svgx@standalone}
% \changes{v2.02}{2018/09/07}{new}^^A
-% Within the preamble of the auxiliary \LaTeX~file, the desired grahic is used
+% Within the preamble of the auxiliary \LaTeX~file, the desired graphic is used
% to setup a box, which is used both to define the papersize as well as for the
% output itself. The macro \cs{svgx@setbox} is executed twice, the first time
% in the preamble and the second time at the very end of \cs{AtBeginDocument}
% if package \pkg{etoolbox} was loaded.
%
% The switch \cs{if@svgx@standalone} is defined for enabling classes to
-% implement a different behavoiur for \pkg{svg-extract} in standalone mode.
+% implement a different behaviour for \pkg{svg-extract} in standalone mode.
% for example, \TUDScript-classes are using this switch.
% \begin{macrocode}
\newif\if@svgx@standalone
@@ -5561,7 +6031,7 @@ svg-extract -- Extract independent graphic files from SVG pictures
% \end{macro}^^A \svgxoutputbox
%
% \iffalse
-%</package&extract&option>
+%</package&standalone&extract>
%<*package&option>
% \fi
%
@@ -5572,13 +6042,13 @@ svg-extract -- Extract independent graphic files from SVG pictures
% Setting the default options and processing the given ones during when loading
% the packages.
% \begin{macrocode}
-%<*base>
+%<*main>
\FamilyExecuteOptions{SVG}{%
- inkscape=true,inkscapepath=basesubdir,
+ inkscape=true,inkscapeversion=auto,inkscapepath=basesubdir,%
inkscapelatex=true,inkscapearea=drawing,distort=false,%
usexcolor=true,usetransparent=true%
}
-%</base>
+%</main>
%<*extract>
\FamilyExecuteOptions{SVG}{%
extract=true,extractpath=basesubdir,%
@@ -5594,423 +6064,6 @@ svg-extract -- Extract independent graphic files from SVG pictures
%
% \iffalse
%</package&option>
-%<*package&base&body>
-% \fi
-%
-%
-%
-% \section{Macros for file access}
-%
-% Finally, platform dependend macros for creating directories as well as moving
-% and deleting files are provided, if \file{-{}-shell-escape} is enabled. Only
-% then package \pkg{ifplatform} is only used in order to do not raise a warning.
-% \begin{macrocode}
-\ifnum\pdf@shellescape=\@ne\relax\else%
- \expandafter\endinput%
-\fi
-\RequirePackage{ifplatform}[2010/10/22]
-% \end{macrocode}
-% \begin{macro}{\svg@shell@mkdir}
-% \begin{macro}{\svg@shell@@mkdir}
-% \begin{macro}{\svg@shell@mv}
-% \begin{macro}{\svg@shell@@mv}
-% \begin{macro}{\svg@shell@rm}
-% \begin{macro}{\svg@shell@@rm}
-% The platform dependent commands for file access.
-% \begin{macrocode}
-\ifwindows
- \newcommand*\svg@shell@@mkdir[1]{if not exist "#1" mkdir "#1"}
- \newcommand*\svg@shell@@mv{move}
- \newcommand*\svg@shell@@rm{del}
-\else
- \newcommand*\svg@shell@@mkdir[1]{mkdir -p "#1"}
- \newcommand*\svg@shell@@mv{mv}
- \newcommand*\svg@shell@@rm{rm}
-\fi
-% \end{macrocode}
-% A directory should only be created, if it isn't the current working directory.
-% \begin{macrocode}
-\newcommand*\svg@shell@mkdir[1]{%
- \begingroup%
- \svg@quotes@remove[{#1}]{\svg@tempa}%
- \@svg@tempswatrue%
- \Ifstr{\svg@tempa}{}{\@svg@tempswafalse}{%
- \Ifstr{\svg@tempa}{./}{\@svg@tempswafalse}{%
- }}%
- \if@svg@tempswa%
- \ShellEscape{\svg@shell@@mkdir{\svg@tempa}}%
- \fi%
- \endgroup%
-}
-% \end{macrocode}
-% Commands for moving and deleting files.
-% \begin{macrocode}
-\newcommand*\svg@shell@move[2]{%
- \ShellEscape{\svg@shell@@mv\space"#1"\space"#2"}%
-}
-\newcommand*\svg@shell@rm[1]{%
- \ShellEscape{\svg@shell@@rm\space"#1"}%
-}
-% \end{macrocode}
-% \end{macro}^^A \svg@shell@@rm
-% \end{macro}^^A \svg@shell@rm
-% \end{macro}^^A \svg@shell@@mv
-% \end{macro}^^A \svg@shell@mv
-% \end{macro}^^A \svg@shell@@mkdir
-% \end{macro}^^A \svg@shell@mkdir
-% At the very end, the catcodes are restored.
-% \begin{macrocode}
-\svg@catcodecodes@restore
-% \end{macrocode}
-%
-% \iffalse
-%</package&base&body>
-% \fi
-%
-% \Finale
-%
-\endinput
-%
-% \iffalse
-%<*package&old>
-% \fi
-%
-%
-%
-% \section{Old Implementation}
-%
-% The package, which requires the packages \pkg{xkeyval} for the options,
-% \pkg{subfig} for automatic labeling within the subfigure command, the
-% \pkg{import} package for correct handling of paths, \pkg{graphicx} for the
-% PDF~file inclusion commands, \pkg{transparent} for transparency, and
-% \pkg{xcolor} for color, is initialized.
-% \begin{macrocode}
-\ProvidesPackage{svg}[2012/09/05 v1.0 SVG inclusion and extraction]%
-\@ifpackageloaded{xkeyval}{}{\RequirePackage{xkeyval}}%
-\@ifpackageloaded{subfig}{}{\RequirePackage{subfig}}%
-\@ifpackageloaded{import}{}{\RequirePackage{import}}%
-\@ifpackageloaded{graphicx}{}{\RequirePackage{graphicx}}%
-\@ifpackageloaded{transparent}{}{\RequirePackage{transparent}}%
-\@ifpackageloaded{xcolor}{}{\RequirePackage{xcolor}}%
-% \end{macrocode}
-%
-%
-%
-% \subsection{Input definition}
-%
-% All commands used for input (i.e. for the SVG~file and preamble) are
-% defined within the \cs{SVG@in} prefix, and set by the key definition of the
-% line following their definition. The \opt{exclude} boolean, used to stop the
-% inclusion of the SVG~file within the document is also defined.
-% \begin{macrocode}
-\def\SVG@in@preamble{\jobname.tex}%
-\define@key[SVG]{svg.sty}{preamble}{\def\SVG@in@preamble{#1}}%
-\def\SVG@in@path{./}%
-\define@key[SVG]{svg.sty}{svgpath}{\def\SVG@in@path{#1}}%
-\def\SVG@in@end{\begin{document}}%
-\define@key[SVG]{svg.sty}{end}{\def\SVG@in@end{#1}}%
-\define@boolkey[SVG]{svg.sty}[SVG@in@]{exclude}[true]{}%
-% \end{macrocode}
-%
-%
-%
-% \subsection{Length definition}
-%
-% All commands used for output are defined within the \cs{SVG@out} prefix,
-% beginning with the dimensions of the extracted image. If no dimensions are
-% supplied both \cs{ifSVG@out@usewidth} and \cs{ifSVG@out@useheight} are
-% \val{false}, and so the natural dimensions of the SVG~file are used.
-% If both \cs{ifSVG@out@usewidth} and \cs{ifSVG@out@useheight} are
-% \val{true}, the width is used.
-% \begin{macrocode}
-\newlength\SVG@out@width%
-\newif\ifSVG@out@usewidth%
-\define@key[SVG]{svg.sty}{width}{%
- \setlength{\SVG@out@width}{#1}\SVG@out@usewidthtrue%
-}%
-\newlength\SVG@out@height%
-\newif\ifSVG@out@useheight%
-\define@key[SVG]{svg.sty}{height}{%
- \setlength{\SVG@out@height}{#1}\SVG@out@useheighttrue%
-}%
-% \end{macrocode}
-%
-%
-%
-% \subsection{Extract booleans}
-%
-% The booleans for the extraction formats are defined. Additionally,
-% the global export variable is defined, which is set to \val{true}
-% whenever any extraction is requested.
-% \begin{macrocode}
-\define@boolkey[SVG]{svg.sty}[SVG@out@]{pdf}[true]{}%
-\define@boolkey[SVG]{svg.sty}[SVG@out@]{eps}[true]{}%
-\define@boolkey[SVG]{svg.sty}[SVG@out@]{png}[true]{}%
-\newif\ifSVG@out@extract
-% \end{macrocode}
-%
-%
-%
-% \subsection{Output definitions}
-%
-% The extraction path, extraction root name, clean boolean,
-% pre-\LaTeX~commands, and post-\LaTeX~commands are defined.
-% \begin{macrocode}
-\def\SVG@out@path{./}%
-\define@key[SVG]{svg.sty}{path}{\def\SVG@out@path{#1}}%
-\def\SVG@out@name{Fig.\arabic{svgfigure}\alph{subfigure}}%
-\define@key[SVG]{svg.sty}{name}{\def\SVG@out@name{#1}}%
-\define@boolkey[SVG]{svg.sty}[SVG@out@]{clean}[true]{}%
-\def\SVG@out@pretex{}%
-\define@key[SVG]{svg.sty}{pretex}{\def\SVG@out@pretex{#1}}%
-\def\SVG@out@postex{}%
-\define@key[SVG]{svg.sty}{postex}{\def\SVG@out@postex{#1}}%
-% \end{macrocode}
-%
-%
-%
-% \subsection{Command definitions}
-%
-% The command options are defined within the prefix \cs{SVG@cmd} and
-% are set by the key definition following each command definition.
-% \begin{macrocode}
-\def\SVG@cmd@inkscape{inkscape -z -C}%
-\define@key[SVG]{svg.sty}{inkscape}{\def\SVG@cmd@inkscape{#1}}%
-\def\SVG@cmd@pdflatex{pdflatex}%
-\define@key[SVG]{svg.sty}{pdflatex}{\def\SVG@cmd@pdflatex{#1}}%
-\def\SVG@cmd@pdftops{pdftops -eps}%
-\define@key[SVG]{svg.sty}{pdftops}{\def\SVG@cmd@pdftops{#1}}%
-\def\SVG@cmd@convert{convert -density 300}%
-\define@key[SVG]{svg.sty}{convert}{\def\SVG@cmd@convert{#1}}%
-% \end{macrocode}
-%
-%
-%
-% \subsection{Process options}
-%
-% All the options for the package are processed, and a counter is defined,
-% which is used to correctly handle the \cnt{subfigure} counting.
-% \begin{macrocode}
-\ProcessOptionsX[SVG]%
-\newcounter{svgfigure}[figure]%
-% \end{macrocode}
-%
-%
-%
-% \subsection{User interface}
-%
-% Define the macro to globally set keys.
-% \begin{macrocode}
-\def\setsvg#1{\setkeys[SVG]{svg.sty}{#1}}%
-% \end{macrocode}
-%
-% Define the macro used to include a SVG~file. Set the keys and
-% determine if extraction should occur.
-% \begin{macrocode}
-\newread\SVG@in@file%
-\newwrite\SVG@out@file%
-\def\includesvg{\@ifnextchar[\@includesvg{\@includesvg[]}}%
-\def\@includesvg[#1]#2{%
- \setkeys[SVG]{svg.sty}{#1}%
- \SVG@out@extractfalse%
- \ifSVG@out@pdf \SVG@out@extracttrue \fi%
- \ifSVG@out@eps \SVG@out@extracttrue \fi%
- \ifSVG@out@png \SVG@out@extracttrue \fi%
-% \end{macrocode}
-% Run \app{Inkscape} to separate the SVG~file into text and image. Only
-% run \app{Inkscape} if the SVG~file is newer than the generated text
-% and image.
-% \begin{macrocode}
- \ifnum\pdfstrcmp{%
- \pdffilemoddate{\SVG@in@path#2.svg}%
- }{%
- \pdffilemoddate{\SVG@in@path#2.pdf}%
- }>0\relax%
- \immediate\write18{%
- \SVG@cmd@inkscape\space%
- -f \SVG@in@path#2.svg\space%
- -A \SVG@in@path#2.pdf\space%
- --export-latex%
- }%
- \fi%
-% \end{macrocode}
-% Determine the image width and height using \cs{includegraphics}.
-% \begin{macrocode}
- \ifSVG@out@usewidth%
- \settoheight\SVG@out@height{%
- \includegraphics[width=\SVG@out@width]{\SVG@in@path#2}%
- }%
- \else%
- \ifSVG@out@useheight%
- \settowidth\SVG@out@width{%
- \includegraphics[height=\SVG@out@height]{\SVG@in@path#2}%
- }%
- \else%
- \settoheight\SVG@out@height{%
- \includegraphics{\SVG@in@path#2}%
- }%
- \settowidth\SVG@out@width{\includegraphics{\SVG@in@path#2}}%
- \fi%
- \fi%
-% \end{macrocode}
-% Open the output file for extraction.
-% \begin{macrocode}
-% Open the output file.
- \ifSVG@out@extract%
- \setcounter{svgfigure}{\value{figure}}%
- \stepcounter{svgfigure}%
- \def\SVG@out@filename{\SVG@out@name}%
- \immediate\openout\SVG@out@file=\SVG@out@path\SVG@out@filename.tex%
- \fi%
-% \end{macrocode}
-% Open and write the preamble. Notice that the catcodes for |#| need
-% to be changed to prevent double expansion when reading the line.
-% \begin{macrocode}
- \ifSVG@out@extract%
- \def\SVG@in@line{}%
- \immediate\openin\SVG@in@file=\SVG@in@preamble%
- \fi%
- \newif\ifSVG@in@read%
- \ifSVG@out@extract \SVG@in@readtrue \fi%
- \@whilesw\ifSVG@in@read\fi{%
- \catcode`\#=12\relax\endlinechar=-1%
- \immediate\read\SVG@in@file to \SVG@in@line%
- \ifx\SVG@in@end\SVG@in@line%
- \SVG@in@readfalse%
- \else%
- \immediate\write\SVG@out@file{\unexpanded\expandafter{\SVG@in@line}}%
- \fi%
- \ifeof\SVG@in@file\SVG@in@readfalse\fi%
- \endlinechar=13\catcode`\#=6\relax%
- }%
- \ifSVG@out@extract \immediate\closein\SVG@in@file \fi%
-% \end{macrocode}
-% Now write everything needed after the preamble. This includes
-% requiring the \pkg{import} package and defining all the dimensions need
-% to match the document size with the image size.
-% \begin{macrocode}
- \ifSVG@out@extract%
- \def\SVG@out@defpack{%
- \makeatletter%
- \@ifpackageloaded{import}{}{\RequirePackage{import}}%
- \@ifpackageloaded{graphicx}{}{\RequirePackage{graphicx}}%
- \@ifpackageloaded{transparent}{}{\RequirePackage{transparent}}%
- \@ifpackageloaded{xcolor}{}{\RequirePackage{xcolor}}%
- \makeatother%
- }%
- \def\SVG@out@defwidth{\def\svgwidth{0.99\textwidth}}%
- \def\SVG@out@definput{\import{\SVG@in@path}{#2.pdf_tex}}%
- \immediate\write\SVG@out@file{\unexpanded\expandafter{\SVG@out@defpack}}%
- \immediate\write\SVG@out@file{%
- \noexpand\setlength{\pdfpagewidth}{\the\SVG@out@width}%
- }%
- \immediate\write\SVG@out@file{%
- \noexpand\setlength{\pdfpageheight}{\the\SVG@out@height}%
- }%
- \immediate\write\SVG@out@file{%
- \noexpand\setlength{\paperheight}{\pdfpageheight}%
- }%
- \immediate\write\SVG@out@file{%
- \noexpand\setlength{\paperwidth}{\pdfpagewidth}%
- }%
- \immediate\write\SVG@out@file{%
- \noexpand\setlength{\textheight}{\paperheight}%
- }%
- \immediate\write\SVG@out@file{%
- \noexpand\setlength{\textwidth}{\paperwidth}%
- }%
- \immediate\write\SVG@out@file{%
- \noexpand\setlength{\textheight}{\paperheight}%
- }%
- \immediate\write\SVG@out@file{\noexpand\setlength{\oddsidemargin}{-1in}}%
- \immediate\write\SVG@out@file{\noexpand\setlength{\evensidemargin}{-1in}}%
- \immediate\write\SVG@out@file{\noexpand\setlength{\topmargin}{-1in}}%
- \immediate\write\SVG@out@file{\noexpand\setlength{\headheight}{0in}}%
- \immediate\write\SVG@out@file{\noexpand\setlength{\headsep}{0in}}%
- \immediate\write\SVG@out@file{\noexpand\setlength{\topskip}{0in}}%
- \immediate\write\SVG@out@file{\noexpand\setlength{\footskip}{0in}}%
- \immediate\write\SVG@out@file{\noexpand\setlength{\parindent}{0in}}%
- \immediate\write\SVG@out@file{\noexpand\setlength{\parsep}{0in}}%
- \immediate\write\SVG@out@file{\noexpand\setlength{\parskip}{0in}}%
- \immediate\write\SVG@out@file{%
- \noexpand\begin{document}%
- \noexpand\pagestyle{empty}%
- \noexpand\begin{center}%
- \unexpanded\expandafter{\SVG@out@defwidth}%
- \unexpanded\expandafter{\SVG@out@pretex}%
- \expandafter\noexpand\SVG@out@definput%
- \unexpanded\expandafter{\SVG@out@postex}%
- \noexpand\end{center}%
- \noexpand\end{document}%
- }%
- \immediate\closeout\SVG@out@file%
- \fi%
-% \end{macrocode}
-% Run \LaTeX{} on the extracted file and create the PDF~file.
-% \begin{macrocode}
- \ifSVG@out@extract%
- \immediate\write18{%
- \SVG@cmd@pdflatex\space\SVG@out@path\SVG@out@filename.tex%
- }%
- \fi%
-% \end{macrocode}
-% Convert the PDF~file to EPS~file if requested.
-% \begin{macrocode}
- \ifSVG@out@eps%
- \immediate\write18{\SVG@cmd@pdftops\space\SVG@out@filename.pdf}%
- \immediate\write18{%
- mv \SVG@out@filename.eps\space\SVG@out@path\SVG@out@filename.eps%
- }%
- \fi%
-% \end{macrocode}
-% Convert the PDF~file to PNG~file if requested.
-% \begin{macrocode}
- \ifSVG@out@png%
- \immediate\write18{%
- \SVG@cmd@convert\space%
- \SVG@out@filename.pdf\space\SVG@out@filename.png%
- }%
- \immediate\write18{%
- mv \SVG@out@filename.png\space\SVG@out@path\SVG@out@filename.png%
- }%
- \fi%
-% \end{macrocode}
-% Clean up if requested.
-% \begin{macrocode}
- \ifSVG@out@extract%
- \ifSVG@out@pdf%
- \immediate\write18{%
- mv \SVG@out@filename.pdf\space\SVG@out@path\SVG@out@filename.pdf%
- }%
- \else%
- \ifSVG@out@clean \immediate\write18{rm \SVG@out@filename.pdf} \fi%
- \fi%
- \ifSVG@out@clean%
- \immediate\write18{%
- rm
- \SVG@out@path\SVG@out@filename.tex\space%
- \SVG@out@filename.aux\space%
- \SVG@out@filename.log\space%
- \SVG@out@filename.out%
- }%
- \fi%
- \fi%
-% \end{macrocode}
-% Finally, include the SVG~file in the current document and end the package.
-% \begin{macrocode}
- \ifSVG@in@exclude\else%
- {%
- \def\svgwidth{\the\SVG@out@width}%
- \SVG@out@pretex%
- \import{\SVG@in@path}{#2.pdf_tex}%
- \SVG@out@postex%
- }%
- \fi%
-}%
-% \end{macrocode}
-%
-% \iffalse
-%</package&old>
% \fi
%
% \Finale
diff --git a/Master/texmf-dist/source/latex/swfigure/swfigure.dtx b/Master/texmf-dist/source/latex/swfigure/swfigure.dtx
new file mode 100644
index 00000000000..54fc18ba647
--- /dev/null
+++ b/Master/texmf-dist/source/latex/swfigure/swfigure.dtx
@@ -0,0 +1,1558 @@
+% \iffalse
+% !TEX encoding = UTF-8 Unicode
+% !TEX TS-program = pdflatex
+%<*internal>
+\begingroup
+\input docstrip.tex
+\keepsilent
+\preamble
+
+ Copyright (C) 2020 Claudio Beccari all rights reserved.
+ License information appended
+
+\endpreamble
+
+\postamble
+
+Distributable under the LaTeX Project Public License,
+version 1.3c or higher (your choice). The latest version of
+this license is at: http://www.latex-project.org/lppl.txt
+
+This work is "maintained"
+
+This work consists of files swfigure.dtx and README.txt, and the derived
+files swfigure.sty and swfigure.pdf
+
+\endpostamble
+\askforoverwritefalse
+
+\generate{\file{swfigure.sty}{\from{swfigure.dtx}{package}}}
+
+\def\tmpa{plain}
+\ifx\tmpa\fmtname\endgroup\expandafter\bye\fi
+\endgroup
+%</internal>
+% \fi
+%
+% \iffalse
+%<*package>
+%<package>\NeedsTeXFormat{LaTeX2e}[2020/01/01]
+%</package>
+%<*driver>
+\ProvidesFile{swfigure.dtx}%
+%</driver>
+%<+package>\ProvidesPackage{swfigure}%
+%<*package>
+ [2020-12-23 v.0.9.18 Managing large and spread wide figures]
+%</package>
+%<*driver>
+\documentclass[a4paper]{ltxdoc}\errorcontextlines=9
+\hfuzz 10pt
+\usepackage[utf8]{inputenc}
+\usepackage{lmodern,textcomp,multicol,enumitem,mflogo,guit}
+\usepackage{swfigure}% this already loads the graphicx package
+
+\providecommand*\diff{\mathop{}\!\mathrm{d}}
+\renewcommand\meta[1]{{\normalfont\textlangle\textit{#1}\textrangle}}
+\renewcommand\marg[1]{\texttt{\string{\meta{#1}\string}}}
+\providecommand\Marg{}
+\renewcommand\Marg[1]{\texttt{\string{#1\string}}}
+\providecommand\oarg{}
+\renewcommand\oarg[1]{\texttt{[\meta{#1}]}}
+\providecommand\Oarg{}
+\renewcommand\Oarg[1]{\texttt{[#1]}}
+\providecommand\aarg{}
+\renewcommand*\aarg[1]{\texttt{<\meta{#1}>}}
+\providecommand\Aarg{}
+\renewcommand\Aarg[1]{\texttt{<#1>}}
+\providecommand\parg{}
+\renewcommand\parg[1]{\texttt{(\meta{#1})}}
+\providecommand\Parg{}
+\renewcommand\Parg[1]{\texttt{(#1)}}
+\providecommand\barg{}
+\renewcommand\barg[1]{\texttt{\char`|\meta{#1}\char`|}}
+\newbox\SWsynt
+\providecommand\eTeX{}
+\renewcommand\eTeX{\lower0.5ex\hbox{$\varepsilon\!$}\TeX}
+\newcommand\Benv[1]{\cs{begin}\Marg{#1}}
+\newcommand\Eenv[1]{\cs{end}\Marg{#1}}
+
+\newenvironment{medaglione}%
+{\par\medskip\fboxrule=0.8pt\fboxsep6pt\relax
+\begin{lrbox}{\SWsynt}\minipage{\dimexpr\linewidth-2\fboxsep-2\fboxrule}}%
+{\endminipage\end{lrbox}\noindent\fbox{\box\SWsynt}\par\medskip}
+
+\newenvironment{ttsyntax}{\medaglione\raggedright\ttfamily\obeylines}{\endmedaglione}
+
+\providecommand\setfontsize{}
+\DeclareRobustCommand\setfontsize[2][1.2]{%
+\linespread{#1}\fontsize{#2}{#2}\selectfont}
+\providecommand\ped[1]{\ensuremath{_{\mathrm{#1}}}}
+
+\GetFileInfo{swfigure.dtx}
+
+\title{The \texttt{swfigure} package\\
+Managing large and spread wide figures}
+\author{Claudio Beccari\thanks{E-mail: \texttt{claudio dot beccari at gmail dot com}}}
+\date{Version \fileversion~---~Last revised \filedate}
+
+\begin{document}\errorcontextlines=100
+\maketitle
+\columnseprule=0.4pt
+\begin{multicols}{2}
+ \tableofcontents
+\end{multicols}
+\DocInput{swfigure.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{1040}
+%
+% \begin{abstract}
+% This package defines a single command that with different options can
+% insert large images into the document; those that occupy an entire
+% spread get split into two halves that are inserted on
+% two facing pages in such a way that they merge when the document is read
+% on the screen (set to double page view) or is printed in a well sewn
+% book so that facing pages join correctly at the spine.
+% This documentation is accompanied by another file
+% |swfigure-examples.pdf| containing examples of this package several
+% uses.
+% \end{abstract}
+%
+%\begin{figure}[t]
+%\includegraphics[width=\linewidth]{DFscreenshot}
+%\caption{Example of a large fake image that occupies a spread;
+% screenshot of a spread view from the companion file
+% swfigure-examples.pdf.}\label{fig:DFscreenshot}
+%\end{figure}
+%
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\section{Introduction}
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Sometimes it is necessary to insert in a given document very large
+% images; either they are larger than a spread, or they do not exceed
+% the width of a spread. In the first case it is necessary to use
+% to large sheets of paper folded in the proper way and inserted in the
+% printed document as special inserts; or for documents to be read on
+% the screen such large sheets have to be attached to the document as
+% separate files to be viewed in windows different from that where the
+% document is being read.
+%
+% In the other case it is possible to manage such large figures in
+% different ways; we define a single command that, according to
+% different settings, can insert such figures in eight different display
+% modes.
+%\begin{enumerate}[noitemsep]
+% \item
+% The normal \LaTeX\ kernel full page display mode, but setting the placement option to |[p]| to the figure environment. Apparently
+% there is no need to define a new command for this display mode, except
+% the advantage of using the same command as the other modes and a few
+% small further functionalities provided by this the new command.
+%\item
+% The landscape display mode is available with the |lscape| package
+% and other similar ones. Again this display mode appears superfluous,
+% but the advantage is to use the same command as the other display modes.
+%\item
+% The screen-wide display mode, where two facing pages display a large
+% figure divided in two halves, each one set in its page shifted to the
+% spine so as to occupy on each page the text width plus the internal
+% margin; with suitable aspect ratio, both facing pages are practically
+% full. No other text appears on the page with this display mode, except
+% the caption in the right page external margin.
+%\item
+% The slim screen-wide image is similar to the previous mode, but since
+% the figure is slim, it is set at the top of two facing pages, with text
+% underneath; the caption is under the right figure half in the right
+% page, and the left text block height is set so that that the first
+% lines of both text blocks are aligned.
+%\item
+% The slim tall image is set to the side of the text block with text
+% wrapping it. Recurse is made to the |wrapfig| package, therefore the
+% software might sometimes hick-up a little bit, because of the
+% idiosyncrasies of |wrapfig| that performs very well in most but not
+% all circumstances; see that package documentation for such |wrapfig|
+% limitations. With this |wsfigure| package we limit the use of this
+% display mode to images that have a “height over width” aspect ratio
+% not lower than~2; we provide also some option arguments so as to correct
+% small imperfections in the sizing of the text indention
+%\item
+% A very large image, typically A3 sized, occupies a full spread
+% including the lateral margins; it is a solution to inputting, for
+% example, a line drawing of a technical device, that otherwise
+% should be attached as a separate document; a very large table
+% that does not fit the usual A4 paper and that cannot be split in chunks
+% by means of |longtable|, and cannot be scaled down to unreadable font
+% sizes.
+%\item
+% A rather tall not so slim image can be typeset in the total height
+% mode; this height is the paper (trimmed page) height; the image
+% appears in a textless page, shifted to the spine, taking into
+% account if the page is an odd or even numbered one. The image
+% is scaled so that leaves on it side the external margin plus a part
+% of the text width, generally sufficient for a side caption; it reaches the
+% top and the bottom limits of the trimmed page. Should this space
+% be to narrow for a decently typeset caption, a warning
+% message is issued but the compilation is not stopped. It is up
+% to the user to control how bad is the caption typesetting and
+% possibly to provide a different display mode in order to get a
+% better result.
+% \item
+% Anothe display mode, that we call Total Width
+%\end{enumerate}
+%
+% In any case, depending on the page geometry and the image aspect
+% ratio, it is very handy to have available a single command that
+% changes the display mode by just changing a single input optional
+% argument. In facts the user might start with one of the eight
+% described display modes; after examining the document draft the
+% user might chose another display mode, and it suffices to change
+% the optional argument, without changing the whole code.
+%
+% \bigskip
+%
+% \noindent\fbox{\textcolor{red}{WARNING}}\quad This package performs
+% as expected with documents typeset in \texttt{twoside} mode, and with
+% a page design where the internal margins of both the odd and even pages
+% are equal (symmetrical page design). For example, it does not work
+% with this document designed to work in \texttt{oneside} mode and
+% where the the left page margin is always larger than the right one
+% of each page; this page design is functional to the documentation
+% of the \TeX\ system software.
+%
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\section{Installation}
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This package is already installed with any complete and up to date
+% \TeX\ system distribution, \TeX\ Live or MiK\TeX.
+%
+% Should the user have available a basic or a partial \TeX\ system
+% installation, the simplest way to install this package is to download
+% the |swfigure.zip| file from the Comprehensive \TeX\ Archive Network
+% (CTAN), to decompress it either in the very folder where there is
+% the document main or single document file or, for a general use, in
+% the user |texmf| personal tree; it might be necessary that the user
+% should directly create this personal tree; how to do it is described
+% in the documentation of the user \TeX\ system distribution.
+%
+% The same holds true if the user employs a vintage \TeX\ system
+% distribution; this package requires the \LaTeX3 modern language
+% functionalities, therefore a \LaTeX\ kernel with a date after
+% 2019-01-01. Lacking this modern kernel, the package does not work,
+% because packages |xparse| and |xfp| are used for its
+% internal workings.
+%
+%
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\section{Usage}\label{sec:Usage}
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% This package defines a single user command\slash environment,
+% |DFimage|. The command is usable when the image fills up the page
+% or the spread, so that it contains no text, except the caption; the
+% environment is recommended when the large image is in a page or a
+% spread that contains also some text.\\
+% \fbox{\color{red} Warning!} This particular environment
+% cannot be nested and cannot contain a |\DFimage| command.
+%
+% The syntax is the following:
+%\begin{ttsyntax}
+%\cs{DFimage}\oarg{display mode}\marg{image file name}\%
+%\qquad \oarg{lof entry}\marg{caption}\oarg{label}\%
+%\qquad\parg{height correction}\aarg{line correction}\barg{width test}!\meta{precaption}!
+%\vspace{0.5\baselineskip}
+%or
+%\vspace{0.5\baselineskip}
+% \Benv{DFimage}\oarg{display mode}\marg{image file name}\%
+%\qquad \oarg{lof entry}\marg{caption}\oarg{label}\%
+%\qquad\parg{height correction}\aarg{line correction}\barg{width test}!\meta{precaption}!
+%\meta{environment textual contents}
+%\Eenv{DFimage}
+%\end{ttsyntax}
+% \noindent where:
+%\begin{description}[noitemsep]
+%
+%\item[\meta{display mode}]
+% is one of the following uppercase acronyms:
+% \texttt{NF} (Normal Figure), \texttt{RF} (Rotated Figure),
+% \texttt{SW} (Spread Wide image), \texttt{HS} (Horizontal Spread-wide
+% image), \texttt{VS} (Vertical Slim image), \texttt{FS}
+% (Full Spread image), \texttt{TH} (Total Height image), and \texttt{TW} (Total Width image).
+%
+%\item[\meta{image file name}]
+% is the name of the image graphic file; remember that the \LaTeX based
+% \TeX\ system typesetting programs accept graphic files in the formats
+% with extensions \texttt{.pdf}, \texttt{.eps}, \texttt{.jpg},
+% \texttt{.png}, and few other less common ones. It is not necessary to
+% specify the extension, but it is not forbidden.
+%
+%\item[\meta{lof entry}]
+% is the optional entry to the List Of Figures; it defaults to the
+% \meta{caption} text, but if the latter is sort of lengthy, it is
+% better to enter a shorter text in that list.
+%
+%\item[\meta{caption}]
+% is the caption text.
+%
+%\item[\meta{label}]
+% this optional argument is the string that forms the \cs{label} command
+% argument; of course, if this argument is not specified, the figure
+% number and its page cannot be referenced with \cs{ref}, \cs{pageref}
+% and other similar commands.
+%
+%\item[\meta{height correction or color}]
+% is a round parenthesis delimited optional argument; as a
+% \emph{height correction} it is a fractional number lower than~1
+% (default 0.8) with which to further scale the scaled image height
+% to be included; it is used by some display modes, and it is ignored
+% by others. In the total height mode, it can be used to scale the
+% captions width.
+%
+%\item[\meta{line correction}] is an angle bracket delimited optional
+% argument preset to zero. It is relevant only with the slim
+% vertical image display mode. Sometimes the |wrapfig| package
+% indents the wrapping text in such a way as to leave to much or too
+% little vertical space around the image and its caption; by examining
+% the document draft it is possible to correct the predetermined
+% number of indented lines by increasing or decreasing the vertical
+% space by any (integer) number of lines.
+%
+%\item[\meta{width test}] this further vertical bar-delimited argument
+% is used only when dealing with vertical slim images; when they are
+% scaled down in order to fit in the available space, their width may
+% become too small to allow a decently typeset caption below the
+% image. A test is made to compare the scaled image width with a
+% fraction of the text block width in order to skip the image insertion
+% if the image width becomes too small; the default value for this
+% \meta{width test} fraction is \texttt{0.25}, but the user can specify
+% a different value, even zero; with the zero value this width test is
+% skipped.
+%
+%\item[\meta{precaption}] is an optional color declaration delimited by
+% exclamation points; the default value is ‘empty’; it is used only
+% by the \texttt{FS} display mode in order to typeset a caption, for
+% example, with a contrasting color over the background image average
+% color, and/or with a displacement of the first or only caption line,
+% and/or with a different font.
+%
+%\end{description}
+%
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Display mode peculiarities}
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Each of the listed display modes has its own pros and cons.
+% In the following the phrase “aspect ratio” refers to the “height
+% over width” ratio either of the image or of the available space
+% where to put the image and possibly its caption.
+%\begin{description}[noitemsep]
+%
+%\item[\texttt{NF}]
+% This display mode is convenient when the image
+% aspect ratio is close to the text block one. Of course the user
+% does not know in advance the vertical space occupied by the caption,
+% therefore the optional \meta{height correction} comes handy for
+% small adjustments; this display mode is fully and freely floating,
+% although its positioning option is fixed to~|[p]|, a float-only page.
+% Therefore don't use it if the image is not really such as to occupy
+% most of the text block area.
+%
+%\item[\texttt{RF}]
+% This display mode is convenient when the image
+% aspect ratio is close to the reciprocal of the text block one. This
+% mode accepts the \meta{height correction} in order to leave space
+% for the caption. It is a fully and freely floating object with the
+% same pros and cons as the \texttt{NF} display mode.
+%
+%\item[\texttt{VS}]
+% This mode is convenient for tall and slim figures with aspect ratio
+% not lower than~2; but for obvious reasons, it should not be too
+% large, let's say, not larger than about~3 or~4. As always this depends
+% on the page design and the caption size. The limitations of the
+% underlying |wrapfig| package forbid its usage too close to
+% explicit lists and texts typeset in special modes with a different
+% measure from normal text. Again it is up to the user to chose
+% where to insert the |DFfigure| environment or the |\DFimage| command.
+% The |wrapfig| package documentation and our experience, show that the
+% best position is just before a new paragraph; the environment end
+% should be placed after a suitable number of full paragraphs, even
+% if not all of them are involved with wrapping.
+%
+% If the aspect ratio of the image to include is lower than~2, the
+% following message is printed in the document where the image
+% should appear (of course with |#1| replaced by the actual image
+% file name):\\[2ex]
+%\begin{minipage}{0.7\textwidth}
+%\begin{verbatim}
+% ===========================================
+% Figure #1 is not tall enough.
+% Consider using a display mode different
+% from VS; may be NF or RF are better suited.
+% ===========================================
+% Nothing done!
+% ===========================================
+%\end{verbatim}
+%\end{minipage}\\[2ex]
+% A similar action and a similar message is output if the \emph{scaled}
+% image width becomes too small.
+%
+%\item[\texttt{SW}]
+% This display mode is convenient when a really large
+% image requires two pages to display all its details; its aspect ratio
+% should be close to the aspect ratio of the total space
+% available for the two page spread; depending on the page design this
+% total space approximate value is probably around~0.5.
+% The object to be included in the document should start on an even
+% page, therefore it floats to the first even page available; this may
+% force a page break where the current page is not fully completed and
+% may be shorter than the other text pages; the user
+% then should help the automatic positioning by choosing very carefully
+% where to insert the \cs{DFfigure} command in the source text; possibly
+% the user should chose an end of paragraph close to the end of a page.
+% The command or the environment may be used even within a source file
+% paragraph; with a little attention: there should be no space between
+% the end document command and the first character of the following text.
+%
+%\item[\texttt{HS}]
+% This display mode is convenient when the initial image aspect
+% ratio is very small; if it is smaller than~0.3 its insertion
+% leaves enough space beneath the two image halves (plus caption)
+% so that normal text can fill the space under such spread wide
+% slim figure. The constraints described for display mode \texttt{SW}
+% apply also to this mode.
+%
+% \item[\texttt{FS}]
+% The \texttt{SW} mode occupies a spread without invading the lateral
+% margins; it simply occupies only the internal margin. On the opposite,
+% the \texttt{FS} Full Spread mode occupies also the lateral margins;
+% typically a full spread of two A4 pages, can contain a rotated A3 page,
+% without scaling down its contents. With this full occupation of both
+% facing pages, there is no room for any caption; therefore the actual
+% image, besides occupying an A3 page, should have a minimum white
+% margin around, so that a caption can be superimposed to the image white
+% part if its original bottom margin that, upon rotation, becomes the
+% right one, is large nough. If the original image has no margins, the
+% caption is typeset ove the image, but it may be colored with contrasting
+% color compared to the average background one.
+%
+% \item[\texttt{TH}]
+% This mode is suited for tall figures that do not show well when their
+% height is scaled to the text height; the upper and lower margins are
+% available for a larger scale factor; even the internal margin is
+% helpful to gain some space. In this case, though, the page header and
+% footer should be avoided and the figure caption should be set at the
+% image side, without any rotation; the little problem that arises in
+% this case is that the caption, always close to the external margin,
+% should not be rotated and its measure should be adapted in order to
+% properly use the horizontal space left on the page. If this space is
+% too narrow the figure, in spite if being taller then wide, is too
+% wide: it has an aspect ratio higher than one but not enough. This
+% display mode requires that the image has an aspect ratio greater
+% than, say, $\sqrt2$, otherwise the caption measure becomes too short.
+% A warning message is issued if the total space left on the page is
+% smaller than the external margin, where the caption would have the
+% same measure as a marginal note. In spite if this fact, compilation
+% goes on, and the attentive user not only evaluates the result,
+% and examines the \texttt{.log} file where he finds the explanation
+% of the possibly too bad result.
+% \item[\texttt{TW}]
+% A another Total Width mode is is defined such that the scaled
+% image and its (side) caption occupy the upper part of the page/paper.
+% The given image is scaled to occupy the internal margin plus 80\%
+% of the text block width; the remaining horizontal space is provided
+% for a side caption and its lateral spaces, If the aspect ratio
+% of the original image is not smaller than text block and internal
+% margin widths divided by the paper height, the scaling might produce
+% a scaled image too tall to fit into the paper. No tests are made
+% in this sense, but it is up to the user the best choice for
+% displaying a given image. On an A4 paper, depending on the page
+% design, the aspect ratio available should be approximately 1.8,
+% therefore this design accommodates a large number of different
+% aspect ratio images, from a not so slim tall portrait image to
+% a landscape image. A square image, scaled as described above,
+% may occupy approximately the upper half of the page.
+% The caption is always well typedset in the adjacent free space,
+% and it is possible to slightly modify its measure by using an
+% optional argument.
+%\end{description}
+%
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Acknowlegements}
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% This package would not exist if Heinrich Fleck did not need
+% to insert several large images in his documents; he asked
+% me to create suitable commands and/or environments and he tested
+% all the series of progressive developments of this package; believing
+% that this package might be useful to other \TeX\ users, he invited
+% me to submit the result to the \TeX\ community, and here it is.
+% Heinrich did not want his name as a co-author, because he insists
+% that he was “just” a tester. He was precious and I warmly thank him.
+%
+% Thanks also to Benedict Wilde who spotted some errors and suggested
+% the use of specific settings for the PDF viewer.
+%
+% Thanks also to the unknown person nicknamed “dylan.bacc” on the \GuIT\
+% forum, who induced me to work on the sixth display mode. I knew that
+% using the |memoir| class, with suitable settings, and having available
+% an advanced printer, it was possible to print documents with pages of
+% different formats and page designs; but this was not my aim: I wanted
+% something possibly independent from the document class and not
+% requiring any particular printer.
+% The seventh display mode came to our minds when we found tall figures
+% that did not show well scaled to the \emph{text block} height, but could
+% show better if scaled to \emph{paper} height, with the caption at their
+% side; actually we found that it was better to scale the image to a
+% width of the internal margin plus 80\% of the text width, and placing
+% the image flush to the upper paper border and to the spine. The eighth display mode is a varinat of the preceding one and allows to place some text beneath the image and caption block.
+%
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\newpage
+%\begin{thebibliography}{9}
+%\bibitem{bib:xparse} The \LaTeX3 Project, \emph{The \texttt{xparse} package} --- Document command parser. Release date 2020-05-15. PDF document readable with \texttt{texdoc xparse}.
+%\bibitem{bib:xfp} The \LaTeX3 Project, \emph{The \texttt{xfp} package} --- Floating Point Unit. Release date 2020-05-15. PDF document readable with \texttt{texdoc xfp}.
+%\bibitem{bib:Int3} The \LaTeX3 Project, \emph{The \LaTeX3 interfaces}. Release date 2020-09-24. PDF Document readable with \texttt{texdoc interface3}.
+%\bibitem{bib:graphics} D.P.~Carlisle and The \LaTeX3 Project, \emph{Packages in the `graphics' bundle}. Release date 2020-08-21. PDF document readable with \texttt{texdoc grfguide}.
+%\bibitem{bib:etoolbox} P. Lehman and J Wright, \emph{the \texttt{etoolbox} Package} --- An e-TeX Toolbox for Class and Package Authors. version 2.5j, released on 2020-08-24. PDF document readable with \texttt{texdoc etoolbox}.
+%\bibitem{bib:lscape} D.P. Carlisle, \emph{The \texttt{lscape} package}. Version 3.02 released on 2020-05-28. PDF document readable with \texttt{texdoc lscape}.
+%\bibitem{bib:afterpage} D.P. Carlisle, \emph{The \texttt{afterpage} package}. Version 1.08 released on 2014-10-28. PDF document readable with \texttt{texdoc afterpage}.
+%\bibitem{bib:wrapfig} D. Arseneau, \emph{The \texttt{wrapfig} package}. Version 3.6 released on 2003-01-31.
+%\bibitem{bib:memman} P. Wilson, \emph{The Memoir Class for Configurable Typesetting} ---User guide. Version 3.7m released 2020-09-10. PDF document readable with \texttt{texdoc memman}.
+%\end{thebibliography}
+%
+% \StopEventually{}
+%
+%\clearpage
+%
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{The code}
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+%\iffalse
+%<*package>
+%\fi
+% The required \TeX\ format with is date, and the identification of this
+% package have already ben inserted by the initial commands of this
+% documented file.
+%
+% Here we call the initial required packages and, since the necessary
+% software to define some \LaTeX3 (L3) language “functions” are already
+% part of the \LaTeX\ kernel, we just use them in order to define a
+% robust \LaTeXe/L3 interface to create some testing macros that accept
+% many logical operators that act on items that, besides boolean
+% variables, are also numerical expressions connected with relation
+% operators; for further details it suffices to examine the
+% |interface3.pdf| file, that is integral part of any recent \TeX\
+% system distribution. We needed also some commands to compare strings
+% or to check if a given string was included into an L3 sequence
+% (list) of strings.
+%
+% The syntax of the new testing macro is the following:
+%\begin{ttsyntax}
+%\cs{fptest}\marg{test}\marg{true}\marg{false}
+%\end{ttsyntax}
+% The logical operators that are usable in the \meta{text} phrase
+% are \verb+||+ (\texttt{OR}), \verb+&&+ (\texttt{and}), and \verb+!+
+% (\texttt{NOT}), plus other less common ones; the \verb+!+ negates the
+% status of boolean variables, but also the numerical relation operators;
+% these, on turn, may be paired so that, for example |>=| behaves as
+% as~|!<|.
+%
+% The comparisons of strings with the following syntax
+%\begin{ttsyntax}
+%\cs{CompStrings}\marg{string\ped{1}}\marg{string\ped{2}}
+%\end{ttsyntax}
+% Produces a boolean result that may be used as a \meta{test} argument
+% to |\fptest|.
+% The |\SetList| macro defines a named L3 sequence variable containing
+% the reference list of valid display modes, while the |\TestList| is
+% an L3 function that tests if a given string is listed in a named
+% sequence list. Their syntax is the following:
+%\begin{ttsyntax}
+%\cs{SetList}\marg{list name}\marg{comma separated string list}
+% \cs{TestList}\meta{string}\marg{list name}\marg{true}\marg{false}
+%\end{ttsyntax}
+% The fields \meta{true} and \meta{false}, as usual, are the actions
+% to be executed if the test is true or false; the test is true if
+% \meta{string} is listed into the \meta{named list}.
+%
+% Packages |graphicx|, |afterpage|, and |wrapfig| are functional
+% for this package. In order to avoid “Option Clash” error messages,
+% such packages are loaded without any option; should the user load
+% some or all of them with options, the user should load them
+% \emph{before} loading this package. This particular documentation
+% does not require the |graphicx| package, because it is already
+% loaded by |swfigure|.
+% \begin{macrocode}
+\RequirePackage{etoolbox}
+\RequirePackage{xfp}
+
+\ExplSyntaxOn
+\ProvideExpandableDocumentCommand\CompStrings{m m}{%
+ \str_if_eq_p:nn{#1}{#2}}
+
+ \ProvideExpandableDocumentCommand\fptest{m m m}{%
+ \fp_compare:nTF{#1}{#2}{#3}}
+
+ \ProvideExpandableDocumentCommand\SetList{m m}{%
+ \seq_clear_new:N #1
+ \seq_set_from_clist:Nn \DisplayModeList {#2}}
+
+ \ProvideExpandableDocumentCommand\TestList{m m m m}{%
+ \seq_if_in:NnTF #1 {#2}{#3}{#4}}
+
+\ExplSyntaxOff
+
+\RequirePackage{graphicx}
+\RequirePackage{afterpage}
+\RequirePackage{wrapfig}
+
+% \end{macrocode}
+% We define some dimension and some counter registers; to some dimensions
+% we assign parameters relating to the page design. We also compute
+% the dimensions of the available spread space so as to have available
+% the elements to compare the aspect ratios of the images and of the
+% available spaces. The |\if@SWtmode| switch is used by all text modes
+% in order to save the typesetting mode that was active when the
+% |\DFimage| command or the homonymous environment was used in the source
+% file; if it was in text mode, the switch is set to |true| and no spaces
+% should be present after the last argument of that macro or after the
+% closing environment statement; the result is that every service macro
+% shifts to vertical mode, but as soon as it is completed the switch test
+% restores the text mode. A blank line, though, after the command or the
+% environment starts a new paragraph.
+%
+% \begin{macrocode}
+\newdimen\internalmargin
+ \internalmargin=\dimexpr\oddsidemargin+1in+1bp\relax
+\newdimen\externalmargin
+ \externalmargin=\dimexpr\evensidemargin+1in
+\newdimen\spreadwidth
+ \spreadwidth=\dimexpr 2\textwidth+2\internalmargin\relax
+%
+\newdimen\DFwidth
+\newdimen\DFheight
+\newdimen\DFhalfwidth
+\newdimen\DFheight
+\newdimen\DFhalfheight
+\newdimen\FigSpace
+\newdimen\TScaptionwidth
+\def\SWcaptionShift{1em}%
+\def\FScaptionShift{2em}%
+\newsavebox\DFtotalimage
+\newsavebox\DFimageI
+\newsavebox\DFimageII
+\newsavebox\RFbox
+\newdimen\VS@textwidth
+\newcount\VS@lines
+\newif\if@SWtmode
+
+% \end{macrocode}
+% The following caption-like commands recompile the captions within
+% a zero height vertical box and deal with the mandatory and optional
+% arguments according to the following syntax:
+%\begin{ttsyntax}
+%\cs{DFcaption}\oarg{lof entry}\marg{caption}\oarg{label}\\[1ex]
+%\cs{DFcaptionP}\oarg{lof entry}\marg{caption}\oarg{label}
+%\end{ttsyntax}
+% Notice that the \meta{lof entry} defaults to the full caption text if
+% a different text is not explicitly entered.
+% These commands are specific to those display modes that compose
+% the caption in vertical direction, therefore the caption measure is the
+% |\textheight|.
+% \begin{macrocode}
+\NewDocumentCommand\DFcaption{O{#2} m o}{\refstepcounter{figure}%
+ \vtop to 0pt{\hsize=\textheight\parindent=0pt\leavevmode
+ Figure \thefigure\quad #2\vss}%
+ \addcontentsline{lof}{figure}{\protect\numberline{\thefigure}#1}
+ \IfValueT{#3}{\label{#3}}\relax%
+}
+\NewDocumentCommand\DFcaptionP{O{#2} m o D!!{\color{black}}}%
+ {\refstepcounter{figure}%
+ \vbox to 0pt{\vss\hsize=\textheight\parindent=0pt\leavevmode
+ #4\relax Figure \thefigure\quad #2}%
+ \addcontentsline{lof}{figure}{\protect\numberline{\thefigure}#1}
+ \IfValueT{#3}{\label{#3}}\relax%
+}
+
+
+% \end{macrocode}
+% The |\cleartoeven| command may already exist in the document class.
+% We prefer to make an absolute redefinition so as to be sure that it
+% performs as we need in this package. In any case this new definition
+% may be used in such a way that the |\DFimage| user command may be used
+% also while typesetting in text (horizontal) mode, resuming such mode
+% after complete expansion. This is useful, especially for spread wide
+% display modes, to chose the most suitable place in the source file to
+% place the |\DFimage| command with its arguments.
+% The |\cleartoeven| possibly inserts an empty page if the new page
+% is odd numbered; the |\cleartopage| simply clears the current page,
+% but it does not insert any empty page.
+%
+% \begin{macrocode}
+
+\newcommand\set@tmode@newpage{%
+\ifvmode
+ \@SWtmodefalse
+\else
+ \unskip\@SWtmodetrue\linebreak
+ \vadjust{\vspace{0pt plus1fill}\par}%
+\fi}
+
+\newcommand\reset@tmode{\if@SWtmode\expandafter\noindent\ignorespaces\fi}
+
+\newcommand\cleartoeven[1]{%
+ \set@tmode@newpage\clearpage
+ \ifodd\c@page\afterpage{#1}\else#1\fi%
+ }
+
+\newcommand\cleartopage{\set@tmode@newpage\clearpage}
+
+% \end{macrocode}
+% Now we define the “real” user macro necessary to chose the
+% \meta{display mode} and the various parameters necessary for the
+% desired one. See section~\ref{sec:Usage} on page\pageref{sec:Usage}
+% for its syntax and the other necessary arguments. Notice that only
+% two arguments are mandatory: the \meta{image file name} and the
+% \meta{caption} text. All the other eight optional parameters are
+% delimited by various delimiters; the first one, \meta{display mode}
+% has as default setting the acronym \texttt{SW} for a “Spread-Wide”
+% display mode; this mode was the one this package was initially
+% conceived for, and its initials recall this priority. All other
+% modes came afterwards. The other optional parameters may have a
+% default value, but they are ignored by certain modes that don't use
+% those parameters. As for the previous macro, for |\DFimage|
+% the \meta{lof entry} defaults to the full \meta{caption} text.
+%
+% Actually \cs{DFimage} just examines the \meta{display mode}, and
+% accordingly passes the necessary parameters to the actual macros
+% that implement the various mode displays. It outputs an error
+% message if the \meta{display mode} acronym was misspelt.
+% The |\DFimage| command (and environment) needs the full list
+% of arguments, whileand the |DFwarning| macros requires just
+% the two arguments it is going to actually use.
+% \begin{macrocode}
+\NewDocumentEnvironment{DFimage}%
+ { O{SW} m O{#4} m o D(){0.8} D<>{0} D||{0.25} D!!{} }%
+{%
+ \SetList{\DisplayModeList}{SW,HS,VS,FS,NF,RF,TH,TW}%
+ \TestList{\DisplayModeList}{#1}%
+ {\csuse{#1figure}{#2}[#3]{#4}[#5](#6)<#7>|#8|!#9!%
+ \fptest{\CompStrings{\@currenv}{DFimage}}{}{\reset@tmode}%
+ }%
+ {%
+ \DFwarning[#1]{#2}[#3]{#4}
+ }%
+}%
+{%
+ \aftergroup\reset@tmode
+}%
+
+\NewDocumentCommand\DFwarning{ o m o m }{%
+\PackageWarning{swfigure}%
+ {********************************************\MessageBreak
+ Option #1\space is not valid. Nothing done \MessageBreak
+ \MessageBreak
+ Image #2 was not processed \MessageBreak
+ ********************************************\MessageBreak
+ }%
+}
+
+% \end{macrocode}
+% In the following subsections the eight specific display mode macros
+% are examined and commented.
+%^^A=====================================
+% \subsection{The \cs{SWfigure} macro for Spread Wide images}
+%^^A=====================================
+%The specific macro for spread-wide images has the following syntax:
+%\begin{ttsyntax}
+%\cs{SWfigure}\marg{image file name}\oarg{lof entry}\marg{caption}\oarg{label}
+%\qquad\parg{height correction}\aarg{lines}|\meta{width thest}|!precaption!
+%\end{ttsyntax}
+% The various arguments have already been described; as you see the
+% \meta{display mode} argument is not there anymore, as well as the
+% last two optional arguments of |\DFfigure|. Notice that the
+% \meta{caption} text, the third argument of this macro, is used also
+% to initialise the \meta{lof entry}, so that if the user does not
+% specify such short caption entry, the default is identical to the
+% full caption. Notice the the last arguments are not actually used;
+% they are needed in the definition due to the way |DFimage| transfers
+% its arguments to the called macros.
+%
+% The working strategy is the following: the initial image to be divided
+% in two halves is stored in a box; this box is examined in order
+% to find its total width and heigh, so as to be able to compute the
+% aspect ratio. All other dimensions are examined to have available
+% all the necessary data to display the image halves in the requested
+% way.
+%
+% Notice that the |trim| option to |\includegraphics|, that is being
+% used to divide the initial image in two exact halves, maybe should
+% be used without specifying other options; but, most important,
+% it requires actual numbers, not macros; therefore we have to make
+% use of the usual “dirty” trick of defining an expanded macro
+% |\x| within a group that the macro itself closes upon its
+% expansion; in this way the optional argument of the |\includegraphics|
+% macro contains only keywords and numbers and may be executed
+% without errors.
+%
+% Let $W$ be the total spread width and $w$ be the original image
+% width; let $H$ be the text height and $h$ the original image height;
+% compute the $A_\mathrm{W}$ to be the aspect ratio of the spread
+% available space $H/W$. Similarly let $A_\mathrm{fig}$ be the initial
+% image aspect ratio; we have to scale the image with a
+% scaling factor such that the image keeps its aspect ratio, but
+% its scaled height does not exceed the text block height, and
+% its scaled width does not exceed the spread width; of course the
+% aim is to maintain the scaled image as large as possible therefore
+% we have to chose the most suited of the two scaling factors that
+% can be computed from the given data and the inequalities
+% described above.
+% In mathematical terms we have to chose the initial image scaling
+% factor $S$ such that:
+%\begin{equation}
+%S= \left\{
+% \begin{array}{lll}
+% w/W &\mathrm{if}& A_\mathrm{fig} \leq A_\mathrm{W}\\
+% h/H &\mathrm{if}& A_\mathrm{fig} > A_\mathrm{W}
+% \end{array}
+%\right.
+%\label{equ:ScalingFactor}
+%\end{equation}
+% This choice is made by testing the various ratios by means of
+% the L3 |\fptest| function, that computes such ratios and compares them.
+% The \meta{test} shows exactly which lengths are used to
+% compute the ratios, and which comparison is executed; the commented
+% line over the |\fptest| macro emphasises this correspondence. Once the
+% scaling factors are found the boxes containing the half figures
+% are scaled and further on are inserted in floating figure
+% environments; we use one of the dirty tricks: the matrioska dolls; this
+% metaphor describes nested |\makebox|es used to mask their actual
+% widths, but capable to push the images towards the spread spine.
+% Eventually the caption is set in the right margin of the right
+% spread page, rotated $90^\circ$ counterclockwise.
+% The |cleartoeven| guaranties that the first float is set into an even
+% numbered page. A final |\clearpage| ensures that both floats are
+% output.
+% \begin{macrocode}
+\NewDocumentCommand\SWfigure{m o m o d() d<> d|| d!!}{%
+\setbox\DFtotalimage=\hbox{\includegraphics{#1}}%
+\DFwidth=\wd\DFtotalimage \DFhalfwidth=0.5\DFwidth
+\DFheight=\ht\DFtotalimage
+\FigSpace=\dimexpr\textwidth+\internalmargin\relax
+%
+\setbox\DFimageI\hbox{\bgroup
+\edef\x{\egroup\noexpand\includegraphics*[%
+trim = 0 0 \the\DFhalfwidth\space 0]}\x{#1}}%
+%
+\setbox\DFimageII\hbox{\bgroup
+\edef\x{\egroup\noexpand\includegraphics*[%
+trim = \the\DFhalfwidth\space 0 0 0]}\x{#1}}%
+%
+% h/w > H/W
+\fptest{\DFheight/\DFhalfwidth > \textheight/\FigSpace}%
+ {\edef\DFscalefactor{\fpeval{\textheight/\DFheight}}}%
+ {\edef\DFscalefactor{\fpeval{\FigSpace/\DFhalfwidth}}}%
+%
+\setbox\DFimageI=\hbox{\scalebox{\DFscalefactor}{\usebox{\DFimageI}}}%
+\setbox\DFimageII=\hbox{\scalebox{\DFscalefactor}{\usebox{\DFimageII}}}%
+%
+\cleartoeven{%
+ \begin{figure}[p]%
+ \vbox to\textheight{\vss\hsize=\textwidth%
+ \makebox[\hsize][l]{\makebox[\FigSpace][r]{\box\DFimageI}}\vss}%
+ \end{figure}\newpage
+%
+ \begin{figure}[p]%
+ \vbox to\textheight{\vss\hsize=\textwidth
+ \makebox[\hsize][r]{\makebox[\FigSpace][l]{\box\DFimageII}%
+% Rotated caption in the right odd-numbered page
+ \makebox(0,0)[lb]{\hspace*{\SWcaptionShift}\raisebox{0.5\textheight}{%
+ \rotatebox[origin=tc]{90}{\DFcaption[#2]{#3}[#4]%
+ %
+ }}}}\vss}%
+ \end{figure}%
+}\clearpage\reset@tmode}
+
+% \end{macrocode}
+%^^A========================================
+%\subsection{The \cs{NFfigure} macro for normal full
+% page figures}
+%^^A========================================
+% This code is without surprises, except that it receives from the
+% |DFimage| selector macro five usable arguments (plus three more
+% ones that are not actually used); the fifth (optional) one
+% being delimited by round parentheses; by default, it contains the
+% value 0.8, but the user can pass to the selector macro a different
+% value in order to reduce the actual image size so as to leave
+% enough space beneath it for the caption; the user, in facts, does
+% not know in advance how many lines would occupy a structured
+% complex caption.
+% \begin{macrocode}
+\NewDocumentCommand\NFfigure{m o m o d() d<> d|| d!!}{%
+ \begin{figure}[p]
+ \includegraphics[width=\linewidth, height=#5\textheight,
+ keepaspectratio]{#1}%
+ \caption[#2]{#3}%
+ \IfValueT{#4}{\label{#4}}\relax
+ \end{figure}
+}
+
+% \end{macrocode}
+%^^A========================================
+% \subsection{The \cs{RFfigure} macro for rotated figures}
+%^^A========================================
+% There are no new comments to make about this almost standard
+% way of displaying a large figure, except, perhaps, the fact
+% the instead of invoking the |lscape| package, the whole figure
+% is rotated by means of rotating the very box that was used
+% to contain the scaled image; the selector macro does not pass
+% any \meta{height correction} argument to this macro, because
+% it automatically scales the box containing the image and
+% the caption so as to fill up the height or the width of the
+% text block. Of course the macro L3 signature includes also
+% the descriptors of unused arguments.
+% \begin{macrocode}
+\NewDocumentCommand\RFfigure{m o m o d() d<> d|| d!!}{%
+ \dimen8=\textwidth\dimen10=\textheight
+ \figure[p]\setbox\RFbox=\hbox{%
+ \rotatebox[origin=cc]{90}{\parbox[b][\dimen8][c]{\dimen10}%
+ {\centering\includegraphics[width=\dimen10, height=\dimen8,
+ keepaspectratio]{#1}%
+ \caption[#2]{#3}%
+ \IfValueT{#4}{\label{#4}}\relax%
+ }}}%
+ \edef\RFx{\fpeval{\ht\RFbox/\textheight}}%
+ \edef\RFy{\fpeval{\wd\RFbox/\textwidth}}%
+ \fptest{\RFx > \RFy}%
+ {\scalebox{\RFx}{\box\RFbox}}%
+ {\scalebox{\RFy}{\box\RFbox}}%
+ \endfigure}
+
+% \end{macrocode}
+%^^A========================================
+% \subsection{The \cs{VSfigure} macro for tall and slim figures}
+%^^A========================================
+% This is the most critical macro (because it depends
+% on the |wrapfig| package) in order to set the image with its
+% caption on the external side of the text block, with the text flowing
+% around it. Package |wrapfig| has several limitations concerning
+% the text that flows around the image. Nevertheless with a “normal”
+% textual contents of the text block the result may be very good.
+%
+% The user is recommended to attentively read the |wrapfig|
+% documentation because it has several limitations. Here we suggest
+% the user to open the environment just before a paragraph and
+% close it after several paragraphs; remember that since the opening
+% and the closing statements are far away from one another, it is
+% possible to forget this situation and insert another such
+% environment, or a |\DFimage| command, within the former one
+% and this will produce undesirable effects; never ever nest two
+% |Dfimage| environments and never ever insert a |\DFimage| command
+% within an environment.
+%
+% The user should help a little bit the correct performance of
+% this macro; for this reason, besides the \meta{height correction}
+% factor, the selector macro may pass to it also the \meta{line
+% correction} in order to correct the amount of lines the wrapping
+% text should be indented; by playing with both corrections
+% good results may be obtained.
+%
+% Notice that only with this macro a test on the initial image
+% aspect ratio is performed; should this image have an aspect ratio
+% smaller than~2, the process is aborted and a message is printed
+% in the output document that informs the user and recommends to
+% use another \meta{display mode} code.
+%
+% Furthermore, should the image be very slim and tall, the
+% \meta{height correction} may conveniently reduce its height,
+% but, in order to avoid changing its aspect ratio, it reduces
+% also its width; eventually the width is reduced to the point that
+% beneath the image there would not be enough space for a decently
+% typeset caption. A further optional delimited argument is available:
+% its delimiting tokens are two vertical bars, \verb+| |+, and its
+% default value is \texttt{0.25}. This means that if the scaled
+% image becomes narrower than this coefficient times the text width,
+% an other message is typeset in place of the figure. Depending on the
+% various elements that influence these tests, the user can try
+% different values for this coefficient, even reaching the value zero,
+% that eliminates such test on the scaled image width.
+%
+%
+% \begin{macrocode}
+\NewDocumentCommand\VSfigure{m o m o d() d<> d|| d!!}{%
+ \setbox\DFtotalimage=\hbox{\includegraphics{#1}}
+ \DFwidth=\wd\DFtotalimage \DFheight=\ht\DFtotalimage
+ \edef\VS@aspectratio{\fpeval{\DFheight/\DFwidth}}
+ \fptest{ \VS@aspectratio < 2 }%
+ {\begin{center}\ttfamily\relax
+ ===========================================\\
+ Image #1 is not tall enough. \\
+ Consider using a display mode different \\
+ from VS; may be NF or RF are better suited.\\
+ ===========================================\\
+ Nothing done! \\
+ ===========================================
+ \end{center}
+ }%
+ {\edef\VS@factor{\fpeval{#5\textheight/\DFheight}}%
+ \fptest{\VS@factor>1 || \VS@factor\DFwidth < #7\textwidth}%
+ {%
+ \begin{center}\ttfamily\relax
+ =================================================\\
+ The scaled image #1 is too slim. \\
+ Maybe directly using the wrapfig package might \\
+ solve this problem. \\
+ =================================================\\
+ Nothing done!\\
+ =================================================
+ \end{center}
+ }%
+ {\setbox\DFtotalimage=
+ \hbox{\scalebox{\VS@factor}{\box\DFtotalimage}}%
+ \edef\VS@width{\fpeval{\VS@factor*\DFwidth}\p@}%
+ \setbox\DFtotalimage=\vbox{\hsize=\VS@width%
+ \def\@captype{figure}\box\DFtotalimage
+ \caption[#2]{#3}%
+ \IfValueT{#4}{\label{#4}}\relax}
+ \VS@lines=
+ \fpeval{round(\ht\DFtotalimage/\baselineskip,0)+#6}%
+ \begin{wrapfigure}[\VS@lines]{o}[0pt]{\VS@width}%
+ \box\DFtotalimage
+ \end{wrapfigure}%
+ }%
+ }%
+ }%
+
+% \end{macrocode}
+%
+%^^A=====================================
+% \subsection{The \cs{HSfigure} macro for spread wide slim figures}
+%^^A=====================================
+%
+% The beginning of the macro is not so different from that used
+% for the |SWfigure| macro. But this time there is no alternative
+% to scale the image because only its width and the spread width are
+% significant. The new little problem, now, is to match the total
+% height of the two halves of the original wide and slim image,
+% so that the texts of the two facing pages have their respective
+% first lines perfectly aligned.
+%
+% Since the right half of the figure contains also the caption
+% it is necessary to box again the left page box so as to have
+% the same hight and depth as the right page one.
+% \begin{macrocode}
+\NewDocumentCommand\HSfigure{m o m o d() d<> d|| d!!}{%
+ \setbox\DFtotalimage=\hbox{\includegraphics{#1}}%
+ \DFwidth=\wd\DFtotalimage \DFhalfwidth=0.5\DFwidth
+ \FigSpace=0.5\spreadwidth%
+%
+ \setbox\DFimageI\hbox{\bgroup
+ \edef\x{\egroup\noexpand\includegraphics*[%
+ trim = 0 0 \the\DFhalfwidth\space 0]}\x{#1}}%
+%
+ \setbox\DFimageII\hbox{\bgroup
+ \edef\x{\egroup\noexpand\includegraphics*[%
+ trim = \the\DFhalfwidth\space 0 0 0]}\x{#1}}%
+%
+ \edef\DFscalefactor{\fpeval{\FigSpace/\DFhalfwidth}}%
+%
+ \setbox\DFimageI=\hbox{%
+ \scalebox{\DFscalefactor}{\usebox{\DFimageI}}}%
+ \setbox\DFimageII=\hbox{%
+ \scalebox{\DFscalefactor}{\usebox{\DFimageII}}}%
+ \setbox\DFimageII=
+ \hbox{\dimen10=\linewidth\dimen8\internalmargin
+ \vbox{\hsize\DFhalfwidth\parindent\z@
+ \box\DFimageII\par
+ \leavevmode\hspace*{\dimen8}%
+ \vtop{\hsize\dimen10\parindent\z@
+ \textwidth=\hsize
+ \DFcaption[#2]{#3}[#4]%
+ }\vspace*{2\baselineskip}%
+ }%
+ }%
+ \setbox\DFimageI=\vbox to\ht\DFimageII{\box\DFimageI\vss}%
+%
+ \cleartoeven{%
+ \hb@xt@\textwidth{%
+ \makebox[\DFhalfwidth][l]{\box\DFimageI}\hss}%
+%
+ \afterpage{\hb@xt@\textwidth{%
+ \hss\makebox[\DFhalfwidth][r]{\box\DFimageII}}%
+ }%
+ }%
+}
+
+% \end{macrocode}
+%
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\subsection{The \cs{FSfigure}~macro for Full Spread figures}
+%^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Although using certain classes, such as |memoir|, it is possible to
+% typeset documents on pages of different sizes and to print them on
+% advanced printers that use different sized papers, this package aims
+% to be independent form any class and any printer; it is limited to
+% the ordinary default paper size A4, as it is usual in Europe, but
+% letter paper is also valid; ideally it would typeset an A3 sized
+% image on a full spread, i.e. by filling also the space of all the
+% lateral margins.
+%
+% Actually with American paper sizes there is not a series of sizes
+% that behaves as the ISO A series, but this macro tries to adjust the
+% large image to the available full spread; this means an image as
+% large as two standard pages.
+%
+% If the available image is taller than large, with an aspect ratio
+% around~$\sqrt2$, it turns the image 90° counterclockwise; cuts it in
+% two identically sized halves, and sets them on two facing pages joining
+% them at the spine but covering the greatest part of both pages, so
+% as to avoid exceeding either the paper height or twice the paper width.
+% If the image has an landscape aspect ratio close to $\sqrt{1/2}$, it
+% does the same, except rotating the image.
+%
+% In any case the user creates a separate PDF file to be imported into
+% the document that is supposed to contain it; it is better if this PDF
+% is of vectorial type, i.e. any drawing and all fonts should be
+% vectorial; this PDF might contain photos or similar images of
+% rasterised type, but the pixel density should be suitably high in
+% order to preserve the image quality.
+%
+% The user has two choices: $(a)$ either the image has its own margins,
+% or $(b)$ the image is cropped and has no white margins.
+%
+% Normally this display mode does not leave space for a caption;
+% therefore if a caption is needed, it is overprinted on the image;
+% in case $(a)$ there are no problems because the caption goes over
+% the white right margin (rotated 90° counterclockwise); while in
+% case $(b)$ the caption is over printed on the right side of the
+% image; depending on the image “background” a different color
+% might be more suited compared to the the default color (black).
+% The last macro argument takes care of inserting before the caption
+% any declaration that may involve color, displacement, font encoding
+% (seldom necessary), family, series, shape and size;
+%
+% With all the above constraints the syntax of this \cs{FSimage}
+% macro is the following; it uses one of the main macro delimited
+% optional arguments in a different way:
+%\begin{ttsyntax}\setfontsize{9.25}%
+%\cs{FSimage}\marg{image file name}\oarg{lof entry}\marg{caption text}\oarg{label string}
+%\qquad\parg{height correction}\aarg{line correction}\barg{width text}!\meta{precaption}!
+%\end{ttsyntax}
+% The above is the full definition, but the fifth, sixth and seventh
+% arguments are not used; they are necessary for the special
+% mechanism of argument transfer from the environment or command
+% opening statement arguments to this actual macro.
+%
+% Moreover, since the included image overlaps the top and bottom
+% margins, if these contain the header and footer such elements
+% would show if the image is not sufficiently opaque; in any case the
+% footer would show because it overlaps the image. Since most
+% images are not really opaque it is better to locally use the
+% \texttt{empty} page style, but without using the |\thispagestyle|
+% command, because it holds for just one page, while the spread
+% occupies two pages. The macro provides this setting but it has
+% to create a group in case the |\DFimage| command is used, while
+% it is not necessary when using the |DFimage| environment,
+% therefore the current environment is tested and the opening
+% |\bgroup| and closing |\egroup| commands are used only if the
+% code is used without the environment.
+%
+% Therefore the code steps are the following:
+%\begin{enumerate}[noitemsep]
+%\item
+% The initial figure is loaded into a box from which the necessary
+% measures are taken; in particular its width and its height in
+% order to check the aspect ratio, or better, which dimension is greater
+% than the other. If the height is smaller than the width the image is
+% sort of landscape and we proceed splitting the total image box into
+% two equal halves, with a vertical cut in the middle.
+%\item
+% Otherwise the image is as a portrait, and we split the total image
+% block into two halves with an horizontal cut in the middle; such two
+% boxes need a rotation of 90° anticlockwise due to the horizontal cut of
+% an original that was higher than wide image. With this operation we
+% simulate a rotation of the original image, because it is not allowed to
+% simultaneously rotate and trim the original image; the trimming
+% action apparently cannot be executed together with any other one
+% among the many other that the |\includegraphics| command can
+% do\footnote{Actually it can, provided that the trim option with
+% its arguments is specified before any other option.}.
+% Of course, with this rotation of the half pictures we have to
+% redefine the height and width to use for scaling.
+%\item
+% The |\fptest| is used to compare the aspect ratios of any of the two
+% equal halves with the aspect ratio of the paper. If the former
+% aspect ratio is higher than the latter, the scaling factor is
+% based on the heights, otherwise on the widths, so as to resize
+% both half picture boxes to fit within the paper.
+%\item
+% The |\cleartoeven| command allows to use the main macro even within
+% a paragraph; in any case it possibly inserts a blanc page and restarts
+% working on an even page. First is sets the left half picture box;
+% that complicated series of vertical and horizontal boxes of different
+% specified dimensions contains displacements and the material to output;
+% That complicated alternating set is to guarantee that no overfull
+% vertical or horizontal boxes are created, in spite of the fact that
+% an object larger than the text block is being output; at the same
+% time the box must be flush right in order to reach the spine.
+%\item
+% The right half is even more complicated to build, because there
+% is also the caption to set on the right of the page, overwriting
+% the right part of the image, but the idea is always to close
+% correctly every box putting the right spacing commands at the
+% beginning or at the end of each box.
+%\item
+% Eventually a |\clearpage| flushes out everything that is still in
+% the figure stack and possibly restores the vertical or horizontal
+% typesetting mode depending on the status that was in force when
+% the |\DFimage| command or the |DFimage| environment started their
+% expansion.
+% Due to the size of the images that completely fill up all the
+% margins, probably the best way to output such huge images is at
+% the end of a chapter, or at the end of the whole document.
+%\end{enumerate}
+% \begin{macrocode}
+\NewDocumentCommand\FSfigure{m o m o d() d<> d|| d!!}{%
+ \fptest{\CompStrings{\@currenv}{DFimage}}{}{\bgroup}%
+ \pagestyle{empty}%
+ \setbox\DFtotalimage=\hbox{\includegraphics{#1}}%
+ \DFwidth=\wd\DFtotalimage \DFheight=\ht\DFtotalimage
+ \ifdim \DFheight < \DFwidth
+ \DFhalfwidth=0.5\DFwidth
+ \setbox\DFimageI\hbox{\bgroup
+ \edef\x{\egroup\noexpand\includegraphics*[%
+ trim = 0 0 \the\DFhalfwidth\space 0]}\x{#1}}%
+ \setbox\DFimageII\hbox{\bgroup
+ \edef\x{\egroup\noexpand\includegraphics*[%
+ trim = \the\DFhalfwidth\space 0 0 0]}\x{#1}}%
+ \DFwidth=\DFhalfwidth \DFheight=\ht\DFtotalimage
+ \else
+ \DFhalfheight=0.5\DFheight
+ \setbox\DFimageII\hbox{\bgroup
+ \edef\x{\egroup\noexpand\includegraphics*[%
+ trim = 0 0 0 \the\DFhalfheight\space]}\x{#1}}% bottom half
+ \setbox\DFimageI\hbox{\bgroup
+ \edef\x{\egroup\noexpand\includegraphics*[%
+ trim = 0 \the\DFhalfheight\space 0 0]}\x{#1}}% tophalf
+ \setbox\DFimageI=\hbox{\rotatebox[origin=cc]{90}{\box\DFimageI}}
+ \setbox\DFimageII=\hbox{\rotatebox[origin=cc]{90}{\box\DFimageII}}
+ \DFwidth=\DFhalfheight \DFheight=\wd\DFtotalimage
+ \fi
+\fptest{\DFheight/\DFwidth > \paperheight/\paperwidth}%
+ {\edef\DFscalefactor{\fpeval{\paperheight/\DFheight}}}%
+ {\edef\DFscalefactor{\fpeval{\paperwidth/\DFwidth}}}%
+ \setbox\DFimageI=\hbox{\scalebox{\DFscalefactor}{\usebox{\DFimageI}}}%
+ \setbox\DFimageII=\hbox{\scalebox{\DFscalefactor}{\usebox{\DFimageII}}}%
+\cleartoeven{%
+ \begin{figure}[p]%
+ \vbox to\textheight{\vss\hsize=\textwidth% vbox 1
+ \hbox to\hsize{\hspace*{-\externalmargin}% hbox 1
+ \vbox to\paperheight{\vss% vbox 2
+ \hbox to\paperwidth{\hss\box\DFimageI}% hbox 2 end hbox 2
+ \vss}% end vbox 2
+ \hss}% end hbox 1
+ \vss}% end vbox 1
+ \end{figure}\newpage
+%
+ \begin{figure}[p]%
+ \vbox to\textheight{\vss\hsize=\textwidth% vbox 1
+ \hbox to\hsize{\hspace*{-\internalmargin}% hbox 1
+ \vbox to\paperheight{\vss% vbox 2
+ \hbox to\paperwidth{% hbox 2
+ \box\DFimageII\makebox(0,0)[lb]{% mbox 3
+ \hspace*{-\FScaptionShift}%
+ \raisebox{0.5\textheight}{% raisebox
+ \rotatebox[origin=bc]{90}{% rotatebox
+ \DFcaptionP[#2]{#3}[#4]!#8!%
+ }% end rotatebox
+ }% end raisebox
+ }% end mbox 3
+ }% end hbox 2
+ \vss}% end vbox 2
+ \hss}% end hbox 1
+ \vss}% end vbox 1
+ \end{figure}%
+}\clearpage
+\fptest{\CompStrings{\@currenv}{DFimage}}{}{\egroup}%
+\reset@tmode}
+
+% \end{macrocode}
+%
+%^^A========================================
+%\subsection{The \cs{THfigure} macro for the Total Height figure}
+%^^A========================================
+% This Total Height display mode exploit the total paper height to
+% scale a figure and sets the image close to the spine independently
+% from the fact that the spine ins on the right of even numbered
+% pages, and on the left on odd numbered ones; a test is made on the
+% page parity, that in any case is going to contain only the figure
+% with its caption and nothing else. For this reason the macro provides
+% a \cs{cleartopage} at the beginning and another similar command on the
+% end. As usual this macro is not supposed to be used by the user,
+% who should use the command \cs{DFimage}; using the environment
+% is recommended if it is used within a paragraph, but it should not
+% include any text.
+%
+% The full syntax is the following:
+%\begin{ttsyntax}\setfontsize{9.25}%
+%\cs{FSimage}\marg{image file name}\oarg{lof entry}\marg{caption text}\oarg{label string}
+%\qquad\parg{caption width percent}\aarg{line correction}\barg{width text}!\meta{precaption}!
+%\end{ttsyntax}
+% although the last three arguments are not used.
+%
+% All the code before the first \cs{cleartopage} command is used to
+% examine the dimensions of the original image, and to perform the
+% necessary assignments to the various dimensions and boxes. The
+% test on the relationship between the \cs{DFwidth} image width and
+% the sum of the text and internal margin widths is to compute the
+% caption measure and assign the result to the dimension
+% register \cs{TScaptionwidth}; this width is tested to control if it
+% is too small; in case a warning message is issued.
+%
+% The following question is natural: When is this display mode
+% convenient? After all, also the \texttt{VS} display mode applies
+% to tall and slim images, so this \texttt{TH} mode and the other
+% \texttt{VS} mode are in competition. In a way they are, but their
+% results are very different; The latter mode produces images non
+% larger than half the test block and not taller than the text block.
+% The former mode produces images that are taller than the text block
+% and possibly larger than the text block. Therefore this is one of
+% the possible criteria to chose which display mode is more suitable
+% for a given image. another other criterion deals with the image aspect
+% ratio and the available space aspect ratio; since the height of the
+% \texttt{TH} scaled image is fixed, the user should pay attention to
+% its width; the scaled image width, in facts, should not exceed the
+% sum of the internal margin width and the test block one, otherwise
+% the space for the caption becomes too small and a warning message
+% is issued. At the same time if the scaled image width is smaller
+% than approximately one half of the text width plus the internal
+% margin one, the space remaining for the caption becomes too large.
+%
+% After that the |figure| environment is coded starting with
+% the control on the page parity; depending on this parity different
+% dirty tricks with several kinds of boxes are performed so as to
+% set into the page a huge block that fills all the available vertical
+% space on the paper; the parity influences the order in which the various
+% embedded boxes interact with one another, but the main point is
+% that the box containing the caption must be on the external side
+% of the box containing the image; its measure may be fine tuned
+% (increased or reduced) with respect to available white space; the
+% argument \meta{caption width percent} delimited by round parentheses
+% by default equals 0.8, but the user can specify a different value
+% to the selector macro, so that the caption measure is that specified
+% percentage of the computed caption width.
+%
+% After closing the |figure| environment a final \cs{clearpage} is
+% issued so that the figures stack remains completely empty; in
+% particular the current figure is output, but the initial typesetting
+% mode is restored, so that if the environment was specified in the
+% middle of a paragraph the paragraph continues to be typeset without
+% problems; of course if the environment is followed by a blanc line,
+% such settings become ineffective because a new paragraph is started.
+% The end of the \cs{DFimage} command provides to close the group,
+% therefore all the assignments to the various registers are restored.
+% \begin{macrocode}
+\NewDocumentCommand\THfigure{m o m o d() d<> d|| d!!}{%
+ \setbox\DFtotalimage=\hbox{\includegraphics{#1}}%
+ \DFheight=\ht\DFtotalimage \DFwidth=\wd\DFtotalimage
+ \edef\DFscalefactor{\fpeval{\paperheight/\DFheight}}
+ \setbox\DFimageI\hbox{%
+ \scalebox{\DFscalefactor}{\usebox{\DFtotalimage}}}%
+ \DFwidth=\wd\DFimageI
+ \ifdim\dimexpr\paperwidth-\DFwidth < 2\externalmargin\relax
+ \PackageWarning{swfigure}{%
+ *******************************************\MessageBreak
+ Figure #1 is too wide to be set in a \MessageBreak
+ Total Height display mode. \MessageBreak
+ There is not enough space for its caption. \MessageBreak
+ Expect questionable results. \MessageBreak
+ *******************************************\MessageBreak}%
+ \fi
+ \FigSpace=\DFwidth
+ \dimen10=\dimexpr\topmargin+1in-(\paperheight-\headsep-\headheight
+ -\textheight-\footskip)/2\relax
+ \TScaptionwidth=\dimexpr\paperwidth-\FigSpace-3\columnsep\relax
+ \cleartopage
+ \thispagestyle{empty}%
+ \begin{figure}
+ \ifodd\c@page\relax% odd page
+ \begin{minipage}[c][\textheight][t]{\textwidth}% minibox1
+ \vspace*{\dimen10}%
+ \makebox[\textwidth][l]{\hspace*{-\internalmargin}% hbox2
+ \vbox to\textheight{\vss% vbox3
+ \hbox to\paperwidth{% hbox4
+ \parbox{\FigSpace}{\box\DFimageI}%
+ \hspace{\columnsep}%
+ \makebox[\TScaptionwidth]{%
+ \parbox{#5\TScaptionwidth}{%
+ \caption[#2]{#3}\IfValueT{#4}{\label{#4}}\relax}%
+ }%
+ }% end hbox4
+ \vss}% end vbox3
+ }% end hbox2
+ \end{minipage}% end minibox1
+ \else % even page
+ \begin{minipage}[c][\textheight][t]{\textwidth}
+ \vspace*{\dimen10}%
+ \makebox[\textwidth][l]{\kern-\externalmargin
+ \vbox to\textheight{\vss
+ \hbox to\paperwidth{\hss
+ \hbox to\TScaptionwidth{\hss
+ \parbox{#5\TScaptionwidth}{%
+ \caption[#2]{#3}\IfValueT{#4}{\label{#4}}\relax}%
+ }\hspace{\columnsep}%
+ \parbox{\FigSpace}{\box\DFimageI}%
+ }\vss
+ }%
+ }%
+ \end{minipage}%
+ \fi
+ \end{figure}%
+ \clearpage\reset@tmode
+}
+% \end{macrocode}
+%
+%^^A========================================
+%\subsection{The \texttt{TW} for the Total Width
+% image plus its side caption}
+%^^A========================================
+% This particular mode is a variant of the \texttt{FH} full height mode,
+% where scaling of a not sufficiently narrow image, may produce a figure
+% that does not exceed the page dimesions, but that might leave such a
+% small narrow strip of white space to typeset the caption that it comes
+% out as a very poorly typeset object. This other \texttt{TW} does not
+% have this drawback, but it might produce figures that exceed the paper
+% height in order to remain within the preset limits foreseen for a nicely
+% typeset side caption.
+%
+% Some details are pretty delicate, but let us start from the beginning.
+% The seven code lines afterthe first one, are the usual lines similar
+% to those at the beginning of the other macros; The original image is
+% stored in a box, from which all possible metric informations are derived
+% and the scaling factor is computed; afterward the boc is scaled
+% according to the computed scaling factor, and re-stored into the
+% same box.
+%
+% Command |\cleartopage| behaves as usual and sets the |\if@SWtmode|
+% so as to be able to restore the typesetting modo (horizontal or
+% vertical) at the end of this macro expansion. This means, also,
+% that for this display mode both the command and the homonymous
+% environment |DFimage| may be used.
+%
+% The page style is set to |empty|, so that the full width block may
+% be set flush to the top of the paper, without overwriting any page
+% decoration; even the possible folio in the bottom margin is not
+% overwritten onto the image.
+%
+% The test for the parity of the folio number is taken; the true and
+% the false branches are very similar, bat the actions that differ
+% because depend on the folio parity are interspersed between the
+% other code lines. This is why two |figure|environments are defined,
+% even if their contents is pretty similar.
+%
+% We comment the true branch for odd numbered figures, and with slight
+% changes they equal those for the even numbered page; Therefore we
+% omit the latter.
+%
+% We box the figure and the caption into an |\hbox| named |\DFimageII|;
+% the image box |\DFimageI| si typeset inside a |\parbox| were the measure
+% is specified as the boxed image width. The |\parbox| as well as the
+% following |minipage| environment are but vertically centred, so that
+% we are sure that the caption median will coincide with that of the
+% boxed image. As you see the caption is at the right of the boxed
+% image, and in an odd numbered page the caption is close and partially
+% over the external margin; the opposite takes place for the even
+% numbered pages, and again the caption is close or over such page
+% external margin.
+%
+% We can now measure the various geometric properties of the image-caption
+% block; notice that his block is large as the internal margin plus
+% spaces plus the caption for a total of |\paperwidth|. We should
+% keep this in mind in order to re-box the block into a |\textwidth|
+% wide box with the necessary stretch and shrink horizontal glue
+% in oder to let it fit the paper width wich is larger that the
+% text width
+
+% Moreover we measure the upper white margin, that is white, because
+% of the |empty| page style, but the header box, its separator from
+% the text, the |\topmargin| with its 1~inch offset, in order to raise
+% the image-caption box to be flush to the upper paper border.
+% Now we can fill up a vertical box of the computed height; this box
+% is inside the text block, but it must overlap the upper vertical
+% space so the real height of this box is smaller than its contents
+% and a vertical stretch and shrink glue is necessary.
+% Eventually with these nestes vertical and horizontal boxes we can
+% output the whole contents and the result is as we expected.
+% \begin{macrocode}
+\NewDocumentCommand\TWfigure{m o m o d() d<> d|| d!!}{%
+ \setbox\DFtotalimage=\hbox{\includegraphics{#1}}%
+ \DFheight=\ht\DFtotalimage \DFwidth=\wd\DFtotalimage
+ \FigSpace=\dimexpr\internalmargin+0.80\textwidth\relax
+ \TScaptionwidth=\dimexpr\paperwidth-\FigSpace-2\columnsep\relax
+ \edef\DFscalefactor{\fpeval{\FigSpace/\DFwidth}}
+ \setbox\DFimageI=\hbox{\scalebox{\DFscalefactor}{\box\DFtotalimage}}
+ \DFwidth=\wd\DFimageI \DFheight\ht\DFimageI
+ \cleartopage
+ \thispagestyle{empty}%
+ \ifodd\value{page}% odd numbered page
+ \begin{figure}
+ \setbox\DFimageII=\hbox{%
+ \parbox{\FigSpace}{\box\DFimageI}\hspace{\columnsep}%
+ \begin{minipage}{\TScaptionwidth}\centering
+ \parbox{#5\hsize}{\caption[#2]{#3}%
+ \IfValueT{#4}{\label{#4}}\relax}%
+ \end{minipage}
+ }%
+ \DFheight=\ht\DFimageII \dimen8=\dp\DFimageII
+ \advance\DFheight by\dp\DFimageII
+ \dp\DFimageII=\z@ \ht\DFimageII=\DFheight
+ \dimen10=\fpeval{\topskip+1in+\headheight+\headsep}\p@
+ \advance\dimen8 by\baselineskip
+ \advance\DFheight by-\dimen10\relax
+ \vbox to\DFheight{\vss
+ \hbox{\raise \dimen8\hbox to\textwidth{%
+ \hspace{-\internalmargin}\box\DFimageII\hss}}%
+ }%
+ \end{figure}
+ \else% even numbered page
+ \begin{figure}
+ \setbox\DFimageII=\hbox{%
+ \begin{minipage}{\TScaptionwidth}\centering
+ \parbox{#5\hsize}{\caption[#2]{#3}%
+ \IfValueT{#4}{\label{#4}}\relax}%
+ \end{minipage}
+ \hspace{\columnsep}%
+ \parbox{\FigSpace}{\box\DFimageI}
+ }%
+ \DFheight=\ht\DFimageII \dimen8=\dp\DFimageII
+ \advance\DFheight by\dp\DFimageII
+ \dp\DFimageII=\z@ \ht\DFimageII=\DFheight
+ \dimen10=\fpeval{\topskip+1in+\headheight+\headsep}\p@
+ \advance\dimen8 by\baselineskip
+ \advance\DFheight by-\dimen10\relax
+ \vbox to\DFheight{\vss
+ \hbox{\raise \dimen8\hbox to\textwidth{\hss%
+ \box\DFimageII\hspace{-\internalmargin}}}%
+ }%
+ \hbox to\textwidth{\hspace{-\internalmargin}\box\DFimageII\hss}
+ \end{figure}%
+ \fi
+ \reset@tmode
+}
+
+% \end{macrocode}
+%
+%\vspace*{2\baselineskip}
+%\noindent\makebox[\textwidth]{\setfontsize{10mm}
+%\color{red} HAPPY \LaTeX-ing}
+%\iffalse
+%</package>
+%\fi
+%
+% \Finale
+%
+%\endinput
+%
+%
diff --git a/Master/texmf-dist/source/latex/teubner/teubner.dtx b/Master/texmf-dist/source/latex/teubner/teubner.dtx
index f7b457ada7d..6383a88a937 100644
--- a/Master/texmf-dist/source/latex/teubner/teubner.dtx
+++ b/Master/texmf-dist/source/latex/teubner/teubner.dtx
@@ -4,7 +4,7 @@
\input docstrip.tex
\keepsilent
\preamble
-Copyright 2001--2015 Claudio Beccari All rights reserved.
+Copyright 2001--2021 Claudio Beccari All rights reserved.
This system is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,21 +15,10 @@ dated 2008-05-04 or later as it appears in
CTAN/macros/latex/base/lppl.tex.
See the end of the file.
-IMPORTANT NOTICE:
-
-You are allowed to distribute this file under the conditions that are
-specified in the source file teubner.dtx.
-
-If you receive only some of these files from someone, complain!
-
-You are NOT ALLOWED to distribute this file alone.
-You are NOT ALLOWED to take money for the distribution or use
-of either this file or a changed version, except for a nominal
-charge for copying, etc.
\endpreamble
\postamble
It may be distributed and/or modified under the
- conditions of the LaTeX Project Public License, either version 1.3
+ 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
@@ -47,14 +36,14 @@ charge for copying, etc.
%
% \iffalse
%^^A The following trick uses the same date for every file header.
-%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\NeedsTeXFormat{LaTeX2e}[2020-01-01]
%<*driver>
\ProvidesFile{teubner.dtx}[%
%</driver>
%<package>\ProvidesPackage{teubner}[%
%<tbtx>\ProvidesPackage{teubnertx}[%
%<*driver,package,tbtx>
-2016/03/31 v.4.8
+2021/02/08 v.5.4
%<package>Extensions for Greek philology]
%<tbtx>Access to the LGR encoded Greek fonts that match the TX fonts]
%</driver,package,tbtx>
@@ -78,6 +67,13 @@ charge for copying, etc.
\renewcommand*\meta[1]{{\normalfont\textlangle\textit{#1}\textrangle}}
\newcommand*\pack[1]{\textsf{#1}}
\newcommand*\acro[1]{\expandafter\textsc\expandafter{\MakeLowercase{#1}}}
+ \providecommand\cs{}
+ \renewcommand\cs[1]{\textnormal{\texttt{\bslash#1}}}
+ \providecommand\marg{}
+ \renewcommand\marg[1]{\textnormal{\ttfamily\{\meta{#1}\}}}
+ \newcommand\Marg[1]{\textnormal{\ttfamily\{#1\}}}
+ \renewcommand\oarg[1]{\textnormal{\ttfamily[\meta{#1}]}}
+ \newcommand\Oarg[1]{\textnormal{\ttfamilt[#1]}}
\usepackage{multicol}
\usepackage[T1]{fontenc}
\usepackage{lmodern,textcomp}
@@ -88,7 +84,7 @@ charge for copying, etc.
%</driver>
% \fi
%
-% \CheckSum{4368}
+% \CheckSum{4133}
% \begin{multicols}{2}\tableofcontents\end{multicols}
%
%
@@ -97,8 +93,8 @@ charge for copying, etc.
% package so as to enable the use of the Lipsian\footnote{What here
% are called Lipsian fonts are a family of fonts that in Greece are
% called ``Lipsiakos''; they are similar to the ones that were being
-% used in the Teubner Printing Company of Lipsia from mid XIX century on.}
-% fonts and to use several macros for inserting special annotations
+% used in the Teubner Printing Company of Lipsia from mid XIX century
+% on.} fonts and to use several macros for inserting special annotations
% in the written text, as well as to typeset verses with special
% layout. Metric sequences may be defined and typeset by means of a
% companion font \texttt{gmtr????} that follows the same conventions
@@ -107,15 +103,16 @@ charge for copying, etc.
%
% Examples and lists of commands are available in the file
% \texttt{teubner-doc.pdf} which, as a regular pdf file, embeds all
-% the necessary fonts and may be read on screen as well as printed on paper;
-% beware, though, that the PostScript fonts that are being used
+% the necessary fonts and may be read on screen as well as printed on
+% paper; beware, though, that the PostScript fonts that are being used
% in \texttt{teubner-doc.pdf} are not installed by default if a basic
% installation is sought.
%
-% This version 4.0 tries to adapt to the new handling of the Greek language
-% by \babel, since now this language script is based on the
-% LICR (\LaTeX\ Internal Character Representation), and source files now can
-% include Greek glyphs, besides the usual transliteration with Latin letters.
+% This version 4.0 tries to adapt to the new handling of the Greek
+% language by \babel, since now this language script is based on the
+% LICR (\LaTeX\ Internal Character Representation), and source files
+% now can include Greek glyphs, besides the usual transliteration with
+% Latin letters.
% \end{abstract}
%
% \section{Introduction}
@@ -143,11 +140,11 @@ charge for copying, etc.
% end I think that the new typeface turned out pretty well thanks to
% both my friends.
%
-% The Lipsian font, also called Leipzig, or Lipsiakos in Greece, is one of the
-% oblique fonts that used to be employed by the typesetters working in the
-% German city of Leipzig, among which the Teubner Printing Company.
-% This Company's classical works of ancient Greek poetry are considered among
-% the best ever published. The name of this file and this extension
+% The Lipsian font, also called Leipzig, or Lipsiakos in Greece, is one of
+% the oblique fonts that used to be employed by the typesetters working in
+% the German city of Leipzig, among which the Teubner Printing Company.
+% This Company's classical works of ancient Greek poetry are considered
+% among the best ever published. The name of this file and this extension
% package is in honour of that printing company.
%
% This package documentation does not contain any example written in
@@ -162,9 +159,9 @@ charge for copying, etc.
% package; should he forget, this package will complain. But once the
% |greek| option is properly declared, this package verifies that the
% |polutonikogreek| dialect (deprecated) is selected, or that the
-% |polutoniko| attribute or modifier is set; if no attribute is set this package
-% will set |polutoniko| or |ancient| depending on the presence of an
-% updated Greek support to the \babel\ package. This choice depends on
+% |polutoniko| attribute or modifier is set; if no attribute is set this
+% package will set |polutoniko| or |ancient| depending on the presence of
+% an updated Greek support to the \babel\ package. This choice depends on
% the particular version of the \babel\ package, but should not concern
% the user; switching back and forth between classical Greek and some
% modern western language is performed in a transparent way; possibly
@@ -180,74 +177,79 @@ charge for copying, etc.
% \acro{ctan} in the directory \texttt{/fonts/greek/cb} have
% been completed with the new files for the Lipsian fonts, and the metric
% symbols font \texttt{gmtr????.*}; the latter does not need a formal font
-% definition file, because the necessary definitions are included in this package.
-% All fonts are available also as Type~1 scalable fonts. In general, recent
-% distributions of the \TeX\ system already contain the necessary
-% configuration to use the Type~1 font in one size, 10\,pt, but, thanks to
-% scaling, these can be used at any size; this version of \textsf{teubner}
-% is compatible with this reduced set. If optical sizes are desired for
-% a more professional typesetting, the \acro{ctan} archives contain also
-% the \textsf{cbgreek-full} package, which includes also all the Type~1
-% fonts at the various standard (EC) sizes, plus other facilities that allow
-% to use the CB fonts also in conjunction with the Latin Modern ones. Complete
-% installations of the \TeX\ system include the full CB fonts installation.
+% definition file, because the necessary definitions are included in this
+% package. All fonts are available also as Type~1 scalable fonts. In
+% general, recent distributions of the \TeX\ system already contain the
+% necessary configuration to use the Type~1 font in one size, 10\,pt, but,
+% thanks to scaling, these can be used at any size; this version of
+% \textsf{teubner} is compatible with this reduced set. If optical sizes
+% are desired for a more professional typesetting, the \acro{ctan} archives
+% contain also the \textsf{cbgreek-full} package, which includes also all
+% the Type~1 fonts at the various standard (EC) sizes, plus other
+% facilities that allow to use the CB fonts also in conjunction with the
+% Latin Modern ones. Complete installations of the \TeX\ system include the
+% full CB fonts installation.
%
% The CB Greek fonts allow to input Greek text with a Latin keyboard and
% by employing the prefix notation; with a Greek keyboard and file
-% \texttt{iso-8859-7.def} it is possible to directly input Greek text with the
-% monotonic spelling; if polytonic spelling is required I fear that the above
-% file is of little help and that a Latin keyboard does the job without
-% an excessive burden. The recent modifications to the \babel\ package and of the
-% Greek language description file allow to enter also polytonic Greek text,
-% keyboard permitting, with no effort; it is necessary to use the |utf8|
-% input encoding. It's important to notice the Apple computers have available
-% a virtual keyboard (called keyboard viewer) that is operable with the mouse
-% and, just by selecting the \emph{Greek Polytonic} keyboard driver, the
-% author can enter Greek text directly in the source file. Computer with a
-% touch screen virtual keyboard allow to switch from the national to
-% the Greek keyboard just by a single sweep of the finger. Some platforms
-% have the possibility of switching keyboard but they don't show the new
-% keyboard layout on the screen, but the user can generally build a personal
-% table that describes the correspondence between the key board and the
-% physical keyboard layout. Windows operating system Win8 has available
-% a virtual keyboard similar to the Mac's.
+% \texttt{iso-8859-7.def} it is possible to directly input Greek text with
+% the monotonic spelling; if polytonic spelling is required I fear that the
+% above file is of little help and that a Latin keyboard does the job
+% without an excessive burden. The recent modifications to the \babel\
+% package and of the Greek language description file allow to enter also
+% polytonic Greek text, keyboard permitting, with no effort; it is
+% necessary to use the |utf8| input encoding. It's important to notice the
+% Apple computers have available a virtual keyboard (called keyboard
+% viewer) that is susable with the mouse and, just by selecting the
+% \emph{Greek Polytonic} keyboard driver, the author can enter Greek text
+% directly in the source file. Computers with a touch screen virtual
+% keyboard allow to switch from the national to the Greek keyboard just by
+% a single sweep of the finger. Some platforms have the possibility of
+% switching keyboard but they don't show the new keyboard layout on the
+% screen, but the user can generally build a personal table that describes
+% the correspondence between the keyboard and the physical keyboard layout.
+% Windows operating system Win8 and later has available a virtual keyboard
+% similar to the Mac's.
%
% Nevertheless there is a little point to observe; Lipsian fonts are very
% nice but show some kerning errors with more evidence than the traditional
-% Didot Greek fonts. With the prefix notation in force, kerning programs may
-% result disabled and some diphthongs and some consonant-vowel combinations
-% appear poorly matched when the second letter caries any diacritical mark. In
-% order to avoid this ``feature'', the accented vowels may be input by means of
-% macros, that directly translate to the accented glyph, rather than invoking the
-% ligature programs that are implied by the prefix notation; reading a Greek text
-% on the screen while editing the input \texttt{.tex} file when a Latin
-% keyboard and such macros are used may be very strange, but authors get
-% used to it, and agree that the effort is worth the result. The direct input
-% of Greek glyphs, evidently is the real solution, even if it may be difficult
-% to enter Greek glyphs without a suitable virtual keyboard or a suitable
-% keyboard map.
+% Didot Greek fonts. With the prefix notation in force, kerning programs
+% may result disabled and some diphthongs and some consonant-vowel
+% combinations appear poorly matched when the second letter caries any
+% diacritical mark. In order to avoid this ``feature'', the accented vowels
+% may be input by means of macros, that directly translate to the accented
+% glyph, rather than invoking the ligature programs that are implied by the
+% prefix notation; reading a Greek text on the screen while editing the
+% input \texttt{.tex} file when a Latin keyboard and such macros are used
+% may be very strange, but authors get used to it, and agree that the
+% effort is worth the result. The direct input of Greek glyphs, evidently
+% is the real solution, even if it may be difficult to enter Greek glyphs
+% without a suitable virtual keyboard or a suitable keyboard map.
%
% \section{Environments}
-% I apologise if I chose Italian names for verse environments; I wanted to
-% use names very different from the corresponding English ones, but at the
-% same time easily recognisable; after all \emph{versi} is the plural of
-% \emph{verso} and therefore is the exact Italian translation of \emph{verses}.
-% If you feel more comfortable with Latin, the alias environment names
-% in Latin, |versus|, |Versus|, and |VERSUS|, are also available.
+% I apologise if I chose Italian names for verse environments; I wanted
+% to use names very different from the corresponding English ones, but
+% at the same time easily recognisable; after all \emph{versi} is the
+% plural of \emph{verso} and therefore is the exact Italian translation
+% of \emph{verses}. If you feel more comfortable with Latin, the alias
+% environment names in Latin, |versus|, |Versus|, and |VERSUS|, are also
+% available.
%
% \DescribeEnv{versi}
%\DescribeMacro{\verso}
% The environment \texttt{versi} (|versus|) is used to typeset verses
-% in line, without an implicit end of line at the end of each verse; a vertical
-% bar with a number on top of it marks the verse limit while allowing a numeric
-% reference to a specific verse; the opening environment statement requires
-% a string, a short text, in order to indent the verse lines the amount of
-% this string width; the syntax is the following
+% in line, without an implicit end of line at the end of each verse; a
+% vertical bar with a number on top of it marks the verse limit while
+% allowing a numeric reference to a specific verse; the opening environment
+% statement requires a string, a short text, in order to indent the verse
+% lines the amount of this string width; the syntax is the following
% \begin{sintassi}
-% \bslash begin\lbr versi\rbr\lbr\meta{string}\rbr{}
-% \meta{verse}\bslash verso[\meta{starting number}]\meta{verse}\bslash verso
-% \meta{verse}\bslash verso\meta{verse}\dots{}
-% \bslash end\lbr versi\rbr
+% \cs{begin}\Marg{versi}\marg{string}
+% \meta{verse}\cs{verso}\oarg{starting number}\marg{verse}
+% \cs{verso} \marg{verse}
+% \cs{verso}\marg{verse}
+% \dots{}
+% \cs{end}\Marg{versi}
% \end{sintassi}
% where, of course, \meta{starting number} is required only for the first
% instance of |\verso| or when numbering must be restarted, for example
@@ -255,37 +257,38 @@ charge for copying, etc.
%
% \DescribeEnv{Versi}
% The environment \texttt{Versi} (|Versus|) is similar to the
-% standard \LaTeX\ environment \texttt{verse}, except verse lines are numbered
-% on multiples of~5; the opening statement requires the \meta{starting
-% number} as an optional argument; if this optional argument is not specified,
-% the starting number is assumed to be~1.
+% standard \LaTeX\ environment \texttt{verse}, except verse lines are
+% numbered on multiples of~5; the opening statement requires the
+% \meta{starting number} as an optional argument; if this optional argument
+% is not specified, the starting number is assumed to be~1.
% \begin{sintassi}
-% \bslash begin\lbr Versi\rbr[\meta{starting number}]
-% \meta{verse}\bslash\bslash{}\meta{*}[\meta{vertical space}]
-% \meta{verse}\bslash\bslash{}
+% \cs{begin}\Marg{Versi}\oarg{starting number}
+% \meta{verse}\cs{\bslash*}\oarg{vertical space}
+% \meta{verse}\cs{\bslash}
% \dots{}
-% \bslash end\lbr Versi\rbr
-%\end{sintassi}
+% \cs{end}\Marg{Versi}
+% \end{sintassi}
%
% \DescribeEnv{VERSI}
% \DescribeMacro{\SubVerso}
% \DescribeMacro{\NoSubVerso}
-% The environment \texttt{VERSI} (|VERSUS|) allows for two verse
-% enumerations; the main enumeration is identical to the one performed by
-% the previous environment \texttt{Versi}, while the secondary enumeration
-% is in smaller digits and normally numbers consecutive verses, except
-% that it can be turned on and off; the verses that lack the secondary
-% enumeration are indented by moving them to the right.
+% The environment \texttt{VERSI} (|VERSUS|) allows for two
+% verse-enumerations; the main enumeration is identical to the one
+% performed by the previous environment \texttt{Versi}, while the secondary
+% enumeration is typeset with smaller digits and normally numbers
+% consecutive verses, except that it can be turned on and off; the verses
+% that have the secondary enumeration are indented by moving them to the
+% right.
% \begin{sintassi}
-% \bslash begin\lbr VERSI\rbr[\meta{starting principal number}]
-% \meta{verse}\bslash\bslash\meta{*}[\meta{vertical space}]
-% \bslash SubVerso[\meta{starting secondary number}]
-% \meta{verse}\bslash\bslash\meta{*}[\meta{vertical space}]
+% \cs{begin}\Marg{VERSI}\oarg{starting principal number}
+% \meta{verse}\cs{\bslash*}\oarg{vertical space}
+% \cs{SubVerso}\oarg{starting secondary number}
+% \meta{verse}\cs{\bslash*}\oarg{vertical space}
+% \dots{}
+% \cs{NoSubVerso}
+% \meta{verse}\cs{\bslash*}\oarg{vertical space}
% \dots{}
-% \bslash NoSubVerso
-% \meta{verse}\bslash\bslash\meta{*}[\meta{vertical space}]
-% \dots
-% \bslash end\lbr VERSI\rbr
+% \cs{end}\Marg{VERSI}
% \end{sintassi}
% where if \meta{starting principal number} is missing, 1 is assumed,
% while if \meta{starting secondary number} is missing, the enumeration
@@ -294,107 +297,138 @@ charge for copying, etc.
% enumeration must be restarted; there are no means to restart the
% principal enumeration.
%
-% \DescribeEnv{bracedmetrics} The previous environments accept \meta{verses}
-% in any language and in any alphabet, the one that is in force before opening
-% the environment; the language and, even less, the alphabet cannot be
-% globally changed within the above environments; if such a change is performed,
-% it is valid only for one verse, or for the remaining fraction of the verse
-% after the language or font change. This means, among the other things, that
-% if the default ``alphabet'' is the one that shows the metric symbols,
-% the above environments may be used to display ``metric verses'', that is the
-% pattern of long, short or ancipital symbols, together with any other metric
-% symbol so as to display the metrics without disturbing the written text; when
-% doing this metric typesetting, it may happen that some verse patterns exhibit
-% some variants; in this case the \texttt{bracedmetrics} environment comes handy,
-% because it can display such variants in separate lines but grouped with a large
-% right brace; some commands allow to roughly align these variants, so as to
-% allow to nest several such environments as if they were single blocks of metric
-% symbols. The argument of the opening statement specifies the width of the
-% block so as to align properly all the symbols even in nested environments.
+% \DescribeEnv{bracedmetrics}
+% The previous environments accept \meta{verses} in any language and in
+% any alphabet, the one that is in force before opening the environment;
+% the language and, even less, the alphabet cannot be globally changed
+% within the above environments; if such a change is performed, it is
+% valid only for one verse, or for the remaining fraction of the verse
+% after the language or font change. This means, among the other things,
+% that if the default ``alphabet'' is the one that shows the metric
+% symbols, the above environments may be used to display ``metric
+% verses'', that is the pattern of long, short or ancipital symbols,
+% together with any other metric symbol so as to display the metrics
+% without disturbing the written text; when doing this metric
+% typesetting, it may happen that some verse patterns exhibit some
+% variants; in this case the \texttt{bracedmetrics} environment comes
+% handy, because it can display such variants in separate lines but
+% grouped with a large right brace; some commands allow to roughly
+% align these variants, so as to allow to nest several such
+% environments as if they were single blocks of metric symbols.
+% The argument of the opening statement specifies the width of the
+% block so as to properly align all the symbols even in nested
+% environments.
% \begin{sintassi}
-% \bslash begin\lbr bracedmetrics\rbr\lbr\meta{length}\rbr{}
-% \meta{metric pattern}\bslash\bslash
-% \meta{metric pattern}\bslash\bslash
+% \cs{begin}{bracedmetrics}\marg{length}
+% \meta{metric pattern}\cs{\bslash}
+% \meta{metric pattern}\cs{\bslash}
% \dots{}
-% \bslash end\lbr bracedmetrics\rbr
+% \cs{end}{bracedmetrics}
% \end{sintassi}
-% \DescribeMacro{\verseskip}\DescribeMacro{\Hfill} Within the \meta{metric
-% pattern} it is possible to flush right the symbols
-% by prefixing the whole string with a |\Hfill| command; the \meta{length} may
-% be specified as an integer multiple of a ``long'' symbol by means of
+%
+% \DescribeMacro{\verseskip}\DescribeMacro{\Hfill}
+% Within the \meta{metric pattern} it is possible to flush right the
+% symbols by prefixing the whole string with a |\Hfill| command; the
+% \meta{length} may be specified as an integer multiple of a ``long''
+% symbol by means of
%\begin{sintassi}
-% \bslash verseskip\lbr\meta{number}\rbr
+% \cs{verseskip}\marg{number}
%\end{sintassi}
% The macro |\verseskip| can be used also within \meta{metric pattern}
% in order to space out metric symbols.
%
% \section{Commands and symbols}
-% This package defines a lot of commands for inserting special signs in the middle
-% of regular text, for marking zeugmas and synizeses, for putting unusual accents
-% on any symbol, for inserting special ``parentheses'' that are used by
-% philologists for marking blocks of letters or blocks of text. I suggest that the
-% user reads the documentation file \texttt{teubner-doc.pdf} for a complete
-% list of commands and symbols.
-%
-% \DescribeMacro{\newmetrics} Here it might be useful to describe a command
-% for defining metric sequences, so as to shorten the definition of metric verses;
-% this new command is |\newmetrics| and may be used for the definition of new
-% commands whose name \emph{may start with one digit}: precisely this digit may be
-% one of~2, 3,~4. Even if \LaTeX\ does not allow macros to contain both digits
-% and letters, other service macros have been defined so as to handle these
-% special control sequences even if they start with \emph{one} digit strictly
-% lower than~5. The syntax is:
+% This package defines a lot of commands for inserting special signs
+% in the middle of regular text, for marking zeugmas and synizeses,
+% for putting unusual accents on any symbol, for inserting special
+% ``parentheses'' that are used by philologists for marking blocks of
+% letters or blocks of text. I suggest that the user reads the
+% documentation file \texttt{teubner-doc.pdf} for a complete list
+% of commands and symbols.
+%
+% \DescribeMacro{\newmetrics} Here it might be useful to describe a
+% command for defining metric sequences, so as to shorten the
+% definition of metric verses; this new command is |\newmetrics|
+% and may be used for the definition of new commands whose name
+% \emph{may start with one digit}: precisely this digit may be one
+% of~2, 3,~4. Even if \LaTeX\ does not allow macros to contain both
+% digits and letters, other service macros have been defined so as
+% to handle these special control sequences even if they start with
+% \emph{one} digit strictly lower than~5. The syntax is:
% \begin{sintassi}
-% \bslash newmetrics\lbr\meta{control sequence}\rbr\lbr\meta{definition}\rbr
+% \cs{newmetrics}l\marg{control sequence}\marg{definition}
% \end{sintassi}
-% where \meta{definition} consists in general of a sequence of metric commands
-% such as |\longa|, |\brevis|, |\anceps|, etc.
+% where \meta{definition} consists in general of a sequence of metric
+% commands such as |\longa|, |\brevis|, |\anceps|, etc.
%
% \section{Acknowledgements}
% I must thank with gratitude Paolo Ciacchi that urged me to prepare this
-% extension file in order to help him typeset his master thesis of philological
-% kind in classical Greek.
-%
-% I am pleased to thank G\"unter Milde who wrote a definition file for accessing
-% the LGR encoded fonts in order to fetch the accented glyphs; I kindly gave me
-% permission to use his macros, that I adapted to the conventions used within this
-% file. These macros were saved into the definition file |LGRaccent-glyph.def|, so
-% that it could be used also without the |teubner| package, for example for
-% typesetting without setting the \emph{polutoniko} language attribute. But
-% since he became the maintainer of the Greek language support for the \babel\
-% package, he extended this support to the point that the extended macros are
+% extension file in order to help him typeset his master thesis of
+% philological kind in classical Greek.
+%
+% I am pleased to thank G\"unter Milde who wrote a definition file for
+% accessing the LGR encoded fonts in order to fetch the accented glyphs;
+% he kindly gave me permission to use his macros, that I adapted to the
+% conventions used within this file. These macros were saved into the
+% definition file |LGRaccent-glyph.def|, so that it could be used also
+% without the |teubner| package, for example for typesetting without
+% setting the \emph{polutoniko} language attribute. But since he became
+% the maintainer of the Greek language support for the \babel\ package,
+% he extended this support to the point that the extended macros are
% already part of the new Greek support files.
%
-% I got some ideas also from a paper that Werner Lemberg published on Eutypon, the
-% magazine of the Hellenic Friends of \TeX, where he discussed in a constructive
-% critical way the problems connected with the LGR encoded fonts and the Unicode
-% encoding.
-%
-% Now the new Greek support for the \babel\ package, thanks to G\"unter Milde,
-% includes also the support for Unicode input in the source file, in spite of
-% using LGR encoded output fonts. The actual support is partially useful also
-% with XeLaTeX and LuaLaTeX.
+% I thank also Werner Lemberg who wrote a paper published on
+% Eutypon, the magazine of the Hellenic Friends of \TeX, where he
+% discussed in a constructive critical way the problems connected with
+% the LGR encoded fonts and the Unicode encoding; I got some ideas also
+% from that paper in order to get around some of his critical
+% observations; I could get around all points he commented, and some
+% progress was achieved.
+%
+% Now the new Greek support for the \babel\ package, thanks to G\"unter
+% Milde, includes also the support for Unicode input in the source file,
+% in spite of using LGR encoded output fonts. The actual support is
+% partially useful also with XeLaTeX and LuaLaTeX.
+%
+% This package is far from perfect, but it allows to do a loto of things
+% that is difficult to find elsewhere. I did my best, but I had to cope
+% with the limitations of the Type~1 256 glyph fonts; with XeLaTeX or
+% LuaLaTeX it might be possible to have more functionalities, but, as
+% Werner Lemberg described, in order to type accented Greek letters,
+% these programs deal with two different approaches: one directly
+% accesses the Unicode page containing such glyphs, and the other
+% relies on self combining diacritics; the latter approach appears
+% to be more flexible in order to get the multitude of diacritics the
+% philology sometimes requires over or under the same letter, but this
+% forbids proper kerning; the former approach takes care of the correct
+% kerning, but has a limited number of diacritic combinations. These
+% approaches are mutually exclusive, therefore the philologist must
+% get to compromises; at the same time any program must follow either
+% approach, possibly choosing which one with suitable options, but it
+% cannot switch back and forth continually and automatically.
%
% \StopEventually{}
%
% \section{Code}
% \subsection{Preliminaries}
-% In order to use the PostScript pfb fonts (CM, EC, and CB) it is necessary to
-% know if we are dealing with \LaTeX\ or pdf\LaTeX; this was necessary because
-% apparently the pfb math scalable fonts derived from the \textsf{META\-FONT}
-% counterparts do not have exactly the same effective dimensions; this is why
-% the ``zeugma'' and the ``synizesis'' signs have to be corrected when the pfb
-% fonts are used; with these, in facts, the black leader that joins the curved
-% extremities appeared a little too fat and did not join exactly the left mark.
-% Recently, apparently, the fonts have been corrected and this trick is not
-% necessary any more. Nevertheless we define a new boolean that copes with the
-% fact that at least since 2007 the \TeX\ engine is \textsf{pdftex} even when DVI
-% output is sought; the package \pack{iftex} creates three |\if|s that allow to
-% diagnose if the typesetting engine is \textsf{pdftex} in PDF mode,
-% \textsf{XeTeX} or \textsf{Luatex}; since at the moment this package
-% \pack{teubner} is compatible only with \textsf{pdftex} in PDF mode, we equate
-% the |\ifPDF| switch (defined in previous versions of \pack{teubner}) with the
-% switch defined by package \pack{iftex}:
+% In order to use the PostScript pfb fonts (CM, CM-Super, and CB) it is
+% necessary to know if we are dealing with \LaTeX\ or pdf\LaTeX; this was
+% necessary because apparently the pfb math scalable fonts derived from the
+% \textsf{META\-FONT}% counterparts and do not have exactly the same
+% effective dimensions; this is why the ``zeugma'' and the ``synizesis''
+% signs have to be corrected when the pfb fonts are used; with these, in
+% facts, the black leader that joins the curved extremities appeared a
+% little too fat and did not join exactly the left mark.
+% Recently, apparently, the fonts have been corrected and this trick is
+% not necessary any more. Nevertheless we define a new boolean that
+% copes with the fact that, at least since 2007, the \TeX\ engine is
+% \textsf{pdftex} even when DVI output is sought; the package
+% \pack{iftex} creates three |\if|s that allow to diagnose if the
+% typesetting engine is \textsf{pdftex} in PDF mode, \textsf{XeTeX}
+% or \textsf{Luatex}; since at the moment this package \pack{teubner}
+% is usable only with \textsf{pdftex} in PDF mode, we equate the
+% |\ifPDF| switch (defined in previous versions of \pack{teubner}) with
+% the switch defined by package \pack{iftex}:
%\iffalse
%<*package>
%\fi
@@ -402,8 +436,9 @@ charge for copying, etc.
\RequirePackage{iftex}
\let\ifPDF\ifPDFTeX
% \end{macrocode}
-% When \texttt{teubner.sty} is input the language Greek must have been already
-% defined; otherwise an error message is issued and processing is terminated.
+% When \texttt{teubner.sty} is input the language Greek must have been
+% already defined; otherwise an error message is issued and processing is
+% terminated.
% \begin{macrocode}
\ifx\captionsgreek\undefined
\PackageError{teubner}{Greek language unknown!\MessageBreak
@@ -413,6 +448,7 @@ Use the babel package greek option.\MessageBreak
Type X <return> to exit.}%
{Type X <return> to exit.}
\fi
+
% \end{macrocode}
% If this test is passed, this means that not only the greek option to the \babel\
% package is set, but also that all the \babel\ machinery is available.
@@ -551,60 +587,61 @@ Type X <return> to exit.}%
\fi
\RequirePackage{graphicx}
\RequirePackage{ifthen}
+\RequirePackage{etoolbox}
% \end{macrocode}
%
-% \begin{macro}{\metricsfont} Similarly the metric symbol font is declared
-% together with a command for selecting it:
+% \begin{macro}{\metricsfont} Similarly the metric symbol font
+% is declared together with a command for selecting it:
% \begin{macrocode}
\DeclareFontFamily{U}{mtr}{\hyphenchar\font\m@ne}
\ifonesizetypeone
\DeclareFontShape{U}{mtr}{m}{n}{<-> gmtr1000}{}%
\else
\DeclareFontShape{U}{mtr}{m}{n}{%
- <-5.5> gmtr0500 <5.5-6.5> gmtr0600
- <6.5-7.5> gmtr0700 <7.5-8.5> gmtr0800
- <8.5-9.5> gmtr0900 <9.5-11> gmtr1000
- <11-15> gmtr1200 <15-> gmtr1728}{}%
+ <-5.5> gmtr0500 <5.5-6.5> gmtr0600
+ <6.5-7.5> gmtr0700 <7.5-8.5> gmtr0800 <8.5-9.5> gmtr0900
+ <9.5-11> gmtr1000 <11-15> gmtr1200 <15-> gmtr1728}{}%
\fi
\DeclareFontShape{U}{mtr}{m}{it}{<->ssub*mtr/m/n}{}%
\DeclareFontShape{U}{mtr}{b}{it}{<->ssub*mtr/m/n}{}%
\DeclareFontShape{U}{mtr}{b}{n}{<->ssub*mtr/m/n}{}%
\newcommand*\metricsfont{\fontencoding{U}\fontfamily{mtr}\upshape}
% \end{macrocode}
-% \end{macro}
-% Next we require the package for extensible math fonts; it might be strange to
-% use extensible math fonts in Greek philology, but a certain glyph must be picked
-% up from such fonts, with the assurance that it changes size together with the
-% current font size.
+% \end{macro} Next we require the package for extensible math fonts;
+% it might be strange to use extensible math fonts in Greek philology,
+% but a certain glyph must be picked up from such fonts, with the
+% assurance that it changes size together with the current font size.
% \begin{macrocode}
\RequirePackage{exscale}
% \end{macrocode}
%
-% Some macros are necessary to switch languages; such macros must be independent
-% (at least for now) from the particular \babel\ version, whether it be version
-% 3.6, 3.7, 3.8, or~3.9; in the former the concept of ``language attribute'' is
-% unknown, while the latter recognises varieties of the same language by the
-% attribute setting.
+% Some macros are necessary to switch languages; such macros must be
+% independent (at least for now) from the particular \babel\ version,
+% whether it be version 3.6, 3.7, 3.8, or~3.9; in the former the concept
+% of ``language attribute'' is unknown, while the latter recognises
+% varieties of the same language by the attribute setting.
% With \babel\ version 3.9g things have further changed; the attribute
-% to a language may be appended to the language name with an interposed dot;
-% for example for Greek it might be |greek.polutoniko|.
+% to a language may be appended to the language name with an interposed
+% dot; for example for Greek it might be |greek.polutoniko|.
% Such macros, besides being as robust as possible, must provide the
% alphabet changes as required.
%
%\begin{macro}{\GreekName}
% During the language switching operations |\GreekName|
% distinguishes the variant or the main language whose attribute
-% gets set and, evidently, becomes effective when the main language |greek|
-% is in force. Notice that if the |greek.ldf| has a date previous to 2014/09/18,
-% the attribute |ancient| may not be defined; in this case the |polutoniko|
-% attribute is set, else the |ancient| attribute is selected. The difference
-% is that the attribute |polutoniko| selects the polytonic spelling and the
-% modern Greek hyphenation, while |ancient| selects the polytonic spelling and
-% the classical Greek hyphenation. It is assumed that this |teubner| package
-% gets used for philological purposes only for ancient Greek. Nevertheless,
-% if some work on modern polytonic Greek philological document is being
-% typeset, the |ancient| attribute may work satisfactorily, but with some
-% possible ``ancient'' line breaks.
+% gets set and, evidently, becomes effective when the main language
+% |greek|
+% is in force. Notice that if the |greek.ldf| has a date previous to
+% 2014/09/18, the attribute |ancient| may not be defined; in this case
+% the |polutoniko| attribute is set, else the |ancient| attribute is
+% selected. The difference is that the attribute |polutoniko| selects
+% the polytonic spelling and the modern Greek hyphenation, while
+% |ancient| selects the polytonic spelling and the classical Greek
+% hyphenation. It is assumed that this |teubner| package
+% gets used for philological purposes only for ancient Greek.
+% Nevertheless, if some work on modern polytonic Greek philological
+% document is being typeset, the |ancient| attribute may work
+% satisfactorily, but with some possible ``ancient'' line breaks.
% \begin{macrocode}
\ifx\languageattribute\undefined
\def\GreekName{polutonikogreek}%
@@ -629,13 +666,13 @@ Type X <return> to exit.}%
%\begin{macro}{\previouslanguage}
%\begin{macro}{\previousencoding}
% The ``default'' language is defined as the
-% ``previous'' language; similarly the ``default'' encoding is defined as the
-% ``previous'' encoding; these are the language and the encoding in force when the
-% document starts; this is why such macros are defined at the beginning of the
-% document. At the same time we assure that if the CM (or EC) or the LM fonts are
-% the default ones, nothing special is done, while if the default fonts are, say,
-% the TX ones, they are correctly restored, but the CM families are used for the CB
-% ones.
+% ``previous'' language; similarly the ``default'' encoding is defined
+% as the ``previous'' encoding; these are the language and the encoding
+% in force when the document starts; this is why such macros are defined
+% at the beginning of the document. At the same time we assure that if
+% the CM (or EC) or the LM fonts are the default ones, nothing special
+% is done, while if the default fonts are, say, the TX ones, they are
+% correctly restored, but the CM families are used for the CB ones.
%\end{macro}
%\end{macro}
%
@@ -910,21 +947,22 @@ Type X <return> to exit.}%
%\begin{macro}{\textlatin}
% |\textlatin| is a redefinition of the standard \babel\ macro that is adapted to
% the present situation, where it may be called behind the scenes in certain
-% situations that are beyond the control of the typesetter. Therefore every
-% precaution is taken in order to be sure that the composition of the command
-% argument is really done with the default encoding but maintaining the current
-% font familY, series and shape; of course, if the shape is that
-% related to the Lipsian font, then the italic shape is temporarily restored
-% (local definition). Moreover, with the (default) Latin fonts the tilde is
-% restored to a non breaking space by simply making it an active character.
+% situations that are beyond the control of the typesetter. Therefore
+% every precaution is taken in order to be sure that the composition of the command
+% argument is really done with the default encoding and font families, but
+% maintaining the current series and shape; of course, if the shape is that related
+% to the Lipsian font, then the italic shape is temporarily restored (local
+% definition). Moreover, with the (default) Latin fonts the tilde is restored to a
+% non breaking space by simply making it an active character.
% \begin{macrocode}
\DeclareRobustCommand\textlatin[1]{\edef\externalencoding{\f@encoding}{%
- \def\itdefault{it}\def\@tempA{li}\ifx\@tempA\f@shape\def\f@shape{it}\fi%
- \expandafter\select@language\expandafter{\previouslanguage}%
- \fontencoding{\previousencoding}\selectfont
- \bbl@activate{~}#1}%
- \expandafter\fontencoding\expandafter{\externalencoding}}
-
+ \def\itdefault{it}\def\@tempA{li}\ifx\@tempA\f@shape\def\f@shape{it}\fi
+ \expandafter\select@language\expandafter{\previouslanguage}%
+ \fontencoding{\previousencoding}%
+ \fontfamily{\rmdefault}\selectfont
+ \bbl@activate{~}#1}%
+ \expandafter\fontencoding\expandafter{\externalencoding}\rmfamily}
+
% \end{macrocode}
%\end{macro}
%
@@ -1215,10 +1253,10 @@ Type X <return> to exit.}%
% Some LICR definitions are necessary to use \pack{teubner}, but some of them
% are really important; therefore G\"unter Milde developed package
% \pack{textslpha} that comes with the other special files for the Greek LICR
-% encoding, that avoids any conflict;we load it at the |\begin{document}|
+% encoding, that avoids any conflict; we load it at the |\begin{document}|
% execution so that it will be loaded only if necessary:
% \begin{macrocode}
-\AtBeginDocument{\RequirePackage{textalpha}}
+\AtEndPreamble{\RequirePackage{textalpha}}
% \end{macrocode}
%
% \subsection{Special accent macros}
@@ -1555,22 +1593,22 @@ Type X <return> to exit.}%
%\begin{macro}{\Sampi}
%\begin{macro}{\Euro}
%\begin{macro}{\permill} S
-% These macros, too, are defined by the \texttt{lgrenc.def} file and subsidiaries,
-% but with different names; therefore we make some aliases:
-% \begin{macrocode}
-\let\stigma\textstigma
+% These macros, too, are defined by the \texttt{lgrenc.def} file and
+% subsidiaries, but with different names; therefore we make some aliases.
+% We exclude to use the modern koppa sign (zig-zag koppa) so we let its
+% commands equal to the old koppa.; at the same time, for backwards
+% compatibility, we let also the variant name |\varkoppa| to address
+% the ancient glyph. For the digit~6 in the `units' position, we foresee
+% to use either the true stigma glyph or the digamma one.
+% \begin{macrocode}
+\let\stigma\textstigma \let\Stigma\textStigma
\let\varstigma\textvarstigma
-\let\koppa\textkoppa
+\let\koppa\textkoppa \let\Koppa\textQoppa
\let\qoppa\textqoppa
-\let\coppa\textqoppa
-\let\Koppa\textQoppa
-\let\Coppa\textQoppa
\let\varkoppa\textqoppa
-\let\sampi\textsampi
-\let\Stigma\textStigma
-\let\Sampi\textsampi
-\let\f\textdigamma
-\let\F\textDigamma\let\Digamma\F
+\let\coppa\textqoppa \let\Coppa\textQoppa
+\let\sampi\textsampi \let\Sampi\textSampi
+\let\f\textdigamma \let\F\textDigamma \let\Digamma\F
\let\Euro\texteuro
\let\permill\textperthousand
\let\schwa\textschwa
@@ -1842,8 +1880,8 @@ Type X <return> to exit.}%
%\begin{macro}{\yod}
%\begin{macro}{\iod}
% Macros |\yod| and |\iod| are used to insert a
-% Latin ``j'' while typesetting in Greek; the control sequence |\jod| was avoided in
-% order to reduce the possibility of typing |\jot| which is a \TeX\ internal
+% Latin ``j'' while typesetting in Greek; the control sequence |\jod| was avoided
+% in order to reduce the possibility of typing |\jot| which is a \TeX\ internal
% dimension.
% \begin{macrocode}
\DeclareTextCommand{\h}{\GRencoding@name}%
@@ -1864,21 +1902,19 @@ Type X <return> to exit.}%
%\begin {macro}{\F}
%\begin {macro}{\digamma}
%\begin {macro}{\Digamma}
-% At the same time it was believed that for inserting lower and upper case
-% ``digamma'' it was preferable to use short macros and to avoid the dilemma between
-% the |\ddigamma| and the |\digamma| macros, the former being the
-% one defined in the |greek| option to \babel, the latter being
-% a standard mathematical symbol; initially I believed that philologists do
-% not use mathematical symbols so we made |\digamma| an alias for |\f|;
-% afterwards I
-% found out that mathematicians, physicists, engineers,~\dots\ use the
-% \textsf{teubner.sty} package and that the |\digamma| is a symbol already defined
-% in the package \textsf{amssymb.sty}; therefore I made a conditional creation of
-% this alias; this trick is delayed to the beginning of the document, so as to
-% make it independent on the order with which packages are loaded.
-% \begin{macrocode}
-\AtBeginDocument{\unless\ifcsname digamma\endcsname\let\digamma\textdigamma\fi}
-% \end{macrocode}
+% At the same time it was believed that for inserting lower and upper
+% case ``digamma'' it was preferable to use short macros and to avoid
+% the dilemma between the |\ddigamma| and the |\digamma| macros, the
+% former being the one defined in the |greek| option to \babel, the
+% latter being a standard mathematical symbol; initially I believed
+% that philologists do not use mathematical symbols so we made |\digamma|% an alias for |\f|; afterwards I found out that mathematicians,
+% physicists, engineers,~\dots\ use the \textsf{teubner.sty} package
+% and that the |\digamma| is a symbol already defined in package
+% \textsf{amssymb.sty}; therefore I made a conditional creation of
+% this alias; this trick is delayed to the beginning of the document,
+% so as to make it independent on the order with which packages are
+% loaded. Actually, since the introduction of the LICR macros, this is
+% irrelevant and I deleted it.
%\end{macro}
%\end{macro}
%\end{macro}
@@ -1886,19 +1922,20 @@ Type X <return> to exit.}%
%
%\begin {macro}{\fLow}
%\begin {macro}{\fHigh}
-% The digamma glyphs set forth another question because, according to Paolo
-% Ciacchi, a different glyph should be used for typesetting text compared with
-% the one that is used as a variant in Milesian numerals in place of the standard
-% stigma symbol.
-% By means of macros |\fLow| or |\fHigh| it is possible to chose the raised or the
-% lowered digamma glyphs; Greek numerals always use the lowered one, while when
-% text is being typeset the typesetter can chose the version he likes best.
+% The digamma glyphs set forth another question because, according to
+% Paolo Ciacchi, a different glyph should be used for typesetting text
+% compared with the one that is used as a variant in Milesian numerals
+% in place of the standard stigma symbol.
+% By means of macros |\fLow| or |\fHigh| it is possible to chose the
+% raised or the lowered digamma glyphs; Greek numerals always use the
+% lowered one, while when text is being typeset the user can chose
+% the version s/he likes best.
% \begin{macrocode}
\DeclareRobustCommand{\fLow}%
{{\setbox\z@\hbox{\f}\dimen@\ht\z@
- \advance\dimen@-1ex\raise-\dimen@\hbox{\box\z@}}}
+ \advance\dimen@-1ex\raisebox{-\dimen@}{\f}}}
\DeclareRobustCommand{\fHigh}%
- {{\setbox\z@\hbox{\f}\dimen@\dp\z@\raise\dimen@\hbox{\box\z@}}}
+ {{\setbox\z@\hbox{\f}\dimen@\dp\z@\raisebox{\dimen@}{\f}}}
% \end{macrocode}
%\end{macro}
@@ -1911,13 +1948,14 @@ Type X <return> to exit.}%
% Here we start a set of miscellaneous macros. We begin with some parentheses
% that should turn out in upright shape, even if the default font is the Lipsian
% one which is oblique; its parentheses are oblique as in all oblique fonts,
-% therefore we need to quietly change fonts behind the scenes. The same is true with
-% the question mark that, philologically speaking, represents an uncertain element,
-% not the termination of a real question; it should therefore always come out
-% between parentheses and in upright shape from a Latin font. While the
-% parenthesized question mark comes from the OT1 Latin upright font, the parentheses
-% obtained with |\lpar| and |\rpar| are taken from the metric symbols font, as well
-% as the parentheses used in the parenthesized text processed with macro |\frapar|.
+% therefore we need to quietly change fonts behind the scenes. The same is true
+% with the question mark that, philologically speaking, represents an uncertain
+% element, not the termination of a real question; it should therefore always
+% come out between parentheses and in upright shape from a Latin font. While the
+% parenthesized question mark comes from the OT1 Latin upright font, the
+% parentheses obtained with |\lpar| and |\rpar| are taken from the metric
+% symbols font, as well as the parentheses used in the parenthesized text
+% processed with macro |\frapar|.
% \begin{macrocode}
\DeclareRobustCommand\qmark{\hskip.16ex{\fontencoding{OT1}\upshape(?)}}
\DeclareRobustCommand\lpar{{\metricsfont(}}
@@ -1932,8 +1970,8 @@ Type X <return> to exit.}%
%
%\begin{macro}{\ap}
% The apex/superscript macro |\ap| does not differ much from the plain standard
-% \LaTeX\ macro |\textsuperscript|, the only difference being the italic correction
-% that precedes |\textsuperscript|.
+% \LaTeX\ macro |\textsuperscript|, the only difference being the italic
+% correction that precedes |\textsuperscript|.
% \begin{macrocode}
\DeclareRobustCommand{\ap}[1]{\/\textsuperscript{#1}}
@@ -2730,7 +2768,8 @@ Type X <return> to exit.}%
\multiply\count255by5\relax
\advance\count255-\value{verso}%
\ifnum\count255=\z@
- {\fontseries{m}\small\expandafter\oldstylenums\expandafter{\the\c@verso}}%
+ {\fontseries{m}\small
+ \expandafter\oldstylenums\expandafter{\the\c@verso}}%
\else
\empty
\fi}%
@@ -2933,62 +2972,49 @@ Type X <return> to exit.}%
% \begin{macrocode}
\\%
\egroup\endlist}
-\let\VERSUS\VERSI \let\endVERSUS\endVERSUS
+\let\VERSUS\VERSI \let\endVERSUS\endVERSI
% \end{macrocode}
%\end{environment}
%
-% \subsection{Metrics symbols, macros and environmnets}
-% Now we start defining many macros concerned with metrics; the metric symbol font
-% has been developed mainly for this purpose. We start defining some macros for
-% inputting specific symbols; many such macros have their own aliases in Latin.
+% \subsection{Metrics symbols, macros and environments}
+% Now we start defining many macros concerned with metrics; the metric
+% symbol font has been developed mainly for this purpose. We start
+% defining some macros for inputting specific symbols.
+%
+% Previous versions of this package defined the metric sign using both
+% Italian and Latin names; then a user\footnote{Thank you Heinrich
+% Fleck!} discovered a conflict with the |amsmath| package, especially
+% due to the macro |\breve|, the Italian version of |\brevis|. It is
+% unusual to use |teubner| with the advanced mathematics functionalities
+% of |amsmath|, and package |teubner| has been in use for so many years,
+% that such conflicts were never experienced. But Heinrich is a fond
+% admirer of Archimedes and wrote several critical papers on Archimedes'
+% works, some of which required advanced mathematics.
+%
+% We therefore decided that the Italian metric symbol names could be done
+% without, and we eliminated all or most such ‘Italian’ macros. Those
+% now available are the following.
%
-%\begin{macro}{\lunga}
%\begin{macro}{\longa}
-%\begin{macro}{\breve}
%\begin{macro}{\brevis}
-%\begin{macro}{\bbreve}
%\begin{macro}{\bbrevis}
-%\begin{macro}{\barbreve}
%\begin{macro}{\barbrevis}
-%\begin{macro}{\barbbrev}
%\begin{macro}{\barbbrevis}
-%\begin{macro}{\ubarbreve}
%\begin{macro}{\ubarbrevis}
-%\begin{macro}{\ubarbbreve}
%\begin{macro}{\ubarbbrevis}
-%\begin{macro}{\ubarsbreve}
%\begin{macro}{\ubarsbrevis}
-%\begin{macro}{\ubrevelunga}
%\begin{macro}{\ubrevislonga}
-% The following definitions are straightforward; a small comment on |\breve|: since
-% it is also a math command in standard \LaTeX, its meaning is saved in a service
-% macro |\br@ve| and the |\breve| macro is redefined taking into account whether the
-% typesetting is being done in text or in math mode. The unusual letters that appear
-% in the definitions of the various metric symbols have no mysterious meaning; they
-% might have been specified by |\char|\meta{number}, but it seemed shorter to
-% specify the corresponding letters that would occupy the same slots in literal
-% fonts.
% \begin{macrocode}
-\DeclareRobustCommand\lunga{{\metricsfont l}}
-\let\longa\lunga
-\let\br@ve\breve
-\DeclareRobustCommand\breve{\textormath{{{\metricsfont b}}}{\br@ve}}
-\let\brevis\breve
-\DeclareRobustCommand\bbreve{{\metricsfont c}}
-\let\bbrevis\bbreve
-\DeclareRobustCommand\barbreve{{\metricsfont i}}
-\let\barbrevis\barbreve
-\DeclareRobustCommand\barbbreve{{\metricsfont j}}
-\let\barbbrevis\barbbreve
-\DeclareRobustCommand\ubarbreve{{\metricsfont d}}
-\let\ubarbrevis\ubarbreve
-\DeclareRobustCommand\ubarbbreve{{\metricsfont e}}
-\let\ubarbbrevis\ubarbbreve
-\DeclareRobustCommand\ubarsbreve{{\metricsfont f}}
-\let\ubarsbrevis\ubarsbreve
-\DeclareRobustCommand{\ubrevelunga}{{\metricsfont\char107}}
-\let\ubrevislonga\ubrevelunga
+\DeclareRobustCommand\longa{{\metricsfont l}}
+\DeclareRobustCommand\brevis{\textormath{{{\metricsfont b}}}{\br@ve}}
+\DeclareRobustCommand\bbrevis{{\metricsfont c}}
+\DeclareRobustCommand\barbrevis{{\metricsfont i}}
+\DeclareRobustCommand\barbbrevis{{\metricsfont j}}
+\DeclareRobustCommand\ubarbrevis{{\metricsfont d}}
+\DeclareRobustCommand\ubarbbrevis{{\metricsfont e}}
+\DeclareRobustCommand\ubarsbrevis{{\metricsfont f}}
+\DeclareRobustCommand{\ubrevislonga}{{\metricsfont\char107}}
% \end{macrocode}
%\end{macro}
@@ -3000,15 +3026,6 @@ Type X <return> to exit.}%
%\end{macro}
%\end{macro}
%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
%
%\begin {macro}{\corona}
%\begin {macro}{\ElemInd}
@@ -3024,19 +3041,22 @@ Type X <return> to exit.}%
%\begin {macro}{\aeolicbii}
%\begin {macro}{\aeolicbiii}
%\begin {macro}{\aeolicbiv}
-% Similarly the following symbols have straightforward definitions. Only |\hiatus|
-% and |\Hiatus| require a small explanation; |\hiatus| inserts a small capital `H'
-% in superscript position; in a first moment it was chosen the solution of designing
-% a specific sans serif glyph in superscript position directly in the metric symbol
-% font (actually this symbol is still part of the font), but while testing it, Paolo
-% Ciacchi observed that a regular `H' with serifs was better looking than the sans
-% serif counterpart. Therefore the definition was changed in order to use the
-% current font upright shape; by specifying `H', it is irrelevant if the current one
-% is a Latin font, and the letter is a capital 'h', or if the current one is a Greek
-% font and the letter is a capital `eta'. |\Hiatus| displays the same symbol in a
-% zero width box so that it does not occupy any horizontal space; it is useful while
-% writing down complicated metric sequences. Macro|\X| may be considered, thanks to
-% its shape, a mnemonic shortcut in place of the full name |\anceps|.
+% Similarly the following symbols have straightforward definitions.
+% Only |\hiatus| and |\Hiatus| require a small explanation; |\hiatus|
+% inserts a small capital `H' in superscript position; initially it was
+% chosen the solution of designing a specific sans serif glyph in
+% superscript position directly in the metric symbol font (actually this
+% symbol is still part of the font), but while testing it, Paolo Ciacchi
+% observed that a regular `H' with serifs was better looking than the
+% sans serif counterpart. Therefore the definition was changed in order
+% to use the current font upright shape; by specifying `H', it is
+% irrelevant if the current one is a Latin font, and the letter is a
+% capital 'h', or if the current font is a Greek one and the letter is a
+% capital `eta'. |\Hiatus| displays the same symbol in a zero width box
+% so that it does not occupy any horizontal space; it is useful while
+% writing down complicated metric sequences. Macro|\X| may be considered,
+% thanks to its shape, a mnemonic shortcut in place of the full name
+% |\anceps|.
% \begin{macrocode}
\DeclareRobustCommand\corona{{\metricsfont\char20}}
\let\ElemInd\corona
@@ -3073,20 +3093,25 @@ Type X <return> to exit.}%
%\begin{macro}{\2}
%\begin{macro}{\3}
%\begin{macro}{\4}
-% Here we prepare for the definition of a very useful macro, |\newmetrics|, that
-% should ease quite a lot writing complicated and repetitive metric sequences.
-% We shall define |\newmetrics| by means of the internal \LaTeX\ macro |\@namedef|
-% which accepts a macro name containing any character, provided this name does not
-% contain the initial back slash (if it does this back slash becomes part of the
-% macro name; see the \TeX{}book where there is an example for the definition of
-% |\\TeX|). Therefore we need a service macro |\stripsl@sh| that strips the first
-% token from the control sequence, so that the na\"if user does not have to treat
-% the new metrics control sequence differently from the control sequences it uses
-% for example with |\newcommand|. Next we define three numeric control sequences
-% that should be followed by the rest of the macro name.
-% The na\"if user can then type in something like \verb*+\2iamb + in order to
-% activate a macro whose name is formed by the tokens |2iamb|, which is normally
-% impossible in \LaTeX. Notice, though, the compulsory space after the macro name.
+% Here we prepare for the definition of a very useful macro,
+% |\newmetrics|, that should ease quite a lot writing complicated and
+% repetitive metric sequences.
+% We shall define |\newmetrics| by means of the internal \LaTeX\
+% macro |\@namedef| which accepts a macro name containing any
+% character, provided this name does not
+% contain the initial back slash (if it does this back slash
+% becomes part of the macro name; see the \TeX{}book where there
+% is an example for the definition of |\\TeX|). Therefore we need
+% a service macro |\stripsl@sh| that strips the first token from
+% the control sequence, so that the na\"if user does not have to
+% treat the new metrics control sequence differently from the
+% control sequences it uses for example with |\newcommand|.
+% Next we define three numeric control sequences that should be
+% followed by the rest of the macro name. The na\"if user can then
+% type-in something like \verb*+\2iamb + in order to activate
+% a macro whose name is formed by the tokens |2iamb|, which is
+% normally impossible in \LaTeX. Notice, though, the compulsory
+% space after the macro name.
% \begin{macrocode}
\newif\ifmetricsfont\metricsfontfalse
\def\stripsl@sh#1{\expandafter\@gobble\string#1}
@@ -3100,10 +3125,10 @@ Type X <return> to exit.}%
%\end{macro}
%\end{macro}
%\begin {macro}{\newmetrics}
-% Here is the user macro |\newmetrics|, to be used just as |\newcommand|, except it
-% accepts a macro name starting with one of the digits `2', `3', or `4', and sets
-% the suitable boolean variable to true so that in a long metric sequence the metric
-% font might be selected just once.
+% Here is the user macro |\newmetrics|, to be used just as |\newcommand|,
+% except it accepts a macro name starting with one of the digits `2',
+% `3', or `4', and sets the suitable boolean variable to true so that in
+% a long metric sequence the metric font might be selected just once.
% \begin{macrocode}
\newcommand\newmetrics[2]{%
\expandafter\@namedef\expandafter{\stripsl@sh#1}%
@@ -3120,27 +3145,28 @@ Type X <return> to exit.}%
%\begin {macro}{\hexam}
%\begin {macro}{\pentam}
%\begin {macro}{\2tr}
-% Here some common metric sequences are defined; some define single measures, such
-% as the `iambus' or the `choriambus', while some define complete verses such as the
-% `hexameter' or the `pentameter'.
+% Here some common metric sequences are defined; some define single
+% measures, such as the `iambus' or the `choriambus', while some
+% define complete verses such as the `hexameter' or the `pentameter'.
% \begin{macrocode}
-\newmetrics\iam{\barbreve\lunga\breve\lunga}
-\newmetrics\chor{\lunga\breve\breve\lunga}
-\newmetrics\enopl{\breve\lunga\breve\breve\lunga\breve\breve\lunga}
-\newmetrics{\4MACRO}{\lunga\lunga\lunga\lunga}
-\newmetrics{\aeolchorsor}{\lunga\zeugma{\breve\breve}\breve
- \breve\zeugma{\breve\breve}}
-\newmetrics{\hexam}{\lunga\breve\breve\lunga\breve\breve
- \lunga\breve\breve\lunga\breve\breve\lunga\breve\breve
- \lunga\lunga}
-\newmetrics{\pentam}{\lunga\barbbreve\lunga\barbbreve\lunga\dBar
- \lunga\breve\breve\lunga\breve\breve\lunga}
-\newmetrics{\2tr}{\lunga\breve\lunga\X\ \lunga\breve\lunga\X\ }
+\newmetrics\iam{\barbrevis\longa\brevis\longa}
+\newmetrics\chor{\longa\brevis\brevis\longa}
+\newmetrics\enopl{\brevis\longa\brevis\brevis\longa\brevis\brevis\longa}
+\newmetrics{\4MACRO}{\longa\longa\longa\longa}
+\newmetrics{\aeolchorsor}{\longa\zeugma{\brevis\brevis}\brevis
+ \brevis\zeugma{\brevis\brevis}}
+\newmetrics{\hexam}{\longa\brevis\brevis\longa\brevis\brevis
+ \longa\brevis\brevis\longa\brevis\brevis\longa\brevis\brevis
+ \longa\longa}
+\newmetrics{\pentam}{\longa\barbbrevis\longa\barbbrevis\longa\dBar
+ \longa\brevis\brevis\longa\brevis\brevis\longa}
+\newmetrics{\2tr}{\longa\brevis\longa\X\ \longa\brevis\longa\X\ }
% \end{macrocode}
-% As it may be seen, the definition of such metric sequences may contain almost
-% anything; here |\zeugma| was used as well as \verb*+\ +, but almost every
-% macro defined in the previous parts may be freely used.
+% As it may be seen, the definition of such metric sequences may
+% contain almost anything; here |\zeugma| was used as well as
+% \verb*+\ +, but almost every macro defined in the previous parts
+% may be freely used.
%\end{macro}
%\end{macro}
%\end{macro}
@@ -3151,12 +3177,13 @@ Type X <return> to exit.}%
%\end{macro}
%
%\begin{macro}{\metricstack}
-% |\metricstack| is a command similar to |\shortstack| used to stack something over
-% something else; specifically the second argument over the third one; it was
-% specifically designed for use while typesetting metric sequences, but actually
-% there is nothing that forbids to use it with any base character (typeset in text
-% LR mode) and any superscript character belonging to a math alphabet (which is
-% being set in script--script style, not in script style, as it happens with
+% |\metricstack| is a command similar to |\shortstack| used to stack
+% something over something else; specifically the second argument over
+% the third one; it was specifically designed for use while typesetting
+% metric sequences, but actually there is nothing that forbids to use it
+% with any base character (typeset in text LR mode) and any superscript
+% character belonging to a math alphabet (which is being set in
+% script--script style, not in script style, as it happens with
% |\shortstack|.
% \begin{macrocode}
\DeclareRobustCommand*{\metricstack}[2]%
@@ -3168,16 +3195,17 @@ Type X <return> to exit.}%
%
%\begin{macro}{\svert}
% |\svert| is a short vertical rule that may be used, for example, with
-% |\metricstack| for putting a small number over a dividing vertical bar in metric
-% sequences.
+% |\metricstack| for putting a small number over a dividing vertical bar
+% in metric sequences.
% \begin{macrocode}
\newcommand*{\svert}{\vrule\@height.8ex\@depth.2ex\relax}
% \end{macrocode}
%\end{macro}
%
%\begin{macro}{\textoverline}
-% \LaTeX\ has macro |\underline| that can be used in both text and math mode; there
-% is nothing similar for overlining, therefore we defined a new command for this
+% \LaTeX\ has macro |\underline| that can be used in both text and
+% math mode; there is nothing similar for overlining, therefore we
+% defined a new command for this
% task.
% \begin{macrocode}
\DeclareRobustCommand*{\textoverline}[1]{%
@@ -3192,15 +3220,17 @@ Type X <return> to exit.}%
%
%\begin{macro}{\verseskip}
%\begin {environment}{bracedmetrics}
-% The environment |bracedmetrics| is used primarily for setting some metric
-% sequences one atop the other, with a certain alignment and grouped together with a
-% right brace. We need therefore a length name |\br@cedmetrics| for measuring the
-% width of this large metrics sequence stack; we need a command |\verseskip| for
-% inserting a blank space before, after or in the middle of a metric sequence, that
-% more or less is as wide as an integer number of metric symbols, and, last but not
-% least, the environment itself for typesetting this large object containing the
-% said metric sequences; see the documentation file \texttt{teubner-doc.pdf} for
-% examining some examples.
+% The environment |bracedmetrics| is used primarily for setting
+% some metric sequences one atop the other, with a certain alignment
+% and grouped together with a right brace. We need therefore a length
+% name |\br@cedmetrics| for measuring the width of this large metrics
+% sequence stack; we need a command |\verseskip| for inserting a blank
+% space before, after or in the middle of a metric sequence, that
+% more or less is as wide as an integer number of metric symbols,
+% and, last but not least, the environment itself for typesetting
+% this large object containing the said metric sequences; see the
+% documentation file \texttt{teubner-doc.pdf} for examining some
+% examples.
% \begin{macrocode}
\newlength{\br@cedmetrics}
\newcommand*{\verseskip}[1]{{%
@@ -3224,30 +3254,37 @@ $\displaystyle\left.%
%\begin{macro}{\GTROF}
%\begin{macro}{\treceon}
%\begin{macro}{\traceoff}
-% Here there are some macros for turning on and off the tracing facilities of \TeX,
-% that turn out to be useful while debugging; they are accessible also to the end
-% user. Global settings must be turned on and off globally; local settings
-% die out by themselves when a group is closed, but it is a good habit to explicitly
-% turn them out regardless of groups. Attention that when the tracing facilities are
-% on and a page ship out takes place, the |.log| file receives a lot of material,
-% and this file gets very large. In order to avoid logging too much information the
-% |trace| package is loaded; this package give access to the macros |\traceon| and
-% |\traceoff| that log a lot of information, except the redundant one, specifically
-% all the macros executed during any font change. Users don't realize the amount of
-% processing done behind the scenes when with the New Font Selection Scheme (NFSS) a
-% font change takes place; luckily enough modern processors are quite fast so that
-% the compilation CPU time does not become too heavy. But if the \TeX\ processing is
-% logged, this amount of work implies thousands of lines of almost meaningless
-% information when the purpose of logging depends on errors that are difficult to
-% spot; Font changes are almost exempt from errors, so the processing of the inner
-% workings need not be logged down.
-%
-% If the user needs to trace something in order to spot errors, s/he is invited to
-% use the commands |\traceon| and |\traceoff|; commands |\TRON| and |\TROF| do log
-% much more material, in particular font changes, but at least they action may be
-% confined within groups or environments; |\GTRON| and |\GTROF| are global settings
-% and can't be confined within groups or environments; sometimes they are necessary,
-% but it's important to turn off global tracing as soon as possible.
+% Here there are some macros for turning on and off the tracing
+% facilities of \TeX, that turn out to be useful while debugging;
+% they are accessible also to the end user. Global settings must
+% be turned on and off globally; local settings die out by themselves
+% when a group is closed, but it is a good habit to explicitly
+% turn them out regardless of groups. Attention that when the
+% tracing facilities are on and a page ship out takes place, the
+% |.log| file receives a lot of material, and this file gets very
+% large. In order to avoid logging too much information the
+% |trace| package is loaded; this package give access to the
+% macros |\traceon| and |\traceoff| that log a lot of information,
+% except the redundant one, specifically all the macros executed
+% during any font change. Users don't realise the amount of
+% processing done behind the scenes when with the New Font Selection
+% Scheme (NFSS) a font change takes place; luckily enough modern
+% processors are quite fast so that the compilation CPU time does
+% not become too heavy. But if the \TeX\ processing is logged,
+% this amount of work implies thousands of lines of almost
+% meaningless information when the purpose of logging depends
+% on errors that are difficult to spot; Font changes are almost
+% exempt from errors, so the processing of the inner workings need
+% not be logged down.
+%
+% If the user needs to trace something in order to spot errors,
+% s/he is invited to use the commands |\traceon| and |\traceoff|;
+% commands |\TRON| and |\TROF| do log much more material, in
+% particular font changes, but at least they action may be
+% confined within groups or environments; |\GTRON| and |\GTROF|
+% are global settings and can't be confined within groups or
+% environments; sometimes they are necessary, but it's important
+% to turn off global tracing as soon as possible.
% \begin{macrocode}
\RequirePackage{trace}
\def\GTRON{\global\tracingcommands=\tw@ \global\tracingmacros=\tw@}
@@ -3264,202 +3301,127 @@ $\displaystyle\left.%
%\end{macro}
%
% \subsection{Classical Greek numerals}
-% When typesetting Greek it may occur to specify numbers written out as Milesian
-% numerals; the |greek| option to the \babel\ package defines a couple of
-% macros for transforming explicit arabic numerals or counter contents as Milesian
-% numerals. Since this package offers more possibilities in the choice of those
-% ``non alphabetic'' characters used in the Milesian notation, such macros have to
-% be redefined. On the occasion we changed some little internal details so as to make such macros a little faster and more robust.
+% When typesetting Greek it may occur to specify numbers written
+% out as Milesian numerals; the |greek| option to the \babel\
+% package defines a couple of macros for transforming explicit
+% Arabic numerals or counter contents as Milesian numerals. Since
+% this package offers more possibilities in the choice of those
+% ``non alphabetic'' characters used in the Milesian notation,
+% such macros have to be redefined. On the occasion we changed
+% some little internal details so as to make such macros a little
+% faster and more robust.
+%
%\begin{macro}{\Greeknumeral}
%\begin{macro}{\greeknumeral}
-%\begin{macro}{\@ifStar}
%\begin{macro}{\grtoday}
-% Both |\greeknumeral| and |\Greeknumeral|, the latter producing upper case Greek
-% numerals, while the former produces lower case ones, resort to a service macro
-% |\gr@@numeral|. But the new definition accepts the starred version; without the
-% star the digit value~6 is represented with a ``stigma'', while with the star that
-% value is represented with a lowered ``digamma''. The upper case version requires
-% intermediate macros before using |\MakeUppercase| on the result in order to
-% convert lower to upper case Milesian value symbols. This means that |\gr@@numeral|
-% may work only with lower case symbols.
-% It turned out that the normal redefinition command |\renewcommand| produced
-% fragile commands that broke out when used as arguments of other commands,
-% specifically the Greek date was broken when it was passed as the argument to the
-% |\date| command of the class \textsf{memoir}; therefore I decided to redefine the
-% |\@ifstar| macro into another |\@ifStar| one so as not to fiddle with \LaTeX\
-% kernel commands. I defined also the lowercase version of the |\grtoday| date,
-% since the \babel\ package provides only the |\today| command with no control over
-% the use of which type of numerals; |\grtoday| uses the lowercase Milesian numerals
-% through the redefined |\greeknumeral| macro.
-% \begin{macrocode}
-\def\@ifStar#1#2{\def\@tempA{#1}\def\@tempB{#2}\futurelet\@tempC\@testStar}
-\def\@testStar{\ifx\@tempC*\bbl@afterelse\expandafter\@tempA\@gobble\else
- \bbl@afterfi\@tempB\fi}
-
-\DeclareRobustCommand*{\Greeknumeral}{%
- \let\n@vanta\textQoppa\let\n@vecento\textSampi
- \@ifStar{\Gr@@kn@meral}{\Gr@@knum@ral}}
-
-\DeclareRobustCommand*{\greeknumeral}{%
- \let\n@vanta\textqoppa\let\n@vecento\textsampi
- \@ifStar{\let\s@i\textstigma\gr@@numeral}{\let\s@i\fLow\gr@@numeral}}
-
-\def\Gr@@kn@meral#1{\let\s@i\textStigma
- \expandafter\MakeUppercase\expandafter{\gr@@numeral{#1}}}
-
-\def\Gr@@knum@ral#1{\let\s@i\textDigamma
- \expandafter\MakeUppercase\expandafter{\gr@@numeral{#1}}}
-
-\def\grtoday{{\expandafter\greeknumeral\expandafter{\the\day}}\space
-\gr@c@month\space{\expandafter\greeknumeral\expandafter{\the\year}}}
-
-% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\end{macro}
-%\begin{macro}{\gr@@numeral}
-% |\gr@@numeral| must do most of the processing; it must check that the argument is
-% within the allowable range $1\sim999\,999$ and issue suitable warnings if not. On
-% the other side, if the number is within the correct range, it must check in which
-% decade it falls and must call other macros so as to produce the correct decimal
-% digit~$\leftrightarrow$ Milesian symbol. Six such macros are needed because the
-% allowable range contains at maximum six decimal places. Apparently Milesian
-% symbology allows to go beyond one million, but Apostolos Syropoulos, who
-% originally wrote the code thought (correctly) that Milesian numbers would not be
-% used for ``acrobatic performances'' but possibly for writing the Greek date with
-% the AD year; six decimal places are more than enough for this purpose.
-% |\gr@ill@value| was not redefined from Apostolos Syropoulos' \babel\ definition;
-% it simply issues a warning message about an argument out of range. The presence
-% of the primitive command |number| in these macros is for two purposes:
-% (a) transforms a counter contents into a sequence of digits tokens, and
-% (b) if the argument is already a digit string, it removes any leading zeros.
-% No braces are present because this string is examined sequentially one digit
-% at a time from the leading position to the least significant position; of
-% course this means that the decimal zero is treated correctly even if Milesian
-% symbols do not have the equivalent of a zero.
-% The double opening and closing braces are necessary to avoid a space vanishing
-% after using the |\gr@@numeral| macro; the six levels of digit reprentation are
-% corrected with the LICR macoros.
-% \begin{macrocode}
-\def\gr@@numeral#1{{%
- \ifnum#1<\@ne\space\gr@ill@value{#1}%
- \else
- \ifnum#1<10\relax\expandafter\gr@num@i\number#1%
- \else
- \ifnum#1<100\relax\expandafter\gr@num@ii\number#1%
- \else
- \ifnum#1<\@m\relax\expandafter\gr@num@iii\number#1%
- \else
- \ifnum#1<\@M\relax\expandafter\gr@num@iv\number#1%
- \else
- \ifnum#1<100000\relax\expandafter\gr@num@v\number#1%
- \else
- \ifnum#1<1000000\relax\expandafter\gr@num@vi\number#1%
- \else
- \space\gr@ill@value{#1}%
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
- \fi
-}}
-% \end{macrocode}
-%\end{macro}
-%\begin{macro}{\gr@num@i}
-%\begin{macro}{\gr@num@ii}
-%\begin{macro}{\gr@num@iii}
-%\begin{macro}{\gr@num@iv}
-%\begin{macro}{\gr@num@v}
-%\begin{macro}{\gr@num@vi}
-% The next six macros transform single decimal digits into Milesian symbols. The
-% argument to each macro is a single decimal digit; their positional value is
-% determined by the calling a macro that invokes a different transformation routine
-% for every position.
-% To the right of the least significant position there must be the symbol
-% ``anwtonos'', similar to an apostrophe, while to the left of each most significant
-% symbol whose value is greater than 999 there must be a ``katwtonos'' symbol,
-% similar to a lowered and inverted apostrophe. Zeros are examined in all macros,
-% except the one for ``units'', because their value cannot be printed but there
-% still is the possibility that there are no more digits higher than zero, so that
-% the anwtonos must be set.
-% Macros |\n@vanta| and |\n@vecento| are set by the calling macros so as to be the
-% correct lower or upper case `qoppa' or sampi' respectively.
-% \begin{macrocode}
-\def\gr@num@i#1{%
- \ifcase#1\or \textalpha\or \textbeta\or \textgamma\or
- \textdelta\or \textepsilon
- \or \s@i\or \textzeta\or \texteta\or \texttheta\fi
- \ifnum#1=\z@\else\anw@true\fi\anw@print}
-\def\gr@num@ii#1{%
- \ifcase#1\or \textiota\or \textkappa\or \textlambda\or \textmu\or \textnu%
- \or \textxi\or \textomicron\or \textpi\or \n@vanta\fi
- \ifnum#1=\z@\else\anw@true\fi\gr@num@i}
-\def\gr@num@iii#1{%
- \ifcase#1\or \textrho\or \textsigma\or \texttau\or \textupsilon
- \or \textphi\or \textchi\or \textpsi\or \textomega\or \n@vecento\fi
- \ifnum#1=\z@\anw@false\else\anw@true\fi\gr@num@ii}
-\def\gr@num@iv#1{%
- \ifnum#1=\z@\else\katwtonos\fi
- \ifcase#1\or \textalpha\or \textbeta\or \textgamma\or \textdelta
- \or \textepsilon\or \s@i\or \textzeta\or \texteta\or \texttheta\fi
- \gr@num@iii}
-\def\gr@num@v#1{%
- \ifnum#1=\z@\else\katwtonos\fi
- \ifcase#1\or \textiota\or \textkappa\or \textlambda\or
- \textmu\or \textnu\or \textxi\or \textomicron\or \textpi\or \n@vanta\fi
- \gr@num@iv}
-\def\gr@num@vi#1{%
- \katwtonos
- \ifcase#1\or \textrho\or \textsigma\or \texttau\or \textupsilon
- \or \textphi\or \textchi\or \textpsi\or \textomega\or \n@vecento\fi
- \gr@num@v}
-
+% Both |\greeknumeral| and |\Greeknumeral|, the latter producing
+% upper case Greek numerals, while the former produces lower case
+% ones, resort to robust internal macros if the |greek.ldf| language
+% description style is active; they are renamed versions of the original
+% macros that are perfect for modern Greek usage; therefore we simply let
+% the glyph placeholders for the vales 6, 90, and 900, originally indicated
+% with the place holders |\textstigma| and |\textkoppa|, (together with
+% their capital glyph counterparts) the the place holders for
+% |\textdigamma| and |\textqoppa|; with the value~6, we decided to use
+% either the stigma or the digamma sign by using the usual asterisk
+% added to the macro names; the \LaTeX\,3 language greatly simplifies
+% this task.
+%
+% Therefore |\Greeknumeral| and |\greeknumeral| macros are redefined
+% by means of |\RenewDocumentCommand| that assures solidity and by
+% resorting to the internal |greek.ldf| macros, we avoid all the tests
+% that the previous version had to make in order to handle the
+% |\anwtonos|; furthermore the code is much simpler to maintain.
+% Notice that the glyph for ‘90’ is the old styled ‘qoppa’ and
+% for ‘900’ it is the 'sampi’; if the asterisk is specified, the
+% glyph for ‘6’ is the lowered digamma, wile without the asterisk
+% it is the ‘stigma’, the other Milesian numerals are the other
+% 26 Greek letters.
+% the Greek date in capital letters is already provided by the
+% |greek.ldf| file; we define the |\grtoday| date in lower case
+% letters that differs from the |\today| one, because the numerals
+% for the day and the year are composed with the Greek numeral macros
+% just defined, The optional asterisk to |\grtoday| is passed directly
+% to the |\greeknumeral| macros, although in a complicated way in order
+% to avoid messing the |\expandafter| workings
+% \begin{macrocode}
+%
+
+\RenewDocumentCommand\Greeknumeral{s m}{\bgroup%
+ \let\textkoppa\textqoppa \let\textKoppa\textQoppa
+ \IfBooleanTF{#1}%
+ {\let\textstigmagreek\textstigma \let\textStigmagreek\textStigma}%
+ {\let\textstigmagreek\textdigamma \let\textStigmagreek\textDigamma}%
+ \bbl@greek@GreekNum\@secondoftwo{#2}\egroup}
+
+\RenewDocumentCommand\greeknumeral{s m}{\bgroup%
+ \let\textkoppa\textqoppa \let\textKoppa\textQoppa
+ \IfBooleanTF{#1}%
+ {\let\textstigmagreek\textstigma \let\textStigmagreek\textStigma}%
+ {\let\textstigmagreek\textdigamma \let\textStigmagreek\textDigamma}%
+ \bbl@greek@GreekNum\@firstoftwo{#2}\egroup}
+
+\providecommand\grtoday{}
+\RenewDocumentCommand\grtoday{ s }%
+{\bgroup\IfBooleanTF{#1}%
+{\greeknumeral*{\the\day}\space\gr@c@month\space\greeknumeral*{\the\year}}%
+{\greeknumeral{\the\day}\space\gr@c@month\space\greeknumeral{\the\year}}%
+\egroup}
+
% \end{macrocode}
-%\end{macro}
-%\end{macro}
-%\end{macro}
+%
%\end{macro}
%\end{macro}
%\end{macro}
%
%\subsection{Attic numerals}
-% It's true that Apostolos Siropoulos wrote also the |athnum.sty| extension package
-% in order to typeset integer numbers with the Athenian or Attic notation; this
-% representation of integer strictly positive integers was similar in a way to the
-% Roman notation, based on a biquinalry representation of decimal digits (taking
-% into account that there was not a symbol for zero) so as the Romans had the
-% symbols for 1, 5, 10, 50, 100, 500 and 1000 (I, V, X, L, C, D, M) the Attic
-% notation has symbols for the same sequence of decimal values extended with
-% 10\,000 and 50\,000. While typesetting philological texts in Greek it might be
-% necessary to use also the Attic notation. % As the original Roman notation used
-% to be purely additive (i.e.\ 9\,=\,VIIII), so is the Attic notation.
+% It's true that Apostolos Siropoulos wrote also the |athnum.sty|
+% extension package in order to typeset integer numbers with the
+% Athenian or Attic notation; this representation of strictly
+% positive integers was similar in a way to the Roman notation,
+% based on a biquinary\footnote{The word \emph{biquinary}
+% does not appear in the Oxford dictionary, but its etymology
+% is pretty clear: couples of quintets. After all we have two
+% hands with five fingers each, and we started counting on our
+% hands since we were little children.} representation of decimal
+% digits (taking into account that there was not a symbol for zero)
+% so as the Romans had the symbols for 1, 5, 10, 50, 100, 500 and
+% 1000 (I, V, X, L, C, D, M). The Attic notation has symbols for
+% the same sequence of decimal values extended with 10\,000 and
+% 50\,000.
+%
+% While typesetting philological texts in Greek it might be
+% necessary to use also the Attic notation. As the original
+% Roman notation used to be purely additive (i.e.
+% $9\to\mathrm{VIIII}$ different from the subtractive one
+% $9\to\mathrm{IX}$), so is the Attic notation.
%
%\begin{macro}{\AtticNumeral}
%\begin{macro}{\AtticCycl@}
-% Therefore another conversion macro was devised that receives the value to be
-% converted as its argument and checks that it falls between the boundaries;
-% actually the lower boundary is zero, while the upper boundary was chosen to be
-% 99\,999, for no other reason that the lack of further symbols, beyond the value
-% 50\,000, would force to long sequences of identical symbols that are difficult
-% to read. The |athnum.sty| package allows to extend this range to 249\,9999;
-% should it be necessary, the user is invited to load that package and its
+% Therefore another conversion macro was devised that receives
+% the value to be converted as its argument: first it checks
+% that such argument falls in the allowed range; actually the lower
+% boundary is zero, while the upper boundary was chosen to be
+% 99\,999, for no other reason than the lack of further symbols
+% beyond the value 50\,000, that would force to long sequences of
+% identical symbols that are difficult to read. The |athnum.sty|
+% package allows to extend this range to 249\,9999; should it be
+% necessary, the user is invited to load that package and its
% transformation command |\athnum|.
%
-% The user command |\AtticNumeral| is very simple, but it must be preceded by the
-% definitions of the quinary symbols for 50, 500, 5000, and 50\,000; such symbols
-% are present in all the CB Greek fonts in all sizes, series and shapes; therefore
-% the definitions must be subject to the LGR enconding:
+% The user command |\AtticNumeral| must be preceded by the
+% definitions of the biquinary symbols for 50, 500, 5000, and
+% 50\,000; such symbols are present in all the CB Greek fonts
+% in all sizes, series and shapes; therefore the definitions
+% must be subject to the LGR encoding:
% \begin{macrocode}
\DeclareTextSymbol{\Vmiria}{\GRencoding@name}{5}
\DeclareTextSymbol{\Vkilo}{\GRencoding@name}{4}
\DeclareTextSymbol{\Vetto}{\GRencoding@name}{3}
\DeclareTextSymbol{\Vdeka}{\GRencoding@name}{2}
% \end{macrocode}
-% The we need a command for issuing a warning message if the number to be
-% transformed is out of range:
+% The we need a command to issue a warning message if the number
+% to be transformed is out of range:
% \begin{macrocode}
\newcommand*\attic@ill@value[1]{\PackageWarning{teubner}{%
Illegal value (\number#1) for \string\ActicNumeral\space}}
@@ -3474,40 +3436,60 @@ Illegal value (\number#1) for \string\ActicNumeral\space}}
\fi}
% \end{macrocode}
-% The real transformation algorithm is transfered to the auxiliary macro
-% |\AttiCycl@|, where successive division by 10 allow to extract the various decimal
-% digits of various weights maintaining the remainder in the original counter; each
-% decimal digit is possibly divided into the quinary value and the remaining units
-% up to 4; the the cycle is repeated untile the decimal units, that do not require
-% the computation of the remainder and terminate the cycle. Notice that we use also
-% the $\varepsilon$-\TeX\ extended commands for integer computations; this implies
-% that |teubner| mus be run with a suitably recent version of the typesetting engine
+% The real transformation algorithm is transferred to the
+% auxiliary macro |\AttiCycl@|, where successive division by
+% 10 allow to extract the various decimal digits of various
+% weights maintaining the remainder in the original counter;
+% each decimal digit is possibly divided into the biquinary value
+% and the remaining units up to~4; the the cycle is repeated
+% until the decimal units that do not require the computation
+% of the remainder and terminate the cycle. Notice that we use
+% also the $\varepsilon$-\TeX\ extended commands for integer
+% computations; this implies that |teubner| must be run with
+% a suitably recent version of the typesetting engine
% that embeds the above extensions.
% \begin{macrocode}
\def\AtticCycl@#1{%
- \bgroup
- \countdef\valore=252\countdef\cifra=250\relax
- \valore=#1\relax
- \cifra=\valore\divide\cifra10000\relax
- \valore=\numexpr\valore-\cifra*10000\relax
- \ifnum\cifra>4\relax\Vmiria \advance\cifra-5\relax\fi
- \@whilenum\cifra>\z@\do{M\advance\cifra\m@ne}%
- \cifra=\valore\divide\cifra1000\relax
- \valore=\numexpr\valore-\cifra*1000\relax
- \ifnum\cifra>4\relax\Vkilo \advance\cifra-5\relax\fi
- \@whilenum\cifra>\z@\do{Q\advance\cifra\m@ne}%
- \cifra=\valore\divide\cifra100\relax
- \valore=\numexpr\valore-\cifra*100\relax
- \ifnum\cifra>4\relax\Vetto \advance\cifra-5\relax\fi
- \@whilenum\cifra>\z@\do{H\advance\cifra\m@ne}%
- \cifra=\valore\divide\cifra10\relax
- \valore=\numexpr\valore-\cifra*10\relax
- \ifnum\cifra>4\relax\Vdeka \advance\cifra-5\relax\fi
- \@whilenum\cifra>\z@\do{D\advance\cifra\m@ne}%
- \cifra=\valore
- \ifnum\cifra>4\relax P\advance\cifra-5\relax\fi
- \@whilenum\cifra>\z@\do{I\advance\cifra\m@ne}%
- \egroup}
+ \bgroup
+ \countdef\valore=252\countdef\cifra=250\relax
+ \valore=#1\relax
+ \@whilenum\valore>0\do{%
+ \ifnum\valore>9999\relax
+ \cifra=\valore\divide\cifra10000\relax
+ \valore=\numexpr\valore-\cifra*10000\relax
+ \ifnum\cifra>4\relax\Vmiria \advance\cifra-5\relax\fi
+ \@whilenum\cifra>\z@\do{M\advance\cifra\m@ne}%
+ \else
+ \ifnum\valore>999\relax
+ \cifra=\valore\divide\cifra1000\relax
+ \valore=\numexpr\valore-\cifra*1000\relax
+ \ifnum\cifra>4\relax\Vkilo \advance\cifra-5\relax\fi
+ \@whilenum\cifra>\z@\do{Q\advance\cifra\m@ne}%
+ \else
+ \ifnum\valore>99\relax
+ \cifra=\valore\divide\cifra100\relax
+ \valore=\numexpr\valore-\cifra*100\relax
+ \ifnum\cifra>4\relax\Vetto \advance\cifra-5\relax\fi
+ \@whilenum\cifra>\z@\do{H\advance\cifra\m@ne}%
+ \else
+ \ifnum\valore>9\relax
+ \cifra=\valore\divide\cifra10\relax
+ \valore=\numexpr\valore-\cifra*10\relax
+ \ifnum\cifra>4\relax\Vdeka \advance\cifra-5\relax\fi
+ \@whilenum\cifra>\z@\do{D\advance\cifra\m@ne}%
+ \else
+ \ifnum\valore>0\relax
+ \cifra=\valore
+ \ifnum\cifra>4\relax P\advance\cifra-5\relax\fi
+ \@whilenum\cifra>\z@\do{I\advance\cifra\m@ne}%
+ \valore=\cifra
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ }%
+ \egroup}
% \end{macrocode}
%\end{macro}
@@ -3520,12 +3502,13 @@ Illegal value (\number#1) for \string\ActicNumeral\space}}
%<*tbtx>
%\fi
%\section{Accessing the CBgreek fonts when the TX fonts are selected}
-% During the year 2010 this package \textsf{teubner.sty} was upgraded in order to allow
-% using the CBgreek fonts even when other Latin fonts, different from the ``standard'' CM
-% and LM ones are selected for typesetting text with the Latin script.
+% During the year 2010 this package \textsf{teubner.sty} was upgraded
+% in order to allow using the CBgreek fonts even when other Latin
+% fonts, different from the ``standard'' CM and LM ones are selected
+% for typesetting text with the Latin script.
-% At the same time Antonis Tsolomitis uploaded a new package in order to let
-% Greek users use some Greek fonts that match the Times eXtended
+% At the same time Antonis Tsolomitis uploaded a new package in order
+% to let Greek users use some Greek fonts that match the Times eXtended
% ones\footnote{Probably Antonis Tsolomitis' Greek fonts match also the
% newer Times eXtended fonts produced by Michael Sharpe. The newer fonts
% have different font family names than the previous TX fonts; in order
@@ -3536,23 +3519,25 @@ Illegal value (\number#1) for \string\ActicNumeral\space}}
% |lgrtxss.fd|, |lgrtxtt.fd|, font definition files that allow the font
% switching implied by the |greek| option to the \textsf{babel} package.
% These files take precedence over the mechanism outlined in
-% section~\ref{ssec:LatinFontComp}, because command |\substitutefontfamily|
-% first tests the existence of |lgrtxr.fd|, and, if this is not available,
-% it may generate a specific one suitable for working smoothly with
+% section~\ref{ssec:LatinFontComp}, because command
+% |\substitutefontfamily| first tests the existence of |lgrtxr.fd|,
+% and, if this is not available, it may generate a specific one
+% suitable for working smoothly with
% \textsf{teubner.sty}.
%
% Now if Tsolomitis' files are available on the main system tree, these
% take precedence and the \textsf{teubner} compatible files are not
% generated. Unfortunately Tsolomitis' fonts, although better suited to
-% match the TX fonts, are well matched to modern Greek typesettin,
+% match the TX fonts, are well matched to modern Greek typesetting,
% but they are incomplete for philological typesetting.
%
-% We therefore avoid this clash by creating a \textsf{teubnertx.sty} file.
-% This extension defines the families and shapes available with the
-% familiar fond definition files, but the information gets input by
+% We therefore avoid this clash by creating a \textsf{teubnertx.sty}
+% file. This extension defines the families and shapes available with
+% the familiar font definition files, but the information gets input by
% \textsf{teubner.sty} at the ``begin document'' time, without resorting
-% to any |.fd| file. May be more information is loaded than is strictly
-% necessary, but it better to do this way than to clash with other packages.
+% to any |.fd| file. Maybe more information is loaded than is strictly
+% necessary, but it is better to do this way than to clash with other
+% packages.
% \begin{macrocode}
\DeclareFontFamily{LGR}{txr}{}
\DeclareFontShape{LGR}{txr}{m}{n}{<->ssub * cmr/m/n}{}
diff --git a/Master/texmf-dist/source/latex/texnegar/texnegar.dtx b/Master/texmf-dist/source/latex/texnegar/texnegar.dtx
new file mode 100644
index 00000000000..1024a64dce5
--- /dev/null
+++ b/Master/texmf-dist/source/latex/texnegar/texnegar.dtx
@@ -0,0 +1,2110 @@
+% \iffalse meta-comment
+%
+% This is file `texnegar.dtx'
+%
+% Copyright (C) 2020-2021 Hossein Movahhedian
+%
+% It may be distributed and/or modified under the LaTeX Project Public License,
+% version 1.3c or higher (your choice). The latest version of
+% this license is at: http://www.latex-project.org/lppl.txt
+%
+%<*internal>
+\iffalse
+%</internal>
+%<*README-txt>
+The TEXNEGAR package
+------------------------
+
+In some cursive scripts such as Persian or Arabic, kashida is used to create
+justification. In this type of justification characters are elongated rather
+than expanding spaces between words.
+
+The kashida justification in 'xepersian' has many bugs. Also it has problems
+with some fonts such as 'HM Series' available at
+'https://dma8hm1334.bitbucket.io' and 'X Series 2' available at
+'http://wiki.irmug.com/index.php/X_Series_2'. The 'xepersian-hm' package was
+the first attempt to fix these bugs in 'xepersian' which uses the xetex
+engine.
+
+This package extends the kashida justification to be used with the luatex
+engine too.
+
+The files 'texnegar-*.tex' in the directory 'texmf-dist/doc/xelatex/texnegar/'
+can be used as simple examples of the usage of the package.
+
+Please use the Bitbucket issue tracker:
+'https://bitbucket.org/dma8hm1334/texnegar/issues' to report a bug, request
+a feature or if you have a comment.
+
+I will do my best to fix all the bugs you report, but, unfortunately, time is a
+big hurdle to overcome; so, my apologies in advance for those which I cannot
+make time to fix.
+%</README-txt>
+%<*internal>
+\fi
+%</internal>
+%
+%<*driver|package>
+% The version of expl3 required is tested as early as possible, as
+% some really old versions do not define \ProvidesExplPackage.
+\RequirePackage{expl3}[2018/02/21]
+%<package>\@ifpackagelater{expl3}{2018/02/21}
+%<package> {}
+%<package> {%
+%<package> \PackageError{xtemplate}{Support package l3kernel too old}
+%<package> {%
+%<package> Please install an up to date version of l3kernel\MessageBreak
+%<package> using your TeX package manager or from CTAN.\MessageBreak
+%<package> \MessageBreak
+%<package> Loading xtemplate will abort!%
+%<package> }%
+%<package> \endinput
+%<package> }
+%</driver|package>
+%<*driver>
+\documentclass[full]{l3doc}
+\usepackage{enumitem}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \ifluatex
+% \immediate\directlua{os.execute([[ lualatex texnegar-doc.ltx ]])}
+% \immediate\directlua{os.execute([[ lualatex texnegar-doc.ltx ]])}
+% \immediate\directlua{os.execute([[ makeindex -c texnegar-doc.idx ]])}
+% \immediate\directlua{os.execute([[ lualatex texnegar-doc.ltx ]])}
+% \fi
+%
+% \ifxetex
+% \immediate\write18{lualatex texnegar-doc.ltx}
+% \immediate\write18{lualatex texnegar-doc.ltx}
+% \immediate\write18{makeindex -c texnegar-doc.idx}
+% \immediate\write18{lualatex texnegar-doc.ltx}
+% \fi
+%
+% \begin{implementation}
+%
+% \def\TeXNegar{\TeX Negar}
+%
+% \title{^^A
+% The \textsf{texnegar} package\\Kashida justification in LuaTeX and XeTeX\\Source code documentation^^A
+% }
+%
+% \author{^^A
+% Hossein Movahhedian\thanks
+% {^^A
+% E-mail:
+% \href{mailto:dma8hm1334@gmail.com}
+% {\textsf{dma8hm1334@gmail.com}}
+% }^^A
+% }
+%
+% \date{Released \quad 2021-02-09 \quad v0.1e}
+%
+% \maketitle
+%
+% \vskip 40mm
+% \begin{function}{Negar:}
+% \begin{minipage}{0.65\linewidth}
+% \textit{\noindent
+% Negar, in Persian, is the present stem of negaashtan meaning to design; to paint;
+% to write; and as a noun it means ``sweetheart, idol, beloved, figuratively refering
+% to a beautiful woman, pattern, painting, and artistic design''
+% }
+% \end{minipage}
+% \end{function}
+%
+% \newpage
+%
+% \tableofcontents
+%
+% \newpage
+%
+% \section{\TeXNegar{} Implementation}
+%
+% \subsection{File: \texttt{texnegar.sty}}
+%
+% \begin{macrocode}
+%<*texnegar-sty>
+\RequirePackage{xparse}
+\RequirePackage{l3keys2e}
+\RequirePackage{graphicx}[2019-11-30]
+\RequirePackage{array}[2019-10-01]
+\RequirePackage[dvipsnames,svgnames,x11names]{xcolor}[2016/05/11]
+\RequirePackage{fontspec}[2020/02/21]
+\RequirePackage{newverbs}[2010/09/02]
+\RequirePackage{environ}[2014/05/04]
+
+\ProvidesExplPackage {texnegar} {2021-02-09} {0.1e} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
+
+\sys_if_engine_luatex:T
+ {
+ \RequirePackageWithOptions{texnegar-luatex}
+ \endinput
+ }
+\sys_if_engine_xetex:T
+ {
+ \RequirePackageWithOptions{texnegar-xetex}
+ \endinput
+ }
+\msg_new:nnn {texnegar} {cannot-use-pdftex}
+ {
+ The~ texnegar~ package~ requires~ either~ XeTeX~ or~ LuaTeX.\\\\
+ You~ must~ change~ your~ typesetting~ engine~ to,~ e.g.,~
+ "xelatex"~ or~ "lualatex" instead~ of~ "latex"~ or~ "pdflatex".
+ }
+\msg_fatal:nn {texnegar} {cannot-use-pdftex}
+
+ \endinput
+%</texnegar-sty>
+% \end{macrocode}
+%
+% \subsection{File: \texttt{texnegar-luatex.sty}}
+%
+% \begin{macrocode}
+%<*texnegar-luatex-sty>
+\ProvidesExplPackage {texnegar-luatex} {2021-02-09} {0.1e} { Full implementation of kashida feature in xetex and luatex }
+
+\tex_input:D { texnegar-ini.tex }
+
+\bool_if:NT \l_texnegar_kashida_fix_bool
+ {
+ \if_int_compare:w \luatexversion < \c_texnegar_luatexversionmajormin_int\c_texnegar_luatexversionminormin_int
+ \msg_error:nnxxx { texnegar } { luatex-version-is-too-old } { !!!! } { \c_texnegar_luatexversionmajormin_int } { \c_texnegar_luatexversionminormin_int }
+ \fi:
+
+ \hbox_set:Nn \l_texnegar_k_box { \resizebox{5000sp}{\height}{-} }
+
+ \hbox_set:Nn \l_texnegar_ksh_box { \char\lua_now:n { tex.sprint(0, font.getfont(font.current()).resources.unicodes[token.scan_string()]) } hyphen }
+
+ \directlua{dofile(kpse.find_file("texnegar.lua"))}
+ }
+
+\bool_if:NT \l_texnegar_kashida_fix_bool
+ {
+ \tex_input:D { texnegar-common-kashida.tex }
+
+ \AtBeginDocument
+ {
+ \KashidaOn
+ }
+ }
+
+ \endinput
+%</texnegar-luatex-sty>
+% \end{macrocode}
+%
+% \subsection{File: \texttt{texnegar-xetex.sty}}
+%
+% \begin{macrocode}
+%<*texnegar-xetex-sty>
+\RequirePackage{zref-savepos}[2020-03-03]
+\ProvidesExplPackage {texnegar-xetex} {2021-02-09} {0.1e} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
+
+\tex_input:D { texnegar-ini.tex }
+
+\bool_if:NT \l_texnegar_kashida_fix_bool
+ {
+ \tex_input:D { texnegar-xetex-kashida.tex }
+ }
+
+ \endinput
+%</texnegar-xetex-sty>
+% \end{macrocode}
+%
+% \subsection{File: \texttt{texnegar-ini.tex}}
+%
+% \begin{macrocode}
+%<*texnegar-ini-tex>
+\ProvidesExplFile {texnegar-ini.tex} {2021-02-09} {0.1e} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
+
+\def\TeXNegar{\TeX Negar}
+
+\box_new:N \l_texnegar_k_box
+\box_new:N \l_texnegar_ksh_box
+
+\tl_const:Nn \c_texnegar_luatexversionmajormin_int {1}
+\tl_const:Nn \c_texnegar_luatexversionminormin_int {12}
+
+\int_const:Nn \c_texnegar_ksh_int {"0640} % kashida
+\int_const:Nn \c_texnegar_lrm_int {"200E} % left-right-mark
+\int_const:Nn \c_texnegar_zwj_int {"200D} % zero-width joiner
+
+\int_const:Nn \c_texnegar_two_int {2}
+\int_const:Nn \c_texnegar_four_int {4}
+
+\tl_const:Nn \c_texnegar_skip_a_tl { 0 em plus 0.5 em }
+\tl_const:Nn \c_texnegar_skip_b_tl { 0.14 em plus 5.5 em }
+
+\int_new:N \l_texnegar_counter_int
+
+\int_new:N \l_texnegar_kashida_slot_int
+
+\int_new:N \l_texnegar_line_break_penalty_int
+
+\int_new:N \l_texnegar_min_penalty_int
+\int_new:N \l_texnegar_low_penalty_int
+\int_new:N \l_texnegar_med_penalty_int
+\int_new:N \l_texnegar_high_penalty_int
+\int_new:N \l_texnegar_max_penalty_int
+
+\int_new:N \l_fontnumber_int
+
+\tl_new:N \l_texnegar_line_break_tl
+
+\tl_new:N \l_texnegar_main_font_full_tl
+\tl_new:N \l_texnegar_main_font_name_tl
+
+\tl_new:N \l_texnegar_font_full_tl
+\tl_new:N \l_texnegar_font_name_tl
+
+\tl_new:N \l_texnegar_skip_default_tl
+
+\tl_new:N \l_texnegar_active_ligs_tl
+
+\tl_new:N \l_texnegar_gap_filler_tl
+
+\tl_new:N \l_texnegar_use_color_tl
+\tl_new:N \l_texnegar_color_tl
+\tl_new:N \l_texnegar_color_rgb_tl
+
+\dim_new:N \l_texnegar_diff_pos_dim
+
+\bool_set_false:N \l_texnegar_minimal_bool
+\tl_set:Nn \l_texnegar_minimal_off_tl { Off }
+\tl_set:Nn \l_texnegar_minimal_on_tl { On }
+
+\bool_set_false:N \l_texnegar_kashida_fix_bool
+
+\bool_set_false:N \l_texnegar_kashida_fontfamily_bool
+\tl_new:N \l_texnegar_kashida_fontfamily_tl
+\tl_set:Nn \l_texnegar_kashida_fontfamily_tl { N/A }
+
+\bool_set_false:N \l_texnegar_kashida_glyph_bool
+\bool_set_false:N \l_texnegar_kashida_leaders_glyph_bool
+\bool_set_false:N \l_texnegar_kashida_leaders_hrule_bool
+
+\bool_set_false:N \l_texnegar_ligature_bool
+\bool_set_false:N \l_texnegar_linebreakpenalty_bool
+\bool_set_false:N \l_texnegar_hboxrecursion_bool
+\bool_set_false:N \l_texnegar_vboxrecursion_bool
+\bool_set_false:N \l_texnegar_color_bool
+
+\int_set:Nn \l_texnegar_min_penalty_int { 0 }
+\int_set:Nn \l_texnegar_low_penalty_int { 8 }
+\int_set:Nn \l_texnegar_med_penalty_int { 15 }
+\int_set:Nn \l_texnegar_high_penalty_int { 25 }
+\int_set:Nn \l_texnegar_max_penalty_int { 10000 }
+
+\tl_set:Nn \l_texnegar_stretch_glyph_tl { glyph }
+\tl_set:Nn \l_texnegar_stretch_leaders_glyph_tl { leaders+glyph }
+\tl_set:Nn \l_texnegar_stretch_leaders_hrule_tl { leaders+hrule }
+\tl_set:Nn \l_texnegar_stretch_off_tl { Off }
+\tl_set:Nn \l_texnegar_stretch_on_tl { On }
+
+\tl_set:Nn \l_texnegar_hboxrecursion_off_tl { Off }
+\tl_set:Nn \l_texnegar_hboxrecursion_on_tl { On }
+
+\tl_set:Nn \l_texnegar_vboxrecursion_off_tl { Off }
+\tl_set:Nn \l_texnegar_vboxrecursion_on_tl { On }
+
+\tl_set:Nn \l_texnegar_fnt_kayhan_tl { kayhan }
+\tl_set:Nn \l_texnegar_fnt_kayhannavaar_tl { kayhannavaar }
+\tl_set:Nn \l_texnegar_fnt_kayhanpook_tl { kayhanpook }
+\tl_set:Nn \l_texnegar_fnt_kayhansayeh_tl { kayhansayeh }
+\tl_set:Nn \l_texnegar_fnt_khoramshahr_tl { khoramshahr }
+\tl_set:Nn \l_texnegar_fnt_khorramshahr_tl { khorramshahr }
+\tl_set:Nn \l_texnegar_fnt_niloofar_tl { niloofar }
+\tl_set:Nn \l_texnegar_fnt_paatch_tl { paatch }
+\tl_set:Nn \l_texnegar_fnt_riyaz_tl { riyaz }
+\tl_set:Nn \l_texnegar_fnt_roya_tl { roya }
+\tl_set:Nn \l_texnegar_fnt_shafigh_tl { shafigh }
+\tl_set:Nn \l_texnegar_fnt_shafighKurd_tl { shafighKurd }
+\tl_set:Nn \l_texnegar_fnt_shafighUzbek_tl { shafighUzbek }
+\tl_set:Nn \l_texnegar_fnt_shiraz_tl { shiraz }
+\tl_set:Nn \l_texnegar_fnt_sols_tl { sols }
+\tl_set:Nn \l_texnegar_fnt_tabriz_tl { tabriz }
+\tl_set:Nn \l_texnegar_fnt_titr_tl { titr }
+\tl_set:Nn \l_texnegar_fnt_titre_tl { titre }
+\tl_set:Nn \l_texnegar_fnt_traffic_tl { traffic }
+\tl_set:Nn \l_texnegar_fnt_vahid_tl { vahid }
+\tl_set:Nn \l_texnegar_fnt_vosta_tl { vosta }
+\tl_set:Nn \l_texnegar_fnt_yaghut_tl { yaghut }
+\tl_set:Nn \l_texnegar_fnt_yagut_tl { yagut }
+\tl_set:Nn \l_texnegar_fnt_yas_tl { yas }
+\tl_set:Nn \l_texnegar_fnt_yekan_tl { yekan }
+\tl_set:Nn \l_texnegar_fnt_yermook_tl { yermook }
+\tl_set:Nn \l_texnegar_fnt_zar_tl { zar }
+\tl_set:Nn \l_texnegar_fnt_ziba_tl { ziba }
+\tl_set:Nn \l_texnegar_fnt_default_tl { default }
+\tl_set:Nn \l_texnegar_fnt_noskip_tl { noskip }
+
+\tl_set:Nn \l_texnegar_lig_aalt_tl { aalt } % Access All Alternatives
+\tl_set:Nn \l_texnegar_lig_ccmp_tl { ccmp } % Glyph Composition/Decomposition
+\tl_set:Nn \l_texnegar_lig_dlig_tl { dlig } % Discretionary Ligatures
+\tl_set:Nn \l_texnegar_lig_fina_tl { fina } % Final (Terminal) Forms
+\tl_set:Nn \l_texnegar_lig_init_tl { init } % Initial Forms
+\tl_set:Nn \l_texnegar_lig_locl_tl { locl } % Localized Forms
+\tl_set:Nn \l_texnegar_lig_medi_tl { medi } % Medial Forms
+\tl_set:Nn \l_texnegar_lig_rlig_tl { rlig } % Required Ligatures
+\tl_set:Nn \l_texnegar_lig_default_tl { default }
+
+\tl_set:Nn \l_texnegar_col_default_tl { magenta }
+
+\clist_set:Nn \l_texnegar_lig_aalt_clist { } % Access All Alternatives
+\clist_set:Nn \l_texnegar_lig_ccmp_clist { } % Glyph Composition/Decomposition
+\clist_set:Nn \l_texnegar_lig_dlig_clist { FDF2 = الله , FDF3 = اکبر , FDFB = جلجلاله } % Discretionary Ligatures
+\clist_set:Nn \l_texnegar_lig_fina_clist { } % Final (Terminal) Forms
+\clist_set:Nn \l_texnegar_lig_init_clist { } % Initial Forms
+\clist_set:Nn \l_texnegar_lig_locl_clist { } % Localized Forms
+\clist_set:Nn \l_texnegar_lig_medi_clist { } % Medial Forms
+\clist_set:Nn \l_texnegar_lig_rlig_clist { } % Required Ligatures
+\clist_set:Nn \l_texnegar_lig_default_clist { }
+
+\clist_set:Nn \l_texnegar_lig_names_clist
+ {
+ \l_texnegar_lig_aalt_tl , { \l_texnegar_lig_aalt_clist } ,
+ \l_texnegar_lig_ccmp_tl , { \l_texnegar_lig_ccmp_clist } ,
+ \l_texnegar_lig_dlig_tl , { \l_texnegar_lig_dlig_clist } ,
+ \l_texnegar_lig_fina_tl , { \l_texnegar_lig_fina_clist } ,
+ \l_texnegar_lig_init_tl , { \l_texnegar_lig_init_clist } ,
+ \l_texnegar_lig_locl_tl , { \l_texnegar_lig_locl_clist } ,
+ \l_texnegar_lig_medi_tl , { \l_texnegar_lig_medi_clist } ,
+ \l_texnegar_lig_rlig_tl , { \l_texnegar_lig_rlig_clist } ,
+ }
+
+\msg_new:nnn { texnegar } { error-kashida-character-is-not-available-in-the-main-font }
+ {
+ Sorry,~ kashida~ character~ is~ not~ available~ in~ the~ main~ font~#1!
+ }
+
+\msg_new:nnn { texnegar } { error-value-not-available-for-kashida-option }
+ {
+ Sorry,~ value~ `#1'~ is~ not~ available~ for~ `Kashida'~ option~ yet~!
+ }
+
+\msg_new:nnn { texnegar } { error-specify-value-for-kashida-option }
+ {
+ Sorry,~ you~ must~ specify~ a~ value~ for~ `Kashida'~ option~ yet~!
+ }
+
+\msg_new:nnn { texnegar } { warning-experimental-feature }
+ {
+ Please~ note~ that~ the~ feature~ `#1'~ is~ still~ experimental~
+ and~ is~ not~ regarded~ as~ stable.
+ }
+
+\msg_new:nnn { texnegar } { hm-series-font-not-found }
+ {
+ Either~ the~ font~`#1'~ is~ not~ installed~ on~ your~ system~ or~ does~ not~
+ belong~ to~ HM~Series~fonts.~
+ Please~ note~ that~ the~ option~ `Kashida=leaders+glyph'~ is~ currently~ only~
+ supported~ by~ HM~Series~fonts.~
+ If~ you~ know~ of~ any~ other~ font~ that~ supports~ this~ option,~ please~
+ let~ me~ know~ to~ add~ it~ to~ the~ list~ of~ corresponding~ fonts.~
+ }
+
+\msg_new:nnn { texnegar } { luatex-version-is-too-old }
+ {
+ #1:~Your~luatex~is~too~old,~you~need~at~least~version~#2.#3~!
+ }
+
+\keys_define:nn { texnegar }
+ {
+ Kashidafontfamily .code:n =
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_case:Nn \l_tmpa_tl
+ {
+ \tl_if_empty:NTF \l_tmpa_tl
+ {
+ \bool_set_false:N \l_texnegar_kashida_fontfamily_bool
+ }
+ {
+ \bool_set_true:N \l_texnegar_kashida_fontfamily_bool
+ \tl_set:Nx \l_texnegar_kashida_fontfamily_tl { \l_tmpa_tl }
+ }
+ }
+ } ,
+
+ Minimal .code:n =
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_case:Nn \l_tmpa_tl
+ {
+ \l_texnegar_minimal_off_tl
+ {
+ \bool_set_false:N \l_texnegar_minimal_bool
+ }
+ \l_texnegar_minimal_on_tl
+ {
+ \bool_set_true:N \l_texnegar_minimal_bool
+ }
+ }
+ } ,
+
+ Kashida .code:n =
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_case:NnTF \l_tmpa_tl
+ {
+ \l_texnegar_stretch_glyph_tl
+ {
+ \msg_warning:nnn { texnegar } { warning-experimental-feature } { Kashida=glyph }
+ \tl_set:Nx \l_texnegar_gap_filler_tl { \l_texnegar_stretch_glyph_tl }
+ \AtBeginDocument
+ {
+ \tl_set:Nx \l_texnegar_main_font_full_tl { \tex_fontname:D \tex_the:D \tex_font:D }
+ \tl_set:Nx \l_texnegar_main_font_name_tl { \l_texnegar_main_font_full_tl }
+ \regex_replace_once:nnN { ^"([^/]+)/.* } { \1 } \l_texnegar_main_font_name_tl
+ }
+ \bool_set_true:N \l_texnegar_kashida_fix_bool
+ \bool_set_true:N \l_texnegar_kashida_glyph_bool
+ }
+ \l_texnegar_stretch_leaders_glyph_tl
+ {
+ \tl_set:Nx \l_texnegar_gap_filler_tl { \l_texnegar_stretch_leaders_glyph_tl }
+ \bool_set_true:N \l_texnegar_kashida_fix_bool
+ \bool_set_true:N \l_texnegar_kashida_leaders_glyph_bool
+ }
+ \l_texnegar_stretch_leaders_hrule_tl
+ {
+ \tl_set:Nx \l_texnegar_gap_filler_tl { \l_texnegar_stretch_leaders_hrule_tl }
+ \bool_set_true:N \l_texnegar_kashida_fix_bool
+ \bool_set_true:N \l_texnegar_kashida_leaders_hrule_bool
+ }
+ \l_texnegar_stretch_off_tl
+ {
+ \tl_set:Nx \l_texnegar_gap_filler_tl { \l_texnegar_stretch_off_tl }
+ \bool_set_false:N \l_texnegar_kashida_fix_bool
+ }
+ \l_texnegar_stretch_on_tl
+ {
+ \tl_set:Nx \l_texnegar_gap_filler_tl { \l_texnegar_stretch_leaders_glyph_tl }
+ \bool_set_true:N \l_texnegar_kashida_fix_bool
+ \bool_set_true:N \l_texnegar_kashida_leaders_glyph_bool
+ }
+ } { } { \tl_set:Nx \l_texnegar_gap_filler_tl { #1 } }
+ \tl_if_empty:NT \l_texnegar_gap_filler_tl { \msg_error:nn { texnegar } { error-specify-value-for-kashida-option } }
+ } ,
+
+ linebreakpenalty .code:n =
+ {
+ \int_set:Nn \l_tmpa_int { #1 }
+ \int_case:nnTF \l_tmpa_int
+ {
+ \l_texnegar_min_penalty_int { \int_set:Nn \l_texnegar_line_break_penalty_int { \l_texnegar_min_penalty_int } }
+ \l_texnegar_low_penalty_int { \int_set:Nn \l_texnegar_line_break_penalty_int { \l_texnegar_low_penalty_int } }
+ \l_texnegar_med_penalty_int { \int_set:Nn \l_texnegar_line_break_penalty_int { \l_texnegar_med_penalty_int } }
+ \l_texnegar_high_penalty_int { \int_set:Nn \l_texnegar_line_break_penalty_int { \l_texnegar_high_penalty_int } }
+ \l_texnegar_max_penalty_int { \int_set:Nn \l_texnegar_line_break_penalty_int { \l_texnegar_max_penalty_int } }
+ } { } { \int_set:Nn \l_texnegar_line_break_penalty_int { #1 } }
+ \bool_set_true:N \l_texnegar_linebreakpenalty_bool
+ } ,
+
+ kashidastretch .code:n =
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_case:NnTF \l_tmpa_tl
+ {
+ \l_texnegar_fnt_kayhan_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.14 em plus 0.5 em } }
+ \l_texnegar_fnt_kayhannavaar_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.129 em plus 0.5 em } }
+ \l_texnegar_fnt_kayhanpook_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.133 em plus 0.5 em } }
+ \l_texnegar_fnt_kayhansayeh_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.135 em plus 0.5 em } }
+ \l_texnegar_fnt_khoramshahr_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.128 em plus 0.5 em } }
+ \l_texnegar_fnt_khorramshahr_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.13 em plus 0.5 em } }
+ \l_texnegar_fnt_niloofar_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.132 em plus 0.5 em } }
+ \l_texnegar_fnt_paatch_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.127 em plus 0.5 em } }
+ \l_texnegar_fnt_riyaz_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.125 em plus 0.5 em } }
+ \l_texnegar_fnt_roya_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.142 em plus 0.5 em } }
+ \l_texnegar_fnt_shafigh_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.143 em plus 0.5 em } }
+ \l_texnegar_fnt_shafighKurd_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.126 em plus 0.5 em } }
+ \l_texnegar_fnt_shafighUzbek_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.123 em plus 0.5 em } }
+ \l_texnegar_fnt_shiraz_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.122 em plus 0.5 em } }
+ \l_texnegar_fnt_sols_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.124 em plus 0.5 em } }
+ \l_texnegar_fnt_tabriz_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.119 em plus 0.5 em } }
+ \l_texnegar_fnt_titr_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.12 em plus 0.5 em } }
+ \l_texnegar_fnt_titre_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.121 em plus 0.5 em } }
+ \l_texnegar_fnt_traffic_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.124 em plus 0.5 em } }
+ \l_texnegar_fnt_vahid_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.134 em plus 0.5 em } }
+ \l_texnegar_fnt_vosta_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.136 em plus 0.5 em } }
+ \l_texnegar_fnt_yaghut_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.138 em plus 0.5 em } }
+ \l_texnegar_fnt_yagut_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.137 em plus 0.5 em } }
+ \l_texnegar_fnt_yas_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.126 em plus 0.5 em } }
+ \l_texnegar_fnt_yekan_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.141 em plus 0.5 em } }
+ \l_texnegar_fnt_yermook_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.139 em plus 0.5 em } }
+ \l_texnegar_fnt_zar_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.116 em plus 0.5 em } }
+ \l_texnegar_fnt_ziba_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.119 em plus 0.5 em } }
+ \l_texnegar_fnt_default_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.14 em plus 0.5 em } }
+ \l_texnegar_fnt_noskip_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0 em plus 0.5 em } }
+ } { } { \tl_set:Nn \l_texnegar_skip_default_tl { #1 } }
+ } ,
+ kashidastretch .default:n = \tl_set:Nn \l_texnegar_skip_default_tl { 0 em plus 0.5 em } ,
+
+ ligatures .code:n =
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_case:NnTF \l_tmpa_tl
+ {
+ \l_texnegar_lig_aalt_tl { \tl_set:Nx \l_texnegar_active_ligs_tl { \l_texnegar_lig_aalt_tl } }
+ \l_texnegar_lig_ccmp_tl { \tl_set:Nx \l_texnegar_active_ligs_tl { \l_texnegar_lig_ccmp_tl } }
+ \l_texnegar_lig_dlig_tl { \tl_set:Nx \l_texnegar_active_ligs_tl { \l_texnegar_lig_dlig_tl } }
+ \l_texnegar_lig_fina_tl { \tl_set:Nx \l_texnegar_active_ligs_tl { \l_texnegar_lig_fina_tl } }
+ \l_texnegar_lig_init_tl { \tl_set:Nx \l_texnegar_active_ligs_tl { \l_texnegar_lig_init_tl } }
+ \l_texnegar_lig_locl_tl { \tl_set:Nx \l_texnegar_active_ligs_tl { \l_texnegar_lig_locl_tl } }
+ \l_texnegar_lig_medi_tl { \tl_set:Nx \l_texnegar_active_ligs_tl { \l_texnegar_lig_medi_tl } }
+ \l_texnegar_lig_rlig_tl { \tl_set:Nx \l_texnegar_active_ligs_tl { \l_texnegar_lig_rlig_tl } }
+ \l_texnegar_lig_default_tl { \tl_set:Nx \l_texnegar_active_ligs_tl { \l_texnegar_lig_default_tl } }
+ } { } { \tl_set:Nn \l_texnegar_active_ligs_tl { #1 } }
+ \bool_set_true:N \l_texnegar_ligature_bool
+ } ,
+ ligatures .default:n = \tl_set:Nn \l_texnegar_active_ligs_tl { \l_texnegar_lig_default_tl } ,
+
+ color .code:n =
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_if_empty:NTF \l_tmpa_tl
+ {
+ \tl_set:Nx \l_texnegar_color_tl { \l_texnegar_col_default_tl }
+ }
+ {
+ \tl_set:Nx \l_texnegar_color_tl { \l_tmpa_tl }
+ }
+ \bool_set_true:N \l_texnegar_color_bool
+ \sys_if_engine_luatex:T
+ {
+ \convertcolorspec{named}{\l_texnegar_color_tl}{rgb}\l_texnegar_color_rgb_tl
+ \sys_if_engine_luatex:T
+ {
+ \directlua{l_texnegar_color_rgb_tl = "\l_texnegar_color_rgb_tl"}
+ }
+ }
+ } ,
+
+ hboxrecursion .code:n =
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_case:NnTF \l_tmpa_tl
+ {
+ \l_texnegar_hboxrecursion_off_tl
+ {
+ \bool_set_false:N \l_texnegar_hboxrecursion_bool
+ }
+ \l_texnegar_hboxrecursion_on_tl
+ {
+ \bool_set_true:N \l_texnegar_hboxrecursion_bool
+ }
+ } { } { \bool_set_false:N \l_texnegar_hboxrecursion_bool }
+ } ,
+ hboxrecursion .default:n = \bool_set_true:N \l_texnegar_hboxrecursion_bool ,
+
+ vboxrecursion .code:n =
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_case:NnTF \l_tmpa_tl
+ {
+ \l_texnegar_vboxrecursion_off_tl
+ {
+ \bool_set_false:N \l_texnegar_vboxrecursion_bool
+ }
+ \l_texnegar_vboxrecursion_on_tl
+ {
+ \bool_set_true:N \l_texnegar_vboxrecursion_bool
+ }
+ } { } { \bool_set_false:N \l_texnegar_vboxrecursion_bool }
+ } ,
+ vboxrecursion .default:n = \bool_set_true:N \l_texnegar_vboxrecursion_bool ,
+ }
+
+\ProcessKeysOptions { texnegar }
+
+\sys_if_engine_luatex:T
+ {
+ \NewDocumentCommand \KashidaHMFixOff {} { \directlua{StopStretching()} }
+ \NewDocumentCommand \KashidaHMFixOn {} { \directlua{StartStretching()} }
+ }
+
+\sys_if_engine_xetex:T
+ {
+ \NewDocumentCommand \KashidaHMFixOn {} { \bool_set_true:N \l_texnegar_kashida_fix_bool }
+ \NewDocumentCommand \KashidaHMFixOff {} { \bool_set_false:N \l_texnegar_kashida_fix_bool }
+ }
+
+\tex_let:D \KashidaOn \KashidaHMFixOn
+\tex_let:D \KashidaOff \KashidaHMFixOff
+
+\bool_if:NTF \l_texnegar_kashida_fix_bool
+ {
+ \tl_if_empty:NT \l_texnegar_skip_default_tl { \tl_set:Nn \l_texnegar_skip_default_tl { 0.14 em plus 0.5 em } }
+ }
+ {
+ \tl_set:NV \l_texnegar_skip_default_tl \c_texnegar_skip_a_tl
+ }
+
+%% % \makeatletter
+%% % \newif\if@Kashida@on
+%% Becuase Vafa Khalighi has copied the above code (injecting the character uni+200E) in xepersian-23.0
+%% (https://tug.org/svn/texlive/trunk/Master/texmf-dist/tex/xelatex/xepersian/kashida-xepersian.def?revision=55165&view=co),
+%% the following line of code is not needed in xepersian anymore.
+%% % \newif\if@Kashida@XB@fix
+%% % \makeatother
+
+\bool_if:NF \l_texnegar_minimal_bool
+ {
+ \directlua{dofile(kpse.find_file("luatex-tools.lua"))}
+ \input texnegar-luabidi.tex
+ }
+
+ \endinput
+%</texnegar-ini-tex>
+% \end{macrocode}
+%
+% \subsection{File: \texttt{texnegar-common-kashida.tex}}
+% \begin{macrocode}
+%<*texnegar-common-kashida-tex>
+\ProvidesExplFile {texnegar-common-kashida.tex} {2021-02-09} {0.1e} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
+
+\bool_if:NT \l_texnegar_ligature_bool
+{
+ \clist_new:N \l_texnegar_ligatures_clist
+ \int_new:N \l_texnegar_lig_names_len_int
+ \int_set:Nn \l_texnegar_lig_names_len_int { \clist_count:N \l_texnegar_lig_names_clist }
+ \int_step_inline:nnnn { 1 } { 2 } { \l_texnegar_lig_names_len_int }
+ {
+ \int_set:Nn \l_tmpa_int { #1 }
+ \int_set:Nn \l_tmpb_int { \int_eval:n { \l_tmpa_int + 1 } }
+ \tl_set:Nf \l_tmpa_tl { \clist_item:Nn \l_texnegar_lig_names_clist { \l_tmpa_int } }
+ \clist_set:Nx \l_tmpa_clist { { \clist_item:Nn \l_texnegar_lig_names_clist { \l_tmpb_int } } }
+ \bool_if:nT { \tl_if_eq_p:NN \l_texnegar_active_ligs_tl \l_tmpa_tl || \tl_if_eq_p:NN \l_texnegar_active_ligs_tl \l_texnegar_lig_default_tl }
+ {
+ \clist_put_left:Nx \l_texnegar_ligatures_clist { \l_tmpa_clist }
+ }
+ }
+ \clist_map_inline:Nn \l_texnegar_ligatures_clist
+ {
+ \seq_set_split:Nnn \l_tmpa_seq { = } { #1 }
+ \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl { } { }
+ \seq_pop_left:NN \l_tmpa_seq \l_tmpb_tl { } { }
+ \tl_const:cx { \tl_use:N \l_tmpb_tl } { \char"\l_tmpa_tl \ }
+ }
+}
+
+\bool_if:NT \l_texnegar_linebreakpenalty_bool
+{
+ %% Partly adapted from LaTeX2e source
+ \cs_new:Nn \texnegar_line_break: {
+ \if_mode_vertical:
+ \GenericError{
+ \space\space\space\space\space\space\space\space\space\space\space\space\space\space\space
+ }{
+ LaTeX Error: There’s no line here to end
+ }{
+ See the LaTeX manual or LaTeX Companion for explanation.
+ }{
+ Your command was ignored.\MessageBreak
+ Type \space I <command> <return> \space to replace it~
+ with another command,\MessageBreak
+ or \space <return> \space to continue without it.}
+ \else:
+ \l_tmpa_skip \tex_lastskip:D
+ \tex_unskip:D
+ \tex_penalty:D -\l_texnegar_line_break_penalty_int
+ \dim_compare:nT { \l_tmpa_skip > \c_zero_skip }
+ { \skip_horizontal:N \l_tmpa_skip \tex_ignorespaces:D }
+ \fi:
+ }
+
+ \NewDocumentCommand { \discouragebadlinebreaks } { O{\l_texnegar_line_break_penalty_int} O{\c_texnegar_skip_b_tl} m }
+ {
+ \IfNoValueF {#1}
+ { \int_set:Nn \l_texnegar_line_break_penalty_int {#1} }
+ \IfNoValueF {#2}
+ { \tl_set:Nn \l_texnegar_skip_default_tl {#2} }
+ \texnegar_put_line_breaks:n { #3 }
+ }
+
+ \cs_new_protected:Nn \texnegar_put_line_breaks:n
+ {
+ \tl_set:Nn \l_texnegar_line_break_tl { #1 }
+ \regex_replace_all:nnN { ([ابپتثجحخچدذرزژسشعغصضفقطظکگلمنوهیـ])+ } { \ \0 \ \c{texnegar_line_break:}\ } \l_texnegar_line_break_tl
+ \tl_use:N \l_texnegar_line_break_tl
+ }
+}
+
+ \endinput
+%</texnegar-common-kashida-tex>
+% \end{macrocode}
+%
+% \subsection{File: \texttt{texnegar-xetex-kashida.tex}}
+%
+% \begin{macrocode}
+%<*texnegar-xetex-kashida-tex>
+\ProvidesExplFile {texnegar-xetex-kashida.tex} {2021-02-09} {0.1e} { Full implementation of kashida feature in XeLaTex and LuaLaTeX }
+
+\newXeTeXintercharclass \c_texnegar_d_charclass % dual-joiner class
+\newXeTeXintercharclass \c_texnegar_l_charclass % lam
+\newXeTeXintercharclass \c_texnegar_r_charclass % right-joiner
+\newXeTeXintercharclass \c_texnegar_a_charclass % alef
+\newXeTeXintercharclass \c_texnegar_y_charclass % yeh
+
+\tex_input:D { texnegar-common-kashida.tex }
+
+\tl_set:Nn \l_texnegar_use_color_tl
+ {
+ \bool_if:NTF \l_texnegar_color_bool
+ {
+ \colorlet{default}{\l_texnegar_color_tl}
+ }
+ {
+ \colorlet{default}{.}
+ }
+ \color{default}
+ }
+
+%% Partly adapted from the code provided by David Carlisle in:
+%% https://tex.stackexchange.com/questions/356709/how-to-know-the-width-and-fill-the-glue-space-between-two-characters-when-using/356721#356721
+\cs_new:Npn \texnegar_kashida_glyph #1
+{
+ \bool_if:NT \l_texnegar_kashida_fix_bool
+ {
+ \c_texnegar_lrm_int\tex_penalty:D 10000
+ \mode_leave_vertical:
+ \tex_global:D \tex_advance:D \l_texnegar_counter_int \c_one_int
+
+ \tl_set:Nx \l_texnegar_pos_tl { p\tex_romannumeral:D \l_texnegar_counter_int }
+ \tl_set:Nx \l_texnegar_zref_tl { z\tex_romannumeral:D \l_texnegar_counter_int }
+
+ \zsaveposx{x_i_\l_texnegar_zref_tl}
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \iow_now:cx { @auxout }
+ {
+ \token_to_str:N \gdef \exp_after:wN \token_to_str:N \cs:w xi\l_texnegar_pos_tl \cs_end: { \zposx{ x_i_\l_texnegar_zref_tl } }
+ }
+ }
+ \l_tmpa_tl
+ \skip_horizontal:n { #1 }
+ \zsaveposx{x_f_\l_texnegar_zref_tl}
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \iow_now:cx { @auxout }
+ {
+ \token_to_str:N \gdef \exp_after:wN \token_to_str:N \cs:w xf\l_texnegar_pos_tl \cs_end: { \zposx{ x_f_\l_texnegar_zref_tl } }
+ }
+ }
+ \l_tmpa_tl
+ \exp_after:wN
+ \if_meaning:w
+ \cs:w xi\l_texnegar_pos_tl \cs_end: \tex_relax:D
+ \else:
+ \dim_set:Nn \l_texnegar_diff_pos_dim
+ {
+ \dim_eval:n { \cs:w xi\l_texnegar_pos_tl \cs_end: sp - \cs:w xf\l_texnegar_pos_tl \cs_end: sp }
+ }
+ \dim_compare:nTF { \l_texnegar_diff_pos_dim == 0sp }
+ { }
+ { \llap { \resizebox { \l_texnegar_diff_pos_dim \tex_relax:D } { \height } { \l_texnegar_use_color_tl \c_texnegar_ksh_int } } }
+ \fi:
+ }
+}
+
+\cs_new:Npn \texnegar_kashida_leaders #1
+{
+ \bool_if:NT \l_texnegar_kashida_fix_bool
+ {
+ \tl_if_eq:NNTF \l_texnegar_gap_filler_tl \l_texnegar_stretch_leaders_glyph_tl
+ {
+ \tl_set:Nx \l_texnegar_font_full_tl { \tex_fontname:D \tex_the:D \tex_font:D }
+ \tl_set:Nx \l_texnegar_font_name_tl { \l_texnegar_font_full_tl }
+ \tl_set:Nx \l_texnegar_font_init_tl { \l_texnegar_font_name_tl }
+ \regex_replace_once:nnN { ^"\[?(HM)[\_\ ](X|F).* } { \1\2 } \l_texnegar_font_init_tl\relax
+ \tl_set:Nn \l_tmpa_tl { HMF }
+ \tl_set:Nn \l_tmpb_tl { HMX }
+ \bool_if:nTF { \str_if_eq_p:NN { \l_texnegar_font_init_tl } { \l_tmpa_tl } || \str_if_eq_p:NN { \l_texnegar_font_init_tl } { \l_tmpb_tl } }
+ {
+ \hbox_set:Nn \l_texnegar_ksh_box { \l_texnegar_use_color_tl \XeTeXglyph\XeTeXglyphindex"kashida" }
+ \c_texnegar_zwj_int \tex_penalty:D 10000
+ \tex_leaders:D \copy\l_texnegar_ksh_box \skip_horizontal:n { #1 }
+ \c_texnegar_zwj_int
+ }
+ {
+ \msg_error:nnx { texnegar } { hm-series-font-not-found } { \l_texnegar_font_name_tl }
+ }
+ }
+ {
+ %% Partly adapted from the code provided by Jonathan Kew in:
+ %% https://tug.org/pipermail/xetex/2009-February/012307.html.
+ %% Somebody notified me that the code in 'kashida-xepersian.def' from xepersian
+ %% package is an exact copy of Jonathan Kew's code. Being unaware of this, in
+ %% the earlier versions of this package I made a mistake and acknowledged
+ %% Vafa Khalighi instead of Jonathan Kew. A sincere thank you to Jonathan Kew
+ %% for his excellent code.
+ \c_texnegar_lrm_int\c_texnegar_zwj_int
+ {\l_texnegar_use_color_tl\tex_penalty:D 10000
+ \tex_leaders:D \tex_hrule:D height \XeTeXglyphbounds \c_texnegar_two_int
+ \int_use:N \XeTeXcharglyph \c_texnegar_ksh_int depth \XeTeXglyphbounds \c_texnegar_four_int
+ \int_use:N \XeTeXcharglyph \c_texnegar_ksh_int \skip_horizontal:n { #1 }
+ }
+ \c_texnegar_zwj_int
+ }
+ }
+}
+
+\XeTeXinterchartokenstate = 1
+
+\clist_set:Nn \l_texnegar_a_clist { 0622,0623,0625,0627 } % ‏ا، إ، أ، آ‏
+\clist_map_inline:Nn \l_texnegar_a_clist
+ {
+ \XeTeXcharclass "#1 \c_texnegar_a_charclass
+ }
+
+\clist_set:Nn \l_texnegar_d_clist { 0626,0628,062A,062B,062C,062D,062E,0633,0634,0635,0636,0637,0638,0639,063A,0640,0641,0642,0643,0645,0646,0647,067E,0686,06A9,06AF } % ‏ئ,ب,ت,ث,ج,ح,خ,س,ش,ص,ض,ط,ظ,ع,غ,ـ,ف,ق,ك,م,ن,ه,پ,چ,ک,گ‏
+\clist_map_inline:Nn \l_texnegar_d_clist
+ {
+ \XeTeXcharclass "#1 \c_texnegar_d_charclass
+ }
+
+\clist_set:Nn \l_texnegar_l_clist { 0644 } % ‏ل‏
+\clist_map_inline:Nn \l_texnegar_l_clist
+ {
+ \XeTeXcharclass "#1 \c_texnegar_l_charclass
+ }
+
+\clist_set:Nn \l_texnegar_r_clist { 0624,0629,062F,0630,0631,0632,0648,0698 } % ‏ؤ,ة,د,ذ,ر,ز,و,ژ‏
+\clist_map_inline:Nn \l_texnegar_r_clist
+ {
+ \XeTeXcharclass "#1 \c_texnegar_r_charclass
+ }
+
+\clist_set:Nn \l_texnegar_y_clist { 0649,064A,06CC } % ‏ی,ي,ى‏
+\clist_map_inline:Nn \l_texnegar_y_clist
+ {
+ \XeTeXcharclass "#1 \c_texnegar_y_charclass
+ }
+
+\tl_if_eq:NNTF \l_texnegar_gap_filler_tl \l_texnegar_stretch_glyph_tl {
+ \XeTeXinterchartoks \c_texnegar_y_charclass \c_texnegar_y_charclass = {
+ \bool_if:NTF \l_texnegar_kashida_fix_bool
+ { \c_texnegar_zwj_int \texnegar_kashida_glyph \l_texnegar_skip_default_tl \c_texnegar_zwj_int }
+ { \c_texnegar_zwj_int \texnegar_kashida_glyph \c_texnegar_skip_a_tl \c_texnegar_zwj_int }
+ }
+ \XeTeXinterchartoks \c_texnegar_d_charclass \c_texnegar_y_charclass = {
+ \bool_if:NTF \l_texnegar_kashida_fix_bool
+ { \c_texnegar_zwj_int \texnegar_kashida_glyph \l_texnegar_skip_default_tl \c_texnegar_zwj_int }
+ { \c_texnegar_zwj_int \texnegar_kashida_glyph \c_texnegar_skip_a_tl \c_texnegar_zwj_int }
+ }
+ \XeTeXinterchartoks \c_texnegar_y_charclass \c_texnegar_d_charclass = { \c_texnegar_zwj_int \texnegar_kashida_glyph \c_texnegar_skip_a_tl \c_texnegar_zwj_int }
+ \XeTeXinterchartoks \c_texnegar_d_charclass \c_texnegar_d_charclass = { \c_texnegar_zwj_int \texnegar_kashida_glyph \c_texnegar_skip_a_tl \c_texnegar_zwj_int }
+ \XeTeXinterchartoks \c_texnegar_l_charclass \c_texnegar_d_charclass = { \c_texnegar_zwj_int \texnegar_kashida_glyph \c_texnegar_skip_a_tl \c_texnegar_zwj_int }
+ \XeTeXinterchartoks \c_texnegar_d_charclass \c_texnegar_l_charclass = { \c_texnegar_zwj_int \texnegar_kashida_glyph \c_texnegar_skip_a_tl \c_texnegar_zwj_int }
+ \XeTeXinterchartoks \c_texnegar_l_charclass \c_texnegar_l_charclass = { \c_texnegar_zwj_int \texnegar_kashida_glyph \c_texnegar_skip_a_tl \c_texnegar_zwj_int }
+ \XeTeXinterchartoks \c_texnegar_d_charclass \c_texnegar_r_charclass = { \c_texnegar_zwj_int \texnegar_kashida_glyph \c_texnegar_skip_a_tl \c_texnegar_zwj_int }
+ \XeTeXinterchartoks \c_texnegar_d_charclass \c_texnegar_a_charclass = { \c_texnegar_zwj_int \texnegar_kashida_glyph \c_texnegar_skip_a_tl \c_texnegar_zwj_int }
+ \XeTeXinterchartoks \c_texnegar_l_charclass \c_texnegar_r_charclass = { \c_texnegar_zwj_int \texnegar_kashida_glyph \c_texnegar_skip_a_tl \c_texnegar_zwj_int }
+ \XeTeXinterchartoks \c_texnegar_l_charclass \c_texnegar_a_charclass = { }
+}
+{
+ \bool_if:nTF {
+ \tl_if_eq_p:NN \l_texnegar_gap_filler_tl \l_texnegar_stretch_leaders_glyph_tl ||
+ \tl_if_eq_p:NN \l_texnegar_gap_filler_tl \l_texnegar_stretch_leaders_hrule_tl
+ }
+ {
+ \XeTeXinterchartoks \c_texnegar_y_charclass \c_texnegar_y_charclass = {
+ \bool_if:NTF \l_texnegar_kashida_fix_bool
+ { \texnegar_kashida_leaders \l_texnegar_skip_default_tl }
+ { \texnegar_kashida_leaders \c_texnegar_skip_a_tl }
+ }
+ \XeTeXinterchartoks \c_texnegar_d_charclass \c_texnegar_y_charclass = {
+ \bool_if:NTF \l_texnegar_kashida_fix_bool
+ { \texnegar_kashida_leaders \l_texnegar_skip_default_tl }
+ { \texnegar_kashida_leaders \c_texnegar_skip_a_tl }
+ }
+ \XeTeXinterchartoks \c_texnegar_y_charclass \c_texnegar_d_charclass = { \texnegar_kashida_leaders \c_texnegar_skip_a_tl }
+ \XeTeXinterchartoks \c_texnegar_d_charclass \c_texnegar_d_charclass = { \texnegar_kashida_leaders \c_texnegar_skip_a_tl }
+ \XeTeXinterchartoks \c_texnegar_l_charclass \c_texnegar_d_charclass = { \texnegar_kashida_leaders \c_texnegar_skip_a_tl }
+ \XeTeXinterchartoks \c_texnegar_d_charclass \c_texnegar_l_charclass = { \texnegar_kashida_leaders \c_texnegar_skip_a_tl }
+ \XeTeXinterchartoks \c_texnegar_l_charclass \c_texnegar_l_charclass = { \texnegar_kashida_leaders \c_texnegar_skip_a_tl }
+ \XeTeXinterchartoks \c_texnegar_d_charclass \c_texnegar_r_charclass = { \texnegar_kashida_leaders \c_texnegar_skip_a_tl }
+ \XeTeXinterchartoks \c_texnegar_d_charclass \c_texnegar_a_charclass = { \texnegar_kashida_leaders \c_texnegar_skip_a_tl }
+ \XeTeXinterchartoks \c_texnegar_l_charclass \c_texnegar_r_charclass = { \texnegar_kashida_leaders \c_texnegar_skip_a_tl }
+ \XeTeXinterchartoks \c_texnegar_l_charclass \c_texnegar_a_charclass = { }
+ }
+ {
+ \msg_error:nnx { texnegar } { error-value-not-available-for-kashida-option } { \l_texnegar_gap_filler_tl }
+ }
+}
+
+ \endinput
+%</texnegar-xetex-kashida-tex>
+% \end{macrocode}
+%
+% \subsection{File: \texttt{texnegar-char-table.lua}}
+%
+% \begin{macrocode}
+%<*texnegar-char-table-lua>
+--
+-- This is file `texnegar-char-table.lua',
+-- generated with the docstrip utility.
+--
+-- The original source files were:
+--
+-- texnegar.dtx (with options: `texnegar-char-table-lua')
+--
+-- Copyright (C) 2020-2021 Hossein Movahhedian
+--
+-- It may be distributed and/or modified under the LaTeX Project Public License,
+-- version 1.3c or higher (your choice). The latest version of
+-- this license is at: http://www.latex-project.org/lppl.txt
+--
+-- texnegar_char_table = texnegar_char_table or {}
+-- local texnegar_char_table = texnegar_char_table
+-- texnegar_char_table.module = {
+-- name = "texnegar_char_table",
+-- version = "0.1e",
+-- date = "2021-02-09",
+-- description = "Full implementation of kashida feature in XeLaTex and LuaLaTeX",
+-- author = "Hossein Movahhedian",
+-- copyright = "Hossein Movahhedian",
+-- license = "LPPL v1.3c"
+-- }
+--
+-- -- ^^A%% texnegar-lua.dtx -- part of TEXNEGAR <bitbucket.org/dma8hm1334/texnegar>
+-- local err, warn, info, log = luatexbase.provides_module(texnegar_char_table.module)
+-- texnegar_char_table.log = log or (function (s) luatexbase.module_info("texnegar_char_table", s) end)
+-- texnegar_char_table.warning = warn or (function (s) luatexbase.module_warning("texnegar_char_table", s) end)
+-- texnegar_char_table.error = err or (function (s) luatexbase.module_error("texnegar_char_table", s) end)
+
+local peCharTableDiacritic = {
+ [1611] = utf8.char(1611), -- "ً", utf8.codepoint("ً") == 1611, "\u{064B}", ARABIC-FATHATAN
+ [1612] = utf8.char(1612), -- "ٌ", utf8.codepoint("ٌ") == 1612, "\u{064C}", ARABIC-DAMMATAN
+ [1613] = utf8.char(1613), -- "ٍ", utf8.codepoint("ٍ") == 1613, "\u{064D}", ARABIC-KASRATAN
+ [1614] = utf8.char(1614), -- "َ", utf8.codepoint("َ") == 1614, "\u{064E}", ARABIC-FATHA
+ [1615] = utf8.char(1615), -- "ُ", utf8.codepoint("ُ") == 1615, "\u{064F}", ARABIC-DAMMA
+ [1616] = utf8.char(1616), -- "ِ", utf8.codepoint("ِ") == 1616, "\u{0650}", ARABIC-KASRA
+ [1617] = utf8.char(1617), -- "ّ", utf8.codepoint("ّ") == 1617, "\u{0651}", ARABIC-SHADDA
+ [1618] = utf8.char(1618), -- "ْ", utf8.codepoint("ْ") == 1618, "\u{0652}", ARABIC-SUKUN
+ [1619] = utf8.char(1619), -- "ٓ", utf8.codepoint("ٓ") == 1619, "\u{0653}", ARABIC-MADDA ABOVE
+ [1620] = utf8.char(1620), -- "ٔ", utf8.codepoint("ٔ") == 1620, "\u{0654}", ARABIC-HAMZA ABOVE
+ [1621] = utf8.char(1621), -- "ٕ", utf8.codepoint("ٕ") == 1621, "\u{0655}", ARABIC-HAMZA BELOW
+ [1622] = utf8.char(1622), -- "ٖ", utf8.codepoint("ٖ") == 1622, "\u{0656}", ARABIC-SUBSCRIPT ALEF
+ [1623] = utf8.char(1623), -- "ٗ", utf8.codepoint("ٗ") == 1623, "\u{0657}", ARABIC-INVERTED DAMMA
+ [1624] = utf8.char(1624), -- "٘", utf8.codepoint("٘") == 1624, "\u{0658}", ARABIC-MARK NOON GHUNNA
+ [1625] = utf8.char(1625), -- "ٙ", utf8.codepoint("ٙ") == 1625, "\u{0659}", ARABIC-ZWARAKAY
+ [1648] = utf8.char(1648), -- "", utf8.codepoint("") == 1648, "\u{0670}", ARABIC-SUPERSCRIPT ALEF
+ [64606] = utf8.char(64606), -- "", utf8.codepoint("") == 64606, "\u{FC5E}", ARABIC-LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM
+ [64607] = utf8.char(64607), -- "", utf8.codepoint("") == 64607, "\u{FC5F}", ARABIC-LIGATURE SHADDA WITH KASRATAN ISOLATED FORM
+ [64608] = utf8.char(64608), -- "", utf8.codepoint("") == 64608, "\u{FC60}", ARABIC-LIGATURE SHADDA WITH FATHA ISOLATED FORM
+ [64609] = utf8.char(64609), -- "", utf8.codepoint("") == 64609, "\u{FC61}", ARABIC-LIGATURE SHADDA WITH DAMMA ISOLATED FORM
+ [64610] = utf8.char(64610), -- "", utf8.codepoint("") == 64610, "\u{FC62}", ARABIC-LIGATURE SHADDA WITH KASRA ISOLATED FORM
+ [64611] = utf8.char(64611), -- "", utf8.codepoint("") == 64611, "\u{FC63}", ARABIC-LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+}
+
+local peCharTableDigit = {
+ [1632] = utf8.char(1632), -- "٠", utf8.codepoint("٠") == 1632, "\u{0660}", ARABIC-INDIC DIGIT ZERO
+ [1633] = utf8.char(1633), -- "١", utf8.codepoint("١") == 1633, "\u{0661}", ARABIC-INDIC DIGIT ONE
+ [1634] = utf8.char(1634), -- "٢", utf8.codepoint("٢") == 1634, "\u{0662}", ARABIC-INDIC DIGIT TWO
+ [1635] = utf8.char(1635), -- "٣", utf8.codepoint("٣") == 1635, "\u{0663}", ARABIC-INDIC DIGIT THREE
+ [1636] = utf8.char(1636), -- "٤", utf8.codepoint("٤") == 1636, "\u{0664}", ARABIC-INDIC DIGIT FOUR
+ [1637] = utf8.char(1637), -- "٥", utf8.codepoint("٥") == 1637, "\u{0665}", ARABIC-INDIC DIGIT FIVE
+ [1638] = utf8.char(1638), -- "٦", utf8.codepoint("٦") == 1638, "\u{0666}", ARABIC-INDIC DIGIT SIX
+ [1639] = utf8.char(1639), -- "٧", utf8.codepoint("٧") == 1639, "\u{0667}", ARABIC-INDIC DIGIT SEVEN
+ [1640] = utf8.char(1640), -- "٨", utf8.codepoint("٨") == 1640, "\u{0668}", ARABIC-INDIC DIGIT EIGHT
+ [1641] = utf8.char(1641), -- "٩", utf8.codepoint("٩") == 1641, "\u{0669}", ARABIC-INDIC DIGIT NINE
+ [1780] = utf8.char(1780), -- "۴", utf8.codepoint("۴") == 1780, "\u{06F4}", EXTENDED ARABIC-INDIC DIGIT FOUR
+ [1781] = utf8.char(1781), -- "۵", utf8.codepoint("۵") == 1781, "\u{06F5}", EXTENDED ARABIC-INDIC DIGIT FIVE
+ [1782] = utf8.char(1782), -- "۶", utf8.codepoint("۶") == 1782, "\u{06F6}", EXTENDED ARABIC-INDIC DIGIT SIX
+}
+
+local peCharTablePunctuation = {
+ [1548] = utf8.char(1548), -- "،", utf8.codepoint("،") == 1548, "\u{060C}", ARABIC COMMA
+ [1549] = utf8.char(1549), -- "؍", utf8.codepoint("؍") == 1549, "\u{060D}", ARABIC DATE SEPARATOR
+ [1563] = utf8.char(1563), -- "؛", utf8.codepoint("؛") == 1563, "\u{061B}", ARABIC SEMICOLON
+ [1567] = utf8.char(1567), -- "؟", utf8.codepoint("؟") == 1567, "\u{061F}", ARABIC QUESTION MARK
+ [1642] = utf8.char(1642), -- "٪", utf8.codepoint("٪") == 1642, "\u{066A}", ARABIC PERCENT SIGN
+ [1643] = utf8.char(1643), -- "٫", utf8.codepoint("٫") == 1643, "\u{066B}", ARABIC DECIMAL SEPARATOR
+ [1644] = utf8.char(1644), -- "٬", utf8.codepoint("٬") == 1644, "\u{066C}", ARABIC THOUSANDS SEPARATOR
+ [1645] = utf8.char(1645), -- "٭", utf8.codepoint("٭") == 1645, "\u{066D}", ARABIC FIVE POINTED STAR
+}
+
+local peCharTable = {
+ [1569] = utf8.char(1569), -- "ء", utf8.codepoint("ء") == 1569, "\u{0621}", ARABIC LETTER ALEF HAMZA
+ [1570] = utf8.char(1570), -- "آ", utf8.codepoint("آ") == 1570, "\u{0622}", ARABIC LETTER ALEF WITH MADDA ABOVE
+ [1571] = utf8.char(1571), -- "أ", utf8.codepoint("أ") == 1571, "\u{0623}", ARABIC LETTER ALEF WITH HAMZA ABOVE
+ [1572] = utf8.char(1572), -- "ؤ", utf8.codepoint("ؤ") == 1572, "\u{0624}", ARABIC LETTER WAW WITH HAMZA ABOVE
+ [1573] = utf8.char(1573), -- "إ", utf8.codepoint("إ") == 1573, "\u{0625}", ARABIC LETTER ALEF WITH HAMZA BELOW
+ [1574] = utf8.char(1574), -- "ئ", utf8.codepoint("ئ") == 1574, "\u{0626}", ARABIC LETTER YEH WITH HAMZA ABOVE
+ [1575] = utf8.char(1575), -- "ا", utf8.codepoint("ا") == 1575, "\u{0627}", ARABIC LETTER ALEF
+ [1576] = utf8.char(1576), -- "ب", utf8.codepoint("ب") == 1576, "\u{0628}", ARABIC LETTER BEH
+ [1577] = utf8.char(1577), -- "ة", utf8.codepoint("ة") == 1577, "\u{0629}", ARABIC LETTER TEH MARBUTA
+ [1578] = utf8.char(1578), -- "ت", utf8.codepoint("ت") == 1578, "\u{062A}", ARABIC LETTER TEH
+ [1579] = utf8.char(1579), -- "ث", utf8.codepoint("ث") == 1579, "\u{062B}", ARABIC LETTER THEH
+ [1580] = utf8.char(1580), -- "ج", utf8.codepoint("ج") == 1580, "\u{062C}", ARABIC LETTER JEEM
+ [1581] = utf8.char(1581), -- "ح", utf8.codepoint("ح") == 1581, "\u{062D}", ARABIC LETTER HAH
+ [1582] = utf8.char(1582), -- "خ", utf8.codepoint("خ") == 1582, "\u{062E}", ARABIC LETTER KHAH
+ [1583] = utf8.char(1583), -- "د", utf8.codepoint("د") == 1583, "\u{062F}", ARABIC LETTER DAL
+ [1584] = utf8.char(1584), -- "ذ", utf8.codepoint("ذ") == 1584, "\u{0630}", ARABIC LETTER THAL
+ [1585] = utf8.char(1585), -- "ر", utf8.codepoint("ر") == 1585, "\u{0631}", ARABIC LETTER REH
+ [1586] = utf8.char(1586), -- "ز", utf8.codepoint("ز") == 1586, "\u{0632}", ARABIC LETTER ZAIN
+ [1587] = utf8.char(1587), -- "س", utf8.codepoint("س") == 1587, "\u{0633}", ARABIC LETTER SEEN
+ [1588] = utf8.char(1588), -- "ش", utf8.codepoint("ش") == 1588, "\u{0634}", ARABIC LETTER SHEEN
+ [1589] = utf8.char(1589), -- "ص", utf8.codepoint("ص") == 1589, "\u{0635}", ARABIC LETTER SAD
+ [1590] = utf8.char(1590), -- "ض", utf8.codepoint("ض") == 1590, "\u{0636}", ARABIC LETTER DAD
+ [1591] = utf8.char(1591), -- "ط", utf8.codepoint("ط") == 1591, "\u{0637}", ARABIC LETTER TAH
+ [1592] = utf8.char(1592), -- "ظ", utf8.codepoint("ظ") == 1592, "\u{0638}", ARABIC LETTER ZAH
+ [1593] = utf8.char(1593), -- "ع", utf8.codepoint("ع") == 1593, "\u{0639}", ARABIC LETTER AIN
+ [1594] = utf8.char(1594), -- "غ", utf8.codepoint("غ") == 1594, "\u{063A}", ARABIC LETTER GHAIN
+ [1601] = utf8.char(1601), -- "ف", utf8.codepoint("ف") == 1601, "\u{0641}", ARABIC LETTER FEH
+ [1602] = utf8.char(1602), -- "ق", utf8.codepoint("ق") == 1602, "\u{0642}", ARABIC LETTER QAF
+ [1603] = utf8.char(1603), -- "ك", utf8.codepoint("ك") == 1603, "\u{0643}", ARABIC LETTER KAF
+ [1604] = utf8.char(1604), -- "ل", utf8.codepoint("ل") == 1604, "\u{0644}", ARABIC LETTER LAM
+ [1605] = utf8.char(1605), -- "م", utf8.codepoint("م") == 1605, "\u{0645}", ARABIC LETTER MEEM
+ [1606] = utf8.char(1606), -- "ن", utf8.codepoint("ن") == 1606, "\u{0646}", ARABIC LETTER NOON
+ [1607] = utf8.char(1607), -- "ه", utf8.codepoint("ه") == 1607, "\u{0647}", ARABIC LETTER HEH
+ [1608] = utf8.char(1608), -- "و", utf8.codepoint("و") == 1608, "\u{0648}", ARABIC LETTER WAW
+ [1609] = utf8.char(1609), -- "ى", utf8.codepoint("ى") == 1609, "\u{0649}", ARABIC LETTER ALEF MAKSURA
+ [1610] = utf8.char(1610), -- "ي", utf8.codepoint("ي") == 1610, "\u{064A}", ARABIC LETTER YEH
+ [1662] = utf8.char(1662), -- "پ", utf8.codepoint("پ") == 1662, "\u{067E}", ARABIC LETTER PEH
+ [1670] = utf8.char(1670), -- "چ", utf8.codepoint("چ") == 1670, "\u{0686}", ARABIC LETTER TCHEH
+ [1688] = utf8.char(1688), -- "ژ", utf8.codepoint("ژ") == 1688, "\u{0698}", ARABIC LETTER JEH
+ [1705] = utf8.char(1705), -- "ک", utf8.codepoint("ک") == 1705, "\u{06A9}", ARABIC LETTER KEHEH
+ [1706] = utf8.char(1706), -- "ڪ", utf8.codepoint("ڪ") == 1706, "\u{06AA}", ARABIC LETTER SWASH KAF
+ [1711] = utf8.char(1711), -- "گ", utf8.codepoint("گ") == 1711, "\u{06AF}", ARABIC LETTER GAF
+ [1726] = utf8.char(1726), -- "ھ", utf8.codepoint("ھ") == 1726, "\u{06BE}", ARABIC LETTER HEH DOACHASHMEE
+ [1728] = utf8.char(1728), -- "ۀ", utf8.codepoint("ۀ") == 1728, "\u{06C0}", ARABIC LETTER HEH WITH YEH ABOVE
+ [1740] = utf8.char(1740), -- "ی", utf8.codepoint("ی") == 1740, "\u{06CC}", ARABIC LETTER FARSI YEH
+ [1749] = utf8.char(1749), -- "ە", utf8.codepoint("ە") == 1740, "\u{06D5}", ARABIC LETTER AE
+ [65275] = utf8.char(65275), -- "ﻻ", utf8.codepoint("ﻻ") == 65275, "\u{FEFB}", ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+ [65276] = utf8.char(65276), -- "ﻼ", utf8.codepoint("ﻼ") == 65276, "\u{FEFC}", ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+}
+
+local peCharTableInitial = {
+ [64344] = utf8.char(64344), -- "ﭘ", utf8.codepoint("ﭘ") == 64344, "\u{FB58}", INITIAL FORM PEH
+ [64380] = utf8.char(64380), -- "ﭼ", utf8.codepoint("ﭼ") == 64380, "\u{FB7C}", INITIAL FORM TCHEH
+ [64400] = utf8.char(64400), -- "ﮐ", utf8.codepoint("ﮐ") == 64400, "\u{FB90}", INITIAL FORM KEHEH
+ [64404] = utf8.char(64404), -- "ﮔ", utf8.codepoint("ﮔ") == 64404, "\u{FB94}", INITIAL FORM GAF
+ [64510] = utf8.char(64510), -- "ﯾ", utf8.codepoint("ﯾ") == 64510, "\u{FBFE}", INITIAL FORM YEH
+ [65169] = utf8.char(65169), -- "ﺑ", utf8.codepoint("ﺑ") == 65169, "\u{FE91}", INITIAL FORM BEH
+ [65175] = utf8.char(65175), -- "ﺗ", utf8.codepoint("ﺗ") == 65175, "\u{FE97}", INITIAL FORM TEH
+ [65179] = utf8.char(65179), -- "ﺛ", utf8.codepoint("ﺛ") == 65179, "\u{FE9B}", INITIAL FORM THEH
+ [65183] = utf8.char(65183), -- "ﺟ", utf8.codepoint("ﺟ") == 65183, "\u{FE9F}", INITIAL FORM JEEM
+ [65187] = utf8.char(65187), -- "ﺣ", utf8.codepoint("ﺣ") == 65187, "\u{FEA3}", INITIAL FORM HAH
+ [65191] = utf8.char(65191), -- "ﺧ", utf8.codepoint("ﺧ") == 65191, "\u{FEA7}", INITIAL FORM KHAH
+ [65203] = utf8.char(65203), -- "ﺳ", utf8.codepoint("ﺳ") == 65203, "\u{FEB3}", INITIAL FORM SEEN
+ [65207] = utf8.char(65207), -- "ﺷ", utf8.codepoint("ﺷ") == 65207, "\u{FEB7}", INITIAL FORM SHEEN
+ [65211] = utf8.char(65211), -- "ﺻ", utf8.codepoint("ﺻ") == 65211, "\u{FEBB}", INITIAL FORM SAD
+ [65215] = utf8.char(65215), -- "ﺿ", utf8.codepoint("ﺿ") == 65215, "\u{FEBF}", INITIAL FORM DAD
+ [65219] = utf8.char(65219), -- "ﻃ", utf8.codepoint("ﻃ") == 65219, "\u{FEC3}", INITIAL FORM TAH
+ [65223] = utf8.char(65223), -- "ﻇ", utf8.codepoint("ﻇ") == 65223, "\u{FEC7}", INITIAL FORM ZAH
+ [65227] = utf8.char(65227), -- "ﻋ", utf8.codepoint("ﻋ") == 65227, "\u{FECB}", INITIAL FORM AIN
+ [65231] = utf8.char(65231), -- "ﻏ", utf8.codepoint("ﻏ") == 65231, "\u{FECF}", INITIAL FORM GHAIN
+ [65235] = utf8.char(65235), -- "ﻓ", utf8.codepoint("ﻓ") == 65235, "\u{FED3}", INITIAL FORM FEH
+ [65239] = utf8.char(65239), -- "ﻗ", utf8.codepoint("ﻗ") == 65239, "\u{FED7}", INITIAL FORM QAF
+ [65243] = utf8.char(65243), -- "ﻛ", utf8.codepoint("ﻛ") == 65243, "\u{FEDB}", INITIAL FORM KAF
+ [65247] = utf8.char(65247), -- "ﻟ", utf8.codepoint("ﻟ") == 65247, "\u{FEDF}", INITIAL FORM LAM
+ [65251] = utf8.char(65251), -- "ﻣ", utf8.codepoint("ﻣ") == 65251, "\u{FEE3}", INITIAL FORM MEEM
+ [65255] = utf8.char(65255), -- "ﻧ", utf8.codepoint("ﻧ") == 65255, "\u{FEE7}", INITIAL FORM NOON
+ [65259] = utf8.char(65259), -- "ﻫ", utf8.codepoint("ﻫ") == 65259, "\u{FEEB}", INITIAL FORM HEH
+ [65267] = utf8.char(65267), -- "ﻳ", utf8.codepoint("ﻳ") == 65267, "\u{FEF3}", INITIAL FORM YEH
+}
+
+local peCharTableMedial = {
+ [1600] = utf8.char(1600), -- "ـ", utf8.codepoint("ـ") == 1600, "\u{0640}", ARABIC TATWEEL
+ [64345] = utf8.char(64345), -- "ﭙ", utf8.codepoint("ﭙ") == 64345, "\u{FB59}", MEDIAL FORM PEH
+ [64381] = utf8.char(64381), -- "ﭽ", utf8.codepoint("ﭽ") == 64381, "\u{FB7D}", MEDIAL FORM TCHEH
+ [64401] = utf8.char(64401), -- "ﮑ", utf8.codepoint("ﮑ") == 64401, "\u{FB91}", MEDIAL FORM KEHEH
+ [64405] = utf8.char(64405), -- "ﮕ", utf8.codepoint("ﮕ") == 64405, "\u{FB95}", MEDIAL FORM GAF
+ [64425] = utf8.char(64425), -- "ﮩ", utf8.codepoint("ﮩ") == 64425, "\u{FBA9}", MEDIAL FORM HEH GOAL
+ [64429] = utf8.char(64429), -- "ﮭ", utf8.codepoint("ﮭ") == 64429, "\u{FBAD}", MEDIAL FORM HEH DOACHESMEE
+ [64511] = utf8.char(64511), -- "ﯿ", utf8.codepoint("ﯿ") == 64511, "\u{FBFF}", MEDIAL FORM YEH
+ [65170] = utf8.char(65170), -- "ﺒ", utf8.codepoint("ﺒ") == 65170, "\u{FE92}", MEDIAL FORM BEH
+ [65176] = utf8.char(65176), -- "ﺘ", utf8.codepoint("ﺘ") == 65176, "\u{FE98}", MEDIAL FORM TEH
+ [65180] = utf8.char(65180), -- "ﺜ", utf8.codepoint("ﺜ") == 65180, "\u{FE9C}", MEDIAL FORM THEH
+ [65184] = utf8.char(65184), -- "ﺠ", utf8.codepoint("ﺠ") == 65184, "\u{FEA0}", MEDIAL FORM JEEM
+ [65188] = utf8.char(65188), -- "ﺤ", utf8.codepoint("ﺤ") == 65188, "\u{FEA4}", MEDIAL FORM HAH
+ [65192] = utf8.char(65192), -- "ﺨ", utf8.codepoint("ﺨ") == 65192, "\u{FEA8}", MEDIAL FORM KHAH
+ [65204] = utf8.char(65204), -- "ﺴ", utf8.codepoint("ﺴ") == 65204, "\u{FEB4}", MEDIAL FORM SEEN
+ [65208] = utf8.char(65208), -- "ﺸ", utf8.codepoint("ﺸ") == 65208, "\u{FEB8}", MEDIAL FORM SHEEN
+ [65212] = utf8.char(65212), -- "ﺼ", utf8.codepoint("ﺼ") == 65212, "\u{FEBC}", MEDIAL FORM SAD
+ [65216] = utf8.char(65216), -- "ﻀ", utf8.codepoint("ﻀ") == 65216, "\u{FEC0}", MEDIAL FORM DAD
+ [65220] = utf8.char(65220), -- "ﻄ", utf8.codepoint("ﻄ") == 65220, "\u{FEC4}", MEDIAL FORM TAH
+ [65224] = utf8.char(65224), -- "ﻈ", utf8.codepoint("ﻈ") == 65224, "\u{FEC8}", MEDIAL FORM ZAH
+ [65228] = utf8.char(65228), -- "ﻌ", utf8.codepoint("ﻌ") == 65228, "\u{FECC}", MEDIAL FORM AIN
+ [65232] = utf8.char(65232), -- "ﻐ", utf8.codepoint("ﻐ") == 65232, "\u{FED0}", MEDIAL FORM GHAIN
+ [65236] = utf8.char(65236), -- "ﻔ", utf8.codepoint("ﻔ") == 65236, "\u{FED4}", MEDIAL FORM FEH
+ [65240] = utf8.char(65240), -- "ﻘ", utf8.codepoint("ﻘ") == 65240, "\u{FED8}", MEDIAL FORM QAF
+ [65244] = utf8.char(65244), -- "ﻜ", utf8.codepoint("ﻜ") == 65244, "\u{FEDC}", MEDIAL FORM KAF
+ [65248] = utf8.char(65248), -- "ﻠ", utf8.codepoint("ﻠ") == 65248, "\u{FEE0}", MEDIAL FORM LAM
+ [65252] = utf8.char(65252), -- "ﻤ", utf8.codepoint("ﻤ") == 65252, "\u{FEE4}", MEDIAL FORM MEEM
+ [65256] = utf8.char(65256), -- "ﻨ", utf8.codepoint("ﻨ") == 65256, "\u{FEE8}", MEDIAL FORM NOON
+ [65260] = utf8.char(65260), -- "ﻬ", utf8.codepoint("ﻬ") == 65260, "\u{FEEC}", MEDIAL FORM HEH
+ [65268] = utf8.char(65268), -- "ﻴ", utf8.codepoint("ﻴ") == 65268, "\u{FEF4}", MEDIAL FORM YEH
+}
+
+local peCharTableFinal = {
+ [64343] = utf8.char(64343), -- "ﭗ", utf8.codepoint("ﭗ") == 64343, "\u{FB57}", FINAL FORM PEH
+ [64379] = utf8.char(64379), -- "ﭻ", utf8.codepoint("ﭻ") == 64379, "\u{FB7B}", FINAL FORM TCHEH
+ [64395] = utf8.char(64395), -- "ﮋ", utf8.codepoint("ﮋ") == 64395, "\u{FB8B}", FINAL FORM JEH
+ [64399] = utf8.char(64399), -- "ﮏ", utf8.codepoint("ﮏ") == 64399, "\u{FB8F}", FINAL FORM KEHEH
+ [64403] = utf8.char(64403), -- "ﮓ", utf8.codepoint("ﮓ") == 64403, "\u{FB93}", FINAL FORM GAF
+ [64421] = utf8.char(64421), -- "ﮥ", utf8.codepoint("ﮥ") == 64421, "\u{FBA5}", FINAL FORM HEH WITH YEH ABOVE
+ [64509] = utf8.char(64509), -- "ﯽ", utf8.codepoint("ﯽ") == 64509, "\u{FBFD}", FINAL FORM YEH
+ [65166] = utf8.char(65166), -- "ﺎ", utf8.codepoint("ﺎ") == 65166, "\u{FE8E}", FINAL FORM ALEF
+ [65168] = utf8.char(65168), -- "ﺐ", utf8.codepoint("ﺐ") == 65168, "\u{FE90}", FINAL FORM BEH
+ [65172] = utf8.char(65172), -- "ﺔ", utf8.codepoint("ﺔ") == 65172, "\u{FE94}", FINAL FORM TEH MARBUTAH
+ [65174] = utf8.char(65174), -- "ﺖ", utf8.codepoint("ﺖ") == 65174, "\u{FE96}", FINAL FORM TEH
+ [65178] = utf8.char(65178), -- "ﺚ", utf8.codepoint("ﺚ") == 65178, "\u{FE9A}", FINAL FORM THEH
+ [65182] = utf8.char(65182), -- "ﺞ", utf8.codepoint("ﺞ") == 65182, "\u{FE9E}", FINAL FORM JEEM
+ [65186] = utf8.char(65186), -- "ﺢ", utf8.codepoint("ﺢ") == 65186, "\u{FEA2}", FINAL FORM HAH
+ [65190] = utf8.char(65190), -- "ﺦ", utf8.codepoint("ﺦ") == 65190, "\u{FEA6}", FINAL FORM KHAH
+ [65194] = utf8.char(65194), -- "ﺪ", utf8.codepoint("ﺪ") == 65194, "\u{FEAA}", FINAL FORM DAL
+ [65196] = utf8.char(65196), -- "ﺬ", utf8.codepoint("ﺬ") == 65196, "\u{FEAC}", FINAL FORM THAL
+ [65198] = utf8.char(65198), -- "ﺮ", utf8.codepoint("ﺮ") == 65198, "\u{FEAE}", FINAL FORM REH
+ [65200] = utf8.char(65200), -- "ﺰ", utf8.codepoint("ﺰ") == 65200, "\u{FEB0}", FINAL FORM ZAIN
+ [65202] = utf8.char(65202), -- "ﺲ", utf8.codepoint("ﺲ") == 65202, "\u{FEB2}", FINAL FORM SEEN
+ [65206] = utf8.char(65206), -- "ﺶ", utf8.codepoint("ﺶ") == 65206, "\u{FEB6}", FINAL FORM SHEEN
+ [65210] = utf8.char(65210), -- "ﺺ", utf8.codepoint("ﺺ") == 65210, "\u{FEBA}", FINAL FORM SAD
+ [65214] = utf8.char(65214), -- "ﺾ", utf8.codepoint("ﺾ") == 65214, "\u{FEBE}", FINAL FORM DAD
+ [65218] = utf8.char(65218), -- "ﻂ", utf8.codepoint("ﻂ") == 65218, "\u{FEC2}", FINAL FORM TAH
+ [65222] = utf8.char(65222), -- "ﻆ", utf8.codepoint("ﻆ") == 65222, "\u{FEC6}", FINAL FORM ZAH
+ [65226] = utf8.char(65226), -- "ﻊ", utf8.codepoint("ﻊ") == 65226, "\u{FECA}", FINAL FORM AIN
+ [65230] = utf8.char(65230), -- "ﻎ", utf8.codepoint("ﻎ") == 65230, "\u{FECE}", FINAL FORM GHAIN
+ [65234] = utf8.char(65234), -- "ﻒ", utf8.codepoint("ﻒ") == 65234, "\u{FED2}", FINAL FORM FEH
+ [65238] = utf8.char(65238), -- "ﻖ", utf8.codepoint("ﻖ") == 65238, "\u{FED6}", FINAL FORM QAF
+ [65242] = utf8.char(65242), -- "ﻚ", utf8.codepoint("ﻚ") == 65242, "\u{FEDA}", FINAL FORM KAF
+ [65246] = utf8.char(65246), -- "ﻞ", utf8.codepoint("ﻞ") == 65246, "\u{FEDE}", FINAL FORM LAM
+ [65250] = utf8.char(65250), -- "ﻢ", utf8.codepoint("ﻢ") == 65250, "\u{FEE2}", FINAL FORM MEEM
+ [65254] = utf8.char(65254), -- "ﻦ", utf8.codepoint("ﻦ") == 65254, "\u{FEE6}", FINAL FORM NOON
+ [65258] = utf8.char(65258), -- "ﻪ", utf8.codepoint("ﻪ") == 65258, "\u{FEEA}", FINAL FORM HEH
+ [65262] = utf8.char(65262), -- "ﻮ", utf8.codepoint("ﻮ") == 65262, "\u{FEEE}", FINAL FORM WAW
+ [65264] = utf8.char(65264), -- "ﻰ", utf8.codepoint("ﻰ") == 65264, "\u{FEF0}", FINAL FORM ALEF MAKSURAH
+ [65266] = utf8.char(65266), -- "ﻲ", utf8.codepoint("ﻲ") == 65266, "\u{FEF2}", FINAL FORM YEH
+ [65276] = utf8.char(65276), -- "ﻼ", utf8.codepoint("ﻼ") == 65276, "\u{FEFC}", FINAL FORM LIGATURE LAM WITH ALEF
+}
+
+return peCharTableInitial, peCharTableMedial, peCharTableFinal, peCharTableDiacritic
+--
+--
+-- End of file `texnegar-char-table.lua'.
+%</texnegar-char-table-lua>
+% \end{macrocode}
+%
+% \subsection{File: \texttt{texnegar.lua}}
+%
+% \begin{macrocode}
+%<*texnegar-lua>
+--
+-- This is file `texnegar.lua',
+-- generated with the docstrip utility.
+--
+-- The original source files were:
+--
+-- texnegar.dtx (with options: `texnegar-lua')
+--
+-- Copyright (C) 2020-2021 Hossein Movahhedian
+--
+-- It may be distributed and/or modified under the LaTeX Project Public License,
+-- version 1.3c or higher (your choice). The latest version of
+-- this license is at: http://www.latex-project.org/lppl.txt
+--
+-- texnegar = texnegar or {}
+-- local texnegar = texnegar
+-- texnegar.module = {
+-- name = "texnegar",
+-- version = "0.1e",
+-- date = "2021-02-09",
+-- description = "Full implementation of kashida feature in XeLaTex and LuaLaTeX",
+-- author = "Hossein Movahhedian",
+-- copyright = "Hossein Movahhedian",
+-- license = "LPPL v1.3c"
+-- }
+--
+-- -- ^^A%% texnegar-lua.dtx -- part of TEXNEGAR <bitbucket.org/dma8hm1334/texnegar>
+-- local err, warn, info, log = luatexbase.provides_module(texnegar.module)
+-- texnegar.log = log or (function (s) luatexbase.module_info("texnegar", s) end)
+-- texnegar.warning = warn or (function (s) luatexbase.module_warning("texnegar", s) end)
+-- texnegar.error = err or (function (s) luatexbase.module_error("texnegar", s) end)
+
+local l_texnegar_kashida_fontfamily_bool = token.create("l_texnegar_kashida_fontfamily_bool")
+
+local debug_getinfo = debug.getinfo
+local string_format = string.format
+
+function TableLength(t)
+ local i = 0
+ for _ in pairs(t) do
+ i = i + 1
+ end
+ return i
+end
+
+tex.enableprimitives('',tex.extraprimitives ())
+
+local range_tble = {
+ [1536] = 1791,
+ [1872] = 1919,
+ [2208] = 2274,
+ [8204] = 8297,
+ [64336] = 65023,
+ [65136] = 65279,
+ [126464] = 126719,
+ [983040] = 1048575
+ }
+
+local tbl_fonts_used = { }
+local tbl_fonts_chars = { }
+local tbl_fonts_chars_init = { }
+local tbl_fonts_chars_medi = { }
+local tbl_fonts_chars_fina = { }
+
+local pattern_list = {
+ ".*%.(ini)t?$", ".*%.(ini)t?%..*",
+ ".*%.(med)i?$", ".*%.(med)i?%..*",
+ ".*%.(fin)a?$", ".*%.(fin)a?%..*",
+
+ ".*_(ini)t?$", ".*_(ini)t?_.*",
+ ".*_(med)i?$", ".*_(med)i?_.*",
+ ".*_(fin)a?$", ".*_(fin)a?_.*",
+}
+
+function GetFontsChars()
+ local funcName = debug_getinfo(1).name
+ local funcNparams = debug_getinfo(1).nparams
+
+ for f_num = 1, font.max() do
+ local f_tmp = font.fonts[f_num]
+ if f_tmp then
+ local f_tmp_fontname = f_tmp.fontname
+ if f_tmp_fontname then
+ local f_id_tmp = font.getfont(f_num)
+ local f_fontname_tmp = f_id_tmp.fontname
+ local f_filename_tmp = f_id_tmp.filename
+ if not tbl_fonts_used[f_fontname_tmp] then
+ tbl_fonts_used[f_fontname_tmp] = {f_filename_tmp, f_id_tmp}
+ end
+ end
+ end
+ end
+
+ for f_fontname, v in pairs(tbl_fonts_used) do
+ f_filename = v[1]
+ f_id = v[2]
+ if not tbl_fonts_chars[f_fontname] then
+ tbl_fonts_chars[f_fontname] = { }
+ tbl_fonts_chars_init[f_fontname] = { }
+ tbl_fonts_chars_medi[f_fontname] = { }
+ tbl_fonts_chars_fina[f_fontname] = { }
+ local f = fontloader.open(f_filename)
+ local char_name
+ local char_unicode
+ local char_class
+ for k, v in pairs(range_tble) do
+ for glyph_idx = k, v do
+ if f_id.characters[glyph_idx] then
+ char_name = f.glyphs[f_id.characters[glyph_idx].index].name
+ char_unicode = f.glyphs[f_id.characters[glyph_idx].index].unicode
+ char_class = f.glyphs[f_id.characters[glyph_idx].index].class
+
+ kashida_fontfamily = token.get_macro("l_texnegar_kashida_fontfamily_tl")
+ fontfamily_match = string.match(f_fontname, "^(" .. kashida_fontfamily .. ").*")
+ if fontfamily_match == kashida_fontfamily then
+ if not tbl_fonts_chars[f_fontname][glyph_idx] then
+ if string.match(f_fontname, "^(Amiri).*") == "Amiri" and char_name == 'uni0640.long1' then
+ current_kashida_unicode = glyph_idx
+ end
+ tbl_fonts_chars[f_fontname][glyph_idx] = {char_name, char_unicode, char_class}
+ for _, pattern in ipairs( pattern_list ) do
+ local pos_alt = string.match(char_name, pattern)
+ if pos_alt == 'ini' or pos_alt == 'AltIni' then
+ tbl_fonts_chars_init[f_fontname][glyph_idx] = {char_name, char_unicode, char_class}
+ elseif pos_alt == 'med' or pos_alt == 'AltMed' then
+ tbl_fonts_chars_medi[f_fontname][glyph_idx] = {char_name, char_unicode, char_class}
+ elseif pos_alt == 'fin' or pos_alt == 'AltFin' then
+ tbl_fonts_chars_fina[f_fontname][glyph_idx] = {char_name, char_unicode, char_class}
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ fontloader.close(f)
+ end
+ end
+ return tbl_fonts_used, tbl_fonts_chars, tbl_fonts_chars_init, tbl_fonts_chars_medi, tbl_fonts_chars_fina
+end
+
+dofile(kpse.find_file("texnegar-ini.lua"))
+--
+--
+-- End of file `texnegar.lua'.
+%</texnegar-lua>
+% \end{macrocode}
+%
+% \subsection{File: \texttt{texnegar-ini.lua}}
+%
+% \begin{macrocode}
+%<*texnegar-ini-lua>
+--
+-- This is file `texnegar-ini.lua',
+-- generated with the docstrip utility.
+--
+-- The original source files were:
+--
+-- texnegar.dtx (with options: `texnegar-ini-lua')
+--
+-- Copyright (C) 2020-2021 Hossein Movahhedian
+--
+-- It may be distributed and/or modified under the LaTeX Project Public License,
+-- version 1.3c or higher (your choice). The latest version of
+-- this license is at: http://www.latex-project.org/lppl.txt
+--
+-- texnegar_ini = texnegar_ini or {}
+-- local texnegar_ini = texnegar_ini
+-- texnegar_ini.module = {
+-- name = "texnegar_ini",
+-- version = "0.1e",
+-- date = "2021-02-09",
+-- description = "Full implementation of kashida feature in XeLaTex and LuaLaTeX",
+-- author = "Hossein Movahhedian",
+-- copyright = "Hossein Movahhedian",
+-- license = "LPPL v1.3c"
+-- }
+--
+-- -- ^^A%% texnegar-lua.dtx -- part of TEXNEGAR <bitbucket.org/dma8hm1334/texnegar>
+-- local err, warn, info, log = luatexbase.provides_module(texnegar_ini.module)
+-- texnegar_ini.log = log or (function (s) luatexbase.module_info("texnegar_ini", s) end)
+-- texnegar_ini.warning = warn or (function (s) luatexbase.module_warning("texnegar_ini", s) end)
+-- texnegar_ini.error = err or (function (s) luatexbase.module_error("texnegar_ini", s) end)
+
+c_true_bool = token.create("c_true_bool")
+
+l_texnegar_color_bool = token.create("l_texnegar_color_bool")
+
+if l_texnegar_color_bool.mode == c_true_bool.mode then
+ color_tbl = color_tbl or {}
+ for item in l_texnegar_color_rgb_tl:gmatch("([^,%s]+)") do
+ table.insert(color_tbl, item)
+ end
+end
+
+dofile(kpse.find_file("texnegar-luatex-kashida.lua"))
+--
+--
+-- End of file `texnegar-ini.lua'.
+%</texnegar-ini-lua>
+% \end{macrocode}
+%
+% \subsection{File: \texttt{texnegar-luatex-kashida.lua}}
+%
+% \begin{macrocode}
+%<*texnegar-luatex-kashida-lua>
+--
+-- This is file `texnegar-luatex-kashida.lua',
+-- generated with the docstrip utility.
+--
+-- The original source files were:
+--
+-- texnegar.dtx (with options: `texnegar-luatex-kashida-lua')
+--
+-- Copyright (C) 2020-2021 Hossein Movahhedian
+--
+-- It may be distributed and/or modified under the LaTeX Project Public License,
+-- version 1.3c or higher (your choice). The latest version of
+-- this license is at: http://www.latex-project.org/lppl.txt
+--
+-- texnegar_luatex_kashida = texnegar_luatex_kashida or {}
+-- local texnegar_luatex_kashida = texnegar_luatex_kashida
+-- texnegar_luatex_kashida.module = {
+-- name = "texnegar_luatex_kashida",
+-- version = "0.1e",
+-- date = "2021-02-09",
+-- description = "Full implementation of kashida feature in XeLaTex and LuaLaTeX",
+-- author = "Hossein Movahhedian",
+-- copyright = "Hossein Movahhedian",
+-- license = "LPPL v1.3c"
+-- }
+--
+-- -- ^^A%% texnegar-lua.dtx -- part of TEXNEGAR <bitbucket.org/dma8hm1334/texnegar>
+-- local err, warn, info, log = luatexbase.provides_module(texnegar_luatex_kashida.module)
+-- texnegar_luatex_kashida.log = log or (function (s) luatexbase.module_info("texnegar_luatex_kashida", s) end)
+-- texnegar_luatex_kashida.warning = warn or (function (s) luatexbase.module_warning("texnegar_luatex_kashida", s) end)
+-- texnegar_luatex_kashida.error = err or (function (s) luatexbase.module_error("texnegar_luatex_kashida", s) end)
+
+local peCharTableInitial, peCharTableMedial, peCharTableFinal, peCharTableDiacritic = dofile(kpse.find_file("texnegar-char-table.lua"))
+
+local kashida_unicode = 1600
+local kashida_subtype = 256
+
+local COLORSTACK = node.subtype("pdf_colorstack")
+local node_id = node.id
+local GLUE = node_id("glue")
+local GLYPH = node_id("glyph")
+local HLIST = node_id("hlist")
+local RULE = node_id("rule")
+local VLIST = node_id("vlist")
+local WHATSIT = node_id("whatsit")
+
+local l_texnegar_kashida_glyph_bool = token.create("l_texnegar_kashida_glyph_bool")
+local l_texnegar_kashida_leaders_glyph_bool = token.create("l_texnegar_kashida_leaders_glyph_bool")
+local l_texnegar_kashida_leaders_hrule_bool = token.create("l_texnegar_kashida_leaders_hrule_bool")
+
+local l_texnegar_hboxrecursion_bool = token.create("l_texnegar_hboxrecursion_bool")
+local l_texnegar_vboxrecursion_bool = token.create("l_texnegar_vboxrecursion_bool")
+
+local selected_font = font.current()
+local selected_font_old = selected_font
+
+local string_format = string.format
+local debug_getinfo = debug.getinfo
+
+function GetGlyphDimensions(font_file, glyph_index)
+ local funcName = debug_getinfo(1).name
+ local funcNparams = debug_getinfo(1).nparams
+
+ local fnt = fontloader.open(font_file)
+ local idx = 0
+ local fnt_glyphcnt = fnt.glyphcnt
+ local fnt_glyphmin = fnt.glyphmin
+ local fnt_glyphmax = fnt.glyphmax
+ if fnt_glyphcnt > 0 then
+ for idx = fnt_glyphmin, fnt_glyphmax do
+ local gl = fnt.glyphs[idx]
+ if gl then
+ local gl_unicode = gl.unicode
+ if gl_unicode == glyph_index then
+ local gl_name = gl.name
+ gl_width = gl.width
+ local gl_bbox = gl.boundingbox
+ gl_llx = gl_bbox[1]
+ gl_depth = gl_bbox[2]
+ gl_urx = gl_bbox[3]
+ gl_height = gl_bbox[4]
+ break
+ end
+ end
+ idx = idx + 1
+ end
+ end
+ fontloader.close(fnt)
+ return {width = gl_width, height = gl_height, depth = gl_depth, llx = gl_llx, urx = gl_urx}
+end
+
+function GetGlue(t_plb_line_glue_node, t_plb_node)
+ local funcName = debug_getinfo(1).name
+ local funcNparams = debug_getinfo(1).nparams
+
+ local glue_id = t_plb_line_glue_node.id
+ local glue_subtype = t_plb_line_glue_node.subtype
+ local glue_width = t_plb_line_glue_node.width
+ local glue_stretch = t_plb_line_glue_node.stretch
+ local glue_shrink = t_plb_line_glue_node.shrink
+ local eff_glue_width = node.effective_glue(t_plb_line_glue_node, t_plb_node)
+ local glue_stretch_order = t_plb_line_glue_node.stretch_order
+ local glue_shrink_order = t_plb_line_glue_node.shrink_order
+ local glue_delta = 0
+ glue_delta = eff_glue_width - glue_width
+ return { id = glue_id, subtype = glue_subtype, width = glue_width, stretch = glue_stretch,
+ shrink = glue_shrink, stretch_order = glue_stretch_order, shrink_order = glue_shrink_order,
+ effective_glue = eff_glue_width, delta = glue_delta }
+end
+
+function GetGlyph(t_plb_line_glyph_node, t_tbl_line_fields, t_CharTableInitial, t_CharTableMedial, t_CharTableFinal)
+ local funcName = debug_getinfo(1).name
+ local funcNparams = debug_getinfo(1).nparams
+
+ local glyph_id = t_plb_line_glyph_node.id
+ local glyph_subtype = t_plb_line_glyph_node.subtype
+ local glyph_char = t_plb_line_glyph_node.char
+ local glyph_font = t_plb_line_glyph_node.font
+ local glyph_lang = t_plb_line_glyph_node.lang
+ local glyph_width = t_plb_line_glyph_node.width
+ local glyph_data = t_plb_line_glyph_node.data
+
+ if not (t_CharTableInitial[glyph_char] == nil) then
+ t_tbl_line_fields.joinerCharInitial = t_tbl_line_fields.joinerCharInitial + 1
+ t_plb_line_glyph_node.data = 1
+ elseif not (t_CharTableMedial[glyph_char] == nil) then
+ t_tbl_line_fields.joinerCharMedial = t_tbl_line_fields.joinerCharMedial + 1
+ t_plb_line_glyph_node.data = 2
+ elseif not (t_CharTableFinal[glyph_char] == nil) then
+ t_tbl_line_fields.joinerCharFinal = t_tbl_line_fields.joinerCharFinal + 1
+ t_plb_line_glyph_node.data = 3
+ end
+ return { id = glyph_id, subtype = glyph_subtype, char = glyph_char, font = glyph_font, lang = glyph_lang, width = glyph_width, data = glyph_data }, t_tbl_line_fields
+end
+
+function ProcessTableKashidaHlist(ksh_hlistNode, hbox_num, in_font)
+ local funcName = debug_getinfo(1).name
+ local funcNparams = debug_getinfo(1).nparams
+
+ local ksh_hlistNode_id = ksh_hlistNode.id
+ local ksh_hlistNode_subtype = ksh_hlistNode.subtype
+
+ for tn in node.traverse(ksh_hlistNode.head) do
+ local tn_id = tn.id
+ local tn_subtype = tn.subtype
+
+ if tn_id == HLIST then
+ for tp in node.traverse(tn.head) do
+ local tp_id = tp.id
+ local tp_subtype = tp.subtype
+ if tp_id == GLYPH then
+ if l_texnegar_color_bool.mode == c_true_bool.mode then
+ local col_str = color_tbl[1] .. " " .. color_tbl[2] .. " " .. color_tbl[3]
+ local col_str_rg = col_str .. " rg "
+ local col_str_RG = col_str .. " RG"
+
+ local color_push = node.new(WHATSIT, COLORSTACK)
+ local color_pop = node.new(WHATSIT, COLORSTACK)
+ color_push.stack = 0
+ color_pop.stack = 0
+ color_push.command = 1
+ color_pop.command = 2
+ glue_ratio = .2
+ color_push.data = col_str_rg .. col_str_RG
+ color_pop.data = col_str_rg .. col_str_RG
+ tn.head = node.insert_before(tn.list, tn.head, node.copy(color_push))
+ tn.head = node.insert_after(tn.list, node.tail(tn.head), node.copy(color_pop))
+ end
+
+ local tp_font = tp.font
+ local tp_char = tp.char
+ tp.font = in_font
+
+ local ksh_unicode
+ ksh_unicode = font.getfont(in_font).resources.unicodes['kashida']
+ if hbox_num == 'l_texnegar_k_box' then
+ tp.char = current_kashida_unicode or kashida_unicode
+ elseif hbox_num == 'l_texnegar_ksh_box' then
+ tp.char = ksh_unicode
+ tn_width = tn.width
+ ksh_hlistNode.width = tn_width
+ end
+ elseif tp_id == HLIST then
+ if tp.subtype ~= 3 then
+ tbl_kashida_hlist_nodes[ #tbl_kashida_hlist_nodes + 1 ] = tp
+ end
+ end
+ end
+ elseif tn_id == VLIST then
+ do end
+ elseif tn_id == WHATSIT then
+ do end
+ elseif tn_id == GLYPH then
+ if l_texnegar_color_bool.mode == c_true_bool.mode then
+ local col_str = color_tbl[1] .. " " .. color_tbl[2] .. " " .. color_tbl[3]
+ local col_str_rg = col_str .. " rg "
+ local col_str_RG = col_str .. " RG"
+
+ local color_push = node.new(WHATSIT, COLORSTACK)
+ local color_pop = node.new(WHATSIT, COLORSTACK)
+ color_push.stack = 0
+ color_pop.stack = 0
+ color_push.command = 1
+ color_pop.command = 2
+ glue_ratio = .2
+ color_push.data = col_str_rg .. col_str_RG
+ color_pop.data = col_str_rg .. col_str_RG
+ ksh_hlistNode.head = node.insert_before(ksh_hlistNode.list, ksh_hlistNode.head, node.copy(color_push))
+ ksh_hlistNode.head = node.insert_after(ksh_hlistNode.list, node.tail(ksh_hlistNode.head), node.copy(color_pop))
+ end
+
+ local tn_font = tn.font
+ local tn_char = tn.char
+ tn.font = in_font
+
+ local ksh_unicode
+ ksh_unicode = font.getfont(in_font).resources.unicodes['kashida']
+ if hbox_num == 'l_texnegar_k_box' then
+ tn.char = kashida_unicode
+ elseif hbox_num == 'l_texnegar_ksh_box' then
+ tn.char = ksh_unicode
+ tn_width = tn.width
+ ksh_hlistNode.width = tn_width
+ end
+ else
+ print(string_format("\n tn. Not processed node id is: %d", tn_id))
+ end
+ end
+end
+
+function SetFontInHbox(hbox_num, font_num)
+ local funcName = debug_getinfo(1).name
+ local funcNparams = debug_getinfo(1).nparams
+
+ tbl_kashida_hlist_nodes = {}
+
+ local tmp_node
+ tmp_node = node.new("hlist")
+ tmp_node = tex.getbox(hbox_num)
+
+ ProcessTableKashidaHlist(tmp_node, hbox_num, font_num)
+
+ ::kashida_hlist_BEGIN::
+ if #tbl_kashida_hlist_nodes > 0 then
+ local kashida_hlistNodeAdded = table.remove(tbl_kashida_hlist_nodes,1)
+ ProcessTableKashidaHlist(kashida_hlistNodeAdded, hbox_num, font_num)
+ goto kashida_hlist_BEGIN
+ end
+end
+
+function StretchGlyph(t_plb_node, t_plb_glyph_node, t_gluePerJoiner, t_dir, t_filler)
+ local funcName = debug_getinfo(1).name
+ local funcNparams = debug_getinfo(1).nparams
+
+ if t_filler == "resized_kashida" then
+ SetFontInHbox('l_texnegar_k_box', selected_font)
+ elseif t_filler == "leaders+kashida" then
+ SetFontInHbox('l_texnegar_ksh_box', selected_font)
+ end
+
+ kashida_node = node.new(GLYPH)
+ node_glue = node.new(GLUE)
+ node_rule = node.new(RULE)
+ node_hlist = node.new(HLIST)
+
+ font_current = selected_font
+ font_name = font.fonts[font_current].fullname
+ font_file = font.fonts[font_current].filename
+ kashida_char = font.fonts[font_current].characters[1600]
+
+ kashida_node.subtype = kashida_subtype
+ kashida_node.font = font_current
+ if string.match(font_name, "^(Amiri).*") == "Amiri" then
+ kashida_node.char = current_kashida_unicode
+ else
+ kashida_node.char = kashida_unicode
+ end
+ kashida_node.lang = tex.language
+
+ kashida_width = kashida_node.width
+ kashida_height = kashida_node.height
+ kashida_depth = kashida_node.depth
+
+ tbl_gl_dimen = GetGlyphDimensions(font_file, kashida_unicode)
+ ksh_width, ksh_height, ksh_depth, ksh_llx, ksh_urx =
+ tbl_gl_dimen.width, tbl_gl_dimen.height, tbl_gl_dimen.depth, tbl_gl_dimen.llx, tbl_gl_dimen.urx
+
+ ratio_width = kashida_width / ksh_width
+ leaders_height = ratio_width * ksh_height
+ leaders_depth = - ratio_width * ksh_depth
+
+ node_glue.subtype = 100
+ node.setglue(node_glue, t_gluePerJoiner, 0, 0, 0, 0)
+
+ if t_filler == "resized_kashida" then
+ node_glue.leader = node.copy_list(tex.box['l_texnegar_k_box'])
+ elseif t_filler == "leaders+kashida" then
+ node_glue.leader = node.copy_list(tex.box['l_texnegar_ksh_box'])
+ elseif t_filler == "leaders+hrule" then
+ node_glue.leader = node_rule
+ end
+
+ node_glue.leader.subtype = 0
+ node_glue.leader.height = leaders_height
+ node_glue.leader.depth = leaders_depth
+
+ node_glue.leader.dir = t_dir
+
+ local t_plb_glyph_node_next = t_plb_glyph_node.next
+ local t_plb_glyph_node_next_id = t_plb_glyph_node_next.id
+ if not t_plb_glyph_node_next then
+ node.insert_after(t_plb_node.list, t_plb_glyph_node, node_glue)
+ else
+ if t_plb_glyph_node_next_id == GLYPH then
+ local t_plb_glyph_node_next_char = t_plb_glyph_node_next.char
+ if peCharTableDiacritic[t_plb_glyph_node_next_char] then
+ node.insert_after(t_plb_node.list, t_plb_glyph_node_next, node_glue)
+ else
+ node.insert_after(t_plb_node.list, t_plb_glyph_node, node_glue)
+ end
+ else
+ node.insert_after(t_plb_node.list, t_plb_glyph_node, node_glue)
+ end
+ end
+ if t_filler == "leaders+hrule" then
+ for tn in node.traverse(t_plb_node.head) do
+ local tn_id = tn.id
+ local tn_subtype = tn.subtype
+
+ if tn_id == GLUE and tn_subtype == 100 then
+ local t_hbox = node.new(HLIST)
+ local t_hrule = node.copy(tn)
+
+ if string.match(font_name, "^(Amiri).*") == "Amiri" then
+ t_hrule.leader.height = kashida_height
+ t_hrule.leader.depth = kashida_depth
+ end
+
+ t_hbox.head = node.insert_after(t_hbox.list, t_hbox.head,t_hrule)
+ t_plb_node.head = node.insert_after(t_plb_node.list, tn, t_hbox)
+
+ if l_texnegar_color_bool.mode == c_true_bool.mode then
+ local col_str = color_tbl[1] .. " " .. color_tbl[2] .. " " .. color_tbl[3]
+ local col_str_rg = col_str .. " rg "
+ local col_str_RG = col_str .. " RG"
+
+ local color_push = node.new(WHATSIT, COLORSTACK)
+ local color_pop = node.new(WHATSIT, COLORSTACK)
+ color_push.stack = 0
+ color_pop.stack = 0
+ color_push.command = 1
+ color_pop.command = 2
+ glue_ratio = .2
+ color_push.data = col_str_rg .. col_str_RG
+ color_pop.data = col_str_rg .. col_str_RG
+ t_hbox.head = node.insert_before(t_hbox.list, t_hbox.head, node.copy(color_push))
+ t_hbox.head = node.insert_after(t_hbox.list, node.tail(t_hbox.head), node.copy(color_pop))
+ end
+ end
+ end
+ end
+end
+
+function GetFillerSpec(t_plb_node, t_plb_head_node, t_tbl_line_fields, t_CharTableInitial, t_CharTableMedial, t_CharTableFinal)
+ local funcName = debug_getinfo(1).name
+ local funcNparams = debug_getinfo(1).nparams
+
+ t_plb_node_id = t_plb_node.id
+ t_plb_node_subtype = t_plb_node.subtype
+
+ for p in node.traverse(t_plb_head_node) do
+ local p_id = p.id
+ local p_subtype = p.subtype
+ if p_id == HLIST then
+ t_tbl_line_fields.lineWidthRemainder = t_tbl_line_fields.lineWidthRemainder - p.width
+ if p.subtype ~= 3 then
+ tbl_hlist_nodes[ #tbl_hlist_nodes + 1 ] = p
+ end
+ elseif p_id == VLIST then
+ t_tbl_line_fields.lineWidthRemainder = t_tbl_line_fields.lineWidthRemainder - p.width
+ tbl_vlist_nodes[ #tbl_vlist_nodes + 1 ] = p
+ elseif p_id == GLUE then
+ tbl_p_glue = GetGlue(p, t_plb_node)
+ t_tbl_line_fields.lineWidthRemainder = t_tbl_line_fields.lineWidthRemainder - tbl_p_glue["effective_glue"]
+ t_tbl_line_fields.total_glues = t_tbl_line_fields.total_glues + 1
+ t_tbl_line_fields.stretchedGlue = t_tbl_line_fields.stretchedGlue + tbl_p_glue["delta"]
+ elseif p_id == GLYPH then
+ tbl_p_glyph, t_tbl_line_fields = GetGlyph(p, t_tbl_line_fields, t_CharTableInitial, t_CharTableMedial, t_CharTableFinal)
+ selected_font_old = selected_font
+ selected_font = tbl_p_glyph["font"]
+ t_tbl_line_fields.lineWidthRemainder = t_tbl_line_fields.lineWidthRemainder - tbl_p_glyph["width"]
+ t_tbl_line_fields.total_glyphs = t_tbl_line_fields.total_glyphs + 1
+ end
+ end
+
+ t_tbl_line_fields.total_joiners = t_tbl_line_fields.joinerCharInitial + t_tbl_line_fields.joinerCharMedial
+ t_tbl_line_fields.gluePerJoiner = 0
+ if t_tbl_line_fields.total_glues == 0 then
+ t_tbl_line_fields.stretchedGlue = t_tbl_line_fields.lineWidthRemainder
+ end
+ if t_tbl_line_fields.total_joiners > 0 then
+ t_tbl_line_fields.gluePerJoiner = t_tbl_line_fields.stretchedGlue // t_tbl_line_fields.total_joiners
+ t_tbl_line_fields.stretchedGlueRemaineder = t_tbl_line_fields.stretchedGlue % t_tbl_line_fields.total_joiners
+ elseif t_tbl_line_fields.total_joiners == 1 then
+ t_tbl_line_fields.gluePerJoiner = t_tbl_line_fields.stretchedGlue
+ end
+
+ return t_tbl_line_fields
+end
+
+function ProcessTableHlist(tmphl_n)
+ local funcName = debug_getinfo(1).name
+ local funcNparams = debug_getinfo(1).nparams
+
+ local tmphl_n_id = tmphl_n.id
+ local tmphl_n_subtype = tmphl_n.subtype
+
+ local tbl_line_fields = { line_dir = "", line_width = 0, lineWidthRemainder = 0, total_glyphs = 0,
+ joinerCharInitial = 0, joinerCharMedial = 0, joinerCharFinal = 0, total_joiners = 0,
+ stretchedGlue = 0, total_glues = 0, gluePerJoiner = 0, stretchedGlueRemaineder = 0}
+
+ local tbl_p_glue, tbl_p_glyph
+
+ if (tmphl_n_id == HLIST) and (tmphl_n_subtype == 1 or tmphl_n_subtype == 2) then
+ tbl_line_fields.line_width = tmphl_n.width
+ tbl_line_fields.line_dir = tmphl_n.dir
+ tbl_line_fields.lineWidthRemainder = tbl_line_fields.line_width
+
+ if tbl_line_fields.line_dir == "TLT" then
+ tbl_line_fields = GetFillerSpec(tmphl_n, tmphl_n.head, tbl_line_fields, peCharTableInitial, peCharTableMedial, peCharTableFinal)
+
+ if tbl_line_fields.total_joiners == 0 or tbl_line_fields.gluePerJoiner == 0 or tbl_line_fields.stretchedGlue <= 0 then
+ goto continue
+ end
+
+ for q in node.traverse_id(GLUE, tmphl_n.head) do
+ local eff_glue_width = node.effective_glue(q, tmphl_n)
+ node.setglue(q, q.width, 0, 0, q.stretch_order, q.glue_shrink_order)
+ end
+
+ for r in node.traverse_id(GLYPH, tmphl_n.head) do
+ local r_data = r.data
+ if r_data == 1 or r.data == 2 then
+ StretchGlyph(tmphl_n, r, tbl_line_fields.gluePerJoiner, tbl_line_fields.line_dir, filler_pe)
+ elseif r.data == 3 then
+ goto for_loop_01
+ end
+ ::for_loop_01::
+ end
+ tbl_line_fields.line_width = tmphl_n.width
+ tbl_line_fields.lineWidthRemainder = line_width
+ elseif tbl_line_fields.line_dir == "TRT" then
+ tbl_line_fields = GetFillerSpec(tmphl_n, tmphl_n.head, tbl_line_fields, peCharTableInitial, peCharTableMedial, peCharTableFinal)
+ if tbl_line_fields.total_joiners == 0 or tbl_line_fields.gluePerJoiner == 0 or tbl_line_fields.stretchedGlue <= 0 then
+ goto continue
+ end
+
+ for q in node.traverse_id(GLUE, tmphl_n.head) do
+ local eff_glue_width = node.effective_glue(q, tmphl_n)
+ node.setglue(q, q.width, 0, 0, q.stretch_order, q.glue_shrink_order)
+ end
+
+ for r in node.traverse_id(GLYPH, tmphl_n.head) do
+ local r_data = r.data
+ if r_data == 1 or r.data == 2 then
+ StretchGlyph(tmphl_n, r, tbl_line_fields.gluePerJoiner, tbl_line_fields.line_dir, filler_pe)
+ elseif r.data == 3 then
+ goto for_loop_02
+ end
+ ::for_loop_02::
+ end
+ tbl_line_fields.line_width = tmphl_n.width
+ tbl_line_fields.lineWidthRemainder = line_width
+ else
+ print(string_format("\n Line direction '%s' is not supported yet!", tbl_line_fields.line_dir))
+ end
+ end
+ ::continue::
+end
+
+function ProcessTableVlist(tmpvl_n)
+ local funcName = debug_getinfo(1).name
+ local funcNparams = debug_getinfo(1).nparams
+
+ local tmpvl_n_id = tmpvl_n.id
+ local tmpvl_n_subtype = tmpvl_n.subtype
+
+ for vbNode in node.traverse(tmpvl_n) do
+ if vbNode.id == VLIST and vbNode.subtype == 0 then
+ for tr_vbNode in node.traverse(vbNode.head) do
+ if (tr_vbNode.id == HLIST) and (tr_vbNode.subtype == 1 or tr_vbNode.subtype == 2) then
+ ProcessTableHlist(tr_vbNode)
+ end
+ end
+ end
+ end
+end
+
+function PostLineBreakFilter(hboxes_stack, groupcode)
+ local funcName = debug_getinfo(1).name
+ local funcNparams = debug_getinfo(1).nparams
+
+ funcName = "PostLineBreakFilter"
+
+ local tbl_fonts_used = { }
+ local tbl_fonts_chars = { }
+ local tbl_fonts_chars_init = { }
+ local tbl_fonts_chars_medi = { }
+ local tbl_fonts_chars_fina = { }
+
+ tbl_fonts_used, tbl_fonts_chars, tbl_fonts_chars_init, tbl_fonts_chars_medi, tbl_fonts_chars_fina = GetFontsChars()
+
+ local f_fontname
+
+ for f_fontname, v in pairs(tbl_fonts_used) do
+ for k1, v1 in pairs(tbl_fonts_chars_init[f_fontname]) do
+ if k1 and not peCharTableInitial[k1] then
+ peCharTableInitial[k1] = utf8.char(k1)
+ end
+ end
+
+ for k1, v1 in pairs(tbl_fonts_chars_medi[f_fontname]) do
+ if k1 and not peCharTableMedial[k1] then
+ peCharTableMedial[k1] = utf8.char(k1)
+ end
+ end
+
+ for k1, v1 in pairs(tbl_fonts_chars_fina[f_fontname]) do
+ if k1 and not peCharTableFinal[k1] then
+ peCharTableFinal[k1] = utf8.char(k1)
+ end
+ end
+ end
+
+ tbl_hlist_nodes = {}
+ tbl_vlist_nodes = {}
+ for hlistNode in node.traverse(hboxes_stack) do
+ if node.next(hlistNode) == nil then
+ goto END
+ end
+
+ ProcessTableHlist(hlistNode)
+
+ if l_texnegar_hboxrecursion_bool.mode == c_true_bool.mode then
+ ::hboxBEGIN::
+ if #tbl_hlist_nodes > 0 then
+ local hlistNodeAdded = table.remove(tbl_hlist_nodes,1)
+ ProcessTableHlist(hlistNodeAdded)
+ goto hboxBEGIN
+ end
+ end
+
+ if l_texnegar_vboxrecursion_bool.mode == c_true_bool.mode then
+ ::vboxBEGIN::
+ if #tbl_vlist_nodes > 0 then
+ local vlistNodeAdded = table.remove(tbl_vlist_nodes,1)
+ ProcessTableVlist(vlistNodeAdded)
+ goto vboxBEGIN
+ end
+ end
+
+ ::END::
+ end
+ return hboxes_stack
+end
+
+if l_texnegar_kashida_glyph_bool.mode == c_true_bool.mode then
+ filler_pe = "resized_kashida"
+elseif l_texnegar_kashida_leaders_glyph_bool.mode == c_true_bool.mode then
+ filler_pe = "leaders+kashida"
+elseif l_texnegar_kashida_leaders_hrule_bool.mode == c_true_bool.mode then
+ filler_pe = "leaders+hrule"
+else
+ print(string_format" Unknown kashida value.")
+end
+
+function StartStretching()
+ if not luatexbase.in_callback('post_linebreak_filter', 'insertKashida') then
+ luatexbase.add_to_callback('post_linebreak_filter', PostLineBreakFilter, 'insertKashida')
+ end
+end
+
+function StopStretching()
+ if luatexbase.in_callback('post_linebreak_filter', 'insertKashida') then
+ luatexbase.remove_from_callback('post_linebreak_filter', 'insertKashida')
+ end
+end
+--
+--
+-- End of file `texnegar-luatex-kashida.lua'.
+%</texnegar-luatex-kashida-lua>
+% \end{macrocode}
+%
+% \section{Acknowledgments}
+% In the first place I have to thank Donald Knuth for inventing TeX.
+% During the development of this package I refered to Stack Exchange network of
+% question-and-answer (Q\&A) websites to solve problems for which I am grateful.
+% I also would like to thank the developer teams of TeX's friends especially LaTeX, LuaTeX and XeTeX teams.
+%
+% \section{Change History}
+%
+% \def\SubSecItem#1{\subsubsection*{\hskip 2em\large #1}\addcontentsline{toc}{subsection}{[#1]}}
+% \newenvironment{Itemize}{\begin{itemize}[leftmargin=4em]}{\end{itemize}}
+%
+% \SubSecItem{2020-08-29~v0.1a}
+% \begin{Itemize}
+% \item First standalone version.
+% \end{Itemize}
+%
+% \SubSecItem{2020-08-30~v0.1b}
+% \begin{Itemize}
+% \item Changed some file names.
+% \end{Itemize}
+%
+% \SubSecItem{2021-01-27~v0.1c}
+% \begin{Itemize}
+% \item Added the option \texttt{Minimal} which is needed if texnegar is used for kashida implementaion only.
+% \item Fixed the problem with \texttt{Scheherazade} and \texttt{Amiri} fonts.
+% \end{Itemize}
+%
+% \section*{To Do's}
+%
+% To do
+%
+% \renewcommand{\refname}{References: \\ {\normalsize\it(Actually, this is not a ``References'' nor a ``Literature'', but the most important
+% although not a complete list of ``Resources Used'' to develop this package.)}}
+%
+% \begin{thebibliography}{9}
+%
+% \bibitem{DEK-TTB} Donald E. Knuth,
+% \emph{The \hologo{TeX} book},
+% Addison-Wesley, 1986.
+%
+% \bibitem{VE-TBT} Victor Eijkhout,
+% \emph{\hologo{TeX} BY TOPIC},
+% Addison-Wesley, 2013.
+%
+% \bibitem{PWA-KAH-KB-TFI} Paul W. Abrahams, Kathryn A. Hargreaves, and Karl Berry,
+% \emph{\hologo{TeX} for the Impatient},
+% Addison-Wesley, 2013.
+%
+% \bibitem{LL-LADPS} Leslie Lamport,
+% \emph{\hologo{LaTeX}, A document preparation System},
+% Addison-Wesley, 1986.
+%
+% \bibitem{FM-MG-JB-DC-CR-TLC} Frank Mittelbach and Michel Goossens with Johannes Braams, David Carlisle, and Chris Rowley,
+% \emph{The \hologo{LaTeX} Companion},
+% Addison-Wesley, second edition, 2004.
+%
+% \bibitem{PRO-IN-LUA} Roberto Ierusalimschy,
+% \emph{Programming in Lua},
+% Lua.org, fourth edition, 2016
+%
+% \bibitem{LUA-REF-MAN} Lua.org,
+% \emph{Lua 5.3 Reference Manual},
+% Lua.org, 2016
+%
+% \bibitem{TLT-TLS} Package \texttt{latex}: The LaTeX Team,
+% \emph{The \hologo{LaTeX2e} Sources},
+% \href{http://mirrors.ctan.org/macros/latex/base/source2e.pdf}{\texttt{CTAN:macros/latex/base/source2e.pdf}}, 2020-02-02
+%
+% \bibitem{TL3T-TLS} Package \texttt{l3kernel}: The LaTeX3 Team,
+% \emph{The \hologo{LaTeX}3 Sources},
+% \href{http://mirrors.ctan.org/macros/latex/contrib/l3kernel/source3.pdf}{\texttt{CTAN:macros/latex/contrib/l3kernel/source3.pdf}}, 2020-07-17
+%
+% \bibitem{TL3T-TLI} Package \texttt{l3kernel}: The LaTeX3 Team,
+% \emph{The \hologo{LaTeX}3 Interfaces},
+% \href{http://mirrors.ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}{\texttt{CTAN:macros/latex/contrib/l3kernel/interface3.pdf}}, 2020-07-17
+%
+% \bibitem{TLT-LRM} Package \texttt{luatex}: The LuaTeX Team,
+% \hologo{LuaTeX} Reference Manual,
+% \href{http://mirrors.ctan.org/systems/doc/luatex/luatex.pdf}{\texttt{CTAN:systems/doc/luatex/luatex.pdf}}, 2020
+%
+% \bibitem{WR-KH-KB-XRG} Package \texttt{xetexref}: Will Robertson, Khaled Hosny, and Karl Berry,
+% \hologo{XeTeX} reference guide,
+% \href{http://mirrors.ctan.org/info/xetexref/xetex-reference.pdf}{\texttt{CTAN:info/xetexref/xetex-reference.pdf}}, 2019-12-09
+%
+% \bibitem{JQ-AX} Package \texttt{xetex}: Jonathan Kew,
+% About \hologo{XeTeX},
+% \href{http://mirrors.ctan.org/systems/doc/xetex/XeTeX-notes.pdf}{\texttt{CTAN:systems/doc/xetex/XeTeX-notes.pdf}}, 2005-10-17
+%
+% \bibitem{NG-TXC} Package \texttt{xetex}: Michel Goossens,
+% The \hologo{XeTeX} Companion,
+% \href{http://xml.web.cern.ch/XML/lgc2/xetexmain.pdf}{\texttt{http://xml.web.cern.ch/XML/lgc2/xetexmain.pdf}}, 2009-08-19
+%
+% \bibitem{TEX-STACKEXCHANGE} Website: Stack Exchange: Hot Questions,
+% \hologo{TeX}-\hologo{LaTeX} Q\&A for users of TeX, LaTeX, ConTeXt, and related typesetting systems,
+% \href{https://tex.stackexchange.com}{\texttt{tex.stackexchange.com}}
+%
+% \bibitem{LUATEX-WIKI} Website: LuaTeX Wiki,
+% \hologo{LuaTeX} Wiki,
+% \href{http://wiki.luatex.org/index.php/Main\_Page}{\texttt{wiki.luatex.org}}
+%
+% \end{thebibliography}
+%
+%\end{implementation}
+%
+% \ifluatex
+% \immediate\directlua{os.execute([[ makeindex -s gind.ist -o \jobname.ind \jobname.idx ]])}
+% \immediate\directlua{os.execute([[ makeindex -s gglo.ist -o \jobname.gls \jobname.glo ]])}
+% \fi
+% \ifxetex
+% \immediate\write18{makeindex -s gind.ist -o \jobname.ind \jobname.idx}
+% \immediate\write18{makeindex -s gglo.ist -o \jobname.gls \jobname.glo}
+% \fi
+% \PrintIndex
+% %\PrintChanges
+% \Finale
diff --git a/Master/texmf-dist/source/latex/texnegar/texnegar.ins b/Master/texmf-dist/source/latex/texnegar/texnegar.ins
new file mode 100644
index 00000000000..a5b915ccf99
--- /dev/null
+++ b/Master/texmf-dist/source/latex/texnegar/texnegar.ins
@@ -0,0 +1,77 @@
+\iffalse meta-comment
+
+File: texnegar.ins
+
+Copyright (C) 2020-2021 Hossein Movahhedian
+
+It may be distributed and/or modified under the LaTeX Project Public License,
+version 1.3c or higher (your choice). The latest version of
+this license is at: http://www.latex-project.org/lppl.txt
+
+\fi
+
+\let\jobname\relax
+\input l3docstrip.tex
+\askforoverwritefalse
+
+\preamble
+
+Copyright (C) 2020-2021 Hossein Movahhedian
+
+It may be distributed and/or modified under the LaTeX Project Public License,
+version 1.3c or higher (your choice). The latest version of
+this license is at: http://www.latex-project.org/lppl.txt
+
+\endpreamble
+% stop docstrip adding \endinput
+\postamble
+\endpostamble
+
+\keepsilent
+
+\generate{\file{texnegar.sty} {\from{texnegar.dtx} {texnegar-sty}}}
+
+\nopreamble
+\nopostamble
+
+\generate{\file{README.txt} {\from{texnegar.dtx} {README-txt}}}
+
+\generate{\file{texnegar-char-table.lua} {\from{texnegar.dtx} {texnegar-char-table-lua}}}
+
+\generate{\file{texnegar.lua} {\from{texnegar.dtx} {texnegar-lua}}}
+
+\generate{\file{texnegar-ini.lua} {\from{texnegar.dtx} {texnegar-ini-lua}}}
+
+\generate{\file{texnegar-luatex-kashida.lua} {\from{texnegar.dtx} {texnegar-luatex-kashida-lua}}}
+
+\usepreamble\defaultpreamble
+\usepostamble\defaultpostamble
+
+\generate{\file{texnegar-luatex.sty} {\from{texnegar.dtx} {texnegar-luatex-sty}}}
+
+\generate{\file{texnegar-xetex.sty} {\from{texnegar.dtx} {texnegar-xetex-sty}}}
+
+\generate{\file{texnegar-ini.tex} {\from{texnegar.dtx} {texnegar-ini-tex}}}
+
+\generate{\file{texnegar-common-kashida.tex} {\from{texnegar.dtx} {texnegar-common-kashida-tex}}}
+
+\generate{\file{texnegar-xetex-kashida.tex} {\from{texnegar.dtx} {texnegar-xetex-kashida-tex}}}
+
+\obeyspaces
+\Msg{******************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the *}
+\Msg{* following files into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* \space\space *.def, *.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file *}
+\Msg{* texnegar.dtx through XeLaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{* Documentation is in texnegar.pdf *}
+\Msg{* *}
+\Msg{******************************************************}
+
+\endbatchfile
diff --git a/Master/texmf-dist/source/latex/textpos/textpos.drv b/Master/texmf-dist/source/latex/textpos/textpos.drv
index c77cc9eb131..331d0176495 100644
--- a/Master/texmf-dist/source/latex/textpos/textpos.drv
+++ b/Master/texmf-dist/source/latex/textpos/textpos.drv
@@ -7,7 +7,7 @@
%% textpos.dtx (with options: `driver')
%% Textpos: absolute positioning of text on the page
%%%% File: textpos.dtx
-%%%% Copyright 1999-2019, Norman Gray
+%%%% Copyright 1999-2020, Norman Gray
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -19,36 +19,37 @@
%%
%% This work has the LPPL maintenance status `maintained'.
%%
-%% The Current Maintainer of this work is Norman Gray <http://nxg.me.uk>
+%% The Current Maintainer of this work is Norman Gray <https://nxg.me.uk>
%%
%% This work consists of the files textpos.dtx and textpos.ins,
%% and the derived file textpos.sty.
%%
-%% Author: Norman Gray, norman@astro.gla.ac.uk.
+%% Author: Norman Gray, gray@nxg.name
%% Department of Physics and Astronomy, University of Glasgow, UK
%%
%% See the file LICENCE for a copy of the LPPL.
%%
-%% Mercurial ident: 09ee0efc21ac (1.9.1+0), 2019-04-15 22:14 +0100
+%% Mercurial ident: c834991c867a (1.10+1), 2020-09-26 17:44 +0100
%%
\documentclass{ltxdoc}
\title{Textpos: absolute positioning of text on the page}
-\author{Norman Gray\\(\texttt{http://nxg.me.uk})}
-\date{Version 1.9.1, 2019 April 15\footnote{Mercurial ident: 09ee0efc21ac (1.9.1+0), 2019-04-15 22:14 +0100.
-This software is copyright, 1999-2019 Norman Gray.
+\author{Norman Gray\\(\texttt{https://nxg.me.uk})}
+\date{Version 1.10, 2020 September 26\footnote{Mercurial ident: c834991c867a (1.10+1), 2020-09-26 17:44 +0100.
+This software is copyright, 1999-2020 Norman Gray.
It is released under the terms of the LaTeX Project Public License,
either version 1.3 of this licence or (at your option) any later version.
The latest version of this license is at \texttt{http://www.latex-project.org/lppl.txt}.}}
\newcommand\Lopt[1]{\textsf {\small [#1]}}
\newcommand\file[1]{\texttt {#1}}
-\newcommand\Lcount[1]{\textsl {\small#1}}
+\newcommand\Lcount[1]{\textsl{\small#1}}
\newcommand\Lenv[1]{\texttt{\{#1\}}}
-\newcommand\pstyle[1]{\textsl {#1}}
+\newcommand\pstyle[1]{\textsf{#1}}
\makeatletter % make the ttfamily font less overbearingly large
\renewcommand\ttfamily{\not@math@alphabet\ttfamily\mathtt
\fontfamily\ttdefault
\fontsize{9}{\f@baselineskip}\selectfont}
\makeatother
+\def\LaTeXiie{\LaTeX$2\epsilon$}
\def\activemeta#1>{\meta{#1}}
{\catcode`\<=\active
\gdef\cmd{\begingroup
diff --git a/Master/texmf-dist/source/latex/textpos/textpos.dtx b/Master/texmf-dist/source/latex/textpos/textpos.dtx
index 7be07003894..7b43236da42 100644
--- a/Master/texmf-dist/source/latex/textpos/textpos.dtx
+++ b/Master/texmf-dist/source/latex/textpos/textpos.dtx
@@ -3,7 +3,7 @@
% anywhere on the LaTeX page. It's useful for posters.
%
%%%% File: textpos.dtx
-%%%% Copyright 1999-2019, Norman Gray
+%%%% Copyright 1999-2020, Norman Gray
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
@@ -15,41 +15,42 @@
%%
%% This work has the LPPL maintenance status `maintained'.
%%
-%% The Current Maintainer of this work is Norman Gray <http://nxg.me.uk>
+%% The Current Maintainer of this work is Norman Gray <https://nxg.me.uk>
%%
%% This work consists of the files textpos.dtx and textpos.ins,
%% and the derived file textpos.sty.
%%
-%% Author: Norman Gray, norman@astro.gla.ac.uk.
+%% Author: Norman Gray, gray@nxg.name
%% Department of Physics and Astronomy, University of Glasgow, UK
%%
%% See the file LICENCE for a copy of the LPPL.
%%
-%% Mercurial ident: 09ee0efc21ac (1.9.1+0), 2019-04-15 22:14 +0100
+%% Mercurial ident: c834991c867a (1.10+1), 2020-09-26 17:44 +0100
%%
%<+package>\NeedsTeXFormat{LaTeX2e}
-%<+package>\ProvidesPackage{textpos}[2019/04/15 v1.9.1]
-%<+package>\typeout{Package: textpos 2019/04/15 1.9.1, absolute positioning of text on the page}
+%<+package>\ProvidesPackage{textpos}[2020/09/26 v1.10]
+%<+package>\typeout{Package: textpos 2020/09/26 1.10, absolute positioning of text on the page}
%
%<*driver>
\documentclass{ltxdoc}
\title{Textpos: absolute positioning of text on the page}
-\author{Norman Gray\\(\texttt{http://nxg.me.uk})}
-\date{Version 1.9.1, 2019 April 15\footnote{Mercurial ident: 09ee0efc21ac (1.9.1+0), 2019-04-15 22:14 +0100.
-This software is copyright, 1999-2019 Norman Gray.
+\author{Norman Gray\\(\texttt{https://nxg.me.uk})}
+\date{Version 1.10, 2020 September 26\footnote{Mercurial ident: c834991c867a (1.10+1), 2020-09-26 17:44 +0100.
+This software is copyright, 1999-2020 Norman Gray.
It is released under the terms of the LaTeX Project Public License,
either version 1.3 of this licence or (at your option) any later version.
The latest version of this license is at \texttt{http://www.latex-project.org/lppl.txt}.}}
\newcommand\Lopt[1]{\textsf {\small [#1]}}
\newcommand\file[1]{\texttt {#1}}
-\newcommand\Lcount[1]{\textsl {\small#1}}
+\newcommand\Lcount[1]{\textsl{\small#1}}
\newcommand\Lenv[1]{\texttt{\{#1\}}}
-\newcommand\pstyle[1]{\textsl {#1}}
+\newcommand\pstyle[1]{\textsf{#1}}
\makeatletter % make the ttfamily font less overbearingly large
\renewcommand\ttfamily{\not@math@alphabet\ttfamily\mathtt
\fontfamily\ttdefault
\fontsize{9}{\f@baselineskip}\selectfont}
\makeatother
+\def\LaTeXiie{\LaTeX$2\epsilon$}
% Make command strings easier to write
\def\activemeta#1>{\meta{#1}}
{\catcode`\<=\active
@@ -114,15 +115,17 @@ The latest version of this license is at \texttt{http://www.latex-project.org/lp
% section headings, citations, graphics inclusion, and so on. Please
% let me know if you experience problems in this respect.
%
-% This package requires the services of Martin Schr\"oder's package
-% \texttt{everyshi}. If this is not already part of your \TeX{}
+% \emph{If it is running in \LaTeXiie} (as opposed to the newer \LaTeX3),
+% this package requires the services of Martin Schr\"oder's package \pstyle{everyshi}.
+% If this is not already part of your \TeX{}
% installation, you will need to download this package from CTAN. See
% \url{https://www.ctan.org/pkg/everyshi}.
%
% The canonical CTAN URL for Textpos is \url{https://ctan.org/pkg/textpos}.
% Textpos has a home page at \url{http://purl.org/nxg/dist/textpos}.
-% The source is held at bitbucket: \url{https://bitbucket.org/nxg/textpos},
-% and there is an issues list there, for bug reports. Code
+% The source is held at \url{https://code.nxg.name/nxg/tex/textpos}.
+% \iffalse and there is an issues list there, for bug reports.\fi
+% Code
% contributions or fixes are welcome, but note that I feel that
% Textpos is pretty mature now, and I'm reluctant to extend its
% functionality beyond its natural boundaries, so it would be wise to
@@ -219,13 +222,21 @@ The latest version of this license is at \texttt{http://www.latex-project.org/lp
% was changed, and specified, in that version.
%
% The \Lenv{textblock} environment will most often be used in
-% vertical mode. If it is called in horizontal (ie, paragraph) mode,
-% however, it will silently create a paragraph break by inserting a
-% |\par| command before the environment; it remains in vertical mode
-% after the environment is finished. It should have no further
-% effects on spacing, and if you find that it does, that's a bug. If
-% you try to use the environment when in maths mode, the package
-% objects (as it should!).
+% vertical mode. It can also be called in horizontal (ie, paragraph)
+% mode. In each case, it should be invisible, in the sense of having
+% no effect on the spacing of the paragraph text.\footnote{Note:
+% \emph{this is a change} in version
+% 1.10. Before then the behaviour of the package in horizontal
+% mode was deliberately somewhat underspecified (with an intended
+% implication of `don't do this'), and the package, for want of anything
+% more imaginative to do, simply threw in a paragraph break. As a
+% result of user feedback, from version 1.10 it seemed reasonable to try
+% a little harder to be invisible in the horizontal case.}
+% If called in horizontal mode (in \TeX\ terms), the relative-mode
+% `anchor point' is just below the box containing the current line (it
+% uses |\vadjust|, if that helps).
+% If you try to use the environment when in maths mode, the package
+% objects.
%
% \subsection{Package options}
% \label{packopts}
@@ -234,7 +245,14 @@ The latest version of this license is at \texttt{http://www.latex-project.org/lp
% \begin{description}
% \item[\Lopt{showboxes}]When you are laying things out, it can be
% useful to have the boxes drawn in for you. This option draws a box
-% fitting closely round the set text.
+% fitting closely round the contents of each \Lenv{textblock} environment.
+% Note that this option is
+% intended to help locate boxes on the page when composing a document,
+% and the boxes are not intended to be decorative. However the
+% \Lenv{textblock} environment is compatible with (for example) the
+% \pstyle{tcolorbox} package, in the sense that you can
+% include a \Lenv{tcolorbox} environment within a \Lenv{textblock}
+% environment, with the expected effect\footnote{See also \url{https://tex.stackexchange.com/questions/34088/}.}.
% \item[\Lopt{noshowtext}]This suppresses the display of the text in
% each block (so it's not really usable without the \Lopt{showboxes}
% option). The resulting box will be the correct size, but empty,
@@ -290,7 +308,8 @@ The latest version of this license is at \texttt{http://www.latex-project.org/lp
% \subsubsection{Setting up a positioning grid}
%
% \DescribeMacro{\TPGrid}
-% You will often wish to set up a grid on your page. Rather than
+% The dimensions |\TPHorizModule| and |\TPVertModule| implicitly
+% create a positioning grid on the page. Rather than
% calculate and specify the two modules explicitly, you can set up the
% grid with a command
% \cmd|\TPGrid{<nhoriz>}{<nvert>}|, which sets
@@ -317,6 +336,16 @@ The latest version of this license is at \texttt{http://www.latex-project.org/lp
% leaving 40mm of a border on the right and left sides, and a 20mm
% border top and bottom.
%
+% \DescribeMacro{\TPShowGrid}
+% Note that this sets up a notional layout grid for the page or, put
+% another way, it sets the module units with respect to which the
+% |(<hpos>,<vpos>)| coordinates are interpreted, but it
+% does not actually draw a grid on the page. To display the grid, use
+% the |\TPShowGrid{<nhoriz>}{<nvert>}| macro. This has a starred
+% variant, which additionally shows the coordinates at each grid
+% point. You should do this near the beginning of your file.
+% For an alternative approach, see Sect.~\ref{s:interactions}.
+%
% \subsubsection{Box margin}
%
% \DescribeMacro{\TPMargin}
@@ -445,6 +474,9 @@ The latest version of this license is at \texttt{http://www.latex-project.org/lp
% the width and location arguments to the (unstarred) \Lenv{textblock}
% environment.
%
+% With the unstarred \Lenv{textblock} environment, however, you will generally be able to
+% use the |\fpeval| command of the `xfp' package.\footnote{https://ctan.org/pkg/xfp}
+%
% \subsection{Package parameters}
% \begin{raggedright}
% \begin{description}
@@ -454,7 +486,8 @@ The latest version of this license is at \texttt{http://www.latex-project.org/lp
% size parameters of the \Lenv{textblock} environment. Set it using
% the command \cmd|\setlength{\TPHorizModule}{<dimen>}| (or indeed
% |\addtolength|).
-% The default is one sixteenth of the paper width.
+% The default is one sixteenth of the paper width
+% (ie, as if set up with |\TPGrid{16}{16}|).
% \item[\texttt{\bslash TPVertModule}]
% \DescribeMacro{\TPVertModule}
% The length unit which is used for the vertical positioning and
@@ -719,10 +752,11 @@ The latest version of this license is at \texttt{http://www.latex-project.org/lp
%
% Gabriel Zachmann suggested having Textpos put a grid on the
% page\marginpar{page grid}, so
-% that it is easier to work out \Lenv{textblock} coordinates. I may
-% yet do this, but it may not be necessary, since Rolf Niepraschk's
-% \texttt{eso-pic} package can help you create this grid yourself.
-% There is a vivid example of using Textpos along with Rolf's
+% that it is easier to work out \Lenv{textblock} coordinates. I have
+% (finally, in 1.10) followed this suggestion, in the |\TPShowGrid| macro, but
+% another approach to doing this, which may have further useful
+% flexibility, is to use Rolf Niepraschk's
+% \texttt{eso-pic} package. There is a vivid example of using Textpos along with Rolf's
% \texttt{eso-pic} package and the \texttt{calc} package on the
% Textpos web pages, at
% \url{http://purl.org/nxg/dist/textpos}, and an example of how to
@@ -757,7 +791,40 @@ The latest version of this license is at \texttt{http://www.latex-project.org/lp
% \section{History}
% \iffalse @RELEASENOTES@ \fi
% \begin{description}
-% \item[\textbf{1.9.1, 2019 April 15}]\relax
+% \item[\textbf{1.10, 2020 September 26}]\relax
+%
+% \begin{itemize}
+% \item Use the \emph{ltshipout} package to place boxes in absolute mode.
+% Therefore the package should now be compatible with LaTeX3.
+% Many thanks to Ulrike Fischer for guidance on the changes which were required here.
+% \item The code has moved from bitbucket.org to
+% code.nxg.name\footnote{\url{https://code.nxg.name/nxg/tex/textpos/}},
+% since bitbucket have closed down support for Mercurial. The
+% outstanding issues have been preserved, but have not (yet) been
+% migrated to a new system, so may become inaccessible.
+% \end{itemize}
+%
+%
+% \item[1.10b1, 2020 January 26]\relax
+%
+% \begin{itemize}
+% \item Add the |\TPShowGrid| macro.
+% \item Become invisible in horizontal mode.
+% \emph{Note: this is a change in behaviour:}
+% Before this the behaviour of the package in horizontal
+% mode was deliberately somewhat underspecified (with an intended
+% implication of ‘don't do this’), and the package, for want of anything
+% more imaginative to do, simply threw in a paragraph break, which
+% produced ugly spacing in some circumstances. As a result of
+% user
+% feedback\footnote{\url{https://tex.stackexchange.com/questions/525453/}}, from version 1.10 it seemed reasonable to try a little
+% harder to be invisible in the horizontal case
+% (see issue 16\footnote{\url{https://bitbucket.org/nxg/textpos/issues/16/}}).
+% \item Various documentation improvements.
+% \end{itemize}
+%
+%
+% \item[1.9.1, 2019 April 15]\relax
%
% \begin{itemize}
% \item Added the |\TPReferencePosition| command, to change the
@@ -958,6 +1025,9 @@ The latest version of this license is at \texttt{http://www.latex-project.org/lp
% The text includes footnoted thanks to various people who have made
% (sometimes very detailed) suggestions for functionality.
%
+% Ulrike Fischer provided detailed guidance on the changes required to
+% make \pstyle{textpos} compatible with \LaTeX3.
+%
% Thanks are additionally due, for general bugreports and other suggestions, to
% Jozef Bednarcik,
% Richard G Daniel,
@@ -1084,13 +1154,33 @@ located at that point, rather than the top-left corner.
\ProcessOptions
% \end{macrocode}
%
+% \subsection{\LaTeX3/\LaTeXiie\ compatibility}
+%
+% This code aims to be compatible with both \LaTeXiie\ and \LaTeX3. This
+% means that it must use the \pstyle{everyshi} package in the \LaTeXiie\
+% case, and can use the corresponding built-in \LaTeX3 mechanism otherwise.
+% For documentation on the latter, see the `ltshipout' package documentation.
+%
+% There are a couple of places in where we must switch behaviour.
+% Conditionalise them with a single switch.
+% \begin{macrocode}
+\newif\ifTP@Liii
+\@ifl@t@r\fmtversion{2020/10/01}\TP@Liiitrue\TP@Liiifalse
+\PackageInfo{textpos}{choosing support for \ifTP@Liii LaTeX3\else LaTeX2e\fi}
+% \end{macrocode}
+%
% \subsection{Required Packages}
%
-% To manipulate |\box255|, this package needs the package
-% \texttt{everyshi}, which provides the command |\EveryShipout|.
+% To manipulate |\box255| when using \LaTeXiie,
+% this package needs the package
+% \pstyle{everyshi}, which provides the command |\EveryShipout|.
% \begin{macrocode}
-\ifTP@abspos
- \RequirePackage{everyshi}
+\ifTP@Liii
+ % avoid everyshi package
+\else
+ \ifTP@abspos
+ \RequirePackage{everyshi}
+ \fi
\fi
\RequirePackage{keyval}
% \end{macrocode}
@@ -1151,9 +1241,15 @@ located at that point, rather than the top-left corner.
% When the package is invoked in `absolute' mode, the contents of
% |\TP@textbox| are not shipped out immediately, but instead put into the box
% |\TP@holdbox|, which holds the boxes until the page as a whole is
-% shipped out (these additions contributed by Olaf Maibaum).
+% shipped out.\footnote{These additions contributed by Olaf Maibaum}
% \changes{v1.1}{1999/02/22}{Introduce holdbox, and absolute/relative modes}
%
+% Add a flag which is used to recall the vertical/horizontal mode in
+% which the textblock is prepared.
+% \begin{macrocode}
+\newif\ifTP@vmode
+% \end{macrocode}
+%
% Define the holdbox only in the `absolute positioning' mode.
% \begin{macrocode}
\ifTP@abspos
@@ -1166,9 +1262,8 @@ located at that point, rather than the top-left corner.
% non-empty; the page is no longer empty, so the output routine must
% be called at some point. The alternative is to add such an hbox at
% the end of every textblock, when in absolute mode. That solves
-% this problem, but introduces others by interfering with vertical spacing.
-% (thanks to Bjoern Pedersen for diagnosing this in an old version
-% of textpos).
+% this problem, but introduces others by interfering with vertical
+% spacing.\footnote{Thanks to Bjoern Pedersen for diagnosing this in an old version of textpos}
% \begin{macrocode}
\AtEndDocument{\ifTP@displayholdbox\ifvoid\TP@holdbox \else \hbox{}\fi\fi}
\fi
@@ -1274,6 +1369,39 @@ located at that point, rather than the top-left corner.
\def\showtextsize{\normalsize}
% \end{macrocode}
%
+% In order to make it easy to visualise the grid, the
+% |\TPShowGrid| macro displays it on the page. There's a starred
+% version, which shows the coordinates, and an unstarred version,
+% which doesn't.
+% \begin{macrocode}
+\def\TPShowGrid{\@ifstar{\@tempswatrue\@TPShowGrid}{\@tempswafalse\@TPShowGrid}}
+% \end{macrocode}
+% And the implementation
+% \begin{macrocode}
+\def\@TPShowGrid#1#2{
+ \begin{textblock}{#1}(0,0)
+ \lineskip=0pt % abut boxes directly
+ \setbox0=\hbox{(0)}%
+ \@tempdima=\TPVertModule
+ \advance\@tempdima -1.1\ht0
+ \@tempcnta=0
+ \hrule
+ \loop
+ \vbox to \TPVertModule{\noindent
+ \@tempcntb=0
+ \vrule
+ \loop
+ \hbox to \TPHorizModule{%
+ \if@tempswa\raise\@tempdima\hbox{(\the\@tempcntb,\the\@tempcnta)}\fi
+ \hfil \vrule height \TPVertModule}%
+ \advance\@tempcntb 1
+ \ifnum\@tempcntb<#1 \repeat
+ \vss \hrule}
+ \advance\@tempcnta 1
+ \ifnum\@tempcnta<#2 \repeat
+ \end{textblock}}
+% \end{macrocode}
+%
% \begin{macro}{\textblockorigin}
% If we're producing a single page of text, it can be convenient to
% set an origin. This command may only be used in absolute mode.
@@ -1412,22 +1540,10 @@ located at that point, rather than the top-left corner.
% \begin{macrocode}
\def\textblock#1{%
\@tempdima=#1\TPHorizModule
- \ifvmode\else
- \ifmmode
- \PackageError{textpos}
- {You cannot use textblock in maths mode}
- {You may use the textblock environment only in \MessageBreak
- vertical mode or horizontal mode (when it triggers a\MessageBreak
- new paragraph). You cannot use it in maths mode.}
- \else % in horizontal mode
- \par % force us back into vertical mode
- \fi
- \fi
- \@ifnextchar[{\TP@textblock}{\expandafter\TP@textblock\expandafter[\TP@referenceposition]}%] bracematch
+ \TP@begintextblock
}
% \end{macrocode}
% \end{macro}
-%
% \begin{macro}{\textblock*}
% |\begin{textblock*}| is a variant of |\begin{textblock}| which takes
% absolute values for its arguments. It uses |\setlength| throughout,
@@ -1435,20 +1551,32 @@ located at that point, rather than the top-left corner.
% \changes{1.2a}{2002/04/28}{Added textblock* env}
% \begin{macrocode}
\def\TP@textblockstar#1{%
- \setlength{\@tempdima}{#1}
- \ifvmode\else
- \PackageWarning{textpos}{environment textblock* not in vertical mode.
- \MessageBreak
- Environment textblock* should not have any text\MessageBreak
- or printable material appearing before it.\MessageBreak
- Alignment may work out wrongly.}%
- \par % force us back into vertical mode
- \fi
- \@ifnextchar[{\TP@textblock}{\expandafter\TP@textblock\expandafter[\TP@referenceposition]}%] bracematch
+ \setlength{\@tempdima}{#1}%
+ \TP@begintextblock
}
\expandafter\let\csname textblock*\endcsname\TP@textblockstar
% \end{macrocode}
% \end{macro}
+% Common code for |textblock| and |textblock*|.
+% \begin{macrocode}
+\def\TP@begintextblock{%
+ \ifvmode
+ \TP@vmodetrue
+ \else
+ \ifmmode
+ \PackageError{textpos}
+ {You cannot use textblock in maths mode}
+ {You may use the textblock environment only in \MessageBreak
+ vertical mode or horizontal mode. You cannot use it in maths mode.}
+ \else % in horizontal mode
+ \TP@vmodefalse
+ \@bsphack
+ \unskip
+ \fi
+ \fi
+ \@ifnextchar[{\TP@textblock}{\expandafter\TP@textblock\expandafter[\TP@referenceposition]}%] bracematch
+}
+% \end{macrocode}
%
% \begin{macro}{\TP@textblock}
% Command |\TP@textblock| saves all its arguments in a token list, for
@@ -1522,7 +1650,7 @@ located at that point, rather than the top-left corner.
\hskip\TP@absmargin\vbox\bgroup
\textwidth\hsize \columnwidth\hsize \linewidth\hsize
\fi
- }
+}
% \end{macrocode}
% \end{macro}
%
@@ -1546,12 +1674,6 @@ located at that point, rather than the top-left corner.
% |\TP@endtextblock| with the arguments we saved in the token register
% in |\TP@tbargs|.
%
-% To manipulate the spacing around textblocks, we want to save the
-% |\prevdepth| quantity in |\TP@prevdepth|.
-% \begin{macrocode}
-\newdimen\TP@prevdepth
-% \end{macrocode}
-%
% Now we can handle the end of the textblock. When |\TP@margin| is
% non-zero, include a final skip which is the size of the absolute
% value of this margin.
@@ -1572,26 +1694,11 @@ located at that point, rather than the top-left corner.
\egroup % end of \TP@textbox
% \end{macrocode}
%
-% Control vertical spacing: we need to avoid causing the
-% insertion of more space in the case where this \texttt{textblock} is
-% between paragraphs of text. Save the |\prevdepth|, then set it to
-% $-1000pt$, suppressing interline glue; then add the zero-size vbox;
-% then restore |\prevdepth| to what it was before. See the discussion
-% of interline glue (ie, |\baselineskip| and |\prevdepth|) in
-% Chapter~12 (p.~80) of the \TeX book (thanks to Peter M\"unster
-% \texttt{<peter@univ-rennes1.fr>} for spotting that I'd got this
-% wrong in the previous version).
-% \changes{v1.1e}{2001/04/29}{Replace randomly-placed nointerline skip with prevdepth acrobatics, to avoid spacing misfeatures}
-% \changes{v1.4}{2003/09/05}{Improve prevdepth calculations, adding TP@prevdepth}
-% \begin{macrocode}
- \TP@prevdepth=\prevdepth
- \prevdepth=-1000pt % = \nointerlineskip
-% \end{macrocode}
% Finally, call |\TP@endtextblock| to do the work of putting the text
% on the page, directly or indirectly.
% \begin{macrocode}
\expandafter\TP@endtextblock\the\TP@tbargs
- }
+}
% \end{macrocode}
% \end{macro}
%
@@ -1625,8 +1732,8 @@ located at that point, rather than the top-left corner.
\@tempdima=#3\TPHorizModule
\@tempdimb=#4\TPVertModule
\else % absolute/starred endtextblock
- \setlength{\@tempdima}{#3}
- \setlength{\@tempdimb}{#4}
+ \setlength{\@tempdima}{#3}%
+ \setlength{\@tempdimb}{#4}%
\fi
% \end{macrocode}
% Next, we adjust them so that the position |(#1,#2)| is at this
@@ -1727,7 +1834,9 @@ located at that point, rather than the top-left corner.
% \subsection{Sending the boxes to the output}
%
% Now switch behaviour depending on whether or not we're in the
-% absolute-position mode. If we are, then add the newly-constructed
+% absolute-position mode.
+%
+% If we are in absolute position mode, then add the newly-constructed
% box 0 to (the end of) the holdbox. The order matters in some
% (many?, all?) circumstances, since this way means that later
% textblock environments go `on top of' earlier ones, which is
@@ -1750,18 +1859,47 @@ located at that point, rather than the top-left corner.
% all offset from the same point, and (b) that we are invisible with
% respect to any |\parskip| or |\baselineskip| calculations that were
% relevant at the time we started the textblock.
+% See the discussion of interline glue
+% (ie, |\baselineskip| and |\prevdepth|)
+% in Chapter~12 (p.~80) of the \TeX book.
% \begin{macrocode}
\else
- \box0
- \prevdepth=\TP@prevdepth
+ \ifTP@vmode
+ \@tempdima=\prevdepth
+ \prevdepth=-1000pt % = \nointerlineskip, supressing interline glue
+ \box0 % zero height+depth
+ \prevdepth=\@tempdima
+ \else
+ \vadjust{\box0}%
+ \@esphack
+ \fi
\fi
- }%
+}
% \end{macrocode}
% \end{macro}
%
-% Finally, and only if we are in the absolute-position mode, set up
-% the output routine with |\EveryShipout|, and set the textblockorigin
-% to the (default) upper-left corner of the paper. Respect the
+% Finally, and only if we are in the absolute-position mode,
+% set the textblockorigin to the (default) upper-left corner of the paper,
+% and organise the shipout mechanism to place the |\TP@holdbox| in a suitable place.
+%
+% There are two cases here, one when we are using \LaTeX3, and one
+% with \LaTeXiie.
+%
+% First, the \LaTeX3 case: use the `ltshipout' mechanism..
+% \begin{macrocode}
+\ifTP@abspos
+ \ifTP@Liii
+ \ifTP@overlay
+ \AddToHook{shipout/foreground}{%
+ \ifTP@displayholdbox\put(\strip@pt\dimexpr1in,-\strip@pt\dimexpr1in){\box\TP@holdbox}\fi}
+ \else
+ \AddToHook{shipout/background}{%
+ \ifTP@displayholdbox\put(\strip@pt\dimexpr1in,-\strip@pt\dimexpr1in){\box\TP@holdbox}\fi}
+ \fi
+% \end{macrocode}
+%
+% Second, the \LaTeXiie\ case: use the macros provided by the \pstyle{everyshi} package.
+% We set up the output routine with |\EveryShipout|, and . Respect the
% \Lopt{overlay} option by putting the |\TP@holdbox| contents
% \emph{after} the |\@cclv| contents, putting the latter into a size-0
% box (could this cause a problem with spacing? I don't think so, at
@@ -1774,21 +1912,22 @@ located at that point, rather than the top-left corner.
% If |\ifTP@displayholdbox| is false, then both of these should be no-ops.
% \changes{v1.2b}{2002/07/01}{Defend against box 255 not being a vbox}
% \begin{macrocode}
-\ifTP@abspos
- \ifTP@overlay
- \EveryShipout{\ifTP@displayholdbox
- \global\setbox\@cclv\vbox{%
- \vbox to 0pt{\ifvbox\@cclv \unvbox\@cclv \else \box\@cclv \fi \vss}%
- \unvbox\TP@holdbox % TP@holdbox is now void
- }%
- \fi}%
\else
- \EveryShipout{\ifTP@displayholdbox
- \global\setbox\@cclv\vbox{%
- \unvbox\TP@holdbox
- \ifvbox\@cclv \unvbox\@cclv \else \box\@cclv \fi
- }%
- \fi}%
+ \ifTP@overlay
+ \EveryShipout{\ifTP@displayholdbox
+ \global\setbox\@cclv\vbox{%
+ \vbox to 0pt{\ifvbox\@cclv \unvbox\@cclv \else \box\@cclv \fi \vss}%
+ \unvbox\TP@holdbox % TP@holdbox is now void
+ }%
+ \fi}%
+ \else
+ \EveryShipout{\ifTP@displayholdbox
+ \global\setbox\@cclv\vbox{%
+ \unvbox\TP@holdbox
+ \ifvbox\@cclv \unvbox\@cclv \else \box\@cclv \fi
+ }%
+ \fi}%
+ \fi
\fi
\textblockorigin{0pt}{0pt}%
\fi
diff --git a/Master/texmf-dist/source/latex/thesis-ekf/thesis-ekf.dtx b/Master/texmf-dist/source/latex/thesis-ekf/thesis-ekf.dtx
index 03298979410..dbd357d85ec 100644
--- a/Master/texmf-dist/source/latex/thesis-ekf/thesis-ekf.dtx
+++ b/Master/texmf-dist/source/latex/thesis-ekf/thesis-ekf.dtx
@@ -20,16 +20,18 @@
\ProvidesFile{thesis-ekf.dtx}
%</driver>
%<class>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-%<class>\ProvidesClass{thesis-ekf}[2020/02/05 v3.3 Thesis class for Eszterhazy Karoly University (Eger, Hungary)]
+%<class>\ProvidesClass{thesis-ekf}[2020/12/22 v4.1 Thesis class for Eszterhazy Karoly University (Eger, Hungary)]
%<class>
%<*driver>
\documentclass{ltxdoc}
\OnlyDescription
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
-\usepackage[a4paper,left=2in]{geometry}
\PassOptionsToPackage{active=onlycs}{magyar.ldf}
\usepackage[english,magyar]{babel}
+\usepackage[unicode,pdfstartview=FitH,bookmarksopen]{hyperref}
+\usepackage{bookmark}
+\usepackage[a4paper,left=2in,top=1.5in,bottom=1.5in]{geometry}
\frenchspacing
\usepackage{lmodern,paralist,textcomp,fancyvrb}
\setlength{\MacroTopsep}{0pt}
@@ -59,15 +61,15 @@
% Right brace \} Tilde \~}
%
% \GetFileInfo{thesis-ekf.cls}
-% \title{Thesis class for\\ Eszterházy Károly University\\\textsf{thesis-ekf.cls}\\[2mm]{\normalsize Version 3.3\\2020/02/05\\}}
+% \title{Thesis class for\\ Eszterházy Károly University\\\textsf{thesis-ekf.cls}\\[2mm]{\normalsize Version 4.1\\2020/12/22\\}}
% \author{Tibor Tómács\\{\small\ttfamily tomacs.tibor@uni-eszterhazy.hu}}
% \date{}
% \maketitle
+% \def\abstractname{}
+%\begin{abstract}
+% \selectlanguage{english}\noindent This is a class file for theses and dissertations at Eszterházy Károly University, Eger, Hungary (website: \texttt{https://uni-eszterhazy.hu}). The documentation is in Hungarian.
+%\end{abstract}
%
-% \selectlanguage{english}
-% This is a class file for theses and dissertations at Eszterházy Károly University, Eger, Hungary (website: \texttt{https://uni-eszterhazy.hu}). The documentation is in Hungarian.
-%
-% \selectlanguage{magyar}
% \section{Bevezető}
%
% A \texttt{thesis-ekf} dokumentumosztály segítségével az Eszterházy Károly Egyetem szabályzatának megfelelő szakdolgozatokat lehet készíteni. A névben szereplő \texttt{ekf} az Eszterházy Károly Főiskola rövidítése, ugyanis ez a dokumentumosztály 2014-től létezik, amikor az intézmény még főiskola volt. A formai követelmények a következők:
@@ -85,11 +87,31 @@
% \medskip\noindent
% A \texttt{thesis-ekf} ezeket a paramétereket automatikusan beállítja, továbbá a megfelelő címoldal elkészítését is elvégzi.
%
-% \section{A dokumentumosztály betöltése}
-%
-% A \texttt{thesis-ekf} dokumentumosztály a \texttt{report} osztályt használja alapként, továbbá a következő csomagokat tölti be: \texttt{cmap}, \texttt{lmodern}, \texttt{fixcmex}, \texttt{kvoptions}, \texttt{etoolbox}, \texttt{ifpdf}, \texttt{setspace}, \texttt{hyperref}, \texttt{geometry}, \texttt{graphicx}, \texttt{upqute}.
+% \section{A dokumentumosztály által betöltött csomagok}
+%
+% A |thesis-ekf| dokumentumosztály a |report| osztályt használja alapként, továbbá rendre a következő csomagokat tölti be:
+%
+%\medskip
+%\begin{compactdesc}
+%\item[|kvoptions|] (opciók definiálásához)
+%\item[|iftex|] (|pdflatex| fordító detektálásához)
+%\item[|cmap|] (|pdflatex| fordítóval készült pdf-ben a keresés és ,,kopizás'' ezzel minden ékezetes betűre jól működik; csak |pdflatex| fordító használata esetén töltődik be)
+%\item[|hyperref|] (elektronikus verzióhoz; opciók: |unicode|, |allcolors=blue|, |linktocpage|, |pdfstartview=FitH|, |bookmarksnumbered|, |pdfborder={0 0 0}|)
+%\item[|geometry|] (oldalméretek beállításához; opciók: |a4paper|, |top=25mm|, |bottom=25mm|, |inner=30mm|, |outer=25mm|)
+%\item[|lmodern|] (Latin Modern fontkészlethez; |times| opció esetén nem töltődik be)
+%\item[|fixcmex|] (Latin Modern fontkészlet esetén a nagy operátor jeleket méretezhetővé teszi; |times| opció esetén nem töltődik be)
+%\item[|cmupint|] (Latin Modern fontkészlet esetén az integráljelek álló alakúak; csak az |upint| és |times=false| opciók esetén töltődik be)
+%\item[|etoolbox|] (dokumentum horgonyokhoz)
+%\item[|setspace|] (sortávolság beállításához)
+%\item[|graphicx|] (képek betöltéséhez)
+%\item[|newtxtext|] (Times fontkészlethez; |times| opció esetén töltődik be)
+%\item[|newtxmath|] (Times matematikai fontkészlethez; |times| opció esetén töltődik be)
+%\item[|fontsize|] (|fontsize=|\meta{méret} opcióhoz; csak akkor töltődik be, ha a \meta{méret} különbözik a |10pt|, |11pt| és |12pt| értékektől.)
+%\item[|upquote|] (verbatimban \textquotesingle\ és \textasciigrave\ jelekért)
+%\end{compactdesc}
+%
+% \section{A dokumentumosztály betöltése és legfontosabb opciói}
%
-% \medskip
% \begin{macro}{\documentclass}\param{\oarg{opciók}\texttt{\{thesis-ekf\}}}
% A dokumentumosztályt a preambulum elején ezzel a paranccsal lehet betölteni.
% \end{macro}
@@ -110,6 +132,18 @@
% A tartalomjegyzéknek nem lesz oldalszámozása. Ha közvetlenül a címoldalt követően van elhelyezve a tartalomjegyzék, akkor az első számozott oldal csak ezután következik.
% \end{macro}
%
+% \begin{macro}{reverseorder}
+% Alapbeállítás esetén a címoldalon a szerző bal, a témavezető pedig a jobb oldalon helyezkedik el. Ezzel az opcióval fordított lesz a sorrend.
+% \end{macro}
+%
+% \begin{macro}{times}
+% Alapbeállítás esetén a Latin Modern fontkészletet használja a dokumentumosztály. Ezzel az opcióval áttérhet a Times fontkészletre, amely nagyon hasonló a közismert Times New Roman-hoz. Ne használja \texttt{xelatex} és \texttt{lualatex} fordítók esetén!
+% \end{macro}
+%
+% \begin{macro}{upint}
+% Alapbeállítás esetén a dokumentumban található integráljelek dőltek. Ezzel az opcióval álló alakúak lesznek és kiemelt képletekben a határok az integráljel alatt és fölött helyezkednek el (hasonlóan az |amsmath| csomag |intlimits| opciójához). Ezt főleg magyar nyelvű dokumentumok esetén használja.
+% \end{macro}
+%
% \section{Címoldal létrehozása}
%
% \begin{macro}{\institute}\param{\marg{intézmény neve}}
@@ -128,6 +162,18 @@
% Ezzel kell megadni a szakdolgozat témavezetőjének a nevét és beosztását.
% \end{macro}
%
+% \begin{macro}{\collaborator}\param{\oarg{felirat}}
+% Ha több szerzőt vagy témavezetőt akar beírni, akkor azokat ezzel kell elválasztani. A \meta{felirat} opció használatával ez a felirat jelenik meg a soronkövetkező név felett. Például
+%\begin{Verbatim}
+%\author{Kiss István\\matematika BSc
+% \collaborator
+% Nagy János\\matematika BSc}
+%\supervisor{Dr. Szabó Gábor\\egyetemi docens
+% \collaborator[Külső konzulens]
+% Dr. Takács Tamás\\adjunktus\\ELTE}
+%\end{Verbatim}
+% \end{macro}
+%
% \begin{macro}{\city}\param{\marg{város}}
% Ezzel kell megadni annak a városnak a nevét, ahol az intézmény található.
% \end{macro}
@@ -177,7 +223,7 @@
%
% \subsection{A dokumentumosztály opciói}
%
-% A |twoside|, |colorlinks| és |tocnopagenum| opciókról már volt szó. További opciók:
+% A |twoside|, |colorlinks|, |tocnopagenum|, |reverseorder|, |times| és |upint| opciókról már volt szó. További opciók:
%
% \medskip
% \begin{macro}{centeredchapter}\param{\texttt{=false}}
@@ -188,8 +234,20 @@
% A dokumentumosztály figyelmeztetéseinek kikapcsolása.
% \end{macro}
%
+% \begin{macro}{10pt}
+% Az alapbetűméret 10\,pt.
+% \end{macro}
+%
+% \begin{macro}{11pt}
+% Az alapbetűméret 11\,pt.
+% \end{macro}
+%
+% \begin{macro}{12pt}
+% Az alapbetűméret 12\,pt (alapopció).
+% \end{macro}
+%
% \begin{macro}{fontsize}\param{\texttt{=}\meta{betűméret}}
-% A \meta{betűméret} lehetséges értékei |10pt|, |11pt| és |12pt| (alapérték |12pt|). Ez adja meg az alapbetűméretet.
+% A \meta{betűméret} adja meg az alapbetűméretet, amely bármilyen méret lehet. Ha a \meta{betűméret} különbözik a |10pt|, |11pt| és |12pt| értékektől, akkor ez az opció a beállításhoz betölti a |fontsize| csomagot. Ennek az opciónak a használata felülbírálja a |10pt|, |11pt| és |12pt| opciókat.
% \end{macro}
%
% \begin{macro}{logodown}
@@ -197,7 +255,7 @@
% \end{macro}
%
% \begin{macro}{logofont}\param{\texttt{=}\meta{betűtípus}}
-% Ha a logó helyén szöveg van -- lásd a |\logo| parancsot --, akkor annak a betűtípusa (alapérték |\large\scshape|).
+% Ha a logó helyén szöveg van (lásd a |\logo| parancsot), akkor annak a betűtípusa (alapérték |\large\scshape|).
% \end{macro}
%
% \begin{macro}{logosep}\param{\texttt{=}\meta{méret}}
@@ -217,7 +275,7 @@
% \end{macro}
%
% \begin{macro}{titlesep}\param{\texttt{=}\meta{méret}}
-% A cím feletti térköz mérete |\stretch{1}|. Ezzel a cím alatti térközt lehet beállítani a normál sortávolságon felül (alapérték |\stretch{1.5}|).
+% A cím feletti térköz mérete |\stretch{1}|. Ezzel a cím alatti térközt lehet beállítani a normál sortávolságon felül (alapérték |\stretch{1.4}|).
% \end{macro}
%
% \begin{macro}{captionfont}\param{\texttt{=}\meta{betűtípus}}
@@ -225,7 +283,11 @@
% \end{macro}
%
% \begin{macro}{captionsep}\param{\texttt{=}\meta{méret}}
-% Az előbbi feliratok alatti térköz a normál sortávolságon felül (alapérték |0mm|).
+% Az előbbi feliratok alatti térköz a normál sortávolságon felül, amennyiben nem használja a |\collaborator| parancsot több szerző vagy témavezető megadásához (alapérték |0mm|).
+% \end{macro}
+%
+% \begin{macro}{collcaptionsep}\param{\texttt{=}\meta{méret}}
+% Az előbbi feliratok alatti térköz a normál sortávolságon felül, amennyiben használja az |\collaborator| parancsot több szerző vagy témavezető megadásához (alapérték |2mm|). Ahol az |collcaptionsep| értékét fel kell használni, ott még nem lehet tudni, hogy lesz-e |\collaborator| kifejtve. Ezért ennek érzékeléséhez kereszthivatkozást alkalmaz a kód, így csak a második fordításnál alakulnak ki a helyes térközök. Mivel például a tartalomjegyzék miatt úgyis többször kell fordítani, ezért ez nem okoz gondot. Ha |latexmk|-val vagy valamilyen hasonló programmal fordít, akkor természetesen azt csak egyszer kell futtatni.
% \end{macro}
%
% \begin{macro}{authorfont}\param{\texttt{=}\meta{betűtípus}}
@@ -241,11 +303,15 @@
% \end{macro}
%
% \begin{macro}{authorxmargin}\param{\texttt{=}\meta{méret}}
-% Ezzel a szerzőnél és a témavezetőnél egy extra margóméret adható meg, azaz a normál margó ennyivel nő (alapérték |10mm|).
+% Ezzel a szerző és témavezető dobozának sorában a normál margóméret ennyivel nő meg (alapérték |10mm|).
% \end{macro}
%
% \begin{macro}{authorsep}\param{\texttt{=}\meta{méret}}
-% A szerző illetve témavezető alatti térköz a normál sortávolságon felül (alapérték |15mm|).
+% A szerző és témavezető dobozait tartalmazó sor alatti térköz a normál sortávolságon felül (alapérték |15mm|).
+% \end{macro}
+%
+% \begin{macro}{hminsep}\param{\texttt{=}\meta{méret}}
+% A szerző és témavezető dobozai közötti minimális vízszintes térköz (alapérték |5mm|).
% \end{macro}
%
% \begin{macro}{cityfont}\param{\texttt{=}\meta{betűtípus}}
@@ -263,7 +329,7 @@
% \subsection{Parancsok}
%
% \begin{macro}{\setkeys}\param{\texttt{\{thesis-ekf\}}\marg{opciók}}
-% A \texttt{thesis-ekf} opciói a |fontsize| kivételével, ezzel is beállíthatók. Például |\setkeys{thesis-ekf}{logodown,tocnopagenum}|. Ha a |\setkeys| parancsot a konfigurációs fájlba írja (lásd később), akkor abba a |fontsize| opció is beírható. Azok az opciók, melyekben parancs van, mint például a betűtípusra vonatkozók, csak a |\setkeys| parancsba írhatók!
+% A \texttt{thesis-ekf} opciói az alapbetűméretet beállító (|10pt|, |11pt|, |12pt|, |fontsize=|\meta{méret}) opciók kivételével ezzel is beállíthatók. Ha a |\setkeys| parancsot a konfigurációs fájlba írja (lásd később), akkor abba az alapbetűméretet beállító opciók is beírhatók. Azok az opciók, melyekben parancs van, mint például a betűtípusra vonatkozók, csak a |\setkeys| parancsba írhatók! Például |\setkeys{thesis-ekf}{logodown,tocnopagenum}|.
% \end{macro}
%
% \begin{macro}{\hypersetup}\param{\marg{hyperref opciók}}
@@ -305,7 +371,11 @@
% A következőket írja be a \texttt{thesis-ekf.cfg} fájlba, majd tegye a \texttt{tex} forrásfájl mellé.
%
%\begin{Verbatim}
-%\setkeys{thesis-ekf}{fontsize=11pt,centeredchapter=false,titlefont=\Huge\sffamily}
+%\setkeys{thesis-ekf}{
+% 11pt,
+% centeredchapter=false,
+% titlefont=\Huge\sffamily
+%}
%\AtEndOfClass{
% \hypersetup{allcolors=red}
% \geometry{b5paper,top=20mm,bottom=20mm,inner=25mm,outer=20mm}
@@ -316,23 +386,29 @@
%
% \StopEventually{}
% \begin{macrocode}
-\@ifundefined{pdffontattr}{}{\ifnum\pdfoutput>0\RequirePackage{cmap}\fi}
-\RequirePackage{lmodern,fixcmex,kvoptions,etoolbox,ifpdf,setspace,graphicx}
-
+\RequirePackage{kvoptions}
\SetupKeyvalOptions{family=thesis-ekf,prefix=thesisekf@}
\DeclareVoidOption{twoside}{\PassOptionsToClass{twoside}{report}}
\DeclareVoidOption{colorlinks}{\PassOptionsToPackage{colorlinks}{hyperref}}
+\DeclareBoolOption{times}
+\DeclareBoolOption{upint}
\DeclareBoolOption{logodown}
\DeclareBoolOption{tocnopagenum}
+\DeclareBoolOption{reverseorder}
\DeclareBoolOption[true]{centeredchapter}
\DeclareBoolOption[true]{warning}
-\DeclareStringOption[12pt]{fontsize}
+\DeclareVoidOption{10pt}{\def\thesisekf@fontsize@{10pt}}
+\DeclareVoidOption{11pt}{\def\thesisekf@fontsize@{11pt}}
+\DeclareVoidOption{12pt}{\def\thesisekf@fontsize@{12pt}}
+\DeclareStringOption{fontsize}
\DeclareStringOption[10mm]{institutesep}
\DeclareStringOption[0mm]{logosep}
-\DeclareStringOption[\stretch{1.5}]{titlesep}
+\DeclareStringOption[\stretch{1.4}]{titlesep}
\DeclareStringOption[15mm]{authorsep}
+\DeclareStringOption[5mm]{hminsep}
\DeclareStringOption[10mm]{authorxmargin}
\DeclareStringOption[0mm]{captionsep}
+\DeclareStringOption[2mm]{collcaptionsep}
\DeclareStringOption[left]{authoralign}
\DeclareStringOption[left]{supervisoralign}
\DeclareStringOption[\large\scshape]{institutefont}
@@ -343,6 +419,7 @@
\DeclareStringOption[\large\scshape]{cityfont}
\DeclareStringOption[\large\scshape]{datefont}
\DeclareStringOption[,~]{datesep}
+\def\thesisekf@fontsize@{12pt}
\ProcessKeyvalOptions{thesis-ekf}
\InputIfFileExists{thesis-ekf.cfg}{}{}
@@ -350,226 +427,427 @@
\def\thesisekf@ten{10pt}
\def\thesisekf@eleven{11pt}
\def\thesisekf@twelve{12pt}
+\ifx\thesisekf@fontsize\thesisekf@ten
+ \def\thesisekf@fontsize@{10pt}
+\fi
+\ifx\thesisekf@fontsize\thesisekf@eleven
+ \def\thesisekf@fontsize@{11pt}
+\fi
+\ifx\thesisekf@fontsize\thesisekf@twelve
+ \def\thesisekf@fontsize@{12pt}
+\fi
-\ifx\thesisekf@fontsize\thesisekf@ten\else
-\ifx\thesisekf@fontsize\thesisekf@eleven\else
-\ifx\thesisekf@fontsize\thesisekf@twelve\else
-\ClassWarning{thesis-ekf}{Unused option: fontsize=\thesisekf@fontsize. Use fontsize=10pt, fontsize=11pt or fontsize=12pt!}
-\def\thesisekf@fontsize{12pt}
-\fi\fi\fi
-
-\PassOptionsToClass{\thesisekf@fontsize}{report}
-\LoadClass{report}
-
+\LoadClass[\thesisekf@fontsize@]{report}
+\RequirePackage{iftex}
+\ifpdf
+ \RequirePackage{cmap}
+\fi
+\RequirePackage{setspace}
\RequirePackage[unicode,linktocpage,allcolors=blue,pdfstartview=FitH,bookmarksnumbered,pdfborder={0 0 0}]{hyperref}
\RequirePackage[a4paper,top=25mm,bottom=25mm,inner=30mm,outer=25mm]{geometry}
+\ifthesisekf@times
+ \ifthesisekf@upint
+ \PassOptionsToPackage{upint}{newtxmath}
+ \PassOptionsToPackage{intlimits}{amsmath}
+ \fi
+\else
+ \RequirePackage{lmodern,fixcmex}
+ \ifthesisekf@upint
+ \RequirePackage{cmupint}
+ \fi
+\fi
+\RequirePackage{etoolbox,graphicx}
\onehalfspacing
-\AtEndPreamble{\RequirePackage{upquote}}
+\AtEndPreamble{
+\ifthesisekf@times
+ \RequirePackage{newtxtext,newtxmath}
+\fi
+\ifx\thesisekf@fontsize\@empty
+\else
+ \ifx\thesisekf@fontsize\thesisekf@ten
+ \else
+ \ifx\thesisekf@fontsize\thesisekf@eleven
+ \else
+ \ifx\thesisekf@fontsize\thesisekf@twelve
+ \else
+ \RequirePackage[fontsize=\thesisekf@fontsize]{fontsize}
+ \fi
+ \fi
+ \fi
+\fi
+\RequirePackage{upquote}
+}
\AfterEndPreamble{
\ifthesisekf@tocnopagenum
- \hypersetup{pageanchor=false}
- \let\thesisekf@tableofcontents\tableofcontents
- \def\tableofcontents{%
- \global\let\thesisekf@thepage\thepage%
- \global\let\thepage\empty%
- \thesisekf@tableofcontents%
- \clearpage%
- \global\c@page\@ne%
- \global\let\thepage\thesisekf@thepage%
- \hypersetup{pageanchor}}
+ \hypersetup{pageanchor=false}
+ \let\thesisekf@tableofcontents\tableofcontents
+ \def\tableofcontents{%
+ \global\let\thesisekf@thepage\thepage%
+ \global\let\thepage\empty%
+ \thesisekf@tableofcontents%
+ \clearpage%
+ \global\c@page\@ne%
+ \global\let\thepage\thesisekf@thepage%
+ \hypersetup{pageanchor}}
\fi
\ifthesisekf@centeredchapter
- \let\thesisekf@makechapterhead\@makechapterhead
- \let\thesisekf@makeschapterhead\@makeschapterhead
- \let\thesisekf@raggedright\raggedright
- \def\@makechapterhead#1{
- \let\raggedright\centering
- \thesisekf@makechapterhead{#1}
- \let\raggedright\thesisekf@raggedright}
- \def\@makeschapterhead#1{
- \let\raggedright\centering
- \thesisekf@makeschapterhead{#1}
- \let\raggedright\thesisekf@raggedright}
+ \let\thesisekf@makechapterhead\@makechapterhead
+ \let\thesisekf@makeschapterhead\@makeschapterhead
+ \let\thesisekf@raggedright\raggedright
+ \def\@makechapterhead#1{
+ \let\raggedright\centering
+ \thesisekf@makechapterhead{#1}
+ \let\raggedright\thesisekf@raggedright}
+ \def\@makeschapterhead#1{
+ \let\raggedright\centering
+ \thesisekf@makeschapterhead{#1}
+ \let\raggedright\thesisekf@raggedright}
\fi
\def\@dottedtocline#1#2#3#4#5{%
- \ifnum #1>\c@tocdepth \else
- \vskip \z@ \@plus.2\p@
- {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
- \parindent #2\relax\@afterindenttrue
- \interlinepenalty\@M
- \leavevmode
- \@tempdima #3\relax
- \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
- {#4}\nobreak
- \leaders\hbox{$\m@th
- \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
- mu$}\hfill
- \nobreak
- \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}%
- \par}%
- \fi}
+ \ifnum #1>\c@tocdepth \else
+ \vskip \z@ \@plus.2\p@
+ {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
+ \parindent #2\relax\@afterindenttrue
+ \interlinepenalty\@M
+ \leavevmode
+ \@tempdima #3\relax
+ \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
+ {#4}\nobreak
+ \leaders\hbox{$\m@th
+ \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
+ mu$}\hfill
+ \nobreak
+ \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}%
+ \par}%
+ \fi}
\renewcommand*\l@chapter[2]{%
- \ifnum \c@tocdepth >\z@
- \addpenalty\@secpenalty
- \addvspace{1.0em \@plus\p@}%
- \setlength\@tempdima{1.8em}%
- \begingroup
- \parindent \z@ \rightskip \@pnumwidth
- \parfillskip -\@pnumwidth
- \leavevmode \bfseries
- \advance\leftskip\@tempdima
- \hskip -\leftskip
- #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
- \endgroup
- \fi}
+ \ifnum \c@tocdepth >\z@
+ \addpenalty\@secpenalty
+ \addvspace{1.0em \@plus\p@}%
+ \setlength\@tempdima{1.8em}%
+ \begingroup
+ \parindent \z@ \rightskip \@pnumwidth
+ \parfillskip -\@pnumwidth
+ \leavevmode \bfseries
+ \advance\leftskip\@tempdima
+ \hskip -\leftskip
+ #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
+ \endgroup
+ \fi}
\renewcommand*\l@section{\@dottedtocline{1}{1.8em}{2.5em}}
\renewcommand*\l@subsection{\@dottedtocline{2}{4.3em}{3.2em}}
\if@thesisekf@nochanged@authorcaption@%
\@ifundefined{l@magyar}{}{%
- \iflanguage{magyar}{\gdef\thesisekf@authorcaption{K\'{e}sz\'{\i}tette}}{}}%
+ \iflanguage{magyar}{\gdef\thesisekf@authorcaption{K\'{e}sz\'{\i}tette}}{}}%
\@ifundefined{l@ngerman}{}{%
- \iflanguage{ngerman}{\gdef\thesisekf@authorcaption{Autor}}{}}%
+ \iflanguage{ngerman}{\gdef\thesisekf@authorcaption{Autor}}{}}%
\@ifundefined{l@german}{}{%
- \iflanguage{german}{\gdef\thesisekf@authorcaption{Autor}}{}}\fi
+ \iflanguage{german}{\gdef\thesisekf@authorcaption{Autor}}{}}%
+\fi
\if@thesisekf@nochanged@supervisorcaption@%
\@ifundefined{l@magyar}{}{%
- \iflanguage{magyar}{\gdef\thesisekf@supervisorcaption{T\'{e}mavezet\H{o}}}{}}%
+ \iflanguage{magyar}{\gdef\thesisekf@supervisorcaption{T\'{e}mavezet\H{o}}}{}}%
\@ifundefined{l@ngerman}{}{%
- \iflanguage{ngerman}{\gdef\thesisekf@supervisorcaption{Betreuer}}{}}%
+ \iflanguage{ngerman}{\gdef\thesisekf@supervisorcaption{Betreuer}}{}}%
\@ifundefined{l@german}{}{%
- \iflanguage{german}{\gdef\thesisekf@supervisorcaption{Betreuer}}{}}\fi
+ \iflanguage{german}{\gdef\thesisekf@supervisorcaption{Betreuer}}{}}%
+\fi
\if@thesisekf@nochanged@logo@%
\@ifundefined{l@magyar}{}{%
- \iflanguage{magyar}{\if@thesisekf@exists@logo@hu@\gdef\thesisekf@logo{\includegraphics{eszterhazy-logo-hu}}\fi}{}}%
+ \iflanguage{magyar}{\if@thesisekf@exists@logo@hu@\gdef\thesisekf@logo{\includegraphics{eszterhazy-logo-hu}}\fi}{}}%
\@ifundefined{l@ngerman}{}{%
- \iflanguage{ngerman}{\if@thesisekf@exists@logo@de@\gdef\thesisekf@logo{\includegraphics{eszterhazy-logo-de}}\fi}{}}%
+ \iflanguage{ngerman}{\if@thesisekf@exists@logo@de@\gdef\thesisekf@logo{\includegraphics{eszterhazy-logo-de}}\fi}{}}%
\@ifundefined{l@german}{}{%
- \iflanguage{german}{\if@thesisekf@exists@logo@de@\gdef\thesisekf@logo{\includegraphics{eszterhazy-logo-de}}\fi}{}}\fi
+ \iflanguage{german}{\if@thesisekf@exists@logo@de@\gdef\thesisekf@logo{\includegraphics{eszterhazy-logo-de}}\fi}{}}%
+\fi
}
-\newif\if@thesisekf@nochanged@logo@\@thesisekf@nochanged@logo@true
+\newif\if@thesisekf@nochanged@logo@
+\@thesisekf@nochanged@logo@true
\def\logo#1{\@thesisekf@nochanged@logo@false\gdef\thesisekf@logo{#1}}
\def\thesisekf@logo{}
\newif\if@thesisekf@exists@logo@en@
-\ifpdf\IfFileExists{eszterhazy-logo-en.pdf}{\@thesisekf@exists@logo@en@true}{}
- \else\IfFileExists{eszterhazy-logo-en.eps}{\@thesisekf@exists@logo@en@true}{}\fi
+\ifpdf
+ \IfFileExists{eszterhazy-logo-en.pdf}{\@thesisekf@exists@logo@en@true}{}
+\else
+ \IfFileExists{eszterhazy-logo-en.eps}{\@thesisekf@exists@logo@en@true}{}
+\fi
\newif\if@thesisekf@exists@logo@hu@
-\ifpdf\IfFileExists{eszterhazy-logo-hu.pdf}{\@thesisekf@exists@logo@hu@true}{}
- \else\IfFileExists{eszterhazy-logo-hu.eps}{\@thesisekf@exists@logo@hu@true}{}\fi
+\ifpdf
+ \IfFileExists{eszterhazy-logo-hu.pdf}{\@thesisekf@exists@logo@hu@true}{}
+\else
+ \IfFileExists{eszterhazy-logo-hu.eps}{\@thesisekf@exists@logo@hu@true}{}
+\fi
\newif\if@thesisekf@exists@logo@de@
-\ifpdf\IfFileExists{eszterhazy-logo-de.pdf}{\@thesisekf@exists@logo@de@true}{}
- \else\IfFileExists{eszterhazy-logo-de.eps}{\@thesisekf@exists@logo@de@true}{}\fi
-\if@thesisekf@exists@logo@en@\def\thesisekf@logo{\includegraphics{eszterhazy-logo-en}}\fi
-\def\thesisekf@logo@{\thesisekf@logo%
- \ifx\thesisekf@logo\@empty\ifthesisekf@warning\ClassWarning{thesis-ekf}{There isn't logo!}\fi\fi}
+\ifpdf
+ \IfFileExists{eszterhazy-logo-de.pdf}{\@thesisekf@exists@logo@de@true}{}
+\else
+ \IfFileExists{eszterhazy-logo-de.eps}{\@thesisekf@exists@logo@de@true}{}
+\fi
+\if@thesisekf@exists@logo@en@
+ \def\thesisekf@logo{\includegraphics{eszterhazy-logo-en}}
+\fi
+\def\thesisekf@logo@{%
+ \thesisekf@logo%
+ \ifx\thesisekf@logo\@empty%
+ \ifthesisekf@warning%
+ \ClassWarning{thesis-ekf}{logo is missing}%
+ \fi%
+ \fi}
\def\institute#1{\gdef\thesisekf@institute{#1}}
\institute{}
-\def\thesisekf@institute@{\thesisekf@institute%
- \ifx\thesisekf@institute\@empty\ifthesisekf@warning\ClassWarning{thesis-ekf}{There isn't institute!}\fi\fi}
+\def\thesisekf@institute@{%
+ \thesisekf@institute%
+ \ifx\thesisekf@institute\@empty%
+ \ifthesisekf@warning%
+ \ClassWarning{thesis-ekf}{institute is missing}%
+ \fi%
+ \fi}
\def\title#1{\gdef\thesisekf@title{#1}}
\title{}
-\def\thesisekf@title@{\thesisekf@title%
- \ifx\thesisekf@title\@empty\ifthesisekf@warning\ClassWarning{thesis-ekf}{There isn't title!}\fi\fi}
+\def\thesisekf@title@{%
+ \thesisekf@title%
+ \ifx\thesisekf@title\@empty%
+ \ifthesisekf@warning%
+ \ClassWarning{thesis-ekf}{title is missing}%
+ \fi%
+ \fi}
\def\author#1{\gdef\thesisekf@author{#1}}
\author{}
-\def\thesisekf@author@{\thesisekf@author%
- \ifx\thesisekf@author\@empty\ifthesisekf@warning\ClassWarning{thesis-ekf}{There isn't author!}\fi\fi}
+\def\thesisekf@author@{%
+ \ifx\thesisekf@authorcaption\@empty%
+ \else%
+ \ifx\thesisekf@author\@empty%
+ \ifthesisekf@warning%
+ \ClassWarning{thesis-ekf}{author is missing}%
+ \fi%
+ \else%
+ \thesisekf@author%
+ \fi%
+ \fi}
-\newif\if@thesisekf@nochanged@authorcaption@\@thesisekf@nochanged@authorcaption@true
-\def\authorcaption#1{\@thesisekf@nochanged@authorcaption@false\gdef\thesisekf@authorcaption{#1}}
+\newif\if@thesisekf@nochanged@authorcaption@
+\@thesisekf@nochanged@authorcaption@true
+\def\authorcaption#1{%
+ \@thesisekf@nochanged@authorcaption@false%
+ \gdef\thesisekf@authorcaption{#1}}
\def\thesisekf@authorcaption{Author}
\def\thesisekf@authorcaption@{%
- \ifx\thesisekf@author\@empty\else
- \ifx\thesisekf@authorcaption\@empty\ifthesisekf@warning\ClassWarning{thesis-ekf}{There isn't authorcaption!}\fi
- \else\thesisekf@authorcaption\fi\fi}
+ \ifx\thesisekf@author\@empty%
+ \else%
+ \ifx\thesisekf@authorcaption\@empty%
+ \ifthesisekf@warning%
+ \ClassWarning{thesis-ekf}{authorcaption is missing}%
+ \fi%
+ \else%
+ \thesisekf@authorcaption%
+ \fi%
+ \fi}
\def\supervisor#1{\gdef\thesisekf@supervisor{#1}}
\supervisor{}
-\def\thesisekf@supervisor@{\thesisekf@supervisor%
- \ifx\thesisekf@supervisor\@empty\ifthesisekf@warning\ClassWarning{thesis-ekf}{There isn't supervisor!}\fi\fi}
+\def\thesisekf@supervisor@{%
+ \ifx\thesisekf@supervisorcaption\@empty
+ \else
+ \ifx\thesisekf@supervisor\@empty
+ \ifthesisekf@warning
+ \ClassWarning{thesis-ekf}{supervisor is missing}
+ \fi
+ \else
+ \thesisekf@supervisor
+ \fi
+ \fi}
-\newif\if@thesisekf@nochanged@supervisorcaption@\@thesisekf@nochanged@supervisorcaption@true
-\def\supervisorcaption#1{\@thesisekf@nochanged@supervisorcaption@false\gdef\thesisekf@supervisorcaption{#1}}
+\newif\if@thesisekf@nochanged@supervisorcaption@
+\@thesisekf@nochanged@supervisorcaption@true
+\def\supervisorcaption#1{%
+ \@thesisekf@nochanged@supervisorcaption@false%
+ \gdef\thesisekf@supervisorcaption{#1}}
\def\thesisekf@supervisorcaption{Supervisor}
\def\thesisekf@supervisorcaption@{%
- \ifx\thesisekf@supervisor\@empty\else
- \ifx\thesisekf@supervisorcaption\@empty\ifthesisekf@warning\ClassWarning{thesis-ekf}{There isn't supervisorcaption!}\fi
- \else\thesisekf@supervisorcaption\fi\fi}
+ \ifx\thesisekf@supervisor\@empty%
+ \else%
+ \ifx\thesisekf@supervisorcaption\@empty%
+ \ifthesisekf@warning%
+ \ClassWarning{thesis-ekf}{supervisorcaption is missing}%
+ \fi%
+ \else%
+ \thesisekf@supervisorcaption%
+ \fi%
+ \fi}
\def\city#1{\gdef\thesisekf@city{#1}}
\city{}
-\def\thesisekf@city@{\thesisekf@city%
- \ifx\thesisekf@city\@empty\ifthesisekf@warning\ClassWarning{thesis-ekf}{There isn't city!}\fi\fi}
+\def\thesisekf@city@{%
+ \thesisekf@city%
+ \ifx\thesisekf@city\@empty%
+ \ifthesisekf@warning%
+ \ClassWarning{thesis-ekf}{city is missing}%
+ \fi%
+ \fi}
\def\date#1{\gdef\thesisekf@date{#1}}
\date{\number\year}
-\def\thesisekf@date@{\thesisekf@date%
- \ifx\thesisekf@date\@empty\ifthesisekf@warning\ClassWarning{thesis-ekf}{There isn't date!}\fi\fi}
+\def\thesisekf@date@{%
+ \thesisekf@date%
+ \ifx\thesisekf@date\@empty%
+ \ifthesisekf@warning%
+ \ClassWarning{thesis-ekf}{date is missing}%
+ \fi%
+ \fi}
+
+\def\thesisekf@datesep@{%
+ \ifx\thesisekf@city\@empty
+ \else
+ \ifx\thesisekf@date\@empty
+ \else
+ \thesisekf@datesep
+ \fi
+ \fi}
+
+\def\thesisekf@box@logo{%
+ \ifthesisekf@logodown%
+ {\normalfont\normalsize\thesisekf@institutefont\thesisekf@institute@%
+ \ifx\thesisekf@institute\@empty%
+ \else%
+ \\%
+ \ifx\thesisekf@logo\@empty%
+ \else%
+ \vspace{\thesisekf@institutesep}%
+ \fi%
+ \fi}%
+ {\normalfont\normalsize\thesisekf@logofont\thesisekf@logo@%
+ \ifx\thesisekf@logo\@empty%
+ \else%
+ \\%
+ \fi}%
+ \else%
+ {\normalfont\normalsize\thesisekf@logofont\thesisekf@logo@%
+ \ifx\thesisekf@logo\@empty%
+ \else%
+ \\%
+ \ifx\thesisekf@institute\@empty%
+ \else%
+ \vspace{\thesisekf@logosep}%
+ \fi%
+ \fi}%
+ {\normalfont\normalsize\thesisekf@institutefont\thesisekf@institute@%
+ \ifx\thesisekf@institute\@empty%
+ \else%
+ \\%
+ \fi}%
+ \fi%
+ \vspace*{\fill}}
+
+\def\thesisekf@box@title{%
+ {\normalfont\normalsize\thesisekf@titlefont\thesisekf@title@%
+ \ifx\thesisekf@title\@empty%
+ \else%
+ \par\vspace{\thesisekf@titlesep}%
+ \fi}}
+
+\def\thesisekf@align@center{center}
+\def\thesisekf@align@left{left}
+\def\thesisekf@align@right{right}
+
+\def\thesisekf@box@author{%
+ {\normalfont\normalsize\thesisekf@authorfont%
+ \ifx\thesisekf@authoralign\thesisekf@align@center%
+ \begin{tabular}[t]{@{}c@{}}%
+ \fi%
+ \ifx\thesisekf@authoralign\thesisekf@align@left%
+ \begin{tabular}[t]{@{}l@{}}%
+ \fi%
+ \ifx\thesisekf@authoralign\thesisekf@align@right%
+ \begin{tabular}[t]{@{}r@{}}%
+ \fi%
+ {\normalfont\normalsize\thesisekf@captionfont\thesisekf@authorcaption@}\\[\thesisekf@captionsep]%
+ \thesisekf@author@%
+ \end{tabular}}}
+
+\def\thesisekf@box@supervisor{%
+ {\normalfont\normalsize\thesisekf@authorfont%
+ \ifx\thesisekf@supervisoralign\thesisekf@align@center%
+ \begin{tabular}[t]{@{}c@{}}%
+ \fi%
+ \ifx\thesisekf@supervisoralign\thesisekf@align@left%
+ \begin{tabular}[t]{@{}l@{}}%
+ \fi%
+ \ifx\thesisekf@supervisoralign\thesisekf@align@right%
+ \begin{tabular}[t]{@{}r@{}}%
+ \fi%
+ {\normalfont\normalsize\thesisekf@captionfont\thesisekf@supervisorcaption@}\\[\thesisekf@captionsep]%
+ \thesisekf@supervisor@%
+ \end{tabular}}}
-\def\thesisekf@datesep@{\ifx\thesisekf@city\@empty\else\ifx\thesisekf@date\@empty\else\thesisekf@datesep\fi\fi}
+\def\thesisekf@box@author@supervisor@{%
+ \hbox{}\nobreak\hspace*{\thesisekf@authorxmargin}%
+ \ifthesisekf@reverseorder%
+ \thesisekf@box@supervisor%
+ \nobreak\hspace{\thesisekf@hminsep}\hfill%
+ \thesisekf@box@author%
+ \else%
+ \thesisekf@box@author%
+ \nobreak\hspace{\thesisekf@hminsep}\hfill%
+ \thesisekf@box@supervisor%
+ \fi%
+ \nobreak\hspace{\thesisekf@authorxmargin}\hbox{}%
+ \par\vspace{\thesisekf@authorsep}}
-\newif\if@thesisekf@noempty@author@supervisor@\@thesisekf@noempty@author@supervisor@true
+\def\thesisekf@box@author@supervisor{%
+ \if\getrefnumber{@thesisekf@collaborator@}%
+ \gdef\thesisekf@captionsep{\thesisekf@collcaptionsep}%
+ \fi%
+ \thesisekf@box@author@supervisor@%
+ \gdef\@currentlabel{10}%
+ \if@thesisekf@collaborator@%
+ \gdef\@currentlabel{11}%
+ \fi%
+ \label{@thesisekf@collaborator@}}
+
+\def\thesisekf@box@city@date{%
+ {\normalfont\normalsize\thesisekf@cityfont\thesisekf@city@\thesisekf@datesep@}%
+ {\normalfont\normalsize\thesisekf@datefont\thesisekf@date@}}
+
+\newif\if@thesisekf@collaborator@
+
+\newcommand{\collaborator}[1][]{%
+ \global\@thesisekf@collaborator@true%
+ \\[\thesisekf@captionsep]
+ \def\thesisekf@temp{#1}%
+ \ifx\thesisekf@temp\@empty%
+ \else%
+ {\normalfont\normalsize\thesisekf@captionfont#1}\\[\thesisekf@captionsep]%
+ \fi}
\def\maketitle{
-\thispagestyle{empty}
-{\centering
-\ifthesisekf@logodown
- {\normalfont\normalsize\thesisekf@institutefont\thesisekf@institute@%
- \ifx\thesisekf@institute\@empty\else\\
- \ifx\thesisekf@logo\@empty\else\vspace{\thesisekf@institutesep}\fi\fi}
- {\normalfont\normalsize\thesisekf@logofont\thesisekf@logo@%
- \ifx\thesisekf@logo\@empty\else\\\fi}
-\else
- {\normalfont\normalsize\thesisekf@logofont\thesisekf@logo@%
- \ifx\thesisekf@logo\@empty\else\\
- \ifx\thesisekf@institute\@empty\else\vspace{\thesisekf@logosep}\fi\fi}
- {\normalfont\normalsize\thesisekf@institutefont\thesisekf@institute@%
- \ifx\thesisekf@institute\@empty\else\\\fi}
-\fi
-\vspace*{\fill}
-{\normalfont\normalsize\thesisekf@titlefont\thesisekf@title@%
-\ifx\thesisekf@title\@empty\else\\\vspace{\thesisekf@titlesep}\fi}
-\ifx\thesisekf@supervisor\@empty\ifx\thesisekf@author\@empty\@thesisekf@noempty@author@supervisor@false\fi\fi
-\if@thesisekf@noempty@author@supervisor@
-{\normalfont\normalsize\thesisekf@authorfont
-\def\thesisekf@align@center{center}%
-\def\thesisekf@align@left{left}%
-\def\thesisekf@align@right{right}%
-\ifx\thesisekf@authoralign\thesisekf@align@center\begin{tabular}[t]{@{\hspace{\thesisekf@authorxmargin}}c@{}}\fi
-\ifx\thesisekf@authoralign\thesisekf@align@left\begin{tabular}[t]{@{\hspace{\thesisekf@authorxmargin}}l@{}}\fi
-\ifx\thesisekf@authoralign\thesisekf@align@right\begin{tabular}[t]{@{\hspace{\thesisekf@authorxmargin}}r@{}}\fi
-{\normalfont\normalsize\thesisekf@captionfont\thesisekf@authorcaption@}\\[\thesisekf@captionsep]
-\thesisekf@author@
-\end{tabular}
-\hfill
-\ifx\thesisekf@supervisoralign\thesisekf@align@center\begin{tabular}[t]{@{}c@{\hspace{\thesisekf@authorxmargin}}}\fi
-\ifx\thesisekf@supervisoralign\thesisekf@align@left\begin{tabular}[t]{@{}l@{\hspace{\thesisekf@authorxmargin}}}\fi
-\ifx\thesisekf@supervisoralign\thesisekf@align@right\begin{tabular}[t]{@{}r@{\hspace{\thesisekf@authorxmargin}}}\fi
-{\normalfont\normalsize\thesisekf@captionfont\thesisekf@supervisorcaption@}\\[\thesisekf@captionsep]
-\thesisekf@supervisor@
-\end{tabular}
-\\\vspace{\thesisekf@authorsep}}
-\fi
-{\normalfont\normalsize\thesisekf@cityfont\thesisekf@city@\thesisekf@datesep@}%
-{\normalfont\normalsize\thesisekf@datefont\thesisekf@date@}
-\par
-}
-\newpage
-\if@twoside\thispagestyle{empty}\hbox{}\newpage\fi}
+ \thispagestyle{empty}
+ {\centering
+ \thesisekf@box@logo%
+ \thesisekf@box@title%
+ \thesisekf@box@author@supervisor%
+ \thesisekf@box@city@date%
+ \par}
+ \newpage
+ \if@twoside
+ \thispagestyle{empty}
+ \hbox{}
+ \newpage
+ \fi}
% \end{macrocode}
% \Finale
diff --git a/Master/texmf-dist/source/latex/thmtools/aliasctr.dtx b/Master/texmf-dist/source/latex/thmtools/aliasctr.dtx
index b492f95f560..3c75e11c98e 100644
--- a/Master/texmf-dist/source/latex/thmtools/aliasctr.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/aliasctr.dtx
@@ -1,10 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2005-7 by Ulrich M. Schwarz
+% Copyright (C) 2005-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a. The full license text
-% is available from http://www.latex-project.org/
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
%<*code>
% \fi
diff --git a/Master/texmf-dist/source/latex/thmtools/parseargs.dtx b/Master/texmf-dist/source/latex/thmtools/parseargs.dtx
index 8f4aa421710..4efcd3ecd9f 100644
--- a/Master/texmf-dist/source/latex/thmtools/parseargs.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/parseargs.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
% \fi
%
diff --git a/Master/texmf-dist/source/latex/thmtools/thm-amsthm.dtx b/Master/texmf-dist/source/latex/thmtools/thm-amsthm.dtx
index 31a2397f478..b45a6c276ef 100644
--- a/Master/texmf-dist/source/latex/thmtools/thm-amsthm.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/thm-amsthm.dtx
@@ -1,7 +1,14 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
diff --git a/Master/texmf-dist/source/latex/thmtools/thm-autoref.dtx b/Master/texmf-dist/source/latex/thmtools/thm-autoref.dtx
index 90a164f1afb..cf84463c098 100644
--- a/Master/texmf-dist/source/latex/thmtools/thm-autoref.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/thm-autoref.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
% \fi
%
diff --git a/Master/texmf-dist/source/latex/thmtools/thm-beamer.dtx b/Master/texmf-dist/source/latex/thmtools/thm-beamer.dtx
index 7c56099ce69..44319480c79 100644
--- a/Master/texmf-dist/source/latex/thmtools/thm-beamer.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/thm-beamer.dtx
@@ -1,7 +1,14 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
diff --git a/Master/texmf-dist/source/latex/thmtools/thm-kv.dtx b/Master/texmf-dist/source/latex/thmtools/thm-kv.dtx
index 4a31a518852..78591262743 100644
--- a/Master/texmf-dist/source/latex/thmtools/thm-kv.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/thm-kv.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
% \fi
%
@@ -208,25 +210,47 @@
}
\@for\tmp@keyname:=parent,numberwithin,within\do{%
-\define@key{thmdef}{\tmp@keyname}{\thmt@trytwice{\thmt@setparent{#1}}{}}%
+ \define@key{thmdef}{\tmp@keyname}{%
+ \thmt@trytwice{%
+ \thmt@setparent{#1}
+ \thmt@setsibling{}%
+ }{}%
+ }%
+}
+\newcommand\thmt@setparent{%
+ \def\thmt@parent
}
\@for\tmp@keyname:=sibling,numberlike,sharenumber\do{%
-\define@key{thmdef}{\tmp@keyname}{\thmt@trytwice{\thmt@setsibling{#1}}{}}%
+ \define@key{thmdef}{\tmp@keyname}{%
+ \thmt@trytwice{%
+ \thmt@setsibling{#1}%
+ \thmt@setparent{}%
+ }{}%
+ }%
+}
+\newcommand\thmt@setsibling{%
+ \def\thmt@sibling
}
\@for\tmp@keyname:=title,name,heading\do{%
-\define@key{thmdef}{\tmp@keyname}{\thmt@trytwice{\thmt@setthmname{#1}}{}}%
+ \define@key{thmdef}{\tmp@keyname}{\thmt@trytwice{\thmt@setthmname{#1}}{}}%
+}
+\newcommand\thmt@setthmname{%
+ \def\thmt@thmname
}
\@for\tmp@keyname:=unnumbered,starred\do{%
-\define@key{thmdef}{\tmp@keyname}[]{\thmt@trytwice{\thmt@isnumberedfalse}{}}%
+ \define@key{thmdef}{\tmp@keyname}[]{\thmt@trytwice{\thmt@isnumberedfalse}{}}%
}
\def\thmt@YES{yes}
\def\thmt@NO{no}
\def\thmt@UNIQUE{unless unique}
-\define@key{thmdef}{numbered}[\thmt@YES]{
+\newif\ifthmt@isnumbered
+\newif\ifthmt@isunlessunique
+
+\define@key{thmdef}{numbered}[yes]{
\def\thmt@tmp{#1}%
\thmt@trytwice{%
\ifx\thmt@tmp\thmt@YES
@@ -235,27 +259,38 @@
\thmt@isnumberedfalse
\else\ifx\thmt@tmp\thmt@UNIQUE
\RequirePackage[unq]{unique}
- \ifuniq{\thmt@envname}{%
- \thmt@isnumberedfalse
- }{%
- \thmt@isnumberedtrue
- }%
+ \thmt@isunlessuniquetrue
\else
\PackageError{thmtools}{Unknown value `#1' to key numbered}{}%
\fi\fi\fi
}{% trytwice: after definition
\ifx\thmt@tmp\thmt@UNIQUE
- \addtotheorempreheadhook[\thmt@envname]{\setuniqmark{\thmt@envname}}%
- \addtotheorempreheadhook[\thmt@envname]{\def\thmt@dummyctrautorefname{\thmt@thmname\@gobble}}
+ \ifx\thmt@parent\@empty
+ \addtotheorempreheadhook[\thmt@envname]{\setuniqmark{\thmt@envname}}%
+ \else
+ \protected@edef\thmt@tmp{%
+ % expand \thmt@envname and \thmt@parent
+ \@nx\addtotheorempreheadhook[\thmt@envname @unique]{\@nx\setuniqmark{\thmt@envname.\@nx\@nameuse{the\thmt@parent}}}%
+ \@nx\addtotheorempreheadhook[\thmt@envname @numbered]{\@nx\setuniqmark{\thmt@envname.\@nx\@nameuse{the\thmt@parent}}}%
+ \@nx\addtotheorempreheadhook[\thmt@envname @unique]{\def\@nx\thmt@dummyctrautorefname{\thmt@thmname\@nx\@gobble}}%
+ \@nx\addtotheorempreheadhook[\thmt@envname @numbered]{\def\@nx\thmt@dummyctrautorefname{\thmt@thmname\@nx\@gobble}}%
+ }%
+ \thmt@tmp
+ \fi
+ % \addtotheorempreheadhook[\thmt@envname]{\def\thmt@dummyctrautorefname{\thmt@thmname\@gobble}}%
\fi
}%
}
-\define@key{thmdef}{preheadhook}{\thmt@trytwice{}{\addtotheorempreheadhook[\thmt@envname]{#1}}}
-\define@key{thmdef}{postheadhook}{\thmt@trytwice{}{\addtotheorempostheadhook[\thmt@envname]{#1}}}
-\define@key{thmdef}{prefoothook}{\thmt@trytwice{}{\addtotheoremprefoothook[\thmt@envname]{#1}}}
-\define@key{thmdef}{postfoothook}{\thmt@trytwice{}{\addtotheorempostfoothook[\thmt@envname]{#1}}}
+\define@key{thmdef}{preheadhook}{%
+ \thmt@trytwice{}{\addtotheorempreheadhook[\thmt@envname]{#1}}}
+\define@key{thmdef}{postheadhook}{%
+ \thmt@trytwice{}{\addtotheorempostheadhook[\thmt@envname]{#1}}}
+\define@key{thmdef}{prefoothook}{%
+ \thmt@trytwice{}{\addtotheoremprefoothook[\thmt@envname]{#1}}}
+\define@key{thmdef}{postfoothook}{%
+ \thmt@trytwice{}{\addtotheorempostfoothook[\thmt@envname]{#1}}}
\define@key{thmdef}{style}{\thmt@trytwice{\thmt@setstyle{#1}}{}}
@@ -294,52 +329,116 @@
}
\fi
-\newif\ifthmt@isnumbered
-\newcommand\thmt@setparent[1]{%
- \def\thmt@parent{#1}%
-}
-\newcommand\thmt@setsibling{%
- \def\thmt@sibling
-}
-\newcommand\thmt@setthmname{%
- \def\thmt@thmname
-}
\thmt@mkextendingkeyhandler{thmdef}{thmdef}{\string\declaretheorem\space key}
\let\thmt@newtheorem\newtheorem
+% \declaretheorem[option list 1]{thmname list}[option list 1]
+% #1 = option list 1
+% #2 = thmname list
\newcommand\declaretheorem[2][]{%
+ % TODO: use \NewDocumentCommand from xparse?
+ % xparse will be part of latex2e format from latex2e 2020 Oct.
+ \@ifnextchar[%
+ {\declaretheorem@i{#1}{#2}}
+ {\declaretheorem@i{#1}{#2}[]}%
+}
+\@onlypreamble\declaretheorem
+
+% #1 = option list 1
+% #2 = thmname list
+% #3 = option list 2
+\def\declaretheorem@i#1#2[#3]{%
+ \@for\thmt@tmp:=#2\do{%
+ % strip spaces, \KV@@sp@def is defined in keyval.sty
+ \@xa\KV@@sp@def\@xa\thmt@tmp\@xa{\thmt@tmp}%
+ \@xa\declaretheorem@ii\@xa{\thmt@tmp}{#1,#3}%
+ }%
+}
+
+% #1 = single thmname (#1 and #2 are exchanged)
+% #2 = option list
+\def\declaretheorem@ii#1#2{%
% why was that here?
%\let\thmt@theoremdefiner\thmt@original@newtheorem
- \def\thmt@envname{#2}%
- \thmt@setthmname{\thmt@modifycase #2}%
+ % init options
\thmt@setparent{}%
\thmt@setsibling{}%
- \thmt@isnumberedtrue%
- \@thmt@firstkeysettrue%
- \kvsetkeys{thmdef0}{#1}%
- \kvsetkeys{thmdef}{#1}%
+ \thmt@isnumberedtrue
+ \thmt@isunlessuniquefalse
+ \def\thmt@envname{#1}%
+ \thmt@setthmname{\thmt@modifycase #1}%
+ % use true code in \thmt@trytwice{<true>}{<false>}
+ \@thmt@firstkeysettrue
+ % parse options
+ \kvsetkeys{thmdef0}{#2}% parse option "style" first
+ \kvsetkeys{thmdef}{#2}%
+ % call patched \newtheorem
+ \ifthmt@isunlessunique
+ \ifx\thmt@parent\@empty
+ % define normal "unless unique" thm env
+ \ifuniq{#1}{\thmt@isnumberedfalse}{\thmt@isnumberedtrue}%
+ \declaretheorem@iii{#1}%
+ \else
+ % define special "unless unique" thm env,
+ % when "numbered=unless unique" and "numberwithin=<counter>" are both used
+ \declaretheorem@iv{#1}%
+ \thmt@isnumberedtrue
+ \declaretheorem@iii{#1@numbered}%
+ \thmt@isnumberedfalse
+ \declaretheorem@iii{#1@unique}%
+ \fi
+ \else
+ % define normal thm env
+ \declaretheorem@iii{#1}%
+ \fi
+ % use false code in \thmt@trytwice{<true>}{<false>}
+ \def\thmt@envname{#1}%
+ \@thmt@firstkeysetfalse
+ % uniquely ugly kludge: some keys make only sense afterwards.
+ % and it gets kludgier: again, the default-inherited
+ % keys need to have a go at it.
+ \kvsetkeys{thmdef0}{#2}%
+ \kvsetkeys{thmdef}{#2}%
+}
+
+% define normal thm env, call \thmt@newtheorem
+\def\declaretheorem@iii#1{%
\protected@edef\thmt@tmp{%
\@nx\thmt@newtheorem
- \ifthmt@isnumbered\else *\fi
- {#2}%
- \ifx\thmt@sibling\@empty\else [\thmt@sibling]\fi
- {\thmt@thmname}%
- \ifx\thmt@parent\@empty\else [\thmt@parent]\fi
+ \ifthmt@isnumbered
+ {#1}%
+ \ifx\thmt@sibling\@empty\else [\thmt@sibling]\fi
+ {\thmt@thmname}%
+ \ifx\thmt@parent\@empty\else [\thmt@parent]\fi
+ \else
+ *{#1}{\thmt@thmname}%
+ \fi
\relax% added so we can delimited-read everything later
- % (recall newtheorem is patched)
- }%\show\thmt@tmp
+ }%
+ \thmt@debug{Define theorem `#1' by ^^J\meaning\thmt@tmp}%
+ \thmt@tmp
+}
+
+% define special thm env
+\def\declaretheorem@iv#1{%
+ \protected@edef\thmt@tmp{%
+ % expand \thmt@envname and \thmt@parent
+ \@nx\newenvironment{#1}{%
+ \@nx\ifuniq{\thmt@envname.\@nx\@nameuse{the\thmt@parent}}{%
+ \def\@nx\thmt@rawenvname{#1@unique}%
+ }{%
+ \def\@nx\thmt@rawenvname{#1@numbered}%
+ }%
+ \begin{\@nx\thmt@rawenvname}%
+ }{%
+ \end{\@nx\thmt@rawenvname}%
+ }%
+ }%
+ \thmt@debug{Define special theorem `#1' by ^^J\meaning\thmt@tmp}%
\thmt@tmp
- % uniquely ugly kludge: some keys make only sense
- % afterwards.
- % and it gets kludgier: again, the default-inherited
- % keys need to have a go at it.
- \@thmt@firstkeysetfalse%
- \kvsetkeys{thmdef0}{#1}%
- \kvsetkeys{thmdef}{#1}%
}
-\@onlypreamble\declaretheorem
\providecommand\thmt@quark{\thmt@quark}
@@ -377,13 +476,14 @@
\def\thmt@shortoptarg{#1}%
\fi
}
-\def\thmt@splitopt#1=#2\thmt@quark{%
- \def\thmt@tmpkey{#1}%
- \ifx\thmt@tmpkey\@empty
- \def\thmt@tmpkey{\thmt@quark}%
- \fi
- \@onelevel@sanitize\thmt@tmpkey
-}
+% FIXME: not used?
+% \def\thmt@splitopt#1=#2\thmt@quark{%
+% \def\thmt@tmpkey{#1}%
+% \ifx\thmt@tmpkey\@empty
+% \def\thmt@tmpkey{\thmt@quark}%
+% \fi
+% \@onelevel@sanitize\thmt@tmpkey
+% }
\def\thmt@thmuse@families{thm@track@keys}
diff --git a/Master/texmf-dist/source/latex/thmtools/thm-listof.dtx b/Master/texmf-dist/source/latex/thmtools/thm-listof.dtx
index e91219eca1d..cb5b7e380a4 100644
--- a/Master/texmf-dist/source/latex/thmtools/thm-listof.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/thm-listof.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
% \fi
%
@@ -78,16 +80,15 @@
\newcommand\listoftheorems[1][]{%
%% much hacking here to pick up the definition from the class
%% without oodles of conditionals.
- \bgroup
+ \begingroup
\setlisttheoremstyle{#1}%
\let\listfigurename\listtheoremname
\def\contentsline##1{%
\csname thmt@contentsline@##1\endcsname{##1}%
}%
\@for\thmt@envname:=\thmt@allenvs\do{%
- \@xa\protected@edef\csname l@\thmt@envname\endcsname{% CHECK: why p@edef?
- \@nx\@dottedtocline{1}{1.5em}{\@nx\thmt@listnumwidth}%
- }%
+ % CHECK: is \cs{l@\thmt@envname} repeatedly defined?
+ \thmtlo@newentry
}%
\let\thref@starttoc\@starttoc
\def\@starttoc##1{\thref@starttoc{loe}}%
@@ -106,7 +107,7 @@
}%
%\expandafter
\listoffigures
- \egroup
+ \endgroup
}
\newcommand\setlisttheoremstyle[1]{%
@@ -121,25 +122,60 @@
% FMi 2019-09-31 allow local title
\define@key{thmt-listof}{title}{\def\listtheoremname{#1}}
% -- FMi
+\newif\ifthmt@listswap
+\def\thmt@TRUE{true}
+\def\thmt@FALSE{false}
+\define@key{thmt-listof}{swapnumber}[true]{%
+ \def\thmt@tmp{#1}%
+ \ifx\thmt@tmp\thmt@TRUE
+ \thmt@listswaptrue
+ \else\ifx\thmt@tmp\thmt@FALSE
+ \thmt@listswapfalse
+ \else
+ \PackageError{thmtools}{Unknown value `#1' to key swapnumber}{}%
+ \fi\fi
+}
-\providecommand\thmt@listnumwidth{2.3em}
+\ifdefined\@tocline
+ % for ams classes (amsart.cls, amsproc.cls, amsbook.cls) which
+ % don't use \@dottedtocline and don't provide \@dotsep
+ \def\thmtlo@newentry{%
+ \@xa\def\csname l@\thmt@envname\endcsname{% CHECK: why p@edef?
+ % similar to \l@figure defined in ams classes
+ \@tocline{0}{3pt plus2pt}{0pt}{\thmt@listnumwidth}{}%
+ }%
+ }
+ \providecommand*\thmt@listnumwidth{1.5pc}
+\else
+ \def\thmtlo@newentry{%
+ \@xa\def\csname l@\thmt@envname\endcsname{% CHECK: why p@edef?
+ \@dottedtocline{1}{1.5em}{\thmt@listnumwidth}%
+ }%
+ }
+ \providecommand*\thmt@listnumwidth{2.3em}
+\fi
\providecommand\thmtformatoptarg[1]{ (#1)}
\newcommand\thmt@mklistcmd{%
- \@xa\protected@edef\csname l@\thmt@envname\endcsname{% CHECK: why p@edef?
- \@nx\@dottedtocline{1}{1.5em}{\@nx\thmt@listnumwidth}%
- }%
+ \thmtlo@newentry
\ifthmt@isstarred
\@xa\def\csname ll@\thmt@envname\endcsname{%
- \protect\numberline{\protect\let\protect\autodot\protect\@empty}%
+ \protect\ifthmt@listswap
+ \protect\else
+ \protect\numberline{\protect\let\protect\autodot\protect\@empty}%
+ \protect\fi
\thmt@thmname
\ifx\@empty\thmt@shortoptarg\else\protect\thmtformatoptarg{\thmt@shortoptarg}\fi
}%
\else
\@xa\def\csname ll@\thmt@envname\endcsname{%
- \protect\numberline{\csname the\thmt@envname\endcsname}%
- \thmt@thmname
+ \protect\ifthmt@listswap
+ \thmt@thmname~\csname the\thmt@envname\endcsname
+ \protect\else
+ \protect\numberline{\csname the\thmt@envname\endcsname}%
+ \thmt@thmname
+ \protect\fi
\ifx\@empty\thmt@shortoptarg\else\protect\thmtformatoptarg{\thmt@shortoptarg}\fi
}%
\fi
diff --git a/Master/texmf-dist/source/latex/thmtools/thm-llncs.dtx b/Master/texmf-dist/source/latex/thmtools/thm-llncs.dtx
index 5a3b480c2e1..994067050e9 100644
--- a/Master/texmf-dist/source/latex/thmtools/thm-llncs.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/thm-llncs.dtx
@@ -1,7 +1,14 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
@@ -64,7 +71,7 @@
{\thmt@thmname}%
\ifthmt@hasparent [\thmt@parent]\fi
{\thmt@style@headfont}{\thmt@style@bodyfont}%
- }
+ }%
\thmt@args
\thmt@newtheorem@postdefinition
}
diff --git a/Master/texmf-dist/source/latex/thmtools/thm-ntheorem.dtx b/Master/texmf-dist/source/latex/thmtools/thm-ntheorem.dtx
index ccd12dc30d8..ef298709319 100644
--- a/Master/texmf-dist/source/latex/thmtools/thm-ntheorem.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/thm-ntheorem.dtx
@@ -1,7 +1,14 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
diff --git a/Master/texmf-dist/source/latex/thmtools/thm-patch.dtx b/Master/texmf-dist/source/latex/thmtools/thm-patch.dtx
index b1e28b6fe43..dd00028ca89 100644
--- a/Master/texmf-dist/source/latex/thmtools/thm-patch.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/thm-patch.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1.3c.txt
%
% \fi
%
diff --git a/Master/texmf-dist/source/latex/thmtools/thm-restate.dtx b/Master/texmf-dist/source/latex/thmtools/thm-restate.dtx
index 033a48254e7..d02b3630abc 100644
--- a/Master/texmf-dist/source/latex/thmtools/thm-restate.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/thm-restate.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1.3c.txt
%
% \fi
%
@@ -224,7 +226,7 @@
\@xa\let\csname c@#2\endcsname=\c@thmt@dummyctr
\@xa\let\csname theH#2\endcsname=\theHthmt@dummyctr
% disable labeling.
- \let\label=\@gobble
+ \let\label=\thmt@gobble@label
\let\ltx@label=\@gobble% amsmath needs this
% We shall need to restore the counters at the end
% of the environment, so we get
@@ -268,6 +270,14 @@
%% now empty, just used as a marker.
}
+\let\thmt@gobble@label\@gobble
+% cleveref extends syntax of \label to \label[...]{...}
+\AtBeginDocument{
+ \@ifpackageloaded{cleveref}{
+ \renewcommand*\thmt@gobble@label[2][]{}
+ }{}
+}
+
\newenvironment{restatable}{%
\thmt@thisistheonetrue\thmt@restatable
}{%
diff --git a/Master/texmf-dist/source/latex/thmtools/thmdef-mdframed.dtx b/Master/texmf-dist/source/latex/thmtools/thmdef-mdframed.dtx
index a3fd3658cba..cae264b04eb 100644
--- a/Master/texmf-dist/source/latex/thmtools/thmdef-mdframed.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/thmdef-mdframed.dtx
@@ -1,14 +1,21 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
%<*mdframed>
%\fi
%
-% Mostly, this key wraps the theorem in a mdframed environment.
+% Mostly, this key wraps the theorem in a |mdframed| environment.
% The parameters are set by treating the value we are given as
% a new key-val list, see below.
%
@@ -17,10 +24,9 @@
\thmt@trytwice{}{%
\RequirePackage{mdframed}%
\RequirePackage{thm-patch}%
- \addtotheorempreheadhook[\thmt@envname]{%
- \begin{mdframed}[#1]}%
+ \addtotheorempreheadhook[\thmt@envname]{\begin{mdframed}[#1]}%
\addtotheorempostfoothook[\thmt@envname]{\end{mdframed}}%
- }%
+ }%
}
% \end{macrocode}
%\iffalse (hide this from DocInput)
diff --git a/Master/texmf-dist/source/latex/thmtools/thmdef-shaded.dtx b/Master/texmf-dist/source/latex/thmtools/thmdef-shaded.dtx
index 6377182c3e6..c7501cae360 100644
--- a/Master/texmf-dist/source/latex/thmtools/thmdef-shaded.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/thmdef-shaded.dtx
@@ -1,14 +1,21 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
%<*shaded>
%\fi
%
-% Mostly, this key wraps the theorem in a shadebox environment.
+% Mostly, this key wraps the theorem in a |shadebox| environment.
% The parameters are set by treating the value we are given as
% a new key-val list, see below.
%
@@ -24,45 +31,45 @@
}%
}
% \end{macrocode}
-% The docs for shadethm say:
+% The docs for |shadethm| say:
% \begin{quote}
% There are some parameters you could set the default for (try them as is,
% first).
% \begin{itemize}
-% \item shadethmcolor The shading color of the background. See the
+% \item |shadethmcolor|\quad The shading color of the background. See the
% documentation for the color package, but with a `gray' model, I find .97
% looks good out of my printer, while a darker shade like .92 is needed
% to make it copy well. (Black is 0, white is 1.)
-% \item shaderulecolor The shading color of the border of the shaded box.
+% \item |shaderulecolor|\quad The shading color of the border of the shaded box.
% See (i). If shadeboxrule is set to 0pt then this won't print anyway.
-% \item shadeboxrule The width of the border around the shading. Set it to
+% \item |shadeboxrule|\quad The width of the border around the shading. Set it to
% 0pt (not just 0) to make it disappear.
-% \item shadeboxsep The length by which the shade box surrounds the text.
+% \item |shadeboxsep|\quad The length by which the shade box surrounds the text.
% \end{itemize}
% \end{quote}
%
% So, let's just define keys for all of these.
%
% \begin{macrocode}
-\define@key{thmt@shade}{textwidth}{\setlength\shadedtextwidth{#1}}
-\define@key{thmt@shade}{bgcolor}{\thmt@definecolor{shadethmcolor}{#1}}
-\define@key{thmt@shade}{rulecolor}{\thmt@definecolor{shaderulecolor}{#1}}
-\define@key{thmt@shade}{rulewidth}{\setlength\shadeboxrule{#1}}
-\define@key{thmt@shade}{margin}{\setlength\shadeboxsep{#1}}
-\define@key{thmt@shade}{padding}{\setlength\shadeboxsep{#1}}
-\define@key{thmt@shade}{leftmargin}{\setlength\shadeleftshift{#1}}
+\define@key{thmt@shade}{textwidth} {\setlength\shadedtextwidth{#1}}
+\define@key{thmt@shade}{bgcolor} {\thmt@definecolor{shadethmcolor}{#1}}
+\define@key{thmt@shade}{rulecolor} {\thmt@definecolor{shaderulecolor}{#1}}
+\define@key{thmt@shade}{rulewidth} {\setlength\shadeboxrule{#1}}
+\define@key{thmt@shade}{margin} {\setlength\shadeboxsep{#1}}
+\define@key{thmt@shade}{padding} {\setlength\shadeboxsep{#1}}
+\define@key{thmt@shade}{leftmargin} {\setlength\shadeleftshift{#1}}
\define@key{thmt@shade}{rightmargin}{\setlength\shaderightshift{#1}}
% \end{macrocode}
%
% What follows is wizardry you don't have to understand. In essence,
% we want to support two notions of color: one is ``everything that goes
-% after \lstinline|\definecolor{shadethmcolor}|'', such as
-% \lstinline|{rgb}{0.8,0.85,1}|. On the other hand, we'd also like
-% to recognize an already defined color name such as \lstinline|blue|.
+% after |\definecolor{shadethmcolor}|'', such as
+% |{rgb}{0.8,0.85,1}|. On the other hand, we'd also like
+% to recognize an already defined color name such as |blue|.
%
% To handle the latter case, we need to copy the definition of one color
-% into another. The xcolor package offers \lstinline|\colorlet| for that,
-% for the color package, we just cross our fingers.
+% into another. The \pkg{xcolor} package offers |\colorlet| for that,
+% for the \pkg{color} package, we just cross our fingers.
% \begin{macrocode}
\def\thmt@colorlet#1#2{%
%\typeout{don't know how to let color `#1' be like color `#2'!}%
@@ -78,19 +85,19 @@
% \end{macrocode}
% Now comes the interesting part: we assume that a simple color name
% must not be in braces, and a color definition starts with an opening
-% curly brace. (So, if \lstinline|\definecolor| ever gets an optional arg,
+% curly brace. (So, if |\definecolor| ever gets an optional arg,
% we are in a world of pain.)
%
-% If the second argument to \lstinline|\thmt@definecolor| (the key) starts
+% If the second argument to |\thmt@definecolor| (the key) starts
% with a brace,
-% then \lstinline|\thmt@def@color| will have an empty second argument,
+% then |\thmt@def@color| will have an empty second argument,
% delimited by the brace of the key. Hopefully, the key will have exactly
-% enough arguments to satisfy \lstinline|\definecolor|. Then,
-% \lstinline|thmt@drop@relax| will be executed and gobble the fallback
-% values and the \lstinline|\thmt@colorlet|.
+% enough arguments to satisfy |\definecolor|. Then,
+% |thmt@drop@relax| will be executed and gobble the fallback
+% values and the |\thmt@colorlet|.
%
-% If the key does not contain an opening brace, \lstinline|\thmt@def@color|
-% will drop everything up to \lstinline|{gray}{0.5}|. So, first the color
+% If the key does not contain an opening brace, |\thmt@def@color|
+% will drop everything up to |{gray}{0.5}|. So, first the color
% gets defined to a medium gray, but then, it immediately gets overwritten
% with the definition corresponding to the color name.
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/thmtools/thmdef-thmbox.dtx b/Master/texmf-dist/source/latex/thmtools/thmdef-thmbox.dtx
index ea22cbae977..59409fd79e0 100644
--- a/Master/texmf-dist/source/latex/thmtools/thmdef-thmbox.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/thmdef-thmbox.dtx
@@ -1,33 +1,40 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
%<*thmbox>
%\fi
-% The thmbox package does something else: instead of having a separate
+% The \pkg{thmbox} package does something else: instead of having a separate
% environment, we have to use a command different from
-% \lstinline|\newtheorem| to get the boxed style. Fortunately,
-% \thmtools stores the command as \lstinline|\thmt@theoremdefiner|, so we
+% |\newtheorem| to get the boxed style. Fortunately,
+% \thmtools stores the command as |\thmt@theoremdefiner|, so we
% can modify it. (One of the perks if extension writer and framework writer
% are the same person.) So, in contrast to the previous example, this time
-% we need to do something before the actual \lstinline|\newtheorem| is
+% we need to do something before the actual |\newtheorem| is
% called.
% \begin{macrocode}
\define@key{thmdef}{thmbox}[L]{%
\thmt@trytwice{%
- \let\oldproof=\proof
- \let\oldendproof=\endproof
- \let\oldexample=\example
- \let\oldendexample=\endexample
- \RequirePackage[nothm]{thmbox}
- \let\proof=\oldproof
- \let\endproof=\oldendproof
- \let\example=\oldexample
- \let\endexample=\oldendexample
- \def\thmt@theoremdefiner{\newboxtheorem[#1]}%
+ \let\oldproof=\proof
+ \let\oldendproof=\endproof
+ \let\oldexample=\example
+ \let\oldendexample=\endexample
+ \RequirePackage[nothm]{thmbox}
+ \let\proof=\oldproof
+ \let\endproof=\oldendproof
+ \let\example=\oldexample
+ \let\endexample=\oldendexample
+ \def\thmt@theoremdefiner{\newboxtheorem[#1]}%
}{}%
}%
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/thmtools/thmtools.dtx b/Master/texmf-dist/source/latex/thmtools/thmtools.dtx
index d5139e30c64..32e819c8e13 100644
--- a/Master/texmf-dist/source/latex/thmtools/thmtools.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/thmtools.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1.3c.txt
%
% \fi
%
diff --git a/Master/texmf-dist/source/latex/thmtools/thmtools.ins b/Master/texmf-dist/source/latex/thmtools/thmtools.ins
index 4b97aae226c..461856c73cf 100644
--- a/Master/texmf-dist/source/latex/thmtools/thmtools.ins
+++ b/Master/texmf-dist/source/latex/thmtools/thmtools.ins
@@ -11,36 +11,39 @@
This is a generated file.
This file is part of the `thmtools' package.
-The `thmtools' package has the LPPL maintenance status: unmaintained.
+The `thmtools' package has the LPPL maintenance status: maintained.
+Current Maintainer is Yukai Chou, muzimuzhi@gmail.com
-Copyright (C) 2008-2014 by Ulrich M. Schwarz.
+Copyright (C) 2008-2014 by Ulrich M. Schwarz
+Copyright (C) 2019 by Frank Mittelbach
+Copyright (C) 2020- by Yukai Chou
This file may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, version 1.3a.
+conditions of the LaTeX Project Public License, version 1.3c.
This version is obtainable at
-http://www.latex-project.org/lppl/lppl-1-3a.txt
+http://www.latex-project.org/lppl/lppl-1-3c.txt
^^J\noexpand\noexpand\noexpand\NeedsTeXFormat{LaTeX2e}^^J\noexpand\noexpand\noexpand\ProvidesPackage{\noexpand\expandafter\noexpand\dropext\outFileName\relax}[\VERSION]
\endpreamble
\generate{%
- \file{thmtools.sty}{\from{thmtools.dtx}{thmtools}}
- \file{thm-restate.sty}{\from{thm-restate.dtx}{restate}}
- \file{thm-patch.sty}{\from{thm-patch.dtx}{patch}}
- \file{thm-autoref.sty}{\from{thm-autoref.dtx}{autoref}}
- \file{thm-listof.sty}{\from{thm-listof.dtx}{listof}}
- \file{thm-kv.sty}{\from{thm-kv.dtx}{kv}}
- \file{parseargs.sty}{\from{parseargs.dtx}{parseargs}}
- \file{aliasctr.sty}{\from{aliasctr.dtx}{code}}
- \file{unique.sty}{\from{unique.dtx}{code}}
- \file{thm-amsthm.sty}{\from{thm-amsthm.dtx}{amsthm}}
- \file{thm-ntheorem.sty}{\from{thm-ntheorem.dtx}{ntheorem}}
- \file{thm-beamer.sty}{\from{thm-beamer.dtx}{beamer}}
- \file{thm-llncs.sty}{\from{thm-llncs.dtx}{llncs}}
- \file{thmdef-shaded.sty}{\from{thmdef-shaded.dtx}{shaded}}
- \file{thmdef-thmbox.sty}{\from{thmdef-thmbox.dtx}{thmbox}}
- \file{thmdef-mdframed.sty}{\from{thmdef-mdframed.dtx}{mdframed}}
- }
+ \file{thmtools.sty} {\from{thmtools.dtx}{thmtools}}
+ \file{thm-restate.sty} {\from{thm-restate.dtx}{restate}}
+ \file{thm-patch.sty} {\from{thm-patch.dtx}{patch}}
+ \file{thm-autoref.sty} {\from{thm-autoref.dtx}{autoref}}
+ \file{thm-listof.sty} {\from{thm-listof.dtx}{listof}}
+ \file{thm-kv.sty} {\from{thm-kv.dtx}{kv}}
+ \file{parseargs.sty} {\from{parseargs.dtx}{parseargs}}
+ \file{aliasctr.sty} {\from{aliasctr.dtx}{code}}
+ \file{unique.sty} {\from{unique.dtx}{code}}
+ \file{thm-amsthm.sty} {\from{thm-amsthm.dtx}{amsthm}}
+ \file{thm-ntheorem.sty} {\from{thm-ntheorem.dtx}{ntheorem}}
+ \file{thm-beamer.sty} {\from{thm-beamer.dtx}{beamer}}
+ \file{thm-llncs.sty} {\from{thm-llncs.dtx}{llncs}}
+ \file{thmdef-shaded.sty} {\from{thmdef-shaded.dtx}{shaded}}
+ \file{thmdef-thmbox.sty} {\from{thmdef-thmbox.dtx}{thmbox}}
+ \file{thmdef-mdframed.sty}{\from{thmdef-mdframed.dtx}{mdframed}}
+}
\Msg{*********************************************************}
\Msg{*}
\Msg{* To finish the installation you have to move the}
diff --git a/Master/texmf-dist/source/latex/thmtools/unique.dtx b/Master/texmf-dist/source/latex/thmtools/unique.dtx
index 9afbd2cffa2..f2fff48a07e 100644
--- a/Master/texmf-dist/source/latex/thmtools/unique.dtx
+++ b/Master/texmf-dist/source/latex/thmtools/unique.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2005-8 by Ulrich M. Schwarz
+% Copyright (C) 2005-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1.3c.txt
%
% \fi
%
@@ -13,7 +15,7 @@
%<*code>
%\fi
% Two macros are provided: |\setuniqmark| takes a single parameter,
-% the name, which should be a string of letters. |\ifuniqmark| takes
+% the name, which should be a string of letters. |\ifuniq| takes
% three parameters: a name, a true-part and a false-part. The true
% part is executed if and only if there was exactly one call to
% |\setuniqmark| with the given name during the previous \LaTeX\ run.
@@ -56,17 +58,18 @@
% \begin{macrocode}
\newcommand\setuniqmark[1]{%
\expandafter\ifx\csname uniq@now@#1\endcsname\relax
- \global\@namedef{uniq@now@#1}{\uniq@ONE}%
+ \global\@namedef{uniq@now@#1}{\uniq@ONE}%
\else
- \expandafter\ifx\csname uniq@now@#1\endcsname\uniq@MANY\else
- \immediate\write\uniq@channel{%
- \string\uniq@setmany{#1}%
- }%
- \ifuniq{#1}{%
- \uniq@warnnotunique{#1}%
- }{}%
- \fi
- \global\@namedef{uniq@now@#1}{\uniq@MANY}%
+ \expandafter\ifx\csname uniq@now@#1\endcsname\uniq@MANY
+ \else
+ \immediate\write\uniq@channel{%
+ \string\uniq@setmany{#1}%
+ }%
+ \ifuniq{#1}{%
+ \uniq@warnnotunique{#1}%
+ }{}%
+ \fi
+ \global\@namedef{uniq@now@#1}{\uniq@MANY}%
\fi
}
% \end{macrocode}
@@ -75,19 +78,19 @@
% \begin{macro}{\ifuniq}
% Companion to |\setuniqmark|: if the uniqmark given in the first
% argument was called more than once, execute the second argument,
-% otherwise execute the first argument. Note than no call to
+% otherwise execute the third argument. Note that no call to
% |\setuniqmark| for a particular uniqmark at all means that this
% uniqmark is unique.
%
-% This is a lazy version: we could always say false if we already had two calls
-% to setuniqmark this run, but we have to rerun for any ifuniq prior
-% to the first setuniqmark anyway, so why bother?
+% This is a lazy version: we could always say false if we already had two
+% calls to |\setuniqmark| this run, but we have to rerun for any |\ifuniq|
+% prior to the first setuniqmark anyway, so why bother?
% \begin{macrocode}
\newcommand\ifuniq[1]{%
\expandafter\ifx\csname uniq@last@#1\endcsname\uniq@MANY
- \expandafter \@secondoftwo
+ \expandafter\@secondoftwo
\else
- \expandafter\@firstoftwo
+ \expandafter\@firstoftwo
\fi
}
% \end{macrocode}
@@ -122,11 +125,11 @@
% \begin{macrocode}
\def\uniq@warnifunique#1{%
\expandafter\ifx\csname uniq@now@#1\endcsname\uniq@MANY\else
- \PackageWarningNoLine{uniq}{%
- `#1' is unique now.\MessageBreak
- Rerun LaTeX to pick up the change%
- }%
- \@uniq@reruntrue
+ \PackageWarningNoLine{uniq}{%
+ `#1' is unique now.\MessageBreak
+ Rerun LaTeX to pick up the change%
+ }%
+ \@uniq@reruntrue
\fi
}
% \end{macrocode}
@@ -151,10 +154,10 @@
% \begin{macrocode}
\def\uniq@maybesuggestrerun{%
\if@uniq@rerun
- \PackageWarningNoLine{uniq}{%
- Uniquenesses have changed. \MessageBreak
- Rerun LaTeX to pick up the change%
- }%
+ \PackageWarningNoLine{uniq}{%
+ Uniquenesses have changed. \MessageBreak
+ Rerun LaTeX to pick up the change%
+ }%
\fi
}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/thucoursework/thucoursework.dtx b/Master/texmf-dist/source/latex/thucoursework/thucoursework.dtx
index 7aa62a8bf5f..2ba0a5433e6 100644
--- a/Master/texmf-dist/source/latex/thucoursework/thucoursework.dtx
+++ b/Master/texmf-dist/source/latex/thucoursework/thucoursework.dtx
@@ -56,7 +56,7 @@ through LaTeX.
\endgroup
%</internal>
%<*driver>
-\ProvidesFile{thucoursework.dtx}[2020/02/23 2.5.1 Tsinghua University Coursework Template]
+\ProvidesFile{thucoursework.dtx}[2020/09/09 2.6 Tsinghua University Coursework Template]
\documentclass{ltxdoc}
\usepackage{dtx-style}
@@ -247,8 +247,8 @@ through LaTeX.
% 按照优先级推荐提问的位置如下:
%
% \begin{itemize}
-% \item \href{http://github.com/zhaofeng-shu33/thucoursework/issues}{Github Issues}
-% \item \href{http://bbs.ctex.org/nForum/#!board/TeX}{ctex 论坛}
+% \item \href{https://github.com/zhaofeng-shu33/thucoursework/issues}{Github Issues}
+% \item \href{https://github.com/CTeX-org/forum/issues}{ctex 论坛}
% \end{itemize}
%
% \subsection{示例文件}
@@ -396,17 +396,18 @@ through LaTeX.
% \section{实现细节}
%
% \subsection{基本信息}
-% \begin{macrocode}
% \changes{v2.0}{2018/03/22}{[\zhaofeng] Make it a latex package(.sty)}
+% \begin{macrocode}
%<*sty>
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesClass{iidef}
-[2020/02/23 2.5.1 Tsinghua University Coursework Template]
+[2020/09/09 2.6 Tsinghua University Coursework Template]
% \end{macrocode}
% \subsection{装载宏包}
% \label{sec:loadpackage}
%
% 引用的宏包和相应的定义。
+% \changes{v2.6}{2020/09/09}{[\zhaofeng] support \texttt{exam} document class}
% \begin{macrocode}
%% configuration of nested enumerate env
\RequirePackage{enumitem}
@@ -415,7 +416,8 @@ through LaTeX.
%% required by macro DeclareMathOperator
\RequirePackage{amsmath}
%% Set up page headers using with fancyhdr
-\RequirePackage{fancyhdr}
+\@ifundefined{lhead}{\RequirePackage{fancyhdr}}
+{\def\@thulhead{thulhead}}
%define the solution env with amsthm proof
\RequirePackage{amsthm}
% \end{macrocode}
@@ -465,6 +467,7 @@ through LaTeX.
\underline{\bf \@hwname\;\thehwcnt} \\
\end{center}
}
+\@ifundefined{@thulhead}{
\fancypagestyle{runningpage}
{
\fancyhead[L]{\small\@coursename}
@@ -472,6 +475,7 @@ through LaTeX.
}
%% use runningpage style from second page on
\pagestyle{runningpage}
+}{}
%% *********************************************************************************************
% \end{macrocode}
%
@@ -509,6 +513,7 @@ through LaTeX.
\def\@slname{Solution}
\def\slname#1{\renewcommand\@slname{#1}}
+\@ifundefined{solution}{
\newenvironment{solution}
{
\proof[\@slname]
@@ -518,6 +523,7 @@ through LaTeX.
\renewcommand{\qedsymbol}{}
\endproof
}
+}{}
%%******************************
% \end{macrocode}
% \subsection{常用数学符号}
diff --git a/Master/texmf-dist/source/latex/thuthesis/Makefile b/Master/texmf-dist/source/latex/thuthesis/Makefile
deleted file mode 100644
index f3dd43cc77b..00000000000
--- a/Master/texmf-dist/source/latex/thuthesis/Makefile
+++ /dev/null
@@ -1,83 +0,0 @@
-# Makefile for ThuThesis
-
-PACKAGE = thuthesis
-THESIS = main
-SPINE = spine
-
-SOURCES = $(PACKAGE).ins $(PACKAGE).dtx
-CLSFILE = dtx-style.sty $(PACKAGE).cls
-
-LATEXMK = latexmk
-
-# make deletion work on Windows
-ifdef SystemRoot
- RM = del /Q
-else
- RM = rm -f
-endif
-
-.PHONY: all all-dev clean distclean dist thesis viewthesis spine viewspine doc viewdoc cls check save savepdf test FORCE_MAKE
-
-thesis: $(THESIS).pdf
-
-all: thesis spine
-
-all-dev: doc all
-
-cls: $(CLSFILE)
-
-$(CLSFILE): $(SOURCES)
- xetex $(PACKAGE).ins
-
-doc: $(PACKAGE).pdf
-
-spine: $(SPINE).pdf
-
-$(PACKAGE).pdf: cls FORCE_MAKE
- $(LATEXMK) $(PACKAGE).dtx
-
-$(THESIS).pdf: cls FORCE_MAKE
- $(LATEXMK) $(THESIS)
-
-$(SPINE).pdf: cls FORCE_MAKE
- $(LATEXMK) $(SPINE)
-
-viewdoc: doc
- $(LATEXMK) -pv $(PACKAGE).dtx
-
-viewthesis: thesis
- $(LATEXMK) -pv $(THESIS)
-
-viewspine: spine
- $(LATEXMK) -pv $(SPINE)
-
-save:
- bash testfiles/save.sh
-
-savepdf:
- bash testfiles/save-pdf.sh
-
-test:
- l3build check
-
-clean:
- $(LATEXMK) -c $(PACKAGE).dtx $(THESIS) $(SPINE)
- -@$(RM) *~ main-survey.*
-
-cleanall: clean
- -@$(RM) $(PACKAGE).pdf $(THESIS).pdf $(SPINE).pdf
-
-distclean: cleanall
- -@$(RM) $(CLSFILE)
- -@$(RM) -r dist
-
-check: FORCE_MAKE
-ifeq ($(version),)
- @echo "Error: version missing: \"make [check|dist] version=X.Y.Z\""; exit 1
-else
- @[[ $(shell grep -E -c '$(version) Tsinghua University Thesis Template|\\def\\version\{$(version)\}' thuthesis.dtx) -eq 3 ]] || (echo "update version in thuthesis.dtx before release"; exit 1)
- @[[ $(shell grep -E -c '"version": "$(version)"' package.json) -eq 1 ]] || (echo "update version in package.json before release"; exit 1)
-endif
-
-dist: check all-dev
- npm run build -- --version=$(version)
diff --git a/Master/texmf-dist/source/latex/thuthesis/thuthesis.dtx b/Master/texmf-dist/source/latex/thuthesis/thuthesis.dtx
index 0a40047d0e1..84c320323cf 100644
--- a/Master/texmf-dist/source/latex/thuthesis/thuthesis.dtx
+++ b/Master/texmf-dist/source/latex/thuthesis/thuthesis.dtx
@@ -1,6 +1,7 @@
% \iffalse meta-comment
%
-% Copyright (C) 2005-2020 by Ruini Xue <xueruini@gmail.com>
+% Copyright (C) 2005-2020 by Tsinghua University TUNA Association <tuna@tsinghua.edu.cn>
+%
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -16,7 +17,7 @@
%
% \iffalse
%<*driver>
-\ProvidesFile{thuthesis.dtx}[2020/02/23 6.0.2 Tsinghua University Thesis Template]
+\ProvidesFile{thuthesis.dtx}[2020/10/14 7.1.0 Tsinghua University Thesis Template]
\documentclass{ltxdoc}
\usepackage{dtx-style}
@@ -56,7 +57,7 @@
% \IndexPrologue{\section{\indexname}}
%
% \title{\bfseries\color{violet}\thuthesis:清华大学学位论文模板}
-% \author{{\fangsong 薛瑞尼}\\[5pt]\texttt{xueruini@gmail.com}}
+% \author{{\fangsong 清华大学 TUNA 协会}\\[5pt]\texttt{tuna@tsinghua.edu.cn}}
% \date{v\fileversion\ (\filedate)}
% \maketitle\thispagestyle{empty}
%
@@ -71,20 +72,17 @@
% \begin{abstract}
% \noindent
% \begin{enumerate}
-% \item 本模板的发布遵守 \LaTeX{} Project Public License,使用前请认真阅读协议内
+% \item 本模板的发布遵守 \href{https://www.latex-project.org/lppl/lppl-1-3c.txt}{\LaTeX{} Project Public License (1.3.c)},使用前请认真阅读协议内
% 容。
% \item 本模板为作者根据
-% 清华大学教务处颁发的
-% \href{http://www.law.tsinghua.edu.cn/publish/law/7024/2012/20120216153516317135347/20120216153516317135347_.html}{《综合论文训练写作指南》},
% 清华大学研究生院颁发的
-% \href{http://yjsy.cic.tsinghua.edu.cn/docinfo/board/boarddetail.jsp?columnId=001050603&parentColumnId=0010506&itemSeq=5365}{《研究生学位论文写作指南》},
+% \href{http://yjsy.cic.tsinghua.edu.cn/docinfo/board/boarddetail.jsp?columnId=001050603&parentColumnId=0010506&itemSeq=5365}{%
+% 《研究生学位论文写作指南》}(仅限校内网络访问)、
+% 清华大学教务处颁发的《综合论文训练写作指南》和
% 清华大学
% \href{http://postdoctor.tsinghua.edu.cn/info/czxz/1283}{%
% 《编写“清华大学博士后研究报告”参考意见》}
% 编写而成,旨在供清华大学毕业生撰写学位论文使用。
-% \item 清华大学教务处和研究生院只提供毕业论文写作指南,不提供官方模板,也不会授
-% 权第三方模板为官方模板,所以此模板仅为写作指南的参考实现,不保证格式审查老师
-% 不提意见。任何由于使用本模板而引起的论文格式审查问题均与本模板作者无关。
% \item 任何个人或组织以本模板为基础进行修改、扩展而生成的新的专用模板,请严格遵
% 守 \LaTeX{} Project Public License 协议。由于违犯协议而引起的任何纠纷争端均与
% 本模板作者无关。
@@ -107,7 +105,7 @@
% 的 \LaTeX{} 论文模板。
%
% 本文档将尽量完整的介绍模板的使用方法,如有不清楚之处,或者想提出改进建议,
-% 可以在 \href{https://github.com/xueruini/thuthesis/issues/}{GitHub Issues}
+% 可以在 \href{https://github.com/tuna/thuthesis/issues/}{GitHub Issues}
% 参与讨论或提问。
% 有兴趣者都可以参与完善此手册,也非常欢迎对代码的贡献。
%
@@ -117,18 +115,36 @@
% 用户如果遇到 bug,或者发现与学校《写作指南》 的要求不一致,可以尝试以下办法:
% \begin{enumerate}
% \item 将模板升级到最新,见第~\ref{sec:upgrade} 节;
-% \item 阅读 \href{https://github.com/xueruini/thuthesis/wiki/FAQ}{FAQ};
+% \item 阅读 \href{https://github.com/tuna/thuthesis/wiki/FAQ}{FAQ};
% \item 在 GitHub Issues 中按照说明
-% \href{https://github.com/xueruini/thuthesis/issues/new?template=bug_report.md}{报告 bug}。
+% \href{https://github.com/tuna/thuthesis/issues/new?template=bug_report.md}{报告 bug}。
% \end{enumerate}
%
+% \section{贡献者}
+% \label{sec:contributors}
+%
+% \thuthesis{} 的开发过程中,主要的维护者包括:
+%
+% \begin{itemize}
+% \item 薛瑞尼(\githubuser{xueruini}):最早的开发者,2005 年创建 \thuthesis{} 并长期进行维护工作。
+% \item 赵涛(\githubuser{alick}):2011-2015 年活跃,较早期阶段的开发者。
+% \item 李泽平(\githubuser{zepinglee}):2016 年至今活跃,为目前主要维护者。
+% \item 陈晟祺(\githubuser{Harry-Chen}):2020 年至今活跃,主要负责非开发性事宜。
+% \end{itemize}
+%
+% 同时,也要感谢所有在 GitHub 上提出问题与贡献代码的同学、老师们。
+% \thuthesis{} 的持续发展,离不开你们的帮助与支持。
+%
% \section{安装}
% \label{sec:installation}
%
-% \thuthesis{} 已经包含在主要的 \TeX{} 发行版中,但是通常版本较旧,
-% 而且不方便更新。
-% 建议使用 GitHub 上的最新版:
-% \url{https://github.com/xueruini/thuthesis}。
+% \thuthesis{} 已经包含在主要的 \TeX{} 发行版中,但是通常版本较旧,而且不方便更新。
+% 建议从下列途径下载最新版:
+% \begin{description}
+% \item[GitHub] \url{https://github.com/tuna/thuthesis},从 Release 中下载 zip 文件。
+% \item[TUNA 镜像站] \url{https://mirrors.tuna.tsinghua.edu.cn/github-release/tuna/thuthesis/},也可在首页选择“获取下载链接——应用软件——\thuthesis{}论文模板”。
+% \end{description}
+%
%
% 模板支持在 TeX Live、MacTeX 和 MiKTeX 平台下进行编译,但要求 2017 年或更新的发行版。
% 当然,尽可能使用最新的版本可以避免 bug。
@@ -148,11 +164,11 @@
% thuthesis.ins & \textsc{DocStrip} 驱动文件(开发用) \\
% thuthesis.dtx & \textsc{DocStrip} 源文件(开发用)\\\midrule
% thuthesis.cls & 模板类文件\\
-% thuthesis-numeric.bst & 参考文献样式文件\\
-% thuthesis-author-year.bst & 参考文献样式文件\\
-% thuthesis-bachelor.bst & 参考文献样式文件\\
-% tsinghua.pdf & 校名 logo,系统无隶书字体时使用 \\\midrule
-% main.tex & 示例文档主文件\\
+% thuthesis-*.bst & \hologo{BibTeX} 参考文献表样式文件\\
+% thuthesis-*.bbx & BibLaTeX 参考文献表样式文件\\
+% thuthesis-*.cbx & BibLaTeX 参考文献引用样式文件\\
+% tsinghua-name-bachelor.pdf & 校名 logo,本科生封面使用 \\\midrule
+% thuthesis-example.tex & 示例文档主文件\\
% spine.tex & 书脊示例文档\\
% ref/ & 示例文档参考文献目录\\
% data/ & 示例文档章节具体内容\\
@@ -182,61 +198,81 @@
% \end{shell}
%
% \note[注意:]{如果没有生成的模板 \file{thuthesis.cls} 文件
-% (跟 \file{main.tex} 同一目录下),
+% (跟 \file{thuthesis-example.tex} 同一目录下),
% \LaTeX{} 在编译时可能找到发行版中较旧版本的 \file{.cls},从而造成冲突。}
%
% \subsection{编译论文}
% \label{sec:generate-thesis}
% 本节介绍几种常见的生成论文的方法。用户可根据自己的情况选择。
%
+% 在撰写论文时,我们\textbf{不推荐}使用原有的 \file{thuthesis-example.tex} 这一名称。
+% 建议将其复制一份,改为其他的名字(如 \file{thesis.tex} 或者 \file{main.tex})。
+% 需要注意,如果使用了来自 \file{data} 目录中的 \file{tex} 文件,
+% 则重命名主文件后,其顶端的 \texttt{!TeX root} 选项也需要相应修改。
+%
% \subsubsection{GNU make}
% \label{sec:make}
% 如果用户可以使用 GNU make 工具,这是最方便的办法。
% 所以 \thuthesis{} 提供了 \file{Makefile}:
% \begin{shell}
-% $ make thesis # 生成论文 main.pdf
+% $ make thesis # 生成论文示例 thuthesis-example.pdf
% $ make spine # 生成书脊 spine.pdf
% $ make doc # 生成说明文档 thuthesis.pdf
% $ make clean # 清理编译生成的辅助文件
% \end{shell}
%
+% 需要注意,如果更改了主文件的名称,则需要修改 \file{Makefile} 顶端的 \texttt{THESIS} 变量定义。
+%
% \subsubsection{latexmk}
% \label{sec:latexmk}
% \texttt{latexmk} 命令支持全自动生成 \LaTeX{} 编写的文档,并且支持使用不同的工具
% 链来进行生成,它会自动运行多次工具直到交叉引用都被解决。
% \begin{shell}
-% $ latexmk main.tex # 生成论文 main.pdf
-% $ latexmk spine.tex # 生成书脊 spine.pdf
-% $ latexmk thuthesis.dtx # 生成说明文档 thuthesis.pdf
-% $ latexmk -c # 清理编译生成的辅助文件
+% $ latexmk thuthesis-example.tex # 生成示例论文 thuthesis-example.pdf
+% $ latexmk spine.tex # 生成书脊 spine.pdf
+% $ latexmk thuthesis.dtx # 生成说明文档 thuthesis.pdf
+% $ latexmk -c # 清理编译生成的辅助文件
% \end{shell}
-% \texttt{latexmk} 的编译过程是通过 \file{latexmk} 文件来配置的,如果要进一步了解,
-% 可以参考 \pkg{latexmk} 的文档。
+% \texttt{latexmk} 的编译过程是通过 \file{latexmkrc} 文件来配置的,如果要进一步了解,
+% 可以参考 \pkg{latexmk} 文档。
%
% \subsubsection{\XeLaTeX}
% \label{sec:xelatex}
% 如果用户无法使用以上两种较为方便的编译方法,就只能按照以下复杂的办法手动编译。
+%
+% 首先,更新模板:
% \begin{shell}
-% $ xetex thuthesis.ins # 生成 thuthesis.cls
-% $ xelatex main.tex
-% $ bibtex main.tex # 生成 bbl 文件
-% $ xelatex main.tex # 解决引用
-% $ xelatex main.tex # 生成完整的 pdf 文件
+% $ xetex thuthesis.ins # 生成 thuthesis.cls
% \end{shell}
%
-% 下面的命令用来生成用户手册,
+% 然后,生成论文以及书脊:
% \begin{shell}
-% $ xelatex thuthesis.dtx
+% $ xelatex thuthesis-example.tex
+% $ bibtex thuthesis-example.aux # 生成 bbl 文件
+% $ bibtex thuthesis-example-survey.aux # 本科生的调研报告的参考文献
+% $ bibtex thuthesis-example-translation.aux # 本科生的外文资料翻译的参考文献
+% $ bibtex thuthesis-example-index.aux # 本科生的书面翻译对应的原文索引
+% $ xelatex thuthesis-example.tex # 解决引用
+% $ xelatex thuthesis-example.tex # 生成论文 PDF
+%
+% $ xelatex spine.tex # 生成书脊 PDF
+% \end{shell}
+%
+% 在调用 \XeLaTeX 时,如果设置了 \option{include-spine} 选项,
+% 则需要在文件名前加上 \texttt{-shell-scape} 的命令行选项。
+%
+% 下面的命令用来生成用户手册:
+% \begin{shell}
+% $ xelatex -shell-escape thuthesis.dtx
% $ makeindex -s gind.ist -o thuthesis.ind thuthesis.idx
-% $ makeindex -s gglo.ist -o thuthesis.gls thuthesis.glo
-% $ xelatex thuthesis.dtx
-% $ xelatex thuthesis.dtx # 生成说明文档 thuthesis.pdf
+% $ xelatex -shell-escape thuthesis.dtx
+% $ xelatex -shell-escape thuthesis.dtx # 生成说明文档 thuthesis.pdf
% \end{shell}
%
% \subsection{升级}
% \label{sec:upgrade}
% 如果需要升级 \thuthesis{},应当从 GitHub 下载最新的版本,
-% 将 \file{thuthesis.dtx},\file{thuthesis.ins},\file{tsinghua.pdf} 和
+% 将 \file{thuthesis.dtx},\file{thuthesis.ins},\file{tsinghua-name-bachelor.pdf} 和
% \file{thuthesis-*.bst} 拷贝至工作目录覆盖相应的文件,然后按照
% 第~\ref{sec:generate-cls} 节的内容生成新的模板和使用说明。
%
@@ -251,23 +287,18 @@
% \subsection{示例文件}
% \label{sec:userguide}
%
-% 模板核心文件
-% 有:\file{thuthesis.cls},\file{thuthesis-numeric.bst},
-% \file{thuthesis-author-year.bst} 和 \file{tsinghua.pdf},
+% 模板核心文件有:\file{thuthesis.cls},\file{tsinghua-name-bachelor.pdf},
+% \file{thuthesis-*.bst}(\hologo{BibTeX}),
+% \file{thuthesis-*.bbx} 和 \file{thuthesis-*.cbx}(BibLaTeX),
% 但如果没有示例文档会较难下手,所以推荐从模板自带的示例文档入手。其中包括了论文
% 写作用到的所有命令及其使用方法,只需用自己的内容进行相应替换就可以。对于不清
% 楚的命令可以查阅本手册。下面的例子描述了模板中章节的组织形式,来自于示例文档,
-% 具体内容可以参考模板附带的 \file{main.tex} 和 \file{data/}。
-%
-% \lstinputlisting[style=lstStyleLaTeX]{main.tex}
-%
-% 其中 \file{thusetup.tex} 包括了论文基本信息的配置样例:
-%
-% \lstinputlisting[style=lstStyleLaTeX]{thusetup.tex}
+% 具体内容可以参考模板附带的 \file{thuthesis-example.tex} 和 \file{data/}。
%
% \subsection{论文选项}
% \label{sec:option}
%
+% \subsubsection{学位}
% \DescribeOption{degree}
% 选择学位,可选:
% \option{bachelor},\option{master},\option{doctor}(默认),\option{postdoc}。
@@ -280,23 +311,13 @@
%
% \subsubsection{学位类型}
% \label{sec:degree-type}
+% \DescribeOption{degree-type}
% 定义研究生学位的类型,可选:\option{academic}(默认)、\option{professional},
% 本科生不受影响。
% \begin{latex}
% \documentclass[degree=master, degree-type=professional]{thuthesis}
% \end{latex}
%
-% \DescribeOption{language}
-% 论文全文的主要语言。可选:\option{chinese}(默认),\option{english}。
-%
-% 注意,本科生《写作指南》要求“本科生(含国外来华留学本科生)非外语专业论文统一要求
-% 用中文书写。”研究生《写作指南》要求“外国人来华留学生可以用英文撰写学位论文,但
-% 须采用中文封面”,“除留学生外,学位论文一律须用汉语书写”,用户须提前与导师和院系
-% 的审查教师协商使用何种语言书写论文。
-% \begin{latex}
-% \documentclass[degree=bachelor, language=english]{thuthesis}
-% \end{latex}
-%
% \subsection{字体配置}
% \label{sec:font-config}
% 模板默认可以自动检测操作系统,并配置改平台上合适的字体,
@@ -339,10 +360,8 @@
% 允许的选项有 \option{windows}、\option{mac}、\option{fandol},详
% 见 \pkg{ctex}、\pkg{xeCJK}、\pkg{fontspec} 等宏包的使用说明。
%
-% \subsection{封面信息}
-% \label{sec:titlepage}
-% 封面信息可以通过统一设置命令 \cs{thusetup} 设置 \emph{key=value} 形式完成;
-% 带 * 号的键通常是对应的英文。
+% \subsection{论文设置}
+% 论文的设置可以通过统一命令 \cs{thusetup} 设置 \emph{key=value} 形式完成。
%
% \DescribeMacro{\thusetup}
% \cs{thusetup} 用法与常见 \emph{key=value} 命令相同,如下:
@@ -361,6 +380,48 @@
% \note[注意:]{\cs{thusetup} 使用 \pkg{kvsetkeys} 机制,所以配置项之间不能有空行,否则
% 会报错。}
%
+% \subsubsection{输出格式}
+% \DescribeOption{output}
+% 选择输出的格式是打印版还是电子版(用于提交),可选:\option{print}(默认)、\option{electronic}。
+% 一些院系要求提交的电子版不含空白页,但是这对打印并不友好,
+% 比如正文第一页可能会在左侧;以及一些部分需要单面打印,需要插入空白页。
+% 注意在不同选项下,生成的声明页码很可能不同。为了避免页码错误,
+% \thuthesis{}将会在插入扫描的 PDF 文件时自动生成页码,因此\textbf{扫描声明页时请移除底部的页码},以防重叠。
+%
+% \begin{latex}
+% \thusetup{
+% output = electronic,
+% }
+% \end{latex}
+%
+% 另外本科生要求有 0.2cm 留给装订线的宽度,这只有在打印版中才会生效。
+%
+%
+% \subsubsection{书写语言}
+% \DescribeOption{language}
+% 在导言区设置 \option{language} 会修改论文的主要语言,如章节标题等。
+% 在正文中设置 \option{language} 只修改接下来部分的书写语言,
+% 如标点格式、图表名称,但不影响章节标题等。
+%
+% \begin{latex}
+% \thusetup{
+% language = english,
+% }
+% \end{latex}
+%
+% 论文的一些部分(如英文摘要、本科生的外文调研报告)要求使用特定的语言,
+% 模板已经进行配置,并在这些部分结束后自动恢复为主要语言。
+%
+% 注意,本科生《写作指南》要求“本科生(含国外来华留学本科生)非外语专业论文统一要求
+% 用中文书写。”研究生《写作指南》要求“外国人来华留学生可以用英文撰写学位论文,但
+% 须采用中文封面”,“除留学生外,学位论文一律须用汉语书写”,用户须提前与导师和院系
+% 的审查教师协商使用何种语言书写论文。
+%
+% \subsection{封面信息}
+% \label{sec:titlepage}
+% 封面信息可以通过统一设置命令 \cs{thusetup} 设置 \emph{key=value} 形式完成;
+% 带 * 号的键通常是对应的英文。
+%
% \subsubsection{论文标题}
% 中英文标题。可以在标题内部使用换行|\\|。
% \begin{latex}
@@ -415,7 +476,7 @@
% \item 学术型学位:获得一级学科授权的学科填写一级学科名称,其他填写二级学科名称;
% \item 工程硕士:工程领域名称;
% \item 其他专业型学位:-
-% \item 本科生:-
+% \item 本科生:专业名称,第二学位论文需标注“(第二学位)”
% \end{itemize}
%
% \begin{latex}
@@ -454,7 +515,7 @@
% \end{latex}
%
% \myentry{联合导师}
-% 硕士生联合指导教师,博士生联合导师。
+% 硕士生、本科生联合指导教师,博士生联合导师。
% \begin{latex}
% \thusetup{
% joint-supervisor = {联合导师姓名, 教授},
@@ -476,7 +537,7 @@
% \begin{latex}
% \thusetup{
% secret-year = 10,
-% secret-level = {内部},
+% secret-level = {秘密},
% }
% \end{latex}
%
@@ -502,14 +563,30 @@
%
% \subsection{前言部分}
%
+% \subsubsection{指导小组、公开评阅人和答辩委员会名单}
+% \myentry{答辩委员会名单}
+% \DescribeEnv{committee}
+% 学位论文指导小组、公开评阅人和答辩委员会名单可以由 \env{committee} 环境生成,
+% 其中的可选参数可以使用 \option{name} 根据是有无指导小组设置合适的标题,比如
+% \begin{latex}
+% \begin{committee}[name={学位论文公开评阅人和答辩委员会名单}]
+% ...
+% \end{committee}
+% \end{latex}
+%
+% 答辩委员会名单中的表格使用 LaTeX 生成可能略麻烦,也可以导入 Word 版转成的 PDF 文件,
+% \begin{latex}
+% \begin{committee}[file=figures/committee.pdf]
+% \end{committee}
+% \end{latex}
+%
% \subsubsection{授权说明}
% \myentry{授权说明}
% \DescribeMacro{\copyrightpage}
-% 生成授权说明。用法:\cs{copyrightpage}\oarg{file}。
% 可选参数为扫描得到的 PDF 文件名,例如:
% \begin{latex}
-% % 将签字扫描后授权文件 scan-auth.pdf 替换原始页面
-% \copyrightpage[scan-auth.pdf]
+% % 将签字扫描后授权文件 scan-copyright.pdf 替换原始页面
+% \copyrightpage[file=scan-copyright.pdf]
% \end{latex}
%
% \subsubsection{摘要}
@@ -540,7 +617,7 @@
% \end{latex}
%
% \subsubsection{目录和索引表}
-% 目录、插图、表格和公式等索引命令分别如下,将其插入到期望的位置即可(带*的命令表
+% 目录、插图、表格、公式和算法等索引命令分别如下,将其插入到期望的位置即可(带*的命令表
% 示对应的索引表不会出现在目录中):
%
% \DescribeMacro{\tableofcontents}
@@ -550,6 +627,8 @@
% \DescribeMacro{\listoftables*}
% \DescribeMacro{\listofequations}
% \DescribeMacro{\listofequations*}
+% \DescribeMacro{\listofalgorithms}
+% \DescribeMacro{\listofalgorithms*}
% \begin{longtable}{ll}
% \toprule
% {\heiti 用途} & {\heiti 命令} \\\midrule
@@ -559,9 +638,25 @@
% 表格索引 & \cs{listoftables} \\
% & \cs{listoftables*} \\\midrule
% 公式索引 & \cs{listofequations} \\
-% & \cs{listofequations*}\\\bottomrule
+% & \cs{listofequations*}\\\midrule
+% 算法索引 & \cs{listofalgorithms} \\
+% & \cs{listofalgorithms*}\\\bottomrule
% \end{longtable}
%
+% \DescribeOption{toc-chapter-style}
+% 本科生《写作指南》关于目录章标题要求“目录从第 1 章开始,每章标题用黑体小四号字”,
+% 所以其中的西文和数字默认使用 Arial 字体,跟正文的章标题一致。
+% 但是论文样例\footnote{
+% \url{http://www.law.tsinghua.edu.cn/publish/law/7024/2012/20120216153516317135347/20120216153516317135347_.html}
+% }的目录章标题的西文和数字却使用了 Times。
+% 如果审查老师这样要求,需要在生成目录前设置
+% \begin{latex}
+% \thusetup{
+% toc-chapter-style = times,
+% }
+% \end{latex}
+% 该选项只对本科生有效。
+%
% \LaTeX{} 默认支持插图和表格索引,是通过 \cs{caption} 命令完成的,因此它们必须出
% 现在浮动环境中,否则不被计数。
%
@@ -569,10 +664,6 @@
% 个命令不会给表格编号,也就是出来的只有标题文字而没有“表~xx”,“图~xx”,否则
% 索引里面序号不连续就显得不伦不类,这也是 \LaTeX{} 里星号命令默认的规则。
%
-% 有这种需求的多是本科同学的英文资料翻译部分,如果你觉得附录中英文原文中的表格和
-% 图片显示成“表”和“图”很不协调的话,一个很好的办法还是用 \cs{caption*},参数
-% 随便自己写,具体用法请参看示例文档。
-%
% 如果的确想让其编号,但又不想出现在索引中的话,目前模板暂不支持。
%
% 公式索引为本模板扩展,模板扩展了 \pkg{amsmath} 几个内部命令,使得公式编号样式和
@@ -637,8 +728,36 @@
%
% \subsection{正文部分}
%
-% \subsubsection{数学环境}
+% \subsubsection{数学符号}
% \label{sec:math}
+% 数学符号应遵循 GB/T 3102.11—1993《物理科学和技术中使用的数学符号》
+% 模板中使用 \pkg{unicode-math} 宏包来配置数学符号,
+% 与 \LaTeX{} 默认的英美国家的符号习惯有所差异:
+% \newcommand\dif{\mathop{}\!\mathrm{d}}
+% \begin{enumerate}
+% \item 大写希腊字母默认为斜体,如 \cs{Delta}:$\Delta$。
+% \item 有限增量符号 $\increment$(U+2206)应使用 \pkg{unicode-math} 宏包提供的
+% \cs{increment} 命令。
+% \item 向量、矩阵和张量要求粗斜体,应使用 \cs{symbf} 命令,
+% 如 \verb|\symbf{A}|、\verb|\symbf{\alpha}|。
+% \item 数学常数和特殊函数要求用正体,应使用 \cs{symup} 命令,
+% 如 $\symup{\pi} = 3.14\dots$; $\symup{e} = 2.718\dots$,
+% \item 微分号和积分号使用使用正体,比如 $\int f(x) \dif x$。
+% \end{enumerate}
+%
+% 关于数学符号更多的用法,参考
+% \href{http://mirrors.ctan.org/macros/latex/contrib/unicode-math/unicode-math.pdf}{\pkg{unicode-math}}
+% 宏包的使用说明,
+% 全部数学符号命的令参考
+% \href{http://mirrors.ctan.org/macros/latex/contrib/unicode-math/unimath-symbols.pdf}{\pkg{unimath-symbols}}。
+%
+% 注意,\pkg{unicode-math} 宏包与 \pkg{amsfonts}、\pkg{amssymb}、\pkg{bm}、
+% \pkg{mathrsfs}、\pkg{upgreek} 等宏包\emph{不}兼容。
+% 模板作了处理,用户可以直接使用这些宏包的命令,如 \cs{bm}、\cs{mathscr}、
+% \cs{uppi}。
+%
+% \subsubsection{定理环境}
+% \label{sec:theorem}
% \thuthesis{} 定义了常用的数学环境:
%
% \begin{center}
@@ -695,6 +814,9 @@
% (\cs{bibliographystyle},见第~\ref{sec:bibliography} 节)时,
% 正文中引用文献的标注会自动调整为对应的格式。
%
+% 如果需要标出引文的页码,可以写在 \cs{cite} 的可选参数中,如
+% |\cite[42]{knuth84}|。
+%
% \paragraph{顺序编码制}
% \DescribeMacro{\inlinecite}
% 顺序编码制的参考文献引用分为两种模式:
@@ -705,78 +827,126 @@
%
% \DescribeOption{cite-style}
% 用户可以将引用标注的格式设为正文模式:
-%
% \begin{latex}
% \thusetup{
% cite-style = inline,
% }
% \end{latex}
-%
% 也可以使用 \cs{inlinecite}\marg{key} 临时使用正文模式的引用标注。
%
% \paragraph{著者-出版年制}
-% 著者-出版年制的参考文献引用有三种模式:
+% 著者-出版年制的参考文献引用有两种模式:
% \begin{enumerate}
% \item \cs{citep}:著者与年份均在括号中,比如“(Zhang, 2008)”,
% 同默认的 \cs{cite} 命令;
% \item \cs{citet}:著者姓名作为正文的一部分,比如“Zhang (2008)”;
-% \item \cs{citeyear}:只插入年份,但不含括号,比如“2008”。
% \end{enumerate}
%
-% 关于参考文献引用的更多细节参考 \pkg{natbib} 的文档。
+% 另外,\pkg{natbib} 还提供了其他方便引用的命令,
+% 比如 \cs{citeauthor}、\cs{citeyear} 等,
+% 更多细节参考 \pkg{natbib} 的文档。
%
% \subsection{其他部分}
%
% \subsubsection{参考文献}
% \label{sec:bibliography}
%
-% 模板支持使用 \hologo{BibTeX} 处理生成参考文献表,
-% 用户需要在文中设置参考文献格式并调用 \file{.bib} 数据库:
+% 参考文献通常可以使用 \hologo{BibTeX} 或 biblatex 生成。
+% \hologo{BibTeX} 是 LaTeX 处理参考文献的传统的方式,
+% 需要在使用 \cs{bibliographystyle}\marg{style} 选择样式
+% 并用 \cs{bibliography} 设置 \file{.bib} 的路径。
+% 然后使用 \texttt{bibtex} 对 \file{.aux} 文件进行编译得到 \file{.bbl} 文件。
+% 其中的参考文献表内容会在后续编译时替换到 \cs{bibliography} 的位置。
+% Biblatex 是较新的方式,需要在载入宏包时通过 \option{style} 选择样式,
+% 在导言区使用 \cs{addbibresource} 声明数据库的路径,
+% 并在输出参考文献表的位置使用 \cs{printbibliography} 命令,
+% 而且编译参考文献的命令需要换为 biber。
+% 这两种方式各有优缺点,比如 BibTeX 无法对中文按照拼音排序,一些样式更新不够及时;
+% Biblatex 运行较缓慢,无法对多个参考文献表使用不同样式。
+% 用户需要根据实际选择合适的方式。
+%
+% 研究生要求的参考文献格式基于《信息与文献 参考文献著录规则》(GB/T 7714—2015)
+% 进行了少量改编(如英文姓名不使用全大写),
+% 可以选择“顺序编码制”和“著者-出版年制”。
+% 如果使用 BibTeX 的方式,需要在导言区载入 \pkg{natbib} 宏包并选择样式,如:
% \begin{latex}
-% \bibliographystyle{thuthesis-numeric} % 顺序编码制
-% % \bibliographystyle{thuthesis-author-year} % 著者-出版年制
-% % \bibliographystyle{thuthesis-bachelor} % 本科生参考文献的著录格式
-% \bibliography{ref1,ref2} % 载入 ref1.bib 和 ref2.bib
+% % 顺序编码制
+% \usepackage[sort]{natbib}
+% \bibliographystyle{thuthesis-numeric}
% \end{latex}
-%
-% \note[注意:]{\cs{bibliographystyle} 命令只能出现一次。}
-%
-% \hologo{BibTeX} 可以自动识别数据库中每条文献的语言,并自动处理文献类型和载体类
-% 型标识,用户也可以手动指定,如:
-%
+% 或
% \begin{latex}
-% @misc{citekey,
-% language = {japanese},
-% mark = {Z},
-% medium = {DK},
-% ...
-% }
+% % 著者-出版年制
+% \usepackage{natbib}
+% \bibliographystyle{thuthesis-author-year}
% \end{latex}
+% 其中的 \option{sort} 选项会将同一处引用的多个文献编号严格按照顺序排序,
+% 这并非《写作指南》要求,但是推荐使用。
+% 这里调用的样式由 \href{http://ctan.org/pkg/gbt7714}{\pkg{gbt7714}} 的 \file{.bst} 进行了少量修改。
%
-% 可选的语言有 \option{english}, \option{chinese}, \option{japanese} 和 \option{russian}。
-%
-% 国标规定参考文献表采用“著者-出版年”制组织时,各篇文献首先按文种集中,然后按著者字
+% 参考文献表采用“著者-出版年”制组织时,各篇文献首先按文种集中,然后按著者字
% 顺和出版年排列;中文文献可以按著者汉语拼音字顺排列,也可以按著者的笔画笔顺排列。
-% 由于 \hologo{BibTeX} 功能的局限性,无法自动获取著者姓名的拼音或笔画笔顺,所
-% 以\emph{必须}在 \file{.bib} 数据库中的 |key| 字段手动录入著者姓名的拼音,如:
+% 但由于 \hologo{BibTeX} 功能的局限性,无法自动获取著者姓名的拼音或笔画笔顺进行正确排序。
+% 一种解放方法是在 \file{.bib} 数据库的中文文献的 |key| 域手动录入著者姓名的拼音,
+% 这比较适合中文文献数量较少的情况,如:
% \begin{latex}
% @book{capital,
% author = {马克思 and 恩格斯},
-% key = {ma3 ke4 si1 en1 ge2 si1}, % 名字之间用 2 或 3 个空格
+% key = {ma3 ke4 si1 & en1 ge2 si1},
% ...
% }
% \end{latex}
+% 另一种方式是使用 biblatex,应在在导言区设置
+% \begin{latex}
+% \usepackage[backend=biber,style=thuthesis-author-year]{biblatex}
+% \addbibresource{ref/refs.bib}
+% \end{latex}
+% 这里的样式由 \href{https://ctan.org/pkg/biblatex-gb7714-2015}{biblatex-gb7714-2015} 进行了少量改编,
+% 一些额外用法可以参考该宏包的文档。
+% 注意 \pkg{biblatex} 跟 \pkg{natbib} 不兼容,
+% 而且 \cs{addbibresource} 必须在导言区设置。
+% 输出参考文献表应使用 \cs{printbibliography} 命令。
+%
+% 本科生要求的中文参考文献格式严格遵从 GB/T 7714—2015,
+% 附录中调研报告的英文参考文献可以自行选择合适的风格。
+% 但是 biblatex 不支持同一文档中使用不同的格式,
+% 所以只能使用 \hologo{BibTeX}:
+% \begin{latex}
+% % 本科生参考文献的著录格式
+% \usepackage[sort]{natbib}
+% \bibliographystyle{thuthesis-bachelor}
+% \end{latex}
+% 调研报告的参考文献需要选择与 \pkg{natbib} 兼容的样式。
%
-% \hologo{BibTeX} 对自定义样式的支持比较有限,所以用户只能通过修改 \file{bst} 文
-% 件来修改文献列表的格式。本宏包提供了一些接口供用户更方便地修改,在 \file{bst}
-% 文件开始处的 |load.config| 函数中,有一组配置参数用来控制样式。若变量被设
-% 为 |#1| 则表示该项被启用,设为 |#0| 则不启用。默认的值是严格遵循学校规定的配
-% 置。
+% 本科生外文系要求使用 APA 或 MLA。
+% APA 的 BibTeX 样式由 \pkg{apacite} 宏包提供,需要在导言区调用:
+% \begin{latex}
+% \usepackage[natbibapa]{apacite}
+% \bibliographystyle{apacite}
+% \end{latex}
+% 其中 \option{natbibapa} 会调用 \pkg{natbib} 来处理引用,
+% 这也是宏包推荐的用法。
+% 注意目前的 \pkg{apacite} 只支持到 APA 第 6 版。
+% 更推荐使用已经更新到 APA 第 7 版的 \pkg{biblatex-apa}:
+% \begin{latex}
+% \usepackage[style=apa]{biblatex}
+% \addbibresource{refs-apa.bib}
+% \end{latex}
+% 注意,如果参考文献中引用了中文文献的话,这两种方法都不能正确调整格式,
+% 需要手动进行修改 \file{.bbl} 文件的内容,
+% 这时 BibTeX 比 biblatex 更简单些。
%
+% BibTeX 没有用于 MLA 的样式,所以对于 MLA 只能使用 biblatex:
+% \begin{latex}
+% \usepackage[style=mla-new]{biblatex}
+% \addbibresource{refs-apa.bib}
+% \end{latex}
+% 注意这里 \option{mla-new} 对应于 MLA 第 8 版的格式,
+% \option{mla} 是第 7 版的。
%
% \subsubsection{致谢}
%
-% \DescribeEnv{acknowledgement}
+% \DescribeEnv{acknowledgements}
% 把致谢做成一个环境更好一些,直接往里面写感谢的话就可以啦。
%
% \begin{latex}
@@ -791,8 +961,19 @@
% 如果使用声明扫描页,将可选参数指定为扫描后的 PDF 文件名,例如:
%
% \begin{latex}
-% \statement[scan-statement.pdf]
+% \statement[file=scan-statement.pdf]
+% \end{latex}
+%
+% 由于打印版和电子版有空白页的差别,声明的页码可能不同。
+% 所以编译声明页时默认不加页眉和页脚(\texttt{page-style=empty}),
+% 在签字后插入扫描页时再补上页眉和页脚,防止页码冲突。
+%
+% 如果需要编译时也加页码(如直接对电子版进行签名而不是插入扫描页),
+% 可以使用在 \cs{statement} 命令设置
+% \begin{latex}
+% \statement[page-style=plain]
% \end{latex}
+% 注意,插入扫描页总是会加页码,不受该选项控制。
%
% \subsubsection{附录}
%
@@ -818,108 +999,130 @@
% 本科生《写作指南》要求附录 A 为外文资料的调研阅读报告或书面翻译,二者择一。
% 调研报告(或书面翻译)的题目和参考文献是独立于论文的,相当一篇独立的小文章,
% 所以模板相应定义了 \env{survey} 和 \env{translation}。在这两个环境内部可以
-% 像论文正文一样使用标题和参考文献的命令,但不会影响外部:
+% 像论文正文一样使用标题和参考文献的命令,但不会影响外部。
+% 但是需要使用 \hologo{BibTeX} 对 \file{*-survey.aux} 或者
+% \file{*-translation.aux} 进行编译,才能生成参考文献(见 \ref{sec:xelatex} 节)。
+% 如果使用 \texttt{latexmk},则无需额外处理。
+%
+% 同时,阅读报告默认切换书写语言为英语,书面翻译默认切换为中文。
+% 如有需要,可以通过 \cs{thusetup} 的 \option{language} 参数再次更改。
%
% \begin{latex}
% \begin{survey}
% \title{...}
% \maketitle
-% ... \cite{...}
+% \tableofcontents
+% ... \cite{...} % 报告内容及其引用
% \bibliographystyle{...}
-% \bibliography{...}
+% \bibliography{...} % 报告的参考文献
% \end{survey}
% \end{latex}
%
-% 书面翻译对应的原文索引的实际作用更接近参考文献,所以也用参考文献的机制来生成,
-% 但是在正文中并不引用。
+% “书面翻译对应的原文索引”区别于译文的参考文献,需要使用 \env{translation-index}
+% 环境,另外需要使用 \hologo{BibTeX} 编译 \file{*-index.aux},\texttt{latexmk} 同样会自动处理。
%
% \begin{latex}
% \begin{translation}
-% ... \nocite{...}
+% ... \cite{...} % 书面翻译内容及其引用
% \bibliographystyle{...}
-% \bibliography{...}
+% \bibliography{...} % 书面翻译的参考文献
+% \begin{translation-index}
+% \nocite{...}
+% \bibliographystyle{...}
+% \bibliography{...} % 书面翻译对应的原文索引
+% \end{translation-index}
% \end{translation}
% \end{latex}
%
-% \subsubsection{简历}
+% \subsubsection{个人简历、在学期间完成的相关学术成果}
% \DescribeEnv{resume}
-% 开启个人简历章节,包括个人简历,发表文章,研究成果列表等。每个子项目请
-% 用以下对应命令开启:\cs{xxxitem}\marg{subtitle}。
+% 研究生的标题为为“个人简历、在学期间完成的相关学术成果”,
+% 本科生的标题为“在学期间参加课题的研究成果”或“PUBLICATIONS”。
%
-% \DescribeMacro{\resumeitem}
-% 个人简历,用法:\cs{resumeitem}\{个人简历\}。简历内容部分没有格式要求,正常段
-% 落排版。
+% \DescribeEnv{achievements}
+% 本章的其他标题同样使用 \cs{section*},\cs{subsection*} 等命令生成,
+% 研究成果用 \env{achievements} 环境罗列。
%
-% \DescribeMacro{\researchitem}
-% 发表学术论文,用法:\cs{researchitem}\marg{类别},包括“学术论文”和“研究成果”两
-% 个类别。分别用 \env{publications} 和 \env{achievements} 罗列。
+% \begin{latex}
+% \begin{resume}
+% \section*{个人简历}
+% ……
+%
+% \section*{在学期间完成的相关学术成果}
+%
+% \subsection*{学术论文}
+% \begin{achievements}
+% \item ……
+% \item ……
+% \end{achievements}
+%
+% \subsection*{专利}
+% \begin{achievements}
+% \item ……
+% \item ……
+% \end{achievements}
+% \end{resume}
+% \end{latex}
%
-% \DescribeEnv{publications}
-% \DescribeMacro{\publicationskip}
-% 用 \env{publications} 环境进行罗列发表的论文。按照学校要求,在学期间发表的学术
-% 论文分以下三部分按顺序分别列出,每部分之间空 1 行,序号可连续排列:
-% \begin{enumerate}
-% \item 已经刊载的学术论文(本人是第一作者,或者导师为第一作者本人是第二作者)
-% \item 尚未刊载,但已经接到正式录用函的学术论文(本人为第一作者,或者导师为第一
-% 作者本人是第二作者)。
-% \item 其他学术论文。可列出除上述两种情况以外的其他学术论文,但必须是已经刊载或
-% 者收到正式录用函的论文。
-% \end{enumerate}
+% \subsubsection{综合论文训练记录表}
+% \DescribeMacro{\record}
+% 本科生需要在最后附上综合论文训练记录表,可以用如下命令:
%
-% \env{publications} 环境支持每一部分分别编写,逻辑上更清楚,为了在环境之间支持
-% 空行,需要利用 \cs{publicationskip} 控制。示例:
% \begin{latex}
-% \researchitem{发表的学术论文}
-%
-% % 1. 已经刊载的学术论文
-% \begin{publications}
-% \item Yang Y, Ren T L, Zhang L T, et al. Miniature microphone with
-% silicon-based ferroelectric thin films. Integrated Ferroelectrics,
-% 2003, 52:229-235. (SCI 收录, 检索号:758FZ.)
-% \item 杨轶, 张宁欣, 任天令, 等. 硅基铁电微声学器件中薄膜残余应力的研究. 中国机
-% 械工程, 2005, 16(14):1289-1291. (EI 收录, 检索号:0534931 2907.)
-% \item 杨轶, 张宁欣, 任天令, 等. 集成铁电器件中的关键工艺研究. 仪器仪表学报,
-% 2003, 24(S4):192-193. (EI 源刊.)
-% \end{publications}
-%
-% % 2. 尚未刊载,但已经接到正式录用函的学术论文
-% \begin{publications}[before=\publicationskip,after=\publicationskip]
-% \item Yang Y, Ren T L, Zhu Y P, et al. PMUTs for handwriting
-% recognition. In press. (已被 Integrated Ferroelectrics 录用. SCI 源刊.)
-% \end{publications}
-%
-% % 3. 其他学术论文。
-% \begin{publications}
-% \item Wu X M, Yang Y, Cai J, et al. Measurements of ferroelectric
-% MEMS microphones. Integrated Ferroelectrics, 2005, 69:417-429.
-% (SCI 收录, 检索号:896KM)
-% \item 贾泽, 杨轶, 陈兢, 等. 用于压电和电容微麦克风的体硅腐蚀相关研究. 压电与声
-% 光, 2006, 28(1):117-119. (EI 收录, 检索号:06129773469)
-% \item 伍晓明, 杨轶, 张宁欣, 等. 基于MEMS技术的集成铁电硅微麦克风. 中国集成电路,
-% 2003, 53:59-61.
-% \end{publications}
+% \record{file=scan-record.pdf}
% \end{latex}
%
-% \DescribeEnv{achievements}
-% 研究成果用 \cs{researchitem}\{研究成果\} 开启,随后用 \env{achievements} 环
-% 境罗列。
-%
-% 具体用法请参看示例文档 \file{data/resume.tex}。
%
% \subsection{书脊}
% \DescribeMacro{\spine}
-% 生成装订的书脊,为竖排格式,命令格式:\cs{spine}\oarg{标题}\oarg{作者}。默认参
-% 数为论文中文题目和中文作者。如果中文题目中没有英文字母,那么直接调用此命令即可。
-% 否则,可参考参看模板示例文件 \file{spine.tex} 进行微调:
+% \DescribeOption{spine-font}
+% \DescribeOption{spine-title}
+% \DescribeOption{spine-author}
+% 生成装订的书脊,为竖排格式。内容默认使用论文的标题和作者。
+% 可以设置 \option{spine-title} 和 \option{spine-author} 来修改。
+%
+% 书脊字体默认为三号字,同研究生的示例一致。
+% 本科生要求字体大小根据论文的薄厚而定,可以使用 \option{spine-font} 设置字号。
+% \begin{latex}
+% \thusetup{
+% spine-font = {\Huge},
+% spine-title = {书脊的标题},
+% spine-author = {书脊的作者姓名},
+% }
+% \end{latex}
%
-% \lstinputlisting[style=lstStyleLaTeX]{spine.tex}
+% 由于 Fandol 字体在 \XeTeX 中的竖排存在一些问题,如果书脊使用的字体是 Fandol 仿宋
+%(\option{fontset} 为 \texttt{fandol} 或者 \texttt{ubuntu} 时),则它\textbf{必须作为独立文件生成},
+% 否则可能导致后续内容文字方向错乱的问题。
+%
+% \DescribeOption{include-spine}
+% 一些院系要求把书脊插进论文里,需要在 \cs{maketitle} 前设置。
+% \begin{latex}
+% \thusetup{
+% include-spine = true,
+% }
+% \end{latex}
+% 打开此选项后,书籍会出现在中文封面后面的第一个空白页。如果有英文封面,则在英文封面之前。
+% 如果需要书籍出现在其他位置,请手工使用 \cs{spine} 生成,不要使用此命令。
%
+% 在使用 Fandol 仿宋时,如果打开 \option{include-spine} 选项,
+% 模板将使用 \cs{write18} 来生成独立的 \file{spine.tex},并调用 \XeLaTeX 进行排版后插入论文中。
+% 在这种情况下,请确保编译时打开了 shell escape 功能,或者在论文目录下放置编译完成的 \file{spine.pdf},
+% 否则编译将因为无法正常生成书脊而失败。
%
% \section{致谢}
% \label{sec:thanks}
% 感谢这些年来一直陪伴 \thuthesis{} 成长的新老同学!
%
-% 欢迎各位到 \href{http://github.com/xueruini/thuthesis/}{\thuthesis{} GitHub 主页}贡献!
+% 欢迎各位到 \href{http://github.com/tuna/thuthesis/}{\thuthesis{} GitHub 主页}贡献!
+%
+%
+% ^^A redefine some commands in markdown package to remove annoying section numbering
+% \renewcommand{\markdownRendererHeadingTwo}[1]{\subsection*{#1}}
+% \renewcommand{\markdownRendererHeadingThree}[1]{\subsubsection*{#1}}
+% ^^A render changelog from markdown
+% \markdownInput{CHANGELOG.md}
+%
%
% \StopEventually{\PrintIndex}
% \clearpage
@@ -928,15 +1131,55 @@
%
% \subsection{基本信息}
% \begin{macrocode}
-%<cls>\NeedsTeXFormat{LaTeX2e}
+%<cls>\NeedsTeXFormat{LaTeX2e}[2017/04/15]
%<cls>\ProvidesClass{thuthesis}
-%<cls>[2020/02/23 6.0.2 Tsinghua University Thesis Template]
+%<cls>[2020/10/14 7.1.0 Tsinghua University Thesis Template]
+% \end{macrocode}
+%
+% 报错
+% \begin{macrocode}
+\newcommand\thu@error[1]{%
+ \ClassError{thuthesis}{#1}{}%
+}
+\newcommand\thu@warning[1]{%
+ \ClassWarning{thuthesis}{#1}%
+}
+\newcommand\thu@patch@error[1]{%
+ \thu@error{Failed to patch command \protect#1}%
+}
+\newcommand\thu@deprecate[2]{%
+ \def\thu@@tmp{#2}%
+ \thu@warning{%
+ The #1 is deprecated%
+ \ifx\thu@@tmp\@empty\else
+ . Use #2 instead%
+ \fi
+ }%
+}
+% \end{macrocode}
+%
+% 检查 \LaTeXe{} kernel 版本
+% \begin{macrocode}
+\@ifl@t@r\fmtversion{2017/04/15}{}{
+ \thu@error{%
+ TeX Live 2017 or later version is required to compile this document%
+ }
+}
% \end{macrocode}
%
% 检查编译引擎,要求使用 \XeLaTeX。
% \begin{macrocode}
-\RequirePackage{ifxetex}
-\RequireXeTeX
+\RequirePackage{iftex}
+\ifXeTeX\else
+ \thu@error{XeLaTeX is required to compile this document}
+\fi
+% \end{macrocode}
+%
+% 载入用于测试的配置。
+% \begin{macrocode}
+\InputIfFileExists{thuthesis-pdf-test-config.tex}{}{
+ \InputIfFileExists{thuthesis-log-test-config.tex}{}{}
+}
% \end{macrocode}
%
% \subsection{定义选项}
@@ -946,7 +1189,7 @@
%<*cls>
\hyphenation{Thu-Thesis}
\def\thuthesis{ThuThesis}
-\def\version{6.0.2}
+\def\version{7.1.0}
\RequirePackage{kvdefinekeys}
\RequirePackage{kvsetkeys}
\RequirePackage{kvoptions}
@@ -956,18 +1199,11 @@
setkeys=\kvsetkeys}
% \end{macrocode}
%
-% 用 \pkg{kvoptions} 的 \emph{key=value} 方式来设置论文类型。
-% \begin{macrocode}
-\newcommand\thu@error[1]{%
- \ClassError{thuthesis}{#1}{}%
-}
-% \end{macrocode}
-%
% \begin{macro}{\thusetup}
% 提供一个 \cs{thusetup} 命令支持 \emph{key-value} 的方式来设置。
% \begin{macrocode}
-\newcommand\thusetup{%
- \kvsetkeys{thu}%
+\newcommand\thusetup[1]{%
+ \kvsetkeys{thu}{#1}%
}
% \end{macrocode}
% \end{macro}
@@ -982,7 +1218,6 @@
% <choice2>,
% },
% default = <default>,
-% code = <code>,
% },
% }
% \end{latex}
@@ -1010,9 +1245,6 @@
\kv@define@key{thu@value}{name}{%
\@namedef{thu@#1@@name}{##1}%
}%
- \kv@define@key{thu@value}{code}{%
- \@namedef{thu@#1@@code}{##1}%
- }%
% \end{macrocode}
%
% 由于在定义接口时,\cs{thu@\meta{key}@@code} 不一定有定义,
@@ -1022,15 +1254,6 @@
% \begin{macrocode}
\@namedef{thu@#1@@check}{}%
\@namedef{thu@#1@@code}{}%
- \@namedef{thu@#1@@hook}{%
- \expandafter\ifx\csname\@currname.\@currext-h@@k\endcsname\relax
- \@nameuse{thu@#1@@code}%
- \else
- \AtEndOfClass{%
- \@nameuse{thu@#1@@code}%
- }%
- \fi
- }%
% \end{macrocode}
%
% 保存下 |choices = {}| 定义的内容,在定义 \cs{thu@\meta{name}} 后再执行。
@@ -1084,7 +1307,6 @@
\expandafter\let\csname thu@\@nameuse{thu@#1@@name}\endcsname\thu@@default
\expandafter\ifx\csname thu@\@nameuse{thu@#1@@name}\endcsname\@empty\else
\@nameuse{thu@#1@@check}%
- \@nameuse{thu@#1@@hook}%
\fi
% \end{macrocode}
%
@@ -1094,7 +1316,7 @@
\kv@define@key{thu}{#1}{%
\@namedef{thu@\@nameuse{thu@#1@@name}}{##1}%
\@nameuse{thu@#1@@check}%
- \@nameuse{thu@#1@@hook}%
+ \@nameuse{thu@#1@@code}%
}%
}
% \end{macrocode}
@@ -1102,22 +1324,12 @@
% 定义接口向 |key| 添加 |code|:
%
% \begin{macrocode}
-\newcommand\thu@addto[2]{%
+\newcommand\thu@option@hook[2]{%
\expandafter\g@addto@macro\csname thu@#1@@code\endcsname{#2}%
}
% \end{macrocode}
%
% \begin{macrocode}
-\newif\ifthu@degree@graduate
-\newcommand\thu@set@graduate{%
- \thu@degree@graduatefalse
- \ifthu@degree@doctor
- \thu@degree@graduatetrue
- \fi
- \ifthu@degree@master
- \thu@degree@graduatetrue
- \fi
-}
\thu@define@key{
degree = {
choices = {
@@ -1127,7 +1339,6 @@
postdoc,
},
default = doctor,
- code = {\thu@set@graduate},
},
degree-type = {
choices = {
@@ -1138,7 +1349,18 @@
},
% \end{macrocode}
%
-% 论文是否使用英文。
+% 论文的主要语言。
+% \begin{macrocode}
+ main-language = {
+ name = main@language,
+ choices = {
+ chinese,
+ english,
+ },
+ },
+% \end{macrocode}
+%
+% 用于设置局部语言。
% \begin{macrocode}
language = {
choices = {
@@ -1146,9 +1368,98 @@
english,
},
},
+% \end{macrocode}
+%
+% 字体
+% \begin{macrocode}
+ fontset = {
+ choices = {
+ windows,
+ mac,
+ ubuntu,
+ fandol,
+ none,
+ },
+ default = none,
+ },
+ system = {
+ choices = {
+ mac,
+ unix,
+ windows,
+ auto,
+ },
+ default = auto,
+ },
+ font = {
+ choices = {
+ times,
+ termes,
+ xits,
+ libertinus,
+ lm,
+ auto,
+ none,
+ },
+ default = auto,
+ },
+ cjk-font = {
+ name = cjk@font,
+ choices = {
+ windows,
+ mac,
+ noto,
+ fandol,
+ auto,
+ none,
+ },
+ default = auto,
+ },
+ math-font = {
+ name = math@font,
+ choices = {
+ xits,
+ stix,
+ libertinus,
+ lm,
+ none,
+ },
+ default = xits,
+ },
+% \end{macrocode}
+%
+% 选择打印版还是用于上传的电子版。
+% \begin{macrocode}
+ output = {
+ choices = {
+ print,
+ electronic,
+ },
+ default = print,
+ },
+}
+\newif\ifthu@degree@graduate
+\newcommand\thu@set@graduate{%
+ \thu@degree@graduatefalse
+ \ifthu@degree@doctor
+ \thu@degree@graduatetrue
+ \fi
+ \ifthu@degree@master
+ \thu@degree@graduatetrue
+ \fi
+}
+\thu@set@graduate
+\thu@option@hook{degree}{%
+ \thu@set@graduate
}
% \end{macrocode}
%
+% 设置默认 \option{openany}。
+% \begin{macrocode}
+\DeclareBoolOption[false]{openright}
+\DeclareComplementaryOption{openany}{openright}
+% \end{macrocode}
+%
% \option{raggedbottom} 选项(默认打开)
% \begin{macrocode}
\DeclareBoolOption[true]{raggedbottom}
@@ -1164,10 +1475,19 @@
\ProcessKeyvalOptions*
% \end{macrocode}
%
+% 设置默认 \option{openany}。
+% \begin{macrocode}
+\ifthu@openright
+ \PassOptionsToClass{openright}{book}
+\else
+ \PassOptionsToClass{openany}{book}
+\fi
+% \end{macrocode}
+%
% 使用 \pkg{ctexbook} 类,优于调用 \pkg{ctex} 宏包。
% \begin{macrocode}
-\PassOptionsToPackage{quiet}{xeCJK}
-\LoadClass[a4paper,openany,UTF8,zihao=-4,scheme=plain]{ctexbook}
+\PassOptionsToPackage{quiet}{fontspec}
+\LoadClass[a4paper,UTF8,zihao=-4,scheme=plain,fontset=none]{ctexbook}[2017/04/01]
% \end{macrocode}
%
%
@@ -1177,9 +1497,28 @@
% 引用的宏包和相应的定义。
% \begin{macrocode}
\RequirePackage{etoolbox}
+\RequirePackage{filehook}
\RequirePackage{xparse}
% \end{macrocode}
%
+% \begin{macrocode}
+\RequirePackage{geometry}%
+% \end{macrocode}
+%
+% 利用 \pkg{fancyhdr} 设置页眉页脚。
+% \begin{macrocode}
+\RequirePackage{fancyhdr}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{titletoc}
+% \end{macrocode}
+%
+% 利用 \pkg{notoccite} 避免目录中引用编号混乱。
+% \begin{macrocode}
+\RequirePackage{notoccite}
+% \end{macrocode}
+%
% \AmSTeX\ 宏包,用来排出更加漂亮的公式。
% \begin{macrocode}
\RequirePackage{amsmath}
@@ -1228,6 +1567,7 @@
% \cs{makebox}\oarg{width}\oarg{s} 可能产生的 underful boxes。
% \begin{macrocode}
\RequirePackage{xeCJKfntef}
+\RequirePackage{soul}
% \end{macrocode}
%
% 表格控制
@@ -1240,31 +1580,41 @@
\RequirePackage{booktabs}
% \end{macrocode}
%
-% 参考文献引用宏包。
-% \begin{macrocode}
-\RequirePackage[sort&compress]{natbib}
-\RequirePackage{bibunits}
-% \end{macrocode}
-%
% \begin{macrocode}
\RequirePackage{url}
% \end{macrocode}
%
-% 设置 url 样式,与上下文一致
+% 如果用户在导言区未调用 \pkg{biblatex},则自动调用 \pkg{natbib}。
% \begin{macrocode}
-\urlstyle{same}
+\AtEndPreamble{
+ \@ifpackageloaded{biblatex}{}{
+ \@ifpackageloaded{apacite}{}{
+ \RequirePackage{natbib}
+ }
+ }
+}
+\AtEndOfPackageFile*{natbib}{
+ \@ifpackageloaded{apacite}{}{
+ \RequirePackage{bibunits}
+ }
+}
% \end{macrocode}
%
-% 使用 \pkg{xurl} 的方法,增加 URL 可断行的位置。
+% 对冲突的宏包报错。
% \begin{macrocode}
-\g@addto@macro\UrlBreaks{%
- \do0\do1\do2\do3\do4\do5\do6\do7\do8\do9%
- \do\A\do\B\do\C\do\D\do\E\do\F\do\G\do\H\do\I\do\J\do\K\do\L\do\M
- \do\N\do\O\do\P\do\Q\do\R\do\S\do\T\do\U\do\V\do\W\do\X\do\Y\do\Z
- \do\a\do\b\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j\do\k\do\l\do\m
- \do\n\do\o\do\p\do\q\do\r\do\s\do\t\do\u\do\v\do\w\do\x\do\y\do\z
+\newcommand\thu@package@conflict[2]{
+ \AtBeginOfPackageFile*{#2}{
+ \thu@error{The "#2" package is incompatible with required "#1"}
+ }
}
-\Urlmuskip=0mu plus 0.1mu
+\thu@package@conflict{unicode-math}{amscd}
+\thu@package@conflict{unicode-math}{amsfonts}
+\thu@package@conflict{unicode-math}{amssymb}
+\thu@package@conflict{unicode-math}{bbm}
+\thu@package@conflict{unicode-math}{bm}
+\thu@package@conflict{unicode-math}{eucal}
+\thu@package@conflict{unicode-math}{eufrak}
+\thu@package@conflict{unicode-math}{mathrsfs}
% \end{macrocode}
%
%
@@ -1281,39 +1631,44 @@
% 页眉距边界:1.5 厘米,页脚距边界:1.75 厘米。
%
% \begin{macrocode}
-\RequirePackage{geometry}
\geometry{
- a4paper, % 210 * 297mm
- nomarginpar,
+ paper = a4paper, % 210 * 297mm
+ marginparwidth = 2cm,
+ marginparsep = 0.5cm,
}
-\ifthu@degree@bachelor
- \geometry{
- top = 3.8cm,
- bottom = 3.2cm,
- left = 3.2cm,
- right = 3cm,
- headheight = 0.5cm,
- headsep = 1.8cm,
- footskip = 1.45cm,
- }
-\else
- \geometry{
- margin = 3cm,
- headheight = 0.5cm,
- headsep = 0.3cm,
- footskip = 0.8cm,
- }
-\fi
-% \end{macrocode}
-%
-% 利用 \pkg{fancyhdr} 设置页眉页脚。
-% \begin{macrocode}
-\RequirePackage{fancyhdr}
-% \end{macrocode}
-%
-% 利用 \pkg{notoccite} 避免目录中引用编号混乱。
-% \begin{macrocode}
-\RequirePackage{notoccite}
+\newcommand\thu@set@geometry{%
+ \ifthu@degree@bachelor
+ \geometry{
+ top = 3.8cm,
+ bottom = 3.2cm,
+ left = 3.2cm,
+ right = 3cm,
+ headheight = 0.5cm,
+ headsep = 1.8cm,
+ footskip = 1.45cm,
+ }%
+ \ifthu@output@print
+ \geometry{
+ left = 3.2cm,
+ right = 3cm,
+ }%
+ \else
+ \geometry{
+ hmargin = 3cm,
+ }%
+ \fi
+ \else
+ \geometry{
+ margin = 3cm,
+ headheight = 0.5cm,
+ headsep = 0.3cm,
+ footskip = 0.8cm,
+ }%
+ \fi
+}
+\thu@set@geometry
+\thu@option@hook{degree}{\thu@set@geometry}
+\thu@option@hook{output}{\thu@set@geometry}
% \end{macrocode}
%
% \subsection{主文档格式}
@@ -1324,10 +1679,22 @@
% 对于 \textsl{openright} 选项,必须保证章首页右开,且如果前章末页无内容须
% 清空其页眉页脚。
% \begin{macrocode}
-\let\thu@cleardoublepage\cleardoublepage
-\newcommand{\thu@clearemptydoublepage}{%
- \clearpage{\pagestyle{thu@empty}\thu@cleardoublepage}}
-\let\cleardoublepage\thu@clearemptydoublepage
+\def\cleardoublepage{%
+ \clearpage
+ \if@twoside
+ \ifthu@output@print
+ \ifodd\c@page
+ \else
+ \thispagestyle{empty}%
+ \hbox{}%
+ \newpage
+ \if@twocolumn
+ \hbox{}\newpage
+ \fi
+ \fi
+ \fi
+ \fi
+}
% \end{macrocode}
% \end{macro}
%
@@ -1337,24 +1704,24 @@
% 我们的单面和双面模式与常规的不太一样。
% \begin{macrocode}
\renewcommand\frontmatter{%
- \if@openright\cleardoublepage\else\clearpage\fi
+ \cleardoublepage
\@mainmatterfalse
- \ifthu@degree@bachelor
- \pagestyle{thu@plain}
- \else
- \pagestyle{thu@headings}
- \fi
\pagenumbering{Roman}%
- \let\@tabular\thu@tabular
}
\renewcommand\mainmatter{%
- \if@openright\cleardoublepage\else\clearpage\fi
+ \cleardoublepage
\@mainmattertrue
- \pagenumbering{arabic}
- \ifthu@degree@bachelor\pagestyle{thu@plain}\else\pagestyle{thu@headings}\fi}
+ \pagenumbering{arabic}%
+}
\renewcommand\backmatter{%
- \if@openright\cleardoublepage\else\clearpage\fi
- \@mainmattertrue}
+ \if@openright
+ \cleardoublepage
+ \else
+ \clearpage
+ \fi
+ \@mainmatterfalse
+ \thusetup{toc-depth = 0}%
+}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1364,39 +1731,215 @@
% \label{sec:font}
% 使用 \pkg{fontspec} 配置字体。
% \begin{macrocode}
-\newcommand\thu@fontset{\csname g__ctex_fontset_tl\endcsname}
-\ifthenelse{\equal{\thu@fontset}{fandol}}{
- \setmainfont[
+\ifthu@fontset@mac
+ \thusetup{
+ font = times,
+ cjk-font = mac,
+ }
+\else
+ \ifthu@fontset@windows
+ \thusetup{
+ font = times,
+ cjk-font = windows,
+ }
+ \else
+ \ifthu@fontset@fandol
+ \thusetup{
+ font = termes,
+ cjk-font = fandol,
+ }
+ \else
+ \ifthu@fontset@ubuntu
+ \thusetup{
+ font = termes,
+ cjk-font = noto,
+ }
+ \fi
+ \fi
+ \fi
+\fi
+% \end{macrocode}
+%
+% 检测系统
+% \begin{macrocode}
+\ifthu@system@auto
+ \IfFileExists{/System/Library/Fonts/Menlo.ttc}{
+ \thusetup{system = mac}
+ }{
+ \IfFileExists{/dev/null}{
+ \IfFileExists{null:}{
+ \thusetup{system = windows}
+ }{
+ \thusetup{system = unix}
+ }
+ }{
+ \thusetup{system = windows}
+ }
+ }
+\fi
+% \end{macrocode}
+%
+% XITS 字体于 2018-10-03 更改了字体的文件名,所以需要判断。
+% 原文件名为 \file{xits-regular.otf}、\file{xits-math.otf} 等,
+% 后改为 \file{XITS-Regular.otf}、\file{XITSMath-Regular.otf} 等。
+%
+% Libertinus 字体同样。
+% \begin{macrocode}
+\let\thu@font@family@xits\@empty
+\newcommand\thu@set@xits@names{%
+ \ifx\thu@font@family@xits\@empty
+ \IfFontExistsTF{XITSMath-Regular.otf}{%
+ \gdef\thu@font@family@xits{XITS}%
+ \gdef\thu@font@style@xits@rm{Regular}%
+ \gdef\thu@font@style@xits@bf{Bold}%
+ \gdef\thu@font@style@xits@it{Italic}%
+ \gdef\thu@font@style@xits@bfit{BoldItalic}%
+ \gdef\thu@font@name@xits@math@rm{XITSMath-Regular}%
+ \gdef\thu@font@name@xits@math@bf{XITSMath-Bold}%
+ }{%
+ \gdef\thu@font@family@xits{xits}%
+ \gdef\thu@font@style@xits@rm{regular}%
+ \gdef\thu@font@style@xits@bf{bold}%
+ \gdef\thu@font@style@xits@it{italic}%
+ \gdef\thu@font@style@xits@bfit{bolditalic}%
+ \gdef\thu@font@name@xits@math@rm{xits-math}%
+ \gdef\thu@font@name@xits@math@bf{xits-mathbold}%
+ }%
+ \fi
+}
+\let\thu@font@family@libertinus\@empty
+\newcommand\thu@set@libertinus@names{%
+ \ifx\thu@font@family@libertinus\@empty
+ \IfFontExistsTF{LibertinusSerif-Regular.otf}{%
+ \gdef\thu@font@family@libertinus@serif{LibertinusSerif}%
+ \gdef\thu@font@family@libertinus@sans{LibertinusSans}%
+ \gdef\thu@font@name@libertinus@math{LibertinusMath-Regular}%
+ \gdef\thu@font@style@libertinus@rm{Regular}%
+ \gdef\thu@font@style@libertinus@bf{Bold}%
+ \gdef\thu@font@style@libertinus@it{Italic}%
+ \gdef\thu@font@style@libertinus@bfit{BoldItalic}%
+ }{%
+ \gdef\thu@font@family@libertinus@serif{libertinusserif}%
+ \gdef\thu@font@family@libertinus@sans{libertinussans}%
+ \gdef\thu@font@name@libertinus@math{libertinusmath-regular}%
+ \gdef\thu@font@style@libertinus@rm{regular}%
+ \gdef\thu@font@style@libertinus@bf{bold}%
+ \gdef\thu@font@style@libertinus@it{italic}%
+ \gdef\thu@font@style@libertinus@bfit{bolditalic}%
+ }%
+ \fi
+}
+% \end{macrocode}
+%
+% 《撰写手册》要求西文字体使用 Times New Roman 和 Arial,
+% 但是在 Linux 下没有这两个字体,所以使用它们的克隆版 TeX Gyre Termes 和
+% TeX Gyre Heros。
+% \begin{macrocode}
+\ifthu@font@auto
+ \ifthu@system@unix
+ \thusetup{font=termes}
+ \else
+ \thusetup{font=times}
+ \fi
+\fi
+\newcommand\thu@load@font@times{%
+ \setmainfont{Times New Roman}%
+ \setsansfont{Arial}%
+ \ifthu@system@mac
+ \setmonofont{Menlo}[Scale = MatchLowercase]%
+ \else
+ \setmonofont{Courier New}[Scale = MatchLowercase]%
+ \fi
+}
+\newcommand\thu@load@font@termes{%
+ \setmainfont{texgyretermes}[
Extension = .otf,
UprightFont = *-regular,
BoldFont = *-bold,
ItalicFont = *-italic,
BoldItalicFont = *-bolditalic,
- ]{texgyretermes}
- \setsansfont[
+ ]%
+ \thu@load@texgyre@sans@mono
+}
+\newcommand\thu@load@texgyre@sans@mono{%
+ \setsansfont{texgyreheros}[
Extension = .otf,
UprightFont = *-regular,
BoldFont = *-bold,
ItalicFont = *-italic,
BoldItalicFont = *-bolditalic,
- ]{texgyreheros}
- \setmonofont[
+ ]%
+ \setmonofont{texgyrecursor}[
Extension = .otf,
UprightFont = *-regular,
BoldFont = *-bold,
ItalicFont = *-italic,
BoldItalicFont = *-bolditalic,
- Scale = MatchLowercase,
- ]{texgyrecursor}
-}{
- \setmainfont{Times New Roman}
- \setsansfont{Arial}
- \ifthenelse{\equal{\thu@fontset}{mac}}{
- \setmonofont[Scale=MatchLowercase]{Menlo}
- }{
- \setmonofont[Scale=MatchLowercase]{Courier New}
- }
+ Ligatures = CommonOff,
+ ]%
+}
+\newcommand\thu@load@font@xits{%
+ \thu@set@xits@names
+ \setmainfont{\thu@font@family@xits}[
+ Extension = .otf,
+ UprightFont = *-\thu@font@style@xits@rm,
+ BoldFont = *-\thu@font@style@xits@bf,
+ ItalicFont = *-\thu@font@style@xits@it,
+ BoldItalicFont = *-\thu@font@style@xits@bfit,
+ ]%
+ \thu@load@texgyre@sans@mono
+}
+\newcommand\thu@load@font@libertinus{%
+ \thu@set@libertinus@names
+ \setmainfont{\thu@font@family@libertinus@serif}[
+ Extension = .otf,
+ UprightFont = *-\thu@font@style@libertinus@rm,
+ BoldFont = *-\thu@font@style@libertinus@bf,
+ ItalicFont = *-\thu@font@style@libertinus@it,
+ BoldItalicFont = *-\thu@font@style@libertinus@bfit,
+ ]%
+ \setsansfont{\thu@font@family@libertinus@sans}[
+ Extension = .otf,
+ UprightFont = *-\thu@font@style@libertinus@rm,
+ BoldFont = *-\thu@font@style@libertinus@bf,
+ ItalicFont = *-\thu@font@style@libertinus@it,
+ ]%
+ \setmonofont{lmmonolt10}[
+ Extension = .otf,
+ UprightFont = *-regular,
+ BoldFont = *-bold,
+ ItalicFont = *-oblique,
+ BoldItalicFont = *-boldoblique,
+ ]%
+}
+\@namedef{thu@load@font@lm}{%
+ \setmainfont{lmroman10}[
+ Extension = .otf,
+ UprightFont = *-regular,
+ BoldFont = *-bold,
+ ItalicFont = *-italic,
+ BoldItalicFont = *-bolditalic,
+ ]%
+ \setsansfont{lmsans10}[
+ Extension = .otf,
+ UprightFont = *-regular,
+ BoldFont = *-bold,
+ ItalicFont = *-oblique,
+ BoldItalicFont = *-boldoblique,
+ ]%
+ \setmonofont{lmmonolt10}[
+ Extension = .otf,
+ UprightFont = *-regular,
+ BoldFont = *-bold,
+ ItalicFont = *-oblique,
+ BoldItalicFont = *-boldoblique,
+ ]%
+}
+\newcommand\thu@load@font{%
+ \@nameuse{thu@load@font@\thu@font}%
}
+\thu@load@font
+\thu@option@hook{font}{\thu@load@font}
% \end{macrocode}
%
% 使用 \pkg{unicode-math} 配置数学字体
@@ -1407,76 +1950,230 @@
nabla = upright,
partial = upright,
}
-\IfFontExistsTF{XITSMath-Regular.otf}{
- \setmathfont[
+\newcommand\thu@load@math@font@xits{%
+ \thu@set@xits@names
+ \setmathfont{\thu@font@name@xits@math@rm}[
Extension = .otf,
- BoldFont = XITSMath-Bold,
+ BoldFont = \thu@font@name@xits@math@bf,
StylisticSet = 8,
- ]{XITSMath-Regular}
- \setmathfont[range={cal,bfcal},StylisticSet=1]{XITSMath-Regular.otf}
-}{
- \setmathfont[
+ ]%
+ \setmathfont{\thu@font@name@xits@math@rm}[
+ Extension = .otf,
+ StylisticSet = 1,
+ range = {cal,bfcal},
+ ]%
+}
+\newcommand\thu@load@math@font@stix{%
+ \setmathfont{STIX2Math}[
Extension = .otf,
- BoldFont = *bold,
StylisticSet = 8,
- ]{xits-math}
- \setmathfont[range={cal,bfcal},StylisticSet=1]{xits-math.otf}
+ ]%
+ \setmathfont{STIX2Math}[
+ Extension = .otf,
+ StylisticSet = 1,
+ range = {cal,bfcal},
+ ]%
+}
+\newcommand\thu@load@math@font@libertinus{%
+ \thu@set@libertinus@names
+ \setmathfont{\thu@font@name@libertinus@math .otf}%
+}
+\newcommand\thu@load@math@font@lm{%
+ \setmathfont{latinmodern-math.otf}%
+}
+\newcommand\thu@load@math@font{%
+ \@nameuse{thu@load@math@font@\thu@math@font}
}
+\thu@load@math@font
+\thu@option@hook{math-font}{\thu@load@math@font}
% \end{macrocode}
%
-% 在使用 Windows Vista 或之后版本的系统时,\pkg{ctex} 宏包会默认使用微软雅黑字体,
-% 这可能会导致审查不合格。下面设置适合印刷的黑体,同时保持跨平台兼容性。
+% 中文字体
% \begin{macrocode}
-\ifthenelse{\equal{\thu@fontset}{windows}}{
- \xeCJKsetup{EmboldenFactor=2}
- \IfFileExists{C:/bootfont.bin}{
- \setCJKmainfont[AutoFakeBold,ItalicFont=KaiTi_GB2312]{SimSun}
- \setCJKfamilyfont{zhkai}[AutoFakeBold]{KaiTi_GB2312}
- }{
- \setCJKmainfont[AutoFakeBold,ItalicFont=KaiTi]{SimSun}
- \setCJKfamilyfont{zhkai}[AutoFakeBold]{KaiTi}
- }
- \setCJKsansfont[AutoFakeBold]{SimHei}
- \setCJKfamilyfont{zhsong}[AutoFakeBold]{SimSun}
- \setCJKfamilyfont{zhhei}[AutoFakeBold]{SimHei}
-}{}
+\ifthu@cjk@font@auto
+ \ifthu@system@mac
+ \thusetup{cjk-font = mac}
+ \else
+ \ifthu@system@windows
+ \thusetup{cjk-font = windows}
+ \else
+ \IfFontExistsTF{Noto Serif CJK SC}{
+ \thusetup{cjk-font = noto}
+ }{
+ \thusetup{cjk-font = fandol}
+ }
+ \fi
+ \fi
+\fi
+\newcommand\thu@load@cjk@font@windows{%
+ \xeCJKsetup{EmboldenFactor=3}%
+ \setCJKmainfont{SimSun}[
+ AutoFakeBold = true,
+ ItalicFont = KaiTi,
+ ]%
+ \setCJKsansfont{SimHei}[AutoFakeBold]%
+ \setCJKmonofont{FangSong}%
+ \setCJKfamilyfont{zhsong}{SimSun}[AutoFakeBold]%
+ \setCJKfamilyfont{zhhei}{SimHei}[AutoFakeBold]%
+ \setCJKfamilyfont{zhkai}{KaiTi}%
+ \setCJKfamilyfont{zhfs}{FangSong}%
+}
+\newcommand\thu@load@cjk@font@mac{%
+ \setCJKmainfont{Songti SC}[
+ UprightFont = * Light,
+ BoldFont = * Bold,
+ ItalicFont = Kaiti SC,
+ BoldItalicFont = Kaiti SC Bold,
+ ]%
+ \setCJKsansfont{Heiti SC}[BoldFont=* Medium]%
+ \setCJKmonofont{STFangsong}
+ \setCJKfamilyfont{zhsong}{Songti SC}[
+ UprightFont = * Light,
+ BoldFont = * Bold,
+ ]%
+ \setCJKfamilyfont{zhhei}{Heiti SC}[
+ UprightFont = * Light,
+ BoldFont = * Medium,
+ ]%
+ \setCJKfamilyfont{zhfs}{STFangsong}%
+ \setCJKfamilyfont{zhkai}{Kaiti SC}[BoldFont = * Bold]%
+ \setCJKfamilyfont{zhli}{Baoli SC}%
+ \setCJKfamilyfont{zhyuan}{Yuanyi SC}[
+ UprightFont = * Light,
+ BoldFont = * Bold,
+ ]%
+}
% \end{macrocode}
%
-% 类似地,\pkg{ctex} 2.4.14 开始在 macOS 下自动调用苹方黑体,所以必进行调整。
-% \begin{macrocode}
-\ifthenelse{\equal{\thu@fontset}{mac}}{
- \setCJKmainfont[
- UprightFont = * Light,
- BoldFont = * Bold,
- ItalicFont = Kaiti SC,
- BoldItalicFont = Kaiti SC Bold,
- ]{Songti SC}
- \setCJKsansfont[BoldFont=* Medium]{Heiti SC}
- \setCJKfamilyfont{zhsong}[
- UprightFont = * Light,
- BoldFont = * Bold,
- ]{Songti SC}
- \setCJKfamilyfont{zhhei}[BoldFont=* Medium]{Heiti SC}
- \setCJKfamilyfont{zhkai}[BoldFont=* Bold]{Kaiti SC}
- \xeCJKsetwidth{‘’“”}{1em}
-}{}
+% 注意 Noto CJK 的 regular 字重名字不带“Regular”。
+% \begin{macrocode}
+\newcommand\thu@load@cjk@font@noto{%
+ \setCJKmainfont{Noto Serif CJK SC}[
+ UprightFont = * Light,
+ BoldFont = * Bold,
+ ItalicFont = FandolKai-Regular,
+ ItalicFeatures = {Extension = .otf},
+ ]%
+ \setCJKsansfont{Noto Sans CJK SC}[
+ BoldFont = * Medium,
+ ]%
+ \setCJKmonofont{Noto Sans Mono CJK SC}%
+ \setCJKfamilyfont{zhsong}{Noto Serif CJK SC}[
+ UprightFont = * Light,
+ UprightFont = * Bold,
+ ]%
+ \setCJKfamilyfont{zhhei}{Noto Sans CJK SC}[
+ BoldFont = * Medium,
+ ]%
+ \setCJKfamilyfont{zhfs}{FandolFang}[
+ Extension = .otf,
+ UprightFont = *-Regular,
+ ]%
+ \setCJKfamilyfont{zhkai}{FandolKai}[
+ Extension = .otf,
+ UprightFont = *-Regular,
+ ]%
+}
+\newcommand\thu@load@cjk@font@fandol{%
+ \setCJKmainfont{FandolSong}[
+ Extension = .otf,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+ ItalicFont = FandolKai-Regular,
+ ]%
+ \setCJKsansfont{FandolHei}[
+ Extension = .otf,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+ ]%
+ \setCJKmonofont{FandolFang}[
+ Extension = .otf,
+ UprightFont = *-Regular,
+ ]%
+ \setCJKfamilyfont{zhsong}{FandolSong}[
+ Extension = .otf,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+ ]%
+ \setCJKfamilyfont{zhhei}{FandolHei}[
+ Extension = .otf,
+ UprightFont = *-Regular,
+ BoldFont = *-Bold,
+ ]%
+ \setCJKfamilyfont{zhfs}{FandolFang}[
+ Extension = .otf,
+ UprightFont = *-Regular,
+ ]%
+ \setCJKfamilyfont{zhkai}{FandolKai}[
+ Extension = .otf,
+ UprightFont = *-Regular,
+ ]%
+}
+\ifthu@cjk@font@none\else
+ \providecommand\songti{\CJKfamily{zhsong}}
+ \providecommand\heiti{\CJKfamily{zhhei}}
+ \providecommand\fangsong{\CJKfamily{zhfs}}
+ \providecommand\kaishu{\CJKfamily{zhkai}}
+\fi
+\newcommand\thu@load@cjk@font{%
+ \@nameuse{thu@load@cjk@font@\thu@cjk@font}%
+}
+\thu@load@cjk@font
+\thu@option@hook{cjk-font}{\thu@load@cjk@font}
% \end{macrocode}
%
% \begin{macro}{\normalsize}
% 正文小四号 (12bp) 字,行距为固定值 20 bp。
+% 其他字号的行距按照相同的比例设置。
+%
+% 表达式行的行距为单倍行距,段前空 6 磅,段后空 6 磅。
% \begin{macrocode}
\renewcommand\normalsize{%
\@setfontsize\normalsize{12bp}{20bp}%
- \abovedisplayskip=12bp \@plus 2bp \@minus 2bp
- \abovedisplayshortskip=12bp \@plus 2bp \@minus 2bp
- \belowdisplayskip=\abovedisplayskip
- \belowdisplayshortskip=\abovedisplayshortskip}
+ \abovedisplayskip 6bp%
+ \abovedisplayshortskip 6bp%
+ \belowdisplayshortskip 6bp%
+ \belowdisplayskip \abovedisplayskip
+}
+\normalsize
+\ifx\MakeRobust\@undefined \else
+ \MakeRobust\normalsize
+\fi
+\DeclareRobustCommand\small{%
+ \@setfontsize\small{10.5bp}{17.5bp}%
+ \abovedisplayskip 6bp%
+ \abovedisplayshortskip 6bp%
+ \belowdisplayshortskip 6bp%
+ \def\@listi{\leftmargin\leftmargini
+ \topsep \z@skip
+ \parsep \z@skip
+ \itemsep \z@skip}%
+ \belowdisplayskip \abovedisplayskip
+}
+\DeclareRobustCommand\footnotesize{%
+ \@setfontsize\footnotesize{9bp}{15bp}%
+ \abovedisplayskip 6bp%
+ \abovedisplayshortskip 6bp%
+ \belowdisplayshortskip 6bp%
+ \def\@listi{\leftmargin\leftmargini
+ \topsep \z@skip
+ \parsep \z@skip
+ \itemsep \z@skip}%
+ \belowdisplayskip \abovedisplayskip
+}
+\DeclareRobustCommand\scriptsize{\@setfontsize\scriptsize{7.5bp}{12.5bp}}
+\DeclareRobustCommand\tiny{\@setfontsize\tiny{6.5bp}{10.83bp}}
+\DeclareRobustCommand\large{\@setfontsize\large{15bp}{25bp}}
+\DeclareRobustCommand\Large{\@setfontsize\Large{18bp}{30bp}}
+\DeclareRobustCommand\LARGE{\@setfontsize\LARGE{22bp}{36.67bp}}
+\DeclareRobustCommand\huge{\@setfontsize\huge{24bp}{40bp}}
+\DeclareRobustCommand\Huge{\@setfontsize\Huge{26bp}{43.33bp}}
% \end{macrocode}
% \end{macro}
%
% WORD 中的字号对应该关系如下(1bp = 72.27/72 pt):
% \begin{center}
-% \begin{tabular}{llll}
+% \begin{longtable}{llll}
% \toprule
% 初号 & 42bp & 14.82mm & 42.1575pt \\
% 小初 & 36bp & 12.70mm & 36.135 pt \\
@@ -1494,7 +2191,7 @@
% 小六 & 6.5bp & 2.29mm & \\
% 七号 & 5.5bp & 1.94mm & \\
% 八号 & 5bp & 1.76mm & \\\bottomrule
-% \end{tabular}
+% \end{longtable}
% \end{center}
%
% \begin{macro}{\thu@def@fontsize}
@@ -1510,25 +2207,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\chuhao}
-% \begin{macro}{\xiaochu}
-% \begin{macro}{\yihao}
-% \begin{macro}{\xiaoyi}
-% \begin{macro}{\erhao}
-% \begin{macro}{\xiaoer}
-% \begin{macro}{\sanhao}
-% \begin{macro}{\xiaosan}
-% \begin{macro}{\sihao}
-% \begin{macro}{\banxiaosi}
-% \begin{macro}{\xiaosi}
-% \begin{macro}{\dawu}
-% \begin{macro}{\wuhao}
-% \begin{macro}{\xiaowu}
-% \begin{macro}{\liuhao}
-% \begin{macro}{\xiaoliu}
-% \begin{macro}{\qihao}
-% \begin{macro}{\bahao}
-% 一组字号定义。TODO:用 \cs{zihao} 替代。
+% 一组字号定义。
% \begin{macrocode}
\thu@def@fontsize{chuhao}{42bp}
\thu@def@fontsize{xiaochu}{36bp}
@@ -1539,9 +2218,7 @@
\thu@def@fontsize{sanhao}{16bp}
\thu@def@fontsize{xiaosan}{15bp}
\thu@def@fontsize{sihao}{14bp}
-\thu@def@fontsize{banxiaosi}{13bp}
\thu@def@fontsize{xiaosi}{12bp}
-\thu@def@fontsize{dawu}{11bp}
\thu@def@fontsize{wuhao}{10.5bp}
\thu@def@fontsize{xiaowu}{9bp}
\thu@def@fontsize{liuhao}{7.5bp}
@@ -1549,28 +2226,164 @@
\thu@def@fontsize{qihao}{5.5bp}
\thu@def@fontsize{bahao}{5bp}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
%
%
% \subsubsection{语言设置}
%
+% 定义 \cs{thu@main@language},当在导言区修改 \option{language} 时,
+% 保存为论文的主要语言;
+% \cs{thu@reset@main@language} 则用于正文中恢复为主要语言。
+% \begin{macrocode}
+\thusetup{main-language=\thu@language}%
+\let\thu@main@language\thu@language
+\thu@option@hook{language}{%
+ \ifx\@begindocumenthook\@undefined\else
+ \thusetup{main-language=\thu@language}%
+ \let\thu@main@language\thu@language
+ \fi
+}
+\newcommand\thu@reset@main@language{%
+ \thusetup{language = \thu@main@language}%
+ \let\thu@language\thu@main@language
+}
+% \end{macrocode}
+%
+% 根据语言设置各章节的名称,只有在导言区设置 \option{degree} 和
+% \option{language} 时会修改,而在正文局部切换语言时则不变。
+% \begin{macrocode}
+\newcommand\thu@set@chapter@names{%
+ \ifthu@main@language@chinese
+ \ctexset{
+ chapter/name = {第,章},
+ }%
+ \def\bibname{参考文献}%
+ \def\appendixname{附录}%
+ \def\indexname{索引}%
+ \def\thu@acknowledgements@name{致\quad 谢}%
+ \ifthu@degree@bachelor
+ \def\contentsname{目\quad 录}%
+ \def\listfigurename{插图索引}%
+ \def\listtablename{表格索引}%
+ \def\thu@list@figure@table@name{插图和附表索引}%
+ \def\thu@list@algorithm@name{算法索引}%
+ \def\listequationname{公式索引}%
+ \def\thu@denotation@name{主要符号对照表}%
+ \def\thu@resume@name{在学期间参加课题的研究成果}%
+ \else
+ \def\listfigurename{插图清单}%
+ \def\listtablename{附表清单}%
+ \def\thu@list@figure@table@name{插图和附表清单}%
+ \def\thu@list@algorithm@name{算法清单}%
+ \def\listequationname{公式清单}%
+ \ifthu@degree@graduate
+ \def\contentsname{目\quad 录}%
+ \def\thu@denotation@name{符号和缩略语说明}%
+ \def\thu@resume@name{个人简历、在学期间完成的相关学术成果}%
+ \else % degree = postdoc
+ \def\contentsname{目\qquad 次}%
+ \def\thu@denotation@name{符号表}%
+ \def\thu@resume@name{个人简历、发表的学术论文与科研成果}%
+ \fi
+ \fi
+ \else
+ \ifthu@main@language@english
+ \ctexset{
+ chapter/name = \chaptername\space,
+ }%
+ \def\indexname{Index}%
+ \ifthu@degree@bachelor
+ \def\contentsname{CONTENTS}%
+ \def\listfigurename{FIGURES}%
+ \def\listtablename{TABLES}%
+ \def\thu@list@figure@table@name{FIGURES AND TABLES}%
+ \def\thu@list@algorithm@name{ALGORITHMS}%
+ \def\listequationname{EQUATIONS}%
+ \def\thu@denotation@name{ABBREVIATIONS}%
+ \def\bibname{REFERENCES}%
+ \def\appendixname{APPENDIX}%
+ \def\thu@acknowledgements@name{ACKNOWLEDGEMENTS}%
+ \def\thu@resume@name{PUBLICATIONS}%
+ \else
+ \def\contentsname{Contents}%
+ \def\listfigurename{List of Figures}%
+ \def\listtablename{List of Tables}%
+ \def\thu@list@figure@table@name{List of Figures and Tables}%
+ \def\thu@list@algorithm@name{List of Algorithms}%
+ \def\listequationname{List of Equations}%
+ \def\thu@denotation@name{Nomenclature}%
+ \def\bibname{Bibliography}%
+ \def\appendixname{Appendix}%
+ \def\thu@acknowledgements@name{Acknowledgements}%
+ \def\thu@resume@name{Resume and Academic Achievements}%
+ \fi
+ \fi
+ \fi
+}
+\thu@set@chapter@names
+\thu@option@hook{degree}{\thu@set@chapter@names}
+\thu@option@hook{main-language}{\thu@set@chapter@names}
+% \end{macrocode}
+%
+% 这部分名称在正文中局部地修改语言时会发生变化,比如英文摘要、
+% 本科生附录的阅读报告。
+% \begin{macrocode}
+\newcommand\thu@set@names{%
+ \ifthu@language@chinese
+ \ctexset{
+ figurename = 图,
+ tablename = 表,
+ }%
+ \def\thu@algorithm@name{算法}%
+ \def\thu@equation@name{公式}%
+ \def\thu@assumption@name{假设}%
+ \def\thu@definition@name{定义}%
+ \def\thu@proposition@name{命题}%
+ \def\thu@lemma@name{引理}%
+ \def\thu@theorem@name{定理}%
+ \def\thu@axiom@name{公理}%
+ \def\thu@corollary@name{推论}%
+ \def\thu@exercise@name{练习}%
+ \def\thu@example@name{例}%
+ \def\thu@remark@name{注释}%
+ \def\thu@problem@name{问题}%
+ \def\thu@conjecture@name{猜想}%
+ \def\thu@proof@name{证明}%
+ \def\thu@theorem@separator{:}%
+ \else
+ \ifthu@language@english
+ \ctexset{
+ figurename = {Figure},
+ tablename = {Table},
+ }%
+ \def\thu@algorithm@name{Algorithm}%
+ \def\thu@equation@name{Equation}%
+ \def\thu@assumption@name{Assumption}%
+ \def\thu@definition@name{Definition}%
+ \def\thu@proposition@name{Proposition}%
+ \def\thu@lemma@name{Lemma}%
+ \def\thu@theorem@name{Theorem}%
+ \def\thu@axiom@name{Axiom}%
+ \def\thu@corollary@name{Corollary}%
+ \def\thu@exercise@name{Exercise}%
+ \def\thu@example@name{Example}%
+ \def\thu@remark@name{Remark}%
+ \def\thu@problem@name{Problem}%
+ \def\thu@conjecture@name{Conjecture}%
+ \def\thu@proof@name{Proof}%
+ \def\thu@theorem@separator{: }%
+ \fi
+ \fi
+}
+\thu@set@names
+\thu@option@hook{language}{\thu@set@names}
+% \end{macrocode}
+%
+% 带圈数字和星号使用中文字体。
+% \begin{macrocode}
+\xeCJKDeclareCharClass{CJK}{"2460 -> "2473}
+\xeCJKDeclareCharClass{CJK}{"2605}
+% \end{macrocode}
+%
% \newcommand\unicodechar[1]{U+#1(\symbol{"#1})}
% 由于 Unicode 的一些标点符号是中西文混用的:
% \unicodechar{00B7}、
@@ -1585,130 +2398,83 @@
% \unicodechar{2E3A},
% 所以要根据语言设置正确的字体。
% \footnote{\url{https://github.com/CTeX-org/ctex-kit/issues/389}}
-% 所以要根据语言设置正确的字体。
+% 此外切换语言时,有一部分名称是需要被重新定义的。
% \begin{macrocode}
-\newcommand\thu@setchinese{%
- \xeCJKResetPunctClass
-}
-\newcommand\thu@setenglish{%
- \xeCJKDeclareCharClass{HalfLeft}{"2018, "201C}%
- \xeCJKDeclareCharClass{HalfRight}{
- "00B7, "2019, "201D, "2013, "2014, "2025, "2026, "2E3A,
- }%
-}
-\newcommand\thu@setdefaultlanguage{%
+\newcommand\thu@set@punctuations{%
\ifthu@language@chinese
- \thu@setchinese
+ \xeCJKDeclareCharClass{FullLeft}{"2018, "201C}%
+ \xeCJKDeclareCharClass{FullRight}{
+ "00B7, "2019, "201D, "2013, "2014, "2025, "2026, "2E3A,
+ }%
\else
- \thu@setenglish
+ \ifthu@language@english
+ \xeCJKDeclareCharClass{HalfLeft}{"2018, "201C}%
+ \xeCJKDeclareCharClass{HalfRight}{
+ "00B7, "2019, "201D, "2013, "2014, "2025, "2026, "2E3A,
+ }%
+ \fi
\fi
}
+\thu@set@punctuations
+\thu@option@hook{language}{\thu@set@punctuations}
% \end{macrocode}
%
-% 中英文翻译:
+% \subsubsection{页眉页脚}
+% \label{sec:headerfooter}
+%
+% \pkg{fancyhdr} 定义页眉页脚很方便,但是有一个非常隐蔽的坑。
+% 第一次调用 \pkg{fancyhdr} 定义的样式时会修改 \cs{chaptermark},
+% 这会导致页眉信息错误(多余章号并且英文大写)。
+% 这是因为在 \cs{ps@fancy} 中对 \cs{chaptermark} 进行重定义,
+% 所以我们先调用 \cs{ps@fancy},再修改 \cs{chaptermark}。
% \begin{macrocode}
-\ifthu@language@chinese
- \ctexset{
- chapter/name = {第,章},
- appendixname = 附录,
- contentsname = {目\hspace{\ccwd}录},
- listfigurename = 插图索引,
- listtablename = 表格索引,
- figurename = 图,
- tablename = 表,
- bibname = 参考文献,
- indexname = 索引,
- }
- \newcommand\thu@denotation@name{主要符号对照表}
- \newcommand\listequationname{公式索引}
- \newcommand\equationname{公式}
- \newcommand\thu@assumption@name{假设}
- \newcommand\thu@definition@name{定义}
- \newcommand\thu@proposition@name{命题}
- \newcommand\thu@lemma@name{引理}
- \newcommand\thu@theorem@name{定理}
- \newcommand\thu@axiom@name{公理}
- \newcommand\thu@corollary@name{推论}
- \newcommand\thu@exercise@name{练习}
- \newcommand\thu@example@name{例}
- \newcommand\thu@remark@name{注释}
- \newcommand\thu@problem@name{问题}
- \newcommand\thu@conjecture@name{猜想}
- \newcommand\thu@proof@name{证明}
- \newcommand\thu@theorem@separator{:}
- \newcommand\thu@ack@name{致\hspace{\ccwd}谢}
- \ifthu@degree@bachelor
- \newcommand\thu@resume@title{在学期间参加课题的研究成果}
- \else
- \ifthu@degree@postdoc
- \newcommand\thu@resume@title{个人简历、发表的学术论文与科研成果}
- \else
- \newcommand\thu@resume@title{个人简历、在学期间发表的学术论文与研究成果}
- \fi
- \fi
-\else
- \newcommand\thu@denotation@name{Nomenclature}
- \newcommand\listequationname{List of Equations}
- \newcommand\equationname{Equation}
- \newcommand\thu@assumption@name{Assumption}
- \newcommand\thu@definition@name{Definition}
- \newcommand\thu@proposition@name{Proposition}
- \newcommand\thu@lemma@name{Lemma}
- \newcommand\thu@theorem@name{Theorem}
- \newcommand\thu@axiom@name{Axiom}
- \newcommand\thu@corollary@name{Corollary}
- \newcommand\thu@exercise@name{Exercise}
- \newcommand\thu@example@name{Example}
- \newcommand\thu@remark@name{Remark}
- \newcommand\thu@problem@name{Problem}
- \newcommand\thu@conjecture@name{Conjecture}
- \newcommand\thu@proof@name{proof}
- \newcommand\thu@theorem@separator{: }
- \newcommand\thu@ack@name{Acknowledgements}
+\pagestyle{fancy}
+% \end{macrocode}
+%
+% 定义页眉和页脚。
+% 研究生要求:
+% 页眉宋体五号字,宋体五号字居中书写;
+% 页码五号 Times New Roman 体。
+%
+% 本科生要求:
+% 页眉:无;
+% 页码:位于页面底端,居中书写。
+%
+% 本科外文专业要求页码字号 12pt。
+% \begin{macrocode}
+\fancypagestyle{plain}{%
+ \fancyhf{}%
+ \renewcommand\footrulewidth{0pt}%
\ifthu@degree@bachelor
- \newcommand\thu@resume@title{Research Achievements}
+ \renewcommand\headrulewidth{0pt}%
+ \fancyfoot[C]{
+ \ifthu@main@language@chinese
+ \xiaowu
+ \else
+ \normalsize
+ \fi
+ \thepage
+ }%
+ \let\@mkboth\@gobbletwo
+ \let\chaptermark\@gobble
\else
- \newcommand\thu@resume@title{Resume, Publications and Research Achievements}
+ \renewcommand\headrulewidth{0.75bp}%
+ \fancyhead[C]{\wuhao\leftmark}%
+ \fancyfoot[C]{\wuhao\thepage}%
+ \let\@mkboth\markboth
+ \def\chaptermark##1{%
+ \markboth{\CTEXifname{\CTEXthechapter\quad}{}##1}{}%
+ }%
\fi
-\fi
+ \let\sectionmark\@gobble
+}
+\pagestyle{plain}
% \end{macrocode}
%
-%
-% \subsubsection{页眉页脚}
-% \label{sec:headerfooter}
-%
-% 定义页眉和页脚。
-% \begin{macro}{\ps@thu@empty}
-% \begin{macro}{\ps@thu@plain}
-% \begin{macro}{\ps@thu@headings}
-% 定义三种页眉页脚格式:
-% \begin{itemize}
-% \item \texttt{thu@empty}:页眉页脚都没有
-% \item \texttt{thu@plain}:只显示页脚的页码。\cs{chapter} 自动调用
-% \cs{thispagestyle\{thu@plain\}}。
-% \item \texttt{thu@headings}:页眉页脚同时显示
-% \end{itemize}
+% \cs{chapter} 会调用特殊的 page style。
% \begin{macrocode}
-\fancypagestyle{thu@empty}{%
- \fancyhf{}
- \renewcommand{\headrulewidth}{0pt}
- \renewcommand{\footrulewidth}{0pt}}
-\fancypagestyle{thu@plain}{%
- \fancyhead{}
- \fancyfoot[C]{\xiaowu\thepage}
- \renewcommand{\headrulewidth}{0pt}
- \renewcommand{\footrulewidth}{0pt}}
-\fancypagestyle{thu@headings}{%
- \fancyhead{}
- \fancyhead[C]{\wuhao\normalfont\leftmark}
- \fancyfoot{}
- \fancyfoot[C]{\wuhao\thepage}
- \renewcommand{\headrulewidth}{0.4pt}
- \renewcommand{\footrulewidth}{0pt}}
+\ctexset{chapter/pagestyle = plain}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
%
%
% \subsubsection{段落}
@@ -1719,10 +2485,65 @@
\ctexset{%
punct=quanjiao,
space=auto,
- autoindent=true}
+}
+\newcommand\thu@set@indent{%
+ \ifthu@main@language@english
+ \ifthu@degree@bachelor
+ \ctexset{autoindent=0.8cm}%
+ \else
+ \ctexset{autoindent=2}%
+ \fi
+ \else
+ \ctexset{autoindent=2}%
+ \fi
+}
+\thu@set@indent
+\thu@option@hook{degree}{\thu@set@indent}
+\thu@option@hook{main-language}{\thu@set@indent}
+% \end{macrocode}
+%
+% 设置 url 样式,与上下文一致
+% \begin{macrocode}
+\urlstyle{same}
+% \end{macrocode}
+%
+% 使用 \pkg{xurl} 的方法,增加 URL 可断行的位置。
+% \begin{macrocode}
+\g@addto@macro\UrlBreaks{%
+ \do0\do1\do2\do3\do4\do5\do6\do7\do8\do9%
+ \do\A\do\B\do\C\do\D\do\E\do\F\do\G\do\H\do\I\do\J\do\K\do\L\do\M
+ \do\N\do\O\do\P\do\Q\do\R\do\S\do\T\do\U\do\V\do\W\do\X\do\Y\do\Z
+ \do\a\do\b\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j\do\k\do\l\do\m
+ \do\n\do\o\do\p\do\q\do\r\do\s\do\t\do\u\do\v\do\w\do\x\do\y\do\z
+}
+\Urlmuskip=0mu plus 0.1mu
% \end{macrocode}
%
-% 利用 \pkg{enumitem} 命令调整默认列表环境间的距离,以符合中文习惯。
+% 取消列表的间距,以符合中文习惯。
+% \begin{macrocode}
+\partopsep=\z@skip
+\def\@listi{\leftmargin\leftmargini
+ \parsep \z@skip
+ \topsep \z@skip
+ \itemsep\z@skip}
+\let\@listI\@listi
+\@listi
+\def\@listii {\leftmargin\leftmarginii
+ \labelwidth\leftmarginii
+ \advance\labelwidth-\labelsep
+ \topsep \z@skip
+ \parsep \z@skip
+ \itemsep \z@skip}
+\def\@listiii{\leftmargin\leftmarginiii
+ \labelwidth\leftmarginiii
+ \advance\labelwidth-\labelsep
+ \topsep \z@skip
+ \parsep \z@skip
+ \partopsep \z@skip
+ \itemsep \z@skip}
+% \end{macrocode}
+%
+% 使用 \pkg{enumitem} 命令调整默认列表环境间的距离,
% \begin{macrocode}
\setlist{nosep}
% \end{macrocode}
@@ -1730,50 +2551,85 @@
%
% \subsubsection{脚注}
% \label{sec:footnote}
-% 脚注符合中文习惯,数字带圈。
-% \begin{macro}{\thu@textcircled}
+% 脚注内容采用小五号字,中文用宋体,英文和数字用 Times New Roman 体按两端对齐格式书写,
+% 单倍行距,段前段后均空 0 磅。
+% 脚注的序号按页编排,不同页的脚注序号不需要连续。
+%
+% 脚注处序号“1,……,10”的字体是“正文”,不是“上标”,序号与脚注内容文字之间空半个汉字符,
+% 脚注的段落格式为:单倍行距,段前空 0 磅,段后空 0 磅,悬挂缩进 1.5 字符;
+% 字号为小五号字,汉字用宋体,外文用 Times New Roman 体。
+%
+% 脚注序号使用带圈数字。
+% \begin{macro}{\thu@circled}
% 生成带圈的脚注数字,最多处理到 10。
% \begin{macrocode}
-\ifthenelse{\equal{\thu@fontset}{mac}}{
- \newfontfamily\thu@circlefont{Songti SC Light}
-}{
- \ifthenelse{\equal{\thu@fontset}{windows}}{
- \newfontfamily\thu@circlefont{SimSun}
- }{
- \IfFontExistsTF{XITS-Regular.otf}{
- \newfontfamily\thu@circlefont{XITS-Regular.otf}
- }{
- \newfontfamily\thu@circlefont{xits-regular.otf}
- }
- }
-}
-\def\thu@textcircled#1{%
- \ifnum\value{#1} >9%
- \ClassError{thuthesis}%
- {Too many footnotes in this page.}{Keep footnote less than 10.}%
+\newcommand\thu@circled[1]{%
+ \ifnum#1 >10\relax
+ \thu@error{%
+ Too many footnotes in this page.
+ Keep footnote less than 10%
+ }%
\fi
- {\thu@circlefont\symbol{\the\numexpr\value{#1}+"245F\relax}}%
+ {\symbol{\the\numexpr#1+"245F\relax}}%
}
-\renewcommand{\thefootnote}{\thu@textcircled{footnote}}
-\renewcommand{\thempfootnote}{\thu@textcircled{mpfootnote}}
+\renewcommand{\thefootnote}{\thu@circled{\c@footnote}}
+\renewcommand{\thempfootnote}{\thu@circled{\c@mpfootnote}}
% \end{macrocode}
% \end{macro}
%
% 定义脚注分割线,字号(宋体小五),以及悬挂缩进(1.5字符)。
% \begin{macrocode}
\def\footnoterule{\vskip-3\p@\hrule\@width0.3\textwidth\@height0.4\p@\vskip2.6\p@}
-\let\thu@footnotesize\footnotesize
-\renewcommand\footnotesize{\thu@footnotesize\xiaowu[1.5]}
-\footnotemargin1.5em\relax
+\footnotemargin=13.5bp
% \end{macrocode}
%
-% \cs{@makefnmark} 默认是上标样式,而在脚注部分要求为正文大小。利用\cs{patchcmd}
-% 动态调整 \cs{@makefnmark} 的定义。
+% 修改 \pkg{footmisc} 定义的脚注格式。
% \begin{macrocode}
-\let\thu@makefnmark\@makefnmark
-\def\thu@@makefnmark{\hbox{{\normalfont\@thefnmark}}}
-\pretocmd{\@makefntext}{\let\@makefnmark\thu@@makefnmark}{}{}
-\apptocmd{\@makefntext}{\let\@makefnmark\thu@makefnmark}{}{}
+\long\def\@makefntext#1{%
+ \begingroup
+ % 序号取消上标
+ \def\@makefnmark{\hbox{\normalfont\@thefnmark}}%
+ \xiaowu
+ \ifFN@hangfoot
+ \bgroup
+ \setbox\@tempboxa\hbox{%
+ \ifdim\footnotemargin>\z@
+ \hb@xt@\footnotemargin{\@makefnmark\hss}%
+ \else
+ \@makefnmark
+ \fi
+ }%
+ \leftmargin\wd\@tempboxa
+ \rightmargin\z@
+ \linewidth \columnwidth
+ \advance \linewidth -\leftmargin
+ \parshape \@ne \leftmargin \linewidth
+ % \footnotesize
+ \xiaowu
+ \@setpar{{\@@par}}%
+ \leavevmode
+ \llap{\box\@tempboxa}%
+ \parskip\hangfootparskip\relax
+ \parindent\hangfootparindent\relax
+ \else
+ \parindent1em%
+ \noindent
+ \ifdim\footnotemargin>\z@
+ \hb@xt@ \footnotemargin{\hss\@makefnmark}%
+ \else
+ \ifdim\footnotemargin=\z@
+ \llap{\@makefnmark}%
+ \else
+ \llap{\hb@xt@ -\footnotemargin{\@makefnmark\hss}}%
+ \fi
+ \fi
+ \fi
+ \footnotelayout#1%
+ \ifFN@hangfoot
+ \par\egroup
+ \fi
+ \endgroup
+}
% \end{macrocode}
%
%
@@ -1782,9 +2638,17 @@
% \begin{macro}{\ldots}
% 省略号一律居中,所以 \cs{ldots} 不再居于底部。
% \begin{macrocode}
-\ifthu@language@chinese
- \def\mathellipsis{\cdots}
-\fi
+\newcommand\thu@set@math@ellipsis{%
+ \ifthu@language@chinese
+ \DeclareRobustCommand\mathellipsis{\mathinner{\unicodecdots}}%
+ \else
+ \ifthu@language@english
+ \DeclareRobustCommand\mathellipsis{\mathinner{\unicodeellipsis}}%
+ \fi
+ \fi
+}
+\thu@set@math@ellipsis
+\thu@option@hook{language}{\thu@set@math@ellipsis}
% \end{macrocode}
% \end{macro}
%
@@ -1845,8 +2709,8 @@
% \begin{macro}{\boldsymbol}
% 兼容旧的粗体命令:\pkg{bm} 的 \cs{bm} 和 \pkg{amsmath} 的 \cs{boldsymbol}。
% \begin{macrocode}
-\newcommand\bm{\symbf}
-\renewcommand\boldsymbol{\symbf}
+\DeclareRobustCommand\bm[1]{{\symbf{#1}}}
+\DeclareRobustCommand\boldsymbol[1]{{\symbf{#1}}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1875,41 +2739,20 @@
%
% 公式距前后文的距离由 4 个参数控制,参见 \cs{normalsize} 的定义。
%
-% 本科的公式编号要求很诡异,不得不修改 \pkg{amsmath} 中很深的一个命令 \cs{tagform@}。
-% 同时为了让 \pkg{amsmath} 的 \cs{tag*} 命令得到正确的格式,我们必须修改这些代
-% 码。\cs{make@df@tag} 是定义 \cs{tag*} 和 \cs{tag} 内部命令的。
-% \cs{make@df@tag@@} 处理 \cs{tag*},我们就改它!
-% \begin{latex}
-% \def\make@df@tag{\@ifstar\make@df@tag@@\make@df@tag@@@}
-% \def\make@df@tag@@#1{%
-% \gdef\df@tag{\maketag@@@{#1}\def\@currentlabel{#1}}}
-% \end{latex}
-% \begin{macrocode}
-\def\make@df@tag{\@ifstar\thu@make@df@tag@@\make@df@tag@@@}
-\def\thu@make@df@tag@@#1{\gdef\df@tag{\thu@maketag{#1}\def\@currentlabel{#1}}}
-\iffalse
-\ifthu@degree@bachelor
- \def\thu@maketag#1{\maketag@@@{%
- (\ignorespaces\text{\equationname\hskip0.5em}#1\unskip\@@italiccorr)}}
- \def\tagform@#1{\maketag@@@{%
- (\ignorespaces\text{\equationname\hskip0.5em}#1\unskip\@@italiccorr)\equcaption{#1}}}
-\fi
-\fi
-\def\thu@maketag#1{\maketag@@@{(\ignorespaces #1\unskip\@@italiccorr)}}
-\def\tagform@#1{\maketag@@@{(\ignorespaces #1\unskip\@@italiccorr)\equcaption{#1}}}
-% \end{macrocode}
-% 修改 \cs{tagform} 会影响 \cs{eqref}。
+% \subsubsection{浮动对象:插图和表格}
+% \label{sec:float}
+%
+% 图表浮动体的默认位置设为 |h|。
% \begin{macrocode}
-\renewcommand{\eqref}[1]{\textup{(\ref{#1})}}
+\def\fps@figure{h}
+\def\fps@table{h}
% \end{macrocode}
%
-% \subsubsection{浮动对象以及表格}
-% \label{sec:float}
% 设置浮动对象和文字之间的距离
% \begin{macrocode}
-\setlength{\floatsep}{12bp \@plus 2bp \@minus 4bp}
-\setlength{\textfloatsep}{12bp}
-\setlength{\intextsep}{12bp}
+\setlength{\floatsep}{6bp}
+\setlength{\textfloatsep}{6bp}
+\setlength{\intextsep}{6bp}
\setlength{\@fptop}{0bp \@plus1.0fil}
\setlength{\@fpsep}{12bp \@plus2.0fil}
\setlength{\@fpbot}{0bp \@plus1.0fil}
@@ -1924,26 +2767,52 @@
\renewcommand{\floatpagefraction}{0.60}
% \end{macrocode}
%
-% 定制浮动图形和表格标题样式
+% 研究生要求表单元格中的文字采用 11pt 宋体字,单倍行距,段前空 3 磅,段后空 3 磅。
+% $(3 + 3) / (11 \times 1.3) \approx 0.4$
+% \begin{macrocode}
+\patchcmd\@floatboxreset{%
+ \normalsize
+}{%
+ \fontsize{11bp}{14.3bp}\selectfont
+ \renewcommand\arraystretch{1.4}%
+}{}{\thu@patch@error{\@floatboxreset}}
+% \end{macrocode}
+%
+% 定制浮动图形和表格标题样式,以及改变附录中浮动体的编号规则:
% \begin{itemize}
% \item 图表标题字体为 11pt, 这里写作大五号
-% \item 去掉图表号后面的冒号。图序与图名文字之间空一个汉字符宽度。
+% \item 去掉图表号后面的冒号,图序与图名文字之间空一个汉字符宽度
+% \item 本科生附录中的各种浮动体需要编号为类似 A-1 的形式
% \item 图:caption 在下,段前空 6 磅,段后空 12 磅
% \item 表:caption 在上,段前空 12 磅,段后空 6 磅
% \end{itemize}
% \begin{macrocode}
\ifthu@degree@bachelor
- \g@addto@macro\appendix{\renewcommand*{\thefigure}{\thechapter-\arabic{figure}}}
- \g@addto@macro\appendix{\renewcommand*{\thetable}{\thechapter-\arabic{table}}}
+ \AtBeginDocument{% delay the check until all packages are loaded
+ \g@addto@macro\appendix{\renewcommand*{\thefigure}{\thechapter-\arabic{figure}}}
+ \g@addto@macro\appendix{\renewcommand*{\thetable}{\thechapter-\arabic{table}}}
+ }
\fi
-\let\old@tabular\@tabular
-\def\thu@tabular{\dawu[1.5]\old@tabular}
-\DeclareCaptionFont{thu}{\dawu[1.3]}
-\DeclareCaptionLabelSeparator{thu}{\hspace{\ccwd}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\thu@caption@font{}
+\newcommand\thu@set@caption@font{%
+ \ifthu@degree@bachelor
+ \renewcommand\thu@caption@font{\fontsize{11bp}{15bp}\selectfont}%
+ \else
+ \renewcommand\thu@caption@font{\fontsize{11bp}{14.3bp}\selectfont}%
+ \fi
+}
+\thu@set@caption@font
+\thu@option@hook{degree}{\thu@set@caption@font}
+\DeclareCaptionFont{thu}{\thu@caption@font}
\captionsetup{
+ format = hang,
font = thu,
- labelsep = thu,
- skip = 6bp,
+ labelsep = quad,
+ aboveskip = 6bp,
+ belowskip = 6bp,
figureposition = bottom,
tableposition = top,
}
@@ -1953,119 +2822,192 @@
% \renewcommand{\p@subfigure}{:}
% \end{macrocode}
%
-% \begin{macro}{\hlinewd}
-% 简单的表格使用三线表推荐用 \cs{hlinewd}。如果表格比较复杂还是用 \pkg{booktabs} 的命
-% 令好一些。
+% 研究生和本科生都推荐使用三线表,并且要求表的上、下边线为单直线,线粗为 1.5 磅;
+% 第三条线为单直线,线粗为 1 磅。
+% 这里设置 \pkg{booktabs} 线粗的默认值。
% \begin{macrocode}
-\def\hlinewd#1{%
- \noalign{\ifnum0=`}\fi\hrule \@height #1 \futurelet
- \reserved@a\@xhline}
+\heavyrulewidth=1.5bp
+\lightrulewidth=1bp
% \end{macrocode}
-% \end{macro}
%
+% \begin{macrocode}
+\AtEndOfPackageFile*{threeparttable}{
+ \g@addto@macro\TPT@defaults{\wuhao}
+}
+% \end{macrocode}
%
% \subsubsection{章节标题}
% \label{sec:theor}
% \begin{macrocode}
\ifthu@degree@bachelor
- \newcommand{\cabstractname}{中文摘要}
- \newcommand{\eabstractname}{ABSTRACT}
+ \newcommand{\thu@abstract@name}{中文摘要}
+ \newcommand{\thu@abstract@name@en}{ABSTRACT}
\else
- \newcommand{\cabstractname}{摘\hspace{\ccwd}要}
- \newcommand{\eabstractname}{Abstract}
+ \newcommand{\thu@abstract@name}{摘\quad 要}
+ \newcommand{\thu@abstract@name@en}{Abstract}
\fi
% \end{macrocode}
%
-% \pkg{fancyhdr} 定义页眉页脚很方便,但是有一个非常隐蔽的坑。通过 \pkg{fancyhdr}
-% 定义的样式在第一次被调用时会修改 \cs{chaptermark},这会导致页眉信息错误(多余
-% 章号并且英文大写)。这是因为在原始的 \file{book.cls} 中定义如下(大意):
-% \begin{latex}
-% \newcommand\chaptername{Chapter}
-% \newcommand\@chapapp{\chaptername}
-% \def\chaptermark#1{
-% \markboth{\MakeUppercase{\@chapapp\ \thechapter}}{}}
-% \end{latex}
-% 很显然这个 \cs{\@chapapp} 不适合中文,因此我们使用\cs{CTEXthechapter}(
-% 如,“第 x 章”),同时会将 \cs{MakeUppercase} 去掉。也就是说我们会做如下动作:
-% \begin{latex}
-% \renewcommand{\chaptermark}[1]{\@mkboth{\CTEXthechapter\hskip\ccwd#1}{}}
-% \end{latex}
-% 但,\pkg{fancyhdr} 不知何故在 \cs{ps@fancy} 中对 \cs{chaptermark} 进行重定义
-% (其实一模一样),而这个 \cs{ps@fancy} 会在 \cs{fancypagestyle} 中使用,如下:
-% \begin{latex}
-% \newcommand{\fancypagestyle}[2]{%
-% \@namedef{ps@#1}{\let\fancy@gbl\relax#2\relax\ps@fancy}}
-% \end{latex}
-% 这样的话,\cs{ps@fancy} 会在 \pkg{fancyhdr} 定义的任何样式首次样被激活时调用,从
-% 而覆盖我们的 \cs{chaptermark} 定义(后续样式再激活不会重复覆盖)。所以我们采用如下
-% 方法解决:
+% 各级标题格式设置。
% \begin{macrocode}
-\AtBeginDocument{%
- \pagestyle{thu@empty}
- \renewcommand{\chaptermark}[1]{\@mkboth{\CTEXthechapter\hskip\ccwd#1}{}}}
+\ctexset{%
+ chapter = {
+ nameformat = {},
+ numberformat = {},
+ titleformat = {},
+ aftername = \quad,
+ fixskip = true,
+ afterindent = true,
+ lofskip = 0pt,
+ lotskip = 0pt,
+ },
+ section = {
+ aftername = \quad,
+ afterindent = true,
+ },
+ subsection = {
+ aftername = \quad,
+ afterindent = true,
+ },
+ subsubsection = {
+ aftername = \quad,
+ afterindent = true,
+ },
+ paragraph/afterindent = true,
+ subparagraph/afterindent = true,
+}
% \end{macrocode}
%
-% 各级标题格式设置。
-% \begin{description}
-% \item[chapter] 章序号与章名之间空一个汉字符 黑体三号字,居中书写,单倍行距,段
-% 前空 24 磅,段后空 18 磅。本科要求:段前段后间距 30/20 pt,行距 20pt。但正文
-% 章节 30pt 的话和样例效果不一致。
+% 本科生要求:
+% \begin{center}
+% \begin{tabular}{lclll}
+% \toprule
+% 标题 & 中文 & 英文 & 段前/后间距 & 行距 \\
+% \midrule
+% 一级节标题 & 黑体小三号 & Arial 15pt & 30/20 pt & 20pt \\
+% 二级节标题 & 黑体四号 & Arial 14pt & 25/12 pt & 18pt \\
+% 三级节标题 & 黑体小四号 & Arial 13pt & 12/6 pt & 15pt \\
+% 四级节标题 & 黑体小四号 & Arial 12pt & 12/6 pt & \\
+% \bottomrule
+% \end{tabular}
+% \end{center}
%
-% \item[section] 一级节标题,例如:\fbox{2.1 实验装置与实验方法}。节标题序号与标
-% 题名之间空一个汉字符(下同)。采用黑体四号(14pt)字居左书写,行距为固定
-% 值 20 磅,段前空 24 磅,段后空 6 磅。本科:25/12 pt,行距 18pt。
+% 这里三级节标题的“中文黑体小四号”和“英文 Arial 13pt”不一致,取 13pt。
+% \begin{macrocode}
+\newcommand\thu@set@section@format{%
+ \ifthu@degree@bachelor
+ \ctexset{%
+ chapter = {
+ format = \centering\sffamily\fontsize{15bp}{20bp}\selectfont,
+ beforeskip = 30bp,
+ afterskip = 20bp,
+ },
+ section = {
+ format = \sffamily\fontsize{14bp}{18bp}\selectfont,
+ beforeskip = 25bp,
+ afterskip = 12bp,
+ },
+ subsection = {
+ format = \sffamily\fontsize{13bp}{15bp}\selectfont,
+ beforeskip = 12bp,
+ afterskip = 6bp,
+ },
+ subsubsection = {
+ format = \sffamily\fontsize{12bp}{14bp}\selectfont,
+ beforeskip = 12bp,
+ afterskip = 6bp,
+ },
+ }%
+ \ifthu@main@language@chinese
+ \ctexset{chapter/number = \thechapter}%
+ \else
+ \ctexset{chapter/number = \thu@english@number{chapter}}%
+ \fi
+% \end{macrocode}
+%
+% 研究生要求:
+% \begin{itemize}
+% \item 各章标题,例如:“\textsf{第 1 章 引言}”。
%
-% \item[subsection] 二级节标题,例如:\fbox{2.1.1 实验装置}。采用黑体 13pt 字居左
-% 书写,行距为固定值 20 磅,段前空 12 磅,段后空 6 磅。本科:中文黑体 12pt 字,
-% 英文 13pt 字,段间距 12/6 pt,行距 15pt。
+% 章序号与章名之间空一个汉字符。
+% 采用黑体三号字,居中书写,单倍行距,
+% 段前空 24 磅,段后空 18 磅。
%
-% \item[subsubsection] 三级节标题,例如:\fbox{2.1.2.1 归纳法}。采用黑体小四号
-% (12pt)字居左书写,行距为固定值 20 磅,段前空 12 磅,段后空 6 磅。
+% \item 一级节标题,例如:“\textsf{2.1 实验装置与实验方法}”。
%
-% \end{description}
+% 节标题序号与标题名之间空一个汉字符(下同)。
+% 采用黑体四号(14pt)字居左书写,行距为固定值 20 磅,
+% 段前空 24 磅,段后空 6 磅。
+%
+% \item 二级节标题,例如:“\textsf{2.1.1 实验装置}”。
+%
+% 采用黑体 13pt 字居左书写,行距为固定值 20 磅,
+% 段前空 12 磅,段后空 6 磅。
+%
+% \item 三级节标题,例如:“\textsf{2.1.2.1 归纳法}”。
+%
+% 采用黑体小四号(12pt)字居左书写,行距为固定值 20 磅,
+% 段前空 12 磅,段后空 6 磅。
+% \end{itemize}
+%
+% 由于 Word 的行距算法不同,这里进行了一些调整使得视觉上更接近。
% \begin{macrocode}
-\newcommand\thu@chapter@titleformat[1]{%
- \ifthu@degree@bachelor #1\else%
- \ifthenelse%
- {\equal{#1}{\eabstractname}}%
- {\bfseries #1}%
- {#1}%
- \fi}
-\ctexset{%
- chapter={
- afterindent=true,
- pagestyle={\ifthu@degree@bachelor thu@plain\else thu@headings\fi},
- beforeskip={\ifthu@degree@bachelor 15bp\else 9bp\fi},
- aftername=\hskip\ccwd,
- afterskip={\ifthu@degree@bachelor 20bp\else 24bp\fi},
- format={\centering\sffamily\ifthu@degree@bachelor\xiaosan[1.333]\else\sanhao[1]\fi},
- nameformat=\relax,
- numberformat=\relax,
- titleformat=\thu@chapter@titleformat,
- lofskip=0pt,
- lotskip=0pt,
- },
- section={
- afterindent=true,
- beforeskip={\ifthu@degree@bachelor 25bp\else 24bp\fi\@plus 1ex \@minus .2ex},
- afterskip={\ifthu@degree@bachelor 12bp\else 6bp\fi \@plus .2ex},
- format={\sffamily\ifthu@degree@bachelor\sihao[1.286]\else\sihao[1.429]\fi},
- },
- subsection={
- afterindent=true,
- beforeskip={\ifthu@degree@bachelor 12bp\else 16bp\fi\@plus 1ex \@minus .2ex},
- afterskip={6bp \@plus .2ex},
- format={\sffamily\ifthu@degree@bachelor\xiaosi[1.25]\else\banxiaosi[1.538]\fi},
- numberformat={\sffamily\ifthu@degree@bachelor\banxiaosi[1.154]\else\banxiaosi[1.538]\fi},
- },
- subsubsection={
- afterindent=true,
- beforeskip={\ifthu@degree@bachelor 12bp\else 16bp\fi\@plus 1ex \@minus .2ex},
- afterskip={6bp \@plus .2ex},
- format={\sffamily\ifthu@degree@bachelor\xiaosi[1.25]\else\xiaosi[1.667]\fi},
- },
- paragraph/afterindent=true,
- subparagraph/afterindent=true}
+ \else
+ \ctexset{%
+ chapter = {
+ format = \centering\sffamily\sanhao,
+ beforeskip = 27bp,
+ afterskip = 27bp,
+ },
+ section = {
+ format = \sffamily\fontsize{14bp}{20bp}\selectfont,
+ beforeskip = 24bp,
+ afterskip = 6bp,
+ },
+ subsection = {
+ format = \sffamily\fontsize{13bp}{20bp}\selectfont,
+ beforeskip = 12bp,
+ afterskip = 6bp,
+ },
+ subsubsection = {
+ format = \sffamily\fontsize{12bp}{20bp}\selectfont,
+ beforeskip = 12bp,
+ afterskip = 6bp,
+ },
+ }%
+ \fi
+}
+\thu@set@section@format
+\thu@option@hook{degree}{\thu@set@section@format}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\thu@english@number[1]{%
+ \expandafter\ifcase\csname c@#1\endcsname
+ Zero\or
+ One\or
+ Two\or
+ Three\or
+ Four\or
+ Five\or
+ Six\or
+ Seven\or
+ Eight\or
+ Nine\or
+ Ten\or
+ Eleven\or
+ Twelve\or
+ Thirteen\or
+ Fourteen\or
+ Fifteen\or
+ Sixteen\or
+ Seventeen\or
+ Eighteen\or
+ Nineteen\or
+ Twenty\or
+ \thu@error{You are genius}%
+ \fi
+}
% \end{macrocode}
%
% \begin{macro}{\thu@chapter*}
@@ -2082,9 +3024,9 @@
% \begin{macrocode}
\newcommand\thu@pdfbookmark[2]{}
\newcommand\thu@phantomsection{}
-\NewDocumentCommand\thu@chapter{s o m o}{
+\NewDocumentCommand\thu@chapter{s o m o}{%
\IfBooleanF{#1}{%
- \ClassError{thuthesis}{You have to use the star form: \string\thu@chapter*}{}
+ \thu@error{You have to use the star form: \string\thu@chapter*}%
}%
\if@openright\cleardoublepage\else\clearpage\fi%
\IfValueTF{#2}{%
@@ -2092,15 +3034,15 @@
\thu@pdfbookmark{0}{#3}%
}{%
\thu@phantomsection
- \addcontentsline{toc}{chapter}{#3}%
+ \addcontentsline{toc}{chapter}{#2}%
}%
}{%
\thu@phantomsection
\addcontentsline{toc}{chapter}{#3}%
}%
- \ifthu@degree@bachelor\ctexset{chapter/beforeskip=25bp}\fi
+ \ifthu@degree@bachelor\ctexset{chapter/beforeskip=40bp}\fi
\chapter*{#3}%
- \ifthu@degree@bachelor\ctexset{chapter/beforeskip=15bp}\fi
+ \ifthu@degree@bachelor\ctexset{chapter/beforeskip=30bp}\fi
\IfValueTF{#4}{%
\ifthenelse{\equal{#4}{}}{%
\@mkboth{}{}%
@@ -2124,58 +3066,111 @@
\setcounter{tocdepth}{2}
% \end{macrocode}
%
-% 每章标题行前空 6 磅,后空 0 磅。章节名中英文用 Arial 字体,页码仍用 Times。
% \begin{macro}{\tableofcontents}
% 目录生成命令。
% \begin{macrocode}
\renewcommand\tableofcontents{%
- \thu@chapter*[]{\contentsname}
- \ifthu@degree@bachelor\xiaosi[1.667]\else\xiaosi[1.65]\fi\@starttoc{toc}\normalsize}
-% \end{macrocode}
-% 调整目录样式,允许指定目录字体。
-% \begin{macrocode}
-\def\@pnumwidth{2em}
-\def\@tocrmarg{\@pnumwidth}
-\def\@dotsep{1}
-\renewcommand*\l@chapter[2]{%
- \ifnum \c@tocdepth >\m@ne
- \addpenalty{-\@highpenalty}%
- \ifthu@degree@bachelor\vskip 6bp\else\vskip 4bp\fi \@plus\p@
- \setlength\@tempdima{4em}%
- \begingroup
- \parindent \z@ \rightskip \@pnumwidth
- \parfillskip -\@pnumwidth
- \leavevmode
- \advance\leftskip\@tempdima
- \hskip -\leftskip
- \begingroup
- \ifthu@degree@graduate
- \sffamily
- \else
- \ifthu@degree@bachelor
+ \ifthu@degree@graduate
+ \thu@chapter*{\contentsname}%
+ \else
+ \thu@chapter*[]{\contentsname}%
+ \fi
+ \@starttoc{toc}%
+}
+\thu@define@key{
+ toc-chapter-style = {
+ name = toc@chapter@style,
+ choices = {
+ arial,
+ times,
+ },
+ default = arial,
+ },
+}
+\newcommand\thu@leaders{\titlerule*[4bp]{.}}
+\newcommand\thu@set@toc@format{%
+ \contentsmargin{\z@}%
+% \end{macrocode}
+%
+% 本科生:
+% 目录从第 1 章开始,每章标题用黑体小四号字,行间距为 20pt,
+% 行前空 6pt,行后空 0pt。
+% 其它级节标题用宋体小四字,行间距为 20pt。
+%
+% 注意示例中章标题的字母和数字是衬线体,所以这里用 \cs{heiti}。
+% 示例中的一级和二级节标题分别缩进 1 和 1.5 个汉字符。
+% \begin{macrocode}
+ \ifthu@degree@bachelor
+ \ifthu@main@language@chinese
+ \titlecontents{chapter}
+ [\z@]{\addvspace{6bp}
+ \ifthu@toc@chapter@style@arial
+ \sffamily
+ \else
\heiti
\fi
- \fi
- #1%
- \endgroup
- \leaders\hbox{$\m@th\mkern \@dotsep mu\hbox{.}\mkern \@dotsep mu$}\hfill%
- \nobreak #2\par
- \penalty\@highpenalty
- \endgroup
- \fi}
+ }
+ {\contentspush{\thecontentslabel\quad}}{}
+ {\rmfamily\thu@leaders\thecontentspage}%
+ \titlecontents{section}
+ [1em]{}
+ {\contentspush{\thecontentslabel\quad}}{}
+ {\thu@leaders\thecontentspage}%
+ \titlecontents{subsection}
+ [1.5em]{}
+ {\contentspush{\thecontentslabel\quad}}{}
+ {\thu@leaders\thecontentspage}%
+ \else
% \end{macrocode}
%
-% 研究生学位论文写作指南中规定:目录中的章标题行居左书写,一级节标题行缩进 1 个
-% 汉字符,二级节标题行缩进 2 个汉字符(但示例文件中为 1.5 个汉字符)。本科生指
-% 南中未作明确规定,示例文件中对于一级和二级节标题分别缩进 1 和 1.5 个汉字符。
+% 本科生英文专业要求“左侧按级依次缩进 0.5cm”。
+% \begin{macrocode}
+ \ifthu@main@language@english
+ \titlecontents{chapter}
+ [\z@]{\addvspace{6bp}\sffamily}
+ {\contentspush{\thecontentslabel\quad}}{}
+ {\rmfamily\thu@leaders\thecontentspage}%
+ \titlecontents{section}
+ [0.5cm]{}
+ {\contentspush{\thecontentslabel\quad}}{}
+ {\thu@leaders\thecontentspage}%
+ \titlecontents{subsection}
+ [1cm]{}
+ {\contentspush{\thecontentslabel\quad}}{}
+ {\thu@leaders\thecontentspage}%
+ \fi
+ \fi
+% \end{macrocode}
+%
+% 研究生:
+% \begin{enumerate}
+% \item 目录中的章标题行采用黑体小四号字,固定行距 20 磅,段前空 6 磅,
+% 段后 0 磅;其他内容采用宋体小四号字,行距为固定值 20 磅,
+% 段前、段后均为 0 磅。
+% \item 目录中的章标题行居左书写,一级节标题行缩进 1 个汉字符,
+% 二级节标题行缩进 2 个汉字符。
+% \end{enumerate}
+%
+% 注意示例中章标题的字母和数字是无衬线体,所以用这里用 \cs{sffamily},
+% 但是页码仍然用 \cs{rmfamily}。
% \begin{macrocode}
-\patchcmd{\@dottedtocline}{\hb@xt@\@pnumwidth}{\hbox}{}{}
-\renewcommand*\l@section{%
- \@dottedtocline{1}{\ccwd}{2.1em}}
-\renewcommand*\l@subsection{%
- \@dottedtocline{2}{\ifthu@degree@bachelor 1.5\ccwd\else 2\ccwd\fi}{3em}}
-\renewcommand*\l@subsubsection{%
- \@dottedtocline{3}{\ifthu@degree@bachelor 2.4em\else 3.5em\fi}{3.8em}}
+ \else
+ \titlecontents{chapter}
+ [\z@]{\addvspace{6bp}\sffamily}
+ {\contentspush{\thecontentslabel\quad}}{}
+ {\rmfamily\thu@leaders\thecontentspage}%
+ \titlecontents{section}
+ [1em]{}
+ {\contentspush{\thecontentslabel\quad}}{}
+ {\thu@leaders\thecontentspage}%
+ \titlecontents{subsection}
+ [2em]{}
+ {\contentspush{\thecontentslabel\quad}}{}
+ {\thu@leaders\thecontentspage}%
+ \fi
+}
+\thu@set@toc@format
+\thu@option@hook{degree}{\thu@set@toc@format}
% \end{macrocode}
% \end{macro}
%
@@ -2292,6 +3287,18 @@
name = end@date,
default = {\the\year-\two@digits{\month}-\two@digits{\day}},
},
+% \end{macrocode}
+%
+% 中文封面后是否生成书脊页。
+% \begin{macrocode}
+ include-spine = {
+ name = include@spine,
+ choices = {
+ false,
+ true,
+ },
+ default = false,
+ },
}
% \end{macrocode}
%
@@ -2393,10 +3400,12 @@
% \begin{macrocode}
\renewcommand\maketitle{%
\cleardoublepage
- \pagestyle{thu@empty}%
\pagenumbering{Alph}%
\thu@pdfbookmark{-1}{\thu@title}%
\thu@titlepage
+ \ifthu@include@spine@true
+ \thu@spine
+ \fi
\ifthu@degree@graduate
\cleardoublepage
\thu@titlepage@en
@@ -2413,6 +3422,7 @@
% layout 一样,所以按照 \cs{thu@discipline}(工程领域)是否为空来区分“工程硕士”。
% \begin{macrocode}
\newcommand\thu@titlepage{%
+ \thusetup{language = chinese}%
\ifthu@degree@graduate
\ifthu@degree@type@academic
\thu@titlepage@graduate@academic
@@ -2434,6 +3444,7 @@
\fi
\fi
\fi
+ \thu@reset@main@language
}
% \end{macrocode}
% \end{macro}
@@ -2450,6 +3461,7 @@
bottom = 6cm,
hmargin = 3.5cm,
}%
+ \thispagestyle{empty}%
\null\vskip 0.2cm%
\begingroup
\centering
@@ -2478,6 +3490,7 @@
bottom = 6cm,
hmargin = 3.5cm,
}%
+ \thispagestyle{empty}%
\null\vskip 0.45cm%
\begingroup
\centering
@@ -2500,7 +3513,7 @@
%
% \begin{macrocode}
\newcommand\thu@titlepage@secret{%
- \sffamily\CJKfamily+{}\sanhao
+ \sffamily\sanhao
\ifx\thu@secret@level\@empty
\phantom{秘密}%
\else
@@ -2533,52 +3546,86 @@
% \begin{macrocode}
\newcommand\thu@titlepage@info{%
\ifthu@degree@doctor
- \thu@titlepage@info@doctor
+ \ifthu@degree@type@academic
+ \thu@titlepage@info@doctor@academic
+ \else
+ \thu@titlepage@info@doctor@professional
+ \fi
\else
- \thu@titlepage@info@master
+ \ifthu@degree@type@academic
+ \thu@titlepage@info@master@academic
+ \else
+ \ifx\thu@discipline\@empty
+ \thu@titlepage@info@master@other
+ \else
+ \thu@titlepage@info@master@engineer
+ \fi
+ \fi
\fi
}
-\newcommand\thu@cover@info@tabular[4]{%
- \def\thu@cover@item##1##2##3{%
+% \end{macrocode}
+%
+% 标题页作者信息表
+% \begin{macrocode}
+\newcommand\thu@titlepage@info@tabular[4]{%
+ \def\thu@info@item##1##2##3{%
\ifx##3\@empty\else
- \thu@pad{#2}{\thu@fixed@box{#1}{##1}}%
+ \thu@pad{#1}{\thu@fixed@box{#2}{##1}}%
\thu@pad{#3}{:}%
##2{##3}\\
\fi
}%
+ \fangsong\sanhao[1.95]%
\begin{tabular}{l}%
#4%
- \end{tabular}
+ \end{tabular}%
}
-\newcommand\thu@titlepage@info@doctor{%
- \fangsong\sanhao[1.95]%
- \thu@cover@info@tabular{2.8cm}{2.8cm}{0.82cm}{%
- \thu@cover@item{培养单位}{}{\thu@department}%
- \ifthu@degree@type@academic
- \thu@cover@item{学科}{}{\thu@discipline}%
- \thu@cover@item{研究生}{\thu@name@title}{\thu@author}%
- \else
- \thu@cover@item{申请人}{\thu@name@title}{\thu@author}%
- \fi
- \thu@cover@item{指导教师}{\thu@name@title}{\thu@supervisor}%
- \thu@cover@item{副指导教师}{\thu@name@title}{\thu@associate@supervisor}%
- \thu@cover@item{联合导师}{\thu@name@title}{\thu@joint@supervisor}%
+\newcommand\thu@titlepage@info@doctor@academic{%
+ \thu@titlepage@info@tabular{2.8cm}{2.8cm}{0.82cm}{%
+ \thu@info@item{培养单位}{}{\thu@department}%
+ \thu@info@item{学科}{}{\thu@discipline}%
+ \thu@info@item{研究生}{\thu@name@title}{\thu@author}%
+ \thu@info@item{指导教师}{\thu@name@title}{\thu@supervisor}%
+ \thu@info@item{副指导教师}{\thu@name@title}{\thu@associate@supervisor}%
+ \thu@info@item{联合导师}{\thu@name@title}{\thu@joint@supervisor}%
}\par
}
-\newcommand\thu@titlepage@info@master{%
- \fangsong\sanhao[1.95]%
- \thu@cover@info@tabular{5.5em}{3.6cm}{0.82cm}{%
- \thu@cover@item{培养单位}{}{\thu@department}%
- \ifthu@degree@type@academic
- \thu@cover@item{学科}{}{\thu@discipline}%
- \thu@cover@item{研究生}{\thu@name@title}{\thu@author}%
- \else
- \thu@cover@item{工程领域}{}{\thu@discipline}%
- \thu@cover@item{申请人}{\thu@name@title}{\thu@author}%
- \fi
- \thu@cover@item{指导教师}{\thu@name@title}{\thu@supervisor}%
- \thu@cover@item{副指导教师}{\thu@name@title}{\thu@associate@supervisor}%
- \thu@cover@item{联合指导教师}{\thu@name@title}{\thu@joint@supervisor}%
+\newcommand\thu@titlepage@info@doctor@professional{%
+ \thu@titlepage@info@tabular{3.03cm}{5em}{1.52cm}{%
+ \thu@info@item{培养单位}{}{\thu@department}%
+ \thu@info@item{申请人}{\thu@name@title}{\thu@author}%
+ \thu@info@item{指导教师}{\thu@name@title}{\thu@supervisor}%
+ \thu@info@item{副指导教师}{\thu@name@title}{\thu@associate@supervisor}%
+ \thu@info@item{联合导师}{\thu@name@title}{\thu@joint@supervisor}%
+ }\par
+}
+\newcommand\thu@titlepage@info@master@academic{%
+ \thu@titlepage@info@tabular{3.59cm}{5.5em}{0.82cm}{%
+ \thu@info@item{培养单位}{}{\thu@department}%
+ \thu@info@item{学科}{}{\thu@discipline}%
+ \thu@info@item{研究生}{\thu@name@title}{\thu@author}%
+ \thu@info@item{指导教师}{\thu@name@title}{\thu@supervisor}%
+ \thu@info@item{副指导教师}{\thu@name@title}{\thu@associate@supervisor}%
+ \thu@info@item{联合指导教师}{\thu@name@title}{\thu@joint@supervisor}%
+ }\par
+}
+\newcommand\thu@titlepage@info@master@engineer{%
+ \thu@titlepage@info@tabular{2.8cm}{2.8cm}{1.34cm}{%
+ \thu@info@item{培养单位}{}{\thu@department}%
+ \thu@info@item{工程领域}{}{\thu@discipline}%
+ \thu@info@item{申请人}{\thu@name@title}{\thu@author}%
+ \thu@info@item{指导教师}{\thu@name@title}{\thu@supervisor}%
+ \thu@info@item{副指导教师}{\thu@name@title}{\thu@associate@supervisor}%
+ \thu@info@item{联合指导教师}{\thu@name@title}{\thu@joint@supervisor}%
+ }\par
+}
+\newcommand\thu@titlepage@info@master@other{%
+ \thu@titlepage@info@tabular{3.28cm}{5em}{1.52cm}{%
+ \thu@info@item{培养单位}{}{\thu@department}%
+ \thu@info@item{申请人}{\thu@name@title}{\thu@author}%
+ \thu@info@item{指导教师}{\thu@name@title}{\thu@supervisor}%
+ \thu@info@item{副指导教师}{\thu@name@title}{\thu@associate@supervisor}%
+ \thu@info@item{联合指导教师}{\thu@name@title}{\thu@joint@supervisor}%
}\par
}
% \end{macrocode}
@@ -2603,11 +3650,14 @@
bottom = 5cm,
hmargin = 3.6cm,
}%
+ \thispagestyle{empty}%
+ \thusetup{language = english}%
\ifthu@degree@type@academic
\thu@titlepage@en@graduate@academic
\else
\thu@titlepage@en@graduate@professional
\fi
+ \thu@reset@main@language
\clearpage
\restoregeometry
}
@@ -2708,64 +3758,91 @@
% \end{macro}
%
% \myentry{本科生封面}
+% 本科生封面要求:
+% \begin{itemize}
+% \item 题目:1 号黑体字,1.2 倍行距。
+% \item 系别、专业、姓名及指导教师信息部分使用三号仿宋\_GB2312 字。
+% \item 论文成文打印的日期用阿拉伯数字,采用小四号宋体。
+% \item 涉密的论文在封面右上角处注明论文密级,采用小四号宋体。
+% \end{itemize}
+%
+% 外文系英语专业要求题目先写中文标题,再写英文标题,字号 26pt,32 磅行距。
% \begin{macrocode}
\newcommand\thu@titlepage@bachelor{%
\newgeometry{
vmargin = 2.54cm,
hmargin = 3.17cm,
}%
- \null\vskip 0.44cm%
+ \thispagestyle{empty}%
\begingroup
\centering
- \parbox[t][2cm][t]{\textwidth}{%
+ \parbox[t][0cm][t]{\textwidth}{%
\hfill
- \sffamily\CJKfamily+{}\xiaosi
- \ifx\thu@secret@level\@empty
- \phantom{秘密}%
- \else
- \thu@secret@level\makebox[3em][c]{\thu@secret@year}年%
- \fi\par
- }\par
- \begingroup
- \ifcsname lishu\endcsname
- \lishu\yihao\ziju{0.5}清华大学%
- \else
- \includegraphics{tsinghua.pdf}%
+ \xiaosi
+ \ifx\thu@secret@level\@empty\else
+ \thu@secret@level\space\thu@secret@year 年\par
\fi
- \par
- \endgroup
+ }%
+ \endgroup
+ \vfill
+ \begingroup
+ \centering
+ \includegraphics{tsinghua-name-bachelor.pdf}%
\vskip 0.94cm%
{\sffamily\bfseries\xiaochu\ziju{0.5}综合论文训练\par}%
- \vskip 2.3cm%
- \parbox[t][2.4cm][t]{\textwidth}{%
- \heiti\xiaoer[1.56]%
- \parindent=2em%
- \hangindent=5em%
- \makebox[3em][l]{题目:}%
+ \endgroup
+ \vskip 1.8cm%
+ \begingroup
+ \heiti
+ \ifthu@main@language@chinese
\yihao[1.56]%
- \CJKunderline[skip=false, thickness=0.05em, depth=0.12em]{\thu@title}\par
- }\par
- \vskip 2.5cm%
- \parbox[t][6.0cm][t]{\textwidth}{%
- \fangsong\sanhao[2.3]%
- \leftskip=2.5cm%
- \parindent=\z@
- \def\thu@cover@item##1##2##3{%
- \ifx##3\@empty\else
- \thu@fixed@box{4em}{##1}:##2{##3}\\
- \fi
- }%
- \def\thu@name@title@format##1##2{%
- \thu@stretch{3em}{##1}\quad ##2%
- }
- \thu@cover@item{系别}{}{\thu@department}%
- \thu@cover@item{专业}{}{\thu@discipline}%
- \thu@cover@item{姓名}{\thu@name@title}{\thu@author}%
- \thu@cover@item{指导教师}{\thu@name@title}{\thu@supervisor}%
- \thu@cover@item{辅导教师}{\thu@name@title}{\thu@associate@supervisor}%
- }\par
- {\xiaosi\thu@format@date{\thu@date@zh@digit}{\thu@date}\par}%
+ \else
+ \fontsize{26bp}{32bp}\selectfont
+ \fi
+ \parindent=18bp%
+ \hangindent=72bp%
+ \makebox[54bp]{\xiaoer[1.2]题目:}%
+ \CJKunderline*[skip=false, thickness=0.05em, depth=0.12em]{\thu@title}%
+ \ifthu@main@language@english
+ \\
+ \thusetup{language=english}%
+ \ul\thu@title@en
+ \thusetup{language=chinese}%
+ \fi
+ \par
+ \endgroup
+ \vskip 1.9cm%
+ \begingroup
+ \fangsong\sanhao[2.32]%
+ \leftskip=2.5cm%
+ \parindent=\z@
+ \def\thu@info@item##1##2##3{%
+ \ifx##3\@empty\else
+ \thu@fixed@box{%
+ \ifx\thu@joint@supervisor\@empty
+ 4em%
+ \else
+ 5.5em%
+ \fi
+ }{##1}:##2{##3}\par
+ \fi
+ }%
+ \def\thu@name@title@format##1##2{%
+ \thu@stretch{3em}{##1}\quad ##2%
+ }%
+ \thu@info@item{系别}{}{\thu@department}%
+ \thu@info@item{专业}{}{\thu@discipline}%
+ \thu@info@item{姓名}{\thu@name@title}{\thu@author}%
+ \thu@info@item{指导教师}{\thu@name@title}{\thu@supervisor}%
+ \thu@info@item{辅导教师}{\thu@name@title}{\thu@associate@supervisor}%
+ \thu@info@item{联合指导教师}{\thu@name@title}{\thu@joint@supervisor}%
\endgroup
+ \vskip 1.4cm%
+ \begingroup
+ \centering
+ {\CJKfamily+{}\xiaosi\thu@format@date{\thu@date@zh@digit}{\thu@date}\par}%
+ \endgroup
+ \vfill
\clearpage
\restoregeometry
}
@@ -2774,6 +3851,7 @@
% \myentry{博士后封面}
% \begin{macrocode}
\newcommand\thu@cover@postdoc{%
+ \thispagestyle{empty}%
\begin{center}%
\renewcommand\ULthickness{0.7pt}%
\vspace*{0.35cm}%
@@ -2816,6 +3894,7 @@
% \myentry{博士后题名页}
% \begin{macrocode}
\newcommand\thu@titlepage@postdoc{%
+ \thispagestyle{empty}%
\begin{center}%
\vspace*{1.5cm}%
\parbox[t][3cm][c]{\textwidth}{%
@@ -2847,50 +3926,70 @@
}
% \end{macrocode}
%
-% \myentry{授权说明}
+% \subsubsection{答辩委员会名单}
+% \begin{environment}{committee}
+% 学位论文指导小组、公开评阅人和答辩委员会名单。
+% \begin{macrocode}
+\def\thu@committee@name{学位论文指导小组、公开评阅人和答辩委员会名单}
+\newenvironment{committee}[1][]{%
+ \cleardoublepage
+ \let\thu@committee@file\@empty
+ \kv@define@key{thu@committee}{name}{\let\thu@committee@name\kv@value}%
+ \kv@define@key{thu@committee}{file}{\let\thu@committee@file\kv@value}%
+ \kv@set@family@handler{thu@committee}{%
+ \ifx\kv@value\relax
+ \let\thu@committee@file\kv@key
+ \else
+ \kv@handled@false
+ \fi
+ }%
+ \kvsetkeys{thu@committee}{#1}%
+ \ifx\thu@committee@file\@empty
+ \thu@chapter*[]{\thu@committee@name}%
+ \else
+ \thu@pdfbookmark{0}{\thu@committee@name}%
+ \includepdf{\thu@committee@file}%
+ \fi
+ \thispagestyle{empty}%
+ \ctexset{
+ section = {
+ format += {\centering},
+ numbering = false,
+ afterindent = false,
+ },
+ }%
+}{%
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \subsubsection{授权说明}
% \begin{macro}{\copyrightpage}
% 授权说明
% \begin{macrocode}
-\newcommand{\thu@authorization}{%
-\ifthu@degree@bachelor
-本人完全了解清华大学有关保留、使用学位论文的规定,即:学校有权保留学位
-论文的复印件,允许该论文被查阅和借阅;学校可以公布该论文的全部或部分内
-容,可以采用影印、缩印或其他复制手段保存该论文。
-\else
-本人完全了解清华大学有关保留、使用学位论文的规定,即:
-
-清华大学拥有在著作权法规定范围内学位论文的使用权,其中包括:(1)已获学位的研究生
-必须按学校规定提交学位论文,学校可以采用影印、缩印或其他复制手段保存研究生上交的
-学位论文;(2)为教学和科研目的,学校可以将公开的学位论文作为资料在图书馆、资料
-室等场所供校内师生阅读,或在校园网上供校内师生浏览部分内容\ifthu@degree@master 。\else ;
-(3)根据《中华人民共和国学位条例暂行实施办法》,向国家图书馆报送可以公开的学位
-论文。\fi
-
-本人保证遵守上述规定。
-\fi}
-\newcommand{\thu@authorizationaddon}{%
- \ifthu@degree@bachelor(涉密的学位论文在解密后应遵守此规定)\else (保密的论文在解密后应遵守此规定)\fi}
-\newcommand{\thu@authorsig}{\ifthu@degree@bachelor 签\hskip1em名:\else 作者签名:\fi}
-\newcommand{\thu@teachersig}{导师签名:}
-\newcommand{\thu@frontdate}{%
- 日\ifthu@degree@bachelor\hspace{1em}\else\hspace{2em}\fi 期:}
\newcommand\copyrightpage[1][]{%
\ifthu@degree@postdoc\relax\else
- \ifthu@degree@bachelor\clearpage\else\cleardoublepage\fi%
\def\thu@@tmp{#1}
\ifx\thu@@tmp\@empty
- \ifthu@degree@bachelor\thu@authorization@mk\else%
- \begin{list}{}{%
- \topsep\z@%
- \listparindent\parindent%
- \parsep\parskip%
- \setlength{\leftmargin}{0.9mm}%
- \setlength{\rightmargin}{0.9mm}}%
- \item[]\thu@authorization@mk%
- \end{list}%
- \fi%
+ \ifthu@degree@bachelor
+ \thu@copyright@page@bachelor
+ \else
+ \thu@copyright@page@graduate
+ \fi
\else
- \includepdf{#1}%
+ \cleardoublepage
+ \thispagestyle{empty}%
+ \thu@pdfbookmark{0}{\thu@authorization@title}%
+ \thu@phantomsection
+ \kv@define@key{thu@copyright}{file}{\includepdf{\kv@value}}%
+ \kv@set@family@handler{thu@copyright}{%
+ \ifx\kv@value\relax
+ \includepdf{\kv@key}%
+ \else
+ \kv@handled@false
+ \fi
+ }%
+ \kvsetkeys{thu@copyright}{#1}%
\fi
\fi
}
@@ -2898,25 +3997,84 @@
%
% 支持扫描文件替换。
% \begin{macrocode}
-\newcommand{\thu@authorization@mk}{%
- \ifthu@degree@bachelor\vspace*{0.2cm}\else\vspace*{0.42cm}\fi % shit code!
- \begin{center}\erhao\heiti 关于学位论文使用授权的说明\end{center}
- \ifthu@degree@bachelor\vskip5pt\else\vskip40pt\sihao[2.03]\fi\par
- \thu@authorization\par
- \textbf{\thu@authorizationaddon}\par
- \ifthu@degree@bachelor\vskip0.7cm\else\vskip1.0cm\fi
- \ifthu@degree@bachelor
- \indent\mbox{\thu@authorsig\thu@underline\relax%
- \thu@teachersig\thu@underline\relax\thu@frontdate\thu@underline\relax}
- \else
- \begingroup
- \parindent0pt\xiaosi
- \hspace*{1.5cm}\thu@authorsig\thu@underline[7em]\relax\hfill%
- \thu@teachersig\thu@underline[7em]\relax\hspace*{1cm}\\[3pt]
- \hspace*{1.5cm}\thu@frontdate\thu@underline[7em]\relax\hfill%
- \thu@frontdate\thu@underline[7em]\relax\hspace*{1cm}
- \endgroup
- \fi}
+\newcommand{\thu@authorization@frontdate}{%
+ 日\ifthu@degree@bachelor\hspace{1em}\else\hspace{2em}\fi 期:}
+\newcommand\thu@copyright@page@graduate{%
+ \cleardoublepage
+ \newgeometry{
+ vmargin = 3.8cm,
+ hmargin = 3.2cm,
+ }%
+ \begingroup
+ \ctexset{
+ chapter = {
+ format = {\centering\sffamily\erhao},
+ beforeskip = 18bp,
+ afterskip = 6bp,
+ },
+ }%
+ \thu@chapter*[]{关于学位论文使用授权的说明}%
+ \thispagestyle{empty}%
+ \endgroup
+ \vskip 50bp%
+ \begingroup
+ \fontsize{14bp}{26bp}\selectfont
+ 本人完全了解清华大学有关保留、使用学位论文的规定,即:\par
+ 清华大学拥有在著作权法规定范围内学位论文的使用权,其中包括:%
+ (1)已获学位的研究生必须按学校规定提交学位论文,%
+ 学校可以采用影印、缩印或其他复制手段保存研究生上交的学位论文;%
+ (2)\nobreak 为教学和科研目的,学校可以将公开的学位论文作为资料在图书馆、资料室等场所供校内师生阅读,%
+ 或在校园网上供校内师生浏览部分内容;%
+ \ifthu@degree@doctor
+ (3)根据《中华人民共和国学位条例暂行实施办法》及上级教育主管部门具体要求,向国家图书馆报送相应的学位论文。%
+ \else
+ (3)按照上级教育主管部门督导、抽查等要求,报送相应的学位论文。%
+ \fi
+ \par
+ 本人保证遵守上述规定。\par
+ \vskip 6bp%
+ \textbf{(保密的论文在解密后遵守此规定)}\par
+ \endgroup
+ \vskip1.2cm%
+ \begingroup
+ \noindent\xiaosi
+ \hspace*{1.5cm}%
+ 作者签名:\thu@underline[7em]\relax\hfill
+ 导师签名:\thu@underline[7em]\relax\hspace*{1cm}\\[3pt]%
+ \hspace*{1.5cm}%
+ 日\hspace{2em}期:\thu@underline[7em]\relax\hfill
+ 日\hspace{2em}期:\thu@underline[7em]\relax\hspace*{1cm}%
+ \endgroup
+ \clearpage
+ \restoregeometry
+}
+\newcommand\thu@copyright@page@bachelor{%
+ \cleardoublepage
+ \begingroup
+ \ctexset{
+ chapter = {
+ format = {\centering\sffamily\erhao[1]},
+ beforeskip = 1bp,
+ afterskip = 24bp,
+ },
+ }%
+ \thu@chapter*[]{关于学位论文使用授权的说明}%
+ \thispagestyle{empty}%
+ \endgroup
+ \vskip 4bp%
+ 本人完全了解清华大学有关保留、使用学位论文的规定,即:%
+ 学校有权保留学位论文的复印件,允许该论文被查阅和借阅;%
+ 学校可以公布该论文的全部或部分内容,可以采用影印、缩印或其他复制手段保存该论文。\par
+ \textbf{(涉密的学位论文在解密后应遵守此规定)}\par
+ \null\par
+ \begingroup
+ \centering
+ 签\quad 名:\thu@underline[6em]{}%
+ 导师签名:\thu@underline[6em]{}%
+ 日\quad 期\thu@underline[6em]{}%
+ \par
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
%
@@ -2936,7 +4094,7 @@
}
\newcommand\thu@clist@use[2]{%
\def\thu@@tmp{}%
- \kv@set@family@handler{thu@clist}{%
+ \def\thu@clist@processor##1{%
\ifx\thu@@tmp\@empty
\def\thu@@tmp{#2}%
\else
@@ -2944,63 +4102,77 @@
\fi
##1%
}%
- \kvsetkeys@expandafter{thu@clist}{#1}%
+ \expandafter\comma@parse\expandafter{#1}{\thu@clist@processor}%
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\thu@put@keywords}
-% 排版关键字。
-% \begin{macrocode}
-\newbox\thu@kw
-\newcommand\thu@put@keywords[2]{%
- \begingroup
- \setbox\thu@kw=\hbox{#1}
- \ifthu@degree@bachelor\indent\else\noindent\hangindent\wd\thu@kw\hangafter1\fi%
- \box\thu@kw#2\par
- \endgroup}
-% \end{macrocode}
-% \end{macro}
-%
% \begin{environment}{abstract}
% 中文摘要部分的标题为“\textbf{摘要}”,用黑体三号字。
% 摘要内容用小四号字书写,两端对齐,汉字用宋体,外文字用 Times New Roman 体,
% 标点符号一律用中文输入状态下的标点符号。
% \begin{macrocode}
\newenvironment{abstract}{%
- \ifthu@degree@bachelor\clearpage\else\cleardoublepage\fi
- \thu@setchinese
- \thu@chapter*[]{\cabstractname} % no tocline
+ \ifthu@degree@bachelor
+ \cleardoublepage
+ \fi
+ \thusetup{language = chinese}%
+ \ifthu@degree@graduate
+ \thu@chapter*{\thu@abstract@name}%
+ \else
+ \thu@chapter*[]{\thu@abstract@name}%
+ \fi
}{%
% \end{macrocode}
%
% 每个关键词之间空两个汉字符宽度, 且为悬挂缩进。
% \begin{macrocode}
- \ifthu@degree@doctor\vfill\else\vskip12bp\fi
- \thu@put@keywords{\textbf{关键词:}}{%
- \thu@clist@use{\thu@keywords}{;}%
- }%
- \thu@setdefaultlanguage
+ \par
+ \null\par
+ \ifthu@degree@graduate
+ \noindent
+ \textsf{关键词:}%
+ \else
+ \textbf{关键词:}%
+ \fi
+ \thu@clist@use{\thu@keywords}{;}%
+ \ifthu@degree@bachelor
+ \cleardoublepage
+ \fi
+ \thu@reset@main@language % switch back to main language
}
% \end{macrocode}
% \end{environment}
%
% \begin{environment}{abstract*}
-% 英文摘要部分的标题为 \textbf{Abstract},用 Arial 体三号字。研究生的英文摘要要求
-% 非常怪异:虽然正文前的封面部分为右开,但是英文摘要要跟中文摘要连续。
+% 英文摘要部分的标题为 \textbf{Abstract},用 Arial 体三号字。
% 摘要内容用小四号 Times New Roman。
% \begin{macrocode}
\newenvironment{abstract*}{%
- \thu@setenglish
- \thu@chapter*[]{\eabstractname} % no tocline
+ \ifthu@degree@bachelor
+ \cleardoublepage
+ \fi
+ \thusetup{language = english}%
+ \ifthu@degree@graduate
+ \thu@chapter*{\thu@abstract@name@en}%
+ \else
+ \thu@chapter*[]{\thu@abstract@name@en}%
+ \fi
}{%
- \ifthu@degree@doctor\vfill\else\vskip12bp\fi
- \thu@put@keywords{%
- \textbf{\ifthu@degree@bachelor Keywords:\else Key Words:\fi\enskip}%
- }{%
- \thu@clist@use{\thu@keywords@en}{; }%
- }%
- \thu@setdefaultlanguage
+ \par
+ \null\par
+ \ifthu@degree@graduate
+ \noindent
+ \fi
+ \textbf{Keywords:}\space
+ \thu@clist@use{\thu@keywords@en}{; }%
+ \ifthu@degree@graduate
+ \vspace*{\stretch{1}}%
+ \fi
+ \ifthu@degree@bachelor
+ \cleardoublepage
+ \fi
+ \thu@reset@main@language % switch back to main language
}
% \end{macrocode}
% \end{environment}
@@ -3011,7 +4183,14 @@
% 主要符号对照表。
% \begin{macrocode}
\newenvironment{denotation}[1][2.5cm]{%
- \thu@chapter*[]{\thu@denotation@name} % no tocline
+ \ifthu@degree@bachelor
+ \cleardoublepage
+ \fi
+ \ifthu@degree@graduate
+ \thu@chapter*{\thu@denotation@name}%
+ \else
+ \thu@chapter*[]{\thu@denotation@name}%
+ \fi
\vskip-30bp\xiaosi[1.6]\begin{thu@denotation}[labelwidth=#1]
}{%
\end{thu@denotation}
@@ -3035,10 +4214,9 @@
% \label{sec:ackanddeclare}
%
% \begin{environment}{acknowledgements}
-% 支持扫描文件替换。
+% 定义致谢环境
% \begin{macrocode}
-\newcommand\thu@declarename{声\hspace{\ccwd}明}
-\newcommand{\thu@declaretext}{本人郑重声明:所呈交的学位论文,是本人在导师指导下
+\newcommand{\thu@statement@text}{本人郑重声明:所呈交的学位论文,是本人在导师指导下
,独立进行研究工作所取得的成果。尽我所知,除文中已经注明引用的内容外,本学位论
文的研究成果不包含任何他人享有著作权的内容。对本论文所涉及的研究工作做出贡献的
其他个人和集体,均已在文中以明确方式标明。}
@@ -3049,27 +4227,94 @@
% 定义致谢与声明环境。
% \begin{macrocode}
\newenvironment{acknowledgements}{%
- \thu@chapter*{\thu@ack@name}%
-}{}
+ \@mainmatterfalse
+ \ifthu@degree@bachelor
+ \cleardoublepage
+ \fi
+ \thu@chapter*{\thu@acknowledgements@name}%
+}{%
+ \ifthu@degree@bachelor
+ \cleardoublepage
+ \fi
+}
% \end{macrocode}
+% \end{environment}
%
-% 声明部分
+% \begin{macro}{statement}
+% 声明部分(支持扫描文件替换)
% \begin{macrocode}
+\thu@define@key{
+ statement-page-style = {
+ name = statement@page@style,
+ choices = {
+ empty,
+ plain,
+ },
+ default = empty,
+ },
+ statement-page-number = {
+ name = statement@page@number,
+ choices = {
+ false,
+ true,
+ },
+ default = false,
+ },
+}
+\thu@option@hook{statement-page-number}{%
+ \ifthu@statement@page@number@false
+ \thusetup{statement-page-style=empty}%
+ \else
+ \thusetup{statement-page-style=plain}%
+ \fi
+ \thu@warning{%
+ The "statement-page-number" option is deprecated.
+ Use "page-style" option of \protect\statement command instead%
+ }%
+}
\newcommand\statement[1][]{%
- \def\thu@@tmp{#1}%
- \ifx\thu@@tmp\@empty
- \thu@chapter*{\thu@declarename}%
- \par{\xiaosi\parindent2em\thu@declaretext}\vskip2cm%
- {\xiaosi\hfill\thu@signature\thu@underline[2.5cm]\relax
+ \@mainmatterfalse
+ \ifthu@degree@bachelor
+ \cleardoublepage
+ \def\thu@statement@name{声\hspace{2em}明}%
+ \else
+ \def\thu@statement@name{声\hspace{1em}明}%
+ \fi
+ \let\thu@statement@file\@empty
+ \kv@define@key{thu@statement}{page-style}{\thusetup{statement-page-style=##1}}%
+ \kv@define@key{thu@statement}{file}{\let\thu@statement@file\kv@value}%
+ \kv@set@family@handler{thu@statement}{%
+ \ifx\kv@value\relax
+ \let\thu@statement@file\kv@key
+ \else
+ \kv@handled@false
+ \fi
+ }%
+ \kvsetkeys{thu@statement}{#1}%
+ \ifx\thu@statement@file\@empty
+ \thu@chapter*{\thu@statement@name}%
+ \thispagestyle{\thu@statement@page@style}%
+ \thu@statement@text\par
+ \ifthu@degree@graduate
+ \vskip 2cm%
+ \else
+ \null\par
+ \fi
+ {\hfill\thu@signature\thu@underline[2.5cm]\relax
\thu@backdate\thu@underline[2.5cm]\relax}%
\else
- \includepdf[pagecommand={\thispagestyle{thu@empty}%
- \addcontentsline{toc}{chapter}{\thu@declarename}%
- }]{#1}%
+ \includepdf[pagecommand={%
+ \markboth{\thu@statement@name}{}%
+ \thu@phantomsection
+ \addcontentsline{toc}{chapter}{\thu@statement@name}%
+ }]{\thu@statement@file}%
+ \fi
+ \ifthu@degree@bachelor
+ \cleardoublepage
\fi
}
% \end{macrocode}
-% \end{environment}
+% \end{macro}
%
% 兼容旧版本保留 \env{acknowledgement}。
% \begin{macrocode}
@@ -3077,32 +4322,59 @@
\let\endacknowledgement\endacknowledgements
% \end{macrocode}
%
-% \subsubsection{图表索引}
-% \label{sec:threeindex}
-% \begin{macro}{\listoffigures}
-% \begin{macro}{\listoffigures*}
-% \begin{macro}{\listoftables}
-% \begin{macro}{\listoftables*}
+% \subsubsection{插图和附表清单}
+% \label{sec:threelists}
% 定义图表以及公式目录样式。
% \begin{macrocode}
-\def\thu@starttoc#1{% #1: float type, prepend type name in \listof*** entry.
- \let\oldnumberline\numberline
- \def\numberline##1{\oldnumberline{\csname #1name\endcsname\hskip.4em ##1}}
- \@starttoc{\csname ext@#1\endcsname}
- \let\numberline\oldnumberline}
\def\thu@listof#1{% #1: float type
\setcounter{tocdepth}{2} % restore tocdepth in case being modified
\@ifstar
- {\thu@chapter*[]{\csname list#1name\endcsname}\thu@starttoc{#1}}
- {\thu@chapter*{\csname list#1name\endcsname}\thu@starttoc{#1}}}
-\renewcommand\listoffigures{\thu@listof{figure}}
-\renewcommand*\l@figure{\ifthu@degree@bachelor\relax\else\addvspace{6bp}\fi\@dottedtocline{1}{0em}{4em}}
-\renewcommand\listoftables{\thu@listof{table}}
-\let\l@table\l@figure
+ {\thu@chapter*[]{\csname list#1name\endcsname}\@starttoc{\csname ext@#1\endcsname}}
+ {\thu@chapter*{\csname list#1name\endcsname}\@starttoc{\csname ext@#1\endcsname}}%
+}
+% \end{macrocode}
+%
+% \begin{macro}{\listoffigures}
+% \begin{macro}{\listoffigures*}
+% 插图清单。
+% \begin{macrocode}
+\renewcommand\listoffigures{%
+ \thu@listof{figure}%
+}
+\titlecontents{figure}
+ [\z@]{}
+ {\contentspush{\figurename~\thecontentslabel\quad}}{}
+ {\nobreak\thu@leaders\nobreak\hfil\thecontentspage}
% \end{macrocode}
% \end{macro}
% \end{macro}
+%
+% \begin{macro}{\listoftables}
+% \begin{macro}{\listoftables*}
+% 附表清单。
+% \begin{macrocode}
+\renewcommand\listoftables{%
+ \thu@listof{table}%
+}
+\titlecontents{table}
+ [\z@]{}
+ {\contentspush{\tablename~\thecontentslabel\quad}}{}
+ {\thu@leaders\thecontentspage}
+% \end{macrocode}
+% \end{macro}
% \end{macro}
+%
+% \begin{macro}{\listoffiguresandtables}
+% 将插图和附表合在一起列出“插图和附表清单”。
+% \begin{macrocode}
+\newcommand\listoffiguresandtables{%
+ \thu@chapter*{\thu@list@figure@table@name}%
+ \@starttoc{lof}%
+ \par
+ \null\par
+ \@starttoc{lot}%
+}
+% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\equcaption}
@@ -3127,9 +4399,14 @@
% \begin{macro}{\listofequations}
% \begin{macro}{\listofequations*}
% \LaTeX{} 默认没有公式索引,此处定义自己的 \cs{listofequations}。
+% 公式索引没有名称,所以不设置固定的 label 宽度。
% \begin{macrocode}
\newcommand\listofequations{\thu@listof{equation}}
-\let\l@equation\l@figure
+\titlecontents{equation}
+ [0pt]{\addvspace{6bp}}
+ {\thu@equation@name~\thecontentslabel}{}
+ {\nobreak\thu@leaders\nobreak\thecontentspage}
+\contentsuse{equation}{loe}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -3138,124 +4415,464 @@
% \subsection{参考文献}
% \label{sec:ref}
%
+% 参考文献的格式根据用户选择的 \BibTeX{}/BibLaTeX 分别进行配置,
+% 所以使用 \pkg{filehook} 的方式。
+%
+% 设置 \option{cite-style} 的接口,只对 \BibTeX{} 的编译方式有效。
+% \begin{macrocode}
+ \thu@define@key{
+ cite-style = {
+ name = cite@style,
+ choices = {
+ super,
+ inline,
+ author-year,
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \subsubsection{BibTeX + \pkg{natbib} 宏包}
+%
+% \BibTeX{} 和 \pkg{natbib} 宏包的配置。
+% \begin{macrocode}
+\PassOptionsToPackage{compress}{natbib}
+\AtEndOfPackageFile*{natbib}{
+% \end{macrocode}
% \begin{macro}{\inlinecite}
% 依赖于 \pkg{natbib} 宏包,修改其中的命令。 旧命令 \cs{onlinecite} 依然可用。
% \begin{macrocode}
-\DeclareRobustCommand\inlinecite{\@inlinecite}
-\def\@inlinecite#1{\begingroup\let\@cite\NAT@citenum\citep{#1}\endgroup}
-\let\onlinecite\inlinecite
+ \DeclareRobustCommand\inlinecite{\@inlinecite}
+ \def\@inlinecite#1{\begingroup\let\@cite\NAT@citenum\citep{#1}\endgroup}
+ \let\onlinecite\inlinecite
% \end{macrocode}
% \end{macro}
%
-% 参考文献的正文部分用五号字。
-% 行距采用固定值 16 磅,段前空 3 磅,段后空 0 磅。
-% 本科生要求固定行距 17pt,段前后间距 3pt。
+% 几种种引用样式,与 \file{bst} 文件名保持一致,
+% 这样在使用 \cs{bibliographystyle} 选择参考文献表的样式时也会设置对应的引用样式。
+% \begin{macrocode}
+ \newcommand\bibstyle@super{%
+ \bibpunct{[}{]}{,}{s}{,}{\textsuperscript{,}}}
+ \newcommand\bibstyle@inline{%
+ \bibpunct{[}{]}{,}{n}{,}{,}}
+ \@namedef{bibstyle@author-year}{%
+ \bibpunct{(}{)}{;}{a}{,}{,}}
+% \end{macrocode}
%
-% 复用 \pkg{natbib} 的 \texttt{thebibliography} 环境,调整距离。
% \begin{macrocode}
-\renewcommand\bibsection{\thu@chapter*{\bibname}}
-\renewcommand\bibfont{\ifthu@degree@bachelor\wuhao[1.619]\else\wuhao[1.5]\fi}
-\setlength\bibhang{2\ccwd}
-\addtolength{\bibsep}{-0.7em}
-\setlength{\labelsep}{0.4em}
-\def\@biblabel#1{[#1]\hfill}
+ \thu@option@hook{cite-style}{\@nameuse{bibstyle@\thu@cite@style}}
% \end{macrocode}
%
-% 几种种引用样式:
+% 几种种引用样式,与 \file{bst} 文件名保持一致,
+% 这样在使用 \cs{bibliographystyle} 选择参考文献表的样式时也会设置对应的引用样式。
% \begin{macrocode}
-\expandafter\newcommand\csname bibstyle@thuthesis-numeric\endcsname{%
- \bibpunct{[}{]}{,}{s}{,}{\textsuperscript{,}}}
-\expandafter\newcommand\csname bibstyle@thuthesis-author-year\endcsname{%
- \bibpunct{(}{)}{;}{a}{,}{,}}
-\expandafter\newcommand\csname bibstyle@thuthesis-bachelor\endcsname{%
- \bibpunct{[}{]}{,}{s}{,}{\textsuperscript{,}}}
+ \@namedef{bibstyle@thuthesis-numeric}{\citestyle{super}}
+ \@namedef{bibstyle@thuthesis-author-year}{\citestyle{author-year}}
+ \@namedef{bibstyle@thuthesis-bachelor}{\citestyle{super}}
+ \@namedef{bibstyle@thuthesis-inline}{\citestyle{inline}}
% \end{macrocode}
%
-% 设置 \option{cite-style} 的接口:
+% 修改引用的样式。
+% 这里在 filehook 中无法使用 \cs{patchcmd},所以只能手动重定义。
+%
+% 将 \cs{citep} super 式引用的页码改为上标。
% \begin{macrocode}
-\@namedef{bibstyle@thuthesis-inline}{\bibpunct{[}{]}{,}{n}{,}{,}}
-\thu@define@key{
- cite-style = {
- name = cite@style,
- code = {
- \@nameuse{bibstyle@thuthesis-\thu@cite@style}
- },
- }
-}
+ \renewcommand\NAT@citesuper[3]{\ifNAT@swa
+ \if*#2*\else#2\NAT@spacechar\fi
+ % \unskip\kern\p@\textsuperscript{\NAT@@open#1\NAT@@close}%
+ % \if*#3*\else\NAT@spacechar#3\fi\else #1\fi\endgroup}
+ \unskip\kern\p@\textsuperscript{\NAT@@open#1\NAT@@close\if*#3*\else#3\fi}%
+ \else #1\fi\endgroup}
% \end{macrocode}
%
-% 下面修改 \pkg{natbib} 的引用格式,主要是将页码写在上标位置。
-% numeric 模式的 \cs{citet} 的页码:
+% 将 \cs{citep} numbers 式引用的页码改为上标并置于括号外。
% \begin{macrocode}
-\patchcmd\NAT@citexnum{%
- \@ifnum{\NAT@ctype=\z@}{%
- \if*#2*\else\NAT@cmt#2\fi
- }{}%
- \NAT@mbox{\NAT@@close}%
-}{%
- \NAT@mbox{\NAT@@close}%
- \@ifnum{\NAT@ctype=\z@}{%
- \if*#2*\else\textsuperscript{#2}\fi
- }{}%
-}{}{}
+ \renewcommand\NAT@citenum%
+ [3]{\ifNAT@swa\NAT@@open\if*#2*\else#2\NAT@spacechar\fi
+ % #1\if*#3*\else\NAT@cmt#3\fi\NAT@@close\else#1\fi\endgroup}
+ #1\NAT@@close\textsuperscript{\if*#3*\else#3\fi}\else#1\fi\endgroup}
% \end{macrocode}
%
-% Numeric 模式的 \cs{citep} 的页码:
+% 修改 \cs{citet} 引用的样式。
% \begin{macrocode}
-\renewcommand\NAT@citesuper[3]{\ifNAT@swa
- \if*#2*\else#2\NAT@spacechar\fi
-\unskip\kern\p@\textsuperscript{\NAT@@open#1\NAT@@close\if*#3*\else#3\fi}%
- \else #1\fi\endgroup}
+ \def\NAT@citexnum[#1][#2]#3{%
+ \NAT@reset@parser
+ \NAT@sort@cites{#3}%
+ \NAT@reset@citea
+ \@cite{\def\NAT@num{-1}\let\NAT@last@yr\relax\let\NAT@nm\@empty
+ \@for\@citeb:=\NAT@cite@list\do
+ {\@safe@activestrue
+ \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
+ \@safe@activesfalse
+ \@ifundefined{b@\@citeb\@extra@b@citeb}{%
+ {\reset@font\bfseries?}
+ \NAT@citeundefined\PackageWarning{natbib}%
+ {Citation `\@citeb' on page \thepage \space undefined}}%
+ {\let\NAT@last@num\NAT@num\let\NAT@last@nm\NAT@nm
+ \NAT@parse{\@citeb}%
+ \ifNAT@longnames\@ifundefined{bv@\@citeb\@extra@b@citeb}{%
+ \let\NAT@name=\NAT@all@names
+ \global\@namedef{bv@\@citeb\@extra@b@citeb}{}}{}%
+ \fi
+ \ifNAT@full\let\NAT@nm\NAT@all@names\else
+ \let\NAT@nm\NAT@name\fi
+ \ifNAT@swa
+ \@ifnum{\NAT@ctype>\@ne}{%
+ \@citea
+ \NAT@hyper@{\@ifnum{\NAT@ctype=\tw@}{\NAT@test{\NAT@ctype}}{\NAT@alias}}%
+ }{%
+ \@ifnum{\NAT@cmprs>\z@}{%
+ \NAT@ifcat@num\NAT@num
+ {\let\NAT@nm=\NAT@num}%
+ {\def\NAT@nm{-2}}%
+ \NAT@ifcat@num\NAT@last@num
+ {\@tempcnta=\NAT@last@num\relax}%
+ {\@tempcnta\m@ne}%
+ \@ifnum{\NAT@nm=\@tempcnta}{%
+ \@ifnum{\NAT@merge>\@ne}{}{\NAT@last@yr@mbox}%
+ }{%
+ \advance\@tempcnta by\@ne
+ \@ifnum{\NAT@nm=\@tempcnta}{%
% \end{macrocode}
%
-% Author-year 模式的 \cs{citet} 的页码:
+% 在顺序编码制下,\pkg{natbib} 只有在三个以上连续文献引用才会使用连接号,
+% 这里修改为允许两个引用使用连接号。
% \begin{macrocode}
-\patchcmd{\NAT@citex}{%
- \if*#2*\else\NAT@cmt#2\fi
- \if\relax\NAT@date\relax\else\NAT@@close\fi
-}{%
- \if\relax\NAT@date\relax\else\NAT@@close\fi
- \if*#2*\else\textsuperscript{#2}\fi
-}{}{}
+ % \ifx\NAT@last@yr\relax
+ % \def@NAT@last@yr{\@citea}%
+ % \else
+ % \def@NAT@last@yr{--\NAT@penalty}%
+ % \fi
+ \def@NAT@last@yr{-\NAT@penalty}%
+ }{%
+ \NAT@last@yr@mbox
+ }%
+ }%
+ }{%
+ \@tempswatrue
+ \@ifnum{\NAT@merge>\@ne}{\@ifnum{\NAT@last@num=\NAT@num\relax}{\@tempswafalse}{}}{}%
+ \if@tempswa\NAT@citea@mbox\fi
+ }%
+ }%
+ \NAT@def@citea
+ \else
+ \ifcase\NAT@ctype
+ \ifx\NAT@last@nm\NAT@nm \NAT@yrsep\NAT@penalty\NAT@space\else
+ \@citea \NAT@test{\@ne}\NAT@spacechar\NAT@mbox{\NAT@super@kern\NAT@@open}%
+ \fi
+ \if*#1*\else#1\NAT@spacechar\fi
+ \NAT@mbox{\NAT@hyper@{{\citenumfont{\NAT@num}}}}%
+ \NAT@def@citea@box
+ \or
+ \NAT@hyper@citea@space{\NAT@test{\NAT@ctype}}%
+ \or
+ \NAT@hyper@citea@space{\NAT@test{\NAT@ctype}}%
+ \or
+ \NAT@hyper@citea@space\NAT@alias
+ \fi
+ \fi
+ }%
+ }%
+ \@ifnum{\NAT@cmprs>\z@}{\NAT@last@yr}{}%
+ \ifNAT@swa\else
% \end{macrocode}
%
-% Author-year 模式的 \cs{citep} 的页码:
+% 将页码放在括号外边,并且置于上标。
% \begin{macrocode}
-\renewcommand\NAT@cite%
- [3]{\ifNAT@swa\NAT@@open\if*#2*\else#2\NAT@spacechar\fi
- #1\NAT@@close\if*#3*\else\textsuperscript{#3}\fi\else#1\fi\endgroup}
+ % \@ifnum{\NAT@ctype=\z@}{%
+ % \if*#2*\else\NAT@cmt#2\fi
+ % }{}%
+ \NAT@mbox{\NAT@@close}%
+ \@ifnum{\NAT@ctype=\z@}{%
+ \if*#2*\else\textsuperscript{#2}\fi
+ }{}%
+ \fi
+ }{#1}{#2}%
+ }%
% \end{macrocode}
%
-% 在顺序编码制下,\pkg{natbib} 只有在三个以上连续文献引用才会使用连接号,
-% 这里修改为允许两个引用使用连接号。
+% 修改 \cs{citep} author-year 式的页码:
+% \begin{macrocode}
+ \renewcommand\NAT@cite%
+ [3]{\ifNAT@swa\NAT@@open\if*#2*\else#2\NAT@spacechar\fi
+ % #1\if*#3*\else\NAT@cmt#3\fi\NAT@@close\else#1\fi\endgroup}
+ #1\NAT@@close\if*#3*\else\textsuperscript{#3}\fi\else#1\fi\endgroup}
+% \end{macrocode}
+%
+% 修改 \cs{citet} author-year 式的页码:
+% \begin{macrocode}
+ \def\NAT@citex%
+ [#1][#2]#3{%
+ \NAT@reset@parser
+ \NAT@sort@cites{#3}%
+ \NAT@reset@citea
+ \@cite{\let\NAT@nm\@empty\let\NAT@year\@empty
+ \@for\@citeb:=\NAT@cite@list\do
+ {\@safe@activestrue
+ \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
+ \@safe@activesfalse
+ \@ifundefined{b@\@citeb\@extra@b@citeb}{\@citea%
+ {\reset@font\bfseries ?}\NAT@citeundefined
+ \PackageWarning{natbib}%
+ {Citation `\@citeb' on page \thepage \space undefined}\def\NAT@date{}}%
+ {\let\NAT@last@nm=\NAT@nm\let\NAT@last@yr=\NAT@year
+ \NAT@parse{\@citeb}%
+ \ifNAT@longnames\@ifundefined{bv@\@citeb\@extra@b@citeb}{%
+ \let\NAT@name=\NAT@all@names
+ \global\@namedef{bv@\@citeb\@extra@b@citeb}{}}{}%
+ \fi
+ \ifNAT@full\let\NAT@nm\NAT@all@names\else
+ \let\NAT@nm\NAT@name\fi
+ \ifNAT@swa\ifcase\NAT@ctype
+ \if\relax\NAT@date\relax
+ \@citea\NAT@hyper@{\NAT@nmfmt{\NAT@nm}\NAT@date}%
+ \else
+ \ifx\NAT@last@nm\NAT@nm\NAT@yrsep
+ \ifx\NAT@last@yr\NAT@year
+ \def\NAT@temp{{?}}%
+ \ifx\NAT@temp\NAT@exlab\PackageWarningNoLine{natbib}%
+ {Multiple citation on page \thepage: same authors and
+ year\MessageBreak without distinguishing extra
+ letter,\MessageBreak appears as question mark}\fi
+ \NAT@hyper@{\NAT@exlab}%
+ \else\unskip\NAT@spacechar
+ \NAT@hyper@{\NAT@date}%
+ \fi
+ \else
+ \@citea\NAT@hyper@{%
+ \NAT@nmfmt{\NAT@nm}%
+ \hyper@natlinkbreak{%
+ \NAT@aysep\NAT@spacechar}{\@citeb\@extra@b@citeb
+ }%
+ \NAT@date
+ }%
+ \fi
+ \fi
+ \or\@citea\NAT@hyper@{\NAT@nmfmt{\NAT@nm}}%
+ \or\@citea\NAT@hyper@{\NAT@date}%
+ \or\@citea\NAT@hyper@{\NAT@alias}%
+ \fi \NAT@def@citea
+ \else
+ \ifcase\NAT@ctype
+ \if\relax\NAT@date\relax
+ \@citea\NAT@hyper@{\NAT@nmfmt{\NAT@nm}}%
+ \else
+ \ifx\NAT@last@nm\NAT@nm\NAT@yrsep
+ \ifx\NAT@last@yr\NAT@year
+ \def\NAT@temp{{?}}%
+ \ifx\NAT@temp\NAT@exlab\PackageWarningNoLine{natbib}%
+ {Multiple citation on page \thepage: same authors and
+ year\MessageBreak without distinguishing extra
+ letter,\MessageBreak appears as question mark}\fi
+ \NAT@hyper@{\NAT@exlab}%
+ \else
+ \unskip\NAT@spacechar
+ \NAT@hyper@{\NAT@date}%
+ \fi
+ \else
+ \@citea\NAT@hyper@{%
+ \NAT@nmfmt{\NAT@nm}%
+ \hyper@natlinkbreak{\NAT@spacechar\NAT@@open\if*#1*\else#1\NAT@spacechar\fi}%
+ {\@citeb\@extra@b@citeb}%
+ \NAT@date
+ }%
+ \fi
+ \fi
+ \or\@citea\NAT@hyper@{\NAT@nmfmt{\NAT@nm}}%
+ \or\@citea\NAT@hyper@{\NAT@date}%
+ \or\@citea\NAT@hyper@{\NAT@alias}%
+ \fi
+ \if\relax\NAT@date\relax
+ \NAT@def@citea
+ \else
+ \NAT@def@citea@close
+ \fi
+ \fi
+ }}\ifNAT@swa\else
+% \end{macrocode}
+%
+% 将页码放在括号外边,并且置于上标。
+% \begin{macrocode}
+ % \if*#2*\else\NAT@cmt#2\fi
+ \if\relax\NAT@date\relax\else\NAT@@close\fi
+ \if*#2*\else\textsuperscript{#2}\fi
+ \fi}{#1}{#2}}
+% \end{macrocode}
+%
+% 参考文献表的正文部分用五号字。
+% 行距采用固定值 16 磅,段前空 3 磅,段后空 0 磅。
+%
+% 本科生要求宋体五号/Times New Roman 10.5 pt,固定行距 17pt,段前后间距 3pt;
+% 英文专业要求悬挂缩进 0.5inch(1.27 厘米)。
+%
+% 复用 \pkg{natbib} 的 \texttt{thebibliography} 环境,调整距离。
+% \begin{macrocode}
+ \renewcommand\bibsection{\thu@chapter*{\bibname}}
+ \newcommand\thu@set@bibliography@format{%
+ \ifthu@degree@bachelor
+ \renewcommand\bibfont{\fontsize{10.5bp}{17bp}\selectfont}%
+ \setlength{\bibsep}{6bp \@plus 3bp \@minus 3bp}%
+ \ifthu@main@language@chinese
+ \setlength{\bibhang}{21bp}%
+ \else
+ \setlength{\bibhang}{0.5in}%
+ \fi
+ \else
+ \renewcommand\bibfont{\fontsize{10.5bp}{16bp}\selectfont}%
+ \setlength{\bibsep}{3bp \@plus 3bp \@minus 3bp}%
+ \setlength{\bibhang}{21bp}%
+ \fi
+ }
+ \thu@set@bibliography@format
+ \thu@option@hook{degree}{\thu@set@bibliography@format}
+ \thu@option@hook{main-language}{\thu@set@bibliography@format}
+% \end{macrocode}
+%
+% 研究生要求每一条文献的内容要尽量写在同一页内。
+% 遇有被迫分页的情况,可通过“留白”或微调本页行距的方式尽量将同一条文献内容放在一页。
+% 所以上述 \cs{bibsep} 的设置允许 1pt 的伸缩,
+% 同时增加同一条文献内分页的惩罚,
+% 这里参考 \href{https://github.com/plk/biblatex/blob/e5d6e69e61613cc33ab1fcc2083a8277eb9cfce5/tex/latex/biblatex/biblatex.def}{BibLaTeX 的设置}。
% \begin{macrocode}
-\patchcmd{\NAT@citexnum}{%
- \ifx\NAT@last@yr\relax
- \def@NAT@last@yr{\@citea}%
+ \patchcmd\thebibliography{%
+ \clubpenalty4000%
+ }{%
+ \interlinepenalty=5000\relax
+ \clubpenalty=10000\relax
+ }{}{\thu@patch@error{\thebibliography}}
+ \patchcmd\thebibliography{%
+ \widowpenalty4000%
+ }{%
+ \widowpenalty=10000\relax
+ }{}{\thu@patch@error{\thebibliography}}
+% \end{macrocode}
+%
+% 参考文献表的编号居左,宽度 1 cm。
+% \begin{macrocode}
+ \def\@biblabel#1{[#1]\hfill}
+ \renewcommand\NAT@bibsetnum[1]{%
+ % \settowidth\labelwidth{\@biblabel{#1}}%
+ % \setlength{\leftmargin}{\labelwidth}%
+ % \addtolength{\leftmargin}{\labelsep}%
+ \setlength{\leftmargin}{1cm}%
+ \setlength{\itemindent}{\z@}%
+ \setlength{\labelsep}{0.1cm}%
+ \setlength{\labelwidth}{0.9cm}%
+ \setlength{\itemsep}{\bibsep}
+ \setlength{\parsep}{\z@}%
+ \ifNAT@openbib
+ \addtolength{\leftmargin}{\bibindent}%
+ \setlength{\itemindent}{-\bibindent}%
+ \setlength{\listparindent}{\itemindent}%
+ \setlength{\parsep}{0pt}%
+ \fi
+ }
+}
+% \end{macrocode}
+%
+% \subsubsection{\pkg{biblatex} 宏包}
+%
+% \begin{macrocode}
+\AtEndOfPackageFile*{biblatex}{
+ \AtBeginDocument{
+ \ifthenelse{\equal{\blx@bbxfile}{apa}}{\def\bibname{REFERENCES}}{}
+ \ifthenelse{\equal{\blx@bbxfile}{apa6}}{\def\bibname{REFERENCES}}{}
+ \ifthenelse{\equal{\blx@bbxfile}{mla}}{\def\bibname{WORKS CITED}}{}
+ \ifthenelse{\equal{\blx@bbxfile}{mla-new}}{\def\bibname{WORKS CITED}}{}
+ }
+ \DeclareRobustCommand\inlinecite{\parencite}
+ \defbibheading{bibliography}[\bibname]{\thu@chapter*{\bibname}}
+ \newcommand\thu@set@bibliography@format{%
+ \ifthu@degree@bachelor
+ \renewcommand\bibfont{\fontsize{10.5bp}{17bp}\selectfont}%
+ \setlength{\bibitemsep}{6bp \@plus 3bp \@minus 3bp}%
+ \ifthu@main@language@chinese
+ \setlength{\bibhang}{21bp}%
+ \else
+ \setlength{\bibhang}{0.5in}%
+ \fi
+ \else
+ \renewcommand\bibfont{\fontsize{10.5bp}{16bp}\selectfont}%
+ \setlength{\bibitemsep}{3bp \@plus 3bp \@minus 3bp}%
+ \setlength{\biblabelsep}{0.1cm}%
+ \setlength{\bibhang}{21bp}%
+ \fi
+ }
+ \thu@set@bibliography@format
+ \thu@option@hook{degree}{\thu@set@bibliography@format}
+ \thu@option@hook{main-language}{\thu@set@bibliography@format}
+}
+% \end{macrocode}
+%
+% \subsubsection{\pkg{apacite} 宏包}
+%
+% \pkg{apacite} 在 \cs{begindocument} 处载入的 \file{english.apc}
+% 会覆盖掉 \cs{bibname} 的定义,所以需要重新 \cs{thu@set@chapter@names}。
+% \begin{macrocode}
+\AtEndOfPackageFile*{apacite}{
+ \AtBeginDocument{
+ \thu@set@chapter@names
+ }
+ \renewcommand\bibliographytypesize{\fontsize{10.5bp}{17bp}\selectfont}
+ \setlength{\bibitemsep}{6bp}
+ \ifthu@main@language@chinese
+ \setlength{\bibleftmargin}{21bp}
+ \setlength{\bibindent}{-\bibleftmargin}
\else
- \def@NAT@last@yr{--\NAT@penalty}%
+ \setlength{\bibleftmargin}{0.5in}
+ \setlength{\bibindent}{-\bibleftmargin}
\fi
-}{%
- \def@NAT@last@yr{-\NAT@penalty}%
-}{}{}
+ \def\st@rtbibchapter{%
+ \if@numberedbib%
+ \chapter{\bibname}% e.g., 6. References
+ \else%
+ \thu@chapter*{\bibname}% e.g., References
+ \fi%
+ }%
+}
% \end{macrocode}
%
% \subsection{附录}
% \label{sec:appendix}
%
+% \begin{macrocode}
+\g@addto@macro\appendix{%
+ \@mainmattertrue
+}
+% \end{macrocode}
+%
% 研究生和本科生的写作指南均未规定附录的节标题是否加入目录,
% 但是从示例来看,目录中只出现附录的 chapter 标题,
% 不出现附录中的 section 及 subsection 的标题。
% 部分院系(例如自动化系)的格式审查的老师甚至一致口头如此要求。
-% (\href{https://github.com/xueruini/thuthesis/pull/425}{\#425})
+% (\href{https://github.com/tuna/thuthesis/pull/425}{\#425})
% \begin{macrocode}
\thu@define@key{
toc-depth = {
name = toc@depth,
- code = {\addtocontents{toc}{\protect\setcounter{tocdepth}{\thu@toc@depth}}},
},
}
-\g@addto@macro\appendix{\addtocontents{toc}{\protect\setcounter{tocdepth}{0}}}
+% \end{macrocode}
+%
+% 这里不要使用 \cs{addcontentsline},
+% 避免写入 \pkg{titletoc} 的 (\file{.ptc}) 文件中,
+% 造成 \env{survey} 的子目录中 |tocdepth| 为 0。
+% \begin{macrocode}
+\thu@option@hook{toc-depth}{%
+ \protected@write\@auxout{}{%
+ \string\ttl@writefile{toc}{%
+ \protect\setcounter{tocdepth}{\thu@toc@depth}%
+ }%
+ }%
+ \addtocontents{lof}{\string\let\string\contentsline\string\ttl@gobblecontents}
+ \addtocontents{lot}{\string\let\string\contentsline\string\ttl@gobblecontents}
+ \addtocontents{loe}{\string\let\string\contentsline\string\ttl@gobblecontents}
+}
+\g@addto@macro\appendix{%
+ \thusetup{
+ toc-depth = 0,
+ }%
+}
% \end{macrocode}
%
% 本科生《写作指南》有独特的要求:附录 A 为外文资料的调研阅读报告或书面翻译,
@@ -3268,17 +4885,27 @@
% \begin{macrocode}
\newenvironment{survey}{%
\chapter{外文资料的调研阅读报告}%
- \thu@setenglish
+ \thusetup{language = english}%
\let\title\thu@appendix@title
\let\maketitle\thu@appendix@maketitle
+ \thu@set@partial@toc@format
+ \renewcommand\tableofcontents{%
+ \section*{Contents}%
+ \thu@pdfbookmark{1}{Contents}%
+ \printcontents[survey]{l}{1}[2]{}%
+ \vskip 20bp%
+ }%
\renewcommand\bibname{参考文献}%
\let\bibsection\thu@appendix@bibsection
- \renewcommand\@bibunitname{main-survey}%
+ \renewcommand\@bibunitname{\jobname-survey}%
\let\bibliographystyle\defaultbibliographystyle
\let\bibliography\thu@appendix@bibliography
\begin{bibunit}%
+ \startcontents[survey]%
}{%
+ \stopcontents[survey]%
\end{bibunit}%
+ \thu@reset@main@language % restore language
}
% \end{macrocode}
% \end{environment}
@@ -3288,15 +4915,43 @@
% \begin{macrocode}
\newenvironment{translation}{%
\chapter{外文资料的书面翻译}%
- \thu@setenglish
+ \thusetup{language = chinese}%
\let\title\thu@appendix@title
\let\maketitle\thu@appendix@maketitle
- \renewcommand\bibname{书面翻译对应的原文索引}%
- \let\bibsection\thu@appendix@bibsection
- \renewcommand\@bibunitname{main-translation}%
+ \thu@set@partial@toc@format
+ \renewcommand\tableofcontents{%
+ \section*{目录}%
+ \thu@pdfbookmark{1}{目录}%
+ \printcontents[translation]{l}{1}[2]{}%
+ \vskip 20bp%
+ }%
+ \def\bibsection{%
+ \begingroup
+ \ctexset{section/numbering=false}%
+ \section{\bibname}%
+ \endgroup
+ }%
+ \renewcommand\@bibunitname{\jobname-translation}%
\let\bibliographystyle\defaultbibliographystyle
\let\bibliography\thu@appendix@bibliography
\begin{bibunit}%
+ \startcontents[translation]%
+}{%
+ \stopcontents[translation]%
+ \end{bibunit}%
+ \thu@reset@main@language % restore language
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{translation}
+% 书面翻译对应的原文索引,区别于译文的参考文献。
+% \begin{macrocode}
+\newenvironment{translation-index}{%
+ \begin{bibunit}%
+ \renewcommand\@bibunitname{\jobname-index}%
+ \renewcommand\bibname{书面翻译对应的原文索引}%
+ \let\bibsection\thu@appendix@bibsection
}{%
\end{bibunit}%
}
@@ -3315,11 +4970,29 @@
}
% \end{macrocode}
%
+% \begin{macrocode}
+\newcommand\thu@set@partial@toc@format{%
+ \titlecontents{section}
+ [\z@]{}
+ {\contentspush{\thecontentslabel\quad}}{}
+ {\thu@leaders\thecontentspage}%
+ \titlecontents{subsection}
+ [1em]{}
+ {\contentspush{\thecontentslabel\quad}}{}
+ {\thu@leaders\thecontentspage}%
+ \titlecontents{subsubsection}
+ [2em]{}
+ {\contentspush{\thecontentslabel\quad}}{}
+ {\thu@leaders\thecontentspage}%
+}
+% \end{macrocode}
+%
% 调研阅读报告的参考文献(或书面翻译对应的外文资料的原文索引)标题用宋体小四号字,段前 20pt,段后 6pt,行距 20pt。
% \begin{macrocode}
\newcommand\thu@appendix@bibsection{%
\par
\vskip 20bp%
+ \thu@pdfbookmark{1}{\bibname}%
\begingroup
\centering
\xiaosi[1.667]\bibname\par
@@ -3335,69 +5008,117 @@
% \begin{environment}{resume}
% 个人简历发表文章等。
% \begin{macrocode}
-\newenvironment{resume}[1][\thu@resume@title]{%
- \thu@chapter*{#1}}{}
+\newenvironment{resume}{%
+ \@mainmatterfalse
+ \thu@chapter*{\thu@resume@name}%
+ \ctexset{
+ section = {
+ format += \centering,
+ numbering = false,
+ },
+ subsection = {
+ format = \sffamily\fontsize{14bp}{20bp}\selectfont,
+ numbering = false,
+ aftertitle = \ifthu@language@chinese :\else :\fi,
+ },
+ }%
+ \ifthu@degree@bachelor
+ \ifthu@language@english
+ \sffamily\fontsize{15bp}{20bp}\selectfont,
+ \fi
+ \fi
+}{}
% \end{macrocode}
% \end{environment}
%
-% \begin{macro}{\resumeitem}
-% 个人简历部分。每条信息一个段落,故不需要特别处理。
+% 旧的 \cs{resumeitem} 和 \cs{researchitem} 已经过时。
% \begin{macrocode}
-\newcommand{\resumeitem}[1]{%
- \vspace{24bp}{\sihao\heiti\centerline{#1}}\par\vspace{6bp}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\researchitem}
-% 研究成果用 \cs{researchitem}\marg{类别} 开启,包括“学术论文”和“研究成果”两个
-% 列表。
-% \begin{macrocode}
-\newcommand{\researchitem}[1]{%
- \vspace{32bp}{\sihao\heiti\centerline{#1}}\par\vspace{14bp}}
+\newcommand\resumeitem[1]{%
+ \thu@error{The "\protect\resumeitem" is obsolete. Please update to the new format}%
+}
+\newcommand\researchitem[1]{%
+ \thu@error{The "\protect\researchitem" is obsolete. Please update to the new format}%
+}
% \end{macrocode}
-% \end{macro}
%
-% \begin{environment}{publications}
% \begin{environment}{achievements}
-% 二者分别通过两个环境 \env{publications} 和 \env{achievements} 罗
-% 列。
-%
+% 学术成果由 \env{achievements} 环境罗列。
% \begin{macrocode}
-\newlist{publications}{enumerate}{1}
-\setlist[publications]{label=[\arabic*],align=left,nosep,itemsep=8bp,
- leftmargin=10mm,labelsep=!,before=\xiaosi[1.26],resume}
\newlist{achievements}{enumerate}{1}
-\setlist[achievements]{label=[\arabic*],align=left,nosep,itemsep=8bp,
- leftmargin=10mm,labelsep=!,before=\xiaosi[1.26]}
+\setlist[achievements]{
+ label = [\arabic*],
+ align = left,
+ leftmargin = 10mm,
+ topsep = 6bp,
+ parsep = 0bp,
+ partopsep = 0bp,
+ itemsep = 6bp,
+ labelsep = !,
+ before = {
+ \ifthu@degree@graduate
+ \fontsize{12bp}{16bp}\selectfont
+ \fi
+ },
+ resume = achievements,
+}
% \end{macrocode}
% \end{environment}
-% \end{environment}
%
-% \begin{macro}{\publicationskip}
-% \env{publications} 环境可以连续出现多次,第二类论文列表前后要空一行,使
-% 用 \cs{publicationskip}。
% \begin{macrocode}
-\def\publicationskip{\bigskip\bigskip}
+\newenvironment{publications}{%
+ \thu@deprecate{"publications" environment}{"achievements"}%
+ \begin{achievements}%
+}{%
+ \end{achievements}%
+}
+\newcommand\publicationskip{%
+ \thu@error{The "\protect\publicationskip" is obsolete. Do not use it}%
+}
% \end{macrocode}
+%
+% \subsection{综合论文训练记录表}
+%
+% \begin{macro}{\record}
+% (本科生专用)插入综合论文训练记录表的 PDF 版本,并加入书签。
+%
+% \begin{macrocode}
+\newcommand{\record}[1]{%
+ \let\thu@record@file\@empty
+ \kv@define@key{thu@record}{file}{\let\thu@record@file\kv@value}%
+ \kv@set@family@handler{thu@record}{%
+ \ifx\kv@value\relax
+ \let\thu@record@file\kv@key
+ \else
+ \kv@handled@false
+ \fi
+ }%
+ \kvsetkeys{thu@record}{#1}%
+ \ifx\thu@record@file\@empty
+ \thu@error{File path of \protect\record\space is required}
+ \fi
+ \cleardoublepage
+ \thu@pdfbookmark{0}{综合论文训练记录表}%
+ \includepdf[pages=-]{\thu@record@file}%
+}
+% \end{macrocode}
+%
% \end{macro}
%
% \subsection{其他宏包的设置}
%
% 这些宏包并非格式要求,但是为了方便同学们使用,在这里进行简单设置。
-% \begin{macrocode}
-\newcommand\thu@atendpackage{\csname ctex_at_end_package:nn\endcsname}
-% \end{macrocode}
%
% \subsubsection{\pkg{hyperref} 宏包}
%
% \begin{macrocode}
-\thu@atendpackage{hyperref}{
+\AtEndOfPackageFile*{hyperref}{
\hypersetup{
linktoc = all,
bookmarksdepth = 2,
bookmarksnumbered = true,
bookmarksopen = true,
bookmarksopenlevel = 1,
+ bookmarksdepth = 3,
unicode = true,
psdextra = true,
breaklinks = true,
@@ -3415,7 +5136,8 @@
\phantomsection
}
\pdfstringdefDisableCommands{
- \let\\\@empty
+ \let\\\relax
+ \let\quad\relax
\let\hspace\@gobble
}%
% \end{macrocode}
@@ -3430,14 +5152,22 @@
\@ifpackagelater{hyperref}{2019/04/27}{}{%
\g@addto@macro\psdmapshortnames{\let\mu\textmu}
}%
+ \ifthu@main@language@chinese
+ \hypersetup{
+ pdflang = zh-CN,
+ }%
+ \else
+ \hypersetup{
+ pdflang = en-US,
+ }%
+ \fi
\AtBeginDocument{%
- \ifthu@language@chinese
+ \ifthu@main@language@chinese
\hypersetup{
pdftitle = \thu@title,
pdfauthor = \thu@author,
pdfsubject = \thu@degree@name,
pdfkeywords = \thu@keywords,
- pdflang = zh-CN,
}%
\else
\hypersetup{
@@ -3445,7 +5175,6 @@
pdfauthor = \thu@author@en,
pdfsubject = \thu@degree@name@en,
pdfkeywords = \thu@keywords@en,
- pdflang = en-US,
}%
\fi
\hypersetup{
@@ -3457,7 +5186,7 @@
% \subsubsection{\pkg{nomencl} 宏包}
%
% \begin{macrocode}
-\thu@atendpackage{nomencl}{
+\AtEndOfPackageFile*{nomencl}{
\let\nomname\thu@denotation@name
\def\thenomenclature{\begin{denotation}[\nom@tempdim]}
\def\endthenomenclature{\end{denotation}}
@@ -3468,16 +5197,18 @@
%
% 我们采用 \pkg{longtable} 来处理跨页的表格。同样我们需要设置其默认字体为五号。
% \begin{macrocode}
-\AtBeginDocument{%
- \let\thu@LT@array\LT@array
- \def\LT@array{\dawu[1.5]\thu@LT@array} % set default font size
+\AtEndOfPackageFile*{longtable}{
+ \pretocmd\LT@array{%
+ \fontsize{11bp}{14.3bp}\selectfont
+ \renewcommand\arraystretch{1.4}%
+ }{}{\thu@patch@error{\LT@array}}
}
% \end{macrocode}
%
% \subsubsection{\pkg{siunitx} 宏包}
%
% \begin{macrocode}
-\thu@atendpackage{siunitx}{%
+\AtEndOfPackageFile*{siunitx}{%
\sisetup{
group-minimum-digits = 4,
separate-uncertainty = true,
@@ -3501,7 +5232,47 @@
\fi
}
\thu@set@siunitx@language
- \thu@addto{language}{\thu@set@siunitx@language}
+ \thu@option@hook{language}{\thu@set@siunitx@language}
+}
+% \end{macrocode}
+%
+% \subsubsection{\pkg{amsthm} 宏包}
+%
+% 定理标题使用黑体,正文使用宋体,冒号隔开。
+% \begin{macrocode}
+\AtEndOfPackageFile*{amsthm}{%
+ \newtheoremstyle{thu}
+ {\z@}{\z@}
+ {\normalfont}{\z@}
+ {\normalfont\sffamily}{\thu@theorem@separator}
+ {0.5em}{}
+ \theoremstyle{thu}
+ \newtheorem{assumption}{\thu@assumption@name}[chapter]%
+ \newtheorem{definition}{\thu@definition@name}[chapter]%
+ \newtheorem{proposition}{\thu@proposition@name}[chapter]%
+ \newtheorem{lemma}{\thu@lemma@name}[chapter]%
+ \newtheorem{theorem}{\thu@theorem@name}[chapter]%
+ \newtheorem{axiom}{\thu@axiom@name}[chapter]%
+ \newtheorem{corollary}{\thu@corollary@name}[chapter]%
+ \newtheorem{exercise}{\thu@exercise@name}[chapter]%
+ \newtheorem{example}{\thu@example@name}[chapter]%
+ \newtheorem{remark}{\thu@remark@name}[chapter]%
+ \newtheorem{problem}{\thu@problem@name}[chapter]%
+ \newtheorem{conjecture}{\thu@conjecture@name}[chapter]%
+ \renewenvironment{proof}[1][\thu@proof@name]{\par
+ \pushQED{\qed}%
+ % \normalfont \topsep6\p@\@plus6\p@\relax
+ \normalfont \topsep\z@\relax
+ \trivlist
+ \item[\hskip\labelsep
+ % \itshape
+ % #1\@addpunct{.}]\ignorespaces
+ \sffamily
+ #1\@addpunct{\thu@theorem@separator}]\ignorespaces
+ }{%
+ \popQED\endtrivlist\@endpefalse
+ }
+ \renewcommand\qedsymbol{\ensuremath{\QED}}
}
% \end{macrocode}
%
@@ -3509,10 +5280,10 @@
%
% 定理标题使用黑体,正文使用宋体,冒号隔开。
% \begin{macrocode}
-\thu@atendpackage{ntheorem}{%
+\AtEndOfPackageFile*{ntheorem}{%
\theorembodyfont{\normalfont}%
\theoremheaderfont{\normalfont\sffamily}%
- \theoremsymbol{\ensuremath{\square}}%
+ \theoremsymbol{\ensuremath{\QED}}%
\newtheorem*{proof}{\thu@proof@name}%
\theoremstyle{plain}%
\theoremsymbol{}%
@@ -3532,16 +5303,179 @@
}
% \end{macrocode}
%
+% \subsubsection{\pkg{algorithm} 宏包}
+%
+% 使 \env{algorithm} 和 \env{listing} 环境的名称随语言设置而改变,
+% 并使其在附录中的编号规则与图、表等一致。
+%
+% \begin{macro}{\listofalgorithm}
+% \begin{macro}{\listofalgorithm*}
+% \begin{macrocode}
+\PassOptionsToPackage{chapter}{algorithm}
+\AtEndOfPackageFile*{algorithm}{
+ \floatname{algorithm}{\thu@algorithm@name}
+ \g@addto@macro\appendix{\renewcommand*{\thealgorithm}{\thechapter-\arabic{algorithm}}}
+ \renewcommand\listofalgorithms{%
+ \thu@listof{algorithm}%
+ }
+ \renewcommand\listalgorithmname{\thu@list@algorithm@name}
+ \def\ext@algorithm{loa}
+ \contentsuse{algorithm}{loa}
+ \titlecontents{algorithm}
+ [\z@]{}
+ {\contentspush{\fname@algorithm~\thecontentslabel\quad}}{}
+ {\thu@leaders\thecontentspage}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{\pkg{algorithm2e} 宏包}
+%
+% \begin{macrocode}
+\PassOptionsToPackage{algochapter}{algorithm2e}
+\AtEndOfPackageFile*{algorithm2e}{
+ \renewcommand\algorithmcfname{\thu@algorithm@name}
+ \SetAlgoCaptionLayout{thu@caption@font}
+ \SetAlCapSty{relax}
+ \SetAlgoCaptionSeparator{\hspace*{1em}}
+ \SetAlFnt{\fontsize{11bp}{14.3bp}\selectfont}
+ \renewcommand\listofalgorithms{%
+ \thu@listof{algorithmcf}%
+ }
+ \renewcommand\listalgorithmcfname{\thu@list@algorithm@name}
+ \def\ext@algorithmcf{loa}
+ \contentsuse{algocf}{loa}
+ \titlecontents{algocf}
+ [\z@]{}
+ {\contentspush{\algorithmcfname~\thecontentslabel\quad}}{}
+ {\thu@leaders\thecontentspage}
+}
+% \end{macrocode}
+%
+% \subsubsection{\pkg{minted} 宏包}
+%
+% \begin{macrocode}
+\AtEndOfPackageFile*{minted}{
+ \g@addto@macro\appendix{\renewcommand*{\thelisting}{\thechapter-\arabic{listing}}}%
+ \newcommand\thu@set@listing@language{%
+ \ifthu@language@chinese
+ \floatname{listing}{代码}%
+ \else
+ \floatname{listing}{Listing}%
+ \fi
+ }
+ \thu@set@listing@language
+ \thu@option@hook{language}{\thu@set@listing@language}
+}
+% \end{macrocode}
+%
% \subsection{书脊}
% \label{sec:spine}
% \begin{macro}{\spine}
-% 单独使用书脊命令会在新的一页产生竖排书脊。
+% 单独使用书脊命令会在新的一页产生竖排书脊,
+% 参考 \url{https://tex.stackexchange.com/a/38585}。
+%
+% 本科生:
+% 书脊的书写要求:用仿宋\_GB2312 字书写,字体大小根据论文的薄厚而定。
+% 书脊上方写论文题目,下方写本科生姓名,距上下页边均为 3cm。
+%
+% 研究生:
+% 示例中上下页边距为 5.5 cm,左右边距为 1 cm。
% \begin{macrocode}
-\NewDocumentCommand{\spine}{O{\thu@title} O{\thu@author}}{%
- \newpage\thispagestyle{empty}%
- \fangsong\addCJKfontfeatures*{RawFeature={vertical:}}
- \xiaosan\ziju{0.4}%
- \noindent\hfill\rotatebox[origin=lt]{-90}{\makebox[\textheight]{#1\hfill#2}}}
+\thu@define@key{
+ spine-font = {
+ name = spine@font,
+ default = {\sanhao},
+ },
+ spine-title = {
+ name = spine@title,
+ },
+ spine-author = {
+ name = spine@author,
+ },
+}
+\newcommand*\CJKmovesymbol[1]{\raise.3em\hbox{#1}}
+\newcommand*\CJKmove{%
+ \punctstyle{plain}%
+ \let\CJKsymbol\CJKmovesymbol
+ \let\CJKpunctsymbol\CJKsymbol
+}
+\NewDocumentCommand{\spine}{
+ O{
+ \ifx\thu@spine@title\@empty
+ \thu@title
+ \else
+ \thu@spine@title
+ \fi
+ }
+ O{
+ \ifx\thu@spine@author\@empty
+ \thu@author
+ \else
+ \thu@spine@author
+ \fi
+ }}{%
+ \clearpage
+ \ifthu@degree@bachelor
+ \newgeometry{
+ vmargin = 3cm,
+ hmargin = 1cm,
+ }%
+ \else
+ \newgeometry{
+ vmargin = 5.5cm,
+ hmargin = 1cm,
+ }%
+ \fi
+ \thispagestyle{empty}%
+ \ifthu@main@language@chinese
+ \thu@pdfbookmark{0}{书脊}%
+ \else
+ \thu@pdfbookmark{0}{Spine}%
+ \fi
+ \begingroup
+ \noindent\hfill
+ \rotatebox[origin=lt]{-90}{%
+ \makebox[\textheight]{%
+ \fangsong
+ \addCJKfontfeatures*{RawFeature={vertical}}%
+ \thu@spine@font
+ \CJKmove
+ #1\hfill
+ \thu@stretch{4.5em}{#2}%
+ }%
+ }%
+ \endgroup
+ \clearpage
+ \restoregeometry
+}
+% \end{macrocode}
+%
+% Fandol 仿宋无法同时用于横排和竖排
+%(\href{https://github.com/tuna/thuthesis/issues/551}{\#551}),
+% 所以只能独立编译 \file{spine.pdf},然后插入封面后。
+% \begin{macrocode}
+\newcommand\thu@input@spine{%
+ \IfFileExists{spine.pdf}{}{%
+ \immediate\write18{xelatex spine.tex}%
+ \IfFileExists{spine.pdf}{}{%
+ \thu@error{Cannot find file "spine.pdf". Compile "spine.tex" first, or enable shell escape}%
+ }%
+ }%
+ \includepdf[pages=1]{spine.pdf}%
+}
+\newcommand\thu@spine{%
+ \ifthu@cjk@font@fandol
+ \thu@input@spine
+ \else
+ \ifthu@cjk@font@noto
+ \thu@input@spine
+ \else
+ \spine
+ \fi
+ \fi
+}
% \end{macrocode}
% \end{macro}
%
@@ -3549,9 +5483,17 @@
% \subsection{其它}
% \label{sec:other}
%
-% 在模板文档结束时即装入配置文件,这样用户就能在导言区进行相应的修改。
+% 借用 \cls{ltxdoc} 和 \cls{l3doc} 里面的几个命令方便写文档。
% \begin{macrocode}
-\AtEndOfClass{\sloppy}
+\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}}
+\DeclareRobustCommand\file{\nolinkurl}
+\DeclareRobustCommand\env{\textsf}
+\DeclareRobustCommand\pkg{\textsf}
+\DeclareRobustCommand\cls{\textsf}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\sloppy
%</cls>
% \end{macrocode}
%
@@ -3578,6 +5520,22 @@
\RequirePackage{enumitem}
\RequirePackage{etoolbox}
\RequirePackage{metalogo}
+\RequirePackage[tightLists=false]{markdown}
+
+\markdownSetup{
+ renderers = {
+ link = {\href{#2}{#1}},
+ }
+}
+
+\hypersetup{
+ pdflang = zh-CN,
+ pdftitle = {ThuThesis:清华大学学位论文模板},
+ pdfauthor = {清华大学 TUNA 协会},
+ pdfsubject = {清华大学学位论文模板使用说明},
+ pdfkeywords = {论文模板; 清华大学; 使用说明},
+ pdfdisplaydoctitle = true
+}%
\ifthenelse{\equal{\@nameuse{g__ctex_fontset_tl}}{mac}}{
\setmainfont{Palatino}
@@ -3606,6 +5564,7 @@
ItalicFont = *-italic,
BoldItalicFont = *-bolditalic,
Scale = MatchLowercase,
+ Ligatures = CommonOff,
]{texgyrecursor}
}
\unimathsetup{
@@ -3710,14 +5669,18 @@
\DeclareDocumentCommand{\option}{m}{\textsf{#1}}
\DeclareDocumentCommand{\env}{m}{\texttt{#1}}
\DeclareDocumentCommand{\pkg}{s m}{%
- \texttt{#2}\IfBooleanF#1{\thu@special@index{package}{#2}}}
+ \textsf{#2}\IfBooleanF#1{\thu@special@index{package}{#2}}}
+\DeclareDocumentCommand{\cls}{s m}{%
+ \textsf{#2}\IfBooleanF#1{\thu@special@index{package}{#2}}}
\DeclareDocumentCommand{\file}{s m}{%
- \texttt{#2}\IfBooleanF#1{\thu@special@index{file}{#2}}}
+ \nolinkurl{#2}\IfBooleanF#1{\thu@special@index{file}{#2}}}
\newcommand{\myentry}[1]{%
\marginpar{\raggedleft\color{purple}\bfseries\strut #1}}
\newcommand{\note}[2][Note]{{%
\color{magenta}{\bfseries #1}\emph{#2}}}
+\DeclareDocumentCommand{\githubuser}{m}{\href{https://github.com/#1}{@#1}}
+
\def\thuthesis{\textsc{Thu}\-\textsc{Thesis}}
%</dtx-style>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/thuthesis/thuthesis.ins b/Master/texmf-dist/source/latex/thuthesis/thuthesis.ins
index bd8c34edef9..0dec4fcbdc3 100644
--- a/Master/texmf-dist/source/latex/thuthesis/thuthesis.ins
+++ b/Master/texmf-dist/source/latex/thuthesis/thuthesis.ins
@@ -17,8 +17,6 @@
\input docstrip
\askforoverwritefalse
-%\askonceonly
-\showprogress
\keepsilent
\usedir{tex/latex/thuthesis}
@@ -43,27 +41,6 @@ through LaTeX.
\endpreamble
\generate{\file{\jobname.cls}{\from{\jobname.dtx}{cls}}
- \usepreamble\defaultpreamble\usepostamble\defaultpostamble
\file{dtx-style.sty}{\from{\jobname.dtx}{dtx-style}}}
-\ifToplevel{%
- \Msg{***********************************************************}
- \Msg{*}
- \Msg{* To finish the installation you have to move the following}
- \Msg{* files into a directory searched by TeX:}
- \Msg{*}
- \Msg{* The recommended directory is TEXMF/tex/latex/thuthesis}
- \Msg{*}
- \Msg{* \space\space thuthesis.cls}
- \Msg{* \space\space thuthesis-author-year.bst}
- \Msg{* \space\space thuthesis-numeric.bst}
- \Msg{* \space\space thuthesis-bachelor.bst}
- \Msg{* \space\space tsinghua.pdf}
- \Msg{*}
- \Msg{* To produce the documentation run the files ending with}
- \Msg{* `.dtx' through LaTeX.}
- \Msg{*}
- \Msg{* Happy TeXing!}
- \Msg{***********************************************************}}
-
\endbatchfile
diff --git a/Master/texmf-dist/source/latex/tile-graphic/tile-graphic.dtx b/Master/texmf-dist/source/latex/tile-graphic/tile-graphic.dtx
new file mode 100644
index 00000000000..fa9654fa849
--- /dev/null
+++ b/Master/texmf-dist/source/latex/tile-graphic/tile-graphic.dtx
@@ -0,0 +1,1010 @@
+%\iffalse
+%<*copyright>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% tile-graphic.sty package, %%
+%% Copyright (C) 2020 %%
+%% dpstory@uakron.edu %%
+%% dpstory@acrotex.net %%
+%% %%
+%% This program can redistributed and/or modified under %%
+%% the terms of the LaTeX Project Public License %%
+%% Distributed from CTAN archives in directory %%
+%% macros/latex/base/lppl.txt; either version 1.2 of the %%
+%% License, or (at your option) any later version. %%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%</copyright>
+%<package>\NeedsTeXFormat{LaTeX2e}[1997/12/01]
+%<package>\ProvidesPackage{tile-graphic}
+%<package> [2020/05/27 v1.0.1 Tile a graphic (dps)]
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[colorlinks,hyperindex=false]{hyperref}
+\usepackage{array,calc}
+\usepackage{fancyvrb}
+\usepackage{graphicx}
+%\def\texorpdfstring#1#2{#1}
+%\pdfstringdefDisableCommands{\let\\\textbackslash}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\InputIfFileExists{aebdocfmt.def}{\PackageInfo{tile-graphic}{Inputting aebdocfmt.def}}
+ {\def\IndexOpt{\DescribeMacro}\def\IndexKey{\DescribeMacro}\let\setupFullwidth\relax
+ \PackageInfo{tile-graphic}{aebdocfmt.def cannot be found}}
+%\pdfstringdefDisableCommands{\let\\\textbackslash}
+%\EnableCrossrefs \CodelineIndex
+\RecordChanges
+\let\pkg\textsf
+\let\opt\texttt
+\let\key\texttt
+\let\app\textsf
+\bgroup\ttfamily
+\gdef\brpr#1{\char123\relax#1\char125\relax}\egroup
+\let\darg\brpr
+\def\ameta#1{\ensuremath{\langle\textsl{\texttt{#1}}\rangle}}
+\def\meta#1{\textsl{\texttt{#1}}}
+\def\SUB#1{\ensuremath{{}_{\mbox{\scriptsize\ttfamily#1}}}}
+\def\cs#1{\texttt{\bslash#1}}
+\def\EXCL{!}
+\let\tops\texorpdfstring
+\DeclareRobustCommand{\tmspace}[3]{%
+ \ifmmode\mskip#1#2\else\kern#1#3\fi\relax}
+\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}}
+\makeatletter
+\renewcommand{\paragraph}
+ {\@startsection{paragraph}{4}{0pt}{6pt}{-3pt}
+ {\normalfont\normalsize\bfseries}}
+\renewcommand{\subparagraph}
+ {\@startsection{subparagraph}{5}{\parindent}{6pt}{-3pt}{\bfseries}}
+\renewenvironment{quote}[1][]
+ {\def\@rgi{#1}\ifx\@rgi\@empty
+ \let\rghtm\@empty\else\def\rghtm{\rightmargin\leftmargin}\fi
+ \list{}{\rghtm} %{\rightmargin\leftmargin}%
+ \item\relax}
+ {\endlist}
+\makeatother
+\def\ctg#1{\texttt{create-tg.#1}}
+\def\packagesuffix{package}
+\def\V{\string|}
+\def\picBox#1#2#3{{\fboxsep0pt\fbox{\parbox[t][#2]{#1}{\vfill\centering#3\vfill}}}}
+\def\picBoxi#1#2#3{{\fboxrule0pt\fboxsep0pt\fbox{\parbox[t][#2]{#1}{\vfill\centering#3\vfill}}}}
+\begin{document}
+\def\CMD#1{\textbackslash#1}
+ \GetFileInfo{tile-graphic.sty}
+ \title{\textsf{tile-graphic}: Break a graphic into tiles}
+ \author{D. P. Story\\
+ Email: \texttt{dpstory@acrotex.net}}
+ \date{processed \today}
+\value{secnumdepth}=3
+\value{tocdepth}=3
+ \maketitle
+ \tableofcontents
+ \let\Email\texttt
+ \DocInput{tile-graphic.dtx}
+\IfFileExists{\jobname.ind}{\newpage\setupFullwidth\par\PrintIndex}{\paragraph*{Index} The index goes here.\\Execute
+ \texttt{makeindex -s gind.ist -o tile-graphic.ind tile-graphic.idx} on the command line and recompile
+ \texttt{tile-graphic.dtx}.}
+\IfFileExists{\jobname.gls}{\PrintChanges}{\paragraph*{Change History} The list of changes goes here.\\Execute
+ \texttt{makeindex -s gglo.ist -o tile-graphic.gls tile-graphic.glo} on the command line and recompile
+ \texttt{tile-graphic.dtx}.}
+\end{document}
+%</driver>
+% \fi
+% \MakeShortVerb{|}
+% \StopEventually{}
+%
+% \DoNotIndex{\def,\edef,\gdef,\xdef,\global,\long,\let}
+% \DoNotIndex{\expandafter,\string,\the,\ifx,\else,\fi}
+% \DoNotIndex{\csname,\endcsname,\relax,\begingroup,\endgroup}
+% \DoNotIndex{\DeclareTextCommand,\DeclareTextCompositeCommand}
+% \DoNotIndex{\space,\@empty,\special}
+% \DoNotIndex{\x,\y,\z}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \section{Documentation}\label{s:docs}
+%
+% \def\pici{\marginpar{\raggedleft\bgroup\offinterlineskip\parindent0pt
+% \vtop{%
+% \picBox{20pt}{25pt}{\texttt{01}}\picBox{20pt}{25pt}{\texttt{02}}\picBox{20pt}{25pt}{\texttt{03}}\\%
+% \picBox{20pt}{25pt}{\texttt{04}}\picBox{20pt}{25pt}{\texttt{05}}\picBox{20pt}{25pt}{\texttt{06}}\\%
+% \picBox{20pt}{25pt}{\texttt{07}}\picBox{20pt}{25pt}{\texttt{08}}\picBox{20pt}{25pt}{\texttt{09}}\\%
+% \picBox{20pt}{25pt}{\texttt{10}}\picBox{20pt}{25pt}{\texttt{11}}\picBox{20pt}{25pt}{\texttt{12}}\\[6pt]%
+% {\parbox{60pt}{\small\centering Tiled graphic\\($4\times3$)}}%
+% }%
+% \egroup}}
+% \def\picii{\marginpar{\raggedleft\bgroup\offinterlineskip\parindent0pt
+% \vtop{%
+% \picBox{20pt}{25pt}{\texttt{01}}\\\picBox{20pt}{25pt}{\texttt{02}}\\\picBox{20pt}{25pt}{\texttt{03}}\\%
+% \picBox{20pt}{25pt}{\texttt{04}}\\\picBox{20pt}{25pt}{\texttt{05}}\\\picBox{20pt}{25pt}{\texttt{06}}\\%
+% \picBoxi{20pt}{25pt}{$\vdots\,\vdots\,\vdots$}\\%
+% \picBox{20pt}{25pt}{\texttt{10}}\\\picBox{20pt}{25pt}{\texttt{11}}\\\picBox{20pt}{25pt}{\texttt{12}}\\[6pt]%
+% {\parbox{20pt}{\small\centering\strut\kern0pt\hbox to0pt{\hss{Pages}\hss}\\\strut\hbox to0pt{\hss($4\times3$)\hss}}}%
+% }%
+% \egroup}}
+%
+% \subsection{A brief description} The\pici\space document author opens the \ctg{tex} file and specifies three
+% arguments of the \cs{setTileParams} command: a number $n$ that corresponds to the number of rows; a number
+% $m$ that represents the number of columns; and the path to a graphic. Compiling \ctg{tex}, when the option \opt{wrttofiles} is specified, results
+% in the specified graphic being broken down into a series of $n\times m$ \textit{tiled} graphics. The order of the creation
+% of the tiles is top to bottom, left to right: The first row is the top most row, and the graphic is tiled across
+% the row, from left to right, the next row, is the one just below the top row, and the graphic is tiled across that
+% row, from left to right, and so on. Refer to the crude diagram to the left.\medskip
+%
+%\begin{center}
+%\fbox{\begin{minipage}{.67\linewidth}
+%\textbf{\textcolor{red}{Warning:}} This package uses the \pkg{shellesc} package, which requires
+%the \texttt{--shell-escape} switch. Use this package only if you trust the author of this package.
+%\end{minipage}}
+%\end{center}
+% \subsection{Applications}
+% The \pkg{tile-graphic} package can be used to produce tiled graphics, which can be
+% consumed by the \pkg{dps} and \pkg{acrosort} packages.
+%
+% \subsection{The \texttt{create-tg.tex} file}
+% Because of the extensive use of \cs{ShellEscape}, \ctg{tex} is similar to a
+% BAT (batch) file. When you compile \ctg{tex}, one result is \ctg{pdf}; \ctg{pdf} is
+% a one page summary titled \textbf{Tile Graphic Report}. In addition to producing a report,
+% there is the actual result the report refers to: the production of tiled graphic files (PDFs).
+%
+% Tiled graphics are obtained by compiling \ctg{tex},
+% after setting three parameters; using this package, therefore, is very simple.
+% Below is the verbatim listing of the \ctg{tex}, found in the \texttt{examples} folder.
+%\begin{Verbatim}[xleftmargin=\leftmargini,codes={\catcode`\%=9},commandchars={!@^}]
+% \documentclass{article}
+% !makebox[0pt][r]@!rmfamily(1)!enspace^\usepackage[!ameta@options^]{tile-graphic}
+% !makebox[0pt][r]@!rmfamily(2)!enspace^\setTileParams[!ameta@ig-opts^]{!ameta@nRows^}{!ameta@nCols^}{!ameta@path^}
+% \begin{document}
+% !makebox[0pt][r]@!rmfamily(3)!enspace^\tileTheGraphic
+% \end\darg{document}
+%\end{Verbatim}
+% When \texttt{create-tg.tex} is compiled, the DVI (in the case of \LaTeX) or the PDF (in all other cases) produces
+% a single page document the title of which is ``\textbf{Tile Graphic Report}.'' The file also produces, depending
+% on the options used, various \emph{separate} PDFs consisting of tiled graphics.
+%
+% \paragraph*{Discussion.} We discuss each of the numbered lines slightly out of order.
+%\begin{enumerate}
+% \item[(2)] \cs{setTileParams[\ameta{ig-opts}]\darg{\ameta{nRows}}\darg{\ameta{nCols}}\darg{\ameta{path}}}\DescribeMacro\setTileParams\\
+% The command and its arguments are placed in the preamble.
+% \begin{description}
+% \item[\normalfont\ameta{ig-opts}] This optional argument is passed to the underlying optional argument of the \cs{includegraphics} command.
+% Normally, there is no optional options passed.
+%
+% \item[\normalfont\ameta{nRows}] This argument declares the number of rows you want to break the graphic into.
+%
+% \item[\normalfont\ameta{nCols}] This argument declares the number of columns you want to break the graphic into.
+%
+% \item[\normalfont\ameta{path}] The path to the graphic. The graphic is any
+% file format supported by the PDF creator. For a
+% \texttt{latex->dvips->\ameta{\upshape ps2pdf\string|distiller}} workflow, the graphic
+% should be an EPS file; in all other workflows, the graphic can be a PDF
+% (or some other supported graphical format). For example, if the graphic
+% is in the \texttt{graphics} folder of the source file, then \ameta{path}
+% might read \texttt{graphics/mygraphic}, where \texttt{mygraphic.pdf} (for example) is
+% in the \texttt{graphics} folder.
+% \end{description}
+% With no package options, compiling \ctg{tex} produces a document a single page document
+% with a message, seen in \hyperref[fig:noopts]{Figure~\ref*{fig:noopts}}.
+%
+% \begin{figure}[htb]\centering
+% \includegraphics[width=.67\linewidth]{docs/graphics/noopts}
+% \caption{No options}\label{fig:noopts}
+% \end{figure}
+% \item[(1)] \cs{usepackage[\ameta{options}]\darg{tile-graphic}}\picii\\
+% For the package declaration, the \ameta{options} are described below.
+% \begin{description}
+% \item[\opt{wrttofiles}] When \ctg{tex} is compiled with the \opt{wrttofiles} option \emph{only}
+% and with a \ameta{path} argument of \texttt{graphics/mygraphic},
+% $\ameta{nRows}\times\ameta{nCols}$ individual tile PDF files named
+% \begin{quote}
+% \texttt{mygraphic\_01.pdf}, \texttt{mygraphic\_02.pdf}, \dots
+% \end{quote} are created and placed in the \texttt{graphics} folder.
+% If no subfolder is specified, files are placed in the source file's folder. The source file that is compiled
+% (\texttt{create-tg.pdf}) contains the \textbf{Tile Graphic Report}.
+%
+% \item[\opt{!wrttofiles}] (Convenience option) This option reverts to the default, no separate tile PDFs are produced.
+%
+% \item[\opt{packagefiles}]
+% When this option is specified, $\ameta{nRows}\times\ameta{nCols}$ pages are produced and ``packaged'' in a separate
+% PDF document named \texttt{\ameta{basename}\_\packagesuffix.pdf}, where \ameta{basename} is the base name of the graphic.
+% See the crude illustration to the left.
+%
+% \item[\opt{!packagefiles}] (Convenience option) Reverses the \opt{packagefiles} option,
+% as a result, no package file is created.
+%
+% \item[\opt{pdfcreator=\ameta{{\upshape pdflatex\string|lualatex\string|xelatex\string|ps2pdf\string|distiller}}}]\leavevmode\\
+% When the option \opt{wrttofiles} or \opt{packagefiles}
+% is specified, compiling \ctg{tex} produces one or more PDF files. These PDFs are produced
+% by \app{pdflatex}, \app{lualatex}, \app{xelatex}, \app{ps2pdf}, or \app{distiller} by executing a
+% series of \cs{ShellEscape} commands. The PDF creator
+% application used is determined by the value of the \opt{pdfcreator} key. The default is \texttt{pdflatex}.
+%
+% Using the \cs{ShellEscape} command is system dependent. The \pkg{tile-graphic} package is set up for
+% the \app{Windows} OS; it uses \textsf{del}, \textsf{copy}, and \textsf{move}. Refer to
+% \hyperref[s:custcmds]{Section~\ref*{s:custcmds}} for more information for modifying these
+% system commands.
+%
+% \pkg{tile-graphic} also uses \cs{ShellEscape} to compile certain dynamically created TEX files. There are hooks
+% to modify the compile commands that can be used at your discretion. Again, refer to
+% \hyperref[s:custcmds]{Section~\ref*{s:custcmds}} for more information.
+% \end{description}
+% \item[(3)] \cs{tileTheGraphic}\DescribeMacro\tileTheGraphic\relax\space is placed in the body of the document. It is this command that does all the work,
+% based on the parameters of \cs{setTileParam}.
+%\end{enumerate}
+%
+%\paragraph*{Required packages.} The following package are required: \pkg{shellesc}, \pkg{web},
+%\pkg{graphicx}, and \pkg{multido}.
+%
+%\paragraph*{Try it, you'll like it.} The first thing to do, once the package is installed, is to try the
+% compiling the file \ctg{tex}. There are three graphics files, one at the top level of the \texttt{examples}
+% folder, one in the \texttt{choo} subfilder, and one in the \texttt{postscript} subfolder. Try both graphics (only one graphic at a time, however). Try all possible combinations
+% of the basic options \opt{wrttofiles}, \opt{!wrttofiles}, \opt{packagefiles}, and \opt{!packagefiles}; you can even try
+% the various values of \opt{pdfcreator}.
+%
+%\subsection{Description of the workflow}
+% Be aware that there are two instances, or stages, of compiling:
+% \begin{quote}
+% \begin{enumerate}
+% \item[Stage 1.]\label{Item:one} Compiling \ctg{tex}, usually, this is initiated in some {\LaTeX} editor. At this stage,
+% you can compile with \app{latex.exe}, \app{pdflatex.exe}, \app{lualatex.exe}, or \app{xelatex.exe}.
+% When \DescribeMacro\setTileParams\cs{setTileParams} is expanded, it reads the graphic file,
+% \ameta{path}, using \cs{includegraphics} to determine its size. Therefore, the graphic must
+% be one that is supported by the pdf creator at this point. For example if the graphic is a PDF, yet
+% you use \app{latex.exe} to compile \ctg{tex}, you get an error because \app{latex.exe} does not support
+% PDF inclusion.
+% \item[Stage 2.]\label{Item:two} Compiling of one or more files to produce tiled graphics, this step is initiated
+% by the \cs{ShellEscape} command. The application used to compile at this stage is determined
+% by the \key{pdfcreator} key. When the \opt{packagefiles} option is taken, the \DescribeMacro\setTileParams
+% \cs{setTileParams} is expanded again and the graphic file, \ameta{path}, is included to determine
+% dimension of the graphic. Again, the graphic must be a format supported by the PDF creator as selected
+% by the \key{pdfcreator} key, which may be different from the compiler of the first case above.
+% \end{enumerate}
+% \end{quote}
+% Additional thoughts on the workflow.
+% \begin{itemize}
+% \item \key{pdfcreator=\ameta{\upshape pdflatex\string|lualatex\string|xelatex}}\\[3pt]
+% This is the easiest and simplest case. Usually the PDF creators for the two stages of compiling are the same
+% (refer to Stages~\hyperref[Item:one]{1} and~\hyperref[Item:two]{2}, above). These are direct-to-PDF applications, the workflow
+% is relatively quick, smooth, and automated. All AUX files are are deleted except for the AUX files of the
+% main file \ctg{tex}.
+%
+% \item \key{pdfcreator=\ameta{\upshape ps2pdf\string|distiller}}\\[3pt]
+% The graphic file format must be EPS for \hyperref[Item:two]{Stage~2}; however, if you are not
+% using \app{latex.exe} in \hyperref[Item:one]{Stage~1}, the graphic must be one that is supported
+% by the PDF creator used. Thus you may have two copies of the graphic of different formats. You're
+% not going to do that, are you? Usually the PDF creators for the two stages of compiling are the same, that way
+% you need not have two formats for the graphic.
+% \begin{itemize}
+% \item \key{pdfcreator=\ameta{\upshape ps2pdf}}\\[3pt]
+% The workflow is \texttt{latex\,->\,dvips\,->\,ps2pdf}
+% \item \key{pdfcreator=\ameta{\upshape distiller}}\\[3pt]
+% The workflow is \texttt{latex\,->\,dvips\,->\,distiller}.
+% There is a difference between using \app{distiller} and \app{ps2pdf}, in the latter case, the PS
+% file can be a relative path; in the former case, it must be a full (or absolute) path, this is a
+% slight complication. For this bad boy, we provide the \DescribeMacro\fullPathToSource
+% \cs{fullPathToSource}, refer to \hyperref[s:custcmds]{Section~\ref*{s:custcmds}} for more details.
+% \end{itemize}
+% \end{itemize}
+% \subsection{The Configuration File}
+% A configuration file, named \marginpar{\raggedleft\small\texttt{tg.cfg}}\texttt{tg.cfg},
+% is input at the end of the package. You might make any customizations there, where you
+% customize for the pdf creator you always use, or, if you use several, you can make
+% customizations for each by using the \cs{ifcase} structure below.
+%\begin{Verbatim}[xleftmargin=\leftmargini,codes={\catcode`\%=9},commandchars=!()]
+%\ifcase\tg@case\relax
+% \def\tg@pdfcreator@app{pdflatex}
+% !quad!ameta(customizations-for-pdflatex)
+%\or
+% \def\tg@pdfcreator@app{lualatex}
+% !quad!ameta(customizations-for-lualatex)
+%\or
+% \def\tg@pdfcreator@app{xelatex}
+% !quad!ameta(customizations-for-xelatex)
+%\or
+% \def\tg@pdfcreator@app{ps2pdf}
+% !quad!ameta(customizations-for-ps2pdf)
+%\or
+% \def\tg@pdfcreator@app{acrodist}
+% !quad!ameta(customizations-for-acrodist)
+%\fi
+%\end{Verbatim}
+%See the file \marginpar{\raggedleft\small\texttt{tg.cfg.txt}}\texttt{tg.cfg.txt} for this structure.
+%Rename it to \texttt{tg.cfg} if found to be useful.
+% $$
+% \rule[2pt]{.25\linewidth}{.4pt}\, \textbf{End of Documentation}\,\rule[2pt]{.25\linewidth}{.4pt}
+% $$
+% \section{The package code}
+%
+% Having finished the barest of documentation, we begin the markup of this package.
+% \changes{v1.0}{2020/05/27}{Set version number to v1.0 to publish package}
+% \subsection{Options}
+% We bring in the \pkg{xkeyval} package so we can gather our options using
+% it's commands, rather than the default \pkg{keyval} commands.
+
+% \begin{macrocode}
+\RequirePackage{xkeyval}
+% \end{macrocode}
+% \leavevmode\IndexOpt{wrttofiles}\IndexOpt[\protect\EXCL]{!wrttofiles} When \opt{wrttofiles} is specfied,
+% $\ameta{nRows}\times\ameta{nCols}$ PDF files are created. When \opt{!wrttofiles} is used, these files
+% just mentions are not created.
+% \begin{macrocode}
+\newif\if@wrttofiles\@wrttofilesfalse
+\DeclareOptionX{wrttofiles}{\@wrttofilestrue}
+\DeclareOptionX{!wrttofiles}{\@wrttofilesfalse}
+% \end{macrocode}
+% \leavevmode\IndexOpt{packagefiles} When specified, a single ``package'' PDF is created containing
+% $\ameta{nRos}\times\ameta{nCols}$ pages of tiled graphics
+% Likewise, the option \IndexOpt[\protect\EXCL]{!packagefiles}\opt{!packagefiles} reverses \opt{packagefiles} to return
+% to the default state, files are not packaged.
+% \begin{macrocode}
+\newif\if@packagefiles \@packagefilestrue
+\DeclareOptionX{packagefiles}{\@packagefilestrue}
+\DeclareOptionX{!packagefiles}{\@packagefilesfalse}
+% \end{macrocode}
+% \leavevmode\IndexOpt{pdfcreator}\hskip-\marginparsep\texttt{=\ameta{{\upshape pdflatex\string|lualatex\string|xelatex\string|ps2pdf\string|distiller}}}
+% \begin{macrocode}
+\define@choicekey*+{tile-graphic.sty}{pdfcreator}[\val\nr]%
+ {pdflatex,lualatex,xelatex,ps2pdf,distiller}{%
+ \edef\tg@case{\nr}%
+ \ifcase\nr\relax
+ \def\tg@pdfcreator@app{pdflatex}\or
+ \def\tg@pdfcreator@app{lualatex}\or
+ \def\tg@pdfcreator@app{xelatex}\or
+ \def\tg@pdfcreator@app{ps2pdf}\or
+ \def\tg@pdfcreator@app{acrodist}\fi
+}{\PackageWarning{tile-graphics}%
+ {Bad choice for pdfcreator, permissible values\MessageBreak
+ are pdflatex, lualatex, xelatex, ps2pdf, and\MessageBreak
+ distiller.\MessageBreak Using the default pdflatex}}
+\def\tg@pdfcreator@app{pdflatex}\def\tg@case{0}
+% \end{macrocode}
+% Process the options
+% \begin{macrocode}
+\ProcessOptionsX\relax
+\edef\tg@restoreCats{%
+ \catcode`\noexpand\"=\the\catcode`\"\relax
+ \catcode`\noexpand\,=\the\catcode`\,\relax
+ \catcode`\noexpand\_=\the\catcode`\_\relax
+}
+\@makeother\"\@makeother\,\@makeother\_
+% \end{macrocode}
+% \subsection{Required Packages}
+% The \pkg{web} package is use to set the page dimensions, it also brings in \pkg{hyperref}.
+% We use \pkg{graphicx} package to have access to \cs{includegraphics}. The \cs{multido} package
+% is used to work across the face of the graphic by row, top to bottom, to clip off little bounding boxes of the graphic.
+% \pkg{shellesc} is required for the \opt{wrttofiles} option.
+% \begin{macrocode}
+\RequirePackage{shellesc}
+\RequirePackage{web}
+\RequirePackage{graphicx}
+\RequirePackage{multido}
+% \end{macrocode}
+% \subsection{Registers and other preliminaries}
+% We declare a new if, \DescribeMacro\if@wrtorpkg\cs{if@wrtorpkg}, which is true if either \cs{if@wrttofiles}
+% or \cs{if@packagefiles} is true. This is a convenience to the coding.
+% \begin{macrocode}
+\newif\if@wrtorpkg \@wrtorpkgfalse
+\if@wrttofiles
+ \@wrtorpkgtrue
+\else
+ \if@packagefiles
+ \@wrtorpkgtrue
+ \fi
+\fi
+\newif\iftg@direct \tg@directtrue
+\newif\iftgfolder \tgfolderfalse
+% \end{macrocode}
+% \leavevmode\DescribeMacro\iftg@direct
+% \cs{iftg@direct} is false if \key{pdfcreator=\ameta{ps2pdf\string|distiller}}.
+% \begin{macrocode}
+\ifnum\tg@case>\tw@\relax\tg@directfalse\fi
+% \end{macrocode}
+% A few comments on the \cs{ifpassthruTG} switch. This package performs some tricks.
+% Initially, \cs{ifpassthruTG} is true, and certain portions of the code are executed. When \texttt{create-tg.tex}
+% is compiled with \cs{passthruTGtrue}, it writes to the current folder the file \texttt{package-data.cut} containing the single command \cs{passthruTGfalse}.
+% During this compile, \texttt{create-tg.tex} makes a copy of itself named \texttt{\ameta{basename}\_\packagesuffix.tex}.
+% It is this tile that is compiled by \cs{ShellEscape}, and when compiled, reads \texttt{package-data.cut}, since it now exists,
+% and \cs{ifpassthruTG} is set to false, at which point a different set of code lines are executed.
+% \begin{macrocode}
+\newif\ifpassthruTG \passthruTGtrue
+% \end{macrocode}
+% Some miscellaneous lengths, boxes, and utility commands.
+% \begin{macrocode}
+\newdimen\tg@dima
+\newdimen\tg@dimb
+\newbox\tg@box
+\newcount\tg@Cnt
+\def\tg@rmslash#1/{\def\tgInFolder{#1}}%
+\let\tgInFolder\@empty
+% \end{macrocode}
+%\goodbreak
+% \subsection{Some customization commands}\label{s:custcmds}
+% \paragraph*{System commands.} These are \DescribeMacro\sysdel\cs{sysdel},
+% \DescribeMacro\syscopy\cs{syscopy}, and \DescribeMacro\sysmove\cs{sysmove}. The
+% default is to use \app{Windows} OS commands. Changes for UNIX/Linux or MacOS are easy enough
+% by declaring these three commands in the preamble (or in \texttt{tg.cfg}), their arguments are the names of
+% the corresponding system commands for deleting, copying, and moving files.
+% \begin{macrocode}
+\def\sysdel#1{\def\tg@sysdel{#1\space}}
+\sysdel{del}
+\def\syscopy#1{\def\tg@syscopy{#1\space}}
+\syscopy{copy}
+\def\sysmove#1{\def\tg@sysmove{#1\space}}
+\sysmove{move}
+% \end{macrocode}
+% \paragraph*{Changing the switches in Stage 2.} Here is a link to the \hyperref[Item:two]{Stage~2} reference.
+% There are two TEX files compiled: (1) the package file, and (2)
+% the individual tiles graphic files. We provide a hook to modify the command line
+% switches of the \texttt{pdfcreator}. \DescribeMacro\pkgappArgs\cs{pkgappArgs} is the hook
+% into the creation of the package file. Use \texttt{\#1} to represent the \texttt{pdfcreator}
+% application. For example, \verb~\pkappArgs{#1 -halt-on-error}~ produces a command line
+% of \begin{quote}\app{pdflatex -halt-on-error --shell-escape \ameta{targeted-package-file.tex}}\end{quote}
+% For a \texttt{pdfcreator} of \app{pdflatex}.
+% The \texttt{--shell-escape} is automatically included.
+% \begin{macrocode}
+\def\pkgappArgs#1{\def\pkg@ppArgs##1{#1}}
+\pkgappArgs{#1}
+% \end{macrocode}
+% We also separately compile each of the separate tile graphics. \DescribeMacro\tileappArgs
+% \cs{tileappArgs} is similar to \cs{pkgappArgs}. If we declare \verb~\tileappArgs{#1 -halt-on-error}~, then the command line
+% becomes,
+% \begin{quote}\app{pdflatex -halt-on-error \ameta{targeted-tile-graphic.tex}}\end{quote}
+% Here, \texttt{--shell-escape} is not automatically included as it is not needed for this step.
+% \begin{macrocode}
+\def\tileappArgs#1{\def\tile@ppArgs##1{#1}}
+\tileappArgs{#1}
+% \end{macrocode}
+%
+% \subparagraph*{Some unverified tricks.} What if your system does not recognize \app{pdflatex},
+% \app{lualatex}, and so on; perhaps they are know by different names. You can use these hooks
+% to fix that. For example,
+% \begin{quote}\ttfamily
+% \string\pkgappArgs\darg{\ameta{alt-pdflatex}.exe \ameta{other-switches}}
+% \end{quote}
+% Or, perhaps the path to this application is not on the system paths, hence \app{pdflatex}
+% is not recognized, in this case, try
+% \begin{quote}\ttfamily
+% \string\pkgappArgs\darg{\ameta{path-to}/\ameta{alt-pdflatex}.exe \ameta{other-switches}}
+% \end{quote}
+% that ``should'' work.\par\medskip\noindent
+% When \key{pdfcreator=\ameta{ps2pdf\string|distiller}}, we provide two hooks for this workflow:
+% \DescribeMacro\latexappArgs\cs{latexappArgs} and \DescribeMacro\dvipsappArgs\cs{dvipsappArgs}. These function
+% similar to the ones described above; for example, \verb~\dvipsappArgs{#1 -q*}~ passes the \texttt{-q*} switch
+% (quiet mode) to \app{dvips}. No separate commands for a package compile versus a tile compile, as seen above,
+% are defined, though that could change.
+% \begin{macrocode}
+\def\latexappArgs#1{\def\latex@ppArgs##1{#1}}
+\latexappArgs{#1}
+\def\dvipsappArgs#1{\def\dvips@ppArgs##1{#1}}
+\dvipsappArgs{#1}
+% \end{macrocode}
+% \leavevmode\DescribeMacro\definePath\hskip-\marginparsep\texttt{\darg{\ameta{\cs{cmd}}}\darg{\ameta{path}}}
+% A command taken from \pkg{eforms} that normalizes the argument before
+% defining \cs{cmd}.
+% \begin{macrocode}
+\providecommand{\definePath}[1]{\def\ef@ctrlName{#1}%
+ \hyper@normalise\ef@definePath}
+\def\ef@definePath#1{\expandafter\xdef\ef@ctrlName{#1}}
+% \end{macrocode}
+% \subparagraph*{Support for \key{pdfcreator=distiller}.}\leavevmode\medskip\par\noindent
+% \leavevmode\DescribeMacro\fullPathToSource\hskip-\marginparsep\texttt{\darg{\ameta{path}}}
+% Set the full path to the source file (\texttt{create-tg.tex}). This command is only needed
+% when \opt{pdfcreator=distiller}.
+% \begin{macrocode}
+\def\fullPathToSource{\definePath{\tg@fullPathToSource}}
+\let\tg@fullPathToSource\@empty
+% \end{macrocode}
+% \paragraph*{After creation hooks.} We provide additional hooks, the first is placed
+% just after a tile file is created, and second one is placed just after the package file is created.
+%
+% \medskip\noindent
+%\DescribeMacro\afterTileCreationHook\hskip-\marginparsep\texttt
+%{\darg{\ameta{\cs{cmds}}}} The \ameta{\cs{cmds}} can be any valid {\LaTeX} commands,
+%conceptually, the commands may contain \cs{ShellEscape} commands. The hook is placed
+%just after a tile file is created as a PDF.\par\medskip\noindent
+%\DescribeMacro\afterPkgCreationHook\hskip-\marginparsep\texttt
+%{\darg{\ameta{\cs{cmds}}}} Similar to \cs{afterTileCreationHook}, but for the creation
+%of the tile package.
+% \begin{macrocode}
+\def\afterTileCreationHook#1{\def\@fterTileCreationHook{#1}}
+\let\@fterTileCreationHook\relax
+% \end{macrocode}
+% The definition of \cs{afterPkgCreationHook}.
+% \begin{macrocode}
+\def\afterPkgCreationHook#1{\def\@fterPkgCreationHook{#1}}
+\let\@fterPkgCreationHook\relax
+% \end{macrocode}
+%\subparagraph*{Examples.} This example makes each \emph{tile} PDF file into a tile EPS file.
+%We use the utility executable \app{pdftops}, which may be available on your {\TeX} system.
+%In the preamble or above the \cs{tileTheGraphic} command, place the following commands.
+%\begin{Verbatim}[xleftmargin=\parindent,codes={\catcode`\%=9},commandchars={*()}]
+%\afterTileCreationHook{*%
+% \ShellEscape{pdftops -eps tile-template.pdf
+% tile-template.eps}*%
+% \ShellEscape{copy tile-template.eps \tgTileBaseIndx.eps}*%
+% \iftgfolder
+% \ShellEscape{move \tgTileBaseIndx.eps \tgInFolder}*%
+% \fi
+%}
+%\afterPkgCreationHook{*%
+% \typeout{!! Package creation: \tgBaseName_package.pdf !!}}
+%\end{Verbatim}
+%\subparagraph*{Commentary.} At insertion point of the hooks in the code stream, the
+%tile file is named \texttt{tile-template}.
+%The declared \cs{afterTileCreationHook} converts each tile file,
+%to an EPS file of the same name. Then, it copies \texttt{tile-temp.eps} to
+%\DescribeMacro\tgTileBaseIndx\cs{tgTileBaseIndx.eps}. Next, we test whether
+%this file came from a subfolder (using the switch \DescribeMacro\iftgfolder
+%\cs{iftgfolder}). Finally, if the file belongs in the folder, \DescribeMacro\tgInFolder\cs{tgInFolder},
+%we move it there. For the \cs{afterPkgCreationHook}, we do nothing other than to write some
+%text to the terminal, we use the base name of the graphic \DescribeMacro\tgBaseName
+%\cs{tgBaseName}.
+%\medskip\par\noindent
+% \DescribeMacro\packagesuffix\hskip-\marginparsep\texttt{\darg{\ameta{name}}}
+% The name used as suffix to the packaged tiled files. Originally, this was \texttt{packaged},
+% but I am changing it to \texttt{package}, to be in conformance with the \pkg{acrosort} package.
+% \changes{v1.0.1}{2020/05/27}{Replace suffix of packaged with just package, but control the
+% naming with \string\cs{packagesuffix}.}
+% \begin{macrocode}
+\newcommand{\packagesuffix}{package}
+% \end{macrocode}
+% \subsection{\tops{\protect\cs{setTileParams}}{\textbackslash{setTileParams}}: A preamble command}
+% \leavevmode\DescribeMacro\setTileParams\hskip-\marginparsep
+% \texttt{[\ameta{ig-opts}]\darg{\ameta{nRows}}\darg{\ameta{nCols}}\darg{\ameta{path}}} The parameters
+% are described in Section~\ref{s:docs} (\textbf{Documentation}).
+% \begin{macrocode}
+\newcommand{\setTileParams}[4][]{%
+% \end{macrocode}
+% We require the entries in \texttt{\#2} and \texttt{\#3} (\ameta{nRows} and \ameta{nCols})
+% to be nonnegative natural numbers (1, 2, 3, \dots), so we pass through a dimension register
+% and into a count register, this should make what is entered a natural number.
+% If not greater or equal to 1, we complain, and set to the number 2.
+% \begin{macrocode}
+ \tg@dima #3\p@\relax
+ \ifdim\tg@dima < \p@
+ \PackageWarning{tile-graphic}
+ {Number of columns must be positive,\MessageBreak
+ setting number of columns to 2}\tg@dima\tw@\p@\fi
+ \edef\nCols{\strip@pt\tg@dima}%
+ \tg@Cnt\nCols\relax
+ \edef\n@Cols{\the\tg@Cnt}\edef\nCols{\the\tg@Cnt}%
+ \tg@dima #2\p@\relax
+ \ifdim\tg@dima < \p@
+ \PackageWarning{tile-graphic}
+ {Number of rows must be positive,\MessageBreak
+ setting number of rows to 2}\tg@dima\tw@\p@\fi
+ \edef\nRows{\strip@pt\tg@dima}%
+ \tg@Cnt\nRows\relax
+ \edef\n@Rows{\the\tg@Cnt}\edef\nRows{\the\tg@Cnt}%
+ \multiply\tg@Cnt \nCols\relax
+ \edef\nFilesCreated{\the\tg@Cnt}%
+ \def\pathToPic{#4}%
+% \end{macrocode}
+% Parse the path to obtain the parts of the path, area, base, and extension.
+% \begin{macrocode}
+ \filename@parse{#4}%
+ \edef\tg@dir{\filename@area}%
+ \ifx\tg@dir\@empty\tgfolderfalse\else
+ \expandafter\tg@rmslash\tg@dir
+ \tgfoldertrue
+ \fi
+ \edef\tg@base{\filename@base}%
+ \edef\tgBaseName{\filename@base}%
+ \edef\tg@ext{\filename@ext}%
+% \end{macrocode}
+% Get graphic dimensions, dimensions needed for {\TeX} (pt) and PDF (bp)
+% \begin{macrocode}
+ \setbox\tg@box\hbox{\includegraphics[draft,#1]{#4}}%
+ \setlength\tg@dima{\the\wd\tg@box}%
+ \tg@dima=.99626\tg@dima
+ \divide\tg@dima \nCols
+ \edef\bpWdtile{\strip@pt\tg@dima}%
+ \setlength\tg@dima{\the\ht\tg@box}%
+ \tg@dima=.99626\tg@dima
+ \divide\tg@dima \nRows
+ \edef\bpHttile{\strip@pt\tg@dima}%
+ \setbox\tg@box\box\voidb@x
+ \tg@dima=\bpHttile pt \relax
+ \edef\tg@HT{\the\tg@dima}
+ \tg@dima=\bpWdtile pt \relax
+ \edef\tg@WD{\the\tg@dima}
+% \end{macrocode}
+% Set margins and screen size using the \pkg{web} package. If \cs{ifpassthruTG} is true,
+% we use reasonably size dimensions to display the \textbf{Tile Graphic Report}; otherwise,
+% we use dimensions based on the size of the graphic determined by \ameta{path}.
+% \begin{macrocode}
+ \ifpassthruTG
+ \web@MargScrDimOpts{.25in}{.25in}{24pt}{.25in}{5in}{6in}
+ \else
+ \web@MargScrDimOpts{0pt}{0pt}{0pt}{0pt}{\tg@HT}{\tg@WD}
+ \fi
+% \end{macrocode}
+% \paragraph*{Bounding box calculations for the tiles}\leavevmode\par\medskip\noindent
+%^^A%
+% The $y$-coordinate calculations: If \cs{nRows} is $3$, for example, we calculate $4$ $y$-coodinates,
+% \cs{y1}, \cs{y2}, \cs{y3}, \cs{y4}, from bottom to top.
+% \begin{macrocode}
+ \@tempcnta\n@Rows\relax
+ \advance\@tempcnta\@ne
+ \edef\n@Rows{\the\@tempcnta}
+ \@tempcnta\z@
+ \tg@dima0pt
+ \tg@dimb=\tg@HT\relax
+ \@whilenum \@tempcnta < \n@Rows \do {%
+ \advance\@tempcnta\@ne
+ \csarg\edef{y\the\@tempcnta}{\strip@pt\tg@dima}
+ \advance\tg@dima \tg@dimb
+ }
+% \end{macrocode}
+% The $x$-coordinate calculations If \cs{nCols} is $2$, for example, we calculate $3$ $x$-coodinates,
+% \cs{x1}, \cs{x2}, \cs{x3}, from left to right.
+% \begin{macrocode}
+ \@tempcnta\n@Cols\relax
+ \advance\@tempcnta\@ne
+ \edef\n@Cols{\the\@tempcnta}
+ \@tempcnta\z@
+ \tg@dima0pt
+ \tg@dimb=\tg@WD\relax
+ \@whilenum \@tempcnta < \n@Cols \do {%
+ \advance\@tempcnta\@ne
+ \csarg\edef{x\the\@tempcnta}{\strip@pt\tg@dima}
+ \advance\tg@dima \tg@dimb
+ }
+% \end{macrocode}
+% Having finished the calculations, we then execute \cs{tg@wrtthefiledoc}.
+% \begin{macrocode}
+ \if@wrtorpkg\expandafter
+ \tg@wrtthefiledoc\fi
+}
+% \end{macrocode}
+% \DescribeMacro\tg@wrtthefiledoc
+% This command writes the \texttt{tile-template.tex} file to the source
+% file folder. It will read,
+%\begin{Verbatim}[xleftmargin=\leftmargini,codes={\catcode`\%=9}]
+%\RequirePackage{tmp}
+%\documentclass{article}
+%\usepackage{web}
+%\usepackage{graphicx}
+%\let\WriteBookmarks\relax
+%\margins{0pt}{0pt}{0pt}{0pt}
+%\screensize{\tg@HT}{\tg@WD}
+%\parindent0pt\parskip0pt
+%\begin{document}
+%\tgInputContent
+%\end{document}
+%\end{Verbatim}
+%This is the file that is compiled using \cs{ShellEscape} to create the individual
+%tile files. This document contains a trick, the use of the \pkg{tmp} package, which
+%is written dynamically just before this file is compiled. The \pkg{tmp} package is
+%created by \cs{tg@wrttmppkg}, defined next. The \pkg{tmp} package defines the
+%command \DescribeMacro\tgInputContent\cs{tgInputContent} in the body of the document.
+% \begin{macrocode}
+\def\tg@wrtthefiledoc{\newwrite\wrttiledoc
+ \long\def\IWTD##1{\immediate\write\wrttiledoc{##1}}
+ \immediate\openout \wrttiledoc tile-template.tex
+ \IWTD{%
+ \string\RequirePackage{tmp}^^J%
+ \string\documentclass{article}^^J%
+ \string\usepackage{web}^^J%
+ \string\usepackage{graphicx}^^J%
+ \string\let\string\WriteBookmarks\string\relax^^J%
+ \string\margins{0pt}{0pt}{0pt}{0pt}^^J%
+ \string\screensize{\tg@HT}{\tg@WD}^^J%
+ \string\parindent0pt\string\parskip0pt^^J%
+ \string\begin{document}^^J%
+ \string\tgInputContent^^J%
+ \string\end{document}}%
+ \immediate\closeout \wrttiledoc
+}
+% \end{macrocode}
+% \leavevmode\DescribeMacro\tg@wrttmppkg\hskip-\marginparsep\texttt{\darg{\ameta{basename}}\darg{\ameta{indx}}}
+% Write the \pkg{tmp} package dynamically: \ameta{basename} is the base name of the graphic; \ameta{indx} is the
+% index of the tile (\texttt{01}, \texttt{02}, \texttt{03}, \dots). The action of this package
+% is to define \cs{tgInputContent} to input the file
+% \begin{quote}\ttfamily
+% \ameta{basename}\_\ameta{indx}.cut
+% \end{quote}
+% \begin{macrocode}
+\def\tg@wrttmppkg#1#2{\def\CommentCutFile{tmp.sty}%
+ \immediate\openout\CommentStream \CommentCutFile
+ \immediate\write\CommentStream{\string
+ \def\string\tgInputContent{\string
+ \InputIfFileExists{#1_#2.cut}%
+ {}{\string\null}}}%
+ \immediate\closeout\CommentStream
+}
+% \end{macrocode}
+% \subsection{\tops{\protect\cs{tileTheGraphic}}{\textbackslash{tileTheGraphic}}: A document body command}
+% The file \texttt{create-tb.tex} contains the single command \cs{tileTheGraphic} in the body
+% of the document. It has not arguments.
+% \begin{macrocode}
+\InputIfFileExists{package-data.cut}{}{}%
+% \end{macrocode}
+% \DescribeMacro\tg@msgi
+% is the content of \texttt{create-tg} to deliver the \textbf{Tile Graphic Report}. It may be redefined.
+% This content command is expanded in \cs{tileTheGraphic}, defined below.
+% \begin{macrocode}
+\def\tg@msgi{%
+ \textbf{Tile Graphic Report}\medskip\par
+ \textbf{Options:}
+ \begin{itemize}
+ \if@wrttofiles
+ \item The \texttt{wrttofiles} option taken,
+ {\nFilesCreated} files written ({\nRows}~rows, {\nCols}~cols):
+ \begin{quote}
+ \texttt{\tg@base\_01.pdf}, \texttt{\tg@base\_02.pdf}, \dots.
+ \end{quote}
+ \ifx\tg@dir\@empty Files saved to source file folder. \else
+ Files saved to the \texttt{\tgInFolder} folder.\fi
+ \else
+ \item The \texttt{!wrttofiles} option taken, no files written.
+ \fi
+ \if@packagefiles
+ \item The \texttt{packagefiles} option taken,
+ package file saved as \texttt{\tg@base\_\packagesuffix.pdf}.
+ The package contains {\nFilesCreated} pages of tiled graphics.
+ \ifx\tg@dir\@empty
+ The package file saved to source file folder.
+ \else
+ The package file saved to the \texttt{\tgInFolder} folder.
+ \fi
+ \else
+ \item The \texttt{!packagefiles} option taken,
+ no package file created.
+ \fi
+ \end{itemize}
+ \if@wrtorpkg\else
+ Try using the \texttt{wrttofiles} and/or
+ \texttt{packagefiles} option(s) to obtain a nontrivial result.
+ \fi
+}
+% \end{macrocode}
+%\leavevmode\DescribeMacro\tileTheGraphic (No arguments) This is the command that tiles
+%the graphic.
+% \begin{macrocode}
+\def\tileTheGraphic{\begingroup\let\@nu\@nameuse
+% \end{macrocode}
+% If the \opt{!packagefiles} option is in effect, we set \cs{ifpassthruTG} to false
+% so we can execute the \cs{else} part within \texttt{create-tg.tex} (as opposed
+% to in \texttt{\ameta{basename}\_\packagesuffix.tex}).
+% \begin{macrocode}
+ \if@packagefiles\else\global\passthruTGfalse\expandafter
+ \tg@msgi % provide content
+ \fi
+ \ifpassthruTG
+ \tg@msgi % provide content
+ \else
+% \end{macrocode}
+% Okay, we are here either because we are compiling this file either from within
+% \texttt{\ameta{basename}\_\packagesuffix.tex} or from within the source file \texttt{create-tg.tex}
+% with the \opt{!packagefiles} option is in effect.
+% \begin{macrocode}
+ \global\let\tg@IndxToks\@empty
+% \end{macrocode}
+% Nested \cs{multido} loop to create grid
+% \begin{macrocode}
+ \if@wrtorpkg\expandafter\tg@domultido\fi
+ \fi
+ \endgroup
+ \xdef\nFilesCreated{\the\tg@Cnt}%
+ \edef\x{\if@wrtorpkg\noexpand\compileTileFiles\fi}\x
+}
+% \end{macrocode}
+% \leavevmode\DescribeMacro\tg@domultido Called by \cs{tileTheGraphic}. Consists of
+% nested \cs{multido} loops. The command both creates the package file and the individual
+% tile graphics, depending on the options. The command \cs{tg@IndexToks} creates a token list
+% of indices \verb~{01}{02}{03}...~ that is later used in a \cs{@tfor} loop.
+% \begin{macrocode}
+\def\tg@domultido{%
+ \tg@Cnt\z@
+ \multido{\iR=\nRows+-1}{\nRows}{%
+ \multido{\iC=1+1}{\nCols}{%
+ \global\advance\tg@Cnt\@ne
+ \ifnum\tg@Cnt<10\relax
+ \edef\x{0\the\tg@Cnt}\else
+ \edef\x{\the\tg@Cnt}\fi
+ \edef\y{\noexpand\g@addto@macro\noexpand
+ \tg@IndxToks{{\x}}}\y
+ \@tempcntb\iC
+ \advance\@tempcntb\@ne
+ \edef\oX{\the\@tempcntb}%
+ \@tempcntb\iR
+ \advance\@tempcntb\@ne
+ \edef\oY{\the\@tempcntb}%
+% \end{macrocode}
+% We write the CUT files.
+% \begin{macrocode}
+ \wrtTileCuts
+% \end{macrocode}
+% Include the graphic with the appropriate viewport and clip; however,
+% we executed the temporary command \cs{z} if the option \cs{packagefiles}
+% is in effect.
+% \begin{macrocode}
+ \edef\z{\noexpand\parbox{\tg@WD}{\noexpand
+ \includegraphics[width=\tg@WD,%
+ viewport=\@nu{x\iC} \@nu{y\iR} \@nu{x\oX} \@nu{y\oY},%
+ clip]{\pathToPic}}}\if@packagefiles\expandafter
+ \z\expandafter\newpage\fi
+ }% inner multido
+ }% outer multido
+}
+% \end{macrocode}
+% \leavevmode\DescribeMacro\wrtTileCuts (Called by \cs{tg@domultido}) The CUT files created are the body content
+% of the \texttt{tile-template.tex} file. The CUTs are also used by the package file routine.
+% The content of these CUT files has the following form:
+%\begin{Verbatim}[xleftmargin=\parindent,codes={\catcode`\%=9},commandchars=!()]
+%\parbox{132.23935pt}{\includegraphics[width=132.23935pt,
+% viewport=0 114.23943 132.23935 228.47885,clip]{!ameta(pathToPic)}}
+%\end{Verbatim}
+%where the values of \texttt{width} and \texttt{viewport} were calculated by the \cs{setTileParams}
+%in the preamble.
+% \begin{macrocode}
+\def\wrtTileCuts{%
+ \def\CommentCutFile{\tg@base_\x.cut}%
+ \immediate\openout\CommentStream=\CommentCutFile
+ \immediate\write\CommentStream{\string
+ \parbox{\tg@WD}{\string
+ \includegraphics[width=\tg@WD,%
+ viewport=\@nu{x\iC} \@nu{y\iR} \@nu{x\oX} \@nu{y\oY},%
+ clip]{\pathToPic}}}\immediate\closeout\CommentStream
+}
+% \end{macrocode}
+%\leavevmode\DescribeMacro\compileTileFiles (Called from \cs{tileTheGraphic}) This command performs
+%the \cs{ShellEscape} steps. It is executed only if the \opt{wrttofiles} or \opt{packagefiles} option
+%is taken (or both).
+% \begin{macrocode}
+\def\compileTileFiles{%
+ \ifpassthruTG
+ \if@packagefiles
+% \end{macrocode}
+% \paragraph*{Package the tile files.} This code is executed by \texttt{create-tg.tex} (because \cs{passthruTG} is true).
+% We write the \texttt{package-data.cut} file, later input by the \pkg{tmp} package, which puts \cs{passthruTG}
+% to false.
+% \begin{macrocode}
+ \def\CommentCutFile{package-data.cut}%
+ \immediate\openout\CommentStream \CommentCutFile
+ \immediate\write\CommentStream{\string\passthruTGfalse}%
+ \immediate\closeout\CommentStream
+% \end{macrocode}
+% Then copy \cs{create-tg.tex} to \texttt{\ameta{basename}\_\packagesuffix.tex}. Keep in mind
+% that when we compile \cs{tg@base\_\packagesuffix.tex} which uses the \pkg{tile-graphic} package,
+% \cs{passthruTG} is false. When \texttt{\ameta{basename}\_\packagesuffix.tex} gets here,
+% this block of code is skipped over.
+% \begin{macrocode}
+ \ShellEscape{\tg@syscopy \jobname.tex
+ \tg@base_\packagesuffix.tex}%
+% \end{macrocode}
+% and compile with the \texttt{--shell-escape} switch,
+% \begin{macrocode}
+ \iftg@direct
+ \ShellEscape{\pkg@ppArgs{\tg@pdfcreator@app} --shell-escape
+ \tg@base_\packagesuffix.tex}%
+ \else
+ \ShellEscape{\latex@ppArgs{latex} --shell-escape
+ \tg@base_\packagesuffix.tex}%
+ \ShellEscape{\dvips@ppArgs{dvips} \tg@base_\packagesuffix.dvi}%
+ \ifnum\tg@case=\thr@@
+ \ShellEscape{\pkg@ppArgs{\tg@pdfcreator@app}
+ \tg@base_\packagesuffix.ps}%
+ \else
+ \ShellEscape{\pkg@ppArgs{\tg@pdfcreator@app} /N /Q
+ "\tg@fullPathToSource/\tg@base_\packagesuffix.ps"}%
+ \fi
+ \ShellEscape{\tg@sysdel \tg@base_\packagesuffix.dvi
+ \tg@base_\packagesuffix.ps}%
+ \fi
+% \end{macrocode}
+% Insert the after-package-creation-hook \DescribeMacro\@fterPkgCreationHook
+% \cs{@fterPkgCreationHook}
+% \begin{macrocode}
+ \@fterPkgCreationHook
+% \end{macrocode}
+% clean up,
+% \begin{macrocode}
+ \ShellEscape{\tg@sysdel \tg@base_\packagesuffix.tex
+ \tg@base_\packagesuffix.log \tg@base_\packagesuffix.aux}%
+% \end{macrocode}
+% and move into the folder from which the graphic resides, if necessary.
+% \begin{macrocode}
+ \iftgfolder
+ \ShellEscape{\tg@sysmove
+ \tg@base_\packagesuffix.pdf \tgInFolder}\fi
+ \fi
+ \else
+% \end{macrocode}
+% \paragraph*{Create the tile files.} This block is compiled if \cs{passThruTG}
+% is false and the \opt{wrttofiles} option is taken.
+% The block gets compiled in two instances:
+% \begin{enumerate}
+% \item[(1)] by \texttt{\ameta{basename}\_\packagesuffix.tex} if the \opt{packagefiles} and
+% \opt{wrttofiles} options are taken;
+% \item[(2)] by \texttt{create-tg.tex} if \opt{!packagefiles} and
+% \opt{wrttofiles} options are taken. (Recall that if \opt{!packagefiles}
+% is taken, then \cs{ifpassThruTG} is set to false earlier in the code stream.)
+% \end{enumerate}
+% \begin{macrocode}
+ \if@wrttofiles
+ \edef\@tforexp{\noexpand
+ \@tfor\noexpand\Indx:=\tg@IndxToks}%
+% \end{macrocode}
+% For each token in \cs{tg@IndexToks} (\verb!{01}{02}{03}...)!, we compile
+% the dynamic file \texttt{tile-template.tex}.
+% \begin{macrocode}
+ \@tforexp \do {%
+ \edef\tgTileBaseIndx{\tg@base_\Indx}%
+% \end{macrocode}
+% Create the \pkg{tmp} package with parameters \ameta{basename} and \ameta{indx}.
+% \begin{macrocode}
+ \edef\x{\noexpand\tg@wrttmppkg{\tg@base}{\Indx}}\x
+% \end{macrocode}
+% Compile this turkey,
+% \begin{macrocode}
+ \iftg@direct
+ \ShellEscape{\tile@ppArgs{\tg@pdfcreator@app}
+ tile-template.tex}%
+ \else
+ \ShellEscape{\latex@ppArgs{latex} --shell-escape
+ tile-template.tex}%
+ \ShellEscape{\dvips@ppArgs{dvips} tile-template.dvi}%
+ \ifnum\tg@case=\thr@@
+ \ShellEscape{\pkg@ppArgs{\tg@pdfcreator@app}
+ tile-template.ps}%
+ \else
+ \ShellEscape{\pkg@ppArgs{\tg@pdfcreator@app} /N /Q
+ "\tg@fullPathToSource/tile-template.ps"}%
+ \fi
+ \ShellEscape{\tg@sysdel tile-template.dvi
+ tile-template.ps}%
+ \fi
+% \end{macrocode}
+% Insert the after-tile-creation-hook \DescribeMacro\@fterTileCreationHook
+% \cs{@fterTileCreationHook}
+% \begin{macrocode}
+ \@fterTileCreationHook
+ \ShellEscape{\tg@syscopy tile-template.pdf
+ \tgTileBaseIndx.pdf}%
+% \end{macrocode}
+% clean up,
+% \begin{macrocode}
+ \ShellEscape{\tg@syscopy tile-template.pdf
+ \tgTileBaseIndx.pdf}%
+ }% do
+% \end{macrocode}
+% and move to another folder if necessary
+% \begin{macrocode}
+ \iftgfolder
+ \ShellEscape{\tg@sysmove \tg@base_*.pdf \tgInFolder}\fi
+ \fi
+ \fi
+% \end{macrocode}
+% finished! Just clean up all aux files.
+% \begin{macrocode}
+ \ShellEscape{\tg@sysdel \tg@base_*.cut package-data.cut}%
+ \ShellEscape{\tg@sysdel tmp.sty tile-template.*}%
+}
+% \end{macrocode}
+% Letting \cs{WriteBookmarks} to \cs{relax} prevents \pkg{hyperref} from
+% complaining about the OUT file is not up to date. No bookmarks are created.
+% Also load the configuration file \marginpar{\raggedleft\small\texttt{tg.cfg}}\texttt{tg.cfg},
+% if it exists.
+% \begin{macrocode}
+\let\WriteBookmarks\relax
+\InputIfFileExists{tg.cfg}{}{}
+\tg@restoreCats
+\parindent0pt
+% \end{macrocode}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%\Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/tile-graphic/tile-graphic.ins b/Master/texmf-dist/source/latex/tile-graphic/tile-graphic.ins
new file mode 100644
index 00000000000..0622b9ee3a2
--- /dev/null
+++ b/Master/texmf-dist/source/latex/tile-graphic/tile-graphic.ins
@@ -0,0 +1,61 @@
+%%
+%% 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 2020 D. P. Story
+%%
+%% This file is part of the `AcroTeX eDucation Bundle'.
+%% -------------------------------------------
+%%
+%% It may be distributed under the conditions of the LaTeX Project Public
+%% License, either version 1.2 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.2 or later is part of all distributions of LaTeX
+%% version 1999/12/01 or later.
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\def\filedate{2020/05/20}
+\def\batchfile{tile-graphic.ins}
+
+\input docstrip
+\ifx\generate\undefined
+ \Msg{**********************************************}
+ \Msg{*}
+ \Msg{* This installation requires docstrip}
+ \Msg{* version 2.4 or later.}
+ \Msg{*}
+ \Msg{* An older version of docstrip has been input}
+ \Msg{*}
+ \Msg{**********************************************}
+ \errhelp{Move or rename old docstrip.tex and get a newer one.}
+ \errmessage{Old docstrip in input path}
+ \batchmode
+ \csname @@end\endcsname\end
+\fi
+
+\keepsilent
+\askforoverwritefalse
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\preamble
+\endpreamble
+
+\generate
+{%
+ \file{tile-graphic.sty}{\from{tile-graphic.dtx}{copyright,package}}
+}
+
+
+\Msg{***************************************************************}
+\Msg{*}
+\Msg{* \space To finish the installation you have to copy the files }
+\Msg{*}
+\Msg{* \space *.sty, *.cfg and *.def into a directory searched by TeX}
+\Msg{*}
+\Msg{***************************************************************}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
diff --git a/Master/texmf-dist/source/latex/tocdata/tocdata.dtx b/Master/texmf-dist/source/latex/tocdata/tocdata.dtx
index cfe157698bc..ebdbf21c518 100644
--- a/Master/texmf-dist/source/latex/tocdata/tocdata.dtx
+++ b/Master/texmf-dist/source/latex/tocdata/tocdata.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 2016--2019 Brian Dunn
+% Copyright 2016--2020 Brian Dunn
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
@@ -15,7 +15,7 @@
% \iffalse
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{tocdata}
-%<package> [2019/07/06 v2.03 Adds author/artist to TOC entries.]
+%<package> [2020/07/15 v2.04 Adds author/artist to TOC entries.]
%
%<*driver>
\documentclass{ltxdoc}
@@ -186,7 +186,7 @@ Keywords={LaTeX, tocdata, contents}%
%</driver>
% \fi
%
-% \CheckSum{662}
+% \CheckSum{521}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -217,6 +217,7 @@ Keywords={LaTeX, tocdata, contents}%
% \changes{v2.01}{2019/03/15}{\ 2019/03/15}
% \changes{v2.02}{2019/03/21}{\ 2019/03/21}
% \changes{v2.03}{2019/07/06}{\ 2019/07/06}
+% \changes{v2.04}{2020/07/15}{\ 2020/07/15}
@@ -240,7 +241,7 @@ Keywords={LaTeX, tocdata, contents}%
%
% \bigskip
%
-% {\small\textcopyright{} 2016--2019} Brian Dunn\\ \small \texttt{bd@BDTechConcepts.com}
+% {\small\textcopyright{} 2016--2020} Brian Dunn\\ \small \texttt{bd@BDTechConcepts.com}
%
% \vspace{.5in}
%
@@ -405,9 +406,9 @@ Keywords={LaTeX, tocdata, contents}%
%
% In the preamble, use:
% \begin{sourceverb}
-% \usepackage{tocdata}% optional
+% \usepackage{tocdata}
% \usepackage{titletoc}% optional
-% \usepackage{tocloft}
+% \usepackage{tocloft}% optional
% \end{sourceverb}
%
%
@@ -937,12 +938,20 @@ Keywords={LaTeX, tocdata, contents}%
{\nobreak\hfil\nobreak}
{\nobreak\hfil\TD@usetocdata\nobreak}
{}
- {}
+ {%
+ \PackageWarningNoLine{tocdata}{%
+ Could not patch titletoc ttl@savel@#1.\MessageBreak
+ Authors may not appear in TOC, LOF}
+ }
\expandafter\xpatchcmd\csname l@#1\endcsname
{\contentspage}
{\TD@usetocdata\contentspage}
{}
- {}
+ {%
+ \PackageWarningNoLine{tocdata}{%
+ Could not patch titletoc l@#1.\MessageBreak
+ Authors may not appear in TOC, LOF}
+ }
}
\TD@titletoc@patch{part}
@@ -1020,108 +1029,32 @@ Keywords={LaTeX, tocdata, contents}%
%
% \subsection{Koma-script \pkg{tocbasic} support}
%
-% \changes{v2.03}{2019/07/06}{Added support for \pkg{tocbasic}.}
-%
% There is no easy way to patch this\dots
% \cs{TD@usetocdata} is inserted near the end of the following:
%
+% \changes{v2.03}{2019/07/06}{Added support for \pkg{tocbasic}.}
+% \changes{v2.04}{2020/07/15}{Updated for \pkg{tocbasic} v3.30.}
+%
% \begin{macrocode}
\AtBeginDocument{
\@ifpackageloaded{tocbasic}{
-\renewcommand*{\scr@dte@tocline}[3]{%
- \ifnum \@nameuse{#1tocdepth}>\c@tocdepth
- \else
- \tocbasic@DependOnPenaltyAndTOCLevel{#1}%
- \addvspace{\@nameuse{scr@tso@#1@beforeskip}}\relax
+\xpatchcmd{\scr@dte@tocline}
{%
- \leftskip \@nameuse{scr@tso@#1@indent}\relax
- \rightskip \@tocrmarg
- \parfillskip -\rightskip
- \@nameuse{Ifscr@tso@#1@raggedpage}{%
- \addtolength{\parfillskip}{\z@ \@plus 1fil}%
- }{}%
- \parindent \@nameuse{scr@tso@#1@indent}\relax
- \@afterindenttrue
- \interlinepenalty\@M
- \expandafter\ifx\csname ragged#1entry\endcsname\raggedright
- \addtolength\rightskip\@flushglue
- \else
- \def\reserved@a{\raggedright}%
- \expandafter\ifx\csname ragged#1entry\endcsname\reserved@a
- \addtolength\rightskip\@flushglue
- \else
- \renewcommand\reserved@a{\raggedright}%
- \expandafter\ifx\csname ragged#1entry\endcsname\reserved@a
- \addtolength\rightskip\@flushglue
- \fi
- \fi
- \fi
- \leavevmode
- \@tempdima \@nameuse{scr@tso@#1@numwidth}\relax
- \@nameuse{Ifscr@tso@#1@dynnumwidth}{%
- \scr@ifundefinedorrelax{scr@dte@#1@lastmaxnumwidth}{}{%
- \ifdim \@nameuse{scr@dte@#1@lastmaxnumwidth}>\@tempdima
- \@tempdima\@nameuse{scr@dte@#1@lastmaxnumwidth}\relax
- \fi
- }%
- }{}%
- \advance\leftskip \@tempdima
- \null\nobreak\hskip -\leftskip
- {%
- \usetocbasicnumberline
- \let\scr@dte@numberline@box\numberline@box
- \def\numberline@box##1{%
- \sbox\scr@dte@tocline@numbox{\@nameuse{scr@tso@#1@numberformat}{##1}}%
- \global\scr@dte@tocline@numberwidth
- \dimexpr\wd\scr@dte@tocline@numbox+\@nameuse{scr@tso@#1@numsep}\relax
- \relax
- \ifdim \scr@dte@tocline@numberwidth
- >\@nameuse{scr@dte@#1@maxnumwidth}\relax
- \global\@nameuse{scr@dte@#1@maxnumwidth}\scr@dte@tocline@numberwidth
- \fi
- \@nameuse{Ifscr@tso@#1@dynnumwidth}{}{%
- \ifdim \scr@dte@tocline@numberwidth
- >\dimexpr \@nameuse{scr@tso@#1@numwidth}%
- +\@nameuse{scr@tso@#1@numsep}\relax\relax
- \PackageWarning{tocbasic%
- }{%
- number width of #1 toc entries should be
- increased!\MessageBreak
- Currently used number width =
- \the\wd\scr@dte@tocline@numbox,\MessageBreak
- Wanted number separation
- \space\space\space =
- \the\dimexpr\@nameuse{scr@tso@#1@numsep}\relax,\MessageBreak
- Reserved number width \space\space\space\space\space\space =
- \the\dimexpr\@nameuse{scr@tso@#1@numwidth}\relax%
- }%
- \fi
- }%
- \scr@dte@numberline@box{\@nameuse{scr@tso@#1@numberformat}{##1}}%
- \@nameuse{Ifscr@tso@#1@breakafternumber}{%
- {\parfillskip\@flushglue\par}\nobreak\hskip-\leftskip
- }{}%
- }%
- \@nameuse{scr@tso@#1@entryformat}{%
- #2%
- \nobreak
- {%
- \normalfont\normalsize\@nameuse{scr@tso@#1@linefill}%
- \TD@usetocdata% lwarp
- \nobreak
- \@nameuse{scr@tso@#1@pagenumberbox}{%
- \@nameuse{scr@tso@#1@pagenumberformat}{#3}%
- }%
- }%
- \@par
- }%
- }%
- }%
- \tocbasic@SetPenaltyByTOCLevel{#1}%
- \fi
-}
-
+ \nobreak
+ \expandafter\let\expandafter\scr@dte@pagenumberwidth
+ }
+ {%
+ \TD@usetocdata% tocdata
+ \nobreak
+ \expandafter\let\expandafter\scr@dte@pagenumberwidth
+ }
+ {}
+ {%
+ \PackageWarningNoLine{tocdata}{%
+ Could not patch tocbasic \protect\scr@dte@tocline.\MessageBreak
+ Authors may not appear in TOC, LOF}
+ }
}{}
}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/todonotes/todonotes.dtx b/Master/texmf-dist/source/latex/todonotes/todonotes.dtx
index b4180a797f6..484d825eb3e 100644
--- a/Master/texmf-dist/source/latex/todonotes/todonotes.dtx
+++ b/Master/texmf-dist/source/latex/todonotes/todonotes.dtx
@@ -20,14 +20,14 @@
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{todonotes}
%<*package>
- [2019/01/24 v1.1.2 Todonotes source and documentation.]
+ [2020/08/18 v1.1.3 Todonotes source and documentation.]
%</package>
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{wrapfig}
\usepackage[colorlinks, linkcolor=black, urlcolor=blue]{hyperref}
-\usepackage[colorinlistoftodos]{todonotes}[2018/11/22]
+\usepackage[colorinlistoftodos]{todonotes}[2020/08/18]
\usepackage{amsmath}
\usepackage{setspace}
\usepackage{soul}
@@ -45,7 +45,7 @@
%</driver>
% \fi
%
-% \CheckSum{717}
+% \CheckSum{721}
%
% \CharacterTable
% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -205,6 +205,8 @@
% (both commands (backslash tiny) and text (tiny) are now supported).}
% \changes{1.1.1}{2018/11/22}{Implemented shadow and noshadow options for the todo command.}
% \changes{1.1.2}{2019/01/24}{Fix issue 36 and 37.}
+% \changes{1.1.3}{2020/08/18}{Fix issue 48 and make colors used in the last todo
+% globally available.}
% \GetFileInfo{todonotes.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment}
@@ -253,10 +255,10 @@
% Large package with a lot of features.
% \end{itemize}
% The main reason for considering other packages is that the todonotes
-% package is quire large and relies heavily on tikz.
+% package is quite large and relies heavily on tikz.
% This can slow down compilation of large documents significantly.
% The mentioned alternatives have a different feature set and does not
-% rely on tikz, which makes them require less ressoureces.
+% rely on tikz, which makes them require fewer resources.
%
%
% \subsection{Usage}
@@ -700,6 +702,12 @@
%\usepackage{menukeys}
% \end{verbatim}
%
+% The following packages must be loaded before the todonotes
+% package:
+% \begin{itemize}
+% \item polyglossia
+% \end{itemize}
+%
%
% \subsubsection{Wrapping of long lines in list of todos}
% When a document is compiled with latex (and not pdflatex) long
@@ -792,6 +800,33 @@
% |\let\marginpar\oldmarginpar|
%
%
+% \subsubsection{todos in math and floating environments}
+% It is not possible to insert todonotes into math environments or
+% floating environments like \verb!figure! or \verb!table!.
+% By replacing the marginpar command with a marginnote this
+% can be enabled.
+% For todos inside math environments the todo must be placed in an
+% \verb!mbox! or \verb!\textrm! command.
+%
+% \begin{verbatim}
+% \documentclass{article}
+% \usepackage{todonotes}
+% \usepackage{marginnote}
+% \let\marginpar\marginnote
+%
+% \begin{document}
+% \begin{equation}
+% a^2=b^2+c^2 \textrm{\todo{Test}}
+% \end{equation}
+% \begin{figure}
+% \centering
+% \caption{Caption\todo{tests}.}
+% \label{fig}
+% \end{figure}
+%
+% \end{verbatim}
+%
+%
% \subsection{Things to improve}
% This is a list of things I consider to improve sometime in the
% future. It have not been done yet as I lack the time or skills to
@@ -859,18 +894,16 @@
% functionality of |\todo| with custom default values.
% \begin{verbatim}
% \newcommand{\todoredefined}[2][]
-% {\todo[color=red, #1]{#2}}
-% \end{verbatim}
+% {\todo[color=red, #1]{#2}}\end{verbatim}
% \newcommand{\todoredefined}[2][]
% {\todo[color=red, #1]{#2}}
-% \todoredefined{Test of newly defined command.}
-% The new command can now be used like shown below
+% The \todoredefined{Test of newly defined command.}
+% new command can now be used like shown below
% \begin{verbatim}
% \todoredefined{Test of newly defined command.}
-% \todoredefined[color=green]{Test of newly defined command, requesting a green color.}
-% \end{verbatim}
-% \todoredefined[color=green]{Test of newly defined command, requesting a green color.}
-% This can be done with all the accepted options for the |\todo| command.
+% \todoredefined[color=green]{Test of newly defined command, requesting a green color.} \end{verbatim}
+% This \todoredefined[color=green]{Test of newly defined command, requesting a green color.}
+% can be done with all the accepted options for the |\todo| command.
%
%
%
@@ -1497,21 +1530,21 @@ prior to loading the todonotes package.} \else\fi%
% commands in the package are defined.
% Set an arbitrarily fill color
% \begin{macrocode}
-\newcommand{\@todonotes@currentlinecolor}{}%
-\newcommand{\@todonotes@currentbackgroundcolor}{}%
-\newcommand{\@todonotes@currenttextcolor}{}%
-\newcommand{\@todonotes@currentbordercolor}{}%
+\gdef\@todonotes@currentlinecolor{\@todonotes@linecolor}%
+\gdef\@todonotes@currentbackgroundcolor{\@todonotes@backgroundcolor}%
+\gdef\@todonotes@currenttextcolor{\@todonotes@textcolor}%
+\gdef\@todonotes@currentbordercolor{\@todonotes@bordercolor}%
\define@key{todonotes}{color}{%
- \renewcommand{\@todonotes@currentlinecolor}{#1}%
- \renewcommand{\@todonotes@currentbackgroundcolor}{#1}}%
+ \gdef\@todonotes@currentlinecolor{#1}%
+ \gdef\@todonotes@currentbackgroundcolor{#1}}%
\define@key{todonotes}{linecolor}{%
- \renewcommand{\@todonotes@currentlinecolor}{#1}}%
+ \gdef\@todonotes@currentlinecolor{#1}}%
\define@key{todonotes}{backgroundcolor}{%
- \renewcommand{\@todonotes@currentbackgroundcolor}{#1}}%
+ \gdef\@todonotes@currentbackgroundcolor{#1}}%
\define@key{todonotes}{textcolor}{%
- \renewcommand{\@todonotes@currenttextcolor}{#1}}%
+ \gdef\@todonotes@currenttextcolor{#1}}%
\define@key{todonotes}{bordercolor}{%
- \renewcommand{\@todonotes@currentbordercolor}{#1}}%
+ \gdef\@todonotes@currentbordercolor{#1}}%
% \end{macrocode}
% Toggle whether there is a shadow behind the inserted notes.
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/tools/array.dtx b/Master/texmf-dist/source/latex/tools/array.dtx
index acfa5609373..ff963d7f514 100644
--- a/Master/texmf-dist/source/latex/tools/array.dtx
+++ b/Master/texmf-dist/source/latex/tools/array.dtx
@@ -29,10 +29,11 @@
%<+package>\providecommand\DeclareCurrentRelease[2]{}
%<+package>
%<+package>\DeclareRelease{}{2016-10-06}{array-2016-10-06.sty}
-%<+package>\DeclareCurrentRelease{}{2019-10-01}
+%<+package>\DeclareRelease{v2.4}{2020-02-10}{array-2020-02-10.sty}
+%<+package>\DeclareCurrentRelease{}{2020-10-01}
%<+package>
%<+package>\ProvidesPackage{array}
-%<+package> [2019/08/31 v2.4l Tabular extension package (FMi)]
+%<+package> [2020/10/01 v2.5c Tabular extension package (FMi)]
%
% \fi
%
@@ -551,14 +552,16 @@
% \item rules can be placed between columns or rows thereby enlarging
% the table.
% \end{enumerate}
-% \texttt{array.sty} implements the second possibility while the
-% default implementation in the \LaTeX{} kernel implements the first
-% concept. Both concepts have their merits but one has to be aware of
-% the individual implications.
+% For vertical rules \texttt{array.sty} implements the second
+% possibility while the default implementation in the \LaTeX{} kernel
+% implements the first concept.
+% Both concepts have their merits but
+% one has to be aware of the individual implications.
% \begin{itemize}
% \item
-% With standard \LaTeX{} adding rules to a table will not affect the
-% width or height of the table (unless double rules are used), e.g.,
+% With standard \LaTeX{} adding vertical rules to a table will
+% not affect the
+% width of the table (unless double rules are used), e.g.,
% changing a preamble from \verb=lll= to \verb=l|l|l= does not
% affect the document other than adding rules to the table. In
% contrast, with \texttt{array.sty} a table that just fit the
@@ -601,6 +604,12 @@
% \end{center}
% \end{itemize}
%
+% Horizontal rules produced with \cs{hline} add to the table height in
+% both implementations but they differ in handling double \cs{hline}s.
+% In contrast a \cs{cline} does not change the table
+% height.\footnote{All a bit inconsistent, but nothing that can be
+% changed after being 30+ years in existence.}
+%
% \subsection{Comparisons with older versions of \texttt{array.sty}}
%
% There are some differences in the way version 2.1 treats incorrect
@@ -730,7 +739,11 @@
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\documentclass{ltxdoc}
-\AtBeginDocument{\DeleteShortVerb{\|}} % undo the default is not used
+% undo the default is not used:
+
+\IfFormatAtLeastTF {2020/10/01}
+ {\AtBeginDocument[ltxdoc]{\DeleteShortVerb{\|}} }
+ {\AtBeginDocument{\DeleteShortVerb{\|}} }
\usepackage{array}
@@ -746,6 +759,7 @@
%\OnlyDescription % comment out for implementation details
%\OldMakeindex % use if your MakeIndex is pre-v2.9
+
\begin{document}
\DocInput{array.dtx}
\end{document}
@@ -2206,8 +2220,13 @@
\let\do@row@strut\relax
% \end{macrocode}
%
+% \cs{@yargarraycr} is the same as in the \LaTeX{} kernel
+% (depending on the date of the kernel with one of the two
+% definitions below). We therefore do not define it again.
+% \changes{v2.5b}{2020/04/22}{Don't define \cs{@yargarraycr} unnecessarily}
% \begin{macrocode}
-\def\@yargarraycr#1{\cr\noalign{\vskip #1}}
+%\def\@yargarraycr#1{\cr\noalign{\@vspace@calcify{#1}}} % 2020-10-01
+%\def\@yargarraycr#1{\cr\noalign{\vskip #1}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2916,10 +2935,13 @@
%
% We start by producing a single tabular row without any visible
% content that will produce the external reference point in case
-% "[t]" is used.
+% "[t]" is used. We need to suppress the \cs{tabcolsep} in the
+% \cs{multicolumn} in case there wasn't any in the real column.
+%
+% \changes{v2.5c}{2020/07/20}{Suppress all column space (gh/322)}
% \begin{macrocode}
\newcommand{\firsthline}{%
- \multicolumn1c{%
+ \multicolumn1{@{}c@{}}{%
% \end{macrocode}
% Within this row we calculate "\backup@length" to be the height
% plus depth of a standard line. In addition we have to add the
@@ -2936,6 +2958,10 @@
% \begin{macrocode}
\raise\extratabsurround\copy\@arstrutbox
% \end{macrocode}
+% And we should also cancel the guard otherwise we end up with two.
+% \begin{macrocode}
+ \kern-1sp%
+% \end{macrocode}
% Having done all this we end the line and back up by the value of
% "\backup@length" and then finally place our "\hline". This should
% place the line exactly at the right place but keep the reference
@@ -2957,9 +2983,12 @@
% depth of this last line increased by "\extratabsurround" without
% changing the placement "\hline".
%
-% We start by placing the rule followed by an invisible row.
+% We start by placing the rule followed by an invisible row. We
+% need to suppress the \cs{tabcolsep} in the multicol in case there
+% wasn't any in the real column.
+% \changes{v2.5c}{2020/07/20}{Suppress all column space (gh/322)}
% \begin{macrocode}
-\newcommand{\lasthline}{\hline\multicolumn1c{%
+\newcommand{\lasthline}{\hline\multicolumn1{@{}c@{}}{%
% \end{macrocode}
% We now calculate "\backup@length" to be the height and depth of
% two lines plus the width of the rule.
@@ -2977,8 +3006,9 @@
% reference for the whole tabular). Since this row is invisible we
% can enlarge its depth by the desired amount.
% \begin{macrocode}
- \multicolumn1c{%
+ \multicolumn1{@{}c@{}}{%
\lower\extratabsurround\copy\@arstrutbox
+ \kern-1sp%
}%
}
% \end{macrocode}
@@ -3034,14 +3064,18 @@
% 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}
+% \changes{v2.5a}{2020/04/06}{Use \cs{d@llarbegin} and \cs{d@llarend} so
+% that cell is typeset in math mode inside \texttt{array} (gh/297)}
% \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".
+% "\ar@cellbox". We add \cs{d@llarbegin} (and later \cs{d@llarend})
+% so that the content is typeset in math mode if we are in an
+% \texttt{array} environment.
% \begin{macrocode}
- >{\begin{lrbox}\ar@cellbox}%
+ >{\begin{lrbox}\ar@cellbox\d@llarbegin}%
% \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
@@ -3056,10 +3090,13 @@
% 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.
+% alignment within that width. We unbox the collected material so
+% that any stretchable glue inside can interact with the alignment.
+% \changes{v2.4m}{2020/02/10}{Unbox collected material so that
+% stretchable glue inside can act (gh/270)}
% \begin{macrocode}
- <{\end{lrbox}%
- \makebox[#2][#1]{\usebox\ar@cellbox}}}
+ <{\d@llarend \end{lrbox}%
+ \makebox[#2][#1]{\unhbox\ar@cellbox}}}
% \end{macrocode}
% \end{macro}
@@ -3069,11 +3106,13 @@
% 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}
+% \changes{v2.5a}{2020/04/06}{Use \cs{d@llarbegin} and \cs{d@llarend} so
+% that cell is typeset in mathmode inside \texttt{array} (gh/297)}
% \begin{macrocode}
\newcolumntype{W}[2]
- {>{\begin{lrbox}\ar@cellbox}%
+ {>{\begin{lrbox}\ar@cellbox\d@llarbegin}%
c%
- <{\end{lrbox}%
+ <{\d@llarend\end{lrbox}%
\let\hss\hfil
\makebox[#2][#1]{\unhbox\ar@cellbox}}}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/tools/varioref.dtx b/Master/texmf-dist/source/latex/tools/varioref.dtx
index 077103eb97a..2bba60465e0 100644
--- a/Master/texmf-dist/source/latex/tools/varioref.dtx
+++ b/Master/texmf-dist/source/latex/tools/varioref.dtx
@@ -40,7 +40,7 @@
%<package>\DeclareCurrentRelease{}{2019-10-01}
%<package>
%<package>\ProvidesPackage{varioref}
-%<package> [2020/01/23 v1.6c package for extended references (FMi)]
+%<package> [2020/08/11 v1.6e package for extended references (FMi)]
% \fi
%
%%
@@ -70,7 +70,7 @@
% \PackageWarning{inputenc}{Unicode character \expandafter
% \UTFviii@splitcsname\string##1\relax
% \MessageBreak
-% not set up for use with LaTeX}^^A
+% not set up for use with LaTeX -- ignored}^^A
% \raisebox{.8pt}{\fboxsep1pt\kern.1pt\fbox{$\cdot$}\kern.1pt}^^A
% }}
% \makeatother
@@ -390,6 +390,8 @@
%\end{verbatim}
% textual references can be suppressed.
%
+%
+%
% \section{Multi-lingual usage}
%
% The package works well together with the babel system if it is
@@ -475,6 +477,19 @@
% describes the range of figures, tables, or whatever the labels refer
% to, the default for English is ``|\ref{#1} to~\ref{#2}|''.
%
+%
+% \NewIn{2020}
+% \DescribeMacro\vrefformat
+% \DescribeMacro\Vrefformat
+% \DescribeMacro\vrefrangeformat
+% \DescribeMacro\fullrefformat
+% In some languages (currently only for Japanese) the generated text
+% has to typeset in different word order to most other (Western) languages.
+% To accomodate for this \cs{vrefformat}, etc.\ has been
+% added to allow to alter this on a per language basis.
+% There should be normally no need to alter the setup. For details see
+% the code section.
+%
% \subsection{\ldots\ if Babel is used}
%
% \begin{itshape} If babel is being used then the above commands need to be
@@ -556,6 +571,7 @@
% |\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}
%
%
@@ -708,6 +724,10 @@
\def\reftextfaraway#1{op bladsy~\pageref{#1}}%
\def\reftextpagerange#1#2{op bladsye~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} tot~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
%
@@ -723,6 +743,10 @@
\def\reftextfaraway#1{on page~\pageref{#1}}%
\def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Arabic option text was contributed by Ihab Samir Mattar
@@ -743,6 +767,10 @@
\def\reftextfaraway#1{بالصفحة رقم~\pageref{#1}}%
\def\reftextpagerange#1#2{بالصفحات~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} حتى~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% \end{allowtofu}
@@ -759,6 +787,7 @@
\def\reftextfaraway#1{auf Seite~\pageref{#1}}%
\def\reftextpagerange#1#2{auf Seiten~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% \changes{v1.2d}{2000/01/11}{Added naustrian defaults (identical to german)}
@@ -774,6 +803,10 @@
\def\reftextfaraway#1{auf Seite~\pageref{#1}}%
\def\reftextpagerange#1#2{auf Seiten~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for basque defaults was contributed by
@@ -791,6 +824,10 @@
\def\reftextfaraway#1{~\pageref{#1}. orrialdean}%
\def\reftextpagerange#1#2{~\pageref{#1}--\pageref{#2} orrialdeetan}%
\def\reftextlabelrange#1#2{\ref{#1}.etik \ref{#2}.eraino}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for the Bahasa Malaysia defaults was contributed by
@@ -815,6 +852,10 @@
\def\reftextfaraway#1{pada muka surat~\pageref{#1}}%
\def\reftextpagerange#1#2{pada muka surat~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for brazil defaults was contributed by
@@ -837,6 +878,10 @@
\def\reftextfaraway#1{na p\'agina~\pageref{#1}}%
\def\reftextpagerange#1#2{nas p\'aginas~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for Breton defaults was contributed by
@@ -858,6 +903,10 @@
on pages~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\vref@stringwarning\reflabelpagerange
\ref{#1} to~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for Bulgarian defaults was contributed by
@@ -892,6 +941,10 @@
\cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyri
~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} \cyrd\cyro~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for catalan defaults was contributed by Robert Fuster\\
@@ -910,6 +963,10 @@
\def\reftextpagerange#1#2{a les
p\`agines~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for croatian defaults was contributed by \v{S}ime Ungar
@@ -926,6 +983,10 @@
\def\reftextfaraway#1{na stranici~\pageref{#1}}%
\def\reftextpagerange#1#2{na stranicama~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} do~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Defaults for the Czech option provided by Milan Vancura
@@ -943,6 +1004,10 @@
\def\reftextfaraway#1{na stran\v{e}~\pageref{#1}}%
\def\reftextpagerange#1#2{na stran\'ach~\pageref{#1}\--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a\v{z}~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Defaults for Danish provided by Torsten Martinsen
@@ -965,6 +1030,10 @@
\def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
\def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Default string for dutch have been contributed by Frank Poppe
@@ -1004,6 +1073,10 @@
% \begin{macrocode}
\def\reftextpagerange#1#2{op pagina's~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% \changes{v1.2a}{1998/08/22}{Added english defaults for
@@ -1021,6 +1094,10 @@
\def\reftextfaraway#1{on page~\pageref{#1}}%
\def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
%
@@ -1041,6 +1118,10 @@
\def\reftextfaraway#1{en pa\^go~\pageref{#1}}%
\def\reftextpagerange#1#2{en pa\^goj~\pageref{#1} \^gis \pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} \^gis~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The finnish strings were suggested by Matti Rintala
@@ -1064,6 +1145,10 @@
% Can't combine numbers with the necessary suffix well.
% \begin{macrocode}
\def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% French defaults are provided by Daniel Flippo
@@ -1083,6 +1168,10 @@
\def\reftextfaraway#1{page~\pageref{#1}}%
\def\reftextpagerange#1#2{pages~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} \`a~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Galician defaults are provided by Matthias Moebius\\
@@ -1104,6 +1193,10 @@
\def\reftextpagerange#1#2{%
nas p\'axinas~\pageref{#1}-\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% There are no good variants for German (I think and still think but
@@ -1138,6 +1231,10 @@
\def\reftextfaraway#1{auf Seite~\pageref{#1}}%
\def\reftextpagerange#1#2{auf den Seiten~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% \changes{v1.2d}{2000/01/11}{Added ngerman defaults (identical to german)}
@@ -1155,6 +1252,10 @@
\def\reftextfaraway#1{auf Seite~\pageref{#1}}%
\def\reftextpagerange#1#2{auf den Seiten~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Defaults for greek suggested by Apostolos Syropoulos\\
@@ -1174,6 +1275,10 @@
\def\reftextpagerange#1#2{stis sel'ides\nobreakspace
\pageref{#1}---\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} ws\nobreakspace\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Icelandic defaults suggested by Thorhallur Sverrisson
@@ -1194,6 +1299,10 @@
\def\reftextfaraway#1{\'{a} s\'{i}{\dh}u~\pageref{#1}}%
\def\reftextpagerange#1#2{\'{a} s\'{i}{\dh}um~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Defaults for Italian suggested by Giovanni Pensa
@@ -1218,8 +1327,44 @@
\def\reftextfaraway#1{a pagina~\pageref{#1}}%
\def\reftextpagerange#1#2{nelle pagine~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{da~\ref{#1} a~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
+% Defaults for Japanese. It needs a special \cs{vrefformat},
+% \cs{Vrefformat}, \cs{fullrefformat} and \cs{vrefrangeformat}
+% for gramatical reasons. As our standard documentation
+% workflow uses pdf\TeX{} the Japanese letters can't be displayed
+% easily, so you will see missing glyphs below. To see the real
+% letters you have to look at the source or package file.
+% \changes{v1.6d}{2020/07/20}{Option japanese added (gh/352)}
+% \changes{v1.6e}{2020/07/25}{Option japanese changed (gh/352)}
+% \begin{allowtofu}
+% \begin{macrocode}
+\DeclareOption{japanese}
+ {\vref@addto\extrasjapanese{%
+ \def\reftextfaceafter {\reftextvario{見開き}{次}ページ}%
+ \def\reftextfacebefore{\reftextvario{見開き}{前}ページ}%
+ \def\reftextafter {\reftextvario{直後の}{次}ページ}%
+ \def\reftextbefore {\reftextvario{直前の}{前}ページ}%
+ \def\reftextcurrent {\reftextvario{この}{現}ページ}%
+ \def\reftextfaraway#1{\pageref{#1}ページ}%
+ \def\reftextpagerange#1#2{\pageref{#1}から\pageref{#2}ページ}%
+ \def\reftextlabelrange#1#2{\ref{#1}から\ref{#2}}%
+% \end{macrocode}
+% Note that the parentheses beow are not normal ones but full width
+% ones U+FF08 and U+FF09!
+% \begin{macrocode}
+ \def\vrefformat#1#2{\ref{#2}(\vpageref[#1]{#2})}%
+ \def\Vrefformat#1#2{\Ref{#2}(\vpageref[#1]{#2})}%
+ \def\fullrefformat#1{\ref{#1}(\reftextfaraway{#1})}%
+ \def\vrefrangeformat#1#2#3{\reftextlabelrange{#2}{#3}%
+ (\vpagerefrange[{#1}]{#2}{#3})}%
+ }}
+% \end{macrocode}
+% \end{allowtofu}
% Defaults for Hungarian by Jeff Goldberg
% (\verb=jeffrey@goldmark.org=).
% There is a problem with the use of the definite article
@@ -1264,6 +1409,10 @@
on pages~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\vref@stringwarning\reflabelpagerange
\ref{#1} to~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}%
% \end{macrocode}
% The |\AtBeginDocument| needs to be executed when the option is
@@ -1304,6 +1453,10 @@
\def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
\def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
\DeclareOption{nynorsk}
{\vref@addto\extrasnynorsk{%
@@ -1315,6 +1468,10 @@
\def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
\def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The polish translations have been provided by
@@ -1342,6 +1499,10 @@
\def\reftextfaraway#1{na stronie~\pageref{#1}}%
\def\reftextpagerange#1#2{na stronach~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{od~\ref{#1} do~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The portuguese default text has been provided by
@@ -1362,6 +1523,10 @@
\def\reftextfaraway#1{na p\'agina~\pageref{#1}}%
\def\reftextpagerange#1#2{nas p\'aginas~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Updates to the default text for Romanian have been suggested by Florin Oprina
@@ -1381,6 +1546,10 @@
\def\reftextfaraway#1{pe pagina~\pageref{#1}}%
\def\reftextpagerange#1#2{pe paginile~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} la~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The text for russian was taken from the book in Russian by
@@ -1414,6 +1583,10 @@
\def\reftextpagerange#1#2{\cyrn\cyra\ \cyrs\cyrt\cyrr\cyra\cyrn
\cyri\cyrc\cyra\cyrh~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\cyrs~\ref{#1}\ \cyrp\cyro~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The text for slovak defaults was contributed by Miroslav Sedivy\\
@@ -1434,6 +1607,10 @@
\def\reftextfaraway#1{na strane~\pageref{#1}}%
\def\reftextpagerange#1#2{na stran\'ach~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a\v z~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The text for slovene defaults was contributed by Roman Maurer\\
@@ -1450,6 +1627,10 @@
\def\reftextfaraway#1{na strani~\pageref{#1}}%
\def\reftextpagerange#1#2{na straneh~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{od~\ref{#1} do~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for spanish defaults was contributed by Julio Sanchez
@@ -1470,6 +1651,10 @@
\def\reftextpagerange#1#2{en las p\'aginas~\pageref{#1}%
-\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The text for swedish was contributed by Mats Dahlgren
@@ -1492,6 +1677,10 @@
\def\reftextpagerange#1#2{p\aa\
sidorna~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} till~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
\DeclareOption{turkish}
{\vref@excuse{turkish}%
@@ -1505,6 +1694,7 @@
\def\reftextfaraway#1{on page~\pageref{#1}}%
\def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The text for Ukrainian defaults was contributed by Mykola Lyakhovych\\
@@ -1532,6 +1722,10 @@
\def\reftextpagerange#1#2{\cyrn\cyra\ \cyrs\cyrt\cyro\cyrr\cyrii
\cyrn\cyrk\cyra\cyrh~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\cyrz~\ref{#1}\ \cyrd\cyro~\ref{#2}}%
+ \let\vrefformat\vrefdefaultformat
+ \let\Vrefformat\Vrefdefaultformat
+ \let\fullrefformat\fullrefdefaultformat
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% We support francais as an alternative to french since people
@@ -1585,7 +1779,6 @@
% \pkg{babel} package).
% \begin{macrocode}
\ExecuteOptions{english,final,space}
-\ProcessOptions*
% \end{macrocode}
%
%
@@ -2062,11 +2255,26 @@
% |\vpageref|, it that is needed one has to call both commands
% explicitly
% \changes{v1.6a}{2019/08/25}{Command added to support hyperref better}
+% \changes{v1.6e}{2020/07/25}{Changed for Japanese (gh/352)}
+% \begin{macrocode}
+\newcommand\vref@star[1][]{\vrefformat{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\vrefformat,\vrefdefaultformat}
+% Japanese needs a different word order in \cs{vref@star} so this
+% is separated out o that it can be changed on language level.
+% \changes{v1.6e}{2020/07/25}{Macro added (gh/352)}
% \begin{macrocode}
-\newcommand\vref@star[2][]{%
+\def\vrefdefaultformat#1#2{%
\ref{#2}
\vpageref[#1]{#2}}
% \end{macrocode}
+% Most languages need the above definition.
+% \begin{macrocode}
+\let\vrefformat\vrefdefaultformat
+% \end{macrocode}
% \end{macro}
% \begin{macro}{\vr@f}
@@ -2172,8 +2380,24 @@
% \begin{macro}{\fullref}
% And here is the primitive command that always produces a |\ref|
% and a |\pageref|.
+% \changes{v1.6e}{2020/07/25}{Changed for Japanese (gh/352)}
+% \begin{macrocode}
+\newcommand\fullref{\fullrefformat}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\fullrefformat,\fullrefdefaultformat}
+% Japanese needs a different word order in \cs{fullref} so this
+% is separated out o that it can be changed on language level.
+% \changes{v1.6e}{2020/07/25}{Macro added (gh/352)}
% \begin{macrocode}
-\def\fullref#1{\ref{#1} \reftextfaraway{#1}}
+\def\fullrefdefaultformat#1{%
+ \ref{#1} \reftextfaraway{#1}}
+% \end{macrocode}
+% Most languages need the above definition.
+% \begin{macrocode}
+\let\fullrefformat\fullrefdefaultformat
% \end{macrocode}
% \end{macro}
%
@@ -2286,13 +2510,28 @@
% \changes{v1.2a}{1998/08/01}{Macro added}
% \changes{v1.4s}{2006/08/07}
% {Prevent loss of brackets}
+% \changes{v1.6d}{2020/07/20}{Changed for Japanese (gh/352)}
+% Argument two and three are implicitly picked up.
% \begin{macrocode}
-\newcommand\vrefrange[3][\reftextcurrent]
- {\reftextlabelrange{#2}{#3} \vpagerefrange[{#1}]{#2}{#3}}
+\newcommand\vrefrange[1][\reftextcurrent]{\vrefrangeformat{#1}}
% \end{macrocode}
+%
% \end{macro}
%
%
+% \begin{macro}{\vrefrangeformat,\vrefrangedefaultformat}
+% Japanese needs a different word order in \cs{vrefrange} so this
+% is separated out o that it can be changed on language level.
+% \changes{v1.6d}{2020/07/20}{Macro added (gh/352)}
+% \begin{macrocode}
+\def\vrefrangedefaultformat#1#2#3{%
+ \reftextlabelrange{#2}{#3} \vpagerefrange[{#1}]{#2}{#3}}
+% \end{macrocode}
+% Most languages need the above definition.
+% \begin{macrocode}
+\let\vrefrangeformat\vrefrangedefaultformat
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\Vref}
% \changes{v1.4a}{2002/02/24}{Macro added}
@@ -2308,11 +2547,26 @@
%
% \begin{macro}{\Vref@star}
% \changes{v1.6a}{2019/08/25}{Command added to support hyperref better}
+% \changes{v1.6e}{2020/07/25}{Changed for Japanese (gh/352)}
% \begin{macrocode}
-\newcommand\Vref@star[2][]{%
+\newcommand\Vref@star[1][]{\Vrefformat{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\Vrefformat,\Vrefdefaultformat}
+% Japanese needs a different word order in \cs{Vref} so this
+% is separated out o that it can be changed on language level.
+% \changes{v1.6e}{2020/07/25}{Macro added (gh/352)}
+% \begin{macrocode}
+\def\Vrefdefaultformat#1#2{%
\Ref{#2}
\vpageref[#1]{#2}}
% \end{macrocode}
+% Most languages need the above definition.
+% \begin{macrocode}
+\let\Vrefformat\Vrefdefaultformat
+% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\Vr@f}
@@ -2443,6 +2697,12 @@
% \end{macro}
% \end{macro}
%
+% \changes{v1.6e}{2020/07/25}{Move to handle
+% the language-specific reference formats. (gh/352)}
+% \begin{macrocode}
+\ProcessOptions*
+% \end{macrocode}
+%
% \begin{macrocode}
%</package>
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/tools/verbatim.dtx b/Master/texmf-dist/source/latex/tools/verbatim.dtx
index 121e2d4b39c..e62886e0033 100644
--- a/Master/texmf-dist/source/latex/tools/verbatim.dtx
+++ b/Master/texmf-dist/source/latex/tools/verbatim.dtx
@@ -69,6 +69,8 @@
%\fi
%
%
+% \changes{v1.5u}{2020-07-07}{Typo repair and added a missing comment
+% character}
% \changes{v1.5q}{2003/08/22}{Reintroduced \cs{@noligs}, by popular
% request.}
% \changes{v1.5i}{1996/06/04}{Move setting of verbatim font and
@@ -462,9 +464,12 @@
% the spacing.
% Then we open the file and set the category codes of all special
% characters:
+% \changes{v1.5t}{2020-07-05}{Added quotes around the filename in
+% order to allow a filename with spaces; also added a space and
+% comment-character to allow for thespace dlimited argument.}
% \begin{verbatim}
% \@bsphack
-% \immediate\openout \verbatim@out #1
+% \immediate\openout \verbatim@out "#1" %
% \let\do\@makeother\dospecials
% \catcode`\^^M\active
%\end{verbatim}
@@ -503,7 +508,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{verbatim}
- [2019/11/10 v1.5r LaTeX2e package for verbatim enhancements]
+ [2020-07-07 v1.5u LaTeX2e package for verbatim enhancements]
\@ifundefined{verbatim@@@}{}{\endinput}
% \end{macrocode}
%
@@ -1567,19 +1572,31 @@
% existence of file.}
% |\verbatim@input| first checks whether the file exists, using
% the standard macro |\IfFileExists| which leaves the name of the
-% file found in |\@filef@und|.
-% Then everything is set up as in the |\verbatim| macro.
+% file found in |\@filef@und|.
+% Then everything is set up as in the |\verbatim| macro. But, as
+% |\@verbatim| contains a call to |\every@verbatim| which
+% \emph{might} contain an |\input| statement, which would overwrite
+% the contents of |\@filef@und|, we need to save it by expanding it
+% first. The use of |\@swaptwoargs| makes it so that the
+% \emph{expansion} of |\@filef@und| gets to be the second argument
+% of |\verbatim@readfile|.
+% \changes{v1.5t}{2020-07-06}{Expand \cs{@filef@und} before the call
+% of \cs{@verbatim} (gh/222)}m
% \begin{macrocode}
\def\verbatim@input#1#2{%
- \IfFileExists {#2}{\@verbatim #1\relax
+ \IfFileExists {#2}{%
+ \expandafter\@swaptwoargs\expandafter
+ {\expandafter{\@filef@und}}%
+ {\@verbatim #1\relax
% \end{macrocode}
% Then it reads in the file, finishes off the \texttt{trivlist}
% environment started by |\@verbatim| and closes the group.
% This restores everything to its normal settings.
% \begin{macrocode}
- \verbatim@readfile{\@filef@und}\endtrivlist\endgroup\@doendpe}%
+ \verbatim@readfile}%
+ \endtrivlist\endgroup\@doendpe}%
% \end{macrocode}
-% If the file is not found a more or less helpful message is
+% If the file is not found a more or less helpful message is
% printed. The final |\endgroup| is needed to close the group
% started in |\verbatiminput| above.
% \begin{macrocode}
diff --git a/Master/texmf-dist/source/latex/tools/xr.dtx b/Master/texmf-dist/source/latex/tools/xr.dtx
index a6b2ffd8193..a963886cde7 100644
--- a/Master/texmf-dist/source/latex/tools/xr.dtx
+++ b/Master/texmf-dist/source/latex/tools/xr.dtx
@@ -25,7 +25,7 @@
%
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{xr}
-%<package> [2019/07/22 v5.05 eXternal References (DPC)]
+%<package> [2020-05-10 v5.06 eXternal References (DPC)]
%
%<*driver>
\documentclass{ltxdoc}
@@ -103,12 +103,15 @@
\let\externalcitedocument\externaldocument
% \end{macrocode}
%
-% Save the optional prefix. Start processing the first |aux| file.
+% Save the optional prefix. Start processing the first |aux| file.
+% \changes{v5.06}{2020-05-10}{Remove leading and trailing sapces from
+% the filename (gh/2223)}
% \begin{macrocode}
\def\XR@[#1]#2{{%
\makeatletter
\def\XR@prefix{#1}%
- \XR@next#2.aux\relax\\}}
+ \set@curr@file{#2}%
+ \expandafter\XR@next\@curr@file.aux\relax\\}}
% \end{macrocode}
%
% Process the next |aux| file in the list and remove it from the head of
@@ -135,8 +138,10 @@
% If the |aux| file exists, loop through line by line, looking for
% |\newlabel| and |\@input|. Otherwise process the next file in the
% list.
+% \changes{v5.06}{2020-05-10}{Add braces around the filename to
+% support filenames with spaces (gh/223)}
% \begin{macrocode}
-\def\XR@loop#1{\openin\@inputcheck#1\relax
+\def\XR@loop#1{\openin\@inputcheck{#1}\relax
\ifeof\@inputcheck
\PackageWarning{xr}{^^JNo file #1^^JLABELS NOT IMPORTED.^^J}%
\expandafter\XR@aux
diff --git a/Master/texmf-dist/source/latex/toptesi/toptesi.dtx b/Master/texmf-dist/source/latex/toptesi/toptesi.dtx
index ef86c19b163..a72cb2a7d53 100644
--- a/Master/texmf-dist/source/latex/toptesi/toptesi.dtx
+++ b/Master/texmf-dist/source/latex/toptesi/toptesi.dtx
@@ -10,7 +10,7 @@
\preamble
______________________________________________________
The TOPtesi bundle
- Copyright (C) 2015-2019 Claudio Beccari
+ Copyright (C) 2015-2020 Claudio Beccari
All rights reserved
License information appended
@@ -18,7 +18,7 @@
\endpreamble
\postamble
-Copyright 2005-2019 Claudio Beccari
+Copyright 2005-2020 Claudio Beccari
Distributable under the LaTeX Project Public License,
version 1.3c or higher (your choice). The latest version of
@@ -102,7 +102,7 @@ School of Turin.
\endgroup
%</internal>
%
-% Copyright 1989--2019 Claudio Beccari
+% Copyright 1989--2020 Claudio Beccari
%
% This file is part of the TOPtesi bundle
% -------------------------------------------
@@ -142,7 +142,7 @@ School of Turin.
%<topmag>\ProvidesPackage{toptesi-magistrale}[%
%<topdoc>\ProvidesPackage{toptesi-dottorale}[%
%<*driver,class,topsty,topcmn,topfrn,topscu,topmon,topsss,topmag,topdoc>
-2019-07-26 v.6.3.06
+2020-09-06 v.6.4.06
%<class>Class for typesetting university theses]
%<topsty>Extension for toptesi.cls]
%<topcmn>Additional commands for the TOPtesi bundle]
@@ -168,10 +168,12 @@ School of Turin.
xparse,curve2e,etoolbox,textcomp}
\let\originalmeta\meta
\renewcommand\meta[1]{{\normalfont\originalmeta{#1}}}
+\providecommand\cs{}
+\def\cs#1{\textnormal{\ttfamily\char92 #1}}
\def\prog#1{\textsf{#1}}
\def\pack#1{\textsf{\slshape#1}}
\def\env#1{\textit{#1}}\let\amb\env
-\def\file#1{\texttt{#1}}
+\def\file#1{\texttt{#1}}\let\class\file
\def\marg#1{{\normalfont\texttt{\{}\meta{#1}\texttt{\}}}}
\def\Marg#1{{\texttt{\{#1\}}}}
\def\opz#1{{\normalfont\textsl{#1}}}
@@ -256,7 +258,7 @@ School of Turin.
%</driver>
% \fi
%
-% \CheckSum{7660}
+% \CheckSum{8010}
%
% \begin{abstract}
% This file describes the TOPtesi bundle; it consists of a set of files
@@ -272,7 +274,7 @@ School of Turin.
% files has the ambition to be suited for typesetting theses in
% any university in the world\dots\ This ambition can't be
% fulfilled, though, because of the complexity of the title
-% page (and possibly of the legal page) requirements. This
+% page (and possibly of the copyright page) requirements. This
% version is compliant with the \XeLaTeX\ and the \LuaLaTeX\
% programs. Up to now the few conflicts that have
% been spotted have been solved with suitable corrections or
@@ -307,7 +309,8 @@ School of Turin.
% Public Licence (LPPL) which is appended to the Italian documentation
% file \texttt{toptesi-it.pdf} included in this bundle; personal
% customisation of parts of this bundle are discouraged but are
-% permitted only in conformance with the LPPL. See also section~\ref{sec:LPPL}.}
+% permitted only in conformance with the LPPL. See also
+% section~\ref{sec:LPPL} in this document.}
% \end{abstract}
%
% \section{History}
@@ -472,7 +475,7 @@ School of Turin.
% the |pdfpages| package), or even create his/her personal
% title page by means of the standard |titlepage| environment.
%
-% All this implied the rewriting of both the English and
+% All this implied rewriting both the English and
% Italian documentation files; the user can find useful
% information in the English file |toptesi.pdf| included
% in the bundle; this file is pretty lengthy because it
@@ -709,9 +712,10 @@ School of Turin.
% specific options.
%
% \subsection{Class options}
-% The class honors all the options accepted by the |report|
+% The class accepts all the options valid for the |report|
% document class plus the ones defined here:
% \begin{description}[noitemsep]\def\Item[#1]{\item[\opz{#1}]}
+%
% \Item[chapterbib] Allows to typeset a list of references at the
% end of each chapter and the bibliography items are numbered with
% a \emph{chapter.item} indication. This implies a manual build
@@ -721,7 +725,7 @@ School of Turin.
% complete \TeX\ system distribution and the facilities offered
% by packages such as \pack{biblatex}, and on the sorting and formatting
% engines such as \prog{biber}. The use of this option, retained for
-% backwards compatibility, is strongly deprecated.
+% backwards compatibility, is \emph{strongly deprecated}.
%
% \Item[stile=classica] Specifies a general modification of certain
% details that are supposed to be more adequate for theses in
@@ -729,10 +733,11 @@ School of Turin.
% be used for some numerical pieces of information; some variations
% are also introduced in the title page. This option is active also
% when using some of the modules for specific theses, in particular
-% with the |dottorale| thesis option.
+% with the |dottorale| thesis option. Some of the following options
+% may be valid or may remain inactive when this thesis style is specified.
%
% \Item[cucitura=\meta{displacement}] In two sided printing
-% it is better to move the typesetting grid towards the outer
+% it might be necessary to move the typesetting grid towards the outer
% edge so as to cope with the thesis binding that is generally
% not made up by sewing together a number of signatures; the
% default outer displacement is fixed to~7mm, but it can be
@@ -788,12 +793,33 @@ School of Turin.
% the like, only when the main matter was complete, corrected
% and stable. Nowadays with electronic typesetting there is no
% need to to use this artifice, but in some disciplines it is
-% still considered an elegant touch.
+% still considered a touch of elegance.
+% \Item[folioinhead] Folios by default are typeset at the center
+% of the footer. With thei options they are placed in the margin,
+% aligned with the header; thei feature has been requested in some
+% universities, but admittedly is not particularly elegant; may be
+% it can be used only when the header is centred in the measure,
+% certainly not when is is moved to the outer side of the header.
+% No particular functionality is provided to avoid this particular
+% choice; it is up to the user to avoid this error. Ineffective is
+% the |stile=classica| option is specified.
+%
+% \Item[nocenterhead] The header text is normally centred in the
+% measure. If this option is specified, the header text is moved
+% to the outer side. No option has been requested to move the header
+% text towards the inner side; therefore do not look for any such
+% keyword. Ineffective is the |stile=classica| option is specified.
+%
+% \Item[nocenterfolio] Normally the folio is typeset centred in the
+% footer; by specifying the option the folio is flushed to the outer
+% side of the footer. Ineffective is the |stile=classica| option is
+% specified. These last three options comply with the |oneside| or
+% |twoside| global class options.
%\end{description}
%
% Since version 6.xx.yy options to the TOPtesi class follow the
% syntax \emph{key${}={}$value}; depending on the kind of thesis
-% there there are some values that are particularly significant;
+% there are some values that are particularly significant;
% the key for all of them is |tipotesi| (\emph{thesis kind});
% the values are indicated hereafter.
%
@@ -844,6 +870,21 @@ School of Turin.
% case, except for few additional packages, the body of the
% TOPtesi functionality is maintained intact.
%
+%\Item[topotesi=frontespizio] By specifying this option the default
+% module |topfront| to typeset the title page is not loaded; in its
+% place the \pack{frontespizio} package is loaded, and the user can
+% directly use this latter package commands. Of course the user must
+% know pretty well ho this particular package works; if not s/he
+% should reat its documentation. Notice: the documentation is written
+% in Italian; probably its author assumed that it would be used only
+% by Italian students; actually the author provided commands to
+% customise the infix words in other languages. Again the author
+% assumed that some Italian students had to typeset their theses in
+% various languages; this is generally true for doctoral theses that
+% are requested in English; but this is true also for Erasmus student
+% who might need to write their theses in the language of the host
+% universities.
+%
% \Item[tipotesi=custom]
% is a very simple option: sets the various internal switches
% so as not to load any internal module or external file.
@@ -865,11 +906,11 @@ School of Turin.
% di Torino, the user is free to follow his/her University
% prescriptions without any constraint by the TOPtesi bundle.
%
-% \item[Attention!] It goes by itself that each one of the last
+% \item[Warning!] It goes without saying that each one of the last
% options does not load the generic module |topfront|, therefore
-% the commands provided by this standard module are not available
+% some commands provided by this standard module are not available
% any more. Every effort has been made in the various modules to
-% maintain the same commands, but in certain thesis kinds they
+% maintain the same commands, but in certain thesis types they
% might behave differently than expected.
%
% The user therefore is strongly urged to consult the documentation
@@ -880,10 +921,10 @@ School of Turin.
% \end{description}
%
% \subsection{Title page commands}
-% Note: Skip this section if you decide to load an external
-% package, such as, for example, |frontespizio|, for typesetting the
-% title~page. Notice also that if you want to load an external
-% package for this task, you should load it \emph{after}
+% Note: Skip this section if you decide to use external package
+% |frontespizio|, or you selected the |tipotesi=custom| option for
+% typesetting the title~page. Notice also that if you want to load
+% an external package for this task, you should load it \emph{after}
% specifying the input encoding you use for your text files.\bigskip
%
% \noindent The user must specify a certain number of commands
@@ -896,14 +937,14 @@ School of Turin.
% repeat his/her name, the name of the institution, and so on?
%
% Many user commands for the title page redefine default
-% values or strings; they are particularly usefull when the thesis is
+% values or strings; they are particularly useful when the thesis is
% typeset in a different language; if none of the required information
% is given, the default values and strings are typeset, possibly
% with hilarious results\dots
%
% Except for the self made customised module for the title-page,
% all the modules accept the same commands as those available in
-% the |TOPfront| module. Pay attention, though, that some commands are
+% the |topfront| module. Pay attention, though, that some commands are
% meaningless in certain theses, therefore do not reverse the
% statement: for example the doctoral cycle command (|\cycle|)
% is meaningless in a bachelor degree final-work title-page.
@@ -930,8 +971,8 @@ School of Turin.
% other ones use mostly the same commands for the same purposes.
%
% \begin{description}[noitemsep]
-% \def\cs#1{\texttt{\char92#1}}
-% \def\Item[#1]{\item[\normalfont\cs{#1}]}
+%^^A \def\cs#1{\texttt{\char92#1}}
+% \def\Item[#1]{\item[\cs{#1}]}
%^^A
% \item[\textnormal{\ttfamily frontespizio}] and
% \texttt{frontespizio*} are two environments that typeset the
@@ -948,29 +989,31 @@ School of Turin.
% according to the actual status of the boolean |\topTPTlogos|;
% the user, before issuing the |\frontespizio| command, may set
% this boolean by means of the |\topTPTlogostrue|
-% or |\topTPTlogosfalse|, or with either one of the commands
+% or |\topTPTlogosfalse|, or with either one of the equivalent commands
% |\booltrue{topTPTlogos}| and |\boolfalse{topTPTlogos}|.\par}
%
-% \Item[monografia] sets the bachelor's report style and retrieves
-% its title; the command\cs{titolo} that is not available for this
-% purpose with the standard module |TOPfront|, is available when
+% \Item[monografia\marg{title}] sets the bachelor's report style and
+% retrieves its title; the command\cs{titolo} that is not available for
+% this purpose with the standard module |TOPfront|, is available when
% the specific module has been loaded by means of the
% \opz{monografia} or \opz{triennale} options.
%
-% \Item[titolo] gets the master or PhD thesis title and an
-% optional thesis short title.
-%
-% \Item[sottotitolo] gets the thesis subtitle if any.
+% \Item[titolo\oarg{shorttitle}\marg{title}] gets the master
+% or PhD thesis title and an optional thesis short title.
%
-% \Item[materia] gets the name of the discipline the thesis deals with.
+% \Item[sottotitolo\marg{subtitle}] gets the thesis subtitle if any.
%
-% \Item[Materia] alias for \cs{materia}.
+% \Item[materia\marg{discipline}] or the alias
+% \cs{Materia}\marg{discipline} get the name of the discipline the
+% thesis deals with.
%
-% \Item[direttore] gets the name of the Doctoral School Director.
+% \Item[direttore\marg{director's name}] gets the name of the
+% Doctoral School Director.
%
-% \Item[coordinatore] gets the name of the Doctoral School
-% Coordinator
-% \Item[QualificaDirettore] gets the phrase that describes the
+% \Item[coordinatore\marg{coordinator's name}] gets the name
+% of the Doctoral School Coordinator
+% \Item[QualificaDirettore\marg{director's function}]
+% gets the phrase that describes the
% director or coordinator official position; by
% using the command \cs{direttore} the default phrase
% “Direttore della Scuola di Dottorato” is printed
@@ -981,30 +1024,36 @@ School of Turin.
% in another language is required, this macro is
% available for specifying such position.
%
-% \Item[relatore] gets the name of the thesis principal supervisor.
+% \Item[relatore\marg{supervisor name}] gets the name of the
+% thesis principal supervisor.
%
-% \Item[secondorelatore] gets the name of the second supervisor,
-% if any.
-% \Item[terzorelatore] gets the name of the third supervisor,
+% \Item[secondorelatore\marg{second supervisor's name}] gets the name
+% of the second supervisor if any.
+% \Item[terzorelatore\marg{third supervisor's name}]
+% gets the name of the third supervisor,
% if any; it is assumed that the number of
% supervisors never exceeds three; in case follow
% one of the tricks exemplified
% in the example file \file{toptesi-example.tex} in
% order to manage such situation.
-% \Item[tutore] gets the name of the doctorate tutor; there is no
+% \Item[tutore\marg{tutor's name}]
+% gets the name of the doctorate tutor; there is no
% difference with regards to the \cs{relatore}, but
% the default phrase “Tutore” is printed above this
% person's name.
-% \Item[TutorName] gets the phrase that describes the tutor
+% \Item[TutorName\marg{tutor's position}]
+% gets the phrase that describes the tutor
% position, possibly in a different language.
-% \Item[AdvisorName] gets the string that qualifies the
+% \Item[AdvisorName\marg{supervisors' formal title}]
+% gets the string that qualifies the
% supervisor(s); the default string
% is “Relatore:” or “Relatori:” for the plural;
% in another language this command is used to
% define the string, say, “Supervisors:” if the
% thesis has been supervised by more than one
% person.
-% \Item[CoAdvisorName] gets the string that qualifies the
+% \Item[CoAdvisorName\marg{co-supervisors' formal title}]
+% gets the string that qualifies the
% co-supervisor(s); the default string is
% “Correlatore:” or “Correlatori:” in the
% plural; this command may be used to define the
@@ -1013,12 +1062,18 @@ School of Turin.
% for setting an Italian singular name when the
% tricks exemplified in file
% \file{toptesi-example.tex} are used.
-% \Item[candidato] gets the name and surname of a male author (M).
-% \Item[candidata] gets the name and surname name of a female author (F).
-% \Item[secondocandidato] gets the name and surname of the second M author.
-% \Item[secondacandidata] gets the name and surname of the second F author.
-% \Item[terzocandidato] gets the name and surname of the third M author.
-% \Item[terzacandidata] gets the name and surname of the third F author;
+% \Item[candidato\marg{candidate' name (man)}]
+% gets the name and surname of an author (M).
+% \Item[candidata\marg{candate's name (woman))}]
+% gets the name and surname name of an author (W).
+% \Item[secondocandidato\marg{second candidate's name (man)}]
+% gets the name and surname of the second M author.
+% \Item[secondacandidata\meta{second candidate's name (woman)}]
+% gets the name and surname of the second W author.
+% \Item[terzocandidato\marg{third candidate's name (man)}]
+% gets the name and surname of the third M author.
+% \Item[terzacandidata\marg{third candidate's name ()woman}]
+% gets the name and surname of the third W author;
% most often the thesis author is just one person;
% but there are some institutions where group final
% works are accepted; it is assumed that the group
@@ -1029,7 +1084,8 @@ School of Turin.
% For different languages there might be no
% difference in gender but there is a difference
% in plural.
-% \Item[CandidateName] gets the string that describes the student
+% \Item[CandidateName\marg{candate's status}]
+% gets the string that describes the student
% status in a foreign
% language or even in Italian; the default string
% is `Candidato:” (with colons) adjusted to
@@ -1038,51 +1094,63 @@ School of Turin.
% “Laureando:”; in other languages it is
% necessary to specify this string in the proper
% gender and number.
-% \Item[sedutadilaurea] gets the date of the final exam, or
+% \Item[sedutadilaurea\marg{thsis defense date}]
+% gets the date of the final exam, or
% presentation, or defence of the thesis; if this
% date is omitted the default date is the current
% month and year in the current language (generally
-% Itallian).
-% \Item[esamedidottorato] an alias for \cs{sedutadilaurea} to be used
+% Italian).
+% \Item[esamedidottorato\marg{Ph.D. defense date}]
+% an alias for \cs{sedutadilaurea} to be used
% for doctoral dissertations.
-% \Item[ciclodidottorato] gets the roman numeral that specifies
+% \Item[ciclodidottorato\marg{cycle}]
+% gets the ordinal numeral that specifies
% the doctoral cycle.
-% \Item[CycleName] redefines the string that expresses the name of
+% \Item[CycleName\marg{cycle name}]
+% redefines the string that expresses the name of
% the doctoral cycle; by default this is “ciclo”
% but this command is useful to set the name in a
% different language.
-% \Item[corsodilaurea] gets the proper name of the degree course;
+% \Item[corsodilaurea\marg{degree course proper name}]
+% gets the proper name of the degree course;
% the phrase that describes the degree course is
% specified, if necessary, with the next command;
% with this one you specify just, say,
-% “Electrical Engineering”.
-% \Item[CorsoDiLaureaIn] gets the generic name of the degree course,
+% “Electrical Engineering”.
+% \Item[CorsoDiLaureaIn\marg{degree course generic name}]
+% gets the generic name of the degree course,
% for example “Bachelor Degree in”.
-% \Item[TesiDiLaurea] gets the generic phrase that describes the
+% \Item[TesiDiLaurea\marg{thesis generic name}]
+% gets the generic phrase that describes the
% thesis; by default it is “Tesi di Laurea”; in
% English one might set it to “Master Thesis”.
-% \Item[NomeMonografia] gets the phrase that describes the
-% bachelor's report; by default it is “Monografia
-% di Laurea”. In some Italian universities
-% it might be called
+% \Item[NomeMonografia\marg{bachelor's report name}]
+% gets the phrase that describes the
+% bachelor's final report; by default this
+% package sets it tois “Monografia di Laurea”.
+% In some Italian universities it might be called
% “Tesi di Laurea”, so that the master thesis
% should be given another qualification, for
% example “Tesi di Laurea Magistrale”.
-% \Item[NomeDissertazione] gets the phrase that describes the
-% doctoral thesis; by default it is “Tesi di
-% Dottorato”.
-% \Item[InName] infix strings often require adjusting of the
-% prepositions; this macro gets the preposition
+% \Item[NomeDissertazione\marg{Ph.D. thesis name}]
+% gets the phrase that describes the
+% doctoral thesis; by default this package sets it to
+% “Tesi di Dottorato”.
+% \Item[InName\marg{‘in’ name}]
+% infix strings often require that their prepositions
+% are adjusted the; this macro gets the preposition
% that stands for “in” (the default). In German
% it might become “auf”.
-% \Item[NomeAnnoAccademico] defines the infix string that stands for
+% \Item[NomeAnnoAccademico\marg{academic year name}]
+% defines the infix string that stands for
% “Academic year”. This macro is defined only if
% the option \opz{classica} is in force;
% after all the command |\annoaccademico| is
% defined only with that option. In any case, even
% without the \opz{classica} option you can use
% any string in the field of \cs{sedutadilaurea}.
-% \Item[logosede] specifies the name of the file or the files that
+% \Item[logosede\marg{logo file name}]
+% specifies the name of the file or the files that
% contain the university logos; no default is
% defined; rather a warning message is issued if
% no name is given or the file is missing, but
@@ -1094,7 +1162,8 @@ School of Turin.
% Erasmus Mundus program. The “string” of
% logos is scaled properly so that they may fit
% in |\textwidth|.
-% \Item[setbindingcorrection] sets up the length to displace the text
+% \Item[setbindingcorrection\marg{binding correction}]
+% sets up the length to displace the text
% block to the external margin so as to have a
% wider internal margin to accommodate the binding
% correction. Its argument is not optional and is
@@ -1102,7 +1171,8 @@ School of Turin.
% Notice that 7\,mm is already a large
% displacement; most often than not the binding
% correction is unnecessary.
-% \Item[retrofrontespizio] with its argument, made up of one or more
+% \Item[retrofrontespizio\marg{copyright page text}]
+% with its argument, made up of one or more
% paragraphs, defines what should be printed on the
% verso of the title page, generally named
% “copyright page”; if this command is specified
@@ -1137,8 +1207,7 @@ School of Turin.
% use of a specific environment within which the following
% commands are available to set up the necessary information.
% \begin{description}[noitemsep]
-% \def\cs#1{\texttt{\char92#1}}
-% \def\Item[#1]{\item[\normalfont\cs{#1}]}
+% \def\Item[#1]{\item[\cs{#1}]}
%
% \item[\normalfont\ttfamily ThesisTitlePage] is the environment
% within which the title page data are specified; some data are
@@ -1152,11 +1221,10 @@ School of Turin.
% may be optional; but personal data are never preset because,
% obviously, they are mandatory.
%
-% \Item[PhDschoolLogo]\marg{logo file name} (preset: Logo-Scudo)
-% selects an image
-% specified by \meta{logo file name} to insert the school logo;
-% a file logo \file{Logo-Scudo.jpg} is available from the ScuDo
-% doctoral school; the students must ask such logo file from
+% \Item[PhDschoolLogo\meta{logo file name}] (preset: Logo-Scudo)
+% selects an image specified with \meta{logo file name} to insert the
+% school logo; a file logo \file{Logo-Scudo.jpg} is available from the
+% ScuDo doctoral school; the students must ask such logo file from
% the Student Office, because such file is a legal property of
% the School and can be used only with permission. In any case
% the logo file must be of one of the allowed formats: \sigla{PDF},
@@ -1164,48 +1232,48 @@ School of Turin.
% preferred, but they might not be available; raster files should
% be of a minimum definition of 150 pixels per inch.
%
-% \Item[Ndissertation]\marg{dissertation name} (preset: Doctoral
+% \Item[Ndissertation\marg{dissertation name}] (preset: Doctoral
% Dissertation) specifies the specific name of the document.
%
-% \Item[Ndoctoralprogram]\marg{doctoral program} (preset: Doctoral
+% \Item[Ndoctoralprogram\marg{doctoral program}] (preset: Doctoral
% Program in) specifies the degree course name prefix.
%
-% \Item[ProgramName]\marg{program name} (mandatory: preset empty)
+% \Item[ProgramName\marg{program name}] (mandatory: preset empty)
% specifies the degree course name.
%
-% \Item[CycleNumber]\meta{ordinal number} (optional; preset
+% \Item[CycleNumber\oarg{ordinal number}] (optional; preset
% empty) specifies the ordinal number of the program cycle; at
% ScuDo it is a mandatory information. In other doctoral schools
% it might be useless.
%
-% \Item[title]\marg{dissertation title} (preset empty) sets the
+% \Item[title\marg{dissertation title}] (preset empty) sets the
% specific title of the dissertation; it is better to keep it
% short, and use the sub title to add further titling information.
%
-% \Item[subtitle]\marg{dissertation subtitle} (optional: preset
-% empty) adds a possible subtitle.
+% \Item[subtitle\marg{dissertation subtitle}] (the whole command with its
+% argument is optional) if used, it adds a subtitle.
%
-% \Item[author]\marg{author's name} (mandatory: preset
+% \Item[author\marg{author's name}] (mandatory: preset
% empty); it is recommended to pay attention to insert proper
% name(s) first and surname(s) second.
%
-% \Item[Nsupervisor]\meta{Supervisor(s) heading} (preset:
-% Supervisor:) specifies the short heading labelling the list
+% \Item[Nsupervisor\meta{Supervisor(s) heading}] (preset:
+% Supervisor:) specifies the short heading to the list
% of supervisors; the preset value is singular and followed by
% a colon. In case of more than one supervisor, it is necessary
% to specify a plural name; the colon sign is optional.
%
-% \Item[SupervisorList]\marg{list of supervisors} (mandatory:
+% \Item[SupervisorList\marg{list of supervisors}] (mandatory:
% preset empty) specifies the list of supervisors, one per line,
% with a |\\| at the end of each line; the name(s) and surname(s)
% are preceded by their academic title, and followed by their
% role as supervisor, or co-supervisor.
%
-% \Item[NExaminationCommittee]\marg{examination committee
-% heading} (preset: Doctoral Examination Committee:) specifies
-% the heading of the list of examiners.
+% \Item[NExaminationCommittee\marg{examination committee
+% heading}] (preset: Doctoral Examination Committee:) specifies
+% the list-of-examiners heading.
%
-% \Item[ExaminerList]\marg{list of examiners} (preset empty)
+% \Item[ExaminerList\marg{list of examiners}] (preset empty)
% specifies the list of examiners, one per line, each line
% terminated by |\\|; each line contains the academic title,
% the name(s) and surname(s), the role (referee for the
@@ -1213,19 +1281,19 @@ School of Turin.
% institution they belong to -- full official institution name,
% city and country.
%
-% \Item[Nlocation]\marg{examination location} (preset:
+% \Item[Nlocation\marg{examination location}] (preset:
% Politecnico di Torino) specifies the institution where the
% examination takes place.
%
-% \Item[ExaminationDate]\marg{examination date} (preset empty)
+% \Item[ExaminationDate\marg{examination date}] (preset empty)
% specifies the date when the examination is to take place.
%
-% \Item[Disclaimer]\marg{disclaimer statement} (preset: some long
-% sentences agreed upon by the ScuDo doctoral school) mandatory
+% \Item[Disclaimer\marg{disclaimer statement}] (preset: some long
+% sentences agreed upon with the ScuDo doctoral school) mandatory
% in most universities; the specific statement(s) may be different
% in different universities.
%
-% \Item[Signature]\marg{the author's signature} (preset: a few
+% \Item[Signature\marg{the author's signature field}] (preset: a few
% lines where the city is preset to “Turin”, and the date is
% assumed to be equal to the examination date; also the signer
% name is assumed equal to that of the dissertation author)
@@ -1244,8 +1312,8 @@ School of Turin.
% package. If the source thesis file is being typeset by means
% of \XeLaTeX\ or \LuaLaTeX\ the \texttt{babel} package is not
% loaded; in its place the \texttt{polyglossia} package gets
-% loaded that should implement in \XeLaTeX\ and \LuaLaTeX\ most of
-% the functionality provided by \texttt{babel} in \LaTeX.
+% loaded; it should implement in \XeLaTeX\ and \LuaLaTeX\ most of
+% the functionality provided by \texttt{babel} in \pdfLaTeX.
% “Most” means that not all the functionality is available,
% therefore it is better to consult the documentation of
% \texttt{polyglossia} before using its built-in commands.
@@ -1333,7 +1401,7 @@ School of Turin.
% \subsection{Bibliography}
% \textcolor{red}{The ScuDo module is the only one that preloads some
% suitable packages to typeset one or more bibliographies. None of the
-% other modules preload any bibliography management utility.} This is due
+% other modules preloads any bibliography management utility.} This is due
% to the fact that the module was originally developed for
% typesetting PhD theses in the scientific domains related to the
% Institute of Electrical and Electronics Engineers (IEEE); such
@@ -1368,7 +1436,7 @@ School of Turin.
%
% The following description specifies these particular commands.
% \begin{description}[noitemsep]
-% \def\Item[#1]{\item[\normalfont\texttt{\char92#1}]}
+% \def\Item[#1]{\item[\cs{#1}]}
%
% \Item[DeclareSlantedCapitalGreekLetters] does exactly what
% its name means: it changes the definitions of the mathematical
@@ -1376,13 +1444,12 @@ School of Turin.
% they are actually taken from the math italic alphabet,
% instead of the default roman one. This command is useful with
% \LaTeX, while with \XeLaTeX\ and \LuaLaTeX\ it is unnecessary
-% due to the larger set of math alphabets and math font commands
+% due to the larger set of glyphs and math font commands
% that are available with proper \sigla{UNICODE} math fonts and
% options.
%
% \Item[ensuremath] should be already defined in the \LaTeX\ kernel;
-% should one still be using an obsolete version, this command gets
-% available anyhow.
+%should you miss it for any reason, thei package provides it.
% %
% \Item[ohm] typesets an upright capital omega even if the
% capital Greek letters are in italics; another good point
@@ -1411,12 +1478,12 @@ School of Turin.
% while avoiding a form such as \verb*+35 \unit{km}+.
% This command, as it is defined, conflicts with the definition
% of the homonymous command |\unit| as defined by some packages such as
-% \texttt{unitx}, \texttt{siunitx}, etc., but since this latter package is
-% necessarily input in the preamble, while \texttt{topcomand.sty}
-% is read at the execution of |\begin{document}|, the latter file has
-% provisions to test if any of those packages has already been loaded,
-% so as not to overwrite the latter package definition and to avoid
-% every possible conflict.
+% \texttt{unitx}, \texttt{siunitx}, etc., but since one of these
+% packages is necessarily input in the preamble, while
+% \texttt{topcomand.sty} is read at the execution of |\begin{document}|,
+% the latter file has provisions to test if any of those packages has
+% already been loaded, so as not to overwrite the latter package
+% definition and to avoid every possible conflict.
% %
% \Item[micro] sets the decimal prefix $\mu$ (providing, if
% possible, the sign with serifs, \textmu, taken from the Text
@@ -1448,18 +1515,18 @@ School of Turin.
% type; since this entity is not a variable, but it is
% a mathematical constant, the \sigla{ISO} regulations require it to
% be typeset in upright type. The \sigla{ISO} regulations require the
-% upright type for “e” and any other mathematical constant,
-% but requires the electron charge $e$ is typeset in math italics because
-% this is a physical “constant”, not a mathematical one.
+% upright type for “e” and any other mathematical constant, but
+% requires that the electron charge $e$ is typeset in math italics
+% because this is a physical “constant”, not a mathematical one.
% \XeTeX\ and \LuaLaTeX\ allow to typeset upright math Greek
% letters, so there is the facility to typeset an upright
% “{\usefont{LGR}{lmr}{m}{rs}p}” (the number) to be distinguished
% from a slanted “$\pi$” (the angle).
% %
-% \Item[goodpagebreak] inserts a conditional page break after
+% \Item[goodpagebreak\oarg{n}] inserts a conditional page break after
% the point where this command appears; it is not equivalent to
% the |\raggedbottom| declaration that does not vertically
-% justify \emph{any} page; this command tests the amount of space
+% justify \emph{any single} page; this command tests the amount of space
% remaining on the page, and if it is less than a given number
% of lines, it inserts a page break; the result is a ragged
% bottom \emph{single} page, that sometimes is better than excessive
@@ -1467,11 +1534,11 @@ School of Turin.
% before or after displayed material. It is handy also to use
% before starting a new section, because at least four
% lines are required by \LaTeX\ in order to avoid orphan lines.
-% \cs{goodpagebreak} accepts an optional argument that sets the
+% \cs{goodpagebreak} accepts an optional argument\meta{n} that sets the
% number of lines to test the necessary space for a break;
% by default this number is~4.
%
-% \Item[listing] requires for its argument the name of a file
+% \Item[listing\meta{filename}] requires for its argument the name of a file
% and typesets it in verbatim mode; this command is very useful
% for typesetting the listings of the programs that were written
% for the thesis; for best results it is recommended that the
@@ -1485,7 +1552,7 @@ School of Turin.
% specified in the |fancyvrb| documentation for the original
% command. The |fancyvrb| package was preferred to the |listings|
% one, because it typesets verbatim material even while
-% using font with multibyte encoding (therefore it works fine
+% using font with multibyte encoded characters (therefore it works fine
% with \XeLaTeX\ and \LuaLaTeX), while the fancier package
% |listings| performs correctly only with \sigla{ascii}
% characters and requires special settings to use selected characters
@@ -1523,7 +1590,7 @@ School of Turin.
% the due differences, this environment mimics the one defined
% in the |toptesi-scudo| module.
%
-% The commands contained in this module are divided in there sorts.
+% The commands contained in this module are divided in three sorts.
% \begin{enumerate}[noitemsep]
% \item
% The commands to define the infix words, so as to use them
@@ -1531,7 +1598,7 @@ School of Turin.
% within a configuration file either to change the default
% strings or to define them for languages different from
% Italian; no attempt was made to establish such strings
-% for English, because is is supposed the most often than
+% for English, because is is supposed that most often than
% not this module is used by Italian students to write their
% bachelor degree final works in Italian universities;
% nevertheless the possibility to change these strings is
@@ -1569,7 +1636,7 @@ School of Turin.
%
% If a configuration file was loaded, the commands it contains
% are overwritten by those that are specified within the
-% |ThesisTitlePage| environment. So the user should pay attention
+% |ThesisTitlePage| environment body. So the user should pay attention
% to what the configuration file contains and to what s/he writes
% within the |ThesisTilePage| environment, but if s/he uses again
% a command already used in the configuration file, it should be
@@ -1586,7 +1653,7 @@ School of Turin.
% \begin{description}[noitemsep]
%\def\Item[#1]{\item[\opz{#1}]}
%
-% \Item[evenboxes] The boxe containing the supervisor name(s)
+% \Item[evenboxes] The box containing the supervisor name(s)
% and that containing the candidate name(s) are typeset by
% aligning their first lines; if this option is not specified
% the boxes are skewed, so that there is enough place to set
@@ -1628,7 +1695,7 @@ School of Turin.
% command. In other words if this module is used, the user must
% use the |ThesisTitlePage| environment only and does not have
% available the various title page environments and commands
-% available with the |topfont| package.
+% available with the |topfront| package.
%
% This environment accepts an optional asterisk as an argument;
% the syntax is the following:
@@ -1649,62 +1716,68 @@ School of Turin.
% The commands available with this module, divided into the three
% groups described above, are the following.
% \begin{description}[noitemsep]
-% \def\Item[#1]{\item[\normalfont\cs{#1}]}
+% \def\Item[#1]{\item[\cs{#1}]}
% \item[String settings]
% \begin{description}[noitemsep]
-% \Item[NomeAnnoAccademico] Sets the default string for the
-% “Academic Year”; by default it is “Anno accademico”.
-% \Item[NomeCorso] sets the default string “Corso di laurea
-% in” followed by an intelligent space.
-% \Item[AnnoAccademico] sets a different string in place
-% of the default “Anno Accademico” one.
-% \Item[Struttura di] sets the default structure prefix;
-% for example this prefix might be “Department of”,
-% and the structure name entered with \cs{struttura}
+% \Item[NomeAnnoAccademico\marg{academicyear string}]
+% Sets the default string for the
+% “Academic Year”; by default it is “Anno accademico”.
+% \Item[NomeCorso\marg{Degree course name}] sets the default string
+% “Corso di laurea in” followed by an intelligent space |\xspace|.
+% \Item[AnnoAccademico\marg{substitute string for academic year}]
+% Sets a different string in place of the default “Anno Accademico”
+% one.
+% \Item[Struttura di\marg{structure prefix}] sets the default
+% structure prefix; for example, this prefix might be “Department of”,
+% while the structure name entered with \cs{struttura}
% might be “Electrical Engineering”; therefore the
% title page is typeset with the complete string
-% “Department of “Electrical Engineering”. The default
+% “Department of “Electrical Engineering”. The default
% string is in Italian, but by using this command,
% remember to enter the string you need terminated by
% the intelligent space macro \cs{xspace}.
-% \Item[CorsoDiStudi] sets the default string for the
-% degree course type; it might be “Laurea triennale”,
+% \Item[CorsoDiStudi\marg{degree course name}] sets the default
+% string for the degree course type; it might be “Laurea triennale”,
% or “Bachelor degree” or similar strings in other
-% languages. It replaces the obsolete following command:
-% \Item[CorsoDiLaureaIn] that remains available with the backwards
-% compatible |topfront| standard module.
-% \Item[NomeElaborato] Sets the name that qualifies the
+% languages. It replaces the \emph{obsolete} following command:
+% \Item[CorsoDiLaureaIn\marg{degree course name}]
+% Remains available to be backwards compatible with
+% |topfront| standard module command; its use is \emph{discouraged}.
+% \Item[NomeElaborato\marg{thesis name}]
+% Sets the name that qualifies the
% document; by default it is “Monografia”, but this
% user command may be used to set it, for example, to
% “Tesi di laurea triennale”, or anything else in
% Italian, in English, or the used main language.
% The |topfront| command |\NomeMonografia| is let to
% to |\NomeElaborato| for backwards compatibility and its
-% use is evidently discouraged.
-% \Item[CandidateNames] sets the labelling command for the
-% box that lists the candidate names; by default these names are the
+% use is evidently \emph{discouraged}.
+% \Item[CandidateNames\marg{candidate list headings}]
+% Sets the labelling command for the
+% list of the candidate names; by default these names are the
% masculine, feminine, singular and plural Italian names
% starting with “Candidato”; if the \opz{classica} option
% is in force they start with “Laureando”;
-% the user couldn use this command which it has a non standard syntax
+% the user could use this command which has a non standard syntax
% (delimited arguments); therefore it is suggested that
% end users refrain from using it, unless they know how to handle
% the delimited argument commands.
% This command sets the four strings to any desired value,
% if, as in English, there is no difference between masculine
-% and feminine, repeat the same name for the feminine positions,
+% and feminine, repeat the same names for the feminine positions,
% the last ones; the syntax in facts is the following:
%\begin{ttsintassi}
-%\cs{CandidateNames},\%
+%\cs{CandidateNames}\%
%\qquad\marg{masculine singular},\%
%\qquad\marg{masculine plural},\%
%\qquad\marg{feminine singular},\%
%\qquad\marg{feminine plural},!
%\end{ttsintassi}
-% \Item[TitoloListaCandidati] is a much simpler command the user
-% should prefer to the previous one; in facts it accepts a single
-% argument formed by a comma separated list of names; from zero
-% up to four names (in the same order as described above).
+% \Item[TitoloListaCandidati\marg{candidate list headings}]
+% is a much simpler command the user should prefer to the
+% previous one; in facts it accepts a single argument formed
+% by a comma separated list of names; from zero up to four names
+% (in the same order as described above).
% Therefore the following commands are all valid ones:
%\begin{ttsintassi}\small%
%\cs{TitoloListaCandidati}\Marg{}
@@ -1712,63 +1785,68 @@ School of Turin.
%\cs{TitoloListaCandidati}\Marg{Estudiante,Estudiantes}
%\cs{TitoloListaCandidati}\Marg{Kandidat,Kandidaten,Kandidatin,Kandidatinen}
%\end{ttsintassi}
-% \Item[CandidateName] this command used to be the default one
+% \Item[CandidateName\marg{candidate list heading}]
+% This command used to be the default one
% with the standard |topfront| module, and remains available
-% with this package; it sets just one name (disregarding
-% singular/plural and masculine/feminine variants) to substitute
+% with this package; it sets just one name to substitute
% the default ones. Please notice that this command is not
% available with the other thesis type options.
-% \Item[Relatore] Sets the string that labels
-% the supervisor box; by default it is the Italian
-% name “Relatore”; the command my be used to set
+% \Item[Relatore\marg{advisor list heading}]
+% Sets the string that labels the supervisor box; by default
+% it is the Italian name “Relatore”; the command may be used to set
% any different string.
-% \Item[Correlatore] sets the string that
-% labels the list of co-superpervisors when there is
-% just one “second” supervisor.
-% \Item[Correlatori] sets the string that
-% labels the list of co-supervisors when there are
-% three supervisors, a supervisor and two co-supervisors.
+% \Item[Correlatore\marg{co-advisor list heading}]
+% Sets the string that labels the list of co-superpervisor when
+% there is just one “second” supervisor; in facts, with just one
+% co-supervisor the heading it the singular name “Correlatore”.
+% \Item[Correlatori\marg{co-advisor list heading}]
+% Sets the heading of the list of co-supervisors when there are
+% a supervisor and two co-supervisors.
% \end{description}
% \item[Variable data settings]
% \begin{description}[noitemsep]
-% \Item[titolo] sets the bachelor degree final work title.
+% \Item[titolo\marg{title}]
+% Sets the bachelor degree final work title.
% The main module |topfront| uses in its place the command
% \cs{monografia}; the user can still use the old command,
% but |\titolo| is more descriptive.
-% \Item[sottotitolo] sets the optional subtitle.
+% \Item[sottotitolo\marg{subtitle}] Sets an optional subtitle.
% \Item[corsodistudi] and \cs{corsodilaurea} specify the actual
% name of the degree course; \cs{corsodistudi} should be
-% preferred; \cs{corsodilaurea} is deprecated, but is maintained
-% for backwards compatibility.
-% \Item[materia] and \cs{Materia} set the optional discipline
-% the thesis deals with.
-% \Item[relatore] sets the name of the only or the principal
-% supervisor.
-% \Item[secondorelatore] sets the name of a second supervisor,
-% if any.
-% \Item[terzorelatore] sets the name of a third supervisor,
-% if any.
-% \Item[candidato] sets the name of the first or only ‘M’
-% candidate; in general bachelor degree final works are
-% done by just one candidate but, in case, there are
+% preferred; \cs{corsodilaurea} is \emph{deprecated}, but is
+% maintained for backwards compatibility.
+% \Item[materia\marg{discipline}] and \cs{Materia}\marg{discipline}
+% set the optional discipline the thesis deals with.
+% \Item[relatore\marg{advisor's name}] sets the name of the only
+% or the principal supervisor.
+% \Item[secondorelatore\marg{second advisor's name}] sets the
+% name of a second supervisor, if any.
+% \Item[terzorelatore\marg{third advisor name}] sets the name of
+% a third supervisor, if any.
+% \Item[candidato\marg{candidate name (man)}] sets the name of the
+% first or only ‘M’ candidate; in general bachelor degree final
+% works are done by just one candidate but, in case, there are
% available also the commands for a second and a third
% candidate. Masculine and feminine commands are available
-% and the heading of the candidates box il labelled accordingly.
-% \Item[candidata] sets the name of the first or only ‘F’
-% candidate.
-% \item[\normalfont\cs{secondocandidato} or \cs{secondacanddata}]
-% set the names of a possible second ‘M’ or ‘F’ candidate.
-% \item[\normalfont\cs{terzocandidato} or \cs{terzacandidata}]
-% set the names of a possible ‘M’ or ‘F’ third candidate.
-% \Item[ID] to be used just after the candidate's name, but as
-% part of the setting command argument, establishes the
+% and the heading of the candidates list is labelled accordingly.
+% \Item[candidata\marg{candidate name (woman)}] sets the name of the
+% first or only ‘W’ candidate.
+% \Item[secondocandidato\marg{second M candidate}] or
+% \cs{secondacanddata}\marg{second W candidate}
+% set the name for a possible second ‘M’ or ‘W’ candidate.
+% \Item[terzocandidato\marg{third M candidate}] or
+% \cs{terzacandidata}\marg{third W can\-didate}
+% set the name for a possible ‘M’ or ‘W’ third candidate.
+% \Item[ID\marg{ID code}] to be used just after the candidate's name,
+% but as part of the setting command argument, establishes the
% candidate's ID label string |\IDlabel| that prefixes the
% candidate's ID number. The user should not worry about this string,
% unless s/he wants to modify it; by default it is set to
-% |\\\quad matricola\ |; in other words, the ID number is set
+% \verb+\\\quad matricola\ +; in other words, the ID number is set
% indented under the candidate's name and a space is put between
% the string and the number.
-% \Item[sedutadilaurea] sets the date of the final examination;
+% \Item[sedutadilaurea\marg{examination date}]
+% sets the date of the final examination;
% by default the current month and year are typeset if this
% command is not specified; but the user can specify anything;
% s/he can even prefix the year range with the
@@ -1777,22 +1855,25 @@ School of Turin.
% suitable command of group~1) a string equivalent to
% “Academic Year”; in any case the user can write down what
% s/he likes best in place of the predefined value.
-% \Item[NomeAteneo] sets the proper name of a specific
-% university; it will be typeset in suitable uppercase type
-% under the generic name of the university; if this command
-% is not used, no name gets typeset in the title page.
-% \Item[struttura] sets the name of the university entity
+% \Item[NomeAteneo\marg{University name}]
+% sets the proper name of a specific university; it will be
+% typeset in suitable uppercase type under the generic name of the
+% university; if this command is not used, no name gets typeset
+% in the title page.
+% \Item[struttura\oarg{ordinal number}\marg{Structure name}]
+% sets the name of the university entity
% that supervises the development of the degree course;
% it may be a “faculty”, a “department”, a “school”,
% it depends from the specific university. Some universities
% do not require this information on the title page. In any
% case if this command is used it accepts two arguments:
% the first one is optional, and, if used, is an uppercase
-% roman numeral that indicates the ordinal of the structure;
+% roman ordinal numeral that distinguishes the structure;
% the second argument is the complete structure name.
-% \Item[setlogodistance] sets the distance between adjacent
-% university logos, if more then one is used.
-% \Item[logosede] sets the name of a graphics file that
+% \Item[setlogodistance\marg{distance}] sets the distance between
+% adjacent university logos, if more than one are used.
+% \Item[logosede\oarg{height}\marg{logo file name}]
+% sets the name of a graphics file that
% contains the logo of the university; the default value of
% this command il \cs{empty}; this macro may be used several
% times, in case the bachelor degree final work is developed
@@ -1811,22 +1892,21 @@ School of Turin.
% it is suggested not to vary it too much. The \cs{logosede}
% accepts an optional value that is the common height of the
% logos; this possibility does exist but it is strongly
-% discouraged.
-% \Item[tutoreaziendale] set the name of a possible company
-% tutor, in case the final work is developed in a Company
-% external to the university
+% \emph{discouraged}.
+% \Item[tutoreaziendale\marg{company tutor name}]
+% set the name of a possible company tutor, in case the final
+% work is developed in a Company external to the university
% \end{description}
% \end{description}
%
% \section{The module for a master degree thesis}
%\label{sec:topmagistrale}
%
-% The module for the master degree thesis,
-% |toptesi-magistrale.sty| is almost identical to the generic
-% module |topfront|; the obvious differences are that it
-% lacks the latter module commands that refer to the bachelor
-% degree or the Ph.D.~theses. Evidently such specific commands
-% are useless in a master degree thesis.
+% The module for the master degree thesis, |toptesi-magistrale.sty|
+% is almost identical to the generic module |topfront|; the obvious
+% differences are that it lacks the latter module commands that refer
+% to the bachelor degree or the Ph.D.~theses. Evidently such specific
+% commands are useless in a master degree thesis.
%
% \begin{sloppypar}
% Such eliminated commands include |\manografia|,
@@ -1843,7 +1923,7 @@ School of Turin.
% of the |\tomo| command that requires a preliminary
% specification of all the necessary data before |\tomo|
% can play its role; it actually uses the |\frontespizio|
-% environmnet, but before the |tomo| counter is stepped up.
+% environment, but before the |tomo| counter is stepped up.
%
% This allows to typeset the various tomes in a single
% document, so that the user can cross-reference elements
@@ -1858,7 +1938,7 @@ School of Turin.
% the cross-linked navigation from one point to another.
%
% The draw back of this procedure is that splitting the
-% single \sigla{PDf} file in several files require another processing
+% single \sigla{PDf} file in several files requires another processing
% job, and any editing of the source thesis files may require
% repeating this splitting job because the number of pages
% may be modified and/or cross references do not point
@@ -1876,10 +1956,10 @@ School of Turin.
% files; when printed they are substantially identical to
% the split documents obtained with the previous approach
% but it simply avoids splitting the single document file
-% in several files. The drawback is thet if hyperlinked cross-referencing
+% in several files. The drawback is that if hyperlinked cross-referencing
% is used, each tome is correctly hyperlinked to its
-% internal targets, but no cross-referencing can be
-% automatically done to items in other tomes. I do not
+% internal targets, but no cross-referencing can
+% automatically be done to items in other tomes. I do not
% think this is a real draw back in practical situations,
% but of course it produces a limitation to reading the
% tomes on the screen.
@@ -1902,7 +1982,7 @@ School of Turin.
% definition of the |\tomo| command; adds the |ThesisTitlePage|
% environment within which the configuration file is read and where all
% commands for the title page data are to be inserted. The
-% peculiarity of thes environment is that the possible asterisk
+% peculiarity of this environment is that the possible asterisk
% necessary to switch from the the logos set in the title page
% lower half (no asterisk) to the logos at the page top
% (asterisk) must be inserted the same way as in the other
@@ -1910,6 +1990,7 @@ School of Turin.
% the environment.
%
% \section{The Ph.D.\ module for general use}
+%
% Except for the ScuDo theses, for which the University
% specified the necessary requirements for both contents
% and appearance of the title page, we provide a generic
@@ -1950,9 +2031,10 @@ School of Turin.
% his/her custom title page and would not use this module at all.
%
% \section{The custom module for the title-page}\label{sec:custom}
+%
% The construction of the customised title page module is the full
% responsibility of the user.
-% In facts the user, beyond specifying the |tipotesi=custom|
+% In facts the user, beyond specifying the |tipotesi=custom| option
% to the |toptesi| class class, at the beginning of the
% document explicitly inputs a personal package file, say
% |mycustomfile.sty| by means of the simple
@@ -1976,7 +2058,7 @@ School of Turin.
% a custom title page.
%
% We don't go further in describing the |tipotesi=custom| option,
-% except remembering the this option just inhibits loading both
+% except remembering that this option just inhibits loading both
% the standard default module, and any other predefined module, unless the
% user directly loads one with or without the specific module options.
%
@@ -1984,7 +2066,7 @@ School of Turin.
%
% The suffix |sss| is the acronym for the Italian name of
% “High School”, \emph{Scuola Secondaria Superiore}.
-% Elegance of bureaucratic language; the elementary school
+% Elegance of bureaucratic language: the elementary school
% now is `Scuola Primaria', and junior high school is `Scuola
% Secondaria Inferiore'. As well as it was in Germany and
% in some Swiss Cantons, the total number of school years
@@ -2047,7 +2129,7 @@ School of Turin.
%
% Of course their title page must be very different from those
% suitable for university theses, therefore a special module is
-% necessary, and I decided to to add such a module to this bundle.
+% necessary, and we decided to to add such a module to this bundle.
%
% Actually high school students require less information on the
% title page; the school generic and proper names, obviously the
@@ -2117,7 +2199,7 @@ School of Turin.
% Service packages such as |xparse|, |xspace|, and |xcolor|
% are already loaded for the benefit of this bundle and this
% module, but the user is free to use their functionalities,
-% mostly those of |xcolor|.
+% in particular those of |xcolor|.
%\item
% Packages |calc| and |ifthen| are functional for the module;
% supposedly the end users should not have any necessity to use
@@ -2163,135 +2245,90 @@ School of Turin.
% saved in the same folder.
%
% The title page commands are the following:
-%\begin{description}\def\Item[#1]{\item[\normalfont\cs{#1}]}
-%\Item[SSSLogo]
+%\begin{description}\def\Item[#1]{\item[\cs{#1}]}
+%\Item[SSSLogo\marg{school logo file name}]
% is used to define the name of the graphic file containing
% the high school logo; not necessarily the school allows to
% use its logo; in any case if such command is not used, the
-% logo information is ignored. The syntax is
-% \begin{ttsintassi}
-% \cs{SSSLogo}\marg{file name}
-% \end{ttsintassi}
+% logo information is ignored.
% Remember that the graphic file must have one of these
% extensions: |.pdf|, |.eps|, |.png|, or |.jpg|; the first
% two may contains vector images and give the best results;
% the second two are bitmapped, therefore their rendering
% depends very much on the pixel density of the file contents.
-%\Item[NomeTesina] sets the name of the document; the default value
-% is “Tesina di maturità”. Syntax:
-% \begin{ttsintassi}
-% \cs{NomeTesina}\marg{nome dell'elaborato}
-% \end{ttsintassi}
-%\Item[NomeCandidato]
-% is used to set the label to typeset over the author's name;
-% default “Studente” or “Studentessa” depending on the
-% state of the boolean switch |femminile|, but if this command
-% is used for the user tesina, s/he needs not to specify any
-% switch and uses the only name necessary for his/her document.
-% Syntax:
-% \begin{ttsintassi}
-% \cs{NomeCandidato}{examinand label}
-% \end{ttsintassi}
-% This command might be used to set the label with a different
+%\Item[NomeTesina\marg{document name}]
+% sets the name of the document; the default value
+% is “Tesina di maturità”.
+%\Item[NomeCandidato\marg{heading over the candidate name}]
+% is used to set the heading over the author's name; since
+% the “tesina” is individual, the default value is
+% “Studente” or “Studentessa” depending on his/her gender.
+% See below the \cs{studente} and \cs{studentessa} command descriptions.
+% This command might be used also to set the heading with a different
% name in the correct gender.
-%\Item[IndirizzoMiur]
+%\Item[IndirizzoMiur\marg{Ministry of Education special address}]
% sets the Ministry of Education special address. If this
% command is omitted, this address, considered optional,
-% is neglected. Syntax:
-% \begin{ttsintassi}
-% \cs{IndirizzoMiur}\marg{Ministry of Education special address}
-% \end{ttsintassi}
-%\Item[OpzioneMiur]
+% is neglected.
+%\Item[OpzioneMiur\marg{Ministry of Education option}]
% sets the specification that distinguishes the school
-% mission, if any. Syntax:
-% \begin{ttsintassi}
-% \cs{OpzioneMiur}\marg{Ministry of Education option}
-% \end{ttsintassi}
-%\Item[TipoScuola]
+% mission, if any.
+%\Item[TipoScuola\marg{generic school name}]
% sets the specific generic name of the school; default
% none; therefore use of this commands is mandatory;
% the user might specify “Liceo classico”, or “Istituto
% tecnico industriale di stato”, or whatever applies for
-% the students' specific school. Syntax:
-% \begin{ttsintassi}
-% \cs{TipoScuola}\marg{generic school name}
-% \end{ttsintassi}
-%\Item[NomeScuola]
+% the students' specific school.
+%\Item[NomeScuola\marg{specific school name}]
% sets the specific name of the school; generally schools
% are dedicated to famous scientists or heroes, or presidents,
% or kings/queens, or writers, et cetera; default “empty”.
-% Syntax:
-% \begin{ttsintassi}
-% \cs{NomeScuola}\marg{specific school name}
-% \end{ttsintassi}
-%\Item[SedeScuola]
+%\Item[SedeScuola\marg{school address}]
% sets the actual location of the school; it may be just the
% city or a full postal address; it may contain new line
% commands in order to format a full address of several lines;
-% no default. Syntax:
-% \begin{ttsintassi}
-% \cs{SedeScuola}\marg{the school basic or full address}
-% \end{ttsintassi}
-%\Item[AnnoScolastico]
+% no default.
+%\Item[AnnoScolastico\marg{school year}]
% sets the school year at the end of which the state
-% examination is undertaken; no default. Syntax:
-% \begin{ttsintassi}
-% \cs{AnnoScolastico}\marg{school year}
-% \end{ttsintassi}
-%\Item[titolo]
+% examination is undertaken; no default.
+%\Item[titolo\marg{document main title}]
% sets the title of the document; please don't use long titles;
% if a short sentence is not descriptive enough, use the
% |\sottotitolo| argument to add specifications to the title;
-% no default. Syntax:
-% \begin{ttsintassi}
-% \cs{titolo}\marg{main title}
-% \end{ttsintassi}
-%\Item[sottotitolo]
+% no default.
+%\Item[sottotitolo\marg{document substitle}]
% sets an optional subtitle; if this command is not used
-% the subtitle field is ignored; no default. Syntax:
-% \begin{ttsintassi}
-% \cs{sottotitolo}\marg{optional subtitle}
-% \end{ttsintassi}
+% the subtitle field is ignored; no default.
% The subtitle, if any, is typeset in a normal sized font,
% therefore it can be several lines long; nevertheless pay
% attention to use the tie command |~| to connect with an
% unbreakable space to the following ones such words as
% prepositions, articles, short adverbs, and such similar
% items.
-%\Item[studente] or \cs{studentessa}, depending on the gender
+%\Item[studente\marg{student name (Man)}] or
+% \cs{studentessa}\marg{student name {Woman}}, depending on the gender
% of the student, sets the name of the author of the
% document, i.e.\ the name of the student undergoing the
-% examination; no default. Syntax:
-% \begin{ttsintassi}
-% \cs{studente}\marg{proper name(s) followed by the surname(s)}
-% \cs{studentessa}\marg{proper name(s) followed by the surname(s)}
-% \end{ttsintassi}
-% Remember: \textbf{never ever use the surname(s) before
-% the name(s)}.
+% examination; no default.
+% Remember: \textbf{never ever use the surname(s) before the name(s)}.
% If the \cs{NomeCandidato} macro has not been used, these commands
% set the proper status to the |femminile| switch, so that the
-% proper default label is used.
-%\Item[Presidente]
+% proper default heading is used.
+%\Item[Presidente\marg{chairperson name}]
% sets the name of the chairperson of the examining committee;
-% no default. Syntax:
-% \begin{ttsintassi}
-% \cs{Presidente}\marg{examining committee chairperson full name}
-% \end{ttsintassi}
+% no default.
% Again remember to write the necessary academic titles
-% in lowercase, end the name(s) before the surname(s).
-%\Item[NumeroCommissione]
-% sets the examining committee ID number; no default.Syntax:
-% \begin{ttsintassi}
-% \cs{NumeroCommissione}\marg{Examing committee ID number}
-% \end{ttsintassi}
+% in lowercase, and the name(s) before the surname(s).
+%\Item[NumeroCommissione\marg{Examining committee ID number}]
+% sets the examining committee ID number; no default.
%\end{description}
%
% The actual title page is created within the environment
% |FrontespizioTesina|. This environment first reads a the
% configuration file if one exists, then it analyses the
-% commands possibly set within the environment by the author,
+% commands set within the environment by the author,
% possibly superseding the information read from the
-% configuration file; the closing commands actually typeset
+% configuration file; the environment closing command actually typesets
% the title page; the schematic working is the following:
%\begin{flushleft}\ttfamily\obeylines
%\Bambiente{FrontespizioTesina} \% reads the config.\ file if any
@@ -2304,7 +2341,7 @@ School of Turin.
% up the text grid in a sensible way. No doubt some users may
% complain that the title page does not allow to do this or
% that; that the spacings should be different from what they
-% actually are.
+% actually are; and so on.
%
% There are work-arounds to these complains.
%\begin{enumerate}[noitemsep]
@@ -2349,10 +2386,10 @@ School of Turin.
% this regulation have been published. This regulation defines
% a \sigla{PDF} variant suitable for archiving, named \sigla{PDF/A}, that
% has two sub-formats distinguished as \sigla{PDF/A}-1a, and
-% \sigla{PDF/A}-1b.
+% \sigla{PDF/A}-1b, \sigla{PDF/A-2a}, \sigla{PDF/A-2b}. and so on.
% The `a' sub-format is more exacting, while the `b' one is less
% stringent. In spite of the recently published upgrades,
-% here we stick to the older ones, that are a sub set of the
+% here we stick to the PFD/A-b and PDF/A-2b, that are a sub set of the
% newer ones, and for which suitable software is available.
%
% The requirements for the `a' sub-format imply not only those
@@ -2360,7 +2397,7 @@ School of Turin.
% of the document be accessible from outside (Tagged \sigla{PDF}).
% The requirements for the `b' sub-format are that the
% document must be reproducible without modifications exactly
-% as it was at the moment of archiving. Both sub-formats must
+% as it was at the moment of archiving. All sub-formats must
% contain \emph{metadata} that are searchable even without
% decompressing the normally compressed \sigla{PDF} file, and that
% contain information useful for archive maintenance; among
@@ -2373,16 +2410,18 @@ School of Turin.
% of producing \sigla{PDF/A}-1b compliant files, provided that some
% attention is put into editing of the thesis source file. Since the
% year 2008 the \TeX\ system, the executable \texttt{pdflatex} has
-% version number 1.40.9 (or higher); therefore today there should not
-% be any difficulty in producing \sigla{pdf/a} compliant documents.
+% version number 1.40.9 (or higher); therefore today there is no
+% difficulty in producing \sigla{pdf/a} compliant documents, even at
+% level~2.
%
% The particular attention needed to avoid problems with the
% \sigla{PDF/A} compliance is summarised as follows:
% \begin{enumerate}[noitemsep]
% \item
% The preliminary essential requirement is that the
-% \texttt{pdflatex} engine used to typeset the thesis be
-% sufficiently recent to support the \sigla{PDF/A} requirements.
+% \texttt{pdflatex} or \texttt{lualatex} engine used
+% to typeset the thesis be sufficiently recent to support
+% the \sigla{PDF/A} requirements.
% It's better to have the most recent distribution of
% the \TeX\ system installed on your PC. Do not try to
% typeset the thesis with the `old' \prog{latex}; you
@@ -2415,21 +2454,8 @@ School of Turin.
% contain the package \textsf{pdfx}; if it does not,
% upgrade your \TeX\ system complete distribution. Be sure
% that the version number of the \pack{pdfx} package has
-% version number~1.5.8 or higher.
+% version number~1.6.0 or higher.
%
-% \item
-% In the 2018 version of \TeXLive, with the upgrade of |pdfx|
-% a glitch emerged due to licence questions; the |sRGB.icc| distributed
-% with earlier versions was under a limited licence that is not
-% compliant with the free nature of the \TeX\ system. The maintainers
-% are aware of this problem and, while they are further upgrading the
-% \pack{pdfx} file, they suggest a work-around (that will be described
-% below); it is possible that when you read this documentations the
-% work-around, described below, is not necessary any more.
-% With version 1.61 of \pack{pdfx} the problem is solved even if one uses
-% a \TeXLive\ installation prior to the one distributed in the year 2018.
-% In any case the most recent version 1.61 or higher of |pdfx| is
-% necessary.
%
% \item
% If your thesis main file, the one you run your typesetting
@@ -2447,40 +2473,31 @@ School of Turin.
% The keyword list requires a specific format that can be
% examined in the |pdfx| package documentation. The best way to
% be sure that this file accompanies the thesis main file,
-% is to put its contents in a \env{filecontents*} environment.
+% is to put its contents inside a \env{filecontents*} environment.
% The details are in the documentation of the \pack{pdfx} package and
% examples are shown in the Italian documentation of |TOPtesi|.
-% In order to override the constraints of the \LaTeX\ kernel
-% |filecontents| environment, TOPtesi loads the package |filecontents|
-% that eliminates the mentioned constraints, but requires that the
-% environment be used within the preamble, in any case before
+% The environment may used within the preamble, in any case before
% loading the |pdfx| package. Actually this does not forbid to use the
% environment before the |\documentclass| statement, as it was in the
-% previous versions of TOPtesi. The new version is backwards compatible
-% with the previous ones with this simple difference: when the environment
-% is used before the |\documentclass| statement, any modification of
-% its contents does not take place unless the previous |xmpdata| file
-% is deleted, because the kernel environment does not overwrite existing
-% files; on the opposite, if the environment is used after the
-% |\documentclass| statement ,the |xmpdata| file is simply overwritten
-% without the need to delete a previous version.
-%
-% The work-around mentioned above consists in adding another line
-% at the very end of the metadata file; it looks like this:
-%\begin{verbatim}
-%\setRGBcolorprofile{sRGB.icc}{sRGB}{Argyll CMS, sRGB color profile}%
-%{https://www.argyllcms.com/}
-%\end{verbatim}
-% Thanks to the new |filecontents| functionalities there is no need
-% to delete a previous |.xmpdata| file. But, as specified above, this
-% work-around is not necessary anymore if the most recent version 1.6.1
-% or later of \pack{pdfx} is used; this work-around information is
-% maintained in this documentation just for backwards compatibility.
-%
-% This work-around is required if you get an error message that
-% refers to line 1084 of the |pdfx.sty| file; if you don't patch
-% the metadata file and you do not get the above error, it means
-% that the |pdfx| package has already been corrected.
+% previous versions of TOPtesi. The new version of environment
+% \env{filecontents} is backwards compatible with the previous
+% ones with this “simple” difference: it accepts some options
+% the most important of which are \opz{overwrite} and \opz{noheader};
+% the latter avoids inserting header comment lines into the saved
+% file, while the former allows overwriting it at each
+% compilation. Omitting \opz{overwrite} the environment does not
+% overwrite an existing |.xmpdata| file; so that if some modification
+% has been made to the source lines within the environment, such
+% modifications do not get saved in the metadata file. \textcolor{red}{Such
+% behaviour of the |filecontents| environment was introduced by the
+% end of 2019; therefore if you are using the options but have a
+% vintage version of the \TeX system you get errors. You are warned:
+% never use vintage versions of the \TeX system, but be careful to
+% maintain your (complete) installation up to date}. To avoid this
+% situation and be totally transparent with respect to the date of
+% the \LaTeX kernel date, we introduce a new environment named
+% \env{pdfxmetadata} that performs the necessary controls and hides
+% such differences to the user.
%
% \item
% Some mathematical symbol commands obtained from the standard
@@ -2488,30 +2505,31 @@ School of Turin.
% some patching that is already included in this \texttt{TOPtesi}
% bundle; but it is not excluded that with other fonts similar
% patches might be requested. The \sigla{UNICODE} math fonts used
-% by \XeLaTeX\ and \LuaLaTeX\ do not require any patch.
+% by \XeLaTeX\ and \LuaLaTeX\ do not require any patch. If you seek
+% conformance with level~2, this patch is not needed.
%
% \item
% Use only \sigla{PNG} and \sigla{JPG} images with \sigla{RGB} color
% profiles. But if a \sigla{PNG} image file contains some transparencies,
% the document \sigla{PDF} cannot be validated as \sigla{PDF/A}-1b
-% compliant.
+% compliant, but it can with \sigla{pdf/a-2b}.
%
% \item
% If you include \sigla{PDF} images that contain some text, be sure
% that the fonts for this text are completely embedded in
-% the included files. Should the \sigla{PDF} files come from an external
-% drawing program be sure to configure that program so that
+% the included files. Should the \sigla{PDF} files come from external
+% drawing programs, be sure to configure that program so that
% it embeds all the fonts used in each image. If you don't
% succeed, open the \sigla{PDF} file with the free software
% \texttt{inkscape} and save it back in \sigla{PDF} format; the
% missing fonts will be replaced with their outlines and
% this will not disturb the \sigla{PDF/A} conformity. Pay attention,
% because Inkscape might save your file with some
-% specifications for transparency; but transparency
-% specifications destroy the \sigla{PDF/A} compliance.
+% specifications for transparency; but transparency specifications
+% destroy the \sigla{PDF/A-1b} compliance, not the \sigla{pdf/a-2b} one.
% Should this inconvenience take place, instead of asking
% \texttt{inkscape} to save in \sigla{PDF} format, ask to save in
-% \sigla{EPS} format; this one does not support transparencies,
+% \sigla{EPS} format; this format does not support transparencies,
% therefore they get abolished from the very beginning. This is useful
% also when \texttt{inkscape} is used to change the color
% profile of an image. Once this program is used to convert an
@@ -2520,9 +2538,9 @@ School of Turin.
% |\includegraphics|; all the suggested typesetting programs,
% \prog{pdflatex} included, can import \sigla{EPS} files, therefore
% these problems, thanks \texttt{inkscape} may be easily overridden.
-% Once you got the corrected EPS file, you might distill it to PDF,
-% so as to compress it in a compatible way; EPS files are generally
-% human readable so they are very large in terms of memory size.
+% Even better, once you got the corrected EPS file, you might distill
+% it to PDF, so as to compress it in a compatible way; EPS files are
+% generally human readable so they are very large in terms of memory size.
%
% \item
% Verify your final \sigla{PDF} file with a suitable program and
@@ -2530,12 +2548,12 @@ School of Turin.
% modifications while the verification program keeps saying
% that this or that is not compliant with the \sigla{PDF/A}
% specification. A suitable program is the Preflight module
-% of Adobe Acrobat Pro~XI (or later), but this, although the most
-% authoritative, is a commercial program; probably your
+% of Adobe Acrobat Pro~XI (or later); this is the most
+% authoritative, but it is a commercial program; probably your
% university has special facilities for this task. In any
-% case you can install the \prog{veraPDF} free software
+% case you can install the \prog{veraPDF} free and open software
% from the Internet, and use this handy verification program
-% (in 2017 the stable release was made available).
+% (since 2017 the program is stable).
%
%\end{enumerate}
%
@@ -2559,8 +2577,8 @@ School of Turin.
% programs, that, on the opposite, according to my experience,
% have a very high rate of success in producing \sigla{PDF/A}
% compliant documents. If you stick to the default \TeX\ system
-% Type~1, 256-glyph fonts, or to the \sigla{UNICODE} encoded otf
-% or ttf fonts and use this version of the TOPtesi bundle
+% Type~1, 256-glyph fonts, or to the \sigla{UNICODE} encoded OpenType
+% or TrueType fonts and use this version of the TOPtesi bundle
% you should be able to avoid most problems.
%
% \section{Customisation}\label{sec:LPPL}
@@ -2579,7 +2597,7 @@ School of Turin.
% |\mainmatter|, and |\backmatter|; what appears in the table of
% contents; and so on.
%
-% Nevertheless, in spite of being discouraged, some user might
+% Nevertheless, in spite of being discouraged, some user might
% want to customise some details. There are several ways to do
% such customisation that conform the LPPL.
%
@@ -2588,21 +2606,21 @@ School of Turin.
% although the original author and licence are maintained in their
% initial comments, and that the file maintainer name is changed so
% that any user of the modified version knows to whom address
-% him/herself in case of need; the original author is not responsible
+% him/herself in case of need; the original author is not responsible
% of any modified file.}
%
% \paragraph{Direct modification}
% In order to make a direct modification to any original file, first
% duplicate the original file and change name to the duplicated file;
-% the modify this copy name and make the changes that are deemed
+% then modify this copy name and make the changes that are deemed
% necessary, without forgetting to delete my name as the maintainer
% while adding your name; it would be useful if some comments are
-% added so as to describe what has benne modified, why and how.
+% added so as to describe what has been modified, why and how.
%
% Remember to change accordingly the references to the modified
% file(s) in the other bundle files; this implies that all the
% bundle files get modified and that their names must be changed
-% accordingly while modifying the initial comment lines so as to
+% accordingly while modifying the initial comment lines so as to
% delete my name as the maintainer.
%
% \paragraph{Modification of single commands and/or environments}
@@ -2615,7 +2633,7 @@ School of Turin.
% input with a |\usepackage| command inside the argument of
% another |\AtBeginDocument| command; modify your personal file
% the way you like, and test the result.
-
+%
% If your modifications do not produce any difference in the
% output PDF file, then you have to load your modified file after
% the |\begin{document}| line. In this case you have to change
@@ -2624,8 +2642,9 @@ School of Turin.
% finish it with a |\makeatother| commands, since many macros
% used inside the original code are “protected” with an |@| sign
% with its category code changed to “letter”. Needless to say that
-% in order to suse thei |.tex| file, the |\input| command must be
-% used in place of the |\usepackage| one.
+% in order to use this |.tex| file after the |begin{document}|
+% statement, the |\input| command must be used in place of the
+% |\usepackage| one.
%
% \paragraph{Command patching}
% A third way to modify some commands and/or environments is to
@@ -2653,7 +2672,7 @@ School of Turin.
% \TeX\ format and for sharing some code between the driver
% and the class part of the code, since they are supposed to
% carry the same date and version number, besides their specific
-% description string.
+% description string.For these reasons such machinery has already been set at the very beginning of this \file{.dtx} file.
% \iffalse
%<*class>
% \fi
@@ -2685,27 +2704,33 @@ School of Turin.
% be specified with their |\setotherlanguage| or |\setotherlanguages|
% commands which do not change the preset main language.
%
-% The |filecontents| package is loaded: it removes the constraints
-% the original kernel environment |filecontents|, with or without
-% the asterisk, sets up for its use. In particular that what is
-% contained in the environment gets saved in the named file, only
-% if the named file does not exist. This implies that if some
-% changes are introduced in the environment contents, such changes
-% do not get saved in the named file unless a pre\-existing file is
-% deleted.
+% The |filecontents| package used to be loaded in the previous versions
+% of TOPtesi, in oder to create the |.xmpdata| file containing the
+% metadata necessary to produce PDF/A compliant files. Its
+% functionalities are now included in the \LaTeX kernel |filecontents|
+% environment; therefore it is no longer needed; in any case it is
+% easier to use an environment defined in TOPtesi for this specific
+% task; it relies on some low level native \TeX code contained
+% in package |fancyvfb|; here we load it: the new environment
+% |pdfxmetadata| is defined further on.
+% \begin{macrocode}
+\RequirePackage{fancyvrb}
+% \end{macrocode}
+% Remember: this new environment must be loaded between the
+% |\documentclass| and the |usepackage[a-1b]{pdfx}| statements.
%
% Another piece of code follows in order to abort the job if the
% |toptesi| date, contained in it |\ProvidePacckage| argument is
% older than the class date. Should this happen, the job is aborted
% with a strong message on the console. In order to work properly
% the |toptesi| package is loaded and its date is fetched by means
-% of the defined |\GetFileInfo|macro. This macro is almost identical
+% of the defined |\GetFileInfo| macro. This macro is almost identical
% to the one that is available when this documented file is processed;
% it simply differs in the sense that the |v.| prefix to the file
% version number is taken as a separator; should be necessary to
% compare also the version number, the |\fileversion| macro gets
% defined properly without any prefix. The |\@parse@version| macro
-% is a \LaTeX\ kernel one; in spite spite of its name, it extracts
+% is a \LaTeX\ kernel one; in spite of its name, it extracts
% from the first macro token the data in a form suitable for comparison
% with the second macro token, so that a numerical test can be performed
% without the intervention of non digit symbols. The prominent class
@@ -2716,14 +2741,14 @@ School of Turin.
% the most recent \TeX\ system complete and updated installation.
% \begin{macrocode}
\usepackage{trace}
-\RequirePackage{xkeyval}
+\usepackage{xkeyval}
\DeclareOptionX{formato}[a4paper]{\PassOptionsToClass{#1}{report}}
\DeclareOptionX*{\PassOptionsToClass{\CurrentOption}{report}}
\ExecuteOptionsX{formato}
\ProcessOptionsX*\relax
\LoadClass{report}
-\RequirePackage{iftex}
+\usepackage{iftex}
\ifPDFTeX
\usepackage[english,italian]{babel}
\else
@@ -2737,7 +2762,6 @@ School of Turin.
\expandafter\@firstoftwo\else
\expandafter\@secondoftwo\fi}
\fi
-\RequirePackage{filecontents}
\providecommand\GetFileInfo[1]{%
\def\filename{#1}%
\def\@tempb##1 v.##2 ##3\relax##4\relax{%
@@ -2779,7 +2803,7 @@ School of Turin.
% reasons (before version 3.x \texttt{toptesi} was just an
% extension to the \texttt{report} class) and partly because
% it might be used as a stand alone package, but, take
-% notice, it might create some conflicts with with other
+% notice, it might create some conflicts with other
% classes internal code, although with the latest versions
% of |toptesi| we did not notice any conflict with the |book|
% class; it is certainly incompatible with the \texttt{article}
@@ -2803,6 +2827,7 @@ School of Turin.
\def\TRON{\tracingcommands \tw@ \tracingmacros \tw@}
\def\TROFF{\tracingcommands\z@ \tracingmacros \z@}
\let\TROF\TROFF
+
% \end{macrocode}
%
% Now we define the specific package options: \texttt{classica} and
@@ -2813,11 +2838,11 @@ School of Turin.
% The option \opz{scudo} is used only to typeset doctoral
% dissertations with the special look required by the “Scuola
% di Dottorato” of Politecnico di Torino. The other options for
-% specific types of thesis, \opz{triennale}, \opz{monografia},
+% specific thesis types, \opz{triennale}, \opz{monografia},
% \opz{magistrale}, \opz{dottorale}, \opz{secondaria}, are
% described further on; options \opz{frontespizio} and
% \opz{custom} avoid loading the default module |topfront| or any
-% of the previous listed modules; the are used to create title pages
+% of the previous listed modules; they are used to create title pages
% different from the ones that are available with TOPtesi.
%
% The |corpo = value| option can receive “any” value; if this
@@ -2853,6 +2878,9 @@ School of Turin.
\newif\ifsecondaria\secondariafalse
\newif\ifcustom\customfalse
\newif\ifTOPnumerazioneromana\TOPnumerazioneromanafalse
+\newif\ifTOPnocenterfolio \TOPnocenterfoliofalse
+\newif\ifTOPnocenterhead \TOPnocenterheadfalse
+\newif\ifTOPfolioinhead \TOPfolioinheadfalse
% \end{macrocode}
%
% A binding correction is established; its default value is
@@ -2870,6 +2898,12 @@ School of Turin.
% In any case see further on a deeper explanation about margins
% and binding correction.
%
+% The options concerning the folio position and the header text
+% position have been requested after version 6.3.06. Beware! While
+% the folio position close to the outer edge is acceptable, it turns
+% to be quite bad looking if also the header text is moved to the
+% fore edge; therefore avoid this position pair.
+%
% The options |usefrontespizio| and |noTOPfront| are set by the
% specific “function” executed by the |tipotesi=|\meta{value} options.
% \begin{macrocode}
@@ -2904,6 +2938,11 @@ School of Turin.
\fi}
\DeclareOptionX{autoretitolo}[true]{\ifclassica\@utoretitolotrue\fi}
\DeclareOptionX{oldstyle}[true]{\ifclassica\@ldstyletrue\fi}
+\DeclareOptionX{nocenterfolio}[true]%
+ {\unless\ifclassica\TOPnocenterfoliotrue\fi}
+\DeclareOptionX{nocenterhead}[true]%
+ {\unless\ifclassica\TOPnocenterheadtrue\fi}
+\DeclareOptionX{folioinhead}[true]{\unless\ifclassica\TOPfolioinheadtrue\fi}
\DeclareOptionX{pdfa}{\PackageWarning{toptesi}{%
***********************************************\MessageBreak%
Option pdfa ignored.\MessageBreak%
@@ -2967,9 +3006,9 @@ School of Turin.
% \begin{macrocode}
\RequirePackage{graphicx}
\RequirePackage{etoolbox}
-\RequirePackage{xspace}
\newcommand*\ifempty[1]{\edef\@tempA{#1}%
-\ifx\@tempA\@empty\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
+\ifx\@tempA\@empty\expandafter\@firstoftwo
+ \else\expandafter\@secondoftwo\fi}
% \end{macrocode}
%
% The |\textheight| is parametrised to the paper height and
@@ -2980,7 +3019,7 @@ School of Turin.
% \begin{macrocode}
\newlength\interno
\normalsize% necessary to have the correct value for \baselineskip
-\textheight \paperwidth
+\textheight=\paperwidth
\setlength{\textheight}{%
\dimexpr\textheight*\baselineskip/\baselineskip+\topskip}
% \end{macrocode}
@@ -2988,7 +3027,8 @@ School of Turin.
% a small correction is made if the extra size of 14pt is
% chosen. Also |\footskip| is parametrised to the paper height
% in a slightly different way when the large normal font size
-% is not smaller than 14\,pt; the |\if@xivpt| switch is set to true when the value is assigned to the key |corpo|.
+% is not smaller than 14\,pt; the |\if@xivpt| switch is set to true
+% when the value is assigned to the key |corpo|.
% \begin{macrocode}
\iflibro
\unless\if@xivpt
@@ -3011,6 +3051,7 @@ School of Turin.
\footskip=2\baselineskip
\fi
\fi
+
% \end{macrocode}
% The convenience of holding the spine margin within a
% dimensional register becomes really useful now in order
@@ -3018,7 +3059,7 @@ School of Turin.
% Without binding correction the inner and outer margin
% are chosen equal, but the grid is moved outwards if the
% binding correction option is specified. With the |libro|
-% option in force, the outer, lower margin are larger than
+% option in force, the outer and the lower margin are larger than
% the corresponding inner and top margins. Without such
% option, the margins are initially set equal, unless the
% binding correction is specified.
@@ -3053,25 +3094,42 @@ School of Turin.
% We now establish the page style. We start by setting to
% “empty” the tokens that keep the left and the right
% marks; we define a box so as to set the headers inside
-% this box; we redefine also the plain page style; it is
-% actually a leftover from the previous versions when the
-% page number was set at the foot in bold face, but we leave
-% it here without the bold face specification, so that in
-% future versions folios may be redefined in a common way
-% with the other page styles. Notice that in all page styles
-% folios are always in the footers.
+% this box.
%
% By defining |\lapagina| to be equivalent to |\thepage|
% we can later on redefine |\lapagina| the way we like; we
-% actually do so with the option \texttt{classica}.
+% actually do so with option \texttt{classica}.
+% Since there are options for setting the head information in a
+% centred or lateral (external) position and similarly for the folios,
+% plus the possibility to have the folio in the head or in the foot,
+% we need to redefine the |plain| and |headings| page styles according
+% to the options chosen by the user through the available keys.
% \begin{macrocode}
\def\lapagina{\thepage}
\mark{{}{}}
\newbox\@intesta
%
\def\ps@plain{\let\@mkboth\@gobbletwo
-\def\@oddfoot{\null\hfill {\scshape\lapagina}\hfill \null}\def\@oddhead{}
-\def\@evenhead{}\let\@evenfoot\@oddfoot}
+\let\@oddhead\@empty\let\@evenhead\@empty%
+\if@twoside
+ \ifTOPnocenterfolio
+ \def\@oddfoot{\makebox[\textwidth][r]{\scshape\lapagina}}
+ \def\@evenfoot{\makebox[\textwidth][l]{\scshape\lapagina}}
+ \else
+ \def\@oddfoot{\makebox[\textwidth][c]{\scshape\lapagina}}%
+ \def\@evenfoot{\makebox[\textwidth][c]{\scshape\lapagina}}%
+ \fi
+\else
+ \ifTOPnocenterfolio
+ \def\@oddfoot{\makebox[\textwidth][r]{\scshape\lapagina}}%
+ \let\@evenfoot\@oddfoot
+ \else
+ \def\@oddfoot{\makebox[\textwidth][c]{\scshape\lapagina}}%
+ \let\@evenfoot\@oddfoot
+ \fi
+\fi
+}
+
% \end{macrocode}
% Other page styles are defined in a different way according
% to the choice of one side or two side printing. In any case
@@ -3082,35 +3140,102 @@ School of Turin.
% to invite the user to exploit the sectioning commands
% optional short argument.
% \begin{macrocode}
-\if@twoside
- \def\ps@headings{\let\@mkboth\markboth% autoretitolo
- \def\@oddfoot{\null\hfill {\scshape\lapagina} \hfill\null}
- \let\@evenfoot\@oddfoot
- %
- \def\@evenhead{\setbox\@intesta\hbox{\footnotesize\slshape
- \leftmark}%
+\if@twoside % two side
+ \def\ps@headings{\let\@mkboth\markboth% autoretitolo
+ \let\@oddhead\@empty\let\@evenhead\@empty
+ \unless\ifTOPfolioinhead % folio in head
+ \ifTOPnocenterfolio
+ \def\@oddfoot{\makebox[\textwidth][r]{\scshape\lapagina}}
+ \def\@evenfoot{\makebox[\textwidth][l]{\scshape\lapagina}}
+ \else
+ \def\@oddfoot{\makebox[\textwidth][c]{\scshape\lapagina}}
+ \def\@evenfoot{\makebox[\textwidth][c]{\scshape\lapagina}}
+ \fi
+ \def\@oddhead{\setbox\@intesta\hbox{\footnotesize\slshape
+ \rightmark}%
\ifdim\wd\@intesta>\textwidth \headWarn{\chapter}\fi%
- \underline{\makebox[\textwidth]{\footnotesize\slshape
- \strut\leftmark}}}%
+ \ifTOPnocenterhead
+ \underline{\makebox[\textwidth][r]{\footnotesize\slshape
+ \strut\rightmark}}%
+ \else
+ \underline{\makebox[\textwidth][c]{\footnotesize\slshape
+ \strut\rightmark}}%
+ \fi}%
+ \def\@evenhead{\setbox\@intesta\hbox{\footnotesize\slshape
+ \rightmark}%
+ \ifdim\wd\@intesta>\textwidth \headWarn{\section}\fi%
+ \ifTOPnocenterhead
+ \underline{\makebox[\textwidth][r]{\footnotesize\slshape
+ \strut\leftmark}}%
+ \else
+ \underline{\makebox[\textwidth][c]{\footnotesize\slshape
+ \strut\leftmark}}%
+ \fi}%
+ \else % folio in foot
+ \let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@oddhead{\setbox\@intesta\hbox{\footnotesize\slshape
\rightmark}%
\ifdim\wd\@intesta>\textwidth \headWarn{\section}\fi%
- \underline{\makebox[\textwidth]{\footnotesize\slshape
- \strut\rightmark}}}%
- \def\chaptermark##1{%
- \markboth{\thechapter\ -- ##1}{\thechapter\ -- ##1}}
- \def\sectionmark##1{\markright{\ifnum\c@secnumdepth>\z@
- \thesection\ -- \fi ##1}}}
-\else
- \def\ps@headings{\let\@mkboth\markboth
- \def\@oddfoot{\null\hfill {\scshape\lapagina} \hfill\null}
- \def\@evenfoot{}
+ \ifTOPnocenterhead
+ \underline{\makebox[\textwidth][r]{\footnotesize\slshape
+ \strut\rightmark}}\rlap{\quad\scshape\lapagina}%
+ \else
+ \underline{\makebox[\textwidth][c]{\footnotesize\slshape
+ \strut\rightmark}}\rlap{\quad\scshape\lapagina}%
+ \fi}
+ \def\@evenhead{\setbox\@intesta\hbox{\footnotesize\slshape
+ \rightmark}%
+ \ifdim\wd\@intesta>\textwidth \headWarn{\chapter}\fi%
+ \ifTOPnocenterhead
+ \underline{\llap{\scshape\lapagina\quad}%
+ \makebox[\textwidth][l]{\footnotesize\slshape\strut\rightmark}}%
+ \else
+ \underline{\llap{\scshape\lapagina\quad}%
+ \makebox[\textwidth][c]{\footnotesize\slshape\strut\rightmark}}%
+ \fi}
+ \fi
+ \def\chaptermark##1{\markboth{\thechapter\ -- ##1}{\thechapter\ -- ##1}}
+ \def\sectionmark##1{\markright{\ifnum\c@secnumdepth>\z@
+ \thesection\ -- \fi ##1}}%
+ }
+\else% oneside
+ \def\ps@headings{%
+ \let\@mkboth\markboth\let\@oddhead\@empty\let\@evenhead\@empty
+ \let\@oddfoot\@empty\let\@evenfoot\@empty
+ \def\@evenfoot{}\def\@evenhead{}%
+ \unless\ifTOPfolioinhead % folio in head
+ \ifTOPnocenterfolio
+ \def\@oddfoot{\makebox[\textwidth][r]{\scshape\lapagina}}
+ \else
+ \def\@oddfoot{\makebox[\textwidth][c]{\scshape\lapagina}}
+ \fi
+ \def\@oddhead{%
+ \setbox\@intesta\hbox{\footnotesize\slshape
+ \rightmark}%
+ \ifdim\wd\@intesta>\textwidth \headWarn{\chapter}\fi%
+ \ifTOPnocenterhead
+ \underline{\makebox[\textwidth][r]{\footnotesize\slshape
+ \strut\rightmark}}%
+ \else
+ \underline{\makebox[\textwidth][c]{\footnotesize\slshape
+ \strut\rightmark}}%
+ \fi
+ }%
+ \else % folio in foot
+ \let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@oddhead{\setbox\@intesta\hbox{\footnotesize\slshape
\rightmark}%
\ifdim\wd\@intesta>\textwidth \headWarn{\chapter}\fi%
- \underline{\makebox[\textwidth]{\footnotesize\slshape
- \strut\rightmark}}}%
- \def\chaptermark##1{\markright{\thechapter\ -- ##1}}}
+ \ifTOPnocenterhead
+ \underline{\makebox[\textwidth][r]{\footnotesize\slshape
+ \strut\rightmark}}\makebox[\z@][l]{\enspace\scshape\lapagina}%
+ \else
+ \underline{\makebox[\textwidth][c]{\footnotesize\slshape
+ \strut\rightmark}}\makebox[\z@][l]{\enspace\scshape\lapagina}%
+ \fi}
+ \fi
+ \def\chaptermark##1{\markright{\thechapter\ -- ##1}}%
+ }
\fi
\def\headWarn#1{\PackageWarning{toptesi}{%
@@ -3140,15 +3265,18 @@ School of Turin.
\penalty\@highpenalty
\endgroup
\fi}
+
% \end{macrocode}
% The various tables of contents, or figures, or tables
% require some boolean variables to be defined; in facts,
% although the \sigla{ISO} regulations require that every technical
% report contains the list of figures and/or tables,
% in Italy theses rarely contain these lists; the question is: “is a
-% thesis a technical report?”. In Italy, in most cases, the answer is “no”.
+% thesis a technical report?”. In Italy, in most cases, the answer
+% is “no”.
+%
% We require also some other boolean variables to handle the
-% difference between front matter and main matter; this
+% difference between front matter and main matter; these
% differences are already defined in the \texttt{book}
% document class, but not in the \texttt{report} one.
% \begin{macrocode}
@@ -3168,7 +3296,7 @@ School of Turin.
\ifTOPnumerazioneromana\numeriromanitrue\fi
\frontmattertrue\@openrightfalse\c@secnumdepth=-2\relax
}
-
+
\def\mainmatter{\@mainmattertrue
\if@twoside\@openrighttrue\fi
\ifTOPnumerazioneromana\numeriromanifalse\fi
@@ -3232,11 +3360,12 @@ School of Turin.
\iffrontmatter\else\frontmattertrue\fi
\chapter*{\summaryname}}
\let\summary\sommario
-%
+
\def\ringraziamenti{%
\iffrontmatter\else\frontmattertrue\fi
\chapter*{\acknowledgename}}
\let\acknowledgements\ringraziamenti
+
% \end{macrocode}
% The strings |\summaryname| and |\acknowledgename| are not
% defined for every language option to \texttt{babel}. Default
@@ -3244,14 +3373,67 @@ School of Turin.
% names for localising the package in a language different
% from Italian and English.
%
+% When and if a PDF/A compliant file has to be produced, it is
+% necessary to load the \pack{pdfx} package in the document to
+% be typeset and to create a special metadata file. The Italian
+% documentation |toptesi-it| explains how to do these actions,
+% in particular how to generate the necessary metadata and how
+% to prepare the |\jobname.xmpdata| file; it was suggested
+% to use the |filecontents| environment as redefined by package
+% \pack{filecontents}. But the situation has become a little clumsy
+% by the end of 2019 because the functionalities of the package
+% have been introduced int the \LaTeX kernel. But the new upgraded
+% kernel definition of the |filecontents| environment as redefined
+% by the previous version of \pack{filecontents} becomes available
+% only trough suitable options. This makes previous versions of
+% theses typeset with the previous versions behave as if the
+% \pack{filecontents} package was not loaded. In other words what
+% was made in the examples accompanying this class and package does
+% not work anymore as it used to do, when they are typeset with an
+% updated version of the \TeX system; today with the 2020 \TeXLive
+% version, they do not perform as they used to do, since they do not
+% update the metadata without deleting the previous file that
+% contained the previous version. You get the previous functionality
+% if you edit the files and add the suitable options: \opz{noheader}
+% and \opz{overwrite} to the opening environment statement.
+% For new files we suggest to use a new environment in order to
+% create the proper metadata file, with the proper name and contents.
+% This new environment can be used in the thesis preamble anywhere
+% before using the \pack{pdfx} package.
+%
+% The new environment has a very descriptive name: \env{pdfxmetadata};
+% it does not require asterisks or options; its contents are the
+% metadata. Its use is a such:
+%\begin{flushleft}\obeylines
+%\cs{documentclass}\oarg{options}\Marg{toptesi}
+%\meta{special packages}
+%\Bambiente{pdfxmetatada}
+%\meta{metada}
+%\Eambiente{pdfxmetadata}
+%...
+%\cs{usepackage}\Oarg[a-1b]\Marg{pdfx}
+%\meta{other packages}
+%\meta{settings and definitions}
+%\Bambiente{document}
+%\end{flushleft}
+% Here is the very simple code thanks to the |VerbatimOut|
+% environment defined by the |fancyvrb| package, invoked
+% without the \cs{begin} and \cs{end} commands that may not perform
+% correctly within other environments.
+% \begin{macrocode}
+\newenvironment{pdfxmetadata}{%
+\VerbatimOut{\jobname.xmpdata}}{\endVerbatimOut}
+% \end{macrocode}
+%
% We have to modify the |\chapter| and |\part| commands so
% that as the user first uses one of these commands the
% typesetting style is switched to that of the main matter.
% But by exploiting certain facilities of the |xparse| package,
% some delicate tests could be developed by |xparse| itself; therefore
-% the whole command was redefined so that the new syntax is the following:
+% the whole commands were redefined so that the new syntax is the
+% following:
%\begin{flushleft}\obeylines
-%\cs{chapter}\meta{$\star$}\oarg{toc entry}\oarg{headings entries}\marg{title}\oarg{pagestyle}
+%\cs{chapter}\meta{$\star$}\oarg{toc entry}\oarg{headings entry}\marg{title}\oarg{pagestyle}
%\end{flushleft}
% The \meta{$\star$} is optional, and simply implies that no toc
% entry will be generated and the chapter title will not be
@@ -3267,87 +3449,122 @@ School of Turin.
% is five. Their meaning is the following.
%\begin{description}
%
-%\item[\meta{$\star$}] Controls the chapter numbering and the
-% toc entry; its absence implies numbering and toc entry;
-% its presence implies no numbering and no toc entry;
-% nevertheless is does not cancels the possibility of having
-% an header (if the page style accepts left and right marks);
-% for example, a command such as this one\\[1ex]
+%\item[\meta{$\star$}]
+% Controls the chapter numbering and the
+% toc entry; its absence implies numbering and toc entry;
+% its presence implies no numbering and no toc entry;
+% nevertheless is does not cancels the possibility of having
+% an header (if the page style accepts left and right marks);
+% for example, a command such as this one\\[1ex]
%\cs{chapter*}\Oarg{Short entry}\Marg{Long title}\\[1ex]
-% does not number the chapter with the |Long title|, but gets
-% the string |Short entry|; lacking the optional argument both
-% headers (see below) will contain the string |Long title|.
-% If you want an empty header, you have to specify an empty
-% optional argument; or before using the command, you specify
-% an empty or a plain page style
-%\item[\meta{toc entry}] is the entry for the table of contents;
-% its default value is \meta{title}, but since more often than
-% not the actual \meta{title} is a long string, it is better
-% to use such optional argument: of course, if the optional star
-% is used, its \meta{toc entry} is passed on as a default value
-% for the \meta{headings entry}.
-%
-%
-%\item[\meta{headings entry}] contains the string to be inserted
-% in both left and right headers, if the page style uses such
-% pieces of information; this is a deliberate choice in order
-% to have both headers correctly indicating the chapter title
-% even if the “chapter” contains no sections, for example indices,
-% lists of figures and/or tables, forewords and similar thesis
-% items. Of course if sections are used, their entries replace
-% that chapter entry in the right header. This choice of defining
-% both headings is useful also for those numbered chapters that
-% have a longish text preceding the first section.
-%
-%
-%\item[\meta{title}] with no surprise is the chapter title that
-% is printed in its opening page. It defines also the default
-% \meta{toc entry} and therefore the \meta{headings entry}.
-%
-%
-%\item[\meta{pagestyle}] solves a problem that arises more often
-% than not: by default the chapter opening page is typeset with
-% the |plain| page style; sometimes a different style is desired,
-% for example the |empty| one. The use can specify this optional
-% argument with |empty| to have a headerless opening page without
-% a printed folio. Actually the user can specify any page style,
-% provided it satisfies the typographical best practice.
+% does not number the chapter with the |Long title|, but gets
+% the string |Short entry|; lacking the optional argument both
+% headers (see below) will contain the string |Long title|.
+% If you want an empty header, you have to specify an empty
+% optional argument; or before using the command, you specify
+% an empty or a plain page style.
+%\item[\meta{toc entry}]
+% is the entry for the table of contents;
+% its default value is \meta{title}, but since more often than
+% not the actual \meta{title} is a long string, it is better
+% to use such optional argument: of course, if the optional star
+% is used, its \meta{toc entry} is passed on as a default value
+% for the \meta{headings entry}.
+%\item[\meta{headings entry}]
+% contains the string to be inserted
+% in both left and right headers, if the page style uses such
+% pieces of information; this is a deliberate choice in order
+% to have both headers correctly indicating the chapter title
+% even if the “chapter” contains no sections, for example indices,
+% lists of figures and/or tables, forewords and similar thesis
+% items. Of course if sections are used, their entries replace
+% that chapter entry in the right header. This choice of defining
+% both headings is useful also for those numbered chapters that
+% have a longish text preceding the first section.
+%\item[\meta{title}]
+% with no surprise is the chapter title that
+% is printed in its opening page. It defines also the default
+% \meta{toc entry} and therefore the \meta{headings entry} if these
+% optional arguments are not specified.
+%\item[\meta{pagestyle}]
+% solves a problem that arises more often than not: by default the
+% chapter opening page is typeset with the |plain| page style;
+% sometimes a different style is desired, for example the |empty| one.
+% The use of this optional argument with |empty| allows to have an
+% opening page without both a header and a printed folio. Actually the
+% user can specify any page style, provided it satisfies the
+% typographical best practice.
%
%\end{description}
+%
% Actually the commands to typeset the Summary and the
% Acknowledgements chapters, as defined above, are regularly
% typeset in the front matter style, opening on any page
-% (even or odd) and possibly numbered with small caps roman numerals.
+% (even or odd) and possibly with folios numbered with small
+% caps roman numerals. The |\chapter*| does not switch from
+% front to main matter; while the unstarred one does.
+% Moreover |\chapter*|, besides avoiding numbering the specific chapter,
+% inhibits its entry in the |toc| file.
+% In previous versions of this bundle the |\chapter*| command would
+% set the |secnumdepth| counter to $-3$ in a global manner. This did
+% not produce any effects while in front or back matters, except
+% avoiding the chapter entry in the |toc| file, but it inhibited
+% chapter numbering in all following chapters while in main matter.
+% This had no consequences if a final main matter unnumbered
+% chapter, such as a |Conclusions| one, or a postface had to be
+% typeset; but if numbered appendices had to conclude the main matter,
+% these could not be numbered\footnote{Thanks to Damiano Del Sarto who
+% spotted this bug.}. To avoid this “feature”, the user had to mask
+% the |\chapter*| command and its argument(s) within a group, like this:
+%\begin{flushleft}\obeylines
+%\Marg{\cs{chapter}*\oarg{header entry}\marg{chapter title}}
+%\end{flushleft}
+% With the new definition there is no need to employ such (actually
+% simple) trick, because the |secnumdepth| counter value is saved, and
+% this previous value is restored after the |\chapter| command is fully
+% completed.
% \begin{macrocode}
-\RenewDocumentCommand{\chapter}
- {s O{#4} O{#2} m O{plain}}{%
+
+\newcount\TOPsecnumdepth
+\newif\iftoc
+
+\RenewDocumentCommand{\chapter}{s O{#4} O{#2} m O{plain}}{%
\if@openright\cleardoublepage
\else\clearpage\fi
\thispagestyle{#5}%
\global\@topnum\z@
\@afterindentfalse
\IfBooleanTF{#1}{%
+ \TOPsecnumdepth=\c@secnumdepth
\c@secnumdepth=-3\relax
- \let\iftoc\iffalse
+ \tocfalse
}{%
\iffrontmatter\mainmatter\fi
- \let\iftoc\iftrue
+ \toctrue
}%
-% Numbering and TOC entry
- \ifnum \c@secnumdepth >\m@ne
+ \ifnum \c@secnumdepth >\m@ne
\if@mainmatter % where \if@mainmatter is defined
% (e.g. book.cls, toptesi.cls)
\refstepcounter{chapter}%
\typeout{\@chapapp\space\thechapter.}%
- \iftoc\addcontentsline{toc}{chapter}{%
- \protect\numberline{\thechapter}#2}\fi
+ \iftoc
+ \addcontentsline{toc}{chapter}{%
+ \protect\numberline{\thechapter}#2}%
\else %
- \iftoc\addcontentsline{toc}{chapter}{#2}\fi
+ \addcontentsline{toc}{chapter}{#2}%
+ \fi
+ \else % When \mainmatter is not defined (e.g.report.cls)
+ \refstepcounter{chapter}%
+ \typeout{\@chapapp\space\thechapter.}%
+ \iftoc
+ \addcontentsline{toc}{chapter}{%
+ \protect\numberline{\thechapter}#2}%
+ \else %
+ \addcontentsline{toc}{chapter}{#2}%
\fi
- \else % Were \mainmatter is not defined (e.g.report.cls)
- \iftoc\addcontentsline{toc}{chapter}{#2}\fi
+ \fi
\fi
-% Headers
+%
\markboth{#3}{#3}% No \MakeUppercase
\iftoc
\addtocontents{lof}%
@@ -3355,19 +3572,26 @@ School of Turin.
\addtocontents{lot}%
{\protect\addvspace{10\p@}}%
\fi
-% Actual title in the opening chapter page.
+%
\if@twocolumn
\@topnewpage[\@makechapterhead{#4}]%
\else
\@makechapterhead{#4}%
\@afterheading
\fi
+ \IfBooleanTF{#1}{\c@secnumdepth=\TOPsecnumdepth}{}%
}
+
% \end{macrocode}
% It would be possible to redefine in a similar manner also
-% the |\part| command, but it was deemed unnecessary, since
-% theses are seldom divided into parts.
-% \begin{macrocode}
+% the |\part| command, but originally it was deemed unnecessary,
+% since theses are seldom divided into parts; now with the
+% options on the folio position it is necessary to redefine
+% also the |part| command.
+% \begin{macrocode}
+\RenewDocumentCommand\part{s O{#3} m}{\iffrontmatter\mainmatter\fi
+\if@openright \cleardoublepage \else \clearpage \fi
+\thispagestyle{plain}\if@twocolumn \onecolumn \@tempswatrue \else \@tempswafalse \fi \null \vfil \IfBooleanTF{#1}{\@spart{#3}}{\@part[#2]{#3}}}
\def\@part[#1]#2{\iffrontmatter\mainmatter\fi
\ifnum \c@secnumdepth >-2\relax
\refstepcounter{part}%
@@ -3386,8 +3610,17 @@ School of Turin.
\fi
\Huge \bfseries #2\par}%
\@endpart}
-
% \end{macrocode}
+% The syntax is the following
+%\begin{ttsintassi}
+%\cs{part}\meta{*}\oarg{short title}{title}
+%\end{ttsintassi}
+% where the optional star implies no toc entry; in absence of the
+% star, the toc entry is the \meta{short title} which, in turn,
+% if not specified, assumes the same value as \meta{title}.
+% The starred version of |\part|, contrary to the starred version
+% of |\chapter|, switches from front to main matter.
+%
% At the same time we have to make sure that |\tableofcontents|,
% |\listoftables| and |\listoffigures| do not exit from the
% front matter style. We assume these commands are issued
@@ -3396,10 +3629,10 @@ School of Turin.
% toc entries with the native commands. We need not define the
% headers, because the default title is good for this purpose;
% but since such thesis elements are typeset with the front
-% matter page style (|plain|), no headers are used; With long
+% matter page style (|plain|), no headers are used; with long
% indices and/or lists of tables and/or figures, the user might
% desire to have headers, so that the declaration
-% |\pagestyle{headings}| should be specifies before using the
+% |\pagestyle{headings}| should be specified before using the
% |\indici| or |\allcontents| commands.
%
% The table of contents itself is not linked at all, but in order
@@ -3440,10 +3673,18 @@ School of Turin.
% We need to define |\indici| (alias |\allcontents|) that typesets
% the table of contents and, optionally, the lists of tables and/or
% figures while softly maintaining the front matter style for
-% typesetting. In facts, if the user wants a diffferent styl s/he can select it with a suitable argument the |\pagestyle| command.
+% typesetting.
+%
+% The various tables and lists are typeset by default with the |plain|
+% page style; if another style is desired the |\indici| command accepts
+% an optional argument; the user may specify any (already defined) page
+% style that will apply to all lists: table of contents, and if the
+% suitable switches are |true|, also to the list of tables and/or the
+% list of figures.
% \begin{macrocode}
-\def\indici{% If headings are desired, the pagestyle must be set in advance
+\NewDocumentCommand\indici{O{plain}}{%
\iffrontmatter\else\frontmattertrue\fi
+ \pagestyle{#1}%
\tableofcontents
\iftablespage
{\addvspace{10pt}
@@ -3491,7 +3732,7 @@ School of Turin.
\brokenpenalty=10000
% \end{macrocode}
%
-% Here comes a questionable command and/or environment; good
+% Now a questionable command and/or environment is defined; good
% typesetting requires the baseline skip to be proportioned
% to the font size, generally it is some 10--20\% larger
% than the font size. In some reasonable instances a larger
@@ -3529,8 +3770,8 @@ School of Turin.
% These geometrical parameters are critical and everybody
% has his/her own ideas of what are the best values for them.
% According to my experience the parameters set by this
-% extension file work quite well but I would not suggest
-% them for every kind of typewritten document.
+% extension file work quite well but I would not claim
+% that they are suitable for any typewritten document.
%
% In particular the zero value for the text fraction appears
% strange, but students have the tendency to create large figures
@@ -3566,7 +3807,7 @@ School of Turin.
%
% The issue is that I prefer a narrower justified caption
% rather than one where the last line is just a short word
-% or the right segment of an hyphenated last word. If one
+% or the right segment of a hyphenated last word. If one
% sets the |\finalhyphendemerits| parameter to an extremely
% high value, one might succeed in avoiding a hyphenated
% penultimate caption line, but this might lead to a very
@@ -3575,9 +3816,9 @@ School of Turin.
% caption width. I initially set the caption width (a new
% length) to the overall text width diminished by 3em; then
% if the caption text, inclusive of the caption label and
-% number, is shorter than the text width it is typeset as
+% number, is shorter than this text width, it is typeset as
% centred text; if it exceeds the text width, it is set as
-% a justified paragraph whose line width equals the
+% a justified paragraph whose line length equals the
% established caption width; but in any case the last
% line of the paragraph is measured and, if it is shorter
% than one third of the caption width, this width is
@@ -3636,25 +3877,26 @@ School of Turin.
% By the way, if the package \pack{caption} has been loaded
% in the preamble, this specific recalculation must not be
% executed at all; it is necessary to delay this definition
-% at |\AtBeginDocument| so we know for sure if that the package
+% at |\AtBeginDocument| so we know for sure if that package
% has been actually loaded. Of course if the \pack{caption} package
% has not been loaded the |\captionsetup| macro is not
% defined and its use (for example, as a leftover of some
% experiments with the \pack{caption} package) would produce
-% an error for this reason we define it as a gobbling macro
+% an error; for this reason we define it as a gobbling macro
% so as to neutralise its presence.
%
% At this point it is very simple to add the |\captionof|
% command in order to use a caption also for figures that
% are set outside floating bodies; it might be useful when
% small figures or tables are inserted in unusual places,
-% such as a table, a minipage, or similar non floating
+% such as a table, a |minipage|, or similar non floating
% environments. The only thing that suffices to insert is
% the name of the corresponding not used float.
% \begin{macrocode}
\AtBeginDocument{\@ifpackageloaded{caption}{}{%
\providecommand\captionsetup{}\renewcommand\captionsetup[2][]{}%
\providecommand\captionof[1]{\def\@captype{#1}\caption}
+
\let\originalcaption\caption
\newdimen\captionwidth
\newdimen\fullwidth
@@ -3698,11 +3940,11 @@ School of Turin.
% \end{macrocode}
%
% ^^A SDFIGURE
-% Always delayed to the |\begin{document}| statement execution
+% Always delayed to the |\begin{document}| statement execution,
% we define a new (possibly floated) environment
% |SD| that creates a box where there is the main environment
% contents with its caption to a side, precisely to the side
-% close to the outer margin of the page. This implies that
+% close to the outer margin of the page. This implies that
% in one side printing the caption is always on the right,
% while in two side printing the caption is on the right in
% right/odd pages and on the left in left/even pages.
@@ -3725,10 +3967,10 @@ School of Turin.
% such as when it is set within a mini-page or another similar
% environment; in such situations it is not required to use
% |\captionof|; actually this command is simulated within this
-% very \amb{SD} environment
-%.
+% very \amb{SD} environment.
+%
% The actual commands for inserting
-% the picture and its caption within the |figure| environment
+% the image and its caption within the |figure| environment
% have names starting with |SD|, namely |\SDcaption| and
% |\SDimage|. Its syntax is as follows:
%\begin{flushleft}\obeylines
@@ -3765,7 +4007,7 @@ School of Turin.
% correct position within the dedicated space; any argument
% is substantially valid with the caution that this “anything”
% remains local to that particular “image”. In any case when
-% the “mage” is a real picture and has to be resized to a
+% the “image” is a real picture and has to be resized to a
% relative dimension, remember that both the picture and its
% caption are typeset within boxes narrower than the total text
% width or the total environment width; the best way to access
@@ -3782,7 +4024,7 @@ School of Turin.
% contains the usual short caption entry for the list of
% figures or tables or specific other floats.
%\item The \marg{caption} mandatory brace delimited argument
-% contains the image caption.
+% contains the image caption text.
%\item The \marg{label} mandatory brace delimited argument
% contains the string that is usually passed to the |\label|
% command; this string is mandatory in the sense that it
@@ -3834,9 +4076,12 @@ School of Turin.
% used by the final user in those rare circumstances where
% just an explanation is required and the object being
% explained does not require to be cross referenced.
+%
%^^A CONFLITTO CON \CAPTION* DI LONGTABLE? -- CONTROLLARE<<<< !
+%
% \begin{macrocode}
-\NewDocumentCommand\captionSD{s O{} m}{% O: optional arg. with null default
+\NewDocumentCommand\captionSD{s O{} m}{%
+% O: optional arg. with null default
\IfBooleanTF{#1}%
{%
\@makecaption{}{#3}%
@@ -3853,7 +4098,7 @@ School of Turin.
% Then the environment |SDbox| is defined by means of the
% facilities of the |xparse| package; this allows the use of
-% the “non delimited” asterisk argument. It also requires other
+% the “non delimited” asterisk argument. It also requires other
% arguments, the first of which is mandatory and specifies the
% contents kind, be it a figure, or a table, or an algorithm,
% or anything else that has been introduced with the facilities
@@ -3873,7 +4118,7 @@ School of Turin.
{\SDlinewidth=\textwidth}%
% \end{macrocode}
% Then we fix our attention to the correct use of the optional third
-% argument, whose descriptor assigns it a default value of |0.5|:
+% argument, whose descriptor assigns it a default value of |0.5|:
% \begin{macrocode}
\SDcaptionwidth=#3\SDlinewidth
\ifdim\SDcaptionwidth<0.3\SDlinewidth
@@ -3887,13 +4132,13 @@ School of Turin.
\SDfigurewidth=\dimexpr\SDfigurewidth-\columnsep\relax
% \end{macrocode}
% We add some test to verify if the environment is used within
-% the |figure| floating environment, or it is used ad a fixed
+% the |figure| floating environment, or it is used as a fixed
% object; we first test if we are within a floating environment;
% if not we define |\@captype| to contain the string `figure';
-% if yes we have to test if we are really within the |figure|
+% if yes, we have to test if we are really within the |figure|
% environment: if not, we locally define |\@captype| else
% we relax. This means that we can insert the |SDfigure| even
-% within a |table| environment as sometimes a tabular and a
+% within a |table| environment as sometimes a tabular and a
% drawing should float together (may be because a drawing with
% its own caption represents the tabular entries).
%
@@ -3907,7 +4152,7 @@ School of Turin.
%
% The code tests if the saved \meta{label} string is empty;
% this should never take place, but it is better to perform
-% such task. If the string is empty, a fall back value equal
+% such task. If the string is empty, a fall back value equal
% to the page number of the page that is still open at
% processing time is used; may be a warning message would
% be helpful, but since this empty string should never be
@@ -3929,7 +4174,7 @@ School of Turin.
% |.aux| file |\label| saved data, we must access the
% string that contains these data but we have to expand
% several times the saved macros until we have the real
-% string in |\@temD|.
+% string in |\@tempD|.
% \begin{macrocode}
}{%---------------------------------------------------CLOSING
{\ifcsdef{r@\@tempSD}%
@@ -3978,8 +4223,8 @@ School of Turin.
% but it actually performs several actions; the first
% (optional) argument is intended to collect the “short
% caption” to be used, if specified, for the list of floats
-% entry; if not specified ,as usual, the “long caption”
-% second argument is used for this entry. The (optional)
+% entry; if not specified, as usual, the “long caption”
+% second argument is used for this entry. The third (optional)
% brace delimited argument, on the contrary, is the label
% string that usually is passed as the argument of the
% |\label| command. If specified it is this |\SDcaption|
@@ -3992,7 +4237,6 @@ School of Turin.
% and cannot be cross referenced; there are circumstances
% when this situation is very useful, but it is up to the
% user to decide when it is useful for his/her needs.
-% interpretation.
%
% In this macro definition the boolean switch |NumberSD|
% has been already set by the opening statement commands
@@ -4053,9 +4297,9 @@ School of Turin.
% in a parbox or a minipage; it can be an actual picture
% imported with an |includegraphics| command, it can be a
% drawing or a diagram created with the |picture|, or |tikz|,
-% or |pgfplots|, or |pstricks| commands; it can be a table,
-% an algorithm, an example, a theorem; anything that can be
-% typeset within a box. With this name in mind we create
+% or |pgfplots|, or |pstricks| commands/environments; it can be
+% a table, an algorithm, an example, a theorem; anything that can
+% be typeset within a box. With this name in mind we create
% the |SDimage| command to insert the object into our |SDbox|.
% A |\SDtabular| command is an alias to |\SDimage|; the user
% may define other such aliases for inserting other objects
@@ -4192,7 +4436,7 @@ School of Turin.
% \end{macrocode}
%
% {\tolerance=3000\relax
-% The TOPtesi bundle contains two new chapter like sections
+% The TOPtesi bundle contains two new chapter-like sections
% activated with the commands |\sommario| (alias |\summary|)
% and |\ringraziamenti| (alias |\acknowledgements|) respectively.
% The infix strings that start these sections depend on the
@@ -4214,8 +4458,8 @@ School of Turin.
% involuntary reassignment to this register. At the same
% time if a specific language option was not specified, a
% warning message is issued, but compilation goes on any way
-% without the sectioning string names. For being sure no
-% other `undefined' error messages are issued, the |\summaryname|
+% without the sectioning string names. To be sure, no
+% other `undefined' error messages are issued, and the |\summaryname|
% and |\acknowledgename| are let to |\empty|.
% \begin{macrocode}
\providecommand*\summaryname{}
@@ -4234,7 +4478,7 @@ Skipping any redefinition\MessageBreak}%
}}}%
% \end{macrocode}
% For Italian and English there are no problems; we provide
-% immediately these extensions by means of the newly available macro:
+% immediately these extensions by means of the newly available macros:
% \begin{macrocode}
\ExtendCaptions{italian}{Sommario}{Ringraziamenti}
\ExtendCaptions{english}{Summary}{Acknowledgements}
@@ -4245,7 +4489,9 @@ Skipping any redefinition\MessageBreak}%
% and |\captionsenglish| are already defined and can be
% freely extended. For any other language the corresponding
% language option must be entered in the class opening
-% statement, otherwise a warning is issued but compilation
+% statement if babel is used, or it must be set with |polyglossia|
+% |\setotherlanguage| when the latter language handler is being used;
+% otherwise a warning is issued but compilation
% is not stopped. Therefore if, for example, the user wants
% to write the thesis in Spanish, the thesis main file shall
% start like this:
@@ -4258,7 +4504,18 @@ Skipping any redefinition\MessageBreak}%
% ...
% \end{verbatim}
% and the rest of the thesis will be typeset correctly in
-% Spanish. Remember that Italian is the main language and
+% Spanish. similarly, if |polyglossia| is being used The code is:
+%\begin{verbatim}
+% \documentclass[...]{toptesi}
+% ...
+% \setotherlanguage{spanish}
+% \ExtendCaptions{spanish}{Resumen}{Agradecimientos}
+% ...
+% \begin{document}
+% \selectlanguahe{spanish}
+% ...
+%\end{verbatim}
+% Remember that Italian is the main language and
% nothing is necessary to set up the Italian defaults.
% If English is desired, then after |\begin{document}| it
% is necessary to specify the default language; for ease
@@ -4289,18 +4546,17 @@ Skipping any redefinition\MessageBreak}%
% specify |\english| \emph{after} the |\begin{document}|
% statement, if English is supposed to be the main language, or
% \item
-% specify the language name, other than Italian or English,
-% among the class options; use the |\ExtendCaptions| macro
-% for extending the list of sectioning commands infix strings
-% as explained above; specify with |\selectlanguage| the new
-% language as the default one \emph{after} the |\begin{document}|
-% statement;
+% if babel is being used, specify the language name, other than Italian
+% or English, among the class options; use the |\ExtendCaptions| macro
+% for extending the list of sectioning commands infix strings as
+% explained above; specify with |\selectlanguage| the new language as
+% the default one \emph{after} the |\begin{document}| statement;
% \item
-% if XeLaTeX\ or LuaLaTeX\ is being used for typesetting, it
+% if \XeLaTeX\ or LuaLaTeX\ is being used for typesetting, it
% suffices to specify in the preamble the name of the other
% language to be used, by means of the |setotherlanguage|
% command, and to define the summary and acknowledgments names
-% in the same way as with pdf\/\LaTeX; the same must be done
+% in the same way as with \pdfLaTeX; the same must be done
% at the beginning of the document to declare the new language
% as the default one.
% \end{itemize}
@@ -4313,8 +4569,8 @@ Skipping any redefinition\MessageBreak}%
%
% At last the subsidiary and independent packages
% \texttt{topcoman} and \texttt{topfront} are requested
-% for input; the latter is loaded only when the
-% |documentclass| option |noTOPfront| has NOT been declared.
+% for input; the latter is loaded only when the switch |noTOPfront|
+% has NOT been set |true| by using any \texttt{tipotesi=\meta{option}}.
% This action, therefore has to be delayed till the “begin
% document” step, in order to be sure that other packages
% have possibly been loaded to typeset the title page, and/or
@@ -4322,10 +4578,11 @@ Skipping any redefinition\MessageBreak}%
% of measure. This delayed loading implies that the
% commands defined in |topfront| and in |topcomand| cannot
% be used in the preamble. Notice that also the \textsl{scudo}
-% option implies that the title page is typeset with its
+% option value implies that the title page is typeset with its
% special commands and environments, therefore it sets the
% suitable switches so as to avoid loading the |topfront|
-% extension file. This applies also to the other modules particular to special thesis types.
+% module. This applies also to the other modules specific for
+% special thesis types.
% \begin{macrocode}
\AtBeginDocument{%
\unless\ifT@Pfrontespizio\ifTOPfront
@@ -4342,12 +4599,13 @@ Skipping any redefinition\MessageBreak}%
% |\mapstochar| that produce problems with that format,
% because they have a declared width of 0\,pt; this
% is no problem for \texttt{pdflatex}, but it is a problem
-% for the \sigla{PDF/A} format. Therefore these commands must be
-% replaced by equivalent ones that do not use zero-width
-% glyphs. For |\not|, another slash can be used, but in
-% order to have it the right size in all math typesetting
-% modes it is necessary to have a different command for
-% every mode; this is achieved with the |\mathchoice|
+% for the \sigla{PDF/A} format. Therefore, and only when
+% \texttt{pdflatex} is used for typesetting the document,
+% these commands must be replaced by equivalent ones that
+% do not use zero-width glyphs. For |\not|, another slash can
+% be used, but in order to have it the right size in all math
+% typesetting modes it is necessary to have a different
+% command for every mode; this is achieved with the |\mathchoice|
% primitive as such:
% \begin{macrocode}
\ifPDFTeX
@@ -4391,6 +4649,7 @@ Skipping any redefinition\MessageBreak}%
% of other useful packages, such as \pack{pdfpages}.
%
% \subsection{The \opz{classica} option}
+%
% As mentioned above, the \opz{classica} option was
% devised in order to cope with theses in humanities and
% the specifications came from Paolo Ciacchi, a student
@@ -4398,7 +4657,7 @@ Skipping any redefinition\MessageBreak}%
% thesis in classical Greek philology. The necessity
% of the large normal size derived from the necessity of
% having clear mark-up signs among the myriad signs
-% philologists use, that sometimes I believe that the
+% philologists use; sometimes I believe that the
% philological mark-up requires typesetting environments
% similar to the mathematical ones: in facts the material
% to be typeset does not form linear sequences, as in plain
@@ -4414,7 +4673,7 @@ Skipping any redefinition\MessageBreak}%
%
% The singular and plural masculine and feminine strings
% for “candidate” are redefined in the |topfront| module.
-% For other languages the configuration file is very handy.
+% For other languages using the configuration file is very handy.
%
% Since theses in humanities may end up to occupy several
% volumes\footnote{Classically “tomo” in Italian means “volume”,
@@ -4433,14 +4692,16 @@ Skipping any redefinition\MessageBreak}%
% is going to be printed in the title page. But when several
% tomes are involved, instead of using the |\frontespizio|
% macro or |frontespizio| environment, use the |\tomo| macro.
-% There is no equivalent to the |frontespizio| environment.
-% |\tomo| provides to stepping up the volume counter before
-% actually printing the new tome title page.
+% This |classica| thesis style does no allow to use a title page
+% environment; therefore all necessary data necessary for the
+% title pages of each tome must be specified before using the
+% \cs{tomo} macro. This macro provides to stepping up the volume
+% counter before actually printing the new tome title page.
% \begin{macrocode}
\newcounter{tomo}
\newcommand*{\tomo}{\clearpage\stepcounter{tomo}\boolfalse{topTPTlogos}%
\fr@ntespizio}
-% \end{macrocode}
+% \end{macrocode}^^A>>>>>>>>>>>
% Folios as well are to be redefined and also the page styles
% require a redefinition so as to being able to use old style
% numbers. The macro |\lapagina| (it's not a case that this
@@ -4469,10 +4730,13 @@ Skipping any redefinition\MessageBreak}%
% headings because the \texttt{classica} option changes
% completely the left and the right headers depending on the
% option \opz{autoretitolo}; in this case the left header
-% contains the candidate's name and a short version of the
+% contains the candidate's name and the (short) version of the
% thesis title, while the right heading contains the chapter
% (short) title; if this option is not in force, headings
-% appear as usual. The redefinition of the \texttt{headings}
+% appear as usual, but without using the settings relative to
+% the folio position and the header text position.
+%
+% The redefinition of the \texttt{headings}
% page style is made only if this option is in force. In case
% of two-sided printing where the left head and the right
% heads are different, the left heading contains the author
@@ -4501,7 +4765,7 @@ Skipping any redefinition\MessageBreak}%
% ragged margins, and eventually these boxes are set one
% next to the other with an intermediate glob of infinitely
% stretchable glue, and finally set in the header box with
-% a rule underneath the two of them. The result might be
+% a rule underneath both of them. The result might be
% barely acceptable if both vertical boxes do not exceed
% two lines and no words have to be hyphenated, but in
% general I believe it is an ugly layout; the user is warned!
@@ -4509,52 +4773,52 @@ Skipping any redefinition\MessageBreak}%
% without the ID number if any.
% \begin{macrocode}
\if@utoretitolo
- \if@twoside
-%
- \renewcommand*{\ps@headings}{\let\@mkboth\markboth%
- \def\@oddfoot{\null \hfill \textbf{\lapagina} \hfill \null}%
- \let\@evenfoot\@oddfoot
- \def\@evenhead{%
- \setbox\@intesta\hbox{\ifPDFTeX\latintext\fi
- \footnotesize\strut\textsc{%
- \@@author\ifcsvoid{@secondauthor}{\ et al.}: \@stitle}%
- }%
- \ifdim\wd\@intesta>\textwidth\headwrn{\titolo}\fi
- \underline{\makebox[\textwidth]{\box\@intesta}}}%
- \def\@oddhead{\ifPDFTeX\latintext\fi
- \setbox\@intesta\hbox{%
- \footnotesize\strut\textsl{\rightmark}}%
- \ifdim\wd\@intesta>\textwidth \headWarn{\section}\fi%
- \underline{\makebox[\textwidth]{\box\@intesta}}}%
- \def\chaptermark##1{\markright{\thechapter\ -- ##1}}%
- \def\sectionmark##1{}}%
- \else
- \renewcommand*{\ps@headings}{\let\@mkboth\markboth
- \def\@oddfoot{\null \hfill \textbf{\lapagina}\hfill \null}%
- \let\@evenfoot\empty\let\@evenhead\empty
- \def\@oddhead{{\setbox\z@\hbox{\ifPDFTeX\latintext\fi
- \footnotesize\textsc{%
- \@@author\ifcsvoid{@secondauthor}{}{\ et al.}: \@stitle}}%
- \setbox\tw@\hbox{\ifPDFTeX\latintext\fi
- \footnotesize\textsl{\rightmark}}%
- \dimen@=\dimexpr2em + \wd\z@ + \wd\tw@\relax
- \ifdim\dimen@<\textwidth \relax
- \else
- \setbox\z@\vbox{\hsize.48\textwidth\parindent\z@
- \raggedright
- \ifPDFTeX\latintext\fi\footnotesize\textsc{%
- \@@author\ifcsvoid{@secondauthor}{}{\ et al.}: \@stitle
- }}%
- \setbox\tw@\vbox{\hsize.48\textwidth\parindent\z@
- \raggedleft
- \ifPDFTeX\latintext\fi\footnotesize
- \textsl{\rightmark}}%
- \fi
- \setbox\@intesta\vbox to\z@{%
- \vss\hbox to\textwidth{\strut\box\z@\hfill\box\tw@}}%
- \underline{\box\@intesta}}}%
- \def\chaptermark##1{\markright{\thechapter\ -- ##1}}}
+ \if@twoside
+%
+ \renewcommand*{\ps@headings}{\let\@mkboth\markboth%
+ \def\@oddfoot{\null \hfill \textbf{\lapagina} \hfill \null}%
+ \let\@evenfoot\@oddfoot
+ \def\@evenhead{%
+ \setbox\@intesta\hbox{\ifPDFTeX\latintext\fi
+ \footnotesize\strut\textsc{%
+ \@@author\ifcsvoid{@secondauthor}{\ et al.}: \@stitle}%
+ }%
+ \ifdim\wd\@intesta>\textwidth\headwrn{\titolo}\fi
+ \underline{\makebox[\textwidth]{\box\@intesta}}}%
+ \def\@oddhead{\ifPDFTeX\latintext\fi
+ \setbox\@intesta\hbox{%
+ \footnotesize\strut\textsl{\rightmark}}%
+ \ifdim\wd\@intesta>\textwidth \headWarn{\section}\fi%
+ \underline{\makebox[\textwidth]{\box\@intesta}}}%
+ \def\chaptermark##1{\markright{\thechapter\ -- ##1}}%
+ \def\sectionmark##1{}}%
+ \else
+ \renewcommand*{\ps@headings}{\let\@mkboth\markboth
+ \def\@oddfoot{\null \hfill \textbf{\lapagina}\hfill \null}%
+ \let\@evenfoot\empty\let\@evenhead\empty
+ \def\@oddhead{{\setbox\z@\hbox{\ifPDFTeX\latintext\fi
+ \footnotesize\textsc{%
+ \@@author\ifcsvoid{@secondauthor}{}{\ et al.}: \@stitle}}%
+ \setbox\tw@\hbox{\ifPDFTeX\latintext\fi
+ \footnotesize\textsl{\rightmark}}%
+ \dimen@=\dimexpr2em + \wd\z@ + \wd\tw@\relax
+ \unless\ifdim\dimen@<\textwidth
+ \setbox\z@\vbox{\hsize.48\textwidth\parindent\z@
+ \raggedright
+ \ifPDFTeX\latintext\fi
+ \footnotesize\textsc{%
+ \@@author\ifcsvoid{@secondauthor}{}{\ et al.}: \@stitle
+ }}%
+ \setbox\tw@\vbox{\hsize.48\textwidth\parindent\z@
+ \raggedleft
+ \ifPDFTeX\latintext\fi\footnotesize
+ \textsl{\rightmark}}%
\fi
+ \setbox\@intesta\vbox to\z@{%
+ \vss\hbox to\textwidth{\strut\box\z@\hfill\box\tw@}}%
+ \underline{\box\@intesta}}}%
+ \def\chaptermark##1{\markright{\thechapter\ -- ##1}}}
+ \fi
\fi
% \end{macrocode}
%
@@ -4564,17 +4828,16 @@ Skipping any redefinition\MessageBreak}%
% like to have also unnumbered notes within numbered
% ones, as if they were two separate sets; of course
% specialised extension modules, such as, for example,
-% the |eledmac| or |reledmac| packages, are available on
-% CTAN, but as a poor man solution the command |\nota| was
-% introduced that inserts a note with a symbol as a note
-% mark; the symbol \emph{must} be a mathematical one as
-% the dagger or the double dagger; by default it is the
-% asterisk. At the same time the default definition of
-% the mathematical asterisk is that of a binary operator;
-% I have experienced that the note symbol gets a
+% the |eledmac|, |reledmac|, or |xreledmac| packages, are
+% available in \TeXLive and MiKTeX, but as a poor man
+% solution the command |\nota| was introduced that inserts
+% a note with a symbol as a note mark; the symbol \emph{must}
+% be a mathematical one as the dagger or the double dagger;
+% by default it is the asterisk. At the same time the default
+% definition of the mathematical asterisk is that of a binary
+% operator; I have experienced that the note symbol gets a
% better positioning if it is used as an ordinary symbol
-% through |\mathord|.
-% This is why its math code is redefined.
+% through |\mathord|. This is why its math code is redefined.
%
% A final unusual request was to be able to put a blank
% unnumbered note, as a (rather wide) note separator.
@@ -4599,7 +4862,7 @@ Skipping any redefinition\MessageBreak}%
% typesetting a page with one or more witty sentences.
% The first request has a trivial solution, but at least
% |\paginavuota| (alias |\emptypage|) is much shorter to
-% type in than its expansion.
+% type than its expansion.
%
% The environments \texttt{dedica} (alias \texttt{dedication})
% for the dedication, and \texttt{citazioni} (alias
@@ -4617,7 +4880,9 @@ Skipping any redefinition\MessageBreak}%
% The \texttt{citazioni}/\texttt{wittysentences}
% environment typesets its material with the default font
% shape series and size, so the author has to specify any
-% change s/he desires. These three commands, though, are
+% change s/he desires.
+%
+% These three commands and environments, though, are
% available irrespective of the \texttt{classica} option,
% so that they can be used also for theses outside the
% field of humanities.
@@ -4656,12 +4921,13 @@ Skipping any redefinition\MessageBreak}%
% \fi
%
% \subsection{The \texttt{topfront.sty} code}\label{sec:topfront}
+%
% This file is input by \texttt{toptesi}, version 6 and higher
% provided that no title page or thesis type options have been
% specified by the user; it can also be used as an independent
% extension module with (hopefully) any document class.
%
-% It contains all the definition for the composition of just
+% It contains all the definitions for the composition of just
% the title page of “standard” theses along the style
% requirements of \texttt{toptesi}, version 5.x or higher. It is not
% loaded by |toptesi| even when typesetting the title page
@@ -4670,9 +4936,9 @@ Skipping any redefinition\MessageBreak}%
% |toptesi| loading of |topfront| is inhibited and in its
% place another extension module, |toptesi-scudo|, is loaded.
% The same holds true with the other special thesis modules.
-% This latter files are described in a subsequent sections.
+% This latter files are described in subsequent sections.
%
-% It |topfront| makes use of an optional configuration file
+% The |topfront| package makes use of an optional configuration file
% where the user can define a lot of default information and
% all the infix language dependent strings that are peculiar
% to the title page. Among other things it can typeset
@@ -4720,8 +4986,8 @@ Skipping any redefinition\MessageBreak}%
\ifcsundef{ifsecondaria}{\newif\ifsecondaria\secondariafalse}{}
\ifcsundef{ifplurale}{\newif\ifplurale\pluralefalse}{}
-\ifcsundef{ifTOPfront}{\newif\ifTOPfront \TOPfronttrue
-\newif\ifevenboxes \evenboxesfalse}{}
+\ifcsundef{ifTOPfront}{\newif\ifTOPfront \TOPfronttrue}{}
+\ifcsundef{ifevenboxes}{\newif\ifevenboxes \evenboxesfalse}{}
\ifcsundef{c@tomo}{\newcounter{tomo}}{}
@@ -4877,15 +5143,13 @@ Skipping any redefinition\MessageBreak}%
\let\@stitle\empty
-\newcommand*{\titolo}[2][]{%
+\providecommand\titolo{}
+\RenewDocumentCommand\titolo{O{#2} m}{%
\ifbool{triennale}{%
\PackageWarning{topfront}{Il titolo deve essere impostato con
il comando \string\monografia}
}{%
-\def\@tempA{#1}\ifdefempty{\@tempA}%
- {\gdef\@stitle{#2}}{\gdef\@stitle{#1}}%
- \gdef\@titolo{#2}%
- }%
+ \gdef\@stitle{#1}}\gdef\@titolo{#2}%
}
\def\sottotitolo#1{\gdef\@subtitle{#1}}
% \end{macrocode}
@@ -4901,22 +5165,24 @@ Skipping any redefinition\MessageBreak}%
% of tetratricotomised blond hair}
%\end{verbatim}
% and the title page, for example, will contain something like this:\\[\bigskipamount]
-% \begin{minipage}{\textwidth}\centering
+% \fbox{\begin{minipage}{\textwidth}\centering
% {\Large Master Thesis\\ in\\ Applied Tetratricotomy\par}\bigskip
% {\huge Tetratricotomy of blond hair\par}\bigskip
% {\large Accurate measurements of the four fourths\\
% of tetratricotomised blond hair}
-% \end{minipage}\bigskip
+% \end{minipage}}\bigskip
+%
% \begin{macrocode}
\let\@materia\empty
\def\Materia#1{\def\@materia{#1}}\let\materia\Materia
% \end{macrocode}
%
% Things get more complicated for doctoral theses; in general
-% there is no supervisor; at most if a professor is assigned to supervise or control the PhD student's work this may be called
+% there is no supervisor; at most if a professor is assigned
+% to supervise or control the PhD student's work this may be called
% in whatever mode but here we assume his name is input
% with the command |\tutore| even if “tutor” does not appear
-% as the best choice; in any case in Italian “tutore” does
+% to be the best choice; in any case in Italian “tutore” does
% not have the same meaning as the English word “tutor”.
%
% Most Doctoral Schools require to name the School's director
@@ -4940,7 +5206,7 @@ Skipping any redefinition\MessageBreak}%
% this bundle accepts up to three names for each category.
% The |\second...| commands set the plural forms of the
% labels printed above the name lists. For the candidates
-% there are different commands to input ladies or gentlemen
+% there are different commands to input women or men
% names; according to the masculine (ending in `o')
% or feminine (ending in `a') commands, the appropriate
% true or false values are assigned to the boolean variable
@@ -4966,7 +5232,7 @@ Skipping any redefinition\MessageBreak}%
% specification so that different actions must be taken;
% if the option \texttt{classica} is in force, then the
% formatting of the “date” may be still different.
-% This command is aliased with |\esamendidottorato|
+% For PhD theses this command is aliased by |\esamendidottorato|
% which literally means “defence of the doctoral dissertation”;
% nevertheless both commands refer to a simple date
% in one of those formats.
@@ -5058,7 +5324,7 @@ Skipping any redefinition\MessageBreak}%
\def\annoaccademico#1{\ifclassica
\def\@submitdate{{\large\textsc{\AnnoAccademico}} {\Large\s@tanno#1!}}
\else
- \PackageWarning{toptesi}{\string\annoaccademico\space
+ \PackageWarning{topfront}{\string\annoaccademico\space
is usable only when the\MessageBreak
`classica' option is in force}%
\def\@submitdate{\AnnoAccademico\ #1 --- Needs the `classica' option}
@@ -5077,7 +5343,11 @@ Skipping any redefinition\MessageBreak}%
% literal information to be typeset in the title page.
% |\ciclodidottorato| requires an uppercase roman numeral
% (in Italy), but it can accept anything that can precede
-% the infix word “cycle”.
+% the infix word “cycle”. Notice: in many contries roman numerals
+% are generally used as ordinal adjectives; in other countries
+% roman numerals are just numbers; therefore the fortieth cycle
+% in Italy is marked as “XL ciclo”, while in France it is marked
+% as “XL\raise0.7ex\hbox{\scriptsize e} cycle”.
% Macros |\corsodilaurea| and |\corsodidottorato| specify
% the degree course qualification; you would specify just
% “Elettronica”, for example, and the module will write
@@ -5244,8 +5514,7 @@ Skipping any redefinition\MessageBreak}%
% override the configuration ones.
%
% \begin{description}[noitemsep]
-% \def\Item[#1]{\item[\normalfont\texttt{\char92#1}]
-% sets or changes the string}
+% \def\Item[#1]{\item[\cs{\char92#1}] sets or changes the string}
% \Item[FacoltaDi] “Facolt\`a di” in, say, “Faculty of”
% \Item[DottoratoIn] “Dottorato in” in, say, “PhD in”
% \Item[CorsoDiLaureaIn] “Corso di Laurea in” in, say,
@@ -5311,14 +5580,13 @@ Skipping any redefinition\MessageBreak}%
% the single |\CandidateName| that should be used in a
% language depended way and with the correct number and
% gender once for all.
-% The four endings in the Italian strings allow to
-% exercise the correct selection only for Italian;
-% a specific test is made inside the |\frontespizio|
-% command; because of this, the same machinery cannot
-% be used, say, for French but maybe in the future this
-% feature is resolved in a proper way. The same is true
-% for the supervisor and the co-supervisor strings that
-% may be changed once for all with |\AdvisorName| and
+% The four endings in the Italian strings used to allow
+% the correct selection only for Italian.
+% With the current of this TOPtesi bundle the tests work
+% in a different way, so as to perform correctly also in
+% other languages. The same is true for the supervisor
+% and the co-supervisor strings that may be changed once
+% for all with |\AdvisorName| and
% |\CoAdvisorName|.
% \begin{macrocode}
\IfFileExists{\jobname.cfg}{\input{\jobname.cfg}}%
@@ -5511,7 +5779,7 @@ Skipping any redefinition\MessageBreak}%
% environment, we have to behave as with the |\frontespizio|
% command, but we must test for a possible asterisk following
% the command; for this reason we defined the |\TPTmaybestar|
-% that% absorbs one following token: if the token is an
+% that absorbs one following token: if the token is an
% asterisk, we set the appropriate settings for the previous
% behaviour of the isolated command, but if it is
% not an asterisk we must set it back into the list after
@@ -5714,7 +5982,7 @@ Skipping any redefinition\MessageBreak}%
% Going down in the title page, now comes the optional
% insertion of the university logo(s); “optional” in both
% meanings: one or more university logos are not generally
-% required in a thesis, and in case it depends if the
+% required in a thesis, and, in case, it depends if the
% logo(s) have to be put in the header or here.
% This is a simple task since the |\logosede| already
% defined the contents to the box |\TPT@logobox|, and this
@@ -5722,7 +5990,7 @@ Skipping any redefinition\MessageBreak}%
% with its argument in a specific line of the configuration
% file or within the |frontespizio| environment.
% If such box |\TPT@logobox| is void, the already defined
-% |\printloghi| macro does not do anything.
+% |\printloghi| macro does not do anything.^^A >>>>>>
% \begin{macrocode}
\unless\iftopTPTlogos
{\vfill\centering \printloghi\par}\fi
@@ -5784,7 +6052,7 @@ Skipping any redefinition\MessageBreak}%
%
% For the supervisor(s) and the candidate(s) name(s)
% a different approach is used for each one of the three
-% categories of theses. If a bachelor degree
+% categories of theses persons. If a bachelor degree
% report is dealt with, the name of the \emph{single}
% candidate is centred and written in caps-and-small-caps.
% \begin{macrocode}
@@ -5800,7 +6068,7 @@ Skipping any redefinition\MessageBreak}%
% line with proper number and gender; in the second line
% the first name, and in the subsequent lines,
% if there are any, the other names. These virtual boxes
-% actually contain a tabular environment each; these
+% in reality contain a tabular environment each; these
% environments shall be actually typeset when these virtual
% box macros are executed. If the \texttt{classica} option
% is in force no label is set over the principal advisor
@@ -5824,7 +6092,7 @@ Skipping any redefinition\MessageBreak}%
% below the candidate's name.
% If the user wants it typeset on the same line and or with a
% different label s/he has to redefine the macro |\IDlabel| by
-% means of the \cs{ID} macro described in previous sections;
+% means of the \cs{ID} macro described in previous sections.
%
% Example redefinitions are shown in the sample files.
% Notice that with the new definition of the candidates' setting
@@ -5990,9 +6258,9 @@ Skipping any redefinition\MessageBreak}%
% words and labels, and the commands to introduce the
% specific thesis data; eventually it specifies the title
% page layout and provides for its generation and to a
-% copyright and disclaimer sentence on its verso page.
+% copyright and disclaimer sentence on its page verso.
%
-% It produces also a colophon where some data concerning
+% The module produces also a colophon where some data concerning
% the thesis typesetting details are given. This colophon
% is saved and used on the last even page of the complete thesis.
%
@@ -6049,27 +6317,29 @@ Skipping any redefinition\MessageBreak}%
% \begin{macrocode}
\AtBeginDocument{%
\providecommand\diff{}\renewcommand{\diff}{\mathop{}\!\mathrm{d}}
-\providecommand{\gei}{\ensuremath{\mathop{\mathrm{\mathstrut j}}\nolimits}}
+\providecommand{\iu}{\ensuremath{\mathop{\mathrm{\mathstrut i}}\nolimits}}
+\providecommand{\ju}{\ensuremath{\mathop{\mathrm{\mathstrut j}}\nolimits}}
\providecommand{\eu}{\ensuremath{\mathop{\mathrm{e}}\nolimits}}
-\let\iu\gei}
+\let\gei\ju}
% \end{macrocode}
% Such a definition allows to typeset math expression containing
% integrals with a small space between the integrand and the
% integrating differential; on the contrary the leading space does
% not disturb typesetting differential equations. The above
% definitions include also the \sigla{ISO} compliant ways of writing
-% the Napier number `e', and the imaginary unit |\iu| that
-% sets an operator-like roman `j' as it is customary in
-% most engineering disciplines. The alias |\iu| to the |\gei|
-% command may be redefined if the PhD student wants to use for
-% example ‘i’; the example file \texttt{toptesi-scudo-example.tex}
-% uses the Greek ‘iota’ and specifies that this use is \emph{wrong}!
+% the Napier number `e', and the two forms of imaginary unit |\iu|
+% and |\ju| that set an operator-like roman `i' or`j' as it is customary in
+% most engineering disciplines. The common alias |\gei| to the |\ju|
+% command may be redefined if the PhD student wants to use a common
+% phonetically transliterated name for the letter `j'; the example file
+% \texttt{toptesi-scudo-example.tex} uses the Greek ‘iota’ and specifies
+% that this use is \emph{wrong}!
%
% Next an option is defined, |mybibliostyle| which allows the user to
% establish his own style for the bibliography. By default the
% |toptesi-scudo| module loads |biblatex| with a set of options that
% allow numerical listing and numerical citation according to the IEEE
-% standards for its Transaction. PhD students doing their theses in
+% standards for its Transactions. PhD students doing their theses in
% other scientific domains may use different styles for bibliographics
% listings and citation methods. By setting this option |mybibliostyle|
% among the class ones, it is automatically treated as a global option
@@ -6115,12 +6385,11 @@ Skipping any redefinition\MessageBreak}%
% are preferred by many users who are not aware that
% computations are now native of modern typesetting
% programs\footnote{All the three typesetting programs we are dealing
-% with here. \LuaLaTeX\ can do also floating point computations
-% thanks to the language Lua; all programs may benefit from the
-% advances of the \LaTeX3 language, that has a special facilities
+% with here. All modern programs may benefit from the
+% advances of the \LaTeX3 language, that has special facilities
% to perform floating point calculations.}; also advanced
% tests are natively available with such programs, but
-% since this class loads the |etooolbox|, its powerful
+% since this class loads the |etoolbox|, its powerful
% and robust commands are already available; therefore
% these packages are loaded only for the user comfort,
% although they are not really required.
@@ -6162,7 +6431,7 @@ Skipping any redefinition\MessageBreak}%
\@ifpackageloaded{xparse}{}{%
\RequirePackage{xparse}}% Command and environment advanced definitions
\RequirePackage{lscape} % Supports landscape Layout
-\RequirePackage{setspace} % Define line spacing in paragraph. Don't use!
+\RequirePackage{setspace} % Define line spacing in paragraph. Don't use it!
\RequirePackage{calc} % Calculation macros
\RequirePackage{ifthen} % Conditional statements
\RequirePackage{caption} % Configure captions
@@ -6178,7 +6447,7 @@ Skipping any redefinition\MessageBreak}%
% groups is defined; they are mostly examples of “how to”;
% and in particular they are models to define other
% nomenclature groups. Notice that the string comparison
-% tests are made through the testing robust commands
+% tests are made through the robust testing commands
% provided by the |etoolbox| package.
% \begin{macrocode}
\usepackage[intoc]{nomencl}% Generate nomenclatures or glossaries
@@ -6198,10 +6467,10 @@ Skipping any redefinition\MessageBreak}%
% raw file must be processed by means of program
% \prog{makeindex} with special options. Assuming
% that your thesis main file is named |MyPhDthesis.tex|,
-% after compiling with pdfLaTeX, you have to open a
+% after compiling with pdfLaTeX, you should open a
% terminal, change the working directory into that
% where your main file is stored, and
-% issue and execute the line command
+% enter and execute the line command
%{\small
%\begin{verbatim}
%makeindex -s nomencl.ist -t MyPhDthesis.nlg -o MyPhDthesis.nls MyPhDthesis.nlo
@@ -6223,9 +6492,11 @@ Skipping any redefinition\MessageBreak}%
% procede by closing the auxiliary file that collect
% nomenclature entries, and run \prog{makeindex} with
% the proper options and file names directly through the
-% “magic command” |\write18|.
-%
-% We then define a new command
+% “magic command” |\write18|. Again all this is automatically
+% performed by the macros defined by the \file{toptesi-scudo}
+% module, therefore your nomenclature is up to date at each
+% run, without any need to explicitly use unusual undocumented
+% native \TeX\ commands. In facts we define a new command
% to process the nomenclature files and print them out.
%
% Again the test for an empty optional argument is made by
@@ -6277,7 +6548,7 @@ Skipping any redefinition\MessageBreak}%
% |resources.bib|, if it exists; since a generic name is not recommended,
% we suggest to name at least one of your databases with the same name
% as the user's thesis master file with extension |.bib|; the |\jobname|
-% macro, actually contains the thesis master file. If neither
+% macro, actually contains the thesis master file name. If neither
% |resources.bib| nor |\jobname.bib| exist or the typesetting engine
% cannot find them, it is the user's responsibility to create a |.bib|
% file and include it in his/her master file preamble as an argument to
@@ -6425,6 +6696,11 @@ security of personal data.}
\newcommand\printloghi{\unless\ifvoid\TPT@logobox\usebox{\TPT@logobox}\fi}
% \end{macrocode}
+% The author/candidate name by defaukt is underlined by five spaced stars; This is the decoration approved by the ScuDo directors. After all, such a decoration might be a little soberer something else, such as a thin rule, or simply omitted; this is possible by redefining the following macro:
+% \begin{macrocode}
+\newcommand\fivestars{* * * * *}
+% \end{macrocode}
+%
% Next the disclaimer and the signature macros are defined;
% the disclaimer text and the signature layout may be changed
% by these commands; but if the user does not use these
@@ -6487,7 +6763,7 @@ Turin, \@examinationdate
\@subtitle
{\Large\bfseries \@author\par}
\smallskip
-\mbox{* * * * * *}
+\mbox{\fivestars}
\vspace{\stretch{1}}
{\large\bfseries \ifcase\@supervisornumber
@@ -6609,13 +6885,13 @@ This class is available in every up-to-date and complete
% \begin{macrocode}
%%
%%================================================================
-%% This file is the only file of the TOPtesi bundle that the user
-%% can modify without restrictions in order to customise the
-%% contents of this configuration file to his/her needs. The user
-%% can add or remove lines, comment or uncomment lines, change the
-%% arguments to macros, add definitions and so on.
%% Use this file by copying the relevant section to another file
%% to be named as the thesis main file and with extension .cfg.
+%% This copied and renamed file is the only file of the TOPtesi
+%% bundle that the user can modify without restrictions in order to
+%% customise the contents of this configuration file to his/her needs.
+%% The user can add or remove lines, comment or uncomment lines,
+%% change the arguments to macros, add definitions and so on.
%% This bundle will try to read "\jobname.cfg"; if this file does
%% not exist, the bundle files don't do anything. This implies that
%% the provided file toptesi.cfg is to be used as a model, not to
@@ -6662,6 +6938,7 @@ This class is available in every up-to-date and complete
% \fi
%
% \subsection{The \texttt{topcoman.sty} code}
+%
% This file may be used as an independent extension package
% for the \texttt{report} document class, and possibly for
% other classes.
@@ -6705,7 +6982,7 @@ This class is available in every up-to-date and complete
% Greek letters taken from the math italic font; the
% upright ones are still available within the |\mathrm|
% command argument.
-% Attention: \cs{DeclareSlantedCapitalGreekLetters} is defined
+% Warning: \cs{DeclareSlantedCapitalGreekLetters} is defined
% only when using \prog{pdflatex}; with the other two engines
% it is disabled and produces a warning.
% \begin{macrocode}
@@ -6758,7 +7035,8 @@ This class is available in every up-to-date and complete
% \texttt{babel} language if the thesis is typeset with
% \textsf{pdflatex} that loads that package; these commands
% are not predefined if the thesis is typeset with \XeLaTeX\
-% or \LuaLaTeX\ that do not load the \texttt{babel} package;
+% or \LuaLaTeX\ that often load \pack{polyglossia} instead
+% of the \pack{babel} package;
% but remember; this package may be used as a stand alone
% one, without the initial call by the \texttt{toptesi}
% document class, so that the language Italian might be
@@ -6768,60 +7046,69 @@ This class is available in every up-to-date and complete
% \begin{macrocode}
\providecommand{\ohm}{\textormath{\textohm}{\mathrm{\Omega}}}
\@ifpackageloaded{toptesi}{%
-\providecommand\ped{}\providecommand\ap{}%
-\renewcommand*{\ped}[1]{\textormath{\textsubscript{#1}}{_{\mathrm{#1}}}}%
-\renewcommand*{\ap}[1]{\textormath{\textsuperscript{#1}}{^{\mathrm{#1}}}}}%
-{\providecommand*{\ped}[1]{\textormath{\textsubscript{#1}}%
- {_{\mathrm{#1}}}}%
-\providecommand*{\ap}[1]{\textormath{\textsuperscript{#1}}%
- {^{\mathrm{#1}}}}}
-%
-\@ifpackageloaded{siunitx}{\def\unit#1{\si{\,#1}}}%
- {\providecommand\unit{}%
- \renewcommand\unit[1]{\ensuremath{{\mathrm{\,#1}}}}%
- }
-\providecommand{\gei}{\ensuremath{\mathop{\mathrm{\mathstrut j}\nolimits}}}
+ \providecommand\ped{}\providecommand\ap{}%
+ \renewcommand*{\ped}[1]{\textormath{\textsubscript{#1}}{_{\mathrm{#1}}}}%
+ \renewcommand*{\ap}[1]{\textormath{\textsuperscript{#1}}{^{\mathrm{#1}}}}%
+ \providecommand\diff{}\renewcommand{\diff}{\mathop{}\!\mathrm{d}}
+%
+}{%
+ \providecommand*{\ped}[1]{\textormath{\textsubscript{#1}}%
+ {_{\mathrm{#1}}}}%
+ \providecommand*{\ap}[1]{\textormath{\textsuperscript{#1}}%
+ {^{\mathrm{#1}}}}%
+}
+%
+\@ifpackageloaded{siunitx}{%
+ \def\unit#1{\si{\,#1}}
+}{%
+ \providecommand\unit{}%
+ \renewcommand\unit[1]{\ensuremath{{\mathrm{\,#1}}}}%
+}
+\providecommand{\gei}{\ensuremath{\mathop{\mathrm{\mathstrut j}}\nolimits}}
\providecommand{\eu}{\ensuremath{\mathop{\mathrm{e}}\nolimits}}
-\providecommand{\micro}{\textormath{\textmu}{%
- \ifPDFTeX
- \ifdefined\muup\muup\else\mbox{\textmu}\fi
- \else
- \mathup{\mu}%
- \fi
-}}
+\providecommand{\micro}{%
+ \textormath{\textmu}{%
+ \ifPDFTeX
+ \ifdefined\muup\muup\else\mbox{\textmu}\fi
+ \else
+ \mathup{\mu}%
+ \fi
+ }%
+}
\providecommand{\gradi}{\textormath{\textdegree}{^\circ}}
% \end{macrocode}
%
-% Before this version 6.xx.yy this package used to define
+% Before this major version 6, this package used to define
% the command |\listing| for listing program sources; those
-% definitions got very obsolete in front of several packages
-% already available for this task. For example the package
-% |listings|, very elegant also for the various configurations
+% definitions became obsolete compared to several packages
+% available for this task. For example the package
+% |listings|,that is very elegant also for the various configurations
% it can use; un fortunately it works fine only for verbatim
% sources that contain only \textsc{ascii} characters; yes,
% it is possible the definition of special commands to typeset
% isolated characters not belonging to the \textsc{ascii}
% table, but it is an error prone process. Giving up the
-% niceties of |listings|, the |fancyvrb| works very fine
+% niceties of |listings|, the |fancyvrb| works very well
% with \sigla{UNICODE} and UTF-8 encoded characters.
%
% For backwards compatibility we maintain the command
% |\listing| as a user interface to the |VerbatimInput|
% of package |fancyvrb| with an initial setting of a
-%|\small| font size.
+% |\small| font size.
% \begin{macrocode}
\RequirePackage{fancyvrb}
\fvset{fontsize=\small}
\let\listing\VerbatimInput
% \end{macrocode}
+%
% Of course before using |\listing| the user can set any other
% special configuration s/he desires among those usable with
-% package |fancyvrb|; the default set up shown above is good
-% for \LaTeX\ code input, as well as for any programming language, whose
-% source lines are shorter than 75--80 characters, depending
+% package |fancyvrb|; the default set-up shown above is good
+% for \LaTeX\ code input, as well as for any programming language,
+% whose source lines are shorter than 75--80 characters, depending
% on the normal font size and the document text width; the user
-% can edit the source file as well as setting a smaller font
-% size than |\small|. In certain circumstances the user
+% can edit the source file as well as setting a font
+% size smaller than |\small|. In certain circumstances the user
% should accept protruding lines as well as a compromise
% between editing the source file and selecting a smaller
% font size. This is not a bug of the package, nor a fault
@@ -6834,7 +7121,7 @@ This class is available in every up-to-date and complete
% Remember that the comma as a decimal separator is
% required for all languages except English. If you
% use this module outside TOPtesi, but as an extension
-% of other classes or modules, it's up to you to define
+% to other classes or modules, it's up to you to define
% an “intelligent comma” macro or to load either the
% |icomma.sty| or the |ncccomma.sty| modules that define
% such a macro: the |icomma| package defines the comma
@@ -6858,10 +7145,10 @@ This class is available in every up-to-date and complete
% on and off by using the commands |\IntelligentComma|
% and |\NoIntelligentComma|.
%
-% The solution of the solutions would be using the |siunitx|
-% package, whose command |\num| handles any fractional
-% decimal number in the proper way adding also the digit
-% triplets separation of digits when they exceed the number
+% The best solution would be using the |siunitx|
+% package; its |\num| command handles any fractional
+% decimal number in the proper way and also adds the
+% triplet digit separation when they exceed the number
% of four before and/or after the decimal separator. In
% many cases this might be a heavy burden to load a whole
% complex package just for this task, but |siunitx|
@@ -6897,11 +7184,11 @@ This class is available in every up-to-date and complete
%\textsf{B\simulatedSC{ib}\TeX}
%\end{verbatim}
% in order to get a decent approximation of small caps; this
-% poor man solution should not be necessary when using OpenType
+% poor man solution is not necessary when using OpenType
% fonts that have their facilities to use fake small caps in case
-% this shape was missing from the collection. This is why the
-% \cs{simulatedSC} macro is defined only if |pdfLaTeX| is being
-% used for typesetting.
+% this shape was missing from the selected font collection.
+% This is why the \cs{simulatedSC} macro is defined only if
+% |pdfLaTeX| is being used for typesetting.
%
% A user, Antonio Mele, suggested and requested the
% possibility of having the figure and table names
@@ -6943,10 +7230,16 @@ This class is available in every up-to-date and complete
%\iffalse
%<*topmon>^^A MONOGRAFIA -- TRIENNALE
%\fi
-%\subsection{The \texttt{monografia} module code}
+%\subsection{The \texttt{toptesi-monografia} module code}
+%
% We start by checking if certain files have ben loaded and in
% case we load then. We check if certain switches are defined,
% and in case we define such switches.
+% Notice that by loading this module for bachelor theses the facilities
+% for selecting the folio and/or the header text position are not
+% available if this module is used with any class different from
+% \class{toptesi}; after all this module defines mainly the way
+% of typesetting the title page.
% \begin{macrocode}
\monografiatrue
\@ifpackageloaded{etoolbox}{}{\RequirePackage{etoolbox}}
@@ -7092,6 +7385,7 @@ This class is available in every up-to-date and complete
\newcommand\StrutturaDi[1]{\gdef\@strutturadi{#1\unskip\xspace}}
\newcommand\struttura[2][]{\gdef\@struttura{\ifempty{#1}{}{#1 }%
\@strutturadi #2}}
+\let\FacoltaDi\StrutturaDi \let\facolta\struttura
% \end{macrocode}
% Generally bachelor degree courses are not developed within
% international agreements such as Erasmus, but it may not be
@@ -7154,9 +7448,9 @@ This class is available in every up-to-date and complete
% two more commands are optionally used: |\luogo| to establish
% the location of the signature, and |\giorno| to establish a
% signature date different from the current date. If the |\giorno|
-% is not specified, its value maintains a meaningless default
+% is not specified, its value is a meaningless default
% string, and upon testing for such a string, no location,
-% date and signature is typeset in the legal page; if the
+% date and signature is typeset in the copyright page; if the
% current date should be used, the user should specify
% |\giorno{}|, with a really empty argument.
% \begin{macrocode}
@@ -7183,7 +7477,7 @@ This class is available in every up-to-date and complete
% The label for the candidate list requires a list of comma
% separated names, to a maximum of four names; in order they
% should be the singular masculine, the plural masculine, the
-% singular feminine, and the plural feminine names. No one is
+% singular feminine, and the plural feminine names. No one is
% mandatory, and the list may be completely empty if the label
% should remain blank. The list is scanned and the names are
% assigned to some internal variables that will be used according
@@ -7200,13 +7494,13 @@ This class is available in every up-to-date and complete
%\end{ttsintassi}
% This command, as it may be seen, may be used also to set the
% name list in languages different from Italian.
-% It goes by itself that if the user typesets the thesis in a
+% It goes without saying that if the user typesets the thesis in a
% language where names are gender indifferent (as English,
% Spanish, and other ones) s/he has two choices: ether s/he
% uses the command with just two arguments, as shown above,
% and uses only the masculine commands |\candidato|,
% |\secondocandidato|, and |\terzocoandidato| even with names
-% of female students, or s/he specifies the same names in the
+% of student women, or s/he specifies the same names in the
% arguments~3 and~4, as in arguments ~1 and~2. Lacking this
% action, the corresponding titling names are blank.
% \begin{macrocode}
@@ -7238,7 +7532,7 @@ This class is available in every up-to-date and complete
% from the \LaTeX\ kernel environments that accepts an optional
% asterisk that becomes part of the environment name, and must
% be repeated in the closing environment statement, with the
-% |xparse| facilities the asterisk is just an argument to the
+% |xparse| facilities the asterisk is just an argument among the
% argument list of the opening command: therefore the source
% file contains an opening statement of the form
% |\begin{environment}*|, not |\begin{environment*}|. The user
@@ -7394,7 +7688,8 @@ This class is available in every up-to-date and complete
%\iffalse
%<*topmag>^^A MAGISTRALE
%\fi
-% \subsection{Code for \texttt{master} thesis}
+% \subsection{The \texttt{toptesi-magistrale} module code}
+
% Here we document the code for the \opz{magistrale} option.
% It is a little more complicated than the code for other
% thesis types, because the title page may be typeset in different
@@ -7409,6 +7704,9 @@ This class is available in every up-to-date and complete
% In facts if this module does not receive the suitable
% settings from package |toptesi|,it is possible to call it
% with the suitable options as explained below.
+% In any case if the module is loaded by a class different
+% from \class{toptesi} the facilities for chosing the folio and/or
+% the header text positions are not available.
% \begin{macrocode}
\@ifpackageloaded{etoolbox}{}{\RequirePackage{etoolbox}}
\@ifpackageloaded{xspace}{}{\RequirePackage{xspace}}
@@ -7449,8 +7747,7 @@ This class is available in every up-to-date and complete
% in the counter remains available anyhow; therefore it is
% not excluded that multiple tomes might be typeset in one
% output \sigla{PDF} file to be split in separate files as described
-% in section~\ref{sec:topmagistrale}; I did not test this
-% functionality but I do not exclude it.^^A CONTROLLARE
+% in section~\ref{sec:topmagistrale}.
% \begin{macrocode}
\ifcsundef{c@tomo}{\newcounter{tomo}{\setcounter{tomo}{0}}}{}
\providecommand\tomo{}
@@ -7560,10 +7857,9 @@ This class is available in every up-to-date and complete
% \begin{macrocode}
\let\@stitle\empty % default short title string
-\newcommand*{\titolo}[2][]{%
-\ifstrequal{#1}{}%
- {\gdef\@stitle{#2}}{\gdef\@stitle{#1}}%
- \gdef\@titolo{#2}%
+\providecommand\titolo{}
+\RenewDocumentCommand{\titolo}{O{#2} m}{%
+ \gdef\@stitle{#1}\gdef\@titolo{#2}%
}%
\def\sottotitolo#1{\gdef\@subtitle{#1}}
@@ -7640,7 +7936,7 @@ This class is available in every up-to-date and complete
% Here we define the necessary commands to fill up a comma
% separated list of logo graphic-file names; we define
% everything up to the |\printlogos| command that provides
-% to printing a list of images, duly separated by adequate
+% printing a list of images, duly separated by adequate
% space, all scaled to the same height, and, possibly, even
% the whole logo string duly scaled to fit in the title page
% width. The |\logosede| command, that can be used several
@@ -7648,12 +7944,12 @@ This class is available in every up-to-date and complete
% argument consisting in a dimension; it is used to scale the
% height of the logo image to the desired value, so that the
% whole string of images does not have unusual different
-% logo heights. This dimension is preset to one seventh of
-% the |\textwidth| and on the average it is well suited. With
-% the standard |toptesi| class printed on A4 paper, such height
-% equals 25\,mm; of course on smaller paper it is proportionally
-% smaller; on American sized sheets it may be a little larger,
-% but in general it is adequate to the page size.
+% logo heights. This dimension is preset to 80\% the mean
+% width of the page margins, and on the average it is well suited.
+% With the standard |toptesi| class printed on A4 paper, such
+% height equals about 25\,mm; of course on smaller paper it is
+% proportionally smaller; on American sized papers it may be
+% a little larger, but in general it is adequate to the page size.
% \begin{macrocode}
\newlength{\TPT@logospace}\TPT@logospace=3em\relax
\newsavebox{\TPT@logobox}
@@ -7706,7 +8002,7 @@ This class is available in every up-to-date and complete
%
% Here we define the preset strings; most of them are empty
% strings, but some are real words; the setting commands
-% listed before can easily be used to localise such string
+% listed before can easily be used to localise such strings
% in different languages.
% \begin{macrocode}
\@ifundefined{@titolo}{\def\@titolo{}}{}
@@ -7817,7 +8113,7 @@ This class is available in every up-to-date and complete
% is wrong.
%
% This choice was made because its programming is simpler,
-% but in view of the end user it is simpler to use: for
+% but also, in view of the end user, it is simpler to use: for
% example, if the user does not use the asterisk for typesetting
% the logos at the top of the page, and in a second time
% s/he decides that the title page should be typeset with
@@ -8024,7 +8320,7 @@ This class is available in every up-to-date and complete
\par\clearpage
% \end{macrocode}
%
-% It is useful to remind that the legal page in general is not
+% It is useful to remind that the copyright page in general is not
% compulsory, but it is becoming frequently requested by more
% and more universities. The user can fill up the
% |\retrofrontespizio| argument with as many paragraphs as are
@@ -8054,7 +8350,7 @@ This class is available in every up-to-date and complete
%\iffalse
%<*topdoc>^^A DOTTORALE
%\fi
-% \subsection{The \texttt{toptesi-dottorale} module}
+% \subsection{The \texttt{toptesi-dottorale} module code}
% What follows is mainly a replica of the |topfront| module
% where useless commands have been eliminated; “useless”
% in view of creating a title page for a Ph.D.~thesis.
@@ -8306,7 +8602,7 @@ This class is available in every up-to-date and complete
\let\struttura\facolta
% \end{macrocode}
%
-% next we define how to handle one or more logos; even in
+% Next we define how to handle one or more logos; even in
% PH.D. schools there might be situations where the Ph.D.~program
% has been carried on in several universities; it might be
% required to set the logos of the universities where the research
@@ -8452,10 +8748,10 @@ This class is available in every up-to-date and complete
% We now start setting the |ThesisTitlePage| environment;
% we use the |xparse| functionality to define it; the
% environment accepts an optional asterisk as its first
-% and only argument, that is a single token may be entered
-% without brackets as the very first token after the
-% environment opening statement. If the user wants to use
-% this optional argument, s/he must enter
+% and only (boolean type) argument, that is a single token
+% is entered without brackets as the very first token after
+% the environment opening statement. If the user wants to
+% use this optional argument, s/he must enter
% |\begin{ThesisTitlePage}*| with the asterisk after the
% closing brace. The presence of the asterisk sets the
% logo position to the title page lower half, while its
@@ -8705,7 +9001,10 @@ This class is available in every up-to-date and complete
%</topdoc>
%\fi
%
+%^^A SCUOLA SECONDARIA SUPERIORE
+%
% \subsection{The \texttt{toptesi-sss} module code}
+%
% The module for typesetting the high-school final-work
% title-page starts here. We avoid using a |.def| file and put
% all necessary commands in one file.
@@ -8738,7 +9037,6 @@ This class is available in every up-to-date and complete
\RequirePackage{ifthen} % Conditional statements
\RequirePackage{booktabs} % professional rules in tables
\RequirePackage{multirow} % Multirow table cells are not professional
-\RequirePackage[autostyle]{csquotes} % necessary for biblatex
\ifPDFTeX \RequirePackage{indentfirst}\fi
\raggedbottom
% \end{macrocode}
@@ -8865,7 +9163,9 @@ This class is available in every up-to-date and complete
% \begin{macrocode}
\ifBlank{\@SSSLogo}%
{\vspace{\stretch{1}}}%
- {\includegraphics[height=30mm]{\@SSSLogo}}\par\vspace{\stretch{1}}
+ {\vspace{\stretch{1}}\setbox0\hbox{\includegraphics[height=30mm]{\@SSSLogo}}
+ \ifdim\wd0>\linewidth \resizebox{\linewidth}{!}{\box0}\else\box0\fi
+ \par\vspace{\stretch{1}}}
% \end{macrocode}
%
% The examining committee chairperson name and the Ministry
@@ -8978,4 +9278,13 @@ Anno scolastico \@annoscolastico}}
% package xparse new (may be not that new, but new for me) syntax
% that allows to declare the optional argument descriptors so as to
% inherit the values of other arguments.Such syntax avoids a lot of
-% fragile tests, and is very handy. \ No newline at end of file
+% fragile tests, and is very handy.
+%%%% (version 6.3.07) corrected "Attention!" and "It goes by itself"
+% by "Warning!" and "It goes without saying" respectively.
+%%%% (version 6.4.02) Besides correcting some typos, some options were
+% added in order to set page headers and folios on specific positions;
+% by default headers are centred, and folios are centred in footers;
+% options allow to shift them towards the external margins and
+% sometimes to set footers in headers. Moreover the PDF/A-2b is now
+% described and suggested to set it as the preferred PDF/A conformance
+% level. Documentation has been modified accordingly.
diff --git a/Master/texmf-dist/source/latex/caption/totalcount.dtx b/Master/texmf-dist/source/latex/totalcount/totalcount.dtx
index a2e0d934a39..291484587f7 100644
--- a/Master/texmf-dist/source/latex/caption/totalcount.dtx
+++ b/Master/texmf-dist/source/latex/totalcount/totalcount.dtx
@@ -18,7 +18,7 @@
%
% This Current Maintainer of this work is Axel Sommerfeldt.
%
-% This work consists of the file totalcount.dtx,
+% This work consists of the files totalcount.ins, totalcount.dtx,
% and the derived file totalcount.sty.
%
% \fi
@@ -83,7 +83,7 @@
% This package has version number \docversion.}}%^^A
% {The totalcount package}}
% \author{Axel Sommerfeldt\\
-% \url{https://gitlab.com/axelsommerfeldt/caption}}
+% \url{https://gitlab.com/axelsommerfeldt/totalcount}}
% \date{\docdate}
% \maketitle
%
diff --git a/Master/texmf-dist/source/latex/totalcount/totalcount.ins b/Master/texmf-dist/source/latex/totalcount/totalcount.ins
new file mode 100644
index 00000000000..a1e82fb5616
--- /dev/null
+++ b/Master/texmf-dist/source/latex/totalcount/totalcount.ins
@@ -0,0 +1,42 @@
+\def\batchfile{totalcount.ins}
+\input docstrip
+
+\askforoverwritefalse
+\keepsilent
+
+\preamble
+
+Copyright (C) 2010-2018 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
+
+https://gitlab.com/axelsommerfeldt/totalcount
+
+--------------------------------------------------------------------------
+
+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
+ http://www.latex-project.org/lppl.txt
+and version 1.3 or later is part of all distributions of LaTeX
+version 2003/12/01 or later.
+
+This work has the LPPL maintenance status "maintained".
+
+This Current Maintainer of this work is Axel Sommerfeldt.
+
+This work consists of the files totalcount.ins, totalcount.dtx,
+and the derived file totalcount.sty.
+
+\endpreamble
+
+\generate{\file{totalcount.sty}{\from{totalcount.dtx}{package}}}
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the file}
+\Msg{* `totalcount.sty' into a directory searched by TeX.}
+\Msg{*}
+\Msg{* To produce the documentation run the file}
+\Msg{* `totalcount.dtx' through LaTeX.}
+\Msg{*}
+\Msg{***********************************************************}
diff --git a/Master/texmf-dist/source/latex/tracklang/tracklang.dtx b/Master/texmf-dist/source/latex/tracklang/tracklang.dtx
index e071563fe3e..22dd36860ef 100644
--- a/Master/texmf-dist/source/latex/tracklang/tracklang.dtx
+++ b/Master/texmf-dist/source/latex/tracklang/tracklang.dtx
@@ -1,16 +1,16 @@
%\iffalse
% tracklang.dtx generated using makedtx version 1.2 (c) Nicola Talbot
% Command line args:
-% -doc "tracklang-manual.tex"
-% -author "Nicola Talbot"
% -src "tracklang.sty\Z=>tracklang.sty"
% -src "tracklang.tex\Z=>tracklang.tex"
% -src "tracklang-region-codes.tex\Z=>tracklang-region-codes.tex"
% -src "tracklang-scripts.sty\Z=>tracklang-scripts.sty"
% -src "tracklang-scripts.tex\Z=>tracklang-scripts.tex"
+% -author "Nicola Talbot"
+% -doc "tracklang-manual.tex"
% -section "chapter"
% tracklang
-% Created on 2019/12/1 17:41
+% Created on 2020/6/30 11:55
%\fi
%\iffalse
%<*package>
@@ -33,7 +33,7 @@
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
-% Copyright (C) 2019 Nicola Talbot, all rights reserved.
+% Copyright (C) 2020 Nicola Talbot, all rights reserved.
% \fi
% \iffalse
%<*driver>
@@ -59,7 +59,7 @@
pdfauthor={Nicola L.C. Talbot},
pdftitle={tracklang: tracking language options}]{hyperref}
-\CheckSum{6156}
+\CheckSum{6210}
\appto\MacroFont{\scriptsize}
\renewcommand*{\usage}[1]{\textit{\hyperpage{#1}}}
@@ -278,11 +278,11 @@ and~\ref{tab:nonisoopts}}
%
%\MakeShortVerb{"}
%
-%\title{tracklang v1.4:
+%\title{tracklang v1.5:
%tracking language options}
%\author{Nicola L. C. Talbot\\\url{http://www.dickimaw-books.com/}}
%
-%\date{2019-11-30}
+%\date{2020-06-30}
%\maketitle
%
%\begin{abstract}
@@ -3583,7 +3583,7 @@ and~\ref{tab:nonisoopts}}
% packages such as \styfmt{etoolbox}.
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{tracklang}[2019/11/30 v1.4 (NLCT) Track Languages]
+\ProvidesPackage{tracklang}[2020/06/30 v1.5 (NLCT) Track Languages]
% \end{macrocode}
%\begin{macro}{\@tracklang@declareoption}
% Set up package options.
@@ -3879,7 +3879,7 @@ and~\ref{tab:nonisoopts}}
% Version info.
% \begin{macrocode}
\expandafter\def\csname ver@tracklang.tex\endcsname{%
- 2019/11/30 v1.4 (NLCT) Track Languages Generic Code}
+ 2020/06/30 v1.5 (NLCT) Track Languages Generic Code}
% \end{macrocode}
% Define a long command for determining the existence of a control
% sequence by its name. (\cs{relax} is considered undefined.)
@@ -11374,9 +11374,9 @@ and~\ref{tab:nonisoopts}}
}%
\fi
}%
- {%
- \fi
- }%
+% \end{macrocode}
+%\changes{1.5}{2020-06-30}{removed spurious code block}
+% \begin{macrocode}
}%
{%
\let\@tracklang@test@if@file@exists@next\@tracklang@test@if@file@exists@for@langIII
@@ -11597,16 +11597,19 @@ and~\ref{tab:nonisoopts}}
%
%\begin{macro}{\IfTrackedLanguageFileExists@orig}
%\changes{1.4}{2019-11-30}{new}
+%\changes{1.5}{2020-06-30}{added verbose messages}
%The new definition of \cs{IfTrackedLanguageFileExists} has a
%different order of priority. If the original behaviour is
%specifically required, this has the pre version 1.4 definition.
% \begin{macrocode}
\long\def\IfTrackedLanguageFileExists@orig#1#2#3#4#5{%
+ \@tracklang@verbose{Finding file for dialect `#1' (pre-v1.4)}%
\def\CurrentTrackedTag{}%
\SetCurrentTrackedDialect{#1}%
\IfTrackedDialect{#1}%
{%
\edef\CurrentTrackedTag{#1}%
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}%
{%
@@ -11618,6 +11621,7 @@ and~\ref{tab:nonisoopts}}
{639-1}{\CurrentTrackedLanguage}}%
\ifx\CurrentTrackedRegion\empty
\let\CurrentTrackedTag\CurrentTrackedIsoCode
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}
{%
@@ -11628,21 +11632,25 @@ and~\ref{tab:nonisoopts}}
\TrackedIsoCodeFromLanguage
{639-2}{\CurrentTrackedLanguage}}%
\let\CurrentTrackedTag\CurrentTrackedIsoCode
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}%
{%
\let\CurrentTrackedTag\CurrentTrackedLanguage
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}{#4}{#5}%
}%
}%
{%
\let\CurrentTrackedTag\CurrentTrackedLanguage
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}{#4}{#5}%
}%
}%
\else
\edef\CurrentTrackedTag{%
\CurrentTrackedIsoCode-\CurrentTrackedRegion}%
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}
{%
@@ -11655,25 +11663,30 @@ and~\ref{tab:nonisoopts}}
{639-2}{\CurrentTrackedLanguage}}%
\edef\CurrentTrackedTag{%
\CurrentTrackedIsoCode-\CurrentTrackedRegion}%
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}%
{%
\let\CurrentTrackedTag\org@currenttrackedisocode
\let\org@currenttrackedisocode\CurrentTrackedIsoCode
\let\CurrentTrackedIsoCode\CurrentTrackedTag
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}
{%
\let\CurrentTrackedIsoCode\org@currenttrackedisocode
\let\CurrentTrackedTag\CurrentTrackedIsoCode
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}%
{%
\let\CurrentTrackedTag\CurrentTrackedRegion
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}%
{%
\let\CurrentTrackedTag\CurrentTrackedLanguage
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}{#4}{#5}%
}%
}%
@@ -11682,14 +11695,17 @@ and~\ref{tab:nonisoopts}}
}%
{%
\let\CurrentTrackedTag\CurrentTrackedIsoCode
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}%
{%
\let\CurrentTrackedTag\CurrentTrackedRegion
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}%
{%
\let\CurrentTrackedTag\CurrentTrackedLanguage
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}{#4}{#5}%
}%
}%
@@ -11720,40 +11736,49 @@ and~\ref{tab:nonisoopts}}
\ifx\CurrentTrackedIsoCode\empty
\ifx\CurrentTrackedRegion\empty
\let\CurrentTrackedTag\CurrentTrackedLanguage
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}{#4}{#5}%
\else
\let\CurrentTrackedTag\CurrentTrackedRegion
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}%
{%
\let\CurrentTrackedTag\CurrentTrackedLanguage
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}{#4}{#5}%
}%
\fi
\else
\ifx\CurrentTrackedRegion\empty
\let\CurrentTrackedTag\CurrentTrackedIsoCode
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}%
{%
\let\CurrentTrackedTag\CurrentTrackedLanguage
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}{#4}{#5}%
}%
\else
\edef\CurrentTrackedTag{%
\CurrentTrackedIsoCode-\CurrentTrackedRegion}%
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}%
{%
\let\CurrentTrackedTag\CurrentTrackedIsoCode
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}%
{%
\let\CurrentTrackedTag\CurrentTrackedRegion
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}%
{#4}%
{%
\let\CurrentTrackedTag\CurrentTrackedLanguage
+ \@tracklang@verbose{Testing tag `\CurrentTrackedTag'}%
\@tracklang@IfFileExists{#2\CurrentTrackedTag#3}{#4}{#5}%
}%
}%
@@ -11890,9 +11915,11 @@ and~\ref{tab:nonisoopts}}
\@tracklang@ifundef{#2\CurrentTrackedLanguage}%
{%
% \end{macrocode}
-% No captions hook. Do the code now.
+% No captions hook. Do nothing (it's possible no language package
+% has been loaded).
+%\changes{1.5}{2020-06-30}{removed redundant code and added verbose message}
% \begin{macrocode}
- #1%
+ \@tracklang@verbose{no hook found for \CurrentTrackedDialect}%
}%
{%
\@tracklang@addtohook{#2}{\CurrentTrackedLanguage}{#1}%
@@ -11911,6 +11938,7 @@ and~\ref{tab:nonisoopts}}
% \end{macrocode}
% No captions hook.
% \begin{macrocode}
+ \@tracklang@verbose{no hook found for \CurrentTrackedDialect}%
}%
{%
\@tracklang@addtohook{#2}{\CurrentTrackedLanguage}{#1}%
@@ -12001,9 +12029,11 @@ and~\ref{tab:nonisoopts}}
\@tracklang@ifundef{#2\CurrentTrackedLanguage}%
{%
% \end{macrocode}
-% No captions hook. Do the code now.
+% No captions hook. Do nothing (it's possible no language package
+% has been loaded).
+%\changes{1.5}{2020-06-30}{removed redundant code and added verbose message}
% \begin{macrocode}
- #1%
+ \@tracklang@verbose{no hook found for \CurrentTrackedDialect}%
}%
{%
\@tracklang@redefhook{#2}{\CurrentTrackedLanguage}{#1}%
@@ -12022,6 +12052,7 @@ and~\ref{tab:nonisoopts}}
% \end{macrocode}
% No captions hook.
% \begin{macrocode}
+ \@tracklang@verbose{no hook found for \CurrentTrackedDialect}%
}%
{%
\@tracklang@redefhook{#2}{\CurrentTrackedLanguage}{#1}%
@@ -12406,7 +12437,7 @@ and~\ref{tab:nonisoopts}}
% Version info.
% \begin{macrocode}
\expandafter\def\csname ver@tracklang-region-codes.tex\endcsname{%
- 2019/11/30 v1.4 (NLCT) Track Languages Regions}%
+ 2020/06/30 v1.5 (NLCT) Track Languages Regions}%
% \end{macrocode}
%
%\begin{macro}{\TrackLangRegionMap}
@@ -12799,7 +12830,7 @@ and~\ref{tab:nonisoopts}}
%\changes{1.3}{2016-10-07}{added tracklang-scripts.sty}
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{tracklang-scripts}[2019/11/30 v1.4 (NLCT) Track
+\ProvidesPackage{tracklang-scripts}[2020/06/30 v1.5 (NLCT) Track
Language Scripts (LaTeX)]
\RequirePackage{tracklang}
\input{tracklang-scripts}
@@ -12841,7 +12872,7 @@ Language Scripts (LaTeX)]
% Version info.
% \begin{macrocode}
\expandafter\def\csname ver@tracklang-scripts.tex\endcsname{%
- 2019/11/30 v1.4 (NLCT) Track Languages Scripts (Generic)}%
+ 2020/06/30 v1.5 (NLCT) Track Languages Scripts (Generic)}%
% \end{macrocode}
%
%\begin{macro}{\TrackLangScriptsMap}
diff --git a/Master/texmf-dist/source/latex/tracklang/tracklang.ins b/Master/texmf-dist/source/latex/tracklang/tracklang.ins
index 019b391cd1f..4b7bca1dded 100644
--- a/Master/texmf-dist/source/latex/tracklang/tracklang.ins
+++ b/Master/texmf-dist/source/latex/tracklang/tracklang.ins
@@ -1,10 +1,10 @@
-% tracklang.ins generated using makedtx version 1.2 2019/12/1 17:41
+% tracklang.ins generated using makedtx version 1.2 2020/6/30 11:55
\input docstrip
\preamble
tracklang.dtx
- Copyright 2019 Nicola Talbot
+ Copyright 2020 Nicola Talbot
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3
diff --git a/Master/texmf-dist/source/latex/tudscr/doc/sub-tudscr.tex b/Master/texmf-dist/source/latex/tudscr/doc/sub-tudscr.tex
deleted file mode 100644
index 6c70d570832..00000000000
--- a/Master/texmf-dist/source/latex/tudscr/doc/sub-tudscr.tex
+++ /dev/null
@@ -1,17 +0,0 @@
-%\AtBeginDocument{\TUDoptions{ToDo=no}}
-\includeonly{%
-% tudscr-preface,
-% tudscr-introduction,
-% tudscr-mainclasses,
-% tudscr-poster,
-% tudscr-supervisor,
-% tudscr-bundle,
-% tudscr-examples,
-% tudscr-packages,
-% tudscr-hints,
-% tudscr-installation,
- tudscr-obsolete,
-% tudscr-additional,
- tudscr-index,
-}
-\input{tudscr}
diff --git a/Master/texmf-dist/source/latex/tudscr/doc/tudscr.tex b/Master/texmf-dist/source/latex/tudscr/doc/tudscr.tex
index 0dc90c5597a..847d3b1fe22 100644
--- a/Master/texmf-dist/source/latex/tudscr/doc/tudscr.tex
+++ b/Master/texmf-dist/source/latex/tudscr/doc/tudscr.tex
@@ -29,7 +29,7 @@
\endgroup%
}
\faculty{\cdurl}
-\date{14.01.2020}
+\date{2020-11-10}
\author{%
Falk Hanisch%
\expandafter\emailaddress\expandafter{\tudscrmail}%
@@ -144,6 +144,8 @@
\url{http://latex.wcms-file3.tu-dresden.de/phpBB3/viewtopic.php?f=11&t=396}
}[v2.07]
+\ToDo[imp]{Alle Datumsangaben auf YYYY-MM-DD umstellen}[v2.07]
+
\ToDo[imp]{LyX: layout-Dateien in das Projekt integrieren lassen?}[v2.07]
\ToDo[imp]{\Package*{glossaries}: Paket für Stile aus Tutorial}[v2.07]
diff --git a/Master/texmf-dist/source/latex/tudscr/tudscr-area.dtx b/Master/texmf-dist/source/latex/tudscr/tudscr-area.dtx
index 0c1c3f1f6ba..0d5e1e0b25e 100644
--- a/Master/texmf-dist/source/latex/tudscr/tudscr-area.dtx
+++ b/Master/texmf-dist/source/latex/tudscr/tudscr-area.dtx
@@ -1,4 +1,4 @@
-% \CheckSum{2247}
+% \CheckSum{2307}
% \iffalse meta-comment
%
% TUD-Script -- Corporate Design of Technische Universität Dresden
@@ -52,7 +52,7 @@
% \fi%
%
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
-\ProvidesFile{tudscr-area.dtx}[2019/07/19 v2.06c TUD-Script\space%
+\ProvidesFile{tudscr-area.dtx}[2020/06/18 v2.06g TUD-Script\space%
(type or page area)%
]
%
@@ -291,6 +291,12 @@
% \changes{v2.05}{2015/11/29}{neu}^^A
% \begin{macro}{\tud@cdgeometry@assignlayout}
% \changes{v2.06}{2018/08/13}{neu}^^A
+% \begin{macro}{\tud@cdgeometry@resetlayout}
+% \changes{v2.06g}{2020/06/18}{neu, Bugfix für Änderung des Papierformates}^^A
+% \begin{macro}{\tud@cdgeometry@papersize@store}
+% \changes{v2.06g}{2020/06/18}{neu}^^A
+% \begin{macro}{\tud@cdgeometry@papersize@last}
+% \changes{v2.06g}{2020/06/18}{neu}^^A
% \begin{length}{\tud@len@layoutwidth}
% \changes{v2.05}{2016/04/03}{neu}^^A
% \begin{length}{\tud@len@layoutheight}
@@ -317,18 +323,6 @@
\newlength\tud@len@layoutheight
\newlength\tud@len@layouthoffset
\newlength\tud@len@layoutvoffset
-% \end{macrocode}
-% Mit \cs{tud@cdgeometry@assignlayout} wird die Layoutgröße, welche ggf. mit
-% dem Paket \pkg{geometry} angegeben wurde, entsprechend gesetzt.
-% \begin{macrocode}
-\newcommand*\tud@cdgeometry@assignlayout{%
- \ifdim\tud@len@layoutwidth<\p@\relax%
- \setlength\tud@len@layoutwidth{\paperwidth}%
- \fi%
- \ifdim\tud@len@layoutheight<\p@\relax%
- \setlength\tud@len@layoutheight{\paperheight}%
- \fi%
-}
\newcommand*\tud@cdgeometry@set{%
\tud@cdgeometry@assignlayout%
\tud@if@v@lower{2.05}{%
@@ -526,12 +520,57 @@
\setlength\tud@len@headsep{\dimexpr.707107\tud@len@headsep\relax}%
\setlength\tud@len@footsep{\dimexpr.707107\tud@len@footsep\relax}%
\fi%
+ \tud@cdgeometry@papersize@store%
+}
+% \end{macrocode}
+% Mit \cs{tud@cdgeometry@assignlayout} wird die Layoutgröße, welche ggf. mit
+% dem Paket \pkg{geometry} angegeben wurde, entsprechend gesetzt.
+% \begin{macrocode}
+\newcommand*\tud@cdgeometry@assignlayout{%
+ \ifdim\tud@len@layoutwidth<\p@\relax%
+ \setlength\tud@len@layoutwidth{\paperwidth}%
+ \fi%
+ \ifdim\tud@len@layoutheight<\p@\relax%
+ \setlength\tud@len@layoutheight{\paperheight}%
+ \fi%
+}
+% \end{macrocode}
+% Das Verarbeiten des Parameters \prm{layout} von \pkg{geometry} ist etwas
+% komplizierter. Normalerweise werden dessen Einstellungen bei einer einfachen
+% Änderung des Satzspiegels beibehalten. Bei einer Änderung des Papierformates
+% sind die damit gemachten Einstellungen nur bedingt weiterhin nutzbar. Die
+% Offset-Werte bleiben in diesem Fall erhalten, das Layoutformat allerdings
+% wird zurückgesetzt. Das aktuelle Papierformat wird nach der Prüfung auf eine
+% Änderung in \cs{tud@cdgeometry@papersize@last} gesichert.
+% \begin{macrocode}
+\newcommand*\tud@cdgeometry@papersize@last{}
+\newcommand*\tud@cdgeometry@papersize@store{%
+ \edef\tud@cdgeometry@papersize@last{\the\paperheight:\the\paperwidth}%
+}
+\newcommand*\tud@cdgeometry@resetlayout{%
+ \begingroup%
+ \edef\tud@res@a{\the\paperheight:\the\paperwidth}%
+ \def\tud@res@b{%
+ \endgroup%
+ \tud@cdgeometry@papersize@store%
+ }%
+ \ifx\tud@res@a\tud@cdgeometry@papersize@last\else%
+ \appto\tud@res@b{%
+ \setlength\tud@len@layoutwidth{\z@}%
+ \setlength\tud@len@layoutheight{\z@}%
+ \tud@x@geometry@fixmargins%
+ }%
+ \fi%
+ \tud@res@b%
}
% \end{macrocode}
% \end{length}^^A \tud@len@layoutvoffset
% \end{length}^^A \tud@len@layouthoffset
% \end{length}^^A \tud@len@layoutheight
% \end{length}^^A \tud@len@layoutwidth
+% \end{macro}^^A \tud@cdgeometry@papersize@last
+% \end{macro}^^A \tud@cdgeometry@papersize@store
+% \end{macro}^^A \tud@cdgeometry@resetlayout
% \end{macro}^^A \tud@cdgeometry@assignlayout
% \end{macro}^^A \if@tud@cdgeometry@adjust
% \end{macro}^^A \tud@cdgeometry@set
@@ -630,11 +669,11 @@
% erfolgte, wird auf das Laden verzichtet (\cs{if@tud@cdgeometry@reset}).
% \begin{macrocode}
\if@atdocument%
- \if@tud@cdgeometry@reset\else%
+ \if@tud@cdgeometry@reset\else% false
\ifcase\tud@cdgeometry@num\relax%
\tud@loadgeometry{current@typearea}%
\@tud@x@geometry@fixmarginstrue%
- \or%
+ \or% custom
\tud@loadgeometry{current@custom}%
\@tud@x@geometry@fixmarginstrue%
\fi%
@@ -913,6 +952,7 @@
% der einzelnen Seitenstile umzusetzen. Dabei werden auch etwaige Optionen von
% \KOMAScript{} beachtet. Hierfür werden die originalen Befehle \cs{geometry}
% und \cs{newgeometry} angepasst, weshalb diese vorher gesichert werden.
+% \ToDo{erweiterte Möglichkeiten von \cs{newgeometry} dokumentieren}[v2.07]
% \begin{macrocode}
\newif\if@tud@x@geometry@enabled%
\@tud@x@geometry@enabledtrue%
@@ -955,7 +995,11 @@
\if@tud@x@geometry@enabled%
\if@atdocument%
\@tud@x@geometry@fixmarginstrue%
- \tud@cdgeometry@reset{custom}%
+ \ifcase\tud@cdgeometry@num\relax% false
+ \tud@cdgeometry@reset{typearea}%
+ \or% custom
+ \tud@cdgeometry@reset{custom}%
+ \fi%
\tud@cdgeometry@process%
\fi%
\fi%
@@ -987,6 +1031,7 @@
% \end{macro}^^A \geometry
% \begin{macro}{\tud@x@geometry@user}
% \changes{v2.05}{2016/03/06}{neu}^^A
+% \changes{v2.06g}{2020/06/18}{Bugfix für Änderung des Papierformates}^^A
% \begin{parameter}{paper}
% \begin{parameter}{papername}
% \begin{parameter}{paperwidth}
@@ -1023,9 +1068,15 @@
\let\tud@x@geometry@layout\@empty%
\let\tud@x@geometry@parameter\@empty%
\TUD@parameter@set{geometry}{#1}%
+% \end{macrocode}
+% Bei einer Änderung des Papierformates wird das Layoutformat zurückgesetzt.
+% \begin{macrocode}
+ \tud@x@geometry@area@set{paper}%
+ \tud@cdgeometry@resetlayout%
\ifx\tud@x@geometry@layout\@empty\else%
\begingroup%
\tud@x@geometry@area@set{layout}%
+ \tud@cdgeometry@assignlayout%
\edef\tud@res@a{%
\endgroup%
\noexpand\setlength\noexpand\tud@len@layoutwidth{\the\paperwidth}%
@@ -1033,17 +1084,36 @@
}%
\tud@res@a%
\fi%
- \tud@x@geometry@area@set{paper}%
\ifstr{#2}{newgeometry}{%
\eappto\Gm@restore@org{%
\noexpand\paperwidth=\the\paperwidth\relax%
\noexpand\paperheight=\the\paperheight\relax%
}%
- \tud@x@geometry@getlayout{\tud@res@a}%
- \epreto\tud@x@geometry@parameter{\tud@res@a,}%
- \def\tud@res@a{\tud@cs@use{newgeometry}}%
- \expandafter\tud@res@a\expandafter{\tud@x@geometry@parameter}%
- \edef\tud@x@geometry@init{\tud@x@geometry@parameter}%
+% \end{macrocode}
+% Wird der Befehl verwendet, wenn eigentlich \pkg{typearea} aktiv ist, so
+% werden lediglich die Einstellungen zu \prm{paper} und \prm{layout} beachtet.
+% Dies wird über die gepatchte Version von \cs{typearea} realisert. Siehe dazu
+% \cs{tud@x@typearea@before} und \cs{tud@x@typearea@after} für Details.
+% \begin{macrocode}
+ \ifcase\tud@cdgeometry@num\relax%
+ \typearea[current]{current}%
+ \ifx\tud@x@geometry@parameter\@empty\else%
+ \ClassWarning{\TUD@Class@Name}{%
+ It isn't possible to use \string\newgeometry with any\MessageBreak%
+ key except `paper' or `layout' when package `typearea'\MessageBreak%
+ is used with`cdgeometry=typearea'%
+ }%
+ \fi%
+% \end{macrocode}
+% Die Abarbeitung der gegebenen Parameter wird mit \cs{tud@cdgeometry@process}
+% innerhalb von \cs{Gm@changelayout} realisiert. Letzteres Makro wird wiederum
+% von der originalen Definition von \cs{newgeometry} aufgerufen.
+% \begin{macrocode}
+ \else%
+ \def\tud@res@a{\tud@cs@use{newgeometry}}%
+ \expandafter\tud@res@a\expandafter{\tud@x@geometry@parameter}%
+ \edef\tud@x@geometry@init{\tud@x@geometry@parameter}%
+ \fi%
}{%
\eappto\tud@x@geometry@init{\tud@x@geometry@parameter}%
}%
@@ -1052,7 +1122,7 @@
% Das folgende Konstrukt ist aus der Idee entstanden, die Parameter \val{paper}
% sowie \val{layout} des Paketes \pkg{geometry} auf die passenden Optionen von
% \KOMAScript{} abbilden zu können und insbesondere Schnittmarken für alle
-% Seitenstile bereitzustellen. %
+% Seitenstile bereitzustellen.%
% \ToDo{%
% Leider ist aus der dem Versuch, eine halbwegs einheitliche Schnittstelle
% zwischen den Paketen \pkg{typearea} und \pkg{geometry} zu schaffen, ein
@@ -1101,8 +1171,12 @@
}%
\@tempa#1,,\@nil%
}%
- \TUD@parameter@def{layoutwidth}{\setlength\tud@len@layoutwidth{#1}}%
- \TUD@parameter@def{layoutheight}{\setlength\tud@len@layoutheight{#1}}%
+ \TUD@parameter@def{layoutwidth}{%
+ \tud@x@geometry@area@def{layout}{#1:\tud@len@layoutheight}%
+ }%
+ \TUD@parameter@def{layoutheight}{%
+ \tud@x@geometry@area@def{layout}{\tud@len@layoutwidth:#1}%
+ }%
\TUD@parameter@def{layoutoffset}{%
\def\@tempa##1,##2,##3\@nil{%
\IfArgIsEmpty{##2}{%
@@ -1202,25 +1276,27 @@
\fi%
}%
% \end{macrocode}
-% Der Befehl \cs{tud@x@geometry@area@set} bewerkstelligt die Abarbeitung der
-% zuvor gesammelten Schlüssel.
+% Der Befehl \cs{tud@x@geometry@area@set} bewerkstelligt die sequentielle
+% Abarbeitung der zuvor gesammelten Schlüssel.
% \begin{macrocode}
\newcommand*\tud@x@geometry@area@set[1]{%
\letcs{\@tempa}{tud@x@geometry@#1}%
\ifdefvoid{\@tempa}{}{%
\def\@tempb##1:##2:##3\@nil{%
- \begingroup%
- \IfArgIsEmpty{##2}{%
- \def\@tempb{\KOMAoption{paper}{##1}}%
- }{%
- \if@landscape%
- \def\@tempb{\KOMAoption{paper}{##2:##1}}%
- \else%
- \def\@tempb{\KOMAoption{paper}{##1:##2}}%
- \fi%
- }%
- \edef\@tempb{\endgroup\expandonce\@tempb}%
- \@tempb%
+ \IfArgIsEmpty{##2}{%
+ \KOMAoption{paper}{##1}%
+ }{%
+% \end{macrocode}
+% \KOMAScript{} stellt sich ziemlich clever an und setzt das Papierformat in
+% dieser Notation immer korrekt im Quer- oder Hochformat, unabhängig von der
+% Reihenfolge der angegebenen Längen. Für den Parameter \prm{layout} ist dies
+% jedoch unerwünscht, weshalb der verantwortliche Befehl deaktiviert wird.
+% \emph{Dies geschieht hier direkt und nicht in einer Gruppe,} weil der Aufruf
+% von \cs{tud@x@geometry@area@set}|{layout}| lokal erfolgt.
+% \begin{macrocode}
+ \ifstr{#1}{layout}{\let\scr@setpaperorientation\relax}{}%
+ \KOMAoption{paper}{##1:##2}%
+ }%
}%
\def\@tempc##1{\@tempb##1::\@nil}%
\expandafter\forcsvlist\expandafter\@tempc\expandafter{\@tempa}%
@@ -1258,12 +1334,12 @@
\ifGm@pass%
\let#1\@empty%
\else%
- \tud@cdgeometry@assignlayout%
\begingroup%
% \end{macrocode}
% Das Setzen des Layouts erfolgt nur, wenn die dazugehörigen Längen \emph{nicht}
% denen des Papierbogens entsprechen.
% \begin{macrocode}
+ \tud@cdgeometry@assignlayout%
\@tud@res@swafalse%
\ifdim\tud@len@layoutwidth=\paperwidth\relax\else\@tud@res@swatrue\fi%
\ifdim\tud@len@layoutheight=\paperheight\relax\else\@tud@res@swatrue\fi%
@@ -2081,6 +2157,7 @@
% \begin{macro}{\typearea}
% \begin{macro}{\areaset}
% \begin{macro}{\storereareas}
+% \changes{v2.06g}{2020/06/18}{Sichern der Längen für \prm{layout}}^^A
% \begin{macro}{\tud@x@typearea@before}
% \changes{v2.06}{2018/08/13}{neu}^^A
% \begin{macro}{\tud@x@typearea@after}
@@ -2094,6 +2171,7 @@
% der Präambel werden in \cs{tud@x@typearea@init} gesichert.
% \begin{macrocode}
\newcommand*\tud@x@typearea@before{%
+ \tud@cdgeometry@resetlayout%
\tud@skip@store{paperheight}%
\tud@skip@store{paperwidth}%
\begingroup%
@@ -2148,9 +2226,14 @@
\begingroup
\tud@x@geometry@fixmargins%
\tud@cs@use{storeareas}{#1}%
+ \def\tud@res@b##1{\unexpanded{\setlength##1}{\the##1}}%
\edef\tud@res@a{%
\endgroup%
\etex@unexpanded{\def#1}{%
+ \tud@res@b{\tud@len@layoutwidth}%
+ \tud@res@b{\tud@len@layoutheight}%
+ \tud@res@b{\tud@len@layouthoffset}%
+ \tud@res@b{\tud@len@layoutvoffset}%
\expandonce#1%
\def\noexpand\tud@cdgeometry@num{\tud@cdgeometry@num}%
}%
diff --git a/Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx b/Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx
index 7d65f4e5cbd..bc96db0bff4 100644
--- a/Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx
+++ b/Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx
@@ -1,4 +1,4 @@
-% \CheckSum{843}
+% \CheckSum{842}
% \iffalse meta-comment
%
% TUD-Script -- Corporate Design of Technische Universität Dresden
@@ -52,7 +52,7 @@
% \fi
%
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
-\ProvidesFile{tudscr-base.dtx}[2020/01/14 v2.06f TUD-Script\space%
+\ProvidesFile{tudscr-base.dtx}[2020/09/29 v2.06j TUD-Script\space%
%
% \iffalse
%</dtx>
@@ -149,7 +149,7 @@
\providecommand*{\ifisdimen}{\Ifisdimen}
\providecommand*{\ifisdimension}{\Ifisdimension}
\providecommand*{\ifnumber}{\Ifnumber}
-\RequirePackage{scrbase}[2019/12/23]
+\RequirePackage{scrbase}[2020/09/21]
\RequirePackage{iftex}[2019/11/07]
% \end{macrocode}
% Die folgenden Pakete werden für die Manipulation bereits definierter
@@ -274,6 +274,9 @@
% \begin{macro}{\iflanguageloaded}
% \changes{v2.05}{2015/11/23}{neu}^^A
% Hiermit kann getestet werden, ob das Argument als Sprache nutzbar ist.
+% \ToDo{ist Befehl noch sinnvoll? use polyglossia \cs{xpg@[b]loaded}?}[v2.07]
+% \ToDo{für polyglossia auch mit \cs{ifbabellanguageloaded} testen?}[v2.07]
+% \ToDo{besser nur als internen Befehl definieren \cs{tud@if@...}?!}[v2.07]
% \begin{macrocode}
\newcommand*\iflanguageloaded[1]{%
\PackageWarning{tudscrbase}{%
@@ -291,9 +294,7 @@
\fi%
}%
}
-\AfterPackage*{polyglossia}{%
- \renewcommand*\iflanguageloaded[1]{\ifcsdef{#1@loaded}}%
-}
+\BeforePackage{polyglossia}{\undef\iflanguageloaded}
% \end{macrocode}
% \end{macro}^^A \iflanguageloaded
%
@@ -1217,14 +1218,14 @@
% \begin{macrocode}
\newcommand*\TUD@AfterPackage@set[1]{%
\newbool{@tud@#1@loaded}%
- \AfterPackage!{#1}{\booltrue{@tud@#1@loaded}}%
+ \AfterAtEndOfPackage*{#1}{\booltrue{@tud@#1@loaded}}%
}
\newcommand*\TUD@AfterPackage@do[2]{%
\ifcsdef{if@tud@#1@loaded}{%
\if@atdocument%
\ifbool{@tud@#1@loaded}{#2}{}%
\else%
- \AfterPackage!{#1}{#2}%
+ \AfterAtEndOfPackage*{#1}{#2}%
\fi%
}{%
\PackageError{tudscrbase}{\string\TUD@AfterPackage@set{#1} missing}{%
diff --git a/Master/texmf-dist/source/latex/tudscr/tudscr-comp.dtx b/Master/texmf-dist/source/latex/tudscr/tudscr-comp.dtx
index 41589561942..4d25d8d3469 100644
--- a/Master/texmf-dist/source/latex/tudscr/tudscr-comp.dtx
+++ b/Master/texmf-dist/source/latex/tudscr/tudscr-comp.dtx
@@ -1,4 +1,4 @@
-% \CheckSum{1453}
+% \CheckSum{1458}
% \iffalse meta-comment
%
% TUD-Script -- Corporate Design of Technische Universität Dresden
@@ -52,7 +52,7 @@
% \fi
%
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
-\ProvidesFile{tudscr-comp.dtx}[2020/01/14 v2.06f TUD-Script\space%
+\ProvidesFile{tudscr-comp.dtx}[2020/11/10 v2.06k TUD-Script\space%
%
% \iffalse
%</dtx>
@@ -383,6 +383,16 @@
% \changes{v2.06e}{2019/10/23}{neu}^^A
% \begin{macro}{\tud@v@2.06f}
% \changes{v2.06f}{2020/01/14}{neu}^^A
+% \begin{macro}{\tud@v@2.06g}
+% \changes{v2.06g}{2020/06/18}{neu}^^A
+% \begin{macro}{\tud@v@2.06h}
+% \changes{v2.06h}{2020/06/25}{neu}^^A
+% \begin{macro}{\tud@v@2.06i}
+% \changes{v2.06i}{2020/07/27}{neu}^^A
+% \begin{macro}{\tud@v@2.06j}
+% \changes{v2.06j}{2020/09/29}{neu}^^A
+% \begin{macro}{\tud@v@2.06k}
+% \changes{v2.06k}{2020/11/10}{neu}^^A
% \begin{macro}{\tud@v@last}
% \changes{v2.02}{2014/08/22}{neu}^^A
% \changes{v2.03}{2015/01/13}{angepasst}^^A
@@ -425,9 +435,19 @@
\csdef{tud@v@2.06d}{4}
\csdef{tud@v@2.06e}{4}
\csdef{tud@v@2.06f}{4}
+\csdef{tud@v@2.06g}{4}
+\csdef{tud@v@2.06h}{4}
+\csdef{tud@v@2.06i}{4}
+\csdef{tud@v@2.06j}{4}
+\csdef{tud@v@2.06k}{4}
\csdef{tud@v@last}{4}
% \end{macrocode}
% \end{macro}^^A \tud@v@last
+% \end{macro}^^A \tud@v@2.06k
+% \end{macro}^^A \tud@v@2.06j
+% \end{macro}^^A \tud@v@2.06i
+% \end{macro}^^A \tud@v@2.06h
+% \end{macro}^^A \tud@v@2.06g
% \end{macro}^^A \tud@v@2.06f
% \end{macro}^^A \tud@v@2.06e
% \end{macro}^^A \tud@v@2.06d
diff --git a/Master/texmf-dist/source/latex/tudscr/tudscr-fonts.dtx b/Master/texmf-dist/source/latex/tudscr/tudscr-fonts.dtx
index c0fb49b8038..2247bb7268a 100644
--- a/Master/texmf-dist/source/latex/tudscr/tudscr-fonts.dtx
+++ b/Master/texmf-dist/source/latex/tudscr/tudscr-fonts.dtx
@@ -1,4 +1,4 @@
-% \CheckSum{3124}
+% \CheckSum{3183}
% \iffalse meta-comment
%
% TUD-Script -- Corporate Design of Technische Universität Dresden
@@ -52,7 +52,7 @@
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
% \fi
%
-\ProvidesFile{tudscr-fonts.dtx}[2020/01/14 v2.06f TUD-Script\space%
+\ProvidesFile{tudscr-fonts.dtx}[2020/09/29 v2.06j TUD-Script\space%
%
% \iffalse
%</dtx>
@@ -152,7 +152,7 @@
% \pkg{scrextend} benötigt.
% \begin{macrocode}
\ifcsname KOMAClassName\endcsname\else
- \RequirePackage{scrextend}[2013/12/19]
+ \RequirePackage{scrextend}[2020/09/21]
\fi
% \end{macrocode}
% Wird das Paket \pkg{tudscrfonts} nach einer der Klassen verwendet, welche die
@@ -669,7 +669,7 @@
% Mathematikmodus auf \cs{familydefault} bzw. \cs{rmfamily} verlässt.
% \begin{macrocode}
\newif\if@tud@x@siunitx@enabled
-\AfterPackage*{siunitx}{%
+\AfterAtEndOfPackage*{siunitx}{%
\@tud@x@siunitx@enabledtrue%
\providecommand*\lseries{\fontseries{l}\selectfont}%
}
@@ -1283,6 +1283,7 @@
% Danach erfolgt die Definition der Schriften des \CDs.
% \begin{macrocode}
\tud@cdfont@set%
+ \tud@cdfont@symbols@set%
\tud@ttfont@set%
\if@tud@x@mweights@enabled%
\edef\bfseries@rm{\tud@cdfont@bf}%
@@ -1323,6 +1324,7 @@
\tud@cs@restore{sffamily}%
\tud@cs@restore{ttfamily}%
\fi%
+ \tud@cdfont@symbols@reset%
\fi%
\if@tud@x@mweights@enabled%
\edef\rmdef@ult{\rmdefault}%
@@ -1449,6 +1451,122 @@
% \end{macro}^^A \tud@cdfont@md
% \end{macro}^^A \tud@cdfont@@set
% \end{macro}^^A \tud@cdfont@set
+% \begin{macro}{\tud@cdfont@declare@symb}
+% \changes{v2.07}{2020/01/22}{neu}^^A
+% \begin{macro}{\tud@cdfont@symb@list}
+% \changes{v2.07}{2020/01/22}{neu}^^A
+% \begin{macro}{\tud@DeclareTextSymbol}
+% \changes{v2.07}{2020/01/22}{neu}^^A
+% Mit \cs{tud@cdfont@declare@symb} können Glyhen respektive einzelne Zeichen
+% definiert werden, welche über das Makro \cs{tud@cdfont@symbols@set} nur zum
+% Einsatz kommen, wenn \opt{cdfont=true} aktiviert wurde. Damit können gezielt
+% Symbole in verschiedenen Kodierungen aus unterscihedlichen Schriftfamilien
+% definiert werden.
+% \begin{macrocode}
+\newcommand*\tud@cdfont@symb@list{}
+\newcommand*\tud@cdfont@declare@symb[4]{%
+ \listeadd\tud@cdfont@symb@list{#1}%
+ \tud@DeclareTextSymbol{#1}{#2}{#3}{#4}%
+}
+% \end{macrocode}
+% Die an \cs{tud@cdfont@declare@symb} übergebenen Bezeichner für Auswahlbefehle
+% erhalten \cs{tud@cdfont@symbol@\dots} als Präfix. Da so der ursprüngliche
+% Befehlsname verändert wird, würde dieser Befehlsname auch verwendet werden,
+% wenn dieser in einem fragilen Kontext genutzt wird (siehe \cs{@changed@cmd}).
+% Deshalb wird im Anschluss der neue Befehl selbst robust definiert, damit
+% eine spätere Expansion nach der Zuweisung mit \cs{tud@cs@letltx} nicht in
+% \cs{tud@cdfont@symbol@\meta{symbol}} resultiert sondern in jedem Fall
+% \cs{\meta{symbol}} erhalen bleibt.
+% \begin{macrocode}
+\newcommand*\tud@DeclareTextSymbol[4]{%
+ \begingroup%
+ \edef\tud@res@a{%
+ \endgroup%
+ \noexpand\DeclareTextCommand%
+ {\csname tud@cdfont@symbol@#1\endcsname}{#2}%
+ {\unexpanded{{\fontfamily{#3}\selectfont\char#4}}}%
+ \noexpand\DeclareTextCommandDefault%
+ {\csname tud@cdfont@symbol@#1\endcsname}%
+ {\noexpand\UseTextSymbol{#2}{\csname tud@cdfont@symbol@#1\endcsname}}%
+ }%
+ \tud@res@a%
+ \expandafter\robustify\csname tud@cdfont@symbol@#1\endcsname%
+}
+% \end{macrocode}
+% \end{macro}^^A \tud@DeclareTextSymbol
+% \end{macro}^^A \tud@cdfont@symb@list
+% \end{macro}^^A \tud@cdfont@declare@symb
+% \begin{macro}{\tud@cdfont@symbols@set}
+% \changes{v2.07}{2020/01/22}{neu}^^A
+% \begin{macro}{\tud@cdfont@symbols@toks}
+% \changes{v2.07}{2020/01/22}{neu}^^A
+% \begin{macro}{\tud@cdfont@symbols@set@cmd}
+% \changes{v2.07}{2020/01/22}{neu}^^A
+% \begin{macro}{\tud@cdfont@symbols@reset}
+% \changes{v2.07}{2020/01/22}{neu}^^A
+% Mit diesen Befehlen wird im zwischen Symbolen für die Schriften des \CDs,
+% welche mit \cs{tud@cdfont@declare@symb} deklariert wurden, und den normalen
+% gewechselt werden.
+% \begin{macrocode}
+\newtoks\tud@cdfont@symbols@toks
+\newcommand*\tud@cdfont@symbols@set{%
+% \end{macrocode}
+% Die Sicherung der alten Definitionen erfolgt nur einmalig. Die Liste der
+% Symbole wird durchlaufen und die erfolgten Definitionen werden umgesetzt.
+% \begin{macrocode}
+ \expandafter\IfArgIsEmpty\expandafter{\the\tud@cdfont@symbols@toks}{%
+ \forlistloop\tud@cdfont@symbols@set@cmd\tud@cdfont@symb@list%
+% \end{macrocode}
+% Wird das Tokenregister abgerufen, soll es anschließend auch wieder geleert
+% werden.
+% \begin{macrocode}
+ \addto@hook\tud@cdfont@symbols@toks{\tud@cdfont@symbols@toks{}}%
+ }{}%
+}
+% \end{macrocode}
+% Das Vorgehen zur Wiederherstellung im Token \cs{tud@cdfont@symbols@toks}
+% definiert.
+% \begin{macrocode}
+\newcommand*\tud@cdfont@symbols@set@cmd[1]{%
+ \tud@cs@store{#1}%
+ \addto@hook\tud@cdfont@symbols@toks{\tud@cs@restore{#1}}%
+ \tud@cs@letltx{#1}{tud@cdfont@symbol@#1}%
+}
+% \end{macrocode}
+% Für das Zurücksetzen muss lediglich das Tokenregister aufgerufen werden.
+% \begin{macrocode}
+\newcommand*\tud@cdfont@symbols@reset{\the\tud@cdfont@symbols@toks}
+% \end{macrocode}
+% \end{macro}^^A \tud@cdfont@symbols@reset
+% \end{macro}^^A \tud@cdfont@symbols@set@cmd
+% \end{macro}^^A \tud@cdfont@symbols@toks
+% \end{macro}^^A \tud@cdfont@symbols@set
+% \begin{macro}{\tud@cdfont@declare@textsymb}
+% \changes{v2.07}{2020/01/22}{neu}^^A
+% \begin{macro}{\tud@cdmath@symbol@textleftarrow}
+% \begin{macro}{\tud@cdmath@symbol@textrightarrow}
+% \begin{macro}{\tud@cdmath@symbol@textuparrow}
+% \begin{macro}{\tud@cdmath@symbol@textdownarrow}
+% \begin{macro}{\tud@cdmath@symbol@textlangle}
+% \begin{macro}{\tud@cdmath@symbol@textrangle}
+% Die Definition der Textsymbole für die \val{TS1}-Kodierung.
+% \begin{macrocode}
+\newcommand*\tud@cdfont@declare@textsymb{%
+ \tud@cdfont@declare@symb{textleftarrow}{TS1}{iwona}{24}%
+ \tud@cdfont@declare@symb{textrightarrow}{TS1}{iwona}{25}%
+ \tud@cdfont@declare@symb{textuparrow}{TS1}{iwona}{94}%
+ \tud@cdfont@declare@symb{textdownarrow}{TS1}{iwona}{95}%
+ \tud@cdfont@declare@symb{textlangle}{TS1}{iwona}{60}%
+ \tud@cdfont@declare@symb{textrangle}{TS1}{iwona}{62}%
+}
+% \end{macrocode}
+% \end{macro}^^A \tud@cdmath@symbol@textrangle
+% \end{macro}^^A \tud@cdmath@symbol@textlangle
+% \end{macro}^^A \tud@cdmath@symbol@textdownarrow
+% \end{macro}^^A \tud@cdmath@symbol@textuparrow
+% \end{macro}^^A \tud@cdmath@symbol@textrightarrow
+% \end{macro}^^A \tud@cdmath@symbol@textleftarrow
+% \end{macro}^^A \tud@cdfont@declare@textsymb
% \begin{macro}{\tud@font@skip@set}
% \changes{v2.04}{2015/02/17}{neu}^^A
% \begin{macro}{\tud@font@skip@@set}
@@ -1607,17 +1725,10 @@
{OMS/iwona/\tud@res@a/n}%
}%
}{}%
- \AtBeginDocument{%
- \ifcsundef{textrightarrow}{}{%
- \tud@cs@store{textrightarrow}%
- \renewrobustcmd*{\textrightarrow}{%
- \begingroup%
- \if@tud@cdfont@active\fontfamily{iwona}\selectfont\fi%
- \tud@cs@use{textrightarrow}%
- \endgroup%
- }%
- }%
- }%
+% \end{macrocode}
+% Nun folgen noch einzeln definierte Symbole.
+% \begin{macrocode}
+ \tud@cdfont@declare@textsymb%
\fi%
% \end{macrocode}
% Es werden mehrere Schalter zur expliziten Auswahl für die Schriftschnitte
diff --git a/Master/texmf-dist/source/latex/tudscr/tudscr-frontmatter.dtx b/Master/texmf-dist/source/latex/tudscr/tudscr-frontmatter.dtx
index 3ae42e3e833..1090424980b 100644
--- a/Master/texmf-dist/source/latex/tudscr/tudscr-frontmatter.dtx
+++ b/Master/texmf-dist/source/latex/tudscr/tudscr-frontmatter.dtx
@@ -1,4 +1,4 @@
-% \CheckSum{815}
+% \CheckSum{817}
% \iffalse meta-comment
%
% TUD-Script -- Corporate Design of Technische Universität Dresden
@@ -52,7 +52,7 @@
% \fi
%
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
-\ProvidesFile{tudscr-frontmatter.dtx}[2019/06/28 v2.06 TUD-Script\space%
+\ProvidesFile{tudscr-frontmatter.dtx}[2020/07/27 v2.06i TUD-Script\space%
(frontmatter)%
]
%
@@ -129,7 +129,13 @@
\ifboolexpr{%
bool {@titlepage} and bool {@tud@#1@fil} and bool {@tud@#1@multi}%
}{%
- \sbox\z@{\vbox{#2}}%
+% \end{macrocode}
+% Das Erstellen von Outline-Einträgen wird innerhalb der Box deaktiviert.
+% \begin{macrocode}
+ \sbox\z@{%
+ \renewcommand*\addtocentrydefault[3]{}%
+ \vbox{#2}%
+ }%
\ifdim\textheight<\dimexpr\ht\z@+\dp\z@\relax%
\ClassWarning{\TUD@Class@Name}{%
The given content within the `#1'\MessageBreak%
diff --git a/Master/texmf-dist/source/latex/tudscr/tudscr-localization.dtx b/Master/texmf-dist/source/latex/tudscr/tudscr-localization.dtx
index d137660867c..b47cc7b68e5 100644
--- a/Master/texmf-dist/source/latex/tudscr/tudscr-localization.dtx
+++ b/Master/texmf-dist/source/latex/tudscr/tudscr-localization.dtx
@@ -1,4 +1,4 @@
-% \CheckSum{774}
+% \CheckSum{763}
% \iffalse meta-comment
%
% TUD-Script -- Corporate Design of Technische Universität Dresden
@@ -52,7 +52,7 @@
% \fi
%
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
-\ProvidesFile{tudscr-localization.dtx}[2019/07/19 v2.06c TUD-Script\space%
+\ProvidesFile{tudscr-localization.dtx}[2020/11/10 v2.06k TUD-Script\space%
(localization)%
]
%
@@ -121,8 +121,8 @@
`\string#1' not defined for language `\languagename'%
}{%
Currently the class `\TUD@Class@Name' only supports the\MessageBreak%
- languages german and english an its dialects. You must\MessageBreak%
- define single patterns by yourself, e.g.:\MessageBreak%
+ languages german and english as well as its dialects. You\MessageBreak%
+ must define single patterns by yourself, e.g.:\MessageBreak%
`\string\providecaptionname{\languagename}\string#1{<text>}'\MessageBreak%
You can send your definitions to \tudscrmail\space in\MessageBreak%
order to implement support for additional languages.%
@@ -493,7 +493,7 @@
% angegeben werden muss, \cs{and} verwendet wurde. Ist dies der Fall, wird das
% zweite Argument ausgeführt, andernfalls das dritte.
% \begin{macrocode}
-\newcommand*\tud@ifin@and[1]{%
+\newrobustcmd*\tud@ifin@and[1]{%
\begingroup%
\let\and\relax%
\robustify\\%
@@ -506,7 +506,7 @@
}%
}%
\expandafter\@tempa\@tempb\and\relax%
- \endgroup
+ \endgroup%
}
% \end{macrocode}
% \end{macro}^^A \tud@ifin@and
@@ -543,7 +543,7 @@
%<*book|report|article>
\tud@localization@german{\graduationtext}{%
zur Erlangung des akademischen Grades%
-}%
+}
% \end{macrocode}
% Für die nachfolgenden Felder, für die es bedarfsweise einen Bezeichner für
% eine zweite Person gibt (\cs{\dots{}othername}), werden jeweils verschiedene
@@ -562,8 +562,8 @@
Erstgutachter%
\fi%
}{Gutachter}%
-}%
-\tud@localization@german{\refereeothername}{Zweitgutachter}%
+}
+\tud@localization@german{\refereeothername}{Zweitgutachter}
\tud@localization@german{\advisorname}{%
\tud@ifin@and{\@advisor}{%
\ifx\advisorothername\@empty%
@@ -572,8 +572,8 @@
Erster Fachreferent%
\fi%
}{Fachreferent}%
-}%
-\tud@localization@german{\advisorothername}{}%
+}
+\tud@localization@german{\advisorothername}{}
\tud@localization@german{\supervisorname}{%
\tud@ifin@and{\@supervisor}{%
\ifx\supervisorothername\@empty%
@@ -582,8 +582,8 @@
Erstbetreuer%
\fi%
}{Betreuer}%
-}%
-\tud@localization@german{\supervisorothername}{}%
+}
+\tud@localization@german{\supervisorothername}{}
\tud@localization@german{\professorname}{%
\tud@ifin@and{\@professor}{%
\ifx\professorothername\@empty%
@@ -592,73 +592,73 @@
Erster betreuender Hochschullehrer%
\fi%
}{Betreuender Hochschullehrer}%
-}%
-\tud@localization@german{\professorothername}{}%
-\tud@localization@german{\datetext}{Eingereicht am}%
-\tud@localization@german{\dateofbirthtext}{Geboren am}%
-\tud@localization@german{\placeofbirthtext}{in}%
-\tud@localization@german{\defensedatetext}{Verteidigt am}%
-\tud@localization@german{\matriculationyearname}{Immatrikulationsjahr}%
-\tud@localization@german{\matriculationnumbername}{Matrikelnummer}%
-\tud@localization@german{\coverpagename}{Umschlagseite}%
-\tud@localization@german{\titlepagename}{Titelblatt}%
-\tud@localization@german{\titlename}{Titel}%
+}
+\tud@localization@german{\professorothername}{}
+\tud@localization@german{\datetext}{Eingereicht am}
+\tud@localization@german{\dateofbirthtext}{Geboren am}
+\tud@localization@german{\placeofbirthtext}{in}
+\tud@localization@german{\defensedatetext}{Verteidigt am}
+\tud@localization@german{\matriculationyearname}{Immatrikulationsjahr}
+\tud@localization@german{\matriculationnumbername}{Matrikelnummer}
+\tud@localization@german{\coverpagename}{Umschlagseite}
+\tud@localization@german{\titlepagename}{Titelblatt}
+\tud@localization@german{\titlename}{Titel}
%<*book>
-\tud@localization@german{\abstractname}{Zusammenfassung}%
+\tud@localization@german{\abstractname}{Zusammenfassung}
%</book>
-\tud@localization@german{\confirmationname}{Selbstst\"andigkeitserkl\"arung}%
+\tud@localization@german{\confirmationname}{Selbstst\"andigkeitserkl\"arung}
\tud@localization@german{\confirmationtext}{%
- Hiermit versichere ich, dass ich die vorliegende Arbeit
- \ifx\@@title\@empty\else mit dem Titel \emph{\@@title} \fi
- selbstst\"andig und ohne unzul\"assige Hilfe Dritter verfasst habe.
- Es wurden keine anderen als die in der Arbeit angegebenen Hilfsmittel
- und Quellen benutzt. Die w\"ortlichen und sinngem\"a\ss{}
- \"ubernommenen Zitate habe ich als solche kenntlich gemacht.
+ Hiermit versichere ich, dass ich das vorliegende Dokument %
+ \ifx\@@title\@empty\else mit dem Titel \emph{\@@title} \fi%
+ selbstst\"andig und ohne unzul\"assige Hilfe Dritter verfasst habe. %
+ Es wurden keine anderen als die in diesem Dokument angegebenen Hilfsmittel %
+ und Quellen benutzt. Die w\"ortlichen und sinngem\"a\ss{} %
+ \"ubernommenen Zitate habe ich als solche kenntlich gemacht. %
\ifx\@supporter\@empty%
- Es waren keine weiteren Personen an der geistigen Herstellung
- der vorliegenden Arbeit beteiligt.
+ Es waren keine weiteren Personen an der geistigen Herstellung %
+ des vorliegenden Dokumentes beteiligt. %
\else%
- W\"ahrend der Anfertigung dieser Arbeit wurde ich nur von
+ W\"ahrend der Anfertigung dieses Dokumentes wurde ich nur von %
folgenden Personen unterst\"utzt:%
\begin{quote}\def\and{\newline}\@supporter\end{quote}%
- \noindent Weitere Personen waren an der geistigen Herstellung
- der vorliegenden Arbeit nicht beteiligt.
+ \noindent Zus\"atzliche Personen waren an der geistigen Herstellung %
+ des vorliegenden Dokumentes nicht beteiligt. %
\fi%
- Mir ist bekannt, dass die Nichteinhaltung dieser Erkl\"arung zum
+ Mir ist bekannt, dass die Nichteinhaltung dieser Erkl\"arung zum %
nachtr\"aglichen Entzug des Hochschulabschlusses f\"uhren kann.%
-}%
-\tud@localization@german{\blockingname}{Sperrvermerk}%
+}
+\tud@localization@german{\blockingname}{Sperrvermerk}
\tud@localization@german{\blockingtext}{%
- Diese Arbeit
- \ifx\@@title\@empty\else mit dem Titel \emph{\@@title} \fi
- enth\"alt vertrauliche Informationen\ifx\@company\@empty\else
- , offengelegt durch \emph{\@company}\fi. Ver\"offentlichungen,
- Vervielf\"altigungen und Einsichtnahme~-- auch nur auszugsweise~--
- sind ohne ausdr\"uckliche Genehmigung \ifx\@company\@empty\else
- durch \emph{\@company} \fi nicht gestattet, ebenso wie
- Ver\"offentlichungen \"uber den Inhalt dieser Arbeit. Die
- vorliegende Arbeit ist nur dem Betreuer an der Technischen
- Universit\"at Dresden, den Gutachtern sowie den Mitgliedern
- des Pr\"ufungsausschusses zug\"anglich zu machen.%
-}%
+ Dieses Dokument %
+ \ifx\@@title\@empty\else mit dem Titel \emph{\@@title} \fi%
+ enth\"alt vertrauliche Informationen%
+ \ifx\@company\@empty\else, offengelegt durch \emph{\@company}\fi. %
+ Ver\"offentlichungen, Vervielf\"altigungen und Einsichtnahme~-- auch nur %
+ auszugsweise~-- sind ohne ausdr\"uckliche Genehmigung %
+ \ifx\@company\@empty\else durch \emph{\@company} \fi%
+ nicht gestattet, ebenso wie Ver\"offentlichungen \"uber den Inhalt dieses %
+ Dokumentes. Es ist nur dem Betreuer an der Technischen Universit\"at %
+ Dresden, den Gutachtern sowie den Mitgliedern des Pr\"ufungsausschusses %
+ zug\"anglich zu machen.%
+}
%</book|report|article>
-\tud@localization@german{\coursename}{Studiengang}%
-\tud@localization@german{\disciplinename}{Studienrichtung}%
-\tud@localization@german{\listingname}{Quelltext}%
-\tud@localization@german{\listlistingname}{Quelltextverzeichnis}%
-\tud@localization@german{\dissertationname}{Dissertation}%
-\tud@localization@german{\diplomathesisname}{Diplomarbeit}%
-\tud@localization@german{\masterthesisname}{Master-Arbeit}%
-\tud@localization@german{\bachelorthesisname}{Bachelor-Arbeit}%
-\tud@localization@german{\studentthesisname}{Studienarbeit}%
-\tud@localization@german{\studentresearchname}{Gro\ss{}er Beleg}%
-\tud@localization@german{\projectpapername}{Projektarbeit}%
-\tud@localization@german{\seminarpapername}{Seminararbeit}%
-\tud@localization@german{\termpapername}{Hausarbeit}%
-\tud@localization@german{\researchname}{Forschungsbericht}%
-\tud@localization@german{\logname}{Protokoll}%
-\tud@localization@german{\internshipname}{Praktikumsbericht}%
-\tud@localization@german{\reportname}{Bericht}%
+\tud@localization@german{\coursename}{Studiengang}
+\tud@localization@german{\disciplinename}{Studienrichtung}
+\tud@localization@german{\listingname}{Quelltext}
+\tud@localization@german{\listlistingname}{Quelltextverzeichnis}
+\tud@localization@german{\dissertationname}{Dissertation}
+\tud@localization@german{\diplomathesisname}{Diplomarbeit}
+\tud@localization@german{\masterthesisname}{Master-Arbeit}
+\tud@localization@german{\bachelorthesisname}{Bachelor-Arbeit}
+\tud@localization@german{\studentthesisname}{Studienarbeit}
+\tud@localization@german{\studentresearchname}{Gro\ss{}er Beleg}
+\tud@localization@german{\projectpapername}{Projektarbeit}
+\tud@localization@german{\seminarpapername}{Seminararbeit}
+\tud@localization@german{\termpapername}{Hausarbeit}
+\tud@localization@german{\researchname}{Forschungsbericht}
+\tud@localization@german{\logname}{Protokoll}
+\tud@localization@german{\internshipname}{Praktikumsbericht}
+\tud@localization@german{\reportname}{Bericht}
% \end{macrocode}
%
% \iffalse
@@ -670,9 +670,9 @@
% Hier erfolgen für die Klasse \cls{tudscrposter} sowie das Paket
% \pkg{tudscrsupervisor} weitere Definitionen.
% \begin{macrocode}
-\tud@localization@german{\authorname}{Autor}%
-\tud@localization@german{\contactname}{Kontakt}%
-\tud@localization@german{\contactpersonname}{Ansprechpartner}%
+\tud@localization@german{\authorname}{Autor}
+\tud@localization@german{\contactname}{Kontakt}
+\tud@localization@german{\contactpersonname}{Ansprechpartner}
% \end{macrocode}
%
% \iffalse
@@ -682,22 +682,22 @@
%
% Hier erfolgen für das Paket \pkg{tudscrsupervisor} weitere Definitionen.
% \begin{macrocode}
-\tud@localization@german{\taskname}{Aufgabenstellung}%
-\tud@localization@german{\tasktext}{f\"ur die Anfertigung einer}%
-\tud@localization@german{\namesname}{Name}%
-\tud@localization@german{\issuedatetext}{Ausgeh\"andigt am}%
-\tud@localization@german{\duedatetext}{Einzureichen am}%
-\tud@localization@german{\chairmanname}{Pr\"ufungsausschussvorsitzender}%
-\tud@localization@german{\focusname}{Schwerpunkte der Arbeit}%
-\tud@localization@german{\objectivesname}{Ziele der Arbeit}%
-\tud@localization@german{\evaluationname}{Gutachten}%
-\tud@localization@german{\evaluationtext}{f\"ur die}%
-\tud@localization@german{\contentname}{Inhalt}%
-\tud@localization@german{\assessmentname}{Bewertung}%
+\tud@localization@german{\taskname}{Aufgabenstellung}
+\tud@localization@german{\tasktext}{f\"ur die Anfertigung einer}
+\tud@localization@german{\namesname}{Name}
+\tud@localization@german{\issuedatetext}{Ausgeh\"andigt am}
+\tud@localization@german{\duedatetext}{Einzureichen am}
+\tud@localization@german{\chairmanname}{Pr\"ufungsausschussvorsitzender}
+\tud@localization@german{\focusname}{Schwerpunkte der Arbeit}
+\tud@localization@german{\objectivesname}{Ziele der Arbeit}
+\tud@localization@german{\evaluationname}{Gutachten}
+\tud@localization@german{\evaluationtext}{f\"ur die}
+\tud@localization@german{\contentname}{Inhalt}
+\tud@localization@german{\assessmentname}{Bewertung}
\tud@localization@german{\gradetext}{%
Die Arbeit wird mit der Note \textbf{\@grade} bewertet.%
-}%
-\tud@localization@german{\noticename}{Aushang}%
+}
+\tud@localization@german{\noticename}{Aushang}
% \end{macrocode}
%
% \iffalse
@@ -707,8 +707,8 @@
%
% Dies sind die Bezeichner für die Quelltextdokumentation.
% \begin{macrocode}
-\tud@localization@german{\tud@general@name}{Allgemein}%
-\tud@localization@german{\tud@implementation@name}{Implementierung}%
+\tud@localization@german{\tud@general@name}{Allgemein}
+\tud@localization@german{\tud@implementation@name}{Implementierung}
\tud@localization@german{\tud@changes@name}{\"Anderungsliste}
\tud@localization@german{\tud@todo@name}{Liste der noch zu erledigenden Punkte}
\tud@localization@german{\tud@environment@name}{Umg.}
@@ -734,13 +734,13 @@
\tud@localization@german{\tud@parameter@name}{Param.}
\tud@localization@german{\tud@parameters@name}{Parameter}
\tud@localization@german{\tud@index@text}{%
- Kursive Zahlen entsprechen der Seite, auf welcher der korrespondierende
- Eintrag beschrieben wird. Unterstrichene Zahlen verweisen auf die
- \ifcodeline@index Codezeile der \fi Definition.
+ Kursive Zahlen entsprechen der Seite, auf welcher der korrespondierende %
+ Eintrag beschrieben wird. Unterstrichene Zahlen verweisen auf die %
+ \ifcodeline@index Codezeile der \fi Definition. %
\ifscan@allowed%
- Alle weiteren Eintr\"age sind
- \ifcodeline@index Zeilennummern\else Seitenzahlen\fi,
- wo der jeweilige Eintrag verwendet wird.
+ Alle weiteren Eintr\"age sind %
+ \ifcodeline@index Zeilennummern\else Seitenzahlen\fi, %
+ wo der jeweilige Eintrag verwendet wird.%
\fi%
}
% \end{macrocode}
@@ -776,7 +776,7 @@
% die deutsche Sprache und ihre Dialekte.
% \begin{macrocode}
%<*book|report|article>
-\tud@localization@english{\graduationtext}{to achieve the academic degree}%
+\tud@localization@english{\graduationtext}{to achieve the academic degree}
\tud@localization@english{\refereename}{%
\tud@ifin@and{\@referee}{%
\ifx\refereeothername\@empty%
@@ -785,8 +785,8 @@
First referee%
\fi%
}{Referee}%
-}%
-\tud@localization@english{\refereeothername}{Second referee}%
+}
+\tud@localization@english{\refereeothername}{Second referee}
\tud@localization@english{\advisorname}{%
\tud@ifin@and{\@advisor}{%
\ifx\advisorothername\@empty%
@@ -795,8 +795,8 @@
First advisor%
\fi%
}{Advisor}%
-}%
-\tud@localization@english{\advisorothername}{}%
+}
+\tud@localization@english{\advisorothername}{}
\tud@localization@english{\supervisorname}{%
\tud@ifin@and{\@supervisor}{%
\ifx\supervisorothername\@empty%
@@ -805,8 +805,8 @@
First supervisor%
\fi%
}{Supervisor}%
-}%
-\tud@localization@english{\supervisorothername}{}%
+}
+\tud@localization@english{\supervisorothername}{}
\tud@localization@english{\professorname}{%
\tud@ifin@and{\@professor}{%
\ifx\professorothername\@empty%
@@ -815,73 +815,71 @@
First supervising professor%
\fi%
}{Supervising professor}%
-}%
-\tud@localization@english{\professorothername}{}%
-\tud@localization@english{\datetext}{Submitted on}%
-\tud@localization@english{\dateofbirthtext}{Born on}%
-\tud@localization@english{\placeofbirthtext}{in}%
-\tud@localization@english{\defensedatetext}{Defended on}%
-\tud@localization@english{\matriculationyearname}{Matriculation year}%
-\tud@localization@english{\matriculationnumbername}{Matriculation number}%
-\tud@localization@english{\coverpagename}{Cover page}%
-\tud@localization@english{\titlepagename}{Title page}%
-\tud@localization@english{\titlename}{Title}%
+}
+\tud@localization@english{\professorothername}{}
+\tud@localization@english{\datetext}{Submitted on}
+\tud@localization@english{\dateofbirthtext}{Born on}
+\tud@localization@english{\placeofbirthtext}{in}
+\tud@localization@english{\defensedatetext}{Defended on}
+\tud@localization@english{\matriculationyearname}{Matriculation year}
+\tud@localization@english{\matriculationnumbername}{Matriculation number}
+\tud@localization@english{\coverpagename}{Cover page}
+\tud@localization@english{\titlepagename}{Title page}
+\tud@localization@english{\titlename}{Title}
%<*book>
-\tud@localization@english{\abstractname}{Abstract}%
+\tud@localization@english{\abstractname}{Abstract}
%</book>
-\tud@localization@english{\confirmationname}{Statement of authorship}%
+\tud@localization@english{\confirmationname}{Statement of authorship}
\tud@localization@english{\confirmationtext}{%
- I hereby certify that I have authored this
- \ifx\@@thesis\@empty thesis\else\@@thesis{} \fi
- \ifx\@@title\@empty\else entitled \emph{\@@title} \fi
- independently and without undue assistance from third
- parties. No other than the resources and references
- indicated in this thesis have been used. I have marked
- both literal and accordingly adopted quotations as such.
+ I hereby certify that I have authored this document %
+ \ifx\@@title\@empty\else entitled \emph{\@@title} \fi%
+ independently and without undue assistance from third %
+ parties. No other than the resources and references %
+ indicated in this document have been used. I have marked %
+ both literal and accordingly adopted quotations as such. %
\ifx\@supporter\@empty%
- There were no additional persons involved in the
- intellectual preparation of the present thesis.
+ There were no additional persons involved in the %
\else%
- During the preparation of this thesis I was only
+ During the preparation of this document I was only %
supported by the following persons:%
\begin{quote}\def\and{\newline}\@supporter\end{quote}%
- \noindent Additional persons were not involved in the
- intellectual preparation of the present thesis.
+ \noindent Additional persons were not involved in the %
\fi%
- I am aware that violations of this declaration may lead to
- subsequent withdrawal of the degree.%
-}%
-\tud@localization@english{\blockingname}{Restriction note}%
+ intellectual preparation of the present document. %
+ I am aware that violations of this declaration may lead to %
+ subsequent withdrawal of the academic degree.%
+}
+\tud@localization@english{\blockingname}{Restriction note}
\tud@localization@english{\blockingtext}{%
- This \ifx\@@thesis\@empty thesis \else\@@thesis{} \fi
- \ifx\@@title\@empty\else entitled \emph{\@@title} \fi
- contains confidential data\ifx\@company\@empty\else
- , disclosed by \emph{\@company}\fi. Publications, duplications
- and inspections---even in part---are prohibited without explicit
- permission\ifx\@company\@empty\else\space by \emph{\@company}\fi,
- as well as publications about the content of this thesis.
- This thesis may only be made accessible to the supervisor at
- Technische Universit\"at Dresden, the reviewers and also the
- members of the examination board.%
-}%
+ This document %
+ \ifx\@@title\@empty\else entitled \emph{\@@title} \fi%
+ contains confidential data%
+ \ifx\@company\@empty\else, disclosed by \emph{\@company}\fi. %
+ Publications, duplications and inspections---even in part---are prohibited %
+ without explicit permission%
+ \ifx\@company\@empty\else\space by \emph{\@company}\fi, %
+ as well as publications about the content of this document. %
+ It may only be made accessible to the supervisor at Technische Universit\"at %
+ Dresden, the reviewers and also the members of the examination board.%
+}
%</book|report|article>
-\tud@localization@english{\coursename}{Course}%
-\tud@localization@english{\disciplinename}{Discipline}%
-\tud@localization@english{\listingname}{Listing}%
-\tud@localization@english{\listlistingname}{List of Listings}%
-\tud@localization@english{\dissertationname}{Dissertation}%
-\tud@localization@english{\diplomathesisname}{Diploma Thesis}%
-\tud@localization@english{\masterthesisname}{Master Thesis}%
-\tud@localization@english{\bachelorthesisname}{Bachelor Thesis}%
-\tud@localization@english{\studentthesisname}{Student Thesis}%
-\tud@localization@english{\studentresearchname}{Student Research Project}%
-\tud@localization@english{\projectpapername}{Project Paper}%
-\tud@localization@english{\seminarpapername}{Seminar Paper}%
-\tud@localization@english{\termpapername}{Term Paper}%
-\tud@localization@english{\researchname}{Research Report}%
-\tud@localization@english{\logname}{Log}%
-\tud@localization@english{\internshipname}{Internship Report}%
-\tud@localization@english{\reportname}{Report}%
+\tud@localization@english{\coursename}{Course}
+\tud@localization@english{\disciplinename}{Discipline}
+\tud@localization@english{\listingname}{Listing}
+\tud@localization@english{\listlistingname}{List of Listings}
+\tud@localization@english{\dissertationname}{Dissertation}
+\tud@localization@english{\diplomathesisname}{Diploma Thesis}
+\tud@localization@english{\masterthesisname}{Master Thesis}
+\tud@localization@english{\bachelorthesisname}{Bachelor Thesis}
+\tud@localization@english{\studentthesisname}{Student Thesis}
+\tud@localization@english{\studentresearchname}{Student Research Project}
+\tud@localization@english{\projectpapername}{Project Paper}
+\tud@localization@english{\seminarpapername}{Seminar Paper}
+\tud@localization@english{\termpapername}{Term Paper}
+\tud@localization@english{\researchname}{Research Report}
+\tud@localization@english{\logname}{Log}
+\tud@localization@english{\internshipname}{Internship Report}
+\tud@localization@english{\reportname}{Report}
% \end{macrocode}
%
% \iffalse
@@ -893,9 +891,9 @@
% Hier erfolgen für die Klasse \cls{tudscrposter} sowie das Paket
% \pkg{tudscrsupervisor} weitere Definitionen.
% \begin{macrocode}
-\tud@localization@english{\authorname}{Author}%
-\tud@localization@english{\contactname}{Contact}%
-\tud@localization@english{\contactpersonname}{Counterpart}%
+\tud@localization@english{\authorname}{Author}
+\tud@localization@english{\contactname}{Contact}
+\tud@localization@english{\contactpersonname}{Counterpart}
% \end{macrocode}
%
% \iffalse
@@ -905,22 +903,22 @@
%
% Hier erfolgen für das Paket \pkg{tudscrsupervisor} weitere Definitionen.
% \begin{macrocode}
-\tud@localization@english{\taskname}{Task}%
-\tud@localization@english{\tasktext}{for the preparation of a}%
-\tud@localization@english{\namesname}{Name}%
-\tud@localization@english{\issuedatetext}{Issued on}%
-\tud@localization@english{\duedatetext}{Due date for submission}%
-\tud@localization@english{\chairmanname}{Chairman of the Audit Committee}%
-\tud@localization@english{\focusname}{Focus of work}%
-\tud@localization@english{\objectivesname}{Objectives of work}%
-\tud@localization@english{\evaluationname}{Evaluation}%
-\tud@localization@english{\evaluationtext}{for the}%
-\tud@localization@english{\contentname}{Content}%
-\tud@localization@english{\assessmentname}{Assessment}%
+\tud@localization@english{\taskname}{Task}
+\tud@localization@english{\tasktext}{for the preparation of a}
+\tud@localization@english{\namesname}{Name}
+\tud@localization@english{\issuedatetext}{Issued on}
+\tud@localization@english{\duedatetext}{Due date for submission}
+\tud@localization@english{\chairmanname}{Chairman of the Audit Committee}
+\tud@localization@english{\focusname}{Focus of work}
+\tud@localization@english{\objectivesname}{Objectives of work}
+\tud@localization@english{\evaluationname}{Evaluation}
+\tud@localization@english{\evaluationtext}{for the}
+\tud@localization@english{\contentname}{Content}
+\tud@localization@english{\assessmentname}{Assessment}
\tud@localization@english{\gradetext}{%
The thesis is evaluated with a grade of \textbf{\@grade}.%
-}%
-\tud@localization@english{\noticename}{Notice}%
+}
+\tud@localization@english{\noticename}{Notice}
% \end{macrocode}
%
% \iffalse
@@ -930,8 +928,8 @@
%
% Dies sind die Bezeichner für die Quelltextdokumentation.
% \begin{macrocode}
-\tud@localization@english{\tud@general@name}{General}%
-\tud@localization@english{\tud@implementation@name}{Implementation}%
+\tud@localization@english{\tud@general@name}{General}
+\tud@localization@english{\tud@implementation@name}{Implementation}
\tud@localization@english{\tud@changes@name}{Change History}
\tud@localization@english{\tud@todo@name}{List of ToDos}
\tud@localization@english{\tud@environment@name}{env.}
@@ -957,13 +955,13 @@
\tud@localization@english{\tud@parameter@name}{param.}
\tud@localization@english{\tud@parameters@name}{parameters}
\tud@localization@english{\tud@index@text}{%
- Numbers written in italic refer to the page where the corresponding entry is
- described. Numbers underlined refer to the
- \ifcodeline@index code line of the \fi definition.
+ Numbers written in italic refer to the page where the corresponding entry is %
+ described. Numbers underlined refer to the %
+ \ifcodeline@index code line of the \fi definition. %
\ifscan@allowed%
- All additional entries refer to the
- \ifcodeline@index code lines \else pages \fi
- where the entry is used.
+ All additional entries refer to the %
+ \ifcodeline@index code lines \else pages \fi, %
+ where the entry is used.%
\fi%
}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/tudscr/tudscr-misc.dtx b/Master/texmf-dist/source/latex/tudscr/tudscr-misc.dtx
index 4cc2abc463b..ae760053bf9 100644
--- a/Master/texmf-dist/source/latex/tudscr/tudscr-misc.dtx
+++ b/Master/texmf-dist/source/latex/tudscr/tudscr-misc.dtx
@@ -52,7 +52,7 @@
% \fi
%
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
-\ProvidesFile{tudscr-misc.dtx}[2019/08/20 v2.06c TUD-Script\space%
+\ProvidesFile{tudscr-misc.dtx}[2020/09/29 v2.06j TUD-Script\space%
(miscellaneous)%
]
%
@@ -606,7 +606,7 @@
% geladen.
% \begin{macrocode}
%<*class&!inherit>
-\LoadClass{\TUD@Class@KOMA}[2018/03/30]
+\LoadClass{\TUD@Class@KOMA}[2020/09/21]
%</class&!inherit>
%<*class&inherit>
%<manual>\PassOptionsToClass{ttfont=roboto}{\TUD@Class@Parent}
diff --git a/Master/texmf-dist/source/latex/tudscr/tudscr-pagestyle.dtx b/Master/texmf-dist/source/latex/tudscr/tudscr-pagestyle.dtx
index 1faf4406734..d230be498b6 100644
--- a/Master/texmf-dist/source/latex/tudscr/tudscr-pagestyle.dtx
+++ b/Master/texmf-dist/source/latex/tudscr/tudscr-pagestyle.dtx
@@ -52,7 +52,7 @@
% \fi
%
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
-\ProvidesFile{tudscr-pagestyle.dtx}[2019/08/20 v2.06c TUD-Script\space%
+\ProvidesFile{tudscr-pagestyle.dtx}[2020/09/29 v2.06j TUD-Script\space%
(pagestyle)%
]
%
@@ -121,7 +121,7 @@
\if@tud@x@standalone@crop
\PreventPackageFromLoading{scrlayer-scrpage}%
\else
- \AtEndPreamble{\RequirePackage{scrlayer-scrpage}[2013/12/14]}%
+ \AtEndPreamble{\RequirePackage{scrlayer-scrpage}[2020/09/21]}%
\fi
% \end{macrocode}
% Für das Erzeugen der Seitenstile wird das Paket \pkg{scrlayer-scrpage}
@@ -644,10 +644,13 @@
% bereits durch den Anwender ausgewählt werden können, wird \cs{pagestyle}
% temporär zurechtgebogen. Die Definition des Makros wird gesichert und direkt
% vor dem Laden des Paketes wiederhergestellt. Damit werden die Seitenstile
-% erst aktiviert, nachdem diese auch tatsächlich erstellt wurden.
+% erst aktiviert, nachdem diese auch tatsächlich erstellt wurden. Alle zuvor
+% angeforderten Seitenstile werden erst nach dem Paket propagiert.
% \begin{macrocode}
\tud@cs@store{pagestyle}
-\renewcommand*\pagestyle[1]{\AfterPackage!{scrlayer-scrpage}{\pagestyle{#1}}}
+\renewcommand*\pagestyle[1]{%
+ \AfterAtEndOfPackage*{scrlayer-scrpage}{\pagestyle{#1}}%
+}
\BeforePackage{scrlayer-scrpage}{%
\tud@cs@restore{pagestyle}%
\undef\tud@pagestyle%
@@ -661,7 +664,7 @@
% Einstellungen abgeschlossen sein müssen, um die Satzspiegel zu definieren.
% \ToDo{Abhängigkeiten Satzspiegel<>Seitenstil beseitigen}[v2.07]
% \begin{macrocode}
-\AfterPackage!{scrlayer-scrpage}{\AtEndPreamble{\tud@cdgeometry@init}}
+\AfterAtEndOfPackage*{scrlayer-scrpage}{\AtEndPreamble{\tud@cdgeometry@init}}
% \end{macrocode}
% \begin{macro}{\ps@tudheadings}
% \begin{macro}{\ps@plain.tudheadings}
diff --git a/Master/texmf-dist/source/latex/tudscr/tudscr-version.dtx b/Master/texmf-dist/source/latex/tudscr/tudscr-version.dtx
index f7bef28b006..86321821781 100644
--- a/Master/texmf-dist/source/latex/tudscr/tudscr-version.dtx
+++ b/Master/texmf-dist/source/latex/tudscr/tudscr-version.dtx
@@ -110,7 +110,7 @@
\def\@tempb##1 v##2 ##3\relax##4\relax{\gdef\TUDScriptVersionNumber{##2}}%
\edef\@tempa{\TUD@Version}%
\expandafter\@tempb\@tempa\relax? ? \relax\relax%
- \gdef\TUD@Version@KOMA{3.28}%
+ \gdef\TUD@Version@KOMA{3.32}%
}
\else
\newcommand*\TUD@Version@Check[1]{%
@@ -128,7 +128,7 @@
%<*!(package|class)>
\fi
%</!(package|class)>
- \TUD@Version@Check{2020/01/14 v2.06f TUD-Script}
+ \TUD@Version@Check{2020/11/10 v2.06k TUD-Script}
\endgroup
% \end{macrocode}
% \end{macro}^^A \TUDScriptVersionNumber
diff --git a/Master/texmf-dist/source/latex/tugboat/tugboat.dtx b/Master/texmf-dist/source/latex/tugboat/tugboat.dtx
index 6ed75cece11..12e7dc63977 100644
--- a/Master/texmf-dist/source/latex/tugboat/tugboat.dtx
+++ b/Master/texmf-dist/source/latex/tugboat/tugboat.dtx
@@ -1,5 +1,5 @@
% \iffalse (this is a meta-comment (so they say))
-% $Id: tugboat.dtx 274 2020-03-12 16:47:21Z karl $
+% $Id: tugboat.dtx 314 2020-11-15 02:06:03Z karl $
% tugboat.dtx - main source for LaTeX TUGboat classes.
%
% Copyright 1994-2020 TeX Users Group.
@@ -28,7 +28,7 @@
%<ltugboatsty>\ProvidesPackage{ltugboat}
%<ltugprocsty>\ProvidesPackage{ltugproc}
%<ltugcomn> \ProvidesPackage{ltugcomn}
- [2020-03-12 v2.23
+ [2020-11-14 v2.24
%<ltugboatcls> TUGboat journal class%
%<ltugproccls> TUG conference proceedings class%
%<ltugboatsty|ltugprocsty> TUG compatibility package%
@@ -152,6 +152,7 @@
% |\JoT|& The Joy of \TeX\\
% |\LaTeX|&\\
% |\LyX|&\\
+% |\macOS|& mac OS\\
% |\MacOSX|& Mac OS X\\
% |\MathML|&\\
% |\Mc|& M with raised c\\
@@ -338,8 +339,6 @@
% |draft| vs.\ |preprint| vs.\ |final|.
%
% \begin{macrocode}
-\newif\ifpreprint
-\def\preprint{\preprinttrue}
\DeclareOption{draft}{%
\AtEndOfClass{%
\setcounter{page}{901}%
@@ -358,10 +357,16 @@
\PrelimDrafttrue
}%
}
+
+\newif\ifpreprint
+\def\preprint{\preprinttrue}
\DeclareOption{preprint}{%
\preprinttrue
}
+
+\newif\iftubfinaloption % [final]
\DeclareOption{final}{%
+ \tubfinaloptiontrue
\AtEndOfClass{%
\let\thepage=\tuborigthepage
\NoBlackBoxes
@@ -372,7 +377,7 @@
% registration marks, etc.
\ifnum\value{page}>900 \PrelimDrafttrue \else \PrelimDraftfalse \fi
\@tubrunningfull
- }%
+ }%
}
% \end{macrocode}
%
@@ -471,6 +476,17 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\ifsecondcolstart}
+% Occasionally, we need to start an article in the second column of a
+% page, due to splicing with a previous article. Let's try declaring that.
+% Then, before |\maketitle|, we'll force the move to the second column.
+%
+% \begin{macrocode}
+\newif\iftubsecondcolstart
+\DeclareOption{secondcolstart}{\tubsecondcolstarttrue}
+% \end{macrocode}
+% \end{macro}
+%
% Any other options, we pass on to |article.cls| before we load it:
%
% \begin{macrocode}
@@ -785,12 +801,14 @@
\def\MkIV{Mk\acro{IV}}
\let\TB@@mp\mp
\DeclareRobustCommand{\mp}{\ifmmode\TB@@mp\else MetaPost\fi}
+\def\mtex{T\kern-.1667em\lower.424ex\hbox{\^E}\kern-.125emX\@}
%
% In order that the \cs{OMEGA} command will switch to using the TS1
% variant of the capital Omega character if \texttt{textcomp.sty} is
% loaded, we define it in terms of the \cs{textohm} command. Note
% that this requires us to interpose a level of indirection, rather
% than to use \cs{let}\dots
+% Revised definition of \cs{NTS} based on that used by Phil Taylor.
%
% \begin{macrocode}
\DeclareRobustCommand{\NTG}{\acro{NTG}}
@@ -803,9 +821,8 @@
\DeclareRobustCommand{\OOXML}{\acro{OOXML}}
\DeclareRobustCommand{\OTF}{\acro{OTF}}
\DeclareRobustCommand{\OTP}{\OMEGA\acro{TP}}
-\def\mtex{T\kern-.1667em\lower.424ex\hbox{\^E}\kern-.125emX\@}
+\DeclareRobustCommand{\OpTeX}{Op\kern-.05em\TeX}
% \end{macrocode}
-% Revised definition of \cs{NTS} based on that used by Phil Taylor.
% \begin{macrocode}
\def\Pas{Pascal}
\def\pcMF{\leavevmode\raise.5ex\hbox{p\kern-.3\p@ c}MF\@}
@@ -854,8 +871,7 @@
\def\TikZ{Ti{\em k}Z}
\def\ttn{\textsl{TTN}\@}
\def\TTN{\textsl{\TeX{} and TUG News}}
-\let\texttub\textsl % redefined in other situations
-\def\TUB{\texttub{TUGboat}}
+\def\TUB{\texttub{TUGboat}}\def\texttub{\textsl} % redefined in some situations
\def\TUG{\TeX\ \UG}
\def\tug{\acro{TUG}}
\def\UG{Users Group}
@@ -881,7 +897,7 @@
% \begin{macrocode}
\def\tubreflect#1{%
\@ifundefined{reflectbox}{%
- \TBerror{A graphics package must be loaded for \string\XeTeX}%
+ \TBError{A graphics package must be loaded for \string\XeTeX}%
}{%
\ifdim \fontdimen1\font>0pt
\raise 1.75ex \hbox{\kern.1em\rotatebox{180}{#1}}\kern-.1em
@@ -1051,9 +1067,10 @@
\advance\minutes by-\time
\global\multiply\minutes by-1 }
\SetTime
-\def\now{\number\hours:\ifnum\minutes<10 0\fi\number\minutes}
+\def\now{\ifnum\hours<10 0\fi\number\hours:%
+ \ifnum\minutes<10 0\fi\number\minutes}
\def\Now{\today\ \now}
-\newif\ifPrelimDraft
+\newif\ifPrelimDraft % [draft] or [preprint] or pageno>900
\def\midrtitle{} % center of running heads
\def\rtitlenexttopage{\ifPrelimDraft \textsl{\small draft: \Now}\fi}
% \end{macrocode}
@@ -1196,6 +1213,7 @@
\ifx\hyper@normalise\undefined
\def\tbsurl{\url}% no hyperref, so just \url is fine.
\def\tbhurl{\url}%
+ \ifx\url\undefined \let\url\texttt \fi % er, make sure \url is defined
\else
% This hyperref hook-in is due to Ulrike Fischer.
% \url{https://github.com/latex3/hyperref/issues/125}.
@@ -1209,11 +1227,15 @@
% Make \! work in text mode.
\DeclareRobustCommand{\!}{\ifmmode\mskip-\thinmuskip \else\kern-0.16667em \fi}
%
-% Half a thinspace.
+% Half a thinspace, positive and negative.
\DeclareRobustCommand{\tubthinnerspace}
{\ifmmode\mskip.5\thinmuskip \else\kern0.08333em \fi}
\DeclareRobustCommand{\tubthinnerspaceneg}
{\ifmmode\mskip-.5\thinmuskip \else\kern-0.08333em \fi}
+%
+% Half a smallskip.
+\DeclareRobustCommand{\tubsmallerskip}
+ {\vskip 1.5pt plus .75pt minus .75pt\relax}
%
% \end{macrocode}
%
@@ -1293,7 +1315,7 @@
\therevauth\therevtitle\therevpubinfo\endgraf}%
\vskip\medskipamount
}
-\def\booktitle#1{{\slshape#1\/}}
+\def\booktitle#1{{\slshape\frenchspacing#1\/}}
% \end{macrocode}
%
% \subsection{Dates, volume and issue numbers, etc.}
@@ -1313,38 +1335,35 @@
%
% For production, these are set in a separate file,
% |tugboat.dates|, which is issue-specific.
-%
-% \begin{description}
-% \item[\emph{Comment:}] I would like to make the code read a file
-% |tugboat.dates| in the current directory or its parent.
-% This is easy except under `odd' operating systems ({\small VMS} is
-% an example that springs to mind, {\small RISC}os may be even
-% worse) whose syntax is out of the ordinary.
-% \end{description}
-%
+%
% \begin{macrocode}
-\newcount\issueseqno \issueseqno=-1
+\newcount\issueseqno \issueseqno=-1
\def\v@lx{\gdef\volx{Volume~\volno~(\volyr), No.~\issno}}
\def\volyr{}
\def\volno{}
-\def\vol #1,#2.{\gdef\volno{#1\unskip}%
- \gdef\issno{\ignorespaces#2\unskip}%
+\def\vol#1, #2.{%
+ \gdef\volno{#1}%
+ \gdef\issno{#2}%
\setbox\TestBox=\hbox{\volyr}%
\ifdim \wd\TestBox > .2em \v@lx \fi }
-\def\issyear #1.{\gdef\issdt{#1}\gdef\volyr{#1}%
+\def\issyear#1.{%
+ \gdef\issdt{#1}\gdef\volyr{#1}%
\gdef\bigissdt{#1}%
\setbox\TestBox=\hbox{\volno}%
\ifdim \wd\TestBox > .2em \v@lx \fi }
-\def\issdate #1#2 #3.{\gdef\issdt{#1#2 #3}\gdef\volyr{#3}%
+\def\issdate#1#2 #3.{%
+ \gdef\issdt{#1#2 #3}\gdef\volyr{#3}%
\gdef\bigissdt{#1{\smc\uppercase{#2}} #3}%
\setbox\TestBox=\hbox{\volno}%
\ifdim \wd\TestBox > .2em \v@lx \fi }
+% The \vol command must be invoked precisely like this, including spaces.
+% Since we are the only ones who write it, we can be strict.
\vol 0, 0.
\issdate Thermidor, 9999.
% \end{macrocode}
%
-% (The curious should know that \emph{Thermidor} was one of the French
-% revolutionary month names\dots)
+% (The curious may like to know that \emph{Thermidor} was one of the French
+% revolutionary month names.)
%
% For \LaTeX{} use, define a version of the issue declaration that can
% take or leave the old plain syntax
@@ -1507,10 +1526,10 @@
\ifx\tubomithyphenations\@thisisundefined
\hyphenation{Del-a-ware Dijk-stra Duane Eijk-hout
Flor-i-da Free-BSD Ghost-script Ghost-view
- Hara-lam-bous Jac-kow-ski Karls-ruhe
+ Hara-lam-bous Jac-kow-ski Ja-pa-nese Karls-ruhe
Mac-OS Ma-la-ya-lam Math-Sci-Net
Net-BSD Open-BSD Open-Office
- Pfa-Edit Post-Script Rich-ard Skoup South-all
+ Pak-i-stan Pfa-Edit Post-Script Rich-ard Skoup South-all
Vieth VM-ware Win-Edt
acro-nym acro-nyms analy-sis ap-pen-di-ces ap-pen-dix asyn-chro-nous
bib-lio-graph-i-cal bit-map bit-mapped bit-maps buf-fer buf-fers bool-ean
@@ -1569,6 +1588,11 @@
\parsep=3\p@\@plus\p@\@minus\p@
\itemsep=\parsep
%
+% The width of one column plus gutter (=243pt) is useful sometimes.
+\newdimen\tubcolwidthandgutter
+ \tubcolwidthandgutter=\columnwidth
+ \advance\tubcolwidthandgutter by \columnsep
+%
% Ordinarily we typeset in two columns, but the onecolumn option
% goes to one. In which case we want to center the text block on an
% 8.5in width, given the default 72.27pt offset with margins of zero.
@@ -2105,11 +2129,17 @@
% author or other title. In this case, the command flushes out the
% latest \cs{sectitle} (or whatever) but does nothing else.
%
-% Provide machinery to skip extra space, even one or more full columns,
+% Provide machinery (|\PreTitleDrop| to skip extra space, even one or
+% more full columns,
% above the top of an article to leave space to paste up a previous
% article that has finished on the same page. This is a fall back to
% accommodate the fact that multiple articles cannot yet be run together
% easily with \LaTeXe.
+%
+% In addition, if the |secondcolstart| option was specified, do
+% |\null\newpage| to move over. This is separate from |\PreTitleDrop|,
+% for no particular reason.
+%
% \begin{macrocode}
\newif\if@articletitle
\def\maketitle{\@ifstar
@@ -2126,6 +2156,7 @@
\vbox to \PreTitleDrop{}
\global\PreTitleDrop=\z@
\fi
+ \iftubsecondcolstart \null\newpage\fi
\begingroup
\setcounter{footnote}{0}
\global\@topnum\z@ % disallow floats above the title
@@ -2428,31 +2459,32 @@
% \textsc{numbersec} is in effect.
%
% \begin{macrocode}
+\def\tubsechook{}
\if@numbersec
\def\section{\TB@startsection{{section}%
1%
\z@
{-8\p@ \@plus-2\p@ \@minus-2\p@}%
{4\p@}%
- {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ {\normalsize\bf\raggedright\hyphenpenalty\@M\tubsechook}}}
\def\subsection{\TB@startsection{{subsection}%
2%
\z@
{-8\p@ \@plus-2\p@ \@minus-2\p@}%
{4\p@}%
- {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ {\normalsize\bf\raggedright\hyphenpenalty\@M\tubsechook}}}
\def\subsubsection{\TB@startsection{{subsubsection}%
3%
\z@
{-8\p@ \@plus-2\p@ \@minus-2\p@}%
{4\p@}%
- {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ {\normalsize\bf\raggedright\hyphenpenalty\@M\tubsechook}}}
\def\paragraph{\TB@startsection{{paragraph}%
4%
\z@
{4\p@ \@plus1\p@ \@minus1\p@}%
{-1em}%
- {\normalsize\bf}}}
+ {\normalsize\bf\tubsechook}}}
% \end{macrocode}
%
% Now the version if class option \textsc{nonumber} is in effect,
@@ -2467,27 +2499,27 @@
\z@
{-8\p@ \@plus-2\p@ \@minus-2\p@}%
{4\p@}%
- {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ {\normalsize\bf\raggedright\hyphenpenalty\@M\tubsechook}}}
\def\subsection{\TB@nolimelabel
\TB@startsection{{subsection}%
2%
\z@
{-8\p@ \@plus-2\p@ \@minus-2\p@}%
{-0.5em\@plus-\fontdimen3\font}%
- {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ {\normalsize\bf\raggedright\hyphenpenalty\@M\tubsechook}}}
\def\subsubsection{\TB@nolimelabel
\TB@startsection{{subsubsection}%
3%
\parindent
{-8\p@ \@plus-2\p@ \@minus-2\p@}%
{-0.5em\@plus-\fontdimen3\font}%
- {\normalsize\bf\raggedright\hyphenpenalty=\@M}}}
+ {\normalsize\bf\raggedright\hyphenpenalty\@M\tubsechook}}}
\fi
% \end{macrocode}
%
% \cs{TB@startsection} used to warn about \verb"*" versions of sectioning
% commands when numbering wasn't in effect. But that eventually seemed
-% a useless complaint, since it can be usefule to switch back and forth between
+% a useless complaint, since it can be useful to switch back and forth between
% numbered and unnumbered can be useful during article development.
% So now \cs{TB@startsection} is just a synonym for \cs{@startsection}.
%
@@ -2722,7 +2754,7 @@
% \end{macro}
%
% One-line captions are normally centered, but sometimes we want to set
-% them flush-left for consistency with other nearby figures.
+% them flush-left for consistency with other nearby figures.
% \begin{macro}{\tubcaptionleftglue}
% \begin{macrocode}
\let\tubcaptionleftglue=\hfil
@@ -2745,7 +2777,7 @@
\fi
\noindent \tubmakecaptionbox{#1}{#2}\par}%
\else
- % fits on one line; use the hbox, centered. Do not reset its glue.
+ % fits on one line; use the hbox, usually centered. Do not reset its glue.
\global\@minipagefalse
\hb@xt@\hsize{\tubcaptionleftglue\box\@tempboxa\hfil}%
\fi
@@ -3261,7 +3293,7 @@
\def\botregister{\tbotregister}
% \end{macrocode}
%
-% \subsection{Running heads}
+% \subsection{Running headers and footers}
%
% \begin{macrocode}
\def\rtitlex{\def\texttub##1{{\normalsize\textrm{##1}}}\TUB, \volx}
@@ -3297,21 +3329,23 @@
\def\@oddfoot{% make line break commands produce a normal space
\def\\{\unskip\ \ignorespaces}%
\let\newline=\\%
- \frenchspacing
- \hfil\rhTitle}
- \def\@evenfoot{\frenchspacing \let\thanks\@gobble \tubrunningauthor\hfil}
+ \tubtypesetdoi
+ \frenchspacing\hfil\rhTitle}
+ \def\@evenfoot{%
+ \let\thanks\@gobble
+ \tubtypesetdoi
+ \frenchspacing\tubrunningauthor\hfil}
}
% empty footer.
\def\@tubrunningminimal{%
- \def\@oddfoot{\hfil}%
- \def\@evenfoot{\hfil}%
+ \def\@oddfoot{\tubtypesetdoi\hfil}%
+ \def\@evenfoot{\tubtypesetdoi\hfil}%
}
% empty footer and header.
\def\@tubrunningoff{%
- \def\@oddfoot{\hfil}%
- \def\@evenfoot{\hfil}%
+ \@tubrunningminimal
\def\@oddhead{\hfil}%
\def\@evenhead{\hfil}%
}
@@ -3320,6 +3354,43 @@
\pagestyle{headings}
% \end{macrocode}
%
+% Typeset the doi. The format we decided on looks like:
+% \texttt{https://doi.org/10.47397/tb/41-3/tb129mansour-nonlatin}
+% where the last element is (usually) the |\jobname|.
+%
+% We put this below the footline. The footer definitions above specify
+% that it is always called, even if the regular footer is empty.
+%
+% If the article started in the second column (option [secondcolstart]),
+% have to manually move the doi over.
+%
+% We do not check for validity of |\volno|, etc. For testing, etc.,
+% seems simpler to just typeset what we've got.
+%
+% But don't do any of this yet. Maybe for 42:1.
+%
+% \begin{macrocode}
+%
+\def\tubdoiprefix{10.47397/tb} % the number crossref assigned us
+%
+\def\notyettubtypesetdoi{\iftubfinaloption % do this if [final], even if pageno>900
+ \vbox to 0pt{% don't impact normal layout
+ \edef\thedoi{\ifnum\value{page}>900 xnot\fi % but make url invalid if >900
+ doi.org/\tubdoiprefix/\volno-\issno/\jobname}%
+ \scriptsize
+ \vskip\baselineskip
+ \iftubsecondcolstart \moveright \tubcolwidthandgutter \fi
+ \rlap{\expandafter\tbsurl\expandafter{\thedoi}}%
+ \vss
+ }%
+ \global\let\tubtypesetdoi\@empty % only do it once, no matter what.
+\fi}
+%
+\def\tubtypesetdoi{}
+%
+% \end{macrocode}
+%
+%
% \subsection{Output routine}
% Modified to alter |\brokenpenalty| across columns
%
diff --git a/Master/texmf-dist/source/latex/ut-thesis/ut-thesis.dtx b/Master/texmf-dist/source/latex/ut-thesis/ut-thesis.dtx
new file mode 100644
index 00000000000..f1180b7056f
--- /dev/null
+++ b/Master/texmf-dist/source/latex/ut-thesis/ut-thesis.dtx
@@ -0,0 +1,607 @@
+% \iffalse
+%<*driver>
+\ProvidesFile{ut-thesis.dtx}
+%</driver>
+%<class>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<class>\ProvidesClass{ut-thesis}
+%<*class>
+[2020/11/19 v3.0.0a University of Toronto thesis class]
+%</class>
+%
+%<*driver>
+\documentclass[10pt]{ltxdoc}
+\usepackage[osf]{mathpazo}
+\usepackage[toc]{multitoc}
+\renewcommand*{\multicolumntoc}{2}
+\usepackage[margin=3cm,inner=5cm]{geometry}
+\usepackage{xcolor}
+\definecolor{code} {HTML}{990033}
+\definecolor{link} {HTML}{000066}
+\let\ottfamily\ttfamily
+\renewcommand{\ttfamily}{\color{code}\ottfamily}
+\renewcommand{\MacroFont}{\ttfamily\color{code}}
+\usepackage[colorlinks,linkcolor=link]{hyperref}
+\setlength{\skip\footins}{4ex}
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{6pt}
+\newcommand{\smacro}[2][0]{%
+ \begin{macro}{#2}\end{macro}%
+ \vspace{\dimexpr #1\baselineskip-3\baselineskip}}
+\begin{document}
+ \DocInput{ut-thesis.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{ut-thesis.dtx}
+%
+% \title{The \texttt{ut-thesis} class
+% \thanks{\fileversion~[\filedate] CTAN repository:
+% \href{https://ctan.org/pkg/ut-thesis}
+% {\texttt{https://ctan.org/pkg/ut-thesis}}}}
+% \author{
+% Francois Pitt,
+% Jesse Knight
+% \thanks{maintainer, contact:
+% \href{mailto:jesse.knight@mail.utoronto.ca}
+% {\texttt{jesse.knight@mail.utoronto.ca}}}
+% }
+%
+% \maketitle
+%
+% \begin{abstract}\noindent
+% The |ut-thesis| document class implements the formatting requirements of
+% the University of Toronto School of Graduate Studies (SGS),
+% as of Fall 2020.
+% \end{abstract}
+%
+% {\footnotesize\setlength{\parskip}{3pt}\tableofcontents}
+% \clearpage
+%
+% \section{Installation}\label{inst}
+%
+% To use the |ut-thesis| class,
+% you must first make the file |ut-thesis.cls| visible to your current \LaTeX\ distribution.
+% There are two ways to do this:
+% \begin{itemize}
+% \item \textbf{local file}: Place the file |ut-thesis.cls| in your project directory.
+% This is usually easiest, and works if you don't have write access
+% in the \LaTeX\ distribution, such as if you use Overleaf.
+% \item \textbf{installing}: Installation steps will depend on your \LaTeX\ distribution.
+% Some helpful instructions can be found
+% \href{https://en.wikibooks.org/wiki/LaTeX/Installing_Extra_Packages}{here}.
+% \end{itemize}
+%
+% \section{Usage}\label{use}
+%
+% |\documentclass{ut-thesis}|\\
+% |\documentclass[ <options> ]{ut-thesis}|
+%
+% The default options produce a final copy, ready for submission to
+% the University of Toronto School of Graduate Studies (SGS).
+%
+% \subsection{Options}\label{use:opt}
+%
+% The default class options are denoted like |option*|.
+%
+% \subsubsection{Paper Size}\label{use:opt:paper}
+%
+% The standard page sizes are supported, including:
+% |[letterpaper*]|, and |[a4paper]|.
+%
+% \subsubsection{Font Size}\label{use:opt:fontsize}
+%
+% \smacro[ 1]{[10pt*]}
+% \smacro[ 1]{[11pt]}
+% \smacro[-2]{[12pt]}
+% \begin{macro}{]}
+% The three standard font sizes are supported.
+% SGS requires at least 10\,pt font for the text,
+% but captions, footnotes, etc.\ can be smaller.
+% \end{macro}
+%
+% \subsubsection{Line Spacing}\label{use:opt:spacing}
+%
+% \smacro[ 1]{[singlespacing]}
+% \smacro[ 1]{[onehalfspacing*]}
+% \smacro[-2]{[doublespacing]}
+% \begin{macro}{]}
+% Three options are available for line spacing.
+% Note that |[singlespacing]| does not conform to the SGS guidelines,
+% but we provide it in case you ever prefer it while writing.
+% \end{macro}
+%
+% \subsubsection{Margins}\label{use:opt:margins}
+%
+% \paragraph{Sides:}
+% Three variants of margins are defined,
+% reflecting preferences for printing and binding,
+% the first two being the same as in the |book| class:
+%
+% \begin{macro}{[oneside]}
+% All pages behave as if they open to the right (wider left margin).
+% \end{macro}
+%
+% \begin{macro}{[twoside*]}
+% Most pages will alternate opening to the right and left;
+% however, the commands: |\maketitle|, |\begin{abstract}| and |\mainmatter|,
+% which create new pages, will always open to the right,
+% sometimes requiring a blank page before to do so.
+% \end{macro}
+%
+% \begin{macro}{[equalmargins]}
+% The left and right margins are equal (averaged);
+% all pages behave as if they open to the right.
+% \end{macro}
+%
+% \paragraph{Opening:}
+% Only if |[twoside]| is used, two additional options from the |book| class
+% control how other new pages will open, including new pages created by:
+% |\listoftables|, |\listoffigures|, and |\chapter{}|.
+%
+% \begin{macro}{[openright*]}
+% These pages will always open to the right (like |\maketitle|, etc.).
+% \end{macro}
+%
+% \begin{macro}{[openany]}
+% These pages can open to the left or right.
+% \end{macro}
+%
+% \paragraph{Widths:}
+% Four widths of margins are defined based on
+% the inner (left) and outer (right/top/bottom) dimensions:
+%
+% \begin{macro}{[narrowmargins]}
+% Inner: 1.25 inch; outer: 0.75 inch
+% (minimum SGS requirements)
+% \end{macro}
+% \begin{macro}{[normalmargins*]}
+% Inner: 1.50 inch; outer: 1.00 inch
+% \end{macro}
+% \begin{macro}{[widemargins]}
+% Inner: 1.75 inch; outer: 1.25 inch
+% \end{macro}
+% \begin{macro}{[extrawidemargins]}
+% Inner: 2.00 inch; outer: 1.50 inch
+% \end{macro}
+%
+% \subsubsection{Draft}\label{use:opt:draft}
+%
+% \begin{macro}{[draft]}
+% Adds ``DRAFT'' to all 4 corners, plus the date centered below the footer.
+% The default |draft| behaviour for the |book| class is also supported.
+% \end{macro}
+%
+% \subsection{Commands}\label{use:cmd}
+%
+% \subsubsection{Author Information}\label{use:cmd:author}
+%
+% The following 5 commands should be used in the preamble
+% to define the content of the titlepage (|\maketitle|) and abstract page (|abstract| environment).
+%
+% \begin{macro}{\author}
+% Your full name.
+% \end{macro}
+%
+% \begin{macro}{\title}
+% The title of your thesis.
+% \end{macro}
+%
+% \begin{macro}{\degree}
+% The title of your degree (spelled out, like ``Doctor of Philosophy'' not ``PhD'').
+% \end{macro}
+%
+% \begin{macro}{\department}
+% The name of your department.
+% \end{macro}
+%
+% \begin{macro}{\gradyear}
+% The year of your degree completion.
+% \end{macro}
+%
+% If undefined, template values are used like ``(author)''.
+%
+% \subsubsection{Document Parts}\label{use:cmd:parts}
+%
+% From the |book| class, four commands can be used to divide the document into major parts.
+% These should be used in the order they appear here, as needed.
+% The first two commands are necessary for the required SGS page numbering style.
+%
+% \begin{macro}{\frontmatter}
+% Turns off chapter numbers, uses roman numerals for page numbers.\\
+% Suggested use: immediately after |\begin{document}|.
+% \end{macro}
+%
+% \begin{macro}{\mainmatter}
+% Turns on chapter numbers, uses arabic numerals for page numbers.\\
+% Suggested use: immediately before the first main |\chapter{}| command.
+% \end{macro}
+%
+% \begin{macro}{\appendix}
+% Uses letters for chapter numbers, no change to page numbers.\\
+% Suggested use: immediately before the first appendix |\chapter{}| command.
+% \end{macro}
+%
+% \begin{macro}{\backmatter}
+% Turns off chapter numbers, no change to page numbers.\\
+% Suggested use: immediately before |\printbibliography| or |\bibliography{}|.
+% \end{macro}
+%
+% \subsubsection{Front Matter}\label{use:cmd:front}
+%
+% From the |book| class, the following commands are available to generate the frontmatter.
+% These should be used in the order they appear here, as needed.
+%
+% \begin{macro}{\maketitle}
+% Creates the title page according to SGS requirements,
+% and adds a blank page following if using |[twoside]|.
+% \end{macro}
+%
+% (The abstract page should appear here;
+% see \S~\ref{use:env:abs}).
+%
+% (The dedication and acknowledgements should appear here, as needed;
+% see \S~\ref{use:env:ded-ackn}).
+%
+% \begin{macro}{\tableofcontents}
+% Prints the table of contents, starting on a new page.
+% \end{macro}
+%
+% \begin{macro}{\tableoftables}
+% Prints the table of tables, starting on a new page.
+% \end{macro}
+%
+% \begin{macro}{\tableoffigures}
+% Prints a table of figures, starting on a new page.
+% \end{macro}
+%
+% \subsection{Environments}\label{use:env}
+%
+% \subsubsection{Abstract}\label{use:env:abs}
+%
+% \begin{macro}{abstract}
+% Creates the abstract page according to SGS requirements,
+% and adds a blank page if using |[twoside]|.
+% The abstract content should be added within the environment,
+% and should be no more than
+% 350 words for a PhD thesis or
+% 150 words for a Master's thesis.
+% We do not provide tools for counting words.
+% \end{macro}
+%
+% \subsubsection{Dedication \& Acknowledgments}\label{use:env:ded-ackn}
+%
+% \begin{macro}{dedication}
+% The |dedication| environment formats text flush right and 2/3 down a new page.
+% Not necessary for SGS requirements, so you're welcome to redefine this environment.
+% \end{macro}
+%
+% \begin{macro}{acknowledgements}
+% The |acknowledgments| environment creates a centered heading using |\section*{}|,
+% and a new page after the text.
+% Not necessary for SGS requirements, so you're welcome to redefine this environment.
+% \end{macro}
+%
+% \subsubsection{Base Environments}\label{use:env:misc}
+%
+% As in the |book| class, the base environments
+% like |figure|, |table|, and |equation| are sub-numbered
+% within the current chapter like ``(2.1)'' for Equation~1 in Chapter~2.
+% The behaviour is equivalent to: |\counterwithin{equation}{section}|,
+% and can be undone with: |\counterwithout{equation}{section}|.
+%
+% For sub-figures, we recommend the |subcaption| package.
+%
+% The |quote| and |quotation| environments from the |book| class are also available.
+%
+% \clearpage
+%
+% \section{Implementation}\label{imp}
+%
+% \subsection{Option Declaration}\label{imp:opt}
+%
+% \subsubsection{Draft Mode}\label{imp:opt:draft}
+% Specifying |draft| adds ``DRAFT'' to all 4 corners,
+% plus the date centered below the footer.
+% The default |draft| behaviour for the |book| class is also supported.
+% \begin{macrocode}
+\newcommand{\draftmarkstyle}{\scriptsize\sffamily}
+\DeclareOption{draft}{%
+ \PassOptionsToClass{\CurrentOption}{book}
+ \AtEndOfClass{
+ \AtBeginShipout{\AtBeginShipoutUpperLeft{%
+ \draftmarkstyle
+ \put(+0.125in, -0.125in-\f@size pt ){\rlap{DRAFT}}
+ \put(-0.125in+\paperwidth,-0.125in-\f@size pt ){\llap{DRAFT}}
+ \put(+0.125in, +0.125in-\paperheight){\rlap{DRAFT}}
+ \put(-0.125in+\paperwidth,+0.125in-\paperheight){\llap{DRAFT}}
+ \put(+0.5\paperwidth,+0.125in-\paperheight)%
+ {\makebox[0in][c]{\today}}
+}}}}
+% \end{macrocode}
+%
+% \subsubsection{Margins}\label{imp:opt:margins}
+% First, we define three lengths to help us compute the margins:
+% |\margin@v| is the top and bottom margins;
+% |\margin@xhi| is the inner margin offset;
+% |\margin@xho| is the outer margin offset.
+% \begin{macrocode}
+\newlength{\margin@v}
+\newlength{\margin@xhi}\setlength{\margin@xhi}{0.5in}
+\newlength{\margin@xho}\setlength{\margin@xho}{0.0in}
+% \end{macrocode}
+%
+% The options are based off |\margin@v|:
+% \begin{macrocode}
+\DeclareOption{narrowmargins} {\setlength{\margin@v}{0.75in}}
+\DeclareOption{normalmargins} {\setlength{\margin@v}{1.00in}}
+\DeclareOption{widemargins} {\setlength{\margin@v}{1.25in}}
+\DeclareOption{extrawidemargins}{\setlength{\margin@v}{1.50in}}
+% \end{macrocode}
+%
+% For digital copies, |equalmargins| may be preferred.
+% However, to keep the |\textwidth| consistent
+% for any of the above margin options with and without |equalmargins|,
+% we simply average the inner and outer offsets:
+% \begin{macrocode}
+\DeclareOption{equalmargins}%
+ {\setlength{\margin@xho}{0.5\margin@xhi}
+ \setlength{\margin@xhi}{0.5\margin@xhi}}
+% \end{macrocode}
+%
+% Finally, we actually compute the margins using the above three lengths,
+% and adjust the placement of the header, footer, and margin notes.
+% \begin{macrocode}
+\AtEndOfClass{
+ \setlength{\leftmargin}{\dimexpr\margin@v+\margin@xhi}
+ \setlength{\rightmargin}{\dimexpr\margin@v+\margin@xho}
+ \geometry{
+ top = \margin@v,
+ bottom = \margin@v,
+ inner = \leftmargin,
+ outer = \rightmargin,
+ headsep = \dimexpr 0.5\margin@v - \headheight,
+ footskip = \dimexpr 0.5\margin@v,
+ marginparwidth = \dimexpr \rightmargin - 0.25in,
+ marginparsep = 0.125in,
+}}
+% \end{macrocode}
+%
+% \subsubsection{Line Spacing}\label{imp:opt:spacing}
+% We're using the |setspace| package.
+% We simply call one of the spacing commands after the class is loaded.
+% So, be careful to place any line spacing commands within a group,
+% or the global setting can be changed in the middle of the document.
+% The default is |onehalfspacing|.
+%
+% \begin{macrocode}
+\DeclareOption{doublespacing}{%
+ \AtEndOfClass{\doublespacing}
+}
+\DeclareOption{onehalfspacing}{%
+ \AtEndOfClass{\onehalfspacing}
+}
+\DeclareOption{singlespacing}{%
+ \AtEndOfClass{\singlespacing}
+}
+% \end{macrocode}
+%
+% \subsubsection{Book Options}\label{imp:opt:misc}
+%
+% Finally, we try to process all remaining options using the |book| class,
+% so the usual options and default values should be defined, like:
+% \begin{itemize}
+% \item page size: e.g. |letterpaper|, |a4paper|, \dots
+% \item font size: e.g. |10pt|, |11pt|, |12pt|
+% \item open side for twoside: e.g. |openright|, |openany|
+% \end{itemize}
+%
+% \begin{macrocode}
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{book}}
+% \end{macrocode}
+%
+% \subsubsection{Default Options \& Processing}\label{imp:opt:proc}
+%
+% Executing the default options and processing.
+% Any remaining options should now raise an error like:
+% |LaTeX Warning: Unused global option(s): ...|
+%
+% \begin{macrocode}
+\ExecuteOptions{letterpaper} % book
+\ExecuteOptions{normalmargins,onehalfspacing,chapterhead} % ut-thesis
+\ProcessOptions
+% \end{macrocode}
+%
+% \subsection{Initialization}\label{imp:init}
+% We load the |book| class and the required packages.
+%
+% \begin{macrocode}
+\LoadClass{book}
+\RequirePackage{picture} % for draft mode
+\RequirePackage{atbegshi} % for draft mode
+\RequirePackage{geometry} % for margins etc.
+\RequirePackage{setspace} % for line spacing
+% \end{macrocode}
+%
+% \subsection{Author Information}\label{imp:author}
+%
+% Getting the user inputs.
+%
+% \begin{macrocode}
+\renewcommand*{\author} [1]{\gdef\@author{#1}}
+\renewcommand*{\title} [1]{\gdef\@title{#1}}
+\newcommand*{\degree} [1]{\gdef\@degree{#1}}
+\newcommand*{\department}[1]{\gdef\@department{#1}}
+\newcommand*{\gradyear} [1]{\gdef\@gradyear{#1}}
+% \end{macrocode}
+%
+% Setting default values that will hopefully be overwritten.
+%
+% \begin{macrocode}
+\author {(author)}
+\title {(title)}
+\degree {(degree)}
+\department{(department)}
+\gradyear {(gradyear)}
+% \end{macrocode}
+%
+% \subsection{Front Matter}\label{imp:front}
+%
+% \subsubsection{Matter Commands}\label{imp:front:pp}
+% We enforce that the |\frontmatter| and |\mainmatter| use the right
+% page numbering and styles.
+% Also, if we are using |[twoside]|,
+% then we need to reduce all page numbers in the front matter by 1,
+% so that the |abstract| is page ``ii'',
+% because adjusting the |page| counter directly causes typesetting problems,
+% such as incorrect alternating margins.
+% \begin{macrocode}
+\newcommand{\@romanskip}[1]{\@roman{\if@twoside\numexpr#1-1\else#1\fi}}
+\g@addto@macro\frontmatter{\pagenumbering{romanskip}\pagestyle{plain}}
+\g@addto@macro\mainmatter {\pagenumbering{arabic}\pagestyle{headings}}
+% \end{macrocode}
+%
+% \subsubsection{Title Page}\label{imp:front:title}
+%
+% We don't enforce firm distances between lines,
+% but use |\vfill| to stretch and fill the space evenly,
+% except for a double-sized gap after the author name.
+% There is one part of space above the title,
+% while the copyright is pushed all the way to the bottom.
+%
+% \begin{macrocode}
+\renewcommand*{\maketitle}%
+ {\thispagestyle{empty}
+ \large
+ \begin{center}
+ \singlespacing
+ \null
+ \vfill
+ \textsc{\@title}
+ \vfill
+ by
+ \vfill
+ {\@author}
+ \vfill
+ \vfill
+ A thesis submitted in conformity with the requirements\\
+ for the degree of {\@degree}\\[1ex]
+ Graduate Department of {\@department}\\
+ University of Toronto\\
+ \vfill
+ {\copyright} Copyright {\@gradyear} by {\@author}
+ \end{center}
+ {{\pagestyle{empty}\ocleardoublepage}}
+ }
+% \end{macrocode}
+%
+% \subsubsection{Abstract Page}\label{imp:front:abs}
+%
+% The abstract is an environment, but it creates its own page
+% (and possibly an extra empty page if using |twoside|).
+% The author and title info is centered and singlespaced.
+% The word ``Abstract'' uses the |\section*| style, without any numbering.
+% The abstract content is doublespaced.
+%
+% \begin{macrocode}
+\newenvironment*{abstract}%
+ {\thispagestyle{plain}
+ \begin{center}
+ \singlespacing
+ {\@title}\\[2ex]
+ {\@author}\\
+ {\@degree}\\[1ex]
+ Graduate Department of {\@department}\\
+ University of Toronto\\
+ {\@gradyear}\\
+ \section*{Abstract}
+ \end{center}
+ \begingroup
+ \doublespacing}%
+ {\endgroup\cleardoublepage}
+% \end{macrocode}
+%
+% \subsubsection{Dedication}\label{imp:front:ded}
+%
+% As described above.
+%
+% \begin{macrocode}
+\newenvironment*{dedication}%
+ {\thispagestyle{plain}
+ \null
+ \vfill
+ \begin{flushright}}%
+ {\end{flushright}
+ \vfill
+ \vfill
+ \clearpage}
+% \end{macrocode}
+%
+% \subsubsection{Acknowledgments}\label{imp:front:ackn}
+%
+% As described above.
+%
+% \begin{macrocode}
+\newenvironment*{acknowledgements}%
+ {\thispagestyle{plain}
+ \begin{center}
+ \section*{Acknowledgments}
+ \end{center}
+ \begingroup}%
+ {\endgroup\clearpage}
+% \end{macrocode}
+%
+% \subsection{Page Styles}\label{imp:hf}
+%
+% \subsubsection{Blank Pages}\label{imp:hf:blank}
+% By defauly, all blank pages will have page style |plain|,
+% but the original definition is stored in |\ocleardoublepage|.
+% \begin{macrocode}
+\let\ocleardoublepage\cleardoublepage
+\def\cleardoublepage{{\newpage\pagestyle{plain}\ocleardoublepage}}
+% \end{macrocode}
+%
+% \subsubsection{Headers \& Footers}\label{imp:hf:hf}
+% We redefine the |headings| page style
+% with a new formatting hook |\headerstyle{}|,
+% but is otherwise similar to the original |headings|.
+% \begin{macrocode}
+\newcommand{\headerstyle}[1]{\footnotesize\MakeUppercase{#1}}
+\if@twoside
+\renewcommand*{\ps@headings}%
+ {\let\@mkboth\markboth
+ \let\@oddfoot\@empty
+ \let\@evenfoot\@empty
+ \def\@oddhead{\headerstyle{\rightmark\hfil\thepage}}%
+ \def\@evenhead{\headerstyle{\thepage\hfil\leftmark}}%
+ \def\chaptermark##1{\markboth{%
+ \if@mainmatter\headerstyle{\@chapapp\ \thechapter.\ ##1}\fi}{}}
+ \def\sectionmark##1{\markright{%
+ \if@mainmatter\headerstyle{\thesection.\ ##1}\fi}}}
+\else
+\renewcommand*{\ps@headings}%
+ {\let\@mkboth\markboth
+ \let\@oddfoot\@empty
+ \let\@evenfoot\@empty
+ \def\@oddhead{\headerstyle{\rightmark\hfil\thepage}}%
+ \def\chaptermark##1{\markright{%
+ \if@mainmatter\headerstyle{\@chapapp\ \thechapter.\ ##1}\fi}}}
+\fi
+% \end{macrocode}
+%
+% Default page style.
+% \begin{macrocode}
+\pagestyle{headings}
+% \end{macrocode}
+%
+% \subsection{Spacing Adjustments}\label{imp:adj}
+% The default spacing below captions is too small
+% for captions on top of floats (e.g.\ for tables),
+% so we make it consistent above and below.
+%
+% \begin{macrocode}
+\setlength\abovecaptionskip{1ex}
+\setlength\belowcaptionskip{1ex}
+% \end{macrocode}
+%
+\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/ut-thesis/ut-thesis.ins b/Master/texmf-dist/source/latex/ut-thesis/ut-thesis.ins
new file mode 100644
index 00000000000..362c5806c16
--- /dev/null
+++ b/Master/texmf-dist/source/latex/ut-thesis/ut-thesis.ins
@@ -0,0 +1,39 @@
+\input docstrip.tex
+\keepsilent
+\usedir{.}
+
+\preamble
+
+The |ut-thesis| document class implements the formatting requirements of
+the University of Toronto School of Graduate Studies (SGS),
+as of Fall 2020.
+
+Copyright (c) 1998-2013 Francois Pitt <fpitt@cs.utoronto.ca>,
+ 2020-2020 Jesse Knight <jesse.knight@mail.utoronto.ca>
+last updated at 10:00 (EST) on Wed 14 Oct 2020
+
+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
+ http://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status "maintained".
+
+The Current Maintainer of this work is
+Jesse Knight <jesse.knight@mail.utoronto.ca>.
+
+This work consists of the files:
+- README
+- ut-thesis.dtx
+- ut-thesis.ins
+- ut-thesis.pdf (derived user manual)
+- ut-thesis.cls (derived class file)
+
+\endpreamble
+
+\generate{\file{ut-thesis.cls}{\from{ut-thesis.dtx}{class}}}
+
+\endbatchfile \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/verifica/verifica.dtx b/Master/texmf-dist/source/latex/verifica/verifica.dtx
index 38c9d521f25..84fca3a2b3c 100644
--- a/Master/texmf-dist/source/latex/verifica/verifica.dtx
+++ b/Master/texmf-dist/source/latex/verifica/verifica.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% verifica.cls. Version: 1.2 - February 7, 2020.
+% verifica.cls. Version: 1.3 - October 10, 2020.
% Author: Riccardo DOSSENA <riccardo.dossena@gmail.com>
%
% Questa è una classe per comporre le verifiche
@@ -29,7 +29,7 @@
%<class>\ProvidesClass{verifica}
%<package>\ProvidesPackage{ver-doc}
%<*class|package>
- [2020/02/07 v1.2 Riccardo Dossena]
+ [2020/10/10 v1.3 Riccardo Dossena]
%</class|package>
%
%<*driver>
@@ -1935,7 +1935,6 @@ Di default sono definiti $\phi$ e $\theta$, ma si possono ripristinare
\RequirePackage{gensymb}
\RequirePackage{newunicodechar}
\RequirePackage{textcomp}
-\RequirePackage{eurosym}
\RequirePackage{tabto}
\RequirePackage{tabularx}
\RequirePackage[running]{lineno}
@@ -1987,9 +1986,13 @@ Di default sono definiti $\phi$ e $\theta$, ma si possono ripristinare
\SetSymbolFont{operators}{bold}{OT1}{cmbr}{b}{n}
\relax}{}
% \end{macrocode}
-% The \pack{bm} package will be loaded after all the other packages (in
-% particular after \pack{cmbright}).
+% \changes{v1.3}{2020/10/10}{Fixed a bug related to the \pack{eurosym} package,
+% which must be loaded after \pack{babel}.}
+% The \pack{eurosym} and \pack{bm} packages will be loaded after all the other
+% packages (in particular, \pack{eurosym} must be loaded after \pack{babel},
+% and \pack{bm} after \pack{cmbright}).
% \begin{macrocode}
+\RequirePackage{eurosym}
\RequirePackage{bm}
% \end{macrocode}
% \begin{macro}{\restorephi}
diff --git a/Master/texmf-dist/source/latex/verifiche/verifiche.dtx b/Master/texmf-dist/source/latex/verifiche/verifiche.dtx
new file mode 100644
index 00000000000..364354f072f
--- /dev/null
+++ b/Master/texmf-dist/source/latex/verifiche/verifiche.dtx
@@ -0,0 +1,1514 @@
+% \iffalse meta-comment
+%
+% Copyright (LPPL) 2020 by Francesco Raccanello
+%
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3 of this license or any later version.
+% The latest version of this license is in:
+%
+% http://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.
+%
+% \fi
+%
+% \iffalse
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{verifiche} [2021/02/16 v4.1 .dtx verifiche file]
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage[italian]{babel}
+\usepackage{listings}
+\lstset{
+ language=[LaTeX]TeX,
+ morekeywords={\setlength, \institute, \asyear, \testtype, \instruction, \duration, \printheading,
+ \institutefont, \asyearfont, \testtypefont, \instructiondelimiter, \headerfont, \instrunctionfont,
+ \durationfont, \eserciziolabel, \solutionfont, \diffsymb, \closedquestionitem,
+ \inlinesol, \completetext, \truefalse, \openquestion, \linedopenquestion, \squaredopenquestion, \headercandidatenamelabel, \checked, \finderror, \textandimage, \partialpt, \ptprefix, \ptlabel, \partialptlabel, \partialptdelimiters, \ptdelimiters},
+ keywordstyle=\color{blue},
+ escapeinside={*@}{@*},
+ inputencoding=utf8,
+ basicstyle=\small\ttfamily}
+\usepackage{xparse}
+\usepackage{tcolorbox}
+\tcbuselibrary{listingsutf8, skins}
+\tcbset{listing engine=listings}
+\usepackage[solutions]{verifiche}
+\newcounter{id}
+\newtcblisting{esempio}{listing outside text, righthand width=.3\textwidth,lower separated=true, skin=bicolor, colbacklower=red!50!white}
+\newcommand{\esempiodicodice}[1]{\begin{esempio}#1\end{esempio}}
+\NewDocumentCommand{\example}{+v m}{%
+ \stepcounter{id}%
+ \begin{minipage}{.6\textwidth}%
+ \begin{tcolorbox}[equal height group=\theid, title={Esempio di codice}, sharp corners=east, leftupper=.5ex, halign=left]%
+ \begin{lstlisting}%
+ ^^J#1^^J
+ \end{lstlisting}
+ \end{tcolorbox}
+ \end{minipage}
+ \begin{minipage}{.4\textwidth}
+ \begin{tcolorbox}[colback=red!5!white,colframe=red!75!black, equal height group=\theid, title={Esempio visivo}, sharp corners=west, halign=left]
+ #2
+ \end{tcolorbox}
+ \end{minipage}
+}
+%
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{verifiche.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{741}
+% \changes{v1.0}{2020/06/14}{Initial version.}
+% \changes{v2.0}{2020/06/26}{Better performance in exercise environment.}
+% \changes{v2.1}{2020/06/30}{Introduced closedquestionitem to control |item| symbol.}
+% \changes{v2.2}{2020/07/01}{Modify reference to points of an exercise.}
+% \changes{v3.0}{2021/02/14}{Remove fancyhdr and introduce a new page style. Improve the printheading command.}
+% \changes{v4.0}{2021/02/15}{Introduce comando to change the aspect of the exercise score.}
+% \changes{v4.1}{2021/02/16}{Introduce ptrulerlength to change the aspect of the exercise score.}
+% \GetFileInfo{verifiche.sty}
+% \DoNotIndex{\newcommand,\newenvironment,\def,\begin,\end,\par}
+% \DoNotIndex{\DeclareOption,\ExecuteOptions,\ProcessOptions,\RequirePackage}
+% \DoNotIndex{\LoadClass,\AtBeginDocument,\SetSymbolFont}
+% \DoNotIndex{\tiny, \scriptsize, \footnotesize, \normalfont, \large, \Large, \Large, \huge, \Huge}
+% \DoNotIndex{\newif,\geometry,\pagestyle,\setISOcompliance,\IntelligentComma}
+% \DoNotIndex{\relax,\let,\phi,\theta,\varphi,\vartheta,\else,\fi,\undefined}
+% \DoNotIndex{\renewcommand,\newlength,\hline,\textbf,\textit,\\,\setlength}
+% \DoNotIndex{\DeclarePairedDelimiter,\MakeUppercase,\MessageBreak,\ClassError}
+% \DoNotIndex{\widthof,\textwidth,\ifdefined,\null,\vspace,\noindent,\hfill}
+% \DoNotIndex{\hrulefill,\makebox,\linewidth,\small,\centering,\lvert,\rvert}
+% \DoNotIndex{\newunicodechar,\ensuremath,\circ,\textsuperscript,\,}
+% \DoNotIndex{\varepsilon,\delta,\Delta,\displaystyle,\mathbb,\arraystretch}
+% \DoNotIndex{\bm,\box,\DeclareFontShape,\DeclareFontFamily,\DeclareMathAccent}
+% \DoNotIndex{\DeclareSymbolFont,\doublespacing,\frac,\mathstrut,\bfseries}
+% \DoNotIndex{\usefont,\symbol,\mathpalette,\sbox,\vbox,\hbox,\box}
+% \DoNotIndex{\m@th,\wd,\resizebox,\height,\nointerlineskip,\mathord}
+% \DoNotIndex{\mathrm,\labelitemi,\blacktriangleright,\textup,\fbox,\parbox}
+% \DoNotIndex{\alph,\newlist,\renewlist,\setlist,\hspace,\iflanguage,\protect}
+% \DoNotIndex{\ifdim,\newcounter,\newsavebox,\savebox,\setcounter,\linenumbers}
+% \DoNotIndex{\thelinenumbers,\addtocounter,\multido,\i,\phantom,\newline}
+% \DoNotIndex{\value,\leavevmode,\leaders,\hss,\kern,\real,\tabcolsep,\space}
+% \DoNotIndex{\doublespacing,\singlespacing,\@nil,\@nnil,\vphantom,\today}
+% \DoNotIndex{\nolinebreak,\null,\textsc,\ifx,\tmp,\mbox,\vfill,\LARGE,\Huge}
+% \DoNotIndex{\enitkv@key,\item,\@ifpackageloaded,\@ifpackagewith}
+% \DoNotIndex{\addvspace, \baselineskip, \bgroup, \cdot, \color, \CurrentOption}
+% \DoNotIndex{\DeclareOptionX, \define@choicekey, \define@key, \draw, \egroup}
+% \DoNotIndex{\ExectureOptionsX, \fill, \foreach, \gdef, \ifmmode, \IfSubStr, \IfValueT}
+% \DoNotIndex{\ignorespaces, \ignorespacesafterend, \item, \itshape, \marginpar, \marginparwidth, \mathit}
+% \DoNotIndex{\NewDocumentCommand, \NewDocumentEnvironment, \newlabel, \nobreak, \node, \nr}
+% \DoNotIndex{\or, \overset, \PackageError, \PackageWarning, \parindent, \pgfmathparse, \pgfmathresult}
+% \DoNotIndex{\ProcessOptionsX, \protected@write, \ref, \refstepcounter, \reversemarginpar, \rule}
+% \DoNotIndex{\scshape, setkeys, \sffamily, \sisetup, \spacedim, \string, \tikz, \underline, \usetikzlibrary}
+% \DoNotIndex{\val, \xout, \y, \usebox}
+%
+%
+% \title{Il pacchetto \textsf{verifiche}
+% \thanks{Questo documento corrisponde al pacchetto \textsf{verifiche}~\fileversion,
+% in data~\filedate.}}
+% \author{Francesco Raccanello\\ \texttt{raccanello.francesco@gmail.com}}
+%
+% \maketitle
+%\begin{abstract}
+%Il presente pacchetto si propone di gestire gli elementi che generalmente compongono
+%una prova scritta per le scuole secondarie di primo e secondo grado:
+%l'intestazione della pagina, gli esercizi della verifica e le loro soluzioni.
+%Gli esercizi possono presentare una numerazione, un punteggio e un grado di difficoltà.
+%Alcuni comandi permettono di generare alcune tipologie di test: esercizi semplici, esercizi di completamento, vero o falso, domande aperte e chiuse e trova l'errore.
+%Ciascun esercizio può presentare la soluzione corretta che viene riportata nel documento in base ad un'apposita opzione del pacchetto.
+%\end{abstract}
+%
+%\tableofcontents
+%\clearpage
+%
+%\section{Introduzione}
+%Il pacchetto \textsf{verifiche} nasce dalla necessità di creare verifiche cartacee per la scuola secondaria di primo e secondo grado.
+%L'intento è di ottenere un supporto che controlli la parte di test, nonché la gestione delle soluzioni all'interno dello stesso documento.\par
+%Riguardo la parte di esercizi, il presente pacchetto si occupa della suddivisione delle domande (numerate o meno) e della gestione del loro punteggio inserendolo a mano, oppure calcolandolo come totale di punteggi parziali (si veda pagina \pageref{sec:esercizio}).
+%Sono presenti comandi o ambienti ad hoc per realizzare quesiti di vero/falso, domande aperte o chiuse,
+%esercizi di "caccia all'errore" e la gestione di testi e immagini affiancate.
+%
+%Per quanto riguarda le soluzioni, ogni elemento di test presenta la possibilità di mostrare la soluzione corretta, qualora venga venga inserita una specifica opzione del pacchetto che attivi la così detta in "modalità \texttt{solutions}" indicata nel seguito anche con "modalità soluzioni".
+%
+%Infine, il codice carica alcuni pacchetti necessari per la gestioni dei comandi implementati, ma anche
+% per rendere fruibili da subito comandi utili soprattutto per la gestione della matematica, le unità di misura,
+% e la parte grafica. Nel seguito si riportano i pacchetti principali:
+%\begin{itemize}
+%\item |enumitem| per la gestione avanzata degli elenchi puntati e numerati (sono attivate le opzioni |shortlabels| e |inline|
+%\item |amsmath|, |amssymb| per la gestione della matematica;
+%\item |siunitx| per la gestione delle unità di misura;
+%\item |graphicx|, |xcolor| e |tikz| per la gestione grafica;
+%\end{itemize}
+%
+%\section{Come usare il pacchetto \textsf{verifiche}}
+%Per usare il pacchetto \textsf{verifiche} è sufficiente copiare il file \texttt{\filename} nella cartella di lavoro
+%o installarlo secondo le procedure relative al proprio sistema operativo.
+%
+%Una volta installato è sufficiente caricare il pacchetto attraverso il comando:\\
+%\begin{center}|\usepackage{verifiche}|\end{center}
+%
+%\section{Le opzioni del pacchetto}
+%Il pacchetto \textsf{verifiche} prevede alcune opzioni per modificare globalmente il proprio comportamento.
+%\begin{center} |\usepackage|\oarg{options}|{verifiche}|\end{center}
+%Queste gestiscono l'aspetto dell'intestazione, la numerazione globale dei quesiti nonché l'attivazione della "modalità soluzioni" per poter visualizzare, nel documento, le soluzioni e variarne il colore del font.
+%
+%\begin{center}
+%\begin{tabular}{ll}
+%\textbf{\meta{options}}& \textbf{Descrizione} \\[.5em]
+%\hline\\
+%|noinstitute| & non stampa il nome dell'istituto (si veda pag. \pageref{par:institute}).\\
+%|nocandidatename| & non stampa la sezione per il nome del candidato\\
+%|noinstruction| & non stampa le istruzioni della prova\\
+%|noduration| & non stampa la durata della prova\\
+%|noasyear| & non stampa l'anno scolastico\\
+%|notesttype| & non stampa il tipo di prova \\
+%|nonumbered| & quesiti non numerati\\
+%|solutions| & stampa le soluzioni degli esercizi (si veda pag.\pageref{sec:solutions})\\
+%|red| & il colore del font delle soluzioni è rosso\\
+%|blue| & il colore del font delle soluzioni è blu\\
+%|color|=\meta{color} & il colore del font delle soluzioni è \meta{color}\\[.5em]
+%\hline
+%\end{tabular}
+%\end{center}
+%Nel seguito si indicherà con "modalità test", il pacchetto caricato senza l'opzione |solutions|, altrimenti questa verrà detta "modalità soluzione" o "modalità solutions".
+%
+%\section{Intestazione}\label{sec:intestazione}
+%Il pacchetto \textsf{verifiche} fornisce alcuni comandi per realizzare una semplice intestazione del documento che prevede il nome dell'istituto, l'anno scolastico il tipo di prova, le istruzioni e la durata della prova.
+%Tutte queste voci vanno dichiarate prima del comando |\printheading| che si occupa della produzione del risultato finale.
+%Le \emph{opzioni} del pacchetto permettono la soprressione della visualizzazione di alcune di queste voci.
+%
+%\vspace{1em}
+%\DescribeMacro{\institute}\label{par:institute}Il nome dell'istituto può essere indicato tramite il comando:
+%
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\institute*@\marg{nome dell'istituto}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%
+%il cui argomento verrà stampato al centro dell'intestazione della pagina con un font largo, senza grazie e di colore grigio scuro e separato dal resto del documento attraverso una riga orizzontale.
+%Il font può essere modificato ridefinendo il comando |\institutefont|.
+%
+%\DescribeMacro{\asyear}\label{par:asyear}L'anno scolastico viene indicato tramite l'apposito comando:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\asyear*@\oarg{preambolo}\marg{anno scolastico}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%il cui argomento viene riportato, al centro della pagina, anteponendo il \meta{preambolo} (che di default riporta la dicitura ‘‘Anno scolastico’’). Il font ed il posizionamento del testo possono essere cambiati ridefinendo il comando |\asyearfont|.
+%
+%\DescribeMacro{\testtype}\label{par:testtype}La tipologia di prova può essere indicata tramite il comando:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\testtype*@\marg{tipo di compito}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%il cui argomento viene riportato, per default, al centro della pagina. La modifica del font e del posizionamento può essere operato ridefinendo il comando |\testtypefont|.
+%
+%\DescribeMacro{\instruction}\label{par:instruction}Le istruzioni della prova possono essere racchiuse all'interno del comando:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\instruction*@\marg{istruzioni}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%che provvede a racchiudere tra due delimitatori (di default una riga orizzontale) il testo delle istruzioni. Ridefinendo il comando |\instrunctionfont| è possibile cambiare il font delle istruzioni.
+%
+%\DescribeMacro{\duration}La durata della prova può venir indicata tramite il comando:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\duration*@\oarg{preambolo}\marg{durata}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+% che viene riportata sotto le istruzioni, al centro, anteponendo all'argomento il \meta{preambolo} (che di default riporta la dicitura ‘‘’Tempo della prova:’’). L'aspetto di questo comando può essere modificato ridefinendo il comando |\durationfont|.
+%
+%\vspace{1em}
+%\DescribeMacro{\printheading}\label{par:printheading}L'intestazione, ovvero l'output di tutti i comandi appena definiti, viene riportata nel documento solo in presenza del comando
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\printheading
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%Salvo esplicite opzioni del pacchetto, il comando richiede di definire \emph{tutte} le voci (al limite indicandole con argomento vuoto |{}|), per non generare alcun errore di compilazione.
+%
+%\vspace{1em}
+%Riassumendo, il pacchetto fornisce i seguenti comandi per gestire e la stampa dell'intestazione del documento:
+%
+%\begin{center}
+%\begin{tabular}{lll}
+%\textbf{Comando} & \textbf{Font} & \textbf{Descrizione}\\
+%\hline
+%|\institute| & |\institutefont| & Definisce il nome dell'istituto.\\
+%|\asyear| & |\asyearfont| & Definisce l'anno scolastico.\\
+%|\testtype| & |\testtypefont| & Definisce il tipo di prova.\\
+%|\instruction| & |\instrunctionfont|& Definisce le istruzioni delle prove.\\
+%|\duration| & |\durationfont| & Definisce la durata della prova.\\
+%|\printheading| & & Stampa l'intestazione.\\
+%\hline
+%\end{tabular}
+%\end{center}
+%
+% Il pacchetto definisce due stili di pagina \emph{ad hoc}: |mainverifiche| e |verifiche|. Il primo è evocato quando si definisce il comando |\institute| e stampa sulla prima pagina l'argomento di questo comando. \DescribeMacro{verifiche}Il secondo, invece, può essere utilizzato dall'utente tramite il comando:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\pagestyle{verifiche}
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%e riproduce, nelle pagine dispari diversa dalla prima, l'intestazione per l'identificazione del candidato: il nome, la classe e la data.
+%\section{Comandi ed ambienti per le \textsf{verifiche}}
+%Nel seguito verranno presentati i comandi che permettono di strutturare un test.
+%Il pacchetto fornisce un ambiente di esercizio in cui racchiudere le domande.
+%Vi è la possibilità di predisporre domande chiuse a scelta multipla, prove di vero-falso, ‘‘trova l'errore’’ e domande a risposta aperta (fornendo una base su cui scrivere come un foglio a quadretti o a righe).
+%Ogni comando prevede la possibilità di fornire le soluzioni che vengono visualizzato quando il pacchetto è caricato attivando l'opzione |solutions|.
+%
+%\vspace{1em}
+% \DescribeEnv{esercizio}\label{sec:esercizio}L'ambiente esercizio viene usato per definire il quesito.
+%Esso produce il testo contenuto nel corpo preponendo la dicitura ‘‘Quesito” seguito da un numero.
+%Questo può essere oggetto di riferimenti incrociati trami tramite un'etichetta dichiarata tramite l'usuale comando |\label=|\marg{label} dichiarato dopo l'apertura dell'ambiente |esercizio|.
+%I riferimenti incrociati possono essere richiamati tramite l'usuale comando |\ref|\marg{label}, che produce il numero dell'esercizio e |\pageref|\marg{label} che stampa la pagina del riferimento.
+%L'ambiente prevede, inoltre, alcune opzioni espresse nel formato \texttt{key=val}, eventualmente separate da virgola se presenti in contemporanea.\par
+%\vspace{1em}
+%\begin{tabular}{ll}
+%|label|=\meta{label} & definisce il titolo del quesito\\
+%|diff|=\meta{number} & definisce la difficoltà sotto forma di stelle\\
+%|pt|=\meta{number} & definisce il punteggio della prova\\
+%|partialpt| & somma in automatico i punteggi parziali\\
+%\end{tabular}
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\begin{esercizio}[label=*@\meta{label}@*,diff=*@\meta{number}@*,pt=*@\meta{number}@*,partialpt]
+...
+\end{esercizio}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%Nel seguito si mostrano alcuni dei possibili risultati visivi.
+%
+% \iffalse
+%<*example>
+% \fi
+\example
+{\begin{esercizio}
+Testo dell'esercizio
+che voglio somministrare
+\end{esercizio}}
+{\begin{esercizio}
+Testo dell'esercizio
+che voglio somministrare
+\end{esercizio}}
+%
+% \iffalse
+%</example>
+% \fi
+%
+% \iffalse
+%<*example>
+% \fi
+\example
+{\begin{esercizio}[label=Esercizio]
+Testo dell'esercizio
+che voglio somministrare
+\end{esercizio}}
+{\begin{esercizio}[label=Esercizio]
+Testo dell'esercizio
+che voglio somministrare
+\end{esercizio}}
+% \iffalse
+%</example>
+% \fi
+%
+% \iffalse
+%<*example>
+% \fi
+\example
+{\begin{esercizio}[diff=2]
+Testo dell'esercizio
+che voglio somministrare
+\end{esercizio}}
+{\begin{minipage}{.2\linewidth}
+\hfill$\bigstar\bigstar$
+\end{minipage}
+\raisebox{-1.3\baselineskip}{
+\begin{minipage}{.7\linewidth}
+\begin{esercizio}
+Testo dell'esercizio
+che voglio somministrare
+\end{esercizio}
+\end{minipage}}}
+% \iffalse
+%</example>
+% \fi
+%
+% \iffalse
+%<*example>
+% \fi
+\example
+{\begin{esercizio}[pt=2]
+Testo dell'esercizio
+che voglio somministrare
+\end{esercizio}}
+{\begin{minipage}{.4\linewidth}
+\underline{\phantom{1cm}}/ 2 pt
+\end{minipage}
+\raisebox{-1.7\baselineskip}{
+\begin{minipage}{.5\linewidth}
+\begin{esercizio}
+Testo dell'esercizio
+che voglio somministrare
+\end{esercizio}
+\end{minipage}}}
+% \iffalse
+%</example>
+% \fi
+%
+% \iffalse
+%<*example>
+% \fi
+\example
+{\begin{esercizio}[pt=2, diff=2]
+Testo dell'esercizio
+che voglio somministrare
+\end{esercizio}}
+{\begin{minipage}{.4\linewidth}
+\hfill$\bigstar\bigstar$\newline
+\underline{\phantom{1cm}}/ 2 pt
+\end{minipage}
+\raisebox{-1.3\baselineskip}{
+\begin{minipage}{.5\linewidth}
+\begin{esercizio}
+Testo dell'esercizio
+che voglio somministrare
+\end{esercizio}
+\end{minipage}}}
+% \iffalse
+%</example>
+% \fi
+%
+%
+%\DescribeMacro{\partialpt}Il comando |\partialpt|, da non confondere con l'opzione omonima |partialpt| dell'ambiente |esercizio|, permette di riportare il punteggio parziale per le domande di un esercizio. Questo viene stampato a margine e racchiuso tra parentesi tonde.\\
+% \iffalse
+%<*example>
+% \fi
+\example
+{\begin{esercizio}
+\begin{enumerate}
+\item\partialpt{1} Domanda 1
+\item\partialpt{3} Domanda 2
+\end{enumerate}
+\end{esercizio}}
+{\begin{minipage}[t]{.3\linewidth}
+\vspace{-1.3em}
+\phantom{1cm/ 4 pt\\[.5em]}
+\vspace{.9em}
+(1 pt)\\
+(3 pt)
+\end{minipage}
+\raisebox{\baselineskip}{
+\begin{minipage}[t]{.6\linewidth}
+\begin{esercizio}
+\begin{enumerate}[leftmargin=*]
+\item Domanda 1
+\item Domanda 2
+\end{enumerate}
+\end{esercizio}
+\end{minipage}}
+}
+% \iffalse
+%</example>
+% \fi
+%
+%Quando usato negli ambienti |enumerate| o |itemize|, il comando introduce uno spazio spurio che può essere rimosso posponendo il comando |\noindent|.
+%
+%Quando viene esplicitata l'\emph{opzione} |partialpt| nella definizione dell'ambiente esercizio, il pacchetto si occupa della somma complessiva dei singoli punteggi parziali riportandola come punteggio totale del quesito. In questo caso il documento dev'essere compilato \emph{due volte} per ottenere correttamente il risultato finale.\\
+%
+% \iffalse
+%<*example>
+% \fi
+\example
+{\begin{esercizio}[partialpt]
+\begin{enumerate}
+\item\partialpt{1} Domanda 1
+\item\partialpt{3} Domanda 2
+\end{enumerate}
+\end{esercizio}}
+{\begin{minipage}[t]{.4\linewidth}
+\vspace{-1.3em}
+\underline{\phantom{1cm}}/ 4 pt\\[.5em]
+\vspace{.8em}
+(1 pt)\\
+(3 pt)
+\end{minipage}
+\raisebox{.5\baselineskip}{
+\begin{minipage}[t]{.53\linewidth}
+\begin{esercizio}
+\begin{enumerate}[leftmargin=*]
+\footnotesize
+\item Domanda 1
+\item Domanda 2
+\end{enumerate}
+\end{esercizio}
+\end{minipage}}
+}
+% \iffalse
+%</example>
+% \fi
+%
+%
+%Il punteggio dei quesiti può essere richiamato in qualunque punto del documento attraverso il comando
+%\begin{center} |\ref{ptes@|\meta{n.es}|}|\end{center}
+%dove \meta{n.es} indica il numero dell'esercizio riportato nell'intestazione dello stesso.
+%
+%\vspace{1em}
+%\DescribeEnv{esercizio*}L'ambiente |esercizio| produce sempre quesiti numerati. Se si desidera indicare test non numerati è possibile farlo tramite l'ambiente |esercizio*| che prevede gli stessi argomenti opzionali definiti per l'ambiente precedente.
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\begin{esercizio*}[label=*@\meta{label}@*,diff=*@\meta{number}@*,pt=*@\meta{number}@*,partialpt]
+...
+\end{esercizio*}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \iffalse
+%<*example>
+% \fi
+\example
+{\begin{esercizio*}[pt=2]
+Testo dell'esercizio
+che voglio somministrare
+\end{esercizio*}}
+{\begin{minipage}{.4\linewidth}
+\underline{\phantom{1cm}}/ 2 pt
+\end{minipage}
+\raisebox{-1.8\baselineskip}{
+\begin{minipage}{.5\linewidth}
+\begin{esercizio*}
+Testo dell'esercizio
+che voglio somministrare
+\end{esercizio*}
+\end{minipage}}}
+% \iffalse
+%</example>
+% \fi
+%
+%
+%\vspace{1em}
+%\DescribeEnv{soluzione}\label{sec:solutions}L'ambiente |soluzione| racchiude al suo interno tutto il materiale utile ad essere visualizzato solo in presenza dell'\emph{opzione} |solutions| del pacchetto \textsf{verifiche}. Quando il pacchetto è in modalità "test" il contenuto dell'ambiente |soluzione| viene ignorato.
+%
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\begin{soluzione}
+...
+\end{soluzione}
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \iffalse
+%<*example>
+% \fi
+\example
+{\begin{soluzione}
+Testo della soluzione
+dell'esercizio somministrato
+\end{soluzione}}
+{\begin{soluzione}
+Testo della soluzione
+dell'esercizio somministrato
+\end{soluzione}}
+% \iffalse
+%</example>
+% \fi
+%
+%\DescribeMacro{\inlinesol}Il pacchetto presenta il comando |\inlinesol| per produrre soluzioni in line, ovvero testo che in modalità "test" viene ignorato, ma che invece viene visualizzato nella modalità "soluzioni" (opzione |solutions| del pacchetto).
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\inlinesol*@\marg{testo}@*
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%
+% \iffalse
+%<*example>
+% \fi
+\example{Questa e' una \inlinesol{soluzione}
+ in linea}
+{\solfalse Questa e' una \inlinesol{soluzione} in linea.\\
+ \soltrue Questa e' una \inlinesol{soluzione} in linea}
+% \iffalse
+%</example>
+% \fi
+%
+%
+%\DescribeMacro{\completetext}Gli esercizi di completamento del testo possono venir realizzati tramite il comando:
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\completetext*@\oarg{dim}\marg{testo}@*
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%che produce uno spazio vuoto largo \meta{dim} (che di default è di \SI{4.5}{cm}) e che in modalità "soluzioni" riproduce il \meta{testo}.
+%
+% \iffalse
+%<*example>
+% \fi
+\example{La \completetext[2cm]{soluzione}}{
+\solfalse La \completetext[2cm]{soluzione}\\
+\soltrue La \completetext[2cm]{soluzione}}
+% \iffalse
+%</example>
+% \fi
+%
+%
+%\DescribeMacro{\truefalse}I quesiti con domande vero-falso possono essere realizzati tramite il comando
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\truefalse*@\marg{V/F}@*
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%Il comando produce due riquadri quadrati allineati con le lettere \texttt V e \texttt F; l'argomento obbligatorio richiede di indicare la lettera |V| o |F| al fine di poter realizzare un segno di spunta ($\checkmark$) sulla casella giusta nella modalità |solutions| del pacchetto.
+% \iffalse
+%<*example>
+% \fi
+\example{Vero o Falso? \truefalse{V}}{
+\solfalse Vero o Falso? \truefalse{V}\\
+\soltrue Vero o Falso? \truefalse{V}}
+% \iffalse
+%</example>
+% \fi
+%
+%
+%\DescribeEnv{closedquestion}Le domande a scelta multipla possono essere realizzate tramite l'ambiente |closedquestion|. Ogni opzione deve essere anticipata dal comando \DescribeMacro{\item}|\item| che realizza un quadrato davanti ad ogni voce. Queste poi vengono spaziate orizzontalmente in modo da riempire tutto lo spazio disponibile. Eventuali elenchi verticali possono essere realizzati introducendo a mano una nuova linea (|\\|). La soluzione (o le soluzioni) possono essere segnate tramite il comando \DescribeMacro{\checked}|\checked| posto come argomento opzionale del comando |\item| e che, nella modalità |solutions|, produce un segno di spunta ($\checkmark$) sulla casella selezionata.
+%
+% \iffalse
+%<*example>
+% \fi
+\example
+{\begin{closedquestion}
+\item Primo
+\item[\checked] Secondo\\
+\item Terzo
+\item Quarto
+\end{closedquestion}}
+{\begin{closedquestion}
+\item Primo
+\item[\checked] Secondo
+\end{closedquestion}\\
+\begin{closedquestion}
+\item Terzo
+\item Quarto
+\end{closedquestion}}
+% \iffalse
+%</example>
+% \fi
+%
+%
+%\DescribeMacro{\openquestion}Il comando produce una base di supporto per la scrittura, ovvero delle linee o dei quadretti. La sintassi del comando è la seguente:
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\openquestion[type=*@\meta{lines/squares}@*, width=*@\meta{dim}@*, height=*@\meta{dim}@*,
+ spacedim=*@\meta{dim}@*, linecolor=*@\meta{color}@*]*@\marg{soluzione}@*
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%La il testo dell'argomento obbligatorio (\meta{soluzione}) viene visualizzato solo in modalità |solutions|.
+%Il comando gestisce alcune opzioni:\\
+%
+%\begin{tabular}{ll}
+%|type|  & accetta due valori: \texttt{lines} e \texttt{squares} (default: |lines|)\\
+%|width| & gestisce la dimensione orizzontale del campo di testo (default: 12 cm)\\
+%|height| & gestisce la dimensione verticale del campo di testo (default: 20 cm)\\
+%|spacedim|& gestisce la dimensione dei quadretti o delle linee (default: 0.5 cm)\\
+%|linecolor| & colore delle linee guida (default: gray)
+%\end{tabular}
+%\vspace{1em}
+%
+%
+% \iffalse
+%<*example>
+% \fi
+\example
+{\openquestion{
+ Prova del testo della soluzione
+ della domanda aperta
+}}
+{\openquestion[width=4cm, height=2cm]{Prova del testo della soluzione della domanda aperta}}
+% \iffalse
+%</example>
+% \fi
+%
+% \iffalse
+%<*example>
+% \fi
+\example
+{\openquestion[type=squared]{
+ Prova del testo della soluzione
+ della domanda aperta
+}}
+{\openquestion[type=squares, width=4cm, height=2cm]{Prova del testo della soluzione della domanda aperta}}
+% \iffalse
+%</example>
+% \fi
+%
+%
+%\DescribeMacro{\finderror}Gli esercizi della tipologia ‘‘trova l'errore’’ possono essere composti tramite il comando
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\finderror*@\marg{testo sbagliato}\marg{testo giusto}@*
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%Il comando visualizza la stringa \meta{testo sbagliato} nella modalità "test", mentre mostra una cancellatura ed il testo corretto nella modalità |solutions|.\\
+%
+%
+% \iffalse
+%<*example>
+% \fi
+\example
+{\finderror{sbagliato}{corretto}}
+{\finderror{sbagliato}{corretto}}
+% \iffalse
+%</example>
+% \fi
+%
+%
+%\vspace{1em}
+%\DescribeMacro{\textandimage}L'impaginazione del testo con affiancato un'immagine viene agevolato dal comando |\textandimage| che ha la seguente sintassi:
+% \iffalse
+%<*example>
+% \fi
+\begin{lstlisting}
+\textandimage*@\oarg{left width}\oarg{right width}\marg{rx material}\marg{dx material}@*
+\end{lstlisting}
+% \iffalse
+%</example>
+% \fi
+%Il \meta{rx material} viene affiancato all'\meta{dx material}. La larghezza della colonna sinistra (risp. destra) è controllata tramite l'argomento opzionale \meta{left width} (risp. \meta{right width}).\\
+% \iffalse
+%<*example>
+% \fi
+\example
+{\textandimage[2cm][1cm]{Testo}{
+\tikz{\draw(0,0) circle (.4cm)}}}
+{\phantom{.}\vspace{1em}\textandimage[2cm][1cm]{Testo}{\tikz{\draw(0,0) circle (.4cm)}}}
+% \iffalse
+%</example>
+% \fi
+%
+%\section{Personalizzazione}
+%Il pacchetto prevede un certo numero di comandi definiti al fine di gestire l'aspetto del documento finale.
+%\subsection*{Font}
+%Per l'intestazione tutti i font sono definiti secondo lo schema:
+%\begin{center}
+%\meta{comando intestazione}|font|
+%\end{center}
+%ed oltre a gestire l'aspetto del carattere, alcuni di questi, specificano la posizione occupata del testo ed eventuali prefissi.
+%
+%\DescribeMacro{\headerfont} Il font delle intestazioni quando viene usato lo stile di pagina |verifiche|.
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\renewcommand{\headerfont}[1]*@\marg{...}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%\DescribeMacro{\institutefont}Il font dell'istituto, generato dal comando |\institute|, è gestito dal comando |\institutefont|. Per variare le caratteristiche del font è necessario ridefinire il comando:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\renewcommand{\institutefont}[1]*@\marg{...}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%
+%\DescribeMacro{\asyearfont}Il font dell'anno scolastico, generato dal comando |\asyear|, è gestito dal comando |\asyearfont|. Per variare le caratteristiche del font è necessario ridefinire il comando:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\renewcommand{\asyearfont}[1]*@\marg{...}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%
+%\DescribeMacro{\testtypefont}Il font tipo di test, generato dal comando |\testtype|, è gestito dal comando |\testtypefont|. Per variare le caratteristiche del font è necessario ridefinire il comando:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\renewcommand{\testtypefont}[1]*@\marg{...}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%
+%\DescribeMacro{\instrunctionfont}Il font delle istruzioni, generate dal comando |\instrunction|, è gestito dal comando |\instrunctionfont|. Per variare le caratteristiche del font è necessario ridefinire il comando:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\renewcommand{\instrunctionfont}[1]*@\marg{...}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%
+%\DescribeMacro{\solutionfont}Le soluzioni degli esercizi vengono stampate, quando viene esplicitata l'opzione |solutions| quando viene caricato il pacchetto, con un font più piccolo e in corsivo. Per modificare il font delle soluzioni è sufficiente ridefinire il comando |\solutionfont|:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\renewcommand{\solutionfont}*@\marg{...}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%
+%\subsection*{Intestazione}
+%\DescribeMacro{\instructiondelimiter}Le istruzioni e la durata della prova sono racchiuse tra due delimitatori che normalmente sono due righe orizzontali. Per cambiare, o rimuovere, questi delimitatori è sufficiente ridefinire il seguente comando:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\renewcommand{\instructiondelimiter}*@\marg{...}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%
+%\DescribeMacro{\headercandidatenamelabel}Quando viene composta l'intestazione principale nella prima pagina, compare una riga in cui il candidato può scrivere il proprio nome e cognome. L'etichetta di questa parte controllata dal comando |\headercandidatenamelabel|, che può essere opportunamente cambiata tramite il comando:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\renewcommand{\headercandidatenamelabel}*@\marg{...}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%Allo stesso modo è possibile modificare la descrizione della classe \DescribeMacro{\headerclasslabel} e della data\DescribeMacro{\headerdatelabel}.
+% Tutte queste tre voci prevedono, per ciascuna, una riga vuota ove scrivere l'informazione richiesta.\DescribeMacro{\candidatenamerulerlength}\DescribeMacro{\classrulerlength}\DescribeMacro{\daterulerlength} Le lunghezze delle tre righe possono essere modificate impostando le lunghezze desiderate
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\setlength{\...rulerlength}*@\marg{dim}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%Attraverso questi comandi è possibile anche rimuovere una (o più) delle tre voci. Se ad esempio non si vuole visualizzare la classe d'appartenenza del candidato, sarà sufficiente ridefinire gli opportuni comandi nel seguente modo: |\renewcommand{\headerclasslabel}{}|, così da non visualizzare alcuna scritta, e |\setlength{\classrulerlength}{0pt}| per rimuovere la riga associata.
+%
+%\subsection*{Ambiente \texttt{esercizio}}
+%\DescribeMacro{\eserciziolabel}Gli esercizi vengono inseriti anteponendo al loro testo la dicitura ‘‘Quesito’’ seguito (eventualmente) da un numero. Per cambiare questa dicitura, a livello globale, ovvero per ogni esercizio, è sufficiente ridefinire il comando |\eserciziolabel|.
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\renewcommand{\eserciziolabel}*@\marg{Preambolo dell'esercizio}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%
+%L'ambiente |esercizio| permette di riportare anche il punteggio complessivo e parziale per le sotto-domande. Di default il punteggio totale del quesito viene riportato anteponendo un tratto orizzontale seguito da uno slash, il valore del punteggio ed un'etichetta indicante la sigla \emph{pt}.
+% Per quanto riguarda il punteggio parziale, questo viene riportato racchiuso tra parentesi tonde.
+% È possibile modificare l'aspetto di entrambi i punteggio che sono strutturati nel seguente modo: \texttt{prefisso delimitatore punteggio label delimitatore}.
+%
+%\DescribeMacro{\ptprefix} Il comando |\ptprefix| permette di modificare il \texttt{prefisso} del punteggio. Di default traccia una linea, la cui lunghezza può essere variata modificando la lunghezza |ptrulerlength|, ed uno slash. Se si vuole modificarne l'aspetto è sufficiente evocare il comando.
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\ptprefix*@\marg{...}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%
+%\DescribeMacro{\partialptprefix} Allo stesso modo il comando |\partialptprefix| definisce un \texttt{prefisso} per il punteggio parziale.
+%
+%\DescribeMacro{\ptlabel}\DescribeMacro{\partialptlabel} Il punteggio viene riportato indicando anche una \texttt{label}. Questa di default è "pt" sia per il punteggio parziale che per quello totale. È possibile definire un nome alternativo usando il comando |\ptlabel| per il punteggio totale o |\partialptlabel| per quello parziale. I comandi prevedono un argomento obbligatorio che è valido per tutti i punteggi, ma anche uno facoltativo che viene usato quanto il valore del punteggio è pari a 1 e che necessita quindi di un sostantivo singolare al posto di quello plurale (i.e. "punto" al posto di "punti").
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\ptlabel*@\oarg{sing.}\marg{plur.}@*
+\partialptlabel*@\oarg{sing.}\marg{plur.}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%\DescribeMacro{\diffsymb}L'ambiente esercizi prevede di poter descrivere la difficoltà tramite un simbolo grafico. Di default questo è una stella ($\bigstar$), tuttavia è possibile cambiare il tipo di simbolo ridefinendo il comando |\diffsymb|:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\renewcommand{\diffsymb}*@\marg{codice del simbolo}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%
+%\DescribeMacro{\ptdelimiters}\DescribeMacro{\partialptdelimiters} Infine, i punteggi sono racchiusi tra due delimitatori. Il punteggio totale non presenta alcun simbolo, mentre quello parziale è racchiuso tra parentesi tonde. È possibile definire dei nuovi delimitatori utilizzando i comandi |\partialptdelimiters| e |\ptdelimiters| i quali argomenti contengono due caratteri che fungono da delimitatore dentro e sinistro.
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\ptdelimiters*@\marg{coppia di caratteri}@*
+\partialptdelimiters*@\marg{coppia di caratteri}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%
+%\DescribeMacro{\closedquestionitem}Il simbolo delle domande chiuse è controllato dal comando |\closedquestionitem| che di default è un quadrato ($\square$). Per modificare questo simbolo è sufficiente ridefinire il comando:
+%\iffalse
+%<*example>
+%\fi
+\begin{lstlisting}
+\renewcommand{\closedquestionitem}*@\marg{codice del simbolo}@*
+\end{lstlisting}
+%\iffalse
+%</example>
+%\fi
+%
+%
+% \StopEventually{\clearpage\PrintChanges \clearpage\PrintIndex}
+% \section{Implementation}
+%\subsection{Require packages}
+% The implementation of the \textsf{verifiche} package starts with the required packages:
+% \begin{macrocode}
+\RequirePackage{xparse}
+\RequirePackage{xkeyval}
+\RequirePackage{amsmath}
+\RequirePackage{amssymb}
+\RequirePackage{pgffor}
+\RequirePackage[shortlabels, inline]{enumitem}
+\RequirePackage{siunitx}
+\RequirePackage{graphicx}
+\RequirePackage{xcolor}
+\RequirePackage{tikz}
+\RequirePackage{booktabs}
+\RequirePackage[normalem]{ulem}
+\RequirePackage{xstring}
+% \end{macrocode}
+%
+%
+%\subsection{Packages and library options}
+%The package loads |tikz| and some useful library.
+%The |siunitx| package is tuned in order to be used for the Italian math document.
+%\iffalse
+%%Forse si può cancellare questo
+%\fi
+% \begin{macrocode}
+\usetikzlibrary{calc,shapes.geometric,patterns,positioning,angles,quotes}
+\sisetup{
+ output-decimal-marker = {,},
+ exponent-product = \cdot,
+ per-mode=symbol-or-fraction,
+ separate-uncertainty
+}
+% \end{macrocode}
+%Finally the indentation is turned off.
+% \begin{macrocode}
+\setlength\parindent{0pt}
+% \end{macrocode}
+%
+%\subsection{newif}
+%Some conditionals are defined and initiated:
+%\iffalse
+%%newif
+%\fi
+% \begin{macrocode}
+\newif\ifsol
+\newif\ifinstitute\institutetrue
+\newif\ifinstruction\instructiontrue
+\newif\ifduration\durationtrue
+\newif\ifasyear\asyeartrue
+\newif\ifsolutionscolor\solutionscolorfalse
+\newif\ifcandidatename\candidatenametrue
+\newif\iftesttype\testtypetrue
+\newif\ifprintedheading\printedheadingfalse
+\newif\ifexercisesnumbered\exercisesnumberedtrue
+\newif\ifshowmarginexercise\showmarginexercisefalse
+\newif\ifopenquestionlines\openquestionlinesfalse
+\newif\ifopenquestionsquared\openquestionsquaredfalse
+% \end{macrocode}
+%\subsection{Package options declaration}
+%The package provides some options to control the aspect of the document and the mode of the document ("test" mode or "solutions" mode).
+%\iffalse
+%%Package option declaration
+%\fi
+% \begin{macrocode}
+\DeclareOptionX{solutions}[]{\soltrue}
+\DeclareOptionX{noinstitute}[]{\institutefalse}
+\DeclareOptionX{noinstruction}[]{\instructionfalse}
+\DeclareOptionX{noduration}[]{\durationfalse}
+\DeclareOptionX{noasyear}[]{\asyearfalse}
+\DeclareOptionX{nocandidatename}[]{\candidatenamefalse}
+\DeclareOptionX{notesttype}[]{\testtypefalse}
+\DeclareOptionX{nonumbered}[]{\exercisesnumberedfalse}
+\DeclareOptionX{color}[red]{\solutionscolortrue\def\solutionscolor{#1}}
+\DeclareOptionX{red}[]{\ExecuteOptionsX{color=red}}
+\DeclareOptionX{blue}[]{\ExecuteOptionsX{color=blue}}
+\DeclareOptionX*{\PackageWarning{verifiche}{Unknown ‘\CurrentOption’}}
+\ProcessOptionsX
+% \end{macrocode}
+%
+%\subsection{Counters}
+%The package use some predefined counters: the number of the exercise is controlled by |exercisenumber|, while the partial points of an exercise are summed into |partialpoints| (and it's reseted every new exercise) to produce the sum of the partial points for a given exercise.
+%\iffalse
+%%counters
+%\fi
+% \begin{macrocode}
+\newcounter{exercisenumber}
+\newcounter{partialpoints}[exercisenumber]
+% \end{macrocode}
+%\subsection{Length}
+%\iffalse
+%%newlenght
+%\fi
+%In order to fine-tuning the dimension of the rulers in the headers and to leave the possibility to the user to redefine their dimensions, some length are introduced.
+% \begin{macrocode}
+\newlength{\candidatenamerulerlength}
+\newlength{\classrulerlength}
+\newlength{\daterulerlength}
+\newlength{\ptrulerlength}
+\setlength{\candidatenamerulerlength}{.35\textwidth}
+\setlength{\classrulerlength}{.1\textwidth}
+\setlength{\daterulerlength}{.15\textwidth}
+\setlength{\ptrulerlength}{1cm}
+% \end{macrocode}
+%
+%\subsection{Macro and environment}
+%\iffalse
+%%macro and environment
+%\fi
+%\paragraph{Global variables}The package defined some global variable, that are used to indicate the institute, the year, the duration of the test, its type, the instructions and the scolar year.
+%\iffalse
+%%global variable
+%\fi
+% \begin{macrocode}
+\newcommand{\institute}[1]{%
+ \gdef\@institute{#1}}
+\newcommand{\duration}[2][Tempo della prova:]{%
+ \gdef\@durationpreamble{#1}\gdef\@duration{#2}}
+\newcommand{\testtype}[1]{%
+ \gdef\@testtype{#1}}
+\newcommand{\instruction}[1]{%
+ \gdef\@instruction{#1}}
+\newcommand{\asyear}[2][Anno scolastico]{%
+ \gdef\@asyearpreamble{#1}\gdef\@asyear{#2}}
+% \end{macrocode}
+%
+%\paragraph{Fonts and aspects}
+%One of the feature of this package is the flexibility about the aspect of the final result. All the main font or typographic elements (like instructions delimiters or the difficulty symbol) are defined as macro.
+%\iffalse
+%%fonts and aspects
+%\fi
+% \begin{macrocode}
+\newcommand{\headerfont}[1]{%
+ \sffamily\color{darkgray}#1}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand{\institutefont}[1]{%
+ \large \sffamily\color{darkgray}#1}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand{\asyearfont}[1]{%
+ \hspace*{\fill} #1\hspace*{\fill}\\[.5em]}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand{\testtypefont}[1]{%
+ \hspace*{\fill}\scshape\huge#1\hspace*{\fill}}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand{\instructiondelimiter}{%
+ \rule{\textwidth}{.5pt}}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand{\instrunctionfont}[1]{%
+ \sffamily#1}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand{\durationfont}[1]{%
+ \hspace*{\fill}\@durationpreamble\space\bfseries #1\hspace*{\fill}}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand{\headercandidatenamelabel}{Nome e Cognome}
+\newcommand{\headerclasslabel}{Classe}
+\newcommand{\headerdatelabel}{Data}
+\newcommand{\@header@candidatename}{\headercandidatenamelabel\space\underline{\hspace{\candidatenamerulerlength}}}
+\newcommand{\@header@class}{\headerclasslabel\space\underline{\hspace{\classrulerlength}}}
+\newcommand{\@header@date}{\headerdatelabel\space\underline{\hspace{\daterulerlength}}}
+\newcommand{\@header}{\@header@candidatename\hfill\@header@class\hfill\@header@date}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand{\eserciziolabel}{%
+ Quesito}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand{\solutionfont}{%
+ \footnotesize\ifsolutionscolor\color{\solutionscolor}\fi\itshape}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand{\diffsymb}{%
+ $\bigstar$}
+% \end{macrocode}
+% \begin{macrocode}
+\newcommand{\closedquestionitem}{%
+ $\square$}
+% \end{macrocode}
+%\iffalse
+%%pt prefix
+%\fi
+% \begin{macrocode}
+\newcommand{\@ptprefix}{\underline{\hspace{\ptrulerlength}}/}
+\newcommand{\ptprefix}[1]{%
+ \renewcommand{\@ptprefix}{#1}}
+% \end{macrocode}
+%\iffalse
+%%partialpt prefix
+%\fi
+% \begin{macrocode}
+\newcommand{\@partialptprefix}{}
+\newcommand{\partialptprefix}[1]{%
+ \renewcommand{\@partialptprefix}{#1}}
+% \end{macrocode}
+%\iffalse
+%%pt label
+%\fi
+% \begin{macrocode}
+\newcommand{\@ptsinglabel}{pt}
+\newcommand{\@ptplurlabel}{pt}
+\NewDocumentCommand{\ptlabel}{o m}{%
+ \renewcommand{\@ptplurlabel}{#2}%
+ \renewcommand{\@ptsinglabel}{\IfNoValueTF{#1}{#2}{#1}}}%
+\newcommand{\@useptlabel}[1]{%
+ \ifnum#1=1 \@ptsinglabel \else \@ptplurlabel\fi}
+% \end{macrocode}
+%\iffalse
+%%partialpt label
+%\fi
+% \begin{macrocode}
+\newcommand{\@partialptsinglabel}{pt}
+\newcommand{\@partialptplurlabel}{pt}
+\NewDocumentCommand{\partialptlabel}{o m}{%
+ \renewcommand{\@partialptplurlabel}{#2}%
+ \renewcommand{\@partialptsinglabel}{\IfNoValueTF{#1}{#2}{#1}}}%
+\newcommand{\@usepartialptlabel}[1]{%
+ \ifnum#1=1 \@partialptsinglabel \else \@partialptplurlabel\fi}
+% \end{macrocode}
+%\iffalse
+%%partialpt delimiter
+%\fi
+% \begin{macrocode}
+\newcommand{\@lpartialpt@delimiter}{(}
+\newcommand{\@rpartialpt@delimiter}{)}
+\newcommand{\@definepartialptdelimiter}[2]{
+ \renewcommand{\@lpartialpt@delimiter}{#1}
+ \renewcommand{\@rpartialpt@delimiter}{#2}}
+\newcommand{\partialptdelimiters}[1]{%
+ \@definepartialptdelimiter#1}
+% \end{macrocode}
+%\iffalse
+%%pt delimiter
+%\fi
+% \begin{macrocode}
+\newcommand{\@lpt@delimiter}{}
+\newcommand{\@rpt@delimiter}{}
+\newcommand{\@defineptdelimiter}[2]{%
+ \renewcommand{\@lpt@delimiter}{#1}%
+ \renewcommand{\@rpt@delimiter}{#2}}
+\newcommand{\ptdelimiters}[1]{%
+ \@defineptdelimiter#1}
+% \end{macrocode}
+%\iffalse
+%% convert ref to num
+%\fi
+% \begin{macrocode}
+\newcommand*{\convertreftonum}[1]{%
+ \romannumeral
+ \@ifundefined{r@#1}{%
+ \expandafter\ltx@zero
+ \rc@default}{%
+ \expandafter\expandafter\expandafter\rc@extract@
+ \expandafter\expandafter\expandafter!%
+ \csname r@#1\expandafter\endcsname
+ \expandafter{\rc@default}\@nil}%
+}
+\def\rc@default{0}%
+\long\def\rc@extract@#1#2#3\@nil{%
+ \ltx@zero
+ #2}
+\chardef\ltx@zero=0%
+% \end{macrocode}
+
+%\paragraph{Page styles}
+%The package define two new pagestyle: \texttt{mainverifiche} and \texttt{verifiche}. The former is used if \verb|\@institute| is defined (or if \verb|noinstitute| is not declared) as \verb|\thispagestyle| mode. The latter can be used by the user and print, on the odd pages, the name, date and class of the candidate.
+%\iffalse
+%%pagestyles
+%\fi
+% \begin{macrocode}
+\newcommand{\ps@mainverifiche}{%
+ \renewcommand\@oddhead{\parbox{\textwidth}{\centering \institutefont{\@institute}}}%
+ \renewcommand\@evenhead{}%
+}
+\newcommand{\ps@verifiche}{%
+ \renewcommand\@oddhead{
+ \ifodd\thepage\parbox{\textwidth}{\headerfont\@header}\fi}%
+}
+% \end{macrocode}
+%
+%\paragraph{Print the heading}The purpose of |\printheading| macro is to typeset the headings of the page, printing the name of the institute (if included), the type of the test (if included) and so on.
+%\iffalse
+%%print headings
+%\fi
+% \begin{macrocode}
+\newcommand{\printheading}{%
+ {\ifdefined\@institute\ifinstitute\thispagestyle{mainverifiche}\fi\else\thispagestyle{plain}\fi}%
+ {\ifcandidatename\@header\\[1em]\fi}%
+ {\ifdefined\@asyear\ifasyear \asyearfont{\@asyearpreamble\space\@asyear}\fi\fi}%
+ {\ifdefined\@testtype\iftesttype\testtypefont{\@testtype}\fi\fi}\\%
+ {\ifdefined\@instruction\ifinstruction\instructiondelimiter\\{\instrunctionfont{\@instruction}}\\%
+ \ifdefined\@duration\ifduration{\durationfont\@duration\\}\fi\fi\instructiondelimiter\fi\fi}%
+}
+% \end{macrocode}
+
+%\paragraph{Esercizio.} The main element of the package is the |esericizio| environment.
+%It accepts some options define via |xkeyval| package. The element that are reproduced in the left margin are stored into a box and produce if |showmargin| boolean variable is switch to \textit{true}.\par
+%\iffalse
+%%ambiente esercizio
+%\fi
+% \begin{macrocode}
+\define@key{esercizio}{label}[Quesito]{%
+ \def\tempeserciziolabel{#1}}%
+\define@key{esercizio}{diff}[none]{
+ \def\diffstar{\hfill\foreach \i in {1,..., #1}{\diffsymb}}%
+ \showmarginexercisetrue}%
+\define@key{esercizio}{pt}[none]{
+ \def\pointes{#1}%
+ \def\espoint{\hfill\@ptprefix\@lpt@delimiter\pointes\space\@useptlabel{\pointes}\@rpt@delimiter}
+ \showmarginexercisetrue}%
+\define@key{esercizio}{partialpt}[none]{%
+ \def\@totalpartialpt{\convertreftonum{ptes@\theexercisenumber}}%
+ \def\sumpartialpt{\@ptprefix\@lpt@delimiter\@totalpartialpt\space\@useptlabel{\@totalpartialpt}\@rpt@delimiter}%
+ \showmarginexercisetrue}%
+% \end{macrocode}
+%
+%
+%The part of the exercise (i.e. the title and the margin note) are stored into macro in order to streamline the code.
+% \begin{macrocode}
+\newcommand{\exercisetitle}{%
+ \ifdefined\tempeserciziolabel\tempeserciziolabel%
+ \else \eserciziolabel\fi%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newsavebox{\box@marginexercise}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand{\exercisemargin}{%
+ \sbox{\box@marginexercise}{\parbox[t]{\marginparwidth}{%
+ \ifdefined\diffstar\hfill\diffstar\par\fi% stelle di difficoltà
+ \ifdefined\espoint\hfill\espoint\par\fi%[-\baselineskip] %punteggio
+ \ifdefined\sumpartialpt\hfill\sumpartialpt\fi} %punteggio parziale automatico
+ }%
+ \reversemarginpar\marginpar{\usebox{\box@marginexercise}}%
+}%
+% \end{macrocode}
+%
+% If the exercise admit points, they are stored in the .aux file of the main document in order to be recalled via |\ref| command.
+% \begin{macrocode}
+\newcommand{\savepointsaux}{%
+ \ifdefined\sumpartialpt%
+ \protected@write \@auxout {}{\string\newlabel {ptes@\theexercisenumber}{{\thepartialpoints}{}}}%
+ \fi%
+ \ifdefined\espoint%
+ \protected@write \@auxout {}{\string\newlabel {ptes@\theexercisenumber}{{\pointes}{}}}%
+ \fi%
+}%
+% \end{macrocode}
+
+%\begin{environment}{esercizio}
+%The content of the exercise are managed by the |esercizio| environment.
+%For every |esercizio| the counter |exercisenumber| is increased, the |showmarginexercise| are reset to false (to avoid the generation of spurious margin note if unnecessary) and the keys are set.
+%After that, the code produces the label of the environment, the body and manages the space before e after the environment in the page. If the exercise presents some scores, they are stored via |savepointsaux|.
+% \begin{macrocode}
+\NewDocumentEnvironment{esercizio}{o +b}{%
+ \refstepcounter{exercisenumber}%
+ \showmarginexercisefalse%
+ \IfValueT{#1}{\setkeys{esercizio}{#1}}%
+ \par\addvspace{\baselineskip}%
+ {\noindent\bfseries\exercisetitle\ifexercisesnumbered\space\theexercisenumber\fi}%
+ \ifshowmarginexercise\exercisemargin\fi%
+ \par% newline after label
+ \nobreak\noindent\ignorespaces#2%body of the environment
+}{%
+ \par%
+ \ignorespacesafterend%
+ \savepointsaux%
+}%
+% \end{macrocode}
+%\end{environment}
+%
+%
+%\begin{environment}{esercizio*}
+%The |esercizio*| environment has the same structure of the previous one, except for the code used to show the number of the exercise.
+% \begin{macrocode}
+\NewDocumentEnvironment{esercizio*}{o +b}{%
+ \showmarginexercisefalse%
+ \IfValueT{#1}{\setkeys{esercizio}{#1}}%
+ \par\addvspace{\baselineskip}{\noindent\bfseries\exercisetitle}%
+ \ifshowmarginexercise\exercisemargin\fi%
+ \par% newline after label
+ \nobreak\noindent\ignorespaces#2% body of the environment
+}{%
+ \par%
+ \ignorespacesafterend
+ \savepointsaux%print partial pt sum
+}%
+% \end{macrocode}
+%\end{environment}
+%
+%\begin{macro}{\partialpt}The |partialpt| macro define the content of the margin note where it's used.
+% \begin{macrocode}
+\NewDocumentCommand{\partialpt}{m}{%
+ \leavevmode\reversemarginpar\marginpar{%
+ \hfill\@partialptprefix\@lpartialpt@delimiter#1\space\@usepartialptlabel{#1}\@rpartialpt@delimiter%
+ \addtocounter{partialpoints}{#1}}}%
+% \end{macrocode}
+%\end{macro}
+%\paragraph{Soluzione}
+%\begin{environment}{soluzione}
+%The main element for the "solutions" mode is the |soluzione| environment.
+% \begin{macrocode}
+\NewDocumentEnvironment{soluzione}{+b}{%
+ \ifsol%
+ \par\addvspace{\baselineskip}%
+ {\noindent\bfseries Soluzione}%
+ \par\nobreak\noindent\ignorespaces%
+ \solutionfont #1%
+ \fi%
+}{%
+ \ifsol%
+ \par\ignorespacesafterend
+ \fi%
+}%
+% \end{macrocode}
+%\end{environment}
+%
+%\begin{macro}{\inlinesol}
+%The code inside |\inlinesol| is composed only if in "solutions" mode.
+% \begin{macrocode}
+\newcommand{\inlinesol}[1]{%
+ \ifsol%
+ \bgroup%
+ \ifmmode\mathit{\solutionfont#1}%
+ \else{\solutionfont#1}%
+ \fi%
+ \egroup%
+ \else\ignorespaces%
+ \fi%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\completetext}
+%The |\completetext| print a horizontal line on which write the solution if the "solutions" mode is active.
+% \begin{macrocode}
+\newcommand{\completetext}[2][4.5cm]{%
+ \ifsol%
+ $\overset{\displaystyle\text{\solutionfont#2}}{\underline{\hspace{#1}}}$%
+ \else%
+ $\overset{\relax}{\underline{\hspace{#1}}}$%
+ \fi}%
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\truefalse}
+%The |\truefalse| is generated via |\tikz| macro.
+% \begin{macrocode}
+\newcommand{\truefalse}[1]{%
+ \tikz[baseline=-.8ex]{%
+ %true part
+ \node[draw, rectangle, minimum size=1.5em] {V};%
+ \ifsol\IfSubStr{#1}{V}{\node[shift={(1pt,1pt)}]{%
+ $\Large\ifsolutionscolor\color{\solutionscolor}\fi\checkmark$}}{};\fi%
+ %false part
+ \node[xshift=1cm, draw, rectangle, minimum size=1.5em]{F};%
+ \ifsol\IfSubStr{#1}{F}{\node[xshift=1cm, shift={(1pt,1pt)}]{%
+ $\Large\ifsolutionscolor\color{\solutionscolor}\fi\checkmark$}}{};\fi%
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\finderror}
+%The |\finderror| write the wrong text in "test mode" and than superimpose some mark (thanks to \textsf{ulem} package) and the correct text in "solutions mode".
+% \begin{macrocode}
+\newcommand{\finderror}[2]{%
+ \ifsol%
+ $\overset{\text{{\solutionfont#2}}}{\text{\xout{#1}}}$%
+ \else%
+ #1%
+ \fi%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{environment}{closedquestion}
+%The |closedquestion| environment define a new list whose item elements are preceded by square symbol, and every item is |\hfill| spaced. The |\checked| symbol is controlled and generated (in the "solutions mode") via |\tikz|.
+% \begin{macrocode}
+\newlist{crocette}{itemize*}{1}%
+\setlist[crocette]{label=\closedquestionitem, itemjoin={\hfill}}%
+\newcommand{\checked}{%
+ \ifsol%
+ \closedquestionitem\tikz[remember picture, overlay, baseline=-1ex, xshift=-.7ex]
+ {\node{\ifsolutionscolor\color{\solutionscolor}\fi$\checkmark$};}
+ \else
+ \closedquestionitem
+ \fi}
+\NewDocumentEnvironment{closedquestion}{+b}{%
+ \begin{crocette}#1%
+}{%
+ \end{crocette}
+}
+% \end{macrocode}
+%\end{environment}
+
+%\begin{macro}{\openquestion}
+%The |\openquestion| use key-value options defined as following presented.
+% \begin{macrocode}
+\define@key{openquestion}{width}[\linewidth]{\def\openquestionwidth{#1}}
+\define@key{openquestion}{height}[19cm]{\def\openquestionheight{#1}}
+\define@key{openquestion}{spacedim}[0.5cm]{\def\spacedim{#1}}
+\define@key{openquestion}{linecolor}[gray]{\def\openquestionlinecolor{#1}}
+\define@choicekey*+{openquestion}{type}[\val\nr]{lines, squares}[lines]{%
+ \ifcase\nr\relax%
+ % lines
+ \openquestionsquaredfalse\openquestionlinestrue%
+ \or%
+ % squares
+ \openquestionsquaredtrue\openquestionlinesfalse%
+ \fi}%
+ {\PackageError{verifiche}{Errore nell'opzione openquestion}{Inserire lines o squares}}
+% \end{macrocode}
+%
+%The macro starts with an initiation of predefined type of |\openquestion|, than possible options are overloaded.
+%Depending on the |type| of the |\openquestion|, squared or ruled background is composed and in the foreground is reproduce the text of the argument of the command (in the "solutions mode").
+% \begin{macrocode}
+\NewDocumentCommand{\openquestion}{o m}{%
+ \setkeys{openquestion}{type, width, height, linecolor, spacedim} %init
+ \IfValueT{#1}{\setkeys{openquestion}{#1}}%
+ \ifopenquestionsquared% if squared open question
+ \begin{tikzpicture}%
+ \draw[step=\spacedim, \openquestionlinecolor]%
+ (0,0) grid (\openquestionwidth,-\openquestionheight);%
+ \node[anchor=base west, align=left, text width=\openquestionwidth,%
+ inner sep=0cm, font=\solutionfont, execute at begin node=\setlength{\baselineskip}{\spacedim}]%
+ at (0, -\spacedim){\ifsol#2\fi};
+ \end{tikzpicture}%
+ \else% if lined open question
+ \begin{tikzpicture}%
+ \pgfmathparse{int(\openquestionheight/\spacedim)}%
+ \foreach \y in {1, ..., \pgfmathresult}%
+ \draw[\openquestionlinecolor] (0, -\y*\spacedim) -- +(\openquestionwidth,0);%
+ \node[anchor=base west,align=left, text width=\openquestionwidth,%
+ inner sep=0cm, font=\solutionfont, execute at begin node=\setlength{\baselineskip}{\spacedim}]%
+ at (0, -\spacedim){\ifsol#2\fi};%
+ \end{tikzpicture}%
+ \fi%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\textandimage}
+%The |\textandimage| manages two column material via |minipage| environment.
+% \begin{macrocode}
+\NewDocumentCommand{\textandimage}{O{.7\textwidth} O{.3\textwidth} m m}{%
+ \begin{minipage}{#1}
+ {#3}
+ \end{minipage}
+ \hfill
+ \begin{minipage}{#2}
+ {#4}
+ \end{minipage}
+}
+% \end{macrocode}
+%\end{macro}
+% \Finale
+\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/verifiche/verifiche.ins b/Master/texmf-dist/source/latex/verifiche/verifiche.ins
new file mode 100644
index 00000000000..de63841f732
--- /dev/null
+++ b/Master/texmf-dist/source/latex/verifiche/verifiche.ins
@@ -0,0 +1,41 @@
+%%
+%% Copyright (C) 2020 i by Francesco Raccanello
+%%
+%% This file 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:
+%%
+%% http://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.
+%%
+\input docstrip.tex
+\keepsilent
+\usedir{tex/latex/verifiche}
+\preamble
+This is a generated file.
+Copyright (C) 2021 by Francesco Raccanello
+This file 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:
+http://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.
+\endpreamble
+\generate{\file{verifiche.sty}{\from{verifiche.dtx}{package}}}
+\Msg{*********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space verifiche.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file verifiche.dtx}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*********************************************************}
+\endbatchfile \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/xcjk2uni/xCJK2uni.dtx b/Master/texmf-dist/source/latex/xcjk2uni/xCJK2uni.dtx
index 860d37f9154..7a87a2a2b56 100644
--- a/Master/texmf-dist/source/latex/xcjk2uni/xCJK2uni.dtx
+++ b/Master/texmf-dist/source/latex/xcjk2uni/xCJK2uni.dtx
@@ -25,12 +25,10 @@ Set the current encoding. The default encoding is GBK.
\CJKchartouni{<character>}
Convert a single CJK character to its Unicode.
-It requires two steps of expansion.
\CJKsfdtouni{<plane>}{<slot>}
Convert the .sfd coordinate to its Unicode.
-It requires two steps of expansion.
You can read the package manual (in Chinese) for more detailed explanations.
@@ -44,7 +42,7 @@ Issues and pull requests are welcome.
Copyright and Licence
---------------------
- Copyright (C) 2013-2014, 2016, 2018-2019 by Qing Lee <sobenlee@gmail.com>
+ Copyright (C) 2013-2014, 2016, 2018-2020 by Qing Lee <sobenlee@gmail.com>
----------------------------------------------------------------------
This work may be distributed and/or modified under the
@@ -57,7 +55,7 @@ Copyright and Licence
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'.
+ This work has the LPPL maintenance status "maintained".
The Current Maintainer of this work is Qing Lee.
@@ -89,7 +87,7 @@ Copyright and Licence
\preamble
- Copyright (C) 2013-2014, 2016, 2018-2019 by Qing Lee <sobenlee@gmail.com>
+ Copyright (C) 2013-2014, 2016, 2018-2020 by Qing Lee <sobenlee@gmail.com>
--------------------------------------------------------------------------
This work may be distributed and/or modified under the
@@ -102,7 +100,7 @@ Copyright and Licence
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'.
+ This work has the LPPL maintenance status "maintained".
The Current Maintainer of this work is Qing Lee.
@@ -192,7 +190,7 @@ Copyright and Licence
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\RequirePackage{expl3}
%<make>\input expl3-generic %
-%<+package|make|def>\GetIdInfo$Id: xCJK2uni.dtx 21b29fd 2019-04-07 23:27:31 +0800 Qing Lee <sobenlee@gmail.com> $
+%<+package|make|def>\GetIdInfo$Id: xCJK2uni.dtx daef005 2020-05-01 21:09:45 +0800 Qing Lee <sobenlee@gmail.com> $
%<package|make|def> {Convert CJK character to Unicode.}
%<*driver>
\def\ctxaux#1#2#3{\def\ctxversion{v#2}}\ctxaux
@@ -202,7 +200,7 @@ Copyright and Licence
%<make>\cs_if_exist:NF \ProvidesExplFile
%<make> {
%<make> \group_begin:
-%<make> \cs_set_nopar:Npn \ProvidesExplFile #1#2#3#4
+%<make> \cs_set:Npn \ProvidesExplFile #1#2#3#4
%<make> { \iow_log:x { File:~#1~#2~v#3~#4 } }
%<make> \exp_after:wN \group_end:
%<make> }
@@ -214,7 +212,7 @@ Copyright and Licence
%<JIS>\ProvidesExplFile{xCJK2uni-UJIS.def}
%<KS>\ProvidesExplFile{xCJK2uni-UKS.def}
%<*driver|package|make|def>
- {\ExplFileDate}{0.8}{\ExplFileDescription}
+ {\ExplFileDate}{1.0}{\ExplFileDescription}
%</driver|package|make|def>
%<*driver>
\documentclass{ctxdoc}
@@ -226,7 +224,7 @@ Copyright and Licence
%</driver>
% \fi
%
-% \CheckSum{585}
+% \CheckSum{532}
% \GetFileId{xCJK2uni.sty}
%
% \title{\bfseries\pkg{xCJK2uni} 宏包}
@@ -264,8 +262,7 @@ Copyright and Licence
% \begin{syntax}
% \cs{CJKchartouni} \Arg{单个CJK文字}
% \end{syntax}
-% 将文字转换成 $16$ 进制形式的 Unicode。例如 |\CJKchartouni{一}| 将得到 |4E00|。
-% 将它展开两次就可以得到结果。
+% 将文字转换成 Unicode。例如 |\CJKchartouni{一}| 将得到 \texttt{\number\string"4E00 }。
% \end{function}
%
% \begin{function}[EXP]{\CJKsfdtouni}
@@ -273,8 +270,8 @@ Copyright and Licence
% \cs{CJKsfdtouni} \Arg{plane} \Arg{slot}
% \end{syntax}
% \meta{plane} 表示由 \file{.sfd} 文件定义的子字体的编号,\meta{slot} 表示在
-% 子字体中的位置,这个命令将得到该坐标位置的 Unicode。将它展开两次就可以得到结果。
-% 如果在当前编码下,该坐标位置不合法,将展开为空。
+% 子字体中的位置,这个命令将得到该坐标位置的 Unicode。
+% 如果在当前编码下,该坐标位置不合法,将展开为空并报错。
% \end{function}
%
% \end{documentation}
@@ -300,7 +297,7 @@ Copyright and Licence
'l3kernel'~and~'l3packages'\\\\
using~your~TeX~package~manager~or~from~CTAN.
}
-\@ifpackagelater { expl3 } { 2019/03/05 } { }
+\@ifpackagelater { expl3 } { 2020/03/06 } { }
{ \msg_error:nn { xCJK2uni } { l3-too-old } }
% \end{macrocode}
%
@@ -330,7 +327,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_set_enc:nnnnnn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_set_enc:nnnnnn #1#2#3#4#5#6
+\cs_new_protected:Npn \@@_set_enc:nnnnnn #1#2#3#4#5#6
{
\seq_gput_right:Nn \c_@@_encoding_seq {#1}
\prop_gput:Nnn \c_@@_sfd_prop {#1} {#2}
@@ -366,25 +363,63 @@ Copyright and Licence
%
% \begin{macro}{\@@_enc_map:nn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_enc_map:nn #1#2
+\cs_new_protected:Npn \@@_enc_map:nn #1#2
{
\int_set_eq:Nc \l_@@_i_min_int { c_@@_ #1 _i_min_int }
\int_set_eq:Nc \l_@@_ii_min_int { c_@@_ #1 _ii_min_int }
\int_set_eq:Nc \l_@@_gap_begin_int { c_@@_ #1 _gap_begin_int }
\int_set_eq:Nc \l_@@_gap_end_int { c_@@_ #1 _gap_end_int }
\int_set_eq:Nc \l_@@_plane_int { c_@@_ #1 _plane_int }
- \cs_if_exist:cF { CJKtu_ #1 _sfd_map:nn }
- { \group_begin: \file_input:n { xCJK2uni-#2.def } \group_end: }
- \cs_set_eq:Nc \CJKtu_sfd_map:nn { CJKtu_ #1 _sfd_map:nn }
+ \cs_if_exist:cF { CJKtu_ #1 _index_map:n }
+ { \@@_input_sfd_map:n {#2} }
+ \cs_set_eq:Nc \@@_index_map:n { CJKtu_ #1 _index_map:n }
+ }
+\cs_new_protected:Npn \@@_input_sfd_map:n #1
+ {
+ \group_begin:
+ \ExplSyntaxOn
+ \file_input:n { xCJK2uni-#1.def }
+ \group_end:
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_use_enc_map:n}
+% \begin{macro}[int]{\CJKtu_index_map:n}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_use_enc_map:n #1
+\cs_new:Npn \CJKtu_index_map:n #1
+ { \CJKtu_unicode:n { \@@_index_map:n {#1} } }
+\cs_new_eq:NN \CJKtu_unicode:n \use:n
+\cs_new_eq:NN \@@_index_map:n \use_none:n
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\CJKtu_index_map:nn}
+% \begin{macrocode}
+\cs_new_protected:Npn \CJKtu_index_map:nn #1
+ {
+ \exp_args:Ncc \@@_index_map_aux:NNn
+ { CJKtu_ #1 _index_map:n } { c_@@_ #1 _intarray }
+ }
+\cs_new_protected:Npn \@@_index_map_aux:NNn #1#2
{
- \prop_get:NxNTF \c_@@_sfd_prop {#1} \l_@@_sfd_tl
+ \cs_new:Npn #1 ##1 { \intarray_item:Nn #2 { ##1 + 1 } }
+ \intarray_const_from_clist:Nn #2
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\CJKtu_sfd_map:nn}
+% \begin{macrocode}
+\cs_new:Npn \CJKtu_sfd_map:nn #1#2
+ { \CJKtu_index_map:n { ( #1 - 1 ) * 256 + (#2) } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[int]{\CJKtu_use_enc_map:n}
+% \begin{macrocode}
+\cs_new_protected:Npn \CJKtu_use_enc_map:n #1
+ {
+ \prop_get:NnNTF \c_@@_sfd_prop {#1} \l_@@_sfd_tl
{ \@@_enc_map:nn {#1} { \l_@@_sfd_tl } }
{ \msg_error:nnx { xCJK2uni } { invalid-encoding } {#1} }
}
@@ -394,7 +429,7 @@ Copyright and Licence
Only~\seq_use:Nnnn \c_@@_encoding_seq { ~and~ } { ,~ } { ,~and~ } ~
are~supported.
}
-\prg_generate_conditional_variant:Nnn \prop_get:NnN { Nx } { TF }
+\cs_generate_variant:Nn \CJKtu_use_enc_map:n { x }
% \end{macrocode}
% \end{macro}
%
@@ -407,36 +442,12 @@ Copyright and Licence
\@@_set_enc:nnnnnn { GBK } { UGBK } { "81 } { "40 } { "7E } { "80 }
% \end{macrocode}
%
-% \begin{macro}{\@@_sfd_to_unicode:nn}
-% \begin{macrocode}
-\cs_new_nopar:Npn \@@_sfd_to_unicode:nn #1#2
- {
- \exp:w \exp_last_unbraced:Nf
- \@@_get_unicode:w \CJKtu_sfd_map:nn {#1} {#2} \exp_end:
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_get_unicode:w}
-% \begin{macrocode}
-\cs_new_nopar:Npn \@@_get_unicode:w #1 \exp_end:
- {
- \tl_if_empty:nTF {#1}
- { \exp_end: }
- { \@@_get_unicode_aux:w #1 \q_stop }
- }
-\cs_new_nopar:Npn \@@_get_unicode_aux:w #1 \or: #2 \q_stop
- { \or: #2 \exp_end: #1 }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_char_to_unicode:n}
+% \begin{macro}[int]{\CJKtu_char_to_unicode:n}
% \begin{macrocode}
\group_begin:
\char_set_catcode_active:n { "7F }
-\cs_new_nopar:Npn \@@_char_to_unicode:n #1
+\cs_new:Npn \CJKtu_char_to_unicode:n #1
{
- \exp:w
\int_compare:nNnTF { \tl_count:n {#1} } = 2
{ \CJKtu_byte:NN #1 }
{
@@ -445,23 +456,23 @@ Copyright and Licence
{ \@@_encoding_error: }
}
}
-\cs_new_nopar:Npn \@@_byte:wNwnw ^^7f #1 ^^7f #2 ^^7f
+\cs_new:Npn \@@_byte:wNwnw ^^7f #1 ^^7f #2 ^^7f
{ \CJKtu_byte_map:nn { `#1 } {#2} }
-\cs_new_nopar:Npn \@@_byte:Nwnw #1 ^^7f #2 ^^7f
+\cs_new:Npn \@@_active_byte:Nwnw #1 ^^7f #2 ^^7f
{ \CJKtu_byte_map:nn { `#1 } {#2} }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\CJKtu_bookmarks_hook:}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \CJKtu_bookmarks_hook:
+\cs_new_protected:Npn \CJKtu_bookmarks_hook:
{
- \cs_set_eq:NN ^^7f \@@_byte:Nwnw
- \cs_set_eq:NN \CJK@XX \CJKtu_byte:NN
- \cs_set_eq:NN \CJKchar \@@_byte:wnn
- \cs_set_eq:NN \CCTchar \CJKtu_byte:nn
- \cs_set_eq:NN \@CCTSetChar \@@_CCT_byte:NNN
- \cs_set_eq:NN \@@_get_unicode:n \@@_UTF_xvi_be:n
+ \cs_set_eq:NN ^^7f \@@_active_byte:Nwnw
+ \cs_set_eq:NN \CJK@XX \CJKtu_byte:NN
+ \cs_set_eq:NN \CJKchar \@@_byte:wnn
+ \cs_set_eq:NN \CCTchar \CJKtu_byte:nn
+ \cs_set_eq:NN \@CCTSetChar \@@_CCT_byte:NNN
+ \cs_set_eq:NN \CJKtu_unicode:n \@@_UTF_xvi_be_octal:n
}
\group_end:
% \end{macrocode}
@@ -470,9 +481,9 @@ Copyright and Licence
% \begin{macro}[int]{\CJKtu_byte:NN}
% \begin{macro}{\@@_CCT_byte:NNN}
% \begin{macrocode}
-\cs_new_nopar:Npn \CJKtu_byte:NN #1#2
+\cs_new:Npn \CJKtu_byte:NN #1#2
{ \CJKtu_byte:nn { `#1 } { `#2 } }
-\cs_new_nopar:Npn \@@_CCT_byte:NNN #1#2#3
+\cs_new:Npn \@@_CCT_byte:NNN #1#2#3
{ \CJKtu_byte:nn { `#1 } { `#3 } }
% \end{macrocode}
% \end{macro}
@@ -480,13 +491,13 @@ Copyright and Licence
%
% \begin{macro}{\@@_byte:wnn}
% \begin{macrocode}
-\cs_new_nopar:Npn \@@_byte:wnn #1# { \CJKtu_byte:nn }
+\cs_new:Npn \@@_byte:wnn #1# { \CJKtu_byte:nn }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[int]{\CJKtu_byte:nn}
% \begin{macrocode}
-\cs_new_nopar:Npn \CJKtu_byte:nn #1#2
+\cs_new:Npn \CJKtu_byte:nn #1#2
{
\int_compare:nTF { \l_@@_i_min_int <= #1 <= \l_@@_i_max_int }
{
@@ -501,11 +512,8 @@ Copyright and Licence
}
{ \@@_encoding_error: }
}
-\cs_new_nopar:Npn \@@_encoding_error:
- {
- \msg_expandable_error:nn { xCJK2uni } { encoding-error }
- \exp_end:
- }
+\cs_new:Npn \@@_encoding_error:
+ { \msg_expandable_error:nn { xCJK2uni } { encoding-error } }
\msg_new:nnn { xCJK2uni } { encoding-error }
{ Wrong~encoding~scheme. }
% \end{macrocode}
@@ -513,9 +521,9 @@ Copyright and Licence
%
% \begin{macro}[int]{\CJKtu_byte_map:nn}
% \begin{macrocode}
-\cs_new_nopar:Npn \CJKtu_byte_map:nn #1#2
+\cs_new:Npn \CJKtu_byte_map:nn #1#2
{
- \exp_args:Nf \@@_index_map:n
+ \exp_args:Nf \CJKtu_index_map:n
{
\int_eval:n
{
@@ -529,38 +537,21 @@ Copyright and Licence
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_index_map:n}
+% \begin{macro}{\@@_UTF_xvi_be_octal:n}
% \begin{macrocode}
-\cs_new_nopar:Npn \@@_index_map:n #1
+\cs_new:Npn \@@_UTF_xvi_be_octal:n #1
+ { \exp_args:Nf \@@_UTF_xvi_be_octal_aux:n { \int_eval:n {#1} } }
+\cs_new:Npn \@@_UTF_xvi_be_octal_aux:n #1
{
- \@@_get_unicode:n
- {
- \CJKtu_sfd_map:nn
- { \int_div_truncate:nn {#1} { 256 } + 1 }
- { \int_mod:nn {#1} { 256 } }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_get_unicode:n}
-% \begin{macrocode}
-\cs_new_nopar:Npn \@@_get_unicode:n #1
- { \exp_last_unbraced:Nf \@@_get_unicode:w #1 \exp_end: }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_UTF_xvi_be:n}
-% \begin{macrocode}
-\cs_new_nopar:Npn \@@_UTF_xvi_be:n #1
- { \exp_args:Nf \@@_UTF_xvi_aux:n { \int_eval:n { "#1 } } }
-\cs_new_nopar:Npn \@@_UTF_xvi_aux:n #1
- {
- \HyPsd@DecimalToOctalFirst
+ \@@_UTF_xvi_be_octal:nn
{ \int_div_truncate:nn {#1} { 256 } }
- \HyPsd@DecimalToOctalSecond
{ \int_mod:nn {#1} { 256 } }
}
+\cs_new:Npn \@@_UTF_xvi_be_octal:nn #1#2
+ {
+ \HyPsd@DecimalToOctalFirst {#1}
+ \HyPsd@DecimalToOctalSecond {#2}
+ }
% \end{macrocode}
% \end{macro}
%
@@ -589,29 +580,31 @@ Copyright and Licence
%
% \begin{macro}{\useCJKencmap,\CJKchartouni,\CJKsfdtouni}
% \begin{macrocode}
-\cs_new_eq:NN \useCJKencmap \@@_use_enc_map:n
-\cs_new_eq:NN \CJKchartouni \@@_char_to_unicode:n
-\cs_new_eq:NN \CJKsfdtouni \@@_sfd_to_unicode:nn
+\cs_new_eq:NN \useCJKencmap \CJKtu_use_enc_map:x
+\cs_new_eq:NN \CJKchartouni \CJKtu_char_to_unicode:n
+\cs_new_eq:NN \CJKsfdtouni \CJKtu_sfd_map:nn
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_initial:N}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_initial:N #1
+\cs_new_protected:Npn \@@_initial:N #1
{
\tl_if_exist:NTF #1
{
\prop_get:NxNTF \c_@@_sfd_prop {#1} \l_@@_sfd_tl
{ \@@_enc_map:nn {#1} { \l_@@_sfd_tl } }
- { \@@_use_enc_map:n { GBK } }
+ { \CJKtu_use_enc_map:n { GBK } }
}
- { \@@_use_enc_map:n { GBK } }
+ { \CJKtu_use_enc_map:n { GBK } }
}
+\prg_generate_conditional_variant:Nnn \prop_get:NnN { Nx } { TF }
% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
-\exp_args:Nc \@@_initial:N { CJK @ @ @ enc }
+\group_begin: \exp_args:NNc \group_end:
+\@@_initial:N { CJK @ @ @ enc }
% \end{macrocode}
%
% \begin{macrocode}
@@ -641,7 +634,7 @@ Copyright and Licence
{
\lua_now:e
{
- kpse.set_program_name("kpsewhich") ~
+ kpse.set_program_name("luatex") ~
local ~ sfd = kpse.find_file("UGBK.sfd", "subfont~definition~files") ~
if ~ sfd ~ then ~
tex.write(sfd) ~
@@ -650,7 +643,7 @@ Copyright and Licence
}
}
{
- \sys_shell_get:nnNTF { kpsewhich ~ UGBK.sfd } { } \l_tmpa_str
+ \sys_get_shell:nnNTF { kpsewhich ~ UGBK.sfd } { } \l_tmpa_str
{ \str_gset_eq:NN \g_@@_path_str \l_tmpa_str }
{ \msg_fatal:nnnn { xCJK2uni } { file-not-found } { GBK } { UGBK.sfd } }
}
@@ -694,7 +687,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_write_file:nnn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_write_file:nnn #1#2#3
+\cs_new_protected:Npn \@@_write_file:nnn #1#2#3
{
\group_begin:
\seq_put_right:No \l_file_search_path_seq { \g_@@_path_str }
@@ -704,19 +697,14 @@ Copyright and Licence
\seq_clear:N \l_@@_sfd_plane_seq
\@@_write_sfd_map_header:n {#1}
\ior_str_map_inline:Nn \g_@@_sfd_ior
- { \str_if_eq:nnT {##1} { 00 ~ 0x0000_0x00FF } { \ior_map_break: } }
+ { \str_if_eq:nnT { ##1 } { 00 ~ 0x0000_0x00FF } { \ior_map_break: } }
\ior_str_map_inline:Nn \g_@@_sfd_ior
{
- \tl_if_blank:nTF {##1}
- {
- \ior_map_break:n
- {
- \@@_write_sfd_map_trailer:n {#1}
- \@@_write_cmap_file:n {#2}
- }
- }
- { \@@_read_sfd_line:nnn {##1} {#1} {#2} }
+ \tl_if_blank:nT { ##1 } { \ior_map_break: }
+ \@@_read_sfd_line:nn { ##1 } {#2}
}
+ \@@_write_sfd_map_trailer:n {#1}
+ \@@_write_cmap_file:n {#2}
\iow_close:N \g_@@_sfd_cmap_iow
\ior_close:N \g_@@_sfd_ior
\seq_clear:N \l_@@_sfd_plane_seq
@@ -732,19 +720,18 @@ Copyright and Licence
%
% \begin{macro}{\@@_read_sfd_line:n,\@@_read_sfd_line:nn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npx \@@_read_sfd_line:nnn #1#2#3
+\cs_new_protected:Npx \@@_read_sfd_line:nn #1
{
- \exp_not:N \@@_read_sfd_line:nwnn #1
- \c_backslash_str \exp_not:N \q_nil \exp_not:N \q_stop {#2} {#3}
+ \exp_not:N \@@_read_sfd_line:nwn #1
+ \c_backslash_str \exp_not:N \q_nil \exp_not:N \q_stop
}
-\use:x
+\use:e
{
- \cs_new_protected_nopar:Npn \exp_not:N \@@_read_sfd_line:nwnn
- ##1 0 \token_to_str:N x ##2 \c_backslash_str ##3 \exp_not:N \q_stop
- ##4##5
+ \cs_new_protected:Npn \exp_not:N \@@_read_sfd_line:nwn
+ #1 0 \token_to_str:N x #2 \c_backslash_str #3 \exp_not:N \q_stop
{
- \exp_not:N \@@_read_sfd_line:nnnnn
- {##1} { 0 \token_to_str:N x } {##2} {##4} {##5}
+ \exp_not:N \@@_read_sfd_line:nnnn
+ {#1} { 0 \token_to_str:N x } {#2}
}
}
% \end{macrocode}
@@ -752,48 +739,22 @@ Copyright and Licence
%
% \begin{macro}{\@@_read_sfd_line:nnnnn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_read_sfd_line:nnnnn #1#2#3#4#5
+\cs_new_protected:Npn \@@_read_sfd_line:nnnn #1#2#3#4
{
\tl_if_blank:nF {#1}
{
\seq_if_empty:NF \l_@@_sfd_plane_seq
- {
- \iow_now:Nx \g_@@_sfd_map_iow
- {
- \c_@@_indent_str \c_@@_indent_str
- \token_to_str:N \fi: \iow_newline:
- \c_@@_indent_str \c_right_brace_str
- }
- \@@_write_cmap_file:n {#5}
- }
- \@@_write_plane_map:nn {#1} {#4}
+ { \@@_write_cmap_file:n {#4} }
\tl_set:Nx \l_@@_sfd_plane_tl { \tl_trim_spaces:n {#1} }
+ \@@_write_plane_map:n { \l_@@_sfd_plane_tl }
}
\seq_set_split:Nnn \l_@@_sfd_line_seq {#2} {#3}
\seq_concat:NNN \l_@@_sfd_plane_seq
\l_@@_sfd_plane_seq \l_@@_sfd_line_seq
\iow_now:Nx \g_@@_sfd_map_iow
{
- \c_@@_indent_str \c_@@_indent_str \c_@@_indent_str
- \seq_use:Nn \l_@@_sfd_line_seq { ~ \or: } ~
- \token_to_str:N \or:
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_write_plane_map:nn}
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_write_plane_map:nn #1#2
- {
- \iow_now:Nx \g_@@_sfd_map_iow
- {
- \cs_new_nopar:cpn { ~ @@_ #2 _sfd_map_ \int_eval:n {#1} :n ~ } ~
- \c_hash_str 1 \iow_newline:
- \c_@@_indent_str \c_left_brace_str \iow_newline:
\c_@@_indent_str \c_@@_indent_str
- \exp_not:N \if_case:w \tex_numexpr:D
- \c_hash_str 1 ~ \token_to_str:N \scan_stop:
+ " \seq_use:Nn \l_@@_sfd_line_seq { ~ , ~ " } ~ ,
}
}
% \end{macrocode}
@@ -801,7 +762,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_write_cmap_file:n}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_write_cmap_file:n #1
+\cs_new_protected:Npn \@@_write_cmap_file:n #1
{
\tl_clear:N \l_@@_cmap_block_tl
\int_zero:N \l_@@_sfd_index_int
@@ -809,13 +770,13 @@ Copyright and Licence
\@@_write_cmap_header:nn { C #1 } { \l_@@_sfd_plane_tl }
\iow_now:Nx \g_@@_sfd_cmap_iow
{
- \iow_newline:
- 1~begincodespacerange \iow_newline:
+ \iow_newline:
+ 1~begincodespacerange \iow_newline:
\c_@@_indent_str < 00 > ~
<
\int_to_Hex:n
{ \seq_count:N \l_@@_sfd_plane_seq - 1 }
- > \iow_newline:
+ > \iow_newline:
endcodespacerange
}
\seq_map_function:NN \l_@@_sfd_plane_seq \@@_write_cmap_body:n
@@ -823,9 +784,9 @@ Copyright and Licence
{
\iow_now:Nx \g_@@_sfd_cmap_iow
{
- \iow_newline:
+ \iow_newline:
\int_mod:nn { \l_@@_sfd_index_int } { 100 } ~
- beginbfchar \iow_newline:
+ beginbfchar \iow_newline:
\l_@@_cmap_block_tl
endbfchar
}
@@ -838,18 +799,18 @@ Copyright and Licence
%
% \begin{macro}{\@@_write_cmap_body:n}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_write_cmap_body:n #1
+\cs_new_protected:Npn \@@_write_cmap_body:n #1
{
\int_case:nnTF { \l_@@_sfd_index_int }
{ { 99 } { } { 199 } { } }
{
\iow_now:Nx \g_@@_sfd_cmap_iow
{
- \iow_newline:
- 100 ~ beginbfchar \iow_newline:
+ \iow_newline:
+ 100 ~ beginbfchar \iow_newline:
\l_@@_cmap_block_tl
< \int_to_Hex:n { \l_@@_sfd_index_int } > ~
- <#1> \iow_newline:
+ <#1> \iow_newline:
endbfchar
}
\tl_clear:N \l_@@_cmap_block_tl
@@ -860,7 +821,7 @@ Copyright and Licence
<
\int_compare:nNnF \l_@@_sfd_index_int > { 15 } { 0 }
\int_to_Hex:n { \l_@@_sfd_index_int }
- > ~ <#1> \iow_newline:
+ > ~ <#1> \iow_newline:
}
}
\int_incr:N \l_@@_sfd_index_int
@@ -872,20 +833,13 @@ Copyright and Licence
% \begin{macrocode}
\group_begin:
\char_set_catcode_other:N \%
-\cs_new_protected_nopar:Npn \@@_write_sfd_map_header:n #1
+\cs_new_protected:Npn \@@_write_sfd_map_header:n #1
{
\iow_now:Nx \g_@@_sfd_map_iow
{
- %<*#1> \iow_newline:
- \cs_new_nopar:cpn { ~ CJKtu_#1_sfd_map:nn ~ } ~ \c_hash_str 1
- \iow_newline: \c_@@_indent_str \c_left_brace_str \iow_newline:
- \c_@@_indent_str \c_@@_indent_str
- \token_to_str:N \cs_if_exist_use:cF
- \iow_newline: \c_@@_indent_str \c_@@_indent_str \c_@@_indent_str
- { ~ @@_#1_sfd_map_ ~ \exp_not:N \int_eval:n { \c_hash_str 1 } ~ :n ~}
- \iow_newline: \c_@@_indent_str \c_@@_indent_str \c_@@_indent_str
- { ~ \exp_not:N \use_none:n } \iow_newline:
- \c_@@_indent_str \c_right_brace_str
+ %<*#1> \iow_newline:
+ \exp_not:N \CJKtu_index_map:nn { ~ #1 ~ } \iow_newline:
+ \c_@@_indent_str \c_left_brace_str
}
}
% \end{macrocode}
@@ -893,22 +847,30 @@ Copyright and Licence
%
% \begin{macro}{\@@_write_sfd_map_trailer:n}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_write_sfd_map_trailer:n #1
+\cs_new_protected:Npn \@@_write_sfd_map_trailer:n #1
{
\iow_now:Nx \g_@@_sfd_map_iow
{
- \c_@@_indent_str \c_@@_indent_str
- \token_to_str:N \fi: \iow_newline:
- \c_@@_indent_str \c_right_brace_str \iow_newline:
+ \c_@@_indent_str \c_right_brace_str \iow_newline:
%</#1>
}
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\@@_write_plane_map:n}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_write_plane_map:n #1
+ {
+ \iow_now:Nx \g_@@_sfd_map_iow
+ { %% ~ <#1> }
+ }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_write_cmap_header:nn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_write_cmap_header:nn #1#2
+\cs_new_protected:Npn \@@_write_cmap_header:nn #1#2
{
\iow_now:Nx \g_@@_sfd_cmap_iow
{
@@ -919,17 +881,17 @@ Copyright and Licence
%%Title:~(TeX-#1-#2-0~TeX~#1-#2~0) \iow_newline:
%%Version:~1.000 \iow_newline:
%%EndComments \iow_newline: \iow_newline:
- /CIDInit~/ProcSet~findresource~begin \iow_newline: \iow_newline:
- 12~dict~begin \iow_newline: \iow_newline:
- begincmap \iow_newline: \iow_newline:
- /CIDSystemInfo~3~dict~dup~begin \iow_newline:
- \c_@@_indent_str /Registry~(TeX)~def \iow_newline:
- \c_@@_indent_str /Ordering~(#1-#2)~def \iow_newline:
- \c_@@_indent_str /Supplement~0~def \iow_newline:
- end~def \iow_newline: \iow_newline:
- /CMapName~/TeX-#1-#2-0~def \iow_newline:
- /CMapVersion~1.000~def \iow_newline:
- /CMapType~2~def \iow_newline: \iow_newline:
+ /CIDInit~/ProcSet~findresource~begin \iow_newline: \iow_newline:
+ 12~dict~begin \iow_newline: \iow_newline:
+ begincmap \iow_newline: \iow_newline:
+ /CIDSystemInfo~3~dict~dup~begin \iow_newline:
+ \c_@@_indent_str /Registry~(TeX)~def \iow_newline:
+ \c_@@_indent_str /Ordering~(#1-#2)~def \iow_newline:
+ \c_@@_indent_str /Supplement~0~def \iow_newline:
+ end~def \iow_newline: \iow_newline:
+ /CMapName~/TeX-#1-#2-0~def \iow_newline:
+ /CMapVersion~1.000~def \iow_newline:
+ /CMapType~2~def \iow_newline: \iow_newline:
/WMode~0~def
}
}
@@ -938,16 +900,16 @@ Copyright and Licence
%
% \begin{macro}{\@@_write_cmap_trailer:}
% \begin{macrocode}
-\cs_new_protected_nopar:Npx \@@_write_cmap_trailer:
+\cs_new_protected:Npx \@@_write_cmap_trailer:
{
\iow_now:Nn \g_@@_sfd_cmap_iow
{
- \iow_newline:
- endcmap \iow_newline:
- CMapName~currentdict~/CMap~defineresource~pop \iow_newline:
- end \iow_newline:
- end \iow_newline: \iow_newline:
- %%EndResource \iow_newline:
+ \iow_newline:
+ endcmap \iow_newline:
+ CMapName~currentdict~/CMap~defineresource~pop \iow_newline:
+ end \iow_newline:
+ end \iow_newline: \iow_newline:
+ %%EndResource \iow_newline:
%%EOF
}
}
diff --git a/Master/texmf-dist/source/latex/xcjk2uni/xCJK2uni.ins b/Master/texmf-dist/source/latex/xcjk2uni/xCJK2uni.ins
index 31967db2ee2..8b196fa524c 100644
--- a/Master/texmf-dist/source/latex/xcjk2uni/xCJK2uni.ins
+++ b/Master/texmf-dist/source/latex/xcjk2uni/xCJK2uni.ins
@@ -6,7 +6,7 @@
%%
%% xCJK2uni.dtx (with options: `install')
%%
-%% Copyright (C) 2013-2014, 2016, 2018-2019 by Qing Lee <sobenlee@gmail.com>
+%% Copyright (C) 2013-2014, 2016, 2018-2020 by Qing Lee <sobenlee@gmail.com>
%% --------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
@@ -19,7 +19,7 @@
%% 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'.
+%% This work has the LPPL maintenance status "maintained".
%%
%% The Current Maintainer of this work is Qing Lee.
%%
@@ -30,7 +30,7 @@
\preamble
- Copyright (C) 2013-2014, 2016, 2018-2019 by Qing Lee <sobenlee@gmail.com>
+ Copyright (C) 2013-2014, 2016, 2018-2020 by Qing Lee <sobenlee@gmail.com>
--------------------------------------------------------------------------
This work may be distributed and/or modified under the
@@ -43,7 +43,7 @@
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'.
+ This work has the LPPL maintenance status "maintained".
The Current Maintainer of this work is Qing Lee.
diff --git a/Master/texmf-dist/source/latex/xkeyval/xkeyval.dtx b/Master/texmf-dist/source/latex/xkeyval/xkeyval.dtx
index 874701926a9..34a01d898b9 100644
--- a/Master/texmf-dist/source/latex/xkeyval/xkeyval.dtx
+++ b/Master/texmf-dist/source/latex/xkeyval/xkeyval.dtx
@@ -26,7 +26,7 @@
% pst-xkey.sty
%
%% ---------------------------------------
-%% Copyright (C) 2004-2014 Hendri Adriaens
+%% Copyright (C) 2004-2020 Hendri Adriaens
%% ---------------------------------------
%%
%% This work may be distributed and/or modified under the
@@ -188,7 +188,7 @@ macro. \PrintChangesX\PrintIndexX
%
% \GetFileInfo{xkeyval.sty}
%
-% \CheckSum{3042}
+% \CheckSum{3040}
%
%\DoNotIndex{\:,\@,\@@,\@backslashchar,\@ehc,\@empty,\@expandtwoargs,
%\@for,\@forloop,\@fornoop,\@fortmp,\@gobble,\@gobbletwo,\@if,\@ifnch,
@@ -3440,7 +3440,7 @@ macro. \PrintChangesX\PrintIndexX
%<*xkvlatex>
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesPackage{xkeyval}
- [2014/12/03 v2.7a package option processing (HA)]
+ [2020/11/20 v2.8 package option processing (HA)]
% \end{macrocode}
% Initializations. Load |xkeyval.tex|, adjust some catcodes to define
% internal macros and initialize the |\DeclareOptionX*| working macro.
@@ -3457,6 +3457,7 @@ macro. \PrintChangesX\PrintIndexX
% \end{macrocode}
% \begin{macro}{\XKV@warn}
% \begin{macro}{\XKV@err}
+% \changes{v2.8}{2020/11/20}{Removed path from search for options of the documentclass}
% Warning and error macros.
% \begin{macrocode}
\def\XKV@warn#1{\PackageWarning{xkeyval}{#1}}
@@ -3472,12 +3473,8 @@ macro. \PrintChangesX\PrintIndexX
\XKV@whilist\@filelist\XKV@tempa\ifx\XKV@documentclass\@undefined\fi{%
\filename@parse\XKV@tempa
\ifx\filename@ext\@clsextension
- \XKV@ifundefined{opt@\filename@area\filename@base.\filename@ext
- }{}{%
- \edef\XKV@documentclass{%
- \filename@area\filename@base.\filename@ext
- }%
- }%
+ \XKV@ifundefined{opt@\filename@base.\filename@ext
+ }{}{\edef\XKV@documentclass{\filename@base.\filename@ext}}%
\fi
}
% \end{macrocode}
diff --git a/Master/texmf-dist/source/latex/xmuthesis/xmuthesis.dtx b/Master/texmf-dist/source/latex/xmuthesis/xmuthesis.dtx
new file mode 100644
index 00000000000..b2363ad5233
--- /dev/null
+++ b/Master/texmf-dist/source/latex/xmuthesis/xmuthesis.dtx
@@ -0,0 +1,4722 @@
+% \iffalse meta-comment
+% !TEX root = xmuthesis.tex
+% !TEX program = xelatex
+%
+% !TeX encoding = UTF-8
+%
+%% File: xmuthesis.dtx
+%
+% Copyright (C) 2019-2020 CamuseCao
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% https://www.latex-project.org/lppl.txt
+%
+%
+%
+%
+%<*driver>
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+ \expandafter\begingroup
+\fi
+%<*install>
+% \input l3docstrip.tex
+\input ctxdocstrip %
+\keepsilent
+\askforoverwritefalse
+\preamble
+<!--
+----------------------------------------------------------------
+xmuthesis --- A LaTeX template for XMU thesis writing
+E-mail: camusecao@gmail.com
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+-->
+\endpreamble
+% stop docstrip adding \endinput
+\postamble
+<!--
+Copyright (C) 2019 by CamuseCao <https://camusecao.top>
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+CamuseCao.
+
+This work consists of the file xmuthesis.dtx
+and the derived files xmuthesis.cls,
+ xmuthesis.pdf and
+ xmulogo.sty.
+
+-->
+\endpostamble
+
+\generate{
+ \usedir{tex/latex/\jobname}
+ \file{\jobname.cls}{\from{\jobname.dtx}{class}}
+ \file{xmulogo.sty}{\from{\jobname.dtx}{logo}}
+}
+% \generate{\file{l3doc.ist}{\from{l3doc.dtx}{docist}}}
+\Msg{---------------------}
+\Msg{| End of extracting |}
+\Msg{---------------------}
+\ifx\fmtname\nameofplainTeX
+ \expandafter\endbatchfile
+\else
+ \expandafter\endgroup
+\fi
+%</install>
+%</driver>
+%
+%<*driver|class>
+% !TEX root = ./xmu.tex
+\NeedsTeXFormat{LaTeX2e}
+
+\RequirePackage{ expl3, xparse, xtemplate, l3keys2e, scrlfile }
+
+\RequirePackage[l2tabu, orthodox]{nag}
+%</driver|class>
+%
+%<*driver>
+\ProvidesFile{\jobname.dtx}[2020/10/09 v0.4.1 XMU thesis]
+\documentclass{ctxdoc}% l3doc ctxdoc
+\OnlyDescription
+\begin{document}
+ \DocInput{\jobname.dtx}
+ \IndexLayout
+ \PrintChanges
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+% \changes{v0.4}{2020/10/06}{引入 \LaTeX{3} 添加 overleaf 支持以及使用 lppl 许可证等}
+% \changes{v0.3}{2020/08/09}{较少宏包的依赖以及修复部分问题}
+% \changes{v0.2}{2019/07/02}{增加平台支持以及发布 xmulogo 宏包等}
+% \changes{v0.1.1}{2019/02/19}{添加 a3 封面以及编译脚本等}
+% \changes{v0.1}{2019/01/30}{第一版}
+% \CheckSum{0}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+% \GetFileInfo{\jobname.dtx}
+% \DoNotIndex{\xmulineto, \vspace, \par, \draw, \begin, \end, \\, } %
+%
+% \title{\bfseries 厦大论文模板使用说明}
+% \author{\href{https://camusecao.top}{酸奶}}
+% \date{\filedate\quad\fileversion}
+% \maketitle
+% \begin{abstract}
+% xmuthesis 是面向厦大毕业论文写作的 \LaTeX{} 模板,它能够节约你在排版上面所花的时间。但是它不是官方模板,是由我私人维护的,格式基本符合学校的要求。虽然在我之前已经有类似的模板,但是大多数缺乏维护,已经过时,因此有了该模板。现在模板已经支持本科、硕士和博士。
+% \end{abstract}
+% \tableofcontents
+% \begin{documentation}
+% \section{介绍}
+%
+% \subsection{历史}
+% 厦大论文模板是 2018 年开始开发的, 2019 年发布于 Github 上。起初还没有写成 cls 模板,在后来逐渐规范,还额外开发了 xmulogo 宏包,用于生成高质量的校徽和校名图片。在 2020 年又统一用 dtx 来实现。
+%
+% \subsection{发现模板的问题}
+%
+% 如果发现模板用不对的地方或者有建议欢迎在 Github 上反馈或者发邮件给我。
+%
+% 联系方式:
+% 邮箱: \href{mailto:camusecao@gmail.com}{camusecao@gmail.com}
+%
+% Github 项目的地址 : \href{https://github.com/CamuseCao/XMU-thesis}{XMU-thesis}
+% \section{使用示例}
+% \subsection{最小示例}
+% \begin{ctexexam}
+% \documentclass[degree=undergraduate,bibstyle=numerical,font=empty]{xmuthesis}
+% \xmusetup{
+% author = 酸奶 ,
+% title = 你的论文题目 ,
+% date = \today , % 二〇一九年二月二十八日
+% class = 2015级 ,
+% studentnumber = 1972015xxxxxx ,
+% department = 物理科学与技术学院 ,
+% major = 微电子科学与工程 ,
+% advisor = 校内指导老师 \quad 职称 ,
+% otheradvisor = 校外指导老师 \quad 职称 ,
+% team = 物理科学与技术学院~理论物理 ,
+% fundteam = 物理科学与技术学院~理论物理 ,
+% degree = 本\quad 科 ,
+% englishtitle = Your English Title ,
+% majorordouble = 主修 , % 辅修
+% lab = 实验室 ,
+% % 以下几项本科生无需填写,也不用删除
+% classified_code = 1234 , % 分类号
+% security_classification = 公开 , % 内部 秘密 机密 公开 等
+% UDC = 5 , % 国际十进分类法
+% submit_date = 2020 年 8 月 10 日 , % 论文提交日期
+% defense_date = 2020 年 8 月 11 日 , % 论文答辩日期
+% conferred_date = 2020 年 8 月 21 日 , % 学位授予日期
+% chairman = 张三 , % 答辩委员会主席
+% referee = 李四 , % 评阅人
+% }
+% \usepackage{xmulogo}
+% \begin{document}
+% \maketitle
+% \chapter*{致谢}
+% 这里致谢
+% \begin{abstract}*
+% 中文摘要
+% \keywords*{关键词1;关键词2;关键词3}
+% \end{abstract}
+% \begin{abstract}
+% English abstract.
+% \keywords{keyword1; keyword2; keyword3}
+% \end{abstract}
+% \xmutableofcontents % 双语目录
+% \chapter{正文}{main body}
+% 正文内容
+% % \nocite{*}
+% % \bibliography{Reference}
+% \appendix
+% 附录
+% \backmatter
+% 后记
+% \end{document}
+% \end{ctexexam}
+%
+% \subsection{编译}
+%
+% 本模板需要使用 \verb|xelatex| 编译才能得到正确的结果。
+%
+% 对于 \verb|latexmk| 用户,可以用
+% \begin{frameverb}
+% latexmk -xelatex main
+% \end{frameverb}
+% 一步到位编译好。
+%
+% 不用 \verb|latexmk| 的用户可以用
+% \begin{frameverb}
+% xelatex main
+% \end{frameverb}
+% 编译。
+%
+% 如果用了有参考文献需要编译,使用 \verb|latexmk| 编译的方法仍然可行。对于不用 \verb|latexmk| 的情况,则较为复杂,需要四步
+% \begin{frameverb}
+% xelatex main
+% bibtex main
+% xelatex main
+% xelatex main
+% \end{frameverb}
+%
+% \section{文档选项}
+%
+% \begin{function}[]{degree}
+% \begin{syntax}
+% degree = \Arg{学位}
+% \end{syntax}
+% 是 xmuthesis 声明学位的选项,根据学位的不同,文档风格略有不同,这是由于不同学位的毕业论文要求不同导致的。
+% \end{function}
+%
+% \begin{optdesc}
+% \item[undergraduate] 这是该选项的默认值,本科生选用该选项
+% \item[master] 硕士生使用该选项
+% \item[doctor] 博士生使用该选项
+% \end{optdesc}
+% 以硕士生为例,他应该使用
+% \begin{frameverb}
+% \documentclass[degree=master]{xmuthesis}
+% \end{frameverb}
+%
+% \begin{function}[]{bibstyle}
+% \begin{syntax}
+% bibstyle = \Arg{参考文献样式}
+% \end{syntax}
+% 是控制参考文献样式的选项。模板默认加载 \verb|gbt7714| 宏包,需配合 \verb|bibtex| 编译得到最终结果。
+% \end{function}
+%
+% \begin{optdesc}
+% \item[numerical] 这是该选项的默认值,顺序编码制下,参考文献根据引用的顺序排序。引用样式是角标式。
+% \item[numbers] 与 \verb|numerical| 一样是顺序编码制,但是引用使用正文模式,如“文献 [3] 中说明”
+% \item[authoryear] 使用著者-出版年制
+% \end{optdesc}
+% 以著者-出版年制为例,应该使用
+% \begin{frameverb}
+% \documentclass[bibstyle=authoryear]{xmuthesis}
+% \end{frameverb}
+%
+% 对于著者-出版年制,要获得正确的参考文献排序,需要用 \verb|key=| \Arg{拼音} 对 \verb|bib| 文件的中文作者注音,且用 \verb|&| 分隔作者。如
+% \begin{ctexexam}
+% @article{zhangsan,
+% title={高等数学教学改革研究进展},
+% author={张三 and 李四},
+% key={zhang1 san1 & li3 si4},
+% journal={大學數學},
+% volume={23},
+% number={4},
+% pages={20--26},
+% year={2007},
+% publisher={大學數學編輯部}
+% }
+% \end{ctexexam}
+%
+%
+% \begin{function}[]{font}
+% \begin{syntax}
+% bibstyle = \Arg{字体选项}
+% \end{syntax}
+% 是控制模板使用字体的命令。
+% \end{function}
+%
+% \begin{optdesc}
+% \item[empty] 这是该选项的默认值,采用 \CTeX{} 宏集的自动判断功能,自动根据系统配置字体
+% \item[adobe] 采用 \CTeX{} 宏集配置的 adobe 字体,详情用 \verb|texdoc ctex| 查看
+% \item[fandol] 同上
+% \item[founder] 同上
+% \item[mac] 同上
+% \item[macnew] 同上
+% \item[macold] 同上
+% \item[ubuntu] 同上
+% \item[windows] 同上
+% \item[overleaf] 当模板在 overleaf 平台运行时,请使用该选项。这将调用 noto 中文字体
+% \end{optdesc}
+% 以 fandol 为例,应该使用
+% \begin{frameverb}
+% \documentclass[font=fandol]{xmuthesis}
+% \end{frameverb}
+%
+% 由于学校要求英文使用 Times New Roman 和 Arial 字体,对于 Linux 用户,它们常常不是默认安装在系统中的字体,因此需要用户自行安装这两个字体。
+%
+%
+% \begin{function}[]{nottoc, notabs, notbib}
+% 是控制目录中出现的内容。
+% \end{function}
+% \begin{optdesc}
+% \item[nottoc] 目录中不出现“目录”
+% \item[nottabs] 目录中不出现“摘要”
+% \item[notbib] 目录中不出现“参考文献”
+% \end{optdesc}
+% 以目录中不出现“摘要”和“参考文献” 为例,应该使用
+% \begin{frameverb}
+% \documentclass[nottabs,notbib]{xmuthesis}
+% \end{frameverb}
+%
+% \section{信息录入}
+%
+% \begin{function}[]{\xmusetup}
+% \begin{syntax}
+% \tn{xmusetup} \Arg{键值列表}
+% \end{syntax}
+% 是 xmuthesis 的信息录入命令,其参数是一个键值列表,以通用的接口完成信息录入。
+% \end{function}
+% \begin{table}[htbp]
+% \centering
+% \caption{xmusetup 里的健值}
+% \label{tab:xmusetup}
+% \begin{tabular}{*3l}
+% \toprule \\
+% 值 & 解释 & 示例 \\
+% \midrule
+% author & 作者 & 酸奶 \\
+% title & 题目 & 你的论文题目 \\
+% date & 日期 & \verb|\today| 或~二〇一九年二月二十八日 \\
+% class & 年级 & 2015级 \\
+% studentnumber & 学号 & 1972015xxxxxx \\
+% department & 学院 & 物理科学与技术学院 \\
+% major & 专业 & 微电子科学与工程 \\
+% advisor & 校内指导老师 & 张三 \verb|\quad| 职称 \\
+% otheradvisor & 校外指导老师 & 李四 \verb|\quad| 职称 \\
+% team & 所在课题组 & 物理科学与技术学院~理论物理 \\
+% fundteam & 资助课题组 & 物理科学与技术学院~理论物理 \\
+% degree & 学位 & 本\quad 科 \\
+% englishtitle & 英文标题 & Your English Title \\
+% majorordouble & 学位性质 & 主修 或 辅修 \\
+% lab & 所在实验室 & 极端条件实验室 \\
+% \midrule % \\
+% \midrule % \\
+% classified_code $^*$ & 分类号 & 1234 \\
+% security_classification $^*$ & 安全等级 & 公开 内部 秘密 机密 公开 等 \\
+% UDC $^*$ & 国际十进分类法 & 5 \\
+% submit_date $^*$ & 论文提交日期 & 2020 年 8 月 10 日 \\
+% defense_date $^*$ & 论文答辩日期 & 2020 年 8 月 11 日 \\
+% conferred_date $^*$ & 学位授予日期 & 2020 年 8 月 21 日 \\
+% chairman $^*$ & 答辩委员会主席 & 张三 \\
+% refere $^*$ & 评阅人 & 李四 \\
+% \bottomrule
+% \end{tabular}
+% \end{table}
+% 表~\ref{tab:xmusetup}中是有的值,其中加 \( ^* \) 的值本科生无需填写,也无需删除。对于博士生和硕士生则需要填写。
+%
+% 例如对于毕业论文题目是“我的毕业论文”的张三,他需要在导演区填入的是
+% \begin{frameverb}
+% \xmusetup{
+% author = 张三 ,
+% title = 我的毕业论文 ,
+% }
+% \end{frameverb}
+%
+% \section{模板提供或修改过的命令和环境}
+%
+% \begin{function}{\maketitle}
+% 该命令不仅仅是用于产生标题,还包括了承诺书等。在正确填写好 \verb|\xmusetup| 后,自动得到符合要求的的 title 。另外该命令与普通文档类一样,在 \verb|document| 环境的开头使用。例如
+% \begin{ctexexam}
+% \begin{document}
+% \maketitle
+% 其余内容
+% \end{document}
+% \end{ctexexam}
+% \end{function}
+%
+% \begin{function}{\chapter, \section, \subsection}
+% 这三个命令都不同于标准类文档,它们需要两个参数。第一个参数是中文的标题,第二个参数是英文的标题。在 \verb|\xmutableofcontents| 使用使用时需要加 * ,而之后的无需添加。如
+% \begin{ctexexam}
+% \chapter*{中文的章}{English Chapter}
+% \xmutableofcontents
+% \section{正文的节}{English section in main part}
+% \end{ctexexam}
+% \end{function}
+%
+% \begin{function}{abstract, \keywords}
+% \verb|abstract| 环境和 \verb|keywords| 命令都有带 * 版和不带 * 版,分别对应中英文。一个简单但是完整的摘要应该是如下的样子
+% \begin{ctexexam}
+% \begin{abstract}*
+% 中文摘要
+% \keywords*{关键词1;关键词2;关键词3}
+% \end{abstract}
+% \begin{abstract}
+% English abstract.
+% \keywords{keyword1; keyword2; keyword3}
+% \end{abstract}
+% \end{ctexexam}
+% \end{function}
+%
+% \begin{function}{\xmutableofcontents}
+% 用于生成中英双语目录,一般在摘要结束后使用。 \verb|\tableofcontents| 不要在 xmuthesis 中使用。
+% \end{function}
+%
+%
+% \begin{function}{\cref}
+% 由 \verb|cleveref| 宏包提供,并且在 xmuthesis 经过设置的智能引用命令,用于图片表格的交叉引用。使用例子
+% \begin{ctexexam}
+% \begin{equation}
+% 1+1=2 \label{eq:1}
+% \end{equation}
+% \begin{equation}
+% 2+2=4 \label{eq:2}
+% \end{equation}
+% \begin{equation}
+% 3+3=6 \label{eq:3}
+% \end{equation}
+% \begin{equation}
+% 4+4=8 \label{eq:4}
+% \end{equation}
+% 单引用:\cref{eq:1}
+% 范围引用:\crefrange{eq:1}{eq:2}
+% 连续多引用:\cref{eq:1,eq:3,eq:2} , 同于 \crefrange{eq:1}{eq:3}
+% 不连续多引用:\cref{eq:1,eq:2,eq:4}
+% \end{ctexexam}
+% \end{function}
+%
+% \begin{function}{proof, law, theoty}
+% 由 \verb|amsthm| 宏包提供或定制,分别对应于证明,定律和定理。注意 \verb|proof| 环境是没有编号的,另外两个是有的。简单的使用例子
+% \begin{ctexexam}
+% \begin{theory}[Energy–momentum relation]
+% The relationship of energy, momentum and mass is
+% \[E^2 = m_0^2 c^4 + p^2 c^2\]
+% where $ c $ is the light speed.
+% \end{theory}
+% \begin{law}\label{law:box}
+% Don't hide in the witness box.
+% \end{law}
+% \begin{proof}
+% For simplicity, we use
+% \[
+% E=mc^2
+% \]
+% That's it.
+% \end{proof}
+% \end{ctexexam}
+% \end{function}
+%
+% \begin{function}{\circled}
+% 用于产生带圈的数字,产生带圈的数字用 \verb|\circled{1}| 。
+% \end{function}
+%
+% \section{xmulogo 宏包}
+%
+% 为了方便输出高质量的校徽和校名图片,特意开发了 xmulogo 宏包。主要提供了两个命令。
+% \begin{function}{\xmulogo, \xmulogon}
+% \verb|\xmulogo| , \verb|\xmulogon| 分别用于产生校徽和校名。两者的用法完全一样。一下以 \verb|\xmulogo| 为例介绍其用法。用法为 \verb|\xmulogo[scale]{r,g,b}| ,其中 \verb|scale| 控制图片的尺寸,填入 $0\sim 1$ 之间的数。花括号的 \verb|{r,g,b}| 是用与控制颜色的,采用 rgb 的颜色控制方法。它是一个可选参数,不填则采用默认的颜色。以下用法均为正确用法。
+% \begin{ctexexam}
+% \xmulogo
+% \xmulogo[0.5]
+% \xmulogo{0.1,0.15,0.9}
+% \xmulogo[0.4]{0.1,0.1,0.9}
+% \end{ctexexam}
+% \end{function}
+%
+% 模板封面页在 \verb|figs/xmu-flag.pdf| 不存在是会调用 \verb|xmulogo| 宏包生成相应的图片。建议像 Github 项目地址一样创建 \verb|figs| 文件,并且放入 \verb|xmu-flag.pdf| 。这样可以节约编译的时间。
+% \section{一些建议}
+%
+%\subsection{致谢}
+%
+%致谢语应以简短的文字对课题研究与论文撰写过程中曾直接给予帮助的人员(例如指导教师、答疑教师及其他人员)表示自己的谢意。
+%
+%作为毕业论文提交时,应注意事项:致谢内容用小四号宋体。根据2016年2月施行的《厦门大学本科毕业论文(设计)规范》,致谢被放在论文起首。致谢结构一般分为三个部分:1,回顾;2,感谢; 3,承担责任以及献辞。第一部分可以简述论文写作的经历,所面对的挑战以及你如何应对。第二部分具体感谢在论文过程中给与你帮助的人。第三部分指出你将为自己的论文承担责任,如果你希望将此论文献给谁,可以在最后指出。致谢内容请亲自撰写,使其具备你个人的特色。抄袭任何模板内容是极其懒惰、没有意义、不负责任和错误的行为。
+%
+%
+%\subsection{摘要}
+% 本科生中文摘要应具有独立性和自含性,语言精炼、明确,高度概括论文内容,以 400 字左右为宜。关键词应体现论文特色,具有语义性,在论文中有明确出处,以 3—5 个为宜。关键词另起一行排在摘要的下方,每个关键词之间用中文分号“;”分开,最后一个关键词不打标点符号。
+%
+% 硕士与博士的中文摘要中文 600 字左右;重点概述本文研究的问题、意义、创新之处和主要观点、结论。关键词数量:不超过3个,能体现论文的主要内容,词组符合学术规范;每个关键词字数:不超过5个字;每个关键词字数:不超过5个字;
+%
+% 英文摘要、关键词内容与中文相同,每个关键词之间用英文
+% 分号“;”加一空格分开,最后一个关键词不打标点符号。中、
+% 英文摘要及其关键词各置一页内。
+%
+%
+
+% \subsection{正文的基本要求}
+%
+% 正文从另右页开始。每一章应另起页,并从奇数页开始。正文一般从引言(绪论)开始,以结论或讨论结束。引言(绪论)应包括论文的研究目的、流程和方法等。研究领域的历史回顾、文献回溯、理论分析等内容应独立成章,用足够的文字叙述。结论应包含论文的核心观点,阐述自己的创造性成果及其在本研究领域中的意义、作用,交代研究工作的局限,提出未来工作的意见和建议。
+%
+% 正文由于涉及的学科、选题、研究方法、结果表达方式等有很大的差异,不作统一的规定,但要求自然科学论文应提供实验数据和图片资料真实,推理正确、结论清晰;人文和社会学科的论文应把握论点正确、论证充分、论据可靠,恰当运用系统分析和比较研究的方法进行模型或方案设计,注重实证研究和案例分析。
+%
+% 正文一般不少于 6000 字(不含图表、程序和计算数字)。用外国语言撰写的,字数参照 4 个英文单词折算 1 个中文字数进行计数。\footnote{以上内容仅供参考,详见《厦门大学本科毕业论文(设计)规范》}
+%
+%
+% \subsection{学术名词}
+%
+% \begin{itemize}
+% \item 科学技术名词术语采用全国自然科学名词审定委员会公布的规范词或国家标准、部标准中规定的名称,尚未统一规定或有争议的名词术语,可采用惯用的名称。
+% \item 特定含义的名词术语或新名词、以及使用外文缩写代替某一名词术语时,首次出现时应在括号内注明其含义,如:OECD(Organization for Economic Co-operation and Development)
+%代替经济合作发展组织。
+% \item 外国人名一般采用英文原名,可不译成中文,英文人名按名前姓后的原则书写。一般很熟知的外国人名(如牛顿、爱因斯坦、达尔文、马克思等)可按通常标准译法写译名。
+% \end{itemize}
+%
+%
+%
+%\subsection{物理量名称、符号与计量}
+%
+%
+%\begin{itemize}
+% \item 论文中某一物理量的名称和符号应统一,一律采用国务院发布的《中华人民共和国法定计量单位》或者国际公认的计量单位。单位名称和符号的书写方式,应采用国际通用符号。
+% \item 在不涉及具体数据表达时允许使用中文计量单位如“千克”。
+% \item 表达时间使用“2014 年 6 月”,不能使用“14 年 6 月”或“2014.6”。不能使用 80 年代,而应为上世纪 80 年代或 20 世纪80 年代。表达时刻应采用中文计量单位,如“下午 3 点 10 分”,不能写成“3h10min”,在表格中可以用“3:10PM”表示。
+% \item 物理量符号、物理量常量、变量符号用斜体,计量单位符号均用正体。
+%\end{itemize}
+%
+% 单位书写推荐用 \verb|siunitx| 宏包。
+%
+% 数学和物理的学生强烈推荐学习使用 \verb|physics| 宏包。
+%
+% \subsection{数字}
+%
+% \begin{enumerate}
+% \item 无特别约定情况下,一般均采用阿拉伯数字表示。
+% \item 小数的表示方法:一般情形下,小于 1 的数,需在小数点之前加 0。但当某些特殊数字不可能大于 1 时(如相关系数、比率、概率值),小数点之前的 0 可去掉,如 $ r=.26,p<.05 $ 。
+% \item 统计符号的格式:一般除 $ \alpha , \beta , \lambda , \epsilon \text{以及} V $ 等符号外,其余统计符号一律以斜体字呈现,如\textit{ANCOVA,ANOVA,MANOVA,N,nl,M,SD,F,p,r } 等。
+% \end{enumerate}
+%
+%
+% \subsection{公式}
+%
+% \begin{enumerate}
+% \item 公式应另起一行缩略书写,居于中央(注意行首无缩进),与周围文字留足够的空间区分开。
+% \item 公式的编号用英文圆括号括起,放在公式右边行末,在公式和编号之间不加虚线。子公式可不编序号,需要引用时可加编 a、b、c……,重复引用的公式不得另编新序号。公式较多时,可分章编号,但应与表格、图的编序方式统一。
+% \item 较长的公式最好在等号处转行,或在运算符号(如“+”、“-”号)处转行,等号或运算符号应在转行后的行首。公式中分数线的横线,其长度应等于或略大于分子和分母中较长的一方。
+% \end{enumerate}
+%
+% \subsection{表格}
+%
+% \begin{enumerate}
+% \item 表格要有:表号,表名,单位。表号和表名居表上方正中(注意行首无缩进);表格只有一个单位时,单位在表右上方。表较多时,可分章编号,但须与插图、公式的编序方式统一。
+% \item 表格应优先采用三线表,三线表头尾两条线宽 1 磅,中间线宽 0.75 磅。也可根据需要使用其他格式。
+% \item 表格如参考其他资料,应标明“作者、来源名称、时间”,置表格左下方。
+% \item 表格允许下页接写,接写时应重复表号,表号后跟表名(可省略)和“(续)”,置于表上方。续表应重复表头。
+% \item 表格应放在离正文首次出现处最近的地方,不应超前和过分拖后。表与上下正文之间各空一行。
+% \end{enumerate}
+%
+% 三段表的示例为
+% \begin{ctexexam}
+% \begin{table}[!ht]
+% \centering
+% \begin{threeparttable}[b]
+% \zihao{5}
+% \caption{表格示例}
+% \begin{tabular}{ccc}
+% \toprule
+% & ABS & CB \\
+% \midrule
+% (Intercept) & 5.482 & 3.4871 \\
+% ABC & 1.1173 & 1.1933 \\
+% DEF & 8.1752* & 2.6836 \\
+% \bottomrule
+% \multicolumn{3}{c}{*p<0.1; **p<0.05; ***p<0.01} \\
+% \bottomrule
+% \end{tabular}%
+% \label{tab:mlogit}%
+% \begin{tablenotes}
+% \zihao{5}\item Note: These are estimates of multinomial logit model.
+% \end{tablenotes}
+% \end{threeparttable}
+% \end{table}%
+% \end{ctexexam}
+%
+%
+% \subsection{插图}
+%
+% \begin{enumerate}
+% \item 图包括曲线图、构造图、示意图、框图、流程图、记录图、地图、照片等。图应与文字内容相符,技术内容正确。所有制图应符合国家标准和专业标准,对无规定符号的图形应采用该行业的常用画法。
+% \item 图要有:图号,图名,单位。图号和图名要居图下方的正中(注意行首无缩进)。图较多时,可分章编号,但须与表格、公式的编序方式统一。
+% \item 图如参考其他资料,要示明“作者、来源名称、时间”,置图左下方。
+% \item 由若干分图组成的插图,分图用 a、b、c……标序。分图的图名以及图中各种代号的意义,以图注形式写在图题下方,先写分图名,另起行写代号的意义。
+% \item 图与图标题、图序号为一个整体,不得拆开排版为两页。当页空白不够排版该图整体时,可将其后文字部分提前,将图移至次页最前面。
+% \end{enumerate}
+%
+%
+%
+% \subsection{注释}
+%
+% 当文中的字、词或短语需要进一步加以说明,而又没有具体的文献来源时,用注释。注释不宜过多。
+% 篇名、作者注置于当页地脚。对文内有关特定内容的注释可夹在文内(加圆括号),也可排在当页地脚,注释序号以带圈的数字形式标示在被注释词条的右上角。注脚的命令如下\verb|\footnote{注脚内容}|。
+%
+%\subsection{参考文献与引用}
+%
+% 本模板默认引用 \verb|gbt7714| 宏包,可以使用它处理参考文献。
+%
+% 以下是一些参考文献的引用。应该能有合适的。不合适可以修改。
+%
+% \begin{ctexexam}
+% \cite{label1}
+% \cite{label,label2}
+% \citet{label3}
+% \citep{label3}
+% \citealt{label3}
+% \citeauthor{label3}
+% \citeyearpar{label3}
+% \end{ctexexam}
+%
+%
+% \section{代码插入}
+%
+% 模板已加载 \verb|listings| 宏包,并且简单设置过。
+% 可以使用 \verb|lstlisting| 环境来展示代码。
+% 下面是一个Matlab的代码的插入示例,还可以插入其它类型的代码。有额外需求可以添加。
+%
+% \begin{frameverb}
+% \lstinputlisting[language=Matlab]{Plot.m}
+% \end{frameverb}
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \end{documentation}
+%
+% \StopEventually{}
+%
+%
+%\begin{implementation}
+% \clearpage
+% \section{代码实现}
+%<*class>
+% \begin{macrocode}
+\ExplSyntaxOn
+\def\IfXeTeXTF#1#2{\csname sys_if_engine_xetex:TF\endcsname{#1}{#2}}
+
+\IfXeTeXTF{
+ % \PassOptionsToClass{fontset=none}{ctexbook}
+ \PassOptionsToPackage{no-math}{fontspec}
+ \PassOptionsToPackage{utf8}{inputenc}
+}{}
+
+\sys_if_engine_pdftex:T {
+ \PassOptionsToClass{UTF8}{ctexbook}
+ \msg_new:nnn { engine } { msg } {
+ Don't~use~pdfLaTeX~to~compile~the~final~TeX~files.
+ }
+ \msg_warning:nn { engine } { msg }
+}
+
+
+
+
+\ProvidesClass{ xmuthesis }[2020/10/04 v0.4.1 XMU thesis]
+
+\PassOptionsToPackage{subfigure}{tocloft}
+\PassOptionsToPackage{noend}{algpseudocode}
+\PassOptionsToPackage{para}{threeparttable}
+\PassOptionsToPackage{sort&compress}{natbib}
+
+\bool_set_false:N \l__xmu_advanced_font_bool
+\bool_set_false:N \l__xmu_overleaf_font_bool
+\bool_set_false:N \l__xmu_undergraduate_bool
+\bool_set_false:N \l__xmu_master_bool
+\bool_set_false:N \l__xmu_doctor_bool
+
+\bool_set_true:N \l__xmu_toc_toc_bool
+\bool_set_true:N \l__xmu_toc_abs_bool
+\bool_set_true:N \l__xmu_toc_ref_bool
+
+\keys_define:nn { xmuthesis }{
+ degree .choice: ,
+ degree .default:n = undergraduate ,
+ degree / undergraduate .code:n = \bool_set_true:N \l__xmu_undergraduate_bool ,
+ degree / master .code:n = \bool_set_true:N \l__xmu_master_bool ,
+ degree / doctor .code:n = \bool_set_true:N \l__xmu_doctor_bool ,
+
+ nottoc .code:n = \bool_set_false:N \l__xmu_toc_toc_bool ,
+ notabs .code:n = \bool_set_false:N \l__xmu_toc_abs_bool ,
+ notbib .code:n = \bool_set_false:N \l__xmu_toc_ref_bool ,
+
+ bibstyle .choice: ,
+ bibstyle .default:n = numerical ,
+ bibstyle / numerical .code:n = ,
+ bibstyle / numbers .code:n =
+ \AfterPackage{gbt7714}{\citestyle{numbers}} ,
+ bibstyle / authoryear .code:n =
+ \AfterPackage{gbt7714}{\bibliographystyle{gbt7714-author-year}} ,
+ bibstyle / unknown .code:n =
+ \msg_error:nnxxx { xmuthesis } { unknown-choice } { bibstyle }
+ { numerical, numbers, authoryear }
+ { The~choice~' #1 '~is~invalid~for~bibstyle} ,
+
+ font .choice: ,
+ font .default:n = empty ,
+ font / adobe .code:n = \PassOptionsToClass{fontset = #1}{ctexbook} ,
+ font / fandol .code:n = \PassOptionsToClass{fontset = #1}{ctexbook} ,
+ font / founder .code:n = \PassOptionsToClass{fontset = #1}{ctexbook} ,
+ font / mac .code:n = \PassOptionsToClass{fontset = #1}{ctexbook} ,
+ font / macnew .code:n = \PassOptionsToClass{fontset = #1}{ctexbook} ,
+ font / macold .code:n = \PassOptionsToClass{fontset = #1}{ctexbook} ,
+ font / windows .code:n = \PassOptionsToClass{fontset = #1}{ctexbook} ,
+ font / ubuntu .code:n = \PassOptionsToClass{fontset = #1}{ctexbook}
+ \msg_new:nnn { ubuntu font } { msg } {
+ You~are~using~the~default~fonts,~so~you~better~change~it~by~font=adobe,
+ ~or~advance.~If~you~choose~them,
+ ~you~should~download~the~necessary~font~and~put~them~in~the~right~place.
+ }
+ \msg_warning:nn { ubuntu font } { msg } ,
+ font / overleaf .code:n = \PassOptionsToClass{fontset =none}{ctexbook}
+ \bool_set_true:N \l__xmu_overleaf_font_bool ,
+ font / advance .code:n = \PassOptionsToClass{fontset =none}{ctexbook}
+ \bool_set_true:N \l__xmu_advanced_font_bool ,
+ font / empty .code:n = \msg_new:nnn { font } { msg } {
+ You~are~using~the~default~fonts,~you~can~change~it~by~font=adobe,
+ ~windows,~mac,~advance~and~so~on.
+ }
+ \msg_warning:nn { font } { msg },
+ font / unknown .code:n = \msg_error:nnxxx { xmuthesis } { unknown-choice }{ font }{
+ empty, adobe, fandol, founder, mac, macnew, macold, ubuntu, windows, advance
+ }{
+ The~choice~' #1 '~is~invalid~for~font
+ },
+}
+
+\ProcessKeysOptions { xmuthesis }
+
+
+\LoadClass [ zihao=-4 , openright, ] {ctexbook}
+
+\sys_if_engine_pdftex:T {
+ \RequirePackage{microtype,amsfonts}
+}
+
+\NewDocumentCommand\degree{ m m m }{
+ \IfBooleanTF{\l__xmu_undergraduate_bool}{
+ #1
+ }{
+ \IfBooleanTF{\l__xmu_master_bool}{
+ #2
+ }{
+ #3
+ }
+ }
+}
+
+\NewDocumentCommand\undergratuateTF{ m m }{
+ \IfBooleanTF{\l__xmu_undergraduate_bool}{
+ #1
+ }{
+ #2
+ }
+}
+
+\undergratuateTF{
+
+}{
+ \RequirePackage{xeCJKfntef}
+}
+\RequirePackage[UseMSWordMultipleLineSpacing,MSWordLineSpacingMultiple=1.5]
+{zhlineskip}
+
+\RequirePackage{
+ amsthm ,
+ physics ,
+ siunitx ,
+ verbatim ,
+ multirow ,
+ geometry ,
+ fancyhdr ,
+ graphicx ,
+ % longtable ,
+ booktabs ,
+ tabularx ,
+ caption ,
+ threeparttable ,
+ subfig ,
+ tocloft ,
+ % tocbibind ,
+ xcolor ,
+ listings ,
+ gbt7714 ,
+ % float ,
+ hyperref ,
+ algorithm ,
+ algpseudocode ,
+ cleveref ,
+}
+
+\IfXeTeXTF{
+\RequirePackage{unicode-math}
+\setmainfont{Times~New~Roman} % Times~New~Roman Source~Serif~Pro
+\setsansfont{Arial} % Arial Source~Sans~Pro
+
+\unimathsetup{
+ math-style = ISO ,
+ bold-style = ISO ,
+ nabla = upright ,
+ partial = upright ,
+ }
+}{}
+
+\geometry{
+ left = 2cm ,
+ right = 2cm ,
+ top = 4cm ,
+ bottom = 3cm ,
+}
+\bool_if:NTF \l__xmu_undergraduate_bool{
+ \captionsetup{font={small,bf}}
+}{
+ \captionsetup{font={normalsize,bf}}
+}
+
+\hypersetup{
+% bookmarks=true ,
+ bookmarksnumbered = false ,
+ linkcolor = black ,
+ citecolor = blue ,
+ urlcolor = green ,
+ colorlinks ,
+}
+
+
+\bool_if:NT \l__xmu_advanced_font_bool{
+ \setmonofont[
+ Extension = .otf ,
+ Path = fonts/ ,
+ UprightFont = *-regular ,
+ BoldFont = *-bold ,
+ ItalicFont = *-it ,
+ BoldItalicFont = *-boldit] {SourceCodePro}
+ \setCJKmonofont[
+ Extension = .otf ,
+ Path = fonts/ ,
+ UprightFont = *-Regular ,
+ BoldFont = *-Bold ,
+ ItalicFont = *-Regular ,
+ BoldItalicFont = *-Bold ,
+ ItalicFeatures = FakeSlant ,
+ BoldItalicFeatures = FakeSlant] {NotoSansMonoCJKsc}
+ \setCJKmainfont[
+ Extension = .otf ,
+ Path = fonts/ ,
+ UprightFont = *-Regular ,
+ BoldFont = *-Bold ,
+ ItalicFont = *-Regular ,
+ BoldItalicFont = *-Bold ,
+ ItalicFeatures = FakeSlant ,
+ BoldItalicFeatures = FakeSlant] {NotoSerifCJKsc}
+ \setCJKsansfont[
+ Extension = .otf ,
+ Path = fonts/ ,
+ UprightFont = *-Regular ,
+ BoldFont = *-Bold ,
+ ItalicFont = *-Regular ,
+ BoldItalicFont = *-Bold ,
+ ItalicFeatures = FakeSlant ,
+ BoldItalicFeatures = FakeSlant] {NotoSansCJKsc}
+ \setmathfont[
+ Extension = .otf ,
+ Path = fonts/ ,
+ BoldFont = XITSMath-Bold ,
+ StylisticSet = 8] {XITSMath-Regular}
+}
+
+\bool_if:NT \l__xmu_overleaf_font_bool{
+ % \setmainfont{Noto~Serif}
+ % \setsansfont{Noto~Sans}
+ % \setmonofont{Noto~Mono}
+ \setCJKmainfont{Noto~Serif~CJK~SC}
+ \setCJKsansfont{Noto~Sans~CJK~SC}
+ \setCJKmonofont{Noto~Sans~Mono~CJK~SC}
+ % \setmathfont{XITSMath}
+}
+
+
+\RenewDocumentCommand\chaptermark{m}{\markboth{#1}{#1}}
+
+\fancyhf{} % cleans original header&footer
+\fancyhead[CE]{\zihao{-5} \l__xmu_title_tl}
+\fancyhead[CO]{\zihao{-5} \leftmark} %\leftmark \chaptermark
+\fancyfoot[C]{\thepage}
+
+\RenewDocumentCommand\headrulewidth{}{0pt}
+
+
+\ctexset{
+ today = big, % format date
+ chapter = {
+ format = \centering\zihao{-3}\sffamily,
+ beforeskip = -15pt,
+ afterskip = 30pt,
+ pagestyle = fancy,},%
+ section = {
+ format = \zihao{4}\sffamily,
+ beforeskip = 10pt,
+ afterskip = 10pt,
+ },
+ subsection = {
+ format = \zihao{4}\sffamily,
+ },
+}
+
+
+\newlistof{indice}{tce}{Table~of~Contents}
+
+\setlength{\cftbeforetcetitleskip}{-30pt}
+\setlength{\cftbeforechapskip}{8pt}
+\setlength{\cftbeforesecskip}{6pt}
+\setlength{\cftbeforesubsecskip}{4pt}
+\setlength{\cftbeforetoctitleskip}{-30pt}
+\setlength{\cftsecnumwidth}{3.2em}
+\setlength{\cftsubsecindent}{4.5em}
+\RenewDocumentCommand\cftchapleader{}{\cftdotfill{\cftdotsep}} % for chapters
+% Add \thispagestyle{plain} to the font setting
+% to force the pagestyle in toc always be plain,
+% or it maybe influence by my slfe-define \cleanrdoublepage
+\bool_if:NTF \l__xmu_undergraduate_bool{
+ \RenewDocumentCommand\cftchapfont{}{
+ \thispagestyle{plain}\zihao{4}\sffamily
+ }% Chapter font
+ \RenewDocumentCommand\cftsecfont{}{
+ \thispagestyle{plain}\zihao{-3}\sffamily
+ }% Section font
+ \RenewDocumentCommand\cftsubsecfont{}{
+ \thispagestyle{plain}\zihao{-3}\rmfamily
+ }%subsection font
+}{
+ \RenewDocumentCommand\cftchapfont{}{
+ \thispagestyle{plain}\zihao{4}\sffamily\bfseries
+ }% Chapter font
+ \RenewDocumentCommand\cftsecfont{}{
+ \thispagestyle{plain}\zihao{-4}\sffamily\bfseries
+ }% Section font
+ \RenewDocumentCommand\cftsubsecfont{}{
+ \thispagestyle{plain}\zihao{-4}\rmfamily
+ }%subsection font
+}
+
+% \RenewDocumentCommand\cfttoctitlefont{}
+% {\hfill\zihao{-3}\sffamily 目\quad 录\hfill}%\phantom{mmmmmmmmm}
+% \RenewDocumentCommand\cftaftertoctitle{}{\hfill}
+\RenewDocumentCommand\cfttoctitlefont{}{\hspace*{\fill}\zihao{-3}\sffamily}
+\RenewDocumentCommand\cftaftertoctitle{}{\hspace*{\fill}}
+% \RenewDocumentCommand\cfttcetitlefont{}{
+% \hfill\zihao{-3}\rmfamily\bfseries Table~of~Contents\hfill}%\phantom{mmmmmmm}
+% \RenewDocumentCommand\cftaftertcetitle{}{\hfill}
+\RenewDocumentCommand\cfttcetitlefont{}{\hspace*{\fill}\zihao{-3}\rmfamily\bfseries}
+\RenewDocumentCommand\cftaftertcetitle{}{\hspace*{\fill}}
+
+\let\oldappendix\appendix
+\bool_set_false:N \l__xmu_appendix_bool
+\RenewDocumentCommand\appendix{}{
+ \oldappendix
+ \bool_set_true:N \l__xmu_appendix_bool
+}
+
+\makeatletter
+\NewDocumentCommand\captce { m } {
+ \if@mainmatter
+ \bool_if:NTF \l__xmu_appendix_bool{
+ \addcontentsline{tce}{chapter}{
+ \rmfamily\bfseries \protect\makebox[5em][l]{Appendix~\thechapter}~\;\;#1}
+ }{
+ \addcontentsline{tce}{chapter}{
+ \rmfamily\bfseries \protect\makebox[5em][l]{Chapter~\thechapter}#1}
+ }
+ \else
+ \addcontentsline{tce}{chapter}{
+ \rmfamily\bfseries\protect\makebox[0em][l]{}#1}
+\fi
+}
+\makeatother
+
+\NewDocumentCommand\sectce { m } {
+ \addcontentsline{tce}{section}{
+ \rmfamily\bfseries\protect\makebox[2.3em][l]{\thesection}#1
+ }
+}
+
+\NewDocumentCommand\ssectce { m } {
+ \addcontentsline{tce}{subsection}{
+ \protect\makebox[2.3em][l]{\thesubsection}#1
+ }
+}
+
+
+\let\oldchapter\chapter
+\RenewDocumentCommand\chapter{ s m g }{
+ \IfBooleanTF {#1} {
+ \oldchapter*{#2}
+ \IfNoValueF {#3} {#3}
+ }{
+ \oldchapter{#2}
+ \IfNoValueF {#3} {
+ \captce{#3}
+ }
+ }
+}
+
+\let\oldsection\section
+\RenewDocumentCommand\section{ s m g }{
+ \IfBooleanTF {#1}{
+ \oldsection*{#2}
+ \IfNoValueF {#3} {#3}
+ }{
+ \oldsection{#2}
+ \IfNoValueF {#3} {
+ \sectce{#3}
+ }
+ }
+}
+
+\let\oldsubsection\subsection
+\RenewDocumentCommand\subsection{ s m g }{
+ \IfBooleanTF {#1}{
+ \oldsubsection*{#2}
+ \IfNoValueF {#3} {#3}
+ }{
+ \oldsubsection{#2}
+ \IfNoValueF {#3} {
+ \ssectce{#3}
+ }
+ }
+}
+
+\let\oldcleardoublepage\cleardoublepage
+\NewDocumentCommand\clearemptydoublepage{}{
+ \clearpage % don't delete it, even it's follewed by \cleardoublepage
+ % {\pagestyle{empty}\origdoublepage}
+ \thispagestyle{empty}\oldcleardoublepage
+}
+
+\let\cleardoublepage\clearemptydoublepage
+
+
+\NewDocumentCommand\xmutableofcontents{}{
+ \cleardoublepage
+ \bool_if:NTF \l__xmu_toc_toc_bool{
+ \addcontentsline{toc}{chapter}{\protect 目录}\captce{目录}
+ \tableofcontents
+ % \pagestyle{plain}
+ \cleardoublepage
+ \addcontentsline{toc}{chapter}{\protect Table~of~Contents}
+ \captce{Table~of~Contents}
+ \listofindice
+ % \pagestyle{plain}
+ }{
+ \tableofcontents
+ % \pagestyle{plain}
+ \cleardoublepage
+ \listofindice
+ % \pagestyle{plain}
+ }
+ \cleardoublepage
+ \mainmatter
+ \RenewDocumentCommand\headrulewidth{}{1pt}
+}
+
+\makeatother
+
+
+% --------------------------- resources settings ----------------------
+\graphicspath{{figs}{Figures/}{../Figures/}} %设定图片的存放路径
+
+% --------------------------- circled text settings ----------------------
+\NewDocumentCommand\circled { m } {
+ \raisebox{.5pt}{
+ \textcircled{\raisebox{-.9pt}{#1}}
+ }
+} % define a new command for circled text since \textcircled is very sloppy
+
+% --------------------------- endnotes settings ----------------------
+\RenewDocumentCommand\thefootnote{}{\protect\circled{\arabic{footnote}}}
+
+\NewDocumentCommand\somewords{}{
+ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxuy
+ \par
+ 中文字体
+ \par
+}
+
+\NewDocumentCommand\showfont{}{
+ {
+ \begin{center}
+ \textbf{字体展示}
+ \end{center}
+ \par
+ \( \hbar ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxuy \)
+ \par
+ % $ \symbf{\hbar ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxuy} $
+
+ \somewords
+
+ {\bfseries \somewords}
+
+ \itshape \somewords
+
+ \sffamily \somewords
+
+ \bfseries \somewords
+ % \newpage
+
+ \itshape \somewords
+
+ \ttfamily \somewords
+
+ \bfseries \somewords
+
+ \itshape \somewords
+ }
+}
+
+% --------------------------- code inserting settings ----------------------
+% required package(s):
+% - listings
+\def\lstbasicfont{\fontfamily{pcr}\selectfont\footnotesize}
+\lstset{%
+ numbers=left,
+ numberstyle=\tiny,
+ basicstyle=\small,
+ backgroundcolor=\color{white}, % choose the background color
+ basicstyle=\footnotesize\ttfamily, % size of fonts used for the code
+ columns=fullflexible,
+ tabsize=4,
+ breaklines=true, % automatic line breaking only at whitespace
+ captionpos=b, % sets the caption-position to bottom
+ commentstyle=\color{green}, % comment style
+ escapeinside={\%*}{*)}, % if you want to add LaTeX within your code
+ keywordstyle=\color{blue}, % keyword style
+ stringstyle=\color{purple}\ttfamily, % string literal style
+ frame=single,
+ rulesepcolor=\color{red!20!green!20!blue!20},
+}
+\lstloadlanguages{C,C++,Java,Matlab,Mathematica} % supported languages
+
+% --------------------------- algorithm inserting settings ----------------------
+% required packages:
+% - algorithm
+% - algpseudocode[noend]
+\makeatletter
+\def\algbackskip{\hskip-\ALG@thistlm}
+%\def\BState{\State\hskip-\ALG@thistlm}
+% both works fine, but latter one redefines \BState
+\makeatother
+
+\DeclareDocumentCommand\maketitle{}{
+\frontmatter
+\pagestyle{empty}
+ \bool_if:NTF \l__xmu_undergraduate_bool{
+% \input{Settings/Contents/undergraduate-titlepage.tex}
+\begin{center}
+ \IfFileExists{figs/xmu-flag.pdf}{
+ \includegraphics[width=8cm]{xmu-flag}
+ }{\xmulogo[0.32]}
+ \par
+ \vspace{1ex}
+
+ {
+ \rmfamily\zihao{-2}\l__xmu_degree_tl
+ \quad 毕\quad 业\quad 论\quad 文\quad
+ (~设\quad 计~)\par\vspace{1ex}
+ }
+
+ {
+ \rmfamily\zihao{3}(\l__xmu_majorordouble_tl)\par
+ }
+
+ {
+ \sffamily\zihao{2}\l__xmu_title_tl \par\vspace{1ex}
+ }
+
+ {
+ \rmfamily\bfseries\zihao{3} \l__xmu_englishtitle_tl\par\vspace{3ex}
+ }
+
+
+ { \rmfamily \zihao{4}
+ \begin{tabular}{rl}
+ 姓 \qquad 名:& \l__xmu_author_tl \\
+ 学 \qquad 号:& \l__xmu_studentnumber_tl \\
+ 学 \qquad 院:& \l__xmu_department_tl \\
+ 专 \qquad 业:& \l__xmu_major_tl \\
+ 年 \qquad 级:& \l__xmu_class_tl \\
+ 校内指导教师:& \l__xmu_advisor_tl \\
+ 校外指导教师:& \l__xmu_otheradvisor_tl \\
+ \end{tabular}%
+ }
+ \vspace{2ex}
+ \rmfamily\zihao{4}
+ \par\vspace{4ex}
+ \l__xmu_date_tl
+ \vspace{2ex}
+\end{center}
+
+% \input{Settings/Contents/undergraduate-commitment.tex}
+\chapter*{厦门大学本科学位论文诚信承诺书}
+\setcounter{page}{1}
+
+{\fontsize{14pt}{21pt}\selectfont
+
+ 本人呈交的学位论文是在导师指导下独立完成的研究成果。
+ 本人在论文写作中参考其他个人或集体已经发表的研究成果,均在文中以适当方式明确标明,
+ 并符合相关法律规范及《厦门大学本科毕业论文(设计)规范》。
+ \par
+ 该学位论文为(\l__xmu_team_tl)课题(组)的研究成果,
+ 获得(\l__xmu_fundteam_tl)课题(组)经费或实验室的资助,
+ 在(\l__xmu_lab_tl)实验室完成。
+ (请在以上括号内填写课题或课题组负责人或
+ 实验室名称,未有此项声明内容的,可以不作特别声明。)
+ \par
+ 另外,本人承诺辅修专业毕业论文(设计)
+ (如有)的内容与主修专业不存在相同与相近情况。
+ \par
+ \vspace{30pt}
+
+ \hfill 学生声明(签名):\hspace*{4cm}
+ \par\vspace{2ex}
+ \hfill 年\hspace{26pt}月\hspace{26pt}日\hspace*{2cm}
+}
+
+ }{
+% \input{Settings/Contents/master-or-doctor-titlepage.tex}
+\begin{center}
+ {
+ \vspace*{-5ex}
+ % \raggedright
+ \rmfamily\bfseries\zihao{-4}
+ 学校编码:10384\hfill 分类号\CJKunderline{\l__xmu_classified_code_tl}
+ \quad 密级 \CJKunderline{\l__xmu_security_classification_tl}\par
+ 学号:\l__xmu_studentnumber_tl\hfill UDC\;
+ \CJKunderline{\l__xmu_UDC_tl}\par\vspace{6ex}
+ \centering\IfFileExists{figs/xmu-flag.pdf}{
+ \includegraphics[width=5cm]{xmu-flag}
+ }{\xmulogon[0.65]}\par\vspace{4ex}
+ }
+ {
+ \rmfamily\bfseries\zihao{-2}
+ \bool_if:NTF \l__xmu_master_bool{
+ 硕\quad 士\quad 学\quad 位\quad 论\quad 文
+ }{
+ 博\quad 士\quad 学\quad 位\quad 论\quad 文
+ }
+ \par\vspace{2ex}
+ }
+ {
+ \sffamily\bfseries\zihao{2}\l__xmu_title_tl\par\vspace{2ex}
+ }
+ {
+ \rmfamily\bfseries\zihao{3}\l__xmu_englishtitle_tl\par\vspace{2ex}
+ }
+ {
+ \ttfamily\zihao{-2}\l__xmu_author_tl\par\vspace{2ex}
+ }
+ {
+ \ttfamily\zihao{4}
+ \begin{tabular}{rl}
+ 指导教师姓名:& \l__xmu_advisor_tl \\
+ 专\hspace{0.66\ccwd} 业\hspace{0.66\ccwd} 名\hspace{0.66\ccwd} 称:
+ & \l__xmu_major_tl \\
+ 论文提交日期:& \l__xmu_submit_date_tl \\
+ 论文答辩时间:& \l__xmu_defense_date_tl \\
+ 学位授予日期:& \l__xmu_conferred_date_tl\\
+ \end{tabular}%
+ \par\vspace{1cm}
+ }
+ {
+ \zihao{4}
+ 答辩委员会主席:\l__xmu_chairman_tl\par
+ 评阅人:\l__xmu_referee_tl\par
+ \l__xmu_date_tl\par
+ }
+\end{center}
+
+% \input{Settings/Contents/Certification-statement.tex}
+\chapter*{厦门大学学位论文原创性声明}
+\setcounter{page}{1}
+% \fontsize{14pt}{21pt}\selectfont
+{
+\zihao{4}
+本人呈交的学位论文是本人在导师指导下,独立完成的研究成果。
+本人在论文写作中参考其他个人或集体已经发表的研究成果,
+均在文中以适当方式明确标明,并符合法律规范和《厦门大学研究生学术活动规范(试行)》。
+\par
+
+另外,该学位论文为(\l__xmu_team_tl)课题(组)的研究成果,
+获得(\l__xmu_fundteam_tl)课题(组)经费或实验室的资助,
+在(\l__xmu_lab_tl)实验室完成。
+(请在以上括号内填写课题或课题组负责人或实验室名称,
+未有此项声明内容的,可以不作特别声明。)
+\par
+
+本人声明该学位论文不存在剽窃、抄袭等学术不端行为,
+并愿意承担因学术不端行为所带来的一切后果和法律责任。
+\par
+
+\vspace{5ex}
+{
+ \raggedleft
+ 声明人\quad (签名):\phantom{六个字的空白}\par
+ 指导教师(签名):\phantom{六个字的空白}\par\vspace{5ex}
+
+ 年\qquad 月\qquad 日\phantom{这七个字的空白}\par
+}
+}
+% \input{Settings/Contents/Copyright-declaration.tex}
+\chapter*{厦门大学学位论文著作权使用声明}{}
+%
+{
+\zihao{4}
+% \fontsize{14pt}{21pt}\selectfont
+本人同意厦门大学根据《中华人民共和国学位条例暂行实施办法》
+等规定保留和使用此学位论文,
+并向主管部门或其指定机构送交学位论文(包括纸质版和电子版),
+允许学位论文进入厦门大学图书馆及其数据库被查阅、借阅。
+本人同意厦门大学将学位论文加入全国博士、硕士学位论文共建单位数据库进行检索,
+将学位论文的标题和摘要汇编出版,采用影印、缩印或者其它方式合理复制学位论文。
+\par
+
+本学位论文属于:\par
+
+(\qquad )1.经厦门大学保密委员会审查核定的涉密学位论文,
+于\qquad 年\qquad 月\qquad 日解密,解密后适用上述授权。\par
+
+(\qquad )2.不保密,适用上述授权。\par
+
+(请在以上相应括号内打“√”或填上相应内容。
+涉密学位论文应是已经厦门大学保密委员会审定过的学位论文,
+未经厦门大学保密委员会审定的学位论文均为公开学位论文。
+此声明栏不填写的,默认为公开学位论文,均适用上述授权。)\par
+
+\vspace{12ex}
+{
+ \raggedleft
+ 声明人(签名):\phantom{六个字的空白}\par
+ 年\qquad 月\qquad 日\phantom{这七个字的空白}\par
+}
+}
+ }
+\cleardoublepage
+}
+
+% --------------------------- reference settings ------------------------
+% required packages:
+% - cleveref
+% \crefname params:
+% first: type
+% second: singular cross reference
+% third: plural cross reference
+\RenewDocumentCommand\citep{m}{{\color{blue}\citeauthor{#1}(\citeyearpar{#1})}}
+\crefformat{figure}{#2图~#1#3}
+\crefrangeformat{figure}{图~(#3#1#4)\;$\sim$\;(#5#2#6)}
+\crefmultiformat{figure}{图~(#2#1#3)}{和~(#2#1#3)}{,(#2#1#3)}{和~(#2#1#3)}
+
+\crefformat{table}{#2表#1#3}
+\crefrangeformat{table}{表(#3#1#4)\;$\sim$\;(#5#2#6)}
+\crefmultiformat{table}{表~(#2#1#3)}{和~(#2#1#3)}{,(#2#1#3)}{和~(#2#1#3)}
+
+\crefformat{equation}{~(#2#1#3)}
+\crefrangeformat{equation}{~(#3#1#4)\;$\sim$\;(#5#2#6)}
+\crefmultiformat{equation}{~(#2#1#3)}{ 和~(#2#1#3)}{,(#2#1#3)}{ 和~(#2#1#3)}
+% equation, chapter, section, etc.
+% \creflabelformat{htypei}{hformati}
+
+\bool_if:NT \l__xmu_toc_ref_bool{
+ \AddToHook{env/thebibliography/begin}{
+ \cleardoublepage % with \cleardoublepage will get the right page number
+ \addcontentsline{toc}{chapter}{\protect 参考文献}
+ % \captce{Reference}
+ \addcontentsline{tce}{chapter}{
+ \rmfamily\bfseries\protect\makebox[0em][l]{}Reference}
+ }
+}
+
+\AddToHook{env/thebibliography/end}{
+ \cleardoublepage
+}
+% --------------------------- equations&principles settings ------------------------
+% required packages:
+% - amsthm
+\newtheorem{theory}{定理}[section]
+\newtheorem{law}{定律}[section]
+\theoremstyle{definition}
+
+
+\NewDocumentEnvironment {abstract} { s }{
+ \bool_if:NTF \l__xmu_toc_abs_bool{
+ \IfBooleanTF {#1}{
+ \chapter*{摘要}
+ \addcontentsline{toc}{chapter}{\protect 摘要}
+ \captce{\bfseries 摘要}
+ }{
+ \chapter*{\bfseries Abstract}
+ \addcontentsline{toc}{chapter}{\protect Abstract}
+ \captce{\bfseries Abstract}
+ }
+ }{
+ \IfBooleanTF {#1}{
+ \chapter*{摘要}
+ }{
+ \chapter*{\bfseries Abstract}
+ }
+ }
+}{
+}
+
+%%============================关键词===========================%%
+
+%%关键词。
+
+\NewDocumentCommand\keywords { s m } {
+ \par\vspace{2ex}\noindent{\sffamily \bfseries
+ \IfBooleanTF {#1} {
+ 关键词:
+ }{
+ Keywords:~
+ }
+ } #2
+}
+
+
+\tl_new:N \l__xmu_author_tl
+\tl_new:N \l__xmu_title_tl
+\tl_new:N \l__xmu_date_tl
+\tl_new:N \l__xmu_class_tl
+\tl_new:N \l__xmu_studentnumber_tl
+\tl_new:N \l__xmu_department_tl
+\tl_new:N \l__xmu_major_tl
+\tl_new:N \l__xmu_advisor_tl
+\tl_new:N \l__xmu_otheradvisor_tl
+\tl_new:N \l__xmu_team_tl
+\tl_new:N \l__xmu_fundteam_tl
+\tl_new:N \l__xmu_degree_tl
+\tl_new:N \l__xmu_englishtitle_tl
+\tl_new:N \l__xmu_majorordouble_tl
+\tl_new:N \l__xmu_lab_tl
+\tl_new:N \l__xmu_classified_code_tl
+\tl_new:N \l__xmu_security_classification_tl
+\tl_new:N \l__xmu_UDC_tl
+\tl_new:N \l__xmu_submit_date_tl
+\tl_new:N \l__xmu_defense_date_tl
+\tl_new:N \l__xmu_conferred_date_tl
+\tl_new:N \l__xmu_chairman_tl
+\tl_new:N \l__xmu_referee_tl
+
+\keys_define:nn { xmu }{
+ author .tl_set:N = \l__xmu_author_tl ,
+ title .tl_set:N = \l__xmu_title_tl ,
+ date .tl_set:N = \l__xmu_date_tl ,
+ class .tl_set:N = \l__xmu_class_tl ,
+ studentnumber .tl_set:N = \l__xmu_studentnumber_tl ,
+ department .tl_set:N = \l__xmu_department_tl ,
+ major .tl_set:N = \l__xmu_major_tl ,
+ advisor .tl_set:N = \l__xmu_advisor_tl ,
+ otheradvisor .tl_set:N = \l__xmu_otheradvisor_tl ,
+ team .tl_set:N = \l__xmu_team_tl ,
+ fundteam .tl_set:N = \l__xmu_fundteam_tl ,
+ degree .tl_set:N = \l__xmu_degree_tl ,
+ englishtitle .tl_set:N = \l__xmu_englishtitle_tl ,
+ majorordouble .tl_set:N = \l__xmu_majorordouble_tl ,
+ lab .tl_set:N = \l__xmu_lab_tl ,
+ classified_code .tl_set:N = \l__xmu_classified_code_tl ,
+ security_classification .tl_set:N = \l__xmu_security_classification_tl ,
+ UDC .tl_set:N = \l__xmu_UDC_tl ,
+ submit_date .tl_set:N = \l__xmu_submit_date_tl ,
+ defense_date .tl_set:N = \l__xmu_defense_date_tl ,
+ conferred_date .tl_set:N = \l__xmu_conferred_date_tl ,
+ chairman .tl_set:N = \l__xmu_chairman_tl ,
+ referee .tl_set:N = \l__xmu_referee_tl ,
+}
+
+\NewDocumentCommand \xmusetup { m }{
+\keys_set:nn { xmu } { #1 }}
+
+% \end{macrocode}
+%</class>
+%<*logo>
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{xmulogo}[2019/06/07 v0.4.1 xmulogo]
+
+\RequirePackage{xparse,tikz,xcolor}
+\usetikzlibrary{shapes,decorations.pathmorphing}%snakes
+
+\NewDocumentCommand\xmulogon{og}{%
+ \IfNoValueTF {#1}{
+ \IfNoValueTF {#2}{
+ \definecolor{xmucolor}{rgb}{0.09411765,0.15294118,0.30980393}
+ \begin{tikzpicture}[x=.5pt, y=.5pt]
+ \xmuxiamendaxue
+ \end{tikzpicture}
+ }{
+ \definecolor{xmucolor}{rgb}{#2}
+ \begin{tikzpicture}[x=.5pt, y=.5pt]
+ \xmuxiamendaxue
+ \end{tikzpicture}
+ }
+ }{
+ \IfNoValueTF {#2}{
+ \definecolor{xmucolor}{rgb}{0.09411765,0.15294118,0.30980393}
+ \begin{tikzpicture}[x=.5pt, y=.5pt,scale=#1]
+ \xmuxiamendaxue
+ \end{tikzpicture}
+ }{
+ \definecolor{xmucolor}{rgb}{#2}
+ \begin{tikzpicture}[x=.5pt, y=.5pt,scale=#1]
+ \xmuxiamendaxue
+ \end{tikzpicture}
+ }
+ }
+}
+
+\NewDocumentCommand\xmulogo{og}{%
+ \IfNoValueTF {#1}{
+ \IfNoValueTF {#2}{
+ \definecolor{xmucolor}{rgb}{0.09411765,0.15294118,0.30980393}
+ \resizebox{\textwidth}{!}{%
+ \begin{tikzpicture}[x=.5pt, y=.5pt,scale=0.85]
+ \begin{scope}
+ \xmumainpart
+ \end{scope}
+ \begin{scope}[xshift=4.6cm,yshift=5.1cm]
+ \begin{scope}[x=.5pt,y=.5pt,xscale=-1,xshift=-9.5cm]
+ \xmuleftpart
+ \end{scope}
+ \begin{scope}[x=.5pt, y=.5pt,xscale=1]
+ \xmuleftpart
+ \end{scope}
+ \end{scope}
+ \end{tikzpicture}}
+ }{
+ \definecolor{xmucolor}{rgb}{#2}
+ \resizebox{\textwidth}{!}{%
+ \begin{tikzpicture}[x=.5pt, y=.5pt,scale=0.85]
+ \begin{scope}
+ \xmumainpart
+ \end{scope}
+ \begin{scope}[xshift=4.6cm,yshift=5.1cm]
+ \begin{scope}[x=.5pt,y=.5pt,xscale=-1,xshift=-9.5cm]
+ \xmuleftpart
+ \end{scope}
+ \begin{scope}[x=.5pt, y=.5pt,xscale=1]
+ \xmuleftpart
+ \end{scope}
+ \end{scope}
+ \end{tikzpicture}}
+ }
+ }{
+ \IfNoValueTF {#2}{
+ \definecolor{xmucolor}{rgb}{0.09411765,0.15294118,0.30980393}
+ \resizebox{#1\textwidth}{!}{%
+ \begin{tikzpicture}[x=.5pt, y=.5pt,scale=0.85]
+ \begin{scope}
+ \xmumainpart
+ \end{scope}
+ \begin{scope}[xshift=4.6cm,yshift=5.1cm]
+ \begin{scope}[x=.5pt,y=.5pt,xscale=-1,xshift=-9.5cm]
+ \xmuleftpart
+ \end{scope}
+ \begin{scope}[x=.5pt, y=.5pt,xscale=1]
+ \xmuleftpart
+ \end{scope}
+ \end{scope}
+ \end{tikzpicture}}
+ }{
+ \definecolor{xmucolor}{rgb}{#2}
+ \resizebox{#1\textwidth}{!}{%
+ \begin{tikzpicture}[x=.5pt, y=.5pt,scale=0.85]
+ \begin{scope}
+ \xmumainpart
+ \end{scope}
+ \begin{scope}[xshift=4.6cm,yshift=5.1cm]
+ \begin{scope}[x=.5pt,y=.5pt,xscale=-1,xshift=-9.5cm]
+ \xmuleftpart
+ \end{scope}
+ \begin{scope}[x=.5pt, y=.5pt,xscale=1]
+ \xmuleftpart
+ \end{scope}
+ \end{scope}
+ \end{tikzpicture}}
+ }
+ }
+}
+
+
+
+\def \xmulineto(#1,#2)
+(#3,#4)(#5,#6){%
+.. controls (#1,#2) and (#3,#4) .. (#5,#6)}
+
+\def\xmuleftpart{\fill[xmucolor]
+(-198.87168726,580.82143114)
+--(-198.87168726,574.47209795)
+(291.27710014,259.09130201)
+--(291.27710014,252.74196881)
+(420.60109729,87.27663913)
+--(420.60109729,87.27663913)
+(420.32509729,8.74074753)
+--cycle
+(420.59576396,87.27663913)
+--(420.59576396,87.27663913)
+--(428.85176377,85.6511725)
+--(420.60109729,87.27663913)
+--cycle
+(420.32509729,8.74074753)
+ \xmulineto(420.32509729,8.74074753)
+(424.27309721,28.74597375)(423.22109723,40.49544016)
+ \xmulineto(422.13843059,52.61517323)
+(420.1490973,64.76570629)(421.77309726,73.11517277)
+ \xmulineto(422.89843057,78.94850598)
+(425.67976384,81.1203726)(428.85176377,85.6511725)
+--(420.60109729,87.27663913)
+--(420.32509729,8.74074753)
+--cycle
+(53.62270538,252.91263548)
+ \xmulineto(56.10657199,256.54196873)
+(58.5492386,260.18863532)(60.94510522,263.8753019)
+ \xmulineto(60.0653719,271.4899684)
+(48.24763883,277.57396827)(34.97163912,277.57396827)
+ \xmulineto(21.16910609,277.57396827)
+(8.92946636,271.00063508)(8.92946636,262.95930192)
+ \xmulineto(8.92946636,259.15130201)
+(11.6851863,255.68330208)(16.04403954,253.06863547)
+ \xmulineto(17.63310617,252.40730215)
+(19.21070614,252.0166355)(20.78937277,251.8806355)
+--(51.27323876,251.8806355)
+ \xmulineto(52.23723874,251.8806355)
+(52.76283873,252.42730215)(53.62270538,252.91263548)
+--cycle
+(20.78937277,213.09930302)
+ \xmulineto(27.47163929,220.41663619)
+(34.55443913,227.48996937)(40.456039,234.97930254)
+ \xmulineto(43.29977227,238.59396913)
+(46.04923888,242.25530238)(48.72110549,245.9593023)
+--(20.78937277,245.9593023)
+--cycle
+(19.82523946,146.78197115)
+ \xmulineto(33.26803916,131.44330482)
+(50.47163878,116.62037181)(52.20083874,95.11517229)
+ \xmulineto(52.24243874,91.41263904)
+(51.20083877,66.39650626)(53.42523872,64.12610631)
+ \xmulineto(54.44510536,63.09383966)
+(56.39870532,62.00583969)(59.51857192,63.67823965)
+ \xmulineto(59.51857192,63.67823965)
+(65.15337179,67.74077289)(71.29977166,70.85530616)
+ \xmulineto(71.14350499,76.00583938)
+(70.76803833,87.85530578)(70.16377168,100.67823883)
+ \xmulineto(69.68523836,110.83397194)
+(65.73723845,123.07410501)(59.46643858,132.21943814)
+ \xmulineto(53.81590538,140.45930462)
+(52.19563874,151.74997104)(53.21590539,161.33930416)
+ \xmulineto(53.21590539,161.33930416)
+(36.62270575,149.64597109)(19.82523946,146.78197115)
+--cycle
+(56.84097198,174.67797053)
+ \xmulineto(56.87737197,177.77663713)
+(57.07057197,193.69263678)(57.4503053,201.95396993)
+ \xmulineto(57.83577195,210.16196975)
+(62.90910517,217.86996958)(66.37217177,225.88596941)
+ \xmulineto(68.89297171,231.73530261)
+(70.00243835,237.78196914)(70.61177167,244.28730233)
+ \xmulineto(71.32523832,252.0366355)
+(71.10137166,260.37530198)(71.10137166,269.43263511)
+ \xmulineto(71.10137166,269.43263511)
+(59.10657193,249.45930222)(41.74763897,227.54196937)
+ \xmulineto(32.8409725,216.29263628)
+(19.12270614,204.34996988)(11.85185297,192.63130347)
+ \xmulineto(7.57061306,185.71397029)
+(2.64821317,172.95397057)(8.60654637,162.05797081)
+ \xmulineto(10.33570633,158.91263755)
+(12.42529295,155.88063762)(14.74763957,152.89663768)
+--(14.59617291,153.19797101)
+ \xmulineto(14.59617291,153.19797101)
+(40.08617234,152.96463768)(56.84097198,174.67797053)
+--cycle
+(120.80497056,8.74074753)
+ \xmulineto(116.66377066,17.00584068)
+(116.86230399,28.74597375)(117.91430396,40.49544016)
+ \xmulineto(118.99710394,52.61517323)
+(120.98150389,64.76570629)(119.36230393,73.11517277)
+ \xmulineto(118.23203729,78.94850598)
+(115.45603735,81.1203726)(112.28363742,85.6511725)
+ \xmulineto(104.60657092,96.64077226)
+(100.10657102,111.1886386)(108.87737083,122.37517169)
+ \xmulineto(114.5861707,129.66730486)
+(122.55443719,135.97930472)(122.60657053,143.38597122)
+ \xmulineto(122.66910386,151.78730437)
+(120.42523724,169.09397066)(101.42523766,173.05263724)
+--(61.01857188,173.24997057)
+ \xmulineto(59.36750525,165.95930406)
+(57.68003862,147.75530446)(61.50243854,141.22463794)
+ \xmulineto(67.60657174,130.7927715)
+(75.3675049,117.82357179)(76.22630488,102.3178388)
+--(76.9664382,73.31783944)
+ \xmulineto(77.36230486,73.4537061)
+(77.75857151,73.5793061)(78.14923817,73.69277276)
+ \xmulineto(78.14923817,73.69277276)
+(89.55443792,78.02983933)(95.27323779,66.21423959)
+ \xmulineto(99.09150438,58.31783977)
+(99.23723771,48.08863999)(102.03417098,39.47930685)
+ \xmulineto(104.47683759,31.94330701)
+(108.49190417,23.7553072)(113.3148374,17.43810733)
+ \xmulineto(114.8877707,15.37517405)
+(119.1533706,9.44334751)(120.80497056,8.74074753)
+--cycle
+(407.39309758,7.93814754)
+ \xmulineto(410.39843085,6.9537609)
+(413.60643078,6.7980409)(414.95576408,11.60481413)
+ \xmulineto(421.16376394,28.91677375)
+(413.78909744,50.59903994)(414.43976409,67.93237289)
+ \xmulineto(414.61709742,72.56317279)
+(415.37176407,76.88610602)(417.11176403,80.71943927)
+ \xmulineto(316.64376625,103.43810544)
+(224.81576827,103.42197211)(124.02377049,80.71943927)
+ \xmulineto(125.75817046,76.88610602)
+(126.51857044,72.56317279)(126.6904371,67.93237289)
+ \xmulineto(127.34670375,50.59903994)
+(119.97163725,28.91677375)(126.18003711,11.60481413)
+ \xmulineto(127.52897042,6.7980409)
+(130.73723701,6.9537609)(133.74243695,7.93814754)
+ \xmulineto(220.88243503,31.76050702)
+(320.28376617,31.75010702)(407.39309758,7.93814754)
+--cycle
+(420.60109729,87.27663913)
+ \xmulineto(428.85176377,85.6511725)
+(420.60109729,87.27663913)(420.60109729,87.27663913)
+--(420.60109729,87.27663913)
+--(420.32509729,8.74074753)
+ \xmulineto(420.32509729,8.74074753)
+(412.60109746,-0.36342161)(408.22643089,0.89126637)
+ \xmulineto(321.15843281,25.75530715)
+(219.94510171,25.74597382)(132.90910363,0.89126637)
+ \xmulineto(128.53417039,-0.36342161)
+(125.10657047,-0.18217094)(122.15857054,0.74595304)
+ \xmulineto(119.20550393,1.66730768)
+(116.72630399,3.33918765)(113.93470405,6.52200091)
+ \xmulineto(110.0237708,10.96470748)
+(105.28937091,17.36464067)(101.16910433,25.81784048)
+ \xmulineto(96.84150443,34.68344029)
+(94.23203782,44.04184008)(92.61177119,53.49543987)
+ \xmulineto(91.53883788,59.7553064)
+(89.57577125,66.0886396)(83.1065714,67.80330622)
+ \xmulineto(75.71590489,69.74597285)
+(65.01337179,58.41263976)(56.98670531,56.74077313)
+ \xmulineto(53.17430539,55.94330649)
+(49.44510547,56.69650647)(47.52377218,60.45943972)
+ \xmulineto(46.5133722,62.43237301)
+(46.55963887,65.86050627)(46.33577221,69.86050618)
+ \xmulineto(45.82523888,78.67250598)
+(46.12270554,90.26050573)(46.02377221,95.27143895)
+ \xmulineto(45.55963889,120.2298384)
+(4.97685312,143.90197121)(0.54404388,167.95397068)
+ \xmulineto(-1.20543475,177.46463714)
+(1.40914653,186.7553036)(6.31018642,194.70330343)
+ \xmulineto(8.59195971,198.40730334)
+(11.23727965,201.95930327)(14.07577292,205.41263652)
+--(14.08097292,205.47396986)
+--(14.08097292,247.66196893)
+ \xmulineto(7.2107064,251.36996884)
+(2.8305065,256.84996872)(2.8305065,262.95930192)
+ \xmulineto(2.8305065,274.07396834)
+(17.26283951,283.14596814)(34.97163912,283.14596814)
+ \xmulineto(48.64350549,283.14596814)
+(60.3721719,277.74063493)(64.99710513,270.1566351)
+ \xmulineto(68.69563838,275.9539683)
+(72.36750497,281.82330151)(76.06537155,287.74596804)
+--(76.34150488,287.74596804)
+--(77.01337153,247.2926356)
+ \xmulineto(77.13830486,239.7139691)
+(75.4919049,232.43796926)(72.66377163,225.62063608)
+ \xmulineto(68.76803838,216.27130295)
+(63.3252385,207.48996981)(63.57057183,197.33397004)
+--(63.73723849,180.44330374)
+--(96.19043777,180.44330374)
+ \xmulineto(109.23723749,180.44330374)
+(123.00763718,171.01130395)(127.34670375,157.02197092)
+ \xmulineto(129.52377037,149.98997108)
+(130.22110369,142.98997123)(128.54923706,138.69797133)
+ \xmulineto(126.34150378,133.04183812)
+(122.56537053,128.17823823)(118.70083728,123.58863833)
+ \xmulineto(115.06537069,119.27143842)
+(111.26283744,115.30330518)(111.32003744,107.93237201)
+ \xmulineto(111.36230411,101.72463881)
+(113.58617072,94.83917229)(120.6279039,87.11517247)
+ \xmulineto(228.1637682,110.40743862)
+(311.89843302,110.50583862)(420.59576396,87.27663913)
+--(420.60109729,87.27663913);}
+
+\def\xmumainpart{\fill[xmucolor]
+(619.15065115,982.09336173)
+ \xmulineto(618.69731782,982.04669506)
+(618.1879845,981.79736174)(617.70798451,981.41602841)
+ \xmulineto(617.18265119,980.96402842)
+(617.17198452,980.06269511)(617.62531785,978.79736181)
+ \xmulineto(618.10931784,975.17202857)
+(618.1039845,971.66669532)(617.62531785,968.29736207)
+ \xmulineto(617.52131785,965.45336214)
+(616.89598453,961.71336223)(615.67731789,957.12536234)
+ \xmulineto(611.49465132,941.1880294)
+(607.5466514,928.94269637)(603.91198482,920.29736325)
+ \xmulineto(600.82798488,911.81203013)
+(596.78665164,903.754697)(591.63598509,896.25469718)
+ \xmulineto(589.91731846,893.87469724)
+(588.96931848,891.5466973)(588.84398515,889.31203069)
+ \xmulineto(588.78665182,885.53069745)
+(589.12531848,882.77069751)(589.85998513,881.10403089)
+ \xmulineto(590.68798511,879.33336427)
+(591.79731842,879.03603094)(593.16131839,880.17203091)
+ \xmulineto(595.01598501,881.19736422)
+(596.68798498,883.19736417)(598.15598494,886.18269743)
+ \xmulineto(601.4893182,892.32269728)
+(604.24531814,898.93203045)(606.45331809,905.82269694)
+ \xmulineto(609.0519847,914.44803006)
+(611.68265131,922.96402985)(614.32265125,931.47336298)
+ \xmulineto(615.02131791,933.86002959)
+(615.69731789,936.22936286)(616.35465121,938.50002947)
+ \xmulineto(616.74531787,938.38536281)
+(617.13065119,938.27602948)(617.62531785,938.24536281)
+ \xmulineto(621.10931777,938.16136281)
+(626.55731765,937.40669616)(633.96398415,935.8746962)
+ \xmulineto(633.95331749,935.48402955)
+(634.20265082,934.72402956)(634.63998414,933.67202959)
+ \xmulineto(635.88531745,930.12002968)
+(637.83865074,929.35469636)(640.48398401,931.39069631)
+ \xmulineto(642.51598397,932.74936295)
+(643.86931727,934.41202957)(644.54665059,936.38002952)
+ \xmulineto(646.27065055,941.25069607)
+(648.13065051,946.33336261)(650.13065046,951.53602915)
+ \xmulineto(651.86931709,956.0826957)
+(654.09331704,959.60936228)(656.90665031,962.20269555)
+ \xmulineto(658.64531694,963.57869552)
+(659.09331693,965.20802881)(658.17198362,967.02669543)
+ \xmulineto(656.78131698,968.96402872)
+(654.83331703,971.13069533)(652.41598375,973.46402861)
+ \xmulineto(651.05198378,974.48936192)
+(649.56265048,974.82802857)(647.93198385,974.56269525)
+ \xmulineto(641.27598399,974.02669526)
+(634.37998414,974.08802859)(627.2759843,974.81736191)
+ \xmulineto(627.19731764,974.92136191)
+(627.06265097,975.13602857)(626.85465098,975.40669523)
+ \xmulineto(625.04131768,978.09869516)
+(622.8599844,980.23469511)(620.41598445,981.75469507)
+ \xmulineto(619.9893178,982.04136173)
+(619.60398447,982.14536173)(619.15065115,982.09336173)
+-- cycle
+(674.59864992,973.54669527)
+ \xmulineto(674.32798326,973.59869527)
+(674.04664994,973.57336194)(673.74931661,973.46402861)
+ \xmulineto(672.98398329,973.26536195)
+(672.7759833,972.43736197)(673.07331663,971.005362)
+ \xmulineto(673.67198328,967.32269543)
+(673.55198328,963.37469552)(672.73464997,959.06802896)
+ \xmulineto(671.33865,952.86936245)
+(669.5933167,946.65069594)(667.48398342,940.44802942)
+ \xmulineto(666.5626501,937.5160295)
+(666.25998344,934.41602957)(666.55731677,931.13602965)
+ \xmulineto(666.8026501,928.78669638)
+(667.29198342,927.22402975)(668.07865007,926.39602977)
+ \xmulineto(669.42665004,925.2920298)
+(670.63998335,926.03069645)(671.80264999,928.67736305)
+ \xmulineto(671.88531665,928.96936304)
+(671.99998332,929.16136304)(672.05731665,929.35469636)
+ \xmulineto(672.7079833,929.0680297)
+(673.59331661,928.83336304)(674.76531659,928.59336305)
+ \xmulineto(679.37464982,928.19336306)
+(686.53064966,926.74536309)(696.09864945,924.19336316)
+ \xmulineto(689.94264959,901.41203039)
+(684.15598305,882.38003086)(678.7453165,867.2186979)
+ \xmulineto(677.90664985,864.66136463)
+(676.96398321,862.91736467)(675.95331656,861.96936469)
+ \xmulineto(675.22931658,861.5733647)
+(673.98398327,861.9213647)(672.31198331,862.90136467)
+ \xmulineto(669.89598336,864.22936464)
+(667.58398341,865.54136461)(665.1973168,866.96403124)
+ \xmulineto(663.39065017,868.20269787)
+(662.32798353,868.36936454)(662.1506502,867.39069789)
+ \xmulineto(666.16131678,860.86936472)
+(669.20265004,855.37469819)(671.20798333,850.88003163)
+ \xmulineto(671.84931665,848.53603169)
+(672.93198329,846.91203173)(674.42664993,846.05736509)
+ \xmulineto(675.27064991,845.41203177)
+(676.18798322,845.40669844)(677.21864987,846.14003175)
+ \xmulineto(678.87998316,847.21869839)
+(681.04131645,849.01069835)(683.65598306,851.55736495)
+ \xmulineto(685.63998301,853.86403156)
+(687.00531632,856.65069816)(687.71864964,859.85469808)
+ \xmulineto(692.44264953,880.89069756)
+(699.56264937,908.13603022)(709.0519825,941.71336273)
+ \xmulineto(710.63064913,947.55202925)
+(712.46398242,951.60402915)(714.55198238,953.90669576)
+ \xmulineto(716.31731567,955.35469572)
+(716.734649,956.89069568)(715.82264902,958.39069565)
+ \xmulineto(714.24531572,960.80669559)
+(711.82798244,963.31736219)(708.45864918,965.92669546)
+ \xmulineto(706.85464921,967.13069543)
+(705.16664925,967.60936209)(703.46398262,967.36402876)
+ \xmulineto(699.08264939,966.46402878)
+(695.63064946,966.03069546)(693.13598285,966.01069546)
+ \xmulineto(690.29198291,966.12002879)
+(686.21864967,966.51602878)(680.94798312,967.1973621)
+ \xmulineto(679.37998315,969.63069537)
+(677.49998319,971.57869532)(675.35998324,973.12536195)
+ \xmulineto(675.10931658,973.35469528)
+(674.86398325,973.49469527)(674.59864992,973.54669527)
+-- cycle
+(629.13998426,970.58402868)
+ \xmulineto(632.92131751,970.41202868)
+(636.15598411,970.20269536)(638.78665071,970.07336202)
+ \xmulineto(642.5733173,969.90669536)
+(644.96931724,969.26002871)(646.06798389,968.13069541)
+ \xmulineto(646.74931721,967.29736209)
+(646.65065054,965.53069547)(645.72931723,962.70802887)
+ \xmulineto(642.99998395,954.72402907)
+(640.39598401,947.37469592)(637.85998407,940.78669608)
+ \xmulineto(637.51065074,939.86002944)
+(637.07865075,939.13069612)(636.50531743,938.58402947)
+ \xmulineto(636.03065078,939.43202945)
+(635.18798413,940.45336276)(633.96398415,941.63069606)
+ \xmulineto(632.73998418,942.6933627)
+(630.68798423,943.21869602)(627.78665096,943.24002935)
+ \xmulineto(624.29198437,943.21869602)
+(620.92131777,943.17202936)(617.79731784,943.15602936)
+ \xmulineto(618.89065115,946.95869593)
+(620.03598446,950.36936251)(621.1826511,953.22936244)
+ \xmulineto(626.11998433,952.83869578)
+(630.4586509,952.3226958)(634.13598415,951.79202914)
+ \xmulineto(636.39065077,951.74936248)
+(637.15065075,952.41202913)(636.50531743,953.74002909)
+ \xmulineto(635.91198411,955.25469572)
+(634.49465081,956.47869569)(632.18798419,957.464029)
+ \xmulineto(630.11465091,958.16669565)
+(627.1199843,958.42136231)(623.13065106,958.22402898)
+ \xmulineto(623.02665106,958.15069565)
+(622.91731773,958.12536232)(622.7919844,958.05202899)
+ \xmulineto(624.91198435,964.04136217)
+(626.52131765,968.16669541)(627.69731763,970.50002868)
+ \xmulineto(628.11998428,970.47869535)
+(628.61998427,970.52136201)(629.13998426,970.58402868)
+-- cycle
+(364.2599901,964.1506955)
+ \xmulineto(362.45332347,963.97869551)
+(360.92132351,963.36002886)(359.6879902,962.36936222)
+ \xmulineto(357.71865691,960.74936226)
+(358.01599024,959.36936229)(360.53599018,958.14002899)
+ \xmulineto(364.82799009,956.06802904)
+(367.57865669,953.31202911)(368.74532333,949.92669586)
+ \xmulineto(372.82265658,938.30669614)
+(375.97865651,927.96402973)(378.14532313,918.94269662)
+ \xmulineto(368.90665666,913.74536342)
+(359.08799021,908.30669688)(348.68265711,902.52136369)
+ \xmulineto(346.54665716,901.38536372)
+(346.65599049,900.22936375)(349.02132377,899.13603044)
+ \xmulineto(350.93199039,898.44803046)
+(352.95865702,898.13603047)(355.03065697,898.20269713)
+ \xmulineto(357.40132358,898.59336379)
+(359.28665688,899.29203044)(360.70265685,900.31736375)
+ \xmulineto(366.29199006,904.55736364)
+(372.63065658,908.63603021)(379.58398976,912.51069678)
+ \xmulineto(379.77598976,911.63603013)
+(379.96398975,910.71869682)(380.08798975,909.71869685)
+ \xmulineto(382.20265637,899.60403043)
+(382.4999897,890.40669733)(381.02132306,882.12003086)
+ \xmulineto(380.26532308,876.10403101)
+(378.34932312,870.03603116)(375.18265653,863.91736465)
+ \xmulineto(372.43732325,857.91203146)
+(367.25999003,850.31203165)(359.6039902,841.06269854)
+ \xmulineto(358.4426569,839.90669857)
+(357.75465691,839.01069859)(357.65599025,838.43736527)
+ \xmulineto(357.30265692,837.5933653)
+(358.0826569,837.3853653)(360.02665686,837.84403196)
+ \xmulineto(361.51599016,838.35469861)
+(364.86399009,840.89069855)(369.93198998,845.38003177)
+ \xmulineto(373.56265656,848.51069836)
+(377.62532314,853.4893649)(382.11998971,860.2760314)
+ \xmulineto(385.46932297,865.54669794)
+(387.79732291,871.0266978)(389.14532288,876.86936433)
+ \xmulineto(390.73998952,883.50003083)
+(391.18798951,891.2706973)(390.41598952,900.15069708)
+ \xmulineto(390.1826562,901.76003038)
+(389.99998953,903.406697)(389.8226562,905.14536363)
+ \xmulineto(393.06798947,902.1453637)
+(399.91198931,896.58403051)(410.47865575,888.46936404)
+ \xmulineto(422.08798883,879.74003092)
+(431.93198861,873.26003108)(439.8546551,868.82803119)
+ \xmulineto(443.56798835,866.55736458)
+(446.71332162,865.80669793)(449.33865489,866.71336458)
+ \xmulineto(456.82798806,869.94269783)
+(463.93732124,872.88003109)(470.58398776,875.59869769)
+ \xmulineto(473.46398769,876.69336433)
+(474.817321,877.65069764)(474.56265434,878.39603096)
+ \xmulineto(474.35998767,879.29736427)
+(472.43198772,879.90136425)(468.80665446,880.33869757)
+ \xmulineto(464.15065456,880.73469756)
+(459.24532134,881.12536422)(454.07865479,881.44269755)
+ \xmulineto(447.92665492,881.63603088)
+(442.8693217,882.43203086)(438.92132179,883.81203082)
+ \xmulineto(433.61998857,885.45336411)
+(425.89065541,889.14536402)(415.7293223,894.90136388)
+
+ \xmulineto(404.32265588,901.16136373)
+(395.34932275,906.64003026)(388.80665623,911.32269681)
+ \xmulineto(388.5573229,913.22936343)
+(388.23465624,915.10936338)(387.87998958,917.08269667)
+ \xmulineto(396.44798939,921.72936322)
+(408.06798913,927.05202975)(422.67198881,932.91202961)
+ \xmulineto(424.91198876,933.68269626)
+(427.06798872,934.4733629)(429.10398867,935.28136288)
+ \xmulineto(431.13998863,936.09336286)
+(432.1879886,936.97869618)(432.32265527,938.07869615)
+ \xmulineto(432.28665527,939.43736278)
+(431.19732196,940.57336275)(429.02132201,941.37469607)
+ \xmulineto(425.20265542,942.38002938)
+(422.00532216,942.80269603)(419.45332222,942.6453627)
+ \xmulineto(417.28132226,942.54669604)
+(415.31198897,941.81736272)(413.44265568,940.53069609)
+ \xmulineto(406.91732249,936.29736286)
+(397.90665603,930.70802966)(386.52665628,923.8546965)
+ \xmulineto(385.4946563,927.69736307)
+(384.46932299,931.53602964)(383.39065635,935.28136288)
+ \xmulineto(382.38532303,938.51602947)
+(381.57865639,941.45869606)(380.93732307,944.17202933)
+ \xmulineto(379.5413231,948.52669589)
+(378.77598978,953.57869577)(378.73465645,959.24002896)
+ \xmulineto(378.86398978,960.65602892)
+(378.31198979,961.6200289)(376.95865649,962.20269555)
+ \xmulineto(374.30265655,963.28136219)
+(370.72932329,963.90669551)(366.20799006,964.1506955)
+ \xmulineto(365.54132341,964.1826955)
+(364.86399009,964.2026955)(364.2599901,964.1506955)
+-- cycle
+(681.45331644,962.12002889)
+ \xmulineto(682.16131642,962.02136222)
+(683.05198307,961.95336223)(684.07864972,961.94802889)
+ \xmulineto(689.3066496,961.46936224)
+(694.50531615,961.18269558)(699.7399827,961.01602892)
+ \xmulineto(701.94798266,960.80269559)
+(703.10398263,960.09336227)(703.29198263,958.9013623)
+ \xmulineto(703.48398262,956.36402903)
+(703.32798262,953.29202911)(702.70264931,949.6720292)
+ \xmulineto(700.90131601,942.34402938)
+(699.00531605,935.24536288)(697.11464943,928.33869639)
+ \xmulineto(696.66664944,928.89602971)
+(696.12531612,929.58402969)(695.50531613,930.36936301)
+ \xmulineto(694.27064949,931.76536297)
+(692.13064954,932.54669628)(688.98931627,932.74536295)
+ \xmulineto(683.3853164,933.01069627)
+(678.23998318,933.46936293)(673.58398328,934.18269624)
+ \xmulineto(673.84931661,935.45336288)
+(674.13064994,936.86002951)(674.34398326,938.32802948)
+ \xmulineto(675.00531658,940.62002942)
+(675.69331657,943.12002936)(676.45864988,945.78136262)
+ \xmulineto(676.55731655,945.74936263)
+(676.81198321,945.66136263)(677.30664987,945.52669596)
+ \xmulineto(683.1973164,944.54136266)
+(688.28664962,943.69336268)(692.5413162,943.07336269)
+ \xmulineto(694.74931615,942.85469603)
+(695.70264946,943.47336268)(695.25064947,944.84936265)
+ \xmulineto(694.66131615,946.36936261)
+(693.28131618,947.60402925)(691.10398289,948.65602922)
+ \xmulineto(689.08264961,949.53069587)
+(686.05198301,949.98936252)(682.04664976,950.01069585)
+ \xmulineto(680.4426498,949.84936252)
+(678.9733165,949.64536253)(677.55731653,949.42136253)
+ \xmulineto(678.91198316,954.09869575)
+(680.17731647,958.36402898)(681.45331644,962.12002889)
+-- cycle
+(870.56797894,836.57336532)
+ \xmulineto(869.73997896,836.63603199)
+(869.0413123,836.16136533)(868.45331232,835.13603202)
+ \xmulineto(867.23464568,831.75469877)
+(864.29197908,828.53069885)(859.56264585,825.48403226)
+ \xmulineto(840.73464626,813.92669921)
+(825.73997993,806.43736606)(814.61464684,803.05203282)
+-- (813.42664686,802.71336616)
+ \xmulineto(802.8066471,799.70269956)
+(789.85998072,797.80669961)(774.65598105,797.0413663)
+ \xmulineto(773.82264774,797.09869963)
+(773.07331442,797.0213663)(772.45331443,796.78669964)
+ \xmulineto(771.42131446,796.36003298)
+(771.33864779,795.71869966)(772.20264777,795.01069968)
+ \xmulineto(774.57864772,792.70803307)
+(782.83331421,792.01603309)(797.00531389,792.80669973)
+ \xmulineto(800.23464715,793.16669973)
+(803.68798041,793.60936638)(807.33331367,794.16136637)
+ \xmulineto(823.24531331,797.47869962)
+(839.56264629,804.10403279)(856.25997925,813.97336588)
+ \xmulineto(861.17197914,816.92669914)
+(866.55197903,819.55736574)(872.3439789,821.92669902)
+ \xmulineto(873.28664554,819.13069908)
+(876.8119788,814.59336586)(882.92664533,808.30269935)
+ \xmulineto(890.10931184,801.32803286)
+(897.42131168,794.08803304)(904.85464485,786.63069989)
+ \xmulineto(909.17197809,782.61469999)
+(911.85997803,780.48936671)(912.97864467,780.19336671)
+ \xmulineto(913.97331131,779.91736672)
+(914.63997797,780.15070005)(915.01064462,780.8693667)
+ \xmulineto(915.56264461,781.95336667)
+(915.39064462,783.59336663)(914.5053113,785.86403324)
+ \xmulineto(913.50531132,788.28136651)
+(909.36397808,792.31203308)(901.97331158,797.88536628)
+ \xmulineto(890.25064517,808.25469935)
+(881.20264537,817.22403247)(874.96931217,824.89069894)
+ \xmulineto(874.75464551,825.18269894)
+(874.48397885,825.4693656)(874.12531219,825.65603226)
+ \xmulineto(874.37997885,831.25069879)
+(873.53597887,834.7866987)(871.49997892,836.32269866)
+ \xmulineto(871.19731226,836.46403199)
+(870.84397893,836.55203199)(870.56797894,836.57336532)
+-- cycle
+(182.42666078,835.30269869)
+ \xmulineto(180.81732748,835.55736535)
+(177.54666088,834.21869871)(172.52132766,831.32803212)
+ \xmulineto(171.14532769,830.39069881)
+(170.21332771,829.36003217)(169.81199439,828.10936553)
+ \xmulineto(168.16666109,823.48403231)
+(166.09866114,818.41603244)(163.63599452,813.0413659)
+ \xmulineto(162.63066121,811.40136594)
+(162.86399454,810.60936596)(164.22399451,810.58403263)
+ \xmulineto(165.61999448,810.90669929)
+(167.03066112,811.59869927)(168.45866108,812.61469925)
+ \xmulineto(170.03066105,813.87469921)
+(170.99999436,815.33869918)(171.33866102,817.0213658)
+ \xmulineto(172.130661,819.10936575)
+(172.90666099,821.32803236)(173.7079943,823.62003231)
+ \xmulineto(173.9319943,824.19736563)
+(174.19332762,824.48403229)(174.46932762,824.55203228)
+ \xmulineto(175.4373276,825.01069894)
+(176.84399423,824.57336562)(178.70266086,823.19736565)
+ \xmulineto(180.29199416,821.77603235)
+(181.94799412,820.15603239)(183.60932742,818.4586991)
+ \xmulineto(182.68266077,818.30669911)
+(181.76532746,817.71869912)(180.81732748,816.76536581)
+ \xmulineto(179.51066084,815.34936584)
+(178.18266087,813.0213659)(176.92132756,809.56803265)
+ \xmulineto(176.43732757,807.64536604)
+(175.98399425,805.70803275)(175.4013276,803.8120328)
+ \xmulineto(174.82266094,802.67203282)
+(175.52666093,802.2866995)(177.59866088,802.79736615)
+ \xmulineto(178.16132754,802.93203282)
+(178.63999419,803.46403281)(179.20799418,804.40669945)
+ \xmulineto(181.81732746,808.89069934)
+(184.10399407,812.80269924)(185.98399403,816.08803249)
+ \xmulineto(187.74532733,814.20803254)
+(189.81199395,812.13069926)(192.07866056,809.90669931)
+ \xmulineto(191.36932725,809.53069932)
+(190.71866059,808.973366)(190.04666061,808.21336602)
+ \xmulineto(188.78666064,806.74003272)
+(187.63599399,804.30669945)(186.57332735,800.8493662)
+ \xmulineto(186.07332736,798.69736626)
+(185.62532737,796.65603297)(185.30266071,794.75469969)
+ \xmulineto(184.89066072,793.48403305)
+(185.57332737,793.26536639)(187.42132733,793.99469971)
+ \xmulineto(187.96399399,794.14003304)
+(188.57866064,794.77603302)(189.11466063,795.85469966)
+ \xmulineto(191.28666058,800.16136622)
+(193.09866054,803.90136613)(194.70266051,807.11469938)
+ \xmulineto(197.08266045,804.49469945)
+(199.77066039,801.74536618)(202.65599366,798.81736625)
+ \xmulineto(201.60399369,796.8853663)
+(200.68799371,794.80269969)(199.86399372,792.72403307)
+ \xmulineto(195.26532716,783.25069997)
+(189.63066062,770.94803361)(182.9319941,755.72936732)
+ \xmulineto(182.72932744,755.39603399)
+(182.60399411,755.07336733)(182.59332744,754.71336734)
+ \xmulineto(178.1719942,756.2453673)
+(174.18799429,757.63603394)(170.5733277,759.03070057)
+ \xmulineto(170.61999437,759.09870057)
+(170.6613277,759.19736723)(170.6613277,759.19736723)
+ \xmulineto(172.46399433,763.48936713)
+(174.02666096,767.33336703)(175.4013276,770.71336695)
+ \xmulineto(176.03066092,772.5413669)
+(175.66132759,773.38003355)(174.30266096,773.25070022)
+ \xmulineto(172.92666099,772.92136689)
+(171.50532768,771.95870025)(170.06799438,770.37470029)
+ \xmulineto(168.99466107,768.81736699)
+(168.09866109,766.28136706)(167.35999444,762.75470048)
+ \xmulineto(167.21332778,761.79203383)
+(167.21866111,760.93736719)(167.27599444,760.30270054)
+ \xmulineto(165.46399448,760.95336719)
+(163.84399452,761.64003384)(162.44799455,762.24536716)
+ \xmulineto(161.17199458,762.66670048)
+(160.12532793,763.09336714)(159.14532796,763.60403379)
+ \xmulineto(160.73466125,768.70803366)
+(162.15599456,773.05736689)(163.46399453,776.72403347)
+ \xmulineto(164.04666118,778.46403342)
+(163.72932785,779.27070007)(162.44799455,779.09336674)
+ \xmulineto(161.10932791,778.86003341)
+(159.84932794,777.89603344)(158.63999463,776.30270014)
+ \xmulineto(157.55199466,774.71870018)
+(156.80666134,772.36003357)(156.35466135,769.10403365)
+ \xmulineto(156.19332802,767.70803369)
+(156.03066136,766.30270039)(155.93199469,764.95870042)
+ \xmulineto(154.25999473,765.8547004)
+(153.12532809,766.45336705)(152.45866144,766.73470038)
+ \xmulineto(151.45866146,767.34936703)
+(150.50532815,767.59870036)(149.74932816,767.49470036)
+ \xmulineto(149.7026615,769.7347003)
+(149.6826615,771.69336692)(149.58399483,773.25070022)
+ \xmulineto(149.4946615,774.82803351)
+(149.44799484,776.41203347)(149.41199484,778.0787001)
+ \xmulineto(148.96932818,779.84936672)
+(148.83866152,781.70803334)(149.07332818,783.66669996)
+ \xmulineto(149.32266151,785.39603325)
+(148.65599485,786.31736656)(147.04132822,786.37469989)
+ \xmulineto(145.43199492,786.18803323)
+(143.65066163,785.44803325)(141.70799501,784.17203328)
+ \xmulineto(139.85999505,783.05736664)
+(138.79199507,782.06803333)(138.57866174,781.12536669)
+
+ \xmulineto(138.14532842,780.21870005)
+(138.45332841,779.71336672)(139.50532839,779.5160334)
+ \xmulineto(140.78132836,779.10403341)
+(141.859995,777.97336677)(142.63999499,776.21336681)
+ \xmulineto(143.65599496,774.78670018)
+(144.46399495,773.28670022)(145.17732826,771.55736693)
+ \xmulineto(145.74532825,770.0467003)
+(146.3639949,768.48403367)(147.04132822,766.90136704)
+ \xmulineto(144.78666161,765.7027004)
+(142.96399498,764.14003378)(141.45332835,762.24536716)
+ \xmulineto(140.5106617,761.29736718)
+(140.18799504,760.32803387)(140.43732837,759.36936723)
+ \xmulineto(140.6666617,758.42136725)
+(141.47866168,757.9587006)(142.97866165,758.09870059)
+ \xmulineto(146.7599949,758.36936725)
+(150.56799481,758.25070059)(154.40666139,757.67736727)
+ \xmulineto(157.91732798,756.91736729)
+(166.53599446,754.23470069)(180.22399416,749.63603413)
+ \xmulineto(178.32266087,745.76003423)
+(176.45332757,742.02670099)(174.63999428,738.45870108)
+ \xmulineto(174.42666095,738.10936775)
+(174.39599429,737.81203443)(174.46932762,737.5267011)
+ \xmulineto(174.32799429,737.4947011)
+(174.13599429,737.54136777)(173.87466096,737.69736776)
+ \xmulineto(171.48399435,737.99470109)
+(169.61466106,737.87470109)(168.29199442,737.27603444)
+ \xmulineto(166.37466113,736.58803446)
+(166.41599446,735.54136782)(168.37466109,734.14003452)
+ \xmulineto(168.93199441,733.92136786)
+(169.55732773,733.54136786)(170.23466104,733.12536787)
+ \xmulineto(171.80266101,732.0573679)
+(172.91199432,730.8280346)(173.53599431,729.40136797)
+ \xmulineto(174.75466095,726.7760347)
+(175.83332759,723.68803477)(176.8386609,720.17203486)
+ \xmulineto(177.22932756,718.88536823)
+(178.40666086,717.82803492)(180.31199416,717.12536827)
+ \xmulineto(182.81732743,716.07870163)
+(184.89066072,715.60403497)(186.66132735,715.60403497)
+ \xmulineto(189.46399395,715.39070165)
+(190.27599394,716.78136828)(189.03066063,719.74936821)
+ \xmulineto(187.93732732,722.18803481)
+(186.19732736,724.69336808)(183.78132741,727.45336802)
+ \xmulineto(180.87999414,730.74936793)
+(178.65599419,733.56803453)(177.17732756,735.74936781)
+ \xmulineto(180.50532748,736.98403445)
+(182.72932744,739.16670106)(183.78132741,742.27070098)
+ \xmulineto(186.03599403,749.99470079)
+(188.7293273,757.6307006)(191.82266057,765.20803375)
+ \xmulineto(195.44266049,773.66136687)
+(200.45332705,784.37469994)(206.72399357,797.38003296)
+ \xmulineto(210.53599349,805.35469943)
+(213.1826601,810.16669931)(214.76532673,811.77069927)
+ \xmulineto(216.35466003,812.66136591)
+(217.44799334,812.89603257)(217.97865999,812.44803258)
+ \xmulineto(218.38532665,812.32269925)
+(218.87999331,811.65069927)(219.58799329,810.50003263)
+ \xmulineto(221.09865992,808.17203269)
+(222.69732655,805.86003275)(224.24532652,803.39069947)
+ \xmulineto(224.99999317,802.12536617)
+(225.63999316,801.64536618)(226.27599314,801.94803284)
+ \xmulineto(226.98399313,802.32803283)
+(227.33865979,803.44269947)(227.37465978,805.42136609)
+ \xmulineto(227.53599311,811.6400326)
+(228.3959931,816.86403247)(229.9173264,821.08269904)
+ \xmulineto(231.01599304,824.60936562)
+(231.25999303,826.58403223)(230.51065972,826.92136556)
+ \xmulineto(229.60399307,827.36003222)
+(224.93199317,826.01069892)(216.54132669,822.94269899)
+ \xmulineto(214.18266008,822.16669901)
+(212.41599345,820.70269905)(211.29199347,818.4586991)
+ \xmulineto(209.43199351,814.67736586)
+(207.63066022,810.63603263)(205.87466026,806.43736606)
+ \xmulineto(194.51599384,817.70269912)
+(187.379994,826.48936557)(184.45866073,832.84936541)
+ \xmulineto(184.20799407,834.16136538)
+(183.51066075,834.96936536)(182.42666078,835.30269869)
+-- cycle
+(865.99464571,812.53069925)
+ \xmulineto(865.66664571,812.36936592)
+(865.44264572,811.83336593)(865.31731239,811.01069929)
+ \xmulineto(865.17197906,807.8600327)
+(866.53597903,805.22403276)(869.37997896,803.05203282)
+ \xmulineto(871.38531225,801.71336618)
+(873.50531221,799.93736623)(875.64531216,797.80269961)
+ \xmulineto(874.06264553,796.29203298)
+(870.46397894,794.80669969)(864.97864573,793.22936639)
+ \xmulineto(863.40131243,795.21869968)
+(861.85997913,797.00003296)(860.23997917,798.73469959)
+ \xmulineto(860.27064583,800.21869955)
+(859.96397917,801.67203285)(859.39597918,803.05203282)
+ \xmulineto(859.08797919,803.61469947)
+(858.60931253,803.92669946)(857.95331255,803.89603279)
+ \xmulineto(857.60931256,803.75469946)
+(857.2186459,803.26536614)(856.85464591,802.54136616)
+ \xmulineto(852.49997934,795.94269966)
+(845.95864615,790.90669978)(837.13064634,787.30669987)
+ \xmulineto(835.42131305,786.71869989)
+(834.12531307,785.89603324)(833.32264643,784.8493666)
+ \xmulineto(831.94797979,783.04669998)
+(831.20264647,781.50536668)(831.03597981,780.36403338)
+ \xmulineto(830.68264648,779.3120334)
+(831.06264648,778.79736675)(832.21864645,778.75470008)
+ \xmulineto(832.72931311,778.67736675)
+(833.39064642,778.80670008)(834.08264641,779.09336674)
+ \xmulineto(834.48931307,777.93203344)
+(835.15597972,776.70803347)(836.19731303,775.45336683)
+ \xmulineto(830.44264649,771.19736694)
+(819.99998005,770.69336695)(804.87464705,773.9267002)
+ \xmulineto(804.63998039,774.09336686)
+(804.3599804,774.19736686)(804.03064707,774.18270019)
+ \xmulineto(799.6359805,775.09870017)
+(792.75464732,777.32803345)(783.37464753,780.8693667)
+ \xmulineto(782.70798087,781.16670002)
+(782.48398088,780.93736669)(782.69731421,780.19336671)
+ \xmulineto(786.14531413,775.53070016)
+(794.88531394,771.46936693)(808.94264696,768.00536701)
+ \xmulineto(809.28664696,768.14536701)
+(809.70798028,768.08803368)(810.1253136,767.83336702)
+ \xmulineto(813.97864685,767.19336703)
+(819.03064674,766.47870038)(825.27597994,765.8027004)
+ \xmulineto(825.08797994,764.53603377)
+(824.52131329,758.70803391)(823.67197997,748.2813675)
+ \xmulineto(812.64531355,749.93203413)
+(802.58798044,754.18803402)(793.44798064,761.06270052)
+ \xmulineto(792.89064732,761.66136717)
+(792.45864733,761.8387005)(792.093314,761.56803384)
+ \xmulineto(791.80264734,761.35470051)
+(791.78131401,760.91736719)(792.01064734,760.30270054)
+ \xmulineto(797.70264721,750.31736745)
+(808.14531365,744.16670094)(823.33331331,741.76003433)
+ \xmulineto(822.29198,724.43203476)
+(822.46398,714.29736834)(823.83864663,711.36936841)
+ \xmulineto(826.40131324,706.83870186)
+(831.54664646,701.58403532)(839.33331296,695.6253688)
+ \xmulineto(840.59331293,694.52670216)
+(841.35464625,694.04136884)(841.70264624,694.18270217)
+ \xmulineto(842.26531289,694.48936883)
+(842.30264623,695.33336881)(841.78664624,696.64003544)
+ \xmulineto(839.82797962,701.72403532)
+(837.76531299,707.11470185)(835.52131304,712.89603504)
+ \xmulineto(832.95864643,719.55736821)
+(831.24531314,725.74936806)(830.35997982,731.51603458)
+ \xmulineto(829.8546465,734.6360345)
+(829.37997985,737.81203443)(829.00531319,740.91203435)
+ \xmulineto(832.53597978,740.70803435)
+(836.60931302,740.51070103)(841.19331292,740.40670103)
+ \xmulineto(843.91197953,740.3853677)
+(846.44797947,739.86403438)(848.81197942,738.79736773)
+ \xmulineto(849.91197939,737.92136776)
+(850.82264604,737.74003443)(851.60397936,738.20270108)
+ \xmulineto(852.530646,738.7760344)
+(852.99464599,740.41203436)(852.95864599,743.19736763)
+ \xmulineto(853.16664599,746.72936754)
+(852.91197933,748.97336748)(852.28131267,749.97336746)
+ \xmulineto(851.74531269,750.70270077)
+(851.03597937,751.38536742)(850.08264606,751.91736741)
+ \xmulineto(849.14531274,752.57870073)
+(844.63064618,756.5213673)(836.45331302,763.77070045)
+ \xmulineto(836.13064636,764.20803377)
+(835.82264637,764.57870043)(835.60397971,764.86936709)
+ \xmulineto(837.08264634,763.93736711)
+(838.25997965,764.89070042)(839.0786463,767.74936702)
+ \xmulineto(839.63597962,770.19336696)
+(839.55197962,771.86936692)(838.9066463,772.7453669)
+ \xmulineto(845.61997949,766.10403373)
+(851.42131269,759.96936721)(856.34397925,754.37470068)
+ \xmulineto(856.32797925,754.25070069)
+(856.28664592,754.00536736)(856.17731259,753.69736737)
+ \xmulineto(854.96931261,751.67736742)
+(854.62531262,750.42670078)(855.07864595,749.97336746)
+ \xmulineto(855.72397926,749.09870081)
+(857.3386459,748.91736749)(859.98397917,749.29736748)
+ \xmulineto(862.06797913,749.36936747)
+(863.72397909,749.86003413)(864.97864573,750.90136744)
+ \xmulineto(873.51064554,758.56270058)
+(879.81197873,762.34936715)(883.94264531,762.24536716)
+ \xmulineto(885.42664528,762.21870049)
+(886.38531192,762.72403381)(886.73464525,763.77070045)
+ \xmulineto(886.98931191,766.77603371)
+(886.68264525,770.35470029)(885.80664527,774.43736686)
+ \xmulineto(885.54131194,775.70803349)
+(884.56797863,776.92670013)(882.92664533,778.0787001)
+ \xmulineto(879.06797875,780.40670004)
+(875.04664551,783.5520333)(870.9066456,787.47336653)
+ \xmulineto(869.97331228,788.58403317)
+(868.97864564,789.51603315)(867.859979,790.26536646)
+ \xmulineto(868.20264566,790.41203313)
+(868.60931231,790.39603313)(869.0413123,790.26536646)
+ \xmulineto(870.25464561,790.1506998)
+(871.67731225,790.09336647)(873.35997888,790.0986998)
+ \xmulineto(874.01597886,790.1306998)
+(874.87464551,790.05203314)(875.81731216,789.84403314)
+ \xmulineto(877.11997879,789.45336648)
+(877.81197878,789.74936648)(878.01597877,790.69336645)
+ \xmulineto(878.4213121,791.66669976)
+(878.72397876,793.04669973)(878.86397875,794.83869968)
+ \xmulineto(882.02131202,793.0053664)
+(888.47331188,785.9946999)(898.25064499,773.84403354)
+ \xmulineto(900.67197827,770.56803362)
+(902.31731157,768.98403366)(903.24531155,769.10403365)
+ \xmulineto(904.1879782,769.35470031)
+(904.70797818,770.25470029)(904.68264485,771.81203359)
+ \xmulineto(904.49997819,777.08803346)
+(902.06797824,781.28136669)(897.48931168,784.42669994)
+
+ \xmulineto(894.35464508,787.2920332)
+(890.34931183,790.84403312)(885.46931194,795.01069968)
+ \xmulineto(879.88531207,800.12003289)
+(873.86397886,805.71869942)(867.34931234,811.93736593)
+ \xmulineto(866.81197902,812.44269925)
+(866.32797903,812.69336591)(865.99464571,812.53069925)
+-- cycle
+(159.48399462,811.01069929)
+ \xmulineto(158.75999463,811.01603262)
+(157.82266132,810.97336595)(156.69332801,810.83869929)
+ \xmulineto(154.80266138,810.22936597)
+(153.45332808,809.47869932)(152.63066143,808.72403268)
+ \xmulineto(151.91732812,807.74936603)
+(152.20266144,807.07336605)(153.55732808,806.60403273)
+ \xmulineto(154.72932805,806.2186994)
+(155.59866137,805.56269942)(156.09866136,804.66136611)
+ \xmulineto(157.65599466,801.86003284)
+(158.94799463,798.94803292)(159.99466127,795.85469966)
+ \xmulineto(159.76532794,795.66669966)
+(159.44799462,795.42136634)(159.06266129,795.17736634)
+ \xmulineto(155.71332803,792.18803308)
+(153.21332809,789.87469981)(151.52666146,788.23469985)
+ \xmulineto(151.1199948,787.76536653)
+(151.14532813,787.35469987)(151.69732812,787.13603321)
+ \xmulineto(152.34399477,786.86403321)
+(153.03599476,786.91736655)(153.72932808,787.30669987)
+ \xmulineto(156.08799469,788.68269984)
+(158.65599463,790.07336647)(161.34932791,791.45336643)
+ \xmulineto(162.07866122,789.15069983)
+(162.68266121,786.60936655)(163.20799453,783.83336662)
+ \xmulineto(163.2026612,783.03069998)
+(163.29732786,782.50536666)(163.54666119,782.14003333)
+ \xmulineto(163.92666118,781.43736668)
+(164.35466117,781.46403335)(164.81732783,782.22403333)
+ \xmulineto(165.17732782,782.81736665)
+(165.41599448,784.10403328)(165.41199448,786.2026999)
+ \xmulineto(165.45866115,788.05736652)
+(165.33332782,790.37469979)(165.07332783,793.22936639)
+ \xmulineto(167.07866111,794.2186997)
+(169.3799944,795.30669967)(171.92666101,796.44803298)
+ \xmulineto(173.05732765,796.92669963)
+(173.9119943,797.48403295)(174.55199428,798.14003294)
+ \xmulineto(174.76532761,798.48403293)
+(174.68799428,799.06803291)(174.30266096,799.74936623)
+ \xmulineto(173.92132763,800.45869955)
+(172.43199433,800.93203287)(169.89599439,801.18803286)
+ \xmulineto(168.56266108,801.31203286)
+(167.32266111,801.03069953)(166.25466113,800.42669955)
+ \xmulineto(165.59332781,800.11469955)
+(164.99999449,799.7600329)(164.47866117,799.24003291)
+ \xmulineto(164.07866118,800.89069954)
+(163.67732786,802.60936616)(163.29732786,804.48936611)
+ \xmulineto(162.69732788,806.34936607)
+(162.45866122,807.8600327)(162.53066121,808.97869934)
+ \xmulineto(162.41199455,809.89603265)
+(161.87466123,810.55203263)(161.01066125,810.83869929)
+ \xmulineto(160.68799459,810.97336595)
+(160.21332793,811.00536595)(159.48399462,811.01069929)
+-- cycle
+(253.9586592,804.91203277)
+ \xmulineto(253.49465921,804.8493661)
+(252.98399255,804.76536611)(252.43199257,804.57336611)
+ \xmulineto(248.99999264,803.16669948)
+(246.25465937,801.68269952)(244.22399275,800.25469955)
+ \xmulineto(242.54132612,798.82803292)
+(241.29732614,797.09869963)(240.49999283,795.01069968)
+ \xmulineto(237.43732623,786.93736655)
+(233.13065966,776.42670014)(227.63065978,763.51603379)
+ \xmulineto(227.22932645,763.64003379)
+(226.78132646,763.74936712)(226.27599314,763.85470045)
+ \xmulineto(224.61465985,764.02670045)
+(223.02132655,763.88536712)(221.45332658,763.43203379)
+ \xmulineto(221.18799325,767.21870037)
+(220.92132659,771.21336693)(220.68799327,775.45336683)
+ \xmulineto(220.31199327,779.99470005)
+(220.5933266,783.5880333)(221.45332658,786.12003323)
+ \xmulineto(221.91199324,788.05736652)
+(221.36932658,789.17203316)(219.84399328,789.50536648)
+ \xmulineto(218.30265998,790.0826998)
+(214.36932674,788.71869984)(207.98932688,785.36003325)
+ \xmulineto(206.20799358,784.35469994)
+(205.02666028,782.76536665)(204.52132696,780.62003337)
+ \xmulineto(202.97866032,774.40136686)
+(200.8119937,766.77070038)(197.99999377,757.59336727)
+ \xmulineto(197.32266045,755.104034)
+(195.31199383,751.52670075)(191.90666057,746.92670087)
+ \xmulineto(190.67732726,745.09336758)
+(191.09332725,744.03070094)(193.09332721,743.62536762)
+ \xmulineto(194.54132718,743.55203428)
+(196.17199381,743.92136761)(197.99999377,744.80670092)
+ \xmulineto(201.11466036,746.42136755)
+(202.71866033,749.09336748)(202.82799366,752.76536739)
+ \xmulineto(203.37999365,755.00536733)
+(205.08266028,762.02670049)(207.98932688,773.9267002)
+ \xmulineto(208.34932687,775.24536684)
+(209.11999352,776.23470014)(210.2759935,776.80670013)
+ \xmulineto(211.4893268,777.47336678)
+(212.53066011,777.16670012)(213.32266009,775.96403348)
+ \xmulineto(215.00532672,771.79736692)
+(216.87999335,767.2600337)(219.08265997,762.41603382)
+ \xmulineto(217.97332666,761.92136716)
+(216.84399335,761.26536718)(215.78132671,760.30270054)
+ \xmulineto(214.08799341,758.84403391)
+(213.33866009,757.53070061)(213.41199343,756.32270064)
+ \xmulineto(213.33866009,754.82803401)
+(214.19332674,754.36003402)(216.03066004,754.880034)
+ \xmulineto(218.53065998,755.93203398)
+(221.28665992,756.30670064)(224.24532652,756.15070064)
+ \xmulineto(217.64532667,742.27070098)
+(210.54666016,727.29736802)(202.91199366,711.11470175)
+ \xmulineto(201.85466035,709.18803513)
+(202.58799366,708.37470182)(205.03066028,708.74536848)
+ \xmulineto(207.09866023,709.2507018)
+(208.87466019,710.14003511)(210.35999349,711.45336841)
+ \xmulineto(212.09332679,712.96936837)
+(213.19332676,714.64536833)(213.66132675,716.36403496)
+ \xmulineto(216.85999335,726.8120347)
+(221.17732659,737.43736777)(226.6146598,748.2813675)
+ \xmulineto(227.49999312,750.31203412)
+(228.49465976,752.48403406)(229.6613264,754.79736734)
+ \xmulineto(233.68799298,753.15603405)
+(237.4479929,751.14536743)(240.92132615,748.78670082)
+ \xmulineto(244.6826594,746.16670089)
+(247.40665934,743.51070095)(248.96399264,740.91736768)
+ \xmulineto(250.42665928,738.49470108)
+(249.99999262,735.92670114)(247.77599267,733.20803454)
+ \xmulineto(245.80665938,730.76536793)
+(243.87999275,728.50003466)(241.85465947,726.35470138)
+ \xmulineto(240.96399282,725.48403473)
+(241.09865948,724.95870141)(242.35999279,724.91736808)
+ \xmulineto(243.15065944,724.88536808)
+(244.56799274,725.4267014)(246.59332603,726.43736804)
+ \xmulineto(251.59332592,728.30270133)
+(255.48932583,729.17203464)(258.35999244,729.06270131)
+ \xmulineto(260.40665906,728.98403464)
+(261.77599236,729.67203463)(262.33865901,731.17736792)
+ \xmulineto(262.926659,732.34936789)
+(262.72932567,734.80270117)(261.74532569,738.54136774)
+ \xmulineto(260.91199238,741.98403432)
+(258.97332575,745.18270091)(255.98932582,748.1933675)
+ \xmulineto(252.48399256,751.82803408)
+(247.73465934,755.26536733)(241.68265947,758.35470059)
+ \xmulineto(238.63065954,759.88003388)
+(235.86399293,761.04670052)(233.38532632,761.9947005)
+ \xmulineto(237.97865955,770.86403361)
+(243.98932609,781.11470002)(251.41599259,792.72403307)
+ \xmulineto(253.06799255,795.22403301)
+(254.56265919,797.62536628)(255.90665916,799.83336623)
+ \xmulineto(257.08265913,801.57336619)
+(257.41599246,802.91203282)(256.9213258,803.8120328)
+ \xmulineto(256.35999248,804.76536611)
+(255.3439925,805.10403276)(253.9586592,804.91203277)
+-- cycle
+(178.19332754,796.10936632)
+ \xmulineto(177.50532755,796.08803299)
+(176.6146609,796.02669966)(175.56799426,795.85469966)
+ \xmulineto(173.8599943,795.36936634)
+(172.67732766,794.63069969)(172.01599434,793.74003305)
+ \xmulineto(171.40666102,792.9373664)
+(171.71866101,792.29736641)(172.94799432,791.79203309)
+ \xmulineto(174.18799429,791.5160331)
+(175.06799427,790.91736645)(175.56799426,790.01603314)
+ \xmulineto(176.42666091,788.32803318)
+(177.31732756,786.52669989)(178.3639942,784.5933666)
+ \xmulineto(175.1453276,782.36403333)
+(172.78666099,780.47870004)(171.16666102,779.01070008)
+ \xmulineto(170.9013277,778.72403342)
+(170.94799436,778.40136676)(171.42132769,777.9947001)
+ \xmulineto(172.01066101,777.63603344)
+(172.67732766,777.65603344)(173.45332764,777.9947001)
+ \xmulineto(175.46399426,778.97870008)
+(177.65066088,779.92136672)(179.9733275,780.8693667)
+ \xmulineto(180.0053275,780.7293667)
+(180.10399416,780.5573667)(180.22399416,780.36403338)
+ \xmulineto(181.3746608,777.08803346)
+(182.36399411,773.41203355)(183.27066076,769.36003365)
+ \xmulineto(183.26532742,768.55203367)
+(183.40132742,767.96403368)(183.69732741,767.66670036)
+ \xmulineto(184.05199407,767.11470037)
+(184.4533274,767.21870037)(184.87999406,767.91736702)
+ \xmulineto(185.23999405,768.51070033)
+(185.39066071,769.7187003)(185.21866071,771.55736693)
+ \xmulineto(185.31199405,773.62536688)
+(185.05199405,776.09336681)(184.5413274,779.09336674)
+ \xmulineto(184.29199407,780.05203338)
+(184.10932741,781.21336669)(183.94799408,782.47869999)
+ \xmulineto(186.22399403,783.30669997)
+(188.68799397,784.26536661)(191.40132724,785.27069992)
+ \xmulineto(192.68266055,785.66136658)
+(193.63599386,786.2546999)(194.19332718,786.96936655)
+ \xmulineto(194.39066051,787.2920332)
+(194.31732718,787.74936653)(194.02666052,788.40669984)
+ \xmulineto(193.71866053,789.27603316)
+(192.32799389,789.84403314)(189.79199395,790.0986998)
+ \xmulineto(188.56799397,790.39603313)
+(187.31732733,790.29203313)(186.06799403,789.76003314)
+ \xmulineto(185.09332738,789.54669982)
+(184.00532741,788.86003317)(182.68266077,787.81203319)
+ \xmulineto(182.35466078,788.45869984)
+(182.13599412,789.16136649)(182.00532745,789.92669981)
+ \xmulineto(181.36399413,791.72936643)
+(181.07866081,793.24536639)(181.07332747,794.41603303)
+ \xmulineto(180.88532748,795.25069967)
+(180.40132749,795.73469966)(179.71866084,795.93736632)
+ \xmulineto(179.39599418,796.07336632)
+(178.87999419,796.13069965)(178.19332754,796.10936632)
+-- cycle
+(858.37997921,794.58403302)
+ \xmulineto(858.70264587,794.1506997)
+(859.11464586,793.68803305)(859.56264585,793.22936639)
+
+ \xmulineto(866.85997902,787.02136654)
+(872.95331222,781.41203335)(877.84931211,776.4693668)
+ \xmulineto(879.73997874,774.82803351)
+(880.36931205,773.37470021)(879.70797874,771.98403358)
+ \xmulineto(878.96931209,769.63070031)
+(872.84931222,764.86003376)(861.42664581,757.76003393)
+ \xmulineto(860.82797915,757.65603394)
+(860.18797917,757.41203394)(859.47864585,757.00003395)
+ \xmulineto(859.47864585,757.45336727)
+(859.39064585,757.94803393)(859.13997919,758.43736725)
+ \xmulineto(858.71331253,759.47336722)
+(851.33864603,766.74003371)(837.04664634,780.28136671)
+ \xmulineto(839.55197962,781.45870002)
+(841.75464624,782.77069998)(843.64531286,784.17203328)
+ \xmulineto(843.69731286,783.19336664)
+(845.08264617,781.14003336)(847.79731277,778.0787001)
+ \xmulineto(852.67731267,773.46403355)
+(856.98931257,769.24536698)(860.74931249,765.38003375)
+ \xmulineto(861.98931246,764.15603378)
+(862.80664578,764.01070045)(863.28664576,765.04136709)
+ \xmulineto(863.67731242,766.34403372)
+(863.44797909,767.86936702)(862.60931245,769.61470031)
+ \xmulineto(861.85997913,771.08270027)
+(856.06264592,776.29203348)(845.0879795,785.18803326)
+ \xmulineto(847.05197946,786.64003322)
+(849.05731275,788.16669985)(851.09864603,789.67736648)
+ \xmulineto(850.98397937,788.9173665)
+(851.91731268,787.07869988)(853.89064597,784.25469995)
+ \xmulineto(859.07864586,779.53070006)
+(863.62531242,775.34936683)(867.603979,771.64536692)
+ \xmulineto(868.84931231,770.42136695)
+(869.71864562,770.37470029)(870.14531228,771.47336693)
+ \xmulineto(870.53064561,772.77603356)
+(870.20797895,774.27070019)(869.2973123,775.96403348)
+ \xmulineto(868.48931232,777.05203346)
+(862.79197911,781.79736667)(852.19731268,790.1826998)
+ \xmulineto(852.14531268,790.2546998)
+(852.07331268,790.2506998)(851.94264601,790.26536646)
+ \xmulineto(855.00531261,792.53069974)
+(857.12531257,793.99469971)(858.37997921,794.58403302)
+-- cycle
+(828.15597987,765.54670041)
+ \xmulineto(829.25997985,765.57870041)
+(830.53064649,765.52136708)(832.05197979,765.29736708)
+ \xmulineto(831.93197979,764.08270044)
+(832.43197978,762.42136715)(833.48931309,760.3853672)
+ \xmulineto(834.92664639,758.29203392)
+(837.73464633,755.81203398)(841.9533129,752.84936739)
+ \xmulineto(843.27064621,751.68270075)
+(843.86397953,750.60403411)(843.7346462,749.7187008)
+ \xmulineto(843.65597953,749.21336748)
+(841.58397958,748.62003416)(837.469313,747.94270084)
+ \xmulineto(834.69331306,747.57870085)
+(831.69731313,747.55203419)(828.49464653,747.77070085)
+ \xmulineto(828.41597987,749.8547008)
+(828.3173132,751.95336741)(828.23997987,754.03603403)
+ \xmulineto(828.3853132,759.32270056)
+(828.37464653,763.1200338)(828.15597987,765.54670041)
+
+(892.79197845,264.8640461)
+-- (832.44264644,308.79204502)
+-- (843.56797953,324.13604464)
+-- (873.16131221,313.3960449)
+ \xmulineto(876.45331214,312.2507116)
+(879.79731207,310.98404496)(883.18264533,309.62537833)
+ \xmulineto(886.58397858,308.26004503)
+(890.14531184,306.76004507)(893.87997842,305.14004511)
+ \xmulineto(890.57331183,306.9213784)
+(887.32264523,308.81737835)(884.15597864,310.8333783)
+ \xmulineto(880.98931204,312.84937825)
+(877.42664545,315.31204486)(873.44264554,318.20804479)
+-- (851.07864603,334.48937772)
+-- (860.70264582,347.76537739)
+-- (921.05197782,303.83871181)
+-- (910.33331139,289.05204551)
+-- (878.68797876,300.09337857)
+ \xmulineto(875.3746455,301.23471187)
+(872.00531224,302.51071184)(868.58797898,303.91737847)
+ \xmulineto(865.19331239,305.31737844)
+(861.6826458,306.89071173)(858.06797921,308.62004502)
+ \xmulineto(862.86931244,305.74004509)
+(867.33864568,302.93204516)(871.49997892,300.22937856)
+ \xmulineto(875.64531216,297.5360453)
+(879.43731208,294.92671203)(882.86397867,292.43204542)
+-- (902.44797823,278.18271244)
+-- cycle
+(945.74531061,433.78137527)
+-- (948.64531055,450.25070819)
+-- (954.60397708,449.19737488)
+ \xmulineto(957.0826437,448.76004156)
+(958.99464365,448.87470823)(960.35997696,449.55737488)
+ \xmulineto(961.72397693,450.21870819)
+(962.57331024,451.47337483)(962.89064357,453.29204145)
+ \xmulineto(963.1879769,454.97870808)
+(962.87464357,456.41204137)(961.95331026,457.61470801)
+ \xmulineto(961.01064361,458.80670798)
+(959.67731031,459.56270796)(957.90131035,459.87470795)
+ \xmulineto(956.35997705,460.15070795)
+(954.72931042,459.94804129)(953.05731045,459.28137464)
+ \xmulineto(951.35997716,458.59870799)
+(949.57864386,457.44804135)(947.7346439,455.79737472)
+ \xmulineto(946.89064392,455.07870807)
+(945.67197728,453.9947081)(944.10931065,452.55204147)
+ \xmulineto(939.00531076,447.89604158)
+(935.20264418,444.72404166)(932.68797757,443.04670837)
+ \xmulineto(930.40664428,441.46937508)
+(927.88531101,440.42670843)(925.1146444,439.90670845)
+ \xmulineto(922.3439778,439.40670846)
+(919.43197786,439.41204179)(916.34397793,439.95870845)
+ \xmulineto(910.1973114,441.04670842)
+(905.7493115,443.78670835)(902.97331156,448.18270824)
+ \xmulineto(900.19731162,452.5733748)
+(899.42131163,458.17204133)(900.61997828,464.98937449)
+ \xmulineto(901.81731158,471.79204099)
+(904.27064486,476.61470754)(907.99997811,479.51070747)
+ \xmulineto(911.72397803,482.4067074)
+(916.70264459,483.29737404)(922.95864445,482.19337407)
+-- (928.99464432,481.1253741)
+-- (926.22397771,465.38004115)
+-- (921.16131116,466.2707078)
+ \xmulineto(918.80664454,466.68804112)
+(917.01597791,466.57870779)(915.74531127,465.93737447)
+ \xmulineto(914.49464464,465.28670782)
+(913.71331132,464.06804118)(913.40131133,462.27604123)
+ \xmulineto(913.139978,460.8173746)
+(913.42131133,459.5360413)(914.25464464,458.46937466)
+ \xmulineto(915.07864462,457.39604135)
+(916.31197793,456.71870803)(917.95331123,456.43204137)
+ \xmulineto(920.69731117,455.94804138)
+(925.70264439,458.82270798)(932.96397756,465.07337449)
+-- (933.44264422,465.44804115)
+-- (934.68797752,466.52137446)
+ \xmulineto(941.16664405,472.01070765)
+(945.68797728,475.17204091)(948.22931056,476.01604089)
+ \xmulineto(949.93731052,476.58804088)
+(951.75464381,476.91204087)(953.70264377,477.02670753)
+ \xmulineto(955.6453104,477.13070753)
+(957.66664368,476.9893742)(959.79197697,476.61470754)
+ \xmulineto(966.12531016,475.49470757)
+(970.7026434,472.67204097)(973.55197667,468.10404108)
+ \xmulineto(976.3959766,463.54137453)
+(977.19730992,457.71337467)(975.94797661,450.62537485)
+ \xmulineto(974.71330997,443.59337502)
+(971.97864337,438.56270848)(967.77597679,435.54670856)
+ \xmulineto(963.56797689,432.51604196)
+(958.05197701,431.60937532)(951.25064383,432.81204196)
+-- cycle
+(959.62531031,389.17737637)
+-- (888.6826452,412.27070913)
+-- (893.89597842,428.34404207)
+-- (964.83864353,405.2507093)
+-- cycle
+(910.1933114,337.56271097)
+-- (916.98397791,352.8387106)
+-- (922.51064446,350.36937732)
+ \xmulineto(924.81197774,349.34404402)
+(926.69731103,348.99471069)(928.18797767,349.32271068)
+ \xmulineto(929.66131097,349.63604401)
+(930.79197761,350.64537732)(931.54131093,352.33337728)
+ \xmulineto(932.23464424,353.90137724)
+(932.27597758,355.36404387)(931.67197759,356.7547105)
+ \xmulineto(931.04664427,358.1400438)
+(929.93731096,359.19737711)(928.297311,359.93204376)
+ \xmulineto(926.8599777,360.56804374)
+(925.2346444,360.7707104)(923.44264444,360.53071041)
+ \xmulineto(921.63597781,360.28137708)
+(919.62531119,359.5933771)(917.4319779,358.43737713)
+ \xmulineto(916.44797793,357.9480438)
+(915.01064462,357.18804382)(913.139978,356.16671052)
+ \xmulineto(907.0626448,352.88537726)
+(902.60931156,350.73471065)(899.75464496,349.71337734)
+ \xmulineto(897.16131168,348.7347107)
+(894.47331174,348.33871071)(891.65597847,348.50537737)
+ \xmulineto(888.84931187,348.68804403)
+(886.02131193,349.40137735)(883.15064533,350.67737732)
+ \xmulineto(877.45331212,353.22404392)
+(873.7973122,356.9587105)(872.16664557,361.89604371)
+ \xmulineto(870.53597894,366.83337692)
+(871.13064559,372.45871011)(873.94264553,378.77604329)
+ \xmulineto(876.74531213,385.08804313)
+(880.29731206,389.17204303)(884.60931196,391.07870965)
+ \xmulineto(888.92131187,392.98404294)
+(893.96931176,392.64004295)(899.77597829,390.05737634)
+-- (905.3693115,387.55737641)
+-- (898.87997831,372.94804343)
+-- (894.18797842,375.04137672)
+ \xmulineto(892.0053118,376.01604336)
+(890.23464517,376.34937668)(888.84931187,376.02671002)
+ \xmulineto(887.47864523,375.6973767)
+(886.42131192,374.70804339)(885.6879786,373.04137677)
+ \xmulineto(885.08264528,371.6933768)
+(885.05197862,370.3800435)(885.60397861,369.14537686)
+ \xmulineto(886.13597859,367.90671023)
+(887.17197857,366.94804358)(888.69331187,366.2760436)
+ \xmulineto(891.24531182,365.13604363)
+(896.79197836,366.71337692)(905.34397817,371.01604348)
+-- (905.90131149,371.26537681)
+-- (907.36931146,372.00537679)
+ \xmulineto(914.97864463,375.76004336)
+(920.13064451,377.73470998)(922.80264445,377.94270998)
+ \xmulineto(924.59864441,378.07870997)
+(926.44264437,377.94804331)(928.35997766,377.59337665)
+ \xmulineto(930.26531095,377.21871)
+(932.19731091,376.59337668)(934.1666442,375.7133767)
+ \xmulineto(940.03597741,373.09337676)
+(943.80264399,369.24004353)(945.46397729,364.12004365)
+ \xmulineto(947.11997725,359.01071044)
+(946.4893106,353.16137726)(943.56797733,346.57871075)
+ \xmulineto(940.67197739,340.05737758)
+(936.80264414,335.83871102)(931.99464425,333.9320444)
+ \xmulineto(927.18264436,332.01071111)
+(921.61464448,332.47337777)(915.30264462,335.2813777)
+-- cycle
+(851.91197935,217.18271395)
+-- (798.2506472,269.09337933)
+-- (824.47864662,296.30671199)
+-- (834.85464639,286.27071224)
+-- (820.34398004,271.21871261)
+-- (831.01597981,260.90671287)
+-- (843.81197953,274.18271254)
+-- (854.0519793,264.27604612)
+-- (841.25064625,250.99471311)
+-- (853.25464599,239.38004673)
+-- (868.20264566,254.88537968)
+-- (878.57864543,244.84937993)
+-- cycle
+(820.25064671,188.55204799)
+-- (770.33864781,244.08804662)
+-- (782.87998087,255.40137967)
+-- (832.79197977,199.86404771)
+-- cycle
+(744.33864839,201.95338099)
+-- (764.56798127,171.91738173)
+ \xmulineto(765.92131458,169.90138178)
+(767.23998122,168.67204848)(768.54131452,168.21871516)
+ \xmulineto(769.83331449,167.7760485)
+(771.20798113,168.05738183)(772.71864776,169.0733818)
+ \xmulineto(774.2133144,170.07871511)
+(774.97864771,171.25471508)(775.05198104,172.62004838)
+ \xmulineto(775.11464771,173.99471501)
+(774.46931439,175.67738164)(773.11464775,177.69338159)
+-- (752.8906482,207.73471418)
+ \xmulineto(751.53598156,209.7453808)
+(750.19731492,210.98404743)(748.89598162,211.43738075)
+ \xmulineto(747.58798165,211.88004741)
+(746.18264835,211.60938075)(744.67731505,210.59338078)
+ \xmulineto(743.21864841,209.60404747)
+(742.46398176,208.42138083)(742.39598176,207.0467142)
+ \xmulineto(742.3333151,205.67204756)
+(742.98398175,203.97338094)(744.33864839,201.95338099)
+-- cycle
+(731.723982,190.13604795)
+ \xmulineto(727.45864876,196.47871446)
+(725.7866488,202.29204765)(726.72398211,207.57871418)
+ \xmulineto(727.67198209,212.86938072)
+(731.19331534,217.57871394)(737.29198188,221.6933805)
+ \xmulineto(743.45331507,225.86404707)
+(749.13064828,227.39071369)(754.31731483,226.28138039)
+ \xmulineto(759.49998139,225.17204708)
+(764.25464795,221.41604718)(768.56264785,215.026714)
+-- (785.70798081,189.5573813)
+ \xmulineto(789.99464738,183.18804812)
+(791.69731401,177.36004826)(790.7919807,172.07338173)
+ \xmulineto(789.87998072,166.78671519)
+(786.35998079,162.08271531)(780.21331426,157.93204874)
+ \xmulineto(774.13998106,153.82804884)
+(768.46398119,152.33338221)(763.19331464,153.45871552)
+ \xmulineto(757.92131475,154.58804883)
+(753.13998153,158.3227154)(748.86931495,164.66671524)
+-- cycle
+(678.05731652,108.21364997)
+-- (649.49998381,177.25071493)
+-- (673.44798328,187.19738135)
+-- (685.66131635,166.61471519)
+ \xmulineto(687.18264965,164.02671526)
+(688.70798295,161.28138199)(690.25064958,158.36404873)
+ \xmulineto(691.77598288,155.4480488)
+(693.37998284,152.26004888)(695.04664947,148.80671563)
+ \xmulineto(693.63998284,152.9733822)
+(692.44798286,156.67204877)(691.43731622,159.88538203)
+ \xmulineto(690.43731624,163.12538195)
+(689.70264959,165.61471522)(689.2706496,167.38538184)
+-- (683.48398306,191.36404792)
+-- (707.31198254,201.26004767)
+-- (735.86931524,132.22924938)
+-- (720.91198224,126.01098286)
+-- (710.46398247,151.27071557)
+ \xmulineto(708.28131585,156.54671544)
+(706.0573159,162.00004864)(703.80664928,167.64538184)
+ \xmulineto(701.557316,173.2813817)
+(699.29198271,179.08804822)(696.98398276,185.03604807)
+ \xmulineto(698.54131606,178.67738156)
+(699.81731604,173.33871503)(700.84398268,169.03071514)
+ \xmulineto(701.87464932,164.72404857)
+(702.53598264,161.95338198)(702.8066493,160.71871534)
+-- (711.79198244,122.22404962)
+-- (702.01064932,118.16151639)
+-- (681.8639831,150.2027156)
+ \xmulineto(679.02131649,154.75471549)
+(676.51064988,158.88538205)(674.31198326,162.55738196)
+ \xmulineto(672.13598331,166.21338187)
+(670.06798336,169.72938178)(668.15065007,173.1093817)
+ \xmulineto(670.52131668,167.9480485)
+(672.84931663,162.69338196)(675.17198325,157.32804876)
+ \xmulineto(677.48398319,151.96938222)
+(679.93198314,146.1827157)(682.50531642,139.96404919)
+-- (693.06264952,114.44271648)
+-- cycle
+(604.6399848,92.43178369)
+-- (606.81731809,168.40138182)
+-- (629.20265093,171.89071506)
+-- (654.08265038,100.13605017)
+-- (636.33331744,97.36938357)
+-- (632.59865085,110.39071658)
+-- (621.0986511,108.59324996)
+-- (621.4946511,95.05738363)
+-- cycle
+(620.95331777,122.26511629)
+-- (628.9693176,123.51618293)
+-- (622.9119844,145.67738238)
+ \xmulineto(622.48931774,147.15604901)
+(622.07331775,148.74004897)(621.63998443,150.43738226)
+ \xmulineto(621.2026511,152.13071555)
+(620.56798445,154.70804882)(619.73465113,158.1507154)
+ \xmulineto(619.85998447,156.14004879)
+(619.95865113,154.04671551)(620.06265113,151.87471556)
+ \xmulineto(620.15065113,149.69738228)
+(620.22398446,147.47871567)(620.31198446,145.17738239)
+-- cycle
+(518.45865337,112.20271654)
+-- (535.12531967,111.32818323)
+-- (534.80665301,105.27605004)
+ \xmulineto(534.67198634,102.75471677)
+(535.026653,100.86405015)(535.85998632,99.59325018)
+ \xmulineto(536.68265297,98.31725021)
+(538.03065294,97.6255169)(539.86931956,97.5307169)
+ \xmulineto(541.57865286,97.4375169)
+(542.95331949,97.92658356)(544.03598614,98.9948502)
+ \xmulineto(545.10931945,100.07871684)
+(545.69331943,101.49485014)(545.78665276,103.29218342)
+ \xmulineto(545.86931943,104.85991672)
+(545.46931944,106.45365001)(544.60398612,108.04124997)
+ \xmulineto(543.72398614,109.64538327)
+(542.36931951,111.28124989)(540.50531955,112.91724985)
+ \xmulineto(539.69331957,113.6615165)
+(538.47331959,114.74018314)(536.84931963,116.11458311)
+ \xmulineto(531.61465308,120.62551633)
+(528.01065316,124.02138291)(526.03598653,126.32298286)
+ \xmulineto(524.19731991,128.39591614)
+(522.86931994,130.77084941)(522.00531996,133.46404935)
+
+ \xmulineto(521.17731997,136.15604928)
+(520.82265332,139.05738254)(520.98931998,142.19338246)
+ \xmulineto(521.31731997,148.43738231)
+(523.48931992,153.19738219)(527.51065317,156.49471544)
+ \xmulineto(531.51598641,159.78671536)
+(536.97331963,161.24538199)(543.86931947,160.88004867)
+ \xmulineto(550.75465266,160.52138201)
+(555.83865254,158.66671539)(559.16131914,155.31204881)
+ \xmulineto(562.4786524,151.95871556)
+(563.97331903,147.11471568)(563.6359857,140.7653825)
+-- (563.31731904,134.63071598)
+-- (547.37998606,135.46938263)
+-- (547.64531939,140.60404917)
+ \xmulineto(547.77065272,143.00004911)
+(547.44798606,144.7813824)(546.65065275,145.95338237)
+ \xmulineto(545.8599861,147.11471568)
+(544.55198613,147.74538233)(542.73998617,147.84404899)
+ \xmulineto(541.26531953,147.92138232)
+(540.03065289,147.484049)(539.07865291,146.52138236)
+ \xmulineto(538.1093196,145.57871571)
+(537.59331961,144.26538241)(537.49998628,142.60404912)
+ \xmulineto(537.35998628,139.80671586)
+(540.81731954,135.1880493)(547.89598605,128.72404946)
+-- (548.32265271,128.29738281)
+-- (549.54131935,127.1880495)
+ \xmulineto(555.76531921,121.41204964)
+(559.45331913,117.30684975)(560.59865244,114.88031647)
+ \xmulineto(561.36931909,113.25471651)
+(561.91198574,111.47871656)(562.26531907,109.56258327)
+ \xmulineto(562.60398573,107.64538332)
+(562.71331906,105.61458337)(562.60398573,103.45365009)
+ \xmulineto(562.26531907,97.02658358)
+(560.02131912,92.12551703)(555.84931921,88.73498378)
+ \xmulineto(551.67198597,85.3495172)
+(545.99998609,83.84431724)(538.81731959,84.21885056)
+ \xmulineto(531.70265308,84.59325055)
+(526.38531986,86.6932505)(522.89065327,90.51098374)
+ \xmulineto(519.37465335,94.32298365)
+(517.80265338,99.70271685)(518.16132004,106.60938334)
+-- cycle
+(450.59332153,91.86405037)
+-- (470.55198776,165.1773819)
+-- (493.11998726,163.27071528)
+-- (500.45332043,87.66151714)
+-- (482.55198749,89.16671711)
+-- (481.9839875,102.70271677)
+-- (470.38532109,103.68285008)
+-- (467.59332116,90.43178374)
+-- cycle
+(473.45865436,116.99484975)
+-- (481.53065418,116.3229831)
+-- (480.8546542,139.28671587)
+ \xmulineto(480.79198753,140.82271583)
+(480.7546542,142.46404912)(480.72932087,144.21338241)
+ \xmulineto(480.70798753,145.96404904)
+(480.69332087,148.62004897)(480.69732087,152.16138222)
+ \xmulineto(480.34398754,150.1827156)
+(479.95332088,148.12538232)(479.54665423,145.98404904)
+ \xmulineto(479.11465423,143.84938242)
+(478.66665424,141.67204914)(478.21332092,139.4160492)
+-- cycle
+(406.96398916,102.82298344)
+-- (419.42132222,161.80271531)
+-- (408.65065579,164.09338192)
+-- (411.63065572,178.21871491)
+-- (449.63998822,170.14538177)
+-- (446.65065495,156.01604879)
+-- (435.87998852,158.3067154)
+-- (423.42132213,99.32818352)
+-- cycle
+(356.08265695,121.12551632)
+-- (384.53065632,190.20804795)
+-- (400.13065598,183.75471477)
+-- (371.6826566,114.67191648)
+-- cycle
+(308.49999133,175.71871497)
+-- (322.65599102,166.86404852)
+-- (319.44799109,161.71871532)
+ \xmulineto(318.11465778,159.57871537)
+(317.5106578,157.76004875)(317.62532446,156.24004878)
+ \xmulineto(317.72399113,154.72404882)
+(318.56799111,153.46938219)(320.13599107,152.48938221)
+ \xmulineto(321.58399104,151.57871557)
+(323.02665768,151.33871557)(324.48399098,151.74538223)
+ \xmulineto(325.93732428,152.17204888)
+(327.13999092,153.12538219)(328.09332423,154.65604882)
+ \xmulineto(328.92665755,155.98404879)
+(329.3493242,157.57871542)(329.35999087,159.38004871)
+ \xmulineto(329.3693242,161.21338199)
+(328.96399088,163.30271528)(328.13065756,165.63604855)
+ \xmulineto(327.78132424,166.68271519)
+(327.23465758,168.21871516)(326.4786576,170.21338177)
+ \xmulineto(324.08265765,176.69738161)
+(322.57865769,181.41604816)(321.96399103,184.39071476)
+ \xmulineto(321.35999105,187.09338136)
+(321.34399105,189.82271462)(321.90132437,192.59338122)
+ \xmulineto(322.46932436,195.35471449)
+(323.567991,198.05738109)(325.23465763,200.72404769)
+ \xmulineto(328.53599089,206.02671422)
+(332.74532413,209.13071415)(337.84932402,210.06271412)
+ \xmulineto(342.94799057,210.9947141)
+(348.43199045,209.62004747)(354.28665699,205.95338089)
+ \xmulineto(360.13065686,202.29738098)
+(363.67732345,198.20271442)(364.96399008,193.65604786)
+ \xmulineto(366.25065672,189.11471464)
+(365.20265675,184.15071476)(361.83865682,178.76004823)
+-- (358.58799023,173.54671502)
+-- (345.05732386,182.02138148)
+-- (347.77599046,186.38538137)
+ \xmulineto(349.04132377,188.41604799)
+(349.61999042,190.13604795)(349.49465709,191.54671458)
+ \xmulineto(349.35999043,192.95338121)
+(348.53065711,194.13604785)(346.98932381,195.09871449)
+ \xmulineto(345.73465718,195.88004781)
+(344.4426572,196.1040478)(343.13999057,195.72404781)
+ \xmulineto(341.84399059,195.36938115)
+(340.75999062,194.47338117)(339.86932397,193.05738121)
+ \xmulineto(338.39599067,190.68804793)
+(339.18265732,184.96938141)(342.24532392,175.87471497)
+-- (342.41199058,175.29204831)
+-- (342.9373239,173.73471502)
+ \xmulineto(345.59332385,165.65604855)
+(346.82799048,160.27604868)(346.66132382,157.59338208)
+ \xmulineto(346.54665716,155.79738213)
+(346.16132383,153.98404884)(345.54132385,152.13071555)
+ \xmulineto(344.90665719,150.29204893)
+(344.02132388,148.45871564)(342.87999057,146.63071569)
+ \xmulineto(339.47332398,141.16671582)
+(335.13599074,137.97338257)(329.84932419,137.03604926)
+ \xmulineto(324.56265764,136.10404928)
+(318.8639911,137.54138258)(312.7706579,141.35471582)
+ \xmulineto(306.7293247,145.14004906)
+(303.09865812,149.56271562)(301.88532481,154.59338216)
+ \xmulineto(300.64532484,159.6400487)
+(301.87999148,165.10404857)(305.54132473,170.97338175)
+-- cycle
+(280.27065862,217.74004727)
+ \xmulineto(283.25465855,215.47338066)
+(285.55732517,214.29204735)(287.1879918,214.18804735)
+ \xmulineto(288.81199176,214.06804736)
+(290.37999173,214.942714)(291.89065836,216.81738062)
+-- (294.54132497,220.10404721)
+ \xmulineto(296.10932494,222.04138049)
+(296.69732492,223.78138045)(296.3279916,225.32271375)
+ \xmulineto(295.94799161,226.85471371)
+(294.41599164,228.71871366)(291.72932503,230.89604694)
+-- (291.23465838,231.3027136)
+-- cycle
+(239.27065952,193.58404786)
+-- (286.21865849,251.66137976)
+-- (304.98932474,236.4320468)
+ \xmulineto(309.83865797,232.49471357)
+(312.6666579,228.500047)(313.43199122,224.45871377)
+ \xmulineto(314.19732454,220.4120472)
+(312.91732457,216.33338063)(309.57332464,212.19738074)
+-- (309.10932465,211.63071408)
+-- (306.42665804,208.30671417)
+ \xmulineto(303.98399143,205.28671424)
+(301.50532482,203.34938095)(298.97332487,202.52138098)
+ \xmulineto(296.45865826,201.70804766)
+(293.53599166,201.82804766)(290.2346584,202.9067143)
+ \xmulineto(292.13599169,200.0880477)
+(292.93732501,197.36004777)(292.68265835,194.74004783)
+ \xmulineto(292.42132502,192.10938123)
+(291.01065838,189.2293813)(288.47865844,186.09871471)
+-- (277.62532534,172.67204838)
+ \xmulineto(276.36399204,171.11471508)
+(275.45332539,169.79204845)(274.91199207,168.69338181)
+ \xmulineto(274.35999208,167.59338184)
+(274.00532542,166.54138186)(273.87999209,165.50004856)
+-- (260.62532572,176.25471496)
+ \xmulineto(260.80265905,177.13604827)
+(261.20265904,178.13071491)(261.85999236,179.21338155)
+ \xmulineto(262.51065901,180.31204819)
+(263.58799232,181.80271482)(265.09332562,183.66138144)
+-- (274.13599209,194.8547145)
+ \xmulineto(276.69732536,198.02138109)
+(277.85465867,200.46938103)(277.61465868,202.19738098)
+ \xmulineto(277.39065868,203.94271427)
+(275.77599205,206.05204755)(272.82799212,208.52671416)
+-- (252.23999257,183.05738146)
+-- cycle
+(194.26532718,238.76538008)
+-- (248.35465932,290.20804548)
+-- (274.35999208,262.77071282)
+-- (263.89599231,252.8280464)
+-- (249.52132596,268.00004603)
+-- (238.7653262,257.77604628)
+-- (251.45332592,244.38537994)
+-- (241.13065948,234.56804685)
+-- (228.44265976,247.95871319)
+-- (216.33866003,236.4480468)
+-- (231.15599303,220.81204719)
+-- (220.6973266,210.86404744)
+-- cycle
+(158.91199463,287.11471222)
+-- (214.11466008,338.75471094)
+-- (224.06799319,323.99471131)
+-- (200.29732705,304.44804513)
+ \xmulineto(199.11466041,303.50004515)
+(196.69332713,301.59871186)(193.02666054,298.75471193)
+ \xmulineto(189.35999396,295.906712)
+(185.10932738,292.65071208)(180.27599416,288.96937884)
+ \xmulineto(185.7346607,292.04137876)
+(192.25066056,295.60404534)(199.79732706,299.66137858)
+ \xmulineto(201.09332703,300.34937856)
+(202.02666034,300.85471188)(202.61466033,301.17737854)
+-- (229.6933264,315.64004485)
+-- (239.43732619,301.17737854)
+-- (170.8493277,269.40671266)
+-- cycle
+(131.52652856,334.63604438)
+-- (198.57866042,367.4013769)
+-- (205.97332692,352.20271061)
+-- (138.92666173,319.44271142)
+-- cycle
+(104.53599583,402.45337604)
+-- (175.04132761,426.8640421)
+-- (181.22399414,408.93737588)
+-- (155.4839947,390.78137633)
+ \xmulineto(152.66666143,388.74004304)
+(149.71332816,386.71337643)(146.66132823,384.71337648)
+ \xmulineto(143.5933283,382.69737653)
+(140.32799504,380.63070991)(136.85999511,378.49470996)
+ \xmulineto(140.21866171,380.19737659)
+(143.63599496,381.77604322)(147.09332822,383.22404318)
+ \xmulineto(150.55199481,384.66670981)
+(154.61466139,386.18804311)(159.25999462,387.7973764)
+-- (185.39599404,396.84404284)
+-- (190.74532726,381.32804323)
+-- (120.24012881,356.92137716)
+-- (114.28119561,374.19737674)
+-- (141.43199501,393.86937625)
+ \xmulineto(144.26532828,395.93204287)
+(147.24532822,397.96404282)(150.34932815,399.96404277)
+ \xmulineto(153.43732808,401.95337605)
+(156.73999468,403.937376)(160.2239946,405.91204262)
+ \xmulineto(155.11999471,403.62004268)
+(150.25466149,401.56270939)(145.66666159,399.68804277)
+ \xmulineto(141.08799502,397.82804282)
+(136.78132845,396.20804286)(132.7811952,394.81737623)
+-- (109.90159571,386.89604309)
+-- cycle
+(165.88532781,465.76537448)
+-- (110.82812902,459.5680413)
+ \xmulineto(108.39066241,459.2920413)
+(106.67186245,458.70270798)(105.69732913,457.80270801)
+ \xmulineto(104.71879582,456.89604136)
+(104.32292916,455.56270806)(104.52132916,453.81737477)
+ \xmulineto(104.71359582,452.04137481)
+(105.41612914,450.80270818)(106.60412911,450.10937486)
+ \xmulineto(107.79212909,449.41204155)
+(109.58386238,449.20270822)(111.95306233,449.47337488)
+-- (167.01599445,455.67204139)
+-- (168.89599441,438.86937514)
+-- (116.59839556,432.97870862)
+ \xmulineto(108.9734624,432.12537531)
+(103.03066253,433.30270861)(98.78119595,436.5213752)
+ \xmulineto(94.53066271,439.74937512)
+(92.0051961,445.00004166)(91.18799612,452.31204147)
+ \xmulineto(90.38026281,459.5360413)
+(91.69732944,465.17737449)(95.15052937,469.27604106)
+ \xmulineto(98.59839596,473.36004095)
+(104.11452917,475.82270756)(111.70786234,476.68270754)
+-- (164.00532785,482.56270739)
+%盾牌
+(415.70265563,791.96403309)
+-- (330.45332418,717.80270159)
+ \xmulineto(354.11999032,715.06803499)
+(369.92665664,689.29736896)(369.98932331,667.01070284)
+-- (370.15598997,615.54137078)
+ \xmulineto(370.27065663,569.55737191)
+(371.91732326,488.10937392)(422.05198883,467.90137442)
+ \xmulineto(431.06798863,464.27070785)
+(477.52132094,453.36004145)(499.93198711,442.33870839)
+ \xmulineto(526.53598652,428.2813754)
+(529.42665313,416.90670902)(533.28131971,414.7400424)
+ \xmulineto(537.13998629,416.90670902)
+(539.94798623,428.2813754)(566.55198564,442.33870839)
+ \xmulineto(588.96398515,453.36004145)
+(635.41198412,464.27070785)(644.43198392,467.90137442)
+ \xmulineto(694.56798282,488.10937392)
+(696.21331611,569.55737191)(696.32264945,615.54137078)
+-- (696.49464944,667.01070284)
+ \xmulineto(696.55198277,689.29736896)
+(712.35998243,715.06803499)(736.02664857,717.80270159)
+-- (650.78131712,791.96403309)
+ \xmulineto(610.29198468,766.80670038)
+(582.98398528,755.21870066)(533.28131971,755.21870066)
+ \xmulineto(483.57865414,755.21870066)
+(456.19332141,766.80670038)(415.70265563,791.96403309)
+-- cycle
+(416.96932227,780.78670003)
+ \xmulineto(454.8959881,757.23470061)
+(486.74932073,747.26536753)(533.28131971,747.26536753)
+ \xmulineto(579.81731868,747.26536753)
+(611.58398465,757.23470061)(649.51065048,780.78670003)
+-- (719.5213156,721.27603483)
+ \xmulineto(717.92131564,721.54136816)
+(700.08264936,712.21870172)(691.66664955,686.3120357)
+ \xmulineto(688.28664962,675.88536929)
+(688.02664963,662.94803627)(688.19731629,649.9120366)
+ \xmulineto(688.35464962,637.66137023)
+(687.9173163,625.3120372)(688.02664963,614.86403746)
+ \xmulineto(687.36931631,572.06803852)
+(687.11998298,496.02670706)(641.13065066,475.6880409)
+ \xmulineto(632.63065085,472.27070765)
+(588.34398516,462.19737456)(567.22931896,451.81737482)
+ \xmulineto(541.73998619,439.28670846)
+(537.9693196,431.96937531)(533.28131971,428.95870872)
+
+ \xmulineto(528.59865314,431.96937531)
+(524.73998656,439.28670846)(499.25465379,451.81737482)
+ \xmulineto(478.13598759,462.19737456)
+(433.85465523,472.27070765)(425.34932209,475.6880409)
+ \xmulineto(379.35998977,496.02670706)
+(379.11465644,572.06803852)(378.45332312,614.86403746)
+ \xmulineto(378.56265645,625.3120372)
+(378.12532313,637.66137023)(378.28665646,649.9120366)
+ \xmulineto(378.45332312,662.94803627)
+(378.19732313,675.88536929)(374.81198987,686.3120357)
+ \xmulineto(366.40132339,712.21870172)
+(348.55732378,721.54136816)(346.96399048,721.27603483)
+%xmu 止于至善
+(434.93732188,370.32271017)
+ \xmulineto(434.01598856,370.24537683)
+(433.66665524,369.74537685)(433.90665523,368.8387102)
+ \xmulineto(433.98398856,367.91204356)
+(433.8853219,367.20804358)(433.61998857,366.71871025)
+ \xmulineto(433.48398857,366.54671026)
+(433.20265525,366.1360436)(432.78665526,365.47871029)
+ \xmulineto(431.36932195,363.95337699)
+(430.37465531,362.86004368)(429.80665532,362.19337703)
+ \xmulineto(429.10398867,361.35471039)
+(428.82798868,360.9427104)(428.98932201,360.9587104)
+ \xmulineto(429.15065534,360.81204373)
+(429.81732199,361.09871039)(430.99998863,361.82271038)
+ \xmulineto(431.43732195,362.1720437)
+(432.70265526,362.90671035)(434.78665521,364.01071032)
+ \xmulineto(436.12532185,364.74937697)
+(437.00532183,365.29737696)(437.44265515,365.64004361)
+ \xmulineto(437.73465515,365.82804361)
+(438.3333218,366.1040436)(439.23998845,366.49471026)
+ \xmulineto(440.43732175,367.06271025)
+(440.85998841,367.56804357)(440.50532175,368.00004356)
+ \xmulineto(438.66132179,369.55204352)
+(436.80665517,370.3280435)(434.93732188,370.32271017)
+-- cycle
+(508.55198692,374.04137674)
+ \xmulineto(508.38532026,374.03071007)
+(508.15598693,373.93737674)(507.84398693,373.75471008)
+ \xmulineto(503.5466537,372.07337679)
+(496.06798719,370.70804349)(485.41598743,369.66137685)
+ \xmulineto(482.52132083,369.34404352)
+(482.2919875,368.8387102)(484.77065411,368.16137689)
+ \xmulineto(487.38532072,367.81204356)
+(489.978654,367.87471023)(492.54665394,368.33337688)
+ \xmulineto(493.42665392,367.07871025)
+(493.18798726,365.19737696)(491.86932062,362.69737702)
+ \xmulineto(489.33332068,358.34937713)
+(486.56265407,355.6093772)(483.53598747,354.47337722)
+ \xmulineto(483.05732081,354.28137723)
+(482.74532082,354.10937723)(482.58798749,353.93737724)
+ \xmulineto(482.14532083,353.10404392)
+(482.04665417,351.95871062)(482.28132083,350.51604399)
+ \xmulineto(482.49465416,349.54671068)
+(482.92132082,349.07871069)(483.57865414,349.12004402)
+ \xmulineto(483.57865414,349.12004402)
+(484.29732079,349.32271068)(485.73465409,349.72404401)
+ \xmulineto(487.81198738,350.31737733)
+(495.24532055,352.41204394)(508.0306536,356.00004385)
+ \xmulineto(508.20798693,355.84937719)
+(508.36932026,355.69737719)(508.54665359,355.53604386)
+ \xmulineto(510.61465354,353.38004392)
+(512.03065351,352.47871061)(512.83332016,352.84404393)
+ \xmulineto(514.51598679,354.54671056)
+(514.32798679,356.7347105)(512.23998684,359.3853771)
+ \xmulineto(510.86398687,360.77604373)
+(508.53065359,361.95337704)(505.24532033,362.91204368)
+ \xmulineto(502.11465373,363.72404366)
+(501.14532042,363.51071033)(502.35998706,362.27071036)
+ \xmulineto(503.55732036,361.03604373)
+(505.02132033,359.41204377)(506.74532029,357.39071048)
+ \xmulineto(498.55198714,355.83337719)
+(492.11998728,354.67737722)(487.45865405,353.95337724)
+ \xmulineto(489.77598733,356.01604385)
+(492.86398726,359.17737711)(496.69732051,363.437377)
+ \xmulineto(496.99998717,363.77604366)
+(497.39065383,364.12004365)(497.85998715,364.46937698)
+ \xmulineto(500.21332044,365.89071027)
+(499.81732044,367.33337691)(496.66132051,368.7867102)
+ \xmulineto(503.58398703,369.80271018)
+(508.48398692,370.63071016)(511.37998686,371.25471014)
+ \xmulineto(512.97332015,371.6773768)
+(513.42665348,372.34404345)(512.72398683,373.28137676)
+ \xmulineto(512.04665351,373.89071008)
+(510.65598687,374.15071007)(508.55198692,374.04137674)
+-- cycle
+(579.06265203,374.78137672)
+ \xmulineto(578.24531872,374.67737672)
+(578.13598538,374.19337674)(578.7493187,373.34937676)
+ \xmulineto(579.51598535,372.48404345)
+(579.41598536,370.63071016)(578.45865204,367.76004356)
+ \xmulineto(575.8066521,357.51071048)
+(572.43198551,350.31737733)(568.32265227,346.14537743)
+ \xmulineto(566.93731897,344.59337747)
+(567.16665229,344.34404414)(569.00531892,345.38004411)
+ \xmulineto(573.89065215,348.86004403)
+(577.77598539,354.74004388)(580.63998533,363.02137701)
+ \xmulineto(581.69731864,361.51604372)
+(583.4733186,358.33337713)(585.98398521,353.50004391)
+ \xmulineto(587.17198519,351.4893773)
+(587.99465183,350.06271067)(588.44265182,349.22937735)
+ \xmulineto(588.95331848,346.77604408)
+(591.66665175,345.82271077)(596.55731831,346.37471076)
+ \xmulineto(597.0413183,346.34937742)
+(597.44265163,346.32804409)(597.77598495,346.30671076)
+ \xmulineto(599.39598492,346.38004409)
+(600.45865156,346.57337742)(600.96398488,346.87471074)
+ \xmulineto(601.4693182,347.16671074)
+(601.24531821,347.51071073)(600.28665156,347.88004405)
+ \xmulineto(592.5733184,352.50004394)
+(587.54131851,356.82804383)(585.1506519,360.84404373)
+ \xmulineto(583.4733186,362.86937702)
+(582.24531863,364.24004365)(581.47331864,364.93204363)
+ \xmulineto(582.0679853,367.16137691)
+(582.82265195,369.0787102)(583.7133186,370.65071016)
+ \xmulineto(583.91198526,371.12537681)
+(583.99998526,371.52671014)(584.01065192,371.84937679)
+ \xmulineto(583.42665193,372.8547101)
+(581.7759853,373.83337675)(579.06265203,374.78137672)
+-- cycle
+(641.53598399,343.54137749)
+ \xmulineto(642.97331729,343.2133775)
+(645.40665057,343.08804417)(648.83865049,343.18271084)
+ \xmulineto(651.11465044,343.08804417)
+(652.57865041,342.98937751)(653.21331706,342.91737751)
+ \xmulineto(655.15065035,342.68804418)
+(656.17198366,343.06271084)(656.281317,344.02671081)
+ \xmulineto(656.27065033,345.33871078)
+(655.38531702,346.1720441)(653.63065039,346.54137742)
+ \xmulineto(652.51065041,346.67204408)
+(650.46398379,346.58404408)(647.47865052,346.27604409)
+ \xmulineto(644.99998391,345.9120441)
+(643.09865062,345.72937744)(641.79198398,345.70804411)
+ \xmulineto(642.42665063,351.18271064)
+(643.13998395,355.17737721)(643.92131727,357.69737714)
+ \xmulineto(644.19331726,358.64537712)
+(644.45865059,359.51604377)(644.70265058,360.30271041)
+ \xmulineto(644.94265058,360.92137706)
+(645.08265058,361.39604372)(645.11998391,361.71337704)
+ \xmulineto(644.50531726,363.42671034)
+(642.19331731,364.66671031)(638.21331739,365.45871029)
+ \xmulineto(637.21331742,365.24004362)
+(637.10931742,364.34937698)(637.90665073,362.80271035)
+ \xmulineto(638.41198406,361.59337705)
+(638.70265072,360.58804374)(638.77598405,359.76004376)
+ \xmulineto(639.16665071,354.65604389)
+(637.9693174,342.96937751)(635.20265079,324.69737796)
+-- (625.942651,325.03604462)
+ \xmulineto(625.958651,326.50004458)
+(626.01598433,328.4587112)(626.12531766,330.89071114)
+ \xmulineto(626.37465099,337.22937765)
+(626.66665098,341.10937755)(626.98931764,342.53071085)
+ \xmulineto(627.06265097,343.1773775)
+(627.2399843,343.97337748)(627.5159843,344.92137746)
+ \xmulineto(627.75465096,345.54137744)
+(627.80665096,346.02671077)(627.68265096,346.36404409)
+ \xmulineto(626.54131765,347.80271072)
+(624.55198436,348.93204403)(621.71331776,349.74937734)
+ \xmulineto(620.58398445,349.88537734)
+(620.48931778,349.07871069)(621.43731776,347.33871073)
+ \xmulineto(622.10931775,346.11471076)
+(622.48931774,345.17204412)(622.57331774,344.51604414)
+ \xmulineto(622.9999844,341.19737755)
+(622.9119844,334.76537771)(622.29731774,325.21337795)
+ \xmulineto(618.51598449,325.00537795)
+(614.78131791,325.10937795)(611.08265133,325.54137794)
+ \xmulineto(609.12531804,325.59871127)
+(608.36931805,325.36937794)(608.80265138,324.82804462)
+ \xmulineto(609.69731802,324.22937797)
+(611.33865132,323.63071132)(613.7239846,323.03071133)
+ \xmulineto(621.41598443,323.28137799)
+(629.47865092,323.161378)(637.9013174,322.67737801)
+ \xmulineto(641.78131732,322.39071135)
+(645.64531723,321.94271136)(649.48931715,321.33337804)
+ \xmulineto(653.1826504,320.90671139)
+(656.70798365,320.32804473)(660.05731691,319.61471142)
+ \xmulineto(662.77598352,319.1453781)
+(663.90665016,319.74537808)(663.44265017,321.42671137)
+ \xmulineto(662.36398353,323.34404466)
+(660.55198357,324.53604463)(657.99465029,324.98937795)
+ \xmulineto(657.18265031,325.08271128)
+(654.81198369,325.03604462)(650.87465045,324.84404462)
+ \xmulineto(645.6559839,324.79204462)
+(641.65065065,324.76537796)(638.87465071,324.76537796)
+-- cycle
+(558.21865249,371.7453768)
+ \xmulineto(560.7973191,368.20804355)
+(563.03598572,366.21871027)(564.96931901,365.79204361)
+ \xmulineto(567.43198562,366.47871026)
+(567.75998561,368.00004356)(565.93198565,370.36937683)
+ \xmulineto(560.39598578,373.0827101)
+(557.82798583,373.55204342)(558.21865249,371.7453768)
+-- cycle
+(567.16131896,361.29737706)
+ \xmulineto(566.8386523,361.31737705)
+(565.69731899,361.12537706)(563.7239857,360.74004374)
+ \xmulineto(556.51065253,359.17737711)
+(549.81731934,358.47337712)(543.65598615,358.63604379)
+ \xmulineto(542.52665284,358.53071046)
+(542.41598617,358.13071047)(543.35998615,357.43737715)
+ \xmulineto(544.59331946,356.22937718)
+(545.93198609,355.43204387)(547.36398606,355.03604388)
+ \xmulineto(547.85465272,355.01071054)
+(550.72398599,355.66671053)(555.98398587,357.01604383)
+ \xmulineto(556.4533192,350.33337733)
+(551.75998597,342.79204418)(541.90131952,334.38537772)
+ \xmulineto(540.55731955,333.48404441)
+(540.53598621,333.16137775)(541.84931952,333.41604441)
+ \xmulineto(543.00531949,333.68271107)
+(544.3386528,334.34404439)(545.8439861,335.40137769)
+ \xmulineto(551.56798597,339.15604427)
+(555.54131922,343.82271082)(557.7706525,349.37471068)
+ \xmulineto(557.93731916,349.36404402)
+(558.25998582,349.27071069)(558.73465248,349.07871069)
+
+ \xmulineto(560.79198577,348.16671071)
+(561.90131908,347.53071073)(562.04131907,347.20804407)
+ \xmulineto(562.31198573,346.05737743)
+(561.77598575,343.73471082)(560.45865244,340.22937758)
+ \xmulineto(559.15065247,336.89071099)
+(558.07865249,335.0053777)(557.24531918,334.56271105)
+ \xmulineto(557.07865252,334.57337771)
+(556.36398586,334.76537771)(555.08798589,335.1613777)
+ \xmulineto(552.70798595,336.09871101)
+(551.8173193,336.22937767)(552.42665262,335.54137769)
+ \xmulineto(553.80265259,333.84937773)
+(554.67731924,332.10404444)(555.07331923,330.29204449)
+
+ \xmulineto(555.05198589,329.97337783)
+(555.12531923,329.80271117)(555.29198589,329.79737783)
+ \xmulineto(556.56265253,329.24004451)
+(558.04131916,329.73471117)(559.74931912,331.2653778)
+ \xmulineto(561.13065243,332.80671109)
+(562.29731907,335.10404437)(563.27065238,338.13604429)
+ \xmulineto(564.44265235,341.96937753)
+(565.56798566,344.74937746)(566.63598564,346.47871075)
+ \xmulineto(566.81198563,346.95871074)
+(566.91731897,347.27071073)(566.92131897,347.4373774)
+ \xmulineto(566.34931898,348.76537736)
+(565.34398567,349.79737734)(563.91731903,350.51604399)
+ \xmulineto(563.59331904,350.53071065)
+(563.19731905,350.63604398)(562.71865239,350.82271065)
+ \xmulineto(561.42665242,350.89071065)
+(560.21865245,351.03071064)(559.09865247,351.25471064)
+ \xmulineto(559.2759858,351.73471062)
+(559.63065246,352.28671061)(560.15065245,352.9067106)
+ \xmulineto(560.6773191,353.68271058)
+(560.87465243,354.24537723)(560.72398577,354.57871055)
+ \xmulineto(560.90665243,354.88537721)
+(559.81198579,355.75471053)(557.45865251,357.17737716)
+ \xmulineto(561.87465241,357.92137714)
+(565.62531899,358.29737713)(568.70798559,358.29737713)
+ \xmulineto(570.32265222,358.21337713)
+(570.99998554,358.65604379)(570.73465221,359.65071043)
+ \xmulineto(570.13065223,360.6507104)
+(568.94265225,361.20271039)(567.16131896,361.29737706)
+-- cycle
+(576.0786521,345.49471078)
+ \xmulineto(576.22398543,345.33337745)
+(576.45331876,344.98937746)(576.74931875,344.48404414)
+ \xmulineto(579.48398536,341.09871089)
+(581.27065198,339.46937759)(582.08265196,339.58404426)
+ \xmulineto(584.41198525,340.60404423)
+(584.81731857,342.20271086)(583.31198527,344.39071081)
+ \xmulineto(578.07331872,346.60404408)
+(575.66131877,346.97871074)(576.0786521,345.49471078)
+-- cycle
+(574.06798547,335.13071103)
+ \xmulineto(577.54131873,330.25071115)
+(580.46398533,327.25471123)(582.84398528,326.15604459)
+ \xmulineto(585.32798523,327.1613779)
+(585.59865189,329.09871118)(583.63998526,331.96404445)
+ \xmulineto(582.22931863,333.00537775)
+(579.86398535,334.18804439)(576.51598542,335.49471103)
+ \xmulineto(574.2813188,336.09871101)
+(573.46931882,335.98404435)(574.06798547,335.13071103)
+-- cycle
+(501.75465374,341.31204422)
+ \xmulineto(504.17198702,341.59871087)
+(506.73998696,342.05737753)(509.47332023,342.68804418)
+ \xmulineto(511.88532018,342.97871084)
+(513.06798682,343.53071083)(513.02665349,344.33871081)
+ \xmulineto(512.80665349,345.30671078)
+(511.57865352,345.71871077)(509.31732024,345.59871078)
+ \xmulineto(508.82798691,345.57337744)
+(508.0986536,345.45871078)(507.13998695,345.24537745)
+ \xmulineto(506.17198697,345.19737745)
+(504.40665368,344.86404413)(501.83865373,344.24537748)
+ \xmulineto(501.77065374,345.53071078)
+(501.9373204,346.84404408)(502.35998706,348.16137738)
+ \xmulineto(502.49998705,348.65604403)
+(502.47865372,349.06271069)(502.29732039,349.36937735)
+ \xmulineto(499.46932045,350.84937731)
+(497.32265383,351.5413773)(495.8599872,351.46404396)
+ \xmulineto(495.20798721,351.43204397)
+(495.24532055,350.79204398)(495.9639872,349.53071068)
+ \xmulineto(497.04665384,347.4733774)
+(497.64532049,345.40137745)(497.75465382,343.28671083)
+ \xmulineto(496.30265386,343.05737751)
+(494.36932057,342.70804418)(491.96398728,342.26004419)
+ \xmulineto(489.22932068,341.7920442)
+(487.78132071,341.55204421)(487.61998738,341.54671088)
+ \xmulineto(485.22398743,340.93204422)
+(485.65065409,340.3907109)(488.92132069,339.90671092)
+ \xmulineto(491.52665396,339.72404425)
+(494.51598723,339.96937758)(497.89598715,340.6307109)
+-- (498.56798714,332.38537777)
+ \xmulineto(491.96398728,331.39071113)
+(485.67732076,330.56804448)(479.71332089,329.93737783)
+ \xmulineto(478.74532091,329.71871117)
+(478.02665426,329.60937784)(477.54132094,329.57871117)
+ \xmulineto(475.28132099,329.30271118)
+(474.40665434,328.93204452)(474.92132099,328.46937787)
+ \xmulineto(475.74532098,328.19337787)
+(477.4639876,327.87471121)(480.07865421,327.52671122)
+ \xmulineto(480.24532088,327.53071122)
+(480.81198753,327.64537789)(481.76532084,327.85471121)
+ \xmulineto(495.25065388,330.66137781)
+(509.14532024,331.79737778)(523.45331992,331.25471113)
+ \xmulineto(526.2026532,331.24004446)
+(527.13998651,332.02137778)(526.2506532,333.58804441)
+ \xmulineto(525.02131989,335.15604437)
+(522.86931994,336.00537768)(519.77598667,336.18271101)
+ \xmulineto(519.30265335,336.15071101)
+(518.4159867,336.02671101)(517.1306534,335.79204435)
+ \xmulineto(512.94798682,334.92671104)
+(507.96932027,334.01071106)(502.18798706,333.06804442)
+-- cycle
+(417.14532227,365.77604361)
+ \xmulineto(416.35998895,365.85471028)
+(416.16665562,365.45337695)(416.55198895,364.55204364)
+ \xmulineto(417.10932227,363.51071033)
+(418.06265558,362.43204369)(419.40132222,361.30271039)
+ \xmulineto(420.25065553,360.43737708)
+(421.04132218,360.19737708)(421.7866555,360.57337707)
+ \xmulineto(422.53598882,360.9427104)
+(422.85465548,361.67737705)(422.76532214,362.75471035)
+ \xmulineto(422.13065549,364.7187103)
+(420.25998887,365.72404361)(417.14532227,365.77604361)
+-- cycle
+(429.84398865,351.00004398)
+ \xmulineto(433.83865523,351.49471063)
+(436.50532184,352.04137728)(437.85998848,352.6307106)
+ \xmulineto(439.16665512,353.66137724)
+(438.27598847,354.1360439)(435.17198854,354.02671057)
+ \xmulineto(434.71332188,353.98937724)
+(433.78665523,353.82804391)(432.4159886,353.55204391)
+ \xmulineto(431.35998862,353.15604392)
+(430.52132197,352.92137726)(429.90665532,352.86404393)
+ \xmulineto(429.88532199,353.18271059)
+(429.99998865,353.65604391)(430.25465531,354.30271056)
+ \xmulineto(430.35998864,354.78137722)
+(430.41198864,355.16671054)(430.38532198,355.47871053)
+ \xmulineto(430.34398864,355.93737719)
+(429.91198865,356.45337717)(429.093322,357.00004383)
+ \xmulineto(434.59332188,358.09337713)
+(438.18265514,358.86937711)(439.8546551,359.32271044)
+ \xmulineto(440.74932175,359.70804376)
+(440.93732174,360.27071041)(440.40665509,361.00537706)
+ \xmulineto(439.74532177,361.41204372)
+(438.72932179,361.55204372)(437.33865516,361.43204372)
+ \xmulineto(437.18798849,361.42137705)
+(436.64532184,361.29204372)(435.73465519,361.06804373)
+ \xmulineto(429.96932198,359.32804377)
+(423.4119888,357.98937714)(416.03065563,357.04137716)
+ \xmulineto(414.65065566,356.77604383)
+(414.52665566,356.37471051)(415.66665563,355.84937719)
+ \xmulineto(416.62532228,355.46404387)
+(418.03598891,355.35471054)(419.89598887,355.51071053)
+ \xmulineto(421.13065551,355.62004386)
+(422.42132215,355.81204386)(423.80265545,356.07871052)
+ \xmulineto(424.6453221,355.3693772)
+(425.30265542,354.0360439)(425.78665541,352.04671062)
+ \xmulineto(423.63998879,351.5573773)
+(421.35465551,351.13071064)(418.90132223,350.76004398)
+ \xmulineto(418.01065558,350.21871066)
+(418.5159889,349.79737734)(420.40665553,349.49471068)
+ \xmulineto(421.8066555,349.45871068)
+(423.73465546,349.70271067)(426.17732207,350.21871066)
+-- (426.51598873,346.28671076)
+ \xmulineto(421.30265551,345.37471078)
+(417.46932226,344.8067108)(414.99998898,344.5987108)
+ \xmulineto(413.79198901,344.18804414)
+(413.83332234,343.72404416)(415.11465565,343.2133775)
+ \xmulineto(416.06265562,342.97337751)
+(417.69332226,342.96937751)(420.01598887,343.16671084)
+ \xmulineto(421.85998883,343.32271083)
+(423.47332213,343.54671083)(424.85465543,343.80671082)
+ \xmulineto(425.60932208,344.03604415)
+(426.22932207,344.16671081)(426.69732206,344.20271081)
+-- (427.18798871,335.61471102)
+ \xmulineto(426.72398872,335.56804436)
+(426.03598874,335.44271103)(425.11998876,335.20271103)
+ \xmulineto(413.45332235,333.57871107)
+(406.4533225,332.74937776)(404.11998922,332.71337776)
+ \xmulineto(403.04132258,332.62004443)
+(402.83865592,332.28137777)(403.50532257,331.72937779)
+ \xmulineto(404.67732254,330.74004448)
+(405.97332251,330.06271116)(407.40665582,329.7240445)
+ \xmulineto(407.56798915,329.7400445)
+(408.17198913,329.8600445)(409.24532244,330.11471116)
+ \xmulineto(413.44265568,331.88004445)
+(423.4639888,333.74537774)(439.30665511,335.72937769)
+ \xmulineto(443.31732169,336.06804434)
+(448.20265492,336.16671101)(453.96932146,336.04671101)
+ \xmulineto(454.43198811,336.08804434)
+(454.66665477,336.10937768)(454.66665477,336.10937768)
+ \xmulineto(456.3493214,336.41204434)
+(456.42665473,337.26004432)(454.9119881,338.69737761)
+ \xmulineto(453.41598813,339.80671092)
+(451.66132151,340.27604424)(449.66132155,340.10404424)
+ \xmulineto(448.8906549,340.04137758)
+(446.82265495,339.63604426)(443.46932169,338.87471094)
+ \xmulineto(440.72932175,338.17204429)
+(438.89065512,337.78671097)(437.96932181,337.7080443)
+ \xmulineto(440.13065509,339.76004425)
+(441.63065506,341.28137755)(442.47865504,342.28671086)
+ \xmulineto(443.03598836,342.96404417)
+(442.83865503,343.48937749)(441.86932172,343.87471082)
+ \xmulineto(440.41598842,344.5267108)
+(439.00532179,344.71337746)(437.63065515,344.43737747)
+ \xmulineto(437.0159885,344.38004414)
+(436.89065517,343.98404415)(437.25998849,343.24004417)
+ \xmulineto(437.64532182,342.33871086)
+(437.78132181,341.65071087)(437.67732181,341.18271088)
+ \xmulineto(437.0359885,339.57337759)
+(436.30665518,338.18804429)(435.46398853,337.02671099)
+-- (430.40665531,336.13071101)
+-- (430.16132198,344.50537747)
+ \xmulineto(431.38532195,344.7547108)
+(433.22398858,345.07871079)(435.67732186,345.43204411)
+ \xmulineto(439.19732178,346.05737743)
+(441.49465506,346.47871075)(442.56265504,346.72937741)
+ \xmulineto(443.77598835,347.14004407)
+(444.03598834,347.63604406)(443.36398836,348.19337738)
+ \xmulineto(442.55732171,348.58804404)
+(441.22932174,348.7187107)(439.37465511,348.55737737)
+ \xmulineto(439.06798845,348.5267107)
+(438.06798847,348.36404404)(436.37998851,348.05737738)
+ \xmulineto(434.08265523,347.71337739)
+(431.93198861,347.37471073)(429.94265532,347.04137741)
+-- cycle
+(422.16132216,339.84937758)
+ \xmulineto(421.31198884,340.70804423)
+(419.80265554,341.19737755)(417.60932226,341.32804421)
+ \xmulineto(416.83332227,341.26004422)
+(416.90132227,340.48937757)(417.80265559,339.00537761)
+
+ \xmulineto(419.05198889,337.09337765)
+(420.07865554,336.09337768)(420.85998885,336.00537768)
+ \xmulineto(422.49998882,336.77604433)
+(422.94265547,338.0520443)(422.16132216,339.84937758)
+-- cycle
+(438.4693218,331.92137778)
+ \xmulineto(438.00532181,331.88537778)
+(436.32798851,331.50004446)(433.43198858,330.78137781)
+ \xmulineto(428.71865535,329.6040445)
+(424.68265543,328.64004453)(421.32798884,327.89071121)
+ \xmulineto(420.16665553,328.72404453)
+(419.05198889,329.01604452)(417.98398892,328.76537786)
+ \xmulineto(417.22932227,328.54137786)
+(417.27598893,328.00537788)(418.11998891,327.14004457)
+ \xmulineto(418.66132223,326.41604458)
+(419.25065555,324.83337796)(419.92665554,322.40671135)
+ \xmulineto(420.3853222,320.73471139)
+(420.81732219,319.28671143)(421.22932218,318.07871146)
+ \xmulineto(421.81198883,316.74004482)
+(422.48932215,316.02137817)(423.28665547,315.92671151)
+ \xmulineto(423.88532212,316.14004484)
+(424.05732212,316.92671148)(423.77598879,318.29737812)
+ \xmulineto(424.23998878,318.33871145)
+(426.0826554,318.57871144)(429.30665533,319.01071143)
+ \xmulineto(436.21865518,320.07337807)
+(440.74932175,320.68271139)(442.91198837,320.86937805)
+ \xmulineto(443.52132169,321.08804471)
+(443.57332168,321.39604471)(443.06798836,321.82271136)
+ \xmulineto(442.55198837,322.39604468)
+(441.80665506,322.80271134)(440.86398841,323.03604467)
+ \xmulineto(441.90132172,325.45337794)
+(443.22932169,327.12004457)(444.86398832,328.03071121)
+ \xmulineto(445.59332164,328.5627112)
+(445.21865498,329.30671118)(443.73465501,330.27604449)
+ \xmulineto(441.78665506,331.35471113)
+(440.0266551,331.89604445)(438.4693218,331.92137778)
+-- cycle
+(421.91198883,326.53071125)
+ \xmulineto(422.21865549,326.56271125)
+(423.21865547,326.72937791)(424.89598876,327.02671123)
+ \xmulineto(429.32265533,328.02671121)
+(433.45332191,328.68804453)(437.31732182,329.02137785)
+ \xmulineto(437.93732181,329.07337785)
+(438.23465514,328.3227112)(438.20798847,326.76537791)
+ \xmulineto(438.05732181,324.89071129)
+(437.63598848,323.45871132)(436.94265516,322.45871135)
+-- (423.42132213,319.67204475)
+;
+%三个圆
+\path [draw=xmucolor,line width=3mm] (540,535) circle (9cm);
+\path [draw=xmucolor,line width=1mm] (540,535) circle (8.5cm);
+\path [draw=xmucolor,line width=1mm] (537,535) circle (5.7cm);
+%两颗八角星
+\node[star,star points=8,star point height=.3cm,minimum size=1.65cm,
+star point ratio=1.7,fill=xmucolor]at (140,595) { } ;
+\node[star,star points=8,star point height=.3cm,minimum size=1.65cm,
+star point ratio=1.7,fill=xmucolor]at (934,595) { } ;
+%%三颗五角星
+\path [draw=xmucolor,line width=1mm] (537,535) circle (5.7cm);
+%三颗五角星
+\node [star, star point height=.2cm, minimum size=0.6cm,
+line width=0.5mm, draw=xmucolor]
+at (533,474) { };
+\node [star, star point height=.2cm, minimum size=0.6cm,
+line width=0.5mm, draw=xmucolor]
+at (418,730) { };
+\node [star, star point height=.2cm, minimum size=0.6cm,
+line width=0.5mm, draw=xmucolor]
+at (648,730) { };
+%横线
+%真正的
+\draw [line width=1mm, xmucolor ](390,510) -- (680,510);
+\draw [line width=1mm, xmucolor ](470,510) -- (500,539);
+\draw [line width=1mm, xmucolor ](600,510) -- (567,539);
+\draw [line width=1mm, xmucolor ](376,568) -- (452,568);
+\draw [line width=1mm, xmucolor ](615,568) -- (694,568);
+\draw [line width=1mm, xmucolor ](502,568) -- (562,568);
+\draw [line width=1mm, xmucolor ](645,623) -- (693,623);
+\draw [line width=1mm, xmucolor ](373,623) -- (422,623);
+\draw [line width=1mm, xmucolor ](373,691) -- (483,691);
+\draw [line width=1mm, xmucolor ](582,691) -- (697,691);
+
+%城堡
+\draw [line width=1mm, xmucolor ](482,713)--(483,679)
+ --(582,679)--(582,710)--(567.8,710)--(567.8,691)
+ --(553.6,691)--(553,710)--(539.4,710)--(539.4,691)
+ --(525.2,691)--(525.2,710)--(511,710)--(511,691)
+ --(496.8,691)--(496.8,710)--(482.6,710);
+
+\draw [line width=1mm, xmucolor ](483,659)--(483,679) ;
+
+% 城堡左顶
+\draw [line width=0.75mm, xmucolor ](422,641)--(422,672)--(434,672)
+ --(434,656)--(446,656)--(446,672)--(458,672)--(458,656)
+ --(470,656)--(470,672)--(482,672);
+
+% 城堡右顶
+\draw [line width=0.75mm, xmucolor ](645,641)--(645,672)
+ --(633,672)--(633,656)--(621,656)--
+(621,672)--(609,672)--(609,656)--(597,656)--(597,672)--(585,672);
+
+\draw [line width=1mm, draw=xmucolor] (582,679) rectangle (483,659);
+\draw [line width=1mm, draw=xmucolor] (508,679)--(508,659);
+\draw [line width=1mm, draw=xmucolor] (533,679)--(533,659);
+\draw [line width=1mm, draw=xmucolor] (558,679)--(558,659);
+
+\draw [line width=1mm, draw=xmucolor] (575,641) rectangle (490,659);
+\draw [line width=1mm, draw=xmucolor] (518,641) rectangle (546,659);
+
+\draw [line width=1mm, draw=xmucolor] (422,641) rectangle (645,625);
+\draw [line width=0.75mm, draw=xmucolor] (438,641) rectangle (460,625);
+\draw [line width=0.75mm, draw=xmucolor] (607,641) rectangle (629,625);
+\draw [line width=0.75mm, draw=xmucolor] (485.6,641) rectangle (511.3,625);
+\draw [line width=0.75mm, draw=xmucolor] (562.7,641) rectangle (588.4,625);
+\draw [line width=0.75mm, draw=xmucolor] (534,641) -- (534,625);
+
+\draw [line width=0.75mm, draw=xmucolor] (422,606) rectangle (492.4,625);
+\draw [line width=0.75mm, draw=xmucolor] (442,606) rectangle (467,625);
+\draw [line width=0.75mm, draw=xmucolor] (575,606) rectangle (645.4,625);
+\draw [line width=0.75mm, draw=xmucolor] (600,606) rectangle (625.4,625);
+
+\draw [line width=0.75mm, draw=xmucolor]
+ (450,606) --(450,539)--(615.4,539)--(615.4,606);
+
+\draw [line width=0.75mm, draw=xmucolor] (450,539) rectangle (490,595);
+\draw [line width=0.75mm, draw=xmucolor] (450,578) rectangle (465,595);
+\draw [line width=0.75mm, draw=xmucolor] (490,578) rectangle (475,558);
+\draw [line width=0.75mm, draw=xmucolor] (450,578) rectangle (475,558);
+\draw [line width=0.75mm, draw=xmucolor] (475,605) --(475,595);
+\draw [line width=0.75mm, draw=xmucolor] (465,539) --(465,558);
+
+\draw [line width=0.75mm, draw=xmucolor] (575.4,539) rectangle (615.4,595);
+\draw [line width=0.75mm, draw=xmucolor] (603,578) rectangle (615.4,595);
+\draw [line width=0.75mm, draw=xmucolor] (575.4,578) rectangle (595,558);
+\draw [line width=0.75mm, draw=xmucolor] (575.4,578) rectangle (615.4,558);
+\draw [line width=0.75mm, draw=xmucolor] (590,605) --(590,595);
+\draw [line width=0.75mm, draw=xmucolor] (603,539) --(603,558);
+
+\draw [line width=0.75mm, draw=xmucolor] (504,539) rectangle (490,595);
+\draw [line width=0.75mm, draw=xmucolor] (504,553) --(490,553);
+\draw [line width=0.75mm, draw=xmucolor] (504,567) --(490,567);
+\draw [line width=0.75mm, draw=xmucolor] (504,581) --(490,581);
+
+
+\draw [line width=0.75mm, draw=xmucolor] (561.4,539) rectangle (575.4,595);
+\draw [line width=0.75mm, draw=xmucolor] (561.4,553) --(575.4,553);
+\draw [line width=0.75mm, draw=xmucolor] (561.4,567) --(575.4,567);
+\draw [line width=0.75mm, draw=xmucolor] (561.4,581) --(575.4,581);
+
+\draw [xmucolor,line width=0.75mm] (562,595)
+ arc [start angle=25, end angle=155, radius=0.55cm];
+\draw [xmucolor,line width=0.75mm] (575,592)
+ arc [start angle=13, end angle=165, radius=0.75cm];
+
+\draw [line width=0.5mm, draw=xmucolor] (534.5,611) --(534.5,622);
+\draw [line width=0.5mm, draw=xmucolor] (525,609) --(519,621);
+\draw [line width=0.5mm, draw=xmucolor] (517,605.5) --(506,615);
+\draw [line width=0.5mm, draw=xmucolor] (509,598) --(495,607);
+
+%\draw [line width=0.5mm, draw=xmucolor] (534.5,606) --(534.5,620);
+\draw [line width=0.5mm, draw=xmucolor] (542,610) --(550,620);
+\draw [line width=0.5mm, draw=xmucolor] (552,605) --(562,615);
+\draw [line width=0.5mm, draw=xmucolor] (558.5,596) --(573,607);
+}
+
+\def\xmuxiamendaxue{
+\fill[xmucolor]
+(2.54164114,5.90998736)
+ \xmulineto(6.23538773,12.32717387)
+(9.70830765,19.47877369)(13.08852091,25.31730688)
+ \xmulineto(18.02757413,34.29130666)
+(22.33957404,43.55690643)(26.02237396,51.98397289)
+ \xmulineto(31.85570716,66.47357253)
+(36.52757372,79.23970555)(40.24117364,92.63917188)
+ \xmulineto(40.99064029,95.35423848)
+(41.02237363,97.1913051)(40.88117363,97.44743843)
+ \xmulineto(40.09370698,98.84277173)
+(40.39170697,103.63557161)(41.49584028,108.17090483)
+ -- (42.44837359,112.09223807)
+ -- (43.91304023,112.09223807)
+ \xmulineto(45.60984019,112.09223807)
+(45.84477352,111.89023808)(48.67810679,107.92037151)
+ \xmulineto(51.58490673,103.84903827)
+(52.36450671,103.50943828)(57.59943993,104.04130494)
+ \xmulineto(67.79317304,104.98917158)
+(76.68383951,108.26463816)(86.53637262,111.0730381)
+ \xmulineto(91.63170584,112.46357139)
+(95.91303908,116.07303797)(101.46503896,116.16050464)
+ \xmulineto(106.13170552,116.11930464)
+(107.52757216,115.71317131)(109.48437212,113.83237136)
+ \xmulineto(111.75517207,111.64957141)
+(112.13690539,110.33237145)(111.03637208,108.45263816)
+ \xmulineto(109.50103878,105.81623823)
+(107.47397216,105.18757157)(100.36090565,105.12503824)
+ \xmulineto(92.58490582,105.05690491)
+(91.90783917,104.77557158)(89.38637256,100.52463836)
+ \xmulineto(86.90783928,96.85797178)
+(87.08850594,96.86837178)(89.2817059,93.04650521)
+ -- (94.36450578,93.04650521)
+ \xmulineto(99.27130567,93.04130521)
+(99.55837234,92.98290521)(102.5885056,91.47250525)
+ \xmulineto(106.27650552,89.63557196)
+(106.55303885,89.04650531)(104.85050555,84.91517207)
+ \xmulineto(103.48437225,81.59797216)
+(103.72503891,72.13917239)(104.52757223,68.62463914)
+ \xmulineto(105.13690555,65.95263921)
+(104.57970556,63.15583928)(102.97023893,60.869306)
+ \xmulineto(101.88117228,59.32250604)
+(101.15103897,58.85370605)(98.2145057,57.82250608)
+ \xmulineto(93.48437247,56.16570612)
+(88.24637258,53.23917286)(88.24637258,52.25943955)
+ \xmulineto(88.24637258,51.07250624)
+(92.15730583,49.71837294)(96.59943907,49.36930629)
+ \xmulineto(100.14063899,49.09277296)
+(100.56877231,48.95797296)(101.62650562,47.75423966)
+ \xmulineto(103.05303892,46.11930637)
+(105.50103887,41.63503981)(105.50103887,40.64543983)
+ \xmulineto(105.50103887,39.62463986)
+(103.90783891,36.48917327)(102.29317227,34.07250666)
+ \xmulineto(101.35570563,32.68704003)
+(100.45410565,31.2339734)(98.91303902,29.7646401)
+ \xmulineto(96.35570574,27.24904016)
+(98.83437235,26.72877351)(103.24637225,24.26464024)
+ \xmulineto(105.17810554,23.12464027)
+(107.0417055,22.17610696)(112.38117205,20.24384034)
+ \xmulineto(116.18903864,18.86410704)
+(120.01717188,17.79650706)(122.12077184,17.09797375)
+ \xmulineto(126.50623841,15.65584045)
+(130.94837164,15.39024046)(134.61997156,12.96312052)
+ -- (135.59330487,12.05686721)
+ -- (134.55863823,10.95842723)
+ \xmulineto(129.42183834,7.10374733)
+(124.20303846,6.07665402)(119.00103857,4.00998741)
+ \xmulineto(116.22503863,3.06780076)
+(114.03637202,3.00998743)(111.08850541,2.7704141)
+ -- (107.0745055,6.16102735)
+ \xmulineto(101.39170563,10.55165391)
+(96.31770574,14.05690716)(92.3035725,17.04650708)
+ \xmulineto(90.25517254,18.35744038)
+(87.89690593,20.96317365)(85.49583931,21.01464032)
+ \xmulineto(83.51143936,21.01464032)
+(77.73023948,17.31210708)(74.68903955,15.2079738)
+ \xmulineto(72.71450626,13.84277383)
+(71.68903962,13.37464051)(69.536373,12.41572053)
+ \xmulineto(65.91303974,10.96208057)
+(62.56357315,9.54645394)(58.19783991,9.09280061)
+ \xmulineto(55.90210663,9.28082728)
+(55.53637331,10.67665391)(57.40783993,12.11416054)
+ \xmulineto(58.09943992,12.64541386)
+(59.77650655,13.94744049)(61.13170652,15.00424047)
+ \xmulineto(62.48437315,16.06210711)
+(65.26610642,18.06730706)(67.30357305,19.46317369)
+ \xmulineto(72.47397293,22.9891736)
+(75.15103954,25.03077355)(74.70303955,27.26464016)
+ \xmulineto(74.40210622,28.74904013)
+(74.40210622,28.84277346)(73.14063958,30.71317341)
+ \xmulineto(71.33957296,33.39544001)
+(70.59943964,33.89024)(68.98437301,33.48397334)
+ \xmulineto(67.76037304,33.17610669)
+(67.30730638,32.77557336)(63.47397313,28.63504013)
+ \xmulineto(61.21450651,26.18704019)
+(55.9431733,23.0203736)(53.47024002,22.62464028)
+ \xmulineto(51.84477339,22.36410695)
+(51.71970672,22.42090695)(51.71970672,23.42090693)
+ \xmulineto(51.71970672,24.00944024)
+(52.47397337,25.43704021)(53.40210669,26.59277351)
+ \xmulineto(54.32397333,27.74384015)
+(56.29317329,30.34797342)(57.77130659,32.37984004)
+ \xmulineto(59.25157322,34.40583999)
+(61.30357318,37.06730659)(62.33957316,38.28597323)
+ \xmulineto(65.37503976,41.86410647)
+(65.37503976,43.95263975)(62.34477316,43.96837309)
+ \xmulineto(60.65103986,43.97877309)
+(56.40210662,47.15063967)(56.01143996,48.69077297)
+ \xmulineto(55.48437331,50.78597292)
+(56.10463996,51.5203729)(60.00103987,53.40583952)
+ \xmulineto(62.05837316,54.40063949)
+(63.88117312,55.56210613)(64.05303978,55.97877279)
+ \xmulineto(64.22503978,56.40063945)
+(64.42703978,63.36410594)(64.50623977,71.44743907)
+ \xmulineto(64.66250644,87.99903867)
+(64.57450644,87.56730534)(68.06357303,89.34903863)
+ \xmulineto(70.56357297,90.6250386)
+(75.5849062,95.46357181)(76.57970618,97.5621051)
+ \xmulineto(77.35570616,99.01570506)
+(76.9130395,101.26463834)(75.06357288,101.33757167)
+ \xmulineto(71.99583961,101.05690501)
+(57.85050659,95.05170516)(57.63170659,94.13557185)
+ \xmulineto(54.57450666,87.36837201)
+(49.89690676,73.44743902)(46.64064017,61.91570598)
+ \xmulineto(43.39170691,50.38503959)
+(41.09370696,41.50943981)(34.01717378,29.68130677)
+ \xmulineto(30.45410719,23.77037358)
+(28.7603739,20.69744033)(24.50624066,14.18130715)
+ \xmulineto(21.93797405,10.25426725)
+(15.25157419,3.97821407)(12.76664092,2.7704141)
+ \xmulineto(10.28226764,1.5678008)
+(7.18904104,0.37978216)(4.3176811,0.1141575)
+ \xmulineto(-1.8630521,-0.46969648)
+(-0.42033746,1.14488614)(2.54164114,5.90998736)
+ -- cycle
+(87.35570594,33.95264)
+ \xmulineto(90.21970587,35.85370662)
+(91.21450585,36.90063993)(92.10983917,38.96837321)
+ \xmulineto(94.16770579,43.71837309)
+(92.32917249,46.62983969)(86.79317262,47.36410633)
+ \xmulineto(85.01143932,47.597973)
+(84.23023934,47.483973)(83.13690603,46.84277301)
+ \xmulineto(81.3750394,45.50423971)
+(80.31250609,43.44223977)(79.05837279,42.06730647)
+ \xmulineto(77.57970615,40.45263984)
+(76.36970618,38.84797321)(76.36970618,38.49903989)
+ \xmulineto(76.36970618,37.41570658)
+(83.07450603,32.79130669)(84.667706,32.77557336)
+ \xmulineto(85.16770599,32.77037336)
+(86.37503929,33.30170668)(87.35570594,33.95264)
+ -- cycle
+(83.98437268,60.17610602)
+ \xmulineto(92.31250583,62.42610596)
+(92.42183916,62.28597263)(92.59370582,64.11930592)
+ \xmulineto(92.89690582,67.25943918)
+(91.95983917,67.46317251)(88.38637258,66.80690585)
+ \xmulineto(86.78743928,66.5094392)
+(84.631706,65.76463921)(83.04170603,65.29130589)
+ \xmulineto(81.94837272,64.96837257)
+(80.39170609,64.14543925)(79.74997277,64.01463926)
+ \xmulineto(77.02757283,63.45263927)
+(74.82917288,61.33757266)(77.36450616,59.28597271)
+ \xmulineto(78.03637281,58.74383939)
+(78.88637279,58.79650605)(83.98437268,60.17610602)
+ -- cycle
+(89.35570589,71.80583906)
+ \xmulineto(92.74997249,71.59223907)
+(93.31250581,72.08183906)(93.5937058,72.36837238)
+ \xmulineto(94.56877245,73.33757236)
+(94.07450579,75.69650564)(94.07970579,78.41517224)
+ \xmulineto(94.08330579,79.60890554)
+(93.53117247,81.0209055)(93.38117247,81.92037215)
+ \xmulineto(93.22503914,82.81623879)
+(92.75517249,84.62503875)(92.39690583,84.92037207)
+ \xmulineto(91.41303918,85.73970539)
+(80.76610608,86.19650538)(77.62077282,86.06210538)
+ \xmulineto(74.73023955,85.99903871)
+(74.93277288,85.57823872)(74.92703954,84.00423876)
+ \xmulineto(74.91823955,82.12503881)
+(74.62650622,81.80583882)(77.46503949,81.71317215)
+ -- (82.17290605,81.68237215)
+ \xmulineto(89.46503922,81.63023882)
+(91.15730585,81.58703882)(91.15730585,79.66050554)
+ \xmulineto(91.15730585,77.59223892)
+(88.81250591,76.73970561)(82.09370605,75.67090564)
+ \xmulineto(77.01717283,74.86317232)
+(76.08330619,75.05690565)(76.20837285,72.52983905)
+ \xmulineto(76.28743951,70.90637242)
+(77.32397283,70.42090577)(81.62650606,70.94223909)
+ \xmulineto(84.317706,71.17090575)
+(86.62077262,71.66050574)(89.35570589,71.80583906)
+ -- cycle
+(464.61063095,7.22353399)
+ \xmulineto(461.22929769,10.93708057)
+(459.74529773,12.17665387)(457.44396444,14.69077381)
+ \xmulineto(455.71463115,16.57717376)
+(453.44396453,20.59277366)(451.23996458,24.34797357)
+ \xmulineto(455.40663116,21.97877363)
+(462.23463101,18.89544037)(467.92796421,18.11410706)
+ \xmulineto(473.84929742,17.80690706)
+(475.51063071,25.9938402)(475.9386307,31.30170673)
+ \xmulineto(476.76129735,41.10370649)
+(476.47463069,41.8574398)(474.93329739,43.10370644)
+ \xmulineto(472.01063079,45.82717304)
+(470.33463083,46.20797303)(463.65729764,43.84797309)
+ \xmulineto(458.99063108,42.2026398)
+(453.90663119,40.75423983)(449.47996462,38.47357322)
+ \xmulineto(447.93863132,37.68130657)
+(443.64129808,37.75943991)(442.54796477,38.81730655)
+ \xmulineto(438.1412982,43.05170644)
+(434.01596496,46.0146397)(434.01596496,46.50423969)
+ \xmulineto(434.01596496,47.468373)
+(435.96929825,48.44743964)(437.84929821,48.43130631)
+ \xmulineto(443.22529809,48.37983964)
+(458.87596441,49.39543962)(461.50663102,49.96837294)
+ \xmulineto(466.55329758,50.69077292)
+(471.71996413,50.80170625)(476.45863069,52.52410621)
+ \xmulineto(478.03196399,53.11930619)
+(478.9332973,55.32717281)(478.57329731,57.72877275)
+
+ \xmulineto(478.70929731,60.10370602)
+(477.90129733,60.920906)(476.02129737,61.50423932)
+ \xmulineto(475.39596405,61.89023931)
+(475.35463072,62.64023929)(475.69863071,65.91050588)
+ \xmulineto(475.9746307,68.51463915)
+(475.94929737,69.88503911)(475.61996404,70.28077244)
+ \xmulineto(472.41196411,73.0517057)
+(468.13596421,67.89023916)(466.96396423,66.59277253)
+ \xmulineto(465.5012976,64.96317257)
+(465.38663094,64.34277258)(463.43329765,64.63503924)
+ \xmulineto(460.66796437,65.72877255)
+(455.35463116,69.1193058)(454.77729784,72.39023905)
+ \xmulineto(454.90663117,72.73397238)
+(456.23996447,73.1965057)(457.84396444,73.45837236)
+ \xmulineto(465.57863093,75.47250564)
+(470.23463083,76.73970561)(477.72529733,78.23397224)
+ \xmulineto(479.61596396,78.5870389)
+(479.67729729,78.89543889)(481.78263057,78.22877224)
+ \xmulineto(484.77196384,77.28597226)
+(485.85463049,76.92557227)(487.45863045,75.43130564)
+ \xmulineto(489.23996374,73.77037235)
+(489.05863041,72.51570571)(486.81863046,71.00423908)
+ \xmulineto(483.43863054,68.72877247)
+(479.1052973,64.34277258)(479.42263063,63.51463927)
+ \xmulineto(479.58396396,63.10370595)
+(481.05863059,62.16050597)(482.70396389,61.42090599)
+ \xmulineto(485.99596382,59.94743936)
+(487.18263046,59.29130604)(487.11063046,57.08757276)
+ \xmulineto(487.01063046,53.94223951)
+(487.74529711,54.65063949)(492.46929701,55.14023948)
+ \xmulineto(498.7506302,55.96837279)
+(504.19329675,58.22357273)(510.63062994,56.75423944)
+ \xmulineto(513.58929654,54.34797283)
+(514.09462986,50.85743958)(516.16262982,47.94743965)
+ \xmulineto(517.33462979,46.32717303)
+(516.84929647,44.96837306)(514.99596318,44.6657064)
+ \xmulineto(508.07863,43.65063976)
+(502.40129679,45.12463972)(495.7719636,45.86410637)
+ \xmulineto(493.60529698,46.09797303)
+(492.26129701,46.0146397)(490.18796372,44.49383974)
+ \xmulineto(488.76129709,43.44743976)
+(487.96929711,42.42090646)(487.67729711,41.49903981)
+ \xmulineto(486.94929713,39.15063987)
+(486.15729715,33.39024001)(485.96396382,28.47357347)
+ \xmulineto(485.81863049,25.05690689)
+(485.44396383,22.58237361)(485.06796384,20.09277367)
+ \xmulineto(484.46929718,16.08757377)
+(481.83463057,10.9730139)(478.67729731,7.69697398)
+ \xmulineto(476.62529736,5.80113403)
+(473.19863076,3.25946742)(470.82396415,3.18602743)
+ \xmulineto(468.7199642,3.18602743)
+(468.59463087,3.27041409)(464.61063095,7.22353399)
+ -- cycle
+(237.41330263,16.66570709)
+ \xmulineto(235.39596934,16.85744042)
+(233.02263606,17.32717374)(232.40130274,17.6558404)
+ \xmulineto(231.78263609,17.97877373)
+(230.07996946,19.56730702)(228.35063616,21.22877365)
+ \xmulineto(226.7026362,22.92090694)
+(224.82930291,23.88504025)(223.46530294,25.14544022)
+ \xmulineto(219.70930302,27.75944015)
+(215.89596977,30.70264008)(213.0626365,33.73397334)
+ \xmulineto(210.33996989,37.12463992)
+(212.44930318,36.6089066)(215.21996979,35.75423995)
+ \xmulineto(216.13196977,35.13503997)
+(217.7826364,34.40583999)(218.8919697,34.12464)
+ \xmulineto(220.00130301,33.84797334)
+(222.31730296,33.12464002)(224.04263626,32.52037337)
+ \xmulineto(225.75996955,32.17610671)
+(230.63196945,31.50424006)(232.86130273,31.2183734)
+ \xmulineto(233.22530272,31.58237339)
+(233.16796939,34.87983998)(233.16796939,34.87983998)
+ \xmulineto(233.43863605,39.67090652)
+(233.83463604,44.24383975)(233.86130271,48.19077298)
+ \xmulineto(233.88130271,53.11930619)
+(233.77196938,59.15063938)(233.86130271,61.00423933)
+ \xmulineto(234.29863603,70.62983909)
+(233.81730271,75.33237231)(227.62530285,74.14957234)
+ \xmulineto(221.66263631,73.00943904)
+(219.65063635,71.29170574)(215.16796979,72.83757237)
+ \xmulineto(213.29863649,73.44743902)
+(211.28663654,74.25890567)(210.70263655,74.64437233)
+ \xmulineto(209.13730325,75.67090564)
+(207.34396996,79.6495722)(207.31730329,82.25370547)
+ \xmulineto(207.27730329,87.14437202)
+(207.62530329,91.13023859)(207.04796997,96.1875718)
+ \xmulineto(206.73463664,98.92557173)
+(206.46530331,101.11410501)(205.66797,103.57823828)
+ \xmulineto(205.31197,104.19650493)
+(205.02263668,105.72357156)(205.01063668,106.97250486)
+ \xmulineto(205.00130334,108.78597149)
+(205.20930334,109.44743814)(206.03196999,110.22357145)
+ \xmulineto(207.58530329,111.68237141)
+(210.64530322,111.56730475)(212.74663651,109.96890479)
+ \xmulineto(214.68930313,108.48917149)
+(215.30396978,106.97250486)(215.30796978,103.62503828)
+ \xmulineto(215.31196978,102.24490498)
+(215.49063645,100.84277168)(215.70263644,100.50943836)
+ \xmulineto(216.88130308,98.64957174)
+(223.72530293,99.60890505)(226.5746362,99.97770504)
+ \xmulineto(229.8693028,100.40637169)
+(229.5853028,101.84903832)(229.50663614,107.89543817)
+ \xmulineto(229.4653028,111.22357142)
+(229.15730281,114.60890467)(228.91330282,114.874638)
+ \xmulineto(228.67730282,115.125038)
+(226.28663621,115.19130466)(223.40130294,114.77557134)
+ \xmulineto(218.10530305,114.00943802)
+(217.4386364,114.31103802)(217.4386364,115.14437133)
+ \xmulineto(217.4386364,115.82717131)
+(221.66796964,117.5465046)(223.13730294,118.09797126)
+ \xmulineto(227.62530285,120.3579712)
+(228.00130284,122.49903781)(233.91330271,124.23970444)
+ \xmulineto(234.30396936,124.2859711)
+(236.54263598,123.0870378)(238.56796927,121.73397117)
+ \xmulineto(240.59330256,120.37463787)
+(243.2413025,118.83757124)(244.45330247,118.31623792)
+ \xmulineto(246.36930243,117.49383794)
+(246.81196909,117.04130461)(247.85596907,114.849038)
+ \xmulineto(247.85596907,114.849038)
+(248.47863572,113.12503804)(248.48396905,111.98290474)
+ \xmulineto(248.49063572,110.84277143)
+(247.6773024,108.15583817)(247.6773024,108.15583817)
+ \xmulineto(246.71996909,100.74850502)
+(246.67330243,95.01570516)(246.68930242,89.63917196)
+ \xmulineto(246.72530242,78.56730556)
+(246.98396908,68.48397248)(247.32396908,65.25943923)
+ \xmulineto(247.69463574,53.64543951)
+(247.79196907,42.07717313)(247.35596908,30.53077342)
+ \xmulineto(247.5853024,26.85744017)
+(246.86130242,23.37984026)(245.52263578,20.45797367)
+ \xmulineto(244.04796915,17.27557374)
+(243.58930249,16.97877375)(241.96530253,16.50424043)
+ \xmulineto(241.64130254,16.5413071)
+(239.42663592,16.46837376)(237.41330263,16.66570709)
+ -- cycle
+(225.76663622,81.60890549)
+ \xmulineto(229.76663613,81.77557215)
+(232.16796941,79.9115722)(232.09996941,82.45837214)
+ \xmulineto(232.00663608,84.82250541)
+(231.91863608,87.85423867)(231.72930275,90.35797194)
+ \xmulineto(231.47063609,93.87983852)
+(229.99596946,92.48917189)(228.66796949,92.63557188)
+ \xmulineto(227.59996951,92.74850521)
+(225.21996956,92.28077189)(223.36930294,92.16050523)
+ \xmulineto(218.22530305,91.8271719)
+(216.31196976,91.45263858)(215.61063644,90.64957193)
+ \xmulineto(213.96530315,88.77037198)
+(214.14530314,83.06730545)(215.88663644,81.84277215)
+ \xmulineto(216.80796975,81.1965055)
+(219.91330302,80.91517217)(225.76663622,81.60890549)
+ -- cycle
+(375.75063291,18.20264039)
+ \xmulineto(365.9532998,26.08757353)
+(357.56796665,36.83757326)(350.08396681,46.38503969)
+ \xmulineto(346.44930023,51.02037291)
+(340.32396703,59.84797269)(336.94930043,62.97357262)
+ \xmulineto(334.96930048,63.7287726)
+(331.49063389,62.27557263)(329.45863393,59.84277269)
+ \xmulineto(326.266634,55.36930614)
+(323.31863407,50.47357292)(320.18263414,46.29130636)
+ \xmulineto(317.78663419,43.04130644)
+(308.56796773,33.47877334)(304.85463448,30.55690675)
+ \xmulineto(302.91196785,29.03077345)
+(297.5533013,26.58237351)(294.18263471,25.68130687)
+ \xmulineto(289.09996816,24.47877357)
+(279.85996836,24.24384024)(276.70396843,27.31730683)
+ \xmulineto(280.94396834,30.75424008)
+(287.38130153,32.71837336)(291.81330143,37.00423992)
+ \xmulineto(297.61996797,42.47357312)
+(304.00663449,47.98917299)(308.54796773,54.05690617)
+ \xmulineto(310.57863435,57.12983943)
+(315.96396756,61.75943931)(316.14130089,64.42610591)
+ \xmulineto(316.32930089,67.20263918)
+(311.53730099,68.48397248)(306.38663444,68.47877248)
+ \xmulineto(304.18796782,68.49383915)
+(301.26130122,68.45263915)(300.32930124,68.68703914)
+ \xmulineto(297.59463464,69.37463912)
+(294.74530137,71.65583907)(293.91863472,73.81623902)
+ \xmulineto(289.61596814,81.91157215)
+(290.07330147,82.5870388)(298.99596794,81.79690548)
+ \xmulineto(305.56263446,82.42037214)
+(319.62530082,84.50943875)(325.1253007,87.23397202)
+ \xmulineto(325.84930068,87.68237201)
+(326.75596733,89.75370529)(327.49063398,92.62503855)
+ \xmulineto(328.01063397,98.41157174)
+(327.53730064,102.95837163)(327.42796731,108.29170483)
+ \xmulineto(327.67330064,116.2859713)
+(322.25596743,120.4635712)(319.0479675,120.88503785)
+ \xmulineto(319.05330083,121.10370451)
+(322.22530076,122.63917114)(322.85996741,124.68757109)
+ \xmulineto(324.13063405,128.73970433)
+(324.44396738,130.69130428)(328.55863395,130.30223762)
+ \xmulineto(336.7919671,129.08183765)
+(337.58530042,128.97770432)(340.05330037,128.31103767)
+ \xmulineto(343.60530029,127.35797103)
+(344.85463359,118.13917125)(344.67730026,114.811038)
+ \xmulineto(344.28263361,107.45837152)
+(343.90130028,102.51570497)(343.68263362,101.86317166)
+ \xmulineto(343.34930029,100.86317168)
+(344.12530028,94.74850517)(344.76130026,94.22357184)
+ \xmulineto(350.30796681,94.24850518)
+(355.61063336,96.98290511)(361.52129989,97.31103844)
+ \xmulineto(365.02129982,98.11930508)
+(370.57329969,94.64437183)(373.33463297,93.18757187)
+ \xmulineto(376.89596622,91.46357191)
+(376.58929956,91.8427719)(376.54796623,88.10370533)
+ \xmulineto(376.51596623,84.89543874)
+(376.45329956,84.71317208)(374.9012996,83.15583878)
+
+ \xmulineto(372.20929966,80.45263885)
+(370.49063303,80.21837219)(367.1626331,80.79690551)
+ \xmulineto(361.84929989,81.59223882)
+(357.12529999,82.30223881)(351.54263345,80.17610552)
+ \xmulineto(348.78663351,79.10370555)
+(347.20930021,78.15583891)(346.76663355,77.2917056)
+ \xmulineto(343.18796696,73.47770569)
+(345.14130025,71.7859724)(347.13063354,69.20263913)
+ \xmulineto(351.77196677,63.35370594)
+(354.58930005,60.77037267)(359.60529994,56.32250611)
+ \xmulineto(367.64129976,49.19077296)
+(371.19329968,46.1350397)(379.18263284,41.06730649)
+ \xmulineto(385.10529937,37.30690658)
+(391.77729923,33.39544001)(398.38129908,28.98397346)
+ \xmulineto(399.46929906,28.14024014)
+(400.3079657,27.2859735)(400.46929903,26.75944018)
+ \xmulineto(396.64129912,23.53597359)
+(391.20396591,22.95264027)(388.58396596,21.73397363)
+ \xmulineto(384.35996606,19.77557368)
+(381.18796613,18.92610704)(377.28663288,17.7542404)
+ \xmulineto(376.69329956,17.57250707)
+(376.14129957,17.73397373)(375.75063291,18.20264039)
+ -- cycle
+(157.67330439,23.58237359)
+ \xmulineto(153.74663781,25.7594402)
+(154.06797113,30.93704007)(154.13197113,35.65063996)
+ \xmulineto(154.29330446,37.39543991)
+(154.46530446,44.16570641)(154.51063779,50.69743959)
+ \xmulineto(154.58930446,62.07250597)
+(156.08397109,75.55690564)(156.13730442,77.13917227)
+ \xmulineto(156.36130442,83.61410544)
+(156.63197108,88.79170531)(156.99063774,95.06730516)
+ \xmulineto(157.75597105,101.42037167)
+(155.7719711,104.51570492)(152.25597117,109.26463814)
+ \xmulineto(151.05330453,110.79170477)
+(151.42663786,112.16570474)(152.75597116,113.41517137)
+ \xmulineto(156.50663775,114.86837134)
+(160.115971,117.4689046)(163.44397093,115.18237133)
+ \xmulineto(165.54797088,113.6761047)
+(165.60530421,113.63557137)(167.38130417,112.45837139)
+ \xmulineto(168.28663749,111.85423808)
+(169.54797079,110.43130478)(170.18397078,110.43130478)
+ \xmulineto(173.19463738,110.7646381)
+(175.69863732,112.66570472)(178.15730394,113.92557136)
+ \xmulineto(179.36530391,114.56730468)
+(180.77730388,115.35423799)(181.65730386,116.02463797)
+ \xmulineto(184.29863713,118.04650459)
+(186.18397043,119.26463789)(186.67730375,119.26463789)
+ \xmulineto(186.93330374,119.26463789)
+(188.18397038,118.58183791)(189.45863702,117.7537046)
+ \xmulineto(190.72930366,116.92037128)
+(191.97463696,116.16050464)(192.22530363,116.06730464)
+ \xmulineto(193.97463692,115.38503799)
+(196.06797021,113.59223803)(196.71463686,112.2287714)
+ \xmulineto(197.35597018,110.8798381)
+(197.39597018,110.34277145)(196.96530352,108.99903815)
+ \xmulineto(196.67730353,108.11410484)
+(195.94930354,104.46357159)(195.34397022,100.89023835)
+ \xmulineto(194.74130357,97.31623844)
+(194.01730359,93.38503853)(193.72930359,92.1495719)
+ \xmulineto(193.4333036,90.84277193)
+(193.2293036,86.27557204)(193.25197027,81.1965055)
+ \xmulineto(193.28663694,71.6823724)
+(192.92663694,69.77037245)(191.01730365,69.29130579)
+ \xmulineto(190.40797033,69.13503913)
+(189.10530369,69.41050579)(187.90797039,69.93703911)
+ \xmulineto(185.54797044,70.98290575)
+(182.50663717,71.19650575)(180.61997055,70.45797243)
+ \xmulineto(178.2199706,69.80690578)
+(175.99597065,69.02037247)(173.7599707,67.97357249)
+ \xmulineto(170.00130412,66.22357254)
+(170.07463745,67.67090583)(170.19463744,62.22877263)
+ \xmulineto(169.99597078,58.64543939)
+(169.83463745,53.29130619)(170.08397078,50.2490396)
+ \xmulineto(171.16263742,37.56730658)
+(171.01063743,34.87983998)(170.8653041,33.97877333)
+ \xmulineto(170.11997078,29.52410678)
+(167.5746375,21.59277364)(163.2466376,21.81730697)
+ \xmulineto(160.75597099,21.9422403)
+(159.40797102,22.61930695)(157.67330439,23.58237359)
+ -- cycle
+(177.06797063,75.82250563)
+ \xmulineto(179.44397057,76.72877228)
+(182.93863716,79.35797221)(183.88130381,80.96357217)
+ \xmulineto(184.5013038,82.00943881)
+(184.82930379,83.33237211)(184.82930379,84.77037208)
+ \xmulineto(184.82930379,86.63557203)
+(184.65063713,87.09223869)(183.69863715,87.71837201)
+ \xmulineto(182.64530384,88.40637199)
+(181.87597052,88.66050532)(179.99063723,87.94223867)
+ \xmulineto(178.87597059,87.51570534)
+(176.7026373,87.37463868)(174.77730401,87.05170536)
+ \xmulineto(170.06263745,86.24850537)
+(169.58930412,85.32717206)(169.58930412,82.23397214)
+ \xmulineto(169.58930412,80.13557219)
+(171.36130409,76.81103894)(172.87597072,76.06730563)
+ \xmulineto(174.56797068,75.23397231)
+(175.38663733,75.18757231)(177.06797063,75.82250563)
+ -- cycle
+(180.74663721,94.99383849)
+ \xmulineto(181.80397052,95.46890515)
+(183.28663716,96.71317178)(184.21463714,97.90637175)
+ \xmulineto(185.67730377,99.78077171)
+(185.81730377,100.19650503)(185.6106371,102.03503832)
+ \xmulineto(185.03197045,103.94743827)
+(184.16263714,107.0042382)(183.30797049,107.96357151)
+ \xmulineto(182.14130385,109.27037147)
+(182.27730384,109.91157146)(175.89597065,108.54130482)
+ \xmulineto(174.14130402,108.16570483)
+(172.75997072,107.97250484)(170.85597076,107.73397151)
+ \xmulineto(169.56263746,107.57823818)
+(169.75597079,107.18757152)(169.75063745,104.78077158)
+ \xmulineto(169.75063745,103.37463829)
+(169.57997079,101.20170501)(169.59330412,99.81623837)
+ \xmulineto(169.61997079,97.34903843)
+(170.10530411,96.85797178)(173.06797071,95.31623848)
+ \xmulineto(175.63197066,93.97770518)
+(178.24130393,93.86837185)(180.74663721,94.99383849)
+ -- cycle
+(427.64129844,64.04130592)
+ \xmulineto(426.07329847,65.33757256)
+(424.40663184,68.09277249)(423.55863186,69.41050579)
+ \xmulineto(421.93329856,71.94223906)
+(421.11596525,79.31103888)(421.21996524,80.97770551)
+ \xmulineto(421.34929857,83.09223879)
+(422.12529856,85.55170539)(423.77729852,86.5094387)
+ \xmulineto(424.9012985,87.15583869)
+(425.27729849,87.31103868)(426.56796513,85.45263873)
+ \xmulineto(429.1052984,81.81103882)
+(432.37063166,78.91157222)(434.62529828,76.83757227)
+ \xmulineto(437.82396488,73.98290568)
+(437.75063155,72.16050572)(436.21463158,69.15063913)
+ \xmulineto(435.3186316,67.10890585)
+(435.92263159,65.0517059)(434.22929829,64.33237258)
+ \xmulineto(431.71463168,63.28077261)
+(429.0372984,63.16570594)(427.64129844,64.04130592)
+ -- cycle
+(521.57329636,76.27557229)
+ \xmulineto(520.43329639,77.18237227)
+(517.87062978,77.23397226)(515.35996317,77.00943894)
+ \xmulineto(511.94396324,76.70170561)
+(510.25062995,76.20797229)(512.74529656,78.43130557)
+ \xmulineto(513.31862988,78.94743889)
+(514.64662985,80.39023885)(514.90662984,81.33757216)
+ \xmulineto(515.3652965,82.99903879)
+(514.71996318,83.20797212)(513.22529655,84.51570542)
+ \xmulineto(509.94929662,87.37983868)
+(507.03196335,88.79170531)(504.37596341,88.79170531)
+ \xmulineto(493.80263031,88.86317198)
+(484.17329719,88.68757198)(473.99063075,86.69650536)
+ \xmulineto(467.43863089,85.86317205)
+(461.30796436,84.14957209)(458.68796442,83.40063878)
+ \xmulineto(454.85463117,82.31103881)
+(452.59996455,79.54130554)(449.46929795,79.13557222)
+ \xmulineto(445.49596471,78.63917223)
+(443.22929809,79.08183889)(440.49596482,80.90063884)
+ \xmulineto(437.83996488,82.66050546)
+(437.41729822,83.64957211)(439.05863152,84.17090543)
+ \xmulineto(442.28263145,85.1913054)
+(442.03196478,85.1089054)(444.58929806,86.10890538)
+ \xmulineto(448.8186313,88.097972)
+(447.68263133,91.68757191)(447.53196466,93.85423852)
+ \xmulineto(446.85996468,99.03503839)
+(446.76663135,104.13023827)(446.19329803,109.00423815)
+ \xmulineto(445.60529804,114.00423802)
+(445.6879647,118.8490379)(444.13596474,122.22877115)
+ \xmulineto(443.59463142,123.27037113)
+(442.97996476,124.49903776)(442.97996476,124.91157109)
+ \xmulineto(442.97996476,126.10370439)
+(444.83996472,128.05170434)(445.6679647,129.12503765)
+ \xmulineto(447.51063133,131.52090426)
+(448.17729798,132.55170423)(450.3079646,135.27557083)
+ \xmulineto(451.14129792,136.3435708)
+(452.89596455,138.11957076)(454.20396452,139.92623738)
+ \xmulineto(455.72529782,142.024904)
+(456.65196446,140.33823737)(461.29729769,140.6355707)
+ \xmulineto(462.03729768,140.79690403)
+(463.93863097,141.07823735)(464.62529762,140.81157069)
+ \xmulineto(465.77729759,140.37423737)
+(465.85463093,140.20223738)(465.58396427,138.65023741)
+ \xmulineto(465.20396427,136.52090413)
+(465.6412976,136.4475708)(462.01596434,135.03557084)
+ \xmulineto(460.01596439,134.25957086)
+(457.34396445,132.58703756)(456.18796447,131.71317092)
+ \xmulineto(454.33463118,130.30223762)
+(450.76129793,127.99903768)(451.15196458,125.40637107)
+ \xmulineto(452.40129789,121.90637116)
+(454.50663118,121.64957117)(459.36529774,121.45263784)
+ \xmulineto(465.30796427,121.21317118)
+(466.50663091,120.06210454)(465.23996427,117.62503793)
+ \xmulineto(464.72929762,116.63917129)
+(463.46929765,116.49383796)(461.71463102,116.07823797)
+ \xmulineto(459.01063108,115.36317132)
+(457.09463112,114.23397135)(454.59463117,113.02463805)
+ -- (454.58929784,110.06730479)
+ \xmulineto(454.57863117,107.04130486)
+(455.38129782,106.13557155)(456.51596447,105.07823824)
+ \xmulineto(457.66796444,104.00943827)
+(459.85463106,104.20170493)(462.458631,105.09223824)
+ \xmulineto(467.73463088,106.8902382)
+(467.66796422,106.8798382)(468.62529753,105.92037156)
+ \xmulineto(469.42796418,105.11930491)
+(469.15196419,104.77557158)(468.60529753,103.63557161)
+ \xmulineto(466.70929757,101.93130499)
+(463.64129764,100.42037169)(461.73463102,99.40637172)
+ \xmulineto(460.40663105,98.73397173)
+(459.26663107,97.96890509)(457.64129777,97.01570511)
+ \xmulineto(456.25063114,96.87983845)
+(456.64663113,96.58183845)(456.5212978,94.11930518)
+ \xmulineto(456.4532978,92.73397188)
+(456.61063113,91.05170526)(456.86529779,90.37983861)
+ \xmulineto(457.31863111,89.18757197)
+(457.04796445,88.90637198)(459.78263106,89.1605053)
+
+ \xmulineto(463.46396431,89.48917196)
+(473.1159641,90.91517193)(478.43863065,91.73397191)
+ \xmulineto(486.04796381,92.90637188)
+(489.27196374,93.2449052)(498.10529688,93.71837186)
+ \xmulineto(503.75596342,93.39543853)
+(504.37596341,93.78077186)(504.81863007,98.11930508)
+ \xmulineto(505.60529672,103.42557162)
+(503.78263009,103.15583829)(501.20929681,104.02463827)
+ \xmulineto(500.31329683,104.2755716)
+(498.8346302,104.80583825)(498.50663021,105.20170491)
+ \xmulineto(497.99596355,105.81623823)
+(498.05863022,106.04650489)(498.95329686,106.77037153)
+ \xmulineto(501.57329681,108.43130483)
+(503.96396342,106.73970487)(506.90129669,107.73397151)
+ \xmulineto(507.56796334,107.94223817)
+(507.78663,109.13557148)(508.05329666,110.49903811)
+ \xmulineto(508.53196332,112.99903805)
+(508.71996331,113.52983803)(508.17329666,114.67610467)
+ \xmulineto(507.66796334,115.73397131)
+(507.51063001,116.43703796)(504.46929674,117.63557127)
+ \xmulineto(501.15196348,118.9474379)
+(500.72529682,119.45837122)(501.11063015,120.46890453)
+ \xmulineto(501.29196348,120.94223785)
+(502.14129679,121.01570452)(505.0159634,120.80583786)
+ \xmulineto(509.35462997,120.48290453)
+(509.43329663,120.54130453)(510.40662994,124.67090443)
+ \xmulineto(511.81862991,130.64957095)
+(510.9852966,133.55157087)(507.83463,133.65557087)
+ \xmulineto(506.33463003,133.9369042)
+(501.24529681,133.06730422)(500.88663015,134.59823751)
+ \xmulineto(500.78263016,135.1302375)
+(501.12529682,135.46357083)(501.99596346,135.67157082)
+ \xmulineto(504.72529674,136.83823746)
+(507.83996333,137.82757077)(510.13596328,139.43157073)
+ \xmulineto(512.78262989,141.35423735)
+(514.99596318,141.26490402)(519.23462975,139.0782374)
+ \xmulineto(525.22929628,135.98357081)
+(525.46396295,135.61957082)(523.42796299,132.61410423)
+ \xmulineto(517.90662978,122.25370449)
+(513.8239632,107.79170484)(512.44929657,95.96890513)
+ \xmulineto(511.53196325,90.86317193)
+(517.55862979,90.21317194)(520.1572964,89.52983863)
+ \xmulineto(522.69329634,88.87463864)
+(525.68796294,87.88503867)(526.87062958,88.31623866)
+ \xmulineto(530.7346295,89.78077195)
+(529.40129619,84.60370542)(532.40129613,80.85797217)
+ \xmulineto(534.8706294,77.77557225)
+(531.8759628,76.31103895)(529.90662951,75.70170564)
+ \xmulineto(526.73462958,75.17090565)
+(524.33462964,74.56730566)(521.57329636,76.27557229)
+ -- cycle
+(471.69329746,96.55170512)
+ \xmulineto(471.77729746,97.4689051)
+(472.18796412,98.86837173)(472.90129744,99.9063717)
+ \xmulineto(473.50129742,100.77037168)
+(474.08929741,102.39023831)(474.57863073,103.29690495)
+ \xmulineto(475.89196404,105.71317156)
+(474.99063072,106.37463821)(474.04263075,108.32250483)
+ \xmulineto(471.93863079,112.63023806)
+(469.84396417,109.04130481)(467.99596421,113.6657047)
+ \xmulineto(467.48529756,115.61930465)
+(467.90129755,116.43703796)(470.0532975,117.6965046)
+ \xmulineto(472.71463077,119.25890456)
+(474.15196408,118.9422379)(475.35996405,116.57823796)
+ \xmulineto(476.57863069,114.18757135)
+(481.53196391,111.0782381)(483.4852972,110.74850477)
+ \xmulineto(484.31329719,110.74850477)
+(486.90129713,113.84277136)(486.90129713,114.83237134)
+ \xmulineto(486.90129713,116.07823797)
+(487.99596377,116.57823796)(490.42263038,116.4255713)
+ \xmulineto(493.06263033,116.26463797)
+(493.50663032,115.96890464)(493.84929698,114.09797135)
+ \xmulineto(494.13596364,112.54130473)
+(493.87063031,112.11410474)(492.05329702,111.18237143)
+ \xmulineto(490.83463038,110.56210477)
+(490.02663039,110.14437145)(489.9066304,107.85797151)
+ \xmulineto(489.77196373,105.36317157)
+(490.46929705,105.42557157)(493.15196366,102.22357165)
+ \xmulineto(495.72529693,99.15583839)
+(495.7919636,97.61930509)(495.7919636,97.61930509)
+ \xmulineto(493.15196366,97.69130509)
+(490.55863038,97.79170509)(488.31863043,98.8058384)
+ \xmulineto(479.25063063,103.74850494)
+(478.03196399,97.05170511)(471.69329746,96.55170512)
+ -- cycle
+(44.21450689,119.26463789)
+ \xmulineto(41.44317362,120.19650454)
+(42.0583736,121.91157116)(41.18904029,124.04130444)
+ \xmulineto(40.26037364,126.25890439)
+(40.33437364,128.80223766)(41.36090695,130.07303763)
+ \xmulineto(42.13170693,131.02090427)
+(42.66770692,131.13917093)(47.29837349,131.37463759)
+ \xmulineto(51.81250672,131.89023758)
+(57.1573066,132.83810422)(61.13170652,133.8329042)
+ \xmulineto(65.89690641,134.20757086)
+(69.76610633,136.63023746)(74.12650623,137.18223745)
+ \xmulineto(79.10463945,138.59290408)
+(84.27130601,138.65023741)(88.91823924,140.27557071)
+ \xmulineto(93.83957246,141.23423735)
+(97.92703904,141.70757067)(103.03637226,139.84890405)
+ \xmulineto(104.26610556,139.37957073)
+(106.11503886,138.79157074)(107.14063883,138.54090408)
+ \xmulineto(110.31250543,137.71823744)
+(111.7661054,135.13957083)(111.7765054,132.96357089)
+ \xmulineto(111.33437208,125.98917106)
+(109.97917211,127.29690436)(104.82917222,125.98917106)
+ \xmulineto(101.07970563,125.03503775)
+(98.47397236,124.64437109)(95.88117242,124.64437109)
+ \xmulineto(91.91823917,124.68757109)
+(87.91823926,123.41517112)(84.21450601,123.11930446)
+ \xmulineto(79.21970612,122.73970447)
+(73.51143958,121.28597118)(70.56357297,119.64437122)
+ \xmulineto(60.99583985,116.05690464)
+(52.97024003,115.48863799)(44.21450689,119.26463789)
+ -- cycle
+(479.39196396,120.90637119)
+ \xmulineto(478.49063065,121.27037118)
+(478.97996397,122.67610448)(480.60529727,125.26463775)
+ \xmulineto(482.96929722,129.03503765)
+(481.86529724,129.72357097)(479.37063063,130.85423761)
+ \xmulineto(476.69863069,132.06730424)
+(475.11596406,132.89023756)(474.92263073,133.46357088)
+ \xmulineto(474.69863073,134.13023753)
+(476.03196403,135.40090416)(476.94929735,135.40090416)
+ \xmulineto(477.35996401,135.40090416)
+(478.61063064,134.66623751)(479.88129728,134.13557086)
+ \xmulineto(482.55863056,133.02983755)
+(484.43863052,133.55690421)(484.91729717,135.05690417)
+ \xmulineto(486.28663048,140.09290405)
+(484.46929718,140.19157071)(486.02663048,142.10357066)
+ \xmulineto(488.93863042,146.32757056)
+(489.40663041,146.36890389)(491.94396368,144.37957061)
+ \xmulineto(493.61063031,143.07290397)
+(493.90663031,141.20757068)(494.23996363,139.66623739)
+ \xmulineto(494.73996362,137.33823745)
+(493.65196365,135.78090415)(492.34396368,133.42090421)
+ \xmulineto(490.83463038,130.69130428)
+(490.52663038,130.72357094)(492.40663034,129.14957098)
+ \xmulineto(493.69863031,127.84277101)
+(494.0786303,127.36837103)(494.44929696,125.49903774)
+ \xmulineto(494.44929696,125.49903774)
+(492.19863035,125.32717108)(491.65196369,125.49903774)
+ \xmulineto(489.7506304,126.10370439)
+(489.79729706,126.69130438)(488.53729709,125.80583773)
+ \xmulineto(487.21996379,124.87463775)
+(485.81863049,123.86317111)(482.83996388,122.07303782)
+ \xmulineto(481.31329725,121.15530451)
+(480.29729727,120.54130453)(479.39196396,120.90637119)
+ -- cycle
+;
+}
+% \end{macrocode}
+
+%</logo>
+% \end{implementation}
+% \Finale
+\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/source/latex/xpinyin/xpinyin.dtx b/Master/texmf-dist/source/latex/xpinyin/xpinyin.dtx
index 8d50b231f21..2983f3c5455 100644
--- a/Master/texmf-dist/source/latex/xpinyin/xpinyin.dtx
+++ b/Master/texmf-dist/source/latex/xpinyin/xpinyin.dtx
@@ -26,7 +26,7 @@ Issues and pull requests are welcome.
Copyright and Licence
---------------------
- Copyright (C) 2012-2019 by Qing Lee <sobenlee@gmail.com>
+ Copyright (C) 2012-2020 by Qing Lee <sobenlee@gmail.com>
----------------------------------------------------------------------
This work may be distributed and/or modified under the
@@ -39,7 +39,7 @@ Copyright and Licence
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'.
+ This work has the LPPL maintenance status "maintained".
The Current Maintainer of this work is Qing Lee.
@@ -81,7 +81,7 @@ Copyright and Licence
\preamble
- Copyright (C) 2012-2019 by Qing Lee <sobenlee@gmail.com>
+ Copyright (C) 2012-2020 by Qing Lee <sobenlee@gmail.com>
--------------------------------------------------------------------------
This work may be distributed and/or modified under the
@@ -94,7 +94,7 @@ Copyright and Licence
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'.
+ This work has the LPPL maintenance status "maintained".
The Current Maintainer of this work is Qing Lee.
@@ -167,12 +167,12 @@ Copyright and Licence
%</internal>
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\RequirePackage{expl3}
-%<+package>\GetIdInfo$Id: xpinyin.dtx 81bb941 2019-04-07 23:27:58 +0800 Qing Lee <sobenlee@gmail.com> $
+%<+package>\GetIdInfo$Id: xpinyin.dtx d74fa10 2020-10-19 20:23:41 +0800 Qing Lee <sobenlee@gmail.com> $
%<package> {Automatically add pinyin to Chinese characters}
%<package>\ProvidesExplPackage{\ExplFileName}
-%<package> {\ExplFileDate}{2.7}{\ExplFileDescription}
+%<package> {\ExplFileDate}{2.9}{\ExplFileDescription}
%<database>\ProvidesFile{xpinyin-database.def}%
-%<database> [2019/04/07 v2.7 xpinyin database]
+%<database> [2020/10/19 v2.9 xpinyin database]
%<*driver>
\documentclass{ctxdoc}
\usepackage{xpinyin}
@@ -186,7 +186,7 @@ Copyright and Licence
%</driver>
% \fi
%
-% \CheckSum{696}
+% \CheckSum{691}
% \GetFileId{xpinyin.sty}
%
% \title{\bfseries\pkg{xpinyin} 宏包}
@@ -359,14 +359,14 @@ Copyright and Licence
% \begin{syntax}
% format = \Arg{format}
% \end{syntax}
-% 设置拼音的其它格式,例如颜色等,缺省值为空。
+% 设置拼音的其他格式,例如颜色等,缺省值为空。
% \end{function}
%
% \begin{function}{multiple}
% \begin{syntax}
% multiple = \Arg{format}
% \end{syntax}
-% 设置多音字拼音的其它格式,缺省值为空。可以通过这个选项来提醒校正多音字的拼音。例如
+% 设置多音字拼音的其他格式,缺省值为空。可以通过这个选项来提醒校正多音字的拼音。例如
% 本文档设置多音字拼音的颜色是红色(需要载入 \pkg{color} 宏包):
% \begin{frameverb}
% \xpinyinsetup{multiple={\color{red}}}
@@ -467,7 +467,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_UTF_char:nn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_UTF_char:nn #1#2
+\cs_new_protected:Npn \@@_UTF_char:nn #1#2
{
\cs_if_exist:cF { u8:#1 }
{ \tl_const:cn { u8:#1 } {#2} }
@@ -478,14 +478,14 @@ Copyright and Licence
%
% \begin{macro}{\@@_GBK_char:nn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_GBK_char:nn #1#2
+\cs_new_protected:Npn \@@_GBK_char:nn #1#2
{
\@@_UTF_char:nn {#1} {#2}
\exp_args:Nx \@@_GBK_char_aux:nn { \tl_head:n {#1} } {#1}
}
-\cs_new_protected_nopar:Npn \@@_GBK_char_aux:nn #1#2
+\cs_new_protected:Npn \@@_GBK_char_aux:nn #1#2
{ \exp_args:Nf \@@_GBK_char_aux:nnn { \int_eval:n { `#1 } } {#1} {#2} }
-\cs_new_protected_nopar:Npn \@@_GBK_char_aux:nnn #1#2#3
+\cs_new_protected:Npn \@@_GBK_char_aux:nnn #1#2#3
{
\cs_if_exist:cF { @@_UTF_ #1 :w }
{
@@ -505,9 +505,9 @@ Copyright and Licence
\char_set_catcode_active:n {#1}
}
}
-\cs_new_protected_nopar:Npn \@@_GBK_char_def:nnn #1#2#3
+\cs_new_protected:Npn \@@_GBK_char_def:nnn #1#2#3
{
- \cs_new_protected_nopar:cpn { @@_UTF_ #2 :w } #1
+ \cs_new_protected:cpn { @@_UTF_ #2 :w } #1
{ \use:c { u8: \tl_to_str:n { #3#1 } } }
}
\tl_new:N \c_@@_reset_UTF_catcode_tl
@@ -518,7 +518,7 @@ Copyright and Licence
% \begin{macrocode}
\group_begin:
\char_set_catcode_active:n { 126 }
-\cs_new_protected_nopar:Npn \@@_save_UTF_cs:Nn #1#2
+\cs_new_protected:Npn \@@_save_UTF_cs:Nn #1#2
{
\group_begin:
\char_set_lccode:nn { 126 } {#2}
@@ -592,7 +592,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_make_pinyin_box:nnn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_make_pinyin_box:nnn #1#2#3
+\cs_new_protected:Npn \@@_make_pinyin_box:nnn #1#2#3
{
\@@_leavevmode:
\hbox_overlap_right:n
@@ -601,14 +601,12 @@ Copyright and Licence
{ \@@_CJKsymbol_hook: \@@_save_CJKsymbol:n {#2} }
\hbox_set:Nn \l_@@_tmpb_box
{
- \color_group_begin: \color_ensure_current:
\l_@@_pinyin_box_hook_tl
\@@_select_font:
\clist_if_exist:cTF { c_@@_multiple_ #1 _clist }
{ \l_@@_multiple_tl \l_@@_format_tl }
{ \l_@@_format_tl }
{#3}
- \color_group_end:
}
\dim_compare:nNnT
{ \box_wd:N \l_@@_tmpb_box } >
@@ -637,9 +635,9 @@ Copyright and Licence
%
% \begin{macro}{\@@_CJKsymbol:n}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_CJKsymbol:n #1
+\cs_new_protected:Npn \@@_CJKsymbol:n #1
{ \@@_CJKsymbol:xn { \@@_to_unicode:n {#1} } {#1} }
-\cs_new_protected_nopar:Npn \@@_CJKsymbol:nn #1#2
+\cs_new_protected:Npn \@@_CJKsymbol:nn #1#2
{
\@@_make_pinyin_box:nnn {#1} {#2} { \use:c { c_@@_ #1 _tl } }
\@@_save_CJKsymbol:n {#2}
@@ -691,7 +689,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_CJKglue:}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_CJKglue:
+\cs_new_protected:Npn \@@_CJKglue:
{ \skip_horizontal:n { \l_@@_hsep_tl } }
% \end{macrocode}
% \end{macro}
@@ -733,7 +731,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_restore_footnote:}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_restore_footnote:
+\cs_new_protected:Npn \@@_restore_footnote:
{
\bool_if:NF \l_@@_footnote_bool
{ \tl_put_left:Nn \@parboxrestore { \l_@@_restore_footnote_tl } }
@@ -760,19 +758,19 @@ Copyright and Licence
%
% \begin{macro}{\@@_single_aux:nn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_single_aux:nn #1#2
+\cs_new_protected:Npn \@@_single_aux:nn #1#2
{
\@@_replace_CJKsymbol_single:n {#2}
#1
\group_end:
}
-\cs_new_protected_nopar:Npn \@@_replace_CJKsymbol_single_aux:n #1
+\cs_new_protected:Npn \@@_replace_CJKsymbol_single_aux:n #1
{
\bool_if:NF \l_@@_enable_bool { \@@_replace_CJKsymbol: }
- \cs_set_protected_nopar:Npn \CJKsymbol ##1
+ \cs_set_protected:Npn \CJKsymbol ##1
{ \@@_single_CJKsymbol:nn {##1} {#1} }
}
-\cs_new_protected_nopar:Npn \@@_single_CJKsymbol:nn #1#2
+\cs_new_protected:Npn \@@_single_CJKsymbol:nn #1#2
{
\@@_make_pinyin_box:xnn
{ \@@_to_unicode:n {#1} } {#1} { \@@_pinyin:n {#2} }
@@ -783,7 +781,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_replace_CJKsymbol_aux:}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_replace_CJKsymbol_aux:
+\cs_new_protected:Npn \@@_replace_CJKsymbol_aux:
{
\cs_set_eq:NN \@@_save_CJKsymbol:n \CJKsymbol
\cs_set_eq:NN \CJKsymbol \@@_CJKsymbol:n
@@ -793,14 +791,14 @@ Copyright and Licence
%
% \begin{macro}{\@@_restore_CJKsymbol_aux:}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_restore_CJKsymbol_aux:
+\cs_new_protected:Npn \@@_restore_CJKsymbol_aux:
{ \cs_set_eq:NN \CJKsymbol \@@_save_CJKsymbol:n }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_select_font_xetex:}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_select_font_xetex:
+\cs_new_protected:Npn \@@_select_font_xetex:
{
\cs_if_exist_use:cF { \l_@@_coor_tl }
{
@@ -818,7 +816,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_select_font_aux:}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_select_font_aux:
+\cs_new_protected:Npn \@@_select_font_aux:
{
\fontsize
{ \l_@@_ratio_tl \tex_dimexpr:D \f@size pt \scan_stop: }
@@ -832,21 +830,21 @@ Copyright and Licence
%
% \begin{macro}{\@@_to_unicode_xetex:n}
% \begin{macrocode}
-\cs_new_nopar:Npn \@@_to_unicode_xetex:n #1
+\cs_new:Npn \@@_to_unicode_xetex:n #1
{ \int_to_arabic:n { `#1 } }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_UTF_to_unicode:n,\@@_UTFchar_to_unicode:n}
% \begin{macrocode}
-\cs_new_nopar:Npn \@@_UTF_to_unicode:n #1
+\cs_new:Npn \@@_UTF_to_unicode:n #1
{
\int_to_arabic:n
{ \exp_args:No \int_from_hex:n { \CJK@plane } * "100 + #1 }
}
-\cs_new_nopar:Npn \@@_UTFchar_to_unicode:n #1
+\cs_new:Npn \@@_UTFchar_to_unicode:n #1
{ \int_to_arabic:n { \@@_UTF_viii_to_unicode:NNNw #1 \q_stop } }
-\cs_new_nopar:Npn \@@_UTF_viii_to_unicode:NNNw #1#2#3#4 \q_stop
+\cs_new:Npn \@@_UTF_viii_to_unicode:NNNw #1#2#3#4 \q_stop
{
\tl_if_empty:nTF {#4}
{ ( `#1 - "E0 ) * "1000 + ( `#2 - "80 ) * "40 + ( `#3 - "80 ) }
@@ -857,16 +855,16 @@ Copyright and Licence
%
% \begin{macro}{\@@_GBK_to_unicode:n,\@@_GBKchar_to_unicode:n}
% \begin{macrocode}
-\cs_new_nopar:Npn \@@_GBK_to_unicode:n #1
- { \int_to_arabic:n { " \CJKtu_sfd_map:nn { \CJK@plane } {#1} } }
-\cs_new_nopar:Npn \@@_GBKchar_to_unicode:n #1
- { \int_to_arabic:n { " \CJKchartouni {#1} } }
+\cs_new:Npn \@@_GBK_to_unicode:n
+ { \CJKtu_sfd_map:nn { \CJK@plane } }
+\cs_new:Npn \@@_GBKchar_to_unicode:n
+ { \CJKtu_char_to_unicode:n }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_adjust_xeCJK_hook:}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_adjust_xeCJK_hook:
+\cs_new_protected:Npn \@@_adjust_xeCJK_hook:
{
\cs_new_eq:NN \@@_select_font: \@@_select_font_xetex:
\cs_new_eq:NN \@@_to_unicode:n \@@_to_unicode_xetex:n
@@ -891,7 +889,7 @@ Copyright and Licence
}
}
\cs_new_eq:NN \@@_leavevmode: \prg_do_nothing:
- \cs_new_protected_nopar:Npx \@@_CJKsymbol_hook:
+ \cs_new_protected:Npx \@@_CJKsymbol_hook:
{
\exp_not:N \makexeCJKinactive
\cs_if_exist_use:NF \xeCJK_select_font:
@@ -903,7 +901,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_adjust_CJK_hook:}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_adjust_CJK_hook:
+\cs_new_protected:Npn \@@_adjust_CJK_hook:
{
\bool_if:NTF \g_@@_GBK_bool
{
@@ -941,15 +939,15 @@ Copyright and Licence
%
% \begin{macro}{\@@_adjust_CJKpunct_hook:}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_adjust_CJKpunct_hook:
+\cs_new_protected:Npn \@@_adjust_CJKpunct_hook:
{
- \cs_new_protected_nopar:Npn \@@_restore_CJKsymbol:
+ \cs_new_protected:Npn \@@_restore_CJKsymbol:
{
\int_compare:nNnTF { \CJKpunct@punctstyle } = { \CJKpunct@ps@plain }
{ \@@_restore_CJKsymbol_aux: }
{ \cs_set_eq:NN \CJKosymbol \@@_save_CJKsymbol:n }
}
- \cs_new_protected_nopar:Npn \@@_replace_CJKsymbol:
+ \cs_new_protected:Npn \@@_replace_CJKsymbol:
{
\int_compare:nNnTF { \CJKpunct@punctstyle } = { \CJKpunct@ps@plain }
{ \@@_replace_CJKsymbol_aux: }
@@ -958,14 +956,14 @@ Copyright and Licence
\cs_set_eq:NN \CJKosymbol \@@_CJKsymbol:n
}
}
- \cs_new_protected_nopar:Npn \@@_replace_CJKsymbol_single:n ##1
+ \cs_new_protected:Npn \@@_replace_CJKsymbol_single:n ##1
{
\int_compare:nNnTF { \CJKpunct@punctstyle } = { \CJKpunct@ps@plain }
{ \@@_replace_CJKsymbol_single_aux:n { ##1 } }
{
\bool_if:NF \l_@@_enable_bool
{ \cs_set_eq:NN \@@_save_CJKsymbol:n \CJKosymbol }
- \cs_set_protected_nopar:Npn \CJKosymbol ####1
+ \cs_set_protected:Npn \CJKosymbol ####1
{ \@@_single_CJKsymbol:nn { ####1 } { ##1 } }
}
}
@@ -991,7 +989,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_pinyin:n}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_pinyin:n #1
+\cs_new_protected:Npn \@@_pinyin:n #1
{
\@@_pinyin_init:
\bool_set_true:N \l_@@_first_bool
@@ -1003,7 +1001,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_pinyin_aux:n}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_pinyin_aux:n #1
+\cs_new_protected:Npn \@@_pinyin_aux:n #1
{
\quark_if_recursion_tail_stop_do:nn {#1}
{
@@ -1039,7 +1037,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_tone:nn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_tone:nn #1#2
+\cs_new_protected:Npn \@@_tone:nn #1#2
{ \use:c { @@_num_to_tone_ #1 :Nn } {#1} {#2} }
\cs_generate_variant:Nn \@@_tone:nn { V }
% \end{macrocode}
@@ -1047,7 +1045,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_replace_v:n}
% \begin{macrocode}
-\cs_new_nopar:Npn \@@_replace_v:n #1
+\cs_new:Npn \@@_replace_v:n #1
{
\str_if_eq:nnTF {#1} { v }
{
@@ -1062,7 +1060,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_pinyin_init:}
% \begin{macrocode}
-\cs_new_nopar:Npn \@@_pinyin_init:
+\cs_new:Npn \@@_pinyin_init:
{
\tl_clear:N \l_@@_pre_tl \tl_clear:N \l_@@_post_tl
\tl_clear:N \l_@@_item_tl \tl_clear:N \l_@@_tone_tl
@@ -1100,19 +1098,19 @@ Copyright and Licence
%
% \begin{macro}{\@@_num_to_tone:Nn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \@@_num_to_tone:Nn #1#2
+\cs_new_protected:Npn \@@_num_to_tone:Nn #1#2
{
\if_case:w \int_eval:n { #2 - 1 } \exp_stop_f:
\= {#1} \or: \'{#1} \or: \v {#1} \or: \` {#1} \else: #1 \fi:
}
\tl_map_inline:nn { a o e u }
{ \cs_new_eq:cN { @@_num_to_tone_ #1 :Nn } \@@_num_to_tone:Nn }
-\cs_new_nopar:Npn \@@_num_to_tone_i:Nn #1#2
+\cs_new:Npn \@@_num_to_tone_i:Nn #1#2
{
\if_case:w \int_eval:n { #2 - 1 } \exp_stop_f:
ī \or: í \or: ǐ \or: ì \else: i \fi:
}
-\cs_new_protected_nopar:Npn \@@_num_to_tone_v:Nn #1#2
+\cs_new_protected:Npn \@@_num_to_tone_v:Nn #1#2
{
\str_case:onTF { \l_@@_pre_tl }
{ { l } { } { n } { } { L } { } { N } { } }
@@ -1150,10 +1148,10 @@ Copyright and Licence
%
% \begin{macro}[int]{\xpinyin_customary:nnn,\xpinyin_multiple:nnn}
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \xpinyin_customary:nnn #1#2#3
- { \cs_gset_nopar:cpn { c_@@_ #2 _tl } {#3} }
-\cs_new_protected_nopar:Npn \xpinyin_multiple:nnn #1#2#3
- { \cs_gset_nopar:cpn { c_@@_multiple_ #2 _clist } {#3} }
+\cs_new_protected:Npn \xpinyin_customary:nnn #1#2
+ { \cs_gset_nopar:cpn { c_@@_ #2 _tl } }
+\cs_new_protected:Npn \xpinyin_multiple:nnn #1#2
+ { \cs_gset_nopar:cpn { c_@@_multiple_ #2 _clist } }
% \end{macrocode}
% \end{macro}
%
diff --git a/Master/texmf-dist/source/latex/xpinyin/xpinyin.ins b/Master/texmf-dist/source/latex/xpinyin/xpinyin.ins
index bc0657b87a2..bc25db75014 100644
--- a/Master/texmf-dist/source/latex/xpinyin/xpinyin.ins
+++ b/Master/texmf-dist/source/latex/xpinyin/xpinyin.ins
@@ -6,7 +6,7 @@
%%
%% xpinyin.dtx (with options: `install')
%%
-%% Copyright (C) 2012-2019 by Qing Lee <sobenlee@gmail.com>
+%% Copyright (C) 2012-2020 by Qing Lee <sobenlee@gmail.com>
%% --------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
@@ -19,7 +19,7 @@
%% 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'.
+%% This work has the LPPL maintenance status "maintained".
%%
%% The Current Maintainer of this work is Qing Lee.
%%
@@ -45,7 +45,7 @@
\preamble
- Copyright (C) 2012-2019 by Qing Lee <sobenlee@gmail.com>
+ Copyright (C) 2012-2020 by Qing Lee <sobenlee@gmail.com>
--------------------------------------------------------------------------
This work may be distributed and/or modified under the
@@ -58,7 +58,7 @@
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'.
+ This work has the LPPL maintenance status "maintained".
The Current Maintainer of this work is Qing Lee.
diff --git a/Master/texmf-dist/source/latex/yathesis/yathesis-samples-templates.dtx b/Master/texmf-dist/source/latex/yathesis/yathesis-samples-templates.dtx
index 21f61061e9b..8c8ec7cc9f0 100644
--- a/Master/texmf-dist/source/latex/yathesis/yathesis-samples-templates.dtx
+++ b/Master/texmf-dist/source/latex/yathesis/yathesis-samples-templates.dtx
@@ -9,9 +9,17 @@
%</flat-template|these-master>
%<*these-sample|flat-sample>
%<<COMMENT
-% Document de classe yathesis, en 12 points, interligne un et demi, et version finale
-%COMMENT
-\documentclass[12pt,space=onehalf,version=final]{yathesis}
+% Document :
+% - de classe yathesis ;
+% - en 12 points ;
+% - en version finale ;
+% - dont la partie principale :
+% - est en interligne un et demi ;
+% - voit chaque chapitre :
+% - débuter par sa table des matières locale ;
+% - finir par sa bibliographie locale.
+%COMMENT
+\documentclass[12pt,version=final,space=onehalf,localtocs,localbibs]{yathesis}
%</these-sample|flat-sample>
%<*these-sample|flat-sample|flat-template|these-master>
%<<COMMENT
@@ -211,7 +219,7 @@
%
% Numéro de version du package pgfplots
%COMMENT
-\pgfplotsset{compat=1.16}
+\pgfplotsset{compat=1.17}
%<<COMMENT
%
% Ajustement pour éviter, dans la table des matières, des débordements de
@@ -820,11 +828,11 @@ suis certain qu'il sera \enquote{hors-texte} :
%<these-master>% \include{corps/}
%<these-sample>\include{corps/developpementI}
%<*developpementI-sample|flat-sample>
-\chapter{Développement}
+\chapter{Développement du chaos du rire}
\label{chap-developpement}
\epigraphhead[30]{\selectlanguage{english}\epigraph{I have not failed. I've
- just found 10.000 ways that won't work.}{Thomas A. Edison}}
+ just found \num{10000} ways that won't work.}{Thomas A. Edison}}
Dans ce chapitre, nous développons notre travail. Nous citons une
référence\index{référence!bibliographique|see{bibliographie}}
@@ -997,7 +1005,7 @@ optionnel de la commande de sectionnement qui a permis cela.
%<these-master>% \include{corps/}
%<these-sample>\include{corps/conclusionI}
%<*conclusionI-sample|flat-sample>
-\chapter{Conclusion}
+\chapter{Conclusion du chaos du rire}
Dans ce chapitre, nous concluons l'étude du chaos du rire.
\lipsum[26-27]
@@ -1061,7 +1069,7 @@ Dans ce chapitre, nous concluons l'étude du chaos du rire.
%<these-master>% \include{corps/}
%<these-sample>\include{corps/developpementII}
%<*developpementII-sample|flat-sample>
-\chapter{Développement}
+\chapter{Développement du rire du chaos}
Nous pouvons faire référence à des graphiques (très jolis au demeurant), comme
celui de la figure~\vref{sin-x*sin-y}.
@@ -1094,7 +1102,7 @@ celui de la figure~\vref{sin-x*sin-y}.
%<these-master>% \include{corps/}
%<these-sample>\include{corps/conclusionII}
%<*conclusionII-sample|flat-sample>
-\chapter{Conclusion}
+\chapter{Conclusion du rire du chaos}
Dans ce chapitre, nous concluons l'étude du rire du chaos.
\lipsum[6-9]
@@ -1320,7 +1328,7 @@ int factorielle(int n)
editor = {O'Connor, Arhur and Arago, François},
title = {Discours prononcé à l'Assemblée Nationale au nom de
l'Académie des Sciences à la séance du
- \formatdate{12}{06}{1790}},
+ \DTMdate{1790-06-12}},
booktitle = {Œuvres de Condorcet},
publisher = {Firmin Didot Frères},
address = {Paris},
diff --git a/Master/texmf-dist/source/latex/yathesis/yathesis.dtx b/Master/texmf-dist/source/latex/yathesis/yathesis.dtx
index f273156bbe3..025220931df 100644
--- a/Master/texmf-dist/source/latex/yathesis/yathesis.dtx
+++ b/Master/texmf-dist/source/latex/yathesis/yathesis.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2012-2020 by Denis Bitouz'e <denis.bitouze@univ-littoral.fr>
+% Copyright (C) 2012-2021 by Denis Bitouz'e <denis.bitouze@univ-littoral.fr>
% -------------------------------------------------------------------------------
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
@@ -23,7 +23,7 @@
%<*readme>
-----------------------------------------------------------------------
-- `yathesis` --- Yet Another Thesis Class, version 1.0.1
+- `yathesis` --- Yet Another Thesis Class, version 1.0.5
- E-mail: `denis.bitouze@univ-littoral.fr`
- Released under the LaTeX Project Public License v1.3c or later. See
http://www.latex-project.org/lppl.txt
@@ -55,7 +55,7 @@ Typesetting the documentation of the class requires:
with `yathesis-demo` package load at first place. If `latexmk` is available,
it is easier to run:
- latexmk -g -norc -r ./latexmkrc -jobname=these -pdflatex="pdflatex %O '\RequirePackage{etoolbox}\AtEndPreamble{\RequirePackage{yathesis-demo}}\input{%S}'" these.tex
+ latexmk -g -norc -r ./latexmkrc -jobname=these -pdflatex="pdflatex %O '\AddToHook{begindocument/before}{\RequirePackage{yathesis-demo}}\input{%S}'" these.tex
- to compile `yathesis-fr.tex` to be found in the
`.../doc/latex/yathesis/french/documentation` directory as follows:
@@ -69,11 +69,15 @@ Typesetting the documentation of the class requires:
\expandafter\begingroup
\fi
%</internal>
+%<*class|install>
+\def\yathesisversion{1.0.5}
+\def\yathesisdate{2021-02-05}
+%</class|install>
%<*install>
\input docstrip.tex
\Msg{********************************************************}
\Msg{* Installation}
-\Msg{* Class: yathesis 2020-03-28 v1.0.1}
+\Msg{* Class: yathesis \yathesisdate\space v\yathesisversion}
\Msg{* that helps to write thesis following French rules (DB)}
\Msg{********************************************************}
\keepsilent
@@ -87,7 +91,7 @@ See http://www.latex-project.org/lppl.txt
-----------------------------------------------------------------------
\endpreamble
\postamble
-% Copyright (C) 2012-2020 by Denis Bitouzé <denis.bitouze@univ-littoral.fr>
+% Copyright (C) 2012-2021 by Denis Bitouzé <denis.bitouze@univ-littoral.fr>
----------------------------------------------------------------------------------
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
@@ -128,7 +132,7 @@ This work consists of the file yathesis.dtx
\def\YAD@treesample{\YAD@examples/\YAD@sample/en-arborescence}
%</install>
%<*install>
-\usedir{doc/latex/\YAD@classname/}
+\usedir{doc/latex/\YAD@classname}
\generate{
\nopreamble\nopostamble
\file{README.md}{\from{\jobname.dtx}{readme}}
@@ -265,15 +269,7 @@ This work consists of the file yathesis.dtx
\fi
%</internal>
% \fi
-% \def\YADnblastversion{1.0.1}
-% \def\YADdatelastversion{\today}
-% \def\fileversion{v\YADnblastversion}
-% \def\filedate{\YADdatelastversion}
% \iffalse
-%<*class>
-\def\fileversion{v1.0.1}
-\def\filedate{2020/03/28}
-%</class>
%<*driver>
\ProvidesFile{yathesis.dtx}
\RequirePackage{scrlfile}
@@ -282,6 +278,7 @@ This work consists of the file yathesis.dtx
\documentclass[english,french]{ltxdoc}
\usepackage[yad]{denisbdoc}
\lstMakeShortInline[style=dbtex]"
+%"
\usepackage[lining]{libertine}
\renewcommand{\ttdefault}{lmtt}
\makeatletter
@@ -364,9 +361,14 @@ This work consists of the file yathesis.dtx
%
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
-\ProvidesClass{yathesis}[\filedate\space\fileversion\space Yet another class for writing thesis (DB)]
+\ProvidesClass{yathesis}[\yathesisdate\space v\yathesisversion\space Yet another class for writing thesis (DB)]
% \end{macrocode}
%
+% Pour pouvoir disposer d'autant de \enquote{flots} d'écriture dans
+% des fichiers annexes que nécessaire.
+% \begin{macrocode}
+\RequirePackage{morewrites}%
+% \end{macrocode}
% Pour pouvoir définir des macros dont les arguments puissent être
% spécifiés sous la forme "clé="\meta{valeur}, tant en argument de
% "\documentclass" que de macros et environnements de la classe.
@@ -382,17 +384,6 @@ This work consists of the file yathesis.dtx
% \begin{macrocode}
\RequirePackage{xpatch}[2012/10/02]%
% \end{macrocode}
-% Pour pouvoir disposer d'autant de \enquote{flots} d'écriture dans
-% des fichiers annexes que nécessaire. Il est chargé en fin de préambule sans
-% quoi la compilation s'arrête longuement à la ligne :
-% \folder{/usr/local/texlive/.../texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg}
-% (problème rapporté à l'auteur du package) ou à la ligne :
-% \folder{/usr/local/texlive/.../texmf-dist/tex/latex/floatrow/fr-longtable.sty}.
-% \begin{macrocode}
-\AtEndPreamble{%
- \RequirePackage{morewrites}%
-}%
-% \end{macrocode}
% Pour pouvoir patcher des commandes à argument(s) optionnel(s)
% \begin{macrocode}
\RequirePackage{filehook}[2011/10/12]%
@@ -448,8 +439,10 @@ This work consists of the file yathesis.dtx
\newbool{YAD@valid@month}
\newbool{YAD@valid@year}
\newbool{YAD@mainmatter@used}
+\newbool{YAD@mainmatter}
\newbool{YAD@backmatter}
\newbool{YAD@localtocs}%
+\newbool{YAD@localbibs@used}%
\newbool{YAD@nextwithlocaltoc}%
\newbool{YAD@nonnumbered@chapter}%
\newbool{YAD@nonnumbered@section}%
@@ -611,7 +604,6 @@ This work consists of the file yathesis.dtx
#1/false/.code={%
\boolfalse{YAD@#1}%
},
- #1/.initial=false,
#1/.default=true,
}%
% }{%
@@ -756,7 +748,6 @@ This work consists of the file yathesis.dtx
\boolfalse{YAD@submitted@work@star}%
\booltrue{YAD@final@work}%
},%
- version/.initial=final%
}%
\yadsetup{version=inprogress}%
% \end{macrocode}
@@ -776,8 +767,8 @@ This work consists of the file yathesis.dtx
\booltrue{YAD@output@paper@star}%
},%
output/screen/.code={},%
- output/.initial=screen%
}%
+\yadsetup{output=screen}%
% \end{macrocode}
%
% On définit la clé de classe "localtocs" qui fait que les titres des chapitres
@@ -828,24 +819,24 @@ This work consists of the file yathesis.dtx
%
% On définit la clé de classe "localbibs" qui fait que les chapitres
% contenant des références bibliographiques sont automatiquement terminées par
-% leurs bibliographies locales.
+% leurs bibliographies locales.
% \begin{macrocode}
\newcommand\YAD@localbibs@common@code[1]{%
\booltrue{YAD@localbibs}%
- \AtEndPreamble{%
+ \AddToHook{env/document/before}[YAD/loadcsquotesbiblatex]{%
+ \@ifpackageloaded{csquotes}{%
+ }{%
+ \RequirePackage{csquotes}%
+ }%
\@ifpackageloaded{biblatex}{%
}{%
- \@ifpackageloaded{csquotes}{%
- }{%
- \RequirePackage{csquotes}%
- }%
\YAD@ClassWarningNoLine{%
L'ajout automatique des bibliographies locales en fin\MessageBreak%
de chapitres fourni par l'option de classe\MessageBreak%
`localbibs' repose sur le package `biblatex'\MessageBreak%
que vous n'avez pas chargé.\MessageBreak%
La classe `yathesis' va le faire pour vous mais\MessageBreak%
- le recours a ce package pour la bibliographie sera\MessageBreak%
+ le recours à ce package pour la bibliographie sera\MessageBreak%
alors necessaire et exclura tout autre outil\MessageBreak%
de production de la bibliographie\MessageBreak%
(notamment `BibTeX')%
@@ -856,8 +847,8 @@ This work consists of the file yathesis.dtx
refsegment=chapter,%
defernumbers=#1%
}%
- \AfterEndPreamble{\newrefsegment}%
}%
+ \DeclareHookRule{env/document/before}{YAD/loadcsquotesbiblatex}{before}{hyperref}%
}
\yadsetup{%
localbibs*/.code={%
@@ -865,6 +856,7 @@ This work consists of the file yathesis.dtx
},%
localbibs/.code={%
\YAD@localbibs@common@code{false}%
+ \AddToHook{begindocument/before}{\BiblatexSplitbibDefernumbersWarningOff}%
}%
}
% \end{macrocode}
@@ -876,8 +868,8 @@ This work consists of the file yathesis.dtx
space/single/.code={\def\YAD@interligne{single}},%
space/onehalf/.code={\def\YAD@interligne{onehalf}},%
space/double/.code={\def\YAD@interligne{double}},%
- space/.initial=single%
}%
+\yadsetup{space=single}
% \end{macrocode}
%
% \begin{macrocode}
@@ -894,8 +886,8 @@ This work consists of the file yathesis.dtx
colophon-location/nowhere/.code={\def\YAD@colophon@location{nowhere}},%
colophon-location/verso-frontcover/.code={\def\YAD@colophon@location{verso-frontcover}},%
colophon-location/recto-backcover/.code={\def\YAD@colophon@location{recto-backcover}},%
- colophon-location/.initial=verso-frontcover%
}%
+\yadsetup{colophon-location=verso-frontcover}
% \end{macrocode}
%
% \begin{macrocode}
@@ -932,7 +924,7 @@ This work consists of the file yathesis.dtx
%
% \begin{macrocode}
\PassOptionsToPackage{a4paper}{geometry}%
-\PassOptionsToPackage{nodayofweek}{datetime}%
+% \PassOptionsToPackage{nodayofweek}{datetime}%
\PassOptionsToPackage{export}{adjustbox}%
\PassOptionsToPackage{numbered}{bookmark}%
% \PassOptionsToPackage{pagestyles}{titlesec}%
@@ -957,11 +949,10 @@ This work consists of the file yathesis.dtx
setspace/.code={\PassOptionsToPackage{#1}{setspace}},%
xcolor/.code={\PassOptionsToPackage{#1}{xcolor}},%
datatool/.code={\PassOptionsToPackage{#1}{datatool}},%
- titleps/.code={\PassOptionsToPackage{#1}{titleps}},%
titlesec/.code={\PassOptionsToPackage{#1}{titlesec}},%
draftwatermark/.code={\PassOptionsToPackage{#1}{draftwatermark}},%
babel/.code={\PassOptionsToPackage{#1}{babel}},%
- datetime/.code={\PassOptionsToPackage{#1}{datetime}}%
+ datetime2/.code={\PassOptionsToPackage{useregional,#1}{datetime2}}%
}%
% \end{macrocode}
%
@@ -971,6 +962,25 @@ This work consists of the file yathesis.dtx
}%
% \end{macrocode}
%
+%
+% Pour éviter certains comportements inattendus, on précise la langue
+% principale au moyen de l'option "main" du \Package{babel}. Mais, comme
+% celle-ci n'est apparue que récemment, on n'y recourt que si la version du
+% package est assez récente.
+% \begin{macrocode}
+\@ifpackagelater{babel}{2013/04/15}{%
+ \PassOptionsToPackage{main=\YAD@mainlanguage}{babel}%
+}{%
+ \YAD@ClassWarningNoLine{%
+ La version de `babel' utilisée est obsolète.\MessageBreak%
+ La classe `yathesis' va essayer de faire son possible\MessageBreak%
+ mais il est possible qu'elle produise des resultats\MessageBreak%
+ non prévus. Il est conseillé de mettre à jour sa\MessageBreak%
+ distribution TeX%
+ }%
+}%
+% \end{macrocode}
+%
% \section{Process of Options}
%
% \begin{macrocode}
@@ -1085,7 +1095,7 @@ This work consists of the file yathesis.dtx
% \end{macrocode}
% Pour gérer les titres courants (entêtes) et bas de page
% \begin{macrocode}
-\RequirePackage[nopatches]{titleps}[2011/12/15]%
+\RequirePackage[pagestyles]{titlesec}[2019/10/16]%
% \end{macrocode}
% Pour supprimer le numéro de page sur la page de titre d'une partie
% \begin{macrocode}
@@ -1124,7 +1134,7 @@ This work consists of the file yathesis.dtx
% \end{macrocode}
% Pour gérer les langues.
% \begin{macrocode}
-\RequirePackage{babel}[2014/03/24]
+\RequirePackage[\YAD@secondarylanguage,main=\YAD@mainlanguage]{babel}[2014/03/24]
% \end{macrocode}
% Pour pouvoir afficher un sommaire c-à-d une table des matières réduite
% \begin{macrocode}
@@ -1141,22 +1151,14 @@ This work consists of the file yathesis.dtx
% \end{macrocode}
% Pour générer les dates (sans affichage du jour de la semaine).
% \begin{macrocode}
-\RequirePackage{datetime}[2013/09/10]%
+\RequirePackage[useregional]{datetime2}[2020-03-02]%
% \end{macrocode}
% Pour faire pointer les hyperliens au début des flottants plutôt qu'au
-% début des légendes
+% début des légendes et pour la gestion des signets.
% \begin{macrocode}
-\AtEndPreamble{%
+\AddToHook{begindocument/before}{%
\@ifpackageloaded{hyperref}{%
\RequirePackage[all]{hypcap}[2011/02/16]%
- }{%
- }%
-}%
-% \end{macrocode}
-% Pour la gestion des signets
-% \begin{macrocode}
-\AtEndPreamble{%
- \@ifpackageloaded{hyperref}{%
\RequirePackage[numbered]{bookmark}[2011/12/02]%
}{%
}%
@@ -1171,7 +1173,7 @@ This work consists of the file yathesis.dtx
% \begin{macrocode}
\newlength{\YAD@vspace@before@localtoc@rule}
\setlength{\YAD@vspace@before@localtoc@rule}{-1.25\baselineskip}
-\AtEndPreamble{%
+\AddToHook{begindocument/before}{%
\@ifpackageloaded{parskip}{%
\@ifpackagelater{parskip}{2.0a}{%
\setlength{\YAD@vspace@before@localtoc@rule}{-.775\baselineskip}%
@@ -1187,7 +1189,7 @@ This work consists of the file yathesis.dtx
% "\nolinkurl" du \Package{hyperref} mais sur lesquelles on a plus de
% contrôle.
% \begin{macrocode}
-\AtEndPreamble{%
+\AddToHook{begindocument/before}{%
\@ifpackageloaded{hyperref}{%
\newcommand{\YAD@href}[3][]{\href[#1]{#2}{#3}}%
\newcommand{\YAD@hypersetup}[1]{\hypersetup{#1}}%
@@ -1211,28 +1213,8 @@ This work consists of the file yathesis.dtx
}%
% \end{macrocode}
%
-% Pour éviter certains comportements inattendus, on précise la langue
-% principale au moyen de l'option "main" du \Package{babel}. Mais, comme
-% celle-ci n'est apparue que récemment, on n'y recourt que si la version du
-% package est assez récente.
-% \begin{macrocode}
-\@ifpackagelater{babel}{2013/04/15}{%
- \PassOptionsToPackage{main=\YAD@mainlanguage}{babel}%
-}{%
- % \AtEndPreamble{%
- \YAD@ClassWarningNoLine{%
- La version de `babel' utilisée est obsolète.\MessageBreak%
- La classe `yathesis' va essayer de faire son possible\MessageBreak%
- mais il est possible qu'elle produise des resultats\MessageBreak%
- non prévus. Il est conseillé de mettre à jour sa\MessageBreak%
- distribution TeX%
- }%
- % }%
-}%
-% \end{macrocode}
-%
% On change l'appellation des tableaux flottants tels que traduits par le
-% module \package{frenchb} du \Package{babel} de \enquote{Table} à \enquote{Tableau}.
+% module \package{babel-french} du \Package{babel} de \enquote{Table} à \enquote{Tableau}.
%
% \begin{macrocode}
\addto\captionsfrench{\def\tablename{{\scshape Tableau}}}%
@@ -1314,10 +1296,6 @@ This work consists of the file yathesis.dtx
}{%
}%
}%
-% \AtEndDocument{%
-% \immediate\closeout\YAD@file%
-% }%
-% \InputIfFileExists{\jobname.yad}{}{}%
% \end{macrocode}
%
% \begin{macrocode}
@@ -1335,6 +1313,13 @@ This work consists of the file yathesis.dtx
\tcbuselibrary{skins}%
% \end{macrocode}
%
+% Afin de préserver la compatibilité ascendante, on demande le comportement
+% original du \Package{tcolorbox} en ce qui concerne les espaces verticaux avant
+% et après les boîtes de couleur de ce package.
+% \begin{macrocode}
+ \tcbsetforeverylayer{autoparskip}
+% \end{macrocode}
+%
% Par défaut, les listings sont composés en fonte à châsse fixe
% \begin{macrocode}
% \lstset{basicstyle=\ttfamily}
@@ -1433,7 +1418,7 @@ This work consists of the file yathesis.dtx
% fonte courante et adoption des conventions typographiques
% françaises, notamment la virgule en guise de séparateur décimal).
% \begin{macrocode}
-\AtEndPreamble{%
+\AddToHook{begindocument/before}{%
\@ifpackageloaded{siunitx}{%
\sisetup{detect-all}%
\ifthenelse{\equal{\YAD@mainlanguage}{french}}{%
@@ -1492,7 +1477,7 @@ This work consists of the file yathesis.dtx
% ordinaire ou elle-même en note de bas de page.
% \begin{macrocode}
\ifbool{YAD@output@paper}{%
- \AtEndPreamble{%
+ \AddToHook{begindocument/before}{%
\@ifpackageloaded{hyperref}{%
\YAD@hypersetup{colorlinks=false}%
\renewcommand{\YAD@href}[3][]{#3}%
@@ -1632,7 +1617,7 @@ This work consists of the file yathesis.dtx
% anglais.
% \begin{macrocode}
\newcommand{\YAD@expression}[3]{%
- \AtBeginDocument{%
+ \AddToHook{begindocument}{%
\deftranslation[to=French]{lbl-#1}{#2}%
\deftranslation[to=English]{lbl-#1}{#3}%
\deftranslation[to=French]{#1}{#2}%
@@ -2187,7 +2172,7 @@ This work consists of the file yathesis.dtx
\YAD@translation{\YAD@the@staff-pl-hdr-female}%
}{%
\YAD@translation{\YAD@the@staff-pl-hdr}%
- }
+ }%
}{%
\ifboolexpr{%
bool {YAD@only@female@\YAD@the@staff}%
@@ -2195,7 +2180,7 @@ This work consists of the file yathesis.dtx
\YAD@translation{\YAD@the@staff-pl-female}%
}{%
\YAD@translation{\YAD@the@staff-pl}%
- }
+ }%
}%
}{%
\ifboolexpr{%
@@ -2207,7 +2192,7 @@ This work consists of the file yathesis.dtx
\YAD@translation{\YAD@the@staff-hdr-female}%
}{%
\YAD@translation{\YAD@the@staff-hdr}%
- }
+ }%
}{%
\ifboolexpr{%
bool {YAD@only@female@\YAD@the@staff}%
@@ -2215,7 +2200,7 @@ This work consists of the file yathesis.dtx
\YAD@translation{\YAD@the@staff-female}%
}{%
\YAD@translation{\YAD@the@staff}%
- }
+ }%
}%
}%
}{%
@@ -2703,16 +2688,16 @@ This work consists of the file yathesis.dtx
}{%
}%
\ifthenelse{\equal{#2}{title}}{%
- \YAD@hypersetup{pdftitle=\YAD@metatitle}%
+ \AddToHook{begindocument/before}{\YAD@hypersetup{pdftitle=\YAD@metatitle}}%
}{%
}%
\ifundef{\YAD@metasubject}{%
\ifundef{\YAD@metaacademicfield}{%
}{%
- \YAD@hypersetup{pdfsubject=\YAD@metaacademicfield}%
+ \AddToHook{begindocument/before}{\YAD@hypersetup{pdfsubject=\YAD@metaacademicfield}}%
}%
}{%
- \YAD@hypersetup{pdfsubject=\YAD@metasubject}%
+ \AddToHook{begindocument/before}{\YAD@hypersetup{pdfsubject=\YAD@metasubject}}%
}%
% \end{macrocode}
% Création de la commande affichant le résultat de la commande bilingue
@@ -2841,7 +2826,7 @@ This work consists of the file yathesis.dtx
}%
}%
\YAD@error@firstlastnames@empty{de l'auteur de la thèse}{#2}{#3}{\author}%
- \YAD@hypersetup{pdfauthor=\YAD@firstname@author{} \YAD@lastname@author}%
+ \AddToHook{begindocument/before}{\YAD@hypersetup{pdfauthor=\YAD@firstname@author{} \YAD@lastname@author}}%
\newcommand*\YAD@email@author{%
#1%
}%
@@ -2995,7 +2980,7 @@ This work consists of the file yathesis.dtx
and bool {YAD@valid@year}%
}{%
\csdef{printdate}{%
- \formatdate{#1}{#2}{#3}%
+ \DTMdisplaydate{#3}{#2}{#1}{}%
}%
}{%
\csdef{printdate}{%
@@ -3016,7 +3001,7 @@ This work consists of the file yathesis.dtx
and bool {YAD@valid@year}%
}{%
\csdef{printsubmissiondate}{%
- \formatdate{#1}{#2}{#3}%
+ \DTMdisplaydate{#3}{#2}{#1}{}%
}%
}{%
\csdef{printsubmissiondate}{%
@@ -3028,7 +3013,7 @@ This work consists of the file yathesis.dtx
% \end{macro}
%
% \begin{macrocode}
-\AtEndDocument{%
+\AddToHook{enddocument}{%
\YAD@ifemptyorundef{\printdate}{%
\ifbool{YAD@nodate}{%
}{%
@@ -3073,14 +3058,13 @@ This work consists of the file yathesis.dtx
% Réglage nécessaire sans quoi le titre courant de la nomenclature (si
% le \Package{nomencl} est chargé) n'apparaît pas
% \begin{macrocode}
-\AtEndPreamble{%
+\AddToHook{begindocument/before}{%
\@ifpackageloaded{nomencl}{%
\let\YAD@ORI@printnomenclature\printnomenclature%
\renewcommand{\printnomenclature}{%
\cleardoublepage%
\sethead[\thepage][][\nomname]{\nomname}{}{\thepage}\headrule%
\YAD@ORI@printnomenclature%
- \pagestyle{preliminary}%
}%
}{%
}%
@@ -3119,13 +3103,12 @@ This work consists of the file yathesis.dtx
% \begin{macro}{\pagestyle}
% Redéfinition permettant d'éviter de devoir ajouter
% \lstinline|\cleardoublepage| avant chaque la commande
-% \lstinline|\pagestyle| fournie par le package \package{titleps}
+% \lstinline|\pagestyle| fournie par le package \package{titlesec}
% (cet ajout est pour l'instant nécessaire pour que les entêtes
% aux frontières des chapitres non numérotés ne soient pas
% erronés).
% \begin{macrocode}
-\xpretocmd{\pagestyle}{\cleardoublepage}{}{}%
-% \xapptocmd{\pagestyle}{\YAD@setfoot}{}{}%
+\pretocmd{\pagestyle}{\cleardoublepage}{}{}%
% \end{macrocode}
% \end{macro}
%
@@ -3143,9 +3126,8 @@ This work consists of the file yathesis.dtx
\let\YAD@ORI@tableofcontents\tableofcontents%
\let\YAD@ORI@localtableofcontents\localtableofcontents%
\renewcommand{\tableofcontents}{%
- \pagestyle{preliminary}%
\booltrue{YAD@tableofcontents@used}%
- \cleardoublepage%
+ \pagestyle{preliminary}%
\YAD@phantomsection%
% \renewcommand{\contentsname}{\cmdKV@YAD@name}
\@ifnextchar[{\tableofcontents@YAD@with@argument}{\tableofcontents@YAD@without@argument}%]
@@ -3158,6 +3140,16 @@ This work consists of the file yathesis.dtx
\let\cmdKV@YAD@depth\YAD@tocdepth%
\let\cmdKV@YAD@name\contentsname%
\YAD@localstyle % pour les local TOCs qui suivent
+ \ifbool{YAD@mainmatter}%
+ {%
+ \pagestyle{mainmatter}%
+ }{%
+ }%
+ \ifbool{YAD@backmatter}%
+ {%
+ \pagestyle{backmatter}%
+ }{%
+ }%
}%
\newcommand\tableofcontents@YAD@with@argument[1][]{%
\yadsetup{#1}%
@@ -3183,14 +3175,24 @@ This work consists of the file yathesis.dtx
\let\cmdKV@YAD@depth\YAD@tocdepth%
\let\cmdKV@YAD@name\contentsname%
\YAD@localstyle % pour les local TOCs qui suivent
+ \ifbool{YAD@mainmatter}%
+ {%
+ \pagestyle{mainmatter}%
+ }{%
+ }%
+ \ifbool{YAD@backmatter}%
+ {%
+ \pagestyle{backmatter}%
+ }{%
+ }%
}%
}%
% \end{macrocode}
% \end{macro}
%
-% On crée la macro "\YAD@setsecnumdepth", analogue à "\@setseccntt@c" du \Package{tocvsec2}, qui fixe
-% la valeur du compteur "secnumdepth" selon l'argument donné sous la forme du
-% nom d'une commande de sectionnement
+% On crée la macro "\YAD@setsecnumdepth", analogue à "\@setseccntt@c" du
+% \Package{tocvsec2}, qui fixe la valeur du compteur "secnumdepth" selon
+% l'argument donné sous la forme du nom d'une commande de sectionnement
% \begin{macrocode}
\newcommand{\YAD@setsecnumdepth}[1]{%
\newif\if@YAD@knownsect%
@@ -3257,29 +3259,26 @@ This work consists of the file yathesis.dtx
% \end{macrocode}
%
% Globalement dans le document, la table des matières et la
-% numérotation des paragraphes vont jusqu'aux sous-sections
+% numérotation des paragraphes vont jusqu'aux sous-sections.
% \begin{macrocode}
\etocsettocdepth{\YAD@tocdepth}%
- \AtBeginDocument{%
- % \yadsetup{#1}%
- \YAD@setsecnumdepth{\YAD@secnumdepth}%
+ \AddToHook{begindocument}{%
+ % \yadsetup{#1}%
+ \YAD@setsecnumdepth{\YAD@secnumdepth}%
}
% \renewcommand{\setcounter}[2]{}%
%
% \end{macrocode}
%
-% Définition des styles de pages (basées sur le \Package{titleps})
+% Définition des styles de pages (basés sur le \Package{titleps}, chargé par le
+% \Package{titlesec} avec l'option ×titleps×).
%
% \begin{macro}{\YAD@chapter@header}
% Définition de titres courants
% \begin{macrocode}
-\newcommand*{\YAD@chapter@header}{%
- \ifboolexpr{
- ((test {\ifnumcomp{\value{secnumdepth}}{>}{-1}} or (not bool
- {YAD@nonnumbered@chapter})) and test {\ifnumcomp{\value{chapter}}{>}{0}}) and
- (not bool {YAD@backmatter})
- }{%
- \MakeUppercase\chaptername{}\ \thechapter.
+\DeclareRobustCommand{\YAD@chapter@header}{%
+ \ifthechapter{%
+ \MakeUppercase\chaptertitlename\ \thechapter.
}{%
}%
\chaptertitle%
@@ -3289,12 +3288,8 @@ This work consists of the file yathesis.dtx
%
% \begin{macro}{\YAD@section@header}
% \begin{macrocode}
-\newcommand*{\YAD@section@header}{%
- \ifboolexpr{
- ((test {\ifnumcomp{\value{secnumdepth}}{>}{0}} or (not bool
- {YAD@nonnumbered@section})) and test {\ifnumcomp{\value{chapter}}{>}{0}}) and
- (not bool {YAD@backmatter})%
- }{%
+\DeclareRobustCommand{\YAD@section@header}{%
+ \ifthesection{%
\thesection.
}{%
}%
@@ -3305,12 +3300,28 @@ This work consists of the file yathesis.dtx
% Par défaut, au début du document rien n'est numéroté et les chapitres ne
% débutent pas par des tables des matières locales.
% \begin{macrocode}
- \AtBeginDocument{%
+ \AddToHook{begindocument}{%
\setcounter{secnumdepth}{-10}%
\frontmatter%
\boolfalse{YAD@localtocs}%
}%
% \end{macrocode}
+%
+% Code de débogage pour localiser les styles de pages appliqués.
+% \begin{macrocode}
+% \RequirePackage{background}
+% \xapptocmd{\pagestyle}{%
+% \SetBgContents{#1}
+% \SetBgScale{2}
+% \SetBgAngle{0}
+% \SetBgOpacity{1}
+% \SetBgColor{blue}
+% \SetBgPosition{current page.south west}
+% \SetBgHshift{3cm}
+% \SetBgVshift{1cm}
+% }{}{}%
+% \end{macrocode}
+%
% Définition du style de page des titres
% \begin{macrocode}
\newpagestyle{titles}[]{%
@@ -3362,13 +3373,17 @@ This work consists of the file yathesis.dtx
% géométrie restaurée mais toujours pas de titres courants
% \begin{macrocode}
\newpagestyle{prepreliminary}[]{%
+ \sethead{}{}{}%
+ \setfoot{}{}{}%
+ \setheadrule{0pt}%
+ \setfootrule{0pt}%
% \end{macrocode}
% Dans la partie pré-préliminaire, aucun élément de structuration n'est
% numéroté, les titres courants sont absents et la profondeur de la table des
% matières est fixée à son niveau par défaut (sous-sections)
% \begin{macrocode}
\setcounter{secnumdepth}{-10}%
- \YAD@setfoot%
+ % \YAD@setfoot%
}%
% \end{macrocode}
% Définition du style de page de la partie préliminaire: début
@@ -3399,45 +3414,9 @@ This work consists of the file yathesis.dtx
\YAD@setfoot%
}%
% \end{macrocode}
-% Définition du style de page de la partie liminaire
-% \begin{macrocode}
-\newpagestyle{ordinary}[]{%
- \sethead[\thepage]%
- []%
- [\YAD@chapter@header]%
- {%
- \ifthenelse{%
- \equal{\sectiontitle}{}%
- }{%
- \YAD@chapter@header%
- }{%
- \YAD@section@header%
- }%
- }%
- {}%
- {\thepage}%
- \headrule%
-% \end{macrocode}
-% Dans la partie liminaire, aucun élément de structuration n'est
-% numéroté et la profondeur de la table des matières est fixée à son
-% niveau par défaut (sous-sections)
-% \begin{macrocode}
- \setcounter{secnumdepth}{-10}%
- \YAD@setfoot%
-}%
-% \end{macrocode}
% Définition du style de page de la partie principale
% \begin{macrocode}
\newpagestyle{mainmatter}[]{%
- \ifthenelse{\equal{\YAD@interligne}{single}}{%
- \singlespacing%
- }{%
- \ifthenelse{\equal{\YAD@interligne}{double}}{%
- \doublespacing%
- }{%
- \onehalfspacing%
- }%
- }%
\sethead[\thepage]%
[]%
[\YAD@chapter@header]%
@@ -3467,18 +3446,28 @@ This work consists of the file yathesis.dtx
% \begin{macrocode}
\xapptocmd{\mainmatter}{%
\booltrue{YAD@mainmatter@used}%
+ \booltrue{YAD@mainmatter}%
+ \pagestyle{mainmatter}%
\ifbool{YAD@localtocs@classoption}%
{%
\booltrue{YAD@localtocs}%
}{%
- }
- \pagestyle{mainmatter}%
+ }%
+ \ifthenelse{\equal{\YAD@interligne}{single}}{%
+ \singlespacing%
+ }{%
+ \ifthenelse{\equal{\YAD@interligne}{double}}{%
+ \doublespacing%
+ }{%
+ \onehalfspacing%
+ }%
+ }%
}{}{}%
% \end{macrocode}
% Vérification, en fin de document, de l'usage de la commande "\mainmatter" et
% émission d'une erreur si ça n'est pas le cas.
% \begin{macrocode}
-\AtEndDocument{%
+\AddToHook{enddocument}{%
\ifboolexpr{%
bool {YAD@mainmatter@used}%
}{%
@@ -3493,89 +3482,50 @@ This work consists of the file yathesis.dtx
}%
}%
% \end{macrocode}
-% Définition du style de page de la partie annexe
-% \begin{macrocode}
-\newpagestyle{appendix}[]{%
- \singlespacing%
- \sethead[\thepage]%
- []%
- [%
- \ifthenelse{%
- \value{secnumdepth}>-1
- \and
- \value{chapter}>0
- }{%
- \MakeUppercase\appendixname{} \thechapter.\
- }{%
- }
- \chaptertitle%
- ]%
- {%
- \ifthenelse{%
- \equal{\sectiontitle}{}%
- }{%
- \ifthenelse{%
- \value{secnumdepth}>-1
- \and
- \value{chapter}>0
- }{%
- \MakeUppercase\appendixname{} \thechapter.\
- }{%
- }
- \chaptertitle%
- }{%
- \YAD@section@header%
- }%
- }%
- {}%
- {\thepage}%
- \headrule%
-% \end{macrocode}
-% Dans la partie annexe, la numérotation des paragraphes est fixée à
-% son niveau par défaut (sous-sections)
-% \begin{macrocode}
- \YAD@phantomsection%
- \YAD@setsecnumdepth{\YAD@secnumdepth}%
- \YAD@bookmarksetup{startatroot}%
- \YAD@setfoot%
-}%
-% \end{macrocode}
-% Extension de la commande "\appendix" de sorte qu'elle applique le style de
-% page "appendix".
+% Pour que les bibliographies locales apparaissent automatiquement à chaque fin de
+% chapitre, la commande "\chapter" est redéfinie de manière être précédée par
+% l'insertion de la bibliographie locale ("\printlocalbibs") du, donc, chapitre
+% précédent (affichée seulement si celle-ci n'est pas vide). Ceci fonctionne
+% bien, sauf :
+% \begin{itemize}
+% \item pour les chapitres séparés par des commandes intermédiaires ("\part",
+% "\mainmatter", "\appendix", etc.)
+% \item en fin de document ("\enddocument").
+% \end{itemize}
+% Il est donc nécessaire que ces commandes commencent donc elles-mêmes par
+% l'insertion de la bibliographie locale du chapitre précédent
+% ("\printlocalbibs"), commande assurant que les chapitres suivant
+% (éventuellement) ces commandes ne l'afficheront pas en double.
% \begin{macro}{\appendix}
% \begin{macrocode}
-\xapptocmd{\appendix}{%
- \pagestyle{appendix}%
-}{}{}%
-% \end{macrocode}
-% \end{macro}
-% Définition du style de page de la partie biblio
-% \begin{macrocode}
-\newpagestyle{biblio}[]{%
-% \end{macrocode}
-% Dans la partie biblio, aucun élément de structuration n'est
-% numéroté
-% \begin{macrocode}
- \setcounter{secnumdepth}{-10}%
-% \end{macrocode}
-% \begin{macrocode}
- \singlespacing%
- \sethead[\thepage]%
- []%
- [\YAD@chapter@header]%
- {\YAD@chapter@header}%
- {}%
- {\thepage}%
- \headrule%
+\AddToHook{begindocument/before}{%
+ \xpretocmd{\part}{%
+ \printlocalbibs{}%
+ }{}{}%
+ \pretocmd{\mainmatter}{%
+ \printlocalbibs{}%
+ \cleardoublepage%
+ }{}{}%
+ \pretocmd{\appendix}{%
+ \printlocalbibs{}%
+ \cleardoublepage%
+ }{}{}%
+ \pretocmd{\backmatter}{%
+ \printlocalbibs{}%
+ \cleardoublepage%
+ }{}{}%
+ \pretocmd{\enddocument}{%
+ \printlocalbibs{}%
+ }{}{}%
+}
% \end{macrocode}
-% On demande que la bibliographie apparaisse au plus haut niveau des
-% signets
+% Extension de la commande "\appendix" de sorte que les chapitres d'annexe
+% soient correctement nommés.
% \begin{macrocode}
- % \cleardoublepage%
- \YAD@phantomsection%
- \YAD@bookmarksetup{startatroot}%
- \YAD@setfoot%
-}%
+ \apptocmd{\appendix}{%
+ \renewcommand\chaptername{\appendixname}%
+ \singlespacing%
+ }{}{}%
% \end{macrocode}
% Définition du style de page de la partie finale
% \begin{macrocode}
@@ -3617,73 +3567,6 @@ This work consists of the file yathesis.dtx
}{}{}%
% \end{macrocode}
% \end{macro}
-% Définition du style de page de la table des matières
-% \begin{macrocode}
-\newpagestyle{contents}[]{%
- \cleardoublepage%
- \YAD@phantomsection%
- \YAD@bookmarksetup{startatroot}%
- \singlespacing%
- \sethead[\thepage]%
- []%
- [\cmdKV@YAD@name]%
- {\cmdKV@YAD@name}%
- {}%
- {\thepage}%
- \headrule%
-% \end{macrocode}
-% Dans la partie glossaire, aucun élément de structuration n'est
-% numéroté
-% \begin{macrocode}
- \setcounter{secnumdepth}{-10}%
- \YAD@setfoot%
-}%
-% \end{macrocode}
-% Définition du style de page de la partie glossaire
-% \begin{macrocode}
-\newpagestyle{glossaire}[]{%
- \cleardoublepage%
- \YAD@phantomsection%
- \YAD@bookmarksetup{startatroot}%
- \singlespacing%
- \sethead[\thepage]%
- []%
- [\YAD@chapter@header]%
- {\YAD@chapter@header}%
- {}%
- {\thepage}%
- \headrule%
-% \end{macrocode}
-% Dans la partie glossaire, aucun élément de structuration n'est
-% numéroté
-% \begin{macrocode}
- \setcounter{secnumdepth}{-10}%
- \YAD@setfoot%
-}%
-% \end{macrocode}
-% Définition du style de page de la partie index
-% \begin{macrocode}
-\newpagestyle{index}[]{%
- \singlespacing%
- \sethead[\thepage]%
- []%
- [\YAD@chapter@header]%
- {\YAD@chapter@header}%
- {}%
- {\thepage}%
- \headrule%
-% \end{macrocode}
-% Dans la partie index, aucun élément de structuration n'est
-% numéroté
-% \begin{macrocode}
- \setcounter{secnumdepth}{-10}%
- \cleardoublepage%
- \YAD@phantomsection%
- \YAD@setsecnumdepth{\YAD@secnumdepth}%
- \YAD@bookmarksetup{startatroot}%
- \YAD@setfoot%
-}%
-% \end{macrocode}
% Définition du style de page de la partie \textquote{4\ieme{} de
% couverture} (\emph{blub} en anglais).
% \begin{macrocode}
@@ -3774,12 +3657,16 @@ This work consists of the file yathesis.dtx
\yadsetup{#1}
\setlength{\fboxsep}{10pt}%
\setlength{\YAD@titleboxwidth}{\linewidth-2\fboxsep-2\fboxrule}%
- \renewcommand*{\do}[1]{%
-% \end{macrocode}
% Appel du style de page propre au(x) titre(s)
% \begin{macrocode}
\pagestyle{titles}%
% \end{macrocode}
+ \renewcommand*{\do}[1]{%
+% \end{macrocode}
+% Chaque nouvelle page de titre commence en page impaire.
+% \begin{macrocode}
+ \cleardoublepage%
+% \end{macrocode}
% On passe dans la langue choisie en option (en français si rien n'est
% spécifié).
% \begin{macrocode}
@@ -3810,7 +3697,7 @@ This work consists of the file yathesis.dtx
}%
\noindent%
\begin{minipage}{\linewidth-2\fboxsep-2\fboxrule}
- \onehalfspacing%
+ % \onehalfspacing%
\noindent%
\ifthenelse{\equal{\cmdKV@YAD@frametitle}{none}}{%
}{%
@@ -3840,8 +3727,10 @@ This work consists of the file yathesis.dtx
}%
\ifundef{\printsubtitle}{%
}{%
- \ifdraft{}{\vspace*{\stretch{.15}}}%
- % \vspace*{\stretch{.15}}%
+ \ifdraft{}{%
+ \vskip0.5em%
+ % \vspace*{\stretch{.15}}%
+ }%
\par%
\centering%
\Large\printsubtitle%
@@ -3924,7 +3813,10 @@ This work consists of the file yathesis.dtx
\par%
\YAD@translation{company} \textbf{\textsc{\Large\printcompany}}%
}%
- \ifbool{YAD@nodoctoralschool}{%
+ \ifboolexpr{%
+ bool {YAD@nodoctoralschool}%
+ or bool {YAD@hdr}%
+ }{%
}{%
\ifdraft{}{\vspace*{\stretch{1.5}}}%
% \vspace*{\stretch{1.5}}%
@@ -3945,6 +3837,26 @@ This work consists of the file yathesis.dtx
\textbf{\printdoctoralschool}%
}%
}%
+% \end{macrocode}
+%
+% Si une école doctorale est spécifiée alors que la thèse est une HDR, un
+% warning est émis.
+% \begin{macrocode}
+ \ifbool{YAD@hdr}{%
+ \YAD@ifemptyorundef{\printdoctoralschool}{%
+ }{%
+ \YAD@ClassWarningNoLine{%
+ Une école doctorale a été spécifiée mais elle ne\MessageBreak%
+ figurera nulle part : les HDR ne sont pas préparées\MessageBreak%
+ sous l'égide d'écoles doctorales (cf. \MessageBreak%
+ https://www.legifrance.gouv.fr/loda/id/JORFTEXT000000298904)%
+ }%
+ }%
+ }{%
+ }%
+% \end{macrocode}
+%
+% \begin{macrocode}
\ifbool{YAD@nolaboratory}{%
}{%
\ifdraft{}{\vspace*{\stretch{.5}}}%
@@ -4060,7 +3972,7 @@ This work consists of the file yathesis.dtx
\large%
\YAD@translation{speciality} \textbf{\printspeciality}%
}%
- }
+ }%
\end{center}
% \end{minipage}%
\vspace*{\stretch{1}}%
@@ -4165,9 +4077,10 @@ This work consists of the file yathesis.dtx
% \end{macrocode}
% \end{macro}
%
-% Si la commande "\maketitle" n'a pas été utilisée, une erreur est émise.
+% Si la commande "\maketitle" n'a pas été utilisée, une erreur est émise (en
+% version finale).
% \begin{macrocode}
-\AtEndDocument{%
+\AddToHook{enddocument}{%
\ifboolexpr{%
bool {YAD@maketitle@used}%
or bool {YAD@nomaketitle}%
@@ -4183,6 +4096,11 @@ This work consists of the file yathesis.dtx
}%
% \end{macrocode}
%
+% Le mémoire est, à son début, automatiquement en style de pages préliminaires.
+% \begin{macrocode}
+\AfterEndPreamble{\pagestyle{preliminary}}%
+% \end{macrocode}
+%
% Code pour l'éventuel colophon
% \begin{macrocode}
\newcommand{\YAD@insert@colophon}{%
@@ -4193,6 +4111,7 @@ This work consists of the file yathesis.dtx
\clearpage
\vspace*{\stretch{1}}%
\begin{minipage}{\linewidth}
+ \expandafter\selectlanguage\expandafter{\YAD@mainlanguage}%
\begin{colophon}
\printcolophontext%
\end{colophon}
@@ -4216,9 +4135,9 @@ This work consists of the file yathesis.dtx
\ifthenelse{\isempty{#1}}{%
}{%
\ifthenelse{\isempty{#2}}{%
- \YAD@hypersetup{pdfkeywords={#1}}%
+ \AddToHook{begindocument/before}{\YAD@hypersetup{pdfkeywords={#1}}}%
}{%
- \YAD@hypersetup{pdfkeywords={#1} ({#2})}%
+ \AddToHook{begindocument/before}{\YAD@hypersetup{pdfkeywords={#1} ({#2})}}%
}%
}%
}%
@@ -4246,7 +4165,7 @@ This work consists of the file yathesis.dtx
% \end{macrocode}
% Émission d'une erreur si les mots clés sont vides ou non spécifiés.
% \begin{macrocode}
-\AtEndDocument{%
+\AddToHook{enddocument}{%
\notbool{YAD@keywords@used}{%
\ifbool{YAD@nokeywords}{%
}{%
@@ -4291,7 +4210,6 @@ This work consists of the file yathesis.dtx
\@ifstar{\@tempswatrue\csuse{YAD@starnostar@makekeywords}}{\@tempswafalse\csuse{YAD@starnostar@makekeywords}}%
}%
\csdef{YAD@starnostar@makekeywords}{%
- \cleardoublepage%
% \end{macrocode}
% Appel du style de page propre à la partie préliminaire
% \begin{macrocode}
@@ -4324,8 +4242,8 @@ This work consists of the file yathesis.dtx
\else%
\vspace*{\stretch{1}}%
\fi
- \expandafter\selectlanguage\expandafter{\YAD@mainlanguage}%
\pagestyle{preliminary}%
+ \expandafter\selectlanguage\expandafter{\YAD@mainlanguage}%
}%
% \end{macrocode}
% \end{macro}
@@ -4424,7 +4342,6 @@ This work consists of the file yathesis.dtx
\@ifstar{\@tempswatrue\csuse{YAD@starnostar@makelaboratory}}{\@tempswafalse\csuse{YAD@starnostar@makelaboratory}}%
}%
\csdef{YAD@starnostar@makelaboratory}{%
- \cleardoublepage%
% \end{macrocode}
% Appel du style de page propre à la partie préliminaire
% \begin{macrocode}
@@ -4795,36 +4712,19 @@ This work consists of the file yathesis.dtx
% Page de présentation (résumés)
% \begin{macrocode}
\newcommand{\makeabstract}{%
+ \pagestyle{preliminary}%
+ \bgroup%
\ifbool{YAD@nomakeabstract}{%
}{%
\YAD@alarm@noabstract%
}%
- \pagestyle{preliminary}%
\YAD@phantomsection%
\addcontentsline{toc}{chapter}{\abstractname}%
- \booltrue{YAD@makeabstract@used}%
- \bgroup%
\addtolength{\footskip}{6pt minus 6pt}%
\setfootrule{0pt}%
- \setfoot[][%
- \ifboolexpr{%
- bool {YAD@inprogress@work}%
- or bool {YAD@inprogress@work@star}%
- }{%
- \textsc{\translate{lbl-inprogressfoottext} \today}%
- }{%
- \ifboolexpr{%
- bool {YAD@submitted@work@star}%
- }{%
- \textsc{\translate{lbl-submittedfoottext} \today}%
- }{%
- }%
- }%
- ][]{%
- % \medskip\par%
+ \setfoot[][][]{%
\YAD@laboratory@abstract@page%
}{}{}%
- \cleardoublepage%
\renewcommand{\YAD@chapter@header}{\abstractname}%
\renewcommand{\YAD@section@header}{\abstractname}%
\YAD@abstract@page%
@@ -4838,6 +4738,8 @@ This work consists of the file yathesis.dtx
% \begin{macrocode}
\YAD@nolaboratorytrue%
\YAD@nolaboratoryaddresstrue%
+%
+ \booltrue{YAD@makeabstract@used}%
}%
% \end{macrocode}
% \end{macro}
@@ -4851,7 +4753,7 @@ This work consists of the file yathesis.dtx
%
% Si la commande "\makeabstract" n'a pas été utilisée, une erreur est émise.
% \begin{macrocode}
-\AtEndDocument{%
+\AddToHook{enddocument}{%
\ifbool{YAD@makeabstract@used}{%
}{%
\ifbool{YAD@nomakeabstract}{%
@@ -4918,6 +4820,7 @@ This work consists of the file yathesis.dtx
% Éléments communs de la page de présentation
% \begin{macrocode}
\newcommand{\makebackcover}{%
+ \printlocalbibs{}%
\pagestyle{backcover}%
% \end{macrocode}
% On insère le code pour l'éventuel colophon
@@ -4942,7 +4845,6 @@ This work consists of the file yathesis.dtx
}%
\csdef{YAD@starnostar@makededications}{%
\pagestyle{prepreliminary}%
- \cleardoublepage%
\if@tempswa%
\else%
\vspace*{\stretch{2}}%
@@ -4958,9 +4860,6 @@ This work consists of the file yathesis.dtx
permettant de préparer des dédicaces, n'a pas été utilisée.%
}%
}{%
-% \end{macrocode}
-% Appel du style de page propre à la partie préliminaire
-% \begin{macrocode}
\begin{flushright}
\itshape%
\DTLforeach*{dedications}{%
@@ -4994,6 +4893,7 @@ This work consists of the file yathesis.dtx
\else%
\vspace*{\stretch{2}}%
\fi
+ \pagestyle{preliminary}%
}%
% \end{macrocode}
% \end{macro}
@@ -5006,7 +4906,7 @@ This work consists of the file yathesis.dtx
}%
\csdef{YAD@starnostar@makefrontepigraphs}{%
\patchcmd{\epigraphs}{\qitemlabel}{\qitemlabel\itemsep=1.5\baselineskip}{}{}%
- \cleardoublepage%
+ \pagestyle{prepreliminary}%
\if@tempswa%
\else%
\vspace*{\stretch{2}}%
@@ -5027,9 +4927,6 @@ This work consists of the file yathesis.dtx
}{%
}%
}{%
-% \end{macrocode}
-% Appel du style de page propre à la partie préliminaire
-% \begin{macrocode}
\begin{epigraphs}
\DTLforeach*{frontepigraphs}{%
\YAD@epigraphlanguage=epigraphlanguage,%
@@ -5072,39 +4969,10 @@ This work consists of the file yathesis.dtx
\else%
\vspace*{\stretch{2}}%
\fi
-}%
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{environment}{epigraphspage}
-% Environnement de la page des épigraphes globales à la thèse
-% \begin{macrocode}
-\newenvironment{epigraphspage}{%
-% \end{macrocode}
-% Redéfinition locale de la commande d'épigraphe
-% \begin{macrocode}
- \patchcmd{\epigraphs}{\qitemlabel}{\qitemlabel\itemsep=1.5\baselineskip}{}{}
- \cleardoublepage%
- \vspace*{\stretch{1}}%
-}{%
- \vspace*{\stretch{1}}%
-}%
-% \end{macrocode}
-% Appel du style de page propre à la partie préliminaire du
-% document, notamment début de l'insertion des titres courants (on
-% ajoute le style de page "prepreliminary" avant que l'environnement
-% "epigraphspage" ne débute, de sorte que sa portée ne soit pas
-% limitée à cet environnement).
-% \begin{macrocode}
-\BeforeBeginEnvironment{epigraphspage}{%
- \pagestyle{prepreliminary}%
-}%
-\AfterEndEnvironment{epigraphspage}{%
\pagestyle{preliminary}%
}%
% \end{macrocode}
-% \end{environment}
-%
+% \end{macro}
%
%\section{Commandes et styles pour les tables des matières locales}
%
@@ -5238,11 +5106,18 @@ This work consists of the file yathesis.dtx
% or local) TOCs. For this, it is enough to \enquote{relax} "\addcontentsline".
% \begin{macrocode}
\renewcommand\addcontentsline[3]{}%
- \section *{\kern\dimen@ % \dimen@ works here by sheer luck
- % \contentsname%
- % \@mkboth{\MakeUppercase\contentsname}{\MakeUppercase\contentsname}%
- \large\textbf{\translate{lbl-localtocname}}%
+ \begingroup
+ \titlespacing*{\section}{\dimen@}{3.5ex plus 1ex minus .2ex}{2.3ex plus .2ex}
+ \section*{%
+ \large%
+ \translate{lbl-localtocname}%
}%
+ \endgroup
+% \end{macrocode}
+% We don't want the header contain the title of the previous (dummy) section in case
+% the first \enquote{real} section shows up.
+% \begin{macrocode}
+ \sectionmark{}%
% \end{macrocode}
% We restore the original behavior of "\addcontentsline".
% \begin{macrocode}
@@ -5411,6 +5286,44 @@ This work consists of the file yathesis.dtx
}{}{}%
% \end{macrocode}
% \end{environment}
+%
+% Le code pour l'affichage des bibliographies locales, utilisé à plusieurs
+% endroits, est stocké dans une macro.
+% \begin{macrocode}
+\newcommand{\printlocalbibs}{%
+ \ifbool{YAD@localbibs}{%
+ \ifbool{YAD@localbibs@used}{%
+ }{%
+% \end{macrocode}
+% \end{environment}
+%
+% On n'affiche une bibliographie locale que dans les segments de bibliographie
+% autres que celui numéroté 0 sans quoi la bibliographie globale est suivie
+% d'une bibliographie locale contenant toutes les citations insérées en dehors
+% d'un segment (par exemple en cas de ×\nocite{*}× ou de citation par exemple
+% dans les épigraphes).
+% \begin{macrocode}
+ \ifnumcomp{\value{refsegment}}{=}{0}{%
+ }{%
+ \let\YAD@ORI@blx@warn@bibempty\blx@warn@bibempty%
+ \def\blx@warn@bibempty{}%
+% \end{macrocode}
+% Les bibliographies locales sont composées en interligne simple
+% \begin{macrocode}
+ \bgroup
+ \par%
+ \singlespacing%
+ \YAD@printbibliography@ORI[segment=\therefsegment,heading=YAD@localbibs@heading]%
+ \par%
+ \egroup%
+ \let\blx@warn@bibempty\YAD@ORI@blx@warn@bibempty%
+ \booltrue{YAD@localbibs@used}%
+ }%
+ }%
+ }{%
+ }%
+}%
+% \end{macrocode}
% On redéfinit la commande "\chapter" de sorte que, dans un chapitre non
% numéroté ("\chapter*") :
% \begin{itemize}
@@ -5431,14 +5344,10 @@ This work consists of the file yathesis.dtx
\LetLtxMacro{\YAD@ORI@chapter}{\chapter}%
\AfterPreamble{% delay the redefinition when titlesec has done its own
\renewcommand\chapter{%
- \ifbool{YAD@localbibs}{%
- \let\YAD@ORI@blx@warn@bibempty\blx@warn@bibempty%
- \def\blx@warn@bibempty{}%
- \YAD@printbibliography@ORI[segment=\therefsegment,heading=YAD@localbibs@heading]%
- \let\blx@warn@bibempty\YAD@ORI@blx@warn@bibempty%
- }{%
- }
+ \printlocalbibs{}%
+ \boolfalse{YAD@localbibs@used}%
\cleardoublepage%
+ \renewcommand{\sectiontitle}{}%
\YAD@phantomsection%
\ifbool{YAD@output@paper}{%
}{%
@@ -5487,7 +5396,7 @@ This work consists of the file yathesis.dtx
\boolfalse{YAD@nonnumbered@paragraph}%
\boolfalse{YAD@nonnumbered@subparagraph}%
\if@mainmatter%
- \YAD@setsecnumdepth{\YAD@secnumdepth}
+ \YAD@setsecnumdepth{\YAD@secnumdepth}%
\fi%
\YAD@tmp@chapter[#1][#2]{#3}%
}%
@@ -5514,7 +5423,7 @@ This work consists of the file yathesis.dtx
% tables des matières.
% \end{itemize}
% \begin{macrocode}
-\LetLtxMacro{\YAD@ORI@section}{\section}
+\LetLtxMacro{\YAD@ORI@section}{\section}%
\renewcommand\section{%
\if@mainmatter%
\ifbool{YAD@nonnumbered@chapter}{%
@@ -5523,7 +5432,7 @@ This work consists of the file yathesis.dtx
}%
\fi%
\@ifstar{\YAD@starred@section}{\YAD@unstarred@section}%
-}
+}%
\newcommandtwoopt*{\YAD@tmp@section}[3][][]{%
\ifthenelse{\isempty{#1}}{%
\ifthenelse{\isempty{#2}}{%
@@ -5575,7 +5484,7 @@ This work consists of the file yathesis.dtx
% "\section".
% \end{itemize}
% \begin{macrocode}
-\LetLtxMacro{\YAD@ORI@subsection}{\subsection}
+\LetLtxMacro{\YAD@ORI@subsection}{\subsection}%
\renewcommand\subsection{%
\if@mainmatter%
\ifbool{YAD@nonnumbered@section}{%
@@ -5584,7 +5493,7 @@ This work consists of the file yathesis.dtx
}%
\fi%
\@ifstar{\YAD@starred@subsection}{\YAD@unstarred@subsection}%
-}
+}%
\newcommand*{\YAD@tmp@subsection}[2][]{%
\ifthenelse{\isempty{#1}}{%
\YAD@ORI@subsection{#2}%
@@ -5613,7 +5522,7 @@ This work consists of the file yathesis.dtx
\YAD@tmp@subsection[#1]{#2}%
}%
%
-\LetLtxMacro{\YAD@ORI@subsubsection}{\subsubsection}
+\LetLtxMacro{\YAD@ORI@subsubsection}{\subsubsection}%
\renewcommand\subsubsection{%
\if@mainmatter%
\ifbool{YAD@nonnumbered@subsection}{%
@@ -5622,7 +5531,7 @@ This work consists of the file yathesis.dtx
}%
\fi%
\@ifstar{\YAD@starred@subsubsection}{\YAD@unstarred@subsubsection}%
-}
+}%
\newcommand*{\YAD@tmp@subsubsection}[2][]{%
\ifthenelse{\isempty{#1}}{%
\YAD@ORI@subsubsection{#2}%
@@ -5649,7 +5558,7 @@ This work consists of the file yathesis.dtx
\YAD@tmp@subsubsection[#1]{#2}%
}%
%
-\LetLtxMacro{\YAD@ORI@paragraph}{\paragraph}
+\LetLtxMacro{\YAD@ORI@paragraph}{\paragraph}%
\renewcommand\paragraph{%
\if@mainmatter%
\ifbool{YAD@nonnumbered@subsubsection}{%
@@ -5658,7 +5567,7 @@ This work consists of the file yathesis.dtx
}%
\fi%
\@ifstar{\YAD@starred@paragraph}{\YAD@unstarred@paragraph}%
-}
+}%
\newcommand*{\YAD@tmp@paragraph}[2][]{%
\ifthenelse{\isempty{#1}}{%
\YAD@ORI@paragraph{#2}%
@@ -5683,7 +5592,7 @@ This work consists of the file yathesis.dtx
\YAD@tmp@paragraph[#1]{#2}%
}%
%
-\LetLtxMacro{\YAD@ORI@subparagraph}{\subparagraph}
+\LetLtxMacro{\YAD@ORI@subparagraph}{\subparagraph}%
\renewcommand\subparagraph{%
\if@mainmatter%
\ifbool{YAD@nonnumbered@paragraph}{%
@@ -5692,7 +5601,7 @@ This work consists of the file yathesis.dtx
}%
\fi%
\@ifstar{\YAD@starred@subparagraph}{\YAD@unstarred@subparagraph}%
-}
+}%
\newcommand*{\YAD@tmp@subparagraph}[2][]{%
\ifthenelse{\isempty{#1}}{%
\YAD@ORI@subparagraph{#2}%
@@ -5766,7 +5675,7 @@ This work consists of the file yathesis.dtx
% \YAD@create@chapter{frenchabstract}%
% %
% \xapptocmd{\frenchabstract}{\booltrue{YAD@frenchabstract@used}}{}{}
-% \AtEndDocument{%
+% \AddToHook{enddocument}{%
% \ifbool{YAD@frenchabstract@used}{%
% \ifthenelse{\equal{\YAD@mainlanguage}{french}}{%
% \YAD@ClassWarningNoLine{%
@@ -5864,21 +5773,37 @@ This work consists of the file yathesis.dtx
% On définit la valeur, en anglais et en français, de la macro "\colophon" du colophon.
%
% \begin{macrocode}
-\colophontext{%
- \IfLanguageName{french}{%
- Mémoire de thèse intitulé \frquote{\printtitle}, écrit par \printauthor{},
- achevé le \today{}, composé au moyen du système de préparation de document
- \href{https://fr.wikipedia.org/wiki/LaTeX}{\LaTeX{}} et de la classe
- \href{https://www.ctan.org/pkg/yathesis}{\textsf{yathesis}} dédiée aux
- thèses préparées en France.%
- }{%
- Doctoral dissertation entitled “\printtitle”, written by \printauthor{},
- completed on \today{}, typeset with the document preparation system
- \href{https://en.wikipedia.org/wiki/LaTeX}{\LaTeX{}} and the
- \href{https://www.ctan.org/pkg/yathesis}{\textsf{yathesis}} class dedicated
- to theses prepared in France.%
+\AddToHook{begindocument/before}{%
+ \colophontext{%
+ \IfLanguageName{french}{%
+ Mémoire de thèse intitulé \YAD@ifemptyorundef{\printtitle}{%
+ \YAD@generic@argument@translate{title}%
+ }{%
+ \frquote{\printtitle}%
+ }, écrit par \YAD@ifemptyorundef{\printauthor}{%
+ \YAD@generic@argument@translate{author}%
+ }{%
+ \printauthor%
+ }, achevé le \today{}, composé au moyen du système de préparation de
+ document \YAD@href{https://fr.wikipedia.org/wiki/LaTeX}{\LaTeX{}} et de la
+ classe \YAD@href{https://ctan.org/pkg/yathesis}{\textsf{yathesis}}
+ dédiée aux thèses préparées en France.%
+ }{%
+ Doctoral dissertation entitled \YAD@ifemptyorundef{\printtitle}{%
+ \YAD@generic@argument@translate{title}%
+ }{%
+ “\printtitle”%
+ }, written by \YAD@ifemptyorundef{\printauthor}{%
+ \YAD@generic@argument@translate{author}%
+ }{%
+ \printauthor%
+ }, completed on \today{}, typeset with the document preparation system
+ \YAD@href{https://en.wikipedia.org/wiki/LaTeX}{\LaTeX{}} and the
+ \YAD@href{https://ctan.org/pkg/yathesis}{\textsf{yathesis}} class
+ dedicated to theses prepared in France.%
+ }%
}%
-}%
+}
% \end{macrocode}
%
% % Le contenu de l'environnement "introduction" est collecté dans la macro
@@ -5968,7 +5893,7 @@ This work consists of the file yathesis.dtx
% % Si l'environnement "introduction" n'a pas été utilisé, une erreur est émise
% % (car la commande "mainmatter" n'aura alors pas été insérée).
% % \begin{macrocode}
-% \AtEndDocument{%
+% \AddToHook{enddocument}{%
% \ifbool{YAD@introduction@used}{%
% \ifbool{YAD@introduction@empty}{%
% \YAD@ClassWarningNoLine{%
@@ -6085,7 +6010,7 @@ This work consists of the file yathesis.dtx
% % Si l'environnement "conclusion" n'a pas été utilisé, une erreur est émise
% % (car la commande "appendix" n'aura alors pas été insérée).
% % \begin{macrocode}
-% \AtEndDocument{%
+% \AddToHook{enddocument}{%
% \ifbool{YAD@conclusion@used}{%
% \ifbool{YAD@conclusion@empty}{%
% \YAD@ClassWarningNoLine{%
@@ -6109,7 +6034,7 @@ This work consists of the file yathesis.dtx
%
% On fixe la métadonnée de la langue.
% \begin{macrocode}
-\AtBeginDocument{%
+\AddToHook{begindocument}{%
\ifthenelse{\equal{\YAD@mainlanguage}{french}}{%
\YAD@hypersetup{pdflang=fr}%
}{%
@@ -6119,12 +6044,13 @@ This work consists of the file yathesis.dtx
% \end{macrocode}
%
% \begin{macrocode}
-\AtEndPreamble{%
+\AddToHook{begindocument/before}{%
\@ifpackageloaded{biblatex}{%
- \defbibheading{YAD@localbibs@heading}[\translate{lbl-localbibname}]{%
+ \defbibheading{YAD@localbibs@heading}[\translate{lbl-localbibname} % (\therefsegment)
+ ]{%
\renewcommand\addcontentsline[3]{}%
\section*{#1}%
- \let\addcontentsline\YAD@addcontentsline
+ \let\addcontentsline\YAD@addcontentsline%
}%
% \end{macrocode}
%
@@ -6143,30 +6069,52 @@ This work consists of the file yathesis.dtx
\let\YAD@printbibliography@ORI\printbibliography%
\renewcommand{\printbibliography}[1][]{%
\booltrue{YAD@printbibliography@used}%
+ \bgroup
+ \par%
+ \singlespacing%
+ \YAD@printbibliography@ORI[#1]%
% \end{macrocode}
%
-% Hack aimablement fourni par samcarter
-% (\url{https://texnique.fr/osqa/questions/6977/header-avec-biblatex/6978})
-% qui évite que l'entête de la bibliographie, en dernière page de celle-ci, ne
-% contienne pas seulement \enquote{Bibliographie} mais \enquote{CHAPITRE
-% XXX. Bibliographie}.
+% On introduit un segment de bibliographie vide sans quoi la bibliographie est
+% suivie de la bibliographie locale du chapitre précédent (quand il en a une),
+% avec en outre un titre courant incorrect sur les pages paires
+% (\enquote{CHAPITRE (ou ANNEXE) XXX. Bibliographie du présent chapitre}).
% \begin{macrocode}
- \pagestyle{biblio}%
- \chapter*{\bibname}%
- \begingroup%
- \let\cleardoublepage\relax%
- \YAD@printbibliography@ORI[heading=none,#1]%
- \endgroup%
+ \newrefsegment%
+ \endrefsegment%
+ \egroup%
}%
}{%
+% \end{macrocode}
+%
+% Si \package{biblatex} non chargé (\package{bibtex} supposé).
+% \begin{macrocode}
+ \BeforeBeginEnvironment{thebibliography}{%
+ \singlespacing%
+ }%
+ \AddToHook{env/thebibliography/end}{%
+ \clearpage%
+ }%
}%
}%
% \end{macrocode}
% \end{macro}
%
+% On s'assure que, en fin de document, les \enquote{chapitres} et
+% \enquote{section} sont non numérotés afin d'éviter sur la (ou les ?)
+% dernière(s) page(s) des titres courants incorrects (comportant
+% \enquote{Chapitre XXX. ...} ou \enquote{XXX.XXX} qui ne devraient pas
+% apparaître si le dernier chapitre du document est non numéroté).
+% \begin{macrocode}
+\AddToHook{enddocument}{%
+ \booltrue{YAD@nonnumbered@chapter}%
+ \booltrue{YAD@nonnumbered@section}%
+}
+% \end{macrocode}
+%
% Si la commande "\printbibliography" n'a pas été utilisée, une erreur est émise.
% \begin{macrocode}
-\AtEndDocument{%
+\AddToHook{enddocument}{%
\ifbool{YAD@printbibliography@used}{%
}{%
\ifbool{YAD@noprintbibliography}{%
@@ -6289,7 +6237,7 @@ This work consists of the file yathesis.dtx
% \Package{glossaries} l'est, sans quoi les signets des glossaires
% et objets assimilés ne sont pas correctement traduits.
% \begin{macrocode}
-\AtEndPreamble{%
+\AddToHook{begindocument/before}{%
\@ifpackageloaded{glossaries}{%
\RequirePackage{glossaries-babel}%
}{%
@@ -6301,13 +6249,33 @@ This work consists of the file yathesis.dtx
}%
% \end{macrocode}
%
+% Le code suivant, aimablement fourni par touhami
+% (\url{https://texnique.fr/osqa/questions/8358/packages-glossaries-et-yathesis-pepin-de-forme-plurielle-glspl})
+% permet que, dans le cas d'un mémoire en anglais (option
+% "mainlanguage=english"), les règles s'appliquant aux glossaires et acronymes
+% soient bien celles de l'anglais (et non du français).
+% \begin{macrocode}
+\AddToHook{begindocument/before}{%
+ \@ifpackageloaded{glossaries}{%
+ \IfLanguageName{english}{%
+ \makeatletter
+ \let\glossariescaptionsenglish\undefined
+ \input{glossaries-english.ldf}
+ \makeatother
+ }{%
+ }%
+ }{%
+ }%
+}%
+% \end{macrocode}
+%
% \subsection{Fichiers importés par la classe}
%
% La \yatcl charge les fichiers de configuration locale et de données
% caractéristiques du document, situés dans le répertoire de configuration.
%
% \begin{macrocode}
-\AtEndPreamble{%
+\AddToHook{begindocument/before}{%
\ifPDFTeX
\shorthandon{;:!?}%
\fi
@@ -6331,7 +6299,7 @@ This work consists of the file yathesis.dtx
% \subsubsection{Données caractéristiques du document}
%
% \begin{macrocode}
-\AtEndPreamble{%
+\AddToHook{begindocument/before}{%
\ifPDFTeX
\shorthandon{;:!?}%
\fi
@@ -6359,7 +6327,7 @@ This work consists of the file yathesis.dtx
% % \subsubsection{Macros}
% %
% % \begin{macrocode}
-% \AtEndPreamble{%
+% \AddToHook{begindocument/before}{%
% \ifPDFTeX
% \shorthandon{;:!?}%
% \fi
@@ -6385,7 +6353,7 @@ This work consists of the file yathesis.dtx
%
% Si la commande "\tableofcontents" n'a pas été utilisée, une erreur est émise.
% \begin{macrocode}
-\AtEndDocument{%
+\AddToHook{enddocument}{%
\ifbool{YAD@tableofcontents@used}{%
}{%
\ifbool{YAD@notableofcontents}{%
@@ -6571,49 +6539,48 @@ This work consists of the file yathesis.dtx
%
% \begin{macrocode}
# mode: yathesis.cls
-# denisbitouze, 2020-03-26
+# denisbitouze, 2020-04-05
#
-#include:class-book
-#include:latex-document
-#include:latex-mathsymbols
-#include:tex
-#include:pgfopts
+#include:adjustbox
+#include:array
+#include:babel
+#include:biblatex
+#include:bookmark
+#include:colophon
+#include:csquotes
+#include:datatool
+#include:datetime2
+#include:draftwatermark
+#include:environ
+#include:epigraph
+#include:etoc
#include:etoolbox
-#include:xpatch
-#include:morewrites%
#include:filehook
-#include:hopatch
-#include:xifthen
-#include:xkeyval%
+#include:fncychap
#include:geometry
#include:graphicx
-#include:environ
-#include:adjustbox
-#include:array
-#include:xstring
-#include:textcase
-#include:translator
+#include:hopatch
+#include:hypcap
+#include:ifdraft
+#include:iflang
#include:iftex
-#include:epigraph
-#include:tcolorbox
+#include:letltxmacro
#include:marvosym
+#include:morewrites
+#include:nonumonpart
+#include:pgfopts
#include:setspace
-#include:etoc
+#include:tcolorbox
+#include:textcase
+#include:titlesec
#include:tocbibind
-#include:nonumonpart
+#include:translator
+#include:twoopt
#include:xcolor
-#include:datatool
-#include:fncychap
-#include:titleps
-#include:ifdraft
-#include:colophon
-#include:draftwatermark
-#include:babel
-#include:iflang
-#include:datetime
-#include:hypcap
-#include:bookmark
-#include:glossaries-babel
+#include:xifthen
+#include:xkeyval
+#include:xpatch
+#include:xstring
#
# Document class
#keyvals:\documentclass/yathesis
@@ -6658,10 +6625,10 @@ adjustbox
setspace
xcolor
datatool
-titleps
+titlesec
draftwatermark
babel
-datetime
+datetime2
#endkeyvals
#
\yadsetup{%<options%>}#n
@@ -6704,39 +6671,17 @@ datetime
\doctoralschool[%<précision(s)%>]{nom de l'école doctorale%text}#n
\laboratory[%<précision(s)%>]{%<nom du laboratoire%>}{%<adresse du laboratoire%>}#n
#
-#keyvals:\pres
+#keyvals:\pres,\comue,\doctoralschool
logo=
logoheight=
url=
#endkeyvals
-#keyvals:\comue
-logo=
-logoheight=
-url=
-#endkeyvals
-#keyvals:\institute
+#keyvals:\institute,\coinstitute,\company
logo=
logoheight=
url=
nologo
#endkeyvals
-#keyvals:\coinstitute
-logo=
-logoheight=
-url=
-nologo
-#endkeyvals
-#keyvals:\company
-logo=
-logoheight=
-url=
-nologo
-#endkeyvals
-#keyvals:\doctoralschool
-logo=
-logoheight=
-url=
-#endkeyvals
#keyvals:\laboratory
logo=
logoheight=
@@ -6993,7 +6938,7 @@ name=
\AfterEndPreamble{
\pretocmd{\tableofcontents@YAD@without@argument}{\cleardoublepage\zlabel{tableofcontents-withoutargument}}{}{}
\pretocmd{\tableofcontents@YAD@with@argument}{\cleardoublepage\zlabel{tableofcontents-withargument}}{}{}
- \pretocmd{\YAD@insert@colophon}{\clearpage\zlabel{colophon}}{}{}
+ \pretocmd{\printcolophontext}{\zlabel{colophon}}{}{}
\pretocmd{\maketitle}{\zlabel{fr-title}}{}{}%
\pretocmd{\makedisclaimer}{\cleardoublepage\zlabel{disclaimer}}{}{}
\pretocmd{\makekeywords}{\cleardoublepage\zlabel{keywords}}{}{}
@@ -7022,6 +6967,9 @@ name=
\ifthenelse{\equal{#3}{Contexte du chaos du rire}}{\cleardoublepage\zlabel{chapter}%
}{%
}%
+ \ifthenelse{\equal{#3}{Développement du chaos du rire}}{\zlabel{localbib}%
+ }{%
+ }%
\ifthenelse{\equal{#3}{Documents juridiques}}{\cleardoublepage\zlabel{appendix}%
}{%
}%
@@ -7093,8 +7041,7 @@ $clean_ext .= 'synctex.gz* run.xml tex.bak out bbl bcf fdb_latexmk run tdo listi
\endinput
%%% Local Variables:
-%%% mode: tex
-%%% eval: (doctex-mode)
+%%% mode: doctex
%%% ispell-local-dictionary: "francais"
%%% TeX-command-default: "TeX"
%%% TeX-master: t
diff --git a/Master/texmf-dist/source/latex/youngtab/youngtab.dtx b/Master/texmf-dist/source/latex/youngtab/youngtab.dtx
deleted file mode 100644
index 8db18c88c68..00000000000
--- a/Master/texmf-dist/source/latex/youngtab/youngtab.dtx
+++ /dev/null
@@ -1,842 +0,0 @@
-% \iffalse
-%% File: youngtab.dtx
-%% Copyright (C) 1996,98,99 Volker B"orchers and Stefan Gieseke,
-%% This program can be redistributed and/or modified under the terms
-%% of the LaTeX Project Public License Distributed from CTAN
-%% archives in directory macros/latex/base/lppl.txt; either
-%% version 1 of the License, or any later version.
-%
-%<package>\NeedsTeXFormat{LaTeX2e}
-%<package>\ProvidesPackage{youngtab}
-%<package>[1999/05/19 v1.1; Macros for Young-Tableaux]
-%
-%<*driver>
-\documentclass{ltxdoc}
-\usepackage[enableskew]{youngtab}
-\GetFileInfo{youngtab.sty}
-\begin{document}
-\title{The \textsf{youngtab} package\thanks{This file has version number
- \fileversion, dated \filedate.}}
-\author{Volker B\"orchers\thanks{email: boercher@physik.uni-bremen.de}
- \\Stefan Gieseke\\
- Universit\"at Bremen}
-\date{\filedate}
- \maketitle
- \DocInput{youngtab.dtx}
-\end{document}
-%</driver>
-% \fi
-%\iffalse
-%
-%% Package `youngtab' to use with TeX, LaTeX209 or LaTeX2e
-%% (You will need LaTeX2e to extract the documentation and a STY-file
-%% without comments from the .dtx file)
-%
-% Version: Date: Changes:
-%
-% 1.0 1996/03/25 First working version. (After much
-% frustrating tries to teach TeX accept
-% indefinite count of arguments - lerning TeX
-% in the meanwhile)
-% 1.1 1998/05/05 Added possibility to typeset ``skew''
-% tableaux (package option `enableskew')
-% suggested by Andrew Mathas
-% <mathas@maths.usyd.edu.au>. Added AUC-TeX
-% support for the youngtab macros (youngtab.el).
-% 1999/05/19 Only change: added licence informations
-%\fi
-%
-%
-% \DoNotIndex{\advance,\box,\CurrentOption,\DeclareOption,\def}
-% \DoNotIndex{\else,\fi,\hbox,\hfil,\hrule,\hspace,\ht,\ifcat}
-% \DoNotIndex{\ifmmode,\ifnum,\ifvoid,\loop,\MessageBreak,\newcount}
-% \DoNotIndex{\newdimen,\newif,\newskip,\offinterlineskip}
-% \DoNotIndex{\PackageWarning,\ProcessOptions,\relax,\repeat,\setbox}
-% \DoNotIndex{\space,\typeout,\unskip,\vbox,\vcenter,\vrule,\vspace}
-%
-% \CheckSum{322}
-%
-% \newcommand{\yt}{Young-Tableau}
-% \newcommand{\yts}{Young-Tableaux}
-% \newcommand{\newfeature}[1]{\leavevmode%
-% \marginpar{\small\sffamily\begin{center}
-% New feature\\#1\end{center}}}
-%
-% \begin{abstract}
-% This package provides two macros for typesetting
-% \yts\ with \TeX\ or \LaTeX. We use 2 macros, the first for empty
-% boxes (|\yng|), and the second for labelled boxes (|\young|). The
-% syntax of the macros is simple to avoid spelling-mistakes.
-% \end{abstract}
-%
-% \tableofcontents
-%
-% \section{Introduction}
-% The \yt-formalism is a strong algrebraic tool in group theory. Of course
-% we will deal here only with the problems of \emph{typesetting} \yts.
-% They are mathematical objects, so they usually occur in mathematical
-% environments. On the surface \yts\ consist of boxes like this:
-% \yng(1) --- or optionally labelled (usually with letters): \young(a).
-%
-% There is already one \LaTeX-package for typesetting \yts, the
-% \texttt{young.sty} by J\"org Knappen (based on |young.tex| by P. E. S.
-% Wormer). It provides a \texttt{Young}-environment with a syntax
-% similar to the \texttt{tabular}-environment.
-%
-% An Example for the usage of \texttt{Young}:
-%
-% \begin{minipage}[t]{5cm}
-% \begin{verbatim}
-% \begin{Young}
-% $a$&&\cr
-% &\cr
-% \cr
-% \end{Young}
-% \end{verbatim}
-% \end{minipage}
-% \parbox[t]{4cm}{ \young(a\hfil\hfil,\hfil\hfil,\hfil) }
-%
-% \iffalse
-% COMMENT: Maybe that's not the correct way to pretend the use of the
-% |Young|-environment, but otherwise we had to use |young.sty| only
-% for this tableau!
-% \fi
-%
-% This way of implementing \yts\ has one big advantage: It can deal with
-% an indefinite number of rows and columns (of course this is needed!).
-% A second argument for using a \texttt{tabular}-like environment might
-% be it's simple encoding.
-%
-% Nevertheless we wanted a simpler user-interface, for the use of |&| and
-% |\cr| is usually a very good source of typing mistakes (e.g. you
-% have to type \emph{three} |&|'s to get \emph{four} boxes in one
-% row). In addition the \TeX-code for mathematical relations with more
-% than two or three \yts\ becomes unreadable.
-%
-% The cure would be of course a \emph{macro} with a compact, intuitive
-% syntax. But there is the above mentioned problem: \TeX\ is not made to
-% handle an indefinite number of arguments. For \yts\ composed of empty
-% boxes we would like to have a macro with one argument for each row
-% (counting the number of boxes per row) for example this way:
-% |\thisdoesnotwork{5}{3}{1}|\dots. For \yts\ composed of labelled
-% boxes the problem is even worse since we have one letter
-% \emph{per box}!
-%
-% So we had to hide the fact of having an indefinite number of arguments
-% from \TeX. The macros in this package have --- as \TeX\ sees it ---
-% only one argument; this is parsed for the necessary information
-% by the macros themselves. Whereas, for the user, the number of rows and
-% number of boxes per row are plain to see.
-%
-% \section{Using the youngtab package}
-% Invoke the |youngtab| package by
-% requesting it in the preamble:\footnote{Of course this does not work
-% if you use the |youngtab|-package with \TeX\ instead of \LaTeX. For
-% compatibility-questions see section \ref{compat}}
-%
-% |\usepackage[...]{youngtab}|
-%
-% The package has four options (increasing)\DescribeMacro{Options}.
-% The \emph{first option}, |vcentermath|\DescribeMacro{vcentermath},
-% \emph{turns on} the vertical centering of the tableaux in math mode. The
-% \emph{second option}, |noautoscale|\DescribeMacro{noautoscale}, \emph{turns
-% off} the automatic scaling of the boxes according to the actual font.
-% The \emph{third one}, |stdtext|\DescribeMacro{stdtext}, switches
-% to text mode in the inside of labelled boxes. Choosing one of this
-% options does not mean that you have, for example, to stick to
-% |noautoscale| till the end of your days. You may change this
-% settings as often as you like.\\
-% The \emph{fourth option},
-% |enableskew|\DescribeMacro{enableskew}\newfeature{1998/05/05}
-% enables typesetting of skew \yts\ (tableaux that are not
-% left-aligned). This option is different from the other in the way
-% that there is no command to enable this feature after the package is
-% loaded.
-%
-% \yts\ usually have more than one row, so the vertical alignment is a
-% problem\DescribeMacro{vcentermath}. You can turn on vertical centering
-% (only) in mathmode either by choosing the option |vcentermath| with
-% |\usepackage| or later with the command
-% |\Yvcentermath|\meta{num}. Say |\Yvcentermath1| if you want
-% vertical centering and |\Yvcentermath0| to switch it off. Without
-% vcentering the tableaux are standing on the baseline.
-%
-% Since the boxes are quadratic (if you do not want want this,
-% complain!), there is only one dimension to determine: the length and
-% height of the boxes. Usually the macros determine this for
-% themselves,\footnote{So that a \yt\ e.g.\ \texttt{\bslash young(ab)}
-% \young(ab) appears smaller in a footnote than in normal text!} but
-% you can change this behavior by calling the macro
-% |\Yautoscale|\meta{num}\DescribeMacro{\Yautoscale}. Call it with
-% an argument of |1| if you want autoscaling after this, or with
-% the argument |0| if you want to adjust the box dimensions
-% yourself.
-%
-% \DescribeMacro{\Yboxdim}If you switch off autoscaling and
-% want to change the box dimensions, you have to call the macro
-% |\Yboxdim|\meta{dim} with a usual \TeX--dimension.
-% The argument has to be appended to the macro: |\Yboxdim13pt|. This
-% dimension is the \emph{total} height and width of the boxes --
-% \emph{including the lines.} (For small linethicknesses this
-% makes of course only a small difference.) Note that the use of |\Yboxdim|
-% \emph{implies} |noautoscale|! So to switch from |autoscale| to
-% |noautoscale| one call to |\Yboxdim| is sufficient.
-%
-% There is only one more parameter which determines the appearance of
-% the \yt\DescribeMacro{\Ylinethick}: the lines' thickness. This is
-% set by |\Ylinethick|\meta{dim}. (The default is $0.3pt$).
-%
-% You may add space between a tableau and surrounding stuff by
-% invoking the macro
-% |\Yinterspace|\meta{skip}\DescribeMacro{\Yinterspace}. The advantage
-% of using a \emph{skip} is that this helps \TeX\ to avoid |Over|-
-% or |Underful \hbox|es. The default value is |0ex plus 0.3ex|\,.
-% (Better take |ex| or |em| for the tableaux are scaleable.)
-%
-% \subsection{Empty boxes: \texttt{\protect\bslash yng}}
-% \DescribeMacro\yng
-% The most used variant of \yts\ are those consisting of empty boxes.
-% For the tableau \yng(2,1) you have to type
-% |\yng(2,1)|. If you want it to appear smaller, change the
-% fontsize: |{\tiny\yng(2,1)}| gives \Yautoscale1
-% {\tiny\yng(2,1)}; but remember, this only works if |autoscale|
-% is turned on (default). (If you are in |noautoscale|-mode, restore
-% autoscaling with |\Yautoscale1|.)
-%
-% Some notes on the usage of |\yng| and |\young| in math or
-% text mode\DescribeMacro{math or text?}: You can generate \yts\ in both
-% modes, but differences arise from \emph{vertical centering}.
-% This only works in math mode (if you have chosen it with
-% |\Yvcentermath1|) or |usepackage| option |vcentermath|.
-%
-% The difference is to be seen here:
-% {\tiny\Yvcentermath1 $\yng(1,1)\oplus\yng(1)=$
-% \yng(2,1)}$\oplus$ \dots, which has been generated by
-% \begin{verbatim}
-% {\tiny\Yvcentermath1 $\yng(1,1)\oplus\yng(1)=$
-% \yng(2,1)}$\oplus$ \dots
-% \end{verbatim}
-%
-% Here the tableau in math are centered with respect to the axis of
-% the formula while the one in text mode isn't. Note the
-% dimensions of the tableau on the one hand and the |\oplus| on the
-% other: The dimensions of the \yts\ are determined by the actual
-% text's fontsize (while autoscaling!)\DescribeMacro{sizing}. Try to
-% understand what happens in the following example. --- Do you
-% understand the sizes of the math symbols? (Compare to the example
-% above and have look up the \texttt{.log} file. Don't let \TeX\ fool
-% you by messages about invalid |\normalsize|!)
-% \begin{verbatim}
-% {\tiny\begin{equation}
-% \Yvcentermath1
-% \yng(1,1)\oplus\yng(1)= \Yboxdim{12pt}
-% \yng(2,1)\normalsize\oplus\dots
-% \end{equation}}
-% \end{verbatim}
-% {\tiny\begin{equation}
-% \Yvcentermath1 \yng(1,1)\oplus\yng(1)=
-% \Yboxdim{12pt}\yng(2,1)\normalsize\oplus\dots
-% \end{equation}}
-% \Yautoscale1
-%
-% \subsection{Labelled boxes: \texttt{\protect\bslash young}}
-% \DescribeMacro\young
-% While the sizing of the boxes and the behavior in math/text mode are
-% exactly the same as with |\yng|, we have of course a different syntax:\\
-% |{\scriptsize\young(aa,b)}| results in
-% {\scriptsize\young(aa,b)}. Each line of the tableau is represented
-% by a row of single letters (exactly: ``tokens''). The lines
-% are separated by commas.
-%
-% As you see from the example above the letters |a| and |b| come out in
-% math italics. This does \emph{not} depend on the \yt\ appearing in
-% math or text surround. \emph{The label within a tableau-box is math -- no
-% matter if the tableau is used in text or math mode!} But this is
-% only the default setting. Use either the option |stdtext| to the
-% |\usepackage| command to switch to roman letters or use the macro
-% |\Ystdtext| with an argument of |1|: |\Ystdtext1|. To switch to math
-% again use |\Ystdtext0|.
-%
-% What to do if you don't want to use single letters, but symbols or
-% perhaps some white boxes? There are no limits but it's a bit
-% complicated. The |\young| algorithm for parsing his argument depends
-% strongly on that every label of \emph{one} box,
-% \begin{enumerate}
-% \item consists of only \emph{one token}. Assume first you had
-% \emph{not} said |\Ystdtext1|. To get a single roman `a' then you
-% must not say |\mbox{a}|, because this makes \emph{four} tokens (1st
-% is |\mbox|, 2nd is |{|, 3rd is |a|, 4th is |}|). The cure is
-% simply making one token out of |\mbox{a}| by saying
-% |\newcommand{\rma}{\mbox{a}}| and everything is OK:\footnote{Note
-% that the space after \texttt{\bslash rma} belongs to the token itself.}
-% \newcommand{\rma}{\mbox{a}} |\young(\rma lright\bullet)| = \young(\rma
-% lright\bullet)\\
-% After |\Ystdtext1| it is an error to say |$\bullet$|, since the
-% two math delimiters are single tokens. Do it as described above:
-% \Ystdtext1\\ |\newcommand{\ybullet}{$\bullet$}|\\ and
-% everything is OK: \newcommand{\ybullet}{$\bullet$}
-% |\young(\ybullet works)| = \young(\ybullet works)\,.\Ystdtext0\\
-% To use a symbol or special letter in both modes (|\Ystdtext 0 or 1|)
-% put it in a box (here with an extra tuning):\\
-% |\renewcommand{\ybullet}{\raise1.5pt \hbox{$\bullet$}}|
-% \item Some characters and macros are not allowed: commas (guess why)
-% and the other punctuation marks, spaces, the macro |\space| and also
-% skips like |\,| and |\:|.\footnote{Write to us if you find more.} If
-% you want to have single empty boxes use (\TeX\ primitive) |\hfil|
-% (For understanding this limitations see also |\y@lastargtest| and
-% |\y@nelettertest| in macro section).
-% \end{enumerate}
-%
-%
-% \subsubsection{Skew \yts\ with \texttt{\protect\bslash young}}
-% \newfeature{1998/05/05}
-% As far as described above, the rows of a \yt\ are left-aligned. Since
-% some authors also assigned a meaning to \emph{``skew''} tableaux, this
-% package also supports such along with |\young|. If you want to typeset
-% skew tableaux, you have to enable this via the package option
-% |enableskew|\DescribeMacro{enableskew}. The default behavior of this
-% package is to \emph{dis\/}able skew boxes in order to save \TeX's
-% time, however, it's save to include this option even if you do not use
-% it.
-%
-% Here is an example:
-% |\young(abcd,:bc,::c)|: \raisebox{-1.9\baselineskip}{\young(abcd,:bc,::c)}
-%
-% As you see, the Option |enableskew| makes the colon a special
-% character (only inside the argument of |\young|). \footnote{If you
-% want a colon to appear as it is (do you??), you have to do the same
-% trick as above with an unpleasant extra: define a macro for the
-% colon using the \TeX-primitive \texttt{\bslash char} like this:
-% \texttt{\bslash newcommand{\bslash mycolon}{\bslash char58}}.} In
-% fact all other than the leading colons in a row will simply be
-% ignored, while the first will move the row to the right.
-%
-% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \Yboxdim.4ex
-% \raisebox{-1pt}{\young(:\hfil,\hfil,\hfil,\hfil,\hfil,:\hfil)}
-% This is a\,
-% \young(\hfil,\hfil,\hfil,\hfil,\hfil\hfil\hfil)
-% \young(\hfil,\hfil,\hfil,\hfil,\hfil)
-% \young(\hfil\hfil\hfil,:\hfil,:\hfil,:\hfil,:\hfil)
-% \young(\hfil\hfil\hfil,:\hfil,:\hfil,:\hfil,:\hfil)
-% \young(\hfil,\hfil,\hfil,\hfil,\hfil\hfil\hfil)
-% \young(\hfil\hfil\hfil,\hfil,\hfil\hfil,\hfil,\hfil\hfil\hfil)
-% \hspace{.7ex}
-% \young(\hfil\hfil\hfil,:\hfil,:\hfil,:\hfil,:\hfil)
-% \young(\hfil\hfil\hfil,\hfil,\hfil\hfil,\hfil,\hfil\hfil\hfil)
-% \young(:\hfil\hfil\hfil,\hfil,:\hfil\hfil,:::\hfil,\hfil\hfil\hfil)
-% \young(\hfil\hfil\hfil,:\hfil,:\hfil,:\hfil,:\hfil)
-% of skew tableaux.
-% \raisebox{-1pt}{\young(\hfil,:\hfil,:\hfil,:\hfil,:\hfil,\hfil)}
-% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% \Yautoscale1
-%
-%
-% \subsection{The \texttt{youngtab} package and \TeX}\label{compat}
-% \DescribeMacro{Compatibility}Because we do not use \PlainTeX, the
-% compatibility of this package and \TeX\ is not sufficiently tested.
-% However there are some changes necessary in |youngtab.sty| (see file
-% \texttt{youngtab.tex}, part of the distribution):
-% \begin{itemize}
-% \item The macros themselves only use two \LaTeX-commands,
-% |\vspace{|\meta{dim}|}| and |\hspace{|\meta{dim}|}|. One has to
-% replace them with `|\vskip |\meta{dim}' resp.\ `|\hskip|
-% \meta{dim}'\,. (The braces also have to get removed) The
-% \LaTeX-counterparts may be better but no problems should arise
-% from this replacement (we found none).
-% \item One has to remove all lines containing \LaTeXe-commands in the
-% preamble of the |.sty| file, e.g.\ comment out every line that
-% contains the following commands: |\DeclareOption|,
-% |\ProcessOptions|, |\NeedsTeXFormat| and |\ProvidesPackage|.
-% \item Since \TeX-input files must not contain a |@|,
-% |\catcode`\@11\relax| has to be added to the begin of the |.sty| file to
-% make |@| a |letter| and |\catcode`\@12\relax| at the end right
-% before the |\endinput|, to make it |other| again afterwards.
-% \item \textbf{Skew:}\hspace{1em} \TeX\ knows nothing about
-% style-options, we have to find a way to enable skew
-% \yts. (|enableskew| is the only package option that can \emph{not}
-% be accessed by a macro \emph{after loading} the package since
-% almost all according actions will be done at loading time).\\
-% Therefore, we will check if a macro |\enableskew| is defined at loading
-% time:\\[.3ex]
-% | \expandafter\ifx\csname enableskew\endcsname\relax|\\
-% | \y@enable@skewfalse \else \y@enable@skewtrue\fi|\\[.3ex]
-% (excerpt from |youngtab.tex|) Then this will enable printing of
-% skew tableaux: \hfil|\def\enableskew{1} \input youngtab|
-% \item The autoscaling doesn't work as nice as with \LaTeX\ since if
-% you lower the text's fontsize (which determines the boxsize), you
-% have to lower also the math fontsize. Otherwise the letters in
-% labelled boxes (math!) are too big for the box.
-% \end{itemize}
-%
-% \subsection{To do}
-% We have a \textbf{wish list}, things we think the package should be
-% capable of:
-% \begin{itemize}
-% \item A vertical alignment, in the way that the \emph{top}line of the
-% \yts\ and the mathsymbols are on the same height (perhaps using
-% |\vtop|?).
-% \item The macros should take notice of math fontsize changes e.g.\ with
-% \texttt{\bslash dis\-play\-style}. (This puts a focus on the autoscale
-% mechanism -- see |\y@setdim| in the macro section.)
-% \end{itemize}
-% \textbf{If You} have any problems, suggestions, critical remarks -- or
-% whatever according this package write to Volker B\"orchers
-% (email-adress see title).\\
-% {\tiny\yng(61)}
-%
-% \StopEventually{}
-%
-% \section{The Macros}
-%
-% \begin{macrocode}
-%<*package>
-% \end{macrocode}
-%
-% \begin{macro}{\Yautoscale}
-% \begin{macro}{\ify@autoscale}
-% If autoscaling is active, the size of the boxes (|\y@boxdim|) is
-% determined by the package itselve. The default setting is to
-% allow autoscale. |\Yautoscale|\meta{num} serves as the user
-% interface.\footnote{I know - it's against the \LaTeXe naming
-% conventions, but it is nicer\dots} We made an option to |\usepackage|
-% out of that (see below).
-% \begin{macrocode}
-\newif\ify@autoscale \y@autoscaletrue \def\Yautoscale#1{\ifnum #1=0
- \y@autoscalefalse\else\y@autoscaletrue\fi}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \begin{macro}{\Yboxdim}
-% \begin{macro}{\y@b@xdim}
-% \begin{macro}{\y@boxdim}
-% The parameters determining the size of the single boxes and the macro
-% to set them. |\Yboxdim|\meta{dim} sets |\y@boxdim| (only used, when
-% autoscaling is turned off) and sets |y@autoscale| to
-% |false|. |\y@boxdim| is the \emph{total} size of the box (including
-% the delimiting lines) while |\y@b@xdim| (to be set in |\y@setdim|) is
-% the height and width of the inner of the box.
-% \begin{macrocode}
-\newdimen\y@b@xdim
-\newdimen\y@boxdim \y@boxdim=13pt
-\def\Yboxdim#1{\y@autoscalefalse\y@boxdim=#1}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\Ylinethick}
-% \begin{macro}{\y@linethick}
-% The line thickness and |\Ylinethick|\meta{dim} as user interface to it.
-% \begin{macrocode}
-\newdimen\y@linethick \y@linethick=.3pt
-\def\Ylinethick#1{\y@linethick=#1}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\Yinterspace}
-% \begin{macro}{\y@interspace}
-% To give the \yts\ extra-space (before and after) |\y@interspace| can
-% be set to more than |0pt| by calling |\Yinterspace|. (See |\yng| and
-% |\young|.) Note that this is a \emph{skip} and no \emph{dimemsion}.
-% \begin{macrocode}
-\newskip\y@interspace \y@interspace=0ex plus 0.3ex
-\def\Yinterspace#1{\y@interspace=#1}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\Yvcentermath}
-% \begin{macro}{\ify@vcenter}
-% The switch to turn vertical centering in math on or off. The default
-% is |\y@vcenterfalse|. The second option to |\usepackage|.
-% \begin{macrocode}
-\newif\ify@vcenter \y@vcenterfalse
-\def\Yvcentermath#1{\ifnum #1=0 \y@vcenterfalse\else\y@vcentertrue\fi}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\Ystdtext}
-% \begin{macro}{\ify@stdtext}
-% Normally the inside of the boxes (|\young|) is in math mode. This code
-% allows to switch to text mode.
-% \begin{macrocode}
-\newif\ify@stdtext \y@stdtextfalse
-\def\Ystdtext#1{\ifnum #1=0 \y@stdtextfalse\else\y@stdtexttrue\fi}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\ify@enable@skew}
-% In contrast to the other this \texttt{if} may be set only via the
-% package option |enableskew|.
-% \begin{macrocode}
-\newif\ify@enable@skew \y@enable@skewfalse
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{noautoscale}
-% \begin{macro}{vcentermath}
-% \begin{macro}{stdtext}
-% \begin{macro}{enableskew}
-% Declaration and processing of the options for use with
-% \LaTeXe. (For \TeX-users: Comment the following 8 lines out).
-% \begin{macrocode}
-\DeclareOption{noautoscale}{\y@autoscalefalse}
-\DeclareOption{vcentermath}{\y@vcentertrue}
-\DeclareOption{stdtext}{\y@vcentertrue}
-\DeclareOption{enableskew}{\y@enable@skewtrue}
-\DeclareOption*{\PackageWarning{youngtab}{%
- Unknown option `\CurrentOption' (Known:\MessageBreak
- `vcentermath', `noautoscale', `stdtext', `enableskew'.)}}
-\ProcessOptions\relax
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\y@vr}
-% A single vertical line to build the boxes. The reason for the depht of
-% the line should be clear. (The values for the depth maybe something
-% you want to tune)
-% \begin{macrocode}
-\def\y@vr{\vrule height0.8\y@b@xdim width\y@linethick depth 0.2\y@b@xdim}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\y@emptybox}
-% This macro does less than its name pretend: It only makes one vertical
-% line followed by a empty box (width: |\y@boxdim| -- 2|\y@linethick|).
-% \begin{macrocode}
-\def\y@emptybox{\y@vr\hbox to \y@b@xdim{\hfil}}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\y@abcbox}
-% \begin{macro}{\y@mathabcbox}
-% If |enableskew| is not choosen (the package options have been
-% parsed now), a |\y@abcbox| or a |\y@mathabcbox| is the simple
-% analogue to |\y@emptybox| but it has a \emph{text-font} letter
-% centered in it.\\
-% For |\y@mathabcbox| the inside is math. We rather want an
-% easier access to math italics and symbols than to normal text; so we
-% usually use |\y@mathabcbox| instead of |\y@abcbox|.
-%
-% Skew \yts\ can only be used with |\young|. Then a colon is used to
-% \emph{shift} the row to the \emph{right} -- instead of ``inserting
-% a box without border'' -- so the colon boxes must be ignored.
-% \begin{macrocode}
-\ify@enable@skew
- \def\y@abcbox#1{\if :#1\else
- \y@vr\hbox to \y@b@xdim{\hfil#1\hfil}\fi}
- \def\y@mathabcbox#1{\if :#1\else
- \y@vr\hbox to \y@b@xdim{\hfil$#1$\hfil}\fi}
-\else
- \def\y@abcbox#1{\y@vr\hbox to \y@b@xdim{\hfil#1\hfil}}
- \def\y@mathabcbox#1{\y@vr\hbox to \y@b@xdim{\hfil$#1$\hfil}}
-\fi
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\y@setdim}
-% This macro is called at the beginning of the macros |\yng| and
-% |\young|. If |autoscale| is deactivated the box height and width is
-% |\y@boxdim| - 2|\y@linethick|. If not we save a box for temporary
-% usage, use the height of it to find a good size of the box, fill the
-% boxregister with a empty box, and clear the box again by using it.
-%
-% That's not elegant but I didn't know better\dots How can I determine
-% the height of the font in an other way? (I tried it with the \TeX-measure
-% |ex| -- but this did not seem to work in any case.) Or -- if I have
-% to use setbox -- which boxregister should I use? Is the |\ifvoid| test
-% obsolete? (First I used |\box0| -- till I found me competing with
-% \AmSTeX\ for this box.)
-% \begin{macrocode}
-\def\y@setdim{%
- \ify@autoscale%
- \ifvoid1\else\typeout{Package youngtab: box1 not free! Expect an
- error!}\fi%
- \setbox1=\hbox{A}\y@b@xdim=1.6\ht1 \setbox1=\hbox{}\box1%
- \else\y@b@xdim=\y@boxdim \advance\y@b@xdim by -2\y@linethick
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\y@counter}
-% A counter for loops.
-% \begin{macrocode}
-\newcount\y@counter
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\y@lastargtest}
-% This macro is a hack to get \TeX\ to accept a indefinite number of
-% arguments (here: the number of \emph{lines} separated by commas). It
-% does nothing with its arguments but to see if the second is a space,
-% and, if it is to set |\y@islastargtrue|.\footnote{The
-% \texttt{islastarg} conditions are also used if the end of one line
-% of labelled boxes is reached.}
-% \begin{macrocode}
-\newif\ify@islastarg
-\def\y@lastargtest#1,#2 {\if\space #2 \y@islastargtrue
- \else\y@islastargfalse\fi}
-% \end{macrocode}
-% How does it work? An Example:
-%
-% \verb*+\y@lastargtest first,second +\\
-% Here |#1| is |first| and |#2| is |second|. The |\if| construction
-% tests if the (expanded) \emph{first} token of |#2| and |\space|
-% (here: |s|) are equal. -- They are not. In the next example the
-% condition is |true|:
-%
-% \verb*+\y@lastargtest first, +\\
-% Here |#1| is again |first| but |\y@lastargtest| catches the blank
-% after the comma to be |#2|. The |\if| condition now is true and
-% |\y@islastargtrue| is set. Remember: the blank is essential!
-% \end{macro}
-%
-% \begin{macro}{\y@emptyboxes}
-% This macro draws |#1| (this is a number) empty boxes (|\y@emptybox|)
-% -- without a top or bottom line:
-%
-% |:\y@emptyboxes3:| \hspace{0.5em} is
-% :$\mid$\hspace{0.8em}$\mid$\hspace{0.8em}$\mid$\hspace{0.8em}:
-% \begin{macrocode}
-\def\y@emptyboxes#1{\y@counter=#1\loop\ifnum\y@counter>0
- \advance\y@counter by -1 \y@emptybox\repeat}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\y@nelineemptyboxes}
-% This calls |\y@emptyboxes| and adds the top and bottom lines (I think
-% this is faster than draw single, complete boxes) and a right closing
-% vertical line. Because of the |\vspace| command the top line of the
-% eventually following next box-row will be drawn over the bottom line of
-% this box-row.
-% \begin{macrocode}
-\def\y@nelineemptyboxes#1{%
- \vbox{%
- \hrule height\y@linethick%
- \hbox{\y@emptyboxes{#1}\y@vr}
- \hrule height\y@linethick}\vspace{-\y@linethick}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\yng}
-% The user-macro for empty \yts. As mentioned above it has only one
-% argument, enclosed in brackets. It first calls |\y@setdim| to
-% determine the size of the boxes and opens a |\vcenter| if in math mode
-% and |vcentermath| is set. Otherwise only a (then obsolet) |{| is
-% opened. |\y@lastargtest| determines if the tableau should have only
-% one line, setting |\y@islastargtrue| or -|false|. If there is only one
-% line, |\yng| does the whole job in calling
-% |\y@nelineemptyboxes| once. Otherwise it calls |\y@ungempty| to do the
-% real thing. Note the spacing before and after the tableau using
-% |\hspace|.
-% \begin{macrocode}
-\def\yng(#1){%
- \y@setdim%
- \hspace{\y@interspace}%
- \ifmmode\ify@vcenter\vcenter\fi\fi{%
- \y@lastargtest#1,
- \vbox{\offinterlineskip
- \ify@islastarg
- \y@nelineemptyboxes{#1}
- \else
- \y@ungempty(#1)
- \fi}}\hspace{\y@interspace}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\y@ungempty}
-% It is called with |\y@ungempty(#1)| from |\yng|. Now the parsing of
-% the arguments starts! As we know from |\y@lastargtest| in
-% |\yng|, there really are two arguments left. Explicitely: Let the
-% the initial command (given by the user) be |\yng(3,2,1)|; then
-% |\yng| calls |\y@ungempty(3,2,1)|. But |\y@ungempty| sees two
-% arguments: |#1| is |3| and |#2| is |2,1|! (Note the importance of the
-% brackets). |\y@ungempty| then processes the first argument immediately,
-% calling |\y@nelineemptyboxes|. (The braces protect numbers with more
-% than one digit.)
-%
-% The next step is to check if |#2| is the last line. If it is, it calls
-% \texttt{\bslash y@ne\-line\-empty\-boxes} again. Otherwise it calls
-% \emph{recursively itselve}, till all lines are processed.
-% \begin{macrocode}
-\def\y@ungempty(#1,#2){%
- \y@nelineemptyboxes{#1}
- \y@lastargtest#2,
- \ify@islastarg
- \y@nelineemptyboxes{#2}
- \else
- \y@ungempty(#2)
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\y@nelettertest}
-% The first macro especially for labelled boxes, that is, for
-% |\young|. Like \texttt{\bslash y@last\-arg\-test} it is used for
-% handling a indefinite number of arguments. (As mentioned before
-% \yts\ with labelled boxes have problem double.) |\y@nelettertest|
-% determines if the last box of the line has been reached.
-%
-% Again we will examine it's working method by examples:
-%
-% |\y@nelettertest ab.|\\
-% The period after the argument |ab| (and in the definition of
-% |\y@nelettertest|) is merely a mark for the end of the
-% arguments. (Otherwise \TeX\ would complain about missing arguments.)
-% Here |a| is |#1| and |#2| is |b| -- the |\if|-condition is |false|
-% and so |\y@islastargfalse| is set. Now a little miracle:
-%
-% |\y@nelettertest a.|\\
-% In the opposite to the case of |\y@lastargtest| it's not
-% understandable for me, why |#2| now is a space -- but it is! (Do
-% \emph{you} know the reason why?)
-% The rest is known from |\y@lastargtest|.
-% \begin{macrocode}
-\def\y@nelettertest#1#2. {\if\space #2 \y@islastargtrue
- \else\y@islastargfalse\fi}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\y@abcboxes}
-% Again we use a period to mark the end of arguments. Compare to
-% |\y@emptyboxes| -- Now it is more strenuous! The |\y@nelettertest|
-% macro makes sure that |\y@abcboxes| is called with at least two boxes
-% to process. If there are only two boxes |\y@abcboxes| calls
-% |\y@abcbox| two times, otherwise it calls itselve recursively again.
-% (The argument-splitting works as in |\y@ungempty|.)
-% \begin{macrocode}
-\def\y@abcboxes#1#2.{%
- \ify@stdtext\y@abcbox#1\else\y@mathabcbox#1\fi%
- \y@nelettertest #2.
-% \end{macrocode}
-% There must be a space or (equivalently) a carriage return after this
-% line!
-% \begin{macrocode}
- \ify@islastarg\unskip%
- \ify@stdtext\y@abcbox{#2}\else\y@mathabcbox{#2}\fi%
- \else\y@abcboxes#2.\fi}
-% \end{macrocode}
-% The |\unskip| is needed for the case that |#2| is only one token. Then
-% a space appears between two boxes. (I do not understand really what
-% happens -- see |\y@nelettertest|.) The |\unskip| resolves this problem.
-% \end{macro}
-%
-% \begin{macro}{\ify@enable@skew}
-% \begin{macro}{\y@full@b@xdim}
-% \begin{macro}{\y@m@veright@cnt}
-% Most of the skew boxes stuff can be found here along the definition
-% of \texttt{\bslash y@ne\-line\-abc\-boxes}. We need a further dimension,
-% for the effective lenght of one box in a row, |\y@full@b@xdim| =
-% |\y@b@xdim| + |1\y@linethick| and one counter for the number of
-% boxes to be left out on the left side of the tableau (determined by
-% the number of colons at the beginning of a row), |\y@m@veright@cnt|.
-% \begin{macrocode}
-\ify@enable@skew
- \newdimen\y@full@b@xdim
- \newcount\y@m@veright@cnt
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \begin{macro}{\y@get@m@veright@cnt}
-% To find out the number of leading colons in a row we have the macro
-% \texttt{\bslash y@get@\-m@ve\-right@\-cnt}. Here we use exactly the same
-% trick as in |\y@nelettertest|.
-% \begin{macrocode}
- \def\y@get@m@veright@cnt#1#2.{%
- \if :#1 \advance\y@m@veright@cnt by 1\y@get@m@veright@cnt#2.\fi}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\y@setdim}
-% Since we now have another dimension that depends on |\y@b@xdim|,
-% the dimension of the boxes, we have to extend |\y@setdim| to
-% calculate |\y@full@b@xdim| too. (The dummy |\y@setdim@| is used to
-% avoid a recursion.)
-% \begin{macrocode}
- \let\y@setdim@=\y@setdim
- \def\y@setdim{%
- \y@setdim@ \y@full@b@xdim=\y@b@xdim
- \advance\y@full@b@xdim by 1\y@linethick}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\y@m@veright@ifskew}
-% Now we put it all into the following macro that computes the offset
-% and moves the tableau to the right if necessary. If skew \yts\ are
-% not enabled, |\y@m@veright@ifskew| will be a null-command (but
-% catches the argument).
-% \begin{macrocode}
- \def\y@m@veright@ifskew#1{
- \y@m@veright@cnt=0 \y@get@m@veright@cnt#1.
- \moveright \y@m@veright@cnt\y@full@b@xdim}
-\else
- \def\y@m@veright@ifskew#1{}
-\fi
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\y@nelineabcboxes}
-% This is the counterpart of |\y@nelineemptyboxes|. The difference
-% is the treatment of the case of a row of only one box -- Then only
-% |\y@abcbox| is called and not |\y@abcboxes|. If this row must be
-% moved to the right, this is done by |\y@m@veright@ifskew|.
-% \begin{macrocode}
-\def\y@nelineabcboxes#1{%
- \y@nelettertest #1.
- \ify@islastarg
- \y@m@veright@ifskew{#1}
- \vbox{
- \hrule height\y@linethick%
- \hbox{\ify@stdtext\y@abcbox#1\else\y@mathabcbox#1\fi\y@vr}
- \hrule height\y@linethick}\vspace{-\y@linethick}
- \else
- \y@m@veright@ifskew{#1}
- \vbox{
- \hrule height\y@linethick%
- \hbox{\y@abcboxes #1.\y@vr}%
- \hrule height\y@linethick}\vspace{-\y@linethick}
- \fi}
-% \end{macrocode}
-% \end{macro}
-%
-%
-% \begin{macro}{\young}
-% The user-macro for labelled \yts. It has one argument as |\yng|,
-% enclosed in brackets. Everything is identical as in the emptybox case
-% (sizing, vcentering, treatment of multiple rows, \dots).
-% \begin{macrocode}
-\def\young(#1){%
- \y@setdim%
- \hspace{\y@interspace}%
- \y@lastargtest#1,
- \ifmmode\ify@vcenter\vcenter\fi\fi{%
- \vbox{\offinterlineskip
- \ify@islastarg\y@nelineabcboxes{#1}%
- \else\y@ungabc(#1)%
- \fi}}\hspace{\y@interspace}}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\y@ungabc}
-% Again nothing new -- see |\y@ungempty|
-% \begin{macrocode}
-\def\y@ungabc(#1,#2){%
- \y@nelineabcboxes{#1}%
- \y@lastargtest#2,
- \ify@islastarg\y@nelineabcboxes{#2}%
- \else\y@ungabc(#2)%
- \fi}
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
-%</package>
-% \end{macrocode}
-%
-% \Finale
-\endinput
diff --git a/Master/texmf-dist/source/latex/youngtab/youngtab.ins b/Master/texmf-dist/source/latex/youngtab/youngtab.ins
deleted file mode 100644
index a58ace3a9e0..00000000000
--- a/Master/texmf-dist/source/latex/youngtab/youngtab.ins
+++ /dev/null
@@ -1,36 +0,0 @@
-%%
-%% --------------- start of docstrip commands ------------------
-%%
-\def\batchfile{youngtab.ins}
-\input docstrip.tex
-\preamble
-
-Copyright (C) 1996,98,99 Volker B"orchers and Stefan Gieseke,
-This program can be redistributed and/or modified under the terms
-of the LaTeX Project Public License Distributed from CTAN
-archives in directory macros/latex/base/lppl.txt; either
-version 1 of the License, or any later version.
-
-\endpreamble
-\def\filedate{1999/05/19}
-\input docstrip
-\keepsilent
-
-\generateFile{youngtab.sty}{t}{\from{youngtab.dtx}{package}}
-
-\ifToplevel{
-\Msg{***********************************************************}
-\Msg{*}
-\Msg{* To finish the installation you have to move}
-\Msg{* \space\space youngtab.sty}
-\Msg{* into a directory searched by TeX:}
-\Msg{*}
-\Msg{* To produce the documentation run}
-\Msg{* \space\space youngtab.dtx}
-\Msg{* through LaTeX.}
-\Msg{*}
-\Msg{***********************************************************}
-}
-
-
-
diff --git a/Master/texmf-dist/source/latex/zhlipsum/zhlipsum-text.dtx b/Master/texmf-dist/source/latex/zhlipsum/zhlipsum-text.dtx
index 8a314fb10c5..ef9fc2903f4 100644
--- a/Master/texmf-dist/source/latex/zhlipsum/zhlipsum-text.dtx
+++ b/Master/texmf-dist/source/latex/zhlipsum/zhlipsum-text.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>
+% Copyright (C) 2017--2020 by Xiangdong Zeng <xdzeng96@gmail.com>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
diff --git a/Master/texmf-dist/source/latex/zhlipsum/zhlipsum.dtx b/Master/texmf-dist/source/latex/zhlipsum/zhlipsum.dtx
index 3ef3fd63a81..f6e0c1b1181 100644
--- a/Master/texmf-dist/source/latex/zhlipsum/zhlipsum.dtx
+++ b/Master/texmf-dist/source/latex/zhlipsum/zhlipsum.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>
+% Copyright (C) 2017--2020 by Xiangdong Zeng <xdzeng96@gmail.com>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -71,8 +71,8 @@ To install `zhlipsum`, you can use one of the following methods:
Contributing
------------
-[Issues](https://github.com/Stone-Zeng/zhlipsum/issues) and
-[pull requests](https://github.com/Stone-Zeng/zhlipsum/pulls)
+[Issues](https://github.com/stone-zeng/zhlipsum/issues) and
+[pull requests](https://github.com/stone-zeng/zhlipsum/pulls)
are always welcome.
License
@@ -85,7 +85,7 @@ version.
-----
-Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
+Copyright (C) 2017&ndash;2020 by Xiangdong Zeng <xdzeng96@gmail.com>.
%</readme>
%
%<*internal>
@@ -102,7 +102,7 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
\preamble
- Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>
+ Copyright (C) 2017--2020 by Xiangdong Zeng <xdzeng96@gmail.com>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -183,7 +183,7 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\RequirePackage{expl3}
%<*!(driver|install)>
-%<!readme>\GetIdInfo $Id: zhlipsum.dtx 1.1.1 2018-09-08 12:00:00Z Xiangdong Zeng <xdzeng96@gmail.com> $
+%<!readme>\GetIdInfo $Id: zhlipsum.dtx 1.2.0 2020-04-10 12:00:00Z Xiangdong Zeng <xdzeng96@gmail.com> $
%<package> {Chinese dummy text}
%<package>\ProvidesExplPackage{\ExplFileName}
%<utf8> {Chinese dummy text with UTF-8 encoding (for zhlipsum)}
@@ -195,12 +195,12 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
%<!readme> {\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
%</!(driver|install)>
%<*driver>
-%\PassOptionsToPackage{showframe}{geometry}
%^^A! \PassOptionsToPackage{scheme=plain, linespread=1.1}{ctex}
%^^A+
\documentclass{ctxdoc}
\usepackage{multirow}
-\setCJKmonofont{FangSong}[ItalicFont=KaiTi]
+\setCJKmainfont{Source Han Serif SC}[ItalicFont=Kaiti SC]
+\setCJKmonofont{STFangsong}[ItalicFont=Kaiti SC]
%^^A-
\hypersetup{%
pdftitle={zhlipsum: 中文乱数假文(Lorem ipsum)},
@@ -219,21 +219,20 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
%^^A! \pagestyle{headings}
%^^A+
% Use `!` for comment in `ctexexam`.
-\makeatletter
\catcode`!=\active
\RecustomVerbatimEnvironment{ctexexam}{Verbatim}{%
frame=single, framesep=10pt,
%^^A-
gobble=4,
label=\rule{0pt}{12pt}\textnormal{\bfseries 例 \arabic{ctexexam}},
-%^^A! gobble=2,
-%^^A! label=\rule{0pt}{12pt}\textnormal{\bfseries Example \arabic{ctexexam}},
+ defineactive=\def!{\color{gray}\%},
+%^^A! gobble=2,
+%^^A! label=\rule{0pt}{12pt}\textnormal{\bfseries Example \arabic{ctexexam}},
+%^^A! defineactive=\def!{\color{gray}\itshape\%},
%^^A+
listparameters=%
\setlength\topsep{\bigskipamount}%
- \refstepcounter{ctexexam}\ctexexamlabelref
- \appto\FV@EndList{\nointerlineskip},
- defineactive=\def!{\color{gray}\itshape\%}}
+ \refstepcounter{ctexexam}\ctexexamlabelref}
\preto\ctexexam{\catcode`!=\active}
\preto\endctexexam{\catcode`!=12}
\catcode`!=12
@@ -252,17 +251,6 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
}
\group_end:
}
-% From l3doc, to make @@ -> <module> while @@@@ -> @@
-\cs_set_protected:Npn \__ctxdoc_replace_at_at_aux:Nn #1#2
- {
- \tl_replace_all:Nnn #1 { \token_to_str:N @ } { @ }
- \tl_replace_all:Nnn #1 { \token_to_str:N _ } { _ }
- \tl_replace_all:Nnn #1 { @ @ @ @ } { \token_to_str:N a a }
- \tl_replace_all:Nnn #1 { _ _ @ @ } { _ _ #2 }
- \tl_replace_all:Nnn #1 { _ @ @ } { _ _ #2 }
- \tl_replace_all:Nnn #1 { @ @ } { _ _ #2 }
- \tl_replace_all:Nnn #1 { \token_to_str:N a a } { @ @ }
- }
\ExplSyntaxOff
\makeatother
\RenewDocumentEnvironment{arguments}{}%
@@ -313,12 +301,12 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
%
% \title{\textbf{zhlipsum: 中文乱数假文(Lorem ipsum)}}
% \author{曾祥东}
-% \date{2018/09/08 \quad v1.1.1^^A
-% \thanks{\url{https://github.com/Stone-Zeng/zhlipsum}.}}
+% \date{2020/04/10 \quad v1.2.0^^A
+% \thanks{\url{https://github.com/stone-zeng/zhlipsum}.}}
%^^A! \title{\textbf{The \pkg{zhlipsum} Package: Chinese Dummy Text}}
%^^A! \author{Xiangdong Zeng}
-%^^A! \date{2018/09/08 \quad v1.1.1%
-%^^A! \thanks{\url{https://github.com/Stone-Zeng/zhlipsum}.}}
+%^^A! \date{2020/04/10 \quad v1.2.0%
+%^^A! \thanks{\url{https://github.com/stone-zeng/zhlipsum}.}}
%^^A!
%
%^^A 标题页页边距
@@ -432,8 +420,8 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
%^^A!
%
% 如果使用了 \CTeX{} 宏集,则编码会根据 \CTeX{} 自动确定。但需注意,
-% 在 \CTeX{} 宏集中,相应的宏包选项为 \opt{UTF8} 和 \opt{GBK},而本
-% 宏包中所有选项均为小写。
+% 在 \CTeX{} 宏集中,相应的宏包选项为大写的 \opt{UTF8} 和 \opt{GBK},
+% 而本宏包中所有选项均为小写。
%^^A! If you have loaded \CTeX{} bundle, then the encoding will be
%^^A! selected automatically according to \CTeX{}. Note that in \CTeX{}
%^^A! bundle, the correspoding options are \opt{UTF8} and \opt{GBK},
@@ -441,7 +429,7 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
%^^A!
%
%^^A+
-% \begin{function}[updated=2018-04-08]{\zhlipsum}
+% \begin{function}[updated=2020-04-08]{\zhlipsum}
%^^A-
% \begin{syntax}
% \cs{zhlipsum}\oarg{段落}\oarg{选项}
@@ -460,11 +448,11 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
%^^A! \end{function}
%^^A!
%
-% 默认情况下,不带星号的命令 \cs{zhlipsum} 会在假文段落之前、之后与
-% 之间进行分段(即插入 \tn{par}),而带星号的命令 \cs{zhlipsum}|*|
+% 默认情况下,不带星号的命令 \cs{zhlipsum} 会在假文段落之后与之间
+% 进行分段(即插入 \tn{par}),而带星号的命令 \cs{zhlipsum}|*|
% 则不做额外处理。您可以利用后文给出的 \opt{before}、\opt{after}、
% \opt{inter} 选项来更改默认设置。
-%^^A! By default, the \cs{zhlipsum} command will insert \tn{par} before,
+%^^A! By default, the \cs{zhlipsum} command will insert \tn{par}
%^^A! after and between dummy text paragraphs, while \cs{zhlipsum}|*|
%^^A! will not give any extra processing. To change the default
%^^A! behavior, you can use the \opt{before}, \opt{after} and
@@ -577,17 +565,17 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \begin{function}[added=2018-03-29]{before,after,inter}
%^^A-
% \begin{syntax}
-% name = \meta{内容}
-% after = \meta{内容}
-% inter = \meta{内容}
+% before = \meta{内容}
+% after = \meta{内容}
+% inter = \meta{内容}
% \end{syntax}
% 在假文段落之前、之后与之间插入内容。注意使用不带星号的
% \cs{zhlipsum} 命令时插入的分段命令会被这里的设置覆盖。
% \end{function}
%^^A! \begin{syntax}
-%^^A! name = \meta{content}
-%^^A! after = \meta{content}
-%^^A! inter = \meta{content}
+%^^A! before = \meta{content}
+%^^A! after = \meta{content}
+%^^A! inter = \meta{content}
%^^A! \end{syntax}
%^^A! Insert contents before, after or between dummy text paragraphs.
%^^A! Note that the \tn{par} command inserted when using \cs{zhlipsum}
@@ -767,8 +755,8 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
% ! \usepackage[encoding=big5]{zhlipsum}
%
% ! 直接使用 \newzhlipsum{big5}{許蓋功, 蓋功許, 功許蓋} 会报错
-% ! 原理:在分组内用 <、>、+ 代替 {、}、\,再将原先的 {、}、\ 设为“其他”
-% ! 类(即类别码为 12)
+% ! 原理:分组内使用 < > + 代替 { } \ 后,再将原先的 { } \ 设为“其他”类(即
+% ! 类别码为 12)
% \begingroup
% \catcode`\<=1
% \catcode`\>=2
@@ -786,7 +774,7 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
%^^A!
%^^A! ! Using `\newzhlipsum{big5}{許蓋功, 蓋功許, 功許蓋}' directly will
%^^A! ! lead to an error.
-%^^A! ! Use <, >, + to replace {, } and \, and set the original {, } and \
+%^^A! ! Use <, >, + to replace {, } and \, then set the original {, } and \
%^^A! ! to be `other' category (i.e. catcode=12).
%^^A! \begingroup
%^^A! \catcode`\<=1
@@ -833,19 +821,17 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
%
% \subsection{内部变量和函数}
%
-% \begin{variable}{\l_@@_tmpa_tl,\l_@@_tmpa_seq,\l_@@_tmpb_seq}
+% \begin{variable}{
+% \l_@@_tmpa_tl,
+% \l_@@_tmpa_seq,
+% \l_@@_tmpb_seq,
+% \l_@@_tmpa_str}
% 临时变量。
% \begin{macrocode}
\tl_new:N \l_@@_tmpa_tl
\seq_new:N \l_@@_tmpa_seq
\seq_new:N \l_@@_tmpb_seq
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\g_@@_encoding_tl}
-% 编码信息。
-% \begin{macrocode}
-\tl_new:N \g_@@_encoding_tl
+\str_new:N \l_@@_tmpa_str
% \end{macrocode}
% \end{variable}
%
@@ -859,56 +845,64 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \begin{variable}{\c_zhlipsum_simp_seq,\c_zhlipsum_trad_seq}
% 预定义的简体中文与繁体中文的假文名称列表。
% \begin{macrocode}
-\seq_new:N \c_zhlipsum_simp_seq
-\seq_new:N \c_zhlipsum_trad_seq
-\seq_set_from_clist:Nn \c_zhlipsum_simp_seq { simp, zhufu, aspirin }
-\seq_set_from_clist:Nn \c_zhlipsum_trad_seq { trad, xiangyu, nanshanjing }
+\seq_const_from_clist:Nn \c_zhlipsum_simp_seq { simp, zhufu, aspirin }
+\seq_const_from_clist:Nn \c_zhlipsum_trad_seq { trad, xiangyu, nanshanjing }
% \end{macrocode}
% \end{variable}
%
+% \begin{macro}[int]{\file_input:x}
% \LaTeX3 函数变体。
% \begin{macrocode}
\cs_generate_variant:Nn \file_input:n { x }
-\prg_generate_conditional_variant:Nnn \tl_if_eq:nn { Vn } { T, TF }
% \end{macrocode}
+% \end{macro}
%
-% \begin{macro}[int,TF]{\@@_if_unicode_engine:}
+% \begin{macro}[TF]{\@@_if_unicode_engine:}
% 判断是否为 Unicode 引擎。来自于 \pkg{zhnumber} 宏包。
% \begin{macrocode}
-\prg_new_protected_conditional:Npnn \@@_if_unicode_engine: { T, F, TF }
+\prg_new_conditional:Npnn \@@_if_unicode_engine: { T, F, TF }
{
\bool_lazy_any:nTF
{
- { \sys_if_engine_xetex_p: }
- { \sys_if_engine_luatex_p: }
- { \sys_if_engine_uptex_p: }
+ \sys_if_engine_xetex_p:
+ \sys_if_engine_luatex_p:
+ \sys_if_engine_uptex_p:
}
- { \prg_return_true: }
- { \prg_return_false: }
+ { \prg_return_true: } { \prg_return_false: }
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}[TF]{\@@_if_encoding:n}
+% \begin{variable}{\g_@@_encoding_str}
% 判断当前编码。
% \begin{macrocode}
-\prg_new_protected_conditional:Npnn \@@_if_encoding:n #1 { T, F, TF }
+\prg_new_conditional:Npnn \@@_if_encoding:n #1 { T, F, TF }
{
- \tl_if_eq:VnTF \g_@@_encoding_tl {#1}
+ \str_if_eq:VnTF \g_@@_encoding_str {#1}
{ \prg_return_true: } { \prg_return_false: }
}
+\prg_generate_conditional_variant:Nnn \@@_if_encoding:n { V } { T, F, TF }
+\str_new:N \g_@@_encoding_str
% \end{macrocode}
+% \end{variable}
% \end{macro}
%
-% \begin{macro}{\@@_msg_new:nn,
-% \@@_error:n,\@@_error:nn,
-% \@@_warning:nn,\@@_warning:nnn,\@@_warning:nxxx,
+% \begin{macro}{
+% \@@_msg_new:nn,
+% \@@_error:n,
+% \@@_error:nn,
+% \@@_warning:n,
+% \@@_warning:nn,
+% \@@_warning:nnn,
+% \@@_warning:nxxx,
% \@@_info:nn}
% 各种信息函数的缩略形式。
% \begin{macrocode}
\cs_new:Npn \@@_msg_new:nn { \msg_new:nnn { zhlipsum } }
\cs_new:Npn \@@_error:n { \msg_error:nn { zhlipsum } }
\cs_new:Npn \@@_error:nn { \msg_error:nnn { zhlipsum } }
+\cs_new:Npn \@@_warning:n { \msg_warning:nn { zhlipsum } }
\cs_new:Npn \@@_warning:nn { \msg_warning:nnn { zhlipsum } }
\cs_new:Npn \@@_warning:nnn { \msg_warning:nnnn { zhlipsum } }
\cs_new:Npn \@@_warning:nxxx { \msg_warning:nnxxx { zhlipsum } }
@@ -916,17 +910,12 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_par:}
-% 分段命令。
-% \begin{macrocode}
-\cs_new_eq:NN \@@_par: \tex_par:D
-% \end{macrocode}
-% \end{macro}
-%
% \subsection{宏包选项}
%
% \changes{v0.4}{2017/09/16}{新增 \opt{encoding} 选项。}
% \changes{v0.5}{2017/12/22}{支持 Big5 编码。}
+% \changes{v1.0.0}{2018/04/01}{根据 \CTeX{} 宏集的选项自动确定编码。}
+% \changes{v1.2.0}{2020/02/20}{优化编码判断。}
%
% \begin{macro}{encoding}
% 设置编码。
@@ -935,19 +924,7 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
{
encoding .choices:nn =
{ utf8, gbk, big5 }
- {
- \tl_gset_eq:NN \g_@@_encoding_tl \l_keys_choice_tl
- \@@_if_unicode_engine:T
- {
- \@@_if_encoding:nF { utf8 }
- {
- \tl_gset:Nn \g_@@_encoding_tl { utf8 }
- \@@_warning:nn { unicode-engine } {#1}
- }
- }
- \@@_if_ctex_valid_encoding:F
- { \@@_error:nn { ctex-invalid-encoding } {#1} }
- },
+ { \str_gset:Nn \g_@@_encoding_str {#1} },
encoding / unknown .code:n =
{ \@@_error:nn { invalid-encoding } {#1} },
encoding .value_required:n = true,
@@ -962,64 +939,78 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
%
% 提示信息。
% \begin{macrocode}
-\@@_msg_new:nn { unicode-engine }
- {
- You~ are~ now~ using~ Unicode~ engine~ \c_sys_engine_str. \\
- Encoding~ "#1"~ is~ invalid.~ Changed~ into~ "utf8".
- }
-\@@_msg_new:nn { ctex-invalid-encoding }
- {
- Package~ option~ "encoding=#1"~ is~ in~ conflict~ with~ ctex's~
- option~ "\tl_use:N \l__ctex_encoding_tl".\\\\
- Please~ check~ the~ package~ options.
- }
\@@_msg_new:nn { invalid-encoding }
{
- Encoding~ "#1"~ is~ invalid. \\
- Available~ encodings~ are~ "utf8",~ "gbk"~ and~ "big5".
+ Encoding~"#1"~is~invalid. \\
+ Available~encodings~are~"utf8",~"gbk"~and~"big5".
}
\@@_msg_new:nn { unknown-option }
- { Package~ option~ "\l_keys_key_tl"~ is~ unknown. }
+ { Package~option~'\l_keys_key_tl'~is~unknown. }
% \end{macrocode}
%
-% \changes{v1.0.0}{2018/04/01}{根据 \CTeX{} 宏集的选项自动确定编码。}
-%
-% \begin{macro}[TF]{\@@_if_ctex_valid_encoding:}
-% 检查 \CTeX{} 编码。
+% \begin{macro}{\@@_check_unicode_engine_encoding:}
+% Unicode 引擎下编码始终设为 UTF-8。
% \begin{macrocode}
-\prg_new_protected_conditional:Npnn \@@_if_ctex_valid_encoding: { F }
+\cs_new_protected:Npn \@@_check_unicode_engine_encoding:
{
- \tl_if_exist:NTF \l__ctex_encoding_tl
+ \@@_if_unicode_engine:T
{
- \tl_set:Nx \l_@@_tmpa_tl
- { \str_lower_case:f { \l__ctex_encoding_tl } }
- \str_if_eq:NNTF \g_@@_encoding_tl \l_@@_tmpa_tl
- { \prg_return_true: } { \prg_return_false: }
+ \str_if_empty:NF \g_@@_encoding_str
+ {
+ \@@_if_encoding:nF { utf8 }
+ { \@@_warning:n { unicode-engine } }
+ }
+ \str_gset:Nn \g_@@_encoding_str { utf8 }
}
- { \prg_return_true: }
+ }
+\@@_msg_new:nn { unicode-engine }
+ {
+ You~are~now~using~Unicode~engine~\c_sys_engine_str\c_space_tl~so~
+ encoding~"\g_@@_encoding_str"~is~invalid. \\
+ Changed~into~"utf8".
}
% \end{macrocode}
% \end{macro}
%
-% 如果调用了 \CTeX{} 宏集,则自动确定编码;否则默认设为 UTF-8。
+% \begin{macro}{\@@_check_ctex_encoding:}
+% 如果调用了 \CTeX{} 宏集,则自动确定编码。
% \begin{macrocode}
-\tl_if_exist:NTF \l__ctex_encoding_tl
+\cs_new_protected:Npn \@@_check_ctex_encoding:
{
- \tl_if_eq:VnTF \l__ctex_encoding_tl { UTF8 }
- { \tl_gset:Nn \g_@@_encoding_tl { utf8 } }
+ \tl_if_exist:NT \l__ctex_encoding_tl
{
- \tl_if_eq:VnT \l__ctex_encoding_tl { GBK }
- { \tl_gset:Nn \g_@@_encoding_tl { gbk } }
+ \str_set:Nx \l_@@_tmpa_str
+ { \str_lower_case:f { \l__ctex_encoding_tl } }
+ \str_if_empty:NF \g_@@_encoding_str
+ {
+ \@@_if_encoding:VF \l_@@_tmpa_str
+ { \@@_warning:n { ctex-encoding-conflict } }
+ }
+ \str_gset_eq:NN \g_@@_encoding_str \l_@@_tmpa_str
}
}
- { \tl_gset:Nn \g_@@_encoding_tl { utf8 } }
+\@@_msg_new:nn { ctex-encoding-conflict }
+ {
+ Package~option~"encoding=\g_@@_encoding_str"~is~in~conflict~with~
+ ctex's~option~"\l__ctex_encoding_tl". \\
+ Changed~into~"encoding=\l_@@_tmpa_str".
+ }
% \end{macrocode}
+% \end{macro}
%
% 将宏包选项传给 |zhlipsum/option|。
% \begin{macrocode}
\ProcessKeysOptions { zhlipsum / option }
% \end{macrocode}
%
+% 检查编码兼容性。
+% \begin{macrocode}
+\@@_check_unicode_engine_encoding:
+\@@_check_ctex_encoding:
+\str_if_empty:NT \g_@@_encoding_str
+ { \str_gset:Nn \g_@@_encoding_str { utf8 } }
+% \end{macrocode}
+%
% \subsection{函数选项}
%
% \begin{variable}{\l_@@_name_tl}
@@ -1063,8 +1054,7 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \end{macrocode}
% \end{macro}
%
-% \changes{v0.5}{2017/12/22}{新增选项 \opt{script},同时支持简体中文
-% 和繁体中文。}
+% \changes{v0.5}{2017/12/22}{新增选项 \opt{script},同时支持简体中文和繁体中文。}
% \changes{v1.0.0}{2018/03/24}{\opt{script} 成为过时选项。}
%
% \begin{macro}{script}
@@ -1112,57 +1102,55 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
%
% \subsection{输出假文}
%
-% \begin{macro}{\zhlipsum}
+% \begin{macro}{\zhlipsum,\@@:n}
% \changes{v0.5}{2018/01/05}{支持选项设置。}
-% \changes{v1.0.0}{2018/03/23}{更改参数形式,允许利用逗号分隔列表选择
-% 段落。}
+% \changes{v1.0.0}{2018/03/23}{更改参数形式,允许利用逗号分隔列表选择段落。}
% \changes{v1.1.0}{2018/04/08}{改回使用方括号指定段落数的形式。}
-% 输出假文,第一个可选参数表示段落数,默认为 |1-3|;第二个可选参数为选
-% 项列表。
+% \changes{v1.2.0}{2020/04/08}{修正 \env{quote}/\env{quotation} 等环境中段落缩进消失问题。}
+% \changes{v1.2.0}{2020/04/08}{与 \pkg{lipsum} 等宏包保持一致,不在开头插入分段命令。}
+% 输出假文,第一个可选参数表示段落数,默认为 |1-3|;第二个可选参数为选项列表。
% \begin{macrocode}
\NewDocumentCommand \zhlipsum { s o +o }
{
\group_begin:
\IfBooleanF {#1}
{
- \tl_set:Nn \l_@@_before_tl { \@@_par: }
- \tl_set:Nn \l_@@_after_tl { \@@_par: }
- \tl_set:Nn \l_@@_inter_tl { \@@_par: }
+ \tl_set:Nn \l_@@_before_tl { }
+ \tl_set:Nn \l_@@_after_tl { \par }
+ \tl_set:Nn \l_@@_inter_tl { \par }
}
\IfValueTF {#3}
{
\keys_set:nn { zhlipsum } {#3}
- \zhlipsum_use:Vn \l_@@_name_tl {#2}
+ \@@:n {#2}
}
{
\IfValueTF {#2}
{
% \end{macrocode}
-% 如果只带一个参数,那么根据其是否含有 |=| 来判断该参数是段落数还是
-% 选项列表。
+% 如果只带一个参数,那么根据其是否含有 |=| 来判断该参数是段落数还是选项列表。
% \begin{macrocode}
\@@_if_key_value_list:nTF {#2}
{
\keys_set:nn { zhlipsum } {#2}
- \zhlipsum_use:Vn \l_@@_name_tl { 1 - 3 }
+ \@@:n { 1 - 3 }
}
- { \zhlipsum_use:Vn \l_@@_name_tl {#2} }
+ { \@@:n {#2} }
}
- { \zhlipsum_use:Vn \l_@@_name_tl { 1 - 3 } }
+ { \@@:n { 1 - 3 } }
}
\group_end:
}
+\cs_new_protected:Npn \@@:n #1
+ { \exp_args:No \zhlipsum_use:nn { \l_@@_name_tl } {#1} }
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[TF]{\@@_if_key_value_list:n}
+% \begin{macro}{\@@_if_key_value_list:nTF}
% 判断是否为键值列表,即是否含有 |=|。
% \begin{macrocode}
-\prg_new_protected_conditional:Npnn \@@_if_key_value_list:n #1 { TF }
- {
- \tl_if_in:nnTF {#1} { = }
- { \prg_return_true: } { \prg_return_false: }
- }
+\cs_new_protected:Npn \@@_if_key_value_list:nTF #1
+ { \tl_if_in:nnTF {#1} {=} }
% \end{macrocode}
% \end{macro}
%
@@ -1173,7 +1161,8 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\zhlipsum_use:nn,\zhlipsum_use:Vn}
+% \begin{macro}{\zhlipsum_use:nn}
+% \changes{v1.2.0}{2019/08/11}{检查空的段落范围避免陷入死循环。}
% 输出多段假文。|#1| = 假文名称,|#2| = 段落编号列表。解析段落编号之
% 后,按次序逐项输出,并在前后插入相应内容。注意最后一段需要单独处理。
% \begin{macrocode}
@@ -1184,33 +1173,34 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
\zhlipsum_if_exist:nTF {#1}
{
\@@_parse_par:nn {#1} {#2}
- \seq_pop_right:NN \l_@@_par_num_seq \l_@@_tmpa_tl
- \tl_use:N \l_@@_before_tl
- \seq_map_inline:Nn \l_@@_par_num_seq
+ \seq_if_empty:NF \l_@@_par_num_seq
{
- \@@_use:nn {#1} {##1}
- \tl_use:N \l_@@_inter_tl
+ \seq_pop_right:NN \l_@@_par_num_seq \l_@@_tmpa_tl
+ \l_@@_before_tl
+ \seq_map_inline:Nn \l_@@_par_num_seq
+ {
+ \@@_use:nn {#1} {##1}
+ \l_@@_inter_tl
+ }
+ \@@_use:nn {#1} { \l_@@_tmpa_tl }
+ \l_@@_after_tl
}
- \@@_use:nn {#1} { \tl_use:N \l_@@_tmpa_tl }
- \tl_use:N \l_@@_after_tl
}
{ \@@_error:nn { invalid-name } {#1} }
}
{ \@@_error:n { CJK-invalid-encoding } }
}
-\cs_generate_variant:Nn \zhlipsum_use:nn { Vn }
\@@_msg_new:nn { invalid-name }
{
- Name~ "#1"~ is~ unknown. \\\\
+ Name~ "#1"~ is~ unknown. \\
Please~ use~ the~ pre-defined~ Chinese~ dummy~ texts~ or~
declare~ new~ one.
}
\@@_msg_new:nn { CJK-invalid-encoding }
{
- The~ current~ CJK~ environment~ uses~ "\tl_use:N \CJK@@@@@enc"~
- encoding,\\
+ The~ current~ CJK~ environment~ uses~ "\CJK@@@@@enc"~ encoding,~
but~ zhlipsum~ package~ has~ been~ loaded~ with~ the~ option~
- "encoding=\tl_use:N \g_@@_encoding_tl".\\\\
+ "encoding=\g_@@_encoding_str". \\
Please~ check~ the~ package~ options.
}
% \end{macrocode}
@@ -1223,25 +1213,13 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
{
\tl_if_exist:NTF \CJK@@@@@enc
{
- \tl_set:Nx \l_@@_tmpa_tl { \str_lower_case:f { \CJK@@@@@enc } }
-% TODO: str or tl?
- \str_if_eq:NNTF \g_@@_encoding_tl \l_@@_tmpa_tl
- { \prg_return_true: }
+ \exp_args:NV \str_case:nn \g_@@_encoding_str
{
- \@@_if_encoding:nTF { gbk }
- {
- \str_if_eq:VnTF \l_@@_tmpa_tl { gb }
- { \prg_return_true: } { \prg_return_false: }
- }
- {
- \@@_if_encoding:nTF { big5 }
- {
- \str_if_eq:VnTF \l_@@_tmpa_tl { bg5 }
- { \prg_return_true: } { \prg_return_false: }
- }
- { \prg_return_false: }
- }
+ { utf8 } { \str_if_eq:VnTF \CJK@@@@@enc { UTF8 } }
+ { gbk } { \str_if_in:NnTF \CJK@@@@@enc { GB } }
+ { big5 } { \str_if_eq:VnTF \CJK@@@@@enc { Bg5 } }
}
+ { \prg_return_true: } { \prg_return_false: }
}
{ \prg_return_true: }
}
@@ -1288,7 +1266,7 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
\clist_map_inline:nn {#2}
{
\@@_parse_par_aux:n {##1}
- \bool_if:NTF \l@@_invalid_range_bool
+ \bool_if:NTF \l_@@_invalid_range_bool
{ \@@_warning:nnn { invalid-range } {##1} {#2} }
{
\bool_if:NT \l_@@_modified_range_bool
@@ -1449,7 +1427,7 @@ Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>.
%
% 根据编码读入假文文本定义文件。
% \begin{macrocode}
-\file_input:x { zhlipsum- \g_@@_encoding_tl .def }
+\file_input:x { zhlipsum- \g_@@_encoding_str .def }
%</package>
% \end{macrocode}
%
diff --git a/Master/texmf-dist/source/latex/zhlipsum/zhlipsum.ins b/Master/texmf-dist/source/latex/zhlipsum/zhlipsum.ins
index ebee71c7d60..231a01d98e0 100644
--- a/Master/texmf-dist/source/latex/zhlipsum/zhlipsum.ins
+++ b/Master/texmf-dist/source/latex/zhlipsum/zhlipsum.ins
@@ -6,7 +6,7 @@
%%
%% zhlipsum.dtx (with options: `install')
%%
-%% Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>
+%% Copyright (C) 2017--2020 by Xiangdong Zeng <xdzeng96@gmail.com>
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
@@ -39,7 +39,7 @@
\preamble
- Copyright (C) 2017, 2018 by Xiangdong Zeng <xdzeng96@gmail.com>
+ Copyright (C) 2017--2020 by Xiangdong Zeng <xdzeng96@gmail.com>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
diff --git a/Master/texmf-dist/source/latex/zhnumber/zhnumber.dtx b/Master/texmf-dist/source/latex/zhnumber/zhnumber.dtx
index 05472f8fd14..d5ed4bdd22b 100644
--- a/Master/texmf-dist/source/latex/zhnumber/zhnumber.dtx
+++ b/Master/texmf-dist/source/latex/zhnumber/zhnumber.dtx
@@ -44,7 +44,7 @@ Issues and pull requests are welcome.
Copyright and Licence
---------------------
- Copyright (C) 2012, 2014-2019 by Qing Lee <sobenlee@gmail.com>
+ Copyright (C) 2012, 2014-2020 by Qing Lee <sobenlee@gmail.com>
----------------------------------------------------------------------
This work may be distributed and/or modified under the
@@ -57,7 +57,7 @@ Copyright and Licence
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'.
+ This work has the LPPL maintenance status "maintained".
The Current Maintainer of this work is Qing Lee.
@@ -83,7 +83,7 @@ Copyright and Licence
\preamble
- Copyright (C) 2012, 2014-2019 by Qing Lee <sobenlee@gmail.com>
+ Copyright (C) 2012, 2014-2020 by Qing Lee <sobenlee@gmail.com>
--------------------------------------------------------------------------
This work may be distributed and/or modified under the
@@ -96,7 +96,7 @@ Copyright and Licence
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'.
+ This work has the LPPL maintenance status "maintained".
The Current Maintainer of this work is Qing Lee.
@@ -120,18 +120,18 @@ Copyright and Licence
%</install>
%<*internal>
\usedir{source/latex/zhnumber}
- \file{zhnumber.ins} {\from{\jobname.dtx}{install}}
+ \file{zhnumber.ins} {\from{\jobname.dtx}{install}}
%</internal>
%<*install>
\usedir{tex/latex/zhnumber}
- \file{zhnumber.sty} {\from{\jobname.dtx}{package}}
+ \file{zhnumber.sty} {\from{\jobname.dtx}{package}}
\usedir{tex/latex/zhnumber/config}
- \file{zhnumber-utf8.cfg} {\from{\jobname.dtx}{config,utf8}}
- \file{zhnumber-big5.cfg} {\from{\jobname.dtx}{config,big5}}
- \file{zhnumber-gbk.cfg} {\from{\jobname.dtx}{config,gbk}}
+ \file{zhnumber-utf8.cfg} {\from{\jobname.dtx}{config,utf8}}
+ \ctxfile{Big5}{zhnumber-big5.cfg} {\from{\jobname.dtx}{config,big5}}
+ \ctxfile{GBK}{zhnumber-gbk.cfg} {\from{\jobname.dtx}{config,gbk}}
\nopreamble\nopostamble
\usedir{doc/latex/zhnumber}
- \file{README.md} {\from{\jobname.dtx}{readme}}
+ \file{README.md} {\from{\jobname.dtx}{readme}}
}
\endbatchfile
@@ -141,7 +141,7 @@ Copyright and Licence
%</internal>
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\RequirePackage{expl3}
-%<+package|config>\GetIdInfo$Id: zhnumber.dtx 311c61d 2019-04-07 23:29:51 +0800 Qing Lee <sobenlee@gmail.com> $
+%<+package|config>\GetIdInfo$Id: zhnumber.dtx c4664c6 2020-05-01 21:10:24 +0800 Qing Lee <sobenlee@gmail.com> $
%<package> {Typesetting numbers with Chinese glyphs}
%<config&utf8> {Chinese numerals with UTF8 encoding}
%<config&big5> {Chinese numerals with Big5 encoding}
@@ -150,7 +150,7 @@ Copyright and Licence
%<config&utf8>\ProvidesExplFile{\ExplFileName-utf8.cfg}
%<config&big5>\ProvidesExplFile{\ExplFileName-big5.cfg}
%<config&gbk>\ProvidesExplFile{\ExplFileName-gbk.cfg}
-%<package|config> {\ExplFileDate}{2.7}{\ExplFileDescription}
+%<package|config> {\ExplFileDate}{2.8}{\ExplFileDescription}
%<*driver>
\documentclass{ctxdoc}
\begin{document}
@@ -161,7 +161,7 @@ Copyright and Licence
%</driver>
% \fi
%
-% \CheckSum{1186}
+% \CheckSum{1189}
% \GetFileId{zhnumber.sty}
%
% \title{\bfseries\pkg{zhnumber} 宏包}
@@ -400,7 +400,7 @@ Copyright and Licence
% \begin{syntax}
% null = <\TFF>
% \end{syntax}
-% 缺省状态下,除了 \tn{zhdigits} 外,其它的格式转换命令,将 0 映射成零,如果需要将 0 映射
+% 缺省状态下,除了 \tn{zhdigits} 外,其他的格式转换命令,将 0 映射成零,如果需要将 0 映射
% 成〇,可以使用这个选项。
% \end{function}
%
@@ -437,7 +437,7 @@ Copyright and Licence
% 其中 |-| 设置负,|-0| 设置〇,|dot| 设置小数的点,|and| 和 |parts| 分别设置分数
% 的“又”和“分之”,|E|$n$ 设置 $10^n$,|F|$n$ 设置数字 $n$ 的大写,|T|$n$ 设置
% 数字 $n$ 的天干,|D|$n$ 设置数字 $n$ 的地支,而 |GZ|$n$ 设置数字 $n$ 的干支。
-% 其它的选项同字面意思,不再赘述。例如
+% 其他的选项同字面意思,不再赘述。例如
% \begin{verbatim}[frame=single]
% \zhnumsetup{2={两}}
% \end{verbatim}
@@ -664,7 +664,7 @@ Copyright and Licence
% \begin{macro}[int]{\@zhnum}
% 用于支持 |\pagenumbering{zhnum}|。
% \begin{macrocode}
-\cs_new_nopar:Npn \@zhnum { \zhnum_int:n }
+\cs_new:Npn \@zhnum { \zhnum_int:n }
% \end{macrocode}
% \end{macro}
%
@@ -906,7 +906,7 @@ Copyright and Licence
% \begin{macro}[int]{\@zhdig}
% 用于支持 |\pagenumbering{zhdig}|。
% \begin{macrocode}
-\cs_new_nopar:Npn \@zhdig #1 { \zhnum_digits_null:f { \int_eval:n {#1} } }
+\cs_new:Npn \@zhdig #1 { \zhnum_digits_null:f { \int_eval:n {#1} } }
% \end{macrocode}
% \end{macro}
%
@@ -933,9 +933,9 @@ Copyright and Licence
% \begin{macro}[int]{\zhnum_digits_zero:n,\zhnum_digits_null:n}
% 快捷方式。
% \begin{macrocode}
-\cs_new_nopar:Npn \zhnum_digits_zero:n
+\cs_new:Npn \zhnum_digits_zero:n
{ \zhnum_digits:Nn \BooleanTrue }
-\cs_new_nopar:Npn \zhnum_digits_null:n
+\cs_new:Npn \zhnum_digits_null:n
{ \zhnum_digits:Nn \BooleanFalse }
\cs_generate_variant:Nn \zhnum_digits_null:n { V , v , f }
% \end{macrocode}
@@ -1012,14 +1012,14 @@ Copyright and Licence
% \begin{macro}{\zhtoday}
% 输出当天日期。
% \begin{macrocode}
-\cs_new_nopar:Npn \zhtoday
+\cs_new:Npn \zhtoday
{ \@@_date_aux:Vnn \tex_year:D \tex_month:D \tex_day:D }
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_date_aux:nnn}
% \begin{macrocode}
-\cs_new_nopar:Npn \@@_date_aux:nnn
+\cs_new:Npn \@@_date_aux:nnn
{
\bool_if:NTF \l_@@_time_bool
{ \@@_date_aux:NNnnnn \zhnum_digits_null:n \zhnum_int:n { } }
@@ -1152,7 +1152,7 @@ Copyright and Licence
% \begin{macro}{\zhcurrtime}
% 输出当前时间。
% \begin{macrocode}
-\cs_new_nopar:Npn \zhcurrtime
+\cs_new:Npn \zhcurrtime
{
\@@_time_aux:nn
{ \int_div_truncate:nn \tex_time:D { 60 } }
@@ -1163,7 +1163,7 @@ Copyright and Licence
%
% \begin{macro}{\@@_time_aux:nn,\@@_time_aux:Nnnn}
% \begin{macrocode}
-\cs_new_nopar:Npn \@@_time_aux:nn
+\cs_new:Npn \@@_time_aux:nn
{
\bool_if:NTF \l_@@_time_bool
{ \@@_time_aux:Nnnn \zhnum_int:n { } }
@@ -1453,7 +1453,7 @@ Copyright and Licence
% }
% 将 \texttt{prop} 表转化到单独的 \texttt{tl} 变量。
% \begin{macrocode}
-\cs_new_protected_nopar:Npn \zhnum_parse_config:
+\cs_new_protected:Npn \zhnum_parse_config:
{
\prop_map_function:NN \l_@@_cfg_map_prop \zhnum_check_simp:nn
\prop_map_function:NN \l_@@_cfg_map_ganzhi_prop \zhnum_assgin_ganzhi:nn
@@ -1485,7 +1485,7 @@ Copyright and Licence
}
{ \tl_set:cn { l_@@_ #2 _tl } {#1} }
}
-\cs_new_protected_nopar:Npn \zhnum_assgin_const:
+\cs_new_protected:Npn \zhnum_assgin_const:
{
\prop_map_function:NN \l_@@_cfg_map_prop \zhnum_check_financial:nn
\zhnum_set_alias:
@@ -1506,7 +1506,7 @@ Copyright and Licence
{ c_@@_ #1 _tl } { \exp_not:c { l_@@_ #1 _tl } }
}
}
-\cs_new_protected_nopar:Npn \zhnum_set_zero:
+\cs_new_protected:Npn \zhnum_set_zero:
{
\tl_set:cx { l_@@_0_tl }
{
@@ -1514,7 +1514,7 @@ Copyright and Licence
{ \exp_not:o \l_@@_null_tl } { \exp_not:v { l_@@_0_tl } }
}
}
-\cs_new_protected_nopar:Npn \zhnum_set_week_day:
+\cs_new_protected:Npn \zhnum_set_week_day:
{
\tl_set:Nx \l_@@_mon_tl
{ \exp_not:N \c_@@_weekday_tl \exp_not:v { l_@@_1_tl } }
@@ -1565,7 +1565,7 @@ Copyright and Licence
% 一些易于使用的别名。
% \begin{macrocode}
\cs_new_eq:NN \zhnum_set_alias:NN \cs_new_eq:NN
-\cs_new_protected_nopar:Npx \zhnum_set_alias:
+\cs_new_protected:Npx \zhnum_set_alias:
{
\zhnum_set_alias:NN \exp_not:N \c_@@_zero_tl
\exp_not:c { c_@@_ 0 _tl }
@@ -1677,9 +1677,9 @@ Copyright and Licence
}
\cs_new_eq:NN \zhnum_reset_config: \zhnum_parse_config:
\else:
- \cs_new_protected_nopar:Npn \zhnum_set_catcode:
+ \cs_new_protected:Npn \zhnum_set_catcode:
{ \bool_if:NT \l_@@_active_char_bool { \zhnum_set_active: } }
- \cs_new_protected_nopar:Npn \zhnum_set_active:
+ \cs_new_protected:Npn \zhnum_set_active:
{
\str_case:onTF { \l_@@_encoding_str }
{
@@ -1706,7 +1706,7 @@ Copyright and Licence
\bool_if:NT \l_@@_active_char_bool { _active }
}
}
- \cs_new_protected_nopar:Npn \zhnum_reset_config:
+ \cs_new_protected:Npn \zhnum_reset_config:
{ \zhnum_load_cfg:o { \l_@@_encoding_str } }
\bool_new:N \l_@@_active_char_bool
\bool_set_true:N \l_@@_active_char_bool
@@ -1723,7 +1723,7 @@ Copyright and Licence
{ UTF8 , GBK , Big5 }
{
\str_set:Nx \l_@@_encoding_str
- { \str_fold_case:V \l_keys_choice_tl }
+ { \exp_args:No \str_lowercase:n { \l_keys_choice_tl } }
\zhnum_load_cfg:o { \l_@@_encoding_str }
} ,
encoding .default:n = { GBK } ,
@@ -1897,12 +1897,14 @@ Copyright and Licence
\zhnum_set_financial_map:nn { null } { 零 }
\zhnum_set_financial_map:nn { 0 } { 零 }
\zhnum_set_financial_map:nn { 1 } { 壹 }
-\zhnum_set_financial_map:nn { 2 } { 貳 }
%<*!big5>
+\zhnum_set_financial_map:nnn { 2 } { simp } { 贰 }
+\zhnum_set_financial_map:nnn { 2 } { trad } { 貳 }
\zhnum_set_financial_map:nnn { 3 } { simp } { 叁 }
\zhnum_set_financial_map:nnn { 3 } { trad } { 叄 }
%</!big5>
%<*big5>
+\zhnum_set_financial_map:nn { 2 } { 貳 }
\zhnum_set_financial_map:nn { 3 } { 參 }
%</big5>
\zhnum_set_financial_map:nn { 4 } { 肆 }
diff --git a/Master/texmf-dist/source/latex/zhnumber/zhnumber.ins b/Master/texmf-dist/source/latex/zhnumber/zhnumber.ins
index d403166319e..401e3a8c338 100644
--- a/Master/texmf-dist/source/latex/zhnumber/zhnumber.ins
+++ b/Master/texmf-dist/source/latex/zhnumber/zhnumber.ins
@@ -6,7 +6,7 @@
%%
%% zhnumber.dtx (with options: `install')
%%
-%% Copyright (C) 2012, 2014-2019 by Qing Lee <sobenlee@gmail.com>
+%% Copyright (C) 2012, 2014-2020 by Qing Lee <sobenlee@gmail.com>
%% --------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
@@ -19,7 +19,7 @@
%% 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'.
+%% This work has the LPPL maintenance status "maintained".
%%
%% The Current Maintainer of this work is Qing Lee.
%%
@@ -30,7 +30,7 @@
\preamble
- Copyright (C) 2012, 2014-2019 by Qing Lee <sobenlee@gmail.com>
+ Copyright (C) 2012, 2014-2020 by Qing Lee <sobenlee@gmail.com>
--------------------------------------------------------------------------
This work may be distributed and/or modified under the
@@ -43,7 +43,7 @@
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'.
+ This work has the LPPL maintenance status "maintained".
The Current Maintainer of this work is Qing Lee.
@@ -65,14 +65,14 @@
\generate
{
\usedir{tex/latex/zhnumber}
- \file{zhnumber.sty} {\from{\jobname.dtx}{package}}
+ \file{zhnumber.sty} {\from{\jobname.dtx}{package}}
\usedir{tex/latex/zhnumber/config}
- \file{zhnumber-utf8.cfg} {\from{\jobname.dtx}{config,utf8}}
- \file{zhnumber-big5.cfg} {\from{\jobname.dtx}{config,big5}}
- \file{zhnumber-gbk.cfg} {\from{\jobname.dtx}{config,gbk}}
+ \file{zhnumber-utf8.cfg} {\from{\jobname.dtx}{config,utf8}}
+ \ctxfile{Big5}{zhnumber-big5.cfg} {\from{\jobname.dtx}{config,big5}}
+ \ctxfile{GBK}{zhnumber-gbk.cfg} {\from{\jobname.dtx}{config,gbk}}
\nopreamble\nopostamble
\usedir{doc/latex/zhnumber}
- \file{README.md} {\from{\jobname.dtx}{readme}}
+ \file{README.md} {\from{\jobname.dtx}{readme}}
}
\endbatchfile
diff --git a/Master/texmf-dist/source/latex/zref/zref.dtx b/Master/texmf-dist/source/latex/zref/zref.dtx
index d7a5b0863e9..a74626aa7dd 100644
--- a/Master/texmf-dist/source/latex/zref/zref.dtx
+++ b/Master/texmf-dist/source/latex/zref/zref.dtx
@@ -1,12 +1,12 @@
% \iffalse meta-comment
%
% File: zref.dtx
-% Version: 2020-03-03 v2.29
+% Version: 2020-07-03 v2.32
% Info: A new reference scheme for LaTeX
%
% Copyright (C)
% 2006-2012 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
+% 2016-2020 Oberdiek Package Support Group
% https://github.com/ho-tex/zref/issues
%
% This work may be distributed and/or modified under the
@@ -112,7 +112,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: zref 2020-03-03 v2.29 A new reference scheme for LaTeX (HO)}
+\Msg{* Package: zref 2020-07-03 v2.32 A new reference scheme for LaTeX (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -124,7 +124,7 @@
This is a generated file.
Project: zref
-Version: 2020-03-03 v2.29
+Version: 2020-07-03 v2.32
Copyright (C)
2006-2012 Heiko Oberdiek
@@ -230,7 +230,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{zref.drv}%
- [2020-03-03 v2.29 A new reference scheme for LaTeX (HO)]%
+ [2020-07-03 v2.32 A new reference scheme for LaTeX (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}[2011/11/22]
\setlength{\emergencystretch}{1em}
@@ -245,7 +245,7 @@ and the derived files
% \GetFileInfo{zref.drv}
%
% \title{The \xpackage{zref} package}
-% \date{2020-03-03 v2.29}
+% \date{2020-07-03 v2.32}
% \author{Heiko Oberdiek\thanks
% {Please report any issues at \url{https://github.com/ho-tex/zref/issues}}}
%
@@ -1663,7 +1663,7 @@ the height difference of the two baselines is
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref}
- [2020-03-03 v2.29 A new reference scheme for LaTeX (HO)]%
+ [2020-07-03 v2.32 A new reference scheme for LaTeX (HO)]%
% \end{macrocode}
%
% \subsubsection{Load basic module}
@@ -1750,12 +1750,13 @@ the height difference of the two baselines is
%<*base>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-base}%
- [2020-03-03 v2.29 Module base for zref (HO)]%
+ [2020-07-03 v2.32 Module base for zref (HO)]%
% \end{macrocode}
%
% \subsubsection{Utilities}
%
% \begin{macrocode}
+\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}
\RequirePackage{ltxcmds}[2010/12/02]
\RequirePackage{infwarerr}[2010/04/08]
\RequirePackage{kvsetkeys}[2010/03/01]
@@ -3057,7 +3058,7 @@ the height difference of the two baselines is
%<*user>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-user}%
- [2020-03-03 v2.29 Module user for zref (HO)]%
+ [2020-07-03 v2.32 Module user for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -3148,7 +3149,7 @@ the height difference of the two baselines is
%<*abspage>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-abspage}%
- [2020-03-03 v2.29 Module abspage for zref (HO)]%
+ [2020-07-03 v2.32 Module abspage for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -3196,7 +3197,7 @@ the height difference of the two baselines is
%<*counter>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-counter}%
- [2020-03-03 v2.29 Module counter for zref (HO)]%
+ [2020-07-03 v2.32 Module counter for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -3207,23 +3208,28 @@ the height difference of the two baselines is
% For features such as \xpackage{hyperref}'s \cs{autoref}
% we need the name of the counter. The property
% \verb|counter| is defined and added to the main property
-% list.
-% \begin{macrocode}
-\zref@newprop{counter}{}
-\zref@addprop\ZREF@mainlist{counter}
-% \end{macrocode}
-%
-% \cs{refstepcounter} is the central macro where we know
-% which counter is responsible for the reference.
-% \begin{macrocode}
-\AtBeginDocument{%
- \ZREF@patch{refstepcounter}{%
- \def\refstepcounter#1{%
- \zref@setcurrent{counter}{#1}%
- \ZREF@org@refstepcounter{#1}%
+% list. Starting with \LaTeX\ 2020-10-01 the proper can use
+% \@currentcounter. In older formats
+% \cs{refstepcounter} has to be patched but this can fail in some
+% cases, see issue \#5.
+% \begin{macrocode}
+\@ifl@t@r\fmtversion{2020-10-01}
+ {
+ \zref@newprop{counter}{\@currentcounter}
+ \zref@addprop\ZREF@mainlist{counter}
+ }
+ {
+ \zref@newprop{counter}{}
+ \zref@addprop\ZREF@mainlist{counter}
+ \AtBeginDocument{%
+ \ZREF@patch{refstepcounter}{%
+ \def\refstepcounter#1{%
+ \zref@setcurrent{counter}{#1}%
+ \ZREF@org@refstepcounter{#1}%
+ }%
}%
- }%
-}
+ }
+ }
% \end{macrocode}
% \begin{macrocode}
%</counter>
@@ -3236,7 +3242,7 @@ the height difference of the two baselines is
%<*lastpage>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-lastpage}%
- [2020-03-03 v2.29 Module lastpage for zref (HO)]%
+ [2020-07-03 v2.32 Module lastpage for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\RequirePackage{zref-abspage}[2019/11/29]
\RequirePackage{atveryend}[2009/12/07]
@@ -3308,7 +3314,7 @@ the height difference of the two baselines is
%<*thepage>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-thepage}%
- [2020-03-03 v2.29 Module thepage for zref (HO)]%
+ [2020-07-03 v2.32 Module thepage for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -3383,7 +3389,7 @@ the height difference of the two baselines is
%<*nextpage>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-nextpage}%
- [2020-03-03 v2.29 Module nextpage for zref (HO)]%
+ [2020-07-03 v2.32 Module nextpage for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -3487,7 +3493,7 @@ the height difference of the two baselines is
%<*totpages>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-totpages}%
- [2020-03-03 v2.29 Module totpages for zref (HO)]%
+ [2020-07-03 v2.32 Module totpages for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -3529,7 +3535,7 @@ the height difference of the two baselines is
%<*pagelayout>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-pagelayout}%
- [2020-03-03 v2.29 Module pagelayout for zref (HO)]%
+ [2020-07-03 v2.32 Module pagelayout for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -3614,13 +3620,17 @@ the height difference of the two baselines is
% \end{macrocode}
%
% \begin{macrocode}
-\zref@newprop*{outputboxwd}[0pt]{\AtBeginShipoutBoxWidth}
-% \end{macrocode}
-% \begin{macrocode}
-\zref@newprop*{outputboxht}[0pt]{\AtBeginShipoutBoxHeight}
-% \end{macrocode}
-% \begin{macrocode}
-\zref@newprop*{outputboxdp}[0pt]{\AtBeginShipoutBoxDepth}
+\IfFormatAtLeastTF{2020/10/01}
+ {
+ \zref@newprop*{outputboxwd}[0pt]{\ShipoutBoxWidth}
+ \zref@newprop*{outputboxht}[0pt]{\ShipoutBoxHeight}
+ \zref@newprop*{outputboxdp}[0pt]{\ShipoutBoxDepth}
+ }
+ {
+ \zref@newprop*{outputboxwd}[0pt]{\AtBeginShipoutBoxWidth}
+ \zref@newprop*{outputboxht}[0pt]{\AtBeginShipoutBoxHeight}
+ \zref@newprop*{outputboxdp}[0pt]{\AtBeginShipoutBoxDepth}
+ }
% \end{macrocode}
% \begin{macrocode}
\zref@addprops{thepage}{outputboxwd,outputboxht,outputboxdp}
@@ -3757,7 +3767,7 @@ the height difference of the two baselines is
%<*pageattr>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-pageattr}%
- [2020-03-03 v2.29 Module pageattr for zref (HO)]%
+ [2020-07-03 v2.32 Module pageattr for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -3989,7 +3999,7 @@ the height difference of the two baselines is
%<*marks>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-marks}%
- [2020-03-03 v2.29 Module marks for zref (HO)]%
+ [2020-07-03 v2.32 Module marks for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -4095,7 +4105,7 @@ the height difference of the two baselines is
%<*runs>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-runs}%
- [2020-03-03 v2.29 Module runs for zref (HO)]%
+ [2020-07-03 v2.32 Module runs for zref (HO)]%
% \end{macrocode}
%
% \begin{macro}{\zruns}
@@ -4127,7 +4137,7 @@ the height difference of the two baselines is
%<*perpage>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-perpage}%
- [2020-03-03 v2.29 Module perpage for zref (HO)]%
+ [2020-07-03 v2.32 Module perpage for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -4309,7 +4319,7 @@ the height difference of the two baselines is
%<*titleref>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-titleref}%
- [2020-03-03 v2.29 Module titleref for zref (HO)]%
+ [2020-07-03 v2.32 Module titleref for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -4722,7 +4732,7 @@ the height difference of the two baselines is
%<*xr>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-xr}%
- [2020-03-03 v2.29 Module xr for zref (HO)]%
+ [2020-07-03 v2.32 Module xr for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -5258,7 +5268,7 @@ the height difference of the two baselines is
%<*hyperref>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-hyperref}%
- [2020-03-03 v2.29 Module hyperref for zref (HO)]%
+ [2020-07-03 v2.32 Module hyperref for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -5288,7 +5298,7 @@ the height difference of the two baselines is
%<*savepos>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-savepos}%
- [2020-03-03 v2.29 Module savepos for zref (HO)]%
+ [2020-07-03 v2.32 Module savepos for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -5461,7 +5471,7 @@ the height difference of the two baselines is
%<*abspos>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-abspos}%
- [2020-03-03 v2.29 Module abspos for zref (HO)]%
+ [2020-07-03 v2.32 Module abspos for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -5479,6 +5489,7 @@ the height difference of the two baselines is
% \begin{macrocode}
\RequirePackage{zref-pagelayout}[2019/11/29]
\zref@addprop{savepos}{abspage}
+\zref@addprop{savepos}{pagevalue}
% \end{macrocode}
%
% \begin{macro}{\zref@absposx}
@@ -6114,7 +6125,7 @@ the height difference of the two baselines is
%<*dotfill>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-dotfill}%
- [2020-03-03 v2.29 Module dotfill for zref (HO)]%
+ [2020-07-03 v2.32 Module dotfill for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -6214,7 +6225,7 @@ the height difference of the two baselines is
%<*env>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{zref-env}%
- [2020-03-03 v2.29 Module env for zref (HO)]%
+ [2020-07-03 v2.32 Module env for zref (HO)]%
\RequirePackage{zref-base}[2019/11/29]
\ifx\ZREF@base@ok Y%
\else
@@ -6735,6 +6746,18 @@ the height difference of the two baselines is
% \item use luatex command names directly in zref-savepos rather than defining pdftex compatibility names.
% \item allow zref-abspos to use \verb|\pdf[vh]origin| in dvi mode.
% \end{Version}
+% \begin{Version}{2020-03-04 v2.30}
+% \item
+% add pagevalue property to savepos in the abspos module (issue 1)
+% \end{Version}
+% \begin{Version}{2020-05-28 v2.31}
+% \item Adapted module zref-counter to use \cs{@currentcounter} in the next
+% \LaTeX version (issue 5)
+% \end{Version}
+% \begin{Version}{2020-07-03 v2.32}
+% \item Changed in zref-pagelayout the names of the shipout box dimensions
+% to adapt to the new hook management.
+% \end{Version}
% \end{History}
%
% \PrintIndex